From 4149c4d6a49d5d53f75b474b328a78a80f774729 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Tue, 21 Jan 2025 12:44:43 -0600 Subject: [PATCH 0001/1650] My first changes --- PWGUD/Tasks/CMakeLists.txt | 5 + PWGUD/Tasks/upcRhoFAnalysis.cxx | 294 ++++++++++++++++++++++++++++++++ 2 files changed, 299 insertions(+) create mode 100644 PWGUD/Tasks/upcRhoFAnalysis.cxx diff --git a/PWGUD/Tasks/CMakeLists.txt b/PWGUD/Tasks/CMakeLists.txt index a0f1eb17747..466728fef3e 100644 --- a/PWGUD/Tasks/CMakeLists.txt +++ b/PWGUD/Tasks/CMakeLists.txt @@ -207,6 +207,11 @@ o2physics_add_dpl_workflow(upc-rho-analysis SOURCES upcRhoAnalysis.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGPIDSelector COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(upc-rho-f-analysis + SOURCES upcRhoFAnalysis.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGPIDSelector + COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(event-by-event SOURCES eventByevent.cxx diff --git a/PWGUD/Tasks/upcRhoFAnalysis.cxx b/PWGUD/Tasks/upcRhoFAnalysis.cxx new file mode 100644 index 00000000000..10ccee1de87 --- /dev/null +++ b/PWGUD/Tasks/upcRhoFAnalysis.cxx @@ -0,0 +1,294 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// +/// \brief task for analysis of rho in UPCs using UD tables (from SG producer) +/// includes event tagging based on ZN information, track selection, reconstruction, +/// and also some basic stuff for decay phi anisotropy studies +/// \author Cesar, cesar.ramirez@cern.ch + +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/runDataProcessing.h" + +#include "Math/Vector4D.h" // similiar to TLorentzVector (which is now legacy apparently) +#include "random" + +#include "Common/DataModel/PIDResponse.h" + +#include "PWGUD/DataModel/UDTables.h" +#include "PWGUD/Core/UPCTauCentralBarrelHelperRL.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +using FullUDSgCollision = soa::Join::iterator; +using FullUDTracks = soa::Join; + + + +namespace o2::aod +{ +namespace fourpi +{ + + + +//for event +DECLARE_SOA_COLUMN(RunNumber, runNumber, int32_t); + +//for Rhos +DECLARE_SOA_COLUMN(M, m, double); +DECLARE_SOA_COLUMN(Pt, pt, double); +DECLARE_SOA_COLUMN(Eta, eta, double); +DECLARE_SOA_COLUMN(Phi, phi, double); + +//for vertex +DECLARE_SOA_COLUMN(PosX, posX, double); +DECLARE_SOA_COLUMN(PosY, posY, double); +DECLARE_SOA_COLUMN(PosZ, posZ, double); + +//for other +//DECLARE_SOA_COLUMN(TotalCharge, totalCharge, int); + +//for pion tracks +//DECLARE_SOA_COLUMN(TrackSign, trackSign, std::vector); +//DECLARE_SOA_COLUMN(TrackM, trackM, std::vector); +//DECLARE_SOA_COLUMN(TrackPt, trackPt, std::vector); +//DECLARE_SOA_COLUMN(TrackEta, trackEta, std::vector); +//DECLARE_SOA_COLUMN(TrackPhi, trackPhi, std::vector); + + + +} // namespace fourpi +DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", fourpi::RunNumber, fourpi::M, fourpi::Pt, fourpi::Eta, fourpi::Phi) + fourpi::PosX, fourpi::PosY, fourpi::PosZ); //, fourpi::TotalCharge); //fourpi::TrackSign, + //fourpi::TrackM, fourpi::TrackPt, fourpi::TrackEta, fourpi::TrackPhi); +} // namespace o2::aod + +struct upcRhoFAnalysis { + ProducessystemTree; + + double PcEtaCut = 0.9; // physics coordination recommendation + + Configurable specifyGapSide{"specifyGapSide", true, "specify gap side for SG/DG produced data"}; + Configurable gapSide{"gapSide", 2, "gap side for SG produced data"}; + Configurable requireTof{"requireTof", false, "require TOF signal"}; + + Configurable collisionsPosZMaxCut{"collisionsPosZMaxCut", 10.0, "max Z position cut on collisions"}; + Configurable ZNcommonEnergyCut{"ZNcommonEnergyCut", 0.0, "ZN common energy cut"}; + Configurable ZNtimeCut{"ZNtimeCut", 2.0, "ZN time cut"}; + + Configurable tracksTpcNSigmaPiCut{"tracksTpcNSigmaPiCut", 3.0, "TPC nSigma pion cut"}; + Configurable tracksDcaMaxCut{"tracksDcaMaxCut", 1.0, "max DCA cut on tracks"}; + + Configurable systemMassMinCut{"systemMassMinCut", 0.5, "min M cut for reco system"}; + Configurable systemMassMaxCut{"systemMassMaxCut", 1.2, "max M cut for reco system"}; + Configurable systemPtCut{"systemPtMaxCut", 0.1, "max pT cut for reco system"}; + Configurable systemYCut{"systemYCut", 0.9, "rapiditiy cut for reco system"}; + + ConfigurableAxis mAxis{"mAxis", {1000, 0.0, 10.0}, "m (GeV/#it{c}^{2})"}; + ConfigurableAxis mCutAxis{"mCutAxis", {70, 0.5, 1.2}, "m (GeV/#it{c}^{2})"}; + ConfigurableAxis ptAxis{"ptAxis", {1000, 0.0, 10.0}, "p_{T} (GeV/#it{c})"}; + ConfigurableAxis ptCutAxis{"ptCutAxis", {300, 0.0, 0.3}, "p_{T} (GeV/#it{c})"}; + ConfigurableAxis pt2Axis{"pt2Axis", {300, 0.0, 0.09}, "p_{T}^{2} (GeV^{2}/#it{c}^{2})"}; + ConfigurableAxis etaAxis{"etaAxis", {180, -0.9, 0.9}, "#eta"}; + ConfigurableAxis yAxis{"yAxis", {180, -0.9, 0.9}, "y"}; + ConfigurableAxis phiAxis{"phiAxis", {180, 0.0, o2::constants::math::TwoPI}, "#phi"}; + ConfigurableAxis phiAsymmAxis{"phiAsymmAxis", {182, -o2::constants::math::PI, o2::constants::math::PI}, "#phi"}; + ConfigurableAxis momentumFromPhiAxis{"momentumFromPhiAxis", {400, -0.1, 0.1}, "p (GeV/#it{c})"}; + ConfigurableAxis ptQuantileAxis{"ptQuantileAxis", {0, 0.0181689, 0.0263408, 0.0330488, 0.0390369, 0.045058, 0.0512604, 0.0582598, 0.066986, 0.0788085, 0.1}, "p_{T} (GeV/#it{c})"}; + + HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject}; + + void init(o2::framework::InitContext&) + { + // selection counter + std::vector selectionCounterLabels = {"all tracks", "PV contributor", "ITS + TPC hit", "TOF requirement", "DCA cut", "#eta cut", "2D TPC n#sigma_{#pi} cut"}; + + // 4PI SYSTEM + registry.add("4pi/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); + registry.add("4pi/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); + //registry.add("4pi/hEta", ";Eta (1);counts", kTH1D, {etaAxis}); + //registry.add("4pi/hPhi", ";Phi ();counts", kTH1D, {phiAxis}); + } + + template + bool collisionPassesCuts(const C& collision) // collision cuts + { + if (std::abs(collision.posZ()) > collisionsPosZMaxCut) + return false; + if (specifyGapSide && collision.gapSide() != gapSide) + return false; + return true; + } + + template + bool trackPassesCuts(const T& track) // track cuts (PID done separately) + { + if (!track.isPVContributor()) + return false; + //registry.fill(HIST("QC/tracks/hSelectionCounter"), 1); + if (!track.hasITS() || !track.hasTPC()) + return false; + //registry.fill(HIST("QC/tracks/hSelectionCounter"), 2); + if (requireTof && !track.hasTOF()) + return false; + //registry.fill(HIST("QC/tracks/hSelectionCounter"), 3); + if (std::abs(track.dcaZ()) > tracksDcaMaxCut || std::abs(track.dcaXY()) > (0.0182 + 0.0350 / std::pow(track.pt(), 1.01))) // Run 2 dynamic DCA cut + return false; + //registry.fill(HIST("QC/tracks/hSelectionCounter"), 4); + if (std::abs(eta(track.px(), track.py(), track.pz())) > PcEtaCut) + return false; + //registry.fill(HIST("QC/tracks/hSelectionCounter"), 5); + return true; + } + + template + bool tracksPassPiPID(const T& cutTracks) // n-dimensional PID cut + { + double radius = 0.0; + for (const auto& track : cutTracks) + radius += std::pow(track.tpcNSigmaPi(), 2); + return radius < std::pow(tracksTpcNSigmaPiCut, 2); + } + + template + double tracksTotalCharge(const T& cutTracks) // total charge of selected tracks + { + double charge = 0.0; + for (const auto& track : cutTracks) + charge += track.sign(); + return charge; + } + + bool systemPassCuts(const ROOT::Math::PxPyPzMVector& system) // system cuts + { + if (system.M() < systemMassMinCut || system.M() > systemMassMaxCut) + return false; + if (system.Pt() > systemPtCut) + return false; + if (std::abs(system.Rapidity()) > systemYCut) + return false; + return true; + } + + ROOT::Math::PxPyPzMVector reconstructSystem(const std::vector& cutTracks4Vecs) // reconstruct system from 4-vectors + { + ROOT::Math::PxPyPzMVector system; + for (const auto& track4Vec : cutTracks4Vecs) + system += track4Vec; + return system; + } + + double deltaPhi(const ROOT::Math::PxPyPzMVector& p1, const ROOT::Math::PxPyPzMVector& p2) + { + double dPhi = p1.Phi() - p2.Phi(); + if (dPhi > o2::constants::math::PI) + dPhi -= o2::constants::math::TwoPI; + else if (dPhi < -o2::constants::math::PI) + dPhi += o2::constants::math::TwoPI; + return dPhi; // calculate delta phi in (-pi, pi) + } + + double getPhiRandom(const std::vector& cutTracks4Vecs) // decay phi anisotropy + { // two possible definitions of phi: randomize the tracks + std::vector indices = {0, 1}; + unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); // get time-based seed + std::shuffle(indices.begin(), indices.end(), std::default_random_engine(seed)); // shuffle indices + // calculate phi + ROOT::Math::PxPyPzMVector pOne = cutTracks4Vecs[indices[0]]; + ROOT::Math::PxPyPzMVector pTwo = cutTracks4Vecs[indices[1]]; + ROOT::Math::PxPyPzMVector pPlus = pOne + pTwo; + ROOT::Math::PxPyPzMVector pMinus = pOne - pTwo; + return deltaPhi(pPlus, pMinus); + } + + template + double getPhiCharge(const T& cutTracks, const std::vector& cutTracks4Vecs) + { // two possible definitions of phi: charge-based assignment + ROOT::Math::PxPyPzMVector pOne, pTwo; + if (cutTracks[0].sign() > 0) { + pOne = cutTracks4Vecs[0]; + pTwo = cutTracks4Vecs[1]; + } else { + pOne = cutTracks4Vecs[1]; + pTwo = cutTracks4Vecs[0]; + } + ROOT::Math::PxPyPzMVector pPlus = pOne + pTwo; + ROOT::Math::PxPyPzMVector pMinus = pOne - pTwo; + return deltaPhi(pPlus, pMinus); + } + + void processReco(FullUDSgCollision const& collision, FullUDTracks const& tracks) + { + + + if (!collisionPassesCuts(collision)) + return; + + // event tagging + bool XnXn = false, OnOn = false, XnOn = false, OnXn = false; // note: On == 0n... + if (collision.energyCommonZNA() < ZNcommonEnergyCut && collision.energyCommonZNC() < ZNcommonEnergyCut) + OnOn = true; + if (collision.energyCommonZNA() > ZNcommonEnergyCut && std::abs(collision.timeZNA()) < ZNtimeCut && + collision.energyCommonZNC() > ZNcommonEnergyCut && std::abs(collision.timeZNC()) < ZNtimeCut) + XnXn = true; + if (collision.energyCommonZNA() > ZNcommonEnergyCut && std::abs(collision.timeZNA()) < ZNtimeCut && collision.energyCommonZNC() < ZNcommonEnergyCut) + XnOn = true; + if (collision.energyCommonZNA() < ZNcommonEnergyCut && collision.energyCommonZNC() > ZNcommonEnergyCut && std::abs(collision.timeZNC()) < ZNtimeCut) + OnXn = true; + // vectors for storing selected tracks and their 4-vectors + std::vector cutTracks; + std::vector cutTracks4Vecs; + + int trackCounter = 0; + for (const auto& track : tracks) { + + + if (!trackPassesCuts(track)) + continue; + trackCounter++; + cutTracks.push_back(track); + cutTracks4Vecs.push_back(ROOT::Math::PxPyPzMVector(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged)); // apriori assume pion mass + + } + + + if (!tracksPassPiPID(cutTracks)) + return; + // reonstruct system and calculate total charge, save commonly used values into variables + ROOT::Math::PxPyPzMVector system = reconstructSystem(cutTracks4Vecs); + int totalCharge = tracksTotalCharge(cutTracks); + int nTracks = cutTracks.size(); + double mass = system.M(); + double pT = system.Pt(); + double pTsquare = pT * pT; + double rapidity = system.Rapidity(); + double systemPhi = system.Phi() + o2::constants::math::PI; + + if (nTracks == 4 && tracksTotalCharge(cutTracks) == 0) { // 4pi system + systemTree(collision.runNumber(), mass, pT, rapidity, systemPhi, collision.posX(), collision.posY(), collision.posZ()); + registry.fill(HIST("4pi/hM"), mass); + registry.fill(HIST("4pi/hPt"), pT); + //registry.fill(HIST("4pi/hEta"), rapiditiy); + //registry.fill(HIST("4pi/hPhi"), system); + } + //std::cout<<"Hola Mundo"<(cfgc)}; +} \ No newline at end of file From fb85ab192ca5f7c3e7d578f69c9f9dbaddce12e8 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Tue, 4 Feb 2025 00:32:46 -0600 Subject: [PATCH 0002/1650] My first changes --- PWGUD/Tasks/upcRhoFAnalysis.cxx | 49 +++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/PWGUD/Tasks/upcRhoFAnalysis.cxx b/PWGUD/Tasks/upcRhoFAnalysis.cxx index 10ccee1de87..9137dea5afe 100644 --- a/PWGUD/Tasks/upcRhoFAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoFAnalysis.cxx @@ -9,10 +9,9 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. /// -/// \brief task for analysis of rho in UPCs using UD tables (from SG producer) -/// includes event tagging based on ZN information, track selection, reconstruction, -/// and also some basic stuff for decay phi anisotropy studies -/// \author Cesar, cesar.ramirez@cern.ch +/// \brief Task for analysis of rho' in UPCs using UD tables (from SG producer). + +/// \author Cesar Ramirez, cesar.ramirez@cern.ch #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" @@ -57,7 +56,19 @@ DECLARE_SOA_COLUMN(PosY, posY, double); DECLARE_SOA_COLUMN(PosZ, posZ, double); //for other -//DECLARE_SOA_COLUMN(TotalCharge, totalCharge, int); +DECLARE_SOA_COLUMN(TotalCharge, totalCharge, int); + +//info Detec +DECLARE_SOA_COLUMN(TotalFT0AmplitudeA, totalFT0AmplitudeA, float); +DECLARE_SOA_COLUMN(TotalFT0AmplitudeC, totalFT0AmplitudeC, float); +DECLARE_SOA_COLUMN(TotalFV0AmplitudeA, totalFV0AmplitudeA, float); +DECLARE_SOA_COLUMN(TotalFDDAmplitudeA, totalFDDAmplitudeA, float); +DECLARE_SOA_COLUMN(TotalFDDAmplitudeC, totalFDDAmplitudeC, float); +DECLARE_SOA_COLUMN(TimeFT0A, timeFT0A, float); +DECLARE_SOA_COLUMN(TimeFT0C, timeFT0C, float); +DECLARE_SOA_COLUMN(TimeFV0A, timeFV0A, float); +DECLARE_SOA_COLUMN(TimeFDDA, timeFDDA, float); +DECLARE_SOA_COLUMN(TimeFDDC, timeFDDC, float); //for pion tracks //DECLARE_SOA_COLUMN(TrackSign, trackSign, std::vector); @@ -69,9 +80,11 @@ DECLARE_SOA_COLUMN(PosZ, posZ, double); } // namespace fourpi -DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", fourpi::RunNumber, fourpi::M, fourpi::Pt, fourpi::Eta, fourpi::Phi) - fourpi::PosX, fourpi::PosY, fourpi::PosZ); //, fourpi::TotalCharge); //fourpi::TrackSign, - //fourpi::TrackM, fourpi::TrackPt, fourpi::TrackEta, fourpi::TrackPhi); +DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", fourpi::RunNumber, fourpi::M, fourpi::Pt, fourpi::Eta, fourpi::Phi, + fourpi::PosX, fourpi::PosY, fourpi::PosZ, fourpi::TotalCharge, fourpi::TotalFT0AmplitudeA, fourpi::TotalFT0AmplitudeC, fourpi::TotalFV0AmplitudeA, + fourpi::TotalFDDAmplitudeA, fourpi::TotalFDDAmplitudeC, + fourpi::TimeFT0A, fourpi::TimeFT0C, fourpi::TimeFV0A, fourpi::TimeFDDA, fourpi::TimeFDDC); + //fourpi::TrackSign, fourpi::TrackM, fourpi::TrackPt, fourpi::TrackEta, fourpi::TrackPhi); } // namespace o2::aod struct upcRhoFAnalysis { @@ -115,8 +128,8 @@ struct upcRhoFAnalysis { std::vector selectionCounterLabels = {"all tracks", "PV contributor", "ITS + TPC hit", "TOF requirement", "DCA cut", "#eta cut", "2D TPC n#sigma_{#pi} cut"}; // 4PI SYSTEM - registry.add("4pi/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); - registry.add("4pi/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); + //registry.add("4pi/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); + //registry.add("4pi/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); //registry.add("4pi/hEta", ";Eta (1);counts", kTH1D, {etaAxis}); //registry.add("4pi/hPhi", ";Phi ();counts", kTH1D, {phiAxis}); } @@ -275,14 +288,22 @@ struct upcRhoFAnalysis { double rapidity = system.Rapidity(); double systemPhi = system.Phi() + o2::constants::math::PI; + if (nTracks == 4 && tracksTotalCharge(cutTracks) == 0) { // 4pi system - systemTree(collision.runNumber(), mass, pT, rapidity, systemPhi, collision.posX(), collision.posY(), collision.posZ()); - registry.fill(HIST("4pi/hM"), mass); - registry.fill(HIST("4pi/hPt"), pT); + + + systemTree(collision.runNumber(), mass, pT, rapidity, systemPhi, collision.posX(), collision.posY(), collision.posZ(), totalCharge, + collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.timeFV0A(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), + collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC()); + + + //trackSigns, trackMs, trackPts, trackEtas, trackPhis); + //registry.fill(HIST("4pi/hM"), mass); + //registry.fill(HIST("4pi/hPt"), pT); //registry.fill(HIST("4pi/hEta"), rapiditiy); //registry.fill(HIST("4pi/hPhi"), system); } - //std::cout<<"Hola Mundo"< Date: Tue, 4 Feb 2025 00:34:31 -0600 Subject: [PATCH 0003/1650] My first changes --- PWGUD/Tasks/upcRhoFAnalysis.cxx | 2 -- 1 file changed, 2 deletions(-) diff --git a/PWGUD/Tasks/upcRhoFAnalysis.cxx b/PWGUD/Tasks/upcRhoFAnalysis.cxx index 9137dea5afe..1b4bcf231fd 100644 --- a/PWGUD/Tasks/upcRhoFAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoFAnalysis.cxx @@ -296,8 +296,6 @@ struct upcRhoFAnalysis { collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.timeFV0A(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC()); - - //trackSigns, trackMs, trackPts, trackEtas, trackPhis); //registry.fill(HIST("4pi/hM"), mass); //registry.fill(HIST("4pi/hPt"), pT); //registry.fill(HIST("4pi/hEta"), rapiditiy); From c033967e6a79c07a2321c4f67c11afd8ed802236 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Tue, 4 Feb 2025 02:53:03 -0600 Subject: [PATCH 0004/1650] My first changes --- PWGUD/Tasks/upcRhoFAnalysis.cxx | 6 ------ 1 file changed, 6 deletions(-) diff --git a/PWGUD/Tasks/upcRhoFAnalysis.cxx b/PWGUD/Tasks/upcRhoFAnalysis.cxx index 1b4bcf231fd..f55b3acf34f 100644 --- a/PWGUD/Tasks/upcRhoFAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoFAnalysis.cxx @@ -84,7 +84,6 @@ DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", fourpi::RunNumber, fourpi::M, fourpi::PosX, fourpi::PosY, fourpi::PosZ, fourpi::TotalCharge, fourpi::TotalFT0AmplitudeA, fourpi::TotalFT0AmplitudeC, fourpi::TotalFV0AmplitudeA, fourpi::TotalFDDAmplitudeA, fourpi::TotalFDDAmplitudeC, fourpi::TimeFT0A, fourpi::TimeFT0C, fourpi::TimeFV0A, fourpi::TimeFDDA, fourpi::TimeFDDC); - //fourpi::TrackSign, fourpi::TrackM, fourpi::TrackPt, fourpi::TrackEta, fourpi::TrackPhi); } // namespace o2::aod struct upcRhoFAnalysis { @@ -149,19 +148,14 @@ struct upcRhoFAnalysis { { if (!track.isPVContributor()) return false; - //registry.fill(HIST("QC/tracks/hSelectionCounter"), 1); if (!track.hasITS() || !track.hasTPC()) return false; - //registry.fill(HIST("QC/tracks/hSelectionCounter"), 2); if (requireTof && !track.hasTOF()) return false; - //registry.fill(HIST("QC/tracks/hSelectionCounter"), 3); if (std::abs(track.dcaZ()) > tracksDcaMaxCut || std::abs(track.dcaXY()) > (0.0182 + 0.0350 / std::pow(track.pt(), 1.01))) // Run 2 dynamic DCA cut return false; - //registry.fill(HIST("QC/tracks/hSelectionCounter"), 4); if (std::abs(eta(track.px(), track.py(), track.pz())) > PcEtaCut) return false; - //registry.fill(HIST("QC/tracks/hSelectionCounter"), 5); return true; } From cbbcd0193831c16891502623272f92a6ec0f3651 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Tue, 4 Feb 2025 21:44:22 -0600 Subject: [PATCH 0005/1650] My first changes --- PWGUD/Tasks/upcRhoFAnalysis.cxx | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/PWGUD/Tasks/upcRhoFAnalysis.cxx b/PWGUD/Tasks/upcRhoFAnalysis.cxx index f55b3acf34f..f1fcbdd02ca 100644 --- a/PWGUD/Tasks/upcRhoFAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoFAnalysis.cxx @@ -10,7 +10,6 @@ // or submit itself to any jurisdiction. /// /// \brief Task for analysis of rho' in UPCs using UD tables (from SG producer). - /// \author Cesar Ramirez, cesar.ramirez@cern.ch #include "Framework/AnalysisTask.h" @@ -33,14 +32,11 @@ using FullUDSgCollision = soa::Join; - namespace o2::aod { namespace fourpi { - - //for event DECLARE_SOA_COLUMN(RunNumber, runNumber, int32_t); @@ -77,13 +73,10 @@ DECLARE_SOA_COLUMN(TimeFDDC, timeFDDC, float); //DECLARE_SOA_COLUMN(TrackEta, trackEta, std::vector); //DECLARE_SOA_COLUMN(TrackPhi, trackPhi, std::vector); - - } // namespace fourpi DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", fourpi::RunNumber, fourpi::M, fourpi::Pt, fourpi::Eta, fourpi::Phi, fourpi::PosX, fourpi::PosY, fourpi::PosZ, fourpi::TotalCharge, fourpi::TotalFT0AmplitudeA, fourpi::TotalFT0AmplitudeC, fourpi::TotalFV0AmplitudeA, - fourpi::TotalFDDAmplitudeA, fourpi::TotalFDDAmplitudeC, - fourpi::TimeFT0A, fourpi::TimeFT0C, fourpi::TimeFV0A, fourpi::TimeFDDA, fourpi::TimeFDDC); + fourpi::TotalFDDAmplitudeA, fourpi::TotalFDDAmplitudeC, fourpi::TimeFT0A, fourpi::TimeFT0C, fourpi::TimeFV0A, fourpi::TimeFDDA, fourpi::TimeFDDC); } // namespace o2::aod struct upcRhoFAnalysis { @@ -287,8 +280,8 @@ struct upcRhoFAnalysis { systemTree(collision.runNumber(), mass, pT, rapidity, systemPhi, collision.posX(), collision.posY(), collision.posZ(), totalCharge, - collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.timeFV0A(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), - collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC()); + collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.timeFV0A(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), + collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC()); //registry.fill(HIST("4pi/hM"), mass); //registry.fill(HIST("4pi/hPt"), pT); From 6b2cbd3d1cd42c2b2c71e51602ce48e7d180c4d4 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Wed, 5 Feb 2025 14:12:29 -0600 Subject: [PATCH 0006/1650] My first changes --- PWGUD/Tasks/upcRhoFAnalysis.cxx | 59 +++++++++++++++------------------ 1 file changed, 26 insertions(+), 33 deletions(-) diff --git a/PWGUD/Tasks/upcRhoFAnalysis.cxx b/PWGUD/Tasks/upcRhoFAnalysis.cxx index f1fcbdd02ca..1817f8ef37e 100644 --- a/PWGUD/Tasks/upcRhoFAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoFAnalysis.cxx @@ -31,30 +31,29 @@ using namespace o2::framework::expressions; using FullUDSgCollision = soa::Join::iterator; using FullUDTracks = soa::Join; - namespace o2::aod { namespace fourpi { -//for event +// for event DECLARE_SOA_COLUMN(RunNumber, runNumber, int32_t); -//for Rhos +// for Rhos DECLARE_SOA_COLUMN(M, m, double); DECLARE_SOA_COLUMN(Pt, pt, double); DECLARE_SOA_COLUMN(Eta, eta, double); DECLARE_SOA_COLUMN(Phi, phi, double); -//for vertex +// for vertex DECLARE_SOA_COLUMN(PosX, posX, double); DECLARE_SOA_COLUMN(PosY, posY, double); DECLARE_SOA_COLUMN(PosZ, posZ, double); -//for other +// for other DECLARE_SOA_COLUMN(TotalCharge, totalCharge, int); -//info Detec +// info Detec DECLARE_SOA_COLUMN(TotalFT0AmplitudeA, totalFT0AmplitudeA, float); DECLARE_SOA_COLUMN(TotalFT0AmplitudeC, totalFT0AmplitudeC, float); DECLARE_SOA_COLUMN(TotalFV0AmplitudeA, totalFV0AmplitudeA, float); @@ -66,12 +65,12 @@ DECLARE_SOA_COLUMN(TimeFV0A, timeFV0A, float); DECLARE_SOA_COLUMN(TimeFDDA, timeFDDA, float); DECLARE_SOA_COLUMN(TimeFDDC, timeFDDC, float); -//for pion tracks -//DECLARE_SOA_COLUMN(TrackSign, trackSign, std::vector); -//DECLARE_SOA_COLUMN(TrackM, trackM, std::vector); -//DECLARE_SOA_COLUMN(TrackPt, trackPt, std::vector); -//DECLARE_SOA_COLUMN(TrackEta, trackEta, std::vector); -//DECLARE_SOA_COLUMN(TrackPhi, trackPhi, std::vector); +// for pion tracks +// DECLARE_SOA_COLUMN(TrackSign, trackSign, std::vector); +// DECLARE_SOA_COLUMN(TrackM, trackM, std::vector); +// DECLARE_SOA_COLUMN(TrackPt, trackPt, std::vector); +// DECLARE_SOA_COLUMN(TrackEta, trackEta, std::vector); +// DECLARE_SOA_COLUMN(TrackPhi, trackPhi, std::vector); } // namespace fourpi DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", fourpi::RunNumber, fourpi::M, fourpi::Pt, fourpi::Eta, fourpi::Phi, @@ -80,7 +79,7 @@ DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", fourpi::RunNumber, fourpi::M, } // namespace o2::aod struct upcRhoFAnalysis { - ProducessystemTree; + Produces systemTree; double PcEtaCut = 0.9; // physics coordination recommendation @@ -120,10 +119,10 @@ struct upcRhoFAnalysis { std::vector selectionCounterLabels = {"all tracks", "PV contributor", "ITS + TPC hit", "TOF requirement", "DCA cut", "#eta cut", "2D TPC n#sigma_{#pi} cut"}; // 4PI SYSTEM - //registry.add("4pi/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); - //registry.add("4pi/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - //registry.add("4pi/hEta", ";Eta (1);counts", kTH1D, {etaAxis}); - //registry.add("4pi/hPhi", ";Phi ();counts", kTH1D, {phiAxis}); + // registry.add("4pi/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); + // registry.add("4pi/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); + // registry.add("4pi/hEta", ";Eta (1);counts", kTH1D, {etaAxis}); + // registry.add("4pi/hPhi", ";Phi ();counts", kTH1D, {phiAxis}); } template @@ -230,7 +229,6 @@ struct upcRhoFAnalysis { void processReco(FullUDSgCollision const& collision, FullUDTracks const& tracks) { - if (!collisionPassesCuts(collision)) return; @@ -252,17 +250,14 @@ struct upcRhoFAnalysis { int trackCounter = 0; for (const auto& track : tracks) { - if (!trackPassesCuts(track)) continue; trackCounter++; cutTracks.push_back(track); cutTracks4Vecs.push_back(ROOT::Math::PxPyPzMVector(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged)); // apriori assume pion mass - } - if (!tracksPassPiPID(cutTracks)) return; // reonstruct system and calculate total charge, save commonly used values into variables @@ -275,20 +270,18 @@ struct upcRhoFAnalysis { double rapidity = system.Rapidity(); double systemPhi = system.Phi() + o2::constants::math::PI; - if (nTracks == 4 && tracksTotalCharge(cutTracks) == 0) { // 4pi system - systemTree(collision.runNumber(), mass, pT, rapidity, systemPhi, collision.posX(), collision.posY(), collision.posZ(), totalCharge, - collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.timeFV0A(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), - collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC()); - - //registry.fill(HIST("4pi/hM"), mass); - //registry.fill(HIST("4pi/hPt"), pT); - //registry.fill(HIST("4pi/hEta"), rapiditiy); - //registry.fill(HIST("4pi/hPhi"), system); - } - //std::cout<<"Hello World"<(cfgc)}; -} \ No newline at end of file +} From d28ff430a2329f904590f9f37973e6ee17ebc0ce Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Wed, 5 Feb 2025 14:25:05 -0600 Subject: [PATCH 0007/1650] My first changes --- PWGUD/Tasks/CMakeLists.txt | 2 +- PWGUD/Tasks/upcRhoFAnalysis.cxx | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/PWGUD/Tasks/CMakeLists.txt b/PWGUD/Tasks/CMakeLists.txt index 466728fef3e..bedd07abdfa 100644 --- a/PWGUD/Tasks/CMakeLists.txt +++ b/PWGUD/Tasks/CMakeLists.txt @@ -207,7 +207,7 @@ o2physics_add_dpl_workflow(upc-rho-analysis SOURCES upcRhoAnalysis.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGPIDSelector COMPONENT_NAME Analysis) - + o2physics_add_dpl_workflow(upc-rho-f-analysis SOURCES upcRhoFAnalysis.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGPIDSelector diff --git a/PWGUD/Tasks/upcRhoFAnalysis.cxx b/PWGUD/Tasks/upcRhoFAnalysis.cxx index 1817f8ef37e..fed2790259b 100644 --- a/PWGUD/Tasks/upcRhoFAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoFAnalysis.cxx @@ -12,10 +12,15 @@ /// \brief Task for analysis of rho' in UPCs using UD tables (from SG producer). /// \author Cesar Ramirez, cesar.ramirez@cern.ch +#include // Para std::string +#include // Para std::vector + + #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "Framework/runDataProcessing.h" + #include "Math/Vector4D.h" // similiar to TLorentzVector (which is now legacy apparently) #include "random" From 38b56c22895f12bce59d60edcf2dbe120061a3d0 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Wed, 5 Feb 2025 14:30:35 -0600 Subject: [PATCH 0008/1650] My first changes --- PWGUD/Tasks/CMakeLists.txt | 2 +- PWGUD/Tasks/upcRhoFAnalysis.cxx | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/PWGUD/Tasks/CMakeLists.txt b/PWGUD/Tasks/CMakeLists.txt index bedd07abdfa..9730e188bf1 100644 --- a/PWGUD/Tasks/CMakeLists.txt +++ b/PWGUD/Tasks/CMakeLists.txt @@ -207,7 +207,7 @@ o2physics_add_dpl_workflow(upc-rho-analysis SOURCES upcRhoAnalysis.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGPIDSelector COMPONENT_NAME Analysis) - + o2physics_add_dpl_workflow(upc-rho-f-analysis SOURCES upcRhoFAnalysis.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGPIDSelector diff --git a/PWGUD/Tasks/upcRhoFAnalysis.cxx b/PWGUD/Tasks/upcRhoFAnalysis.cxx index fed2790259b..1ea24a7203e 100644 --- a/PWGUD/Tasks/upcRhoFAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoFAnalysis.cxx @@ -12,15 +12,13 @@ /// \brief Task for analysis of rho' in UPCs using UD tables (from SG producer). /// \author Cesar Ramirez, cesar.ramirez@cern.ch -#include // Para std::string -#include // Para std::vector - +#include // Para std::string +#include // Para std::vector #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "Framework/runDataProcessing.h" - #include "Math/Vector4D.h" // similiar to TLorentzVector (which is now legacy apparently) #include "random" From 1f38a3a2117da706d2601507deb0c0eb3b595067 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Thu, 6 Feb 2025 10:49:48 -0600 Subject: [PATCH 0009/1650] My first changes --- PWGUD/Tasks/upcRhoFAnalysis.cxx | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/PWGUD/Tasks/upcRhoFAnalysis.cxx b/PWGUD/Tasks/upcRhoFAnalysis.cxx index 1ea24a7203e..42de113c5ef 100644 --- a/PWGUD/Tasks/upcRhoFAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoFAnalysis.cxx @@ -236,17 +236,6 @@ struct upcRhoFAnalysis { if (!collisionPassesCuts(collision)) return; - // event tagging - bool XnXn = false, OnOn = false, XnOn = false, OnXn = false; // note: On == 0n... - if (collision.energyCommonZNA() < ZNcommonEnergyCut && collision.energyCommonZNC() < ZNcommonEnergyCut) - OnOn = true; - if (collision.energyCommonZNA() > ZNcommonEnergyCut && std::abs(collision.timeZNA()) < ZNtimeCut && - collision.energyCommonZNC() > ZNcommonEnergyCut && std::abs(collision.timeZNC()) < ZNtimeCut) - XnXn = true; - if (collision.energyCommonZNA() > ZNcommonEnergyCut && std::abs(collision.timeZNA()) < ZNtimeCut && collision.energyCommonZNC() < ZNcommonEnergyCut) - XnOn = true; - if (collision.energyCommonZNA() < ZNcommonEnergyCut && collision.energyCommonZNC() > ZNcommonEnergyCut && std::abs(collision.timeZNC()) < ZNtimeCut) - OnXn = true; // vectors for storing selected tracks and their 4-vectors std::vector cutTracks; std::vector cutTracks4Vecs; @@ -269,7 +258,7 @@ struct upcRhoFAnalysis { int nTracks = cutTracks.size(); double mass = system.M(); double pT = system.Pt(); - double pTsquare = pT * pT; + //double pTsquare = pT * pT; double rapidity = system.Rapidity(); double systemPhi = system.Phi() + o2::constants::math::PI; From 9362bf5f73fc3badfeb414d5cabb9d47c497dbd1 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Thu, 6 Feb 2025 10:52:05 -0600 Subject: [PATCH 0010/1650] My first changes --- PWGUD/Tasks/upcRhoFAnalysis.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGUD/Tasks/upcRhoFAnalysis.cxx b/PWGUD/Tasks/upcRhoFAnalysis.cxx index 42de113c5ef..baccbd63125 100644 --- a/PWGUD/Tasks/upcRhoFAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoFAnalysis.cxx @@ -258,7 +258,7 @@ struct upcRhoFAnalysis { int nTracks = cutTracks.size(); double mass = system.M(); double pT = system.Pt(); - //double pTsquare = pT * pT; + // double pTsquare = pT * pT; double rapidity = system.Rapidity(); double systemPhi = system.Phi() + o2::constants::math::PI; From ce93798815561804aeacc90fbff12c5b4711acc9 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Fri, 7 Feb 2025 09:02:11 -0600 Subject: [PATCH 0011/1650] Rename the task and remove unused variables --- PWGUD/Tasks/CMakeLists.txt | 4 ++-- .../{upcRhoFAnalysis.cxx => upcRhoPrimeAnalysis.cxx} | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) rename PWGUD/Tasks/{upcRhoFAnalysis.cxx => upcRhoPrimeAnalysis.cxx} (98%) diff --git a/PWGUD/Tasks/CMakeLists.txt b/PWGUD/Tasks/CMakeLists.txt index 9730e188bf1..c5eff0595ab 100644 --- a/PWGUD/Tasks/CMakeLists.txt +++ b/PWGUD/Tasks/CMakeLists.txt @@ -208,8 +208,8 @@ o2physics_add_dpl_workflow(upc-rho-analysis PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGPIDSelector COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(upc-rho-f-analysis - SOURCES upcRhoFAnalysis.cxx +o2physics_add_dpl_workflow(upc-rho-prime-analysis + SOURCES upcRhoPrimeAnalysis.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGPIDSelector COMPONENT_NAME Analysis) diff --git a/PWGUD/Tasks/upcRhoFAnalysis.cxx b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx similarity index 98% rename from PWGUD/Tasks/upcRhoFAnalysis.cxx rename to PWGUD/Tasks/upcRhoPrimeAnalysis.cxx index baccbd63125..40de174a3ea 100644 --- a/PWGUD/Tasks/upcRhoFAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx @@ -81,7 +81,7 @@ DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", fourpi::RunNumber, fourpi::M, fourpi::TotalFDDAmplitudeA, fourpi::TotalFDDAmplitudeC, fourpi::TimeFT0A, fourpi::TimeFT0C, fourpi::TimeFV0A, fourpi::TimeFDDA, fourpi::TimeFDDC); } // namespace o2::aod -struct upcRhoFAnalysis { +struct upcRhoPrimeAnalysis { Produces systemTree; double PcEtaCut = 0.9; // physics coordination recommendation @@ -240,12 +240,12 @@ struct upcRhoFAnalysis { std::vector cutTracks; std::vector cutTracks4Vecs; - int trackCounter = 0; + // int trackCounter = 0; for (const auto& track : tracks) { if (!trackPassesCuts(track)) continue; - trackCounter++; + // trackCounter++; cutTracks.push_back(track); cutTracks4Vecs.push_back(ROOT::Math::PxPyPzMVector(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged)); // apriori assume pion mass } @@ -275,11 +275,11 @@ struct upcRhoFAnalysis { } // std::cout<<"Hello World"<(cfgc)}; + o2::framework::adaptAnalysisTask(cfgc)}; } From b383727569621bfb7390313acd6722132d2a2091 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Tue, 18 Mar 2025 07:23:57 -0600 Subject: [PATCH 0012/1650] new variables --- PWGUD/Tasks/upcRhoPrimeAnalysis.cxx | 70 ++++++++++++++++++++++++----- 1 file changed, 60 insertions(+), 10 deletions(-) diff --git a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx index 40de174a3ea..bbb56c898ad 100644 --- a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx @@ -42,7 +42,7 @@ namespace fourpi // for event DECLARE_SOA_COLUMN(RunNumber, runNumber, int32_t); -// for Rhos +// for rho prime DECLARE_SOA_COLUMN(M, m, double); DECLARE_SOA_COLUMN(Pt, pt, double); DECLARE_SOA_COLUMN(Eta, eta, double); @@ -56,7 +56,7 @@ DECLARE_SOA_COLUMN(PosZ, posZ, double); // for other DECLARE_SOA_COLUMN(TotalCharge, totalCharge, int); -// info Detec +// info detec DECLARE_SOA_COLUMN(TotalFT0AmplitudeA, totalFT0AmplitudeA, float); DECLARE_SOA_COLUMN(TotalFT0AmplitudeC, totalFT0AmplitudeC, float); DECLARE_SOA_COLUMN(TotalFV0AmplitudeA, totalFV0AmplitudeA, float); @@ -69,16 +69,32 @@ DECLARE_SOA_COLUMN(TimeFDDA, timeFDDA, float); DECLARE_SOA_COLUMN(TimeFDDC, timeFDDC, float); // for pion tracks -// DECLARE_SOA_COLUMN(TrackSign, trackSign, std::vector); -// DECLARE_SOA_COLUMN(TrackM, trackM, std::vector); -// DECLARE_SOA_COLUMN(TrackPt, trackPt, std::vector); -// DECLARE_SOA_COLUMN(TrackEta, trackEta, std::vector); -// DECLARE_SOA_COLUMN(TrackPhi, trackPhi, std::vector); +DECLARE_SOA_COLUMN(NumContrib, numContrib, int32_t); +DECLARE_SOA_COLUMN(Sign, sign, std::vector); +DECLARE_SOA_COLUMN(TrackPt, trackPt, std::vector); +DECLARE_SOA_COLUMN(TrackEta, trackEta, std::vector); +DECLARE_SOA_COLUMN(TrackPhi, trackPhi, std::vector); +DECLARE_SOA_COLUMN(TPCNSigmaEl, tpcNSigmaEl, std::vector); +DECLARE_SOA_COLUMN(TPCNSigmaPi, tpcNSigmaPi, std::vector); +DECLARE_SOA_COLUMN(TPCNSigmaKa, tpcNSigmaKa, std::vector); +DECLARE_SOA_COLUMN(TPCNSigmaPr, tpcNSigmaPr, std::vector); +DECLARE_SOA_COLUMN(TrackID, trackID, std::vector); + +// for others +DECLARE_SOA_COLUMN(IsReconstructedWithUPC, isReconstructedWithUPC, bool); +DECLARE_SOA_COLUMN(TimeZNA, timeZNA, float); +DECLARE_SOA_COLUMN(TimeZNC, timeZNC, float); +DECLARE_SOA_COLUMN(EnergyCommonZNA, energyCommonZNA, float); +DECLARE_SOA_COLUMN(EnergyCommonZNC, energyCommonZNC, float); } // namespace fourpi + DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", fourpi::RunNumber, fourpi::M, fourpi::Pt, fourpi::Eta, fourpi::Phi, fourpi::PosX, fourpi::PosY, fourpi::PosZ, fourpi::TotalCharge, fourpi::TotalFT0AmplitudeA, fourpi::TotalFT0AmplitudeC, fourpi::TotalFV0AmplitudeA, - fourpi::TotalFDDAmplitudeA, fourpi::TotalFDDAmplitudeC, fourpi::TimeFT0A, fourpi::TimeFT0C, fourpi::TimeFV0A, fourpi::TimeFDDA, fourpi::TimeFDDC); + fourpi::TotalFDDAmplitudeA, fourpi::TotalFDDAmplitudeC, fourpi::TimeFT0A, fourpi::TimeFT0C, fourpi::TimeFV0A, fourpi::TimeFDDA, fourpi::TimeFDDC, + fourpi::NumContrib, fourpi::Sign, fourpi::TrackPt, fourpi::TrackEta, fourpi::TrackPhi, + fourpi::TPCNSigmaEl, fourpi::TPCNSigmaPi, fourpi::TPCNSigmaKa, fourpi::TPCNSigmaPr, fourpi::TrackID, fourpi::IsReconstructedWithUPC, + fourpi::TimeZNA, fourpi::TimeZNC, fourpi::EnergyCommonZNA, fourpi::EnergyCommonZNC); } // namespace o2::aod struct upcRhoPrimeAnalysis { @@ -264,9 +280,43 @@ struct upcRhoPrimeAnalysis { if (nTracks == 4 && tracksTotalCharge(cutTracks) == 0) { // 4pi system + // Informacion de cada traza + std::vector vTrackPt, vTrackEta, vTrackPhi; + std::vector vSign, vTrackID; + std::vector vTpcNSigmaEl, vTpcNSigmaPi, vTpcNSigmaKa, vTpcNSigmaPr; + + for (size_t i = 0; i < cutTracks.size(); i++) { + + double tPt = cutTracks[i].pt(); + double tEta = eta(cutTracks[i].px(), cutTracks[i].py(), cutTracks[i].pz()); + double tPhi = phi(cutTracks[i].px(), cutTracks[i].py()); + + vTrackPt.push_back(tPt); + vTrackEta.push_back(tEta); + vTrackPhi.push_back(tPhi); + vSign.push_back(cutTracks[i].sign()); + vTpcNSigmaEl.push_back(cutTracks[i].tpcNSigmaEl()); + vTpcNSigmaPi.push_back(cutTracks[i].tpcNSigmaPi()); + vTpcNSigmaKa.push_back(cutTracks[i].tpcNSigmaKa()); + vTpcNSigmaPr.push_back(cutTracks[i].tpcNSigmaPr()); + + // ID de la traza + vTrackID.push_back(i); + } + + bool isReconstructedWithUPC = false; + + if (collision.flags() == 1) { + isReconstructedWithUPC = true; + } else { + isReconstructedWithUPC = false; + } + systemTree(collision.runNumber(), mass, pT, rapidity, systemPhi, collision.posX(), collision.posY(), collision.posZ(), totalCharge, collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.timeFV0A(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), - collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC()); + collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC(), + collision.numContrib(), vSign, vTrackPt, vTrackEta, vTrackPhi, vTpcNSigmaEl, vTpcNSigmaPi, vTpcNSigmaKa, vTpcNSigmaPr, vTrackID, isReconstructedWithUPC, + collision.timeZNA(), collision.timeZNC(), collision.energyCommonZNA(), collision.energyCommonZNC()); // registry.fill(HIST("4pi/hM"), mass); // registry.fill(HIST("4pi/hPt"), pT); @@ -282,4 +332,4 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ o2::framework::adaptAnalysisTask(cfgc)}; -} +} \ No newline at end of file From 43f21597236c37485a4ab812e2805c308ed229f3 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Tue, 18 Mar 2025 07:38:08 -0600 Subject: [PATCH 0013/1650] new variables --- PWGUD/Tasks/upcRhoPrimeAnalysis.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx index bbb56c898ad..812c77ad794 100644 --- a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx @@ -332,4 +332,4 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ o2::framework::adaptAnalysisTask(cfgc)}; -} \ No newline at end of file +} From 08d7335d07cf77e9ef59d8a4f89710b9c544b380 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Tue, 18 Mar 2025 07:56:22 -0600 Subject: [PATCH 0014/1650] new variables --- PWGUD/Tasks/upcRhoPrimeAnalysis.cxx | 2 -- 1 file changed, 2 deletions(-) diff --git a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx index 812c77ad794..64559cc10dd 100644 --- a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx @@ -280,7 +280,6 @@ struct upcRhoPrimeAnalysis { if (nTracks == 4 && tracksTotalCharge(cutTracks) == 0) { // 4pi system - // Informacion de cada traza std::vector vTrackPt, vTrackEta, vTrackPhi; std::vector vSign, vTrackID; std::vector vTpcNSigmaEl, vTpcNSigmaPi, vTpcNSigmaKa, vTpcNSigmaPr; @@ -300,7 +299,6 @@ struct upcRhoPrimeAnalysis { vTpcNSigmaKa.push_back(cutTracks[i].tpcNSigmaKa()); vTpcNSigmaPr.push_back(cutTracks[i].tpcNSigmaPr()); - // ID de la traza vTrackID.push_back(i); } From 0d5a589e600188fd5504ea398bc6f825a8fe1685 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Tue, 21 Jan 2025 12:44:43 -0600 Subject: [PATCH 0015/1650] My first changes --- PWGUD/Tasks/CMakeLists.txt | 5 + PWGUD/Tasks/upcRhoFAnalysis.cxx | 294 ++++++++++++++++++++++++++++++++ 2 files changed, 299 insertions(+) create mode 100644 PWGUD/Tasks/upcRhoFAnalysis.cxx diff --git a/PWGUD/Tasks/CMakeLists.txt b/PWGUD/Tasks/CMakeLists.txt index 11768808f53..12dfebdc812 100644 --- a/PWGUD/Tasks/CMakeLists.txt +++ b/PWGUD/Tasks/CMakeLists.txt @@ -207,6 +207,11 @@ o2physics_add_dpl_workflow(upc-rho-analysis SOURCES upcRhoAnalysis.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGPIDSelector COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(upc-rho-f-analysis + SOURCES upcRhoFAnalysis.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGPIDSelector + COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(event-by-event SOURCES eventByevent.cxx diff --git a/PWGUD/Tasks/upcRhoFAnalysis.cxx b/PWGUD/Tasks/upcRhoFAnalysis.cxx new file mode 100644 index 00000000000..10ccee1de87 --- /dev/null +++ b/PWGUD/Tasks/upcRhoFAnalysis.cxx @@ -0,0 +1,294 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// +/// \brief task for analysis of rho in UPCs using UD tables (from SG producer) +/// includes event tagging based on ZN information, track selection, reconstruction, +/// and also some basic stuff for decay phi anisotropy studies +/// \author Cesar, cesar.ramirez@cern.ch + +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/runDataProcessing.h" + +#include "Math/Vector4D.h" // similiar to TLorentzVector (which is now legacy apparently) +#include "random" + +#include "Common/DataModel/PIDResponse.h" + +#include "PWGUD/DataModel/UDTables.h" +#include "PWGUD/Core/UPCTauCentralBarrelHelperRL.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +using FullUDSgCollision = soa::Join::iterator; +using FullUDTracks = soa::Join; + + + +namespace o2::aod +{ +namespace fourpi +{ + + + +//for event +DECLARE_SOA_COLUMN(RunNumber, runNumber, int32_t); + +//for Rhos +DECLARE_SOA_COLUMN(M, m, double); +DECLARE_SOA_COLUMN(Pt, pt, double); +DECLARE_SOA_COLUMN(Eta, eta, double); +DECLARE_SOA_COLUMN(Phi, phi, double); + +//for vertex +DECLARE_SOA_COLUMN(PosX, posX, double); +DECLARE_SOA_COLUMN(PosY, posY, double); +DECLARE_SOA_COLUMN(PosZ, posZ, double); + +//for other +//DECLARE_SOA_COLUMN(TotalCharge, totalCharge, int); + +//for pion tracks +//DECLARE_SOA_COLUMN(TrackSign, trackSign, std::vector); +//DECLARE_SOA_COLUMN(TrackM, trackM, std::vector); +//DECLARE_SOA_COLUMN(TrackPt, trackPt, std::vector); +//DECLARE_SOA_COLUMN(TrackEta, trackEta, std::vector); +//DECLARE_SOA_COLUMN(TrackPhi, trackPhi, std::vector); + + + +} // namespace fourpi +DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", fourpi::RunNumber, fourpi::M, fourpi::Pt, fourpi::Eta, fourpi::Phi) + fourpi::PosX, fourpi::PosY, fourpi::PosZ); //, fourpi::TotalCharge); //fourpi::TrackSign, + //fourpi::TrackM, fourpi::TrackPt, fourpi::TrackEta, fourpi::TrackPhi); +} // namespace o2::aod + +struct upcRhoFAnalysis { + ProducessystemTree; + + double PcEtaCut = 0.9; // physics coordination recommendation + + Configurable specifyGapSide{"specifyGapSide", true, "specify gap side for SG/DG produced data"}; + Configurable gapSide{"gapSide", 2, "gap side for SG produced data"}; + Configurable requireTof{"requireTof", false, "require TOF signal"}; + + Configurable collisionsPosZMaxCut{"collisionsPosZMaxCut", 10.0, "max Z position cut on collisions"}; + Configurable ZNcommonEnergyCut{"ZNcommonEnergyCut", 0.0, "ZN common energy cut"}; + Configurable ZNtimeCut{"ZNtimeCut", 2.0, "ZN time cut"}; + + Configurable tracksTpcNSigmaPiCut{"tracksTpcNSigmaPiCut", 3.0, "TPC nSigma pion cut"}; + Configurable tracksDcaMaxCut{"tracksDcaMaxCut", 1.0, "max DCA cut on tracks"}; + + Configurable systemMassMinCut{"systemMassMinCut", 0.5, "min M cut for reco system"}; + Configurable systemMassMaxCut{"systemMassMaxCut", 1.2, "max M cut for reco system"}; + Configurable systemPtCut{"systemPtMaxCut", 0.1, "max pT cut for reco system"}; + Configurable systemYCut{"systemYCut", 0.9, "rapiditiy cut for reco system"}; + + ConfigurableAxis mAxis{"mAxis", {1000, 0.0, 10.0}, "m (GeV/#it{c}^{2})"}; + ConfigurableAxis mCutAxis{"mCutAxis", {70, 0.5, 1.2}, "m (GeV/#it{c}^{2})"}; + ConfigurableAxis ptAxis{"ptAxis", {1000, 0.0, 10.0}, "p_{T} (GeV/#it{c})"}; + ConfigurableAxis ptCutAxis{"ptCutAxis", {300, 0.0, 0.3}, "p_{T} (GeV/#it{c})"}; + ConfigurableAxis pt2Axis{"pt2Axis", {300, 0.0, 0.09}, "p_{T}^{2} (GeV^{2}/#it{c}^{2})"}; + ConfigurableAxis etaAxis{"etaAxis", {180, -0.9, 0.9}, "#eta"}; + ConfigurableAxis yAxis{"yAxis", {180, -0.9, 0.9}, "y"}; + ConfigurableAxis phiAxis{"phiAxis", {180, 0.0, o2::constants::math::TwoPI}, "#phi"}; + ConfigurableAxis phiAsymmAxis{"phiAsymmAxis", {182, -o2::constants::math::PI, o2::constants::math::PI}, "#phi"}; + ConfigurableAxis momentumFromPhiAxis{"momentumFromPhiAxis", {400, -0.1, 0.1}, "p (GeV/#it{c})"}; + ConfigurableAxis ptQuantileAxis{"ptQuantileAxis", {0, 0.0181689, 0.0263408, 0.0330488, 0.0390369, 0.045058, 0.0512604, 0.0582598, 0.066986, 0.0788085, 0.1}, "p_{T} (GeV/#it{c})"}; + + HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject}; + + void init(o2::framework::InitContext&) + { + // selection counter + std::vector selectionCounterLabels = {"all tracks", "PV contributor", "ITS + TPC hit", "TOF requirement", "DCA cut", "#eta cut", "2D TPC n#sigma_{#pi} cut"}; + + // 4PI SYSTEM + registry.add("4pi/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); + registry.add("4pi/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); + //registry.add("4pi/hEta", ";Eta (1);counts", kTH1D, {etaAxis}); + //registry.add("4pi/hPhi", ";Phi ();counts", kTH1D, {phiAxis}); + } + + template + bool collisionPassesCuts(const C& collision) // collision cuts + { + if (std::abs(collision.posZ()) > collisionsPosZMaxCut) + return false; + if (specifyGapSide && collision.gapSide() != gapSide) + return false; + return true; + } + + template + bool trackPassesCuts(const T& track) // track cuts (PID done separately) + { + if (!track.isPVContributor()) + return false; + //registry.fill(HIST("QC/tracks/hSelectionCounter"), 1); + if (!track.hasITS() || !track.hasTPC()) + return false; + //registry.fill(HIST("QC/tracks/hSelectionCounter"), 2); + if (requireTof && !track.hasTOF()) + return false; + //registry.fill(HIST("QC/tracks/hSelectionCounter"), 3); + if (std::abs(track.dcaZ()) > tracksDcaMaxCut || std::abs(track.dcaXY()) > (0.0182 + 0.0350 / std::pow(track.pt(), 1.01))) // Run 2 dynamic DCA cut + return false; + //registry.fill(HIST("QC/tracks/hSelectionCounter"), 4); + if (std::abs(eta(track.px(), track.py(), track.pz())) > PcEtaCut) + return false; + //registry.fill(HIST("QC/tracks/hSelectionCounter"), 5); + return true; + } + + template + bool tracksPassPiPID(const T& cutTracks) // n-dimensional PID cut + { + double radius = 0.0; + for (const auto& track : cutTracks) + radius += std::pow(track.tpcNSigmaPi(), 2); + return radius < std::pow(tracksTpcNSigmaPiCut, 2); + } + + template + double tracksTotalCharge(const T& cutTracks) // total charge of selected tracks + { + double charge = 0.0; + for (const auto& track : cutTracks) + charge += track.sign(); + return charge; + } + + bool systemPassCuts(const ROOT::Math::PxPyPzMVector& system) // system cuts + { + if (system.M() < systemMassMinCut || system.M() > systemMassMaxCut) + return false; + if (system.Pt() > systemPtCut) + return false; + if (std::abs(system.Rapidity()) > systemYCut) + return false; + return true; + } + + ROOT::Math::PxPyPzMVector reconstructSystem(const std::vector& cutTracks4Vecs) // reconstruct system from 4-vectors + { + ROOT::Math::PxPyPzMVector system; + for (const auto& track4Vec : cutTracks4Vecs) + system += track4Vec; + return system; + } + + double deltaPhi(const ROOT::Math::PxPyPzMVector& p1, const ROOT::Math::PxPyPzMVector& p2) + { + double dPhi = p1.Phi() - p2.Phi(); + if (dPhi > o2::constants::math::PI) + dPhi -= o2::constants::math::TwoPI; + else if (dPhi < -o2::constants::math::PI) + dPhi += o2::constants::math::TwoPI; + return dPhi; // calculate delta phi in (-pi, pi) + } + + double getPhiRandom(const std::vector& cutTracks4Vecs) // decay phi anisotropy + { // two possible definitions of phi: randomize the tracks + std::vector indices = {0, 1}; + unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); // get time-based seed + std::shuffle(indices.begin(), indices.end(), std::default_random_engine(seed)); // shuffle indices + // calculate phi + ROOT::Math::PxPyPzMVector pOne = cutTracks4Vecs[indices[0]]; + ROOT::Math::PxPyPzMVector pTwo = cutTracks4Vecs[indices[1]]; + ROOT::Math::PxPyPzMVector pPlus = pOne + pTwo; + ROOT::Math::PxPyPzMVector pMinus = pOne - pTwo; + return deltaPhi(pPlus, pMinus); + } + + template + double getPhiCharge(const T& cutTracks, const std::vector& cutTracks4Vecs) + { // two possible definitions of phi: charge-based assignment + ROOT::Math::PxPyPzMVector pOne, pTwo; + if (cutTracks[0].sign() > 0) { + pOne = cutTracks4Vecs[0]; + pTwo = cutTracks4Vecs[1]; + } else { + pOne = cutTracks4Vecs[1]; + pTwo = cutTracks4Vecs[0]; + } + ROOT::Math::PxPyPzMVector pPlus = pOne + pTwo; + ROOT::Math::PxPyPzMVector pMinus = pOne - pTwo; + return deltaPhi(pPlus, pMinus); + } + + void processReco(FullUDSgCollision const& collision, FullUDTracks const& tracks) + { + + + if (!collisionPassesCuts(collision)) + return; + + // event tagging + bool XnXn = false, OnOn = false, XnOn = false, OnXn = false; // note: On == 0n... + if (collision.energyCommonZNA() < ZNcommonEnergyCut && collision.energyCommonZNC() < ZNcommonEnergyCut) + OnOn = true; + if (collision.energyCommonZNA() > ZNcommonEnergyCut && std::abs(collision.timeZNA()) < ZNtimeCut && + collision.energyCommonZNC() > ZNcommonEnergyCut && std::abs(collision.timeZNC()) < ZNtimeCut) + XnXn = true; + if (collision.energyCommonZNA() > ZNcommonEnergyCut && std::abs(collision.timeZNA()) < ZNtimeCut && collision.energyCommonZNC() < ZNcommonEnergyCut) + XnOn = true; + if (collision.energyCommonZNA() < ZNcommonEnergyCut && collision.energyCommonZNC() > ZNcommonEnergyCut && std::abs(collision.timeZNC()) < ZNtimeCut) + OnXn = true; + // vectors for storing selected tracks and their 4-vectors + std::vector cutTracks; + std::vector cutTracks4Vecs; + + int trackCounter = 0; + for (const auto& track : tracks) { + + + if (!trackPassesCuts(track)) + continue; + trackCounter++; + cutTracks.push_back(track); + cutTracks4Vecs.push_back(ROOT::Math::PxPyPzMVector(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged)); // apriori assume pion mass + + } + + + if (!tracksPassPiPID(cutTracks)) + return; + // reonstruct system and calculate total charge, save commonly used values into variables + ROOT::Math::PxPyPzMVector system = reconstructSystem(cutTracks4Vecs); + int totalCharge = tracksTotalCharge(cutTracks); + int nTracks = cutTracks.size(); + double mass = system.M(); + double pT = system.Pt(); + double pTsquare = pT * pT; + double rapidity = system.Rapidity(); + double systemPhi = system.Phi() + o2::constants::math::PI; + + if (nTracks == 4 && tracksTotalCharge(cutTracks) == 0) { // 4pi system + systemTree(collision.runNumber(), mass, pT, rapidity, systemPhi, collision.posX(), collision.posY(), collision.posZ()); + registry.fill(HIST("4pi/hM"), mass); + registry.fill(HIST("4pi/hPt"), pT); + //registry.fill(HIST("4pi/hEta"), rapiditiy); + //registry.fill(HIST("4pi/hPhi"), system); + } + //std::cout<<"Hola Mundo"<(cfgc)}; +} \ No newline at end of file From 99e08e4a2ed1be736d326dd2dc08201933401397 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Tue, 4 Feb 2025 00:32:46 -0600 Subject: [PATCH 0016/1650] My first changes --- PWGUD/Tasks/upcRhoFAnalysis.cxx | 49 +++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/PWGUD/Tasks/upcRhoFAnalysis.cxx b/PWGUD/Tasks/upcRhoFAnalysis.cxx index 10ccee1de87..9137dea5afe 100644 --- a/PWGUD/Tasks/upcRhoFAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoFAnalysis.cxx @@ -9,10 +9,9 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. /// -/// \brief task for analysis of rho in UPCs using UD tables (from SG producer) -/// includes event tagging based on ZN information, track selection, reconstruction, -/// and also some basic stuff for decay phi anisotropy studies -/// \author Cesar, cesar.ramirez@cern.ch +/// \brief Task for analysis of rho' in UPCs using UD tables (from SG producer). + +/// \author Cesar Ramirez, cesar.ramirez@cern.ch #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" @@ -57,7 +56,19 @@ DECLARE_SOA_COLUMN(PosY, posY, double); DECLARE_SOA_COLUMN(PosZ, posZ, double); //for other -//DECLARE_SOA_COLUMN(TotalCharge, totalCharge, int); +DECLARE_SOA_COLUMN(TotalCharge, totalCharge, int); + +//info Detec +DECLARE_SOA_COLUMN(TotalFT0AmplitudeA, totalFT0AmplitudeA, float); +DECLARE_SOA_COLUMN(TotalFT0AmplitudeC, totalFT0AmplitudeC, float); +DECLARE_SOA_COLUMN(TotalFV0AmplitudeA, totalFV0AmplitudeA, float); +DECLARE_SOA_COLUMN(TotalFDDAmplitudeA, totalFDDAmplitudeA, float); +DECLARE_SOA_COLUMN(TotalFDDAmplitudeC, totalFDDAmplitudeC, float); +DECLARE_SOA_COLUMN(TimeFT0A, timeFT0A, float); +DECLARE_SOA_COLUMN(TimeFT0C, timeFT0C, float); +DECLARE_SOA_COLUMN(TimeFV0A, timeFV0A, float); +DECLARE_SOA_COLUMN(TimeFDDA, timeFDDA, float); +DECLARE_SOA_COLUMN(TimeFDDC, timeFDDC, float); //for pion tracks //DECLARE_SOA_COLUMN(TrackSign, trackSign, std::vector); @@ -69,9 +80,11 @@ DECLARE_SOA_COLUMN(PosZ, posZ, double); } // namespace fourpi -DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", fourpi::RunNumber, fourpi::M, fourpi::Pt, fourpi::Eta, fourpi::Phi) - fourpi::PosX, fourpi::PosY, fourpi::PosZ); //, fourpi::TotalCharge); //fourpi::TrackSign, - //fourpi::TrackM, fourpi::TrackPt, fourpi::TrackEta, fourpi::TrackPhi); +DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", fourpi::RunNumber, fourpi::M, fourpi::Pt, fourpi::Eta, fourpi::Phi, + fourpi::PosX, fourpi::PosY, fourpi::PosZ, fourpi::TotalCharge, fourpi::TotalFT0AmplitudeA, fourpi::TotalFT0AmplitudeC, fourpi::TotalFV0AmplitudeA, + fourpi::TotalFDDAmplitudeA, fourpi::TotalFDDAmplitudeC, + fourpi::TimeFT0A, fourpi::TimeFT0C, fourpi::TimeFV0A, fourpi::TimeFDDA, fourpi::TimeFDDC); + //fourpi::TrackSign, fourpi::TrackM, fourpi::TrackPt, fourpi::TrackEta, fourpi::TrackPhi); } // namespace o2::aod struct upcRhoFAnalysis { @@ -115,8 +128,8 @@ struct upcRhoFAnalysis { std::vector selectionCounterLabels = {"all tracks", "PV contributor", "ITS + TPC hit", "TOF requirement", "DCA cut", "#eta cut", "2D TPC n#sigma_{#pi} cut"}; // 4PI SYSTEM - registry.add("4pi/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); - registry.add("4pi/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); + //registry.add("4pi/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); + //registry.add("4pi/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); //registry.add("4pi/hEta", ";Eta (1);counts", kTH1D, {etaAxis}); //registry.add("4pi/hPhi", ";Phi ();counts", kTH1D, {phiAxis}); } @@ -275,14 +288,22 @@ struct upcRhoFAnalysis { double rapidity = system.Rapidity(); double systemPhi = system.Phi() + o2::constants::math::PI; + if (nTracks == 4 && tracksTotalCharge(cutTracks) == 0) { // 4pi system - systemTree(collision.runNumber(), mass, pT, rapidity, systemPhi, collision.posX(), collision.posY(), collision.posZ()); - registry.fill(HIST("4pi/hM"), mass); - registry.fill(HIST("4pi/hPt"), pT); + + + systemTree(collision.runNumber(), mass, pT, rapidity, systemPhi, collision.posX(), collision.posY(), collision.posZ(), totalCharge, + collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.timeFV0A(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), + collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC()); + + + //trackSigns, trackMs, trackPts, trackEtas, trackPhis); + //registry.fill(HIST("4pi/hM"), mass); + //registry.fill(HIST("4pi/hPt"), pT); //registry.fill(HIST("4pi/hEta"), rapiditiy); //registry.fill(HIST("4pi/hPhi"), system); } - //std::cout<<"Hola Mundo"< Date: Tue, 4 Feb 2025 00:34:31 -0600 Subject: [PATCH 0017/1650] My first changes --- PWGUD/Tasks/upcRhoFAnalysis.cxx | 2 -- 1 file changed, 2 deletions(-) diff --git a/PWGUD/Tasks/upcRhoFAnalysis.cxx b/PWGUD/Tasks/upcRhoFAnalysis.cxx index 9137dea5afe..1b4bcf231fd 100644 --- a/PWGUD/Tasks/upcRhoFAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoFAnalysis.cxx @@ -296,8 +296,6 @@ struct upcRhoFAnalysis { collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.timeFV0A(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC()); - - //trackSigns, trackMs, trackPts, trackEtas, trackPhis); //registry.fill(HIST("4pi/hM"), mass); //registry.fill(HIST("4pi/hPt"), pT); //registry.fill(HIST("4pi/hEta"), rapiditiy); From 4e99aba7d8428b9eda41e2c13f3904fa7efd621e Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Tue, 4 Feb 2025 02:53:03 -0600 Subject: [PATCH 0018/1650] My first changes --- PWGUD/Tasks/upcRhoFAnalysis.cxx | 6 ------ 1 file changed, 6 deletions(-) diff --git a/PWGUD/Tasks/upcRhoFAnalysis.cxx b/PWGUD/Tasks/upcRhoFAnalysis.cxx index 1b4bcf231fd..f55b3acf34f 100644 --- a/PWGUD/Tasks/upcRhoFAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoFAnalysis.cxx @@ -84,7 +84,6 @@ DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", fourpi::RunNumber, fourpi::M, fourpi::PosX, fourpi::PosY, fourpi::PosZ, fourpi::TotalCharge, fourpi::TotalFT0AmplitudeA, fourpi::TotalFT0AmplitudeC, fourpi::TotalFV0AmplitudeA, fourpi::TotalFDDAmplitudeA, fourpi::TotalFDDAmplitudeC, fourpi::TimeFT0A, fourpi::TimeFT0C, fourpi::TimeFV0A, fourpi::TimeFDDA, fourpi::TimeFDDC); - //fourpi::TrackSign, fourpi::TrackM, fourpi::TrackPt, fourpi::TrackEta, fourpi::TrackPhi); } // namespace o2::aod struct upcRhoFAnalysis { @@ -149,19 +148,14 @@ struct upcRhoFAnalysis { { if (!track.isPVContributor()) return false; - //registry.fill(HIST("QC/tracks/hSelectionCounter"), 1); if (!track.hasITS() || !track.hasTPC()) return false; - //registry.fill(HIST("QC/tracks/hSelectionCounter"), 2); if (requireTof && !track.hasTOF()) return false; - //registry.fill(HIST("QC/tracks/hSelectionCounter"), 3); if (std::abs(track.dcaZ()) > tracksDcaMaxCut || std::abs(track.dcaXY()) > (0.0182 + 0.0350 / std::pow(track.pt(), 1.01))) // Run 2 dynamic DCA cut return false; - //registry.fill(HIST("QC/tracks/hSelectionCounter"), 4); if (std::abs(eta(track.px(), track.py(), track.pz())) > PcEtaCut) return false; - //registry.fill(HIST("QC/tracks/hSelectionCounter"), 5); return true; } From 48a993ee981a4a8a09d71423a4b340e647486528 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Tue, 4 Feb 2025 21:44:22 -0600 Subject: [PATCH 0019/1650] My first changes --- PWGUD/Tasks/upcRhoFAnalysis.cxx | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/PWGUD/Tasks/upcRhoFAnalysis.cxx b/PWGUD/Tasks/upcRhoFAnalysis.cxx index f55b3acf34f..f1fcbdd02ca 100644 --- a/PWGUD/Tasks/upcRhoFAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoFAnalysis.cxx @@ -10,7 +10,6 @@ // or submit itself to any jurisdiction. /// /// \brief Task for analysis of rho' in UPCs using UD tables (from SG producer). - /// \author Cesar Ramirez, cesar.ramirez@cern.ch #include "Framework/AnalysisTask.h" @@ -33,14 +32,11 @@ using FullUDSgCollision = soa::Join; - namespace o2::aod { namespace fourpi { - - //for event DECLARE_SOA_COLUMN(RunNumber, runNumber, int32_t); @@ -77,13 +73,10 @@ DECLARE_SOA_COLUMN(TimeFDDC, timeFDDC, float); //DECLARE_SOA_COLUMN(TrackEta, trackEta, std::vector); //DECLARE_SOA_COLUMN(TrackPhi, trackPhi, std::vector); - - } // namespace fourpi DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", fourpi::RunNumber, fourpi::M, fourpi::Pt, fourpi::Eta, fourpi::Phi, fourpi::PosX, fourpi::PosY, fourpi::PosZ, fourpi::TotalCharge, fourpi::TotalFT0AmplitudeA, fourpi::TotalFT0AmplitudeC, fourpi::TotalFV0AmplitudeA, - fourpi::TotalFDDAmplitudeA, fourpi::TotalFDDAmplitudeC, - fourpi::TimeFT0A, fourpi::TimeFT0C, fourpi::TimeFV0A, fourpi::TimeFDDA, fourpi::TimeFDDC); + fourpi::TotalFDDAmplitudeA, fourpi::TotalFDDAmplitudeC, fourpi::TimeFT0A, fourpi::TimeFT0C, fourpi::TimeFV0A, fourpi::TimeFDDA, fourpi::TimeFDDC); } // namespace o2::aod struct upcRhoFAnalysis { @@ -287,8 +280,8 @@ struct upcRhoFAnalysis { systemTree(collision.runNumber(), mass, pT, rapidity, systemPhi, collision.posX(), collision.posY(), collision.posZ(), totalCharge, - collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.timeFV0A(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), - collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC()); + collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.timeFV0A(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), + collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC()); //registry.fill(HIST("4pi/hM"), mass); //registry.fill(HIST("4pi/hPt"), pT); From 3e3878314caef7e0ab1fa75932885645214b4040 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Wed, 5 Feb 2025 14:12:29 -0600 Subject: [PATCH 0020/1650] My first changes --- PWGUD/Tasks/upcRhoFAnalysis.cxx | 59 +++++++++++++++------------------ 1 file changed, 26 insertions(+), 33 deletions(-) diff --git a/PWGUD/Tasks/upcRhoFAnalysis.cxx b/PWGUD/Tasks/upcRhoFAnalysis.cxx index f1fcbdd02ca..1817f8ef37e 100644 --- a/PWGUD/Tasks/upcRhoFAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoFAnalysis.cxx @@ -31,30 +31,29 @@ using namespace o2::framework::expressions; using FullUDSgCollision = soa::Join::iterator; using FullUDTracks = soa::Join; - namespace o2::aod { namespace fourpi { -//for event +// for event DECLARE_SOA_COLUMN(RunNumber, runNumber, int32_t); -//for Rhos +// for Rhos DECLARE_SOA_COLUMN(M, m, double); DECLARE_SOA_COLUMN(Pt, pt, double); DECLARE_SOA_COLUMN(Eta, eta, double); DECLARE_SOA_COLUMN(Phi, phi, double); -//for vertex +// for vertex DECLARE_SOA_COLUMN(PosX, posX, double); DECLARE_SOA_COLUMN(PosY, posY, double); DECLARE_SOA_COLUMN(PosZ, posZ, double); -//for other +// for other DECLARE_SOA_COLUMN(TotalCharge, totalCharge, int); -//info Detec +// info Detec DECLARE_SOA_COLUMN(TotalFT0AmplitudeA, totalFT0AmplitudeA, float); DECLARE_SOA_COLUMN(TotalFT0AmplitudeC, totalFT0AmplitudeC, float); DECLARE_SOA_COLUMN(TotalFV0AmplitudeA, totalFV0AmplitudeA, float); @@ -66,12 +65,12 @@ DECLARE_SOA_COLUMN(TimeFV0A, timeFV0A, float); DECLARE_SOA_COLUMN(TimeFDDA, timeFDDA, float); DECLARE_SOA_COLUMN(TimeFDDC, timeFDDC, float); -//for pion tracks -//DECLARE_SOA_COLUMN(TrackSign, trackSign, std::vector); -//DECLARE_SOA_COLUMN(TrackM, trackM, std::vector); -//DECLARE_SOA_COLUMN(TrackPt, trackPt, std::vector); -//DECLARE_SOA_COLUMN(TrackEta, trackEta, std::vector); -//DECLARE_SOA_COLUMN(TrackPhi, trackPhi, std::vector); +// for pion tracks +// DECLARE_SOA_COLUMN(TrackSign, trackSign, std::vector); +// DECLARE_SOA_COLUMN(TrackM, trackM, std::vector); +// DECLARE_SOA_COLUMN(TrackPt, trackPt, std::vector); +// DECLARE_SOA_COLUMN(TrackEta, trackEta, std::vector); +// DECLARE_SOA_COLUMN(TrackPhi, trackPhi, std::vector); } // namespace fourpi DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", fourpi::RunNumber, fourpi::M, fourpi::Pt, fourpi::Eta, fourpi::Phi, @@ -80,7 +79,7 @@ DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", fourpi::RunNumber, fourpi::M, } // namespace o2::aod struct upcRhoFAnalysis { - ProducessystemTree; + Produces systemTree; double PcEtaCut = 0.9; // physics coordination recommendation @@ -120,10 +119,10 @@ struct upcRhoFAnalysis { std::vector selectionCounterLabels = {"all tracks", "PV contributor", "ITS + TPC hit", "TOF requirement", "DCA cut", "#eta cut", "2D TPC n#sigma_{#pi} cut"}; // 4PI SYSTEM - //registry.add("4pi/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); - //registry.add("4pi/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - //registry.add("4pi/hEta", ";Eta (1);counts", kTH1D, {etaAxis}); - //registry.add("4pi/hPhi", ";Phi ();counts", kTH1D, {phiAxis}); + // registry.add("4pi/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); + // registry.add("4pi/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); + // registry.add("4pi/hEta", ";Eta (1);counts", kTH1D, {etaAxis}); + // registry.add("4pi/hPhi", ";Phi ();counts", kTH1D, {phiAxis}); } template @@ -230,7 +229,6 @@ struct upcRhoFAnalysis { void processReco(FullUDSgCollision const& collision, FullUDTracks const& tracks) { - if (!collisionPassesCuts(collision)) return; @@ -252,17 +250,14 @@ struct upcRhoFAnalysis { int trackCounter = 0; for (const auto& track : tracks) { - if (!trackPassesCuts(track)) continue; trackCounter++; cutTracks.push_back(track); cutTracks4Vecs.push_back(ROOT::Math::PxPyPzMVector(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged)); // apriori assume pion mass - } - if (!tracksPassPiPID(cutTracks)) return; // reonstruct system and calculate total charge, save commonly used values into variables @@ -275,20 +270,18 @@ struct upcRhoFAnalysis { double rapidity = system.Rapidity(); double systemPhi = system.Phi() + o2::constants::math::PI; - if (nTracks == 4 && tracksTotalCharge(cutTracks) == 0) { // 4pi system - systemTree(collision.runNumber(), mass, pT, rapidity, systemPhi, collision.posX(), collision.posY(), collision.posZ(), totalCharge, - collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.timeFV0A(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), - collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC()); - - //registry.fill(HIST("4pi/hM"), mass); - //registry.fill(HIST("4pi/hPt"), pT); - //registry.fill(HIST("4pi/hEta"), rapiditiy); - //registry.fill(HIST("4pi/hPhi"), system); - } - //std::cout<<"Hello World"<(cfgc)}; -} \ No newline at end of file +} From 6f66b3388fec8779ae35c5664e79ff9e0314a014 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Wed, 5 Feb 2025 14:25:05 -0600 Subject: [PATCH 0021/1650] My first changes --- PWGUD/Tasks/CMakeLists.txt | 2 +- PWGUD/Tasks/upcRhoFAnalysis.cxx | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/PWGUD/Tasks/CMakeLists.txt b/PWGUD/Tasks/CMakeLists.txt index 12dfebdc812..433fc8500b4 100644 --- a/PWGUD/Tasks/CMakeLists.txt +++ b/PWGUD/Tasks/CMakeLists.txt @@ -207,7 +207,7 @@ o2physics_add_dpl_workflow(upc-rho-analysis SOURCES upcRhoAnalysis.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGPIDSelector COMPONENT_NAME Analysis) - + o2physics_add_dpl_workflow(upc-rho-f-analysis SOURCES upcRhoFAnalysis.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGPIDSelector diff --git a/PWGUD/Tasks/upcRhoFAnalysis.cxx b/PWGUD/Tasks/upcRhoFAnalysis.cxx index 1817f8ef37e..fed2790259b 100644 --- a/PWGUD/Tasks/upcRhoFAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoFAnalysis.cxx @@ -12,10 +12,15 @@ /// \brief Task for analysis of rho' in UPCs using UD tables (from SG producer). /// \author Cesar Ramirez, cesar.ramirez@cern.ch +#include // Para std::string +#include // Para std::vector + + #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "Framework/runDataProcessing.h" + #include "Math/Vector4D.h" // similiar to TLorentzVector (which is now legacy apparently) #include "random" From aeba94e8bd4e077a64397e2eb8dc517d5d04aaf0 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Wed, 5 Feb 2025 14:30:35 -0600 Subject: [PATCH 0022/1650] My first changes --- PWGUD/Tasks/CMakeLists.txt | 2 +- PWGUD/Tasks/upcRhoFAnalysis.cxx | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/PWGUD/Tasks/CMakeLists.txt b/PWGUD/Tasks/CMakeLists.txt index 433fc8500b4..c536b4b359e 100644 --- a/PWGUD/Tasks/CMakeLists.txt +++ b/PWGUD/Tasks/CMakeLists.txt @@ -207,7 +207,7 @@ o2physics_add_dpl_workflow(upc-rho-analysis SOURCES upcRhoAnalysis.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGPIDSelector COMPONENT_NAME Analysis) - + o2physics_add_dpl_workflow(upc-rho-f-analysis SOURCES upcRhoFAnalysis.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGPIDSelector diff --git a/PWGUD/Tasks/upcRhoFAnalysis.cxx b/PWGUD/Tasks/upcRhoFAnalysis.cxx index fed2790259b..1ea24a7203e 100644 --- a/PWGUD/Tasks/upcRhoFAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoFAnalysis.cxx @@ -12,15 +12,13 @@ /// \brief Task for analysis of rho' in UPCs using UD tables (from SG producer). /// \author Cesar Ramirez, cesar.ramirez@cern.ch -#include // Para std::string -#include // Para std::vector - +#include // Para std::string +#include // Para std::vector #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "Framework/runDataProcessing.h" - #include "Math/Vector4D.h" // similiar to TLorentzVector (which is now legacy apparently) #include "random" From ec46707049101f24c3955ce2f42f616ce4397c70 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Thu, 6 Feb 2025 10:49:48 -0600 Subject: [PATCH 0023/1650] My first changes --- PWGUD/Tasks/upcRhoFAnalysis.cxx | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/PWGUD/Tasks/upcRhoFAnalysis.cxx b/PWGUD/Tasks/upcRhoFAnalysis.cxx index 1ea24a7203e..42de113c5ef 100644 --- a/PWGUD/Tasks/upcRhoFAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoFAnalysis.cxx @@ -236,17 +236,6 @@ struct upcRhoFAnalysis { if (!collisionPassesCuts(collision)) return; - // event tagging - bool XnXn = false, OnOn = false, XnOn = false, OnXn = false; // note: On == 0n... - if (collision.energyCommonZNA() < ZNcommonEnergyCut && collision.energyCommonZNC() < ZNcommonEnergyCut) - OnOn = true; - if (collision.energyCommonZNA() > ZNcommonEnergyCut && std::abs(collision.timeZNA()) < ZNtimeCut && - collision.energyCommonZNC() > ZNcommonEnergyCut && std::abs(collision.timeZNC()) < ZNtimeCut) - XnXn = true; - if (collision.energyCommonZNA() > ZNcommonEnergyCut && std::abs(collision.timeZNA()) < ZNtimeCut && collision.energyCommonZNC() < ZNcommonEnergyCut) - XnOn = true; - if (collision.energyCommonZNA() < ZNcommonEnergyCut && collision.energyCommonZNC() > ZNcommonEnergyCut && std::abs(collision.timeZNC()) < ZNtimeCut) - OnXn = true; // vectors for storing selected tracks and their 4-vectors std::vector cutTracks; std::vector cutTracks4Vecs; @@ -269,7 +258,7 @@ struct upcRhoFAnalysis { int nTracks = cutTracks.size(); double mass = system.M(); double pT = system.Pt(); - double pTsquare = pT * pT; + //double pTsquare = pT * pT; double rapidity = system.Rapidity(); double systemPhi = system.Phi() + o2::constants::math::PI; From c6bb49fc5183f5a054983456d7edbfddb393cf27 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Thu, 6 Feb 2025 10:52:05 -0600 Subject: [PATCH 0024/1650] My first changes --- PWGUD/Tasks/upcRhoFAnalysis.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGUD/Tasks/upcRhoFAnalysis.cxx b/PWGUD/Tasks/upcRhoFAnalysis.cxx index 42de113c5ef..baccbd63125 100644 --- a/PWGUD/Tasks/upcRhoFAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoFAnalysis.cxx @@ -258,7 +258,7 @@ struct upcRhoFAnalysis { int nTracks = cutTracks.size(); double mass = system.M(); double pT = system.Pt(); - //double pTsquare = pT * pT; + // double pTsquare = pT * pT; double rapidity = system.Rapidity(); double systemPhi = system.Phi() + o2::constants::math::PI; From 741d3987e3ca87912c23afc35b90c3e5cd210c0c Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Fri, 7 Feb 2025 09:02:11 -0600 Subject: [PATCH 0025/1650] Rename the task and remove unused variables --- PWGUD/Tasks/CMakeLists.txt | 4 ++-- .../{upcRhoFAnalysis.cxx => upcRhoPrimeAnalysis.cxx} | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) rename PWGUD/Tasks/{upcRhoFAnalysis.cxx => upcRhoPrimeAnalysis.cxx} (98%) diff --git a/PWGUD/Tasks/CMakeLists.txt b/PWGUD/Tasks/CMakeLists.txt index c536b4b359e..a6a10b5e7b8 100644 --- a/PWGUD/Tasks/CMakeLists.txt +++ b/PWGUD/Tasks/CMakeLists.txt @@ -208,8 +208,8 @@ o2physics_add_dpl_workflow(upc-rho-analysis PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGPIDSelector COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(upc-rho-f-analysis - SOURCES upcRhoFAnalysis.cxx +o2physics_add_dpl_workflow(upc-rho-prime-analysis + SOURCES upcRhoPrimeAnalysis.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGPIDSelector COMPONENT_NAME Analysis) diff --git a/PWGUD/Tasks/upcRhoFAnalysis.cxx b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx similarity index 98% rename from PWGUD/Tasks/upcRhoFAnalysis.cxx rename to PWGUD/Tasks/upcRhoPrimeAnalysis.cxx index baccbd63125..40de174a3ea 100644 --- a/PWGUD/Tasks/upcRhoFAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx @@ -81,7 +81,7 @@ DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", fourpi::RunNumber, fourpi::M, fourpi::TotalFDDAmplitudeA, fourpi::TotalFDDAmplitudeC, fourpi::TimeFT0A, fourpi::TimeFT0C, fourpi::TimeFV0A, fourpi::TimeFDDA, fourpi::TimeFDDC); } // namespace o2::aod -struct upcRhoFAnalysis { +struct upcRhoPrimeAnalysis { Produces systemTree; double PcEtaCut = 0.9; // physics coordination recommendation @@ -240,12 +240,12 @@ struct upcRhoFAnalysis { std::vector cutTracks; std::vector cutTracks4Vecs; - int trackCounter = 0; + // int trackCounter = 0; for (const auto& track : tracks) { if (!trackPassesCuts(track)) continue; - trackCounter++; + // trackCounter++; cutTracks.push_back(track); cutTracks4Vecs.push_back(ROOT::Math::PxPyPzMVector(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged)); // apriori assume pion mass } @@ -275,11 +275,11 @@ struct upcRhoFAnalysis { } // std::cout<<"Hello World"<(cfgc)}; + o2::framework::adaptAnalysisTask(cfgc)}; } From 42f502b5c9c5a793d66b7162fffeaf39a432a424 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Tue, 18 Mar 2025 07:23:57 -0600 Subject: [PATCH 0026/1650] new variables --- PWGUD/Tasks/upcRhoPrimeAnalysis.cxx | 70 ++++++++++++++++++++++++----- 1 file changed, 60 insertions(+), 10 deletions(-) diff --git a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx index 40de174a3ea..bbb56c898ad 100644 --- a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx @@ -42,7 +42,7 @@ namespace fourpi // for event DECLARE_SOA_COLUMN(RunNumber, runNumber, int32_t); -// for Rhos +// for rho prime DECLARE_SOA_COLUMN(M, m, double); DECLARE_SOA_COLUMN(Pt, pt, double); DECLARE_SOA_COLUMN(Eta, eta, double); @@ -56,7 +56,7 @@ DECLARE_SOA_COLUMN(PosZ, posZ, double); // for other DECLARE_SOA_COLUMN(TotalCharge, totalCharge, int); -// info Detec +// info detec DECLARE_SOA_COLUMN(TotalFT0AmplitudeA, totalFT0AmplitudeA, float); DECLARE_SOA_COLUMN(TotalFT0AmplitudeC, totalFT0AmplitudeC, float); DECLARE_SOA_COLUMN(TotalFV0AmplitudeA, totalFV0AmplitudeA, float); @@ -69,16 +69,32 @@ DECLARE_SOA_COLUMN(TimeFDDA, timeFDDA, float); DECLARE_SOA_COLUMN(TimeFDDC, timeFDDC, float); // for pion tracks -// DECLARE_SOA_COLUMN(TrackSign, trackSign, std::vector); -// DECLARE_SOA_COLUMN(TrackM, trackM, std::vector); -// DECLARE_SOA_COLUMN(TrackPt, trackPt, std::vector); -// DECLARE_SOA_COLUMN(TrackEta, trackEta, std::vector); -// DECLARE_SOA_COLUMN(TrackPhi, trackPhi, std::vector); +DECLARE_SOA_COLUMN(NumContrib, numContrib, int32_t); +DECLARE_SOA_COLUMN(Sign, sign, std::vector); +DECLARE_SOA_COLUMN(TrackPt, trackPt, std::vector); +DECLARE_SOA_COLUMN(TrackEta, trackEta, std::vector); +DECLARE_SOA_COLUMN(TrackPhi, trackPhi, std::vector); +DECLARE_SOA_COLUMN(TPCNSigmaEl, tpcNSigmaEl, std::vector); +DECLARE_SOA_COLUMN(TPCNSigmaPi, tpcNSigmaPi, std::vector); +DECLARE_SOA_COLUMN(TPCNSigmaKa, tpcNSigmaKa, std::vector); +DECLARE_SOA_COLUMN(TPCNSigmaPr, tpcNSigmaPr, std::vector); +DECLARE_SOA_COLUMN(TrackID, trackID, std::vector); + +// for others +DECLARE_SOA_COLUMN(IsReconstructedWithUPC, isReconstructedWithUPC, bool); +DECLARE_SOA_COLUMN(TimeZNA, timeZNA, float); +DECLARE_SOA_COLUMN(TimeZNC, timeZNC, float); +DECLARE_SOA_COLUMN(EnergyCommonZNA, energyCommonZNA, float); +DECLARE_SOA_COLUMN(EnergyCommonZNC, energyCommonZNC, float); } // namespace fourpi + DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", fourpi::RunNumber, fourpi::M, fourpi::Pt, fourpi::Eta, fourpi::Phi, fourpi::PosX, fourpi::PosY, fourpi::PosZ, fourpi::TotalCharge, fourpi::TotalFT0AmplitudeA, fourpi::TotalFT0AmplitudeC, fourpi::TotalFV0AmplitudeA, - fourpi::TotalFDDAmplitudeA, fourpi::TotalFDDAmplitudeC, fourpi::TimeFT0A, fourpi::TimeFT0C, fourpi::TimeFV0A, fourpi::TimeFDDA, fourpi::TimeFDDC); + fourpi::TotalFDDAmplitudeA, fourpi::TotalFDDAmplitudeC, fourpi::TimeFT0A, fourpi::TimeFT0C, fourpi::TimeFV0A, fourpi::TimeFDDA, fourpi::TimeFDDC, + fourpi::NumContrib, fourpi::Sign, fourpi::TrackPt, fourpi::TrackEta, fourpi::TrackPhi, + fourpi::TPCNSigmaEl, fourpi::TPCNSigmaPi, fourpi::TPCNSigmaKa, fourpi::TPCNSigmaPr, fourpi::TrackID, fourpi::IsReconstructedWithUPC, + fourpi::TimeZNA, fourpi::TimeZNC, fourpi::EnergyCommonZNA, fourpi::EnergyCommonZNC); } // namespace o2::aod struct upcRhoPrimeAnalysis { @@ -264,9 +280,43 @@ struct upcRhoPrimeAnalysis { if (nTracks == 4 && tracksTotalCharge(cutTracks) == 0) { // 4pi system + // Informacion de cada traza + std::vector vTrackPt, vTrackEta, vTrackPhi; + std::vector vSign, vTrackID; + std::vector vTpcNSigmaEl, vTpcNSigmaPi, vTpcNSigmaKa, vTpcNSigmaPr; + + for (size_t i = 0; i < cutTracks.size(); i++) { + + double tPt = cutTracks[i].pt(); + double tEta = eta(cutTracks[i].px(), cutTracks[i].py(), cutTracks[i].pz()); + double tPhi = phi(cutTracks[i].px(), cutTracks[i].py()); + + vTrackPt.push_back(tPt); + vTrackEta.push_back(tEta); + vTrackPhi.push_back(tPhi); + vSign.push_back(cutTracks[i].sign()); + vTpcNSigmaEl.push_back(cutTracks[i].tpcNSigmaEl()); + vTpcNSigmaPi.push_back(cutTracks[i].tpcNSigmaPi()); + vTpcNSigmaKa.push_back(cutTracks[i].tpcNSigmaKa()); + vTpcNSigmaPr.push_back(cutTracks[i].tpcNSigmaPr()); + + // ID de la traza + vTrackID.push_back(i); + } + + bool isReconstructedWithUPC = false; + + if (collision.flags() == 1) { + isReconstructedWithUPC = true; + } else { + isReconstructedWithUPC = false; + } + systemTree(collision.runNumber(), mass, pT, rapidity, systemPhi, collision.posX(), collision.posY(), collision.posZ(), totalCharge, collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.timeFV0A(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), - collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC()); + collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC(), + collision.numContrib(), vSign, vTrackPt, vTrackEta, vTrackPhi, vTpcNSigmaEl, vTpcNSigmaPi, vTpcNSigmaKa, vTpcNSigmaPr, vTrackID, isReconstructedWithUPC, + collision.timeZNA(), collision.timeZNC(), collision.energyCommonZNA(), collision.energyCommonZNC()); // registry.fill(HIST("4pi/hM"), mass); // registry.fill(HIST("4pi/hPt"), pT); @@ -282,4 +332,4 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ o2::framework::adaptAnalysisTask(cfgc)}; -} +} \ No newline at end of file From 930e4c751092f034f22e13f543f505024d45eea8 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Tue, 18 Mar 2025 07:38:08 -0600 Subject: [PATCH 0027/1650] new variables --- PWGUD/Tasks/upcRhoPrimeAnalysis.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx index bbb56c898ad..812c77ad794 100644 --- a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx @@ -332,4 +332,4 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ o2::framework::adaptAnalysisTask(cfgc)}; -} \ No newline at end of file +} From 804b18c91d0df2c824e061804d7022e9d8ee3257 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Tue, 18 Mar 2025 07:56:22 -0600 Subject: [PATCH 0028/1650] new variables --- PWGUD/Tasks/upcRhoPrimeAnalysis.cxx | 2 -- 1 file changed, 2 deletions(-) diff --git a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx index 812c77ad794..64559cc10dd 100644 --- a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx @@ -280,7 +280,6 @@ struct upcRhoPrimeAnalysis { if (nTracks == 4 && tracksTotalCharge(cutTracks) == 0) { // 4pi system - // Informacion de cada traza std::vector vTrackPt, vTrackEta, vTrackPhi; std::vector vSign, vTrackID; std::vector vTpcNSigmaEl, vTpcNSigmaPi, vTpcNSigmaKa, vTpcNSigmaPr; @@ -300,7 +299,6 @@ struct upcRhoPrimeAnalysis { vTpcNSigmaKa.push_back(cutTracks[i].tpcNSigmaKa()); vTpcNSigmaPr.push_back(cutTracks[i].tpcNSigmaPr()); - // ID de la traza vTrackID.push_back(i); } From 6a690ad5a72000fdad8010775288285b4d3f9d20 Mon Sep 17 00:00:00 2001 From: Yuanjing Ji Date: Tue, 4 Feb 2025 20:01:34 +0100 Subject: [PATCH 0029/1650] [PWGDQ] Pjpsi femto (#9518) Co-authored-by: Yuanjing Ji --- PWGDQ/Core/CutsLibrary.cxx | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/PWGDQ/Core/CutsLibrary.cxx b/PWGDQ/Core/CutsLibrary.cxx index c1bae7da26c..677e09f54a7 100644 --- a/PWGDQ/Core/CutsLibrary.cxx +++ b/PWGDQ/Core/CutsLibrary.cxx @@ -834,6 +834,17 @@ AnalysisCompositeCut* o2::aod::dqcuts::GetCompositeCut(const char* cutName) return cut; } + if (!nameStr.compare("protonPIDPV")) { + cut->AddCut(GetAnalysisCut("protonPID_TPCnTOF2")); + cut->AddCut(GetAnalysisCut("protonPVcut")); + return cut; + } + + if (!nameStr.compare("protonPIDPV2")) { + cut->AddCut(GetAnalysisCut("protonPID_TPCnTOF2")); + return cut; + } + if (!nameStr.compare("PrimaryTrack_DCAz")) { cut->AddCut(GetAnalysisCut("PrimaryTrack_DCAz")); return cut; @@ -4539,6 +4550,17 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) return cut; } + if (!nameStr.compare("protonPVcut")) { + cut->AddCut(VarManager::kTrackDCAxy, -0.1, 0.1); + cut->AddCut(VarManager::kTrackDCAz, -0.15, 0.15); + cut->AddCut(VarManager::kPt, 0.4, 3); + cut->AddCut(VarManager::kEta, -0.9, 0.9); + cut->AddCut(VarManager::kIsSPDany, 0.5, 1.5); + cut->AddCut(VarManager::kTPCchi2, 0.0, 4.0); + cut->AddCut(VarManager::kTPCncls, 80, 161.); + return cut; + } + if (!nameStr.compare("pidbasic")) { cut->AddCut(VarManager::kEta, -0.9, 0.9); cut->AddCut(VarManager::kTPCncls, 60, 161.); @@ -5468,6 +5490,11 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) return cut; } + if (!nameStr.compare("protonPID_TPCnTOF2")) { + cut->AddCut(VarManager::kTPCnSigmaPr, -2.5, 2.5); + return cut; + } + if (!nameStr.compare("tpc_pion_rejection")) { TF1* f1maxPi = new TF1("f1maxPi", "[0]+[1]*x", 0, 10); f1maxPi->SetParameters(85, -50); From 33bd422adda7eedd4feda7e187d5f7053d83f062 Mon Sep 17 00:00:00 2001 From: dajones2 <140733426+dajones2@users.noreply.github.com> Date: Tue, 4 Feb 2025 19:17:03 +0000 Subject: [PATCH 0030/1650] [PWGJE] Changing some default configurable options (#9736) --- PWGJE/Tasks/jetHadronRecoil.cxx | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/PWGJE/Tasks/jetHadronRecoil.cxx b/PWGJE/Tasks/jetHadronRecoil.cxx index 8ce6f92d62f..a1633992bea 100644 --- a/PWGJE/Tasks/jetHadronRecoil.cxx +++ b/PWGJE/Tasks/jetHadronRecoil.cxx @@ -60,9 +60,9 @@ struct JetHadronRecoil { Configurable ptTTrefMax{"ptTTrefMax", 7, "reference maximum trigger track pt"}; Configurable ptTTsigMin{"ptTTsigMin", 20, "signal minimum trigger track pt"}; Configurable ptTTsigMax{"ptTTsigMax", 50, "signal maximum trigger track pt"}; - Configurable fracSig{"fracSig", 0.5, "fraction of events to use for signal"}; + Configurable fracSig{"fracSig", 0.9, "fraction of events to use for signal"}; Configurable jetR{"jetR", 0.4, "jet resolution parameter"}; - Configurable pTHatExponent{"pTHatExponent", 6.0, "exponent of the event weight for the calculation of pTHat"}; + Configurable pTHatExponent{"pTHatExponent", 4.0, "exponent of the event weight for the calculation of pTHat"}; Configurable pTHatMaxMCD{"pTHatMaxMCD", 999.0, "maximum fraction of hard scattering for jet acceptance in detector MC"}; Configurable pTHatMaxMCP{"pTHatMaxMCP", 999.0, "maximum fraction of hard scattering for jet acceptance in particle MC"}; Configurable triggerMasks{"triggerMasks", "", "possible JE Trigger masks: fJetChLowPt,fJetChHighPt,fTrackLowPt,fTrackHighPt,fJetD0ChLowPt,fJetD0ChHighPt,fJetLcChLowPt,fJetLcChHighPt,fEMCALReadout,fJetFullHighPt,fJetFullLowPt,fJetNeutralHighPt,fJetNeutralLowPt,fGammaVeryHighPtEMCAL,fGammaVeryHighPtDCAL,fGammaHighPtEMCAL,fGammaHighPtDCAL,fGammaLowPtEMCAL,fGammaLowPtDCAL,fGammaVeryLowPtEMCAL,fGammaVeryLowPtDCAL"}; @@ -196,12 +196,10 @@ struct JetHadronRecoil { phiTT = phiTTAr[trigNumber]; if (isSigCol) { registry.fill(HIST("hNtrig"), 1.5, weight); - registry.fill(HIST("hJetSignalMultiplicity"), jets.size(), weight); registry.fill(HIST("hSigEventTriggers"), nTT, weight); } if (!isSigCol) { registry.fill(HIST("hNtrig"), 0.5, weight); - registry.fill(HIST("hJetReferenceMultiplicity"), jets.size(), weight); registry.fill(HIST("hRefEventTriggers"), nTT, weight); } } @@ -303,12 +301,10 @@ struct JetHadronRecoil { phiTT = phiTTAr[trigNumber]; if (isSigCol) { registry.fill(HIST("hNtrig"), 1.5, weight); - registry.fill(HIST("hJetSignalMultiplicity"), jets.size(), weight); registry.fill(HIST("hSigEventTriggers"), nTT, weight); } if (!isSigCol) { registry.fill(HIST("hNtrig"), 0.5, weight); - registry.fill(HIST("hJetReferenceMultiplicity"), jets.size(), weight); registry.fill(HIST("hRefEventTriggers"), nTT, weight); } } From 31c3a1f5fdf730335e7b206da0d7f7f0c8b1148b Mon Sep 17 00:00:00 2001 From: Pritam Chakraborty <47203359+prchakra@users.noreply.github.com> Date: Tue, 4 Feb 2025 20:39:19 +0100 Subject: [PATCH 0031/1650] [PWGCF] FemtoUniverse: Fixing control histogram for fraction of hared TPCncls (#9743) Co-authored-by: ALICE Action Bot --- PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h | 4 ++-- PWGCF/FemtoUniverse/Core/FemtoUniverseTrackSelection.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h index 6650292be69..9061eff1648 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h @@ -79,7 +79,7 @@ class FemtoUniverseParticleHisto mHistogramRegistry->add((folderName + folderSuffix + "/hTPCcrossedRows").c_str(), "; TPC crossed rows; Entries", kTH1F, {{163, -0.5, 162.5}}); mHistogramRegistry->add((folderName + folderSuffix + "/hTPCfindableVsCrossed").c_str(), ";TPC findable clusters ; TPC crossed rows;", kTH2F, {{163, -0.5, 162.5}, {163, -0.5, 162.5}}); mHistogramRegistry->add((folderName + folderSuffix + "/hTPCshared").c_str(), "; TPC shared clusters; Entries", kTH1F, {{163, -0.5, 162.5}}); - mHistogramRegistry->add((folderName + folderSuffix + "/hTPCsharedFrac").c_str(), "; TPC fraction of shared clusters; Entries", kTH1F, {{100, 0.0, 100.0}}); + mHistogramRegistry->add((folderName + folderSuffix + "/hTPCfractionSharedCls").c_str(), "; TPC fraction of shared clusters; Entries", kTH1F, {{100, 0.0, 100.0}}); mHistogramRegistry->add((folderName + folderSuffix + "/hITSclusters").c_str(), "; ITS clusters; Entries", kTH1F, {{10, -0.5, 9.5}}); mHistogramRegistry->add((folderName + folderSuffix + "/hITSclustersIB").c_str(), "; ITS clusters in IB; Entries", kTH1F, {{10, -0.5, 9.5}}); mHistogramRegistry->add((folderName + folderSuffix + "/hDCAz").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{z} (cm)", kTH2F, {{100, 0, 10}, {500, -5, 5}}); @@ -252,7 +252,7 @@ class FemtoUniverseParticleHisto mHistogramRegistry->fill(histFolder + HIST(o2::aod::femtouniverse_mc_particle::MCTypeName[mc]) + HIST("/hTPCcrossedRows"), part.tpcNClsCrossedRows()); mHistogramRegistry->fill(histFolder + HIST(o2::aod::femtouniverse_mc_particle::MCTypeName[mc]) + HIST("/hTPCfindableVsCrossed"), part.tpcNClsFindable(), part.tpcNClsCrossedRows()); mHistogramRegistry->fill(histFolder + HIST(o2::aod::femtouniverse_mc_particle::MCTypeName[mc]) + HIST("/hTPCshared"), part.tpcNClsShared()); - mHistogramRegistry->fill(histFolder + HIST(o2::aod::femtouniverse_mc_particle::MCTypeName[mc]) + HIST("/hTPCsharedFrac"), part.tpcFractionSharedCls()); + mHistogramRegistry->fill(histFolder + HIST(o2::aod::femtouniverse_mc_particle::MCTypeName[mc]) + HIST("/hTPCfractionSharedCls"), part.tpcFractionSharedCls()); mHistogramRegistry->fill(histFolder + HIST(o2::aod::femtouniverse_mc_particle::MCTypeName[mc]) + HIST("/hITSclusters"), part.itsNCls()); mHistogramRegistry->fill(histFolder + HIST(o2::aod::femtouniverse_mc_particle::MCTypeName[mc]) + HIST("/hITSclustersIB"), part.itsNClsInnerBarrel()); mHistogramRegistry->fill(histFolder + HIST(o2::aod::femtouniverse_mc_particle::MCTypeName[mc]) + HIST("/hDCAz"), part.pt(), part.dcaZ()); diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseTrackSelection.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseTrackSelection.h index 409af22f698..b94a8f85650 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseTrackSelection.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseTrackSelection.h @@ -318,7 +318,7 @@ void FemtoUniverseTrackSelection::init(HistogramRegistry* registry) mHistogramRegistry->add((folderName + "/hTPCcrossedRows").c_str(), "; TPC crossed rows; Entries", kTH1F, {{163, 0, 163}}); mHistogramRegistry->add((folderName + "/hTPCfindableVsCrossed").c_str(), ";TPC findable clusters ; TPC crossed rows;", kTH2F, {{163, 0, 163}, {163, 0, 163}}); mHistogramRegistry->add((folderName + "/hTPCshared").c_str(), "; TPC shared clusters; Entries", kTH1F, {{163, -0.5, 162.5}}); - mHistogramRegistry->add((folderName + "/hTPCfracshared").c_str(), "; TPC fraction of shared clusters; Entries", kTH1F, {{100, 0.0, 100.0}}); + mHistogramRegistry->add((folderName + "/hTPCfractionSharedCls").c_str(), "; TPC fraction of shared clusters; Entries", kTH1F, {{100, 0.0, 100.0}}); mHistogramRegistry->add((folderName + "/hITSclusters").c_str(), "; ITS clusters; Entries", kTH1F, {{10, -0.5, 9.5}}); mHistogramRegistry->add((folderName + "/hITSclustersIB").c_str(), "; ITS clusters in IB; Entries", kTH1F, {{10, -0.5, 9.5}}); mHistogramRegistry->add((folderName + "/hDCAxy").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {{100, 0, 10}, {500, -5, 5}}); From 7f9f10a85bc47cdb328f5043661abbed648657f3 Mon Sep 17 00:00:00 2001 From: Sigurd Nese <32108009+sigurdnese@users.noreply.github.com> Date: Tue, 4 Feb 2025 20:48:28 +0100 Subject: [PATCH 0032/1650] [PWGDQ] Add functionality of JSON formatted strings for cuts to AsymmetricPairing (#9741) --- PWGDQ/Tasks/tableReader_withAssoc.cxx | 37 +++++++++++++++++++-------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/PWGDQ/Tasks/tableReader_withAssoc.cxx b/PWGDQ/Tasks/tableReader_withAssoc.cxx index 4e651f0644e..5ef43dc909c 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.cxx +++ b/PWGDQ/Tasks/tableReader_withAssoc.cxx @@ -1991,6 +1991,7 @@ struct AnalysisAsymmetricPairing { Configurable fConfigLegCFilterMask{"cfgLegCFilterMask", 0, "Filter mask corresponding to cuts in track-selection"}; Configurable fConfigCommonTrackCuts{"cfgCommonTrackCuts", "", "Comma separated list of cuts to be applied to all legs"}; Configurable fConfigPairCuts{"cfgPairCuts", "", "Comma separated list of pair cuts"}; + Configurable fConfigPairCutsJSON{"cfgPairCutsJSON", "", "Additional list of pair cuts in JSON format"}; Configurable fConfigSkipAmbiguousIdCombinations{"cfgSkipAmbiguousIdCombinations", true, "Choose whether to skip pairs/triples which pass a stricter combination of cuts, e.g. KKPi triplets for D+ -> KPiPi"}; Configurable fConfigHistogramSubgroups{"cfgAsymmetricPairingHistogramsSubgroups", "barrel,vertexing", "Comma separated list of asymmetric-pairing histogram subgroups"}; @@ -2013,7 +2014,7 @@ struct AnalysisAsymmetricPairing { HistogramManager* fHistMan; std::map> fTrackHistNames; - std::vector fPairCuts; + std::vector fPairCuts; // Filter masks to find legs in BarrelTrackCuts table uint32_t fLegAFilterMask; @@ -2058,13 +2059,31 @@ struct AnalysisAsymmetricPairing { if (!cutNamesStr.IsNull()) { std::unique_ptr objArray(cutNamesStr.Tokenize(",")); for (int icut = 0; icut < objArray->GetEntries(); ++icut) { - fPairCuts.push_back(*dqcuts::GetCompositeCut(objArray->At(icut)->GetName())); + fPairCuts.push_back(dqcuts::GetCompositeCut(objArray->At(icut)->GetName())); + } + } + // Extra pair cuts via JSON + TString addPairCutsStr = fConfigPairCutsJSON.value; + if (addPairCutsStr != "") { + std::vector addPairCuts = dqcuts::GetCutsFromJSON(addPairCutsStr.Data()); + for (auto& t : addPairCuts) { + fPairCuts.push_back((AnalysisCompositeCut*)t); + cutNamesStr += Form(",%s", t->GetName()); } } // Get the barrel track selection cuts string tempCuts; getTaskOptionValue(context, "analysis-track-selection", "cfgTrackCuts", tempCuts, false); TString tempCutsStr = tempCuts; + // check also the cuts added via JSON and add them to the string of cuts + getTaskOptionValue(context, "analysis-track-selection", "cfgBarrelTrackCutsJSON", tempCuts, false); + TString addTrackCutsStr = tempCuts; + if (addTrackCutsStr != "") { + std::vector addTrackCuts = dqcuts::GetCutsFromJSON(addTrackCutsStr.Data()); + for (auto& t : addTrackCuts) { + tempCutsStr += Form(",%s", t->GetName()); + } + } std::unique_ptr objArray(tempCutsStr.Tokenize(",")); // Get the common leg cuts int commonCutIdx; @@ -2164,7 +2183,6 @@ struct AnalysisAsymmetricPairing { fTrackHistNames[fNLegCuts + icut * fNCommonTrackCuts + iCommonCut] = names; } - TString cutNamesStr = fConfigPairCuts.value; if (!cutNamesStr.IsNull()) { // if pair cuts std::unique_ptr objArrayPair(cutNamesStr.Tokenize(",")); fNPairCuts = objArrayPair->GetEntries(); @@ -2431,9 +2449,9 @@ struct AnalysisAsymmetricPairing { } } } // end loop (common cuts) - for (unsigned int iPairCut = 0; iPairCut < fPairCuts.size(); iPairCut++) { - AnalysisCompositeCut cut = fPairCuts.at(iPairCut); - if (!(cut.IsSelected(VarManager::fgValues))) // apply pair cuts + int iPairCut = 0; + for (auto cut = fPairCuts.begin(); cut != fPairCuts.end(); cut++, iPairCut++) { + if (!((*cut)->IsSelected(VarManager::fgValues))) // apply pair cuts continue; pairFilter |= (static_cast(1) << iPairCut); // Histograms with pair cuts @@ -2607,11 +2625,10 @@ struct AnalysisAsymmetricPairing { fHistMan->FillHistClass(histNames[fNLegCuts + icut * fNCommonTrackCuts + iCommonCut][0].Data(), VarManager::fgValues); } } // end loop (common cuts) - for (unsigned int iPairCut = 0; iPairCut < fPairCuts.size(); iPairCut++) { - AnalysisCompositeCut cut = fPairCuts.at(iPairCut); - if (!(cut.IsSelected(VarManager::fgValues))) { // apply pair cuts + int iPairCut = 0; + for (auto cut = fPairCuts.begin(); cut != fPairCuts.end(); cut++, iPairCut++) { + if (!((*cut)->IsSelected(VarManager::fgValues))) // apply pair cuts continue; - } // Histograms with pair cuts fHistMan->FillHistClass(histNames[fNLegCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut][0].Data(), VarManager::fgValues); // Histograms with pair cuts and common track cuts From aff6d8523128ff5217d78ae45f0bd1fa47fee219 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Tue, 4 Feb 2025 21:42:47 +0100 Subject: [PATCH 0033/1650] [PWGLF] Remove pt cut from mixed event (#9749) --- PWGLF/Tasks/Resonances/highmasslambda.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PWGLF/Tasks/Resonances/highmasslambda.cxx b/PWGLF/Tasks/Resonances/highmasslambda.cxx index 69c2c3dbf73..f5a249801ea 100644 --- a/PWGLF/Tasks/Resonances/highmasslambda.cxx +++ b/PWGLF/Tasks/Resonances/highmasslambda.cxx @@ -796,9 +796,9 @@ struct highmasslambda { Proton = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massPr); Kshort = ROOT::Math::PxPyPzMVector(v0.px(), v0.py(), v0.pz(), v0.mK0Short()); Lambdac = Proton + Kshort; - if (Lambdac.Pt() > 6.0 || Lambdac.Pt() < 2.0) { - continue; - } + // if (Lambdac.Pt() > 6.0 || Lambdac.Pt() < 2.0) { + // continue; + // } if (std::abs(Lambdac.Rapidity()) > confRapidity) { continue; } From e533134168752c08b6a3b1138e85a9f12d1fe79d Mon Sep 17 00:00:00 2001 From: tutripat <73981392+tutripat@users.noreply.github.com> Date: Tue, 4 Feb 2025 21:45:49 +0100 Subject: [PATCH 0034/1650] [PWGLF] New task for MFT analysis for pp collisions (#9713) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Tulika Tripathy Co-authored-by: Nicolò Jacazio --- .../GlobalEventProperties/CMakeLists.txt | 5 + .../GlobalEventProperties/dndeta-mft-pp.cxx | 982 ++++++++++++++++++ 2 files changed, 987 insertions(+) create mode 100644 PWGLF/Tasks/GlobalEventProperties/dndeta-mft-pp.cxx diff --git a/PWGLF/Tasks/GlobalEventProperties/CMakeLists.txt b/PWGLF/Tasks/GlobalEventProperties/CMakeLists.txt index 9310cf42e95..ed61c203672 100644 --- a/PWGLF/Tasks/GlobalEventProperties/CMakeLists.txt +++ b/PWGLF/Tasks/GlobalEventProperties/CMakeLists.txt @@ -18,3 +18,8 @@ o2physics_add_dpl_workflow(ucc-zdc SOURCES heavyionMultiplicity.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(dndeta-mft-pp + SOURCES dndeta-mft-pp.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + COMPONENT_NAME Analysis) diff --git a/PWGLF/Tasks/GlobalEventProperties/dndeta-mft-pp.cxx b/PWGLF/Tasks/GlobalEventProperties/dndeta-mft-pp.cxx new file mode 100644 index 00000000000..5b67034937a --- /dev/null +++ b/PWGLF/Tasks/GlobalEventProperties/dndeta-mft-pp.cxx @@ -0,0 +1,982 @@ +// Copyright 2020-2022 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// \file dndeta-mft.cxx +// \author Sarah Herrmann +// +// \brief This code loops over MFT tracks and collisions and fills histograms +// useful to compute dNdeta + +#include +#include +#include +#include +#include +#include +#include + +#include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/Configurable.h" +#include "Framework/O2DatabasePDGPlugin.h" +#include "Framework/RuntimeError.h" +#include "Framework/runDataProcessing.h" + +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "CommonConstants/MathConstants.h" +#include "MathUtils/Utils.h" +#include "ReconstructionDataFormats/GlobalTrackID.h" +#include "TDatabasePDG.h" + +#include "PWGMM/Mult/DataModel/bestCollisionTable.h" +#include "TFile.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::aod::track; + +AxisSpec PtAxis = {1001, -0.005, 10.005}; +AxisSpec DeltaZAxis = {61, -6.1, 6.1}; +AxisSpec ZAxis = {301, -30.1, 30.1}; +AxisSpec PhiAxis = {629, 0, 2 * M_PI, "Rad", "phi axis"}; +// AxisSpec EtaAxis = {18, -4.6, -1.}; +AxisSpec DCAxyAxis = {100, -1, 10}; +AxisSpec CentAxis = {{0, 10, 20, 30, 40, 50, 60, 70, 80, 100}}; + +static constexpr TrackSelectionFlags::flagtype trackSelectionITS = + TrackSelectionFlags::kITSNCls | TrackSelectionFlags::kITSChi2NDF | + TrackSelectionFlags::kITSHits; + +static constexpr TrackSelectionFlags::flagtype trackSelectionTPC = + TrackSelectionFlags::kTPCNCls | + TrackSelectionFlags::kTPCCrossedRowsOverNCls | + TrackSelectionFlags::kTPCChi2NDF; + +static constexpr TrackSelectionFlags::flagtype trackSelectionDCA = + TrackSelectionFlags::kDCAz | TrackSelectionFlags::kDCAxy; + +using MFTTracksLabeled = soa::Join; + +struct PseudorapidityDensityMFT { + SliceCache cache; + Preslice perCol = o2::aod::fwdtrack::collisionId; + Preslice perMcCol = aod::mcparticle::mcCollisionId; + Preslice perColCentral = aod::track::collisionId; + + Service pdg; + + Configurable estimatorEta{"estimatorEta", 1.0, + "eta range for INEL>0 sample definition"}; + + Configurable useEvSel{"useEvSel", true, "use event selection"}; + ConfigurableAxis multBinning{"multBinning", {701, -0.5, 700.5}, ""}; + ConfigurableAxis EtaAxis = {"etaBinning", {18, -4.6, -1.}, ""}; + + Configurable useZDiffCut{"useZDiffCut", true, "use Z difference cut"}; + Configurable maxZDiff{ + "maxZDiff", 1.0f, + "max allowed Z difference for reconstruced collisions (cm)"}; + + Configurable usePhiCut{"usePhiCut", false, "use azimuthal angle cut"}; + Configurable cfgPhiCut{"cfgPhiCut", 0.1f, + "Cut on azimuthal angle of MFT tracks"}; + Configurable cfgVzCut1{"cfgVzCut1", -30.0f, + "Cut1 on vertex position of MFT tracks"}; + Configurable cfgVzCut2{"cfgVzCut2", 30.0f, + "Cut2 on vertex position of MFT tracks"}; + Configurable cfgnCluster{"cfgnCluster", 5.0f, + "Cut on no of clusters per MFT track"}; + Configurable cfgnEta1{"cfgnEta1", -4.5f, + "Cut on eta1"}; + Configurable cfgnEta2{"cfgnEta2", -1.0f, + "Cut on eta1"}; + HistogramRegistry registry{ + "registry", + { + {"TracksEtaZvtx", + "; #eta; #it{z}_{vtx} (cm); tracks", + {HistType::kTH2F, {EtaAxis, ZAxis}}}, // + {"Tracks/EtaZvtx_gt0", + "; #eta; #it{z}_{vtx} (cm); tracks", + {HistType::kTH2F, {EtaAxis, ZAxis}}}, // + {"TracksPhiEta", + "; #varphi; #eta; tracks", + {HistType::kTH2F, {PhiAxis, EtaAxis}}}, // + {"TracksPhiZvtx", + "; #varphi; #it{z}_{vtx} (cm); tracks", + {HistType::kTH2F, {PhiAxis, ZAxis}}}, // + {"TracksPtEta", + " ; p_{T} (GeV/c); #eta", + {HistType::kTH2F, {PtAxis, EtaAxis}}}, // + {"EventSelection", + ";status;events", + {HistType::kTH1F, {{10, 0.5, 10.5}}}}, + {"EventCounts", + ";status;events", + {HistType::kTH1F, {{2, 0.5, 2.5}}}}, + {"Tracks/Control/TrackCount", ";status;Track counts", {HistType::kTH1F, {{15, 0.5, 15.5}}}}, // added + }}; + + void init(InitContext&) + { + if (static_cast(doprocessMult) + + static_cast(doprocessMultReassoc) + + static_cast(doprocessCountingCentrality) > + 1) { + LOGP(fatal, + "Exactly one process function between processMult, " + "processMultReassoc and processCountingCentrality should be " + "enabled!"); + } + AxisSpec MultAxis = {multBinning, "N_{trk}"}; + auto hstat = registry.get(HIST("EventSelection")); + auto* x = hstat->GetXaxis(); + x->SetBinLabel(1, "All"); + x->SetBinLabel(2, "Selected"); + x->SetBinLabel(3, "Selected INEL>0"); + x->SetBinLabel(4, "Vz cut Sel INEL>0"); + x->SetBinLabel(5, "Sel INEL,INEL_fwd>0"); + x->SetBinLabel(6, "Rejected"); + x->SetBinLabel(7, "Good BCs"); + x->SetBinLabel(8, "BCs with collisions"); + x->SetBinLabel(9, "BCs with pile-up/splitting"); + registry.add({"EventsNtrkZvtx", + "; N_{trk}; #it{z}_{vtx} (cm); events", + {HistType::kTH2F, {MultAxis, ZAxis}}}); + registry.add({"EventsNtrkZvtx_gt0", + "; N_{trk}; #it{z}_{vtx} (cm); events", + {HistType::kTH2F, {MultAxis, ZAxis}}}); + registry.add({"Tracks/Control/DCAXY", + " ; DCA_{XY} (cm)", + {HistType::kTH1F, {DCAxyAxis}}}); + if (doprocessGen) { + registry.add({"EventsNtrkZvtxGen", + "; N_{trk}; #it{z}_{vtx} (cm); events", + {HistType::kTH2F, {MultAxis, ZAxis}}}); + registry.add({"EventsNtrkZvtxGen_t", + "; N_{trk}; #it{z}_{vtx} (cm); events", + {HistType::kTH2F, {MultAxis, ZAxis}}}); + registry.add({"EventsNtrkZvtxGen_gt0", + "; N_{trk}; #it{z}_{vtx} (cm); events", + {HistType::kTH2F, {MultAxis, ZAxis}}}); + registry.add({"EventsNtrkZvtxGen_gt0t", + "; N_{trk}; #it{z}_{vtx} (cm); events", + {HistType::kTH2F, {MultAxis, ZAxis}}}); + registry.add({"TracksEtaZvtxGen", + "; #eta; #it{z}_{vtx} (cm); tracks", + {HistType::kTH2F, {EtaAxis, ZAxis}}}); + registry.add({"TracksEtaZvtxGen_t", + "; #eta; #it{z}_{vtx} (cm); tracks", + {HistType::kTH2F, {EtaAxis, ZAxis}}}); + registry.add({"TracksEtaZvtxGen_gt0", + "; #eta; #it{z}_{vtx} (cm); tracks", + {HistType::kTH2F, {EtaAxis, ZAxis}}}); + registry.add({"TracksEtaZvtxGen_gt0t", + "; #eta; #it{z}_{vtx} (cm); tracks", + {HistType::kTH2F, {EtaAxis, ZAxis}}}); + registry.add({"TracksPhiEtaGen", + "; #varphi; #eta; tracks", + {HistType::kTH2F, {PhiAxis, EtaAxis}}}); + registry.add({"TracksPhiZvtxGen", + "; #varphi; #it{z}_{vtx} (cm); tracks", + {HistType::kTH2F, {PhiAxis, ZAxis}}}); // + registry.add({"TracksToPartPtEta", + " ; p_{T} (GeV/c); #eta", + {HistType::kTH2F, {PtAxis, EtaAxis}}}); // + registry.add({"TracksPtEtaGen", + " ; p_{T} (GeV/c); #eta", + {HistType::kTH2F, {PtAxis, EtaAxis}}}); + registry.add({"TracksPtEtaGen_t", + " ; p_{T} (GeV/c); #eta", + {HistType::kTH2F, {PtAxis, EtaAxis}}}); + registry.add({"EventEfficiency", + "; status; events", + {HistType::kTH1F, {{5, 0.5, 5.5}}}}); + registry.add({"NotFoundEventZvtx", + " ; #it{z}_{vtx} (cm)", + {HistType::kTH1F, {ZAxis}}}); + registry.add({"EventsZposDiff", + " ; Z_{rec} - Z_{gen} (cm)", + {HistType::kTH1F, {DeltaZAxis}}}); + registry.add({"EventsSplitMult", " ; N_{gen}", {HistType::kTH1F, {MultAxis}}}); + auto heff = registry.get(HIST("EventEfficiency")); + x = heff->GetXaxis(); + x->SetBinLabel(1, "Generated"); + x->SetBinLabel(2, "Generated INEL>0"); + x->SetBinLabel(3, "Reconstructed"); + x->SetBinLabel(4, "Selected"); + x->SetBinLabel(5, "Selected INEL>0"); + } + + if (doprocessMultReassoc) { + registry.add({"Tracks/Control/DeltaZ", + " ; #it{z_{orig}}-#it{z_{reass}}", + {HistType::kTH1F, {ZAxis}}}); + + registry.add({"Tracks/Control/TrackAmbDegree", + " ; N_{coll}^{comp}", + {HistType::kTH1F, {{51, -0.5, 50.5}}}}); + registry.add({"Tracks/Control/TrackIsAmb", + " ; isAmbiguous", + {HistType::kTH1I, {{2, -0.5, 1.5}}}}); + + auto htrk = registry.get(HIST("Tracks/Control/TrackCount")); + auto* x = htrk->GetXaxis(); + x->SetBinLabel(0, "All"); + x->SetBinLabel(1, "Reass"); + x->SetBinLabel(2, "Not Reass"); + x->SetBinLabel(3, "Amb"); + x->SetBinLabel(4, "Amb+Not-reass"); + x->SetBinLabel(5, "Non-Amb"); + x->SetBinLabel(6, "Not-Reass+Non-Amb"); + x->SetBinLabel(7, "Amb+Non-Amb"); + x->SetBinLabel(8, "colid<0"); + x->SetBinLabel(9, "wo orphan"); + + registry.add({"Tracks/Control/ReassignedTracksEtaZvtx", + "; #eta; #it{z}_{vtx} (cm); tracks", + {HistType::kTH2F, {EtaAxis, ZAxis}}}); + registry.add({"Tracks/Control/ReassignedTracksPhiEta", + "; #varphi; #eta; tracks", + {HistType::kTH2F, {PhiAxis, EtaAxis}}}); + registry.add({"Tracks/Control/ReassignedVertexCorr", + "; #it{z}_{vtx}^{orig} (cm); #it{z}_{vtx}^{re} (cm)", + {HistType::kTH2F, {ZAxis, ZAxis}}}); + + registry.add({"Tracks/Control/notReassignedTracksEtaZvtx", + "; #eta; #it{z}_{vtx} (cm); tracks", + {HistType::kTH2F, {EtaAxis, ZAxis}}}); + registry.add({"Tracks/Control/notReassignedTracksPhiEta", + "; #varphi; #eta; tracks", + {HistType::kTH2F, {PhiAxis, EtaAxis}}}); + registry.add({"Tracks/Control/notReassignedVertexCorr", + "; #it{z}_{vtx}^{orig} (cm); #it{z}_{vtx}^{re} (cm)", + {HistType::kTH2F, {ZAxis, ZAxis}}}); + + registry.add({"Tracks/Control/amb/AmbTracksEtaZvtx", + "; #eta; #it{z}_{vtx} (cm); tracks", + {HistType::kTH2F, {EtaAxis, ZAxis}}}); // + + registry.add({"Tracks/Control/woOrp/nTrk", + " ; N_{Trk}^{all}", + {HistType::kTH1F, {{701, -0.5, 700.5}}}}); // + registry.add({"Tracks/Control/amb/nTrkAmb", + " ; N_{Trk}^{amb}", + {HistType::kTH1F, {{701, -0.5, 700.5}}}}); // + registry.add({"Tracks/Control/nonamb/nTrkNonAmb", + " ; N_{Trk}^{nonamb}", + {HistType::kTH1F, {{701, -0.5, 700.5}}}}); // + + registry.add({"Tracks/Control/amb/AmbTracksPhiEta", + "; #varphi; #eta; tracks", + {HistType::kTH2F, {PhiAxis, EtaAxis}}}); // + registry.add({"Tracks/Control/amb/AmbVertexCorr", + "; #it{z}_{vtx}^{orig} (cm); #it{z}_{vtx}^{re} (cm)", + {HistType::kTH2F, {ZAxis, ZAxis}}}); // + registry.add({"Tracks/Control/amb/EtaZvtxAmb_gt0", + "; #eta; #it{z}_{vtx} (cm); tracks", + {HistType::kTH2F, {EtaAxis, ZAxis}}}); // + + registry.add({"Tracks/Control/nonamb/nonAmbTracksEtaZvtx", + "; #eta; #it{z}_{vtx} (cm); tracks", + {HistType::kTH2F, {EtaAxis, ZAxis}}}); // + + registry.add({"Tracks/Control/nonamb/nonAmbTracksPhiEta", + "; #varphi; #eta; tracks", + {HistType::kTH2F, {PhiAxis, EtaAxis}}}); // + registry.add({"Tracks/Control/nonamb/nonAmbVertexCorr", + "; #it{z}_{vtx}^{orig} (cm); #it{z}_{vtx}^{re} (cm)", + {HistType::kTH2F, {ZAxis, ZAxis}}}); // + registry.add({"Tracks/Control/nonamb/EtaZvtxNonAmb_gt0", + "; #eta; #it{z}_{vtx} (cm); tracks", + {HistType::kTH2F, {EtaAxis, ZAxis}}}); // + + registry.add({"Tracks/Control/woOrp/woOrpTracksEtaZvtx", + "; #eta; #it{z}_{vtx} (cm); tracks", + {HistType::kTH2F, {EtaAxis, ZAxis}}}); // + registry.add({"Tracks/Control/woOrp/woOrpEtaZvtx_gt0", + "; #eta; #it{z}_{vtx} (cm); tracks", + {HistType::kTH2F, {EtaAxis, ZAxis}}}); // + + registry.add({"Tracks/Control/woOrp/woOrpTracksPhiEta", + "; #varphi; #eta; tracks", + {HistType::kTH2F, {PhiAxis, EtaAxis}}}); // + registry.add({"Tracks/Control/woOrp/woOrpVertexCorr", + "; #it{z}_{vtx}^{orig} (cm); #it{z}_{vtx}^{re} (cm)", + {HistType::kTH2F, {ZAxis, ZAxis}}}); // + registry.add({"collisionID", " ; Collision ID", + // {HistType::kTH1F,{{100000, 0.5, 100000.0}}}}); // + {HistType::kTH1F, {{100000, -50000.0, 50000.0}}}}); // + registry.add({"collisionIDamb", " ; Collision ID amb", + // {HistType::kTH1F,{{100000, 0.5, 100000.0}}}}); // + {HistType::kTH1F, {{100000, -50000.0, 50000.0}}}}); // + registry.add({"NonambEventCounts", " ; EventCounts Nonamb", {HistType::kTH1F, {{1, 0.5, 1.5}}}}); // + registry.add({"hNumCollisionsNonAmb_InelMFT", " ; Number of Collisions with Non-Ambiguous Tracks;Count;Frequency", {HistType::kTH1F, {{1, 0.5, 1.5}}}}); // + registry.add({"hNumCollisionsAmb_InelMFT", " ; Number of Collisions with Non-Ambiguous Tracks;Count;Frequency", {HistType::kTH1F, {{1, 0.5, 1.5}}}}); // + registry.add({"hNumCollisions_InelMFT", " ; Number of selected events with Inel>0 and MFT>0;Count;Frequency", {HistType::kTH1F, {{1, 0.5, 1.5}}}}); // + registry.add({"hNumCollisions_Inel", " ; Number of selected events with Inel>0;Count;Frequency", {HistType::kTH1F, {{1, 0.5, 1.5}}}}); // + registry.add({"ambEventCounts", " ; EventCounts Nonamb", {HistType::kTH1F, {{1, 0.5, 1.5}}}}); // + } + + if (doprocessCountingCentrality) { + registry.add({"Events/Centrality/Selection", + ";status;centrality;events", + {HistType::kTH2F, {{3, 0.5, 3.5}, CentAxis}}}); + auto hstat = registry.get(HIST("Events/Centrality/Selection")); + auto* x = hstat->GetXaxis(); + x->SetBinLabel(1, "All"); + x->SetBinLabel(2, "Selected"); + x->SetBinLabel(3, "Rejected"); + + registry.add({"Events/Centrality/NtrkZvtx", + "; N_{trk}; Z_{vtx} (cm); centrality", + {HistType::kTH3F, {MultAxis, ZAxis, CentAxis}}}); + registry.add({"Tracks/Centrality/EtaZvtx", + "; #eta; Z_{vtx} (cm); centrality", + {HistType::kTH3F, {EtaAxis, ZAxis, CentAxis}}}); + registry.add({"Tracks/Centrality/PhiEta", + "; #varphi; #eta; centrality", + {HistType::kTH3F, {PhiAxis, EtaAxis, CentAxis}}}); + registry.add({"Tracks/Centrality/Control/PtEta", + " ; p_{T} (GeV/c); #eta; centrality", + {HistType::kTH3F, {PtAxis, EtaAxis, CentAxis}}}); + registry.add({"Tracks/Centrality/Control/DCAXYPt", + " ; p_{T} (GeV/c) ; DCA_{XY} (cm); centrality", + {HistType::kTH3F, {PtAxis, DCAxyAxis, CentAxis}}}); + registry.add({"Tracks/Centrality/Control/ReassignedDCAXYPt", + " ; p_{T} (GeV/c) ; DCA_{XY} (cm); centrality", + {HistType::kTH3F, {PtAxis, DCAxyAxis, CentAxis}}}); + registry.add({"Tracks/Centrality/Control/ExtraDCAXYPt", + " ; p_{T} (GeV/c) ; DCA_{XY} (cm); centrality", + {HistType::kTH3F, {PtAxis, DCAxyAxis, CentAxis}}}); + registry.add({"Tracks/Centrality/Control/ExtraTracksEtaZvtx", + "; #eta; Z_{vtx} (cm); centrality", + {HistType::kTH3F, {EtaAxis, ZAxis, CentAxis}}}); + registry.add({"Tracks/Centrality/Control/ExtraTracksPhiEta", + "; #varphi; #eta; centrality", + {HistType::kTH3F, {PhiAxis, EtaAxis, CentAxis}}}); + registry.add({"Tracks/Centrality/Control/ReassignedTracksEtaZvtx", + "; #eta; Z_{vtx} (cm); centrality", + {HistType::kTH3F, {EtaAxis, ZAxis, CentAxis}}}); + registry.add({"Tracks/Centrality/Control/ReassignedTracksPhiEta", + "; #varphi; #eta; centrality", + {HistType::kTH3F, {PhiAxis, EtaAxis, CentAxis}}}); + registry.add({"Tracks/Centrality/Control/ReassignedVertexCorr", + "; Z_{vtx}^{orig} (cm); Z_{vtx}^{re} (cm); centrality", + {HistType::kTH3F, {ZAxis, ZAxis, CentAxis}}}); + } + + if (doprocessGenCent) { + registry.add({"Events/Centrality/EventEfficiency", + ";status;centrality;events", + {HistType::kTH2F, {{2, 0.5, 2.5}, CentAxis}}}); + auto heff = registry.get(HIST("Events/Centrality/EventEfficiency")); + auto* x = heff->GetXaxis(); + x->SetBinLabel(1, "Generated"); + x->SetBinLabel(2, "Selected"); + + registry.add("Events/Centrality/CentPercentileMCGen", + "CentPercentileMCGen", kTH1D, {CentAxis}, false); + registry.add({"Events/Centrality/NtrkZvtxGen", + "; N_{trk}; Z_{vtx} (cm); centrality", + {HistType::kTH3F, {MultAxis, ZAxis, CentAxis}}}); + registry.add({"Events/Centrality/NtrkZvtxGen_t", + "; N_{trk}; Z_{vtx} (cm); centrality", + {HistType::kTH3F, {MultAxis, ZAxis, CentAxis}}}); + registry.add({"Tracks/Centrality/EtaZvtxGen_t", + "; #eta; Z_{vtx} (cm); centrality", + {HistType::kTH3F, {EtaAxis, ZAxis, CentAxis}}}); + registry.add({"Tracks/Centrality/EtaZvtxGen", + "; #eta; Z_{vtx} (cm); centrality", + {HistType::kTH3F, {EtaAxis, ZAxis, CentAxis}}}); + registry.add({"Tracks/Centrality/PhiEtaGen", + "; #varphi; #eta; centrality", + {HistType::kTH3F, {PhiAxis, EtaAxis, CentAxis}}}); + } + } + + using FullBCs = soa::Join; + void processTagging(FullBCs const& bcs, + soa::Join const& collisions) + { + + std::vector::iterator> cols; + for (auto& bc : bcs) { + if (!useEvSel || + (useEvSel && ((bc.selection_bit(aod::evsel::kIsBBT0A) && + bc.selection_bit(aod::evsel::kIsBBT0C)) != 0))) { + registry.fill(HIST("EventSelection"), 7); // added 5->12 + cols.clear(); + for (auto& collision : collisions) { + if (collision.has_foundBC()) { + if (collision.foundBCId() == bc.globalIndex()) { + cols.emplace_back(collision); + } + } else if (collision.bcId() == bc.globalIndex()) { + cols.emplace_back(collision); + } + } + LOGP(debug, "BC {} has {} collisions", bc.globalBC(), cols.size()); + if (!cols.empty()) { + registry.fill(HIST("EventSelection"), 8); // added 6->13 + if (cols.size() > 1) { + registry.fill(HIST("EventSelection"), 9); // added 7->14 + } + } + } + } + } + + PROCESS_SWITCH(PseudorapidityDensityMFT, processTagging, + "Collect event sample stats", true); + + Partition sample = + (aod::fwdtrack::eta < -2.8f) && (aod::fwdtrack::eta > -3.2f); + + Partition sampleCentral = (nabs(aod::track::eta) < 1.1f); + + expressions::Filter atrackFilter = + (aod::fwdtrack::bestCollisionId >= 0) && (aod::fwdtrack::eta < -2.0f) && + (aod::fwdtrack::eta > -3.9f) && (nabs(aod::fwdtrack::bestDCAXY) <= 2.f); + + using CollwEv = soa::Join; + + expressions::Filter trackSelectionCentral = + ((aod::track::trackCutFlag & trackSelectionITS) == trackSelectionITS) && + ifnode((aod::track::v001::detectorMap & (uint8_t)o2::aod::track::TPC) == + (uint8_t)o2::aod::track::TPC, + (aod::track::trackCutFlag & trackSelectionTPC) == + trackSelectionTPC, + true) && + ((aod::track::trackCutFlag & trackSelectionDCA) == trackSelectionDCA) && + (nabs(aod::track::eta) < estimatorEta); + + using FiCentralTracks = soa::Filtered< + soa::Join>; // central tracks for INEL>0 + + void processMult(CollwEv::iterator const& collision, + aod::MFTTracks const& tracks, + FiCentralTracks const& midtracks, aod::Tracks const&) + { + + registry.fill(HIST("EventSelection"), 1.); + if (!useEvSel || (useEvSel && collision.sel8())) { + registry.fill(HIST("EventSelection"), 2.); + auto z = collision.posZ(); + auto perCollisionSample = sampleCentral->sliceByCached( + o2::aod::track::collisionId, collision.globalIndex(), cache); + auto Ntrk = perCollisionSample.size(); + + registry.fill(HIST("EventsNtrkZvtx"), Ntrk, z); + + if (midtracks.size() > 0) // INEL>0 + { + registry.fill(HIST("EventSelection"), 3.); + registry.fill(HIST("EventsNtrkZvtx_gt0"), Ntrk, z); + } + + if (tracks.size() > 0) { + for (auto& track : tracks) { + + float phi = track.phi(); + o2::math_utils::bringTo02Pi(phi); + + if (usePhiCut) { + if ((phi < cfgPhiCut) || + ((phi > M_PI - cfgPhiCut) && (phi < M_PI + cfgPhiCut)) || + (phi > 2. * M_PI - cfgPhiCut) || + ((phi > ((M_PI / 2. - 0.1) * M_PI) - cfgPhiCut) && + (phi < ((M_PI / 2. - 0.1) * M_PI) + cfgPhiCut))) + continue; + } + + registry.fill(HIST("TracksEtaZvtx"), track.eta(), z); + if (midtracks.size() > 0) // INEL>0 + { + registry.fill(HIST("Tracks/EtaZvtx_gt0"), track.eta(), z); + } + registry.fill(HIST("TracksPhiEta"), phi, track.eta()); + registry.fill(HIST("TracksPtEta"), track.pt(), track.eta()); + if ((track.eta() < -2.0f) && (track.eta() > -3.9f)) { + registry.fill(HIST("TracksPhiZvtx"), phi, z); + } + } + } + + } else { + registry.fill(HIST("EventSelection"), 4.); + } + } + + PROCESS_SWITCH(PseudorapidityDensityMFT, processMult, + "Process reco or data info", true); + void processMultReassoc(CollwEv::iterator const& collision, + o2::aod::MFTTracks const&, + soa::SmallGroups const& retracks, + FiCentralTracks const& midtracks, aod::Tracks const&) + { + registry.fill(HIST("EventSelection"), 1.); + if (!useEvSel || (useEvSel && collision.sel8())) { + registry.fill(HIST("EventSelection"), 2.); + auto z = collision.posZ(); + if ((z >= cfgVzCut1) && (z <= cfgVzCut2)) { + registry.fill(HIST("EventSelection"), 3.); + auto perCollisionSample = sampleCentral->sliceByCached( + o2::aod::track::collisionId, collision.globalIndex(), cache); + auto Ntrk = perCollisionSample.size(); + std::unordered_set uniqueEvents; + std::unordered_set uniqueEventsAmb; + std::unordered_set uniqueCollisions; + std::unordered_set uniqueCollisionsAmb; + std::unordered_set eventsInelMFT; + std::unordered_set eventsInel; + registry.fill(HIST("EventsNtrkZvtx"), Ntrk, z); + if (midtracks.size() > 0) { + registry.fill(HIST("EventSelection"), 4.); + registry.fill(HIST("EventsNtrkZvtx_gt0"), Ntrk, z); + eventsInel.insert(collision.globalIndex()); + } + int64_t i = 0.0, j = 0.0, k = 0.0; + if (retracks.size() > 0) { + registry.fill(HIST("EventSelection"), 5.); + for (auto& retrack : retracks) { + auto track = retrack.mfttrack(); + + if ((cfgnEta1 < track.eta()) && (track.eta() < cfgnEta2) && track.nClusters() >= cfgnCluster) { + registry.fill(HIST("TracksEtaZvtx"), track.eta(), z); + if (midtracks.size() > 0 && retrack.ambDegree() > 0) { + registry.fill(HIST("Tracks/EtaZvtx_gt0"), track.eta(), z); + eventsInelMFT.insert(retrack.bestCollisionId()); + } + if (retrack.ambDegree() != 0) { + registry.fill(HIST("Tracks/Control/woOrp/woOrpEtaZvtx_gt0"), track.eta(), z); + ++k; + } + float phi = track.phi(); + o2::math_utils::bringTo02Pi(phi); + registry.fill(HIST("Tracks/Control/TrackCount"), 0); + registry.fill(HIST("TracksPhiEta"), phi, track.eta()); + registry.fill(HIST("TracksPtEta"), track.pt(), track.eta()); + if ((track.eta() < -2.0f) && (track.eta() > -3.9f)) { + registry.fill(HIST("TracksPhiZvtx"), phi, z); + } + if (track.collisionId() > -1 && retrack.ambDegree() == 1) { + registry.fill(HIST("Tracks/Control/TrackCount"), 8); + registry.fill(HIST("collisionID"), track.collisionId()); + } + if (track.collisionId() > -1 && retrack.ambDegree() > 1) { + registry.fill(HIST("collisionIDamb"), track.collisionId()); + } + if (track.collisionId() != retrack.bestCollisionId()) { + registry.fill(HIST("Tracks/Control/ReassignedTracksEtaZvtx"), + track.eta(), z); + registry.fill(HIST("Tracks/Control/ReassignedTracksPhiEta"), phi, + track.eta()); + registry.fill(HIST("Tracks/Control/ReassignedVertexCorr"), + track.collision_as().posZ(), z); + + registry.fill(HIST("Tracks/Control/DeltaZ"), + track.collision_as().posZ() - + collision.posZ()); + registry.fill(HIST("Tracks/Control/TrackCount"), 1); + } + if (track.collisionId() == retrack.bestCollisionId()) { + registry.fill(HIST("Tracks/Control/notReassignedTracksEtaZvtx"), + track.eta(), z); + registry.fill(HIST("Tracks/Control/notReassignedTracksPhiEta"), phi, + track.eta()); + registry.fill(HIST("Tracks/Control/notReassignedVertexCorr"), + track.collision_as().posZ(), z); + registry.fill(HIST("Tracks/Control/TrackCount"), 2); + } + + registry.fill(HIST("Tracks/Control/TrackAmbDegree"), + retrack.ambDegree()); + registry.fill(HIST("Tracks/Control/DCAXY"), retrack.bestDCAXY()); + int isAmbiguous = 0; + + if (retrack.ambDegree() > 1 && retrack.ambDegree() != 0) { + isAmbiguous = 1; + ++i; + + registry.fill(HIST("Tracks/Control/amb/EtaZvtxAmb_gt0"), track.eta(), z); + + registry.fill(HIST("Tracks/Control/amb/AmbTracksEtaZvtx"), + track.eta(), z); + registry.fill(HIST("Tracks/Control/amb/AmbTracksPhiEta"), phi, + track.eta()); + registry.fill(HIST("Tracks/Control/amb/AmbVertexCorr"), + track.collision_as().posZ(), z); + registry.fill(HIST("Tracks/Control/TrackCount"), 3); + if (track.collisionId() == retrack.bestCollisionId()) { + registry.fill(HIST("Tracks/Control/TrackCount"), 5); + } + uniqueEventsAmb.insert(retrack.bestCollisionId()); + } + if (midtracks.size() > 0 && retrack.ambDegree() > 1 && retrack.ambDegree() != 0) { + uniqueCollisionsAmb.insert(collision.globalIndex()); + } + + registry.fill(HIST("Tracks/Control/TrackIsAmb"), isAmbiguous); + if (retrack.ambDegree() == 1 && retrack.ambDegree() != 0) { + ++j; + registry.fill(HIST("Tracks/Control/nonamb/EtaZvtxNonAmb_gt0"), track.eta(), z); + registry.fill(HIST("Tracks/Control/nonamb/nonAmbTracksEtaZvtx"), + track.eta(), z); + registry.fill(HIST("Tracks/Control/nonamb/nonAmbTracksPhiEta"), phi, + track.eta()); + registry.fill(HIST("Tracks/Control/nonamb/nonAmbVertexCorr"), + track.collision_as().posZ(), z); + registry.fill(HIST("Tracks/Control/TrackCount"), 4); + if (track.collisionId() == retrack.bestCollisionId()) { + registry.fill(HIST("Tracks/Control/TrackCount"), 6); + } + uniqueEvents.insert(retrack.bestCollisionId()); + } + if (midtracks.size() > 0 && retrack.ambDegree() == 1 && retrack.ambDegree() != 0) { + uniqueCollisions.insert(collision.globalIndex()); + } + if ((retrack.ambDegree() > 1) || (retrack.ambDegree() <= 1)) + registry.fill(HIST("Tracks/Control/TrackCount"), 7); + if (retrack.ambDegree() != 0) { + registry.fill(HIST("Tracks/Control/woOrp/woOrpTracksEtaZvtx"), + track.eta(), z); + registry.fill(HIST("Tracks/Control/woOrp/woOrpTracksPhiEta"), phi, + track.eta()); + registry.fill(HIST("Tracks/Control/woOrp/woOrpVertexCorr"), + track.collision_as().posZ(), z); + registry.fill(HIST("Tracks/Control/TrackCount"), 9); // without orphan + } + } + } + registry.fill(HIST("ambEventCounts"), 1, uniqueEventsAmb.size()); + registry.fill(HIST("NonambEventCounts"), 1, uniqueEvents.size()); + registry.fill(HIST("hNumCollisionsNonAmb_InelMFT"), 1, uniqueCollisions.size()); + registry.fill(HIST("hNumCollisionsAmb_InelMFT"), 1, uniqueCollisionsAmb.size()); + registry.fill(HIST("hNumCollisions_InelMFT"), 1, eventsInelMFT.size()); + } + registry.fill(HIST("Tracks/Control/amb/nTrkAmb"), i); + registry.fill(HIST("Tracks/Control/nonamb/nTrkNonAmb"), j); + registry.fill(HIST("Tracks/Control/woOrp/nTrk"), k); + registry.fill(HIST("hNumCollisions_Inel"), 1, eventsInel.size()); + } + } else { + registry.fill(HIST("EventSelection"), 6); + } + } + PROCESS_SWITCH(PseudorapidityDensityMFT, processMultReassoc, + "Process reco or data info", false); + + using ExColsCent = soa::Join; + + void processCountingCentrality(ExColsCent::iterator const& collision, + aod::MFTTracks const& tracks) + { + auto c = collision.centFT0C(); + registry.fill(HIST("Events/Centrality/Selection"), 1., c); + + if (!useEvSel || collision.sel8()) { + auto z = collision.posZ(); + registry.fill(HIST("Events/Centrality/Selection"), 2., c); + auto perCollisionSample = sample->sliceByCached( + o2::aod::fwdtrack::collisionId, collision.globalIndex(), cache); + auto Ntrk = perCollisionSample.size(); + + registry.fill(HIST("Events/Centrality/NtrkZvtx"), Ntrk, z, c); + + for (auto& track : tracks) { + + float phi = track.phi(); + o2::math_utils::bringTo02Pi(phi); + + if (usePhiCut) { + if ((phi < cfgPhiCut) || + ((phi > M_PI - cfgPhiCut) && (phi < M_PI + cfgPhiCut)) || + (phi > 2. * M_PI - cfgPhiCut) || + ((phi > ((M_PI / 2. - 0.1) * M_PI) - cfgPhiCut) && + (phi < ((M_PI / 2. - 0.1) * M_PI) + cfgPhiCut))) + continue; + } + + registry.fill(HIST("Tracks/Centrality/EtaZvtx"), track.eta(), z, c); + registry.fill(HIST("Tracks/Centrality/PhiEta"), phi, track.eta(), c); + } + + } else { + registry.fill(HIST("Events/Centrality/Selection"), 3., + c); // rejected events + } + } + + PROCESS_SWITCH(PseudorapidityDensityMFT, processCountingCentrality, + "Count tracks in centrality bins", false); + + using Particles = soa::Filtered; + expressions::Filter primaries = + (aod::mcparticle::flags & + (uint8_t)o2::aod::mcparticle::enums::PhysicalPrimary) == + (uint8_t)o2::aod::mcparticle::enums::PhysicalPrimary; + Partition mcSample = nabs(aod::mcparticle::eta) < 1.1f; + Partition mcSampleCentral = + nabs(aod::mcparticle::eta) < estimatorEta; + + void processGen( + aod::McCollisions::iterator const& mcCollision, + o2::soa::SmallGroups> const& collisions, + Particles const& particles, aod::MFTTracks const& /*tracks*/, + FiCentralTracks const& midtracks) + { + registry.fill(HIST("EventEfficiency"), 1.); + + auto perCollisionMCSample = mcSample->sliceByCached( + aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); + auto nCharged = 0; + for (auto& particle : perCollisionMCSample) { + auto charge = 0.; + auto p = pdg->GetParticle(particle.pdgCode()); + if (p != nullptr) { + charge = p->Charge(); + } + if (std::abs(charge) < 3.) { + continue; + } + nCharged++; + } + registry.fill(HIST("EventsNtrkZvtxGen_t"), nCharged, mcCollision.posZ()); + + //--------for INEL>0 + auto perCollisionMCSampleCentral = mcSampleCentral->sliceByCached( + aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); + auto nChargedCentral = 0; + for (auto& particle : perCollisionMCSampleCentral) { + auto charge = 0.; + auto p = pdg->GetParticle(particle.pdgCode()); + if (p != nullptr) { + charge = p->Charge(); + } + if (std::abs(charge) < 3.) { + continue; + } + nChargedCentral++; + } + + if (nChargedCentral > 0) { + registry.fill(HIST("EventEfficiency"), 2.); + registry.fill(HIST("EventsNtrkZvtxGen_gt0t"), nCharged, + mcCollision.posZ()); + } + + //----------- + bool atLeastOne = false; + bool atLeastOne_gt0 = false; + int moreThanOne = 0; + + LOGP(debug, "MC col {} has {} reco cols", mcCollision.globalIndex(), + collisions.size()); + for (auto& collision : collisions) { + registry.fill(HIST("EventEfficiency"), 3.); + if (!useEvSel || (useEvSel && collision.sel8())) { + atLeastOne = true; + auto perCollisionSample = sample->sliceByCached( + o2::aod::fwdtrack::collisionId, collision.globalIndex(), cache); + + registry.fill(HIST("EventEfficiency"), 4.); + + auto perCollisionSampleCentral = + midtracks.sliceBy(perColCentral, collision.globalIndex()); + + if (perCollisionSampleCentral.size() > 0) { + registry.fill(HIST("EventEfficiency"), 5.); + atLeastOne_gt0 = true; + registry.fill(HIST("EventsNtrkZvtxGen_gt0"), + perCollisionSample.size(), collision.posZ()); + } + + registry.fill(HIST("EventsZposDiff"), + collision.posZ() - mcCollision.posZ()); + if (useZDiffCut) { + if (std::abs(collision.posZ() - mcCollision.posZ()) > maxZDiff) { + continue; + } + } + registry.fill(HIST("EventsNtrkZvtxGen"), perCollisionSample.size(), + collision.posZ()); + ++moreThanOne; + } + } + if (collisions.size() == 0) { + registry.fill(HIST("NotFoundEventZvtx"), mcCollision.posZ()); + } + if (moreThanOne > 1) { + registry.fill(HIST("EventsSplitMult"), nCharged); + } + + for (auto& particle : particles) { + auto p = pdg->GetParticle(particle.pdgCode()); + auto charge = 0; + if (p != nullptr) { + charge = static_cast(p->Charge()); + } + if (std::abs(charge) < 3.) { + continue; + } + + registry.fill(HIST("TracksEtaZvtxGen_t"), particle.eta(), + mcCollision.posZ()); + if (perCollisionMCSampleCentral.size() > 0) { + registry.fill(HIST("TracksEtaZvtxGen_gt0t"), particle.eta(), + mcCollision.posZ()); + } + if (atLeastOne) { + registry.fill(HIST("TracksEtaZvtxGen"), particle.eta(), + mcCollision.posZ()); + registry.fill(HIST("TracksPtEtaGen"), particle.pt(), particle.eta()); + if (atLeastOne_gt0) { + registry.fill(HIST("TracksEtaZvtxGen_gt0"), particle.eta(), + mcCollision.posZ()); + } + } + + registry.fill(HIST("TracksPhiEtaGen"), particle.phi(), particle.eta()); + registry.fill(HIST("TracksPhiZvtxGen"), particle.phi(), + mcCollision.posZ()); + registry.fill(HIST("TracksPtEtaGen_t"), particle.pt(), particle.eta()); + } + } + + PROCESS_SWITCH(PseudorapidityDensityMFT, processGen, + "Process generator-level info", false); + + using ExColsGenCent = + soa::SmallGroups>; + + void processGenCent(aod::McCollisions::iterator const& mcCollision, + ExColsGenCent const& collisions, + Particles const& particles, + MFTTracksLabeled const& /*tracks*/) + { + + LOGP(debug, "MC col {} has {} reco cols", mcCollision.globalIndex(), + collisions.size()); + + float c_gen = -1; + bool atLeastOne = false; + for (auto& collision : collisions) { + float c_rec = -1; + if constexpr (ExColsGenCent::template contains()) { + c_rec = collision.centFT0C(); + } + if (!useEvSel || (useEvSel && collision.sel8())) { + if constexpr (ExColsGenCent::template contains()) { + if (!atLeastOne) { + c_gen = c_rec; + } + } + atLeastOne = true; + + registry.fill(HIST("Events/Centrality/EventEfficiency"), 2., c_gen); + registry.fill(HIST("Events/Centrality/CentPercentileMCGen"), c_gen); + + auto perCollisionSample = sample->sliceByCached( + o2::aod::fwdtrack::collisionId, collision.globalIndex(), cache); + registry.fill(HIST("Events/Centrality/NtrkZvtxGen"), + perCollisionSample.size(), collision.posZ(), c_gen); + } + } + + registry.fill(HIST("Events/Centrality/EventEfficiency"), 1., c_gen); + + auto perCollisionMCSample = mcSample->sliceByCached( + aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); + auto nCharged = 0; + + for (auto& particle : perCollisionMCSample) { + auto p = pdg->GetParticle(particle.pdgCode()); + auto charge = 0; + if (p != nullptr) { + charge = static_cast(p->Charge()); + } + if (std::abs(charge) < 3.) { + continue; + } + nCharged++; + } + + if constexpr (ExColsGenCent::template contains()) { + registry.fill(HIST("Events/Centrality/NtrkZvtxGen_t"), nCharged, + mcCollision.posZ(), c_gen); + } + + for (auto& particle : particles) { + auto p = pdg->GetParticle(particle.pdgCode()); + auto charge = 0; + if (p != nullptr) { + charge = static_cast(p->Charge()); + } + if (std::abs(charge) < 3.) { + continue; + } + + if constexpr (ExColsGenCent::template contains()) { + registry.fill(HIST("Tracks/Centrality/EtaZvtxGen_t"), particle.eta(), + mcCollision.posZ(), c_gen); + } + + if (atLeastOne) { + if constexpr (ExColsGenCent::template contains()) { + registry.fill(HIST("Tracks/Centrality/EtaZvtxGen"), particle.eta(), + mcCollision.posZ(), c_gen); + float phi = particle.phi(); + o2::math_utils::bringTo02Pi(phi); + registry.fill(HIST("Tracks/Centrality/PhiEtaGen"), phi, + particle.eta(), c_gen); + } + } + } + } + + PROCESS_SWITCH(PseudorapidityDensityMFT, processGenCent, + "Process generator-level info in centrality bins", false); + + void processGenPt( + soa::Join::iterator const& collision, + MFTTracksLabeled const& tracks, aod::McParticles const&) + { + if (!useEvSel || (useEvSel && collision.sel8())) { + for (auto& track : tracks) { + if (!track.has_mcParticle()) { + continue; + } + auto particle = track.mcParticle(); + if (!particle.isPhysicalPrimary()) { + continue; + } + registry.fill(HIST("TracksToPartPtEta"), particle.pt(), particle.eta()); + } + } + } + + PROCESS_SWITCH(PseudorapidityDensityMFT, processGenPt, + "Process particle-level info of pt", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} From ede18b6ec77ab2230157cfa10df3223cbd57f88f Mon Sep 17 00:00:00 2001 From: Swati <69241911+SwatiSaha-1997@users.noreply.github.com> Date: Wed, 5 Feb 2025 03:25:11 +0530 Subject: [PATCH 0035/1650] [PWGCF] read efficiencies from 2D hist in ccdb (#9745) --- .../Tasks/netprotonCumulantsMc.cxx | 1011 ++++++++++++++++- 1 file changed, 957 insertions(+), 54 deletions(-) diff --git a/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx b/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx index 416a18964a0..bd573ac8026 100644 --- a/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx @@ -10,7 +10,7 @@ // or submit itself to any jurisdiction. /// \file netprotonCumulantsMc.cxx -/// \brief Task for analyzing efficiency of proton, and net-proton distributions in MC reconstructed and generated +/// \brief Task for analyzing efficiency of proton, and net-proton distributions in MC reconstructed and generated, and calculating net-proton cumulants /// \author Swati Saha #include @@ -146,17 +146,23 @@ struct NetprotonCumulantsMc { Configurable> cfgProtonEff{"cfgProtonEff", {0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9}, "Efficiency of protons"}; Configurable> cfgAntiprotonEff{"cfgAntiprotonEff", {0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9}, "Efficiency of anti-protons"}; + Configurable cfgLoadEff{"cfgLoadEff", true, "Load efficiency from file"}; + Configurable cfgEvSelkNoSameBunchPileup{"cfgEvSelkNoSameBunchPileup", true, "Pileup removal"}; + // Connect to ccdb Service ccdb; Configurable ccdbNoLaterThan{"ccdbNoLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; - Configurable ccdbUrl{"ccdbUrl", "http://ccdb-test.cern.ch:8080", "url of the ccdb repository"}; + Configurable ccdbUrl{"ccdbUrl", "https://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable ccdbPath{"ccdbPath", "Users/s/swati/EtavsPtEfficiency_LHC24f3b_PIDchoice0", "CCDB path to ccdb object containing eff(pt, eta) in 2D hist"}; HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; - // for errs of uncorrected - std::vector>> subsample; TRandom3* fRndm = new TRandom3(0); + // Eff histograms 2d: eff(pT, eta) + TH2F* hRatio2DEtaVsPtProton = nullptr; + TH2F* hRatio2DEtaVsPtAntiproton = nullptr; + // Filter command for rec (data)*********** Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; Filter trackFilter = (nabs(aod::track::eta) < 0.8f) && (aod::track::pt > cfgCutPtLower) && (aod::track::pt < 5.0f) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::tpcChi2NCl < cfgCutTpcChi2NCl) && (aod::track::itsChi2NCl < cfgCutItsChi2NCl) && (aod::track::dcaZ < cfgCutDCAz) && (aod::track::dcaXY < cfgCutDCAxy); @@ -174,6 +180,25 @@ struct NetprotonCumulantsMc { // Equivalent of the AliRoot task UserCreateOutputObjects void init(o2::framework::InitContext&) { + // Loading efficiency histograms from ccdb + if (cfgLoadEff) { + + // Accessing eff histograms + ccdb->setURL(ccdbUrl.value); + // Enabling object caching, otherwise each call goes to the CCDB server + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + // Not later than now, will be replaced by the value of the train creation + // This avoids that users can replace objects **while** a train is running + ccdb->setCreatedNotAfter(ccdbNoLaterThan.value); + LOGF(info, "Getting object %s", ccdbPath.value.data()); + TList* lst = ccdb->getForTimeStamp(ccdbPath.value, ccdbNoLaterThan.value); + hRatio2DEtaVsPtProton = reinterpret_cast(lst->FindObject("hRatio2DEtaVsPtProton")); + hRatio2DEtaVsPtAntiproton = reinterpret_cast(lst->FindObject("hRatio2DEtaVsPtAntiproton")); + if (!hRatio2DEtaVsPtProton || !hRatio2DEtaVsPtAntiproton) + LOGF(info, "FATAL!! could not get efficiency---------> check"); + } + // Define your axes // Constant bin width axis AxisSpec vtxZAxis = {100, -20, 20}; @@ -487,21 +512,14 @@ struct NetprotonCumulantsMc { if (cfgIsCalculateError) { // uncorrected - subsample.resize(cfgNSubsample); - for (int i = 0; i < cfgNSubsample; i++) { - subsample[i].resize(8); - } - for (int i = 0; i < cfgNSubsample; i++) { - //! 1D profiles of moments - subsample[i][0] = std::get>(histos.add(Form("subsample_%d/Prof_mu1_netproton", i), "", {HistType::kTProfile, {centAxis}})); - subsample[i][1] = std::get>(histos.add(Form("subsample_%d/Prof_mu2_netproton", i), "", {HistType::kTProfile, {centAxis}})); - subsample[i][2] = std::get>(histos.add(Form("subsample_%d/Prof_mu3_netproton", i), "", {HistType::kTProfile, {centAxis}})); - subsample[i][3] = std::get>(histos.add(Form("subsample_%d/Prof_mu4_netproton", i), "", {HistType::kTProfile, {centAxis}})); - subsample[i][4] = std::get>(histos.add(Form("subsample_%d/Prof_mu5_netproton", i), "", {HistType::kTProfile, {centAxis}})); - subsample[i][5] = std::get>(histos.add(Form("subsample_%d/Prof_mu6_netproton", i), "", {HistType::kTProfile, {centAxis}})); - subsample[i][6] = std::get>(histos.add(Form("subsample_%d/Prof_mu7_netproton", i), "", {HistType::kTProfile, {centAxis}})); - subsample[i][7] = std::get>(histos.add(Form("subsample_%d/Prof_mu8_netproton", i), "", {HistType::kTProfile, {centAxis}})); - } + histos.add("Prof2D_mu1_netproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_mu2_netproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_mu3_netproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_mu4_netproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_mu5_netproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_mu6_netproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_mu7_netproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_mu8_netproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); // eff. corrected histos.add("Prof2D_Q11_1", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); @@ -777,6 +795,28 @@ struct NetprotonCumulantsMc { histos.add("hgenProfileTotalProton", "Generated total proton number vs. centrality", kTProfile, {centAxis}); histos.add("hgenProfileProton", "Generated proton number vs. centrality", kTProfile, {centAxis}); histos.add("hgenProfileAntiproton", "Generated antiproton number vs. centrality", kTProfile, {centAxis}); + + if (cfgIsCalculateCentral) { + histos.add("GenProf_mu1_netproton", "", {HistType::kTProfile, {centAxis}}); + histos.add("GenProf_mu2_netproton", "", {HistType::kTProfile, {centAxis}}); + histos.add("GenProf_mu3_netproton", "", {HistType::kTProfile, {centAxis}}); + histos.add("GenProf_mu4_netproton", "", {HistType::kTProfile, {centAxis}}); + histos.add("GenProf_mu5_netproton", "", {HistType::kTProfile, {centAxis}}); + histos.add("GenProf_mu6_netproton", "", {HistType::kTProfile, {centAxis}}); + histos.add("GenProf_mu7_netproton", "", {HistType::kTProfile, {centAxis}}); + histos.add("GenProf_mu8_netproton", "", {HistType::kTProfile, {centAxis}}); + } + + if (cfgIsCalculateError) { + histos.add("GenProf2D_mu1_netproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("GenProf2D_mu2_netproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("GenProf2D_mu3_netproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("GenProf2D_mu4_netproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("GenProf2D_mu5_netproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("GenProf2D_mu6_netproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("GenProf2D_mu7_netproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("GenProf2D_mu8_netproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + } } } // end init() @@ -851,28 +891,41 @@ struct NetprotonCumulantsMc { template float getEfficiency(const T& candidate) { - // Find the pt bin index based on the track's pt value - int binIndex = -1; - // Get the array from the Configurable - auto ptBins = (std::vector)cfgPtBins; - auto effProt = (std::vector)cfgProtonEff; - auto effAntiprot = (std::vector)cfgAntiprotonEff; - - for (int i = 0; i < 16; ++i) { - if (candidate.pt() >= ptBins[i] && candidate.pt() < ptBins[i + 1]) { - binIndex = i; - break; + // Load eff from histograms in CCDB + if (cfgLoadEff) { + if (candidate.sign() > 0) { + float effmeanval = hRatio2DEtaVsPtProton->GetBinContent(hRatio2DEtaVsPtProton->FindBin(candidate.pt(), candidate.eta())); + return effmeanval; } + if (candidate.sign() < 0) { + float effmeanval = hRatio2DEtaVsPtAntiproton->GetBinContent(hRatio2DEtaVsPtAntiproton->FindBin(candidate.pt(), candidate.eta())); + return effmeanval; + } + return 0.0; + } else { + // Find the pt bin index based on the track's pt value + int binIndex = -1; + // Get the array from the Configurable + auto ptBins = (std::vector)cfgPtBins; + auto effProt = (std::vector)cfgProtonEff; + auto effAntiprot = (std::vector)cfgAntiprotonEff; + + for (int i = 0; i < 16; ++i) { + if (candidate.pt() >= ptBins[i] && candidate.pt() < ptBins[i + 1]) { + binIndex = i; + break; + } + } + // If the pt is outside the defined bins, return a default efficiency or handle it differently + if (binIndex == -1) { + return 0.0; // Default efficiency (0% if outside bins) + } + if (candidate.sign() > 0) + return effProt[binIndex]; + if (candidate.sign() < 0) + return effAntiprot[binIndex]; + return 0.0; } - // If the pt is outside the defined bins, return a default efficiency or handle it differently - if (binIndex == -1) { - return 0.0; // Default efficiency (0% if outside bins) - } - if (candidate.sign() > 0) - return effProt[binIndex]; - if (candidate.sign() < 0) - return effAntiprot[binIndex]; - return 0.0; } Produces genEbyeCollisions; //! MC Gen table creation @@ -960,6 +1013,36 @@ struct NetprotonCumulantsMc { histos.fill(HIST("hgenProfileProton"), cent, nProt); histos.fill(HIST("hgenProfileAntiproton"), cent, nAntiprot); genEbyeCollisions(cent, netProt, nProt, nAntiprot); + + // Profiles for generated level cumulants + //------------------------------------------------------------------------------------------- + + if (cfgIsCalculateCentral) { + histos.get(HIST("GenProf_mu1_netproton"))->Fill(cent, std::pow(netProt, 1.0)); + histos.get(HIST("GenProf_mu2_netproton"))->Fill(cent, std::pow(netProt, 2.0)); + histos.get(HIST("GenProf_mu3_netproton"))->Fill(cent, std::pow(netProt, 3.0)); + histos.get(HIST("GenProf_mu4_netproton"))->Fill(cent, std::pow(netProt, 4.0)); + histos.get(HIST("GenProf_mu5_netproton"))->Fill(cent, std::pow(netProt, 5.0)); + histos.get(HIST("GenProf_mu6_netproton"))->Fill(cent, std::pow(netProt, 6.0)); + histos.get(HIST("GenProf_mu7_netproton"))->Fill(cent, std::pow(netProt, 7.0)); + histos.get(HIST("GenProf_mu8_netproton"))->Fill(cent, std::pow(netProt, 8.0)); + } + + if (cfgIsCalculateError) { + + float l_Random = fRndm->Rndm(); + int sampleIndex = static_cast(cfgNSubsample * l_Random); + + histos.get(HIST("GenProf2D_mu1_netproton"))->Fill(cent, sampleIndex, std::pow(netProt, 1.0)); + histos.get(HIST("GenProf2D_mu2_netproton"))->Fill(cent, sampleIndex, std::pow(netProt, 2.0)); + histos.get(HIST("GenProf2D_mu3_netproton"))->Fill(cent, sampleIndex, std::pow(netProt, 3.0)); + histos.get(HIST("GenProf2D_mu4_netproton"))->Fill(cent, sampleIndex, std::pow(netProt, 4.0)); + histos.get(HIST("GenProf2D_mu5_netproton"))->Fill(cent, sampleIndex, std::pow(netProt, 5.0)); + histos.get(HIST("GenProf2D_mu6_netproton"))->Fill(cent, sampleIndex, std::pow(netProt, 6.0)); + histos.get(HIST("GenProf2D_mu7_netproton"))->Fill(cent, sampleIndex, std::pow(netProt, 7.0)); + histos.get(HIST("GenProf2D_mu8_netproton"))->Fill(cent, sampleIndex, std::pow(netProt, 8.0)); + } + //------------------------------------------------------------------------------------------- } PROCESS_SWITCH(NetprotonCumulantsMc, processMCGen, "Process Generated", true); @@ -983,6 +1066,10 @@ struct NetprotonCumulantsMc { float nProt = 0.0; float nAntiprot = 0.0; + std::array powerEffProt = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + std::array powerEffAntiprot = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + std::array fTCP0 = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + std::array fTCP1 = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; // Start of the Monte-Carlo reconstructed tracks for (const auto& track : tracks) { @@ -1024,8 +1111,15 @@ struct NetprotonCumulantsMc { histos.fill(HIST("hrecPhiProton"), particle.phi()); histos.fill(HIST("hrecDcaXYProton"), track.dcaXY()); histos.fill(HIST("hrecDcaZProton"), track.dcaZ()); - if (particle.pt() < cfgCutPtUpper) + if (particle.pt() < cfgCutPtUpper) { nProt = nProt + 1.0; + float pEff = getEfficiency(track); // get efficiency of track + if (pEff != 0) { + for (int i = 1; i < 7; i++) { + powerEffProt[i] += std::pow(1.0 / pEff, i); + } + } + } if (particle.pdgCode() == 2212) { histos.fill(HIST("hrecTruePtProton"), particle.pt()); //! hist for p purity } @@ -1039,8 +1133,15 @@ struct NetprotonCumulantsMc { histos.fill(HIST("hrecPhiAntiproton"), particle.phi()); histos.fill(HIST("hrecDcaXYAntiproton"), track.dcaXY()); histos.fill(HIST("hrecDcaZAntiproton"), track.dcaZ()); - if (particle.pt() < cfgCutPtUpper) + if (particle.pt() < cfgCutPtUpper) { nAntiprot = nAntiprot + 1.0; + float pEff = getEfficiency(track); // get efficiency of track + if (pEff != 0) { + for (int i = 1; i < 7; i++) { + powerEffAntiprot[i] += std::pow(1.0 / pEff, i); + } + } + } if (particle.pdgCode() == -2212) { histos.fill(HIST("hrecTruePtAntiproton"), particle.pt()); //! hist for anti-p purity } @@ -1056,13 +1157,815 @@ struct NetprotonCumulantsMc { histos.fill(HIST("hrecProfileTotalProton"), cent, (nProt + nAntiprot)); histos.fill(HIST("hrecProfileProton"), cent, nProt); histos.fill(HIST("hrecProfileAntiproton"), cent, nAntiprot); + histos.fill(HIST("hCorrProfileTotalProton"), cent, (powerEffProt[1] + powerEffAntiprot[1])); + histos.fill(HIST("hCorrProfileProton"), cent, powerEffProt[1]); + histos.fill(HIST("hCorrProfileAntiproton"), cent, powerEffAntiprot[1]); recEbyeCollisions(cent, netProt, nProt, nAntiprot); - } - PROCESS_SWITCH(NetprotonCumulantsMc, processMCRec, "Process Generated", true); - void processDataRec(AodCollisions::iterator const& coll, aod::BCsWithTimestamps const&, AodTracks const& inputTracks) - { - if (!coll.sel8()) { + // Calculating q_{r,s} as required + for (int i = 1; i < 7; i++) { + fTCP0[i] = powerEffProt[i] + powerEffAntiprot[i]; + fTCP1[i] = powerEffProt[i] - powerEffAntiprot[i]; + } + + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + float fQ11_1 = fTCP1[1]; + float fQ11_2 = std::pow(fTCP1[1], 2); + float fQ11_3 = std::pow(fTCP1[1], 3); + float fQ11_4 = std::pow(fTCP1[1], 4); + float fQ11_5 = std::pow(fTCP1[1], 5); + float fQ11_6 = std::pow(fTCP1[1], 6); + + float fQ21_3 = std::pow(fTCP0[1], 3); + float fQ22_3 = std::pow(fTCP0[2], 3); + float fQ31_2 = std::pow(fTCP1[1], 2); + float fQ32_2 = std::pow(fTCP1[2], 2); + float fQ33_2 = std::pow(fTCP1[3], 2); + + float fQ61_1 = fTCP0[1]; + float fQ62_1 = fTCP0[2]; + float fQ63_1 = fTCP0[3]; + float fQ64_1 = fTCP0[4]; + float fQ65_1 = fTCP0[5]; + float fQ66_1 = fTCP0[6]; + + float fQ112122_111 = fTCP1[1] * fTCP0[1] * fTCP0[2]; + float fQ112131_111 = fTCP1[1] * fTCP0[1] * fTCP1[1]; + float fQ112132_111 = fTCP1[1] * fTCP0[1] * fTCP1[2]; + float fQ112133_111 = fTCP1[1] * fTCP0[1] * fTCP1[3]; + float fQ112231_111 = fTCP1[1] * fTCP0[2] * fTCP1[1]; + float fQ112232_111 = fTCP1[1] * fTCP0[2] * fTCP1[2]; + float fQ112233_111 = fTCP1[1] * fTCP0[2] * fTCP1[3]; + float fQ112221_111 = fTCP1[1] * fTCP0[2] * fTCP0[1]; + + float fQ21_1 = fTCP0[1]; + float fQ22_1 = fTCP0[2]; + float fQ31_1 = fTCP1[1]; + float fQ32_1 = fTCP1[2]; + float fQ33_1 = fTCP1[3]; + float fQ41_1 = fTCP0[1]; + float fQ42_1 = fTCP0[2]; + float fQ43_1 = fTCP0[3]; + float fQ44_1 = fTCP0[4]; + float fQ21_2 = std::pow(fTCP0[1], 2); + float fQ22_2 = std::pow(fTCP0[2], 2); + float fQ1121_11 = fTCP1[1] * fTCP0[1]; + float fQ1121_01 = fTCP0[1]; + float fQ1121_10 = fTCP1[1]; + float fQ1121_20 = std::pow(fTCP1[1], 2); + float fQ1121_21 = std::pow(fTCP1[1], 2) * fTCP0[1]; + float fQ1122_11 = fTCP1[1] * fTCP0[2]; + float fQ1122_01 = fTCP0[2]; + float fQ1122_10 = fTCP1[1]; + float fQ1122_20 = std::pow(fTCP1[1], 2); + float fQ1122_21 = std::pow(fTCP1[1], 2) * fTCP0[2]; + float fQ1131_11 = fTCP1[1] * fTCP1[1]; + float fQ1131_01 = fTCP1[1]; + float fQ1131_10 = fTCP1[1]; + float fQ1132_11 = fTCP1[1] * fTCP1[2]; + float fQ1132_01 = fTCP1[2]; + float fQ1132_10 = fTCP1[1]; + float fQ1133_11 = fTCP1[1] * fTCP1[3]; + float fQ1133_01 = fTCP1[3]; + float fQ1133_10 = fTCP1[1]; + float fQ2122_11 = fTCP0[1] * fTCP0[2]; + float fQ2122_01 = fTCP0[2]; + float fQ2122_10 = fTCP0[1]; + + ///////////////---------------------> + float fQ3132_11 = fTCP1[1] * fTCP1[2]; + float fQ3132_01 = fTCP1[2]; + float fQ3132_10 = fTCP1[1]; + float fQ3133_11 = fTCP1[1] * fTCP1[3]; + float fQ3133_01 = fTCP1[3]; + float fQ3133_10 = fTCP1[1]; + float fQ3233_11 = fTCP1[2] * fTCP1[3]; + float fQ3233_01 = fTCP1[3]; + float fQ3233_10 = fTCP1[2]; + float fQ2241_11 = fTCP0[2] * fTCP0[1]; + float fQ2241_01 = fTCP0[1]; + float fQ2241_10 = fTCP0[2]; + float fQ2242_11 = fTCP0[2] * fTCP0[2]; + float fQ2242_01 = fTCP0[2]; + float fQ2242_10 = fTCP0[2]; + float fQ2243_11 = fTCP0[2] * fTCP0[3]; + float fQ2243_01 = fTCP0[3]; + float fQ2243_10 = fTCP0[2]; + float fQ2244_11 = fTCP0[2] * fTCP0[4]; + float fQ2244_01 = fTCP0[4]; + float fQ2244_10 = fTCP0[2]; + float fQ2141_11 = fTCP0[1] * fTCP0[1]; + float fQ2141_01 = fTCP0[1]; + float fQ2141_10 = fTCP0[1]; + float fQ2142_11 = fTCP0[1] * fTCP0[2]; + float fQ2142_01 = fTCP0[2]; + float fQ2142_10 = fTCP0[1]; + float fQ2143_11 = fTCP0[1] * fTCP0[3]; + float fQ2143_01 = fTCP0[3]; + float fQ2143_10 = fTCP0[1]; + float fQ2144_11 = fTCP0[1] * fTCP0[4]; + float fQ2144_01 = fTCP0[4]; + float fQ2144_10 = fTCP0[1]; + float fQ1151_11 = fTCP1[1] * fTCP1[1]; + float fQ1151_01 = fTCP1[1]; + float fQ1151_10 = fTCP1[1]; + float fQ1152_11 = fTCP1[1] * fTCP1[2]; + float fQ1152_01 = fTCP1[2]; + float fQ1152_10 = fTCP1[1]; + float fQ1153_11 = fTCP1[1] * fTCP1[3]; + float fQ1153_01 = fTCP1[3]; + float fQ1153_10 = fTCP1[1]; + float fQ1154_11 = fTCP1[1] * fTCP1[4]; + float fQ1154_01 = fTCP1[4]; + float fQ1154_10 = fTCP1[1]; + float fQ1155_11 = fTCP1[1] * fTCP1[5]; + float fQ1155_01 = fTCP1[5]; + float fQ1155_10 = fTCP1[1]; + + float fQ112233_001 = fTCP1[3]; + float fQ112233_010 = fTCP0[2]; + float fQ112233_100 = fTCP1[1]; + float fQ112233_011 = fTCP0[2] * fTCP1[3]; + float fQ112233_101 = fTCP1[1] * fTCP1[3]; + float fQ112233_110 = fTCP1[1] * fTCP0[2]; + float fQ112232_001 = fTCP1[2]; + float fQ112232_010 = fTCP0[2]; + float fQ112232_100 = fTCP1[1]; + float fQ112232_011 = fTCP0[2] * fTCP1[2]; + float fQ112232_101 = fTCP1[1] * fTCP1[2]; + float fQ112232_110 = fTCP1[1] * fTCP0[2]; + // + float fQ112231_001 = fTCP1[1]; + float fQ112231_010 = fTCP0[2]; + float fQ112231_100 = fTCP1[1]; + float fQ112231_011 = fTCP0[2] * fTCP1[1]; + float fQ112231_101 = fTCP1[1] * fTCP1[1]; + float fQ112231_110 = fTCP1[1] * fTCP0[2]; + float fQ112133_001 = fTCP1[3]; + float fQ112133_010 = fTCP0[1]; + float fQ112133_100 = fTCP1[1]; + float fQ112133_011 = fTCP0[1] * fTCP1[3]; + float fQ112133_101 = fTCP1[1] * fTCP1[3]; + float fQ112133_110 = fTCP1[1] * fTCP0[1]; + + float fQ112132_001 = fTCP1[2]; + float fQ112132_010 = fTCP0[1]; + float fQ112132_100 = fTCP1[1]; + float fQ112132_011 = fTCP0[1] * fTCP1[2]; + float fQ112132_101 = fTCP1[1] * fTCP1[2]; + float fQ112132_110 = fTCP1[1] * fTCP0[1]; + float fQ112131_001 = fTCP1[1]; + float fQ112131_010 = fTCP0[1]; + float fQ112131_100 = fTCP1[1]; + float fQ112131_011 = fTCP0[1] * fTCP1[1]; + float fQ112131_101 = fTCP1[1] * fTCP1[1]; + float fQ112131_110 = fTCP1[1] * fTCP0[1]; + + float fQ2221_11 = fTCP0[2] * fTCP0[1]; + float fQ2221_01 = fTCP0[1]; + float fQ2221_10 = fTCP0[2]; + float fQ2221_21 = std::pow(fTCP0[2], 2) * fTCP0[1]; + float fQ2221_20 = std::pow(fTCP0[2], 2); + + float fQ2122_21 = std::pow(fTCP0[1], 2) * fTCP0[2]; + float fQ2122_20 = std::pow(fTCP0[1], 2); + float fQ1121_02 = std::pow(fTCP0[1], 2); + float fQ1121_12 = fTCP1[1] * std::pow(fTCP0[1], 2); + float fQ1121_22 = std::pow(fTCP1[1], 2) * std::pow(fTCP0[1], 2); + float fQ1122_02 = std::pow(fTCP0[2], 2); + float fQ1122_12 = fTCP1[1] * std::pow(fTCP0[2], 2); + float fQ1122_22 = std::pow(fTCP1[1], 2) * std::pow(fTCP0[2], 2); + + float fQ112221_001 = fTCP0[1]; + float fQ112221_010 = fTCP0[2]; + float fQ112221_100 = fTCP1[1]; + float fQ112221_011 = fTCP0[2] * fTCP0[1]; + float fQ112221_101 = fTCP1[1] * fTCP0[1]; + float fQ112221_110 = fTCP1[1] * fTCP0[2]; + float fQ112221_200 = std::pow(fTCP1[1], 2); + float fQ112221_201 = std::pow(fTCP1[1], 2) * fTCP0[1]; + float fQ112221_210 = std::pow(fTCP1[1], 2) * fTCP0[2]; + float fQ112221_211 = std::pow(fTCP1[1], 2) * fTCP0[2] * fTCP0[1]; + float fQ1131_21 = std::pow(fTCP1[1], 2) * fTCP1[1]; + float fQ1131_20 = std::pow(fTCP1[1], 2); + float fQ1131_31 = std::pow(fTCP1[1], 3) * fTCP1[1]; + float fQ1131_30 = std::pow(fTCP1[1], 3); + + float fQ1132_21 = std::pow(fTCP1[1], 2) * fTCP1[2]; + float fQ1132_20 = std::pow(fTCP1[1], 2); + float fQ1132_31 = std::pow(fTCP1[1], 3) * fTCP1[2]; + float fQ1132_30 = std::pow(fTCP1[1], 3); + float fQ1133_21 = std::pow(fTCP1[1], 2) * fTCP1[3]; + float fQ1133_20 = std::pow(fTCP1[1], 2); + float fQ1133_31 = std::pow(fTCP1[1], 3) * fTCP1[3]; + float fQ1133_30 = std::pow(fTCP1[1], 3); + float fQ1121_30 = std::pow(fTCP1[1], 3); + float fQ1121_31 = std::pow(fTCP1[1], 3) * fTCP0[1]; + float fQ1121_40 = std::pow(fTCP1[1], 4); + float fQ1121_41 = std::pow(fTCP1[1], 4) * fTCP0[1]; + float fQ1122_30 = std::pow(fTCP1[1], 3); + float fQ1122_31 = std::pow(fTCP1[1], 3) * fTCP0[2]; + float fQ1122_40 = std::pow(fTCP1[1], 4); + float fQ1122_41 = std::pow(fTCP1[1], 4) * fTCP0[2]; + + float fQ2211_11 = fTCP0[2] * fTCP1[1]; + float fQ2211_01 = fTCP1[1]; + float fQ2211_10 = fTCP0[2]; + float fQ2211_20 = std::pow(fTCP0[2], 2); + float fQ2211_21 = std::pow(fTCP0[2], 2) * fTCP1[1]; + float fQ2111_11 = fTCP0[1] * fTCP1[1]; + float fQ2111_01 = fTCP1[1]; + float fQ2111_10 = fTCP0[1]; + float fQ2111_20 = std::pow(fTCP0[1], 2); + float fQ2111_21 = std::pow(fTCP0[1], 2) * fTCP1[1]; + + float fQ112122_001 = fTCP0[2]; + float fQ112122_010 = fTCP0[1]; + float fQ112122_100 = fTCP1[1]; + float fQ112122_011 = fTCP0[1] * fTCP0[2]; + float fQ112122_101 = fTCP1[1] * fTCP0[2]; + float fQ112122_110 = fTCP1[1] * fTCP0[1]; + + float fQ1141_11 = fTCP1[1] * fTCP0[1]; + float fQ1141_01 = fTCP0[1]; + float fQ1141_10 = fTCP1[1]; + float fQ1141_20 = std::pow(fTCP1[1], 2); + float fQ1141_21 = std::pow(fTCP1[1], 2) * fTCP0[1]; + float fQ1142_11 = fTCP1[1] * fTCP0[2]; + float fQ1142_01 = fTCP0[2]; + float fQ1142_10 = fTCP1[1]; + float fQ1142_20 = std::pow(fTCP1[1], 2); + float fQ1142_21 = std::pow(fTCP1[1], 2) * fTCP0[2]; + + float fQ1143_11 = fTCP1[1] * fTCP0[3]; + float fQ1143_01 = fTCP0[3]; + float fQ1143_10 = fTCP1[1]; + float fQ1143_20 = std::pow(fTCP1[1], 2); + float fQ1143_21 = std::pow(fTCP1[1], 2) * fTCP0[3]; + float fQ1144_11 = fTCP1[1] * fTCP0[4]; + float fQ1144_01 = fTCP0[4]; + float fQ1144_10 = fTCP1[1]; + float fQ1144_20 = std::pow(fTCP1[1], 2); + float fQ1144_21 = std::pow(fTCP1[1], 2) * fTCP0[4]; + float fQ2131_11 = fTCP0[1] * fTCP1[1]; + float fQ2131_01 = fTCP1[1]; + float fQ2131_10 = fTCP0[1]; + + float fQ2132_11 = fTCP0[1] * fTCP1[2]; + float fQ2132_01 = fTCP1[2]; + float fQ2132_10 = fTCP0[1]; + float fQ2133_11 = fTCP0[1] * fTCP1[3]; + float fQ2133_01 = fTCP1[3]; + float fQ2133_10 = fTCP0[1]; + float fQ2231_11 = fTCP0[2] * fTCP1[1]; + float fQ2231_01 = fTCP1[1]; + float fQ2231_10 = fTCP0[2]; + float fQ2232_11 = fTCP0[2] * fTCP1[2]; + float fQ2232_01 = fTCP1[2]; + float fQ2232_10 = fTCP0[2]; + float fQ2233_11 = fTCP0[2] * fTCP1[3]; + float fQ2233_01 = fTCP1[3]; + float fQ2233_10 = fTCP0[2]; + + float fQ51_1 = fTCP1[1]; + float fQ52_1 = fTCP1[2]; + float fQ53_1 = fTCP1[3]; + float fQ54_1 = fTCP1[4]; + float fQ55_1 = fTCP1[5]; + + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + if (cfgIsCalculateCentral) { + + // uncorrected + histos.get(HIST("Prof_mu1_netproton"))->Fill(cent, std::pow(netProt, 1.0)); + histos.get(HIST("Prof_mu2_netproton"))->Fill(cent, std::pow(netProt, 2.0)); + histos.get(HIST("Prof_mu3_netproton"))->Fill(cent, std::pow(netProt, 3.0)); + histos.get(HIST("Prof_mu4_netproton"))->Fill(cent, std::pow(netProt, 4.0)); + histos.get(HIST("Prof_mu5_netproton"))->Fill(cent, std::pow(netProt, 5.0)); + histos.get(HIST("Prof_mu6_netproton"))->Fill(cent, std::pow(netProt, 6.0)); + histos.get(HIST("Prof_mu7_netproton"))->Fill(cent, std::pow(netProt, 7.0)); + histos.get(HIST("Prof_mu8_netproton"))->Fill(cent, std::pow(netProt, 8.0)); + + // eff. corrected + histos.get(HIST("Prof_Q11_1"))->Fill(cent, fQ11_1); + histos.get(HIST("Prof_Q11_2"))->Fill(cent, fQ11_2); + histos.get(HIST("Prof_Q11_3"))->Fill(cent, fQ11_3); + histos.get(HIST("Prof_Q11_4"))->Fill(cent, fQ11_4); + histos.get(HIST("Prof_Q21_1"))->Fill(cent, fQ21_1); + histos.get(HIST("Prof_Q22_1"))->Fill(cent, fQ22_1); + histos.get(HIST("Prof_Q31_1"))->Fill(cent, fQ31_1); + histos.get(HIST("Prof_Q32_1"))->Fill(cent, fQ32_1); + histos.get(HIST("Prof_Q33_1"))->Fill(cent, fQ33_1); + histos.get(HIST("Prof_Q41_1"))->Fill(cent, fQ41_1); + histos.get(HIST("Prof_Q42_1"))->Fill(cent, fQ42_1); + histos.get(HIST("Prof_Q43_1"))->Fill(cent, fQ43_1); + histos.get(HIST("Prof_Q44_1"))->Fill(cent, fQ44_1); + histos.get(HIST("Prof_Q21_2"))->Fill(cent, fQ21_2); + histos.get(HIST("Prof_Q22_2"))->Fill(cent, fQ22_2); + histos.get(HIST("Prof_Q1121_11"))->Fill(cent, fQ1121_11); + histos.get(HIST("Prof_Q1121_01"))->Fill(cent, fQ1121_01); + histos.get(HIST("Prof_Q1121_10"))->Fill(cent, fQ1121_10); + histos.get(HIST("Prof_Q1121_20"))->Fill(cent, fQ1121_20); + histos.get(HIST("Prof_Q1121_21"))->Fill(cent, fQ1121_21); + histos.get(HIST("Prof_Q1122_11"))->Fill(cent, fQ1122_11); + histos.get(HIST("Prof_Q1122_01"))->Fill(cent, fQ1122_01); + histos.get(HIST("Prof_Q1122_10"))->Fill(cent, fQ1122_10); + histos.get(HIST("Prof_Q1122_20"))->Fill(cent, fQ1122_20); + histos.get(HIST("Prof_Q1122_21"))->Fill(cent, fQ1122_21); + histos.get(HIST("Prof_Q1131_11"))->Fill(cent, fQ1131_11); + histos.get(HIST("Prof_Q1131_01"))->Fill(cent, fQ1131_01); + histos.get(HIST("Prof_Q1131_10"))->Fill(cent, fQ1131_10); + histos.get(HIST("Prof_Q1132_11"))->Fill(cent, fQ1132_11); + histos.get(HIST("Prof_Q1132_01"))->Fill(cent, fQ1132_01); + histos.get(HIST("Prof_Q1132_10"))->Fill(cent, fQ1132_10); + histos.get(HIST("Prof_Q1133_11"))->Fill(cent, fQ1133_11); + histos.get(HIST("Prof_Q1133_01"))->Fill(cent, fQ1133_01); + histos.get(HIST("Prof_Q1133_10"))->Fill(cent, fQ1133_10); + histos.get(HIST("Prof_Q2122_11"))->Fill(cent, fQ2122_11); + histos.get(HIST("Prof_Q2122_01"))->Fill(cent, fQ2122_01); + histos.get(HIST("Prof_Q2122_10"))->Fill(cent, fQ2122_10); + histos.get(HIST("Prof_Q3132_11"))->Fill(cent, fQ3132_11); + histos.get(HIST("Prof_Q3132_01"))->Fill(cent, fQ3132_01); + histos.get(HIST("Prof_Q3132_10"))->Fill(cent, fQ3132_10); + histos.get(HIST("Prof_Q3133_11"))->Fill(cent, fQ3133_11); + histos.get(HIST("Prof_Q3133_01"))->Fill(cent, fQ3133_01); + histos.get(HIST("Prof_Q3133_10"))->Fill(cent, fQ3133_10); + histos.get(HIST("Prof_Q3233_11"))->Fill(cent, fQ3233_11); + histos.get(HIST("Prof_Q3233_01"))->Fill(cent, fQ3233_01); + histos.get(HIST("Prof_Q3233_10"))->Fill(cent, fQ3233_10); + histos.get(HIST("Prof_Q2241_11"))->Fill(cent, fQ2241_11); + histos.get(HIST("Prof_Q2241_01"))->Fill(cent, fQ2241_01); + histos.get(HIST("Prof_Q2241_10"))->Fill(cent, fQ2241_10); + histos.get(HIST("Prof_Q2242_11"))->Fill(cent, fQ2242_11); + histos.get(HIST("Prof_Q2242_01"))->Fill(cent, fQ2242_01); + histos.get(HIST("Prof_Q2242_10"))->Fill(cent, fQ2242_10); + histos.get(HIST("Prof_Q2243_11"))->Fill(cent, fQ2243_11); + histos.get(HIST("Prof_Q2243_01"))->Fill(cent, fQ2243_01); + histos.get(HIST("Prof_Q2243_10"))->Fill(cent, fQ2243_10); + histos.get(HIST("Prof_Q2244_11"))->Fill(cent, fQ2244_11); + histos.get(HIST("Prof_Q2244_01"))->Fill(cent, fQ2244_01); + histos.get(HIST("Prof_Q2244_10"))->Fill(cent, fQ2244_10); + histos.get(HIST("Prof_Q2141_11"))->Fill(cent, fQ2141_11); + histos.get(HIST("Prof_Q2141_01"))->Fill(cent, fQ2141_01); + histos.get(HIST("Prof_Q2141_10"))->Fill(cent, fQ2141_10); + histos.get(HIST("Prof_Q2142_11"))->Fill(cent, fQ2142_11); + histos.get(HIST("Prof_Q2142_01"))->Fill(cent, fQ2142_01); + histos.get(HIST("Prof_Q2142_10"))->Fill(cent, fQ2142_10); + histos.get(HIST("Prof_Q2143_11"))->Fill(cent, fQ2143_11); + histos.get(HIST("Prof_Q2143_01"))->Fill(cent, fQ2143_01); + histos.get(HIST("Prof_Q2143_10"))->Fill(cent, fQ2143_10); + histos.get(HIST("Prof_Q2144_11"))->Fill(cent, fQ2144_11); + histos.get(HIST("Prof_Q2144_01"))->Fill(cent, fQ2144_01); + histos.get(HIST("Prof_Q2144_10"))->Fill(cent, fQ2144_10); + histos.get(HIST("Prof_Q1151_11"))->Fill(cent, fQ1151_11); + histos.get(HIST("Prof_Q1151_01"))->Fill(cent, fQ1151_01); + histos.get(HIST("Prof_Q1151_10"))->Fill(cent, fQ1151_10); + histos.get(HIST("Prof_Q1152_11"))->Fill(cent, fQ1152_11); + histos.get(HIST("Prof_Q1152_01"))->Fill(cent, fQ1152_01); + histos.get(HIST("Prof_Q1152_10"))->Fill(cent, fQ1152_10); + histos.get(HIST("Prof_Q1153_11"))->Fill(cent, fQ1153_11); + histos.get(HIST("Prof_Q1153_01"))->Fill(cent, fQ1153_01); + histos.get(HIST("Prof_Q1153_10"))->Fill(cent, fQ1153_10); + histos.get(HIST("Prof_Q1154_11"))->Fill(cent, fQ1154_11); + histos.get(HIST("Prof_Q1154_01"))->Fill(cent, fQ1154_01); + histos.get(HIST("Prof_Q1154_10"))->Fill(cent, fQ1154_10); + histos.get(HIST("Prof_Q1155_11"))->Fill(cent, fQ1155_11); + histos.get(HIST("Prof_Q1155_01"))->Fill(cent, fQ1155_01); + histos.get(HIST("Prof_Q1155_10"))->Fill(cent, fQ1155_10); + histos.get(HIST("Prof_Q112233_001"))->Fill(cent, fQ112233_001); + histos.get(HIST("Prof_Q112233_010"))->Fill(cent, fQ112233_010); + histos.get(HIST("Prof_Q112233_100"))->Fill(cent, fQ112233_100); + histos.get(HIST("Prof_Q112233_011"))->Fill(cent, fQ112233_011); + histos.get(HIST("Prof_Q112233_101"))->Fill(cent, fQ112233_101); + histos.get(HIST("Prof_Q112233_110"))->Fill(cent, fQ112233_110); + histos.get(HIST("Prof_Q112232_001"))->Fill(cent, fQ112232_001); + histos.get(HIST("Prof_Q112232_010"))->Fill(cent, fQ112232_010); + histos.get(HIST("Prof_Q112232_100"))->Fill(cent, fQ112232_100); + histos.get(HIST("Prof_Q112232_011"))->Fill(cent, fQ112232_011); + histos.get(HIST("Prof_Q112232_101"))->Fill(cent, fQ112232_101); + histos.get(HIST("Prof_Q112232_110"))->Fill(cent, fQ112232_110); + histos.get(HIST("Prof_Q112231_001"))->Fill(cent, fQ112231_001); + histos.get(HIST("Prof_Q112231_010"))->Fill(cent, fQ112231_010); + histos.get(HIST("Prof_Q112231_100"))->Fill(cent, fQ112231_100); + histos.get(HIST("Prof_Q112231_011"))->Fill(cent, fQ112231_011); + histos.get(HIST("Prof_Q112231_101"))->Fill(cent, fQ112231_101); + histos.get(HIST("Prof_Q112231_110"))->Fill(cent, fQ112231_110); + histos.get(HIST("Prof_Q112133_001"))->Fill(cent, fQ112133_001); + histos.get(HIST("Prof_Q112133_010"))->Fill(cent, fQ112133_010); + histos.get(HIST("Prof_Q112133_100"))->Fill(cent, fQ112133_100); + histos.get(HIST("Prof_Q112133_011"))->Fill(cent, fQ112133_011); + histos.get(HIST("Prof_Q112133_101"))->Fill(cent, fQ112133_101); + histos.get(HIST("Prof_Q112133_110"))->Fill(cent, fQ112133_110); + histos.get(HIST("Prof_Q112132_001"))->Fill(cent, fQ112132_001); + histos.get(HIST("Prof_Q112132_010"))->Fill(cent, fQ112132_010); + histos.get(HIST("Prof_Q112132_100"))->Fill(cent, fQ112132_100); + histos.get(HIST("Prof_Q112132_011"))->Fill(cent, fQ112132_011); + histos.get(HIST("Prof_Q112132_101"))->Fill(cent, fQ112132_101); + histos.get(HIST("Prof_Q112132_110"))->Fill(cent, fQ112132_110); + histos.get(HIST("Prof_Q112131_001"))->Fill(cent, fQ112131_001); + histos.get(HIST("Prof_Q112131_010"))->Fill(cent, fQ112131_010); + histos.get(HIST("Prof_Q112131_100"))->Fill(cent, fQ112131_100); + histos.get(HIST("Prof_Q112131_011"))->Fill(cent, fQ112131_011); + histos.get(HIST("Prof_Q112131_101"))->Fill(cent, fQ112131_101); + histos.get(HIST("Prof_Q112131_110"))->Fill(cent, fQ112131_110); + histos.get(HIST("Prof_Q2221_11"))->Fill(cent, fQ2221_11); + histos.get(HIST("Prof_Q2221_01"))->Fill(cent, fQ2221_01); + histos.get(HIST("Prof_Q2221_10"))->Fill(cent, fQ2221_10); + histos.get(HIST("Prof_Q2221_21"))->Fill(cent, fQ2221_21); + histos.get(HIST("Prof_Q2221_20"))->Fill(cent, fQ2221_20); + histos.get(HIST("Prof_Q2122_21"))->Fill(cent, fQ2122_21); + histos.get(HIST("Prof_Q2122_20"))->Fill(cent, fQ2122_20); + histos.get(HIST("Prof_Q1121_02"))->Fill(cent, fQ1121_02); + histos.get(HIST("Prof_Q1121_12"))->Fill(cent, fQ1121_12); + histos.get(HIST("Prof_Q1121_22"))->Fill(cent, fQ1121_22); + histos.get(HIST("Prof_Q1122_02"))->Fill(cent, fQ1122_02); + histos.get(HIST("Prof_Q1122_12"))->Fill(cent, fQ1122_12); + histos.get(HIST("Prof_Q1122_22"))->Fill(cent, fQ1122_22); + histos.get(HIST("Prof_Q112221_001"))->Fill(cent, fQ112221_001); + histos.get(HIST("Prof_Q112221_010"))->Fill(cent, fQ112221_010); + histos.get(HIST("Prof_Q112221_100"))->Fill(cent, fQ112221_100); + histos.get(HIST("Prof_Q112221_011"))->Fill(cent, fQ112221_011); + histos.get(HIST("Prof_Q112221_101"))->Fill(cent, fQ112221_101); + histos.get(HIST("Prof_Q112221_110"))->Fill(cent, fQ112221_110); + histos.get(HIST("Prof_Q112221_200"))->Fill(cent, fQ112221_200); + histos.get(HIST("Prof_Q112221_201"))->Fill(cent, fQ112221_201); + histos.get(HIST("Prof_Q112221_210"))->Fill(cent, fQ112221_210); + histos.get(HIST("Prof_Q112221_211"))->Fill(cent, fQ112221_211); + histos.get(HIST("Prof_Q1131_21"))->Fill(cent, fQ1131_21); + histos.get(HIST("Prof_Q1131_20"))->Fill(cent, fQ1131_20); + histos.get(HIST("Prof_Q1131_31"))->Fill(cent, fQ1131_31); + histos.get(HIST("Prof_Q1131_30"))->Fill(cent, fQ1131_30); + histos.get(HIST("Prof_Q1132_21"))->Fill(cent, fQ1132_21); + histos.get(HIST("Prof_Q1132_20"))->Fill(cent, fQ1132_20); + histos.get(HIST("Prof_Q1132_31"))->Fill(cent, fQ1132_31); + histos.get(HIST("Prof_Q1132_30"))->Fill(cent, fQ1132_30); + histos.get(HIST("Prof_Q1133_21"))->Fill(cent, fQ1133_21); + histos.get(HIST("Prof_Q1133_20"))->Fill(cent, fQ1133_20); + histos.get(HIST("Prof_Q1133_31"))->Fill(cent, fQ1133_31); + histos.get(HIST("Prof_Q1133_30"))->Fill(cent, fQ1133_30); + histos.get(HIST("Prof_Q11_5"))->Fill(cent, fQ11_5); + histos.get(HIST("Prof_Q11_6"))->Fill(cent, fQ11_6); + histos.get(HIST("Prof_Q1121_30"))->Fill(cent, fQ1121_30); + histos.get(HIST("Prof_Q1121_31"))->Fill(cent, fQ1121_31); + histos.get(HIST("Prof_Q1121_40"))->Fill(cent, fQ1121_40); + histos.get(HIST("Prof_Q1121_41"))->Fill(cent, fQ1121_41); + histos.get(HIST("Prof_Q1122_30"))->Fill(cent, fQ1122_30); + histos.get(HIST("Prof_Q1122_31"))->Fill(cent, fQ1122_31); + histos.get(HIST("Prof_Q1122_40"))->Fill(cent, fQ1122_40); + histos.get(HIST("Prof_Q1122_41"))->Fill(cent, fQ1122_41); + histos.get(HIST("Prof_Q2211_11"))->Fill(cent, fQ2211_11); + histos.get(HIST("Prof_Q2211_01"))->Fill(cent, fQ2211_01); + histos.get(HIST("Prof_Q2211_10"))->Fill(cent, fQ2211_10); + histos.get(HIST("Prof_Q2211_20"))->Fill(cent, fQ2211_20); + histos.get(HIST("Prof_Q2211_21"))->Fill(cent, fQ2211_21); + histos.get(HIST("Prof_Q2111_11"))->Fill(cent, fQ2111_11); + histos.get(HIST("Prof_Q2111_01"))->Fill(cent, fQ2111_01); + histos.get(HIST("Prof_Q2111_10"))->Fill(cent, fQ2111_10); + histos.get(HIST("Prof_Q2111_20"))->Fill(cent, fQ2111_20); + histos.get(HIST("Prof_Q2111_21"))->Fill(cent, fQ2111_21); + histos.get(HIST("Prof_Q112122_001"))->Fill(cent, fQ112122_001); + histos.get(HIST("Prof_Q112122_010"))->Fill(cent, fQ112122_010); + histos.get(HIST("Prof_Q112122_100"))->Fill(cent, fQ112122_100); + histos.get(HIST("Prof_Q112122_011"))->Fill(cent, fQ112122_011); + histos.get(HIST("Prof_Q112122_101"))->Fill(cent, fQ112122_101); + histos.get(HIST("Prof_Q112122_110"))->Fill(cent, fQ112122_110); + histos.get(HIST("Prof_Q1141_11"))->Fill(cent, fQ1141_11); + histos.get(HIST("Prof_Q1141_01"))->Fill(cent, fQ1141_01); + histos.get(HIST("Prof_Q1141_10"))->Fill(cent, fQ1141_10); + histos.get(HIST("Prof_Q1141_20"))->Fill(cent, fQ1141_20); + histos.get(HIST("Prof_Q1141_21"))->Fill(cent, fQ1141_21); + histos.get(HIST("Prof_Q1142_11"))->Fill(cent, fQ1142_11); + histos.get(HIST("Prof_Q1142_01"))->Fill(cent, fQ1142_01); + histos.get(HIST("Prof_Q1142_10"))->Fill(cent, fQ1142_10); + histos.get(HIST("Prof_Q1142_20"))->Fill(cent, fQ1142_20); + histos.get(HIST("Prof_Q1142_21"))->Fill(cent, fQ1142_21); + histos.get(HIST("Prof_Q1143_11"))->Fill(cent, fQ1143_11); + histos.get(HIST("Prof_Q1143_01"))->Fill(cent, fQ1143_01); + histos.get(HIST("Prof_Q1143_10"))->Fill(cent, fQ1143_10); + histos.get(HIST("Prof_Q1143_20"))->Fill(cent, fQ1143_20); + histos.get(HIST("Prof_Q1143_21"))->Fill(cent, fQ1143_21); + histos.get(HIST("Prof_Q1144_11"))->Fill(cent, fQ1144_11); + histos.get(HIST("Prof_Q1144_01"))->Fill(cent, fQ1144_01); + histos.get(HIST("Prof_Q1144_10"))->Fill(cent, fQ1144_10); + histos.get(HIST("Prof_Q1144_20"))->Fill(cent, fQ1144_20); + histos.get(HIST("Prof_Q1144_21"))->Fill(cent, fQ1144_21); + histos.get(HIST("Prof_Q2131_11"))->Fill(cent, fQ2131_11); + histos.get(HIST("Prof_Q2131_01"))->Fill(cent, fQ2131_01); + histos.get(HIST("Prof_Q2131_10"))->Fill(cent, fQ2131_10); + histos.get(HIST("Prof_Q2132_11"))->Fill(cent, fQ2132_11); + histos.get(HIST("Prof_Q2132_01"))->Fill(cent, fQ2132_01); + histos.get(HIST("Prof_Q2132_10"))->Fill(cent, fQ2132_10); + histos.get(HIST("Prof_Q2133_11"))->Fill(cent, fQ2133_11); + histos.get(HIST("Prof_Q2133_01"))->Fill(cent, fQ2133_01); + histos.get(HIST("Prof_Q2133_10"))->Fill(cent, fQ2133_10); + histos.get(HIST("Prof_Q2231_11"))->Fill(cent, fQ2231_11); + histos.get(HIST("Prof_Q2231_01"))->Fill(cent, fQ2231_01); + histos.get(HIST("Prof_Q2231_10"))->Fill(cent, fQ2231_10); + histos.get(HIST("Prof_Q2232_11"))->Fill(cent, fQ2232_11); + histos.get(HIST("Prof_Q2232_01"))->Fill(cent, fQ2232_01); + histos.get(HIST("Prof_Q2232_10"))->Fill(cent, fQ2232_10); + histos.get(HIST("Prof_Q2233_11"))->Fill(cent, fQ2233_11); + histos.get(HIST("Prof_Q2233_01"))->Fill(cent, fQ2233_01); + histos.get(HIST("Prof_Q2233_10"))->Fill(cent, fQ2233_10); + histos.get(HIST("Prof_Q51_1"))->Fill(cent, fQ51_1); + histos.get(HIST("Prof_Q52_1"))->Fill(cent, fQ52_1); + histos.get(HIST("Prof_Q53_1"))->Fill(cent, fQ53_1); + histos.get(HIST("Prof_Q54_1"))->Fill(cent, fQ54_1); + histos.get(HIST("Prof_Q55_1"))->Fill(cent, fQ55_1); + histos.get(HIST("Prof_Q21_3"))->Fill(cent, fQ21_3); + histos.get(HIST("Prof_Q22_3"))->Fill(cent, fQ22_3); + histos.get(HIST("Prof_Q31_2"))->Fill(cent, fQ31_2); + histos.get(HIST("Prof_Q32_2"))->Fill(cent, fQ32_2); + histos.get(HIST("Prof_Q33_2"))->Fill(cent, fQ33_2); + histos.get(HIST("Prof_Q61_1"))->Fill(cent, fQ61_1); + histos.get(HIST("Prof_Q62_1"))->Fill(cent, fQ62_1); + histos.get(HIST("Prof_Q63_1"))->Fill(cent, fQ63_1); + histos.get(HIST("Prof_Q64_1"))->Fill(cent, fQ64_1); + histos.get(HIST("Prof_Q65_1"))->Fill(cent, fQ65_1); + histos.get(HIST("Prof_Q66_1"))->Fill(cent, fQ66_1); + histos.get(HIST("Prof_Q112122_111"))->Fill(cent, fQ112122_111); + histos.get(HIST("Prof_Q112131_111"))->Fill(cent, fQ112131_111); + histos.get(HIST("Prof_Q112132_111"))->Fill(cent, fQ112132_111); + histos.get(HIST("Prof_Q112133_111"))->Fill(cent, fQ112133_111); + histos.get(HIST("Prof_Q112231_111"))->Fill(cent, fQ112231_111); + histos.get(HIST("Prof_Q112232_111"))->Fill(cent, fQ112232_111); + histos.get(HIST("Prof_Q112233_111"))->Fill(cent, fQ112233_111); + histos.get(HIST("Prof_Q112221_111"))->Fill(cent, fQ112221_111); + } + + if (cfgIsCalculateError) { + // selecting subsample and filling profiles + float lRandom = fRndm->Rndm(); + int sampleIndex = static_cast(cfgNSubsample * lRandom); + + histos.get(HIST("Prof2D_mu1_netproton"))->Fill(cent, sampleIndex, std::pow(netProt, 1.0)); + histos.get(HIST("Prof2D_mu2_netproton"))->Fill(cent, sampleIndex, std::pow(netProt, 2.0)); + histos.get(HIST("Prof2D_mu3_netproton"))->Fill(cent, sampleIndex, std::pow(netProt, 3.0)); + histos.get(HIST("Prof2D_mu4_netproton"))->Fill(cent, sampleIndex, std::pow(netProt, 4.0)); + histos.get(HIST("Prof2D_mu5_netproton"))->Fill(cent, sampleIndex, std::pow(netProt, 5.0)); + histos.get(HIST("Prof2D_mu6_netproton"))->Fill(cent, sampleIndex, std::pow(netProt, 6.0)); + histos.get(HIST("Prof2D_mu7_netproton"))->Fill(cent, sampleIndex, std::pow(netProt, 7.0)); + histos.get(HIST("Prof2D_mu8_netproton"))->Fill(cent, sampleIndex, std::pow(netProt, 8.0)); + + histos.get(HIST("Prof2D_Q11_1"))->Fill(cent, sampleIndex, fQ11_1); + histos.get(HIST("Prof2D_Q11_2"))->Fill(cent, sampleIndex, fQ11_2); + histos.get(HIST("Prof2D_Q11_3"))->Fill(cent, sampleIndex, fQ11_3); + histos.get(HIST("Prof2D_Q11_4"))->Fill(cent, sampleIndex, fQ11_4); + histos.get(HIST("Prof2D_Q21_1"))->Fill(cent, sampleIndex, fQ21_1); + histos.get(HIST("Prof2D_Q22_1"))->Fill(cent, sampleIndex, fQ22_1); + histos.get(HIST("Prof2D_Q31_1"))->Fill(cent, sampleIndex, fQ31_1); + histos.get(HIST("Prof2D_Q32_1"))->Fill(cent, sampleIndex, fQ32_1); + histos.get(HIST("Prof2D_Q33_1"))->Fill(cent, sampleIndex, fQ33_1); + histos.get(HIST("Prof2D_Q41_1"))->Fill(cent, sampleIndex, fQ41_1); + histos.get(HIST("Prof2D_Q42_1"))->Fill(cent, sampleIndex, fQ42_1); + histos.get(HIST("Prof2D_Q43_1"))->Fill(cent, sampleIndex, fQ43_1); + histos.get(HIST("Prof2D_Q44_1"))->Fill(cent, sampleIndex, fQ44_1); + histos.get(HIST("Prof2D_Q21_2"))->Fill(cent, sampleIndex, fQ21_2); + histos.get(HIST("Prof2D_Q22_2"))->Fill(cent, sampleIndex, fQ22_2); + histos.get(HIST("Prof2D_Q1121_11"))->Fill(cent, sampleIndex, fQ1121_11); + histos.get(HIST("Prof2D_Q1121_01"))->Fill(cent, sampleIndex, fQ1121_01); + histos.get(HIST("Prof2D_Q1121_10"))->Fill(cent, sampleIndex, fQ1121_10); + histos.get(HIST("Prof2D_Q1121_20"))->Fill(cent, sampleIndex, fQ1121_20); + histos.get(HIST("Prof2D_Q1121_21"))->Fill(cent, sampleIndex, fQ1121_21); + histos.get(HIST("Prof2D_Q1122_11"))->Fill(cent, sampleIndex, fQ1122_11); + histos.get(HIST("Prof2D_Q1122_01"))->Fill(cent, sampleIndex, fQ1122_01); + histos.get(HIST("Prof2D_Q1122_10"))->Fill(cent, sampleIndex, fQ1122_10); + histos.get(HIST("Prof2D_Q1122_20"))->Fill(cent, sampleIndex, fQ1122_20); + histos.get(HIST("Prof2D_Q1122_21"))->Fill(cent, sampleIndex, fQ1122_21); + histos.get(HIST("Prof2D_Q1131_11"))->Fill(cent, sampleIndex, fQ1131_11); + histos.get(HIST("Prof2D_Q1131_01"))->Fill(cent, sampleIndex, fQ1131_01); + histos.get(HIST("Prof2D_Q1131_10"))->Fill(cent, sampleIndex, fQ1131_10); + histos.get(HIST("Prof2D_Q1132_11"))->Fill(cent, sampleIndex, fQ1132_11); + histos.get(HIST("Prof2D_Q1132_01"))->Fill(cent, sampleIndex, fQ1132_01); + histos.get(HIST("Prof2D_Q1132_10"))->Fill(cent, sampleIndex, fQ1132_10); + histos.get(HIST("Prof2D_Q1133_11"))->Fill(cent, sampleIndex, fQ1133_11); + histos.get(HIST("Prof2D_Q1133_01"))->Fill(cent, sampleIndex, fQ1133_01); + histos.get(HIST("Prof2D_Q1133_10"))->Fill(cent, sampleIndex, fQ1133_10); + histos.get(HIST("Prof2D_Q2122_11"))->Fill(cent, sampleIndex, fQ2122_11); + histos.get(HIST("Prof2D_Q2122_01"))->Fill(cent, sampleIndex, fQ2122_01); + histos.get(HIST("Prof2D_Q2122_10"))->Fill(cent, sampleIndex, fQ2122_10); + histos.get(HIST("Prof2D_Q3132_11"))->Fill(cent, sampleIndex, fQ3132_11); + histos.get(HIST("Prof2D_Q3132_01"))->Fill(cent, sampleIndex, fQ3132_01); + histos.get(HIST("Prof2D_Q3132_10"))->Fill(cent, sampleIndex, fQ3132_10); + histos.get(HIST("Prof2D_Q3133_11"))->Fill(cent, sampleIndex, fQ3133_11); + histos.get(HIST("Prof2D_Q3133_01"))->Fill(cent, sampleIndex, fQ3133_01); + histos.get(HIST("Prof2D_Q3133_10"))->Fill(cent, sampleIndex, fQ3133_10); + histos.get(HIST("Prof2D_Q3233_11"))->Fill(cent, sampleIndex, fQ3233_11); + histos.get(HIST("Prof2D_Q3233_01"))->Fill(cent, sampleIndex, fQ3233_01); + histos.get(HIST("Prof2D_Q3233_10"))->Fill(cent, sampleIndex, fQ3233_10); + histos.get(HIST("Prof2D_Q2241_11"))->Fill(cent, sampleIndex, fQ2241_11); + histos.get(HIST("Prof2D_Q2241_01"))->Fill(cent, sampleIndex, fQ2241_01); + histos.get(HIST("Prof2D_Q2241_10"))->Fill(cent, sampleIndex, fQ2241_10); + histos.get(HIST("Prof2D_Q2242_11"))->Fill(cent, sampleIndex, fQ2242_11); + histos.get(HIST("Prof2D_Q2242_01"))->Fill(cent, sampleIndex, fQ2242_01); + histos.get(HIST("Prof2D_Q2242_10"))->Fill(cent, sampleIndex, fQ2242_10); + histos.get(HIST("Prof2D_Q2243_11"))->Fill(cent, sampleIndex, fQ2243_11); + histos.get(HIST("Prof2D_Q2243_01"))->Fill(cent, sampleIndex, fQ2243_01); + histos.get(HIST("Prof2D_Q2243_10"))->Fill(cent, sampleIndex, fQ2243_10); + histos.get(HIST("Prof2D_Q2244_11"))->Fill(cent, sampleIndex, fQ2244_11); + histos.get(HIST("Prof2D_Q2244_01"))->Fill(cent, sampleIndex, fQ2244_01); + histos.get(HIST("Prof2D_Q2244_10"))->Fill(cent, sampleIndex, fQ2244_10); + histos.get(HIST("Prof2D_Q2141_11"))->Fill(cent, sampleIndex, fQ2141_11); + histos.get(HIST("Prof2D_Q2141_01"))->Fill(cent, sampleIndex, fQ2141_01); + histos.get(HIST("Prof2D_Q2141_10"))->Fill(cent, sampleIndex, fQ2141_10); + histos.get(HIST("Prof2D_Q2142_11"))->Fill(cent, sampleIndex, fQ2142_11); + histos.get(HIST("Prof2D_Q2142_01"))->Fill(cent, sampleIndex, fQ2142_01); + histos.get(HIST("Prof2D_Q2142_10"))->Fill(cent, sampleIndex, fQ2142_10); + histos.get(HIST("Prof2D_Q2143_11"))->Fill(cent, sampleIndex, fQ2143_11); + histos.get(HIST("Prof2D_Q2143_01"))->Fill(cent, sampleIndex, fQ2143_01); + histos.get(HIST("Prof2D_Q2143_10"))->Fill(cent, sampleIndex, fQ2143_10); + histos.get(HIST("Prof2D_Q2144_11"))->Fill(cent, sampleIndex, fQ2144_11); + histos.get(HIST("Prof2D_Q2144_01"))->Fill(cent, sampleIndex, fQ2144_01); + histos.get(HIST("Prof2D_Q2144_10"))->Fill(cent, sampleIndex, fQ2144_10); + histos.get(HIST("Prof2D_Q1151_11"))->Fill(cent, sampleIndex, fQ1151_11); + histos.get(HIST("Prof2D_Q1151_01"))->Fill(cent, sampleIndex, fQ1151_01); + histos.get(HIST("Prof2D_Q1151_10"))->Fill(cent, sampleIndex, fQ1151_10); + histos.get(HIST("Prof2D_Q1152_11"))->Fill(cent, sampleIndex, fQ1152_11); + histos.get(HIST("Prof2D_Q1152_01"))->Fill(cent, sampleIndex, fQ1152_01); + histos.get(HIST("Prof2D_Q1152_10"))->Fill(cent, sampleIndex, fQ1152_10); + histos.get(HIST("Prof2D_Q1153_11"))->Fill(cent, sampleIndex, fQ1153_11); + histos.get(HIST("Prof2D_Q1153_01"))->Fill(cent, sampleIndex, fQ1153_01); + histos.get(HIST("Prof2D_Q1153_10"))->Fill(cent, sampleIndex, fQ1153_10); + histos.get(HIST("Prof2D_Q1154_11"))->Fill(cent, sampleIndex, fQ1154_11); + histos.get(HIST("Prof2D_Q1154_01"))->Fill(cent, sampleIndex, fQ1154_01); + histos.get(HIST("Prof2D_Q1154_10"))->Fill(cent, sampleIndex, fQ1154_10); + histos.get(HIST("Prof2D_Q1155_11"))->Fill(cent, sampleIndex, fQ1155_11); + histos.get(HIST("Prof2D_Q1155_01"))->Fill(cent, sampleIndex, fQ1155_01); + histos.get(HIST("Prof2D_Q1155_10"))->Fill(cent, sampleIndex, fQ1155_10); + histos.get(HIST("Prof2D_Q112233_001"))->Fill(cent, sampleIndex, fQ112233_001); + histos.get(HIST("Prof2D_Q112233_010"))->Fill(cent, sampleIndex, fQ112233_010); + histos.get(HIST("Prof2D_Q112233_100"))->Fill(cent, sampleIndex, fQ112233_100); + histos.get(HIST("Prof2D_Q112233_011"))->Fill(cent, sampleIndex, fQ112233_011); + histos.get(HIST("Prof2D_Q112233_101"))->Fill(cent, sampleIndex, fQ112233_101); + histos.get(HIST("Prof2D_Q112233_110"))->Fill(cent, sampleIndex, fQ112233_110); + histos.get(HIST("Prof2D_Q112232_001"))->Fill(cent, sampleIndex, fQ112232_001); + histos.get(HIST("Prof2D_Q112232_010"))->Fill(cent, sampleIndex, fQ112232_010); + histos.get(HIST("Prof2D_Q112232_100"))->Fill(cent, sampleIndex, fQ112232_100); + histos.get(HIST("Prof2D_Q112232_011"))->Fill(cent, sampleIndex, fQ112232_011); + histos.get(HIST("Prof2D_Q112232_101"))->Fill(cent, sampleIndex, fQ112232_101); + histos.get(HIST("Prof2D_Q112232_110"))->Fill(cent, sampleIndex, fQ112232_110); + histos.get(HIST("Prof2D_Q112231_001"))->Fill(cent, sampleIndex, fQ112231_001); + histos.get(HIST("Prof2D_Q112231_010"))->Fill(cent, sampleIndex, fQ112231_010); + histos.get(HIST("Prof2D_Q112231_100"))->Fill(cent, sampleIndex, fQ112231_100); + histos.get(HIST("Prof2D_Q112231_011"))->Fill(cent, sampleIndex, fQ112231_011); + histos.get(HIST("Prof2D_Q112231_101"))->Fill(cent, sampleIndex, fQ112231_101); + histos.get(HIST("Prof2D_Q112231_110"))->Fill(cent, sampleIndex, fQ112231_110); + histos.get(HIST("Prof2D_Q112133_001"))->Fill(cent, sampleIndex, fQ112133_001); + histos.get(HIST("Prof2D_Q112133_010"))->Fill(cent, sampleIndex, fQ112133_010); + histos.get(HIST("Prof2D_Q112133_100"))->Fill(cent, sampleIndex, fQ112133_100); + histos.get(HIST("Prof2D_Q112133_011"))->Fill(cent, sampleIndex, fQ112133_011); + histos.get(HIST("Prof2D_Q112133_101"))->Fill(cent, sampleIndex, fQ112133_101); + histos.get(HIST("Prof2D_Q112133_110"))->Fill(cent, sampleIndex, fQ112133_110); + histos.get(HIST("Prof2D_Q112132_001"))->Fill(cent, sampleIndex, fQ112132_001); + histos.get(HIST("Prof2D_Q112132_010"))->Fill(cent, sampleIndex, fQ112132_010); + histos.get(HIST("Prof2D_Q112132_100"))->Fill(cent, sampleIndex, fQ112132_100); + histos.get(HIST("Prof2D_Q112132_011"))->Fill(cent, sampleIndex, fQ112132_011); + histos.get(HIST("Prof2D_Q112132_101"))->Fill(cent, sampleIndex, fQ112132_101); + histos.get(HIST("Prof2D_Q112132_110"))->Fill(cent, sampleIndex, fQ112132_110); + histos.get(HIST("Prof2D_Q112131_001"))->Fill(cent, sampleIndex, fQ112131_001); + histos.get(HIST("Prof2D_Q112131_010"))->Fill(cent, sampleIndex, fQ112131_010); + histos.get(HIST("Prof2D_Q112131_100"))->Fill(cent, sampleIndex, fQ112131_100); + histos.get(HIST("Prof2D_Q112131_011"))->Fill(cent, sampleIndex, fQ112131_011); + histos.get(HIST("Prof2D_Q112131_101"))->Fill(cent, sampleIndex, fQ112131_101); + histos.get(HIST("Prof2D_Q112131_110"))->Fill(cent, sampleIndex, fQ112131_110); + histos.get(HIST("Prof2D_Q2221_11"))->Fill(cent, sampleIndex, fQ2221_11); + histos.get(HIST("Prof2D_Q2221_01"))->Fill(cent, sampleIndex, fQ2221_01); + histos.get(HIST("Prof2D_Q2221_10"))->Fill(cent, sampleIndex, fQ2221_10); + histos.get(HIST("Prof2D_Q2221_21"))->Fill(cent, sampleIndex, fQ2221_21); + histos.get(HIST("Prof2D_Q2221_20"))->Fill(cent, sampleIndex, fQ2221_20); + histos.get(HIST("Prof2D_Q2122_21"))->Fill(cent, sampleIndex, fQ2122_21); + histos.get(HIST("Prof2D_Q2122_20"))->Fill(cent, sampleIndex, fQ2122_20); + histos.get(HIST("Prof2D_Q1121_02"))->Fill(cent, sampleIndex, fQ1121_02); + histos.get(HIST("Prof2D_Q1121_12"))->Fill(cent, sampleIndex, fQ1121_12); + histos.get(HIST("Prof2D_Q1121_22"))->Fill(cent, sampleIndex, fQ1121_22); + histos.get(HIST("Prof2D_Q1122_02"))->Fill(cent, sampleIndex, fQ1122_02); + histos.get(HIST("Prof2D_Q1122_12"))->Fill(cent, sampleIndex, fQ1122_12); + histos.get(HIST("Prof2D_Q1122_22"))->Fill(cent, sampleIndex, fQ1122_22); + histos.get(HIST("Prof2D_Q112221_001"))->Fill(cent, sampleIndex, fQ112221_001); + histos.get(HIST("Prof2D_Q112221_010"))->Fill(cent, sampleIndex, fQ112221_010); + histos.get(HIST("Prof2D_Q112221_100"))->Fill(cent, sampleIndex, fQ112221_100); + histos.get(HIST("Prof2D_Q112221_011"))->Fill(cent, sampleIndex, fQ112221_011); + histos.get(HIST("Prof2D_Q112221_101"))->Fill(cent, sampleIndex, fQ112221_101); + histos.get(HIST("Prof2D_Q112221_110"))->Fill(cent, sampleIndex, fQ112221_110); + histos.get(HIST("Prof2D_Q112221_200"))->Fill(cent, sampleIndex, fQ112221_200); + histos.get(HIST("Prof2D_Q112221_201"))->Fill(cent, sampleIndex, fQ112221_201); + histos.get(HIST("Prof2D_Q112221_210"))->Fill(cent, sampleIndex, fQ112221_210); + histos.get(HIST("Prof2D_Q112221_211"))->Fill(cent, sampleIndex, fQ112221_211); + histos.get(HIST("Prof2D_Q1131_21"))->Fill(cent, sampleIndex, fQ1131_21); + histos.get(HIST("Prof2D_Q1131_20"))->Fill(cent, sampleIndex, fQ1131_20); + histos.get(HIST("Prof2D_Q1131_31"))->Fill(cent, sampleIndex, fQ1131_31); + histos.get(HIST("Prof2D_Q1131_30"))->Fill(cent, sampleIndex, fQ1131_30); + histos.get(HIST("Prof2D_Q1132_21"))->Fill(cent, sampleIndex, fQ1132_21); + histos.get(HIST("Prof2D_Q1132_20"))->Fill(cent, sampleIndex, fQ1132_20); + histos.get(HIST("Prof2D_Q1132_31"))->Fill(cent, sampleIndex, fQ1132_31); + histos.get(HIST("Prof2D_Q1132_30"))->Fill(cent, sampleIndex, fQ1132_30); + histos.get(HIST("Prof2D_Q1133_21"))->Fill(cent, sampleIndex, fQ1133_21); + histos.get(HIST("Prof2D_Q1133_20"))->Fill(cent, sampleIndex, fQ1133_20); + histos.get(HIST("Prof2D_Q1133_31"))->Fill(cent, sampleIndex, fQ1133_31); + histos.get(HIST("Prof2D_Q1133_30"))->Fill(cent, sampleIndex, fQ1133_30); + histos.get(HIST("Prof2D_Q11_5"))->Fill(cent, sampleIndex, fQ11_5); + histos.get(HIST("Prof2D_Q11_6"))->Fill(cent, sampleIndex, fQ11_6); + histos.get(HIST("Prof2D_Q1121_30"))->Fill(cent, sampleIndex, fQ1121_30); + histos.get(HIST("Prof2D_Q1121_31"))->Fill(cent, sampleIndex, fQ1121_31); + histos.get(HIST("Prof2D_Q1121_40"))->Fill(cent, sampleIndex, fQ1121_40); + histos.get(HIST("Prof2D_Q1121_41"))->Fill(cent, sampleIndex, fQ1121_41); + histos.get(HIST("Prof2D_Q1122_30"))->Fill(cent, sampleIndex, fQ1122_30); + histos.get(HIST("Prof2D_Q1122_31"))->Fill(cent, sampleIndex, fQ1122_31); + histos.get(HIST("Prof2D_Q1122_40"))->Fill(cent, sampleIndex, fQ1122_40); + histos.get(HIST("Prof2D_Q1122_41"))->Fill(cent, sampleIndex, fQ1122_41); + histos.get(HIST("Prof2D_Q2211_11"))->Fill(cent, sampleIndex, fQ2211_11); + histos.get(HIST("Prof2D_Q2211_01"))->Fill(cent, sampleIndex, fQ2211_01); + histos.get(HIST("Prof2D_Q2211_10"))->Fill(cent, sampleIndex, fQ2211_10); + histos.get(HIST("Prof2D_Q2211_20"))->Fill(cent, sampleIndex, fQ2211_20); + histos.get(HIST("Prof2D_Q2211_21"))->Fill(cent, sampleIndex, fQ2211_21); + histos.get(HIST("Prof2D_Q2111_11"))->Fill(cent, sampleIndex, fQ2111_11); + histos.get(HIST("Prof2D_Q2111_01"))->Fill(cent, sampleIndex, fQ2111_01); + histos.get(HIST("Prof2D_Q2111_10"))->Fill(cent, sampleIndex, fQ2111_10); + histos.get(HIST("Prof2D_Q2111_20"))->Fill(cent, sampleIndex, fQ2111_20); + histos.get(HIST("Prof2D_Q2111_21"))->Fill(cent, sampleIndex, fQ2111_21); + histos.get(HIST("Prof2D_Q112122_001"))->Fill(cent, sampleIndex, fQ112122_001); + histos.get(HIST("Prof2D_Q112122_010"))->Fill(cent, sampleIndex, fQ112122_010); + histos.get(HIST("Prof2D_Q112122_100"))->Fill(cent, sampleIndex, fQ112122_100); + histos.get(HIST("Prof2D_Q112122_011"))->Fill(cent, sampleIndex, fQ112122_011); + histos.get(HIST("Prof2D_Q112122_101"))->Fill(cent, sampleIndex, fQ112122_101); + histos.get(HIST("Prof2D_Q112122_110"))->Fill(cent, sampleIndex, fQ112122_110); + histos.get(HIST("Prof2D_Q1141_11"))->Fill(cent, sampleIndex, fQ1141_11); + histos.get(HIST("Prof2D_Q1141_01"))->Fill(cent, sampleIndex, fQ1141_01); + histos.get(HIST("Prof2D_Q1141_10"))->Fill(cent, sampleIndex, fQ1141_10); + histos.get(HIST("Prof2D_Q1141_20"))->Fill(cent, sampleIndex, fQ1141_20); + histos.get(HIST("Prof2D_Q1141_21"))->Fill(cent, sampleIndex, fQ1141_21); + histos.get(HIST("Prof2D_Q1142_11"))->Fill(cent, sampleIndex, fQ1142_11); + histos.get(HIST("Prof2D_Q1142_01"))->Fill(cent, sampleIndex, fQ1142_01); + histos.get(HIST("Prof2D_Q1142_10"))->Fill(cent, sampleIndex, fQ1142_10); + histos.get(HIST("Prof2D_Q1142_20"))->Fill(cent, sampleIndex, fQ1142_20); + histos.get(HIST("Prof2D_Q1142_21"))->Fill(cent, sampleIndex, fQ1142_21); + histos.get(HIST("Prof2D_Q1143_11"))->Fill(cent, sampleIndex, fQ1143_11); + histos.get(HIST("Prof2D_Q1143_01"))->Fill(cent, sampleIndex, fQ1143_01); + histos.get(HIST("Prof2D_Q1143_10"))->Fill(cent, sampleIndex, fQ1143_10); + histos.get(HIST("Prof2D_Q1143_20"))->Fill(cent, sampleIndex, fQ1143_20); + histos.get(HIST("Prof2D_Q1143_21"))->Fill(cent, sampleIndex, fQ1143_21); + histos.get(HIST("Prof2D_Q1144_11"))->Fill(cent, sampleIndex, fQ1144_11); + histos.get(HIST("Prof2D_Q1144_01"))->Fill(cent, sampleIndex, fQ1144_01); + histos.get(HIST("Prof2D_Q1144_10"))->Fill(cent, sampleIndex, fQ1144_10); + histos.get(HIST("Prof2D_Q1144_20"))->Fill(cent, sampleIndex, fQ1144_20); + histos.get(HIST("Prof2D_Q1144_21"))->Fill(cent, sampleIndex, fQ1144_21); + histos.get(HIST("Prof2D_Q2131_11"))->Fill(cent, sampleIndex, fQ2131_11); + histos.get(HIST("Prof2D_Q2131_01"))->Fill(cent, sampleIndex, fQ2131_01); + histos.get(HIST("Prof2D_Q2131_10"))->Fill(cent, sampleIndex, fQ2131_10); + histos.get(HIST("Prof2D_Q2132_11"))->Fill(cent, sampleIndex, fQ2132_11); + histos.get(HIST("Prof2D_Q2132_01"))->Fill(cent, sampleIndex, fQ2132_01); + histos.get(HIST("Prof2D_Q2132_10"))->Fill(cent, sampleIndex, fQ2132_10); + histos.get(HIST("Prof2D_Q2133_11"))->Fill(cent, sampleIndex, fQ2133_11); + histos.get(HIST("Prof2D_Q2133_01"))->Fill(cent, sampleIndex, fQ2133_01); + histos.get(HIST("Prof2D_Q2133_10"))->Fill(cent, sampleIndex, fQ2133_10); + histos.get(HIST("Prof2D_Q2231_11"))->Fill(cent, sampleIndex, fQ2231_11); + histos.get(HIST("Prof2D_Q2231_01"))->Fill(cent, sampleIndex, fQ2231_01); + histos.get(HIST("Prof2D_Q2231_10"))->Fill(cent, sampleIndex, fQ2231_10); + histos.get(HIST("Prof2D_Q2232_11"))->Fill(cent, sampleIndex, fQ2232_11); + histos.get(HIST("Prof2D_Q2232_01"))->Fill(cent, sampleIndex, fQ2232_01); + histos.get(HIST("Prof2D_Q2232_10"))->Fill(cent, sampleIndex, fQ2232_10); + histos.get(HIST("Prof2D_Q2233_11"))->Fill(cent, sampleIndex, fQ2233_11); + histos.get(HIST("Prof2D_Q2233_01"))->Fill(cent, sampleIndex, fQ2233_01); + histos.get(HIST("Prof2D_Q2233_10"))->Fill(cent, sampleIndex, fQ2233_10); + histos.get(HIST("Prof2D_Q51_1"))->Fill(cent, sampleIndex, fQ51_1); + histos.get(HIST("Prof2D_Q52_1"))->Fill(cent, sampleIndex, fQ52_1); + histos.get(HIST("Prof2D_Q53_1"))->Fill(cent, sampleIndex, fQ53_1); + histos.get(HIST("Prof2D_Q54_1"))->Fill(cent, sampleIndex, fQ54_1); + histos.get(HIST("Prof2D_Q55_1"))->Fill(cent, sampleIndex, fQ55_1); + histos.get(HIST("Prof2D_Q21_3"))->Fill(cent, sampleIndex, fQ21_3); + histos.get(HIST("Prof2D_Q22_3"))->Fill(cent, sampleIndex, fQ22_3); + histos.get(HIST("Prof2D_Q31_2"))->Fill(cent, sampleIndex, fQ31_2); + histos.get(HIST("Prof2D_Q32_2"))->Fill(cent, sampleIndex, fQ32_2); + histos.get(HIST("Prof2D_Q33_2"))->Fill(cent, sampleIndex, fQ33_2); + histos.get(HIST("Prof2D_Q61_1"))->Fill(cent, sampleIndex, fQ61_1); + histos.get(HIST("Prof2D_Q62_1"))->Fill(cent, sampleIndex, fQ62_1); + histos.get(HIST("Prof2D_Q63_1"))->Fill(cent, sampleIndex, fQ63_1); + histos.get(HIST("Prof2D_Q64_1"))->Fill(cent, sampleIndex, fQ64_1); + histos.get(HIST("Prof2D_Q65_1"))->Fill(cent, sampleIndex, fQ65_1); + histos.get(HIST("Prof2D_Q66_1"))->Fill(cent, sampleIndex, fQ66_1); + histos.get(HIST("Prof2D_Q112122_111"))->Fill(cent, sampleIndex, fQ112122_111); + histos.get(HIST("Prof2D_Q112131_111"))->Fill(cent, sampleIndex, fQ112131_111); + histos.get(HIST("Prof2D_Q112132_111"))->Fill(cent, sampleIndex, fQ112132_111); + histos.get(HIST("Prof2D_Q112133_111"))->Fill(cent, sampleIndex, fQ112133_111); + histos.get(HIST("Prof2D_Q112231_111"))->Fill(cent, sampleIndex, fQ112231_111); + histos.get(HIST("Prof2D_Q112232_111"))->Fill(cent, sampleIndex, fQ112232_111); + histos.get(HIST("Prof2D_Q112233_111"))->Fill(cent, sampleIndex, fQ112233_111); + histos.get(HIST("Prof2D_Q112221_111"))->Fill(cent, sampleIndex, fQ112221_111); + } + } + PROCESS_SWITCH(NetprotonCumulantsMc, processMCRec, "Process Generated", true); + + void processDataRec(AodCollisions::iterator const& coll, aod::BCsWithTimestamps const&, AodTracks const& inputTracks) + { + if (!coll.sel8()) { + return; + } + + if (cfgEvSelkNoSameBunchPileup && !coll.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { + // rejects collisions which are associated with the same "found-by-T0" bunch crossing + // https://indico.cern.ch/event/1396220/#1-event-selection-with-its-rof return; } @@ -1695,14 +2598,14 @@ struct NetprotonCumulantsMc { float lRandom = fRndm->Rndm(); int sampleIndex = static_cast(cfgNSubsample * lRandom); - subsample[sampleIndex][0]->Fill(cent, std::pow(netProt, 1.0)); - subsample[sampleIndex][1]->Fill(cent, std::pow(netProt, 2.0)); - subsample[sampleIndex][2]->Fill(cent, std::pow(netProt, 3.0)); - subsample[sampleIndex][3]->Fill(cent, std::pow(netProt, 4.0)); - subsample[sampleIndex][4]->Fill(cent, std::pow(netProt, 5.0)); - subsample[sampleIndex][5]->Fill(cent, std::pow(netProt, 6.0)); - subsample[sampleIndex][6]->Fill(cent, std::pow(netProt, 7.0)); - subsample[sampleIndex][7]->Fill(cent, std::pow(netProt, 8.0)); + histos.get(HIST("Prof2D_mu1_netproton"))->Fill(cent, sampleIndex, std::pow(netProt, 1.0)); + histos.get(HIST("Prof2D_mu2_netproton"))->Fill(cent, sampleIndex, std::pow(netProt, 2.0)); + histos.get(HIST("Prof2D_mu3_netproton"))->Fill(cent, sampleIndex, std::pow(netProt, 3.0)); + histos.get(HIST("Prof2D_mu4_netproton"))->Fill(cent, sampleIndex, std::pow(netProt, 4.0)); + histos.get(HIST("Prof2D_mu5_netproton"))->Fill(cent, sampleIndex, std::pow(netProt, 5.0)); + histos.get(HIST("Prof2D_mu6_netproton"))->Fill(cent, sampleIndex, std::pow(netProt, 6.0)); + histos.get(HIST("Prof2D_mu7_netproton"))->Fill(cent, sampleIndex, std::pow(netProt, 7.0)); + histos.get(HIST("Prof2D_mu8_netproton"))->Fill(cent, sampleIndex, std::pow(netProt, 8.0)); histos.get(HIST("Prof2D_Q11_1"))->Fill(cent, sampleIndex, fQ11_1); histos.get(HIST("Prof2D_Q11_2"))->Fill(cent, sampleIndex, fQ11_2); From a4fac395328506a1f6f99c9e8e1a2ef679a84c67 Mon Sep 17 00:00:00 2001 From: hernasab Date: Tue, 4 Feb 2025 18:10:31 -0600 Subject: [PATCH 0036/1650] [PWGCF] adjusted o2 linter and correlations (#9755) Co-authored-by: Sabrina Hernandez --- PWGCF/Flow/Tasks/CMakeLists.txt | 2 +- .../{FlowZDCtask.cxx => flowZdcTask.cxx} | 117 ++++++++++++++---- 2 files changed, 94 insertions(+), 25 deletions(-) rename PWGCF/Flow/Tasks/{FlowZDCtask.cxx => flowZdcTask.cxx} (81%) diff --git a/PWGCF/Flow/Tasks/CMakeLists.txt b/PWGCF/Flow/Tasks/CMakeLists.txt index 2861fae80ad..98daea3d4d5 100644 --- a/PWGCF/Flow/Tasks/CMakeLists.txt +++ b/PWGCF/Flow/Tasks/CMakeLists.txt @@ -30,7 +30,7 @@ o2physics_add_dpl_workflow(flow-gfw-task COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(flow-zdc-task - SOURCES FlowZDCtask.cxx + SOURCES flowZdcTask.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::GFWCore COMPONENT_NAME Analysis) diff --git a/PWGCF/Flow/Tasks/FlowZDCtask.cxx b/PWGCF/Flow/Tasks/flowZdcTask.cxx similarity index 81% rename from PWGCF/Flow/Tasks/FlowZDCtask.cxx rename to PWGCF/Flow/Tasks/flowZdcTask.cxx index 7242974a02f..6ef4d78d9ca 100644 --- a/PWGCF/Flow/Tasks/FlowZDCtask.cxx +++ b/PWGCF/Flow/Tasks/flowZdcTask.cxx @@ -9,10 +9,11 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file FlowZDCtask.cxx +/// \file flowZdcTask.cxx /// \author Sabrina Hernandez /// \since 10/01/2024 /// \brief task to evaluate flow and neutron skin with information from ZDC + #include #include #include @@ -47,10 +48,13 @@ using AodCollisions = soa::Filtered>; using BCsRun3 = soa::Join; using AodZDCs = soa::Join; +using CollisionDataTable = soa::Join; +using TrackDataTable = soa::Join; +using FilTrackDataTable = soa::Filtered; #define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable NAME{#NAME, DEFAULT, HELP}; -struct FlowZDCtask { +struct FlowZdcTask { SliceCache cache; O2_DEFINE_CONFIGURABLE(cfgCutVertex, float, 10.0f, "Accepted z-vertex range") @@ -84,6 +88,27 @@ struct FlowZDCtask { Configurable acceptanceZnc{"acceptanceZnc", 0.90, "ZNC acceptance factor"}; Configurable acceptanceZpa{"acceptanceZpa", 0.52, "ZPA acceptance factor"}; Configurable acceptanceZpc{"acceptanceZpc", 0.50, "ZPC acceptance factor"}; + Configurable vtxRange{"vtxRange", 10.0f, "Vertex Z range to consider"}; + Configurable etaRange{"etaRange", 1.0f, "Eta range to consider"}; + Configurable npvTracksCut{"npvTracksCut", 1.0f, "Apply extra NPVtracks cut"}; + Configurable isApplySameBunchPileup{"isApplySameBunchPileup", true, "Enable SameBunchPileup cut"}; + Configurable isApplyGoodZvtxFT0vsPV{"isApplyGoodZvtxFT0vsPV", true, "Enable GoodZvtxFT0vsPV cut"}; + Configurable isApplyVertexITSTPC{"isApplyVertexITSTPC", true, "Enable VertexITSTPC cut"}; + Configurable isApplyVertexTOFmatched{"isApplyVertexTOFmatched", true, "Enable VertexTOFmatched cut"}; + Configurable isApplyVertexTRDmatched{"isApplyVertexTRDmatched", true, "Enable VertexTRDmatched cut"}; + Configurable isApplyExtraCorrCut{"isApplyExtraCorrCut", false, "Enable extra NPVtracks vs FTOC correlation cut"}; + Configurable isApplyExtraPhiCut{"isApplyExtraPhiCut", false, "Enable extra phi cut"}; + Configurable isApplyNoCollInTimeRangeStandard{"isApplyNoCollInTimeRangeStandard", true, "Enable NoCollInTimeRangeStandard cut"}; + Configurable isApplyNoCollInRofStandard{"isApplyNoCollInRofStandard", true, "Enable NoCollInRofStandard cut"}; + Configurable isApplyNoHighMultCollInPrevRof{"isApplyNoHighMultCollInPrevRof", true, "Enable NoHighMultCollInPrevRof cut"}; + Configurable isApplyFT0CbasedOccupancy{"isApplyFT0CbasedOccupancy", true, "Enable FT0CbasedOccupancy cut"}; + Configurable isApplyCentFT0C{"isApplyCentFT0C", false, "Centrality based on FT0C"}; + Configurable isApplyCentFT0CVariant1{"isApplyCentFT0CVariant1", false, "Centrality based on FT0C variant1"}; + Configurable isApplyCentFT0M{"isApplyCentFT0M", false, "Centrality based on FT0A + FT0C"}; + Configurable isApplyCentNGlobal{"isApplyCentNGlobal", false, "Centrality based on global tracks"}; + Configurable isApplyCentMFT{"isApplyCentMFT", false, "Centrality based on MFT tracks"}; + Configurable isGoodITSLayersAll{"isGoodITSLayersAll", true, "Centrality based on no other collisions in this Readout Frame with per-collision multiplicity above threshold tracks"}; + Configurable ft0cCut{"ft0cCut", 1.0f, "Apply extra FT0C cut"}; ConfigurableAxis axisVertex{"axisVertex", {20, -10, 10}, "vertex axis for histograms"}; ConfigurableAxis axisPhi{"axisPhi", {60, 0.0, constants::math::TwoPI}, "phi axis for histograms"}; @@ -97,6 +122,8 @@ struct FlowZDCtask { ConfigurableAxis axisFT0CAmp{"axisFT0CAmp", {5000, 0, 5000}, "axisFT0CAmp"}; ConfigurableAxis axisFT0AAmp{"axisFT0AAmp", {5000, 0, 5000}, "axisFT0AAmp"}; ConfigurableAxis axisFT0MAmp{"axisFT0MAmp", {10000, 0, 10000}, "axisFT0MAmp"}; + ConfigurableAxis ft0cMultHistBin{"ft0cMultHistBin", {501, -0.5, 500.5}, ""}; + ConfigurableAxis multHistBin{"multHistBin", {501, -0.5, 500.5}, ""}; Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls) && (nabs(aod::track::dcaZ) < cfgCutDCAz) && (nabs(aod::track::dcaXY) < cfgCutDCAxy); @@ -146,11 +173,14 @@ struct FlowZDCtask { const AxisSpec axisIMQ{100, -1, 1, "imag Q"}; AxisSpec axisVtxcounts{2, -0.5f, 1.5f, "Vtx info (0=no, 1=yes)"}; + AxisSpec axisVtxZ{40, -20, 20, "Vertex Z", "VzAxis"}; AxisSpec axisZvert{120, -30.f, 30.f, "Vtx z (cm)"}; AxisSpec axisCent{8, 0.f, 105.f, "centrality"}; AxisSpec axisCentBins{{0, 5., 10., 20., 30., 40., 50., 60., 70., 80.}, "centrality percentile"}; AxisSpec axisPtBins{{0., 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.25, 2.5, 2.75, 3.0, 3.5, 4.0, 4.5, 5.0, 6.0, 8.0, 10., 13., 16., 20.}, "p_{T} (GeV/c)"}; AxisSpec axisEvent{6, 0.5, 6.5, "#Event", "EventAxis"}; + AxisSpec axisMult = {multHistBin, "Mult", "MultAxis"}; + AxisSpec axisFT0CMult = {ft0cMultHistBin, "ft0c", "FT0CMultAxis"}; // create histograms histos.add("etaHistogram", "etaHistogram", kTH1F, {axisEta}); @@ -187,6 +217,16 @@ struct FlowZDCtask { histos.add("revsimag", "revsimag", kTH2F, {axisREQ, axisIMQ}); // for q vector recentering histos.add("hYield", "Nch vs pT", kTH2F, {axisMultiplicity, axisPt}); histos.add("eventSelectionSteps", "eventSelectionSteps", kTH1D, {axisEvent}); + auto hstat = histos.get(HIST("eventSelectionSteps")); + auto* xAxis = hstat->GetXaxis(); + xAxis->SetBinLabel(1, "All events"); + xAxis->SetBinLabel(2, "sel8"); + xAxis->SetBinLabel(3, "kNoSameBunchPileup"); // reject collisions in case of pileup with another collision in the same foundBC + xAxis->SetBinLabel(4, "kIsGoodZvtxFT0vsPV"); // small difference between z-vertex from PV and from FT0 + xAxis->SetBinLabel(5, "kIsVertexITSTPC"); // at least one ITS-TPC track (reject vertices built from ITS-only tracks) + xAxis->SetBinLabel(6, "kIsGoodITSLayersAll"); //"Centrality based on no other collisions in this Readout Frame with per-collision multiplicity above threshold tracks" + histos.add("GlobalMult_vs_FT0C", "GlobalMult_vs_FT0C", kTH2F, {axisMult, axisFT0CMult}); + histos.add("VtxZHist", "VtxZHist", kTH1D, {axisVtxZ}); if (doprocessZdcCollAssoc) { // Check if the process function for ZDCCollAssoc is enabled histos.add("ZNAcoll", "ZNAcoll; ZNA amplitude; Entries", {HistType::kTH1F, {{nBinsAmp, -0.5, maxZn}}}); @@ -230,29 +270,43 @@ struct FlowZDCtask { histos.add("hZPvsMult", "ZP Energy vs Multiplicity", kTH2F, {axisMultiplicity, axisZP}); } } - - void processQVector(AodCollisions::iterator const& collision, aod::BCsWithTimestamps const&, AodTracks const& tracks, BCsRun3 const& /*bcs*/, aod::Zdcs const& /*zdcsData*/, aod::ZDCMults const& /*zdcMults*/) + template + bool isEventSelected(EventCuts const& col) { histos.fill(HIST("eventSelectionSteps"), 1); - if (!collision.sel8()) - return; + if (!col.sel8()) { + return false; + } histos.fill(HIST("eventSelectionSteps"), 2); - if (!collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) - return; + if (isApplySameBunchPileup && !col.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { + return false; + } histos.fill(HIST("eventSelectionSteps"), 3); - if (!collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) - return; + if (isApplyGoodZvtxFT0vsPV && !col.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { + return false; + } histos.fill(HIST("eventSelectionSteps"), 4); - if (!collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) - return; + if (isApplyVertexITSTPC && !col.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) { + return false; + } histos.fill(HIST("eventSelectionSteps"), 5); + if (isGoodITSLayersAll && !col.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + return false; + } histos.fill(HIST("eventSelectionSteps"), 6); + return true; + } + void processQVector(AodCollisions::iterator const& collision, aod::BCsWithTimestamps const&, AodTracks const& tracks, BCsRun3 const& /*bcs*/, aod::Zdcs const& /*zdcsData*/, aod::ZDCMults const& /*zdcMults*/) + { + if (!isEventSelected(collision)) { + return; + } histos.fill(HIST("eventCounter"), 0.5); histos.fill(HIST("centHistogram"), collision.centFT0C()); const auto& tracksGrouped = tracksIUWithTPC->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); @@ -268,7 +322,7 @@ struct FlowZDCtask { for (const auto& track : tracks) { if (track.tpcNClsCrossedRows() < minTpcNcrossedRows) continue; - if (fabs(track.dcaXY()) > cfgCutDCAxy) + if (std::fabs(track.dcaXY()) > cfgCutDCAxy) continue; double phi = track.phi(); nTot++; @@ -281,7 +335,7 @@ struct FlowZDCtask { for (const auto& track : tracks) { if (track.tpcNClsCrossedRows() < minTpcNcrossedRows) continue; - if (fabs(track.dcaXY()) > cfgCutDCAxy) + if (std::fabs(track.dcaXY()) > cfgCutDCAxy) continue; pT = track.pt(); pT++; @@ -306,14 +360,9 @@ struct FlowZDCtask { aod::Zdcs const& /*zdcs*/, aod::FT0s const& /*ft0s*/) { - if (!collision.sel8()) - return; - if (!collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) - return; - if (!collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) - return; - if (!collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) + if (!isEventSelected(collision)) { return; + } int nTot = tracks.size(); double sumCosPsiDiff = 0.0; // initialize Sum of cosPsiDiff for averaging double sumSinPsiDiff = 0.0; // initialize Sum of cosPsiDiff for averaging @@ -441,13 +490,33 @@ struct FlowZDCtask { } } - PROCESS_SWITCH(FlowZDCtask, processZdcCollAssoc, "Processing ZDC w. collision association", true); - PROCESS_SWITCH(FlowZDCtask, processQVector, "Process before recentering", true); + void processCorrelation(CollisionDataTable::iterator const& collision, FilTrackDataTable const& tracks) + { + if (!isEventSelected(collision)) { + return; + } + if (std::abs(collision.posZ()) >= vtxRange) { + return; + } + histos.fill(HIST("VtxZHist"), collision.posZ()); + auto nchTracks = 0; + for (const auto& track : tracks) { + if (std::abs(track.eta()) >= etaRange) { + continue; + } + nchTracks++; + } + histos.fill(HIST("GlobalMult_vs_FT0C"), nchTracks, collision.multFT0C()); + } + + PROCESS_SWITCH(FlowZdcTask, processZdcCollAssoc, "Processing ZDC w. collision association", true); + PROCESS_SWITCH(FlowZdcTask, processQVector, "Process before recentering", true); + PROCESS_SWITCH(FlowZdcTask, processCorrelation, "Process correlations", true); }; // end of struct function WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc)}; + adaptAnalysisTask(cfgc)}; } From 79bc2935d9c6cdf8a449475132be9a0931f0f5d1 Mon Sep 17 00:00:00 2001 From: jaelpark Date: Wed, 5 Feb 2025 01:22:07 +0100 Subject: [PATCH 0037/1650] [PWGCF] JCorran updates (#9754) --- PWGCF/JCorran/Core/JFFlucAnalysis.cxx | 36 ++++++++++++++++++--- PWGCF/JCorran/Core/JFFlucAnalysis.h | 18 +++++++---- PWGCF/JCorran/Core/JFFlucAnalysisO2Hist.cxx | 22 ++++++------- PWGCF/JCorran/Core/JFFlucAnalysisO2Hist.h | 2 +- PWGCF/JCorran/Core/JQVectors.h | 2 +- PWGCF/JCorran/Tasks/jflucAnalysisTask.cxx | 8 +++-- PWGCF/JCorran/Tasks/jflucWeightsLoader.cxx | 6 ++-- PWGCF/TableProducer/filterCorrelations.cxx | 1 - 8 files changed, 63 insertions(+), 32 deletions(-) diff --git a/PWGCF/JCorran/Core/JFFlucAnalysis.cxx b/PWGCF/JCorran/Core/JFFlucAnalysis.cxx index a36ea857417..9dc4189a810 100644 --- a/PWGCF/JCorran/Core/JFFlucAnalysis.cxx +++ b/PWGCF/JCorran/Core/JFFlucAnalysis.cxx @@ -116,6 +116,13 @@ TComplex JFFlucAnalysis::Q(int n, int p) return n >= 0 ? pqvecs->QvectorQC[n][p] : C(pqvecs->QvectorQC[-n][p]); } +TComplex JFFlucAnalysis::Q(const JQVectorsT& qvecs, int n, int p) +{ + // Return QvectorQC + // Q{-n, p} = Q{n, p}* + return n >= 0 ? qvecs.QvectorQC[n][p] : C(qvecs.QvectorQC[-n][p]); +} + TComplex JFFlucAnalysis::Two(int n1, int n2) { // two-particle correlation @@ -124,9 +131,26 @@ TComplex JFFlucAnalysis::Two(int n1, int n2) TComplex JFFlucAnalysis::Four(int n1, int n2, int n3, int n4) { - return Q(n1, 1) * Q(n2, 1) * Q(n3, 1) * Q(n4, 1) - Q(n1 + n2, 2) * Q(n3, 1) * Q(n4, 1) - Q(n2, 1) * Q(n1 + n3, 2) * Q(n4, 1) - Q(n1, 1) * Q(n2 + n3, 2) * Q(n4, 1) + 2. * Q(n1 + n2 + n3, 3) * Q(n4, 1) - Q(n2, 1) * Q(n3, 1) * Q(n1 + n4, 2) + Q(n2 + n3, 2) * Q(n1 + n4, 2) - Q(n1, 1) * Q(n3, 1) * Q(n2 + n4, 2) + Q(n1 + n3, 2) * Q(n2 + n4, 2) + 2. * Q(n3, 1) * Q(n1 + n2 + n4, 3) - Q(n1, 1) * Q(n2, 1) * Q(n3 + n4, 2) + Q(n1 + n2, 2) * Q(n3 + n4, 2) + 2. * Q(n2, 1) * Q(n1 + n3 + n4, 3) + 2. * Q(n1, 1) * Q(n2 + n3 + n4, 3) - 6. * Q(n1 + n2 + n3 + n4, 4); } + +TComplex JFFlucAnalysis::TwoDiff(int n1, int n2) +{ +#define dp(n, p) Q(*pqvecs, n, p) // POI +#define dQ(n, p) Q(*pqvecsRef, n, p) // REF +#define dq(n, p) dp(n, p) //(dp(n,p)+dQ(n,p)) //POI+REF in narrow bin. Since there is no mass for ref, q = POI + // #define dq(n,p) (dp(n,p)+dQ(n,p)) //POI+REF in narrow bin. Since there is no mass for ref, q = POI + return dp(n1, 1) * dQ(n2, 1) - dq(n1 + n2, 2); +} + +TComplex JFFlucAnalysis::FourDiff(int n1, int n2, int n3, int n4) +{ + return dp(n1, 1) * dQ(n2, 1) * dQ(n3, 1) * dQ(n4, 1) - dq(n1 + n2, 2) * dQ(n3, 1) * dQ(n4, 1) - dq(n1 + n3, 2) * dQ(n2, 1) * dQ(n4, 1) - dp(n1, 1) * dQ(n2 + n3, 2) * dQ(n4, 1) + 2. * dq(n1 + n2 + n3, 3) * dQ(n4, 1) - dQ(n2, 1) * dQ(n3, 1) * dq(n1 + n4, 2) + dQ(n2 + n3, 2) * dq(n1 + n4, 2) - dp(n1, 1) * dQ(n3, 1) * dQ(n2 + n4, 2) + dq(n1 + n3, 2) * dQ(n2 + n4, 2) + 2. * dQ(n3, 1) * dq(n1 + n2 + n4, 3) - dp(n1, 1) * dQ(n2, 1) * dQ(n3 + n4, 2) + dq(n1 + n2, 2) * dQ(n3 + n4, 2) + 2. * dQ(n2, 1) * dq(n1 + n3 + n4, 3) + 2. * dp(n1, 1) * dQ(n2 + n3 + n4, 3) - 6. * dq(n1 + n2 + n3 + n4, 4); +} + +#undef dp +#undef dQ +#undef dq #undef C //________________________________________________________________________ @@ -296,19 +320,21 @@ void JFFlucAnalysis::UserExec(Option_t* /*popt*/) // NOLINT(readability/casting) } } + auto four = [&](int a, int b, int c, int d) -> TComplex { return pqvecsRef ? FourDiff(a, b, c, d) : Four(a, b, c, d); }; + auto two = [&](int a, int b) -> TComplex { return pqvecsRef ? TwoDiff(a, b) : Two(a, b); }; Double_t event_weight_four = 1.0; Double_t event_weight_two = 1.0; if (flags & kFlucEbEWeighting) { - event_weight_four = Four(0, 0, 0, 0).Re(); - event_weight_two = Two(0, 0).Re(); + event_weight_four = four(0, 0, 0, 0).Re(); + event_weight_two = two(0, 0).Re(); } for (UInt_t ih = 2; ih < kNH; ih++) { for (UInt_t ihh = 2, mm = (ih < kcNH ? ih : static_cast(kcNH)); ihh < mm; ihh++) { - TComplex scfour = Four(ih, ihh, -ih, -ihh) / Four(0, 0, 0, 0).Re(); + TComplex scfour = four(ih, ihh, -ih, -ihh) / four(0, 0, 0, 0).Re(); pht[HIST_THN_SC_with_QC_4corr]->Fill(fCent, fAvgInvariantMass, ih, ihh, scfour.Re(), event_weight_four); } - TComplex sctwo = Two(ih, -ih) / Two(0, 0).Re(); + TComplex sctwo = two(ih, -ih) / two(0, 0).Re(); pht[HIST_THN_SC_with_QC_2corr]->Fill(fCent, fAvgInvariantMass, ih, sctwo.Re(), event_weight_two); } } diff --git a/PWGCF/JCorran/Core/JFFlucAnalysis.h b/PWGCF/JCorran/Core/JFFlucAnalysis.h index 5388a5a96e3..01589a09849 100644 --- a/PWGCF/JCorran/Core/JFFlucAnalysis.h +++ b/PWGCF/JCorran/Core/JFFlucAnalysis.h @@ -37,6 +37,8 @@ class JFFlucAnalysis : public TNamed TComplex Q(int n, int p); TComplex Two(int n1, int n2); TComplex Four(int n1, int n2, int n3, int n4); + TComplex TwoDiff(int n1, int n2); + TComplex FourDiff(int n1, int n2, int n3, int n4); void UserExec(Option_t* option); void Terminate(Option_t*); @@ -124,6 +126,7 @@ class JFFlucAnalysis : public TNamed kK4, nKL }; // order using JQVectorsT = JQVectors; + TComplex Q(const JQVectorsT& qvecs, int n, int p); inline void SetJQVectors(const JQVectorsT* _pqvecs) { pqvecs = _pqvecs; @@ -140,10 +143,10 @@ class JFFlucAnalysis : public TNamed template using hasWeightEff = decltype(std::declval().weightEff()); template - using hasType = decltype(std::declval().particleType()); + using hasSign = decltype(std::declval().sign()); template - inline void FillQA(JInputClass& inputInst, UInt_t type = 0) + inline void FillQA(JInputClass& inputInst, UInt_t type = 0u) { ph1[HIST_TH1_CENTRALITY]->Fill(fCent); ph1[HIST_TH1_IMPACTPARAM]->Fill(fImpactParameter); @@ -153,19 +156,20 @@ class JFFlucAnalysis : public TNamed using JInputClassIter = typename JInputClass::iterator; if constexpr (std::experimental::is_detected::value) corrInv /= track.weightEff(); - pht[HIST_THN_PTETA]->Fill(fCent, track.pt(), track.eta(), corrInv); + if constexpr (std::experimental::is_detected::value) + pht[HIST_THN_PTETA]->Fill(fCent, track.pt(), track.eta(), track.sign(), corrInv); + else + pht[HIST_THN_PTETA]->Fill(fCent, track.pt(), track.eta(), 0.0, corrInv); if constexpr (std::experimental::is_detected::value) corrInv /= track.weightNUA(); pht[HIST_THN_PHIETA]->Fill(fCent, track.phi(), track.eta(), corrInv); - if constexpr (std::experimental::is_detected::value) - type = track.particleType(); pht[HIST_THN_PHIETAZ]->Fill(fCent, static_cast(type), track.phi(), track.eta(), fVertex, corrInv); } ph1[HIST_TH1_ZVERTEX]->Fill(fVertex); } -#define kcNH kH6 // max second dimension + 1 +#define kcNH kH4 // max second dimension + 1 protected: Float_t fVertex; //! Float_t fAvgInvariantMass; //! @@ -178,7 +182,7 @@ class JFFlucAnalysis : public TNamed const JQVectorsT* pqvecsRef; //! TH1* ph1[HIST_TH1_COUNT]; //! - THn* pht[HIST_THN_COUNT]; //! + THnSparse* pht[HIST_THN_COUNT]; //! THnSparse* phs[HIST_THN_SPARSE_COUNT]; //! ClassDef(JFFlucAnalysis, 1) diff --git a/PWGCF/JCorran/Core/JFFlucAnalysisO2Hist.cxx b/PWGCF/JCorran/Core/JFFlucAnalysisO2Hist.cxx index f6ad0dd9372..b3419ff7dc8 100644 --- a/PWGCF/JCorran/Core/JFFlucAnalysisO2Hist.cxx +++ b/PWGCF/JCorran/Core/JFFlucAnalysisO2Hist.cxx @@ -18,28 +18,26 @@ using namespace o2; -JFFlucAnalysisO2Hist::JFFlucAnalysisO2Hist(HistogramRegistry& registry, AxisSpec& axisMultiplicity, AxisSpec& phiAxis, AxisSpec& etaAxis, AxisSpec& zvtAxis, AxisSpec& massAxis, const TString& folder) : JFFlucAnalysis() +JFFlucAnalysisO2Hist::JFFlucAnalysisO2Hist(HistogramRegistry& registry, AxisSpec& axisMultiplicity, AxisSpec& phiAxis, AxisSpec& etaAxis, AxisSpec& zvtAxis, AxisSpec& ptAxis, AxisSpec& massAxis, const TString& folder) : JFFlucAnalysis() { ph1[HIST_TH1_CENTRALITY] = std::get>(registry.add(Form("%s/h_cent", folder.Data()), "multiplicity/centrality", {HistType::kTH1F, {axisMultiplicity}})).get(); ph1[HIST_TH1_IMPACTPARAM] = std::get>(registry.add(Form("%s/h_IP", folder.Data()), "impact parameter", {HistType::kTH1F, {{400, -2.0, 20.0}}})).get(); ph1[HIST_TH1_ZVERTEX] = std::get>(registry.add(Form("%s/h_vertex", folder.Data()), "z vertex", {HistType::kTH1F, {{100, -20.0, 20.0}}})).get(); - // - // TODO: these shall be configurable - std::vector ptBinning = {0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}; - AxisSpec ptAxis = {ptBinning, "#it{p}_{T} (GeV/c)"}; + + AxisSpec chgAxis = {3, -1.5, 1.5, "charge"}; AxisSpec typeAxis = {2, -0.5, 1.5, "type"}; - pht[HIST_THN_PHIETAZ] = std::get>(registry.add(Form("%s/h_phietaz", folder.Data()), "multiplicity/centrality, type, phi, eta, z", {HistType::kTHnF, {axisMultiplicity, typeAxis, phiAxis, etaAxis, zvtAxis}})).get(); - pht[HIST_THN_PTETA] = std::get>(registry.add(Form("%s/h_pteta", folder.Data()), "(corrected) multiplicity/centrality, pT, eta", {HistType::kTHnF, {axisMultiplicity, ptAxis, etaAxis}})).get(); - pht[HIST_THN_PHIETA] = std::get>(registry.add(Form("%s/h_phieta", folder.Data()), "(corrected) multiplicity/centrality, phi, eta", {HistType::kTHnF, {axisMultiplicity, phiAxis, etaAxis}})).get(); + pht[HIST_THN_PHIETAZ] = std::get>(registry.add(Form("%s/h_phietaz", folder.Data()), "multiplicity/centrality, type, phi, eta, z", {HistType::kTHnSparseF, {axisMultiplicity, typeAxis, phiAxis, etaAxis, zvtAxis}})).get(); + pht[HIST_THN_PTETA] = std::get>(registry.add(Form("%s/h_pteta", folder.Data()), "(corrected) multiplicity/centrality, pT, eta, charge", {HistType::kTHnSparseF, {axisMultiplicity, ptAxis, etaAxis, chgAxis}})).get(); + pht[HIST_THN_PHIETA] = std::get>(registry.add(Form("%s/h_phieta", folder.Data()), "(corrected) multiplicity/centrality, phi, eta", {HistType::kTHnSparseF, {axisMultiplicity, phiAxis, etaAxis}})).get(); AxisSpec hAxis = {kNH, -0.5, static_cast(kNH - 1) + 0.5, "#it{n}"}; AxisSpec kAxis = {nKL, -0.5, static_cast(nKL - 1) + 0.5, "#it{k}"}; AxisSpec vnAxis = {2048, -0.1, 0.1, "#it{V}_#it{n}"}; - pht[HIST_THN_SC_with_QC_4corr] = std::get>(registry.add(Form("%s/h_SC_with_QC_4corr", folder.Data()), "SC_with_QC_4corr", {HistType::kTHnF, {axisMultiplicity, massAxis, hAxis, hAxis, {2048, -0.001, 0.001, "correlation"}}})).get(); - pht[HIST_THN_SC_with_QC_2corr] = std::get>(registry.add(Form("%s/h_SC_with_QC_2corr", folder.Data()), "SC_with_QC_2corr", {HistType::kTHnF, {axisMultiplicity, massAxis, hAxis, {2048, -0.1, 0.1, "correlation"}}})).get(); - pht[HIST_THN_SC_with_QC_2corr_gap] = std::get>(registry.add(Form("%s/h_SC_with_QC_2corr_gap", folder.Data()), "SC_with_QC_2corr_gap", {HistType::kTHnF, {axisMultiplicity, massAxis, hAxis, {2048, -0.1, 0.1, "correlation"}}})).get(); + pht[HIST_THN_SC_with_QC_4corr] = std::get>(registry.add(Form("%s/h_SC_with_QC_4corr", folder.Data()), "SC_with_QC_4corr", {HistType::kTHnSparseF, {axisMultiplicity, massAxis, hAxis, hAxis, {2048, -0.001, 0.001, "correlation"}}})).get(); + pht[HIST_THN_SC_with_QC_2corr] = std::get>(registry.add(Form("%s/h_SC_with_QC_2corr", folder.Data()), "SC_with_QC_2corr", {HistType::kTHnSparseF, {axisMultiplicity, massAxis, hAxis, {2048, -0.1, 0.1, "correlation"}}})).get(); + pht[HIST_THN_SC_with_QC_2corr_gap] = std::get>(registry.add(Form("%s/h_SC_with_QC_2corr_gap", folder.Data()), "SC_with_QC_2corr_gap", {HistType::kTHnSparseF, {axisMultiplicity, massAxis, hAxis, {2048, -0.1, 0.1, "correlation"}}})).get(); for (UInt_t i = HIST_THN_V4V2star_2; i < HIST_THN_COUNT; ++i) - pht[i] = std::get>(registry.add(Form("%s/h_corrC%02u", folder.Data(), i - HIST_THN_V4V2star_2), "correlator", {HistType::kTHnF, {axisMultiplicity, massAxis, {2048, -3.0, 3.0, "correlation"}}})).get(); + pht[i] = std::get>(registry.add(Form("%s/h_corrC%02u", folder.Data(), i - HIST_THN_V4V2star_2), "correlator", {HistType::kTHnSparseF, {axisMultiplicity, massAxis, {2048, -3.0, 3.0, "correlation"}}})).get(); for (UInt_t i = 0; i < HIST_THN_COUNT; ++i) pht[i]->Sumw2(); diff --git a/PWGCF/JCorran/Core/JFFlucAnalysisO2Hist.h b/PWGCF/JCorran/Core/JFFlucAnalysisO2Hist.h index 561d7e0cc01..a9de2fd7864 100644 --- a/PWGCF/JCorran/Core/JFFlucAnalysisO2Hist.h +++ b/PWGCF/JCorran/Core/JFFlucAnalysisO2Hist.h @@ -23,7 +23,7 @@ using namespace o2::framework; class JFFlucAnalysisO2Hist : public JFFlucAnalysis { public: - JFFlucAnalysisO2Hist(HistogramRegistry&, AxisSpec&, AxisSpec&, AxisSpec&, AxisSpec&, AxisSpec&, const TString&); + JFFlucAnalysisO2Hist(HistogramRegistry&, AxisSpec&, AxisSpec&, AxisSpec&, AxisSpec&, AxisSpec&, AxisSpec&, const TString&); ~JFFlucAnalysisO2Hist(); }; diff --git a/PWGCF/JCorran/Core/JQVectors.h b/PWGCF/JCorran/Core/JQVectors.h index de92785b200..c96aac454b7 100644 --- a/PWGCF/JCorran/Core/JQVectors.h +++ b/PWGCF/JCorran/Core/JQVectors.h @@ -65,7 +65,7 @@ class JQVectors : public std::conditional_t, JQ continue; using JInputClassIter = typename JInputClass::iterator; if constexpr (std::experimental::is_detected::value) { - if (track.invMass() < massMin || track.invMass() > massMax) + if (track.invMass() < massMin || track.invMass() >= massMax) continue; } diff --git a/PWGCF/JCorran/Tasks/jflucAnalysisTask.cxx b/PWGCF/JCorran/Tasks/jflucAnalysisTask.cxx index 35e2de50869..54f8b902d61 100644 --- a/PWGCF/JCorran/Tasks/jflucAnalysisTask.cxx +++ b/PWGCF/JCorran/Tasks/jflucAnalysisTask.cxx @@ -57,6 +57,7 @@ struct jflucAnalysisTask { ConfigurableAxis phiAxis{"axisPhi", {50, 0.0, o2::constants::math::TwoPI}, "phi axis for histograms"}; ConfigurableAxis etaAxis{"axisEta", {40, -2.0, 2.0}, "eta axis for histograms"}; ConfigurableAxis zvtAxis{"axisZvt", {20, -10.0, 10.0}, "zvertex axis for histograms"}; + ConfigurableAxis ptAxis{"axisPt", {60, 0.0, 300.0}, "pt axis for histograms"}; ConfigurableAxis massAxis{"axisMass", {1, 0.0, 10.0}, "mass axis for histograms"}; Filter jtrackFilter = (aod::jtrack::pt > ptmin) && (aod::jtrack::pt < ptmax); // eta cuts done by jfluc @@ -71,16 +72,17 @@ struct jflucAnalysisTask { auto axisSpecPhi = AxisSpec(phiAxis); auto axisSpecEta = AxisSpec(etaAxis); auto axisSpecZvt = AxisSpec(zvtAxis); + auto axisSpecPt = AxisSpec(ptAxis); auto axisSpecMass = AxisSpec(massAxis); if (doprocessJDerived || doprocessJDerivedCorrected || doprocessCFDerived || doprocessCFDerivedCorrected) { - pcf = new JFFlucAnalysisO2Hist(registry, axisSpecMult, axisSpecPhi, axisSpecEta, axisSpecZvt, axisSpecMass, "jfluc"); + pcf = new JFFlucAnalysisO2Hist(registry, axisSpecMult, axisSpecPhi, axisSpecEta, axisSpecZvt, axisSpecPt, axisSpecMass, "jfluc"); pcf->AddFlags(JFFlucAnalysis::kFlucEbEWeighting); pcf->UserCreateOutputObjects(); } else { pcf = 0; } if (doprocessCF2ProngDerived || doprocessCF2ProngDerivedCorrected) { - pcf2Prong = new JFFlucAnalysisO2Hist(registry, axisSpecMult, axisSpecPhi, axisSpecEta, axisSpecZvt, axisSpecMass, "jfluc2prong"); + pcf2Prong = new JFFlucAnalysisO2Hist(registry, axisSpecMult, axisSpecPhi, axisSpecEta, axisSpecZvt, axisSpecPt, axisSpecMass, "jfluc2prong"); pcf2Prong->AddFlags(JFFlucAnalysis::kFlucEbEWeighting); pcf2Prong->UserCreateOutputObjects(); @@ -116,8 +118,8 @@ struct jflucAnalysisTask { pcf2Prong->Init(); pcf2Prong->SetEventCentrality(collision.multiplicity()); pcf2Prong->SetEventVertex(collision.posZ()); - pcf2Prong->FillQA(poiTracks, 1u); // type = 1, all POI tracks in this list are of the same type pcf2Prong->FillQA(refTracks, 0u); + pcf2Prong->FillQA(poiTracks, 1u); // type = 1, all POI tracks in this list are of the same type qvecsRef.Calculate(refTracks, etamin, etamax); pcf2Prong->SetJQVectors(&qvecs, &qvecsRef); const AxisSpec& a = AxisSpec(massAxis); diff --git a/PWGCF/JCorran/Tasks/jflucWeightsLoader.cxx b/PWGCF/JCorran/Tasks/jflucWeightsLoader.cxx index a7717b6c2f5..9e2203e8a02 100644 --- a/PWGCF/JCorran/Tasks/jflucWeightsLoader.cxx +++ b/PWGCF/JCorran/Tasks/jflucWeightsLoader.cxx @@ -12,6 +12,7 @@ /// \since May 2024 #include +#include #include #include @@ -94,7 +95,8 @@ struct jflucWeightsLoader { float phiWeight, effWeight; if (ph) { UInt_t partType = 0; // partType 0 = all charged hadrons - if constexpr (std::experimental::is_detected::value) { + // TODO: code below to be enabled + /*if constexpr (std::experimental::is_detected::value) { switch (track.decay()) { case aod::cf2prongtrack::D0ToPiK: case aod::cf2prongtrack::D0barToKPi: @@ -103,7 +105,7 @@ struct jflucWeightsLoader { default: break; } - } + }*/ const Double_t coords[] = {collision.multiplicity(), static_cast(partType), track.phi(), track.eta(), collision.posZ()}; phiWeight = ph->GetBinContent(ph->GetBin(coords)); } else { diff --git a/PWGCF/TableProducer/filterCorrelations.cxx b/PWGCF/TableProducer/filterCorrelations.cxx index e449cb3bbc4..3d424dc38bf 100644 --- a/PWGCF/TableProducer/filterCorrelations.cxx +++ b/PWGCF/TableProducer/filterCorrelations.cxx @@ -22,7 +22,6 @@ #include "Common/DataModel/Centrality.h" #include -#include using namespace o2; using namespace o2::framework; From 735d74efbd1a07a6b861c7d5a8e06e35352b0c57 Mon Sep 17 00:00:00 2001 From: nzardosh Date: Wed, 5 Feb 2025 03:06:15 +0100 Subject: [PATCH 0038/1650] =?UTF-8?q?[PWGJE]=20Making=20hadronic=20correct?= =?UTF-8?q?ions=20a=20part=20of=20the=20JE=20derived=20data=20and=20adding?= =?UTF-8?q?=20=E2=80=A6=20(#9671)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PWGJE/Core/FastJetUtilities.h | 22 +- PWGJE/Core/JetFindingUtilities.h | 4 +- PWGJE/Core/JetMatchingUtilities.h | 4 +- PWGJE/Core/JetSubstructureUtilities.h | 8 +- PWGJE/DataModel/Jet.h | 4 +- PWGJE/DataModel/JetReducedData.h | 16 +- .../emcalClusterHadronicCorrectionTask.h | 53 ---- PWGJE/JetFinders/jetFinder.cxx | 3 +- PWGJE/TableProducer/CMakeLists.txt | 5 + PWGJE/TableProducer/derivedDataProducer.cxx | 232 +++++++++--------- .../derivedDataProducerDummyCharged.cxx | 84 +++++++ PWGJE/TableProducer/derivedDataWriter.cxx | 9 +- .../emcalClusterHadronicCorrectionTask.cxx | 202 +++++++-------- PWGJE/Tasks/jetTutorial.cxx | 2 +- PWGJE/Tasks/statPromptPhoton.cxx | 2 +- 15 files changed, 353 insertions(+), 297 deletions(-) delete mode 100644 PWGJE/DataModel/emcalClusterHadronicCorrectionTask.h create mode 100644 PWGJE/TableProducer/derivedDataProducerDummyCharged.cxx diff --git a/PWGJE/Core/FastJetUtilities.h b/PWGJE/Core/FastJetUtilities.h index 01da286521b..e6d4b2b3794 100644 --- a/PWGJE/Core/FastJetUtilities.h +++ b/PWGJE/Core/FastJetUtilities.h @@ -103,11 +103,27 @@ void fillTracks(const T& constituent, std::vector& constitue */ template -void fillClusters(const T& constituent, std::vector& constituents, int index = -99999999, int status = static_cast(JetConstituentStatus::cluster)) +void fillClusters(const T& constituent, std::vector& constituents, int index = -99999999, int hadronicCorrectionType = 0, int status = static_cast(JetConstituentStatus::cluster)) { if (status == static_cast(JetConstituentStatus::cluster)) { - double clusterpt = constituent.energy() / std::cosh(constituent.eta()); - constituents.emplace_back(clusterpt * std::cos(constituent.phi()), clusterpt * std::sin(constituent.phi()), clusterpt * std::sinh(constituent.eta()), constituent.energy()); + float constituentEnergy = 0.0; + if (hadronicCorrectionType == 0) { + constituentEnergy = constituent.energy(); + } + if (hadronicCorrectionType == 1) { + constituentEnergy = constituent.energyCorrectedOneTrack1(); + } + if (hadronicCorrectionType == 2) { + constituentEnergy = constituent.energyCorrectedOneTrack2(); + } + if (hadronicCorrectionType == 3) { + constituentEnergy = constituent.energyCorrectedAllTracks1(); + } + if (hadronicCorrectionType == 4) { + constituentEnergy = constituent.energyCorrectedAllTracks2(); + } + float constituentPt = constituentEnergy / std::cosh(constituent.eta()); + constituents.emplace_back(constituentPt * std::cos(constituent.phi()), constituentPt * std::sin(constituent.phi()), constituentPt * std::sinh(constituent.eta()), constituentEnergy); } setFastJetUserInfo(constituents, index, status); } diff --git a/PWGJE/Core/JetFindingUtilities.h b/PWGJE/Core/JetFindingUtilities.h index c41bfbd4f0f..6fb2716965c 100644 --- a/PWGJE/Core/JetFindingUtilities.h +++ b/PWGJE/Core/JetFindingUtilities.h @@ -159,11 +159,11 @@ void analyseTracksMultipleCandidates(std::vector& inputParti * @param clusters track table to be added */ template -void analyseClusters(std::vector& inputParticles, T const& clusters) +void analyseClusters(std::vector& inputParticles, T const& clusters, int hadronicCorrectionType = 0) { for (auto& cluster : *clusters) { // add cluster selections - fastjetutilities::fillClusters(cluster, inputParticles, cluster.globalIndex()); + fastjetutilities::fillClusters(cluster, inputParticles, cluster.globalIndex(), hadronicCorrectionType); } } diff --git a/PWGJE/Core/JetMatchingUtilities.h b/PWGJE/Core/JetMatchingUtilities.h index 90885ca737a..3fb58d0128a 100644 --- a/PWGJE/Core/JetMatchingUtilities.h +++ b/PWGJE/Core/JetMatchingUtilities.h @@ -427,7 +427,7 @@ float getPtSum(T const& tracksBase, U const& clustersBase, V const& tracksTag, O if constexpr (isEMCAL) { if constexpr (jetsTagIsMc) { for (const auto& clusterBase : clustersBase) { - for (const auto& clusterBaseParticleId : clusterBase.mcParticleIds()) { + for (const auto& clusterBaseParticleId : clusterBase.mcParticlesIds()) { bool isClusterMatched = false; for (const auto& trackTag : tracksTag) { if (clusterBaseParticleId != -1 && clusterBaseParticleId == trackTag.globalIndex()) { @@ -450,7 +450,7 @@ float getPtSum(T const& tracksBase, U const& clustersBase, V const& tracksTag, O auto trackBaseId = trackBase.globalIndex(); for (const auto& clusterTag : clustersTag) { bool isClusterMatched = false; - for (const auto& clusterTagParticleId : clusterTag.mcParticleIds()) { + for (const auto& clusterTagParticleId : clusterTag.mcParticlesIds()) { if (trackBaseId != -1 && trackBaseId == clusterTagParticleId) { ptSum += trackBase.pt(); isClusterMatched = true; diff --git a/PWGJE/Core/JetSubstructureUtilities.h b/PWGJE/Core/JetSubstructureUtilities.h index cb714c1c5bf..a430d492be9 100644 --- a/PWGJE/Core/JetSubstructureUtilities.h +++ b/PWGJE/Core/JetSubstructureUtilities.h @@ -53,7 +53,7 @@ namespace jetsubstructureutilities * @param pseudoJet converted pseudoJet object which is passed by reference */ template -fastjet::ClusterSequenceArea jetToPseudoJet(T const& jet, U const& /*tracks*/, V const& /*clusters*/, O const& /*candidates*/, fastjet::PseudoJet& pseudoJet) +fastjet::ClusterSequenceArea jetToPseudoJet(T const& jet, U const& /*tracks*/, V const& /*clusters*/, O const& /*candidates*/, fastjet::PseudoJet& pseudoJet, int hadronicCorrectionType = 0) { std::vector jetConstituents; for (auto& jetConstituent : jet.template tracks_as()) { @@ -61,7 +61,7 @@ fastjet::ClusterSequenceArea jetToPseudoJet(T const& jet, U const& /*tracks*/, V } if constexpr (std::is_same_v, o2::aod::JetClusters::iterator> || std::is_same_v, o2::aod::JetClusters::filtered_iterator>) { for (auto& jetClusterConstituent : jet.template clusters_as()) { - fastjetutilities::fillClusters(jetClusterConstituent, jetConstituents, jetClusterConstituent.globalIndex()); + fastjetutilities::fillClusters(jetClusterConstituent, jetConstituents, jetClusterConstituent.globalIndex(), hadronicCorrectionType); } } if constexpr (jetcandidateutilities::isCandidateTable() || jetcandidateutilities::isCandidateMcTable()) { @@ -96,11 +96,11 @@ fastjet::ClusterSequenceArea jetToPseudoJet(T const& jet, U const& /*tracks*/, V // function that returns the N-subjettiness ratio and the distance betewwen the two axes considered for tau2, in the form of a vector template -std::vector getNSubjettiness(T const& jet, U const& tracks, V const& clusters, O const& candidates, std::vector::size_type nMax, M const& reclusteringAlgorithm, bool doSoftDrop = false, float zCut = 0.1, float beta = 0.0) +std::vector getNSubjettiness(T const& jet, U const& tracks, V const& clusters, O const& candidates, std::vector::size_type nMax, M const& reclusteringAlgorithm, bool doSoftDrop = false, float zCut = 0.1, float beta = 0.0, int hadronicCorrectionType = 0) { std::vector result; fastjet::PseudoJet pseudoJet; - fastjet::ClusterSequenceArea clusterSeq(jetToPseudoJet(jet, tracks, clusters, candidates, pseudoJet)); + fastjet::ClusterSequenceArea clusterSeq(jetToPseudoJet(jet, tracks, clusters, candidates, pseudoJet, hadronicCorrectionType)); if (doSoftDrop) { fastjet::contrib::SoftDrop softDrop(beta, zCut); pseudoJet = softDrop(pseudoJet); diff --git a/PWGJE/DataModel/Jet.h b/PWGJE/DataModel/Jet.h index 4fc48436928..fbc96669dd9 100644 --- a/PWGJE/DataModel/Jet.h +++ b/PWGJE/DataModel/Jet.h @@ -203,8 +203,8 @@ using JetCollisionMCD = o2::soa::Join::iterator; using JetTracks = JTracks; using JetTracksMCD = o2::soa::Join; using JetTracksSub = JTrackSubs; -using JetClusters = JClusters; -using JetClustersMCD = o2::soa::Join; +using JetClusters = o2::soa::Join; +using JetClustersMCD = o2::soa::Join; using JetMcCollisions = JMcCollisions; using JetMcCollision = JetMcCollisions::iterator; diff --git a/PWGJE/DataModel/JetReducedData.h b/PWGJE/DataModel/JetReducedData.h index cb93cfff445..fa1efd9d4dd 100644 --- a/PWGJE/DataModel/JetReducedData.h +++ b/PWGJE/DataModel/JetReducedData.h @@ -358,9 +358,23 @@ DECLARE_SOA_TABLE_STAGED(JClusterPIs, "JCLUSTERPI", DECLARE_SOA_TABLE_STAGED(JClusterTracks, "JCLUSTERTRACK", //! jcluster::JTrackIds); +namespace jclusterhadroniccorrection +{ +DECLARE_SOA_COLUMN(EnergyCorrectedOneTrack1, energyCorrectedOneTrack1, float); //! with hadronic correction fraction (100%) for one matched track +DECLARE_SOA_COLUMN(EnergyCorrectedOneTrack2, energyCorrectedOneTrack2, float); //! with hadronic correction fraction (70%) for one matched track - systematic studies +DECLARE_SOA_COLUMN(EnergyCorrectedAllTracks1, energyCorrectedAllTracks1, float); //! with hadronic correction fraction (100%) for all matched tracks +DECLARE_SOA_COLUMN(EnergyCorrectedAllTracks2, energyCorrectedAllTracks2, float); //! with hadronic correction fraction (70%) for all matched tracks - for systematic studies +} // namespace jclusterhadroniccorrection + +DECLARE_SOA_TABLE_STAGED(JClustersCorrectedEnergies, "JCLUSTERCORRE", //! if this table changes it needs to be reflected in FastJetUtilities.h!! + jclusterhadroniccorrection::EnergyCorrectedOneTrack1, // corrected cluster energy for 1 matched track (f = 100%) + jclusterhadroniccorrection::EnergyCorrectedOneTrack2, // corrected cluster energy for 1 matched track (f = 70%) + jclusterhadroniccorrection::EnergyCorrectedAllTracks1, // corrected cluster energy for all matched tracks (f = 100%) + jclusterhadroniccorrection::EnergyCorrectedAllTracks2); // corrected cluster energy for all matched tracks (f = 70%) + namespace jmcclusterlb { -DECLARE_SOA_ARRAY_INDEX_COLUMN(JMcParticle, mcParticle); +DECLARE_SOA_ARRAY_INDEX_COLUMN(JMcParticle, mcParticles); DECLARE_SOA_COLUMN(AmplitudeA, amplitudeA, std::vector); } // namespace jmcclusterlb diff --git a/PWGJE/DataModel/emcalClusterHadronicCorrectionTask.h b/PWGJE/DataModel/emcalClusterHadronicCorrectionTask.h deleted file mode 100644 index 42a6219b159..00000000000 --- a/PWGJE/DataModel/emcalClusterHadronicCorrectionTask.h +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. - -// **Hadronic Correction in the EMCAL framework: to avoid the double counting of the charged particles' contribution in jets** -/// \author Archita Rani Dash - -#ifndef PWGJE_DATAMODEL_EMCALCLUSTERHADRONICCORRECTION_H_ -#define PWGJE_DATAMODEL_EMCALCLUSTERHADRONICCORRECTION_H_ - -#include -#include "Framework/AnalysisDataModel.h" -#include "EMCALClusterDefinition.h" - -namespace o2::aod -{ - -namespace emcalhadroniccorrection -{ -// four different columns for the 'Cluster Energies after Hadronic Correction' to make it more flexible -// 2 for the closest match and 2 for all matched tracks - -// cluster values -// DECLARE_SOA_COLUMN(HadCorrEnergy, hadcorrEnergy, float); //! cluster energy (GeV) after hadronic correction - -// hadronic corrected energy values -DECLARE_SOA_COLUMN(HadCorrOneTrack1, hadCorrOneTrack1, float); //! with hadronic correction fraction (100%) for one matched track -DECLARE_SOA_COLUMN(HadCorrOneTrack2, hadCorrOneTrack2, float); //! with hadronic correction fraction (70%) for one matched track - systematic studies -DECLARE_SOA_COLUMN(HadCorrAllTracks1, hadCorrAllTracks1, float); //! with hadronic correction fraction (100%) for all matched tracks -DECLARE_SOA_COLUMN(HadCorrAllTracks2, hadCorrAllTracks2, float); //! with hadronic correction fraction (70%) for all matched tracks - for systematic studies - -} // namespace emcalhadroniccorrection - -// Table Definitions - define what needs to be written into the tables produced by this tableproducer task -DECLARE_SOA_TABLE(EmcalHCs, "AOD", "EMCALHCS", //! - o2::soa::Index<>, //! - emcalhadroniccorrection::HadCorrOneTrack1, // corrected cluster energy for 1 matched track (f = 100%) - emcalhadroniccorrection::HadCorrOneTrack2, // corrected cluster energy for 1 matched track (f = 70%) - emcalhadroniccorrection::HadCorrAllTracks1, // corrected cluster energy for all matched tracks (f = 100%) - emcalhadroniccorrection::HadCorrAllTracks2 // corrected cluster energy for all matched tracks (f = 70%) -) - -using EmcalHC = EmcalHCs::iterator; - -} // namespace o2::aod -#endif // PWGJE_DATAMODEL_EMCALCLUSTERHADRONICCORRECTION_H_ diff --git a/PWGJE/JetFinders/jetFinder.cxx b/PWGJE/JetFinders/jetFinder.cxx index c95d4d971df..c2a63538bf2 100644 --- a/PWGJE/JetFinders/jetFinder.cxx +++ b/PWGJE/JetFinders/jetFinder.cxx @@ -65,6 +65,7 @@ struct JetFinderTask { Configurable clusterTimeMin{"clusterTimeMin", -25., "minimum Cluster time (ns)"}; Configurable clusterTimeMax{"clusterTimeMax", 25., "maximum Cluster time (ns)"}; Configurable clusterRejectExotics{"clusterRejectExotics", true, "Reject exotic clusters"}; + Configurable hadronicCorrectionType{"hadronicCorrectionType", 0, "0 = no correction, 1 = CorrectedOneTrack1, 2 = CorrectedOneTrack2, 3 = CorrectedAllTracks1, 4 = CorrectedAllTracks2"}; Configurable doEMCALEventSelection{"doEMCALEventSelection", true, "apply the selection to the event alias_bit for full and neutral jets"}; Configurable doEMCALEventSelectionChargedJets{"doEMCALEventSelectionChargedJets", false, "apply the selection to the event alias_bit for charged jets"}; @@ -195,7 +196,7 @@ struct JetFinderTask { } inputParticles.clear(); jetfindingutilities::analyseTracks, soa::Filtered::iterator>(inputParticles, tracks, trackSelection, trackingEfficiency); - jetfindingutilities::analyseClusters(inputParticles, &clusters); + jetfindingutilities::analyseClusters(inputParticles, &clusters, hadronicCorrectionType); jetfindingutilities::findJets(jetFinder, inputParticles, jetPtMin, jetPtMax, jetRadius, jetAreaFractionMin, collision, jetsTable, constituentsTable, fillTHnSparse ? registry.get(HIST("hJet")) : std::shared_ptr(nullptr), fillTHnSparse); } PROCESS_SWITCH(JetFinderTask, processFullJets, "Data and reco level jet finding for full and neutral jets", false); diff --git a/PWGJE/TableProducer/CMakeLists.txt b/PWGJE/TableProducer/CMakeLists.txt index 51d8a51bb2e..c946a8722e5 100644 --- a/PWGJE/TableProducer/CMakeLists.txt +++ b/PWGJE/TableProducer/CMakeLists.txt @@ -28,6 +28,11 @@ o2physics_add_dpl_workflow(jet-deriveddata-producer-dummy PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(jet-deriveddata-producer-dummy-charged + SOURCES derivedDataProducerDummyCharged.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(jet-deriveddata-producer-dummy-d0 SOURCES derivedDataProducerDummyD0.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore diff --git a/PWGJE/TableProducer/derivedDataProducer.cxx b/PWGJE/TableProducer/derivedDataProducer.cxx index 8716a6e1ece..ccd31ad1e92 100644 --- a/PWGJE/TableProducer/derivedDataProducer.cxx +++ b/PWGJE/TableProducer/derivedDataProducer.cxx @@ -58,53 +58,55 @@ using namespace o2::framework; using namespace o2::framework::expressions; struct JetDerivedDataProducerTask { - Produces bcCountsTable; - Produces collisionCountsTable; - Produces jDummysTable; - Produces jBCsTable; - Produces jBCParentIndexTable; - Produces jCollisionsTable; - Produces jCollisionMcInfosTable; - Produces jCollisionsParentIndexTable; - Produces jCollisionsBunchCrossingIndexTable; - Produces jCollisionsEMCalLabelTable; - Produces jMcCollisionsLabelTable; - Produces jMcCollisionsTable; - Produces jMcCollisionsParentIndexTable; - Produces jTracksTable; - Produces jTracksExtraTable; - Produces jTracksEMCalTable; - Produces jTracksParentIndexTable; - Produces jMcTracksLabelTable; - Produces jMcParticlesTable; - Produces jParticlesParentIndexTable; - Produces jClustersTable; - Produces jClustersParentIndexTable; - Produces jClustersMatchedTracksTable; - Produces jMcClustersLabelTable; - Produces jD0CollisionIdsTable; - Produces jD0McCollisionIdsTable; - Produces jD0IdsTable; - Produces jD0ParticleIdsTable; - Produces jLcCollisionIdsTable; - Produces jLcMcCollisionIdsTable; - Produces jLcIdsTable; - Produces jLcParticleIdsTable; - Produces jBplusCollisionIdsTable; - Produces jBplusMcCollisionIdsTable; - Produces jBplusIdsTable; - Produces jBplusParticleIdsTable; - Produces jV0IdsTable; - Produces jV0McCollisionsTable; - Produces jV0McCollisionIdsTable; - Produces jV0McsTable; - Produces jV0McIdsTable; - Produces jDielectronCollisionIdsTable; - Produces jDielectronIdsTable; - Produces jDielectronMcCollisionsTable; - Produces jDielectronMcCollisionIdsTable; - Produces jDielectronMcsTable; - Produces jDielectronMcIdsTable; + struct : ProducesGroup { + Produces bcCountsTable; + Produces collisionCountsTable; + Produces jDummysTable; + Produces jBCsTable; + Produces jBCParentIndexTable; + Produces jCollisionsTable; + Produces jCollisionMcInfosTable; + Produces jCollisionsParentIndexTable; + Produces jCollisionsBunchCrossingIndexTable; + Produces jCollisionsEMCalLabelTable; + Produces jMcCollisionsLabelTable; + Produces jMcCollisionsTable; + Produces jMcCollisionsParentIndexTable; + Produces jTracksTable; + Produces jTracksExtraTable; + Produces jTracksEMCalTable; + Produces jTracksParentIndexTable; + Produces jMcTracksLabelTable; + Produces jMcParticlesTable; + Produces jParticlesParentIndexTable; + Produces jClustersTable; + Produces jClustersParentIndexTable; + Produces jClustersMatchedTracksTable; + Produces jMcClustersLabelTable; + Produces jD0CollisionIdsTable; + Produces jD0McCollisionIdsTable; + Produces jD0IdsTable; + Produces jD0ParticleIdsTable; + Produces jLcCollisionIdsTable; + Produces jLcMcCollisionIdsTable; + Produces jLcIdsTable; + Produces jLcParticleIdsTable; + Produces jBplusCollisionIdsTable; + Produces jBplusMcCollisionIdsTable; + Produces jBplusIdsTable; + Produces jBplusParticleIdsTable; + Produces jV0IdsTable; + Produces jV0McCollisionsTable; + Produces jV0McCollisionIdsTable; + Produces jV0McsTable; + Produces jV0McIdsTable; + Produces jDielectronCollisionIdsTable; + Produces jDielectronIdsTable; + Produces jDielectronMcCollisionsTable; + Produces jDielectronMcCollisionIdsTable; + Produces jDielectronMcsTable; + Produces jDielectronMcIdsTable; + } products; Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Configurable ccdbPathLut{"ccdbPathLut", "GLO/Param/MatLUT", "Path for LUT parametrization"}; @@ -149,7 +151,7 @@ struct JetDerivedDataProducerTask { trackCollisionMapping.clear(); if (!doprocessMcCollisionLabels) { for (int i = 0; i < collisions.size(); i++) { - jCollisionMcInfosTable(-1.0, jetderiveddatautilities::JCollisionSubGeneratorId::none); // fill a dummy weights table if not MC + products.jCollisionMcInfosTable(-1.0, jetderiveddatautilities::JCollisionSubGeneratorId::none); // fill a dummy weights table if not MC } } } @@ -157,8 +159,8 @@ struct JetDerivedDataProducerTask { void processBunchCrossings(soa::Join::iterator const& bc) { - jBCsTable(bc.runNumber(), bc.globalBC(), bc.timestamp(), bc.alias_raw(), bc.selection_raw()); - jBCParentIndexTable(bc.globalIndex()); + products.jBCsTable(bc.runNumber(), bc.globalBC(), bc.timestamp(), bc.alias_raw(), bc.selection_raw()); + products.jBCParentIndexTable(bc.globalIndex()); } PROCESS_SWITCH(JetDerivedDataProducerTask, processBunchCrossings, "produces derived bunch crossing table", false); @@ -170,9 +172,9 @@ struct JetDerivedDataProducerTask { triggerDecider.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), jetderiveddatautilities::JTriggerMasks); triggerBit = jetderiveddatautilities::setTriggerSelectionBit(triggerDecider.getTriggerOfInterestResults(bc.globalBC())); } - jCollisionsTable(collision.posX(), collision.posY(), collision.posZ(), collision.multFT0C(), collision.centFT0C(), collision.trackOccupancyInTimeRange(), jetderiveddatautilities::setEventSelectionBit(collision), collision.alias_raw(), triggerBit); // note change multFT0C to multFT0M when problems with multFT0A are fixed - jCollisionsParentIndexTable(collision.globalIndex()); - jCollisionsBunchCrossingIndexTable(collision.bcId()); + products.jCollisionsTable(collision.posX(), collision.posY(), collision.posZ(), collision.multFT0C(), collision.centFT0C(), collision.trackOccupancyInTimeRange(), jetderiveddatautilities::setEventSelectionBit(collision), collision.alias_raw(), triggerBit); // note change multFT0C to multFT0M when problems with multFT0A are fixed + products.jCollisionsParentIndexTable(collision.globalIndex()); + products.jCollisionsBunchCrossingIndexTable(collision.bcId()); } PROCESS_SWITCH(JetDerivedDataProducerTask, processCollisions, "produces derived collision tables", true); @@ -184,62 +186,62 @@ struct JetDerivedDataProducerTask { triggerDecider.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), jetderiveddatautilities::JTriggerMasks); triggerBit = jetderiveddatautilities::setTriggerSelectionBit(triggerDecider.getTriggerOfInterestResults(bc.globalBC())); } - jCollisionsTable(collision.posX(), collision.posY(), collision.posZ(), -1.0, -1.0, -1, jetderiveddatautilities::setEventSelectionBit(collision), collision.alias_raw(), triggerBit); - jCollisionsParentIndexTable(collision.globalIndex()); - jCollisionsBunchCrossingIndexTable(collision.bcId()); + products.jCollisionsTable(collision.posX(), collision.posY(), collision.posZ(), -1.0, -1.0, -1, jetderiveddatautilities::setEventSelectionBit(collision), collision.alias_raw(), triggerBit); + products.jCollisionsParentIndexTable(collision.globalIndex()); + products.jCollisionsBunchCrossingIndexTable(collision.bcId()); } PROCESS_SWITCH(JetDerivedDataProducerTask, processCollisionsWithoutCentralityAndMultiplicity, "produces derived collision tables without centrality or multiplicity", false); void processCollisionsRun2(soa::Join::iterator const& collision) { - jCollisionsTable(collision.posX(), collision.posY(), collision.posZ(), collision.multFT0C(), collision.centRun2V0M(), -1, jetderiveddatautilities::setEventSelectionBit(collision), collision.alias_raw(), 0); // note change multFT0C to multFT0M when problems with multFT0A are fixed - jCollisionsParentIndexTable(collision.globalIndex()); - jCollisionsBunchCrossingIndexTable(collision.bcId()); + products.jCollisionsTable(collision.posX(), collision.posY(), collision.posZ(), collision.multFT0C(), collision.centRun2V0M(), -1, jetderiveddatautilities::setEventSelectionBit(collision), collision.alias_raw(), 0); // note change multFT0C to multFT0M when problems with multFT0A are fixed + products.jCollisionsParentIndexTable(collision.globalIndex()); + products.jCollisionsBunchCrossingIndexTable(collision.bcId()); } PROCESS_SWITCH(JetDerivedDataProducerTask, processCollisionsRun2, "produces derived collision tables for Run 2 data", false); void processCollisionsALICE3(aod::Collision const& collision) { - jCollisionsTable(collision.posX(), collision.posY(), collision.posZ(), -1.0, -1.0, -1, -1.0, 0, 0); - jCollisionsParentIndexTable(collision.globalIndex()); - jCollisionsBunchCrossingIndexTable(-1); + products.jCollisionsTable(collision.posX(), collision.posY(), collision.posZ(), -1.0, -1.0, -1, -1.0, 0, 0); + products.jCollisionsParentIndexTable(collision.globalIndex()); + products.jCollisionsBunchCrossingIndexTable(-1); } PROCESS_SWITCH(JetDerivedDataProducerTask, processCollisionsALICE3, "produces derived collision tables for ALICE 3 simulations", false); void processWithoutEMCalCollisionLabels(aod::Collision const&) { - jCollisionsEMCalLabelTable(false, false); + products.jCollisionsEMCalLabelTable(false, false); } PROCESS_SWITCH(JetDerivedDataProducerTask, processWithoutEMCalCollisionLabels, "produces dummy derived collision labels for EMCal", true); void processEMCalCollisionLabels(aod::EMCALMatchedCollision const& collision) { - jCollisionsEMCalLabelTable(collision.ambiguous(), collision.isemcreadout()); + products.jCollisionsEMCalLabelTable(collision.ambiguous(), collision.isemcreadout()); } PROCESS_SWITCH(JetDerivedDataProducerTask, processEMCalCollisionLabels, "produces derived collision labels for EMCal", false); void processMcCollisionLabels(soa::Join::iterator const& collision, aod::McCollisions const&) { if (collision.has_mcCollision()) { - jMcCollisionsLabelTable(collision.mcCollisionId()); - jCollisionMcInfosTable(collision.mcCollision().weight(), collision.mcCollision().getSubGeneratorId()); + products.jMcCollisionsLabelTable(collision.mcCollisionId()); + products.jCollisionMcInfosTable(collision.mcCollision().weight(), collision.mcCollision().getSubGeneratorId()); } else { - jMcCollisionsLabelTable(-1); - jCollisionMcInfosTable(-1.0, jetderiveddatautilities::JCollisionSubGeneratorId::none); + products.jMcCollisionsLabelTable(-1); + products.jCollisionMcInfosTable(-1.0, jetderiveddatautilities::JCollisionSubGeneratorId::none); } } PROCESS_SWITCH(JetDerivedDataProducerTask, processMcCollisionLabels, "produces derived MC collision labels table", false); void processMcCollisions(aod::McCollision const& mcCollision) { - jMcCollisionsTable(mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), mcCollision.weight(), mcCollision.getSubGeneratorId()); - jMcCollisionsParentIndexTable(mcCollision.globalIndex()); + products.jMcCollisionsTable(mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), mcCollision.weight(), mcCollision.getSubGeneratorId()); + products.jMcCollisionsParentIndexTable(mcCollision.globalIndex()); } PROCESS_SWITCH(JetDerivedDataProducerTask, processMcCollisions, "produces derived MC collision table", false); void processTracks(soa::Join::iterator const& track, aod::Collisions const&) { - jTracksTable(track.collisionId(), track.pt(), track.eta(), track.phi(), jetderiveddatautilities::setTrackSelectionBit(track, track.dcaZ(), dcaZMax)); + products.jTracksTable(track.collisionId(), track.pt(), track.eta(), track.phi(), jetderiveddatautilities::setTrackSelectionBit(track, track.dcaZ(), dcaZMax)); auto trackParCov = getTrackParCov(track); auto xyzTrack = trackParCov.getXYZGlo(); float sigmaDCAXYZ2; @@ -252,9 +254,9 @@ struct JetDerivedDataProducerTask { dcaY = xyzTrack.Y() - collision.posY(); } - jTracksExtraTable(dcaX, dcaY, track.dcaZ(), track.dcaXY(), dcaXYZ, std::sqrt(track.sigmaDcaZ2()), std::sqrt(track.sigmaDcaXY2()), std::sqrt(sigmaDCAXYZ2), track.sigma1Pt()); // why is this getSigmaZY - jTracksParentIndexTable(track.globalIndex()); - trackCollisionMapping[{track.globalIndex(), track.collisionId()}] = jTracksTable.lastIndex(); + products.jTracksExtraTable(dcaX, dcaY, track.dcaZ(), track.dcaXY(), dcaXYZ, std::sqrt(track.sigmaDcaZ2()), std::sqrt(track.sigmaDcaXY2()), std::sqrt(sigmaDCAXYZ2), track.sigma1Pt()); // why is this getSigmaZY + products.jTracksParentIndexTable(track.globalIndex()); + trackCollisionMapping[{track.globalIndex(), track.collisionId()}] = products.jTracksTable.lastIndex(); } PROCESS_SWITCH(JetDerivedDataProducerTask, processTracks, "produces derived track table", true); @@ -266,12 +268,12 @@ struct JetDerivedDataProducerTask { auto track = collisionTrackIndex.track_as>(); auto trackParCov = getTrackParCov(track); if (track.collisionId() == collision.globalIndex()) { - jTracksTable(collision.globalIndex(), track.pt(), track.eta(), track.phi(), jetderiveddatautilities::setTrackSelectionBit(track, track.dcaZ(), dcaZMax)); - jTracksParentIndexTable(track.globalIndex()); + products.jTracksTable(collision.globalIndex(), track.pt(), track.eta(), track.phi(), jetderiveddatautilities::setTrackSelectionBit(track, track.dcaZ(), dcaZMax)); + products.jTracksParentIndexTable(track.globalIndex()); auto xyzTrack = trackParCov.getXYZGlo(); float sigmaDCAXYZ2; float dcaXYZ = getDcaXYZ(track, &sigmaDCAXYZ2); - jTracksExtraTable(xyzTrack.X() - collision.posX(), xyzTrack.Y() - collision.posY(), track.dcaZ(), track.dcaXY(), dcaXYZ, std::sqrt(track.sigmaDcaZ2()), std::sqrt(track.sigmaDcaXY2()), std::sqrt(sigmaDCAXYZ2), track.sigma1Pt()); // why is this getSigmaZY + products.jTracksExtraTable(xyzTrack.X() - collision.posX(), xyzTrack.Y() - collision.posY(), track.dcaZ(), track.dcaXY(), dcaXYZ, std::sqrt(track.sigmaDcaZ2()), std::sqrt(track.sigmaDcaXY2()), std::sqrt(sigmaDCAXYZ2), track.sigma1Pt()); // why is this getSigmaZY } else { auto bc = collision.bc_as>(); initCCDB(bc, runNumber, ccdb, doprocessCollisionsRun2 ? ccdbPathGrp : ccdbPathGrpMag, lut, doprocessCollisionsRun2); @@ -281,8 +283,8 @@ struct JetDerivedDataProducerTask { collisionInfo.setPos({collision.posX(), collision.posY(), collision.posZ()}); collisionInfo.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); o2::base::Propagator::Instance()->propagateToDCABxByBz(collisionInfo, trackParCov, 2.f, noMatCorr, &dcaCovInfo); - jTracksTable(collision.globalIndex(), trackParCov.getPt(), trackParCov.getEta(), trackParCov.getPhi(), jetderiveddatautilities::setTrackSelectionBit(track, dcaCovInfo.getZ(), dcaZMax)); // only qualitytracksWDCA are a reliable selection - jTracksParentIndexTable(track.globalIndex()); + products.jTracksTable(collision.globalIndex(), trackParCov.getPt(), trackParCov.getEta(), trackParCov.getPhi(), jetderiveddatautilities::setTrackSelectionBit(track, dcaCovInfo.getZ(), dcaZMax)); // only qualitytracksWDCA are a reliable selection + products.jTracksParentIndexTable(track.globalIndex()); auto xyzTrack = trackParCov.getXYZGlo(); float dcaXY = dcaCovInfo.getY(); float dcaZ = dcaCovInfo.getZ(); @@ -296,9 +298,9 @@ struct JetDerivedDataProducerTask { } else { sigmaDCAXYZ = covYY * (2.f * dcaXY / dcaXYZ) * (2.f * dcaXY / dcaXYZ) + covZZ * (2.f * dcaZ / dcaXYZ) * (2.f * dcaZ / dcaXYZ) + 2.f * covYZ * (2.f * dcaXY / dcaXYZ) * (2.f * dcaZ / dcaXYZ); } - jTracksExtraTable(xyzTrack.X() - collision.posX(), xyzTrack.Y() - collision.posY(), dcaZ, dcaXY, dcaXYZ, std::sqrt(covZZ), std::sqrt(covYY), std::sqrt(sigmaDCAXYZ), std::sqrt(trackParCov.getSigma1Pt2())); + products.jTracksExtraTable(xyzTrack.X() - collision.posX(), xyzTrack.Y() - collision.posY(), dcaZ, dcaXY, dcaXYZ, std::sqrt(covZZ), std::sqrt(covYY), std::sqrt(sigmaDCAXYZ), std::sqrt(trackParCov.getSigma1Pt2())); } - trackCollisionMapping[{track.globalIndex(), collision.globalIndex()}] = jTracksTable.lastIndex(); + trackCollisionMapping[{track.globalIndex(), collision.globalIndex()}] = products.jTracksTable.lastIndex(); } } } @@ -307,9 +309,9 @@ struct JetDerivedDataProducerTask { void processMcTrackLabels(soa::Join::iterator const& track) { if (track.has_mcParticle()) { - jMcTracksLabelTable(track.mcParticleId()); + products.jMcTracksLabelTable(track.mcParticleId()); } else { - jMcTracksLabelTable(-1); + products.jMcTracksLabelTable(-1); } } PROCESS_SWITCH(JetDerivedDataProducerTask, processMcTrackLabels, "produces derived track labels table", false); @@ -321,9 +323,9 @@ struct JetDerivedDataProducerTask { for (auto const& collisionTrackIndex : collisionTrackIndices) { auto track = collisionTrackIndex.track_as>(); if (track.collisionId() == collision.globalIndex() && track.has_mcParticle()) { - jMcTracksLabelTable(track.mcParticleId()); + products.jMcTracksLabelTable(track.mcParticleId()); } else { - jMcTracksLabelTable(-1); + products.jMcTracksLabelTable(-1); } } } @@ -350,8 +352,8 @@ struct JetDerivedDataProducerTask { i++; } } - jMcParticlesTable(particle.mcCollisionId(), particle.pt(), particle.eta(), particle.phi(), particle.y(), particle.e(), particle.pdgCode(), particle.getGenStatusCode(), particle.getHepMCStatusCode(), particle.isPhysicalPrimary(), mothersId, daughtersId); - jParticlesParentIndexTable(particle.globalIndex()); + products.jMcParticlesTable(particle.mcCollisionId(), particle.pt(), particle.eta(), particle.phi(), particle.y(), particle.e(), particle.pdgCode(), particle.getGenStatusCode(), particle.getHepMCStatusCode(), particle.isPhysicalPrimary(), mothersId, daughtersId); + products.jParticlesParentIndexTable(particle.globalIndex()); } PROCESS_SWITCH(JetDerivedDataProducerTask, processParticles, "produces derived parrticle table", false); @@ -381,8 +383,8 @@ struct JetDerivedDataProducerTask { } } - jClustersTable(cluster.collisionId(), cluster.id(), cluster.energy(), cluster.coreEnergy(), cluster.rawEnergy(), cluster.eta(), cluster.phi(), cluster.m02(), cluster.m20(), cluster.nCells(), cluster.time(), cluster.isExotic(), cluster.distanceToBadChannel(), cluster.nlm(), cluster.definition(), leadingCellEnergy, subleadingCellEnergy, leadingCellNumber, subleadingCellNumber); - jClustersParentIndexTable(cluster.globalIndex()); + products.jClustersTable(cluster.collisionId(), cluster.id(), cluster.energy(), cluster.coreEnergy(), cluster.rawEnergy(), cluster.eta(), cluster.phi(), cluster.m02(), cluster.m20(), cluster.nCells(), cluster.time(), cluster.isExotic(), cluster.distanceToBadChannel(), cluster.nlm(), cluster.definition(), leadingCellEnergy, subleadingCellEnergy, leadingCellNumber, subleadingCellNumber); + products.jClustersParentIndexTable(cluster.globalIndex()); auto const clusterTracks = matchedTracks.sliceBy(perClusterTracks, cluster.globalIndex()); std::vector clusterTrackIDs; @@ -390,9 +392,9 @@ struct JetDerivedDataProducerTask { auto JClusterID = trackCollisionMapping.find({clusterTrack.trackId(), cluster.collisionId()}); // does EMCal use its own associator? clusterTrackIDs.push_back(JClusterID->second); auto emcTrack = clusterTrack.track_as>(); - jTracksEMCalTable(JClusterID->second, emcTrack.trackEtaEmcal(), emcTrack.trackPhiEmcal()); + products.jTracksEMCalTable(JClusterID->second, emcTrack.trackEtaEmcal(), emcTrack.trackPhiEmcal()); } - jClustersMatchedTracksTable(clusterTrackIDs); + products.jClustersMatchedTracksTable(clusterTrackIDs); } } PROCESS_SWITCH(JetDerivedDataProducerTask, processClusters, "produces derived cluster tables", false); @@ -406,19 +408,19 @@ struct JetDerivedDataProducerTask { std::vector amplitudeA; auto amplitudeASpan = cluster.amplitudeA(); std::copy(amplitudeASpan.begin(), amplitudeASpan.end(), std::back_inserter(amplitudeA)); - jMcClustersLabelTable(particleIds, amplitudeA); + products.jMcClustersLabelTable(particleIds, amplitudeA); } PROCESS_SWITCH(JetDerivedDataProducerTask, processMcClusterLabels, "produces derived cluster particle label table", false); void processD0Collisions(aod::HfD0CollIds::iterator const& D0Collision) { - jD0CollisionIdsTable(D0Collision.collisionId()); + products.jD0CollisionIdsTable(D0Collision.collisionId()); } PROCESS_SWITCH(JetDerivedDataProducerTask, processD0Collisions, "produces derived index for D0 collisions", false); void processD0McCollisions(aod::HfD0McCollIds::iterator const& D0McCollision) { - jD0McCollisionIdsTable(D0McCollision.mcCollisionId()); + products.jD0McCollisionIdsTable(D0McCollision.mcCollisionId()); } PROCESS_SWITCH(JetDerivedDataProducerTask, processD0McCollisions, "produces derived index for D0 MC collisions", false); @@ -430,25 +432,25 @@ struct JetDerivedDataProducerTask { JProng0ID = trackCollisionMapping.find({D0.prong0Id(), D0.collisionId()}); JProng1ID = trackCollisionMapping.find({D0.prong1Id(), D0.collisionId()}); } - jD0IdsTable(D0.collisionId(), JProng0ID->second, JProng1ID->second); + products.jD0IdsTable(D0.collisionId(), JProng0ID->second, JProng1ID->second); } PROCESS_SWITCH(JetDerivedDataProducerTask, processD0, "produces derived index for D0 candidates", false); void processD0MC(aod::HfD0PIds::iterator const& D0) { - jD0ParticleIdsTable(D0.mcCollisionId(), D0.mcParticleId()); + products.jD0ParticleIdsTable(D0.mcCollisionId(), D0.mcParticleId()); } PROCESS_SWITCH(JetDerivedDataProducerTask, processD0MC, "produces derived index for D0 particles", false); void processLcCollisions(aod::HfLcCollIds::iterator const& LcCollision) { - jLcCollisionIdsTable(LcCollision.collisionId()); + products.jLcCollisionIdsTable(LcCollision.collisionId()); } PROCESS_SWITCH(JetDerivedDataProducerTask, processLcCollisions, "produces derived index for Lc collisions", false); void processLcMcCollisions(aod::HfLcMcCollIds::iterator const& LcMcCollision) { - jLcMcCollisionIdsTable(LcMcCollision.mcCollisionId()); + products.jLcMcCollisionIdsTable(LcMcCollision.mcCollisionId()); } PROCESS_SWITCH(JetDerivedDataProducerTask, processLcMcCollisions, "produces derived index for Lc MC collisions", false); @@ -462,25 +464,25 @@ struct JetDerivedDataProducerTask { JProng1ID = trackCollisionMapping.find({Lc.prong1Id(), Lc.collisionId()}); JProng2ID = trackCollisionMapping.find({Lc.prong2Id(), Lc.collisionId()}); } - jLcIdsTable(Lc.collisionId(), JProng0ID->second, JProng1ID->second, JProng2ID->second); + products.jLcIdsTable(Lc.collisionId(), JProng0ID->second, JProng1ID->second, JProng2ID->second); } PROCESS_SWITCH(JetDerivedDataProducerTask, processLc, "produces derived index for Lc candidates", false); void processLcMC(aod::HfLcPIds::iterator const& Lc) { - jLcParticleIdsTable(Lc.mcCollisionId(), Lc.mcParticleId()); + products.jLcParticleIdsTable(Lc.mcCollisionId(), Lc.mcParticleId()); } PROCESS_SWITCH(JetDerivedDataProducerTask, processLcMC, "produces derived index for Lc particles", false); void processBplusCollisions(aod::HfBplusCollIds::iterator const& BplusCollision) { - jBplusCollisionIdsTable(BplusCollision.collisionId()); + products.jBplusCollisionIdsTable(BplusCollision.collisionId()); } PROCESS_SWITCH(JetDerivedDataProducerTask, processBplusCollisions, "produces derived index for Bplus collisions", false); void processBplusMcCollisions(aod::HfBplusMcCollIds::iterator const& BplusMcCollision) { - jBplusMcCollisionIdsTable(BplusMcCollision.mcCollisionId()); + products.jBplusMcCollisionIdsTable(BplusMcCollision.mcCollisionId()); } PROCESS_SWITCH(JetDerivedDataProducerTask, processBplusMcCollisions, "produces derived index for Bplus MC collisions", false); @@ -494,13 +496,13 @@ struct JetDerivedDataProducerTask { JProng1ID = trackCollisionMapping.find({Bplus.prong1Id(), Bplus.collisionId()}); JProng2ID = trackCollisionMapping.find({Bplus.prong2Id(), Bplus.collisionId()}); } - jBplusIdsTable(Bplus.collisionId(), JProng0ID->second, JProng1ID->second, JProng2ID->second); + products.jBplusIdsTable(Bplus.collisionId(), JProng0ID->second, JProng1ID->second, JProng2ID->second); } PROCESS_SWITCH(JetDerivedDataProducerTask, processBplus, "produces derived index for Bplus candidates", false); void processBplusMC(aod::HfBplusPIds::iterator const& Bplus) { - jBplusParticleIdsTable(Bplus.mcCollisionId(), Bplus.mcParticleId()); + products.jBplusParticleIdsTable(Bplus.mcCollisionId(), Bplus.mcParticleId()); } PROCESS_SWITCH(JetDerivedDataProducerTask, processBplusMC, "produces derived index for Bplus particles", false); @@ -512,7 +514,7 @@ struct JetDerivedDataProducerTask { JPosTrackID = trackCollisionMapping.find({V0.posTrackId(), V0.collisionId()}); JNegTrackID = trackCollisionMapping.find({V0.negTrackId(), V0.collisionId()}); } - jV0IdsTable(V0.collisionId(), JPosTrackID->second, JNegTrackID->second); + products.jV0IdsTable(V0.collisionId(), JPosTrackID->second, JNegTrackID->second); } PROCESS_SWITCH(JetDerivedDataProducerTask, processV0, "produces derived index for V0 candidates", false); @@ -522,8 +524,8 @@ struct JetDerivedDataProducerTask { for (auto const& particle : particles) { if (jetv0utilities::isV0Particle(particles, particle)) { if (!filledV0McCollisionTable) { - jV0McCollisionsTable(mcCollision.posX(), mcCollision.posY(), mcCollision.posZ()); - jV0McCollisionIdsTable(mcCollision.globalIndex()); + products.jV0McCollisionsTable(mcCollision.posX(), mcCollision.posY(), mcCollision.posZ()); + products.jV0McCollisionIdsTable(mcCollision.globalIndex()); filledV0McCollisionTable = true; } std::vector mothersId; @@ -545,8 +547,8 @@ struct JetDerivedDataProducerTask { } } auto pdgParticle = pdgDatabase->GetParticle(particle.pdgCode()); - jV0McsTable(jV0McCollisionsTable.lastIndex(), particle.pt(), particle.eta(), particle.phi(), particle.y(), particle.e(), pdgParticle->Mass(), particle.pdgCode(), particle.getGenStatusCode(), particle.getHepMCStatusCode(), particle.isPhysicalPrimary(), jetv0utilities::setV0ParticleDecayBit(particles, particle)); - jV0McIdsTable(mcCollision.globalIndex(), particle.globalIndex(), mothersId, daughtersId); + products.jV0McsTable(products.jV0McCollisionsTable.lastIndex(), particle.pt(), particle.eta(), particle.phi(), particle.y(), particle.e(), pdgParticle->Mass(), particle.pdgCode(), particle.getGenStatusCode(), particle.getHepMCStatusCode(), particle.isPhysicalPrimary(), jetv0utilities::setV0ParticleDecayBit(particles, particle)); + products.jV0McIdsTable(mcCollision.globalIndex(), particle.globalIndex(), mothersId, daughtersId); } } } @@ -554,7 +556,7 @@ struct JetDerivedDataProducerTask { void processDielectronCollisions(aod::ReducedEventsInfo::iterator const& DielectronCollision) { - jDielectronCollisionIdsTable(DielectronCollision.collisionId()); + products.jDielectronCollisionIdsTable(DielectronCollision.collisionId()); } PROCESS_SWITCH(JetDerivedDataProducerTask, processDielectronCollisions, "produces derived index for Dielectron collisions", false); @@ -566,7 +568,7 @@ struct JetDerivedDataProducerTask { JProng0ID = trackCollisionMapping.find({Dielectron.prong0Id(), Dielectron.collisionId()}); JProng1ID = trackCollisionMapping.find({Dielectron.prong1Id(), Dielectron.collisionId()}); } - jDielectronIdsTable(Dielectron.collisionId(), JProng0ID->second, JProng1ID->second); + products.jDielectronIdsTable(Dielectron.collisionId(), JProng0ID->second, JProng1ID->second); } PROCESS_SWITCH(JetDerivedDataProducerTask, processDielectron, "produces derived index for Dielectron candidates", false); @@ -576,8 +578,8 @@ struct JetDerivedDataProducerTask { for (auto const& particle : particles) { if (jetdqutilities::isDielectronParticle(particles, particle)) { if (!filledDielectronMcCollisionTable) { - jDielectronMcCollisionsTable(mcCollision.posX(), mcCollision.posY(), mcCollision.posZ()); - jDielectronMcCollisionIdsTable(mcCollision.globalIndex()); + products.jDielectronMcCollisionsTable(mcCollision.posX(), mcCollision.posY(), mcCollision.posZ()); + products.jDielectronMcCollisionIdsTable(mcCollision.globalIndex()); filledDielectronMcCollisionTable = true; } std::vector mothersId; @@ -599,8 +601,8 @@ struct JetDerivedDataProducerTask { } } auto pdgParticle = pdgDatabase->GetParticle(particle.pdgCode()); - jDielectronMcsTable(jDielectronMcCollisionsTable.lastIndex(), particle.pt(), particle.eta(), particle.phi(), particle.y(), particle.e(), pdgParticle->Mass(), particle.pdgCode(), particle.getGenStatusCode(), particle.getHepMCStatusCode(), particle.isPhysicalPrimary(), jetdqutilities::setDielectronParticleDecayBit(particles, particle), RecoDecay::getCharmHadronOrigin(particles, particle, false)); // Todo: should the last thing be false? - jDielectronMcIdsTable(mcCollision.globalIndex(), particle.globalIndex(), mothersId, daughtersId); + products.jDielectronMcsTable(products.jDielectronMcCollisionsTable.lastIndex(), particle.pt(), particle.eta(), particle.phi(), particle.y(), particle.e(), pdgParticle->Mass(), particle.pdgCode(), particle.getGenStatusCode(), particle.getHepMCStatusCode(), particle.isPhysicalPrimary(), jetdqutilities::setDielectronParticleDecayBit(particles, particle), RecoDecay::getCharmHadronOrigin(particles, particle, false)); // Todo: should the last thing be false? + products.jDielectronMcIdsTable(mcCollision.globalIndex(), particle.globalIndex(), mothersId, daughtersId); } } } diff --git a/PWGJE/TableProducer/derivedDataProducerDummyCharged.cxx b/PWGJE/TableProducer/derivedDataProducerDummyCharged.cxx new file mode 100644 index 00000000000..28cfa369b73 --- /dev/null +++ b/PWGJE/TableProducer/derivedDataProducerDummyCharged.cxx @@ -0,0 +1,84 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// temporary task to produce HF, DQ and EMCal tables needed when making inclusive derived data - should become obsolete when tables are able to be prouduced based on a configurable +// +/// \author Nima Zardoshti + +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/ASoA.h" +#include "Framework/runDataProcessing.h" +#include "PWGJE/DataModel/JetReducedData.h" +#include "PWGHF/DataModel/DerivedTables.h" +#include "PWGDQ/DataModel/ReducedInfoTables.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +struct JetDerivedDataProducerDummyChargedTask { + + Produces d0CollisionsTable; + Produces d0CollisionsMatchingTable; + Produces d0sTable; + Produces d0ParsTable; + Produces d0ParExtrasTable; + Produces d0SelsTable; + Produces d0MlsTable; + Produces d0McsTable; + Produces d0McCollisionsTable; + Produces d0ParticlesTable; + + Produces lcCollisionsTable; + Produces lcCollisionsMatchingTable; + Produces lcsTable; + Produces lcParsTable; + Produces lcParExtrasTable; + Produces lcSelsTable; + Produces lcMlsTable; + Produces lcMcsTable; + Produces lcMcCollisionsTable; + Produces lcParticlesTable; + + Produces bplusCollisionsTable; + Produces bplusCollisionsMatchingTable; + Produces bplussTable; + Produces bplusParsTable; + Produces bplusParExtrasTable; + Produces bplusParD0sTable; + Produces bplusSelsTable; + Produces bplusMlsTable; + Produces bplusMlD0sTable; + Produces bplusMcsTable; + Produces bplusMcCollisionsTable; + Produces bplusParticlesTable; + + Produces dielectronCollisionsTable; + Produces dielectronTable; + + Produces jClustersCorrectedEnergiesTable; + + void init(InitContext const&) + { + } + + void processDummy(aod::JDummys const&) + { + } + PROCESS_SWITCH(JetDerivedDataProducerDummyChargedTask, processDummy, "leaves all tables empty", true); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc, TaskName{"jet-deriveddata-producer-dummy-charged"})}; +} diff --git a/PWGJE/TableProducer/derivedDataWriter.cxx b/PWGJE/TableProducer/derivedDataWriter.cxx index 78f20d7a425..ee4eeea7c10 100644 --- a/PWGJE/TableProducer/derivedDataWriter.cxx +++ b/PWGJE/TableProducer/derivedDataWriter.cxx @@ -98,6 +98,7 @@ struct JetDerivedDataWriter { Produces storedJMcParticlesTable; Produces storedJParticlesParentIndexTable; Produces storedJClustersTable; + Produces storedJClustersCorrectedEnergiesTable; Produces storedJClustersParentIndexTable; Produces storedJClustersMatchedTracksTable; Produces storedJMcClustersLabelTable; @@ -403,7 +404,7 @@ struct JetDerivedDataWriter { } PROCESS_SWITCH(JetDerivedDataWriter, processStoreDummyTable, "write out dummy output table", true); - void processStoreData(soa::Join::iterator const& collision, soa::Join const&, soa::Join const& tracks, aod::JEMCTracks const& emcTracks, soa::Join const& clusters, aod::CollisionsD0 const& D0Collisions, aod::CandidatesD0Data const& D0s, aod::CollisionsLc const& LcCollisions, aod::CandidatesLcData const& Lcs, aod::CollisionsBplus const& BplusCollisions, aod::CandidatesBplusData const& Bpluss, aod::CollisionsDielectron const& DielectronCollisions, aod::CandidatesDielectronData const& Dielectrons) + void processStoreData(soa::Join::iterator const& collision, soa::Join const&, soa::Join const& tracks, aod::JEMCTracks const& emcTracks, soa::Join const& clusters, aod::CollisionsD0 const& D0Collisions, aod::CandidatesD0Data const& D0s, aod::CollisionsLc const& LcCollisions, aod::CandidatesLcData const& Lcs, aod::CollisionsBplus const& BplusCollisions, aod::CandidatesBplusData const& Bpluss, aod::CollisionsDielectron const& DielectronCollisions, aod::CandidatesDielectronData const& Dielectrons) { std::map bcMapping; std::map trackMapping; @@ -451,6 +452,7 @@ struct JetDerivedDataWriter { products.storedJClustersTable(products.storedJCollisionsTable.lastIndex(), cluster.id(), cluster.energy(), cluster.coreEnergy(), cluster.rawEnergy(), cluster.eta(), cluster.phi(), cluster.m02(), cluster.m20(), cluster.nCells(), cluster.time(), cluster.isExotic(), cluster.distanceToBadChannel(), cluster.nlm(), cluster.definition(), cluster.leadingCellEnergy(), cluster.subleadingCellEnergy(), cluster.leadingCellNumber(), cluster.subleadingCellNumber()); + products.storedJClustersCorrectedEnergiesTable(cluster.energyCorrectedOneTrack1(), cluster.energyCorrectedOneTrack2(), cluster.energyCorrectedAllTracks1(), cluster.energyCorrectedAllTracks2()); products.storedJClustersParentIndexTable(cluster.clusterId()); std::vector clusterStoredJTrackIDs; @@ -576,7 +578,7 @@ struct JetDerivedDataWriter { // to run after all jet selections PROCESS_SWITCH(JetDerivedDataWriter, processStoreData, "write out data output tables", false); - void processStoreMC(soa::Join const& mcCollisions, soa::Join const& collisions, soa::Join const&, soa::Join const& tracks, aod::JEMCTracks const& emcTracks, soa::Join const& clusters, soa::Join const& particles, aod::CollisionsD0 const& D0Collisions, aod::CandidatesD0MCD const& D0s, soa::Join const& D0McCollisions, aod::CandidatesD0MCP const& D0Particles, aod::CollisionsLc const& LcCollisions, aod::CandidatesLcMCD const& Lcs, soa::Join const& LcMcCollisions, aod::CandidatesLcMCP const& LcParticles, aod::CollisionsBplus const& BplusCollisions, aod::CandidatesBplusMCD const& Bpluss, soa::Join const& BplusMcCollisions, aod::CandidatesBplusMCP const& BplusParticles, aod::CollisionsDielectron const& DielectronCollisions, aod::CandidatesDielectronMCD const& Dielectrons, aod::McCollisionsDielectron const& DielectronMcCollisions, aod::CandidatesDielectronMCP const& DielectronParticles) + void processStoreMC(soa::Join const& mcCollisions, soa::Join const& collisions, soa::Join const&, soa::Join const& tracks, aod::JEMCTracks const& emcTracks, soa::Join const& clusters, soa::Join const& particles, aod::CollisionsD0 const& D0Collisions, aod::CandidatesD0MCD const& D0s, soa::Join const& D0McCollisions, aod::CandidatesD0MCP const& D0Particles, aod::CollisionsLc const& LcCollisions, aod::CandidatesLcMCD const& Lcs, soa::Join const& LcMcCollisions, aod::CandidatesLcMCP const& LcParticles, aod::CollisionsBplus const& BplusCollisions, aod::CandidatesBplusMCD const& Bpluss, soa::Join const& BplusMcCollisions, aod::CandidatesBplusMCP const& BplusParticles, aod::CollisionsDielectron const& DielectronCollisions, aod::CandidatesDielectronMCD const& Dielectrons, aod::McCollisionsDielectron const& DielectronMcCollisions, aod::CandidatesDielectronMCP const& DielectronParticles) { std::map bcMapping; std::map paticleMapping; @@ -809,6 +811,7 @@ struct JetDerivedDataWriter { products.storedJClustersTable(products.storedJCollisionsTable.lastIndex(), cluster.id(), cluster.energy(), cluster.coreEnergy(), cluster.rawEnergy(), cluster.eta(), cluster.phi(), cluster.m02(), cluster.m20(), cluster.nCells(), cluster.time(), cluster.isExotic(), cluster.distanceToBadChannel(), cluster.nlm(), cluster.definition(), cluster.leadingCellEnergy(), cluster.subleadingCellEnergy(), cluster.leadingCellNumber(), cluster.subleadingCellNumber()); + products.storedJClustersCorrectedEnergiesTable(cluster.energyCorrectedOneTrack1(), cluster.energyCorrectedOneTrack2(), cluster.energyCorrectedAllTracks1(), cluster.energyCorrectedAllTracks2()); products.storedJClustersParentIndexTable(cluster.clusterId()); std::vector clusterStoredJTrackIDs; @@ -824,7 +827,7 @@ struct JetDerivedDataWriter { products.storedJClustersMatchedTracksTable(clusterStoredJTrackIDs); std::vector clusterStoredJParticleIDs; - for (const auto& clusterParticleId : cluster.mcParticleIds()) { + for (const auto& clusterParticleId : cluster.mcParticlesIds()) { auto JParticleIndex = paticleMapping.find(clusterParticleId); if (JParticleIndex != paticleMapping.end()) { clusterStoredJParticleIDs.push_back(JParticleIndex->second); diff --git a/PWGJE/TableProducer/emcalClusterHadronicCorrectionTask.cxx b/PWGJE/TableProducer/emcalClusterHadronicCorrectionTask.cxx index 6ca62beace5..69e1f1051dc 100644 --- a/PWGJE/TableProducer/emcalClusterHadronicCorrectionTask.cxx +++ b/PWGJE/TableProducer/emcalClusterHadronicCorrectionTask.cxx @@ -15,12 +15,11 @@ #include #include #include -#include #include -#include #include +#include +#include "TVector2.h" -#include "CCDB/BasicCCDBManager.h" #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" @@ -29,74 +28,57 @@ #include "DetectorsBase/GeometryManager.h" -#include "PWGJE/DataModel/EMCALClusters.h" -#include "PWGJE/DataModel/EMCALMatchedTracks.h" -#include "PWGJE/DataModel/EMCALMatchedCollisions.h" -#include "PWGJE/DataModel/emcalClusterHadronicCorrectionTask.h" - -#include "Common/DataModel/EventSelection.h" -#include "Common/DataModel/TrackSelectionTables.h" -#include "Common/DataModel/PIDResponse.h" -#include "DataFormatsEMCAL/Cell.h" -#include "DataFormatsEMCAL/Constants.h" -#include "DataFormatsEMCAL/AnalysisCluster.h" -#include "EMCALBase/Geometry.h" -#include "EMCALBase/ClusterFactory.h" -#include "EMCALBase/NonlinearityHandler.h" -#include "EMCALReconstruction/Clusterizer.h" +#include "PWGJE/DataModel/JetReducedData.h" +#include "PWGJE/DataModel/Jet.h" + #include "PWGJE/Core/JetUtilities.h" -#include "TVector2.h" #include "CommonDataFormat/InteractionRecord.h" using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; -using collisionEvSelIt = o2::soa::Join::iterator; -using myTracks = o2::soa::Filtered>; struct EmcalClusterHadronicCorrectionTask { - Produces hadroniccorrectedclusters; + Produces clusterEnergyCorrectedTable; HistogramRegistry registry; // Configurables for Histogram Binning - Preslice perClusterMatchedTracks = o2::aod::emcalclustercell::emcalclusterId; // looking at clusterID column in the EMCALMatchedTracks for every cluster + PresliceUnsorted perTrackMatchedTrack = aod::jemctrack::trackId; // define configurables here - Configurable mClusterDefinition{"clusterDefinition", 10, "cluster definition to be selected, e.g. 10=kV3Default"}; + Configurable clusterDefinitionS{"clusterDefinition", "kV3Default", "cluster definition to be selected, e.g. V3Default"}; + Configurable minTime{"minTime", -25., "Minimum cluster time for time cut"}; Configurable maxTime{"maxTime", 20., "Maximum cluster time for time cut"}; Configurable minM02{"minM02", 0.1, "Minimum M02 for M02 cut"}; Configurable maxM02{"maxM02", 0.9, "Maximum M02 for M02 cut"}; Configurable minTrackPt{"minTrackPt", 0.15, "Minimum pT for tracks"}; - Configurable fHadCorr1{"HadCorr1", 1., "hadronic correction fraction for complete cluster energy subtraction for one matched track"}; // 100% - default - Configurable fHadCorr2{"HadCorr2", 0.7, "hadronic correction fraction for systematic studies for one matched track"}; // 70% - Configurable fHadCorralltrks1{"HadCorralltrks1", 1., "hadronic correction fraction for complete cluster energy subtraction for all matched tracks"}; // 100% - all tracks - Configurable fHadCorralltrks2{"HadCorralltrks2", 0.7, "hadronic correction fraction for systematic studies for all matched tracks"}; // 70% + Configurable hadCorr1{"hadCorr1", 1., "hadronic correction fraction for complete cluster energy subtraction for one matched track"}; // 100% - default + Configurable hadCorr2{"hadCorr2", 0.7, "hadronic correction fraction for systematic studies for one matched track"}; // 70% + Configurable hadCorralltrks1{"hadCorralltrks1", 1., "hadronic correction fraction for complete cluster energy subtraction for all matched tracks"}; // 100% - all tracks + Configurable hadCorralltrks2{"hadCorralltrks2", 0.7, "hadronic correction fraction for systematic studies for all matched tracks"}; // 70% Configurable minDEta{"minDEta", 0.01, "Minimum dEta between track and cluster"}; Configurable minDPhi{"minDPhi", 0.01, "Minimum dPhi between track and cluster"}; - Configurable fConstantSubtractionValue{"ConstantSubtractionValue", 0.236, "Value to be used for constant MIP subtraction (only applicable if using constant subtraction in M02 scheme)"}; + Configurable constantSubtractionValue{"constantSubtractionValue", 0.236, "Value to be used for constant MIP subtraction (only applicable if using constant subtraction in M02 scheme)"}; // pT-dependent track-matching configurables - Configurable Eta0{"eta0", 0.04, "Param 0 in eta for pt-dependent matching"}; - Configurable Eta1{"eta1", 0.010, "Param 1 in eta for pt-dependent matching"}; - Configurable Eta2{"eta2", 2.5, "Param 2 in eta for pt-dependent matching"}; - Configurable Phi0{"phi0", 0.09, "Param 0 in phi for pt-dependent matching"}; - Configurable Phi1{"phi1", 0.015, "Param 1 in phi for pt-dependent matching"}; - Configurable Phi2{"phi2", 2.0, "Param 2 in phi for pt-dependent matching"}; - Configurable PhiMatch{"phiMatch", 0.050, "phi match value in pp"}; - Configurable EtaMatch{"etaMatch", 0.025, "eta match value in pp"}; + Configurable eta0{"eta0", 0.04, "Param 0 in eta for pt-dependent matching"}; + Configurable eta1{"eta1", 0.010, "Param 1 in eta for pt-dependent matching"}; + Configurable eta2{"eta2", 2.5, "Param 2 in eta for pt-dependent matching"}; + Configurable phi0{"phi0", 0.09, "Param 0 in phi for pt-dependent matching"}; + Configurable phi1{"phi1", 0.015, "Param 1 in phi for pt-dependent matching"}; + Configurable phi2{"phi2", 2.0, "Param 2 in phi for pt-dependent matching"}; Configurable doHadCorrSyst{"doHadCorrSyst", false, "Do hadronic correction for systematic studies"}; Configurable doMomDepMatching{"doMomDepMatching", true, "Do momentum dependent track matching"}; // to be always set to true in Run 3 - Configurable UseM02SubtractionScheme1{"UseM02SubtractionScheme1", false, "Flag to enable hadronic correction scheme using cluster M02 value for Ecluster1 and EclusterAll1"}; - Configurable UseM02SubtractionScheme2{"UseM02SubtractionScheme2", false, "Flag to enable hadronic correction scheme using cluster M02 value for Ecluster2 and EclusterAll2"}; - Configurable UseFraction1{"UseFraction1", false, "Fractional momentum subtraction for Ecluster1 and EclusterAll1"}; - Configurable UseFraction2{"UseFraction2", false, "Fractional momentum subtraction for Ecluster2 and EclusterAll2"}; + Configurable useM02SubtractionScheme1{"useM02SubtractionScheme1", false, "Flag to enable hadronic correction scheme using cluster M02 value for clusterE1 and clusterEAll1"}; + Configurable useM02SubtractionScheme2{"useM02SubtractionScheme2", false, "Flag to enable hadronic correction scheme using cluster M02 value for clusterE2 and clusterEAll2"}; + Configurable useFraction1{"useFraction1", false, "Fractional momentum subtraction for clusterE1 and clusterEAll1"}; + Configurable useFraction2{"useFraction2", false, "Fractional momentum subtraction for clusterE2 and clusterEAll2"}; void init(o2::framework::InitContext&) { - // Event histograms registry.add("h_allcollisions", "Total events; event status;entries", {HistType::kTH1F, {{1, 0.5, 1.5}}}); @@ -119,12 +101,13 @@ struct EmcalClusterHadronicCorrectionTask { registry.add("h_matchedtracks", "Total matched tracks; track status;entries", {HistType::kTH1F, {{1, 0.5, 1.5}}}); } - Filter clusterDefinitionSelection = (o2::aod::emcalcluster::definition == mClusterDefinition); - Filter trackSelection = (o2::aod::track::pt >= minTrackPt); + aod::EMCALClusterDefinition clusterDefinition = aod::emcalcluster::getClusterDefinitionFromString(clusterDefinitionS.value); + Filter clusterDefinitionSelection = (aod::jcluster::definition == static_cast(clusterDefinition)); + // The matching of clusters and tracks is already centralised in the EMCAL framework. // One only needs to apply a filter on matched clusters // Here looping over all collisions matched to EMCAL clusters - void processMatchedCollisions(collisionEvSelIt const&, o2::aod::EMCALClusters const& clusters, o2::aod::EMCALMatchedTracks const& matchedtracks, myTracks const&) + void processMatchedCollisions(aod::JetCollision const&, soa::Filtered> const& clusters, aod::JEMCTracks const& emcTracks, aod::JetTracks const&) { registry.fill(HIST("h_allcollisions"), 1); @@ -137,50 +120,50 @@ struct EmcalClusterHadronicCorrectionTask { for (const auto& cluster : clusters) { registry.fill(HIST("h_matchedclusters"), 1); - double Ecluster1; - double Ecluster2; - double EclusterAll1; - double EclusterAll2; - Ecluster1 = Ecluster2 = EclusterAll1 = EclusterAll2 = cluster.energy(); + double clusterE1; + double clusterE2; + double clusterEAll1; + double clusterEAll2; + clusterE1 = clusterE2 = clusterEAll1 = clusterEAll2 = cluster.energy(); registry.fill(HIST("h_ClsE"), cluster.energy()); registry.fill(HIST("h_ClsM02"), cluster.m02()); registry.fill(HIST("h_ClsTime"), cluster.time()); - // selecting ALL MATCHED TRACKS after slicing all entries in perClusterMatchedTracks by the cluster globalIndex - auto tracksofcluster = matchedtracks.sliceBy(perClusterMatchedTracks, cluster.globalIndex()); - int Nmatches = 0; // counter for closest matched track + int nMatches = 0; // counter for closest matched track double closestTrkP = 0.0; // closest track momentum double totalTrkP = 0.0; // total track momentum // pT-dependent track-matching instead of PID based track-matching to be adapted from Run 2 - suggested by Markus Fasel TF1 funcPtDepEta("func", "[1] + 1 / pow(x + pow(1 / ([0] - [1]), 1 / [2]), [2])"); - funcPtDepEta.SetParameters(Eta0, Eta1, Eta2); + funcPtDepEta.SetParameters(eta0, eta1, eta2); TF1 funcPtDepPhi("func", "[1] + 1 / pow(x + pow(1 / ([0] - [1]), 1 / [2]), [2])"); - funcPtDepEta.SetParameters(Phi0, Phi1, Phi2); + funcPtDepEta.SetParameters(phi0, phi1, phi2); // No matched tracks (trackless case) - if (tracksofcluster.size() == 0) { + if (cluster.matchedTracks().size() == 0) { // Use original cluster energy values, no subtraction needed. registry.fill(HIST("h2_ClsEvsNmatches"), cluster.energy(), 0); - registry.fill(HIST("h_Ecluster1"), Ecluster1); - registry.fill(HIST("h_Ecluster2"), Ecluster2); - registry.fill(HIST("h_EclusterAll1"), EclusterAll1); - registry.fill(HIST("h_EclusterAll2"), EclusterAll2); - registry.fill(HIST("h2_ClsEvsEcluster1"), cluster.energy(), Ecluster1); - registry.fill(HIST("h2_ClsEvsEcluster2"), cluster.energy(), Ecluster2); - registry.fill(HIST("h2_ClsEvsEclusterAll1"), cluster.energy(), EclusterAll1); - registry.fill(HIST("h2_ClsEvsEclusterAll2"), cluster.energy(), EclusterAll2); - hadroniccorrectedclusters(Ecluster1, Ecluster2, EclusterAll1, EclusterAll2); + registry.fill(HIST("h_Ecluster1"), clusterE1); + registry.fill(HIST("h_Ecluster2"), clusterE2); + registry.fill(HIST("h_EclusterAll1"), clusterEAll1); + registry.fill(HIST("h_EclusterAll2"), clusterEAll2); + registry.fill(HIST("h2_ClsEvsEcluster1"), cluster.energy(), clusterE1); + registry.fill(HIST("h2_ClsEvsEcluster2"), cluster.energy(), clusterE2); + registry.fill(HIST("h2_ClsEvsEclusterAll1"), cluster.energy(), clusterEAll1); + registry.fill(HIST("h2_ClsEvsEclusterAll2"), cluster.energy(), clusterEAll2); + clusterEnergyCorrectedTable(clusterE1, clusterE2, clusterEAll1, clusterEAll2); continue; } // Looping over all matched tracks for the cluster // Total number of matched tracks = 20 (hard-coded) - for (const auto& match : tracksofcluster) { - - double mom = abs(match.track_as().p()); + for (const auto& matchedTrack : cluster.matchedTracks_as()) { + if (matchedTrack.pt() < minTrackPt) { + continue; + } + double mom = abs(matchedTrack.p()); registry.fill(HIST("h_matchedtracks"), 1); // CASE 1: skip tracks with a very low pT @@ -194,8 +177,9 @@ struct EmcalClusterHadronicCorrectionTask { // c) If you want to do systematic studies -> perform the above two checks a) and b), and then subtract 70% energy instead of 100% // Perform dEta/dPhi matching - double dEta = match.track_as().trackEtaEmcal() - cluster.eta(); - double dPhi = TVector2::Phi_mpi_pi(match.track_as().trackPhiEmcal() - cluster.phi()); + auto emcTrack = (emcTracks.sliceBy(perTrackMatchedTrack, matchedTrack.globalIndex())).iteratorAt(0); + double dEta = emcTrack.etaEmcal() - cluster.eta(); + double dPhi = TVector2::Phi_mpi_pi(emcTrack.phiEmcal() - cluster.phi()); // Apply the eta and phi matching thresholds // dEta and dPhi cut : ensures that the matched track is within the desired eta/phi window @@ -207,11 +191,11 @@ struct EmcalClusterHadronicCorrectionTask { auto trackPhiLow = -funcPtDepPhi.Eval(mom); if ((dPhi < trackPhiHigh && dPhi > trackPhiLow) && fabs(dEta) < trackEtaMax) { - if (Nmatches == 0) { + if (nMatches == 0) { closestTrkP = mom; } totalTrkP += mom; - Nmatches++; + nMatches++; } } else { // Do fixed dEta/dPhi matching (non-pT dependent) @@ -220,89 +204,89 @@ struct EmcalClusterHadronicCorrectionTask { } // If track passes fixed dEta/dPhi cuts, process it - if (Nmatches == 0) { + if (nMatches == 0) { closestTrkP = mom; // Closest track match } totalTrkP += mom; // Accumulate momentum - Nmatches++; // Count this match + nMatches++; // Count this match } } // End of track loop - registry.fill(HIST("h2_ClsEvsNmatches"), cluster.energy(), Nmatches); + registry.fill(HIST("h2_ClsEvsNmatches"), cluster.energy(), nMatches); - if (Nmatches >= 1) { - if (UseM02SubtractionScheme1) { + if (nMatches >= 1) { + if (useM02SubtractionScheme1) { // Do M02-based correction if enabled - Ecluster1 = subtractM02ClusterEnergy(cluster.m02(), Ecluster1, Nmatches, closestTrkP, fHadCorr1, UseFraction1); - EclusterAll1 = subtractM02ClusterEnergy(cluster.m02(), EclusterAll1, Nmatches, totalTrkP, fHadCorralltrks1, UseFraction1); + clusterE1 = subtractM02ClusterEnergy(cluster.m02(), clusterE1, nMatches, closestTrkP, hadCorr1, useFraction1); + clusterEAll1 = subtractM02ClusterEnergy(cluster.m02(), clusterEAll1, nMatches, totalTrkP, hadCorralltrks1, useFraction1); } else { // Default energy subtraction (100% and 70%) - Ecluster1 = subtractClusterEnergy(Ecluster1, closestTrkP, fHadCorr1, Nmatches, UseFraction1); - EclusterAll1 = subtractClusterEnergy(EclusterAll1, totalTrkP, fHadCorralltrks1, Nmatches, UseFraction1); + clusterE1 = subtractClusterEnergy(clusterE1, closestTrkP, hadCorr1, nMatches, useFraction1); + clusterEAll1 = subtractClusterEnergy(clusterEAll1, totalTrkP, hadCorralltrks1, nMatches, useFraction1); } - if (UseM02SubtractionScheme2) { + if (useM02SubtractionScheme2) { // Do M02-based correction if enabled - Ecluster2 = subtractM02ClusterEnergy(cluster.m02(), Ecluster2, Nmatches, closestTrkP, fHadCorr2, UseFraction2); - EclusterAll2 = subtractM02ClusterEnergy(cluster.m02(), EclusterAll2, Nmatches, totalTrkP, fHadCorralltrks2, UseFraction2); + clusterE2 = subtractM02ClusterEnergy(cluster.m02(), clusterE2, nMatches, closestTrkP, hadCorr2, useFraction2); + clusterEAll2 = subtractM02ClusterEnergy(cluster.m02(), clusterEAll2, nMatches, totalTrkP, hadCorralltrks2, useFraction2); } else { // Default energy subtraction (100% and 70%) - Ecluster2 = subtractClusterEnergy(Ecluster2, closestTrkP, fHadCorr2, Nmatches, UseFraction2); - EclusterAll2 = subtractClusterEnergy(EclusterAll2, totalTrkP, fHadCorralltrks2, Nmatches, UseFraction2); + clusterE2 = subtractClusterEnergy(clusterE2, closestTrkP, hadCorr2, nMatches, useFraction2); + clusterEAll2 = subtractClusterEnergy(clusterEAll2, totalTrkP, hadCorralltrks2, nMatches, useFraction2); } } - registry.fill(HIST("h_Ecluster1"), Ecluster1); - registry.fill(HIST("h_Ecluster2"), Ecluster2); - registry.fill(HIST("h_EclusterAll1"), EclusterAll1); - registry.fill(HIST("h_EclusterAll2"), EclusterAll2); - registry.fill(HIST("h2_ClsEvsEcluster1"), cluster.energy(), Ecluster1); - registry.fill(HIST("h2_ClsEvsEcluster2"), cluster.energy(), Ecluster2); - registry.fill(HIST("h2_ClsEvsEclusterAll1"), cluster.energy(), EclusterAll1); - registry.fill(HIST("h2_ClsEvsEclusterAll2"), cluster.energy(), EclusterAll2); + registry.fill(HIST("h_Ecluster1"), clusterE1); + registry.fill(HIST("h_Ecluster2"), clusterE2); + registry.fill(HIST("h_EclusterAll1"), clusterEAll1); + registry.fill(HIST("h_EclusterAll2"), clusterEAll2); + registry.fill(HIST("h2_ClsEvsEcluster1"), cluster.energy(), clusterE1); + registry.fill(HIST("h2_ClsEvsEcluster2"), cluster.energy(), clusterE2); + registry.fill(HIST("h2_ClsEvsEclusterAll1"), cluster.energy(), clusterEAll1); + registry.fill(HIST("h2_ClsEvsEclusterAll2"), cluster.energy(), clusterEAll2); // Fill the table with all four corrected energies - hadroniccorrectedclusters(Ecluster1, Ecluster2, EclusterAll1, EclusterAll2); + clusterEnergyCorrectedTable(clusterE1, clusterE2, clusterEAll1, clusterEAll2); } // End of cluster loop } // process function ends + PROCESS_SWITCH(EmcalClusterHadronicCorrectionTask, processMatchedCollisions, "hadronic correction", true); // Helper function to prevent negative energy subtraction - double subtractClusterEnergy(double Ecluster, double mom, double correctionFactor, int Nmatches, bool UseFraction) + double subtractClusterEnergy(double clusterE, double mom, double correctionFactor, int nMatches, bool useFraction) { - double Ecorr = Ecluster; + double corrE = clusterE; // if (UseConstantSubtractionValue) { - if (!UseFraction) { - Ecorr = Ecluster - fConstantSubtractionValue * Nmatches; // Use constant value for MIP-subtraction (regardless of the cluster-shape) + if (!useFraction) { + corrE = clusterE - constantSubtractionValue * nMatches; // Use constant value for MIP-subtraction (regardless of the cluster-shape) } else { - Ecorr = Ecluster - correctionFactor * mom; // Fractional momentum subtraction + corrE = clusterE - correctionFactor * mom; // Fractional momentum subtraction } - return (Ecorr < 0) ? 0 : Ecorr; + return (corrE < 0) ? 0 : corrE; } // Helper function for M02-based energy subtraction (based on cluster-shape) - double subtractM02ClusterEnergy(double m02, double Ecluster, int Nmatches, double totalTrkP, double correctionFactor, bool UseFraction) + double subtractM02ClusterEnergy(double m02, double clusterE, int nMatches, double totalTrkP, double correctionFactor, bool useFraction) { - double Ecorr = Ecluster; + double corrE = clusterE; // For M02 in the single photon region, the signal is primarily: Single photons, single electrons, single MIPs if (m02 > 0.1 && m02 < 0.4) { // circular clusters(electron/photon) - Ecorr = 0; // Single electron, single MIP + corrE = 0; // Single electron, single MIP } else if (m02 > 0.4) { // Large M02 region (M02 > 0.4), more complex overlaps and hadronic showers. // The signal is primarily: Single hadronic shower, photon-photon overlap, photon-MIP overlap, MIP-MIP overlap, // MIP-hadronic shower overlap, hadronic shower - hadronic shower overlap) - if (!UseFraction) { - Ecorr = Ecluster - fConstantSubtractionValue * Nmatches; // Use constant value for MIP-subtraction (regardless of the cluster-shape) + if (!useFraction) { + corrE = clusterE - constantSubtractionValue * nMatches; // Use constant value for MIP-subtraction (regardless of the cluster-shape) } else { - Ecorr = Ecluster - correctionFactor * totalTrkP; // Fractional momentum subtraction + corrE = clusterE - correctionFactor * totalTrkP; // Fractional momentum subtraction } } - return (Ecorr < 0) ? 0 : Ecorr; // Prevent negative energy + return (corrE < 0) ? 0 : corrE; // Prevent negative energy } - PROCESS_SWITCH(EmcalClusterHadronicCorrectionTask, processMatchedCollisions, "Process matched clusters from collision", true); }; // end of struct WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc, TaskName{"emcal-cluster-hadronic-correction-task"})}; } diff --git a/PWGJE/Tasks/jetTutorial.cxx b/PWGJE/Tasks/jetTutorial.cxx index 5a58f28886e..cdc02e582f1 100644 --- a/PWGJE/Tasks/jetTutorial.cxx +++ b/PWGJE/Tasks/jetTutorial.cxx @@ -273,7 +273,7 @@ struct JetTutorialTask { angularity += std::pow(jetConstituent.pt(), kappa) * std::pow(jetutilities::deltaR(jet, jetConstituent), alpha); } - for (auto& jetCluster : jet.tracks_as()) { + for (auto& jetCluster : jet.clusters_as()) { angularity += std::pow(jetCluster.energy(), kappa) * std::pow(jetutilities::deltaR(jet, jetCluster), alpha); } diff --git a/PWGJE/Tasks/statPromptPhoton.cxx b/PWGJE/Tasks/statPromptPhoton.cxx index b3d1aaaffa9..ea25a14b00c 100644 --- a/PWGJE/Tasks/statPromptPhoton.cxx +++ b/PWGJE/Tasks/statPromptPhoton.cxx @@ -544,7 +544,7 @@ struct statPromptPhoton { } // now we check the realness of our prompt photons - auto ClusterParticles = mccluster.mcParticle_as(); + auto ClusterParticles = mccluster.mcParticles_as(); bool goodgentrigger = true; for (auto& clusterparticle : ClusterParticles) { if (clusterparticle.pdgCode() == 211 || clusterparticle.pdgCode() == 321 || clusterparticle.pdgCode() == 2212) { From 550f7b6df3da25665169a2e418a513203a22271a Mon Sep 17 00:00:00 2001 From: Rohaan Deb <67634136+RD0407@users.noreply.github.com> Date: Wed, 5 Feb 2025 08:26:30 +0100 Subject: [PATCH 0039/1650] [PWGLF] Update PWGLF/Tasks/Nuspex/spectraTOF.cxx (#9758) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Nuspex/spectraTOF.cxx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/PWGLF/Tasks/Nuspex/spectraTOF.cxx b/PWGLF/Tasks/Nuspex/spectraTOF.cxx index 75edcda1c69..27b73e9bcd3 100644 --- a/PWGLF/Tasks/Nuspex/spectraTOF.cxx +++ b/PWGLF/Tasks/Nuspex/spectraTOF.cxx @@ -486,6 +486,12 @@ struct tofSpectra { histos.add("MC/withPID/ka/neg/prm/pt/numtof", "recons. MC K^{-}", kTHnSparseD, {ptAxis, impParamAxis}); histos.add("MC/withPID/pr/pos/prm/pt/numtof", "recons. MC p", kTHnSparseD, {ptAxis, impParamAxis}); histos.add("MC/withPID/pr/neg/prm/pt/numtof", "recons. MC #bar{p}", kTHnSparseD, {ptAxis, impParamAxis}); + histos.add("MC/withPID/pi/pos/prm/pt/numtof_matched", "recons. MC #pi^{+}", kTHnSparseD, {ptAxis, impParamAxis}); + histos.add("MC/withPID/pi/neg/prm/pt/numtof_matched", "recons. MC #pi^{-}", kTHnSparseD, {ptAxis, impParamAxis}); + histos.add("MC/withPID/ka/pos/prm/pt/numtof_matched", "recons. MC K^{+}", kTHnSparseD, {ptAxis, impParamAxis}); + histos.add("MC/withPID/ka/neg/prm/pt/numtof_matched", "recons. MC K^{-}", kTHnSparseD, {ptAxis, impParamAxis}); + histos.add("MC/withPID/pr/pos/prm/pt/numtof_matched", "recons. MC p", kTHnSparseD, {ptAxis, impParamAxis}); + histos.add("MC/withPID/pr/neg/prm/pt/numtof_matched", "recons. MC #bar{p}", kTHnSparseD, {ptAxis, impParamAxis}); } else { histos.add("MC/withPID/pi/pos/prm/pt/num", "recons. MC #pi^{+}", kTHnSparseD, {ptAxis, multAxis}); histos.add("MC/withPID/pi/neg/prm/pt/num", "recons. MC #pi^{-}", kTHnSparseD, {ptAxis, multAxis}); From 50ff025edfd0e2742532a0983c6a034eb7c16526 Mon Sep 17 00:00:00 2001 From: omvazque Date: Wed, 5 Feb 2025 01:28:20 -0600 Subject: [PATCH 0040/1650] [PWGLF] Adds MC process function (#9750) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 579 +++++++++++++++---- 1 file changed, 459 insertions(+), 120 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index 70785811152..8f8ec7d6ffa 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -8,13 +8,16 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// + /// \file uccZdc.cxx /// /// \brief task for analysis of UCC with the ZDC /// \author Omar Vazquez (omar.vazquez.rueda@cern.ch) /// \since January 29, 2025 +#include +#include + #include "Common/CCDB/EventSelectionParams.h" #include "Common/CCDB/TriggerAliases.h" #include "Common/Core/TrackSelection.h" @@ -22,126 +25,244 @@ #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/TrackSelectionTables.h" +#include "CommonConstants/MathConstants.h" #include "Framework/AnalysisDataModel.h" #include "Framework/AnalysisTask.h" #include "Framework/HistogramRegistry.h" +#include "Framework/O2DatabasePDGPlugin.h" #include "Framework/runDataProcessing.h" #include "ReconstructionDataFormats/GlobalTrackID.h" #include "ReconstructionDataFormats/Track.h" +#include "TPDGCode.h" using namespace std; using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::aod::evsel; +using namespace o2::constants::physics; +using namespace o2::constants::math; -using ColEvSels = soa::Join; -using BCsRun3 = soa::Join; +using ColEvSels = soa::Join; +// o2::aod::BCsWithTimestamps = soa::Join +using BCsRun3 = soa::Join; + +using SimCollisions = soa::Join; +using SimTracks = soa::Join; +using TableTracks = soa::Join; struct UccZdc { + // Event selection + Configurable posZcut{"posZcut", +10.0, "z-vertex position cut"}; + Configurable minT0CcentCut{"minT0CcentCut", 0.0, "Min T0C Cent. cut"}; + Configurable maxT0CcentCut{"maxT0CcentCut", 90.0, "Max T0C Cent. cut"}; + + // Track selection settings + Configurable minItsNclusters{"minItsNclusters", 5, "minimum number of ITS clusters"}; + Configurable minTpcNclusters{"minTpcNclusters", 70, "minimum number of TPC clusters"}; + Configurable minTpcNcrossedRows{"minTpcNcrossedRows", 70, "minimum number of TPC crossed pad rows"}; + Configurable maxChiSquareTpc{"maxChiSquareTpc", 4.0, "maximum TPC chi^2/Ncls"}; + Configurable maxChiSquareIts{"maxChiSquareIts", 36.0, "maximum ITS chi^2/Ncls"}; + Configurable minPt{"minPt", 0.1, "minimum pt of the tracks"}; + Configurable maxPt{"maxPt", 50., "maximum pt of the tracks"}; + Configurable minEta{"minEta", -0.8, "minimum eta"}; + Configurable maxEta{"maxEta", +0.8, "maximum eta"}; + Configurable maxDcaxy{"maxDcaxy", 0.05, "Maximum DCAxy"}; + Configurable maxDcaz{"maxDcaz", 0.05, "Maximum DCAz"}; + Configurable setDCAselectionPtDep{"setDCAselectionPtDep", true, "require pt dependent selection"}; + Configurable par0{"par0", 0.0105, "par 0"}; + Configurable par1{"par1", 0.035, "par 1"}; // Configurables, binning - Configurable nBinsAmp{"nBinsAmp", 1025, "nbinsAmp"}; + Configurable nBinsAmpFV0{"nBinsAmpFV0", 1000, "Number of bins FV0 amplitude"}; + Configurable maxAmpFV0{"maxAmpFV0", 3000, "Max FV0 amplitude"}; + Configurable nBinsAmpFT0{"nBinsAmpFT0", 1000, "Number of bins FT0 amplitude"}; + Configurable maxAmpFT0{"maxAmpFT0", 3000, "Max FT0 amplitude"}; + Configurable nBinsNchT0{"nBinsNchT0", 1000, "nBinsNchT0"}; + Configurable maxNchFT0{"maxNchFT0", 1000, "Max Nch in the FT0"}; + Configurable nBinsNch{"nBinsNch", 2500, "# of bins for midrapidity Nch"}; + Configurable maxNch{"maxNch", 2500, "Max Nch at midrapidity"}; + Configurable nBinsZDC{"nBinsZDC", 1025, "nBinsZDC"}; Configurable maxZN{"maxZN", 4099.5, "Max ZN signal"}; Configurable maxZP{"maxZP", 3099.5, "Max ZP signal"}; Configurable maxZEM{"maxZEM", 3099.5, "Max ZEM signal"}; Configurable nBinsTDC{"nBinsTDC", 480, "nbinsTDC"}; - Configurable nBinsFit{"nBinsFit", 1000, "nbinsFit"}; - Configurable maxMultFV0{"maxMultFV0", 3000, "Max FV0 signal"}; - Configurable maxMultFT0{"maxMultFT0", 3000, "Max FT0 signal"}; + ConfigurableAxis binsPt{"binsPt", {VARIABLE_WIDTH, 0., 0.1, 0.25, 0.5, 1., 2., 4., 6., 8., 10., 20.}, "Binning of the pT axis"}; + ConfigurableAxis binsCent{"binsCent", {VARIABLE_WIDTH, 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.}, "T0C centrality binning"}; - // Analysis Histograms: Data - HistogramRegistry histos{ - "histos", + // Configurable flags ZDC + Configurable isTDCcut{"isTDCcut", false, "Flag for TDC cut"}; + Configurable tdcCut{"tdcCut", 1.0, "TDC cut"}; + Configurable tdcZNmincut{"tdcZNmincut", -4.0, "Min ZN TDC cut"}; + Configurable tdcZNmaxcut{"tdcZNmaxcut", -4.0, "Max ZN TDC cut"}; + Configurable tdcZPmincut{"tdcZPmincut", -4.0, "Min ZP TDC cut"}; + Configurable tdcZPmaxcut{"tdcZPmaxcut", -4.0, "Max ZP TDC cut"}; + + // Histograms: Data + HistogramRegistry registryData{ + "registryData", + {}, + OutputObjHandlingPolicy::AnalysisObject, + true, + true}; + + // Histograms: Sim + HistogramRegistry registrySim{ + "registrySim", {}, - OutputObjHandlingPolicy::AnalysisObject}; + OutputObjHandlingPolicy::AnalysisObject, + true, + true}; void init(InitContext const&) { // define axes you want to use const AxisSpec axisEvent{3, 0., +3.0, ""}; const AxisSpec axisEta{30, -1.5, +1.5, "#eta"}; + const AxisSpec axisPt{binsPt, "#it{p}_{T} (GeV/#it{c})"}; + const AxisSpec axisDeltaPt{100, -1.0, +1.0, "#Delta(p_{T})"}; + const AxisSpec axisCent{binsCent, "T0C centrality"}; + + // Histograms: paritcle-level info + registryData.add("EtaVsPhi", ";#eta;#varphi", kTH2F, + {{{axisEta}, {100, -0.1 * PI, +2.1 * PI}}}); + registryData.add("etaHistogram", "etaHistogram", kTH1F, {axisEta}); + registryData.add("ptHistogram", "ptHistogram", kTH1F, {axisPt}); + + registryData.add("hT0C_cent", ";T0C centrality;Entries", kTH1F, {axisCent}); + registryData.add("hEventCounter", "Event counter", kTH1F, {axisEvent}); + registryData.add("NchT0A", "NchT0A; Nch T0A; Entries", + {HistType::kTH1F, {{nBinsNchT0, -0.5, maxNchFT0}}}); + registryData.add("NchT0C", "NchT0C; Nch T0C; Entries", + {HistType::kTH1F, {{nBinsNchT0, -0.5, maxNchFT0}}}); - // Histograms - histos.add("etaHistogram", "etaHistogram", kTH1F, {axisEta}); - histos.add("hEventCounter", "Event counter", kTH1F, {axisEvent}); - histos.add("ZNAcomm", "; ZNA common energy; Entries", - {HistType::kTH1F, {{nBinsAmp, -0.5, maxZN}}}); - histos.add("ZNCcomm", "; ZNC common energy; Entries", - {HistType::kTH1F, {{nBinsAmp, -0.5, maxZN}}}); - histos.add("ZNAcoll", "ZNAcoll; ZNA amplitude; Entries", - {HistType::kTH1F, {{nBinsAmp, -0.5, maxZN}}}); - histos.add("ZPAcoll", "ZPAcoll; ZPA amplitude; Entries", - {HistType::kTH1F, {{nBinsAmp, -0.5, maxZP}}}); - histos.add("ZNCcoll", "ZNCcoll; ZNC amplitude; Entries", - {HistType::kTH1F, {{nBinsAmp, -0.5, maxZN}}}); - histos.add("ZPCcoll", "ZPCcoll; ZPC amplitude; Entries", - {HistType::kTH1F, {{nBinsAmp, -0.5, maxZP}}}); - histos.add("ZEM1coll", "ZEM1coll; ZEM1 amplitude; Entries", - {HistType::kTH1F, {{nBinsAmp, -0.5, maxZEM}}}); - histos.add("ZEM2coll", "ZEM2coll; ZEM2 amplitude; Entries", - {HistType::kTH1F, {{nBinsAmp, -0.5, maxZEM}}}); - histos.add("ZNvsZEMcoll", "ZNvsZEMcoll; ZEM; ZNA+ZNC", - {HistType::kTH2F, - {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); - histos.add("ZNAvsZNCcoll", "ZNAvsZNCcoll; ZNC; ZNA", - {HistType::kTH2F, - {{{nBinsAmp, -0.5, maxZN}, {nBinsAmp, -0.5, maxZN}}}}); - histos.add("ZPAvsZPCcoll", "ZPAvsZPCcoll; ZPA; ZPC", - {HistType::kTH2F, - {{{nBinsAmp, -0.5, maxZP}, {nBinsAmp, -0.5, maxZP}}}}); - histos.add("ZNAvsZPAcoll", "ZNAvsZPAcoll; ZPA; ZNA", - {HistType::kTH2F, - {{{nBinsAmp, -0.5, maxZP}, {nBinsAmp, -0.5, maxZN}}}}); - histos.add("ZNCvsZPCcoll", "ZNCvsZPCcoll; ZPC; ZNC", - {HistType::kTH2F, - {{{nBinsAmp, -0.5, maxZP}, {nBinsAmp, -0.5, maxZN}}}}); - // - histos.add("ZNCvstdccoll", "ZNCvstdccoll; time ZNC; ZNC", - {HistType::kTH2F, - {{{nBinsTDC, -13.5, 11.45}, {nBinsAmp, -0.5, maxZN}}}}); - histos.add("ZNAvstdccoll", "ZNAvstdccoll; time ZNA; ZNA", - {HistType::kTH2F, - {{{nBinsTDC, -13.5, 11.45}, {nBinsAmp, -0.5, maxZN}}}}); - histos.add("ZPCvstdccoll", "ZPCvstdccoll; time ZPC; ZPC", - {HistType::kTH2F, - {{{nBinsTDC, -13.5, 11.45}, {nBinsAmp, -0.5, maxZP}}}}); - histos.add("ZPAvstdccoll", "ZPAvstdccoll; time ZPA; ZPA", - {HistType::kTH2F, - {{{nBinsTDC, -13.5, 11.45}, {nBinsAmp, -0.5, maxZP}}}}); - histos.add("ZEM1vstdccoll", "ZEM1vstdccoll; time ZEM1; ZEM1", - {HistType::kTH2F, - {{{nBinsTDC, -13.5, 11.45}, {nBinsAmp, -0.5, maxZEM}}}}); - histos.add("ZEM2vstdccoll", "ZEM2vstdccoll; time ZEM2; ZEM2", - {HistType::kTH2F, - {{{nBinsTDC, -13.5, 11.45}, {nBinsAmp, -0.5, maxZEM}}}}); - histos.add("debunch", "ZN sum vs. ZN diff.", - {HistType::kTH2F, {{{240, -12., 12.}, {240, -12., 12.}}}}); - histos.add("ZNvsFV0Acorrel", "ZNvsFV0Acorrel", - {HistType::kTH2F, - {{{nBinsFit, 0., maxMultFV0}, {nBinsAmp, -0.5, 2. * maxZN}}}}); - histos.add("ZNvsFT0correl", "ZNvsFT0correl", - {HistType::kTH2F, - {{{nBinsFit, 0., maxMultFT0}, {nBinsAmp, -0.5, 2. * maxZN}}}}); + registryData.add("ZNAcomm", "; ZNA common energy; Entries", + {HistType::kTH1F, {{nBinsZDC, -0.5, maxZN}}}); + registryData.add("ZNCcomm", "; ZNC common energy; Entries", + {HistType::kTH1F, {{nBinsZDC, -0.5, maxZN}}}); + registryData.add("ZNA", "ZNA; ZNA amplitude; Entries", + {HistType::kTH1F, {{nBinsZDC, -0.5, maxZN}}}); + registryData.add("ZPA", "ZPA; ZPA amplitude; Entries", + {HistType::kTH1F, {{nBinsZDC, -0.5, maxZP}}}); + registryData.add("ZNC", "ZNC; ZNC amplitude; Entries", + {HistType::kTH1F, {{nBinsZDC, -0.5, maxZN}}}); + registryData.add("ZPC", "ZPC; ZPC amplitude; Entries", + {HistType::kTH1F, {{nBinsZDC, -0.5, maxZP}}}); + registryData.add("ZEM1", "ZEM1; ZEM1 amplitude; Entries", + {HistType::kTH1F, {{nBinsZDC, -0.5, maxZEM}}}); + registryData.add("ZEM2", "ZEM2; ZEM2 amplitude; Entries", + {HistType::kTH1F, {{nBinsZDC, -0.5, maxZEM}}}); + registryData.add("ZNvsZEM", "ZNvsZEM; ZEM; ZNA+ZNC", + {HistType::kTH2F, + {{{nBinsZDC, -0.5, maxZEM}, {nBinsZDC, -0.5, maxZN}}}}); + registryData.add("ZNAvsZNC", "ZNAvsZNC; ZNC; ZNA", + {HistType::kTH2F, + {{{nBinsZDC, -0.5, maxZN}, {nBinsZDC, -0.5, maxZN}}}}); + registryData.add("ZPAvsZPC", "ZPAvsZPC; ZPA; ZPC", + {HistType::kTH2F, + {{{nBinsZDC, -0.5, maxZP}, {nBinsZDC, -0.5, maxZP}}}}); + registryData.add("ZNAvsZPA", "ZNAvsZPA; ZPA; ZNA", + {HistType::kTH2F, + {{{nBinsZDC, -0.5, maxZP}, {nBinsZDC, -0.5, maxZN}}}}); + registryData.add("ZNCvsZPC", "ZNCvsZPC; ZPC; ZNC", + {HistType::kTH2F, + {{{nBinsZDC, -0.5, maxZP}, {nBinsZDC, -0.5, maxZN}}}}); + registryData.add("ZNCvstdc", "ZNCvstdc; time ZNC; ZNC", + {HistType::kTH2F, + {{{nBinsTDC, -13.5, 11.45}, {nBinsZDC, -0.5, maxZN}}}}); + registryData.add("ZNAvstdc", "ZNAvstdc; time ZNA; ZNA", + {HistType::kTH2F, + {{{nBinsTDC, -13.5, 11.45}, {nBinsZDC, -0.5, maxZN}}}}); + registryData.add("ZPCvstdc", "ZPCvstdc; time ZPC; ZPC", + {HistType::kTH2F, + {{{nBinsTDC, -13.5, 11.45}, {nBinsZDC, -0.5, maxZP}}}}); + registryData.add("ZPAvstdc", "ZPAvstdc; time ZPA; ZPA", + {HistType::kTH2F, + {{{nBinsTDC, -13.5, 11.45}, {nBinsZDC, -0.5, maxZP}}}}); + registryData.add("ZEM1vstdc", "ZEM1vstdc; time ZEM1; ZEM1", + {HistType::kTH2F, + {{{nBinsTDC, -13.5, 11.45}, {nBinsZDC, -0.5, maxZEM}}}}); + registryData.add("ZEM2vstdc", "ZEM2vstdc; time ZEM2; ZEM2", + {HistType::kTH2F, + {{{nBinsTDC, -13.5, 11.45}, {nBinsZDC, -0.5, maxZEM}}}}); + registryData.add("debunch", + "ZN sum vs. ZN diff.; t_{ZNA}-t_{ZNC}; t_{ZNA}+t_{ZNC}", + {HistType::kTH2F, {{{240, -12., 12.}, {240, -12., 12.}}}}); + registryData.add( + "ZNvsFV0A", "ZNvsFV0A", + {HistType::kTH2F, + {{{nBinsAmpFV0, 0., maxAmpFV0}, {nBinsZDC, -0.5, maxZN}}}}); + registryData.add( + "ZNvsFT0", "FT0", + {HistType::kTH2F, + {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsZDC, -0.5, maxZN}}}}); + + registryData.add("ZNCvsNch", ";Nch (|#eta|<0.8);ZNC", + {HistType::kTH2F, + {{{nBinsNch, -0.5, maxNch}, {nBinsZDC, -0.5, maxZN}}}}); + registryData.add("ZNAvsNch", ";Nch (|#eta|<0.8);ZNA", + {HistType::kTH2F, + {{{nBinsNch, -0.5, maxNch}, {nBinsZDC, -0.5, maxZN}}}}); + + // MC Histograms + registrySim.add("hEvent_MC_rec", "Event counter", kTH1F, {axisEvent}); + registrySim.add("hT0C_cent_rec", ";T0C centrality;Entries", kTH1F, {axisCent}); + registrySim.add("Pt_MC_rec_ch", ";p_{T};Entries;", kTH1F, {axisPt}); + registrySim.add("Pt_MC_rec_pi", ";p_{T};Entries;", kTH1F, {axisPt}); + registrySim.add("Pt_MC_rec_ka", ";p_{T};Entries;", kTH1F, {axisPt}); + registrySim.add("Pt_MC_rec_pr", ";p_{T};Entries;", kTH1F, {axisPt}); + registrySim.add("Pt_MC_rec_sigpos", "#Sigma^{+};p_{T};Entries;", kTH1F, + {axisPt}); + registrySim.add("Pt_MC_rec_signeg", "#Sigma^{-};p_{T};Entries;", kTH1F, + {axisPt}); + registrySim.add("Pt_MC_rec_re", "Remaining ch particles;p_{T};Entries;", + kTH1F, {axisPt}); + registrySim.add("EtaVsPhi_MC_rec", ";#eta;#varphi", kTH2F, + {{{axisEta}, {100, -0.1 * PI, +2.1 * PI}}}); + + registrySim.add("numberOfRecoCollisions", "", + {HistType::kTH1F, {{6, -0.5, 5.5}}}); + registrySim.add("hEvent_MC_tru", "Event counter", kTH1F, {axisEvent}); + registrySim.add("hZpos_MC_tru", "z_{vtx}", + {HistType::kTH1F, {{48, -12., 12}}}); + registrySim.add("hZpos_MC_rec", "z_{vtx}", + {HistType::kTH1F, {{48, -12., 12}}}); + registrySim.add( + "aV0Avsb", ";V0A amplitude; Impact parameter", + {HistType::kTH2F, {{{nBinsAmpFV0, 0., maxAmpFV0}, {19, 0., 18.}}}}); + registrySim.add( + "aT0Avsb", ";T0A amplitude; Impact parameter", + {HistType::kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {19, 0., 18.}}}}); + registrySim.add( + "aT0Cvsb", ";T0C amplitude; Impact parameter", + {HistType::kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {19, -0.5, 18.5}}}}); + registrySim.add("Pt_MC_tru_ch", ";p_{T};Entries;", kTH1F, {axisPt}); + registrySim.add("Pt_MC_tru_pi", ";p_{T};Entries;", kTH1F, {axisPt}); + registrySim.add("Pt_MC_tru_ka", ";p_{T};Entries;", kTH1F, {axisPt}); + registrySim.add("Pt_MC_tru_pr", ";p_{T};Entries;", kTH1F, {axisPt}); + registrySim.add("Pt_MC_tru_sigpos", "#Sigma^{+};p_{T};Entries;", kTH1F, + {axisPt}); + registrySim.add("Pt_MC_tru_signeg", "#Sigma^{-};p_{T};Entries;", kTH1F, + {axisPt}); + registrySim.add("Pt_MC_tru_re", "Remaining ch particles;p_{T};Entries;", + kTH1F, {axisPt}); } - void processZdcCollAss( - ColEvSels const& cols, BCsRun3 const& /*bcs*/, aod::Zdcs const& /*zdcs*/, - aod::FV0As const& /*fv0as*/, aod::FT0s const& /*ft0s*/, - soa::Join const& tracks) + void processZdcCollAss(ColEvSels const& cols, BCsRun3 const& /*bcs*/, + aod::Zdcs const& /*zdcs*/, aod::FV0As const& /*fv0as*/, + aod::FT0s const& /*ft0s*/, TableTracks const& tracks) { // Collision loop for (const auto& collision : cols) { - histos.fill(HIST("hEventCounter"), 0.5); + registryData.fill(HIST("hEventCounter"), 0.5); if (!collision.sel8()) { return; } - histos.fill(HIST("hEventCounter"), 1.5); + registryData.fill(HIST("hEventCounter"), 1.5); const auto& foundBC = collision.foundBC_as(); if (foundBC.has_zdc()) { - histos.fill(HIST("hEventCounter"), 2.5); + registryData.fill(HIST("hEventCounter"), 2.5); const auto& zdcread = foundBC.zdc(); auto aZNA = zdcread.amplitudeZNA(); @@ -156,69 +277,287 @@ struct UccZdc { auto tZNC = zdcread.timeZNC(); auto tZPA = zdcread.timeZPA(); auto tZPC = zdcread.timeZPC(); - float multT0A{0.}; - float multT0C{0.}; - float multV0A{0.}; + float tZNdif{tZNA - tZNC}; + float tZNsum{tZNA + tZNC}; + float sumZNs{aZNA + aZNC}; + float sumZEMs{aZEM1 + aZEM2}; + float sumT0s{0.}; + float aT0A{0.}; + float aT0C{0.}; + float aV0A{0.}; + float nchT0A{0.}; + float nchT0C{0.}; + float nchTPC = collision.multTPC(); if (foundBC.has_ft0()) { for (const auto& amplitude : foundBC.ft0().amplitudeA()) { - multT0A += amplitude; + aT0A += amplitude; } for (const auto& amplitude : foundBC.ft0().amplitudeC()) { - multT0C += amplitude; + aT0C += amplitude; } + sumT0s = aT0A + aT0C; + nchT0A = collision.multZeqFT0A(); + nchT0C = collision.multZeqFT0C(); } else { - multT0A = multT0C = -999; + aT0A = aT0C = -999.; + sumT0s = -999.; } if (foundBC.has_fv0a()) { for (const auto& amplitude : foundBC.fv0a().amplitude()) { - multV0A += amplitude; + aV0A += amplitude; } } else { - multV0A = -999; + aV0A = -999.; + } + + if (isTDCcut) { + if (std::sqrt(std::pow(tZNdif, 2.) + std::pow(tZNsum, 2.)) > tdcCut) { + return; + } + } + + // T0C centrality cut + if (collision.centFT0C() < minT0CcentCut || collision.centFT0C() > maxT0CcentCut) { + continue; } - histos.get(HIST("ZNAcomm"))->Fill(zdcread.energyCommonZNA()); - histos.get(HIST("ZNCcomm"))->Fill(zdcread.energyCommonZNC()); - histos.get(HIST("ZNAcoll"))->Fill(aZNA); - histos.get(HIST("ZNCcoll"))->Fill(aZNC); - histos.get(HIST("ZPAcoll"))->Fill(aZPA); - histos.get(HIST("ZPCcoll"))->Fill(aZPC); - histos.get(HIST("ZNvsZEMcoll"))->Fill(aZEM1 + aZEM2, aZNA + aZNC); - histos.get(HIST("ZNAvsZNCcoll"))->Fill(aZNC, aZNA); - histos.get(HIST("ZPAvsZPCcoll"))->Fill(aZPC, aZPA); - histos.get(HIST("ZNAvsZPAcoll"))->Fill(aZPA, aZNA); - histos.get(HIST("ZNCvsZPCcoll"))->Fill(aZPC, aZNC); - - histos.get(HIST("ZEM1coll"))->Fill(aZEM1); - histos.get(HIST("ZEM2coll"))->Fill(aZEM2); - histos.get(HIST("ZNCvstdccoll"))->Fill(tZNC, aZNC); - histos.get(HIST("ZNAvstdccoll"))->Fill(tZNA, aZNA); - histos.get(HIST("ZPCvstdccoll"))->Fill(tZPC, aZPC); - histos.get(HIST("ZPAvstdccoll"))->Fill(tZPA, aZPA); - histos.get(HIST("ZEM1vstdccoll"))->Fill(tZEM1, aZEM1); - histos.get(HIST("ZEM2vstdccoll"))->Fill(tZEM2, aZEM2); - histos.get(HIST("debunch"))->Fill(tZNA - tZNC, tZNA + tZNC); - - histos.get(HIST("ZNvsFV0Acorrel")) - ->Fill(multV0A / 100., aZNA + aZNC); - histos.get(HIST("ZNvsFT0correl")) - ->Fill((multT0A + multT0C) / 100., aZNC + aZNA); + registryData.fill(HIST("hT0C_cent"), collision.centFT0C()); + registryData.get(HIST("ZNA"))->Fill(aZNA); + registryData.get(HIST("ZNC"))->Fill(aZNC); + registryData.get(HIST("ZPA"))->Fill(aZPA); + registryData.get(HIST("ZPC"))->Fill(aZPC); + registryData.get(HIST("ZNAvsZNC"))->Fill(aZNC, aZNA); + registryData.get(HIST("ZNAvsZPA"))->Fill(aZPA, aZNA); + registryData.get(HIST("ZNCvsZPC"))->Fill(aZPC, aZNC); + registryData.get(HIST("ZPAvsZPC"))->Fill(aZPC, aZPA); + registryData.get(HIST("ZNAvsNch"))->Fill(nchTPC, aZNA); + registryData.get(HIST("ZNCvsNch"))->Fill(nchTPC, aZNC); + registryData.get(HIST("ZNvsZEM"))->Fill(sumZEMs, sumZNs); + registryData.get(HIST("ZNvsFV0A"))->Fill(aV0A / 100., sumZNs); + registryData.get(HIST("ZNvsFT0"))->Fill(sumT0s / 100., sumZNs); + registryData.get(HIST("ZNAcomm"))->Fill(zdcread.energyCommonZNA()); + registryData.get(HIST("ZNCcomm"))->Fill(zdcread.energyCommonZNC()); + registryData.get(HIST("ZEM1"))->Fill(aZEM1); + registryData.get(HIST("ZEM2"))->Fill(aZEM2); + registryData.get(HIST("ZNCvstdc"))->Fill(tZNC, aZNC); + registryData.get(HIST("ZNAvstdc"))->Fill(tZNA, aZNA); + registryData.get(HIST("ZPCvstdc"))->Fill(tZPC, aZPC); + registryData.get(HIST("ZPAvstdc"))->Fill(tZPA, aZPA); + registryData.get(HIST("ZEM1vstdc"))->Fill(tZEM1, aZEM1); + registryData.get(HIST("ZEM2vstdc"))->Fill(tZEM2, aZEM2); + registryData.get(HIST("debunch"))->Fill(tZNdif, tZNsum); + registryData.get(HIST("NchT0A"))->Fill(nchT0A); + registryData.get(HIST("NchT0C"))->Fill(nchT0C); + + for (const auto& track : tracks) { + // Track Selection + if (!track.isGlobalTrack()) { + continue; + } + + if (track.pt() < minPt || track.pt() > maxPt) { + continue; + } + // if (!passedTrackSelection(track)) { + // continue; + // } + registryData.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); + registryData.fill(HIST("etaHistogram"), track.eta()); + registryData.fill(HIST("ptHistogram"), track.pt()); + } } // foundBC.has_zdc() + } + } + PROCESS_SWITCH(UccZdc, processZdcCollAss, + "Processing ZDC w. collision association", true); + + Preslice perMCCollision = aod::mcparticle::mcCollisionId; + Preslice perCollision = aod::track::collisionId; + void processMC(aod::McCollisions const& mcCollisions, BCsRun3 const& /*bcs*/, + aod::Zdcs const& /*zdcs*/, aod::FT0s const& /*ft0s*/, + aod::FV0As const& /*fv0as*/, SimCollisions const& collisions, + aod::McParticles const& mcParticles, + SimTracks const& simTracks) + { + // Generated MC + for (const auto& mccollision : mcCollisions) { + registrySim.fill(HIST("hEvent_MC_tru"), 0.5); + // Z-vtx position cut + if (std::fabs(mccollision.posZ()) > posZcut) { + continue; + } + registrySim.fill(HIST("hZpos_MC_tru"), mccollision.posZ()); + registrySim.fill(HIST("hEvent_MC_tru"), 1.5); + + auto mcParticlesPerColl = + mcParticles.sliceBy(perMCCollision, mccollision.globalIndex()); + + for (const auto& particle : mcParticlesPerColl) { + if (particle.eta() < minEta || particle.eta() > maxEta) { + continue; + } + if (particle.pt() < minPt || particle.pt() > maxPt) { + continue; + } + registrySim.fill(HIST("Pt_MC_tru_ch"), particle.pt()); + if (particle.pdgCode() == PDG_t::kPiPlus || particle.pdgCode() == PDG_t::kPiMinus) { // pion + registrySim.fill(HIST("Pt_MC_tru_pi"), particle.pt()); + } else if (particle.pdgCode() == PDG_t::kKPlus || particle.pdgCode() == PDG_t::kKMinus) { // kaon + registrySim.fill(HIST("Pt_MC_tru_ka"), particle.pt()); + } else if (particle.pdgCode() == PDG_t::kProton || particle.pdgCode() == PDG_t::kProtonBar) { // proton + registrySim.fill(HIST("Pt_MC_tru_pr"), particle.pt()); + } else if (particle.pdgCode() == PDG_t::kSigmaPlus || particle.pdgCode() == PDG_t::kSigmaBarMinus) { // positive sigma + registrySim.fill(HIST("Pt_MC_tru_sigpos"), particle.pt()); + } else if (particle.pdgCode() == PDG_t::kSigmaMinus || particle.pdgCode() == PDG_t::kSigmaBarPlus) { // negative sigma + registrySim.fill(HIST("Pt_MC_tru_signeg"), particle.pt()); + } else { // rest + registrySim.fill(HIST("Pt_MC_tru_re"), particle.pt()); + } + } + } + registrySim.fill(HIST("numberOfRecoCollisions"), collisions.size()); + // if (collisions.size() == 0 || collisions.size() > 1) { + // return; + // } + //----- MC reconstructed -----// + for (const auto& collision : collisions) { + if (!collision.has_mcCollision()) { + continue; + } + const auto& mccollision = collision.mcCollision_as(); + registrySim.fill(HIST("hEvent_MC_rec"), 0.5); + + // Event Selection + if (!collision.sel8()) { + continue; + } + registrySim.fill(HIST("hEvent_MC_rec"), 1.5); + + // Z-vertex position cut + if (std::fabs(collision.posZ()) > posZcut) { + continue; + } + + // T0C centrality cut + if (collision.centFT0C() < minT0CcentCut || collision.centFT0C() > maxT0CcentCut) { + continue; + } + + registrySim.fill(HIST("hEvent_MC_rec"), 2.5); + registrySim.fill(HIST("hZpos_MC_rec"), collision.posZ()); + + const auto& foundBC = collision.foundBC_as(); + if (foundBC.has_zdc()) { + return; + } + float aT0A{0.0}; + float aT0C{0.0}; + float aV0A{0.0}; + float b{mccollision.impactParameter()}; + if (foundBC.has_ft0()) { + for (const auto& amplitude : foundBC.ft0().amplitudeA()) { + aT0A += amplitude; + } + for (const auto& amplitude : foundBC.ft0().amplitudeC()) { + aT0C += amplitude; + } + } else { + aT0A = aT0C = -999; + } + if (foundBC.has_fv0a()) { + for (const auto& amplitude : foundBC.fv0a().amplitude()) { + aV0A += amplitude; + } + } else { + aV0A = -999; + } + + registrySim.fill(HIST("hT0C_cent_rec"), collision.centFT0C()); + registrySim.fill(HIST("aT0Avsb"), aT0A / 100., b); + registrySim.fill(HIST("aT0Cvsb"), aT0C / 100., b); + registrySim.fill(HIST("aV0Avsb"), aV0A / 100., b); - for (const auto& track : tracks) { - if (track.tpcNClsCrossedRows() < 70) + auto groupedTracks = + simTracks.sliceBy(perCollision, collision.globalIndex()); + + for (const auto& track : groupedTracks) { + if (!track.has_mcParticle()) { + continue; + } + // Track Selection + if (!track.isGlobalTrack()) { continue; - if (std::fabs(track.dcaXY()) > 0.2) + } + if (track.pt() < minPt || track.pt() > maxPt) { continue; + } + // if (!passedTrackSelection(track)) { + // continue; + // } - histos.fill(HIST("etaHistogram"), track.eta()); + registrySim.fill(HIST("EtaVsPhi_MC_rec"), track.eta(), track.phi()); + + const auto particle = track.mcParticle(); + registrySim.fill(HIST("Pt_MC_rec_ch"), track.pt()); + if (particle.pdgCode() == PDG_t::kPiPlus || particle.pdgCode() == PDG_t::kPiMinus) { + registrySim.fill(HIST("Pt_MC_rec_pi"), track.pt()); + } else if (particle.pdgCode() == PDG_t::kKPlus || particle.pdgCode() == PDG_t::kKMinus) { + registrySim.fill(HIST("Pt_MC_rec_ka"), track.pt()); + } else if (particle.pdgCode() == PDG_t::kProton || particle.pdgCode() == PDG_t::kProtonBar) { + registrySim.fill(HIST("Pt_MC_rec_pr"), track.pt()); + } else if (particle.pdgCode() == PDG_t::kSigmaPlus || particle.pdgCode() == PDG_t::kSigmaBarMinus) { + registrySim.fill(HIST("Pt_MC_rec_sigpos"), track.pt()); + } else if (particle.pdgCode() == PDG_t::kSigmaMinus || particle.pdgCode() == PDG_t::kSigmaBarPlus) { + registrySim.fill(HIST("Pt_MC_rec_signeg"), track.pt()); + } else { + registrySim.fill(HIST("Pt_MC_rec_re"), track.pt()); + } } } } - PROCESS_SWITCH(UccZdc, processZdcCollAss, - "Processing ZDC w. collision association", true); + PROCESS_SWITCH(UccZdc, processMC, "process pure simulation", false); + + // Single-Track Selection + template + bool passedTrackSelection(const T2& track) + { + if (track.eta() < minEta || track.eta() > maxEta) + return false; + if (track.pt() < minPt) + return false; + + if (!track.hasITS()) + return false; + if (track.itsNCls() < minItsNclusters) + return false; + if (!track.hasTPC()) + return false; + if (track.tpcNClsFound() < minTpcNclusters) + return false; + if (track.tpcNClsCrossedRows() < minTpcNcrossedRows) + return false; + if (track.tpcChi2NCl() > maxChiSquareTpc) + return false; + if (track.itsChi2NCl() > maxChiSquareIts) + return false; + // pt-dependent selection + if (setDCAselectionPtDep) { + if (std::fabs(track.dcaXY()) > (par0 + par1 / track.pt())) + return false; + if (std::fabs(track.dcaZ()) > (par0 + par1 / track.pt())) + return false; + } + // standard selection + if (!setDCAselectionPtDep) { + if (std::fabs(track.dcaXY()) > maxDcaxy) + return false; + if (std::fabs(track.dcaZ()) > maxDcaz) + return false; + } + return true; + } }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From cc8289ae7ef78d2988075ff8798386c4e47d09c0 Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Wed, 5 Feb 2025 08:29:00 +0100 Subject: [PATCH 0041/1650] [PWGLF] CollisionCuts: Remove unused trigger check and add additional event selections (#9737) --- .../Resonances/resonanceInitializer.cxx | 5 +- .../Resonances/resonanceModuleInitializer.cxx | 5 +- PWGLF/Tasks/Resonances/chk892Flow.cxx | 3 +- PWGLF/Tasks/Resonances/chk892flow_pp.cxx | 3 +- PWGLF/Tasks/Resonances/chk892pp.cxx | 3 +- PWGLF/Utils/collisionCuts.h | 84 +++++++++---------- 6 files changed, 49 insertions(+), 54 deletions(-) diff --git a/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx b/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx index 78b12dabb7b..374296d0a76 100644 --- a/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx +++ b/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx @@ -94,7 +94,6 @@ struct ResonanceInitializer { Configurable cfgEvtZvtx{"cfgEvtZvtx", 10.f, "Evt sel: Max. z-Vertex (cm)"}; Configurable cfgEvtOccupancyInTimeRange{"cfgEvtOccupancyInTimeRange", -1, "Evt sel: maximum track occupancy"}; Configurable cfgEvtTriggerCheck{"cfgEvtTriggerCheck", false, "Evt sel: check for trigger"}; - Configurable cfgEvtTriggerSel{"cfgEvtTriggerSel", 8, "Evt sel: trigger"}; Configurable cfgEvtOfflineCheck{"cfgEvtOfflineCheck", true, "Evt sel: check for offline selection"}; Configurable cfgEvtTriggerTVXSel{"cfgEvtTriggerTVXSel", false, "Evt sel: triggerTVX selection (MB)"}; Configurable cfgEvtTFBorderCut{"cfgEvtTFBorderCut", false, "Evt sel: apply TF border cut"}; @@ -964,9 +963,9 @@ struct ResonanceInitializer { // Case selector based on the process. if (doprocessTrackDataRun2 || doprocessTrackV0DataRun2 || doprocessTrackV0CascDataRun2 || doprocessTrackMCRun2 || doprocessTrackV0MCRun2 || doprocessTrackV0CascMCRun2) { - colCuts.setCuts(cfgEvtZvtx, cfgEvtTriggerCheck, cfgEvtTriggerSel, cfgEvtOfflineCheck, false); + colCuts.setCuts(cfgEvtZvtx, cfgEvtTriggerCheck, cfgEvtOfflineCheck, false); } else if (doprocessTrackData || doprocessTrackV0Data || doprocessTrackV0CascData || doprocessTrackMC || doprocessTrackV0MC || doprocessTrackV0CascMC || doprocessTrackEPData) { - colCuts.setCuts(cfgEvtZvtx, cfgEvtTriggerCheck, cfgEvtTriggerSel, cfgEvtOfflineCheck, true, false, cfgEvtOccupancyInTimeRange); + colCuts.setCuts(cfgEvtZvtx, cfgEvtTriggerCheck, cfgEvtOfflineCheck, true, false, cfgEvtOccupancyInTimeRange); } colCuts.init(&qaRegistry); colCuts.setTriggerTVX(cfgEvtTriggerTVXSel); diff --git a/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx b/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx index a843544b924..e5473d75870 100644 --- a/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx +++ b/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx @@ -95,7 +95,6 @@ struct ResonanceModuleInitializer { Configurable cfgEvtZvtx{"cfgEvtZvtx", 10.f, "Evt sel: Max. z-Vertex (cm)"}; Configurable cfgEvtOccupancyInTimeRange{"cfgEvtOccupancyInTimeRange", -1, "Evt sel: maximum track occupancy"}; Configurable cfgEvtTriggerCheck{"cfgEvtTriggerCheck", false, "Evt sel: check for trigger"}; - Configurable cfgEvtTriggerSel{"cfgEvtTriggerSel", 8, "Evt sel: trigger"}; Configurable cfgEvtOfflineCheck{"cfgEvtOfflineCheck", true, "Evt sel: check for offline selection"}; Configurable cfgEvtTriggerTVXSel{"cfgEvtTriggerTVXSel", false, "Evt sel: triggerTVX selection (MB)"}; Configurable cfgEvtTFBorderCut{"cfgEvtTFBorderCut", false, "Evt sel: apply TF border cut"}; @@ -155,9 +154,9 @@ struct ResonanceModuleInitializer { // Initialize event selection cuts based on the process type if (doprocessRun2) { - colCuts.setCuts(cfgEvtZvtx, cfgEvtTriggerCheck, cfgEvtTriggerSel, cfgEvtOfflineCheck, false); + colCuts.setCuts(cfgEvtZvtx, cfgEvtTriggerCheck, cfgEvtOfflineCheck, false); } else if (doprocessRun3) { - colCuts.setCuts(cfgEvtZvtx, cfgEvtTriggerCheck, cfgEvtTriggerSel, cfgEvtOfflineCheck, true, false, cfgEvtOccupancyInTimeRange); + colCuts.setCuts(cfgEvtZvtx, cfgEvtTriggerCheck, cfgEvtOfflineCheck, true, false, cfgEvtOccupancyInTimeRange); } colCuts.init(&qaRegistry); colCuts.setTriggerTVX(cfgEvtTriggerTVXSel); diff --git a/PWGLF/Tasks/Resonances/chk892Flow.cxx b/PWGLF/Tasks/Resonances/chk892Flow.cxx index ca63b51ee55..3834e9dfd88 100644 --- a/PWGLF/Tasks/Resonances/chk892Flow.cxx +++ b/PWGLF/Tasks/Resonances/chk892Flow.cxx @@ -126,7 +126,6 @@ struct Chk892Flow { Configurable cfgEvtOccupancyInTimeRangeMax{"cfgEvtOccupancyInTimeRangeMax", -1, "Evt sel: maximum track occupancy"}; Configurable cfgEvtOccupancyInTimeRangeMin{"cfgEvtOccupancyInTimeRangeMin", -1, "Evt sel: minimum track occupancy"}; Configurable cfgEvtTriggerCheck{"cfgEvtTriggerCheck", false, "Evt sel: check for trigger"}; - Configurable cfgEvtTriggerSel{"cfgEvtTriggerSel", 8, "Evt sel: trigger"}; Configurable cfgEvtOfflineCheck{"cfgEvtOfflineCheck", true, "Evt sel: check for offline selection"}; Configurable cfgEvtTriggerTVXSel{"cfgEvtTriggerTVXSel", false, "Evt sel: triggerTVX selection (MB)"}; Configurable cfgEvtTFBorderCut{"cfgEvtTFBorderCut", false, "Evt sel: apply TF border cut"}; @@ -231,7 +230,7 @@ struct Chk892Flow { { lCentrality = -999; - colCuts.setCuts(cfgEvtZvtx, cfgEvtTriggerCheck, cfgEvtTriggerSel, cfgEvtOfflineCheck, /*checkRun3*/ true, /*triggerTVXsel*/ false, cfgEvtOccupancyInTimeRangeMax, cfgEvtOccupancyInTimeRangeMin); + colCuts.setCuts(cfgEvtZvtx, cfgEvtTriggerCheck, cfgEvtOfflineCheck, /*checkRun3*/ true, /*triggerTVXsel*/ false, cfgEvtOccupancyInTimeRangeMax, cfgEvtOccupancyInTimeRangeMin); colCuts.init(&histos); colCuts.setTriggerTVX(cfgEvtTriggerTVXSel); colCuts.setApplyTFBorderCut(cfgEvtTFBorderCut); diff --git a/PWGLF/Tasks/Resonances/chk892flow_pp.cxx b/PWGLF/Tasks/Resonances/chk892flow_pp.cxx index 2adc9170064..7e1d65bd7e8 100644 --- a/PWGLF/Tasks/Resonances/chk892flow_pp.cxx +++ b/PWGLF/Tasks/Resonances/chk892flow_pp.cxx @@ -134,7 +134,6 @@ struct chk892_pp { Configurable ConfEvtOccupancyInTimeRangeMax{"ConfEvtOccupancyInTimeRangeMax", -1, "Evt sel: maximum track occupancy"}; Configurable ConfEvtOccupancyInTimeRangeMin{"ConfEvtOccupancyInTimeRangeMin", -1, "Evt sel: minimum track occupancy"}; Configurable ConfEvtTriggerCheck{"ConfEvtTriggerCheck", false, "Evt sel: check for trigger"}; - Configurable ConfEvtTriggerSel{"ConfEvtTriggerSel", 8, "Evt sel: trigger"}; Configurable ConfEvtOfflineCheck{"ConfEvtOfflineCheck", true, "Evt sel: check for offline selection"}; Configurable ConfEvtTriggerTVXSel{"ConfEvtTriggerTVXSel", false, "Evt sel: triggerTVX selection (MB)"}; Configurable ConfEvtTFBorderCut{"ConfEvtTFBorderCut", false, "Evt sel: apply TF border cut"}; @@ -222,7 +221,7 @@ struct chk892_pp { { centrality = -999; - colCuts.setCuts(ConfEvtZvtx, ConfEvtTriggerCheck, ConfEvtTriggerSel, ConfEvtOfflineCheck, /*checkRun3*/ true, /*triggerTVXsel*/ false, ConfEvtOccupancyInTimeRangeMax, ConfEvtOccupancyInTimeRangeMin); + colCuts.setCuts(ConfEvtZvtx, ConfEvtTriggerCheck, ConfEvtOfflineCheck, /*checkRun3*/ true, /*triggerTVXsel*/ false, ConfEvtOccupancyInTimeRangeMax, ConfEvtOccupancyInTimeRangeMin); colCuts.init(&histos); colCuts.setTriggerTVX(ConfEvtTriggerTVXSel); colCuts.setApplyTFBorderCut(ConfEvtTFBorderCut); diff --git a/PWGLF/Tasks/Resonances/chk892pp.cxx b/PWGLF/Tasks/Resonances/chk892pp.cxx index e61226dd567..269e8d0845d 100644 --- a/PWGLF/Tasks/Resonances/chk892pp.cxx +++ b/PWGLF/Tasks/Resonances/chk892pp.cxx @@ -134,7 +134,6 @@ struct chk892pp { Configurable ConfEvtOccupancyInTimeRangeMax{"ConfEvtOccupancyInTimeRangeMax", -1, "Evt sel: maximum track occupancy"}; Configurable ConfEvtOccupancyInTimeRangeMin{"ConfEvtOccupancyInTimeRangeMin", -1, "Evt sel: minimum track occupancy"}; Configurable ConfEvtTriggerCheck{"ConfEvtTriggerCheck", false, "Evt sel: check for trigger"}; - Configurable ConfEvtTriggerSel{"ConfEvtTriggerSel", 8, "Evt sel: trigger"}; Configurable ConfEvtOfflineCheck{"ConfEvtOfflineCheck", true, "Evt sel: check for offline selection"}; Configurable ConfEvtTriggerTVXSel{"ConfEvtTriggerTVXSel", false, "Evt sel: triggerTVX selection (MB)"}; Configurable ConfEvtTFBorderCut{"ConfEvtTFBorderCut", false, "Evt sel: apply TF border cut"}; @@ -222,7 +221,7 @@ struct chk892pp { { centrality = -999; - colCuts.setCuts(ConfEvtZvtx, ConfEvtTriggerCheck, ConfEvtTriggerSel, ConfEvtOfflineCheck, /*checkRun3*/ true, /*triggerTVXsel*/ false, ConfEvtOccupancyInTimeRangeMax, ConfEvtOccupancyInTimeRangeMin); + colCuts.setCuts(ConfEvtZvtx, ConfEvtTriggerCheck, ConfEvtOfflineCheck, /*checkRun3*/ true, /*triggerTVXsel*/ false, ConfEvtOccupancyInTimeRangeMax, ConfEvtOccupancyInTimeRangeMin); colCuts.init(&histos); colCuts.setTriggerTVX(ConfEvtTriggerTVXSel); colCuts.setApplyTFBorderCut(ConfEvtTFBorderCut); diff --git a/PWGLF/Utils/collisionCuts.h b/PWGLF/Utils/collisionCuts.h index 990c3c36742..676a5a16511 100644 --- a/PWGLF/Utils/collisionCuts.h +++ b/PWGLF/Utils/collisionCuts.h @@ -20,6 +20,8 @@ #ifndef PWGLF_UTILS_COLLISIONCUTS_H_ #define PWGLF_UTILS_COLLISIONCUTS_H_ +#include + #include "Framework/HistogramRegistry.h" #include "Framework/Logger.h" #include "Common/DataModel/EventSelection.h" @@ -43,6 +45,8 @@ class CollisonCuts kFlagBunchPileup, kFlagZvtxFT0vsPV, kFlagOccupancy, + kNoCollInTimeRangeStandard, + kNoCollInTimeRangeNarrow, kAllpassed }; @@ -54,14 +58,12 @@ class CollisonCuts /// \brief Pass the selection criteria to the class /// \param zvtxMax Maximal value of the z-vertex /// \param checkTrigger whether or not to check for the trigger alias - /// \param trig Requested trigger alias /// \param checkOffline whether or not to check for offline selection criteria - void setCuts(float zvtxMax, bool checkTrigger, int trig, bool checkOffline, bool checkRun3, bool triggerTVXsel = false, int trackOccupancyInTimeRangeMax = -1, int trackOccupancyInTimeRangeMin = -1) + void setCuts(float zvtxMax, bool checkTrigger, bool checkOffline, bool checkRun3, bool triggerTVXsel = false, int trackOccupancyInTimeRangeMax = -1, int trackOccupancyInTimeRangeMin = -1) { mCutsSet = true; mZvtxMax = zvtxMax; mCheckTrigger = checkTrigger; - mTrigger = trig; mCheckOffline = checkOffline; mTriggerTVXselection = triggerTVXsel; mCheckIsRun3 = checkRun3; @@ -85,6 +87,9 @@ class CollisonCuts if (!mCutsSet) { LOGF(error, "Event selection not set - quitting!"); } + for (int i = 0; i < kNaliases; i++) { + bit_list.push_back(1 << i); // BIT(i) + } mHistogramRegistry = registry; mHistogramRegistry->add("Event/posZ", "; vtx_{z} (cm); Entries", o2::framework::kTH1F, {{250, -12.5, 12.5}}); // z-vertex histogram after event selections mHistogramRegistry->add("Event/posZ_noCut", "; vtx_{z} (cm); Entries", o2::framework::kTH1F, {{250, -12.5, 12.5}}); // z-vertex histogram before all selections @@ -99,7 +104,7 @@ class CollisonCuts } else { mHistogramRegistry->add("Event/CentRun2V0M", "; vCentV0M; Entries", o2::framework::kTH1F, {{110, 0, 110}}); } - mHistogramRegistry->add("CollCutCounts", "; ; Entries", o2::framework::kTH1F, {{11, 0., 11.}}); + mHistogramRegistry->add("CollCutCounts", "; ; Entries", o2::framework::kTH1F, {{kAllpassed + 1, 0, kAllpassed + 1}}); mHistogramRegistry->get(HIST("CollCutCounts"))->GetXaxis()->SetBinLabel(binLabel(EvtSel::kAllEvent), "all"); mHistogramRegistry->get(HIST("CollCutCounts"))->GetXaxis()->SetBinLabel(binLabel(EvtSel::kFlagZvertex), "Zvtx"); mHistogramRegistry->get(HIST("CollCutCounts"))->GetXaxis()->SetBinLabel(binLabel(EvtSel::kFlagTrigerTVX), "IsTriggerTVX"); @@ -110,6 +115,8 @@ class CollisonCuts mHistogramRegistry->get(HIST("CollCutCounts"))->GetXaxis()->SetBinLabel(binLabel(EvtSel::kFlagBunchPileup), "NoSameBunchPileup"); mHistogramRegistry->get(HIST("CollCutCounts"))->GetXaxis()->SetBinLabel(binLabel(EvtSel::kFlagZvtxFT0vsPV), "IsGoodZvtxFT0vsPV"); mHistogramRegistry->get(HIST("CollCutCounts"))->GetXaxis()->SetBinLabel(binLabel(EvtSel::kFlagOccupancy), "LowOccupancy"); + mHistogramRegistry->get(HIST("CollCutCounts"))->GetXaxis()->SetBinLabel(binLabel(EvtSel::kNoCollInTimeRangeStandard), "NoCollInTimeRangeStandard"); + mHistogramRegistry->get(HIST("CollCutCounts"))->GetXaxis()->SetBinLabel(binLabel(EvtSel::kNoCollInTimeRangeNarrow), "NoCollInTimeRangeNarrow"); mHistogramRegistry->get(HIST("CollCutCounts"))->GetXaxis()->SetBinLabel(binLabel(EvtSel::kAllpassed), "Allpassed"); } @@ -119,7 +126,6 @@ class CollisonCuts LOGF(info, "Debug information for Collison Cuts"); LOGF(info, "Max. z-vertex: %f", mZvtxMax); LOGF(info, "Check trigger: %d", mCheckTrigger); - LOGF(info, "Trigger: %d", mTrigger); LOGF(info, "Check offline: %d", mCheckOffline); LOGF(info, "Check Run3: %d", mCheckIsRun3); if (mCheckIsRun3) { @@ -142,9 +148,6 @@ class CollisonCuts /// Set MB selection void setTriggerTVX(bool triggerTVXsel) { mTriggerTVXselection = triggerTVXsel; } - /// Scan the trigger alias of the event - void setInitialTriggerScan(bool checkTrigger) { mInitialTriggerScan = checkTrigger; } - /// Set the time frame border cut void setApplyTFBorderCut(bool applyTFBorderCut) { mApplyTFBorderCut = applyTFBorderCut; } @@ -194,6 +197,14 @@ class CollisonCuts LOGF(debug, "Vertex out of range"); return false; } + if (mInitialColBitScan) { + for (int bit : bit_list) { + if (col.selection_bit(bit)) { + LOGF(info, "Trigger %d fired", bit); + } + } + mInitialColBitScan = false; + } mHistogramRegistry->fill(HIST("CollCutCounts"), EvtSel::kFlagZvertex); if (mCheckIsRun3) { // Run3 case if (!col.selection_bit(aod::evsel::kIsTriggerTVX) && mTriggerTVXselection) { @@ -225,11 +236,12 @@ class CollisonCuts LOGF(debug, "Pileup rejection failed"); return false; } + mHistogramRegistry->fill(HIST("CollCutCounts"), EvtSel::kFlagBunchPileup); if (!col.selection_bit(o2::aod::evsel::kNoCollInTimeRangeNarrow) && mApplyCollInTimeRangeNarrow) { LOGF(debug, "NoCollInTimeRangeNarrow selection failed"); return false; } - mHistogramRegistry->fill(HIST("CollCutCounts"), EvtSel::kFlagBunchPileup); + mHistogramRegistry->fill(HIST("CollCutCounts"), EvtSel::kNoCollInTimeRangeNarrow); if (!col.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV) && mApplyZvertexTimedifference) { LOGF(debug, "Z-vertex time difference cut failed"); return false; @@ -243,11 +255,12 @@ class CollisonCuts LOGF(debug, "trackOccupancyInTimeRange selection failed"); return false; } + mHistogramRegistry->fill(HIST("CollCutCounts"), EvtSel::kFlagOccupancy); if ((!col.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) && mApplyCollInTimeRangeStandard) { LOGF(debug, "NoCollInTimeRangeStandard selection failed"); return false; } - mHistogramRegistry->fill(HIST("CollCutCounts"), EvtSel::kFlagOccupancy); + mHistogramRegistry->fill(HIST("CollCutCounts"), EvtSel::kNoCollInTimeRangeStandard); } else { // Run2 case if (mCheckOffline && !col.sel7()) { LOGF(debug, "Offline selection failed (sel7)"); @@ -265,19 +278,6 @@ class CollisonCuts } mHistogramRegistry->fill(HIST("CollCutCounts"), EvtSel::kAllpassed); } - if (mCheckTrigger && !col.alias_bit(mTrigger)) { - LOGF(debug, "Trigger selection failed"); - if (mInitialTriggerScan) { // Print out the trigger bits - LOGF(debug, "Trigger scan initialized"); - for (int i = 0; i < kNaliases; i++) { - if (col.alias_bit(i)) { - LOGF(debug, "Trigger %d fired", i); - } - } - mInitialTriggerScan = false; - } - return false; - } mHistogramRegistry->fill(HIST("CollCutCounts"), EvtSel::kAllpassed); return true; } @@ -317,25 +317,25 @@ class CollisonCuts private: using BCsWithRun2Info = soa::Join; o2::framework::HistogramRegistry* mHistogramRegistry = nullptr; ///< For QA output - bool mCutsSet = false; ///< Protection against running without cuts - bool mCheckTrigger = false; ///< Check for trigger - bool mTriggerTVXselection = false; ///< Check for trigger TVX selection - bool mCheckOffline = false; ///< Check for offline criteria (might change) - bool mCheckIsRun3 = false; ///< Check if running on Pilot Beam - bool mInitialTriggerScan = false; ///< Check trigger when the event is first selected - bool mApplyTFBorderCut = false; ///< Apply time frame border cut - bool mApplyITSTPCvertex = false; ///< Apply at least one ITS-TPC track for vertexing - bool mApplyCollInTimeRangeNarrow = false; ///< Apply NoCollInTimeRangeNarrow selection - bool mApplyZvertexTimedifference = false; ///< removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference. - bool mApplyPileupRejection = false; ///< Pileup rejection - bool mApplyNoITSROBorderCut = false; ///< Apply NoITSRO frame border cut - bool mApplyCollInTimeRangeStandard = false; ///< Apply NoCollInTimeRangeStandard selection - bool mApplyRun2AliEventCuts = true; ///< Apply Run2 AliEventCuts - bool mApplyRun2INELgtZERO = false; ///< Apply Run2 INELgtZERO selection - int mTrigger = kINT7; ///< Trigger to check for - float mZvtxMax = 999.f; ///< Maximal deviation from nominal z-vertex (cm) - int mtrackOccupancyInTimeRangeMax = -1; ///< Maximum trackOccupancyInTimeRange cut (-1 no cut) - int mtrackOccupancyInTimeRangeMin = -1; ///< Minimum trackOccupancyInTimeRange cut (-1 no cut) + std::vector bit_list; + bool mCutsSet = false; ///< Protection against running without cuts + bool mInitialColBitScan = true; ///< Scan for collision bit + bool mCheckTrigger = false; ///< Check for trigger + bool mTriggerTVXselection = false; ///< Check for trigger TVX selection + bool mCheckOffline = false; ///< Check for offline criteria (might change) + bool mCheckIsRun3 = false; ///< Check if running on Pilot Beam + bool mApplyTFBorderCut = false; ///< Apply time frame border cut + bool mApplyITSTPCvertex = false; ///< Apply at least one ITS-TPC track for vertexing + bool mApplyCollInTimeRangeNarrow = false; ///< Apply NoCollInTimeRangeNarrow selection + bool mApplyZvertexTimedifference = false; ///< removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference. + bool mApplyPileupRejection = false; ///< Pileup rejection + bool mApplyNoITSROBorderCut = false; ///< Apply NoITSRO frame border cut + bool mApplyCollInTimeRangeStandard = false; ///< Apply NoCollInTimeRangeStandard selection + bool mApplyRun2AliEventCuts = true; ///< Apply Run2 AliEventCuts + bool mApplyRun2INELgtZERO = false; ///< Apply Run2 INELgtZERO selection + float mZvtxMax = 999.f; ///< Maximal deviation from nominal z-vertex (cm) + int mtrackOccupancyInTimeRangeMax = -1; ///< Maximum trackOccupancyInTimeRange cut (-1 no cut) + int mtrackOccupancyInTimeRangeMin = -1; ///< Minimum trackOccupancyInTimeRange cut (-1 no cut) }; } // namespace o2::analysis From 28b0fa74f3b34756a4cd591b2f02f393eb8905e0 Mon Sep 17 00:00:00 2001 From: Rik Spijkers <78484875+rspijkers@users.noreply.github.com> Date: Wed, 5 Feb 2025 08:29:27 +0100 Subject: [PATCH 0042/1650] [PWGLF] Update event selections (#9734) Co-authored-by: ALICE Builder --- .../Tasks/Strangeness/cascadecorrelations.cxx | 130 ++++++++++++------ 1 file changed, 89 insertions(+), 41 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx b/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx index 7cb9a984d9d..6e8dfbd7832 100644 --- a/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx +++ b/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx @@ -75,7 +75,7 @@ DECLARE_SOA_TABLE(CascadeFlags, "AOD", "CASCADEFLAGS", //! using CascDataExtSelected = soa::Join; } // namespace o2::aod -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; using MyCollisionsMult = soa::Join; using MyCascades = soa::Filtered; @@ -90,6 +90,9 @@ struct CascadeSelector { Configurable triggerList{"triggerList", "fDoubleXi, fDoubleOmega, fOmegaXi", "List of triggers used to select events"}; Configurable doTFBorderCut{"doTFBorderCut", true, "Switch to apply TimeframeBorderCut event selection"}; Configurable doSel8{"doSel8", true, "Switch to apply sel8 event selection"}; + Configurable doNoSameBunchPileUp{"doNoSameBunchPileUp", true, "Switch to apply NoSameBunchPileUp event selection"}; + Configurable INEL{"INEL", 0, "Number of charged tracks within |eta| < 1 has to be greater than value"}; + Configurable maxVertexZ{"maxVertexZ", 10., "Maximum value of z coordinate of PV"}; // Tracklevel Configurable tpcNsigmaBachelor{"tpcNsigmaBachelor", 3, "TPC NSigma bachelor"}; @@ -117,39 +120,47 @@ struct CascadeSelector { // TODO: variables as function of Omega mass, only do Xi for now AxisSpec vertexAxis = {100, -10.0f, 10.0f, "cm"}; AxisSpec dcaAxis = {50, 0.0f, 5.0f, "cm"}; - AxisSpec invMassAxis = {100, 1.25f, 1.45f, "Inv. Mass (GeV/c^{2})"}; - AxisSpec ptAxis = {100, 0, 15, "#it{p}_{T}"}; + // AxisSpec invMassAxis = {1000, 1.0f, 2.0f, "Inv. Mass (GeV/c^{2})"}; + AxisSpec invXiMassAxis = {100, 1.28f, 1.38f, "Inv. Mass (GeV/c^{2})"}; + AxisSpec invOmegaMassAxis = {100, 1.62f, 1.72f, "Inv. Mass (GeV/c^{2})"}; + AxisSpec ptAxis = {150, 0, 15, "#it{p}_{T}"}; + AxisSpec rapidityAxis{100, -1.f, 1.f, "y"}; HistogramRegistry registry{ "registry", { // basic selection variables - {"hV0Radius", "hV0Radius", {HistType::kTH3F, {{100, 0.0f, 100.0f, "cm"}, invMassAxis, ptAxis}}}, - {"hCascRadius", "hCascRadius", {HistType::kTH3F, {{100, 0.0f, 100.0f, "cm"}, invMassAxis, ptAxis}}}, - {"hV0CosPA", "hV0CosPA", {HistType::kTH3F, {{100, 0.95f, 1.0f}, invMassAxis, ptAxis}}}, - {"hCascCosPA", "hCascCosPA", {HistType::kTH3F, {{100, 0.95f, 1.0f}, invMassAxis, ptAxis}}}, - {"hDCAPosToPV", "hDCAPosToPV", {HistType::kTH3F, {vertexAxis, invMassAxis, ptAxis}}}, - {"hDCANegToPV", "hDCANegToPV", {HistType::kTH3F, {vertexAxis, invMassAxis, ptAxis}}}, - {"hDCABachToPV", "hDCABachToPV", {HistType::kTH3F, {vertexAxis, invMassAxis, ptAxis}}}, - {"hDCAV0ToPV", "hDCAV0ToPV", {HistType::kTH3F, {vertexAxis, invMassAxis, ptAxis}}}, - {"hDCAV0Dau", "hDCAV0Dau", {HistType::kTH3F, {dcaAxis, invMassAxis, ptAxis}}}, - {"hDCACascDau", "hDCACascDau", {HistType::kTH3F, {dcaAxis, invMassAxis, ptAxis}}}, - {"hLambdaMass", "hLambdaMass", {HistType::kTH3F, {{100, 1.0f, 1.2f, "Inv. Mass (GeV/c^{2})"}, invMassAxis, ptAxis}}}, - - // invariant mass per cut, start with Xi - {"hMassXi0", "Xi inv mass before selections", {HistType::kTH2F, {invMassAxis, ptAxis}}}, - {"hMassXi1", "Xi inv mass after TPCnCrossedRows cut", {HistType::kTH2F, {invMassAxis, ptAxis}}}, - {"hMassXi2", "Xi inv mass after ITSnClusters cut", {HistType::kTH2F, {invMassAxis, ptAxis}}}, - {"hMassXi3", "Xi inv mass after topo cuts", {HistType::kTH2F, {invMassAxis, ptAxis}}}, - {"hMassXi4", "Xi inv mass after V0 daughters PID cut", {HistType::kTH2F, {invMassAxis, ptAxis}}}, - {"hMassXi5", "Xi inv mass after bachelor PID cut", {HistType::kTH2F, {invMassAxis, ptAxis}}}, + {"hV0Radius", "hV0Radius", {HistType::kTH3F, {{100, 0.0f, 100.0f, "cm"}, invXiMassAxis, ptAxis}}}, + {"hCascRadius", "hCascRadius", {HistType::kTH3F, {{100, 0.0f, 100.0f, "cm"}, invXiMassAxis, ptAxis}}}, + {"hV0CosPA", "hV0CosPA", {HistType::kTH3F, {{100, 0.95f, 1.0f}, invXiMassAxis, ptAxis}}}, + {"hCascCosPA", "hCascCosPA", {HistType::kTH3F, {{100, 0.95f, 1.0f}, invXiMassAxis, ptAxis}}}, + {"hDCAPosToPV", "hDCAPosToPV", {HistType::kTH3F, {vertexAxis, invXiMassAxis, ptAxis}}}, + {"hDCANegToPV", "hDCANegToPV", {HistType::kTH3F, {vertexAxis, invXiMassAxis, ptAxis}}}, + {"hDCABachToPV", "hDCABachToPV", {HistType::kTH3F, {vertexAxis, invXiMassAxis, ptAxis}}}, + {"hDCAV0ToPV", "hDCAV0ToPV", {HistType::kTH3F, {vertexAxis, invXiMassAxis, ptAxis}}}, + {"hDCAV0Dau", "hDCAV0Dau", {HistType::kTH3F, {dcaAxis, invXiMassAxis, ptAxis}}}, + {"hDCACascDau", "hDCACascDau", {HistType::kTH3F, {dcaAxis, invXiMassAxis, ptAxis}}}, + {"hLambdaMass", "hLambdaMass", {HistType::kTH3F, {{100, 1.0f, 1.2f, "Inv. Mass (GeV/c^{2})"}, invXiMassAxis, ptAxis}}}, + + {"hMassXiMinus", "hMassXiMinus", {HistType::kTH3F, {invXiMassAxis, ptAxis, rapidityAxis}}}, + {"hMassXiPlus", "hMassXiPlus", {HistType::kTH3F, {invXiMassAxis, ptAxis, rapidityAxis}}}, + {"hMassOmegaMinus", "hMassOmegaMinus", {HistType::kTH3F, {invOmegaMassAxis, ptAxis, rapidityAxis}}}, + {"hMassOmegaPlus", "hMassOmegaPlus", {HistType::kTH3F, {invOmegaMassAxis, ptAxis, rapidityAxis}}}, + + // // invariant mass per cut, start with Xi + // {"hMassXi0", "Xi inv mass before selections", {HistType::kTH2F, {invMassAxis, ptAxis}}}, + // {"hMassXi1", "Xi inv mass after TPCnCrossedRows cut", {HistType::kTH2F, {invMassAxis, ptAxis}}}, + // {"hMassXi2", "Xi inv mass after ITSnClusters cut", {HistType::kTH2F, {invMassAxis, ptAxis}}}, + // {"hMassXi3", "Xi inv mass after topo cuts", {HistType::kTH2F, {invMassAxis, ptAxis}}}, + // {"hMassXi4", "Xi inv mass after V0 daughters PID cut", {HistType::kTH2F, {invMassAxis, ptAxis}}}, + // {"hMassXi5", "Xi inv mass after bachelor PID cut", {HistType::kTH2F, {invMassAxis, ptAxis}}}, // ITS & TPC clusters, with Xi inv mass - {"hTPCnCrossedRowsPos", "hTPCnCrossedRowsPos", {HistType::kTH3F, {{160, -0.5, 159.5, "TPC crossed rows"}, invMassAxis, ptAxis}}}, - {"hTPCnCrossedRowsNeg", "hTPCnCrossedRowsNeg", {HistType::kTH3F, {{160, -0.5, 159.5, "TPC crossed rows"}, invMassAxis, ptAxis}}}, - {"hTPCnCrossedRowsBach", "hTPCnCrossedRowsBach", {HistType::kTH3F, {{160, -0.5, 159.5, "TPC crossed rows"}, invMassAxis, ptAxis}}}, - {"hITSnClustersPos", "hITSnClustersPos", {HistType::kTH3F, {{8, -0.5, 7.5, "number of ITS clusters"}, invMassAxis, ptAxis}}}, - {"hITSnClustersNeg", "hITSnClustersNeg", {HistType::kTH3F, {{8, -0.5, 7.5, "number of ITS clusters"}, invMassAxis, ptAxis}}}, - {"hITSnClustersBach", "hITSnClustersBach", {HistType::kTH3F, {{8, -0.5, 7.5, "number of ITS clusters"}, invMassAxis, ptAxis}}}, + {"hTPCnCrossedRowsPos", "hTPCnCrossedRowsPos", {HistType::kTH3F, {{160, -0.5, 159.5, "TPC crossed rows"}, invXiMassAxis, ptAxis}}}, + {"hTPCnCrossedRowsNeg", "hTPCnCrossedRowsNeg", {HistType::kTH3F, {{160, -0.5, 159.5, "TPC crossed rows"}, invXiMassAxis, ptAxis}}}, + {"hTPCnCrossedRowsBach", "hTPCnCrossedRowsBach", {HistType::kTH3F, {{160, -0.5, 159.5, "TPC crossed rows"}, invXiMassAxis, ptAxis}}}, + {"hITSnClustersPos", "hITSnClustersPos", {HistType::kTH3F, {{8, -0.5, 7.5, "number of ITS clusters"}, invXiMassAxis, ptAxis}}}, + {"hITSnClustersNeg", "hITSnClustersNeg", {HistType::kTH3F, {{8, -0.5, 7.5, "number of ITS clusters"}, invXiMassAxis, ptAxis}}}, + {"hITSnClustersBach", "hITSnClustersBach", {HistType::kTH3F, {{8, -0.5, 7.5, "number of ITS clusters"}, invXiMassAxis, ptAxis}}}, {"hTriggerQA", "hTriggerQA", {HistType::kTH1F, {{2, -0.5, 1.5, "Trigger y/n"}}}}, }, @@ -169,7 +180,16 @@ struct CascadeSelector { h->GetXaxis()->SetBinLabel(5, "Track eta OK"); h->GetXaxis()->SetBinLabel(6, "V0 PID OK"); h->GetXaxis()->SetBinLabel(7, "Bach PID OK"); + + auto hEventSel = registry.add("hEventSel", "hEventSel", HistType::kTH1I, {{10, 0, 10, "selection criteria"}}); + hEventSel->GetXaxis()->SetBinLabel(1, "All"); + hEventSel->GetXaxis()->SetBinLabel(2, "sel8"); + hEventSel->GetXaxis()->SetBinLabel(3, "INEL0"); + hEventSel->GetXaxis()->SetBinLabel(4, "V_z"); + hEventSel->GetXaxis()->SetBinLabel(5, "NoSameBunchPileUp"); + hEventSel->GetXaxis()->SetBinLabel(6, "Selected events"); } + void process(MyCollisions::iterator const& collision, aod::CascDataExt const& Cascades, FullTracksExtIUWithPID const&, aod::BCsWithTimestamps const&) { bool evSel = true; @@ -185,9 +205,24 @@ struct CascadeSelector { } } - if ((doSel8 && !collision.sel8()) || (doTFBorderCut && !collision.selection_bit(aod::evsel::kNoTimeFrameBorder))) { - evSel = false; // do not skip the collision - this will lead to the cascadeFlag table having less entries than the Cascade table, and therefor not joinable. + // fill event selection based on which selection criteria are applied and passed + // do not skip the collision - this will lead to the cascadeFlag table having less entries than the Cascade table, and therefor not joinable. + registry.fill(HIST("hEventSel"), 0); + if (doSel8 && !collision.sel8()) { + evSel = false; + registry.fill(HIST("hEventSel"), 1); + } else if (collision.multNTracksPVeta1() <= INEL) { + evSel = false; + registry.fill(HIST("hEventSel"), 2); + } else if (std::abs(collision.posZ()) > maxVertexZ) { + evSel = false; + registry.fill(HIST("hEventSel"), 3); + } else if (doNoSameBunchPileUp && !collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { + evSel = false; + registry.fill(HIST("hEventSel"), 4); } + if (evSel) // passes all selections + registry.fill(HIST("hEventSel"), 5); for (auto const& casc : Cascades) { if (!evSel) { @@ -221,7 +256,7 @@ struct CascadeSelector { registry.fill(HIST("hTPCnCrossedRowsBach"), bachTrack.tpcNClsCrossedRows(), casc.mXi(), casc.pt()); registry.fill(HIST("hSelectionStatus"), 0); // all the cascade before selections - registry.fill(HIST("hMassXi0"), casc.mXi(), casc.pt()); + // registry.fill(HIST("hMassXi0"), casc.mXi(), casc.pt()); // TPC N crossed rows todo: check if minTPCCrossedRows > 50 if (posTrack.tpcNClsCrossedRows() < minTPCCrossedRows || negTrack.tpcNClsCrossedRows() < minTPCCrossedRows || bachTrack.tpcNClsCrossedRows() < minTPCCrossedRows) { @@ -229,7 +264,7 @@ struct CascadeSelector { continue; } registry.fill(HIST("hSelectionStatus"), 1); // passes nTPC crossed rows - registry.fill(HIST("hMassXi1"), casc.mXi(), casc.pt()); + // registry.fill(HIST("hMassXi1"), casc.mXi(), casc.pt()); // ITS N clusters todo: check if minITSClusters > 0 if (posTrack.itsNCls() < minITSClusters || negTrack.itsNCls() < minITSClusters || bachTrack.itsNCls() < minITSClusters) { @@ -237,7 +272,7 @@ struct CascadeSelector { continue; } registry.fill(HIST("hSelectionStatus"), 2); // passes nITS clusters - registry.fill(HIST("hMassXi2"), casc.mXi(), casc.pt()); + // registry.fill(HIST("hMassXi2"), casc.mXi(), casc.pt()); //// TOPO CUTS //// TODO: improve! double pvx = collision.posX(); @@ -254,7 +289,7 @@ struct CascadeSelector { continue; } registry.fill(HIST("hSelectionStatus"), 3); // passes topo - registry.fill(HIST("hMassXi3"), casc.mXi(), casc.pt()); + // registry.fill(HIST("hMassXi3"), casc.mXi(), casc.pt()); if (TMath::Abs(posTrack.eta()) > etaTracks || TMath::Abs(negTrack.eta()) > etaTracks || TMath::Abs(bachTrack.eta()) > etaTracks) { cascflags(0); @@ -290,7 +325,7 @@ struct CascadeSelector { } } registry.fill(HIST("hSelectionStatus"), 5); // passes V0 daughters PID - registry.fill(HIST("hMassXi4"), casc.mXi(), casc.pt()); + // registry.fill(HIST("hMassXi4"), casc.mXi(), casc.pt()); // Bachelor check if (TMath::Abs(bachTrack.tpcNSigmaPi()) < tpcNsigmaBachelor) { @@ -298,16 +333,33 @@ struct CascadeSelector { // consistent with both! cascflags(2); registry.fill(HIST("hSelectionStatus"), 6); // passes bach PID - registry.fill(HIST("hMassXi5"), casc.mXi(), casc.pt()); + // registry.fill(HIST("hMassXi5"), casc.mXi(), casc.pt()); + if (casc.sign() < 0) { + registry.fill(HIST("hMassXiMinus"), casc.mXi(), casc.pt(), casc.yXi()); + registry.fill(HIST("hMassOmegaMinus"), casc.mOmega(), casc.pt(), casc.yOmega()); + } else { + registry.fill(HIST("hMassXiPlus"), casc.mXi(), casc.pt(), casc.yXi()); + registry.fill(HIST("hMassOmegaPlus"), casc.mOmega(), casc.pt(), casc.yOmega()); + } continue; } cascflags(1); registry.fill(HIST("hSelectionStatus"), 6); // passes bach PID - registry.fill(HIST("hMassXi5"), casc.mXi(), casc.pt()); + // registry.fill(HIST("hMassXi5"), casc.mXi(), casc.pt()); + if (casc.sign() < 0) { + registry.fill(HIST("hMassXiMinus"), casc.mXi(), casc.pt(), casc.yXi()); + } else { + registry.fill(HIST("hMassXiPlus"), casc.mXi(), casc.pt(), casc.yXi()); + } continue; } else if (TMath::Abs(bachTrack.tpcNSigmaKa()) < tpcNsigmaBachelor) { cascflags(3); registry.fill(HIST("hSelectionStatus"), 6); // passes bach PID + if (casc.sign() < 0) { + registry.fill(HIST("hMassOmegaMinus"), casc.mOmega(), casc.pt(), casc.yOmega()); + } else { + registry.fill(HIST("hMassOmegaPlus"), casc.mOmega(), casc.pt(), casc.yOmega()); + } continue; } // if we reach here, the bachelor was neither pion nor kaon @@ -467,10 +519,6 @@ struct CascadeCorrelations { } } - if ((doSel8 && !collision.sel8()) || (doTFBorderCut && !collision.selection_bit(aod::evsel::kNoTimeFrameBorder))) { - return; - } - double weight; // Some QA on the cascades for (auto const& casc : Cascades) { From caffb45ba5ca1f6d84a6d230fa7ce0240920ce1c Mon Sep 17 00:00:00 2001 From: yuanzhe <90246048+wang-yuanzhe@users.noreply.github.com> Date: Wed, 5 Feb 2025 08:29:40 +0100 Subject: [PATCH 0043/1650] [PWGLF] Update hypertriton 3body decay mc QA task (#9633) --- PWGLF/Tasks/Nuspex/CMakeLists.txt | 4 +- ...3bodyMCQA.cxx => hypertriton3bodyMcqa.cxx} | 88 ++++++++++--------- 2 files changed, 48 insertions(+), 44 deletions(-) rename PWGLF/Tasks/Nuspex/{hypertriton3bodyMCQA.cxx => hypertriton3bodyMcqa.cxx} (94%) diff --git a/PWGLF/Tasks/Nuspex/CMakeLists.txt b/PWGLF/Tasks/Nuspex/CMakeLists.txt index 5d6781f0371..55afb720ab4 100644 --- a/PWGLF/Tasks/Nuspex/CMakeLists.txt +++ b/PWGLF/Tasks/Nuspex/CMakeLists.txt @@ -30,7 +30,7 @@ o2physics_add_dpl_workflow(hypertriton3bodyanalysis COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(hypertriton3bodymcqa - SOURCES hypertriton3bodyMCQA.cxx + SOURCES hypertriton3bodyMcqa.cxx PUBLIC_LINK_LIBRARIES O2::DCAFitter O2Physics::AnalysisCore O2::TOFBase COMPONENT_NAME Analysis) @@ -154,4 +154,4 @@ o2physics_add_dpl_workflow(angular-correlations-in-jets SOURCES AngularCorrelationsInJets.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::PWGJECore FastJet::FastJet FastJet::Contrib COMPONENT_NAME Analysis) -endif() \ No newline at end of file +endif() diff --git a/PWGLF/Tasks/Nuspex/hypertriton3bodyMCQA.cxx b/PWGLF/Tasks/Nuspex/hypertriton3bodyMcqa.cxx similarity index 94% rename from PWGLF/Tasks/Nuspex/hypertriton3bodyMCQA.cxx rename to PWGLF/Tasks/Nuspex/hypertriton3bodyMcqa.cxx index 7d54bd86d48..ad465ca435d 100644 --- a/PWGLF/Tasks/Nuspex/hypertriton3bodyMCQA.cxx +++ b/PWGLF/Tasks/Nuspex/hypertriton3bodyMcqa.cxx @@ -8,13 +8,10 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -// ======================== // -// This code perform a check for all mcparticles and tracks -// which has corresponding mcparticles to find out the properties -// of hypertriton 3-body decay -// -// author: yuanzhe.wang@cern.ch +/// \file hypertriton3bodyMcqa.cxx +/// \brief QA for MC productions which contain hypertriton 3body decay process, including special checks for TOF PID +/// \author Yuanzhe Wang #include #include @@ -60,7 +57,7 @@ bool is3bodyDecayedH3L(TMCParticle const& particle) } bool haveProton = false, havePion = false, haveDeuteron = false; bool haveAntiProton = false, haveAntiPion = false, haveAntiDeuteron = false; - for (auto& mcDaughter : particle.template daughters_as()) { + for (const auto& mcDaughter : particle.template daughters_as()) { if (mcDaughter.pdgCode() == 2212) haveProton = true; if (mcDaughter.pdgCode() == -2212) @@ -85,13 +82,13 @@ bool is3bodyDecayedH3L(TMCParticle const& particle) template bool isPairedH3LDaughters(TMCParticle const& mctrack0, TMCParticle const& mctrack1, TMCParticle const& mctrack2) { - for (auto& particleMother : mctrack0.template mothers_as()) { + for (const auto& particleMother : mctrack0.template mothers_as()) { if (!(particleMother.pdgCode() == 1010010030 && mctrack0.pdgCode() == 2212 && mctrack1.pdgCode() == -211 && mctrack2.pdgCode() == 1000010020) && !(particleMother.pdgCode() == -1010010030 && mctrack0.pdgCode() == -2212 && mctrack1.pdgCode() == 211 && mctrack2.pdgCode() == -1000010020)) { continue; } bool flag1 = false, flag2 = false; - for (auto& mcDaughter : particleMother.template daughters_as()) { + for (const auto& mcDaughter : particleMother.template daughters_as()) { if (mcDaughter.globalIndex() == mctrack1.globalIndex()) flag1 = true; if (mcDaughter.globalIndex() == mctrack2.globalIndex()) @@ -108,11 +105,13 @@ bool isPairedH3LDaughters(TMCParticle const& mctrack0, TMCParticle const& mctrac } // check the properties of daughters candidates and true daughters -struct hypertriton3bodyTrackMcinfo { +struct Hypertriton3bodyMcqa { Service ccdb; Preslice perCollisionTracks = aod::track::collisionId; + int mRunNumber; + // Basic checks HistogramRegistry registry{ "registry", @@ -224,11 +223,11 @@ struct hypertriton3bodyTrackMcinfo { registry.get(HIST("hParticleCounter"))->GetXaxis()->SetBinLabel(6, "McisPion"); registry.get(HIST("hParticleCounter"))->GetXaxis()->SetBinLabel(7, "McisDeuteron"); - TString TrackCounterbinLabel[2] = {"hasMom", "FromHypertriton"}; + TString trackCounterbinLabel[2] = {"hasMom", "FromHypertriton"}; for (int i{0}; i < 2; i++) { - registry.get(HIST("hProtonCounter"))->GetXaxis()->SetBinLabel(i + 1, TrackCounterbinLabel[i]); - registry.get(HIST("hPionCounter"))->GetXaxis()->SetBinLabel(i + 1, TrackCounterbinLabel[i]); - registry.get(HIST("hDeuteronCounter"))->GetXaxis()->SetBinLabel(i + 1, TrackCounterbinLabel[i]); + registry.get(HIST("hProtonCounter"))->GetXaxis()->SetBinLabel(i + 1, trackCounterbinLabel[i]); + registry.get(HIST("hPionCounter"))->GetXaxis()->SetBinLabel(i + 1, trackCounterbinLabel[i]); + registry.get(HIST("hDeuteronCounter"))->GetXaxis()->SetBinLabel(i + 1, trackCounterbinLabel[i]); } registry.get(HIST("hDuplicatedH3LDaughers"))->GetXaxis()->SetBinLabel(1, "proton"); registry.get(HIST("hDuplicatedH3LDaughers"))->GetXaxis()->SetBinLabel(2, "pion"); @@ -258,8 +257,8 @@ struct hypertriton3bodyTrackMcinfo { Configurable maxPionPt{"maxPionPt", 1.2, "maxPionPt"}; Configurable minDeuteronPt{"minDeuteronPt", 0.6, "minDeuteronPt"}; Configurable maxDeuteronPt{"maxDeuteronPt", 10, "maxDeuteronPt"}; - Configurable event_sel8_selection{"event_sel8_selection", false, "event selection count post sel8 cut"}; - Configurable event_posZ_selection{"event_posZ_selection", false, "event selection count post poZ cut"}; + Configurable mc_event_selection{"mc_event_selection", true, "mc event selection count post kIsTriggerTVX and kNoTimeFrameBorder"}; + Configurable event_posZ_selection{"event_posZ_selection", true, "event selection count post poZ cut"}; // CCDB TOF PID paras Configurable timestamp{"ccdb-timestamp", -1, "timestamp of the object"}; @@ -275,6 +274,11 @@ struct hypertriton3bodyTrackMcinfo { void initCCDB(aod::BCsWithTimestamps::iterator const& bc) { + if (mRunNumber == bc.runNumber()) { + return; + } + mRunNumber = bc.runNumber(); + // Initial TOF PID Paras, copied from PIDTOF.h timestamp.value = bc.timestamp(); ccdb->setTimestamp(timestamp.value); @@ -348,17 +352,17 @@ struct hypertriton3bodyTrackMcinfo { void process(ColwithEvTimes const& collisions, MCLabeledTracksIU const& tracks, aod::McParticles const& /*particlesMC*/, aod::McCollisions const& /*mcCollisions*/, aod::BCsWithTimestamps const&) { - for (auto collision : collisions) { + for (const auto& collision : collisions) { auto bc = collision.bc_as(); initCCDB(bc); registry.fill(HIST("hEventCounter"), 0.5); - if (event_sel8_selection && !collision.sel8()) { - return; + if (mc_event_selection && (!collision.selection_bit(aod::evsel::kIsTriggerTVX) || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder))) { + continue; } registry.fill(HIST("hEventCounter"), 1.5); if (event_posZ_selection && abs(collision.posZ()) > 10.f) { // 10cm - return; + continue; } registry.fill(HIST("hEventCounter"), 2.5); @@ -368,7 +372,7 @@ struct hypertriton3bodyTrackMcinfo { auto coltracks = tracks.sliceBy(perCollisionTracks, collision.globalIndex()); - for (auto& track : coltracks) { + for (const auto& track : coltracks) { ++itrack; registry.fill(HIST("hParticleCounter"), 0.5); @@ -409,7 +413,7 @@ struct hypertriton3bodyTrackMcinfo { if (mcparticle.has_mothers()) { registry.fill(HIST("hProtonCounter"), 0.5); - for (auto& particleMother : mcparticle.mothers_as()) { + for (const auto& particleMother : mcparticle.mothers_as()) { bool flag_H3L = is3bodyDecayedH3L(particleMother); if (!flag_H3L) { continue; @@ -447,7 +451,7 @@ struct hypertriton3bodyTrackMcinfo { if (mcparticle.has_mothers()) { registry.fill(HIST("hPionCounter"), 0.5); - for (auto& particleMother : mcparticle.mothers_as()) { + for (const auto& particleMother : mcparticle.mothers_as()) { bool flag_H3L = is3bodyDecayedH3L(particleMother); if (!flag_H3L) { continue; @@ -513,7 +517,7 @@ struct hypertriton3bodyTrackMcinfo { if (mcparticle.has_mothers()) { registry.fill(HIST("hDeuteronCounter"), 0.5); - for (auto& particleMother : mcparticle.mothers_as()) { + for (const auto& particleMother : mcparticle.mothers_as()) { bool flag_H3L = is3bodyDecayedH3L(particleMother); if (!flag_H3L) { continue; @@ -603,7 +607,7 @@ struct hypertriton3bodyTrackMcinfo { SelectedEvents[nevts++] = collision.mcCollision_as().globalIndex(); } - for (auto& track : tracks) { + for (const auto& track : tracks) { if (!track.has_mcParticle()) { continue; } @@ -622,14 +626,14 @@ struct hypertriton3bodyTrackMcinfo { auto collision = collisions.iteratorAt(evtReconstructed - SelectedEvents.begin()); auto originalcollision = track.collision_as(); - for (auto& particleMother : mcparticle.mothers_as()) { + for (const auto& particleMother : mcparticle.mothers_as()) { bool flag_H3L = is3bodyDecayedH3L(particleMother); if (!flag_H3L) { continue; } - // auto bc = collision.bc_as(); - // initCCDB(bc); + auto bc = collision.bc_as(); + initCCDB(bc); float tofNsigmaDeAO2D = -999; float tofNsigmaDeEvSel = -999; @@ -690,7 +694,7 @@ struct hypertriton3bodyTrackMcinfo { }; // check the performance of mcparticle -struct hypertriton3bodyMcParticleCheck { +struct Hypertriton3bodyMcParticleCheck { // Basic checks HistogramRegistry registry{ "registry", @@ -733,8 +737,8 @@ struct hypertriton3bodyMcParticleCheck { } Configurable rapidityMCcut{"rapidityMCcut", 1, "rapidity cut MC count"}; - Configurable event_sel8_selection{"event_sel8_selection", false, "event selection count post sel8 cut"}; - Configurable event_posZ_selection{"event_posZ_selection", false, "event selection count post poZ cut"}; + Configurable mc_event_selection{"mc_event_selection", true, "mc event selection count post kIsTriggerTVX and kNoTimeFrameBorder"}; + Configurable event_posZ_selection{"event_posZ_selection", true, "event selection count post poZ cut"}; Preslice permcCollision = o2::aod::mcparticle::mcCollisionId; @@ -745,7 +749,7 @@ struct hypertriton3bodyMcParticleCheck { mcPartIndices.clear(); mcPartIndices.resize(particlesMC.size()); std::fill(mcPartIndices.begin(), mcPartIndices.end(), -1); - for (auto& track : tracks) { + for (const auto& track : tracks) { if (track.has_mcParticle()) { auto mcparticle = track.template mcParticle_as(); if (mcPartIndices[mcparticle.globalIndex()] == -1) { @@ -772,7 +776,7 @@ struct hypertriton3bodyMcParticleCheck { std::vector SelectedEvents(collisions.size()); int nevts = 0; for (const auto& collision : collisions) { - if (event_sel8_selection && !collision.sel8()) { + if (mc_event_selection && (!collision.selection_bit(aod::evsel::kIsTriggerTVX) || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder))) { continue; } if (event_posZ_selection && abs(collision.posZ()) > 10.f) { // 10cm @@ -782,17 +786,17 @@ struct hypertriton3bodyMcParticleCheck { } SelectedEvents.resize(nevts); - for (auto mcCollision : mcCollisions) { + for (const auto& mcCollision : mcCollisions) { registry.fill(HIST("hMcCollCounter"), 0.5); const auto evtReconstructedAndSelected = std::find(SelectedEvents.begin(), SelectedEvents.end(), mcCollision.globalIndex()) != SelectedEvents.end(); - if (evtReconstructedAndSelected) { // Check that the event is reconstructed and that the reconstructed events pass the selection - registry.fill(HIST("hMcCollCounter"), 1.5); - // return; + if (!evtReconstructedAndSelected) { // Check that the event is reconstructed and that the reconstructed events pass the selection + continue; } + registry.fill(HIST("hMcCollCounter"), 1.5); const auto& dparticlesMC = particlesMC.sliceBy(permcCollision, mcCollision.globalIndex()); - for (auto& mcparticle : dparticlesMC) { + for (const auto& mcparticle : dparticlesMC) { if (mcparticle.pdgCode() == 2212 || mcparticle.pdgCode() == -2212) { registry.fill(HIST("hMcProtonPt"), mcparticle.pt()); @@ -822,7 +826,7 @@ struct hypertriton3bodyMcParticleCheck { if (!flag_H3L) { continue; } - for (auto& mcparticleDaughter : mcparticle.daughters_as()) { + for (const auto& mcparticleDaughter : mcparticle.daughters_as()) { if (std::abs(mcparticleDaughter.pdgCode()) == 2212) { dauProtonMom[0] = mcparticleDaughter.px(); dauProtonMom[1] = mcparticleDaughter.py(); @@ -880,7 +884,7 @@ struct hypertriton3bodyMcParticleCheck { // } // Counter for hypertriton N_gen - if (TMath::Abs(mcparticle.y()) < 1) { + if (std::abs(mcparticle.y()) < 1) { registry.fill(HIST("hMcHypertritonCounter"), 6.5); if (MClifetime < 40) { registry.fill(HIST("hMcHypertritonCounter"), 7.5); @@ -899,7 +903,7 @@ struct hypertriton3bodyMcParticleCheck { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc), - adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc), }; } From aac0f8e5faf11cfaebd0fb95031405735083af81 Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Wed, 5 Feb 2025 08:30:11 +0100 Subject: [PATCH 0044/1650] [PWGLF] Initialize impact parameter with default values (#9592) --- PWGLF/Tasks/Strangeness/nonPromptCascade.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx index 07f2230a319..f501e909402 100644 --- a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx +++ b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx @@ -296,7 +296,7 @@ struct NonPromptCascadeTask { { const auto matCorr = static_cast(cfgMaterialCorrection.value); auto trackCovTrk = getTrackParCov(track); - o2::dataformats::DCA impactParameterTrk; + o2::dataformats::DCA impactParameterTrk{-999.f, -999.f}; if (o2::base::Propagator::Instance()->propagateToDCA(primaryVertex, trackCovTrk, mBz, 2.f, matCorr, &impactParameterTrk)) { if (protonTrack.hasTPC() && pionTrack.hasTPC()) { From 123cf69bec47585153f7b38711a3f53d47ca9093 Mon Sep 17 00:00:00 2001 From: Ravindra Singh <56298081+1994ra@users.noreply.github.com> Date: Wed, 5 Feb 2025 09:04:58 +0100 Subject: [PATCH 0045/1650] [PWGHF] added tracks efficiency calculation block (#9679) Co-authored-by: ALICE Action Bot --- PWGHF/HFC/DataModel/CorrelationTables.h | 7 +++ .../HFC/TableProducer/correlatorLcHadrons.cxx | 61 +++++++++++++++++-- 2 files changed, 62 insertions(+), 6 deletions(-) diff --git a/PWGHF/HFC/DataModel/CorrelationTables.h b/PWGHF/HFC/DataModel/CorrelationTables.h index da784114ce9..d215eb75269 100644 --- a/PWGHF/HFC/DataModel/CorrelationTables.h +++ b/PWGHF/HFC/DataModel/CorrelationTables.h @@ -163,6 +163,13 @@ DECLARE_SOA_TABLE(LcHadronPairTrkPID, "AOD", "LCHPAIRPID", //! Lc-proton details aod::hf_correlation_lc_hadron::PrNsigmTOF, aod::hf_correlation_lc_hadron::KaNsigmTOF, aod::hf_correlation_lc_hadron::PiNsigmTOF); +DECLARE_SOA_TABLE(LcHadronTrkPID, "AOD", "LCHTRKPID", //! Lc-proton details + aod::hf_correlation_lc_hadron::PrNsigmTPC, + aod::hf_correlation_lc_hadron::KaNsigmTPC, + aod::hf_correlation_lc_hadron::PiNsigmTPC, + aod::hf_correlation_lc_hadron::PrNsigmTOF, + aod::hf_correlation_lc_hadron::KaNsigmTOF, + aod::hf_correlation_lc_hadron::PiNsigmTOF); DECLARE_SOA_TABLE(LcHadronGenInfo, "AOD", "LCHGENINFO", //! Lc-Hadrons pairs Generated Information aod::hf_correlation_lc_hadron::IsPrompt, diff --git a/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx b/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx index 761eb974c42..1af43022dce 100644 --- a/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx @@ -168,6 +168,7 @@ struct HfCorrelatorLcHadrons { Produces entryTrackRecoInfo; Produces entryLc; Produces entryHadron; + Produces entryTrkPID; Configurable selectionFlagLc{"selectionFlagLc", 1, "Selection Flag for Lc"}; Configurable numberEventsMixed{"numberEventsMixed", 5, "number of events mixed in ME process"}; @@ -190,13 +191,16 @@ struct HfCorrelatorLcHadrons { Configurable> efficiencyLc{"efficiencyLc", {1., 1., 1., 1., 1., 1.}, "efficiency values for Lc"}; Configurable storeAutoCorrelationFlag{"storeAutoCorrelationFlag", false, "Store flag that indicates if the track is paired to its Lc mother instead of skipping it"}; Configurable correlateLcWithLeadingParticle{"correlateLcWithLeadingParticle", false, "Switch for correlation of Lc baryons with leading particle only"}; - Configurable> trkPIDspecies{"trkPIDspecies", std::vector{o2::track::PID::Proton, o2::track::PID::Pion, o2::track::PID::Kaon}, "Trk sel: Particles species for PID, proton, pion, kaon"}; Configurable pidTrkApplied{"pidTrkApplied", false, "Apply PID selection for associated tracks"}; + Configurable> trkPIDspecies{"trkPIDspecies", std::vector{o2::track::PID::Proton, o2::track::PID::Pion, o2::track::PID::Kaon}, "Trk sel: Particles species for PID, proton, pion, kaon"}; Configurable> pidTPCMax{"pidTPCMax", std::vector{3., 0., 0.}, "maximum nSigma TPC"}; Configurable> pidTOFMax{"pidTOFMax", std::vector{3., 0., 0.}, "maximum nSigma TOF"}; - Configurable tofPIDThreshold{"tofPIDThreshold", 0.80, "minimum pT after which TOF PID is applicable"}; + Configurable tofPIDThreshold{"tofPIDThreshold", 0.75, "minimum pT after which TOF PID is applicable"}; Configurable fillTrkPID{"fillTrkPID", false, "fill PID information for associated tracks"}; Configurable forceTOF{"forceTOF", false, "fill PID information for associated tracks"}; + Configurable calTrkEff{"calTrkEff", false, "fill histograms to calculate efficiency"}; + Configurable isRecTrkPhyPrimary{"isRecTrkPhyPrimary", true, "Calculate the efficiency of reconstructed primary physical tracks"}; + Configurable calEffLcEvent{"calEffLcEvent", true, "Calculate the efficiency of Lc candidate"}; HfHelper hfHelper; SliceCache cache; @@ -249,6 +253,7 @@ struct HfCorrelatorLcHadrons { AxisSpec axisBdtScore = {binsBdtScore, "Bdt score"}; AxisSpec axisPoolBin = {binsPoolBin, "PoolBin"}; AxisSpec axisRapidity = {100, -2, 2, "Rapidity"}; + AxisSpec axisSign = {2, -1, 1, "Sign"}; registry.add("hPtCand", "Lc,Hadron candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPtLc}}); registry.add("hPtProng0", "Lc,Hadron candidates;prong 0 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPtLc}}); @@ -293,6 +298,9 @@ struct HfCorrelatorLcHadrons { registry.add("hYMcRecBkg", "Lc,Hadron candidates - MC reco;candidate #it{#y};entries", {HistType::kTH1F, {axisRapidity}}); registry.add("hFakeTracksMcRec", "Fake tracks - MC Rec", {HistType::kTH1F, {axisPtHadron}}); registry.add("hPtParticleAssocVsCandMcRec", "Associated Particle - MC Rec", {HistType::kTH2F, {{axisPtHadron}, {axisPtLc}}}); + registry.add("hPtTracksVsSignRec", "Associated Particle - MC Rec", {HistType::kTH2F, {{axisPtHadron}, {axisSign}}}); + registry.add("hPtTracksVsSignRecTrue", "Associated Particle - MC Rec (True)", {HistType::kTH2F, {{axisPtHadron}, {axisSign}}}); + registry.add("hPtTracksVsSignGen", "Associated Particle - MC Gen", {HistType::kTH2F, {{axisPtHadron}, {axisSign}}}); registry.add("hPtPrimaryParticleAssocVsCandMcRec", "Associated Particle - MC Rec", {HistType::kTH2F, {{axisPtHadron}, {axisPtLc}}}); registry.add("hPtVsMultiplicityMcRecPrompt", "Multiplicity FT0M - MC Rec Prompt", {HistType::kTH2F, {{axisPtLc}, {axisMultFT0M}}}); registry.add("hPtVsMultiplicityMcRecNonPrompt", "Multiplicity FT0M - MC Rec Non Prompt", {HistType::kTH2F, {{axisPtLc}, {axisMultFT0M}}}); @@ -343,7 +351,7 @@ struct HfCorrelatorLcHadrons { } registry.fill(HIST("hMultiplicity"), nTracks); - int cntLc = 0; + int countLc = 0; std::vector outputMl = {-1., -1., -1.}; for (const auto& candidate : candidates) { @@ -438,12 +446,15 @@ struct HfCorrelatorLcHadrons { entryLcHadronPairTrkPID(track.tpcNSigmaPr(), track.tpcNSigmaKa(), track.tpcNSigmaPi(), track.tofNSigmaPr(), track.tofNSigmaKa(), track.tofNSigmaPi()); } } - if (cntLc == 0) { - entryHadron(track.phi(), track.eta(), track.pt(), poolBin, gCollisionId, timeStamp); + if (countLc == 0) { + entryHadron(track.phi(), track.eta(), track.pt() * track.sign(), poolBin, gCollisionId, timeStamp); + if (fillTrkPID) { + entryTrkPID(track.tpcNSigmaPr(), track.tpcNSigmaKa(), track.tpcNSigmaPi(), track.tofNSigmaPr(), track.tofNSigmaKa(), track.tofNSigmaPi()); + } registry.fill(HIST("hTracksBin"), poolBin); } } // Hadron Tracks loop - cntLc++; + countLc++; } // end outer Lc loop registry.fill(HIST("hZvtx"), collision.posZ()); registry.fill(HIST("hMultFT0M"), collision.multFT0M()); @@ -486,6 +497,7 @@ struct HfCorrelatorLcHadrons { bool isLcPrompt = false; bool isLcNonPrompt = false; bool isLcSignal = false; + int countLc = 1; for (const auto& candidate : candidates) { // check decay channel flag for candidate if (std::abs(hfHelper.yLc(candidate)) > yCandMax || candidate.pt() < ptCandMin || candidate.pt() > ptCandMax) { @@ -574,6 +586,31 @@ struct HfCorrelatorLcHadrons { } registry.fill(HIST("hLcBin"), poolBin); + if (calTrkEff && !isLcSignal && calEffLcEvent) + continue; + + if (calTrkEff && countLc == 1) { + // genrated tracks + for (const auto& track : mcParticles) { + if (std::abs(track.eta()) > etaTrackMax || track.pt() < ptTrackMin || track.pt() > ptTrackMax) { + continue; + } + if ((std::abs(track.pdgCode()) != kElectron) && (std::abs(track.pdgCode()) != kMuonMinus) && (std::abs(track.pdgCode()) != kPiPlus) && (std::abs(track.pdgCode()) != kKPlus) && (std::abs(track.pdgCode()) != kProton)) { + continue; + } + + if (pidTrkApplied && (std::abs(track.pdgCode()) != kProton)) + continue; // proton PID + + if (!track.isPhysicalPrimary()) { + continue; + } + + int8_t chargeTrack = pdg->GetParticle(track.pdgCode())->Charge(); // Retrieve charge + registry.fill(HIST("hPtTracksVsSignGen"), track.pt(), chargeTrack); + } + } + // Lc-Hadron correlation dedicated section // if the candidate is selected as Lc, search for Hadron ad evaluate correlations for (const auto& track : tracks) { @@ -587,6 +624,17 @@ struct HfCorrelatorLcHadrons { if (!passPIDSelection(track, trkPIDspecies, pidTPCMax, pidTOFMax, tofPIDThreshold, forceTOF)) continue; } + + if (calTrkEff && countLc == 1 && track.has_mcParticle()) { + auto mcParticle = track.template mcParticle_as(); + if (!mcParticle.isPhysicalPrimary() && isRecTrkPhyPrimary) + continue; + + registry.fill(HIST("hPtTracksVsSignRec"), track.pt(), track.sign()); + if (std::abs(mcParticle.pdgCode()) == kProton) + registry.fill(HIST("hPtTracksVsSignRecTrue"), track.pt(), track.sign()); + } + // Removing Lc daughters by checking track indices if ((candidate.prong0Id() == track.globalIndex()) || (candidate.prong1Id() == track.globalIndex()) || (candidate.prong2Id() == track.globalIndex())) { if (!storeAutoCorrelationFlag) { @@ -659,6 +707,7 @@ struct HfCorrelatorLcHadrons { entryTrackRecoInfo(track.dcaXY(), track.dcaZ(), track.tpcNClsCrossedRows()); } } // end inner loop (Tracks) + countLc++; } // end outer Lc loop registry.fill(HIST("hZvtx"), collision.posZ()); registry.fill(HIST("hMultFT0M"), collision.multFT0M()); From a2ad37d970181ffe8eaaaf1ac55ce7c7c0a8ca72 Mon Sep 17 00:00:00 2001 From: arossi81 Date: Wed, 5 Feb 2025 09:05:39 +0100 Subject: [PATCH 0046/1650] =?UTF-8?q?[Common]=20Fixing=20bug=20in=20the=20?= =?UTF-8?q?correction=20of=20the=20mean=20of=20the=20DCA=20distribution=20?= =?UTF-8?q?(the=E2=80=A6=20(#9733)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Andrea --- Common/Tools/TrackTuner.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Common/Tools/TrackTuner.h b/Common/Tools/TrackTuner.h index 4d6876eaf39..9ccc0df9712 100644 --- a/Common/Tools/TrackTuner.h +++ b/Common/Tools/TrackTuner.h @@ -722,7 +722,7 @@ struct TrackTuner : o2::framework::ConfigurableGroup { double deltaDcaXYmean = dcaXYMeanData - dcaXYMeanMC; // double d0rpn =d0rpmc+dd0rpn-dd0mrpn; - double trackParDcaXYTuned = trackParDcaXYMC + deltaDcaXYTuned - deltaDcaXYmean; + double trackParDcaXYTuned = trackParDcaXYMC + deltaDcaXYTuned + deltaDcaXYmean; if (debugInfo) { LOG(info) << dcaZResMC << ", " << dcaZResData << ", diff(DcaZ - DcaZMC): " << deltaDcaZ << ", diff upgraded: " << deltaDcaZTuned << ", DcaZ Data : " << trackParDcaZTuned; From bcb42a09da2bd53cc66f6d9a8626b1bb7acf6088 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Wed, 5 Feb 2025 09:06:56 +0100 Subject: [PATCH 0047/1650] [PWGLF] Fix non found histos (#9759) --- PWGLF/Tasks/Strangeness/strangenessInJets.cxx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/PWGLF/Tasks/Strangeness/strangenessInJets.cxx b/PWGLF/Tasks/Strangeness/strangenessInJets.cxx index a34c992f87d..7ed62f0eae4 100644 --- a/PWGLF/Tasks/Strangeness/strangenessInJets.cxx +++ b/PWGLF/Tasks/Strangeness/strangenessInJets.cxx @@ -917,10 +917,12 @@ struct StrangenessInJets { LOG(info) << "Looking for 2D weight histogram '" << name.value << "' for " << name.name; if (name.value == "") { LOG(info) << " -> Skipping"; + return; } histo = static_cast(l->FindObject(name.value.c_str())); if (!histo) { LOG(error) << "Could not open histogram '" << name.value << "'"; + return; } LOG(info) << "Opened histogram " << histo->ClassName() << " " << histo->GetName(); }; @@ -936,10 +938,12 @@ struct StrangenessInJets { LOG(info) << "Looking for 1D weight histogram '" << name.value << "' for " << name.name; if (name.value == "") { LOG(info) << " -> Skipping"; + return; } histo = static_cast(l->FindObject(name.value.c_str())); if (!histo) { LOG(error) << "Could not open histogram '" << name.value << "'"; + return; } LOG(info) << "Opened histogram " << histo->ClassName() << " " << histo->GetName(); }; From a5c1330b082921610b80fea29ac23644e8403f40 Mon Sep 17 00:00:00 2001 From: Andrea Giovanni Riffero Date: Wed, 5 Feb 2025 10:22:50 +0100 Subject: [PATCH 0048/1650] [PWGUD] Save run number information (#9738) Co-authored-by: ariffero --- PWGUD/Tasks/FwdMuonsUPC.cxx | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/PWGUD/Tasks/FwdMuonsUPC.cxx b/PWGUD/Tasks/FwdMuonsUPC.cxx index 941e4cb4177..b35a2d8167c 100644 --- a/PWGUD/Tasks/FwdMuonsUPC.cxx +++ b/PWGUD/Tasks/FwdMuonsUPC.cxx @@ -37,6 +37,7 @@ namespace dimu { // dimuon +DECLARE_SOA_COLUMN(RunNumber, runNumber, int); DECLARE_SOA_COLUMN(M, m, float); DECLARE_SOA_COLUMN(Energy, energy, float); DECLARE_SOA_COLUMN(Px, px, float); @@ -73,6 +74,7 @@ DECLARE_SOA_COLUMN(Nclass, nclass, int); namespace o2::aod { DECLARE_SOA_TABLE(DiMu, "AOD", "DIMU", + dimu::RunNumber, dimu::M, dimu::Energy, dimu::Px, dimu::Py, dimu::Pz, dimu::Pt, dimu::Rap, dimu::Phi, dimu::PhiAv, dimu::PhiCh, dimu::EnergyP, dimu::Pxp, dimu::Pyp, dimu::Pzp, dimu::Ptp, dimu::Etap, dimu::Phip, @@ -112,6 +114,7 @@ DECLARE_SOA_TABLE(GenDimu, "AOD", "GENDIMU", namespace recodimu { // dimuon +DECLARE_SOA_COLUMN(RunNumber, runNumber, int); DECLARE_SOA_COLUMN(M, m, float); DECLARE_SOA_COLUMN(Pt, pt, float); DECLARE_SOA_COLUMN(Rap, rap, float); @@ -141,6 +144,7 @@ DECLARE_SOA_COLUMN(GenPhin, genPhin, float); namespace o2::aod { DECLARE_SOA_TABLE(RecoDimu, "AOD", "RECODIMU", + recodimu::RunNumber, recodimu::M, recodimu::Pt, recodimu::Rap, recodimu::Phi, recodimu::PhiAv, recodimu::PhiCh, recodimu::Ptp, recodimu::Etap, recodimu::Phip, @@ -371,8 +375,8 @@ struct FwdMuonsUPC { } } - // template function that fills a map with the collision id of each udmccollision as key - // and a vector with the tracks + // template function that fills a map with the collision id of each udcollision as key + // and a vector with the tracks and corresponding geneated particles // map == (key, element) == (udCollisionId, vector(track1, mcPart1, track2, mcPart2)) template void collectRecoCandID(std::unordered_map>& tracksPerCand, TTracks& tracks) @@ -621,13 +625,15 @@ struct FwdMuonsUPC { // store the event to save it into a tree if (tr1.sign() > 0) { - dimuSel(p.M(), p.E(), p.Px(), p.Py(), p.Pz(), p.Pt(), p.Rapidity(), p.Phi(), + dimuSel(cand.runNumber(), + p.M(), p.E(), p.Px(), p.Py(), p.Pz(), p.Pt(), p.Rapidity(), p.Phi(), phiAverage, phiCharge, p1.E(), p1.Px(), p1.Py(), p1.Pz(), p1.Pt(), p1.PseudoRapidity(), p1.Phi(), p2.E(), p2.Px(), p2.Py(), p2.Pz(), p2.Pt(), p2.PseudoRapidity(), p2.Phi(), zdc.timeA, zdc.enA, zdc.timeC, zdc.enC, znClass); } else { - dimuSel(p.M(), p.E(), p.Px(), p.Py(), p.Pz(), p.Pt(), p.Rapidity(), p.Phi(), + dimuSel(cand.runNumber(), + p.M(), p.E(), p.Px(), p.Py(), p.Pz(), p.Pt(), p.Rapidity(), p.Phi(), phiAverage, phiCharge, p2.E(), p2.Px(), p2.Py(), p2.Pz(), p2.Pt(), p2.PseudoRapidity(), p2.Phi(), p1.E(), p1.Px(), p1.Py(), p1.Pz(), p1.Pt(), p1.PseudoRapidity(), p1.Phi(), @@ -836,7 +842,8 @@ struct FwdMuonsUPC { // store the event to save it into a tree if (tr1.sign() > 0) { - dimuReco(p.M(), p.Pt(), p.Rapidity(), p.Phi(), + dimuReco(cand.runNumber(), + p.M(), p.Pt(), p.Rapidity(), p.Phi(), phiAverage, phiCharge, p1.Pt(), p1.PseudoRapidity(), p1.Phi(), p2.Pt(), p2.PseudoRapidity(), p2.Phi(), @@ -845,7 +852,8 @@ struct FwdMuonsUPC { p1Mc.Pt(), p1Mc.PseudoRapidity(), p1Mc.Phi(), p2Mc.Pt(), p2Mc.PseudoRapidity(), p2Mc.Phi()); } else { - dimuReco(p.M(), p.Pt(), p.Rapidity(), p.Phi(), + dimuReco(cand.runNumber(), + p.M(), p.Pt(), p.Rapidity(), p.Phi(), phiAverage, phiCharge, p2.Pt(), p2.PseudoRapidity(), p2.Phi(), p1.Pt(), p1.PseudoRapidity(), p1.Phi(), From 5470c05176d9a187ec297384c8900c13dc98daa5 Mon Sep 17 00:00:00 2001 From: eloviyo <38348689+Eloviyo@users.noreply.github.com> Date: Wed, 5 Feb 2025 11:40:31 +0100 Subject: [PATCH 0049/1650] [PWGCF] FemtoUniverse cascade task -- added cascade-cascade Close Pair Rejection (#9753) Co-authored-by: Shirajum Monira --- .../Core/FemtoUniverseDetaDphiStar.h | 102 +++++++++++++++--- 1 file changed, 89 insertions(+), 13 deletions(-) diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h index f891823ccf5..792db50bd26 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h @@ -14,6 +14,7 @@ /// \author Laura Serksnyte, TU München, laura.serksnyte@tum.de /// \author Zuzanna Chochulska, WUT Warsaw & CTU Prague, zchochul@cern.ch /// \author Pritam Chakraborty, WUT Warsaw, pritam.chakraborty@cern.ch +/// \author Shirajum Monira, WUT Warsaw, shirajum.monira@cern.ch #ifndef PWGCF_FEMTOUNIVERSE_CORE_FEMTOUNIVERSEDETADPHISTAR_H_ #define PWGCF_FEMTOUNIVERSE_CORE_FEMTOUNIVERSEDETADPHISTAR_H_ @@ -102,6 +103,21 @@ class FemtoUniverseDetaDphiStar } } } + if constexpr (kPartOneType == o2::aod::femtouniverseparticle::ParticleType::kCascade && kPartTwoType == o2::aod::femtouniverseparticle::ParticleType::kCascade) { + /// Xi-Xi and Omega-Omega combination + for (int k = 0; k < 7; k++) { + std::string dirName = static_cast(DirNames[5]); + histdetadpisame[k][0] = mHistogramRegistry->add((dirName + static_cast(HistNamesSame[0][k])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); + histdetadpisame[k][1] = mHistogramRegistry->add((dirName + static_cast(HistNamesSame[1][k])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); + histdetadpimixed[k][0] = mHistogramRegistry->add((dirName + static_cast(HistNamesMixed[0][k])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); + histdetadpimixed[k][1] = mHistogramRegistry->add((dirName + static_cast(HistNamesMixed[1][k])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); + if (plotForEveryRadii) { + for (int l = 0; l < 9; l++) { + histdetadpiRadii[k][l] = mHistogramRegistryQA->add((dirName + static_cast(HistNamesRadii[k][l])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); + } + } + } + } if constexpr (kPartOneType == o2::aod::femtouniverseparticle::ParticleType::kTrack && kPartTwoType == o2::aod::femtouniverseparticle::ParticleType::kPhi) { for (int i = 0; i < 2; i++) { std::string dirName = static_cast(DirNames[3]); @@ -209,7 +225,6 @@ class FemtoUniverseDetaDphiStar } else if constexpr (kPartOneType == o2::aod::femtouniverseparticle::ParticleType::kV0 && kPartTwoType == o2::aod::femtouniverseparticle::ParticleType::kV0) { /// V0-V0 combination - // check if provided particles are in agreement with the class instantiation if (part1.partType() != o2::aod::femtouniverseparticle::ParticleType::kV0 || part2.partType() != o2::aod::femtouniverseparticle::ParticleType::kV0) { LOG(fatal) << "FemtoUniverseDetaDphiStar: passed arguments don't agree with FemtoUniverseDetaDphiStar instantiation! Please provide kV0,kV0 candidates."; return false; @@ -246,6 +261,44 @@ class FemtoUniverseDetaDphiStar } return pass; + } else if constexpr (kPartOneType == o2::aod::femtouniverseparticle::ParticleType::kCascade && kPartTwoType == o2::aod::femtouniverseparticle::ParticleType::kCascade) { + /// Xi-Xi and Omega-Omega combination + if (part1.partType() != o2::aod::femtouniverseparticle::ParticleType::kCascade || part2.partType() != o2::aod::femtouniverseparticle::ParticleType::kCascade) { + LOG(fatal) << "FemtoUniverseDetaDphiStar: passed arguments don't agree with FemtoUniverseDetaDphiStar instantiation! Please provide kCascade,kCascade candidates."; + return false; + } + + bool pass = false; + static constexpr int CascChildTable[][2] = {{-1, -1}, {-1, -2}, {-1, -3}, {-2, -2}, {-3, -3}, {-2, -1}, {-3, -1}}; + for (int i = 0; i < 5; i++) { + auto indexOfDaughterpart1 = (ChosenEventType == femto_universe_container::EventType::mixed ? part1.globalIndex() : part1.index()) + CascChildTable[i][0]; + auto indexOfDaughterpart2 = (ChosenEventType == femto_universe_container::EventType::mixed ? part2.globalIndex() : part2.index()) + CascChildTable[i][1]; + auto daughterpart1 = particles.begin() + indexOfDaughterpart1; + auto daughterpart2 = particles.begin() + indexOfDaughterpart2; + auto deta = daughterpart1.eta() - daughterpart2.eta(); + auto dphiAvg = averagePhiStar(*daughterpart1, *daughterpart2, i); + if (ChosenEventType == femto_universe_container::EventType::same) { + histdetadpisame[i][0]->Fill(deta, dphiAvg); + } else if (ChosenEventType == femto_universe_container::EventType::mixed) { + histdetadpimixed[i][0]->Fill(deta, dphiAvg); + } else { + LOG(fatal) << "FemtoUniverseDetaDphiStar: passed arguments don't agree with FemtoUniverseDetaDphiStar's type of events! Please provide same or mixed."; + } + + if ((dphiAvg > cutDeltaPhiStarMin) && (dphiAvg < cutDeltaPhiStarMax) && (deta > cutDeltaEtaMin) && (deta < cutDeltaEtaMax)) { + pass = true; + } else { + if (ChosenEventType == femto_universe_container::EventType::same) { + histdetadpisame[i][1]->Fill(deta, dphiAvg); + } else if (ChosenEventType == femto_universe_container::EventType::mixed) { + histdetadpimixed[i][1]->Fill(deta, dphiAvg); + } else { + LOG(fatal) << "FemtoUniverseDetaDphiStar: passed arguments don't agree with FemtoUniverseDetaDphiStar's type of events! Please provide same or mixed."; + } + } + } + return pass; + } else if constexpr (kPartOneType == o2::aod::femtouniverseparticle::ParticleType::kTrack && kPartTwoType == o2::aod::femtouniverseparticle::ParticleType::kD0) { /// Track-D0 combination // check if provided particles are in agreement with the class instantiation @@ -354,19 +407,42 @@ class FemtoUniverseDetaDphiStar private: HistogramRegistry* mHistogramRegistry = nullptr; ///< For main output HistogramRegistry* mHistogramRegistryQA = nullptr; ///< For QA output - static constexpr std::string_view DirNames[5] = {"kTrack_kTrack/", "kTrack_kV0/", "kV0_kV0/", "kTrack_kPhi/", "kTrack_kD0/"}; - - static constexpr std::string_view HistNamesSame[2][2] = {{"detadphidetadphi0BeforeSame_0", "detadphidetadphi0BeforeSame_1"}, - {"detadphidetadphi0AfterSame_0", "detadphidetadphi0AfterSame_1"}}; - static constexpr std::string_view HistNamesMixed[2][2] = {{"detadphidetadphi0BeforeMixed_0", "detadphidetadphi0BeforeMixed_1"}, - {"detadphidetadphi0AfterMixed_0", "detadphidetadphi0AfterMixed_1"}}; - - static constexpr std::string_view HistNamesRadii[2][9] = {{"detadphidetadphi0Before_0_0", "detadphidetadphi0Before_0_1", "detadphidetadphi0Before_0_2", + static constexpr std::string_view DirNames[6] = {"kTrack_kTrack/", "kTrack_kV0/", "kV0_kV0/", "kTrack_kPhi/", "kTrack_kD0/", "kCascade_kCascade/"}; + + static constexpr std::string_view HistNamesSame[2][7] = {{"detadphidetadphi0BeforeSame_0", "detadphidetadphi0BeforeSame_1", "detadphidetadphi0BeforeSame_2", + "detadphidetadphi0BeforeSame_3", "detadphidetadphi0BeforeSame_4", "detadphidetadphi0BeforeSame_5", + "detadphidetadphi0BeforeSame_6"}, + {"detadphidetadphi0AfterSame_0", "detadphidetadphi0AfterSame_1", "detadphidetadphi0AfterSame_2", + "detadphidetadphi0AfterSame_3", "detadphidetadphi0AfterSame_4", "detadphidetadphi0AfterSame_5", + "detadphidetadphi0AfterSame_6"}}; + static constexpr std::string_view HistNamesMixed[2][7] = {{"detadphidetadphi0BeforeMixed_0", "detadphidetadphi0BeforeMixed_1", "detadphidetadphi0BeforeMixed_2", + "detadphidetadphi0BeforeMixed_3", "detadphidetadphi0BeforeMixed_4", "detadphidetadphi0BeforeMixed_5", + "detadphidetadphi0BeforeMixed_6"}, + {"detadphidetadphi0AfterMixed_0", "detadphidetadphi0AfterMixed_1", "detadphidetadphi0AfterMixed_2", + "detadphidetadphi0AfterMixed_3", "detadphidetadphi0AfterMixed_4", "detadphidetadphi0AfterMixed_5", + "detadphidetadphi0AfterMixed_6"}}; + + static constexpr std::string_view HistNamesRadii[7][9] = {{"detadphidetadphi0Before_0_0", "detadphidetadphi0Before_0_1", "detadphidetadphi0Before_0_2", "detadphidetadphi0Before_0_3", "detadphidetadphi0Before_0_4", "detadphidetadphi0Before_0_5", "detadphidetadphi0Before_0_6", "detadphidetadphi0Before_0_7", "detadphidetadphi0Before_0_8"}, {"detadphidetadphi0Before_1_0", "detadphidetadphi0Before_1_1", "detadphidetadphi0Before_1_2", "detadphidetadphi0Before_1_3", "detadphidetadphi0Before_1_4", "detadphidetadphi0Before_1_5", - "detadphidetadphi0Before_1_6", "detadphidetadphi0Before_1_7", "detadphidetadphi0Before_1_8"}}; + "detadphidetadphi0Before_1_6", "detadphidetadphi0Before_1_7", "detadphidetadphi0Before_1_8"}, + {"detadphidetadphi0Before_2_0", "detadphidetadphi0Before_2_1", "detadphidetadphi0Before_2_2", + "detadphidetadphi0Before_2_3", "detadphidetadphi0Before_2_4", "detadphidetadphi0Before_2_5", + "detadphidetadphi0Before_2_6", "detadphidetadphi0Before_2_7", "detadphidetadphi0Before_2_8"}, + {"detadphidetadphi0Before_3_0", "detadphidetadphi0Before_3_1", "detadphidetadphi0Before_3_2", + "detadphidetadphi0Before_3_3", "detadphidetadphi0Before_3_4", "detadphidetadphi0Before_3_5", + "detadphidetadphi0Before_3_6", "detadphidetadphi0Before_3_7", "detadphidetadphi0Before_3_8"}, + {"detadphidetadphi0Before_4_0", "detadphidetadphi0Before_4_1", "detadphidetadphi0Before_4_2", + "detadphidetadphi0Before_4_3", "detadphidetadphi0Before_4_4", "detadphidetadphi0Before_4_5", + "detadphidetadphi0Before_4_6", "detadphidetadphi0Before_4_7", "detadphidetadphi0Before_4_8"}, + {"detadphidetadphi0Before_5_0", "detadphidetadphi0Before_5_1", "detadphidetadphi0Before_5_2", + "detadphidetadphi0Before_5_3", "detadphidetadphi0Before_5_4", "detadphidetadphi0Before_5_5", + "detadphidetadphi0Before_5_6", "detadphidetadphi0Before_5_7", "detadphidetadphi0Before_5_8"}, + {"detadphidetadphi0Before_6_0", "detadphidetadphi0Before_6_1", "detadphidetadphi0Before_6_2", + "detadphidetadphi0Before_6_3", "detadphidetadphi0Before_6_4", "detadphidetadphi0Before_6_5", + "detadphidetadphi0Before_6_6", "detadphidetadphi0Before_6_7", "detadphidetadphi0Before_6_8"}}; static constexpr o2::aod::femtouniverseparticle::ParticleType kPartOneType = partOne; ///< Type of particle 1 static constexpr o2::aod::femtouniverseparticle::ParticleType kPartTwoType = partTwo; ///< Type of particle 2 @@ -387,9 +463,9 @@ class FemtoUniverseDetaDphiStar float cutPhiInvMassLow; float cutPhiInvMassHigh; - std::array, 2>, 2> histdetadpisame{}; - std::array, 2>, 2> histdetadpimixed{}; - std::array, 9>, 2> histdetadpiRadii{}; + std::array, 2>, 7> histdetadpisame{}; + std::array, 2>, 7> histdetadpimixed{}; + std::array, 9>, 7> histdetadpiRadii{}; /// Calculate phi at all required radii stored in TmpRadiiTPC /// Magnetic field to be provided in Tesla From 0412a7b63ec6e47558e6f0217af2e5e89d3b6bd6 Mon Sep 17 00:00:00 2001 From: Nicolas Strangmann <77485327+nstrangm@users.noreply.github.com> Date: Wed, 5 Feb 2025 11:43:41 +0100 Subject: [PATCH 0050/1650] [PWGEM/PhotonMeson] Add missing JJ weight requirement for gen particles (#9708) Co-authored-by: Nicolas Strangmann --- PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h index 3b05366eec9..d9d436f4ce9 100644 --- a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h +++ b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h @@ -649,6 +649,10 @@ struct Pi0EtaToGammaGammaMC { continue; // I don't know why this is necessary in simulation. } + if (eventcuts.onlyKeepWeightedEvents && fabs(collision.weight() - 1.) < 1E-10) { + continue; + } + float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { continue; From fbb07d81bc3d5a36f4bffec7e248ab07b944097f Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Wed, 5 Feb 2025 22:48:10 +0900 Subject: [PATCH 0051/1650] [PWGEM/Dilepton] add possibility to require true track-to-collisio association (#9763) --- PWGEM/Dilepton/Core/DileptonMC.h | 20 ++++++++----- PWGEM/Dilepton/Core/SingleTrackQCMC.h | 16 +++++----- .../TableProducer/skimmerPrimaryElectron.cxx | 12 ++++---- PWGEM/Dilepton/Tasks/createResolutionMap.cxx | 30 +++++++++++++++---- PWGEM/PhotonMeson/Core/V0PhotonCut.h | 20 ++++++------- .../TableProducer/photonconversionbuilder.cxx | 17 ++++++----- 6 files changed, 70 insertions(+), 45 deletions(-) diff --git a/PWGEM/Dilepton/Core/DileptonMC.h b/PWGEM/Dilepton/Core/DileptonMC.h index f90f357ae8a..bb4920c0888 100644 --- a/PWGEM/Dilepton/Core/DileptonMC.h +++ b/PWGEM/Dilepton/Core/DileptonMC.h @@ -104,6 +104,7 @@ struct DileptonMC { Configurable cfgApplyWeightTTCA{"cfgApplyWeightTTCA", false, "flag to apply weighting by 1/N"}; Configurable cfgDCAType{"cfgDCAType", 0, "type of DCA for output. 0:3D, 1:XY, 2:Z, else:3D"}; Configurable cfgFillUnfolding{"cfgFillUnfolding", false, "flag to fill histograms for unfolding"}; + Configurable cfgRequireTrueAssociation{"cfgRequireTrueAssociation", false, "flag to require true mc collision association"}; ConfigurableAxis ConfMllBins{"ConfMllBins", {VARIABLE_WIDTH, 0.00, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.10, 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.20, 0.21, 0.22, 0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.30, 0.31, 0.32, 0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.40, 0.41, 0.42, 0.43, 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.50, 0.51, 0.52, 0.53, 0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.60, 0.61, 0.62, 0.63, 0.64, 0.65, 0.66, 0.67, 0.68, 0.69, 0.70, 0.71, 0.72, 0.73, 0.74, 0.75, 0.76, 0.77, 0.78, 0.79, 0.80, 0.81, 0.82, 0.83, 0.84, 0.85, 0.86, 0.87, 0.88, 0.89, 0.90, 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1.00, 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.10, 1.11, 1.12, 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.20, 1.30, 1.40, 1.50, 1.60, 1.70, 1.80, 1.90, 2.00, 2.10, 2.20, 2.30, 2.40, 2.50, 2.60, 2.70, 2.75, 2.80, 2.85, 2.90, 2.95, 3.00, 3.05, 3.10, 3.15, 3.20, 3.25, 3.30, 3.35, 3.40, 3.45, 3.50, 3.55, 3.60, 3.65, 3.70, 3.75, 3.80, 3.85, 3.90, 3.95, 4.00}, "mll bins for output histograms"}; ConfigurableAxis ConfPtllBins{"ConfPtllBins", {VARIABLE_WIDTH, 0.00, 0.10, 0.20, 0.30, 0.40, 0.50, 0.60, 0.70, 0.80, 0.90, 1.00, 1.10, 1.20, 1.30, 1.40, 1.50, 1.60, 1.70, 1.80, 1.90, 2.00, 2.50, 3.00, 3.50, 4.00, 4.50, 5.00, 6.00, 7.00, 8.00, 9.00, 10.00}, "pTll bins for output histograms"}; @@ -292,7 +293,8 @@ struct DileptonMC { { // event info o2::aod::pwgem::dilepton::utils::eventhistogram::addEventHistograms(&fRegistry); - fRegistry.add("MCEvent/before/hZvtx", "vertex z; Z_{vtx} (cm)", kTH1F, {{100, -50, +50}}, false); + fRegistry.add("MCEvent/before/hZvtx", "mc vertex z; Z_{vtx} (cm)", kTH1F, {{100, -50, +50}}, false); + fRegistry.add("MCEvent/before/hZvtx_rec", "rec. mc vertex z; Z_{vtx} (cm)", kTH1F, {{100, -50, +50}}, false); fRegistry.addClone("MCEvent/before/", "MCEvent/after/"); std::string mass_axis_title = "m_{ll} (GeV/c^{2})"; @@ -782,7 +784,7 @@ struct DileptonMC { { auto t1mc = mcparticles.iteratorAt(t1.emmcparticleId()); auto t2mc = mcparticles.iteratorAt(t2.emmcparticleId()); - bool is_from_same_mcevent = t1mc.emmceventId() == t2mc.emmceventId(); + bool is_pair_from_same_mcevent = (t1mc.emmceventId() == t2mc.emmceventId()); auto mccollision1 = t1mc.template emmcevent_as(); auto mccollision2 = t2mc.template emmcevent_as(); @@ -913,10 +915,10 @@ struct DileptonMC { o2::aod::pwgem::dilepton::utils::pairutil::getAngleCS(t1, t2, leptonM1, leptonM2, beamE1, beamE2, beamP1, beamP2, cos_thetaCS, phiCS); o2::math_utils::bringToPMPi(phiCS); - if ((FindCommonMotherFrom2ProngsWithoutPDG(t1mc, t2mc) > 0 || IsHF(t1mc, t2mc, mcparticles) > 0) && is_from_same_mcevent) { // for bkg study - if (abs(t1mc.pdgCode()) != pdg_lepton || abs(t2mc.pdgCode()) != pdg_lepton) { // hh or eh correlated bkg - if (abs(t1mc.pdgCode()) != pdg_lepton && abs(t2mc.pdgCode()) != pdg_lepton) { // hh correlated bkg - if (t1.sign() * t2.sign() < 0) { // ULS + if ((FindCommonMotherFrom2ProngsWithoutPDG(t1mc, t2mc) > 0 || IsHF(t1mc, t2mc, mcparticles) > 0) && is_pair_from_same_mcevent) { // for bkg study + if (abs(t1mc.pdgCode()) != pdg_lepton || abs(t2mc.pdgCode()) != pdg_lepton) { // hh or eh correlated bkg + if (abs(t1mc.pdgCode()) != pdg_lepton && abs(t2mc.pdgCode()) != pdg_lepton) { // hh correlated bkg + if (t1.sign() * t2.sign() < 0) { // ULS fRegistry.fill(HIST("Pair/corr_bkg_hh/uls/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); } else if (t1.sign() > 0 && t2.sign() > 0) { // LS++ fRegistry.fill(HIST("Pair/corr_bkg_hh/lspp/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); @@ -947,7 +949,10 @@ struct DileptonMC { return false; } - if (!is_from_same_mcevent) { + if (!is_pair_from_same_mcevent) { + return false; + } + if (cfgRequireTrueAssociation && (t1mc.emmceventId() != collision.emmceventId() || t2mc.emmceventId() != collision.emmceventId())) { return false; } int mother_id = FindLF(t1mc, t2mc, mcparticles); @@ -1254,6 +1259,7 @@ struct DileptonMC { if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { continue; } + fRegistry.fill(HIST("MCEvent/before/hZvtx_rec"), mccollision.posZ()); if (!fEMEventCut.IsSelected(collision)) { continue; } diff --git a/PWGEM/Dilepton/Core/SingleTrackQCMC.h b/PWGEM/Dilepton/Core/SingleTrackQCMC.h index 7cfa0fffc5a..05c6471f495 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQCMC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQCMC.h @@ -87,6 +87,7 @@ struct SingleTrackQCMC { Configurable cfgFillQA{"cfgFillQA", false, "flag to fill QA histograms"}; Configurable cfgApplyWeightTTCA{"cfgApplyWeightTTCA", false, "flag to apply weighting by 1/N"}; Configurable cfgDCAType{"cfgDCAType", 0, "type of DCA for output. 0:3D, 1:XY, 2:Z, else:3D"}; + Configurable cfgRequireTrueAssociation{"cfgRequireTrueAssociation", false, "flag to require true mc collision association"}; ConfigurableAxis ConfPtlBins{"ConfPtlBins", {VARIABLE_WIDTH, 0.00, 0.05, 0.10, 0.15, 0.20, 0.30, 0.40, 0.50, 0.60, 0.70, 0.80, 0.90, 1.00, 1.10, 1.20, 1.30, 1.40, 1.50, 1.60, 1.70, 1.80, 1.90, 2.00, 2.50, 3.00, 3.50, 4.00, 4.50, 5.00, 6.00, 7.00, 8.00, 9.00, 10.00}, "pTl bins for output histograms"}; ConfigurableAxis ConfDCABins{"ConfDCABins", {VARIABLE_WIDTH, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0}, "DCA bins for output histograms"}; @@ -221,7 +222,8 @@ struct SingleTrackQCMC { { // event info o2::aod::pwgem::dilepton::utils::eventhistogram::addEventHistograms<-1>(&fRegistry); - fRegistry.add("MCEvent/before/hZvtx", "vertex z; Z_{vtx} (cm)", kTH1F, {{100, -50, +50}}, false); + fRegistry.add("MCEvent/before/hZvtx", "mc vertex z; Z_{vtx} (cm)", kTH1F, {{100, -50, +50}}, false); + fRegistry.add("MCEvent/before/hZvtx_rec", "rec. mc vertex z; Z_{vtx} (cm)", kTH1F, {{100, -50, +50}}, false); fRegistry.addClone("MCEvent/before/", "MCEvent/after/"); if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { @@ -701,11 +703,6 @@ struct SingleTrackQCMC { continue; } - // auto mccollision = collision.template emmcevent_as(); - // if (cfgEventGeneratorType >= 0 && mccollision.getSubGeneratorId() != cfgEventGeneratorType) { - // continue; - // } - o2::aod::pwgem::dilepton::utils::eventhistogram::fillEventInfo<0, -1>(&fRegistry, collision); if (!fEMEventCut.IsSelected(collision)) { continue; @@ -731,9 +728,9 @@ struct SingleTrackQCMC { continue; } - // if (mctrack.emmceventId() != collision.emmceventId()) { - // continue; - // } + if (cfgRequireTrueAssociation && (mctrack.emmceventId() != collision.emmceventId())) { + continue; + } if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { if (dielectroncuts.cfg_pid_scheme == static_cast(DielectronCut::PIDSchemes::kPIDML)) { @@ -811,6 +808,7 @@ struct SingleTrackQCMC { if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { continue; } + fRegistry.fill(HIST("MCEvent/before/hZvtx_rec"), mccollision.posZ()); if (!fEMEventCut.IsSelected(collision)) { continue; } diff --git a/PWGEM/Dilepton/TableProducer/skimmerPrimaryElectron.cxx b/PWGEM/Dilepton/TableProducer/skimmerPrimaryElectron.cxx index 61e0e4efecc..48b47e44f6b 100644 --- a/PWGEM/Dilepton/TableProducer/skimmerPrimaryElectron.cxx +++ b/PWGEM/Dilepton/TableProducer/skimmerPrimaryElectron.cxx @@ -243,9 +243,9 @@ struct skimmerPrimaryElectron { gpu::gpustd::array dcaInfo; auto track_par_cov_recalc = getTrackParCov(track); track_par_cov_recalc.setPID(o2::track::PID::Electron); - std::array pVec_recalc = {0, 0, 0}; // px, py, pz + // std::array pVec_recalc = {0, 0, 0}; // px, py, pz o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, track_par_cov_recalc, 2.f, matCorr, &dcaInfo); - getPxPyPz(track_par_cov_recalc, pVec_recalc); + // getPxPyPz(track_par_cov_recalc, pVec_recalc); float dcaXY = dcaInfo[0]; float dcaZ = dcaInfo[1]; @@ -315,9 +315,9 @@ struct skimmerPrimaryElectron { gpu::gpustd::array dcaInfo; auto track_par_cov_recalc = getTrackParCov(track); track_par_cov_recalc.setPID(o2::track::PID::Electron); - std::array pVec_recalc = {0, 0, 0}; // px, py, pz + // std::array pVec_recalc = {0, 0, 0}; // px, py, pz o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, track_par_cov_recalc, 2.f, matCorr, &dcaInfo); - getPxPyPz(track_par_cov_recalc, pVec_recalc); + // getPxPyPz(track_par_cov_recalc, pVec_recalc); float dcaXY = dcaInfo[0]; float dcaZ = dcaInfo[1]; @@ -762,9 +762,9 @@ struct prefilterPrimaryElectron { gpu::gpustd::array dcaInfo; auto track_par_cov_recalc = getTrackParCov(track); track_par_cov_recalc.setPID(o2::track::PID::Electron); - std::array pVec_recalc = {0, 0, 0}; // px, py, pz + // std::array pVec_recalc = {0, 0, 0}; // px, py, pz o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, track_par_cov_recalc, 2.f, matCorr, &dcaInfo); - getPxPyPz(track_par_cov_recalc, pVec_recalc); + // getPxPyPz(track_par_cov_recalc, pVec_recalc); if (std::fabs(dcaInfo[0]) > max_dcaxy || std::fabs(dcaInfo[1]) > max_dcaz) { return false; diff --git a/PWGEM/Dilepton/Tasks/createResolutionMap.cxx b/PWGEM/Dilepton/Tasks/createResolutionMap.cxx index 7a7eee3413e..b4a43b5aed7 100644 --- a/PWGEM/Dilepton/Tasks/createResolutionMap.cxx +++ b/PWGEM/Dilepton/Tasks/createResolutionMap.cxx @@ -179,6 +179,8 @@ struct CreateResolutionMap { registry.add("Event/Electron/hImpPar_Centrality", "true imapact parameter vs. estimated centrality;impact parameter (fm);centrality (%)", kTH2F, {{200, 0, 20}, {110, 0, 110}}, true); registry.add("Event/Muon/hImpPar_Centrality", "true imapact parameter vs. estimated centrality;impact parameter (fm);centrality (%)", kTH2F, {{200, 0, 20}, {110, 0, 110}}, true); + registry.add("Electron/hPt", "rec. p_{T,l};p_{T,l} (GeV/c)", kTH1F, {{1000, 0, 10}}, false); + registry.add("Electron/hEtaPhi", "rec. #eta vs. #varphi;#varphi_{l} (rad.);#eta_{l}", kTH2F, {{90, 0, 2 * M_PI}, {80, -2, +2}}, false); registry.add("Electron/Ptgen_RelDeltaPt", "resolution", kTH2F, {{axis_pt_gen}, {axis_dpt}}, true); registry.add("Electron/Ptgen_DeltaEta", "resolution", kTH2F, {{axis_pt_gen}, {axis_deta}}, true); registry.add("Electron/Ptgen_DeltaPhi_Pos", "resolution", kTH2F, {{axis_pt_gen}, {axis_dphi}}, true); @@ -469,6 +471,8 @@ struct CreateResolutionMap { } if (muon.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { + registry.fill(HIST("StandaloneMuon/hPt"), pt); + registry.fill(HIST("StandaloneMuon/hEtaPhi"), phi, eta); registry.fill(HIST("StandaloneMuon/hs_reso"), centrality, mcparticle.pt(), mcparticle.eta(), mcparticle.phi(), -mcparticle.pdgCode() / 13, (mcparticle.pt() - pt) / mcparticle.pt(), mcparticle.eta() - eta, mcparticle.phi() - phi); registry.fill(HIST("StandaloneMuon/Ptgen_RelDeltaPt"), mcparticle.pt(), (mcparticle.pt() - pt) / mcparticle.pt()); registry.fill(HIST("StandaloneMuon/Ptgen_DeltaEta"), mcparticle.pt(), mcparticle.eta() - eta); @@ -478,6 +482,8 @@ struct CreateResolutionMap { registry.fill(HIST("StandaloneMuon/Ptgen_DeltaPhi_Neg"), mcparticle.pt(), mcparticle.phi() - phi); } } else if (muon.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack)) { + registry.fill(HIST("GlobalMuon/hPt"), pt); + registry.fill(HIST("GlobalMuon/hEtaPhi"), phi, eta); registry.fill(HIST("GlobalMuon/hs_reso"), centrality, mcparticle.pt(), mcparticle.eta(), mcparticle.phi(), -mcparticle.pdgCode() / 13, (mcparticle.pt() - pt) / mcparticle.pt(), mcparticle.eta() - eta, mcparticle.phi() - phi); registry.fill(HIST("GlobalMuon/Ptgen_RelDeltaPt"), mcparticle.pt(), (mcparticle.pt() - pt) / mcparticle.pt()); registry.fill(HIST("GlobalMuon/Ptgen_DeltaEta"), mcparticle.pt(), mcparticle.eta() - eta); @@ -521,13 +527,27 @@ struct CreateResolutionMap { return; } - registry.fill(HIST("Electron/hs_reso"), centrality, mcparticle.pt(), mcparticle.eta(), mcparticle.phi(), -mcparticle.pdgCode() / 11, (mcparticle.pt() - track.pt()) / mcparticle.pt(), mcparticle.eta() - track.eta(), mcparticle.phi() - track.phi()); - registry.fill(HIST("Electron/Ptgen_RelDeltaPt"), mcparticle.pt(), (mcparticle.pt() - track.pt()) / mcparticle.pt()); - registry.fill(HIST("Electron/Ptgen_DeltaEta"), mcparticle.pt(), mcparticle.eta() - track.eta()); + gpu::gpustd::array dcaInfo; + auto track_par_cov_recalc = getTrackParCov(track); + track_par_cov_recalc.setPID(o2::track::PID::Electron); + // std::array pVec_recalc = {0, 0, 0}; // px, py, pz + o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, track_par_cov_recalc, 2.f, matCorr, &dcaInfo); + // getPxPyPz(track_par_cov_recalc, pVec_recalc); + + float pt = track_par_cov_recalc.getPt(); + float eta = track_par_cov_recalc.getEta(); + float phi = track_par_cov_recalc.getPhi(); + o2::math_utils::bringTo02Pi(phi); + + registry.fill(HIST("Electron/hPt"), pt); + registry.fill(HIST("Electron/hEtaPhi"), phi, eta); + registry.fill(HIST("Electron/hs_reso"), centrality, mcparticle.pt(), mcparticle.eta(), mcparticle.phi(), -mcparticle.pdgCode() / 11, (mcparticle.pt() - pt) / mcparticle.pt(), mcparticle.eta() - eta, mcparticle.phi() - phi); + registry.fill(HIST("Electron/Ptgen_RelDeltaPt"), mcparticle.pt(), (mcparticle.pt() - pt) / mcparticle.pt()); + registry.fill(HIST("Electron/Ptgen_DeltaEta"), mcparticle.pt(), mcparticle.eta() - eta); if (mcparticle.pdgCode() == -11) { // positron - registry.fill(HIST("Electron/Ptgen_DeltaPhi_Pos"), mcparticle.pt(), mcparticle.phi() - track.phi()); + registry.fill(HIST("Electron/Ptgen_DeltaPhi_Pos"), mcparticle.pt(), mcparticle.phi() - phi); } else if (mcparticle.pdgCode() == 11) { // electron - registry.fill(HIST("Electron/Ptgen_DeltaPhi_Neg"), mcparticle.pt(), mcparticle.phi() - track.phi()); + registry.fill(HIST("Electron/Ptgen_DeltaPhi_Neg"), mcparticle.pt(), mcparticle.phi() - phi); } } diff --git a/PWGEM/PhotonMeson/Core/V0PhotonCut.h b/PWGEM/PhotonMeson/Core/V0PhotonCut.h index 345b388c3df..bdc5d84aca4 100644 --- a/PWGEM/PhotonMeson/Core/V0PhotonCut.h +++ b/PWGEM/PhotonMeson/Core/V0PhotonCut.h @@ -288,7 +288,7 @@ class V0PhotonCut : public TNamed return v0.chiSquareNDF() <= mMaxChi2KF; case V0PhotonCuts::kRZLine: - return v0.v0radius() > abs(v0.vz()) * std::tan(2 * std::atan(std::exp(-mMaxV0Eta))) - mMaxMarginZ; + return v0.v0radius() > std::fabs(v0.vz()) * std::tan(2 * std::atan(std::exp(-mMaxV0Eta))) - mMaxMarginZ; case V0PhotonCuts::kOnWwireIB: { const float margin_xy = 1.0; // cm @@ -297,9 +297,9 @@ class V0PhotonCut : public TNamed // const float rxy_max = 14.846; // cm // const float z_min = -17.56; // cm // const float z_max = +31.15; // cm - float x = abs(v0.vx()); // cm, measured secondary vertex of gamma->ee - float y = v0.vy(); // cm, measured secondary vertex of gamma->ee - float z = v0.vz(); // cm, measured secondary vertex of gamma->ee + float x = std::fabs(v0.vx()); // cm, measured secondary vertex of gamma->ee + float y = v0.vy(); // cm, measured secondary vertex of gamma->ee + float z = v0.vz(); // cm, measured secondary vertex of gamma->ee float rxy = sqrt(x * x + y * y); if (rxy < 7.0 || 14.0 < rxy) { @@ -311,7 +311,7 @@ class V0PhotonCut : public TNamed return false; } - float dxy = abs(1.0 * y - x * std::tan(-8.52 * TMath::DegToRad())) / sqrt(pow(1.0, 2) + pow(std::tan(-8.52 * TMath::DegToRad()), 2)); + float dxy = std::fabs(1.0 * y - x * std::tan(-8.52 * TMath::DegToRad())) / sqrt(pow(1.0, 2) + pow(std::tan(-8.52 * TMath::DegToRad()), 2)); return !(dxy > margin_xy); } case V0PhotonCuts::kOnWwireOB: { @@ -371,10 +371,10 @@ class V0PhotonCut : public TNamed return track.tpcNSigmaPi() >= mMinTPCNsigmaPi && track.tpcNSigmaPi() <= mMaxTPCNsigmaPi; case V0PhotonCuts::kDCAxy: - return abs(track.dcaXY()) <= ((mMaxDcaXYPtDep) ? mMaxDcaXYPtDep(track.pt()) : mMaxDcaXY); + return std::fabs(track.dcaXY()) <= ((mMaxDcaXYPtDep) ? mMaxDcaXYPtDep(track.pt()) : mMaxDcaXY); case V0PhotonCuts::kDCAz: - return abs(track.dcaZ()) <= mMaxDcaZ; + return std::fabs(track.dcaZ()) <= mMaxDcaZ; case V0PhotonCuts::kITSNCls: return mMinNClustersITS <= track.itsNCls() && track.itsNCls() <= mMaxNClustersITS; @@ -397,13 +397,13 @@ class V0PhotonCut : public TNamed // if (abs(track.y()) > abs(track.x() * TMath::Tan(10.f * TMath::DegToRad())) + 15.f) { // return false; // } - if (track.x() < 0.1 && abs(track.y()) > 15.f) { + if (track.x() < 0.1 && std::fabs(track.y()) > 15.f) { return false; } - if (track.x() > 82.9 && abs(track.y()) > abs(track.x() * std::tan(10.f * TMath::DegToRad())) + 5.f) { + if (track.x() > 82.9 && std::fabs(track.y()) > std::fabs(track.x() * std::tan(10.f * TMath::DegToRad())) + 5.f) { return false; } - if (track.x() > 82.9 && abs(track.y()) < 15.0 && abs(abs(track.z()) - 44.5) < 2.5) { + if (track.x() > 82.9 && std::fabs(track.y()) < 15.0 && abs(abs(track.z()) - 44.5) < 2.5) { return false; } return true; diff --git a/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx b/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx index b667eadb549..9060bc9c9c2 100644 --- a/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx +++ b/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx @@ -156,7 +156,7 @@ struct PhotonConversionBuilder { {"V0/hCosPARZ_Rxy", "cosine of pointing angle;r_{xy} (cm);cosine of pointing angle", {HistType::kTH2F, {{200, 0, 100}, {100, 0.99f, 1.f}}}}, {"V0/hPCA", "distance between 2 legs at SV;PCA (cm)", {HistType::kTH1F, {{500, 0.0f, 5.f}}}}, {"V0/hPCA_Rxy", "distance between 2 legs at SV;R_{xy} (cm);PCA (cm)", {HistType::kTH2F, {{200, 0, 100}, {500, 0.0f, 5.f}}}}, - {"V0/hPCA_CosPA", "distance between 2 legs at SV vs. cosPA;cosine of pointing angle;PCA (cm)", {HistType::kTH2F, {{100, 0.9, 1}, {500, 0.0f, 5.f}}}}, + {"V0/hPCA_CosPA", "distance between 2 legs at SV vs. cosPA;cosine of pointing angle;PCA (cm)", {HistType::kTH2F, {{100, 0.99, 1}, {500, 0.0f, 5.f}}}}, {"V0/hDCAxyz", "DCA to PV;DCA_{xy} (cm);DCA_{z} (cm)", {HistType::kTH2F, {{200, -5.f, +5.f}, {200, -5.f, +5.f}}}}, {"V0/hMeeSV_Rxy", "mee at SV vs. R_{xy};R_{xy} (cm);m_{ee} at SV (GeV/c^{2})", {HistType::kTH2F, {{200, 0.0f, 100.f}, {100, 0, 0.1f}}}}, {"V0/hRxy_minX_ITSonly_ITSonly", "min trackiu X vs. R_{xy};trackiu X (cm);min trackiu X - R_{xy} (cm)", {HistType::kTH2F, {{100, 0.0f, 100.f}, {100, -50.0, 50.0f}}}}, @@ -218,7 +218,7 @@ struct PhotonConversionBuilder { if (d_bz_input > -990) { d_bz = d_bz_input; o2::parameters::GRPMagField grpmag; - if (fabs(d_bz) > 1e-5) { + if (std::fabs(d_bz) > 1e-5) { grpmag.setL3Current(30000.f / (d_bz / 5.0f)); } o2::base::Propagator::initFieldFromGRP(&grpmag); @@ -394,6 +394,7 @@ struct PhotonConversionBuilder { const auto& pos = v0.template posTrack_as(); const auto& ele = v0.template negTrack_as(); const auto& collision = v0.template collision_as(); // collision where this v0 belongs to. + // LOGF(info, "v0.collisionId() = %d, pos.collisionId() = %d, ele.collisionId() = %d", v0.collisionId(), pos.collisionId(), ele.collisionId()); if (pos.sign() * ele.sign() > 0) { // reject same sign pair return; @@ -446,7 +447,7 @@ struct PhotonConversionBuilder { auto eledcaXY = dcaInfo[0]; auto eledcaZ = dcaInfo[1]; - if (fabs(posdcaXY) < dcapostopv || fabs(eledcaXY) < dcanegtopv) { + if (std::fabs(posdcaXY) < dcapostopv || std::fabs(eledcaXY) < dcanegtopv) { return; } @@ -456,7 +457,7 @@ struct PhotonConversionBuilder { if (rxy_tmp > maxX + margin_r_tpc) { return; } - if (rxy_tmp < fabs(xyz[2]) * std::tan(2 * std::atan(std::exp(-max_eta_v0))) - margin_z) { + if (rxy_tmp < std::fabs(xyz[2]) * std::tan(2 * std::atan(std::exp(-max_eta_v0))) - margin_z) { return; // RZ line cut } @@ -494,7 +495,7 @@ struct PhotonConversionBuilder { if (rxy > maxX + margin_r_tpc) { return; } - if (rxy < fabs(gammaKF_DecayVtx.GetZ()) * std::tan(2 * std::atan(std::exp(-max_eta_v0))) - margin_z) { + if (rxy < std::fabs(gammaKF_DecayVtx.GetZ()) * std::tan(2 * std::atan(std::exp(-max_eta_v0))) - margin_z) { return; // RZ line cut } if (rxy < min_v0radius) { @@ -557,7 +558,7 @@ struct PhotonConversionBuilder { // LOGF(info, "gammaKF_PV.GetPy() = %f, gammaKF_DecayVtx.GetPy() = %f, gammaKF_DecayVtx2.GetPy() = %f", gammaKF_PV.GetPy(), gammaKF_DecayVtx.GetPy(), gammaKF_DecayVtx2.GetPy()); // LOGF(info, "gammaKF_PV.GetPz() = %f, gammaKF_DecayVtx.GetPz() = %f, gammaKF_DecayVtx2.GetPz() = %f", gammaKF_PV.GetPz(), gammaKF_DecayVtx.GetPz(), gammaKF_DecayVtx2.GetPz()); - if (fabs(v0eta) > max_eta_v0 || v0pt < min_pt_v0) { + if (std::fabs(v0eta) > max_eta_v0 || v0pt < min_pt_v0) { return; } @@ -615,7 +616,7 @@ struct PhotonConversionBuilder { float dca_z_v0_to_pv = (gammaKF_DecayVtx.GetZ() - gammaKF_DecayVtx.GetPz() * cospa_kf * length / v0mom) - collision.posZ(); float sign_tmp = dca_x_v0_to_pv * dca_y_v0_to_pv > 0 ? +1.f : -1.f; float dca_xy_v0_to_pv = RecoDecay::sqrtSumOfSquares(dca_x_v0_to_pv, dca_y_v0_to_pv) * sign_tmp; - if (abs(dca_xy_v0_to_pv) > max_dcatopv_xy_v0 || abs(dca_z_v0_to_pv) > max_dcatopv_z_v0) { + if (std::fabs(dca_xy_v0_to_pv) > max_dcatopv_xy_v0 || std::fabs(dca_z_v0_to_pv) > max_dcatopv_z_v0) { return; } @@ -714,7 +715,7 @@ struct PhotonConversionBuilder { nv0_map[collision.globalIndex()] = 0; - const auto& bc = collision.template bc_as(); + const auto& bc = collision.template foundBC_as(); initCCDB(bc); registry.fill(HIST("hCollisionCounter"), 1); From aaa2cff9a8a865e80f194f28d9d0baa0aabf1e30 Mon Sep 17 00:00:00 2001 From: Lucia Anna Tarasovicova Date: Wed, 5 Feb 2025 15:59:15 +0100 Subject: [PATCH 0052/1650] [PWGLF] Changes in derivedcascadeanalysis.cxx (#9767) Co-authored-by: Lucia Anna Tarasovicova --- .../Strangeness/derivedcascadeanalysis.cxx | 46 ++++++++++++++----- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/derivedcascadeanalysis.cxx b/PWGLF/Tasks/Strangeness/derivedcascadeanalysis.cxx index d71405ff547..71657889da5 100644 --- a/PWGLF/Tasks/Strangeness/derivedcascadeanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/derivedcascadeanalysis.cxx @@ -117,6 +117,9 @@ struct Derivedcascadeanalysis { Configurable doNoCollInRofStandardCut{"doNoCollInRofStandardCut", true, "Enable an evevnt selection which rejects a collision if there are other events within the same ITS ROF with mult above threshold"}; Configurable doMultiplicityCorrCut{"doMultiplicityCorrCut", false, "Enable multiplicity vs centrality correlation cut"}; Configurable doInel0{"doInel0", true, "Enable INEL > 0 selection"}; + Configurable doITSallLayersCut{"doITSallLayersCut", false, "Enable event selection which rejects collisions when ITS was rebooting."}; + Configurable doInel0MCGen{"doInel0MCGen", true, "Enable INEL > 0 selection for MC gen events"}; + Configurable applyZVtxSelOnMCPV{"applyZVtxSelOnMCPV", false, "Enable z vertex cut selection on generated events"}; Configurable zVertexCut{"zVertexCut", 10, "Cut on PV position"}; } eventSelectionFlags; @@ -342,7 +345,7 @@ struct Derivedcascadeanalysis { } if (doprocessCascadesMCforEff) { - histos.add("hGenEvents", "", HistType::kTH2F, {{axisNch}, {2, 0, 2}}); + histos.add("hGenEvents", "", HistType::kTH2F, {{axisNch}, {4, 0, 4}}); histos.add("hCentralityVsMultMC", "", kTH2F, {{101, 0.0f, 101.0f}, axisNch}); histos.add("hRecMultVsMultMC", "", kTH2F, {axisNch, axisNch}); histos.add("hGenMultMCFT0C", "", kTH1F, {{500, 0, 5000}}); @@ -381,10 +384,10 @@ struct Derivedcascadeanalysis { histos.add("h2dGenOmegaMinusVsNchVsOccupancy", "h2dGenOmegaMinusVsNchVsOccupancy", kTH3D, {axisPt, axisNch, axisOccupancy}); histos.add("h2dGenOmegaPlusVsNchVsOccupancy", "h2dGenOmegaPlusVsNchVsOccupancy", kTH3D, {axisPt, axisNch, axisOccupancy}); - histos.add("h2dGenXiMinusVsMultMC", "h2dGenXiMinusVsMultMC", kTH2D, {axisNch, axisPt}); - histos.add("h2dGenXiPlusVsMultMC", "h2dGenXiPlusVsMultMC", kTH2D, {axisNch, axisPt}); - histos.add("h2dGenOmegaMinusVsMultMC", "h2dGenOmegaMinusVsMultMC", kTH2D, {axisNch, axisPt}); - histos.add("h2dGenOmegaPlusVsMultMC", "h2dGenOmegaPlusVsMultMC", kTH2D, {axisNch, axisPt}); + histos.add("h2dGenXiMinusVsMultMCVsCentrality", "h2dGenXiMinusVsMultMCVsCentrality", kTH3D, {axisNch, {101, 0.0f, 101.0f}, axisPt}); + histos.add("h2dGenXiPlusVsMultMCVsCentrality", "h2dGenXiPlusVsMultMCVsCentrality", kTH3D, {axisNch, {101, 0.0f, 101.0f}, axisPt}); + histos.add("h2dGenOmegaMinusVsMultMCVsCentrality", "h2dGenOmegaMinusVsMultMCVsCentrality", kTH3D, {axisNch, {101, 0.0f, 101.0f}, axisPt}); + histos.add("h2dGenOmegaPlusVsMultMCVsCentrality", "h2dGenOmegaPlusVsMultMCVsCentrality", kTH3D, {axisNch, {101, 0.0f, 101.0f}, axisPt}); } } template @@ -556,8 +559,11 @@ struct Derivedcascadeanalysis { if (fillHists) histos.fill(HIST("hEventSelection"), 18.5 /*rejects a collision if there are other events within the same ITS ROF above mult threshold*/); + if (eventSelectionFlags.doITSallLayersCut && !coll.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + return false; + } if (fillHists) - histos.fill(HIST("hEventSelection"), 19.5 /*currently no cut applied*/); + histos.fill(HIST("hEventSelection"), 19.5 /*rejects collisions if ITS was in rebooting stage*/); float occupancyFT0 = coll.ft0cOccupancyInTimeRange(); if (minOccupancyFT0 > 0 && occupancyFT0 < minOccupancyFT0) { @@ -1385,6 +1391,14 @@ struct Derivedcascadeanalysis { continue; auto mcCollision = cascMC.straMCCollision_as>(); + if (eventSelectionFlags.applyZVtxSelOnMCPV && std::abs(mcCollision.posZ()) > eventSelectionFlags.zVertexCut) { + continue; + } + + if (eventSelectionFlags.doInel0MCGen && mcCollision.multMCNParticlesEta10() < 1) { + continue; + } + float centrality = 100.5f; float occupancy = 49000; float nChEta05 = -1; @@ -1411,14 +1425,14 @@ struct Derivedcascadeanalysis { histos.fill(HIST("h2dGenXiMinusEtaPosDaughter"), RecoDecay::eta(std::array{cascMC.pxPosMC(), cascMC.pyPosMC(), cascMC.pzPosMC()})); histos.fill(HIST("h2dGenXiMinusEtaNegDaughter"), RecoDecay::eta(std::array{cascMC.pxNegMC(), cascMC.pyNegMC(), cascMC.pzNegMC()})); histos.fill(HIST("h2dGenXiMinusEtaBach"), RecoDecay::eta(std::array{cascMC.pxBachMC(), cascMC.pyBachMC(), cascMC.pzBachMC()})); - histos.fill(HIST("h2dGenXiMinusVsMultMC"), mcCollision.multMCNParticlesEta05(), ptmc); + histos.fill(HIST("h2dGenXiMinusVsMultMCVsCentrality"), mcCollision.multMCNParticlesEta05(), centrality, ptmc); histos.fill(HIST("h2dGenXiMinusVsCentOccupancy"), ptmc, centrality, occupancy); histos.fill(HIST("h2dGenXiMinusVsNchVsOccupancy"), ptmc, nChEta05, occupancy); } if (cascMC.pdgCode() == -3312) { histos.fill(HIST("h2dGenXiPlus"), centrality, ptmc); histos.fill(HIST("h2dGenXiPlusVsNch"), nChEta05, ptmc); - histos.fill(HIST("h2dGenXiPlusVsMultMC"), mcCollision.multMCNParticlesEta05(), ptmc); + histos.fill(HIST("h2dGenXiPlusVsMultMCVsCentrality"), mcCollision.multMCNParticlesEta05(), centrality, ptmc); histos.fill(HIST("h2dGenXiPlusVsCentOccupancy"), ptmc, centrality, occupancy); histos.fill(HIST("h2dGenXiPlusVsNchVsOccupancy"), ptmc, nChEta05, occupancy); } @@ -1429,14 +1443,14 @@ struct Derivedcascadeanalysis { histos.fill(HIST("h2dGenOmegaMinusEtaPosDaughter"), RecoDecay::eta(std::array{cascMC.pxPosMC(), cascMC.pyPosMC(), cascMC.pzPosMC()})); histos.fill(HIST("h2dGenOmegaMinusEtaNegDaughter"), RecoDecay::eta(std::array{cascMC.pxNegMC(), cascMC.pyNegMC(), cascMC.pzNegMC()})); histos.fill(HIST("h2dGenOmegaMinusEtaBach"), RecoDecay::eta(std::array{cascMC.pxBachMC(), cascMC.pyBachMC(), cascMC.pzBachMC()})); - histos.fill(HIST("h2dGenOmegaMinusVsMultMC"), mcCollision.multMCNParticlesEta05(), ptmc); + histos.fill(HIST("h2dGenOmegaMinusVsMultMCVsCentrality"), mcCollision.multMCNParticlesEta05(), centrality, ptmc); histos.fill(HIST("h2dGenOmegaMinusVsCentOccupancy"), ptmc, centrality, occupancy); histos.fill(HIST("h2dGenOmegaMinusVsNchVsOccupancy"), ptmc, nChEta05, occupancy); } if (cascMC.pdgCode() == -3334) { histos.fill(HIST("h2dGenOmegaPlus"), centrality, ptmc); histos.fill(HIST("h2dGenOmegaPlusVsNch"), nChEta05, ptmc); - histos.fill(HIST("h2dGenOmegaPlusVsMultMC"), mcCollision.multMCNParticlesEta05(), ptmc); + histos.fill(HIST("h2dGenOmegaPlusVsMultMCVsCentrality"), mcCollision.multMCNParticlesEta05(), centrality, ptmc); histos.fill(HIST("h2dGenOmegaPlusVsCentOccupancy"), ptmc, centrality, occupancy); histos.fill(HIST("h2dGenOmegaPlusVsNchVsOccupancy"), ptmc, nChEta05, occupancy); } @@ -1451,6 +1465,16 @@ struct Derivedcascadeanalysis { for (auto const& mcCollision : mcCollisions) { histos.fill(HIST("hGenEvents"), mcCollision.multMCNParticlesEta05(), 0.5 /* all gen. events*/); + if (eventSelectionFlags.applyZVtxSelOnMCPV && std::abs(mcCollision.posZ()) > eventSelectionFlags.zVertexCut) { + continue; + } + histos.fill(HIST("hGenEvents"), mcCollision.multMCNParticlesEta05(), 1.5 /* gen. events with vertex cut*/); + + if (eventSelectionFlags.doInel0MCGen && mcCollision.multMCNParticlesEta10() < 1) { + continue; + } + histos.fill(HIST("hGenEvents"), mcCollision.multMCNParticlesEta05(), 2.5 /* gen. events with INEL>0t*/); + auto groupedCollisions = collisions.sliceBy(perMcCollision, mcCollision.globalIndex()); // Check if there is at least one of the reconstructed collisions associated to this MC collision // If so, we consider it @@ -1492,7 +1516,7 @@ struct Derivedcascadeanalysis { histos.fill(HIST("hGenMCNParticlesEta10"), mcCollision.multMCNParticlesEta10()); if (atLeastOne) { - histos.fill(HIST("hGenEvents"), mcCollision.multMCNParticlesEta05(), 1.5 /* at least 1 rec. event*/); + histos.fill(HIST("hGenEvents"), mcCollision.multMCNParticlesEta05(), 3.5 /* at least 1 rec. event*/); } } return listBestCollisionIdx; From 5c6d03aab8ef2c09388ca24294fd984ca9920e2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Wed, 5 Feb 2025 17:27:40 +0100 Subject: [PATCH 0053/1650] [PWGLF] MEK0s: add cent (#9770) --- PWGLF/Tasks/Strangeness/k0_mixed_events.cxx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx b/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx index 98d62b6bae1..88283cf650c 100644 --- a/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx +++ b/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx @@ -202,6 +202,7 @@ struct K0MixedEvents { registry.add("Trks", "Trks", kTH1D, {{2, 0.5, 2.5, "Tracks"}}); registry.add("VTXc", "VTXc", kTH1D, {{100, -20., 20., "vtx"}}); registry.add("VTX", "VTX", kTH1D, {{100, -20., 20., "vtx"}}); + registry.add("multPerc", "multPerc", kTH1D, {multPercentileAxis}); registry.add("SEcand", "SEcand", kTH1D, {{2, 0.5, 2.5}}); registry.add("SE", "SE", kTH1D, {invMassAxis}); registry.add("ME", "ME", kTH1D, {invMassAxis}); @@ -319,6 +320,7 @@ struct K0MixedEvents { for (auto collision : collisions) { LOG(debug) << "Collision index " << collision.globalIndex(); registry.fill(HIST("VTXc"), collision.posZ()); + registry.fill(HIST("multPerc"), collision.multPerc()); } for (auto track : tracks) { From 5b9e0580d06b13c376645c9bc49969923098ef96 Mon Sep 17 00:00:00 2001 From: Pritam Chakraborty <47203359+prchakra@users.noreply.github.com> Date: Wed, 5 Feb 2025 17:49:04 +0100 Subject: [PATCH 0054/1650] [PWGCF] FemtoUniverse: Adding kNoCollInTimeRangeStandard cut in event selection criteria (#9764) --- .../FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx index 3a9db16b336..ad2144873d0 100644 --- a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx +++ b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx @@ -913,7 +913,8 @@ struct FemtoUniverseProducerTask { col.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV) && col.selection_bit(aod::evsel::kIsGoodITSLayersAll) && col.selection_bit(aod::evsel::kNoCollInRofStandard) && - col.selection_bit(aod::evsel::kNoHighMultCollInPrevRof)) { + col.selection_bit(aod::evsel::kNoHighMultCollInPrevRof) && + col.selection_bit(aod::evsel::kNoCollInTimeRangeStandard)) { outputCollision(vtxZ, cent, multNtr, 2, mMagField); return true; } else { From 5a6f607b356c824be9e62631b6567f32257ad09c Mon Sep 17 00:00:00 2001 From: aimeric-landou <46970521+aimeric-landou@users.noreply.github.com> Date: Wed, 5 Feb 2025 18:27:50 +0100 Subject: [PATCH 0055/1650] [PWGJE] PWGJE - fix jetBackgroundAnalysis RC without 2 leading jets (#9773) From 9460d0ca84943eea0dce2cc0c9b003f4ddd6d9e4 Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Wed, 5 Feb 2025 18:56:48 +0100 Subject: [PATCH 0056/1650] [PWGLF] Rename `mDCA` to `motherDCA` for clarity (#9766) --- PWGLF/Tasks/Strangeness/nonPromptCascade.cxx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx index f501e909402..428b088166a 100644 --- a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx +++ b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx @@ -292,7 +292,7 @@ struct NonPromptCascadeTask { } template - void fillCascadeDCA(T const track, PR const& protonTrack, PI const& pionTrack, o2::dataformats::VertexBase primaryVertex, bool isOmega, motherDCA& mDCA) + void fillCascadeDCA(T const track, PR const& protonTrack, PI const& pionTrack, o2::dataformats::VertexBase primaryVertex, bool isOmega, motherDCA& motherDCA) { const auto matCorr = static_cast(cfgMaterialCorrection.value); auto trackCovTrk = getTrackParCov(track); @@ -317,8 +317,8 @@ struct NonPromptCascadeTask { registry.fill(HIST("h_dcavsr_Xi"), impactParameterTrk.getY(), std::hypot(track.x(), track.y())); } } - mDCA.DCAxy = impactParameterTrk.getY(); - mDCA.DCAz = impactParameterTrk.getZ(); + motherDCA.DCAxy = impactParameterTrk.getY(); + motherDCA.DCAz = impactParameterTrk.getZ(); } template @@ -580,8 +580,8 @@ struct NonPromptCascadeTask { invMassACV0->Fill(v0mass); registry.fill(HIST("h_massvspt_V0"), v0mass, track.pt()); - motherDCA mDCA; - fillCascadeDCA(track, protonTrack, pionTrack, primaryVertex, isOmega, mDCA); + motherDCA motherDCA; + fillCascadeDCA(track, protonTrack, pionTrack, primaryVertex, isOmega, motherDCA); daughtersDCA dDCA; fillDauDCA(trackedCascade, bachelor, protonTrack, pionTrack, primaryVertex, isOmega, dDCA); @@ -589,7 +589,7 @@ struct NonPromptCascadeTask { collision.numContrib(), collision.collisionTimeRes(), primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ(), track.pt(), track.eta(), track.phi(), protonTrack.pt(), protonTrack.eta(), pionTrack.pt(), pionTrack.eta(), bachelor.pt(), bachelor.eta(), - mDCA.DCAxy, mDCA.DCAz, dDCA.protonDCAxy, dDCA.protonDCAz, dDCA.pionDCAxy, dDCA.pionDCAz, dDCA.bachDCAxy, dDCA.bachDCAz, + motherDCA.DCAxy, motherDCA.DCAz, dDCA.protonDCAxy, dDCA.protonDCAz, dDCA.pionDCAxy, dDCA.pionDCAz, dDCA.bachDCAxy, dDCA.bachDCAz, cascCpa, v0Cpa, massXi, massOmega, v0mass, std::hypot(trackedCascade.decayX(), trackedCascade.decayY()), std::hypot(v0Pos[0], v0Pos[1]), std::hypot(trackedCascade.decayX(), trackedCascade.decayY(), trackedCascade.decayZ()), std::hypot(v0Pos[0], v0Pos[1], v0Pos[2]), From 264bdb9b272b9e4338365f8a7d26a518a44df052 Mon Sep 17 00:00:00 2001 From: nzardosh Date: Wed, 5 Feb 2025 22:18:51 +0100 Subject: [PATCH 0057/1650] [PWGJE] Adding missing event selection bit to sel8FullPbPb (#9771) --- PWGJE/Core/JetDerivedDataUtilities.h | 1 + 1 file changed, 1 insertion(+) diff --git a/PWGJE/Core/JetDerivedDataUtilities.h b/PWGJE/Core/JetDerivedDataUtilities.h index 5462d9623f8..c2c74bb1def 100644 --- a/PWGJE/Core/JetDerivedDataUtilities.h +++ b/PWGJE/Core/JetDerivedDataUtilities.h @@ -115,6 +115,7 @@ std::vector initialiseEventSelectionBits(std::string eventSelectionMasks) eventSelectionMaskBits.push_back(JCollisionSel::selNoSameBunchPileup); } if (eventSelectionMasksContainSelection(eventSelectionMasks, "sel8FullPbPb")) { + eventSelectionMaskBits.push_back(JCollisionSel::sel8); eventSelectionMaskBits.push_back(JCollisionSel::selNoCollInTimeRangeStandard); eventSelectionMaskBits.push_back(JCollisionSel::selNoCollInRofStandard); } From 09fb7a866467bd25ed0bd0b2d381c2d1cd4a254d Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Thu, 6 Feb 2025 05:50:59 +0800 Subject: [PATCH 0058/1650] [PWGCF] calculate v2 correction factor from MC (#9742) --- PWGCF/Flow/Tasks/CMakeLists.txt | 7 +- PWGCF/Flow/Tasks/flowMc.cxx | 323 ++++++++++++++++++++++++++ PWGCF/Flow/Tasks/flowPtEfficiency.cxx | 295 ++++++++++++++++++++++- 3 files changed, 623 insertions(+), 2 deletions(-) create mode 100644 PWGCF/Flow/Tasks/flowMc.cxx diff --git a/PWGCF/Flow/Tasks/CMakeLists.txt b/PWGCF/Flow/Tasks/CMakeLists.txt index 98daea3d4d5..d7bc12308eb 100644 --- a/PWGCF/Flow/Tasks/CMakeLists.txt +++ b/PWGCF/Flow/Tasks/CMakeLists.txt @@ -11,7 +11,7 @@ o2physics_add_dpl_workflow(flow-pt-efficiency SOURCES flowPtEfficiency.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::GFWCore COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(flow-task @@ -24,6 +24,11 @@ o2physics_add_dpl_workflow(flow-runby-run PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::AnalysisCCDB O2Physics::GFWCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(flow-mc + SOURCES flowMc.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::GFWCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(flow-gfw-task SOURCES flowGfwTask.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::GFWCore diff --git a/PWGCF/Flow/Tasks/flowMc.cxx b/PWGCF/Flow/Tasks/flowMc.cxx new file mode 100644 index 00000000000..18593cdd34b --- /dev/null +++ b/PWGCF/Flow/Tasks/flowMc.cxx @@ -0,0 +1,323 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file flowMc.cxx +/// \author Zhiyong Lu (zhiyong.lu@cern.ch) +/// \since Feb/5/2025 +/// \brief QC of synthetic flow exercise + +#include +#include +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/runDataProcessing.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/RunningWorkflowInfo.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/Core/TrackSelection.h" +#include "Common/Core/TrackSelectionDefaults.h" +#include "Common/Core/trackUtilities.h" +#include "ReconstructionDataFormats/Track.h" +#include "DataFormatsParameters/GRPObject.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" +#include "PWGMM/Mult/DataModel/Index.h" // for Particles2Tracks table +#include "GFWPowerArray.h" +#include "GFW.h" +#include "GFWCumulant.h" +#include "GFWWeights.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +#define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable NAME{#NAME, DEFAULT, HELP}; + +struct FlowMc { + HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + + Configurable minB{"minB", 0.0f, "min impact parameter"}; + Configurable maxB{"maxB", 20.0f, "max impact parameter"}; + O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeights, bool, false, "Fill and output NUA weights") + O2_DEFINE_CONFIGURABLE(cfgCutPtRefMin, float, 0.2f, "Minimal pT for ref tracks") + O2_DEFINE_CONFIGURABLE(cfgCutPtRefMax, float, 3.0f, "Maximal pT for ref tracks") + O2_DEFINE_CONFIGURABLE(cfgFlowAcceptance, std::string, "", "CCDB path to acceptance object") + O2_DEFINE_CONFIGURABLE(cfgFlowEfficiency, std::string, "", "CCDB path to efficiency object") + + ConfigurableAxis axisB{"axisB", {100, 0.0f, 20.0f}, ""}; + ConfigurableAxis axisPhi{"axisPhi", {100, 0.0f, constants::math::TwoPI}, ""}; + ConfigurableAxis axisNch{"axisNch", {300, 0.0f, 3000.0f}, "Nch in |eta|<0.8"}; + + ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.2f, 2.4f, 2.6f, 2.8f, 3.0f, 3.2f, 3.4f, 3.6f, 3.8f, 4.0f, 4.4f, 4.8f, 5.2f, 5.6f, 6.0f, 6.5f, 7.0f, 7.5f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f}, "pt axis"}; + + // Corrections + TH1D* mEfficiency = nullptr; + GFWWeights* mAcceptance = nullptr; + bool correctionsLoaded = false; + + // Connect to ccdb + Service ccdb; + Configurable ccdbNoLaterThan{"ccdbNoLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + + OutputObj fWeights{GFWWeights("weights")}; + + void init(InitContext&) + { + // pT histograms + histos.add("hImpactParameter", "hImpactParameter", HistType::kTH1D, {axisB}); + histos.add("hNchVsImpactParameter", "hNchVsImpactParameter", HistType::kTH2D, {axisB, axisNch}); + histos.add("hEventPlaneAngle", "hEventPlaneAngle", HistType::kTH1D, {axisPhi}); + histos.add("hPtVsPhiGenerated", "hPtVsPhiGenerated", HistType::kTH2D, {axisPhi, axisPt}); + histos.add("hPtVsPhiGlobal", "hPtVsPhiGlobal", HistType::kTH2D, {axisPhi, axisPt}); + histos.add("hBVsPtVsPhiGenerated", "hBVsPtVsPhiGenerated", HistType::kTH3D, {axisB, axisPhi, axisPt}); + histos.add("hBVsPtVsPhiGlobal", "hBVsPtVsPhiGlobal", HistType::kTH3D, {axisB, axisPhi, axisPt}); + histos.add("hBVsPtVsPhiAny", "hBVsPtVsPhiAny", HistType::kTH3D, {axisB, axisPhi, axisPt}); + histos.add("hBVsPtVsPhiTPCTrack", "hBVsPtVsPhiTPCTrack", HistType::kTH3D, {axisB, axisPhi, axisPt}); + histos.add("hBVsPtVsPhiITSTrack", "hBVsPtVsPhiITSTrack", HistType::kTH3D, {axisB, axisPhi, axisPt}); + histos.add("hBVsPtVsPhiITSABTrack", "hBVsPtVsPhiITSABTrack", HistType::kTH3D, {axisB, axisPhi, axisPt}); + + histos.add("hBVsPtVsPhiGeneratedK0Short", "hBVsPtVsPhiGeneratedK0Short", HistType::kTH3D, {axisB, axisPhi, axisPt}); + histos.add("hBVsPtVsPhiGlobalK0Short", "hBVsPtVsPhiGlobalK0Short", HistType::kTH3D, {axisB, axisPhi, axisPt}); + histos.add("hBVsPtVsPhiGeneratedLambda", "hBVsPtVsPhiGeneratedLambda", HistType::kTH3D, {axisB, axisPhi, axisPt}); + histos.add("hBVsPtVsPhiGlobalLambda", "hBVsPtVsPhiGlobalLambda", HistType::kTH3D, {axisB, axisPhi, axisPt}); + + histos.add("hBVsPtVsPhiGeneratedXi", "hBVsPtVsPhiGeneratedXi", HistType::kTH3D, {axisB, axisPhi, axisPt}); + histos.add("hBVsPtVsPhiGlobalXi", "hBVsPtVsPhiGlobalXi", HistType::kTH3D, {axisB, axisPhi, axisPt}); + histos.add("hBVsPtVsPhiGeneratedOmega", "hBVsPtVsPhiGeneratedOmega", HistType::kTH3D, {axisB, axisPhi, axisPt}); + histos.add("hBVsPtVsPhiGlobalOmega", "hBVsPtVsPhiGlobalOmega", HistType::kTH3D, {axisB, axisPhi, axisPt}); + + histos.add("hPhi", "#phi distribution", HistType::kTH1D, {axisPhi}); + histos.add("hPhiWeighted", "corrected #phi distribution", HistType::kTH1D, {axisPhi}); + + if (cfgOutputNUAWeights) { + o2::framework::AxisSpec axis = axisPt; + int nPtBins = axis.binEdges.size() - 1; + double* ptBins = &(axis.binEdges)[0]; + + fWeights->setPtBins(nPtBins, ptBins); + fWeights->init(true, false); + } + } + + void loadCorrections(uint64_t timestamp) + { + if (correctionsLoaded) + return; + if (cfgFlowAcceptance.value.empty() == false) { + mAcceptance = ccdb->getForTimeStamp(cfgFlowAcceptance, timestamp); + if (mAcceptance) + LOGF(info, "Loaded acceptance weights from %s (%p)", cfgFlowAcceptance.value.c_str(), (void*)mAcceptance); + else + LOGF(warning, "Could not load acceptance weights from %s (%p)", cfgFlowAcceptance.value.c_str(), (void*)mAcceptance); + } + if (cfgFlowEfficiency.value.empty() == false) { + mEfficiency = ccdb->getForTimeStamp(cfgFlowEfficiency, timestamp); + if (mEfficiency == nullptr) { + LOGF(fatal, "Could not load efficiency histogram for trigger particles from %s", cfgFlowEfficiency.value.c_str()); + } + LOGF(info, "Loaded efficiency histogram from %s (%p)", cfgFlowEfficiency.value.c_str(), (void*)mEfficiency); + } + correctionsLoaded = true; + } + + bool setCurrentParticleWeights(float& weight_nue, float& weight_nua, float phi, float eta, float pt, float vtxz) + { + float eff = 1.; + if (mEfficiency) + eff = mEfficiency->GetBinContent(mEfficiency->FindBin(pt)); + else + eff = 1.0; + if (eff == 0) + return false; + weight_nue = 1. / eff; + if (mAcceptance) + weight_nua = mAcceptance->getNUA(phi, eta, vtxz); + else + weight_nua = 1; + return true; + } + + using RecoTracks = soa::Join; + + void process(aod::McCollision const& mcCollision, soa::Join const& mcParticles, RecoTracks const&) + { + + float imp = mcCollision.impactParameter(); + float evPhi = mcCollision.eventPlaneAngle(); + float vtxz = mcCollision.posZ(); + if (evPhi < 0) + evPhi += constants::math::TwoPI; + + int64_t nCh = 0; + float weff = 1.; + float wacc = 1.; + auto bc = mcCollision.bc_as(); + loadCorrections(bc.timestamp()); + + if (imp > minB && imp < maxB) { + // event within range + histos.fill(HIST("hImpactParameter"), imp); + histos.fill(HIST("hEventPlaneAngle"), evPhi); + + for (auto const& mcParticle : mcParticles) { + // focus on bulk: e, mu, pi, k, p + int pdgCode = std::abs(mcParticle.pdgCode()); + if (pdgCode != 11 && pdgCode != 13 && pdgCode != 211 && pdgCode != 321 && pdgCode != 2212) + continue; + + if (!mcParticle.isPhysicalPrimary()) + continue; + if (std::fabs(mcParticle.eta()) > 0.8) // main acceptance + continue; + + float deltaPhi = mcParticle.phi() - mcCollision.eventPlaneAngle(); + if (deltaPhi < 0) + deltaPhi += constants::math::TwoPI; + if (deltaPhi > constants::math::TwoPI) + deltaPhi -= constants::math::TwoPI; + histos.fill(HIST("hPtVsPhiGenerated"), deltaPhi, mcParticle.pt()); + histos.fill(HIST("hBVsPtVsPhiGenerated"), imp, deltaPhi, mcParticle.pt()); + + nCh++; + + bool validGlobal = false; + bool validTrack = false; + bool validTPCTrack = false; + bool validITSTrack = false; + bool validITSABTrack = false; + if (mcParticle.has_tracks()) { + auto const& tracks = mcParticle.tracks_as(); + for (auto const& track : tracks) { + if (track.hasTPC() && track.hasITS()) { + validGlobal = true; + } + if (track.hasTPC() || track.hasITS()) { + validTrack = true; + } + if (track.hasTPC()) { + validTPCTrack = true; + } + if (track.hasITS() && track.itsChi2NCl() > -1e-6) { + validITSTrack = true; + } + if (track.hasITS() && track.itsChi2NCl() < -1e-6) { + validITSABTrack = true; + } + } + } + + bool withinPtRef = (cfgCutPtRefMin < mcParticle.pt()) && (mcParticle.pt() < cfgCutPtRefMax); // within RF pT range + if (cfgOutputNUAWeights && withinPtRef) + fWeights->fill(mcParticle.phi(), mcParticle.eta(), vtxz, mcParticle.pt(), 0, 0); + if (!setCurrentParticleWeights(weff, wacc, mcParticle.phi(), mcParticle.eta(), mcParticle.pt(), vtxz)) + continue; + if (withinPtRef) { + histos.fill(HIST("hPhi"), mcParticle.phi()); + histos.fill(HIST("hPhiWeighted"), mcParticle.phi(), wacc); + } + + // if valid global, fill + if (validGlobal) { + histos.fill(HIST("hPtVsPhiGlobal"), deltaPhi, mcParticle.pt(), wacc * weff); + histos.fill(HIST("hBVsPtVsPhiGlobal"), imp, deltaPhi, mcParticle.pt(), wacc * weff); + } + // if any track present, fill + if (validTrack) + histos.fill(HIST("hBVsPtVsPhiAny"), imp, deltaPhi, mcParticle.pt(), wacc * weff); + if (validTPCTrack) + histos.fill(HIST("hBVsPtVsPhiTPCTrack"), imp, deltaPhi, mcParticle.pt(), wacc * weff); + if (validITSTrack) + histos.fill(HIST("hBVsPtVsPhiITSTrack"), imp, deltaPhi, mcParticle.pt(), wacc * weff); + if (validITSABTrack) + histos.fill(HIST("hBVsPtVsPhiITSABTrack"), imp, deltaPhi, mcParticle.pt(), wacc * weff); + } + } + histos.fill(HIST("hNchVsImpactParameter"), imp, nCh); + } + + using LabeledCascades = soa::Join; + + void processCascade(aod::McParticle const& mcParticle, soa::SmallGroups const& cascades, RecoTracks const&, aod::McCollisions const&) + { + auto mcCollision = mcParticle.mcCollision(); + float imp = mcCollision.impactParameter(); + + int pdgCode = std::abs(mcParticle.pdgCode()); + if (pdgCode != 3312 && pdgCode != 3334) + return; + + if (!mcParticle.isPhysicalPrimary()) + return; + if (std::fabs(mcParticle.eta()) > 0.8) + return; + + float deltaPhi = mcParticle.phi() - mcCollision.eventPlaneAngle(); + if (deltaPhi < 0) + deltaPhi += constants::math::TwoPI; + if (deltaPhi > constants::math::TwoPI) + deltaPhi -= constants::math::TwoPI; + if (pdgCode == 3312) + histos.fill(HIST("hBVsPtVsPhiGeneratedXi"), imp, deltaPhi, mcParticle.pt()); + if (pdgCode == 3334) + histos.fill(HIST("hBVsPtVsPhiGeneratedOmega"), imp, deltaPhi, mcParticle.pt()); + + if (cascades.size() > 0) { + if (pdgCode == 3312) + histos.fill(HIST("hBVsPtVsPhiGlobalXi"), imp, deltaPhi, mcParticle.pt()); + if (pdgCode == 3334) + histos.fill(HIST("hBVsPtVsPhiGlobalOmega"), imp, deltaPhi, mcParticle.pt()); + } + } + PROCESS_SWITCH(FlowMc, processCascade, "Process cascades", true); + + using LabeledV0s = soa::Join; + + void processV0s(aod::McParticle const& mcParticle, soa::SmallGroups const& v0s, RecoTracks const&, aod::McCollisions const&) + { + auto mcCollision = mcParticle.mcCollision(); + float imp = mcCollision.impactParameter(); + + int pdgCode = std::abs(mcParticle.pdgCode()); + if (pdgCode != 310 && pdgCode != 3122) + return; + + if (!mcParticle.isPhysicalPrimary()) + return; + if (std::fabs(mcParticle.eta()) > 0.8) + return; + + float deltaPhi = mcParticle.phi() - mcCollision.eventPlaneAngle(); + if (deltaPhi < 0) + deltaPhi += constants::math::TwoPI; + if (deltaPhi > constants::math::TwoPI) + deltaPhi -= constants::math::TwoPI; + if (pdgCode == 310) + histos.fill(HIST("hBVsPtVsPhiGeneratedK0Short"), imp, deltaPhi, mcParticle.pt()); + if (pdgCode == 3122) + histos.fill(HIST("hBVsPtVsPhiGeneratedLambda"), imp, deltaPhi, mcParticle.pt()); + + if (v0s.size() > 0) { + if (pdgCode == 310) + histos.fill(HIST("hBVsPtVsPhiGlobalK0Short"), imp, deltaPhi, mcParticle.pt()); + if (pdgCode == 3122) + histos.fill(HIST("hBVsPtVsPhiGlobalLambda"), imp, deltaPhi, mcParticle.pt()); + } + } + PROCESS_SWITCH(FlowMc, processV0s, "Process V0s", true); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc)}; +} diff --git a/PWGCF/Flow/Tasks/flowPtEfficiency.cxx b/PWGCF/Flow/Tasks/flowPtEfficiency.cxx index fcd39a21dd0..4ed37f9b7a5 100644 --- a/PWGCF/Flow/Tasks/flowPtEfficiency.cxx +++ b/PWGCF/Flow/Tasks/flowPtEfficiency.cxx @@ -14,10 +14,13 @@ /// \since Jun/08/2023 /// \brief a task to calculate the pt efficiency +#include #include +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/ASoAHelpers.h" +#include "Framework/RunningWorkflowInfo.h" #include "Framework/HistogramRegistry.h" #include "Common/DataModel/EventSelection.h" @@ -25,6 +28,14 @@ #include "Common/Core/TrackSelectionDefaults.h" #include "Common/DataModel/TrackSelectionTables.h" +#include "GFWPowerArray.h" +#include "GFW.h" +#include "GFWCumulant.h" +#include "GFWWeights.h" +#include "FlowContainer.h" +#include +#include + using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; @@ -48,9 +59,22 @@ struct FlowPtEfficiency { O2_DEFINE_CONFIGURABLE(cfgCutDCAxyppPass3Enabled, bool, false, "switch of ppPass3 DCAxy pt dependent cut") O2_DEFINE_CONFIGURABLE(cfgCutDCAzPtDepEnabled, bool, false, "switch of DCAz pt dependent cut") O2_DEFINE_CONFIGURABLE(cfgSelRunNumberEnabled, bool, false, "switch of run number selection") + O2_DEFINE_CONFIGURABLE(cfgFlowEnabled, bool, false, "switch of calculating flow") + O2_DEFINE_CONFIGURABLE(cfgFlowNbootstrap, int, 30, "Number of subsamples") + O2_DEFINE_CONFIGURABLE(cfgFlowCutPtPOIMin, float, 0.2f, "Minimal pT for poi tracks") + O2_DEFINE_CONFIGURABLE(cfgFlowCutPtPOIMax, float, 10.0f, "Maximal pT for poi tracks") + O2_DEFINE_CONFIGURABLE(cfgFlowCutPtRefMin, float, 0.2f, "Minimal pT for ref tracks") + O2_DEFINE_CONFIGURABLE(cfgFlowCutPtRefMax, float, 3.0f, "Maximal pT for ref tracks") + O2_DEFINE_CONFIGURABLE(cfgCentVsIPTruth, std::string, "", "CCDB path to centrality vs IP truth") + O2_DEFINE_CONFIGURABLE(cfgCentVsIPReco, std::string, "", "CCDB path to centrality vs IP reco") + O2_DEFINE_CONFIGURABLE(cfgFlowAcceptance, std::string, "", "CCDB path to acceptance object") + O2_DEFINE_CONFIGURABLE(cfgFlowEfficiency, std::string, "", "CCDB path to efficiency object") Configurable> cfgRunNumberList{"cfgRunNumberList", std::vector{-1}, "runnumber list in consideration for analysis"}; - ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.2, 0.25, 0.30, 0.40, 0.45, 0.50, 0.55, 0.60, 0.65, 0.70, 0.75, 0.80, 0.85, 0.90, 0.95, 1.00, 1.10, 1.20, 1.30, 1.40, 1.50, 1.60, 1.70, 1.80, 1.90, 2.00, 2.20, 2.40, 2.60, 2.80, 3.00}, "pt axis for histograms"}; + ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.2, 2.4, 2.6, 2.8, 3, 3.5, 4, 5, 6, 8, 10}, "pt axis for histograms"}; + ConfigurableAxis axisCentrality{"axisCentrality", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90}, "X axis for histograms"}; + ConfigurableAxis axisPhi{"axisPhi", {100, 0.0f, constants::math::TwoPI}, ""}; + ConfigurableAxis axisB{"axisB", {100, 0.0f, 20.0f}, "b (fm)"}; // Filter the tracks Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls); @@ -71,8 +95,32 @@ struct FlowPtEfficiency { // Additional filters for tracks TrackSelection myTrackSel; + // Cent vs IP + TH1D* mCentVsIPTruth = nullptr; + bool centVsIPTruthLoaded = false; + TH1D* mCentVsIPReco = nullptr; + bool centVsIPRecoLoaded = false; + + // corrections + TH1D* mEfficiency = nullptr; + GFWWeights* mAcceptance = nullptr; + bool correctionsLoaded = false; + + // Connect to ccdb + Service ccdb; + Configurable ccdbNoLaterThan{"ccdbNoLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + // Define the output HistogramRegistry registry{"registry"}; + OutputObj fFCTrue{FlowContainer("FlowContainerTrue")}; + OutputObj fFCReco{FlowContainer("FlowContainerReco")}; + OutputObj fWeights{GFWWeights("weights")}; + GFW* fGFWTrue = new GFW(); + GFW* fGFWReco = new GFW(); + TAxis* fPtAxis; + std::vector corrconfigs; + TRandom3* fRndm = new TRandom3(0); bool isStable(int pdg) { @@ -99,6 +147,58 @@ struct FlowPtEfficiency { registry.add("mcEventCounter", "Monte Carlo Truth EventCounter", kTH1F, {axisCounter}); registry.add("hPtMCGen", "Monte Carlo Truth", {HistType::kTH1D, {axisPt}}); + if (cfgFlowEnabled) { + registry.add("hImpactParameterReco", "hImpactParameterReco", {HistType::kTH1D, {axisB}}); + registry.add("hImpactParameterTruth", "hImpactParameterTruth", {HistType::kTH1D, {axisB}}); + registry.add("hPhi", "#phi distribution", {HistType::kTH1D, {axisPhi}}); + registry.add("hPhiWeighted", "corrected #phi distribution", {HistType::kTH1D, {axisPhi}}); + + o2::framework::AxisSpec axis = axisPt; + int nPtBins = axis.binEdges.size() - 1; + double* ptBins = &(axis.binEdges)[0]; + fPtAxis = new TAxis(nPtBins, ptBins); + + fWeights->setPtBins(nPtBins, ptBins); + fWeights->init(true, false); + + TObjArray* oba = new TObjArray(); + oba->Add(new TNamed("ChFull22", "ChFull22")); + for (auto i = 0; i < fPtAxis->GetNbins(); i++) + oba->Add(new TNamed(Form("ChFull22_pt_%i", i + 1), "ChFull22_pTDiff")); + oba->Add(new TNamed("Ch10Gap22", "Ch10Gap22")); + for (auto i = 0; i < fPtAxis->GetNbins(); i++) + oba->Add(new TNamed(Form("Ch10Gap22_pt_%i", i + 1), "Ch10Gap22_pTDiff")); + fFCTrue->SetName("FlowContainerTrue"); + fFCTrue->SetXAxis(fPtAxis); + fFCTrue->Initialize(oba, axisCentrality, cfgFlowNbootstrap); + fFCReco->SetName("FlowContainerReco"); + fFCReco->SetXAxis(fPtAxis); + fFCReco->Initialize(oba, axisCentrality, cfgFlowNbootstrap); + delete oba; + + fGFWTrue->AddRegion("full", -0.8, 0.8, 1, 1); + fGFWTrue->AddRegion("refN10", -0.8, -0.5, 1, 1); + fGFWTrue->AddRegion("refP10", 0.5, 0.8, 1, 1); + fGFWTrue->AddRegion("poiN10", -0.8, -0.5, 1 + fPtAxis->GetNbins(), 2); + fGFWTrue->AddRegion("poifull", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 2); + fGFWTrue->AddRegion("olN10", -0.8, -0.5, 1, 4); + fGFWTrue->AddRegion("olfull", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 4); + corrconfigs.push_back(fGFWTrue->GetCorrelatorConfig("full {2 -2}", "ChFull22", kFALSE)); + corrconfigs.push_back(fGFWTrue->GetCorrelatorConfig("poifull full | olfull {2 -2}", "ChFull22", kTRUE)); + corrconfigs.push_back(fGFWTrue->GetCorrelatorConfig("refN10 {2} refP10 {-2}", "Ch10Gap22", kFALSE)); + corrconfigs.push_back(fGFWTrue->GetCorrelatorConfig("poiN10 refN10 | olN10 {2} refP10 {-2}", "Ch10Gap22", kTRUE)); + fGFWTrue->CreateRegions(); + + fGFWReco->AddRegion("full", -0.8, 0.8, 1, 1); + fGFWReco->AddRegion("refN10", -0.8, -0.5, 1, 1); + fGFWReco->AddRegion("refP10", 0.5, 0.8, 1, 1); + fGFWReco->AddRegion("poiN10", -0.8, -0.5, 1 + fPtAxis->GetNbins(), 2); + fGFWReco->AddRegion("poifull", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 2); + fGFWReco->AddRegion("olN10", -0.8, -0.5, 1, 4); + fGFWReco->AddRegion("olfull", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 4); + fGFWReco->CreateRegions(); + } + if (cfgTrkSelRun3ITSMatch) { myTrackSel = getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSall7Layers, TrackSelection::GlobalTrackRun3DCAxyCut::Default); } else { @@ -116,6 +216,125 @@ struct FlowPtEfficiency { myTrackSel.SetMaxDcaZ(cfgCutDCAz); } + template + void fillProfile(GFW* fGFW, const GFW::CorrConfig& corrconf, const ConstStr& tarName, const double& cent) + { + double dnx, val; + dnx = fGFW->Calculate(corrconf, 0, kTRUE).real(); + if (dnx == 0) + return; + if (!corrconf.pTDif) { + val = fGFW->Calculate(corrconf, 0, kFALSE).real() / dnx; + if (std::fabs(val) < 1) + registry.fill(tarName, cent, val, dnx); + return; + } + return; + } + + void fillFC(GFW* fGFW, bool isMCTruth, const GFW::CorrConfig& corrconf, const double& cent, const double& rndm) + { + double dnx, val; + dnx = fGFW->Calculate(corrconf, 0, kTRUE).real(); + if (dnx == 0) + return; + if (!corrconf.pTDif) { + val = fGFW->Calculate(corrconf, 0, kFALSE).real() / dnx; + if (std::fabs(val) < 1) { + if (isMCTruth) + fFCTrue->FillProfile(corrconf.Head.c_str(), cent, val, dnx, rndm); + else + fFCReco->FillProfile(corrconf.Head.c_str(), cent, val, dnx, rndm); + } + return; + } + for (auto i = 1; i <= fPtAxis->GetNbins(); i++) { + dnx = fGFW->Calculate(corrconf, i - 1, kTRUE).real(); + if (dnx == 0) + continue; + val = fGFW->Calculate(corrconf, i - 1, kFALSE).real() / dnx; + if (std::fabs(val) < 1) { + if (isMCTruth) + fFCTrue->FillProfile(Form("%s_pt_%i", corrconf.Head.c_str(), i), cent, val, dnx, rndm); + else + fFCReco->FillProfile(Form("%s_pt_%i", corrconf.Head.c_str(), i), cent, val, dnx, rndm); + } + } + return; + } + + void loadCentVsIPTruth(uint64_t timestamp) + { + if (centVsIPTruthLoaded) + return; + if (cfgCentVsIPTruth.value.empty() == false) { + mCentVsIPTruth = ccdb->getForTimeStamp(cfgCentVsIPTruth, timestamp); + if (mCentVsIPTruth) + LOGF(info, "Loaded CentVsIPTruth weights from %s (%p)", cfgCentVsIPTruth.value.c_str(), (void*)mCentVsIPTruth); + else + LOGF(fatal, "Failed to load CentVsIPTruth weights from %s", cfgCentVsIPTruth.value.c_str()); + + centVsIPTruthLoaded = true; + } else { + LOGF(fatal, "when calculate flow, Cent Vs IP distribution must be provided"); + } + } + + void loadCentVsIPReco(uint64_t timestamp) + { + if (centVsIPRecoLoaded) + return; + if (cfgCentVsIPReco.value.empty() == false) { + mCentVsIPReco = ccdb->getForTimeStamp(cfgCentVsIPReco, timestamp); + if (mCentVsIPReco) + LOGF(info, "Loaded CentVsIPReco weights from %s (%p)", cfgCentVsIPReco.value.c_str(), (void*)mCentVsIPReco); + else + LOGF(fatal, "Failed to load CentVsIPReco weights from %s", cfgCentVsIPReco.value.c_str()); + + centVsIPRecoLoaded = true; + } else { + LOGF(fatal, "when calculate flow, Cent Vs IP distribution must be provided"); + } + } + + void loadCorrections(uint64_t timestamp) + { + if (correctionsLoaded) + return; + if (cfgFlowAcceptance.value.empty() == false) { + mAcceptance = ccdb->getForTimeStamp(cfgFlowAcceptance, timestamp); + if (mAcceptance) + LOGF(info, "Loaded acceptance weights from %s (%p)", cfgFlowAcceptance.value.c_str(), (void*)mAcceptance); + else + LOGF(warning, "Could not load acceptance weights from %s (%p)", cfgFlowAcceptance.value.c_str(), (void*)mAcceptance); + } + if (cfgFlowEfficiency.value.empty() == false) { + mEfficiency = ccdb->getForTimeStamp(cfgFlowEfficiency, timestamp); + if (mEfficiency == nullptr) { + LOGF(fatal, "Could not load efficiency histogram for trigger particles from %s", cfgFlowEfficiency.value.c_str()); + } + LOGF(info, "Loaded efficiency histogram from %s (%p)", cfgFlowEfficiency.value.c_str(), (void*)mEfficiency); + } + correctionsLoaded = true; + } + + bool setCurrentParticleWeights(float& weight_nue, float& weight_nua, float phi, float eta, float pt, float vtxz) + { + float eff = 1.; + if (mEfficiency) + eff = mEfficiency->GetBinContent(mEfficiency->FindBin(pt)); + else + eff = 1.0; + if (eff == 0) + return false; + weight_nue = 1. / eff; + if (mAcceptance) + weight_nua = mAcceptance->getNUA(phi, eta, vtxz); + else + weight_nua = 1; + return true; + } + template bool trackSelected(TTrack track) { @@ -139,16 +358,61 @@ struct FlowPtEfficiency { if (!std::count(cfgRunNumberList.value.begin(), cfgRunNumberList.value.end(), runNumber)) return; } + + float imp; + bool impFetched = false; + float centrality = 0.; + float lRandom = fRndm->Rndm(); + float vtxz = collision.posZ(); + float wacc = 1.0f; + float weff = 1.0f; + if (cfgFlowEnabled) { + loadCentVsIPReco(bc.timestamp()); + loadCorrections(bc.timestamp()); + } + for (const auto& track : tracks) { if (!trackSelected(track)) continue; if (track.has_mcParticle()) { auto mcParticle = track.mcParticle(); + if (cfgFlowEnabled && !impFetched) { + auto mcCollision = mcParticle.mcCollision(); + imp = mcCollision.impactParameter(); + registry.fill(HIST("hImpactParameterReco"), imp); + centrality = mCentVsIPReco->GetBinContent(mCentVsIPReco->GetXaxis()->FindBin(imp)); + impFetched = true; + } if (isStable(mcParticle.pdgCode())) { registry.fill(HIST("hPtMCRec"), track.pt()); + + if (cfgFlowEnabled) { + bool withinPtPOI = (cfgFlowCutPtPOIMin < track.pt()) && (track.pt() < cfgFlowCutPtPOIMax); // within POI pT range + bool withinPtRef = (cfgFlowCutPtRefMin < track.pt()) && (track.pt() < cfgFlowCutPtRefMax); // within RF pT range + if (withinPtRef) + fWeights->fill(track.phi(), track.eta(), vtxz, track.pt(), centrality, 0); + if (!setCurrentParticleWeights(weff, wacc, track.phi(), track.eta(), track.pt(), vtxz)) + continue; + if (withinPtRef) { + registry.fill(HIST("hPhi"), track.phi()); + registry.fill(HIST("hPhiWeighted"), track.phi(), wacc); + } + if (withinPtRef) + fGFWReco->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), wacc * weff, 1); + if (withinPtPOI) + fGFWReco->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), wacc * weff, 2); + if (withinPtPOI && withinPtRef) + fGFWReco->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), wacc * weff, 4); + } } } } + if (cfgFlowEnabled) { + // Filling Flow Container + for (uint l_ind = 0; l_ind < corrconfigs.size(); l_ind++) { + fillFC(fGFWReco, false, corrconfigs.at(l_ind), centrality, lRandom); + } + } } PROCESS_SWITCH(FlowPtEfficiency, processReco, "process reconstructed information", true); @@ -160,11 +424,40 @@ struct FlowPtEfficiency { if (!std::count(cfgRunNumberList.value.begin(), cfgRunNumberList.value.end(), runNumber)) return; } + + float imp = collision.impactParameter(); + float centrality = 0.; + if (cfgFlowEnabled) { + registry.fill(HIST("hImpactParameterTruth"), imp); + auto bc = collision.bc_as(); + loadCentVsIPTruth(bc.timestamp()); + centrality = mCentVsIPTruth->GetBinContent(mCentVsIPTruth->GetXaxis()->FindBin(imp)); + } + float lRandom = fRndm->Rndm(); + float wacc = 1.0f; + float weff = 1.0f; + if (collisions.size() > -1) { registry.fill(HIST("mcEventCounter"), 0.5); for (const auto& mcParticle : mcParticles) { if (mcParticle.isPhysicalPrimary() && isStable(mcParticle.pdgCode())) { registry.fill(HIST("hPtMCGen"), mcParticle.pt()); + if (cfgFlowEnabled) { + bool withinPtPOI = (cfgFlowCutPtPOIMin < mcParticle.pt()) && (mcParticle.pt() < cfgFlowCutPtPOIMax); // within POI pT range + bool withinPtRef = (cfgFlowCutPtRefMin < mcParticle.pt()) && (mcParticle.pt() < cfgFlowCutPtRefMax); // within RF pT range + if (withinPtRef) + fGFWTrue->Fill(mcParticle.eta(), fPtAxis->FindBin(mcParticle.pt()) - 1, mcParticle.phi(), wacc * weff, 1); + if (withinPtPOI) + fGFWTrue->Fill(mcParticle.eta(), fPtAxis->FindBin(mcParticle.pt()) - 1, mcParticle.phi(), wacc * weff, 2); + if (withinPtPOI && withinPtRef) + fGFWTrue->Fill(mcParticle.eta(), fPtAxis->FindBin(mcParticle.pt()) - 1, mcParticle.phi(), wacc * weff, 4); + } + } + } + if (cfgFlowEnabled) { + // Filling Flow Container + for (uint l_ind = 0; l_ind < corrconfigs.size(); l_ind++) { + fillFC(fGFWTrue, true, corrconfigs.at(l_ind), centrality, lRandom); } } } From 57bcdda7323229211324bee8a0ab53be69bdb0af Mon Sep 17 00:00:00 2001 From: Noor Koster <82090643+cnkoster@users.noreply.github.com> Date: Wed, 5 Feb 2025 22:58:25 +0100 Subject: [PATCH 0059/1650] [PWGCF] Clean up table producer and task (#9768) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/TableProducer/zdcQVectors.cxx | 343 +++++++++-------------- PWGCF/Flow/Tasks/flowSP.cxx | 79 ++++-- 2 files changed, 190 insertions(+), 232 deletions(-) diff --git a/PWGCF/Flow/TableProducer/zdcQVectors.cxx b/PWGCF/Flow/TableProducer/zdcQVectors.cxx index 80dc9c1ff20..ca5389167ce 100644 --- a/PWGCF/Flow/TableProducer/zdcQVectors.cxx +++ b/PWGCF/Flow/TableProducer/zdcQVectors.cxx @@ -65,7 +65,7 @@ using namespace o2::aod::track; using namespace o2::aod::evsel; // define my..... -using UsedCollisions = soa::Join; +using UsedCollisions = soa::Join; using BCsRun3 = soa::Join; namespace o2::analysis::qvectortask @@ -75,10 +75,6 @@ int counter = 0; // step0 -> Energy calib std::shared_ptr energyZN[10] = {{nullptr}}; -std::shared_ptr hQxvsQy[6] = {{nullptr}}; - -// and -std::shared_ptr hCOORDcorrelations[6][4] = {{nullptr}}; // Define histogrm names here to use same names for creating and later uploading and retrieving data from ccdb // Energy calibration: @@ -91,8 +87,9 @@ std::vector pxZDC = {-1.75, 1.75, -1.75, 1.75}; std::vector pyZDC = {-1.75, -1.75, 1.75, 1.75}; double alphaZDC = 0.395; -// step 0 tm 5 A&C -std::vector>> q(6, std::vector>(7, std::vector(4, 0.0))); // 5 iterations with 5 steps, each with 4 values +// q-vectors before (q) and after (qRec) recentering. +std::vector q(4); // start values of [QxA, QyA, QxC, QyC] +std::vector qRec(4); // Recentered values of [QxA, QyA, QxC, QyC] // for energy calibration std::vector eZN(8); // uncalibrated energy for the 2x4 towers (a1, a2, a3, a4, c1, c2, c3, c4) @@ -124,6 +121,12 @@ struct ZdcQVectors { ConfigurableAxis axisVy{"axisVy", {10, -0.01, 0.01}, "for Pos Y of collision"}; ConfigurableAxis axisVz{"axisVz", {10, -10, 1}, "for vz of collision"}; + // Centrality Estimators -> standard is FT0C + O2_DEFINE_CONFIGURABLE(cfgFT0Cvariant1, bool, false, "Set centrality estimator to cfgFT0Cvariant1"); + O2_DEFINE_CONFIGURABLE(cfgFT0M, bool, false, "Set centrality estimator to cfgFT0M"); + O2_DEFINE_CONFIGURABLE(cfgFV0A, bool, false, "Set centrality estimator to cfgFV0A"); + O2_DEFINE_CONFIGURABLE(cfgNGlobal, bool, false, "Set centrality estimator to cfgNGlobal"); + O2_DEFINE_CONFIGURABLE(cfgCutVertex, float, 10.0f, "Accepted z-vertex range") O2_DEFINE_CONFIGURABLE(cfgCutPtPOIMin, float, 0.2f, "Minimal.q pT for poi tracks") O2_DEFINE_CONFIGURABLE(cfgCutPtPOIMax, float, 10.0f, "Maximal pT for poi tracks") @@ -155,6 +158,11 @@ struct ZdcQVectors { int atIteration = 0; } cal; + enum FillType { + kBefore, + kAfter + }; + void init(InitContext const&) { ccdb->setURL("http://alice-ccdb.cern.ch"); @@ -173,20 +181,17 @@ struct ZdcQVectors { energyZN[tower] = registry.add(Form("Energy/%s", namesEcal[tower].Data()), Form("%s", namesEcal[tower].Data()), kTProfile2D, {{1, 0, 1}, axisCent}); } - // Qx_vs_Qy for each step for ZNA and ZNC - for (int step = 0; step < 6; step++) { - registry.add(Form("step%i/QA/hSPplaneA", step), "hSPplaneA", kTH2D, {{100, -4, 4}, axisCent10}); - registry.add(Form("step%i/QA/hSPplaneC", step), "hSPplaneC", kTH2D, {{100, -4, 4}, axisCent10}); - registry.add(Form("step%i/QA/hSPplaneFull", step), "hSPplaneFull", kTH2D, {{100, -4, 4}, axisCent10}); - for (const auto& side : sides) { - hQxvsQy[step] = registry.add(Form("step%i/hZN%s_Qx_vs_Qy", step, side), Form("hZN%s_Qx_vs_Qy", side), kTH2F, {axisQ, axisQ}); - } - int i = 0; + registry.add(Form("before/QA/hSPplaneA"), "hSPplaneA", kTH2D, {{100, -4, 4}, axisCent10}); + registry.add(Form("before/QA/hSPplaneC"), "hSPplaneC", kTH2D, {{100, -4, 4}, axisCent10}); + registry.add(Form("before/QA/hSPplaneFull"), "hSPplaneFull", kTH2D, {{100, -4, 4}, axisCent10}); + for (const auto& side : sides) { + registry.add(Form("before/hZN%s_Qx_vs_Qy", side), Form("hZN%s_Qx_vs_Qy", side), kTH2F, {axisQ, axisQ}); + } + for (const auto& COORD1 : capCOORDS) { for (const auto& COORD2 : capCOORDS) { // Now we get: & vs. Centrality - hCOORDcorrelations[step][i] = registry.add(Form("step%i/QA/hQ%sA_Q%sC_vs_cent", step, COORD1, COORD2), Form("hQ%sA_Q%sC_vs_cent", COORD1, COORD2), kTProfile, {axisCent10}); - i++; + registry.add(Form("before/QA/hQ%sA_Q%sC_vs_cent", COORD1, COORD2), Form("hQ%sA_Q%sC_vs_cent", COORD1, COORD2), kTProfile, {axisCent}); } } @@ -194,190 +199,76 @@ struct ZdcQVectors { // Sides is {A,C} and capcoords is {X,Y} for (const auto& side : sides) { for (const auto& coord : capCOORDS) { - registry.add(Form("step%i/QA/hQ%s%s_vs_cent", step, coord, side), Form("hQ%s%s_vs_cent", coord, side), {HistType::kTProfile, {axisCent10}}); - registry.add(Form("step%i/QA/hQ%s%s_vs_vx", step, coord, side), Form("hQ%s%s_vs_vx", coord, side), {HistType::kTProfile, {axisVx}}); - registry.add(Form("step%i/QA/hQ%s%s_vs_vy", step, coord, side), Form("hQ%s%s_vs_vy", coord, side), {HistType::kTProfile, {axisVy}}); - registry.add(Form("step%i/QA/hQ%s%s_vs_vz", step, coord, side), Form("hQ%s%s_vs_vz", coord, side), {HistType::kTProfile, {axisVz}}); - - if (step == 1 || step == 5) { - TString name = TString::Format("hQ%s%s_mean_Cent_V_run", coord, side); - registry.add(Form("step%i/%s", step, name.Data()), Form("hQ%s%s_mean_Cent_V_run", coord, side), {HistType::kTHnSparseD, {axisCent10, axisVxBig, axisVyBig, axisVzBig, axisQ}}); - if (step == 1) - names[step - 1].push_back(name); - } - if (step == 2) { - TString name = TString::Format("hQ%s%s_mean_cent_run", coord, side); - registry.add(Form("step%i/%s", step, name.Data()), Form("hQ%s%s_mean_cent_run", coord, side), kTProfile, {axisCent}); - names[step - 1].push_back(name); - } - if (step == 3) { - TString name = TString::Format("hQ%s%s_mean_vx_run", coord, side); - registry.add(Form("step%i/%s", step, name.Data()), Form("hQ%s%s_mean_vx_run", coord, side), kTProfile, {axisVx}); - names[step - 1].push_back(name); - } - if (step == 4) { - TString name = TString::Format("hQ%s%s_mean_vy_run", coord, side); - registry.add(Form("step%i/%s", step, name.Data()), Form("hQ%s%s_mean_vy_run", coord, side), kTProfile, {axisVy}); - names[step - 1].push_back(name); - } - if (step == 5) { - TString name = TString::Format("hQ%s%s_mean_vz_run", coord, side); - registry.add(Form("step%i/%s", step, name.Data()), Form("hQ%s%s_mean_vz_run", coord, side), kTProfile, {axisVz}); - names[step - 1].push_back(name); - } + registry.add(Form("before/QA/hQ%s%s_vs_cent", coord, side), Form("hQ%s%s_vs_cent", coord, side), {HistType::kTProfile, {axisCent10}}); + registry.add(Form("before/QA/hQ%s%s_vs_vx", coord, side), Form("hQ%s%s_vs_vx", coord, side), {HistType::kTProfile, {axisVx}}); + registry.add(Form("before/QA/hQ%s%s_vs_vy", coord, side), Form("hQ%s%s_vs_vy", coord, side), {HistType::kTProfile, {axisVy}}); + registry.add(Form("before/QA/hQ%s%s_vs_vz", coord, side), Form("hQ%s%s_vs_vz", coord, side), {HistType::kTProfile, {axisVz}}); + + names[0].push_back(TString::Format("hQ%s%s_mean_Cent_V_run", coord, side)); + names[1].push_back(TString::Format("hQ%s%s_mean_cent_run", coord, side)); + names[2].push_back(TString::Format("hQ%s%s_mean_vx_run", coord, side)); + names[3].push_back(TString::Format("hQ%s%s_mean_vy_run", coord, side)); + names[4].push_back(TString::Format("hQ%s%s_mean_vz_run", coord, side)); } // end of capCOORDS } // end of sides - } // end of sum over steps - // recentered q-vectors (to check what steps are finished in the end) - registry.add("hStep", "hStep", {HistType::kTH1D, {{10, 0., 10.}}}); - registry.add("hIteration", "hIteration", {HistType::kTH1D, {{10, 0., 10.}}}); + // recentered q-vectors (to check what steps are finished in the end) - registry.add("vmean/hvertex_vx", "hvertex_vx", kTProfile, {{1, 0., 1.}}); - registry.add("vmean/hvertex_vy", "hvertex_vy", kTProfile, {{1, 0., 1.}}); - registry.add("vmean/hvertex_vz", "hvertex_vz", kTProfile, {{1, 0., 1.}}); + registry.add("vmean/hvertex_vx", "hvertex_vx", kTProfile, {{1, 0., 1.}}); + registry.add("vmean/hvertex_vy", "hvertex_vy", kTProfile, {{1, 0., 1.}}); + registry.add("vmean/hvertex_vz", "hvertex_vz", kTProfile, {{1, 0., 1.}}); - registry.add("QA/centrality_before", "centrality_before", kTH1D, {{200, 0, 100}}); - registry.add("QA/centrality_after", "centrality_after", kTH1D, {{200, 0, 100}}); + registry.add("QA/centrality_before", "centrality_before", kTH1D, {{200, 0, 100}}); + registry.add("QA/centrality_after", "centrality_after", kTH1D, {{200, 0, 100}}); - registry.add("QA/ZNA_Energy", "ZNA_Energy", kTProfile, {{8, 0, 8}}); - registry.add("QA/ZNC_Energy", "ZNC_Energy", kTProfile, {{8, 0, 8}}); - } + registry.add("QA/ZNA_Energy", "ZNA_Energy", kTProfile, {{8, 0, 8}}); + registry.add("QA/ZNC_Energy", "ZNC_Energy", kTProfile, {{8, 0, 8}}); - inline void fillRegistry(int iteration, int step) - { - if (step == 0 && iteration == 1) { - registry.fill(HIST("hIteration"), iteration, 1); - - registry.fill(HIST("step1/hQXA_mean_Cent_V_run"), runnumber, centrality, v[0], v[1], v[2], q[0][step][0]); - registry.fill(HIST("step1/hQYA_mean_Cent_V_run"), runnumber, centrality, v[0], v[1], v[2], q[0][step][1]); - registry.fill(HIST("step1/hQXC_mean_Cent_V_run"), runnumber, centrality, v[0], v[1], v[2], q[0][step][2]); - registry.fill(HIST("step1/hQYC_mean_Cent_V_run"), runnumber, centrality, v[0], v[1], v[2], q[0][step][3]); - registry.fill(HIST("hStep"), step, 1); - } - - if (step == 1) { - registry.get(HIST("step2/hQXA_mean_cent_run"))->Fill(centrality, q[iteration][step][0]); - registry.get(HIST("step2/hQYA_mean_cent_run"))->Fill(centrality, q[iteration][step][1]); - registry.get(HIST("step2/hQXC_mean_cent_run"))->Fill(centrality, q[iteration][step][2]); - registry.get(HIST("step2/hQYC_mean_cent_run"))->Fill(centrality, q[iteration][step][3]); - registry.fill(HIST("hStep"), step, 1); - } - - if (step == 2) { - registry.get(HIST("step3/hQXA_mean_vx_run"))->Fill(v[0], q[iteration][step][0]); - registry.get(HIST("step3/hQYA_mean_vx_run"))->Fill(v[0], q[iteration][step][1]); - registry.get(HIST("step3/hQXC_mean_vx_run"))->Fill(v[0], q[iteration][step][2]); - registry.get(HIST("step3/hQYC_mean_vx_run"))->Fill(v[0], q[iteration][step][3]); - registry.fill(HIST("hStep"), step, 1); - } - - if (step == 3) { - registry.get(HIST("step4/hQXA_mean_vy_run"))->Fill(v[1], q[iteration][step][0]); - registry.get(HIST("step4/hQYA_mean_vy_run"))->Fill(v[1], q[iteration][step][1]); - registry.get(HIST("step4/hQXC_mean_vy_run"))->Fill(v[1], q[iteration][step][2]); - registry.get(HIST("step4/hQYC_mean_vy_run"))->Fill(v[1], q[iteration][step][3]); - registry.fill(HIST("hStep"), step, 1); - } - - if (step == 4) { - registry.get(HIST("step5/hQXA_mean_vz_run"))->Fill(v[2], q[iteration][step][0]); - registry.get(HIST("step5/hQYA_mean_vz_run"))->Fill(v[2], q[iteration][step][1]); - registry.get(HIST("step5/hQXC_mean_vz_run"))->Fill(v[2], q[iteration][step][2]); - registry.get(HIST("step5/hQYC_mean_vz_run"))->Fill(v[2], q[iteration][step][3]); - registry.fill(HIST("hStep"), step, 1); - } - - if (step == 5) { - registry.fill(HIST("step5/hQXA_mean_Cent_V_run"), centrality, v[0], v[1], v[2], q[iteration][step][0]); - registry.fill(HIST("step5/hQYA_mean_Cent_V_run"), centrality, v[0], v[1], v[2], q[iteration][step][1]); - registry.fill(HIST("step5/hQXC_mean_Cent_V_run"), centrality, v[0], v[1], v[2], q[iteration][step][2]); - registry.fill(HIST("step5/hQYC_mean_Cent_V_run"), centrality, v[0], v[1], v[2], q[iteration][step][3]); - registry.fill(HIST("hStep"), step, 1); - } + registry.addClone("before/", "after/"); } - inline void fillCommonRegistry(int iteration) + template + inline void fillCommonRegistry(double qxa, double qya, double qxc, double qyc, std::vector v, double centrality) { // loop for filling multiple histograms with different naming patterns // Always fill the uncentered "raw" Q-vector histos! + static constexpr std::string_view Time[] = {"before", "after"}; - registry.fill(HIST("step0/hZNA_Qx_vs_Qy"), q[0][0][0], q[0][0][1]); - registry.fill(HIST("step0/hZNC_Qx_vs_Qy"), q[0][0][2], q[0][0][3]); + registry.fill(HIST(Time[ft]) + HIST("/hZNA_Qx_vs_Qy"), qxa, qya); + registry.fill(HIST(Time[ft]) + HIST("/hZNC_Qx_vs_Qy"), qxc, qyc); - registry.fill(HIST("step0/QA/hQXA_QXC_vs_cent"), centrality, q[0][0][0] * q[0][0][2]); - registry.fill(HIST("step0/QA/hQYA_QYC_vs_cent"), centrality, q[0][0][1] * q[0][0][3]); - registry.fill(HIST("step0/QA/hQYA_QXC_vs_cent"), centrality, q[0][0][1] * q[0][0][2]); - registry.fill(HIST("step0/QA/hQXA_QYC_vs_cent"), centrality, q[0][0][0] * q[0][0][3]); + registry.fill(HIST(Time[ft]) + HIST("/QA/hQXA_QXC_vs_cent"), centrality, qxa * qxc); + registry.fill(HIST(Time[ft]) + HIST("/QA/hQYA_QYC_vs_cent"), centrality, qya * qyc); + registry.fill(HIST(Time[ft]) + HIST("/QA/hQYA_QXC_vs_cent"), centrality, qya * qxc); + registry.fill(HIST(Time[ft]) + HIST("/QA/hQXA_QYC_vs_cent"), centrality, qxa * qyc); - registry.fill(HIST("step0/QA/hQXA_vs_cent"), centrality, q[0][0][0]); - registry.fill(HIST("step0/QA/hQYA_vs_cent"), centrality, q[0][0][1]); - registry.fill(HIST("step0/QA/hQXC_vs_cent"), centrality, q[0][0][2]); - registry.fill(HIST("step0/QA/hQYC_vs_cent"), centrality, q[0][0][3]); + registry.fill(HIST(Time[ft]) + HIST("/QA/hQXA_vs_cent"), centrality, qxa); + registry.fill(HIST(Time[ft]) + HIST("/QA/hQYA_vs_cent"), centrality, qya); + registry.fill(HIST(Time[ft]) + HIST("/QA/hQXC_vs_cent"), centrality, qxc); + registry.fill(HIST(Time[ft]) + HIST("/QA/hQYC_vs_cent"), centrality, qyc); - registry.fill(HIST("step0/QA/hQXA_vs_vx"), v[0], q[0][0][0]); - registry.fill(HIST("step0/QA/hQYA_vs_vx"), v[0], q[0][0][1]); - registry.fill(HIST("step0/QA/hQXC_vs_vx"), v[0], q[0][0][2]); - registry.fill(HIST("step0/QA/hQYC_vs_vx"), v[0], q[0][0][3]); + registry.fill(HIST(Time[ft]) + HIST("/QA/hQXA_vs_vx"), v[0], qxa); + registry.fill(HIST(Time[ft]) + HIST("/QA/hQYA_vs_vx"), v[0], qya); + registry.fill(HIST(Time[ft]) + HIST("/QA/hQXC_vs_vx"), v[0], qxc); + registry.fill(HIST(Time[ft]) + HIST("/QA/hQYC_vs_vx"), v[0], qyc); - registry.fill(HIST("step0/QA/hQXA_vs_vy"), v[1], q[0][0][0]); - registry.fill(HIST("step0/QA/hQYA_vs_vy"), v[1], q[0][0][1]); - registry.fill(HIST("step0/QA/hQXC_vs_vy"), v[1], q[0][0][2]); - registry.fill(HIST("step0/QA/hQYC_vs_vy"), v[1], q[0][0][3]); + registry.fill(HIST(Time[ft]) + HIST("/QA/hQXA_vs_vy"), v[1], qxa); + registry.fill(HIST(Time[ft]) + HIST("/QA/hQYA_vs_vy"), v[1], qya); + registry.fill(HIST(Time[ft]) + HIST("/QA/hQXC_vs_vy"), v[1], qxc); + registry.fill(HIST(Time[ft]) + HIST("/QA/hQYC_vs_vy"), v[1], qyc); - registry.fill(HIST("step0/QA/hQXA_vs_vz"), v[2], q[0][0][0]); - registry.fill(HIST("step0/QA/hQYA_vs_vz"), v[2], q[0][0][1]); - registry.fill(HIST("step0/QA/hQXC_vs_vz"), v[2], q[0][0][2]); - registry.fill(HIST("step0/QA/hQYC_vs_vz"), v[2], q[0][0][3]); + registry.fill(HIST(Time[ft]) + HIST("/QA/hQXA_vs_vz"), v[2], qxa); + registry.fill(HIST(Time[ft]) + HIST("/QA/hQYA_vs_vz"), v[2], qya); + registry.fill(HIST(Time[ft]) + HIST("/QA/hQXC_vs_vz"), v[2], qxc); + registry.fill(HIST(Time[ft]) + HIST("/QA/hQYC_vs_vz"), v[2], qyc); // add psi!! - double psiA = 1.0 * std::atan2(q[0][0][2], q[0][0][0]); - registry.fill(HIST("step0/QA/hSPplaneA"), psiA, centrality, 1); - double psiC = 1.0 * std::atan2(q[0][0][3], q[0][0][1]); - registry.fill(HIST("step0/QA/hSPplaneC"), psiC, centrality, 1); - double psiFull = 1.0 * std::atan2(q[0][0][2] + q[0][0][3], q[0][0][0] + q[0][0][1]); - registry.fill(HIST("step0/QA/hSPplaneFull"), psiFull, centrality, 1); - - static constexpr std::string_view SubDir[] = {"step1/", "step2/", "step3/", "step4/", "step5/"}; - static_for<0, 4>([&](auto Ind) { - constexpr int Index = Ind.value; - int indexRt = Index + 1; - - registry.fill(HIST(SubDir[Index]) + HIST("hZNA_Qx_vs_Qy"), q[iteration][indexRt][0], q[iteration][indexRt][1]); - registry.fill(HIST(SubDir[Index]) + HIST("hZNC_Qx_vs_Qy"), q[iteration][indexRt][2], q[iteration][indexRt][3]); - - registry.fill(HIST(SubDir[Index]) + HIST("QA/hQXA_QXC_vs_cent"), centrality, q[iteration][indexRt][0] * q[iteration][indexRt][2]); - registry.fill(HIST(SubDir[Index]) + HIST("QA/hQYA_QYC_vs_cent"), centrality, q[iteration][indexRt][1] * q[iteration][indexRt][3]); - registry.fill(HIST(SubDir[Index]) + HIST("QA/hQYA_QXC_vs_cent"), centrality, q[iteration][indexRt][1] * q[iteration][indexRt][2]); - registry.fill(HIST(SubDir[Index]) + HIST("QA/hQXA_QYC_vs_cent"), centrality, q[iteration][indexRt][0] * q[iteration][indexRt][3]); - - registry.fill(HIST(SubDir[Index]) + HIST("QA/hQXA_vs_cent"), centrality, q[iteration][indexRt][0]); - registry.fill(HIST(SubDir[Index]) + HIST("QA/hQYA_vs_cent"), centrality, q[iteration][indexRt][1]); - registry.fill(HIST(SubDir[Index]) + HIST("QA/hQXC_vs_cent"), centrality, q[iteration][indexRt][2]); - registry.fill(HIST(SubDir[Index]) + HIST("QA/hQYC_vs_cent"), centrality, q[iteration][indexRt][3]); - - registry.fill(HIST(SubDir[Index]) + HIST("QA/hQXA_vs_vx"), v[0], q[iteration][indexRt][0]); - registry.fill(HIST(SubDir[Index]) + HIST("QA/hQYA_vs_vx"), v[0], q[iteration][indexRt][1]); - registry.fill(HIST(SubDir[Index]) + HIST("QA/hQXC_vs_vx"), v[0], q[iteration][indexRt][2]); - registry.fill(HIST(SubDir[Index]) + HIST("QA/hQYC_vs_vx"), v[0], q[iteration][indexRt][3]); - - registry.fill(HIST(SubDir[Index]) + HIST("QA/hQXA_vs_vy"), v[1], q[iteration][indexRt][0]); - registry.fill(HIST(SubDir[Index]) + HIST("QA/hQYA_vs_vy"), v[1], q[iteration][indexRt][1]); - registry.fill(HIST(SubDir[Index]) + HIST("QA/hQXC_vs_vy"), v[1], q[iteration][indexRt][2]); - registry.fill(HIST(SubDir[Index]) + HIST("QA/hQYC_vs_vy"), v[1], q[iteration][indexRt][3]); - - registry.fill(HIST(SubDir[Index]) + HIST("QA/hQXA_vs_vz"), v[2], q[iteration][indexRt][0]); - registry.fill(HIST(SubDir[Index]) + HIST("QA/hQYA_vs_vz"), v[2], q[iteration][indexRt][1]); - registry.fill(HIST(SubDir[Index]) + HIST("QA/hQXC_vs_vz"), v[2], q[iteration][indexRt][2]); - registry.fill(HIST(SubDir[Index]) + HIST("QA/hQYC_vs_vz"), v[2], q[iteration][indexRt][3]); - - psiA = 1.0 * std::atan2(q[iteration][indexRt][2], q[iteration][indexRt][0]); - registry.fill(HIST(SubDir[Index]) + HIST("QA/hSPplaneA"), psiA, centrality, 1); - psiC = 1.0 * std::atan2(q[iteration][indexRt][3], q[iteration][indexRt][1]); - registry.fill(HIST(SubDir[Index]) + HIST("QA/hSPplaneC"), psiC, centrality, 1); - psiFull = 1.0 * std::atan2(q[iteration][indexRt][2] + q[iteration][indexRt][3], q[iteration][indexRt][0] + q[iteration][indexRt][1]); - registry.fill(HIST(SubDir[Index]) + HIST("QA/hSPplaneFull"), psiFull, centrality, 1); - }); + double psiA = 1.0 * std::atan2(qxc, qxa); + registry.fill(HIST(Time[ft]) + HIST("/QA/hSPplaneA"), psiA, centrality, 1); + double psiC = 1.0 * std::atan2(qyc, qya); + registry.fill(HIST(Time[ft]) + HIST("/QA/hSPplaneC"), psiC, centrality, 1); + double psiFull = 1.0 * std::atan2(qxc + qyc, qxa + qya); + registry.fill(HIST(Time[ft]) + HIST("/QA/hSPplaneFull"), psiFull, centrality, 1); } void loadCalibrations(int iteration, int step, uint64_t timestamp, std::string ccdb_dir, std::vector names) @@ -505,13 +396,6 @@ struct ZdcQVectors { return calibConstant; } - void fillAllRegistries(int iteration, int step) - { - for (int s = 0; s <= step; s++) - fillRegistry(iteration, s); - fillCommonRegistry(iteration); - } - void process(UsedCollisions::iterator const& collision, BCsRun3 const& /*bcs*/, aod::Zdcs const& /*zdcs*/) @@ -524,7 +408,16 @@ struct ZdcQVectors { isSelected = true; + // TODO Implement other ZDC estimators auto cent = collision.centFT0C(); + if (cfgFT0Cvariant1) + cent = collision.centFT0CVariant1(); + if (cfgFT0M) + cent = collision.centFT0M(); + if (cfgFV0A) + cent = collision.centFV0A(); + if (cfgNGlobal) + cent = collision.centNGlobal(); if (cent < 0 || cent > 90) { isSelected = false; @@ -676,8 +569,8 @@ struct ZdcQVectors { // "QXA", "QYA", "QXC", "QYC" for (int i = 0; i < 2; ++i) { if (sumZN[i] > 0) { - q[0][0][i * 2] = xEnZN[i] / sumZN[i]; // for QXA[0] and QXC[2] - q[0][0][i * 2 + 1] = yEnZN[i] / sumZN[i]; // for QYA[1] and QYC[3] + q[i * 2] = xEnZN[i] / sumZN[i]; // for QXA[0] and QXC[2] + q[i * 2 + 1] = yEnZN[i] / sumZN[i]; // for QYA[1] and QYC[3] } } @@ -713,41 +606,59 @@ struct ZdcQVectors { if (counter < 1) LOGF(warning, "Calibation files missing!!! Output created with q-vectors right after energy gain eq. !!"); if (isSelected) - fillAllRegistries(0, 0); - spTableZDC(runnumber, centrality, v[0], v[1], v[2], q[0][0][0], q[0][0][1], q[0][0][2], q[0][0][3], isSelected, 0, 0); + fillCommonRegistry(q[0], q[1], q[2], q[3], v, centrality); + spTableZDC(runnumber, centrality, v[0], v[1], v[2], q[0], q[1], q[2], q[3], isSelected, 0, 0); counter++; return; - } else { - for (int iteration = 1; iteration <= cal.atIteration; iteration++) { - for (int step = 0; step < cal.atStep + 1; step++) { - if (cal.calibfilesLoaded[iteration][step]) { - for (int i = 0; i < 4; i++) { - if (step == 0) { - if (iteration == 1) { - q[iteration][step + 1][i] = q[0][0][i] - getCorrection(iteration, step, names[step][i].Data()); - } else { - q[iteration][step + 1][i] = q[iteration - 1][5][i] - getCorrection(iteration, step, names[step][i].Data()); - } - } else { - q[iteration][step + 1][i] = q[iteration][step][i] - getCorrection(iteration, step, names[step][i].Data()); - } - } - } else { - if (counter < 1) - LOGF(warning, "Something went wrong in calibration loop! File not loaded but bool set to tue"); - } // end of (cal.calibLoaded) - } // end of step - } // end of iteration + } else if (cal.atIteration == 5 && cal.atStep == 4) { + std::vector qRec(4); + fillCommonRegistry(q[0], q[1], q[2], q[3], v, centrality); + qRec = q; + + // vector of 4 + std::vector corrQxA; + std::vector corrQyA; + std::vector corrQxC; + std::vector corrQyC; + + int pb = 0; + + for (int it = 1; it < 6; it++) { + corrQxA.push_back(getCorrection(it, 0, names[0][0].Data())); + corrQyA.push_back(getCorrection(it, 0, names[0][1].Data())); + corrQxC.push_back(getCorrection(it, 0, names[0][2].Data())); + corrQyC.push_back(getCorrection(it, 0, names[0][3].Data())); + + pb++; + + for (int step = 1; step < 5; step++) { + corrQxA.push_back(getCorrection(it, step, names[step][0].Data())); + corrQyA.push_back(getCorrection(it, step, names[step][1].Data())); + corrQxC.push_back(getCorrection(it, step, names[step][2].Data())); + corrQyC.push_back(getCorrection(it, step, names[step][3].Data())); + pb++; + } + } + + for (int cor = 0; cor < pb; cor++) { + qRec[0] -= corrQxA[cor]; + qRec[1] -= corrQyA[cor]; + qRec[2] -= corrQxC[cor]; + qRec[3] -= corrQyC[cor]; + } if (counter < 1) LOGF(info, "Output created with q-vectors at iteration %i and step %i!!!!", cal.atIteration, cal.atStep + 1); if (isSelected) { - fillAllRegistries(cal.atIteration, cal.atStep + 1); + fillCommonRegistry(qRec[0], qRec[1], qRec[2], qRec[3], v, centrality); registry.fill(HIST("QA/centrality_after"), centrality); } - spTableZDC(runnumber, centrality, v[0], v[1], v[2], q[cal.atIteration][cal.atStep][0], q[cal.atIteration][cal.atStep][1], q[cal.atIteration][cal.atStep][2], q[cal.atIteration][cal.atStep][3], isSelected, cal.atIteration, cal.atStep); + spTableZDC(runnumber, centrality, v[0], v[1], v[2], qRec[0], qRec[1], qRec[2], qRec[3], isSelected, cal.atIteration, cal.atStep); counter++; return; + } else { + if (counter < 1) + LOGF(info, "Recentering not complete!! q-vectors at iteration %i and step %i!!!!", cal.atIteration, cal.atStep + 1); } LOGF(warning, "We return without saving table... -> THis is a problem"); } // end of process diff --git a/PWGCF/Flow/Tasks/flowSP.cxx b/PWGCF/Flow/Tasks/flowSP.cxx index 919e092f9b0..06de1e2ec4c 100644 --- a/PWGCF/Flow/Tasks/flowSP.cxx +++ b/PWGCF/Flow/Tasks/flowSP.cxx @@ -109,19 +109,26 @@ struct FlowSP { Filter collisionFilter = nabs(aod::collision::posZ) < cfgVtxZ; Filter trackFilter = nabs(aod::track::eta) < cfgEta && aod::track::pt > cfgPtmin&& aod::track::pt < cfgPtmax && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && nabs(aod::track::dcaXY) < cfgDCAxy&& nabs(aod::track::dcaZ) < cfgDCAz; - using UsedCollisions = soa::Filtered>; + using UsedCollisions = soa::Filtered>; using UsedTracks = soa::Filtered>; // Connect to ccdb Service ccdb; - // from Generic Framework - // Adapted to hold weights for: inclusive, positive charged, negative charged + // struct to hold the correction histos/ struct Config { std::vector mEfficiency = {}; std::vector mAcceptance = {}; bool correctionsLoaded = false; int lastRunNumber = 0; + + TProfile* hcorrQQ = nullptr; + TProfile* hcorrQQx = nullptr; + TProfile* hcorrQQy = nullptr; + TProfile* hEvPlaneRes = nullptr; + bool clQQ = false; + bool clEvPlaneRes = false; + } cfg; // define output objects @@ -247,6 +254,11 @@ struct FlowSP { registry.add("incl/vnA_pt", "", kTProfile, {axisPt}); registry.add("incl/vnC_pt_odd", "", kTProfile, {axisPt}); registry.add("incl/vnA_pt_odd", "", kTProfile, {axisPt}); + registry.add("incl/vnCx_pt_odd", "", kTProfile, {axisPt}); + registry.add("incl/vnAx_pt_odd", "", kTProfile, {axisPt}); + registry.add("incl/vnCy_pt_odd", "", kTProfile, {axisPt}); + registry.add("incl/vnAy_pt_odd", "", kTProfile, {axisPt}); + registry.add("incl/vnA_pt_EP", "", kTProfile, {axisPt}); registry.add("incl/vnC_pt_EP", "", kTProfile, {axisPt}); registry.add("incl/vnFull_pt_EP", "", kTProfile, {axisPt}); @@ -630,12 +642,23 @@ struct FlowSP { registry.fill(HIST(Charge[ct]) + HIST("vnA_pt_odd"), track.pt(), -1.0 * (uy * qyA + ux * qxA) / std::sqrt(std::fabs(corrQQ)), wacc * weff); registry.fill(HIST(Charge[ct]) + HIST("vnC_pt_odd"), track.pt(), -1.0 * (uy * qyC + ux * qxC) / std::sqrt(std::fabs(corrQQ)), wacc * weff); + + registry.fill(HIST(Charge[ct]) + HIST("vnAx_pt_odd"), track.pt(), -1.0 * (ux * qxA) / std::sqrt(std::fabs(corrQQx)), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnAy_pt_odd"), track.pt(), -1.0 * (uy * qyA) / std::sqrt(std::fabs(corrQQy)), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnCx_pt_odd"), track.pt(), -1.0 * (ux * qxC) / std::sqrt(std::fabs(corrQQx)), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnCy_pt_odd"), track.pt(), -1.0 * (uy * qyC) / std::sqrt(std::fabs(corrQQy)), wacc * weff); + } else { registry.fill(HIST(Charge[ct]) + HIST("vnA_cent_plusEta"), centrality, (uy * qyA + ux * qxA) / std::sqrt(std::fabs(corrQQ)), wacc * weff); registry.fill(HIST(Charge[ct]) + HIST("vnC_cent_plusEta"), centrality, (uy * qyC + ux * qxC) / std::sqrt(std::fabs(corrQQ)), wacc * weff); registry.fill(HIST(Charge[ct]) + HIST("vnA_pt_odd"), track.pt(), (uy * qyA + ux * qxA) / std::sqrt(std::fabs(corrQQ)), wacc * weff); registry.fill(HIST(Charge[ct]) + HIST("vnC_pt_odd"), track.pt(), (uy * qyC + ux * qxC) / std::sqrt(std::fabs(corrQQ)), wacc * weff); + + registry.fill(HIST(Charge[ct]) + HIST("vnAx_pt_odd"), track.pt(), (ux * qxA) / std::sqrt(std::fabs(corrQQx)), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnAy_pt_odd"), track.pt(), (uy * qyA) / std::sqrt(std::fabs(corrQQy)), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnCx_pt_odd"), track.pt(), (ux * qxC) / std::sqrt(std::fabs(corrQQx)), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnCy_pt_odd"), track.pt(), (uy * qyC) / std::sqrt(std::fabs(corrQQy)), wacc * weff); } registry.fill(HIST(Charge[ct]) + HIST("vnAxCxUx_cent_MH"), centrality, (uxMH * qxA * qxC) / corrQQx, wacc * weff); @@ -685,7 +708,8 @@ struct FlowSP { centrality = collision.centFT0M(); if (cfgFV0A) centrality = collision.centFV0A(); - // if (cfgNGlobal) centrality = collision.centNGlobal(); + if (cfgNGlobal) + centrality = collision.centNGlobal(); if (!eventSelected(collision, tracks.size(), centrality)) return; @@ -732,21 +756,28 @@ struct FlowSP { double corrQQ = 1., corrQQx = 1., corrQQy = 1.; // Load correlations and SP resolution needed for Scalar Product and event plane methods. + // Only load once! // If not loaded set to 1 if (cfgLoadAverageQQ) { - TList* hcorrList = ccdb->getForTimeStamp(cfgCCDBdir.value, bc.timestamp()); - TProfile* hcorrQQ = reinterpret_cast(hcorrList->FindObject("qAqCXY")); - TProfile* hcorrQQx = reinterpret_cast(hcorrList->FindObject("qAqCX")); - TProfile* hcorrQQy = reinterpret_cast(hcorrList->FindObject("qAqCY")); - corrQQ = hcorrQQ->GetBinContent(hcorrQQ->FindBin(centrality)); - corrQQx = hcorrQQx->GetBinContent(hcorrQQx->FindBin(centrality)); - corrQQy = hcorrQQy->GetBinContent(hcorrQQy->FindBin(centrality)); + if (!cfg.clQQ) { + TList* hcorrList = ccdb->getForTimeStamp(cfgCCDBdir.value, bc.timestamp()); + cfg.hcorrQQ = reinterpret_cast(hcorrList->FindObject("qAqCXY")); + cfg.hcorrQQx = reinterpret_cast(hcorrList->FindObject("qAqCX")); + cfg.hcorrQQy = reinterpret_cast(hcorrList->FindObject("qAqCY")); + cfg.clQQ = true; + } + corrQQ = cfg.hcorrQQ->GetBinContent(cfg.hcorrQQ->FindBin(centrality)); + corrQQx = cfg.hcorrQQx->GetBinContent(cfg.hcorrQQx->FindBin(centrality)); + corrQQy = cfg.hcorrQQy->GetBinContent(cfg.hcorrQQy->FindBin(centrality)); } double evPlaneRes = 1.; if (cfgLoadSPPlaneRes) { - TProfile* hEvPlaneRes = ccdb->getForTimeStamp(cfgCCDBdir_SP.value, bc.timestamp()); - evPlaneRes = hEvPlaneRes->GetBinContent(hEvPlaneRes->FindBin(centrality)); + if (!cfg.clEvPlaneRes) { + cfg.hEvPlaneRes = ccdb->getForTimeStamp(cfgCCDBdir_SP.value, bc.timestamp()); + cfg.clEvPlaneRes = true; + } + evPlaneRes = cfg.hEvPlaneRes->GetBinContent(cfg.hEvPlaneRes->FindBin(centrality)); if (evPlaneRes < 0) LOGF(fatal, " > 0 for centrality %.2f! Cannot determine resolution.. Change centrality ranges!!!", centrality); evPlaneRes = std::sqrt(evPlaneRes); @@ -785,7 +816,7 @@ struct FlowSP { if (!pos && !setCurrentParticleWeights(kNegative, weffN, waccN, track.phi(), track.eta(), track.pt(), vtxz)) return; - registry.fill(HIST("QA/after/hPt_inclusive"), track.pt()); + registry.fill(HIST("QA/after/hPt_inclusive"), track.pt(), wacc * weff); // // constrain angle to 0 -> [0,0+2pi] auto phi = RecoDecay::constrainAngle(track.phi(), 0); @@ -816,13 +847,21 @@ struct FlowSP { } PROCESS_SWITCH(FlowSP, processData, "Process analysis for non-derived data", true); - void processMCReco(soa::Filtered>::iterator const& collision, aod::BCsWithTimestamps const&, soa::Filtered> const& tracks, aod::McParticles const&) + void processMCReco(soa::Filtered>::iterator const& collision, aod::BCsWithTimestamps const&, soa::Filtered> const& tracks, aod::McParticles const&) { auto bc = collision.template bc_as(); auto field = (cfgMagField == 99999) ? getMagneticField(bc.timestamp()) : cfgMagField; double vtxz = collision.posZ(); float centrality = collision.centFT0C(); + if (cfgFT0Cvariant1) + centrality = collision.centFT0CVariant1(); + if (cfgFT0M) + centrality = collision.centFT0M(); + if (cfgFV0A) + centrality = collision.centFV0A(); + if (cfgNGlobal) + centrality = collision.centNGlobal(); if (cfgFillQAHistos) fillEventQA(collision, tracks); @@ -865,13 +904,21 @@ struct FlowSP { PROCESS_SWITCH(FlowSP, processMCReco, "Process analysis for MC reconstructed events", false); Filter mcCollFilter = nabs(aod::mccollision::posZ) < cfgVtxZ; - void processMCGen(soa::Filtered::iterator const& mcCollision, soa::SmallGroups> const& collisions, aod::McParticles const& particles) + void processMCGen(soa::Filtered::iterator const& mcCollision, soa::SmallGroups> const& collisions, aod::McParticles const& particles) { if (collisions.size() != 1) return; float centrality = -1; for (const auto& collision : collisions) { centrality = collision.centFT0C(); + if (cfgFT0Cvariant1) + centrality = collision.centFT0CVariant1(); + if (cfgFT0M) + centrality = collision.centFT0M(); + if (cfgFV0A) + centrality = collision.centFV0A(); + if (cfgNGlobal) + centrality = collision.centNGlobal(); } if (particles.size() < 1) From 1d91e9ee655ea857e9fe1b4ce5dad874683991b5 Mon Sep 17 00:00:00 2001 From: Yash Patley <52608802+yashpatley@users.noreply.github.com> Date: Thu, 6 Feb 2025 03:33:11 +0530 Subject: [PATCH 0060/1650] [PWGCF] Update lambdaR2Correlation.cxx (#9776) --- .../Tasks/lambdaR2Correlation.cxx | 357 ++++++------------ 1 file changed, 109 insertions(+), 248 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx index 32179a9813b..f21427c0a51 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx @@ -23,10 +23,12 @@ #include "Framework/ASoAHelpers.h" #include "Framework/runDataProcessing.h" #include "PWGLF/DataModel/LFStrangenessTables.h" +#include "PWGLF/DataModel/mcCentrality.h" #include "CommonConstants/PhysicsConstants.h" #include "Common/Core/RecoDecay.h" #include "CCDB/BasicCCDBManager.h" #include "TPDGCode.h" +#include "TRandom.h" using namespace o2; using namespace o2::framework; @@ -140,8 +142,8 @@ enum TrackLabels { kTracksBeforeHasMcParticle = 1, kAllV0Tracks, kPassV0DauTrackSel, + kPassV0KinCuts, kPassV0TopoSel, - kPassV0TopoKinCuts, kNotLambdaNotAntiLambda, kV0AsLambdaAntiLambda, kPassV0MassWinCuts, @@ -191,11 +193,6 @@ enum DMCType { kMC }; -enum SameMixType { - kSameEvent = 0, - kMixEvent -}; - struct LambdaTableProducer { Produces lambdaCollisionTable; @@ -224,22 +221,22 @@ struct LambdaTableProducer { Configurable cMinTpcCrossedRows{"cMinTpcCrossedRows", 70, "min crossed rows"}; Configurable cTpcNsigmaCut{"cTpcNsigmaCut", 2.0, "TPC NSigma Selection Cut"}; Configurable cTrackMinDcaXY{"cTrackMinDcaXY", 0.05, "Minimum DcaXY of Daughter Tracks"}; - Configurable cIsGlobalTrackWoDca{"cIsGlobalTrackWoDca", false, "Check for Global Track"}; + Configurable cIsGlobalTrackWoDca{"cIsGlobalTrackWoDca", true, "Check for Global Track"}; // V0s Configurable cMinV0DcaDaughters{"cMinV0DcaDaughters", 0., "Minimum DCA between V0 daughters"}; Configurable cMaxV0DcaDaughters{"cMaxV0DcaDaughters", 1., "Maximum DCA between V0 daughters"}; - Configurable cMinDcaPosToPV{"cMinDcaPosToPV", 0.06, "Minimum V0 Positive Track DCAr cut to PV"}; - Configurable cMinDcaNegToPV{"cMinDcaNegToPV", 0.06, "Minimum V0 Negative Track DCAr cut to PV"}; + Configurable cMinDcaPosToPV{"cMinDcaPosToPV", 0.05, "Minimum V0 Positive Track DCAr cut to PV"}; + Configurable cMinDcaNegToPV{"cMinDcaNegToPV", 0.05, "Minimum V0 Negative Track DCAr cut to PV"}; Configurable cMinDcaV0ToPV{"cMinDcaV0ToPV", 0.0, "Minimum DCA V0 to PV"}; Configurable cMaxDcaV0ToPV{"cMaxDcaV0ToPV", 999.0, "Maximum DCA V0 to PV"}; - Configurable cMinV0TransRadius{"cMinV0TransRadius", 0.2, "Minimum V0 radius from PV"}; + Configurable cMinV0TransRadius{"cMinV0TransRadius", 0.5, "Minimum V0 radius from PV"}; Configurable cMaxV0TransRadius{"cMaxV0TransRadius", 999.0, "Maximum V0 radius from PV"}; Configurable cMinV0CTau{"cMinV0CTau", 0.0, "Minimum ctau"}; Configurable cMaxV0CTau{"cMaxV0CTau", 30.0, "Maximum ctau"}; - Configurable cMinV0CosPA{"cMinV0CosPA", 0.998, "Minimum V0 CosPA to PV"}; + Configurable cMinV0CosPA{"cMinV0CosPA", 0.995, "Minimum V0 CosPA to PV"}; Configurable cLambdaMassWindow{"cLambdaMassWindow", 0.005, "Mass Window to select Lambda"}; - Configurable cKshortRejMassWindow{"cKshortRejMassWindow", 0.017, "Reject K0Short Candidates"}; + Configurable cKshortRejMassWindow{"cKshortRejMassWindow", 0.01, "Reject K0Short Candidates"}; Configurable cKshortRejFlag{"cKshortRejFlag", true, "K0short Mass Rej Flag"}; Configurable cArmPodCutValue{"cArmPodCutValue", 0.5, "Armentros-Podolanski Slope Parameter"}; Configurable cArmPodCutFlag{"cArmPodCutFlag", false, "Armentros-Podolanski Cut Flag"}; @@ -248,6 +245,7 @@ struct LambdaTableProducer { Configurable cMinV0Pt{"cMinV0Pt", 0.8, "Minimum V0 pT"}; Configurable cMaxV0Pt{"cMaxV0Pt", 2.8, "Minimum V0 pT"}; Configurable cMaxV0Rap{"cMaxV0Rap", 0.6, "|rap| cut"}; + Configurable cDoEtaAnalysis{"cDoEtaAnalysis", false, "Do Eta Analysis"}; // V0s MC Configurable cHasMcFlag{"cHasMcFlag", true, "Has Mc Tag"}; @@ -255,11 +253,12 @@ struct LambdaTableProducer { Configurable cRecPrimaryLambda{"cRecPrimaryLambda", false, "Primary Reconstructed Lambda"}; Configurable cRecSecondaryLambda{"cRecSecondaryLambda", false, "Secondary Reconstructed Lambda"}; Configurable cGenPrimaryLambda{"cGenPrimaryLambda", true, "Primary Generated Lambda"}; - Configurable cGenDecayChannel{"cGenDecayChannel", false, "Gen Level Decay Channel Flag"}; + Configurable cGenDecayChannel{"cGenDecayChannel", true, "Gen Level Decay Channel Flag"}; // Efficiency Correction Configurable cCorrectionFlag{"cCorrectionFlag", false, "Efficiency Correction Flag"}; Configurable cCorrFactHist{"cCorrFactHist", 0, "Correction Factor Histogram"}; + Configurable cDoEtaCorr{"cDoEtaCorr", false, "Do Eta Corr"}; // CCDB Configurable cUrlCCDB{"cUrlCCDB", "http://ccdb-test.cern.ch:8080", "url of ccdb"}; @@ -274,7 +273,9 @@ struct LambdaTableProducer { // initialize corr_factor objects std::vector> vCorrFactStrings = {{"hEffVsPtLambda", "hEffVsPtAntiLambda"}, {"hEffVsPtYLambda", "hEffVsPtYAntiLambda"}, - {"hEffVsPtYVzLambda", "hEffVsPtYVzAntiLambda"}}; + {"hEffVsPtEtaLambda", "hEffVsPtEtaAntiLambda"}, + {"hEffVsPtYVzLambda", "hEffVsPtYVzAntiLambda"}, + {"hEffVsPtEtaVzLambda", "hEffVsPtEtaVzAntiLambda"}}; void init(InitContext const&) { @@ -388,8 +389,8 @@ struct LambdaTableProducer { histos.get(HIST("Events/h1f_collisions_info"))->GetXaxis()->SetBinLabel(CollisionLabels::kPassSelCol, "kPassSelCol"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kAllV0Tracks, "kAllV0Tracks"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPassV0DauTrackSel, "kPassV0DauTrackSel"); + histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPassV0KinCuts, "kPassV0KinCuts"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPassV0TopoSel, "kPassV0TopoSel"); - histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPassV0TopoKinCuts, "kPassV0TopoKinCuts"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kNotLambdaNotAntiLambda, "kNotLambdaNotAntiLambda"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kV0AsLambdaAntiLambda, "kV0AsLambdaAntiLambda"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPassV0MassWinCuts, "kPassV0MassWinCuts"); @@ -489,6 +490,18 @@ struct LambdaTableProducer { histos.fill(HIST("Tracks/h1f_tracks_info"), kPassV0DauTrackSel); + // pT cut + if (v0.pt() <= cMinV0Pt || v0.pt() >= cMaxV0Pt) { + return false; + } + + // rapidity cut + if (std::abs(v0.yLambda()) >= cMaxV0Rap) { + return false; + } + + histos.fill(HIST("Tracks/h1f_tracks_info"), kPassV0KinCuts); + if (v0.dcaV0daughters() <= cMinV0DcaDaughters || v0.dcaV0daughters() >= cMaxV0DcaDaughters) { return false; } @@ -522,16 +535,6 @@ struct LambdaTableProducer { histos.fill(HIST("Tracks/h1f_tracks_info"), kPassV0TopoSel); - // pT cut - if (v0.pt() <= cMinV0Pt || v0.pt() >= cMaxV0Pt) { - return false; - } - - // rapidity cut - if (std::abs(v0.yLambda()) >= cMaxV0Rap) { - return false; - } - // all selection criterion passed (Return True) return true; } @@ -607,6 +610,8 @@ struct LambdaTableProducer { return true; } + histos.fill(HIST("Tracks/h1f_tracks_info"), 23.5); + return false; } @@ -688,16 +693,17 @@ struct LambdaTableProducer { TObject* obj = reinterpret_cast(ccdbObj->FindObject(Form("%s", vCorrFactStrings[cCorrFactHist][part].c_str()))); TH1F* hist = reinterpret_cast(obj->Clone()); float retVal = 0.; + float rap = (cDoEtaCorr) ? v0.eta() : v0.yLambda(); if (std::string(obj->ClassName()) == "TH1F") { histos.fill(HIST("Tracks/h1f_tracks_info"), kEffCorrPt); retVal = hist->GetBinContent(hist->FindBin(v0.pt())); } else if (std::string(obj->ClassName()) == "TH2F") { histos.fill(HIST("Tracks/h1f_tracks_info"), kEffCorrPtRap); - retVal = hist->GetBinContent(hist->FindBin(v0.pt(), v0.yLambda())); + retVal = hist->GetBinContent(hist->FindBin(v0.pt(), rap)); } else if (std::string(obj->ClassName()) == "TH3F") { histos.fill(HIST("Tracks/h1f_tracks_info"), kEffCorrPtRapVz); - retVal = hist->GetBinContent(hist->FindBin(v0.pt(), v0.yLambda(), col.posZ())); + retVal = hist->GetBinContent(hist->FindBin(v0.pt(), rap, col.posZ())); } else { histos.fill(HIST("Tracks/h1f_tracks_info"), kNoEffCorr); LOGF(warning, "CCDB OBJECT IS NOT A HISTOGRAM !!!"); @@ -808,8 +814,6 @@ struct LambdaTableProducer { continue; } - histos.fill(HIST("Tracks/h1f_tracks_info"), kPassV0TopoKinCuts); - // select v0 as lambda / anti-lambda // armeteros-podolanski selection | kshort mass rejection hypothesis if (!selLambdaMassWindow(v0, tracks, v0type)) { @@ -888,7 +892,7 @@ struct LambdaTableProducer { PROCESS_SWITCH(LambdaTableProducer, processMCRecoRun2, "Process for Run2 MC Reconstructed", false); - void processMCGen(aod::McCollisions::iterator const& mcCollision, aod::McParticles const& mcParticles) + void processMCGen(soa::Join::iterator const& mcCollision, aod::McParticles const& mcParticles) { histos.fill(HIST("McGen/h1f_collisions_info"), 1.5); @@ -899,7 +903,7 @@ struct LambdaTableProducer { histos.fill(HIST("McGen/h1f_collisions_info"), 2.5); histos.fill(HIST("McGen/h1f_collision_posZ"), mcCollision.posZ()); - lambdaMCGenCollisionTable(-999., mcCollision.posX(), mcCollision.posY(), mcCollision.posZ()); + lambdaMCGenCollisionTable(mcCollision.centFT0M(), mcCollision.posX(), mcCollision.posY(), mcCollision.posZ()); // initialize track objects ParticleType v0type = kLambda; @@ -934,11 +938,19 @@ struct LambdaTableProducer { } auto dautracks = mcpart.template daughters_as(); std::vector daughterPDGs, daughterIDs; + bool dauKinCutFlag = true; for (auto const& dautrack : dautracks) { + // check kinematic selection on daughters as well + if (dautrack.pt() <= cTrackMinPt || dautrack.pt() >= cTrackMaxPt || std::abs(dautrack.eta()) >= cTrackEtaCut) { + dauKinCutFlag = false; + } daughterPDGs.push_back(dautrack.pdgCode()); daughterIDs.push_back(dautrack.globalIndex()); } - if (cGenDecayChannel && (std::abs(daughterPDGs[0]) != kProton || std::abs(daughterPDGs[1]) != kPiPlus)) { + if (!dauKinCutFlag) { // check daughter acceptance + continue; + } + if (cGenDecayChannel && (std::abs(daughterPDGs[0]) != kProton || std::abs(daughterPDGs[1]) != kPiPlus)) { // check decay channel continue; } @@ -1126,24 +1138,14 @@ struct LambdaR2Correlation { Configurable cNRapBins{"cNRapBins", 12, "N Rapidity Bins"}; Configurable cMinRap{"cMinRap", -0.6, "Minimum Rapidity"}; Configurable cMaxRap{"cMaxRap", 0.6, "Maximum Rapidity"}; - Configurable cNPhiBins{"cNPhiBins", 32, "N Phi Bins"}; + Configurable cNPhiBins{"cNPhiBins", 36, "N Phi Bins"}; - // Efficiency Correction Flags - Configurable cPairCorrectionFlag{"cPairCorrectionFlag", false, "Pair Correction Flag"}; - Configurable cPairCorrectionHist{"cPairCorrectionHist", 0, "Pair Correction Hist"}; - Configurable cCorrFactFlag{"cCorrFactFlag", false, "Correction Factor Flag (Pair or Product of Single)"}; + // Eta/Rap Analysis + Configurable cDoEtaAnalysis{"cDoEtaAnalysis", false, "Eta/Rap Analysis Flag"}; - // Event Mixing. - Configurable cNumMixEv{"cNumMixEv", 10, "Number of Events to be mixed"}; - ConfigurableAxis cMixVzBins{"cMixVzBins", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing Bins Vz"}; - ConfigurableAxis cMixMultBins{"cMixMultBins", {VARIABLE_WIDTH, 0.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 60.0f, 80.0f, 100.0f}, "Mixing Bins Multiplicity"}; - - // CCDB - Configurable cUrlCCDB{"cUrlCCDB", "http://ccdb-test.cern.ch:8080", "url of ccdb"}; - Configurable cPathCCDB{"cPathCCDB", "Users/y/ypatley/lambda_corr_fact", "Path for ccdb-object"}; - - // Initialize CCDB Service - Service ccdb; + // Rotation Angle Min/Max + Configurable cRotAngleMin{"cRotAngleMin", -0.12, "Rotation Angle Minimum"}; + Configurable cRotAngleMax{"cRotAngleMax", 0.12, "Rotation Angle Minimum"}; // Histogram Registry. HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -1158,19 +1160,10 @@ struct LambdaR2Correlation { float rapbinwidth = 0.; float phibinwidth = 0.; float q = 0., e = 0., qinv = 0.; - float dRap = 0., dPhi = 0.; - - // initialize corr_factor objects - std::vector vPairCorrFactStrings = {"hEffVsPtPtDRapLambdaAntiLambda", - "hEffVsPtPtDRapLambdaLambda", - "hEffVsPtPtDRapAntiLambdaAntiLambda"}; + TRandom* ran = new TRandom(); void init(InitContext const&) { - // Set CCDB url - ccdb->setURL(cUrlCCDB.value); - ccdb->setCaching(true); - // Set Density Histogram Attributes nrapbins = static_cast(cNRapBins); kminrap = static_cast(cMinRap); @@ -1185,30 +1178,27 @@ struct LambdaR2Correlation { float kmaxrapphi = knrapphibins; const AxisSpec axisCheck(1, 0, 1, ""); - const AxisSpec axisPosZ(200, -10, 10, "V_{z} (cm)"); - const AxisSpec axisCent(100, 0, 100, "FT0M (%)"); + const AxisSpec axisPosZ(220, -11, 11, "V_{z} (cm)"); + const AxisSpec axisCent(105, 0, 105, "FT0M (%)"); const AxisSpec axisMult(10, 0, 10, "N_{#Lambda}"); const AxisSpec axisMass(100, 1.06, 1.16, "Inv Mass (GeV/#it{c}^{2})"); const AxisSpec axisPt(cNPtBins, cMinPt, cMaxPt, "p_{T} (GeV/#it{c})"); - const AxisSpec axisEta(24, -1.2, 1.2, "#eta"); + const AxisSpec axisEta(cNRapBins, cMinRap, cMaxRap, "#eta"); const AxisSpec axisRap(cNRapBins, cMinRap, cMaxRap, "y"); const AxisSpec axisPhi(cNPhiBins, 0., TwoPI, "#phi (rad)"); const AxisSpec axisRapPhi(knrapphibins, kminrapphi, kmaxrapphi, "y #phi"); const AxisSpec axisQinv(100, 0, 10, "q_{inv} (GeV/#it{c})"); - const AxisSpec axisDRap(2 * cNRapBins - 1., 2 * cMinRap, 2 * cMaxRap, "#Deltay"); - const AxisSpec axisDPhi(cNPhiBins, -PIHalf, 3. * PIHalf, "#Delta#varphi"); const AxisSpec axisEfPt(cNPtBins, cMinPt, cMaxPt, "p_{T}"); + const AxisSpec axisEfEta(cNRapBins, cMinRap, cMaxRap, "#eta"); const AxisSpec axisEfRap(cNRapBins, cMinRap, cMaxRap, "y"); - const AxisSpec axisEfDRap(2 * cNRapBins, 2 * cMinRap, 2 * cMaxRap, "#Deltay"); const AxisSpec axisEfPosZ(10, -10., 10., "V_{Z}"); - const AxisSpec axisEfCent(10, 0, 100, "FT0M (%)"); + const AxisSpec axisEfCent(10, 0, 100, "FT0M(%)"); // Create Histograms. // Event histos.add("Event/Reco/h1f_collision_posz", "V_{Z} Distribution", kTH1F, {axisPosZ}); histos.add("Event/Reco/h1f_ft0m_mult_percentile", "FT0M (%)", kTH1F, {axisCent}); - histos.add("Event/Reco/h1f_mixevent_cntr", "Mix Event Counter", kTH1F, {axisCheck}); histos.add("Event/Reco/h1i_lambda_mult", "#Lambda - Multiplicity", kTH1I, {axisMult}); histos.add("Event/Reco/h1i_antilambda_mult", "#bar{#Lambda} - Multiplicity", kTH1I, {axisMult}); @@ -1216,19 +1206,15 @@ struct LambdaR2Correlation { // Single Particle Efficiencies histos.add("Reco/Efficiency/h1f_n1_pt_LaP", "#rho_{1}^{#Lambda}", kTH1F, {axisEfPt}); histos.add("Reco/Efficiency/h1f_n1_pt_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH1F, {axisEfPt}); + histos.add("Reco/Efficiency/h2f_n1_pteta_LaP", "#rho_{1}^{#Lambda}", kTH2F, {axisEfPt, axisEfEta}); + histos.add("Reco/Efficiency/h2f_n1_pteta_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH2F, {axisEfPt, axisEfEta}); histos.add("Reco/Efficiency/h2f_n1_ptrap_LaP", "#rho_{1}^{#Lambda}", kTH2F, {axisEfPt, axisEfRap}); histos.add("Reco/Efficiency/h2f_n1_ptrap_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH2F, {axisEfPt, axisEfRap}); + histos.add("Reco/Efficiency/h4f_n1_ptetavzmult_LaP", "#rho_{1}^{#Lambda}", kTHnSparseF, {axisEfPt, axisEfEta, axisEfPosZ, axisEfCent}); + histos.add("Reco/Efficiency/h4f_n1_ptetavzmult_LaM", "#rho_{1}^{#bar{#Lambda}}", kTHnSparseF, {axisEfPt, axisEfEta, axisEfPosZ, axisEfCent}); histos.add("Reco/Efficiency/h4f_n1_ptrapvzmult_LaP", "#rho_{1}^{#Lambda}", kTHnSparseF, {axisEfPt, axisEfRap, axisEfPosZ, axisEfCent}); histos.add("Reco/Efficiency/h4f_n1_ptrapvzmult_LaM", "#rho_{1}^{#bar{#Lambda}}", kTHnSparseF, {axisEfPt, axisEfRap, axisEfPosZ, axisEfCent}); - // Two Particle Efficiencies - histos.add("Reco/Efficiency/h2f_n2_ptpt_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2F, {axisEfPt, axisEfPt}); - histos.add("Reco/Efficiency/h2f_n2_ptpt_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2F, {axisEfPt, axisEfPt}); - histos.add("Reco/Efficiency/h2f_n2_ptpt_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2F, {axisEfPt, axisEfPt}); - histos.add("Reco/Efficiency/h3f_n2_ptptdrap_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH3F, {axisEfPt, axisEfPt, axisEfDRap}); - histos.add("Reco/Efficiency/h3f_n2_ptptdrap_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH3F, {axisEfPt, axisEfPt, axisEfDRap}); - histos.add("Reco/Efficiency/h3f_n2_ptptdrap_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH3F, {axisEfPt, axisEfPt, axisEfDRap}); - // Single and Two Particle Densities // 1D Histograms histos.add("Reco/h1d_n1_mass_LaP", "#rho_{1}^{#Lambda}", kTH1D, {axisMass}); @@ -1242,48 +1228,22 @@ struct LambdaR2Correlation { histos.add("Reco/h1d_n1_phi_LaP", "#rho_{1}^{#Lambda}", kTH1D, {axisPhi}); histos.add("Reco/h1d_n1_phi_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH1D, {axisPhi}); - // 2D Histograms for Pairs - histos.add("Reco/h2d_n2_ptpt_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisPt, axisPt}); - histos.add("Reco/h2d_n2_ptpt_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisPt, axisPt}); - histos.add("Reco/h2d_n2_ptpt_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisPt, axisPt}); - histos.add("Reco/h2d_n2_raprap_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisRap, axisRap}); - histos.add("Reco/h2d_n2_raprap_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisRap, axisRap}); - histos.add("Reco/h2d_n2_raprap_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisRap, axisRap}); - histos.add("Reco/h2d_n2_phiphi_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisPhi, axisPhi}); - histos.add("Reco/h2d_n2_phiphi_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisPhi, axisPhi}); - histos.add("Reco/h2d_n2_phiphi_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisPhi, axisPhi}); - - // Rho1 for R2 rapphi Histograms + // rho1 for R2 RapPhi histograms histos.add("Reco/h2d_n1_rapphi_LaP", "#rho_{1}^{#Lambda}", kTH2D, {axisRap, axisPhi}); histos.add("Reco/h2d_n1_rapphi_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH2D, {axisRap, axisPhi}); - // Rho1 for R2 qinv Histograms - histos.add("Reco/h2d_n1_ptrap_LaP", "#rho_{1}^{#Lambda}", kTH2D, {axisPt, axisRap}); - histos.add("Reco/h2d_n1_ptrap_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH2D, {axisPt, axisRap}); - - // Rho2 for R2 rapphi Histograms - histos.add("Reco/h2d_n2_rapphi_LaP_LaM", "#rho_{2}^{#Lambda - #bar{#Lambda}}", kTH2D, {axisRapPhi, axisRapPhi}); - histos.add("Reco/h2d_n2_rapphi_LaP_LaP", "#rho_{2}^{#Lambda - #Lambda}", kTH2D, {axisRapPhi, axisRapPhi}); - histos.add("Reco/h2d_n2_rapphi_LaM_LaM", "#rho_{2}^{#bar{#Lambda} - #bar{#Lambda}}", kTH2D, {axisRapPhi, axisRapPhi}); - - // Rho2 for R2 Qinv Histograms - histos.add("Reco/h1d_n2_qinv_LaP_LaM", "#rho_{2}^{#Lambda-#bar{#Lambda}}", kTH1D, {axisQinv}); - histos.add("Reco/h1d_n2_qinv_LaP_LaP", "#rho_{2}^{#Lambda-#Lambda}", kTH1D, {axisQinv}); - histos.add("Reco/h1d_n2_qinv_LaM_LaM", "#rho_{2}^{#bar{#Lambda}-#bar{#Lambda}}", kTH1D, {axisQinv}); - - // Mixed Event Histograms - histos.add("Reco/Same/h2d_n2_drapdphi_LaP_LaM", "#rho_{2}^{#Lambda-#bar{#Lambda}}(#Deltay,#Delta#varphi)", kTH2D, {axisDRap, axisDPhi}); - histos.add("Reco/Same/h2d_n2_drapdphi_LaP_LaP", "#rho_{2}^{#Lambda-#Lambda}(#Deltay,#Delta#varphi)", kTH2D, {axisDRap, axisDPhi}); - histos.add("Reco/Same/h2d_n2_drapdphi_LaM_LaM", "#rho_{2}^{#bar{#Lambda}-#bar{#Lambda}}(#Deltay,#Delta#varphi)", kTH2D, {axisDRap, axisDPhi}); - histos.add("Reco/Same/h1d_n2_qinv_LaP_LaM", "#rho_{2}^{#Lambda-#bar{#Lambda}}(q_{inv})", kTH1D, {axisQinv}); - histos.add("Reco/Same/h1d_n2_qinv_LaP_LaP", "#rho_{2}^{#Lambda-#Lambda}(q_{inv})", kTH1D, {axisQinv}); - histos.add("Reco/Same/h1d_n2_qinv_LaM_LaM", "#rho_{2}^{#bar{#Lambda}-#bar{#Lambda}}(q_{inv})", kTH1D, {axisQinv}); - histos.add("Reco/Mixed/h2d_n2_drapdphi_LaP_LaM", "#rho_{2}^{#Lambda-#bar{#Lambda}}(#Deltay,#Delta#varphi)", kTH2D, {axisDRap, axisDPhi}); - histos.add("Reco/Mixed/h2d_n2_drapdphi_LaP_LaP", "#rho_{2}^{#Lambda-#Lambda}(#Deltay,#Delta#varphi)", kTH2D, {axisDRap, axisDPhi}); - histos.add("Reco/Mixed/h2d_n2_drapdphi_LaM_LaM", "#rho_{2}^{#bar{#Lambda}-#bar{#Lambda}}(#Deltay,#Delta#varphi)", kTH2D, {axisDRap, axisDPhi}); - histos.add("Reco/Mixed/h1d_n2_qinv_LaP_LaM", "#rho_{2}^{#Lambda-#bar{#Lambda}}(q_{inv})", kTH1D, {axisQinv}); - histos.add("Reco/Mixed/h1d_n2_qinv_LaP_LaP", "#rho_{2}^{#Lambda-#Lambda}(q_{inv})", kTH1D, {axisQinv}); - histos.add("Reco/Mixed/h1d_n2_qinv_LaM_LaM", "#rho_{2}^{#bar{#Lambda}-#bar{#Lambda}}(q_{inv})", kTH1D, {axisQinv}); + // rho2 for R2 Rap1Phi1Rap2Phi2 histograms + histos.add("Reco/h2d_n2_rapphi_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisRapPhi, axisRapPhi}); + histos.add("Reco/h2d_n2_rapphi_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisRapPhi, axisRapPhi}); + histos.add("Reco/h2d_n2_rapphi_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisRapPhi, axisRapPhi}); + + // rho2 for R2 Qinv histograms + histos.add("Reco/h1d_n2_qinv_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH1D, {axisQinv}); + histos.add("Reco/h1d_n2_qinv_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH1D, {axisQinv}); + histos.add("Reco/h1d_n2_qinv_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH1D, {axisQinv}); + histos.add("Reco/h1d_n1n1_qinv_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH1D, {axisQinv}); + histos.add("Reco/h1d_n1n1_qinv_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH1D, {axisQinv}); + histos.add("Reco/h1d_n1n1_qinv_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH1D, {axisQinv}); // MCGen if (doprocessMCGen) { @@ -1292,101 +1252,45 @@ struct LambdaR2Correlation { } } - template - float getPairCorrFactors(T const& p1, T const& p2) - { - // Check for efficiency correction flag and Rec/Gen Data - if (!cPairCorrectionFlag || rec_gen == kGen) { - return 1.; - } - - // Get from CCDB - auto ccdbObj = ccdb->getForTimeStamp(cPathCCDB.value, -1); - - // Check CCDB Object - if (!ccdbObj) { - LOGF(warning, "CCDB OBJECT NOT FOUND"); - return 1.; - } - - // get ccdb object - TObject* obj = reinterpret_cast(ccdbObj->FindObject(Form("%s", vPairCorrFactStrings[part_pair].c_str()))); - TH1F* hist = reinterpret_cast(obj->Clone()); - float retVal = 0., dRap = p1.rap() - p2.rap(); - - if (std::string(obj->ClassName()) == "TH2F") { - retVal = hist->GetBinContent(hist->FindBin(p1.pt(), p2.pt())); - } else if (std::string(obj->ClassName()) == "TH3F") { - retVal = hist->GetBinContent(hist->FindBin(p1.pt(), p2.pt(), dRap)); - } else { - LOGF(warning, "CCDB OBJECT IS NOT A HISTOGRAM !!!"); - retVal = 1.; - } - - delete hist; - return retVal; - } - template - void fillPairHistSameEventMethod(U& p1, U& p2) + void fillPairHistos(U& p1, U& p2) { static constexpr std::string_view SubDirRecGen[] = {"Reco/", "McGen/"}; static constexpr std::string_view SubDirHist[] = {"LaP_LaM", "LaP_LaP", "LaM_LaM"}; - int rapbin1 = static_cast((p1.rap() - kminrap) / rapbinwidth); - int rapbin2 = static_cast((p2.rap() - kminrap) / rapbinwidth); - int phibin1 = static_cast(p1.phi() / phibinwidth); - int phibin2 = static_cast(p2.phi() / phibinwidth); + float rap1 = (cDoEtaAnalysis) ? p1.eta() : p1.rap(); + float rap2 = (cDoEtaAnalysis) ? p2.eta() : p2.rap(); - float pairCorrFact = 1.; + int rapbin1 = static_cast((rap1 - kminrap) / rapbinwidth); + int rapbin2 = static_cast((rap2 - kminrap) / rapbinwidth); - if (!cCorrFactFlag) { - pairCorrFact = getPairCorrFactors(p1, p2); - } else { - pairCorrFact = p1.corrFact() * p2.corrFact(); - } - - // Efficiency Histograms - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("Efficiency/h2f_n2_ptpt_") + HIST(SubDirHist[part_pair]), p1.pt(), p2.pt()); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("Efficiency/h3f_n2_ptptdrap_") + HIST(SubDirHist[part_pair]), p1.pt(), p2.pt(), (p1.rap() - p2.rap())); + int phibin1 = static_cast(p1.phi() / phibinwidth); + int phibin2 = static_cast(p2.phi() / phibinwidth); - // QA Histogrms - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n2_ptpt_") + HIST(SubDirHist[part_pair]), p1.pt(), p2.pt(), pairCorrFact); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n2_raprap_") + HIST(SubDirHist[part_pair]), p1.rap(), p2.rap(), pairCorrFact); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n2_phiphi_") + HIST(SubDirHist[part_pair]), p1.phi(), p2.phi(), pairCorrFact); + float corfac = p1.corrFact() * p2.corrFact(); if (rapbin1 >= 0 && rapbin2 >= 0 && phibin1 >= 0 && phibin2 >= 0 && rapbin1 < nrapbins && rapbin2 < nrapbins && phibin1 < nphibins && phibin2 < nphibins) { int rapphix = rapbin1 * nphibins + phibin1; int rapphiy = rapbin2 * nphibins + phibin2; - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n2_rapphi_") + HIST(SubDirHist[part_pair]), rapphix + 0.5, rapphiy + 0.5, pairCorrFact); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n2_rapphi_") + HIST(SubDirHist[part_pair]), rapphix + 0.5, rapphiy + 0.5, corfac); } - // Qinv Histograms + // qinv histograms q = RecoDecay::p((p1.px() - p2.px()), (p1.py() - p2.py()), (p1.pz() - p2.pz())); e = RecoDecay::e(p1.px(), p1.py(), p1.pz(), MassLambda0) - RecoDecay::e(p2.px(), p2.py(), p2.pz(), MassLambda0); qinv = std::sqrt(-RecoDecay::m2(q, e)); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h1d_n2_qinv_") + HIST(SubDirHist[part_pair]), qinv, pairCorrFact); - } - - template - void fillPairHistMixEventMethod(T const& p1, T const& p2) - { - static constexpr std::string_view SubDirRecGen[] = {"Reco/", "McGen/"}; - static constexpr std::string_view SubDirSameMix[] = {"Same/", "Mixed/"}; - static constexpr std::string_view SubDirHist[] = {"LaP_LaM", "LaP_LaP", "LaM_LaM"}; - - float corrFact = p1.corrFact() * p2.corrFact(); - - dRap = p1.rap() - p2.rap(); - dPhi = RecoDecay::constrainAngle((p1.phi() - p2.phi()), -PIHalf); - q = RecoDecay::p((p1.px() - p2.px()), (p1.py() - p2.py()), (p1.pz() - p2.pz())); - e = RecoDecay::e(p1.px(), p1.py(), p1.pz(), MassLambda0) - RecoDecay::e(p2.px(), p2.py(), p2.pz(), MassLambda0); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h1d_n2_qinv_") + HIST(SubDirHist[part_pair]), qinv, corfac); + + // Rotate momentum vector about z-axis to get N1N1_Qinv Histograms + float ranPhi = ran->Uniform(cRotAngleMin, cRotAngleMax); + float p2x = p2.pt() * std::cos(RecoDecay::constrainAngle((p2.phi() + ranPhi), 0)); + float p2y = p2.pt() * std::sin(RecoDecay::constrainAngle((p2.phi() + ranPhi), 0)); + q = RecoDecay::p((p1.px() - p2x), (p1.py() - p2y), (p1.pz() - p2.pz())); + e = RecoDecay::e(p1.px(), p1.py(), p1.pz(), MassLambda0) - RecoDecay::e(p2x, p2y, p2.pz(), MassLambda0); qinv = std::sqrt(-RecoDecay::m2(q, e)); - - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirSameMix[sm]) + HIST("h2d_n2_drapdphi_") + HIST(SubDirHist[part_pair]), dRap, dPhi, corrFact); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirSameMix[sm]) + HIST("h1d_n2_qinv_") + HIST(SubDirHist[part_pair]), qinv, corrFact); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h1d_n1n1_qinv_") + HIST(SubDirHist[part_pair]), qinv, corfac); } template @@ -1408,13 +1312,14 @@ struct LambdaR2Correlation { histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h1d_n1_phi_") + HIST(SubDirHist[part]), track.phi(), track.corrFact()); histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h1d_n1_rap_") + HIST(SubDirHist[part]), track.rap(), track.corrFact()); - // Efficiency Calculation Plots + // Efficiency Plots histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("Efficiency/h1f_n1_pt_") + HIST(SubDirHist[part]), track.pt()); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("Efficiency/h2f_n1_pteta_") + HIST(SubDirHist[part]), track.pt(), track.eta()); histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("Efficiency/h2f_n1_ptrap_") + HIST(SubDirHist[part]), track.pt(), track.rap()); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("Efficiency/h4f_n1_ptetavzmult_") + HIST(SubDirHist[part]), track.pt(), track.eta(), col.posZ(), col.cent()); histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("Efficiency/h4f_n1_ptrapvzmult_") + HIST(SubDirHist[part]), track.pt(), track.rap(), col.posZ(), col.cent()); - // Rho1 for R2 Calculation - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n1_ptrap_") + HIST(SubDirHist[part]), track.pt(), track.rap(), track.corrFact()); + // Rho1 for N1RapPhi histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n1_rapphi_") + HIST(SubDirHist[part]), track.rap(), track.phi(), track.corrFact()); } @@ -1428,47 +1333,20 @@ struct LambdaR2Correlation { } } - template - void analyzeSameEventPairs(T const& tracks1, T const& tracks2) + template + void analyzePairs(T const& trks_1, T const& trks_2) { - for (auto const& track1 : tracks1) { - for (auto const& track2 : tracks2) { + for (auto const& trk_1 : trks_1) { + for (auto const& trk_2 : trks_2) { // check for same index for Lambda-Lambda / AntiLambda-AntiLambda - if (samelambda && ((track1.index() == track2.index()))) { - continue; - } - fillPairHistMixEventMethod(track1, track2); - fillPairHistSameEventMethod(track1, track2); - } - } - } - - template - void analyzeMixEventPairs(T const& tracks1, T const& tracks2) - { - for (auto const& track1 : tracks1) { - if (!track1.trueLambdaFlag()) { // Check for True Lambda - continue; - } - for (auto const& track2 : tracks2) { - if (!track2.trueLambdaFlag()) { // Check for True Lambda - continue; - } - // Analyze Pairs - if (track1.v0Type() == kLambda && track2.v0Type() == kAntiLambda) { // Lambda-AntiLambda - fillPairHistMixEventMethod(track1, track2); - } else if (track1.v0Type() == kLambda && track2.v0Type() == kLambda) { // Lambda-Lambda - fillPairHistMixEventMethod(track1, track2); - } else if (track1.v0Type() == kAntiLambda && track2.v0Type() == kAntiLambda) { // AntiLambda-AntiLambda - fillPairHistMixEventMethod(track1, track2); - } else { + if (samelambda && ((trk_1.index() == trk_2.index()))) { continue; } + fillPairHistos(trk_1, trk_2); } } } - // Process Same Event Data and McRec using LambdaCollisions = aod::LambdaCollisions; using LambdaTracks = soa::Join; @@ -1486,31 +1364,13 @@ struct LambdaR2Correlation { analyzeSingles(collision, lambdaTracks); analyzeSingles(collision, antiLambdaTracks); - analyzeSameEventPairs(lambdaTracks, antiLambdaTracks); - analyzeSameEventPairs(lambdaTracks, lambdaTracks); - analyzeSameEventPairs(antiLambdaTracks, antiLambdaTracks); + analyzePairs(lambdaTracks, antiLambdaTracks); + analyzePairs(lambdaTracks, lambdaTracks); + analyzePairs(antiLambdaTracks, antiLambdaTracks); } PROCESS_SWITCH(LambdaR2Correlation, processDataReco, "Process for Data and MCReco", true); - // Process Mix Event Data and McRec - SliceCache cacheMix; - using BinningVzMult = ColumnBinningPolicy; - BinningVzMult binningOnVtxZAndMult{{cMixVzBins, cMixMultBins}, true}; - - void processDataRecoMix(aod::LambdaCollisions const& collisions, soa::Join const& lambdaTracks) - { - auto tracksTuple = std::make_tuple(lambdaTracks); - SameKindPair, BinningVzMult> pairs{binningOnVtxZAndMult, cNumMixEv, -1, collisions, tracksTuple, &cacheMix}; - for (auto const& [collision1, tracks1, collision2, tracks2] : pairs) { - analyzeMixEventPairs(tracks1, tracks2); - histos.fill(HIST("Event/Reco/h1f_mixevent_cntr"), 0.5); - } - } - - PROCESS_SWITCH(LambdaR2Correlation, processDataRecoMix, "Process for Data and MCReco Mixed Events", false); - - // Process Same Event McGen using LambdaMcGenCollisions = aod::LambdaMcGenCollisions; using LambdaMcGenTracks = aod::LambdaMcGenTracks; @@ -1521,15 +1381,16 @@ struct LambdaR2Correlation { void processMCGen(LambdaMcGenCollisions::iterator const& mcgencol, LambdaMcGenTracks const&) { histos.fill(HIST("Event/McGen/h1f_collision_posz"), mcgencol.posZ()); + histos.fill(HIST("Event/McGen/h1f_ft0m_mult_percentile"), mcgencol.cent()); auto lambdaMcGenTracks = partLambdaMcGenTracks->sliceByCached(aod::lambdamcgentrack::lambdaMcGenCollisionId, mcgencol.globalIndex(), cachemc); auto antiLambdaMcGenTracks = partAntiLambdaMcGenTracks->sliceByCached(aod::lambdamcgentrack::lambdaMcGenCollisionId, mcgencol.globalIndex(), cachemc); analyzeSingles(mcgencol, lambdaMcGenTracks); analyzeSingles(mcgencol, antiLambdaMcGenTracks); - analyzeSameEventPairs(lambdaMcGenTracks, antiLambdaMcGenTracks); - analyzeSameEventPairs(lambdaMcGenTracks, lambdaMcGenTracks); - analyzeSameEventPairs(antiLambdaMcGenTracks, antiLambdaMcGenTracks); + analyzePairs(lambdaMcGenTracks, antiLambdaMcGenTracks); + analyzePairs(lambdaMcGenTracks, lambdaMcGenTracks); + analyzePairs(antiLambdaMcGenTracks, antiLambdaMcGenTracks); } PROCESS_SWITCH(LambdaR2Correlation, processMCGen, "Process for MC Generated", false); From d62e7ece7076de0aafda36d467aa0ef882dcdfc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Wed, 5 Feb 2025 23:54:23 +0100 Subject: [PATCH 0061/1650] [PWGLF] Update K0ME MC (#9774) --- PWGLF/Tasks/Strangeness/k0_mixed_events.cxx | 107 ++++++++++++-------- 1 file changed, 65 insertions(+), 42 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx b/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx index 88283cf650c..b2218883cb8 100644 --- a/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx +++ b/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx @@ -39,6 +39,8 @@ #include "PWGCF/Femto3D/Core/femto3dPairTask.h" #include "Common/DataModel/Centrality.h" #include "PWGLF/DataModel/mcCentrality.h" +#include "Framework/O2DatabasePDGPlugin.h" +#include "PWGLF/Utils/inelGt.h" using namespace o2; using namespace o2::soa; @@ -128,7 +130,6 @@ struct K0MixedEvents { Configurable _dphi{"dphi", 1, "minimum allowed defference in phi_star between two tracks in a pair"}; Configurable _radiusTPC{"radiusTPC", 1.2, "TPC radius to calculate phi_star for"}; - Configurable useCentralityInvMass{"useCentralityInvMass", true, "Use the centrality vs inv. mass plots"}; Configurable doMixedEvent{"doMixedEvent", false, "Do the mixed event"}; Configurable _multbinwidth{"multbinwidth", 50, "width of multiplicity bins within which the mixing is done"}; Configurable _vertexbinwidth{"vertexbinwidth", 2, "width of vertexZ bins within which the mixing is done"}; @@ -203,20 +204,13 @@ struct K0MixedEvents { registry.add("VTXc", "VTXc", kTH1D, {{100, -20., 20., "vtx"}}); registry.add("VTX", "VTX", kTH1D, {{100, -20., 20., "vtx"}}); registry.add("multPerc", "multPerc", kTH1D, {multPercentileAxis}); + registry.add("SEcand", "SEcand", kTH1D, {{2, 0.5, 2.5}}); registry.add("SE", "SE", kTH1D, {invMassAxis}); registry.add("ME", "ME", kTH1D, {invMassAxis}); - if (useCentralityInvMass) { - registry.add("SEvsPt", "SEvsPt", kTH3F, {invMassAxis, ptAxis, multPercentileAxis}); - } else { - registry.add("SEvsPt", "SEvsPt", kTH2D, {invMassAxis, ptAxis}); - } + registry.add("SEvsPt", "SEvsPt", kTH3F, {invMassAxis, ptAxis, multPercentileAxis}); if (doMixedEvent) { - if (useCentralityInvMass) { - registry.add("MEvsPt", "MEvsPt", kTH3F, {invMassAxis, ptAxis, multPercentileAxis}); - } else { - registry.add("MEvsPt", "MEvsPt", kTH2D, {invMassAxis, ptAxis}); - } + registry.add("MEvsPt", "MEvsPt", kTH3F, {invMassAxis, ptAxis, multPercentileAxis}); } registry.add("eta", Form("eta_%i", _particlePDG_1.value), kTH2F, {ptAxis, {100, -10., 10., "#eta"}}); registry.add("p_first", Form("p_%i", _particlePDG_1.value), kTH1D, {ptAxis}); @@ -233,14 +227,14 @@ struct K0MixedEvents { registry.add("rapidity_second", Form("rapidity_%i", _particlePDG_2.value), kTH2F, {ptAxis, {100, -10., 10., Form("y(%s)", pdgToSymbol(_particlePDG_2))}}); } - if (!doprocessMCReco) { + if (!doprocessMC) { return; } - if (useCentralityInvMass) { - registry.add("MC/generatedInRecoEvs", "generatedInRecoEvs", kTH2D, {ptAxis, multPercentileAxis}); - } else { - registry.add("MC/generatedInRecoEvs", "generatedInRecoEvs", kTH2D, {ptAxis}); - } + registry.add("MC/multPerc", "multPerc", kTH1D, {multPercentileAxis}); + registry.add("MC/multPercMC", "multPercMC", kTH1D, {multPercentileAxis}); + registry.add("MC/generatedInRecoEvs", "generatedInRecoEvs", kTH2D, {ptAxis, multPercentileAxis}); + registry.add("MC/generatedInGenEvs", "generatedInGenEvs", kTH2D, {ptAxis, multPercentileAxis}); + registry.add("MC/SEvsPt", "SEvsPt", kTH3F, {invMassAxis, ptAxis, multPercentileAxis}); } template @@ -261,12 +255,8 @@ struct K0MixedEvents { continue; } registry.fill(HIST("SEcand"), 2.f); - registry.fill(HIST("SE"), Pair->getInvMass()); // close pair rejection and fillig the SE histo - if (useCentralityInvMass) { - registry.fill(HIST("SEvsPt"), Pair->getInvMass(), Pair->getPt(), centrality); // close pair rejection and fillig the SE histo - } else { - registry.fill(HIST("SEvsPt"), Pair->getInvMass(), Pair->getPt()); // close pair rejection and fillig the SE histo - } + registry.fill(HIST("SE"), Pair->getInvMass()); // close pair rejection and fillig the SE histo + registry.fill(HIST("SEvsPt"), Pair->getInvMass(), Pair->getPt(), centrality); // close pair rejection and fillig the SE histo } } } @@ -292,18 +282,10 @@ struct K0MixedEvents { if constexpr (isSameEvent) { registry.fill(HIST("SEcand"), 2.f); registry.fill(HIST("SE"), Pair->getInvMass()); - if (useCentralityInvMass) { - registry.fill(HIST("SEvsPt"), Pair->getInvMass(), Pair->getPt(), centrality); - } else { - registry.fill(HIST("SEvsPt"), Pair->getInvMass(), Pair->getPt()); - } + registry.fill(HIST("SEvsPt"), Pair->getInvMass(), Pair->getPt(), centrality); } else { registry.fill(HIST("ME"), Pair->getInvMass()); - if (useCentralityInvMass) { - registry.fill(HIST("MEvsPt"), Pair->getInvMass(), Pair->getPt(), centrality); - } else { - registry.fill(HIST("MEvsPt"), Pair->getInvMass(), Pair->getPt()); - } + registry.fill(HIST("MEvsPt"), Pair->getInvMass(), Pair->getPt(), centrality); } } } @@ -513,17 +495,35 @@ struct K0MixedEvents { using RecoMCCollisions = soa::Join; using GenMCCollisions = soa::Join; - // Service pdgDB; + Service pdgDB; Preslice perMCCol = aod::mcparticle::mcCollisionId; SliceCache cache; - void processMCReco(soa::Filtered const& collisions, - GenMCCollisions const&, - aod::McParticles const& mcParticles) + void processMC(soa::Filtered const& collisions, + // soa::Join const& tracks, + GenMCCollisions const& mcCollisions, + aod::McParticles const& mcParticles) { + + // Loop on reconstructed collisions for (const auto& col : collisions) { + if (!col.sel8()) { + continue; + } + if (std::abs(col.posZ()) > _vertexZ) { + continue; + } if (!col.has_mcCollision()) { continue; } + registry.fill(HIST("MC/multPerc"), col.centFT0M()); + // Loop on tracks + // MC / SEvsPt + + // Loop on particles const auto& mcCollision = col.mcCollision_as(); const auto& particlesInCollision = mcParticles.sliceByCached(aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); for (const auto& mcParticle : particlesInCollision) { @@ -539,16 +539,39 @@ struct K0MixedEvents { if (std::abs(mcParticle.y()) > 0.5) { continue; } - if (useCentralityInvMass) { - registry.fill(HIST("MC/generatedInRecoEvs"), mcParticle.pt(), col.centFT0M()); - } else { - registry.fill(HIST("MC/generatedInRecoEvs"), mcParticle.pt()); + registry.fill(HIST("MC/generatedInRecoEvs"), mcParticle.pt(), col.centFT0M()); + } + } + + // Loop on generated collisions + for (const auto& mcCollision : mcCollisions) { + if (std::abs(mcCollision.posZ()) > _vertexZ) { + continue; + } + const auto& particlesInCollision = mcParticles.sliceByCached(aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); + if (!o2::pwglf::isINELgt0mc(particlesInCollision, pdgDB)) { + continue; + } + registry.fill(HIST("MC/multPercMC"), mcCollision.centFT0M()); + for (const auto& mcParticle : particlesInCollision) { + switch (mcParticle.pdgCode()) { + case 310: + break; + default: + continue; + } + if (mcParticle.pdgCode() != 310) { + LOG(fatal) << "Fatal in PDG"; + } + if (std::abs(mcParticle.y()) > 0.5) { + continue; } + registry.fill(HIST("MC/generatedInGenEvs"), mcParticle.pt(), mcCollision.centFT0M()); } } } - PROCESS_SWITCH(K0MixedEvents, processMCReco, "process mc", false); + PROCESS_SWITCH(K0MixedEvents, processMC, "process mc", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 93ea0aae1ee778b939d9eff15dc0371097e2829c Mon Sep 17 00:00:00 2001 From: alcaliva <32872606+alcaliva@users.noreply.github.com> Date: Thu, 6 Feb 2025 01:01:43 +0100 Subject: [PATCH 0062/1650] [PWGLF] updated jet selection (#9778) --- PWGLF/Tasks/Nuspex/nucleiInJets.cxx | 117 +++++++++++++++------------- 1 file changed, 65 insertions(+), 52 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/nucleiInJets.cxx b/PWGLF/Tasks/Nuspex/nucleiInJets.cxx index b2cc0e58364..ef7c5eadc8c 100644 --- a/PWGLF/Tasks/Nuspex/nucleiInJets.cxx +++ b/PWGLF/Tasks/Nuspex/nucleiInJets.cxx @@ -98,6 +98,8 @@ struct NucleiInJets { Configurable nJetsPerEventMax{"nJetsPerEventMax", 1000, "Maximum number of jets per event"}; Configurable requireNoOverlap{"requireNoOverlap", true, "require no overlap between jets and UE cones"}; Configurable nGhosts{"nGhosts", 1000, "number of ghost particles"}; + Configurable alpha{"alpha", 1.0, "Alpha"}; + Configurable averagePtUE{"averagePtUE", 0.1, "Average pt of UE"}; // Track Parameters Configurable par0{"par0", 0.00164, "par 0"}; @@ -162,10 +164,12 @@ struct NucleiInJets { registryQC.add("sumPtUE", "sumPtUE", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); registryQC.add("nJets_found", "nJets_found", HistType::kTH1F, {{10, 0, 10, "#it{n}_{Jet}"}}); registryQC.add("nJets_selected", "nJets_selected", HistType::kTH1F, {{10, 0, 10, "#it{n}_{Jet}"}}); - registryQC.add("event_selection_jets", "event_selection_jets", HistType::kTH1F, {{10, 0, 10, "counter"}}); registryQC.add("dcaxy_vs_pt", "dcaxy_vs_pt", HistType::kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); registryQC.add("dcaz_vs_pt", "dcaz_vs_pt", HistType::kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{z} (cm)"}}); + registryQC.add("jet_jet_overlaps", "jet_jet_overlaps", HistType::kTH2F, {{20, 0.0, 20.0, "#it{n}_{jet}"}, {200, 0.0, 200.0, "#it{n}_{overlaps}"}}); registryQC.add("jet_ue_overlaps", "jet_ue_overlaps", HistType::kTH2F, {{20, 0.0, 20.0, "#it{n}_{jet}"}, {200, 0.0, 200.0, "#it{n}_{overlaps}"}}); + registryQC.add("ue_ue_overlaps", "ue_ue_overlaps", HistType::kTH2F, {{20, 0.0, 20.0, "#it{n}_{jet}"}, {200, 0.0, 200.0, "#it{n}_{overlaps}"}}); + registryQC.add("tot_overlaps", "tot_overlaps", HistType::kTH2F, {{20, 0.0, 20.0, "#it{n}_{jet}"}, {200, 0.0, 200.0, "#it{n}_{overlaps}"}}); registryQC.add("hJetArea", "hJetArea", HistType::kTH1F, {{450, 0, 15, "Area"}}); // Event Counters @@ -243,7 +247,9 @@ struct NucleiInJets { registryMC.add("antiproton_eta_pt_ue", "antiproton_eta_pt_ue", HistType::kTH2F, {{200, 0.0, 10.0, "#it{p}_{T} (GeV/#it{c})"}, {20, -1.0, 1.0, "#it{#eta}"}}); // Detector Response Matrix - registryMC.add("detectorResponseMatrix", "detectorResponseMatrix", HistType::kTH2F, {{500, 0.0, 50.0, "#it{p}_{T}^{gen} (GeV/#it{c})"}, {500, 0.0, 50.0, "#it{p}_{T}^{rec} (GeV/#it{c})"}}); + if (doprocessDetResponseMatrix) { + registryMC.add("detectorResponseMatrix", "detectorResponseMatrix", HistType::kTH2F, {{5000, 0.0, 50.0, "#it{p}_{T}^{gen} (GeV/#it{c})"}, {5000, 0.0, 50.0, "#it{p}_{T}^{rec} (GeV/#it{c})"}}); + } } // ITS Hit @@ -443,6 +449,12 @@ struct NucleiInJets { return false; } + double getCorrectedPt(double ptRec) + { + // to be developed + return ptRec; + } + void getReweightingHistograms(o2::framework::Service const& ccdbObj, TString filepath, TString histname_antip_jet, TString histname_antip_ue) { TList* l = ccdbObj->get(filepath.Data()); @@ -469,7 +481,6 @@ struct NucleiInJets { { // Event Counter: before event selection registryData.fill(HIST("number_of_events_data"), 0.5); - registryQC.fill(HIST("event_selection_jets"), 0.5); // all events before jet selection // Event Selection if (!collision.sel8()) @@ -490,6 +501,7 @@ struct NucleiInJets { // List of Tracks std::vector trk; + std::vector ntrk; for (auto track : tracks) { // o2-linter: disable=[const-ref-in-for-loop] @@ -500,13 +512,20 @@ struct NucleiInJets { TVector3 momentum(track.px(), track.py(), track.pz()); trk.push_back(momentum); + ntrk.push_back(1); } + // Reject Empty Events + if (static_cast(trk.size()) < 1) + return; + registryData.fill(HIST("number_of_events_data"), 3.5); + // Anti-kt Jet Finder int nParticlesRemoved(0); std::vector jet; std::vector ue1; std::vector ue2; + std::vector nParticlesInjet; do { double dijMin(1e+06), diBmin(1e+06); @@ -532,11 +551,14 @@ struct NucleiInJets { } if (dijMin < diBmin) { trk[iMin] = trk[iMin] + trk[jMin]; + ntrk[iMin] = ntrk[iMin] + ntrk[jMin]; trk[jMin].SetXYZ(0, 0, 0); + ntrk[jMin] = 0; nParticlesRemoved++; } if (dijMin > diBmin) { jet.push_back(trk[iBmin]); + nParticlesInjet.push_back(ntrk[iBmin]); trk[iBmin].SetXYZ(0, 0, 0); nParticlesRemoved++; } @@ -546,14 +568,16 @@ struct NucleiInJets { // Jet Selection std::vector isSelected; - for (int i = 0; i < static_cast(jet.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] - isSelected.push_back(0); - } - int nJetsSelected(0); for (int i = 0; i < static_cast(jet.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] - if ((std::fabs(jet[i].Eta()) + rJet) > maxEta) + // Initialization + isSelected.push_back(0); + + // Jet fully contained inside acceptance + if ((std::fabs(jet[i].Eta()) + rJet) > (maxEta - 0.5)) + continue; + if (nParticlesInjet[i] < minNparticlesInJet) continue; // Perpendicular cones @@ -564,22 +588,13 @@ struct NucleiInJets { ue1.push_back(ueAxis1); ue2.push_back(ueAxis2); - double nPartJetPlusUE(0); - double nPartJet(0); - double nPartUE(0); - double ptJetPlusUE(0); - double ptJet(0); double ptUE(0); - for (auto track : tracks) { // o2-linter: disable=[const-ref-in-for-loop] if (!passedTrackSelectionForJetReconstruction(track)) continue; TVector3 selectedTrack(track.px(), track.py(), track.pz()); - double deltaEtaJet = selectedTrack.Eta() - jet[i].Eta(); - double deltaPhiJet = getDeltaPhi(selectedTrack.Phi(), jet[i].Phi()); - double deltaRjet = std::sqrt(deltaEtaJet * deltaEtaJet + deltaPhiJet * deltaPhiJet); double deltaEtaUe1 = selectedTrack.Eta() - ueAxis1.Eta(); double deltaPhiUe1 = getDeltaPhi(selectedTrack.Phi(), ueAxis1.Phi()); double deltaRUe1 = std::sqrt(deltaEtaUe1 * deltaEtaUe1 + deltaPhiUe1 * deltaPhiUe1); @@ -587,35 +602,24 @@ struct NucleiInJets { double deltaPhiUe2 = getDeltaPhi(selectedTrack.Phi(), ueAxis2.Phi()); double deltaRUe2 = std::sqrt(deltaEtaUe2 * deltaEtaUe2 + deltaPhiUe2 * deltaPhiUe2); - if (deltaRjet < rJet) { - registryQC.fill(HIST("deltaEtadeltaPhiJet"), deltaEtaJet, deltaPhiJet); - nPartJetPlusUE++; - ptJetPlusUE = ptJetPlusUE + selectedTrack.Pt(); - } - if (deltaRUe1 < rJet) { + if (deltaRUe1 < alpha * rJet) { registryQC.fill(HIST("deltaEtadeltaPhi_ue"), deltaEtaUe1, deltaPhiUe1); - nPartUE++; ptUE = ptUE + selectedTrack.Pt(); } - if (deltaRUe2 < rJet) { + if (deltaRUe2 < alpha * rJet) { registryQC.fill(HIST("deltaEtadeltaPhi_ue"), deltaEtaUe2, deltaPhiUe2); - nPartUE++; ptUE = ptUE + selectedTrack.Pt(); } } - nPartJet = nPartJetPlusUE - 0.5 * nPartUE; - ptJet = ptJetPlusUE - 0.5 * ptUE; - registryQC.fill(HIST("NchJetPlusUE"), nPartJetPlusUE); - registryQC.fill(HIST("NchJet"), nPartJet); - registryQC.fill(HIST("NchUE"), nPartUE); - registryQC.fill(HIST("sumPtJetPlusUE"), ptJetPlusUE); - registryQC.fill(HIST("sumPtJet"), ptJet); - registryQC.fill(HIST("sumPtUE"), ptUE); - - if (ptJet < minJetPt) - continue; - if (nPartJetPlusUE < minNparticlesInJet) + registryQC.fill(HIST("sumPtUE"), 0.5 * ptUE); + registryQC.fill(HIST("NchJetPlusUE"), nParticlesInjet[i]); + + double ptJetRec = jet[i].Pt() - averagePtUE; + double ptJetCorr = getCorrectedPt(ptJetRec); + + if (ptJetCorr < minJetPt) continue; + nJetsSelected++; isSelected[i] = 1; } @@ -623,34 +627,43 @@ struct NucleiInJets { if (nJetsSelected == 0) return; - registryData.fill(HIST("number_of_events_data"), 3.5); - registryQC.fill(HIST("event_selection_jets"), 1.5); // events with pTjet>10 GeV/c selected - //************************************************************************************************************************************ + registryData.fill(HIST("number_of_events_data"), 4.5); // Overlaps - int nOverlaps(0); - for (int i = 0; i < static_cast(jet.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] + int nOverlapsJetJet(0); + int nOverlapsJetUe(0); + int nOverlapsUeUe(0); + int nOverlapsTot(0); + for (int i = 0; i < static_cast(jet.size()); i++) { if (isSelected[i] == 0) continue; - for (int j = 0; j < static_cast(jet.size()); j++) { // o2-linter: disable=[const-ref-in-for-loop] - if (isSelected[j] == 0 || i == j) + for (int j = (i + 1); j < static_cast(jet.size()); j++) { + if (isSelected[j] == 0) continue; - if (overlap(jet[i], ue1[j], rJet) || overlap(jet[i], ue2[j], rJet) || overlap(jet[i], jet[j], rJet)) - nOverlaps++; + if (overlap(jet[i], jet[j], rJet)) + nOverlapsJetJet++; + if (overlap(jet[i], ue1[j], rJet) || overlap(jet[i], ue2[j], rJet)) + nOverlapsJetUe++; + if (overlap(ue1[i], ue1[j], rJet) || overlap(ue1[i], ue2[j], rJet) || overlap(ue2[i], ue2[j], rJet)) + nOverlapsUeUe++; } } - registryQC.fill(HIST("jet_ue_overlaps"), nJetsSelected, nOverlaps); + nOverlapsTot = nOverlapsJetJet + nOverlapsJetUe + nOverlapsUeUe; + registryQC.fill(HIST("jet_jet_overlaps"), nJetsSelected, nOverlapsJetJet); + registryQC.fill(HIST("jet_ue_overlaps"), nJetsSelected, nOverlapsJetUe); + registryQC.fill(HIST("ue_ue_overlaps"), nJetsSelected, nOverlapsUeUe); + registryQC.fill(HIST("tot_overlaps"), nJetsSelected, nOverlapsTot); if (nJetsSelected > nJetsPerEventMax) return; - registryData.fill(HIST("number_of_events_data"), 4.5); + registryData.fill(HIST("number_of_events_data"), 5.5); - if (requireNoOverlap && nOverlaps > 0) + if (requireNoOverlap && nOverlapsTot > 0) return; - registryData.fill(HIST("number_of_events_data"), 5.5); + registryData.fill(HIST("number_of_events_data"), 6.5); - //************************************************************************************************************************************ + //************************************************************************************************************** for (int i = 0; i < static_cast(jet.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] From c5d2f1a7a4fffddc86a605b15b55bcc14aaf2317 Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Thu, 6 Feb 2025 02:09:15 +0100 Subject: [PATCH 0063/1650] [PWGLF] chk892Flow: Add new v0 selection cut (#9777) --- PWGLF/Tasks/Resonances/chk892Flow.cxx | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/PWGLF/Tasks/Resonances/chk892Flow.cxx b/PWGLF/Tasks/Resonances/chk892Flow.cxx index 3834e9dfd88..973a757d86b 100644 --- a/PWGLF/Tasks/Resonances/chk892Flow.cxx +++ b/PWGLF/Tasks/Resonances/chk892Flow.cxx @@ -176,6 +176,7 @@ struct Chk892Flow { Configurable cfgReturnFlag{"cfgReturnFlag", false, "Return Flag for debugging"}; Configurable cSecondaryRequire{"cSecondaryRequire", true, "Secondary cuts on/off"}; Configurable cSecondaryArmenterosCut{"cSecondaryArmenterosCut", true, "cut on Armenteros-Podolanski graph"}; + Configurable cSecondaryCrossMassHypothesisCut{"cSecondaryCrossMassHypothesisCut", false, "Apply cut based on the lambda mass hypothesis"}; Configurable cfgByPassDauPIDSelection{"cfgByPassDauPIDSelection", true, "Bypass Daughters PID selection"}; Configurable cSecondaryDauDCAMax{"cSecondaryDauDCAMax", 0.2, "Maximum DCA Secondary daughters to PV"}; @@ -190,7 +191,8 @@ struct Chk892Flow { Configurable cSecondaryDCAtoPVMax{"cSecondaryDCAtoPVMax", 0.4, "Maximum DCA Secondary to PV"}; Configurable cSecondaryProperLifetimeMax{"cSecondaryProperLifetimeMax", 20., "Maximum Secondary Lifetime"}; Configurable cSecondaryparamArmenterosCut{"cSecondaryparamArmenterosCut", 0.2, "parameter for Armenteros Cut"}; - Configurable cSecondaryMassWindow{"cSecondaryMassWindow", 0.03, "Secondary inv mass selciton window"}; + Configurable cSecondaryMassWindow{"cSecondaryMassWindow", 0.03, "Secondary inv mass selection window"}; + Configurable cSecondaryCrossMassCutWindow{"cSecondaryCrossMassCutWindow", 0.05, "Secondary inv mass selection window with (anti)lambda hypothesis"}; // K* selection Configurable cKstarMaxRap{"cKstarMaxRap", 0.5, "Kstar maximum rapidity"}; @@ -263,7 +265,7 @@ struct Chk892Flow { AxisSpec mcLabelAxis = {5, -0.5, 4.5, "MC Label"}; if (cfgReturnFlag) { - histos.add("QA/K0sCutCheck", "Check K0s cut", HistType::kTH1D, {AxisSpec{12, -0.5, 11.5, "Check"}}); + histos.add("QA/K0sCutCheck", "Check K0s cut", HistType::kTH1D, {AxisSpec{13, -0.5, 12.5, "Check"}}); } histos.add("QA/before/CentDist", "Centrality distribution", {HistType::kTH1D, {centAxis}}); histos.add("QA/before/VtxZ", "Centrality distribution", {HistType::kTH1D, {vtxzAxis}}); @@ -556,6 +558,8 @@ struct Chk892Flow { auto lCPA = candidate.v0cosPA(); auto lPropTauK0s = candidate.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * MassK0Short; auto lMk0s = candidate.mK0Short(); + auto lMLambda = candidate.mLambda(); + auto lMALambda = candidate.mAntiLambda(); auto checkCommonCuts = [&]() { if (lDauDCA > cSecondaryDauDCAMax) @@ -580,6 +584,9 @@ struct Chk892Flow { return false; if (std::fabs(lMk0s - MassK0Short) > cSecondaryMassWindow) return false; + if (cSecondaryCrossMassHypothesisCut && + ((std::fabs(lMLambda - MassLambda0) < cSecondaryCrossMassCutWindow) || (std::fabs(lMALambda - MassLambda0Bar) < cSecondaryCrossMassCutWindow))) + return false; return true; }; @@ -630,6 +637,11 @@ struct Chk892Flow { histos.fill(HIST("QA/K0sCutCheck"), 11); returnFlag = false; } + if (cSecondaryCrossMassHypothesisCut && + ((std::fabs(lMLambda - MassLambda0) < cSecondaryCrossMassCutWindow) || (std::fabs(lMALambda - MassLambda0Bar) < cSecondaryCrossMassCutWindow))) { + histos.fill(HIST("QA/K0sCutCheck"), 12); + returnFlag = false; + } return returnFlag; } else { // normal usage if (cSecondaryRequire) { From 5468b8266b29aafc623d257cdd5ebeee8bad122b Mon Sep 17 00:00:00 2001 From: ilikmeta <152337132+ilikmeta@users.noreply.github.com> Date: Thu, 6 Feb 2025 04:16:49 +0200 Subject: [PATCH 0064/1650] [PWGCF] Fix FT0 low cut (#9779) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/flowGfwTask.cxx | 140 +++++++++++++++---------------- 1 file changed, 67 insertions(+), 73 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowGfwTask.cxx b/PWGCF/Flow/Tasks/flowGfwTask.cxx index d62df4c340d..48e0bd1620a 100644 --- a/PWGCF/Flow/Tasks/flowGfwTask.cxx +++ b/PWGCF/Flow/Tasks/flowGfwTask.cxx @@ -61,27 +61,28 @@ struct FlowGfwTask { O2_DEFINE_CONFIGURABLE(cfgCutChi2prTPCcls, float, 2.5, "Chi2 per TPC clusters") O2_DEFINE_CONFIGURABLE(cfgCutTPCclu, float, 70.0f, "minimum TPC clusters") O2_DEFINE_CONFIGURABLE(cfgCutITSclu, float, 5.0f, "minimum ITS clusters") - O2_DEFINE_CONFIGURABLE(cfgUseAdditionalEventCut, bool, false, "Use additional event cut on mult correlations") - O2_DEFINE_CONFIGURABLE(cfgUseAdditionalTrackCut, bool, false, "Use additional track cut on phi") - O2_DEFINE_CONFIGURABLE(cfgUseNch, bool, false, "Use Nch for flow observables") + O2_DEFINE_CONFIGURABLE(cfgMinCentFT0C, float, 0.0f, "Minimum FT0C Centrality") + O2_DEFINE_CONFIGURABLE(cfgMaxCentFT0C, float, 100.0f, "Maximum FT0C Centrality") + O2_DEFINE_CONFIGURABLE(cfgUseAdditionalEventCut, bool, true, "Use additional event cut on mult correlations") + O2_DEFINE_CONFIGURABLE(cfgUseAdditionalTrackCut, bool, true, "Use additional track cut on phi") + O2_DEFINE_CONFIGURABLE(cfgUseNch, bool, true, "Use Nch for flow observables") O2_DEFINE_CONFIGURABLE(cfgNbootstrap, int, 10, "Number of subsamples") - O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeights, bool, false, "Fill and output NUA weights") + O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeights, bool, true, "Fill and output NUA weights") O2_DEFINE_CONFIGURABLE(cfgEfficiency, std::string, "", "CCDB path to efficiency object") O2_DEFINE_CONFIGURABLE(cfgAcceptance, std::string, "", "CCDB path to acceptance object") O2_DEFINE_CONFIGURABLE(cfgMagnetField, std::string, "GLO/Config/GRPMagField", "CCDB path to Magnet field object") - O2_DEFINE_CONFIGURABLE(cfgCutOccupancyHigh, int, 500, "High cut on TPC occupancy") + O2_DEFINE_CONFIGURABLE(cfgCutOccupancyHigh, int, 3000, "High cut on TPC occupancy") O2_DEFINE_CONFIGURABLE(cfgCutOccupancyLow, int, 0, "Low cut on TPC occupancy") O2_DEFINE_CONFIGURABLE(cfgCutDCAz, float, 2, "Custom DCA Z cut") O2_DEFINE_CONFIGURABLE(cfgCutDCAxy, float, 0.2f, "Custom DCA XY cut") - O2_DEFINE_CONFIGURABLE(cfgTVXinTRD, bool, false, "Use kTVXinTRD (reject TRD triggered events)"); - O2_DEFINE_CONFIGURABLE(cfgNoTimeFrameBorder, bool, false, "kNoTimeFrameBorder"); - O2_DEFINE_CONFIGURABLE(cfgNoITSROFrameBorder, bool, false, "kNoITSROFrameBorder"); - O2_DEFINE_CONFIGURABLE(cfgNoSameBunchPileup, bool, false, "kNoSameBunchPileup"); - O2_DEFINE_CONFIGURABLE(cfgIsGoodZvtxFT0vsPV, bool, false, "kIsGoodZvtxFT0vsPV"); - O2_DEFINE_CONFIGURABLE(cfgNoCollInTimeRangeStandard, bool, false, "kNoCollInTimeRangeStandard"); - O2_DEFINE_CONFIGURABLE(cfgEvSelkIsGoodITSLayersAll, bool, false, "kIsGoodITSLayersAll") - O2_DEFINE_CONFIGURABLE(cfgOccupancy, bool, false, "Bool for event selection on detector occupancy"); - O2_DEFINE_CONFIGURABLE(cfgMultCut, bool, false, "Use additional event cut on mult correlations"); + O2_DEFINE_CONFIGURABLE(cfgNoTimeFrameBorder, bool, true, "kNoTimeFrameBorder"); + O2_DEFINE_CONFIGURABLE(cfgNoITSROFrameBorder, bool, true, "kNoITSROFrameBorder"); + O2_DEFINE_CONFIGURABLE(cfgNoSameBunchPileup, bool, true, "kNoSameBunchPileup"); + O2_DEFINE_CONFIGURABLE(cfgIsGoodZvtxFT0vsPV, bool, true, "kIsGoodZvtxFT0vsPV"); + O2_DEFINE_CONFIGURABLE(cfgNoCollInTimeRangeStandard, bool, true, "kNoCollInTimeRangeStandard"); + O2_DEFINE_CONFIGURABLE(cfgEvSelkIsGoodITSLayersAll, bool, true, "kIsGoodITSLayersAll") + O2_DEFINE_CONFIGURABLE(cfgOccupancy, bool, true, "Bool for event selection on detector occupancy"); + O2_DEFINE_CONFIGURABLE(cfgMultCut, bool, true, "Use additional event cut on mult correlations"); O2_DEFINE_CONFIGURABLE(FineBinning, bool, false, "Manually change to fine binning") O2_DEFINE_CONFIGURABLE(cfgTrackSelRun3ITSMatch, bool, false, "System check: Run3ITSMatch") O2_DEFINE_CONFIGURABLE(cfgTrackSel, bool, false, "System check: track selection") @@ -98,9 +99,9 @@ struct FlowGfwTask { ConfigurableAxis axisT0C{"axisT0C", {70, 0, 70000}, "N_{ch} (T0C)"}; ConfigurableAxis axisT0A{"axisT0A", {200, 0, 200000}, "N_{ch} (T0A)"}; ConfigurableAxis axisT0M{"axisT0M", {70, 0, 70000}, "N_{ch} (T0M)"}; - ConfigurableAxis axisFT0CAmp{"axisFT0CAmp", {5000, 0, 5000}, "axisFT0CAmp"}; - ConfigurableAxis axisFT0AAmp{"axisFT0AAmp", {5000, 0, 5000}, "axisFT0AAmp"}; - ConfigurableAxis axisFT0MAmp{"axisFT0MAmp", {10000, 0, 10000}, "axisFT0MAmp"}; + ConfigurableAxis axisFT0CAmp{"axisFT0CAmp", {50000, 0, 50000}, "axisFT0CAmp"}; + ConfigurableAxis axisFT0AAmp{"axisFT0AAmp", {50000, 0, 50000}, "axisFT0AAmp"}; + ConfigurableAxis axisFT0MAmp{"axisFT0MAmp", {50000, 0, 50000}, "axisFT0MAmp"}; ConfigurableAxis axisNchPV{"axisNchPV", {4000, 0, 4000}, "N_{ch} (PV)"}; ConfigurableAxis axisDCAz{"axisDCAz", {200, -2, 2}, "DCA_{z} (cm)"}; ConfigurableAxis axisDCAxy{"axisDCAxy", {200, -1, 1}, "DCA_{xy} (cm)"}; @@ -111,7 +112,7 @@ struct FlowGfwTask { Configurable maxZP{"maxZP", 3099.5, "Max ZP signal"}; Configurable maxZEM{"maxZEM", 3099.5, "Max ZEM signal"}; Configurable nBinsFit{"nBinsFit", 1000, "nbinsFit"}; - Configurable maxMultFT0{"maxMultFT0", 3000, "Max FT0 signal"}; + Configurable maxMultFT0{"maxMultFT0", 5000, "Max FT0 signal"}; // Corrections TH1D* mEfficiency = nullptr; @@ -171,7 +172,6 @@ struct FlowGfwTask { kFILTERED, kSEL8, kOCCUPANCY, - kTVXINTRD, kNOTIMEFRAMEBORDER, kNOITSROFRAMEBORDER, kNOPSAMEBUNCHPILEUP, @@ -206,7 +206,6 @@ struct FlowGfwTask { registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kFILTERED + 1, "Filtered events"); registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kSEL8 + 1, "Sel8"); registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kOCCUPANCY + 1, "Occupancy"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kTVXINTRD + 1, "kTVXinTRD"); registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kNOTIMEFRAMEBORDER + 1, "kNoTimeFrameBorder"); registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kNOITSROFRAMEBORDER + 1, "kNoITSROFrameBorder"); registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kNOPSAMEBUNCHPILEUP + 1, "kNoSameBunchPileup"); @@ -257,14 +256,16 @@ struct FlowGfwTask { registry.add("ZPAcoll", "ZPAcoll; ZPA amplitude; Entries", {HistType::kTH1F, {{nBinsAmp, -0.5, maxZP}}}); registry.add("ZNCcoll", "ZNCcoll; ZNC amplitude; Entries", {HistType::kTH1F, {{nBinsAmp, -0.5, maxZN}}}); registry.add("ZPCcoll", "ZPCcoll; ZPC amplitude; Entries", {HistType::kTH1F, {{nBinsAmp, -0.5, maxZP}}}); - registry.add("ZNvsFT0correl", "ZNvsFT0correl", {HistType::kTH2F, {{{nBinsFit, 0., maxMultFT0}, {nBinsAmp, -0.5, 2. * maxZN}}}}); + registry.add("ZNvsFT0correl", "ZNvsFT0correl; FT0 amplitude; ZN", {HistType::kTH2F, {{{nBinsFit, 0., maxMultFT0}, {nBinsAmp, -0.5, 2. * maxZN}}}}); registry.add("ZDCAmp", "ZDC Amplitude; ZDC Amplitude; Events", {HistType::kTH1F, {{nBinsAmp, -0.5, maxZP}}}); - registry.add("ZNvsZEMcoll", "ZNvsZEMcoll; ZEM; ZNA+ZNC", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); - registry.add("ZNvsZEMcoll05", "ZNvsZEMcoll; ZEM; ZNA+ZNC", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); - registry.add("ZNvsZEMcoll510", "ZNvsZEMcoll; ZEM; ZNA+ZNC", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); - registry.add("ZNvsZEMcoll1020", "ZNvsZEMcoll; ZEM; ZNA+ZNC", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); - registry.add("ZNvsZEMcoll2030", "ZNvsZEMcoll; ZEM; ZNA+ZNC", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); - registry.add("ZNvsZEMcollrest", "ZNvsZEMcoll; ZEM; ZNA+ZNC", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); + registry.add("ZNAmp", "ZNA+ZNC Amplitude; ZN Amplitude; Events", {HistType::kTH1F, {{nBinsAmp, -0.5, maxZN}}}); + registry.add("ZPAmp", "ZPA+ZPC Amplitude; ZP Amplitude; Events", {HistType::kTH1F, {{nBinsAmp, -0.5, maxZP}}}); + registry.add("ZNvsZEMcoll", "ZNvsZEMcoll; ZEM; ZDC energy (GeV)", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); + registry.add("ZNvsZEMcoll05", "ZNvsZEMcoll; ZEM; ZDC energy (GeV)", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); + registry.add("ZNvsZEMcoll510", "ZNvsZEMcoll; ZEM; ZDC energy (GeV)", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); + registry.add("ZNvsZEMcoll1020", "ZNvsZEMcoll; ZEM; ZDC energy (GeV)", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); + registry.add("ZNvsZEMcoll2030", "ZNvsZEMcoll; ZEM; ZDC energy (GeV)", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); + registry.add("ZNvsZEMcollrest", "ZNvsZEMcoll; ZEM; ZDC energy (GeV)", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); // Track plots registry.add("Events_per_Centrality_Bin", "Events_per_Centrality_Bin;Centrality FT0C;No. of Events", kTH1F, {axisCentrality}); @@ -368,7 +369,7 @@ struct FlowGfwTask { fWeights->init(true, false); } - // add in FlowContainer to Get boostrap sample automatically + // add in FlowContainer to Get boostrap sample automatically -- Use post process flow task TObjArray* oba = new TObjArray(); fFC->SetXAxis(fPtAxis); fFC->SetName("FlowContainer"); @@ -518,13 +519,6 @@ struct FlowGfwTask { template bool eventSelected(o2::aod::mult::MultNTracksPV, TCollision collision, const int multTrk, const float centrality) { - if (cfgTVXinTRD) { - if (collision.alias_bit(kTVXinTRD)) { - // TRD triggered - return false; - } - registry.fill(HIST("hEventCount"), kTVXINTRD); - } if (cfgNoTimeFrameBorder) { if (!collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { // reject collisions close to Time Frame borders @@ -566,7 +560,7 @@ struct FlowGfwTask { } if (cfgEvSelkIsGoodITSLayersAll) { if (cfgEvSelkIsGoodITSLayersAll && !collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { - // no other collisions in this Readout Frame with per-collision multiplicity above threshold + // removes dead staves of ITS return false; } registry.fill(HIST("hEventCount"), kISGOODITSLAYERSALL); @@ -650,7 +644,7 @@ struct FlowGfwTask { } // Apply process filters - Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; + Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex && (aod::cent::centFT0C > cfgMinCentFT0C) && (aod::cent::centFT0C < cfgMaxCentFT0C); Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls) && (nabs(aod::track::dcaZ) < cfgCutDCAz) && (nabs(aod::track::dcaXY) < cfgCutDCAxy); using Colls = soa::Filtered>; // collisions filter @@ -668,6 +662,8 @@ struct FlowGfwTask { if (nTotal < 1) return; + const auto centrality = collision.centFT0C(); + // fill event QA before cuts registry.fill(HIST("BeforeCut_globalTracks_centT0C"), collision.centFT0C(), tracks.size()); registry.fill(HIST("BeforeCut_PVTracks_centT0C"), collision.centFT0C(), collision.multNTracksPV()); @@ -680,8 +676,6 @@ struct FlowGfwTask { registry.fill(HIST("BeforeCut_multFT0M_centFT0M"), collision.centFT0M(), collision.multFT0M()); registry.fill(HIST("hEventCount"), kSEL8); - const auto centrality = collision.centFT0C(); - if (cfgOccupancy) { int occupancy = collision.trackOccupancyInTimeRange(); if (occupancy < cfgCutOccupancyLow || occupancy > cfgCutOccupancyHigh) @@ -693,33 +687,6 @@ struct FlowGfwTask { return; } - if (centrality < 0 || centrality >= 70.) - return; - - float vtxz = collision.posZ(); - float lRandom = fRndm->Rndm(); - registry.fill(HIST("hVtxZ"), vtxz); - registry.fill(HIST("hMult"), nTotal); - registry.fill(HIST("hCent"), centrality); - registry.fill(HIST("cent_vs_Nch"), centrality, nTotal); - - fGFW->Clear(); - - auto bc = collision.bc_as(); - loadCorrections(bc.timestamp()); - registry.fill(HIST("hEventCount"), kCENTRALITY); - - // fill event QA after cuts - registry.fill(HIST("globalTracks_centT0C_Aft"), collision.centFT0C(), tracks.size()); - registry.fill(HIST("PVTracks_centT0C_Aft"), collision.centFT0C(), collision.multNTracksPV()); - registry.fill(HIST("globalTracks_PVTracks_Aft"), collision.multNTracksPV(), tracks.size()); - registry.fill(HIST("globalTracks_multT0A_Aft"), collision.multFT0A(), tracks.size()); - registry.fill(HIST("globalTracks_multV0A_Aft"), collision.multFV0A(), tracks.size()); - registry.fill(HIST("multV0A_multT0A_Aft"), collision.multFT0A(), collision.multFV0A()); - registry.fill(HIST("multT0C_centT0C_Aft"), collision.centFT0C(), collision.multFT0C()); - registry.fill(HIST("multT0A_centT0A_Aft"), collision.centFT0A(), collision.multFT0A()); - registry.fill(HIST("multFT0M_centFT0M_Aft"), collision.centFT0M(), collision.multFT0M()); - const auto& foundBC = collision.foundBC_as(); if (foundBC.has_zdc()) { registry.fill(HIST("hEventCounterForZDC"), 1); @@ -727,13 +694,13 @@ struct FlowGfwTask { // FT0 amplitude to use in fine binning double ft0aAmp = 0; double ft0cAmp = 0; + double ft0mAmp = 0; - if (collision.has_foundFT0()) { - auto ft0 = collision.foundFT0(); - for (const auto& amplitude : ft0.amplitudeA()) { + if (foundBC.has_ft0()) { + for (const auto& amplitude : foundBC.ft0().amplitudeA()) { ft0aAmp += amplitude; } - for (const auto& amplitude : ft0.amplitudeC()) { + for (const auto& amplitude : foundBC.ft0().amplitudeC()) { ft0cAmp += amplitude; } } else { @@ -743,7 +710,7 @@ struct FlowGfwTask { registry.fill(HIST("FT0AAmp"), ft0aAmp); registry.fill(HIST("FT0CAmp"), ft0cAmp); - double ft0mAmp = ft0aAmp + ft0cAmp; + ft0mAmp = ft0aAmp + ft0cAmp; registry.fill(HIST("FT0MAmp"), ft0mAmp); // ZDC amplitude to use in fine binning @@ -760,9 +727,12 @@ struct FlowGfwTask { registry.fill(HIST("ZPAcoll"), aZPA); registry.fill(HIST("ZPCcoll"), aZPC); + registry.fill(HIST("ZNvsFT0correl"), (ft0aAmp + ft0cAmp) / 100., aZNC + aZNA); + double aZDC = aZNC + aZNA + aZPA + aZPC; - registry.fill(HIST("ZNvsFT0correl"), (ft0aAmp + ft0aAmp) / 100., aZNC + aZNA); registry.fill(HIST("ZDCAmp"), aZDC); + registry.fill(HIST("ZNAmp"), aZNC + aZNA); + registry.fill(HIST("ZPAmp"), aZPA + aZPC); registry.fill(HIST("ZNvsZEMcoll"), aZEM1 + aZEM2, aZNA + aZNC); @@ -779,6 +749,30 @@ struct FlowGfwTask { } } // End of ZDC + float vtxz = collision.posZ(); + float lRandom = fRndm->Rndm(); + registry.fill(HIST("hVtxZ"), vtxz); + registry.fill(HIST("hMult"), nTotal); + registry.fill(HIST("hCent"), centrality); + registry.fill(HIST("cent_vs_Nch"), centrality, nTotal); + + fGFW->Clear(); + + auto bc = collision.bc_as(); + loadCorrections(bc.timestamp()); + registry.fill(HIST("hEventCount"), kCENTRALITY); + + // fill event QA after cuts + registry.fill(HIST("globalTracks_centT0C_Aft"), collision.centFT0C(), tracks.size()); + registry.fill(HIST("PVTracks_centT0C_Aft"), collision.centFT0C(), collision.multNTracksPV()); + registry.fill(HIST("globalTracks_PVTracks_Aft"), collision.multNTracksPV(), tracks.size()); + registry.fill(HIST("globalTracks_multT0A_Aft"), collision.multFT0A(), tracks.size()); + registry.fill(HIST("globalTracks_multV0A_Aft"), collision.multFV0A(), tracks.size()); + registry.fill(HIST("multV0A_multT0A_Aft"), collision.multFT0A(), collision.multFV0A()); + registry.fill(HIST("multT0C_centT0C_Aft"), collision.centFT0C(), collision.multFT0C()); + registry.fill(HIST("multT0A_centT0A_Aft"), collision.centFT0A(), collision.multFT0A()); + registry.fill(HIST("multFT0M_centFT0M_Aft"), collision.centFT0M(), collision.multFT0M()); + // track weights float weff = 1, wacc = 1; int magnetfield = 0; @@ -900,7 +894,7 @@ struct FlowGfwTask { } } // End of process - PROCESS_SWITCH(FlowGfwTask, processData, "Process analysis for Run 3 data", false); + PROCESS_SWITCH(FlowGfwTask, processData, "Process analysis for Run 3 data", true); // Filter the Reconstructed tracks Filter mytrackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax) && (nabs(aod::track::dcaXY) < cfgCutDCAxy); From 513013519b22954a4f9fea29d46c6a5e452dd061 Mon Sep 17 00:00:00 2001 From: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> Date: Thu, 6 Feb 2025 04:58:06 +0100 Subject: [PATCH 0065/1650] [PWGLF] Add ctpRateFetcher service (#9780) --- PWGLF/Tasks/Strangeness/CMakeLists.txt | 2 +- .../derivedlambdakzeroanalysis.cxx | 45 +++++++++++++++++-- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/CMakeLists.txt b/PWGLF/Tasks/Strangeness/CMakeLists.txt index 932448ce0e9..b10786a302b 100644 --- a/PWGLF/Tasks/Strangeness/CMakeLists.txt +++ b/PWGLF/Tasks/Strangeness/CMakeLists.txt @@ -16,7 +16,7 @@ o2physics_add_dpl_workflow(hyperon-reco-test o2physics_add_dpl_workflow(derivedlambdakzeroanalysis SOURCES derivedlambdakzeroanalysis.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::MLCore + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::MLCore O2Physics::AnalysisCCDB COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(lambdakzeroanalysis-mc diff --git a/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx b/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx index f3535c45f05..048ded5722f 100644 --- a/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx @@ -42,6 +42,7 @@ #include "CommonConstants/MathConstants.h" #include "CommonConstants/PhysicsConstants.h" #include "Common/Core/trackUtilities.h" +#include "Common/CCDB/ctpRateFetcher.h" #include "PWGLF/DataModel/LFStrangenessTables.h" #include "PWGLF/DataModel/LFStrangenessMLTables.h" #include "PWGLF/DataModel/LFStrangenessPIDTables.h" @@ -80,6 +81,7 @@ struct derivedlambdakzeroanalysis { Configurable calculateFeeddownMatrix{"calculateFeeddownMatrix", true, "fill feeddown matrix if MC"}; Configurable doPPAnalysis{"doPPAnalysis", false, "if in pp, set to true"}; + Configurable irSource{"irSource", "T0VTX", "Estimator of the interaction rate (Recommended: pp --> T0VTX, Pb-Pb --> ZNC hadronic)"}; struct : ConfigurableGroup { Configurable requireSel8{"requireSel8", true, "require sel8 event selection"}; @@ -108,6 +110,9 @@ struct derivedlambdakzeroanalysis { // fast check on occupancy Configurable minOccupancy{"minOccupancy", -1, "minimum occupancy from neighbouring collisions"}; Configurable maxOccupancy{"maxOccupancy", -1, "maximum occupancy from neighbouring collisions"}; + // fast check on interaction rate + Configurable minIR{"minIR", -1, "minimum IR collisions"}; + Configurable maxIR{"maxIR", -1, "maximum IR collisions"}; } eventSelections; struct : ConfigurableGroup { @@ -208,6 +213,8 @@ struct derivedlambdakzeroanalysis { } ccdbConfigurations; o2::ccdb::CcdbApi ccdbApi; + Service ccdb; + ctpRateFetcher rateFetcher; int mRunNumber; std::map metadata; @@ -221,6 +228,7 @@ struct derivedlambdakzeroanalysis { ConfigurableAxis axisLambdaMass{"axisLambdaMass", {200, 1.101f, 1.131f}, ""}; ConfigurableAxis axisCentrality{"axisCentrality", {VARIABLE_WIDTH, 0.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f}, "Centrality"}; ConfigurableAxis axisNch{"axisNch", {500, 0.0f, +5000.0f}, "Number of charged particles"}; + ConfigurableAxis axisIRBinning{"axisIRBinning", {500, 0, 50}, "Binning for the interaction rate (kHz)"}; ConfigurableAxis axisRawCentrality{"axisRawCentrality", {VARIABLE_WIDTH, 0.000f, 52.320f, 75.400f, 95.719f, 115.364f, 135.211f, 155.791f, 177.504f, 200.686f, 225.641f, 252.645f, 281.906f, 313.850f, 348.302f, 385.732f, 426.307f, 470.146f, 517.555f, 568.899f, 624.177f, 684.021f, 748.734f, 818.078f, 892.577f, 973.087f, 1058.789f, 1150.915f, 1249.319f, 1354.279f, 1465.979f, 1584.790f, 1710.778f, 1844.863f, 1985.746f, 2134.643f, 2291.610f, 2456.943f, 2630.653f, 2813.959f, 3006.631f, 3207.229f, 3417.641f, 3637.318f, 3865.785f, 4104.997f, 4354.938f, 4615.786f, 4885.335f, 5166.555f, 5458.021f, 5762.584f, 6077.881f, 6406.834f, 6746.435f, 7097.958f, 7462.579f, 7839.165f, 8231.629f, 8635.640f, 9052.000f, 9484.268f, 9929.111f, 10389.350f, 10862.059f, 11352.185f, 11856.823f, 12380.371f, 12920.401f, 13476.971f, 14053.087f, 14646.190f, 15258.426f, 15890.617f, 16544.433f, 17218.024f, 17913.465f, 18631.374f, 19374.983f, 20136.700f, 20927.783f, 21746.796f, 22590.880f, 23465.734f, 24372.274f, 25314.351f, 26290.488f, 27300.899f, 28347.512f, 29436.133f, 30567.840f, 31746.818f, 32982.664f, 34276.329f, 35624.859f, 37042.588f, 38546.609f, 40139.742f, 41837.980f, 43679.429f, 45892.130f, 400000.000f}, "raw centrality signal"}; // for QA @@ -334,6 +342,11 @@ struct derivedlambdakzeroanalysis { void init(InitContext const&) { + // setting CCDB service + ccdb->setURL(ccdbConfigurations.ccdburl); + ccdb->setCaching(true); + ccdb->setFatalWhenNull(false); + // initialise bit masks maskTopological = (uint64_t(1) << selCosPA) | (uint64_t(1) << selRadius) | (uint64_t(1) << selDCANegToPV) | (uint64_t(1) << selDCAPosToPV) | (uint64_t(1) << selDCAV0Dau) | (uint64_t(1) << selRadiusMax); maskTopoNoV0Radius = (uint64_t(1) << selCosPA) | (uint64_t(1) << selDCANegToPV) | (uint64_t(1) << selDCAPosToPV) | (uint64_t(1) << selDCAV0Dau) | (uint64_t(1) << selRadiusMax); @@ -425,6 +438,8 @@ struct derivedlambdakzeroanalysis { histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(17, "Below min occup."); histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(18, "Above max occup."); } + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(19, "Below min IR"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(20, "Above max IR"); histos.add("hEventCentrality", "hEventCentrality", kTH1F, {{101, 0.0f, 101.0f}}); histos.add("hCentralityVsNch", "hCentralityVsNch", kTH2F, {{101, 0.0f, 101.0f}, axisNch}); @@ -443,6 +458,9 @@ struct derivedlambdakzeroanalysis { histos.add("hSelGapSide", "Selected gap side; Entries", kTH1F, {axisSelGap}); histos.add("hEventCentralityVsSelGapSide", ";Centrality (%); Selected gap side", kTH2F, {{101, 0.0f, 101.0f}, axisSelGap}); + histos.add("hInteractionRate", "hInteractionRate", kTH1F, {axisIRBinning}); + histos.add("hCentralityVsInteractionRate", "hCentralityVsInteractionRate", kTH2F, {{101, 0.0f, 101.0f}, axisIRBinning}); + // for QA and test purposes auto hRawCentrality = histos.add("hRawCentrality", "hRawCentrality", kTH1F, {axisRawCentrality}); @@ -1575,13 +1593,26 @@ struct derivedlambdakzeroanalysis { histos.fill(HIST("hEventSelection"), 17 /* Above max occupancy */); } + double interactionRate = rateFetcher.fetch(ccdb.service, collision.timestamp(), collision.runNumber(), irSource) * 1.e-3; + if (eventSelections.minIR >= 0 && interactionRate < eventSelections.minIR) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 18 /* Below min IR */); + + if (eventSelections.maxIR >= 0 && interactionRate > eventSelections.maxIR) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 19 /* Above max IR */); + return true; } // ______________________________________________________ // Simulated processing // Return the list of indices to the recoed collision associated to a given MC collision. - std::vector getListOfRecoCollIndices(soa::Join const& mcCollisions, soa::Join const& collisions) + std::vector getListOfRecoCollIndices(soa::Join const& mcCollisions, soa::Join const& collisions) { std::vector listBestCollisionIdx(mcCollisions.size()); for (auto const& mcCollision : mcCollisions) { @@ -1611,7 +1642,7 @@ struct derivedlambdakzeroanalysis { // ______________________________________________________ // Simulated processing // Fill generated event information (for event loss/splitting estimation) - void fillGeneratedEventProperties(soa::Join const& mcCollisions, soa::Join const& collisions) + void fillGeneratedEventProperties(soa::Join const& mcCollisions, soa::Join const& collisions) { std::vector listBestCollisionIdx(mcCollisions.size()); for (auto const& mcCollision : mcCollisions) { @@ -1690,6 +1721,7 @@ struct derivedlambdakzeroanalysis { centrality = hRawCentrality->GetBinContent(hRawCentrality->FindBin(doPPAnalysis ? collision.multFT0A() + collision.multFT0C() : collision.multFT0C())); } float collisionOccupancy = eventSelections.useFT0CbasedOccupancy ? collision.ft0cOccupancyInTimeRange() : collision.trackOccupancyInTimeRange(); + double interactionRate = rateFetcher.fetch(ccdb.service, collision.timestamp(), collision.runNumber(), irSource) * 1.e-3; // gap side int gapSide = collision.gapSide(); @@ -1713,6 +1745,9 @@ struct derivedlambdakzeroanalysis { histos.fill(HIST("hEventOccupancy"), collisionOccupancy); histos.fill(HIST("hCentralityVsOccupancy"), centrality, collisionOccupancy); + histos.fill(HIST("hInteractionRate"), interactionRate); + histos.fill(HIST("hCentralityVsInteractionRate"), centrality, interactionRate); + // __________________________________________ // perform main analysis int nK0Shorts = 0; @@ -1770,6 +1805,7 @@ struct derivedlambdakzeroanalysis { centrality = hRawCentrality->GetBinContent(hRawCentrality->FindBin(doPPAnalysis ? collision.multFT0A() + collision.multFT0C() : collision.multFT0C())); } float collisionOccupancy = eventSelections.useFT0CbasedOccupancy ? collision.ft0cOccupancyInTimeRange() : collision.trackOccupancyInTimeRange(); + double interactionRate = rateFetcher.fetch(ccdb.service, collision.timestamp(), collision.runNumber(), irSource) * 1.e-3; // gap side int gapSide = collision.gapSide(); @@ -1793,6 +1829,9 @@ struct derivedlambdakzeroanalysis { histos.fill(HIST("hEventOccupancy"), collisionOccupancy); histos.fill(HIST("hCentralityVsOccupancy"), centrality, collisionOccupancy); + histos.fill(HIST("hInteractionRate"), interactionRate); + histos.fill(HIST("hCentralityVsInteractionRate"), centrality, interactionRate); + // __________________________________________ // perform main analysis int nK0Shorts = 0; @@ -1863,7 +1902,7 @@ struct derivedlambdakzeroanalysis { // ______________________________________________________ // Simulated processing (subscribes to MC information too) - void processGenerated(soa::Join const& mcCollisions, soa::Join const& V0MCCores, soa::Join const& CascMCCores, soa::Join const& collisions) + void processGenerated(soa::Join const& mcCollisions, soa::Join const& V0MCCores, soa::Join const& CascMCCores, soa::Join const& collisions) { fillGeneratedEventProperties(mcCollisions, collisions); std::vector listBestCollisionIdx = getListOfRecoCollIndices(mcCollisions, collisions); From 4c75702e8b2d7af768c50417e3df6a5be5df2870 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrea=20Tavira=20Garc=C3=ADa?= <118979672+atavirag@users.noreply.github.com> Date: Thu, 6 Feb 2025 08:57:44 +0100 Subject: [PATCH 0066/1650] [PWGHF] Add ML variables in treeCreatorD0ToKPi (#9761) --- PWGHF/TableProducer/treeCreatorD0ToKPi.cxx | 158 ++++++++++++++++++--- 1 file changed, 142 insertions(+), 16 deletions(-) diff --git a/PWGHF/TableProducer/treeCreatorD0ToKPi.cxx b/PWGHF/TableProducer/treeCreatorD0ToKPi.cxx index bda9e624f1e..70277fc4d18 100644 --- a/PWGHF/TableProducer/treeCreatorD0ToKPi.cxx +++ b/PWGHF/TableProducer/treeCreatorD0ToKPi.cxx @@ -81,6 +81,12 @@ DECLARE_SOA_COLUMN(IsEventReject, isEventReject, int); DECLARE_SOA_COLUMN(RunNumber, runNumber, int); DECLARE_SOA_INDEX_COLUMN(McCollision, mcCollision); } // namespace full +namespace ml +{ +DECLARE_SOA_COLUMN(BdtOutputBkg, bdtOutputBkg, float); +DECLARE_SOA_COLUMN(BdtOutputPrompt, bdtOutputPrompt, float); +DECLARE_SOA_COLUMN(BdtOutputNonPrompt, bdtOutputNonPrompt, float); +} // namespace ml DECLARE_SOA_TABLE(HfCandD0Lites, "AOD", "HFCANDD0LITE", hf_cand::Chi2PCA, @@ -201,6 +207,11 @@ DECLARE_SOA_TABLE(HfCandD0FullPs, "AOD", "HFCANDD0FULLP", full::OriginMcGen, full::McParticleId); +DECLARE_SOA_TABLE(HfCandD0Mls, "AOD", "HFCANDD0ML", + ml::BdtOutputBkg, + ml::BdtOutputNonPrompt, + ml::BdtOutputPrompt); + } // namespace o2::aod /// Writes the full information in an output TTree @@ -209,6 +220,7 @@ struct HfTreeCreatorD0ToKPi { Produces rowCandidateFullEvents; Produces rowCandidateFullParticles; Produces rowCandidateLite; + Produces rowCandidateMl; Configurable fillCandidateLiteTable{"fillCandidateLiteTable", false, "Switch to fill lite table with candidate properties"}; // parameters for production of training samples @@ -219,7 +231,9 @@ struct HfTreeCreatorD0ToKPi { // using TracksWPid = soa::Join; using SelectedCandidatesMc = soa::Filtered>; + using SelectedCandidatesMcMl = soa::Filtered>; using SelectedCandidatesMcKf = soa::Filtered>; + using SelectedCandidatesMcKfMl = soa::Filtered>; using MatchedGenCandidatesMc = soa::Filtered>; Filter filterSelectCandidates = aod::hf_sel_candidate_d0::isSelD0 >= 1 || aod::hf_sel_candidate_d0::isSelD0bar >= 1; @@ -230,9 +244,17 @@ struct HfTreeCreatorD0ToKPi { Partition reconstructedCandSigKF = nabs(aod::hf_cand_2prong::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_2prong::DecayType::D0ToPiK)); Partition reconstructedCandBkgKF = nabs(aod::hf_cand_2prong::flagMcMatchRec) != static_cast(BIT(aod::hf_cand_2prong::DecayType::D0ToPiK)); + Partition reconstructedCandSigMl = nabs(aod::hf_cand_2prong::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_2prong::DecayType::D0ToPiK)); + Partition reconstructedCandBkgMl = nabs(aod::hf_cand_2prong::flagMcMatchRec) != static_cast(BIT(aod::hf_cand_2prong::DecayType::D0ToPiK)); + Partition reconstructedCandSigKFMl = nabs(aod::hf_cand_2prong::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_2prong::DecayType::D0ToPiK)); + Partition reconstructedCandBkgKFMl = nabs(aod::hf_cand_2prong::flagMcMatchRec) != static_cast(BIT(aod::hf_cand_2prong::DecayType::D0ToPiK)); + void init(InitContext const&) { - std::array doprocess{doprocessDataWithDCAFitterN, doprocessDataWithKFParticle, doprocessMcWithDCAFitterOnlySig, doprocessMcWithDCAFitterOnlyBkg, doprocessMcWithDCAFitterAll, doprocessMcWithKFParticleOnlySig, doprocessMcWithKFParticleOnlyBkg, doprocessMcWithKFParticleAll}; + std::array doprocess{doprocessDataWithDCAFitterN, doprocessDataWithKFParticle, doprocessMcWithDCAFitterOnlySig, doprocessMcWithDCAFitterOnlyBkg, + doprocessMcWithDCAFitterAll, doprocessMcWithKFParticleOnlySig, doprocessMcWithKFParticleOnlyBkg, doprocessMcWithKFParticleAll, + doprocessDataWithDCAFitterNMl, doprocessDataWithKFParticleMl, doprocessMcWithDCAFitterOnlySigMl, doprocessMcWithDCAFitterOnlyBkgMl, + doprocessMcWithDCAFitterAllMl, doprocessMcWithKFParticleOnlySigMl, doprocessMcWithKFParticleOnlyBkgMl, doprocessMcWithKFParticleAllMl}; if (std::accumulate(doprocess.begin(), doprocess.end(), 0) != 1) { LOGP(fatal, "Only one process function can be enabled at a time."); } @@ -251,7 +273,7 @@ struct HfTreeCreatorD0ToKPi { runNumber); } - template + template auto fillTable(const T& candidate, int candFlag, double invMass, double cosThetaStar, double topoChi2, double ct, double y, double e, int8_t flagMc, int8_t origin) { @@ -356,9 +378,23 @@ struct HfTreeCreatorD0ToKPi { origin, candidate.globalIndex()); } + if constexpr (applyMl) { + if (candidate.isSelD0()) { + rowCandidateMl( + candidate.mlProbD0()[0], + candidate.mlProbD0()[1], + candidate.mlProbD0()[2]); + } + if (candidate.isSelD0bar()) { + rowCandidateMl( + candidate.mlProbD0bar()[0], + candidate.mlProbD0bar()[1], + candidate.mlProbD0bar()[2]); + } + } } - template + template void processData(aod::Collisions const& collisions, CandType const& candidates, aod::Tracks const&, aod::BCs const&) @@ -375,6 +411,9 @@ struct HfTreeCreatorD0ToKPi { } else { rowCandidateFull.reserve(candidates.size()); } + if constexpr (applyMl) { + rowCandidateMl.reserve(candidates.size()); + } for (const auto& candidate : candidates) { if (downSampleBkgFactor < 1.) { float pseudoRndm = candidate.ptProng0() * 1000. - static_cast(candidate.ptProng0() * 1000); @@ -396,10 +435,10 @@ struct HfTreeCreatorD0ToKPi { massD0bar = hfHelper.invMassD0barToKPi(candidate); } if (candidate.isSelD0()) { - fillTable(candidate, 0, massD0, hfHelper.cosThetaStarD0(candidate), topolChi2PerNdf, ctD, yD, eD, 0, 0); + fillTable(candidate, 0, massD0, hfHelper.cosThetaStarD0(candidate), topolChi2PerNdf, ctD, yD, eD, 0, 0); } if (candidate.isSelD0bar()) { - fillTable(candidate, 1, massD0bar, hfHelper.cosThetaStarD0bar(candidate), topolChi2PerNdf, ctD, yD, eD, 0, 0); + fillTable(candidate, 1, massD0bar, hfHelper.cosThetaStarD0bar(candidate), topolChi2PerNdf, ctD, yD, eD, 0, 0); } } } @@ -409,20 +448,38 @@ struct HfTreeCreatorD0ToKPi { aod::Tracks const& tracks, aod::BCs const& bcs) { - processData(collisions, candidates, tracks, bcs); + processData(collisions, candidates, tracks, bcs); } PROCESS_SWITCH(HfTreeCreatorD0ToKPi, processDataWithDCAFitterN, "Process data with DCAFitterN", true); + void processDataWithDCAFitterNMl(aod::Collisions const& collisions, + soa::Filtered> const& candidates, + aod::Tracks const& tracks, + aod::BCs const& bcs) + { + processData(collisions, candidates, tracks, bcs); + } + PROCESS_SWITCH(HfTreeCreatorD0ToKPi, processDataWithDCAFitterNMl, "Process data with DCAFitterN and ML", false); + void processDataWithKFParticle(aod::Collisions const& collisions, soa::Filtered> const& candidates, aod::Tracks const& tracks, aod::BCs const& bcs) { - processData(collisions, candidates, tracks, bcs); + processData(collisions, candidates, tracks, bcs); } PROCESS_SWITCH(HfTreeCreatorD0ToKPi, processDataWithKFParticle, "Process data with KFParticle", false); - template + void processDataWithKFParticleMl(aod::Collisions const& collisions, + soa::Filtered> const& candidates, + aod::Tracks const& tracks, + aod::BCs const& bcs) + { + processData(collisions, candidates, tracks, bcs); + } + PROCESS_SWITCH(HfTreeCreatorD0ToKPi, processDataWithKFParticleMl, "Process data with KFParticle and ML", false); + + template void processMc(aod::Collisions const& collisions, aod::McCollisions const&, CandType const& candidates, @@ -442,6 +499,9 @@ struct HfTreeCreatorD0ToKPi { } else { rowCandidateFull.reserve(candidates.size()); } + if constexpr (applyMl) { + rowCandidateMl.reserve(candidates.size()); + } for (const auto& candidate : candidates) { if constexpr (onlyBkg) { if (TESTBIT(std::abs(candidate.flagMcMatchRec()), aod::hf_cand_2prong::DecayType::D0ToPiK)) { @@ -473,10 +533,10 @@ struct HfTreeCreatorD0ToKPi { massD0bar = hfHelper.invMassD0barToKPi(candidate); } if (candidate.isSelD0()) { - fillTable(candidate, 0, massD0, hfHelper.cosThetaStarD0(candidate), topolChi2PerNdf, ctD, yD, eD, candidate.flagMcMatchRec(), candidate.originMcRec()); + fillTable(candidate, 0, massD0, hfHelper.cosThetaStarD0(candidate), topolChi2PerNdf, ctD, yD, eD, candidate.flagMcMatchRec(), candidate.originMcRec()); } if (candidate.isSelD0bar()) { - fillTable(candidate, 1, massD0bar, hfHelper.cosThetaStarD0bar(candidate), topolChi2PerNdf, ctD, yD, eD, candidate.flagMcMatchRec(), candidate.originMcRec()); + fillTable(candidate, 1, massD0bar, hfHelper.cosThetaStarD0bar(candidate), topolChi2PerNdf, ctD, yD, eD, candidate.flagMcMatchRec(), candidate.originMcRec()); } } @@ -504,10 +564,21 @@ struct HfTreeCreatorD0ToKPi { aod::Tracks const& tracks, aod::BCs const& bcs) { - processMc(collisions, mcCollisions, reconstructedCandSig, mcParticles, tracks, bcs); + processMc(collisions, mcCollisions, reconstructedCandSig, mcParticles, tracks, bcs); } PROCESS_SWITCH(HfTreeCreatorD0ToKPi, processMcWithDCAFitterOnlySig, "Process MC with DCAFitterN only for signals", false); + void processMcWithDCAFitterOnlySigMl(aod::Collisions const& collisions, + aod::McCollisions const& mcCollisions, + SelectedCandidatesMcMl const&, + MatchedGenCandidatesMc const& mcParticles, + aod::Tracks const& tracks, + aod::BCs const& bcs) + { + processMc(collisions, mcCollisions, reconstructedCandSigMl, mcParticles, tracks, bcs); + } + PROCESS_SWITCH(HfTreeCreatorD0ToKPi, processMcWithDCAFitterOnlySigMl, "Process MC with DCAFitterN only for signals and ML", false); + void processMcWithDCAFitterOnlyBkg(aod::Collisions const& collisions, aod::McCollisions const& mcCollisions, SelectedCandidatesMc const&, @@ -515,10 +586,21 @@ struct HfTreeCreatorD0ToKPi { aod::Tracks const& tracks, aod::BCs const& bcs) { - processMc(collisions, mcCollisions, reconstructedCandBkg, mcParticles, tracks, bcs); + processMc(collisions, mcCollisions, reconstructedCandBkg, mcParticles, tracks, bcs); } PROCESS_SWITCH(HfTreeCreatorD0ToKPi, processMcWithDCAFitterOnlyBkg, "Process MC with DCAFitterN only for background", false); + void processMcWithDCAFitterOnlyBkgMl(aod::Collisions const& collisions, + aod::McCollisions const& mcCollisions, + SelectedCandidatesMcMl const&, + MatchedGenCandidatesMc const& mcParticles, + aod::Tracks const& tracks, + aod::BCs const& bcs) + { + processMc(collisions, mcCollisions, reconstructedCandBkgMl, mcParticles, tracks, bcs); + } + PROCESS_SWITCH(HfTreeCreatorD0ToKPi, processMcWithDCAFitterOnlyBkgMl, "Process MC with DCAFitterN only for background with ML", false); + void processMcWithDCAFitterAll(aod::Collisions const& collisions, aod::McCollisions const& mcCollisions, SelectedCandidatesMc const& candidates, @@ -526,10 +608,21 @@ struct HfTreeCreatorD0ToKPi { aod::Tracks const& tracks, aod::BCs const& bcs) { - processMc(collisions, mcCollisions, candidates, mcParticles, tracks, bcs); + processMc(collisions, mcCollisions, candidates, mcParticles, tracks, bcs); } PROCESS_SWITCH(HfTreeCreatorD0ToKPi, processMcWithDCAFitterAll, "Process MC with DCAFitterN", false); + void processMcWithDCAFitterAllMl(aod::Collisions const& collisions, + aod::McCollisions const& mcCollisions, + SelectedCandidatesMcMl const& candidates, + MatchedGenCandidatesMc const& mcParticles, + aod::Tracks const& tracks, + aod::BCs const& bcs) + { + processMc(collisions, mcCollisions, candidates, mcParticles, tracks, bcs); + } + PROCESS_SWITCH(HfTreeCreatorD0ToKPi, processMcWithDCAFitterAllMl, "Process MC with DCAFitterN with ML", false); + void processMcWithKFParticleOnlySig(aod::Collisions const& collisions, aod::McCollisions const& mcCollisions, SelectedCandidatesMcKf const&, @@ -537,10 +630,21 @@ struct HfTreeCreatorD0ToKPi { aod::Tracks const& tracks, aod::BCs const& bcs) { - processMc(collisions, mcCollisions, reconstructedCandSigKF, mcParticles, tracks, bcs); + processMc(collisions, mcCollisions, reconstructedCandSigKF, mcParticles, tracks, bcs); } PROCESS_SWITCH(HfTreeCreatorD0ToKPi, processMcWithKFParticleOnlySig, "Process MC with KFParticle only for signals", false); + void processMcWithKFParticleOnlySigMl(aod::Collisions const& collisions, + aod::McCollisions const& mcCollisions, + SelectedCandidatesMcKfMl const&, + MatchedGenCandidatesMc const& mcParticles, + aod::Tracks const& tracks, + aod::BCs const& bcs) + { + processMc(collisions, mcCollisions, reconstructedCandSigKFMl, mcParticles, tracks, bcs); + } + PROCESS_SWITCH(HfTreeCreatorD0ToKPi, processMcWithKFParticleOnlySigMl, "Process MC with KFParticle only for signals with ML", false); + void processMcWithKFParticleOnlyBkg(aod::Collisions const& collisions, aod::McCollisions const& mcCollisions, SelectedCandidatesMcKf const&, @@ -548,10 +652,21 @@ struct HfTreeCreatorD0ToKPi { aod::Tracks const& tracks, aod::BCs const& bcs) { - processMc(collisions, mcCollisions, reconstructedCandBkgKF, mcParticles, tracks, bcs); + processMc(collisions, mcCollisions, reconstructedCandBkgKF, mcParticles, tracks, bcs); } PROCESS_SWITCH(HfTreeCreatorD0ToKPi, processMcWithKFParticleOnlyBkg, "Process MC with KFParticle only for background", false); + void processMcWithKFParticleOnlyBkgMl(aod::Collisions const& collisions, + aod::McCollisions const& mcCollisions, + SelectedCandidatesMcKfMl const&, + MatchedGenCandidatesMc const& mcParticles, + aod::Tracks const& tracks, + aod::BCs const& bcs) + { + processMc(collisions, mcCollisions, reconstructedCandBkgKFMl, mcParticles, tracks, bcs); + } + PROCESS_SWITCH(HfTreeCreatorD0ToKPi, processMcWithKFParticleOnlyBkgMl, "Process MC with KFParticle only for background with ML", false); + void processMcWithKFParticleAll(aod::Collisions const& collisions, aod::McCollisions const& mcCollisions, SelectedCandidatesMcKf const& candidates, @@ -559,9 +674,20 @@ struct HfTreeCreatorD0ToKPi { aod::Tracks const& tracks, aod::BCs const& bcs) { - processMc(collisions, mcCollisions, candidates, mcParticles, tracks, bcs); + processMc(collisions, mcCollisions, candidates, mcParticles, tracks, bcs); } PROCESS_SWITCH(HfTreeCreatorD0ToKPi, processMcWithKFParticleAll, "Process MC with KFParticle", false); + + void processMcWithKFParticleAllMl(aod::Collisions const& collisions, + aod::McCollisions const& mcCollisions, + SelectedCandidatesMcKfMl const& candidates, + MatchedGenCandidatesMc const& mcParticles, + aod::Tracks const& tracks, + aod::BCs const& bcs) + { + processMc(collisions, mcCollisions, candidates, mcParticles, tracks, bcs); + } + PROCESS_SWITCH(HfTreeCreatorD0ToKPi, processMcWithKFParticleAllMl, "Process MC with KFParticle with ML", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From b69f0937bd89370997dce2ec188867b5d97a595a Mon Sep 17 00:00:00 2001 From: prottayCMT <61418725+prottayCMT@users.noreply.github.com> Date: Thu, 6 Feb 2025 09:13:36 +0100 Subject: [PATCH 0067/1650] [PWGLF] updated event average to particle average (#9772) Co-authored-by: Prottay Das --- PWGLF/Tasks/Strangeness/lambdapolsp.cxx | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/PWGLF/Tasks/Strangeness/lambdapolsp.cxx b/PWGLF/Tasks/Strangeness/lambdapolsp.cxx index d7eee248764..7a1a84582ab 100644 --- a/PWGLF/Tasks/Strangeness/lambdapolsp.cxx +++ b/PWGLF/Tasks/Strangeness/lambdapolsp.cxx @@ -265,6 +265,15 @@ struct lambdapolsp { histos.add("hcentQxZDCC", "hcentQxZDCC", kTH2F, {{centAxis}, {qxZDCAxis}}); histos.add("hcentQyZDCC", "hcentQyZDCC", kTH2F, {{centAxis}, {qxZDCAxis}});*/ + histos.add("hSparseLambdaCosPsiA", "hSparseLambdaCosPsiA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); + histos.add("hSparseLambdaSinPsiA", "hSparseLambdaSinPsiA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); + histos.add("hSparseLambdaCosPsiC", "hSparseLambdaCosPsiC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); + histos.add("hSparseLambdaSinPsiC", "hSparseLambdaSinPsiC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); + histos.add("hSparseAntiLambdaCosPsiA", "hSparseAntiLambdaCosPsiA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); + histos.add("hSparseAntiLambdaSinPsiA", "hSparseAntiLambdaSinPsiA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); + histos.add("hSparseAntiLambdaCosPsiC", "hSparseAntiLambdaCosPsiC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); + histos.add("hSparseAntiLambdaSinPsiC", "hSparseAntiLambdaSinPsiC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); + histos.add("hSparseLambdaPolA", "hSparseLambdaPolA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); histos.add("hSparseLambdaPolC", "hSparseLambdaPolC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); histos.add("hSparseAntiLambdaPolA", "hSparseAntiLambdaPolA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); @@ -473,6 +482,11 @@ struct lambdapolsp { // Fill histograms using constructed names if (tag2) { + histos.fill(HIST("hSparseAntiLambdaCosPsiA"), candmass, candpt, candeta, (TMath::Cos(GetPhiInRange(psiZDCA))), centrality); + histos.fill(HIST("hSparseAntiLambdaCosPsiC"), candmass, candpt, candeta, (TMath::Cos(GetPhiInRange(psiZDCC))), centrality); + histos.fill(HIST("hSparseAntiLambdaSinPsiA"), candmass, candpt, candeta, (TMath::Sin(GetPhiInRange(psiZDCA))), centrality); + histos.fill(HIST("hSparseAntiLambdaSinPsiC"), candmass, candpt, candeta, (TMath::Sin(GetPhiInRange(psiZDCC))), centrality); + histos.fill(HIST("hSparseAntiLambdaPolA"), candmass, candpt, candeta, PolA, centrality); histos.fill(HIST("hSparseAntiLambdaPolC"), candmass, candpt, candeta, PolC, centrality); histos.fill(HIST("hSparseAntiLambda_corr1a"), candmass, candpt, candeta, sinPhiStar, centrality); @@ -482,6 +496,11 @@ struct lambdapolsp { histos.fill(HIST("hSparseAntiLambda_corr2b"), candmass, candpt, candeta, sinThetaStarcosphiphiStar, centrality); } if (tag1) { + histos.fill(HIST("hSparseLambdaCosPsiA"), candmass, candpt, candeta, (TMath::Cos(GetPhiInRange(psiZDCA))), centrality); + histos.fill(HIST("hSparseLambdaCosPsiC"), candmass, candpt, candeta, (TMath::Cos(GetPhiInRange(psiZDCC))), centrality); + histos.fill(HIST("hSparseLambdaSinPsiA"), candmass, candpt, candeta, (TMath::Sin(GetPhiInRange(psiZDCA))), centrality); + histos.fill(HIST("hSparseLambdaSinPsiC"), candmass, candpt, candeta, (TMath::Sin(GetPhiInRange(psiZDCC))), centrality); + histos.fill(HIST("hSparseLambdaPolA"), candmass, candpt, candeta, PolA, centrality); histos.fill(HIST("hSparseLambdaPolC"), candmass, candpt, candeta, PolC, centrality); histos.fill(HIST("hSparseLambda_corr1a"), candmass, candpt, candeta, sinPhiStar, centrality); From 40a572240bb05db4ae481145a584656a2c134263 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Thu, 6 Feb 2025 20:31:32 +0900 Subject: [PATCH 0068/1650] [PWGEM/PhotonMeson] std::abs and std::fabs for PCM (#9785) --- .../TableProducer/photonconversionbuilder.cxx | 30 +++++-------------- PWGEM/PhotonMeson/Tasks/pcmQC.cxx | 4 +-- PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx | 4 +-- PWGEM/PhotonMeson/Utils/PCMUtilities.h | 28 ++++++++--------- 4 files changed, 26 insertions(+), 40 deletions(-) diff --git a/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx b/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx index 9060bc9c9c2..836a6deccf0 100644 --- a/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx +++ b/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx @@ -102,8 +102,6 @@ struct PhotonConversionBuilder { Configurable max_frac_shared_clusters_tpc{"max_frac_shared_clusters_tpc", 999.f, "max fraction of shared clusters in TPC"}; Configurable dcanegtopv{"dcanegtopv", 0.1, "DCA Neg To PV"}; Configurable dcapostopv{"dcapostopv", 0.1, "DCA Pos To PV"}; - Configurable min_pt_leg_at_sv{"min_pt_leg_at_sv", 0.0, "min pT for v0 legs at SV"}; // this is obsolete. - Configurable max_mean_its_cluster_size{"max_mean_its_cluster_size", 16.f, "max. x cos(lambda) for ITSonly tracks"}; // this is to suppress random combination for V0s with ITSonly tracks. default 3 + 1 for skimming. Configurable maxX{"maxX", 83.1, "max X for track IU"}; Configurable min_pt_trackiu{"min_pt_trackiu", 0.05, "min pT for trackiu"}; // this comes from online processing. pT of track seed is above 50 MeV/c in B = 0.5 T, 20 MeV/c in B = 0.2 T. @@ -115,6 +113,7 @@ struct PhotonConversionBuilder { Configurable max_dcav0dau_itsibss{"max_dcav0dau_itsibss", 1.0, "max distance btween 2 legs to V0s with ITS hits on ITSib SS"}; Configurable max_dcav0dau_tpc_inner_fc{"max_dcav0dau_tpc_inner_fc", 1.5, "max distance btween 2 legs to V0s with ITS hits on TPC inner FC"}; Configurable min_v0radius{"min_v0radius", 1.0, "min v0 radius"}; + Configurable max_v0radius{"max_v0radius", 90.0, "max v0 radius"}; Configurable margin_r_its{"margin_r_its", 3.0, "margin for r cut in cm"}; Configurable margin_r_tpc{"margin_r_tpc", 7.0, "margin for r cut in cm"}; Configurable margin_r_itstpc_tpc{"margin_r_itstpc_tpc", 7.0, "margin for r cut in cm"}; @@ -320,21 +319,6 @@ struct PhotonConversionBuilder { return false; } } - - if (isITSonlyTrack(track)) { - uint32_t itsClusterSizes = track.itsClusterSizes(); - int total_cluster_size = 0, nl = 0; - for (unsigned int layer = 0; layer < 7; layer++) { - int cluster_size_per_layer = (itsClusterSizes >> (layer * 4)) & 0xf; - if (cluster_size_per_layer > 0) { - nl++; - } - total_cluster_size += cluster_size_per_layer; - } - if (static_cast(total_cluster_size) / static_cast(nl) * std::cos(std::atan(track.tgl())) > max_mean_its_cluster_size) { - return false; - } - } } return true; @@ -376,7 +360,7 @@ struct PhotonConversionBuilder { } template - void fillTrackTable(TTrack const& track, TShiftedTrack const& shiftedtrack, TKFParticle const& kfp, float dcaXY, float dcaZ) + void fillTrackTable(TTrack const& track, TShiftedTrack const& shiftedtrack, TKFParticle const& kfp, const float dcaXY, const float dcaZ) { v0legs(track.collisionId(), track.globalIndex(), track.sign(), kfp.GetPx(), kfp.GetPy(), kfp.GetPz(), dcaXY, dcaZ, @@ -422,6 +406,11 @@ struct PhotonConversionBuilder { // LOGF(info, "v0.collisionId() = %d , v0.posTrackId() = %d , v0.negTrackId() = %d", v0.collisionId(), v0.posTrackId(), v0.negTrackId()); + // if(isTPConlyTrack(ele)){ + // // LOGF(info, "TPConly: ele.globalIndex() = %d, ele.x() = %f, ele.y() = %f, ele.z() = %f, ele.tgl() = %f, ele.alpha() = %f, ele.snp() = %f, ele.signed1Pt() = %f", ele.globalIndex(), ele.x(), ele.y(), ele.z(), ele.tgl(), ele.alpha(), ele.snp(), ele.signed1Pt()); + // // LOGF(info, "TPConly: ele.globalIndex() = %d, ele.cYY() = %f, ele.cZY() = %f, ele.cZZ() = %f, ele.cSnpY() = %f, ele.cSnpZ() = %f, ele.cSnpSnp() = %f, ele.cTglY() = %f, ele.cTglZ() = %f, ele.cTglSnp() = %f, ele.cTglTgl() = %f, ele.c1PtY() = %f, ele.c1PtZ() = %f, ele.c1PtSnp() = %f, ele.c1PtTgl() = %f, ele.c1Pt21Pt2() = %f", ele.globalIndex(), ele.cYY(), ele.cZY(), ele.cZZ(), ele.cSnpY(), ele.cSnpZ(), ele.cSnpSnp(), ele.cTglY(), ele.cTglZ(), ele.cTglSnp(), ele.cTglTgl(), ele.c1PtY(), ele.c1PtZ(), ele.c1PtSnp(), ele.c1PtTgl(), ele.c1Pt21Pt2()); + // } + // Calculate DCA with respect to the collision associated to the v0, not individual tracks gpu::gpustd::array dcaInfo; @@ -498,7 +487,7 @@ struct PhotonConversionBuilder { if (rxy < std::fabs(gammaKF_DecayVtx.GetZ()) * std::tan(2 * std::atan(std::exp(-max_eta_v0))) - margin_z) { return; // RZ line cut } - if (rxy < min_v0radius) { + if (rxy < min_v0radius || max_v0radius < rxy) { return; } @@ -596,9 +585,6 @@ struct PhotonConversionBuilder { float pos_pt = RecoDecay::sqrtSumOfSquares(kfp_pos_DecayVtx.GetPx(), kfp_pos_DecayVtx.GetPy()); float ele_pt = RecoDecay::sqrtSumOfSquares(kfp_ele_DecayVtx.GetPx(), kfp_ele_DecayVtx.GetPy()); - if (pos_pt < min_pt_leg_at_sv || ele_pt < min_pt_leg_at_sv) { - return; - } if (isITSonlyTrack(pos) && pos_pt > maxpt_itsonly) { return; diff --git a/PWGEM/PhotonMeson/Tasks/pcmQC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQC.cxx index e593e69e52f..5b4d9c6be48 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQC.cxx @@ -134,7 +134,7 @@ struct PCMQC { // v0 info fRegistry.add("V0/hPt", "pT;p_{T,#gamma} (GeV/c)", kTH1F, {{2000, 0.0f, 20}}, false); - fRegistry.add("V0/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{90, 0, 2 * M_PI}, {40, -1.0f, 1.0f}}, false); + fRegistry.add("V0/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{90, 0, 2 * M_PI}, {200, -1.0f, 1.0f}}, false); fRegistry.add("V0/hRadius", "V0Radius; radius in Z (cm);radius in XY (cm)", kTH2F, {{200, -100, 100}, {200, 0.0f, 100.0f}}, false); fRegistry.add("V0/hCosPA", "V0CosPA;cosine pointing angle", kTH1F, {{100, 0.99f, 1.0f}}, false); fRegistry.add("V0/hCosPA_Rxy", "cos PA vs. R_{xy};R_{xy} (cm);cosine pointing angle", kTH2F, {{200, 0.f, 100.f}, {100, 0.99f, 1.0f}}, false); @@ -160,7 +160,7 @@ struct PCMQC { // v0leg info fRegistry.add("V0Leg/hPt", "pT;p_{T,e} (GeV/c)", kTH1F, {{1000, 0.0f, 10}}, false); fRegistry.add("V0Leg/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{1000, -50, 50}}, false); - fRegistry.add("V0Leg/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{90, 0, 2 * M_PI}, {40, -1.0f, 1.0f}}, false); + fRegistry.add("V0Leg/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{90, 0, 2 * M_PI}, {200, -1.0f, 1.0f}}, false); fRegistry.add("V0Leg/hDCAxyz", "DCA xy vs. z;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -50.0f, 50.0f}, {200, -50.0f, 50.0f}}, false); fRegistry.add("V0Leg/hNclsTPC", "number of TPC clusters", kTH1F, {{161, -0.5, 160.5}}, false); fRegistry.add("V0Leg/hNcrTPC", "number of TPC crossed rows", kTH1F, {{161, -0.5, 160.5}}, false); diff --git a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx index 6005a6afbdc..bb050239175 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx @@ -176,7 +176,7 @@ struct PCMQCMC { // v0 info fRegistry.add("V0/primary/hPt", "pT;p_{T,#gamma} (GeV/c)", kTH1F, {{2000, 0.0f, 20}}, false); - fRegistry.add("V0/primary/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{90, 0, 2 * M_PI}, {40, -1.0f, 1.0f}}, false); + fRegistry.add("V0/primary/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{90, 0, 2 * M_PI}, {200, -1.0f, 1.0f}}, false); fRegistry.add("V0/primary/hRadius", "V0Radius; radius in Z (cm);radius in XY (cm)", kTH2F, {{200, -100, 100}, {200, 0.0f, 100.0f}}, false); fRegistry.add("V0/primary/hCosPA", "V0CosPA;cosine pointing angle", kTH1F, {{100, 0.99f, 1.0f}}, false); fRegistry.add("V0/primary/hCosPA_Rxy", "cos PA vs. R_{xy};R_{xy} (cm);cosine pointing angle", kTH2F, {{200, 0.f, 100.f}, {100, 0.99f, 1.0f}}, false); @@ -212,7 +212,7 @@ struct PCMQCMC { // v0leg info fRegistry.add("V0Leg/primary/hPt", "pT;p_{T,e} (GeV/c)", kTH1F, {{1000, 0.0f, 10}}, false); fRegistry.add("V0Leg/primary/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{1000, -50, 50}}, false); - fRegistry.add("V0Leg/primary/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{90, 0, 2 * M_PI}, {40, -3.0f, 1.0f}}, false); + fRegistry.add("V0Leg/primary/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{90, 0, 2 * M_PI}, {200, -1.0f, 1.0f}}, false); fRegistry.add("V0Leg/primary/hDCAxyz", "DCA xy vs. z;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -50.0f, 50.0f}, {200, -50.0f, 50.0f}}, false); fRegistry.add("V0Leg/primary/hNclsTPC", "number of TPC clusters", kTH1F, {{161, -0.5, 160.5}}, false); fRegistry.add("V0Leg/primary/hNcrTPC", "number of TPC crossed rows", kTH1F, {{161, -0.5, 160.5}}, false); diff --git a/PWGEM/PhotonMeson/Utils/PCMUtilities.h b/PWGEM/PhotonMeson/Utils/PCMUtilities.h index 63101c41418..625156cb373 100644 --- a/PWGEM/PhotonMeson/Utils/PCMUtilities.h +++ b/PWGEM/PhotonMeson/Utils/PCMUtilities.h @@ -24,7 +24,7 @@ //_______________________________________________________________________ inline bool checkAP(const float alpha, const float qt, const float alpha_max = 0.95, const float qt_max = 0.05) { - float ellipse = pow(alpha / alpha_max, 2) + pow(qt / qt_max, 2); + float ellipse = std::pow(alpha / alpha_max, 2) + std::pow(qt / qt_max, 2); if (ellipse < 1.0) { return true; } else { @@ -111,8 +111,8 @@ float getPtResolution(TV0 const& v0) float px = v0.px(); float py = v0.py(); float pt = v0.pt(); - float px_err = std::sqrt(fabs(v0.sigmaPx2())); - float py_err = std::sqrt(fabs(v0.sigmaPy2())); + float px_err = std::sqrt(std::fabs(v0.sigmaPx2())); + float py_err = std::sqrt(std::fabs(v0.sigmaPy2())); float pxy_err = v0.sigmaPxPy(); return std::sqrt(std::pow(px / pt * px_err, 2) + std::pow(py / pt * py_err, 2) + 2.f * px / pt * py / pt * pxy_err); } @@ -123,8 +123,8 @@ float getPhiResolution(TV0 const& v0) float px = v0.px(); float py = v0.py(); float pt = v0.pt(); - float px_err = std::sqrt(fabs(v0.sigmaPx2())); - float py_err = std::sqrt(fabs(v0.sigmaPy2())); + float px_err = std::sqrt(std::fabs(v0.sigmaPx2())); + float py_err = std::sqrt(std::fabs(v0.sigmaPy2())); float pxy_err = v0.sigmaPxPy(); return std::sqrt(std::pow(px / pt / pt * py_err, 2) + std::pow(py / pt / pt * px_err, 2) - 2.f * px / pt / pt * py / pt / pt * pxy_err); } @@ -137,9 +137,9 @@ float getThetaResolution(TV0 const& v0) float pz = v0.pz(); float pt = v0.pt(); float p = v0.p(); - float px_err = std::sqrt(fabs(v0.sigmaPx2())); - float py_err = std::sqrt(fabs(v0.sigmaPy2())); - float pz_err = std::sqrt(fabs(v0.sigmaPz2())); + float px_err = std::sqrt(std::fabs(v0.sigmaPx2())); + float py_err = std::sqrt(std::fabs(v0.sigmaPy2())); + float pz_err = std::sqrt(std::fabs(v0.sigmaPz2())); float pxy_err = v0.sigmaPxPy(); float pyz_err = v0.sigmaPyPz(); float pzx_err = v0.sigmaPzPx(); @@ -154,9 +154,9 @@ float getEtaResolution(TV0 const& v0) float pz = v0.pz(); float pt = v0.pt(); float p = v0.p(); - float px_err = std::sqrt(fabs(v0.sigmaPx2())); - float py_err = std::sqrt(fabs(v0.sigmaPy2())); - float pz_err = std::sqrt(fabs(v0.sigmaPz2())); + float px_err = std::sqrt(std::fabs(v0.sigmaPx2())); + float py_err = std::sqrt(std::fabs(v0.sigmaPy2())); + float pz_err = std::sqrt(std::fabs(v0.sigmaPz2())); float pxy_err = v0.sigmaPxPy(); float pyz_err = v0.sigmaPyPz(); float pzx_err = v0.sigmaPzPx(); @@ -170,9 +170,9 @@ float getPResolution(TV0 const& v0) float py = v0.py(); float pz = v0.pz(); float p = v0.p(); - float px_err = std::sqrt(fabs(v0.sigmaPx2())); - float py_err = std::sqrt(fabs(v0.sigmaPy2())); - float pz_err = std::sqrt(fabs(v0.sigmaPz2())); + float px_err = std::sqrt(std::fabs(v0.sigmaPx2())); + float py_err = std::sqrt(std::fabs(v0.sigmaPy2())); + float pz_err = std::sqrt(std::fabs(v0.sigmaPz2())); float pxy_err = v0.sigmaPxPy(); float pyz_err = v0.sigmaPyPz(); float pzx_err = v0.sigmaPzPx(); From 4db902331b7b8402f55b20f1ff75765d0f589316 Mon Sep 17 00:00:00 2001 From: alcaliva <32872606+alcaliva@users.noreply.github.com> Date: Thu, 6 Feb 2025 13:37:40 +0100 Subject: [PATCH 0069/1650] [PWGLF] updated jet selection in MC (#9787) --- PWGLF/Tasks/Nuspex/nucleiInJets.cxx | 247 +++++++++++++++------------- 1 file changed, 133 insertions(+), 114 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/nucleiInJets.cxx b/PWGLF/Tasks/Nuspex/nucleiInJets.cxx index ef7c5eadc8c..8ef42f4c65c 100644 --- a/PWGLF/Tasks/Nuspex/nucleiInJets.cxx +++ b/PWGLF/Tasks/Nuspex/nucleiInJets.cxx @@ -100,6 +100,7 @@ struct NucleiInJets { Configurable nGhosts{"nGhosts", 1000, "number of ghost particles"}; Configurable alpha{"alpha", 1.0, "Alpha"}; Configurable averagePtUE{"averagePtUE", 0.1, "Average pt of UE"}; + Configurable averagePtUEMC{"averagePtUEMC", 0.1, "Average pt of UE in MC"}; // Track Parameters Configurable par0{"par0", 0.00164, "par 0"}; @@ -162,6 +163,7 @@ struct NucleiInJets { registryQC.add("sumPtJetPlusUE", "sumPtJetPlusUE", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); registryQC.add("sumPtJet", "sumPtJet", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); registryQC.add("sumPtUE", "sumPtUE", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); + registryQC.add("sumPtUE_MC", "sumPtUE_MC", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); registryQC.add("nJets_found", "nJets_found", HistType::kTH1F, {{10, 0, 10, "#it{n}_{Jet}"}}); registryQC.add("nJets_selected", "nJets_selected", HistType::kTH1F, {{10, 0, 10, "#it{n}_{Jet}"}}); registryQC.add("dcaxy_vs_pt", "dcaxy_vs_pt", HistType::kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); @@ -985,21 +987,35 @@ struct NucleiInJets { // List of Tracks std::vector trk; + std::vector part; + std::vector ntrk; for (auto track : tracksPerColl) { // o2-linter: disable=[const-ref-in-for-loop] if (!passedTrackSelectionForJetReconstruction(track)) continue; + if (!track.has_mcParticle()) + continue; - TVector3 momentum(track.px(), track.py(), track.pz()); - trk.push_back(momentum); + const auto particle = track.mcParticle(); + TVector3 pRec(track.px(), track.py(), track.pz()); + TVector3 pGen(particle.px(), particle.py(), particle.pz()); + trk.push_back(pRec); + part.push_back(pGen); + ntrk.push_back(1); } + // Reject Empty Events + if (static_cast(trk.size()) < 1) + continue; + // Anti-kt Jet Finder int nParticlesRemoved(0); std::vector jet; + std::vector jetGen; std::vector ue1; std::vector ue2; + std::vector nParticlesInjet; do { double dijMin(1e+06), diBmin(1e+06); @@ -1025,26 +1041,35 @@ struct NucleiInJets { } if (dijMin < diBmin) { trk[iMin] = trk[iMin] + trk[jMin]; + ntrk[iMin] = ntrk[iMin] + ntrk[jMin]; + part[iMin] = part[iMin] + part[jMin]; trk[jMin].SetXYZ(0, 0, 0); + part[jMin].SetXYZ(0, 0, 0); + ntrk[jMin] = 0; nParticlesRemoved++; } if (dijMin > diBmin) { jet.push_back(trk[iBmin]); + jetGen.push_back(part[iBmin]); + nParticlesInjet.push_back(ntrk[iBmin]); trk[iBmin].SetXYZ(0, 0, 0); + part[iBmin].SetXYZ(0, 0, 0); nParticlesRemoved++; } } while (nParticlesRemoved < static_cast(trk.size())); // Jet Selection std::vector isSelected; - for (int i = 0; i < static_cast(jet.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] - isSelected.push_back(0); - } - int nJetsSelected(0); for (int i = 0; i < static_cast(jet.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] - if ((std::fabs(jet[i].Eta()) + rJet) > maxEta) + // Initialization + isSelected.push_back(0); + + // Jet fully contained inside acceptance + if ((std::fabs(jet[i].Eta()) + rJet) > (maxEta - 0.5)) + continue; + if (nParticlesInjet[i] < minNparticlesInJet) continue; // Perpendicular cones @@ -1055,20 +1080,16 @@ struct NucleiInJets { ue1.push_back(ueAxis1); ue2.push_back(ueAxis2); - double nPartJetPlusUE(0); - double ptJetPlusUE(0); - double ptJet(0); double ptUE(0); - for (auto track : tracksPerColl) { // o2-linter: disable=[const-ref-in-for-loop] if (!passedTrackSelectionForJetReconstruction(track)) continue; TVector3 selectedTrack(track.px(), track.py(), track.pz()); + if (!track.has_mcParticle()) + continue; - double deltaEtaJet = selectedTrack.Eta() - jet[i].Eta(); - double deltaPhiJet = getDeltaPhi(selectedTrack.Phi(), jet[i].Phi()); - double deltaRjet = std::sqrt(deltaEtaJet * deltaEtaJet + deltaPhiJet * deltaPhiJet); + const auto particle = track.mcParticle(); double deltaEtaUe1 = selectedTrack.Eta() - ueAxis1.Eta(); double deltaPhiUe1 = getDeltaPhi(selectedTrack.Phi(), ueAxis1.Phi()); double deltaRUe1 = std::sqrt(deltaEtaUe1 * deltaEtaUe1 + deltaPhiUe1 * deltaPhiUe1); @@ -1076,29 +1097,48 @@ struct NucleiInJets { double deltaPhiUe2 = getDeltaPhi(selectedTrack.Phi(), ueAxis2.Phi()); double deltaRUe2 = std::sqrt(deltaEtaUe2 * deltaEtaUe2 + deltaPhiUe2 * deltaPhiUe2); - if (deltaRjet < rJet) { - nPartJetPlusUE++; - ptJetPlusUE = ptJetPlusUE + selectedTrack.Pt(); - } - if (deltaRUe1 < rJet) { - ptUE = ptUE + selectedTrack.Pt(); - } - if (deltaRUe2 < rJet) { - ptUE = ptUE + selectedTrack.Pt(); + if ((deltaRUe1 < alpha * rJet) || (deltaRUe2 < alpha * rJet)) { + ptUE = ptUE + particle.pt(); } } - ptJet = ptJetPlusUE - 0.5 * ptUE; + registryQC.fill(HIST("sumPtUE_MC"), 0.5 * ptUE); - if (ptJet < minJetPt) - continue; - if (nPartJetPlusUE < minNparticlesInJet) + double ptJetCorr = jetGen[i].Pt() - averagePtUEMC; + + if (ptJetCorr < minJetPt) continue; + nJetsSelected++; isSelected[i] = 1; } if (nJetsSelected == 0) continue; - registryMC.fill(HIST("number_of_events_mc"), 6.5); + + // Overlaps + int nOverlapsJetJet(0); + int nOverlapsJetUe(0); + int nOverlapsUeUe(0); + int nOverlapsTot(0); + for (int i = 0; i < static_cast(jet.size()); i++) { + if (isSelected[i] == 0) + continue; + + for (int j = (i + 1); j < static_cast(jet.size()); j++) { + if (isSelected[j] == 0) + continue; + if (overlap(jet[i], jet[j], rJet)) + nOverlapsJetJet++; + if (overlap(jet[i], ue1[j], rJet) || overlap(jet[i], ue2[j], rJet)) + nOverlapsJetUe++; + if (overlap(ue1[i], ue1[j], rJet) || overlap(ue1[i], ue2[j], rJet) || overlap(ue2[i], ue2[j], rJet)) + nOverlapsUeUe++; + } + } + nOverlapsTot = nOverlapsJetJet + nOverlapsJetUe + nOverlapsUeUe; + if (nJetsSelected > nJetsPerEventMax) + continue; + if (requireNoOverlap && nOverlapsTot > 0) + continue; for (int i = 0; i < static_cast(jet.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] @@ -1167,6 +1207,7 @@ struct NucleiInJets { // List of Tracks std::vector trk; + std::vector ntrk; for (auto& particle : mcParticlesPerColl) { // o2-linter: disable=[const-ref-in-for-loop] if (particle.isPhysicalPrimary() && particle.pdgCode() == -2212) { @@ -1179,20 +1220,10 @@ struct NucleiInJets { double dz = particle.vz() - mccollision.posZ(); double dcaxy = std::sqrt(dx * dx + dy * dy); double dcaz = std::fabs(dz); - - if (setDCAselectionPtDep) { - if (dcaxy > (par0 + par1 / particle.pt())) - continue; - if (dcaz > (par0 + par1 / particle.pt())) - continue; - } - if (!setDCAselectionPtDep) { - if (dcaxy > maxDcaxy) - continue; - if (dcaz > maxDcaz) - continue; - } - + if (dcaxy > 0.25) + continue; + if (dcaz > 2.0) + continue; if (std::fabs(particle.eta()) > 0.8) continue; if (particle.pt() < 0.15) @@ -1205,6 +1236,7 @@ struct NucleiInJets { TVector3 momentum(particle.px(), particle.py(), particle.pz()); trk.push_back(momentum); + ntrk.push_back(1); } // Anti-kt Jet Finder @@ -1212,6 +1244,7 @@ struct NucleiInJets { std::vector jet; std::vector ue1; std::vector ue2; + std::vector nParticlesInjet; do { double dijMin(1e+06), diBmin(1e+06); @@ -1237,11 +1270,14 @@ struct NucleiInJets { } if (dijMin < diBmin) { trk[iMin] = trk[iMin] + trk[jMin]; + ntrk[iMin] = ntrk[iMin] + ntrk[jMin]; trk[jMin].SetXYZ(0, 0, 0); + ntrk[jMin] = 0; nParticlesRemoved++; } if (dijMin > diBmin) { jet.push_back(trk[iBmin]); + nParticlesInjet.push_back(ntrk[iBmin]); trk[iBmin].SetXYZ(0, 0, 0); nParticlesRemoved++; } @@ -1249,14 +1285,16 @@ struct NucleiInJets { // Jet Selection std::vector isSelected; - for (int i = 0; i < static_cast(jet.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] - isSelected.push_back(0); - } - int nJetsSelected(0); for (int i = 0; i < static_cast(jet.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] - if ((std::fabs(jet[i].Eta()) + rJet) > maxEta) + // Initialization + isSelected.push_back(0); + + // Jet fully contained inside acceptance + if ((std::fabs(jet[i].Eta()) + rJet) > (maxEta - 0.5)) + continue; + if (nParticlesInjet[i] < minNparticlesInJet) continue; // Perpendicular cones @@ -1267,76 +1305,40 @@ struct NucleiInJets { ue1.push_back(ueAxis1); ue2.push_back(ueAxis2); - double nPartJetPlusUE(0); - double ptJetPlusUE(0); - double ptJet(0); - double ptUE(0); - - for (auto& particle : mcParticlesPerColl) { // o2-linter: disable=[const-ref-in-for-loop] - - // Select Primary Particles - double dx = particle.vx() - mccollision.posX(); - double dy = particle.vy() - mccollision.posY(); - double dz = particle.vz() - mccollision.posZ(); - double dcaxy = std::sqrt(dx * dx + dy * dy); - double dcaz = std::fabs(dz); + double ptJetCorr = jet[i].Pt() - averagePtUEMC; + if (ptJetCorr < minJetPt) + continue; - if (setDCAselectionPtDep) { - if (dcaxy > (par0 + par1 / particle.pt())) - continue; - if (dcaz > (par0 + par1 / particle.pt())) - continue; - } - if (!setDCAselectionPtDep) { - if (dcaxy > maxDcaxy) - continue; - if (dcaz > maxDcaz) - continue; - } + nJetsSelected++; + isSelected[i] = 1; + } + if (nJetsSelected == 0) + continue; - if (std::fabs(particle.eta()) > 0.8) - continue; - if (particle.pt() < 0.15) - continue; + // Overlaps + int nOverlapsJetJet(0); + int nOverlapsJetUe(0); + int nOverlapsUeUe(0); + int nOverlapsTot(0); + for (int i = 0; i < static_cast(jet.size()); i++) { + if (isSelected[i] == 0) + continue; - // PDG Selection - int pdg = std::fabs(particle.pdgCode()); - if ((pdg != 11) && (pdg != 211) && (pdg != 321) && (pdg != 2212)) + for (int j = (i + 1); j < static_cast(jet.size()); j++) { + if (isSelected[j] == 0) continue; - - TVector3 selectedTrack(particle.px(), particle.py(), particle.pz()); - - double deltaEtaJet = selectedTrack.Eta() - jet[i].Eta(); - double deltaPhiJet = getDeltaPhi(selectedTrack.Phi(), jet[i].Phi()); - double deltaRjet = std::sqrt(deltaEtaJet * deltaEtaJet + deltaPhiJet * deltaPhiJet); - double deltaEtaUe1 = selectedTrack.Eta() - ueAxis1.Eta(); - double deltaPhiUe1 = getDeltaPhi(selectedTrack.Phi(), ueAxis1.Phi()); - double deltaRUe1 = std::sqrt(deltaEtaUe1 * deltaEtaUe1 + deltaPhiUe1 * deltaPhiUe1); - double deltaEtaUe2 = selectedTrack.Eta() - ueAxis2.Eta(); - double deltaPhiUe2 = getDeltaPhi(selectedTrack.Phi(), ueAxis2.Phi()); - double deltaRUe2 = std::sqrt(deltaEtaUe2 * deltaEtaUe2 + deltaPhiUe2 * deltaPhiUe2); - - if (deltaRjet < rJet) { - nPartJetPlusUE++; - ptJetPlusUE = ptJetPlusUE + selectedTrack.Pt(); - } - if (deltaRUe1 < rJet) { - ptUE = ptUE + selectedTrack.Pt(); - } - if (deltaRUe2 < rJet) { - ptUE = ptUE + selectedTrack.Pt(); - } + if (overlap(jet[i], jet[j], rJet)) + nOverlapsJetJet++; + if (overlap(jet[i], ue1[j], rJet) || overlap(jet[i], ue2[j], rJet)) + nOverlapsJetUe++; + if (overlap(ue1[i], ue1[j], rJet) || overlap(ue1[i], ue2[j], rJet) || overlap(ue2[i], ue2[j], rJet)) + nOverlapsUeUe++; } - ptJet = ptJetPlusUE - 0.5 * ptUE; - - if (ptJet < minJetPt) - continue; - if (nPartJetPlusUE < minNparticlesInJet) - continue; - nJetsSelected++; - isSelected[i] = 1; } - if (nJetsSelected == 0) + nOverlapsTot = nOverlapsJetJet + nOverlapsJetUe + nOverlapsUeUe; + if (nJetsSelected > nJetsPerEventMax) + continue; + if (requireNoOverlap && nOverlapsTot > 0) continue; for (int i = 0; i < static_cast(jet.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] @@ -1390,7 +1392,9 @@ struct NucleiInJets { TVector3 momentum(track.px(), track.py(), track.pz()); trk.push_back(momentum); } - // int nTracks = static_cast(trk.size()); + // Reject Empty Events + if (static_cast(trk.size()) < 1) + return; // Generate Ghosts for (int i = 0; i < nGhosts; i++) { // o2-linter: disable=[const-ref-in-for-loop] @@ -1451,8 +1455,14 @@ struct NucleiInJets { for (int i = 0; i < static_cast(jet.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] - if ((std::fabs(jet[i].Eta()) + rJet) > maxEta) + if ((std::fabs(jet[i].Eta()) + rJet) > (maxEta - 0.5)) continue; + + double ptJetRec = jet[i].Pt() - averagePtUE; + double ptJetCorr = getCorrectedPt(ptJetRec); + if (ptJetCorr < minJetPt) + continue; + registryQC.fill(HIST("hJetArea"), jetArea[i]); } } @@ -1469,6 +1479,7 @@ struct NucleiInJets { // List of Tracks and Particles std::vector trk; std::vector part; + std::vector ntrk; auto tracksPerColl = mcTracks.sliceBy(perCollision, collision.globalIndex()); for (auto track : tracksPerColl) { // o2-linter: disable=[const-ref-in-for-loop] @@ -1483,12 +1494,17 @@ struct NucleiInJets { TVector3 genMomentum(particle.px(), particle.py(), particle.pz()); trk.push_back(recMomentum); part.push_back(genMomentum); + ntrk.push_back(1); } + // Reject Empty Events + if (static_cast(trk.size()) < 1) + continue; // Anti-kt Jet Finder int nParticlesRemoved(0); std::vector jetRecMomentum; std::vector jetGenMomentum; + std::vector nParticlesInjet; do { double dijMin(1e+06), diBmin(1e+06); @@ -1514,13 +1530,16 @@ struct NucleiInJets { } if (dijMin < diBmin) { trk[iMin] = trk[iMin] + trk[jMin]; + ntrk[iMin] = ntrk[iMin] + ntrk[jMin]; part[iMin] = part[iMin] + part[jMin]; trk[jMin].SetXYZ(0, 0, 0); + ntrk[jMin] = 0; nParticlesRemoved++; } if (dijMin > diBmin) { jetRecMomentum.push_back(trk[iBmin]); jetGenMomentum.push_back(part[iBmin]); + nParticlesInjet.push_back(ntrk[iBmin]); trk[iBmin].SetXYZ(0, 0, 0); nParticlesRemoved++; } @@ -1528,7 +1547,7 @@ struct NucleiInJets { for (int i = 0; i < static_cast(jetRecMomentum.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] - if ((std::fabs(jetRecMomentum[i].Eta()) + rJet) > maxEta) + if ((std::fabs(jetRecMomentum[i].Eta()) + rJet) > (maxEta - 0.5)) continue; double ptGen = jetGenMomentum[i].Pt(); From 8ac92b4074809454fb290b075092c49a1965e87b Mon Sep 17 00:00:00 2001 From: Zuzanna Chochulska <87480906+zchochul@users.noreply.github.com> Date: Thu, 6 Feb 2025 14:07:47 +0100 Subject: [PATCH 0070/1650] PWGCF: FemtoUniverse -- Removing unused configurables and commented code (#9788) Co-authored-by: Zuzanna Chochulska <01150674@pw.edu.pl> --- .../Tasks/femtoUniversePairTaskTrackPhi.cxx | 40 ------------------- 1 file changed, 40 deletions(-) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx index 6a3e2f2c5a7..4cc283b8505 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx @@ -58,10 +58,6 @@ struct FemtoUniversePairTaskTrackPhi { Service pdgMC; - // using FemtoFullParticles = soa::Join; - // Filter trackCutFilter = requireGlobalTrackInFilter(); // Global track cuts - // using FilteredFemtoFullParticles = soa::Filtered; - using FilteredFemtoFullParticles = soa::Join; SliceCache cache; @@ -70,14 +66,6 @@ struct FemtoUniversePairTaskTrackPhi { using FemtoRecoParticles = soa::Join; Preslice perColMC = aod::femtouniverseparticle::fdCollisionId; - // Efficiency - struct : o2::framework::ConfigurableGroup { - Configurable confEfficiencyTrackPath{"confEfficiencyTrackPath", "", "Local path to proton efficiency TH2F file"}; - Configurable confEfficiencyPhiPath{"confEfficiencyPhiPath", "", "Local path to Phi efficiency TH2F file"}; - Configurable confEfficiencyTrackTimestamp{"confEfficiencyTrackTimestamp", 0, "(int64_t) Timestamp for hadron"}; - Configurable confEfficiencyPhiTimestamp{"confEfficiencyPhiTimestamp", 0, "(int64_t) Timestamp for phi"}; - } ConfEff; - struct : o2::framework::ConfigurableGroup { Configurable confCPRIsEnabled{"confCPRIsEnabled", false, "Close Pair Rejection"}; Configurable confCPRPlotPerRadii{"confCPRPlotPerRadii", false, "Plot CPR per radii"}; @@ -99,9 +87,6 @@ struct FemtoUniversePairTaskTrackPhi { Configurable confPIDProtonNsigmaReject{"confPIDProtonNsigmaReject", 3.0, "Reject if particle could be a Proton combined nsigma value."}; Configurable confPIDPionNsigmaCombined{"confPIDPionNsigmaCombined", 3.0, "TPC and TOF Pion Sigma (combined) for momentum > 0.5"}; Configurable confPIDPionNsigmaTPC{"confPIDPionNsigmaTPC", 3.0, "TPC Pion Sigma for momentum < 0.5"}; - - // Configurable> confCutTable{"confCutTable", {cutsTable[0], NPart, NCuts, partNames, cutNames}, "Particle selections"}; //unused - // Configurable confNspecies{"confNspecies", 2, "Number of particle spieces with PID info"}; //unused Configurable confIsMC{"confIsMC", false, "Enable additional Histograms in the case of a MonteCarlo Run"}; Configurable> confTrkPIDnSigmaMax{"confTrkPIDnSigmaMax", std::vector{4.f, 3.f, 2.f}, "This configurable needs to be the same as the one used in the producer task"}; Configurable confUse3D{"confUse3D", false, "Enable three dimensional histogramms (to be used only for analysis with high statistics): k* vs mT vs multiplicity"}; @@ -212,10 +197,6 @@ struct FemtoUniversePairTaskTrackPhi { EfficiencyConfigurableGroup effConfGroup; EfficiencyCalculator efficiencyCalculator{&effConfGroup}; - // Service ccdb; - // TH2F* protoneff; - // TH2F* phieff; - /// @brief Counter for particle swapping int fNeventsProcessed = 0; bool swpart = 0; @@ -468,27 +449,6 @@ struct FemtoUniversePairTaskTrackPhi { if (ConfCPR.confCPRIsEnabled.value) { pairCloseRejection.init(&resultRegistry, &qaRegistry, ConfCPR.confCPRdeltaPhiCutMin.value, ConfCPR.confCPRdeltaPhiCutMax.value, ConfCPR.confCPRdeltaEtaCutMin.value, ConfCPR.confCPRdeltaEtaCutMax.value, ConfCPR.confCPRChosenRadii.value, ConfCPR.confCPRPlotPerRadii.value, ConfCPR.confCPRInvMassCutMin.value, ConfCPR.confCPRInvMassCutMax.value); } - - /// Initializing CCDB - // ccdb->setURL("http://alice-ccdb.cern.ch"); - // ccdb->setCaching(true); - // ccdb->setLocalObjectValidityChecking(); - - // int64_t now = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); - // ccdb->setCreatedNotAfter(now); - - // if (!ConfEff.confEfficiencyTrackPath.value.empty()) { - // protoneff = ccdb->getForTimeStamp(ConfEff.confEfficiencyTrackPath.value.c_str(), ConfEff.confEfficiencyTrackTimestamp.value); - // if (!protoneff || protoneff->IsZombie()) { - // LOGF(fatal, "Could not load efficiency protoneff histogram from %s", ConfEff.confEfficiencyTrackPath.value.c_str()); - // } - // } - // if (!ConfEff.confEfficiencyPhiPath.value.empty()) { - // phieff = ccdb->getForTimeStamp(ConfEff.confEfficiencyPhiPath.value.c_str(), ConfEff.confEfficiencyPhiTimestamp.value); - // if (!phieff || phieff->IsZombie()) { - // LOGF(fatal, "Could not load efficiency phieff histogram from %s", ConfEff.confEfficiencyPhiPath.value.c_str()); - // } - // } } template From be41e0eff33013c5187636f9d10d9b1a50ffc6ee Mon Sep 17 00:00:00 2001 From: Artem Kotliarov <71133985+KotliarovAr@users.noreply.github.com> Date: Thu, 6 Feb 2025 14:46:42 +0100 Subject: [PATCH 0071/1650] [PWGJE] Hadron jet recoil (#9762) --- PWGJE/Tasks/recoilJets.cxx | 218 ++++++++++++++++++++----------------- 1 file changed, 119 insertions(+), 99 deletions(-) diff --git a/PWGJE/Tasks/recoilJets.cxx b/PWGJE/Tasks/recoilJets.cxx index 1ef4e89f543..ba1a2a08351 100644 --- a/PWGJE/Tasks/recoilJets.cxx +++ b/PWGJE/Tasks/recoilJets.cxx @@ -72,13 +72,10 @@ struct RecoilJets { Configurable trkPtMin{"trkPtMin", 0.15, "Minimum pT of acceptanced tracks"}; Configurable trkPtMax{"trkPtMax", 100., "Maximum pT of acceptanced tracks"}; - Configurable trkPhiMin{"trkPhiMin", -7., "Minimum phi angle of acceptanced tracks"}; - Configurable trkPhiMax{"trkPhiMax", 7., "Maximum phi angle of acceptanced tracks"}; - Configurable trkEtaCut{"trkEtaCut", 0.9, "Eta acceptance of TPC"}; Configurable jetR{"jetR", 0.4, "Jet cone radius"}; - Configurable triggerMasks{"triggerMasks", "", "Relevant trigger masks: fJetChLowPt,fJetChHighPt,fTrackLowPt,fTrackHighPt"}; + Configurable triggerMasks{"triggerMasks", "", "Relevant trigger masks: fTrackLowPt,fTrackHighPt"}; // List of configurable parameters for MC Configurable pTHatExponent{"pTHatExponent", 4.0, "Exponent of the event weight for the calculation of pTHat"}; @@ -97,10 +94,13 @@ struct RecoilJets { // Axes specification AxisSpec pT{histJetPt, 0.0, histJetPt * 1.0, "#it{p}_{T} (GeV/#it{c})"}; AxisSpec jetPTcorr{histJetPt + 20, -20., histJetPt * 1.0, "#it{p}_{T, jet}^{ch, corr} (GeV/#it{c})"}; - AxisSpec phiAngle{40, 0.0, constants::math::TwoPI, "#varphi (rad)"}; - AxisSpec deltaPhiAngle{52, 0.0, constants::math::PI, "#Delta#varphi (rad)"}; - AxisSpec pseudorap{40, -1., 1., "#eta"}; - AxisSpec rhoArea{60, 0.0, 30., "#rho #times #A_{jet}"}; + AxisSpec phiAngle{40, 0.0, constants::math::TwoPI, "#it{#varphi} (rad)"}; + AxisSpec deltaPhiAngle{52, 0.0, constants::math::PI, "#Delta#it{#varphi} (rad)"}; + AxisSpec pseudorap{40, -1., 1., "#it{#eta}"}; + AxisSpec pseudorapJets{20, -0.5, 0.5, "#it{#eta}_{jet}"}; + AxisSpec jetArea{50, 0.0, 5., "Area_{jet}"}; + AxisSpec rhoArea{60, 0.0, 60., "#it{#rho} #times Area_{jet}"}; + AxisSpec rho{50, 0.0, 50., "#it{#rho}"}; Preslice partJetsPerCollision = aod::jet::mcCollisionId; @@ -110,8 +110,9 @@ struct RecoilJets { Filter collisionFilter = nabs(aod::jcollision::posZ) < vertexZCut; Filter collisionFilterMC = nabs(aod::jmccollision::posZ) < vertexZCut; - // Declare filters on accepted tracks + // Declare filters on accepted tracks and MC particles (settings for jet reco are provided in the jet finder wagon) Filter trackFilter = aod::jtrack::pt > trkPtMin&& aod::jtrack::pt < trkPtMax&& nabs(aod::jtrack::eta) < trkEtaCut; + Filter partFilter = nabs(aod::jmcparticle::eta) < trkEtaCut; // Declare filter on jets Filter jetRadiusFilter = aod::jet::r == nround(jetR.node() * 100.); @@ -122,81 +123,91 @@ struct RecoilJets { int trackSelection = -1; std::vector triggerMaskBits; + Service pdg; + void init(InitContext const&) { - eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast(evSel)); trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast(trkSel)); triggerMaskBits = jetderiveddatautilities::initialiseTriggerMaskBits(triggerMasks); - // List of raw distributions - spectra.add("vertexZ", "Z vertex of collisions", kTH1F, {{60, -12., 12.}}); + // List of raw and MC det. distributions + if (doprocessData || doprocessMCDetLevel || doprocessMCDetLevelWeighted) { + spectra.add("vertexZ", "Z vertex of collisions", kTH1F, {{60, -12., 12.}}); - spectra.add("hTrackPtEtaPhi", "Charact. of tracks", kTH3F, {pT, pseudorap, phiAngle}); - spectra.add("hNtrig", "Total number of selected triggers per class", kTH1F, {{2, 0.0, 2.}}); - spectra.get(HIST("hNtrig"))->GetXaxis()->SetBinLabel(1, "TT_{ref}"); - spectra.get(HIST("hNtrig"))->GetXaxis()->SetBinLabel(2, "TT_{sig}"); + spectra.add("hTrackPtEtaPhi", "Charact. of tracks", kTH3F, {pT, pseudorap, phiAngle}); + spectra.add("hNtrig", "Total number of selected triggers per class", kTH1F, {{2, 0.0, 2.}}); + spectra.get(HIST("hNtrig"))->GetXaxis()->SetBinLabel(1, "TT_{ref}"); + spectra.get(HIST("hNtrig"))->GetXaxis()->SetBinLabel(2, "TT_{sig}"); - spectra.add("hTTRef_per_event", "Number of TT_{Ref} per event", kTH1F, {{10, 0.0, 10.}}); - spectra.add("hTTSig_per_event", "Number of TT_{Sig} per event", kTH1F, {{5, 0.0, 5.}}); + spectra.add("hTTRef_per_event", "Number of TT_{Ref} per event", kTH1F, {{15, 0.5, 15.5}}); + spectra.add("hTTSig_per_event", "Number of TT_{Sig} per event", kTH1F, {{10, 0.5, 10.5}}); - spectra.add("hJetPtEtaPhiRhoArea", "Charact. of inclusive jets", kTHnSparseF, {pT, pseudorap, phiAngle, rhoArea}); + spectra.add("hJetPtEtaPhiRhoArea", "Charact. of inclusive jets", kTHnSparseF, {pT, pseudorapJets, phiAngle, rho, jetArea}); - spectra.add("hDPhi_JetPt_Corr_TTRef", "Events w. TT_{Ref}: #Delta#varphi & #it{p}_{T, jet}^{ch}", kTH2F, {deltaPhiAngle, jetPTcorr}); - spectra.add("hDPhi_JetPt_Corr_TTSig", "Events w. TT_{Sig}: #Delta#varphi & #it{p}_{T, jet}^{ch}", kTH2F, {deltaPhiAngle, jetPTcorr}); - spectra.add("hDPhi_JetPt_TTRef", "Events w. TT_{Ref}: #Delta#varphi & #it{p}_{T, jet}^{ch}", kTH2F, {deltaPhiAngle, pT}); - spectra.add("hDPhi_JetPt_TTSig", "Events w. TT_{Sig}: #Delta#varphi & #it{p}_{T, jet}^{ch}", kTH2F, {deltaPhiAngle, pT}); + spectra.add("hDPhi_JetPt_Corr_TTRef", "Events w. TT_{Ref}: #Delta#varphi & #it{p}_{T, jet}^{ch}", kTH2F, {deltaPhiAngle, jetPTcorr}); + spectra.add("hDPhi_JetPt_Corr_TTSig", "Events w. TT_{Sig}: #Delta#varphi & #it{p}_{T, jet}^{ch}", kTH2F, {deltaPhiAngle, jetPTcorr}); + spectra.add("hDPhi_JetPt_TTRef", "Events w. TT_{Ref}: #Delta#varphi & #it{p}_{T, jet}^{ch}", kTH2F, {deltaPhiAngle, pT}); + spectra.add("hDPhi_JetPt_TTSig", "Events w. TT_{Sig}: #Delta#varphi & #it{p}_{T, jet}^{ch}", kTH2F, {deltaPhiAngle, pT}); - spectra.add("hRecoil_JetPt_Corr_TTRef", "Events w. TT_{Ref}: #it{p}_{T} of recoil jets", kTH1F, {jetPTcorr}); - spectra.add("hRecoil_JetPt_Corr_TTSig", "Events w. TT_{Sig}: #it{p}_{T} of recoil jets", kTH1F, {jetPTcorr}); - spectra.add("hRecoil_JetPt_TTRef", "Events w. TT_{Ref}: #it{p}_{T} of recoil jets", kTH1F, {pT}); - spectra.add("hRecoil_JetPt_TTSig", "Events w. TT_{Sig}: #it{p}_{T} of recoil jets", kTH1F, {pT}); + spectra.add("hRecoil_JetPt_Corr_TTRef", "Events w. TT_{Ref}: #it{p}_{T} of recoil jets", kTH1F, {jetPTcorr}); + spectra.add("hRecoil_JetPt_Corr_TTSig", "Events w. TT_{Sig}: #it{p}_{T} of recoil jets", kTH1F, {jetPTcorr}); + spectra.add("hRecoil_JetPt_TTRef", "Events w. TT_{Ref}: #it{p}_{T} of recoil jets", kTH1F, {pT}); + spectra.add("hRecoil_JetPt_TTSig", "Events w. TT_{Sig}: #it{p}_{T} of recoil jets", kTH1F, {pT}); - spectra.add("hDPhi_JetPt_RhoArea_TTRef", "Events w. TT_{Ref}: #Delta#varphi & jet pT & #rho #times A_{jet}", kTH3F, {deltaPhiAngle, pT, rhoArea}); - spectra.add("hDPhi_JetPt_RhoArea_TTSig", "Events w. TT_{Sig}: #Delta#varphi & jet pT & #rho #times A_{jet}", kTH3F, {deltaPhiAngle, pT, rhoArea}); + spectra.add("hJetArea_JetPt_Rho_TTRef", "Events w. TT_{Ref}: A_{jet} & jet pT & #rho", kTH3F, {jetArea, pT, rho}); + spectra.add("hJetArea_JetPt_Rho_TTSig", "Events w. TT_{Sig}: A_{jet} & jet pT & #rho", kTH3F, {jetArea, pT, rho}); + } // List of MC particle level distributions - spectra.add("hPartPtEtaPhi", "Charact. of particles", kTH3F, {pT, pseudorap, phiAngle}); - spectra.add("hNtrig_Part", "Total number of selected triggers per class", kTH1F, {{2, 0.0, 2.}}); - spectra.add("hTTRef_per_event_Part", "Number of TT_{Ref} per event", kTH1F, {{10, 0.0, 10.}}); - spectra.add("hTTSig_per_event_Part", "Number of TT_{Sig} per event", kTH1F, {{5, 0.0, 5.}}); - - spectra.add("hJetPtEtaPhiRhoArea_Part", "Charact. of inclusive part. level jets", kTHnSparseF, {pT, pseudorap, phiAngle, rhoArea}); - - spectra.add("hDPhi_JetPt_Corr_TTRef_Part", "Events w. TT_{Ref}: #Delta#varphi & #it{p}_{T, jet}^{ch}", kTH2F, {deltaPhiAngle, jetPTcorr}); - spectra.add("hDPhi_JetPt_Corr_TTSig_Part", "Events w. TT_{Sig}: #Delta#varphi & #it{p}_{T, jet}^{ch}", kTH2F, {deltaPhiAngle, jetPTcorr}); - spectra.add("hDPhi_JetPt_TTRef_Part", "Events w. TT_{Ref}: #Delta#varphi & #it{p}_{T, jet}^{ch}", kTH2F, {deltaPhiAngle, pT}); - spectra.add("hDPhi_JetPt_TTSig_Part", "Events w. TT_{Sig}: #Delta#varphi & #it{p}_{T, jet}^{ch}", kTH2F, {deltaPhiAngle, pT}); - - spectra.add("hRecoil_JetPt_Corr_TTRef_Part", "Events w. TT_{Ref}: #it{p}_{T} of recoil jets", kTH1F, {jetPTcorr}); - spectra.add("hRecoil_JetPt_Corr_TTSig_Part", "Events w. TT_{Sig}: #it{p}_{T} of recoil jets", kTH1F, {jetPTcorr}); - spectra.add("hRecoil_JetPt_TTRef_Part", "Events w. TT_{Ref}: #it{p}_{T} of recoil jets", kTH1F, {pT}); - spectra.add("hRecoil_JetPt_TTSig_Part", "Events w. TT_{Sig}: #it{p}_{T} of recoil jets", kTH1F, {pT}); - - spectra.add("hDPhi_JetPt_RhoArea_TTRef_Part", "Events w. TT_{Ref}: #Delta#varphi & jet pT & #rho #times A_{jet}", kTH3F, {deltaPhiAngle, pT, rhoArea}); - spectra.add("hDPhi_JetPt_RhoArea_TTSig_Part", "Events w. TT_{Sig}: #Delta#varphi & jet pT & #rho #times A_{jet}", kTH3F, {deltaPhiAngle, pT, rhoArea}); - - // Response matrices, jet pT & jet phi resolution - spectra.add("hJetPt_PartLevel_vs_DetLevel", "Correlation jet pT at part. vs. det. levels", kTH2F, {pT, pT}); - // spectra.add("hJetPt_Corr_PartLevel_vs_DetLevel", "Correlation jet pT at part. vs. det. levels", kTH2F, {jetPTcorr, jetPTcorr}); - spectra.add("hJetPt_PartLevel_vs_DetLevel_RecoilJets", "Correlation recoil jet pT at part. vs. det. levels", kTH2F, {pT, pT}); - // spectra.add("hJetPt_Corr_PartLevel_vs_DetLevel_RecoilJets", "Correlation recoil jet pT at part. vs. det. levels", kTH2F, {jetPTcorr, jetPTcorr}); - - spectra.add("hMissedJets_pT", "Part. level jets w/o matched pair", kTH1F, {pT}); - // spectra.add("hMissedJets_Corr_pT", "Part. level jets w/o matched pair", kTH1F, {jetPTcorr}); - spectra.add("hMissedJets_pT_RecoilJets", "Part. level jets w/o matched pair", kTH1F, {pT}); - // spectra.add("hMissedJets_Corr_pT_RecoilJets", "Part. level jets w/o matched pair", kTH1F, {jetPTcorr}); - - spectra.add("hFakeJets_pT", "Det. level jets w/o matched pair", kTH1F, {pT}); - // spectra.add("hFakeJets_Corr_pT", "Det. level jets w/o matched pair", kTH1F, {jetPTcorr}); - spectra.add("hFakeJets_pT_RecoilJets", "Det. level jets w/o matched pair", kTH1F, {pT}); - // spectra.add("hFakeJets_Corr_pT_RecoilJets", "Det. level jets w/o matched pair", kTH1F, {jetPTcorr}); - - spectra.add("hJetPt_resolution", "Jet p_{T} relative resolution as a func. of jet #it{p}_{T, part}", kTH2F, {{60, -1., 2.}, pT}); - spectra.add("hJetPt_resolution_RecoilJets", "Jet p_{T} relative resolution as a func. of jet #it{p}_{T, part}", kTH2F, {{60, -1., 2.}, pT}); - - spectra.add("hJetPhi_resolution", "#varphi resolution as a func. of jet #it{p}_{T, part}", kTH2F, {{40, -1., 1.}, pT}); - spectra.add("hJetPhi_resolution_RecoilJets", "#varphi resolution as a func. of jet #it{p}_{T, part}", kTH2F, {{40, -1., 1.}, pT}); + if (doprocessMCPartLevel || doprocessMCPartLevelWeighted) { + spectra.add("hPartPtEtaPhi", "Charact. of particles", kTH3F, {pT, pseudorap, phiAngle}); + spectra.add("hNtrig_Part", "Total number of selected triggers per class", kTH1F, {{2, 0.0, 2.}}); + spectra.get(HIST("hNtrig_Part"))->GetXaxis()->SetBinLabel(1, "TT_{ref}"); + spectra.get(HIST("hNtrig_Part"))->GetXaxis()->SetBinLabel(2, "TT_{sig}"); + + spectra.add("hTTRef_per_event_Part", "Number of TT_{Ref} per event", kTH1F, {{15, 0.5, 15.5}}); + spectra.add("hTTSig_per_event_Part", "Number of TT_{Sig} per event", kTH1F, {{10, 0.5, 10.5}}); + + spectra.add("hJetPtEtaPhiRhoArea_Part", "Charact. of inclusive part. level jets", kTHnSparseF, {pT, pseudorapJets, phiAngle, rho, jetArea}); + + spectra.add("hDPhi_JetPt_Corr_TTRef_Part", "Events w. TT_{Ref}: #Delta#varphi & #it{p}_{T, jet}^{ch}", kTH2F, {deltaPhiAngle, jetPTcorr}); + spectra.add("hDPhi_JetPt_Corr_TTSig_Part", "Events w. TT_{Sig}: #Delta#varphi & #it{p}_{T, jet}^{ch}", kTH2F, {deltaPhiAngle, jetPTcorr}); + spectra.add("hDPhi_JetPt_TTRef_Part", "Events w. TT_{Ref}: #Delta#varphi & #it{p}_{T, jet}^{ch}", kTH2F, {deltaPhiAngle, pT}); + spectra.add("hDPhi_JetPt_TTSig_Part", "Events w. TT_{Sig}: #Delta#varphi & #it{p}_{T, jet}^{ch}", kTH2F, {deltaPhiAngle, pT}); + + spectra.add("hRecoil_JetPt_Corr_TTRef_Part", "Events w. TT_{Ref}: #it{p}_{T} of recoil jets", kTH1F, {jetPTcorr}); + spectra.add("hRecoil_JetPt_Corr_TTSig_Part", "Events w. TT_{Sig}: #it{p}_{T} of recoil jets", kTH1F, {jetPTcorr}); + spectra.add("hRecoil_JetPt_TTRef_Part", "Events w. TT_{Ref}: #it{p}_{T} of recoil jets", kTH1F, {pT}); + spectra.add("hRecoil_JetPt_TTSig_Part", "Events w. TT_{Sig}: #it{p}_{T} of recoil jets", kTH1F, {pT}); + + spectra.add("hJetArea_JetPt_Rho_TTRef_Part", "Events w. TT_{Ref}: A_{jet} & jet pT & #rho", kTH3F, {jetArea, pT, rho}); + spectra.add("hJetArea_JetPt_Rho_TTSig_Part", "Events w. TT_{Sig}: A_{jet} & jet pT & #rho", kTH3F, {jetArea, pT, rho}); + } + + // Jet matching: part. vs. det. + if (doprocessJetsMatched || doprocessJetsMatchedWeighted) { + spectra.add("hJetPt_PartLevel_vs_DetLevel", "Correlation jet pT at part. vs. det. levels", kTH2F, {{200, 0.0, 200.}, {200, 0.0, 200.}}); + // spectra.add("hJetPt_Corr_PartLevel_vs_DetLevel", "Correlation jet pT at part. vs. det. levels", kTH2F, {jetPTcorr, jetPTcorr}); + spectra.add("hJetPt_PartLevel_vs_DetLevel_RecoilJets", "Correlation recoil jet pT at part. vs. det. levels", kTH2F, {{200, 0.0, 200.}, {200, 0.0, 200.}}); + // spectra.add("hJetPt_Corr_PartLevel_vs_DetLevel_RecoilJets", "Correlation recoil jet pT at part. vs. det. levels", kTH2F, {jetPTcorr, jetPTcorr}); + + spectra.add("hMissedJets_pT", "Part. level jets w/o matched pair", kTH1F, {{200, 0.0, 200.}}); + // spectra.add("hMissedJets_Corr_pT", "Part. level jets w/o matched pair", kTH1F, {jetPTcorr}); + // spectra.add("hMissedJets_pT_RecoilJets", "Part. level jets w/o matched pair", kTH1F, {{200, 0.0, 200.}}); + // spectra.add("hMissedJets_Corr_pT_RecoilJets", "Part. level jets w/o matched pair", kTH1F, {jetPTcorr}); + + spectra.add("hFakeJets_pT", "Det. level jets w/o matched pair", kTH1F, {{200, 0.0, 200.}}); + // spectra.add("hFakeJets_Corr_pT", "Det. level jets w/o matched pair", kTH1F, {jetPTcorr}); + spectra.add("hFakeJets_pT_RecoilJets", "Det. level jets w/o matched pair", kTH1F, {{200, 0.0, 200.}}); + // spectra.add("hFakeJets_Corr_pT_RecoilJets", "Det. level jets w/o matched pair", kTH1F, {jetPTcorr}); + + spectra.add("hJetPt_resolution", "Jet p_{T} relative resolution as a func. of jet #it{p}_{T, part}", kTH2F, {{100, -5., 5.}, pT}); + spectra.add("hJetPt_resolution_RecoilJets", "Jet p_{T} relative resolution as a func. of jet #it{p}_{T, part}", kTH2F, {{100, -5., 5.}, pT}); + + spectra.add("hJetPhi_resolution", "#varphi resolution as a func. of jet #it{p}_{T, part}", kTH2F, {{40, -1., 1.}, pT}); + spectra.add("hJetPhi_resolution_RecoilJets", "#varphi resolution as a func. of jet #it{p}_{T, part}", kTH2F, {{40, -1., 1.}, pT}); + } } // Fill histograms with raw or MC det. level data @@ -217,7 +228,7 @@ struct RecoilJets { bSigEv = true; for (const auto& track : tracks) { - if (!jetderiveddatautilities::selectTrack(track, trackSelection)) + if (skipTrack(track)) continue; spectra.fill(HIST("hTrackPtEtaPhi"), track.pt(), track.eta(), track.phi(), weight); @@ -252,18 +263,18 @@ struct RecoilJets { if (bIsMC && (jet.pt() > pTHatMax * pTHat)) continue; - spectra.fill(HIST("hJetPtEtaPhiRhoArea"), jet.pt(), jet.eta(), jet.phi(), collision.rho() * jet.area(), weight); + spectra.fill(HIST("hJetPtEtaPhiRhoArea"), jet.pt(), jet.eta(), jet.phi(), collision.rho(), jet.area(), weight); if (nTT > 0) { - auto [dphi, bRecoil] = isRecoilJet(jet, phiTT); + auto [dphi, bRecoilJet] = isRecoilJet(jet, phiTT); if (bSigEv) { spectra.fill(HIST("hDPhi_JetPt_Corr_TTSig"), dphi, jet.pt() - collision.rho() * jet.area(), weight); spectra.fill(HIST("hDPhi_JetPt_TTSig"), dphi, jet.pt(), weight); - spectra.fill(HIST("hDPhi_JetPt_RhoArea_TTSig"), dphi, jet.pt(), collision.rho() * jet.area(), weight); + spectra.fill(HIST("hJetArea_JetPt_Rho_TTSig"), jet.area(), jet.pt(), collision.rho(), weight); - if (bRecoil) { + if (bRecoilJet) { spectra.fill(HIST("hRecoil_JetPt_Corr_TTSig"), jet.pt() - collision.rho() * jet.area(), weight); spectra.fill(HIST("hRecoil_JetPt_TTSig"), jet.pt(), weight); } @@ -271,9 +282,9 @@ struct RecoilJets { } else { spectra.fill(HIST("hDPhi_JetPt_Corr_TTRef"), dphi, jet.pt() - collision.rho() * jet.area(), weight); spectra.fill(HIST("hDPhi_JetPt_TTRef"), dphi, jet.pt(), weight); - spectra.fill(HIST("hDPhi_JetPt_RhoArea_TTRef"), dphi, jet.pt(), collision.rho() * jet.area(), weight); + spectra.fill(HIST("hJetArea_JetPt_Rho_TTRef"), jet.area(), jet.pt(), collision.rho(), weight); - if (bRecoil) { + if (bRecoilJet) { spectra.fill(HIST("hRecoil_JetPt_Corr_TTRef"), jet.pt() - collision.rho() * jet.area(), weight); spectra.fill(HIST("hRecoil_JetPt_TTRef"), jet.pt(), weight); } @@ -296,10 +307,13 @@ struct RecoilJets { bSigEv = true; for (const auto& particle : particles) { + auto pdgParticle = pdg->GetParticle(particle.pdgCode()); + if (!pdgParticle) + continue; - // Need charge and primary particles - bool bParticleNeutral = (static_cast(particle.e()) == 0); - if (bParticleNeutral || (!particle.isPhysicalPrimary())) + // Need charge and physical primary particles + bool bParticleNeutral = (static_cast(pdgParticle->Charge()) == 0); + if (bParticleNeutral || !particle.isPhysicalPrimary()) continue; spectra.fill(HIST("hPartPtEtaPhi"), particle.pt(), particle.eta(), particle.phi(), weight); @@ -333,19 +347,19 @@ struct RecoilJets { if (jet.pt() > pTHatMax * pTHat) continue; - spectra.fill(HIST("hJetPtEtaPhiRhoArea_Part"), jet.pt(), jet.eta(), jet.phi(), collision.rho() * jet.area(), weight); + spectra.fill(HIST("hJetPtEtaPhiRhoArea_Part"), jet.pt(), jet.eta(), jet.phi(), collision.rho(), jet.area(), weight); if (nTT > 0) { - auto [dphi, bRecoil] = isRecoilJet(jet, phiTT); + auto [dphi, bRecoilJet] = isRecoilJet(jet, phiTT); if (bSigEv) { spectra.fill(HIST("hDPhi_JetPt_Corr_TTSig_Part"), dphi, jet.pt() - collision.rho() * jet.area(), weight); spectra.fill(HIST("hDPhi_JetPt_TTSig_Part"), dphi, jet.pt(), weight); - spectra.fill(HIST("hDPhi_JetPt_RhoArea_TTSig_Part"), dphi, jet.pt(), collision.rho() * jet.area(), weight); + spectra.fill(HIST("hJetArea_JetPt_Rho_TTSig_Part"), jet.area(), jet.pt(), collision.rho(), weight); - if (bRecoil) { + if (bRecoilJet) { spectra.fill(HIST("hRecoil_JetPt_Corr_TTSig_Part"), jet.pt() - collision.rho() * jet.area(), weight); spectra.fill(HIST("hRecoil_JetPt_TTSig_Part"), jet.pt(), weight); } @@ -354,9 +368,9 @@ struct RecoilJets { spectra.fill(HIST("hDPhi_JetPt_Corr_TTRef_Part"), dphi, jet.pt() - collision.rho() * jet.area(), weight); spectra.fill(HIST("hDPhi_JetPt_TTRef_Part"), dphi, jet.pt(), weight); - spectra.fill(HIST("hDPhi_JetPt_RhoArea_TTRef_Part"), dphi, jet.pt(), collision.rho() * jet.area(), weight); + spectra.fill(HIST("hJetArea_JetPt_Rho_TTRef_Part"), jet.area(), jet.pt(), collision.rho(), weight); - if (bRecoil) { + if (bRecoilJet) { spectra.fill(HIST("hRecoil_JetPt_Corr_TTRef_Part"), jet.pt() - collision.rho() * jet.area(), weight); spectra.fill(HIST("hRecoil_JetPt_TTRef_Part"), jet.pt(), weight); } @@ -374,7 +388,7 @@ struct RecoilJets { float pTHat = getPtHat(weight); for (const auto& track : tracks) { - if (!jetderiveddatautilities::selectTrack(track, trackSelection)) + if (skipTrack(track)) continue; if (track.pt() > ptTTsigMin && track.pt() < ptTTsigMax) { @@ -390,7 +404,7 @@ struct RecoilJets { if (jet_det_level.pt() > pTHatMax * pTHat) continue; - bool bRecoil = get<1>(isRecoilJet(jet_det_level, phiTT)) && bTT; + bool bRecoilJet = get<1>(isRecoilJet(jet_det_level, phiTT)) && bTT; if (jet_det_level.has_matchedJetGeo()) { @@ -411,7 +425,7 @@ struct RecoilJets { spectra.fill(HIST("hJetPt_resolution"), (jet_matched_part_level.pt() - jet_det_level.pt()) / jet_matched_part_level.pt(), jet_matched_part_level.pt(), weight); spectra.fill(HIST("hJetPhi_resolution"), jet_matched_part_level.phi() - jet_det_level.phi(), jet_matched_part_level.pt(), weight); - if (bRecoil) { + if (bRecoilJet) { spectra.fill(HIST("hJetPt_PartLevel_vs_DetLevel_RecoilJets"), jet_det_level.pt(), jet_matched_part_level.pt(), weight); spectra.fill(HIST("hJetPt_resolution_RecoilJets"), (jet_matched_part_level.pt() - jet_det_level.pt()) / jet_matched_part_level.pt(), jet_matched_part_level.pt(), weight); spectra.fill(HIST("hJetPhi_resolution_RecoilJets"), jet_matched_part_level.phi() - jet_det_level.phi(), jet_matched_part_level.pt(), weight); @@ -419,7 +433,7 @@ struct RecoilJets { } } else { spectra.fill(HIST("hFakeJets_pT"), jet_det_level.pt(), weight); - if (bRecoil) + if (bRecoilJet) spectra.fill(HIST("hFakeJets_pT_RecoilJets"), jet_det_level.pt(), weight); } } @@ -445,8 +459,8 @@ struct RecoilJets { PROCESS_SWITCH(RecoilJets, processData, "process data", true); void processMCDetLevel(FilteredColl const& collision, - FilteredJetsDetLevel const& jets, - FilteredTracks const& tracks) + FilteredTracks const& tracks, + FilteredJetsDetLevel const& jets) { if (skipEvent(collision)) return; @@ -458,22 +472,22 @@ struct RecoilJets { void processMCDetLevelWeighted(FilteredCollDetLevelGetWeight const& collision, aod::JetMcCollisions const&, - FilteredJetsDetLevel const& jets, - FilteredTracks const& tracks) + FilteredTracks const& tracks, + FilteredJetsDetLevel const& jets) { if (skipEvent(collision)) return; /// \TODO: should we implement function to check whether Collision was reconstructed (has_mcCollision() function)? Example: https://github.com/AliceO2Group/O2Physics/blob/1cba330514ab47c15c0095d8cee9633723d8e2a7/PWGJE/Tasks/v0qa.cxx#L166? - auto weight = collision.mcCollision().weight(); // "mcCollision" where is defined? + auto weight = collision.mcCollision().weight(); spectra.fill(HIST("vertexZ"), collision.posZ(), weight); fillHistograms(collision, jets, tracks, true, weight); } PROCESS_SWITCH(RecoilJets, processMCDetLevelWeighted, "process MC detector level with event weight", false); void processMCPartLevel(FilteredCollPartLevel const& collision, - FilteredJetsPartLevel const& jets, - aod::JetParticles const& particles) + aod::JetParticles const& particles, + FilteredJetsPartLevel const& jets) { spectra.fill(HIST("vertexZ"), collision.posZ()); fillMCPHistograms(collision, jets, particles); @@ -481,8 +495,8 @@ struct RecoilJets { PROCESS_SWITCH(RecoilJets, processMCPartLevel, "process MC particle level", false); void processMCPartLevelWeighted(FilteredCollPartLevel const& collision, - FilteredJetsPartLevel const& jets, - aod::JetParticles const& particles) + aod::JetParticles const& particles, + FilteredJetsPartLevel const& jets) { auto weight = collision.weight(); spectra.fill(HIST("vertexZ"), collision.posZ(), weight); @@ -528,6 +542,12 @@ struct RecoilJets { return !jetderiveddatautilities::selectCollision(coll, eventSelectionBits) || !jetderiveddatautilities::selectTrigger(coll, triggerMaskBits); } + template + bool skipTrack(const Track& track) + { + return !jetderiveddatautilities::selectTrack(track, trackSelection); + } + template std::tuple isRecoilJet(const Jet& jet, double phiTT) From c872e9988f13b21ba9e76886baf4d17faa81196c Mon Sep 17 00:00:00 2001 From: omassen <55696099+omassen@users.noreply.github.com> Date: Thu, 6 Feb 2025 15:56:25 +0100 Subject: [PATCH 0072/1650] [PWGCF] Implement new Run3 centrality estimators and expand analysis (#9786) Co-authored-by: ALICE Action Bot --- .../Tasks/neutronProtonCorrZdc.cxx | 133 ++++++++++++++---- 1 file changed, 107 insertions(+), 26 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/neutronProtonCorrZdc.cxx b/PWGCF/TwoParticleCorrelations/Tasks/neutronProtonCorrZdc.cxx index 1b51265f19e..aaff25b6b95 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/neutronProtonCorrZdc.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/neutronProtonCorrZdc.cxx @@ -19,7 +19,6 @@ #include "Framework/ASoAHelpers.h" #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/EventSelection.h" -#include "Common/DataModel/PIDResponse.h" #include "Common/DataModel/Centrality.h" #include "Common/DataModel/Multiplicity.h" #include "Framework/StaticFor.h" @@ -49,12 +48,14 @@ struct NeutronProtonCorrZdc { Configurable cfgAlphaZmin{"cfgAlphaZmin", -1, "Minimum value for ZDC asymmetry"}; Configurable cfgAlphaZmax{"cfgAlphaZmax", 1, "Maximum value for ZDC asymmetry"}; Configurable cfgMaxCentrality{"cfgMaxCentrality", 80, "Maximum collision centrality"}; + Configurable cfgCentralityEstimator{"cfgCentralityEstimator", 0, "Choice of centrality estimator"}; + Configurable cfgNBinsMultiplicity{"cfgNBinsMultiplicity", 1000, "N bins for multiplicity histograms"}; ConfigurableAxis cfgAxisCent{"cfgAxisCent", {VARIABLE_WIDTH, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0, 26.0, 27.0, 28.0, 29.0, 30.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 41.0, 42.0, 43.0, 44.0, 45.0, 46.0, 47.0, 48.0, 49.0, 50.0, 51.0, 52.0, 53.0, 54.0, 55.0, 56.0, 57.0, 58.0, 59.0, 60.0, 61.0, 62.0, 63.0, 64.0, 65.0, 66.0, 67.0, 68.0, 69.0, 70.0, 71.0, 72.0, 73.0, 74.0, 75.0, 76.0, 77.0, 78.0, 79.0, 80.0, 81.0, 82.0, 83.0, 84.0, 85.0, 86.0, 87.0, 88.0, 89.0, 90.0, 91.0, 92.0, 93.0, 94.0, 95.0, 96.0, 97.0, 98.0, 99.0, 100.0}, "Centrality [%]"}; Filter collisionVtxZ = nabs(aod::collision::posZ) < 10.f; - using CentralitiesRun3 = aod::CentFT0Cs; + using CentralitiesRun3 = soa::Join; using CentralitiesRun2 = aod::CentRun2V0Ms; using BCsRun3 = soa::Join; @@ -72,6 +73,12 @@ struct NeutronProtonCorrZdc { const AxisSpec axisZPSignal{2 * cfgNBinsZP, cfgZPmin, 1.5 * cfgZPmax, "ZP (a.u.)"}; const AxisSpec axisAlphaZ{cfgNBinsAlpha, cfgAlphaZmin, cfgAlphaZmax, "#alpha_{spec}"}; const AxisSpec axisZDiffSignal{cfgNBinsZN, cfgDiffZmin, cfgDiffZmax, "#Delta E"}; + const AxisSpec axisMultiplicityF0A{cfgNBinsMultiplicity, 0, 200000, "F0A"}; + const AxisSpec axisMultiplicityF0C{cfgNBinsMultiplicity, 0, 100000, "F0C"}; + const AxisSpec axisMultiplicityF0M{cfgNBinsMultiplicity, 0, 300000, "F0M"}; + const AxisSpec axisMultiplicityFDD{cfgNBinsMultiplicity, 0, 50000, "FDD"}; + const AxisSpec axisMultiplicityTPC{cfgNBinsMultiplicity, 0, 100000, "TPC"}; + const AxisSpec axisMultiplicityMultNGlobal{cfgNBinsMultiplicity, 0, 3500, "MultsNGlobal"}; HistogramConfigSpec defaultZNSectorHist({HistType::kTH2F, {cfgAxisCent, axisZNSectorSignal}}); HistogramConfigSpec defaultZPSectorHist({HistType::kTH2F, {cfgAxisCent, axisZPSectorSignal}}); @@ -107,9 +114,49 @@ struct NeutronProtonCorrZdc { histos.add("CentvsAlphaZP", "CentvsAlphaZP", kTH2F, {cfgAxisCent, axisAlphaZ}); histos.add("CentvsDiffZNSignal", "CentvsDiffZNSignal", defaultZDCDiffHist); histos.add("CentvsDiffZPSignal", "CentvsDiffZPSignal", defaultZDCDiffHist); + histos.add("CentvsZNAvsZNC", "CentvsZNAvsZNC", kTH3F, {cfgAxisCent, axisZNASignal, axisZNCSignal}); + histos.add("CentvsZNAvsZPA", "CentvsZNAvsZPA", kTH3F, {cfgAxisCent, axisZNASignal, axisZPASignal}); + histos.add("CentvsZNAvsZPC", "CentvsZNAvsZPC", kTH3F, {cfgAxisCent, axisZNASignal, axisZPCSignal}); + histos.add("CentvsZPAvsZNC", "CentvsZPAvsZNC", kTH3F, {cfgAxisCent, axisZPASignal, axisZNCSignal}); + histos.add("CentvsZPAvsZPC", "CentvsZNAvsZPC", kTH3F, {cfgAxisCent, axisZPASignal, axisZPCSignal}); + histos.add("CentvsZNCvsZPC", "CentvsZNCvsZPC", kTH3F, {cfgAxisCent, axisZNCSignal, axisZPCSignal}); + histos.add("CentvsZNvsZP", "CentvsZNvsZP", kTH3F, {cfgAxisCent, axisZNSignal, axisZPSignal}); + + histos.add("MultiplicityHistograms/FV0A", "FV0A", kTH1F, {axisMultiplicityF0A}); + histos.add("MultiplicityHistograms/FT0A", "FT0A", kTH1F, {axisMultiplicityF0A}); + histos.add("MultiplicityHistograms/FT0C", "FT0C", kTH1F, {axisMultiplicityF0C}); + histos.add("MultiplicityHistograms/FDDA", "FDDA", kTH1F, {axisMultiplicityFDD}); + histos.add("MultiplicityHistograms/FDDC", "FDDC", kTH1F, {axisMultiplicityFDD}); + histos.add("MultiplicityHistograms/TPC", "TPC", kTH1F, {axisMultiplicityTPC}); + histos.add("MultiplicityHistograms/NGlobal", "NGlobal", kTH1F, {axisMultiplicityMultNGlobal}); + histos.add("MultiplicityHistograms/CentvsFT0C", "CentvsFT0C", kTH2F, {cfgAxisCent, axisMultiplicityF0C}); + histos.add("MultiplicityHistograms/CentvsFT0CVar1", "CentvsFT0CVar1", kTH2F, {cfgAxisCent, axisMultiplicityF0C}); + histos.add("MultiplicityHistograms/CentvsFT0M", "CentvsFT0M", kTH2F, {cfgAxisCent, axisMultiplicityF0M}); + histos.add("MultiplicityHistograms/CentvsFV0A", "CentvsFV0A", kTH2F, {cfgAxisCent, axisMultiplicityF0A}); + histos.add("MultiplicityHistograms/CentvsNGlobal", "CentvsNGlobal", kTH2F, {cfgAxisCent, axisMultiplicityMultNGlobal}); } + + template + void fillMultHistosRun3(const C& col) + { + static constexpr std::string_view MultLabels[] = {"FT0C", "FT0A", "FV0A", "FDDC", "FDDA", "TPC", "NGlobal"}; + std::array multarray = {col.multFT0C(), col.multFT0A(), col.multFV0A(), col.multFDDC(), col.multFDDA(), static_cast(col.multTPC()), static_cast(col.multNTracksGlobal())}; + + histos.fill(HIST("MultiplicityHistograms/") + HIST(MultLabels[mult]), multarray[mult]); + } + + template + void fillCentHistosRun3(const C& col) + { + static constexpr std::string_view CentLabels[] = {"CentvsFT0C", "CentvsFT0CVar1", "CentvsFT0M", "CentvsFV0A", "CentvsNGlobal"}; + std::array centarray = {col.centFT0C(), col.centFT0CVariant1(), col.centFT0M(), col.centFV0A(), col.centNGlobal()}; + std::array multarray = {col.multFT0C(), col.multFT0C(), col.multFT0C() + col.multFT0A(), col.multFV0A(), static_cast(col.multNTracksGlobal())}; + + histos.fill(HIST("MultiplicityHistograms/") + HIST(CentLabels[cent]), centarray[cent], multarray[cent]); + } + template - void fillZDCHistos(const float centr, const Z& zdc) + void fillZDCSideCommonHistos(const float centr, const Z& zdc) { static constexpr std::string_view SubDir[] = {"ASide/", "CSide/"}; @@ -118,52 +165,66 @@ struct NeutronProtonCorrZdc { std::array znEnergyResponseCommon = {zdc.energyCommonZNA(), zdc.energyCommonZNC()}; std::array zpEnergyResponseCommon = {zdc.energyCommonZPA(), zdc.energyCommonZPC()}; - // Fill Neutron ZDC historgrams - histos.fill(HIST(SubDir[side]) + HIST("CentvsZNSector0Signal"), centr, znEnergyResponse[side][0]); - histos.fill(HIST(SubDir[side]) + HIST("CentvsZNSector1Signal"), centr, znEnergyResponse[side][1]); - histos.fill(HIST(SubDir[side]) + HIST("CentvsZNSector2Signal"), centr, znEnergyResponse[side][2]); - histos.fill(HIST(SubDir[side]) + HIST("CentvsZNSector3Signal"), centr, znEnergyResponse[side][3]); - float sumZN = znEnergyResponse[side][0] + znEnergyResponse[side][1] + znEnergyResponse[side][2] + znEnergyResponse[side][3]; + float sumZP = zpEnergyResponse[side][0] + zpEnergyResponse[side][1] + zpEnergyResponse[side][2] + zpEnergyResponse[side][3]; histos.fill(HIST(SubDir[side]) + HIST("CentvsZNSignalSum"), centr, sumZN); histos.fill(HIST(SubDir[side]) + HIST("CentvsZNSignalCommon"), centr, znEnergyResponseCommon[side]); histos.fill(HIST(SubDir[side]) + HIST("CentvsdiffZNSignal"), centr, sumZN - znEnergyResponseCommon[side]); - - // Fill Proton ZDC histograms - histos.fill(HIST(SubDir[side]) + HIST("CentvsZPSector0Signal"), centr, zpEnergyResponse[side][0]); - histos.fill(HIST(SubDir[side]) + HIST("CentvsZPSector1Signal"), centr, zpEnergyResponse[side][1]); - histos.fill(HIST(SubDir[side]) + HIST("CentvsZPSector2Signal"), centr, zpEnergyResponse[side][2]); - histos.fill(HIST(SubDir[side]) + HIST("CentvsZPSector3Signal"), centr, zpEnergyResponse[side][3]); - - float sumZP = zpEnergyResponse[side][0] + zpEnergyResponse[side][1] + zpEnergyResponse[side][2] + zpEnergyResponse[side][3]; - histos.fill(HIST(SubDir[side]) + HIST("CentvsZPSignalSum"), centr, sumZP); histos.fill(HIST(SubDir[side]) + HIST("CentvsZPSignalCommon"), centr, zpEnergyResponseCommon[side]); histos.fill(HIST(SubDir[side]) + HIST("CentvsdiffZPSignal"), centr, sumZP - zpEnergyResponseCommon[side]); } - void processRun3(soa::Filtered>::iterator const& collision, BCsRun3 const&, aod::Zdcs const&) + template + void fillZDCSideSectorHistos(const float centr, const Z& zdc) + { + static constexpr std::string_view SubDir[] = {"ASide/", "CSide/"}; + static constexpr std::string_view ZNSector[] = {"CentvsZNSector0Signal", "CentvsZNSector1Signal", "CentvsZNSector2Signal", "CentvsZNSector3Signal"}; + static constexpr std::string_view ZPSector[] = {"CentvsZPSector0Signal", "CentvsZPSector1Signal", "CentvsZPSector2Signal", "CentvsZPSector3Signal"}; + + std::array, 2> znEnergyResponse = {zdc.energySectorZNA(), zdc.energySectorZNC()}; + std::array, 2> zpEnergyResponse = {zdc.energySectorZPA(), zdc.energySectorZPC()}; + + histos.fill(HIST(SubDir[side]) + HIST(ZNSector[sector]), centr, znEnergyResponse[side][sector]); + histos.fill(HIST(SubDir[side]) + HIST(ZPSector[sector]), centr, zpEnergyResponse[side][sector]); + } + + void processRun3(soa::Filtered>::iterator const& collision, BCsRun3 const&, aod::Zdcs const&) { histos.fill(HIST("eventCounter"), EventCounter::kNoSelection); if (!collision.sel8()) { return; } histos.fill(HIST("eventCounter"), EventCounter::kQualitySelection); - if (collision.centFT0C() > cfgMaxCentrality) { + + const float centArray[] = {collision.centFT0C(), collision.centFT0CVariant1(), collision.centFT0M(), collision.centFV0A(), collision.centNGlobal()}; + const auto cent = centArray[cfgCentralityEstimator]; + if (cent > cfgMaxCentrality) { return; } histos.fill(HIST("eventCounter"), EventCounter::kMaxCentralitySelection); + const auto& foundBC = collision.foundBC_as(); if (foundBC.has_zdc()) { const auto& zdcread = foundBC.zdc(); - const auto cent = collision.centFT0C(); - histos.fill(HIST("eventCounter"), EventCounter::kZDCSelection); histos.fill(HIST("CentralityPercentile"), cent); - fillZDCHistos<0>(cent, zdcread); // Fill A-side - fillZDCHistos<1>(cent, zdcread); // Fill C-side + static_for<0, 6>([&](auto i) { + fillMultHistosRun3(collision); // Fill multiplicity histograms + }); + + static_for<0, 4>([&](auto i) { + fillCentHistosRun3(collision); // Fill centrality histograms + }); + + static_for<0, 1>([&](auto i) { + fillZDCSideCommonHistos(cent, zdcread); // Fill i-side common histograms + static_for<0, 3>([&](auto j) { + fillZDCSideSectorHistos(cent, zdcread); // Fill i-side sector j histograms + }); + }); float sumZNC = (zdcread.energySectorZNC())[0] + (zdcread.energySectorZNC())[1] + (zdcread.energySectorZNC())[2] + (zdcread.energySectorZNC())[3]; float sumZNA = (zdcread.energySectorZNA())[0] + (zdcread.energySectorZNA())[1] + (zdcread.energySectorZNA())[2] + (zdcread.energySectorZNA())[3]; @@ -181,6 +242,14 @@ struct NeutronProtonCorrZdc { histos.fill(HIST("CentvsZPSignalCommon"), cent, (zdcread.energyCommonZPA() + zdcread.energyCommonZPC())); histos.fill(HIST("CentvsAlphaZN"), cent, alphaZN); histos.fill(HIST("CentvsAlphaZP"), cent, alphaZP); + + histos.fill(HIST("CentvsZNAvsZNC"), cent, sumZNA, sumZNC); + histos.fill(HIST("CentvsZNAvsZPA"), cent, sumZNA, sumZPA); + histos.fill(HIST("CentvsZNAvsZPC"), cent, sumZNA, sumZPC); + histos.fill(HIST("CentvsZPAvsZNC"), cent, sumZPA, sumZNC); + histos.fill(HIST("CentvsZPAvsZPC"), cent, sumZPA, sumZPC); + histos.fill(HIST("CentvsZNCvsZPC"), cent, sumZNC, sumZPC); + histos.fill(HIST("CentvsZNvsZP"), cent, sumZNA + sumZNC, sumZPA + sumZPC); } } PROCESS_SWITCH(NeutronProtonCorrZdc, processRun3, "Process analysis for Run 3 data", true); @@ -204,8 +273,12 @@ struct NeutronProtonCorrZdc { histos.fill(HIST("eventCounter"), EventCounter::kZDCSelection); histos.fill(HIST("CentralityPercentile"), cent); - fillZDCHistos<0>(cent, zdcread); // Fill A-side - fillZDCHistos<1>(cent, zdcread); // Fill C-side + static_for<0, 1>([&](auto i) { + fillZDCSideCommonHistos(cent, zdcread); // Fill i-side common channels + static_for<0, 3>([&](auto j) { + fillZDCSideSectorHistos(cent, zdcread); // Fill i-side sector j + }); + }); float sumZNC = (zdcread.energySectorZNC())[0] + (zdcread.energySectorZNC())[1] + (zdcread.energySectorZNC())[2] + (zdcread.energySectorZNC())[3]; float sumZNA = (zdcread.energySectorZNA())[0] + (zdcread.energySectorZNA())[1] + (zdcread.energySectorZNA())[2] + (zdcread.energySectorZNA())[3]; @@ -223,6 +296,14 @@ struct NeutronProtonCorrZdc { histos.fill(HIST("CentvsZPSignalCommon"), cent, (zdcread.energyCommonZPA() + zdcread.energyCommonZPC())); histos.fill(HIST("CentvsAlphaZN"), cent, alphaZN); histos.fill(HIST("CentvsAlphaZP"), cent, alphaZP); + + histos.fill(HIST("CentvsZNAvsZNC"), cent, sumZNA, sumZNC); + histos.fill(HIST("CentvsZNAvsZPA"), cent, sumZNA, sumZPA); + histos.fill(HIST("CentvsZNAvsZPC"), cent, sumZNA, sumZPC); + histos.fill(HIST("CentvsZPAvsZNC"), cent, sumZPA, sumZNC); + histos.fill(HIST("CentvsZPAvsZPC"), cent, sumZPA, sumZPC); + histos.fill(HIST("CentvsZNCvsZPC"), cent, sumZNC, sumZPC); + histos.fill(HIST("CentvsZNvsZP"), cent, sumZNA + sumZNC, sumZPA + sumZPC); } } PROCESS_SWITCH(NeutronProtonCorrZdc, processRun2, "Process analysis for Run 2 converted data", false); From bb694952f4f725e1101e36b17bf221420cd1469a Mon Sep 17 00:00:00 2001 From: JStaa <39123272+JStaa@users.noreply.github.com> Date: Thu, 6 Feb 2025 16:01:04 +0100 Subject: [PATCH 0073/1650] [PWGCF] Added a check to ensure the efficiency is greater than zero (#9784) --- .../Tasks/threeParticleCorrelations.cxx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx index 68cd80461ad..f0d72cfccf8 100644 --- a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx +++ b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx @@ -482,7 +482,12 @@ struct ThreeParticleCorrelations { index = 1; } - return efficiencies[index]->GetBinContent(efficiencies[index]->FindBin(pT)); + double efficiency = efficiencies[index]->GetBinContent(efficiencies[index]->FindBin(pT)); + if (efficiency > 0) { + return efficiency; + } else { + return 1.0; + } } template @@ -706,7 +711,7 @@ struct ThreeParticleCorrelations { } } - if (std::abs(dPhiStar) <= 0.1) { + if (std::abs(dPhiStar) < 0.1) { return kFALSE; } @@ -723,7 +728,7 @@ struct ThreeParticleCorrelations { } }; -//========================================================================================================================================================================================================================================================================== +//============================================================================================================================================================================================================================================================================ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { @@ -731,4 +736,4 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) return workflow; } -//========================================================================================================================================================================================================================================================================== +//============================================================================================================================================================================================================================================================================ From 8101e46075a458d5a6d55f2df40f02937f0dd444 Mon Sep 17 00:00:00 2001 From: jaelpark Date: Thu, 6 Feb 2025 16:44:51 +0100 Subject: [PATCH 0074/1650] [PWGCF] new PbPb centrality estimators for correlations filter (#9789) --- PWGCF/TableProducer/filterCorrelations.cxx | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/PWGCF/TableProducer/filterCorrelations.cxx b/PWGCF/TableProducer/filterCorrelations.cxx index 3d424dc38bf..5166db4ead0 100644 --- a/PWGCF/TableProducer/filterCorrelations.cxx +++ b/PWGCF/TableProducer/filterCorrelations.cxx @@ -362,6 +362,14 @@ struct MultiplicitySelector { } PROCESS_SWITCH(MultiplicitySelector, processFT0C, "Select FT0C centrality as multiplicity", false); + void processFT0CVariant1(aod::CentFT0CVariant1s const& centralities) + { + for (auto& c : centralities) { + output(c.centFT0CVariant1()); + } + } + PROCESS_SWITCH(MultiplicitySelector, processFT0CVariant1, "Select FT0CVariant1 centrality as multiplicity", false); + void processFT0A(aod::CentFT0As const& centralities) { for (auto& c : centralities) { @@ -370,6 +378,14 @@ struct MultiplicitySelector { } PROCESS_SWITCH(MultiplicitySelector, processFT0A, "Select FT0A centrality as multiplicity", false); + void processCentNGlobal(aod::CentNGlobals const& centralities) + { + for (auto& c : centralities) { + output(c.centNGlobal()); + } + } + PROCESS_SWITCH(MultiplicitySelector, processCentNGlobal, "Select CentNGlobal centrality as multiplicity", false); + void processRun2V0M(aod::CentRun2V0Ms const& centralities) { for (auto& c : centralities) { From f5c46f4aabaefc6808293a264b67289694d5e20a Mon Sep 17 00:00:00 2001 From: Francesco Mazzaschi <43742195+fmazzasc@users.noreply.github.com> Date: Thu, 6 Feb 2025 17:22:27 +0100 Subject: [PATCH 0075/1650] Fix process function for tracked MC candidates (#9793) Co-authored-by: Francesco Mazzaschi --- PWGLF/TableProducer/Nuspex/hyperRecoTask.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGLF/TableProducer/Nuspex/hyperRecoTask.cxx b/PWGLF/TableProducer/Nuspex/hyperRecoTask.cxx index 4f38b0bd350..5d176dfecba 100644 --- a/PWGLF/TableProducer/Nuspex/hyperRecoTask.cxx +++ b/PWGLF/TableProducer/Nuspex/hyperRecoTask.cxx @@ -256,7 +256,7 @@ struct hyperRecoTask { hEventsZorro->GetXaxis()->SetBinLabel(1, "Zorro before evsel"); hEventsZorro->GetXaxis()->SetBinLabel(2, "Zorro after evsel"); - if (doprocessMC) { + if (doprocessMC || doprocessMCTracked) { hDecayChannel = qaRegistry.add("hDecayChannel", ";Decay channel; ", HistType::kTH1D, {{2, -0.5, 1.5}}); hDecayChannel->GetXaxis()->SetBinLabel(1, "2-body"); hDecayChannel->GetXaxis()->SetBinLabel(2, "3-body"); From 20ab25b0f97a028e50733895b59533b8199d055c Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Fri, 7 Feb 2025 00:55:21 +0800 Subject: [PATCH 0076/1650] [PWGCF] flow-runbyrun: retrieve code, wrong if-else logic (#9790) --- PWGCF/Flow/Tasks/flowRunbyRun.cxx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowRunbyRun.cxx b/PWGCF/Flow/Tasks/flowRunbyRun.cxx index 31f2c546450..d78a279f06e 100644 --- a/PWGCF/Flow/Tasks/flowRunbyRun.cxx +++ b/PWGCF/Flow/Tasks/flowRunbyRun.cxx @@ -329,13 +329,6 @@ struct FlowRunbyRun { } weight->fill(track.phi(), track.eta(), collision.posZ(), track.pt(), cent, 0); } - } else { - GFWWeights* weight = fGFWWeightsList->getGFWWeightsByRun(runNumber); - if (!weight) { - LOGF(fatal, "Could not find the weight for run %d", runNumber); - return; - } - weight->fill(track.phi(), track.eta(), collision.posZ(), track.pt(), cent, 0); } } From 530ce790b413f007afc05ed5e6197a4fa78ae664 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Fri, 7 Feb 2025 03:04:52 +0900 Subject: [PATCH 0077/1650] [PWGEM/Dilepton] update 2vp task (#9791) --- .../TableProducer/filterDielectronEvent.cxx | 54 +++++++++---------- PWGEM/Dilepton/Tasks/eventQC.cxx | 42 ++++++--------- 2 files changed, 43 insertions(+), 53 deletions(-) diff --git a/PWGEM/Dilepton/TableProducer/filterDielectronEvent.cxx b/PWGEM/Dilepton/TableProducer/filterDielectronEvent.cxx index a3257b8715f..fcf1feb5c21 100644 --- a/PWGEM/Dilepton/TableProducer/filterDielectronEvent.cxx +++ b/PWGEM/Dilepton/TableProducer/filterDielectronEvent.cxx @@ -167,7 +167,7 @@ struct filterDielectronEvent { if (d_bz_input > -990) { d_bz = d_bz_input; o2::parameters::GRPMagField grpmag; - if (fabs(d_bz) > 1e-5) { + if (std::fabs(d_bz) > 1e-5) { grpmag.setL3Current(30000.f / (d_bz / 5.0f)); } o2::base::Propagator::initFieldFromGRP(&grpmag); @@ -250,11 +250,11 @@ struct filterDielectronEvent { float dcaXY = dcaInfo[0]; float dcaZ = dcaInfo[1]; - if (fabs(dcaXY) > dca_xy_max || fabs(dcaZ) > dca_z_max) { + if (std::fabs(dcaXY) > dca_xy_max || std::fabs(dcaZ) > dca_z_max) { return false; } - if (track_par_cov_recalc.getPt() < minpt || fabs(track_par_cov_recalc.getEta()) > maxeta) { + if (track_par_cov_recalc.getPt() < minpt || std::fabs(track_par_cov_recalc.getEta()) > maxeta) { return false; } @@ -264,7 +264,7 @@ struct filterDielectronEvent { dca_3d = 999.f; } else { float chi2 = (dcaXY * dcaXY * track_par_cov_recalc.getSigmaZ2() + dcaZ * dcaZ * track_par_cov_recalc.getSigmaY2() - 2. * dcaXY * dcaZ * track_par_cov_recalc.getSigmaZY()) / det; - dca_3d = std::sqrt(fabs(chi2) / 2.); + dca_3d = std::sqrt(std::fabs(chi2) / 2.); } if (dca_3d > dca_3d_sigma_max) { return false; @@ -294,7 +294,7 @@ struct filterDielectronEvent { if (minTPCNsigmaPr < track.tpcNSigmaPr() && track.tpcNSigmaPr() < maxTPCNsigmaPr) { return false; } - if (track.hasTOF() && (maxTOFNsigmaEl < fabs(track.tofNSigmaEl()))) { + if (track.hasTOF() && (maxTOFNsigmaEl < std::fabs(track.tofNSigmaEl()))) { return false; } return true; @@ -306,7 +306,7 @@ struct filterDielectronEvent { if (minTPCNsigmaPi < track.tpcNSigmaPi() && track.tpcNSigmaPi() < maxTPCNsigmaPi && track.tpcInnerParam() < max_pin_for_pion_rejection) { return false; } - return minTPCNsigmaEl < track.tpcNSigmaEl() && track.tpcNSigmaEl() < maxTPCNsigmaEl && fabs(track.tofNSigmaEl()) < maxTOFNsigmaEl; + return minTPCNsigmaEl < track.tpcNSigmaEl() && track.tpcNSigmaEl() < maxTPCNsigmaEl && std::fabs(track.tofNSigmaEl()) < maxTOFNsigmaEl; } template @@ -373,9 +373,9 @@ struct filterDielectronEvent { fRegistry.fill(HIST("Track/hRelSigma1Pt"), pt_recalc, std::sqrt(track_par_cov_recalc.getSigma1Pt2()) * pt_recalc); fRegistry.fill(HIST("Track/hEtaPhi"), phi_recalc, eta_recalc); fRegistry.fill(HIST("Track/hDCAxyz"), dcaXY, dcaZ); - fRegistry.fill(HIST("Track/hDCAxyzSigma"), dcaXY / sqrt(track_par_cov_recalc.getSigmaY2()), dcaZ / sqrt(track_par_cov_recalc.getSigmaZ2())); - fRegistry.fill(HIST("Track/hDCAxyRes_Pt"), pt_recalc, sqrt(track_par_cov_recalc.getSigmaY2()) * 1e+4); // convert cm to um - fRegistry.fill(HIST("Track/hDCAzRes_Pt"), pt_recalc, sqrt(track_par_cov_recalc.getSigmaZ2()) * 1e+4); // convert cm to um + fRegistry.fill(HIST("Track/hDCAxyzSigma"), dcaXY / std::sqrt(track_par_cov_recalc.getSigmaY2()), dcaZ / std::sqrt(track_par_cov_recalc.getSigmaZ2())); + fRegistry.fill(HIST("Track/hDCAxyRes_Pt"), pt_recalc, std::sqrt(track_par_cov_recalc.getSigmaY2()) * 1e+4); // convert cm to um + fRegistry.fill(HIST("Track/hDCAzRes_Pt"), pt_recalc, std::sqrt(track_par_cov_recalc.getSigmaZ2()) * 1e+4); // convert cm to um fRegistry.fill(HIST("Track/hNclsITS"), track.itsNCls()); fRegistry.fill(HIST("Track/hNclsTPC"), track.tpcNClsFound()); fRegistry.fill(HIST("Track/hNcrTPC"), track.tpcNClsCrossedRows()); @@ -415,7 +415,7 @@ struct filterDielectronEvent { } std::vector> stored_trackIds; - std::vector> stored_pairIds; + // std::vector> stored_pairIds; Filter trackFilter = o2::aod::track::pt > minpt&& nabs(o2::aod::track::eta) < maxeta&& o2::aod::track::tpcChi2NCl < maxchi2tpc&& o2::aod::track::itsChi2NCl < maxchi2its&& ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::ITS) == true && ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::TPC) == true; Filter pidFilter = minTPCNsigmaEl < o2::aod::pidtpc::tpcNSigmaEl && o2::aod::pidtpc::tpcNSigmaEl < maxTPCNsigmaEl; using MyFilteredTracks = soa::Filtered; @@ -512,8 +512,8 @@ struct filterDielectronEvent { stored_trackIds.clear(); stored_trackIds.shrink_to_fit(); - stored_pairIds.clear(); - stored_pairIds.shrink_to_fit(); + // stored_pairIds.clear(); + // stored_pairIds.shrink_to_fit(); } PROCESS_SWITCH(filterDielectronEvent, processRec_SA, "process reconstructed info only", true); // standalone @@ -645,8 +645,8 @@ struct filterDielectronEvent { stored_trackIds.clear(); stored_trackIds.shrink_to_fit(); - stored_pairIds.clear(); - stored_pairIds.shrink_to_fit(); + // stored_pairIds.clear(); + // stored_pairIds.shrink_to_fit(); } PROCESS_SWITCH(filterDielectronEvent, processRec_TTCA, "process reconstructed info only", false); // with TTCA @@ -743,8 +743,8 @@ struct filterDielectronEvent { stored_trackIds.clear(); stored_trackIds.shrink_to_fit(); - stored_pairIds.clear(); - stored_pairIds.shrink_to_fit(); + // stored_pairIds.clear(); + // stored_pairIds.shrink_to_fit(); } PROCESS_SWITCH(filterDielectronEvent, processRec_SA_SWT, "process reconstructed info only", false); // standalone @@ -879,8 +879,8 @@ struct filterDielectronEvent { stored_trackIds.clear(); stored_trackIds.shrink_to_fit(); - stored_pairIds.clear(); - stored_pairIds.shrink_to_fit(); + // stored_pairIds.clear(); + // stored_pairIds.shrink_to_fit(); } PROCESS_SWITCH(filterDielectronEvent, processRec_TTCA_SWT, "process reconstructed info only", false); // with TTCA @@ -977,8 +977,8 @@ struct filterDielectronEvent { stored_trackIds.clear(); stored_trackIds.shrink_to_fit(); - stored_pairIds.clear(); - stored_pairIds.shrink_to_fit(); + // stored_pairIds.clear(); + // stored_pairIds.shrink_to_fit(); } PROCESS_SWITCH(filterDielectronEvent, processMC_SA, "process reconstructed and MC info ", false); @@ -1108,8 +1108,8 @@ struct filterDielectronEvent { stored_trackIds.clear(); stored_trackIds.shrink_to_fit(); - stored_pairIds.clear(); - stored_pairIds.shrink_to_fit(); + // stored_pairIds.clear(); + // stored_pairIds.shrink_to_fit(); } PROCESS_SWITCH(filterDielectronEvent, processMC_TTCA, "process reconstructed info only", false); // with TTCA }; @@ -1195,7 +1195,7 @@ struct prefilterPrimaryElectron { if (d_bz_input > -990) { d_bz = d_bz_input; o2::parameters::GRPMagField grpmag; - if (fabs(d_bz) > 1e-5) { + if (std::fabs(d_bz) > 1e-5) { grpmag.setL3Current(30000.f / (d_bz / 5.0f)); } o2::base::Propagator::initFieldFromGRP(&grpmag); @@ -1268,15 +1268,15 @@ struct prefilterPrimaryElectron { gpu::gpustd::array dcaInfo; auto track_par_cov_recalc = getTrackParCov(track); - std::array pVec_recalc = {0, 0, 0}; // px, py, pz + // std::array pVec_recalc = {0, 0, 0}; // px, py, pz o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, track_par_cov_recalc, 2.f, matCorr, &dcaInfo); - getPxPyPz(track_par_cov_recalc, pVec_recalc); + // getPxPyPz(track_par_cov_recalc, pVec_recalc); - if (fabs(dcaInfo[0]) > max_dcaxy || fabs(dcaInfo[1]) > max_dcaz) { + if (std::fabs(dcaInfo[0]) > max_dcaxy || std::fabs(dcaInfo[1]) > max_dcaz) { return false; } - if (track_par_cov_recalc.getPt() < minpt || fabs(track_par_cov_recalc.getEta()) > maxeta) { + if (track_par_cov_recalc.getPt() < minpt || std::fabs(track_par_cov_recalc.getEta()) > maxeta) { return false; } diff --git a/PWGEM/Dilepton/Tasks/eventQC.cxx b/PWGEM/Dilepton/Tasks/eventQC.cxx index 82ef2af7e63..4a3ac116cd5 100644 --- a/PWGEM/Dilepton/Tasks/eventQC.cxx +++ b/PWGEM/Dilepton/Tasks/eventQC.cxx @@ -316,22 +316,15 @@ struct eventQC { } if (cfgFillPID) { - int nbin_nsigma_tpc = 100; - float min_nsigma_tpc = -5.f; - float max_nsigma_tpc = +5.f; + fRegistry.add("Track/hTPCdEdx", "TPC dE/dx;p_{in} (GeV/c);TPC dE/dx (a.u.)", kTH2F, {{1000, 0, 10}, {200, 0, 200}}, false); + fRegistry.add("Track/hTPCNsigmaEl", "TPC n sigma el;p_{in} (GeV/c);n #sigma_{e}^{TPC}", kTH2F, {{1000, 0, 10}, {100, -5.f, +5.f}}, false); + fRegistry.add("Track/hTPCNsigmaMu", "TPC n sigma mu;p_{in} (GeV/c);n #sigma_{#mu}^{TPC}", kTH2F, {{1000, 0, 10}, {100, -5.f, +5.f}}, false); + fRegistry.add("Track/hTPCNsigmaPi", "TPC n sigma pi;p_{in} (GeV/c);n #sigma_{#pi}^{TPC}", kTH2F, {{1000, 0, 10}, {100, -5.f, +5.f}}, false); + fRegistry.add("Track/hTPCNsigmaKa", "TPC n sigma ka;p_{in} (GeV/c);n #sigma_{K}^{TPC}", kTH2F, {{1000, 0, 10}, {100, -5.f, +5.f}}, false); + fRegistry.add("Track/hTPCNsigmaPr", "TPC n sigma pr;p_{in} (GeV/c);n #sigma_{p}^{TPC}", kTH2F, {{1000, 0, 10}, {100, -5.f, +5.f}}, false); if (doprocessEventQC_V0_PID) { - nbin_nsigma_tpc = 200; - min_nsigma_tpc = -10.f; - max_nsigma_tpc = +10.f; + fRegistry.add("Track/hsEID", "TPC n sigma el;p_{in} (GeV/c);#eta;n #sigma_{e}^{TPC};", kTHnSparseF, {{200, 0, 10}, {20, -1, +1}, {100, -5, +5}}, false); } - - fRegistry.add("Track/hTPCdEdx", "TPC dE/dx;p_{in} (GeV/c);TPC dE/dx (a.u.)", kTH2F, {{1000, 0, 10}, {200, 0, 200}}, false); - fRegistry.add("Track/hTPCNsigmaEl", "TPC n sigma el;p_{in} (GeV/c);n #sigma_{e}^{TPC}", kTH2F, {{1000, 0, 10}, {nbin_nsigma_tpc, min_nsigma_tpc, max_nsigma_tpc}}, false); - fRegistry.add("Track/hTPCNsigmaMu", "TPC n sigma mu;p_{in} (GeV/c);n #sigma_{#mu}^{TPC}", kTH2F, {{1000, 0, 10}, {nbin_nsigma_tpc, min_nsigma_tpc, max_nsigma_tpc}}, false); - fRegistry.add("Track/hTPCNsigmaPi", "TPC n sigma pi;p_{in} (GeV/c);n #sigma_{#pi}^{TPC}", kTH2F, {{1000, 0, 10}, {nbin_nsigma_tpc, min_nsigma_tpc, max_nsigma_tpc}}, false); - fRegistry.add("Track/hTPCNsigmaKa", "TPC n sigma ka;p_{in} (GeV/c);n #sigma_{K}^{TPC}", kTH2F, {{1000, 0, 10}, {nbin_nsigma_tpc, min_nsigma_tpc, max_nsigma_tpc}}, false); - fRegistry.add("Track/hTPCNsigmaPr", "TPC n sigma pr;p_{in} (GeV/c);n #sigma_{p}^{TPC}", kTH2F, {{1000, 0, 10}, {nbin_nsigma_tpc, min_nsigma_tpc, max_nsigma_tpc}}, false); - fRegistry.add("Track/hTOFbeta", "TOF #beta;p_{pv} (GeV/c);#beta", kTH2F, {{1000, 0, 10}, {240, 0, 1.2}}, false); fRegistry.add("Track/hTOFNsigmaEl", "TOF n sigma el;p_{pv} (GeV/c);n #sigma_{e}^{TOF}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); fRegistry.add("Track/hTOFNsigmaMu", "TOF n sigma mu;p_{pv} (GeV/c);n #sigma_{#mu}^{TOF}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); @@ -357,8 +350,7 @@ struct eventQC { fRegistry.add("V0/hCosPA", "cos pointing angle", kTH1F, {{100, 0.99, 1}}, false); fRegistry.add("V0/hRadius", "radius", kTH1F, {{200, 0, 20}}, false); fRegistry.add("V0/K0S/pion/hTPCdEdx", "TPC dE/dx;p_{in} (GeV/c);TPC dE/dx (a.u.)", kTH2F, {{1000, 0, 10}, {200, 0, 200}}, false); - fRegistry.add("V0/K0S/pion/hTPCNsigmaEl", "TPC n sigma el;p_{in} (GeV/c);n #sigma_{e}^{TPC}", kTH2F, {{1000, 0, 10}, {200, -10, +10}}, false); - fRegistry.add("V0/K0S/pion/hTPCNsigmaPi", "TPC n sigma pi;p_{in} (GeV/c);n #sigma_{#pi}^{TPC}", kTH2F, {{1000, 0, 10}, {100, -10, +10}}, false); + fRegistry.add("V0/K0S/pion/hsEID", "TPC n sigma el;p_{in} (GeV/c);#eta;n #sigma_{e}^{TPC};", kTHnSparseF, {{200, 0, 10}, {20, -1, +1}, {100, -5, +5}}, false); fRegistry.add("V0/K0S/hMass", "mass vs. p_{T} of K^{0}_{S}", kTH2F, {{200, 0.4, 0.6}, {100, 0, 10}}, false); fRegistry.add("V0/Lambda/hMass", "mass vs. p_{T} of #Lambda", kTH2F, {{100, 1.08, 1.18}, {100, 0, 10}}, false); @@ -369,8 +361,7 @@ struct eventQC { fRegistry.add("V0/Photon/hChi2", "radius vs. KF chi2", kTH2F, {{100, 0, 100}, {100, 0, 100}}, false); fRegistry.add("V0/Photon/hXY", "photon conversion point;X (cm);Y(cm)", kTH2F, {{400, -100, +100}, {400, -100, 100}}, false); fRegistry.add("V0/Photon/electron/hTPCdEdx", "TPC dE/dx;p_{in} (GeV/c);TPC dE/dx (a.u.)", kTH2F, {{1000, 0, 10}, {200, 0, 200}}, false); - fRegistry.add("V0/Photon/electron/hTPCNsigmaEl", "TPC n sigma el;p_{in} (GeV/c);n #sigma_{e}^{TPC}", kTH2F, {{1000, 0, 10}, {200, -10, +10}}, false); - fRegistry.add("V0/Photon/electron/hTPCNsigmaPi", "TPC n sigma pi;p_{in} (GeV/c);n #sigma_{#pi}^{TPC}", kTH2F, {{1000, 0, 10}, {200, -10, +10}}, false); + fRegistry.add("V0/Photon/electron/hsEID", "TPC n sigma el;p_{in} (GeV/c);#eta;n #sigma_{e}^{TPC};", kTHnSparseF, {{200, 0, 10}, {20, -1, +1}, {100, -5, +5}}, false); } template @@ -424,6 +415,9 @@ struct eventQC { fRegistry.fill(HIST("Track/hITSNsigmaPr"), track.p(), track.itsNSigmaPr()); } } + if (doprocessEventQC_V0_PID) { + fRegistry.fill(HIST("Track/hsEID"), track.tpcInnerParam(), track.eta(), track.tpcNSigmaEl()); + } } template @@ -984,13 +978,11 @@ struct eventQC { if (isTPCOK_neg && isTOFOK_neg) { // K0S is tagged by neg and pos is probe. fRegistry.fill(HIST("V0/K0S/pion/hTPCdEdx"), pos.tpcInnerParam(), pos.tpcSignal()); - fRegistry.fill(HIST("V0/K0S/pion/hTPCNsigmaEl"), pos.tpcInnerParam(), pos.tpcNSigmaEl()); - fRegistry.fill(HIST("V0/K0S/pion/hTPCNsigmaPi"), pos.tpcInnerParam(), pos.tpcNSigmaPi()); + fRegistry.fill(HIST("V0/K0S/pion/hsEID"), pos.tpcInnerParam(), pos.eta(), pos.tpcNSigmaEl()); } if (isTPCOK_pos && isTOFOK_pos) { // K0S is tagged by pos and neg is probe. fRegistry.fill(HIST("V0/K0S/pion/hTPCdEdx"), neg.tpcInnerParam(), neg.tpcSignal()); - fRegistry.fill(HIST("V0/K0S/pion/hTPCNsigmaEl"), neg.tpcInnerParam(), neg.tpcNSigmaEl()); - fRegistry.fill(HIST("V0/K0S/pion/hTPCNsigmaPi"), neg.tpcInnerParam(), neg.tpcNSigmaPi()); + fRegistry.fill(HIST("V0/K0S/pion/hsEID"), neg.tpcInnerParam(), neg.eta(), neg.tpcNSigmaEl()); } } // end of K0S } // end of v0hadron loop @@ -1030,13 +1022,11 @@ struct eventQC { if (isTPCOK_neg && isTOFOK_neg) { // photon conversion is tagged by neg and pos is probe. fRegistry.fill(HIST("V0/Photon/electron/hTPCdEdx"), pos.tpcInnerParam(), pos.tpcSignal()); - fRegistry.fill(HIST("V0/Photon/electron/hTPCNsigmaEl"), pos.tpcInnerParam(), pos.tpcNSigmaEl()); - fRegistry.fill(HIST("V0/Photon/electron/hTPCNsigmaPi"), pos.tpcInnerParam(), pos.tpcNSigmaPi()); + fRegistry.fill(HIST("V0/Photon/electron/hsEID"), pos.tpcInnerParam(), pos.eta(), pos.tpcNSigmaEl()); } if (isTPCOK_pos && isTOFOK_pos) { // photon conversion is tagged by pos and neg is probe. fRegistry.fill(HIST("V0/Photon/electron/hTPCdEdx"), neg.tpcInnerParam(), neg.tpcSignal()); - fRegistry.fill(HIST("V0/Photon/electron/hTPCNsigmaEl"), neg.tpcInnerParam(), neg.tpcNSigmaEl()); - fRegistry.fill(HIST("V0/Photon/electron/hTPCNsigmaPi"), neg.tpcInnerParam(), neg.tpcNSigmaPi()); + fRegistry.fill(HIST("V0/Photon/electron/hsEID"), neg.tpcInnerParam(), neg.eta(), neg.tpcNSigmaEl()); } } // end of v0photon loop } // end of V0 PID From 43a884e497356388630279e026c2cc1ce3a07f6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Thu, 6 Feb 2025 19:05:58 +0100 Subject: [PATCH 0078/1650] [PWGHF] Add D+ derived-data creator (#9795) --- PWGHF/DataModel/DerivedTables.h | 131 +++++- PWGHF/TableProducer/CMakeLists.txt | 5 + .../derivedDataCreatorDplusToPiKPi.cxx | 391 ++++++++++++++++++ 3 files changed, 516 insertions(+), 11 deletions(-) create mode 100644 PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx diff --git a/PWGHF/DataModel/DerivedTables.h b/PWGHF/DataModel/DerivedTables.h index ad4f787fd19..09b205eff6a 100644 --- a/PWGHF/DataModel/DerivedTables.h +++ b/PWGHF/DataModel/DerivedTables.h @@ -31,14 +31,15 @@ namespace o2::aod { // basic species: -// D0 -> K- + pi+ (done) -// Lc -> pi+ K- p -// D+ -> K- + pi+ + pi+ (3P table with adapted PID columns) -// Ds+ -> K- + K+ + pi+ (3P table with adapted PID columns) +// D0 → K− π+ +// Λc → p K− π+ +// D+ → K− π+ π+ +// Ds+ → K− K+ π+ (todo) + // composite species -// B0 -> D- + pi+ -// B+ -> D0 + pi+ (in progress) -// D*+ -> D0 + pi+ +// B0 → D− π+ (todo) +// B+ → D0 π+ +// D*+ → D0 π+ (todo) // ================ // Collision tables @@ -62,7 +63,7 @@ namespace hf_mc_coll DECLARE_SOA_INDEX_COLUMN(McCollision, mcCollision); //! original global index of the MC collision } // namespace hf_mc_coll -// Defines the collision table +// Declares the base table with reconstructed collisions (CollBases) and joinable tables (CollIds). #define DECLARE_COLL_TABLE(_hf_type_, _hf_description_) \ DECLARE_SOA_TABLE_STAGED(Hf##_hf_type_##CollBases, "HF" _hf_description_ "COLLBASE", \ o2::soa::Index<>, \ @@ -84,7 +85,7 @@ DECLARE_SOA_INDEX_COLUMN(McCollision, mcCollision); //! original global index of hf_cand::CollisionId, \ o2::soa::Marker); -// Defines the mc collision table +// Declares the base table with MC collisions (McCollBases) and joinable tables (McCollIds, McRCollIds). #define DECLARE_MCCOLL_TABLE(_hf_type_, _hf_description_, _hf_namespace_) \ namespace hf_mc_coll \ { \ @@ -111,10 +112,15 @@ DECLARE_SOA_INDEX_COLUMN(McCollision, mcCollision); //! original global index of DECLARE_SOA_TABLE_STAGED(Hf##_hf_type_##McRCollIds, "HF" _hf_description_ "MCRCOLLID", \ hf_mc_coll::der_##_hf_namespace_::Hf##_hf_type_##CollBaseIds); +// Declares all tables with reconstructed and MC collisions. #define DECLARE_COLL_TABLES(_hf_type_, _hf_description_, _hf_namespace_) \ DECLARE_COLL_TABLE(_hf_type_, _hf_description_) \ DECLARE_MCCOLL_TABLE(_hf_type_, _hf_description_, _hf_namespace_) +// ================ +// Candidate tables +// ================ + namespace hf_cand_base { DECLARE_SOA_COLUMN(Eta, eta, float); //! pseudorapidity @@ -161,6 +167,7 @@ DECLARE_SOA_COLUMN(OriginMcGen, originMcGen, int8_t); //! particle DECLARE_SOA_COLUMN(FlagMcDecayChanGen, flagMcDecayChanGen, int8_t); //! resonant decay channel flag, generator level } // namespace hf_mc_particle +// Declares the base table with candidates (Bases). #define DECLARE_CAND_BASE_TABLE(_hf_type_, _hf_description_, _hf_namespace_) \ namespace hf_cand_base \ { \ @@ -184,6 +191,7 @@ DECLARE_SOA_COLUMN(FlagMcDecayChanGen, flagMcDecayChanGen, int8_t); //! resonant hf_cand_base::P, \ o2::soa::Marker); +// Declares the table with global indices for 2-prong candidates (Ids). #define DECLARE_CAND_2P_ID_TABLE(_hf_type_, _hf_description_) \ DECLARE_SOA_TABLE_STAGED(Hf##_hf_type_##Ids, "HF" _hf_description_ "ID", \ hf_cand::CollisionId, \ @@ -191,6 +199,7 @@ DECLARE_SOA_COLUMN(FlagMcDecayChanGen, flagMcDecayChanGen, int8_t); //! resonant hf_track_index::Prong1Id, \ o2::soa::Marker); +// Declares the table with global indices for 3-prong candidates (Ids). #define DECLARE_CAND_3P_ID_TABLE(_hf_type_, _hf_description_) \ DECLARE_SOA_TABLE_STAGED(Hf##_hf_type_##Ids, "HF" _hf_description_ "ID", \ hf_cand::CollisionId, \ @@ -199,11 +208,17 @@ DECLARE_SOA_COLUMN(FlagMcDecayChanGen, flagMcDecayChanGen, int8_t); //! resonant hf_track_index::Prong2Id, \ o2::soa::Marker); +// Declares the table with candidate selection flags (Sels). #define DECLARE_CAND_SEL_TABLE(_hf_type_, _hf_description_) \ DECLARE_SOA_TABLE_STAGED(Hf##_hf_type_##Sels, "HF" _hf_description_ "SEL", \ hf_cand_sel::CandidateSelFlag, \ o2::soa::Marker); +// ================ +// MC particle tables +// ================ + +// Declares the base table with MC particles (PBases). #define DECLARE_MCCAND_BASE_TABLE(_hf_type_, _hf_description_, _hf_namespace_) \ namespace hf_mc_particle \ { \ @@ -227,12 +242,17 @@ DECLARE_SOA_COLUMN(FlagMcDecayChanGen, flagMcDecayChanGen, int8_t); //! resonant hf_cand_base::P, \ o2::soa::Marker); +// Declares the table with global indices for MC particles (PIds). #define DECLARE_MCCAND_ID_TABLE(_hf_type_, _hf_description_) \ DECLARE_SOA_TABLE_STAGED(Hf##_hf_type_##PIds, "HF" _hf_description_ "PID", \ hf_mc_particle::McCollisionId, \ hf_mc_particle::McParticleId, \ o2::soa::Marker); +// ================ +// Helper macros for combinations +// ================ + #define DECLARE_CAND_TABLES(_hf_type_, _hf_description_, _hf_namespace_) \ DECLARE_CAND_BASE_TABLE(_hf_type_, _hf_description_, _hf_namespace_) \ DECLARE_CAND_SEL_TABLE(_hf_type_, _hf_description_) \ @@ -257,12 +277,17 @@ DECLARE_SOA_COLUMN(FlagMcDecayChanGen, flagMcDecayChanGen, int8_t); //! resonant DECLARE_COLL_TABLES(_hf_type_, _hf_description_, _hf_namespace_) \ DECLARE_CAND_3P_TABLES(_hf_type_, _hf_description_, _hf_namespace_) +// ================ +// Declarations of common tables for individual species +// ================ + DECLARE_2P_TABLES(D0, "D0", d0, 2); DECLARE_3P_TABLES(Lc, "LC", lc, 3); -DECLARE_3P_TABLES(Bplus, "BP", bplus, 4); +DECLARE_3P_TABLES(Dplus, "DP", dplus, 4); +DECLARE_3P_TABLES(Bplus, "BP", bplus, 5); // ================ -// Candidate tables +// Additional species-specific candidate tables // ================ // Candidate properties used for selection @@ -417,6 +442,10 @@ DECLARE_SOA_COLUMN(MlScoreNonPromptCharm, mlScoreNonPromptCharm, float); // DECLARE_SOA_COLUMN(MlScoresCharm, mlScoresCharm, std::vector); //! vector of ML scores } // namespace hf_cand_mc_charm +// ---------------- +// D0 +// ---------------- + // candidates for removal: // PxProng0, PyProng0, PzProng0,... (same for 1, 2), we can keep Pt, Eta, Phi instead // XY: CpaXY, DecayLengthXY, ErrorDecayLengthXY @@ -482,6 +511,10 @@ DECLARE_SOA_TABLE_STAGED(HfD0Mcs, "HFD0MC", //! Table with MC candidate info hf_cand_mc::OriginMcRec, o2::soa::Marker); +// ---------------- +// B+ +// ---------------- + // candidates for removal: // PxProng0, PyProng0, PzProng0,... (same for 1, 2), we can keep Pt, Eta, Phi instead // XY: CpaXY, DecayLengthXY, ErrorDecayLengthXY @@ -558,6 +591,10 @@ DECLARE_SOA_TABLE_STAGED(HfBplusMcs, "HFBPMC", //! Table with MC candidate info hf_cand_mc::OriginMcRec, o2::soa::Marker); +// ---------------- +// Lc +// ---------------- + // candidates for removal: // PxProng0, PyProng0, PzProng0,... (same for 1, 2), we can keep Pt, Eta, Phi instead // XY: CpaXY, DecayLengthXY, ErrorDecayLengthXY @@ -632,6 +669,78 @@ DECLARE_SOA_TABLE_STAGED(HfLcMcs, "HFLCMC", //! Table with MC candidate info hf_cand_mc::IsCandidateSwapped, o2::soa::Marker); +// ---------------- +// D+ +// ---------------- + +// candidates for removal: +// PxProng0, PyProng0, PzProng0,... (same for 1, 2), we can keep Pt, Eta, Phi instead +// XY: CpaXY, DecayLengthXY, ErrorDecayLengthXY +// normalised: DecayLengthNormalised, DecayLengthXYNormalised, ImpactParameterNormalised0 +DECLARE_SOA_TABLE_STAGED(HfDplusPars, "HFDPPAR", //! Table with candidate properties used for selection + hf_cand::Chi2PCA, + hf_cand::NProngsContributorsPV, + hf_cand_par::Cpa, + hf_cand_par::CpaXY, + hf_cand_par::DecayLength, + hf_cand_par::DecayLengthXY, + hf_cand_par::DecayLengthNormalised, + hf_cand_par::DecayLengthXYNormalised, + hf_cand_par::PtProng0, + hf_cand_par::PtProng1, + hf_cand_par::PtProng2, + hf_cand::ImpactParameter0, + hf_cand::ImpactParameter1, + hf_cand::ImpactParameter2, + hf_cand_par::ImpactParameterNormalised0, + hf_cand_par::ImpactParameterNormalised1, + hf_cand_par::ImpactParameterNormalised2, + hf_cand_par::NSigTpcPi0, + hf_cand_par::NSigTofPi0, + hf_cand_par::NSigTpcTofPi0, + hf_cand_par::NSigTpcKa1, + hf_cand_par::NSigTofKa1, + hf_cand_par::NSigTpcTofKa1, + hf_cand_par::NSigTpcPi2, + hf_cand_par::NSigTofPi2, + hf_cand_par::NSigTpcTofPi2, + o2::soa::Marker); + +DECLARE_SOA_TABLE_STAGED(HfDplusParEs, "HFDPPARE", //! Table with additional candidate properties used for selection + hf_cand::XSecondaryVertex, + hf_cand::YSecondaryVertex, + hf_cand::ZSecondaryVertex, + hf_cand::ErrorDecayLength, + hf_cand::ErrorDecayLengthXY, + hf_cand_par::RSecondaryVertex, + hf_cand_par::PProng0, + hf_cand_par::PProng1, + hf_cand_par::PProng2, + hf_cand::PxProng0, + hf_cand::PyProng0, + hf_cand::PzProng0, + hf_cand::PxProng1, + hf_cand::PyProng1, + hf_cand::PzProng1, + hf_cand::PxProng2, + hf_cand::PyProng2, + hf_cand::PzProng2, + hf_cand::ErrorImpactParameter0, + hf_cand::ErrorImpactParameter1, + hf_cand::ErrorImpactParameter2, + hf_cand_par::Ct, + o2::soa::Marker); + +DECLARE_SOA_TABLE_STAGED(HfDplusMls, "HFDPML", //! Table with candidate selection ML scores + hf_cand_mc::MlScores, + o2::soa::Marker); + +DECLARE_SOA_TABLE_STAGED(HfDplusMcs, "HFDPMC", //! Table with MC candidate info + hf_cand_mc::FlagMcMatchRec, + hf_cand_mc::OriginMcRec, + hf_cand_mc::IsCandidateSwapped, // useless + o2::soa::Marker); + } // namespace o2::aod #endif // PWGHF_DATAMODEL_DERIVEDTABLES_H_ diff --git a/PWGHF/TableProducer/CMakeLists.txt b/PWGHF/TableProducer/CMakeLists.txt index 550343621db..9bda43b8229 100644 --- a/PWGHF/TableProducer/CMakeLists.txt +++ b/PWGHF/TableProducer/CMakeLists.txt @@ -305,6 +305,11 @@ o2physics_add_dpl_workflow(derived-data-creator-d0-to-k-pi PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(derived-data-creator-dplus-to-pi-k-pi + SOURCES derivedDataCreatorDplusToPiKPi.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(derived-data-creator-lc-to-p-k-pi SOURCES derivedDataCreatorLcToPKPi.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore diff --git a/PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx b/PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx new file mode 100644 index 00000000000..0eb5b010a32 --- /dev/null +++ b/PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx @@ -0,0 +1,391 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file derivedDataCreatorDplusToPiKPi.cxx +/// \brief Producer of derived tables of Dplus candidates, collisions and MC particles +/// \note Based on derivedDataCreatorLcToPKPi.cxx +/// +/// \author Vít Kučera , Inha University + +#include +#include +#include + +#include "CommonConstants/PhysicsConstants.h" +#include "Framework/AnalysisTask.h" +#include "Framework/runDataProcessing.h" + +#include "Common/Core/RecoDecay.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/Multiplicity.h" + +#include "PWGLF/DataModel/mcCentrality.h" + +#include "PWGHF/Core/HfHelper.h" +#include "PWGHF/DataModel/CandidateReconstructionTables.h" +#include "PWGHF/DataModel/CandidateSelectionTables.h" +#include "PWGHF/DataModel/DerivedTables.h" +#include "PWGHF/Utils/utilsDerivedData.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::analysis::hf_derived; + +/// Writes the full information in an output TTree +struct HfDerivedDataCreatorDplusToPiKPi { + HfProducesDerivedData< + o2::aod::HfDplusBases, + o2::aod::HfDplusCollBases, + o2::aod::HfDplusCollIds, + o2::aod::HfDplusMcCollBases, + o2::aod::HfDplusMcCollIds, + o2::aod::HfDplusMcRCollIds, + o2::aod::HfDplusPBases, + o2::aod::HfDplusPIds> + rowsCommon; + // Candidates + Produces rowCandidatePar; + Produces rowCandidateParE; + Produces rowCandidateSel; + Produces rowCandidateMl; + Produces rowCandidateId; + Produces rowCandidateMc; + + // Switches for filling tables + HfConfigurableDerivedData confDerData; + Configurable fillCandidatePar{"fillCandidatePar", true, "Fill candidate parameters"}; + Configurable fillCandidateParE{"fillCandidateParE", true, "Fill candidate extended parameters"}; + Configurable fillCandidateSel{"fillCandidateSel", true, "Fill candidate selection flags"}; + Configurable fillCandidateMl{"fillCandidateMl", true, "Fill candidate selection ML scores"}; + Configurable fillCandidateId{"fillCandidateId", true, "Fill original indices from the candidate table"}; + Configurable fillCandidateMc{"fillCandidateMc", true, "Fill candidate MC info"}; + // Parameters for production of training samples + Configurable downSampleBkgFactor{"downSampleBkgFactor", 1., "Fraction of background candidates to keep for ML trainings"}; + Configurable ptMaxForDownSample{"ptMaxForDownSample", 10., "Maximum pt for the application of the downsampling factor"}; + + HfHelper hfHelper; + SliceCache cache; + static constexpr double mass{o2::constants::physics::MassDPlus}; + + using CollisionsWCentMult = soa::Join; + using CollisionsWMcCentMult = soa::Join; + using TracksWPid = soa::Join; + using SelectedCandidates = soa::Filtered>; + using SelectedCandidatesMc = soa::Filtered>; + using SelectedCandidatesMl = soa::Filtered>; + using SelectedCandidatesMcMl = soa::Filtered>; + using MatchedGenCandidatesMc = soa::Filtered>; + using TypeMcCollisions = soa::Join; + + Filter filterSelectCandidates = aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= 1; + Filter filterMcGenMatching = nabs(aod::hf_cand_3prong::flagMcMatchGen) == static_cast(BIT(aod::hf_cand_3prong::DecayType::DplusToPiKPi)); + + Preslice candidatesPerCollision = aod::hf_cand::collisionId; + Preslice candidatesMcPerCollision = aod::hf_cand::collisionId; + Preslice candidatesMlPerCollision = aod::hf_cand::collisionId; + Preslice candidatesMcMlPerCollision = aod::hf_cand::collisionId; + Preslice mcParticlesPerMcCollision = aod::mcparticle::mcCollisionId; + + // trivial partitions for all candidates to allow "->sliceByCached" inside processCandidates + Partition candidatesAll = aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= 0; + Partition candidatesMcAll = aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= 0; + Partition candidatesMlAll = aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= 0; + Partition candidatesMcMlAll = aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= 0; + // partitions for signal and background + Partition candidatesMcSig = nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_3prong::DecayType::DplusToPiKPi)); + Partition candidatesMcBkg = nabs(aod::hf_cand_3prong::flagMcMatchRec) != static_cast(BIT(aod::hf_cand_3prong::DecayType::DplusToPiKPi)); + Partition candidatesMcMlSig = nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_3prong::DecayType::DplusToPiKPi)); + Partition candidatesMcMlBkg = nabs(aod::hf_cand_3prong::flagMcMatchRec) != static_cast(BIT(aod::hf_cand_3prong::DecayType::DplusToPiKPi)); + + void init(InitContext const&) + { + std::array doprocess{doprocessData, doprocessMcSig, doprocessMcBkg, doprocessMcAll, doprocessDataMl, doprocessMcMlSig, doprocessMcMlBkg, doprocessMcMlAll, doprocessMcGenOnly}; + if (std::accumulate(doprocess.begin(), doprocess.end(), 0) != 1) { + LOGP(fatal, "Only one process function can be enabled at a time."); + } + rowsCommon.init(confDerData); + } + + template + void fillTablesCandidate(const T& candidate, const U& prong0, const U& prong1, const U& prong2, int candFlag, double invMass, + double ct, double y, int8_t flagMc, int8_t origin, int8_t swapping, const std::vector& mlScores) + { + rowsCommon.fillTablesCandidate(candidate, invMass, y); + if (fillCandidatePar) { + rowCandidatePar( + candidate.chi2PCA(), + candidate.nProngsContributorsPV(), + candidate.cpa(), + candidate.cpaXY(), + candidate.decayLength(), + candidate.decayLengthXY(), + candidate.decayLengthNormalised(), + candidate.decayLengthXYNormalised(), + candidate.ptProng0(), + candidate.ptProng1(), + candidate.ptProng2(), + candidate.impactParameter0(), + candidate.impactParameter1(), + candidate.impactParameter2(), + candidate.impactParameterNormalised0(), + candidate.impactParameterNormalised1(), + candidate.impactParameterNormalised2(), + prong0.tpcNSigmaPi(), + prong0.tofNSigmaPi(), + prong0.tpcTofNSigmaPi(), + prong1.tpcNSigmaKa(), + prong1.tofNSigmaKa(), + prong1.tpcTofNSigmaKa(), + prong2.tpcNSigmaPi(), + prong2.tofNSigmaPi(), + prong2.tpcTofNSigmaPi()); + } + if (fillCandidateParE) { + rowCandidateParE( + candidate.xSecondaryVertex(), + candidate.ySecondaryVertex(), + candidate.zSecondaryVertex(), + candidate.errorDecayLength(), + candidate.errorDecayLengthXY(), + candidate.rSecondaryVertex(), + RecoDecay::p(candidate.pxProng0(), candidate.pyProng0(), candidate.pzProng0()), + RecoDecay::p(candidate.pxProng1(), candidate.pyProng1(), candidate.pzProng1()), + RecoDecay::p(candidate.pxProng2(), candidate.pyProng2(), candidate.pzProng2()), + candidate.pxProng0(), + candidate.pyProng0(), + candidate.pzProng0(), + candidate.pxProng1(), + candidate.pyProng1(), + candidate.pzProng1(), + candidate.pxProng2(), + candidate.pyProng2(), + candidate.pzProng2(), + candidate.errorImpactParameter0(), + candidate.errorImpactParameter1(), + candidate.errorImpactParameter2(), + ct); + } + if (fillCandidateSel) { + rowCandidateSel( + BIT(candFlag)); + } + if (fillCandidateMl) { + rowCandidateMl( + mlScores); + } + if (fillCandidateId) { + rowCandidateId( + candidate.collisionId(), + candidate.prong0Id(), + candidate.prong1Id(), + candidate.prong2Id()); + } + if (fillCandidateMc) { + rowCandidateMc( + flagMc, + origin, + swapping); + } + } + + template + void processCandidates(CollType const& collisions, + Partition& candidates, + TracksWPid const&, + aod::BCs const&) + { + // Fill collision properties + if constexpr (isMc) { + if (confDerData.fillMcRCollId) { + rowsCommon.matchedCollisions.clear(); + } + } + auto sizeTableColl = collisions.size(); + rowsCommon.reserveTablesColl(sizeTableColl); + for (const auto& collision : collisions) { + auto thisCollId = collision.globalIndex(); + auto candidatesThisColl = candidates->sliceByCached(aod::hf_cand::collisionId, thisCollId, cache); // FIXME + auto sizeTableCand = candidatesThisColl.size(); + LOGF(debug, "Rec. collision %d has %d candidates", thisCollId, sizeTableCand); + // Skip collisions without HF candidates (and without HF particles in matched MC collisions if saving indices of reconstructed collisions matched to MC collisions) + bool mcCollisionHasMcParticles{false}; + if constexpr (isMc) { + mcCollisionHasMcParticles = confDerData.fillMcRCollId && collision.has_mcCollision() && rowsCommon.hasMcParticles[collision.mcCollisionId()]; + LOGF(debug, "Rec. collision %d has MC collision %d with MC particles? %s", thisCollId, collision.mcCollisionId(), mcCollisionHasMcParticles ? "yes" : "no"); + } + if (sizeTableCand == 0 && (!confDerData.fillMcRCollId || !mcCollisionHasMcParticles)) { + LOGF(debug, "Skipping rec. collision %d", thisCollId); + continue; + } + LOGF(debug, "Filling rec. collision %d at derived index %d", thisCollId, rowsCommon.rowCollBase.lastIndex() + 1); + rowsCommon.fillTablesCollision(collision); + + // Fill candidate properties + rowsCommon.reserveTablesCandidates(sizeTableCand); + reserveTable(rowCandidatePar, fillCandidatePar, sizeTableCand); + reserveTable(rowCandidateParE, fillCandidateParE, sizeTableCand); + reserveTable(rowCandidateSel, fillCandidateSel, sizeTableCand); + reserveTable(rowCandidateMl, fillCandidateMl, sizeTableCand); + reserveTable(rowCandidateId, fillCandidateId, sizeTableCand); + if constexpr (isMc) { + reserveTable(rowCandidateMc, fillCandidateMc, sizeTableCand); + } + int8_t flagMcRec = 0, origin = 0, swapping = 0; + for (const auto& candidate : candidatesThisColl) { + if constexpr (isMc) { + flagMcRec = candidate.flagMcMatchRec(); + origin = candidate.originMcRec(); + swapping = candidate.isCandidateSwapped(); + if constexpr (onlyBkg) { + if (TESTBIT(std::abs(flagMcRec), aod::hf_cand_3prong::DecayType::DplusToPiKPi)) { + continue; + } + if (downSampleBkgFactor < 1.) { + float pseudoRndm = candidate.ptProng0() * 1000. - static_cast(candidate.ptProng0() * 1000); + if (candidate.pt() < ptMaxForDownSample && pseudoRndm >= downSampleBkgFactor) { + continue; + } + } + } + if constexpr (onlySig) { + if (!TESTBIT(std::abs(flagMcRec), aod::hf_cand_3prong::DecayType::DplusToPiKPi)) { + continue; + } + } + } + auto prong0 = candidate.template prong0_as(); + auto prong1 = candidate.template prong1_as(); + auto prong2 = candidate.template prong2_as(); + double ct = hfHelper.ctDplus(candidate); + double y = hfHelper.yDplus(candidate); + float massDplusToPiKPi = hfHelper.invMassDplusToPiKPi(candidate); + std::vector mlScoresDplusToPiKPi; + if constexpr (isMl) { + std::copy(candidate.mlProbDplusToPiKPi().begin(), candidate.mlProbDplusToPiKPi().end(), std::back_inserter(mlScoresDplusToPiKPi)); + } + if (candidate.isSelDplusToPiKPi()) { + fillTablesCandidate(candidate, prong0, prong1, prong2, 0, massDplusToPiKPi, ct, y, flagMcRec, origin, swapping, mlScoresDplusToPiKPi); + } + } + } + } + + void processData(CollisionsWCentMult const& collisions, + SelectedCandidates const&, + TracksWPid const& tracks, + aod::BCs const& bcs) + { + processCandidates(collisions, candidatesAll, tracks, bcs); + } + PROCESS_SWITCH(HfDerivedDataCreatorDplusToPiKPi, processData, "Process data", true); + + void processMcSig(CollisionsWMcCentMult const& collisions, + SelectedCandidatesMc const&, + TypeMcCollisions const& mcCollisions, + MatchedGenCandidatesMc const& mcParticles, + TracksWPid const& tracks, + aod::BCs const& bcs) + { + rowsCommon.preProcessMcCollisions(mcCollisions, mcParticlesPerMcCollision, mcParticles); + processCandidates(collisions, candidatesMcSig, tracks, bcs); + rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, mass); + } + PROCESS_SWITCH(HfDerivedDataCreatorDplusToPiKPi, processMcSig, "Process MC only for signals", false); + + void processMcBkg(CollisionsWMcCentMult const& collisions, + SelectedCandidatesMc const&, + TypeMcCollisions const& mcCollisions, + MatchedGenCandidatesMc const& mcParticles, + TracksWPid const& tracks, + aod::BCs const& bcs) + { + rowsCommon.preProcessMcCollisions(mcCollisions, mcParticlesPerMcCollision, mcParticles); + processCandidates(collisions, candidatesMcBkg, tracks, bcs); + rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, mass); + } + PROCESS_SWITCH(HfDerivedDataCreatorDplusToPiKPi, processMcBkg, "Process MC only for background", false); + + void processMcAll(CollisionsWMcCentMult const& collisions, + SelectedCandidatesMc const&, + TypeMcCollisions const& mcCollisions, + MatchedGenCandidatesMc const& mcParticles, + TracksWPid const& tracks, + aod::BCs const& bcs) + { + rowsCommon.preProcessMcCollisions(mcCollisions, mcParticlesPerMcCollision, mcParticles); + processCandidates(collisions, candidatesMcAll, tracks, bcs); + rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, mass); + } + PROCESS_SWITCH(HfDerivedDataCreatorDplusToPiKPi, processMcAll, "Process MC", false); + + // ML versions + + void processDataMl(CollisionsWCentMult const& collisions, + SelectedCandidatesMl const&, + TracksWPid const& tracks, + aod::BCs const& bcs) + { + processCandidates(collisions, candidatesMlAll, tracks, bcs); + } + PROCESS_SWITCH(HfDerivedDataCreatorDplusToPiKPi, processDataMl, "Process data with ML", false); + + void processMcMlSig(CollisionsWMcCentMult const& collisions, + SelectedCandidatesMcMl const&, + TypeMcCollisions const& mcCollisions, + MatchedGenCandidatesMc const& mcParticles, + TracksWPid const& tracks, + aod::BCs const& bcs) + { + rowsCommon.preProcessMcCollisions(mcCollisions, mcParticlesPerMcCollision, mcParticles); + processCandidates(collisions, candidatesMcMlSig, tracks, bcs); + rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, mass); + } + PROCESS_SWITCH(HfDerivedDataCreatorDplusToPiKPi, processMcMlSig, "Process MC with ML only for signals", false); + + void processMcMlBkg(CollisionsWMcCentMult const& collisions, + SelectedCandidatesMcMl const&, + TypeMcCollisions const& mcCollisions, + MatchedGenCandidatesMc const& mcParticles, + TracksWPid const& tracks, + aod::BCs const& bcs) + { + rowsCommon.preProcessMcCollisions(mcCollisions, mcParticlesPerMcCollision, mcParticles); + processCandidates(collisions, candidatesMcMlBkg, tracks, bcs); + rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, mass); + } + PROCESS_SWITCH(HfDerivedDataCreatorDplusToPiKPi, processMcMlBkg, "Process MC with ML only for background", false); + + void processMcMlAll(CollisionsWMcCentMult const& collisions, + SelectedCandidatesMcMl const&, + TypeMcCollisions const& mcCollisions, + MatchedGenCandidatesMc const& mcParticles, + TracksWPid const& tracks, + aod::BCs const& bcs) + { + rowsCommon.preProcessMcCollisions(mcCollisions, mcParticlesPerMcCollision, mcParticles); + processCandidates(collisions, candidatesMcMlAll, tracks, bcs); + rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, mass); + } + PROCESS_SWITCH(HfDerivedDataCreatorDplusToPiKPi, processMcMlAll, "Process MC with ML", false); + + void processMcGenOnly(TypeMcCollisions const& mcCollisions, + MatchedGenCandidatesMc const& mcParticles) + { + rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, mass); + } + PROCESS_SWITCH(HfDerivedDataCreatorDplusToPiKPi, processMcGenOnly, "Process MC gen. only", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} From 0bf20745f31691d1d737588a41528aa4923466d7 Mon Sep 17 00:00:00 2001 From: Noor Koster <82090643+cnkoster@users.noreply.github.com> Date: Thu, 6 Feb 2025 20:12:41 +0100 Subject: [PATCH 0079/1650] [PWGCF] Fixed bug and added some QA histos (#9797) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/flowSP.cxx | 41 ++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowSP.cxx b/PWGCF/Flow/Tasks/flowSP.cxx index 06de1e2ec4c..027cbc43ce4 100644 --- a/PWGCF/Flow/Tasks/flowSP.cxx +++ b/PWGCF/Flow/Tasks/flowSP.cxx @@ -162,6 +162,16 @@ struct FlowSP { nEventSelections }; + enum TrackSelections { + trackSel_FilteredTracks, + trackSel_NCls, + trackSel_FshCls, + trackSel_TPCBoundary, + trackSel_ZeroCharge, + trackSel_ParticleWeights, + nTrackSelections + }; + enum ChargeType { kInclusive, kPositive, @@ -190,6 +200,8 @@ struct FlowSP { AxisSpec t0cAxis = {70, 0, 70000, "N_{ch} (T0C)"}; AxisSpec t0aAxis = {200, 0, 200, "N_{ch}"}; AxisSpec multpvAxis = {4000, 0, 4000, "N_{ch} (PV)"}; + AxisSpec shclAxis = {200, 0, 1, "Fraction shared cl. TPC"}; + AxisSpec clAxis = {160, 0, 160, "Number of cl. TPC"}; int ptbins = ptbinning.size() - 1; @@ -315,8 +327,10 @@ struct FlowSP { registry.add("incl/QA/hPhiCorrected", "", kTH1D, {axisPhi}); registry.add("incl/QA/hEta", "", kTH1D, {axisEta}); registry.add("incl/QA/hPhi_Eta_vz", "", kTH3D, {axisPhi, axisEta, axisVz}); - registry.add("incl/QA/hDCAxy", "", kTH1D, {axisDCAxy}); - registry.add("incl/QA/hDCAz", "", kTH1D, {axisDCAz}); + registry.add("incl/QA/hDCAxy_pt", "", kTH2D, {axisPt, axisDCAxy}); + registry.add("incl/QA/hDCAz_pt", "", kTH2D, {axisPt, axisDCAz}); + registry.add("incl/QA/hSharedClusters_pt", "", {HistType::kTH2D, {axisPt, shclAxis}}); + registry.add("incl/QA/hCrossedRows_pt", "", {HistType::kTH2D, {axisPt, clAxis}}); registry.addClone("incl/", "pos/"); registry.addClone("incl/", "neg/"); @@ -340,6 +354,14 @@ struct FlowSP { registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_kIsGoodITSLayersAll + 1, "kkIsGoodITSLayersAll"); registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_isSelectedZDC + 1, "isSelected"); + registry.add("hTrackCount", "Number of Tracks; Cut; #Tracks Passed Cut", {HistType::kTH1D, {{nTrackSelections, 0, nTrackSelections}}}); + registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_FilteredTracks + 1, "Filtered Track"); + registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_NCls + 1, "nClusters TPC"); + registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_FshCls + 1, "Frac. sh. Cls TPC"); + registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_TPCBoundary + 1, "TPC Boundary"); + registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_ZeroCharge + 1, "Only charged"); + registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_ParticleWeights + 1, "Apply weights"); + if (cfgUseAdditionalEventCut) { fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x - 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); fMultPVCutLow->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); @@ -535,9 +557,11 @@ struct FlowSP { if (track.tpcNClsFound() < cfgNcls) return false; + registry.fill(HIST("hTrackCount"), trackSel_NCls); - if (track.tpcFractionSharedCls() < cfgFshcls) + if (track.tpcFractionSharedCls() > cfgFshcls) return false; + registry.fill(HIST("hTrackCount"), trackSel_FshCls); double phimodn = track.phi(); if (field < 0) // for negative polarity field @@ -556,6 +580,7 @@ struct FlowSP { return false; // reject track } registry.fill(HIST("QA/after/pt_phi"), track.pt(), phimodn); + registry.fill(HIST("hTrackCount"), trackSel_TPCBoundary); return true; } @@ -679,8 +704,10 @@ struct FlowSP { registry.fill(HIST(Charge[ct]) + HIST("QA/hPhiCorrected"), track.phi(), wacc * weff); registry.fill(HIST(Charge[ct]) + HIST("QA/hEta"), track.eta()); registry.fill(HIST(Charge[ct]) + HIST("QA/hPhi_Eta_vz"), track.phi(), track.eta(), vz); - registry.fill(HIST(Charge[ct]) + HIST("QA/hDCAxy"), track.dcaXY()); - registry.fill(HIST(Charge[ct]) + HIST("QA/hDCAz"), track.dcaZ()); + registry.fill(HIST(Charge[ct]) + HIST("QA/hDCAxy_pt"), track.pt(), track.dcaXY()); + registry.fill(HIST(Charge[ct]) + HIST("QA/hDCAz_pt"), track.pt(), track.dcaZ()); + registry.fill(HIST(Charge[ct]) + HIST("QA/hSharedClusters_pt"), track.pt(), track.tpcFractionSharedCls()); + registry.fill(HIST(Charge[ct]) + HIST("QA/hCrossedRows_pt"), track.pt(), track.tpcNClsFound()); } void processData(UsedCollisions::iterator const& collision, aod::BCsWithTimestamps const&, UsedTracks const& tracks) @@ -785,6 +812,7 @@ struct FlowSP { for (const auto& track : tracks) { registry.fill(HIST("QA/before/hPt_inclusive"), track.pt()); + registry.fill(HIST("hTrackCount"), trackSel_FilteredTracks); float weff = 1, wacc = 1; float weffP = 1, waccP = 1; @@ -795,6 +823,7 @@ struct FlowSP { if (track.sign() == 0.0) return; + registry.fill(HIST("hTrackCount"), trackSel_ZeroCharge); bool pos = (track.sign() > 0) ? true : false; // Fill NUA weights @@ -816,6 +845,8 @@ struct FlowSP { if (!pos && !setCurrentParticleWeights(kNegative, weffN, waccN, track.phi(), track.eta(), track.pt(), vtxz)) return; + registry.fill(HIST("hTrackCount"), trackSel_ParticleWeights); + registry.fill(HIST("QA/after/hPt_inclusive"), track.pt(), wacc * weff); // // constrain angle to 0 -> [0,0+2pi] From 80b43206c25c75f926e079c748f1d108d472e622 Mon Sep 17 00:00:00 2001 From: hernasab Date: Thu, 6 Feb 2025 13:52:12 -0600 Subject: [PATCH 0080/1650] [PWGCF] added event selection (#9800) Co-authored-by: Sabrina Hernandez --- PWGCF/Flow/Tasks/flowZdcTask.cxx | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowZdcTask.cxx b/PWGCF/Flow/Tasks/flowZdcTask.cxx index 6ef4d78d9ca..a3497dac4c0 100644 --- a/PWGCF/Flow/Tasks/flowZdcTask.cxx +++ b/PWGCF/Flow/Tasks/flowZdcTask.cxx @@ -44,7 +44,7 @@ using namespace o2::framework::expressions; using namespace o2::aod::mult; using namespace o2::aod::evsel; using ColEvSels = soa::Join; -using AodCollisions = soa::Filtered>; +using AodCollisions = soa::Filtered>; using AodTracks = soa::Filtered>; using BCsRun3 = soa::Join; using AodZDCs = soa::Join; @@ -124,6 +124,7 @@ struct FlowZdcTask { ConfigurableAxis axisFT0MAmp{"axisFT0MAmp", {10000, 0, 10000}, "axisFT0MAmp"}; ConfigurableAxis ft0cMultHistBin{"ft0cMultHistBin", {501, -0.5, 500.5}, ""}; ConfigurableAxis multHistBin{"multHistBin", {501, -0.5, 500.5}, ""}; + ConfigurableAxis axisCent{"axisCent", {10, 0, 100}, "axisCent"}; Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls) && (nabs(aod::track::dcaZ) < cfgCutDCAz) && (nabs(aod::track::dcaXY) < cfgCutDCAxy); @@ -175,10 +176,9 @@ struct FlowZdcTask { AxisSpec axisVtxcounts{2, -0.5f, 1.5f, "Vtx info (0=no, 1=yes)"}; AxisSpec axisVtxZ{40, -20, 20, "Vertex Z", "VzAxis"}; AxisSpec axisZvert{120, -30.f, 30.f, "Vtx z (cm)"}; - AxisSpec axisCent{8, 0.f, 105.f, "centrality"}; AxisSpec axisCentBins{{0, 5., 10., 20., 30., 40., 50., 60., 70., 80.}, "centrality percentile"}; AxisSpec axisPtBins{{0., 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.25, 2.5, 2.75, 3.0, 3.5, 4.0, 4.5, 5.0, 6.0, 8.0, 10., 13., 16., 20.}, "p_{T} (GeV/c)"}; - AxisSpec axisEvent{6, 0.5, 6.5, "#Event", "EventAxis"}; + AxisSpec axisEvent{11, 0.5, 11.5, "#Event", "EventAxis"}; AxisSpec axisMult = {multHistBin, "Mult", "MultAxis"}; AxisSpec axisFT0CMult = {ft0cMultHistBin, "ft0c", "FT0CMultAxis"}; @@ -225,6 +225,10 @@ struct FlowZdcTask { xAxis->SetBinLabel(4, "kIsGoodZvtxFT0vsPV"); // small difference between z-vertex from PV and from FT0 xAxis->SetBinLabel(5, "kIsVertexITSTPC"); // at least one ITS-TPC track (reject vertices built from ITS-only tracks) xAxis->SetBinLabel(6, "kIsGoodITSLayersAll"); //"Centrality based on no other collisions in this Readout Frame with per-collision multiplicity above threshold tracks" + xAxis->SetBinLabel(7, "kIsApplyVertexTOFmatched"); + xAxis->SetBinLabel(8, "kIsVertexTRDmatched"); + xAxis->SetBinLabel(9, "centrality selection"); + xAxis->SetBinLabel(10, "isApplyExtraCorrCut"); histos.add("GlobalMult_vs_FT0C", "GlobalMult_vs_FT0C", kTH2F, {axisMult, axisFT0CMult}); histos.add("VtxZHist", "VtxZHist", kTH1D, {axisVtxZ}); @@ -299,6 +303,25 @@ struct FlowZdcTask { return false; } histos.fill(HIST("eventSelectionSteps"), 6); + if (isApplyVertexTOFmatched && !col.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) { + return false; + } + histos.fill(HIST("eventSelectionSteps"), 7); + + if (isApplyVertexTRDmatched && !col.selection_bit(o2::aod::evsel::kIsVertexTRDmatched)) { + return false; + } + histos.fill(HIST("eventSelectionSteps"), 8); + if (col.centFT0C() < 0. || col.centFT0C() > 100.) { + return false; + } + histos.fill(HIST("eventSelectionSteps"), 9); + + if (isApplyExtraCorrCut && col.multNTracksPV() > npvTracksCut && col.multFT0C() < (10 * col.multNTracksPV() - ft0cCut)) { + return false; + } + histos.fill(HIST("eventSelectionSteps"), 10); + histos.fill(HIST("eventSelectionSteps"), 11); return true; } @@ -315,8 +338,6 @@ struct FlowZdcTask { // this is the q vector for the TPC data. it is a complex function double qTpcReal = 0.0; // Initialize qTPC_real double qTpcIm = 0.0; // init qTPC_imaginary - if (cent < 0.0 && cent > 70) - return; std::complex qTPC(0, 0); // Starting with a q-vector of zero int nTot{0}; // Tracks are already filtered with GlobalTrack || GlobalTrackSDD for (const auto& track : tracks) { From f0de72e07a71cc065fc6a5faf7e38e5e735dab62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Karpi=C5=84ski?= <40724893+davkk@users.noreply.github.com> Date: Thu, 6 Feb 2025 21:17:26 +0100 Subject: [PATCH 0081/1650] [PWGCF/FemtoUniverse] Add more flags to efficiency calculator script + fix configurable for timestamps (#9798) --- .../Core/FemtoUniverseEfficiencyCalculator.h | 4 +- .../femto_universe_efficiency_calculator.py | 122 ++++++++++++------ 2 files changed, 84 insertions(+), 42 deletions(-) diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCalculator.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCalculator.h index 2cde8f14422..05794b5c477 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCalculator.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCalculator.h @@ -40,7 +40,7 @@ struct EfficiencyConfigurableGroup : ConfigurableGroup { Configurable confEfficiencyApplyCorrections{"confEfficiencyApplyCorrections", false, "Should apply corrections from efficiency"}; Configurable> confEfficiencyCCDBLabels{"confEfficiencyCCDBLabels", {}, "Custom labels for efficiency objects in CCDB"}; Configurable confCCDBTrainNumber{"confCCDBTrainNumber", -1, "Train number for which to query CCDB objects (set to -1 to ignore)"}; - ConfigurableAxis confEfficiencyCCDBTimestamps{"confEfficiencyCCDBTimestamps", {-1, -1}, "Timestamps in CCDB, to query for specific objects (default: -1 for both)"}; + Configurable> confEfficiencyCCDBTimestamps{"confEfficiencyCCDBTimestamps", {"-1", "-1"}, "Timestamps in CCDB, to query for specific objects (default: -1 for both, the latest valid object)"}; // NOTE: in the future we might move the below configurables to a separate struct, eg. CCDBConfigurableGroup Configurable confCCDBUrl{"confCCDBUrl", "http://alice-ccdb.cern.ch", "CCDB URL to be used"}; @@ -119,7 +119,7 @@ class EfficiencyCalculator } auto timestamp = partNo - 1 < config->confEfficiencyCCDBTimestamps->size() - ? static_cast(config->confEfficiencyCCDBTimestamps.value[partNo - 1]) + ? std::stoll(config->confEfficiencyCCDBTimestamps.value[partNo - 1]) : -1; auto hEff = ccdb.getSpecific(config->confCCDBPath, timestamp, metadata); diff --git a/PWGCF/FemtoUniverse/Scripts/femto_universe_efficiency_calculator.py b/PWGCF/FemtoUniverse/Scripts/femto_universe_efficiency_calculator.py index b85344ebe00..2a0b822d215 100755 --- a/PWGCF/FemtoUniverse/Scripts/femto_universe_efficiency_calculator.py +++ b/PWGCF/FemtoUniverse/Scripts/femto_universe_efficiency_calculator.py @@ -25,52 +25,82 @@ import ROOT # pylint: disable=import-error -parser = argparse.ArgumentParser(description="A tool to calculate efficiency and upload it to CCDB") + +class CustomHelpFormatter(argparse.HelpFormatter): + "Add default value to help format" + + def _get_help_string(self, action): + help_str = action.help + if help_str is not None and action.default not in [argparse.SUPPRESS, None]: + help_str += f" (default: {action.default})" + return help_str + + +parser = argparse.ArgumentParser( + description="A tool to calculate efficiency and upload it to CCDB", + formatter_class=CustomHelpFormatter, +) parser.add_argument( - "run_dir", + "--alien-path", type=Path, - help="Path to run directory with analysis results", + help="path to train run's directory in Alien with analysis results " + "[example: /alice/cern.ch/user/a/alihyperloop/outputs/0033/332611/70301]", +) +parser.add_argument( + "--mc-reco", + type=str, + nargs="+", + help="paths to MC Reco histograms, separated by space [example: task/mcreco_one/hPt task/mcreco_two/hPt]", + required=True, ) parser.add_argument( - "--task", - "-t", + "--mc-truth", type=str, - help="Task name to query histograms from", + nargs="+", + help="paths to MC Truth histograms, separated by space [example: task/mctruth_one/hPt task/mctruth_one/hPt]", required=True, ) parser.add_argument( "--ccdb-path", - "-P", type=str, - help="Path where to save in CCDB", + help="location in CCDB to where objects will be uploaded", required=True, ) parser.add_argument( "--ccdb-url", - "-U", type=str, - help="Path where to save in CCDB", + help="URL to CCDB", default="http://ccdb-test.cern.ch:8080", ) parser.add_argument( "--ccdb-labels", - "-L", type=str, nargs="+", - help="Labels for objects' metadata in CCDB", - default=[""] * 2, + help="custom labels to add to objects' metadata in CCDB [example: label1 label2]", + default=[], ) parser.add_argument( "--ccdb-lifetime", - "-T", type=int, - help="How long should the objects' validity in CCDB last (default: 1 year)", + help="how long should objects in CCDB remain valid (milliseconds)", default=365 * 24 * 60 * 60 * 1000, # one year ) args = parser.parse_args() +if len(args.mc_reco) != len(args.mc_truth): + print("[!] Provided number of histograms with MC Reco must match MC Truth", file=sys.stderr) + sys.exit(1) + +if len(args.ccdb_labels) > 0 and len(args.ccdb_labels) != len(args.mc_reco): + print("[!] You must provide labels for all particles", file=sys.stderr) + sys.exit(1) + +if len(args.ccdb_labels) == 0: + # if flag is not provided, fill with empty strings to match size + args.ccdb_labels = [""] * len(args.mc_reco) + ANALYSIS_RESULTS = "AnalysisResults.root" -results_path = args.run_dir / ANALYSIS_RESULTS +results_path = args.alien_path / ANALYSIS_RESULTS job_id = results_path.parent.name train_number = results_path.parent.parent.name @@ -81,7 +111,7 @@ # get file from alien if not res_dest.is_file(): - print(f"[↓] Downloading analysis results from Alien to {res_dest} ...", file=sys.stderr) + print(f"[↓] Downloading analysis results from Alien to '{res_dest}' ...", file=sys.stderr) ROOT.TGrid.Connect("alien://") try: subprocess.run( @@ -92,14 +122,15 @@ print("[-] Download complete!", file=sys.stderr) except subprocess.CalledProcessError as error: print(f"[!] Error while downloading results file: {error.stderr}", file=sys.stderr) - sys.exit(0) + sys.exit(1) else: print( - f"[-] Skipping download from Alien, since {res_dest} is already present", + f"[-] Skipping download from Alien, since '{res_dest}' is already present", file=sys.stderr, ) -particles = {1: "one", 2: "two"} +print() + histos_to_upload = [] # get reco & truth histos @@ -107,26 +138,28 @@ ROOT.TFile.Open(res_dest.as_uri()) as res_file, ROOT.TFile.Open(eff_dest.as_uri(), "recreate") as eff_file, ): - for idx, part_num in particles.items(): - reco = res_file.Get(f"{args.task}/Tracks_{part_num}_MC/hPt") - truth = res_file.Get(f"{args.task}/MCTruthTracks_{part_num}/hPt") - if not reco and not truth: - print( - f"[-] No MC Reco nor MC Truth histogram found for particle {part_num}", - file=sys.stderr, - ) - continue + for idx, (mc_reco, mc_truth) in enumerate(zip(args.mc_reco, args.mc_truth)): + hist_reco = res_file.Get(mc_reco) + if not hist_reco: + print(f"[!] Cannot find MC Reco histogram in '{mc_reco}', aborting", file=sys.stderr) + sys.exit(1) - num_bins = reco.GetNbinsX() - x_max = reco.GetXaxis().GetBinLowEdge(num_bins) + reco.GetXaxis().GetBinWidth(num_bins) + hist_truth = res_file.Get(mc_truth) + if not hist_truth: + print(f"[!] Cannot find MC Truth histogram in '{mc_truth}', aborting", file=sys.stderr) + sys.exit(1) - hist_name = f"Efficiency_part{idx}" + num_bins = hist_reco.GetNbinsX() + x_max = hist_reco.GetXaxis().GetBinLowEdge(num_bins) + x_max += hist_reco.GetXaxis().GetBinWidth(num_bins) + + hist_name = f"Efficiency_part{idx + 1}" # calculate efficiency eff = ROOT.TH1F(hist_name, "", num_bins, 0, x_max) for bin_idx in range(len(eff)): - denom = truth.GetBinContent(bin_idx) - eff.SetBinContent(bin_idx, reco.GetBinContent(bin_idx) / denom if denom > 0 else 0) + denom = hist_truth.GetBinContent(bin_idx) + eff.SetBinContent(bin_idx, hist_reco.GetBinContent(bin_idx) / denom if denom > 0 else 0) # save efficiency object to file eff_file.WriteObject(eff, hist_name) @@ -134,7 +167,7 @@ if len(histos_to_upload) == 0: print("[-] Exiting, since there is nothing to upload", file=sys.stderr) - sys.exit(0) + sys.exit(1) # upload objects to ccdb try: @@ -142,7 +175,7 @@ timestamp_start = int(time.time() * 1000) timestamp_end = timestamp_start + args.ccdb_lifetime - print(f"[↑] Uploading {key} to CCDB ... ", file=sys.stderr, end="") + print(f"[↑] Uploading {key} to {args.ccdb_url} ... ", file=sys.stderr, end="") upload_cmd = [ "o2-ccdb-upload", "--file", @@ -161,14 +194,23 @@ f"trainNumber={train_number};label={args.ccdb_labels[idx]}", ] result = subprocess.run(upload_cmd, capture_output=True, check=True) + + if "html" in result.stdout.decode("utf-8"): + print( + f"\n[!] Something went wrong with upload request: {result.stdout.decode('utf-8')}", + file=sys.stderr, + ) + sys.exit(1) + if result.stderr: - print(f"[!] Error while uploading: {result.stderr.decode('utf-8')}", file=sys.stderr) - sys.exit(0) + print(f"\n[!] Error while uploading: {result.stderr.decode('utf-8')}", file=sys.stderr) + sys.exit(1) print("complete!", file=sys.stderr) except subprocess.CalledProcessError as error: - print(f"[!] Error while uploading: {error.stderr.decode('utf-8')}", file=sys.stderr) - sys.exit(0) + print(f"\n[!] Error while uploading: {error.stderr.decode('utf-8')}", file=sys.stderr) + sys.exit(1) +print() print("[✓] Success!", file=sys.stderr) From b78e5ccabccf8279e7e85ab098ac31d4dc7e8028 Mon Sep 17 00:00:00 2001 From: omvazque Date: Thu, 6 Feb 2025 14:50:20 -0600 Subject: [PATCH 0082/1650] [PWGLF] Analyze per collision v2 (#9796) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 425 ++++++++++++------- 1 file changed, 261 insertions(+), 164 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index 8f8ec7d6ffa..0234463ec6b 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -26,6 +26,7 @@ #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/TrackSelectionTables.h" #include "CommonConstants/MathConstants.h" +#include "Framework/ASoAHelpers.h" // required for Filter op. #include "Framework/AnalysisDataModel.h" #include "Framework/AnalysisTask.h" #include "Framework/HistogramRegistry.h" @@ -43,13 +44,20 @@ using namespace o2::aod::evsel; using namespace o2::constants::physics; using namespace o2::constants::math; -using ColEvSels = soa::Join; -// o2::aod::BCsWithTimestamps = soa::Join -using BCsRun3 = soa::Join; - -using SimCollisions = soa::Join; -using SimTracks = soa::Join; -using TableTracks = soa::Join; +namespace o2::aod +{ +using ColEvSels = soa::Join; +using BCsRun3 = + soa::Join; +using TracksSel = + soa::Join; +} // namespace o2::aod + +using SimCollisions = soa::Join; +using SimTracks = soa::Join; struct UccZdc { // Event selection @@ -58,27 +66,31 @@ struct UccZdc { Configurable maxT0CcentCut{"maxT0CcentCut", 90.0, "Max T0C Cent. cut"}; // Track selection settings - Configurable minItsNclusters{"minItsNclusters", 5, "minimum number of ITS clusters"}; - Configurable minTpcNclusters{"minTpcNclusters", 70, "minimum number of TPC clusters"}; + Configurable minItsNclusters{"minItsNclusters", 5, + "minimum number of ITS clusters"}; + Configurable minTpcNclusters{"minTpcNclusters", 70, + "minimum number of TPC clusters"}; Configurable minTpcNcrossedRows{"minTpcNcrossedRows", 70, "minimum number of TPC crossed pad rows"}; Configurable maxChiSquareTpc{"maxChiSquareTpc", 4.0, "maximum TPC chi^2/Ncls"}; - Configurable maxChiSquareIts{"maxChiSquareIts", 36.0, "maximum ITS chi^2/Ncls"}; + Configurable maxChiSquareIts{"maxChiSquareIts", 36.0, + "maximum ITS chi^2/Ncls"}; Configurable minPt{"minPt", 0.1, "minimum pt of the tracks"}; Configurable maxPt{"maxPt", 50., "maximum pt of the tracks"}; Configurable minEta{"minEta", -0.8, "minimum eta"}; Configurable maxEta{"maxEta", +0.8, "maximum eta"}; Configurable maxDcaxy{"maxDcaxy", 0.05, "Maximum DCAxy"}; Configurable maxDcaz{"maxDcaz", 0.05, "Maximum DCAz"}; - Configurable setDCAselectionPtDep{"setDCAselectionPtDep", true, "require pt dependent selection"}; + Configurable setDCAselectionPtDep{"setDCAselectionPtDep", true, + "require pt dependent selection"}; Configurable par0{"par0", 0.0105, "par 0"}; Configurable par1{"par1", 0.035, "par 1"}; // Configurables, binning - Configurable nBinsAmpFV0{"nBinsAmpFV0", 1000, "Number of bins FV0 amplitude"}; + Configurable nBinsAmpFV0{"nBinsAmpFV0", 1000, + "Number of bins FV0 amplitude"}; Configurable maxAmpFV0{"maxAmpFV0", 3000, "Max FV0 amplitude"}; - Configurable nBinsAmpFT0{"nBinsAmpFT0", 1000, "Number of bins FT0 amplitude"}; + Configurable nBinsAmpFT0{"nBinsAmpFT0", 1000, + "Number of bins FT0 amplitude"}; Configurable maxAmpFT0{"maxAmpFT0", 3000, "Max FT0 amplitude"}; - Configurable nBinsNchT0{"nBinsNchT0", 1000, "nBinsNchT0"}; - Configurable maxNchFT0{"maxNchFT0", 1000, "Max Nch in the FT0"}; Configurable nBinsNch{"nBinsNch", 2500, "# of bins for midrapidity Nch"}; Configurable maxNch{"maxNch", 2500, "Max Nch at midrapidity"}; Configurable nBinsZDC{"nBinsZDC", 1025, "nBinsZDC"}; @@ -86,17 +98,34 @@ struct UccZdc { Configurable maxZP{"maxZP", 3099.5, "Max ZP signal"}; Configurable maxZEM{"maxZEM", 3099.5, "Max ZEM signal"}; Configurable nBinsTDC{"nBinsTDC", 480, "nbinsTDC"}; + Configurable minTdc{"minTdc", -15.0, "minimum TDC"}; + Configurable maxTdc{"maxTdc", 15.0, "maximum TDC"}; + Configurable minMeanpT{"minMeanpT", 0.5, "minimum [pT]"}; + Configurable maxMeanpT{"maxMeanpT", 1.1, "maximum [pT]"}; + Configurable nBinsMeanpT{"nBinsMeanpT", 160, "# bins [pT]"}; ConfigurableAxis binsPt{"binsPt", {VARIABLE_WIDTH, 0., 0.1, 0.25, 0.5, 1., 2., 4., 6., 8., 10., 20.}, "Binning of the pT axis"}; ConfigurableAxis binsCent{"binsCent", {VARIABLE_WIDTH, 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.}, "T0C centrality binning"}; // Configurable flags ZDC - Configurable isTDCcut{"isTDCcut", false, "Flag for TDC cut"}; + Configurable isTDCcut{"isTDCcut", false, "Use TDC cut?"}; + Configurable isZEMcut{"isZEMcut", true, "Use ZEM cut?"}; + Configurable zemCut{"zemCut", 1000.0, "ZEM cut"}; Configurable tdcCut{"tdcCut", 1.0, "TDC cut"}; Configurable tdcZNmincut{"tdcZNmincut", -4.0, "Min ZN TDC cut"}; Configurable tdcZNmaxcut{"tdcZNmaxcut", -4.0, "Max ZN TDC cut"}; Configurable tdcZPmincut{"tdcZPmincut", -4.0, "Min ZP TDC cut"}; Configurable tdcZPmaxcut{"tdcZPmaxcut", -4.0, "Max ZP TDC cut"}; + // Filters + Filter collFilter = (nabs(aod::collision::posZ) < posZcut); + Filter trackFilter = (requireGlobalTrackInFilter()); + + // Apply Filters + using TheFilteredCollisions = soa::Filtered; + using TheFilteredCollision = TheFilteredCollisions::iterator; + using TheFilteredTracks = soa::Filtered; + // using TheFilteredTrack = TheFilteredTracks::iterator; + // Histograms: Data HistogramRegistry registryData{ "registryData", @@ -116,7 +145,7 @@ struct UccZdc { void init(InitContext const&) { // define axes you want to use - const AxisSpec axisEvent{3, 0., +3.0, ""}; + const AxisSpec axisEvent{10, 0., +10.0, ""}; const AxisSpec axisEta{30, -1.5, +1.5, "#eta"}; const AxisSpec axisPt{binsPt, "#it{p}_{T} (GeV/#it{c})"}; const AxisSpec axisDeltaPt{100, -1.0, +1.0, "#Delta(p_{T})"}; @@ -127,14 +156,35 @@ struct UccZdc { {{{axisEta}, {100, -0.1 * PI, +2.1 * PI}}}); registryData.add("etaHistogram", "etaHistogram", kTH1F, {axisEta}); registryData.add("ptHistogram", "ptHistogram", kTH1F, {axisPt}); + registryData.add("dcaXYvspT", ";DCA_{xy};p_{T};", + {HistType::kTH2F, {{{50, -1., 1.}, {axisPt}}}}); registryData.add("hT0C_cent", ";T0C centrality;Entries", kTH1F, {axisCent}); registryData.add("hEventCounter", "Event counter", kTH1F, {axisEvent}); - registryData.add("NchT0A", "NchT0A; Nch T0A; Entries", - {HistType::kTH1F, {{nBinsNchT0, -0.5, maxNchFT0}}}); - registryData.add("NchT0C", "NchT0C; Nch T0C; Entries", - {HistType::kTH1F, {{nBinsNchT0, -0.5, maxNchFT0}}}); - + registryData.get(HIST("hEventCounter")) + ->GetXaxis() + ->SetBinLabel(1, "total"); + registryData.get(HIST("hEventCounter")) + ->GetXaxis() + ->SetBinLabel(2, "sel8?"); + registryData.get(HIST("hEventCounter")) + ->GetXaxis() + ->SetBinLabel(3, "zdc?"); + registryData.get(HIST("hEventCounter")) + ->GetXaxis() + ->SetBinLabel(4, "t0?"); + registryData.get(HIST("hEventCounter")) + ->GetXaxis() + ->SetBinLabel(5, "v0a?"); + registryData.get(HIST("hEventCounter")) + ->GetXaxis() + ->SetBinLabel(6, "TDC cut"); + registryData.get(HIST("hEventCounter")) + ->GetXaxis() + ->SetBinLabel(7, "zem cut"); + registryData.get(HIST("hEventCounter")) + ->GetXaxis() + ->SetBinLabel(8, "min < t0c < max"); registryData.add("ZNAcomm", "; ZNA common energy; Entries", {HistType::kTH1F, {{nBinsZDC, -0.5, maxZN}}}); registryData.add("ZNCcomm", "; ZNC common energy; Entries", @@ -168,25 +218,28 @@ struct UccZdc { {{{nBinsZDC, -0.5, maxZP}, {nBinsZDC, -0.5, maxZN}}}}); registryData.add("ZNCvstdc", "ZNCvstdc; time ZNC; ZNC", {HistType::kTH2F, - {{{nBinsTDC, -13.5, 11.45}, {nBinsZDC, -0.5, maxZN}}}}); + {{{nBinsTDC, minTdc, maxTdc}, {nBinsZDC, -0.5, maxZN}}}}); registryData.add("ZNAvstdc", "ZNAvstdc; time ZNA; ZNA", {HistType::kTH2F, - {{{nBinsTDC, -13.5, 11.45}, {nBinsZDC, -0.5, maxZN}}}}); + {{{nBinsTDC, minTdc, maxTdc}, {nBinsZDC, -0.5, maxZN}}}}); registryData.add("ZPCvstdc", "ZPCvstdc; time ZPC; ZPC", {HistType::kTH2F, - {{{nBinsTDC, -13.5, 11.45}, {nBinsZDC, -0.5, maxZP}}}}); + {{{nBinsTDC, minTdc, maxTdc}, {nBinsZDC, -0.5, maxZP}}}}); registryData.add("ZPAvstdc", "ZPAvstdc; time ZPA; ZPA", {HistType::kTH2F, - {{{nBinsTDC, -13.5, 11.45}, {nBinsZDC, -0.5, maxZP}}}}); - registryData.add("ZEM1vstdc", "ZEM1vstdc; time ZEM1; ZEM1", - {HistType::kTH2F, - {{{nBinsTDC, -13.5, 11.45}, {nBinsZDC, -0.5, maxZEM}}}}); - registryData.add("ZEM2vstdc", "ZEM2vstdc; time ZEM2; ZEM2", - {HistType::kTH2F, - {{{nBinsTDC, -13.5, 11.45}, {nBinsZDC, -0.5, maxZEM}}}}); - registryData.add("debunch", - "ZN sum vs. ZN diff.; t_{ZNA}-t_{ZNC}; t_{ZNA}+t_{ZNC}", - {HistType::kTH2F, {{{240, -12., 12.}, {240, -12., 12.}}}}); + {{{nBinsTDC, minTdc, maxTdc}, {nBinsZDC, -0.5, maxZP}}}}); + registryData.add( + "ZEM1vstdc", "ZEM1vstdc; time ZEM1; ZEM1", + {HistType::kTH2F, + {{{nBinsTDC, minTdc, maxTdc}, {nBinsZDC, -0.5, maxZEM}}}}); + registryData.add( + "ZEM2vstdc", "ZEM2vstdc; time ZEM2; ZEM2", + {HistType::kTH2F, + {{{nBinsTDC, minTdc, maxTdc}, {nBinsZDC, -0.5, maxZEM}}}}); + registryData.add( + "debunch", "ZN sum vs. ZN diff.; t_{ZDC}-t_{ZDA}; t_{ZDC}+t_{ZDA}", + {HistType::kTH2F, + {{{nBinsTDC, minTdc, maxTdc}, {nBinsTDC, minTdc, maxTdc}}}}); registryData.add( "ZNvsFV0A", "ZNvsFV0A", {HistType::kTH2F, @@ -195,17 +248,27 @@ struct UccZdc { "ZNvsFT0", "FT0", {HistType::kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsZDC, -0.5, maxZN}}}}); - registryData.add("ZNCvsNch", ";Nch (|#eta|<0.8);ZNC", {HistType::kTH2F, {{{nBinsNch, -0.5, maxNch}, {nBinsZDC, -0.5, maxZN}}}}); registryData.add("ZNAvsNch", ";Nch (|#eta|<0.8);ZNA", {HistType::kTH2F, {{{nBinsNch, -0.5, maxNch}, {nBinsZDC, -0.5, maxZN}}}}); + registryData.add("ZNCvsNchvspT", ";Nch (|#eta|<0.8);ZNC;[p_{T}]", + {HistType::kTH3F, + {{{nBinsNch, -0.5, maxNch}, + {nBinsZDC, -0.5, maxZN}, + {nBinsMeanpT, minMeanpT, maxMeanpT}}}}); + registryData.add("ZNAvsNchvspT", ";Nch (|#eta|<0.8);ZNA;[p_{T}]", + {HistType::kTH3F, + {{{nBinsNch, -0.5, maxNch}, + {nBinsZDC, -0.5, maxZN}, + {nBinsMeanpT, minMeanpT, maxMeanpT}}}}); // MC Histograms registrySim.add("hEvent_MC_rec", "Event counter", kTH1F, {axisEvent}); - registrySim.add("hT0C_cent_rec", ";T0C centrality;Entries", kTH1F, {axisCent}); + registrySim.add("hT0C_cent_rec", ";T0C centrality;Entries", kTH1F, + {axisCent}); registrySim.add("Pt_MC_rec_ch", ";p_{T};Entries;", kTH1F, {axisPt}); registrySim.add("Pt_MC_rec_pi", ";p_{T};Entries;", kTH1F, {axisPt}); registrySim.add("Pt_MC_rec_ka", ";p_{T};Entries;", kTH1F, {axisPt}); @@ -247,137 +310,158 @@ struct UccZdc { kTH1F, {axisPt}); } - void processZdcCollAss(ColEvSels const& cols, BCsRun3 const& /*bcs*/, + void processZdcCollAss(TheFilteredCollision const& collision, + o2::aod::BCsRun3 const& /*bcs*/, aod::Zdcs const& /*zdcs*/, aod::FV0As const& /*fv0as*/, - aod::FT0s const& /*ft0s*/, TableTracks const& tracks) + aod::FT0s const& /*ft0s*/, + TheFilteredTracks const& tracks) { - // Collision loop - for (const auto& collision : cols) { - registryData.fill(HIST("hEventCounter"), 0.5); - if (!collision.sel8()) { - return; + registryData.fill(HIST("hEventCounter"), 0.5); + if (!collision.sel8()) { + return; + } + registryData.fill(HIST("hEventCounter"), 1.5); + + const auto& foundBC = collision.foundBC_as(); + // Does the event has ZDC? + if (!foundBC.has_zdc()) { + return; + } + registryData.fill(HIST("hEventCounter"), 2.5); + + auto aZNA = foundBC.zdc().amplitudeZNA(); + auto aZNC = foundBC.zdc().amplitudeZNC(); + auto aZPA = foundBC.zdc().amplitudeZPA(); + auto aZPC = foundBC.zdc().amplitudeZPC(); + auto aZEM1 = foundBC.zdc().amplitudeZEM1(); + auto aZEM2 = foundBC.zdc().amplitudeZEM2(); + auto tZEM1 = foundBC.zdc().timeZEM1(); + auto tZEM2 = foundBC.zdc().timeZEM2(); + auto tZNA = foundBC.zdc().timeZNA(); + auto tZNC = foundBC.zdc().timeZNC(); + auto tZPA = foundBC.zdc().timeZPA(); + auto tZPC = foundBC.zdc().timeZPC(); + double tZDCdif{tZNC + tZPC - tZNA - tZPA}; + double tZDCsum{tZNC + tZPC + tZNA + tZPA}; + float sumZNs{aZNA + aZNC}; + float sumT0s{0.}; + float aT0A{0.}; + float aT0C{0.}; + float aV0A{0.}; + double sumZEMs{0.}; + sumZEMs = aZEM1 + aZEM2; + float nchTPC = collision.multTPC(); + + if (foundBC.has_ft0()) { + for (const auto& amplitude : foundBC.ft0().amplitudeA()) { + aT0A += amplitude; + } + for (const auto& amplitude : foundBC.ft0().amplitudeC()) { + aT0C += amplitude; } + sumT0s = aT0A + aT0C; + registryData.fill(HIST("hEventCounter"), 3.5); + } else { + aT0A = aT0C = -999.; + sumT0s = -999.; + } - registryData.fill(HIST("hEventCounter"), 1.5); + if (foundBC.has_fv0a()) { + for (const auto& amplitude : foundBC.fv0a().amplitude()) { + aV0A += amplitude; + } + registryData.fill(HIST("hEventCounter"), 4.5); + } else { + aV0A = -999.; + } - const auto& foundBC = collision.foundBC_as(); - if (foundBC.has_zdc()) { - registryData.fill(HIST("hEventCounter"), 2.5); - - const auto& zdcread = foundBC.zdc(); - auto aZNA = zdcread.amplitudeZNA(); - auto aZNC = zdcread.amplitudeZNC(); - auto aZPA = zdcread.amplitudeZPA(); - auto aZPC = zdcread.amplitudeZPC(); - auto aZEM1 = zdcread.amplitudeZEM1(); - auto aZEM2 = zdcread.amplitudeZEM2(); - auto tZEM1 = zdcread.timeZEM1(); - auto tZEM2 = zdcread.timeZEM2(); - auto tZNA = zdcread.timeZNA(); - auto tZNC = zdcread.timeZNC(); - auto tZPA = zdcread.timeZPA(); - auto tZPC = zdcread.timeZPC(); - float tZNdif{tZNA - tZNC}; - float tZNsum{tZNA + tZNC}; - float sumZNs{aZNA + aZNC}; - float sumZEMs{aZEM1 + aZEM2}; - float sumT0s{0.}; - float aT0A{0.}; - float aT0C{0.}; - float aV0A{0.}; - float nchT0A{0.}; - float nchT0C{0.}; - float nchTPC = collision.multTPC(); - - if (foundBC.has_ft0()) { - for (const auto& amplitude : foundBC.ft0().amplitudeA()) { - aT0A += amplitude; - } - for (const auto& amplitude : foundBC.ft0().amplitudeC()) { - aT0C += amplitude; - } - sumT0s = aT0A + aT0C; - nchT0A = collision.multZeqFT0A(); - nchT0C = collision.multZeqFT0C(); - } else { - aT0A = aT0C = -999.; - sumT0s = -999.; - } + // TDC cut + if (isTDCcut) { + if (std::sqrt(std::pow(tZDCdif, 2.) + std::pow(tZDCsum, 2.)) > tdcCut) { + return; + } + } + registryData.fill(HIST("hEventCounter"), 5.5); - if (foundBC.has_fv0a()) { - for (const auto& amplitude : foundBC.fv0a().amplitude()) { - aV0A += amplitude; - } - } else { - aV0A = -999.; - } + // ZEM cut + if (isZEMcut) { + if (sumZEMs < zemCut) { + return; + } + } + registryData.fill(HIST("hEventCounter"), 6.5); - if (isTDCcut) { - if (std::sqrt(std::pow(tZNdif, 2.) + std::pow(tZNsum, 2.)) > tdcCut) { - return; - } - } + // T0C centrality cut + if (collision.centFT0C() < minT0CcentCut || + collision.centFT0C() > maxT0CcentCut) { + return; + } - // T0C centrality cut - if (collision.centFT0C() < minT0CcentCut || collision.centFT0C() > maxT0CcentCut) { - continue; - } + registryData.fill(HIST("hEventCounter"), 7.5); + registryData.fill(HIST("hT0C_cent"), collision.centFT0C()); + registryData.get(HIST("ZNA"))->Fill(aZNA); + registryData.get(HIST("ZNC"))->Fill(aZNC); + registryData.get(HIST("ZPA"))->Fill(aZPA); + registryData.get(HIST("ZPC"))->Fill(aZPC); + registryData.get(HIST("ZNAvsZNC"))->Fill(aZNC, aZNA); + registryData.get(HIST("ZNAvsZPA"))->Fill(aZPA, aZNA); + registryData.get(HIST("ZNCvsZPC"))->Fill(aZPC, aZNC); + registryData.get(HIST("ZPAvsZPC"))->Fill(aZPC, aZPA); + registryData.get(HIST("ZNAvsNch"))->Fill(nchTPC, aZNA); + registryData.get(HIST("ZNCvsNch"))->Fill(nchTPC, aZNC); + registryData.get(HIST("ZNvsZEM"))->Fill(sumZEMs, sumZNs); + registryData.get(HIST("ZNvsFV0A"))->Fill(aV0A / 100., sumZNs); + registryData.get(HIST("ZNvsFT0"))->Fill(sumT0s / 100., sumZNs); + registryData.get(HIST("ZNAcomm")) + ->Fill(foundBC.zdc().energyCommonZNA()); + registryData.get(HIST("ZNCcomm")) + ->Fill(foundBC.zdc().energyCommonZNC()); + registryData.get(HIST("ZEM1"))->Fill(aZEM1); + registryData.get(HIST("ZEM2"))->Fill(aZEM2); + registryData.get(HIST("ZNCvstdc"))->Fill(tZNC, aZNC); + registryData.get(HIST("ZNAvstdc"))->Fill(tZNA, aZNA); + registryData.get(HIST("ZPCvstdc"))->Fill(tZPC, aZPC); + registryData.get(HIST("ZPAvstdc"))->Fill(tZPA, aZPA); + registryData.get(HIST("ZEM1vstdc"))->Fill(tZEM1, aZEM1); + registryData.get(HIST("ZEM2vstdc"))->Fill(tZEM2, aZEM2); + registryData.get(HIST("debunch"))->Fill(tZDCdif, tZDCsum); + + float meanpT{0.0}; + const int64_t nch{tracks.size()}; + for (const auto& track : tracks) { + // Track Selection + // if (!track.isGlobalTrack()) { + // continue; + // } + + // if (track.pt() < minPt || track.pt() > maxPt) { + // continue; + // } + // if (!passedTrackSelection(track)) { + // continue; + // } + meanpT += track.pt(); + registryData.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); + registryData.fill(HIST("etaHistogram"), track.eta()); + registryData.fill(HIST("ptHistogram"), track.pt()); + registryData.fill(HIST("dcaXYvspT"), track.dcaXY(), track.pt()); + } - registryData.fill(HIST("hT0C_cent"), collision.centFT0C()); - registryData.get(HIST("ZNA"))->Fill(aZNA); - registryData.get(HIST("ZNC"))->Fill(aZNC); - registryData.get(HIST("ZPA"))->Fill(aZPA); - registryData.get(HIST("ZPC"))->Fill(aZPC); - registryData.get(HIST("ZNAvsZNC"))->Fill(aZNC, aZNA); - registryData.get(HIST("ZNAvsZPA"))->Fill(aZPA, aZNA); - registryData.get(HIST("ZNCvsZPC"))->Fill(aZPC, aZNC); - registryData.get(HIST("ZPAvsZPC"))->Fill(aZPC, aZPA); - registryData.get(HIST("ZNAvsNch"))->Fill(nchTPC, aZNA); - registryData.get(HIST("ZNCvsNch"))->Fill(nchTPC, aZNC); - registryData.get(HIST("ZNvsZEM"))->Fill(sumZEMs, sumZNs); - registryData.get(HIST("ZNvsFV0A"))->Fill(aV0A / 100., sumZNs); - registryData.get(HIST("ZNvsFT0"))->Fill(sumT0s / 100., sumZNs); - registryData.get(HIST("ZNAcomm"))->Fill(zdcread.energyCommonZNA()); - registryData.get(HIST("ZNCcomm"))->Fill(zdcread.energyCommonZNC()); - registryData.get(HIST("ZEM1"))->Fill(aZEM1); - registryData.get(HIST("ZEM2"))->Fill(aZEM2); - registryData.get(HIST("ZNCvstdc"))->Fill(tZNC, aZNC); - registryData.get(HIST("ZNAvstdc"))->Fill(tZNA, aZNA); - registryData.get(HIST("ZPCvstdc"))->Fill(tZPC, aZPC); - registryData.get(HIST("ZPAvstdc"))->Fill(tZPA, aZPA); - registryData.get(HIST("ZEM1vstdc"))->Fill(tZEM1, aZEM1); - registryData.get(HIST("ZEM2vstdc"))->Fill(tZEM2, aZEM2); - registryData.get(HIST("debunch"))->Fill(tZNdif, tZNsum); - registryData.get(HIST("NchT0A"))->Fill(nchT0A); - registryData.get(HIST("NchT0C"))->Fill(nchT0C); - - for (const auto& track : tracks) { - // Track Selection - if (!track.isGlobalTrack()) { - continue; - } - - if (track.pt() < minPt || track.pt() > maxPt) { - continue; - } - // if (!passedTrackSelection(track)) { - // continue; - // } - registryData.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); - registryData.fill(HIST("etaHistogram"), track.eta()); - registryData.fill(HIST("ptHistogram"), track.pt()); - } - } // foundBC.has_zdc() + if (nch > 0) { + meanpT /= nch; } + registryData.get(HIST("ZNCvsNchvspT"))->Fill(nch, aZNC, meanpT); + registryData.get(HIST("ZNAvsNchvspT"))->Fill(nch, aZNA, meanpT); } PROCESS_SWITCH(UccZdc, processZdcCollAss, "Processing ZDC w. collision association", true); Preslice perMCCollision = aod::mcparticle::mcCollisionId; Preslice perCollision = aod::track::collisionId; - void processMC(aod::McCollisions const& mcCollisions, BCsRun3 const& /*bcs*/, - aod::Zdcs const& /*zdcs*/, aod::FT0s const& /*ft0s*/, - aod::FV0As const& /*fv0as*/, SimCollisions const& collisions, + void processMC(aod::McCollisions const& mcCollisions, + o2::aod::BCsRun3 const& /*bcs*/, aod::Zdcs const& /*zdcs*/, + aod::FT0s const& /*ft0s*/, aod::FV0As const& /*fv0as*/, + SimCollisions const& collisions, aod::McParticles const& mcParticles, SimTracks const& simTracks) { @@ -402,15 +486,22 @@ struct UccZdc { continue; } registrySim.fill(HIST("Pt_MC_tru_ch"), particle.pt()); - if (particle.pdgCode() == PDG_t::kPiPlus || particle.pdgCode() == PDG_t::kPiMinus) { // pion + if (particle.pdgCode() == PDG_t::kPiPlus || + particle.pdgCode() == PDG_t::kPiMinus) { // pion registrySim.fill(HIST("Pt_MC_tru_pi"), particle.pt()); - } else if (particle.pdgCode() == PDG_t::kKPlus || particle.pdgCode() == PDG_t::kKMinus) { // kaon + } else if (particle.pdgCode() == PDG_t::kKPlus || + particle.pdgCode() == PDG_t::kKMinus) { // kaon registrySim.fill(HIST("Pt_MC_tru_ka"), particle.pt()); - } else if (particle.pdgCode() == PDG_t::kProton || particle.pdgCode() == PDG_t::kProtonBar) { // proton + } else if (particle.pdgCode() == PDG_t::kProton || + particle.pdgCode() == PDG_t::kProtonBar) { // proton registrySim.fill(HIST("Pt_MC_tru_pr"), particle.pt()); - } else if (particle.pdgCode() == PDG_t::kSigmaPlus || particle.pdgCode() == PDG_t::kSigmaBarMinus) { // positive sigma + } else if (particle.pdgCode() == PDG_t::kSigmaPlus || + particle.pdgCode() == + PDG_t::kSigmaBarMinus) { // positive sigma registrySim.fill(HIST("Pt_MC_tru_sigpos"), particle.pt()); - } else if (particle.pdgCode() == PDG_t::kSigmaMinus || particle.pdgCode() == PDG_t::kSigmaBarPlus) { // negative sigma + } else if (particle.pdgCode() == PDG_t::kSigmaMinus || + particle.pdgCode() == + PDG_t::kSigmaBarPlus) { // negative sigma registrySim.fill(HIST("Pt_MC_tru_signeg"), particle.pt()); } else { // rest registrySim.fill(HIST("Pt_MC_tru_re"), particle.pt()); @@ -441,14 +532,15 @@ struct UccZdc { } // T0C centrality cut - if (collision.centFT0C() < minT0CcentCut || collision.centFT0C() > maxT0CcentCut) { + if (collision.centFT0C() < minT0CcentCut || + collision.centFT0C() > maxT0CcentCut) { continue; } registrySim.fill(HIST("hEvent_MC_rec"), 2.5); registrySim.fill(HIST("hZpos_MC_rec"), collision.posZ()); - const auto& foundBC = collision.foundBC_as(); + const auto& foundBC = collision.foundBC_as(); if (foundBC.has_zdc()) { return; } @@ -501,15 +593,20 @@ struct UccZdc { const auto particle = track.mcParticle(); registrySim.fill(HIST("Pt_MC_rec_ch"), track.pt()); - if (particle.pdgCode() == PDG_t::kPiPlus || particle.pdgCode() == PDG_t::kPiMinus) { + if (particle.pdgCode() == PDG_t::kPiPlus || + particle.pdgCode() == PDG_t::kPiMinus) { registrySim.fill(HIST("Pt_MC_rec_pi"), track.pt()); - } else if (particle.pdgCode() == PDG_t::kKPlus || particle.pdgCode() == PDG_t::kKMinus) { + } else if (particle.pdgCode() == PDG_t::kKPlus || + particle.pdgCode() == PDG_t::kKMinus) { registrySim.fill(HIST("Pt_MC_rec_ka"), track.pt()); - } else if (particle.pdgCode() == PDG_t::kProton || particle.pdgCode() == PDG_t::kProtonBar) { + } else if (particle.pdgCode() == PDG_t::kProton || + particle.pdgCode() == PDG_t::kProtonBar) { registrySim.fill(HIST("Pt_MC_rec_pr"), track.pt()); - } else if (particle.pdgCode() == PDG_t::kSigmaPlus || particle.pdgCode() == PDG_t::kSigmaBarMinus) { + } else if (particle.pdgCode() == PDG_t::kSigmaPlus || + particle.pdgCode() == PDG_t::kSigmaBarMinus) { registrySim.fill(HIST("Pt_MC_rec_sigpos"), track.pt()); - } else if (particle.pdgCode() == PDG_t::kSigmaMinus || particle.pdgCode() == PDG_t::kSigmaBarPlus) { + } else if (particle.pdgCode() == PDG_t::kSigmaMinus || + particle.pdgCode() == PDG_t::kSigmaBarPlus) { registrySim.fill(HIST("Pt_MC_rec_signeg"), track.pt()); } else { registrySim.fill(HIST("Pt_MC_rec_re"), track.pt()); From bc6289173ab5306edf0999c05856d61706b887f9 Mon Sep 17 00:00:00 2001 From: Fabrizio Date: Thu, 6 Feb 2025 22:18:24 +0100 Subject: [PATCH 0083/1650] [PWGHF,Trigger] Add option to select only signal in MC and improve MC matching (#9801) --- .../PWGHF/HFFilterPrepareMLSamples.cxx | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/EventFiltering/PWGHF/HFFilterPrepareMLSamples.cxx b/EventFiltering/PWGHF/HFFilterPrepareMLSamples.cxx index 5e62416a75d..f85a7c215d7 100644 --- a/EventFiltering/PWGHF/HFFilterPrepareMLSamples.cxx +++ b/EventFiltering/PWGHF/HFFilterPrepareMLSamples.cxx @@ -55,7 +55,7 @@ struct HfFilterPrepareMlSamples { // Main struct Produces train3P; // parameters for production of training samples - Configurable fillSignal{"fillSignal", true, "Flag to fill derived tables with signal for ML trainings"}; + Configurable fillOnlySignal{"fillOnlySignal", true, "Flag to fill derived tables with signal for ML trainings"}; Configurable fillOnlyBackground{"fillOnlyBackground", true, "Flag to fill derived tables with background for ML trainings"}; Configurable downSampleBkgFactor{"downSampleBkgFactor", 1., "Fraction of background candidates to keep for ML trainings"}; Configurable massSbLeftMin{"massSbLeftMin", 1.72, "Left Sideband Lower Minv limit 2 Prong"}; @@ -78,6 +78,10 @@ struct HfFilterPrepareMlSamples { // Main struct void init(InitContext&) { + if (fillOnlySignal && fillOnlyBackground) { + LOGP(fatal, "fillOnlySignal and fillOnlyBackground cannot be activated simultaneously, exit"); + } + ccdb->setURL(url.value); ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); @@ -268,7 +272,15 @@ struct HfFilterPrepareMlSamples { // Main struct // D0(bar) → π± K∓ bool isInCorrectColl{false}; - auto indexRec = RecoDecay::getMatchedMCRec(mcParticles, std::array{trackPos, trackNeg}, o2::constants::physics::Pdg::kD0, std::array{+kPiPlus, -kKPlus}, true, &sign); + auto indexRec = RecoDecay::getMatchedMCRec(mcParticles, std::array{trackPos, trackNeg}, o2::constants::physics::Pdg::kD0, std::array{+kPiPlus, -kKPlus}, true, &sign); + + if (fillOnlySignal && indexRec < 0) { + continue; + } + if (fillOnlyBackground && indexRec >= 0) { + continue; + } + if (indexRec > -1) { auto particle = mcParticles.rawIteratorAt(indexRec); flag = RecoDecay::getCharmHadronOrigin(mcParticles, particle); @@ -355,32 +367,39 @@ struct HfFilterPrepareMlSamples { // Main struct int8_t channel = -1; // D± → π± K∓ π± - auto indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, o2::constants::physics::Pdg::kDPlus, std::array{+kPiPlus, -kKPlus, +kPiPlus}, true, &sign, 2); + auto indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, o2::constants::physics::Pdg::kDPlus, std::array{+kPiPlus, -kKPlus, +kPiPlus}, true, &sign, 2); if (indexRec >= 0) { channel = kDplus; } if (indexRec < 0) { // Ds± → K± K∓ π± - indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, o2::constants::physics::Pdg::kDS, std::array{+kKPlus, -kKPlus, +kPiPlus}, true, &sign, 2); + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, o2::constants::physics::Pdg::kDS, std::array{+kKPlus, -kKPlus, +kPiPlus}, true, &sign, 2); if (indexRec >= 0) { channel = kDs; } } if (indexRec < 0) { // Λc± → p± K∓ π± - indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, o2::constants::physics::Pdg::kLambdaCPlus, std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2); + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, o2::constants::physics::Pdg::kLambdaCPlus, std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2); if (indexRec >= 0) { channel = kLc; } } if (indexRec < 0) { // Ξc± → p± K∓ π± - indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, o2::constants::physics::Pdg::kXiCPlus, std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2); + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, o2::constants::physics::Pdg::kXiCPlus, std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2); if (indexRec >= 0) { channel = kXic; } } + if (fillOnlySignal && indexRec < 0) { + continue; + } + if (fillOnlyBackground && indexRec >= 0) { + continue; + } + bool isInCorrectColl{false}; if (indexRec > -1) { auto particle = mcParticles.rawIteratorAt(indexRec); From 38e81366f54e277fa44f2d0ab8b9e416f47e214e Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Thu, 6 Feb 2025 23:13:01 +0100 Subject: [PATCH 0084/1650] [PWGLF] Store centrality for non-reconstructed candidates (#9802) --- PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx b/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx index 6d8e13e69a6..bb7bfc984d3 100644 --- a/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx +++ b/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx @@ -207,6 +207,7 @@ struct lnnRecoTask { std::vector filledMothers; // vector to keep track of the collisions passing the event selection in the MC std::vector isGoodCollision; + std::vector collisionFT0Ccent; // vector to armazenade h3Track Preslice perCollision = o2::aod::v0::collisionId; @@ -623,6 +624,8 @@ struct lnnRecoTask { isGoodCollision.clear(); isGoodCollision.resize(mcCollisions.size(), false); + collisionFT0Ccent.clear(); + collisionFT0Ccent.resize(mcCollisions.size(), -1.f); for (const auto& collision : collisions) { lnnCandidates.clear(); @@ -643,6 +646,7 @@ struct lnnRecoTask { if (collision.has_mcCollision()) { isGoodCollision[collision.mcCollisionId()] = true; + collisionFT0Ccent[collision.mcCollisionId()] = collision.centFT0C(); } const uint64_t collIdx = collision.globalIndex(); @@ -727,7 +731,7 @@ struct lnnRecoTask { lnnCand.posTrackID = -1; lnnCand.negTrackID = -1; lnnCand.isSignal = true; - outputMCTable(-1, -1, -1, + outputMCTable(-1, collisionFT0Ccent[mcPart.mcCollisionId()], -1, -1, -1, -1, 0, -1, -1, -1, From 4d9491ab2e5132a7216afffafd89119bb8689969 Mon Sep 17 00:00:00 2001 From: nzardosh Date: Thu, 6 Feb 2025 23:42:52 +0100 Subject: [PATCH 0085/1650] [PWGJE] refactoring the derived data writer (#9693) --- PWGJE/Core/JetCandidateUtilities.h | 24 +- PWGJE/Core/JetDQUtilities.h | 12 +- PWGJE/Core/JetHFUtilities.h | 12 +- PWGJE/DataModel/JetReducedDataSelector.h | 39 + PWGJE/TableProducer/CMakeLists.txt | 29 +- .../derivedDataProducerDummy.cxx | 82 -- .../derivedDataProducerDummyBplus.cxx | 69 - .../derivedDataProducerDummyCharged.cxx | 84 -- .../derivedDataProducerDummyD0.cxx | 71 - .../derivedDataProducerDummyDielectron.cxx | 79 -- .../derivedDataProducerDummyLc.cxx | 71 - PWGJE/TableProducer/derivedDataSelector.cxx | 331 +++++ PWGJE/TableProducer/derivedDataWriter.cxx | 1250 +++++------------ PWGJE/Tasks/jetSubstructureHFOutput.cxx | 17 +- PWGJE/Tasks/jetSubstructureOutput.cxx | 5 + 15 files changed, 759 insertions(+), 1416 deletions(-) create mode 100644 PWGJE/DataModel/JetReducedDataSelector.h delete mode 100644 PWGJE/TableProducer/derivedDataProducerDummy.cxx delete mode 100644 PWGJE/TableProducer/derivedDataProducerDummyBplus.cxx delete mode 100644 PWGJE/TableProducer/derivedDataProducerDummyCharged.cxx delete mode 100644 PWGJE/TableProducer/derivedDataProducerDummyD0.cxx delete mode 100644 PWGJE/TableProducer/derivedDataProducerDummyDielectron.cxx delete mode 100644 PWGJE/TableProducer/derivedDataProducerDummyLc.cxx create mode 100644 PWGJE/TableProducer/derivedDataSelector.cxx diff --git a/PWGJE/Core/JetCandidateUtilities.h b/PWGJE/Core/JetCandidateUtilities.h index 6c5c0328ef5..8b31b11634e 100644 --- a/PWGJE/Core/JetCandidateUtilities.h +++ b/PWGJE/Core/JetCandidateUtilities.h @@ -373,42 +373,42 @@ float getCandidateInvariantMass(T const& candidate) } template -void fillCandidateCollisionTable(T const& collision, U const& /*candidates*/, V& CandiateCollisionTable, int32_t& CandidateCollisionTableIndex) +void fillCandidateCollisionTable(T const& collision, U const& /*candidates*/, V& CandiateCollisionTable) { if constexpr (jethfutilities::isHFTable()) { - jethfutilities::fillHFCollisionTable(collision, CandiateCollisionTable, CandidateCollisionTableIndex); + jethfutilities::fillHFCollisionTable(collision, CandiateCollisionTable); } else if constexpr (jetdqutilities::isDielectronTable()) { - jetdqutilities::fillDielectronCollisionTable(collision, CandiateCollisionTable, CandidateCollisionTableIndex); // if more dilepton tables are added we would need a fillDQCollisionTable + jetdqutilities::fillDielectronCollisionTable(collision, CandiateCollisionTable); // if more dilepton tables are added we would need a fillDQCollisionTable } } template -void fillCandidateMcCollisionTable(T const& mcCollision, U const& /*candidates*/, V& CandiateMcCollisionTable, int32_t& CandidateMcCollisionTableIndex) +void fillCandidateMcCollisionTable(T const& mcCollision, U const& /*candidates*/, V& CandiateMcCollisionTable) { if constexpr (jethfutilities::isHFMcTable()) { - jethfutilities::fillHFMcCollisionTable(mcCollision, CandiateMcCollisionTable, CandidateMcCollisionTableIndex); + jethfutilities::fillHFMcCollisionTable(mcCollision, CandiateMcCollisionTable); } else if constexpr (jetdqutilities::isDielectronMcTable()) { - jetdqutilities::fillDielectronMcCollisionTable(mcCollision, CandiateMcCollisionTable, CandidateMcCollisionTableIndex); + jetdqutilities::fillDielectronMcCollisionTable(mcCollision, CandiateMcCollisionTable); } } template -void fillCandidateTable(T const& candidate, int32_t collisionIndex, U& BaseTable, V& HFParTable, M& HFParETable, N& HFParDaughterTable, O& HFSelectionFlagTable, P& HFMlTable, Q& HFMlDaughterTable, S& HFMCDTable, int32_t& candidateTableIndex) +void fillCandidateTable(T const& candidate, int32_t collisionIndex, U& BaseTable, V& HFParTable, M& HFParETable, N& HFParDaughterTable, O& HFSelectionFlagTable, P& HFMlTable, Q& HFMlDaughterTable, S& HFMCDTable) { if constexpr (jethfutilities::isHFCandidate()) { - jethfutilities::fillHFCandidateTable(candidate, collisionIndex, BaseTable, HFParTable, HFParETable, HFParDaughterTable, HFSelectionFlagTable, HFMlTable, HFMlDaughterTable, HFMCDTable, candidateTableIndex); + jethfutilities::fillHFCandidateTable(candidate, collisionIndex, BaseTable, HFParTable, HFParETable, HFParDaughterTable, HFSelectionFlagTable, HFMlTable, HFMlDaughterTable, HFMCDTable); } else if constexpr (jetdqutilities::isDielectronCandidate()) { - jetdqutilities::fillDielectronCandidateTable(candidate, collisionIndex, BaseTable, candidateTableIndex); + jetdqutilities::fillDielectronCandidateTable(candidate, collisionIndex, BaseTable); } } template -void fillCandidateMcTable(T const& candidate, int32_t mcCollisionIndex, U& BaseMcTable, int32_t& candidateTableIndex) +void fillCandidateMcTable(T const& candidate, int32_t mcCollisionIndex, U& BaseMcTable) { if constexpr (jethfutilities::isHFMcCandidate()) { - jethfutilities::fillHFCandidateMcTable(candidate, mcCollisionIndex, BaseMcTable, candidateTableIndex); + jethfutilities::fillHFCandidateMcTable(candidate, mcCollisionIndex, BaseMcTable); } else if constexpr (jetdqutilities::isDielectronMcCandidate()) { - jetdqutilities::fillDielectronCandidateMcTable(candidate, mcCollisionIndex, BaseMcTable, candidateTableIndex); + jetdqutilities::fillDielectronCandidateMcTable(candidate, mcCollisionIndex, BaseMcTable); } } diff --git a/PWGJE/Core/JetDQUtilities.h b/PWGJE/Core/JetDQUtilities.h index 91b4c3cdd30..cc26582ca53 100644 --- a/PWGJE/Core/JetDQUtilities.h +++ b/PWGJE/Core/JetDQUtilities.h @@ -312,31 +312,27 @@ uint8_t setDielectronParticleDecayBit(T const& particles, U const& particle) } template -void fillDielectronCollisionTable(T const& collision, U& DielectronCollisionTable, int32_t& DielectronCollisionTableIndex) +void fillDielectronCollisionTable(T const& collision, U& DielectronCollisionTable) { DielectronCollisionTable(collision.tag_raw(), collision.runNumber(), collision.posX(), collision.posY(), collision.posZ(), collision.numContrib(), collision.collisionTime(), collision.collisionTimeRes()); - DielectronCollisionTableIndex = DielectronCollisionTable.lastIndex(); } template -void fillDielectronMcCollisionTable(T const& mcCollision, U& DielectronMcCollisionTable, int32_t& DielectronMcCollisionTableIndex) +void fillDielectronMcCollisionTable(T const& mcCollision, U& DielectronMcCollisionTable) { DielectronMcCollisionTable(mcCollision.posX(), mcCollision.posY(), mcCollision.posZ()); - DielectronMcCollisionTableIndex = DielectronMcCollisionTable.lastIndex(); } template -void fillDielectronCandidateTable(T const& candidate, int32_t collisionIndex, U& DielectronTable, int32_t& DielectronCandidateTableIndex) +void fillDielectronCandidateTable(T const& candidate, int32_t collisionIndex, U& DielectronTable) { DielectronTable(collisionIndex, candidate.mass(), candidate.pt(), candidate.eta(), candidate.phi(), candidate.sign(), candidate.filterMap_raw(), candidate.mcDecision()); - DielectronCandidateTableIndex = DielectronTable.lastIndex(); } template -void fillDielectronCandidateMcTable(T const& candidate, int32_t mcCollisionIndex, U& DielectronMcTable, int32_t& DielectronCandidateTableIndex) +void fillDielectronCandidateMcTable(T const& candidate, int32_t mcCollisionIndex, U& DielectronMcTable) { DielectronMcTable(mcCollisionIndex, candidate.pt(), candidate.eta(), candidate.phi(), candidate.y(), candidate.e(), candidate.m(), candidate.pdgCode(), candidate.getGenStatusCode(), candidate.getHepMCStatusCode(), candidate.isPhysicalPrimary(), candidate.decayFlag(), candidate.origin()); - DielectronCandidateTableIndex = DielectronMcTable.lastIndex(); } }; // namespace jetdqutilities diff --git a/PWGJE/Core/JetHFUtilities.h b/PWGJE/Core/JetHFUtilities.h index 1334d8ad6f6..b281da526c0 100644 --- a/PWGJE/Core/JetHFUtilities.h +++ b/PWGJE/Core/JetHFUtilities.h @@ -481,17 +481,15 @@ float getHFCandidateInvariantMass(T const& candidate) } template -void fillHFCollisionTable(T const& collision, U& HFCollisionTable, int32_t& HFCollisionTableIndex) +void fillHFCollisionTable(T const& collision, U& HFCollisionTable) { HFCollisionTable(collision.posX(), collision.posY(), collision.posZ(), collision.numContrib(), collision.centFT0A(), collision.centFT0C(), collision.centFT0M(), collision.centFV0A(), collision.multZeqNTracksPV()); - HFCollisionTableIndex = HFCollisionTable.lastIndex(); } template -void fillHFMcCollisionTable(T const& mcCollision, U& HFMcCollisionTable, int32_t& HFMcCollisionTableIndex) +void fillHFMcCollisionTable(T const& mcCollision, U& HFMcCollisionTable) { HFMcCollisionTable(mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), mcCollision.centFT0M()); - HFMcCollisionTableIndex = HFMcCollisionTable.lastIndex(); } template @@ -706,10 +704,9 @@ void fillBplusCandidateTable(T const& candidate, U& BplusParTable, V& BplusParET } template -void fillHFCandidateTable(T const& candidate, int32_t collisionIndex, U& HFBaseTable, V& HFParTable, M& HFParETable, N& HFParDaughterTable, O& HFSelectionFlagTable, P& HFMlTable, Q& HFMlDaughterTable, S& HFMCDTable, int32_t& HFCandidateTableIndex) +void fillHFCandidateTable(T const& candidate, int32_t collisionIndex, U& HFBaseTable, V& HFParTable, M& HFParETable, N& HFParDaughterTable, O& HFSelectionFlagTable, P& HFMlTable, Q& HFMlDaughterTable, S& HFMCDTable) { HFBaseTable(collisionIndex, candidate.pt(), candidate.eta(), candidate.phi(), candidate.m(), candidate.y()); - HFCandidateTableIndex = HFBaseTable.lastIndex(); HFSelectionFlagTable(candidate.candidateSelFlag()); if constexpr (isD0Candidate()) { @@ -724,10 +721,9 @@ void fillHFCandidateTable(T const& candidate, int32_t collisionIndex, U& HFBaseT } template -void fillHFCandidateMcTable(T const& candidate, int32_t mcCollisionIndex, U& BaseMcTable, int32_t& candidateTableIndex) +void fillHFCandidateMcTable(T const& candidate, int32_t mcCollisionIndex, U& BaseMcTable) { BaseMcTable(mcCollisionIndex, candidate.pt(), candidate.eta(), candidate.phi(), candidate.y(), candidate.flagMcMatchGen(), candidate.originMcGen()); - candidateTableIndex = BaseMcTable.lastIndex(); } }; // namespace jethfutilities diff --git a/PWGJE/DataModel/JetReducedDataSelector.h b/PWGJE/DataModel/JetReducedDataSelector.h new file mode 100644 index 00000000000..4e6b07a955b --- /dev/null +++ b/PWGJE/DataModel/JetReducedDataSelector.h @@ -0,0 +1,39 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// +/// \brief Table definitions for selectors for writing out reduced data model for jets +/// +/// \author Nima Zardoshti + +#ifndef PWGJE_DATAMODEL_JETREDUCEDDATASELECTOR_H_ +#define PWGJE_DATAMODEL_JETREDUCEDDATASELECTOR_H_ + +#include +#include +#include "Framework/AnalysisDataModel.h" + +namespace o2::aod +{ +namespace jetreduceddataselector +{ +DECLARE_SOA_COLUMN(IsCollisionSelected, isCollisionSelected, bool); +DECLARE_SOA_COLUMN(IsMcCollisionSelected, isMcCollisionSelected, bool); + +} // namespace jetreduceddataselector +DECLARE_SOA_TABLE(JCollisionSelections, "AOD", "JCOLLSELECTION", + jetreduceddataselector::IsCollisionSelected); + +DECLARE_SOA_TABLE(JMcCollisionSelections, "AOD", "JMCCOLLSELECTION", + jetreduceddataselector::IsMcCollisionSelected); +} // namespace o2::aod + +#endif // PWGJE_DATAMODEL_JETREDUCEDDATASELECTOR_H_ diff --git a/PWGJE/TableProducer/CMakeLists.txt b/PWGJE/TableProducer/CMakeLists.txt index c946a8722e5..85083da0801 100644 --- a/PWGJE/TableProducer/CMakeLists.txt +++ b/PWGJE/TableProducer/CMakeLists.txt @@ -23,33 +23,8 @@ o2physics_add_dpl_workflow(jet-deriveddata-trigger-producer PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(jet-deriveddata-producer-dummy - SOURCES derivedDataProducerDummy.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore - COMPONENT_NAME Analysis) - -o2physics_add_dpl_workflow(jet-deriveddata-producer-dummy-charged - SOURCES derivedDataProducerDummyCharged.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore - COMPONENT_NAME Analysis) - -o2physics_add_dpl_workflow(jet-deriveddata-producer-dummy-d0 - SOURCES derivedDataProducerDummyD0.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore - COMPONENT_NAME Analysis) - -o2physics_add_dpl_workflow(jet-deriveddata-producer-dummy-lc - SOURCES derivedDataProducerDummyLc.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore - COMPONENT_NAME Analysis) - -o2physics_add_dpl_workflow(jet-deriveddata-producer-dummy-bplus - SOURCES derivedDataProducerDummyBplus.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore - COMPONENT_NAME Analysis) - -o2physics_add_dpl_workflow(jet-deriveddata-producer-dummy-dielectron - SOURCES derivedDataProducerDummyDielectron.cxx +o2physics_add_dpl_workflow(jet-deriveddata-selector + SOURCES derivedDataSelector.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore COMPONENT_NAME Analysis) diff --git a/PWGJE/TableProducer/derivedDataProducerDummy.cxx b/PWGJE/TableProducer/derivedDataProducerDummy.cxx deleted file mode 100644 index c5a68c7c6b8..00000000000 --- a/PWGJE/TableProducer/derivedDataProducerDummy.cxx +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. - -// temporary task to produce HF and DQ tables needed when making inclusive derived data - should become obsolete when tables are able to be prouduced based on a configurable -// -/// \author Nima Zardoshti - -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoA.h" -#include "Framework/runDataProcessing.h" -#include "PWGJE/DataModel/JetReducedData.h" -#include "PWGHF/DataModel/DerivedTables.h" -#include "PWGDQ/DataModel/ReducedInfoTables.h" - -using namespace o2; -using namespace o2::framework; -using namespace o2::framework::expressions; - -struct JetDerivedDataProducerDummyTask { - - Produces d0CollisionsTable; - Produces d0CollisionsMatchingTable; - Produces d0sTable; - Produces d0ParsTable; - Produces d0ParExtrasTable; - Produces d0SelsTable; - Produces d0MlsTable; - Produces d0McsTable; - Produces d0McCollisionsTable; - Produces d0ParticlesTable; - - Produces lcCollisionsTable; - Produces lcCollisionsMatchingTable; - Produces lcsTable; - Produces lcParsTable; - Produces lcParExtrasTable; - Produces lcSelsTable; - Produces lcMlsTable; - Produces lcMcsTable; - Produces lcMcCollisionsTable; - Produces lcParticlesTable; - - Produces bplusCollisionsTable; - Produces bplusCollisionsMatchingTable; - Produces bplussTable; - Produces bplusParsTable; - Produces bplusParExtrasTable; - Produces bplusParD0sTable; - Produces bplusSelsTable; - Produces bplusMlsTable; - Produces bplusMlD0sTable; - Produces bplusMcsTable; - Produces bplusMcCollisionsTable; - Produces bplusParticlesTable; - - Produces dielectronCollisionsTable; - Produces dielectronTable; - - void init(InitContext const&) - { - } - - void processDummy(aod::JDummys const&) - { - } - PROCESS_SWITCH(JetDerivedDataProducerDummyTask, processDummy, "leaves all tables empty", true); -}; - -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"jet-deriveddata-producer-dummy"})}; -} diff --git a/PWGJE/TableProducer/derivedDataProducerDummyBplus.cxx b/PWGJE/TableProducer/derivedDataProducerDummyBplus.cxx deleted file mode 100644 index 8f3e238710a..00000000000 --- a/PWGJE/TableProducer/derivedDataProducerDummyBplus.cxx +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. - -// temporary task to produce HF and DQ tables needed when making B+ jet derived data - should become obsolete when tables are able to be prouduced based on a configurable -// -/// \author Nima Zardoshti - -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoA.h" -#include "Framework/runDataProcessing.h" -#include "PWGJE/DataModel/JetReducedData.h" -#include "PWGHF/DataModel/DerivedTables.h" -#include "PWGDQ/DataModel/ReducedInfoTables.h" - -using namespace o2; -using namespace o2::framework; -using namespace o2::framework::expressions; - -struct JetDerivedDataProducerDummyTask { - - Produces d0CollisionsTable; - Produces d0CollisionsMatchingTable; - Produces d0sTable; - Produces d0ParsTable; - Produces d0ParExtrasTable; - Produces d0SelsTable; - Produces d0MlsTable; - Produces d0McsTable; - Produces d0McCollisionsTable; - Produces d0ParticlesTable; - - Produces lcCollisionsTable; - Produces lcCollisionsMatchingTable; - Produces lcsTable; - Produces lcParsTable; - Produces lcParExtrasTable; - Produces lcSelsTable; - Produces lcMlsTable; - Produces lcMcsTable; - Produces lcMcCollisionsTable; - Produces lcParticlesTable; - - Produces dielectronCollisionsTable; - Produces dielectronTable; - - void init(InitContext const&) - { - } - - void processDummy(aod::JDummys const&) - { - } - PROCESS_SWITCH(JetDerivedDataProducerDummyTask, processDummy, "leaves all tables empty", true); -}; - -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"jet-deriveddata-producer-dummy"})}; -} diff --git a/PWGJE/TableProducer/derivedDataProducerDummyCharged.cxx b/PWGJE/TableProducer/derivedDataProducerDummyCharged.cxx deleted file mode 100644 index 28cfa369b73..00000000000 --- a/PWGJE/TableProducer/derivedDataProducerDummyCharged.cxx +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. - -// temporary task to produce HF, DQ and EMCal tables needed when making inclusive derived data - should become obsolete when tables are able to be prouduced based on a configurable -// -/// \author Nima Zardoshti - -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoA.h" -#include "Framework/runDataProcessing.h" -#include "PWGJE/DataModel/JetReducedData.h" -#include "PWGHF/DataModel/DerivedTables.h" -#include "PWGDQ/DataModel/ReducedInfoTables.h" - -using namespace o2; -using namespace o2::framework; -using namespace o2::framework::expressions; - -struct JetDerivedDataProducerDummyChargedTask { - - Produces d0CollisionsTable; - Produces d0CollisionsMatchingTable; - Produces d0sTable; - Produces d0ParsTable; - Produces d0ParExtrasTable; - Produces d0SelsTable; - Produces d0MlsTable; - Produces d0McsTable; - Produces d0McCollisionsTable; - Produces d0ParticlesTable; - - Produces lcCollisionsTable; - Produces lcCollisionsMatchingTable; - Produces lcsTable; - Produces lcParsTable; - Produces lcParExtrasTable; - Produces lcSelsTable; - Produces lcMlsTable; - Produces lcMcsTable; - Produces lcMcCollisionsTable; - Produces lcParticlesTable; - - Produces bplusCollisionsTable; - Produces bplusCollisionsMatchingTable; - Produces bplussTable; - Produces bplusParsTable; - Produces bplusParExtrasTable; - Produces bplusParD0sTable; - Produces bplusSelsTable; - Produces bplusMlsTable; - Produces bplusMlD0sTable; - Produces bplusMcsTable; - Produces bplusMcCollisionsTable; - Produces bplusParticlesTable; - - Produces dielectronCollisionsTable; - Produces dielectronTable; - - Produces jClustersCorrectedEnergiesTable; - - void init(InitContext const&) - { - } - - void processDummy(aod::JDummys const&) - { - } - PROCESS_SWITCH(JetDerivedDataProducerDummyChargedTask, processDummy, "leaves all tables empty", true); -}; - -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"jet-deriveddata-producer-dummy-charged"})}; -} diff --git a/PWGJE/TableProducer/derivedDataProducerDummyD0.cxx b/PWGJE/TableProducer/derivedDataProducerDummyD0.cxx deleted file mode 100644 index 4cbbfdeedea..00000000000 --- a/PWGJE/TableProducer/derivedDataProducerDummyD0.cxx +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. - -// temporary task to produce HF and DQ tables needed when making D0 jet derived data - should become obsolete when tables are able to be prouduced based on a configurable -// -/// \author Nima Zardoshti - -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoA.h" -#include "Framework/runDataProcessing.h" -#include "PWGJE/DataModel/JetReducedData.h" -#include "PWGHF/DataModel/DerivedTables.h" -#include "PWGDQ/DataModel/ReducedInfoTables.h" - -using namespace o2; -using namespace o2::framework; -using namespace o2::framework::expressions; - -struct JetDerivedDataProducerDummyD0Task { - - Produces lcCollisionsTable; - Produces lcCollisionsMatchingTable; - Produces lcsTable; - Produces lcParsTable; - Produces lcParExtrasTable; - Produces lcSelsTable; - Produces lcMlsTable; - Produces lcMcsTable; - Produces lcMcCollisionsTable; - Produces lcParticlesTable; - - Produces bplusCollisionsTable; - Produces bplusCollisionsMatchingTable; - Produces bplussTable; - Produces bplusParsTable; - Produces bplusParExtrasTable; - Produces bplusParD0sTable; - Produces bplusSelsTable; - Produces bplusMlsTable; - Produces bplusMlD0sTable; - Produces bplusMcsTable; - Produces bplusMcCollisionsTable; - Produces bplusParticlesTable; - - Produces dielectronCollisionsTable; - Produces dielectronTable; - - void init(InitContext const&) - { - } - - void processDummy(aod::JDummys const&) - { - } - PROCESS_SWITCH(JetDerivedDataProducerDummyD0Task, processDummy, "leaves all tables empty", true); -}; - -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"jet-deriveddata-producer-dummy-d0"})}; -} diff --git a/PWGJE/TableProducer/derivedDataProducerDummyDielectron.cxx b/PWGJE/TableProducer/derivedDataProducerDummyDielectron.cxx deleted file mode 100644 index c24cf13bd41..00000000000 --- a/PWGJE/TableProducer/derivedDataProducerDummyDielectron.cxx +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. - -// temporary task to produce HF tables needed when making dielectron jet derived data - should become obsolete when tables are able to be prouduced based on a configurable -// -/// \author Nima Zardoshti - -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoA.h" -#include "Framework/runDataProcessing.h" -#include "PWGJE/DataModel/JetReducedData.h" -#include "PWGHF/DataModel/DerivedTables.h" -#include "PWGDQ/DataModel/ReducedInfoTables.h" - -using namespace o2; -using namespace o2::framework; -using namespace o2::framework::expressions; - -struct JetDerivedDataProducerDummyDielectronTask { - - Produces d0CollisionsTable; - Produces d0CollisionsMatchingTable; - Produces d0sTable; - Produces d0ParsTable; - Produces d0ParExtrasTable; - Produces d0SelsTable; - Produces d0MlsTable; - Produces d0McsTable; - Produces d0McCollisionsTable; - Produces d0ParticlesTable; - - Produces lcCollisionsTable; - Produces lcCollisionsMatchingTable; - Produces lcsTable; - Produces lcParsTable; - Produces lcParExtrasTable; - Produces lcSelsTable; - Produces lcMlsTable; - Produces lcMcsTable; - Produces lcMcCollisionsTable; - Produces lcParticlesTable; - - Produces bplusCollisionsTable; - Produces bplusCollisionsMatchingTable; - Produces bplussTable; - Produces bplusParsTable; - Produces bplusParExtrasTable; - Produces bplusParD0sTable; - Produces bplusSelsTable; - Produces bplusMlsTable; - Produces bplusMlD0sTable; - Produces bplusMcsTable; - Produces bplusMcCollisionsTable; - Produces bplusParticlesTable; - - void init(InitContext const&) - { - } - - void processDummy(aod::JDummys const&) - { - } - PROCESS_SWITCH(JetDerivedDataProducerDummyDielectronTask, processDummy, "leaves all tables empty", true); -}; - -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"jet-deriveddata-producer-dummy-dielectron"})}; -} diff --git a/PWGJE/TableProducer/derivedDataProducerDummyLc.cxx b/PWGJE/TableProducer/derivedDataProducerDummyLc.cxx deleted file mode 100644 index 9913e1da37f..00000000000 --- a/PWGJE/TableProducer/derivedDataProducerDummyLc.cxx +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. - -// temporary task to produce HF and DQ tables needed when making Lc jet derived data - should become obsolete when tables are able to be prouduced based on a configurable -// -/// \author Nima Zardoshti - -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoA.h" -#include "Framework/runDataProcessing.h" -#include "PWGJE/DataModel/JetReducedData.h" -#include "PWGHF/DataModel/DerivedTables.h" -#include "PWGDQ/DataModel/ReducedInfoTables.h" - -using namespace o2; -using namespace o2::framework; -using namespace o2::framework::expressions; - -struct JetDerivedDataProducerDummyLcTask { - - Produces d0CollisionsTable; - Produces d0CollisionsMatchingTable; - Produces d0sTable; - Produces d0ParsTable; - Produces d0ParExtrasTable; - Produces d0SelsTable; - Produces d0MlsTable; - Produces d0McsTable; - Produces d0McCollisionsTable; - Produces d0ParticlesTable; - - Produces bplusCollisionsTable; - Produces bplusCollisionsMatchingTable; - Produces bplussTable; - Produces bplusParsTable; - Produces bplusParExtrasTable; - Produces bplusParD0sTable; - Produces bplusSelsTable; - Produces bplusMlsTable; - Produces bplusMlD0sTable; - Produces bplusMcsTable; - Produces bplusMcCollisionsTable; - Produces bplusParticlesTable; - - Produces dielectronCollisionsTable; - Produces dielectronTable; - - void init(InitContext const&) - { - } - - void processDummy(aod::JDummys const&) - { - } - PROCESS_SWITCH(JetDerivedDataProducerDummyLcTask, processDummy, "leaves all tables empty", true); -}; - -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"jet-deriveddata-producer-dummy-lc"})}; -} diff --git a/PWGJE/TableProducer/derivedDataSelector.cxx b/PWGJE/TableProducer/derivedDataSelector.cxx new file mode 100644 index 00000000000..88398f796f5 --- /dev/null +++ b/PWGJE/TableProducer/derivedDataSelector.cxx @@ -0,0 +1,331 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file jetderiveddataselector.cxx +/// \brief Task to store decision of which events to skim for producing jet framework tables (aod::JetCollisions, aod::JetTracks, aod::JetClusters, ...) +/// while adjusting indices accordingly +/// +/// \author Nima Zardoshti +/// \author Jochen Klein + +#include +#include +#include +#include + +#include + +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/ASoA.h" +#include "Framework/runDataProcessing.h" + +#include "PWGJE/DataModel/Jet.h" +#include "PWGJE/DataModel/JetReducedData.h" +#include "PWGJE/DataModel/JetReducedDataSelector.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +struct JetDerivedDataSelector { + + Produces collisionSelectionsTable; + Produces mcCollisionSelectionsTable; + + struct : ConfigurableGroup { + Configurable thresholdChargedJetPtMin{"thresholdChargedJetPtMin", 0.0, "Minimum charged jet pt to accept event"}; + Configurable thresholdChargedEventWiseSubtractedJetPtMin{"thresholdChargedEventWiseSubtractedJetPtMin", 0.0, "Minimum charged event-wise subtracted jet pt to accept event"}; + Configurable thresholdChargedMCPJetPtMin{"thresholdChargedMCPJetPtMin", 0.0, "Minimum charged mcp jet pt to accept event"}; + Configurable thresholdNeutralJetPtMin{"thresholdNeutralJetPtMin", 0.0, "Minimum neutral jet pt to accept event"}; + Configurable thresholdNeutralMCPJetPtMin{"thresholdNeutralMCPJetPtMin", 0.0, "Minimum neutal mcp jet pt to accept event"}; + Configurable thresholdFullJetPtMin{"thresholdFullJetPtMin", 0.0, "Minimum full jet pt to accept event"}; + Configurable thresholdFullMCPJetPtMin{"thresholdFullMCPJetPtMin", 0.0, "Minimum full mcp jet pt to accept event"}; + Configurable thresholdChargedD0JetPtMin{"thresholdChargedD0JetPtMin", 0.0, "Minimum charged D0 jet pt to accept event"}; + Configurable thresholdChargedEventWiseSubtractedD0JetPtMin{"thresholdChargedEventWiseSubtractedD0JetPtMin", 0.0, "Minimum charged event-wise subtracted D0 jet pt to accept event"}; + Configurable thresholdChargedD0MCPJetPtMin{"thresholdChargedD0MCPJetPtMin", 0.0, "Minimum charged D0 mcp jet pt to accept event"}; + Configurable thresholdChargedLcJetPtMin{"thresholdChargedLcJetPtMin", 0.0, "Minimum charged Lc jet pt to accept event"}; + Configurable thresholdChargedEventWiseSubtractedLcJetPtMin{"thresholdChargedEventWiseSubtractedLcJetPtMin", 0.0, "Minimum charged event-wise subtracted Lc jet pt to accept event"}; + Configurable thresholdChargedLcMCPJetPtMin{"thresholdChargedLcMCPJetPtMin", 0.0, "Minimum charged Lc mcp jet pt to accept event"}; + Configurable thresholdChargedBplusJetPtMin{"thresholdChargedBplusJetPtMin", 0.0, "Minimum charged Bplus jet pt to accept event"}; + Configurable thresholdChargedEventWiseSubtractedBplusJetPtMin{"thresholdChargedEventWiseSubtractedBplusJetPtMin", 0.0, "Minimum charged event-wise subtracted Bplus jet pt to accept event"}; + Configurable thresholdChargedBplusMCPJetPtMin{"thresholdChargedBplusMCPJetPtMin", 0.0, "Minimum charged Bplus mcp jet pt to accept event"}; + Configurable thresholdChargedDielectronJetPtMin{"thresholdChargedDielectronJetPtMin", 0.0, "Minimum charged Dielectron jet pt to accept event"}; + Configurable thresholdChargedEventWiseSubtractedDielectronJetPtMin{"thresholdChargedEventWiseSubtractedDielectronJetPtMin", 0.0, "Minimum charged event-wise subtracted Dielectron jet pt to accept event"}; + Configurable thresholdChargedDielectronMCPJetPtMin{"thresholdChargedDielectronMCPJetPtMin", 0.0, "Minimum charged Dielectron mcp jet pt to accept event"}; + Configurable thresholdTriggerTrackPtMin{"thresholdTriggerTrackPtMin", 0.0, "Minimum trigger track pt to accept event"}; + Configurable thresholdClusterEnergyMin{"thresholdClusterEnergyMin", 0.0, "Minimum cluster energy to accept event"}; + Configurable downscaleFactor{"downscaleFactor", 1, "random downscale of selected events"}; + + Configurable vertexZCut{"vertexZCut", 10.0, "z-vertex cut on event"}; + Configurable centralityMin{"centralityMin", -999.0, "minimum centrality"}; + Configurable centralityMax{"centralityMax", 999.0, "maximum centrality"}; + Configurable trackOccupancyInTimeRangeMax{"trackOccupancyInTimeRangeMax", 999999, "maximum occupancy of tracks in neighbouring collisions in a given time range"}; + Configurable performTrackSelection{"performTrackSelection", true, "only save tracks that pass one of the track selections"}; + Configurable trackPtSelectionMin{"trackPtSelectionMin", 0.15, "only save tracks that have a pT larger than this pT"}; + Configurable trackEtaSelectionMax{"trackEtaSelectionMax", 0.9, "only save tracks that have an eta smaller than this eta"}; + + Configurable triggerMasks{"triggerMasks", "", "possible JE Trigger masks: fJetChLowPt,fJetChHighPt,fTrackLowPt,fTrackHighPt,fJetD0ChLowPt,fJetD0ChHighPt,fJetLcChLowPt,fJetLcChHighPt,fEMCALReadout,fJetFullHighPt,fJetFullLowPt,fJetNeutralHighPt,fJetNeutralLowPt,fGammaVeryHighPtEMCAL,fGammaVeryHighPtDCAL,fGammaHighPtEMCAL,fGammaHighPtDCAL,fGammaLowPtEMCAL,fGammaLowPtDCAL,fGammaVeryLowPtEMCAL,fGammaVeryLowPtDCAL"}; + } config; + + std::vector collisionFlag; + std::vector McCollisionFlag; + + TRandom3 randomNumber; + + std::vector triggerMaskBits; + void init(InitContext&) + { + randomNumber.SetSeed(0); + triggerMaskBits = jetderiveddatautilities::initialiseTriggerMaskBits(config.triggerMasks); + } + + PresliceUnsorted> CollisionsPerMcCollision = aod::jmccollisionlb::mcCollisionId; + + void processSetupCollisions(aod::JCollisions const& collisions) + { + collisionFlag.clear(); + collisionFlag.resize(collisions.size(), false); + } + + void processSetupMcCollisions(aod::JMcCollisions const& mcCollisions) + { + McCollisionFlag.clear(); + McCollisionFlag.resize(mcCollisions.size(), false); + } + + void processSelectMcCollisionsPerCollision(aod::JMcCollisions const& mcCollisions, soa::Join const& collisions) + { + for (auto mcCollision : mcCollisions) { + const auto collisionsPerMcCollision = collisions.sliceBy(CollisionsPerMcCollision, mcCollision.globalIndex()); + for (auto collision : collisionsPerMcCollision) { + if (collisionFlag[collision.globalIndex()]) { + McCollisionFlag[mcCollision.globalIndex()] = true; + } + } + } + } + + void processSelectCollisionsPerMcCollision(soa::Join::iterator const& collision) + { + if (McCollisionFlag[collision.mcCollisionId()]) { + collisionFlag[collision.globalIndex()] = true; + } + } + + void processSetupAllCollisionsWithDownscaling(aod::JCollisions const& collisions) + { + collisionFlag.clear(); + collisionFlag.resize(collisions.size(), false); + for (const auto& collision : collisions) { + if (randomNumber.Integer(config.downscaleFactor) == 0) { + collisionFlag[collision.globalIndex()] = true; + } + } + } + + void processSetupAllMcCollisionsWithDownscaling(aod::JMcCollisions const& mcCollisions) + { + McCollisionFlag.clear(); + McCollisionFlag.resize(mcCollisions.size(), false); + for (const auto& mcCollision : mcCollisions) { + if (randomNumber.Integer(config.downscaleFactor) == 0) { + McCollisionFlag[mcCollision.globalIndex()] = true; + } + } + } + + template + void processDoDownscaling(T const& collisions) + { + for (const auto& collision : collisions) { + if constexpr (std::is_same_v, aod::JCollisions>) { + if (collisionFlag[collision.globalIndex()] && randomNumber.Integer(config.downscaleFactor) != 0) { + collisionFlag[collision.globalIndex()] = false; + } + } + if constexpr (std::is_same_v, aod::JMcCollisions>) { + if (McCollisionFlag[collision.globalIndex()] && randomNumber.Integer(config.downscaleFactor) != 0) { + McCollisionFlag[collision.globalIndex()] = false; + } + } + } + } + + void processSetupEventTriggering(aod::JCollision const& collision) + { + if (jetderiveddatautilities::selectTrigger(collision, triggerMaskBits)) { + collisionFlag[collision.globalIndex()] = true; + } + } + + void processDoCollisionSelections(aod::JCollision const& collision) + { // can also add event selection like sel8 but goes a little against the derived data idea + if (collision.centrality() < config.centralityMin || collision.centrality() >= config.centralityMax || collision.trackOccupancyInTimeRange() > config.trackOccupancyInTimeRangeMax || std::abs(collision.posZ()) > config.vertexZCut) { + collisionFlag[collision.globalIndex()] = false; + } + } + + template + void processSelectionObjects(T& selectionObjects) + { + float selectionObjectPtMin = 0.0; + if constexpr (std::is_same_v, aod::ChargedJets> || std::is_same_v, aod::ChargedMCDetectorLevelJets>) { + selectionObjectPtMin = config.thresholdChargedJetPtMin; + } else if constexpr (std::is_same_v, aod::ChargedEventWiseSubtractedJets> || std::is_same_v, aod::ChargedMCDetectorLevelEventWiseSubtractedJets>) { + selectionObjectPtMin = config.thresholdChargedEventWiseSubtractedJetPtMin; + } else if constexpr (std::is_same_v, aod::ChargedMCParticleLevelJets>) { + selectionObjectPtMin = config.thresholdChargedMCPJetPtMin; + } else if constexpr (std::is_same_v, aod::NeutralJets> || std::is_same_v, aod::NeutralMCDetectorLevelJets>) { + selectionObjectPtMin = config.thresholdNeutralJetPtMin; + } else if constexpr (std::is_same_v, aod::NeutralMCParticleLevelJets>) { + selectionObjectPtMin = config.thresholdNeutralMCPJetPtMin; + } else if constexpr (std::is_same_v, aod::FullJets> || std::is_same_v, aod::FullMCDetectorLevelJets>) { + selectionObjectPtMin = config.thresholdFullJetPtMin; + } else if constexpr (std::is_same_v, aod::FullMCParticleLevelJets>) { + selectionObjectPtMin = config.thresholdFullMCPJetPtMin; + } else if constexpr (std::is_same_v, aod::D0ChargedJets> || std::is_same_v, aod::D0ChargedMCDetectorLevelJets>) { + selectionObjectPtMin = config.thresholdChargedD0JetPtMin; + } else if constexpr (std::is_same_v, aod::D0ChargedEventWiseSubtractedJets> || std::is_same_v, aod::D0ChargedMCDetectorLevelEventWiseSubtractedJets>) { + selectionObjectPtMin = config.thresholdChargedEventWiseSubtractedD0JetPtMin; + } else if constexpr (std::is_same_v, aod::D0ChargedMCParticleLevelJets>) { + selectionObjectPtMin = config.thresholdChargedD0MCPJetPtMin; + } else if constexpr (std::is_same_v, aod::LcChargedJets> || std::is_same_v, aod::LcChargedMCDetectorLevelJets>) { + selectionObjectPtMin = config.thresholdChargedLcJetPtMin; + } else if constexpr (std::is_same_v, aod::LcChargedEventWiseSubtractedJets> || std::is_same_v, aod::LcChargedMCDetectorLevelEventWiseSubtractedJets>) { + selectionObjectPtMin = config.thresholdChargedEventWiseSubtractedLcJetPtMin; + } else if constexpr (std::is_same_v, aod::LcChargedMCParticleLevelJets>) { + selectionObjectPtMin = config.thresholdChargedLcMCPJetPtMin; + } else if constexpr (std::is_same_v, aod::BplusChargedJets> || std::is_same_v, aod::BplusChargedMCDetectorLevelJets>) { + selectionObjectPtMin = config.thresholdChargedBplusJetPtMin; + } else if constexpr (std::is_same_v, aod::BplusChargedEventWiseSubtractedJets> || std::is_same_v, aod::BplusChargedMCDetectorLevelEventWiseSubtractedJets>) { + selectionObjectPtMin = config.thresholdChargedEventWiseSubtractedBplusJetPtMin; + } else if constexpr (std::is_same_v, aod::BplusChargedMCParticleLevelJets>) { + selectionObjectPtMin = config.thresholdChargedBplusMCPJetPtMin; + } else if constexpr (std::is_same_v, aod::DielectronChargedJets> || std::is_same_v, aod::DielectronChargedMCDetectorLevelJets>) { + selectionObjectPtMin = config.thresholdChargedDielectronJetPtMin; + } else if constexpr (std::is_same_v, aod::DielectronChargedEventWiseSubtractedJets> || std::is_same_v, aod::DielectronChargedMCDetectorLevelEventWiseSubtractedJets>) { + selectionObjectPtMin = config.thresholdChargedEventWiseSubtractedDielectronJetPtMin; + } else if constexpr (std::is_same_v, aod::DielectronChargedMCParticleLevelJets>) { + selectionObjectPtMin = config.thresholdChargedDielectronMCPJetPtMin; + } else if constexpr (std::is_same_v, aod::JTracks>) { + selectionObjectPtMin = config.thresholdTriggerTrackPtMin; + } else if constexpr (std::is_same_v, aod::JClusters>) { + selectionObjectPtMin = config.thresholdClusterEnergyMin; + } else { + selectionObjectPtMin = 0.0; + } + for (const auto& selectionObject : selectionObjects) { + bool isTriggerObject = false; + if constexpr (std::is_same_v, aod::JClusters>) { + if (selectionObject.energy() >= selectionObjectPtMin) { + isTriggerObject = true; + } + } else { + if constexpr (std::is_same_v, aod::JTracks>) { + if (config.performTrackSelection && !(selectionObject.trackSel() & ~(1 << jetderiveddatautilities::JTrackSel::trackSign))) { + continue; + } + if (selectionObject.pt() < config.trackPtSelectionMin || std::abs(selectionObject.eta()) > config.trackEtaSelectionMax) { + continue; + } + } + if (selectionObject.pt() >= selectionObjectPtMin) { + isTriggerObject = true; + } + } + if (isTriggerObject) { + if constexpr (std::is_same_v, aod::ChargedMCParticleLevelJets> || std::is_same_v, aod::NeutralMCParticleLevelJets> || std::is_same_v, aod::FullMCParticleLevelJets> || std::is_same_v, aod::D0ChargedMCParticleLevelJets> || std::is_same_v, aod::LcChargedMCParticleLevelJets> || std::is_same_v, aod::BplusChargedMCParticleLevelJets> || std::is_same_v, aod::DielectronChargedMCParticleLevelJets>) { + if (selectionObject.mcCollisionId() >= 0) { + McCollisionFlag[selectionObject.mcCollisionId()] = true; + } + } else { + if (selectionObject.collisionId() >= 0) { + collisionFlag[selectionObject.collisionId()] = true; + } + } + } + } + } + // Todo : Check memory consumption of having so many Process Switches + PROCESS_SWITCH(JetDerivedDataSelector, processSetupCollisions, "setup the writing for data and MCD based on collisions", true); + PROCESS_SWITCH(JetDerivedDataSelector, processSetupMcCollisions, "setup the writing for MCP based on mcCollisions", false); + PROCESS_SWITCH(JetDerivedDataSelector, processSetupAllCollisionsWithDownscaling, "setup the writing of untriggered collisions with downscaling", false); + PROCESS_SWITCH(JetDerivedDataSelector, processSetupAllMcCollisionsWithDownscaling, "setup the writing of untriggered mccollisions with downscaling", false); + PROCESS_SWITCH(JetDerivedDataSelector, processSetupEventTriggering, "process software triggers", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingChargedJets, "process charged jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingChargedEventWiseSubtractedJets, "process charged event-wise subtracted jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingChargedMCDJets, "process charged mcd jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingChargedMCDetectorLevelEventWiseSubtractedJets, "process charged event-wise subtracted mcd jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingChargedMCPJets, "process charged mcp jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingNeutralJets, "process neutral jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingNeutralMCDJets, "process neutral mcd jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingNeutralMCPJets, "process neutral mcp jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingFullJets, "process full jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingFullMCDJets, "process full mcd jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingFullMCPJets, "process full mcp jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingD0ChargedJets, "process D0 charged jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingD0ChargedEventWiseSubtractedJets, "process D0 event-wise subtracted charged jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingD0ChargedMCDJets, "process D0 charged mcd jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingD0ChargedMCDetectorLevelEventWiseSubtractedJets, "process D0 event-wise subtracted charged mcd jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingD0ChargedMCPJets, "process D0 charged mcp jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingLcChargedJets, "process Lc charged jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingLcChargedEventWiseSubtractedJets, "process Lc event-wise subtracted charged jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingLcChargedMCDJets, "process Lc charged mcd jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingLcChargedMCDetectorLevelEventWiseSubtractedJets, "process Lc event-wise subtracted charged mcd jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingLcChargedMCPJets, "process Lc charged mcp jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingBplusChargedJets, "process Bplus charged jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingBplusChargedEventWiseSubtractedJets, "process Bplus event-wise subtracted charged jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingBplusChargedMCDJets, "process Bplus charged mcd jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingBplusChargedMCDetectorLevelEventWiseSubtractedJets, "process Bplus event-wise subtracted charged mcd jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingBplusChargedMCPJets, "process Bplus charged mcp jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingDielectronChargedJets, "process Dielectron charged jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingDielectronChargedEventWiseSubtractedJets, "process Dielectron event-wise subtracted charged jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingDielectronChargedMCDJets, "process Dielectron charged mcd jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingDielectronChargedMCDetectorLevelEventWiseSubtractedJets, "process Dielectron event-wise subtracted charged mcd jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingDielectronChargedMCPJets, "process Dielectron charged mcp jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingClusters, "process EMCal clusters", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingTracks, "process high pt tracks", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processDoDownscaling, processCollisionDownscaling, "process downsaling of triggered collisions", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processDoDownscaling, processMcCollisionDownscaling, "process downsaling of triggered mccollisions", false); + PROCESS_SWITCH(JetDerivedDataSelector, processDoCollisionSelections, "process event selections for saved events", false); + PROCESS_SWITCH(JetDerivedDataSelector, processSelectMcCollisionsPerCollision, "select McCollisions due to a triggered reconstructed collision", false); + PROCESS_SWITCH(JetDerivedDataSelector, processSelectCollisionsPerMcCollision, "select collisions due to a triggered McCollision", false); + + void processStoreCollisionDecision(aod::JCollision const& collision) + { + if (collisionFlag[collision.globalIndex()]) { + collisionSelectionsTable(true); + } else { + collisionSelectionsTable(false); + } + } + PROCESS_SWITCH(JetDerivedDataSelector, processStoreCollisionDecision, "write out decision of storing collision", true); + + void processStoreMcCollisionDecision(aod::JMcCollision const& mcCollision) + { + if (McCollisionFlag[mcCollision.globalIndex()]) { + mcCollisionSelectionsTable(true); + } else { + mcCollisionSelectionsTable(false); + } + } + PROCESS_SWITCH(JetDerivedDataSelector, processStoreMcCollisionDecision, "write out decision of storing mcCollision", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + std::vector tasks; + + tasks.emplace_back(adaptAnalysisTask(cfgc, TaskName{"jet-deriveddata-selector"})); + + return WorkflowSpec{tasks}; +} diff --git a/PWGJE/TableProducer/derivedDataWriter.cxx b/PWGJE/TableProducer/derivedDataWriter.cxx index ee4eeea7c10..234cc219b8b 100644 --- a/PWGJE/TableProducer/derivedDataWriter.cxx +++ b/PWGJE/TableProducer/derivedDataWriter.cxx @@ -18,8 +18,8 @@ #include #include - -#include +#include +#include #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" @@ -30,6 +30,7 @@ #include "PWGJE/Core/JetDQUtilities.h" #include "PWGJE/DataModel/Jet.h" #include "PWGJE/DataModel/JetReducedData.h" +#include "PWGJE/DataModel/JetReducedDataSelector.h" using namespace o2; using namespace o2::framework; @@ -38,42 +39,9 @@ using namespace o2::framework::expressions; struct JetDerivedDataWriter { struct : ConfigurableGroup { - Configurable thresholdChargedJetPtMin{"thresholdChargedJetPtMin", 0.0, "Minimum charged jet pt to accept event"}; - Configurable thresholdChargedEventWiseSubtractedJetPtMin{"thresholdChargedEventWiseSubtractedJetPtMin", 0.0, "Minimum charged event-wise subtracted jet pt to accept event"}; - Configurable thresholdChargedMCPJetPtMin{"thresholdChargedMCPJetPtMin", 0.0, "Minimum charged mcp jet pt to accept event"}; - Configurable thresholdNeutralJetPtMin{"thresholdNeutralJetPtMin", 0.0, "Minimum neutral jet pt to accept event"}; - Configurable thresholdNeutralMCPJetPtMin{"thresholdNeutralMCPJetPtMin", 0.0, "Minimum neutal mcp jet pt to accept event"}; - Configurable thresholdFullJetPtMin{"thresholdFullJetPtMin", 0.0, "Minimum full jet pt to accept event"}; - Configurable thresholdFullMCPJetPtMin{"thresholdFullMCPJetPtMin", 0.0, "Minimum full mcp jet pt to accept event"}; - Configurable thresholdChargedD0JetPtMin{"thresholdChargedD0JetPtMin", 0.0, "Minimum charged D0 jet pt to accept event"}; - Configurable thresholdChargedEventWiseSubtractedD0JetPtMin{"thresholdChargedEventWiseSubtractedD0JetPtMin", 0.0, "Minimum charged event-wise subtracted D0 jet pt to accept event"}; - Configurable thresholdChargedD0MCPJetPtMin{"thresholdChargedD0MCPJetPtMin", 0.0, "Minimum charged D0 mcp jet pt to accept event"}; - Configurable thresholdChargedLcJetPtMin{"thresholdChargedLcJetPtMin", 0.0, "Minimum charged Lc jet pt to accept event"}; - Configurable thresholdChargedEventWiseSubtractedLcJetPtMin{"thresholdChargedEventWiseSubtractedLcJetPtMin", 0.0, "Minimum charged event-wise subtracted Lc jet pt to accept event"}; - Configurable thresholdChargedLcMCPJetPtMin{"thresholdChargedLcMCPJetPtMin", 0.0, "Minimum charged Lc mcp jet pt to accept event"}; - Configurable thresholdChargedBplusJetPtMin{"thresholdChargedBplusJetPtMin", 0.0, "Minimum charged Bplus jet pt to accept event"}; - Configurable thresholdChargedEventWiseSubtractedBplusJetPtMin{"thresholdChargedEventWiseSubtractedBplusJetPtMin", 0.0, "Minimum charged event-wise subtracted Bplus jet pt to accept event"}; - Configurable thresholdChargedBplusMCPJetPtMin{"thresholdChargedBplusMCPJetPtMin", 0.0, "Minimum charged Bplus mcp jet pt to accept event"}; - Configurable thresholdChargedDielectronJetPtMin{"thresholdChargedDielectronJetPtMin", 0.0, "Minimum charged Dielectron jet pt to accept event"}; - Configurable thresholdChargedEventWiseSubtractedDielectronJetPtMin{"thresholdChargedEventWiseSubtractedDielectronJetPtMin", 0.0, "Minimum charged event-wise subtracted Dielectron jet pt to accept event"}; - Configurable thresholdChargedDielectronMCPJetPtMin{"thresholdChargedDielectronMCPJetPtMin", 0.0, "Minimum charged Dielectron mcp jet pt to accept event"}; - Configurable thresholdTriggerTrackPtMin{"thresholdTriggerTrackPtMin", 0.0, "Minimum trigger track pt to accept event"}; - Configurable thresholdClusterEnergyMin{"thresholdClusterEnergyMin", 0.0, "Minimum cluster energy to accept event"}; - Configurable downscaleFactor{"downscaleFactor", 1, "random downscale of selected events"}; - - Configurable vertexZCut{"vertexZCut", 10.0, "z-vertex cut on event"}; - Configurable centralityMin{"centralityMin", -999.0, "minimum centrality"}; - Configurable centralityMax{"centralityMax", 999.0, "maximum centrality"}; - Configurable trackOccupancyInTimeRangeMax{"trackOccupancyInTimeRangeMax", 999999, "maximum occupancy of tracks in neighbouring collisions in a given time range"}; Configurable performTrackSelection{"performTrackSelection", true, "only save tracks that pass one of the track selections"}; Configurable trackPtSelectionMin{"trackPtSelectionMin", 0.15, "only save tracks that have a pT larger than this pT"}; Configurable trackEtaSelectionMax{"trackEtaSelectionMax", 0.9, "only save tracks that have an eta smaller than this eta"}; - Configurable saveBCsTable{"saveBCsTable", true, "save the bunch crossing table to the output"}; - Configurable saveClustersTable{"saveClustersTable", false, "save the clusters table to the output"}; - Configurable saveD0Table{"saveD0Table", false, "save the D0 tables to the output"}; - Configurable saveLcTable{"saveLcTable", false, "save the Lc tables to the output"}; - Configurable saveBplusTable{"saveBplusTable", false, "save the Bplus tables to the output"}; - Configurable saveDielectronTable{"saveDielectronTable", false, "save the Dielectron tables to the output"}; Configurable triggerMasks{"triggerMasks", "", "possible JE Trigger masks: fJetChLowPt,fJetChHighPt,fTrackLowPt,fTrackHighPt,fJetD0ChLowPt,fJetD0ChHighPt,fJetLcChLowPt,fJetLcChHighPt,fEMCALReadout,fJetFullHighPt,fJetFullLowPt,fJetNeutralHighPt,fJetNeutralLowPt,fGammaVeryHighPtEMCAL,fGammaVeryHighPtDCAL,fGammaHighPtEMCAL,fGammaHighPtDCAL,fGammaLowPtEMCAL,fGammaLowPtDCAL,fGammaVeryLowPtEMCAL,fGammaVeryLowPtDCAL"}; } config; @@ -165,994 +133,482 @@ struct JetDerivedDataWriter { Produces storedDielectronParticleIdsTable; } products; - PresliceUnsorted> CollisionsPerMcCollision = aod::jmccollisionlb::mcCollisionId; - PresliceUnsorted> ParticlesPerMcCollision = aod::jmcparticle::mcCollisionId; + Preslice> TracksPerCollisionData = aod::jtrack::collisionId; + + Preslice> ParticlesPerMcCollision = aod::jmcparticle::mcCollisionId; Preslice> TracksPerCollision = aod::jtrack::collisionId; - Preslice> ClustersPerCollision = aod::jcluster::collisionId; - Preslice> D0McCollisionsPerMcCollision = aod::jd0indices::mcCollisionId; - Preslice> LcMcCollisionsPerMcCollision = aod::jlcindices::mcCollisionId; - Preslice> BplusMcCollisionsPerMcCollision = aod::jbplusindices::mcCollisionId; + Preslice D0McCollisionsPerMcCollision = aod::jd0indices::mcCollisionId; + Preslice LcMcCollisionsPerMcCollision = aod::jlcindices::mcCollisionId; + Preslice BplusMcCollisionsPerMcCollision = aod::jbplusindices::mcCollisionId; Preslice DielectronMcCollisionsPerMcCollision = aod::jdielectronindices::mcCollisionId; - Preslice D0CollisionsPerCollision = aod::jd0indices::collisionId; - Preslice LcCollisionsPerCollision = aod::jlcindices::collisionId; - Preslice BplusCollisionsPerCollision = aod::jbplusindices::collisionId; - Preslice DielectronCollisionsPerCollision = aod::jdielectronindices::collisionId; - Preslice D0sPerCollision = aod::jd0indices::collisionId; - Preslice LcsPerCollision = aod::jlcindices::collisionId; - Preslice BplussPerCollision = aod::jbplusindices::collisionId; - Preslice DielectronsPerCollision = aod::jdielectronindices::collisionId; + Preslice D0ParticlesPerMcCollision = aod::jd0indices::mcCollisionId; + Preslice LcParticlesPerMcCollision = aod::jlcindices::mcCollisionId; + Preslice BplusParticlesPerMcCollision = aod::jbplusindices::mcCollisionId; PresliceUnsorted EMCTrackPerTrack = aod::jemctrack::trackId; - std::vector collisionFlag; - std::vector McCollisionFlag; - std::vector bcIndicies; - uint32_t precisionPositionMask; uint32_t precisionMomentumMask; - TRandom3 randomNumber; - - std::vector triggerMaskBits; void init(InitContext&) { precisionPositionMask = 0xFFFFFC00; // 13 bits precisionMomentumMask = 0xFFFFFC00; // 13 bits this is currently keept at 13 bits wihich gives roughly a resolution of 1/8000. This can be increased to 15 bits if really needed - randomNumber.SetSeed(0); - triggerMaskBits = jetderiveddatautilities::initialiseTriggerMaskBits(config.triggerMasks); } - bool acceptCollision(aod::JCollision const&) + template + bool trackSelection(T const& track) { + if (config.performTrackSelection && !(track.trackSel() & ~(1 << jetderiveddatautilities::JTrackSel::trackSign))) { // skips tracks that pass no selections. This might cause a problem with tracks matched with clusters. We should generate a track selection purely for cluster matched tracks so that they are kept. This includes also the track pT selction. + return false; + } + if (track.pt() < config.trackPtSelectionMin || std::abs(track.eta()) > config.trackEtaSelectionMax) { + return false; + } return true; } - void processSetupCollisions(aod::JCollisions const& collisions) + template + void storeD0(soa::Join::iterator const& collision, aod::JTracks const&, aod::CollisionsD0 const& D0Collisions, T const& D0s) { - collisionFlag.clear(); - collisionFlag.resize(collisions.size()); - std::fill(collisionFlag.begin(), collisionFlag.end(), false); - } - void processSetupMcCollisions(aod::JMcCollisions const& McCollisions) - { - McCollisionFlag.clear(); - McCollisionFlag.resize(McCollisions.size()); - std::fill(McCollisionFlag.begin(), McCollisionFlag.end(), false); + if (collision.isCollisionSelected()) { + for (const auto& D0Collision : D0Collisions) { // should only ever be one + jethfutilities::fillHFCollisionTable(D0Collision, products.storedD0CollisionsTable); + products.storedD0CollisionIdsTable(collisionMapping[collision.globalIndex()]); + } + for (const auto& D0 : D0s) { + jethfutilities::fillHFCandidateTable(D0, products.storedD0CollisionsTable.lastIndex(), products.storedD0sTable, products.storedD0ParsTable, products.storedD0ParExtrasTable, products.storedD0ParDaughtersDummyTable, products.storedD0SelsTable, products.storedD0MlsTable, products.storedD0MlDughtersDummyTable, products.storedD0McsTable); + products.storedD0IdsTable(collisionMapping[collision.globalIndex()], trackMapping[D0.prong0Id()], trackMapping[D0.prong1Id()]); + } + } } - void processSetupAllCollisionsWithDownscaling(aod::JCollisions const& collisions) + template + void storeLc(soa::Join::iterator const& collision, aod::JTracks const&, aod::CollisionsLc const& LcCollisions, T const& Lcs) { - collisionFlag.clear(); - collisionFlag.resize(collisions.size()); - for (const auto& collision : collisions) { - if (randomNumber.Integer(config.downscaleFactor) == 0) { - collisionFlag[collision.globalIndex()] = true; - } else { - collisionFlag[collision.globalIndex()] = false; + if (collision.isCollisionSelected()) { + for (const auto& LcCollision : LcCollisions) { // should only ever be one + jethfutilities::fillHFCollisionTable(LcCollision, products.storedLcCollisionsTable); + products.storedLcCollisionIdsTable(collisionMapping[collision.globalIndex()]); + } + for (const auto& Lc : Lcs) { + jethfutilities::fillHFCandidateTable(Lc, products.storedLcCollisionsTable.lastIndex(), products.storedLcsTable, products.storedLcParsTable, products.storedLcParExtrasTable, products.storedLcParDaughtersDummyTable, products.storedLcSelsTable, products.storedLcMlsTable, products.storedLcMlDughtersDummyTable, products.storedLcMcsTable); + products.storedLcIdsTable(collisionMapping[collision.globalIndex()], trackMapping[Lc.prong0Id()], trackMapping[Lc.prong1Id()], trackMapping[Lc.prong2Id()]); } } } - void processSetupAllMcCollisionsWithDownscaling(aod::JMcCollisions const& McCollisions) + template + void storeBplus(soa::Join::iterator const& collision, aod::JTracks const&, aod::CollisionsBplus const& BplusCollisions, T const& Bpluss) { - McCollisionFlag.clear(); - McCollisionFlag.resize(McCollisions.size()); - for (const auto& mcCollision : McCollisions) { - if (randomNumber.Integer(config.downscaleFactor) == 0) { - McCollisionFlag[mcCollision.globalIndex()] = true; - } else { - McCollisionFlag[mcCollision.globalIndex()] = false; + if (collision.isCollisionSelected()) { + for (const auto& BplusCollision : BplusCollisions) { // should only ever be one + jethfutilities::fillHFCollisionTable(BplusCollision, products.storedBplusCollisionsTable); + products.storedBplusCollisionIdsTable(collisionMapping[collision.globalIndex()]); + } + for (const auto& Bplus : Bpluss) { + jethfutilities::fillHFCandidateTable(Bplus, products.storedBplusCollisionsTable.lastIndex(), products.storedBplussTable, products.storedBplusParsTable, products.storedBplusParExtrasTable, products.storedBplusParD0sTable, products.storedBplusSelsTable, products.storedBplusMlsTable, products.storedBplusMlD0sTable, products.storedBplusMcsTable); + products.storedBplusIdsTable(collisionMapping[collision.globalIndex()], trackMapping[Bplus.prong0Id()], trackMapping[Bplus.prong1Id()], trackMapping[Bplus.prong2Id()]); } } } - template - void processDoDownscaling(T const& collisions) + void processDummyTable(aod::JDummys const&) { - for (const auto& collision : collisions) { - if constexpr (std::is_same_v, aod::JCollisions>) { - if (collisionFlag[collision.globalIndex()] && randomNumber.Integer(config.downscaleFactor) != 0) { - collisionFlag[collision.globalIndex()] = false; - } - } - if constexpr (std::is_same_v, aod::JMcCollisions>) { - if (McCollisionFlag[collision.globalIndex()] && randomNumber.Integer(config.downscaleFactor) != 0) { - McCollisionFlag[collision.globalIndex()] = false; + products.storedJDummysTable(1); + } + PROCESS_SWITCH(JetDerivedDataWriter, processDummyTable, "write out dummy output table", true); + + std::vector collisionMapping; + std::vector bcMapping; + std::vector trackMapping; + std::vector mcCollisionMapping; + std::vector particleMapping; + std::vector d0McCollisionMapping; + std::vector lcMcCollisionMapping; + std::vector bplusMcCollisionMapping; + std::vector dielectronMcCollisionMapping; + + void processBCs(soa::Join const& collisions, soa::Join const& bcs) + { + std::vector bcIndicies; + bcMapping.clear(); + bcMapping.resize(bcs.size(), -1); + + for (auto const& collision : collisions) { + if (collision.isCollisionSelected()) { + auto bc = collision.bc_as>(); + if (std::find(bcIndicies.begin(), bcIndicies.end(), bc.globalIndex()) == bcIndicies.end()) { + products.storedJBCsTable(bc.runNumber(), bc.globalBC(), bc.timestamp(), bc.alias_raw(), bc.selection_raw()); + products.storedJBCParentIndexTable(bc.bcId()); + bcIndicies.push_back(bc.globalIndex()); + bcMapping[bc.globalIndex()] = products.storedJBCsTable.lastIndex(); } } } } + PROCESS_SWITCH(JetDerivedDataWriter, processBCs, "write out output tables for Bunch crossings", true); - void processSetupEventTriggering(aod::JCollision const& collision) + void processColllisons(soa::Join const& collisions) { - if (jetderiveddatautilities::selectTrigger(collision, triggerMaskBits)) { - collisionFlag[collision.globalIndex()] = true; - } - } + collisionMapping.clear(); + collisionMapping.resize(collisions.size(), -1); + + for (auto const& collision : collisions) { + if (collision.isCollisionSelected()) { - void processDoCollisionSelections(aod::JCollision const& collision) - { // can also add event selection like sel8 but goes a little against the derived data idea - if (collision.centrality() < config.centralityMin || collision.centrality() >= config.centralityMax || collision.trackOccupancyInTimeRange() > config.trackOccupancyInTimeRangeMax || std::abs(collision.posZ()) > config.vertexZCut) { - collisionFlag[collision.globalIndex()] = false; + products.storedJCollisionsTable(collision.posX(), collision.posY(), collision.posZ(), collision.multiplicity(), collision.centrality(), collision.trackOccupancyInTimeRange(), collision.eventSel(), collision.alias_raw(), collision.triggerSel()); + collisionMapping[collision.globalIndex()] = products.storedJCollisionsTable.lastIndex(); + products.storedJCollisionMcInfosTable(collision.weight(), collision.subGeneratorId()); + products.storedJCollisionsParentIndexTable(collision.collisionId()); + if (doprocessBCs) { + products.storedJCollisionsBunchCrossingIndexTable(bcMapping[collision.bcId()]); + } + } } } + PROCESS_SWITCH(JetDerivedDataWriter, processColllisons, "write out output tables for collisions", true); - template - void processSelectionObjects(T& selectionObjects) + void processTracks(soa::Join const& collisions, soa::Join const& tracks) { - float selectionObjectPtMin = 0.0; - if constexpr (std::is_same_v, aod::ChargedJets> || std::is_same_v, aod::ChargedMCDetectorLevelJets>) { - selectionObjectPtMin = config.thresholdChargedJetPtMin; - } else if constexpr (std::is_same_v, aod::ChargedEventWiseSubtractedJets> || std::is_same_v, aod::ChargedMCDetectorLevelEventWiseSubtractedJets>) { - selectionObjectPtMin = config.thresholdChargedEventWiseSubtractedJetPtMin; - } else if constexpr (std::is_same_v, aod::ChargedMCParticleLevelJets>) { - selectionObjectPtMin = config.thresholdChargedMCPJetPtMin; - } else if constexpr (std::is_same_v, aod::NeutralJets> || std::is_same_v, aod::NeutralMCDetectorLevelJets>) { - selectionObjectPtMin = config.thresholdNeutralJetPtMin; - } else if constexpr (std::is_same_v, aod::NeutralMCParticleLevelJets>) { - selectionObjectPtMin = config.thresholdNeutralMCPJetPtMin; - } else if constexpr (std::is_same_v, aod::FullJets> || std::is_same_v, aod::FullMCDetectorLevelJets>) { - selectionObjectPtMin = config.thresholdFullJetPtMin; - } else if constexpr (std::is_same_v, aod::FullMCParticleLevelJets>) { - selectionObjectPtMin = config.thresholdFullMCPJetPtMin; - } else if constexpr (std::is_same_v, aod::D0ChargedJets> || std::is_same_v, aod::D0ChargedMCDetectorLevelJets>) { - selectionObjectPtMin = config.thresholdChargedD0JetPtMin; - } else if constexpr (std::is_same_v, aod::D0ChargedEventWiseSubtractedJets> || std::is_same_v, aod::D0ChargedMCDetectorLevelEventWiseSubtractedJets>) { - selectionObjectPtMin = config.thresholdChargedEventWiseSubtractedD0JetPtMin; - } else if constexpr (std::is_same_v, aod::D0ChargedMCParticleLevelJets>) { - selectionObjectPtMin = config.thresholdChargedD0MCPJetPtMin; - } else if constexpr (std::is_same_v, aod::LcChargedJets> || std::is_same_v, aod::LcChargedMCDetectorLevelJets>) { - selectionObjectPtMin = config.thresholdChargedLcJetPtMin; - } else if constexpr (std::is_same_v, aod::LcChargedEventWiseSubtractedJets> || std::is_same_v, aod::LcChargedMCDetectorLevelEventWiseSubtractedJets>) { - selectionObjectPtMin = config.thresholdChargedEventWiseSubtractedLcJetPtMin; - } else if constexpr (std::is_same_v, aod::LcChargedMCParticleLevelJets>) { - selectionObjectPtMin = config.thresholdChargedLcMCPJetPtMin; - } else if constexpr (std::is_same_v, aod::BplusChargedJets> || std::is_same_v, aod::BplusChargedMCDetectorLevelJets>) { - selectionObjectPtMin = config.thresholdChargedBplusJetPtMin; - } else if constexpr (std::is_same_v, aod::BplusChargedEventWiseSubtractedJets> || std::is_same_v, aod::BplusChargedMCDetectorLevelEventWiseSubtractedJets>) { - selectionObjectPtMin = config.thresholdChargedEventWiseSubtractedBplusJetPtMin; - } else if constexpr (std::is_same_v, aod::BplusChargedMCParticleLevelJets>) { - selectionObjectPtMin = config.thresholdChargedBplusMCPJetPtMin; - } else if constexpr (std::is_same_v, aod::DielectronChargedJets> || std::is_same_v, aod::DielectronChargedMCDetectorLevelJets>) { - selectionObjectPtMin = config.thresholdChargedDielectronJetPtMin; - } else if constexpr (std::is_same_v, aod::DielectronChargedEventWiseSubtractedJets> || std::is_same_v, aod::DielectronChargedMCDetectorLevelEventWiseSubtractedJets>) { - selectionObjectPtMin = config.thresholdChargedEventWiseSubtractedDielectronJetPtMin; - } else if constexpr (std::is_same_v, aod::DielectronChargedMCParticleLevelJets>) { - selectionObjectPtMin = config.thresholdChargedDielectronMCPJetPtMin; - } else if constexpr (std::is_same_v, aod::JTracks>) { - selectionObjectPtMin = config.thresholdTriggerTrackPtMin; - } else if constexpr (std::is_same_v, aod::JClusters>) { - selectionObjectPtMin = config.thresholdClusterEnergyMin; - } else { - selectionObjectPtMin = 0.0; - } - for (const auto& selectionObject : selectionObjects) { - bool isTriggerObject = false; - if constexpr (std::is_same_v, aod::JClusters>) { - if (selectionObject.energy() >= selectionObjectPtMin) { - isTriggerObject = true; - } - } else { - if constexpr (std::is_same_v, aod::JTracks>) { - if (config.performTrackSelection && !(selectionObject.trackSel() & ~(1 << jetderiveddatautilities::JTrackSel::trackSign))) { + trackMapping.clear(); + trackMapping.resize(tracks.size(), -1); + + for (auto const& collision : collisions) { + if (collision.isCollisionSelected()) { + const auto tracksPerCollision = tracks.sliceBy(TracksPerCollisionData, collision.globalIndex()); + for (const auto& track : tracksPerCollision) { + if (!trackSelection(track)) { // skips tracks that pass no selections. This might cause a problem with tracks matched with clusters. We should generate a track selection purely for cluster matched tracks so that they are kept. This includes also the track pT selction. continue; } - } - if (selectionObject.pt() >= selectionObjectPtMin) { - isTriggerObject = true; - } - } - if (isTriggerObject) { - if constexpr (std::is_same_v, aod::ChargedMCParticleLevelJets> || std::is_same_v, aod::NeutralMCParticleLevelJets> || std::is_same_v, aod::FullMCParticleLevelJets> || std::is_same_v, aod::D0ChargedMCParticleLevelJets> || std::is_same_v, aod::LcChargedMCParticleLevelJets> || std::is_same_v, aod::BplusChargedMCParticleLevelJets> || std::is_same_v, aod::DielectronChargedMCParticleLevelJets>) { - if (selectionObject.mcCollisionId() >= 0) { - McCollisionFlag[selectionObject.mcCollisionId()] = true; - } - } else { - if (selectionObject.collisionId() >= 0) { - collisionFlag[selectionObject.collisionId()] = true; - } + products.storedJTracksTable(collisionMapping[collision.globalIndex()], o2::math_utils::detail::truncateFloatFraction(track.pt(), precisionMomentumMask), o2::math_utils::detail::truncateFloatFraction(track.eta(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(track.phi(), precisionPositionMask), track.trackSel()); + products.storedJTracksExtraTable(o2::math_utils::detail::truncateFloatFraction(track.dcaX(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(track.dcaY(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(track.dcaZ(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(track.dcaXY(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(track.dcaXYZ(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(track.sigmadcaZ(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(track.sigmadcaXY(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(track.sigmadcaXYZ(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(track.sigma1Pt(), precisionMomentumMask)); + products.storedJTracksParentIndexTable(track.trackId()); + trackMapping[track.globalIndex()] = products.storedJTracksTable.lastIndex(); } } } } - // Todo : Check memory consumption of having so many Process Switches - PROCESS_SWITCH(JetDerivedDataWriter, processSetupCollisions, "setup the writing for data and MCD based on collisions", true); - PROCESS_SWITCH(JetDerivedDataWriter, processSetupMcCollisions, "setup the writing for MCP based on mcCollisions", false); - PROCESS_SWITCH(JetDerivedDataWriter, processSetupAllCollisionsWithDownscaling, "setup the writing of untriggered collisions with downscaling", false); - PROCESS_SWITCH(JetDerivedDataWriter, processSetupAllMcCollisionsWithDownscaling, "setup the writing of untriggered mccollisions with downscaling", false); - PROCESS_SWITCH(JetDerivedDataWriter, processSetupEventTriggering, "process software triggers", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingChargedJets, "process charged jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingChargedEventWiseSubtractedJets, "process charged event-wise subtracted jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingChargedMCDJets, "process charged mcd jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingChargedMCDetectorLevelEventWiseSubtractedJets, "process charged event-wise subtracted mcd jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingChargedMCPJets, "process charged mcp jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingNeutralJets, "process neutral jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingNeutralMCDJets, "process neutral mcd jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingNeutralMCPJets, "process neutral mcp jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingFullJets, "process full jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingFullMCDJets, "process full mcd jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingFullMCPJets, "process full mcp jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingD0ChargedJets, "process D0 charged jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingD0ChargedEventWiseSubtractedJets, "process D0 event-wise subtracted charged jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingD0ChargedMCDJets, "process D0 charged mcd jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingD0ChargedMCDetectorLevelEventWiseSubtractedJets, "process D0 event-wise subtracted charged mcd jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingD0ChargedMCPJets, "process D0 charged mcp jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingLcChargedJets, "process Lc charged jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingLcChargedEventWiseSubtractedJets, "process Lc event-wise subtracted charged jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingLcChargedMCDJets, "process Lc charged mcd jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingLcChargedMCDetectorLevelEventWiseSubtractedJets, "process Lc event-wise subtracted charged mcd jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingLcChargedMCPJets, "process Lc charged mcp jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingBplusChargedJets, "process Bplus charged jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingBplusChargedEventWiseSubtractedJets, "process Bplus event-wise subtracted charged jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingBplusChargedMCDJets, "process Bplus charged mcd jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingBplusChargedMCDetectorLevelEventWiseSubtractedJets, "process Bplus event-wise subtracted charged mcd jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingBplusChargedMCPJets, "process Bplus charged mcp jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingDielectronChargedJets, "process Dielectron charged jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingDielectronChargedEventWiseSubtractedJets, "process Dielectron event-wise subtracted charged jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingDielectronChargedMCDJets, "process Dielectron charged mcd jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingDielectronChargedMCDetectorLevelEventWiseSubtractedJets, "process Dielectron event-wise subtracted charged mcd jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingDielectronChargedMCPJets, "process Dielectron charged mcp jets", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingClusters, "process EMCal clusters", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processSelectionObjects, processSelectingTracks, "process high pt tracks", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processDoDownscaling, processCollisionDownscaling, "process downsaling of triggered collisions", false); - PROCESS_SWITCH_FULL(JetDerivedDataWriter, processDoDownscaling, processMcCollisionDownscaling, "process downsaling of triggered mccollisions", false); - PROCESS_SWITCH(JetDerivedDataWriter, processDoCollisionSelections, "process event selections for saved events", false); + PROCESS_SWITCH(JetDerivedDataWriter, processTracks, "write out output tables for tracks", true); - void processStoreDummyTable(aod::JDummys const&) + void processClusters(soa::Join::iterator const& collision, aod::JTracks const&, aod::JEMCTracks const& emcTracks, soa::Join const& clusters) { - products.storedJDummysTable(1); + if (collision.isCollisionSelected()) { + products.storedJCollisionsEMCalLabelTable(collision.isAmbiguous(), collision.isEmcalReadout()); + for (const auto& cluster : clusters) { + products.storedJClustersTable(collisionMapping[collision.globalIndex()], cluster.id(), cluster.energy(), cluster.coreEnergy(), cluster.rawEnergy(), + cluster.eta(), cluster.phi(), cluster.m02(), cluster.m20(), cluster.nCells(), cluster.time(), cluster.isExotic(), cluster.distanceToBadChannel(), + cluster.nlm(), cluster.definition(), cluster.leadingCellEnergy(), cluster.subleadingCellEnergy(), cluster.leadingCellNumber(), cluster.subleadingCellNumber()); + products.storedJClustersCorrectedEnergiesTable(cluster.energyCorrectedOneTrack1(), cluster.energyCorrectedOneTrack2(), cluster.energyCorrectedAllTracks1(), cluster.energyCorrectedAllTracks2()); + products.storedJClustersParentIndexTable(cluster.clusterId()); + + std::vector clusterStoredJTrackIDs; + for (const auto& clusterTrack : cluster.matchedTracks_as()) { + clusterStoredJTrackIDs.push_back(trackMapping[clusterTrack.globalIndex()]); + auto emcTracksPerTrack = emcTracks.sliceBy(EMCTrackPerTrack, clusterTrack.globalIndex()); + auto emcTrackPerTrack = emcTracksPerTrack.iteratorAt(0); + products.storedJTracksEMCalTable(trackMapping[clusterTrack.globalIndex()], emcTrackPerTrack.etaEmcal(), emcTrackPerTrack.phiEmcal()); + } + products.storedJClustersMatchedTracksTable(clusterStoredJTrackIDs); + } + } } - PROCESS_SWITCH(JetDerivedDataWriter, processStoreDummyTable, "write out dummy output table", true); + PROCESS_SWITCH(JetDerivedDataWriter, processClusters, "write out output tables for clusters", false); + + //!!!!!!!!!! need to add the hadronic corrected energy and delete the new dummy process function - void processStoreData(soa::Join::iterator const& collision, soa::Join const&, soa::Join const& tracks, aod::JEMCTracks const& emcTracks, soa::Join const& clusters, aod::CollisionsD0 const& D0Collisions, aod::CandidatesD0Data const& D0s, aod::CollisionsLc const& LcCollisions, aod::CandidatesLcData const& Lcs, aod::CollisionsBplus const& BplusCollisions, aod::CandidatesBplusData const& Bpluss, aod::CollisionsDielectron const& DielectronCollisions, aod::CandidatesDielectronData const& Dielectrons) + void processD0Data(soa::Join::iterator const& collision, aod::JTracks const& tracks, aod::CollisionsD0 const& D0Collisions, aod::CandidatesD0Data const& D0s) { - std::map bcMapping; - std::map trackMapping; + storeD0(collision, tracks, D0Collisions, D0s); + } + PROCESS_SWITCH(JetDerivedDataWriter, processD0Data, "write out data output tables for D0", false); - if (collisionFlag[collision.globalIndex()]) { - if (config.saveBCsTable) { - auto bc = collision.bc_as>(); - if (std::find(bcIndicies.begin(), bcIndicies.end(), bc.globalIndex()) == bcIndicies.end()) { - products.storedJBCsTable(bc.runNumber(), bc.globalBC(), bc.timestamp(), bc.alias_raw(), bc.selection_raw()); - products.storedJBCParentIndexTable(bc.bcId()); - bcIndicies.push_back(bc.globalIndex()); - bcMapping.insert(std::make_pair(bc.globalIndex(), products.storedJBCsTable.lastIndex())); - } - } + void processD0MCD(soa::Join::iterator const& collision, aod::JTracks const& tracks, aod::CollisionsD0 const& D0Collisions, aod::CandidatesD0MCD const& D0s) + { + storeD0(collision, tracks, D0Collisions, D0s); + } + PROCESS_SWITCH(JetDerivedDataWriter, processD0MCD, "write out mcd output tables for D0", false); - products.storedJCollisionsTable(collision.posX(), collision.posY(), collision.posZ(), collision.multiplicity(), collision.centrality(), collision.trackOccupancyInTimeRange(), collision.eventSel(), collision.alias_raw(), collision.triggerSel()); - products.storedJCollisionMcInfosTable(collision.weight(), collision.subGeneratorId()); - products.storedJCollisionsParentIndexTable(collision.collisionId()); - if (config.saveBCsTable) { - int32_t storedBCID = -1; - auto JBCIndex = bcMapping.find(collision.bcId()); - if (JBCIndex != bcMapping.end()) { - storedBCID = JBCIndex->second; - } - products.storedJCollisionsBunchCrossingIndexTable(storedBCID); - } - if (config.saveClustersTable) { - products.storedJCollisionsEMCalLabelTable(collision.isAmbiguous(), collision.isEmcalReadout()); - } + void processLcData(soa::Join::iterator const& collision, aod::JTracks const& tracks, aod::CollisionsLc const& LcCollisions, aod::CandidatesLcData const& Lcs) + { + storeLc(collision, tracks, LcCollisions, Lcs); + } + PROCESS_SWITCH(JetDerivedDataWriter, processLcData, "write out data output tables for Lc", false); - for (const auto& track : tracks) { - if (config.performTrackSelection && !(track.trackSel() & ~(1 << jetderiveddatautilities::JTrackSel::trackSign))) { // skips tracks that pass no selections. This might cause a problem with tracks matched with clusters. We should generate a track selection purely for cluster matched tracks so that they are kept. This includes also the track pT selction. - continue; - } - if (track.pt() < config.trackPtSelectionMin || std::abs(track.eta()) > config.trackEtaSelectionMax) { - continue; - } - products.storedJTracksTable(products.storedJCollisionsTable.lastIndex(), o2::math_utils::detail::truncateFloatFraction(track.pt(), precisionMomentumMask), o2::math_utils::detail::truncateFloatFraction(track.eta(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(track.phi(), precisionPositionMask), track.trackSel()); - products.storedJTracksExtraTable(o2::math_utils::detail::truncateFloatFraction(track.dcaX(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(track.dcaY(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(track.dcaZ(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(track.dcaXY(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(track.dcaXYZ(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(track.sigmadcaZ(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(track.sigmadcaXY(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(track.sigmadcaXYZ(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(track.sigma1Pt(), precisionMomentumMask)); - products.storedJTracksParentIndexTable(track.trackId()); - trackMapping.insert(std::make_pair(track.globalIndex(), products.storedJTracksTable.lastIndex())); - } - if (config.saveClustersTable) { - for (const auto& cluster : clusters) { - products.storedJClustersTable(products.storedJCollisionsTable.lastIndex(), cluster.id(), cluster.energy(), cluster.coreEnergy(), cluster.rawEnergy(), - cluster.eta(), cluster.phi(), cluster.m02(), cluster.m20(), cluster.nCells(), cluster.time(), cluster.isExotic(), cluster.distanceToBadChannel(), - cluster.nlm(), cluster.definition(), cluster.leadingCellEnergy(), cluster.subleadingCellEnergy(), cluster.leadingCellNumber(), cluster.subleadingCellNumber()); - products.storedJClustersCorrectedEnergiesTable(cluster.energyCorrectedOneTrack1(), cluster.energyCorrectedOneTrack2(), cluster.energyCorrectedAllTracks1(), cluster.energyCorrectedAllTracks2()); - products.storedJClustersParentIndexTable(cluster.clusterId()); + void processLcMCD(soa::Join::iterator const& collision, aod::JTracks const& tracks, aod::CollisionsLc const& LcCollisions, aod::CandidatesLcMCD const& Lcs) + { + storeLc(collision, tracks, LcCollisions, Lcs); + } + PROCESS_SWITCH(JetDerivedDataWriter, processLcMCD, "write out mcd output tables for Lc", false); - std::vector clusterStoredJTrackIDs; - for (const auto& clusterTrack : cluster.matchedTracks_as>()) { - auto JtrackIndex = trackMapping.find(clusterTrack.globalIndex()); - if (JtrackIndex != trackMapping.end()) { - clusterStoredJTrackIDs.push_back(JtrackIndex->second); - auto emcTracksPerTrack = emcTracks.sliceBy(EMCTrackPerTrack, clusterTrack.globalIndex()); - auto emcTrackPerTrack = emcTracksPerTrack.iteratorAt(0); - products.storedJTracksEMCalTable(JtrackIndex->second, emcTrackPerTrack.etaEmcal(), emcTrackPerTrack.phiEmcal()); - } - } - products.storedJClustersMatchedTracksTable(clusterStoredJTrackIDs); - } - } + void processBplusData(soa::Join::iterator const& collision, aod::JTracks const& tracks, aod::CollisionsBplus const& BplusCollisions, aod::CandidatesBplusData const& Bpluss) + { + storeBplus(collision, tracks, BplusCollisions, Bpluss); + } + PROCESS_SWITCH(JetDerivedDataWriter, processBplusData, "write out data output tables for bplus", false); - if (config.saveD0Table) { - int32_t collisionD0Index = -1; - for (const auto& D0Collision : D0Collisions) { // should only ever be one - jethfutilities::fillHFCollisionTable(D0Collision, products.storedD0CollisionsTable, collisionD0Index); - products.storedD0CollisionIdsTable(products.storedJCollisionsTable.lastIndex()); - } - for (const auto& D0 : D0s) { - int32_t D0Index = -1; - jethfutilities::fillHFCandidateTable(D0, collisionD0Index, products.storedD0sTable, products.storedD0ParsTable, products.storedD0ParExtrasTable, products.storedD0ParDaughtersDummyTable, products.storedD0SelsTable, products.storedD0MlsTable, products.storedD0MlDughtersDummyTable, products.storedD0McsTable, D0Index); + void processBplusMCD(soa::Join::iterator const& collision, aod::JTracks const& tracks, aod::CollisionsBplus const& BplusCollisions, aod::CandidatesBplusMCD const& Bpluss) + { + storeBplus(collision, tracks, BplusCollisions, Bpluss); + } + PROCESS_SWITCH(JetDerivedDataWriter, processBplusMCD, "write out mcd output tables for bplus", false); - int32_t prong0Id = -1; - int32_t prong1Id = -1; - auto JtrackIndex = trackMapping.find(D0.prong0Id()); - if (JtrackIndex != trackMapping.end()) { - prong0Id = JtrackIndex->second; - } - JtrackIndex = trackMapping.find(D0.prong1Id()); - if (JtrackIndex != trackMapping.end()) { - prong1Id = JtrackIndex->second; - } - products.storedD0IdsTable(products.storedJCollisionsTable.lastIndex(), prong0Id, prong1Id); - } + void processDielectron(soa::Join::iterator const& collision, aod::JTracks const&, aod::CollisionsDielectron const& DielectronCollisions, aod::CandidatesDielectronData const& Dielectrons) + { + if (collision.isCollisionSelected()) { + for (const auto& DielectronCollision : DielectronCollisions) { // should only ever be one + jetdqutilities::fillDielectronCollisionTable(DielectronCollision, products.storedDielectronCollisionsTable); + products.storedDielectronCollisionIdsTable(collisionMapping[collision.globalIndex()]); } - - if (config.saveLcTable) { - int32_t collisionLcIndex = -1; - for (const auto& LcCollision : LcCollisions) { // should only ever be one - jethfutilities::fillHFCollisionTable(LcCollision, products.storedLcCollisionsTable, collisionLcIndex); - products.storedLcCollisionIdsTable(products.storedJCollisionsTable.lastIndex()); - } - for (const auto& Lc : Lcs) { - int32_t LcIndex = -1; - jethfutilities::fillHFCandidateTable(Lc, collisionLcIndex, products.storedLcsTable, products.storedLcParsTable, products.storedLcParExtrasTable, products.storedLcParDaughtersDummyTable, products.storedLcSelsTable, products.storedLcMlsTable, products.storedLcMlDughtersDummyTable, products.storedLcMcsTable, LcIndex); - - int32_t prong0Id = -1; - int32_t prong1Id = -1; - int32_t prong2Id = -1; - auto JtrackIndex = trackMapping.find(Lc.prong0Id()); - if (JtrackIndex != trackMapping.end()) { - prong0Id = JtrackIndex->second; - } - JtrackIndex = trackMapping.find(Lc.prong1Id()); - if (JtrackIndex != trackMapping.end()) { - prong1Id = JtrackIndex->second; - } - JtrackIndex = trackMapping.find(Lc.prong2Id()); - if (JtrackIndex != trackMapping.end()) { - prong2Id = JtrackIndex->second; - } - products.storedLcIdsTable(products.storedJCollisionsTable.lastIndex(), prong0Id, prong1Id, prong2Id); - } + for (const auto& Dielectron : Dielectrons) { + jetdqutilities::fillDielectronCandidateTable(Dielectron, products.storedDielectronCollisionsTable.lastIndex(), products.storedDielectronsTable); + products.storedDielectronIdsTable(collisionMapping[collision.globalIndex()], trackMapping[Dielectron.prong0Id()], trackMapping[Dielectron.prong1Id()]); } - if (config.saveBplusTable) { - int32_t collisionBplusIndex = -1; - for (const auto& BplusCollision : BplusCollisions) { // should only ever be one - jethfutilities::fillHFCollisionTable(BplusCollision, products.storedBplusCollisionsTable, collisionBplusIndex); - products.storedBplusCollisionIdsTable(products.storedJCollisionsTable.lastIndex()); - } - for (const auto& Bplus : Bpluss) { - int32_t BplusIndex = -1; - jethfutilities::fillHFCandidateTable(Bplus, collisionBplusIndex, products.storedBplussTable, products.storedBplusParsTable, products.storedBplusParExtrasTable, products.storedBplusParD0sTable, products.storedBplusSelsTable, products.storedBplusMlsTable, products.storedBplusMlD0sTable, products.storedBplusMcsTable, BplusIndex); + } + } + PROCESS_SWITCH(JetDerivedDataWriter, processDielectron, "write out data output tables for dielectrons", false); - int32_t prong0Id = -1; - int32_t prong1Id = -1; - int32_t prong2Id = -1; - auto JtrackIndex = trackMapping.find(Bplus.prong0Id()); - if (JtrackIndex != trackMapping.end()) { - prong0Id = JtrackIndex->second; - } - JtrackIndex = trackMapping.find(Bplus.prong1Id()); - if (JtrackIndex != trackMapping.end()) { - prong1Id = JtrackIndex->second; - } - JtrackIndex = trackMapping.find(Bplus.prong2Id()); - if (JtrackIndex != trackMapping.end()) { - prong2Id = JtrackIndex->second; - } - products.storedBplusIdsTable(products.storedJCollisionsTable.lastIndex(), prong0Id, prong1Id, prong2Id); - } - } - if (config.saveDielectronTable) { - int32_t collisionDielectronIndex = -1; - for (const auto& DielectronCollision : DielectronCollisions) { // should only ever be one - jetdqutilities::fillDielectronCollisionTable(DielectronCollision, products.storedDielectronCollisionsTable, collisionDielectronIndex); - products.storedDielectronCollisionIdsTable(products.storedJCollisionsTable.lastIndex()); - } - for (const auto& Dielectron : Dielectrons) { - int32_t DielectronIndex = -1; - jetdqutilities::fillDielectronCandidateTable(Dielectron, collisionDielectronIndex, products.storedDielectronsTable, DielectronIndex); + void processMcCollisions(soa::Join const& mcCollisions) + { + mcCollisionMapping.clear(); + mcCollisionMapping.resize(mcCollisions.size(), -1); + for (auto const& mcCollision : mcCollisions) { + if (mcCollision.isMcCollisionSelected()) { - int32_t prong0Id = -1; - int32_t prong1Id = -1; - auto JtrackIndex = trackMapping.find(Dielectron.prong0Id()); - if (JtrackIndex != trackMapping.end()) { - prong0Id = JtrackIndex->second; - } - JtrackIndex = trackMapping.find(Dielectron.prong1Id()); - if (JtrackIndex != trackMapping.end()) { - prong1Id = JtrackIndex->second; - } - products.storedDielectronIdsTable(products.storedJCollisionsTable.lastIndex(), prong0Id, prong1Id); - } + products.storedJMcCollisionsTable(mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), mcCollision.weight(), mcCollision.subGeneratorId()); + products.storedJMcCollisionsParentIndexTable(mcCollision.mcCollisionId()); + mcCollisionMapping[mcCollision.globalIndex()] = products.storedJMcCollisionsTable.lastIndex(); } } } - // process switch for output writing must be last - // to run after all jet selections - PROCESS_SWITCH(JetDerivedDataWriter, processStoreData, "write out data output tables", false); + PROCESS_SWITCH(JetDerivedDataWriter, processMcCollisions, "write out mcCollision output tables", false); - void processStoreMC(soa::Join const& mcCollisions, soa::Join const& collisions, soa::Join const&, soa::Join const& tracks, aod::JEMCTracks const& emcTracks, soa::Join const& clusters, soa::Join const& particles, aod::CollisionsD0 const& D0Collisions, aod::CandidatesD0MCD const& D0s, soa::Join const& D0McCollisions, aod::CandidatesD0MCP const& D0Particles, aod::CollisionsLc const& LcCollisions, aod::CandidatesLcMCD const& Lcs, soa::Join const& LcMcCollisions, aod::CandidatesLcMCP const& LcParticles, aod::CollisionsBplus const& BplusCollisions, aod::CandidatesBplusMCD const& Bpluss, soa::Join const& BplusMcCollisions, aod::CandidatesBplusMCP const& BplusParticles, aod::CollisionsDielectron const& DielectronCollisions, aod::CandidatesDielectronMCD const& Dielectrons, aod::McCollisionsDielectron const& DielectronMcCollisions, aod::CandidatesDielectronMCP const& DielectronParticles) + void processMcParticles(soa::Join const& mcCollisions, soa::Join const& particles) { - std::map bcMapping; - std::map paticleMapping; - std::map mcCollisionMapping; - std::map D0CollisionMapping; - std::map LcCollisionMapping; - std::map BplusCollisionMapping; + particleMapping.clear(); + particleMapping.resize(particles.size(), -1); int particleTableIndex = 0; - for (auto mcCollision : mcCollisions) { - bool collisionSelected = false; - const auto collisionsPerMcCollision = collisions.sliceBy(CollisionsPerMcCollision, mcCollision.globalIndex()); - for (auto collision : collisionsPerMcCollision) { - if (collisionFlag[collision.globalIndex()]) { - collisionSelected = true; - } - } - - if (McCollisionFlag[mcCollision.globalIndex()] || collisionSelected) { + for (auto const& mcCollision : mcCollisions) { + if (mcCollision.isMcCollisionSelected()) { const auto particlesPerMcCollision = particles.sliceBy(ParticlesPerMcCollision, mcCollision.globalIndex()); - products.storedJMcCollisionsTable(mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), mcCollision.weight(), mcCollision.subGeneratorId()); - products.storedJMcCollisionsParentIndexTable(mcCollision.mcCollisionId()); - mcCollisionMapping.insert(std::make_pair(mcCollision.globalIndex(), products.storedJMcCollisionsTable.lastIndex())); - for (auto particle : particlesPerMcCollision) { - paticleMapping.insert(std::make_pair(particle.globalIndex(), particleTableIndex)); + particleMapping[particle.globalIndex()] = particleTableIndex; particleTableIndex++; } for (auto particle : particlesPerMcCollision) { - std::vector mothersId; + std::vector mothersIds; if (particle.has_mothers()) { auto mothersIdTemps = particle.mothersIds(); for (auto mothersIdTemp : mothersIdTemps) { - - auto JMotherIndex = paticleMapping.find(mothersIdTemp); - if (JMotherIndex != paticleMapping.end()) { - mothersId.push_back(JMotherIndex->second); - } + mothersIds.push_back(particleMapping[mothersIdTemp]); } } - int daughtersId[2] = {-1, -1}; + int daughtersIds[2] = {-1, -1}; auto i = 0; if (particle.has_daughters()) { for (auto daughterId : particle.daughtersIds()) { if (i > 1) { break; } - auto JDaughterIndex = paticleMapping.find(daughterId); - if (JDaughterIndex != paticleMapping.end()) { - daughtersId[i] = JDaughterIndex->second; - } + daughtersIds[i] = particleMapping[daughterId]; i++; } } - products.storedJMcParticlesTable(products.storedJMcCollisionsTable.lastIndex(), o2::math_utils::detail::truncateFloatFraction(particle.pt(), precisionMomentumMask), o2::math_utils::detail::truncateFloatFraction(particle.eta(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(particle.phi(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(particle.y(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(particle.e(), precisionMomentumMask), particle.pdgCode(), particle.getGenStatusCode(), particle.getHepMCStatusCode(), particle.isPhysicalPrimary(), mothersId, daughtersId); + products.storedJMcParticlesTable(mcCollisionMapping[mcCollision.globalIndex()], o2::math_utils::detail::truncateFloatFraction(particle.pt(), precisionMomentumMask), o2::math_utils::detail::truncateFloatFraction(particle.eta(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(particle.phi(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(particle.y(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(particle.e(), precisionMomentumMask), particle.pdgCode(), particle.getGenStatusCode(), particle.getHepMCStatusCode(), particle.isPhysicalPrimary(), mothersIds, daughtersIds); products.storedJParticlesParentIndexTable(particle.mcParticleId()); } + } + } + } + PROCESS_SWITCH(JetDerivedDataWriter, processMcParticles, "write out mcParticle output tables", false); - if (config.saveD0Table) { - const auto d0McCollisionsPerMcCollision = D0McCollisions.sliceBy(D0McCollisionsPerMcCollision, mcCollision.globalIndex()); - int32_t mcCollisionD0Index = -1; - for (const auto& d0McCollisionPerMcCollision : d0McCollisionsPerMcCollision) { // should only ever be one - jethfutilities::fillHFMcCollisionTable(d0McCollisionPerMcCollision, products.storedD0McCollisionsTable, mcCollisionD0Index); - products.storedD0McCollisionIdsTable(products.storedJMcCollisionsTable.lastIndex()); - } - for (const auto& D0Particle : D0Particles) { - int32_t D0ParticleIndex = -1; - jethfutilities::fillHFCandidateMcTable(D0Particle, mcCollisionD0Index, products.storedD0ParticlesTable, D0ParticleIndex); - int32_t D0ParticleId = -1; - auto JParticleIndex = paticleMapping.find(D0Particle.mcParticleId()); - if (JParticleIndex != paticleMapping.end()) { - D0ParticleId = JParticleIndex->second; - } - products.storedD0ParticleIdsTable(products.storedJMcCollisionsTable.lastIndex(), D0ParticleId); - } - } - - if (config.saveLcTable) { - const auto lcMcCollisionsPerMcCollision = LcMcCollisions.sliceBy(LcMcCollisionsPerMcCollision, mcCollision.globalIndex()); - int32_t mcCollisionLcIndex = -1; - for (const auto& lcMcCollisionPerMcCollision : lcMcCollisionsPerMcCollision) { // should only ever be one - jethfutilities::fillHFMcCollisionTable(lcMcCollisionPerMcCollision, products.storedLcMcCollisionsTable, mcCollisionLcIndex); - products.storedLcMcCollisionIdsTable(products.storedJMcCollisionsTable.lastIndex()); - } - for (const auto& LcParticle : LcParticles) { - int32_t LcParticleIndex = -1; - jethfutilities::fillHFCandidateMcTable(LcParticle, mcCollisionLcIndex, products.storedLcParticlesTable, LcParticleIndex); - int32_t LcParticleId = -1; - auto JParticleIndex = paticleMapping.find(LcParticle.mcParticleId()); - if (JParticleIndex != paticleMapping.end()) { - LcParticleId = JParticleIndex->second; - } - products.storedLcParticleIdsTable(products.storedJMcCollisionsTable.lastIndex(), LcParticleId); - } - } - if (config.saveBplusTable) { - const auto lcMcCollisionsPerMcCollision = BplusMcCollisions.sliceBy(BplusMcCollisionsPerMcCollision, mcCollision.globalIndex()); - int32_t mcCollisionBplusIndex = -1; - for (const auto& lcMcCollisionPerMcCollision : lcMcCollisionsPerMcCollision) { // should only ever be one - jethfutilities::fillHFMcCollisionTable(lcMcCollisionPerMcCollision, products.storedBplusMcCollisionsTable, mcCollisionBplusIndex); - products.storedBplusMcCollisionIdsTable(products.storedJMcCollisionsTable.lastIndex()); - } - for (const auto& BplusParticle : BplusParticles) { - int32_t BplusParticleIndex = -1; - jethfutilities::fillHFCandidateMcTable(BplusParticle, mcCollisionBplusIndex, products.storedBplusParticlesTable, BplusParticleIndex); - int32_t BplusParticleId = -1; - auto JParticleIndex = paticleMapping.find(BplusParticle.mcParticleId()); - if (JParticleIndex != paticleMapping.end()) { - BplusParticleId = JParticleIndex->second; - } - products.storedBplusParticleIdsTable(products.storedJMcCollisionsTable.lastIndex(), BplusParticleId); - } - } - if (config.saveDielectronTable) { - const auto dielectronMcCollisionsPerMcCollision = DielectronMcCollisions.sliceBy(DielectronMcCollisionsPerMcCollision, mcCollision.globalIndex()); - int32_t mcCollisionDielectronIndex = -1; - for (const auto& dielectronMcCollisionPerMcCollision : dielectronMcCollisionsPerMcCollision) { // should only ever be one - jetdqutilities::fillDielectronMcCollisionTable(dielectronMcCollisionPerMcCollision, products.storedDielectronMcCollisionsTable, mcCollisionDielectronIndex); - products.storedDielectronMcCollisionIdsTable(products.storedJMcCollisionsTable.lastIndex()); - } - for (const auto& DielectronParticle : DielectronParticles) { - int32_t DielectronParticleIndex = -1; - jetdqutilities::fillDielectronCandidateMcTable(DielectronParticle, mcCollisionDielectronIndex, products.storedDielectronParticlesTable, DielectronParticleIndex); - int32_t DielectronParticleId = -1; - auto JParticleIndex = paticleMapping.find(DielectronParticle.mcParticleId()); - if (JParticleIndex != paticleMapping.end()) { - DielectronParticleId = JParticleIndex->second; - } - std::vector DielectronMothersId; - int DielectronDaughtersId[2]; - if (DielectronParticle.has_mothers()) { - for (auto const& DielectronMother : DielectronParticle.template mothers_as>()) { - auto JDielectronMotherIndex = paticleMapping.find(DielectronMother.globalIndex()); - if (JDielectronMotherIndex != paticleMapping.end()) { - DielectronMothersId.push_back(JDielectronMotherIndex->second); - } - } - } - auto i = 0; - if (DielectronParticle.has_daughters()) { - for (auto const& DielectronDaughter : DielectronParticle.template daughters_as>()) { - if (i > 1) { - break; - } - auto JDielectronDaughterIndex = paticleMapping.find(DielectronDaughter.globalIndex()); - if (JDielectronDaughterIndex != paticleMapping.end()) { - DielectronDaughtersId[i] = JDielectronDaughterIndex->second; - } - i++; - } - } - products.storedDielectronParticleIdsTable(products.storedJMcCollisionsTable.lastIndex(), DielectronParticleId, DielectronMothersId, DielectronDaughtersId); - } + void processD0MCP(soa::Join const& mcCollisions, aod::McCollisionsD0 const& D0McCollisions, aod::CandidatesD0MCP const& D0Particles) + { + d0McCollisionMapping.clear(); + d0McCollisionMapping.resize(D0McCollisions.size(), -1); + for (auto const& mcCollision : mcCollisions) { + if (mcCollision.isMcCollisionSelected()) { + const auto d0McCollisionsPerMcCollision = D0McCollisions.sliceBy(D0McCollisionsPerMcCollision, mcCollision.globalIndex()); + for (const auto& d0McCollisionPerMcCollision : d0McCollisionsPerMcCollision) { + jethfutilities::fillHFMcCollisionTable(d0McCollisionPerMcCollision, products.storedD0McCollisionsTable); + products.storedD0McCollisionIdsTable(mcCollisionMapping[mcCollision.globalIndex()]); + d0McCollisionMapping[d0McCollisionPerMcCollision.globalIndex()] = products.storedD0McCollisionsTable.lastIndex(); + } + const auto d0ParticlesPerMcCollision = D0Particles.sliceBy(D0ParticlesPerMcCollision, mcCollision.globalIndex()); + for (const auto& D0Particle : d0ParticlesPerMcCollision) { + jethfutilities::fillHFCandidateMcTable(D0Particle, products.storedD0McCollisionsTable.lastIndex(), products.storedD0ParticlesTable); + products.storedD0ParticleIdsTable(mcCollisionMapping[mcCollision.globalIndex()], particleMapping[D0Particle.mcParticleId()]); } } } + } + PROCESS_SWITCH(JetDerivedDataWriter, processD0MCP, "write out D0 mcp output tables", false); - for (auto mcCollision : mcCollisions) { - bool collisionSelected = false; - const auto collisionsPerMcCollision = collisions.sliceBy(CollisionsPerMcCollision, mcCollision.globalIndex()); - for (auto collision : collisionsPerMcCollision) { - if (collisionFlag[collision.globalIndex()]) { - collisionSelected = true; + void processLcMCP(soa::Join const& mcCollisions, aod::McCollisionsLc const& LcMcCollisions, aod::CandidatesLcMCP const& LcParticles) + { + lcMcCollisionMapping.clear(); + lcMcCollisionMapping.resize(LcMcCollisions.size(), -1); + for (auto const& mcCollision : mcCollisions) { + if (mcCollision.isMcCollisionSelected()) { + const auto lcMcCollisionsPerMcCollision = LcMcCollisions.sliceBy(LcMcCollisionsPerMcCollision, mcCollision.globalIndex()); + for (const auto& lcMcCollisionPerMcCollision : lcMcCollisionsPerMcCollision) { // should only ever be one + jethfutilities::fillHFMcCollisionTable(lcMcCollisionPerMcCollision, products.storedLcMcCollisionsTable); + products.storedLcMcCollisionIdsTable(mcCollisionMapping[mcCollision.globalIndex()]); + lcMcCollisionMapping[lcMcCollisionPerMcCollision.globalIndex()] = products.storedLcMcCollisionsTable.lastIndex(); + } + const auto lcParticlesPerMcCollision = LcParticles.sliceBy(LcParticlesPerMcCollision, mcCollision.globalIndex()); + for (const auto& LcParticle : lcParticlesPerMcCollision) { + jethfutilities::fillHFCandidateMcTable(LcParticle, products.storedLcMcCollisionsTable.lastIndex(), products.storedLcParticlesTable); + products.storedLcParticleIdsTable(mcCollisionMapping[mcCollision.globalIndex()], particleMapping[LcParticle.mcParticleId()]); } } + } + } - if (McCollisionFlag[mcCollision.globalIndex()] || collisionSelected) { - - for (auto collision : collisionsPerMcCollision) { - std::map trackMapping; - if (config.saveBCsTable) { - auto bc = collision.bc_as>(); - if (std::find(bcIndicies.begin(), bcIndicies.end(), bc.globalIndex()) == bcIndicies.end()) { - products.storedJBCsTable(bc.runNumber(), bc.globalBC(), bc.timestamp(), bc.alias_raw(), bc.selection_raw()); - products.storedJBCParentIndexTable(bc.bcId()); - bcIndicies.push_back(bc.globalIndex()); - bcMapping.insert(std::make_pair(bc.globalIndex(), products.storedJBCsTable.lastIndex())); - } - } - - products.storedJCollisionsTable(collision.posX(), collision.posY(), collision.posZ(), collision.multiplicity(), collision.centrality(), collision.trackOccupancyInTimeRange(), collision.eventSel(), collision.alias_raw(), collision.triggerSel()); - products.storedJCollisionMcInfosTable(collision.weight(), collision.subGeneratorId()); - products.storedJCollisionsParentIndexTable(collision.collisionId()); - - auto JMcCollisionIndex = mcCollisionMapping.find(mcCollision.globalIndex()); - if (JMcCollisionIndex != mcCollisionMapping.end()) { - products.storedJMcCollisionsLabelTable(JMcCollisionIndex->second); - } - if (config.saveBCsTable) { - int32_t storedBCID = -1; - auto JBCIndex = bcMapping.find(collision.bcId()); - if (JBCIndex != bcMapping.end()) { - storedBCID = JBCIndex->second; - } - products.storedJCollisionsBunchCrossingIndexTable(storedBCID); - } - if (config.saveClustersTable) { - products.storedJCollisionsEMCalLabelTable(collision.isAmbiguous(), collision.isEmcalReadout()); - } - - const auto tracksPerCollision = tracks.sliceBy(TracksPerCollision, collision.globalIndex()); - for (const auto& track : tracksPerCollision) { - if (config.performTrackSelection && !(track.trackSel() & ~(1 << jetderiveddatautilities::JTrackSel::trackSign))) { // skips tracks that pass no selections. This might cause a problem with tracks matched with clusters. We should generate a track selection purely for cluster matched tracks so that they are kept - continue; - } - if (track.pt() < config.trackPtSelectionMin || std::abs(track.eta()) > config.trackEtaSelectionMax) { - continue; - } - products.storedJTracksTable(products.storedJCollisionsTable.lastIndex(), o2::math_utils::detail::truncateFloatFraction(track.pt(), precisionMomentumMask), o2::math_utils::detail::truncateFloatFraction(track.eta(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(track.phi(), precisionPositionMask), track.trackSel()); - products.storedJTracksExtraTable(o2::math_utils::detail::truncateFloatFraction(track.dcaX(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(track.dcaY(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(track.dcaZ(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(track.dcaXY(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(track.dcaXYZ(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(track.sigmadcaZ(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(track.sigmadcaXY(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(track.sigmadcaXYZ(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(track.sigma1Pt(), precisionMomentumMask)); - products.storedJTracksParentIndexTable(track.trackId()); - - if (track.has_mcParticle()) { - auto JParticleIndex = paticleMapping.find(track.mcParticleId()); - if (JParticleIndex != paticleMapping.end()) { - products.storedJMcTracksLabelTable(JParticleIndex->second); - } else { - products.storedJMcTracksLabelTable(-1); // this can happen because there are some tracks that are reconstucted in a wrong collision, but their original McCollision did not pass the required cuts so that McParticle is not saved. These are very few but we should look into them further and see what to do about them - } - } else { - products.storedJMcTracksLabelTable(-1); - } - trackMapping.insert(std::make_pair(track.globalIndex(), products.storedJTracksTable.lastIndex())); - } - if (config.saveClustersTable) { - const auto clustersPerCollision = clusters.sliceBy(ClustersPerCollision, collision.globalIndex()); - for (const auto& cluster : clustersPerCollision) { - products.storedJClustersTable(products.storedJCollisionsTable.lastIndex(), cluster.id(), cluster.energy(), cluster.coreEnergy(), cluster.rawEnergy(), - cluster.eta(), cluster.phi(), cluster.m02(), cluster.m20(), cluster.nCells(), cluster.time(), cluster.isExotic(), cluster.distanceToBadChannel(), - cluster.nlm(), cluster.definition(), cluster.leadingCellEnergy(), cluster.subleadingCellEnergy(), cluster.leadingCellNumber(), cluster.subleadingCellNumber()); - products.storedJClustersCorrectedEnergiesTable(cluster.energyCorrectedOneTrack1(), cluster.energyCorrectedOneTrack2(), cluster.energyCorrectedAllTracks1(), cluster.energyCorrectedAllTracks2()); - products.storedJClustersParentIndexTable(cluster.clusterId()); - - std::vector clusterStoredJTrackIDs; - for (const auto& clusterTrack : cluster.matchedTracks_as>()) { - auto JtrackIndex = trackMapping.find(clusterTrack.globalIndex()); - if (JtrackIndex != trackMapping.end()) { - clusterStoredJTrackIDs.push_back(JtrackIndex->second); - const auto emcTracksPerTrack = emcTracks.sliceBy(EMCTrackPerTrack, clusterTrack.globalIndex()); - auto emcTrackPerTrack = emcTracksPerTrack.iteratorAt(0); - products.storedJTracksEMCalTable(JtrackIndex->second, emcTrackPerTrack.etaEmcal(), emcTrackPerTrack.phiEmcal()); - } - } - products.storedJClustersMatchedTracksTable(clusterStoredJTrackIDs); - - std::vector clusterStoredJParticleIDs; - for (const auto& clusterParticleId : cluster.mcParticlesIds()) { - auto JParticleIndex = paticleMapping.find(clusterParticleId); - if (JParticleIndex != paticleMapping.end()) { - clusterStoredJParticleIDs.push_back(JParticleIndex->second); - } - } - std::vector amplitudeA; - auto amplitudeASpan = cluster.amplitudeA(); - std::copy(amplitudeASpan.begin(), amplitudeASpan.end(), std::back_inserter(amplitudeA)); - products.storedJMcClustersLabelTable(clusterStoredJParticleIDs, amplitudeA); - } - } - - if (config.saveD0Table) { - const auto d0CollisionsPerCollision = D0Collisions.sliceBy(D0CollisionsPerCollision, collision.globalIndex()); - int32_t collisionD0Index = -1; - for (const auto& d0CollisionPerCollision : d0CollisionsPerCollision) { // should only ever be one - jethfutilities::fillHFCollisionTable(d0CollisionPerCollision, products.storedD0CollisionsTable, collisionD0Index); - products.storedD0CollisionIdsTable(products.storedJCollisionsTable.lastIndex()); - D0CollisionMapping.insert(std::make_pair(d0CollisionPerCollision.globalIndex(), products.storedD0CollisionsTable.lastIndex())); - } - const auto d0sPerCollision = D0s.sliceBy(D0sPerCollision, collision.globalIndex()); - for (const auto& D0 : d0sPerCollision) { - int32_t D0Index = -1; - jethfutilities::fillHFCandidateTable(D0, collisionD0Index, products.storedD0sTable, products.storedD0ParsTable, products.storedD0ParExtrasTable, products.storedD0ParDaughtersDummyTable, products.storedD0SelsTable, products.storedD0MlsTable, products.storedD0MlDughtersDummyTable, products.storedD0McsTable, D0Index); - - int32_t prong0Id = -1; - int32_t prong1Id = -1; - auto JtrackIndex = trackMapping.find(D0.prong0Id()); - if (JtrackIndex != trackMapping.end()) { - prong0Id = JtrackIndex->second; - } - JtrackIndex = trackMapping.find(D0.prong1Id()); - if (JtrackIndex != trackMapping.end()) { - prong1Id = JtrackIndex->second; - } - products.storedD0IdsTable(products.storedJCollisionsTable.lastIndex(), prong0Id, prong1Id); - } - } - - if (config.saveLcTable) { - const auto lcCollisionsPerCollision = LcCollisions.sliceBy(LcCollisionsPerCollision, collision.globalIndex()); - int32_t collisionLcIndex = -1; - for (const auto& lcCollisionPerCollision : lcCollisionsPerCollision) { // should only ever be one - jethfutilities::fillHFCollisionTable(lcCollisionPerCollision, products.storedLcCollisionsTable, collisionLcIndex); - products.storedLcCollisionIdsTable(products.storedJCollisionsTable.lastIndex()); - LcCollisionMapping.insert(std::make_pair(lcCollisionPerCollision.globalIndex(), products.storedLcCollisionsTable.lastIndex())); - } - const auto lcsPerCollision = Lcs.sliceBy(LcsPerCollision, collision.globalIndex()); - for (const auto& Lc : lcsPerCollision) { - int32_t LcIndex = -1; - jethfutilities::fillHFCandidateTable(Lc, collisionLcIndex, products.storedLcsTable, products.storedLcParsTable, products.storedLcParExtrasTable, products.storedLcParDaughtersDummyTable, products.storedLcSelsTable, products.storedLcMlsTable, products.storedLcMlDughtersDummyTable, products.storedLcMcsTable, LcIndex); - - int32_t prong0Id = -1; - int32_t prong1Id = -1; - int32_t prong2Id = -1; - auto JtrackIndex = trackMapping.find(Lc.prong0Id()); - if (JtrackIndex != trackMapping.end()) { - prong0Id = JtrackIndex->second; - } - JtrackIndex = trackMapping.find(Lc.prong1Id()); - if (JtrackIndex != trackMapping.end()) { - prong1Id = JtrackIndex->second; - } - JtrackIndex = trackMapping.find(Lc.prong2Id()); - if (JtrackIndex != trackMapping.end()) { - prong2Id = JtrackIndex->second; - } - products.storedLcIdsTable(products.storedJCollisionsTable.lastIndex(), prong0Id, prong1Id, prong2Id); - } - } - - if (config.saveBplusTable) { - const auto lcCollisionsPerCollision = BplusCollisions.sliceBy(BplusCollisionsPerCollision, collision.globalIndex()); - int32_t collisionBplusIndex = -1; - for (const auto& lcCollisionPerCollision : lcCollisionsPerCollision) { // should only ever be one - jethfutilities::fillHFCollisionTable(lcCollisionPerCollision, products.storedBplusCollisionsTable, collisionBplusIndex); - products.storedBplusCollisionIdsTable(products.storedJCollisionsTable.lastIndex()); - BplusCollisionMapping.insert(std::make_pair(lcCollisionPerCollision.globalIndex(), products.storedBplusCollisionsTable.lastIndex())); - } - const auto lcsPerCollision = Bpluss.sliceBy(BplussPerCollision, collision.globalIndex()); - for (const auto& Bplus : lcsPerCollision) { - int32_t BplusIndex = -1; - jethfutilities::fillHFCandidateTable(Bplus, collisionBplusIndex, products.storedBplussTable, products.storedBplusParsTable, products.storedBplusParExtrasTable, products.storedBplusParD0sTable, products.storedBplusSelsTable, products.storedBplusMlsTable, products.storedBplusMlD0sTable, products.storedBplusMcsTable, BplusIndex); - - int32_t prong0Id = -1; - int32_t prong1Id = -1; - int32_t prong2Id = -1; - auto JtrackIndex = trackMapping.find(Bplus.prong0Id()); - if (JtrackIndex != trackMapping.end()) { - prong0Id = JtrackIndex->second; - } - JtrackIndex = trackMapping.find(Bplus.prong1Id()); - if (JtrackIndex != trackMapping.end()) { - prong1Id = JtrackIndex->second; - } - JtrackIndex = trackMapping.find(Bplus.prong2Id()); - if (JtrackIndex != trackMapping.end()) { - prong2Id = JtrackIndex->second; - } - products.storedBplusIdsTable(products.storedJCollisionsTable.lastIndex(), prong0Id, prong1Id, prong2Id); - } - } - - if (config.saveDielectronTable) { - const auto dielectronCollisionsPerCollision = DielectronCollisions.sliceBy(DielectronCollisionsPerCollision, collision.globalIndex()); - int32_t collisionDielectronIndex = -1; - for (const auto& dielectronCollisionPerCollision : dielectronCollisionsPerCollision) { // should only ever be one - jetdqutilities::fillDielectronCollisionTable(dielectronCollisionPerCollision, products.storedDielectronCollisionsTable, collisionDielectronIndex); - products.storedDielectronCollisionIdsTable(products.storedJCollisionsTable.lastIndex()); - // D0CollisionMapping.insert(std::make_pair(d0CollisionPerCollision.globalIndex(), products.storedD0CollisionsTable.lastIndex())); // if DielectronMCCollisions are indexed to Dielectron Collisions then this can be added - } - const auto dielectronsPerCollision = Dielectrons.sliceBy(DielectronsPerCollision, collision.globalIndex()); - for (const auto& Dielectron : dielectronsPerCollision) { - int32_t DielectronIndex = -1; - jetdqutilities::fillDielectronCandidateTable(Dielectron, collisionDielectronIndex, products.storedDielectronsTable, DielectronIndex); + PROCESS_SWITCH(JetDerivedDataWriter, processLcMCP, "write out Lc mcp output tables", false); - int32_t prong0Id = -1; - int32_t prong1Id = -1; - auto JtrackIndex = trackMapping.find(Dielectron.prong0Id()); - if (JtrackIndex != trackMapping.end()) { - prong0Id = JtrackIndex->second; - } - JtrackIndex = trackMapping.find(Dielectron.prong1Id()); - if (JtrackIndex != trackMapping.end()) { - prong1Id = JtrackIndex->second; - } - products.storedDielectronIdsTable(products.storedJCollisionsTable.lastIndex(), prong0Id, prong1Id); - } - } + void processBplusMCP(soa::Join const& mcCollisions, aod::McCollisionsBplus const& BplusMcCollisions, aod::CandidatesBplusMCP const& BplusParticles) + { + bplusMcCollisionMapping.clear(); + bplusMcCollisionMapping.resize(BplusMcCollisions.size(), -1); + for (auto const& mcCollision : mcCollisions) { + if (mcCollision.isMcCollisionSelected()) { + const auto bplusMcCollisionsPerMcCollision = BplusMcCollisions.sliceBy(BplusMcCollisionsPerMcCollision, mcCollision.globalIndex()); + for (const auto& bplusMcCollisionPerMcCollision : bplusMcCollisionsPerMcCollision) { // should only ever be one + jethfutilities::fillHFMcCollisionTable(bplusMcCollisionPerMcCollision, products.storedBplusMcCollisionsTable); + products.storedBplusMcCollisionIdsTable(mcCollisionMapping[mcCollision.globalIndex()]); + bplusMcCollisionMapping[bplusMcCollisionPerMcCollision.globalIndex()] = products.storedBplusMcCollisionsTable.lastIndex(); + } + const auto bplusParticlesPerMcCollision = BplusParticles.sliceBy(BplusParticlesPerMcCollision, mcCollision.globalIndex()); + for (const auto& BplusParticle : bplusParticlesPerMcCollision) { + jethfutilities::fillHFCandidateMcTable(BplusParticle, products.storedBplusMcCollisionsTable.lastIndex(), products.storedBplusParticlesTable); + products.storedBplusParticleIdsTable(mcCollisionMapping[mcCollision.globalIndex()], particleMapping[BplusParticle.mcParticleId()]); } + } + } + } + PROCESS_SWITCH(JetDerivedDataWriter, processBplusMCP, "write out Bplus mcp output tables", false); - if (config.saveD0Table) { - const auto d0McCollisionsPerMcCollision = D0McCollisions.sliceBy(D0McCollisionsPerMcCollision, mcCollision.globalIndex()); - for (const auto& d0McCollisionPerMcCollision : d0McCollisionsPerMcCollision) { // should just be one - std::vector d0CollisionIDs; - for (auto const& d0CollisionPerMcCollision : d0McCollisionPerMcCollision.template hfCollBases_as()) { - auto d0CollisionIndex = D0CollisionMapping.find(d0CollisionPerMcCollision.globalIndex()); - if (d0CollisionIndex != D0CollisionMapping.end()) { - d0CollisionIDs.push_back(d0CollisionIndex->second); - } - } - products.storedD0McCollisionsMatchingTable(d0CollisionIDs); - } - } + void processDielectronMCP(soa::Join::iterator const& mcCollision, aod::JMcParticles const&, aod::McCollisionsDielectron const& DielectronMcCollisions, aod::CandidatesDielectronMCP const& DielectronParticles) + { + if (mcCollision.isMcCollisionSelected()) { - if (config.saveLcTable) { - const auto lcMcCollisionsPerMcCollision = LcMcCollisions.sliceBy(LcMcCollisionsPerMcCollision, mcCollision.globalIndex()); - for (const auto& lcMcCollisionPerMcCollision : lcMcCollisionsPerMcCollision) { // should just be one - std::vector lcCollisionIDs; - for (auto const& lcCollisionPerMcCollision : lcMcCollisionPerMcCollision.template hfCollBases_as()) { - auto lcCollisionIndex = LcCollisionMapping.find(lcCollisionPerMcCollision.globalIndex()); - if (lcCollisionIndex != LcCollisionMapping.end()) { - lcCollisionIDs.push_back(lcCollisionIndex->second); - } - } - products.storedLcMcCollisionsMatchingTable(lcCollisionIDs); + const auto dielectronMcCollisionsPerMcCollision = DielectronMcCollisions.sliceBy(DielectronMcCollisionsPerMcCollision, mcCollision.globalIndex()); + for (const auto& dielectronMcCollisionPerMcCollision : dielectronMcCollisionsPerMcCollision) { // should only ever be one + jetdqutilities::fillDielectronMcCollisionTable(dielectronMcCollisionPerMcCollision, products.storedDielectronMcCollisionsTable); + products.storedDielectronMcCollisionIdsTable(mcCollisionMapping[mcCollision.globalIndex()]); + } + for (const auto& DielectronParticle : DielectronParticles) { + jetdqutilities::fillDielectronCandidateMcTable(DielectronParticle, products.storedDielectronMcCollisionsTable.lastIndex(), products.storedDielectronParticlesTable); + std::vector DielectronMothersIds; + int DielectronDaughtersId[2]; + if (DielectronParticle.has_mothers()) { + for (auto const& DielectronMother : DielectronParticle.template mothers_as()) { + DielectronMothersIds.push_back(particleMapping[DielectronMother.globalIndex()]); } } - - if (config.saveBplusTable) { - const auto lcMcCollisionsPerMcCollision = BplusMcCollisions.sliceBy(BplusMcCollisionsPerMcCollision, mcCollision.globalIndex()); - for (const auto& lcMcCollisionPerMcCollision : lcMcCollisionsPerMcCollision) { // should just be one - std::vector lcCollisionIDs; - for (auto const& lcCollisionPerMcCollision : lcMcCollisionPerMcCollision.template hfCollBases_as()) { - auto lcCollisionIndex = BplusCollisionMapping.find(lcCollisionPerMcCollision.globalIndex()); - if (lcCollisionIndex != BplusCollisionMapping.end()) { - lcCollisionIDs.push_back(lcCollisionIndex->second); - } + auto i = 0; + if (DielectronParticle.has_daughters()) { + for (auto const& DielectronDaughter : DielectronParticle.template daughters_as()) { + if (i > 1) { + break; } - products.storedBplusMcCollisionsMatchingTable(lcCollisionIDs); + DielectronDaughtersId[i] = particleMapping[DielectronDaughter.globalIndex()]; + i++; } } + products.storedDielectronParticleIdsTable(mcCollisionMapping[mcCollision.globalIndex()], particleMapping[DielectronParticle.mcParticleId()], DielectronMothersIds, DielectronDaughtersId); } } } - // process switch for output writing must be last - // to run after all jet selections - PROCESS_SWITCH(JetDerivedDataWriter, processStoreMC, "write out data output tables for mc", false); + PROCESS_SWITCH(JetDerivedDataWriter, processDielectronMCP, "write out Dielectron mcp output tables", false); - void processStoreMCP(soa::Join const& mcCollisions, soa::Join const& particles, aod::McCollisionsD0 const& D0McCollisions, aod::CandidatesD0MCP const& D0Particles, aod::McCollisionsLc const& LcMcCollisions, aod::CandidatesLcMCP const& LcParticles, aod::McCollisionsBplus const& BplusMcCollisions, aod::CandidatesBplusMCP const& BplusParticles, aod::McCollisionsDielectron const& DielectronMcCollisions, aod::CandidatesDielectronMCP const& DielectronParticles) + void processColllisonsMcCollisionLabel(soa::Join::iterator const& collision) { + if (collision.isCollisionSelected()) { + products.storedJMcCollisionsLabelTable(mcCollisionMapping[collision.mcCollisionId()]); + } + } + PROCESS_SWITCH(JetDerivedDataWriter, processColllisonsMcCollisionLabel, "write out collision mcCollision label output tables", false); - int particleTableIndex = 0; - for (auto mcCollision : mcCollisions) { - if (McCollisionFlag[mcCollision.globalIndex()]) { // you can also check if any of its detector level counterparts are correct - std::map paticleMapping; - - products.storedJMcCollisionsTable(mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), mcCollision.weight(), mcCollision.subGeneratorId()); - products.storedJMcCollisionsParentIndexTable(mcCollision.mcCollisionId()); - - const auto particlesPerMcCollision = particles.sliceBy(ParticlesPerMcCollision, mcCollision.globalIndex()); - - for (auto particle : particlesPerMcCollision) { - paticleMapping.insert(std::make_pair(particle.globalIndex(), particleTableIndex)); - particleTableIndex++; + void processTracksMcParticleLabel(soa::Join::iterator const& collision, soa::Join const& tracks) + { + if (collision.isCollisionSelected()) { + for (const auto& track : tracks) { + if (!trackSelection(track)) { + continue; } - for (auto particle : particlesPerMcCollision) { - std::vector mothersId; - int daughtersId[2]; - if (particle.has_mothers()) { - for (auto const& mother : particle.template mothers_as>()) { - auto JMotherIndex = paticleMapping.find(mother.globalIndex()); - if (JMotherIndex != paticleMapping.end()) { - mothersId.push_back(JMotherIndex->second); - } - } - } - auto i = 0; - if (particle.has_daughters()) { - for (auto const& daughter : particle.template daughters_as>()) { - if (i > 1) { - break; - } - auto JDaughterIndex = paticleMapping.find(daughter.globalIndex()); - if (JDaughterIndex != paticleMapping.end()) { - daughtersId[i] = JDaughterIndex->second; - } - i++; - } - } - products.storedJMcParticlesTable(products.storedJMcCollisionsTable.lastIndex(), o2::math_utils::detail::truncateFloatFraction(particle.pt(), precisionMomentumMask), o2::math_utils::detail::truncateFloatFraction(particle.eta(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(particle.phi(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(particle.y(), precisionPositionMask), o2::math_utils::detail::truncateFloatFraction(particle.e(), precisionMomentumMask), particle.pdgCode(), particle.getGenStatusCode(), particle.getHepMCStatusCode(), particle.isPhysicalPrimary(), mothersId, daughtersId); - products.storedJParticlesParentIndexTable(particle.mcParticleId()); + if (track.has_mcParticle()) { + products.storedJMcTracksLabelTable(particleMapping[track.mcParticleId()]); + } else { + products.storedJMcTracksLabelTable(-1); } + } + } + } + PROCESS_SWITCH(JetDerivedDataWriter, processTracksMcParticleLabel, "write out track mcParticle label output tables", false); - if (config.saveD0Table) { - const auto d0McCollisionsPerMcCollision = D0McCollisions.sliceBy(D0McCollisionsPerMcCollision, mcCollision.globalIndex()); - int32_t mcCollisionD0Index = -1; - for (const auto& d0McCollisionPerMcCollision : d0McCollisionsPerMcCollision) { // should only ever be one - jethfutilities::fillHFMcCollisionTable(d0McCollisionPerMcCollision, products.storedD0McCollisionsTable, mcCollisionD0Index); - products.storedD0McCollisionIdsTable(products.storedJMcCollisionsTable.lastIndex()); - } - for (const auto& D0Particle : D0Particles) { - int32_t D0ParticleIndex = -1; - jethfutilities::fillHFCandidateMcTable(D0Particle, mcCollisionD0Index, products.storedD0ParticlesTable, D0ParticleIndex); - int32_t D0ParticleId = -1; - auto JParticleIndex = paticleMapping.find(D0Particle.mcParticleId()); - if (JParticleIndex != paticleMapping.end()) { - D0ParticleId = JParticleIndex->second; - } - products.storedD0ParticleIdsTable(products.storedJMcCollisionsTable.lastIndex(), D0ParticleId); - } - } - if (config.saveLcTable) { - const auto lcMcCollisionsPerMcCollision = LcMcCollisions.sliceBy(LcMcCollisionsPerMcCollision, mcCollision.globalIndex()); - int32_t mcCollisionLcIndex = -1; - for (const auto& lcMcCollisionPerMcCollision : lcMcCollisionsPerMcCollision) { // should only ever be one - jethfutilities::fillHFMcCollisionTable(lcMcCollisionPerMcCollision, products.storedLcMcCollisionsTable, mcCollisionLcIndex); - products.storedLcMcCollisionIdsTable(products.storedJMcCollisionsTable.lastIndex()); - } - for (const auto& LcParticle : LcParticles) { - int32_t LcParticleIndex = -1; - jethfutilities::fillHFCandidateMcTable(LcParticle, mcCollisionLcIndex, products.storedLcParticlesTable, LcParticleIndex); - int32_t LcParticleId = -1; - auto JParticleIndex = paticleMapping.find(LcParticle.mcParticleId()); - if (JParticleIndex != paticleMapping.end()) { - LcParticleId = JParticleIndex->second; - } - products.storedLcParticleIdsTable(products.storedJMcCollisionsTable.lastIndex(), LcParticleId); - } + void processClusterMcLabel(soa::Join::iterator const& collision, soa::Join const& clusters) + { + if (collision.isCollisionSelected()) { + for (const auto& cluster : clusters) { + std::vector clusterStoredJParticleIDs; + for (const auto& clusterParticleId : cluster.mcParticlesIds()) { + clusterStoredJParticleIDs.push_back(particleMapping[clusterParticleId]); + } + std::vector amplitudeA; + auto amplitudeASpan = cluster.amplitudeA(); + std::copy(amplitudeASpan.begin(), amplitudeASpan.end(), std::back_inserter(amplitudeA)); + products.storedJMcClustersLabelTable(clusterStoredJParticleIDs, amplitudeA); + } + } + } + PROCESS_SWITCH(JetDerivedDataWriter, processClusterMcLabel, "write out cluster mc label output tables", false); + + void processD0McCollisionMatch(soa::Join::iterator const& mcCollision, soa::Join const& D0McCollisions, aod::CollisionsD0 const&) + { + if (mcCollision.isMcCollisionSelected()) { + for (const auto& D0McCollision : D0McCollisions) { // should just be one + std::vector d0CollisionIDs; + for (auto const& d0CollisionPerMcCollision : D0McCollision.hfCollBases_as()) { + d0CollisionIDs.push_back(d0McCollisionMapping[d0CollisionPerMcCollision.globalIndex()]); } - if (config.saveBplusTable) { - const auto lcMcCollisionsPerMcCollision = BplusMcCollisions.sliceBy(BplusMcCollisionsPerMcCollision, mcCollision.globalIndex()); - int32_t mcCollisionBplusIndex = -1; - for (const auto& lcMcCollisionPerMcCollision : lcMcCollisionsPerMcCollision) { // should only ever be one - jethfutilities::fillHFMcCollisionTable(lcMcCollisionPerMcCollision, products.storedBplusMcCollisionsTable, mcCollisionBplusIndex); - products.storedBplusMcCollisionIdsTable(products.storedJMcCollisionsTable.lastIndex()); - } - for (const auto& BplusParticle : BplusParticles) { - int32_t BplusParticleIndex = -1; - jethfutilities::fillHFCandidateMcTable(BplusParticle, mcCollisionBplusIndex, products.storedBplusParticlesTable, BplusParticleIndex); - int32_t BplusParticleId = -1; - auto JParticleIndex = paticleMapping.find(BplusParticle.mcParticleId()); - if (JParticleIndex != paticleMapping.end()) { - BplusParticleId = JParticleIndex->second; - } - products.storedBplusParticleIdsTable(products.storedJMcCollisionsTable.lastIndex(), BplusParticleId); - } + products.storedD0McCollisionsMatchingTable(d0CollisionIDs); + } + } + } + PROCESS_SWITCH(JetDerivedDataWriter, processD0McCollisionMatch, "write out D0 McCollision collision label output tables", false); + + void processLcMcCollisionMatch(soa::Join::iterator const& mcCollision, soa::Join const& LcMcCollisions, aod::CollisionsLc const&) + { + if (mcCollision.isMcCollisionSelected()) { + for (const auto& LcMcCollision : LcMcCollisions) { // should just be one + std::vector lcCollisionIDs; + for (auto const& lcCollisionPerMcCollision : LcMcCollision.hfCollBases_as()) { + lcCollisionIDs.push_back(lcMcCollisionMapping[lcCollisionPerMcCollision.globalIndex()]); } - if (config.saveDielectronTable) { - const auto dielectronMcCollisionsPerMcCollision = DielectronMcCollisions.sliceBy(DielectronMcCollisionsPerMcCollision, mcCollision.globalIndex()); - int32_t mcCollisionDielectronIndex = -1; - for (const auto& dielectronMcCollisionPerMcCollision : dielectronMcCollisionsPerMcCollision) { // should only ever be one - jetdqutilities::fillDielectronMcCollisionTable(dielectronMcCollisionPerMcCollision, products.storedDielectronMcCollisionsTable, mcCollisionDielectronIndex); - products.storedDielectronMcCollisionIdsTable(products.storedJMcCollisionsTable.lastIndex()); - } - for (const auto& DielectronParticle : DielectronParticles) { - int32_t DielectronParticleIndex = -1; - jetdqutilities::fillDielectronCandidateMcTable(DielectronParticle, mcCollisionDielectronIndex, products.storedDielectronParticlesTable, DielectronParticleIndex); - int32_t DielectronParticleId = -1; - auto JParticleIndex = paticleMapping.find(DielectronParticle.mcParticleId()); - if (JParticleIndex != paticleMapping.end()) { - DielectronParticleId = JParticleIndex->second; - } - std::vector DielectronMothersId; - int DielectronDaughtersId[2]; - if (DielectronParticle.has_mothers()) { - for (auto const& DielectronMother : DielectronParticle.template mothers_as>()) { - auto JDielectronMotherIndex = paticleMapping.find(DielectronMother.globalIndex()); - if (JDielectronMotherIndex != paticleMapping.end()) { - DielectronMothersId.push_back(JDielectronMotherIndex->second); - } - } - } - auto i = 0; - if (DielectronParticle.has_daughters()) { - for (auto const& DielectronDaughter : DielectronParticle.template daughters_as>()) { - if (i > 1) { - break; - } - auto JDielectronDaughterIndex = paticleMapping.find(DielectronDaughter.globalIndex()); - if (JDielectronDaughterIndex != paticleMapping.end()) { - DielectronDaughtersId[i] = JDielectronDaughterIndex->second; - } - i++; - } - } - products.storedDielectronParticleIdsTable(products.storedJMcCollisionsTable.lastIndex(), DielectronParticleId, DielectronMothersId, DielectronDaughtersId); - } + products.storedLcMcCollisionsMatchingTable(lcCollisionIDs); + } + } + } + PROCESS_SWITCH(JetDerivedDataWriter, processLcMcCollisionMatch, "write out Lc McCollision collision label output tables", false); + + void processBplusMcCollisionMatch(soa::Join::iterator const& mcCollision, soa::Join const& BplusMcCollisions, aod::CollisionsBplus const&) + { + if (mcCollision.isMcCollisionSelected()) { + for (const auto& BplusMcCollision : BplusMcCollisions) { // should just be one + std::vector bplusCollisionIDs; + for (auto const& bplusCollisionPerMcCollision : BplusMcCollision.hfCollBases_as()) { + bplusCollisionIDs.push_back(bplusMcCollisionMapping[bplusCollisionPerMcCollision.globalIndex()]); } + products.storedBplusMcCollisionsMatchingTable(bplusCollisionIDs); } } } - // process switch for output writing must be last - // to run after all jet selections - PROCESS_SWITCH(JetDerivedDataWriter, processStoreMCP, "write out data output tables for mcp", false); + PROCESS_SWITCH(JetDerivedDataWriter, processBplusMcCollisionMatch, "write out Bplus McCollision collision label output tables", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) diff --git a/PWGJE/Tasks/jetSubstructureHFOutput.cxx b/PWGJE/Tasks/jetSubstructureHFOutput.cxx index 667ad11ef65..fd2c3e327c8 100644 --- a/PWGJE/Tasks/jetSubstructureHFOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureHFOutput.cxx @@ -15,6 +15,9 @@ // #include +#include +#include +#include #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" @@ -203,21 +206,21 @@ struct JetSubstructureHFOutputTask { continue; } int32_t candidateCollisionIndex = -1; - int32_t candidateIndex = -1; if constexpr (isMCP) { auto hfMcCollisionIndex = candidateMcCollisionMapping.find(jetcandidateutilities::getMcCandidateCollisionId(candidate)); if (hfMcCollisionIndex != candidateMcCollisionMapping.end()) { candidateCollisionIndex = hfMcCollisionIndex->second; } - jetcandidateutilities::fillCandidateMcTable(candidate, candidateCollisionIndex, hfParticlesTable, candidateIndex); + jetcandidateutilities::fillCandidateMcTable(candidate, candidateCollisionIndex, hfParticlesTable); + candidateMap.insert(std::make_pair(candidate.globalIndex(), hfParticlesTable.lastIndex())); } else { auto hfCollisionIndex = candidateCollisionMapping.find(jetcandidateutilities::getCandidateCollisionId(candidate)); if (hfCollisionIndex != candidateCollisionMapping.end()) { candidateCollisionIndex = hfCollisionIndex->second; } - jetcandidateutilities::fillCandidateTable(candidate, candidateCollisionIndex, candidateTable, candidateParsTable, candidateParExtrasTable, candidateParsDaughterTable, candidateSelsTable, candidateMlsTable, candidateMlsDaughterTable, candidateMcsTable, candidateIndex); + jetcandidateutilities::fillCandidateTable(candidate, candidateCollisionIndex, candidateTable, candidateParsTable, candidateParExtrasTable, candidateParsDaughterTable, candidateSelsTable, candidateMlsTable, candidateMlsDaughterTable, candidateMcsTable); + candidateMap.insert(std::make_pair(candidate.globalIndex(), candidateTable.lastIndex())); } - candidateMap.insert(std::make_pair(candidate.globalIndex(), candidateIndex)); } } } @@ -331,13 +334,12 @@ struct JetSubstructureHFOutputTask { for (const auto& collision : collisions) { if (collisionFlag[collision.globalIndex()]) { const auto hfCollisionsPerCollision = jetcandidateutilities::slicedPerCandidateCollision(hfCollisions, candidates, collision, D0CollisionsPerCollision, LcCollisionsPerCollision, BplusCollisionsPerCollision, DielectronCollisionsPerCollision); // add Bplus later - int32_t candidateCollisionIndex = -1; for (const auto& hfCollisionPerCollision : hfCollisionsPerCollision) { // should only ever be one auto hfCollisionTableIndex = candidateCollisionMapping.find(hfCollisionPerCollision.globalIndex()); if (hfCollisionTableIndex != candidateCollisionMapping.end()) { continue; } - jetcandidateutilities::fillCandidateCollisionTable(hfCollisionPerCollision, candidates, hfCollisionsTable, candidateCollisionIndex); + jetcandidateutilities::fillCandidateCollisionTable(hfCollisionPerCollision, candidates, hfCollisionsTable); candidateCollisionMapping.insert(std::make_pair(hfCollisionPerCollision.globalIndex(), hfCollisionsTable.lastIndex())); } } @@ -347,13 +349,12 @@ struct JetSubstructureHFOutputTask { for (const auto& mcCollision : mcCollisions) { if (mcCollisionFlag[mcCollision.globalIndex()]) { const auto hfMcCollisionsPerMcCollision = jetcandidateutilities::slicedPerCandidateCollision(hfMcCollisions, candidatesMCP, mcCollision, D0McCollisionsPerMcCollision, LcMcCollisionsPerMcCollision, BplusMcCollisionsPerMcCollision, DielectronMcCollisionsPerMcCollision); // add Bplus later - int32_t candidateMcCollisionIndex = -1; for (const auto& hfMcCollisionPerMcCollision : hfMcCollisionsPerMcCollision) { // should only ever be one auto hfMcCollisionTableIndex = candidateMcCollisionMapping.find(hfMcCollisionPerMcCollision.globalIndex()); if (hfMcCollisionTableIndex != candidateMcCollisionMapping.end()) { continue; } - jetcandidateutilities::fillCandidateMcCollisionTable(hfMcCollisionPerMcCollision, candidatesMCP, hfMcCollisionsTable, candidateMcCollisionIndex); + jetcandidateutilities::fillCandidateMcCollisionTable(hfMcCollisionPerMcCollision, candidatesMCP, hfMcCollisionsTable); candidateMcCollisionMapping.insert(std::make_pair(hfMcCollisionPerMcCollision.globalIndex(), hfMcCollisionsTable.lastIndex())); if constexpr (!isMCPOnly && (jethfutilities::isHFTable

() || jethfutilities::isHFMcTable())) { // the matching of mcCollision to Collision is only done for HF tables std::vector hfCollisionIDs; diff --git a/PWGJE/Tasks/jetSubstructureOutput.cxx b/PWGJE/Tasks/jetSubstructureOutput.cxx index ca20d891b95..602c6526523 100644 --- a/PWGJE/Tasks/jetSubstructureOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureOutput.cxx @@ -14,6 +14,11 @@ /// \author Nima Zardoshti // +#include +#include +#include +#include + #include "Framework/ASoA.h" #include "Framework/AnalysisDataModel.h" #include "Framework/AnalysisTask.h" From bd9159a414f081617041099600a4999e32fb672f Mon Sep 17 00:00:00 2001 From: alcaliva <32872606+alcaliva@users.noreply.github.com> Date: Fri, 7 Feb 2025 09:03:29 +0100 Subject: [PATCH 0086/1650] [PWGLF] updated jet selection (#9792) --- PWGLF/Tasks/Strangeness/strangenessInJets.cxx | 252 +++++++++--------- 1 file changed, 127 insertions(+), 125 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/strangenessInJets.cxx b/PWGLF/Tasks/Strangeness/strangenessInJets.cxx index 7ed62f0eae4..fcc3d333e0c 100644 --- a/PWGLF/Tasks/Strangeness/strangenessInJets.cxx +++ b/PWGLF/Tasks/Strangeness/strangenessInJets.cxx @@ -46,6 +46,7 @@ using namespace o2::aod; using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::constants::physics; +using namespace o2::constants::math; using std::array; using SelCollisions = soa::Join; @@ -67,6 +68,9 @@ struct StrangenessInJets { Configurable minNumberOfParticlesInJet{"minNumberOfParticlesInJet", 2, "Minimum number of particles inside jet"}; Configurable nJetsPerEventMax{"nJetsPerEventMax", 1000, "Maximum number of jets per event"}; Configurable requireNoOverlap{"requireNoOverlap", false, "require no overlap between jets and UE cones"}; + Configurable alpha{"alpha", 1.0, "Alpha"}; + Configurable averagePtUE{"averagePtUE", 0.1, "Average pt of UE"}; + Configurable averagePtUEMC{"averagePtUEMC", 0.1, "Average pt of UE in MC"}; Configurable par0{"par0", 0.004f, "par 0"}; Configurable par1{"par1", 0.013f, "par 1"}; // Axis parameters @@ -207,7 +211,10 @@ struct StrangenessInJets { registryQC.add("nJets_selected", "nJets_selected", HistType::kTH1F, {{10, 0, 10, "#it{n}_{Jet}"}}); registryQC.add("dcaxy_vs_pt", "dcaxy_vs_pt", HistType::kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); registryQC.add("dcaz_vs_pt", "dcaz_vs_pt", HistType::kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{z} (cm)"}}); + registryQC.add("jet_jet_overlaps", "jet_jet_overlaps", HistType::kTH2F, {{20, 0.0, 20.0, "#it{n}_{jet}"}, {200, 0.0, 200.0, "#it{n}_{overlaps}"}}); registryQC.add("jet_ue_overlaps", "jet_ue_overlaps", HistType::kTH2F, {{20, 0.0, 20.0, "#it{n}_{jet}"}, {200, 0.0, 200.0, "#it{n}_{overlaps}"}}); + registryQC.add("ue_ue_overlaps", "ue_ue_overlaps", HistType::kTH2F, {{20, 0.0, 20.0, "#it{n}_{jet}"}, {200, 0.0, 200.0, "#it{n}_{overlaps}"}}); + registryQC.add("tot_overlaps", "tot_overlaps", HistType::kTH2F, {{20, 0.0, 20.0, "#it{n}_{jet}"}, {200, 0.0, 200.0, "#it{n}_{overlaps}"}}); registryQC.add("survivedK0", "survivedK0", HistType::kTH1F, {{20, 0, 20, "step"}}); // Multiplicity Binning @@ -360,17 +367,28 @@ struct StrangenessInJets { } } - template - bool passedTrackSelectionForJetReconstruction(const chargedTrack& track) + // ITS Hit + template + bool hasITSHit(T const& track, int layer) + { + int ibit = layer - 1; + return (track.itsClusterMap() & (1 << ibit)); + } + + // Single-Track Selection for Particles inside Jets + template + bool passedTrackSelectionForJetReconstruction(const T1& track) { if (!track.hasITS()) return false; - if (track.itsNCls() < 3) + if ((!hasITSHit(track, 1)) && (!hasITSHit(track, 2)) && (!hasITSHit(track, 3))) return false; if (!track.hasTPC()) return false; if (track.tpcNClsCrossedRows() < 70) return false; + if (track.tpcNClsCrossedRows() / track.tpcNClsFindable() < 0.8) + return false; if (track.tpcChi2NCl() > 4) return false; if (track.itsChi2NCl() > 36) @@ -379,9 +397,9 @@ struct StrangenessInJets { return false; if (track.pt() < 0.15) return false; - if (std::fabs(track.dcaXY()) > (par0 + par1 / track.pt())) + if (std::fabs(track.dcaXY()) > 0.25) return false; - if (std::fabs(track.dcaZ()) > (par0 + par1 / track.pt())) + if (std::fabs(track.dcaZ()) > 2.0) return false; return true; } @@ -892,6 +910,12 @@ struct StrangenessInJets { return false; } + double getCorrectedPt(double ptRec) + { + // to be developed + return ptRec; + } + void getReweightingHistograms(o2::framework::Service const& ccdbObj) { auto getWeightHistoObj = [&](Configurable name, TH2F*& histo) { @@ -977,6 +1001,7 @@ struct StrangenessInJets { // List of Tracks std::vector trk; + std::vector ntrk; for (const auto& track : tracks) { @@ -985,13 +1010,19 @@ struct StrangenessInJets { TVector3 momentum(track.px(), track.py(), track.pz()); trk.push_back(momentum); + ntrk.push_back(1); } + // Reject Empty Events + if (static_cast(trk.size()) < 1) + return; + registryData.fill(HIST("number_of_events_data"), 3.5); // Anti-kt Jet Finder int nParticlesRemoved(0); std::vector jet; std::vector ue1; std::vector ue2; + std::vector nParticlesInjet; do { double dijMin(1e+06), diBmin(1e+06); @@ -1017,11 +1048,14 @@ struct StrangenessInJets { } if (dijMin < diBmin) { trk[iMin] = trk[iMin] + trk[jMin]; + ntrk[iMin] = ntrk[iMin] + ntrk[jMin]; trk[jMin].SetXYZ(0, 0, 0); + ntrk[jMin] = 0; nParticlesRemoved++; } if (dijMin > diBmin) { jet.push_back(trk[iBmin]); + nParticlesInjet.push_back(ntrk[iBmin]); trk[iBmin].SetXYZ(0, 0, 0); nParticlesRemoved++; } @@ -1030,14 +1064,16 @@ struct StrangenessInJets { // Jet Selection std::vector isSelected; - for (int i = 0; i < static_cast(jet.size()); i++) { - isSelected.push_back(0); - } - int nJetsSelected(0); - for (int i = 0; i < static_cast(jet.size()); i++) { + for (int i = 0; i < static_cast(jet.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] - if ((std::fabs(jet[i].Eta()) + rJet) > etaMax) + // Initialization + isSelected.push_back(0); + + // Jet fully contained inside acceptance + if ((std::fabs(jet[i].Eta()) + rJet) > (etaMax - 0.5)) + continue; + if (nParticlesInjet[i] < minNumberOfParticlesInJet) continue; // Perpendicular cones @@ -1048,58 +1084,38 @@ struct StrangenessInJets { ue1.push_back(ueAxis1); ue2.push_back(ueAxis2); - double nPartJetPlusUE(0); - double nPartJet(0); - double nPartUE(0); - double ptJetPlusUE(0); - double ptJet(0); double ptUE(0); - - for (const auto& track : tracks) { + for (auto track : tracks) { // o2-linter: disable=[const-ref-in-for-loop] if (!passedTrackSelectionForJetReconstruction(track)) continue; TVector3 selectedTrack(track.px(), track.py(), track.pz()); - double deltaEtaJet = selectedTrack.Eta() - jet[i].Eta(); - double deltaPhiJet = getDeltaPhi(selectedTrack.Phi(), jet[i].Phi()); - double deltaRjet = std::sqrt(deltaEtaJet * deltaEtaJet + deltaPhiJet * deltaPhiJet); double deltaEtaUe1 = selectedTrack.Eta() - ueAxis1.Eta(); double deltaPhiUe1 = getDeltaPhi(selectedTrack.Phi(), ueAxis1.Phi()); - double deltaRue1 = std::sqrt(deltaEtaUe1 * deltaEtaUe1 + deltaPhiUe1 * deltaPhiUe1); + double deltaRUe1 = std::sqrt(deltaEtaUe1 * deltaEtaUe1 + deltaPhiUe1 * deltaPhiUe1); double deltaEtaUe2 = selectedTrack.Eta() - ueAxis2.Eta(); double deltaPhiUe2 = getDeltaPhi(selectedTrack.Phi(), ueAxis2.Phi()); - double deltaRue2 = std::sqrt(deltaEtaUe2 * deltaEtaUe2 + deltaPhiUe2 * deltaPhiUe2); + double deltaRUe2 = std::sqrt(deltaEtaUe2 * deltaEtaUe2 + deltaPhiUe2 * deltaPhiUe2); - if (deltaRjet < rJet) { - registryQC.fill(HIST("deltaEtadeltaPhiJet"), deltaEtaJet, deltaPhiJet); - nPartJetPlusUE++; - ptJetPlusUE = ptJetPlusUE + selectedTrack.Pt(); - } - if (deltaRue1 < rJet) { + if (deltaRUe1 < alpha * rJet) { registryQC.fill(HIST("deltaEtadeltaPhi_ue"), deltaEtaUe1, deltaPhiUe1); - nPartUE++; ptUE = ptUE + selectedTrack.Pt(); } - if (deltaRue2 < rJet) { - registryQC.fill(HIST("deltaEtadeltaPhi_ue"), deltaEtaUe1, deltaPhiUe1); - nPartUE++; + if (deltaRUe2 < alpha * rJet) { + registryQC.fill(HIST("deltaEtadeltaPhi_ue"), deltaEtaUe2, deltaPhiUe2); ptUE = ptUE + selectedTrack.Pt(); } } - nPartJet = nPartJetPlusUE - 0.5 * nPartUE; - ptJet = ptJetPlusUE - 0.5 * ptUE; - registryQC.fill(HIST("NchJetPlusUE"), nPartJetPlusUE); - registryQC.fill(HIST("NchJet"), nPartJet); - registryQC.fill(HIST("NchUE"), nPartUE); - registryQC.fill(HIST("sumPtJetPlusUE"), ptJetPlusUE); - registryQC.fill(HIST("sumPtJet"), ptJet); - registryQC.fill(HIST("sumPtUE"), ptUE); - - if (ptJetPlusUE < minimumJetPt) - continue; - if (nPartJetPlusUE < minNumberOfParticlesInJet) + registryQC.fill(HIST("sumPtUE"), 0.5 * ptUE); + registryQC.fill(HIST("NchJetPlusUE"), nParticlesInjet[i]); + + double ptJetRec = jet[i].Pt() - averagePtUE; + double ptJetCorr = getCorrectedPt(ptJetRec); + + if (ptJetCorr < minimumJetPt) continue; + nJetsSelected++; isSelected[i] = 1; } @@ -1107,36 +1123,41 @@ struct StrangenessInJets { if (nJetsSelected == 0) return; - registryData.fill(HIST("number_of_events_data"), 3.5); + registryData.fill(HIST("number_of_events_data"), 4.5); // Overlaps - int nOverlaps(0); + int nOverlapsJetJet(0); + int nOverlapsJetUe(0); + int nOverlapsUeUe(0); + int nOverlapsTot(0); for (int i = 0; i < static_cast(jet.size()); i++) { if (isSelected[i] == 0) continue; - for (int j = 0; j < static_cast(jet.size()); j++) { - if (isSelected[j] == 0 || i == j) + for (int j = (i + 1); j < static_cast(jet.size()); j++) { + if (isSelected[j] == 0) continue; if (overlap(jet[i], jet[j], rJet)) - nOverlaps++; + nOverlapsJetJet++; if (overlap(jet[i], ue1[j], rJet) || overlap(jet[i], ue2[j], rJet)) - nOverlaps++; - if (overlap(ue1[i], ue1[j], rJet) || overlap(ue1[i], ue2[j], rJet)) - nOverlaps++; - if (overlap(ue2[i], ue2[j], rJet)) - nOverlaps++; + nOverlapsJetUe++; + if (overlap(ue1[i], ue1[j], rJet) || overlap(ue1[i], ue2[j], rJet) || overlap(ue2[i], ue2[j], rJet)) + nOverlapsUeUe++; } } - registryQC.fill(HIST("jet_ue_overlaps"), nJetsSelected, nOverlaps); + nOverlapsTot = nOverlapsJetJet + nOverlapsJetUe + nOverlapsUeUe; + registryQC.fill(HIST("jet_jet_overlaps"), nJetsSelected, nOverlapsJetJet); + registryQC.fill(HIST("jet_ue_overlaps"), nJetsSelected, nOverlapsJetUe); + registryQC.fill(HIST("ue_ue_overlaps"), nJetsSelected, nOverlapsUeUe); + registryQC.fill(HIST("tot_overlaps"), nJetsSelected, nOverlapsTot); if (nJetsSelected > nJetsPerEventMax) return; - registryData.fill(HIST("number_of_events_data"), 4.5); + registryData.fill(HIST("number_of_events_data"), 5.5); - if (requireNoOverlap && nOverlaps > 0) + if (requireNoOverlap && nOverlapsTot > 0) return; - registryData.fill(HIST("number_of_events_data"), 5.5); + registryData.fill(HIST("number_of_events_data"), 6.5); // Event multiplicity float multiplicity = collision.centFT0M(); @@ -1871,32 +1892,33 @@ struct StrangenessInJets { // List of Tracks std::vector trk; + std::vector ntrk; for (const auto& particle : mcParticlesPerColl) { - int pdg = std::fabs(particle.pdgCode()); - // Select Primary Particles double dx = particle.vx() - mccollision.posX(); double dy = particle.vy() - mccollision.posY(); double dz = particle.vz() - mccollision.posZ(); double dcaxy = std::sqrt(dx * dx + dy * dy); double dcaz = std::fabs(dz); - if (particle.pt() < 0.15) - continue; - if (dcaxy > (par0 + par1 / particle.pt())) + if (dcaxy > 0.25) continue; - if (dcaz > (par0 + par1 / particle.pt())) + if (dcaz > 2.0) continue; if (std::fabs(particle.eta()) > 0.8) continue; + if (particle.pt() < 0.15) + continue; // PDG Selection + int pdg = std::fabs(particle.pdgCode()); if ((pdg != 11) && (pdg != 211) && (pdg != 321) && (pdg != 2212)) continue; TVector3 momentum(particle.px(), particle.py(), particle.pz()); trk.push_back(momentum); + ntrk.push_back(1); } // Anti-kt Jet Finder @@ -1904,6 +1926,7 @@ struct StrangenessInJets { std::vector jet; std::vector ue1; std::vector ue2; + std::vector nParticlesInjet; do { double dijMin(1e+06), diBmin(1e+06); @@ -1929,11 +1952,14 @@ struct StrangenessInJets { } if (dijMin < diBmin) { trk[iMin] = trk[iMin] + trk[jMin]; + ntrk[iMin] = ntrk[iMin] + ntrk[jMin]; trk[jMin].SetXYZ(0, 0, 0); + ntrk[jMin] = 0; nParticlesRemoved++; } if (dijMin > diBmin) { jet.push_back(trk[iBmin]); + nParticlesInjet.push_back(ntrk[iBmin]); trk[iBmin].SetXYZ(0, 0, 0); nParticlesRemoved++; } @@ -1941,14 +1967,16 @@ struct StrangenessInJets { // Jet Selection std::vector isSelected; - for (int i = 0; i < static_cast(jet.size()); i++) { - isSelected.push_back(0); - } - int nJetsSelected(0); - for (int i = 0; i < static_cast(jet.size()); i++) { + for (int i = 0; i < static_cast(jet.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] + + // Initialization + isSelected.push_back(0); - if ((std::fabs(jet[i].Eta()) + rJet) > etaMax) + // Jet fully contained inside acceptance + if ((std::fabs(jet[i].Eta()) + rJet) > (etaMax - 0.5)) + continue; + if (nParticlesInjet[i] < minNumberOfParticlesInJet) continue; // Perpendicular cones @@ -1959,66 +1987,40 @@ struct StrangenessInJets { ue1.push_back(ueAxis1); ue2.push_back(ueAxis2); - double nPartJetPlusUE(0); - double ptJetPlusUE(0); - // double ptJet(0); - double ptUE(0); + double ptJetCorr = jet[i].Pt() - averagePtUEMC; + if (ptJetCorr < minimumJetPt) + continue; - for (const auto& particle : mcParticlesPerColl) { + nJetsSelected++; + isSelected[i] = 1; + } + if (nJetsSelected == 0) + continue; - // Select Primary Particles - double dx = particle.vx() - mccollision.posX(); - double dy = particle.vy() - mccollision.posY(); - double dz = particle.vz() - mccollision.posZ(); - double dcaxy = std::sqrt(dx * dx + dy * dy); - double dcaz = std::fabs(dz); - if (particle.pt() < 0.15) - continue; - if (dcaxy > (par0 + par1 / particle.pt())) - continue; - if (dcaz > (par0 + par1 / particle.pt())) - continue; - if (std::fabs(particle.eta()) > 0.8) - continue; + // Overlaps + int nOverlapsJetJet(0); + int nOverlapsJetUe(0); + int nOverlapsUeUe(0); + int nOverlapsTot(0); + for (int i = 0; i < static_cast(jet.size()); i++) { + if (isSelected[i] == 0) + continue; - // PDG Selection - int pdg = std::fabs(particle.pdgCode()); - if ((pdg != 11) && (pdg != 211) && (pdg != 321) && (pdg != 2212)) + for (int j = (i + 1); j < static_cast(jet.size()); j++) { + if (isSelected[j] == 0) continue; - - TVector3 selectedTrack(particle.px(), particle.py(), particle.pz()); - - double deltaEtaJet = selectedTrack.Eta() - jet[i].Eta(); - double deltaPhiJet = getDeltaPhi(selectedTrack.Phi(), jet[i].Phi()); - double deltaRjet = std::sqrt(deltaEtaJet * deltaEtaJet + deltaPhiJet * deltaPhiJet); - double deltaEtaUe1 = selectedTrack.Eta() - ueAxis1.Eta(); - double deltaPhiUe1 = getDeltaPhi(selectedTrack.Phi(), ueAxis1.Phi()); - double deltaRue1 = std::sqrt(deltaEtaUe1 * deltaEtaUe1 + deltaPhiUe1 * deltaPhiUe1); - double deltaEtaUe2 = selectedTrack.Eta() - ueAxis2.Eta(); - double deltaPhiUe2 = getDeltaPhi(selectedTrack.Phi(), ueAxis2.Phi()); - double deltaRue2 = std::sqrt(deltaEtaUe2 * deltaEtaUe2 + deltaPhiUe2 * deltaPhiUe2); - - if (deltaRjet < rJet) { - nPartJetPlusUE++; - ptJetPlusUE = ptJetPlusUE + selectedTrack.Pt(); - } - if (deltaRue1 < rJet) { - ptUE = ptUE + selectedTrack.Pt(); - } - if (deltaRue2 < rJet) { - ptUE = ptUE + selectedTrack.Pt(); - } + if (overlap(jet[i], jet[j], rJet)) + nOverlapsJetJet++; + if (overlap(jet[i], ue1[j], rJet) || overlap(jet[i], ue2[j], rJet)) + nOverlapsJetUe++; + if (overlap(ue1[i], ue1[j], rJet) || overlap(ue1[i], ue2[j], rJet) || overlap(ue2[i], ue2[j], rJet)) + nOverlapsUeUe++; } - // ptJet = ptJetPlusUE - 0.5 * ptUE; - - if (ptJetPlusUE < minimumJetPt) - continue; - if (nPartJetPlusUE < minNumberOfParticlesInJet) - continue; - nJetsSelected++; - isSelected[i] = 1; } - if (nJetsSelected == 0) + nOverlapsTot = nOverlapsJetJet + nOverlapsJetUe + nOverlapsUeUe; + if (nJetsSelected > nJetsPerEventMax) + continue; + if (requireNoOverlap && nOverlapsTot > 0) continue; for (int i = 0; i < static_cast(jet.size()); i++) { From 39c5f22436124eb23b8849671222b57f0f7555aa Mon Sep 17 00:00:00 2001 From: mherzer <96999709+mherzer28@users.noreply.github.com> Date: Fri, 7 Feb 2025 10:13:44 +0100 Subject: [PATCH 0087/1650] [PWGLF] fix its cluster size cut (#9807) Co-authored-by: ALICE Action Bot --- PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx b/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx index 6d09ce20ee0..ca7ced2677c 100644 --- a/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx +++ b/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx @@ -377,7 +377,8 @@ struct TrHeAnalysis { histos.fill(HIST("histogram/cuts"), 7); continue; } - if (cfgCutMinItsClusterSizeH3 < getMeanItsClsSize(track) / std::cosh(track.eta()) && getMeanItsClsSize(track) / std::cosh(track.eta()) < cfgCutMaxItsClusterSizeH3) { + if (getMeanItsClsSize(track) / std::cosh(track.eta()) <= cfgCutMinItsClusterSizeH3 || + getMeanItsClsSize(track) / std::cosh(track.eta()) >= cfgCutMaxItsClusterSizeH3) { histos.fill(HIST("histogram/cuts"), 12); continue; } @@ -422,7 +423,8 @@ struct TrHeAnalysis { histos.fill(HIST("histogram/cuts"), 7); continue; } - if (cfgCutMinItsClusterSizeHe < getMeanItsClsSize(track) / std::cosh(track.eta()) && getMeanItsClsSize(track) / std::cosh(track.eta()) < cfgCutMaxItsClusterSizeHe) { + if (getMeanItsClsSize(track) / std::cosh(track.eta()) <= cfgCutMinItsClusterSizeHe || + getMeanItsClsSize(track) / std::cosh(track.eta()) >= cfgCutMaxItsClusterSizeHe) { histos.fill(HIST("histogram/cuts"), 12); continue; } @@ -524,7 +526,8 @@ struct TrHeAnalysis { histos.fill(HIST("histogram/cuts"), 7); continue; } - if (cfgCutMinItsClusterSizeH3 < getMeanItsClsSize(track) / std::cosh(track.eta()) && getMeanItsClsSize(track) / std::cosh(track.eta()) < cfgCutMaxItsClusterSizeH3) { + if (getMeanItsClsSize(track) / std::cosh(track.eta()) <= cfgCutMinItsClusterSizeH3 || + getMeanItsClsSize(track) / std::cosh(track.eta()) >= cfgCutMaxItsClusterSizeH3) { histos.fill(HIST("histogram/cuts"), 12); continue; } @@ -568,7 +571,8 @@ struct TrHeAnalysis { histos.fill(HIST("histogram/cuts"), 7); continue; } - if (cfgCutMinItsClusterSizeHe < getMeanItsClsSize(track) / std::cosh(track.eta()) && getMeanItsClsSize(track) / std::cosh(track.eta()) < cfgCutMaxItsClusterSizeHe) { + if (getMeanItsClsSize(track) / std::cosh(track.eta()) <= cfgCutMinItsClusterSizeHe || + getMeanItsClsSize(track) / std::cosh(track.eta()) >= cfgCutMaxItsClusterSizeHe) { histos.fill(HIST("histogram/cuts"), 12); continue; } From 20d2172275e83d73a26993858aef39f72097a3a4 Mon Sep 17 00:00:00 2001 From: ilikmeta <152337132+ilikmeta@users.noreply.github.com> Date: Fri, 7 Feb 2025 11:40:26 +0200 Subject: [PATCH 0088/1650] [PWGCF] Add Nch histogram. (#9806) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/flowGfwTask.cxx | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowGfwTask.cxx b/PWGCF/Flow/Tasks/flowGfwTask.cxx index 48e0bd1620a..fd256b810a7 100644 --- a/PWGCF/Flow/Tasks/flowGfwTask.cxx +++ b/PWGCF/Flow/Tasks/flowGfwTask.cxx @@ -63,11 +63,11 @@ struct FlowGfwTask { O2_DEFINE_CONFIGURABLE(cfgCutITSclu, float, 5.0f, "minimum ITS clusters") O2_DEFINE_CONFIGURABLE(cfgMinCentFT0C, float, 0.0f, "Minimum FT0C Centrality") O2_DEFINE_CONFIGURABLE(cfgMaxCentFT0C, float, 100.0f, "Maximum FT0C Centrality") - O2_DEFINE_CONFIGURABLE(cfgUseAdditionalEventCut, bool, true, "Use additional event cut on mult correlations") - O2_DEFINE_CONFIGURABLE(cfgUseAdditionalTrackCut, bool, true, "Use additional track cut on phi") - O2_DEFINE_CONFIGURABLE(cfgUseNch, bool, true, "Use Nch for flow observables") + O2_DEFINE_CONFIGURABLE(cfgUseAdditionalEventCut, bool, false, "Use additional event cut on mult correlations") + O2_DEFINE_CONFIGURABLE(cfgUseAdditionalTrackCut, bool, false, "Use additional track cut on phi") + O2_DEFINE_CONFIGURABLE(cfgUseNch, bool, false, "Use Nch for flow observables") O2_DEFINE_CONFIGURABLE(cfgNbootstrap, int, 10, "Number of subsamples") - O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeights, bool, true, "Fill and output NUA weights") + O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeights, bool, false, "Fill and output NUA weights") O2_DEFINE_CONFIGURABLE(cfgEfficiency, std::string, "", "CCDB path to efficiency object") O2_DEFINE_CONFIGURABLE(cfgAcceptance, std::string, "", "CCDB path to acceptance object") O2_DEFINE_CONFIGURABLE(cfgMagnetField, std::string, "GLO/Config/GRPMagField", "CCDB path to Magnet field object") @@ -75,14 +75,14 @@ struct FlowGfwTask { O2_DEFINE_CONFIGURABLE(cfgCutOccupancyLow, int, 0, "Low cut on TPC occupancy") O2_DEFINE_CONFIGURABLE(cfgCutDCAz, float, 2, "Custom DCA Z cut") O2_DEFINE_CONFIGURABLE(cfgCutDCAxy, float, 0.2f, "Custom DCA XY cut") - O2_DEFINE_CONFIGURABLE(cfgNoTimeFrameBorder, bool, true, "kNoTimeFrameBorder"); - O2_DEFINE_CONFIGURABLE(cfgNoITSROFrameBorder, bool, true, "kNoITSROFrameBorder"); - O2_DEFINE_CONFIGURABLE(cfgNoSameBunchPileup, bool, true, "kNoSameBunchPileup"); - O2_DEFINE_CONFIGURABLE(cfgIsGoodZvtxFT0vsPV, bool, true, "kIsGoodZvtxFT0vsPV"); - O2_DEFINE_CONFIGURABLE(cfgNoCollInTimeRangeStandard, bool, true, "kNoCollInTimeRangeStandard"); - O2_DEFINE_CONFIGURABLE(cfgEvSelkIsGoodITSLayersAll, bool, true, "kIsGoodITSLayersAll") - O2_DEFINE_CONFIGURABLE(cfgOccupancy, bool, true, "Bool for event selection on detector occupancy"); - O2_DEFINE_CONFIGURABLE(cfgMultCut, bool, true, "Use additional event cut on mult correlations"); + O2_DEFINE_CONFIGURABLE(cfgNoTimeFrameBorder, bool, false, "kNoTimeFrameBorder"); + O2_DEFINE_CONFIGURABLE(cfgNoITSROFrameBorder, bool, false, "kNoITSROFrameBorder"); + O2_DEFINE_CONFIGURABLE(cfgNoSameBunchPileup, bool, false, "kNoSameBunchPileup"); + O2_DEFINE_CONFIGURABLE(cfgIsGoodZvtxFT0vsPV, bool, false, "kIsGoodZvtxFT0vsPV"); + O2_DEFINE_CONFIGURABLE(cfgNoCollInTimeRangeStandard, bool, false, "kNoCollInTimeRangeStandard"); + O2_DEFINE_CONFIGURABLE(cfgEvSelkIsGoodITSLayersAll, bool, false, "kIsGoodITSLayersAll") + O2_DEFINE_CONFIGURABLE(cfgOccupancy, bool, false, "Bool for event selection on detector occupancy"); + O2_DEFINE_CONFIGURABLE(cfgMultCut, bool, false, "Use additional event cut on mult correlations"); O2_DEFINE_CONFIGURABLE(FineBinning, bool, false, "Manually change to fine binning") O2_DEFINE_CONFIGURABLE(cfgTrackSelRun3ITSMatch, bool, false, "System check: Run3ITSMatch") O2_DEFINE_CONFIGURABLE(cfgTrackSel, bool, false, "System check: track selection") @@ -268,6 +268,7 @@ struct FlowGfwTask { registry.add("ZNvsZEMcollrest", "ZNvsZEMcoll; ZEM; ZDC energy (GeV)", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); // Track plots + registry.add("Nch", "N_{ch 0-5%} vs #Events of;N_{ch 0-5%};No. of Events", {HistType::kTH1D, {axisNch}}); registry.add("Events_per_Centrality_Bin", "Events_per_Centrality_Bin;Centrality FT0C;No. of Events", kTH1F, {axisCentrality}); registry.add("Global_Tracks_Nch_vs_Cent", "Global Tracks;Centrality (%); M (|#eta| < 0.8);", {HistType::kTH2D, {axisCentrality, axisNch}}); @@ -886,6 +887,8 @@ struct FlowGfwTask { fillProfile(corrconfigs.at(5), bootstrapArray[sampleIndex][kc32Nch05], globalTracksNch); fillProfile(corrconfigs.at(6), bootstrapArray[sampleIndex][kc32Nch05etagap], globalTracksNch); fillProfile(corrconfigs.at(7), bootstrapArray[sampleIndex][kc34Nch05], globalTracksNch); + + registry.fill(HIST("Nch"), globalTracksNch); } // Filling Flow Container @@ -894,7 +897,7 @@ struct FlowGfwTask { } } // End of process - PROCESS_SWITCH(FlowGfwTask, processData, "Process analysis for Run 3 data", true); + PROCESS_SWITCH(FlowGfwTask, processData, "Process analysis for Run 3 data", false); // Filter the Reconstructed tracks Filter mytrackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax) && (nabs(aod::track::dcaXY) < cfgCutDCAxy); From 9d24d107c1f7d7a79b6096e5b52f297404b37dc1 Mon Sep 17 00:00:00 2001 From: Paola Vargas Torres <88360333+PaolaVT@users.noreply.github.com> Date: Fri, 7 Feb 2025 04:11:20 -0600 Subject: [PATCH 0089/1650] [PWGLF] Variable binning was added to momentum and AxisSpec was moved (#9804) --- PWGMM/UE/Tasks/dedxAnalysis.cxx | 45 +++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/PWGMM/UE/Tasks/dedxAnalysis.cxx b/PWGMM/UE/Tasks/dedxAnalysis.cxx index c25bb3ff092..c1ec8ba696c 100644 --- a/PWGMM/UE/Tasks/dedxAnalysis.cxx +++ b/PWGMM/UE/Tasks/dedxAnalysis.cxx @@ -34,11 +34,8 @@ using namespace o2::framework; using namespace constants::physics; using PIDTracks = soa::Join< - aod::Tracks, aod::TracksExtra, aod::TracksDCA, aod::pidTOFbeta, - aod::pidTOFmass, aod::TrackSelection, aod::TrackSelectionExtension, - aod::pidTPCFullPi, aod::pidTPCFullKa, aod::pidTPCFullPr, aod::pidTPCFullDe, - aod::pidTPCFullTr, aod::pidTPCFullHe, aod::pidTOFFullPi, aod::pidTOFFullKa, - aod::pidTOFFullPr, aod::pidTOFFullDe, aod::pidTOFFullTr, aod::pidTOFFullHe, aod::pidTOFFullEl>; + aod::Tracks, aod::TracksExtra, aod::TrackSelectionExtension, + aod::pidTOFFullPi, aod::pidTOFFullPr, aod::pidTOFFullEl>; using SelectedCollisions = soa::Join; @@ -87,9 +84,11 @@ struct DedxAnalysis { Configurable eventSelection{"eventSelection", true, "event selection"}; Configurable calibrationMode{"calibrationMode", false, "calibration mode"}; // Histograms names - static constexpr std::string_view kDedxvsMomentum[4] = {"dEdx_vs_Momentum_all", "dEdx_vs_Momentum_Pi_v0", "dEdx_vs_Momentum_Pr_v0", "dEdx_vs_Momentum_El_v0"}; + static constexpr std::string_view kDedxvsMomentumPos[4] = {"dEdx_vs_Momentum_all_Pos", "dEdx_vs_Momentum_Pi_v0_Pos", "dEdx_vs_Momentum_Pr_v0_Pos", "dEdx_vs_Momentum_El_v0_Pos"}; + static constexpr std::string_view kDedxvsMomentumNeg[4] = {"dEdx_vs_Momentum_all_Neg", "dEdx_vs_Momentum_Pi_v0_Neg", "dEdx_vs_Momentum_Pr_v0_Neg", "dEdx_vs_Momentum_El_v0_Neg"}; static constexpr double EtaCut[9] = {-0.8, -0.6, -0.4, -0.2, 0.0, 0.2, 0.4, 0.6, 0.8}; - static constexpr double Correction[8] = {56.0452, 56.632, 57.2627, 57.8265, 57.8403, 57.5441, 57.2386, 56.7532}; + static constexpr double Correction[8] = {54.5281, 54.6548, 54.6513, 54.6781, 54.6167, 54.7384, 55.0047, 54.9592}; + ConfigurableAxis binP{"binP", {VARIABLE_WIDTH, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 18.0, 20.0}, ""}; void init(InitContext const&) { @@ -103,6 +102,8 @@ struct DedxAnalysis { {{100, 0.0, 6.4, "#phi"}, {100, 0.0, 600.0, "dE/dx MIP (a. u.)"}}); } else { + AxisSpec pAxis = {binP, "#it{p}/Z (GeV/c)"}; + registryDeDx.add( "hdEdxMIP_vs_eta_calibrated", "dE/dx", HistType::kTH2F, {{8, -0.8, 0.8, "#eta"}, {10, 30.0, 70.0, "dE/dx MIP (a. u.)"}}); @@ -112,8 +113,10 @@ struct DedxAnalysis { // De/Dx for ch and v0 particles for (int i = 0; i < 4; ++i) { - registryDeDx.add(kDedxvsMomentum[i].data(), "dE/dx", HistType::kTH3F, - {{100, -20, 20, "#it{p}/Z (GeV/c)"}, {100, 0.0, 600.0, "dE/dx (a. u.)"}, {8, -0.8, 0.8, "#eta"}}); + registryDeDx.add(kDedxvsMomentumPos[i].data(), "dE/dx", HistType::kTH3F, + {{pAxis}, {100, 0.0, 600.0, "dE/dx (a. u.)"}, {8, -0.8, 0.8, "#eta"}}); + registryDeDx.add(kDedxvsMomentumNeg[i].data(), "dE/dx", HistType::kTH3F, + {{pAxis}, {100, 0.0, 600.0, "dE/dx (a. u.)"}, {8, -0.8, 0.8, "#eta"}}); } } // Event Counter @@ -306,7 +309,7 @@ struct DedxAnalysis { float signedP = trk.sign() * trk.tpcInnerParam(); // MIP for pions - if (trk.tpcInnerParam() >= 0.25 && trk.tpcInnerParam() <= 0.35) { + if (trk.tpcInnerParam() >= 0.35 && trk.tpcInnerParam() <= 0.45) { if (calibrationMode) { registryDeDx.fill(HIST("hdEdxMIP_vs_eta"), trk.eta(), trk.tpcSignal()); registryDeDx.fill(HIST("hdEdxMIP_vs_phi"), trk.phi(), trk.tpcSignal()); @@ -323,7 +326,11 @@ struct DedxAnalysis { if (!calibrationMode) { for (int i = 0; i < 8; ++i) { if (trk.eta() > EtaCut[i] && trk.eta() < EtaCut[i + 1]) { - registryDeDx.fill(HIST(kDedxvsMomentum[0]), signedP, trk.tpcSignal() * 50 / Correction[i], trk.eta()); + if (signedP > 0) { + registryDeDx.fill(HIST(kDedxvsMomentumPos[0]), signedP, trk.tpcSignal() * 50 / Correction[i], trk.eta()); + } else { + registryDeDx.fill(HIST(kDedxvsMomentumNeg[0]), std::abs(signedP), trk.tpcSignal() * 50 / Correction[i], trk.eta()); + } } } } @@ -378,11 +385,11 @@ struct DedxAnalysis { for (int i = 0; i < 8; ++i) { if (negTrack.eta() > EtaCut[i] && negTrack.eta() < EtaCut[i + 1]) { - registryDeDx.fill(HIST(kDedxvsMomentum[1]), signedPneg, negTrack.tpcSignal() * 50 / Correction[i], negTrack.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumNeg[1]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / Correction[i], negTrack.eta()); } if (posTrack.eta() > EtaCut[i] && posTrack.eta() < EtaCut[i + 1]) { - registryDeDx.fill(HIST(kDedxvsMomentum[1]), signedPpos, posTrack.tpcSignal() * 50 / Correction[i], posTrack.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumPos[1]), signedPpos, posTrack.tpcSignal() * 50 / Correction[i], posTrack.eta()); } } } @@ -402,11 +409,11 @@ struct DedxAnalysis { for (int i = 0; i < 8; ++i) { if (negTrack.eta() > EtaCut[i] && negTrack.eta() < EtaCut[i + 1]) { - registryDeDx.fill(HIST(kDedxvsMomentum[1]), signedPneg, negTrack.tpcSignal() * 50 / Correction[i], negTrack.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumNeg[1]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / Correction[i], negTrack.eta()); } if (posTrack.eta() > EtaCut[i] && posTrack.eta() < EtaCut[i + 1]) { - registryDeDx.fill(HIST(kDedxvsMomentum[2]), signedPpos, posTrack.tpcSignal() * 50 / Correction[i], posTrack.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumPos[2]), signedPpos, posTrack.tpcSignal() * 50 / Correction[i], posTrack.eta()); } } } @@ -426,11 +433,11 @@ struct DedxAnalysis { for (int i = 0; i < 8; ++i) { if (negTrack.eta() > EtaCut[i] && negTrack.eta() < EtaCut[i + 1]) { - registryDeDx.fill(HIST(kDedxvsMomentum[2]), signedPneg, negTrack.tpcSignal() * 50 / Correction[i], negTrack.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumNeg[2]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / Correction[i], negTrack.eta()); } if (posTrack.eta() > EtaCut[i] && posTrack.eta() < EtaCut[i + 1]) { - registryDeDx.fill(HIST(kDedxvsMomentum[1]), signedPpos, posTrack.tpcSignal() * 50 / Correction[i], posTrack.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumPos[1]), signedPpos, posTrack.tpcSignal() * 50 / Correction[i], posTrack.eta()); } } } @@ -450,11 +457,11 @@ struct DedxAnalysis { for (int i = 0; i < 8; ++i) { if (negTrack.eta() > EtaCut[i] && negTrack.eta() < EtaCut[i + 1]) { - registryDeDx.fill(HIST(kDedxvsMomentum[3]), signedPneg, negTrack.tpcSignal() * 50 / Correction[i], negTrack.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumNeg[3]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / Correction[i], negTrack.eta()); } if (posTrack.eta() > EtaCut[i] && posTrack.eta() < EtaCut[i + 1]) { - registryDeDx.fill(HIST(kDedxvsMomentum[3]), signedPpos, posTrack.tpcSignal() * 50 / Correction[i], posTrack.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumPos[3]), signedPpos, posTrack.tpcSignal() * 50 / Correction[i], posTrack.eta()); } } } From fbabced48513bf8be1281ac8f67bb856d65f3578 Mon Sep 17 00:00:00 2001 From: jaelpark Date: Fri, 7 Feb 2025 11:20:41 +0100 Subject: [PATCH 0090/1650] [PWGCF] Increment counters for enabled centrality process functions (#9808) --- PWGCF/TableProducer/filterCorrelations.cxx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/PWGCF/TableProducer/filterCorrelations.cxx b/PWGCF/TableProducer/filterCorrelations.cxx index 5166db4ead0..6b27e27dcd6 100644 --- a/PWGCF/TableProducer/filterCorrelations.cxx +++ b/PWGCF/TableProducer/filterCorrelations.cxx @@ -328,9 +328,15 @@ struct MultiplicitySelector { if (doprocessFT0C) { enabledFunctions++; } + if (doprocessFT0CVariant1) { + enabledFunctions++; + } if (doprocessFT0A) { enabledFunctions++; } + if (doprocessCentNGlobal) { + enabledFunctions++; + } if (doprocessMCGen) { enabledFunctions++; } From b32643e396542e86b6c4676d0425b08dc6a349b3 Mon Sep 17 00:00:00 2001 From: Rafael Manhart <56776511+RafRaf11@users.noreply.github.com> Date: Fri, 7 Feb 2025 11:59:34 +0100 Subject: [PATCH 0091/1650] [PWGLF] Update NucleiEfficiencyTask.cxx (#9803) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Nuspex/NucleiEfficiencyTask.cxx | 25 ++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Nuspex/NucleiEfficiencyTask.cxx b/PWGLF/Tasks/Nuspex/NucleiEfficiencyTask.cxx index 3a5ff0eff43..27e948ee7a7 100644 --- a/PWGLF/Tasks/Nuspex/NucleiEfficiencyTask.cxx +++ b/PWGLF/Tasks/Nuspex/NucleiEfficiencyTask.cxx @@ -48,6 +48,7 @@ using namespace o2; using namespace o2::track; using namespace o2::framework; using namespace o2::framework::expressions; +// using CollisionCandidates = o2::soa::Join<>; struct NucleiEfficiencyTask { @@ -167,6 +168,24 @@ struct NucleiEfficiencyTask { //*********************************************************************************** + template + int getCentralityMC(CollisionType const& collision) + { + float multiplicity{0.f}; + int centrality = 0; + float collMult{0.f}; + collMult = collision.numContrib(); + + if (collMult > multiplicity) { + centrality = collision.centFT0C(); + multiplicity = collMult; + } + + return centrality; + } + + //*********************************************************************************** + template void process_MC_gen(const McCollisionType& mcCollision, const McParticlesType& mcParticles) { @@ -263,14 +282,18 @@ struct NucleiEfficiencyTask { template void process_MC_reco(const CollisionType& collision, const TracksType& tracks, const mcParticlesType& /*mcParticles*/) { + + int centrality = getCentralityMC(collision); if (event_selection_MC_sel8 && !collision.sel8()) return; if (collision.posZ() > cfgCutVertex) return; MC_recon_reg.fill(HIST("histRecVtxMC"), collision.posZ()); - MC_recon_reg.fill(HIST("histCentrality"), collision.centFT0C()); + MC_recon_reg.fill(HIST("histCentrality"), centrality); if (!isEventSelected(collision)) return; + if (centrality < minCentrality || centrality > maxCentrality) + return; for (auto& track : tracks) { const auto particle = track.mcParticle(); From 44a8d51012f9795a1ac140abd172dc23b94f807a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Fri, 7 Feb 2025 12:27:50 +0100 Subject: [PATCH 0092/1650] [PWGLF] Update k0_mixed_events.cxx (#9781) --- PWGLF/Tasks/Strangeness/k0_mixed_events.cxx | 564 +++++++++++++++++--- 1 file changed, 499 insertions(+), 65 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx b/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx index b2218883cb8..cdd1eb3f8aa 100644 --- a/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx +++ b/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -41,6 +42,12 @@ #include "PWGLF/DataModel/mcCentrality.h" #include "Framework/O2DatabasePDGPlugin.h" #include "PWGLF/Utils/inelGt.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/PIDResponse.h" +#include "CCDB/BasicCCDBManager.h" +#include "DetectorsBase/Propagator.h" +#include "DataFormatsParameters/GRPObject.h" +#include "DataFormatsParameters/GRPMagField.h" using namespace o2; using namespace o2::soa; @@ -51,7 +58,19 @@ using namespace o2::framework::expressions; using FilteredCollisions = soa::Filtered; using FilteredTracks = soa::Filtered>; +using RecoTracks = soa::Join; + typedef std::shared_ptr trkType; +typedef std::shared_ptr trkTypeData; + typedef std::shared_ptr colType; using MyFemtoPair = o2::aod::singletrackselector::FemtoPair; @@ -76,6 +95,13 @@ class ResoPair : public MyFemtoPair lDecayDaughter2.SetPtEtaPhiM(second->pt(), second->eta(), second->phi(), particle_mass(GetPDG2())); lResonance = lDecayDaughter1 + lDecayDaughter2; } + void setPair(trkTypeData const& first, trkTypeData const& second) + { + // MyFemtoPair::SetPair(first, second); + lDecayDaughter1.SetPtEtaPhiM(first->pt(), first->eta(), first->phi(), particle_mass(GetPDG1())); + lDecayDaughter2.SetPtEtaPhiM(second->pt(), second->eta(), second->phi(), particle_mass(GetPDG2())); + lResonance = lDecayDaughter1 + lDecayDaughter2; + } float getInvMass() const { // LOG(info) << "Mass = " << lResonance.M() << " 1 " << lDecayDaughter1.M() << " 2 " << lDecayDaughter2.M(); @@ -134,6 +160,20 @@ struct K0MixedEvents { Configurable _multbinwidth{"multbinwidth", 50, "width of multiplicity bins within which the mixing is done"}; Configurable _vertexbinwidth{"vertexbinwidth", 2, "width of vertexZ bins within which the mixing is done"}; + // Mag field + Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; + Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + + // Event selections + Configurable sel8{"evSelsel8", 0, "Apply sel8 event selection"}; + Configurable isTriggerTVX{"evSelisTriggerTVX", 1, "Is Trigger TVX"}; + Configurable isNoTimeFrameBorder{"evSelisNoTimeFrameBorder", 1, "Is No Time Frame Border"}; + Configurable isNoITSROFrameBorder{"evSelisNoITSROFrameBorder", 1, "Is No ITS Readout Frame Border"}; + Configurable isVertexTOFmatched{"evSelisVertexTOFmatched", 0, "Is Vertex TOF matched"}; + Configurable isGoodZvtxFT0vsPV{"evSelisGoodZvtxFT0vsPV", 0, "isGoodZvtxFT0vsPV"}; + Configurable isInelGt0{"evSelisInelGt0", 0, "isInelGt0"}; + // Binnings ConfigurableAxis invMassBinning{"invMassBinning", {500, 0.4, 0.6}, "k* binning of the CF (Nbins, lowlimit, uplimit)"}; ConfigurableAxis ptBinning{"ptBinning", {1000, 0.f, 10.f}, "pT binning (Nbins, lowlimit, uplimit)"}; @@ -148,10 +188,6 @@ struct K0MixedEvents { std::pair> TPCcuts_2; std::pair> TOFcuts_2; - std::map> selectedtracks_1; - std::map> selectedtracks_2; - std::map, std::vector> mixbins; - std::unique_ptr Pair = std::make_unique(); Filter pFilter = o2::aod::singletrackselector::p > momentumCut.value.first&& o2::aod::singletrackselector::p < momentumCut.value.second; @@ -180,6 +216,11 @@ struct K0MixedEvents { void init(o2::framework::InitContext&) { + ccdb->setURL(ccdburl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setFatalWhenNull(false); + IsIdentical = (_sign_1 * _particlePDG_1 == _sign_2 * _particlePDG_2); LOG(info) << "IsIdentical=" << IsIdentical << "; sign1=" << _sign_1 << "; Pdg1=" << _particlePDG_1 << "; total1=" << _sign_1 * _particlePDG_1 << " -- Pdg2=" << _particlePDG_2 << "; sign2=" << _sign_2 << "; total2=" << _sign_2 * _particlePDG_2; @@ -198,8 +239,21 @@ struct K0MixedEvents { const AxisSpec invMassAxis{invMassBinning, "Inv. mass (GeV/c^{2})"}; const AxisSpec ptAxis{ptBinning, "#it{p}_{T} (GeV/c)"}; const AxisSpec dcaXyAxis{dcaXyBinning, "DCA_{xy} (cm)"}; + const AxisSpec dcaZAxis{dcaXyBinning, "DCA_{z} (cm)"}; const AxisSpec multPercentileAxis{multPercentileBinning, "Mult. Perc."}; + registry.add("hNEvents", "hNEvents", {HistType::kTH1I, {{11, 0.f, 11.f}}}); + registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(1, "all"); + registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(2, "sel8"); + registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(3, "TVX"); + registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(4, "zvertex"); + registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(5, "TFBorder"); + registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(6, "ITSROFBorder"); + registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(7, "isTOFVertexMatched"); + registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(8, "isGoodZvtxFT0vsPV"); + registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(9, "InelGT0"); + registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(10, "Applied selection"); + registry.add("Trks", "Trks", kTH1D, {{2, 0.5, 2.5, "Tracks"}}); registry.add("VTXc", "VTXc", kTH1D, {{100, -20., 20., "vtx"}}); registry.add("VTX", "VTX", kTH1D, {{100, -20., 20., "vtx"}}); @@ -212,16 +266,18 @@ struct K0MixedEvents { if (doMixedEvent) { registry.add("MEvsPt", "MEvsPt", kTH3F, {invMassAxis, ptAxis, multPercentileAxis}); } - registry.add("eta", Form("eta_%i", _particlePDG_1.value), kTH2F, {ptAxis, {100, -10., 10., "#eta"}}); + registry.add("eta_first", Form("eta_%i", _particlePDG_1.value), kTH2F, {ptAxis, {100, -10., 10., "#eta"}}); registry.add("p_first", Form("p_%i", _particlePDG_1.value), kTH1D, {ptAxis}); - registry.add("dcaXY_first", Form("dca_%i", _particlePDG_1.value), kTH2F, {ptAxis, dcaXyAxis}); + registry.add("dcaXY_first", Form("dcaXY_%i", _particlePDG_1.value), kTH2F, {ptAxis, dcaXyAxis}); + registry.add("dcaZ_first", Form("dcaZ_%i", _particlePDG_1.value), kTH2F, {ptAxis, dcaZAxis}); registry.add("nsigmaTOF_first", Form("nsigmaTOF_%i", _particlePDG_1.value), kTH2F, {ptAxis, {100, -10., 10., Form("N#sigma_{TOF}(%s))", pdgToSymbol(_particlePDG_1))}}); registry.add("nsigmaTPC_first", Form("nsigmaTPC_%i", _particlePDG_1.value), kTH2F, {ptAxis, {100, -10., 10., Form("N#sigma_{TPC}(%s))", pdgToSymbol(_particlePDG_1))}}); registry.add("rapidity_first", Form("rapidity_%i", _particlePDG_1.value), kTH2F, {ptAxis, {100, -10., 10., Form("y(%s)", pdgToSymbol(_particlePDG_1))}}); if (!IsIdentical) { registry.add("p_second", Form("p_%i", _particlePDG_2.value), kTH1D, {ptAxis}); - registry.add("dcaXY_second", Form("dca_%i", _particlePDG_2.value), kTH2F, {ptAxis, dcaXyAxis}); + registry.add("dcaXY_second", Form("dcaXY_%i", _particlePDG_2.value), kTH2F, {ptAxis, dcaXyAxis}); + registry.add("dcaZ_second", Form("dcaZ_%i", _particlePDG_1.value), kTH2F, {ptAxis, dcaZAxis}); registry.add("nsigmaTOF_second", Form("nsigmaTOF_%i", _particlePDG_2.value), kTH2F, {ptAxis, {100, -10., 10., Form("N#sigma_{TOF}(%s))", pdgToSymbol(_particlePDG_2))}}); registry.add("nsigmaTPC_second", Form("nsigmaTPC_%i", _particlePDG_2.value), kTH2F, {ptAxis, {100, -10., 10., Form("N#sigma_{TPC}(%s))", pdgToSymbol(_particlePDG_2))}}); registry.add("rapidity_second", Form("rapidity_%i", _particlePDG_2.value), kTH2F, {ptAxis, {100, -10., 10., Form("y(%s)", pdgToSymbol(_particlePDG_2))}}); @@ -231,10 +287,44 @@ struct K0MixedEvents { return; } registry.add("MC/multPerc", "multPerc", kTH1D, {multPercentileAxis}); - registry.add("MC/multPercMC", "multPercMC", kTH1D, {multPercentileAxis}); + registry.add("MC/multPercWMcCol", "multPercWMcCol", kTH1D, {multPercentileAxis}); registry.add("MC/generatedInRecoEvs", "generatedInRecoEvs", kTH2D, {ptAxis, multPercentileAxis}); - registry.add("MC/generatedInGenEvs", "generatedInGenEvs", kTH2D, {ptAxis, multPercentileAxis}); + registry.add("MC/SE", "SE", kTH1D, {invMassAxis}); registry.add("MC/SEvsPt", "SEvsPt", kTH3F, {invMassAxis, ptAxis, multPercentileAxis}); + registry.addClone("MC/", "MCCent/"); + registry.add("MCCent/generatedInGenEvs", "generatedInGenEvs", kTH2D, {ptAxis, multPercentileAxis}); + } + + int mRunNumber = 0; + float d_bz = 0.f; + Service ccdb; + void initCCDB(aod::BCsWithTimestamps::iterator const& bc) // inspired by PWGLF/TableProducer/lambdakzerobuilder.cxx + { + if (mRunNumber == bc.runNumber()) { + return; + } + d_bz = 0.f; + + auto run3grp_timestamp = bc.timestamp(); + o2::parameters::GRPObject* grpo = ccdb->getForTimeStamp(grpPath, run3grp_timestamp); + o2::parameters::GRPMagField* grpmag = 0x0; + if (grpo) { + o2::base::Propagator::initFieldFromGRP(grpo); + // Fetch magnetic field from ccdb for current collision + d_bz = grpo->getNominalL3Field(); + LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; + } else { + grpmag = ccdb->getForTimeStamp(grpmagPath, run3grp_timestamp); + if (!grpmag) { + LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for timestamp " << run3grp_timestamp; + } + o2::base::Propagator::initFieldFromGRP(grpmag); + // Fetch magnetic field from ccdb for current collision + d_bz = std::lround(5.f * grpmag->getL3Current() / 30000.f); + LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; + } + mRunNumber = bc.runNumber(); + d_bz = 0.1 * d_bz; } template @@ -248,9 +338,9 @@ struct K0MixedEvents { Pair->setPair(tracks[trk1], tracks[trk2]); registry.fill(HIST("SEcand"), 1.f); - if (!Pair->isClosePair()) { - continue; - } + // if (!Pair->isClosePair()) { + // continue; + // } if (std::abs(Pair->getRapidity()) > 0.5f) { continue; } @@ -273,9 +363,9 @@ struct K0MixedEvents { if constexpr (isSameEvent) { registry.fill(HIST("SEcand"), 1.f); } - if (!Pair->isClosePair()) { - continue; - } + // if (!Pair->isClosePair()) { + // continue; + // } if (std::abs(Pair->getRapidity()) > 0.5f) { continue; } @@ -291,10 +381,128 @@ struct K0MixedEvents { } } - void process(FilteredTracks const& tracks, FilteredCollisions const& collisions) + template + bool isTrackSelected(TrkType const& track) { - LOG(debug) << "Processing " << collisions.size() << " collisions and " << tracks.size() << " tracks"; + if (track.itsChi2NCl() > 36.f) + return false; + if (track.itsChi2NCl() < 0.f) + return false; + if (track.tpcChi2NCl() < 0.f) + return false; + if (track.tpcChi2NCl() > 4.f) + return false; + if (track.itsNCls() < _itsNCls) { + return false; + } + if (track.itsChi2NCl() > _itsChi2NCl) { + return false; + } + if (track.tpcChi2NCl() > _tpcChi2NCl) { + return false; + } + if (track.tpcCrossedRowsOverFindableCls() < _tpcCrossedRowsOverFindableCls) { + return false; + } + if (std::abs(track.dcaXY()) > dcaxyCut) { + return false; + } + if (std::abs(track.dcaXY()) < dcaxyExclusionCut) { + return false; + } + if (std::abs(track.dcaZ()) > dcazCut) { + return false; + } + if (std::abs(track.dcaZ()) < dcazExclusionCut) { + return false; + } + if (track.p() < momentumCut.value.first) { + return false; + } + if (track.p() > momentumCut.value.second) { + return false; + } + if (std::abs(track.eta()) >= _eta) { + return false; + } + if (track.tpcNClsFound() < _tpcNClsFound) { + return false; + } + if (track.tpcNClsShared() > _tpcNClsShared) { + return false; + } + + return true; + } + + // Event selection + template + bool acceptEvent(TCollision const& collision, bool fill = true) + { + if (fill) { + registry.fill(HIST("hNEvents"), 0.5); + } + if (sel8 && !collision.sel8()) { + return false; + } + if (fill) { + registry.fill(HIST("hNEvents"), 1.5); + } + if (isTriggerTVX && !collision.selection_bit(aod::evsel::kIsTriggerTVX)) { + return false; + } + if (fill) { + registry.fill(HIST("hNEvents"), 2.5); + } + if (TMath::Abs(collision.posZ()) > _vertexZ) { + return false; + } + if (fill) { + registry.fill(HIST("hNEvents"), 3.5); + } + if (isNoTimeFrameBorder && !collision.selection_bit(aod::evsel::kNoTimeFrameBorder)) { + return false; + } + if (fill) { + registry.fill(HIST("hNEvents"), 4.5); + } + if (isNoITSROFrameBorder && !collision.selection_bit(aod::evsel::kNoITSROFrameBorder)) { + return false; + } + if (fill) { + registry.fill(HIST("hNEvents"), 5.5); + } + if (isVertexTOFmatched && !collision.selection_bit(aod::evsel::kIsVertexTOFmatched)) { + return false; + } + if (fill) { + registry.fill(HIST("hNEvents"), 6.5); + } + if (isGoodZvtxFT0vsPV && !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { + return false; + } + if (fill) { + registry.fill(HIST("hNEvents"), 7.5); + } + if (isInelGt0 && !collision.isInelGt0()) { + return false; + } + if (fill) { + registry.fill(HIST("hNEvents"), 8.5); + } + if (collision.centFT0M() > multPercentileCut.value.second) + return false; + if (collision.centFT0M() < multPercentileCut.value.first) + return false; + return true; + } + void processDerived(FilteredTracks const& tracks, FilteredCollisions const& collisions) + { + LOG(debug) << "Processing " << collisions.size() << " collisions and " << tracks.size() << " tracks"; + std::map> selectedtracks_1; + std::map> selectedtracks_2; + std::map, std::vector> mixbins; if (_particlePDG_1 == 0 || _particlePDG_2 == 0) { LOGF(fatal, "One of passed PDG is 0!!!"); } @@ -307,42 +515,17 @@ struct K0MixedEvents { for (auto track : tracks) { LOG(debug) << "Track index " << track.singleCollSelId(); - if (track.itsNCls() < _itsNCls) { - continue; - } - if (track.itsChi2NCl() > _itsChi2NCl) { - continue; - } - if (track.tpcChi2NCl() > _tpcChi2NCl) { - continue; - } - if (track.tpcCrossedRowsOverFindableCls() < _tpcCrossedRowsOverFindableCls) { + if (!isTrackSelected(track)) { continue; } - if (std::abs(track.dcaXY()) > dcaxyCut) { - continue; - } - if (std::abs(track.dcaXY()) < dcaxyExclusionCut) { - continue; - } - if (std::abs(track.dcaZ()) > dcazCut) { - continue; - } - if (std::abs(track.dcaZ()) < dcazExclusionCut) { - continue; - } - registry.fill(HIST("Trks"), 1); const auto& col = track.singleCollSel_as(); - registry.fill(HIST("VTX"), col.posZ()); if (std::abs(col.posZ()) > _vertexZ) continue; if (col.multPerc() > multPercentileCut.value.second || col.multPerc() < multPercentileCut.value.first) continue; - registry.fill(HIST("eta"), track.pt(), track.eta()); - if (std::abs(track.rapidity(particle_mass(_particlePDG_1))) > _maxy) { - continue; - } + registry.fill(HIST("VTX"), col.posZ()); + registry.fill(HIST("eta_first"), track.pt(), track.eta()); registry.fill(HIST("rapidity_first"), track.pt(), track.rapidity(particle_mass(_particlePDG_1))); if ((track.sign() == _sign_1) && @@ -351,6 +534,7 @@ struct K0MixedEvents { registry.fill(HIST("p_first"), track.p()); registry.fill(HIST("dcaXY_first"), track.pt(), track.dcaXY()); + registry.fill(HIST("dcaZ_first"), track.pt(), track.dcaZ()); switch (_particlePDG_1) { case 211: registry.fill(HIST("nsigmaTOF_first"), track.p(), track.tofNSigmaPi()); @@ -376,12 +560,13 @@ struct K0MixedEvents { if (IsIdentical) { continue; } else if ((track.sign() == _sign_2) && - (_particlePDGtoReject != 0 || !TOFselection(track, std::make_pair(_particlePDGtoReject, _rejectWithinNsigmaTOF))) && + (_particlePDGtoReject != 0 || !o2::aod::singletrackselector::TOFselection(track, std::make_pair(_particlePDGtoReject, _rejectWithinNsigmaTOF))) && (track.p() < _PIDtrshld_2 ? o2::aod::singletrackselector::TPCselection(track, TPCcuts_2) : o2::aod::singletrackselector::TOFselection(track, TOFcuts_2))) { // filling the map: eventID <-> selected particles2 if (see condition above ^) selectedtracks_2[track.singleCollSelId()].push_back(std::make_shared(track)); registry.fill(HIST("p_second"), track.p()); registry.fill(HIST("dcaXY_second"), track.pt(), track.dcaXY()); + registry.fill(HIST("dcaZ_second"), track.pt(), track.dcaZ()); switch (_particlePDG_2) { case 211: registry.fill(HIST("nsigmaTOF_second"), track.p(), track.tofNSigmaPi()); @@ -489,25 +674,223 @@ struct K0MixedEvents { (i->second).clear(); mixbins.clear(); } + PROCESS_SWITCH(K0MixedEvents, processDerived, "process derived", true); + + using RecoCollisions = soa::Join; + + void processData(RecoTracks const& tracks, RecoCollisions const& collisions, BCsWithTimestamps const& bcs) + { + initCCDB(bcs.iteratorAt(0)); + LOG(debug) << "Processing " << collisions.size() << " collisions and " << tracks.size() << " tracks"; + std::map> selectedtracks_1; + std::map> selectedtracks_2; + std::map, std::vector>> mixbins; + if (_particlePDG_1 == 0 || _particlePDG_2 == 0) { + LOGF(fatal, "One of passed PDG is 0!!!"); + } + + registry.fill(HIST("Trks"), 2.f, tracks.size()); + for (auto collision : collisions) { + if (!acceptEvent(collision)) + continue; + LOG(debug) << "Collision index " << collision.globalIndex(); + registry.fill(HIST("VTXc"), collision.posZ()); + registry.fill(HIST("multPerc"), collision.centFT0M()); + } + + for (auto track : tracks) { + if (!isTrackSelected(track)) { + continue; + } + // if (!track.isGlobalTrackWoDCA()) { + // continue; + // } + if (track.trackType() != aod::track::Track) { + continue; + } + if (track.tofChi2() >= 10.f) { + continue; + } + if (!track.has_collision()) { + continue; + } + registry.fill(HIST("Trks"), 1); + const auto& col = track.collision_as(); + if (!acceptEvent(col, false)) + continue; + if (std::abs(col.posZ()) > _vertexZ) + continue; + if (col.centFT0M() > multPercentileCut.value.second || col.centFT0M() < multPercentileCut.value.first) + continue; + registry.fill(HIST("VTX"), col.posZ()); + registry.fill(HIST("eta_first"), track.pt(), track.eta()); + registry.fill(HIST("rapidity_first"), track.pt(), track.rapidity(particle_mass(_particlePDG_1))); + + if ((track.sign() == _sign_1) && + (track.p() < _PIDtrshld_1 ? o2::aod::singletrackselector::TPCselection(track, TPCcuts_1) : o2::aod::singletrackselector::TOFselection(track, TOFcuts_1))) { // filling the map: eventID <-> selected particles1 + selectedtracks_1[track.collisionId()].push_back(std::make_shared(track)); + + registry.fill(HIST("p_first"), track.p()); + registry.fill(HIST("dcaXY_first"), track.pt(), track.dcaXY()); + registry.fill(HIST("dcaZ_first"), track.pt(), track.dcaZ()); + switch (_particlePDG_1) { + case 211: + registry.fill(HIST("nsigmaTOF_first"), track.p(), track.tofNSigmaPi()); + registry.fill(HIST("nsigmaTPC_first"), track.p(), track.tpcNSigmaPi()); + break; + case 321: + registry.fill(HIST("nsigmaTOF_first"), track.p(), track.tofNSigmaKa()); + registry.fill(HIST("nsigmaTPC_first"), track.p(), track.tpcNSigmaKa()); + break; + case 2212: + registry.fill(HIST("nsigmaTOF_first"), track.p(), track.tofNSigmaPr()); + registry.fill(HIST("nsigmaTPC_first"), track.p(), track.tpcNSigmaPr()); + break; + case 1000010020: + registry.fill(HIST("nsigmaTOF_first"), track.p(), track.tofNSigmaDe()); + registry.fill(HIST("nsigmaTPC_first"), track.p(), track.tpcNSigmaDe()); + break; + default: + LOG(fatal) << "PDG code 1: " << _particlePDG_1 << " is not supported!!!"; + } + } + + if (IsIdentical) { + continue; + } else if ((track.sign() == _sign_2) && + (_particlePDGtoReject != 0 || !o2::aod::singletrackselector::TOFselection(track, std::make_pair(_particlePDGtoReject, _rejectWithinNsigmaTOF))) && + (track.p() < _PIDtrshld_2 ? o2::aod::singletrackselector::TPCselection(track, TPCcuts_2) : o2::aod::singletrackselector::TOFselection(track, TOFcuts_2))) { // filling the map: eventID <-> selected particles2 if (see condition above ^) + selectedtracks_2[track.collisionId()].push_back(std::make_shared(track)); + + registry.fill(HIST("p_second"), track.p()); + registry.fill(HIST("dcaXY_second"), track.pt(), track.dcaXY()); + registry.fill(HIST("dcaZ_second"), track.pt(), track.dcaZ()); + switch (_particlePDG_2) { + case 211: + registry.fill(HIST("nsigmaTOF_second"), track.p(), track.tofNSigmaPi()); + registry.fill(HIST("nsigmaTPC_second"), track.p(), track.tpcNSigmaPi()); + break; + case 321: + registry.fill(HIST("nsigmaTOF_second"), track.p(), track.tofNSigmaKa()); + registry.fill(HIST("nsigmaTPC_second"), track.p(), track.tpcNSigmaKa()); + break; + case 2212: + registry.fill(HIST("nsigmaTOF_second"), track.p(), track.tofNSigmaPr()); + registry.fill(HIST("nsigmaTPC_second"), track.p(), track.tpcNSigmaPr()); + break; + case 1000010020: + registry.fill(HIST("nsigmaTOF_second"), track.p(), track.tofNSigmaDe()); + registry.fill(HIST("nsigmaTPC_second"), track.p(), track.tpcNSigmaDe()); + break; + default: + LOG(fatal) << "PDG code 2: " << _particlePDG_2 << " is not supported!!!"; + } + } + } + + for (auto collision : collisions) { + if (selectedtracks_1.find(collision.globalIndex()) == selectedtracks_1.end()) { + if (IsIdentical) + continue; + else if (selectedtracks_2.find(collision.globalIndex()) == selectedtracks_2.end()) + continue; + } + + mixbins[std::pair{round(collision.posZ() / _vertexbinwidth), floor(collision.multNTracksPVeta1() / _multbinwidth)}].push_back(std::make_shared(collision)); + } + + //====================================== mixing starts here ====================================== + + if (IsIdentical) { //====================================== mixing identical ====================================== + + for (auto i = mixbins.begin(); i != mixbins.end(); i++) { // iterating over all vertex&mult bins + + for (uint32_t indx1 = 0; indx1 < (i->second).size(); indx1++) { // loop over all the events in each vertex&mult bin + + auto col1 = (i->second)[indx1]; + + Pair->SetMagField1(d_bz); + Pair->SetMagField2(d_bz); + + mixTracks(selectedtracks_1[col1->index()], col1->centFT0M()); // mixing SE identical + if (!doMixedEvent) { + continue; + } + + for (uint32_t indx2 = indx1 + 1; indx2 < (i->second).size(); indx2++) { // nested loop for all the combinations of collisions in a chosen mult/vertex bin + + auto col2 = (i->second)[indx2]; + + Pair->SetMagField2(d_bz); + mixTracks(selectedtracks_1[col1->index()], selectedtracks_1[col2->index()], col1->centFT0M()); // mixing ME identical + } + } + } + + //====================================== end of mixing identical ====================================== + } else { + //====================================== mixing non-identical ====================================== + + for (auto i = mixbins.begin(); i != mixbins.end(); i++) { // iterating over all vertex&mult bins + + for (uint32_t indx1 = 0; indx1 < (i->second).size(); indx1++) { // loop over all the events in each vertex&mult bin + + auto col1 = (i->second)[indx1]; + + Pair->SetMagField1(d_bz); + Pair->SetMagField2(d_bz); + + mixTracks(selectedtracks_1[col1->index()], selectedtracks_2[col1->index()], col1->centFT0M()); // mixing SE non-identical + if (!doMixedEvent) { + continue; + } + + for (uint32_t indx2 = indx1 + 1; indx2 < (i->second).size(); indx2++) { // nested loop for all the combinations of collisions in a chosen mult/vertex bin + + auto col2 = (i->second)[indx2]; + + Pair->SetMagField2(d_bz); + mixTracks(selectedtracks_1[col1->index()], selectedtracks_2[col2->index()], col1->centFT0M()); // mixing ME non-identical + } + } + } + + } //====================================== end of mixing non-identical ====================================== + + // clearing up + for (auto i = selectedtracks_1.begin(); i != selectedtracks_1.end(); i++) + (i->second).clear(); + selectedtracks_1.clear(); + + if (!IsIdentical) { + for (auto i = selectedtracks_2.begin(); i != selectedtracks_2.end(); i++) + (i->second).clear(); + selectedtracks_2.clear(); + } - Filter eventFilter = (aod::evsel::sel8 == true && (nabs(o2::aod::collision::posZ) < _vertexZ)); + for (auto i = mixbins.begin(); i != mixbins.end(); i++) + (i->second).clear(); + mixbins.clear(); + } + PROCESS_SWITCH(K0MixedEvents, processData, "process data", false); - using RecoMCCollisions = soa::Join; + using RecoMCCollisions = soa::Join; + using RecoMCTracks = soa::Join; using GenMCCollisions = soa::Join; Service pdgDB; Preslice perMCCol = aod::mcparticle::mcCollisionId; + Preslice perCollision = aod::track::collisionId; SliceCache cache; - void processMC(soa::Filtered const& collisions, - // soa::Join const& tracks, + void processMC(RecoMCCollisions const& collisions, + RecoMCTracks const& tracks, GenMCCollisions const& mcCollisions, aod::McParticles const& mcParticles) { - + // Loop on reconstructed tracks + TLorentzVector lDecayDaughter1, lDecayDaughter2, lResonance; + std::vector> trkPool1; + std::vector> trkPool2; // Loop on reconstructed collisions for (const auto& col : collisions) { if (!col.sel8()) { @@ -516,15 +899,68 @@ struct K0MixedEvents { if (std::abs(col.posZ()) > _vertexZ) { continue; } + // Loop on tracks + const auto& tracksInCollision = tracks.sliceByCached(aod::track::collisionId, col.globalIndex(), cache); + for (const auto& trk : tracksInCollision) { + if (!trk.has_mcParticle()) { + continue; + } + if (!isTrackSelected(trk)) { + continue; + } + // if (!trk.isGlobalTrackWoDCA()) { + // continue; + // } + if (trk.trackType() != aod::track::Track) { + continue; + } + if (trk.tofChi2() >= 10.f) { + continue; + } + const auto& part = trk.mcParticle(); + switch (part.pdgCode()) { + case 211: + trkPool1.push_back(std::make_shared(trk)); + break; + case -211: + trkPool2.push_back(std::make_shared(trk)); + break; + default: + continue; + } + } + + for (uint32_t trk1 = 0; trk1 < trkPool1.size(); trk1++) { // nested loop for all the combinations + lDecayDaughter1.SetPtEtaPhiM(trkPool1[trk1]->pt(), trkPool1[trk1]->eta(), trkPool1[trk1]->phi(), particle_mass(_particlePDG_1)); + for (uint32_t trk2 = 0; trk2 < trkPool2.size(); trk2++) { + lDecayDaughter2.SetPtEtaPhiM(trkPool2[trk2]->pt(), trkPool2[trk2]->eta(), trkPool2[trk2]->phi(), particle_mass(_particlePDG_2)); + // if (!Pair->isClosePair()) { + // continue; + // } + lResonance = lDecayDaughter1 + lDecayDaughter2; + if (std::abs(lResonance.Rapidity()) > 0.5f) { + continue; + } + registry.fill(HIST("MC/SE"), lResonance.M()); // close pair rejection and fillig the SE histo + registry.fill(HIST("MC/SEvsPt"), lResonance.M(), lResonance.Pt(), col.centFT0M()); // close pair rejection and fillig the SE histo + if (col.has_mcCollision()) { + registry.fill(HIST("MCCent/SE"), lResonance.M()); // close pair rejection and fillig the SE histo + registry.fill(HIST("MCCent/SEvsPt"), lResonance.M(), lResonance.Pt(), col.mcCollision_as().centFT0M()); // close pair rejection and fillig the SE histo + } + } + } + trkPool1.clear(); + trkPool2.clear(); + + registry.fill(HIST("MC/multPerc"), col.centFT0M()); if (!col.has_mcCollision()) { continue; } - registry.fill(HIST("MC/multPerc"), col.centFT0M()); - // Loop on tracks - // MC / SEvsPt + const auto& mcCollision = col.mcCollision_as(); + registry.fill(HIST("MC/multPercWMcCol"), col.centFT0M()); + registry.fill(HIST("MCCent/multPercWMcCol"), mcCollision.centFT0M()); // Loop on particles - const auto& mcCollision = col.mcCollision_as(); const auto& particlesInCollision = mcParticles.sliceByCached(aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); for (const auto& mcParticle : particlesInCollision) { switch (mcParticle.pdgCode()) { @@ -540,6 +976,7 @@ struct K0MixedEvents { continue; } registry.fill(HIST("MC/generatedInRecoEvs"), mcParticle.pt(), col.centFT0M()); + registry.fill(HIST("MCCent/generatedInRecoEvs"), mcParticle.pt(), mcCollision.centFT0M()); } } @@ -552,7 +989,7 @@ struct K0MixedEvents { if (!o2::pwglf::isINELgt0mc(particlesInCollision, pdgDB)) { continue; } - registry.fill(HIST("MC/multPercMC"), mcCollision.centFT0M()); + registry.fill(HIST("MCCent/multPerc"), mcCollision.centFT0M()); for (const auto& mcParticle : particlesInCollision) { switch (mcParticle.pdgCode()) { case 310: @@ -566,7 +1003,7 @@ struct K0MixedEvents { if (std::abs(mcParticle.y()) > 0.5) { continue; } - registry.fill(HIST("MC/generatedInGenEvs"), mcParticle.pt(), mcCollision.centFT0M()); + registry.fill(HIST("MCCent/generatedInGenEvs"), mcParticle.pt(), mcCollision.centFT0M()); } } } @@ -574,7 +1011,4 @@ struct K0MixedEvents { PROCESS_SWITCH(K0MixedEvents, processMC, "process mc", false); }; -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - return WorkflowSpec{adaptAnalysisTask(cfgc)}; -} +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From 9a04fd74bb9c2a7ba1d5764eec13bc9e474cb8ab Mon Sep 17 00:00:00 2001 From: MaolinZH <109225729+MaolinZH@users.noreply.github.com> Date: Fri, 7 Feb 2025 13:46:41 +0100 Subject: [PATCH 0093/1650] [PWGDQ,Trigger] Proposal for the electron-muon pp trigger (#9769) --- EventFiltering/filterTables.h | 4 +- PWGDQ/Core/CutsLibrary.cxx | 34 +++++++++++++++- PWGDQ/Tasks/filterPP.cxx | 53 +++++++++++++------------ PWGDQ/Tasks/filterPPwithAssociation.cxx | 23 ++++------- 4 files changed, 70 insertions(+), 44 deletions(-) diff --git a/EventFiltering/filterTables.h b/EventFiltering/filterTables.h index 7283dec82de..46392cb63da 100644 --- a/EventFiltering/filterTables.h +++ b/EventFiltering/filterTables.h @@ -67,6 +67,8 @@ DECLARE_SOA_COLUMN(DiMuon, hasDiMuon, bool); //! dimuon trigger with // EM dielectrons DECLARE_SOA_COLUMN(LMeeIMR, hasLMeeIMR, bool); //! dielectron trigger for intermediate mass region DECLARE_SOA_COLUMN(LMeeHMR, hasLMeeHMR, bool); //! dielectron trigger for high mass region +// Electron-muon pair +DECLARE_SOA_COLUMN(ElectronMuon, hasElectronMuon, bool); //! dimuon trigger with low pT on muons // heavy flavours DECLARE_SOA_COLUMN(HfHighPt2P, hasHfHighPt2P, bool); //! high-pT 2-prong charm hadron @@ -207,7 +209,7 @@ using DiffractionBCFilter = DiffractionBCFilters::iterator; // Dileptons & Quarkonia DECLARE_SOA_TABLE(DqFilters, "AOD", "DqFilters", //! - filtering::SingleE, filtering::LMeeIMR, filtering::LMeeHMR, filtering::DiElectron, filtering::SingleMuLow, filtering::SingleMuHigh, filtering::DiMuon); + filtering::SingleE, filtering::LMeeIMR, filtering::LMeeHMR, filtering::DiElectron, filtering::SingleMuLow, filtering::SingleMuHigh, filtering::DiMuon, filtering::ElectronMuon); using DqFilter = DqFilters::iterator; // heavy flavours diff --git a/PWGDQ/Core/CutsLibrary.cxx b/PWGDQ/Core/CutsLibrary.cxx index 677e09f54a7..e9a59405692 100644 --- a/PWGDQ/Core/CutsLibrary.cxx +++ b/PWGDQ/Core/CutsLibrary.cxx @@ -80,6 +80,17 @@ AnalysisCompositeCut* o2::aod::dqcuts::GetCompositeCut(const char* cutName) cut->AddCut(GetAnalysisCut("MCHMID")); return cut; } + if (!nameStr.compare("ElectronForEMu")) { + cut->AddCut(GetAnalysisCut("jpsiKineSkimmed")); + cut->AddCut(GetAnalysisCut("electronStandardQualityForO2MCdebug4")); + cut->AddCut(GetAnalysisCut("electronPIDnsigmaLoose")); + return cut; + } + if (!nameStr.compare("MuonForEMu")) { + cut->AddCut(GetAnalysisCut("muonLowPt5")); + cut->AddCut(GetAnalysisCut("muonQualityCuts")); + return cut; + } // /////////////////////////////////////////////// // End of Cuts for CEFP // // /////////////////////////////////////////////// @@ -3575,6 +3586,19 @@ AnalysisCompositeCut* o2::aod::dqcuts::GetCompositeCut(const char* cutName) return cut; } + if (!nameStr.compare("emu_electron_specialTest")) { + cut->AddCut(GetAnalysisCut("jpsiStandardKineForEMu")); + cut->AddCut(GetAnalysisCut("electronStandardQualityForO2MCdebug4")); + cut->AddCut(GetAnalysisCut("electronPIDnsigmaVeryVeryLoose2")); + return cut; + } + + if (!nameStr.compare("emu_electron_specialTest2")) { + cut->AddCut(GetAnalysisCut("jpsiStandardKineForEMu")); + cut->AddCut(GetAnalysisCut("electronStandardQualityForO2MCdebug4")); + return cut; + } + if (!nameStr.compare("muonLooseTriggerTestCuts")) { cut->AddCut(GetAnalysisCut("muonLooseTriggerTestCuts")); return cut; @@ -4094,6 +4118,12 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) return cut; } + if (!nameStr.compare("jpsiStandardKineForEMu")) { + cut->AddCut(VarManager::kPt, 5.0, 1000.0); + cut->AddCut(VarManager::kEta, -0.9, 0.9); + return cut; + } + if (!nameStr.compare("lmeePrefilterKine")) { cut->AddCut(VarManager::kPt, 0., 20.0); cut->AddCut(VarManager::kEta, -1.2, 1.2); @@ -5344,8 +5374,8 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) if (!nameStr.compare("electronPIDnsigmaVeryVeryLoose2")) { cut->AddCut(VarManager::kTPCnSigmaEl, -4.0, 4.0); - cut->AddCut(VarManager::kTPCnSigmaPr, 2.5, 3000.0); - cut->AddCut(VarManager::kTPCnSigmaPi, 2.5, 3000.0); + cut->AddCut(VarManager::kTPCnSigmaPr, 1.5, 3000.0); + cut->AddCut(VarManager::kTPCnSigmaPi, 1.5, 3000.0); return cut; } diff --git a/PWGDQ/Tasks/filterPP.cxx b/PWGDQ/Tasks/filterPP.cxx index 6cd9fad6d7e..c9239f8366d 100644 --- a/PWGDQ/Tasks/filterPP.cxx +++ b/PWGDQ/Tasks/filterPP.cxx @@ -13,6 +13,8 @@ // #include #include +#include +#include #include #include #include @@ -59,6 +61,7 @@ enum DQTriggers { kSingleMuLow, kSingleMuHigh, kDiMuon, + kElectronMuon, kNTriggersDQ }; } // namespace @@ -247,14 +250,14 @@ struct DQBarrelTrackSelection { fCurrentRun = bc.runNumber(); } - uint32_t filterMap = uint32_t(0); + uint32_t filterMap = static_cast(0); trackSel.reserve(tracksBarrel.size()); VarManager::ResetValues(0, VarManager::kNBarrelTrackVariables); for (auto& track : tracksBarrel) { - filterMap = uint32_t(0); + filterMap = static_cast(0); if (!track.has_collision()) { - trackSel(uint32_t(0)); + trackSel(static_cast(0)); } else { VarManager::FillTrack(track); if (fConfigQA) { @@ -263,7 +266,7 @@ struct DQBarrelTrackSelection { int i = 0; for (auto cut = fTrackCuts.begin(); cut != fTrackCuts.end(); ++cut, ++i) { if ((*cut).IsSelected(VarManager::fgValues)) { - filterMap |= (uint32_t(1) << i); + filterMap |= (static_cast(1) << i); if (fConfigQA) { fHistMan->FillHistClass(fCutHistNames[i].Data(), VarManager::fgValues); } @@ -331,16 +334,16 @@ struct DQMuonsSelection { template void runMuonSelection(TMuons const& muons) { - uint32_t filterMap = uint32_t(0); + uint32_t filterMap = static_cast(0); trackSel.reserve(muons.size()); VarManager::ResetValues(0, VarManager::kNMuonTrackVariables); // fill event information which might be needed in histograms or cuts that combine track and event properties for (auto& muon : muons) { - filterMap = uint32_t(0); + filterMap = static_cast(0); if (!muon.has_collision()) { - trackSel(uint32_t(0)); + trackSel(static_cast(0)); } else { VarManager::FillTrack(muon); if (fConfigQA) { @@ -349,7 +352,7 @@ struct DQMuonsSelection { int i = 0; for (auto cut = fTrackCuts.begin(); cut != fTrackCuts.end(); ++cut, ++i) { if ((*cut).IsSelected(VarManager::fgValues)) { - filterMap |= (uint32_t(1) << i); + filterMap |= (static_cast(1) << i); if (fConfigQA) { fHistMan->FillHistClass(fCutHistNames[i].Data(), VarManager::fgValues); } @@ -386,8 +389,8 @@ struct DQFilterPPTask { Configurable fConfigFilterLsBarrelTracksPairs{"cfgWithBarrelLS", "false", "Comma separated list of booleans for each trigger, If true, also select like sign (--/++) barrel track pairs"}; Configurable fConfigFilterLsMuonsPairs{"cfgWithMuonLS", "false", "Comma separated list of booleans for each trigger, If true, also select like sign (--/++) muon pairs"}; - Filter filterBarrelTrackSelected = aod::dqppfilter::isDQBarrelSelected > uint32_t(0); - Filter filterMuonTrackSelected = aod::dqppfilter::isDQMuonSelected > uint32_t(0); + Filter filterBarrelTrackSelected = aod::dqppfilter::isDQBarrelSelected > static_cast(0); + Filter filterMuonTrackSelected = aod::dqppfilter::isDQMuonSelected > static_cast(0); int fNBarrelCuts; // number of barrel selections int fNMuonCuts; // number of muon selections @@ -496,14 +499,14 @@ struct DQFilterPPTask { // if the event is not selected produce tables and return if (!collision.isDQEventSelected()) { eventFilter(0); - dqtable(false, false, false, false, false, false, false); + dqtable(false, false, false, false, false, false, false, false); return; } fStats->Fill(-1.0); if (tracksBarrel.size() == 0 && muons.size() == 0) { eventFilter(0); - dqtable(false, false, false, false, false, false, false); + dqtable(false, false, false, false, false, false, false, false); return; } @@ -515,7 +518,7 @@ struct DQFilterPPTask { // count the number of barrel tracks fulfilling each cut for (auto track : tracksBarrel) { for (int i = 0; i < fNBarrelCuts; ++i) { - if (track.isDQBarrelSelected() & (uint32_t(1) << i)) { + if (track.isDQBarrelSelected() & (static_cast(1) << i)) { objCountersBarrel[i] += 1; } } @@ -526,7 +529,7 @@ struct DQFilterPPTask { for (int i = 0; i < fNBarrelCuts; i++) { if (fBarrelRunPairing[i]) { if (objCountersBarrel[i] > 1) { // pairing has to be enabled and at least two tracks are needed - pairingMask |= (uint32_t(1) << i); + pairingMask |= (static_cast(1) << i); } objCountersBarrel[i] = 0; // reset counters for selections where pairing is needed (count pairs instead) } @@ -539,7 +542,7 @@ struct DQFilterPPTask { for (int icut = 0; icut < fNBarrelCuts; icut++) { TString objStr = objArrayLS->At(icut)->GetName(); if (!objStr.CompareTo("true")) { - pairingLS |= (uint32_t(1) << icut); + pairingLS |= (static_cast(1) << icut); } } @@ -556,12 +559,12 @@ struct DQFilterPPTask { VarManager::FillPair(t1, t2); // compute pair quantities for (int icut = 0; icut < fNBarrelCuts; icut++) { // select like-sign pairs if trigger has set boolean true within fConfigFilterLsBarrelTracksPairs - if (!(pairingLS & (uint32_t(1) << icut))) { + if (!(pairingLS & (static_cast(1) << icut))) { if (t1.sign() * t2.sign() > 0) { continue; } } - if (!(pairFilter & (uint32_t(1) << icut))) { + if (!(pairFilter & (static_cast(1) << icut))) { continue; } if (!fBarrelPairCuts[icut].IsSelected(VarManager::fgValues)) { @@ -579,7 +582,7 @@ struct DQFilterPPTask { // count the number of muon tracks fulfilling each selection for (auto muon : muons) { for (int i = 0; i < fNMuonCuts; ++i) { - if (muon.isDQMuonSelected() & (uint32_t(1) << i)) { + if (muon.isDQMuonSelected() & (static_cast(1) << i)) { objCountersMuon[i] += 1; } } @@ -590,7 +593,7 @@ struct DQFilterPPTask { for (int i = 0; i < fNMuonCuts; i++) { if (fMuonRunPairing[i]) { // pairing has to be enabled and at least two tracks are needed if (objCountersMuon[i] > 1) { - pairingMask |= (uint32_t(1) << i); + pairingMask |= (static_cast(1) << i); } objCountersMuon[i] = 0; // reset counters for selections where pairing is needed (count pairs instead) } @@ -603,7 +606,7 @@ struct DQFilterPPTask { for (int icut = 0; icut < fNMuonCuts; icut++) { TString objStr = objArrayMuonLS->At(icut)->GetName(); if (!objStr.CompareTo("true")) { - pairingLS |= (uint32_t(1) << icut); + pairingLS |= (static_cast(1) << icut); } } @@ -620,12 +623,12 @@ struct DQFilterPPTask { VarManager::FillPair(t1, t2); // compute pair quantities for (int icut = 0; icut < fNMuonCuts; icut++) { // select like-sign pairs if trigger has set boolean true within fConfigFilterLsMuonsPairs - if (!(pairingLS & (uint32_t(1) << icut))) { + if (!(pairingLS & (static_cast(1) << icut))) { if (t1.sign() * t2.sign() > 0) { continue; } } - if (!(pairFilter & (uint32_t(1) << icut))) { + if (!(pairFilter & (static_cast(1) << icut))) { continue; } if (!fMuonPairCuts[icut].IsSelected(VarManager::fgValues)) { @@ -648,7 +651,7 @@ struct DQFilterPPTask { uint64_t filter = 0; for (int i = 0; i < fNBarrelCuts; i++) { if (objCountersBarrel[i] >= fBarrelNreqObjs[i]) { - filter |= (uint64_t(1) << i); + filter |= (static_cast(1) << i); fStats->Fill(static_cast(i)); if (i < kNTriggersDQ) { decisions[i] = true; @@ -657,7 +660,7 @@ struct DQFilterPPTask { } for (int i = 0; i < fNMuonCuts; i++) { if (objCountersMuon[i] >= fMuonNreqObjs[i]) { - filter |= (uint64_t(1) << (i + fNBarrelCuts)); + filter |= (static_cast(1) << (i + fNBarrelCuts)); fStats->Fill(static_cast(i + fNBarrelCuts)); if (i + fNBarrelCuts < kNTriggersDQ) { decisions[i + fNBarrelCuts] = true; @@ -665,7 +668,7 @@ struct DQFilterPPTask { } } eventFilter(filter); - dqtable(decisions[0], decisions[1], decisions[2], decisions[3], decisions[4], decisions[5], decisions[6]); + dqtable(decisions[0], decisions[1], decisions[2], decisions[3], decisions[4], decisions[5], decisions[6], decisions[7]); } void processFilterPP(MyEventsSelected::iterator const& collision, aod::BCs const& bcs, diff --git a/PWGDQ/Tasks/filterPPwithAssociation.cxx b/PWGDQ/Tasks/filterPPwithAssociation.cxx index b369b1061e9..3d34042a4b2 100644 --- a/PWGDQ/Tasks/filterPPwithAssociation.cxx +++ b/PWGDQ/Tasks/filterPPwithAssociation.cxx @@ -70,7 +70,7 @@ enum DQTriggers { kSingleMuLow, kSingleMuHigh, kDiMuon, - // kElectronMuon, // the ElectronMuon trigger is not available now + kElectronMuon, kNTriggersDQ }; } // namespace @@ -1042,8 +1042,6 @@ struct DQFilterPPTask { } } } - // the ElectronMuon trigger is not available now - /* for (int i = fNBarrelCuts + fNMuonCuts; i < fNBarrelCuts + fNMuonCuts + fNElectronMuonCuts; i++) { if (filter & (static_cast(1) << i)) { if (i < kNTriggersDQ) { @@ -1051,7 +1049,6 @@ struct DQFilterPPTask { } } } - */ // if this collision fired at least one input, add it to the map, or if it is there already, update the decisions with a logical OR // This may happen in the case when some collisions beyond the iterator are added because they contain ambiguous tracks fired on by another collision if (fFiltersMap.find(collision.globalIndex()) == fFiltersMap.end()) { @@ -1132,16 +1129,14 @@ struct DQFilterPPTask { fStats->Fill(-2.0); if (!collision.isDQEventSelected()) { eventFilter(0); - dqtable(false, false, false, false, false, false, false); - // dqtable(false, false, false, false, false, false, false, false); // the ElectronMuon trigger is not available now + dqtable(false, false, false, false, false, false, false, false); continue; } fStats->Fill(-1.0); if (fFiltersMap.find(collision.globalIndex()) == fFiltersMap.end()) { eventFilter(0); - dqtable(false, false, false, false, false, false, false); - // dqtable(false, false, false, false, false, false, false, false); // the ElectronMuon trigger is not available now + dqtable(false, false, false, false, false, false, false, false); } else { totalEventsTriggered++; for (int i = 0; i < fNBarrelCuts + fNMuonCuts + fNElectronMuonCuts; i++) { @@ -1150,8 +1145,7 @@ struct DQFilterPPTask { } eventFilter(fFiltersMap[collision.globalIndex()]); auto dqDecisions = fCEFPfilters[collision.globalIndex()]; - dqtable(dqDecisions[0], dqDecisions[1], dqDecisions[2], dqDecisions[3], dqDecisions[4], dqDecisions[5], dqDecisions[6]); - // dqtable(dqDecisions[0], dqDecisions[1], dqDecisions[2], dqDecisions[3], dqDecisions[4], dqDecisions[5], dqDecisions[6], dqDecisions[7]); // the ElectronMuon trigger is not available now + dqtable(dqDecisions[0], dqDecisions[1], dqDecisions[2], dqDecisions[3], dqDecisions[4], dqDecisions[5], dqDecisions[6], dqDecisions[7]); } } @@ -1256,16 +1250,14 @@ struct DQFilterPPTask { fStats->Fill(-2.0); if (!collision.isDQEventSelected()) { eventFilter(0); - dqtable(false, false, false, false, false, false, false); - // dqtable(false, false, false, false, false, false, false, false); // the ElectronMuon trigger is not available now + dqtable(false, false, false, false, false, false, false, false); continue; } fStats->Fill(-1.0); if (fFiltersMap.find(collision.globalIndex()) == fFiltersMap.end()) { eventFilter(0); - dqtable(false, false, false, false, false, false, false); - // dqtable(false, false, false, false, false, false, false, false); // the ElectronMuon trigger is not available now + dqtable(false, false, false, false, false, false, false, false); } else { totalEventsTriggered++; for (int i = 0; i < fNMuonCuts; i++) { @@ -1274,8 +1266,7 @@ struct DQFilterPPTask { } eventFilter(fFiltersMap[collision.globalIndex()]); auto dqDecisions = fCEFPfilters[collision.globalIndex()]; - dqtable(dqDecisions[0], dqDecisions[1], dqDecisions[2], dqDecisions[3], dqDecisions[4], dqDecisions[5], dqDecisions[6]); - // dqtable(dqDecisions[0], dqDecisions[1], dqDecisions[2], dqDecisions[3], dqDecisions[4], dqDecisions[5], dqDecisions[6], dqDecisions[7]); // the ElectronMuon trigger is not available now + dqtable(dqDecisions[0], dqDecisions[1], dqDecisions[2], dqDecisions[3], dqDecisions[4], dqDecisions[5], dqDecisions[6], dqDecisions[7]); } } From a7972f8b4e9be5a30e9b4e27d1d20649fd4b3039 Mon Sep 17 00:00:00 2001 From: rebeccacerri <116571396+rebeccacerri@users.noreply.github.com> Date: Fri, 7 Feb 2025 14:43:13 +0100 Subject: [PATCH 0094/1650] [PWGDQ] Upsilon Minitree - Adding_MuonVariables (#9810) --- PWGDQ/DataModel/ReducedInfoTables.h | 2 +- PWGDQ/Tasks/tableReader.cxx | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/PWGDQ/DataModel/ReducedInfoTables.h b/PWGDQ/DataModel/ReducedInfoTables.h index 7986332b76a..c586faef9c7 100644 --- a/PWGDQ/DataModel/ReducedInfoTables.h +++ b/PWGDQ/DataModel/ReducedInfoTables.h @@ -820,7 +820,7 @@ DECLARE_SOA_TABLE(DimuonsAll, "AOD", "RTDIMUONALL", //! reducedpair::SVertex); DECLARE_SOA_TABLE(DileptonsMiniTree, "AOD", "RTDILEPTMTREE", //! - reducedpair::Mass, reducedpair::Pt, reducedpair::Eta, reducedpair::CentFT0C, reducedpair::Cos2DeltaPhi); + reducedpair::Mass, reducedpair::Pt, reducedpair::Eta, reducedpair::CentFT0C, reducedpair::Cos2DeltaPhi, dilepton_track_index::Pt1, dilepton_track_index::Eta1, dilepton_track_index::Phi1, dilepton_track_index::Pt2, dilepton_track_index::Eta2, dilepton_track_index::Phi2); using Dielectron = Dielectrons::iterator; using StoredDielectron = StoredDielectrons::iterator; diff --git a/PWGDQ/Tasks/tableReader.cxx b/PWGDQ/Tasks/tableReader.cxx index 058a45756f4..ea8eb8dbbdb 100644 --- a/PWGDQ/Tasks/tableReader.cxx +++ b/PWGDQ/Tasks/tableReader.cxx @@ -1380,7 +1380,13 @@ struct AnalysisSameEventPairing { VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kRap], VarManager::fgValues[VarManager::kCentFT0C], - VarManager::fgValues[VarManager::kCos2DeltaPhi]); + VarManager::fgValues[VarManager::kCos2DeltaPhi], + VarManager::fgValues[VarManager::kPt1], + VarManager::fgValues[VarManager::kEta1], + VarManager::fgValues[VarManager::kPhi1], + VarManager::fgValues[VarManager::kPt2], + VarManager::fgValues[VarManager::kEta2], + VarManager::fgValues[VarManager::kPhi2]); } } } else { From 68887efc926844213ff8382f7d15942ac41751f2 Mon Sep 17 00:00:00 2001 From: JaeyoonCho Date: Fri, 7 Feb 2025 14:57:06 +0100 Subject: [PATCH 0095/1650] [PWGHF] Add an axis into THnSpares for ML study in the task (#9814) Co-authored-by: ALICE Action Bot --- PWGHF/D2H/Tasks/taskXicToXiPiPi.cxx | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskXicToXiPiPi.cxx b/PWGHF/D2H/Tasks/taskXicToXiPiPi.cxx index 58341c78b3d..431b2e3399f 100644 --- a/PWGHF/D2H/Tasks/taskXicToXiPiPi.cxx +++ b/PWGHF/D2H/Tasks/taskXicToXiPiPi.cxx @@ -47,6 +47,12 @@ struct HfTaskXicToXiPiPi { Configurable checkDecayTypeMc{"checkDecayTypeMc", false, "Flag to enable DecayType histogram"}; // THnSparese for ML selection check Configurable enableTHn{"enableTHn", false, "Fill THnSparse for Xic"}; + + Service pdg; + + Filter filterSelectCandidates = (aod::hf_sel_candidate_xic::isSelXicToXiPiPi >= selectionFlagXic); + + // Axis ConfigurableAxis thnConfigAxisPt{"thnConfigAxisPt", {400, 0., 40.}, ""}; ConfigurableAxis thnConfigAxisMass{"thnConfigAxisMass", {300, 1.8, 3.0}, ""}; ConfigurableAxis thnConfigAxisPtProng{"thnConfigAxisPtProng", {300, 0., 30.}, ""}; @@ -55,8 +61,8 @@ struct HfTaskXicToXiPiPi { ConfigurableAxis thnConfigAxisDecLengthXY{"thnConfigAxisDecLengthXY", {200, 0., 0.5}, ""}; ConfigurableAxis thnConfigAxisCPA{"thnConfigAxisCPA", {110, -1.1, 1.1}, ""}; ConfigurableAxis thnConfigAxisBdtScoreBkg{"thnConfigAxisBdtScoreBkg", {100, 0., 1.}, ""}; - ConfigurableAxis thnConfigAxisBdtScoreSignal{"thnConfigAxisBdtScoreSignal", {100, 0., 1.}, ""}; - // Axis + ConfigurableAxis thnConfigAxisBdtScorePrompt{"thnConfigAxisBdtScorePrompt", {100, 0., 1.}, ""}; + ConfigurableAxis thnConfigAxisBdtScoreNonPrompt{"thnConfigAxisBdtScoreNonPrompt", {100, 0., 1.}, ""}; ConfigurableAxis binsDecLength{"binsDecLength", {200, 0., 0.5}, ""}; ConfigurableAxis binsErrDecLength{"binsErrDecLength", {100, 0., 1.}, ""}; ConfigurableAxis binsDCA{"binsDCA", {100, -0.05, 0.05}, ""}; @@ -64,10 +70,6 @@ struct HfTaskXicToXiPiPi { ConfigurableAxis binsSV{"binsSV", {200, -5., 5.}, ""}; ConfigurableAxis binsChi2{"binsChi2", {200, 0., 0.1}, ""}; - Service pdg; - - Filter filterSelectCandidates = (aod::hf_sel_candidate_xic::isSelXicToXiPiPi >= selectionFlagXic); - HistogramRegistry registry{"registry"}; void init(InitContext const&) @@ -251,11 +253,12 @@ struct HfTaskXicToXiPiPi { const AxisSpec thnAxisDecLengthXY{thnConfigAxisDecLengthXY, "decay length xy (cm)"}; const AxisSpec thnAxisCPA{thnConfigAxisCPA, "#Xi^{#plus}_{c} candidate cosine of pointing angle"}; const AxisSpec thnAxisBdtScoreBkg{thnConfigAxisBdtScoreBkg, "BDT score of background"}; - const AxisSpec thnAxisBdtScoreSignal{thnConfigAxisBdtScoreSignal, "BDT score of prompt Xic"}; + const AxisSpec thnAxisBdtScorePrompt{thnConfigAxisBdtScorePrompt, "BDT score of prompt #Xi^{#plus}_{c}"}; + const AxisSpec thnAxisBdtScoreNonPrompt{thnConfigAxisBdtScoreNonPrompt, "BDT score of non-prompt #Xi^{#plus}_{c}"}; if (doprocessWithKFParticleAndML || doprocessWithDCAFitterAndML || doprocessMcWithKFParticleAndML || doprocessMcWithDCAFitterAndML) { // with ML information - registry.add("hXicToXiPiPiVarsWithML", "THnSparse for Xic with ML", HistType::kTHnSparseF, {thnAxisPt, thnAxisMass, thnAxisChi2PCA, thnAxisDecLength, thnAxisDecLengthXY, thnAxisCPA, thnAxisBdtScoreBkg, thnAxisBdtScoreSignal}); + registry.add("hXicToXiPiPiVarsWithML", "THnSparse for Xic with ML", HistType::kTHnSparseF, {thnAxisPt, thnAxisMass, thnAxisChi2PCA, thnAxisDecLength, thnAxisDecLengthXY, thnAxisCPA, thnAxisBdtScoreBkg, thnAxisBdtScorePrompt, thnAxisBdtScoreNonPrompt}); } else { // without ML information registry.add("hXicToXiPiPiVars", "THnSparse for Xic", HistType::kTHnSparseF, {thnAxisPt, thnAxisMass, thnAxisChi2PCA, thnAxisDecLength, thnAxisDecLengthXY, thnAxisCPA}); @@ -274,13 +277,15 @@ struct HfTaskXicToXiPiPi { if constexpr (useMl) { // with ML information - double outputBkg = -99.; - double outputPrompt = -99.; + double outputBkg = -99.; // bkg score + double outputPrompt = -99.; // prompt score + double outputFD = -99.; // non-prompt score if (candidate.mlProbXicToXiPiPi().size() > 0) { outputBkg = candidate.mlProbXicToXiPiPi()[0]; outputPrompt = candidate.mlProbXicToXiPiPi()[1]; + outputFD = candidate.mlProbXicToXiPiPi()[2]; } - registry.get(HIST("hXicToXiPiPiVarsWithML"))->Fill(candidate.pt(), candidate.invMassXicPlus(), candidate.chi2PCA(), candidate.decayLength(), candidate.decayLengthXY(), candidate.cpa(), outputBkg, outputPrompt); + registry.get(HIST("hXicToXiPiPiVarsWithML"))->Fill(candidate.pt(), candidate.invMassXicPlus(), candidate.chi2PCA(), candidate.decayLength(), candidate.decayLengthXY(), candidate.cpa(), outputBkg, outputPrompt, outputFD); } else { // without ML information registry.get(HIST("hXicToXiPiPiVars"))->Fill(candidate.pt(), candidate.invMassXicPlus(), candidate.chi2PCA(), candidate.decayLength(), candidate.decayLengthXY(), candidate.cpa()); From c53183bfbd0953a70c5e736112b07cd1bde22405 Mon Sep 17 00:00:00 2001 From: cterrevo Date: Fri, 7 Feb 2025 16:38:59 +0100 Subject: [PATCH 0096/1650] [PWGHF] Added AND option for TPC,TOF pid to Xic (#9816) Co-authored-by: ALICE Action Bot --- .../candidateSelectorXicToPKPi.cxx | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx b/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx index 64ecd5cf65e..7048be6c995 100644 --- a/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx @@ -44,6 +44,8 @@ struct HfCandidateSelectorXicToPKPi { Configurable ptCandMin{"ptCandMin", 0., "Lower bound of candidate pT"}; Configurable ptCandMax{"ptCandMax", 36., "Upper bound of candidate pT"}; Configurable usePid{"usePid", true, "Bool to use or not the PID at filtering level"}; + // Combined PID options + Configurable usePidTpcAndTof{"usePidTpcAndTof", false, "Bool to decide how to combine TPC and TOF PID: true = both (if present, only one otherwise); false = one is enough"}; // TPC PID Configurable ptPidTpcMin{"ptPidTpcMin", 0.15, "Lower bound of track pT for TPC PID"}; Configurable ptPidTpcMax{"ptPidTpcMax", 20., "Upper bound of track pT for TPC PID"}; @@ -81,7 +83,7 @@ struct HfCandidateSelectorXicToPKPi { TrackSelectorPr selectorProton; HfHelper hfHelper; - using TracksSel = soa::Join; + using TracksSel = soa::Join; void init(InitContext const&) { @@ -269,11 +271,24 @@ struct HfCandidateSelectorXicToPKPi { pidXicToPiKP = 1; } else { // track-level PID selection - auto pidTrackPos1Proton = selectorProton.statusTpcOrTof(trackPos1); - auto pidTrackPos2Proton = selectorProton.statusTpcOrTof(trackPos2); - auto pidTrackPos1Pion = selectorPion.statusTpcOrTof(trackPos1); - auto pidTrackPos2Pion = selectorPion.statusTpcOrTof(trackPos2); - auto pidTrackNegKaon = selectorKaon.statusTpcOrTof(trackNeg); + TrackSelectorPID::Status pidTrackPos1Proton = TrackSelectorPID::Accepted; + TrackSelectorPID::Status pidTrackPos2Proton = TrackSelectorPID::Accepted; + TrackSelectorPID::Status pidTrackPos1Pion = TrackSelectorPID::Accepted; + TrackSelectorPID::Status pidTrackPos2Pion = TrackSelectorPID::Accepted; + TrackSelectorPID::Status pidTrackNegKaon = TrackSelectorPID::Accepted; + if (usePidTpcAndTof) { + pidTrackPos1Proton = selectorProton.statusTpcAndTof(trackPos1); + pidTrackPos2Proton = selectorProton.statusTpcAndTof(trackPos2); + pidTrackPos1Pion = selectorPion.statusTpcAndTof(trackPos1); + pidTrackPos2Pion = selectorPion.statusTpcAndTof(trackPos2); + pidTrackNegKaon = selectorKaon.statusTpcAndTof(trackNeg); + } else { + pidTrackPos1Proton = selectorProton.statusTpcOrTof(trackPos1); + pidTrackPos2Proton = selectorProton.statusTpcOrTof(trackPos2); + pidTrackPos1Pion = selectorPion.statusTpcOrTof(trackPos1); + pidTrackPos2Pion = selectorPion.statusTpcOrTof(trackPos2); + pidTrackNegKaon = selectorKaon.statusTpcOrTof(trackNeg); + } if (pidTrackPos1Proton == TrackSelectorPID::Accepted && pidTrackNegKaon == TrackSelectorPID::Accepted && From df1d2cfc50934bd6e26b0153fcfb64681e2d0769 Mon Sep 17 00:00:00 2001 From: alcaliva <32872606+alcaliva@users.noreply.github.com> Date: Fri, 7 Feb 2025 16:56:07 +0100 Subject: [PATCH 0097/1650] [PWGLF] QA of ITS-TPC matching efficiency for V0 daughters (#9813) --- PWGLF/Tasks/QC/CMakeLists.txt | 5 + .../QC/lfITSTPCMatchingSecondaryTracksQA.cxx | 332 ++++++++++++++++++ 2 files changed, 337 insertions(+) create mode 100644 PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx diff --git a/PWGLF/Tasks/QC/CMakeLists.txt b/PWGLF/Tasks/QC/CMakeLists.txt index 78c904fab68..fc62c0f34f5 100644 --- a/PWGLF/Tasks/QC/CMakeLists.txt +++ b/PWGLF/Tasks/QC/CMakeLists.txt @@ -129,3 +129,8 @@ o2physics_add_dpl_workflow(str-derived-genqa SOURCES strderivedGenQA.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(its-tpc-matching-vzeros + SOURCES lfITSTPCMatchingSecondaryTracksQA.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) diff --git a/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx b/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx new file mode 100644 index 00000000000..15301e106a1 --- /dev/null +++ b/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx @@ -0,0 +1,332 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// +/// \file lfITSTPCMatchingSecondaryTracksQA.cxx +/// +/// \brief task for QA of ITS-TPC matching efficiency of secondary tracks from V0s +/// \author Alberto Caliva (alberto.caliva@cern.ch), Francesca Ercolessi (francesca.ercolessi@cern.ch), Nicolò Jacazio (nicolo.jacazio@cern.ch) +/// \since May 22, 2024 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "Common/Core/RecoDecay.h" +#include "Common/Core/trackUtilities.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/runDataProcessing.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" +#include "ReconstructionDataFormats/Track.h" + +using namespace std; +using namespace o2; +using namespace o2::soa; +using namespace o2::aod; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::constants::physics; +using namespace o2::constants::math; +using std::array; + +using SelCollisions = soa::Join; +using SimCollisions = soa::Join; +using StrHadronDaughterTracks = soa::Join; +using MCTracks = soa::Join; + +struct LfITSTPCMatchingSecondaryTracksQA { + + HistogramRegistry registryData{"registryData", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry registryMC{"registryMC", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + + // Global Parameters + Configurable zVtx{"zVtx", 10.0, "Maximum zVertex"}; + + // Track Parameters + Configurable minITSnCls{"minITSnCls", 3.0f, "min number of ITS clusters"}; + Configurable minNCrossedRowsTPC{"minNCrossedRowsTPC", 80.0f, "min number of TPC crossed rows"}; + Configurable minNCrossedRowsOverFindable{"minNCrossedRowsOverFindable", 0.8f, "min number of TPC crossed rows/findable"}; + Configurable maxChi2TPC{"maxChi2TPC", 4.0f, "max chi2 per cluster TPC"}; + Configurable maxChi2ITS{"maxChi2ITS", 36.0f, "max chi2 per cluster ITS"}; + Configurable etaMin{"etaMin", -0.8f, "eta min"}; + Configurable etaMax{"etaMax", +0.8f, "eta max"}; + Configurable nsigmaTPCmin{"nsigmaTPCmin", -3.0f, "Minimum nsigma TPC"}; + Configurable nsigmaTPCmax{"nsigmaTPCmax", +3.0f, "Maximum nsigma TPC"}; + Configurable nsigmaTOFmin{"nsigmaTOFmin", -3.0f, "Minimum nsigma TOF"}; + Configurable nsigmaTOFmax{"nsigmaTOFmax", +3.0f, "Maximum nsigma TOF"}; + Configurable requireTOF{"requireTOF", false, "require TOF hit"}; + Configurable requireItsHits{"requireItsHits", false, "require ITS hits"}; + Configurable> requiredHit{"requiredHit", {0, 0, 0, 1, 1, 1, 1}, "required ITS Hits"}; + + // V0 Parameters + Configurable minimumV0Radius{"minimumV0Radius", 0.5f, "Minimum V0 Radius"}; + Configurable maximumV0Radius{"maximumV0Radius", 40.0f, "Maximum V0 Radius"}; + Configurable dcanegtoPVmin{"dcanegtoPVmin", 0.1f, "Minimum DCA Neg To PV"}; + Configurable dcapostoPVmin{"dcapostoPVmin", 0.1f, "Minimum DCA Pos To PV"}; + Configurable v0cospaMin{"v0cospaMin", 0.99f, "Minimum V0 CosPA"}; + Configurable dcaV0DaughtersMax{"dcaV0DaughtersMax", 0.5f, "Maximum DCA Daughters"}; + Configurable mK0Min{"mK0Min", 0.48f, "K0 mass lower cut"}; + Configurable mK0Max{"mK0Max", 0.52f, "K0 mass upper cut"}; + + void init(InitContext const&) + { + // Event Counters + if (doprocessData) { + registryData.add("number_of_events_data", "number of events in data", HistType::kTH1D, {{20, 0, 20, "Event Cuts"}}); + registryData.add("trkPionTpc", "trkPionTpc", HistType::kTH1D, {{1000, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("trkPionTpcIts", "trkPionTpcIts", HistType::kTH1D, {{1000, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("secPionTpc", "secPionTpc", HistType::kTH1D, {{1000, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("secPionTpcIts", "secPionTpcIts", HistType::kTH1D, {{1000, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); + } + + if (doprocessMC) { + registryData.add("number_of_events_mc", "number of events in mc", HistType::kTH1D, {{20, 0, 20, "Event Cuts"}}); + registryData.add("trkPionTpcMc", "trkPionTpcMc", HistType::kTH1D, {{1000, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("trkPionTpcItsMc", "trkPionTpcItsMc", HistType::kTH1D, {{1000, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("secPionTpcMc", "secPionTpcMc", HistType::kTH1D, {{1000, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("secPionTpcItsMc", "secPionTpcItsMc", HistType::kTH1D, {{1000, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); + } + } + + bool hasHitOnITSlayer(uint8_t itsClsmap, int layer) + { + unsigned char testBit = 1 << layer; + return (itsClsmap & testBit); + } + + template + bool passedTrackSelectionTpc(const TpcTrack& track) + { + if (!track.hasTPC()) + return false; + if (track.tpcNClsCrossedRows() < minNCrossedRowsTPC) + return false; + if ((track.tpcNClsCrossedRows() / track.tpcNClsFindable()) < minNCrossedRowsOverFindable) + return false; + if (track.tpcChi2NCl() > maxChi2TPC) + return false; + if (track.eta() < etaMin || track.eta() > etaMax) + return false; + return true; + } + + // K0s Selections + template + bool passedK0ShortSelection(const K0short& v0) + { + if (v0.v0cosPA() < v0cospaMin) + return false; + if (v0.v0radius() < minimumV0Radius || v0.v0radius() > maximumV0Radius) + return false; + if (v0.dcaV0daughters() > dcaV0DaughtersMax) + return false; + if (std::fabs(v0.dcapostopv()) < dcapostoPVmin) + return false; + if (std::fabs(v0.dcanegtopv()) < dcanegtoPVmin) + return false; + if (v0.mK0Short() < mK0Min || v0.mK0Short() > mK0Max) + return false; + + return true; + } + + template + bool passedPionSelection(const pionTrack& track) + { + // TPC Selection + if (track.tpcNSigmaPi() < nsigmaTPCmin || track.tpcNSigmaPi() > nsigmaTPCmax) + return false; + + // TOF Selection + if (requireTOF) { + if (track.tofNSigmaPi() < nsigmaTOFmin || track.tofNSigmaPi() > nsigmaTOFmax) + return false; + } + return true; + } + + template + bool passedTrackSelectionIts(const ItsTrack& track) + { + if (!track.hasITS()) + return false; + if (track.itsNCls() < minITSnCls) + return false; + if (track.itsChi2NCl() > maxChi2ITS) + return false; + + auto requiredItsHit = static_cast>(requiredHit); + + if (requireItsHits) { + for (int i = 0; i < 7; i++) { + if (requiredItsHit[i] > 0 && !hasHitOnITSlayer(track.itsClusterMap(), i)) { + return false; + } + } + } + + return true; + } + + void processData(SelCollisions::iterator const& collision, aod::V0Datas const& fullV0s, StrHadronDaughterTracks const& tracks) + { + registryData.fill(HIST("number_of_events_data"), 0.5); + + // Event Selection + if (!collision.sel8() || std::fabs(collision.posZ()) > zVtx) + return; + registryData.fill(HIST("number_of_events_data"), 1.5); + + for (const auto& track : tracks) { + + if (!passedTrackSelectionTpc(track)) + continue; + if (!passedPionSelection(track)) + continue; + + registryData.fill(HIST("trkPionTpc"), track.pt()); + + if (!passedTrackSelectionIts(track)) + continue; + + registryData.fill(HIST("trkPionTpcIts"), track.pt()); + } + + for (const auto& v0 : fullV0s) { + + const auto& posTrack = v0.posTrack_as(); + const auto& negTrack = v0.negTrack_as(); + if (!passedK0ShortSelection(v0)) + continue; + + if (!passedTrackSelectionTpc(posTrack)) + continue; + if (!passedTrackSelectionTpc(negTrack)) + continue; + if (!passedPionSelection(posTrack)) + continue; + if (!passedPionSelection(negTrack)) + continue; + + registryData.fill(HIST("secPionTpc"), posTrack.pt()); + registryData.fill(HIST("secPionTpc"), negTrack.pt()); + + if (!passedTrackSelectionIts(posTrack)) + continue; + registryData.fill(HIST("secPionTpcIts"), posTrack.pt()); + + if (!passedTrackSelectionIts(negTrack)) + continue; + registryData.fill(HIST("secPionTpcIts"), negTrack.pt()); + } + } + PROCESS_SWITCH(LfITSTPCMatchingSecondaryTracksQA, processData, "Process data", true); + + Preslice perCollisionV0 = o2::aod::v0data::collisionId; + Preslice perCollisionTrk = o2::aod::track::collisionId; + + void processMC(SimCollisions const& collisions, MCTracks const& mcTracks, aod::V0Datas const& fullV0s, const aod::McParticles&) + { + for (const auto& collision : collisions) { + registryMC.fill(HIST("number_of_events_mc"), 0.5); + + if (!collision.sel8() || std::fabs(collision.posZ()) > zVtx) + continue; + registryMC.fill(HIST("number_of_events_mc"), 1.5); + + auto v0sPerColl = fullV0s.sliceBy(perCollisionV0, collision.globalIndex()); + auto tracksPerColl = mcTracks.sliceBy(perCollisionTrk, collision.globalIndex()); + + for (const auto& track : tracksPerColl) { + if (!passedTrackSelectionTpc(track)) + continue; + if (!passedPionSelection(track)) + continue; + if (!track.has_mcParticle()) + continue; + const auto particle = track.mcParticle(); + if (std::fabs(particle.pdgCode()) != 211) + continue; + + registryMC.fill(HIST("trkPionTpcMc"), track.pt()); + if (!passedTrackSelectionIts(track)) + continue; + + registryMC.fill(HIST("trkPionTpcItsMc"), track.pt()); + } + + for (const auto& v0 : v0sPerColl) { + + const auto& posTrack = v0.posTrack_as(); + const auto& negTrack = v0.negTrack_as(); + if (!passedK0ShortSelection(v0)) + continue; + if (!passedTrackSelectionTpc(posTrack)) + continue; + if (!passedTrackSelectionTpc(negTrack)) + continue; + if (!passedPionSelection(posTrack)) + continue; + if (!passedPionSelection(negTrack)) + continue; + if (!posTrack.has_mcParticle()) + continue; + if (!negTrack.has_mcParticle()) + continue; + + auto posParticle = posTrack.mcParticle_as(); + auto negParticle = negTrack.mcParticle_as(); + if (!posParticle.has_mothers()) + continue; + if (!negParticle.has_mothers()) + continue; + + int pdgParent(0); + for (const auto& particleMotherOfNeg : negParticle.mothers_as()) { + for (const auto& particleMotherOfPos : posParticle.mothers_as()) { + if (particleMotherOfNeg == particleMotherOfPos) { + pdgParent = particleMotherOfNeg.pdgCode(); + } + } + } + if (pdgParent != 310) + continue; + + registryMC.fill(HIST("secPionTpcMc"), posTrack.pt()); + registryMC.fill(HIST("secPionTpcMc"), negTrack.pt()); + + if (!passedTrackSelectionIts(posTrack)) + continue; + registryMC.fill(HIST("secPionTpcItsMc"), posTrack.pt()); + + if (!passedTrackSelectionIts(negTrack)) + continue; + registryMC.fill(HIST("secPionTpcItsMc"), negTrack.pt()); + } + } + } + PROCESS_SWITCH(LfITSTPCMatchingSecondaryTracksQA, processMC, "Process MC", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} From 00f0bf26eac49d810ec33f9aeb2f78e3f0b50b7f Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Fri, 7 Feb 2025 18:22:31 +0100 Subject: [PATCH 0098/1650] [PWGLF] Optimise memory of the THns for cascade polarisation (#9811) --- .../TableProducer/Strangeness/cascadeflow.cxx | 44 +++++++++++-------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/cascadeflow.cxx b/PWGLF/TableProducer/Strangeness/cascadeflow.cxx index 43284ac6a87..ac784cdcc5f 100644 --- a/PWGLF/TableProducer/Strangeness/cascadeflow.cxx +++ b/PWGLF/TableProducer/Strangeness/cascadeflow.cxx @@ -66,7 +66,7 @@ std::shared_ptr hSignalScoreBeforeSel[2]; std::shared_ptr hBkgScoreBeforeSel[2]; std::shared_ptr hSignalScoreAfterSel[2]; std::shared_ptr hBkgScoreAfterSel[2]; -std::shared_ptr hSparseV2C[2]; +std::shared_ptr hSparseV2C[2]; } // namespace cascadev2 namespace cascade_flow_cuts_ml @@ -138,15 +138,15 @@ struct cascadeFlow { ConfigurableAxis axisQVsNorm{"axisQVsNorm", {200, -1.f, 1.f}, "axisQVsNorm"}; // THN axes - ConfigurableAxis thnConfigAxisFT0C{"thnConfigAxisFT0C", {80, 0, 80}, ""}; - ConfigurableAxis thnConfigAxisPt{"thnConfigAxisPt", {50, 0, 10}, ""}; + ConfigurableAxis thnConfigAxisFT0C{"thnConfigAxisFT0C", {8, 0, 80}, "FT0C centrality (%)"}; + ConfigurableAxis thnConfigAxisPt{"thnConfigAxisPt", {VARIABLE_WIDTH, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2, 2.25, 2.5, 2.75, 3, 3.5, 4, 5, 6, 8, 10}, "#it{p}_{T} (GeV/#it{c})"}; ConfigurableAxis thnConfigAxisCharge{"thnConfigAxisCharge", {2, 0, 2}, ""}; ConfigurableAxis thnConfigAxisMassXi{"thnConfigAxisMassXi", {45, 1.300, 1.345}, ""}; ConfigurableAxis thnConfigAxisMassOmega{"thnConfigAxisMassOmega", {45, 1.655, 1.690}, ""}; ConfigurableAxis thnConfigAxisMassLambda{"thnConfigAxisMassLambda", {60, 1.1, 1.13}, ""}; - ConfigurableAxis thnConfigAxisBDTScore{"thnConfigAxisBDTScore", {60, 0.4, 1}, ""}; + ConfigurableAxis thnConfigAxisBDTScore{"thnConfigAxisBDTScore", {15, 0.4, 1}, ""}; ConfigurableAxis thnConfigAxisV2{"thnConfigAxiV2", {100, -1., 1.}, ""}; - ConfigurableAxis thnConfigAxisPzs2Xi{"thnConffigAxiPzs2Xi", {200, -2.8, 2.8}, ""}; + ConfigurableAxis thnConfigAxisPzs2Xi{"thnConfigAxiPzs2Xi", {200, -2.8, 2.8}, ""}; ConfigurableAxis thnConfigAxisPzs2Omega{"thnConfigAxiPzs2Omega", {200, -65, 65}, ""}; ConfigurableAxis thnConfigAxisPzs2Lambda{"thnConfigAxiPzs2Lambda", {200, -2, 2}, ""}; ConfigurableAxis thnConfigAxisCos2Theta{"thnConfigAxiCos2Theta", {100, 0, 1}, ""}; @@ -501,14 +501,18 @@ struct cascadeFlow { const AxisSpec thnAxisCos2Theta{thnConfigAxisCos2Theta, "Cos2Theta"}; if (isFillTHNXi) { - histos.add("hXiV2", "THn for v2 of Xi", HistType::kTHnSparseF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisV2}); - histos.add("hXiPzs2", "THn for Pzs2 of Xi", HistType::kTHnSparseF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisMassLambda, thnAxisBDTScore, thnAxisPzs2Xi, thnAxisPzs2Lambda}); - histos.add("hXiCos2Theta", "THn for Cos2Theta of Xi", HistType::kTHnSparseF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisMassLambda, thnAxisBDTScore, thnAxisCos2Theta, thnAxisCos2Theta}); + histos.add("hXiV2", "THn for v2 of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisV2}); + histos.add("hXiPzs2", "THn for Pzs2 of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisPzs2Xi}); + histos.add("hXiPzs2FromLambda", "THn for Pzs2 of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisPzs2Lambda}); + histos.add("hXiCos2Theta", "THn for Cos2Theta of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCos2Theta}); + histos.add("hXiCos2ThetaFromLambda", "THn for Cos2Theta of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCos2Theta}); } if (isFillTHNOmega) { - histos.add("hOmegaV2", "THn for v2 of Omega", HistType::kTHnSparseF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisV2}); - histos.add("hOmegaPzs2", "THn for Pzs2 of Omega", HistType::kTHnSparseF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisMassLambda, thnAxisBDTScore, thnAxisPzs2Omega, thnAxisPzs2Lambda}); - histos.add("hOmegaCos2Theta", "THn for Cos2Theta of Omega", HistType::kTHnSparseF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisMassLambda, thnAxisBDTScore, thnAxisCos2Theta, thnAxisCos2Theta}); + histos.add("hOmegaV2", "THn for v2 of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisV2}); + histos.add("hOmegaPzs2", "THn for Pzs2 of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisPzs2Omega}); + histos.add("hOmegaPzs2FromLambda", "THn for Pzs2 of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisPzs2Lambda}); + histos.add("hOmegaCos2Theta", "THn for Cos2Theta of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCos2Theta}); + histos.add("hOmegaCos2ThetaFromLambda", "THn for Cos2Theta of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCos2Theta}); } histosMCGen.add("h2DGenXiEta08", "h2DGenXiEta08", HistType::kTH2F, {{100, 0, 100}, {400, 0, 20}}); @@ -534,7 +538,7 @@ struct cascadeFlow { cascadev2::hBkgScoreBeforeSel[iS] = histos.add(Form("hBkgScoreBeforeSel%s", cascadev2::speciesNames[iS].data()), "Bkg score before selection;BDT first score;entries", HistType::kTH1F, {{100, 0., 1.}}); cascadev2::hSignalScoreAfterSel[iS] = histos.add(Form("hSignalScoreAfterSel%s", cascadev2::speciesNames[iS].data()), "Signal score after selection;BDT first score;entries", HistType::kTH1F, {{100, 0., 1.}}); cascadev2::hBkgScoreAfterSel[iS] = histos.add(Form("hBkgScoreAfterSel%s", cascadev2::speciesNames[iS].data()), "Bkg score after selection;BDT first score;entries", HistType::kTH1F, {{100, 0., 1.}}); - cascadev2::hSparseV2C[iS] = histos.add(Form("hSparseV2C%s", cascadev2::speciesNames[iS].data()), "hSparseV2C", HistType::kTHnSparseF, {massCascAxis[iS], ptAxis, v2Axis, CentAxis}); + cascadev2::hSparseV2C[iS] = histos.add(Form("hSparseV2C%s", cascadev2::speciesNames[iS].data()), "hSparseV2C", HistType::kTHnF, {massCascAxis[iS], ptAxis, v2Axis, CentAxis}); } if (isApplyML) { // Configure and initialise the ML class @@ -813,14 +817,18 @@ struct cascadeFlow { if (std::abs(casc.eta()) < etaCasc) { if (isFillTHNXi) { - histos.get(HIST("hXiV2"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], v2CEP); - histos.get(HIST("hXiPzs2"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), casc.mLambda(), BDTresponse[0], Pzs2Xi, Pzs2LambdaFromCasc); - histos.get(HIST("hXiCos2Theta"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), casc.mLambda(), BDTresponse[0], Cos2ThetaXi, Cos2ThetaLambda); + histos.get(HIST("hXiV2"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], v2CEP); + histos.get(HIST("hXiPzs2"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], Pzs2Xi); + histos.get(HIST("hXiPzs2FromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], Pzs2LambdaFromCasc); + histos.get(HIST("hXiCos2Theta"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], Cos2ThetaXi); + histos.get(HIST("hXiCos2ThetaFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], Cos2ThetaLambda); } if (isFillTHNOmega) { - histos.get(HIST("hOmegaV2"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[1], v2CEP); - histos.get(HIST("hOmegaPzs2"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), casc.mLambda(), BDTresponse[1], Pzs2Omega, Pzs2LambdaFromCasc); - histos.get(HIST("hOmegaCos2Theta"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), casc.mLambda(), BDTresponse[1], Cos2ThetaOmega, Cos2ThetaLambda); + histos.get(HIST("hOmegaV2"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[1], v2CEP); + histos.get(HIST("hOmegaPzs2"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[1], Pzs2Omega); + histos.get(HIST("hOmegaPzs2FromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[1], Pzs2LambdaFromCasc); + histos.get(HIST("hOmegaCos2Theta"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[1], Cos2ThetaOmega); + histos.get(HIST("hOmegaCos2ThetaFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[1], Cos2ThetaLambda); } } From 3a2beecf487410e651c9e9c77f1c3680714064db Mon Sep 17 00:00:00 2001 From: rebeccacerri <116571396+rebeccacerri@users.noreply.github.com> Date: Fri, 7 Feb 2025 19:46:14 +0100 Subject: [PATCH 0099/1650] [PWGDQ] Adding_Muon_Cut (#9822) --- PWGDQ/Core/CutsLibrary.cxx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/PWGDQ/Core/CutsLibrary.cxx b/PWGDQ/Core/CutsLibrary.cxx index e9a59405692..d24196f9e4d 100644 --- a/PWGDQ/Core/CutsLibrary.cxx +++ b/PWGDQ/Core/CutsLibrary.cxx @@ -2864,6 +2864,12 @@ AnalysisCompositeCut* o2::aod::dqcuts::GetCompositeCut(const char* cutName) return cut; } + if (!nameStr.compare("muonQualityCuts10SigmaPDCA_MCHMID")) { + cut->AddCut(GetAnalysisCut("muonQualityCuts10SigmaPDCA")); + cut->AddCut(GetAnalysisCut("MCHMID")); + return cut; + } + if (!nameStr.compare("muonLowPt10SigmaPDCA")) { cut->AddCut(GetAnalysisCut("muonLowPt")); cut->AddCut(GetAnalysisCut("muonQualityCuts10SigmaPDCA")); From bbfc97b7c37581ce8de31dc0d9f2467ebaf1068d Mon Sep 17 00:00:00 2001 From: Stefano Cannito <143754257+scannito@users.noreply.github.com> Date: Fri, 7 Feb 2025 20:08:25 +0100 Subject: [PATCH 0100/1650] [PWGLF] New type of closure for phik0shortanalysis.cxx (#9823) --- .../Tasks/Strangeness/phik0shortanalysis.cxx | 79 ++++++++++++++++++- 1 file changed, 77 insertions(+), 2 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx index f7b80611267..8c65cca608d 100644 --- a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx @@ -142,7 +142,9 @@ struct Phik0shortanalysis { Configurable cfgiskNoITSROFrameBorder{"cfgiskNoITSROFrameBorder", false, "kNoITSROFrameBorder request on RecMC collisions"}; // Configurable for MC closure - Configurable cfgisGenMCForClosure{"cfgisGenMCForClosure", false, "isGenMCForClosure"}; + Configurable cfgisRecMCWPDGForClosure1{"cfgisRecMCWPDGForClosure1", false, "RecoMC with PDG Codes for Closure only for Associated particles"}; + Configurable cfgisRecMCWPDGForClosure2{"cfgisRecMCWPDGForClosure2", false, "RecoMC with PDG Codes for Closure"}; + Configurable cfgisGenMCForClosure{"cfgisGenMCForClosure", false, "GenMC for Closure"}; // Constants double massKa = o2::constants::physics::MassKPlus; @@ -1369,7 +1371,7 @@ struct Phik0shortanalysis { PROCESS_SWITCH(Phik0shortanalysis, processRecMCClosurePhiQA, "Process for ReCMCQA and Phi in RecMCClosure", false); - void processRecMCClosurePhiK0S(SimCollisions::iterator const& collision, FullMCTracks const&, FullV0s const& V0s, V0DauMCTracks const&, MCCollisions const&) + void processRecMCClosurePhiK0S(SimCollisions::iterator const& collision, FullMCTracks const&, FullMCV0s const& V0s, V0DauMCTracks const&, MCCollisions const&) { if (!acceptEventQA(collision, false)) return; @@ -1386,6 +1388,14 @@ struct Phik0shortanalysis { // V0 already reconstructed by the builder for (const auto& v0 : V0s) { + if (cfgisRecMCWPDGForClosure1) { + if (!v0.has_mcParticle()) + continue; + auto v0mcparticle = v0.mcParticle(); + if (v0mcparticle.pdgCode() != 310 || !v0mcparticle.isPhysicalPrimary()) + continue; + } + const auto& posDaughterTrack = v0.posTrack_as(); const auto& negDaughterTrack = v0.negTrack_as(); @@ -1415,6 +1425,35 @@ struct Phik0shortanalysis { if (track2ID == track1ID) continue; // condition to avoid double counting of pair + if (cfgisRecMCWPDGForClosure2) { + if (!track1.has_mcParticle()) + continue; + auto mcTrack1 = track1.mcParticle_as(); + if (mcTrack1.pdgCode() != 321 || !mcTrack1.isPhysicalPrimary()) + continue; + + if (!track2.has_mcParticle()) + continue; + auto mcTrack2 = track2.mcParticle_as(); + if (mcTrack2.pdgCode() != -321 || !mcTrack2.isPhysicalPrimary()) + continue; + + bool isMCMotherPhi = false; + for (const auto& motherOfMcTrack1 : mcTrack1.mothers_as()) { + for (const auto& motherOfMcTrack2 : mcTrack2.mothers_as()) { + if (motherOfMcTrack1.pdgCode() != motherOfMcTrack2.pdgCode()) + continue; + if (motherOfMcTrack1.globalIndex() != motherOfMcTrack2.globalIndex()) + continue; + if (motherOfMcTrack1.pdgCode() != 333) + continue; + isMCMotherPhi = true; + } + } + if (!isMCMotherPhi) + continue; + } + TLorentzVector recPhi = recMother(track1, track2, massKa, massKa); if (recPhi.M() < lowMPhi || recPhi.M() > upMPhi) @@ -1461,6 +1500,13 @@ struct Phik0shortanalysis { // Loop over all primary pion candidates for (const auto& track : fullMCTracks) { + if (cfgisRecMCWPDGForClosure1) { + if (!track.has_mcParticle()) + continue; + auto mcTrack = track.mcParticle_as(); + if (std::abs(mcTrack.pdgCode()) != 211 || !mcTrack.isPhysicalPrimary()) + continue; + } // Pion selection if (!selectionPion(track)) @@ -1487,6 +1533,35 @@ struct Phik0shortanalysis { if (track2ID == track1ID) continue; // condition to avoid double counting of pair + if (cfgisRecMCWPDGForClosure2) { + if (!track1.has_mcParticle()) + continue; + auto mcTrack1 = track1.mcParticle_as(); + if (mcTrack1.pdgCode() != 321 || !mcTrack1.isPhysicalPrimary()) + continue; + + if (!track2.has_mcParticle()) + continue; + auto mcTrack2 = track2.mcParticle_as(); + if (mcTrack2.pdgCode() != -321 || !mcTrack2.isPhysicalPrimary()) + continue; + + bool isMCMotherPhi = false; + for (const auto& motherOfMcTrack1 : mcTrack1.mothers_as()) { + for (const auto& motherOfMcTrack2 : mcTrack2.mothers_as()) { + if (motherOfMcTrack1.pdgCode() != motherOfMcTrack2.pdgCode()) + continue; + if (motherOfMcTrack1.globalIndex() != motherOfMcTrack2.globalIndex()) + continue; + if (motherOfMcTrack1.pdgCode() != 333) + continue; + isMCMotherPhi = true; + } + } + if (!isMCMotherPhi) + continue; + } + TLorentzVector recPhi = recMother(track1, track2, massKa, massKa); if (recPhi.M() < lowMPhi || recPhi.M() > upMPhi) From 51e3624f021151a3e046df470d5520934e9f39d4 Mon Sep 17 00:00:00 2001 From: alcaliva <32872606+alcaliva@users.noreply.github.com> Date: Fri, 7 Feb 2025 21:16:38 +0100 Subject: [PATCH 0101/1650] [PWGLF] Added selection on ncr/findable clusters (#9824) --- PWGLF/Tasks/Nuspex/nucleiInJets.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/nucleiInJets.cxx b/PWGLF/Tasks/Nuspex/nucleiInJets.cxx index 8ef42f4c65c..9960759e9ac 100644 --- a/PWGLF/Tasks/Nuspex/nucleiInJets.cxx +++ b/PWGLF/Tasks/Nuspex/nucleiInJets.cxx @@ -106,8 +106,8 @@ struct NucleiInJets { Configurable par0{"par0", 0.00164, "par 0"}; Configurable par1{"par1", 0.00231, "par 1"}; Configurable minItsNclusters{"minItsNclusters", 5, "minimum number of ITS clusters"}; - Configurable minTpcNclusters{"minTpcNclusters", 80, "minimum number of TPC clusters"}; Configurable minTpcNcrossedRows{"minTpcNcrossedRows", 80, "minimum number of TPC crossed pad rows"}; + Configurable minTpcNcrossedRowsOverFindable{"minTpcNcrossedRowsOverFindable", 0.8, "crossed rows/findable"}; Configurable maxChiSquareTpc{"maxChiSquareTpc", 4.0, "maximum TPC chi^2/Ncls"}; Configurable maxChiSquareIts{"maxChiSquareIts", 36.0, "maximum ITS chi^2/Ncls"}; Configurable minPt{"minPt", 0.3, "minimum pt of the tracks"}; @@ -274,7 +274,7 @@ struct NucleiInJets { return false; if (track.tpcNClsCrossedRows() < 70) return false; - if (track.tpcNClsCrossedRows() / track.tpcNClsFindable() < 0.8) + if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < 0.8) return false; if (track.tpcChi2NCl() > 4) return false; @@ -320,10 +320,10 @@ struct NucleiInJets { return false; if (!track.hasTPC()) return false; - if (track.tpcNClsFound() < minTpcNclusters) - return false; if (track.tpcNClsCrossedRows() < minTpcNcrossedRows) return false; + if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < minTpcNcrossedRowsOverFindable) + return false; if (track.tpcChi2NCl() > maxChiSquareTpc) return false; if (track.itsChi2NCl() > maxChiSquareIts) From 42f6ccdcf0754646e3174f4acf4a2cda0a116d09 Mon Sep 17 00:00:00 2001 From: sarjeetagami <162087855+sarjeetagami@users.noreply.github.com> Date: Sat, 8 Feb 2025 03:27:45 +0530 Subject: [PATCH 0102/1650] [PWGLF] added MC weight in kstar flow task (#9829) Co-authored-by: sarjeeta gami --- PWGLF/Tasks/Resonances/kstarpbpb.cxx | 177 ++++++++++++++------------- 1 file changed, 93 insertions(+), 84 deletions(-) diff --git a/PWGLF/Tasks/Resonances/kstarpbpb.cxx b/PWGLF/Tasks/Resonances/kstarpbpb.cxx index 71317b105f2..356def5dedd 100644 --- a/PWGLF/Tasks/Resonances/kstarpbpb.cxx +++ b/PWGLF/Tasks/Resonances/kstarpbpb.cxx @@ -53,6 +53,7 @@ #include "DataFormatsParameters/GRPObject.h" #include "DataFormatsParameters/GRPMagField.h" #include "CCDB/BasicCCDBManager.h" +#include "CCDB/CcdbApi.h" using namespace o2; using namespace o2::framework; @@ -63,15 +64,23 @@ struct kstarpbpb { int mRunNumber; int multEstimator; float d_bz; + + struct : ConfigurableGroup { + Configurable cfgURL{"cfgURL", "http://alice-ccdb.cern.ch", "Address of the CCDB to browse"}; + Configurable nolaterthan{"ccdb-no-later-than", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "Latest acceptable timestamp of creation for the object"}; + } cfgCcdbParam; + + // Enable access to the CCDB for the offset and correction constants and save them in dedicated variables. Service ccdb; + o2::ccdb::CcdbApi ccdbApi; Service pdg; // CCDB options - Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; - Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; - Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; - Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; - Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; + // Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + // Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; + // Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + // Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; + // Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; // events Configurable cfgCutVertex{"cfgCutVertex", 10.0f, "Accepted z-vertex range"}; @@ -98,7 +107,7 @@ struct kstarpbpb { Configurable removefaketrak{"removefaketrack", true, "Remove fake track from momentum difference"}; Configurable ConfFakeKaonCut{"ConfFakeKaonCut", 0.1, "Cut based on track from momentum difference"}; ConfigurableAxis configThnAxisPhiminusPsi{"configThnAxisPhiminusPsi", {6, 0.0, TMath::Pi()}, "#phi - #psi"}; - ConfigurableAxis configThnAxisV2{"configThnAxisV2", {200, -1, 1}, "V2"}; + ConfigurableAxis configThnAxisV2{"configThnAxisV2", {400, -16, 16}, "V2"}; Configurable additionalEvsel{"additionalEvsel", false, "Additional event selcection"}; Configurable timFrameEvsel{"timFrameEvsel", false, "TPC Time frame boundary cut"}; Configurable additionalEvselITS{"additionalEvselITS", true, "Additional event selcection for ITS"}; @@ -117,7 +126,8 @@ struct kstarpbpb { Configurable mix{"mix", false, "mix"}; Configurable fillOccupancy{"fillOccupancy", false, "fill Occupancy"}; Configurable cfgOccupancyCut{"cfgOccupancyCut", 500, "Occupancy cut"}; - Configurable useSP{"useSP", true, "useSP"}; + Configurable useWeight{"useWeight", false, "use EP dep effi weight"}; + Configurable ConfWeightPath{"ConfWeightPath", "Users/s/skundu/My/Object/PbPb2024/MCWeight2", "Path to gain calibration"}; Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; Filter centralityFilter = nabs(aod::cent::centFT0C) < cfgCutCentrality; @@ -152,9 +162,8 @@ struct kstarpbpb { AxisSpec centAxis = {8, 0, 80, "V0M (%)"}; AxisSpec occupancyAxis = {occupancyBinning, "Occupancy"}; - if (same) { - histos.add("hSparseV2SASameEvent_V2", "hSparseV2SASameEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); - } + histos.add("hSparseV2SASameEvent_V2", "hSparseV2SASameEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); + if (like) { histos.add("hSparseV2SAlikeEventNN_V2", "hSparseV2SAlikeEventNN_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); histos.add("hSparseV2SAlikeEventPP_V2", "hSparseV2SAlikeEventPP_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); @@ -225,6 +234,11 @@ struct kstarpbpb { fMultMultPVCut = new TF1("fMultMultPVCut", "[0]+[1]*x+[2]*x*x", 0, 5000); fMultMultPVCut->SetParameters(-0.1, 0.785, -4.7e-05); } + ccdb->setURL(cfgCcdbParam.cfgURL); + ccdbApi.init("http://alice-ccdb.cern.ch"); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setCreatedNotAfter(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); } double massKa = o2::constants::physics::MassKPlus; @@ -418,7 +432,10 @@ struct kstarpbpb { using BinningTypeVertexContributor = ColumnBinningPolicy; ROOT::Math::PxPyPzMVector KstarMother, daughter1, daughter2, kaonrot, kstarrot; - void processSE(EventCandidates::iterator const& collision, TrackCandidates const& tracks, aod::BCs const&) + int currentRunNumber = -999; + int lastRunNumber = -999; + TH3D* hweight; + void processSE(EventCandidates::iterator const& collision, TrackCandidates const& tracks, aod::BCsWithTimestamps const&) { if (!collision.sel8() || !collision.triggereventep() || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(aod::evsel::kNoITSROFrameBorder) || !collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV) || !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { return; @@ -456,6 +473,14 @@ struct kstarpbpb { histos.fill(HIST("hOccupancy"), occupancy); histos.fill(HIST("hVtxZ"), collision.posZ()); } + auto bc = collision.bc_as(); + currentRunNumber = collision.bc_as().runNumber(); + if (useWeight && (currentRunNumber != lastRunNumber)) { + hweight = ccdb->getForTimeStamp(ConfWeightPath.value, bc.timestamp()); + } + lastRunNumber = currentRunNumber; + float weight1 = 1.0; + float weight2 = 1.0; for (auto track1 : tracks) { if (!selectionTrack(track1)) { continue; @@ -466,6 +491,13 @@ struct kstarpbpb { continue; } track1kaon = true; + if (useWeight) { + if (track1.pt() < 10.0 && track1.pt() > 0.15) { + weight1 = hweight->GetBinContent(hweight->FindBin(centrality, GetPhiInRange(track1.phi() - psiFT0C), track1.pt() + 0.000005)); + } else { + weight1 = 1; + } + } for (auto track2 : tracks) { if (!selectionTrack(track2)) { continue; @@ -482,6 +514,13 @@ struct kstarpbpb { if (!track1kaon || !track2pion) { continue; } + if (useWeight) { + if (track2.pt() < 10.0 && track2.pt() > 0.15) { + weight2 = hweight->GetBinContent(hweight->FindBin(centrality, GetPhiInRange(track2.phi() - psiFT0C), track2.pt() + 0.000005)); + } else { + weight2 = 1; + } + } daughter1 = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); daughter2 = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massPi); KstarMother = daughter1 + daughter2; @@ -489,51 +528,37 @@ struct kstarpbpb { continue; } auto phiminuspsi = GetPhiInRange(KstarMother.Phi() - psiFT0C); - if (useSP) { - v2 = TMath::Cos(2.0 * phiminuspsi) * QFT0C; - } - if (!useSP) { - v2 = TMath::Cos(2.0 * phiminuspsi); + + v2 = TMath::Cos(2.0 * phiminuspsi) * QFT0C; + auto totalweight = weight1 * weight2; + if (totalweight <= 0.0005) { + totalweight = 1.0; } - // unlike sign - if (track1.sign() * track2.sign() < 0) { - if (same) { - histos.fill(HIST("hSparseV2SASameEvent_V2"), KstarMother.M(), KstarMother.Pt(), v2, centrality); - } - if (fillRotation) { - for (int nrotbkg = 0; nrotbkg < nBkgRotations; nrotbkg++) { - auto anglestart = confMinRot; - auto angleend = confMaxRot; - auto anglestep = (angleend - anglestart) / (1.0 * (nBkgRotations - 1)); - auto rotangle = anglestart + nrotbkg * anglestep; - histos.fill(HIST("hRotation"), rotangle); - auto rotkaonPx = track1.px() * std::cos(rotangle) - track1.py() * std::sin(rotangle); - auto rotkaonPy = track1.px() * std::sin(rotangle) + track1.py() * std::cos(rotangle); - kaonrot = ROOT::Math::PxPyPzMVector(rotkaonPx, rotkaonPy, track1.pz(), massKa); - kstarrot = kaonrot + daughter2; - if (TMath::Abs(kstarrot.Rapidity()) > confRapidity) { - continue; - } - auto phiminuspsiRot = GetPhiInRange(kstarrot.Phi() - psiFT0C); - if (useSP) { - v2Rot = TMath::Cos(2.0 * phiminuspsiRot) * QFT0C; - } - if (!useSP) { - v2Rot = TMath::Cos(2.0 * phiminuspsiRot); - } - histos.fill(HIST("hSparseV2SASameEventRotational_V2"), kstarrot.M(), kstarrot.Pt(), v2Rot, centrality); - } - } + + if (useWeight) { + histos.fill(HIST("hSparseV2SASameEvent_V2"), KstarMother.M(), KstarMother.Pt(), v2, centrality, 1 / totalweight); + } else { + histos.fill(HIST("hSparseV2SASameEvent_V2"), KstarMother.M(), KstarMother.Pt(), v2, centrality); } - // like sign - if (track1.sign() * track2.sign() > 0) { - if (like) { - if (track1.sign() > 0 && track2.sign() > 0) { - histos.fill(HIST("hSparseV2SAlikeEventPP_V2"), KstarMother.M(), KstarMother.Pt(), v2, centrality); - } - if (track1.sign() < 0 && track2.sign() < 0) { - histos.fill(HIST("hSparseV2SAlikeEventNN_V2"), KstarMother.M(), KstarMother.Pt(), v2, centrality); + if (fillRotation) { + for (int nrotbkg = 0; nrotbkg < nBkgRotations; nrotbkg++) { + auto anglestart = confMinRot; + auto angleend = confMaxRot; + auto anglestep = (angleend - anglestart) / (1.0 * (nBkgRotations - 1)); + auto rotangle = anglestart + nrotbkg * anglestep; + histos.fill(HIST("hRotation"), rotangle); + auto rotkaonPx = track1.px() * std::cos(rotangle) - track1.py() * std::sin(rotangle); + auto rotkaonPy = track1.px() * std::sin(rotangle) + track1.py() * std::cos(rotangle); + kaonrot = ROOT::Math::PxPyPzMVector(rotkaonPx, rotkaonPy, track1.pz(), massKa); + kstarrot = kaonrot + daughter2; + if (TMath::Abs(kstarrot.Rapidity()) > confRapidity) { + continue; } + auto phiminuspsiRot = GetPhiInRange(kstarrot.Phi() - psiFT0C); + + v2Rot = TMath::Cos(2.0 * phiminuspsiRot) * QFT0C; + + histos.fill(HIST("hSparseV2SASameEventRotational_V2"), kstarrot.M(), kstarrot.Pt(), v2Rot, centrality); } } } @@ -541,7 +566,7 @@ struct kstarpbpb { } PROCESS_SWITCH(kstarpbpb, processSE, "Process Same event latest", true); - void processSameEvent(EventCandidates::iterator const& collision, TrackCandidates const& /*tracks*/, aod::BCs const&) + void processSameEvent(EventCandidates::iterator const& collision, TrackCandidates const& /*tracks, aod::BCs const&*/, aod::BCsWithTimestamps const&) { if (!collision.sel8()) { return; @@ -697,12 +722,9 @@ struct kstarpbpb { continue; } auto phiminuspsi = GetPhiInRange(KstarMother.Phi() - psiFT0C); - if (useSP) { - v2 = TMath::Cos(2.0 * phiminuspsi) * QFT0C; - } - if (!useSP) { - v2 = TMath::Cos(2.0 * phiminuspsi); - } + + v2 = TMath::Cos(2.0 * phiminuspsi) * QFT0C; + histos.fill(HIST("hSparseV2SASameEvent_V2"), KstarMother.M(), KstarMother.Pt(), v2, centrality); } if (fillRotation) { @@ -730,12 +752,9 @@ struct kstarpbpb { continue; } auto phiminuspsiRot = GetPhiInRange(kstarrot.Phi() - psiFT0C); - if (useSP) { - v2Rot = TMath::Cos(2.0 * phiminuspsiRot) * QFT0C; - } - if (!useSP) { - v2Rot = TMath::Cos(2.0 * phiminuspsiRot); - } + + v2Rot = TMath::Cos(2.0 * phiminuspsiRot) * QFT0C; + histos.fill(HIST("hSparseV2SASameEventRotational_V2"), kstarrot.M(), kstarrot.Pt(), v2Rot, centrality); } } @@ -846,12 +865,8 @@ struct kstarpbpb { continue; } auto phiminuspsi = GetPhiInRange(KstarMother.Phi() - psiFT0C); - if (useSP) { - v2 = TMath::Cos(2.0 * phiminuspsi) * QFT0C; - } - if (!useSP) { - v2 = TMath::Cos(2.0 * phiminuspsi); - } + + v2 = TMath::Cos(2.0 * phiminuspsi) * QFT0C; histos.fill(HIST("hSparseV2SAlikeEventNN_V2"), KstarMother.M(), KstarMother.Pt(), v2, centrality); } } else if (track1pion && track2kaon) { @@ -863,12 +878,9 @@ struct kstarpbpb { continue; } auto phiminuspsi = GetPhiInRange(KstarMother.Phi() - psiFT0C); - if (useSP) { - v2 = TMath::Cos(2.0 * phiminuspsi) * QFT0C; - } - if (!useSP) { - v2 = TMath::Cos(2.0 * phiminuspsi); - } + + v2 = TMath::Cos(2.0 * phiminuspsi) * QFT0C; + histos.fill(HIST("hSparseV2SAlikeEventPP_V2"), KstarMother.M(), KstarMother.Pt(), v2, centrality); } } @@ -1000,12 +1012,9 @@ struct kstarpbpb { continue; } auto phiminuspsi = GetPhiInRange(KstarMother.Phi() - psiFT0C); - if (useSP) { - v2 = TMath::Cos(2.0 * phiminuspsi) * QFT0C; - } - if (!useSP) { - v2 = TMath::Cos(2.0 * phiminuspsi); - } + + v2 = TMath::Cos(2.0 * phiminuspsi) * QFT0C; + if (mix) { histos.fill(HIST("hSparseV2SAMixedEvent_V2"), KstarMother.M(), KstarMother.Pt(), v2, centrality); } From d5839078b27b1098e47b4abce66e5e921b865bde Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Fri, 7 Feb 2025 23:32:20 +0100 Subject: [PATCH 0103/1650] [PWGLF] fix rotational background (#9830) --- PWGLF/Tasks/Resonances/highmasslambda.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Resonances/highmasslambda.cxx b/PWGLF/Tasks/Resonances/highmasslambda.cxx index f5a249801ea..9bbe5243e5c 100644 --- a/PWGLF/Tasks/Resonances/highmasslambda.cxx +++ b/PWGLF/Tasks/Resonances/highmasslambda.cxx @@ -1093,7 +1093,7 @@ struct highmasslambda { double anglesignrot = decaylengthxrot * LambdacRot.Px() + decaylengthyrot * LambdacRot.Py() + decaylengthzrot * LambdacRot.Pz(); double CPAlambdacrot = anglesignrot / (decaylengthrot * LambdacRot.P()); if (LambdacRot.M() > cMinLambdaMass && LambdacRot.M() <= cMaxLambdaMass && std::abs(LambdacRot.Rapidity()) < confRapidity && LambdacRot.Pt() > 1.0 && LambdacRot.Pt() <= 6.0 && decaylengthrot < ConfMaxDecayLength && CPAlambdacrot > ConfMinCPA) { - histos.fill(HIST("hSparseV2SASameEventRotational_V2_SVX"), LambdacRot.M(), LambdacRot.Pt(), v2Rot, decaylengthrot, CPAlambdacrot); + histos.fill(HIST("hSparseV2SASameEventRotational_V2_SVX"), LambdacRot.M(), LambdacRot.Pt(), v2Rot, decaylength, CPAlambdacrot); } } } From b6809422d2914d2c2d3cbeadde4b23a04e829dc6 Mon Sep 17 00:00:00 2001 From: Anantha Padmanabhan M Nair <82643666+ananthapadmanabhan18@users.noreply.github.com> Date: Sat, 8 Feb 2025 04:02:41 +0530 Subject: [PATCH 0104/1650] [PWGUD] Removed y and pT cuts from MC gen process (#9827) --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 134 +++++++++++++++++------------- 1 file changed, 76 insertions(+), 58 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index 1017101449c..40f024f737c 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -62,7 +62,7 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct Configurable tpcNClsFindableCut{"tpcNClsFindableCut", 70, "Min tpcNClsFindable"}; Configurable itsChi2Cut{"itsChi2Cut", 36, "Max itsChi2NCl"}; Configurable etaCut{"etaCut", 0.9, "Track Pseudorapidity"}; - Configurable pTcut{"pTcut", 0, "Track Pt"}; + Configurable pTcut{"pTcut", 0.15, "Track Pt"}; Configurable nSigmaTPCcut{"nSigmaTPCcut", 3, "TPC cut"}; Configurable nSigmaTOFcut{"nSigmaTOFcut", 3, "TOF cut"}; @@ -88,26 +88,26 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosData.add("EventCounts", "Total Events; Events", kTH1F, {{10, 0, 10}}); // TPC nSigma - histosData.add("tpcNSigmaPi_WOTS", "TPC nSigma Pion without track selection; Events", kTH1F, {{1000, -15, 15}}); - histosData.add("tpcNSigmaPi_WTS", "TPC nSigma Pion with track selection; Events", kTH1F, {{1000, -15, 15}}); - histosData.add("tpcNSigmaPi_WTS_PID_Pi", "TPC nSigma Pion with track selection and PID Selection of Pi; Entries", kTH1F, {{1000, -15, 15}}); + histosData.add("tpcNSigmaPi_WOTS", "TPC nSigma Pion without track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tpcNSigmaPi_WTS", "TPC nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tpcNSigmaPi_WTS_PID_Pi", "TPC nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); // TPC nSigma of other particles with selected pion tracks - histosData.add("tpcNSigmaKa_WTS_PID_Pi", "TPC nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH1F, {{1000, -15, 15}}); - histosData.add("tpcNSigmaPr_WTS_PID_Pi", "TPC nSigma Proton with track selection and PID Selection of Pion; Entries", kTH1F, {{1000, -15, 15}}); - histosData.add("tpcNSigmaEl_WTS_PID_Pi", "TPC nSigma Electron with track selection and PID Selection of Pion; Entries", kTH1F, {{1000, -15, 15}}); - histosData.add("tpcNSigmaMu_WTS_PID_Pi", "TPC nSigma Muon with track selection and PID Selection of Pion; Entries", kTH1F, {{1000, -15, 15}}); + histosData.add("tpcNSigmaKa_WTS_PID_Pi", "TPC nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tpcNSigmaPr_WTS_PID_Pi", "TPC nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tpcNSigmaEl_WTS_PID_Pi", "TPC nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tpcNSigmaMu_WTS_PID_Pi", "TPC nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); // TOF nSigma - histosData.add("tofNSigmaPi_WTS", "TOF nSigma Pion with track selection; Events", kTH1F, {{1000, -15, 15}}); - histosData.add("tofNSigmaPi_WOTS", "TOF nSigma Pion without track selection; Events", kTH1F, {{1000, -15, 15}}); - histosData.add("tofNSigmaPi_WTS_PID_Pi", "TOF nSigma Pion with track selection and PID Selection of Pi; Entries", kTH1F, {{1000, -15, 15}}); + histosData.add("tofNSigmaPi_WTS", "TOF nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tofNSigmaPi_WOTS", "TOF nSigma Pion without track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tofNSigmaPi_WTS_PID_Pi", "TOF nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); // TOF nSigma of other particles with selected pion tracks - histosData.add("tofNSigmaKa_WTS_PID_Pi", "TOF nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH1F, {{1000, -15, 15}}); - histosData.add("tofNSigmaPr_WTS_PID_Pi", "TOF nSigma Proton with track selection and PID Selection of Pion; Entries", kTH1F, {{1000, -15, 15}}); - histosData.add("tofNSigmaEl_WTS_PID_Pi", "TOF nSigma Electron with track selection and PID Selection of Pion; Entries", kTH1F, {{1000, -15, 15}}); - histosData.add("tofNSigmaMu_WTS_PID_Pi", "TOF nSigma Muon with track selection and PID Selection of Pion; Entries", kTH1F, {{1000, -15, 15}}); + histosData.add("tofNSigmaKa_WTS_PID_Pi", "TOF nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tofNSigmaPr_WTS_PID_Pi", "TOF nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tofNSigmaEl_WTS_PID_Pi", "TOF nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tofNSigmaMu_WTS_PID_Pi", "TOF nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); // Track Transverse Momentum histosData.add("pT_track_WOTS", "pT without track selection; pT [GeV/c]; Counts", kTH1F, {{nBinsPt, 0, 2}}); @@ -164,6 +164,8 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct // MC Gen Stuff if (ifMCAnalysis) { + // counts + histosMCgen.add("rhoPrimeCounts", "Total Rho prime Events; Events", kTH1F, {{10, 0, 10}}); // Track Stuff histosMCgen.add("MCgen_particle_pT", "Generated pT; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 10}}); @@ -187,26 +189,26 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosMCreco.add("EventCounts", "Total Events; Events", kTH1F, {{10, 0, 10}}); // TPC nSigma - histosMCreco.add("tpcNSigmaPi_WOTS", "TPC nSigma Pion without track selection; Events", kTH1F, {{1000, -15, 15}}); - histosMCreco.add("tpcNSigmaPi_WTS", "TPC nSigma Pion with track selection; Events", kTH1F, {{1000, -15, 15}}); - histosMCreco.add("tpcNSigmaPi_WTS_PID_Pi", "TPC nSigma Pion with track selection and PID Selection of Pi; Entries", kTH1F, {{1000, -15, 15}}); + histosMCreco.add("tpcNSigmaPi_WOTS", "TPC nSigma Pion without track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tpcNSigmaPi_WTS", "TPC nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tpcNSigmaPi_WTS_PID_Pi", "TPC nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); // TPC nSigma of other particles with selected pion tracks - histosMCreco.add("tpcNSigmaKa_WTS_PID_Pi", "TPC nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH1F, {{1000, -15, 15}}); - histosMCreco.add("tpcNSigmaPr_WTS_PID_Pi", "TPC nSigma Proton with track selection and PID Selection of Pion; Entries", kTH1F, {{1000, -15, 15}}); - histosMCreco.add("tpcNSigmaEl_WTS_PID_Pi", "TPC nSigma Electron with track selection and PID Selection of Pion; Entries", kTH1F, {{1000, -15, 15}}); - histosMCreco.add("tpcNSigmaMu_WTS_PID_Pi", "TPC nSigma Muon with track selection and PID Selection of Pion; Entries", kTH1F, {{1000, -15, 15}}); + histosMCreco.add("tpcNSigmaKa_WTS_PID_Pi", "TPC nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tpcNSigmaPr_WTS_PID_Pi", "TPC nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tpcNSigmaEl_WTS_PID_Pi", "TPC nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tpcNSigmaMu_WTS_PID_Pi", "TPC nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); // TOF nSigma - histosMCreco.add("tofNSigmaPi_WTS", "TOF nSigma Pion with track selection; Events", kTH1F, {{1000, -15, 15}}); - histosMCreco.add("tofNSigmaPi_WOTS", "TOF nSigma Pion without track selection; Events", kTH1F, {{1000, -15, 15}}); - histosMCreco.add("tofNSigmaPi_WTS_PID_Pi", "TOF nSigma Pion with track selection and PID Selection of Pi; Entries", kTH1F, {{1000, -15, 15}}); + histosMCreco.add("tofNSigmaPi_WTS", "TOF nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tofNSigmaPi_WOTS", "TOF nSigma Pion without track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tofNSigmaPi_WTS_PID_Pi", "TOF nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); // TOF nSigma of other particles with selected pion tracks - histosMCreco.add("tofNSigmaKa_WTS_PID_Pi", "TOF nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH1F, {{1000, -15, 15}}); - histosMCreco.add("tofNSigmaPr_WTS_PID_Pi", "TOF nSigma Proton with track selection and PID Selection of Pion; Entries", kTH1F, {{1000, -15, 15}}); - histosMCreco.add("tofNSigmaEl_WTS_PID_Pi", "TOF nSigma Electron with track selection and PID Selection of Pion; Entries", kTH1F, {{1000, -15, 15}}); - histosMCreco.add("tofNSigmaMu_WTS_PID_Pi", "TOF nSigma Muon with track selection and PID Selection of Pion; Entries", kTH1F, {{1000, -15, 15}}); + histosMCreco.add("tofNSigmaKa_WTS_PID_Pi", "TOF nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tofNSigmaPr_WTS_PID_Pi", "TOF nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tofNSigmaEl_WTS_PID_Pi", "TOF nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tofNSigmaMu_WTS_PID_Pi", "TOF nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); // Track Transverse Momentum histosMCreco.add("pT_track_WOTS", "pT without track selection; pT [GeV/c]; Counts", kTH1F, {{nBinsPt, 0, 2}}); @@ -331,6 +333,10 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct void processData(UDCollisionFull const& collision, UDtracksfull const& tracks) { + if (std::abs(collision.posZ()) > 10) { + return; + } + int gapSide = collision.gapSide(); float fitCuts[5] = {fv0Cut, ft0aCut, ft0cCut, fddaCut, fddcCut}; std::vector parameters = {pvCut, dcaZcut, dcaXYcut, tpcChi2Cut, tpcNClsFindableCut, itsChi2Cut, etaCut, pTcut}; @@ -394,16 +400,16 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct int numPionMinusTRacks = static_cast(Pi_minus_tracks.size()); for (int i = 0; i < numTracksWOTS; i++) { - histosData.fill(HIST("tpcNSigmaPi_WOTS"), WOTS_tracks[i].tpcNSigmaPi()); - histosData.fill(HIST("tofNSigmaPi_WOTS"), WOTS_tracks[i].tofNSigmaPi()); + histosData.fill(HIST("tpcNSigmaPi_WOTS"), WOTS_tracks[i].tpcNSigmaPi(), std::sqrt(WOTS_tracks[i].px() * WOTS_tracks[i].px() + WOTS_tracks[i].py() * WOTS_tracks[i].py())); + histosData.fill(HIST("tofNSigmaPi_WOTS"), WOTS_tracks[i].tofNSigmaPi(), std::sqrt(WOTS_tracks[i].px() * WOTS_tracks[i].px() + WOTS_tracks[i].py() * WOTS_tracks[i].py())); histosData.fill(HIST("pT_track_WOTS"), std::sqrt(WOTS_tracks[i].px() * WOTS_tracks[i].px() + WOTS_tracks[i].py() * WOTS_tracks[i].py())); } // End of loop over tracks without selection for (int i = 0; i < numTracksWTS; i++) { histosData.fill(HIST("tpcSignal"), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py() + WTS_tracks[i].pz() * WTS_tracks[i].pz()), WTS_tracks[i].tpcSignal()); histosData.fill(HIST("tofBeta"), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py() + WTS_tracks[i].pz() * WTS_tracks[i].pz()), WTS_tracks[i].beta()); - histosData.fill(HIST("tpcNSigmaPi_WTS"), WTS_tracks[i].tpcNSigmaPi()); - histosData.fill(HIST("tofNSigmaPi_WTS"), WTS_tracks[i].tofNSigmaPi()); + histosData.fill(HIST("tpcNSigmaPi_WTS"), WTS_tracks[i].tpcNSigmaPi(), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py())); + histosData.fill(HIST("tofNSigmaPi_WTS"), WTS_tracks[i].tofNSigmaPi(), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py())); histosData.fill(HIST("pT_track_WTS"), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py())); } // End of loop over tracks with selection only @@ -412,17 +418,17 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosData.fill(HIST("tpcSignal_Pi"), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py() + WTS_PID_Pi_tracks[i].pz() * WTS_PID_Pi_tracks[i].pz()), WTS_PID_Pi_tracks[i].tpcSignal()); histosData.fill(HIST("tofBeta_Pi"), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py() + WTS_PID_Pi_tracks[i].pz() * WTS_PID_Pi_tracks[i].pz()), WTS_PID_Pi_tracks[i].beta()); - histosData.fill(HIST("tpcNSigmaPi_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaPi()); - histosData.fill(HIST("tpcNSigmaKa_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaKa()); - histosData.fill(HIST("tpcNSigmaPr_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaPr()); - histosData.fill(HIST("tpcNSigmaEl_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaEl()); - histosData.fill(HIST("tpcNSigmaMu_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaMu()); + histosData.fill(HIST("tpcNSigmaPi_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaPi(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); + histosData.fill(HIST("tpcNSigmaKa_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaKa(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); + histosData.fill(HIST("tpcNSigmaPr_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaPr(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); + histosData.fill(HIST("tpcNSigmaEl_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaEl(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); + histosData.fill(HIST("tpcNSigmaMu_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaMu(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); - histosData.fill(HIST("tofNSigmaPi_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaPi()); - histosData.fill(HIST("tofNSigmaKa_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaKa()); - histosData.fill(HIST("tofNSigmaPr_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaPr()); - histosData.fill(HIST("tofNSigmaEl_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaEl()); - histosData.fill(HIST("tofNSigmaMu_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaMu()); + histosData.fill(HIST("tofNSigmaPi_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaPi(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); + histosData.fill(HIST("tofNSigmaKa_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaKa(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); + histosData.fill(HIST("tofNSigmaPr_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaPr(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); + histosData.fill(HIST("tofNSigmaEl_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaEl(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); + histosData.fill(HIST("tofNSigmaMu_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaMu(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); histosData.fill(HIST("pT_track_WTS_PID_Pi"), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); } // End of loop over tracks with selection and PID selection of Pions @@ -525,6 +531,8 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct TLorentzVector tempVector, p1, p2, p3, p4; TLorentzVector p1234; + bool flag = false; + for (const auto& particle : mcParts) { tempVector.SetXYZM(particle.px(), particle.py(), particle.pz(), o2::constants::physics::MassPionCharged); @@ -534,6 +542,12 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct for (const auto& mother : particle.mothers_as()) { if (mother.pdgCode() == 30113) { + + if (flag == false) { + histosMCgen.fill(HIST("rhoPrimeCounts"), 5); + } + flag = true; + if (particle.pdgCode() == 211) { piPlusvectors.push_back(tempVector); histosMCgen.fill(HIST("MCgen_particle_pT"), tempVector.Pt()); @@ -591,6 +605,10 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct void processMCrec(CollisionTotal const& collision, TrackStuff const& tracks) { + if (std::abs(collision.posZ()) > 10) { + return; + } + if (!collision.has_udMcCollision()) { return; } @@ -658,16 +676,16 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct int numPionMinusTRacks = static_cast(Pi_minus_tracks.size()); for (int i = 0; i < numTracksWOTS; i++) { - histosMCreco.fill(HIST("tpcNSigmaPi_WOTS"), WOTS_tracks[i].tpcNSigmaPi()); - histosMCreco.fill(HIST("tofNSigmaPi_WOTS"), WOTS_tracks[i].tofNSigmaPi()); + histosMCreco.fill(HIST("tpcNSigmaPi_WOTS"), WOTS_tracks[i].tpcNSigmaPi(), std::sqrt(WOTS_tracks[i].px() * WOTS_tracks[i].px() + WOTS_tracks[i].py() * WOTS_tracks[i].py())); + histosMCreco.fill(HIST("tofNSigmaPi_WOTS"), WOTS_tracks[i].tofNSigmaPi(), std::sqrt(WOTS_tracks[i].px() * WOTS_tracks[i].px() + WOTS_tracks[i].py() * WOTS_tracks[i].py())); histosMCreco.fill(HIST("pT_track_WOTS"), std::sqrt(WOTS_tracks[i].px() * WOTS_tracks[i].px() + WOTS_tracks[i].py() * WOTS_tracks[i].py())); } // End of loop over tracks without selection for (int i = 0; i < numTracksWTS; i++) { histosMCreco.fill(HIST("tpcSignal"), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py() + WTS_tracks[i].pz() * WTS_tracks[i].pz()), WTS_tracks[i].tpcSignal()); histosMCreco.fill(HIST("tofBeta"), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py() + WTS_tracks[i].pz() * WTS_tracks[i].pz()), WTS_tracks[i].beta()); - histosMCreco.fill(HIST("tpcNSigmaPi_WTS"), WTS_tracks[i].tpcNSigmaPi()); - histosMCreco.fill(HIST("tofNSigmaPi_WTS"), WTS_tracks[i].tofNSigmaPi()); + histosMCreco.fill(HIST("tpcNSigmaPi_WTS"), WTS_tracks[i].tpcNSigmaPi(), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py())); + histosMCreco.fill(HIST("tofNSigmaPi_WTS"), WTS_tracks[i].tofNSigmaPi(), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py())); histosMCreco.fill(HIST("pT_track_WTS"), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py())); } // End of loop over tracks with selection only @@ -676,17 +694,17 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosMCreco.fill(HIST("tpcSignal_Pi"), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py() + WTS_PID_Pi_tracks[i].pz() * WTS_PID_Pi_tracks[i].pz()), WTS_PID_Pi_tracks[i].tpcSignal()); histosMCreco.fill(HIST("tofBeta_Pi"), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py() + WTS_PID_Pi_tracks[i].pz() * WTS_PID_Pi_tracks[i].pz()), WTS_PID_Pi_tracks[i].beta()); - histosMCreco.fill(HIST("tpcNSigmaPi_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaPi()); - histosMCreco.fill(HIST("tpcNSigmaKa_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaKa()); - histosMCreco.fill(HIST("tpcNSigmaPr_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaPr()); - histosMCreco.fill(HIST("tpcNSigmaEl_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaEl()); - histosMCreco.fill(HIST("tpcNSigmaMu_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaMu()); - - histosMCreco.fill(HIST("tofNSigmaPi_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaPi()); - histosMCreco.fill(HIST("tofNSigmaKa_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaKa()); - histosMCreco.fill(HIST("tofNSigmaPr_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaPr()); - histosMCreco.fill(HIST("tofNSigmaEl_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaEl()); - histosMCreco.fill(HIST("tofNSigmaMu_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaMu()); + histosMCreco.fill(HIST("tpcNSigmaPi_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaPi(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); + histosMCreco.fill(HIST("tpcNSigmaKa_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaKa(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); + histosMCreco.fill(HIST("tpcNSigmaPr_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaPr(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); + histosMCreco.fill(HIST("tpcNSigmaEl_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaEl(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); + histosMCreco.fill(HIST("tpcNSigmaMu_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaMu(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); + + histosMCreco.fill(HIST("tofNSigmaPi_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaPi(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); + histosMCreco.fill(HIST("tofNSigmaKa_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaKa(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); + histosMCreco.fill(HIST("tofNSigmaPr_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaPr(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); + histosMCreco.fill(HIST("tofNSigmaEl_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaEl(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); + histosMCreco.fill(HIST("tofNSigmaMu_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaMu(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); histosMCreco.fill(HIST("pT_track_WTS_PID_Pi"), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); } // End of loop over tracks with selection and PID selection of Pions From 5a1abb8c3aa3489acfa0e396eae5617128d1a8e2 Mon Sep 17 00:00:00 2001 From: nzardosh Date: Sat, 8 Feb 2025 08:33:42 +0000 Subject: [PATCH 0105/1650] [PWGJE] Adding D+ jets to framework (#9828) --- PWGJE/Core/JetCandidateUtilities.h | 12 +- PWGJE/Core/JetHFUtilities.h | 151 +++++++++++++++++- PWGJE/DataModel/Jet.h | 9 ++ PWGJE/DataModel/JetReducedDataHF.h | 40 +++++ PWGJE/DataModel/JetSubstructure.h | 3 +- PWGJE/DataModel/JetSubtraction.h | 67 +++++++- PWGJE/JetFinders/CMakeLists.txt | 15 ++ .../JetFinders/jetFinderDplusDataCharged.cxx | 29 ++++ PWGJE/JetFinders/jetFinderDplusMCDCharged.cxx | 29 ++++ PWGJE/JetFinders/jetFinderDplusMCPCharged.cxx | 29 ++++ PWGJE/JetFinders/jetFinderHF.cxx | 8 +- PWGJE/TableProducer/Matching/CMakeLists.txt | 15 ++ .../Matching/jetMatchingMCDplusCharged.cxx | 31 ++++ .../Matching/jetMatchingMCSubDplusCharged.cxx | 29 ++++ .../Matching/jetMatchingSubDplusCharged.cxx | 30 ++++ PWGJE/TableProducer/derivedDataProducer.cxx | 36 +++++ PWGJE/TableProducer/derivedDataSelector.cxx | 16 +- PWGJE/TableProducer/derivedDataWriter.cxx | 84 ++++++++++ .../eventwiseConstituentSubtractor.cxx | 14 ++ PWGJE/TableProducer/jetEventWeightMCD.cxx | 5 + PWGJE/TableProducer/jetEventWeightMCP.cxx | 5 + PWGJE/TableProducer/rhoEstimator.cxx | 28 ++++ PWGJE/Tasks/CMakeLists.txt | 14 +- PWGJE/Tasks/jetFinderDplusQA.cxx | 27 ++++ PWGJE/Tasks/jetFinderHFQA.cxx | 3 +- PWGJE/Tasks/jetSubstructureDplus.cxx | 27 ++++ PWGJE/Tasks/jetSubstructureDplusOutput.cxx | 26 +++ PWGJE/Tasks/jetSubstructureHFOutput.cxx | 6 +- 28 files changed, 764 insertions(+), 24 deletions(-) create mode 100644 PWGJE/JetFinders/jetFinderDplusDataCharged.cxx create mode 100644 PWGJE/JetFinders/jetFinderDplusMCDCharged.cxx create mode 100644 PWGJE/JetFinders/jetFinderDplusMCPCharged.cxx create mode 100644 PWGJE/TableProducer/Matching/jetMatchingMCDplusCharged.cxx create mode 100644 PWGJE/TableProducer/Matching/jetMatchingMCSubDplusCharged.cxx create mode 100644 PWGJE/TableProducer/Matching/jetMatchingSubDplusCharged.cxx create mode 100644 PWGJE/Tasks/jetFinderDplusQA.cxx create mode 100644 PWGJE/Tasks/jetSubstructureDplus.cxx create mode 100644 PWGJE/Tasks/jetSubstructureDplusOutput.cxx diff --git a/PWGJE/Core/JetCandidateUtilities.h b/PWGJE/Core/JetCandidateUtilities.h index 8b31b11634e..8c83d4da4cd 100644 --- a/PWGJE/Core/JetCandidateUtilities.h +++ b/PWGJE/Core/JetCandidateUtilities.h @@ -225,11 +225,11 @@ auto matchedParticle(const T& candidate, const U& tracks, const V& particles) * @param candidate candidate that is being checked * @param table the table to be sliced */ -template -auto slicedPerCandidate(T const& table, U const& candidate, V const& perD0Candidate, M const& perLcCandidate, N const& perBplusCandidate, O const& perDielectronCandidate) +template +auto slicedPerCandidate(T const& table, U const& candidate, V const& perD0Candidate, M const& perDplusCandidate, N const& perLcCandidate, O const& perBplusCandidate, P const& perDielectronCandidate) { if constexpr (jethfutilities::isHFCandidate()) { - return jethfutilities::slicedPerHFCandidate(table, candidate, perD0Candidate, perLcCandidate, perBplusCandidate); + return jethfutilities::slicedPerHFCandidate(table, candidate, perD0Candidate, perDplusCandidate, perLcCandidate, perBplusCandidate); } else if constexpr (jetdqutilities::isDielectronCandidate()) { return jetdqutilities::slicedPerDielectronCandidate(table, candidate, perDielectronCandidate); } else { @@ -243,11 +243,11 @@ auto slicedPerCandidate(T const& table, U const& candidate, V const& perD0Candid * @param candidate candidate that is being checked * @param table the table to be sliced */ -template -auto slicedPerCandidateCollision(T const& table, U const& candidates, V const& collision, M const& D0CollisionPerCollision, N const& LcCollisionPerCollision, O const& BplusCollisionPerCollision, P const& DielectronCollisionPerCollision) +template +auto slicedPerCandidateCollision(T const& table, U const& candidates, V const& collision, M const& D0CollisionPerCollision, N const& DplusCollisionPerCollision, O const& LcCollisionPerCollision, P const& BplusCollisionPerCollision, Q const& DielectronCollisionPerCollision) { if constexpr (jethfutilities::isHFTable() || jethfutilities::isHFMcTable()) { - return jethfutilities::slicedPerHFCollision(table, candidates, collision, D0CollisionPerCollision, LcCollisionPerCollision, BplusCollisionPerCollision); + return jethfutilities::slicedPerHFCollision(table, candidates, collision, D0CollisionPerCollision, DplusCollisionPerCollision, LcCollisionPerCollision, BplusCollisionPerCollision); } else if constexpr (jetdqutilities::isDielectronTable() || jetdqutilities::isDielectronMcTable()) { return jetdqutilities::slicedPerDielectronCollision(table, candidates, collision, DielectronCollisionPerCollision); } else { diff --git a/PWGJE/Core/JetHFUtilities.h b/PWGJE/Core/JetHFUtilities.h index b281da526c0..509c1d22b5c 100644 --- a/PWGJE/Core/JetHFUtilities.h +++ b/PWGJE/Core/JetHFUtilities.h @@ -83,6 +83,42 @@ constexpr bool isD0McTable() return isD0McCandidate() || isD0McCandidate(); } +/** + * returns true if the candidate is from a D+ table + */ +template +constexpr bool isDplusCandidate() +{ + return std::is_same_v, o2::aod::CandidatesDplusData::iterator> || std::is_same_v, o2::aod::CandidatesDplusData::filtered_iterator> || std::is_same_v, o2::aod::CandidatesDplusMCD::iterator> || std::is_same_v, o2::aod::CandidatesDplusMCD::filtered_iterator>; +} + +/** + * returns true if the particle is from a D+ MC table + */ +template +constexpr bool isDplusMcCandidate() +{ + return std::is_same_v, o2::aod::CandidatesDplusMCP::iterator> || std::is_same_v, o2::aod::CandidatesDplusMCP::filtered_iterator>; +} + +/** + * returns true if the table is a D+ table + */ +template +constexpr bool isDplusTable() +{ + return isDplusCandidate() || isDplusCandidate(); +} + +/** + * returns true if the table is a D+ MC table + */ +template +constexpr bool isDplusMcTable() +{ + return isDplusMcCandidate() || isDplusMcCandidate(); +} + /** * returns true if the candidate is from a Lc table */ @@ -164,6 +200,8 @@ constexpr bool isHFCandidate() { if constexpr (isD0Candidate()) { return true; + } else if constexpr (isDplusCandidate()) { + return true; } else if constexpr (isLcCandidate()) { return true; } else if constexpr (isBplusCandidate()) { @@ -182,6 +220,8 @@ constexpr bool isHFMcCandidate() { if constexpr (isD0McCandidate()) { return true; + } else if constexpr (isDplusMcCandidate()) { + return true; } else if constexpr (isLcMcCandidate()) { return true; } else if constexpr (isBplusMcCandidate()) { @@ -199,6 +239,8 @@ constexpr bool isHFTable() { if constexpr (isD0Candidate() || isD0Candidate()) { return true; + } else if constexpr (isDplusCandidate() || isDplusCandidate()) { + return true; } else if constexpr (isLcCandidate() || isLcCandidate()) { return true; } else if constexpr (isBplusCandidate() || isBplusCandidate()) { @@ -216,6 +258,8 @@ constexpr bool isHFMcTable() { if constexpr (isD0McCandidate() || isD0McCandidate()) { return true; + } else if constexpr (isDplusMcCandidate() || isDplusMcCandidate()) { + return true; } else if constexpr (isLcMcCandidate() || isLcMcCandidate()) { return true; } else if constexpr (isBplusMcCandidate() || isBplusMcCandidate()) { @@ -238,6 +282,12 @@ constexpr bool isMatchedHFCandidate(T const& candidate) } else { return false; } + } else if constexpr (isDplusCandidate()) { + if (std::abs(candidate.flagMcMatchRec()) == 1 << o2::aod::hf_cand_3prong::DecayType::DplusToPiKPi) { + return true; + } else { + return false; + } } else if constexpr (isLcCandidate()) { if (std::abs(candidate.flagMcMatchRec()) == 1 << o2::aod::hf_cand_3prong::DecayType::LcToPKPi) { return true; @@ -256,6 +306,12 @@ constexpr bool isMatchedHFCandidate(T const& candidate) } else { return false; } + } else if constexpr (isDplusMcCandidate()) { + if (std::abs(candidate.flagMcMatchGen()) == 1 << o2::aod::hf_cand_3prong::DecayType::DplusToPiKPi) { + return true; + } else { + return false; + } } else if constexpr (isLcMcCandidate()) { if (std::abs(candidate.flagMcMatchGen()) == 1 << o2::aod::hf_cand_3prong::DecayType::LcToPKPi) { return true; @@ -289,6 +345,12 @@ bool isHFDaughterTrack(T& track, U& candidate, V const& /*tracks*/) } else { return false; } + } else if constexpr (isDplusCandidate()) { + if (candidate.prong0Id() == track.globalIndex() || candidate.prong1Id() == track.globalIndex() || candidate.prong2Id() == track.globalIndex()) { + return true; + } else { + return false; + } } else if constexpr (isLcCandidate()) { if (candidate.prong0Id() == track.globalIndex() || candidate.prong1Id() == track.globalIndex() || candidate.prong2Id() == track.globalIndex()) { return true; @@ -340,11 +402,13 @@ auto matchedHFParticle(const T& candidate, const U& /*tracks*/, const V& /*parti * @param candidate HF candidate that is being checked * @param table the table to be sliced */ -template -auto slicedPerHFCandidate(T const& table, U const& candidate, V const& perD0Candidate, M const& perLcCandidate, N const& perBplusCandidate) +template +auto slicedPerHFCandidate(T const& table, U const& candidate, V const& perD0Candidate, M const& perDplusCandidate, N const& perLcCandidate, O const& perBplusCandidate) { if constexpr (isD0Candidate()) { return table.sliceBy(perD0Candidate, candidate.globalIndex()); + } else if constexpr (isDplusCandidate()) { + return table.sliceBy(perDplusCandidate, candidate.globalIndex()); } else if constexpr (isLcCandidate()) { return table.sliceBy(perLcCandidate, candidate.globalIndex()); } else if constexpr (isBplusCandidate()) { @@ -360,11 +424,13 @@ auto slicedPerHFCandidate(T const& table, U const& candidate, V const& perD0Cand * @param candidate HF candidate that is being checked * @param table the table to be sliced */ -template -auto slicedPerHFCollision(T const& table, U const& /*candidates*/, V const& collision, M const& D0CollisionPerCollision, N const& LcCollisionPerCollision, O const& BplusCollisionPerCollision) +template +auto slicedPerHFCollision(T const& table, U const& /*candidates*/, V const& collision, M const& D0CollisionPerCollision, N const& DplusCollisionPerCollision, O const& LcCollisionPerCollision, P const& BplusCollisionPerCollision) { if constexpr (isD0Table() || isD0McTable()) { return table.sliceBy(D0CollisionPerCollision, collision.globalIndex()); + } else if constexpr (isDplusTable() || isDplusMcTable()) { + return table.sliceBy(DplusCollisionPerCollision, collision.globalIndex()); } else if constexpr (isLcTable() || isLcMcTable()) { return table.sliceBy(LcCollisionPerCollision, collision.globalIndex()); } else if constexpr (isBplusTable() || isBplusMcTable()) { @@ -406,6 +472,8 @@ int getHFCandidatePDG(T const& /*candidate*/) { if constexpr (isD0Candidate() || isD0McCandidate()) { return static_cast(o2::constants::physics::Pdg::kD0); + } else if constexpr (isDplusCandidate() || isDplusMcCandidate()) { + return static_cast(o2::constants::physics::Pdg::kDPlus); } else if constexpr (isLcCandidate() || isLcMcCandidate()) { return static_cast(o2::constants::physics::Pdg::kLambdaCPlus); } else if constexpr (isBplusCandidate() || isBplusMcCandidate()) { @@ -423,6 +491,8 @@ int getHFTablePDG() { if constexpr (isD0Table() || isD0McTable()) { return static_cast(o2::constants::physics::Pdg::kD0); + } else if constexpr (isDplusTable() || isDplusMcTable()) { + return static_cast(o2::constants::physics::Pdg::kDPlus); } else if constexpr (isLcTable() || isLcMcTable()) { return static_cast(o2::constants::physics::Pdg::kLambdaCPlus); } else if constexpr (isBplusTable() || isBplusMcTable()) { @@ -442,6 +512,8 @@ float getHFCandidatePDGMass(T const& /*candidate*/) { if constexpr (isD0Candidate() || isD0McCandidate()) { return static_cast(o2::constants::physics::MassD0); + } else if constexpr (isDplusCandidate() || isDplusMcCandidate()) { + return static_cast(o2::constants::physics::MassDPlus); } else if constexpr (isLcCandidate() || isLcMcCandidate()) { return static_cast(o2::constants::physics::MassLambdaCPlus); } else if constexpr (isBplusCandidate() || isBplusMcCandidate()) { @@ -460,6 +532,8 @@ float getHFTablePDGMass() { if constexpr (isD0Table() || isD0McTable()) { return static_cast(o2::constants::physics::MassD0); + } else if constexpr (isDplusTable() || isDplusMcTable()) { + return static_cast(o2::constants::physics::MassDPlus); } else if constexpr (isLcTable() || isLcMcTable()) { return static_cast(o2::constants::physics::MassLambdaCPlus); } else if constexpr (isBplusTable() || isBplusMcTable()) { @@ -555,6 +629,72 @@ void fillD0CandidateTable(T const& candidate, U& D0ParTable, V& D0ParETable, M& } } +template +void fillDplusCandidateTable(T const& candidate, U& DplusParTable, V& DplusParETable, M& DplusMlTable, N& DplusMCDTable) +{ + + DplusParTable( + candidate.chi2PCA(), + candidate.nProngsContributorsPV(), + candidate.cpa(), + candidate.cpaXY(), + candidate.decayLength(), + candidate.decayLengthXY(), + candidate.decayLengthNormalised(), + candidate.decayLengthXYNormalised(), + candidate.ptProng0(), + candidate.ptProng1(), + candidate.ptProng2(), + candidate.impactParameter0(), + candidate.impactParameter1(), + candidate.impactParameter2(), + candidate.impactParameterNormalised0(), + candidate.impactParameterNormalised1(), + candidate.impactParameterNormalised2(), + candidate.nSigTpcPi0(), + candidate.nSigTofPi0(), + candidate.nSigTpcTofPi0(), + candidate.nSigTpcKa1(), + candidate.nSigTofKa1(), + candidate.nSigTpcTofKa1(), + candidate.nSigTpcPi2(), + candidate.nSigTofPi2(), + candidate.nSigTpcTofPi2()); + + DplusParETable( + candidate.xSecondaryVertex(), + candidate.ySecondaryVertex(), + candidate.zSecondaryVertex(), + candidate.errorDecayLength(), + candidate.errorDecayLengthXY(), + candidate.rSecondaryVertex(), + candidate.pProng0(), + candidate.pProng1(), + candidate.pProng2(), + candidate.pxProng0(), + candidate.pyProng0(), + candidate.pzProng0(), + candidate.pxProng1(), + candidate.pyProng1(), + candidate.pzProng1(), + candidate.pxProng2(), + candidate.pyProng2(), + candidate.pzProng2(), + candidate.errorImpactParameter0(), + candidate.errorImpactParameter1(), + candidate.errorImpactParameter2(), + candidate.ct()); + + std::vector mlScoresVector; + auto mlScoresSpan = candidate.mlScores(); + std::copy(mlScoresSpan.begin(), mlScoresSpan.end(), std::back_inserter(mlScoresVector)); + DplusMlTable(mlScoresVector); + + if constexpr (isMc) { + DplusMCDTable(candidate.flagMcMatchRec(), candidate.originMcRec(), candidate.isCandidateSwapped()); + } +} + template void fillLcCandidateTable(T const& candidate, U& LcParTable, V& LcParETable, M& LcMlTable, N& LcMCDTable) { @@ -712,6 +852,9 @@ void fillHFCandidateTable(T const& candidate, int32_t collisionIndex, U& HFBaseT if constexpr (isD0Candidate()) { fillD0CandidateTable(candidate, HFParTable, HFParETable, HFMlTable, HFMCDTable); } + if constexpr (isDplusCandidate()) { + fillDplusCandidateTable(candidate, HFParTable, HFParETable, HFMlTable, HFMCDTable); + } if constexpr (isLcCandidate()) { fillLcCandidateTable(candidate, HFParTable, HFParETable, HFMlTable, HFMCDTable); } diff --git a/PWGJE/DataModel/Jet.h b/PWGJE/DataModel/Jet.h index fbc96669dd9..a623f25775b 100644 --- a/PWGJE/DataModel/Jet.h +++ b/PWGJE/DataModel/Jet.h @@ -179,6 +179,7 @@ DECLARE_JET_TABLES_LEVELS(Charged, JTrackSub, HfD0Bases, HfD0PBases, "C"); DECLARE_JET_TABLES_LEVELS(Full, JTrackSub, HfD0Bases, HfD0PBases, "F"); DECLARE_JET_TABLES_LEVELS(Neutral, JTrackSub, HfD0Bases, HfD0PBases, "N"); DECLARE_JET_TABLES_LEVELS(D0Charged, JTrackD0Sub, HfD0Bases, HfD0PBases, "D0"); +DECLARE_JET_TABLES_LEVELS(DplusCharged, JTrackDplusSub, HfDplusBases, HfDplusPBases, "DP"); DECLARE_JET_TABLES_LEVELS(LcCharged, JTrackLcSub, HfLcBases, HfLcPBases, "Lc"); DECLARE_JET_TABLES_LEVELS(BplusCharged, JTrackBplusSub, HfBplusBases, HfBplusPBases, "BP"); DECLARE_JET_TABLES_LEVELS(V0Charged, JTrackSub, V0Cores, JV0Mcs, "V0"); @@ -219,6 +220,14 @@ using JetParticlesSubD0 = JMcParticleD0Subs; using McCollisionsD0 = o2::soa::Join; using CandidatesD0MCP = o2::soa::Join; +using CollisionsDplus = o2::soa::Join; +using CandidatesDplusData = o2::soa::Join; +using CandidatesDplusMCD = o2::soa::Join; +using JetTracksSubDplus = JTrackDplusSubs; +using JetParticlesSubDplus = JMcParticleDplusSubs; +using McCollisionsDplus = o2::soa::Join; +using CandidatesDplusMCP = o2::soa::Join; + using CollisionsLc = o2::soa::Join; using CandidatesLcData = o2::soa::Join; using CandidatesLcMCD = o2::soa::Join; diff --git a/PWGJE/DataModel/JetReducedDataHF.h b/PWGJE/DataModel/JetReducedDataHF.h index 855746326a2..fe8b9270f7e 100644 --- a/PWGJE/DataModel/JetReducedDataHF.h +++ b/PWGJE/DataModel/JetReducedDataHF.h @@ -63,6 +63,46 @@ DECLARE_SOA_TABLE(JDumD0MlDaus, "AOD", "JDumD0MLDAU", jdummyd0::DummyD0, o2::soa::Marker<2>); +namespace jdplusindices +{ +DECLARE_SOA_INDEX_COLUMN(JCollision, collision); +DECLARE_SOA_INDEX_COLUMN_FULL(Prong0, prong0, int, JTracks, "_0"); +DECLARE_SOA_INDEX_COLUMN_FULL(Prong1, prong1, int, JTracks, "_1"); +DECLARE_SOA_INDEX_COLUMN_FULL(Prong2, prong2, int, JTracks, "_2"); +DECLARE_SOA_INDEX_COLUMN(JMcCollision, mcCollision); +DECLARE_SOA_INDEX_COLUMN(JMcParticle, mcParticle); +} // namespace jdplusindices + +DECLARE_SOA_TABLE_STAGED(JDplusCollisionIds, "JDPCOLLID", + jdplusindices::JCollisionId); + +DECLARE_SOA_TABLE_STAGED(JDplusMcCollisionIds, "JDPMCCOLLID", + jdplusindices::JMcCollisionId); + +DECLARE_SOA_TABLE_STAGED(JDplusIds, "JDPID", + jdplusindices::JCollisionId, + jdplusindices::Prong0Id, + jdplusindices::Prong1Id, + jdplusindices::Prong2Id); + +DECLARE_SOA_TABLE_STAGED(JDplusPIds, "JDPPID", + jdplusindices::JMcCollisionId, + jdplusindices::JMcParticleId); + +namespace jdummydplus +{ + +DECLARE_SOA_COLUMN(DummyDplus, dummyDplus, bool); + +} // namespace jdummydplus +DECLARE_SOA_TABLE(JDumDplusParDaus, "AOD", "JDUMDPPARDAU", + jdummydplus::DummyDplus, + o2::soa::Marker<1>); + +DECLARE_SOA_TABLE(JDumDplusMlDaus, "AOD", "JDUMDPMLDAU", + jdummydplus::DummyDplus, + o2::soa::Marker<2>); + namespace jlcindices { DECLARE_SOA_INDEX_COLUMN(JCollision, collision); diff --git a/PWGJE/DataModel/JetSubstructure.h b/PWGJE/DataModel/JetSubstructure.h index 058ac8ebcaa..660ef03cb47 100644 --- a/PWGJE/DataModel/JetSubstructure.h +++ b/PWGJE/DataModel/JetSubstructure.h @@ -122,7 +122,8 @@ DECLARE_SOA_COLUMN(JetNConstituents, jetNConstituents, int); //! JETSUBSTRUCTURE_TABLES_DEF(C, "C", CJetCOs, "CJETCO", CEWSJetCOs, "CEWSJETCO", CMCDJetCOs, "CMCDJETCO", CMCPJetCOs, "CMCPJETCO"); JETSUBSTRUCTURE_TABLES_DEF(D0C, "D0C", HfD0Bases, "HFD0BASE", HfD0Bases, "HFD0BASE", HfD0Bases, "HFD0BASE", HfD0PBases, "HFD0PBASE"); -JETSUBSTRUCTURE_TABLES_DEF(LcC, "LCC", HfLcBases, "HFLcBASE", HfLcBases, "HFLcBASE", HfLcBases, "HFLcBASE", HfLcPBases, "HFLcPBASE"); +JETSUBSTRUCTURE_TABLES_DEF(DplusC, "DPC", HfDplusBases, "HFDPBASE", HfDplusBases, "HFDPBASE", HfDplusBases, "HFDPBASE", HfDplusPBases, "HFDPPBASE"); +JETSUBSTRUCTURE_TABLES_DEF(LcC, "LCC", HfLcBases, "HFLCBASE", HfLcBases, "HFLCBASE", HfLcBases, "HFLCBASE", HfLcPBases, "HFLCPBASE"); JETSUBSTRUCTURE_TABLES_DEF(BplusC, "BPC", HfBplusBases, "HFBPBASE", HfBplusBases, "HFBPBASE", HfBplusBases, "HFBPBASE", HfBplusPBases, "HFBPPBASE"); JETSUBSTRUCTURE_TABLES_DEF(DielectronC, "DIELC", Dielectrons, "RTDIELECTRON", Dielectrons, "RTDIELECTRON", Dielectrons, "RTDIELECTRON", JDielectronMcs, "JDIELMC"); diff --git a/PWGJE/DataModel/JetSubtraction.h b/PWGJE/DataModel/JetSubtraction.h index 3f78c05ec58..55879d009c1 100644 --- a/PWGJE/DataModel/JetSubtraction.h +++ b/PWGJE/DataModel/JetSubtraction.h @@ -52,6 +52,16 @@ namespace bkgd0mc DECLARE_SOA_INDEX_COLUMN_FULL(Candidate, candidate, int, HfD0PBases, "_0"); } // namespace bkgd0mc +namespace bkgdplus +{ +DECLARE_SOA_INDEX_COLUMN_FULL(Candidate, candidate, int, HfDplusBases, "_0"); +} // namespace bkgdplus + +namespace bkgdplusmc +{ +DECLARE_SOA_INDEX_COLUMN_FULL(Candidate, candidate, int, HfDplusPBases, "_0"); +} // namespace bkgdplusmc + namespace bkglc { DECLARE_SOA_INDEX_COLUMN_FULL(Candidate, candidate, int, HfLcBases, "_0"); @@ -105,19 +115,31 @@ DECLARE_SOA_TABLE(BkgD0McRhos, "AOD", "BkgD0McRho", bkgrho::RhoM, o2::soa::Marker<3>); -DECLARE_SOA_TABLE(BkgLcRhos, "AOD", "BkgLcRho", +DECLARE_SOA_TABLE(BkgDplusRhos, "AOD", "BkgDPRho", o2::soa::Index<>, bkgrho::Rho, bkgrho::RhoM, o2::soa::Marker<4>); -DECLARE_SOA_TABLE(BkgLcMcRhos, "AOD", "BkgLcMcRho", +DECLARE_SOA_TABLE(BkgDplusMcRhos, "AOD", "BkgDPMcRho", o2::soa::Index<>, bkgrho::Rho, bkgrho::RhoM, o2::soa::Marker<5>); -DECLARE_SOA_TABLE(BkgBplusRhos, "AOD", "BkgRho", +DECLARE_SOA_TABLE(BkgLcRhos, "AOD", "BkgLCRho", + o2::soa::Index<>, + bkgrho::Rho, + bkgrho::RhoM, + o2::soa::Marker<4>); + +DECLARE_SOA_TABLE(BkgLcMcRhos, "AOD", "BkgLCMcRho", + o2::soa::Index<>, + bkgrho::Rho, + bkgrho::RhoM, + o2::soa::Marker<5>); + +DECLARE_SOA_TABLE(BkgBplusRhos, "AOD", "BkgBPRho", o2::soa::Index<>, bkgrho::Rho, bkgrho::RhoM, @@ -211,7 +233,42 @@ DECLARE_SOA_TABLE(JMcParticleD0Subs, "AOD", "JMcPartD0Subs", using JMcParticleD0Sub = JMcParticleD0Subs::iterator; -DECLARE_SOA_TABLE(JTrackLcSubs, "AOD", "JTrackLcSubs", +DECLARE_SOA_TABLE(JTrackDplusSubs, "AOD", "JTrackDPSubs", + o2::soa::Index<>, + bkglc::CandidateId, + jtrack::Pt, + jtrack::Eta, + jtrack::Phi, + jtrack::TrackSel, + jtrack::Px, + jtrack::Py, + jtrack::Pz, + jtrack::P, + jtrack::Energy); + +using JTrackDplusSub = JTrackDplusSubs::iterator; + +DECLARE_SOA_TABLE(JMcParticleDplusSubs, "AOD", "JMcPartDPSubs", + o2::soa::Index<>, + bkglcmc::CandidateId, + jmcparticle::Pt, + jmcparticle::Eta, + jmcparticle::Phi, + jmcparticle::Y, + jmcparticle::E, + jmcparticle::PdgCode, + jmcparticle::GenStatusCode, + jmcparticle::HepMCStatusCode, + jmcparticle::IsPhysicalPrimary, + jmcparticle::Px, + jmcparticle::Py, + jmcparticle::Pz, + jmcparticle::P, + jmcparticle::Energy); + +using JMcParticleDplusSub = JMcParticleDplusSubs::iterator; + +DECLARE_SOA_TABLE(JTrackLcSubs, "AOD", "JTrackLCSubs", o2::soa::Index<>, bkglc::CandidateId, jtrack::Pt, @@ -226,7 +283,7 @@ DECLARE_SOA_TABLE(JTrackLcSubs, "AOD", "JTrackLcSubs", using JTrackLcSub = JTrackLcSubs::iterator; -DECLARE_SOA_TABLE(JMcParticleLcSubs, "AOD", "JMcPartLcSubs", +DECLARE_SOA_TABLE(JMcParticleLcSubs, "AOD", "JMcPartLCSubs", o2::soa::Index<>, bkglcmc::CandidateId, jmcparticle::Pt, diff --git a/PWGJE/JetFinders/CMakeLists.txt b/PWGJE/JetFinders/CMakeLists.txt index ba4dbb132fc..a050f9d3fef 100644 --- a/PWGJE/JetFinders/CMakeLists.txt +++ b/PWGJE/JetFinders/CMakeLists.txt @@ -74,6 +74,21 @@ o2physics_add_dpl_workflow(jet-finder-d0-mcp-charged PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2::FrameworkPhysicsSupport COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(jet-finder-dplus-data-charged + SOURCES jetFinderDplusDataCharged.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2::FrameworkPhysicsSupport + COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(jet-finder-dplus-mcd-charged + SOURCES jetFinderDplusMCDCharged.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2::FrameworkPhysicsSupport + COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(jet-finder-dplus-mcp-charged + SOURCES jetFinderDplusMCPCharged.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2::FrameworkPhysicsSupport + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(jet-finder-lc-data-charged SOURCES jetFinderLcDataCharged.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2::FrameworkPhysicsSupport diff --git a/PWGJE/JetFinders/jetFinderDplusDataCharged.cxx b/PWGJE/JetFinders/jetFinderDplusDataCharged.cxx new file mode 100644 index 00000000000..a0cdbdf2a24 --- /dev/null +++ b/PWGJE/JetFinders/jetFinderDplusDataCharged.cxx @@ -0,0 +1,29 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// jet finder D+ data charged task +// +/// \author Nima Zardoshti + +#include "PWGJE/JetFinders/jetFinderHF.cxx" + +using JetFinderDplusDataCharged = JetFinderHFTask; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + std::vector tasks; + + tasks.emplace_back(adaptAnalysisTask(cfgc, + SetDefaultProcesses{{{"processChargedJetsData", true}}}, + TaskName{"jet-finder-dplus-data-charged"})); + + return WorkflowSpec{tasks}; +} diff --git a/PWGJE/JetFinders/jetFinderDplusMCDCharged.cxx b/PWGJE/JetFinders/jetFinderDplusMCDCharged.cxx new file mode 100644 index 00000000000..0a401d330ef --- /dev/null +++ b/PWGJE/JetFinders/jetFinderDplusMCDCharged.cxx @@ -0,0 +1,29 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// jet finder D+ mcd charged task +// +/// \author Nima Zardoshti + +#include "PWGJE/JetFinders/jetFinderHF.cxx" + +using JetFinderDplusMCDetectorLevelCharged = JetFinderHFTask; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + std::vector tasks; + + tasks.emplace_back(adaptAnalysisTask(cfgc, + SetDefaultProcesses{{{"processChargedJetsMCD", true}}}, + TaskName{"jet-finder-dplus-mcd-charged"})); + + return WorkflowSpec{tasks}; +} diff --git a/PWGJE/JetFinders/jetFinderDplusMCPCharged.cxx b/PWGJE/JetFinders/jetFinderDplusMCPCharged.cxx new file mode 100644 index 00000000000..4c5cb4a604d --- /dev/null +++ b/PWGJE/JetFinders/jetFinderDplusMCPCharged.cxx @@ -0,0 +1,29 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// jet finder D+ mcp charged task +// +/// \author Nima Zardoshti + +#include "PWGJE/JetFinders/jetFinderHF.cxx" + +using JetFinderDplusMCParticleLevelCharged = JetFinderHFTask; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + std::vector tasks; + + tasks.emplace_back(adaptAnalysisTask(cfgc, + SetDefaultProcesses{{{"processChargedJetsMCP", true}}}, + TaskName{"jet-finder-dplus-mcp-charged"})); + + return WorkflowSpec{tasks}; +} diff --git a/PWGJE/JetFinders/jetFinderHF.cxx b/PWGJE/JetFinders/jetFinderHF.cxx index b153a3adc52..55590bc2f11 100644 --- a/PWGJE/JetFinders/jetFinderHF.cxx +++ b/PWGJE/JetFinders/jetFinderHF.cxx @@ -162,6 +162,8 @@ struct JetFinderHFTask { PresliceOptional> perD0Candidate = aod::bkgd0::candidateId; PresliceOptional> perD0McCandidate = aod::bkgd0mc::candidateId; + PresliceOptional> perDplusCandidate = aod::bkgdplus::candidateId; + PresliceOptional> perDplusMcCandidate = aod::bkgdplusmc::candidateId; PresliceOptional> perLcCandidate = aod::bkglc::candidateId; PresliceOptional> perLcMcCandidate = aod::bkglcmc::candidateId; PresliceOptional> perBplusCandidate = aod::bkgbplus::candidateId; @@ -233,7 +235,7 @@ struct JetFinderHFTask { void processChargedEvtWiseSubJetsData(soa::Filtered::iterator const& collision, soa::Filtered const& tracks, CandidateTableData const& candidates) { for (typename CandidateTableData::iterator const& candidate : candidates) { - analyseCharged(collision, jetcandidateutilities::slicedPerCandidate(tracks, candidate, perD0Candidate, perLcCandidate, perBplusCandidate, perDielectronCandidate), candidate, jetsEvtWiseSubTable, constituentsEvtWiseSubTable, tracks, jetEWSPtMin, jetEWSPtMax); + analyseCharged(collision, jetcandidateutilities::slicedPerCandidate(tracks, candidate, perD0Candidate, perDplusCandidate, perLcCandidate, perBplusCandidate, perDielectronCandidate), candidate, jetsEvtWiseSubTable, constituentsEvtWiseSubTable, tracks, jetEWSPtMin, jetEWSPtMax); } } PROCESS_SWITCH(JetFinderHFTask, processChargedEvtWiseSubJetsData, "charged hf jet finding on data with event-wise constituent subtraction", false); @@ -249,7 +251,7 @@ struct JetFinderHFTask { void processChargedEvtWiseSubJetsMCD(soa::Filtered::iterator const& collision, soa::Filtered const& tracks, CandidateTableMCD const& candidates) { for (typename CandidateTableMCD::iterator const& candidate : candidates) { - analyseCharged(collision, jetcandidateutilities::slicedPerCandidate(tracks, candidate, perD0Candidate, perLcCandidate, perBplusCandidate, perDielectronCandidate), candidate, jetsEvtWiseSubTable, constituentsEvtWiseSubTable, tracks, jetEWSPtMin, jetEWSPtMax); + analyseCharged(collision, jetcandidateutilities::slicedPerCandidate(tracks, candidate, perD0Candidate, perDplusCandidate, perLcCandidate, perBplusCandidate, perDielectronCandidate), candidate, jetsEvtWiseSubTable, constituentsEvtWiseSubTable, tracks, jetEWSPtMin, jetEWSPtMax); } } PROCESS_SWITCH(JetFinderHFTask, processChargedEvtWiseSubJetsMCD, "charged hf jet finding on MC detector level with event-wise constituent subtraction", false); @@ -269,7 +271,7 @@ struct JetFinderHFTask { CandidateTableMCP const& candidates) { for (typename CandidateTableMCP::iterator const& candidate : candidates) { - analyseMCP(collision, jetcandidateutilities::slicedPerCandidate(particles, candidate, perD0McCandidate, perLcMcCandidate, perBplusMcCandidate, perDielectronMcCandidate), candidate, 1, jetPtMin, jetPtMax); + analyseMCP(collision, jetcandidateutilities::slicedPerCandidate(particles, candidate, perD0McCandidate, perDplusMcCandidate, perLcMcCandidate, perBplusMcCandidate, perDielectronMcCandidate), candidate, 1, jetPtMin, jetPtMax); } } PROCESS_SWITCH(JetFinderHFTask, processChargedEvtWiseSubJetsMCP, "hf jet finding on MC particle level", false); diff --git a/PWGJE/TableProducer/Matching/CMakeLists.txt b/PWGJE/TableProducer/Matching/CMakeLists.txt index a3848f352e7..9c904afcdd1 100644 --- a/PWGJE/TableProducer/Matching/CMakeLists.txt +++ b/PWGJE/TableProducer/Matching/CMakeLists.txt @@ -33,6 +33,11 @@ o2physics_add_dpl_workflow(jet-matching-mc-d0-ch PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2::FrameworkPhysicsSupport COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(jet-matching-mc-dplus-ch + SOURCES jetMatchingMCDplusCharged.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2::FrameworkPhysicsSupport + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(jet-matching-mc-lc-ch SOURCES jetMatchingMCLcCharged.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2::FrameworkPhysicsSupport @@ -63,6 +68,11 @@ o2physics_add_dpl_workflow(jet-matching-mc-sub-d0-ch PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2::FrameworkPhysicsSupport COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(jet-matching-mc-sub-dplus-ch + SOURCES jetMatchingMCSubDplusCharged.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2::FrameworkPhysicsSupport + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(jet-matching-mc-sub-lc-ch SOURCES jetMatchingMCSubLcCharged.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2::FrameworkPhysicsSupport @@ -88,6 +98,11 @@ o2physics_add_dpl_workflow(jet-matching-sub-d0-ch PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2::FrameworkPhysicsSupport COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(jet-matching-sub-dplus-ch + SOURCES jetMatchingSubDplusCharged.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2::FrameworkPhysicsSupport + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(jet-matching-sub-lc-ch SOURCES jetMatchingSubLcCharged.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2::FrameworkPhysicsSupport diff --git a/PWGJE/TableProducer/Matching/jetMatchingMCDplusCharged.cxx b/PWGJE/TableProducer/Matching/jetMatchingMCDplusCharged.cxx new file mode 100644 index 00000000000..31c3391533b --- /dev/null +++ b/PWGJE/TableProducer/Matching/jetMatchingMCDplusCharged.cxx @@ -0,0 +1,31 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// jet matching mc D+ charged task +// +/// \author Nima Zardoshti + +#include "PWGJE/TableProducer/Matching/jetMatchingMC.cxx" + +using DplusChargedJetMatchingMC = JetMatchingMc, + soa::Join, + aod::DplusChargedMCDetectorLevelJetsMatchedToDplusChargedMCParticleLevelJets, + aod::DplusChargedMCParticleLevelJetsMatchedToDplusChargedMCDetectorLevelJets, + aod::CandidatesDplusMCD, + aod::CandidatesDplusMCP, + aod::JDummys>; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + std::vector tasks; + tasks.emplace_back(adaptAnalysisTask(cfgc, TaskName{"jet-matching-mc-dplus-ch"})); + return WorkflowSpec{tasks}; +} diff --git a/PWGJE/TableProducer/Matching/jetMatchingMCSubDplusCharged.cxx b/PWGJE/TableProducer/Matching/jetMatchingMCSubDplusCharged.cxx new file mode 100644 index 00000000000..d8b0e0aaf50 --- /dev/null +++ b/PWGJE/TableProducer/Matching/jetMatchingMCSubDplusCharged.cxx @@ -0,0 +1,29 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// jet matching mc subtracted D+ charged task +// +/// \author Nima Zardoshti + +#include "PWGJE/TableProducer/Matching/jetMatchingMCSub.cxx" + +using DplusChargedJetMatchingMCSub = JetMatchingMcSub, + soa::Join, + aod::DplusChargedMCDetectorLevelJetsMatchedToDplusChargedMCDetectorLevelEventWiseSubtractedJets, + aod::DplusChargedMCDetectorLevelEventWiseSubtractedJetsMatchedToDplusChargedMCDetectorLevelJets, + aod::CandidatesDplusMCD>; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + std::vector tasks; + tasks.emplace_back(adaptAnalysisTask(cfgc, TaskName{"jet-matching-mc-sub-dplus-ch"})); + return WorkflowSpec{tasks}; +} diff --git a/PWGJE/TableProducer/Matching/jetMatchingSubDplusCharged.cxx b/PWGJE/TableProducer/Matching/jetMatchingSubDplusCharged.cxx new file mode 100644 index 00000000000..181bd2a93a2 --- /dev/null +++ b/PWGJE/TableProducer/Matching/jetMatchingSubDplusCharged.cxx @@ -0,0 +1,30 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// jet matching subtracted D+ charged task +// +/// \author Nima Zardoshti + +#include "PWGJE/TableProducer/Matching/jetMatchingSub.cxx" + +using DplusChargedJetMatchingSub = JetMatchingSub, + soa::Join, + aod::DplusChargedJetsMatchedToDplusChargedEventWiseSubtractedJets, + aod::DplusChargedEventWiseSubtractedJetsMatchedToDplusChargedJets, + aod::JTrackDplusSubs, + aod::CandidatesDplusData>; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + std::vector tasks; + tasks.emplace_back(adaptAnalysisTask(cfgc, TaskName{"jet-matching-sub-dplus-ch"})); + return WorkflowSpec{tasks}; +} diff --git a/PWGJE/TableProducer/derivedDataProducer.cxx b/PWGJE/TableProducer/derivedDataProducer.cxx index ccd31ad1e92..3cccd60e506 100644 --- a/PWGJE/TableProducer/derivedDataProducer.cxx +++ b/PWGJE/TableProducer/derivedDataProducer.cxx @@ -87,6 +87,10 @@ struct JetDerivedDataProducerTask { Produces jD0McCollisionIdsTable; Produces jD0IdsTable; Produces jD0ParticleIdsTable; + Produces jDplusCollisionIdsTable; + Produces jDplusMcCollisionIdsTable; + Produces jDplusIdsTable; + Produces jDplusParticleIdsTable; Produces jLcCollisionIdsTable; Produces jLcMcCollisionIdsTable; Produces jLcIdsTable; @@ -442,6 +446,38 @@ struct JetDerivedDataProducerTask { } PROCESS_SWITCH(JetDerivedDataProducerTask, processD0MC, "produces derived index for D0 particles", false); + void processDplusCollisions(aod::HfDplusCollIds::iterator const& DplusCollision) + { + products.jDplusCollisionIdsTable(DplusCollision.collisionId()); + } + PROCESS_SWITCH(JetDerivedDataProducerTask, processDplusCollisions, "produces derived index for Dplus collisions", false); + + void processDplusMcCollisions(aod::HfDplusMcCollIds::iterator const& DplusMcCollision) + { + products.jDplusMcCollisionIdsTable(DplusMcCollision.mcCollisionId()); + } + PROCESS_SWITCH(JetDerivedDataProducerTask, processDplusMcCollisions, "produces derived index for Dplus MC collisions", false); + + void processDplus(aod::HfDplusIds::iterator const& Dplus, aod::Tracks const&) + { + auto JProng0ID = trackCollisionMapping.find({Dplus.prong0Id(), Dplus.prong0_as().collisionId()}); + auto JProng1ID = trackCollisionMapping.find({Dplus.prong1Id(), Dplus.prong1_as().collisionId()}); + auto JProng2ID = trackCollisionMapping.find({Dplus.prong2Id(), Dplus.prong2_as().collisionId()}); + if (withCollisionAssociator) { + JProng0ID = trackCollisionMapping.find({Dplus.prong0Id(), Dplus.collisionId()}); + JProng1ID = trackCollisionMapping.find({Dplus.prong1Id(), Dplus.collisionId()}); + JProng2ID = trackCollisionMapping.find({Dplus.prong2Id(), Dplus.collisionId()}); + } + products.jDplusIdsTable(Dplus.collisionId(), JProng0ID->second, JProng1ID->second, JProng2ID->second); + } + PROCESS_SWITCH(JetDerivedDataProducerTask, processDplus, "produces derived index for Dplus candidates", false); + + void processDplusMC(aod::HfDplusPIds::iterator const& Dplus) + { + products.jDplusParticleIdsTable(Dplus.mcCollisionId(), Dplus.mcParticleId()); + } + PROCESS_SWITCH(JetDerivedDataProducerTask, processDplusMC, "produces derived index for Dplus particles", false); + void processLcCollisions(aod::HfLcCollIds::iterator const& LcCollision) { products.jLcCollisionIdsTable(LcCollision.collisionId()); diff --git a/PWGJE/TableProducer/derivedDataSelector.cxx b/PWGJE/TableProducer/derivedDataSelector.cxx index 88398f796f5..f4336b228a2 100644 --- a/PWGJE/TableProducer/derivedDataSelector.cxx +++ b/PWGJE/TableProducer/derivedDataSelector.cxx @@ -52,6 +52,9 @@ struct JetDerivedDataSelector { Configurable thresholdChargedD0JetPtMin{"thresholdChargedD0JetPtMin", 0.0, "Minimum charged D0 jet pt to accept event"}; Configurable thresholdChargedEventWiseSubtractedD0JetPtMin{"thresholdChargedEventWiseSubtractedD0JetPtMin", 0.0, "Minimum charged event-wise subtracted D0 jet pt to accept event"}; Configurable thresholdChargedD0MCPJetPtMin{"thresholdChargedD0MCPJetPtMin", 0.0, "Minimum charged D0 mcp jet pt to accept event"}; + Configurable thresholdChargedDplusJetPtMin{"thresholdChargedDplusJetPtMin", 0.0, "Minimum charged Dplus jet pt to accept event"}; + Configurable thresholdChargedEventWiseSubtractedDplusJetPtMin{"thresholdChargedEventWiseSubtractedDplusJetPtMin", 0.0, "Minimum charged event-wise subtracted Dplus jet pt to accept event"}; + Configurable thresholdChargedDplusMCPJetPtMin{"thresholdChargedDplusMCPJetPtMin", 0.0, "Minimum charged Dplus mcp jet pt to accept event"}; Configurable thresholdChargedLcJetPtMin{"thresholdChargedLcJetPtMin", 0.0, "Minimum charged Lc jet pt to accept event"}; Configurable thresholdChargedEventWiseSubtractedLcJetPtMin{"thresholdChargedEventWiseSubtractedLcJetPtMin", 0.0, "Minimum charged event-wise subtracted Lc jet pt to accept event"}; Configurable thresholdChargedLcMCPJetPtMin{"thresholdChargedLcMCPJetPtMin", 0.0, "Minimum charged Lc mcp jet pt to accept event"}; @@ -198,6 +201,12 @@ struct JetDerivedDataSelector { selectionObjectPtMin = config.thresholdChargedEventWiseSubtractedD0JetPtMin; } else if constexpr (std::is_same_v, aod::D0ChargedMCParticleLevelJets>) { selectionObjectPtMin = config.thresholdChargedD0MCPJetPtMin; + } else if constexpr (std::is_same_v, aod::DplusChargedJets> || std::is_same_v, aod::DplusChargedMCDetectorLevelJets>) { + selectionObjectPtMin = config.thresholdChargedDplusJetPtMin; + } else if constexpr (std::is_same_v, aod::DplusChargedEventWiseSubtractedJets> || std::is_same_v, aod::DplusChargedMCDetectorLevelEventWiseSubtractedJets>) { + selectionObjectPtMin = config.thresholdChargedEventWiseSubtractedDplusJetPtMin; + } else if constexpr (std::is_same_v, aod::DplusChargedMCParticleLevelJets>) { + selectionObjectPtMin = config.thresholdChargedDplusMCPJetPtMin; } else if constexpr (std::is_same_v, aod::LcChargedJets> || std::is_same_v, aod::LcChargedMCDetectorLevelJets>) { selectionObjectPtMin = config.thresholdChargedLcJetPtMin; } else if constexpr (std::is_same_v, aod::LcChargedEventWiseSubtractedJets> || std::is_same_v, aod::LcChargedMCDetectorLevelEventWiseSubtractedJets>) { @@ -243,7 +252,7 @@ struct JetDerivedDataSelector { } } if (isTriggerObject) { - if constexpr (std::is_same_v, aod::ChargedMCParticleLevelJets> || std::is_same_v, aod::NeutralMCParticleLevelJets> || std::is_same_v, aod::FullMCParticleLevelJets> || std::is_same_v, aod::D0ChargedMCParticleLevelJets> || std::is_same_v, aod::LcChargedMCParticleLevelJets> || std::is_same_v, aod::BplusChargedMCParticleLevelJets> || std::is_same_v, aod::DielectronChargedMCParticleLevelJets>) { + if constexpr (std::is_same_v, aod::ChargedMCParticleLevelJets> || std::is_same_v, aod::NeutralMCParticleLevelJets> || std::is_same_v, aod::FullMCParticleLevelJets> || std::is_same_v, aod::D0ChargedMCParticleLevelJets> || std::is_same_v, aod::DplusChargedMCParticleLevelJets> || std::is_same_v, aod::LcChargedMCParticleLevelJets> || std::is_same_v, aod::BplusChargedMCParticleLevelJets> || std::is_same_v, aod::DielectronChargedMCParticleLevelJets>) { if (selectionObject.mcCollisionId() >= 0) { McCollisionFlag[selectionObject.mcCollisionId()] = true; } @@ -277,6 +286,11 @@ struct JetDerivedDataSelector { PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingD0ChargedMCDJets, "process D0 charged mcd jets", false); PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingD0ChargedMCDetectorLevelEventWiseSubtractedJets, "process D0 event-wise subtracted charged mcd jets", false); PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingD0ChargedMCPJets, "process D0 charged mcp jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingDplusChargedJets, "process Dplus charged jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingDplusChargedEventWiseSubtractedJets, "process Dplus event-wise subtracted charged jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingDplusChargedMCDJets, "process Dplus charged mcd jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingDplusChargedMCDetectorLevelEventWiseSubtractedJets, "process Dplus event-wise subtracted charged mcd jets", false); + PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingDplusChargedMCPJets, "process Dplus charged mcp jets", false); PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingLcChargedJets, "process Lc charged jets", false); PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingLcChargedEventWiseSubtractedJets, "process Lc event-wise subtracted charged jets", false); PROCESS_SWITCH_FULL(JetDerivedDataSelector, processSelectionObjects, processSelectingLcChargedMCDJets, "process Lc charged mcd jets", false); diff --git a/PWGJE/TableProducer/derivedDataWriter.cxx b/PWGJE/TableProducer/derivedDataWriter.cxx index 234cc219b8b..0bac7812852 100644 --- a/PWGJE/TableProducer/derivedDataWriter.cxx +++ b/PWGJE/TableProducer/derivedDataWriter.cxx @@ -88,6 +88,23 @@ struct JetDerivedDataWriter { Produces storedD0ParticlesTable; Produces storedD0ParticleIdsTable; + Produces storedDplusCollisionsTable; + Produces storedDplusCollisionIdsTable; + Produces storedDplussTable; + Produces storedDplusParsTable; + Produces storedDplusParExtrasTable; + Produces storedDplusParDaughtersDummyTable; + Produces storedDplusSelsTable; + Produces storedDplusMlsTable; + Produces storedDplusMlDughtersDummyTable; + Produces storedDplusMcsTable; + Produces storedDplusIdsTable; + Produces storedDplusMcCollisionsTable; + Produces storedDplusMcCollisionIdsTable; + Produces storedDplusMcCollisionsMatchingTable; + Produces storedDplusParticlesTable; + Produces storedDplusParticleIdsTable; + Produces storedLcCollisionsTable; Produces storedLcCollisionIdsTable; Produces storedLcsTable; @@ -138,10 +155,12 @@ struct JetDerivedDataWriter { Preslice> ParticlesPerMcCollision = aod::jmcparticle::mcCollisionId; Preslice> TracksPerCollision = aod::jtrack::collisionId; Preslice D0McCollisionsPerMcCollision = aod::jd0indices::mcCollisionId; + Preslice DplusMcCollisionsPerMcCollision = aod::jdplusindices::mcCollisionId; Preslice LcMcCollisionsPerMcCollision = aod::jlcindices::mcCollisionId; Preslice BplusMcCollisionsPerMcCollision = aod::jbplusindices::mcCollisionId; Preslice DielectronMcCollisionsPerMcCollision = aod::jdielectronindices::mcCollisionId; Preslice D0ParticlesPerMcCollision = aod::jd0indices::mcCollisionId; + Preslice DplusParticlesPerMcCollision = aod::jdplusindices::mcCollisionId; Preslice LcParticlesPerMcCollision = aod::jlcindices::mcCollisionId; Preslice BplusParticlesPerMcCollision = aod::jbplusindices::mcCollisionId; PresliceUnsorted EMCTrackPerTrack = aod::jemctrack::trackId; @@ -183,6 +202,21 @@ struct JetDerivedDataWriter { } } + template + void storeDplus(soa::Join::iterator const& collision, aod::JTracks const&, aod::CollisionsDplus const& DplusCollisions, T const& Dpluss) + { + if (collision.isCollisionSelected()) { + for (const auto& DplusCollision : DplusCollisions) { // should only ever be one + jethfutilities::fillHFCollisionTable(DplusCollision, products.storedDplusCollisionsTable); + products.storedDplusCollisionIdsTable(collisionMapping[collision.globalIndex()]); + } + for (const auto& Dplus : Dpluss) { + jethfutilities::fillHFCandidateTable(Dplus, products.storedDplusCollisionsTable.lastIndex(), products.storedDplussTable, products.storedDplusParsTable, products.storedDplusParExtrasTable, products.storedDplusParDaughtersDummyTable, products.storedDplusSelsTable, products.storedDplusMlsTable, products.storedDplusMlDughtersDummyTable, products.storedDplusMcsTable); + products.storedDplusIdsTable(collisionMapping[collision.globalIndex()], trackMapping[Dplus.prong0Id()], trackMapping[Dplus.prong1Id()], trackMapping[Dplus.prong2Id()]); + } + } + } + template void storeLc(soa::Join::iterator const& collision, aod::JTracks const&, aod::CollisionsLc const& LcCollisions, T const& Lcs) { @@ -225,6 +259,7 @@ struct JetDerivedDataWriter { std::vector mcCollisionMapping; std::vector particleMapping; std::vector d0McCollisionMapping; + std::vector dplusMcCollisionMapping; std::vector lcMcCollisionMapping; std::vector bplusMcCollisionMapping; std::vector dielectronMcCollisionMapping; @@ -329,6 +364,18 @@ struct JetDerivedDataWriter { } PROCESS_SWITCH(JetDerivedDataWriter, processD0MCD, "write out mcd output tables for D0", false); + void processDplusData(soa::Join::iterator const& collision, aod::JTracks const& tracks, aod::CollisionsDplus const& DplusCollisions, aod::CandidatesDplusData const& Dpluss) + { + storeDplus(collision, tracks, DplusCollisions, Dpluss); + } + PROCESS_SWITCH(JetDerivedDataWriter, processDplusData, "write out data output tables for Dplus", false); + + void processDplusMCD(soa::Join::iterator const& collision, aod::JTracks const& tracks, aod::CollisionsDplus const& DplusCollisions, aod::CandidatesDplusMCD const& Dpluss) + { + storeDplus(collision, tracks, DplusCollisions, Dpluss); + } + PROCESS_SWITCH(JetDerivedDataWriter, processDplusMCD, "write out mcd output tables for Dplus", false); + void processLcData(soa::Join::iterator const& collision, aod::JTracks const& tracks, aod::CollisionsLc const& LcCollisions, aod::CandidatesLcData const& Lcs) { storeLc(collision, tracks, LcCollisions, Lcs); @@ -447,6 +494,29 @@ struct JetDerivedDataWriter { } PROCESS_SWITCH(JetDerivedDataWriter, processD0MCP, "write out D0 mcp output tables", false); + void processDplusMCP(soa::Join const& mcCollisions, aod::McCollisionsDplus const& DplusMcCollisions, aod::CandidatesDplusMCP const& DplusParticles) + { + dplusMcCollisionMapping.clear(); + dplusMcCollisionMapping.resize(DplusMcCollisions.size(), -1); + for (auto const& mcCollision : mcCollisions) { + if (mcCollision.isMcCollisionSelected()) { + const auto dplusMcCollisionsPerMcCollision = DplusMcCollisions.sliceBy(DplusMcCollisionsPerMcCollision, mcCollision.globalIndex()); + for (const auto& dplusMcCollisionPerMcCollision : dplusMcCollisionsPerMcCollision) { // should only ever be one + jethfutilities::fillHFMcCollisionTable(dplusMcCollisionPerMcCollision, products.storedDplusMcCollisionsTable); + products.storedDplusMcCollisionIdsTable(mcCollisionMapping[mcCollision.globalIndex()]); + dplusMcCollisionMapping[dplusMcCollisionPerMcCollision.globalIndex()] = products.storedDplusMcCollisionsTable.lastIndex(); + } + const auto dplusParticlesPerMcCollision = DplusParticles.sliceBy(DplusParticlesPerMcCollision, mcCollision.globalIndex()); + for (const auto& DplusParticle : dplusParticlesPerMcCollision) { + jethfutilities::fillHFCandidateMcTable(DplusParticle, products.storedDplusMcCollisionsTable.lastIndex(), products.storedDplusParticlesTable); + products.storedDplusParticleIdsTable(mcCollisionMapping[mcCollision.globalIndex()], particleMapping[DplusParticle.mcParticleId()]); + } + } + } + } + + PROCESS_SWITCH(JetDerivedDataWriter, processDplusMCP, "write out Dplus mcp output tables", false); + void processLcMCP(soa::Join const& mcCollisions, aod::McCollisionsLc const& LcMcCollisions, aod::CandidatesLcMCP const& LcParticles) { lcMcCollisionMapping.clear(); @@ -582,6 +652,20 @@ struct JetDerivedDataWriter { } PROCESS_SWITCH(JetDerivedDataWriter, processD0McCollisionMatch, "write out D0 McCollision collision label output tables", false); + void processDplusMcCollisionMatch(soa::Join::iterator const& mcCollision, soa::Join const& DplusMcCollisions, aod::CollisionsDplus const&) + { + if (mcCollision.isMcCollisionSelected()) { + for (const auto& DplusMcCollision : DplusMcCollisions) { // should just be one + std::vector dplusCollisionIDs; + for (auto const& dplusCollisionPerMcCollision : DplusMcCollision.hfCollBases_as()) { + dplusCollisionIDs.push_back(dplusMcCollisionMapping[dplusCollisionPerMcCollision.globalIndex()]); + } + products.storedDplusMcCollisionsMatchingTable(dplusCollisionIDs); + } + } + } + PROCESS_SWITCH(JetDerivedDataWriter, processDplusMcCollisionMatch, "write out Dplus McCollision collision label output tables", false); + void processLcMcCollisionMatch(soa::Join::iterator const& mcCollision, soa::Join const& LcMcCollisions, aod::CollisionsLc const&) { if (mcCollision.isMcCollisionSelected()) { diff --git a/PWGJE/TableProducer/eventwiseConstituentSubtractor.cxx b/PWGJE/TableProducer/eventwiseConstituentSubtractor.cxx index 38d73e4c171..cf545ba8295 100644 --- a/PWGJE/TableProducer/eventwiseConstituentSubtractor.cxx +++ b/PWGJE/TableProducer/eventwiseConstituentSubtractor.cxx @@ -34,6 +34,8 @@ struct eventWiseConstituentSubtractorTask { Produces particleSubtractedTable; Produces trackSubtractedD0Table; Produces particleSubtractedD0Table; + Produces trackSubtractedDplusTable; + Produces particleSubtractedDplusTable; Produces trackSubtractedLcTable; Produces particleSubtractedLcTable; Produces trackSubtractedBplusTable; @@ -158,6 +160,18 @@ struct eventWiseConstituentSubtractorTask { } PROCESS_SWITCH(eventWiseConstituentSubtractorTask, processD0McCollisions, "Fill table of subtracted tracks for collisions with D0 MCP candidates", false); + void processDplusCollisions(aod::JetCollision const&, soa::Filtered const& tracks, soa::Join const& candidates) + { + analyseHF(tracks, candidates, trackSubtractedDplusTable); + } + PROCESS_SWITCH(eventWiseConstituentSubtractorTask, processDplusCollisions, "Fill table of subtracted tracks for collisions with Dplus candidates", false); + + void processDplusMcCollisions(aod::JetMcCollision const&, soa::Filtered const& tracks, soa::Join const& candidates) + { + analyseHFMc(tracks, candidates, particleSubtractedDplusTable); + } + PROCESS_SWITCH(eventWiseConstituentSubtractorTask, processDplusMcCollisions, "Fill table of subtracted tracks for collisions with Dplus MCP candidates", false); + void processLcCollisions(aod::JetCollision const&, soa::Filtered const& tracks, soa::Join const& candidates) { analyseHF(tracks, candidates, trackSubtractedLcTable); diff --git a/PWGJE/TableProducer/jetEventWeightMCD.cxx b/PWGJE/TableProducer/jetEventWeightMCD.cxx index 40ce7053b8a..0709a362d7f 100644 --- a/PWGJE/TableProducer/jetEventWeightMCD.cxx +++ b/PWGJE/TableProducer/jetEventWeightMCD.cxx @@ -56,6 +56,7 @@ using ChargedMCJetsEventWeight = JetEventWeightMCDTask; using FullMCJetsEventWeight = JetEventWeightMCDTask; using D0ChargedMCJetsEventWeight = JetEventWeightMCDTask; +using DplusChargedMCJetsEventWeight = JetEventWeightMCDTask; using LcChargedMCJetsEventWeight = JetEventWeightMCDTask; using BplusChargedMCJetsEventWeight = JetEventWeightMCDTask; using V0ChargedMCJetsEventWeight = JetEventWeightMCDTask; @@ -81,6 +82,10 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) adaptAnalysisTask(cfgc, SetDefaultProcesses{}, TaskName{"jet-d0-eventweight-mcd-charged"})); + tasks.emplace_back( + adaptAnalysisTask(cfgc, + SetDefaultProcesses{}, TaskName{"jet-dplus-eventweight-mcd-charged"})); + tasks.emplace_back( adaptAnalysisTask(cfgc, SetDefaultProcesses{}, TaskName{"jet-lc-eventweight-mcd-charged"})); diff --git a/PWGJE/TableProducer/jetEventWeightMCP.cxx b/PWGJE/TableProducer/jetEventWeightMCP.cxx index 6a3a9742546..5727cf57a43 100644 --- a/PWGJE/TableProducer/jetEventWeightMCP.cxx +++ b/PWGJE/TableProducer/jetEventWeightMCP.cxx @@ -47,6 +47,7 @@ using ChargedMCJetsEventWeight = JetEventWeightMCPTask; using FullMCJetsEventWeight = JetEventWeightMCPTask; using D0ChargedMCJetsEventWeight = JetEventWeightMCPTask; +using DplusChargedMCJetsEventWeight = JetEventWeightMCPTask; using LcChargedMCJetsEventWeight = JetEventWeightMCPTask; using BplusChargedMCJetsEventWeight = JetEventWeightMCPTask; using V0ChargedMCJetsEventWeight = JetEventWeightMCPTask; @@ -72,6 +73,10 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) adaptAnalysisTask(cfgc, SetDefaultProcesses{}, TaskName{"jet-d0-eventweight-mcp-charged"})); + tasks.emplace_back( + adaptAnalysisTask(cfgc, + SetDefaultProcesses{}, TaskName{"jet-dplus-eventweight-mcp-charged"})); + tasks.emplace_back( adaptAnalysisTask(cfgc, SetDefaultProcesses{}, TaskName{"jet-lc-eventweight-mcp-charged"})); diff --git a/PWGJE/TableProducer/rhoEstimator.cxx b/PWGJE/TableProducer/rhoEstimator.cxx index 0d2f2a76523..cea195df69f 100644 --- a/PWGJE/TableProducer/rhoEstimator.cxx +++ b/PWGJE/TableProducer/rhoEstimator.cxx @@ -34,6 +34,8 @@ struct RhoEstimatorTask { Produces rhoChargedMcTable; Produces rhoD0Table; Produces rhoD0McTable; + Produces rhoDplusTable; + Produces rhoDplusMcTable; Produces rhoLcTable; Produces rhoLcMcTable; Produces rhoBplusTable; @@ -140,6 +142,32 @@ struct RhoEstimatorTask { } PROCESS_SWITCH(RhoEstimatorTask, processD0McCollisions, "Fill rho tables for collisions with D0 MCP candidates", false); + void processDplusCollisions(aod::JetCollision const&, soa::Filtered const& tracks, aod::CandidatesDplusData const& candidates) + { + inputParticles.clear(); + for (auto& candidate : candidates) { + inputParticles.clear(); + jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, trackingEfficiency, std::optional{candidate}); + + auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, doSparse); + rhoDplusTable(rho, rhoM); + } + } + PROCESS_SWITCH(RhoEstimatorTask, processDplusCollisions, "Fill rho tables for collisions with Dplus candidates", false); + + void processDplusMcCollisions(aod::JetMcCollision const&, soa::Filtered const& particles, aod::CandidatesDplusMCP const& candidates) + { + inputParticles.clear(); + for (auto& candidate : candidates) { + inputParticles.clear(); + jetfindingutilities::analyseParticles(inputParticles, particleSelection, 1, particles, pdgDatabase, std::optional{candidate}); + + auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, doSparse); + rhoDplusMcTable(rho, rhoM); + } + } + PROCESS_SWITCH(RhoEstimatorTask, processDplusMcCollisions, "Fill rho tables for collisions with Dplus MCP candidates", false); + void processLcCollisions(aod::JetCollision const&, soa::Filtered const& tracks, aod::CandidatesLcData const& candidates) { inputParticles.clear(); diff --git a/PWGJE/Tasks/CMakeLists.txt b/PWGJE/Tasks/CMakeLists.txt index 727ed4f4d76..a3e6be92270 100644 --- a/PWGJE/Tasks/CMakeLists.txt +++ b/PWGJE/Tasks/CMakeLists.txt @@ -68,11 +68,15 @@ if(FastJet_FOUND) SOURCES jetSubstructureD0.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(jet-substructure-dplus + SOURCES jetSubstructureDplus.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore + COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(jet-substructure-lc SOURCES jetSubstructureLc.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(jet-substructure-bplus + o2physics_add_dpl_workflow(jet-substructure-bplus SOURCES jetSubstructureBplus.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore COMPONENT_NAME Analysis) @@ -84,6 +88,10 @@ o2physics_add_dpl_workflow(jet-substructure-bplus SOURCES jetSubstructureD0Output.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(jet-substructure-dplus-output + SOURCES jetSubstructureDplusOutput.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore + COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(jet-substructure-lc-output SOURCES jetSubstructureLcOutput.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore @@ -120,6 +128,10 @@ o2physics_add_dpl_workflow(jet-substructure-bplus SOURCES jetFinderD0QA.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(jet-finder-dplus-qa + SOURCES jetFinderDplusQA.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore + COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(jet-finder-lc-qa SOURCES jetFinderLcQA.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore diff --git a/PWGJE/Tasks/jetFinderDplusQA.cxx b/PWGJE/Tasks/jetFinderDplusQA.cxx new file mode 100644 index 00000000000..bf5468eae57 --- /dev/null +++ b/PWGJE/Tasks/jetFinderDplusQA.cxx @@ -0,0 +1,27 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// jet finder D+ charged QA task +// +/// \author Nima Zardoshti + +#include "PWGJE/Tasks/jetFinderHFQA.cxx" + +using JetFinderDplusQATask = JetFinderHFQATask; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + std::vector tasks; + tasks.emplace_back(adaptAnalysisTask(cfgc, + SetDefaultProcesses{}, + TaskName{"jet-finder-charged-dplus-qa"})); + return WorkflowSpec{tasks}; +} diff --git a/PWGJE/Tasks/jetFinderHFQA.cxx b/PWGJE/Tasks/jetFinderHFQA.cxx index 6ed3ab41306..a63cbef6563 100644 --- a/PWGJE/Tasks/jetFinderHFQA.cxx +++ b/PWGJE/Tasks/jetFinderHFQA.cxx @@ -489,6 +489,7 @@ struct JetFinderHFQATask { // Filter candidateCutsBplus = (aod::hf_sel_candidate_bplus::isSelBplusToD0Pi >= selectionFlagBplus); PresliceOptional> perD0CandidateTracks = aod::bkgd0::candidateId; + PresliceOptional> perDplusCandidateTracks = aod::bkgdplus::candidateId; PresliceOptional> perLcCandidateTracks = aod::bkglc::candidateId; PresliceOptional> perBplusCandidateTracks = aod::bkgbplus::candidateId; PresliceOptional> perDielectronCandidateTracks = aod::bkgdielectron::candidateId; @@ -1517,7 +1518,7 @@ struct JetFinderHFQATask { } for (auto const& candidate : candidates) { - for (auto const& track : jetcandidateutilities::slicedPerCandidate(tracks, candidate, perD0CandidateTracks, perLcCandidateTracks, perBplusCandidateTracks, perDielectronCandidateTracks)) { + for (auto const& track : jetcandidateutilities::slicedPerCandidate(tracks, candidate, perD0CandidateTracks, perDplusCandidateTracks, perLcCandidateTracks, perBplusCandidateTracks, perDielectronCandidateTracks)) { registry.fill(HIST("h3_centrality_track_pt_track_phi_eventwiseconstituentsubtracted"), collision.centrality(), track.pt(), track.phi()); registry.fill(HIST("h3_centrality_track_pt_track_eta_eventwiseconstituentsubtracted"), collision.centrality(), track.pt(), track.eta()); registry.fill(HIST("h3_track_pt_track_eta_track_phi_eventwiseconstituentsubtracted"), track.pt(), track.eta(), track.phi()); diff --git a/PWGJE/Tasks/jetSubstructureDplus.cxx b/PWGJE/Tasks/jetSubstructureDplus.cxx new file mode 100644 index 00000000000..ecf1b714b50 --- /dev/null +++ b/PWGJE/Tasks/jetSubstructureDplus.cxx @@ -0,0 +1,27 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// jet substructure D+ charged task +// +/// \author Nima Zardoshti + +#include "PWGJE/Tasks/jetSubstructureHF.cxx" + +using JetSubstructureDplus = JetSubstructureHFTask, soa::Join, soa::Join, soa::Join, aod::CandidatesDplusData, aod::CandidatesDplusMCP, aod::DplusCJetSSs, aod::DplusCMCDJetSSs, aod::DplusCMCPJetSSs, aod::DplusCEWSJetSSs, aod::JTrackDplusSubs>; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + std::vector tasks; + tasks.emplace_back(adaptAnalysisTask(cfgc, + SetDefaultProcesses{}, + TaskName{"jet-substructure-dplus"})); + return WorkflowSpec{tasks}; +} diff --git a/PWGJE/Tasks/jetSubstructureDplusOutput.cxx b/PWGJE/Tasks/jetSubstructureDplusOutput.cxx new file mode 100644 index 00000000000..065c412376f --- /dev/null +++ b/PWGJE/Tasks/jetSubstructureDplusOutput.cxx @@ -0,0 +1,26 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// jet substructure output D+ charged task +// +/// \author Nima Zardoshti + +#include "PWGJE/Tasks/jetSubstructureHFOutput.cxx" + +using JetSubstructureOutputDplus = JetSubstructureHFOutputTask, aod::CandidatesDplusData, aod::CandidatesDplusMCD, aod::CandidatesDplusMCP, aod::JTrackDplusSubs, soa::Join, soa::Join, aod::DplusCJetCOs, aod::DplusCJetOs, aod::DplusCJetSSOs, aod::DplusCJetMOs, soa::Join, aod::DplusCMCDJetCOs, aod::DplusCMCDJetOs, aod::DplusCMCDJetSSOs, aod::DplusCMCDJetMOs, soa::Join, aod::DplusCMCPJetCOs, aod::DplusCMCPJetOs, aod::DplusCMCPJetSSOs, aod::DplusCMCPJetMOs, soa::Join, aod::DplusCEWSJetCOs, aod::DplusCEWSJetOs, aod::DplusCEWSJetSSOs, aod::DplusCEWSJetMOs, aod::StoredHfDplusCollBase, aod::StoredHfDplusBases, aod::StoredHfDplusPars, aod::StoredHfDplusParEs, aod::JDumDplusParDaus, aod::StoredHfDplusSels, aod::StoredHfDplusMls, aod::JDumDplusMlDaus, aod::StoredHfDplusMcs, aod::StoredHfDplusMcCollBases, aod::StoredHfDplusMcRCollIds, aod::StoredHfDplusPBases>; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + std::vector tasks; + tasks.emplace_back(adaptAnalysisTask(cfgc, SetDefaultProcesses{}, TaskName{"jet-substructure-dplus-output"})); + + return WorkflowSpec{tasks}; +} diff --git a/PWGJE/Tasks/jetSubstructureHFOutput.cxx b/PWGJE/Tasks/jetSubstructureHFOutput.cxx index fd2c3e327c8..2e47f204787 100644 --- a/PWGJE/Tasks/jetSubstructureHFOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureHFOutput.cxx @@ -106,10 +106,12 @@ struct JetSubstructureHFOutputTask { PresliceUnsorted> CollisionsPerMcCollision = aod::jmccollisionlb::mcCollisionId; PresliceOptional D0CollisionsPerCollision = aod::jd0indices::collisionId; + PresliceOptional DplusCollisionsPerCollision = aod::jdplusindices::collisionId; PresliceOptional LcCollisionsPerCollision = aod::jlcindices::collisionId; PresliceOptional BplusCollisionsPerCollision = aod::jbplusindices::collisionId; PresliceOptional DielectronCollisionsPerCollision = aod::jdielectronindices::collisionId; PresliceOptional> D0McCollisionsPerMcCollision = aod::jd0indices::mcCollisionId; + PresliceOptional> DplusMcCollisionsPerMcCollision = aod::jdplusindices::mcCollisionId; PresliceOptional> LcMcCollisionsPerMcCollision = aod::jlcindices::mcCollisionId; PresliceOptional> BplusMcCollisionsPerMcCollision = aod::jbplusindices::mcCollisionId; PresliceOptional DielectronMcCollisionsPerMcCollision = aod::jdielectronindices::mcCollisionId; @@ -333,7 +335,7 @@ struct JetSubstructureHFOutputTask { if constexpr (!isMCPOnly) { for (const auto& collision : collisions) { if (collisionFlag[collision.globalIndex()]) { - const auto hfCollisionsPerCollision = jetcandidateutilities::slicedPerCandidateCollision(hfCollisions, candidates, collision, D0CollisionsPerCollision, LcCollisionsPerCollision, BplusCollisionsPerCollision, DielectronCollisionsPerCollision); // add Bplus later + const auto hfCollisionsPerCollision = jetcandidateutilities::slicedPerCandidateCollision(hfCollisions, candidates, collision, D0CollisionsPerCollision, DplusCollisionsPerCollision, LcCollisionsPerCollision, BplusCollisionsPerCollision, DielectronCollisionsPerCollision); // add Bplus later for (const auto& hfCollisionPerCollision : hfCollisionsPerCollision) { // should only ever be one auto hfCollisionTableIndex = candidateCollisionMapping.find(hfCollisionPerCollision.globalIndex()); if (hfCollisionTableIndex != candidateCollisionMapping.end()) { @@ -348,7 +350,7 @@ struct JetSubstructureHFOutputTask { if constexpr (isMC) { for (const auto& mcCollision : mcCollisions) { if (mcCollisionFlag[mcCollision.globalIndex()]) { - const auto hfMcCollisionsPerMcCollision = jetcandidateutilities::slicedPerCandidateCollision(hfMcCollisions, candidatesMCP, mcCollision, D0McCollisionsPerMcCollision, LcMcCollisionsPerMcCollision, BplusMcCollisionsPerMcCollision, DielectronMcCollisionsPerMcCollision); // add Bplus later + const auto hfMcCollisionsPerMcCollision = jetcandidateutilities::slicedPerCandidateCollision(hfMcCollisions, candidatesMCP, mcCollision, D0McCollisionsPerMcCollision, DplusMcCollisionsPerMcCollision, LcMcCollisionsPerMcCollision, BplusMcCollisionsPerMcCollision, DielectronMcCollisionsPerMcCollision); // add Bplus later for (const auto& hfMcCollisionPerMcCollision : hfMcCollisionsPerMcCollision) { // should only ever be one auto hfMcCollisionTableIndex = candidateMcCollisionMapping.find(hfMcCollisionPerMcCollision.globalIndex()); if (hfMcCollisionTableIndex != candidateMcCollisionMapping.end()) { From 1fea1042297b56aee77e4c6246a0e81e76cd5dd3 Mon Sep 17 00:00:00 2001 From: aimeric-landou <46970521+aimeric-landou@users.noreply.github.com> Date: Sat, 8 Feb 2025 09:37:21 +0100 Subject: [PATCH 0106/1650] [PWGJE] PWGJE - adding occupancy QA to jetFinderQA (#9826) --- PWGJE/Tasks/jetFinderQA.cxx | 44 +++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/PWGJE/Tasks/jetFinderQA.cxx b/PWGJE/Tasks/jetFinderQA.cxx index c5a0440f5b5..089c50887bd 100644 --- a/PWGJE/Tasks/jetFinderQA.cxx +++ b/PWGJE/Tasks/jetFinderQA.cxx @@ -14,6 +14,9 @@ /// \author Nima Zardoshti #include +#include +#include +#include #include #include "Framework/ASoA.h" @@ -325,6 +328,18 @@ struct JetFinderQATask { AxisSpec weightAxis = {{VARIABLE_WIDTH, 1e-13, 1e-12, 1e-11, 1e-10, 1e-9, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1.0, 10.0}, "weights"}; registry.add("h_collision_eventweight_part", "event weight;event weight;entries", {HistType::kTH1F, {weightAxis}}); } + + AxisSpec occupancyAxis = {142, -1.5, 14000.5, "occupancy"}; + AxisSpec nTracksAxis = {16001, -1., 16000, "n tracks"}; + + if (doprocessOccupancyQA) { + registry.add("h2_occupancy_ntracksall_presel", "occupancy vs N_{tracks}; occupancy; N_{tracks}", {HistType::kTH2I, {occupancyAxis, nTracksAxis}}); + registry.add("h2_occupancy_ntracksall_postsel", "occupancy vs N_{tracks}; occupancy; N_{tracks}", {HistType::kTH2I, {occupancyAxis, nTracksAxis}}); + registry.add("h2_occupancy_ntrackssel_presel", "occupancy vs N_{tracks}; occupancy; N_{tracks}", {HistType::kTH2I, {occupancyAxis, nTracksAxis}}); + registry.add("h2_occupancy_ntrackssel_postsel", "occupancy vs N_{tracks}; occupancy; N_{tracks}", {HistType::kTH2I, {occupancyAxis, nTracksAxis}}); + registry.add("h2_occupancy_ntracksselptetacuts_presel", "occupancy vs N_{tracks}; occupancy; N_{tracks}", {HistType::kTH2I, {occupancyAxis, nTracksAxis}}); + registry.add("h2_occupancy_ntracksselptetacuts_postsel", "occupancy vs N_{tracks}; occupancy; N_{tracks}", {HistType::kTH2I, {occupancyAxis, nTracksAxis}}); + } } Filter trackCuts = (aod::jtrack::pt >= trackPtMin && aod::jtrack::pt < trackPtMax && aod::jtrack::eta > trackEtaMin && aod::jtrack::eta < trackEtaMax); @@ -1168,6 +1183,35 @@ struct JetFinderQATask { randomCone(collision, jets, tracks); } PROCESS_SWITCH(JetFinderQATask, processRandomConeMCD, "QA for random cone estimation of background fluctuations in mcd", false); + + void processOccupancyQA(soa::Filtered::iterator const& collision, aod::JetTracks const& tracks) + { + if (skipMBGapEvents && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + return; + } + int occupancy = collision.trackOccupancyInTimeRange(); + int nTracksAll = tracks.size(); + int nTracksAllAcceptanceAndSelected = 0; + int nTracksInAcceptanceAndSelected = 0; + for (auto const& track : tracks) { + if (jetderiveddatautilities::selectTrack(track, trackSelection)) { + nTracksAllAcceptanceAndSelected += 1; + if (track.pt() >= trackPtMin && track.pt() < trackPtMax && track.eta() > trackEtaMin && track.eta() < trackEtaMax) { + nTracksInAcceptanceAndSelected += 1; + } + } + } + + registry.fill(HIST("h2_occupancy_ntracksall_presel"), occupancy, nTracksAll); + registry.fill(HIST("h2_occupancy_ntrackssel_presel"), occupancy, nTracksAllAcceptanceAndSelected); + registry.fill(HIST("h2_occupancy_ntracksselptetacuts_presel"), occupancy, nTracksInAcceptanceAndSelected); + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + registry.fill(HIST("h2_occupancy_ntracksall_postsel"), occupancy, nTracksAll); + registry.fill(HIST("h2_occupancy_ntrackssel_postsel"), occupancy, nTracksAllAcceptanceAndSelected); + registry.fill(HIST("h2_occupancy_ntracksselptetacuts_postsel"), occupancy, nTracksInAcceptanceAndSelected); + } + } + PROCESS_SWITCH(JetFinderQATask, processOccupancyQA, "occupancy QA on jet derived data", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc, TaskName{"jet-finder-charged-qa"})}; } From 526372701b67d0226f5b8bd046d47183140dbe2f Mon Sep 17 00:00:00 2001 From: Joachim Carlo Kristian Bjerg Hansen <50103987+joachimckh@users.noreply.github.com> Date: Sat, 8 Feb 2025 09:38:10 +0100 Subject: [PATCH 0107/1650] [PWGJE] MC process functions updated (#9809) --- PWGJE/Tasks/jetSpectraEseTask.cxx | 82 +++++++++++++++++++++++-------- 1 file changed, 62 insertions(+), 20 deletions(-) diff --git a/PWGJE/Tasks/jetSpectraEseTask.cxx b/PWGJE/Tasks/jetSpectraEseTask.cxx index 1a1e082b494..de08d761e85 100644 --- a/PWGJE/Tasks/jetSpectraEseTask.cxx +++ b/PWGJE/Tasks/jetSpectraEseTask.cxx @@ -49,7 +49,7 @@ struct JetSpectraEseTask { ConfigurableAxis binESE{"binESE", {100, 0, 100}, ""}; ConfigurableAxis binCos{"binCos", {100, -1.05, 1.05}, ""}; ConfigurableAxis binOccupancy{"binOccupancy", {5000, 0, 25000}, ""}; - ConfigurableAxis binQVec{"binQVec", {100, -3, 3}, ""}; + ConfigurableAxis binQVec{"binQVec", {500, -3, 3}, ""}; Configurable jetPtMin{"jetPtMin", 5.0, "minimum jet pT cut"}; Configurable jetR{"jetR", 0.2, "jet resolution parameter"}; @@ -60,7 +60,8 @@ struct JetSpectraEseTask { Configurable eventSelections{"eventSelections", "sel8FullPbPb", "choose event selection"}; Configurable trackSelections{"trackSelections", "globalTracks", "set track selections"}; - Configurable cfgEvSelOccupancy{"cfgEvSelOccupancy", false, "Flag for occupancy cut"}; + Configurable cfgEvSelOccupancy{"cfgEvSelOccupancy", true, "Flag for occupancy cut"}; + Configurable> cfgCutOccupancy{"cfgCutOccupancy", {0, 1000}, "Occupancy cut"}; Configurable> cfgOccupancyPtCut{"cfgOccupancyPtCut", {0, 100}, "pT cut"}; @@ -83,6 +84,9 @@ struct JetSpectraEseTask { std::vector eventSelectionBits; int trackSelection{-1}; + Filter jetCuts = aod::jet::pt > jetPtMin&& aod::jet::r == nround(jetR.node() * 100.0f) && nabs(aod::jet::eta) < 0.9f - jetR; + Filter colFilter = nabs(aod::jcollision::posZ) < vertexZCut; + Filter mcCollisionFilter = nabs(aod::jmccollision::posZ) < vertexZCut; using ChargedMCDJets = soa::Filtered>; Preslice mcdjetsPerJCollision = o2::aod::jet::collisionId; @@ -104,7 +108,8 @@ struct JetSpectraEseTask { if (doprocessESEDataCharged) { LOGF(info, "JetSpectraEseTask::init() - processESEDataCharged"); registry.add("hEventCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); - registry.add("hCentralityMult", ";Centrality;entries", {HistType::kTH1F, {{100, 0, 100}}}); + registry.add("hCentralitySel", ";Centrality;entries", {HistType::kTH1F, {{100, 0, 100}}}); + registry.add("hCentralityAnalyzed", ";Centrality;entries", {HistType::kTH1F, {{100, 0, 100}}}); registry.add("hJetPt", "jet pT;#it{p}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {{jetPtAxis}}}); registry.add("hJetPt_bkgsub", "jet pT background sub;#it{p}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {{jetPtAxis}}}); registry.add("hJetEta", "jet #eta;#eta_{jet};entries", {HistType::kTH1F, {{100, -1.0, 1.0}}}); @@ -128,30 +133,50 @@ struct JetSpectraEseTask { registry.addClone("hPsi2FT0C", "hEPUncorV2"); registry.addClone("hPsi2FT0C", "hEPRectrV2"); registry.addClone("hPsi2FT0C", "hEPTwistV2"); + + registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(1, "Input event"); + registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(2, "Event selection"); + registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(3, "Occupancy cut"); + registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(4, "ESE available"); + registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(5, "Lead track"); + registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(6, "Jet loop"); + registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(7, "Centrality analyzed"); } if (doprocessMCParticleLevel) { LOGF(info, "JetSpectraEseTask::init() - processMCParticleLevel"); registry.add("hMCPartEventCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); + registry.add("hPartCentralitySel", ";centr;entries", {HistType::kTH1F, {{100, 0.0, 100.0}}}); registry.add("hPartJetPt", "particle level jet pT;#it{p}_{T,jet part} (GeV/#it{c});entries", {HistType::kTH1F, {{jetPtAxis}}}); registry.add("hPartJetPtSubBkg", "particle level jet pT;#it{p}_{T,jet part} (GeV/#it{c});entries", {HistType::kTH1F, {{jetPtAxis}}}); + registry.add("hPartJetSparse", ";Centrality;#it{p}_{T,jet part} (GeV/#it{c})", {HistType::kTHnSparseF, {{110, -10, 100}, {jetPtAxis}, {100, -1.0, 1.0}, {80, -1.0, 7}}}); registry.add("hPartJetEta", "particle level jet #eta;#eta_{jet part};entries", {HistType::kTH1F, {{100, -1.0, 1.0}}}); registry.add("hPartJetPhi", "particle level jet #phi;#phi_{jet part};entries", {HistType::kTH1F, {{80, -1.0, 7.}}}); + + registry.get(HIST("hMCPartEventCounter"))->GetXaxis()->SetBinLabel(1, "Input event"); + registry.get(HIST("hMCPartEventCounter"))->GetXaxis()->SetBinLabel(2, "Collision size < 1"); + registry.get(HIST("hMCPartEventCounter"))->GetXaxis()->SetBinLabel(3, "MCD size != 1"); } if (doprocessMCDetectorLevel) { LOGF(info, "JetSpectraEseTask::init() - processMCDetectorLevel"); registry.add("hMCDetEventCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); + registry.add("hDetCentralitySel", ";centr;entries", {HistType::kTH1F, {{100, 0.0, 100.0}}}); registry.add("hDetJetPt", "particle level jet pT;#it{p}_{T,jet part} (GeV/#it{c});entries", {HistType::kTH1F, {{jetPtAxis}}}); - registry.add("hDetJetPtSubBkg", "particle level jet pT;#it{p}_{T,jet part} (GeV/#it{c});entries", {HistType::kTH1F, {{jetPtAxis}}}); + registry.add("hDetJetSparse", ";Centr;#it{p}_{T,jet part} (GeV/#it{c})", {HistType::kTHnSparseF, {{110, -10, 100}, {jetPtAxis}, {100, -1.0, 1.0}, {80, -1.0, 7}}}); registry.add("hDetJetEta", "particle level jet #eta;#eta_{jet part};entries", {HistType::kTH1F, {{100, -1.0, 1.0}}}); registry.add("hDetJetPhi", "particle level jet #phi;#phi_{jet part};entries", {HistType::kTH1F, {{80, -1.0, 7.}}}); + + registry.get(HIST("hMCDetEventCounter"))->GetXaxis()->SetBinLabel(1, "Input event"); + registry.get(HIST("hMCDetEventCounter"))->GetXaxis()->SetBinLabel(2, "Event eelection"); + registry.get(HIST("hMCDetEventCounter"))->GetXaxis()->SetBinLabel(3, "Occupancy cut"); } if (doprocessMCChargedMatched) { LOGF(info, "JetSpectraEseTask::init() - processMCChargedMatched"); registry.add("hMCEventCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); registry.add("hMCDMatchedEventCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); - registry.add("hCentralityMult", ";Centrality;entries", {HistType::kTH1F, {{100, 0, 100}}}); + registry.add("hCentralityAnalyzed", ";Centrality;entries", {HistType::kTH1F, {{100, 0, 100}}}); registry.add("hPartJetPtMatch", ";Centrality;#it{p}_{T,jet part} (GeV/#it{c})", {HistType::kTH2F, {{100, 0, 100}, {jetPtAxis}}}); registry.add("hPartJetPtMatchSubBkg", ";Centrality;#it{p}_{T,jet part} (GeV/#it{c})", {HistType::kTH2F, {{100, 0, 100}, {jetPtAxis}}}); + registry.add("hPartJetMatchSparse", ";Centrality;#it{p}_{T,jet part} (GeV/#it{c})", {HistType::kTHnSparseF, {{110, -10, 100}, {jetPtAxis}, {100, -1.0, 1.0}, {80, -1.0, 7}}}); registry.add("hPartJetEtaMatch", "particle level jet #eta;#eta_{jet part};entries", {HistType::kTH1F, {{100, -1.0, 1.0}}}); registry.add("hPartJetPhiMatch", "particle level jet #phi;#phi_{jet part};entries", {HistType::kTH1F, {{80, -1.0, 7.}}}); registry.add("hDetectorJetPt", ";Centrality;#it{p}_{T,jet det} (GeV/#it{c})", {HistType::kTH2F, {{100, 0, 100}, {jetPtAxis}}}); @@ -165,6 +190,17 @@ struct JetSpectraEseTask { registry.add("hMatchedJetsPhiDelta", "#phi_{jet part}; det - part", {HistType::kTH2F, {{80, -1.0, 7.}, {200, -10.0, 10.}}}); registry.add("hRespMcDMcPMatch", ";Centrality,#it{p}_{T, jet det}; #it{p}_{T, jet part}", HistType::kTHnSparseF, {{100, 0, 100}, jetPtAxis, jetPtAxis}); registry.add("hRespMcDMcPMatchSubBkg", ";Centrality,#it{p}_{T, jet det}; #it{p}_{T, jet part}", HistType::kTHnSparseF, {{100, 0, 100}, jetPtAxis, jetPtAxis}); + + registry.get(HIST("hMCEventCounter"))->GetXaxis()->SetBinLabel(1, "Input event"); + registry.get(HIST("hMCEventCounter"))->GetXaxis()->SetBinLabel(2, "Collision size < 1"); + registry.get(HIST("hMCEventCounter"))->GetXaxis()->SetBinLabel(3, "Vertex cut"); + registry.get(HIST("hMCEventCounter"))->GetXaxis()->SetBinLabel(4, "After analysis"); + registry.get(HIST("hMCDMatchedEventCounter"))->GetXaxis()->SetBinLabel(1, "Input event"); + registry.get(HIST("hMCDMatchedEventCounter"))->GetXaxis()->SetBinLabel(2, "Vertex cut"); + registry.get(HIST("hMCDMatchedEventCounter"))->GetXaxis()->SetBinLabel(3, "Event selection"); + registry.get(HIST("hMCDMatchedEventCounter"))->GetXaxis()->SetBinLabel(4, "Occupancy cut"); + registry.get(HIST("hMCDMatchedEventCounter"))->GetXaxis()->SetBinLabel(5, "Centrality cut1:cut2"); + registry.get(HIST("hMCDMatchedEventCounter"))->GetXaxis()->SetBinLabel(6, "After analysis"); } if (doprocessESEOccupancy) { LOGF(info, "JetSpectraEseTask::init() - processESEOccupancy"); @@ -177,10 +213,6 @@ struct JetSpectraEseTask { } } - Filter jetCuts = aod::jet::pt > jetPtMin&& aod::jet::r == nround(jetR.node() * 100.0f) && nabs(aod::jet::eta) < 0.9f - jetR; - Filter colFilter = nabs(aod::jcollision::posZ) < vertexZCut; - Filter mcCollisionFilter = nabs(aod::jmccollision::posZ) < vertexZCut; - void processESEDataCharged(soa::Join::iterator const& collision, soa::Filtered const& jets, aod::JetTracks const& tracks) @@ -194,6 +226,7 @@ struct JetSpectraEseTask { if (cfgEvSelOccupancy && !isOccupancyWithin(collision)) return; registry.fill(HIST("hEventCounter"), counter++); + registry.fill(HIST("hCentralitySel"), collision.centrality()); const auto vPsi2{procEP(collision)}; const auto qPerc{collision.qPERCFT0C()}; @@ -206,7 +239,7 @@ struct JetSpectraEseTask { registry.fill(HIST("hEventCounter"), counter++); registry.fill(HIST("hRho"), collision.rho()); - registry.fill(HIST("hCentralityMult"), collision.centrality()); + registry.fill(HIST("hCentralityAnalyzed"), collision.centrality()); for (auto const& jet : jets) { float jetpTbkgsub = jet.pt() - (collision.rho() * jet.area()); registry.fill(HIST("hJetPt"), jet.pt()); @@ -256,25 +289,33 @@ struct JetSpectraEseTask { } PROCESS_SWITCH(JetSpectraEseTask, processESEOccupancy, "process occupancy", false); - void processMCParticleLevel(soa::Join::iterator const& collision, + void processMCParticleLevel(soa::Filtered>::iterator const& mcCollision, + soa::SmallGroups const& collisions, soa::Filtered const& jets) { float counter{0.5f}; registry.fill(HIST("hMCPartEventCounter"), counter++); - if (collision.size() < 1) { + if (mcCollision.size() < 1) { return; } registry.fill(HIST("hMCPartEventCounter"), counter++); - if (!(std::abs(collision.posZ()) < vertexZCut)) { + if (collisions.size() != 1) { return; } registry.fill(HIST("hMCPartEventCounter"), counter++); + auto centrality{-1}; + for (const auto& col : collisions) { + centrality = col.centrality(); + } + registry.fill(HIST("hPartCentralitySel"), centrality); for (const auto& jet : jets) { + const auto mcPt{jet.pt() - (mcCollision.rho() * jet.area())}; registry.fill(HIST("hPartJetPt"), jet.pt()); - registry.fill(HIST("hPartJetPtSubBkg"), jet.pt() - (collision.rho() * jet.area())); + registry.fill(HIST("hPartJetPtSubBkg"), mcPt); registry.fill(HIST("hPartJetEta"), jet.eta()); registry.fill(HIST("hPartJetPhi"), jet.phi()); + registry.fill(HIST("hPartJetSparse"), centrality, mcPt, jet.eta(), jet.phi()); } } PROCESS_SWITCH(JetSpectraEseTask, processMCParticleLevel, "jets on particle level MC", false); @@ -285,27 +326,26 @@ struct JetSpectraEseTask { aod::JetParticles const&) { float counter{0.5f}; + registry.fill(HIST("hMCDetEventCounter"), counter++); if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) return; registry.fill(HIST("hMCDetEventCounter"), counter++); - if (cfgEvSelOccupancy && !isOccupancyWithin(collision)) return; registry.fill(HIST("hMCDetEventCounter"), counter++); - + registry.fill(HIST("hDetCentralitySel"), collision.centrality()); for (const auto& mcdjet : mcdjets) { auto mcdetPt{mcdjet.pt() - (collision.rho() * mcdjet.area())}; registry.fill(HIST("hDetJetPt"), mcdjet.pt()); - registry.fill(HIST("hDetJetPtSubBkg"), mcdetPt); registry.fill(HIST("hDetJetEta"), mcdjet.eta()); registry.fill(HIST("hDetJetPhi"), mcdjet.phi()); + registry.fill(HIST("hDetJetSparse"), collision.centrality(), mcdetPt, mcdjet.eta(), mcdjet.phi()); } } PROCESS_SWITCH(JetSpectraEseTask, processMCDetectorLevel, "jets on detector level", false); using JetMCPTable = soa::Filtered>; - void processMCChargedMatched(/*soa::Filtered::iterator const& collision*/ - soa::Join::iterator const& mcCol, + void processMCChargedMatched(soa::Filtered>::iterator const& mcCol, soa::SmallGroups> const& collisions, ChargedMCDJets const& mcdjets, JetMCPTable const&, @@ -329,6 +369,7 @@ struct JetSpectraEseTask { if (!(std::abs(collision.posZ()) < vertexZCut)) { return; } + registry.fill(HIST("hMCDMatchedEventCounter"), secCount++); if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) return; @@ -341,7 +382,7 @@ struct JetSpectraEseTask { if (collision.centrality() < centRange->at(0) || collision.centrality() > centRange->at(1)) registry.fill(HIST("hMCDMatchedEventCounter"), secCount++); - registry.fill(HIST("hCentralityMult"), collision.centrality()); + registry.fill(HIST("hCentralityAnalyzed"), collision.centrality()); auto collmcdJets{mcdjets.sliceBy(mcdjetsPerJCollision, collision.globalIndex())}; for (const auto& mcdjet : collmcdJets) { auto mcdPt{mcdjet.pt() - (collision.rho() * mcdjet.area())}; @@ -355,6 +396,7 @@ struct JetSpectraEseTask { registry.fill(HIST("hPartJetPtMatchSubBkg"), collision.centrality(), mcpPt); registry.fill(HIST("hPartJetEtaMatch"), mcpjet.eta()); registry.fill(HIST("hPartJetPhiMatch"), mcpjet.phi()); + registry.fill(HIST("hPartJetMatchSparse"), collision.centrality(), mcpPt, mcpjet.eta(), mcpjet.phi()); registry.fill(HIST("hMatchedJetsPtDelta"), mcpjet.pt(), mcdjet.pt() - mcpjet.pt()); registry.fill(HIST("hGenMatchedJetsPtDeltadPt"), collision.centrality(), mcpPt, (mcdPt - mcpPt) / mcpPt); registry.fill(HIST("hRecoMatchedJetsPtDeltadPt"), collision.centrality(), mcdPt, (mcdPt - mcpPt) / mcdPt); From 59ce8021ea93c1ae426d73d416b4072424885db2 Mon Sep 17 00:00:00 2001 From: JaeyoonCho Date: Sat, 8 Feb 2025 12:22:25 +0100 Subject: [PATCH 0108/1650] [PWGHF] Minor bug fix in the task workflow (#9831) Co-authored-by: ALICE Action Bot --- PWGHF/D2H/Tasks/taskXicToXiPiPi.cxx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskXicToXiPiPi.cxx b/PWGHF/D2H/Tasks/taskXicToXiPiPi.cxx index 431b2e3399f..d9958ba459f 100644 --- a/PWGHF/D2H/Tasks/taskXicToXiPiPi.cxx +++ b/PWGHF/D2H/Tasks/taskXicToXiPiPi.cxx @@ -280,10 +280,13 @@ struct HfTaskXicToXiPiPi { double outputBkg = -99.; // bkg score double outputPrompt = -99.; // prompt score double outputFD = -99.; // non-prompt score - if (candidate.mlProbXicToXiPiPi().size() > 0) { + int scoreSize = candidate.mlProbXicToXiPiPi().size(); + if (scoreSize > 0) { outputBkg = candidate.mlProbXicToXiPiPi()[0]; outputPrompt = candidate.mlProbXicToXiPiPi()[1]; - outputFD = candidate.mlProbXicToXiPiPi()[2]; + if (scoreSize == 3) { + outputFD = candidate.mlProbXicToXiPiPi()[2]; + } } registry.get(HIST("hXicToXiPiPiVarsWithML"))->Fill(candidate.pt(), candidate.invMassXicPlus(), candidate.chi2PCA(), candidate.decayLength(), candidate.decayLengthXY(), candidate.cpa(), outputBkg, outputPrompt, outputFD); } else { From 2fafa94edc505f96de4b0ea5993eb8af03aedac9 Mon Sep 17 00:00:00 2001 From: Lars <146946151+ljoergen@users.noreply.github.com> Date: Sat, 8 Feb 2025 16:34:37 +0100 Subject: [PATCH 0109/1650] [PWGLF] AngularCorrelationsInJets.cxx: Major adjustments (#9833) Co-authored-by: ALICE Action Bot --- .../Nuspex/AngularCorrelationsInJets.cxx | 695 +++++++++++------- 1 file changed, 445 insertions(+), 250 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/AngularCorrelationsInJets.cxx b/PWGLF/Tasks/Nuspex/AngularCorrelationsInJets.cxx index 3fa2f9a4c76..1a4a4a33dbe 100644 --- a/PWGLF/Tasks/Nuspex/AngularCorrelationsInJets.cxx +++ b/PWGLF/Tasks/Nuspex/AngularCorrelationsInJets.cxx @@ -28,6 +28,9 @@ #include "Common/TableProducer/PID/pidTOFBase.h" #include "Common/DataModel/McCollisionExtra.h" #include "PWGDQ/DataModel/ReducedInfoTables.h" +#include "PWGJE/Core/JetDerivedDataUtilities.h" +#include "PWGJE/DataModel/JetReducedData.h" +#include "PWGJE/DataModel/Jet.h" #include "fastjet/PseudoJet.hh" #include "fastjet/AreaDefinition.hh" @@ -64,6 +67,7 @@ struct AngularCorrelationsInJets { Configurable maxDCAxy{"maxDCAxy", 0.5, "max DCA to vertex xy"}; Configurable maxDCAz{"maxDCAz", 1.0, "max DCA to vertex z"}; Configurable maxEta{"maxEta", 0.8, "max pseudorapidity"}; // consider jet cone? + Configurable minTrackPt{"minTrackPt", 0.1, "minimum track pT"}; // Jet Cuts Configurable jetR{"jetR", 0.4, "jet resolution parameter"}; @@ -94,30 +98,38 @@ struct AngularCorrelationsInJets { // Nuclei Cuts Configurable nucleiDCAxyYield{"nucleiDCAxyYield", 0.05, "[nuclei] DCAxy cut for yield"}; - Configurable nucleiDCAzYield{"nucleiDCAzYield", 1.0, "[nuclei] DCAz cut for yield"}; - Configurable nucleiDCAxyCF{"nucleiDCAxyCF", 0.05, "[nuclei] DCAxy cut for CF"}; - Configurable nucleiDCAzCF{"nucleiDCAzCF", 1.0, "[nuclei] DCAz cut for CF"}; + Configurable nucleiDCAzYield{"nucleiDCAzYield", 0.02, "[nuclei] DCAz cut for yield"}; Configurable nucleiTPCTOFpT{"nucleiTPCTOFpT", 0.7, "[nuclei] pT for switch in TPC/TPC+TOF nsigma"}; Configurable nucleiTPCnsigmaLowPtYield{"nucleiTPCnsigmaLowPtYield", 4.0, "[nuclei] max TPC nsigma with low pT for yield"}; Configurable nucleiTPCnsigmaHighPtYield{"nucleiTPCnsigmaHighPtYield", 4.0, "[nuclei] max TPC nsigma with high pT for yield"}; Configurable nucleiTOFnsigmaHighPtYield{"nucleiTOFnsigmaHighPtYield", 4.0, "[nuclei] min TOF nsigma with high pT for yield"}; - Configurable nucleiNsigma{"nucleiNsigma", 2.0, "[nuclei] max combined nsigma for CF (sqrt(nsigTPC^2 + nsigTOF^2))"}; // Antinuclei Cuts Configurable antinucleiDCAxyYield{"antinucleiDCAxyYield", 0.05, "[antinuclei] DCAxy cut for yield"}; - Configurable antinucleiDCAzYield{"antinucleiDCAzYield", 1.0, "[antinuclei] DCAz cut for yield"}; - Configurable antinucleiDCAxyCF{"antinucleiDCAxyCF", 0.05, "[antinuclei] DCAxy cut for CF"}; - Configurable antinucleiDCAzCF{"antinucleiDCAzCF", 1.0, "[antinuclei] DCAz cut for CF"}; + Configurable antinucleiDCAzYield{"antinucleiDCAzYield", 0.02, "[antinuclei] DCAz cut for yield"}; Configurable antinucleiTPCTOFpT{"antinucleiTPCTOFpT", 0.7, "[antinuclei] pT for switch in TPC/TPC+TOF nsigma"}; Configurable antinucleiTPCnsigmaLowPtYield{"antinucleiTPCnsigmaLowPtYield", 4.0, "[antinuclei] max TPC nsigma with low pT for yield"}; Configurable antinucleiTPCnsigmaHighPtYield{"antinucleiTPCnsigmaHighPtYield", 4.0, "[antinuclei] max TPC nsigma with high pT for yield"}; Configurable antinucleiTOFnsigmaHighPtYield{"antinucleiTOFnsigmaHighPtYield", 4.0, "[antinuclei] min TOF nsigma with high pT for yield"}; - Configurable antinucleiNsigma{"antinucleiNsigma", 2.0, "[nuclei] max combined nsigma for CF (sqrt(nsigTPC^2 + nsigTOF^2))"}; - - Configurable nsigmaRejection{"nsigmaRejection", 3.0, "particles with TPC nsigma < nsigmaRejection other than the species in question will be rejected"}; + // Pion & Kaon PID + Configurable pionDCAxy{"pionDCAxy", 0.05, "[pion] DCAxy cut"}; + Configurable pionDCAz{"pionDCAz", 0.05, "[pion] DCAz cut"}; + Configurable pionTPCTOFpT{"pionTPCTOFpT", 0.7, "[pion] pT for switch in TPC/TPC+TOF nsigma"}; + Configurable pionTPCnsigmaLowPt{"pionTPCnsigmaLowPt", 3.0, "[pion] max TPC nsigma with low pT"}; + Configurable pionTPCnsigmaHighPt{"pionTPCnsigmaHighPt", 3.0, "[pion] max TPC nsigma with high pT"}; + Configurable pionTOFnsigma{"pionTOFnsigma", 3.0, "[pion] max TOF nsigma"}; + Configurable kaonDCAxy{"kaonDCAxy", 0.05, "[kaon] DCAxy cut"}; + Configurable kaonDCAz{"kaonDCAz", 0.05, "[kaon] DCAz cut"}; + Configurable kaonTPCTOFpT{"kaonTPCTOFpT", 0.7, "[kaon] pT for switch in TPC/TPC+TOF nsigma"}; + Configurable kaonTPCnsigmaLowPt{"kaonTPCnsigmaLowPt", 3.0, "[kaon] max TPC nsigma with low pT"}; + Configurable kaonTPCnsigmaHighPt{"kaonTPCnsigmaHighPt", 3.0, "[kaon] max TPC nsigma with high pT"}; + Configurable kaonTOFnsigma{"kaonTOFnsigma", 3.0, "[kaon] max TOF nsigma"}; + + Configurable useRejectionCut{"useRejectionCut", true, "use nsigmaRejection"}; + Configurable nsigmaRejection{"nsigmaRejection", 1.0, "reject tracks with nsigma < nsigmaRejection for >1 species"}; Configurable deuteronAnalysis{"deuteronAnalysis", true, "true [false]: analyse (anti)deuterons [(anti)helium-3]"}; - Configurable useTOFmass{"useTOFmass", true, "use TOF mass instead of pion mass if available"}; + Configurable useTOFmass{"useTOFmass", false, "use TOF mass instead of pion mass if available"}; Configurable trackBufferSize{"trackBufferSize", 200, "Number of mixed-event tracks being stored"}; @@ -129,13 +141,14 @@ struct AngularCorrelationsInJets { int mRunNumber; using FullTracksRun2 = soa::Join; + aod::TrackSelectionExtension, aod::TracksDCA, aod::pidTPCFullPr, aod::pidTPCFullDe, aod::pidTPCFullHe, aod::pidTOFFullPr, aod::pidTOFFullDe, aod::pidTOFFullHe, aod::pidTOFmass, aod::pidTOFbeta, aod::pidTPCEl, aod::pidTPCMu, aod::pidTPCPi, aod::pidTPCKa, aod::pidTPCTr, aod::pidTPCAl, aod::pidTOFPi, aod::pidTOFKa>; using FullTracksRun3 = soa::Join; + aod::TracksDCA, aod::pidTPCFullPr, aod::pidTPCFullDe, aod::pidTPCFullHe, aod::pidTOFFullPr, aod::pidTOFFullDe, aod::pidTOFFullHe, aod::pidTOFmass, aod::pidTOFbeta, aod::pidTPCEl, aod::pidTPCMu, aod::pidTPCPi, aod::pidTPCKa, aod::pidTPCTr, aod::pidTPCAl, aod::pidTOFPi, aod::pidTOFKa>; using McTracksRun2 = soa::Join; + aod::TrackSelectionExtension, aod::TracksDCA, aod::pidTPCFullPr, aod::pidTPCFullDe, aod::pidTPCFullHe, aod::pidTOFFullPr, aod::pidTOFFullDe, aod::pidTOFFullHe, aod::pidTOFmass, aod::pidTOFbeta, aod::pidTPCEl, aod::pidTPCMu, aod::pidTPCPi, aod::pidTPCKa, aod::pidTPCTr, aod::pidTPCAl, aod::pidTOFPi, aod::pidTOFKa, aod::McTrackLabels>; using McTracksRun3 = soa::Join; + aod::TracksDCA, aod::pidTPCFullPr, aod::pidTPCFullDe, aod::pidTPCFullHe, aod::pidTOFFullPr, aod::pidTOFFullDe, aod::pidTOFFullHe, aod::pidTOFmass, aod::pidTOFbeta, aod::pidTPCEl, aod::pidTPCMu, aod::pidTPCPi, aod::pidTPCKa, aod::pidTPCTr, aod::pidTPCAl, aod::pidTOFPi, aod::pidTOFKa, aod::McTrackLabels>; + using JTracksRun3 = soa::Join; using BCsWithRun2Info = soa::Join; using McCollisions = soa::Join; @@ -143,7 +156,12 @@ struct AngularCorrelationsInJets { aod::track::tpcChi2NCl < maxChi2TPC && nabs(aod::track::dcaXY) < maxDCAxy && nabs(aod::track::dcaZ) < maxDCAz && - nabs(aod::track::eta) < maxEta); // add more preliminary cuts to filter if possible + nabs(aod::track::eta) < maxEta && + aod::track::pt > minTrackPt); // add more preliminary cuts to filter if possible + Filter collisionFilter = (nabs(aod::jcollision::posZ) < zVtx); + Filter trackCuts = (nabs(aod::jtrack::eta) > maxEta && aod::jtrack::pt > minJetParticlePt); + // Filter partCuts = (aod::jmcparticle::pt >= trackPtMin && aod::jmcparticle::pt < trackPtMax); + Filter jetFilter = (aod::jet::pt >= minJetPt && nabs(aod::jet::eta) < nabs(maxEta - aod::jet::r / 100.f)); Preslice perCollisionFullTracksRun2 = o2::aod::track::collisionId; Preslice perCollisionFullTracksRun3 = o2::aod::track::collisionId; @@ -157,6 +175,7 @@ struct AngularCorrelationsInJets { HistogramRegistry registryQA{"dataQA", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; JetBkgSubUtils bkgSub; + std::vector eventSelection; void init(o2::framework::InitContext&) { @@ -166,6 +185,8 @@ struct AngularCorrelationsInJets { ccdb->setLocalObjectValidityChecking(); ccdb->setFatalWhenNull(false); + eventSelection = jetderiveddatautilities::initialiseEventSelectionBits(static_cast("sel8")); + // Counters registryData.add("hNumberOfEvents", "Number of events", HistType::kTH1I, {{1, 0, 1}}); registryData.add("hNumberOfJets", "Total number of jets", HistType::kTH1I, {{1, 0, 1}}); @@ -190,6 +211,8 @@ struct AngularCorrelationsInJets { registryQA.add("hPtJetAntiprotonVsTotalJet", "Antiproton p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); registryQA.add("hPtJetNucleiVsTotalJet", "Nuclei p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); registryQA.add("hPtJetAntinucleiVsTotalJet", "Antinuclei p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); + registryQA.add("hPtJetPionVsTotalJet", "Pion p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); + registryQA.add("hPtJetKaonVsTotalJet", "Kaon p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); // nSigma registryData.add("hTPCsignal", "TPC signal", HistType::kTH2F, {{1000, -100, 100, "#it{p} [GeV/#it{c}]"}, {1000, 0, 5000, "d#it{E}/d#it{X} (a.u.)"}}); @@ -206,10 +229,10 @@ struct AngularCorrelationsInJets { registryData.add("hTOFnsigmaProtonCF", "TOF n#sigma for proton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); registryData.add("hTPCnsigmaAntiprotonCF", "TPC n#sigma for antiproton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); registryData.add("hTOFnsigmaAntiprotonCF", "TOF n#sigma for antiproton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("hTPCnsigmaNucleiCF", "TPC n#sigma for nuclei CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("hTOFnsigmaNucleiCF", "TOF n#sigma for nuclei CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("hTPCnsigmaAntinucleiCF", "TPC n#sigma for antinuclei CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("hTOFnsigmaAntinucleiCF", "TOF n#sigma for antinuclei CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("hTPCnsigmaPion", "TPC n#sigma for pion", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("hTOFnsigmaPion", "TOF n#sigma for pion", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("hTPCnsigmaKaon", "TPC n#sigma for kaon", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("hTOFnsigmaKaon", "TOF n#sigma for kaon", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); // DCA registryData.add("hDCAxyFullJet", "DCA_{xy} of full jet", HistType::kTH2F, {axisSpecs.ptAxisFull, axisSpecs.dcaxyAxis}); @@ -218,6 +241,8 @@ struct AngularCorrelationsInJets { registryData.add("hDCAzJetAntiproton", "DCA_{z} of high purity antiprotons", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); registryData.add("hDCAzJetNuclei", "DCA_{z} of high purity nuclei", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); registryData.add("hDCAzJetAntinuclei", "DCA_{z} of high purity antinuclei", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); + registryData.add("hDCAzJetPion", "DCA_{z} of high purity pions", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); + registryData.add("hDCAzJetKaon", "DCA_{z} of high purity kaons", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); // Angular Distributions registryQA.add("hPhiFullEvent", "#varphi in full event", HistType::kTH1F, {{1000, 0, 6.3}}); @@ -229,30 +254,31 @@ struct AngularCorrelationsInJets { registryQA.add("hEtaJet", "#eta in jet", HistType::kTH1F, {{1000, -1, 1}}); registryQA.add("hEtaPtJet", "#eta vs. p_{T} in jet", HistType::kTH2F, {axisSpecs.ptAxisPos, {1000, -1, 1}}); - registryData.add("hDeltaPhiSEFull", "#Delta#varphi of particles in single event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("hDeltaPhiSEJet", "#Delta#varphi of jet particles in single event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("hDeltaPhiSEProton", "#Delta#varphi of protons in single event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("hDeltaPhiSEAntiproton", "#Delta#varphi of antiprotons in single event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("hDeltaPhiSENuclei", "#Delta#varphi of nuclei in single event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("hDeltaPhiSEAntinuclei", "#Delta#varphi of antinuclei in single event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("hDeltaPhiSEFull", "#Delta#varphi of particles in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("hDeltaPhiSEJet", "#Delta#varphi of jet particles in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("hDeltaPhiSEProton", "#Delta#varphi of protons in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("hDeltaPhiSEAntiproton", "#Delta#varphi of antiprotons in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); registryData.add("hDeltaPhiMEFull", "#Delta#varphi of particles in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); registryData.add("hDeltaPhiMEJet", "#Delta#varphi of jet particles in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); registryData.add("hDeltaPhiMEProton", "#Delta#varphi of protons in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); registryData.add("hDeltaPhiMEAntiproton", "#Delta#varphi of antiprotons in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("hDeltaPhiMENuclei", "#Delta#varphi of nuclei in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("hDeltaPhiMEAntinuclei", "#Delta#varphi of antinuclei in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("hDeltaPhiEtaSEFull", "#Delta#varphi vs #Delta#eta of full particles in single event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("hDeltaPhiEtaSEJet", "#Delta#varphi vs #Delta#eta of jet particles in single event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("hDeltaPhiEtaSEProton", "#Delta#varphi vs #Delta#eta of protons in single event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("hDeltaPhiEtaSEAntiproton", "#Delta#varphi vs #Delta#eta of antiprotons in single event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("hDeltaPhiEtaSENuclei", "#Delta#varphi vs #Delta#eta of nuclei in single event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("hDeltaPhiEtaSEAntinuclei", "#Delta#varphi vs #Delta#eta of antinuclei in single event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("hDeltaPhiEtaSEFull", "#Delta#varphi vs #Delta#eta of full particles in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("hDeltaPhiEtaSEJet", "#Delta#varphi vs #Delta#eta of jet particles in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("hDeltaPhiEtaSEProton", "#Delta#varphi vs #Delta#eta of protons in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("hDeltaPhiEtaSEAntiproton", "#Delta#varphi vs #Delta#eta of antiprotons in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); registryData.add("hDeltaPhiEtaMEFull", "#Delta#varphi vs #Delta#eta of particles in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); registryData.add("hDeltaPhiEtaMEJet", "#Delta#varphi vs #Delta#eta of jet particles in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); registryData.add("hDeltaPhiEtaMEProton", "#Delta#varphi vs #Delta#eta of protons in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); registryData.add("hDeltaPhiEtaMEAntiproton", "#Delta#varphi vs #Delta#eta of antiprotons in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("hDeltaPhiEtaMENuclei", "#Delta#varphi vs #Delta#eta of nuclei in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("hDeltaPhiEtaMEAntinuclei", "#Delta#varphi vs #Delta#eta of antinuclei in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + + registryData.add("hDeltaPhiSEProtonAntiproton", "#Delta#varphi of proton-antiproton in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("hDeltaPhiMEProtonAntiproton", "#Delta#varphi of proton-antiproton in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("hDeltaPhiEtaSEProtonAntiproton", "#Delta#varphi vs #Delta#eta of proton-antiproton in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("hDeltaPhiEtaMEProtonAntiproton", "#Delta#varphi vs #Delta#eta of proton-antiproton in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("hDeltaPhiSEPion", "#Delta#varphi of pions in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("hDeltaPhiMEPion", "#Delta#varphi of pions in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("hDeltaPhiEtaSEPion", "#Delta#varphi vs #Delta#eta of pions in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("hDeltaPhiEtaMEPion", "#Delta#varphi vs #Delta#eta of pions in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); // QA registryQA.add("hPtDiff", "p_{T} difference PseudoJet/original track;#it{p}_{T} [GeV/#it{c}]", HistType::kTH1D, {{100, -5, 5}}); @@ -301,8 +327,8 @@ struct AngularCorrelationsInJets { std::vector> fBufferProton; std::vector> fBufferAntiproton; - std::vector> fBufferNuclei; - std::vector> fBufferAntinuclei; + std::vector> fBufferPiPlus; + std::vector> fBufferPiMinus; std::vector> fBufferJet; std::vector> fBufferFull; @@ -335,32 +361,11 @@ struct AngularCorrelationsInJets { } template - bool singleSpeciesTPCNSigma(T const& track, int species) // make cut configurable + bool singleSpeciesTPCNSigma(T const& track) // make cut configurable { // reject any track that has nsigma < 3 for more than 1 species - if (track.tpcNSigmaStoreEl() < nsigmaRejection || track.tpcNSigmaStoreMu() < nsigmaRejection || track.tpcNSigmaStorePi() < nsigmaRejection || track.tpcNSigmaStoreKa() < nsigmaRejection || track.tpcNSigmaStoreTr() < nsigmaRejection || track.tpcNSigmaStoreAl() < nsigmaRejection) + if (useRejectionCut && (track.tpcNSigmaStoreEl() < nsigmaRejection || track.tpcNSigmaStoreMu() < nsigmaRejection || track.tpcNSigmaStorePi() < nsigmaRejection || track.tpcNSigmaStoreKa() < nsigmaRejection || track.tpcNSigmaStoreTr() < nsigmaRejection || track.tpcNSigmaStoreAl() < nsigmaRejection || track.tpcNSigmaDe() < nsigmaRejection || track.tpcNSigmaHe() < nsigmaRejection)) return false; - switch (species) { // guard against nsigmaRejection being lower than nsigma cuts that are applied before this function - case 1: // proton - return (track.tpcNSigmaPr() < protonNsigma && track.tpcNSigmaDe() > nsigmaRejection && track.tpcNSigmaHe() > nsigmaRejection); - break; - case 2: // antiproton - return (track.tpcNSigmaPr() < antiprotonNsigma && track.tpcNSigmaDe() > nsigmaRejection && track.tpcNSigmaHe() > nsigmaRejection); - break; - case 3: // deuteron - return (track.tpcNSigmaDe() < nucleiNsigma && track.tpcNSigmaPr() > nsigmaRejection && track.tpcNSigmaHe() > nsigmaRejection); - break; - case 4: // antideuteron - return (track.tpcNSigmaDe() < antinucleiNsigma && track.tpcNSigmaPr() > nsigmaRejection && track.tpcNSigmaHe() > nsigmaRejection); - break; - case 5: // helium-3 - return (track.tpcNSigmaHe() < nucleiNsigma && track.tpcNSigmaDe() > nsigmaRejection && track.tpcNSigmaPr() > nsigmaRejection); - break; - case 6: // antihelium-3 - return (track.tpcNSigmaHe() < antinucleiNsigma && track.tpcNSigmaDe() > nsigmaRejection && track.tpcNSigmaPr() > nsigmaRejection); - break; - default: - return false; - } + return true; } template @@ -381,11 +386,12 @@ struct AngularCorrelationsInJets { registryData.fill(HIST("hTOFnsigmaProtonCF"), track.pt(), track.tofNSigmaPr()); // nsigma - double tofNsigma = track.hasTOF() ? track.tofNSigmaPr() : 999; - if ((track.pt() < protonTPCTOFpT && (TMath::Abs(track.tpcNSigmaPr()) > protonNsigma)) || (track.pt() > protonTPCTOFpT && (TMath::Sqrt(track.tpcNSigmaPr() * track.tpcNSigmaPr() + tofNsigma * tofNsigma) > protonNsigma))) - if (TMath::Sqrt(track.tpcNSigmaPr() * track.tpcNSigmaPr() + tofNsigma * tofNsigma) > protonNsigma) - return false; - if (!singleSpeciesTPCNSigma(track, 1)) + if (!track.hasTOF()) + return false; + if ((track.pt() < protonTPCTOFpT && (TMath::Abs(track.tpcNSigmaPr()) > protonNsigma)) || + (track.pt() > protonTPCTOFpT && (TMath::Sqrt(track.tpcNSigmaPr() * track.tpcNSigmaPr() + track.tofNSigmaPr() * track.tofNSigmaPr()) > protonNsigma))) + return false; + if (useRejectionCut && !singleSpeciesTPCNSigma(track)) return false; } else { // for yields // DCA @@ -431,10 +437,12 @@ struct AngularCorrelationsInJets { registryData.fill(HIST("hTOFnsigmaAntiprotonCF"), track.pt(), track.tofNSigmaPr()); // nsigma - double tofNsigma = track.hasTOF() ? track.tofNSigmaPr() : 999; - if ((track.pt() < antiprotonTPCTOFpT && (TMath::Abs(track.tpcNSigmaPr()) > antiprotonNsigma)) || (track.pt() > antiprotonTPCTOFpT && (TMath::Sqrt(track.tpcNSigmaPr() * track.tpcNSigmaPr() + tofNsigma * tofNsigma) > antiprotonNsigma))) + if (!track.hasTOF()) return false; - if (!singleSpeciesTPCNSigma(track, 2)) + if ((track.pt() < antiprotonTPCTOFpT && (TMath::Abs(track.tpcNSigmaPr()) > antiprotonNsigma)) || + (track.pt() > antiprotonTPCTOFpT && (TMath::Sqrt(track.tpcNSigmaPr() * track.tpcNSigmaPr() + track.tofNSigmaPr() * track.tofNSigmaPr()) > antiprotonNsigma))) + return false; + if (useRejectionCut && !singleSpeciesTPCNSigma(track)) return false; } else { // for yields // DCA @@ -463,89 +471,51 @@ struct AngularCorrelationsInJets { } template - bool isNucleus(const T& track, bool tightCuts) + bool isNucleus(const T& track) { if (track.sign() < 0) return false; if (deuteronAnalysis) { - if (tightCuts) { // for correlation function - // DCA - if (TMath::Abs(track.dcaXY()) > nucleiDCAxyCF) - return false; - if (TMath::Abs(track.dcaZ()) > nucleiDCAzCF) - return false; + // DCA + if (TMath::Abs(track.dcaXY()) > nucleiDCAxyYield) + return false; + if (TMath::Abs(track.dcaZ()) > nucleiDCAzYield) + return false; - registryData.fill(HIST("hTPCnsigmaNucleiCF"), track.pt(), track.tpcNSigmaDe()); - if (track.hasTOF()) - registryData.fill(HIST("hTOFnsigmaNucleiCF"), track.pt(), track.tofNSigmaDe()); + registryData.fill(HIST("hTPCnsigmaNuclei"), track.pt(), track.tpcNSigmaDe()); - // nsigma - double tofNsigma = track.hasTOF() ? track.tofNSigmaDe() : 999; - if ((track.pt() < nucleiTPCTOFpT && (TMath::Abs(track.tpcNSigmaDe()) > nucleiNsigma)) || (track.pt() > nucleiTPCTOFpT && (TMath::Sqrt(track.tpcNSigmaDe() * track.tpcNSigmaDe() + tofNsigma * tofNsigma) > nucleiNsigma))) - return false; - if (!singleSpeciesTPCNSigma(track, 3)) - return false; - } else { // for yields - // DCA - if (TMath::Abs(track.dcaXY()) > nucleiDCAxyYield) - return false; - if (TMath::Abs(track.dcaZ()) > nucleiDCAzYield) - return false; - - registryData.fill(HIST("hTPCnsigmaNuclei"), track.pt(), track.tpcNSigmaDe()); + // TPC + if (track.pt() < nucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaDe()) > nucleiTPCnsigmaLowPtYield) + return false; + if (track.pt() > nucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaDe()) > nucleiTPCnsigmaHighPtYield) + return false; - // TPC - if (track.pt() < nucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaDe()) > nucleiTPCnsigmaLowPtYield) - return false; - if (track.pt() > nucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaDe()) > nucleiTPCnsigmaHighPtYield) + // TOF + if (track.hasTOF()) { + registryData.fill(HIST("hTOFnsigmaNuclei"), track.pt(), track.tofNSigmaDe()); + if (track.pt() > nucleiTPCTOFpT && TMath::Abs(track.tofNSigmaDe()) > nucleiTOFnsigmaHighPtYield) return false; - - // TOF - if (track.hasTOF()) { - registryData.fill(HIST("hTOFnsigmaNuclei"), track.pt(), track.tofNSigmaDe()); - if (track.pt() > nucleiTPCTOFpT && TMath::Abs(track.tofNSigmaDe()) > nucleiTOFnsigmaHighPtYield) - return false; - } } } else { - if (tightCuts) { // for correlation function - including for helium just in case, but realistically, angular correlations won't be a thing here - // DCA - if (TMath::Abs(track.dcaXY()) > nucleiDCAxyCF) - return false; - if (TMath::Abs(track.dcaZ()) > nucleiDCAzCF) - return false; - - registryData.fill(HIST("hTPCnsigmaNucleiCF"), track.pt(), track.tpcNSigmaHe()); - if (track.hasTOF()) - registryData.fill(HIST("hTOFnsigmaNucleiCF"), track.pt(), track.tofNSigmaHe()); + // DCA + if (TMath::Abs(track.dcaXY()) > nucleiDCAxyYield) + return false; + if (TMath::Abs(track.dcaZ()) > nucleiDCAzYield) + return false; - // nsigma - double tofNsigma = track.hasTOF() ? track.tofNSigmaHe() : 999; - if ((track.pt() < nucleiTPCTOFpT && (TMath::Abs(track.tpcNSigmaHe()) > nucleiNsigma)) || (track.pt() > nucleiTPCTOFpT && (TMath::Sqrt(track.tpcNSigmaHe() * track.tpcNSigmaHe() + tofNsigma * tofNsigma) > nucleiNsigma))) - return false; - if (!singleSpeciesTPCNSigma(track, 5)) - return false; - } else { // for yields - // DCA - if (TMath::Abs(track.dcaXY()) > nucleiDCAxyYield) - return false; - if (TMath::Abs(track.dcaZ()) > nucleiDCAzYield) - return false; + registryData.fill(HIST("hTPCnsigmaNuclei"), track.pt(), track.tpcNSigmaHe()); - registryData.fill(HIST("hTPCnsigmaNuclei"), track.pt(), track.tpcNSigmaHe()); + // TPC + if (track.pt() < nucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaHe()) > nucleiTPCnsigmaLowPtYield) + return false; + if (track.pt() > nucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaHe()) > nucleiTPCnsigmaHighPtYield) + return false; - // TPC - if (track.pt() < nucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaHe()) > nucleiTPCnsigmaLowPtYield) - return false; - if (track.pt() > nucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaHe()) > nucleiTPCnsigmaHighPtYield) + // TOF + if (track.hasTOF()) { + registryData.fill(HIST("hTOFnsigmaNuclei"), track.pt(), track.tofNSigmaHe()); + if (track.pt() > nucleiTPCTOFpT && TMath::Abs(track.tofNSigmaHe()) > nucleiTOFnsigmaHighPtYield) return false; - - // TOF - if (track.hasTOF()) { - registryData.fill(HIST("hTOFnsigmaNuclei"), track.pt(), track.tofNSigmaHe()); - if (track.pt() > nucleiTPCTOFpT && TMath::Abs(track.tofNSigmaHe()) > nucleiTOFnsigmaHighPtYield) - return false; - } } } @@ -553,91 +523,107 @@ struct AngularCorrelationsInJets { } template - bool isAntinucleus(const T& track, bool tightCuts) + bool isAntinucleus(const T& track) { if (track.sign() > 0) return false; if (deuteronAnalysis) { - if (tightCuts) { // for correlation function - // DCA - if (TMath::Abs(track.dcaXY()) > antinucleiDCAxyCF) - return false; - if (TMath::Abs(track.dcaZ()) > antinucleiDCAzCF) - return false; - - registryData.fill(HIST("hTPCnsigmaAntinucleiCF"), track.pt(), track.tpcNSigmaDe()); - if (track.hasTOF()) - registryData.fill(HIST("hTOFnsigmaAntinucleiCF"), track.pt(), track.tofNSigmaDe()); + // DCA + if (TMath::Abs(track.dcaXY()) > antinucleiDCAxyYield) + return false; + if (TMath::Abs(track.dcaZ()) > antinucleiDCAzYield) + return false; - // nsigma - double tofNsigma = track.hasTOF() ? track.tofNSigmaDe() : 999; - if ((track.pt() < antinucleiTPCTOFpT && (TMath::Abs(track.tpcNSigmaDe()) > antinucleiNsigma)) || (track.pt() > antinucleiTPCTOFpT && (TMath::Sqrt(track.tpcNSigmaDe() * track.tpcNSigmaDe() + tofNsigma * tofNsigma) > antinucleiNsigma))) - return false; - if (!singleSpeciesTPCNSigma(track, 4)) - return false; - } else { // for yields - // DCA - if (TMath::Abs(track.dcaXY()) > antinucleiDCAxyYield) - return false; - if (TMath::Abs(track.dcaZ()) > antinucleiDCAzYield) - return false; + registryData.fill(HIST("hTPCnsigmaAntinuclei"), track.pt(), track.tpcNSigmaDe()); - registryData.fill(HIST("hTPCnsigmaAntinuclei"), track.pt(), track.tpcNSigmaDe()); + // TPC + if (track.pt() < antinucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaDe()) > antinucleiTPCnsigmaLowPtYield) + return false; + if (track.pt() > antinucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaDe()) > antinucleiTPCnsigmaHighPtYield) + return false; - // TPC - if (track.pt() < antinucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaDe()) > antinucleiTPCnsigmaLowPtYield) - return false; - if (track.pt() > antinucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaDe()) > antinucleiTPCnsigmaHighPtYield) + // TOF + if (track.hasTOF()) { + registryData.fill(HIST("hTOFnsigmaAntinuclei"), track.pt(), track.tofNSigmaDe()); + if (track.pt() > antinucleiTPCTOFpT && TMath::Abs(track.tofNSigmaDe()) > antinucleiTOFnsigmaHighPtYield) return false; - - // TOF - if (track.hasTOF()) { - registryData.fill(HIST("hTOFnsigmaAntinuclei"), track.pt(), track.tofNSigmaDe()); - if (track.pt() > antinucleiTPCTOFpT && TMath::Abs(track.tofNSigmaDe()) > antinucleiTOFnsigmaHighPtYield) - return false; - } } } else { - if (tightCuts) { // for correlation function - including for antihelium just in case, but realistically, angular correlations won't be a thing here - // DCA - if (TMath::Abs(track.dcaXY()) > antinucleiDCAxyCF) - return false; - if (TMath::Abs(track.dcaZ()) > antinucleiDCAzCF) - return false; + // DCA + if (TMath::Abs(track.dcaXY()) > antinucleiDCAxyYield) + return false; + if (TMath::Abs(track.dcaZ()) > antinucleiDCAzYield) + return false; - registryData.fill(HIST("hTPCnsigmaAntinucleiCF"), track.pt(), track.tpcNSigmaHe()); - if (track.hasTOF()) - registryData.fill(HIST("hTOFnsigmaAntinucleiCF"), track.pt(), track.tofNSigmaHe()); + registryData.fill(HIST("hTPCnsigmaAntinuclei"), track.pt(), track.tpcNSigmaHe()); - // nsigma - double tofNsigma = track.hasTOF() ? track.tofNSigmaHe() : 999; - if ((track.pt() < antinucleiTPCTOFpT && (TMath::Abs(track.tpcNSigmaHe()) > antinucleiNsigma)) || (track.pt() > antinucleiTPCTOFpT && (TMath::Sqrt(track.tpcNSigmaHe() * track.tpcNSigmaHe() + tofNsigma * tofNsigma) > antinucleiNsigma))) - return false; - if (!singleSpeciesTPCNSigma(track, 6)) - return false; - } else { // for yields - // DCA - if (TMath::Abs(track.dcaXY()) > antinucleiDCAxyYield) - return false; - if (TMath::Abs(track.dcaZ()) > antinucleiDCAzYield) + // TPC + if (track.pt() < antinucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaHe()) > antinucleiTPCnsigmaLowPtYield) + return false; + if (track.pt() > antinucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaHe()) > antinucleiTPCnsigmaHighPtYield) + return false; + + // TOF + if (track.hasTOF()) { + registryData.fill(HIST("hTOFnsigmaAntinuclei"), track.pt(), track.tofNSigmaHe()); + if (track.pt() > antinucleiTPCTOFpT && TMath::Abs(track.tofNSigmaHe()) > antinucleiTOFnsigmaHighPtYield) return false; + } + } + + return true; + } - registryData.fill(HIST("hTPCnsigmaAntinuclei"), track.pt(), track.tpcNSigmaHe()); + template + bool isPion(const T& track) + { + // DCA + if (TMath::Abs(track.dcaXY()) > pionDCAxy) + return false; + if (TMath::Abs(track.dcaZ()) > pionDCAz) + return false; - // TPC - if (track.pt() < antinucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaHe()) > antinucleiTPCnsigmaLowPtYield) - return false; - if (track.pt() > antinucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaHe()) > antinucleiTPCnsigmaHighPtYield) - return false; + registryData.fill(HIST("hTPCnsigmaPion"), track.pt(), track.tpcNSigmaStorePi()); - // TOF - if (track.hasTOF()) { - registryData.fill(HIST("hTOFnsigmaAntinuclei"), track.pt(), track.tofNSigmaHe()); - if (track.pt() > antinucleiTPCTOFpT && TMath::Abs(track.tofNSigmaHe()) > antinucleiTOFnsigmaHighPtYield) - return false; - } - } + // TPC + if (track.pt() < pionTPCTOFpT && TMath::Abs(track.tpcNSigmaStorePi()) > pionTPCnsigmaLowPt) + return false; + if (track.pt() > pionTPCTOFpT && TMath::Abs(track.tpcNSigmaStorePi()) > pionTPCnsigmaHighPt) + return false; + + // TOF + if (track.hasTOF()) { + registryData.fill(HIST("hTOFnsigmaPion"), track.pt(), track.tofNSigmaStorePi()); + if (track.pt() > pionTPCTOFpT && TMath::Abs(track.tofNSigmaStorePi()) > pionTOFnsigma) + return false; + } + + return true; + } + + template + bool isKaon(const T& track) + { + // DCA + if (TMath::Abs(track.dcaXY()) > kaonDCAxy) + return false; + if (TMath::Abs(track.dcaZ()) > kaonDCAz) + return false; + + registryData.fill(HIST("hTPCnsigmaKaon"), track.pt(), track.tpcNSigmaStoreKa()); + + // TPC + if (track.pt() < kaonTPCTOFpT && TMath::Abs(track.tpcNSigmaStoreKa()) > kaonTPCnsigmaLowPt) + return false; + if (track.pt() > kaonTPCTOFpT && TMath::Abs(track.tpcNSigmaStoreKa()) > kaonTPCnsigmaHighPt) + return false; + + // TOF + if (track.hasTOF()) { + registryData.fill(HIST("hTOFnsigmaKaon"), track.pt(), track.tofNSigmaStoreKa()); + if (track.pt() > kaonTPCTOFpT && TMath::Abs(track.tofNSigmaStoreKa()) > kaonTOFnsigma) + return false; } return true; @@ -695,12 +681,12 @@ struct AngularCorrelationsInJets { registryData.fill(HIST("hDeltaPhiEtaMEAntiproton"), DeltaPhi, DeltaEta); break; case 3: - registryData.fill(HIST("hDeltaPhiMENuclei"), DeltaPhi); - registryData.fill(HIST("hDeltaPhiEtaMENuclei"), DeltaPhi, DeltaEta); + registryData.fill(HIST("hDeltaPhiMEPion"), DeltaPhi); + registryData.fill(HIST("hDeltaPhiEtaMEPion"), DeltaPhi, DeltaEta); break; case 4: - registryData.fill(HIST("hDeltaPhiMEAntinuclei"), DeltaPhi); - registryData.fill(HIST("hDeltaPhiEtaMEAntinuclei"), DeltaPhi, DeltaEta); + registryData.fill(HIST("hDeltaPhiMEProtonAntiproton"), DeltaPhi); + registryData.fill(HIST("hDeltaPhiEtaMEProtonAntiproton"), DeltaPhi, DeltaEta); break; } } // for (int i = 0; i < static_cast(buffer.size()); i++) @@ -728,7 +714,7 @@ struct AngularCorrelationsInJets { } double DeltaPhi = TVector2::Phi_0_2pi(particleVector.at(i).phi() - particleVector.at(j).phi()); - double DeltaEta = particleVector.at(i).eta() - particleVector[j].eta(); + double DeltaEta = particleVector.at(i).eta() - particleVector.at(j).eta(); if (DeltaPhi > (1.5 * TMath::Pi())) { DeltaPhi = DeltaPhi - 2 * TMath::Pi(); } @@ -750,12 +736,8 @@ struct AngularCorrelationsInJets { registryData.fill(HIST("hDeltaPhiEtaSEAntiproton"), DeltaPhi, DeltaEta); break; case 3: - registryData.fill(HIST("hDeltaPhiSENuclei"), DeltaPhi); - registryData.fill(HIST("hDeltaPhiEtaSENuclei"), DeltaPhi, DeltaEta); - break; - case 4: - registryData.fill(HIST("hDeltaPhiSEAntinuclei"), DeltaPhi); - registryData.fill(HIST("hDeltaPhiEtaSEAntinuclei"), DeltaPhi, DeltaEta); + registryData.fill(HIST("hDeltaPhiSEPion"), DeltaPhi); + registryData.fill(HIST("hDeltaPhiEtaSEPion"), DeltaPhi, DeltaEta); break; } } @@ -764,6 +746,41 @@ struct AngularCorrelationsInJets { } } + void doCorrelationsAnti(const auto& particleVector, const auto& particleVectorAnti, const auto& bufferAnti, auto& tempBuffer, const TVector3 jetAxis) + { + if (std::isnan(jetAxis.Phi())) + return; + for (int i = 0; i < static_cast(particleVector.size()); i++) { + if (std::isnan(particleVector.at(i).phi())) + continue; + double phiToAxis = TVector2::Phi_0_2pi(particleVector.at(i).phi() - jetAxis.Phi()); + double etaToAxis = particleVector.at(i).eta() - jetAxis.Eta(); + if (TMath::Abs(particleVector.at(i).phi()) > 2 * TMath::Pi()) { + registryData.fill(HIST("hTrackProtocol"), 14); + continue; + } + for (int j = 0; j < static_cast(particleVectorAnti.size()); j++) { + if (std::isnan(particleVectorAnti.at(j).phi())) + continue; + if (TMath::Abs(particleVectorAnti.at(j).phi()) > 2 * TMath::Pi()) { + registryData.fill(HIST("hTrackProtocol"), 15); + continue; + } + + double DeltaPhi = TVector2::Phi_0_2pi(particleVector.at(i).phi() - particleVectorAnti.at(j).phi()); + double DeltaEta = particleVector.at(i).eta() - particleVectorAnti.at(j).eta(); + if (DeltaPhi > (1.5 * TMath::Pi())) { + DeltaPhi = DeltaPhi - 2 * TMath::Pi(); + } + registryData.fill(HIST("hDeltaPhiSEProtonAntiproton"), DeltaPhi); + registryData.fill(HIST("hDeltaPhiEtaSEProtonAntiproton"), DeltaPhi, DeltaEta); + break; + } + fillMixedEventDeltas(particleVector.at(i), bufferAnti, 4, jetAxis); + tempBuffer.emplace_back(std::make_pair(phiToAxis, etaToAxis)); + } + } + double getDeltaPhi(double a1, double a2) { if (std::isnan(a1) || std::isnan(a2) || a1 == -999 || a2 == -999) @@ -830,7 +847,7 @@ struct AngularCorrelationsInJets { return; } - int analyseJet(int jetCounter, fastjet::PseudoJet jet, const auto& particles, auto& jetProtons, auto& jetAntiprotons, auto& jetNuclei, auto& jetAntinuclei, auto& jetAll, double rho, double rhoM, double rhoPerp, double rhoMPerp) + int analyseJet(int jetCounter, fastjet::PseudoJet jet, const auto& particles, auto& jetProtons, auto& jetAntiprotons, auto& jetPiPlus, auto& jetPiMinus, auto& jetAll, double rho, double rhoM, double rhoPerp, double rhoMPerp) { if (!jet.has_constituents()) return jetCounter; @@ -952,13 +969,13 @@ struct AngularCorrelationsInJets { std::vector> fTempBufferProton; std::vector> fTempBufferAntiproton; - std::vector> fTempBufferNuclei; - std::vector> fTempBufferAntinuclei; + std::vector> fTempBufferPiPlus; + std::vector> fTempBufferPiMinus; std::vector> fTempBufferJet; fTempBufferProton.clear(); + fTempBufferPiPlus.clear(); + fTempBufferPiMinus.clear(); fTempBufferAntiproton.clear(); - fTempBufferNuclei.clear(); - fTempBufferAntinuclei.clear(); fTempBufferJet.clear(); for (int i = 0; i < static_cast(constituents.size()); i++) { // analyse jet constituents - this is where the magic happens @@ -997,24 +1014,31 @@ struct AngularCorrelationsInJets { jetAntiprotons.emplace_back(jetParticle); registryData.fill(HIST("hDCAzJetAntiproton"), jetParticle.pt(), jetParticle.dcaZ()); } - } else if (isNucleus(jetParticle, false)) { // collect nuclei in jet + } else if (isNucleus(jetParticle)) { // collect nuclei in jet registryData.fill(HIST("hPtJetNuclei"), jetParticle.pt()); registryQA.fill(HIST("hPtJetNucleiVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); registryData.fill(HIST("hTrackProtocol"), 8); // # nuclei - if (isNucleus(jetParticle, true)) { - registryData.fill(HIST("hTrackProtocol"), 9); // # high purity nuclei - jetNuclei.emplace_back(jetParticle); - registryData.fill(HIST("hDCAzJetNuclei"), jetParticle.pt(), jetParticle.dcaZ()); - } - } else if (isAntinucleus(jetParticle, false)) { + registryData.fill(HIST("hDCAzJetNuclei"), jetParticle.pt(), jetParticle.dcaZ()); + } else if (isAntinucleus(jetParticle)) { registryData.fill(HIST("hPtJetAntinuclei"), jetParticle.pt()); registryQA.fill(HIST("hPtJetAntinucleiVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); registryData.fill(HIST("hTrackProtocol"), 10); // # antinuclei - if (isAntinucleus(jetParticle, true)) { - registryData.fill(HIST("hTrackProtocol"), 11); // # high purity antinuclei - jetAntinuclei.emplace_back(jetParticle); - registryData.fill(HIST("hDCAzJetAntinuclei"), jetParticle.pt(), jetParticle.dcaZ()); + registryData.fill(HIST("hDCAzJetAntinuclei"), jetParticle.pt(), jetParticle.dcaZ()); + } else if (isPion(jetParticle)) { + registryData.fill(HIST("hPtJetPion"), jetParticle.pt()); + registryQA.fill(HIST("hPtJetPionVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); + registryData.fill(HIST("hTrackProtocol"), 11); // # antinuclei + registryData.fill(HIST("hDCAzJetPion"), jetParticle.pt(), jetParticle.dcaZ()); + if (jetParticle.sign() > 0) { + jetPiPlus.emplace_back(jetParticle); + } else if (jetParticle.sign() < 0) { + jetPiMinus.emplace_back(jetParticle); } + } else if (isKaon(jetParticle)) { + registryData.fill(HIST("hPtJetKaon"), jetParticle.pt()); + registryQA.fill(HIST("hPtJetKaonVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); + registryData.fill(HIST("hTrackProtocol"), 12); // # antinuclei + registryData.fill(HIST("hDCAzJetKaon"), jetParticle.pt(), jetParticle.dcaZ()); } } // for (int i=0; i(constituents.size()); i++) @@ -1024,7 +1048,11 @@ struct AngularCorrelationsInJets { } jetCounter++; - if ((jetProtons.size() < 2) && (jetAntiprotons.size() < 2) && (jetNuclei.size() < 2) && (jetAntinuclei.size() < 2)) + if ((jetProtons.size() > 0) && (jetAntiprotons.size() > 0)) { + doCorrelationsAnti(jetProtons, jetAntiprotons, fBufferAntiproton, fTempBufferProton, pJet); + doCorrelationsAnti(jetAntiprotons, jetProtons, fBufferProton, fTempBufferAntiproton, pJet); // divide SE distributions by 2 in post + } + if ((jetProtons.size() < 2) && (jetAntiprotons.size() < 2)) return jetCounter; registryData.fill(HIST("hEventProtocol"), 6); @@ -1036,14 +1064,6 @@ struct AngularCorrelationsInJets { doCorrelations(jetAntiprotons, fBufferAntiproton, fTempBufferAntiproton, 2, pJet); setTrackBuffer(fTempBufferAntiproton, fBufferAntiproton); } - if (jetNuclei.size() > 1) { - doCorrelations(jetNuclei, fBufferNuclei, fTempBufferNuclei, 3, pJet); - setTrackBuffer(fTempBufferNuclei, fBufferNuclei); - } - if (jetAntinuclei.size() > 1) { - doCorrelations(jetAntinuclei, fBufferAntinuclei, fTempBufferAntinuclei, 4, pJet); - setTrackBuffer(fTempBufferAntinuclei, fBufferAntinuclei); - } return jetCounter; } @@ -1052,9 +1072,14 @@ struct AngularCorrelationsInJets { { std::vector jetProtons; std::vector jetAntiprotons; - std::vector jetNuclei; - std::vector jetAntinuclei; + std::vector jetPiPlus; + std::vector jetPiMinus; std::vector jetAll; + jetProtons.clear(); + jetAntiprotons.clear(); + jetPiPlus.clear(); + jetPiMinus.clear(); + jetAll.clear(); std::vector> fTempBufferFull; fTempBufferFull.clear(); std::vector jetInput; // input for jet finder @@ -1135,7 +1160,7 @@ struct AngularCorrelationsInJets { auto [rhoPerp, rhoMPerp] = bkgSub.estimateRhoPerpCone(jetInput, jets); for (const auto& jet : jets) { - jetCounter = analyseJet(jetCounter, jet, particles, jetProtons, jetAntiprotons, jetNuclei, jetAntinuclei, jetAll, rho, rhoM, rhoPerp, rhoMPerp); + jetCounter = analyseJet(jetCounter, jet, particles, jetProtons, jetAntiprotons, jetPiPlus, jetPiMinus, jetAll, rho, rhoM, rhoPerp, rhoMPerp); } registryData.fill(HIST("hNumJetsInEvent"), jetCounter); @@ -1149,9 +1174,14 @@ struct AngularCorrelationsInJets { { std::vector jetProtons; std::vector jetAntiprotons; - std::vector jetNuclei; - std::vector jetAntinuclei; + std::vector jetPiPlus; + std::vector jetPiMinus; std::vector jetAll; + jetProtons.clear(); + jetAntiprotons.clear(); + jetPiPlus.clear(); + jetPiMinus.clear(); + jetAll.clear(); std::vector> fTempBufferFull; fTempBufferFull.clear(); std::vector jetInput; // input for jet finder @@ -1232,7 +1262,7 @@ struct AngularCorrelationsInJets { auto [rhoPerp, rhoMPerp] = bkgSub.estimateRhoPerpCone(jetInput, jets); for (auto& jet : jets) { - jetCounter = analyseJet(jetCounter, jet, particles, jetProtons, jetAntiprotons, jetNuclei, jetAntinuclei, jetAll, rho, rhoM, rhoPerp, rhoMPerp); + jetCounter = analyseJet(jetCounter, jet, particles, jetProtons, jetAntiprotons, jetPiPlus, jetPiMinus, jetAll, rho, rhoM, rhoPerp, rhoMPerp); // MC Truth Particles fastjet::PseudoJet subtractedJetPerp(0., 0., 0., 0.); @@ -1299,7 +1329,7 @@ struct AngularCorrelationsInJets { fillHistograms(slicedTracks); } } - PROCESS_SWITCH(AngularCorrelationsInJets, processRun2, "process Run 2 data", true); + PROCESS_SWITCH(AngularCorrelationsInJets, processRun2, "process Run 2 data", false); void processRun3(soa::Join const& collisions, soa::Filtered const& tracks) @@ -1320,6 +1350,171 @@ struct AngularCorrelationsInJets { } PROCESS_SWITCH(AngularCorrelationsInJets, processRun3, "process Run 3 data", false); + // using JetTracksMCDwID = soa::Join; + void processRun3revised(soa::Filtered>::iterator const& collision, soa::Filtered> const& allJets, /* JTracksRun3 const& jtracks, soa::Join const&, */ soa::Filtered const&) // check how to use bkg sub jets --- table or recluster + bkg sub? + { + registryData.fill(HIST("hEventProtocol"), 0); + if (!jetderiveddatautilities::selectCollision(collision, eventSelection)) + return registryData.fill(HIST("hNumberOfEvents"), 0); + registryData.fill(HIST("hEventProtocol"), 1); + + int jetCounter = 0; + + for (const auto& jet : allJets) { // loop over jets in event + jetCounter++; + std::vector jetProtons; + std::vector jetAntiprotons; + std::vector jetPiPlus; + std::vector jetPiMinus; + std::vector jetAll; + std::vector> fTempBufferProton; + std::vector> fTempBufferAntiproton; + std::vector> fTempBufferPiPlus; + std::vector> fTempBufferPiMinus; + std::vector> fTempBufferJet; + jetProtons.clear(); + jetAntiprotons.clear(); + jetPiPlus.clear(); + jetPiMinus.clear(); + jetAll.clear(); + fTempBufferProton.clear(); + fTempBufferAntiproton.clear(); + fTempBufferPiPlus.clear(); + fTempBufferPiMinus.clear(); + fTempBufferJet.clear(); + TVector3 pJet(0., 0., 0.); + pJet.SetXYZ(jet.px(), jet.py(), jet.pz()); + + registryData.fill(HIST("hNumberOfJets"), 0); + registryData.fill(HIST("hPtTotalJet"), jet.pt()); + registryData.fill(HIST("hJetRapidity"), jet.eta()); + registryData.fill(HIST("hNumPartInJet"), jet.tracksIds().size()); + registryQA.fill(HIST("hJetPtVsNumPart"), jet.pt(), jet.tracksIds().size()); + registryQA.fill(HIST("hMaxRadiusVsPt"), jet.pt(), jet.r()); + + for (const auto& track : jet.template tracks_as()) { // slice on jets? + if (!selectTrack(track)) + continue; + + if (track.tpcNClsFindable() != 0) { + registryQA.fill(HIST("hRatioCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows() / track.tpcNClsFindable()); + } + registryQA.fill(HIST("hPtJetParticle"), track.pt()); + registryQA.fill(HIST("hCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows()); + registryQA.fill(HIST("hClusterITS"), track.pt(), track.itsNCls()); + registryQA.fill(HIST("hClusterTPC"), track.pt(), track.tpcNClsFound()); + registryQA.fill(HIST("hChi2ITS"), track.pt(), track.itsChi2NCl()); + registryQA.fill(HIST("hChi2TPC"), track.pt(), track.tpcChi2NCl()); + registryQA.fill(HIST("hDCAxyFullEvent"), track.pt(), track.dcaXY()); + registryQA.fill(HIST("hDCAzFullEvent"), track.pt(), track.dcaZ()); + registryQA.fill(HIST("hPhiJet"), track.phi()); + registryQA.fill(HIST("hPhiPtJet"), track.pt(), track.phi()); + registryQA.fill(HIST("hEtaJet"), track.eta()); + registryQA.fill(HIST("hEtaPtJet"), track.pt(), track.eta()); + + if (!std::isnan(track.phi()) && !std::isnan(jet.phi())) { // geometric jet cone + double DeltaPhi = TVector2::Phi_0_2pi(track.phi() - jet.phi()); + if (DeltaPhi > TMath::Pi()) + DeltaPhi = DeltaPhi - 2 * TMath::Pi(); + double DeltaEta = track.eta() - jet.eta(); + double Delta = TMath::Sqrt(DeltaPhi * DeltaPhi + DeltaEta * DeltaEta); + registryQA.fill(HIST("hJetConeRadius"), Delta); + } + + // analyse jet constituents - this is where the magic happens + registryData.fill(HIST("hTrackProtocol"), 3); + jetAll.emplace_back(track); + + registryData.fill(HIST("hDCAxyFullJet"), track.pt() * track.sign(), track.dcaXY()); + registryData.fill(HIST("hDCAzFullJet"), track.pt() * track.sign(), track.dcaZ()); + registryData.fill(HIST("hTPCsignal"), track.pt() * track.sign(), track.tpcSignal()); + if (track.hasTOF()) { + registryData.fill(HIST("hTOFsignal"), track.pt() * track.sign(), track.beta()); + } + // double ptDiff = pseudoParticle.pt() - track.pt(); + // registryQA.fill(HIST("hPtDiff"), ptDiff); + + if (isProton(track, false)) { // collect protons in jet + registryData.fill(HIST("hPtJetProton"), track.pt()); + registryQA.fill(HIST("hPtJetProtonVsTotalJet"), track.pt(), jet.pt()); + registryData.fill(HIST("hTrackProtocol"), 4); // # protons + if (isProton(track, true)) { + registryData.fill(HIST("hTrackProtocol"), 5); // # high purity protons + jetProtons.emplace_back(track); + registryData.fill(HIST("hDCAzJetProton"), track.pt(), track.dcaZ()); + } + } else if (isAntiproton(track, false)) { // collect antiprotons in jet + registryData.fill(HIST("hPtJetAntiproton"), track.pt()); + registryQA.fill(HIST("hPtJetAntiprotonVsTotalJet"), track.pt(), jet.pt()); + registryData.fill(HIST("hTrackProtocol"), 6); // # antiprotons + if (isAntiproton(track, true)) { + registryData.fill(HIST("hTrackProtocol"), 7); // # high purity antiprotons + jetAntiprotons.emplace_back(track); + registryData.fill(HIST("hDCAzJetAntiproton"), track.pt(), track.dcaZ()); + } + } else if (isNucleus(track)) { // collect nuclei in jet + registryData.fill(HIST("hPtJetNuclei"), track.pt()); + registryQA.fill(HIST("hPtJetNucleiVsTotalJet"), track.pt(), jet.pt()); + registryData.fill(HIST("hTrackProtocol"), 8); // # nuclei + registryData.fill(HIST("hDCAzJetNuclei"), track.pt(), track.dcaZ()); + } else if (isAntinucleus(track)) { + registryData.fill(HIST("hPtJetAntinuclei"), track.pt()); + registryQA.fill(HIST("hPtJetAntinucleiVsTotalJet"), track.pt(), jet.pt()); + registryData.fill(HIST("hTrackProtocol"), 10); // # antinuclei + registryData.fill(HIST("hDCAzJetAntinuclei"), track.pt(), track.dcaZ()); + } else if (isPion(track)) { + registryData.fill(HIST("hPtJetPion"), track.pt()); + registryQA.fill(HIST("hPtJetPionVsTotalJet"), track.pt(), jet.pt()); + registryData.fill(HIST("hTrackProtocol"), 11); // # antinuclei + registryData.fill(HIST("hDCAzJetPion"), track.pt(), track.dcaZ()); + if (track.sign() > 0) { + jetPiPlus.emplace_back(track); + } else if (track.sign() < 0) { + jetPiMinus.emplace_back(track); + } + } else if (isKaon(track)) { + registryData.fill(HIST("hPtJetKaon"), track.pt()); + registryQA.fill(HIST("hPtJetKaonVsTotalJet"), track.pt(), jet.pt()); + registryData.fill(HIST("hTrackProtocol"), 12); // # antinuclei + registryData.fill(HIST("hDCAzJetKaon"), track.pt(), track.dcaZ()); + } + } // for (const auto& jtrack : jtracks) + + if (jetAll.size() > 1) { // general correlation function + doCorrelations(jetAll, fBufferJet, fTempBufferJet, 0, pJet); + setTrackBuffer(fTempBufferJet, fBufferJet); + } + + if ((jetProtons.size() > 0) && (jetAntiprotons.size() > 0)) { + doCorrelationsAnti(jetProtons, jetAntiprotons, fBufferAntiproton, fTempBufferProton, pJet); + doCorrelationsAnti(jetAntiprotons, jetProtons, fBufferProton, fTempBufferAntiproton, pJet); // divide SE distributions by 2 in post + } + if ((jetProtons.size() < 2) && (jetAntiprotons.size() < 2) && jetPiPlus.size() < 2 && jetPiMinus.size() < 2) + continue; + registryData.fill(HIST("hEventProtocol"), 6); + + if (jetProtons.size() > 1) { + doCorrelations(jetProtons, fBufferProton, fTempBufferProton, 1, pJet); + setTrackBuffer(fTempBufferProton, fBufferProton); + } + if (jetAntiprotons.size() > 1) { + doCorrelations(jetAntiprotons, fBufferAntiproton, fTempBufferAntiproton, 2, pJet); + setTrackBuffer(fTempBufferAntiproton, fBufferAntiproton); + } + if (jetPiPlus.size() > 1) { + doCorrelations(jetPiPlus, fBufferPiPlus, fTempBufferPiPlus, 1, pJet); + setTrackBuffer(fTempBufferPiPlus, fBufferPiPlus); + } + if (jetPiMinus.size() > 1) { + doCorrelations(jetPiMinus, fBufferPiMinus, fTempBufferPiMinus, 1, pJet); + setTrackBuffer(fTempBufferPiMinus, fBufferPiMinus); + } + } // for (const auto& jet : allJets) + + registryData.fill(HIST("hNumJetsInEvent"), jetCounter); + } + PROCESS_SWITCH(AngularCorrelationsInJets, processRun3revised, "process Run 3 data w jet tables", true); + void processMCRun2(McCollisions const& collisions, soa::Filtered const& tracks, BCsWithRun2Info const&, aod::McParticles&, aod::McCollisions const&) { for (const auto& collision : collisions) { From ba69798ceac4cc0e84c91bab5719242c62ecfed8 Mon Sep 17 00:00:00 2001 From: Marta Urioni <78807256+murioni@users.noreply.github.com> Date: Sat, 8 Feb 2025 18:40:17 +0100 Subject: [PATCH 0110/1650] [PWGLF] k892analysis_PbPb.cxx -- bkg studies (#9835) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Resonances/k892analysis_PbPb.cxx | 725 ++++++++++--------- 1 file changed, 376 insertions(+), 349 deletions(-) diff --git a/PWGLF/Tasks/Resonances/k892analysis_PbPb.cxx b/PWGLF/Tasks/Resonances/k892analysis_PbPb.cxx index 71abc9c6161..4efc780c7a9 100644 --- a/PWGLF/Tasks/Resonances/k892analysis_PbPb.cxx +++ b/PWGLF/Tasks/Resonances/k892analysis_PbPb.cxx @@ -9,6 +9,8 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. // +/// +/// \brief K*0 spectra in Pb-Pb /// \author Marta Urioni #include @@ -22,7 +24,6 @@ #include #include #include -#include #include #include #include @@ -77,16 +78,23 @@ struct k892analysis_PbPb { // presel Configurable cfgCutCentrality{"cfgCutCentrality", 80.0f, "Accepted maximum Centrality"}; + Configurable cfgCutMaxOccupancy{"cfgCutMaxOccupancy", 2000.0f, "Accepted maximum Occupancy"}; + Configurable cfgApplyOccupancyCut{"cfgApplyOccupancyCut", false, "Apply maximum Occupancy"}; // Track selections Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; Configurable cfgTPCcluster{"cfgTPCcluster", 0, "Number of TPC cluster"}; Configurable cfgRatioTPCRowsOverFindableCls{"cfgRatioTPCRowsOverFindableCls", 0.0f, "TPC Crossed Rows to Findable Clusters"}; + Configurable cfgIsPhysicalPrimary{"cfgIsPhysicalPrimary", true, "Primary track selection in MC"}; // for MC bkg study + Configurable cfgPrimaryTrack{"cfgPrimaryTrack", true, "Primary track selection"}; // kGoldenChi2 | kDCAxy | kDCAz Configurable cfgGlobalWoDCATrack{"cfgGlobalWoDCATrack", true, "Global track selection without DCA"}; // kQualityTracks (kTrackType | kTPCNCls | kTPCCrossedRows | kTPCCrossedRowsOverNCls | kTPCChi2NDF | kTPCRefit | kITSNCls | kITSChi2NDF | kITSRefit | kITSHits) | kInAcceptanceTracks (kPtRange | kEtaRange) Configurable cfgGlobalTrack{"cfgGlobalTrack", false, "Global track selection"}; // kGoldenChi2 | kDCAxy | kDCAz Configurable cfgPVContributor{"cfgPVContributor", false, "PV contributor track selection"}; // PV Contriuibutor + Configurable cfgUseITSTPCrefit{"cfgUseITSTPCrefit", true, "Use ITS and TPC refit"}; + Configurable cfgITSChi2Ncl{"cfgITSChi2Ncl", 999.0, "ITS Chi2/NCl"}; + Configurable cfgTPCChi2Ncl{"cfgTPCChi2Ncl", 999.0, "TPC Chi2/NCl"}; Configurable cfgCutPT{"cfgCutPT", 0.2, "PT cut on daughter track"}; Configurable cfgCutEta{"cfgCutEta", 0.8, "Eta cut on daughter track"}; @@ -97,20 +105,22 @@ struct k892analysis_PbPb { Configurable cMaxTPCnSigmaPion{"cMaxTPCnSigmaPion", 3.0, "TPC nSigma cut for Pion"}; // TPC Configurable cMaxTOFnSigmaPion{"cMaxTOFnSigmaPion", 3.0, "TOF nSigma cut for Pion"}; // TOF Configurable cByPassTOF{"cByPassTOF", false, "By pass TOF PID selection"}; // By pass TOF PID selection + Configurable cTofBetaCut{"cTofBetaCut", false, "selection on TOF beta"}; - Configurable TofandTpcPID{"TOFandTPCPID", false, "apply both TOF and TPC PID"}; + Configurable tofAndTpcPID{"tofAndTpcPID", false, "apply both TOF and TPC PID"}; Configurable tpclowpt{"tpclowpt", true, "apply TPC at low pt"}; Configurable tofhighpt{"tofhighpt", false, "apply TOF at high pt"}; // rotational bkg Configurable cfgNoRotations{"cfgNoRotations", 3, "Number of rotations per pair for rotbkg"}; - Configurable rotational_cut{"rotational_cut", 10, "Cut value (Rotation angle pi - pi/cut and pi + pi/cut)"}; + Configurable rotationalCut{"rotationalCut", 10, "Cut value (Rotation angle pi - pi/cut and pi + pi/cut)"}; + Configurable cfgRotPi{"cfgRotPi", true, "rotate Pion"}; // event mixing Configurable cfgNoMixedEvents{"cfgNoMixedEvents", 5, "Number of mixed events per event"}; - ConfigurableAxis CfgVtxBins{"CfgVtxBins", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; - ConfigurableAxis CfgMultBins{"CfgMultBins", {VARIABLE_WIDTH, 0.0f, 1.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f}, "Mixing bins - z-vertex"}; + ConfigurableAxis cfgVtxBins{"cfgVtxBins", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; + ConfigurableAxis cfgMultBins{"cfgMultBins", {VARIABLE_WIDTH, 0.0f, 1.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f}, "Mixing bins - z-vertex"}; // cuts on mother Configurable cfgCutsOnMother{"cfgCutsOnMother", false, "Enamble additional cuts on mother"}; @@ -127,7 +137,6 @@ struct k892analysis_PbPb { Configurable additionalMEPlots{"additionalMEPlots", false, "Additional Mixed event plots"}; // MC - Configurable genacceptancecut{"genacceptancecut", false, "Acceptance cut on generated MC particles"}; Configurable avoidsplitrackMC{"avoidsplitrackMC", false, "avoid split track in MC"}; TRandom* rand = new TRandom(); @@ -140,10 +149,12 @@ struct k892analysis_PbPb { AxisSpec mcLabelAxis = {5, -0.5, 4.5, "MC Label"}; AxisSpec ptAxis = {binsPt, "#it{p}_{T} (GeV/#it{c})"}; AxisSpec ptAxisQA = {binsPtQA, "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec ptAxisMom = {binsPt, "Mom #it{p}_{T} (GeV/#it{c})"}; + AxisSpec ptAxisDau = {binsPtQA, "Dau #it{p}_{T} (GeV/#it{c})"}; AxisSpec invMassAxis = {cInvMassBins, cInvMassStart, cInvMassEnd, "Invariant Mass (GeV/#it{c}^2)"}; AxisSpec pidQAAxis = {cPIDBins, -cPIDQALimit, cPIDQALimit}; - if (doprocessSameEvent || doprocessSameEventRun2 || doprocessMixedEvent || doprocessMixedEventRun2 || doprocessMixedEventMC) { + if ((!doprocessMC && !doprocessMCRun2) || doprocessMixedEventMC || doprocessMixedEventMCRun2) { // event histograms histos.add("QAevent/hEvtCounterSameE", "Number of analyzed Same Events", HistType::kTH1F, {{1, 0.5, 1.5}}); histos.add("QAevent/hMultiplicityPercentSameE", "Multiplicity percentile of collision", HistType::kTH1F, {{120, 0.0f, 120.0f}}); @@ -170,7 +181,7 @@ struct k892analysis_PbPb { histos.add("k892invmassDSAnti", "Invariant mass of Anti-K(892)0 different sign", kTH1F, {invMassAxis}); histos.add("k892invmassLS", "Invariant mass of K(892)0 like sign", kTH1F, {invMassAxis}); histos.add("k892invmassLSAnti", "Invariant mass of Anti-K(892)0 like sign", kTH1F, {invMassAxis}); - if (doprocessMixedEvent || doprocessMixedEventRun2 || doprocessMixedEventMC) { + if (doprocessMixedEvent || doprocessMixedEventRun2 || doprocessMixedEventMC || doprocessMixedEventMCRun2) { histos.add("k892invmassME", "Invariant mass of K(892)0 mixed event", kTH1F, {invMassAxis}); if (additionalMEPlots) { histos.add("k892invmassME_DS", "Invariant mass of K(892)0 mixed event DS", kTH1F, {invMassAxis}); @@ -180,10 +191,24 @@ struct k892analysis_PbPb { if (additionalQAplots) { // TPC ncluster distirbutions - histos.add("TPCncluster/TPCnclusterpi", "TPC ncluster distribution", kTH1F, {{160, 0, 160, "TPC nCluster"}}); - histos.add("TPCncluster/TPCnclusterka", "TPC ncluster distribution", kTH1F, {{160, 0, 160, "TPC nCluster"}}); - histos.add("TPCncluster/TPCnclusterPhipi", "TPC ncluster vs phi", kTH2F, {{160, 0, 160, "TPC nCluster"}, {63, 0, 6.28, "#phi"}}); - histos.add("TPCncluster/TPCnclusterPhika", "TPC ncluster vs phi", kTH2F, {{160, 0, 160, "TPC nCluster"}, {63, 0, 6.28, "#phi"}}); + histos.add("Ncluster/TPCnclusterpi", "TPC ncluster distribution", kTH1F, {{160, 0, 160, "TPC nCluster"}}); + histos.add("Ncluster/TPCnclusterka", "TPC ncluster distribution", kTH1F, {{160, 0, 160, "TPC nCluster"}}); + histos.add("Ncluster/TPCnclusterPhipi", "TPC ncluster vs phi", kTH2F, {{160, 0, 160, "TPC nCluster"}, {63, 0, 6.28, "#phi"}}); + histos.add("Ncluster/TPCnclusterPhika", "TPC ncluster vs phi", kTH2F, {{160, 0, 160, "TPC nCluster"}, {63, 0, 6.28, "#phi"}}); + + histos.add("Ncluster/TPCChi2ncluster", "TPC Chi2ncluster distribution", kTH1F, {{100, 0, 10, "TPC Chi2nCluster"}}); + histos.add("Ncluster/ITSChi2ncluster", "ITS Chi2ncluster distribution", kTH1F, {{100, 0, 40, "ITS Chi2nCluster"}}); + histos.add("Ncluster/ITSncluster", "ITS ncluster distribution", kTH1F, {{10, 0, 10, "ITS nCluster"}}); + + histos.add("QA/h2k892ptMothervsptPiDS", "Pt of K(892)0 differnt sign vs pt pion daughter", kTH2F, {ptAxisMom, ptAxisDau}); + histos.add("QA/h2k892ptMothervsptPiDSAnti", "Pt of Anti-K(892)0 differnt sign vs pt pion daughter", kTH2F, {ptAxisMom, ptAxisDau}); + histos.add("QA/h2k892ptMothervsptKaDS", "Pt of K(892)0 differnt sign vs pt kaon daughter", kTH2F, {ptAxisMom, ptAxisDau}); + histos.add("QA/h2k892ptMothervsptKaDSAnti", "Pt of Anti-K(892)0 differnt sign vs pt kaon daughter", kTH2F, {ptAxisMom, ptAxisDau}); + + histos.add("QAME/h2k892ptMothervsptPiDS", "Pt of Mother vs pt pion daughter, Mixed Event", kTH2F, {ptAxisMom, ptAxisDau}); + histos.add("QAME/h2k892ptMothervsptPiDSAnti", "Pt of Anti-Mother vs pt pion daughter, Mixed Event", kTH2F, {ptAxisMom, ptAxisDau}); + histos.add("QAME/h2k892ptMothervsptKaDS", "Pt of Mother vs pt kaon daughter, Mixed Event", kTH2F, {ptAxisMom, ptAxisDau}); + histos.add("QAME/h2k892ptMothervsptKaDSAnti", "Pt of Anti-Mother vs pt pion daughter, Mixed Event", kTH2F, {ptAxisMom, ptAxisDau}); } // DCA QA @@ -208,7 +233,7 @@ struct k892analysis_PbPb { histos.add("h3k892invmassLS", "Invariant mass of K(892)0 same sign", kTH3F, {centAxis, ptAxis, invMassAxis}); histos.add("h3k892invmassLSAnti", "Invariant mass of Anti-K(892)0 same sign", kTH3F, {centAxis, ptAxis, invMassAxis}); - if (doprocessRotationalBkg) { + if (doprocessRotationalBkg || doprocessRotationalBkgMC) { histos.add("k892invmassRotDS", "Invariant mass of K(892)0 RotBkg", kTH1F, {invMassAxis}); histos.add("k892invmassRotDSAnti", "Invariant mass of Anti-K(892)0 RotBkg", kTH1F, {invMassAxis}); @@ -216,7 +241,7 @@ struct k892analysis_PbPb { histos.add("h3k892invmassRotDSAnti", "Invariant mass of Anti-K(892)0 Rotational Bkg", kTH3F, {centAxis, ptAxis, invMassAxis}); } - if (doprocessMixedEvent || doprocessMixedEventRun2 || doprocessMixedEventMC) { + if (doprocessMixedEvent || doprocessMixedEventRun2 || doprocessMixedEventMC || doprocessMixedEventMCRun2) { histos.add("h3k892invmassME", "Invariant mass of K(892)0 mixed event", kTH3F, {centAxis, ptAxis, invMassAxis}); if (additionalMEPlots) { @@ -232,8 +257,15 @@ struct k892analysis_PbPb { } } + if (doprocessMixedEventMC || doprocessMixedEventMCRun2) { + histos.add("h3k892invmassWrongDaughtersME_DS", "Invariant mass ME with wrong daughters DS", kTH3F, {centAxis, ptAxis, invMassAxis}); + histos.add("h3k892invmassWrongDaughtersME_DSAnti", "Invariant mass ME with wrong daughters DS anti", kTH3F, {centAxis, ptAxis, invMassAxis}); + histos.add("h3k892invmassRightDaughtersME_DS", "Invariant mass ME with right daughters DS", kTH3F, {centAxis, ptAxis, invMassAxis}); + histos.add("h3k892invmassRightDaughtersME_DSAnti", "Invariant mass ME with right daughters DS anti", kTH3F, {centAxis, ptAxis, invMassAxis}); + } + if (doprocessMC || doprocessMCRun2) { - histos.add("hMCrecCollSels", "MC Event statistics", HistType::kTH1F, {{10, 0.0f, 10.0f}}); + histos.add("QAevent/hMCrecCollSels", "MC Event statistics", HistType::kTH1F, {{10, 0.0f, 10.0f}}); histos.add("QAevent/hMultiplicityPercentMC", "Multiplicity percentile of MCrec collision", HistType::kTH1F, {{120, 0.0f, 120.0f}}); histos.add("h1k892Recsplit", "k892 Rec split", HistType::kTH1F, {{200, 0.0f, 20.0f}}); @@ -258,7 +290,13 @@ struct k892analysis_PbPb { histos.add("k892RecAnti", "pT distribution of Reconstructed MC Anti-K(892)0", kTH2F, {ptAxis, centAxis}); histos.add("h3k892GenInvmass", "Invariant mass of generated K(892)0", kTH3F, {centAxis, ptAxis, invMassAxis}); histos.add("h3k892GenInvmassAnti", "Invariant mass of generated Anti-K(892)0", kTH3F, {centAxis, ptAxis, invMassAxis}); + + histos.add("h3k892invmassWrongDaughters_DS", "Invariant mass of K*0 with wrong daughters DS", kTH3F, {centAxis, ptAxis, invMassAxis}); + histos.add("h3k892invmassWrongDaughters_DSAnti", "Invariant mass of K*0 with wrong daughters DS anti", kTH3F, {centAxis, ptAxis, invMassAxis}); + histos.add("h3k892invmassRightDaughters_DS", "Invariant mass of K*0 with right daughters DS", kTH3F, {centAxis, ptAxis, invMassAxis}); + histos.add("h3k892invmassRightDaughters_DSAnti", "Invariant mass of K*0 with right daughters DS anti", kTH3F, {centAxis, ptAxis, invMassAxis}); } + // Print output histograms statistics LOG(info) << "Size of the histograms in spectraTOF"; histos.print(); @@ -267,14 +305,56 @@ struct k892analysis_PbPb { double massKa = o2::constants::physics::MassKPlus; double massPi = o2::constants::physics::MassPiPlus; + template + bool myEventSelections(const CollType& coll) + { + if (!coll.sel8()) + return false; + if (std::abs(coll.posZ()) > cfgCutVertex) + return false; + if (timFrameEvsel && (!coll.selection_bit(aod::evsel::kNoTimeFrameBorder) || !coll.selection_bit(aod::evsel::kNoITSROFrameBorder))) + return false; + if (additionalEvSel2 && (!coll.selection_bit(aod::evsel::kNoSameBunchPileup) || !coll.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) + return false; + if (additionalEvSel3 && (!coll.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard))) + return false; + auto centrality = coll.centFT0C(); + if (centrality > cfgCutCentrality) + return false; + auto occupancy = coll.trackOccupancyInTimeRange(); + if (cfgApplyOccupancyCut && (occupancy > cfgCutMaxOccupancy)) + return false; + + return true; + } + + template + bool myEventSelectionsRun2(const CollType& coll, const bcType&) + { + auto bc = coll.template bc_as(); + if (!(bc.eventCuts() & BIT(aod::Run2EventCuts::kAliEventCutsAccepted))) + return false; + if (std::abs(coll.posZ()) > cfgCutVertex) + return false; + auto centrality = coll.centRun2V0M(); + if (centrality > cfgCutCentrality) + return false; + + return true; + } + template - bool trackCut(const TrackType track) + bool trackCut(const TrackType& track) { // basic track cuts if (track.itsNCls() < cfgITScluster) return false; if (track.tpcNClsFound() < cfgTPCcluster) return false; + if (track.itsChi2NCl() > cfgITSChi2Ncl) + return false; + if (track.tpcChi2NCl() > cfgTPCChi2Ncl) + return false; if (track.tpcCrossedRowsOverFindableCls() < cfgRatioTPCRowsOverFindableCls) return false; if (cfgPVContributor && !track.isPVContributor()) @@ -285,6 +365,8 @@ struct k892analysis_PbPb { return false; if (cfgGlobalTrack && !track.isGlobalTrack()) return false; + if (cfgUseITSTPCrefit && (!(o2::aod::track::ITSrefit) || !(o2::aod::track::TPCrefit))) + return false; return true; } @@ -293,7 +375,7 @@ struct k892analysis_PbPb { bool selectionPIDKaon(const T& candidate) { - if (TofandTpcPID) { + if (tofAndTpcPID) { if (candidate.hasTOF() && std::abs(candidate.tofNSigmaKa()) <= cMaxTOFnSigmaKaon && candidate.hasTPC() && std::abs(candidate.tpcNSigmaKa()) <= cMaxTPCnSigmaKaon) { // tof and tpc cut return true; @@ -303,6 +385,9 @@ struct k892analysis_PbPb { if (candidate.hasTPC() && std::abs(candidate.tpcNSigmaKa()) <= cMaxTPCnSigmaKaon) { // tpc cut, tof when available + if (cTofBetaCut && candidate.hasTOF() && (candidate.beta() + 3 * candidate.betaerror() > 1)) + return false; + if (cByPassTOF) // skip tof selection return true; @@ -323,7 +408,7 @@ struct k892analysis_PbPb { bool selectionPIDPion(const T& candidate) { - if (TofandTpcPID) { + if (tofAndTpcPID) { if (candidate.hasTOF() && std::abs(candidate.tofNSigmaPi()) <= cMaxTOFnSigmaPion && candidate.hasTPC() && std::abs(candidate.tpcNSigmaPi()) <= cMaxTPCnSigmaPion) { // tof and tpc cut return true; @@ -333,6 +418,9 @@ struct k892analysis_PbPb { if (candidate.hasTPC() && std::abs(candidate.tpcNSigmaPi()) <= cMaxTPCnSigmaPion) { // tpc cut, tof when available + if (cTofBetaCut && candidate.hasTOF() && (candidate.beta() + 3 * candidate.betaerror() > 1)) + return false; + if (cByPassTOF) // skip tof selection return true; @@ -360,8 +448,8 @@ struct k892analysis_PbPb { multiplicity = collision.centRun2V0M(); auto oldindex = -999; - TLorentzVector lDecayDaughter1, lDecayDaughter2, lResonance, ldaughter_rot, lResonance_rot; - for (auto& [trk1, trk2] : combinations(CombinationsFullIndexPolicy(dTracks1, dTracks2))) { + TLorentzVector lDecayDaughter1, lDecayDaughter2, lResonance, ldaughterRot, lResonanceRot; + for (const auto& [trk1, trk2] : combinations(CombinationsFullIndexPolicy(dTracks1, dTracks2))) { // Full index policy is needed to consider all possible combinations if (trk1.index() == trk2.index()) continue; // We need to run (0,1), (1,0) pairs as well. but same id pairs are not needed. @@ -406,10 +494,13 @@ struct k892analysis_PbPb { if (additionalQAplots && !IsMix && !IsRot) { // TPCncluster distributions - histos.fill(HIST("TPCncluster/TPCnclusterpi"), trk1.tpcNClsFound()); - histos.fill(HIST("TPCncluster/TPCnclusterka"), trk2.tpcNClsFound()); - histos.fill(HIST("TPCncluster/TPCnclusterPhipi"), trk1.tpcNClsFound(), trk1.phi()); - histos.fill(HIST("TPCncluster/TPCnclusterPhika"), trk2.tpcNClsFound(), trk2.phi()); + histos.fill(HIST("Ncluster/TPCnclusterpi"), trk1.tpcNClsFound()); + histos.fill(HIST("Ncluster/TPCnclusterka"), trk2.tpcNClsFound()); + histos.fill(HIST("Ncluster/TPCnclusterPhipi"), trk1.tpcNClsFound(), trk1.phi()); + histos.fill(HIST("Ncluster/TPCnclusterPhika"), trk2.tpcNClsFound(), trk2.phi()); + histos.fill(HIST("Ncluster/TPCChi2ncluster"), trk1.tpcChi2NCl()); + histos.fill(HIST("Ncluster/ITSChi2ncluster"), trk1.itsChi2NCl()); + histos.fill(HIST("Ncluster/ITSncluster"), trk1.itsNCls()); } if constexpr (!IsMix && !IsRot) { @@ -455,7 +546,7 @@ struct k892analysis_PbPb { lDecayDaughter2.SetXYZM(trk2.px(), trk2.py(), trk2.pz(), massKa); lResonance = lDecayDaughter1 + lDecayDaughter2; // Rapidity cut - if (abs(lResonance.Rapidity()) >= 0.5) + if (std::abs(lResonance.Rapidity()) >= 0.5) continue; if (cfgCutsOnMother && !IsRot) { if (lResonance.Pt() >= cMaxPtMotherCut) // excluding candidates in overflow @@ -468,33 +559,48 @@ struct k892analysis_PbPb { if (track1Sign * track2Sign < 0) { if constexpr (IsRot) { // rotational background for (int i = 0; i < cfgNoRotations; i++) { - float theta2 = rand->Uniform(TMath::Pi() - TMath::Pi() / rotational_cut, TMath::Pi() + TMath::Pi() / rotational_cut); - ldaughter_rot.SetPtEtaPhiM(trk2.pt(), trk2.eta(), trk2.phi() + theta2, massKa); - lResonance_rot = lDecayDaughter1 + ldaughter_rot; + float theta = rand->Uniform(o2::constants::math::PI - o2::constants::math::PI / rotationalCut, o2::constants::math::PI + o2::constants::math::PI / rotationalCut); + if (cfgRotPi) { + ldaughterRot.SetPtEtaPhiM(trk1.pt(), trk1.eta(), trk1.phi() + theta, massPi); + lResonanceRot = lDecayDaughter2 + ldaughterRot; + } else { + ldaughterRot.SetPtEtaPhiM(trk2.pt(), trk2.eta(), trk2.phi() + theta, massKa); + lResonanceRot = lDecayDaughter1 + ldaughterRot; + } if (cfgCutsOnMother) { - if (lResonance_rot.Pt() >= cMaxPtMotherCut) // excluding candidates in overflow + if (lResonanceRot.Pt() >= cMaxPtMotherCut) // excluding candidates in overflow continue; - if (lResonance_rot.M() >= cMaxMinvMotherCut) // excluding candidates in overflow + if (lResonanceRot.M() >= cMaxMinvMotherCut) // excluding candidates in overflow continue; } if (track1Sign < 0) { - histos.fill(HIST("k892invmassRotDS"), lResonance_rot.M()); - histos.fill(HIST("h3k892invmassRotDS"), multiplicity, lResonance_rot.Pt(), lResonance_rot.M()); + histos.fill(HIST("k892invmassRotDS"), lResonanceRot.M()); + histos.fill(HIST("h3k892invmassRotDS"), multiplicity, lResonanceRot.Pt(), lResonanceRot.M()); } else if (track1Sign > 0) { histos.fill(HIST("k892invmassRotDSAnti"), lResonance.M()); - histos.fill(HIST("h3k892invmassRotDSAnti"), multiplicity, lResonance_rot.Pt(), lResonance_rot.M()); + histos.fill(HIST("h3k892invmassRotDSAnti"), multiplicity, lResonanceRot.Pt(), lResonanceRot.M()); } } + } else if constexpr (!IsMix) { // same event if (track1Sign < 0) { histos.fill(HIST("k892invmassDS"), lResonance.M()); histos.fill(HIST("h3k892invmassDS"), multiplicity, lResonance.Pt(), lResonance.M()); + if (additionalQAplots) { + histos.fill(HIST("QA/h2k892ptMothervsptPiDS"), lResonance.Pt(), lDecayDaughter1.Pt()); + histos.fill(HIST("QA/h2k892ptMothervsptKaDS"), lResonance.Pt(), lDecayDaughter2.Pt()); + } } else if (track1Sign > 0) { histos.fill(HIST("k892invmassDSAnti"), lResonance.M()); histos.fill(HIST("h3k892invmassDSAnti"), multiplicity, lResonance.Pt(), lResonance.M()); + if (additionalQAplots) { + histos.fill(HIST("QA/h2k892ptMothervsptPiDSAnti"), lResonance.Pt(), lDecayDaughter1.Pt()); + histos.fill(HIST("QA/h2k892ptMothervsptKaDSAnti"), lResonance.Pt(), lDecayDaughter2.Pt()); + } } + } else { // mixed event histos.fill(HIST("k892invmassME"), lResonance.M()); histos.fill(HIST("h3k892invmassME"), multiplicity, lResonance.Pt(), lResonance.M()); @@ -502,75 +608,114 @@ struct k892analysis_PbPb { if (track1Sign < 0) { histos.fill(HIST("k892invmassME_DS"), lResonance.M()); histos.fill(HIST("h3k892invmassME_DS"), multiplicity, lResonance.Pt(), lResonance.M()); + if (additionalQAplots) { + histos.fill(HIST("QAME/h2k892ptMothervsptPiDS"), lResonance.Pt(), lDecayDaughter1.Pt()); + histos.fill(HIST("QAME/h2k892ptMothervsptKaDS"), lResonance.Pt(), lDecayDaughter2.Pt()); + } } else if (track1Sign > 0) { histos.fill(HIST("k892invmassME_DSAnti"), lResonance.M()); histos.fill(HIST("h3k892invmassME_DSAnti"), multiplicity, lResonance.Pt(), lResonance.M()); + if (additionalQAplots) { + histos.fill(HIST("QAME/h2k892ptMothervsptPiDSAnti"), lResonance.Pt(), lDecayDaughter1.Pt()); + histos.fill(HIST("QAME/h2k892ptMothervsptKaDSAnti"), lResonance.Pt(), lDecayDaughter2.Pt()); + } } } } // MC - if constexpr (IsMC && !IsMix) { + if constexpr (IsMC && !IsRot) { if (!trk1.has_mcParticle() || !trk2.has_mcParticle()) continue; const auto mctrack1 = trk1.mcParticle(); const auto mctrack2 = trk2.mcParticle(); - int track1PDG = TMath::Abs(mctrack1.pdgCode()); - int track2PDG = TMath::Abs(mctrack2.pdgCode()); + int track1PDG = std::abs(mctrack1.pdgCode()); + int track2PDG = std::abs(mctrack2.pdgCode()); - if (!mctrack1.isPhysicalPrimary() || !mctrack2.isPhysicalPrimary()) + if (cfgIsPhysicalPrimary && (!mctrack1.isPhysicalPrimary() || !mctrack2.isPhysicalPrimary())) continue; - if (track1PDG != 211 || track2PDG != 321) - continue; + if (track1PDG != 211 || track2PDG != 321) { - bool ismotherok = false; - int pdgcodeMother = -999; - for (auto& mothertrack1 : mctrack1.template mothers_as()) { - for (auto& mothertrack2 : mctrack2.template mothers_as()) { - if (mothertrack1.pdgCode() != mothertrack2.pdgCode()) - continue; - if (mothertrack1.globalIndex() != mothertrack2.globalIndex()) - continue; - if (TMath::Abs(mothertrack1.pdgCode()) != 313) - continue; - if (avoidsplitrackMC && oldindex == mothertrack1.globalIndex()) { - histos.fill(HIST("h1k892Recsplit"), mothertrack1.pt()); - continue; - } - oldindex = mothertrack1.globalIndex(); - pdgcodeMother = mothertrack1.pdgCode(); - ismotherok = true; + if (track1Sign < 0) { + if constexpr (IsMix) + histos.fill(HIST("h3k892invmassWrongDaughtersME_DS"), multiplicity, lResonance.Pt(), lResonance.M()); + else + histos.fill(HIST("h3k892invmassWrongDaughters_DS"), multiplicity, lResonance.Pt(), lResonance.M()); + } else if (track1Sign > 0) { + if constexpr (IsMix) + histos.fill(HIST("h3k892invmassWrongDaughtersME_DSAnti"), multiplicity, lResonance.Pt(), lResonance.M()); + else + histos.fill(HIST("h3k892invmassWrongDaughters_DSAnti"), multiplicity, lResonance.Pt(), lResonance.M()); } - } - if (!ismotherok) continue; - - histos.fill(HIST("QAMCTrue/hGlobalIndexMotherRec"), oldindex); - // Track selection check. - histos.fill(HIST("QAMCTrue/TPC_Nsigma_pi_all"), multiplicity, trk1ptPi, trk1NSigmaPiTPC); - if (isTrk1hasTOF) { - histos.fill(HIST("QAMCTrue/TOF_Nsigma_pi_all"), multiplicity, trk1ptPi, trk1NSigmaPiTOF); } - histos.fill(HIST("QAMCTrue/TPC_Nsigmaka_all"), multiplicity, trk2ptKa, trk2NSigmaKaTPC); - if (isTrk2hasTOF) { - histos.fill(HIST("QAMCTrue/TOF_Nsigma_ka_all"), multiplicity, trk2ptKa, trk2NSigmaKaTOF); + + if (track1Sign < 0) { + if constexpr (IsMix) + histos.fill(HIST("h3k892invmassRightDaughtersME_DS"), multiplicity, lResonance.Pt(), lResonance.M()); + else + histos.fill(HIST("h3k892invmassRightDaughters_DS"), multiplicity, lResonance.Pt(), lResonance.M()); + } else if (track1Sign > 0) { + if constexpr (IsMix) + histos.fill(HIST("h3k892invmassRightDaughtersME_DSAnti"), multiplicity, lResonance.Pt(), lResonance.M()); + else + histos.fill(HIST("h3k892invmassRightDaughters_DSAnti"), multiplicity, lResonance.Pt(), lResonance.M()); } - // MC histograms - if (pdgcodeMother > 0) { - histos.fill(HIST("k892Rec"), lResonance.Pt(), multiplicity); - histos.fill(HIST("k892Recinvmass"), lResonance.M()); - histos.fill(HIST("h3Reck892invmass"), multiplicity, lResonance.Pt(), lResonance.M()); - } else { - histos.fill(HIST("k892RecAnti"), lResonance.Pt(), multiplicity); - histos.fill(HIST("k892RecinvmassAnti"), lResonance.M()); - histos.fill(HIST("h3Reck892invmassAnti"), multiplicity, lResonance.Pt(), lResonance.M()); + if constexpr (!IsMix) { + + bool ismotherok = false; + int pdgcodeMother = -999; + for (const auto& mothertrack1 : mctrack1.template mothers_as()) { + for (const auto& mothertrack2 : mctrack2.template mothers_as()) { + if (mothertrack1.pdgCode() != mothertrack2.pdgCode()) + continue; + if (mothertrack1.globalIndex() != mothertrack2.globalIndex()) + continue; + if (std::abs(mothertrack1.pdgCode()) != 313) + continue; + + if (avoidsplitrackMC && oldindex == mothertrack1.globalIndex()) { + histos.fill(HIST("h1k892Recsplit"), mothertrack1.pt()); + continue; + } + oldindex = mothertrack1.globalIndex(); + pdgcodeMother = mothertrack1.pdgCode(); + ismotherok = true; + } + } + + if (!ismotherok) + continue; + + histos.fill(HIST("QAMCTrue/hGlobalIndexMotherRec"), oldindex); + // Track selection check. + histos.fill(HIST("QAMCTrue/TPC_Nsigma_pi_all"), multiplicity, trk1ptPi, trk1NSigmaPiTPC); + if (isTrk1hasTOF) { + histos.fill(HIST("QAMCTrue/TOF_Nsigma_pi_all"), multiplicity, trk1ptPi, trk1NSigmaPiTOF); + } + histos.fill(HIST("QAMCTrue/TPC_Nsigmaka_all"), multiplicity, trk2ptKa, trk2NSigmaKaTPC); + if (isTrk2hasTOF) { + histos.fill(HIST("QAMCTrue/TOF_Nsigma_ka_all"), multiplicity, trk2ptKa, trk2NSigmaKaTOF); + } + + // MC histograms + if (pdgcodeMother > 0) { + histos.fill(HIST("k892Rec"), lResonance.Pt(), multiplicity); + histos.fill(HIST("k892Recinvmass"), lResonance.M()); + histos.fill(HIST("h3Reck892invmass"), multiplicity, lResonance.Pt(), lResonance.M()); + } else { + histos.fill(HIST("k892RecAnti"), lResonance.Pt(), multiplicity); + histos.fill(HIST("k892RecinvmassAnti"), lResonance.M()); + histos.fill(HIST("h3Reck892invmassAnti"), multiplicity, lResonance.Pt(), lResonance.M()); + } } - } + } // end of IsMC + } else if (track1Sign * track2Sign > 0) { if constexpr (!IsMix) { if (track1Sign < 0) { @@ -581,18 +726,32 @@ struct k892analysis_PbPb { histos.fill(HIST("h3k892invmassLSAnti"), multiplicity, lResonance.Pt(), lResonance.M()); } } - } // end on DS or LS if tenses - } // end of loop on tracks combinations - } // ennd on fill histograms + } // end on DS or LS if + } // end of loop on track combinations + } // end of fill histograms Filter collisionFilter = nabs(aod::collision::posZ) <= cfgCutVertex; Filter centralityFilter = nabs(aod::cent::centFT0C) <= cfgCutCentrality; Filter acceptanceFilter = (nabs(aod::track::eta) < cfgCutEta && nabs(aod::track::pt) >= cfgCutPT); - Filter DCAcutFilter = (nabs(aod::track::dcaXY) <= cfgCutDCAxy) && (nabs(aod::track::dcaZ) <= cfgCutDCAz); + Filter dcaCutFilter = (nabs(aod::track::dcaXY) <= cfgCutDCAxy) && (nabs(aod::track::dcaZ) <= cfgCutDCAz); + // Data using EventCandidates = soa::Filtered>; using TrackCandidates = soa::Filtered>; + aod::pidTPCFullKa, aod::pidTOFFullKa, aod::pidTPCFullPi, aod::pidTOFFullPi, aod::pidTOFbeta>>; + // MC + using EventCandidatesMCrec = soa::Join; + using TrackCandidatesMCrec = soa::Filtered>; + // ME run 3 + using BinningTypeVtxCent = ColumnBinningPolicy; + + // Data Run 2 + using Run2Events = soa::Join; //, aod::TrackletMults>; + using BCsWithRun2Info = soa::Join; + // MC Run2 + using EventCandidatesMCrecRun2 = soa::Join; // aod::TrackletMults>; + // ME run 2 + using BinningTypeVtxCentRun2 = ColumnBinningPolicy; // partitions tpc low pt Partition negPitpc = (aod::track::signed1Pt < static_cast(0)) && (nabs(aod::pidtpc::tpcNSigmaPi) <= cMaxTPCnSigmaPion) && (nabs(aod::track::pt) < cMaxPtTPC); @@ -608,192 +767,143 @@ struct k892analysis_PbPb { Partition posPitof = (aod::track::signed1Pt > static_cast(0)) && (nabs(aod::pidtof::tofNSigmaPi) <= cMaxTOFnSigmaPion) && (nabs(aod::pidtpc::tpcNSigmaPi) <= cMaxTPCnSigmaPion) && (nabs(aod::track::pt) > cMinPtTOF); Partition negKatof = (aod::track::signed1Pt < static_cast(0)) && (nabs(aod::pidtof::tofNSigmaKa) <= cMaxTOFnSigmaKaon) && (nabs(aod::pidtpc::tpcNSigmaKa) <= cMaxTPCnSigmaKaon) && (nabs(aod::track::pt) > cMinPtTOF); - void processSameEvent(EventCandidates::iterator const& collision, TrackCandidates const& tracks, aod::BCs const&) + template + void callFillHistoswithPartitions(const CollisionType& collision, const TracksType&) { - if (!collision.sel8()) { - return; - } - auto centrality = collision.centFT0C(); - if (timFrameEvsel && (!collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(aod::evsel::kNoITSROFrameBorder))) { - return; - } - if (additionalEvSel2 && (!collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { - return; - } - if (additionalEvSel3 && (!collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard))) { - return; - } - // int occupancy = collision.trackOccupancyInTimeRange(); - - histos.fill(HIST("QAevent/hEvtCounterSameE"), 1); - histos.fill(HIST("QAevent/hVertexZSameE"), collision.posZ()); - histos.fill(HIST("QAevent/hMultiplicityPercentSameE"), centrality); - - if (additionalQAeventPlots) { - histos.fill(HIST("TestME/hCollisionIndexSameE"), collision.globalIndex()); - histos.fill(HIST("TestME/hnTrksSameE"), tracks.size()); - } - if (tpclowpt) { //+- auto candPosPitpc = posPitpc->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); auto candNegKatpc = negKatpc->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - fillHistograms(collision, candPosPitpc, candNegKatpc); + fillHistograms(collision, candPosPitpc, candNegKatpc); //-+ auto candNegPitpc = negPitpc->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); auto candPosKatpc = posKatpc->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - fillHistograms(collision, candNegPitpc, candPosKatpc); + fillHistograms(collision, candNegPitpc, candPosKatpc); } else if (tofhighpt) { //+- auto candPosPitof = posPitof->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); auto candNegKatof = negKatof->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - fillHistograms(collision, candPosPitof, candNegKatof); + fillHistograms(collision, candPosPitof, candNegKatof); //-+ auto candNegPitof = negPitof->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); auto candPosKatof = posKatof->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - fillHistograms(collision, candNegPitof, candPosKatof); + fillHistograms(collision, candNegPitof, candPosKatof); } } - PROCESS_SWITCH(k892analysis_PbPb, processSameEvent, "Process Same event", true); - void processRotationalBkg(EventCandidates::iterator const& collision, TrackCandidates const&, aod::BCs const&) + template + void callFillHistoswithPartitionsMixedEvt(const CollisionType& collision1, const TracksType&, const CollisionType& collision2, const TracksType&) { - if (!collision.sel8()) { - return; - } - if (timFrameEvsel && (!collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(aod::evsel::kNoITSROFrameBorder))) { - return; - } - if (additionalEvSel2 && (!collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { - return; - } - if (additionalEvSel3 && (!collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard))) { - return; - } - // int occupancy = collision.trackOccupancyInTimeRange(); - if (tpclowpt) { //+- - auto candPosPitpc = posPitpc->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - auto candNegKatpc = negKatpc->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + auto candPosPitpc = posPitpc->sliceByCached(aod::track::collisionId, collision1.globalIndex(), cache); + auto candNegKatpc = negKatpc->sliceByCached(aod::track::collisionId, collision2.globalIndex(), cache); - fillHistograms(collision, candPosPitpc, candNegKatpc); + fillHistograms(collision1, candPosPitpc, candNegKatpc); //-+ - auto candNegPitpc = negPitpc->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - auto candPosKatpc = posKatpc->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + auto candNegPitpc = negPitpc->sliceByCached(aod::track::collisionId, collision1.globalIndex(), cache); + auto candPosKatpc = posKatpc->sliceByCached(aod::track::collisionId, collision2.globalIndex(), cache); - fillHistograms(collision, candNegPitpc, candPosKatpc); + fillHistograms(collision1, candNegPitpc, candPosKatpc); } else if (tofhighpt) { //+- - auto candPosPitof = posPitof->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - auto candNegKatof = negKatof->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + auto candPosPitof = posPitof->sliceByCached(aod::track::collisionId, collision1.globalIndex(), cache); + auto candNegKatof = negKatof->sliceByCached(aod::track::collisionId, collision2.globalIndex(), cache); - fillHistograms(collision, candPosPitof, candNegKatof); + fillHistograms(collision1, candPosPitof, candNegKatof); //-+ - auto candNegPitof = negPitof->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - auto candPosKatof = posKatof->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + auto candNegPitof = negPitof->sliceByCached(aod::track::collisionId, collision1.globalIndex(), cache); + auto candPosKatof = posKatof->sliceByCached(aod::track::collisionId, collision2.globalIndex(), cache); - fillHistograms(collision, candNegPitof, candPosKatof); + fillHistograms(collision1, candNegPitof, candPosKatof); } } - PROCESS_SWITCH(k892analysis_PbPb, processRotationalBkg, "Process Rotational Background", false); - - ///////*************************************** - using Run2Events = soa::Join; //, aod::TrackletMults>; - using BCsWithRun2Info = soa::Join; - - void processSameEventRun2(Run2Events::iterator const& collision, TrackCandidates const& tracks, BCsWithRun2Info const&) + void processSameEvent(EventCandidates::iterator const& collision, TrackCandidates const& tracks, aod::BCs const&) { - auto bc = collision.bc_as(); - // if (!collision.alias_bit(kINT7)) - // return; + if (!myEventSelections(collision)) + return; - // if (!collision.sel7()) - // return; + auto centrality = collision.centFT0C(); - if (!(bc.eventCuts() & BIT(aod::Run2EventCuts::kAliEventCutsAccepted))) - return; + histos.fill(HIST("QAevent/hEvtCounterSameE"), 1); + histos.fill(HIST("QAevent/hVertexZSameE"), collision.posZ()); + histos.fill(HIST("QAevent/hMultiplicityPercentSameE"), centrality); - if (std::abs(collision.posZ()) > cfgCutVertex) - return; + if (additionalQAeventPlots) { + histos.fill(HIST("TestME/hCollisionIndexSameE"), collision.globalIndex()); + histos.fill(HIST("TestME/hnTrksSameE"), tracks.size()); + } + // + callFillHistoswithPartitions(collision, tracks); + } + PROCESS_SWITCH(k892analysis_PbPb, processSameEvent, "Process Same event", true); - auto centrality = collision.centRun2V0M(); + void processSameEventRun2(Run2Events::iterator const& collision, TrackCandidates const& tracks, BCsWithRun2Info const& bcs) + { - if (centrality > cfgCutCentrality) + if (!myEventSelectionsRun2(collision, bcs)) return; histos.fill(HIST("QAevent/hEvtCounterSameE"), 1); histos.fill(HIST("QAevent/hVertexZSameE"), collision.posZ()); - histos.fill(HIST("QAevent/hMultiplicityPercentSameE"), centrality); + histos.fill(HIST("QAevent/hMultiplicityPercentSameE"), collision.centRun2V0M()); if (additionalQAeventPlots) { histos.fill(HIST("TestME/hCollisionIndexSameE"), collision.globalIndex()); histos.fill(HIST("TestME/hnTrksSameE"), tracks.size()); } - if (tpclowpt) { - //+- - auto candPosPitpc = posPitpc->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - auto candNegKatpc = negKatpc->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - - fillHistograms(collision, candPosPitpc, candNegKatpc); + // + callFillHistoswithPartitions(collision, tracks); + } + PROCESS_SWITCH(k892analysis_PbPb, processSameEventRun2, "Process Same event Run2", false); - //-+ - auto candNegPitpc = negPitpc->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - auto candPosKatpc = posKatpc->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + void processRotationalBkg(EventCandidates::iterator const& collision, TrackCandidates const& tracks, aod::BCs const&) + { - fillHistograms(collision, candNegPitpc, candPosKatpc); + if (!myEventSelections(collision)) + return; - } else if (tofhighpt) { - //+- - auto candPosPitof = posPitof->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - auto candNegKatof = negKatof->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + // + callFillHistoswithPartitions(collision, tracks); + } + PROCESS_SWITCH(k892analysis_PbPb, processRotationalBkg, "Process Rotational Background", false); - fillHistograms(collision, candPosPitof, candNegKatof); + void processRotationalBkgMC(EventCandidatesMCrec::iterator const& recCollision, TrackCandidatesMCrec const& RecTracks) + { - //-+ - auto candNegPitof = negPitof->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - auto candPosKatof = posKatof->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + if (!myEventSelections(recCollision)) + return; - fillHistograms(collision, candNegPitof, candPosKatof); - } + // + fillHistograms(recCollision, RecTracks, RecTracks); } - PROCESS_SWITCH(k892analysis_PbPb, processSameEventRun2, "Process Same event Run2", false); + PROCESS_SWITCH(k892analysis_PbPb, processRotationalBkgMC, "Process Rotational Background MC", false); - using BinningTypeVtxCent = ColumnBinningPolicy; void processMixedEvent(EventCandidates const& collisions, TrackCandidates const& tracks) { auto tracksTuple = std::make_tuple(tracks); - BinningTypeVtxCent colBinning{{CfgVtxBins, CfgMultBins}, true}; + BinningTypeVtxCent colBinning{{cfgVtxBins, cfgMultBins}, true}; SameKindPair pairs{colBinning, cfgNoMixedEvents, -1, collisions, tracksTuple, &cache}; - for (auto& [collision1, tracks1, collision2, tracks2] : pairs) { - if (!collision1.sel8() || !collision2.sel8()) { - continue; - } - auto centrality = collision1.centFT0C(); + for (const auto& [collision1, tracks1, collision2, tracks2] : pairs) { - if (timFrameEvsel && (!collision1.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision1.selection_bit(aod::evsel::kNoITSROFrameBorder) || !collision2.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision2.selection_bit(aod::evsel::kNoITSROFrameBorder))) { - continue; - } - if (additionalEvSel2 && (!collision1.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision1.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV) || !collision2.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision2.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { - continue; - } - if (additionalEvSel3 && (!collision1.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard) || !collision2.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard))) { + if (!myEventSelections(collision1) || !myEventSelections(collision2)) continue; - } + + auto centrality = collision1.centFT0C(); if (additionalQAeventPlots) { histos.fill(HIST("QAevent/hEvtCounterMixedE"), 1.0); @@ -803,129 +913,47 @@ struct k892analysis_PbPb { histos.fill(HIST("TestME/hnTrksMixedE"), tracks1.size()); } - if (tpclowpt) { - - //+- - auto candPosPitpc = posPitpc->sliceByCached(aod::track::collisionId, collision1.globalIndex(), cache); - auto candNegKatpc = negKatpc->sliceByCached(aod::track::collisionId, collision2.globalIndex(), cache); - - fillHistograms(collision1, candPosPitpc, candNegKatpc); - - //-+ - auto candNegPitpc = negPitpc->sliceByCached(aod::track::collisionId, collision1.globalIndex(), cache); - auto candPosKatpc = posKatpc->sliceByCached(aod::track::collisionId, collision2.globalIndex(), cache); - - fillHistograms(collision1, candNegPitpc, candPosKatpc); - - } else if (tofhighpt) { - - //+- - auto candPosPitof = posPitof->sliceByCached(aod::track::collisionId, collision1.globalIndex(), cache); - auto candNegKatof = negKatof->sliceByCached(aod::track::collisionId, collision2.globalIndex(), cache); - - fillHistograms(collision1, candPosPitof, candNegKatof); - - //-+ - auto candNegPitof = negPitof->sliceByCached(aod::track::collisionId, collision1.globalIndex(), cache); - auto candPosKatof = posKatof->sliceByCached(aod::track::collisionId, collision2.globalIndex(), cache); - - fillHistograms(collision1, candNegPitof, candPosKatof); - } + // + callFillHistoswithPartitionsMixedEvt(collision1, tracks1, collision2, tracks2); } } PROCESS_SWITCH(k892analysis_PbPb, processMixedEvent, "Process Mixed event", true); - using BinningTypeVtxCentRun2 = ColumnBinningPolicy; - void processMixedEventRun2(Run2Events const& collisions, TrackCandidates const& tracks, BCsWithRun2Info const&) + void processMixedEventRun2(Run2Events const& collisions, TrackCandidates const& tracks, BCsWithRun2Info const& bcs) { auto tracksTuple = std::make_tuple(tracks); - BinningTypeVtxCentRun2 colBinning{{CfgVtxBins, CfgMultBins}, true}; + BinningTypeVtxCentRun2 colBinning{{cfgVtxBins, cfgMultBins}, true}; SameKindPair pairs{colBinning, cfgNoMixedEvents, -1, collisions, tracksTuple, &cache}; - for (auto& [collision1, tracks1, collision2, tracks2] : pairs) { - - auto bc1 = collision1.bc_as(); - auto bc2 = collision2.bc_as(); - - if (!(bc1.eventCuts() & BIT(aod::Run2EventCuts::kAliEventCutsAccepted)) || !(bc2.eventCuts() & BIT(aod::Run2EventCuts::kAliEventCutsAccepted))) - continue; - - if ((std::abs(collision1.posZ()) > cfgCutVertex) || (std::abs(collision2.posZ()) > cfgCutVertex)) - continue; - - auto centrality1 = collision1.centRun2V0M(); - auto centrality2 = collision2.centRun2V0M(); + for (const auto& [collision1, tracks1, collision2, tracks2] : pairs) { - if ((centrality1 > cfgCutCentrality) || (centrality2 > cfgCutCentrality)) + if (!myEventSelectionsRun2(collision1, bcs) || !myEventSelectionsRun2(collision2, bcs)) continue; if (additionalQAeventPlots) { histos.fill(HIST("QAevent/hEvtCounterMixedE"), 1.0); histos.fill(HIST("QAevent/hVertexZMixedE"), collision1.posZ()); - histos.fill(HIST("QAevent/hMultiplicityPercentMixedE"), centrality1); + histos.fill(HIST("QAevent/hMultiplicityPercentMixedE"), collision1.centRun2V0M()); histos.fill(HIST("TestME/hCollisionIndexMixedE"), collision1.globalIndex()); histos.fill(HIST("TestME/hnTrksMixedE"), tracks1.size()); } - if (tpclowpt) { - - //+- - auto candPosPitpc = posPitpc->sliceByCached(aod::track::collisionId, collision1.globalIndex(), cache); - auto candNegKatpc = negKatpc->sliceByCached(aod::track::collisionId, collision2.globalIndex(), cache); - - fillHistograms(collision1, candPosPitpc, candNegKatpc); - - //-+ - auto candNegPitpc = negPitpc->sliceByCached(aod::track::collisionId, collision1.globalIndex(), cache); - auto candPosKatpc = posKatpc->sliceByCached(aod::track::collisionId, collision2.globalIndex(), cache); - - fillHistograms(collision1, candNegPitpc, candPosKatpc); - - } else if (tofhighpt) { - - //+- - auto candPosPitof = posPitof->sliceByCached(aod::track::collisionId, collision1.globalIndex(), cache); - auto candNegKatof = negKatof->sliceByCached(aod::track::collisionId, collision2.globalIndex(), cache); - - fillHistograms(collision1, candPosPitof, candNegKatof); - - //-+ - auto candNegPitof = negPitof->sliceByCached(aod::track::collisionId, collision1.globalIndex(), cache); - auto candPosKatof = posKatof->sliceByCached(aod::track::collisionId, collision2.globalIndex(), cache); - - fillHistograms(collision1, candNegPitof, candPosKatof); - } + // + callFillHistoswithPartitionsMixedEvt(collision1, tracks1, collision2, tracks2); } } PROCESS_SWITCH(k892analysis_PbPb, processMixedEventRun2, "Process Mixed event Run2", false); - // MC - - using EventCandidatesMCrec = soa::Join; - using TrackCandidatesMCrec = soa::Filtered>; - - void processMixedEventMC(EventCandidatesMCrec const& recCollisions, TrackCandidatesMCrec const& RecTracks) + void processMixedEventMC(EventCandidatesMCrec const& recCollisions, TrackCandidatesMCrec const& RecTracks, aod::McParticles const&) { auto tracksTuple = std::make_tuple(RecTracks); - BinningTypeVtxCent colBinning{{CfgVtxBins, CfgMultBins}, true}; + BinningTypeVtxCent colBinning{{cfgVtxBins, cfgMultBins}, true}; SameKindPair pairs{colBinning, cfgNoMixedEvents, -1, recCollisions, tracksTuple, &cache}; - for (auto& [collision1, tracks1, collision2, tracks2] : pairs) { - if (!collision1.sel8() || !collision2.sel8()) { - continue; - } - if (TMath::Abs(collision1.posZ()) > cfgCutVertex || TMath::Abs(collision2.posZ()) > cfgCutVertex) { - continue; - } - if (timFrameEvsel && (!collision1.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision1.selection_bit(aod::evsel::kNoITSROFrameBorder) || !collision2.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision2.selection_bit(aod::evsel::kNoITSROFrameBorder))) { - continue; - } - if (additionalEvSel2 && (!collision1.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision1.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV) || !collision2.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision2.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { - continue; - } - if (additionalEvSel3 && (!collision1.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard) || !collision2.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard))) { + for (const auto& [collision1, tracks1, collision2, tracks2] : pairs) { + + if (!myEventSelections(collision1) || !myEventSelections(collision2)) continue; - } if (additionalQAeventPlots) { histos.fill(HIST("QAevent/hEvtCounterMixedE"), 1.0); @@ -935,53 +963,65 @@ struct k892analysis_PbPb { histos.fill(HIST("TestME/hnTrksMixedE"), tracks1.size()); } + // fillHistograms(collision1, tracks1, tracks2); } } PROCESS_SWITCH(k892analysis_PbPb, processMixedEventMC, "Process Mixed event MC", false); - void processMC(aod::McCollisions::iterator const& /*mcCollision*/, aod::McParticles& mcParticles, const soa::SmallGroups& recCollisions, TrackCandidatesMCrec const& RecTracks) + void processMixedEventMCRun2(EventCandidatesMCrecRun2 const& recCollisions, TrackCandidatesMCrec const& RecTracks, BCsWithRun2Info const& bcs, aod::McParticles const&) { - histos.fill(HIST("hMCrecCollSels"), 0); + auto tracksTuple = std::make_tuple(RecTracks); + BinningTypeVtxCentRun2 colBinning{{cfgVtxBins, cfgMultBins}, true}; + SameKindPair pairs{colBinning, cfgNoMixedEvents, -1, recCollisions, tracksTuple, &cache}; + + for (const auto& [collision1, tracks1, collision2, tracks2] : pairs) { + + if (!myEventSelectionsRun2(collision1, bcs) || !myEventSelectionsRun2(collision2, bcs)) + continue; + + if (additionalQAeventPlots) { + histos.fill(HIST("QAevent/hEvtCounterMixedE"), 1.0); + histos.fill(HIST("QAevent/hVertexZMixedE"), collision1.posZ()); + histos.fill(HIST("QAevent/hMultiplicityPercentMixedE"), collision1.centRun2V0M()); + histos.fill(HIST("TestME/hCollisionIndexMixedE"), collision1.globalIndex()); + histos.fill(HIST("TestME/hnTrksMixedE"), tracks1.size()); + } + + // + fillHistograms(collision1, tracks1, tracks2); + } + } + PROCESS_SWITCH(k892analysis_PbPb, processMixedEventMCRun2, "Process Mixed event MC Run2", false); + + void processMC(aod::McCollisions::iterator const& /*mcCollision*/, aod::McParticles const& mcParticles, const soa::SmallGroups& recCollisions, TrackCandidatesMCrec const& RecTracks) + { + histos.fill(HIST("QAevent/hMCrecCollSels"), 0); if (recCollisions.size() == 0) { - histos.fill(HIST("hMCrecCollSels"), 1); + histos.fill(HIST("QAevent/hMCrecCollSels"), 1); return; } if (recCollisions.size() > 1) { - histos.fill(HIST("hMCrecCollSels"), 2); + histos.fill(HIST("QAevent/hMCrecCollSels"), 2); return; } - for (auto& RecCollision : recCollisions) { - histos.fill(HIST("hMCrecCollSels"), 3); - if (!RecCollision.sel8()) { - continue; - } - histos.fill(HIST("hMCrecCollSels"), 4); - if (TMath::Abs(RecCollision.posZ()) > cfgCutVertex) { - continue; - } - histos.fill(HIST("hMCrecCollSels"), 5); - if (timFrameEvsel && (!RecCollision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !RecCollision.selection_bit(aod::evsel::kNoITSROFrameBorder))) { - continue; - } - histos.fill(HIST("hMCrecCollSels"), 6); - if (additionalEvSel2 && (!RecCollision.selection_bit(aod::evsel::kNoSameBunchPileup) || !RecCollision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { - continue; - } - histos.fill(HIST("hMCrecCollSels"), 7); - if (additionalEvSel3 && (!RecCollision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard))) { + for (const auto& RecCollision : recCollisions) { + histos.fill(HIST("QAevent/hMCrecCollSels"), 3); + + if (!myEventSelections(RecCollision)) continue; - } - histos.fill(HIST("hMCrecCollSels"), 8); + histos.fill(HIST("QAevent/hMCrecCollSels"), 8); auto centrality = RecCollision.centFT0C(); histos.fill(HIST("QAevent/hMultiplicityPercentMC"), centrality); auto tracks = RecTracks.sliceByCached(aod::track::collisionId, RecCollision.globalIndex(), cache); + + // fillHistograms(RecCollision, tracks, tracks); // Generated MC - for (auto& mcPart : mcParticles) { - if (abs(mcPart.y()) >= 0.5 || abs(mcPart.pdgCode()) != 313) + for (const auto& mcPart : mcParticles) { + if (std::abs(mcPart.y()) >= 0.5 || std::abs(mcPart.pdgCode()) != 313) continue; auto kDaughters = mcPart.daughters_as(); @@ -993,16 +1033,14 @@ struct k892analysis_PbPb { auto daughtp = false; auto daughtk = false; - for (auto kCurrentDaughter : kDaughters) { + for (const auto& kCurrentDaughter : kDaughters) { if (!kCurrentDaughter.isPhysicalPrimary()) break; - if (genacceptancecut && (kCurrentDaughter.pt() < cfgCutPT || TMath::Abs(kCurrentDaughter.eta()) > cfgCutEta)) - break; - if (abs(kCurrentDaughter.pdgCode()) == 211) { + if (std::abs(kCurrentDaughter.pdgCode()) == 211) { daughtp = true; lDecayDaughter1.SetXYZM(kCurrentDaughter.px(), kCurrentDaughter.py(), kCurrentDaughter.pz(), massPi); - } else if (abs(kCurrentDaughter.pdgCode()) == 321) { + } else if (std::abs(kCurrentDaughter.pdgCode()) == 321) { daughtk = true; lDecayDaughter2.SetXYZM(kCurrentDaughter.px(), kCurrentDaughter.py(), kCurrentDaughter.pz(), massKa); } @@ -1031,42 +1069,34 @@ struct k892analysis_PbPb { } PROCESS_SWITCH(k892analysis_PbPb, processMC, "Process Monte Carlo", false); - // MC Run2 - - using EventCandidatesMCrecRun2 = soa::Join; // aod::TrackletMults>; - - void processMCRun2(aod::McCollisions::iterator const& /*mcCollision*/, aod::McParticles& mcParticles, const soa::SmallGroups& recCollisions, TrackCandidatesMCrec const& RecTracks, BCsWithRun2Info const&) + void processMCRun2(aod::McCollisions::iterator const& /*mcCollision*/, aod::McParticles const& mcParticles, const soa::SmallGroups& recCollisions, TrackCandidatesMCrec const& RecTracks, BCsWithRun2Info const& bcs) { - histos.fill(HIST("hMCrecCollSels"), 0); + histos.fill(HIST("QAevent/hMCrecCollSels"), 0); if (recCollisions.size() == 0) { - histos.fill(HIST("hMCrecCollSels"), 1); + histos.fill(HIST("QAevent/hMCrecCollSels"), 1); return; } if (recCollisions.size() > 1) { - histos.fill(HIST("hMCrecCollSels"), 2); + histos.fill(HIST("QAevent/hMCrecCollSels"), 2); return; } - for (auto& RecCollision : recCollisions) { - auto bc = RecCollision.bc_as(); - histos.fill(HIST("hMCrecCollSels"), 3); - - if (!(bc.eventCuts() & BIT(aod::Run2EventCuts::kAliEventCutsAccepted))) - continue; - histos.fill(HIST("hMCrecCollSels"), 4); + for (const auto& RecCollision : recCollisions) { + histos.fill(HIST("QAevent/hMCrecCollSels"), 3); - if (std::abs(RecCollision.posZ()) > cfgCutVertex) + if (!myEventSelectionsRun2(RecCollision, bcs)) continue; - histos.fill(HIST("hMCrecCollSels"), 5); + histos.fill(HIST("QAevent/hMCrecCollSels"), 8); auto centrality = RecCollision.centRun2V0M(); - histos.fill(HIST("QAevent/hMultiplicityPercentMC"), centrality); auto tracks = RecTracks.sliceByCached(aod::track::collisionId, RecCollision.globalIndex(), cache); + + // fillHistograms(RecCollision, tracks, tracks); // Generated MC - for (auto& mcPart : mcParticles) { - if (abs(mcPart.y()) >= 0.5 || abs(mcPart.pdgCode()) != 313) + for (const auto& mcPart : mcParticles) { + if (std::abs(mcPart.y()) >= 0.5 || std::abs(mcPart.pdgCode()) != 313) continue; auto kDaughters = mcPart.daughters_as(); @@ -1078,16 +1108,14 @@ struct k892analysis_PbPb { auto daughtp = false; auto daughtk = false; - for (auto kCurrentDaughter : kDaughters) { + for (const auto& kCurrentDaughter : kDaughters) { if (!kCurrentDaughter.isPhysicalPrimary()) break; - if (genacceptancecut && (kCurrentDaughter.pt() < cfgCutPT || TMath::Abs(kCurrentDaughter.eta()) > cfgCutEta)) - break; - if (abs(kCurrentDaughter.pdgCode()) == 211) { + if (std::abs(kCurrentDaughter.pdgCode()) == 211) { daughtp = true; lDecayDaughter1.SetXYZM(kCurrentDaughter.px(), kCurrentDaughter.py(), kCurrentDaughter.pz(), massPi); - } else if (abs(kCurrentDaughter.pdgCode()) == 321) { + } else if (std::abs(kCurrentDaughter.pdgCode()) == 321) { daughtk = true; lDecayDaughter2.SetXYZM(kCurrentDaughter.px(), kCurrentDaughter.py(), kCurrentDaughter.pz(), massKa); } @@ -1118,6 +1146,5 @@ struct k892analysis_PbPb { }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"k892analysis_PbPb"})}; + return WorkflowSpec{adaptAnalysisTask(cfgc, TaskName{"k892analysis_PbPb"})}; } From b4ef987368bc644c7ccb33ce3f4c3f58df8033ec Mon Sep 17 00:00:00 2001 From: victorvalenciatorres <118812999+victorvalenciatorres@users.noreply.github.com> Date: Sat, 8 Feb 2025 18:50:52 +0100 Subject: [PATCH 0111/1650] [PWGDQ] Adding Single muon Correlators (#9805) --- PWGDQ/Core/HistogramsLibrary.cxx | 19 ++++++++-- PWGDQ/Core/VarManager.cxx | 61 ++++++++++++++++++++++++++++++++ PWGDQ/Core/VarManager.h | 50 ++++++++++++++++++++++++++ PWGDQ/Tasks/tableReader.cxx | 16 +++++++++ 4 files changed, 144 insertions(+), 2 deletions(-) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 27029d131fe..9e2856ab792 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -1273,8 +1273,8 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "centrFT0C_Corr2Corr4REF_ev", "", true, 100, 0.0, 100.0, VarManager::kCentFT0C, 250, -1.0, 1.0, VarManager::kCORR2CORR4REF, VarManager::kM11M1111REFoverMp); hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_M11REFoverMp", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kM11REFoverMp); hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_M1111REFoverMp", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kM1111REFoverMp); - hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_M01POIoverMp", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kM11REFoverMp); - hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_M0111POIoverMp", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kM1111REFoverMp); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_M01POIoverMp", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kM01POIoverMp); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_M0111POIoverMp", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kM0111POIoverMp); hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_M11M1111REFoverMp", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kM11M1111REFoverMp); hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_M01M0111overMp", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kM01M0111overMp); hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_M11M0111overMp", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kM11M0111overMp); @@ -1289,6 +1289,21 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2REFCorr4POI", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR2REFCORR4POI, VarManager::kM11M0111overMp); hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2REFCorr2POI", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR2REFCORR2POI, VarManager::kM11M01overMp); } + if (subGroupStr.Contains("singlecumulant")) { + int var[4] = {VarManager::kMass, VarManager::kPt, VarManager::kRap, VarManager::kCentFT0C}; + int bins[4] = {250, 60, 6, 18}; + double minBins[4] = {0.0, 0.0, 2.5, 0.0}; + double maxBins[4] = {5.0, 30.0, 4.0, 90.0}; + hm->AddHistogram(histClass, "Mass_Pt_Rapidity_CentFT0C", "", 4, var, bins, minBins, maxBins, 0, -1, kTRUE); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2REFminus", "", true, -1, -1, -1, -1, 60, 0.0, 30.0, VarManager::kPt2, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR2REFbydimuons, VarManager::kM11REFoverMpminus); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr4REFminus", "", true, -1, -1, -1, -1, 60, 0.0, 30.0, VarManager::kPt2, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR4REFbydimuons, VarManager::kM1111REFoverMpminus); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2REFplus", "", true, -1, -1, -1, -1, 60, 0.0, 30.0, VarManager::kPt1, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR2REFbydimuons, VarManager::kM11REFoverMpplus); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr4REFplus", "", true, -1, -1, -1, -1, 60, 0.0, 30.0, VarManager::kPt1, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR4REFbydimuons, VarManager::kM1111REFoverMpplus); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2POIminus", "", true, -1, -1, -1, -1, 60, 0.0, 30.0, VarManager::kPt2, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR2POIminus, VarManager::kM01POIoverMpminus); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr4POIminus", "", true, -1, -1, -1, -1, 60, 0.0, 30.0, VarManager::kPt2, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR4POIminus, VarManager::kM0111POIoverMpminus); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2POIplus", "", true, -1, -1, -1, -1, 60, 0.0, 30.0, VarManager::kPt1, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR2POIplus, VarManager::kM01POIoverMpplus); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr4POIplus", "", true, -1, -1, -1, -1, 60, 0.0, 30.0, VarManager::kPt1, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR4POIplus, VarManager::kM0111POIoverMpplus); + } if (subGroupStr.Contains("res-flow-dimuon")) { int varV2[6] = {VarManager::kMass, VarManager::kPt, VarManager::kRap, VarManager::kCentFT0C, VarManager::kR2SP_AB, VarManager::kR2EP_AB}; // int varV3[6] = {VarManager::kMass, VarManager::kPt, VarManager::kRap, VarManager::kCentFT0C, VarManager::kR3SP, VarManager::kR3EP}; // removed temporarily diff --git a/PWGDQ/Core/VarManager.cxx b/PWGDQ/Core/VarManager.cxx index 3078c4000af..975fbf5a2ca 100644 --- a/PWGDQ/Core/VarManager.cxx +++ b/PWGDQ/Core/VarManager.cxx @@ -845,6 +845,48 @@ void VarManager::SetDefaultVarNames() fgVariableUnits[kCORR2POIMp] = ""; fgVariableNames[kCORR4POIMp] = "<4'> M_{p} "; fgVariableUnits[kCORR4POIMp] = ""; + fgVariableNames[kMultMuons] = "Multiplicity muons"; + fgVariableUnits[kMultMuons] = ""; + fgVariableNames[kMultAntiMuons] = "Multiplicity anti-muons"; + fgVariableUnits[kMultAntiMuons] = ""; + fgVariableNames[kM01POIplus] = "M_{01}_{POI}^{+} "; + fgVariableUnits[kM01POIplus] = ""; + fgVariableNames[kM0111POIplus] = "M^{'}_{0111}^{POI+} "; + fgVariableUnits[kM0111POIplus] = ""; + fgVariableNames[kM01POIminus] = "M_{01}_{POI}^{-} "; + fgVariableUnits[kM01POIminus] = ""; + fgVariableNames[kM0111POIminus] = "M^{'}_{0111}^{POI-} "; + fgVariableUnits[kM0111POIminus] = ""; + fgVariableNames[kM01POIoverMpminus] = "M_{01}_{POI}^{-} / M_{p} "; + fgVariableUnits[kM01POIoverMpminus] = ""; + fgVariableNames[kM01POIoverMpplus] = "M_{01}_{POI}^{+} / M_{p} "; + fgVariableUnits[kM01POIoverMpplus] = ""; + fgVariableNames[kM01POIoverMpmoins] = "M_{01}_{POI}^{-} / M_{p} "; + fgVariableUnits[kM01POIoverMpmoins] = ""; + fgVariableNames[kM01POIoverMpplus] = "M_{01}_{POI}^{+} / M_{p} "; + fgVariableUnits[kM01POIoverMpplus] = ""; + fgVariableNames[kM01POIoverMpmoins] = "M_{01}_{POI}^{-} / M_{p} "; + fgVariableUnits[kM01POIoverMpmoins] = ""; + fgVariableNames[kM0111POIoverMpminus] = "M^{'}_{0111}^{POI-} / M_{p} "; + fgVariableUnits[kM0111POIoverMpminus] = ""; + fgVariableNames[kM0111POIoverMpplus] = "M^{'}_{0111}^{POI+} / M_{p} "; + fgVariableUnits[kM0111POIoverMpplus] = ""; + fgVariableNames[kCORR2POIplus] = "<2>_{POI}^{+} "; + fgVariableUnits[kCORR2POIplus] = ""; + fgVariableNames[kCORR2POIminus] = "<2>_{POI}^{-} "; + fgVariableUnits[kCORR2POIminus] = ""; + fgVariableNames[kCORR4POIplus] = "<4>_{POI}^{+} "; + fgVariableUnits[kCORR4POIplus] = ""; + fgVariableNames[kCORR4POIminus] = "<4>_{POI}^{-} "; + fgVariableUnits[kCORR4POIminus] = ""; + fgVariableNames[kM11REFoverMpminus] = "M^{-}_{11}^{REF}/M^{-}_{p} "; + fgVariableUnits[kM11REFoverMpminus] = ""; + fgVariableNames[kM11REFoverMpplus] = "M^{+}_{11}^{REF}/M^{+}_{p} "; + fgVariableUnits[kM11REFoverMpplus] = ""; + fgVariableNames[kM1111REFoverMpplus] = "M^{+}_{1111}^{REF}/M^{+}_{p} "; + fgVariableUnits[kM1111REFoverMpplus] = ""; + fgVariableNames[kM1111REFoverMpminus] = "M^{-}_{1111}^{REF}/M^{-}_{p} "; + fgVariableUnits[kM1111REFoverMpminus] = ""; fgVariableNames[kCos2DeltaPhi] = "cos 2(#varphi-#Psi_{2}^{A}) "; fgVariableUnits[kCos2DeltaPhi] = ""; fgVariableNames[kCos3DeltaPhi] = "cos 3(#varphi-#Psi_{3}^{A}) "; @@ -1481,6 +1523,25 @@ void VarManager::SetDefaultVarNames() fgVarNamesMap["kM0111POI"] = kM0111POI; fgVarNamesMap["kCORR2REF"] = kCORR2REF; fgVarNamesMap["kCORR2REFbydimuons"] = kCORR2REFbydimuons; + fgVarNamesMap["kMultAntiMuons"] = kMultAntiMuons; + fgVarNamesMap["kMultMuons"] = kMultMuons; + fgVarNamesMap["kM01POIplus"] = kM01POIplus; + fgVarNamesMap["kM0111POIplus"] = kM0111POIplus; + fgVarNamesMap["kM01POIminus"] = kM01POIminus; + fgVarNamesMap["kM0111POIminus"] = kM0111POIminus; + fgVarNamesMap["kM01POIoverMpminus"] = kM01POIoverMpminus; + fgVarNamesMap["kM01POIoverMpplus"] = kM01POIoverMpplus; + fgVarNamesMap["kM01POIoverMpmoins"] = kM01POIoverMpmoins; + fgVarNamesMap["kM0111POIoverMpminus"] = kM0111POIoverMpminus; + fgVarNamesMap["kM0111POIoverMpplus"] = kM0111POIoverMpplus; + fgVarNamesMap["kCORR2POIplus"] = kCORR2POIplus; + fgVarNamesMap["kCORR2POIminus"] = kCORR2POIminus; + fgVarNamesMap["kCORR4POIplus"] = kCORR4POIplus; + fgVarNamesMap["kCORR4POIminus"] = kCORR4POIminus; + fgVarNamesMap["kM11REFoverMpminus"] = kM11REFoverMpminus; + fgVarNamesMap["kM11REFoverMpplus"] = kM11REFoverMpplus; + fgVarNamesMap["kM1111REFoverMpplus"] = kM1111REFoverMpplus; + fgVarNamesMap["kM1111REFoverMpminus"] = kM1111REFoverMpminus; fgVarNamesMap["kCORR2REFetagap"] = kCORR2REFetagap; fgVarNamesMap["kCORR2POI"] = kCORR2POI; fgVarNamesMap["kCORR2POICORR4POI"] = kCORR2POICORR4POI; diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 8498a9a6a97..ee5a1dd33e2 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -230,6 +230,8 @@ class VarManager : public TObject kMultZNC, kMultTracklets, kMultDimuons, + kMultAntiMuons, + kMultMuons, kMultNTracksHasITS, kMultNTracksHasTPC, kMultNTracksHasTOF, @@ -688,6 +690,23 @@ class VarManager : public TObject kM0111POIoverMp, kCORR2POIMp, kCORR4POIMp, + kM01POIplus, + kM0111POIplus, + kM01POIminus, + kM0111POIminus, + kM01POIoverMpminus, + kM01POIoverMpplus, + kM01POIoverMpmoins, + kM0111POIoverMpminus, + kM0111POIoverMpplus, + kCORR2POIplus, + kCORR2POIminus, + kCORR4POIplus, + kCORR4POIminus, + kM11REFoverMpplus, + kM1111REFoverMpplus, + kM11REFoverMpminus, + kM1111REFoverMpminus, kR2SP, kR2EP, kPsi2A, @@ -4331,6 +4350,8 @@ void VarManager::FillPairVn(T1 const& t1, T2 const& t2, float* values) ROOT::Math::PtEtaPhiMVector v1(t1.pt(), t1.eta(), t1.phi(), m1); ROOT::Math::PtEtaPhiMVector v2(t2.pt(), t2.eta(), t2.phi(), m2); ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; + values[kPt1] = t1.pt(); + values[kPt2] = t2.pt(); // TODO: provide different computations for vn // Compute the scalar product UQ using Q-vector from A, for second and third harmonic @@ -4409,6 +4430,35 @@ void VarManager::FillPairVn(T1 const& t1, T2 const& t2, float* values) values[kM01M0111overMp] = values[kMultDimuons] > 0 && !(std::isnan(values[kM01POI]) || std::isinf(values[kM01POI]) || std::isnan(values[kM0111POI]) || std::isinf(values[kM0111POI]) || std::isnan(values[kCORR2POI]) || std::isinf(values[kCORR2POI]) || std::isnan(values[kCORR4POI]) || std::isinf(values[kCORR4POI])) ? (values[kM01POI] * values[kM0111POI]) / values[kMultDimuons] : 0; values[kM11M0111overMp] = values[kMultDimuons] > 0 && !(std::isnan(values[kM11REF]) || std::isinf(values[kM11REF]) || std::isnan(values[kM0111POI]) || std::isinf(values[kM0111POI]) || std::isnan(values[kCORR2REF]) || std::isinf(values[kCORR2REF]) || std::isnan(values[kCORR4POI]) || std::isinf(values[kCORR4POI])) ? (values[kM11REF] * values[kM0111POI]) / values[kMultDimuons] : 0; values[kM11M01overMp] = values[kMultDimuons] > 0 && !(std::isnan(values[kM11REF]) || std::isinf(values[kM11REF]) || std::isnan(values[kM01POI]) || std::isinf(values[kM01POI]) || std::isnan(values[kCORR2REF]) || std::isinf(values[kCORR2REF]) || std::isnan(values[kCORR2POI]) || std::isinf(values[kCORR2POI])) ? (values[kM11REF] * values[kM01POI]) / values[kMultDimuons] : 0; + + complex P2plus(TMath::Cos(2 * v1.Phi()), TMath::Sin(2 * v1.Phi())); + complex P2minus(TMath::Cos(2 * v2.Phi()), TMath::Sin(2 * v2.Phi())); + values[kM11REFoverMpplus] = values[kMultAntiMuons] > 0 && !(std::isnan(values[kM11REF]) || std::isinf(values[kM11REF]) || std::isnan(values[kCORR2REF]) || std::isinf(values[kCORR2REF]) || std::isnan(values[kM1111REF]) || std::isinf(values[kM1111REF]) || std::isnan(values[kCORR4REF]) || std::isinf(values[kCORR4REF])) ? values[kM11REF] / values[kMultAntiMuons] : 0; + values[kM1111REFoverMpplus] = values[kMultAntiMuons] > 0 && !(std::isnan(values[kM11REF]) || std::isinf(values[kM11REF]) || std::isnan(values[kCORR2REF]) || std::isinf(values[kCORR2REF]) || std::isnan(values[kM1111REF]) || std::isinf(values[kM1111REF]) || std::isnan(values[kCORR4REF]) || std::isinf(values[kCORR4REF])) ? values[kM1111REF] / values[kMultAntiMuons] : 0; + values[kM11REFoverMpminus] = values[kMultMuons] > 0 && !(std::isnan(values[kM11REF]) || std::isinf(values[kM11REF]) || std::isnan(values[kCORR2REF]) || std::isinf(values[kCORR2REF]) || std::isnan(values[kM1111REF]) || std::isinf(values[kM1111REF]) || std::isnan(values[kCORR4REF]) || std::isinf(values[kCORR4REF])) ? values[kM11REF] / values[kMultMuons] : 0; + values[kM1111REFoverMpminus] = values[kMultMuons] > 0 && !(std::isnan(values[kM11REF]) || std::isinf(values[kM11REF]) || std::isnan(values[kCORR2REF]) || std::isinf(values[kCORR2REF]) || std::isnan(values[kM1111REF]) || std::isinf(values[kM1111REF]) || std::isnan(values[kCORR4REF]) || std::isinf(values[kCORR4REF])) ? values[kM1111REF] / values[kMultMuons] : 0; + values[kCORR2POIplus] = (P2plus * conj(Q21)).real() / values[kM01POI]; + values[kCORR2POIminus] = (P2minus * conj(Q21)).real() / values[kM01POI]; + values[kM01POIplus] = values[kMultAntiMuons] * values[kS11A]; + values[kM0111POIplus] = values[kMultAntiMuons] * (values[kS31A] - 3. * values[kS11A] * values[kS12A] + 2. * values[kS13A]); + values[kCORR2POIplus] = (P2plus * conj(Q21)).real() / values[kM01POIplus]; + values[kCORR4POIplus] = (P2plus * Q21 * conj(Q21) * conj(Q21) - P2plus * Q21 * conj(Q42) - 2. * values[kS12A] * P2plus * conj(Q21) + 2. * P2plus * conj(Q23)).real() / values[kM0111POIplus]; + values[kM01POIminus] = values[kMultMuons] * values[kS11A]; + values[kM0111POIminus] = values[kMultMuons] * (values[kS31A] - 3. * values[kS11A] * values[kS12A] + 2. * values[kS13A]); + values[kCORR2POIminus] = (P2minus * conj(Q21)).real() / values[kM01POIminus]; + values[kCORR4POIminus] = (P2minus * Q21 * conj(Q21) * conj(Q21) - P2minus * Q21 * conj(Q42) - 2. * values[kS12A] * P2minus * conj(Q21) + 2. * P2minus * conj(Q23)).real() / values[kM0111POIminus]; + values[kM01POIplus] = std::isnan(values[kM01POIplus]) || std::isinf(values[kM01POIplus]) || std::isnan(values[kM0111POIplus]) || std::isinf(values[kM0111POIplus]) || std::isnan(values[kCORR2POIplus]) || std::isinf(values[kCORR2POIplus]) || std::isnan(values[kCORR4POIplus]) || std::isinf(values[kCORR4POIplus]) ? 0 : values[kM01POIplus]; + values[kM0111POIplus] = std::isnan(values[kM0111POIplus]) || std::isinf(values[kM0111POIplus]) || std::isnan(values[kCORR2POIplus]) || std::isinf(values[kCORR2POIplus]) || std::isnan(values[kCORR4POIplus]) || std::isinf(values[kCORR4POIplus]) ? 0 : values[kM0111POIplus]; + values[kCORR2POIplus] = std::isnan(values[kM01POIplus]) || std::isinf(values[kM01POIplus]) || std::isnan(values[kM0111POIplus]) || std::isinf(values[kM0111POIplus]) || std::isnan(values[kCORR2POIplus]) || std::isinf(values[kCORR2POIplus]) || std::isnan(values[kCORR4POIplus]) || std::isinf(values[kCORR4POIplus]) ? 0 : values[kCORR2POIplus]; + values[kCORR4POIplus] = std::isnan(values[kM01POIplus]) || std::isinf(values[kM01POIplus]) || std::isnan(values[kM0111POIplus]) || std::isinf(values[kM0111POIplus]) || std::isnan(values[kCORR2POIplus]) || std::isinf(values[kCORR2POIplus]) || std::isnan(values[kCORR4POIplus]) || std::isinf(values[kCORR4POIplus]) ? 0 : values[kCORR4POIplus]; + values[kM01POIminus] = std::isnan(values[kM01POIminus]) || std::isinf(values[kM01POIminus]) || std::isnan(values[kM0111POIminus]) || std::isinf(values[kM0111POIminus]) || std::isnan(values[kCORR2POIminus]) || std::isinf(values[kCORR2POIminus]) || std::isnan(values[kCORR4POIminus]) || std::isinf(values[kCORR4POIminus]) ? 0 : values[kM01POIminus]; + values[kM0111POIminus] = std::isnan(values[kM01POIminus]) || std::isinf(values[kM01POIminus]) || std::isnan(values[kM0111POIminus]) || std::isinf(values[kM0111POIminus]) || std::isnan(values[kCORR2POIminus]) || std::isinf(values[kCORR2POIminus]) || std::isnan(values[kCORR4POIminus]) || std::isinf(values[kCORR4POIminus]) ? 0 : values[kM0111POIminus]; + values[kCORR2POIminus] = std::isnan(values[kM01POIminus]) || std::isinf(values[kM01POIminus]) || std::isnan(values[kM0111POIminus]) || std::isinf(values[kM0111POIminus]) || std::isnan(values[kCORR2POIminus]) || std::isinf(values[kCORR2POIminus]) || std::isnan(values[kCORR4POIminus]) || std::isinf(values[kCORR4POIminus]) ? 0 : values[kCORR2POIminus]; + values[kCORR4POIminus] = std::isnan(values[kM01POIminus]) || std::isinf(values[kM01POIminus]) || std::isnan(values[kM0111POIminus]) || std::isinf(values[kM0111POIminus]) || std::isnan(values[kCORR2POIminus]) || std::isinf(values[kCORR2POIminus]) || std::isnan(values[kCORR4POIminus]) || std::isinf(values[kCORR4POIminus]) ? 0 : values[kCORR4POIminus]; + values[kM01POIoverMpminus] = values[kMultMuons] > 0 && !(std::isnan(values[kM0111POIminus]) || std::isinf(values[kM0111POIminus]) || std::isnan(values[kCORR4POIminus]) || std::isinf(values[kCORR4POIminus]) || std::isnan(values[kM01POIminus]) || std::isinf(values[kM01POIminus]) || std::isnan(values[kCORR2POIminus]) || std::isinf(values[kCORR2POIminus])) ? values[kM01POIminus] / values[kMultMuons] : 0; + values[kM0111POIoverMpminus] = values[kMultMuons] > 0 && !(std::isnan(values[kM0111POIminus]) || std::isinf(values[kM0111POIminus]) || std::isnan(values[kCORR4POIminus]) || std::isinf(values[kCORR4POIminus]) || std::isnan(values[kM01POIminus]) || std::isinf(values[kM01POIminus]) || std::isnan(values[kCORR2POIminus]) || std::isinf(values[kCORR2POIminus])) ? values[kM0111POIminus] / values[kMultMuons] : 0; + values[kM01POIoverMpplus] = values[kMultAntiMuons] > 0 && !(std::isnan(values[kM0111POIplus]) || std::isinf(values[kM0111POIplus]) || std::isnan(values[kCORR4POIplus]) || std::isinf(values[kCORR4POIplus]) || std::isnan(values[kM01POIplus]) || std::isinf(values[kM01POIplus]) || std::isnan(values[kCORR2POIplus]) || std::isinf(values[kCORR2POIplus])) ? values[kM01POIplus] / values[kMultAntiMuons] : 0; + values[kM0111POIoverMpplus] = values[kMultMuons] > 0 && !(std::isnan(values[kM0111POIplus]) || std::isinf(values[kM0111POIplus]) || std::isnan(values[kCORR4POIplus]) || std::isinf(values[kCORR4POIplus]) || std::isnan(values[kM01POIplus]) || std::isinf(values[kM01POIplus]) || std::isnan(values[kCORR2POIplus]) || std::isinf(values[kCORR2POIplus])) ? values[kM0111POIplus] / values[kMultAntiMuons] : 0; } ROOT::Math::PtEtaPhiMVector v1_vp(v1.Pt(), v1.Eta(), v1.Phi() - Psi2B, v1.M()); diff --git a/PWGDQ/Tasks/tableReader.cxx b/PWGDQ/Tasks/tableReader.cxx index ea8eb8dbbdb..9d925838705 100644 --- a/PWGDQ/Tasks/tableReader.cxx +++ b/PWGDQ/Tasks/tableReader.cxx @@ -1233,6 +1233,20 @@ struct AnalysisSameEventPairing { if (fConfigMultDimuons.value) { uint32_t mult_dimuons = 0; + uint32_t mult_antimuons = 0; + uint32_t mult_muons = 0; + + for (auto& t : tracks1) { + if constexpr (TPairType == VarManager::kDecayToMuMu) { + if (static_cast(t.isMuonSelected()) & fTwoMuonFilterMask) { + if (t.sign() < 0) { + mult_muons++; + } else { + mult_antimuons++; + } + } + } + } for (auto& [t1, t2] : combinations(tracks1, tracks2)) { if constexpr (TPairType == VarManager::kDecayToMuMu) { @@ -1245,6 +1259,8 @@ struct AnalysisSameEventPairing { } VarManager::fgValues[VarManager::kMultDimuons] = mult_dimuons; + VarManager::fgValues[VarManager::kMultMuons] = mult_muons; + VarManager::fgValues[VarManager::kMultAntiMuons] = mult_antimuons; } if (fConfigFlowReso) { From 9f9ffd182513c66ec63b236f90b904dc054c9dde Mon Sep 17 00:00:00 2001 From: alcaliva <32872606+alcaliva@users.noreply.github.com> Date: Sat, 8 Feb 2025 22:10:23 +0100 Subject: [PATCH 0112/1650] [PWGLF] added protection against possible infinite loops (#9839) --- PWGLF/Tasks/Nuspex/nucleiInJets.cxx | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/nucleiInJets.cxx b/PWGLF/Tasks/Nuspex/nucleiInJets.cxx index 9960759e9ac..41d07b46a64 100644 --- a/PWGLF/Tasks/Nuspex/nucleiInJets.cxx +++ b/PWGLF/Tasks/Nuspex/nucleiInJets.cxx @@ -172,7 +172,8 @@ struct NucleiInJets { registryQC.add("jet_ue_overlaps", "jet_ue_overlaps", HistType::kTH2F, {{20, 0.0, 20.0, "#it{n}_{jet}"}, {200, 0.0, 200.0, "#it{n}_{overlaps}"}}); registryQC.add("ue_ue_overlaps", "ue_ue_overlaps", HistType::kTH2F, {{20, 0.0, 20.0, "#it{n}_{jet}"}, {200, 0.0, 200.0, "#it{n}_{overlaps}"}}); registryQC.add("tot_overlaps", "tot_overlaps", HistType::kTH2F, {{20, 0.0, 20.0, "#it{n}_{jet}"}, {200, 0.0, 200.0, "#it{n}_{overlaps}"}}); - registryQC.add("hJetArea", "hJetArea", HistType::kTH1F, {{450, 0, 15, "Area"}}); + registryQC.add("hJetArea", "hJetArea", HistType::kTH1F, {{2000, 0, 2, "Area"}}); + registryQC.add("hError", "hError", HistType::kTH1F, {{5, 0, 5, "error"}}); // Event Counters registryData.add("number_of_events_data", "number of events in data", HistType::kTH1F, {{10, 0, 10, "counter"}}); @@ -530,7 +531,7 @@ struct NucleiInJets { std::vector nParticlesInjet; do { - double dijMin(1e+06), diBmin(1e+06); + double dijMin(1e+300), diBmin(1e+300); int iMin(0), jMin(0), iBmin(0); for (int i = 0; i < static_cast(trk.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] if (trk[i].Mag() == 0) @@ -1018,7 +1019,7 @@ struct NucleiInJets { std::vector nParticlesInjet; do { - double dijMin(1e+06), diBmin(1e+06); + double dijMin(1e+300), diBmin(1e+300); int iMin(0), jMin(0), iBmin(0); for (int i = 0; i < static_cast(trk.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] if (trk[i].Mag() == 0) @@ -1247,7 +1248,7 @@ struct NucleiInJets { std::vector nParticlesInjet; do { - double dijMin(1e+06), diBmin(1e+06); + double dijMin(1e+300), diBmin(1e+300); int iMin(0), jMin(0), iBmin(0); for (int i = 0; i < static_cast(trk.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] if (trk[i].Mag() == 0) @@ -1413,7 +1414,7 @@ struct NucleiInJets { std::vector jetArea; do { - double dijMin(1e+06), diBmin(1e+06); + double dijMin(1e+300), diBmin(1e+300); int iMin(0), jMin(0), iBmin(0); int nGhostsInJet(0); for (int i = 0; i < static_cast(trk.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] @@ -1446,11 +1447,16 @@ struct NucleiInJets { } if (dijMin > diBmin) { double area = (static_cast(nGhostsInJet) / static_cast(nGhosts)) * TwoPI * 1.6; - jetArea.push_back(area); + double alphaJet = area / (PI * rJet * rJet); + jetArea.push_back(alphaJet); jet.push_back(trk[iBmin]); trk[iBmin].SetXYZ(0, 0, 0); nParticlesRemoved++; } + if (dijMin == diBmin) { + registryQC.fill(HIST("hError"), 0.5); + nParticlesRemoved = static_cast(trk.size()); + } } while (nParticlesRemoved < static_cast(trk.size())); for (int i = 0; i < static_cast(jet.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] @@ -1507,7 +1513,7 @@ struct NucleiInJets { std::vector nParticlesInjet; do { - double dijMin(1e+06), diBmin(1e+06); + double dijMin(1e+300), diBmin(1e+300); int iMin(0), jMin(0), iBmin(0); for (int i = 0; i < static_cast(trk.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] if (trk[i].Mag() == 0) From 753fc894e2ee3d4fc1ed1c781a9de4836033e2f7 Mon Sep 17 00:00:00 2001 From: Stefano Cannito <143754257+scannito@users.noreply.github.com> Date: Sun, 9 Feb 2025 00:36:59 +0100 Subject: [PATCH 0113/1650] [PWGLF] Added DCA distribution plots (#9838) --- .../Tasks/Strangeness/phik0shortanalysis.cxx | 98 ++++++++++++------- 1 file changed, 64 insertions(+), 34 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx index 8c65cca608d..3a79d270a19 100644 --- a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx @@ -88,9 +88,11 @@ struct Phik0shortanalysis { Configurable v0SettingDCAV0Dau{"v0SettingDCAV0Dau", 1, "DCA V0 Daughters"}; Configurable v0SettingDCAPosToPV{"v0SettingDCAPosToPV", 0.06, "DCA Pos To PV"}; Configurable v0SettingDCANegToPV{"v0SettingDCANegToPV", 0.06, "DCA Neg To PV"}; + + Configurable cfgisV0ForData{"cfgisV0ForData", true, "isV0ForData"}; Configurable nSigmaCutTPCPion{"nSigmaCutTPCPion", 4.0, "Value of the TPC Nsigma cut for Pions"}; - Configurable cfgFurtherV0Selection{"cfgFurtherV0Selection", true, "Further V0 selection"}; + Configurable cfgFurtherV0Selection{"cfgFurtherV0Selection", false, "Further V0 selection"}; Configurable ctauK0s{"ctauK0s", 20.0f, "C tau K0s(cm)"}; Configurable paramArmenterosCut{"paramArmenterosCut", 0.2, "parameter Armenteros Cut"}; Configurable v0rejK0s{"v0rejK0s", 0.005, "V0 rej K0s"}; @@ -242,22 +244,25 @@ struct Phik0shortanalysis { mcEventHist.add("hRecMCVertexZ", "hRecMCVertexZ", kTH1F, {vertexZAxis}); mcEventHist.add("hRecMCMultiplicityPercent", "RecMC Multiplicity Percentile", kTH1F, {multAxis}); mcEventHist.add("hRecMCGenMultiplicityPercent", "RecMC Gen Multiplicity Percentile", kTH1F, {binnedmultAxis}); + mcEventHist.add("hRecMCGenMultiplicityPercentWithPhi", "RecMC Gen Multiplicity Percentile in Events with a Phi Candidate", kTH1F, {binnedmultAxis}); mcEventHist.add("hGenMCVertexZ", "hGenMCVertexZ", kTH1F, {vertexZAxis}); mcEventHist.add("hGenMCMultiplicityPercent", "GenMC Multiplicity Percentile", kTH1F, {binnedmultAxis}); // Phi tpological/PID cuts + candPhiHist.add("hDCAxyPreCut", "Dcaxy distribution vs pt before DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); + candPhiHist.add("hDCAzPreCut", "Dcaz distribution vs pt before DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); + candPhiHist.add("hDCAxyPostCut", "Dcaxy distribution vs pt after DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); + candPhiHist.add("hDCAzPostCut", "Dcaz distribution vs pt after DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); candPhiHist.add("hEta", "Eta distribution", kTH1F, {{200, -1.0f, 1.0f}}); - candPhiHist.add("hDcaxy", "Dcaxy distribution", kTH1F, {{200, -1.0f, 1.0f}}); - candPhiHist.add("hDcaz", "Dcaz distribution", kTH1F, {{200, -1.0f, 1.0f}}); - candPhiHist.add("hNsigmaKaonTPC", "NsigmaKaon TPC distribution", kTH2F, {ptK0SAxis, {100, -10.0f, 10.0f}}); - candPhiHist.add("hNsigmaKaonTOF", "NsigmaKaon TOF distribution", kTH2F, {ptK0SAxis, {100, -10.0f, 10.0f}}); + candPhiHist.add("hNsigmaKaonTPC", "NsigmaKaon TPC distribution", kTH2F, {{100, 0.0, 5.0, "#it{p} (GeV/#it{c})"}, {100, -10.0f, 10.0f}}); + candPhiHist.add("hNsigmaKaonTOF", "NsigmaKaon TOF distribution", kTH2F, {{100, 0.0, 5.0, "#it{p} (GeV/#it{c})"}, {100, -10.0f, 10.0f}}); // K0S topological/PID cuts candK0SHist.add("hDCAV0Daughters", "hDCAV0Daughters", kTH1F, {{55, 0.0f, 2.2f}}); candK0SHist.add("hV0CosPA", "hV0CosPA", kTH1F, {{100, 0.95f, 1.f}}); - candK0SHist.add("hNSigmaPosPionFromK0S", "hNSigmaPosPionFromK0Short", kTH2F, {ptK0SAxis, {100, -5.f, 5.f}}); - candK0SHist.add("hNSigmaNegPionFromK0S", "hNSigmaNegPionFromK0Short", kTH2F, {ptK0SAxis, {100, -5.f, 5.f}}); + candK0SHist.add("hNSigmaPosPionFromK0S", "hNSigmaPosPionFromK0Short", kTH2F, {{100, 0.0, 5.0, "#it{p} (GeV/#it{c})"}, {100, -10.0f, 10.0f}}); + candK0SHist.add("hNSigmaNegPionFromK0S", "hNSigmaNegPionFromK0Short", kTH2F, {{100, 0.0, 5.0, "#it{p} (GeV/#it{c})"}, {100, -10.0f, 10.0f}}); // Phi invariant mass for computing purities and normalisation dataPhiHist.add("h2PhipurInvMass", "Invariant mass of Phi for Purity (no K0S/Pi)", kTH2F, {binnedmultAxis, massPhiAxis}); @@ -479,10 +484,12 @@ struct Phik0shortanalysis { if (v0.v0radius() < v0SettingRadius) return false; - if (std::abs(daughter1.tpcNSigmaPi()) > nSigmaCutTPCPion) - return false; - if (std::abs(daughter2.tpcNSigmaPi()) > nSigmaCutTPCPion) - return false; + if (cfgisV0ForData) { + if (std::abs(daughter1.tpcNSigmaPi()) > nSigmaCutTPCPion) + return false; + if (std::abs(daughter2.tpcNSigmaPi()) > nSigmaCutTPCPion) + return false; + } return true; } @@ -501,7 +508,7 @@ struct Phik0shortanalysis { // Topological track selection template - bool selectionTrackResonance(const T& track) + bool selectionTrackResonance(const T& track, bool isQA) { if (cfgPrimaryTrack && !track.isPrimaryTrack()) return false; @@ -510,16 +517,25 @@ struct Phik0shortanalysis { if (cfgPVContributor && !track.isPVContributor()) return false; + if (track.tpcNClsFound() < minTPCnClsFound) + return false; + if (track.pt() < cMinKaonPtcut) return false; if (std::abs(track.eta()) > etaMax) return false; - if (std::abs(track.dcaZ()) > cMaxDCAzToPVcut) - return false; + if (isQA) { + candPhiHist.fill(HIST("hDCAxyPreCut"), track.pt(), track.dcaXY()); + candPhiHist.fill(HIST("hDCAzPreCut"), track.pt(), track.dcaZ()); + } if (std::abs(track.dcaXY()) > cMaxDCArToPV1 + (cMaxDCArToPV2 / std::pow(track.pt(), cMaxDCArToPV3))) return false; - if (track.tpcNClsFound() < minTPCnClsFound) + if (isQA) { + candPhiHist.fill(HIST("hDCAxyPostCut"), track.pt(), track.dcaXY()); + candPhiHist.fill(HIST("hDCAzPostCut"), track.pt(), track.dcaZ()); + } + if (std::abs(track.dcaZ()) > cMaxDCAzToPVcut) return false; return true; } @@ -667,12 +683,10 @@ struct Phik0shortanalysis { // Loop over all positive tracks for (const auto& track1 : posThisColl) { - if (!selectionTrackResonance(track1) || !selectionPIDKaonpTdependent(track1)) + if (!selectionTrackResonance(track1, true) || !selectionPIDKaonpTdependent(track1)) continue; // topological and PID selection candPhiHist.fill(HIST("hEta"), track1.eta()); - candPhiHist.fill(HIST("hDcaxy"), track1.dcaXY()); - candPhiHist.fill(HIST("hDcaz"), track1.dcaZ()); candPhiHist.fill(HIST("hNsigmaKaonTPC"), track1.tpcInnerParam(), track1.tpcNSigmaKa()); candPhiHist.fill(HIST("hNsigmaKaonTOF"), track1.tpcInnerParam(), track1.tofNSigmaKa()); @@ -680,7 +694,7 @@ struct Phik0shortanalysis { // Loop over all negative tracks for (const auto& track2 : negThisColl) { - if (!selectionTrackResonance(track2) || !selectionPIDKaonpTdependent(track2)) + if (!selectionTrackResonance(track2, true) || !selectionPIDKaonpTdependent(track2)) continue; // topological and PID selection auto track2ID = track2.globalIndex(); @@ -811,14 +825,14 @@ struct Phik0shortanalysis { // Phi reconstruction // Loop over positive tracks for (const auto& track1 : posThisColl) { - if (!selectionTrackResonance(track1) || !selectionPIDKaonpTdependent(track1)) + if (!selectionTrackResonance(track1, false) || !selectionPIDKaonpTdependent(track1)) continue; // topological and PID selection auto track1ID = track1.globalIndex(); // Loop over all negative tracks for (const auto& track2 : negThisColl) { - if (!selectionTrackResonance(track2) || !selectionPIDKaonpTdependent(track2)) + if (!selectionTrackResonance(track2, false) || !selectionPIDKaonpTdependent(track2)) continue; // topological and PID selection auto track2ID = track2.globalIndex(); @@ -884,14 +898,14 @@ struct Phik0shortanalysis { // Phi reconstruction // Loop over positive tracks for (const auto& track1 : posThisColl) { // loop over all selected tracks - if (!selectionTrackResonance(track1) || !selectionPIDKaonpTdependent(track1)) + if (!selectionTrackResonance(track1, false) || !selectionPIDKaonpTdependent(track1)) continue; // topological and PID selection auto track1ID = track1.globalIndex(); // Loop over all negative tracks for (const auto& track2 : negThisColl) { - if (!selectionTrackResonance(track2) || !selectionPIDKaonpTdependent(track2)) + if (!selectionTrackResonance(track2, false) || !selectionPIDKaonpTdependent(track2)) continue; // topological and PID selection auto track2ID = track2.globalIndex(); @@ -951,7 +965,7 @@ struct Phik0shortanalysis { // Loop over all positive tracks for (const auto& track1 : posThisColl) { - if (!selectionTrackResonance(track1) || !selectionPIDKaonpTdependent(track1)) + if (!selectionTrackResonance(track1, false) || !selectionPIDKaonpTdependent(track1)) continue; // topological and PID selection auto track1ID = track1.globalIndex(); @@ -964,7 +978,7 @@ struct Phik0shortanalysis { // Loop over all negative tracks for (const auto& track2 : negThisColl) { - if (!selectionTrackResonance(track2) || !selectionPIDKaonpTdependent(track2)) + if (!selectionTrackResonance(track2, false) || !selectionPIDKaonpTdependent(track2)) continue; // topological and PID selection auto track2ID = track2.globalIndex(); @@ -1258,7 +1272,7 @@ struct Phik0shortanalysis { PROCESS_SWITCH(Phik0shortanalysis, processRecMCPhiPion, "Process RecMC for Phi-Pion Analysis", false); - void processRecMCClosurePhiQA(SimCollisions::iterator const& collision, FullMCTracks const& fullMCTracks, FullV0s const& V0s, V0DauMCTracks const&, MCCollisions const&) + void processRecMCClosurePhiQA(SimCollisions::iterator const& collision, FullMCTracks const& fullMCTracks, FullMCV0s const& V0s, V0DauMCTracks const&, MCCollisions const&, aod::McParticles const&) { if (!acceptEventQA(collision, true)) return; @@ -1279,14 +1293,14 @@ struct Phik0shortanalysis { // Loop over all positive tracks for (const auto& track1 : posThisColl) { - if (!selectionTrackResonance(track1) || !selectionPIDKaonpTdependent(track1)) + if (!selectionTrackResonance(track1, true) || !selectionPIDKaonpTdependent(track1)) continue; // topological and PID selection auto track1ID = track1.globalIndex(); // Loop over all negative tracks for (const auto& track2 : negThisColl) { - if (!selectionTrackResonance(track2) || !selectionPIDKaonpTdependent(track2)) + if (!selectionTrackResonance(track2, true) || !selectionPIDKaonpTdependent(track2)) continue; // topological and PID selection auto track2ID = track2.globalIndex(); @@ -1299,6 +1313,7 @@ struct Phik0shortanalysis { if (!isCountedPhi) { mcEventHist.fill(HIST("hRecMCEventSelection"), 7); // at least a Phi in the event + mcEventHist.fill(HIST("hRecMCGenMultiplicityPercentWithPhi"), genmultiplicity); isCountedPhi = true; } @@ -1308,6 +1323,14 @@ struct Phik0shortanalysis { // V0 already reconstructed by the builder for (const auto& v0 : V0s) { + if (cfgisRecMCWPDGForClosure1) { + if (!v0.has_mcParticle()) + continue; + auto v0mcparticle = v0.mcParticle(); + if (v0mcparticle.pdgCode() != 310 || !v0mcparticle.isPhysicalPrimary()) + continue; + } + const auto& posDaughterTrack = v0.posTrack_as(); const auto& negDaughterTrack = v0.negTrack_as(); @@ -1341,6 +1364,13 @@ struct Phik0shortanalysis { // Loop over all primary pion candidates for (const auto& track : fullMCTracks) { + if (cfgisRecMCWPDGForClosure1) { + if (!track.has_mcParticle()) + continue; + auto mcTrack = track.mcParticle_as(); + if (std::abs(mcTrack.pdgCode()) != 211 || !mcTrack.isPhysicalPrimary()) + continue; + } if (!selectionPion(track)) continue; @@ -1371,7 +1401,7 @@ struct Phik0shortanalysis { PROCESS_SWITCH(Phik0shortanalysis, processRecMCClosurePhiQA, "Process for ReCMCQA and Phi in RecMCClosure", false); - void processRecMCClosurePhiK0S(SimCollisions::iterator const& collision, FullMCTracks const&, FullMCV0s const& V0s, V0DauMCTracks const&, MCCollisions const&) + void processRecMCClosurePhiK0S(SimCollisions::iterator const& collision, FullMCTracks const&, FullMCV0s const& V0s, V0DauMCTracks const&, MCCollisions const&, aod::McParticles const&) { if (!acceptEventQA(collision, false)) return; @@ -1412,13 +1442,13 @@ struct Phik0shortanalysis { // Phi reconstruction for (const auto& track1 : posThisColl) { // loop over all selected tracks - if (!selectionTrackResonance(track1) || !selectionPIDKaonpTdependent(track1)) + if (!selectionTrackResonance(track1, false) || !selectionPIDKaonpTdependent(track1)) continue; // topological and PID selection auto track1ID = track1.globalIndex(); for (const auto& track2 : negThisColl) { - if (!selectionTrackResonance(track2) || !selectionPIDKaonpTdependent(track2)) + if (!selectionTrackResonance(track2, false) || !selectionPIDKaonpTdependent(track2)) continue; // topological and PID selection auto track2ID = track2.globalIndex(); @@ -1483,7 +1513,7 @@ struct Phik0shortanalysis { PROCESS_SWITCH(Phik0shortanalysis, processRecMCClosurePhiK0S, "Process RecMC for MCClosure Phi-K0S Analysis", false); - void processRecMCClosurePhiPion(SimCollisions::iterator const& collision, FullMCTracks const& fullMCTracks, MCCollisions const&) + void processRecMCClosurePhiPion(SimCollisions::iterator const& collision, FullMCTracks const& fullMCTracks, MCCollisions const&, aod::McParticles const&) { if (!acceptEventQA(collision, false)) return; @@ -1520,13 +1550,13 @@ struct Phik0shortanalysis { // Phi reconstruction for (const auto& track1 : posThisColl) { // loop over all selected tracks - if (!selectionTrackResonance(track1) || !selectionPIDKaonpTdependent(track1)) + if (!selectionTrackResonance(track1, false) || !selectionPIDKaonpTdependent(track1)) continue; // topological and PID selection auto track1ID = track1.globalIndex(); for (const auto& track2 : negThisColl) { - if (!selectionTrackResonance(track2) || !selectionPIDKaonpTdependent(track2)) + if (!selectionTrackResonance(track2, false) || !selectionPIDKaonpTdependent(track2)) continue; // topological and PID selection auto track2ID = track2.globalIndex(); From bec9690a2ad33ec3ca46699ab7e63022147bc5f5 Mon Sep 17 00:00:00 2001 From: Nicolas Strangmann <77485327+nstrangm@users.noreply.github.com> Date: Sun, 9 Feb 2025 00:48:42 +0100 Subject: [PATCH 0114/1650] [PWGJE/EMCal,PWGEM/PhotonMeson] Add true pi0 from same gamma histogram and opening angle cut (#9815) Co-authored-by: Nicolas Strangmann --- PWGEM/Dilepton/Utils/MCUtilities.h | 8 +++ PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h | 7 ++ PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h | 17 ++++- PWGEM/PhotonMeson/Utils/NMHistograms.h | 2 + PWGJE/Tasks/emcalGammaGammaBcWise.cxx | 66 +++++++++++++++++++ 5 files changed, 99 insertions(+), 1 deletion(-) diff --git a/PWGEM/Dilepton/Utils/MCUtilities.h b/PWGEM/Dilepton/Utils/MCUtilities.h index 9bd0797259b..58484f6fe66 100644 --- a/PWGEM/Dilepton/Utils/MCUtilities.h +++ b/PWGEM/Dilepton/Utils/MCUtilities.h @@ -222,6 +222,14 @@ int FindCommonMotherFrom3Prongs(TMCParticle1 const& p1, TMCParticle2 const& p2, } //_______________________________________________________________________ template +int getMotherPDGCode(TMCParticle const& p, TMCParticles const& mcparticles) +{ + int motherid = p.mothersIds()[0]; + auto mother = mcparticles.iteratorAt(motherid); + return (mother.pdgCode()); +} +//_______________________________________________________________________ +template int IsFromBeauty(TMCParticle const& p, TMCParticles const& mcparticles) { if (!p.has_mothers()) { diff --git a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h index 03032cf5112..d26dca62045 100644 --- a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h +++ b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h @@ -639,6 +639,13 @@ struct Pi0EtaToGammaGamma { continue; } + if (pairtype == PairType::kEMCEMC) { + float openingAngle = std::acos(v1.Vect().Dot(v2.Vect()) / (v1.P() * v2.P())); + if (openingAngle < emccuts.minOpenAngle) { + continue; + } + } + fRegistry.fill(HIST("Pair/same/hs"), v12.M(), v12.Pt(), collision.weight()); if constexpr (pairtype == PairType::kEMCEMC) { diff --git a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h index d9d436f4ce9..e39d4165e4e 100644 --- a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h +++ b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h @@ -500,7 +500,7 @@ struct Pi0EtaToGammaGammaMC { pi0id = FindCommonMotherFrom2Prongs(g1mc, g2mc, 22, 22, 111, mcparticles); etaid = FindCommonMotherFrom2Prongs(g1mc, g2mc, 22, 22, 221, mcparticles); - if (pi0id < 0 && etaid < 0) { + if (g1mc.globalIndex() != g2mc.globalIndex() && pi0id < 0 && etaid < 0) { // for same gamma no pi0/eta will be found, but we still want to fill the FromSameGamma hist continue; } @@ -511,6 +511,21 @@ struct Pi0EtaToGammaGammaMC { continue; } + if (pairtype == PairType::kEMCEMC) { + float openingAngle = std::acos(v1.Vect().Dot(v2.Vect()) / (v1.P() * v2.P())); + if (openingAngle < emccuts.minOpenAngle) { + continue; + } + } + + if (g1mc.globalIndex() == g2mc.globalIndex()) { + if (getMotherPDGCode(g1mc, mcparticles) == 111) + fRegistry.fill(HIST("Pair/Pi0/hs_FromSameGamma"), v12.M(), v12.Pt(), collision.weight()); + else if (getMotherPDGCode(g1mc, mcparticles) == 221) + fRegistry.fill(HIST("Pair/Eta/hs_FromSameGamma"), v12.M(), v12.Pt(), collision.weight()); + continue; + } + if (pi0id > 0) { auto pi0mc = mcparticles.iteratorAt(pi0id); o2::aod::pwgem::photonmeson::utils::nmhistogram::fillTruePairInfo(&fRegistry, v12, pi0mc, mcparticles, mccollisions, f1fd_k0s_to_pi0, collision.weight()); diff --git a/PWGEM/PhotonMeson/Utils/NMHistograms.h b/PWGEM/PhotonMeson/Utils/NMHistograms.h index 95abaf92292..a3e62b0bc5a 100644 --- a/PWGEM/PhotonMeson/Utils/NMHistograms.h +++ b/PWGEM/PhotonMeson/Utils/NMHistograms.h @@ -48,6 +48,8 @@ void addNMHistograms(HistogramRegistry* fRegistry, bool isMC, const char* pairna fRegistry->add("Pair/Pi0/hs_Primary", "rec. true pi0", kTHnSparseD, {axis_mass, axis_pt}, true); fRegistry->add("Pair/Pi0/hs_FromWD", "rec. true pi0 from weak decay", kTHnSparseD, {axis_mass, axis_pt}, true); fRegistry->add("Pair/Pi0/hs_FromHS", "rec. true pi0 from hadronic shower in material", kTHnSparseD, {axis_mass, axis_pt}, true); + fRegistry->add("Pair/Pi0/hs_FromSameGamma", "Two clusters from same gamma that is a pi0 daughter (conversion)", kTHnSparseD, {axis_mass, axis_pt}, true); + fRegistry->add("Pair/Eta/hs_FromSameGamma", "Two clusters from same gamma that is a eta daughter (conversion)", kTHnSparseD, {axis_mass, axis_pt}, true); fRegistry->add("Pair/Eta/hs_Primary", "rec. true eta", kTHnSparseD, {axis_mass, axis_pt}, true); const AxisSpec axis_rapidity{{0.0, +0.8, +0.9}, "rapidity |y|"}; diff --git a/PWGJE/Tasks/emcalGammaGammaBcWise.cxx b/PWGJE/Tasks/emcalGammaGammaBcWise.cxx index 7e6843efaab..7007f94bc15 100644 --- a/PWGJE/Tasks/emcalGammaGammaBcWise.cxx +++ b/PWGJE/Tasks/emcalGammaGammaBcWise.cxx @@ -25,6 +25,7 @@ #include "Framework/AnalysisTask.h" #include "Framework/HistogramRegistry.h" #include "Common/DataModel/EventSelection.h" +#include "EMCALBase/Geometry.h" #include "PWGJE/DataModel/EMCALClusters.h" using namespace o2; @@ -49,6 +50,59 @@ struct Photon { // Struct to store photons (unique and ambiguous clusters that p float px, py, pz, pt; }; +/// \brief returns if cluster is too close to edge of EMCal (using rotation background method only for EMCal!) +bool IsTooCloseToEdge(const int cellID, const int DistanceToBorder = 1, emcal::Geometry* emcalGeom = nullptr) +{ + if (DistanceToBorder <= 0) { + return false; + } + if (cellID < 0) { + return true; + } + + int iBadCell = -1; + + // check distance to border in case the cell is okay + auto [iSupMod, iMod, iPhi, iEta] = emcalGeom->GetCellIndex(cellID); + auto [irow, icol] = emcalGeom->GetCellPhiEtaIndexInSModule(iSupMod, iMod, iPhi, iEta); + + // Check rows/phi + int iRowLast = 24; + if (emcalGeom->GetSMType(iSupMod) == o2::emcal::EMCALSMType::EMCAL_HALF) { + iRowLast /= 2; // 2/3 sm case + } else if (emcalGeom->GetSMType(iSupMod) == o2::emcal::EMCALSMType::EMCAL_THIRD) { + iRowLast /= 3; // 1/3 sm case + } else if (emcalGeom->GetSMType(iSupMod) == o2::emcal::EMCALSMType::DCAL_EXT) { + iRowLast /= 3; // 1/3 sm case + } + + if (irow < DistanceToBorder || (iRowLast - irow) <= DistanceToBorder) { + iBadCell = 1; + } + + if (iBadCell > 0) { + return true; + } + return false; +} + +bool isPhotonAccepted(Photon const& p, emcal::Geometry* emcalGeom = nullptr) +{ + int cellID = 0; + try { + cellID = emcalGeom->GetAbsCellIdFromEtaPhi(p.eta, p.phi); + if (IsTooCloseToEdge(cellID, 1, emcalGeom)) + cellID = -1; + } catch (o2::emcal::InvalidPositionException& e) { + cellID = -1; + } + + if (cellID == -1) + return false; + + return true; +} + struct Meson { Meson(Photon p1, Photon p2) : p1(p1), p2(p2) { @@ -65,20 +119,26 @@ struct Meson { struct EmcalGammaGammaBcWise { HistogramRegistry mHistManager{"EmcalGammaGammaBcWiseHistograms"}; + Configurable cfgClusterDefinition{"cfgClusterDefinition", 13, "Clusterizer to be selected, e.g. 13 for kV3MostSplitLowSeed"}; Configurable cfgMinClusterEnergy{"cfgMinClusterEnergy", 0.7, "Minimum energy of selected clusters (GeV)"}; Configurable cfgMinM02{"cfgMinM02", 0.1, "Minimum M02 of selected clusters"}; Configurable cfgMaxM02{"cfgMaxM02", 0.7, "Maximum M02 of selected clusters"}; Configurable cfgMinTime{"cfgMinTime", -15, "Minimum time of selected clusters (ns)"}; Configurable cfgMaxTime{"cfgMaxTime", 15, "Maximum time of selected clusters (ns)"}; + Configurable cfgMinOpenAngle{"cfgMinOpenAngle", 0.0202, "Minimum opening angle between photons"}; + Filter clusterDefinitionFilter = aod::emcalcluster::definition == cfgClusterDefinition; Filter energyFilter = aod::emcalcluster::energy > cfgMinClusterEnergy; Filter m02Filter = (aod::emcalcluster::nCells == 1 || (aod::emcalcluster::m02 > cfgMinM02 && aod::emcalcluster::m02 < cfgMaxM02)); Filter timeFilter = (aod::emcalcluster::time > cfgMinTime && aod::emcalcluster::time < cfgMaxTime); std::vector mPhotons; + emcal::Geometry* emcalGeom; + void init(InitContext const&) { + emcalGeom = emcal::Geometry::GetInstanceFromRunNumber(300000); mHistManager.add("nBCs", "Number of BCs (with (k)TVX);#bf{TVX triggered};#bf{#it{N}_{BCs}}", HistType::kTH1F, {{3, -0.5, 2.5}}); mHistManager.add("nCollisionsVsClusters", "Number of collisions vs number of clusters;N_{Collisions};N_{Clusters}", HistType::kTH2F, {{4, -0.5, 3.5}, {21, -0.5, 20.5}}); @@ -149,6 +209,8 @@ struct EmcalGammaGammaBcWise { for (unsigned int ig1 = 0; ig1 < mPhotons.size(); ++ig1) { for (unsigned int ig2 = ig1 + 1; ig2 < mPhotons.size(); ++ig2) { // build meson from photons + if (mPhotons[ig1].photon.Angle(mPhotons[ig2].photon.Vect()) < cfgMinOpenAngle) + continue; Meson meson(mPhotons[ig1], mPhotons[ig2]); mHistManager.fill(HIST("invMassVsPt"), meson.m(), meson.pT()); @@ -171,6 +233,10 @@ struct EmcalGammaGammaBcWise { TLorentzVector lvRotationPhoton(mPhotons[ig].px, mPhotons[ig].py, mPhotons[ig].pz, mPhotons[ig].e); lvRotationPhoton.Rotate(constants::math::PIHalf, lvRotationPion); Photon rotPhoton(lvRotationPhoton.Eta(), lvRotationPhoton.Phi(), lvRotationPhoton.E()); + if (!isPhotonAccepted(rotPhoton, emcalGeom)) + continue; + if (rotPhoton.photon.Angle(mPhotons[ig3].photon.Vect()) < cfgMinOpenAngle) + continue; Meson mesonRotated(rotPhoton, mPhotons[ig3]); mHistManager.fill(HIST("invMassVsPtBackground"), mesonRotated.m(), mesonRotated.pT()); } From a1bb8defc8e0f7481c7658a447e7581d2ec96258 Mon Sep 17 00:00:00 2001 From: victorvalenciatorres <118812999+victorvalenciatorres@users.noreply.github.com> Date: Sun, 9 Feb 2025 18:04:13 +0100 Subject: [PATCH 0115/1650] [PWGDQ] Adding correlators of dimuons mixed (#9843) --- PWGDQ/Core/HistogramsLibrary.cxx | 10 ++++++++++ PWGDQ/Core/VarManager.cxx | 34 ++++++++++++++++++++++++++++++++ PWGDQ/Core/VarManager.h | 30 ++++++++++++++++++++++++++++ PWGDQ/Tasks/tableReader.cxx | 12 +++++++++-- 4 files changed, 84 insertions(+), 2 deletions(-) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 9e2856ab792..8471c1079af 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -1082,6 +1082,16 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V2ME_SP", "Mass_Pt_CentFT0C_V2ME_SP", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV2ME_SP, VarManager::kWV2ME_SP); hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V2ME_EP", "Mass_Pt_CentFT0C_V2ME_EP", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV2ME_EP, VarManager::kWV2ME_EP); } + if (subGroupStr.Contains("cumulantme")) { + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_M11REFoverMpME", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 9, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kM11REFoverMpME); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_M1111REFoverMpME", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 9, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kM1111REFoverMpME); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_M01POIoverMpME", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 9, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kM01POIoverMpME); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_M0111POIoverMpME", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 9, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kM0111POIoverMpME); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2REFME", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 9, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR2REFbydimuonsME, VarManager::kM11REFoverMpME); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr4REFME", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 9, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR4REFbydimuonsME, VarManager::kM1111REFoverMpME); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2POIME", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 9, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR2POIME, VarManager::kM01POIoverMpME); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr4POIME", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 9, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR4POIME, VarManager::kM0111POIoverMpME); + } if (subGroupStr.Contains("dimuon-polarization-he")) { int varspTHE[4] = {VarManager::kMass, VarManager::kPt, VarManager::kCosThetaHE, VarManager::kPhiHE}; int varsrapHE[4] = {VarManager::kMass, VarManager::kRap, VarManager::kCosThetaHE, VarManager::kPhiHE}; diff --git a/PWGDQ/Core/VarManager.cxx b/PWGDQ/Core/VarManager.cxx index 975fbf5a2ca..cd1836753b5 100644 --- a/PWGDQ/Core/VarManager.cxx +++ b/PWGDQ/Core/VarManager.cxx @@ -294,6 +294,8 @@ void VarManager::SetDefaultVarNames() fgVariableUnits[kMultTracklets] = ""; fgVariableNames[kMultDimuons] = "Multiplicity Dimuons Unlike Sign"; fgVariableUnits[kMultDimuons] = ""; + fgVariableNames[kMultDimuonsME] = "Multiplicity Dimuons Unlike Sign Mixed Events"; + fgVariableUnits[kMultDimuonsME] = ""; fgVariableNames[kCentFT0C] = "Centrality FT0C"; fgVariableUnits[kCentFT0C] = "%"; fgVariableNames[kMCEventGeneratorId] = "MC Generator ID"; @@ -887,6 +889,26 @@ void VarManager::SetDefaultVarNames() fgVariableUnits[kM1111REFoverMpplus] = ""; fgVariableNames[kM1111REFoverMpminus] = "M^{-}_{1111}^{REF}/M^{-}_{p} "; fgVariableUnits[kM1111REFoverMpminus] = ""; + fgVariableNames[kM01POIME] = "M_{01}^{POI, ME}"; + fgVariableUnits[kM01POIME] = ""; + fgVariableNames[kM0111POIME] = "M_{0111}^{POI, ME}"; + fgVariableUnits[kM0111POIME] = ""; + fgVariableNames[kCORR2POIME] = "CORR2^{POI, ME}"; + fgVariableUnits[kCORR2POIME] = ""; + fgVariableNames[kCORR4POIME] = "CORR4^{POI, ME}"; + fgVariableUnits[kCORR4POIME] = ""; + fgVariableNames[kM01POIoverMpME] = "M_{01}^{POI, ME} / M_p"; + fgVariableUnits[kM01POIoverMpME] = ""; + fgVariableNames[kM0111POIoverMpME] = "M_{0111}^{POI, ME} / M_p"; + fgVariableUnits[kM0111POIoverMpME] = ""; + fgVariableNames[kM11REFoverMpME] = "M_{11}^{REF} / M_p"; + fgVariableUnits[kM11REFoverMpME] = ""; + fgVariableNames[kM1111REFoverMpME] = "M_{1111}^{REF} / M_p"; + fgVariableUnits[kM1111REFoverMpME] = ""; + fgVariableNames[kCORR2REFbydimuonsME] = "CORR2^{REF} / dimuons ME"; + fgVariableUnits[kCORR2REFbydimuonsME] = ""; + fgVariableNames[kCORR4REFbydimuonsME] = "CORR4^{REF} / dimuons ME"; + fgVariableUnits[kCORR4REFbydimuonsME] = ""; fgVariableNames[kCos2DeltaPhi] = "cos 2(#varphi-#Psi_{2}^{A}) "; fgVariableUnits[kCos2DeltaPhi] = ""; fgVariableNames[kCos3DeltaPhi] = "cos 3(#varphi-#Psi_{3}^{A}) "; @@ -1096,6 +1118,7 @@ void VarManager::SetDefaultVarNames() fgVarNamesMap["kMultZNC"] = kMultZNC; fgVarNamesMap["kMultTracklets"] = kMultTracklets; fgVarNamesMap["kMultDimuons"] = kMultDimuons; + fgVarNamesMap["kMultDimuonsME"] = kMultDimuonsME; fgVarNamesMap["kMultNTracksHasITS"] = kMultNTracksHasITS; fgVarNamesMap["kMultNTracksHasTPC"] = kMultNTracksHasTPC; fgVarNamesMap["kMultNTracksHasTOF"] = kMultNTracksHasTOF; @@ -1560,6 +1583,17 @@ void VarManager::SetDefaultVarNames() fgVarNamesMap["kM0111POIoverMp"] = kM0111POIoverMp; fgVarNamesMap["kCORR2POIMp"] = kCORR2POIMp; fgVarNamesMap["kCORR4POIMp"] = kCORR4POIMp; + fgVarNamesMap["kM01POIME"] = kM01POIME; + fgVarNamesMap["kMultDimuonsME"] = kMultDimuonsME; + fgVarNamesMap["kM0111POIME"] = kM0111POIME; + fgVarNamesMap["kCORR2POIME"] = kCORR2POIME; + fgVarNamesMap["kCORR4POIME"] = kCORR4POIME; + fgVarNamesMap["kM01POIoverMpME"] = kM01POIoverMpME; + fgVarNamesMap["kM0111POIoverMpME"] = kM0111POIoverMpME; + fgVarNamesMap["kM11REFoverMpME"] = kM11REFoverMpME; + fgVarNamesMap["kM1111REFoverMpME"] = kM1111REFoverMpME; + fgVarNamesMap["kCORR2REFbydimuonsME"] = kCORR2REFbydimuonsME; + fgVarNamesMap["kCORR4REFbydimuonsME"] = kCORR4REFbydimuonsME; fgVarNamesMap["kR2SP"] = kR2SP; fgVarNamesMap["kR2EP"] = kR2EP; fgVarNamesMap["kPsi2A"] = kPsi2A; diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index ee5a1dd33e2..9e7e1cf5621 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -707,6 +707,17 @@ class VarManager : public TObject kM1111REFoverMpplus, kM11REFoverMpminus, kM1111REFoverMpminus, + kM01POIME, + kMultDimuonsME, + kM0111POIME, + kCORR2POIME, + kCORR4POIME, + kM01POIoverMpME, + kM0111POIoverMpME, + kM11REFoverMpME, + kM1111REFoverMpME, + kCORR2REFbydimuonsME, + kCORR4REFbydimuonsME, kR2SP, kR2EP, kPsi2A, @@ -3023,6 +3034,25 @@ void VarManager::FillPairME(T1 const& t1, T2 const& t2, float* values) values[kWV2ME_SP] = std::isnan(V2ME_SP) || std::isinf(V2ME_SP) ? 0. : 1.0; values[kV2ME_EP] = std::isnan(V2ME_EP) || std::isinf(V2ME_EP) ? 0. : V2ME_EP; values[kWV2ME_EP] = std::isnan(V2ME_EP) || std::isinf(V2ME_EP) ? 0. : 1.0; + + if constexpr ((fillMap & ReducedEventQvectorExtra) > 0) { + complex Q21(values[kQ2X0A] * values[kS11A], values[kQ2Y0A] * values[kS11A]); + complex Q42(values[kQ42XA], values[kQ42YA]); + complex Q23(values[kQ23XA], values[kQ23YA]); + complex P2(TMath::Cos(2 * v12.Phi()), TMath::Sin(2 * v12.Phi())); + values[kM01POIME] = values[kMultDimuonsME] * values[kS11A]; + values[kM0111POIME] = values[kMultDimuonsME] * (values[kS31A] - 3. * values[kS11A] * values[kS12A] + 2. * values[kS13A]); + values[kCORR2POIME] = (P2 * conj(Q21)).real() / values[kM01POIME]; + values[kCORR4POIME] = (P2 * Q21 * conj(Q21) * conj(Q21) - P2 * Q21 * conj(Q42) - 2. * values[kS12A] * P2 * conj(Q21) + 2. * P2 * conj(Q23)).real() / values[kM0111POIME]; + values[kM01POIoverMpME] = values[kMultDimuonsME] > 0 && !(std::isnan(values[kM01POIME]) || std::isinf(values[kM01POIME]) || std::isnan(values[kCORR2POIME]) || std::isinf(values[kCORR2POIME]) || std::isnan(values[kM0111POIME]) || std::isinf(values[kM0111POIME]) || std::isnan(values[kCORR4POIME]) || std::isinf(values[kCORR4POIME])) ? values[kM01POIME] / values[kMultDimuonsME] : 0; + values[kM0111POIoverMpME] = values[kMultDimuonsME] > 0 && !(std::isnan(values[kM0111POIME]) || std::isinf(values[kM0111POIME]) || std::isnan(values[kCORR4POIME]) || std::isinf(values[kCORR4POIME]) || std::isnan(values[kM01POIME]) || std::isinf(values[kM01POIME]) || std::isnan(values[kCORR2POIME]) || std::isinf(values[kCORR2POIME])) ? values[kM0111POIME] / values[kMultDimuonsME] : 0; + values[kM11REFoverMpME] = values[kMultDimuonsME] > 0 && !(std::isnan(values[kM11REF]) || std::isinf(values[kM11REF]) || std::isnan(values[kCORR2REF]) || std::isinf(values[kCORR2REF]) || std::isnan(values[kM1111REF]) || std::isinf(values[kM1111REF]) || std::isnan(values[kCORR4REF]) || std::isinf(values[kCORR4REF])) ? values[kM11REF] / values[kMultDimuonsME] : 0; + values[kM1111REFoverMpME] = values[kMultDimuonsME] > 0 && !(std::isnan(values[kM1111REF]) || std::isinf(values[kM1111REF]) || std::isnan(values[kCORR4REF]) || std::isinf(values[kCORR4REF]) || std::isnan(values[kM11REF]) || std::isinf(values[kM11REF]) || std::isnan(values[kCORR2REF]) || std::isinf(values[kCORR2REF])) ? values[kM1111REF] / values[kMultDimuonsME] : 0; + values[kCORR2REFbydimuonsME] = std::isnan(values[kM11REFoverMpME]) || std::isinf(values[kM11REFoverMpME]) || std::isnan(values[kCORR2REF]) || std::isinf(values[kCORR2REF]) || std::isnan(values[kM1111REFoverMpME]) || std::isinf(values[kM1111REFoverMpME]) || std::isnan(values[kCORR4REF]) || std::isinf(values[kCORR4REF]) ? 0 : values[kCORR2REF]; + values[kCORR4REFbydimuonsME] = std::isnan(values[kM1111REFoverMpME]) || std::isinf(values[kM1111REFoverMpME]) || std::isnan(values[kCORR4REF]) || std::isinf(values[kCORR4REF]) || std::isnan(values[kM11REFoverMpME]) || std::isinf(values[kM11REFoverMpME]) || std::isnan(values[kCORR2REF]) || std::isinf(values[kCORR2REF]) ? 0 : values[kCORR4REF]; + values[kCORR2POIME] = std::isnan(values[kCORR2POIME]) || std::isinf(values[kCORR2POIME]) || std::isnan(values[kM01POIME]) || std::isinf(values[kM01POIME]) || std::isnan(values[kCORR4POIME]) || std::isinf(values[kCORR4POIME]) || std::isnan(values[kM0111POIME]) || std::isinf(values[kM0111POIME]) ? 0 : values[kCORR2POIME]; + values[kCORR4POIME] = std::isnan(values[kCORR4POIME]) || std::isinf(values[kCORR4POIME]) || std::isnan(values[kM0111POIME]) || std::isinf(values[kM0111POIME]) || std::isnan(values[kCORR2POIME]) || std::isinf(values[kCORR2POIME]) || std::isnan(values[kM01POIME]) || std::isinf(values[kM01POIME]) ? 0 : values[kCORR4POIME]; + } } if constexpr (pairType == kDecayToMuMu) { if (fgUsedVars[kQuadDCAabsXY]) { diff --git a/PWGDQ/Tasks/tableReader.cxx b/PWGDQ/Tasks/tableReader.cxx index 9d925838705..24b308808c3 100644 --- a/PWGDQ/Tasks/tableReader.cxx +++ b/PWGDQ/Tasks/tableReader.cxx @@ -106,7 +106,7 @@ using MyEventsQvectorCentr = soa::Join; using MyEventsQvectorExtra = soa::Join; using MyEventsHashSelectedQvector = soa::Join; -using MyEventsHashSelectedQvectorExtra = soa::Join; +using MyEventsHashSelectedQvectorExtra = soa::Join; using MyEventsHashSelectedQvectorCentr = soa::Join; using MyBarrelTracks = soa::Join; @@ -701,7 +701,7 @@ struct AnalysisEventMixing { } } } - if (context.mOptions.get("processMuonSkimmed") || context.mOptions.get("processMuonVnSkimmed") || context.mOptions.get("processMuonVnCentrSkimmed")) { + if (context.mOptions.get("processMuonSkimmed") || context.mOptions.get("processMuonVnSkimmed") || context.mOptions.get("processMuonVnCentrSkimmed") || context.mOptions.get("processMuonVnExtraSkimmed")) { TString cutNames = fConfigMuonCuts.value; if (!cutNames.IsNull()) { std::unique_ptr objArray(cutNames.Tokenize(",")); @@ -762,6 +762,7 @@ struct AnalysisEventMixing { } uint32_t twoTrackFilter = 0; + uint32_t mult_dimuons = 0; for (auto& track1 : tracks1) { for (auto& track2 : tracks2) { if constexpr (TPairType == VarManager::kDecayToEE) { @@ -782,6 +783,7 @@ struct AnalysisEventMixing { for (unsigned int icut = 0; icut < ncuts; icut++) { if (twoTrackFilter & (static_cast(1) << icut)) { if (track1.sign() * track2.sign() < 0) { + mult_dimuons++; fHistMan->FillHistClass(histNames[icut][0].Data(), VarManager::fgValues); if (fConfigAmbiguousHist && !(track1.isAmbiguous() || track2.isAmbiguous())) { fHistMan->FillHistClass(Form("%s_unambiguous", histNames[icut][0].Data()), VarManager::fgValues); @@ -803,6 +805,7 @@ struct AnalysisEventMixing { } // end for (cuts) } // end for (track2) } // end for (track1) + VarManager::fgValues[VarManager::kMultDimuonsME] = mult_dimuons; } // barrel-barrel and muon-muon event mixing @@ -906,6 +909,10 @@ struct AnalysisEventMixing { { runSameSide(events, muons, perEventsSelectedM); } + void processMuonVnExtraSkimmed(soa::Filtered& events, soa::Filtered const& muons) + { + runSameSide(events, muons, perEventsSelectedM); + } // TODO: This is a dummy process function for the case when the user does not want to run any of the process functions (no event mixing) // If there is no process function enabled, the workflow hangs void processDummy(MyEvents&) @@ -919,6 +926,7 @@ struct AnalysisEventMixing { PROCESS_SWITCH(AnalysisEventMixing, processBarrelVnSkimmed, "Run barrel-barrel vn mixing on skimmed tracks", false); PROCESS_SWITCH(AnalysisEventMixing, processMuonVnSkimmed, "Run muon-muon vn mixing on skimmed tracks", false); PROCESS_SWITCH(AnalysisEventMixing, processMuonVnCentrSkimmed, "Run muon-muon vn mixing on skimmed tracks from central framework", false); + PROCESS_SWITCH(AnalysisEventMixing, processMuonVnExtraSkimmed, "Run muon-muon vn mixing on skimmed tracks from GFW", false); PROCESS_SWITCH(AnalysisEventMixing, processDummy, "Dummy function", false); }; From 99a3818856f76893db94ea44b0845356bff7fa26 Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Mon, 10 Feb 2025 04:16:42 +0800 Subject: [PATCH 0116/1650] [PWGCF] flowMc, flowTask: small fix (#9841) --- PWGCF/Flow/Tasks/flowMc.cxx | 2 +- PWGCF/Flow/Tasks/flowTask.cxx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowMc.cxx b/PWGCF/Flow/Tasks/flowMc.cxx index 18593cdd34b..ab3eee0daab 100644 --- a/PWGCF/Flow/Tasks/flowMc.cxx +++ b/PWGCF/Flow/Tasks/flowMc.cxx @@ -149,7 +149,7 @@ struct FlowMc { using RecoTracks = soa::Join; - void process(aod::McCollision const& mcCollision, soa::Join const& mcParticles, RecoTracks const&) + void process(aod::McCollision const& mcCollision, aod::BCsWithTimestamps const&, soa::Join const& mcParticles, RecoTracks const&) { float imp = mcCollision.impactParameter(); diff --git a/PWGCF/Flow/Tasks/flowTask.cxx b/PWGCF/Flow/Tasks/flowTask.cxx index 2acf6108226..c652b8245c1 100644 --- a/PWGCF/Flow/Tasks/flowTask.cxx +++ b/PWGCF/Flow/Tasks/flowTask.cxx @@ -368,8 +368,8 @@ struct FlowTask { fGFW->AddRegion("poiN", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 2); fGFW->AddRegion("poiN10", -0.8, -0.5, 1 + fPtAxis->GetNbins(), 2); fGFW->AddRegion("poifull", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 2); - fGFW->AddRegion("olN", -0.8, -0.4, 1, 4); - fGFW->AddRegion("olN10", -0.8, -0.5, 1, 4); + fGFW->AddRegion("olN", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 4); + fGFW->AddRegion("olN10", -0.8, -0.5, 1 + fPtAxis->GetNbins(), 4); fGFW->AddRegion("olfull", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 4); corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {2 -2}", "ChFull22", kFALSE)); From 4f09e357ad272a3cff1877d40508854bf474e997 Mon Sep 17 00:00:00 2001 From: prottayCMT <61418725+prottayCMT@users.noreply.github.com> Date: Sun, 9 Feb 2025 21:32:46 +0100 Subject: [PATCH 0117/1650] [PWGLF] added v2 calculation and using full plane with modified qvec after SC (#9836) Co-authored-by: Prottay Das --- PWGLF/Tasks/Strangeness/lambdapolsp.cxx | 117 ++++++++++++++++++------ 1 file changed, 89 insertions(+), 28 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdapolsp.cxx b/PWGLF/Tasks/Strangeness/lambdapolsp.cxx index 7a1a84582ab..cc9106b3d61 100644 --- a/PWGLF/Tasks/Strangeness/lambdapolsp.cxx +++ b/PWGLF/Tasks/Strangeness/lambdapolsp.cxx @@ -79,6 +79,8 @@ struct lambdapolsp { Configurable additionalEvSel3{"additionalEvSel3", false, "additionalEvSel3"}; Configurable additionalEvSel4{"additionalEvSel4", false, "additionalEvSel4"}; Configurable globalpt{"globalpt", true, "select tracks based on pt global vs tpc"}; + Configurable cqvas{"cqvas", false, "change q vectors after shift correction"}; + Configurable useonlypsis{"useonlypsis", true, "use only psis to calculate total spectator plane angle"}; Configurable useprofile{"useprofile", 3, "flag to select profile vs Sparse"}; Configurable QxyNbins{"QxyNbins", 100, "Number of bins in QxQy histograms"}; Configurable lbinQxy{"lbinQxy", -5.0, "lower bin value in QxQy histograms"}; @@ -178,22 +180,31 @@ struct lambdapolsp { histos.add("hpuxyQxypvscentpteta", "hpuxyQxypvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); histos.add("hpoddv1vscentpteta", "hpoddv1vscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); histos.add("hpevenv1vscentpteta", "hpevenv1vscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - - histos.add("hppxvscentpteta", "hppxvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, pxAxis}, true); + histos.add("hpv21", "hpv21", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpv22", "hpv22", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpv23", "hpv23", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpx2Tx1Ax1Cvscentpteta", "hpx2Tx1Ax1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpx2Ty1Ay1Cvscentpteta", "hpx2Ty1Ay1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpy2Tx1Ay1Cvscentpteta", "hpy2Tx1Ay1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpy2Ty1Ax1Cvscentpteta", "hpy2Ty1Ax1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpx1Ax1Cvscentpteta", "hpx1Ax1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpy1Ay1Cvscentpteta", "hpy1Ay1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); histos.add("hpuxvscentpteta", "hpuxvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); histos.add("hpuyvscentpteta", "hpuyvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpuxvscentptetaneg", "hpuxvscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpuyvscentptetaneg", "hpuyvscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - - histos.add("hpuxQxpvscentptetaneg", "hpuxQxpvscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpuyQypvscentptetaneg", "hpuyQypvscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpuxQxtvscentptetaneg", "hpuxQxtvscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpuyQytvscentptetaneg", "hpuyQytvscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpuxyQxytvscentptetaneg", "hpuxyQxytvscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpuxyQxypvscentptetaneg", "hpuxyQxypvscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpoddv1vscentptetaneg", "hpoddv1vscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpevenv1vscentptetaneg", "hpevenv1vscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + /* + histos.add("hpuxvscentptetaneg", "hpuxvscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpuyvscentptetaneg", "hpuyvscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + + histos.add("hpuxQxpvscentptetaneg", "hpuxQxpvscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpuyQypvscentptetaneg", "hpuyQypvscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpuxQxtvscentptetaneg", "hpuxQxtvscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpuyQytvscentptetaneg", "hpuyQytvscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpuxyQxytvscentptetaneg", "hpuxyQxytvscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpuxyQxypvscentptetaneg", "hpuxyQxypvscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpoddv1vscentptetaneg", "hpoddv1vscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpevenv1vscentptetaneg", "hpevenv1vscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + */ histos.add("hpQxtQxpvscent", "hpQxtQxpvscent", HistType::kTHnSparseF, {centAxis, spAxis}, true); histos.add("hpQytQypvscent", "hpQytQypvscent", HistType::kTHnSparseF, {centAxis, spAxis}, true); @@ -217,7 +228,7 @@ struct lambdapolsp { histos.add("hpuxvscentpteta", "hpuxvscentpteta", HistType::kTHnSparseF, {configcentAxis, configthnAxispT, configetaAxis, spAxis}, true); histos.add("hpuyvscentpteta", "hpuyvscentpteta", HistType::kTHnSparseF, {configcentAxis, configthnAxispT, configetaAxis, spAxis}, true); - histos.add("hpuxvscentptetaneg", "hpuxvscentptetaneg", HistType::kTHnSparseF, {configcentAxis, configthnAxispT, configetaAxis, spAxis}, true); + /*histos.add("hpuxvscentptetaneg", "hpuxvscentptetaneg", HistType::kTHnSparseF, {configcentAxis, configthnAxispT, configetaAxis, spAxis}, true); histos.add("hpuyvscentptetaneg", "hpuyvscentptetaneg", HistType::kTHnSparseF, {configcentAxis, configthnAxispT, configetaAxis, spAxis}, true); histos.add("hpuxQxpvscentptetaneg", "hpuxQxpvscentptetaneg", HistType::kTHnSparseF, {configcentAxis, configthnAxispT, configetaAxis, spAxis}, true); @@ -227,7 +238,7 @@ struct lambdapolsp { histos.add("hpuxyQxytvscentptetaneg", "hpuxyQxytvscentptetaneg", HistType::kTHnSparseF, {configcentAxis, configthnAxispT, configetaAxis, spAxis}, true); histos.add("hpuxyQxypvscentptetaneg", "hpuxyQxypvscentptetaneg", HistType::kTHnSparseF, {configcentAxis, configthnAxispT, configetaAxis, spAxis}, true); histos.add("hpoddv1vscentptetaneg", "hpoddv1vscentptetaneg", HistType::kTHnSparseF, {configcentAxis, configthnAxispT, configetaAxis, spAxis}, true); - histos.add("hpevenv1vscentptetaneg", "hpevenv1vscentptetaneg", HistType::kTHnSparseF, {configcentAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpevenv1vscentptetaneg", "hpevenv1vscentptetaneg", HistType::kTHnSparseF, {configcentAxis, configthnAxispT, configetaAxis, spAxis}, true);*/ histos.add("hpQxtQxpvscent", "hpQxtQxpvscent", HistType::kTHnSparseF, {configcentAxis, spAxis}, true); histos.add("hpQytQypvscent", "hpQytQypvscent", HistType::kTHnSparseF, {configcentAxis, spAxis}, true); @@ -256,10 +267,10 @@ struct lambdapolsp { // histos.add("hVtxZ", "Vertex distribution in Z;Z (cm)", kTH1F, {{20, -10.0, 10.0}}); histos.add("hpRes", "hpRes", HistType::kTHnSparseF, {configcentAxis, thnAxisres}); histos.add("hpResSin", "hpResSin", HistType::kTHnSparseF, {configcentAxis, thnAxisres}); - histos.add("hpCosPsiA", "hpCosPsiA", HistType::kTHnSparseF, {configcentAxis, thnAxisres}); + /*histos.add("hpCosPsiA", "hpCosPsiA", HistType::kTHnSparseF, {configcentAxis, thnAxisres}); histos.add("hpCosPsiC", "hpCosPsiC", HistType::kTHnSparseF, {configcentAxis, thnAxisres}); histos.add("hpSinPsiA", "hpSinPsiA", HistType::kTHnSparseF, {configcentAxis, thnAxisres}); - histos.add("hpSinPsiC", "hpSinPsiC", HistType::kTHnSparseF, {configcentAxis, thnAxisres}); + histos.add("hpSinPsiC", "hpSinPsiC", HistType::kTHnSparseF, {configcentAxis, thnAxisres});*/ /*histos.add("hcentQxZDCA", "hcentQxZDCA", kTH2F, {{centAxis}, {qxZDCAxis}}); histos.add("hcentQyZDCA", "hcentQyZDCA", kTH2F, {{centAxis}, {qxZDCAxis}}); histos.add("hcentQxZDCC", "hcentQxZDCC", kTH2F, {{centAxis}, {qxZDCAxis}}); @@ -269,13 +280,19 @@ struct lambdapolsp { histos.add("hSparseLambdaSinPsiA", "hSparseLambdaSinPsiA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); histos.add("hSparseLambdaCosPsiC", "hSparseLambdaCosPsiC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); histos.add("hSparseLambdaSinPsiC", "hSparseLambdaSinPsiC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); + histos.add("hSparseLambdaCosPsi", "hSparseLambdaCosPsi", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); + histos.add("hSparseLambdaSinPsi", "hSparseLambdaSinPsi", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); histos.add("hSparseAntiLambdaCosPsiA", "hSparseAntiLambdaCosPsiA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); histos.add("hSparseAntiLambdaSinPsiA", "hSparseAntiLambdaSinPsiA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); histos.add("hSparseAntiLambdaCosPsiC", "hSparseAntiLambdaCosPsiC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); histos.add("hSparseAntiLambdaSinPsiC", "hSparseAntiLambdaSinPsiC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); + histos.add("hSparseAntiLambdaCosPsi", "hSparseAntiLambdaCosPsi", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); + histos.add("hSparseAntiLambdaSinPsi", "hSparseAntiLambdaSinPsi", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); + histos.add("hSparseLambdaPol", "hSparseLambdaPol", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); histos.add("hSparseLambdaPolA", "hSparseLambdaPolA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); histos.add("hSparseLambdaPolC", "hSparseLambdaPolC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); + histos.add("hSparseAntiLambdaPol", "hSparseAntiLambdaPol", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); histos.add("hSparseAntiLambdaPolA", "hSparseAntiLambdaPolA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); histos.add("hSparseAntiLambdaPolC", "hSparseAntiLambdaPolC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); @@ -461,7 +478,7 @@ struct lambdapolsp { void fillHistograms(bool tag1, bool tag2, const ROOT::Math::PxPyPzMVector& particle, const ROOT::Math::PxPyPzMVector& daughter, - double psiZDCC, double psiZDCA, double centrality, + double psiZDCC, double psiZDCA, double psiZDC, double centrality, double candmass, double candpt, double candeta) { @@ -470,10 +487,12 @@ struct lambdapolsp { auto phiangle = TMath::ATan2(fourVecDauCM.Py(), fourVecDauCM.Px()); auto phiminuspsiC = GetPhiInRange(phiangle - psiZDCC); auto phiminuspsiA = GetPhiInRange(phiangle - psiZDCA); + auto phiminuspsi = GetPhiInRange(phiangle - psiZDC); auto cosThetaStar = fourVecDauCM.Pz() / fourVecDauCM.P(); auto sinThetaStar = TMath::Sqrt(1 - (cosThetaStar * cosThetaStar)); auto PolC = TMath::Sin(phiminuspsiC); auto PolA = TMath::Sin(phiminuspsiA); + auto Pol = TMath::Sin(phiminuspsi); auto sinPhiStar = TMath::Sin(GetPhiInRange(phiangle)); auto cosPhiStar = TMath::Cos(GetPhiInRange(phiangle)); @@ -486,9 +505,12 @@ struct lambdapolsp { histos.fill(HIST("hSparseAntiLambdaCosPsiC"), candmass, candpt, candeta, (TMath::Cos(GetPhiInRange(psiZDCC))), centrality); histos.fill(HIST("hSparseAntiLambdaSinPsiA"), candmass, candpt, candeta, (TMath::Sin(GetPhiInRange(psiZDCA))), centrality); histos.fill(HIST("hSparseAntiLambdaSinPsiC"), candmass, candpt, candeta, (TMath::Sin(GetPhiInRange(psiZDCC))), centrality); + histos.fill(HIST("hSparseAntiLambdaCosPsi"), candmass, candpt, candeta, (TMath::Cos(GetPhiInRange(psiZDC))), centrality); + histos.fill(HIST("hSparseAntiLambdaSinPsi"), candmass, candpt, candeta, (TMath::Sin(GetPhiInRange(psiZDC))), centrality); histos.fill(HIST("hSparseAntiLambdaPolA"), candmass, candpt, candeta, PolA, centrality); histos.fill(HIST("hSparseAntiLambdaPolC"), candmass, candpt, candeta, PolC, centrality); + histos.fill(HIST("hSparseAntiLambdaPol"), candmass, candpt, candeta, Pol, centrality); histos.fill(HIST("hSparseAntiLambda_corr1a"), candmass, candpt, candeta, sinPhiStar, centrality); histos.fill(HIST("hSparseAntiLambda_corr1b"), candmass, candpt, candeta, cosPhiStar, centrality); histos.fill(HIST("hSparseAntiLambda_corr1c"), candmass, candpt, candeta, phiphiStar, centrality); @@ -500,9 +522,12 @@ struct lambdapolsp { histos.fill(HIST("hSparseLambdaCosPsiC"), candmass, candpt, candeta, (TMath::Cos(GetPhiInRange(psiZDCC))), centrality); histos.fill(HIST("hSparseLambdaSinPsiA"), candmass, candpt, candeta, (TMath::Sin(GetPhiInRange(psiZDCA))), centrality); histos.fill(HIST("hSparseLambdaSinPsiC"), candmass, candpt, candeta, (TMath::Sin(GetPhiInRange(psiZDCC))), centrality); + histos.fill(HIST("hSparseLambdaCosPsi"), candmass, candpt, candeta, (TMath::Cos(GetPhiInRange(psiZDC))), centrality); + histos.fill(HIST("hSparseLambdaSinPsi"), candmass, candpt, candeta, (TMath::Sin(GetPhiInRange(psiZDC))), centrality); histos.fill(HIST("hSparseLambdaPolA"), candmass, candpt, candeta, PolA, centrality); histos.fill(HIST("hSparseLambdaPolC"), candmass, candpt, candeta, PolC, centrality); + histos.fill(HIST("hSparseLambdaPol"), candmass, candpt, candeta, Pol, centrality); histos.fill(HIST("hSparseLambda_corr1a"), candmass, candpt, candeta, sinPhiStar, centrality); histos.fill(HIST("hSparseLambda_corr1b"), candmass, candpt, candeta, cosPhiStar, centrality); histos.fill(HIST("hSparseLambda_corr1c"), candmass, candpt, candeta, phiphiStar, centrality); @@ -597,15 +622,27 @@ struct lambdapolsp { auto psiZDCC = collision.psiZDCC(); auto psiZDCA = collision.psiZDCA(); + if (cqvas) { + qxZDCA = TMath::Sqrt((qxZDCA * qxZDCA) + (qyZDCA * qyZDCA)) * TMath::Cos(psiZDCA); + qyZDCA = TMath::Sqrt((qxZDCA * qxZDCA) + (qyZDCA * qyZDCA)) * TMath::Sin(psiZDCA); + qxZDCC = TMath::Sqrt((qxZDCC * qxZDCC) + (qyZDCC * qyZDCC)) * TMath::Cos(psiZDCC); + qyZDCC = TMath::Sqrt((qxZDCC * qxZDCC) + (qyZDCC * qyZDCC)) * TMath::Sin(psiZDCC); + } + + auto psiZDC = TMath::ATan2((qyZDCC - qyZDCA), (qxZDCC - qxZDCA)); // full event plane + if (useonlypsis) { + psiZDC = psiZDCC - psiZDCA; + } + histos.fill(HIST("hCentrality"), centrality); if (!checkwithpub) { // histos.fill(HIST("hVtxZ"), collision.posZ()); histos.fill(HIST("hpRes"), centrality, (TMath::Cos(GetPhiInRange(psiZDCA - psiZDCC)))); histos.fill(HIST("hpResSin"), centrality, (TMath::Sin(GetPhiInRange(psiZDCA - psiZDCC)))); - histos.fill(HIST("hpCosPsiA"), centrality, (TMath::Cos(GetPhiInRange(psiZDCA)))); + /*histos.fill(HIST("hpCosPsiA"), centrality, (TMath::Cos(GetPhiInRange(psiZDCA)))); histos.fill(HIST("hpCosPsiC"), centrality, (TMath::Cos(GetPhiInRange(psiZDCC)))); histos.fill(HIST("hpSinPsiA"), centrality, (TMath::Sin(GetPhiInRange(psiZDCA)))); - histos.fill(HIST("hpSinPsiC"), centrality, (TMath::Sin(GetPhiInRange(psiZDCC)))); + histos.fill(HIST("hpSinPsiC"), centrality, (TMath::Sin(GetPhiInRange(psiZDCC))));*/ /*histos.fill(HIST("hcentQxZDCA"), centrality, qxZDCA); histos.fill(HIST("hcentQyZDCA"), centrality, qyZDCA); histos.fill(HIST("hcentQxZDCC"), centrality, qxZDCC); @@ -643,7 +680,6 @@ struct lambdapolsp { auto ux = TMath::Cos(GetPhiInRange(track.phi())); auto uy = TMath::Sin(GetPhiInRange(track.phi())); - auto px = track.px(); // auto py=track.py(); auto uxQxp = ux * qxZDCA; @@ -654,6 +690,16 @@ struct lambdapolsp { auto uxyQxyt = uxQxt + uyQyt; auto oddv1 = ux * (qxZDCA - qxZDCC) + uy * (qyZDCA - qyZDCC); auto evenv1 = ux * (qxZDCA + qxZDCC) + uy * (qyZDCA + qyZDCC); + auto v21 = TMath::Cos(2 * (GetPhiInRange(track.phi()) - psiZDCA - psiZDCC)); + auto v22 = TMath::Cos(2 * (GetPhiInRange(track.phi()) + psiZDCA - psiZDCC)); + auto v23 = TMath::Cos(2 * (GetPhiInRange(track.phi()) - psiZDC)); + + auto x2Tx1Ax1C = TMath::Cos(2 * GetPhiInRange(track.phi())) * qxZDCA * qxZDCC; + auto x2Ty1Ay1C = TMath::Cos(2 * GetPhiInRange(track.phi())) * qyZDCA * qyZDCC; + auto y2Tx1Ay1C = TMath::Sin(2 * GetPhiInRange(track.phi())) * qxZDCA * qyZDCC; + auto y2Ty1Ax1C = TMath::Sin(2 * GetPhiInRange(track.phi())) * qyZDCA * qxZDCC; + auto x1Ax1C = qxZDCA * qxZDCC; + auto y1Ay1C = qyZDCA * qyZDCC; if (globalpt) { // if (sign > 0) { @@ -670,7 +716,16 @@ struct lambdapolsp { histos.fill(HIST("hpoddv1vscentpteta"), centrality, track.pt(), track.eta(), oddv1); histos.fill(HIST("hpevenv1vscentpteta"), centrality, track.pt(), track.eta(), evenv1); - histos.fill(HIST("hppxvscentpteta"), centrality, track.pt(), track.eta(), px); + histos.fill(HIST("hpv21"), centrality, track.pt(), track.eta(), v21); + histos.fill(HIST("hpv22"), centrality, track.pt(), track.eta(), v22); + histos.fill(HIST("hpv23"), centrality, track.pt(), track.eta(), v23); + + histos.fill(HIST("hpx2Tx1Ax1Cvscentpteta"), centrality, track.pt(), track.eta(), x2Tx1Ax1C); + histos.fill(HIST("hpx2Ty1Ay1Cvscentpteta"), centrality, track.pt(), track.eta(), x2Ty1Ay1C); + histos.fill(HIST("hpy2Tx1Ay1Cvscentpteta"), centrality, track.pt(), track.eta(), y2Tx1Ay1C); + histos.fill(HIST("hpy2Ty1Ax1Cvscentpteta"), centrality, track.pt(), track.eta(), y2Ty1Ax1C); + histos.fill(HIST("hpx1Ax1Cvscentpteta"), centrality, track.pt(), track.eta(), x1Ax1C); + histos.fill(HIST("hpy1Ay1Cvscentpteta"), centrality, track.pt(), track.eta(), y1Ay1C); /*} else { histos.fill(HIST("hpuxQxpvscentptetaneg"), centrality, track.pt(), track.eta(), uxQxp); @@ -757,14 +812,14 @@ struct lambdapolsp { if (LambdaTag) { Lambda = Proton + AntiPion; tagb = 0; - fillHistograms(taga, tagb, Lambda, Proton, psiZDCC, psiZDCA, centrality, v0.mLambda(), v0.pt(), v0.eta()); + fillHistograms(taga, tagb, Lambda, Proton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mLambda(), v0.pt(), v0.eta()); } tagb = aLambdaTag; if (aLambdaTag) { AntiLambda = AntiProton + Pion; taga = 0; - fillHistograms(taga, tagb, AntiLambda, AntiProton, psiZDCC, psiZDCA, centrality, v0.mAntiLambda(), v0.pt(), v0.eta()); + fillHistograms(taga, tagb, AntiLambda, AntiProton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mAntiLambda(), v0.pt(), v0.eta()); } } } @@ -803,8 +858,14 @@ struct lambdapolsp { //___________________________________________________________________________________________________ // retrieve further info provided by StraZDCSP + /*auto qxZDCA = collision.qxZDCA(); + auto qxZDCC = collision.qxZDCC(); + auto qyZDCA = collision.qyZDCA(); + auto qyZDCC = collision.qyZDCC();*/ auto psiZDCC = collision.psiZDCC(); auto psiZDCA = collision.psiZDCA(); + // auto psiZDC=TMath::ATan2((qyZDCC-qyZDCA),(qxZDCC-qxZDCA)); //full event plane + auto psiZDC = psiZDCC - psiZDCA; // fill histograms histos.fill(HIST("hCentrality"), centrality); @@ -812,10 +873,10 @@ struct lambdapolsp { // histos.fill(HIST("hVtxZ"), collision.posZ()); histos.fill(HIST("hpRes"), centrality, (TMath::Cos(GetPhiInRange(psiZDCA - psiZDCC)))); histos.fill(HIST("hpResSin"), centrality, (TMath::Sin(GetPhiInRange(psiZDCA - psiZDCC)))); - histos.fill(HIST("hpCosPsiA"), centrality, (TMath::Cos(GetPhiInRange(psiZDCA)))); + /*histos.fill(HIST("hpCosPsiA"), centrality, (TMath::Cos(GetPhiInRange(psiZDCA)))); histos.fill(HIST("hpCosPsiC"), centrality, (TMath::Cos(GetPhiInRange(psiZDCC)))); histos.fill(HIST("hpSinPsiA"), centrality, (TMath::Sin(GetPhiInRange(psiZDCA)))); - histos.fill(HIST("hpSinPsiC"), centrality, (TMath::Sin(GetPhiInRange(psiZDCC)))); + histos.fill(HIST("hpSinPsiC"), centrality, (TMath::Sin(GetPhiInRange(psiZDCC))));*/ } //___________________________________________________________________________________________________ @@ -854,7 +915,7 @@ struct lambdapolsp { if (LambdaTag) { Lambda = Proton + AntiPion; tagb = 0; - fillHistograms(taga, tagb, Lambda, Proton, psiZDCC, psiZDCA, centrality, + fillHistograms(taga, tagb, Lambda, Proton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mLambda(), v0.pt(), v0.eta()); } @@ -862,7 +923,7 @@ struct lambdapolsp { if (aLambdaTag) { AntiLambda = AntiProton + Pion; taga = 0; - fillHistograms(taga, tagb, AntiLambda, AntiProton, psiZDCC, psiZDCA, centrality, + fillHistograms(taga, tagb, AntiLambda, AntiProton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mAntiLambda(), v0.pt(), v0.eta()); } } // end loop over V0s From 5ca0b0e4d228c534f323f7dd3349c673024e5737 Mon Sep 17 00:00:00 2001 From: Rafael Manhart <56776511+RafRaf11@users.noreply.github.com> Date: Mon, 10 Feb 2025 01:10:46 +0100 Subject: [PATCH 0118/1650] [PWGLF] Update NucleiEfficiencyTask.cxx (#9845) --- PWGLF/Tasks/Nuspex/NucleiEfficiencyTask.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/NucleiEfficiencyTask.cxx b/PWGLF/Tasks/Nuspex/NucleiEfficiencyTask.cxx index 27e948ee7a7..c0e78c82a9a 100644 --- a/PWGLF/Tasks/Nuspex/NucleiEfficiencyTask.cxx +++ b/PWGLF/Tasks/Nuspex/NucleiEfficiencyTask.cxx @@ -289,11 +289,11 @@ struct NucleiEfficiencyTask { if (collision.posZ() > cfgCutVertex) return; MC_recon_reg.fill(HIST("histRecVtxMC"), collision.posZ()); - MC_recon_reg.fill(HIST("histCentrality"), centrality); if (!isEventSelected(collision)) return; if (centrality < minCentrality || centrality > maxCentrality) return; + MC_recon_reg.fill(HIST("histCentrality"), centrality); for (auto& track : tracks) { const auto particle = track.mcParticle(); @@ -470,7 +470,7 @@ struct NucleiEfficiencyTask { Filter collisionFilter = (nabs(aod::collision::posZ) < cfgCutVertex); Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta && requireGlobalTrackWoDCAInFilter()); - void processMCreco(soa::Join::iterator const& collision, + void processMCreco(soa::Filtered>::iterator const& collision, soa::Filtered> const& tracks, aod::McParticles const& mcParticles) { From e7ff1095322d19f2602f850616996d35da171447 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Mon, 10 Feb 2025 02:10:38 +0100 Subject: [PATCH 0119/1650] [PWGHF] Simplify derived-data macros (#9847) --- PWGHF/DataModel/DerivedTables.h | 61 ++++++++++++++------------------- 1 file changed, 25 insertions(+), 36 deletions(-) diff --git a/PWGHF/DataModel/DerivedTables.h b/PWGHF/DataModel/DerivedTables.h index 09b205eff6a..beceaf3233a 100644 --- a/PWGHF/DataModel/DerivedTables.h +++ b/PWGHF/DataModel/DerivedTables.h @@ -64,7 +64,7 @@ DECLARE_SOA_INDEX_COLUMN(McCollision, mcCollision); //! original global index of } // namespace hf_mc_coll // Declares the base table with reconstructed collisions (CollBases) and joinable tables (CollIds). -#define DECLARE_COLL_TABLE(_hf_type_, _hf_description_) \ +#define DECLARE_TABLES_COLL(_hf_type_, _hf_description_) \ DECLARE_SOA_TABLE_STAGED(Hf##_hf_type_##CollBases, "HF" _hf_description_ "COLLBASE", \ o2::soa::Index<>, \ collision::PosX, \ @@ -86,7 +86,7 @@ DECLARE_SOA_INDEX_COLUMN(McCollision, mcCollision); //! original global index of o2::soa::Marker); // Declares the base table with MC collisions (McCollBases) and joinable tables (McCollIds, McRCollIds). -#define DECLARE_MCCOLL_TABLE(_hf_type_, _hf_description_, _hf_namespace_) \ +#define DECLARE_TABLES_MCCOLL(_hf_type_, _hf_description_, _hf_namespace_) \ namespace hf_mc_coll \ { \ namespace der_##_hf_namespace_ \ @@ -112,11 +112,6 @@ DECLARE_SOA_INDEX_COLUMN(McCollision, mcCollision); //! original global index of DECLARE_SOA_TABLE_STAGED(Hf##_hf_type_##McRCollIds, "HF" _hf_description_ "MCRCOLLID", \ hf_mc_coll::der_##_hf_namespace_::Hf##_hf_type_##CollBaseIds); -// Declares all tables with reconstructed and MC collisions. -#define DECLARE_COLL_TABLES(_hf_type_, _hf_description_, _hf_namespace_) \ - DECLARE_COLL_TABLE(_hf_type_, _hf_description_) \ - DECLARE_MCCOLL_TABLE(_hf_type_, _hf_description_, _hf_namespace_) - // ================ // Candidate tables // ================ @@ -168,7 +163,7 @@ DECLARE_SOA_COLUMN(FlagMcDecayChanGen, flagMcDecayChanGen, int8_t); //! resonant } // namespace hf_mc_particle // Declares the base table with candidates (Bases). -#define DECLARE_CAND_BASE_TABLE(_hf_type_, _hf_description_, _hf_namespace_) \ +#define DECLARE_TABLE_CAND_BASE(_hf_type_, _hf_description_, _hf_namespace_) \ namespace hf_cand_base \ { \ namespace der_##_hf_namespace_ \ @@ -192,7 +187,7 @@ DECLARE_SOA_COLUMN(FlagMcDecayChanGen, flagMcDecayChanGen, int8_t); //! resonant o2::soa::Marker); // Declares the table with global indices for 2-prong candidates (Ids). -#define DECLARE_CAND_2P_ID_TABLE(_hf_type_, _hf_description_) \ +#define DECLARE_TABLE_CAND_ID_2P(_hf_type_, _hf_description_) \ DECLARE_SOA_TABLE_STAGED(Hf##_hf_type_##Ids, "HF" _hf_description_ "ID", \ hf_cand::CollisionId, \ hf_track_index::Prong0Id, \ @@ -200,7 +195,7 @@ DECLARE_SOA_COLUMN(FlagMcDecayChanGen, flagMcDecayChanGen, int8_t); //! resonant o2::soa::Marker); // Declares the table with global indices for 3-prong candidates (Ids). -#define DECLARE_CAND_3P_ID_TABLE(_hf_type_, _hf_description_) \ +#define DECLARE_TABLE_CAND_ID_3P(_hf_type_, _hf_description_) \ DECLARE_SOA_TABLE_STAGED(Hf##_hf_type_##Ids, "HF" _hf_description_ "ID", \ hf_cand::CollisionId, \ hf_track_index::Prong0Id, \ @@ -209,7 +204,7 @@ DECLARE_SOA_COLUMN(FlagMcDecayChanGen, flagMcDecayChanGen, int8_t); //! resonant o2::soa::Marker); // Declares the table with candidate selection flags (Sels). -#define DECLARE_CAND_SEL_TABLE(_hf_type_, _hf_description_) \ +#define DECLARE_TABLE_CAND_SEL(_hf_type_, _hf_description_) \ DECLARE_SOA_TABLE_STAGED(Hf##_hf_type_##Sels, "HF" _hf_description_ "SEL", \ hf_cand_sel::CandidateSelFlag, \ o2::soa::Marker); @@ -219,7 +214,7 @@ DECLARE_SOA_COLUMN(FlagMcDecayChanGen, flagMcDecayChanGen, int8_t); //! resonant // ================ // Declares the base table with MC particles (PBases). -#define DECLARE_MCCAND_BASE_TABLE(_hf_type_, _hf_description_, _hf_namespace_) \ +#define DECLARE_TABLE_MCPARTICLE_BASE(_hf_type_, _hf_description_, _hf_namespace_) \ namespace hf_mc_particle \ { \ namespace der_##_hf_namespace_ \ @@ -243,7 +238,7 @@ DECLARE_SOA_COLUMN(FlagMcDecayChanGen, flagMcDecayChanGen, int8_t); //! resonant o2::soa::Marker); // Declares the table with global indices for MC particles (PIds). -#define DECLARE_MCCAND_ID_TABLE(_hf_type_, _hf_description_) \ +#define DECLARE_TABLE_MCPARTICLE_ID(_hf_type_, _hf_description_) \ DECLARE_SOA_TABLE_STAGED(Hf##_hf_type_##PIds, "HF" _hf_description_ "PID", \ hf_mc_particle::McCollisionId, \ hf_mc_particle::McParticleId, \ @@ -253,38 +248,32 @@ DECLARE_SOA_COLUMN(FlagMcDecayChanGen, flagMcDecayChanGen, int8_t); //! resonant // Helper macros for combinations // ================ -#define DECLARE_CAND_TABLES(_hf_type_, _hf_description_, _hf_namespace_) \ - DECLARE_CAND_BASE_TABLE(_hf_type_, _hf_description_, _hf_namespace_) \ - DECLARE_CAND_SEL_TABLE(_hf_type_, _hf_description_) \ - DECLARE_MCCAND_BASE_TABLE(_hf_type_, _hf_description_, _hf_namespace_) \ - DECLARE_MCCAND_ID_TABLE(_hf_type_, _hf_description_) - -#define DECLARE_CAND_2P_TABLES(_hf_type_, _hf_description_, _hf_namespace_) \ - DECLARE_CAND_TABLES(_hf_type_, _hf_description_, _hf_namespace_) \ - DECLARE_CAND_2P_ID_TABLE(_hf_type_, _hf_description_) - -#define DECLARE_CAND_3P_TABLES(_hf_type_, _hf_description_, _hf_namespace_) \ - DECLARE_CAND_TABLES(_hf_type_, _hf_description_, _hf_namespace_) \ - DECLARE_CAND_3P_ID_TABLE(_hf_type_, _hf_description_) +#define DECLARE_TABLES_COMMON(_hf_type_, _hf_description_, _hf_namespace_) \ + DECLARE_TABLES_COLL(_hf_type_, _hf_description_) \ + DECLARE_TABLES_MCCOLL(_hf_type_, _hf_description_, _hf_namespace_) \ + DECLARE_TABLE_CAND_BASE(_hf_type_, _hf_description_, _hf_namespace_) \ + DECLARE_TABLE_CAND_SEL(_hf_type_, _hf_description_) \ + DECLARE_TABLE_MCPARTICLE_BASE(_hf_type_, _hf_description_, _hf_namespace_) \ + DECLARE_TABLE_MCPARTICLE_ID(_hf_type_, _hf_description_) -#define DECLARE_2P_TABLES(_hf_type_, _hf_description_, _hf_namespace_, _marker_number_) \ +#define DECLARE_TABLES_2P(_hf_type_, _hf_description_, _hf_namespace_, _marker_number_) \ constexpr uint Marker##_hf_type_ = _marker_number_; \ - DECLARE_COLL_TABLES(_hf_type_, _hf_description_, _hf_namespace_) \ - DECLARE_CAND_2P_TABLES(_hf_type_, _hf_description_, _hf_namespace_) + DECLARE_TABLES_COMMON(_hf_type_, _hf_description_, _hf_namespace_) \ + DECLARE_TABLE_CAND_ID_2P(_hf_type_, _hf_description_) -#define DECLARE_3P_TABLES(_hf_type_, _hf_description_, _hf_namespace_, _marker_number_) \ +#define DECLARE_TABLES_3P(_hf_type_, _hf_description_, _hf_namespace_, _marker_number_) \ constexpr uint Marker##_hf_type_ = _marker_number_; \ - DECLARE_COLL_TABLES(_hf_type_, _hf_description_, _hf_namespace_) \ - DECLARE_CAND_3P_TABLES(_hf_type_, _hf_description_, _hf_namespace_) + DECLARE_TABLES_COMMON(_hf_type_, _hf_description_, _hf_namespace_) \ + DECLARE_TABLE_CAND_ID_3P(_hf_type_, _hf_description_) // ================ // Declarations of common tables for individual species // ================ -DECLARE_2P_TABLES(D0, "D0", d0, 2); -DECLARE_3P_TABLES(Lc, "LC", lc, 3); -DECLARE_3P_TABLES(Dplus, "DP", dplus, 4); -DECLARE_3P_TABLES(Bplus, "BP", bplus, 5); +DECLARE_TABLES_2P(D0, "D0", d0, 2); +DECLARE_TABLES_3P(Lc, "LC", lc, 3); +DECLARE_TABLES_3P(Dplus, "DP", dplus, 4); +DECLARE_TABLES_3P(Bplus, "BP", bplus, 5); // ================ // Additional species-specific candidate tables From 10aba7809e1f13a8383b3ac85568f523a16bf428 Mon Sep 17 00:00:00 2001 From: vbarbaso <146095385+vbarbaso@users.noreply.github.com> Date: Mon, 10 Feb 2025 09:13:49 +0100 Subject: [PATCH 0120/1650] [PWGLF] Multiplicity for processGen, Event Mixing options, QA (#9819) Signed-off-by: Veronika Barbasova Co-authored-by: Veronika Barbasova --- .../Tasks/Resonances/phianalysisTHnSparse.cxx | 967 +++++++++++++----- PWGLF/Utils/rsnOutput.h | 110 +- 2 files changed, 779 insertions(+), 298 deletions(-) diff --git a/PWGLF/Tasks/Resonances/phianalysisTHnSparse.cxx b/PWGLF/Tasks/Resonances/phianalysisTHnSparse.cxx index 24f86f940e4..b01295ac422 100644 --- a/PWGLF/Tasks/Resonances/phianalysisTHnSparse.cxx +++ b/PWGLF/Tasks/Resonances/phianalysisTHnSparse.cxx @@ -9,10 +9,13 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. /// +/// \file phianalysisTHnSparse.cxx +/// \brief Analysis of phi resonance using THnSparse histograms. /// \author Veronika Barbasova (veronika.barbasova@cern.ch) -/// \since April 3, 2024 #include +#include +#include #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Multiplicity.h" @@ -25,76 +28,80 @@ #include "Framework/runDataProcessing.h" #include "ReconstructionDataFormats/PID.h" #include "PWGLF/Utils/rsnOutput.h" -#include "TDatabasePDG.h" +// #include "TDatabasePDG.h" using namespace o2; using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; -struct phianalysisTHnSparse { +struct PhianalysisTHnSparse { SliceCache cache; struct : ConfigurableGroup { - Configurable QA{"produce-qa", false, "Produce QA histograms."}; - Configurable True{"produce-true", false, "Produce True and Gen histograms."}; - Configurable Likesign{"produce-likesign", false, "Produce Like sign histograms."}; - Configurable eventMixing{"produce-event-mixing", false, "Produce Event Mixing histograms."}; + Configurable produceQA{"produceQA", false, "Produce qa histograms."}; + Configurable produceTrue{"produceTrue", false, "Produce True and Gen histograms."}; + Configurable produceLikesign{"produceLikesign", false, "Produce Like sign histograms."}; + Configurable eventMixing{"eventMixing", "none", "Produce Event Mixing histograms of type."}; } produce; struct : ConfigurableGroup { - Configurable verboselevel{"verbose-level", 0, "Verbose level"}; - Configurable refresh{"print-refresh", 0, "Freqency of print event information."}; - Configurable refresh_index{"print-refresh-index", 0, "Freqency of print event information index."}; + Configurable verboselevel{"verboselevel", 0, "Verbose level"}; + Configurable refresh{"refresh", 0, "Freqency of print event information."}; + Configurable refreshIndex{"refreshIndex", 0, "Freqency of print event information index."}; } verbose; - Configurable dautherPos{"dauther-type-pos", 3, "Particle type of the positive dauther according to ReconstructionDataFormats/PID.h (Default = Kaon)"}; - Configurable dautherNeg{"dauther-type-neg", 3, "Particle type of the negative dauther according to ReconstructionDataFormats/PID.h (Default = Kaon)"}; - Configurable motherPDG{"mother-pdg", 333, "PDG code of mother particle."}; - Configurable dautherPosPDG{"dauther-pdg-pos", 321, "PDG code of positive dauther particle."}; - Configurable dautherNegPDG{"dauther-pdg-neg", 321, "PDG code of negative dauther particle."}; + Configurable dautherPos{"dautherPos", 3, "Particle type of the positive dauther according to ReconstructionDataFormats/PID.h (Default = Kaon)"}; + Configurable dautherNeg{"dautherNeg", 3, "Particle type of the negative dauther according to ReconstructionDataFormats/PID.h (Default = Kaon)"}; + Configurable motherPDG{"motherPDG", 333, "PDG code of mother particle."}; + Configurable dautherPosPDG{"dautherPosPDG", 321, "PDG code of positive dauther particle."}; + Configurable dautherNegPDG{"dautherNegPDG", 321, "PDG code of negative dauther particle."}; struct : ConfigurableGroup { - Configurable tpcnSigmaPos{"tpc-ns-pos", 3.0f, "TPC NSigma cut of the positive particle."}; - Configurable tpcnSigmaNeg{"tpc-ns-neg", 3.0f, "TPC NSigma cut of the negative particle."}; - Configurable vZ{"zvertex-cut", 10.0f, "Z vertex range."}; - Configurable y{"rapidity-cut", 0.5, "Rapidity cut (maximum)."}; - Configurable etatrack{"eta-track-cut", 0.8, "Eta cut for track."}; - Configurable etapair{"eta-pair-cut", 0.8, "Eta cut for pair."}; - Configurable pt{"pt-cut", 0.15f, "Cut: Minimal value of tracks pt."}; - Configurable dcaXY{"dcaXY-cut", 1.0f, "Cut: Maximal value of tracks DCA XY."}; - Configurable dcaZ{"dcaZ-cut", 1.0f, "Cut: Maximal value of tracks DCA Z."}; - Configurable tpcNClsFound{"tpc-ncl-found-cut", 70, "Cut: Minimal value of found TPC clasters"}; + Configurable tpcnSigmaPos{"tpcnSigmaPos", 3.0f, "TPC NSigma cut of the positive particle."}; + Configurable tpcnSigmaNeg{"tpcnSigmaNeg", 3.0f, "TPC NSigma cut of the negative particle."}; + Configurable vZ{"vZ", 10.0f, "Z vertex range."}; + Configurable y{"y", 0.5, "Rapidity cut (maximum)."}; + Configurable etatrack{"etatrack", 0.8, "Eta cut for track."}; + Configurable etapair{"etapair", 0.8, "Eta cut for pair."}; + Configurable pt{"pt", 0.15f, "Cut: Minimal value of tracks pt."}; + Configurable dcaXY{"dcaXY", 1.0f, "Cut: Maximal value of tracks DCA XY."}; + Configurable dcaZ{"dcaZ", 1.0f, "Cut: Maximal value of tracks DCA Z."}; + Configurable tpcNClsFound{"tpcNClsFound", 70, "Cut: Minimal value of found TPC clasters"}; } cut; - Configurable> sparseAxes{"sparse-axes", std::vector{o2::analysis::rsn::PairAxis::names}, "Axes."}; - Configurable> sysAxes{"systematics-axes", std::vector{o2::analysis::rsn::SystematicsAxis::names}, "Axes."}; + Configurable> sparseAxes{"sparseAxes", std::vector{o2::analysis::rsn::pair_axis::names}, "Axes."}; + Configurable> sysAxes{"sysAxes", std::vector{o2::analysis::rsn::systematic_axis::names}, "Axes."}; - ConfigurableAxis invaxis{"inv-axis", {130, 0.97, 1.1}, "Invariant mass axis binning."}; - ConfigurableAxis ptaxis{"pt-axis", {20, 0., 20.}, "Pt axis binning."}; - ConfigurableAxis vzaxis{"vz-axis", {40, -20., 20.}, "Z vertex position axis binning."}; - ConfigurableAxis multiplicityaxis{"multiplicity-axis", {50, 0., 5000.}, "Multiplicity axis binning."}; - ConfigurableAxis centralityaxis{"centrality-axis", {20, 0., 100.}, "Centrality axis binning."}; - ConfigurableAxis etaaxis{"eta-axis", {16., -1.0 * static_cast(cut.etatrack), static_cast(cut.etatrack)}, "Pseudorapidity axis binning."}; - ConfigurableAxis rapidityaxis{"rapidity-axis", {10., -1.0 * static_cast(cut.y), static_cast(cut.y)}, "Rapidity axis binning."}; - ConfigurableAxis nsigmaaxisPos{"nsigma-pos-axis", {1, 0., static_cast(cut.tpcnSigmaPos)}, "NSigma of positive particle axis binning in THnSparse."}; - ConfigurableAxis nsigmaaxisNeg{"nsigma-neg-axis", {1, 0., static_cast(cut.tpcnSigmaNeg)}, "NSigma of negative particle axis binning in THnSparse."}; + ConfigurableAxis invaxis{"invaxis", {130, 0.97, 1.1}, "Invariant mass axis binning."}; + ConfigurableAxis ptaxis{"ptaxis", {20, 0., 20.}, "Pt axis binning."}; + ConfigurableAxis vzaxis{"vzaxis", {40, -20., 20.}, "Z vertex position axis binning."}; + ConfigurableAxis multiplicityaxis{"multiplicityaxis", {50, 0., 5000.}, "Multiplicity axis binning."}; + ConfigurableAxis centralityaxis{"centralityaxis", {20, 0., 100.}, "Centrality axis binning."}; + ConfigurableAxis etaaxis{"etaaxis", {16., -1.0 * static_cast(cut.etatrack), static_cast(cut.etatrack)}, "Pseudorapidity axis binning."}; + ConfigurableAxis rapidityaxis{"rapidityaxis", {10., -1.0 * static_cast(cut.y), static_cast(cut.y)}, "Rapidity axis binning."}; + ConfigurableAxis nsigmaaxisPos{"nsigmaaxisPos", {1, 0., static_cast(cut.tpcnSigmaPos)}, "NSigma of positive particle axis binning in THnSparse."}; + ConfigurableAxis nsigmaaxisNeg{"nsigmaaxisNeg", {1, 0., static_cast(cut.tpcnSigmaNeg)}, "NSigma of negative particle axis binning in THnSparse."}; // mixing - using BinningType = ColumnBinningPolicy>; - Configurable numberofMixedEvents{"number-of-mixed-events", 5, "Number of events that should be mixed."}; - ConfigurableAxis axisVertexMixing{"vertex-axis-mixing", {5, -10, 10}, "Z vertex axis for bin"}; - ConfigurableAxis axisMultiplicityMixing{"multiplicity-axis-mixing", {5, 0, 5000}, "TPC multiplicity for bin"}; + using BinningTypeVzMu = ColumnBinningPolicy>; + using BinningTypeVzCe = ColumnBinningPolicy; + Configurable numberofMixedEvents{"numberofMixedEvents", 5, "Number of events that should be mixed."}; + ConfigurableAxis axisVertexMixing{"axisVertexMixing", {5, -10, 10}, "Z vertex axis binning for mixing"}; + ConfigurableAxis axisMultiplicityMixing{"axisMultiplicityMixing", {5, 0, 5000}, "TPC multiplicity for bin"}; + ConfigurableAxis axisCentralityMixing{"axisCentralityMixing", {10, 0, 100}, "Multiplicity percentil binning for mixing"}; // defined in DataFormats/Reconstruction/include/ReconstructionDataFormats/PID.h float massPos = o2::track::PID::getMass(dautherPos); float massNeg = o2::track::PID::getMass(dautherNeg); // Axes specifications - AxisSpec posZaxis = {400, -20., 20., "V_z (cm)"}; + AxisSpec posZaxis = {400, -20., 20., "V_{z} (cm)"}; AxisSpec dcaXYaxis = {120, -3.0, 3.0, "DCA_{xy} (cm)"}; AxisSpec dcaZaxis = {120, -3.0, 3.0, "DCA_{z} (cm)"}; + AxisSpec etaQAaxis = {1000, -1.0, 1.0, "#eta"}; + AxisSpec tpcNClsFoundQAaxis = {110, 50., 160., "tpcNClsFound"}; HistogramRegistry registry{"registry"}; o2::analysis::rsn::Output* rsnOutput = nullptr; @@ -105,12 +112,15 @@ struct phianalysisTHnSparse { double* pointPair = nullptr; double* pointSys = nullptr; TLorentzVector d1, d2, mother; - bool QA = false; + bool produceQA, dataQA, MCTruthQA, t1, t2 = false; + int id; float etapair = 0.8; float tpcnSigmaPos = 3.0f; float tpcnSigmaNeg = 3.0f; int tpcNClsFound = 70; + rsn::MixingType mixingType = rsn::MixingType::none; + Filter triggerFilter = (o2::aod::evsel::sel8 == true); Filter vtxFilter = (nabs(o2::aod::collision::posZ) < static_cast(cut.vZ)); @@ -125,6 +135,11 @@ struct phianalysisTHnSparse { using EventCandidatesMC = soa::Filtered>; using TrackCandidatesMC = soa::Filtered>; + using EventCandidatesMCGen = soa::Join; + + using LabeledTracks = soa::Join; + Preslice perCollision = aod::track::collisionId; + Partition positive = (aod::track::signed1Pt > 0.0f) && (nabs(o2::aod::pidtpc::tpcNSigmaKa) < std::abs(static_cast(cut.tpcnSigmaPos))); Partition negative = (aod::track::signed1Pt < 0.0f) && (nabs(o2::aod::pidtpc::tpcNSigmaKa) < std::abs(static_cast(cut.tpcnSigmaNeg))); @@ -148,14 +163,15 @@ struct phianalysisTHnSparse { AxisSpec vzmAxis = {vzaxis, "V_{z} (cm)", "vzm"}; // Systematics axes - std::vector tpcNClsFound_bins = {65., 66., 67., 68., 69., 70., 71., 72., 73.}; - AxisSpec tpcNClsFoundAxis = {tpcNClsFound_bins, "TPC NCl", "ncl"}; + std::vector tpcNClsFoundBins = {65., 66., 67., 68., 69., 70., 71., 72., 73.}; + AxisSpec tpcNClsFoundAxis = {tpcNClsFoundBins, "TPC NCl", "ncl"}; // All axes has to have same order as defined enum o2::analysis::rsn::PairAxisType (name from AxisSpec is taken to compare in o2::analysis::rsn::Output::init()) std::vector allAxes = {invAxis, ptAxis, muAxis, ceAxis, nsAxisPos, nsAxisNeg, etaAxis, yAxis, vzAxis, mumAxis, cemAxis, vzmAxis}; - std::vector allAxes_sys = {tpcNClsFoundAxis}; + std::vector allAxesSys = {tpcNClsFoundAxis}; - QA = static_cast(produce.QA); + produceQA = static_cast(produce.produceQA); + mixingType = rsn::mixingTypeName(static_cast(produce.eventMixing)); etapair = static_cast(cut.etapair); tpcnSigmaPos = static_cast(cut.tpcnSigmaPos); tpcnSigmaNeg = static_cast(cut.tpcnSigmaNeg); @@ -164,35 +180,157 @@ struct phianalysisTHnSparse { pointPair = new double[static_cast(o2::analysis::rsn::PairAxisType::unknown)]; pointSys = new double[static_cast(o2::analysis::rsn::SystematicsAxisType::unknown)]; rsnOutput = new o2::analysis::rsn::OutputSparse(); - rsnOutput->init(sparseAxes, allAxes, sysAxes, allAxes_sys, static_cast(produce.True), static_cast(produce.eventMixing), static_cast(produce.Likesign), ®istry); + rsnOutput->init(sparseAxes, allAxes, sysAxes, allAxesSys, static_cast(produce.produceTrue), mixingType, static_cast(produce.produceLikesign), ®istry); - if (QA) { + if (produceQA) { // Event QA - registry.add("QAEvent/hVtxZ", "", kTH1F, {posZaxis}); - registry.add("QAEvent/hCent", "", kTH1F, {{20, 0., 100.}}); - registry.add("QAEvent/hMult", "", kTH1F, {{50, 0., 10000.}}); - registry.add("QAEvent/s4Size", "", kTHnSparseF, {{30, 0., 30.}, {30, 0., 30.}, muAxis, vzAxis}); - registry.add("QAEvent/s2Mult_Vz", "", kTHnSparseF, {axisMultiplicityMixing, axisVertexMixing}); - // Track QA - registry.add("QATrack/unlikepm/beforeSelection/hTrack1pt", "", kTH1F, {ptAxis}); - registry.add("QATrack/unlikepm/beforeSelection/hTrackDCAxy", "", kTH1F, {dcaXYaxis}); - registry.add("QATrack/unlikepm/beforeSelection/hTrackDCAz", "", kTH1F, {dcaZaxis}); - registry.add("QATrack/unlikepm/beforeSelection/hTrack1eta", "", kTH1F, {{100, -1.0, 1.0}}); - registry.add("QATrack/unlikepm/beforeSelection/hTrack1tpcNClsFound", "", kTH1F, {{110, 50., 160.}}); - - registry.add("QATrack/unlikepm/afterSelection/hTrack1pt", "", kTH1F, {ptAxis}); - registry.add("QATrack/unlikepm/afterSelection/hTrackDCAxy", "", kTH1F, {dcaXYaxis}); - registry.add("QATrack/unlikepm/afterSelection/hTrackDCAz", "", kTH1F, {dcaZaxis}); - registry.add("QATrack/unlikepm/afterSelection/hTrack1eta", "", kTH1F, {{100, -1.0, 1.0}}); - registry.add("QATrack/unlikepm/afterSelection/hTrack1tpcNClsFound", "", kTH1F, {{110, 50., 160.}}); - - registry.add("QATrack/unlikepm/TPCPID/h2TracknSigma", "", kTH2F, {{120, -6, 6}, {120, -6, 6}}); + registry.add("QAEvent/hSelection", "Event selection statistics", kTH1F, {{1, 0.0f, 1.0f}}); + auto hEvent = registry.get(HIST("QAEvent/hSelection")); + hEvent->GetXaxis()->SetBinLabel(1, "Full event statistics"); + hEvent->SetMinimum(0.1); - registry.add("QAMC/hInvMassTrueFalse", "", kTH1F, {invAxis}); + registry.add("QAEvent/hVtxZ", "Vertex position along the z-axis", kTH1F, {posZaxis}); + registry.add("QAEvent/hCent", "Distribution of multiplicity percentile", kTH1F, {{100, 0., 100.}}); + registry.add("QAEvent/hMult", "Multiplicity (amplitude of non-zero channels in the FV0A + FV0C) ", kTH1F, {{300, 0., 30000.}}); + registry.add("QAEvent/h2Size", "Number of positive vs. negative Kaons per collision", kTH2F, {{30, 0., 30.}, {30, 0., 30.}}); + // Track QA + registry.add("QATrack/hSelection", "Tracks combinations statistics", kTH1F, {{11, 0.0f, 11.0f}}); + auto hTrack = registry.get(HIST("QATrack/hSelection")); + hTrack->GetXaxis()->SetBinLabel(1, "all K^{+} K^{-} combinations"); + hTrack->GetXaxis()->SetBinLabel(2, "all K^{+}"); + hTrack->GetXaxis()->SetBinLabel(3, "all K^{-}"); + hTrack->GetXaxis()->SetBinLabel(4, "K^{+} tpcNClsFound"); + hTrack->GetXaxis()->SetBinLabel(5, "K^{-} tpcNClsFound"); + hTrack->GetXaxis()->SetBinLabel(6, "K^{+} isPrimaryTrack"); + hTrack->GetXaxis()->SetBinLabel(7, "K^{-} isPrimaryTrack"); + hTrack->GetXaxis()->SetBinLabel(8, "K^{+} isPVContributor"); + hTrack->GetXaxis()->SetBinLabel(9, "K^{-} isPVContributor"); + hTrack->GetXaxis()->SetBinLabel(10, "selected combinations"); + hTrack->GetXaxis()->SetBinLabel(11, "selected pairs (eta cut)"); + hTrack->SetMinimum(0.1); + + // Track1 + registry.add("QATrack/bs/hTrack1pt", "K^{+} p_{T} before selection", kTH1F, {ptAxis}); + registry.add("QATrack/bs/hTrack1DCAxy", "K^{+} DCA_{xy} before selection", kTH1F, {dcaXYaxis}); + registry.add("QATrack/bs/hTrack1DCAz", "K^{+} DCA_{z} before selection", kTH1F, {dcaZaxis}); + registry.add("QATrack/bs/hTrack1eta", "K^{+} #eta before selection", kTH1F, {{etaQAaxis}}); + registry.add("QATrack/bs/hTrack1tpcNClsFound", "K^{+} tpcNClsFound before selection", kTH1F, {{tpcNClsFoundQAaxis}}); + + registry.add("QATrack/as/hTrack1pt", "K^{+} p_{T} after selection", kTH1F, {ptAxis}); + registry.add("QATrack/as/hTrack1DCAxy", "K^{+} DCA_{xy} after selection", kTH1F, {dcaXYaxis}); + registry.add("QATrack/as/hTrack1DCAz", "K^{+} DCA_{z} after selection", kTH1F, {dcaZaxis}); + registry.add("QATrack/as/hTrack1eta", "K^{+} #eta after selection", kTH1F, {{etaQAaxis}}); + registry.add("QATrack/as/hTrack1tpcNClsFound", "K^{+} tpcNClsFound after selection", kTH1F, {{tpcNClsFoundQAaxis}}); + + // Track2 + registry.add("QATrack/bs/hTrack2pt", "K^{-} p_{T} before selection", kTH1F, {ptAxis}); + registry.add("QATrack/bs/hTrack2DCAxy", "K^{-} DCA_{xy} before selection", kTH1F, {dcaXYaxis}); + registry.add("QATrack/bs/hTrack2DCAz", "K^{-} DCA_{z} before selection", kTH1F, {dcaZaxis}); + registry.add("QATrack/bs/hTrack2eta", "K^{-} #eta before selection", kTH1F, {{etaQAaxis}}); + registry.add("QATrack/bs/hTrack2tpcNClsFound", "K^{-} tpcNClsFound before selection", kTH1F, {{tpcNClsFoundQAaxis}}); + + registry.add("QATrack/as/hTrack2pt", "K^{-} p_{T} after selection", kTH1F, {ptAxis}); + registry.add("QATrack/as/hTrack2DCAxy", "K^{-} DCA_{xy} after selection", kTH1F, {dcaXYaxis}); + registry.add("QATrack/as/hTrack2DCAz", "K^{-} DCA_{z} after selection", kTH1F, {dcaZaxis}); + registry.add("QATrack/as/hTrack2eta", "K^{-} #eta after selection", kTH1F, {{etaQAaxis}}); + registry.add("QATrack/as/hTrack2tpcNClsFound", "K^{-} tpcNClsFound after selection", kTH1F, {{tpcNClsFoundQAaxis}}); + + // TPC PID + registry.add("QATrack/TPCPID/h2TracknSigma", "", kTH2F, {{120, -6, 6}, {120, -6, 6}}); + auto h2TracknSigma = registry.get(HIST("QATrack/TPCPID/h2TracknSigma")); + h2TracknSigma->GetXaxis()->SetTitle("n#sigma_{TPC} K^{+}"); + h2TracknSigma->GetYaxis()->SetTitle("n#sigma_{TPC} K^{-}"); + + registry.add("QATrack/TPCPID/h2nTrack1SigmaPt", "", kTH2F, {{100, 0, 10}, {120, -6, 6}}); + auto h2nTrack1SigmaPt = registry.get(HIST("QATrack/TPCPID/h2nTrack1SigmaPt")); + h2nTrack1SigmaPt->GetXaxis()->SetTitle("p_{T} (GeV/c)"); + h2nTrack1SigmaPt->GetYaxis()->SetTitle("n#sigma_{TPC} K^{+}"); + + registry.add("QATrack/TPCPID/h2nTrack2SigmaPt", "", kTH2F, {{100, 0, 10}, {120, -6, 6}}); + auto h2nTrack2SigmaPt = registry.get(HIST("QATrack/TPCPID/h2nTrack2SigmaPt")); + h2nTrack2SigmaPt->GetXaxis()->SetTitle("p_{T} (GeV/c)"); + h2nTrack2SigmaPt->GetYaxis()->SetTitle("n#sigma_{TPC} K^{-}"); + + // MC Truth + if (static_cast(produce.produceTrue)) { + registry.add("QAMC/Truth/hMCEvent", "MC Truth Event statistics", kTH1F, {{1, 0.0f, 1.0f}}); + auto hMCEventTruth = registry.get(HIST("QAMC/Truth/hMCEvent")); + hMCEventTruth->GetXaxis()->SetBinLabel(1, "Full MC Truth event statistics"); + hMCEventTruth->SetMinimum(0.1); + + registry.add("QAMC/Truth/hMCTrack", "MC Truth Track statistics", kTH1F, {{17, 0.0f, 17.0f}}); + auto hMCTrackTruth = registry.get(HIST("QAMC/Truth/hMCTrack")); + hMCTrackTruth->GetXaxis()->SetBinLabel(1, "all K^{+} K^{-} combinations"); + hMCTrackTruth->GetXaxis()->SetBinLabel(2, "all K^{+}"); + hMCTrackTruth->GetXaxis()->SetBinLabel(3, "all K^{-}"); + hMCTrackTruth->GetXaxis()->SetBinLabel(4, "K^{+} tpcNClsFound"); + hMCTrackTruth->GetXaxis()->SetBinLabel(5, "K^{-} tpcNClsFound"); + hMCTrackTruth->GetXaxis()->SetBinLabel(6, "K^{+} isPrimaryTrack"); + hMCTrackTruth->GetXaxis()->SetBinLabel(7, "K^{-} isPrimaryTrack"); + hMCTrackTruth->GetXaxis()->SetBinLabel(8, "K^{+} isPVContributor"); + hMCTrackTruth->GetXaxis()->SetBinLabel(9, "K^{-} isPVContributor"); + hMCTrackTruth->GetXaxis()->SetBinLabel(10, "selected combinations"); + hMCTrackTruth->GetXaxis()->SetBinLabel(11, "MCtrack PDG = 321"); + hMCTrackTruth->GetXaxis()->SetBinLabel(12, "all mothers"); + hMCTrackTruth->GetXaxis()->SetBinLabel(13, "equal mother PDGs"); + hMCTrackTruth->GetXaxis()->SetBinLabel(14, "equal mother IDs"); + hMCTrackTruth->GetXaxis()->SetBinLabel(15, "mother rapidity cut"); + hMCTrackTruth->GetXaxis()->SetBinLabel(16, "mother PDG = 333"); + hMCTrackTruth->GetXaxis()->SetBinLabel(17, "selected pairs (eta cut)"); + hMCTrackTruth->SetMinimum(0.1); + + registry.add("QAMC/hInvMassTrueFalse", "", kTH1F, {invAxis}); // not written events in True distribution due to repetition of mothers?? + + // MC Gen + registry.add("QAMC/Gen/hMCEvent", "MC Gen Event statistics", kTH1F, {{3, 0.0f, 3.0f}}); + auto hMCEventGen = registry.get(HIST("QAMC/Gen/hMCEvent")); + hMCEventGen->GetXaxis()->SetBinLabel(1, "Full McCollision statistics"); + hMCEventGen->GetXaxis()->SetBinLabel(2, "McCollision V_{z} cut"); + hMCEventGen->GetXaxis()->SetBinLabel(3, "collisions"); + hMCEventGen->SetMinimum(0.1); + + registry.add("QAMC/Gen/hMCTrack", "MC Gen Track statistics", kTH1D, {{7, 0.0f, 7.0f}}); + auto hMCTrackGen = registry.get(HIST("QAMC/Gen/hMCTrack")); + hMCTrackGen->GetXaxis()->SetBinLabel(1, "all mcParticles"); + hMCTrackGen->GetXaxis()->SetBinLabel(2, "rapidity cut"); + hMCTrackGen->GetXaxis()->SetBinLabel(3, "particle PDG = 333"); + hMCTrackGen->GetXaxis()->SetBinLabel(4, "has 2 dauthers"); + hMCTrackGen->GetXaxis()->SetBinLabel(5, "all dauthers"); + hMCTrackGen->GetXaxis()->SetBinLabel(6, "isPhysicalPrimary"); + hMCTrackGen->GetXaxis()->SetBinLabel(7, "selected pairs"); + hMCTrackGen->SetMinimum(0.1); + } // Mixing QA - registry.add("QAMixing/s4Mult_Vz", "", kTHnSparseF, {axisMultiplicityMixing, axisMultiplicityMixing, axisVertexMixing, axisVertexMixing}); - registry.add("QAMixing/s2Mult_Vz", "", kTHnSparseF, {axisMultiplicityMixing, axisVertexMixing}); + if (mixingType != rsn::MixingType::none) { + registry.add("QAMixing/hSelection", "Event mixing selection statistics", kTH1F, {{1, 0.0f, 1.0f}}); + auto hEM = registry.get(HIST("QAMixing/hSelection")); + hEM->GetXaxis()->SetBinLabel(1, "Full event mixing statistics"); + hEM->SetMinimum(0.1); + + registry.add("QAMixing/hTrackSelection", "Event mixing tracks combinations statistics", kTH1F, {{4, 0.0f, 4.0f}}); + auto hEMTrack = registry.get(HIST("QAMixing/hTrackSelection")); + hEMTrack->GetXaxis()->SetBinLabel(1, "all K^{+} K^{-} combinations"); + hEMTrack->GetXaxis()->SetBinLabel(2, "all K^{+}"); + hEMTrack->GetXaxis()->SetBinLabel(3, "all K^{-}"); + hEMTrack->GetXaxis()->SetBinLabel(4, "selected pairs (eta cut)"); + hEMTrack->SetMinimum(0.1); + + registry.add("QAMixing/h2mu1_mu2", "Event Mixing Multiplicity", kTH2F, {axisMultiplicityMixing, axisMultiplicityMixing}); + auto h2EMmu = registry.get(HIST("QAMixing/h2mu1_mu2")); + h2EMmu->GetXaxis()->SetTitle("1.Event multiplicity"); + h2EMmu->GetYaxis()->SetTitle("2.Event multiplicity"); + + registry.add("QAMixing/h2ce1_ce2", "Event Mixing Centrality", kTH2F, {axisCentralityMixing, axisCentralityMixing}); + auto h2EMce = registry.get(HIST("QAMixing/h2ce1_ce2")); + h2EMce->GetXaxis()->SetTitle("1.Event centrality"); + h2EMce->GetYaxis()->SetTitle("2.Event centrality"); + + registry.add("QAMixing/h2vz1_vz2", "Event Mixing Vertex z", kTH2F, {axisVertexMixing, axisVertexMixing}); + auto hEMTvz = registry.get(HIST("QAMixing/h2vz1_vz2")); + hEMTvz->GetXaxis()->SetTitle("1.Event V_{z}"); + hEMTvz->GetYaxis()->SetTitle("2.Event V_{z}"); + } } pointSys[static_cast(o2::analysis::rsn::SystematicsAxisType::ncl)] = tpcNClsFound; @@ -202,15 +340,71 @@ struct phianalysisTHnSparse { template bool selectedTrack(const T& track) { + if (produceQA) { + if (t1) { + if (dataQA) + registry.fill(HIST("QATrack/hSelection"), 1.5); + if (MCTruthQA) + registry.fill(HIST("QAMC/Truth/hMCTrack"), 1.5); + } + if (t2) { + if (dataQA) + registry.fill(HIST("QATrack/hSelection"), 2.5); + if (MCTruthQA) + registry.fill(HIST("QAMC/Truth/hMCTrack"), 2.5); + } + } + if (track.tpcNClsFound() < tpcNClsFound) return false; + if (produceQA) { + if (t1) { + if (dataQA) + registry.fill(HIST("QATrack/hSelection"), 3.5); + if (MCTruthQA) + registry.fill(HIST("QAMC/Truth/hMCTrack"), 3.5); + } + if (t2) { + if (dataQA) + registry.fill(HIST("QATrack/hSelection"), 4.5); + if (MCTruthQA) + registry.fill(HIST("QAMC/Truth/hMCTrack"), 4.5); + } + } if (!track.isPrimaryTrack()) return false; + if (produceQA) { + if (t1) { + if (dataQA) + registry.fill(HIST("QATrack/hSelection"), 5.5); + if (MCTruthQA) + registry.fill(HIST("QAMC/Truth/hMCTrack"), 5.5); + } + if (t2) { + if (dataQA) + registry.fill(HIST("QATrack/hSelection"), 6.5); + if (MCTruthQA) + registry.fill(HIST("QAMC/Truth/hMCTrack"), 6.5); + } + } if (!track.isPVContributor()) return false; + if (produceQA) { + if (t1) { + if (dataQA) + registry.fill(HIST("QATrack/hSelection"), 7.5); + if (MCTruthQA) + registry.fill(HIST("QAMC/Truth/hMCTrack"), 7.5); + } + if (t2) { + if (dataQA) + registry.fill(HIST("QATrack/hSelection"), 8.5); + if (MCTruthQA) + registry.fill(HIST("QAMC/Truth/hMCTrack"), 8.5); + } + } return true; } - template bool selectedPair(TLorentzVector& mother, const T& track1, const T& track2) { @@ -222,21 +416,20 @@ struct phianalysisTHnSparse { return false; return true; } - template - float GetMultiplicity(const T& collision) + float getMultiplicity(const T& collision) { float multiplicity = collision.multFT0C() + collision.multFT0A(); return multiplicity; } template - float GetCentrality(const T& collision) + float getCentrality(const T& collision) { float centrality = collision.centFT0M(); return centrality; } - double* FillPointPair(double im, double pt, double mu, double ce, double ns1, double ns2, double eta, double y, double vz, double mum, double cem, double vzm) + double* fillPointPair(double im, double pt, double mu, double ce, double ns1, double ns2, double eta, double y, double vz, double mum, double cem, double vzm) { pointPair[static_cast(o2::analysis::rsn::PairAxisType::im)] = im; pointPair[static_cast(o2::analysis::rsn::PairAxisType::pt)] = pt; @@ -259,55 +452,76 @@ struct phianalysisTHnSparse { auto posDauthers = positive->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); auto negDauthers = negative->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - if (QA) { - registry.fill(HIST("QAEvent/s4Size"), posDauthers.size(), negDauthers.size(), GetMultiplicity(collision), collision.posZ()); - registry.fill(HIST("QAEvent/s2Mult_Vz"), GetMultiplicity(collision), collision.posZ()); + if (produceQA) { + registry.fill(HIST("QAEvent/hSelection"), 0.5); + registry.fill(HIST("QAEvent/h2Size"), posDauthers.size(), negDauthers.size()); + registry.fill(HIST("QAEvent/hVtxZ"), collision.posZ()); + registry.fill(HIST("QAEvent/hMult"), getMultiplicity(collision)); + registry.fill(HIST("QAEvent/hCent"), getCentrality(collision)); } - if (static_cast(verbose.verboselevel) > 0 && static_cast(verbose.refresh) > 0 && collision.globalIndex() % static_cast(verbose.refresh) == static_cast(verbose.refresh_index)) - LOGF(info, "pos=%lld neg=%lld, Z vertex position: %f [cm], %d, mult:%f.0", posDauthers.size(), negDauthers.size(), collision.posZ(), - collision.globalIndex(), GetMultiplicity(collision)); + if (static_cast(verbose.verboselevel) > 0 && static_cast(verbose.refresh) > 0 && collision.globalIndex() % static_cast(verbose.refresh) == static_cast(verbose.refreshIndex)) + LOGF(info, "%d pos=%lld neg=%lld, Z vertex position: %f [cm]", collision.globalIndex(), posDauthers.size(), negDauthers.size(), collision.posZ()); - if (QA) { - registry.fill(HIST("QAEvent/hVtxZ"), collision.posZ()); - registry.fill(HIST("QAEvent/hMult"), GetMultiplicity(collision)); - registry.fill(HIST("QAEvent/hCent"), GetCentrality(collision)); - } + for (const auto& [track1, track2] : combinations(o2::soa::CombinationsFullIndexPolicy(posDauthers, negDauthers))) { + if (produceQA) { + registry.fill(HIST("QATrack/hSelection"), 0.5); - for (auto& [track1, track2] : combinations(o2::soa::CombinationsFullIndexPolicy(posDauthers, negDauthers))) { - if (QA) { - registry.fill(HIST("QATrack/unlikepm/beforeSelection/hTrack1pt"), track1.pt()); - registry.fill(HIST("QATrack/unlikepm/beforeSelection/hTrackDCAxy"), track1.dcaXY()); - registry.fill(HIST("QATrack/unlikepm/beforeSelection/hTrackDCAz"), track1.dcaZ()); - registry.fill(HIST("QATrack/unlikepm/beforeSelection/hTrack1eta"), track1.eta()); - registry.fill(HIST("QATrack/unlikepm/beforeSelection/hTrack1tpcNClsFound"), track1.tpcNClsFound()); + registry.fill(HIST("QATrack/bs/hTrack1pt"), track1.pt()); + registry.fill(HIST("QATrack/bs/hTrack1DCAxy"), track1.dcaXY()); + registry.fill(HIST("QATrack/bs/hTrack1DCAz"), track1.dcaZ()); + registry.fill(HIST("QATrack/bs/hTrack1eta"), track1.eta()); + registry.fill(HIST("QATrack/bs/hTrack1tpcNClsFound"), track1.tpcNClsFound()); + + registry.fill(HIST("QATrack/bs/hTrack2pt"), track2.pt()); + registry.fill(HIST("QATrack/bs/hTrack2DCAxy"), track2.dcaXY()); + registry.fill(HIST("QATrack/bs/hTrack2DCAz"), track2.dcaZ()); + registry.fill(HIST("QATrack/bs/hTrack2eta"), track2.eta()); + registry.fill(HIST("QATrack/bs/hTrack2tpcNClsFound"), track2.tpcNClsFound()); } + dataQA = true; + t1 = true; if (!selectedTrack(track1)) continue; - + t1 = false; + t2 = true; if (!selectedTrack(track2)) continue; - - if (QA) { - registry.fill(HIST("QATrack/unlikepm/afterSelection/hTrack1pt"), track1.pt()); - registry.fill(HIST("QATrack/unlikepm/afterSelection/hTrackDCAxy"), track1.dcaXY()); - registry.fill(HIST("QATrack/unlikepm/afterSelection/hTrackDCAz"), track1.dcaZ()); - registry.fill(HIST("QATrack/unlikepm/afterSelection/hTrack1eta"), track1.eta()); - registry.fill(HIST("QATrack/unlikepm/afterSelection/hTrack1tpcNClsFound"), track1.tpcNClsFound()); + t2 = false; + dataQA = false; + + if (produceQA) { + registry.fill(HIST("QATrack/hSelection"), 9.5); + + registry.fill(HIST("QATrack/as/hTrack1pt"), track1.pt()); + registry.fill(HIST("QATrack/as/hTrack1DCAxy"), track1.dcaXY()); + registry.fill(HIST("QATrack/as/hTrack1DCAz"), track1.dcaZ()); + registry.fill(HIST("QATrack/as/hTrack1eta"), track1.eta()); + registry.fill(HIST("QATrack/as/hTrack1tpcNClsFound"), track1.tpcNClsFound()); + + registry.fill(HIST("QATrack/as/hTrack2pt"), track2.pt()); + registry.fill(HIST("QATrack/as/hTrack2DCAxy"), track2.dcaXY()); + registry.fill(HIST("QATrack/as/hTrack2DCAz"), track2.dcaZ()); + registry.fill(HIST("QATrack/as/hTrack2eta"), track2.eta()); + registry.fill(HIST("QATrack/as/hTrack2tpcNClsFound"), track2.tpcNClsFound()); } if (!selectedPair(mother, track1, track2)) continue; - if (QA) { - registry.fill(HIST("QATrack/unlikepm/TPCPID/h2TracknSigma"), track1.tpcNSigmaKa(), track2.tpcNSigmaKa()); + if (produceQA) { + registry.fill(HIST("QATrack/hSelection"), 10.5); + + registry.fill(HIST("QATrack/TPCPID/h2TracknSigma"), track1.tpcNSigmaKa(), track2.tpcNSigmaKa()); + registry.fill(HIST("QATrack/TPCPID/h2nTrack1SigmaPt"), track1.pt(), track1.tpcNSigmaKa()); + registry.fill(HIST("QATrack/TPCPID/h2nTrack2SigmaPt"), track2.pt(), track2.tpcNSigmaKa()); } - pointPair = FillPointPair(mother.Mag(), + pointPair = fillPointPair(mother.Mag(), mother.Pt(), - GetMultiplicity(collision), - GetCentrality(collision), + getMultiplicity(collision), + getCentrality(collision), (tpcnSigmaPos > 0) ? std::abs(track1.tpcNSigmaKa()) : track1.tpcNSigmaKa(), (tpcnSigmaNeg > 0) ? std::abs(track2.tpcNSigmaKa()) : track2.tpcNSigmaKa(), mother.Eta(), @@ -319,9 +533,9 @@ struct phianalysisTHnSparse { rsnOutput->fillUnlikepm(pointPair); } - if (static_cast(produce.Likesign)) { + if (static_cast(produce.produceLikesign)) { - for (auto& [track1, track2] : combinations(o2::soa::CombinationsStrictlyUpperIndexPolicy(posDauthers, posDauthers))) { + for (const auto& [track1, track2] : combinations(o2::soa::CombinationsStrictlyUpperIndexPolicy(posDauthers, posDauthers))) { if (!selectedTrack(track1)) continue; if (!selectedTrack(track2)) @@ -333,10 +547,10 @@ struct phianalysisTHnSparse { if (static_cast(verbose.verboselevel) > 1) LOGF(info, "Like-sign positive: d1=%ld , d2=%ld , mother=%f", track1.globalIndex(), track2.globalIndex(), mother.Mag()); - pointPair = FillPointPair(mother.Mag(), + pointPair = fillPointPair(mother.Mag(), mother.Pt(), - GetMultiplicity(collision), - GetCentrality(collision), + getMultiplicity(collision), + getCentrality(collision), (tpcnSigmaPos > 0) ? std::abs(track1.tpcNSigmaKa()) : track1.tpcNSigmaKa(), (tpcnSigmaNeg > 0) ? std::abs(track2.tpcNSigmaKa()) : track2.tpcNSigmaKa(), mother.Eta(), @@ -349,7 +563,7 @@ struct phianalysisTHnSparse { rsnOutput->fillLikepp(pointPair); } - for (auto& [track1, track2] : combinations(o2::soa::CombinationsStrictlyUpperIndexPolicy(negDauthers, negDauthers))) { + for (const auto& [track1, track2] : combinations(o2::soa::CombinationsStrictlyUpperIndexPolicy(negDauthers, negDauthers))) { if (!selectedTrack(track1)) continue; if (!selectedTrack(track2)) @@ -361,10 +575,10 @@ struct phianalysisTHnSparse { if (static_cast(verbose.verboselevel) > 1) LOGF(info, "Like-sign negative: d1=%ld , d2=%ld , mother=%f", track1.globalIndex(), track2.globalIndex(), mother.Mag()); - pointPair = FillPointPair(mother.Mag(), + pointPair = fillPointPair(mother.Mag(), mother.Pt(), - GetMultiplicity(collision), - GetCentrality(collision), + getMultiplicity(collision), + getCentrality(collision), (tpcnSigmaPos > 0) ? std::abs(track1.tpcNSigmaKa()) : track1.tpcNSigmaKa(), (tpcnSigmaNeg > 0) ? std::abs(track2.tpcNSigmaKa()) : track2.tpcNSigmaKa(), mother.Eta(), @@ -378,13 +592,15 @@ struct phianalysisTHnSparse { } } } - PROCESS_SWITCH(phianalysisTHnSparse, processData, "Process Event for Data", true); + PROCESS_SWITCH(PhianalysisTHnSparse, processData, "Process Event for Data", true); void processTrue(EventCandidatesMC::iterator const& collision, TrackCandidatesMC const& /*tracks*/, aod::McParticles const& /*mcParticles*/, aod::McCollisions const& /*mcCollisions*/) { - if (!static_cast(produce.True)) + if (!static_cast(produce.produceTrue)) return; + registry.fill(HIST("QAMC/Truth/hMCEvent"), 0.5); + auto posDauthersMC = positiveMC->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); auto negDauthersMC = negativeMC->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); @@ -393,10 +609,8 @@ struct phianalysisTHnSparse { return; } - if (std::abs(collision.posZ()) > static_cast(cut.vZ)) - return; - - for (auto& [track1, track2] : combinations(o2::soa::CombinationsFullIndexPolicy(posDauthersMC, negDauthersMC))) { + for (const auto& [track1, track2] : combinations(o2::soa::CombinationsFullIndexPolicy(posDauthersMC, negDauthersMC))) { + registry.fill(HIST("QAMC/Truth/hMCTrack"), 0.5); if (!track1.has_mcParticle()) { LOGF(warning, "No MC particle for track, skip..."); @@ -408,11 +622,18 @@ struct phianalysisTHnSparse { continue; } + MCTruthQA = true; + t1 = true; if (!selectedTrack(track1)) continue; - + t1 = false; + t2 = true; if (!selectedTrack(track2)) continue; + t2 = false; + MCTruthQA = false; + + registry.fill(HIST("QAMC/Truth/hMCTrack"), 9.5); const auto mctrack1 = track1.mcParticle(); const auto mctrack2 = track2.mcParticle(); @@ -422,24 +643,34 @@ struct phianalysisTHnSparse { if (!(track1PDG == dautherPosPDG && track2PDG == dautherNegPDG)) { continue; } + if (produceQA) + registry.fill(HIST("QAMC/Truth/hMCTrack"), 10.5); + n = 0; - for (auto& mothertrack1 : mctrack1.mothers_as()) { - for (auto& mothertrack2 : mctrack2.mothers_as()) { + for (const auto& mothertrack1 : mctrack1.mothers_as()) { + for (const auto& mothertrack2 : mctrack2.mothers_as()) { + if (produceQA) + registry.fill(HIST("QAMC/Truth/hMCTrack"), 11.5); if (mothertrack1.pdgCode() != mothertrack2.pdgCode()) continue; + if (produceQA) + registry.fill(HIST("QAMC/Truth/hMCTrack"), 12.5); if (mothertrack1.globalIndex() != mothertrack2.globalIndex()) continue; + if (produceQA) + registry.fill(HIST("QAMC/Truth/hMCTrack"), 13.5); if (std::abs(mothertrack1.y()) > static_cast(cut.y)) continue; - - if (std::abs(mothertrack2.y()) > static_cast(cut.y)) - continue; + if (produceQA) + registry.fill(HIST("QAMC/Truth/hMCTrack"), 14.5); if (std::abs(mothertrack1.pdgCode()) != motherPDG) continue; + if (produceQA) + registry.fill(HIST("QAMC/Truth/hMCTrack"), 15.5); if (static_cast(verbose.verboselevel) > 1) { LOGF(info, "True: %d, d1=%d (%ld), d2=%d (%ld), mother=%d (%ld)", n, mctrack1.pdgCode(), mctrack1.globalIndex(), mctrack2.pdgCode(), mctrack2.globalIndex(), mothertrack1.pdgCode(), mothertrack1.globalIndex()); @@ -448,17 +679,19 @@ struct phianalysisTHnSparse { if (!selectedPair(mother, mctrack1, mctrack2)) continue; + if (produceQA) + registry.fill(HIST("QAMC/Truth/hMCTrack"), 16.5); if (n > 0) { - if (QA) + if (produceQA) registry.fill(HIST("QAMC/hInvMassTrueFalse"), mother.Mag()); continue; } - pointPair = FillPointPair(mother.Mag(), + pointPair = fillPointPair(mother.Mag(), mother.Pt(), - GetMultiplicity(collision), - GetCentrality(collision), + getMultiplicity(collision), + getCentrality(collision), (tpcnSigmaPos > 0) ? std::abs(track1.tpcNSigmaKa()) : track1.tpcNSigmaKa(), (tpcnSigmaNeg > 0) ? std::abs(track2.tpcNSigmaKa()) : track2.tpcNSigmaKa(), mother.Eta(), @@ -474,140 +707,214 @@ struct phianalysisTHnSparse { } } } + PROCESS_SWITCH(PhianalysisTHnSparse, processTrue, "Process Event for MC reconstruction.", false); - PROCESS_SWITCH(phianalysisTHnSparse, processTrue, "Process Event for MC reconstruction.", false); - - int numberofEntries = 0; - - void processGen(aod::McCollision const& mcCollision, aod::McParticles const& mcParticles) + void processGen(aod::McCollision const& mcCollision, soa::SmallGroups const& collisions, LabeledTracks const& /*particles*/, aod::McParticles const& mcParticles) { - - if (!static_cast(produce.True)) + registry.fill(HIST("QAMC/Gen/hMCEvent"), 0.5); + if (std::abs(mcCollision.posZ()) > static_cast(cut.vZ)) return; + registry.fill(HIST("QAMC/Gen/hMCEvent"), 1.5); - if (std::abs(mcCollision.posZ()) > static_cast(cut.vZ)) + if (collisions.size() == 0) return; - int nuberofPhi = 0; + for (const auto& collision : collisions) { + registry.fill(HIST("QAMC/Gen/hMCEvent"), 2.5); - for (auto& particle : mcParticles) { - if (std::abs(particle.y()) > static_cast(cut.y)) - continue; + if (!collision.has_mcCollision()) { + LOGF(warning, "No McCollision for this collision, skip..."); + return; + } - if (particle.pdgCode() == motherPDG) { - auto daughters = particle.daughters_as(); - if (daughters.size() != 2) + auto centralityGen = 0; + centralityGen = getCentrality(collision); + auto multiplicityGen = 0; + multiplicityGen = getMultiplicity(collision); + + for (const auto& particle : mcParticles) { + registry.fill(HIST("QAMC/Gen/hMCTrack"), 0.5); + + if (std::abs(particle.y()) > static_cast(cut.y)) continue; - auto daup = false; - auto daun = false; + registry.fill(HIST("QAMC/Gen/hMCTrack"), 1.5); - for (auto& dau : daughters) { - if (!dau.isPhysicalPrimary()) + if (particle.pdgCode() == motherPDG) { + registry.fill(HIST("QAMC/Gen/hMCTrack"), 2.5); + + auto daughters = particle.daughters_as(); + if (daughters.size() != 2) continue; - if (dau.pdgCode() == dautherPosPDG) { - daup = true; - d1.SetXYZM(dau.px(), dau.py(), dau.pz(), massPos); - } else if (dau.pdgCode() == -dautherNegPDG) { - daun = true; - d2.SetXYZM(dau.px(), dau.py(), dau.pz(), massNeg); - } - } - if (!daup && !daun) - continue; + registry.fill(HIST("QAMC/Gen/hMCTrack"), 3.5); - mother = d1 + d2; + auto daup = false; + auto daun = false; - pointPair = FillPointPair(mother.Mag(), - mother.Pt(), - 0, - 0, - std::abs(static_cast(cut.tpcnSigmaPos) / 2.0), - std::abs(static_cast(cut.tpcnSigmaNeg) / 2.0), - mother.Eta(), - mother.Rapidity(), - mcCollision.posZ(), - 0, - 0, - 0); + for (const auto& dau : daughters) { + registry.fill(HIST("QAMC/Gen/hMCTrack"), 4.5); - rsnOutput->fillUnlikegen(pointPair); + if (!dau.isPhysicalPrimary()) + continue; - nuberofPhi++; - numberofEntries++; + registry.fill(HIST("QAMC/Gen/hMCTrack"), 5.5); - if (static_cast(verbose.verboselevel) > 1) - LOGF(info, "Gen: %d, #Phi =%d, mother=%d (%ld), Inv.mass:%f, Pt= %f", numberofEntries, nuberofPhi, particle.pdgCode(), particle.globalIndex(), mother.Mag(), mother.Pt()); + if (dau.pdgCode() == dautherPosPDG) { + daup = true; + d1.SetXYZM(dau.px(), dau.py(), dau.pz(), massPos); + } else if (dau.pdgCode() == -dautherNegPDG) { + daun = true; + d2.SetXYZM(dau.px(), dau.py(), dau.pz(), massNeg); + } + } + if (!daup && !daun) + continue; + + registry.fill(HIST("QAMC/Gen/hMCTrack"), 6.5); + + mother = d1 + d2; + + pointPair = fillPointPair(mother.Mag(), + mother.Pt(), + multiplicityGen, + centralityGen, + std::abs(static_cast(cut.tpcnSigmaPos) / 2.0), + std::abs(static_cast(cut.tpcnSigmaNeg) / 2.0), + mother.Eta(), + mother.Rapidity(), + mcCollision.posZ(), + 0, + 0, + 0); + + rsnOutput->fillUnlikegen(pointPair); + } } } } - - PROCESS_SWITCH(phianalysisTHnSparse, processGen, "Process generated.", false); - - int id; + PROCESS_SWITCH(PhianalysisTHnSparse, processGen, "Process MC Mateched.", true); void processMixed(EventCandidates const& collisions, TrackCandidates const& tracks) { - if (!static_cast(produce.eventMixing)) + if (mixingType == rsn::MixingType::none) return; - BinningType binning{{axisVertexMixing, axisMultiplicityMixing}, true}; + auto tracksTuple = std::make_tuple(tracks); - SameKindPair pair{binning, numberofMixedEvents, -1, collisions, tracksTuple, &cache}; - for (auto& [c1, tracks1, c2, tracks2] : pair) { + BinningTypeVzCe binningVzCe{{axisVertexMixing, axisCentralityMixing}, true}; + SameKindPair pairVzCe{binningVzCe, numberofMixedEvents, -1, collisions, tracksTuple, &cache}; - if (!c1.sel8()) { - continue; - } - if (!c2.sel8()) { - continue; - } - if (QA) { - if (!(id == c1.globalIndex())) { - registry.fill(HIST("QAMixing/s2Mult_Vz"), GetMultiplicity(c1), c1.posZ()); - id = c1.globalIndex(); + BinningTypeVzMu binningVzMu{{axisVertexMixing, axisMultiplicityMixing}, true}; + SameKindPair pairVzMu{binningVzMu, numberofMixedEvents, -1, collisions, tracksTuple, &cache}; + + if (mixingType == rsn::MixingType::ce) { + for (const auto& [c1, tracks1, c2, tracks2] : pairVzCe) { + if (produceQA) + registry.fill(HIST("QAMixing/hSelection"), 0.5); + + auto posDauthersc1 = positive->sliceByCached(aod::track::collisionId, c1.globalIndex(), cache); + auto posDauthersc2 = positive->sliceByCached(aod::track::collisionId, c2.globalIndex(), cache); + auto negDauthersc1 = negative->sliceByCached(aod::track::collisionId, c1.globalIndex(), cache); + auto negDauthersc2 = negative->sliceByCached(aod::track::collisionId, c2.globalIndex(), cache); + + if (produceQA) { + registry.fill(HIST("QAMixing/h2mu1_mu2"), getMultiplicity(c1), getMultiplicity(c2)); + registry.fill(HIST("QAMixing/h2ce1_ce2"), getCentrality(c1), getCentrality(c2)); + registry.fill(HIST("QAMixing/h2vz1_vz2"), c1.posZ(), c2.posZ()); } - } - auto posDauthersc1 = positive->sliceByCached(aod::track::collisionId, c1.globalIndex(), cache); - auto posDauthersc2 = positive->sliceByCached(aod::track::collisionId, c2.globalIndex(), cache); - auto negDauthersc1 = negative->sliceByCached(aod::track::collisionId, c1.globalIndex(), cache); - auto negDauthersc2 = negative->sliceByCached(aod::track::collisionId, c2.globalIndex(), cache); + for (const auto& [track1, track2] : combinations(o2::soa::CombinationsFullIndexPolicy(posDauthersc1, negDauthersc2))) { + if (produceQA) + registry.fill(HIST("QAMixing/hTrackSelection"), 0.5); + + if (!selectedTrack(track1)) + continue; + if (produceQA) + registry.fill(HIST("QAMixing/hTrackSelection"), 1.5); + if (!selectedTrack(track2)) + continue; + if (produceQA) + registry.fill(HIST("QAMixing/hTrackSelection"), 2.5); + + if (!selectedPair(mother, track1, track2)) + continue; + if (produceQA) + registry.fill(HIST("QAMixing/hTrackSelection"), 3.5); - if (QA) - registry.fill(HIST("QAMixing/s4Mult_Vz"), GetMultiplicity(c1), GetMultiplicity(c2), c1.posZ(), c2.posZ()); + pointPair = fillPointPair(mother.Mag(), + mother.Pt(), + getMultiplicity(c1), + getCentrality(c1), + (tpcnSigmaPos > 0) ? std::abs(track1.tpcNSigmaKa()) : track1.tpcNSigmaKa(), + (tpcnSigmaNeg > 0) ? std::abs(track2.tpcNSigmaKa()) : track2.tpcNSigmaKa(), + mother.Eta(), + mother.Rapidity(), + c1.posZ(), + getMultiplicity(c2), + getCentrality(c2), + c2.posZ()); - for (auto& [track1, track2] : combinations(o2::soa::CombinationsFullIndexPolicy(posDauthersc1, negDauthersc2))) { + rsnOutput->fillMixingpm(pointPair); + } - if (!selectedTrack(track1)) + if (static_cast(produce.produceLikesign)) { - continue; - if (!selectedTrack(track2)) - continue; + for (const auto& [track1, track2] : combinations(o2::soa::CombinationsFullIndexPolicy(posDauthersc1, posDauthersc2))) { - if (!selectedPair(mother, track1, track2)) - continue; + if (!selectedTrack(track1)) - pointPair = FillPointPair(mother.Mag(), - mother.Pt(), - GetMultiplicity(c1), - GetCentrality(c1), - (tpcnSigmaPos > 0) ? std::abs(track1.tpcNSigmaKa()) : track1.tpcNSigmaKa(), - (tpcnSigmaNeg > 0) ? std::abs(track2.tpcNSigmaKa()) : track2.tpcNSigmaKa(), - mother.Eta(), - mother.Rapidity(), - c1.posZ(), - GetMultiplicity(c2), - GetCentrality(c2), - c2.posZ()); + continue; + if (!selectedTrack(track2)) + continue; - rsnOutput->fillMixingpm(pointPair); - } + if (!selectedPair(mother, track1, track2)) + continue; - if (static_cast(produce.Likesign)) { + pointPair = fillPointPair(mother.Mag(), + mother.Pt(), + getMultiplicity(c1), + getCentrality(c1), + (tpcnSigmaPos > 0) ? std::abs(track1.tpcNSigmaKa()) : track1.tpcNSigmaKa(), + (tpcnSigmaNeg > 0) ? std::abs(track2.tpcNSigmaKa()) : track2.tpcNSigmaKa(), + mother.Eta(), + mother.Rapidity(), + c1.posZ(), + getMultiplicity(c2), + getCentrality(c2), + c2.posZ()); + + rsnOutput->fillMixingpp(pointPair); + } + + for (const auto& [track1, track2] : combinations(o2::soa::CombinationsFullIndexPolicy(negDauthersc1, negDauthersc2))) { + + if (!selectedTrack(track1)) + + continue; + if (!selectedTrack(track2)) + continue; + + if (!selectedPair(mother, track1, track2)) + continue; + pointPair = fillPointPair(mother.Mag(), + mother.Pt(), + getMultiplicity(c1), + getCentrality(c1), + (tpcnSigmaPos > 0) ? std::abs(track1.tpcNSigmaKa()) : track1.tpcNSigmaKa(), + (tpcnSigmaNeg > 0) ? std::abs(track2.tpcNSigmaKa()) : track2.tpcNSigmaKa(), + mother.Eta(), + mother.Rapidity(), + c1.posZ(), + getMultiplicity(c2), + getCentrality(c2), + c2.posZ()); + + rsnOutput->fillMixingmm(pointPair); + } + } - for (auto& [track1, track2] : combinations(o2::soa::CombinationsFullIndexPolicy(posDauthersc1, posDauthersc2))) { + for (const auto& [track1, track2] : combinations(o2::soa::CombinationsFullIndexPolicy(posDauthersc2, negDauthersc1))) { if (!selectedTrack(track1)) @@ -618,23 +925,130 @@ struct phianalysisTHnSparse { if (!selectedPair(mother, track1, track2)) continue; - pointPair = FillPointPair(mother.Mag(), + pointPair = fillPointPair(mother.Mag(), mother.Pt(), - GetMultiplicity(c1), - GetCentrality(c1), + getMultiplicity(c1), + getCentrality(c1), (tpcnSigmaPos > 0) ? std::abs(track1.tpcNSigmaKa()) : track1.tpcNSigmaKa(), (tpcnSigmaNeg > 0) ? std::abs(track2.tpcNSigmaKa()) : track2.tpcNSigmaKa(), mother.Eta(), mother.Rapidity(), c1.posZ(), - GetMultiplicity(c2), - GetCentrality(c2), + getMultiplicity(c2), + getCentrality(c2), c2.posZ()); - rsnOutput->fillMixingpp(pointPair); + rsnOutput->fillMixingmp(pointPair); + } + } + } + if (mixingType == rsn::MixingType::mu) { + for (const auto& [c1, tracks1, c2, tracks2] : pairVzMu) { + if (produceQA) + registry.fill(HIST("QAMixing/hSelection"), 0.5); + + auto posDauthersc1 = positive->sliceByCached(aod::track::collisionId, c1.globalIndex(), cache); + auto posDauthersc2 = positive->sliceByCached(aod::track::collisionId, c2.globalIndex(), cache); + auto negDauthersc1 = negative->sliceByCached(aod::track::collisionId, c1.globalIndex(), cache); + auto negDauthersc2 = negative->sliceByCached(aod::track::collisionId, c2.globalIndex(), cache); + + if (produceQA) { + registry.fill(HIST("QAMixing/h2mu1_mu2"), getMultiplicity(c1), getMultiplicity(c2)); + registry.fill(HIST("QAMixing/h2ce1_ce2"), getCentrality(c1), getCentrality(c2)); + registry.fill(HIST("QAMixing/h2vz1_vz2"), c1.posZ(), c2.posZ()); + } + + for (const auto& [track1, track2] : combinations(o2::soa::CombinationsFullIndexPolicy(posDauthersc1, negDauthersc2))) { + if (produceQA) + registry.fill(HIST("QAMixing/hTrackSelection"), 0.5); + + if (!selectedTrack(track1)) + continue; + if (produceQA) + registry.fill(HIST("QAMixing/hTrackSelection"), 1.5); + if (!selectedTrack(track2)) + continue; + if (produceQA) + registry.fill(HIST("QAMixing/hTrackSelection"), 2.5); + + if (!selectedPair(mother, track1, track2)) + continue; + if (produceQA) + registry.fill(HIST("QAMixing/hTrackSelection"), 3.5); + + pointPair = fillPointPair(mother.Mag(), + mother.Pt(), + getMultiplicity(c1), + getCentrality(c1), + (tpcnSigmaPos > 0) ? std::abs(track1.tpcNSigmaKa()) : track1.tpcNSigmaKa(), + (tpcnSigmaNeg > 0) ? std::abs(track2.tpcNSigmaKa()) : track2.tpcNSigmaKa(), + mother.Eta(), + mother.Rapidity(), + c1.posZ(), + getMultiplicity(c2), + getCentrality(c2), + c2.posZ()); + + rsnOutput->fillMixingpm(pointPair); + } + + if (static_cast(produce.produceLikesign)) { + + for (const auto& [track1, track2] : combinations(o2::soa::CombinationsFullIndexPolicy(posDauthersc1, posDauthersc2))) { + + if (!selectedTrack(track1)) + + continue; + if (!selectedTrack(track2)) + continue; + + if (!selectedPair(mother, track1, track2)) + continue; + + pointPair = fillPointPair(mother.Mag(), + mother.Pt(), + getMultiplicity(c1), + getCentrality(c1), + (tpcnSigmaPos > 0) ? std::abs(track1.tpcNSigmaKa()) : track1.tpcNSigmaKa(), + (tpcnSigmaNeg > 0) ? std::abs(track2.tpcNSigmaKa()) : track2.tpcNSigmaKa(), + mother.Eta(), + mother.Rapidity(), + c1.posZ(), + getMultiplicity(c2), + getCentrality(c2), + c2.posZ()); + + rsnOutput->fillMixingpp(pointPair); + } + + for (const auto& [track1, track2] : combinations(o2::soa::CombinationsFullIndexPolicy(negDauthersc1, negDauthersc2))) { + + if (!selectedTrack(track1)) + + continue; + if (!selectedTrack(track2)) + continue; + + if (!selectedPair(mother, track1, track2)) + continue; + pointPair = fillPointPair(mother.Mag(), + mother.Pt(), + getMultiplicity(c1), + getCentrality(c1), + (tpcnSigmaPos > 0) ? std::abs(track1.tpcNSigmaKa()) : track1.tpcNSigmaKa(), + (tpcnSigmaNeg > 0) ? std::abs(track2.tpcNSigmaKa()) : track2.tpcNSigmaKa(), + mother.Eta(), + mother.Rapidity(), + c1.posZ(), + getMultiplicity(c2), + getCentrality(c2), + c2.posZ()); + + rsnOutput->fillMixingmm(pointPair); + } } - for (auto& [track1, track2] : combinations(o2::soa::CombinationsFullIndexPolicy(negDauthersc1, negDauthersc2))) { + for (const auto& [track1, track2] : combinations(o2::soa::CombinationsFullIndexPolicy(posDauthersc2, negDauthersc1))) { if (!selectedTrack(track1)) @@ -644,56 +1058,97 @@ struct phianalysisTHnSparse { if (!selectedPair(mother, track1, track2)) continue; - pointPair = FillPointPair(mother.Mag(), + + pointPair = fillPointPair(mother.Mag(), mother.Pt(), - GetMultiplicity(c1), - GetCentrality(c1), + getMultiplicity(c1), + getCentrality(c1), (tpcnSigmaPos > 0) ? std::abs(track1.tpcNSigmaKa()) : track1.tpcNSigmaKa(), (tpcnSigmaNeg > 0) ? std::abs(track2.tpcNSigmaKa()) : track2.tpcNSigmaKa(), mother.Eta(), mother.Rapidity(), c1.posZ(), - GetMultiplicity(c2), - GetCentrality(c2), + getMultiplicity(c2), + getCentrality(c2), c2.posZ()); - rsnOutput->fillMixingmm(pointPair); + rsnOutput->fillMixingmp(pointPair); } } + } + } + PROCESS_SWITCH(PhianalysisTHnSparse, processMixed, "Process Mixing Event.", true); - for (auto& [track1, track2] : combinations(o2::soa::CombinationsFullIndexPolicy(posDauthersc2, negDauthersc1))) { + void processGenOld(aod::McCollision const& mcCollision, aod::McParticles const& mcParticles) + { + if (!static_cast(produce.produceTrue)) + return; - if (!selectedTrack(track1)) + registry.fill(HIST("QAMC/hMC"), 0.5); - continue; - if (!selectedTrack(track2)) + if (std::abs(mcCollision.posZ()) > static_cast(cut.vZ)) + return; + + registry.fill(HIST("QAMC/hMC"), 1.5); + + for (const auto& particle : mcParticles) { + registry.fill(HIST("QAMC/hMC"), 2.5); + if (std::abs(particle.y()) > static_cast(cut.y)) + continue; + + registry.fill(HIST("QAMC/hMC"), 3.5); + + if (particle.pdgCode() == motherPDG) { + auto daughters = particle.daughters_as(); + if (daughters.size() != 2) continue; - if (!selectedPair(mother, track1, track2)) + registry.fill(HIST("QAMC/hMC"), 4.5); + + auto daup = false; + auto daun = false; + + for (const auto& dau : daughters) { + if (!dau.isPhysicalPrimary()) + continue; + + if (dau.pdgCode() == dautherPosPDG) { + daup = true; + d1.SetXYZM(dau.px(), dau.py(), dau.pz(), massPos); + } else if (dau.pdgCode() == -dautherNegPDG) { + daun = true; + d2.SetXYZM(dau.px(), dau.py(), dau.pz(), massNeg); + } + } + if (!daup && !daun) continue; - pointPair = FillPointPair(mother.Mag(), + registry.fill(HIST("QAMC/hMC"), 5.5); + + mother = d1 + d2; + + pointPair = fillPointPair(mother.Mag(), mother.Pt(), - GetMultiplicity(c1), - GetCentrality(c1), - (tpcnSigmaPos > 0) ? std::abs(track1.tpcNSigmaKa()) : track1.tpcNSigmaKa(), - (tpcnSigmaNeg > 0) ? std::abs(track2.tpcNSigmaKa()) : track2.tpcNSigmaKa(), + 0, + 0, + std::abs(static_cast(cut.tpcnSigmaPos) / 2.0), + std::abs(static_cast(cut.tpcnSigmaNeg) / 2.0), mother.Eta(), mother.Rapidity(), - c1.posZ(), - GetMultiplicity(c2), - GetCentrality(c2), - c2.posZ()); + mcCollision.posZ(), + 0, + 0, + 0); - rsnOutput->fillMixingmp(pointPair); + rsnOutput->fillUnlikegenOld(pointPair); } } } - PROCESS_SWITCH(phianalysisTHnSparse, processMixed, "Process Mixing Event.", true); + PROCESS_SWITCH(PhianalysisTHnSparse, processGenOld, "Process generated.", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc)}; + adaptAnalysisTask(cfgc)}; } diff --git a/PWGLF/Utils/rsnOutput.h b/PWGLF/Utils/rsnOutput.h index 7d61441462c..e9ccc1c3ddb 100644 --- a/PWGLF/Utils/rsnOutput.h +++ b/PWGLF/Utils/rsnOutput.h @@ -9,8 +9,9 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. /// +/// \file rsnOutput.h +/// \brief Resonance output class. /// \author Veronika Barbasova (veronika.barbasova@cern.ch) -/// \since April 3, 2024 #ifndef PWGLF_UTILS_RSNOUTPUT_H_ #define PWGLF_UTILS_RSNOUTPUT_H_ @@ -22,8 +23,6 @@ #include "Framework/HistogramRegistry.h" #include "Framework/Logger.h" -using namespace o2::framework; - namespace o2::analysis { namespace rsn @@ -47,6 +46,7 @@ enum class PairType { likemm, unliketrue, unlikegen, + unlikegenold, mixingpm, mixingpp, mixingmm, @@ -70,41 +70,58 @@ enum class PairAxisType { unknown }; +enum class MixingType { + ce, + mu, + none +}; + +MixingType mixingTypeName(std::string name) +{ + if (name == "ce") + return MixingType::ce; + else if (name == "mu") + return MixingType::mu; + + return MixingType::none; +} + enum class SystematicsAxisType { ncl, unknown }; -namespace PairAxis +namespace pair_axis { std::vector names{"im", "pt", "mu", "ce", "ns1", "ns2", "eta", "y", "vz", "mum", "cem", "vzm"}; } -namespace SystematicsAxis +namespace systematic_axis { std::vector names{"ncl"}; } + class Output { public: virtual ~Output() = default; - virtual void init(std::vector const& sparseAxes, std::vector const& allAxes, std::vector const& sysAxes, std::vector const& allAxes_sys, bool /*produceTrue*/ = false, bool /*eventMixing*/ = false, bool /*produceLikesign*/ = false, HistogramRegistry* registry = nullptr) + virtual void init(std::vector const& sparseAxes, std::vector const& allAxes, std::vector const& sysAxes, std::vector const& allAxes_sys, bool /*produceTrue*/ = false, MixingType /*eventMixing*/ = MixingType::none, bool /*produceLikesign*/ = false, o2::framework::HistogramRegistry* registry = nullptr) { mHistogramRegistry = registry; if (mHistogramRegistry == nullptr) - mHistogramRegistry = new HistogramRegistry("registry"); + mHistogramRegistry = new o2::framework::HistogramRegistry("registry"); // check if all axes are added in correct order for (int i = 0; i < static_cast(PairAxisType::unknown); i++) { auto aname = *std::move(allAxes[i].name); LOGF(debug, "Check axis '%s' %d", aname.c_str(), i); - if (aname.compare(PairAxis::names[static_cast(i)])) { - LOGF(fatal, "rsn::Output::Error: Order in allAxes is not correct !!! Expected axis '%s' and has '%s'.", aname.c_str(), PairAxis::names[static_cast(i)]); + if (aname.compare(pair_axis::names[static_cast(i)])) { + LOGF(fatal, "rsn::Output::Error: Order in allAxes is not correct !!! Expected axis '%s' and has '%s'.", aname.c_str(), pair_axis::names[static_cast(i)]); } } PairAxisType currentType; - for (auto& c : sparseAxes) { + for (const auto& c : sparseAxes) { currentType = type(c); if (currentType >= PairAxisType::unknown) { LOGF(warning, "Found unknown axis (rsn::PairAxisType = %d)!!! Skipping ...", static_cast(currentType)); @@ -120,27 +137,27 @@ class Output mFillPoint = new double[mCurrentAxisTypes.size()]; LOGF(info, "Number of axis added: %d", mCurrentAxes.size()); - mPairHisto = new HistogramConfigSpec(HistType::kTHnSparseF, mCurrentAxes); + mPairHisto = new o2::framework::HistogramConfigSpec(o2::framework::HistType::kTHnSparseF, mCurrentAxes); // check if all systematic axes are added in correct order for (int i = 0; i < static_cast(SystematicsAxisType::unknown); i++) { auto aname = *std::move(allAxes_sys[i].name); LOGF(debug, "Check axis '%s' %d", aname.c_str(), i); - if (aname.compare(SystematicsAxis::names[static_cast(i)])) { - LOGF(fatal, "rsn::Output::Error: Order in allAxes_sys is not correct !!! Expected axis '%s' and has '%s'.", aname.c_str(), SystematicsAxis::names[static_cast(i)]); + if (aname.compare(systematic_axis::names[static_cast(i)])) { + LOGF(fatal, "rsn::Output::Error: Order in allAxes_sys is not correct !!! Expected axis '%s' and has '%s'.", aname.c_str(), systematic_axis::names[static_cast(i)]); } } - SystematicsAxisType currentType_sys; - for (auto& c : sysAxes) { - currentType_sys = type_sys(c); - if (currentType_sys >= SystematicsAxisType::unknown) { - LOGF(warning, "Found unknown axis (rsn::SystematicsAxisType = %d)!!! Skipping ...", static_cast(currentType_sys)); + SystematicsAxisType currentTypeSys; + for (const auto& c : sysAxes) { + currentTypeSys = typeSys(c); + if (currentTypeSys >= SystematicsAxisType::unknown) { + LOGF(warning, "Found unknown axis (rsn::SystematicsAxisType = %d)!!! Skipping ...", static_cast(currentTypeSys)); continue; } LOGF(info, "Adding axis '%s' to systematic histogram", c.c_str()); - mCurrentAxesSys.push_back(allAxes_sys[static_cast(currentType_sys)]); - mCurrentAxisTypesSys.push_back(currentType_sys); + mCurrentAxesSys.push_back(allAxes_sys[static_cast(currentTypeSys)]); + mCurrentAxisTypesSys.push_back(currentTypeSys); } if (mFillPointSys != nullptr) @@ -148,14 +165,14 @@ class Output mFillPointSys = new double[mCurrentAxisTypesSys.size()]; LOGF(info, "Number of systematic axis added: %d", mCurrentAxesSys.size()); - mPairHistoSys = new HistogramConfigSpec(HistType::kTHnSparseF, mCurrentAxesSys); + mPairHistoSys = new o2::framework::HistogramConfigSpec(o2::framework::HistType::kTHnSparseF, mCurrentAxesSys); } template void fillSparse(const T& h, double* point) { int i = 0; - for (auto& at : mCurrentAxisTypes) { + for (const auto& at : mCurrentAxisTypes) { mFillPoint[i++] = point[static_cast(at)]; } mHistogramRegistry->get(h)->Fill(mFillPoint); @@ -165,7 +182,7 @@ class Output void fillSparseSys(const T& h, double* point) { int i = 0; - for (auto& at : mCurrentAxisTypesSys) { + for (const auto& at : mCurrentAxisTypesSys) { mFillPointSys[i++] = point[static_cast(at)]; } mHistogramRegistry->get(h)->Fill(mFillPointSys); @@ -190,6 +207,7 @@ class Output virtual void fillLikemm(double* point) = 0; virtual void fillUnliketrue(double* point) = 0; virtual void fillUnlikegen(double* point) = 0; + virtual void fillUnlikegenOld(double* point) = 0; virtual void fillMixingpm(double* point) = 0; virtual void fillMixingpp(double* point) = 0; virtual void fillMixingmm(double* point) = 0; @@ -198,47 +216,47 @@ class Output PairAxisType type(std::string name) { - auto it = std::find(PairAxis::names.begin(), PairAxis::names.end(), name); - if (it == PairAxis::names.end()) { + auto it = std::find(pair_axis::names.begin(), pair_axis::names.end(), name); + if (it == pair_axis::names.end()) { return PairAxisType::unknown; } - return static_cast(std::distance(PairAxis::names.begin(), it)); + return static_cast(std::distance(pair_axis::names.begin(), it)); } - SystematicsAxisType type_sys(std::string name) + SystematicsAxisType typeSys(std::string name) { - auto it = std::find(SystematicsAxis::names.begin(), SystematicsAxis::names.end(), name); - if (it == SystematicsAxis::names.end()) { + auto it = std::find(systematic_axis::names.begin(), systematic_axis::names.end(), name); + if (it == systematic_axis::names.end()) { return SystematicsAxisType::unknown; } - return static_cast(std::distance(SystematicsAxis::names.begin(), it)); + return static_cast(std::distance(systematic_axis::names.begin(), it)); } std::string name(PairAxisType type) { - return PairAxis::names[(static_cast(type))]; + return pair_axis::names[(static_cast(type))]; } - std::string name_sys(SystematicsAxisType type) + std::string nameSys(SystematicsAxisType type) { - return SystematicsAxis::names[(static_cast(type))]; + return systematic_axis::names[(static_cast(type))]; } - AxisSpec axis(std::vector const& allAxes, PairAxisType type) + o2::framework::AxisSpec axis(std::vector const& allAxes, PairAxisType type) { - const AxisSpec unknownAxis = {1, 0., 1., "unknown axis", "unknown"}; + const o2::framework::AxisSpec unknownAxis = {1, 0., 1., "unknown axis", "unknown"}; if (type == PairAxisType::unknown) return unknownAxis; return allAxes[static_cast(type)]; } protected: - HistogramRegistry* mHistogramRegistry = nullptr; - HistogramConfigSpec* mPairHisto = nullptr; - HistogramConfigSpec* mPairHistoSys = nullptr; - std::vector mCurrentAxes; + o2::framework::HistogramRegistry* mHistogramRegistry = nullptr; + o2::framework::HistogramConfigSpec* mPairHisto = nullptr; + o2::framework::HistogramConfigSpec* mPairHistoSys = nullptr; + std::vector mCurrentAxes; std::vector mCurrentAxisTypes; - std::vector mCurrentAxesSys; + std::vector mCurrentAxesSys; std::vector mCurrentAxisTypesSys; double* mFillPoint = nullptr; double* mFillPointSys = nullptr; @@ -247,7 +265,7 @@ class Output class OutputSparse : public Output { public: - virtual void init(std::vector const& sparseAxes, std::vector const& allAxes, std::vector const& sysAxes, std::vector const& allAxes_sys, bool produceTrue = false, bool eventMixing = false, bool produceLikesign = false, HistogramRegistry* registry = nullptr) + virtual void init(std::vector const& sparseAxes, std::vector const& allAxes, std::vector const& sysAxes, std::vector const& allAxes_sys, bool produceTrue = false, MixingType eventMixing = MixingType::none, bool produceLikesign = false, o2::framework::HistogramRegistry* registry = nullptr) { Output::init(sparseAxes, allAxes, sysAxes, allAxes_sys, produceTrue, eventMixing, produceLikesign, registry); @@ -260,8 +278,9 @@ class OutputSparse : public Output if (produceTrue) { mHistogramRegistry->add("unliketrue", "Unlike True", *mPairHisto); mHistogramRegistry->add("unlikegen", "Unlike Gen", *mPairHisto); + mHistogramRegistry->add("unlikegenold", "Unlike Gen Old", *mPairHisto); } - if (eventMixing) { + if (eventMixing != MixingType::none) { mHistogramRegistry->add("mixingpm", "Event Mixing pm", *mPairHisto); if (produceLikesign) { mHistogramRegistry->add("mixingpp", "Event Mixing pp", *mPairHisto); @@ -306,6 +325,9 @@ class OutputSparse : public Output case PairType::unlikegen: fillUnlikegen(point); break; + case PairType::unlikegenold: + fillUnlikegenOld(point); + break; case PairType::mixingpm: fillMixingpm(point); break; @@ -350,6 +372,10 @@ class OutputSparse : public Output { fillSparse(HIST("unlikegen"), point); } + virtual void fillUnlikegenOld(double* point) + { + fillSparse(HIST("unlikegenold"), point); + } virtual void fillMixingpm(double* point) { fillSparse(HIST("mixingpm"), point); From e91c6b6a21fcc972de94d1a8919c68cc7d6dab93 Mon Sep 17 00:00:00 2001 From: AlexianL <123153896+AlexianL@users.noreply.github.com> Date: Mon, 10 Feb 2025 09:32:24 +0100 Subject: [PATCH 0121/1650] [PWGHF] taskFlow.cxx: changes for better memory consumption, new cut (#9783) --- PWGHF/HFC/Tasks/taskFlow.cxx | 253 ++++++----------------------------- 1 file changed, 41 insertions(+), 212 deletions(-) diff --git a/PWGHF/HFC/Tasks/taskFlow.cxx b/PWGHF/HFC/Tasks/taskFlow.cxx index fd87b1c5fe0..ff58422ab14 100644 --- a/PWGHF/HFC/Tasks/taskFlow.cxx +++ b/PWGHF/HFC/Tasks/taskFlow.cxx @@ -63,11 +63,13 @@ struct HfTaskFlow { Configurable nMixedEvents{"nMixedEvents", 5, "Number of mixed events per event"}; // configurables for collisions Configurable zVertexMax{"zVertexMax", 7.0f, "Accepted z-vertex range"}; - // configurables for associated particles - Configurable etaTrackAssocMax{"etaTrackAssocMax", 0.8f, "max. eta of associated tracks"}; - Configurable ptTrackAssocMin{"ptTrackAssocMin", 0.5f, "min. pT of associated tracks"}; + // configurables for TPC tracks + Configurable etaTpcTrackMax{"etaTpcTrackMax", 0.8f, "max. eta of TPC tracks"}; + Configurable ptTpcTrackMin{"ptTpcTrackMin", 0.5f, "min. pT of TPC tracks"}; // configurables for HF candidates Configurable etaCandidateMax{"etaCandidateMax", 0.8f, "max. eta of HF candidate"}; + Configurable ptCandidateMax{"ptCandidateMax", 8.0f, "max. pT of candidates"}; + Configurable ptCandidateMin{"ptCandidateMin", 2.0f, "min. pT of candidates"}; Configurable selectionFlagD0{"selectionFlagD0", 1, "Selection Flag for D0"}; Configurable selectionFlagD0bar{"selectionFlagD0bar", 1, "Selection Flag for D0bar"}; Configurable selectionFlagLcToPKPi{"selectionFlagLcToPKPi", 1, "Selection Flag for LambdaC"}; @@ -79,9 +81,9 @@ struct HfTaskFlow { Configurable etaMftTrackMin{"etaMftTrackMin", -5, "Minimum value for the eta of MFT tracks"}; Configurable nClustersMftTrack{"nClustersMftTrack", 5, "Minimum number of clusters for the reconstruction of MFT tracks"}; - Service pdg; HfHelper hfHelper; SliceCache cache; + Service pdg; // ========================= // using declarations : DATA @@ -124,8 +126,8 @@ struct HfTaskFlow { // FIXME: The filter is applied also on the candidates! Beware! Filter collisionVtxZFilter = nabs(aod::collision::posZ) < zVertexMax; - Filter trackFilter = (nabs(aod::track::eta) < etaTrackAssocMax) && - (aod::track::pt > ptTrackAssocMin) && + Filter trackFilter = (nabs(aod::track::eta) < etaTpcTrackMax) && + (aod::track::pt > ptTpcTrackMin) && requireGlobalTrackWoPtEtaInFilter(); // ========================= @@ -136,9 +138,9 @@ struct HfTaskFlow { Filter mcCollisionFilter = nabs(aod::mccollision::posZ) < zVertexMax; // From Katarina's code - Filter mcParticlesFilter = (nabs(aod::mcparticle::eta) < etaTrackAssocMax) && - (aod::mcparticle::pt > ptTrackAssocMin); //&& - //(aod::mcparticle::sign != 0) + Filter mcParticlesFilter = (nabs(aod::mcparticle::eta) < etaTpcTrackMax) && + (aod::mcparticle::pt > ptTpcTrackMin); //&& + //(aod::mcparticle::sign != 0) // ========================= // Preslice : DATA @@ -168,6 +170,8 @@ struct HfTaskFlow { // either 1) add invariant mass axis or 2) define several containers for different inv. mass regions // Note: don't forget to check inv. mass separately for D0 and D0bar candidate ConfigurableAxis axisMass{"axisMass", {2, 1.7, 2.0}, "axis of invariant mass of HF candidates"}; + ConfigurableAxis binsMixingVertex{"binsMixingVertex", {14, -7, 7}, "vertex bins for event mixing"}; + ConfigurableAxis binsMixingMultiplicity{"binsMixingMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 100.1}, "multiplicity bins for event mixing"}; HistogramRegistry registry{"registry"}; @@ -230,14 +234,6 @@ struct HfTaskFlow { // DATA : event mixing histograms for TPC-TPC h-h mixed event registry.add("Data/TpcTpc/HadronHadron/MixedEvent/hEventCountMixing", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); - registry.add("Data/TpcTpc/HadronHadron/MixedEvent/hMultiplicityMixing", "hMultiplicityMixing", {HistType::kTH1F, {{500, 0, 500}}}); - registry.add("Data/TpcTpc/HadronHadron/MixedEvent/hVtxZMixing", "hVtxZMixing", {HistType::kTH1F, {{100, -10, 10}}}); - registry.add("Data/TpcTpc/HadronHadron/MixedEvent/hNtracksMixing", "hNtracksMixing", {HistType::kTH1F, {{500, 0, 500}}}); - - // DATA : particles histograms for TPC-TPC h-h mixed event - registry.add("Data/TpcTpc/HadronHadron/MixedEvent/hPtMixing", "pT", {HistType::kTH1F, {{100, 0, 10, "p_{T}"}}}); - registry.add("Data/TpcTpc/HadronHadron/MixedEvent/hEtaMixing", "eta", {HistType::kTH1F, {{100, -4, 4, "#eta"}}}); - registry.add("Data/TpcTpc/HadronHadron/MixedEvent/hPhiMixing", "phi", {HistType::kTH1F, {{100, 0, TwoPI, "#varphi"}}}); // ========================= // DATA : histograms for TPC-TPC HF-h case for 2PRONG @@ -255,9 +251,6 @@ struct HfTaskFlow { registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hPhi", "phi", {HistType::kTH1F, {{100, 0, TwoPI, "#varphi"}}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hMultiplicity", "multiplicity;multiplicity;entries", {HistType::kTH1F, {{10000, 0., 10000.}}}); registry.add("Data/TpcTpc/HfHadron/MixedEvent/hEventCountHFMixing", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); - registry.add("Data/TpcTpc/HfHadron/MixedEvent/hMultiplicityHFMixing", "hMultiplicityHFMixing", {HistType::kTH1F, {{500, 0, 500}}}); - registry.add("Data/TpcTpc/HfHadron/MixedEvent/hVtxZHFMixing", "hVtxZHFMixing", {HistType::kTH1F, {{100, -10, 10}}}); - registry.add("Data/TpcTpc/HfHadron/MixedEvent/hNtracksHFMixing", "hNtracksHFMixing", {HistType::kTH1F, {{500, 0, 500}}}); // DATA : trigger particles (candidates) histograms for TPC-TPC h-h same event auto vbins = (std::vector)binsPt; @@ -280,11 +273,6 @@ struct HfTaskFlow { registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hDecLenErr", "2-prong candidates;decay length error (cm);entries", {HistType::kTH2F, {{100, 0., 1.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hDecLenXYErr", "2-prong candidates;decay length xy error (cm);entries", {HistType::kTH2F, {{100, 0., 1.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - // DATA : trigger particles (candidates) histograms for TPC-TPC h-h mixed event - registry.add("Data/TpcTpc/HfHadron/MixedEvent/hPtHFMixing", "pT", {HistType::kTH1F, {{100, 0, 10, "p_{T}"}}}); - registry.add("Data/TpcTpc/HfHadron/MixedEvent/hEtaHFMixing", "eta", {HistType::kTH1F, {{100, -4, 4, "#eta"}}}); - registry.add("Data/TpcTpc/HfHadron/MixedEvent/hPhiHFMixing", "phi", {HistType::kTH1F, {{100, 0, TwoPI, "#varphi"}}}); - // ========================= // DATA : histograms for TPC-TPC HF-h case for 3PRONG // =================== @@ -348,22 +336,6 @@ struct HfTaskFlow { registry.add("Data/TpcMft/HadronHadron/SameEvent/hYieldsMFT", "multiplicity vs pT vs eta", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {40, 0, 20, "p_{T}"}, {100, -5, 0, "#eta"}}}); // registry.add("Data/TpcMft/HadronHadron/SameEvent/hNtracksMFT", "hNtracks", {HistType::kTH1F, {{500, 0, 500}}}); - // DATA : histograms for TPC-MFT h-h event mixing for TPC tracks - registry.add("Data/TpcMft/HadronHadron/MixedEvent/hMultiplicityMixingTPC", "hMultiplicityMixing", {HistType::kTH1F, {{500, 0, 500}}}); - registry.add("Data/TpcMft/HadronHadron/MixedEvent/hVtxZMixingTPC", "hVtxZMixing", {HistType::kTH1F, {{100, -10, 10}}}); - registry.add("Data/TpcMft/HadronHadron/MixedEvent/hPtMixingTPC", "pT", {HistType::kTH1F, {{100, 0, 10, "p_{T}"}}}); - registry.add("Data/TpcMft/HadronHadron/MixedEvent/hEtaMixingTPC", "eta", {HistType::kTH1F, {{100, -4, 4, "#eta"}}}); - registry.add("Data/TpcMft/HadronHadron/MixedEvent/hPhiMixingTPC", "phi", {HistType::kTH1F, {{100, 0, TwoPI, "#varphi"}}}); - registry.add("Data/TpcMft/HadronHadron/MixedEvent/hNtracksMixingTPC", "hNtracksMixing", {HistType::kTH1F, {{500, 0, 500}}}); - - // DATA : histograms for TPC-MFT h-h event mixing for MFT tracks - registry.add("Data/TpcMft/HadronHadron/MixedEvent/hMultiplicityMixingMFT", "hMultiplicityMixing", {HistType::kTH1F, {{500, 0, 500}}}); - registry.add("Data/TpcMft/HadronHadron/MixedEvent/hVtxZMixingMFT", "hVtxZMixing", {HistType::kTH1F, {{100, -10, 10}}}); - registry.add("Data/TpcMft/HadronHadron/MixedEvent/hPtMixingMFT", "pT", {HistType::kTH1F, {{100, 0, 10, "p_{T}"}}}); - registry.add("Data/TpcMft/HadronHadron/MixedEvent/hEtaMixingMFT", "eta", {HistType::kTH1F, {{100, -4, 4, "#eta"}}}); - registry.add("Data/TpcMft/HadronHadron/MixedEvent/hPhiMixingMFT", "phi", {HistType::kTH1F, {{100, 0, TwoPI, "#varphi"}}}); - registry.add("Data/TpcMft/HadronHadron/MixedEvent/hNtracksMixingMFT", "hNtracksMixing", {HistType::kTH1F, {{500, 0, 500}}}); - // DATA : histograms for TPC-MFT h-h event mixing for events QA registry.add("Data/TpcMft/HadronHadron/MixedEvent/hEventCountMixing", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); @@ -408,22 +380,6 @@ struct HfTaskFlow { registry.add("Data/TpcMft/HfHadron/SameEvent/hYieldsMFT", "multiplicity vs pT vs eta", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {40, 0, 20, "p_{T}"}, {100, -5, 0, "#eta"}}}); // registry.add("Data/TpcMft/HfHadron/SameEvent/hNtracksMFT", "hNtracks", {HistType::kTH1F, {{500, 0, 500}}}); - // DATA : histograms for TPC-MFT h-h event mixing for candidates - registry.add("Data/TpcMft/HfHadron/MixedEvent/hMultiplicityMixingCandidate", "hMultiplicityMixing", {HistType::kTH1F, {{500, 0, 500}}}); - registry.add("Data/TpcMft/HfHadron/MixedEvent/hVtxZMixingCandidate", "hVtxZMixing", {HistType::kTH1F, {{100, -10, 10}}}); - registry.add("Data/TpcMft/HfHadron/MixedEvent/hPtMixingCandidate", "pT", {HistType::kTH1F, {{100, 0, 10, "p_{T}"}}}); - registry.add("Data/TpcMft/HfHadron/MixedEvent/hEtaMixingCandidate", "eta", {HistType::kTH1F, {{100, -4, 4, "#eta"}}}); - registry.add("Data/TpcMft/HfHadron/MixedEvent/hPhiMixingCandidate", "phi", {HistType::kTH1F, {{100, 0, TwoPI, "#varphi"}}}); - registry.add("Data/TpcMft/HfHadron/MixedEvent/hNtracksMixingCandidate", "hNtracksMixing", {HistType::kTH1F, {{500, 0, 500}}}); - - // DATA : histograms for TPC-MFT h-h event mixing for MFT tracks - registry.add("Data/TpcMft/HfHadron/MixedEvent/hMultiplicityMixingMFT", "hMultiplicityMixing", {HistType::kTH1F, {{500, 0, 500}}}); - registry.add("Data/TpcMft/HfHadron/MixedEvent/hVtxZMixingMFT", "hVtxZMixing", {HistType::kTH1F, {{100, -10, 10}}}); - registry.add("Data/TpcMft/HfHadron/MixedEvent/hPtMixingMFT", "pT", {HistType::kTH1F, {{100, 0, 10, "p_{T}"}}}); - registry.add("Data/TpcMft/HfHadron/MixedEvent/hEtaMixingMFT", "eta", {HistType::kTH1F, {{100, -4, 4, "#eta"}}}); - registry.add("Data/TpcMft/HfHadron/MixedEvent/hPhiMixingMFT", "phi", {HistType::kTH1F, {{100, 0, TwoPI, "#varphi"}}}); - registry.add("Data/TpcMft/HfHadron/MixedEvent/hNtracksMixingMFT", "hNtracksMixing", {HistType::kTH1F, {{500, 0, 500}}}); - // DATA : histograms for TPC-MFT h-h event mixing for events QA registry.add("Data/TpcMft/HfHadron/MixedEvent/hEventCountMixing", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); @@ -876,22 +832,6 @@ struct HfTaskFlow { // Quality Assesment plots for Mixed Event // ========================= - // ---- DATA : TPC-TPC h-h Mixed Event QA ---- - template - void fillTpcTpcChChMixedEventQa(float multiplicity, float vz, TTracks const& tracks) - { - registry.fill(HIST("Data/TpcTpc/HadronHadron/MixedEvent/hMultiplicityMixing"), multiplicity); - registry.fill(HIST("Data/TpcTpc/HadronHadron/MixedEvent/hVtxZMixing"), vz); - - int nTracks = tracks.size(); - for (const auto& track1 : tracks) { - registry.fill(HIST("Data/TpcTpc/HadronHadron/MixedEvent/hPtMixing"), track1.pt()); - registry.fill(HIST("Data/TpcTpc/HadronHadron/MixedEvent/hEtaMixing"), track1.eta()); - registry.fill(HIST("Data/TpcTpc/HadronHadron/MixedEvent/hPhiMixing"), track1.phi()); - } - registry.fill(HIST("Data/TpcTpc/HadronHadron/MixedEvent/hNtracksMixing"), nTracks); - } - // ---- MC : TPC-TPC h-h Mixed Event QA ---- template void fillTpcTpcChChMixedEventQaMc(float multiplicity, float vz, TTracks const& tracks) @@ -923,117 +863,13 @@ struct HfTaskFlow { } } - // ---- DATA : TPC-TPC HF-h Mixed Event QA ---- - template - void fillTpcTpcHfChMixedEventQa(float multiplicity, float vz, TTracks const& tracks) - { - // This function is only called with HF candidates - - registry.fill(HIST("Data/TpcTpc/HfHadron/MixedEvent/hMultiplicityHFMixing"), multiplicity); - registry.fill(HIST("Data/TpcTpc/HfHadron/MixedEvent/hVtxZHFMixing"), vz); - - int nTracks = tracks.size(); - for (const auto& track1 : tracks) { - - // apply candidate cuts - if (!isAcceptedCandidate(track1)) { - continue; - } - - registry.fill(HIST("Data/TpcTpc/HfHadron/MixedEvent/hPtHFMixing"), track1.pt()); - registry.fill(HIST("Data/TpcTpc/HfHadron/MixedEvent/hEtaHFMixing"), track1.eta()); - registry.fill(HIST("Data/TpcTpc/HfHadron/MixedEvent/hPhiHFMixing"), track1.phi()); - } - registry.fill(HIST("Data/TpcTpc/HfHadron/MixedEvent/hNtracksHFMixing"), nTracks); - } - - // ---- DATA : TPC-MFT h-h Mixed Event QA ---- - template - void fillTpcMftChChMixedEventQa(float multiplicity, float vz, TTracks const& tracks) - { - if constexpr (std::is_same_v) { // if MFT tracks - int nTracks = tracks.size(); - - registry.fill(HIST("Data/TpcMft/HadronHadron/MixedEvent/hMultiplicityMixingMFT"), multiplicity); - registry.fill(HIST("Data/TpcMft/HadronHadron/MixedEvent/hVtxZMixingMFT"), vz); - - for (const auto& track1 : tracks) { - - // apply cuts for MFT tracks - if (!isAcceptedMftTrack(track1)) { - continue; - } - - registry.fill(HIST("Data/TpcMft/HadronHadron/MixedEvent/hPtMixingMFT"), track1.pt()); - registry.fill(HIST("Data/TpcMft/HadronHadron/MixedEvent/hEtaMixingMFT"), track1.eta()); - registry.fill(HIST("Data/TpcMft/HadronHadron/MixedEvent/hPhiMixingMFT"), track1.phi()); - } - registry.fill(HIST("Data/TpcMft/HadronHadron/MixedEvent/hNtracksMixingMFT"), nTracks); - } else { // if TPC tracks - - int nTracks = tracks.size(); - - registry.fill(HIST("Data/TpcMft/HadronHadron/MixedEvent/hMultiplicityMixingTPC"), multiplicity); - registry.fill(HIST("Data/TpcMft/HadronHadron/MixedEvent/hVtxZMixingTPC"), vz); - - for (const auto& track1 : tracks) { - - registry.fill(HIST("Data/TpcMft/HadronHadron/MixedEvent/hPtMixingTPC"), track1.pt()); - registry.fill(HIST("Data/TpcMft/HadronHadron/MixedEvent/hEtaMixingTPC"), track1.eta()); - registry.fill(HIST("Data/TpcMft/HadronHadron/MixedEvent/hPhiMixingTPC"), track1.phi()); - } - registry.fill(HIST("Data/TpcMft/HadronHadron/MixedEvent/hNtracksMixingTPC"), nTracks); - } - } - - // ---- DATA : TPC-MFT h-h Mixed Event QA ---- - template - void fillTpcMftHfChMixedEventQa(float multiplicity, float vz, TTracks const& tracks) - { - if constexpr (std::is_same_v) { // if MFT tracks - registry.fill(HIST("Data/TpcMft/HfHadron/MixedEvent/hMultiplicityMixingMFT"), multiplicity); - registry.fill(HIST("Data/TpcMft/HfHadron/MixedEvent/hVtxZMixingMFT"), vz); - - int nTracks = tracks.size(); - for (const auto& track1 : tracks) { - - // apply cuts for MFT tracks - if (!isAcceptedMftTrack(track1)) { - continue; - } - - registry.fill(HIST("Data/TpcMft/HfHadron/MixedEvent/hPtMixingMFT"), track1.pt()); - registry.fill(HIST("Data/TpcMft/HfHadron/MixedEvent/hEtaMixingMFT"), track1.eta()); - registry.fill(HIST("Data/TpcMft/HfHadron/MixedEvent/hPhiMixingMFT"), track1.phi()); - } - registry.fill(HIST("Data/TpcMft/HfHadron/MixedEvent/hNtracksMixingMFT"), nTracks); - } else { // if candidate tracks - registry.fill(HIST("Data/TpcMft/HfHadron/MixedEvent/hMultiplicityMixingCandidate"), multiplicity); - registry.fill(HIST("Data/TpcMft/HfHadron/MixedEvent/hVtxZMixingCandidate"), vz); - - int nTracks = tracks.size(); - for (const auto& track1 : tracks) { - - // apply candidate cuts - if (!isAcceptedCandidate(track1)) { - continue; - } - - registry.fill(HIST("Data/TpcMft/HfHadron/MixedEvent/hPtMixingCandidate"), track1.pt()); - registry.fill(HIST("Data/TpcMft/HfHadron/MixedEvent/hEtaMixingCandidate"), track1.eta()); - registry.fill(HIST("Data/TpcMft/HfHadron/MixedEvent/hPhiMixingCandidate"), track1.phi()); - } - registry.fill(HIST("Data/TpcMft/HfHadron/MixedEvent/hNtracksMixingCandidate"), nTracks); - } - } - // ========================= // Cuts with functions // ========================= // FIXME: Some collisions are rejected here, what causes (part of) differences with the D0 task template - bool isCollisionSelected(TCollision const& collision, bool fillHistograms = false) + bool isAcceptedCollision(TCollision const& collision, bool fillHistograms = false) { if (fillHistograms) registry.fill(HIST("Data/hEventCounter"), 1); @@ -1055,6 +891,7 @@ struct HfTaskFlow { bool isAcceptedCandidate(TTrack const& candidate) { auto etaCandidate = candidate.eta(); + auto ptCandidate = candidate.pt(); if constexpr (std::is_same_v) { // For now, that means we do LambdaC if (!(candidate.hfflag() & 1 << aod::hf_cand_3prong::DecayType::LcToPKPi)) { @@ -1066,6 +903,12 @@ struct HfTaskFlow { if (etaCandidateMax >= 0. && std::abs(etaCandidate) > etaCandidateMax) { return false; } + if (ptCandidateMax >= 0. && ptCandidate > ptCandidateMax) { + return false; + } + if (ptCandidateMin >= 0. && ptCandidate < ptCandidateMin) { + return false; + } return true; } else { // For now, that means we do D0 if (!(candidate.hfflag() & 1 << aod::hf_cand_2prong::DecayType::D0ToPiK)) { @@ -1077,6 +920,12 @@ struct HfTaskFlow { if (etaCandidateMax >= 0. && std::abs(etaCandidate) > etaCandidateMax) { return false; } + if (ptCandidateMax >= 0. && ptCandidate > ptCandidateMax) { + return false; + } + if (ptCandidateMin >= 0. && ptCandidate < ptCandidateMin) { + return false; + } return true; } } @@ -1305,17 +1154,17 @@ struct HfTaskFlow { // The first one that I call "Data" should work for data and mc rec using BinningTypeData = FlexibleBinningPolicy, aod::collision::PosZ, decltype(getPartsSize)>; - BinningTypeData binningWithTracksSize{{getPartsSize}, {axisVertex, axisMultiplicity}, true}; + BinningTypeData binningWithTracksSize{{getPartsSize}, {binsMixingVertex, binsMixingMultiplicity}, true}; auto tracksTuple = std::make_tuple(tracks1, tracks2); Pair pair{binningWithTracksSize, nMixedEvents, -1, collisions, tracksTuple, &cache}; for (const auto& [collision1, tracks1, collision2, tracks2] : pair) { if constexpr (!std::is_same_v) { // if NOT MC -> do collision cut - if (!(isCollisionSelected(collision1, false))) { + if (!(isAcceptedCollision(collision1, false))) { continue; } - if (!(isCollisionSelected(collision2, false))) { + if (!(isAcceptedCollision(collision2, false))) { continue; } } @@ -1324,41 +1173,21 @@ struct HfTaskFlow { int bin = binningWithTracksSize.getBin(binningValues); const auto multiplicityTracks1 = getPartsSize(collision1); - const auto multiplicityTracks2 = getPartsSize(collision2); - // const auto multiplicityTracks1 = tracks1.size(); // get multiplicity of charged hadrons, which is used for slicing in mixing - // const auto multiplicityTracks2 = tracks2.size(); // get multiplicity of charged hadrons, which is used for slicing in mixing - const auto vz = collision1.posZ(); if constexpr (std::is_same_v) { // If MC registry.fill(HIST("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hEventCountMixing"), bin); - // fillTpcTpcChChMixedEventQaMc(multiplicityTracks2, vz, tracks1); - - // if constexpr (std::is_same_v || std::is_same_v) { - // registry.fill(HIST("Data/TpcTpc/HfHadron/MixedEvent/hEventCountHFMixing"), bin); - // fillHFMixingQA(multiplicity, vz, tracks1); - // } else { - // registry.fill(HIST("Data/TpcTpc/HadronHadron/MixedEvent/hEventCountMixing"), bin); - // fillMixingQA(multiplicity, vz, tracks1); - // } - } else { // If not MC if constexpr (std::is_same_v) { // IF TPC-MFT case if constexpr (std::is_same_v || std::is_same_v) { // IF HF-h case -> TPC-MFT HF-h registry.fill(HIST("Data/TpcMft/HfHadron/MixedEvent/hEventCountMixing"), bin); - fillTpcMftHfChMixedEventQa(multiplicityTracks1, vz, tracks1); // Candidates - fillTpcMftHfChMixedEventQa(multiplicityTracks2, vz, tracks2); // MFT tracks - } else { // IF h-h case -> TPC-MFT h-h case + } else { // IF h-h case -> TPC-MFT h-h case registry.fill(HIST("Data/TpcMft/HadronHadron/MixedEvent/hEventCountMixing"), bin); - fillTpcMftChChMixedEventQa(multiplicityTracks1, vz, tracks1); // TPC tracks - fillTpcMftChChMixedEventQa(multiplicityTracks2, vz, tracks2); // MFT tracks } } else { // IF TPC-TPC case if constexpr (std::is_same_v || std::is_same_v) { // IF HF-h case -> TPC-TPC HF-h registry.fill(HIST("Data/TpcTpc/HfHadron/MixedEvent/hEventCountHFMixing"), bin); - fillTpcTpcHfChMixedEventQa(multiplicityTracks2, vz, tracks1); } else { // IF h-h case -> TPC-TPC h-h case registry.fill(HIST("Data/TpcTpc/HadronHadron/MixedEvent/hEventCountMixing"), bin); - fillTpcTpcChChMixedEventQa(multiplicityTracks2, vz, tracks1); } } // end of if condition for TPC-TPC or TPC-MFT case } @@ -1384,10 +1213,10 @@ struct HfTaskFlow { // added this to try to compile when doing mixed event with FilteredMcParticles and FilteredMcCollisions (MC truth) // TODO : GET RID OF THE COLLISION SELECTION FOR MC TRUTH // if constexpr (!std::is_same_v) { - // if (!(isCollisionSelected(collision1, false))) { + // if (!(isAcceptedCollision(collision1, false))) { // continue; // } - // if (!(isCollisionSelected(collision2, false))) { + // if (!(isAcceptedCollision(collision2, false))) { // continue; // } //} @@ -1423,7 +1252,7 @@ struct HfTaskFlow { void processSameTpcTpcChCh(FilteredCollisionsWSelMult::iterator const& collision, TracksWDcaSel const& tracks) { - if (!(isCollisionSelected(collision, true))) { + if (!(isAcceptedCollision(collision, true))) { return; } @@ -1462,7 +1291,7 @@ struct HfTaskFlow { if (doReferenceFlow) fillEventSelectionPlots = false; - if (!(isCollisionSelected(collision, fillEventSelectionPlots))) { + if (!(isAcceptedCollision(collision, fillEventSelectionPlots))) { return; } @@ -1491,7 +1320,7 @@ struct HfTaskFlow { if (doReferenceFlow) fillEventSelectionPlots = false; - if (!(isCollisionSelected(collision, fillEventSelectionPlots))) { + if (!(isAcceptedCollision(collision, fillEventSelectionPlots))) { return; } @@ -1514,7 +1343,7 @@ struct HfTaskFlow { TracksWDcaSel const& tracks, aod::MFTTracks const& mftTracks) { - if (!(isCollisionSelected(collision, true))) { + if (!(isAcceptedCollision(collision, true))) { return; } @@ -1544,7 +1373,7 @@ struct HfTaskFlow { if (doReferenceFlow) fillEventSelectionPlots = false; - if (!(isCollisionSelected(collision, fillEventSelectionPlots))) { + if (!(isAcceptedCollision(collision, fillEventSelectionPlots))) { return; } @@ -1574,7 +1403,7 @@ struct HfTaskFlow { if (doReferenceFlow) fillEventSelectionPlots = false; - if (!(isCollisionSelected(collision, fillEventSelectionPlots))) { + if (!(isAcceptedCollision(collision, fillEventSelectionPlots))) { return; } @@ -1598,7 +1427,7 @@ struct HfTaskFlow { { // NEED TO COMMENT THIS - // if (!(isCollisionSelected(mcCollision, true))) { + // if (!(isAcceptedCollision(mcCollision, true))) { // return; //} @@ -1622,7 +1451,7 @@ struct HfTaskFlow { FilteredMcParticles const& mcParticles) { - // if (!(isCollisionSelected(mcCollision, true))) { + // if (!(isAcceptedCollision(mcCollision, true))) { // return; // } From 9ce9b30ecdb93614672a41f2f126782bf7983401 Mon Sep 17 00:00:00 2001 From: samrangy Date: Mon, 10 Feb 2025 09:42:25 +0100 Subject: [PATCH 0122/1650] [PWGHF] Add ML and D0 efficiency in D0-h correlation (#9775) --- PWGHF/HFC/DataModel/CorrelationTables.h | 49 +- .../HFC/TableProducer/correlatorD0Hadrons.cxx | 637 +++++++++++------- PWGHF/HFC/Tasks/taskCorrelationD0Hadrons.cxx | 538 ++++++++++----- 3 files changed, 787 insertions(+), 437 deletions(-) diff --git a/PWGHF/HFC/DataModel/CorrelationTables.h b/PWGHF/HFC/DataModel/CorrelationTables.h index d215eb75269..797d693e176 100644 --- a/PWGHF/HFC/DataModel/CorrelationTables.h +++ b/PWGHF/HFC/DataModel/CorrelationTables.h @@ -51,21 +51,27 @@ DECLARE_SOA_TABLE(DDbarRecoInfo, "AOD", "DDBARRECOINFO", // definition of columns and tables for D0-Hadron correlation pairs namespace hf_correlation_d0_hadron { -DECLARE_SOA_COLUMN(DeltaPhi, deltaPhi, float); //! DeltaPhi between D0 and Hadrons -DECLARE_SOA_COLUMN(DeltaEta, deltaEta, float); //! DeltaEta between D0 and Hadrons -DECLARE_SOA_COLUMN(PtD, ptD, float); //! Transverse momentum of D0 -DECLARE_SOA_COLUMN(PtHadron, ptHadron, float); //! Transverse momentum of Hadron -DECLARE_SOA_COLUMN(MD, mD, float); //! Invariant mass of D0 -DECLARE_SOA_COLUMN(MDbar, mDbar, float); //! Invariant mass of D0bar -DECLARE_SOA_COLUMN(MlScoreBkgD0, mlScoreBkgD0, float); //! ML background score for D0 selection -DECLARE_SOA_COLUMN(MlScoreNonPromptD0, mlScoreNonPromptD0, float); //! ML prompt score for D0 selection -DECLARE_SOA_COLUMN(MlScorePromptD0, mlScorePromptD0, float); //! ML prompt score for D0 selection -DECLARE_SOA_COLUMN(MlScoreBkgD0bar, mlScoreBkgD0bar, float); //! ML background score for D0 selection -DECLARE_SOA_COLUMN(MlScoreNonPromptD0bar, mlScoreNonPromptD0bar, float); //! ML prompt score for D0 selection -DECLARE_SOA_COLUMN(MlScorePromptD0bar, mlScorePromptD0bar, float); //! ML prompt score for D0 selection -DECLARE_SOA_COLUMN(SignalStatus, signalStatus, int); //! Tag for D0,D0bar -DECLARE_SOA_COLUMN(PoolBin, poolBin, int); //! Pool Bin for the MixedEvent -DECLARE_SOA_COLUMN(IsAutoCorrelated, isAutoCorrelated, bool); //! Correlation Status +DECLARE_SOA_COLUMN(DeltaPhi, deltaPhi, float); //! DeltaPhi between D0 and Hadrons +DECLARE_SOA_COLUMN(DeltaEta, deltaEta, float); //! DeltaEta between D0 and Hadrons +DECLARE_SOA_COLUMN(PtD, ptD, float); //! Transverse momentum of D0 +DECLARE_SOA_COLUMN(PtHadron, ptHadron, float); //! Transverse momentum of Hadron +DECLARE_SOA_COLUMN(MD, mD, float); //! Invariant mass of D0 +DECLARE_SOA_COLUMN(MDbar, mDbar, float); //! Invariant mass of D0bar +DECLARE_SOA_COLUMN(MlScoreBkgD0, mlScoreBkgD0, float); //! ML background score for D0 selection +DECLARE_SOA_COLUMN(MlScoreNonPromptD0, mlScoreNonPromptD0, float); //! ML prompt score for D0 selection +DECLARE_SOA_COLUMN(MlScorePromptD0, mlScorePromptD0, float); //! ML prompt score for D0 selection +DECLARE_SOA_COLUMN(MlScoreBkgD0bar, mlScoreBkgD0bar, float); //! ML background score for D0 selection +DECLARE_SOA_COLUMN(MlScoreNonPromptD0bar, mlScoreNonPromptD0bar, float); //! ML prompt score for D0 selection +DECLARE_SOA_COLUMN(MlScorePromptD0bar, mlScorePromptD0bar, float); //! ML prompt score for D0 selection +DECLARE_SOA_COLUMN(SignalStatus, signalStatus, int); //! Tag for D0,D0bar +DECLARE_SOA_COLUMN(PoolBin, poolBin, int); //! Pool Bin for the MixedEvent +DECLARE_SOA_COLUMN(TrackDcaXY, trackDcaXY, float); //! DCA xy of the track +DECLARE_SOA_COLUMN(TrackDcaZ, trackDcaZ, float); //! DCA z of the track +DECLARE_SOA_COLUMN(TrackTPCNClsCrossedRows, trackTPCNClsCrossedRows, int); //! Number of crossed TPC Rows +DECLARE_SOA_COLUMN(IsAutoCorrelated, isAutoCorrelated, bool); //! Correlation Status +DECLARE_SOA_COLUMN(TrackOrigin, trackOrigin, int); //! Check track origin +DECLARE_SOA_COLUMN(IsPrompt, isPrompt, bool); //! Used in MC-Rec, D0 Prompt or Non-Prompt +DECLARE_SOA_COLUMN(IsPhysicalPrimary, isPhysicalPrimary, bool); //! Used in MC-Rec, primary associated particles enum ParticleTypeData { D0Only = 1, // Identified as D0 @@ -100,6 +106,11 @@ DECLARE_SOA_TABLE(D0HadronRecoInfo, "AOD", "D0HRECOINFO", //! D0-Hadrons pairs R aod::hf_correlation_d0_hadron::MDbar, aod::hf_correlation_d0_hadron::SignalStatus); +DECLARE_SOA_TABLE(D0HadronGenInfo, "AOD", "D0HGENINFO", //! D0-Hadrons pairs Generated Information + aod::hf_correlation_d0_hadron::IsPrompt, + aod::hf_correlation_d0_hadron::IsPhysicalPrimary, + aod::hf_correlation_d0_hadron::TrackOrigin); + DECLARE_SOA_TABLE(D0HadronMlInfo, "AOD", "D0HMLINFO", //! D0-Hadrons pairs Machine Learning Information aod::hf_correlation_d0_hadron::MlScoreBkgD0, aod::hf_correlation_d0_hadron::MlScoreNonPromptD0, @@ -117,6 +128,14 @@ DECLARE_SOA_TABLE(D0CandRecoInfo, "AOD", "D0CANDRECOINFO", //! Ds candidates Rec aod::hf_correlation_d0_hadron::MlScoreBkgD0bar, aod::hf_correlation_d0_hadron::MlScorePromptD0bar); +DECLARE_SOA_TABLE(D0CandGenInfo, "AOD", "D0CANDGENOINFO", //! Ds candidates Generated Information + aod::hf_correlation_d0_hadron::IsPrompt); + +DECLARE_SOA_TABLE(D0TrackRecoInfo, "AOD", "D0TRACKRECOINFO", //! Tracks Reconstructed Information + aod::hf_correlation_d0_hadron::TrackDcaXY, + aod::hf_correlation_d0_hadron::TrackDcaZ, + aod::hf_correlation_d0_hadron::TrackTPCNClsCrossedRows); + // Note: definition of columns and tables for Lc-Hadron correlation pairs namespace hf_correlation_lc_hadron { diff --git a/PWGHF/HFC/TableProducer/correlatorD0Hadrons.cxx b/PWGHF/HFC/TableProducer/correlatorD0Hadrons.cxx index 3500b09dc92..675a682b21b 100644 --- a/PWGHF/HFC/TableProducer/correlatorD0Hadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorD0Hadrons.cxx @@ -49,39 +49,25 @@ double getDeltaPhi(double phiHadron, double phiD) return RecoDecay::constrainAngle(phiHadron - phiD, -o2::constants::math::PIHalf); } -const int nPtBinsMassAndEfficiency = o2::analysis::hf_cuts_d0_to_pi_k::nBinsPt; -const double efficiencyDmesonDefault[nPtBinsMassAndEfficiency] = {}; -auto vecEfficiencyDmeson = std::vector{efficiencyDmesonDefault, efficiencyDmesonDefault + nPtBinsMassAndEfficiency}; - -// histogram binning definition -const int massAxisNBins = 200; -const double massAxisMin = 1.3848; -const double massAxisMax = 2.3848; -const int phiAxisNBins = 32; -const double phiAxisMin = 0.; -const double phiAxisMax = o2::constants::math::TwoPI; -const int yAxisNBins = 100; -const double yAxisMin = -5.; -const double yAxisMax = 5.; -const int ptDAxisNBins = 180; -const double ptDAxisMin = 0.; -const double ptDAxisMax = 36.; - // Types using BinningType = ColumnBinningPolicy>; +using BinningTypeMcGen = ColumnBinningPolicy; using SelectedCollisions = soa::Filtered>; using SelectedTracks = soa::Filtered>; using SelectedCandidatesData = soa::Filtered>; using SelectedCandidatesDataMl = soa::Filtered>; using SelectedTracksMcRec = soa::Filtered>; using SelectedCandidatesMcRec = soa::Filtered>; +using SelectedCandidatesMcRecMl = soa::Filtered>; using SelectedCollisionsMcGen = soa::Filtered>; using SelectedParticlesMcGen = soa::Join; // Code to select collisions with at least one D0 struct HfCorrelatorD0HadronsSelection { - Produces d0Sel; + Produces collisionsWithSelD0; + Configurable useSel8{"useSel8", true, "Flag for applying sel8 for collision selection"}; + Configurable selNoSameBunchPileUpColl{"selNoSameBunchPileUpColl", true, "Flag for rejecting the collisions associated with the same bunch crossing"}; Configurable selectionFlagD0{"selectionFlagD0", 1, "Selection Flag for D0"}; Configurable selectionFlagD0bar{"selectionFlagD0bar", 1, "Selection Flag for D0bar"}; Configurable yCandMax{"yCandMax", 4.0, "max. cand. rapidity"}; @@ -89,60 +75,89 @@ struct HfCorrelatorD0HadronsSelection { HfHelper hfHelper; SliceCache cache; + + using SelCollisions = soa::Join; + Preslice perCol = aod::hf_cand::collisionId; Partition> selectedD0Candidates = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlagD0 || aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlagD0bar; Partition> selectedD0candidatesMc = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlagD0 || aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlagD0bar; - void processD0SelectionData(aod::Collision const& collision, + void processD0SelectionData(SelCollisions::iterator const& collision, soa::Join const&) { - bool isD0Found = 0; + bool isSelColl = true; + bool isD0Found = true; + bool isSel8 = true; + bool isNosameBunchPileUp = true; if (selectedD0Candidates.size() > 0) { auto selectedD0CandidatesGrouped = selectedD0Candidates->sliceByCached(aod::hf_cand::collisionId, collision.globalIndex(), cache); for (const auto& candidate : selectedD0CandidatesGrouped) { // check decay channel flag for candidate if (!TESTBIT(candidate.hfflag(), aod::hf_cand_2prong::DecayType::D0ToPiK)) { + isD0Found = false; continue; } if (std::abs(hfHelper.yD0(candidate)) > yCandMax || candidate.pt() < ptCandMin) { + isD0Found = false; continue; } - isD0Found = 1; + isD0Found = true; break; } } - d0Sel(isD0Found); + if (useSel8) { + isSel8 = false; + isSel8 = collision.sel8(); + } + if (selNoSameBunchPileUpColl) { + isNosameBunchPileUp = false; + isNosameBunchPileUp = static_cast(collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)); + } + isSelColl = isD0Found && isSel8 && isNosameBunchPileUp; + collisionsWithSelD0(isSelColl); } PROCESS_SWITCH(HfCorrelatorD0HadronsSelection, processD0SelectionData, "Process D0 Selection Data", false); - void processD0SelectionMcRec(aod::Collision const& collision, + void processD0SelectionMcRec(SelCollisions::iterator const& collision, soa::Join const&) { - bool isD0Found = 0; + bool isSelColl = true; + bool isD0Found = true; + bool isSel8 = true; + bool isNosameBunchPileUp = true; if (selectedD0candidatesMc.size() > 0) { auto selectedD0CandidatesGroupedMc = selectedD0candidatesMc->sliceByCached(aod::hf_cand::collisionId, collision.globalIndex(), cache); for (const auto& candidate : selectedD0CandidatesGroupedMc) { // check decay channel flag for candidate if (!TESTBIT(candidate.hfflag(), aod::hf_cand_2prong::DecayType::D0ToPiK)) { + isD0Found = false; continue; } if (std::abs(hfHelper.yD0(candidate)) > yCandMax || candidate.pt() < ptCandMin) { + isD0Found = false; continue; } - isD0Found = 1; + isD0Found = true; break; } } - d0Sel(isD0Found); + if (useSel8) { + isSel8 = collision.sel8(); + } + if (selNoSameBunchPileUpColl) { + isNosameBunchPileUp = static_cast(collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)); + } + isSelColl = isD0Found && isSel8 && isNosameBunchPileUp; + collisionsWithSelD0(isSelColl); } PROCESS_SWITCH(HfCorrelatorD0HadronsSelection, processD0SelectionMcRec, "Process D0 Selection MCRec", true); void processD0SelectionMcGen(aod::McCollision const&, aod::McParticles const& mcParticles) { - bool isD0Found = 0; + bool isD0Found = false; for (const auto& particle : mcParticles) { if (std::abs(particle.pdgCode()) != Pdg::kD0) { continue; @@ -151,10 +166,10 @@ struct HfCorrelatorD0HadronsSelection { if (std::abs(yD) > yCandMax || particle.pt() < ptCandMin) { continue; } - isD0Found = 1; + isD0Found = true; break; } - d0Sel(isD0Found); + collisionsWithSelD0(isD0Found); } PROCESS_SWITCH(HfCorrelatorD0HadronsSelection, processD0SelectionMcGen, "Process D0 Selection MCGen", false); }; @@ -163,8 +178,11 @@ struct HfCorrelatorD0HadronsSelection { struct HfCorrelatorD0Hadrons { Produces entryD0HadronPair; Produces entryD0HadronRecoInfo; + Produces entryD0HadronGenInfo; Produces entryD0HadronMlInfo; Produces entryD0CandRecoInfo; + Produces entryD0CandGenInfo; + Produces entryTrackRecoInfo; Configurable selectionFlagD0{"selectionFlagD0", 1, "Selection Flag for D0"}; Configurable selectionFlagD0bar{"selectionFlagD0bar", 1, "Selection Flag for D0bar"}; @@ -175,8 +193,10 @@ struct HfCorrelatorD0Hadrons { Configurable ptCandMin{"ptCandMin", 1., "min. cand. pT"}; Configurable ptTrackMin{"ptTrackMin", 0.3, "min. track pT"}; Configurable ptTrackMax{"ptTrackMax", 99., "max. track pT"}; - Configurable> bins{"bins", std::vector{o2::analysis::hf_cuts_d0_to_pi_k::vecBinsPt}, "pT bin limits for candidate mass plots and efficiency"}; - Configurable> efficiencyDmeson{"efficiencyDmeson", std::vector{vecEfficiencyDmeson}, "Efficiency values for D0 meson"}; + Configurable> binsPtD{"binsPtD", std::vector{o2::analysis::hf_cuts_d0_to_pi_k::vecBinsPt}, "pT bin limits for candidate mass plots"}; + Configurable> binsPtHadron{"binsPtHadron", std::vector{0.3, 2., 4., 8., 12., 50.}, "pT bin limits for assoc particle"}; + Configurable> binsPtEfficiencyD{"binsPtEfficiencyD", std::vector{o2::analysis::hf_cuts_d0_to_pi_k::vecBinsPt}, "pT bin limits for efficiency"}; + Configurable> efficiencyDmeson{"efficiencyDmeson", {1., 1., 1., 1., 1., 1.}, "Efficiency values for D0 meson"}; Configurable applyEfficiency{"applyEfficiency", 1, "Flag for applying D-meson efficiency weights"}; Configurable multMin{"multMin", 0., "minimum multiplicity accepted"}; Configurable multMax{"multMax", 10000., "maximum multiplicity accepted"}; @@ -206,42 +226,17 @@ struct HfCorrelatorD0Hadrons { ConfigurableAxis zPoolBins{"zPoolBins", {VARIABLE_WIDTH, -10.0f, -2.5f, 2.5f, 10.0f}, "z vertex position pools"}; ConfigurableAxis multPoolBins{"multPoolBins", {VARIABLE_WIDTH, 0.0f, 2000.0f, 6000.0f, 10000.0f}, "event multiplicity pools (FT0M)"}; ConfigurableAxis multPoolBinsMcGen{"multPoolBinsMcGen", {VARIABLE_WIDTH, 0.0f, 20.0f, 50.0f, 500.0f}, "Mixing bins - MC multiplicity"}; // In MCGen multiplicity is defined by counting tracks + ConfigurableAxis binsMassD{"binsMassD", {200, 1.3848, 2.3848}, "inv. mass (#pi K) (GeV/#it{c}^{2});entries"}; + ConfigurableAxis binsEta{"binsEta", {100, -5., 5.}, "#it{#eta}"}; + ConfigurableAxis binsPhi{"binsPhi", {64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, "#it{#varphi}"}; + ConfigurableAxis binsMultiplicity{"binsMultiplicity", {10000, 0., 10000.}, "Multiplicity"}; + ConfigurableAxis binsMultFT0M{"binsMultFT0M", {10000, 0., 10000.}, "Multiplicity as FT0M signal amplitude"}; + ConfigurableAxis binsPosZ{"binsPosZ", {100, -10., 10.}, "primary vertex z coordinate"}; + ConfigurableAxis binsPoolBin{"binsPoolBin", {9, 0., 9.}, "PoolBin"}; BinningType corrBinning{{zPoolBins, multPoolBins}, true}; - HistogramRegistry registry{ - "registry", - // NOTE: use hMassD0 for trigger normalisation (S*0.955), and hMass2DCorrelationPairs (in final task) for 2D-sideband-subtraction purposes - {{"hPtCand", "D0,D0bar candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{ptDAxisNBins, ptDAxisMin, ptDAxisMax}}}}, - {"hPtProng0", "D0,D0bar candidates;prong 0 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{ptDAxisNBins, ptDAxisMin, ptDAxisMax}}}}, - {"hPtProng1", "D0,D0bar candidates;prong 1 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{ptDAxisNBins, ptDAxisMin, ptDAxisMax}}}}, - {"hSelectionStatus", "D0,D0bar candidates;selection status;entries", {HistType::kTH1F, {{4, -0.5, 3.5}}}}, - {"hEta", "D0,D0bar candidates;candidate #it{#eta};entries", {HistType::kTH1F, {{yAxisNBins, yAxisMin, yAxisMax}}}}, - {"hPhi", "D0,D0bar candidates;candidate #it{#varphi};entries", {HistType::kTH1F, {{phiAxisNBins, phiAxisMin, phiAxisMax}}}}, - {"hY", "D0,D0bar candidates;candidate #it{y};entries", {HistType::kTH1F, {{yAxisNBins, yAxisMin, yAxisMax}}}}, - {"hMultiplicityPreSelection", "multiplicity prior to selection;multiplicity;entries", {HistType::kTH1F, {{10000, 0., 10000.}}}}, - {"hMultiplicity", "multiplicity;multiplicity;entries", {HistType::kTH1F, {{10000, 0., 10000.}}}}, - {"hPtCandRec", "D0,D0bar candidates - MC reco;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{ptDAxisNBins, ptDAxisMin, ptDAxisMax}}}}, - {"hPtProng0Rec", "D0,D0bar candidates - MC reco;prong 0 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{ptDAxisNBins, ptDAxisMin, ptDAxisMax}}}}, - {"hPtProng1Rec", "D0,D0bar candidates - MC reco;prong 1 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{ptDAxisNBins, ptDAxisMin, ptDAxisMax}}}}, - {"hSelectionStatusRec", "D0,D0bar candidates - MC reco;selection status;entries", {HistType::kTH1F, {{4, -0.5, 3.5}}}}, - {"hSignalStatusMERec", "Signal Status - MC reco ME;candidate sidnalStatus;entries", {HistType::kTH1F, {{200, 0, 200}}}}, - {"hEtaRec", "D0,D0bar candidates - MC reco;candidate #it{#eta};entries", {HistType::kTH1F, {{yAxisNBins, yAxisMin, yAxisMax}}}}, - {"hPhiRec", "D0,D0bar candidates - MC reco;candidate #it{#varphi};entries", {HistType::kTH1F, {{phiAxisNBins, phiAxisMin, phiAxisMax}}}}, - {"hYRec", "D0,D0bar candidates - MC reco;candidate #it{y};entries", {HistType::kTH1F, {{yAxisNBins, yAxisMin, yAxisMax}}}}, - {"hEvtCountGen", "Event counter - MC gen;;entries", {HistType::kTH1F, {{1, -0.5, 0.5}}}}, - {"hPtCandGen", "D0,D0bar particles - MC gen;particle #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{ptDAxisNBins, ptDAxisMin, ptDAxisMax}}}}, - {"hEtaGen", "D0,D0bar particles - MC gen;particle #it{#eta};entries", {HistType::kTH1F, {{yAxisNBins, yAxisMin, yAxisMax}}}}, - {"hPhiGen", "D0,D0bar particles - MC gen;particle #it{#varphi};entries", {HistType::kTH1F, {{phiAxisNBins, phiAxisMin, phiAxisMax}}}}, - {"hYGen", "D0,D0bar candidates - MC gen;candidate #it{y};entries", {HistType::kTH1F, {{yAxisNBins, yAxisMin, yAxisMax}}}}, - {"hTrackCounter", "soft pion counter - Data", {HistType::kTH1F, {{5, 0., 5.}}}}, - {"hTrackCounterRec", "soft pion counter - MC rec", {HistType::kTH1F, {{5, 0., 5.}}}}, - {"hTrackCounterGen", "soft pion counter - MC gen", {HistType::kTH1F, {{5, 0., 5.}}}}, - {"hMultV0M", "multiplicity;multiplicity;entries", {HistType::kTH1F, {{10000, 0., 10000.}}}}, - {"hZvtx", "z vertex;z vertex;entries", {HistType::kTH1F, {{200, -20., 20.}}}}, - {"hMultFT0M", "Multiplicity FT0M", {HistType::kTH1F, {{10000, 0., 10000.}}}}, - {"hD0Bin", "D0 selected in pool Bin;pool Bin;entries", {HistType::kTH1F, {{9, 0., 9.}}}}, - {"hTracksBin", "Tracks selected in pool Bin;pool Bin;entries", {HistType::kTH1F, {{9, 0., 9.}}}}}}; + HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject}; void init(InitContext&) { @@ -249,24 +244,80 @@ struct HfCorrelatorD0Hadrons { massPi = MassPiPlus; massK = MassKPlus; - auto vbins = (std::vector)bins; - registry.add("hMass", "D0,D0bar candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{massAxisNBins, massAxisMin, massAxisMax}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("hMass1D", "D0,D0bar candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH1F, {{massAxisNBins, massAxisMin, massAxisMax}}}); - registry.add("hMassD01D", "D0,D0bar candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH1F, {{massAxisNBins, massAxisMin, massAxisMax}}}); - registry.add("hMassD0bar1D", "D0,D0bar candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH1F, {{massAxisNBins, massAxisMin, massAxisMax}}}); - // mass histogram for D0 signal candidates - registry.add("hMassD0RecSig", "D0 signal candidates - MC reco;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{massAxisNBins, massAxisMin, massAxisMax}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - // mass histogram for D0 Reflection candidates - registry.add("hMassD0RecRef", "D0 reflection candidates - MC reco;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{massAxisNBins, massAxisMin, massAxisMax}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - // mass histogram for D0 background candidates - registry.add("hMassD0RecBg", "D0 background candidates - MC reco;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{massAxisNBins, massAxisMin, massAxisMax}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - // mass histogram for D0bar signal candidates - registry.add("hMassD0barRecSig", "D0bar signal candidates - MC reco;inv. mass D0bar only (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{massAxisNBins, massAxisMin, massAxisMax}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - // mass histogram for D0bar Reflection candidates - registry.add("hMassD0barRecRef", "D0bar reflection candidates - MC reco;inv. mass D0bar only (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{massAxisNBins, massAxisMin, massAxisMax}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - // mass histogram for D0bar background candidates - registry.add("hMassD0barRecBg", "D0bar background candidates - MC reco;inv. mass D0bar only (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{massAxisNBins, massAxisMin, massAxisMax}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("hCountD0TriggersGen", "D0 trigger particles - MC gen;;N of trigger D0", {HistType::kTH2F, {{1, -0.5, 0.5}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + AxisSpec axisMassD = {binsMassD, "inv. mass (#pi K) (GeV/#it{c}^{2})"}; + AxisSpec axisEta = {binsEta, "#it{#eta}"}; + AxisSpec axisPhi = {binsPhi, "#it{#varphi}"}; + AxisSpec axisRapidity = {100, -5., 5., "Rapidity"}; + AxisSpec axisPtD = {(std::vector)binsPtD, "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec axisPtHadron = {(std::vector)binsPtHadron, "#it{p}_{T} Hadron (GeV/#it{c})"}; + AxisSpec axisMultiplicity = {binsMultiplicity, "Multiplicity"}; + AxisSpec axisMultFT0M = {binsMultFT0M, "MultiplicityFT0M"}; + AxisSpec axisPosZ = {binsPosZ, "PosZ"}; + AxisSpec axisPoolBin = {binsPoolBin, "PoolBin"}; + AxisSpec axisStatus = {4, -0.5, 3.5, "Selection status"}; + AxisSpec axisSignalStatus = {200, 0., 200., "Signal status"}; + AxisSpec axisEvtCount = {1, -0.5, 0.5}; + AxisSpec axisTrkCount = {5, 0., 5.}; + AxisSpec axisBdtScoreBkg = {100, 0., 1., "Bdt score background"}; + AxisSpec axisBdtScorePrompt = {100, 0., 1., "Bdt score prompt"}; + + // Histograms for Data + registry.add("hPtCand", "D0, D0bar candidates", {HistType::kTH1F, {axisPtD}}); + registry.add("hPtProng0", "D0, D0bar candidates prong 0", {HistType::kTH1F, {axisPtD}}); + registry.add("hPtProng1", "D0, D0bar candidates prong 1", {HistType::kTH1F, {axisPtD}}); + registry.add("hSelectionStatus", "D0, D0bar candidates selection status", {HistType::kTH1F, {axisStatus}}); + registry.add("hEta", "D0,D0bar candidates", {HistType::kTH1F, {axisEta}}); + registry.add("hPhi", "D0,D0bar candidates", {HistType::kTH1F, {axisPhi}}); + registry.add("hY", "D0,D0bar candidates", {HistType::kTH1F, {axisRapidity}}); + registry.add("hMultiplicityPreSelection", "multiplicity prior to selection;multiplicity;entries", {HistType::kTH1F, {axisMultiplicity}}); + registry.add("hMultiplicity", "multiplicity;multiplicity;entries", {HistType::kTH1F, {axisMultiplicity}}); + registry.add("hMass", "D0, D0bar candidates massVsPt", {HistType::kTH2F, {{axisMassD}, {axisPtD}}}); + registry.add("hMass1D", "D0, D0bar candidates mass", {HistType::kTH1F, {axisMassD}}); + registry.add("hMassD01D", "D0 candidates mass", {HistType::kTH1F, {axisMassD}}); + registry.add("hMassD0bar1D", "D0bar candidates mass", {HistType::kTH1F, {axisMassD}}); + registry.add("hMLScoresVsMassVsPt", "D0, D0bar candidates massVsPt", {HistType::kTHnSparseD, {{axisBdtScoreBkg}, {axisBdtScorePrompt}, {axisMassD}, {axisPtD}}}); + // Histograms for MC Reco + registry.add("hPtCandRec", "D0, D0bar candidates - MC reco", {HistType::kTH1F, {axisPtD}}); + registry.add("hPtProng0Rec", "D0, D0bar candidates prong 0 - MC reco", {HistType::kTH1F, {axisPtD}}); + registry.add("hPtProng1Rec", "D0, D0bar candidates prong 1 - MC reco", {HistType::kTH1F, {axisPtD}}); + registry.add("hSelectionStatusRec", "D0, D0bar candidates selection status - MC reco", {HistType::kTH1F, {axisStatus}}); + registry.add("hSignalStatusMERec", "Signal Status - MC reco ME", {HistType::kTH1F, {axisSignalStatus}}); + registry.add("hEtaRec", "D0,D0bar candidates - MC reco", {HistType::kTH1F, {axisEta}}); + registry.add("hPhiRec", "D0,D0bar candidates - MC reco", {HistType::kTH1F, {axisPhi}}); + registry.add("hYRec", "D0,D0bar candidates - MC reco", {HistType::kTH1F, {axisRapidity}}); + registry.add("hMassD0RecSig", "D0 signal candidates massVsPt - MC reco", {HistType::kTH2F, {{axisMassD}, {axisPtD}}}); + registry.add("hMassD0RecRef", "D0 reflection candidates massVsPt - MC reco", {HistType::kTH2F, {{axisMassD}, {axisPtD}}}); + registry.add("hMassD0RecBg", "D0 background candidates massVsPt - MC reco", {HistType::kTH2F, {{axisMassD}, {axisPtD}}}); + registry.add("hMassD0barRecSig", "D0bar signal candidates massVsPt - MC reco", {HistType::kTH2F, {{axisMassD}, {axisPtD}}}); + registry.add("hMassD0barRecRef", "D0bar reflection candidates massVsPt - MC reco", {HistType::kTH2F, {{axisMassD}, {axisPtD}}}); + registry.add("hMassD0barRecBg", "D0bar background candidates massVsPt - MC reco", {HistType::kTH2F, {{axisMassD}, {axisPtD}}}); + registry.add("hPtCandRecSigPrompt", "D+,Hadron candidates Prompt - MC Reco", {HistType::kTH1F, {axisPtD}}); + registry.add("hPtCandRecSigNonPrompt", "D+,Hadron candidates Non Prompt - MC Reco", {HistType::kTH1F, {axisPtD}}); + registry.add("hPtVsMultiplicityRecPrompt", "Multiplicity FT0M - MC Rec Prompt", {HistType::kTH2F, {{axisPtD}, {axisMultFT0M}}}); + registry.add("hPtVsMultiplicityRecNonPrompt", "Multiplicity FT0M - MC Rec Non Prompt", {HistType::kTH2F, {{axisPtD}, {axisMultFT0M}}}); + registry.add("hPtParticleAssocVsCandRec", "Associated Particle - MC reco", {HistType::kTH2F, {{axisPtHadron}, {axisPtD}}}); + registry.add("hPtPrimaryParticleAssocVsCandRec", "Associated Particle - MC reco", {HistType::kTH2F, {{axisPtHadron}, {axisPtD}}}); + // Histograms for MC Gen + registry.add("hEvtCountGen", "Event counter - MC gen", {HistType::kTH1F, {axisEvtCount}}); + registry.add("hPtCandGen", "D0, D0bar candidates - MC gen", {HistType::kTH1F, {axisPtD}}); + registry.add("hPtCandGenPrompt", "D0, D0bar candidates - MC gen prompt", {HistType::kTH1F, {axisPtD}}); + registry.add("hPtCandGenNonPrompt", "D0, D0bar candidates - MC gen non prompt", {HistType::kTH1F, {axisPtD}}); + registry.add("hEtaGen", "D0,D0bar candidates - MC gen", {HistType::kTH1F, {axisEta}}); + registry.add("hPhiGen", "D0,D0bar candidates - MC gen", {HistType::kTH1F, {axisPhi}}); + registry.add("hYGen", "D0,D0bar candidates - MC gen", {HistType::kTH1F, {axisRapidity}}); + registry.add("hCountD0TriggersGen", "D0 trigger particles - MC gen;;N of trigger D0", {HistType::kTH2F, {{axisEvtCount}, {axisPtD}}}); + // Common histograms + registry.add("hTrackCounter", "Track counter", {HistType::kTH1F, {axisTrkCount}}); + registry.get(HIST("hTrackCounter"))->GetXaxis()->SetBinLabel(1, "all"); + registry.get(HIST("hTrackCounter"))->GetXaxis()->SetBinLabel(2, "before softpi"); + registry.get(HIST("hTrackCounter"))->GetXaxis()->SetBinLabel(3, "after softpi"); + registry.get(HIST("hTrackCounter"))->GetXaxis()->SetBinLabel(4, "with leading particles"); + registry.get(HIST("hTrackCounter"))->GetXaxis()->SetBinLabel(5, "fake tracks"); + registry.add("hZvtx", "z vertex", {HistType::kTH1F, {axisPosZ}}); + registry.add("hMultFT0M", "Multiplicity FT0M", {HistType::kTH1F, {axisMultFT0M}}); + registry.add("hCollisionPoolBin", "collision pool bin", {HistType::kTH1F, {axisPoolBin}}); + registry.add("hD0PoolBin", "D0 selected in pool Bin", {HistType::kTH1F, {axisPoolBin}}); + registry.add("hTracksPoolBin", "Particles associated pool bin", {HistType::kTH1F, {axisPoolBin}}); } // ======= Process starts for Data, Same event ============ @@ -282,6 +333,10 @@ struct HfCorrelatorD0Hadrons { } int poolBin = corrBinning.getBin(std::make_tuple(collision.posZ(), collision.multFT0M())); + registry.fill(HIST("hCollisionPoolBin"), poolBin); + registry.fill(HIST("hZvtx"), collision.posZ()); + registry.fill(HIST("hMultFT0M"), collision.multFT0M()); + int nTracks = 0; if (collision.numContrib() > 1) { for (const auto& track : tracks) { @@ -295,8 +350,7 @@ struct HfCorrelatorD0Hadrons { } } registry.fill(HIST("hMultiplicityPreSelection"), nTracks); - registry.fill(HIST("hZvtx"), collision.posZ()); - registry.fill(HIST("hMultFT0M"), collision.multFT0M()); + if (nTracks < multMin || nTracks > multMax) { return; } @@ -320,7 +374,7 @@ struct HfCorrelatorD0Hadrons { // ========================== trigger efficiency ================================ double efficiencyWeight = 1.; if (applyEfficiency) { - efficiencyWeight = 1. / efficiencyDmeson->at(o2::analysis::findBin(bins, candidate.pt())); + efficiencyWeight = 1. / efficiencyDmeson->at(o2::analysis::findBin(binsPtEfficiencyD, candidate.pt())); } // ========================== Fill mass histo ================================ if (candidate.isSelD0() >= selectionFlagD0) { @@ -330,6 +384,7 @@ struct HfCorrelatorD0Hadrons { for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { outputMlD0[iclass] = candidate.mlProbD0()[classMl->at(iclass)]; } + registry.fill(HIST("hMLScoresVsMassVsPt"), outputMlD0[0], outputMlD0[2], hfHelper.invMassD0ToPiK(candidate), candidate.pt()); } if (candidate.isSelD0bar() >= selectionFlagD0bar) { registry.fill(HIST("hMass"), hfHelper.invMassD0barToKPi(candidate), candidate.pt(), efficiencyWeight); @@ -338,6 +393,7 @@ struct HfCorrelatorD0Hadrons { for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { outputMlD0bar[iclass] = candidate.mlProbD0bar()[classMl->at(iclass)]; } + registry.fill(HIST("hMLScoresVsMassVsPt"), outputMlD0bar[0], outputMlD0bar[2], hfHelper.invMassD0barToKPi(candidate), candidate.pt()); } entryD0CandRecoInfo(hfHelper.invMassD0ToPiK(candidate), hfHelper.invMassD0barToKPi(candidate), candidate.pt(), outputMlD0[0], outputMlD0[2], outputMlD0bar[0], outputMlD0bar[2]); @@ -349,13 +405,13 @@ struct HfCorrelatorD0Hadrons { registry.fill(HIST("hPhi"), candidate.phi()); registry.fill(HIST("hY"), hfHelper.yD0(candidate)); registry.fill(HIST("hSelectionStatus"), candidate.isSelD0bar() + (candidate.isSelD0() * 2)); - registry.fill(HIST("hD0Bin"), poolBin); + registry.fill(HIST("hD0PoolBin"), poolBin); // ============ D-h correlation dedicated section ================================== // ========================== track loop starts here ================================ for (const auto& track : tracks) { - registry.fill(HIST("hTrackCounter"), 1); // fill total no. of tracks + registry.fill(HIST("hTrackCounter"), 0); // fill total no. of tracks // Remove D0 daughters by checking track indices bool correlationStatus = false; if ((candidate.prong0Id() == track.globalIndex()) || (candidate.prong1Id() == track.globalIndex())) { @@ -364,8 +420,7 @@ struct HfCorrelatorD0Hadrons { } correlationStatus = true; } - - registry.fill(HIST("hTrackCounter"), 2); // fill no. of tracks before soft pion removal + registry.fill(HIST("hTrackCounter"), 1); // fill no. of tracks before soft pion removal // ========== soft pion removal =================================================== double invMassDstar1 = 0., invMassDstar2 = 0.; @@ -388,7 +443,7 @@ struct HfCorrelatorD0Hadrons { continue; } } - registry.fill(HIST("hTrackCounter"), 3); // fill no. of tracks after soft pion removal + registry.fill(HIST("hTrackCounter"), 2); // fill no. of tracks after soft pion removal int signalStatus = 0; if ((candidate.isSelD0() >= selectionFlagD0) && !isSoftPiD0) { @@ -402,7 +457,7 @@ struct HfCorrelatorD0Hadrons { if (track.globalIndex() != leadingIndex) { continue; } - registry.fill(HIST("hTrackCounter"), 4); // fill no. of tracks have leading particle + registry.fill(HIST("hTrackCounter"), 3); // fill no. of tracks have leading particle } entryD0HadronPair(getDeltaPhi(track.phi(), candidate.phi()), track.eta() - candidate.eta(), @@ -411,7 +466,9 @@ struct HfCorrelatorD0Hadrons { poolBin, correlationStatus); entryD0HadronRecoInfo(hfHelper.invMassD0ToPiK(candidate), hfHelper.invMassD0barToKPi(candidate), signalStatus); + entryD0HadronGenInfo(false, false, 0); entryD0HadronMlInfo(outputMlD0[0], outputMlD0[1], outputMlD0[2], outputMlD0bar[0], outputMlD0bar[1], outputMlD0bar[2]); + entryTrackRecoInfo(track.dcaXY(), track.dcaZ(), track.tpcNClsCrossedRows()); } // end inner loop (tracks) @@ -423,13 +480,18 @@ struct HfCorrelatorD0Hadrons { void processMcRec(SelectedCollisions::iterator const& collision, SelectedTracksMcRec const& tracks, - SelectedCandidatesMcRec const& candidates) + SelectedCandidatesMcRecMl const& candidates, + aod::McParticles const& mcParticles) { // find leading particle if (correlateD0WithLeadingParticle) { leadingIndex = findLeadingParticle(tracks, dcaXYTrackMax.value, dcaZTrackMax.value, etaTrackMax.value); } int poolBin = corrBinning.getBin(std::make_tuple(collision.posZ(), collision.multFT0M())); + registry.fill(HIST("hCollisionPoolBin"), poolBin); + registry.fill(HIST("hZvtx"), collision.posZ()); + registry.fill(HIST("hMultFT0M"), collision.multFT0M()); + int nTracks = 0; if (collision.numContrib() > 1) { for (const auto& track : tracks) { @@ -451,8 +513,14 @@ struct HfCorrelatorD0Hadrons { // MC reco level bool flagD0 = false; bool flagD0bar = false; + bool isD0Prompt = false; + bool isD0NonPrompt = false; + std::vector outputMlD0 = {-1., -1., -1.}; + std::vector outputMlD0bar = {-1., -1., -1.}; for (const auto& candidate : candidates) { + isD0Prompt = candidate.originMcRec() == RecoDecay::OriginType::Prompt; + isD0NonPrompt = candidate.originMcRec() == RecoDecay::OriginType::NonPrompt; // check decay channel flag for candidate if (!TESTBIT(candidate.hfflag(), aod::hf_cand_2prong::DecayType::D0ToPiK)) { continue; @@ -461,9 +529,11 @@ struct HfCorrelatorD0Hadrons { continue; } + registry.fill(HIST("hD0PoolBin"), poolBin); + double efficiencyWeight = 1.; if (applyEfficiency) { - efficiencyWeight = 1. / efficiencyDmeson->at(o2::analysis::findBin(bins, candidate.pt())); + efficiencyWeight = 1. / efficiencyDmeson->at(o2::analysis::findBin(binsPtEfficiencyD, candidate.pt())); } if (std::abs(candidate.flagMcMatchRec()) == 1 << aod::hf_cand_2prong::DecayType::D0ToPiK) { @@ -480,21 +550,43 @@ struct HfCorrelatorD0Hadrons { if (candidate.isSelD0() >= selectionFlagD0) { // only reco as D0 if (candidate.flagMcMatchRec() == 1 << aod::hf_cand_2prong::DecayType::D0ToPiK) { // also matched as D0 registry.fill(HIST("hMassD0RecSig"), hfHelper.invMassD0ToPiK(candidate), candidate.pt(), efficiencyWeight); + if (isD0Prompt) { + registry.fill(HIST("hPtCandRecSigPrompt"), candidate.pt()); + registry.fill(HIST("hPtVsMultiplicityRecPrompt"), candidate.pt(), collision.multFT0M()); + } else if (isD0NonPrompt) { + registry.fill(HIST("hPtCandRecSigNonPrompt"), candidate.pt()); + registry.fill(HIST("hPtVsMultiplicityRecNonPrompt"), candidate.pt(), collision.multFT0M()); + } } else if (candidate.flagMcMatchRec() == -(1 << aod::hf_cand_2prong::DecayType::D0ToPiK)) { registry.fill(HIST("hMassD0RecRef"), hfHelper.invMassD0ToPiK(candidate), candidate.pt(), efficiencyWeight); } else { registry.fill(HIST("hMassD0RecBg"), hfHelper.invMassD0ToPiK(candidate), candidate.pt(), efficiencyWeight); } + for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { + outputMlD0[iclass] = candidate.mlProbD0()[classMl->at(iclass)]; + } } if (candidate.isSelD0bar() >= selectionFlagD0bar) { // only reco as D0bar if (candidate.flagMcMatchRec() == -(1 << aod::hf_cand_2prong::DecayType::D0ToPiK)) { // also matched as D0bar registry.fill(HIST("hMassD0barRecSig"), hfHelper.invMassD0barToKPi(candidate), candidate.pt(), efficiencyWeight); + if (isD0Prompt) { + registry.fill(HIST("hPtCandRecSigPrompt"), candidate.pt()); + registry.fill(HIST("hPtVsMultiplicityRecPrompt"), candidate.pt(), collision.multFT0M()); + } else if (isD0NonPrompt) { + registry.fill(HIST("hPtCandRecSigNonPrompt"), candidate.pt()); + registry.fill(HIST("hPtVsMultiplicityRecNonPrompt"), candidate.pt(), collision.multFT0M()); + } } else if (candidate.flagMcMatchRec() == 1 << aod::hf_cand_2prong::DecayType::D0ToPiK) { registry.fill(HIST("hMassD0barRecRef"), hfHelper.invMassD0barToKPi(candidate), candidate.pt(), efficiencyWeight); } else { registry.fill(HIST("hMassD0barRecBg"), hfHelper.invMassD0barToKPi(candidate), candidate.pt(), efficiencyWeight); } + for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { + outputMlD0bar[iclass] = candidate.mlProbD0bar()[classMl->at(iclass)]; + } } + entryD0CandRecoInfo(hfHelper.invMassD0ToPiK(candidate), hfHelper.invMassD0barToKPi(candidate), candidate.pt(), outputMlD0[0], outputMlD0[2], outputMlD0bar[0], outputMlD0bar[2]); + entryD0CandGenInfo(isD0Prompt); // ===================== Define parameters for soft pion removal ======================== auto ePiK = RecoDecay::e(candidate.pVectorProng0(), massPi) + RecoDecay::e(candidate.pVectorProng1(), massK); @@ -508,8 +600,10 @@ struct HfCorrelatorD0Hadrons { // ========== track loop starts here ======================== for (const auto& track : tracks) { - registry.fill(HIST("hTrackCounterRec"), 1); // fill total no. of tracks - + registry.fill(HIST("hTrackCounter"), 0); // fill total no. of tracks + if (!track.isGlobalTrackWoDCA()) { + continue; + } // Removing D0 daughters by checking track indices bool correlationStatus = false; if ((candidate.prong0Id() == track.globalIndex()) || (candidate.prong1Id() == track.globalIndex())) { @@ -518,8 +612,10 @@ struct HfCorrelatorD0Hadrons { } correlationStatus = true; } - registry.fill(HIST("hTrackCounterRec"), 2); // fill no. of tracks before soft pion removal + registry.fill(HIST("hTrackCounter"), 1); // fill no. of tracks before soft pion removal + bool isPhysicalPrimary = false; + int trackOrigin = -1; // ===== soft pion removal =================================================== double invMassDstar1 = 0, invMassDstar2 = 0; bool isSoftPiD0 = false, isSoftPiD0bar = false; @@ -542,13 +638,13 @@ struct HfCorrelatorD0Hadrons { } } - registry.fill(HIST("hTrackCounterRec"), 3); // fill no. of tracks after soft pion removal + registry.fill(HIST("hTrackCounter"), 2); // fill no. of tracks after soft pion removal if (correlateD0WithLeadingParticle) { if (track.globalIndex() != leadingIndex) { continue; } - registry.fill(HIST("hTrackCounterRec"), 4); // fill no. of tracks have leading particle + registry.fill(HIST("hTrackCounter"), 3); // fill no. of tracks have leading particle } int signalStatus = 0; @@ -579,105 +675,125 @@ struct HfCorrelatorD0Hadrons { poolBin, correlationStatus); entryD0HadronRecoInfo(hfHelper.invMassD0ToPiK(candidate), hfHelper.invMassD0barToKPi(candidate), signalStatus); + entryD0HadronMlInfo(outputMlD0[0], outputMlD0[1], outputMlD0[2], outputMlD0bar[0], outputMlD0bar[1], outputMlD0bar[2]); + if (track.has_mcParticle()) { + auto mcParticle = track.template mcParticle_as(); + isPhysicalPrimary = mcParticle.isPhysicalPrimary(); + trackOrigin = RecoDecay::getCharmHadronOrigin(mcParticles, mcParticle, true); + entryD0HadronGenInfo(isD0Prompt, isPhysicalPrimary, trackOrigin); + } else { + entryD0HadronGenInfo(isD0Prompt, isPhysicalPrimary, 0); + registry.fill(HIST("hTrackCounter"), 4); // fill no. of fake tracks + } + // for secondary particle fraction estimation + registry.fill(HIST("hPtParticleAssocVsCandRec"), track.pt(), candidate.pt()); + if (isPhysicalPrimary) { + registry.fill(HIST("hPtPrimaryParticleAssocVsCandRec"), track.pt(), candidate.pt()); + } + entryTrackRecoInfo(track.dcaXY(), track.dcaZ(), track.tpcNClsCrossedRows()); } // end inner loop (Tracks) } // end of outer loop (D0) - registry.fill(HIST("hZvtx"), collision.posZ()); - registry.fill(HIST("hMultV0M"), collision.multFT0M()); } PROCESS_SWITCH(HfCorrelatorD0Hadrons, processMcRec, "Process MC Reco mode", true); // ================= Process starts for MCGen, same event =================== - void processMcGen(aod::McCollision const& mcCollision, - soa::Join const& mcParticles) + void processMcGen(SelectedCollisionsMcGen::iterator const& mcCollision, + SelectedParticlesMcGen const& mcParticles) { + BinningTypeMcGen corrBinningMcGen{{zPoolBins, multPoolBinsMcGen}, true}; + int poolBin = corrBinningMcGen.getBin(std::make_tuple(mcCollision.posZ(), mcCollision.multMCFT0A())); + registry.fill(HIST("hCollisionPoolBin"), poolBin); registry.fill(HIST("hEvtCountGen"), 0); // MC gen level // find leading particle if (correlateD0WithLeadingParticle) { leadingIndex = findLeadingParticleMcGen(mcParticles, etaTrackMax.value, ptTrackMin.value); } - for (const auto& particle1 : mcParticles) { - // check if the particle is D0 or D0bar (for general plot filling and selection, so both cases are fine) - NOTE: decay channel is not probed! - if (std::abs(particle1.pdgCode()) != Pdg::kD0) { - continue; - } - double yD = RecoDecay::y(particle1.pVector(), MassD0); - if (yCandMax >= 0. && std::abs(yD) > yCandMax) { - continue; - } - if (ptCandMin >= 0. && particle1.pt() < ptCandMin) { - continue; - } - registry.fill(HIST("hPtCandGen"), particle1.pt()); - registry.fill(HIST("hEtaGen"), particle1.eta()); - registry.fill(HIST("hPhiGen"), particle1.phi()); - registry.fill(HIST("hYGen"), yD); - - // =============== D-h correlation dedicated section ===================== + bool isD0Prompt = false; + bool isD0NonPrompt = false; + int trackOrigin = -1; - if (std::abs(particle1.pdgCode()) != Pdg::kD0) { // just checking the particle PDG, not the decay channel (differently from Reco: you have a BR factor btw such levels!) + for (const auto& particleTrigg : mcParticles) { + if (std::abs(particleTrigg.pdgCode()) != Pdg::kD0) { continue; } - registry.fill(HIST("hCountD0TriggersGen"), 0, particle1.pt()); // to count trigger D0 (for normalisation) - - for (const auto& particle2 : mcParticles) { - registry.fill(HIST("hTrackCounterGen"), 1); // total no. of tracks - if (std::abs(particle2.eta()) > etaTrackMax) { - continue; - } - if (particle2.pt() < ptTrackMin) { + if (std::abs(particleTrigg.flagMcMatchGen()) == 1 << aod::hf_cand_2prong::DecayType::D0ToPiK) { + double yD = RecoDecay::y(particleTrigg.pVector(), MassD0); + if (yCandMax >= 0. && std::abs(yD) > yCandMax) { continue; } - if ((std::abs(particle2.pdgCode()) != kElectron) && (std::abs(particle2.pdgCode()) != kMuonMinus) && (std::abs(particle2.pdgCode()) != kPiPlus) && (std::abs(particle2.pdgCode()) != kKPlus) && (std::abs(particle2.pdgCode()) != kProton)) { + if (ptCandMin >= 0. && particleTrigg.pt() < ptCandMin) { continue; } - // ==============================soft pion removal================================ - registry.fill(HIST("hTrackCounterGen"), 2); // fill before soft pi removal - // method used: indexMother = -1 by default if the mother doesn't match with given PID of the mother. We find mother of pion if it is D* and mother of D0 if it is D*. If they are both positive and they both match each other, then it is detected as a soft pion + registry.fill(HIST("hD0PoolBin"), poolBin); + registry.fill(HIST("hPtCandGen"), particleTrigg.pt()); + registry.fill(HIST("hEtaGen"), particleTrigg.eta()); + registry.fill(HIST("hPhiGen"), particleTrigg.phi()); + registry.fill(HIST("hYGen"), yD); + registry.fill(HIST("hCountD0TriggersGen"), 0, particleTrigg.pt()); // to count trigger D0 (for normalisation) + + isD0Prompt = particleTrigg.originMcGen() == RecoDecay::OriginType::Prompt; + isD0NonPrompt = particleTrigg.originMcGen() == RecoDecay::OriginType::NonPrompt; + + // prompt and non-prompt division + if (isD0Prompt) { + registry.fill(HIST("hPtCandGenPrompt"), particleTrigg.pt()); + } else if (isD0NonPrompt) { + registry.fill(HIST("hPtCandGenNonPrompt"), particleTrigg.pt()); + } - auto indexMotherPi = RecoDecay::getMother(mcParticles, particle2, Pdg::kDStar, true, nullptr, 1); // last arguement 1 is written to consider immediate decay mother only - auto indexMotherD0 = RecoDecay::getMother(mcParticles, particle1, Pdg::kDStar, true, nullptr, 1); - bool correlationStatus = false; - if (std::abs(particle2.pdgCode()) == kPiPlus && indexMotherPi >= 0 && indexMotherD0 >= 0 && indexMotherPi == indexMotherD0) { - if (!storeAutoCorrelationFlag) { + // =============== D-h correlation dedicated section ===================== + for (const auto& particleAssoc : mcParticles) { + registry.fill(HIST("hTrackCounter"), 0); // total no. of tracks + if (std::abs(particleAssoc.eta()) > etaTrackMax) { continue; } - correlationStatus = true; - } - - registry.fill(HIST("hTrackCounterGen"), 3); // fill after soft pion removal - - if (correlateD0WithLeadingParticle) { - if (particle2.globalIndex() != leadingIndex) { + if (particleAssoc.pt() < ptTrackMin) { continue; } - registry.fill(HIST("hTrackCounterGen"), 4); // fill no. of tracks have leading particle - } + if ((std::abs(particleAssoc.pdgCode()) != kElectron) && (std::abs(particleAssoc.pdgCode()) != kMuonMinus) && (std::abs(particleAssoc.pdgCode()) != kPiPlus) && (std::abs(particleAssoc.pdgCode()) != kKPlus) && (std::abs(particleAssoc.pdgCode()) != kProton)) { + continue; + } + if (!particleAssoc.isPhysicalPrimary()) { + continue; + } + // ==============================soft pion removal================================ + registry.fill(HIST("hTrackCounter"), 1); // fill before soft pi removal + // method used: indexMother = -1 by default if the mother doesn't match with given PID of the mother. We find mother of pion if it is D* and mother of D0 if it is D*. If they are both positive and they both match each other, then it is detected as a soft pion + + auto indexMotherPi = RecoDecay::getMother(mcParticles, particleAssoc, Pdg::kDStar, true, nullptr, 1); // last arguement 1 is written to consider immediate decay mother only + auto indexMotherD0 = RecoDecay::getMother(mcParticles, particleTrigg, Pdg::kDStar, true, nullptr, 1); + bool correlationStatus = false; + if (std::abs(particleAssoc.pdgCode()) == kPiPlus && indexMotherPi >= 0 && indexMotherD0 >= 0 && indexMotherPi == indexMotherD0) { + if (!storeAutoCorrelationFlag) { + continue; + } + correlationStatus = true; + } - auto getTracksSize = [&mcParticles](aod::McCollision const& /*collision*/) { - int nTracks = 0; - for (const auto& track : mcParticles) { - if (track.isPhysicalPrimary() && std::abs(track.eta()) < 1.0) { - nTracks++; + registry.fill(HIST("hTrackCounter"), 2); // fill after soft pion removal + + if (correlateD0WithLeadingParticle) { + if (particleAssoc.globalIndex() != leadingIndex) { + continue; } + registry.fill(HIST("hTrackCounter"), 3); // fill no. of tracks have leading particle } - return nTracks; - }; - using BinningTypeMcGen = FlexibleBinningPolicy, aod::mccollision::PosZ, decltype(getTracksSize)>; - BinningTypeMcGen corrBinningMcGen{{getTracksSize}, {zPoolBins, multPoolBinsMcGen}, true}; - int poolBin = corrBinningMcGen.getBin(std::make_tuple(mcCollision.posZ(), getTracksSize(mcCollision))); - entryD0HadronPair(getDeltaPhi(particle2.phi(), particle1.phi()), - particle2.eta() - particle1.eta(), - particle1.pt(), - particle2.pt(), - poolBin, - correlationStatus); - entryD0HadronRecoInfo(massD0, massD0, 0); // dummy info - } // end inner loop (Tracks) - } // end outer loop (D0) + trackOrigin = RecoDecay::getCharmHadronOrigin(mcParticles, particleAssoc, true); + entryD0HadronPair(getDeltaPhi(particleAssoc.phi(), particleTrigg.phi()), + particleAssoc.eta() - particleTrigg.eta(), + particleTrigg.pt(), + particleAssoc.pt(), + poolBin, + correlationStatus); + entryD0HadronRecoInfo(massD0, massD0, 0); // dummy info + entryD0HadronGenInfo(isD0Prompt, particleAssoc.isPhysicalPrimary(), trackOrigin); + } // end inner loop (Tracks) + } + } // end outer loop (D0) } PROCESS_SWITCH(HfCorrelatorD0Hadrons, processMcGen, "Process MC Gen mode", false); @@ -697,52 +813,58 @@ struct HfCorrelatorD0Hadrons { Pair pairData{corrBinning, numberEventsMixed, -1, collisions, tracksTuple, &cache}; for (const auto& [c1, tracks1, c2, tracks2] : pairData) { + if (tracks1.size() == 0) { + continue; + } // LOGF(info, "Mixed event collisions: Index = (%d, %d), tracks Size: (%d, %d), Z Vertex: (%f, %f), Pool Bin: (%d, %d)", c1.globalIndex(), c2.globalIndex(), tracks1.size(), tracks2.size(), c1.posZ(), c2.posZ(), corrBinning.getBin(std::make_tuple(c1.posZ(), c1.multFT0M())),corrBinning.getBin(std::make_tuple(c2.posZ(), c2.multFT0M()))); // For debug int poolBin = corrBinning.getBin(std::make_tuple(c2.posZ(), c2.multFT0M())); - for (const auto& [t1, t2] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { + int poolBinD0 = corrBinning.getBin(std::make_tuple(c1.posZ(), c1.multFT0M())); + registry.fill(HIST("hTracksPoolBin"), poolBin); + registry.fill(HIST("hD0PoolBin"), poolBinD0); + for (const auto& [candidate, particleAssoc] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { - if (std::abs(hfHelper.yD0(t1)) >= yCandMax) { + if (std::abs(hfHelper.yD0(candidate)) >= yCandMax || candidate.pt() < ptCandMin) { continue; } // soft pion removal, signal status 1,3 for D0 and 2,3 for D0bar (SoftPi removed), signal status 11,13 for D0 and 12,13 for D0bar (only SoftPi) - auto ePiK = RecoDecay::e(t1.pVectorProng0(), massPi) + RecoDecay::e(t1.pVectorProng1(), massK); - auto eKPi = RecoDecay::e(t1.pVectorProng0(), massK) + RecoDecay::e(t1.pVectorProng1(), massPi); + auto ePiK = RecoDecay::e(candidate.pVectorProng0(), massPi) + RecoDecay::e(candidate.pVectorProng1(), massK); + auto eKPi = RecoDecay::e(candidate.pVectorProng0(), massK) + RecoDecay::e(candidate.pVectorProng1(), massPi); double invMassDstar1 = 0., invMassDstar2 = 0.; bool isSoftPiD0 = false, isSoftPiD0bar = false; - auto pSum2 = RecoDecay::p2(t1.pVector(), t2.pVector()); - auto ePion = t2.energy(massPi); + auto pSum2 = RecoDecay::p2(candidate.pVector(), particleAssoc.pVector()); + auto ePion = particleAssoc.energy(massPi); invMassDstar1 = std::sqrt((ePiK + ePion) * (ePiK + ePion) - pSum2); invMassDstar2 = std::sqrt((eKPi + ePion) * (eKPi + ePion) - pSum2); std::vector outputMlD0 = {-1., -1., -1.}; std::vector outputMlD0bar = {-1., -1., -1.}; - if (t1.isSelD0() >= selectionFlagD0) { - if ((std::abs(invMassDstar1 - hfHelper.invMassD0ToPiK(t1)) - softPiMass) < ptSoftPionMax) { + if (candidate.isSelD0() >= selectionFlagD0) { + if ((std::abs(invMassDstar1 - hfHelper.invMassD0ToPiK(candidate)) - softPiMass) < ptSoftPionMax) { isSoftPiD0 = true; } for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { - outputMlD0[iclass] = t1.mlProbD0()[classMl->at(iclass)]; + outputMlD0[iclass] = candidate.mlProbD0()[classMl->at(iclass)]; } } - if (t1.isSelD0bar() >= selectionFlagD0bar) { - if ((std::abs(invMassDstar2 - hfHelper.invMassD0barToKPi(t1)) - softPiMass) < ptSoftPionMax) { + if (candidate.isSelD0bar() >= selectionFlagD0bar) { + if ((std::abs(invMassDstar2 - hfHelper.invMassD0barToKPi(candidate)) - softPiMass) < ptSoftPionMax) { isSoftPiD0bar = true; } for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { - outputMlD0bar[iclass] = t1.mlProbD0bar()[classMl->at(iclass)]; + outputMlD0bar[iclass] = candidate.mlProbD0bar()[classMl->at(iclass)]; } } int signalStatus = 0; - if (t1.isSelD0() >= selectionFlagD0) { + if (candidate.isSelD0() >= selectionFlagD0) { if (!isSoftPiD0) { signalStatus += aod::hf_correlation_d0_hadron::ParticleTypeData::D0Only; } else { signalStatus += aod::hf_correlation_d0_hadron::ParticleTypeData::D0OnlySoftPi; } } - if (t1.isSelD0bar() >= selectionFlagD0bar) { + if (candidate.isSelD0bar() >= selectionFlagD0bar) { if (!isSoftPiD0bar) { signalStatus += aod::hf_correlation_d0_hadron::ParticleTypeData::D0barOnly; } else { @@ -750,9 +872,11 @@ struct HfCorrelatorD0Hadrons { } } bool correlationStatus = false; - entryD0HadronPair(getDeltaPhi(t1.phi(), t2.phi()), t1.eta() - t2.eta(), t1.pt(), t2.pt(), poolBin, correlationStatus); - entryD0HadronRecoInfo(hfHelper.invMassD0ToPiK(t1), hfHelper.invMassD0barToKPi(t1), signalStatus); + entryD0HadronPair(getDeltaPhi(candidate.phi(), particleAssoc.phi()), candidate.eta() - particleAssoc.eta(), candidate.pt(), particleAssoc.pt(), poolBin, correlationStatus); + entryD0HadronRecoInfo(hfHelper.invMassD0ToPiK(candidate), hfHelper.invMassD0barToKPi(candidate), signalStatus); + entryD0HadronGenInfo(false, false, 0); entryD0HadronMlInfo(outputMlD0[0], outputMlD0[1], outputMlD0[2], outputMlD0bar[0], outputMlD0bar[1], outputMlD0bar[2]); + entryTrackRecoInfo(particleAssoc.dcaXY(), particleAssoc.dcaZ(), particleAssoc.tpcNClsCrossedRows()); } } } @@ -761,49 +885,77 @@ struct HfCorrelatorD0Hadrons { // ====================== Implement Event mixing on McRec =================================== void processMcRecMixedEvent(SelectedCollisions const& collisions, - SelectedCandidatesMcRec const& candidates, - SelectedTracksMcRec const& tracks) + SelectedCandidatesMcRecMl const& candidates, + SelectedTracksMcRec const& tracks, + aod::McParticles const& mcParticles) { auto tracksTuple = std::make_tuple(candidates, tracks); - Pair pairMcRec{corrBinning, numberEventsMixed, -1, collisions, tracksTuple, &cache}; + Pair pairMcRec{corrBinning, numberEventsMixed, -1, collisions, tracksTuple, &cache}; + bool isD0Prompt = false; bool flagD0 = false; bool flagD0bar = false; + bool isPhysicalPrimary = false; + int trackOrigin = 0; for (const auto& [c1, tracks1, c2, tracks2] : pairMcRec) { int poolBin = corrBinning.getBin(std::make_tuple(c2.posZ(), c2.multFT0M())); + int poolBinD0 = corrBinning.getBin(std::make_tuple(c1.posZ(), c1.multFT0M())); + registry.fill(HIST("hTracksPoolBin"), poolBin); + registry.fill(HIST("hD0PoolBin"), poolBinD0); + registry.fill(HIST("hMultFT0M"), c1.multFT0M()); + registry.fill(HIST("hZvtx"), c1.posZ()); - for (const auto& [t1, t2] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { + for (const auto& [candidate, particleAssoc] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { - if (std::abs(hfHelper.yD0(t1)) >= yCandMax) { + if (std::abs(hfHelper.yD0(candidate)) >= yCandMax || candidate.pt() < ptCandMin) { continue; } - + if (!particleAssoc.isGlobalTrackWoDCA()) { + continue; + } + std::vector outputMlD0 = {-1., -1., -1.}; + std::vector outputMlD0bar = {-1., -1., -1.}; + isD0Prompt = candidate.originMcRec() == RecoDecay::OriginType::Prompt; + if (particleAssoc.has_mcParticle()) { + auto mcParticle = particleAssoc.template mcParticle_as(); + isPhysicalPrimary = mcParticle.isPhysicalPrimary(); + trackOrigin = RecoDecay::getCharmHadronOrigin(mcParticles, mcParticle, true); + } + if (candidate.isSelD0() >= selectionFlagD0) { + for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { + outputMlD0[iclass] = candidate.mlProbD0()[classMl->at(iclass)]; + } + } else if (candidate.isSelD0bar() >= selectionFlagD0bar) { + for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { + outputMlD0bar[iclass] = candidate.mlProbD0bar()[classMl->at(iclass)]; + } + } // soft pion removal - auto ePiK = RecoDecay::e(t1.pVectorProng0(), massPi) + RecoDecay::e(t1.pVectorProng1(), massK); - auto eKPi = RecoDecay::e(t1.pVectorProng0(), massK) + RecoDecay::e(t1.pVectorProng1(), massPi); + auto ePiK = RecoDecay::e(candidate.pVectorProng0(), massPi) + RecoDecay::e(candidate.pVectorProng1(), massK); + auto eKPi = RecoDecay::e(candidate.pVectorProng0(), massK) + RecoDecay::e(candidate.pVectorProng1(), massPi); double invMassDstar1 = 0., invMassDstar2 = 0.; bool isSoftPiD0 = false, isSoftPiD0bar = false; - auto pSum2 = RecoDecay::p2(t1.pVector(), t2.pVector()); - auto ePion = t2.energy(massPi); + auto pSum2 = RecoDecay::p2(candidate.pVector(), particleAssoc.pVector()); + auto ePion = particleAssoc.energy(massPi); invMassDstar1 = std::sqrt((ePiK + ePion) * (ePiK + ePion) - pSum2); invMassDstar2 = std::sqrt((eKPi + ePion) * (eKPi + ePion) - pSum2); - if (t1.isSelD0() >= selectionFlagD0) { - if ((std::abs(invMassDstar1 - hfHelper.invMassD0ToPiK(t1)) - softPiMass) < ptSoftPionMax) { + if (candidate.isSelD0() >= selectionFlagD0) { + if ((std::abs(invMassDstar1 - hfHelper.invMassD0ToPiK(candidate)) - softPiMass) < ptSoftPionMax) { isSoftPiD0 = true; } } - if (t1.isSelD0bar() >= selectionFlagD0bar) { - if ((std::abs(invMassDstar2 - hfHelper.invMassD0barToKPi(t1)) - softPiMass) < ptSoftPionMax) { + if (candidate.isSelD0bar() >= selectionFlagD0bar) { + if ((std::abs(invMassDstar2 - hfHelper.invMassD0barToKPi(candidate)) - softPiMass) < ptSoftPionMax) { isSoftPiD0bar = true; } } - flagD0 = t1.flagMcMatchRec() == (1 << aod::hf_cand_2prong::DecayType::D0ToPiK); // flagD0Signal 'true' if candidate matched to D0 (particle) - flagD0bar = t1.flagMcMatchRec() == -(1 << aod::hf_cand_2prong::DecayType::D0ToPiK); // flagD0Reflection 'true' if candidate, selected as D0 (particle), is matched to D0bar (antiparticle) + flagD0 = candidate.flagMcMatchRec() == (1 << aod::hf_cand_2prong::DecayType::D0ToPiK); // flagD0Signal 'true' if candidate matched to D0 (particle) + flagD0bar = candidate.flagMcMatchRec() == -(1 << aod::hf_cand_2prong::DecayType::D0ToPiK); // flagD0Reflection 'true' if candidate, selected as D0 (particle), is matched to D0bar (antiparticle) int signalStatus = 0; - if (flagD0 && (t1.isSelD0() >= selectionFlagD0)) { + if (flagD0 && (candidate.isSelD0() >= selectionFlagD0)) { if (!isSoftPiD0) { SETBIT(signalStatus, aod::hf_correlation_d0_hadron::ParticleTypeMcRec::D0Sig); // signalStatus += 1; } else { @@ -811,7 +963,7 @@ struct HfCorrelatorD0Hadrons { } } // signal case D0 - if (flagD0bar && (t1.isSelD0() >= selectionFlagD0)) { + if (flagD0bar && (candidate.isSelD0() >= selectionFlagD0)) { if (!isSoftPiD0) { SETBIT(signalStatus, aod::hf_correlation_d0_hadron::ParticleTypeMcRec::D0Ref); // signalStatus += 2; } else { @@ -819,7 +971,7 @@ struct HfCorrelatorD0Hadrons { } } // reflection case D0 - if (!flagD0 && !flagD0bar && (t1.isSelD0() >= selectionFlagD0)) { + if (!flagD0 && !flagD0bar && (candidate.isSelD0() >= selectionFlagD0)) { if (!isSoftPiD0) { SETBIT(signalStatus, aod::hf_correlation_d0_hadron::ParticleTypeMcRec::D0Bg); // signalStatus += 4; } else { @@ -827,7 +979,7 @@ struct HfCorrelatorD0Hadrons { } } // background case D0 - if (flagD0bar && (t1.isSelD0bar() >= selectionFlagD0bar)) { + if (flagD0bar && (candidate.isSelD0bar() >= selectionFlagD0bar)) { if (!isSoftPiD0bar) { SETBIT(signalStatus, aod::hf_correlation_d0_hadron::ParticleTypeMcRec::D0barSig); // signalStatus += 8; } else { @@ -835,7 +987,7 @@ struct HfCorrelatorD0Hadrons { } } // signal case D0bar - if (flagD0 && (t1.isSelD0bar() >= selectionFlagD0bar)) { + if (flagD0 && (candidate.isSelD0bar() >= selectionFlagD0bar)) { if (!isSoftPiD0bar) { SETBIT(signalStatus, aod::hf_correlation_d0_hadron::ParticleTypeMcRec::D0barRef); // signalStatus += 16; } else { @@ -843,7 +995,7 @@ struct HfCorrelatorD0Hadrons { } } // reflection case D0bar - if (!flagD0 && !flagD0bar && (t1.isSelD0bar() >= selectionFlagD0bar)) { + if (!flagD0 && !flagD0bar && (candidate.isSelD0bar() >= selectionFlagD0bar)) { if (!isSoftPiD0bar) { SETBIT(signalStatus, aod::hf_correlation_d0_hadron::ParticleTypeMcRec::D0barBg); // signalStatus += 32; } else { @@ -852,8 +1004,11 @@ struct HfCorrelatorD0Hadrons { } // background case D0bar registry.fill(HIST("hSignalStatusMERec"), signalStatus); bool correlationStatus = false; - entryD0HadronPair(getDeltaPhi(t1.phi(), t2.phi()), t1.eta() - t2.eta(), t1.pt(), t2.pt(), poolBin, correlationStatus); - entryD0HadronRecoInfo(hfHelper.invMassD0ToPiK(t1), hfHelper.invMassD0barToKPi(t1), signalStatus); + entryD0HadronPair(getDeltaPhi(candidate.phi(), particleAssoc.phi()), candidate.eta() - particleAssoc.eta(), candidate.pt(), particleAssoc.pt(), poolBin, correlationStatus); + entryD0HadronRecoInfo(hfHelper.invMassD0ToPiK(candidate), hfHelper.invMassD0barToKPi(candidate), signalStatus); + entryD0HadronGenInfo(isD0Prompt, isPhysicalPrimary, trackOrigin); + entryD0HadronMlInfo(outputMlD0[0], outputMlD0[1], outputMlD0[2], outputMlD0bar[0], outputMlD0bar[1], outputMlD0bar[2]); + entryTrackRecoInfo(particleAssoc.dcaXY(), particleAssoc.dcaZ(), particleAssoc.tpcNClsCrossedRows()); } } } @@ -864,55 +1019,43 @@ struct HfCorrelatorD0Hadrons { void processMcGenMixedEvent(SelectedCollisionsMcGen const& collisions, SelectedParticlesMcGen const& mcParticles) { - - auto getTracksSize = [&mcParticles, this](SelectedCollisionsMcGen::iterator const& collision) { - int nTracks = 0; - auto associatedTracks = mcParticles.sliceByCached(o2::aod::mcparticle::mcCollisionId, collision.globalIndex(), this->cache); - for (const auto& track : associatedTracks) { - if (track.isPhysicalPrimary() && std::abs(track.eta()) < 1.0) { - nTracks++; - } - } - return nTracks; - }; - - using BinningTypeMcGen = FlexibleBinningPolicy, aod::mccollision::PosZ, decltype(getTracksSize)>; - BinningTypeMcGen corrBinningMcGen{{getTracksSize}, {zPoolBins, multPoolBinsMcGen}, true}; - + BinningTypeMcGen corrBinningMcGen{{zPoolBins, multPoolBinsMcGen}, true}; auto tracksTuple = std::make_tuple(mcParticles, mcParticles); Pair pairMcGen{corrBinningMcGen, numberEventsMixed, -1, collisions, tracksTuple, &cache}; for (const auto& [c1, tracks1, c2, tracks2] : pairMcGen) { - for (const auto& [t1, t2] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { - - // Check track t1 is D0 - if (std::abs(t1.pdgCode()) != Pdg::kD0) { - continue; - } - - double yD = RecoDecay::y(t1.pVector(), MassD0); - if (std::abs(yD) >= yCandMax || t1.pt() <= ptCandMin || std::abs(t2.eta()) >= etaTrackMax || t2.pt() <= ptTrackMin) { - continue; - } - if ((std::abs(t2.pdgCode()) != kElectron) && (std::abs(t2.pdgCode()) != kMuonMinus) && (std::abs(t2.pdgCode()) != kPiPlus) && (std::abs(t2.pdgCode()) != kKPlus) && (std::abs(t2.pdgCode()) != kProton)) { - continue; - } - if (!t2.isPhysicalPrimary()) { + int poolBin = corrBinningMcGen.getBin(std::make_tuple(c1.posZ(), c1.multMCFT0A())); + for (const auto& [particleTrigg, particleAssoc] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { + if (std::abs(particleTrigg.pdgCode()) != Pdg::kD0) { continue; } + if (std::abs(particleTrigg.flagMcMatchGen()) == 1 << aod::hf_cand_2prong::DecayType::D0ToPiK) { + double yD = RecoDecay::y(particleTrigg.pVector(), MassD0); + if (std::abs(yD) >= yCandMax || particleTrigg.pt() <= ptCandMin || std::abs(particleAssoc.eta()) >= etaTrackMax || particleAssoc.pt() <= ptTrackMin) { + continue; + } + if ((std::abs(particleAssoc.pdgCode()) != kElectron) && (std::abs(particleAssoc.pdgCode()) != kMuonMinus) && (std::abs(particleAssoc.pdgCode()) != kPiPlus) && (std::abs(particleAssoc.pdgCode()) != kKPlus) && (std::abs(particleAssoc.pdgCode()) != kProton)) { + continue; + } + if (!particleAssoc.isPhysicalPrimary()) { + continue; + } - // ==============================soft pion removal================================ - // method used: indexMother = -1 by default if the mother doesn't match with given PID of the mother. We find mother of pion if it is D* and mother of D0 if it is D*. If they are both positive and they both match each other, then it is detected as a soft pion + // ==============================soft pion removal================================ + // method used: indexMother = -1 by default if the mother doesn't match with given PID of the mother. We find mother of pion if it is D* and mother of D0 if it is D*. If they are both positive and they both match each other, then it is detected as a soft pion - auto indexMotherPi = RecoDecay::getMother(mcParticles, t2, Pdg::kDStar, true, nullptr, 1); // last arguement 1 is written to consider immediate decay mother only - auto indexMotherD0 = RecoDecay::getMother(mcParticles, t1, Pdg::kDStar, true, nullptr, 1); - if (std::abs(t2.pdgCode()) == kPiPlus && indexMotherPi >= 0 && indexMotherD0 >= 0 && indexMotherPi == indexMotherD0) { - continue; + auto indexMotherPi = RecoDecay::getMother(mcParticles, particleAssoc, Pdg::kDStar, true, nullptr, 1); // last arguement 1 is written to consider immediate decay mother only + auto indexMotherD0 = RecoDecay::getMother(mcParticles, particleTrigg, Pdg::kDStar, true, nullptr, 1); + if (std::abs(particleAssoc.pdgCode()) == kPiPlus && indexMotherPi >= 0 && indexMotherD0 >= 0 && indexMotherPi == indexMotherD0) { + continue; + } + bool correlationStatus = false; + int trackOrigin = RecoDecay::getCharmHadronOrigin(mcParticles, particleAssoc, true); + bool isD0Prompt = particleTrigg.originMcGen() == RecoDecay::OriginType::Prompt; + entryD0HadronPair(getDeltaPhi(particleAssoc.phi(), particleTrigg.phi()), particleAssoc.eta() - particleTrigg.eta(), particleTrigg.pt(), particleAssoc.pt(), poolBin, correlationStatus); + entryD0HadronRecoInfo(massD0, massD0, 0); // dummy info + entryD0HadronGenInfo(isD0Prompt, particleAssoc.isPhysicalPrimary(), trackOrigin); } - int poolBin = corrBinningMcGen.getBin(std::make_tuple(c2.posZ(), getTracksSize(c2))); - bool correlationStatus = false; - entryD0HadronPair(getDeltaPhi(t2.phi(), t1.phi()), t2.eta() - t1.eta(), t1.pt(), t2.pt(), poolBin, correlationStatus); - entryD0HadronRecoInfo(massD0, massD0, 0); // dummy info } } } diff --git a/PWGHF/HFC/Tasks/taskCorrelationD0Hadrons.cxx b/PWGHF/HFC/Tasks/taskCorrelationD0Hadrons.cxx index 2654984c45a..5d6f8e3bf0d 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationD0Hadrons.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationD0Hadrons.cxx @@ -22,6 +22,7 @@ #include "Framework/HistogramRegistry.h" #include "Framework/runDataProcessing.h" +#include "PWGHF/Core/HfHelper.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/Utils/utilsAnalysis.h" @@ -29,39 +30,13 @@ #include "PWGHF/HFC/Utils/utilsCorrelations.h" using namespace o2; +using namespace o2::constants::physics; +using namespace o2::constants::math; using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::aod::hf_correlation_d0_hadron; using namespace o2::analysis::hf_correlations; -namespace o2::aod -{ -using D0HadronPairFull = soa::Join; -using D0HadronPairFullMl = soa::Join; -} // namespace o2::aod - -// string definitions, used for histogram axis labels -const TString stringPtD = "#it{p}_{T}^{D} (GeV/#it{c});"; -const TString stringPtHadron = "#it{p}_{T}^{Hadron} (GeV/#it{c});"; -const TString stringDeltaEta = "#it{#eta}^{Hadron}-#it{#eta}^{D};"; -const TString stringDeltaPhi = "#it{#varphi}^{Hadron}-#it{#varphi}^{D} (rad);"; -const TString stringDHadron = "D,Hadron candidates "; -const TString stringSignal = "signal region;"; -const TString stringSideband = "sidebands;"; -const TString stringMcParticles = "MC gen - D,Hadron particles;"; -const TString stringMcReco = "MC reco - D,Hadron candidates "; - -// histogram axes definition -AxisSpec axisDeltaEta = {100, -2., 2., ""}; -AxisSpec axisDeltaPhi = {64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf, ""}; -AxisSpec axisPtD = {10, 0., 10., ""}; -AxisSpec axisPtHadron = {11, 0., 11., ""}; -AxisSpec axisPoolBin = {9, 0., 9., ""}; -AxisSpec axisCorrelationState = {2, 0., 2., ""}; -ConfigurableAxis axisMass{"axisMass", {250, 1.65f, 2.15f}, ""}; -ConfigurableAxis binsBdtScore{"binsBdtScore", {100, 0., 1.}, "Bdt output scores"}; -AxisSpec axisBdtScore = {binsBdtScore, "Bdt score"}; - // definition of vectors for standard ptbin and invariant mass configurables const int nPtBinsCorrelations = 12; const double pTBinsCorrelations[nPtBinsCorrelations + 1] = {0., 1., 2., 3., 4., 5., 6., 7., 8., 12., 16., 24., 99.}; @@ -78,174 +53,234 @@ auto vecSidebandLeftInner = std::vector{sidebandLeftInnerDefault, sideba auto vecSidebandLeftOuter = std::vector{sidebandLeftOuterDefault, sidebandLeftOuterDefault + nPtBinsCorrelations}; auto vecSidebandRightInner = std::vector{sidebandRightInnerDefault, sidebandRightInnerDefault + nPtBinsCorrelations}; auto vecSidebandRightOuter = std::vector{sidebandRightOuterDefault, sidebandRightOuterDefault + nPtBinsCorrelations}; -const int nPtBinsEfficiency = o2::analysis::hf_cuts_d0_to_pi_k::nBinsPt; -const double efficiencyDmesonDefault[nPtBinsEfficiency] = {}; -auto vecEfficiencyDmeson = std::vector{efficiencyDmesonDefault, efficiencyDmesonDefault + nPtBinsEfficiency}; -const double ptHadronMax = 10.0; +const int nPtbinsPtEfficiencyD = o2::analysis::hf_cuts_d0_to_pi_k::nBinsPt; +const double efficiencyDmesonDefault[nPtbinsPtEfficiencyD] = {}; +auto vecEfficiencyDmeson = std::vector{efficiencyDmesonDefault, efficiencyDmesonDefault + nPtbinsPtEfficiencyD}; struct HfTaskCorrelationD0Hadrons { - // pT ranges for correlation plots: the default values are those embedded in hf_cuts_d0_to_pi_k (i.e. the mass pT bins), but can be redefined via json files + // pT ranges: the default values are those embedded in hf_cuts_d0_to_pi_k (i.e. the mass pT bins), but can be redefined via json files + Configurable> binsPtD{"binsPtD", std::vector{o2::analysis::hf_cuts_d0_to_pi_k::vecBinsPt}, "pT bin limits for candidate mass plots and efficiency"}; + Configurable> binsPtHadron{"binsPtHadron", std::vector{0.3, 2., 4., 8., 12., 50.}, "pT bin limits for assoc particle efficiency"}; Configurable> binsCorrelations{"binsCorrelations", std::vector{vecPtBinsCorrelations}, "pT bin limits for correlation plots"}; - // pT bins for effiencies: same as above - Configurable> binsEfficiency{"binsEfficiency", std::vector{o2::analysis::hf_cuts_d0_to_pi_k::vecBinsPt}, "pT bin limits for efficiency"}; + Configurable> binsPtEfficiencyD{"binsPtEfficiencyD", std::vector{o2::analysis::hf_cuts_d0_to_pi_k::vecBinsPt}, "pT bin limits for efficiency"}; + Configurable> binsPtEfficiencyHad{"binsPtEfficiencyHad", std::vector{0.3, 2., 4., 8., 12., 50.}, "pT bin limits for associated particle efficiency"}; + Configurable> efficiencyDmeson{"efficiencyDmeson", std::vector{vecEfficiencyDmeson}, "Efficiency values for D meson specie under study"}; + Configurable> efficiencyHad{"efficiencyHad", {1., 1., 1., 1., 1., 1.}, "efficiency values for associated particles"}; + Configurable applyEfficiency{"applyEfficiency", 1, "Flag for applying efficiency weights"}; Configurable> classMl{"classMl", {0, 1, 2}, "Indexes of ML scores to be stored. Three indexes max."}; Configurable> mlOutputPromptD0{"mlOutputPromptD0", {0.5, 0.5, 0.5, 0.5}, "Machine learning scores for prompt"}; Configurable> mlOutputBkgD0{"mlOutputBkgD0", {0.5, 0.5, 0.5, 0.5}, "Machine learning scores for bkg"}; Configurable> mlOutputPromptD0bar{"mlOutputPromptD0bar", {0.5, 0.5, 0.5, 0.5}, "Machine learning scores for prompt"}; Configurable> mlOutputBkgD0bar{"mlOutputBkgD0bar", {0.5, 0.5, 0.5, 0.5}, "Machine learning scores for bkg"}; - // signal and sideband region edges, to be defined via json file (initialised to empty) + Configurable ptCandMin{"ptCandMin", 1., "min. cand. pT"}; + Configurable ptCandMax{"ptCandMax", 50., "max. cand pT"}; + Configurable ptTrackMin{"ptTrackMin", 0.3, "min. track pT"}; + Configurable ptTrackMax{"ptTrackMax", 99., "max. track pT"}; + Configurable etaTrackMax{"etaTrackMax", 0.8, "max. eta of tracks"}; + Configurable yCandMax{"yCandMax", 0.8, "max. cand. rapidity"}; + Configurable yCandGenMax{"yCandGenMax", 0.5, "max. gen. cand. rapidity"}; + Configurable ptDaughterMin{"ptDaughterMin", 0.1, "min. daughter pT"}; + Configurable nTpcCrossedRaws{"nTpcCrossedRaws", 70, "Number of crossed TPC Rows"}; + Configurable dcaXYTrackMax{"dcaXYTrackMax", 1., "max. DCA_xy of tracks"}; + Configurable dcaZTrackMax{"dcaZTrackMax", 1., "max. DCA_z of tracks"}; + Configurable selectionFlagD0{"selectionFlagD0", 1, "Selection Flag for D0 (bar)"}; + Configurable selNoSameBunchPileUpColl{"selNoSameBunchPileUpColl", true, "Flag for rejecting the collisions associated with the same bunch crossing"}; Configurable> signalRegionLeft{"signalRegionLeft", std::vector{vecsignalRegionLeft}, "Inner values of signal region vs pT"}; Configurable> signalRegionRight{"signalRegionRight", std::vector{vecsignalRegionRight}, "Outer values of signal region vs pT"}; Configurable> sidebandLeftInner{"sidebandLeftInner", std::vector{vecSidebandLeftInner}, "Inner values of left sideband vs pT"}; Configurable> sidebandLeftOuter{"sidebandLeftOuter", std::vector{vecSidebandLeftOuter}, "Outer values of left sideband vs pT"}; Configurable> sidebandRightInner{"sidebandRightInner", std::vector{vecSidebandRightInner}, "Inner values of right sideband vs pT"}; Configurable> sidebandRightOuter{"sidebandRightOuter", std::vector{vecSidebandRightOuter}, "Outer values of right sideband vs pT"}; - Configurable> efficiencyDmeson{"efficiencyDmeson", std::vector{vecEfficiencyDmeson}, "Efficiency values for D meson specie under study"}; Configurable isTowardTransverseAway{"isTowardTransverseAway", false, "Divide into three regions: toward, transverse, and away"}; Configurable leadingParticlePtMin{"leadingParticlePtMin", 0., "Min for leading particle pt"}; - Configurable applyEfficiency{"applyEfficiency", 1, "Flag for applying efficiency weights"}; - HistogramRegistry registry{ - "registry", - {{"hDeltaEtaPtIntSignalRegion", stringDHadron + stringSignal + stringDeltaEta + "entries", {HistType::kTH1F, {axisDeltaEta}}}, - {"hDeltaPhiPtIntSignalRegion", stringDHadron + stringSignal + stringDeltaPhi + "entries", {HistType::kTH1F, {axisDeltaPhi}}}, - {"hCorrel2DPtIntSignalRegion", stringDHadron + stringSignal + stringDeltaPhi + stringDeltaEta + "entries", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}}, - {"hCorrel2DVsPtSignalRegion", stringDHadron + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtHadron + "entries", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}}, // note: axes 3 and 4 (the pT) are updated in the init() - {"hDeltaEtaPtIntSignalRegionSoftPi", stringDHadron + stringSignal + stringDeltaEta + "entries", {HistType::kTH1F, {axisDeltaEta}}}, - {"hDeltaPhiPtIntSignalRegionSoftPi", stringDHadron + stringSignal + stringDeltaPhi + "entries", {HistType::kTH1F, {axisDeltaPhi}}}, - {"hCorrel2DPtIntSignalRegionSoftPi", stringDHadron + stringSignal + stringDeltaPhi + stringDeltaEta + "entries", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}}, - {"hCorrel2DVsPtSignalRegionSoftPi", stringDHadron + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtHadron + "entries", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}}, // note: axes 3 and 4 (the pT) are updated in the init() - {"hDeltaEtaPtIntSidebands", stringDHadron + stringSideband + stringDeltaEta + "entries", {HistType::kTH1F, {axisDeltaEta}}}, - {"hDeltaPhiPtIntSidebands", stringDHadron + stringSideband + stringDeltaPhi + "entries", {HistType::kTH1F, {axisDeltaPhi}}}, - {"hCorrel2DPtIntSidebands", stringDHadron + stringSideband + stringDeltaPhi + stringDeltaEta + "entries", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}}, - {"hCorrel2DVsPtSidebands", stringDHadron + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtHadron + "entries", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}}, // note: axes 3 and 4 (the pT) are updated in the init() - {"hDeltaEtaPtIntSidebandsSoftPi", stringDHadron + stringSideband + stringDeltaEta + "entries", {HistType::kTH1F, {axisDeltaEta}}}, - {"hDeltaPhiPtIntSidebandsSoftPi", stringDHadron + stringSideband + stringDeltaPhi + "entries", {HistType::kTH1F, {axisDeltaPhi}}}, - {"hCorrel2DPtIntSidebandsSoftPi", stringDHadron + stringSideband + stringDeltaPhi + stringDeltaEta + "entries", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}}, - {"hCorrel2DVsPtSidebandsSoftPi", stringDHadron + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtHadron + "entries", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}}, // note: axes 3 and 4 (the pT) are updated in the init() - {"hCorrel2DVsPtRecSig", stringDHadron + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtHadron + "entries", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}}, - {"hCorrel2DVsPtRecBg", stringDHadron + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtHadron + "entries", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}}, - // correlation histograms for MCRec for signal only - {"hCorrel2DVsPtSignalRegionRecSig", stringDHadron + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtHadron + "entries", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}}, - {"hCorrel2DVsPtSignalRegionSoftPiRecSig", stringDHadron + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtHadron + "entries", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}}, - {"hCorrel2DPtIntSignalRegionRecSig", stringDHadron + stringSignal + stringDeltaPhi + stringDeltaEta + "entries", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}}, - {"hCorrel2DPtIntSignalRegionSoftPiRecSig", stringDHadron + stringSignal + stringDeltaPhi + stringDeltaEta + "entries", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}}, - {"hDeltaEtaPtIntSignalRegionRecSig", stringDHadron + stringSignal + stringDeltaEta + "entries", {HistType::kTH1F, {axisDeltaEta}}}, - {"hDeltaEtaPtIntSignalRegionSoftPiRecSig", stringDHadron + stringSignal + stringDeltaEta + "entries", {HistType::kTH1F, {axisDeltaEta}}}, - {"hDeltaPhiPtIntSignalRegionRecSig", stringDHadron + stringSignal + stringDeltaPhi + "entries", {HistType::kTH1F, {axisDeltaPhi}}}, - {"hDeltaPhiPtIntSignalRegionSoftPiRecSig", stringDHadron + stringSignal + stringDeltaPhi + "entries", {HistType::kTH1F, {axisDeltaPhi}}}, - {"hCorrel2DVsPtSidebandsRecSig", stringDHadron + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtHadron + "entries", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}}, - {"hCorrel2DVsPtSidebandsSoftPiRecSig", stringDHadron + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtHadron + "entries", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}}, - {"hCorrel2DPtIntSidebandsRecSig", stringDHadron + stringSideband + stringDeltaPhi + stringDeltaEta + "entries", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}}, - {"hCorrel2DPtIntSidebandsSoftPiRecSig", stringDHadron + stringSideband + stringDeltaPhi + stringDeltaEta + "entries", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}}, - {"hDeltaEtaPtIntSidebandsRecSig", stringDHadron + stringSideband + stringDeltaEta + "entries", {HistType::kTH1F, {axisDeltaEta}}}, - {"hDeltaEtaPtIntSidebandsSoftPiRecSig", stringDHadron + stringSideband + stringDeltaEta + "entries", {HistType::kTH1F, {axisDeltaEta}}}, - {"hDeltaPhiPtIntSidebandsRecSig", stringDHadron + stringSideband + stringDeltaPhi + "entries", {HistType::kTH1F, {axisDeltaPhi}}}, - {"hDeltaPhiPtIntSidebandsSoftPiRecSig", stringDHadron + stringSideband + stringDeltaPhi + "entries", {HistType::kTH1F, {axisDeltaPhi}}}, - // correlation histograms for MCRec for reflection candidates only - {"hCorrel2DVsPtSignalRegionRecRef", stringDHadron + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtHadron + "entries", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}}, - {"hCorrel2DPtIntSignalRegionRecRef", stringDHadron + stringSignal + stringDeltaPhi + stringDeltaEta + "entries", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}}, - {"hDeltaEtaPtIntSignalRegionRecRef", stringDHadron + stringSignal + stringDeltaEta + "entries", {HistType::kTH1F, {axisDeltaEta}}}, - {"hDeltaPhiPtIntSignalRegionRecRef", stringDHadron + stringSignal + stringDeltaPhi + "entries", {HistType::kTH1F, {axisDeltaPhi}}}, - {"hCorrel2DVsPtSidebandsRecRef", stringDHadron + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtHadron + "entries", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}}, - {"hCorrel2DPtIntSidebandsRecRef", stringDHadron + stringSideband + stringDeltaPhi + stringDeltaEta + "entries", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}}, - {"hDeltaEtaPtIntSidebandsRecRef", stringDHadron + stringSideband + stringDeltaEta + "entries", {HistType::kTH1F, {axisDeltaEta}}}, - {"hDeltaPhiPtIntSidebandsRecRef", stringDHadron + stringSideband + stringDeltaPhi + "entries", {HistType::kTH1F, {axisDeltaPhi}}}, - {"hCorrel2DVsPtSignalRegionSoftPiRecRef", stringDHadron + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtHadron + "entries", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}}, - {"hCorrel2DPtIntSignalRegionSoftPiRecRef", stringDHadron + stringSignal + stringDeltaPhi + stringDeltaEta + "entries", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}}, - {"hDeltaEtaPtIntSignalRegionSoftPiRecRef", stringDHadron + stringSignal + stringDeltaEta + "entries", {HistType::kTH1F, {axisDeltaEta}}}, - {"hDeltaPhiPtIntSignalRegionSoftPiRecRef", stringDHadron + stringSignal + stringDeltaPhi + "entries", {HistType::kTH1F, {axisDeltaPhi}}}, - {"hCorrel2DVsPtSidebandsSoftPiRecRef", stringDHadron + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtHadron + "entries", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}}, - {"hCorrel2DPtIntSidebandsSoftPiRecRef", stringDHadron + stringSideband + stringDeltaPhi + stringDeltaEta + "entries", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}}, - {"hDeltaEtaPtIntSidebandsSoftPiRecRef", stringDHadron + stringSideband + stringDeltaEta + "entries", {HistType::kTH1F, {axisDeltaEta}}}, - {"hDeltaPhiPtIntSidebandsSoftPiRecRef", stringDHadron + stringSideband + stringDeltaPhi + "entries", {HistType::kTH1F, {axisDeltaPhi}}}, - // correlation histograms for MCRec for background candidates only - {"hCorrel2DVsPtSignalRegionRecBg", stringDHadron + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtHadron + "entries", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}}, - {"hCorrel2DPtIntSignalRegionRecBg", stringDHadron + stringSignal + stringDeltaPhi + stringDeltaEta + "entries", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}}, - {"hDeltaEtaPtIntSignalRegionRecBg", stringDHadron + stringSignal + stringDeltaEta + "entries", {HistType::kTH1F, {axisDeltaEta}}}, - {"hDeltaPhiPtIntSignalRegionRecBg", stringDHadron + stringSignal + stringDeltaPhi + "entries", {HistType::kTH1F, {axisDeltaPhi}}}, - {"hCorrel2DVsPtSidebandsRecBg", stringDHadron + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtHadron + "entries", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}}, - {"hCorrel2DPtIntSidebandsRecBg", stringDHadron + stringSideband + stringDeltaPhi + stringDeltaEta + "entries", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}}, - {"hDeltaEtaPtIntSidebandsRecBg", stringDHadron + stringSideband + stringDeltaEta + "entries", {HistType::kTH1F, {axisDeltaEta}}}, - {"hDeltaPhiPtIntSidebandsRecBg", stringDHadron + stringSideband + stringDeltaPhi + "entries", {HistType::kTH1F, {axisDeltaPhi}}}, - {"hCorrel2DVsPtSignalRegionSoftPiRecBg", stringDHadron + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtHadron + "entries", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}}, - {"hCorrel2DPtIntSignalRegionSoftPiRecBg", stringDHadron + stringSignal + stringDeltaPhi + stringDeltaEta + "entries", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}}, - {"hDeltaEtaPtIntSignalRegionSoftPiRecBg", stringDHadron + stringSignal + stringDeltaEta + "entries", {HistType::kTH1F, {axisDeltaEta}}}, - {"hDeltaPhiPtIntSignalRegionSoftPiRecBg", stringDHadron + stringSignal + stringDeltaPhi + "entries", {HistType::kTH1F, {axisDeltaPhi}}}, - {"hCorrel2DVsPtSidebandsSoftPiRecBg", stringDHadron + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtHadron + "entries", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}}, - {"hCorrel2DPtIntSidebandsSoftPiRecBg", stringDHadron + stringSideband + stringDeltaPhi + stringDeltaEta + "entries", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}}, - {"hDeltaEtaPtIntSidebandsSoftPiRecBg", stringDHadron + stringSideband + stringDeltaEta + "entries", {HistType::kTH1F, {axisDeltaEta}}}, - {"hDeltaPhiPtIntSidebandsSoftPiRecBg", stringDHadron + stringSideband + stringDeltaPhi + "entries", {HistType::kTH1F, {axisDeltaPhi}}}, - // correlation histograms for MCGen - {"hCorrel2DVsPtGen", stringMcParticles + stringDeltaPhi + stringDeltaEta + stringPtD + "entries", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}}, // note: axes 3 and 4 (the pT) are updated in the init(), - {"hCorrel2DPtIntGen", stringMcParticles + stringDeltaPhi + stringDeltaEta + "entries", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}}, - {"hDeltaEtaPtIntGen", stringMcParticles + stringDeltaEta + "entries", {HistType::kTH1F, {axisDeltaEta}}}, - {"hDeltaPhiPtIntGen", stringMcParticles + stringDeltaPhi + "entries", {HistType::kTH1F, {axisDeltaPhi}}}, - // Toward Transverse Away - {"hToward", "Toward invmass; ptD; correlationState;entries", {HistType::kTH3F, {{axisMass}, {axisPtD}, {axisCorrelationState}}}}, - {"hTransverse", "Transverse invmass; ptD; correlationState;entries", {HistType::kTH3F, {{axisMass}, {axisPtD}, {axisCorrelationState}}}}, - {"hAway", "Away invmass; ptD; correlationState;entries", {HistType::kTH3F, {{axisMass}, {axisPtD}, {axisCorrelationState}}}}, - - // Toward Transverse Away for McRec - {"hTowardRec", "Toward invmass; ptD; correlationState;entries", {HistType::kTH3F, {{axisMass}, {axisPtD}, {axisCorrelationState}}}}, - {"hTransverseRec", "Transverse invmass; ptD; correlationState;entries", {HistType::kTH3F, {{axisMass}, {axisPtD}, {axisCorrelationState}}}}, - {"hAwayRec", "Away invmass; ptD; correlationState;entries", {HistType::kTH3F, {{axisMass}, {axisPtD}, {axisCorrelationState}}}}, - // Toward Transverse Away for McGen - {"hTowardGen", "Toward invmass; ptD; correlationState;entries", {HistType::kTH3F, {{axisMass}, {axisPtD}, {axisCorrelationState}}}}, - {"hTransverseGen", "Transverse invmass; ptD; correlationState;entries", {HistType::kTH3F, {{axisMass}, {axisPtD}, {axisCorrelationState}}}}, - {"hAwayGen", "Away invmass; ptD; correlationState;entries", {HistType::kTH3F, {{axisMass}, {axisPtD}, {axisCorrelationState}}}}}}; + HfHelper hfHelper; + + enum CandidateStep { kCandidateStepMcGenAll = 0, + kCandidateStepMcGenD0ToPiKPi, + kCandidateStepMcCandInAcceptance, + kCandidateStepMcDaughtersInAcceptance, + kCandidateStepMcReco, + kCandidateStepMcRecoInAcceptance, + kCandidateNSteps }; + + using D0HadronPairFull = soa::Join; + using D0HadronPairFullMl = soa::Join; + using CandD0McReco = soa::Filtered>; + using CandD0McGen = soa::Join; + using TracksWithMc = soa::Filtered>; // trackFilter applied + + Filter d0Filter = (aod::hf_sel_candidate_d0::isSelD0 >= selectionFlagD0) || (aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlagD0); + Filter trackFilter = (nabs(aod::track::eta) < etaTrackMax) && (aod::track::pt > ptTrackMin) && (aod::track::pt < ptTrackMax) && (nabs(aod::track::dcaXY) < dcaXYTrackMax) && (nabs(aod::track::dcaZ) < dcaZTrackMax); + + ConfigurableAxis binsMassD{"binsMassD", {200, 1.3848, 2.3848}, "inv. mass (#pi K) (GeV/#it{c}^{2});entries"}; + ConfigurableAxis binsBdtScore{"binsBdtScore", {100, 0., 1.}, "Bdt output scores"}; + ConfigurableAxis binsEta{"binsEta", {100, -2., 2.}, "#it{#eta}"}; + ConfigurableAxis binsPhi{"binsPhi", {64, -PIHalf, 3. * PIHalf}, "#it{#varphi}"}; + ConfigurableAxis binsMultFT0M{"binsMultFT0M", {600, 0., 8000.}, "Multiplicity as FT0M signal amplitude"}; + ConfigurableAxis binsPosZ{"binsPosZ", {100, -10., 10.}, "primary vertex z coordinate"}; + ConfigurableAxis binsPoolBin{"binsPoolBin", {9, 0., 9.}, "PoolBin"}; + + HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject}; + void init(InitContext&) { - int nBinsPtAxis = binsCorrelations->size() - 1; - const double* valuesPtAxis = binsCorrelations->data(); - registry.add("hBdtScorePromptD0", "D0 BDT prompt score", {HistType::kTH1F, {axisBdtScore}}); - registry.add("hBdtScoreBkgD0", "D0 BDT bkg score", {HistType::kTH1F, {axisBdtScore}}); - registry.add("hBdtScorePromptD0bar", "D0bar BDT prompt score", {HistType::kTH1F, {axisBdtScore}}); - registry.add("hBdtScoreBkgD0bar", "D0bar BDT bkg score", {HistType::kTH1F, {axisBdtScore}}); - registry.get(HIST("hCorrel2DVsPtSignalRegion"))->GetAxis(2)->Set(nBinsPtAxis, valuesPtAxis); - registry.get(HIST("hCorrel2DVsPtSidebands"))->GetAxis(2)->Set(nBinsPtAxis, valuesPtAxis); + AxisSpec axisMassD = {binsMassD, "inv. mass (#pi K) (GeV/#it{c}^{2})"}; + AxisSpec axisDeltaEta = {binsEta, "#it{#eta}^{Hadron}-#it{#eta}^{D}"}; + AxisSpec axisEta = {binsEta, "#it{#eta}"}; + AxisSpec axisDeltaPhi = {binsPhi, "#it{#varphi}^{Hadron}-#it{#varphi}^{D} (rad)"}; + AxisSpec axisPtD = {(std::vector)binsPtD, "#it{p}_{T}^{D} (GeV/#it{c})"}; + AxisSpec axisPtHadron = {(std::vector)binsPtHadron, "#it{p}_{T}^{Hadron} (GeV/#it{c})"}; + AxisSpec axisPoolBin = {binsPoolBin, "poolBin"}; + AxisSpec axisBdtScore = {binsBdtScore, "Bdt score"}; + AxisSpec axisMultFT0M = {binsMultFT0M, "MultiplicityFT0M"}; + AxisSpec axisPosZ = {binsPosZ, "PosZ"}; + AxisSpec axisD0Prompt = {2, -0.5, 1.5, "Prompt D0"}; + AxisSpec axisCorrelationState = {2, 0., 2., "correlationState"}; + + // Histograms for data + registry.add("hDeltaEtaPtIntSignalRegion", "D0-h deltaEta signal region", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("hDeltaPhiPtIntSignalRegion", "D0-h deltaPhi signal region", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("hCorrel2DPtIntSignalRegion", "D0-h deltaPhi vs deltaEta signal region", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hCorrel2DVsPtSignalRegion", "D0-h correlations signal region", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}); + registry.add("hDeltaEtaPtIntSignalRegionSoftPi", "D0-h deltaEta signal region soft pi only", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("hDeltaPhiPtIntSignalRegionSoftPi", "D0-h deltaPhi signal region soft pi only", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("hCorrel2DPtIntSignalRegionSoftPi", "D0-h deltaPhi vs deltaEta signal region soft pi only", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hCorrel2DVsPtSignalRegionSoftPi", "D0-h correlations signal region soft pi only", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}); + registry.add("hDeltaEtaPtIntSidebands", "D0-h deltaEta sidebands", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("hDeltaPhiPtIntSidebands", "D0-h deltaPhi sidebands", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("hCorrel2DPtIntSidebands", "D0-h deltaPhi vs deltaEta sidebands", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hCorrel2DVsPtSidebands", "D0-h correlations sidebands", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}); + registry.add("hDeltaEtaPtIntSidebandsSoftPi", "D0-h deltaEta sidebands soft pi only", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("hDeltaPhiPtIntSidebandsSoftPi", "D0-h deltaPhi sidebands soft pi only", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("hCorrel2DPtIntSidebandsSoftPi", "D0-h deltaPhi vs deltaEta sidebands soft pi only", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hCorrel2DVsPtSidebandsSoftPi", "D0-h correlations sidebands soft pi only", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}); registry.get(HIST("hCorrel2DVsPtSignalRegion"))->Sumw2(); registry.get(HIST("hCorrel2DVsPtSidebands"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtSignalRegionSoftPi"))->GetAxis(2)->Set(nBinsPtAxis, valuesPtAxis); - registry.get(HIST("hCorrel2DVsPtSidebandsSoftPi"))->GetAxis(2)->Set(nBinsPtAxis, valuesPtAxis); registry.get(HIST("hCorrel2DVsPtSignalRegionSoftPi"))->Sumw2(); registry.get(HIST("hCorrel2DVsPtSidebandsSoftPi"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtSignalRegionRecSig"))->GetAxis(2)->Set(nBinsPtAxis, valuesPtAxis); - registry.get(HIST("hCorrel2DVsPtSignalRegionSoftPiRecSig"))->GetAxis(2)->Set(nBinsPtAxis, valuesPtAxis); - registry.get(HIST("hCorrel2DVsPtSidebandsRecSig"))->GetAxis(2)->Set(nBinsPtAxis, valuesPtAxis); - registry.get(HIST("hCorrel2DVsPtSidebandsSoftPiRecSig"))->GetAxis(2)->Set(nBinsPtAxis, valuesPtAxis); + // Toward Transverse Away for Data + registry.add("hToward", "Toward", {HistType::kTH3F, {{axisMassD}, {axisPtD}, {axisCorrelationState}}}); + registry.add("hTransverse", "Transverse", {HistType::kTH3F, {{axisMassD}, {axisPtD}, {axisCorrelationState}}}); + registry.add("hAway", "Away", {HistType::kTH3F, {{axisMassD}, {axisPtD}, {axisCorrelationState}}}); + + // Histograms for MC reco + registry.add("hCorrel2DVsPtRecSig", "D0-h correlations MC reco signal", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}); + registry.get(HIST("hCorrel2DVsPtRecSig"))->Sumw2(); + registry.add("hCorrel2DVsPtRecBg", "D0-h correlations MC reco background", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}); + registry.get(HIST("hCorrel2DVsPtRecBg"))->Sumw2(); + // MC reco D0, D0bar signal case + registry.add("hDeltaEtaPtIntSignalRegionRecSig", "D0-h deltaEta MC reco signal region, signal", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("hDeltaPhiPtIntSignalRegionRecSig", "D0-h deltaPhi MC reco signal region, signal", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("hCorrel2DPtIntSignalRegionRecSig", "D0-h deltaPhi vs deltaEta MC reco signal region, signal", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hCorrel2DVsPtSignalRegionRecSig", "D0-h correlations MC reco signal region, signal", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisD0Prompt}, {axisPoolBin}}}); + registry.add("hCorrel2DVsPtPhysicalPrimaryRecSig", "D0-h correlations signal region (only true primary particles) MC reco", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisD0Prompt}, {axisPoolBin}}}); + registry.add("hCorrel2DVsPtSignalRegionPromptD0PromptHadronRecSig", "D0-h correlations signal region Prompt-NonPrompt MC reco", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}); + registry.add("hCorrel2DVsPtSignalRegionNonPromptD0NonPromptHadronRecSig", "D0-h correlations signal region NonPrompt-NonPrompt MC reco", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}); + registry.add("hDeltaEtaPtIntSignalRegionSoftPiRecSig", "D0-h deltaEta MC reco signal region, signal", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("hDeltaPhiPtIntSignalRegionSoftPiRecSig", "D0-h deltaPhi MC reco signal region, signal", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("hCorrel2DPtIntSignalRegionSoftPiRecSig", "D0-h deltaPhi vs deltaEta MC reco signal region, signal", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hCorrel2DVsPtSignalRegionSoftPiRecSig", "D0-h correlations MC reco signal region, signal", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}); + registry.add("hDeltaEtaPtIntSidebandsRecSig", "D0-h deltaEta MC reco sidebands, signal", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("hDeltaPhiPtIntSidebandsRecSig", "D0-h deltaPhi MC reco sidebands, signal", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("hCorrel2DPtIntSidebandsRecSig", "D0-h deltaPhi vs deltaEta MC reco sidebands, signal", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hCorrel2DVsPtSidebandsRecSig", "D0-h correlations MC reco sidebands, signal", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}); + registry.add("hDeltaEtaPtIntSidebandsSoftPiRecSig", "D0-h deltaEta MC reco sidebands, signal", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("hDeltaPhiPtIntSidebandsSoftPiRecSig", "D0-h deltaPhi MC reco sidebands, signal", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("hCorrel2DPtIntSidebandsSoftPiRecSig", "D0-h deltaPhi vs deltaEta MC reco sidebands, signal", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hCorrel2DVsPtSidebandsSoftPiRecSig", "D0-h correlations MC reco sidebands, signal", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}); registry.get(HIST("hCorrel2DVsPtSignalRegionRecSig"))->Sumw2(); + registry.get(HIST("hCorrel2DVsPtPhysicalPrimaryRecSig"))->Sumw2(); registry.get(HIST("hCorrel2DVsPtSignalRegionSoftPiRecSig"))->Sumw2(); registry.get(HIST("hCorrel2DVsPtSidebandsRecSig"))->Sumw2(); registry.get(HIST("hCorrel2DVsPtSidebandsSoftPiRecSig"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtSignalRegionRecRef"))->GetAxis(2)->Set(nBinsPtAxis, valuesPtAxis); - registry.get(HIST("hCorrel2DVsPtSidebandsRecRef"))->GetAxis(2)->Set(nBinsPtAxis, valuesPtAxis); + // MC reco D0, D0bar reflection case + registry.add("hDeltaEtaPtIntSignalRegionRecRef", "D0-h deltaEta MC reco signal region, refelction", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("hDeltaPhiPtIntSignalRegionRecRef", "D0-h deltaPhi MC reco signal region, refelction", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("hCorrel2DPtIntSignalRegionRecRef", "D0-h deltaPhi vs deltaEta MC reco signal region, refelction", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hCorrel2DVsPtSignalRegionRecRef", "D0-h correlations MC reco signal region, refelction", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}); + registry.add("hDeltaEtaPtIntSignalRegionSoftPiRecRef", "D0-h deltaEta MC reco signal region, refelction", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("hDeltaPhiPtIntSignalRegionSoftPiRecRef", "D0-h deltaPhi MC reco signal region, refelction", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("hCorrel2DPtIntSignalRegionSoftPiRecRef", "D0-h deltaPhi vs deltaEta MC reco signal region, refelction", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hCorrel2DVsPtSignalRegionSoftPiRecRef", "D0-h correlations MC reco signal region, refelction", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}); + registry.add("hDeltaEtaPtIntSidebandsRecRef", "D0-h deltaEta MC reco sidebands, refelction", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("hDeltaPhiPtIntSidebandsRecRef", "D0-h deltaPhi MC reco sidebands, refelction", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("hCorrel2DPtIntSidebandsRecRef", "D0-h deltaPhi vs deltaEta MC reco sidebands, refelction", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hCorrel2DVsPtSidebandsRecRef", "D0-h correlations MC reco sidebands, refelction", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}); + registry.add("hDeltaEtaPtIntSidebandsSoftPiRecRef", "D0-h deltaEta MC reco sidebands, refelction", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("hDeltaPhiPtIntSidebandsSoftPiRecRef", "D0-h deltaPhi MC reco sidebands, refelction", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("hCorrel2DPtIntSidebandsSoftPiRecRef", "D0-h deltaPhi vs deltaEta MC reco sidebands, refelction", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hCorrel2DVsPtSidebandsSoftPiRecRef", "D0-h correlations MC reco sidebands, refelction", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}); registry.get(HIST("hCorrel2DVsPtSignalRegionRecRef"))->Sumw2(); registry.get(HIST("hCorrel2DVsPtSidebandsRecRef"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtSignalRegionSoftPiRecRef"))->GetAxis(2)->Set(nBinsPtAxis, valuesPtAxis); - registry.get(HIST("hCorrel2DVsPtSidebandsSoftPiRecRef"))->GetAxis(2)->Set(nBinsPtAxis, valuesPtAxis); registry.get(HIST("hCorrel2DVsPtSignalRegionSoftPiRecRef"))->Sumw2(); registry.get(HIST("hCorrel2DVsPtSidebandsSoftPiRecRef"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtSignalRegionRecBg"))->GetAxis(2)->Set(nBinsPtAxis, valuesPtAxis); - registry.get(HIST("hCorrel2DVsPtSidebandsRecBg"))->GetAxis(2)->Set(nBinsPtAxis, valuesPtAxis); + // MC reco D0, D0bar background case + registry.add("hDeltaEtaPtIntSignalRegionRecBg", "D0-h deltaEta MC reco signal region, background", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("hDeltaPhiPtIntSignalRegionRecBg", "D0-h deltaPhi MC reco signal region, background", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("hCorrel2DPtIntSignalRegionRecBg", "D0-h deltaPhi vs deltaEta MC reco signal region, background", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hCorrel2DVsPtSignalRegionRecBg", "D0-h correlations MC reco signal region, background", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}); + registry.add("hDeltaEtaPtIntSignalRegionSoftPiRecBg", "D0-h deltaEta MC reco signal region, background", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("hDeltaPhiPtIntSignalRegionSoftPiRecBg", "D0-h deltaPhi MC reco signal region, background", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("hCorrel2DPtIntSignalRegionSoftPiRecBg", "D0-h deltaPhi vs deltaEta MC reco signal region, background", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hCorrel2DVsPtSignalRegionSoftPiRecBg", "D0-h correlations MC reco signal region, background", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}); + registry.add("hDeltaEtaPtIntSidebandsRecBg", "D0-h deltaEta MC reco sidebands, background", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("hDeltaPhiPtIntSidebandsRecBg", "D0-h deltaPhi MC reco sidebands, background", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("hCorrel2DPtIntSidebandsRecBg", "D0-h deltaPhi vs deltaEta MC reco sidebands, background", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hCorrel2DVsPtSidebandsRecBg", "D0-h correlations MC reco sidebands, background", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}); + registry.add("hDeltaEtaPtIntSidebandsSoftPiRecBg", "D0-h deltaEta MC reco sidebands, background", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("hDeltaPhiPtIntSidebandsSoftPiRecBg", "D0-h deltaPhi MC reco sidebands, background", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("hCorrel2DPtIntSidebandsSoftPiRecBg", "D0-h deltaPhi vs deltaEta MC reco sidebands, background", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hCorrel2DVsPtSidebandsSoftPiRecBg", "D0-h correlations MC reco sidebands, background", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}); registry.get(HIST("hCorrel2DVsPtSignalRegionRecBg"))->Sumw2(); registry.get(HIST("hCorrel2DVsPtSidebandsRecBg"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtSignalRegionSoftPiRecBg"))->GetAxis(2)->Set(nBinsPtAxis, valuesPtAxis); - registry.get(HIST("hCorrel2DVsPtSidebandsSoftPiRecBg"))->GetAxis(2)->Set(nBinsPtAxis, valuesPtAxis); registry.get(HIST("hCorrel2DVsPtSignalRegionSoftPiRecBg"))->Sumw2(); registry.get(HIST("hCorrel2DVsPtSidebandsSoftPiRecBg"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtRecSig"))->GetAxis(2)->Set(nBinsPtAxis, valuesPtAxis); - registry.get(HIST("hCorrel2DVsPtRecSig"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtRecBg"))->GetAxis(2)->Set(nBinsPtAxis, valuesPtAxis); - registry.get(HIST("hCorrel2DVsPtRecBg"))->Sumw2(); - registry.get(HIST("hCorrel2DVsPtGen"))->GetAxis(2)->Set(nBinsPtAxis, valuesPtAxis); - registry.get(HIST("hCorrel2DVsPtGen"))->Sumw2(); + // Toward Transverse Away for McRec + registry.add("hTowardRec", "Toward", {HistType::kTH3F, {{axisMassD}, {axisPtD}, {axisCorrelationState}}}); + registry.add("hTransverseRec", "Transverse", {HistType::kTH3F, {{axisMassD}, {axisPtD}, {axisCorrelationState}}}); + registry.add("hAwayRec", "Away", {HistType::kTH3F, {{axisMassD}, {axisPtD}, {axisCorrelationState}}}); + + // Histograms for MC gen + registry.add("hDeltaEtaPtIntGen", "D0-h deltaEta MC gen", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("hDeltaPhiPtIntGen", "D0-h deltaPhi MC gen", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("hCorrel2DPtIntGen", "D0-h deltaPhi vs deltaEta MC gen", {HistType::kTH2F, {{axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hCorrel2DVsPtGenPrompt", "D0-h correlations MC gen, prompt", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}); + registry.add("hCorrel2DVsPtGenNonPrompt", "D0-h correlations MC gen, non prompt", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}); + registry.add("hCorrel2DVsPtGenPromptD0PromptHadron", "D0-h correlations MC gen, prompt D0, non-prompt hadrons", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}); + registry.add("hCorrel2DVsPtGenNonPromptD0NonPromptHadron", "D0-h correlations MC gen, prompt D0, non-prompt hadrons", {HistType::kTHnSparseD, {{axisDeltaPhi}, {axisDeltaEta}, {axisPtD}, {axisPtHadron}, {axisPoolBin}}}); + registry.get(HIST("hCorrel2DVsPtGenPrompt"))->Sumw2(); + registry.get(HIST("hCorrel2DVsPtGenNonPrompt"))->Sumw2(); + registry.get(HIST("hCorrel2DVsPtGenPromptD0PromptHadron"))->Sumw2(); + registry.get(HIST("hCorrel2DVsPtGenNonPromptD0NonPromptHadron"))->Sumw2(); + // Toward Transverse Away for MC gen + registry.add("hTowardGen", "Toward", {HistType::kTH3F, {{axisMassD}, {axisPtD}, {axisCorrelationState}}}); + registry.add("hTransverseGen", "Transverse", {HistType::kTH3F, {{axisMassD}, {axisPtD}, {axisCorrelationState}}}); + registry.add("hAwayGen", "Away", {HistType::kTH3F, {{axisMassD}, {axisPtD}, {axisCorrelationState}}}); + + // Common histograms + registry.add("hBdtScorePromptD0", "D0 BDT prompt score", {HistType::kTH1F, {axisBdtScore}}); + registry.add("hBdtScoreBkgD0", "D0 BDT bkg score", {HistType::kTH1F, {axisBdtScore}}); + registry.add("hBdtScorePromptD0bar", "D0bar BDT prompt score", {HistType::kTH1F, {axisBdtScore}}); + registry.add("hBdtScoreBkgD0bar", "D0bar BDT bkg score", {HistType::kTH1F, {axisBdtScore}}); + + // Efficiency histograms + registry.add("hPtCandMcRecPrompt", "D0 prompt candidates pt", {HistType::kTH1F, {axisPtD}}); + registry.add("hPtCandMcRecNonPrompt", "D0 non prompt candidates pt", {HistType::kTH1F, {axisPtD}}); + registry.add("hPtCandMcGenPrompt", "D0,Hadron particles prompt - MC Gen", {HistType::kTH1F, {axisPtD}}); + registry.add("hPtCandMcGenNonPrompt", "D0,Hadron particles non prompt - MC Gen", {HistType::kTH1F, {axisPtD}}); + registry.add("hPtCandMcGenDaughterInAcc", "D0,Hadron particles non prompt - MC Gen", {HistType::kTH1F, {axisPtD}}); + + auto hCandidates = registry.add("hCandidates", "Candidate count at different steps", {HistType::kStepTHnF, {axisPtD, axisMultFT0M, {RecoDecay::OriginType::NonPrompt + 1, +RecoDecay::OriginType::None - 0.5, +RecoDecay::OriginType::NonPrompt + 0.5}}, kCandidateNSteps}); + hCandidates->GetAxis(0)->SetTitle("#it{p}_{T} (GeV/#it{c})"); + hCandidates->GetAxis(1)->SetTitle("multiplicity"); + hCandidates->GetAxis(2)->SetTitle("Charm hadron origin"); } /// D-h correlation pair filling task, from pair tables - for real data and data-like analysis (i.e. reco-level w/o matching request via MC truth) /// Works on both USL and LS analyses pair tables - void processData(aod::D0HadronPairFullMl const& pairEntries, + void processData(D0HadronPairFullMl const& pairEntries, aod::D0CandRecoInfo const& candidates) { for (const auto& candidate : candidates) { @@ -254,15 +289,17 @@ struct HfTaskCorrelationD0Hadrons { float bdtScoreBkgD0 = candidate.mlScoreBkgD0(); float bdtScorePromptD0bar = candidate.mlScorePromptD0bar(); float bdtScoreBkgD0bar = candidate.mlScoreBkgD0bar(); - int effBinD = o2::analysis::findBin(binsEfficiency, ptD); - if (bdtScorePromptD0 < mlOutputPromptD0->at(effBinD) || bdtScoreBkgD0 > mlOutputBkgD0->at(effBinD) || - bdtScorePromptD0bar < mlOutputPromptD0bar->at(effBinD) || bdtScoreBkgD0bar > mlOutputBkgD0bar->at(effBinD)) { - continue; - } + int effBinD = o2::analysis::findBin(binsPtEfficiencyD, ptD); + registry.fill(HIST("hBdtScorePromptD0"), bdtScorePromptD0); registry.fill(HIST("hBdtScoreBkgD0"), bdtScoreBkgD0); registry.fill(HIST("hBdtScorePromptD0bar"), bdtScorePromptD0bar); registry.fill(HIST("hBdtScoreBkgD0bar"), bdtScoreBkgD0bar); + + if (bdtScorePromptD0 < mlOutputPromptD0->at(effBinD) || bdtScoreBkgD0 > mlOutputBkgD0->at(effBinD) || + bdtScorePromptD0bar < mlOutputPromptD0bar->at(effBinD) || bdtScoreBkgD0bar > mlOutputBkgD0bar->at(effBinD)) { + continue; + } } for (const auto& pairEntry : pairEntries) { @@ -274,9 +311,12 @@ struct HfTaskCorrelationD0Hadrons { double massD = pairEntry.mD(); double massDbar = pairEntry.mDbar(); int signalStatus = pairEntry.signalStatus(); - int effBinD = o2::analysis::findBin(binsEfficiency, ptD); + int effBinD = o2::analysis::findBin(binsPtEfficiencyD, ptD); int ptBinD = o2::analysis::findBin(binsCorrelations, ptD); int poolBin = pairEntry.poolBin(); + float trackDcaXY = pairEntry.trackDcaXY(); + float trackDcaZ = pairEntry.trackDcaZ(); + int trackTpcCrossedRows = pairEntry.trackTPCNClsCrossedRows(); bool isAutoCorrelated = pairEntry.isAutoCorrelated(); float bdtScorePromptD0 = pairEntry.mlScorePromptD0(); float bdtScoreBkgD0 = pairEntry.mlScoreBkgD0(); @@ -286,16 +326,16 @@ struct HfTaskCorrelationD0Hadrons { if (ptBinD < 0 || effBinD < 0) { continue; } - if (ptHadron > ptHadronMax) { - ptHadron = ptHadronMax + 0.5; - } if (bdtScorePromptD0 < mlOutputPromptD0->at(ptBinD) || bdtScoreBkgD0 > mlOutputBkgD0->at(ptBinD) || bdtScorePromptD0bar < mlOutputPromptD0bar->at(ptBinD) || bdtScoreBkgD0bar > mlOutputBkgD0bar->at(ptBinD)) { continue; } + if (trackDcaXY > dcaXYTrackMax || trackDcaZ > dcaZTrackMax || trackTpcCrossedRows < nTpcCrossedRaws) { + continue; + } double efficiencyWeight = 1.; if (applyEfficiency) { - efficiencyWeight = 1. / (efficiencyDmeson->at(o2::analysis::findBin(binsEfficiency, ptD))); // ***** track efficiency to be implemented ***** + efficiencyWeight = 1. / (efficiencyDmeson->at(o2::analysis::findBin(binsPtEfficiencyD, ptD)) * efficiencyHad->at(o2::analysis::findBin(binsPtEfficiencyHad, ptHadron))); } // reject entries outside pT ranges of interest if (ptBinD == -1) { // at least one particle outside accepted pT range @@ -399,8 +439,28 @@ struct HfTaskCorrelationD0Hadrons { } PROCESS_SWITCH(HfTaskCorrelationD0Hadrons, processData, "Process data", false); - void processMcRec(aod::D0HadronPairFull const& pairEntries) + void processMcRec(D0HadronPairFullMl const& pairEntries, + soa::Join const& candidates) { + for (const auto& candidate : candidates) { + float ptD = candidate.ptD(); + float bdtScorePromptD0 = candidate.mlScorePromptD0(); + float bdtScoreBkgD0 = candidate.mlScoreBkgD0(); + float bdtScorePromptD0bar = candidate.mlScorePromptD0bar(); + float bdtScoreBkgD0bar = candidate.mlScoreBkgD0bar(); + int effBinD = o2::analysis::findBin(binsPtEfficiencyD, ptD); + + registry.fill(HIST("hBdtScorePromptD0"), bdtScorePromptD0); + registry.fill(HIST("hBdtScoreBkgD0"), bdtScoreBkgD0); + registry.fill(HIST("hBdtScorePromptD0bar"), bdtScorePromptD0bar); + registry.fill(HIST("hBdtScoreBkgD0bar"), bdtScoreBkgD0bar); + + if (bdtScorePromptD0 < mlOutputPromptD0->at(effBinD) || bdtScoreBkgD0 > mlOutputBkgD0->at(effBinD) || + bdtScorePromptD0bar < mlOutputPromptD0bar->at(effBinD) || bdtScoreBkgD0bar > mlOutputBkgD0bar->at(effBinD)) { + continue; + } + } + for (const auto& pairEntry : pairEntries) { // define variables for widely used quantities double deltaPhi = pairEntry.deltaPhi(); @@ -412,11 +472,28 @@ struct HfTaskCorrelationD0Hadrons { int signalStatus = pairEntry.signalStatus(); int ptBinD = o2::analysis::findBin(binsCorrelations, ptD); int poolBin = pairEntry.poolBin(); + float trackDcaXY = pairEntry.trackDcaXY(); + float trackDcaZ = pairEntry.trackDcaZ(); + int trackTpcCrossedRows = pairEntry.trackTPCNClsCrossedRows(); bool isAutoCorrelated = pairEntry.isAutoCorrelated(); + float bdtScorePromptD0 = pairEntry.mlScorePromptD0(); + float bdtScoreBkgD0 = pairEntry.mlScoreBkgD0(); + float bdtScorePromptD0bar = pairEntry.mlScorePromptD0bar(); + float bdtScoreBkgD0bar = pairEntry.mlScoreBkgD0bar(); + bool isPhysicalPrimary = pairEntry.isPhysicalPrimary(); + int statusD0Prompt = static_cast(pairEntry.isPrompt()); + int statusPromptHadron = pairEntry.trackOrigin(); + if (bdtScorePromptD0 < mlOutputPromptD0->at(ptBinD) || bdtScoreBkgD0 > mlOutputBkgD0->at(ptBinD) || + bdtScorePromptD0bar < mlOutputPromptD0bar->at(ptBinD) || bdtScoreBkgD0bar > mlOutputBkgD0bar->at(ptBinD)) { + continue; + } + if (trackDcaXY > dcaXYTrackMax || trackDcaZ > dcaZTrackMax || trackTpcCrossedRows < nTpcCrossedRaws) { + continue; + } double efficiencyWeight = 1.; if (applyEfficiency) { - efficiencyWeight = 1. / (efficiencyDmeson->at(o2::analysis::findBin(binsEfficiency, ptD))); + efficiencyWeight = 1. / (efficiencyDmeson->at(o2::analysis::findBin(binsPtEfficiencyD, ptD)) * efficiencyHad->at(o2::analysis::findBin(binsPtEfficiencyHad, ptHadron))); } if (isTowardTransverseAway) { // Divide into three regions: toward, transverse, and away @@ -451,18 +528,34 @@ struct HfTaskCorrelationD0Hadrons { // ---------------------- Fill plots for signal case, D0 ->1, D0bar ->8 --------------------------------------------- if ((massD > signalRegionLeft->at(ptBinD) && massD < signalRegionRight->at(ptBinD)) && (TESTBIT(signalStatus, ParticleTypeMcRec::D0Sig))) { // in signal region, tests bit ParticleTypeMcRec::D0Sig, SE-> softpi removed, ME-> inclusive - registry.fill(HIST("hCorrel2DVsPtSignalRegionRecSig"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); + registry.fill(HIST("hCorrel2DVsPtSignalRegionRecSig"), deltaPhi, deltaEta, ptD, ptHadron, statusD0Prompt, poolBin, efficiencyWeight); registry.fill(HIST("hCorrel2DPtIntSignalRegionRecSig"), deltaPhi, deltaEta, efficiencyWeight); registry.fill(HIST("hDeltaEtaPtIntSignalRegionRecSig"), deltaEta, efficiencyWeight); registry.fill(HIST("hDeltaPhiPtIntSignalRegionRecSig"), deltaPhi, efficiencyWeight); + if (isPhysicalPrimary) { + registry.fill(HIST("hCorrel2DVsPtPhysicalPrimaryRecSig"), deltaPhi, deltaEta, ptD, ptHadron, statusD0Prompt, poolBin, efficiencyWeight); + if (statusD0Prompt == 1 && statusPromptHadron == 1) { + registry.fill(HIST("hCorrel2DVsPtSignalRegionPromptD0PromptHadronRecSig"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); + } else if (statusD0Prompt == 0 && statusPromptHadron == 2) { + registry.fill(HIST("hCorrel2DVsPtSignalRegionNonPromptD0NonPromptHadronRecSig"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); + } + } } if ((massDbar > signalRegionLeft->at(ptBinD) && massDbar < signalRegionRight->at(ptBinD)) && (TESTBIT(signalStatus, ParticleTypeMcRec::D0barSig))) { // in signal region, tests bit ParticleTypeMcRec::D0barSig, SE-> softpi removed, ME-> inclusive - registry.fill(HIST("hCorrel2DVsPtSignalRegionRecSig"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); + registry.fill(HIST("hCorrel2DVsPtSignalRegionRecSig"), deltaPhi, deltaEta, ptD, ptHadron, statusD0Prompt, poolBin, efficiencyWeight); registry.fill(HIST("hCorrel2DPtIntSignalRegionRecSig"), deltaPhi, deltaEta, efficiencyWeight); registry.fill(HIST("hDeltaEtaPtIntSignalRegionRecSig"), deltaEta, efficiencyWeight); registry.fill(HIST("hDeltaPhiPtIntSignalRegionRecSig"), deltaPhi, efficiencyWeight); + if (isPhysicalPrimary) { + registry.fill(HIST("hCorrel2DVsPtPhysicalPrimaryRecSig"), deltaPhi, deltaEta, ptD, ptHadron, statusD0Prompt, poolBin, efficiencyWeight); + if (statusD0Prompt == 1 && statusPromptHadron == 1) { + registry.fill(HIST("hCorrel2DVsPtSignalRegionPromptD0PromptHadronRecSig"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); + } else if (statusD0Prompt == 0 && statusPromptHadron == 2) { + registry.fill(HIST("hCorrel2DVsPtSignalRegionNonPromptD0NonPromptHadronRecSig"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); + } + } } if ((massDbar > signalRegionLeft->at(ptBinD) && massDbar < signalRegionRight->at(ptBinD)) && (signalStatus >= static_cast(BIT(ParticleTypeMcRec::SoftPi)))) { @@ -617,7 +710,7 @@ struct HfTaskCorrelationD0Hadrons { PROCESS_SWITCH(HfTaskCorrelationD0Hadrons, processMcRec, "Process MC Reco mode", true); /// D-Hadron correlation pair filling task, from pair tables - for MC gen-level analysis (no filter/selection, only true signal) - void processMcGen(aod::D0HadronPairFull const& pairEntries) + void processMcGen(D0HadronPairFull const& pairEntries) { for (const auto& pairEntry : pairEntries) { // define variables for widely used quantities @@ -628,13 +721,13 @@ struct HfTaskCorrelationD0Hadrons { int poolBin = pairEntry.poolBin(); double massD = pairEntry.mD(); bool isAutoCorrelated = pairEntry.isAutoCorrelated(); + int statusPromptHadron = pairEntry.trackOrigin(); + bool isD0Prompt = pairEntry.isPrompt(); + // reject entries outside pT ranges of interest if (o2::analysis::findBin(binsCorrelations, ptD) < 0) { continue; } - if (ptHadron > ptHadronMax) { - ptHadron = ptHadronMax + 0.5; - } if (isTowardTransverseAway) { // Divide into three regions: toward, transverse, and away if (ptHadron < leadingParticlePtMin) { @@ -655,13 +748,108 @@ struct HfTaskCorrelationD0Hadrons { break; } } - registry.fill(HIST("hCorrel2DVsPtGen"), deltaPhi, deltaEta, ptD, ptHadron, poolBin); + if (isD0Prompt) { + registry.fill(HIST("hCorrel2DVsPtGenPrompt"), deltaPhi, deltaEta, ptD, ptHadron, poolBin); + if (statusPromptHadron == 1) { + registry.fill(HIST("hCorrel2DVsPtGenPromptD0PromptHadron"), deltaPhi, deltaEta, ptD, ptHadron, poolBin); + } + } else { + registry.fill(HIST("hCorrel2DVsPtGenNonPrompt"), deltaPhi, deltaEta, ptD, ptHadron, poolBin); + if (statusPromptHadron == 2) { + registry.fill(HIST("hCorrel2DVsPtGenNonPromptD0NonPromptHadron"), deltaPhi, deltaEta, ptD, ptHadron, poolBin); + } + } registry.fill(HIST("hCorrel2DPtIntGen"), deltaPhi, deltaEta); registry.fill(HIST("hDeltaEtaPtIntGen"), deltaEta); registry.fill(HIST("hDeltaPhiPtIntGen"), deltaPhi); } // end loop } PROCESS_SWITCH(HfTaskCorrelationD0Hadrons, processMcGen, "Process MC Gen mode", false); + + /// D0 reconstruction and selection efficiency + void processMcCandEfficiency(soa::Join const&, + soa::Join const&, + CandD0McGen const& mcParticles, + CandD0McReco const& candidates, + aod::TracksWMc const&) + { + auto hCandidates = registry.get(HIST("hCandidates")); + + /// Gen loop + float multiplicity = -1.; + for (const auto& mcParticle : mcParticles) { + // generated candidates + if (std::abs(mcParticle.pdgCode()) != Pdg::kD0) { + auto mcCollision = mcParticle.template mcCollision_as>(); + multiplicity = mcCollision.multMCFT0A() + mcCollision.multMCFT0C(); // multFT0M = multFt0A + multFT0C + hCandidates->Fill(kCandidateStepMcGenAll, mcParticle.pt(), multiplicity, mcParticle.originMcGen()); + if (std::abs(mcParticle.flagMcMatchGen()) == 1 << aod::hf_cand_2prong::DecayType::D0ToPiK) { + hCandidates->Fill(kCandidateStepMcGenD0ToPiKPi, mcParticle.pt(), multiplicity, mcParticle.originMcGen()); + auto yD0 = RecoDecay::y(mcParticle.pVector(), o2::constants::physics::MassD0); + if (std::abs(yD0) <= yCandGenMax) { + hCandidates->Fill(kCandidateStepMcCandInAcceptance, mcParticle.pt(), multiplicity, mcParticle.originMcGen()); + if (mcParticle.originMcGen() == RecoDecay::OriginType::Prompt) { + registry.fill(HIST("hPtCandMcGenPrompt"), mcParticle.pt()); + } + if (mcParticle.originMcGen() == RecoDecay::OriginType::NonPrompt) { + registry.fill(HIST("hPtCandMcGenNonPrompt"), mcParticle.pt()); + } + } + bool isDaughterInAcceptance = true; + auto daughters = mcParticle.template daughters_as(); + for (const auto& daughter : daughters) { + if (daughter.pt() < ptDaughterMin || std::abs(daughter.eta()) > etaTrackMax) { + isDaughterInAcceptance = false; + } + } + if (isDaughterInAcceptance) { + hCandidates->Fill(kCandidateStepMcDaughtersInAcceptance, mcParticle.pt(), multiplicity, mcParticle.originMcGen()); + registry.fill(HIST("hPtCandMcGenDaughterInAcc"), mcParticle.pt()); + } + } + } + } + + // recontructed candidates loop + for (const auto& candidate : candidates) { + if (candidate.pt() < ptCandMin || candidate.pt() > ptCandMax) { + continue; + } + std::vector outputMlD0 = {-1., -1., -1.}; + std::vector outputMlD0bar = {-1., -1., -1.}; + if (candidate.isSelD0() < selectionFlagD0 || candidate.isSelD0bar() < selectionFlagD0) { + continue; + } + for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { + outputMlD0[iclass] = candidate.mlProbD0()[classMl->at(iclass)]; + outputMlD0bar[iclass] = candidate.mlProbD0bar()[classMl->at(iclass)]; + } + if (outputMlD0[0] > mlOutputBkgD0->at(o2::analysis::findBin(binsPtEfficiencyD, candidate.pt())) || outputMlD0[1] < mlOutputPromptD0->at(o2::analysis::findBin(binsPtEfficiencyD, candidate.pt()))) { + continue; + } + if (outputMlD0bar[0] > mlOutputBkgD0bar->at(o2::analysis::findBin(binsPtEfficiencyD, candidate.pt())) || outputMlD0bar[1] < mlOutputPromptD0bar->at(o2::analysis::findBin(binsPtEfficiencyD, candidate.pt()))) { + continue; + } + auto collision = candidate.template collision_as>(); + if (selNoSameBunchPileUpColl && !(collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup))) { + continue; + } + multiplicity = collision.multFT0M(); + if (std::abs(candidate.flagMcMatchRec()) == 1 << aod::hf_cand_2prong::DecayType::D0ToPiK) { + hCandidates->Fill(kCandidateStepMcReco, candidate.pt(), multiplicity, candidate.originMcRec()); + if (std::abs(hfHelper.yD0(candidate)) <= yCandMax) { + hCandidates->Fill(kCandidateStepMcRecoInAcceptance, candidate.pt(), multiplicity, candidate.originMcRec()); + if (candidate.originMcRec() == RecoDecay::OriginType::Prompt) { + registry.fill(HIST("hPtCandMcRecPrompt"), candidate.pt()); + } + if (candidate.originMcRec() == RecoDecay::OriginType::NonPrompt) { + registry.fill(HIST("hPtCandMcRecNonPrompt"), candidate.pt()); + } + } + } + } + } + PROCESS_SWITCH(HfTaskCorrelationD0Hadrons, processMcCandEfficiency, "Process MC for calculating candidate reconstruction efficiency", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 787fff383622f2a14abc72ca9ad007e3db3bc76c Mon Sep 17 00:00:00 2001 From: mcoquet642 <74600025+mcoquet642@users.noreply.github.com> Date: Mon, 10 Feb 2025 10:14:44 +0100 Subject: [PATCH 0123/1650] [PWGDQ] Fixing bug in globalmuon best matches skimming (#9825) --- PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx b/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx index b5b5e15390b..92ea1647e11 100644 --- a/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx +++ b/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx @@ -1076,6 +1076,7 @@ struct TableMakerMC { if constexpr (static_cast(TMuonFillMap)) { fFwdTrackIndexMap.clear(); fFwdTrackFilterMap.clear(); + fBestMatch.clear(); muonBasic.reserve(muons.size()); muonExtra.reserve(muons.size()); muonCov.reserve(muons.size()); From d8d90452c78e6e5ce1d3aa5f0b3c6cb428d9eb3a Mon Sep 17 00:00:00 2001 From: mcoquet642 <74600025+mcoquet642@users.noreply.github.com> Date: Mon, 10 Feb 2025 10:25:40 +0100 Subject: [PATCH 0124/1650] [PWGDQ] Event-mixing for cumulants (#9832) Co-authored-by: ALICE Action Bot --- PWGDQ/Core/VarManager.cxx | 24 ++++++++++++++++ PWGDQ/Core/VarManager.h | 56 +++++++++++++++++++++++++++++++++++++ PWGDQ/Tasks/tableReader.cxx | 27 ++++++++++++++++++ 3 files changed, 107 insertions(+) diff --git a/PWGDQ/Core/VarManager.cxx b/PWGDQ/Core/VarManager.cxx index cd1836753b5..b845fce10ec 100644 --- a/PWGDQ/Core/VarManager.cxx +++ b/PWGDQ/Core/VarManager.cxx @@ -1057,6 +1057,22 @@ void VarManager::SetDefaultVarNames() fgVariableUnits[kDeltaR1] = ""; fgVariableNames[kDeltaR2] = "angular distance prong 2"; fgVariableUnits[kDeltaR2] = ""; + fgVariableNames[kV22m] = "v_{2}(2)_{#mu^{-}}"; + fgVariableUnits[kV22m] = ""; + fgVariableNames[kV24m] = "v_{2}(4)_{#mu^{-}}"; + fgVariableUnits[kV24m] = ""; + fgVariableNames[kV22p] = "v_{2}(2)_{#mu^{+}}"; + fgVariableUnits[kV22p] = ""; + fgVariableNames[kV24p] = "v_{2}(4)_{#mu^{+}}"; + fgVariableUnits[kV24p] = ""; + fgVariableNames[kV22ME] = "v_{2}(2)_{ME}"; + fgVariableUnits[kV22ME] = ""; + fgVariableNames[kV24ME] = "v_{2}(4)_{ME}"; + fgVariableUnits[kV24ME] = ""; + fgVariableNames[kWV22ME] = "W_{2}(2)_{ME}"; + fgVariableUnits[kWV22ME] = ""; + fgVariableNames[kWV24ME] = "W_{2}(4)_{ME}"; + fgVariableUnits[kWV24ME] = ""; // Set the variables short names map. This is needed for dynamic configuration via JSON files fgVarNamesMap["kNothing"] = kNothing; @@ -1661,4 +1677,12 @@ void VarManager::SetDefaultVarNames() fgVarNamesMap["kBitMapIndex"] = kBitMapIndex; fgVarNamesMap["kDeltaMass"] = kDeltaMass; fgVarNamesMap["kDeltaMass_jpsi"] = kDeltaMass_jpsi; + fgVarNamesMap["kV22m"] = kV22m; + fgVarNamesMap["kV24m"] = kV24m; + fgVarNamesMap["kV22p"] = kV22p; + fgVarNamesMap["kV24p"] = kV24p; + fgVarNamesMap["kV22ME"] = kV22ME; + fgVarNamesMap["kV24ME"] = kV24ME; + fgVarNamesMap["kWV22ME"] = kWV22ME; + fgVarNamesMap["kWV24ME"] = kWV24ME; } diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 9e7e1cf5621..7bbef225d40 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -421,6 +421,16 @@ class VarManager : public TObject kTwoR2EP2, // Event plane resolution of event2 for ME technique kNEventWiseVariables, + // Variables for event mixing with cumulant + kV22m, + kV24m, + kV22p, + kV24p, + kV22ME, + kV24ME, + kWV22ME, + kWV24ME, + // Basic track/muon/pair wise variables kX, kY, @@ -1009,6 +1019,8 @@ class VarManager : public TObject static void FillTwoMixEvents(T1 const& event1, T1 const& event2, T2 const& tracks1, T2 const& tracks2, float* values = nullptr); template static void FillTwoMixEventsFlowResoFactor(T const& hs_sp, T const& hs_ep, float* values = nullptr); + template + static void FillTwoMixEventsCumulants(T const& h_v22m, T const& h_v24m, T const& h_v22p, T const& h_v24p, T1 const& t1, T2 const& t2, float* values = nullptr); template static void FillTrack(T const& track, float* values = nullptr); template @@ -1949,6 +1961,42 @@ void VarManager::FillTwoMixEventsFlowResoFactor(T const& hs_sp, T const& hs_ep, } } +template +void VarManager::FillTwoMixEventsCumulants(T const& h_v22m, T const& h_v24m, T const& h_v22p, T const& h_v24p, T1 const& t1, T2 const& t2, float* values) +{ + if (!values) { + values = fgValues; + } + float ptp, ptm, centp, centm; + if (t1.sign() < 0) { + ptm = t1.sign(); + ptp = t2.sign(); + centm = values[kTwoEvCentFT0C1]; + centp = values[kTwoEvCentFT0C2]; + } else { + ptm = t2.sign(); + ptp = t1.sign(); + centm = values[kTwoEvCentFT0C2]; + centp = values[kTwoEvCentFT0C1]; + } + + if (centm >= 0.) { + int idx_v22m = h_v22m->FindBin(centm, ptm); + int idx_v24m = h_v24m->FindBin(centm, ptm); + + values[kV22m] = h_v22m->GetBinContent(idx_v22m); + values[kV24m] = h_v24m->GetBinContent(idx_v24m); + } + + if (centp >= 0.) { + int idx_v22p = h_v22p->FindBin(centp, ptp); + int idx_v24p = h_v24p->FindBin(centp, ptp); + + values[kV22p] = h_v22p->GetBinContent(idx_v22p); + values[kV24p] = h_v24p->GetBinContent(idx_v24p); + } +} + template void VarManager::FillTwoEvents(T const& ev1, T const& ev2, float* values) { @@ -3035,6 +3083,14 @@ void VarManager::FillPairME(T1 const& t1, T2 const& t2, float* values) values[kV2ME_EP] = std::isnan(V2ME_EP) || std::isinf(V2ME_EP) ? 0. : V2ME_EP; values[kWV2ME_EP] = std::isnan(V2ME_EP) || std::isinf(V2ME_EP) ? 0. : 1.0; + // Cumulant part + float V22ME = values[kV22m] * values[kCos2DeltaPhiMu1] + values[kV22p] * values[kCos2DeltaPhiMu2]; + float V24ME = values[kV24m] * values[kCos2DeltaPhiMu1] + values[kV24p] * values[kCos2DeltaPhiMu2]; + values[kV22ME] = (std::isnan(V22ME) || std::isinf(V22ME) || std::isnan(V24ME) || std::isinf(V24ME)) ? 0. : V22ME; + values[kWV22ME] = (std::isnan(V22ME) || std::isinf(V22ME) || std::isnan(V24ME) || std::isinf(V24ME)) ? 0. : 1.0; + values[kV24ME] = (std::isnan(V22ME) || std::isinf(V22ME) || std::isnan(V24ME) || std::isinf(V24ME)) ? 0. : V24ME; + values[kWV24ME] = (std::isnan(V22ME) || std::isinf(V22ME) || std::isnan(V24ME) || std::isinf(V24ME)) ? 0. : 1.0; + if constexpr ((fillMap & ReducedEventQvectorExtra) > 0) { complex Q21(values[kQ2X0A] * values[kS11A], values[kQ2Y0A] * values[kS11A]); complex Q42(values[kQ42XA], values[kQ42YA]); diff --git a/PWGDQ/Tasks/tableReader.cxx b/PWGDQ/Tasks/tableReader.cxx index 24b308808c3..c89f696ed6d 100644 --- a/PWGDQ/Tasks/tableReader.cxx +++ b/PWGDQ/Tasks/tableReader.cxx @@ -645,12 +645,18 @@ struct AnalysisEventMixing { Configurable fConfigAmbiguousHist{"cfgAmbiHist", false, "Enable Ambiguous histograms for time association studies"}; Configurable ccdbPathFlow{"ccdb-path-flow", "Users/c/chizh/FlowResolution", "path to the ccdb object for flow resolution factors"}; Configurable fConfigFlowReso{"cfgFlowReso", false, "Enable loading of flow resolution factors from CCDB"}; + Configurable fConfigSingleMuCumulants{"cfgSingleMuCumulants", false, "Enable loading of flow resolution factors from CCDB"}; + Configurable fConfigAddJSONHistograms{"cfgAddJSONHistograms", "", "Histograms in JSON format"}; Service ccdb; o2::parameters::GRPMagField* grpmag = nullptr; TH1D* ResoFlowSP = nullptr; // Resolution factors for flow analysis, this will be loaded from CCDB TH1D* ResoFlowEP = nullptr; // Resolution factors for flow analysis, this will be loaded from CCDB + TH2D* SingleMuv22m = nullptr; // Single muon v22, loaded from CCDB + TH2D* SingleMuv24m = nullptr; // Single muon v24, loaded from CCDB + TH2D* SingleMuv22p = nullptr; // Single antimuon v22, loaded from CCDB + TH2D* SingleMuv24p = nullptr; // Single antimuon v24, loaded from CCDB int fCurrentRun; // needed to detect if the run changed and trigger update of calibrations etc. Filter filterEventSelected = aod::dqanalysisflags::isEventSelected == 1; @@ -742,6 +748,8 @@ struct AnalysisEventMixing { } DefineHistograms(fHistMan, histNames.Data(), fConfigAddEventMixingHistogram); // define all histograms + // Additional histograms via JSON + dqhistograms::AddHistogramsFromJSON(fHistMan, fConfigAddJSONHistograms.value.c_str()); VarManager::SetUseVars(fHistMan->GetUsedVars()); // provide the list of required variables so that VarManager knows what to fill fOutputList.setObject(fHistMan->GetMainHistogramList()); } @@ -770,6 +778,9 @@ struct AnalysisEventMixing { } if constexpr (TPairType == VarManager::kDecayToMuMu) { twoTrackFilter = static_cast(track1.isMuonSelected()) & static_cast(track2.isMuonSelected()) & fTwoMuonFilterMask; + if (fConfigSingleMuCumulants) { + VarManager::FillTwoMixEventsCumulants(SingleMuv22m, SingleMuv24m, SingleMuv22p, SingleMuv24p, track1, track2); + } } if constexpr (TPairType == VarManager::kElectronMuon) { twoTrackFilter = static_cast(track1.isBarrelSelected()) & static_cast(track2.isMuonSelected()) & fTwoTrackFilterMask; @@ -829,6 +840,20 @@ struct AnalysisEventMixing { LOGF(fatal, "Resolution factor is not available in CCDB at timestamp=%llu", events.begin().timestamp()); } } + if (fConfigSingleMuCumulants) { + TString PathFlow = ccdbPathFlow.value; + TString ccdbPathMuv22m = Form("%s/SingleMuv22m", PathFlow.Data()); + TString ccdbPathMuv24m = Form("%s/SingleMuv24m", PathFlow.Data()); + TString ccdbPathMuv22p = Form("%s/SingleMuv22p", PathFlow.Data()); + TString ccdbPathMuv24p = Form("%s/SingleMuv24p", PathFlow.Data()); + SingleMuv22m = ccdb->getForTimeStamp(ccdbPathMuv22m.Data(), events.begin().timestamp()); + SingleMuv24m = ccdb->getForTimeStamp(ccdbPathMuv24m.Data(), events.begin().timestamp()); + SingleMuv22p = ccdb->getForTimeStamp(ccdbPathMuv22p.Data(), events.begin().timestamp()); + SingleMuv24p = ccdb->getForTimeStamp(ccdbPathMuv24p.Data(), events.begin().timestamp()); + if (SingleMuv22m == nullptr || SingleMuv24m == nullptr || SingleMuv22p == nullptr || SingleMuv24p == nullptr) { + LOGF(fatal, "Single muon cumulants are not available in CCDB at timestamp=%llu", events.begin().timestamp()); + } + } fCurrentRun = events.begin().runNumber(); } @@ -976,6 +1001,7 @@ struct AnalysisSameEventPairing { Configurable fCollisionSystem{"syst", "pp", "Collision system, pp or PbPb"}; Configurable fCenterMassEnergy{"energy", 13600, "Center of mass energy in GeV"}; Configurable fConfigCumulants{"cfgCumulants", false, "If true, fill Cumulants with Weights different than 0"}; + Configurable fConfigAddJSONHistograms{"cfgAddJSONHistograms", "", "Histograms in JSON format"}; // Configurables to create output tree (flat tables or minitree) struct : ConfigurableGroup { @@ -1154,6 +1180,7 @@ struct AnalysisSameEventPairing { VarManager::SetCollisionSystem((TString)fCollisionSystem, fCenterMassEnergy); // set collision system and center of mass energy DefineHistograms(fHistMan, histNames.Data(), fConfigAddSEPHistogram); // define all histograms + dqhistograms::AddHistogramsFromJSON(fHistMan, fConfigAddJSONHistograms.value.c_str()); // ad-hoc histograms via JSON VarManager::SetUseVars(fHistMan->GetUsedVars()); // provide the list of required variables so that VarManager knows what to fill fOutputList.setObject(fHistMan->GetMainHistogramList()); } From 14f3597c5c9188e7d3321f8b010f562ac83090ba Mon Sep 17 00:00:00 2001 From: Chiara De Martin <39315597+ChiaraDeMartin95@users.noreply.github.com> Date: Mon, 10 Feb 2025 11:12:22 +0100 Subject: [PATCH 0125/1650] [PWGLF] Add histos for Pz vs (2phi-Psi) study in cascadeflow task (#9834) Co-authored-by: Chiara De Martin --- .../TableProducer/Strangeness/cascadeflow.cxx | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/PWGLF/TableProducer/Strangeness/cascadeflow.cxx b/PWGLF/TableProducer/Strangeness/cascadeflow.cxx index ac784cdcc5f..bc1c3aa3516 100644 --- a/PWGLF/TableProducer/Strangeness/cascadeflow.cxx +++ b/PWGLF/TableProducer/Strangeness/cascadeflow.cxx @@ -131,7 +131,9 @@ struct cascadeFlow { // Output filling criteria Configurable isFillTree{"isFillTree", 1, ""}; Configurable isFillTHNXi{"isFillTHNXi", 1, ""}; + Configurable isFillTHNXi_PzVsPsi{"isFillTHNXi_PzVsPsi", 1, ""}; Configurable isFillTHNOmega{"isFillTHNOmega", 1, ""}; + Configurable isFillTHNOmega_PzVsPsi{"isFillTHNOmega_PzVsPsi", 1, ""}; // axes ConfigurableAxis axisQVs{"axisQVs", {500, -10.f, 10.f}, "axisQVs"}; @@ -141,15 +143,19 @@ struct cascadeFlow { ConfigurableAxis thnConfigAxisFT0C{"thnConfigAxisFT0C", {8, 0, 80}, "FT0C centrality (%)"}; ConfigurableAxis thnConfigAxisPt{"thnConfigAxisPt", {VARIABLE_WIDTH, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2, 2.25, 2.5, 2.75, 3, 3.5, 4, 5, 6, 8, 10}, "#it{p}_{T} (GeV/#it{c})"}; ConfigurableAxis thnConfigAxisCharge{"thnConfigAxisCharge", {2, 0, 2}, ""}; + ConfigurableAxis thnConfigAxisPsiDiff{"thnConfigAxisPsiDiff", {100, 0, 2 * TMath::Pi()}, ""}; ConfigurableAxis thnConfigAxisMassXi{"thnConfigAxisMassXi", {45, 1.300, 1.345}, ""}; ConfigurableAxis thnConfigAxisMassOmega{"thnConfigAxisMassOmega", {45, 1.655, 1.690}, ""}; ConfigurableAxis thnConfigAxisMassLambda{"thnConfigAxisMassLambda", {60, 1.1, 1.13}, ""}; ConfigurableAxis thnConfigAxisBDTScore{"thnConfigAxisBDTScore", {15, 0.4, 1}, ""}; ConfigurableAxis thnConfigAxisV2{"thnConfigAxiV2", {100, -1., 1.}, ""}; ConfigurableAxis thnConfigAxisPzs2Xi{"thnConfigAxiPzs2Xi", {200, -2.8, 2.8}, ""}; - ConfigurableAxis thnConfigAxisPzs2Omega{"thnConfigAxiPzs2Omega", {200, -65, 65}, ""}; + ConfigurableAxis thnConfigAxisPzs2Omega{"thnConfigAxiPzs2Omega", {200, -70, 70}, ""}; ConfigurableAxis thnConfigAxisPzs2Lambda{"thnConfigAxiPzs2Lambda", {200, -2, 2}, ""}; ConfigurableAxis thnConfigAxisCos2Theta{"thnConfigAxiCos2Theta", {100, 0, 1}, ""}; + ConfigurableAxis thnConfigAxisCosThetaXiAlpha{"thnConfigAxisCosThetaXiAlpha", {200, -2.8, 2.8}, ""}; + ConfigurableAxis thnConfigAxisCosThetaOmegaAlpha{"thnConfigAxisCosThetaOmegaAlpha", {200, -70, 70}, ""}; + ConfigurableAxis thnConfigAxisCosThetaProtonAlpha{"thnConfigAxisCosThetaProtonAlpha", {200, -2, 2}, ""}; // Event selection criteria Configurable isStoreTrueCascOnly{"isStoreTrueCascOnly", 1, ""}; @@ -490,6 +496,7 @@ struct cascadeFlow { const AxisSpec thnAxisFT0C{thnConfigAxisFT0C, "FT0C (%)"}; const AxisSpec thnAxisPt{thnConfigAxisPt, "p_{T}"}; const AxisSpec thnAxisCharge{thnConfigAxisCharge, "Charge"}; + const AxisSpec thnAxisPsiDiff{thnConfigAxisPsiDiff, "2(phi-Psi)"}; const AxisSpec thnAxisMassXi{thnConfigAxisMassXi, "inv. mass (#Lambda #pi) (GeV/#it{c}^{2})"}; const AxisSpec thnAxisMassOmega{thnConfigAxisMassOmega, "inv. mass (#Lambda K) (GeV/#it{c}^{2})"}; const AxisSpec thnAxisMassLambda{thnConfigAxisMassLambda, "inv. mass (p #pi) (GeV/#it{c}^{2})"}; @@ -499,6 +506,9 @@ struct cascadeFlow { const AxisSpec thnAxisPzs2Omega{thnConfigAxisPzs2Omega, "Pzs2Omega"}; const AxisSpec thnAxisPzs2Lambda{thnConfigAxisPzs2Lambda, "Pzs2Lambda"}; const AxisSpec thnAxisCos2Theta{thnConfigAxisCos2Theta, "Cos2Theta"}; + const AxisSpec thnAxisCosThetaXiAlpha{thnConfigAxisCosThetaXiAlpha, "CosThetaXiWithAlpha"}; + const AxisSpec thnAxisCosThetaOmegaAlpha{thnConfigAxisCosThetaOmegaAlpha, "CosThetaOmegaWithAlpha"}; + const AxisSpec thnAxisCosThetaProtonAlpha{thnConfigAxisCosThetaProtonAlpha, "CosThetaProtonWithAlpha"}; if (isFillTHNXi) { histos.add("hXiV2", "THn for v2 of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisV2}); @@ -507,6 +517,12 @@ struct cascadeFlow { histos.add("hXiCos2Theta", "THn for Cos2Theta of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCos2Theta}); histos.add("hXiCos2ThetaFromLambda", "THn for Cos2Theta of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCos2Theta}); } + if (isFillTHNXi_PzVsPsi) { + histos.add("hXiPzVsPsi", "THn for cosTheta of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCosThetaXiAlpha, thnAxisPsiDiff}); + histos.add("hXiPzVsPsiFromLambda", "THn for cosTheta of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCosThetaProtonAlpha, thnAxisPsiDiff}); + histos.add("hXiCos2ThetaVsPsi", "THn for cos2Theta of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCos2Theta, thnAxisPsiDiff}); + histos.add("hXiCos2ThetaVsPsiFromLambda", "THn for cos2Theta of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCos2Theta, thnAxisPsiDiff}); + } if (isFillTHNOmega) { histos.add("hOmegaV2", "THn for v2 of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisV2}); histos.add("hOmegaPzs2", "THn for Pzs2 of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisPzs2Omega}); @@ -514,6 +530,12 @@ struct cascadeFlow { histos.add("hOmegaCos2Theta", "THn for Cos2Theta of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCos2Theta}); histos.add("hOmegaCos2ThetaFromLambda", "THn for Cos2Theta of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCos2Theta}); } + if (isFillTHNOmega_PzVsPsi) { + histos.add("hOmegaPzVsPsi", "THn for cosTheta of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCosThetaOmegaAlpha, thnAxisPsiDiff}); + histos.add("hOmegaPzVsPsiFromLambda", "THn for cosTheta of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCosThetaProtonAlpha, thnAxisPsiDiff}); + histos.add("hOmegaCos2ThetaVsPsi", "THn for cos2Theta of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCos2Theta, thnAxisPsiDiff}); + histos.add("hOmegaCos2ThetaVsPsiFromLambda", "THn for cos2Theta of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCos2Theta, thnAxisPsiDiff}); + } histosMCGen.add("h2DGenXiEta08", "h2DGenXiEta08", HistType::kTH2F, {{100, 0, 100}, {400, 0, 20}}); histosMCGen.add("h2DGenOmegaEta08", "h2DGenOmegaEta08", HistType::kTH2F, {{100, 0, 100}, {400, 0, 20}}); @@ -793,6 +815,10 @@ struct cascadeFlow { double Pzs2LambdaFromCasc = cosThetaStarProton * std::sin(2 * (casc.phi() - PsiT0C)) / cascadev2::AlphaLambda[ChargeIndex]; double Cos2ThetaLambda = cosThetaStarProton * cosThetaStarProton; + double CosThetaXiWithAlpha = cosThetaStarLambda[0] / cascadev2::AlphaXi[ChargeIndex]; + double CosThetaOmegaWithAlpha = cosThetaStarLambda[1] / cascadev2::AlphaOmega[ChargeIndex]; + double CosThetaProtonWithAlpha = cosThetaStarProton / cascadev2::AlphaLambda[ChargeIndex]; + histos.fill(HIST("hv2CEPvsFT0C"), coll.centFT0C(), v2CEP); histos.fill(HIST("hv2CEPvsv2CSP"), v2CSP, v2CEP); histos.fill(HIST("hv1EPvsv1SP"), v1SP, v1EP); @@ -823,6 +849,12 @@ struct cascadeFlow { histos.get(HIST("hXiCos2Theta"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], Cos2ThetaXi); histos.get(HIST("hXiCos2ThetaFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], Cos2ThetaLambda); } + if (isFillTHNXi_PzVsPsi) { + histos.get(HIST("hXiPzVsPsi"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], CosThetaXiWithAlpha, 2 * cascminuspsiT0C); + histos.get(HIST("hXiPzVsPsiFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], CosThetaProtonWithAlpha, 2 * cascminuspsiT0C); + histos.get(HIST("hXiCos2ThetaVsPsi"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], Cos2ThetaXi, 2 * cascminuspsiT0C); + histos.get(HIST("hXiCos2ThetaVsPsiFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], Cos2ThetaLambda, 2 * cascminuspsiT0C); + } if (isFillTHNOmega) { histos.get(HIST("hOmegaV2"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[1], v2CEP); histos.get(HIST("hOmegaPzs2"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[1], Pzs2Omega); @@ -830,6 +862,12 @@ struct cascadeFlow { histos.get(HIST("hOmegaCos2Theta"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[1], Cos2ThetaOmega); histos.get(HIST("hOmegaCos2ThetaFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[1], Cos2ThetaLambda); } + if (isFillTHNOmega_PzVsPsi) { + histos.get(HIST("hOmegaPzVsPsi"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[0], CosThetaOmegaWithAlpha, 2 * cascminuspsiT0C); + histos.get(HIST("hOmegaPzVsPsiFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[0], CosThetaProtonWithAlpha, 2 * cascminuspsiT0C); + histos.get(HIST("hOmegaCos2ThetaVsPsi"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[0], Cos2ThetaOmega, 2 * cascminuspsiT0C); + histos.get(HIST("hOmegaCos2ThetaVsPsiFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[0], Cos2ThetaLambda, 2 * cascminuspsiT0C); + } } if (isSelectedCasc[0] || isSelectedCasc[1]) { From 7fe5a1dafb1eed0917f6f23da44c962211505aa2 Mon Sep 17 00:00:00 2001 From: Gianni Shigeru Setoue Liveraro <81832939+gianniliveraro@users.noreply.github.com> Date: Mon, 10 Feb 2025 07:39:46 -0300 Subject: [PATCH 0126/1650] [PWGLF] Modifications in Sigma0 tasks (#9820) Co-authored-by: ALICE Action Bot --- PWGLF/DataModel/LFSigmaTables.h | 24 +- .../Strangeness/sigma0builder.cxx | 45 +- PWGLF/Tasks/Strangeness/CMakeLists.txt | 2 +- PWGLF/Tasks/Strangeness/sigmaanalysis.cxx | 594 +++++++++++------- 4 files changed, 423 insertions(+), 242 deletions(-) diff --git a/PWGLF/DataModel/LFSigmaTables.h b/PWGLF/DataModel/LFSigmaTables.h index e338d22bd97..08b511bf1ca 100644 --- a/PWGLF/DataModel/LFSigmaTables.h +++ b/PWGLF/DataModel/LFSigmaTables.h @@ -34,6 +34,8 @@ DECLARE_SOA_COLUMN(SigmaMass, sigmaMass, float); DECLARE_SOA_COLUMN(SigmaRapidity, sigmaRapidity, float); DECLARE_SOA_COLUMN(SigmaOPAngle, sigmaOPAngle, float); DECLARE_SOA_COLUMN(SigmaCentrality, sigmaCentrality, float); +DECLARE_SOA_COLUMN(SigmaRunNumber, sigmaRunNumber, int); +DECLARE_SOA_COLUMN(SigmaTimestamp, sigmaTimestamp, uint64_t); } // namespace sigma0Core @@ -42,7 +44,9 @@ DECLARE_SOA_TABLE(Sigma0Cores, "AOD", "SIGMA0CORES", sigma0Core::SigmaMass, sigma0Core::SigmaRapidity, sigma0Core::SigmaOPAngle, - sigma0Core::SigmaCentrality); + sigma0Core::SigmaCentrality, + sigma0Core::SigmaRunNumber, + sigma0Core::SigmaTimestamp); // For Photon extra info namespace sigmaPhotonExtra @@ -75,8 +79,8 @@ DECLARE_SOA_COLUMN(PhotonNegY, photonNegY, float); DECLARE_SOA_COLUMN(PhotonPsiPair, photonPsiPair, float); DECLARE_SOA_COLUMN(PhotonPosITSCls, photonPosITSCls, int); DECLARE_SOA_COLUMN(PhotonNegITSCls, photonNegITSCls, int); -DECLARE_SOA_COLUMN(PhotonPosITSClSize, photonPosITSClSize, uint32_t); -DECLARE_SOA_COLUMN(PhotonNegITSClSize, photonNegITSClSize, uint32_t); +DECLARE_SOA_COLUMN(PhotonPosITSChi2PerNcl, photonPosITSChi2PerNcl, float); +DECLARE_SOA_COLUMN(PhotonNegITSChi2PerNcl, photonNegITSChi2PerNcl, float); DECLARE_SOA_COLUMN(PhotonV0Type, photonV0Type, uint8_t); DECLARE_SOA_COLUMN(GammaBDTScore, gammaBDTScore, float); @@ -111,8 +115,8 @@ DECLARE_SOA_TABLE(SigmaPhotonExtras, "AOD", "SIGMA0PHOTON", sigmaPhotonExtra::PhotonPsiPair, sigmaPhotonExtra::PhotonPosITSCls, sigmaPhotonExtra::PhotonNegITSCls, - sigmaPhotonExtra::PhotonPosITSClSize, - sigmaPhotonExtra::PhotonNegITSClSize, + sigmaPhotonExtra::PhotonPosITSChi2PerNcl, + sigmaPhotonExtra::PhotonNegITSChi2PerNcl, sigmaPhotonExtra::PhotonV0Type, sigmaPhotonExtra::GammaBDTScore); @@ -124,6 +128,7 @@ DECLARE_SOA_COLUMN(LambdaMass, lambdaMass, float); DECLARE_SOA_COLUMN(AntiLambdaMass, antilambdaMass, float); DECLARE_SOA_COLUMN(LambdaQt, lambdaQt, float); DECLARE_SOA_COLUMN(LambdaAlpha, lambdaAlpha, float); +DECLARE_SOA_COLUMN(LambdaLifeTime, lambdaLifeTime, float); DECLARE_SOA_COLUMN(LambdaRadius, lambdaRadius, float); DECLARE_SOA_COLUMN(LambdaCosPA, lambdaCosPA, float); DECLARE_SOA_COLUMN(LambdaDCADau, lambdaDCADau, float); @@ -152,8 +157,8 @@ DECLARE_SOA_COLUMN(LambdaNegPrY, lambdaNegPrY, float); DECLARE_SOA_COLUMN(LambdaNegPiY, lambdaNegPiY, float); DECLARE_SOA_COLUMN(LambdaPosITSCls, lambdaPosITSCls, int); DECLARE_SOA_COLUMN(LambdaNegITSCls, lambdaNegITSCls, int); -DECLARE_SOA_COLUMN(LambdaPosITSClSize, lambdaPosITSClSize, uint32_t); -DECLARE_SOA_COLUMN(LambdaNegITSClSize, lambdaNegITSClSize, uint32_t); +DECLARE_SOA_COLUMN(LambdaPosITSChi2PerNcl, lambdaPosChi2PerNcl, float); +DECLARE_SOA_COLUMN(LambdaNegITSChi2PerNcl, lambdaNegChi2PerNcl, float); DECLARE_SOA_COLUMN(LambdaV0Type, lambdaV0Type, uint8_t); DECLARE_SOA_COLUMN(LambdaBDTScore, lambdaBDTScore, float); DECLARE_SOA_COLUMN(AntiLambdaBDTScore, antilambdaBDTScore, float); @@ -166,6 +171,7 @@ DECLARE_SOA_TABLE(SigmaLambdaExtras, "AOD", "SIGMA0LAMBDA", sigmaLambdaExtra::AntiLambdaMass, sigmaLambdaExtra::LambdaQt, sigmaLambdaExtra::LambdaAlpha, + sigmaLambdaExtra::LambdaLifeTime, sigmaLambdaExtra::LambdaRadius, sigmaLambdaExtra::LambdaCosPA, sigmaLambdaExtra::LambdaDCADau, @@ -194,8 +200,8 @@ DECLARE_SOA_TABLE(SigmaLambdaExtras, "AOD", "SIGMA0LAMBDA", sigmaLambdaExtra::LambdaNegPiY, sigmaLambdaExtra::LambdaPosITSCls, sigmaLambdaExtra::LambdaNegITSCls, - sigmaLambdaExtra::LambdaPosITSClSize, - sigmaLambdaExtra::LambdaNegITSClSize, + sigmaLambdaExtra::LambdaPosITSChi2PerNcl, + sigmaLambdaExtra::LambdaNegITSChi2PerNcl, sigmaLambdaExtra::LambdaV0Type, sigmaLambdaExtra::LambdaBDTScore, sigmaLambdaExtra::AntiLambdaBDTScore); diff --git a/PWGLF/TableProducer/Strangeness/sigma0builder.cxx b/PWGLF/TableProducer/Strangeness/sigma0builder.cxx index d6de3e3d324..f3c391aaba7 100644 --- a/PWGLF/TableProducer/Strangeness/sigma0builder.cxx +++ b/PWGLF/TableProducer/Strangeness/sigma0builder.cxx @@ -33,15 +33,15 @@ #include "ReconstructionDataFormats/Track.h" #include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" -#include "PWGLF/DataModel/LFStrangenessTables.h" -#include "PWGLF/DataModel/LFStrangenessPIDTables.h" -#include "PWGLF/DataModel/LFStrangenessMLTables.h" -#include "PWGLF/DataModel/LFSigmaTables.h" #include "Common/Core/TrackSelection.h" #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Centrality.h" #include "Common/DataModel/PIDResponse.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" +#include "PWGLF/DataModel/LFStrangenessPIDTables.h" +#include "PWGLF/DataModel/LFStrangenessMLTables.h" +#include "PWGLF/DataModel/LFSigmaTables.h" #include "CCDB/BasicCCDBManager.h" #include #include @@ -76,23 +76,24 @@ struct sigma0builder { // Event selection Configurable doPPAnalysis{"doPPAnalysis", true, "if in pp, set to true"}; + struct : ConfigurableGroup { Configurable requireSel8{"requireSel8", true, "require sel8 event selection"}; Configurable requireTriggerTVX{"requireTriggerTVX", true, "require FT0 vertex (acceptable FT0C-FT0A time difference) at trigger level"}; Configurable rejectITSROFBorder{"rejectITSROFBorder", true, "reject events at ITS ROF border"}; Configurable rejectTFBorder{"rejectTFBorder", true, "reject events at TF border"}; - Configurable requireIsVertexITSTPC{"requireIsVertexITSTPC", false, "require events with at least one ITS-TPC track"}; + Configurable requireIsVertexITSTPC{"requireIsVertexITSTPC", true, "require events with at least one ITS-TPC track"}; Configurable requireIsGoodZvtxFT0VsPV{"requireIsGoodZvtxFT0VsPV", true, "require events with PV position along z consistent (within 1 cm) between PV reconstructed using tracks and PV using FT0 A-C time difference"}; Configurable requireIsVertexTOFmatched{"requireIsVertexTOFmatched", false, "require events with at least one of vertex contributors matched to TOF"}; Configurable requireIsVertexTRDmatched{"requireIsVertexTRDmatched", false, "require events with at least one of vertex contributors matched to TRD"}; - Configurable rejectSameBunchPileup{"rejectSameBunchPileup", true, "reject collisions in case of pileup with another collision in the same foundBC"}; + Configurable rejectSameBunchPileup{"rejectSameBunchPileup", false, "reject collisions in case of pileup with another collision in the same foundBC"}; Configurable requireNoCollInTimeRangeStd{"requireNoCollInTimeRangeStd", false, "reject collisions corrupted by the cannibalism, with other collisions within +/- 2 microseconds or mult above a certain threshold in -4 - -2 microseconds"}; Configurable requireNoCollInTimeRangeStrict{"requireNoCollInTimeRangeStrict", false, "reject collisions corrupted by the cannibalism, with other collisions within +/- 10 microseconds"}; Configurable requireNoCollInTimeRangeNarrow{"requireNoCollInTimeRangeNarrow", false, "reject collisions corrupted by the cannibalism, with other collisions within +/- 2 microseconds"}; Configurable requireNoCollInTimeRangeVzDep{"requireNoCollInTimeRangeVzDep", false, "reject collisions corrupted by the cannibalism, with other collisions with pvZ of drifting TPC tracks from past/future collisions within 2.5 cm the current pvZ"}; Configurable requireNoCollInROFStd{"requireNoCollInROFStd", false, "reject collisions corrupted by the cannibalism, with other collisions within the same ITS ROF with mult. above a certain threshold"}; Configurable requireNoCollInROFStrict{"requireNoCollInROFStrict", false, "reject collisions corrupted by the cannibalism, with other collisions within the same ITS ROF"}; - Configurable requireINEL0{"requireINEL0", true, "require INEL>0 event selection"}; + Configurable requireINEL0{"requireINEL0", false, "require INEL>0 event selection"}; Configurable requireINEL1{"requireINEL1", false, "require INEL>1 event selection"}; Configurable maxZVtxPosition{"maxZVtxPosition", 10., "max Z vtx position"}; Configurable useFT0CbasedOccupancy{"useFT0CbasedOccupancy", false, "Use sum of FT0-C amplitudes for estimating occupancy? (if not, use track-based definition)"}; @@ -541,10 +542,10 @@ struct sigma0builder { if ((gamma.v0radius() < PhotonMinRadius) || (gamma.v0radius() > PhotonMaxRadius)) return false; + // Lambda basic selection criteria: histos.fill(HIST("hCandidateBuilderSelection"), 6.); histos.fill(HIST("Selection/hLambdaMass"), lambda.mLambda()); histos.fill(HIST("Selection/hAntiLambdaMass"), lambda.mAntiLambda()); - // Lambda basic selection criteria: if ((TMath::Abs(lambda.mLambda() - 1.115683) > LambdaWindow) && (TMath::Abs(lambda.mAntiLambda() - 1.115683) > LambdaWindow)) return false; histos.fill(HIST("Selection/hLambdaNegEta"), lambda.negativeeta()); @@ -669,8 +670,8 @@ struct sigma0builder { float fPhotonPsiPair = gamma.psipair(); int fPhotonPosITSCls = posTrackGamma.itsNCls(); int fPhotonNegITSCls = negTrackGamma.itsNCls(); - uint32_t fPhotonPosITSClSize = posTrackGamma.itsClusterSizes(); - uint32_t fPhotonNegITSClSize = negTrackGamma.itsClusterSizes(); + float fPhotonPosITSChi2PerNcl = posTrackGamma.itsChi2PerNcl(); + float fPhotonNegITSChi2PerNcl = negTrackGamma.itsChi2PerNcl(); uint8_t fPhotonV0Type = gamma.v0Type(); // Lambda @@ -682,6 +683,7 @@ struct sigma0builder { float fAntiLambdaMass = lambda.mAntiLambda(); float fLambdaQt = lambda.qtarm(); float fLambdaAlpha = lambda.alpha(); + float fLambdaLifeTime = lambda.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * o2::constants::physics::MassLambda0; float fLambdaRadius = lambda.v0radius(); float fLambdaCosPA = lambda.v0cosPA(); float fLambdaDCADau = lambda.dcaV0daughters(); @@ -712,8 +714,8 @@ struct sigma0builder { float fLambdaNegPiY = RecoDecay::y(std::array{lambda.pxneg(), lambda.pyneg(), lambda.pzneg()}, o2::constants::physics::MassPionCharged); int fLambdaPosITSCls = posTrackLambda.itsNCls(); int fLambdaNegITSCls = negTrackLambda.itsNCls(); - uint32_t fLambdaPosITSClSize = posTrackLambda.itsClusterSizes(); - uint32_t fLambdaNegITSClSize = negTrackLambda.itsClusterSizes(); + float fLambdaPosITSChi2PerNcl = posTrackLambda.itsChi2PerNcl(); + float fLambdaNegITSChi2PerNcl = negTrackLambda.itsChi2PerNcl(); uint8_t fLambdaV0Type = lambda.v0Type(); // Sigma0 candidate properties @@ -729,26 +731,28 @@ struct sigma0builder { float fSigmaRap = RecoDecay::y(std::array{gamma.px() + lambda.px(), gamma.py() + lambda.py(), gamma.pz() + lambda.pz()}, o2::constants::physics::MassSigma0); float fSigmaOPAngle = v1.Angle(v2); float fSigmaCentrality = coll.centFT0C(); + float fSigmaTimeStamp = coll.timestamp(); + float fSigmaRunNumber = coll.runNumber(); // Filling TTree for ML analysis - sigma0cores(fSigmapT, fSigmaMass, fSigmaRap, fSigmaOPAngle, fSigmaCentrality); + sigma0cores(fSigmapT, fSigmaMass, fSigmaRap, fSigmaOPAngle, fSigmaCentrality, fSigmaRunNumber, fSigmaTimeStamp); sigmaPhotonExtras(fPhotonPt, fPhotonMass, fPhotonQt, fPhotonAlpha, fPhotonRadius, fPhotonCosPA, fPhotonDCADau, fPhotonDCANegPV, fPhotonDCAPosPV, fPhotonZconv, fPhotonEta, fPhotonY, fPhotonPhi, fPhotonPosTPCNSigmaEl, fPhotonNegTPCNSigmaEl, fPhotonPosTPCNSigmaPi, fPhotonNegTPCNSigmaPi, fPhotonPosTPCCrossedRows, fPhotonNegTPCCrossedRows, fPhotonPosPt, fPhotonNegPt, fPhotonPosEta, fPhotonNegEta, fPhotonPosY, fPhotonNegY, fPhotonPsiPair, - fPhotonPosITSCls, fPhotonNegITSCls, fPhotonPosITSClSize, fPhotonNegITSClSize, + fPhotonPosITSCls, fPhotonNegITSCls, fPhotonPosITSChi2PerNcl, fPhotonNegITSChi2PerNcl, fPhotonV0Type, GammaBDTScore); - sigmaLambdaExtras(fLambdaPt, fLambdaMass, fAntiLambdaMass, fLambdaQt, fLambdaAlpha, + sigmaLambdaExtras(fLambdaPt, fLambdaMass, fAntiLambdaMass, fLambdaQt, fLambdaAlpha, fLambdaLifeTime, fLambdaRadius, fLambdaCosPA, fLambdaDCADau, fLambdaDCANegPV, fLambdaDCAPosPV, fLambdaEta, fLambdaY, fLambdaPhi, fLambdaPosPrTPCNSigma, fLambdaPosPiTPCNSigma, fLambdaNegPrTPCNSigma, fLambdaNegPiTPCNSigma, fLambdaPrTOFNSigma, fLambdaPiTOFNSigma, fALambdaPrTOFNSigma, fALambdaPiTOFNSigma, fLambdaPosTPCCrossedRows, fLambdaNegTPCCrossedRows, fLambdaPosPt, fLambdaNegPt, fLambdaPosEta, fLambdaNegEta, fLambdaPosPrY, fLambdaPosPiY, fLambdaNegPrY, fLambdaNegPiY, - fLambdaPosITSCls, fLambdaNegITSCls, fLambdaPosITSClSize, fLambdaNegITSClSize, + fLambdaPosITSCls, fLambdaNegITSCls, fLambdaPosITSChi2PerNcl, fLambdaNegITSChi2PerNcl, fLambdaV0Type, LambdaBDTScore, AntiLambdaBDTScore); } @@ -812,6 +816,10 @@ struct sigma0builder { if (!lambda.has_v0MCCore()) continue; + if (lambda.v0Type() != 1) { // safeguard to avoid TPC-only photons + continue; + } + auto lambdaMC = lambda.v0MCCore_as>(); if (doPi0QA) // Pi0 QA study @@ -888,13 +896,16 @@ struct sigma0builder { auto V0Table_thisCollision = V0s.sliceBy(perCollisionSTDDerived, collIdx); histos.fill(HIST("hEventCentrality"), coll.centFT0C()); - // V0 table sliced for (auto& gamma : V0Table_thisCollision) { // selecting photons from Sigma0 for (auto& lambda : V0Table_thisCollision) { // selecting lambdas from Sigma0 if (doPi0QA) // Pi0 QA study runPi0QA(gamma, lambda); + if (lambda.v0Type() != 1) { // safeguard to avoid TPC-only photons + continue; + } + // Sigma0 candidate properties std::array pVecPhotons{gamma.px(), gamma.py(), gamma.pz()}; std::array pVecLambda{lambda.px(), lambda.py(), lambda.pz()}; diff --git a/PWGLF/Tasks/Strangeness/CMakeLists.txt b/PWGLF/Tasks/Strangeness/CMakeLists.txt index b10786a302b..cd8b9591a97 100644 --- a/PWGLF/Tasks/Strangeness/CMakeLists.txt +++ b/PWGLF/Tasks/Strangeness/CMakeLists.txt @@ -81,7 +81,7 @@ o2physics_add_dpl_workflow(hstrangecorrelation o2physics_add_dpl_workflow(sigmaanalysis SOURCES sigmaanalysis.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::AnalysisCCDB COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(phik0shortanalysis diff --git a/PWGLF/Tasks/Strangeness/sigmaanalysis.cxx b/PWGLF/Tasks/Strangeness/sigmaanalysis.cxx index 3671866b2c7..22205f54ce8 100644 --- a/PWGLF/Tasks/Strangeness/sigmaanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/sigmaanalysis.cxx @@ -23,7 +23,7 @@ #include #include #include - +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" @@ -32,15 +32,16 @@ #include "ReconstructionDataFormats/Track.h" #include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" -#include "PWGLF/DataModel/LFStrangenessTables.h" -#include "PWGLF/DataModel/LFStrangenessPIDTables.h" -#include "PWGLF/DataModel/LFStrangenessMLTables.h" -#include "PWGLF/DataModel/LFSigmaTables.h" #include "Common/Core/TrackSelection.h" #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Centrality.h" #include "Common/DataModel/PIDResponse.h" +#include "Common/CCDB/ctpRateFetcher.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" +#include "PWGLF/DataModel/LFStrangenessPIDTables.h" +#include "PWGLF/DataModel/LFStrangenessMLTables.h" +#include "PWGLF/DataModel/LFSigmaTables.h" #include "CCDB/BasicCCDBManager.h" #include #include @@ -52,20 +53,28 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; -using std::array; +using std::array; using V0MCSigmas = soa::Join; using V0Sigmas = soa::Join; struct sigmaanalysis { + Service ccdb; + ctpRateFetcher rateFetcher; HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + // Interaction rate selection: + Configurable fGetIR{"fGetIR", false, "Flag to retrieve the IR info."}; + Configurable irSource{"irSource", "T0VTX", "Estimator of the interaction rate (Recommended: pp --> T0VTX, Pb-Pb --> ZNC hadronic)"}; + Configurable minIR{"minIR", -1, "Min Interaction Rate (kHz). Leave -1 if no selection desired."}; + Configurable maxIR{"maxIR", -1, "Max Interaction Rate (kHz). Leave -1 if no selection desired."}; + // Analysis strategy: Configurable fUseMLSel{"fUseMLSel", false, "Flag to use ML selection. If False, the standard selection is applied."}; Configurable fProcessMonteCarlo{"fProcessMonteCarlo", false, "Flag to process MC data."}; Configurable fselLambdaTPCPID{"fselLambdaTPCPID", true, "Flag to select lambda-like candidates using TPC NSigma."}; - Configurable fselLambdaTOFPID{"fselLambdaTOFPID", true, "Flag to select lambda-like candidates using TOF NSigma."}; - Configurable fLambdaTPCTOFQA{"fLambdaTPCTOFQA", false, "Flag to fill histos for Lambda TPC+TOF PID studies."}; + Configurable fselLambdaTOFPID{"fselLambdaTOFPID", false, "Flag to select lambda-like candidates using TOF NSigma."}; + Configurable doMCAssociation{"doMCAssociation", false, "Flag to process only signal candidates. Use only with processMonteCarlo!"}; // For ML Selection Configurable Gamma_MLThreshold{"Gamma_MLThreshold", 0.1, "Decision Threshold value to select gammas"}; @@ -76,6 +85,8 @@ struct sigmaanalysis { //// Lambda standard criteria:: Configurable LambdaMinDCANegToPv{"LambdaMinDCANegToPv", .05, "min DCA Neg To PV (cm)"}; Configurable LambdaMinDCAPosToPv{"LambdaMinDCAPosToPv", .05, "min DCA Pos To PV (cm)"}; + Configurable ALambdaMinDCANegToPv{"ALambdaMinDCANegToPv", .05, "min DCA Neg To PV (cm)"}; + Configurable ALambdaMinDCAPosToPv{"ALambdaMinDCAPosToPv", .05, "min DCA Pos To PV (cm)"}; Configurable LambdaMaxDCAV0Dau{"LambdaMaxDCAV0Dau", 2.5, "Max DCA V0 Daughters (cm)"}; Configurable LambdaMinv0radius{"LambdaMinv0radius", 0.0, "Min V0 radius (cm)"}; Configurable LambdaMaxv0radius{"LambdaMaxv0radius", 40, "Max V0 radius (cm)"}; @@ -84,18 +95,24 @@ struct sigmaanalysis { Configurable LambdaMinAlpha{"LambdaMinAlpha", 0.25, "Min lambda alpha absolute value (AP plot)"}; Configurable LambdaMaxAlpha{"LambdaMaxAlpha", 1.0, "Max lambda alpha absolute value (AP plot)"}; Configurable LambdaMinv0cospa{"LambdaMinv0cospa", 0.95, "Min V0 CosPA"}; + Configurable LambdaMaxLifeTime{"LambdaMaxLifeTime", 30, "Max lifetime"}; Configurable LambdaWindow{"LambdaWindow", 0.015, "Mass window around expected (in GeV/c2)"}; Configurable LambdaMaxRap{"LambdaMaxRap", 0.8, "Max lambda rapidity"}; Configurable LambdaMaxDauEta{"LambdaMaxDauEta", 0.8, "Max pseudorapidity of daughter tracks"}; Configurable LambdaMaxTPCNSigmas{"LambdaMaxTPCNSigmas", 1e+9, "Max TPC NSigmas for daughters"}; - Configurable LambdaMaxTOFNSigmas{"LambdaMaxTOFNSigmas", 1e+9, "Max TOF NSigmas for daughters"}; - Configurable LambdaMinTPCCrossedRows{"LambdaMinTPCCrossedRows", 50, "Min daughter TPC Crossed Rows"}; + Configurable LambdaPrMaxTOFNSigmas{"LambdaPrMaxTOFNSigmas", 1e+9, "Max TOF NSigmas for daughters"}; + Configurable LambdaPiMaxTOFNSigmas{"LambdaPiMaxTOFNSigmas", 1e+9, "Max TOF NSigmas for daughters"}; + Configurable LambdaMinTPCCrossedRows{"LambdaMinTPCCrossedRows", 50, "Min daughter TPC Crossed Rows"}; + Configurable LambdaMinITSclusters{"LambdaMinITSclusters", 1, "minimum ITS clusters"}; + Configurable LambdaRejectPosITSafterburner{"LambdaRejectPosITSafterburner", false, "reject positive track formed out of afterburner ITS tracks"}; + Configurable LambdaRejectNegITSafterburner{"LambdaRejectNegITSafterburner", false, "reject negative track formed out of afterburner ITS tracks"}; //// Photon standard criteria: + Configurable Photonv0TypeSel{"Photonv0TypeSel", 7, "select on a certain V0 type (leave negative if no selection desired)"}; Configurable PhotonDauMinPt{"PhotonDauMinPt", 0.0, "Min daughter pT (GeV/c)"}; Configurable PhotonMinDCADauToPv{"PhotonMinDCADauToPv", 0.0, "Min DCA daughter To PV (cm)"}; Configurable PhotonMaxDCAV0Dau{"PhotonMaxDCAV0Dau", 3.5, "Max DCA V0 Daughters (cm)"}; - Configurable PhotonMinTPCCrossedRows{"PhotonMinTPCCrossedRows", 0, "Min daughter TPC Crossed Rows"}; + Configurable PhotonMinTPCCrossedRows{"PhotonMinTPCCrossedRows", 30, "Min daughter TPC Crossed Rows"}; Configurable PhotonMinTPCNSigmas{"PhotonMinTPCNSigmas", -7, "Min TPC NSigmas for daughters"}; Configurable PhotonMaxTPCNSigmas{"PhotonMaxTPCNSigmas", 7, "Max TPC NSigmas for daughters"}; Configurable PiMaxTPCNSigmas{"PiMaxTPCNSigmas", 1, "Max TPC NSigmas for pi rejection"}; @@ -122,6 +139,7 @@ struct sigmaanalysis { ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.2f, 2.4f, 2.6f, 2.8f, 3.0f, 3.2f, 3.4f, 3.6f, 3.8f, 4.0f, 4.4f, 4.8f, 5.2f, 5.6f, 6.0f, 6.5f, 7.0f, 7.5f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 17.0f, 19.0f, 21.0f, 23.0f, 25.0f, 30.0f, 35.0f, 40.0f, 50.0f}, "p_{T} (GeV/c)"}; ConfigurableAxis axisDeltaPt{"axisDeltaPt", {100, 0.0, +1.0}, "#Delta(p_{T})"}; ConfigurableAxis axisRapidity{"axisRapidity", {100, -2.0f, 2.0f}, "Rapidity"}; + ConfigurableAxis axisIRBinning{"axisIRBinning", {5000, 0, 1500}, "Binning for the interaction rate (kHz)"}; // Invariant Mass ConfigurableAxis axisSigmaMass{"axisSigmaMass", {1000, 1.10f, 1.30f}, "M_{#Sigma^{0}} (GeV/c^{2})"}; @@ -132,8 +150,13 @@ struct sigmaanalysis { ConfigurableAxis axisAPAlpha{"axisAPAlpha", {220, -1.1f, 1.1f}, "V0 AP alpha"}; ConfigurableAxis axisAPQt{"axisAPQt", {220, 0.0f, 0.5f}, "V0 AP alpha"}; - // Track quality axes + // Track quality, PID and other axes ConfigurableAxis axisTPCrows{"axisTPCrows", {160, 0.0f, 160.0f}, "N TPC rows"}; + ConfigurableAxis axisNCls{"axisNCls", {8, -0.5, 7.5}, "NCls"}; + ConfigurableAxis axisChi2PerNcl{"axisChi2PerNcl", {80, -40, 40}, "Chi2 Per Ncl"}; + ConfigurableAxis axisTPCNSigma{"axisTPCNSigma", {120, -30, 30}, "TPC NSigma"}; + ConfigurableAxis axisTOFNSigma{"axisTOFNSigma", {120, -30, 30}, "TOF NSigma"}; + ConfigurableAxis axisLifetime{"axisLifetime", {200, 0, 200}, "Chi2 Per Ncl"}; // topological variable QA axes ConfigurableAxis axisRadius{"axisRadius", {240, 0.0f, 120.0f}, "V0 radius (cm)"}; @@ -141,14 +164,21 @@ struct sigmaanalysis { ConfigurableAxis axisDCAdau{"axisDCAdau", {50, 0.0f, 5.0f}, "DCA (cm)"}; ConfigurableAxis axisCosPA{"axisCosPA", {200, 0.5f, 1.0f}, "Cosine of pointing angle"}; ConfigurableAxis axisPsiPair{"axisPsiPair", {500, -5.0f, 5.0f}, "Psipair for photons"}; - ConfigurableAxis axisCandSel{"axisCandSel", {28, -0.5f, +27.5f}, "Candidate Selection"}; + ConfigurableAxis axisCandSel{"axisCandSel", {31, 0.5f, +31.5f}, "Candidate Selection"}; // ML ConfigurableAxis MLProb{"MLOutput", {100, 0.0f, 1.0f}, ""}; int nSigmaCandidates = 0; void init(InitContext const&) { + // setting CCDB service + ccdb->setURL("http://alice-ccdb.cern.ch"); + ccdb->setCaching(true); + ccdb->setFatalWhenNull(false); + // All candidates received + histos.add("GeneralQA/hInteractionRate", "hInteractionRate", kTH1F, {axisIRBinning}); + histos.add("GeneralQA/hCentralityVsInteractionRate", "hCentralityVsInteractionRate", kTH2F, {axisCentrality, axisIRBinning}); histos.add("GeneralQA/h2dArmenterosBeforeSel", "h2dArmenterosBeforeSel", {HistType::kTH2F, {axisAPAlpha, axisAPQt}}); histos.add("GeneralQA/h2dArmenterosAfterSel", "h2dArmenterosAfterSel", {HistType::kTH2F, {axisAPAlpha, axisAPQt}}); histos.add("GeneralQA/hMassSigma0BeforeSel", "hMassSigma0BeforeSel", kTH1F, {axisSigmaMass}); @@ -156,34 +186,38 @@ struct sigmaanalysis { // Candidates Counters histos.add("GeneralQA/hCandidateAnalysisSelection", "hCandidateAnalysisSelection", kTH1F, {axisCandSel}); histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(1, "No Sel"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(2, "Photon Mass Cut"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(3, "Photon DauPt Cut"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(4, "Photon DCAToPV Cut"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(5, "Photon DCADau Cut"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(6, "Photon TPCCrossedRows Cut"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(7, "Photon TPCNSigmaEl Cut"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(8, "Photon TPCNSigmaPi Cut"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(9, "Photon Pt Cut"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(10, "Photon Y/Eta Cuts"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(11, "Photon Radius Cut"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(12, "Photon RZ line Cut"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(13, "Photon QT Cut"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(14, "Photon Alpha Cut"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(15, "Photon CosPA Cut"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(16, "Photon PsiPair Cut"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(17, "Lambda Mass Cut"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(18, "Lambda DCAToPV Cut"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(19, "Lambda Radius Cut"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(20, "Lambda DCADau Cut"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(21, "Lambda QT Cut"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(22, "Lambda Alpha Cut"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(23, "Lambda CosPA Cut"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(24, "Lambda Y/Eta Cuts"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(25, "Lambda TPCCrossedRows Cut"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(26, "Sigma Y Cut"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(27, "Lambda/ALambda PID Cut"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(2, "Photon V0Type"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(3, "Photon Mass"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(4, "Photon DauPt"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(5, "Photon DCAToPV"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(6, "Photon DCADau"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(7, "Photon TPCCrossedRows"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(8, "Photon TPCNSigmaEl"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(9, "Photon TPCNSigmaPi"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(10, "Photon Pt"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(11, "Photon Y/Eta"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(12, "Photon Radius"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(13, "Photon RZ line"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(14, "Photon QT"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(15, "Photon Alpha"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(16, "Photon CosPA"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(17, "Photon PsiPair"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(18, "Lambda Radius"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(19, "Lambda DCADau"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(20, "Lambda QT"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(21, "Lambda Alpha"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(22, "Lambda CosPA"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(23, "Lambda Y/Eta"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(24, "Lambda TPCCrossedRows"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(25, "Lambda ITSNCls"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(26, "Lambda Lifetime"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(27, "Lambda/ALambda PID"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(28, "Lambda/ALambda DCAToPV"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(29, "Lambda/ALambda Mass"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(30, "Sigma Y"); // Photon Selection QA histos + histos.add("GeneralQA/hPhotonV0Type", "hPhotonV0Type", kTH1F, {{8, 0.5f, 8.5f}}); histos.add("GeneralQA/hPhotonMass", "hPhotonMass", kTH1F, {axisPhotonMass}); histos.add("GeneralQA/hPhotonNegpT", "hPhotonNegpT", kTH1F, {axisPt}); histos.add("GeneralQA/hPhotonPospT", "hPhotonPospT", kTH1F, {axisPt}); @@ -210,10 +244,6 @@ struct sigmaanalysis { histos.add("GeneralQA/hPhotonPsiPair", "hPhotonPsiPair", kTH1F, {axisPsiPair}); // Lambda Selection QA histos - histos.add("GeneralQA/hLambdaMass", "hLambdaMass", kTH1F, {axisLambdaMass}); - histos.add("GeneralQA/hAntiLambdaMass", "hAntiLambdaMass", kTH1F, {axisLambdaMass}); - histos.add("GeneralQA/hLambdaDCANegToPV", "hLambdaDCANegToPV", kTH1F, {axisDCAtoPV}); - histos.add("GeneralQA/hLambdaDCAPosToPV", "hLambdaDCAPosToPV", kTH1F, {axisDCAtoPV}); histos.add("GeneralQA/hLambdaRadius", "hLambdaRadius", kTH1F, {axisRadius}); histos.add("GeneralQA/hLambdaDCADau", "hLambdaDCADau", kTH1F, {axisDCAdau}); histos.add("GeneralQA/h2dLambdaArmenteros", "h2dLambdaArmenteros", {HistType::kTH2F, {axisAPAlpha, axisAPQt}}); @@ -223,17 +253,61 @@ struct sigmaanalysis { histos.add("GeneralQA/hLambdaNegEta", "hLambdaNegEta", kTH1F, {axisRapidity}); histos.add("GeneralQA/hLambdaPosTPCCR", "hLambdaPosTPCCR", kTH1F, {axisTPCrows}); histos.add("GeneralQA/hLambdaNegTPCCR", "hLambdaNegTPCCR", kTH1F, {axisTPCrows}); - histos.add("GeneralQA/hSigmaY", "hSigmaY", kTH1F, {axisRapidity}); - histos.add("GeneralQA/hSigmaOPAngle", "hSigmaOPAngle", kTH1F, {{140, 0.0f, +7.0f}}); - histos.add("GeneralQA/h2dTPCvsTOFNSigma_LambdaPr", "h2dTPCvsTOFNSigma_LambdaPr", {HistType::kTH2F, {{120, -30, 30}, {120, -30, 30}}}); - histos.add("GeneralQA/h2dTPCvsTOFNSigma_LambdaPi", "h2dTPCvsTOFNSigma_LambdaPi", {HistType::kTH2F, {{120, -30, 30}, {120, -30, 30}}}); - histos.add("GeneralQA/h2dTPCvsTOFNSigma_ALambdaPr", "h2dTPCvsTOFNSigma_ALambdaPr", {HistType::kTH2F, {{120, -30, 30}, {120, -30, 30}}}); - histos.add("GeneralQA/h2dTPCvsTOFNSigma_ALambdaPi", "h2dTPCvsTOFNSigma_ALambdaPi", {HistType::kTH2F, {{120, -30, 30}, {120, -30, 30}}}); + histos.add("GeneralQA/hLambdaPosITSCls", "hLambdaPosITSCls", kTH1F, {axisNCls}); + histos.add("GeneralQA/hLambdaNegITSCls", "hLambdaNegITSCls", kTH1F, {axisNCls}); + histos.add("GeneralQA/hLambdaPosChi2PerNc", "hLambdaPosChi2PerNc", kTH1F, {axisChi2PerNcl}); + histos.add("GeneralQA/hLambdaNegChi2PerNc", "hLambdaNegChi2PerNc", kTH1F, {axisChi2PerNcl}); + histos.add("GeneralQA/hLambdaLifeTime", "hLambdaLifeTime", kTH1F, {axisLifetime}); + + histos.add("GeneralQA/h2dTPCvsTOFNSigma_LambdaPr", "h2dTPCvsTOFNSigma_LambdaPr", {HistType::kTH2F, {axisTPCNSigma, axisTOFNSigma}}); + histos.add("GeneralQA/h2dTPCvsTOFNSigma_LambdaPi", "h2dTPCvsTOFNSigma_LambdaPi", {HistType::kTH2F, {axisTPCNSigma, axisTOFNSigma}}); + histos.add("GeneralQA/hLambdaDCANegToPV", "hLambdaDCANegToPV", kTH1F, {axisDCAtoPV}); + histos.add("GeneralQA/hLambdaDCAPosToPV", "hLambdaDCAPosToPV", kTH1F, {axisDCAtoPV}); + histos.add("GeneralQA/hLambdaMass", "hLambdaMass", kTH1F, {axisLambdaMass}); + histos.add("GeneralQA/h2dTPCvsTOFNSigma_ALambdaPr", "h2dTPCvsTOFNSigma_ALambdaPr", {HistType::kTH2F, {axisTPCNSigma, axisTOFNSigma}}); + histos.add("GeneralQA/h2dTPCvsTOFNSigma_ALambdaPi", "h2dTPCvsTOFNSigma_ALambdaPi", {HistType::kTH2F, {axisTPCNSigma, axisTOFNSigma}}); + histos.add("GeneralQA/hALambdaDCANegToPV", "hALambdaDCANegToPV", kTH1F, {axisDCAtoPV}); + histos.add("GeneralQA/hALambdaDCAPosToPV", "hALambdaDCAPosToPV", kTH1F, {axisDCAtoPV}); + histos.add("GeneralQA/hAntiLambdaMass", "hAntiLambdaMass", kTH1F, {axisLambdaMass}); histos.add("GeneralQA/hPhotonMassSelected", "hPhotonMassSelected", kTH1F, {axisPhotonMass}); histos.add("GeneralQA/hLambdaMassSelected", "hLambdaMassSelected", kTH1F, {axisLambdaMass}); histos.add("GeneralQA/hAntiLambdaMassSelected", "hAntiLambdaMassSelected", kTH1F, {axisLambdaMass}); + histos.add("GeneralQA/hSigmaY", "hSigmaY", kTH1F, {axisRapidity}); + histos.add("GeneralQA/hSigmaOPAngle", "hSigmaOPAngle", kTH1F, {{140, 0.0f, +7.0f}}); + + // Specific sigma0 QA + histos.add("SigmaMassQA/h2dPhotonV0Type", "h2dPhotonV0Type", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaMassQA/h2dPhotonMass", "h2dPhotonMass", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaMassQA/h2dPhotonDaupT", "h2dPhotonDaupT", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaMassQA/h2dPhotonDCADauToPV", "h2dPhotonDCADauToPV", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaMassQA/h2dPhotonDCADau", "h2dPhotonDCADau", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaMassQA/h2dPhotonDauTPCCR", "h2dPhotonDauTPCCR", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaMassQA/h2dPhotonTPCNSigmaEl", "h2dPhotonTPCNSigmaEl", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaMassQA/h2dPhotonpT", "h2dPhotonpT", {HistType::kTH2F, {axisPt, axisSigmaMass}}); // + histos.add("SigmaMassQA/h2dPhotonY", "h2dPhotonY", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaMassQA/h2dPhotonRadius", "h2dPhotonRadius", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaMassQA/h2dRZCut", "h2dRZCut", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaMassQA/h2dPhotonArmenteros", "h2dPhotonArmenteros", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaMassQA/h2dPhotonCosPA", "h2dPhotonCosPA", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaMassQA/h2dPhotonPsiPair", "h2dPhotonPsiPair", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaMassQA/h2dLambdaRadius", "h2dLambdaRadius", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaMassQA/h2dLambdaDCADau", "h2dLambdaDCADau", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaMassQA/h2dLambdaArmenteros", "h2dLambdaArmenteros", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaMassQA/h2dLambdaCosPA", "h2dLambdaCosPA", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaMassQA/h2dLambdaY", "h2dLambdaY", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaMassQA/h2dLambdaDauTPCCR", "h2dLambdaDauTPCCR", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaMassQA/h2dLambdaDauITSCls", "h2dLambdaDauITSCls", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaMassQA/h2dLambdaLifeTime", "h2dLambdaLifeTime", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaMassQA/h2dTPCvsTOFNSigma_Lambda", "h2dTPCvsTOFNSigma_Lambda", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaMassQA/h2dLambdaDCADauToPV", "h2dLambdaDCADauToPV", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaMassQA/h2dLambdaMass", "h2dLambdaMass", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaMassQA/h2dTPCvsTOFNSigma_ALambda", "h2dTPCvsTOFNSigma_ALambda", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaMassQA/h2dALambdaDCADauToPV", "h2dALambdaDCADauToPV", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaMassQA/h2dAntiLambdaMass", "h2dAntiLambdaMass", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaMassQA/h2dSigmaY", "h2dSigmaY", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + // For Signal Extraction // Sigma0 @@ -283,14 +357,17 @@ struct sigmaanalysis { // For efficiency/Purity studies // Before any selection histos.add("MC/hPtTrueLambda_BeforeSel", "hPtTrueLambda_BeforeSel", kTH1F, {axisPt}); // Signal only + histos.add("MC/hPtTrueAntiLambda_BeforeSel", "hPtTrueAntiLambda_BeforeSel", kTH1F, {axisPt}); // Signal only histos.add("MC/hPtTrueGamma_BeforeSel", "hPtTrueGamma_BeforeSel", kTH1F, {axisPt}); // Signal only histos.add("MC/hPtTrueSigma_BeforeSel", "hPtTrueSigma_BeforeSel", kTH1F, {axisPt}); // Signal only + histos.add("MC/hPtTrueAntiSigma_BeforeSel", "hPtTrueAntiSigma_BeforeSel", kTH1F, {axisPt}); // Signal only histos.add("MC/hPtLambdaCand_BeforeSel", "hPtLambdaCand_BeforeSel", kTH1F, {axisPt}); // Bkg + Signal histos.add("MC/hPtGammaCand_BeforeSel", "hPtGammaCand_BeforeSel", kTH1F, {axisPt}); // Bkg + Signal histos.add("MC/hPtSigmaCand_BeforeSel", "hPtGammaCand_BeforeSel", kTH1F, {axisPt}); // Bkg + Signal // After analysis selections histos.add("MC/hPtTrueLambda_AfterSel", "hPtTrueLambda_AfterSel", kTH1F, {axisPt}); // Signal only + histos.add("MC/hPtTrueAntiLambda_AfterSel", "hPtTrueAntiLambda_AfterSel", kTH1F, {axisPt}); // Signal only histos.add("MC/hPtTrueGamma_AfterSel", "hPtTrueGamma_AfterSel", kTH1F, {axisPt}); // Signal only histos.add("MC/hPtTrueSigma_AfterSel", "hPtTrueSigma_AfterSel", kTH1F, {axisPt}); // Signal only @@ -299,10 +376,12 @@ struct sigmaanalysis { histos.add("MC/hPtSigmaCand_AfterSel", "hPtSigmaCand_AfterSel", kTH1F, {axisPt}); // TPC vs TOF N Sigmas distributions - histos.add("MC/h3dTPCvsTOFNSigma_LambdaPr", "h3dTPCvsTOFNSigma_LambdaPr", kTH3F, {{120, -30, 30}, {120, -30, 30}, axisPt}); - histos.add("MC/h3dTPCvsTOFNSigma_LambdaPi", "h3dTPCvsTOFNSigma_LambdaPi", kTH3F, {{120, -30, 30}, {120, -30, 30}, axisPt}); - histos.add("MC/h3dTPCvsTOFNSigma_TrueLambdaPr", "h3dTPCvsTOFNSigma_TrueLambdaPr", kTH3F, {{120, -30, 30}, {120, -30, 30}, axisPt}); - histos.add("MC/h3dTPCvsTOFNSigma_TrueLambdaPi", "h3dTPCvsTOFNSigma_TrueLambdaPi", kTH3F, {{120, -30, 30}, {120, -30, 30}, axisPt}); + histos.add("MC/h3dTPCvsTOFNSigma_LambdaPr", "h3dTPCvsTOFNSigma_LambdaPr", kTH3F, {axisTPCNSigma, axisTOFNSigma, axisPt}); + histos.add("MC/h3dTPCvsTOFNSigma_LambdaPi", "h3dTPCvsTOFNSigma_LambdaPi", kTH3F, {axisTPCNSigma, axisTOFNSigma, axisPt}); + histos.add("MC/h3dTPCvsTOFNSigma_TrueLambdaPr", "h3dTPCvsTOFNSigma_TrueLambdaPr", kTH3F, {axisTPCNSigma, axisTOFNSigma, axisPt}); + histos.add("MC/h3dTPCvsTOFNSigma_TrueLambdaPi", "h3dTPCvsTOFNSigma_TrueLambdaPi", kTH3F, {axisTPCNSigma, axisTOFNSigma, axisPt}); + histos.add("MC/h3dTPCvsTOFNSigma_TrueALambdaPr", "h3dTPCvsTOFNSigma_TrueALambdaPr", kTH3F, {axisTPCNSigma, axisTOFNSigma, axisPt}); + histos.add("MC/h3dTPCvsTOFNSigma_TrueALambdaPi", "h3dTPCvsTOFNSigma_TrueALambdaPi", kTH3F, {axisTPCNSigma, axisTOFNSigma, axisPt}); // QA of PID selections: //// TPC PID @@ -319,6 +398,7 @@ struct sigmaanalysis { // pT Resolution: histos.add("MC/h3dLambdaPtResolution", "h3dLambdaPtResolution", kTH3F, {axisPt, axisDeltaPt, axisLambdaMass}); + histos.add("MC/h3dAntiLambdaPtResolution", "h3dAntiLambdaPtResolution", kTH3F, {axisPt, axisDeltaPt, axisLambdaMass}); histos.add("MC/h3dGammaPtResolution", "h3dGammaPtResolution", kTH3F, {axisPt, axisDeltaPt, axisPhotonMass}); histos.add("MC/h3dSigma0PtResolution", "h3dSigma0PtResolution", kTH3F, {axisPt, axisDeltaPt, axisSigmaMass}); } @@ -326,7 +406,7 @@ struct sigmaanalysis { // Apply selections in sigma candidates template - bool processSigmaCandidate(TV0Object const& cand) + bool processSigmaCandidate(TV0Object const& cand, bool isLambdalike) { if (fUseMLSel) { if ((cand.gammaBDTScore() == -1) || (cand.lambdaBDTScore() == -1) || (cand.antilambdaBDTScore() == -1)) { @@ -345,216 +425,290 @@ struct sigmaanalysis { return false; } else { + // Photon Selections histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 1.); + histos.fill(HIST("GeneralQA/hPhotonV0Type"), cand.photonV0Type()); + if (cand.photonV0Type() != Photonv0TypeSel && Photonv0TypeSel > -1) + return false; + histos.fill(HIST("SigmaMassQA/h2dPhotonV0Type"), cand.sigmapT(), cand.sigmaMass()); histos.fill(HIST("GeneralQA/hPhotonMass"), cand.photonMass()); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 2.); if (TMath::Abs(cand.photonMass()) > PhotonMaxMass) return false; + histos.fill(HIST("SigmaMassQA/h2dPhotonMass"), cand.sigmapT(), cand.sigmaMass()); histos.fill(HIST("GeneralQA/hPhotonNegpT"), cand.photonNegPt()); histos.fill(HIST("GeneralQA/hPhotonPospT"), cand.photonPosPt()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 2.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 3.); if ((cand.photonPosPt() < PhotonDauMinPt) || (cand.photonNegPt() < PhotonDauMinPt)) return false; + histos.fill(HIST("SigmaMassQA/h2dPhotonDaupT"), cand.sigmapT(), cand.sigmaMass()); histos.fill(HIST("GeneralQA/hPhotonDCANegToPV"), cand.photonDCANegPV()); histos.fill(HIST("GeneralQA/hPhotonDCAPosToPV"), cand.photonDCAPosPV()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 3.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 4.); if ((TMath::Abs(cand.photonDCAPosPV()) < PhotonMinDCADauToPv) || (TMath::Abs(cand.photonDCANegPV()) < PhotonMinDCADauToPv)) return false; - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 4.); + histos.fill(HIST("SigmaMassQA/h2dPhotonDCADauToPV"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 5.); histos.fill(HIST("GeneralQA/hPhotonDCADau"), cand.photonDCADau()); if (TMath::Abs(cand.photonDCADau()) > PhotonMaxDCAV0Dau) return false; + histos.fill(HIST("SigmaMassQA/h2dPhotonDCADau"), cand.sigmapT(), cand.sigmaMass()); histos.fill(HIST("GeneralQA/hPhotonPosTPCCR"), cand.photonPosTPCCrossedRows()); histos.fill(HIST("GeneralQA/hPhotonNegTPCCR"), cand.photonNegTPCCrossedRows()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 5.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 6.); if ((cand.photonPosTPCCrossedRows() < PhotonMinTPCCrossedRows) || (cand.photonNegTPCCrossedRows() < PhotonMinTPCCrossedRows)) return false; + histos.fill(HIST("SigmaMassQA/h2dPhotonDauTPCCR"), cand.sigmapT(), cand.sigmaMass()); histos.fill(HIST("GeneralQA/h2dPhotonPosTPCNSigmaEl"), cand.photonPosPt(), cand.photonPosTPCNSigmaEl()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 6.); - if ((cand.photonPosTPCNSigmaEl() != -999.f) && ((cand.photonPosTPCNSigmaEl() < PhotonMinTPCNSigmas) || (cand.photonPosTPCNSigmaEl() > PhotonMaxTPCNSigmas))) + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 7.); + if (((cand.photonPosTPCNSigmaEl() < PhotonMinTPCNSigmas) || (cand.photonPosTPCNSigmaEl() > PhotonMaxTPCNSigmas))) return false; histos.fill(HIST("GeneralQA/h2dPhotonNegTPCNSigmaEl"), cand.photonNegPt(), cand.photonNegTPCNSigmaEl()); - if ((cand.photonNegTPCNSigmaEl() != -999.f) && ((cand.photonNegTPCNSigmaEl() < PhotonMinTPCNSigmas) || (cand.photonNegTPCNSigmaEl() > PhotonMaxTPCNSigmas))) + if (((cand.photonNegTPCNSigmaEl() < PhotonMinTPCNSigmas) || (cand.photonNegTPCNSigmaEl() > PhotonMaxTPCNSigmas))) return false; + histos.fill(HIST("SigmaMassQA/h2dPhotonTPCNSigmaEl"), cand.sigmapT(), cand.sigmaMass()); histos.fill(HIST("GeneralQA/h2dPhotonPosTPCNSigmaPi"), cand.photonPosPt(), cand.photonPosTPCNSigmaPi()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 7.); - if ((cand.photonPosTPCNSigmaPi() != -999.f) && ((TMath::Abs(cand.photonPosTPCNSigmaPi()) < PiMaxTPCNSigmas) && cand.photonPosPt() <= piMaxpT)) + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 8.); + if (((TMath::Abs(cand.photonPosTPCNSigmaPi()) < PiMaxTPCNSigmas) && cand.photonPosPt() <= piMaxpT)) return false; histos.fill(HIST("GeneralQA/h2dPhotonNegTPCNSigmaPi"), cand.photonNegPt(), cand.photonNegTPCNSigmaPi()); - if ((cand.photonNegTPCNSigmaPi() != -999.f) && ((TMath::Abs(cand.photonNegTPCNSigmaPi()) < PiMaxTPCNSigmas) && cand.photonNegPt() <= piMaxpT)) + if (((TMath::Abs(cand.photonNegTPCNSigmaPi()) < PiMaxTPCNSigmas) && cand.photonNegPt() <= piMaxpT)) return false; histos.fill(HIST("GeneralQA/hPhotonpT"), cand.photonPt()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 8.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 9.); if ((cand.photonPt() < PhotonMinPt) || (cand.photonPt() > PhotonMaxPt)) return false; + histos.fill(HIST("SigmaMassQA/h2dPhotonpT"), cand.sigmapT(), cand.sigmaMass()); histos.fill(HIST("GeneralQA/hPhotonY"), cand.photonY()); histos.fill(HIST("GeneralQA/hPhotonPosEta"), cand.photonPosEta()); histos.fill(HIST("GeneralQA/hPhotonNegEta"), cand.photonNegEta()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 9.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 10.); if ((TMath::Abs(cand.photonY()) > PhotonMaxRap) || (TMath::Abs(cand.photonPosEta()) > PhotonMaxDauEta) || (TMath::Abs(cand.photonNegEta()) > PhotonMaxDauEta)) return false; + histos.fill(HIST("SigmaMassQA/h2dPhotonY"), cand.sigmapT(), cand.sigmaMass()); histos.fill(HIST("GeneralQA/hPhotonRadius"), cand.photonRadius()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 10.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 11.); if ((cand.photonRadius() < PhotonMinRadius) || (cand.photonRadius() > PhotonMaxRadius)) return false; float photonRZLineCut = TMath::Abs(cand.photonZconv()) * TMath::Tan(2 * TMath::ATan(TMath::Exp(-PhotonMaxDauEta))) - PhotonLineCutZ0; + histos.fill(HIST("SigmaMassQA/h2dPhotonRadius"), cand.sigmapT(), cand.sigmaMass()); histos.fill(HIST("GeneralQA/hPhotonZ"), cand.photonZconv()); histos.fill(HIST("GeneralQA/h2dRZCut"), cand.photonRadius(), photonRZLineCut); - histos.fill(HIST("GeneralQA/h2dRZPlane"), cand.photonRadius(), cand.photonZconv()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 11.); + histos.fill(HIST("GeneralQA/h2dRZPlane"), cand.photonZconv(), cand.photonRadius()); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 12.); if ((TMath::Abs(cand.photonRadius()) < photonRZLineCut) || (TMath::Abs(cand.photonZconv()) > PhotonMaxZ)) return false; + histos.fill(HIST("SigmaMassQA/h2dRZCut"), cand.sigmapT(), cand.sigmaMass()); histos.fill(HIST("GeneralQA/h2dPhotonArmenteros"), cand.photonAlpha(), cand.photonQt()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 12.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 13.); if (cand.photonQt() > PhotonMaxQt) return false; - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 13.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 14.); if (TMath::Abs(cand.photonAlpha()) > PhotonMaxAlpha) return false; - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 14.); + histos.fill(HIST("SigmaMassQA/h2dPhotonArmenteros"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 15.); histos.fill(HIST("GeneralQA/hPhotonCosPA"), cand.photonCosPA()); if (cand.photonCosPA() < PhotonMinV0cospa) return false; - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 15.); + histos.fill(HIST("SigmaMassQA/h2dPhotonCosPA"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 16.); histos.fill(HIST("GeneralQA/hPhotonPsiPair"), cand.photonPsiPair()); if (TMath::Abs(cand.photonPsiPair()) > PhotonPsiPairMax) return false; + histos.fill(HIST("SigmaMassQA/h2dPhotonPsiPair"), cand.sigmapT(), cand.sigmaMass()); - // Lambda selection - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 16.); - histos.fill(HIST("GeneralQA/hLambdaMass"), cand.lambdaMass()); - histos.fill(HIST("GeneralQA/hAntiLambdaMass"), cand.antilambdaMass()); - if ((TMath::Abs(cand.lambdaMass() - 1.115683) > LambdaWindow) && (TMath::Abs(cand.antilambdaMass() - 1.115683) > LambdaWindow)) - return false; - histos.fill(HIST("GeneralQA/hLambdaDCANegToPV"), cand.lambdaDCANegPV()); - histos.fill(HIST("GeneralQA/hLambdaDCAPosToPV"), cand.lambdaDCAPosPV()); + // Lambda selections histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 17.); - if ((TMath::Abs(cand.lambdaDCAPosPV()) < LambdaMinDCAPosToPv) || (TMath::Abs(cand.lambdaDCANegPV()) < LambdaMinDCANegToPv)) - return false; - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 18.); histos.fill(HIST("GeneralQA/hLambdaRadius"), cand.lambdaRadius()); if ((cand.lambdaRadius() < LambdaMinv0radius) || (cand.lambdaRadius() > LambdaMaxv0radius)) return false; + histos.fill(HIST("SigmaMassQA/h2dLambdaRadius"), cand.sigmapT(), cand.sigmaMass()); histos.fill(HIST("GeneralQA/hLambdaDCADau"), cand.lambdaDCADau()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 19.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 18.); if (TMath::Abs(cand.lambdaDCADau()) > LambdaMaxDCAV0Dau) return false; + histos.fill(HIST("SigmaMassQA/h2dLambdaDCADau"), cand.sigmapT(), cand.sigmaMass()); histos.fill(HIST("GeneralQA/h2dLambdaArmenteros"), cand.lambdaAlpha(), cand.lambdaQt()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 20.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 19.); if ((cand.lambdaQt() < LambdaMinQt) || (cand.lambdaQt() > LambdaMaxQt)) return false; - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 21.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 20.); if ((TMath::Abs(cand.lambdaAlpha()) < LambdaMinAlpha) || (TMath::Abs(cand.lambdaAlpha()) > LambdaMaxAlpha)) return false; + histos.fill(HIST("SigmaMassQA/h2dLambdaArmenteros"), cand.sigmapT(), cand.sigmaMass()); histos.fill(HIST("GeneralQA/hLambdaCosPA"), cand.lambdaCosPA()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 22.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 21.); if (cand.lambdaCosPA() < LambdaMinv0cospa) return false; + histos.fill(HIST("SigmaMassQA/h2dLambdaCosPA"), cand.sigmapT(), cand.sigmaMass()); histos.fill(HIST("GeneralQA/hLambdaY"), cand.lambdaY()); histos.fill(HIST("GeneralQA/hLambdaPosEta"), cand.lambdaPosEta()); histos.fill(HIST("GeneralQA/hLambdaNegEta"), cand.lambdaNegEta()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 23.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 22.); if ((TMath::Abs(cand.lambdaY()) > LambdaMaxRap) || (TMath::Abs(cand.lambdaPosEta()) > LambdaMaxDauEta) || (TMath::Abs(cand.lambdaNegEta()) > LambdaMaxDauEta)) return false; + histos.fill(HIST("SigmaMassQA/h2dLambdaY"), cand.sigmapT(), cand.sigmaMass()); histos.fill(HIST("GeneralQA/hLambdaPosTPCCR"), cand.lambdaPosTPCCrossedRows()); histos.fill(HIST("GeneralQA/hLambdaNegTPCCR"), cand.lambdaNegTPCCrossedRows()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 24.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 23.); if ((cand.lambdaPosTPCCrossedRows() < LambdaMinTPCCrossedRows) || (cand.lambdaNegTPCCrossedRows() < LambdaMinTPCCrossedRows)) return false; - histos.fill(HIST("GeneralQA/hSigmaY"), cand.sigmaRapidity()); + histos.fill(HIST("SigmaMassQA/h2dLambdaDauTPCCR"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("GeneralQA/hLambdaPosITSCls"), cand.lambdaPosITSCls()); + histos.fill(HIST("GeneralQA/hLambdaNegITSCls"), cand.lambdaNegITSCls()); + histos.fill(HIST("GeneralQA/hLambdaPosChi2PerNc"), cand.lambdaPosChi2PerNcl()); + histos.fill(HIST("GeneralQA/hLambdaNegChi2PerNc"), cand.lambdaNegChi2PerNcl()); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 24.); + // check minimum number of ITS clusters + reject ITS afterburner tracks if requested + bool posIsFromAfterburner = cand.lambdaPosChi2PerNcl() < 0; + bool negIsFromAfterburner = cand.lambdaNegChi2PerNcl() < 0; + if (cand.lambdaPosITSCls() < LambdaMinITSclusters && (!LambdaRejectPosITSafterburner || posIsFromAfterburner)) + return false; + if (cand.lambdaNegITSCls() < LambdaMinITSclusters && (!LambdaRejectNegITSafterburner || negIsFromAfterburner)) + return false; + histos.fill(HIST("SigmaMassQA/h2dLambdaDauITSCls"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("GeneralQA/hLambdaLifeTime"), cand.lambdaLifeTime()); histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 25.); + if (cand.lambdaLifeTime() > LambdaMaxLifeTime) + return false; + histos.fill(HIST("SigmaMassQA/h2dLambdaLifeTime"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 26.); + // Separating lambda and antilambda selections: + if (isLambdalike) { // Lambda selection + histos.fill(HIST("GeneralQA/h2dTPCvsTOFNSigma_LambdaPr"), cand.lambdaPosPrTPCNSigma(), cand.lambdaPrTOFNSigma()); + histos.fill(HIST("GeneralQA/h2dTPCvsTOFNSigma_LambdaPi"), cand.lambdaNegPiTPCNSigma(), cand.lambdaPiTOFNSigma()); + + // TPC Selection + if (fselLambdaTPCPID && (TMath::Abs(cand.lambdaPosPrTPCNSigma()) > LambdaMaxTPCNSigmas)) + return false; + if (fselLambdaTPCPID && (TMath::Abs(cand.lambdaNegPiTPCNSigma()) > LambdaMaxTPCNSigmas)) + return false; + + // TOF Selection + if (fselLambdaTOFPID && (TMath::Abs(cand.lambdaPrTOFNSigma()) > LambdaPrMaxTOFNSigmas)) + return false; + if (fselLambdaTOFPID && (TMath::Abs(cand.lambdaPiTOFNSigma()) > LambdaPiMaxTOFNSigmas)) + return false; + + histos.fill(HIST("SigmaMassQA/h2dTPCvsTOFNSigma_Lambda"), cand.sigmapT(), cand.sigmaMass()); + // DCA Selection + histos.fill(HIST("GeneralQA/hLambdaDCANegToPV"), cand.lambdaDCANegPV()); + histos.fill(HIST("GeneralQA/hLambdaDCAPosToPV"), cand.lambdaDCAPosPV()); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 27.); + if ((TMath::Abs(cand.lambdaDCAPosPV()) < LambdaMinDCAPosToPv) || (TMath::Abs(cand.lambdaDCANegPV()) < LambdaMinDCANegToPv)) + return false; + histos.fill(HIST("SigmaMassQA/h2dLambdaDCADauToPV"), cand.sigmapT(), cand.sigmaMass()); + + // Mass Selection + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 28.); + histos.fill(HIST("GeneralQA/hLambdaMass"), cand.lambdaMass()); + if (TMath::Abs(cand.lambdaMass() - 1.115683) > LambdaWindow) + return false; + histos.fill(HIST("SigmaMassQA/h2dLambdaMass"), cand.sigmapT(), cand.sigmaMass()); + + // if constexpr (requires { cand.lambdaCandPDGCode(); }) { + // if (doPIDQA && passedTPC) { + // histos.fill(HIST("MC/hPtLambdaCandidates_passedTPCPID"), cand.lambdaPt()); + // if (cand.lambdaCandPDGCode() == 3122) + // histos.fill(HIST("MC/hPtTrueLambda_passedTPCPID"), cand.lambdaPt()); + // } + // if (doPIDQA && passedTOF) { + // histos.fill(HIST("MC/hPtLambdaCandidates_passedTOFPID"), cand.lambdaPt()); + // if (cand.lambdaCandPDGCode() == 3122) + // histos.fill(HIST("MC/hPtTrueLambda_passedTOFPID"), cand.lambdaPt()); + // } + // if (doPIDQA && passedTPC && passedTOF) { + // histos.fill(HIST("MC/hPtLambdaCandidates_passedTPCTOFPID"), cand.lambdaPt()); + // if (cand.lambdaCandPDGCode() == 3122) + // histos.fill(HIST("MC/hPtTrueLambda_passedTPCTOFPID"), cand.lambdaPt()); + // } + // } + } else { // AntiLambda selection + histos.fill(HIST("GeneralQA/h2dTPCvsTOFNSigma_ALambdaPr"), cand.lambdaNegPrTPCNSigma(), cand.aLambdaPrTOFNSigma()); + histos.fill(HIST("GeneralQA/h2dTPCvsTOFNSigma_ALambdaPi"), cand.lambdaPosPiTPCNSigma(), cand.aLambdaPiTOFNSigma()); + + // TPC Selection + if (fselLambdaTPCPID && (TMath::Abs(cand.lambdaPosPiTPCNSigma()) > LambdaMaxTPCNSigmas)) + return false; + if (fselLambdaTPCPID && (TMath::Abs(cand.lambdaNegPrTPCNSigma()) > LambdaMaxTPCNSigmas)) + return false; + + // TOF Selection + if (fselLambdaTOFPID && (TMath::Abs(cand.aLambdaPrTOFNSigma()) > LambdaPrMaxTOFNSigmas)) + return false; + if (fselLambdaTOFPID && (TMath::Abs(cand.aLambdaPiTOFNSigma()) > LambdaPiMaxTOFNSigmas)) + return false; + + histos.fill(HIST("SigmaMassQA/h2dTPCvsTOFNSigma_ALambda"), cand.sigmapT(), cand.sigmaMass()); + // DCA Selection + histos.fill(HIST("GeneralQA/hALambdaDCANegToPV"), cand.lambdaDCANegPV()); + histos.fill(HIST("GeneralQA/hALambdaDCAPosToPV"), cand.lambdaDCAPosPV()); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 27.); + if ((TMath::Abs(cand.lambdaDCAPosPV()) < ALambdaMinDCAPosToPv) || (TMath::Abs(cand.lambdaDCANegPV()) < ALambdaMinDCANegToPv)) + return false; + + histos.fill(HIST("SigmaMassQA/h2dALambdaDCADauToPV"), cand.sigmapT(), cand.sigmaMass()); + // Mass Selection + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 28.); + histos.fill(HIST("GeneralQA/hAntiLambdaMass"), cand.antilambdaMass()); + if (TMath::Abs(cand.antilambdaMass() - 1.115683) > LambdaWindow) + return false; + histos.fill(HIST("SigmaMassQA/h2dAntiLambdaMass"), cand.sigmapT(), cand.sigmaMass()); + } + + // Sigma0 selection + histos.fill(HIST("GeneralQA/hSigmaY"), cand.sigmaRapidity()); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 29.); if (TMath::Abs(cand.sigmaRapidity()) > SigmaMaxRap) return false; + histos.fill(HIST("SigmaMassQA/h2dSigmaY"), cand.sigmapT(), cand.sigmaMass()); histos.fill(HIST("GeneralQA/hSigmaOPAngle"), cand.sigmaOPAngle()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 26.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 30.); } return true; } - // Apply selections in sigma candidates - template - bool doLambdaPIDSel(TV0Object const& cand, bool isLambdalike, bool doPIDQA) + + void processMonteCarlo(V0MCSigmas const& sigmas) { - bool passedTPC = true; - bool passedTOF = true; - - if (isLambdalike) { // Lambda PID selection - // TPC Selection - if (fselLambdaTPCPID && (cand.lambdaPosPrTPCNSigma() != -999.f) && (TMath::Abs(cand.lambdaPosPrTPCNSigma()) > LambdaMaxTPCNSigmas)) - passedTPC = false; - if (fselLambdaTPCPID && (cand.lambdaNegPiTPCNSigma() != -999.f) && (TMath::Abs(cand.lambdaNegPiTPCNSigma()) > LambdaMaxTPCNSigmas)) - passedTPC = false; - - // TOF Selection - if (fselLambdaTOFPID && (cand.lambdaPrTOFNSigma() != -1e+3) && (TMath::Abs(cand.lambdaPrTOFNSigma()) > LambdaMaxTOFNSigmas)) - passedTOF = false; - if (fselLambdaTOFPID && (cand.lambdaPiTOFNSigma() != -1e+3) && (TMath::Abs(cand.lambdaPiTOFNSigma()) > LambdaMaxTOFNSigmas)) - passedTOF = false; - - if constexpr (requires { cand.lambdaCandPDGCode(); }) { - if (doPIDQA && passedTPC) { - histos.fill(HIST("MC/hPtLambdaCandidates_passedTPCPID"), cand.lambdaPt()); - if (cand.lambdaCandPDGCode() == 3122) - histos.fill(HIST("MC/hPtTrueLambda_passedTPCPID"), cand.lambdaPt()); - } - if (doPIDQA && passedTOF) { - histos.fill(HIST("MC/hPtLambdaCandidates_passedTOFPID"), cand.lambdaPt()); - if (cand.lambdaCandPDGCode() == 3122) - histos.fill(HIST("MC/hPtTrueLambda_passedTOFPID"), cand.lambdaPt()); - } - if (doPIDQA && passedTPC && passedTOF) { - histos.fill(HIST("MC/hPtLambdaCandidates_passedTPCTOFPID"), cand.lambdaPt()); - if (cand.lambdaCandPDGCode() == 3122) - histos.fill(HIST("MC/hPtTrueLambda_passedTPCTOFPID"), cand.lambdaPt()); + for (auto& sigma : sigmas) { // selecting Sigma0-like candidates + if (doMCAssociation && !(sigma.isSigma() || sigma.isAntiSigma())) { + continue; + } + if (fGetIR) { + double interactionRate = rateFetcher.fetch(ccdb.service, sigma.sigmaTimestamp(), sigma.sigmaRunNumber(), irSource) * 1.e-3; + histos.fill(HIST("GeneralQA/hInteractionRate"), interactionRate); + histos.fill(HIST("GeneralQA/hCentralityVsInteractionRate"), sigma.sigmaCentrality(), interactionRate); + if ((maxIR != -1) && (minIR != -1) && ((interactionRate <= minIR) || (interactionRate >= maxIR))) { + continue; } } - } else { // AntiLambda PID selection - // TPC Selection - if (fselLambdaTPCPID && (cand.lambdaPosPiTPCNSigma() != -999.f) && (TMath::Abs(cand.lambdaPosPiTPCNSigma()) > LambdaMaxTPCNSigmas)) - passedTPC = false; - if (fselLambdaTPCPID && (cand.lambdaNegPrTPCNSigma() != -999.f) && (TMath::Abs(cand.lambdaNegPrTPCNSigma()) > LambdaMaxTPCNSigmas)) - passedTPC = false; - - // TOF Selection - if (fselLambdaTOFPID && (cand.aLambdaPrTOFNSigma() != -1e+3) && (TMath::Abs(cand.aLambdaPrTOFNSigma()) > LambdaMaxTOFNSigmas)) - passedTOF = false; - if (fselLambdaTOFPID && (cand.aLambdaPiTOFNSigma() != -1e+3) && (TMath::Abs(cand.aLambdaPiTOFNSigma()) > LambdaMaxTOFNSigmas)) - passedTOF = false; - } - return (passedTPC && passedTOF); - } - void processMonteCarlo(V0MCSigmas const& v0s) - { - for (auto& sigma : v0s) { // selecting Sigma0-like candidates - // selecting Sigma0-like candidates + // Filling histos before analysis selection histos.fill(HIST("MC/h2dArmenterosBeforeSel"), sigma.photonAlpha(), sigma.photonQt()); histos.fill(HIST("MC/h2dArmenterosBeforeSel"), sigma.lambdaAlpha(), sigma.lambdaQt()); histos.fill(HIST("MC/hMassSigma0BeforeSel"), sigma.sigmaMass()); histos.fill(HIST("MC/hPtSigma0BeforeSel"), sigma.sigmapT()); + histos.fill(HIST("MC/hPtGammaCand_BeforeSel"), sigma.photonPt()); + histos.fill(HIST("MC/hPtLambdaCand_BeforeSel"), sigma.lambdaPt()); + histos.fill(HIST("MC/hPtSigmaCand_BeforeSel"), sigma.sigmapT()); if (sigma.photonCandPDGCode() == 22) histos.fill(HIST("MC/hPtTrueGamma_BeforeSel"), sigma.photonPt()); if (sigma.lambdaCandPDGCode() == 3122) histos.fill(HIST("MC/hPtTrueLambda_BeforeSel"), sigma.lambdaPt()); - if (sigma.isSigma() || sigma.isAntiSigma()) + if (sigma.lambdaCandPDGCode() == -3122) + histos.fill(HIST("MC/hPtTrueAntiLambda_BeforeSel"), sigma.lambdaPt()); + if (sigma.isSigma()) histos.fill(HIST("MC/hPtTrueSigma_BeforeSel"), sigma.sigmapT()); + if (sigma.isAntiSigma()) + histos.fill(HIST("MC/hPtTrueAntiSigma_BeforeSel"), sigma.sigmapT()); - histos.fill(HIST("MC/hPtGammaCand_BeforeSel"), sigma.photonPt()); - histos.fill(HIST("MC/hPtLambdaCand_BeforeSel"), sigma.lambdaPt()); - histos.fill(HIST("MC/hPtSigmaCand_BeforeSel"), sigma.sigmapT()); - - if (!processSigmaCandidate(sigma)) - continue; - - histos.fill(HIST("MC/hPtGammaCand_AfterSel"), sigma.photonPt()); - histos.fill(HIST("MC/hPtSigmaCand_AfterSel"), sigma.sigmapT()); - - if (sigma.photonCandPDGCode() == 22) { - histos.fill(HIST("MC/hPtTrueGamma_AfterSel"), sigma.photonPt()); - histos.fill(HIST("MC/h3dGammaPtResolution"), sigma.photonPt(), TMath::Abs((sigma.photonMCPt() - sigma.photonPt()) / sigma.photonMCPt()), sigma.photonMass()); // pT resolution - } + if (sigma.lambdaAlpha() > 0) { // Lambda Analysis + if (!processSigmaCandidate(sigma, true)) + continue; - // For Lambda PID Studies - if (fLambdaTPCTOFQA && (sigma.lambdaAlpha() > 0)) { + // For Lambda PID Studies histos.fill(HIST("MC/hPtLambdaCand_AfterSel"), sigma.lambdaPt()); histos.fill(HIST("MC/h3dTPCvsTOFNSigma_LambdaPr"), sigma.lambdaPosPrTPCNSigma(), sigma.lambdaPrTOFNSigma(), sigma.lambdaPt()); histos.fill(HIST("MC/h3dTPCvsTOFNSigma_LambdaPi"), sigma.lambdaNegPiTPCNSigma(), sigma.lambdaPiTOFNSigma(), sigma.lambdaPt()); @@ -565,7 +719,48 @@ struct sigmaanalysis { histos.fill(HIST("MC/h3dTPCvsTOFNSigma_TrueLambdaPr"), sigma.lambdaPosPrTPCNSigma(), sigma.lambdaPrTOFNSigma(), sigma.lambdaPt()); histos.fill(HIST("MC/h3dTPCvsTOFNSigma_TrueLambdaPi"), sigma.lambdaNegPiTPCNSigma(), sigma.lambdaPiTOFNSigma(), sigma.lambdaPt()); } - doLambdaPIDSel(sigma, true, fLambdaTPCTOFQA); + histos.fill(HIST("GeneralQA/hLambdaMassSelected"), sigma.lambdaMass()); + if (sigma.isSigma()) { // Signal study + histos.fill(HIST("MC/h2dArmenterosAfterSel"), sigma.photonAlpha(), sigma.photonQt()); + histos.fill(HIST("MC/h2dArmenterosAfterSel"), sigma.lambdaAlpha(), sigma.lambdaQt()); + histos.fill(HIST("MC/hMassSigma0"), sigma.sigmaMass()); + histos.fill(HIST("MC/hPtSigma0"), sigma.sigmapT()); + histos.fill(HIST("MC/h3dMassSigma0"), sigma.sigmaCentrality(), sigma.sigmapT(), sigma.sigmaMass()); + histos.fill(HIST("MC/h3dSigma0PtResolution"), sigma.sigmapT(), TMath::Abs((sigma.sigmaMCPt() - sigma.sigmapT()) / sigma.sigmaMCPt()), sigma.sigmaMass()); // pT resolution + histos.fill(HIST("MC/h2dPtVsMassSigma_SignalOnly"), sigma.sigmapT(), sigma.sigmaMass()); + histos.fill(HIST("MC/hPtTrueSigma_AfterSel"), sigma.sigmapT()); + } + } else { // AntiLambda Analysis + if (!processSigmaCandidate(sigma, false)) + continue; + + if (sigma.lambdaCandPDGCode() == -3122) { + histos.fill(HIST("MC/hPtTrueAntiLambda_AfterSel"), sigma.lambdaPt()); + histos.fill(HIST("MC/h3dAntiLambdaPtResolution"), sigma.lambdaPt(), TMath::Abs((sigma.lambdaMCPt() - sigma.lambdaPt()) / sigma.lambdaMCPt()), sigma.antilambdaMass()); // pT resolution + histos.fill(HIST("MC/h3dTPCvsTOFNSigma_TrueALambdaPr"), sigma.lambdaNegPrTPCNSigma(), sigma.aLambdaPrTOFNSigma(), sigma.lambdaPt()); + histos.fill(HIST("MC/h3dTPCvsTOFNSigma_TrueALambdaPi"), sigma.lambdaPosPiTPCNSigma(), sigma.aLambdaPiTOFNSigma(), sigma.lambdaPt()); + } + + histos.fill(HIST("GeneralQA/hAntiLambdaMassSelected"), sigma.antilambdaMass()); + if (sigma.isAntiSigma()) { // Signal study + histos.fill(HIST("MC/h2dArmenterosAfterSel"), sigma.photonAlpha(), sigma.photonQt()); + histos.fill(HIST("MC/h2dArmenterosAfterSel"), sigma.lambdaAlpha(), sigma.lambdaQt()); + histos.fill(HIST("MC/hMassAntiSigma0"), sigma.sigmaMass()); + histos.fill(HIST("MC/hPtAntiSigma0"), sigma.sigmapT()); + histos.fill(HIST("MC/h3dMassAntiSigma0"), sigma.sigmaCentrality(), sigma.sigmapT(), sigma.sigmaMass()); + histos.fill(HIST("MC/h2dPtVsMassSigma_SignalOnly"), sigma.sigmapT(), sigma.sigmaMass()); + histos.fill(HIST("MC/hPtTrueSigma_AfterSel"), sigma.sigmapT()); + } + } + + // Fill histos after selection, please + histos.fill(HIST("MC/hPtGammaCand_AfterSel"), sigma.photonPt()); + histos.fill(HIST("GeneralQA/hPhotonMassSelected"), sigma.photonMass()); + histos.fill(HIST("MC/hPtSigmaCand_AfterSel"), sigma.sigmapT()); + + if (sigma.photonCandPDGCode() == 22) { + histos.fill(HIST("MC/hPtTrueGamma_AfterSel"), sigma.photonPt()); + histos.fill(HIST("MC/h3dGammaPtResolution"), sigma.photonPt(), TMath::Abs((sigma.photonMCPt() - sigma.photonPt()) / sigma.photonMCPt()), sigma.photonMass()); // pT resolution } // For background studies: @@ -587,91 +782,60 @@ struct sigmaanalysis { // Fake Gamma x Fake Lambda if ((sigma.photonCandPDGCode() != 22) && (sigma.lambdaCandPDGCode() != 3122) && (sigma.lambdaCandPDGCode() != -3122)) histos.fill(HIST("MC/h2dPtVsMassSigma_FakeDaughters"), sigma.sigmapT(), sigma.sigmaMass()); - - // MC association (signal study) - if (sigma.isSigma() || sigma.isAntiSigma()) { - histos.fill(HIST("MC/h2dPtVsMassSigma_SignalOnly"), sigma.sigmapT(), sigma.sigmaMass()); - histos.fill(HIST("MC/hPtTrueSigma_AfterSel"), sigma.sigmapT()); - histos.fill(HIST("GeneralQA/hPhotonMassSelected"), sigma.photonMass()); - if (sigma.isSigma()) { - // TPC + TOF PID Selections - if (!doLambdaPIDSel(sigma, true, false)) - continue; - - histos.fill(HIST("MC/h2dArmenterosAfterSel"), sigma.photonAlpha(), sigma.photonQt()); - histos.fill(HIST("MC/h2dArmenterosAfterSel"), sigma.lambdaAlpha(), sigma.lambdaQt()); - histos.fill(HIST("GeneralQA/hLambdaMassSelected"), sigma.lambdaMass()); - histos.fill(HIST("MC/hMassSigma0"), sigma.sigmaMass()); - histos.fill(HIST("MC/hPtSigma0"), sigma.sigmapT()); - histos.fill(HIST("MC/h3dMassSigma0"), sigma.sigmaCentrality(), sigma.sigmapT(), sigma.sigmaMass()); - histos.fill(HIST("MC/h3dSigma0PtResolution"), sigma.sigmapT(), TMath::Abs((sigma.sigmaMCPt() - sigma.sigmapT()) / sigma.sigmaMCPt()), sigma.sigmaMass()); // pT resolution - - } else { - // TPC + TOF PID Selections - if (!doLambdaPIDSel(sigma, false, false)) - continue; - - histos.fill(HIST("MC/h2dArmenterosAfterSel"), sigma.photonAlpha(), sigma.photonQt()); - histos.fill(HIST("GeneralQA/hAntiLambdaMassSelected"), sigma.antilambdaMass()); - histos.fill(HIST("MC/h2dArmenterosAfterSel"), sigma.lambdaAlpha(), sigma.lambdaQt()); - histos.fill(HIST("MC/hMassAntiSigma0"), sigma.sigmaMass()); - histos.fill(HIST("MC/hPtAntiSigma0"), sigma.sigmapT()); - histos.fill(HIST("MC/h3dMassAntiSigma0"), sigma.sigmaCentrality(), sigma.sigmapT(), sigma.sigmaMass()); - } - } } } - void processRealData(V0Sigmas const& v0s) + void processRealData(V0Sigmas const& sigmas) { - for (auto& sigma : v0s) { // selecting Sigma0-like candidates + for (auto& sigma : sigmas) { // selecting Sigma0-like candidates + if (fGetIR) { + double interactionRate = rateFetcher.fetch(ccdb.service, sigma.sigmaTimestamp(), sigma.sigmaRunNumber(), irSource) * 1.e-3; + histos.fill(HIST("GeneralQA/hInteractionRate"), interactionRate); + histos.fill(HIST("GeneralQA/hCentralityVsInteractionRate"), sigma.sigmaCentrality(), interactionRate); + if ((maxIR != -1) && (minIR != -1) && ((interactionRate <= minIR) || (interactionRate >= maxIR))) { + continue; + } + } histos.fill(HIST("GeneralQA/h2dArmenterosBeforeSel"), sigma.photonAlpha(), sigma.photonQt()); histos.fill(HIST("GeneralQA/h2dArmenterosBeforeSel"), sigma.lambdaAlpha(), sigma.lambdaQt()); histos.fill(HIST("GeneralQA/hMassSigma0BeforeSel"), sigma.sigmaMass()); nSigmaCandidates++; - if (nSigmaCandidates % 50000 == 0) { - LOG(info) << "Sigma0 Candidates processed: " << nSigmaCandidates; + if (nSigmaCandidates % 100000 == 0) { + LOG(info) << "Sigma0-like Candidates processed: " << nSigmaCandidates; } - if (!processSigmaCandidate(sigma)) - continue; - histos.fill(HIST("GeneralQA/hPhotonMassSelected"), sigma.photonMass()); if (sigma.lambdaAlpha() > 0) { - // PID selections - histos.fill(HIST("GeneralQA/h2dTPCvsTOFNSigma_LambdaPr"), sigma.lambdaPosPrTPCNSigma(), sigma.lambdaPrTOFNSigma()); - histos.fill(HIST("GeneralQA/h2dTPCvsTOFNSigma_LambdaPi"), sigma.lambdaNegPiTPCNSigma(), sigma.lambdaPiTOFNSigma()); - - // TPC + TOF PID Selections - if (!doLambdaPIDSel(sigma, true, false)) + // Perform analysis selection for sigma0 + if (!processSigmaCandidate(sigma, true)) continue; histos.fill(HIST("GeneralQA/h2dArmenterosAfterSel"), sigma.photonAlpha(), sigma.photonQt()); histos.fill(HIST("GeneralQA/h2dArmenterosAfterSel"), sigma.lambdaAlpha(), sigma.lambdaQt()); histos.fill(HIST("GeneralQA/hLambdaMassSelected"), sigma.lambdaMass()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 25.); histos.fill(HIST("Sigma0/hMassSigma0"), sigma.sigmaMass()); histos.fill(HIST("Sigma0/hPtSigma0"), sigma.sigmapT()); histos.fill(HIST("Sigma0/hRapiditySigma0"), sigma.sigmaRapidity()); histos.fill(HIST("Sigma0/h3dMassSigma0"), sigma.sigmaCentrality(), sigma.sigmapT(), sigma.sigmaMass()); + + // Low-IR + // Normal IR + // High-IR } else { - // PID selections - histos.fill(HIST("GeneralQA/h2dTPCvsTOFNSigma_ALambdaPr"), sigma.lambdaNegPrTPCNSigma(), sigma.aLambdaPrTOFNSigma()); - histos.fill(HIST("GeneralQA/h2dTPCvsTOFNSigma_ALambdaPi"), sigma.lambdaPosPiTPCNSigma(), sigma.aLambdaPiTOFNSigma()); - // TPC + TOF PID Selections - if (!doLambdaPIDSel(sigma, false, false)) + // Perform analysis selection for antisigma0 + if (!processSigmaCandidate(sigma, false)) continue; histos.fill(HIST("GeneralQA/h2dArmenterosAfterSel"), sigma.photonAlpha(), sigma.photonQt()); histos.fill(HIST("GeneralQA/h2dArmenterosAfterSel"), sigma.lambdaAlpha(), sigma.lambdaQt()); histos.fill(HIST("GeneralQA/hAntiLambdaMassSelected"), sigma.antilambdaMass()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 25.); histos.fill(HIST("AntiSigma0/hMassAntiSigma0"), sigma.sigmaMass()); histos.fill(HIST("AntiSigma0/hPtAntiSigma0"), sigma.sigmapT()); histos.fill(HIST("AntiSigma0/hRapidityAntiSigma0"), sigma.sigmaRapidity()); histos.fill(HIST("AntiSigma0/h3dMassAntiSigma0"), sigma.sigmaCentrality(), sigma.sigmapT(), sigma.sigmaMass()); } + histos.fill(HIST("GeneralQA/hPhotonMassSelected"), sigma.photonMass()); } } From 99101ef8b9442d0500ffc9184cb370b5e7c0b546 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Mon, 10 Feb 2025 13:03:33 +0100 Subject: [PATCH 0127/1650] [PWGHF] Fix bug of the initial type of generated pt of B mother in Lc task (#9848) --- PWGHF/D2H/Tasks/taskLc.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGHF/D2H/Tasks/taskLc.cxx b/PWGHF/D2H/Tasks/taskLc.cxx index 23506554f52..be75dc055bf 100644 --- a/PWGHF/D2H/Tasks/taskLc.cxx +++ b/PWGHF/D2H/Tasks/taskLc.cxx @@ -595,7 +595,7 @@ struct HfTaskLc { } auto ptGen = particle.pt(); auto originType = particle.originMcGen(); - auto ptGenB = -1; + float ptGenB = -1.; unsigned int numPvContributors = 0; const auto& recoCollsPerMcColl = recoCollisions.sliceBy(colPerMcCollision, particle.mcCollision().globalIndex()); for (const auto& recCol : recoCollsPerMcColl) { From 2bdeca6eb9003e01bdfa70c0c1e65175dd7edde7 Mon Sep 17 00:00:00 2001 From: ariedel-cern <85537041+ariedel-cern@users.noreply.github.com> Date: Mon, 10 Feb 2025 17:16:41 +0100 Subject: [PATCH 0128/1650] [PWGCF] Fix bug in collision masker (#9851) --- .../Tasks/femtoDreamCollisionMasker.cxx | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/PWGCF/FemtoDream/Tasks/femtoDreamCollisionMasker.cxx b/PWGCF/FemtoDream/Tasks/femtoDreamCollisionMasker.cxx index 63d817a8afc..9da124d1a9c 100644 --- a/PWGCF/FemtoDream/Tasks/femtoDreamCollisionMasker.cxx +++ b/PWGCF/FemtoDream/Tasks/femtoDreamCollisionMasker.cxx @@ -16,6 +16,7 @@ #include #include +#include #include #include #include @@ -332,16 +333,18 @@ struct femoDreamCollisionMasker { // if they are not passed, skip the particle if (track.pt() < FilterPtMin.at(P).at(index) || track.pt() > FilterPtMax.at(P).at(index) || track.eta() < FilterEtaMin.at(P).at(index) || track.eta() > FilterEtaMax.at(P).at(index)) { - // check if we apply pt dependend dca cut - if (TrackDCACutPtDep.at(index)) { - if (std::fabs(track.tempFitVar()) > 0.0105f * (0.035f / std::pow(track.pt(), 1.1f))) { - continue; - } - } else { - // or cut on the DCA directly - if (track.tempFitVar() < FilterTempFitVarMin.at(P).at(index) || track.tempFitVar() > FilterTempFitVarMax.at(P).at(index)) { - continue; - } + continue; + } + // check if we apply pt dependend dca cut + // if they do not pass this cut, skip particle as well + if (TrackDCACutPtDep.at(index)) { + if (std::fabs(track.tempFitVar()) > 0.0105f + (0.035f / std::pow(track.pt(), 1.1f))) { + continue; + } + } else { + // or cut on the DCA directly + if (track.tempFitVar() < FilterTempFitVarMin.at(P).at(index) || track.tempFitVar() > FilterTempFitVarMax.at(P).at(index)) { + continue; } } // set the bit at the index of the selection equal to one if the track passes all selections From 4b17241754242b455e3d4d3dc435095ff2bdf7b6 Mon Sep 17 00:00:00 2001 From: Noor Koster <82090643+cnkoster@users.noreply.github.com> Date: Mon, 10 Feb 2025 17:29:47 +0100 Subject: [PATCH 0129/1650] [PWGCF] New pilup selections + fixed return statements in track loop (#9849) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/flowSP.cxx | 114 ++++++++++++++++++++++++------------ 1 file changed, 75 insertions(+), 39 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowSP.cxx b/PWGCF/Flow/Tasks/flowSP.cxx index 027cbc43ce4..952d8eb2137 100644 --- a/PWGCF/Flow/Tasks/flowSP.cxx +++ b/PWGCF/Flow/Tasks/flowSP.cxx @@ -78,6 +78,7 @@ struct FlowSP { O2_DEFINE_CONFIGURABLE(cfgTrackCutSize, float, 0.06, "Spread of track cut"); // Additional event selections O2_DEFINE_CONFIGURABLE(cfgUseAdditionalEventCut, bool, true, "Bool to enable Additional Event Cut"); + O2_DEFINE_CONFIGURABLE(cfgnSigmaMultCuts, int, 1, "Sigma cut on Additional event cut: 1 (default), 2 or 3 sigma available"); O2_DEFINE_CONFIGURABLE(cfgMaxOccupancy, int, 10000, "Maximum occupancy of selected events"); O2_DEFINE_CONFIGURABLE(cfgNoSameBunchPileupCut, bool, true, "kNoSameBunchPileupCut"); O2_DEFINE_CONFIGURABLE(cfgIsGoodZvtxFT0vsPV, bool, true, "kIsGoodZvtxFT0vsPV"); @@ -296,6 +297,7 @@ struct FlowSP { registry.add("qAqCXY", "", kTProfile, {axisCent}); registry.add("qAXqCY", "", kTProfile, {axisCent}); registry.add("qAYqCX", "", kTProfile, {axisCent}); + registry.add("qAXYqCXY", "", kTProfile, {axisCent}); if (cfgFillQAHistos) { registry.add("QA/after/PsiA_vs_Cent", "", {HistType::kTH2D, {axisPhiPlane, axisCent}}); @@ -363,15 +365,34 @@ struct FlowSP { registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_ParticleWeights + 1, "Apply weights"); if (cfgUseAdditionalEventCut) { - fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x - 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); - fMultPVCutLow->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); - fMultPVCutHigh = new TF1("fMultPVCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x + 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); - fMultPVCutHigh->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); - - fMultCutLow = new TF1("fMultCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x - 2.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); - fMultCutLow->SetParameters(1654.46, -47.2379, 0.449833, -0.0014125, 150.773, -3.67334, 0.0530503, -0.000614061, 3.15956e-06); - fMultCutHigh = new TF1("fMultCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x + 3.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); - fMultCutHigh->SetParameters(1654.46, -47.2379, 0.449833, -0.0014125, 150.773, -3.67334, 0.0530503, -0.000614061, 3.15956e-06); + // Fitted for LHC23zzh_pass4 + fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); + fMultPVCutLow->SetParameters(2942.55, -103.111, 1.4397, -0.00974862, 2.71433e-05); + if (cfgnSigmaMultCuts == 2) + fMultPVCutLow->SetParameters(2665.68, -93.3784, 1.27137, -0.00818936, 2.115e-05); + if (cfgnSigmaMultCuts == 3) + fMultPVCutLow->SetParameters(2389.99, -83.8483, 1.11062, -0.00672263, 1.54725e-05); + + fMultPVCutHigh = new TF1("fMultPVCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); + fMultPVCutHigh->SetParameters(3508.13, -124.831, 1.87871, -0.0145343, 4.80688e-05); + if (cfgnSigmaMultCuts == 2) + fMultPVCutHigh->SetParameters(3787.93, -135.184, 2.07683, -0.0165997, 5.68725e-05); + if (cfgnSigmaMultCuts == 3) + fMultPVCutHigh->SetParameters(4067.4, -145.485, 2.27273, -0.0186308, 6.5501e-05); + + fMultCutLow = new TF1("fMultCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); + fMultCutLow->SetParameters(1566.5, -48.2114, 0.529522, -0.00235284, 3.01132e-06); + if (cfgnSigmaMultCuts == 2) + fMultCutLow->SetParameters(1307.92, -39.9168, 0.412675, -0.00148081, 1.10868e-07); + if (cfgnSigmaMultCuts == 3) + fMultCutLow->SetParameters(1048.48, -31.4568, 0.287794, -0.00046847, -3.5909e-06); + + fMultCutHigh = new TF1("fMultCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); + fMultCutHigh->SetParameters(2089.73, -65.9772, 0.816781, -0.00496563, 1.34314e-05); + if (cfgnSigmaMultCuts == 2) + fMultCutHigh->SetParameters(2350.39, -74.6939, 0.953287, -0.006162, 1.80808e-05); + if (cfgnSigmaMultCuts == 3) + fMultCutHigh->SetParameters(2610.98, -83.3983, 1.0893, -0.00735094, 2.26929e-05); } if (cfgUseAdditionalTrackCut) { @@ -573,13 +594,15 @@ struct FlowSP { phimodn += o2::constants::math::PI / 18.0; // to center gap in the middle phimodn = fmod(phimodn, o2::constants::math::PI / 9.0); - registry.fill(HIST("QA/before/pt_phi"), track.pt(), phimodn); + if (cfgFillQAHistos) + registry.fill(HIST("QA/before/pt_phi"), track.pt(), phimodn); if (cfgUseAdditionalTrackCut) { if (phimodn < fPhiCutHigh->Eval(track.pt()) && phimodn > fPhiCutLow->Eval(track.pt())) return false; // reject track } - registry.fill(HIST("QA/after/pt_phi"), track.pt(), phimodn); + if (cfgFillQAHistos) + registry.fill(HIST("QA/after/pt_phi"), track.pt(), phimodn); registry.fill(HIST("hTrackCount"), trackSel_TPCBoundary); return true; } @@ -713,7 +736,6 @@ struct FlowSP { void processData(UsedCollisions::iterator const& collision, aod::BCsWithTimestamps const&, UsedTracks const& tracks) { registry.fill(HIST("hEventCount"), evSel_FilteredEvent); - auto bc = collision.bc_as(); auto field = (cfgMagField == 99999) ? getMagneticField(bc.timestamp()) : cfgMagField; @@ -776,6 +798,7 @@ struct FlowSP { registry.fill(HIST("qAXqCY"), centrality, qxA * qyC); registry.fill(HIST("qAYqCX"), centrality, qyA * qxC); + registry.fill(HIST("qAXYqCXY"), centrality, qyA * qxC + qxA * qyC); registry.fill(HIST("qAqCX"), centrality, qxA * qxC); registry.fill(HIST("qAqCY"), centrality, qyA * qyC); @@ -811,7 +834,9 @@ struct FlowSP { } for (const auto& track : tracks) { - registry.fill(HIST("QA/before/hPt_inclusive"), track.pt()); + if (cfgFillQAHistos) + registry.fill(HIST("QA/before/hPt_inclusive"), track.pt()); + registry.fill(HIST("hTrackCount"), trackSel_FilteredTracks); float weff = 1, wacc = 1; @@ -819,10 +844,11 @@ struct FlowSP { float weffN = 1, waccN = 1; if (!trackSelected(track, field)) - return; + continue; if (track.sign() == 0.0) - return; + continue; + registry.fill(HIST("hTrackCount"), trackSel_ZeroCharge); bool pos = (track.sign() > 0) ? true : false; @@ -839,15 +865,16 @@ struct FlowSP { // Set weff and wacc for inclusice, negative and positive hadrons if (!setCurrentParticleWeights(kInclusive, weff, wacc, track.phi(), track.eta(), track.pt(), vtxz)) - return; + continue; if (pos && !setCurrentParticleWeights(kPositive, weffP, waccP, track.phi(), track.eta(), track.pt(), vtxz)) - return; + continue; if (!pos && !setCurrentParticleWeights(kNegative, weffN, waccN, track.phi(), track.eta(), track.pt(), vtxz)) - return; + continue; registry.fill(HIST("hTrackCount"), trackSel_ParticleWeights); - registry.fill(HIST("QA/after/hPt_inclusive"), track.pt(), wacc * weff); + if (cfgFillQAHistos) + registry.fill(HIST("QA/after/hPt_inclusive"), track.pt(), wacc * weff); // // constrain angle to 0 -> [0,0+2pi] auto phi = RecoDecay::constrainAngle(track.phi(), 0); @@ -907,26 +934,35 @@ struct FlowSP { auto mcParticle = track.mcParticle(); if (!mcParticle.isPhysicalPrimary()) - return; + continue; if (mcParticle.eta() < -cfgEta || mcParticle.eta() > cfgEta || mcParticle.pt() < cfgPtmin || mcParticle.pt() > cfgPtmax || track.tpcNClsFound() < cfgNcls) - return; + continue; if (track.sign() == 0.0) - return; + continue; bool pos = (track.sign() > 0) ? true : false; - registry.fill(HIST("QA/before/hPt_inclusive"), track.pt()); - if (pos) { - registry.fill(HIST("QA/before/hPt_positive"), track.pt()); - } else { - registry.fill(HIST("QA/before/hPt_negative"), track.pt()); + if (cfgFillQAHistos) { + registry.fill(HIST("QA/before/hPt_inclusive"), track.pt()); + if (pos) { + registry.fill(HIST("QA/before/hPt_positive"), track.pt()); + } else { + registry.fill(HIST("QA/before/hPt_negative"), track.pt()); + } } if (!trackSelected(track, field)) - return; + continue; - registry.fill(HIST("QA/after/hPt_inclusive"), track.pt()); + if (cfgFillQAHistos) { + registry.fill(HIST("QA/after/hPt_inclusive"), track.pt()); + if (pos) { + registry.fill(HIST("QA/after/hPt_positive"), track.pt()); + } else { + registry.fill(HIST("QA/after/hPt_negative"), track.pt()); + } + } fillTrackQA(track, vtxz); @@ -937,8 +973,9 @@ struct FlowSP { Filter mcCollFilter = nabs(aod::mccollision::posZ) < cfgVtxZ; void processMCGen(soa::Filtered::iterator const& mcCollision, soa::SmallGroups> const& collisions, aod::McParticles const& particles) { - if (collisions.size() != 1) + if (collisions.size() != 1) { // check if MC collision is only reconstructed once! (https://indico.cern.ch/event/1425820/contributions/6170879/attachments/2947721/5180548/DDChinellato-O2AT4-HandsOn-03a.pdf) return; + } float centrality = -1; for (const auto& collision : collisions) { centrality = collision.centFT0C(); @@ -959,19 +996,18 @@ struct FlowSP { float vtxz = mcCollision.posZ(); - for (const auto& track : particles) { - - if (!track.isPhysicalPrimary()) + for (const auto& particle : particles) { + if (!particle.isPhysicalPrimary()) continue; - registry.fill(HIST("trackMCGen/before/pt_gen_incl"), track.pt()); - registry.fill(HIST("trackMCGen/before/phi_eta_vtxZ_gen"), track.phi(), track.eta(), vtxz); + registry.fill(HIST("trackMCGen/before/pt_gen_incl"), particle.pt()); + registry.fill(HIST("trackMCGen/before/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); - if (track.eta() < -cfgEta || track.eta() > cfgEta || track.pt() < cfgPtmin || track.pt() > cfgPtmax) - return; + if (particle.eta() < -cfgEta || particle.eta() > cfgEta || particle.pt() < cfgPtmin || particle.pt() > cfgPtmax) + continue; - registry.fill(HIST("trackMCGen/after/pt_gen_incl"), track.pt()); - registry.fill(HIST("trackMCGen/after/phi_eta_vtxZ_gen"), track.phi(), track.eta(), vtxz); + registry.fill(HIST("trackMCGen/after/pt_gen_incl"), particle.pt()); + registry.fill(HIST("trackMCGen/after/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); } } PROCESS_SWITCH(FlowSP, processMCGen, "Process analysis for MC generated events", false); From f0634e64e170d48c7f6c64bc3bc51dd972420f45 Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Tue, 11 Feb 2025 00:31:15 +0800 Subject: [PATCH 0130/1650] [PWGCF] flowPtEfficiency: fix runtime error (#9852) --- PWGCF/Flow/Tasks/flowPtEfficiency.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowPtEfficiency.cxx b/PWGCF/Flow/Tasks/flowPtEfficiency.cxx index 4ed37f9b7a5..27fc0f3a047 100644 --- a/PWGCF/Flow/Tasks/flowPtEfficiency.cxx +++ b/PWGCF/Flow/Tasks/flowPtEfficiency.cxx @@ -82,7 +82,7 @@ struct FlowPtEfficiency { // Filter for collisions Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; - using MyCollisions = soa::Filtered>; + using MyCollisions = soa::Filtered>; // Filter for MCParticle Filter particleFilter = (nabs(aod::mcparticle::eta) < cfgCutEta) && (aod::mcparticle::pt > cfgCutPtMin) && (aod::mcparticle::pt < cfgCutPtMax); @@ -345,7 +345,7 @@ struct FlowPtEfficiency { return myTrackSel.IsSelected(track); } - void processReco(MyCollisions::iterator const& collision, aod::BCsWithTimestamps const&, MyTracks const& tracks, aod::McParticles const&) + void processReco(MyCollisions::iterator const& collision, aod::BCsWithTimestamps const&, MyTracks const& tracks, aod::McParticles const&, aod::McCollisions const&) { registry.fill(HIST("eventCounter"), 0.5); if (!collision.sel8()) From ae63732046819b15da301806ee215de6d30e24b1 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Tue, 11 Feb 2025 02:11:53 +0900 Subject: [PATCH 0131/1650] [PWGEM/Dilepton] add a task for MC truth (#9842) --- PWGEM/Dilepton/Tasks/CMakeLists.txt | 5 + PWGEM/Dilepton/Tasks/studyMCTruth.cxx | 430 ++++++++++++++++++++++++++ 2 files changed, 435 insertions(+) create mode 100644 PWGEM/Dilepton/Tasks/studyMCTruth.cxx diff --git a/PWGEM/Dilepton/Tasks/CMakeLists.txt b/PWGEM/Dilepton/Tasks/CMakeLists.txt index 4682a4e2438..9a9067b6a6c 100644 --- a/PWGEM/Dilepton/Tasks/CMakeLists.txt +++ b/PWGEM/Dilepton/Tasks/CMakeLists.txt @@ -131,3 +131,8 @@ o2physics_add_dpl_workflow(associate-mccollision-to-collision PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(study-mc-truth + SOURCES studyMCTruth.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + diff --git a/PWGEM/Dilepton/Tasks/studyMCTruth.cxx b/PWGEM/Dilepton/Tasks/studyMCTruth.cxx new file mode 100644 index 00000000000..6f173a597c8 --- /dev/null +++ b/PWGEM/Dilepton/Tasks/studyMCTruth.cxx @@ -0,0 +1,430 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +// +// ======================== +// +// This code is to study MC truth. e.g. S/B +// Please write to: daiki.sekihata@cern.ch + +#include +#include +#include "Math/Vector4D.h" + +#include "Framework/StaticFor.h" +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/ASoAHelpers.h" +#include "ReconstructionDataFormats/Track.h" +#include "Common/Core/TableHelper.h" +#include "PWGEM/Dilepton/Utils/MCUtilities.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::soa; +using namespace o2::aod::pwgem::dilepton::utils::mcutil; + +struct studyMCTruth { + Configurable pdg_lepton{"pdg_lepton", 11, "pdg code for desired lepton"}; + Configurable max_rxy_PC{"max_rxy_PC", 2.4, "max. rxy for electron from photon conversions"}; // beam pipe:1.8 cm, ITSLayerRadii{2.33959f, 3.14076f, 3.91924f, 19.6213f, 24.5597f, 34.388f, 39.3329f}; in cm + Configurable min_imp_par{"min_imp_par", -1.f, "min. impact parameter in fm"}; // [0, 4] fm for centrality FT0C 0-10%, [8, 10] fm for centrality FT0C 30-50%, + Configurable max_imp_par{"max_imp_par", 999.f, "max. impact parameter in fm"}; + + Configurable min_pt_gen{"min_pt_gen", 0.4, "min. pT of single lepton"}; + Configurable max_pt_gen{"max_pt_gen", 1e+10f, "max. pT of single lepton"}; + Configurable min_eta_gen{"min_eta_gen", -0.8, "min. eta of for single lepton"}; + Configurable max_eta_gen{"max_eta_gen", +0.8, "max. eta of for single lepton"}; + + Configurable min_pt_gen_pf{"min_pt_gen_pf", 0.05, "min. pT of single lepton used for prefilter"}; + Configurable max_pt_gen_pf{"max_pt_gen_pf", 1e+10f, "max. pT of single lepton used for prefilter"}; + Configurable min_eta_gen_pf{"min_eta_gen_pf", -0.9, "min. eta of single lepton used for prefilter"}; + Configurable max_eta_gen_pf{"max_eta_gen_pf", +0.9, "max. eta of single lepton used for prefilter"}; + Configurable> max_mll_vec{"max_mll_vec", std::vector{0.08, 0.10, 0.12}, "vector fo max mll for prefilter in ULS. Please use exactly 3 values."}; // currently, 3 thoresholds are allowed. + + ConfigurableAxis ConfMllBins{"ConfMllBins", {400, 0.f, 4.f}, "mll bins for output histograms"}; + ConfigurableAxis ConfPtllBins{"ConfPtllBins", {100, 0.f, 10.f}, "pTll bins for output histograms"}; + + HistogramRegistry fRegistry{"output", {}, OutputObjHandlingPolicy::AnalysisObject, false, false}; + + float leptonMass = o2::constants::physics::MassElectron; + void init(o2::framework::InitContext&) + { + if (std::abs(pdg_lepton.value) == 11) { + leptonMass = o2::constants::physics::MassElectron; + } else if (std::abs(pdg_lepton.value) == 13) { + leptonMass = o2::constants::physics::MassMuon; + } + addHistograms(); + } + + static constexpr std::string_view dileptonSigns[3] = {"uls/", "lspp/", "lsmm/"}; + static constexpr std::string_view pfNames[4] = {"default/", "mllPF0/", "mllPF1/", "mllPF2/"}; + + void addHistograms() + { + const AxisSpec axis_mll{ConfMllBins, "m_{ll} (GeV/c^{2})"}; + const AxisSpec axis_ptll{ConfPtllBins, "p_{T,ll} (GeV/c)"}; + + fRegistry.add("Event/hZvtx", "MC Zvtx;Z_{vtx} (cm)", kTH1D, {{100, -50, +50}}, false); + fRegistry.add("Event/hImpactParameter", "impact parameter;impact parameter b (fm)", kTH1D, {{200, 0, 20}}, false); + fRegistry.add("Event/hPtY_pion", "#pi^{#pm} yield;y;p_{T} (GeV/c)", kTH2D, {{20, -1, +1}, {100, 0, 10}}, false); + fRegistry.add("Event/hPtY_kaon", "K^{#pm} yield;y;p_{T} (GeV/c)", kTH2D, {{20, -1, +1}, {100, 0, 10}}, false); + fRegistry.add("Event/hPtY_proton", "p(#bar{p}) yield;y;p_{T} (GeV/c)", kTH2D, {{20, -1, +1}, {100, 0, 10}}, false); + + fRegistry.add("Track/default/hPt", "p_{T,e}", kTH1D, {{1000, 0, 10}}, true); + fRegistry.add("Track/default/hEtaPhi", "#eta_{e} vs. #varphi_{e};#varphi_{e} (rad.);#eta_{e};", kTH2D, {{90, 0, 2 * M_PI}, {60, -5, +1}}, true); + fRegistry.addClone("Track/default/", "Track/mllPF0/"); + fRegistry.addClone("Track/default/", "Track/mllPF1/"); + fRegistry.addClone("Track/default/", "Track/mllPF2/"); + + fRegistry.add("Pair/default/Pi0/uls/hMvsPt", "m_{ll} vs. p_{T,ll}", kTH2D, {axis_mll, axis_ptll}, true); + fRegistry.addClone("Pair/default/Pi0/uls/", "Pair/default/Pi0/lspp/"); + fRegistry.addClone("Pair/default/Pi0/uls/", "Pair/default/Pi0/lsmm/"); + fRegistry.addClone("Pair/default/Pi0/", "Pair/default/Eta/"); + fRegistry.addClone("Pair/default/Pi0/", "Pair/default/EtaPrime/"); + fRegistry.addClone("Pair/default/Pi0/", "Pair/default/Rho/"); + fRegistry.addClone("Pair/default/Pi0/", "Pair/default/Omega/"); + fRegistry.addClone("Pair/default/Pi0/", "Pair/default/Phi/"); + fRegistry.addClone("Pair/default/Pi0/", "Pair/default/JPsi/"); + fRegistry.addClone("Pair/default/Pi0/", "Pair/default/Psi2S/"); + fRegistry.addClone("Pair/default/Pi0/", "Pair/default/Upsilon1S/"); + fRegistry.addClone("Pair/default/Pi0/", "Pair/default/Upsilon2S/"); + fRegistry.addClone("Pair/default/Pi0/", "Pair/default/Upsilon3S/"); + fRegistry.addClone("Pair/default/Pi0/", "Pair/default/ccbar/"); + fRegistry.addClone("Pair/default/Pi0/", "Pair/default/bbbar/"); + fRegistry.addClone("Pair/default/Pi0/", "Pair/default/Photon/"); + fRegistry.addClone("Pair/default/Pi0/", "Pair/default/comb_bkg/"); + fRegistry.addClone("Pair/default/", "Pair/mllPF0/"); + fRegistry.addClone("Pair/default/", "Pair/mllPF1/"); + fRegistry.addClone("Pair/default/", "Pair/mllPF2/"); + fRegistry.addClone("Pair/default/Pi0/uls/", "Pair/PF/all/uls/"); + } + + template + int FindLF(TTrack const& posmc, TTrack const& negmc, TMCParticles const& mcparticles) + { + int arr[] = { + FindCommonMotherFrom2Prongs(posmc, negmc, -pdg_lepton, pdg_lepton, 22, mcparticles), + FindCommonMotherFrom2Prongs(posmc, negmc, -pdg_lepton, pdg_lepton, 111, mcparticles), + FindCommonMotherFrom2Prongs(posmc, negmc, -pdg_lepton, pdg_lepton, 221, mcparticles), + FindCommonMotherFrom2Prongs(posmc, negmc, -pdg_lepton, pdg_lepton, 331, mcparticles), + FindCommonMotherFrom2Prongs(posmc, negmc, -pdg_lepton, pdg_lepton, 113, mcparticles), + FindCommonMotherFrom2Prongs(posmc, negmc, -pdg_lepton, pdg_lepton, 223, mcparticles), + FindCommonMotherFrom2Prongs(posmc, negmc, -pdg_lepton, pdg_lepton, 333, mcparticles), + FindCommonMotherFrom2Prongs(posmc, negmc, -pdg_lepton, pdg_lepton, 443, mcparticles), + FindCommonMotherFrom2Prongs(posmc, negmc, -pdg_lepton, pdg_lepton, 100443, mcparticles), + FindCommonMotherFrom2Prongs(posmc, negmc, -pdg_lepton, pdg_lepton, 553, mcparticles), + FindCommonMotherFrom2Prongs(posmc, negmc, -pdg_lepton, pdg_lepton, 100553, mcparticles), + FindCommonMotherFrom2Prongs(posmc, negmc, -pdg_lepton, pdg_lepton, 200553, mcparticles)}; + int size = sizeof(arr) / sizeof(*arr); + int max = *std::max_element(arr, arr + size); + return max; + } + + template + bool isEleFromPCOnITSib(TMCParticle const& mcparticle, TMCParticles const& mcParticles) + { + if (!mcparticle.has_mothers()) { + return false; + } + if (std::abs(mcparticle.pdgCode()) != 11) { + return false; + } + if (mcparticle.isPhysicalPrimary() || mcparticle.producedByGenerator()) { + return false; + } + if (std::sqrt(std::pow(mcparticle.vx(), 2) + std::pow(mcparticle.vy(), 2)) > max_rxy_PC) { + return false; + } + const auto& mp = mcParticles.iteratorAt(mcparticle.mothersIds()[0]); + if (std::abs(mp.pdgCode()) == 22) { + return true; + } else { + return false; + } + } + + template + bool isSelectedMCParticle(TMCParticle const& mcparticle, TMCParticles const& mcParticles) + { + if (std::abs(mcparticle.pdgCode()) != pdg_lepton) { + return false; + } + if (!mcparticle.has_mothers()) { + return false; + } + if (mcparticle.isPhysicalPrimary() || mcparticle.producedByGenerator() || isEleFromPCOnITSib(mcparticle, mcParticles)) { + return true; + } else { + return false; + } + } + + template + void fillTrueInfo(TMCLepton const& t1, TMCLepton const& t2, TMCParticles const& mcParticles) + { + if (!isSelectedMCParticle(t1, mcParticles) || !isSelectedMCParticle(t2, mcParticles)) { + return; + } + + ROOT::Math::PtEtaPhiMVector v1(t1.pt(), t1.eta(), t1.phi(), leptonMass); + ROOT::Math::PtEtaPhiMVector v2(t2.pt(), t2.eta(), t2.phi(), leptonMass); + ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; + + int mother_id = FindLF(t1, t2, mcParticles); + int hfll_type = IsHF(t1, t2, mcParticles); + if (mother_id < 0 && hfll_type < 0) { + fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("comb_bkg/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + return; + } + + if (mother_id > 0) { // same mother (photon, LF, Quarkonia) + const auto& mp = mcParticles.iteratorAt(mother_id); + if (std::abs(mp.pdgCode()) == 22 && isEleFromPCOnITSib(t1, mcParticles) && isEleFromPCOnITSib(t2, mcParticles)) { + fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("Photon/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + return; + } + if (!t1.isPhysicalPrimary() && !t1.producedByGenerator()) { + return; + } + if (!t2.isPhysicalPrimary() && !t2.producedByGenerator()) { + return; + } + if (!mp.isPhysicalPrimary() && !mp.producedByGenerator()) { + return; + } + switch (std::abs(mp.pdgCode())) { + case 111: + fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("Pi0/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + break; + case 221: + fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("Eta/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + break; + case 331: + fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("EtaPrime/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + break; + case 113: + fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("Rho/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + break; + case 223: + fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("Omega/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + break; + case 333: + fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("Phi/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + break; + case 443: + fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("JPsi/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + break; + case 100443: + fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("Psi2S/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + break; + case 553: + fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("Upsilon1S/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + break; + case 100553: + fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("Upsilon2S/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + break; + case 200553: + fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("Upsilon3S/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + break; + default: + break; + } + } else if (hfll_type > 0) { // HFll + switch (hfll_type) { + case static_cast(EM_HFeeType::kCe_Ce): // ULS + fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("ccbar/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + break; + case static_cast(EM_HFeeType::kBe_Be): // ULS + fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("bbbar/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + break; + case static_cast(EM_HFeeType::kBCe_BCe): // ULS + fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("bbbar/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + break; + case static_cast(EM_HFeeType::kBCe_Be_SameB): // ULS + fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("bbbar/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + break; + case static_cast(EM_HFeeType::kBCe_Be_DiffB): // LS + fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("bbbar/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + default: + break; + } + } + } + + template + void fillTrackInfo(TMCParticle const& mcparticle) + { + fRegistry.fill(HIST("Track/") + HIST(pfNames[pftype]) + HIST("hPt"), mcparticle.pt()); + fRegistry.fill(HIST("Track/") + HIST(pfNames[pftype]) + HIST("hEtaPhi"), mcparticle.phi(), mcparticle.eta()); + } + + template + void runMC(TMCCollisions const& mcCollisions, TMCParticles const& mcParticles) + { + std::unordered_map map_pfb; // global index of mc particle -> prefilter bit + for (const auto& mcCollision : mcCollisions) { + fRegistry.fill(HIST("Event/hZvtx"), mcCollision.posZ()); + fRegistry.fill(HIST("Event/hImpactParameter"), mcCollision.impactParameter()); + + auto mcParticles_per_mccollision = mcParticles.sliceBy(perMcCollision, mcCollision.globalIndex()); + for (const auto& mcparticle : mcParticles_per_mccollision) { + if (mcparticle.isPhysicalPrimary() || mcparticle.producedByGenerator()) { + if (std::abs(mcparticle.pdgCode()) == 211) { + fRegistry.fill(HIST("Event/hPtY_pion"), mcparticle.y(), mcparticle.pt()); + } else if (std::abs(mcparticle.pdgCode()) == 321) { + fRegistry.fill(HIST("Event/hPtY_kaon"), mcparticle.y(), mcparticle.pt()); + } else if (std::abs(mcparticle.pdgCode()) == 2212) { + fRegistry.fill(HIST("Event/hPtY_proton"), mcparticle.y(), mcparticle.pt()); + } + } + } + + // store MC true information + auto posLeptons_per_mccollision = mcPosLeptons.sliceBy(perMcCollision, mcCollision.globalIndex()); + auto negLeptons_per_mccollision = mcNegLeptons.sliceBy(perMcCollision, mcCollision.globalIndex()); + auto posLeptonsPF_per_mccollision = mcPosLeptonsPF.sliceBy(perMcCollision, mcCollision.globalIndex()); + auto negLeptonsPF_per_mccollision = mcNegLeptonsPF.sliceBy(perMcCollision, mcCollision.globalIndex()); + + for (const auto& pos : posLeptons_per_mccollision) { + map_pfb[pos.globalIndex()] = 0; + if (!isSelectedMCParticle(pos, mcParticles)) { + continue; + } + fillTrackInfo<0>(pos); + // fRegistry.fill(HIST("Track/default/hPt"), pos.pt()); + // fRegistry.fill(HIST("Track/default/hEtaPhi"), pos.phi(), pos.eta()); + } + for (const auto& neg : negLeptons_per_mccollision) { + map_pfb[neg.globalIndex()] = 0; + if (!isSelectedMCParticle(neg, mcParticles)) { + continue; + } + fillTrackInfo<0>(neg); + // fRegistry.fill(HIST("Track/default/hPt"), neg.pt()); + // fRegistry.fill(HIST("Track/default/hEtaPhi"), neg.phi(), neg.eta()); + } + + for (const auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posLeptonsPF_per_mccollision, negLeptonsPF_per_mccollision))) { // ULS to set prefilter bits + if (!isSelectedMCParticle(pos, mcParticles) || !isSelectedMCParticle(neg, mcParticles)) { + continue; + } + ROOT::Math::PtEtaPhiMVector v1(pos.pt(), pos.eta(), pos.phi(), leptonMass); + ROOT::Math::PtEtaPhiMVector v2(neg.pt(), neg.eta(), neg.phi(), leptonMass); + ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; + fRegistry.fill(HIST("Pair/PF/all/uls/hMvsPt"), v12.M(), v12.Pt()); + for (int i = 0; i < static_cast(max_mll_vec->size()); i++) { + if (v12.M() < max_mll_vec->at(i)) { + map_pfb[pos.globalIndex()] |= (uint8_t(1) << i); + map_pfb[neg.globalIndex()] |= (uint8_t(1) << i); + } + } + } // end of ULS pair loop to set prefilter bits + + for (const auto& pos : posLeptons_per_mccollision) { + if (!isSelectedMCParticle(pos, mcParticles)) { + continue; + } + static_for<0, 3 - 1>([&](auto i) { + constexpr int index = i.value; + if ((map_pfb[pos.globalIndex()] & (uint8_t(1) << index)) == 0) { + fillTrackInfo(pos); + // fRegistry.fill(HIST("Track/") + HIST(pfNames[index + 1]) + HIST("hPt"), pos.pt()); + // fRegistry.fill(HIST("Track/") + HIST(pfNames[index + 1]) + HIST("hEtaPhi"), pos.phi(), pos.eta()); + } + }); + } + for (const auto& neg : negLeptons_per_mccollision) { + if (!isSelectedMCParticle(neg, mcParticles)) { + continue; + } + static_for<0, 3 - 1>([&](auto i) { + constexpr int index = i.value; + if ((map_pfb[neg.globalIndex()] & (uint8_t(1) << index)) == 0) { + fillTrackInfo(neg); + // fRegistry.fill(HIST("Track/") + HIST(pfNames[index + 1]) + HIST("hPt"), neg.pt()); + // fRegistry.fill(HIST("Track/") + HIST(pfNames[index + 1]) + HIST("hEtaPhi"), neg.phi(), neg.eta()); + } + }); + } + + for (const auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posLeptons_per_mccollision, negLeptons_per_mccollision))) { // ULS + if (!isSelectedMCParticle(pos, mcParticles) || !isSelectedMCParticle(neg, mcParticles)) { + continue; + } + // LOGF(info, "mcCollision.globalIndex() = %d, pos.globalIndex() = %d, map_pfb[pos.globalIndex()] = %d, neg.globalIndex() = %d, map_pfb[neg.globalIndex()] = %d", mcCollision.globalIndex(), pos.globalIndex(), map_pfb[pos.globalIndex()], neg.globalIndex(), map_pfb[neg.globalIndex()]); + + fillTrueInfo<0, 0>(pos, neg, mcParticles); // default + static_for<0, 3 - 1>([&](auto i) { + constexpr int index = i.value; + if ((map_pfb[pos.globalIndex()] & (uint8_t(1) << index)) == 0 && (map_pfb[neg.globalIndex()] & (uint8_t(1) << index)) == 0) { + fillTrueInfo(pos, neg, mcParticles); // mllPF0,1,2 + } + }); + } // end of ULS pair loop + + for (auto& [pos1, pos2] : combinations(CombinationsStrictlyUpperIndexPolicy(posLeptons_per_mccollision, posLeptons_per_mccollision))) { // LS++ + if (!isSelectedMCParticle(pos1, mcParticles) || !isSelectedMCParticle(pos2, mcParticles)) { + continue; + } + fillTrueInfo<0, 1>(pos1, pos2, mcParticles); // default + static_for<0, 3 - 1>([&](auto i) { + constexpr int index = i.value; + if ((map_pfb[pos1.globalIndex()] & (uint8_t(1) << index)) == 0 && (map_pfb[pos2.globalIndex()] & (uint8_t(1) << index)) == 0) { + fillTrueInfo(pos1, pos2, mcParticles); // mllPF0,1,2 + } + }); + } // end of LS++ pair loop + + for (auto& [neg1, neg2] : combinations(CombinationsStrictlyUpperIndexPolicy(negLeptons_per_mccollision, negLeptons_per_mccollision))) { // LS-- + if (!isSelectedMCParticle(neg1, mcParticles) || !isSelectedMCParticle(neg2, mcParticles)) { + continue; + } + fillTrueInfo<0, 2>(neg1, neg2, mcParticles); // default + static_for<0, 3 - 1>([&](auto i) { + constexpr int index = i.value; + if ((map_pfb[neg1.globalIndex()] & (uint8_t(1) << index)) == 0 && (map_pfb[neg2.globalIndex()] & (uint8_t(1) << index)) == 0) { + fillTrueInfo(neg1, neg2, mcParticles); // mllPF0,1,2 + } + }); + } // end of LS-- pair loop + + map_pfb.clear(); + } // end of mc collision loop + + } // end of skimmingMC + + SliceCache cache; + Preslice perMcCollision = aod::mcparticle::mcCollisionId; + + Filter collisionFilter = min_imp_par < o2::aod::mccollision::impactParameter && o2::aod::mccollision::impactParameter < max_imp_par; + using FilteredMcCollisions = soa::Filtered; + + Partition mcPosLeptons = o2::aod::mcparticle::pdgCode == -pdg_lepton && (min_pt_gen < o2::aod::mcparticle::pt && o2::aod::mcparticle::pt < max_pt_gen) && (min_eta_gen < o2::aod::mcparticle::eta && o2::aod::mcparticle::eta < max_eta_gen); + Partition mcNegLeptons = o2::aod::mcparticle::pdgCode == pdg_lepton && (min_pt_gen < o2::aod::mcparticle::pt && o2::aod::mcparticle::pt < max_pt_gen) && (min_eta_gen < o2::aod::mcparticle::eta && o2::aod::mcparticle::eta < max_eta_gen); + Partition mcPosLeptonsPF = o2::aod::mcparticle::pdgCode == -pdg_lepton && (min_pt_gen_pf < o2::aod::mcparticle::pt && o2::aod::mcparticle::pt < max_pt_gen_pf) && (min_eta_gen_pf < o2::aod::mcparticle::eta && o2::aod::mcparticle::eta < max_eta_gen_pf); + Partition mcNegLeptonsPF = o2::aod::mcparticle::pdgCode == pdg_lepton && (min_pt_gen_pf < o2::aod::mcparticle::pt && o2::aod::mcparticle::pt < max_pt_gen_pf) && (min_eta_gen_pf < o2::aod::mcparticle::eta && o2::aod::mcparticle::eta < max_eta_gen_pf); + + void processMC(FilteredMcCollisions const& mcCollisions, aod::McParticles const& mcParticles) + { + runMC(mcCollisions, mcParticles); + } + PROCESS_SWITCH(studyMCTruth, processMC, "process", true); + + void processDummy(FilteredMcCollisions const&) {} + PROCESS_SWITCH(studyMCTruth, processDummy, "process Dummy", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc, TaskName{"study-mc-truth"})}; +} From 299fff5a168d43e870059edfe237bdb806a64ad9 Mon Sep 17 00:00:00 2001 From: Junlee Kim Date: Mon, 10 Feb 2025 18:46:47 +0100 Subject: [PATCH 0132/1650] [PWGCF] a new table with ML score (#9850) Co-authored-by: ALICE Action Bot --- PWGCF/DataModel/CorrelationsDerived.h | 16 +++++++ PWGCF/TableProducer/filter2Prong.cxx | 64 +++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/PWGCF/DataModel/CorrelationsDerived.h b/PWGCF/DataModel/CorrelationsDerived.h index d690518012a..d563b2b7c16 100644 --- a/PWGCF/DataModel/CorrelationsDerived.h +++ b/PWGCF/DataModel/CorrelationsDerived.h @@ -11,6 +11,8 @@ #ifndef PWGCF_DATAMODEL_CORRELATIONSDERIVED_H_ #define PWGCF_DATAMODEL_CORRELATIONSDERIVED_H_ +#include + #include "Framework/ASoA.h" #include "Framework/AnalysisDataModel.h" #include "Common/DataModel/Centrality.h" @@ -117,6 +119,20 @@ DECLARE_SOA_TABLE(CF2ProngTracks, "AOD", "CF2PRONGTRACK", //! Reduced track tabl cf2prongtrack::CFTrackProng1Id, cf2prongtrack::Pt, cf2prongtrack::Eta, cf2prongtrack::Phi, cf2prongtrack::InvMass, cf2prongtrack::Decay); using CF2ProngTrack = CF2ProngTracks::iterator; +//------ + +namespace cf2prongtrackml +{ +DECLARE_SOA_COLUMN(MlProbD0, mlProbD0, std::vector); //! +DECLARE_SOA_COLUMN(MlProbD0bar, mlProbD0bar, std::vector); //! +} // namespace cf2prongtrackml +DECLARE_SOA_TABLE(CF2ProngTrackmls, "AOD", "CF2PRONGTRACKML", //! Reduced track table + o2::soa::Index<>, + cftrack::CFCollisionId, + cf2prongtrackml::MlProbD0, cf2prongtrackml::MlProbD0bar); +using CF2ProngTrackml = CF2ProngTrackmls::iterator; +//------ + } // namespace o2::aod #endif // PWGCF_DATAMODEL_CORRELATIONSDERIVED_H_ diff --git a/PWGCF/TableProducer/filter2Prong.cxx b/PWGCF/TableProducer/filter2Prong.cxx index d4353ca9150..240f49e504c 100644 --- a/PWGCF/TableProducer/filter2Prong.cxx +++ b/PWGCF/TableProducer/filter2Prong.cxx @@ -8,6 +8,8 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +#include + #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" @@ -35,8 +37,70 @@ struct Filter2Prong { HfHelper hfHelper; Produces output2ProngTracks; + Produces output2ProngTrackmls; using HFCandidates = soa::Join; + using HFCandidatesML = soa::Join; + + void processDataML(aod::Collisions::iterator const&, aod::BCsWithTimestamps const&, aod::CFCollRefs const& cfcollisions, aod::CFTrackRefs const& cftracks, HFCandidatesML const& candidates) + { + if (cfcollisions.size() <= 0 || cftracks.size() <= 0) + return; // rejected collision + if (cfgVerbosity > 0 && candidates.size() > 0) + LOGF(info, "Candidates for collision: %lu, cfcollisions: %lu, CFTracks: %lu", candidates.size(), cfcollisions.size(), cftracks.size()); + for (auto& c : candidates) { + int prongCFId[2] = {-1, -1}; + for (auto& cftrack : cftracks) { + if (c.prong0Id() == cftrack.trackId()) { + prongCFId[0] = cftrack.globalIndex(); + break; + } + } + for (auto& cftrack : cftracks) { + if (c.prong1Id() == cftrack.trackId()) { + prongCFId[1] = cftrack.globalIndex(); + break; + } + } + // look-up the collision id + if ((c.hfflag() & (1 << aod::hf_cand_2prong::DecayType::D0ToPiK)) == 0) + continue; + if (cfgYMax >= 0.0f && std::abs(hfHelper.yD0(c)) > cfgYMax) + continue; + + std::vector mlvecd{}; + std::vector mlvecdbar{}; + + if (c.isSelD0() > 0) { + output2ProngTracks(cfcollisions.begin().globalIndex(), + prongCFId[0], prongCFId[1], c.pt(), c.eta(), c.phi(), hfHelper.invMassD0ToPiK(c), aod::cf2prongtrack::D0ToPiK); + for (float val : c.mlProbD0()) { + mlvecd.push_back(val); + } + for (float val : c.mlProbD0bar()) { + mlvecdbar.push_back(val); + } + output2ProngTrackmls(cfcollisions.begin().globalIndex(), mlvecd, mlvecdbar); + } + + mlvecd.clear(); + mlvecdbar.clear(); + + if (c.isSelD0bar() > 0) { + output2ProngTracks(cfcollisions.begin().globalIndex(), + prongCFId[0], prongCFId[1], c.pt(), c.eta(), c.phi(), hfHelper.invMassD0barToKPi(c), aod::cf2prongtrack::D0barToKPi); + for (float val : c.mlProbD0()) { + mlvecd.push_back(val); + } + for (float val : c.mlProbD0bar()) { + mlvecdbar.push_back(val); + } + output2ProngTrackmls(cfcollisions.begin().globalIndex(), mlvecd, mlvecdbar); + } + } + } + PROCESS_SWITCH(Filter2Prong, processDataML, "Process data D0 candidates with ML", false); + void processData(aod::Collisions::iterator const&, aod::BCsWithTimestamps const&, aod::CFCollRefs const& cfcollisions, aod::CFTrackRefs const& cftracks, HFCandidates const& candidates) { if (cfcollisions.size() <= 0 || cftracks.size() <= 0) From c18ca13ea38bc541da45ae52364221758e955aed Mon Sep 17 00:00:00 2001 From: Luca Barioglio Date: Mon, 10 Feb 2025 19:21:55 +0100 Subject: [PATCH 0133/1650] Add full TPC to flowQC.cxx (#9856) --- PWGLF/TableProducer/QC/flowQC.cxx | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/PWGLF/TableProducer/QC/flowQC.cxx b/PWGLF/TableProducer/QC/flowQC.cxx index 9dab0a906f0..6e33f5561f0 100644 --- a/PWGLF/TableProducer/QC/flowQC.cxx +++ b/PWGLF/TableProducer/QC/flowQC.cxx @@ -67,9 +67,10 @@ enum qVecDetectors { kFT0A, kTPCl, kTPCr, + kTPC, kNqVecDetectors }; -static const std::vector qVecDetectorNames{"FT0C", "FT0A", "TPCl", "TPCr"}; +static const std::vector qVecDetectorNames{"FT0C", "FT0A", "TPCl", "TPCr", "TPC"}; enum methods { kEP = 0, @@ -112,7 +113,7 @@ struct flowQC { // Flow analysis using CollWithEPandQvec = soa::Join::iterator; + aod::EvSels, aod::CentFT0As, aod::CentFT0Cs, aod::CentFT0Ms, aod::CentFV0As, aod::FT0Mults, aod::FV0Mults, aod::TPCMults, aod::EPCalibrationTables, aod::QvectorFT0Cs, aod::QvectorFT0As, aod::QvectorFT0Ms, aod::QvectorFV0As, aod::QvectorBTots, aod::QvectorBPoss, aod::QvectorBNegs>::iterator; HistogramRegistry general{"general", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry flow_ep{"flow_ep", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; @@ -278,6 +279,11 @@ struct flowQC { float QyTPCr_EP = std::sin(2 * psiTPCr_EP); float QmodTPCr_EP = std::hypot(QxTPCr_EP, QyTPCr_EP); + float psiTPC_EP = collision.psiTPC(); + float QxTPC_EP = std::cos(2 * psiTPC_EP); + float QyTPC_EP = std::sin(2 * psiTPC_EP); + float QmodTPC_EP = std::hypot(QxTPC_EP, QyTPC_EP); + // Qvec method float QxFT0A_Qvec = collision.qvecFT0ARe(); float QyFT0A_Qvec = collision.qvecFT0AIm(); @@ -299,10 +305,15 @@ struct flowQC { float QmodTPCr_Qvec = std::hypot(QxTPCr_Qvec, QyTPCr_Qvec); float psiTPCr_Qvec = computeEventPlane(QyTPCr_Qvec, QxTPCr_Qvec); - std::array vec_Qx[2] = {{QxFT0C_EP, QxFT0A_EP, QxTPCl_EP, QxTPCr_EP}, {QxFT0C_Qvec, QxFT0A_Qvec, QxTPCl_Qvec, QxTPCr_Qvec}}; - std::array vec_Qy[2] = {{QyFT0C_EP, QyFT0A_EP, QyTPCl_EP, QyTPCr_EP}, {QyFT0C_Qvec, QyFT0A_Qvec, QyTPCl_Qvec, QyTPCr_Qvec}}; - std::array vec_Qmod[2] = {{QmodFT0C_EP, QmodFT0A_EP, QmodTPCl_EP, QmodTPCr_EP}, {QmodFT0C_Qvec, QmodFT0A_Qvec, QmodTPCl_Qvec, QmodTPCr_Qvec}}; - std::array vec_Qpsi[2] = {{psiFT0C_EP, psiFT0A_EP, psiTPCl_EP, psiTPCr_EP}, {psiFT0C_Qvec, psiFT0A_Qvec, psiTPCl_Qvec, psiTPCr_Qvec}}; + float QxTPC_Qvec = collision.qvecBTotRe(); + float QyTPC_Qvec = collision.qvecBTotIm(); + float QmodTPC_Qvec = std::hypot(QxTPC_Qvec, QyTPC_Qvec); + float psiTPC_Qvec = computeEventPlane(QyTPC_Qvec, QxTPC_Qvec); + + std::array vec_Qx[2] = {{QxFT0C_EP, QxFT0A_EP, QxTPCl_EP, QxTPCr_EP, QxTPC_EP}, {QxFT0C_Qvec, QxFT0A_Qvec, QxTPCl_Qvec, QxTPCr_Qvec, QxTPC_Qvec}}; + std::array vec_Qy[2] = {{QyFT0C_EP, QyFT0A_EP, QyTPCl_EP, QyTPCr_EP, QyTPC_EP}, {QyFT0C_Qvec, QyFT0A_Qvec, QyTPCl_Qvec, QyTPCr_Qvec, QyTPC_Qvec}}; + std::array vec_Qmod[2] = {{QmodFT0C_EP, QmodFT0A_EP, QmodTPCl_EP, QmodTPCr_EP, QmodTPC_EP}, {QmodFT0C_Qvec, QmodFT0A_Qvec, QmodTPCl_Qvec, QmodTPCr_Qvec, QmodTPC_Qvec}}; + std::array vec_Qpsi[2] = {{psiFT0C_EP, psiFT0A_EP, psiTPCl_EP, psiTPCr_EP, psiTPC_EP}, {psiFT0C_Qvec, psiFT0A_Qvec, psiTPCl_Qvec, psiTPCr_Qvec, psiTPC_Qvec}}; for (int iMethod = 0; iMethod < methods::kNmethods; iMethod++) { for (int iQvecDet = 0; iQvecDet < qVecDetectors::kNqVecDetectors; iQvecDet++) { From ea5eb26fc60804e43d6a3b729f2acfebf47da824 Mon Sep 17 00:00:00 2001 From: Fabrizio Date: Mon, 10 Feb 2025 19:26:31 +0100 Subject: [PATCH 0134/1650] [PWGHF,Trigger] Add option to require strangeness tracked Xi and XiPiPi channel (#9844) Co-authored-by: ALICE Action Bot --- EventFiltering/PWGHF/HFFilter.cxx | 233 ++++++++++++------ EventFiltering/PWGHF/HFFilterHelpers.h | 215 +++++++++++++++- .../PWGHF/HFFilterPrepareMLSamples.cxx | 2 +- EventFiltering/filterTables.h | 40 +-- 4 files changed, 378 insertions(+), 112 deletions(-) diff --git a/EventFiltering/PWGHF/HFFilter.cxx b/EventFiltering/PWGHF/HFFilter.cxx index 02a88ec2f47..df79c6d63fa 100644 --- a/EventFiltering/PWGHF/HFFilter.cxx +++ b/EventFiltering/PWGHF/HFFilter.cxx @@ -111,8 +111,9 @@ struct HfFilter { // Main struct for HF triggers // parameters for charm baryons to Xi bachelor Configurable> cutsXiCascades{"cutsXiCascades", {cutsCascades[0], 1, 8, labelsEmpty, labelsColumnsCascades}, "Selections for cascades (Xi) for Xi+bachelor triggers"}; - Configurable> cutsXiBachelor{"cutsXiBachelor", {cutsCharmBaryons[0], 1, 4, labelsEmpty, labelsColumnsCharmBaryons}, "Selections for charm baryons (Xi+Pi and Xi+Ka)"}; + Configurable> cutsXiBachelor{"cutsXiBachelor", {cutsCharmBaryons[0], 1, 8, labelsEmpty, labelsColumnsCharmBarCuts}, "Selections for charm baryons (Xi+Pi, Xi+Ka, Xi+Pi+Pi)"}; Configurable> cutsTrackCharmBaryonBachelor{"cutsTrackCharmBaryonBachelor", {hf_cuts_single_track::cutsTrack[0], hf_cuts_single_track::nBinsPtTrack, hf_cuts_single_track::nCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for charm-baryon bachelor candidates"}; + Configurable> requireStrangenessTracking{"requireStrangenessTracking", {requireStrangenessTrackedXi[0], 1, 2, labelsEmpty, labelsColumnsCharmBaryons}, "Flags to require strangeness tracking for channels with Xi"}; // parameters for ML application Configurable> pTBinsBDT{"pTBinsBDT", std::vector{hf_cuts_bdt_multiclass::vecBinsPt}, "track pT bin limits for BDT cut"}; @@ -166,7 +167,7 @@ struct HfFilter { // Main struct for HF triggers std::array, kNCharmParticles> hCharmProtonKstarDistr{}; std::array, kNCharmParticles> hCharmDeuteronKstarDistr{}; std::array, kNBeautyParticles> hMassVsPtB{}; - std::array, kNCharmParticles + 17> hMassVsPtC{}; // +9 for resonances (D*+, D*0, Ds*+, Ds1+, Ds2*+, Xic+* right sign, Xic+* wrong sign, Xic0* right sign, Xic0* wrong sign) +2 for SigmaC (SigmaC++, SigmaC0) +2 for SigmaCK pairs (SigmaC++K-, SigmaC0K0s) +2 for charm baryons (Xi+Pi, Xi+Ka) + std::array, kNCharmParticles + 18> hMassVsPtC{}; // +9 for resonances (D*+, D*0, Ds*+, Ds1+, Ds2*+, Xic+* right sign, Xic+* wrong sign, Xic0* right sign, Xic0* wrong sign) +2 for SigmaC (SigmaC++, SigmaC0) +2 for SigmaCK pairs (SigmaC++K-, SigmaC0K0s) +3 for charm baryons (Xi+Pi, Xi+Ka, Xi+Pi+Pi) std::shared_ptr hProtonTPCPID, hProtonTOFPID; std::shared_ptr hDeuteronTPCPID, hDeuteronTOFPID; std::array, kNCharmParticles> hBDTScoreBkg{}; @@ -174,7 +175,7 @@ struct HfFilter { // Main struct for HF triggers std::array, kNCharmParticles> hBDTScoreNonPrompt{}; std::array, kNV0> hArmPod{}; std::shared_ptr hV0Selected; - std::shared_ptr hMassXi; + std::array, 2> hMassXi{}; // not tracked and tracked std::array, kNBeautyParticles> hCpaVsPtB{}; std::array, kNBeautyParticles> hDecayLengthVsPtB{}; std::array, kNBeautyParticles> hImpactParamProductVsPtB{}; @@ -209,6 +210,7 @@ struct HfFilter { // Main struct for HF triggers helper.setForceTofForFemto(forceTofProtonForFemto, forceTofDeuteronForFemto); helper.setV0Selections(cutsGammaK0sLambda->get(0u, 0u), cutsGammaK0sLambda->get(0u, 1u), cutsGammaK0sLambda->get(0u, 2u), cutsGammaK0sLambda->get(0u, 3u), cutsGammaK0sLambda->get(0u, 4u), cutsGammaK0sLambda->get(0u, 5u)); helper.setXiSelections(cutsXiCascades->get(0u, 0u), cutsXiCascades->get(0u, 1u), cutsXiCascades->get(0u, 2u), cutsXiCascades->get(0u, 3u), cutsXiCascades->get(0u, 4u), cutsXiCascades->get(0u, 5u), cutsXiCascades->get(0u, 6u), cutsXiCascades->get(0u, 7u)); + helper.setXiBachelorSelections(cutsXiBachelor->get(0u, 0u), cutsXiBachelor->get(0u, 1u), cutsXiBachelor->get(0u, 2u), cutsXiBachelor->get(0u, 3u), cutsXiBachelor->get(0u, 4u), cutsXiBachelor->get(0u, 5u), cutsXiBachelor->get(0u, 6u), cutsXiBachelor->get(0u, 7u)); helper.setNsigmaPiCutsForCharmBaryonBachelor(nSigmaPidCuts->get(0u, 4u), nSigmaPidCuts->get(1u, 4u)); helper.setTpcPidCalibrationOption(setTPCCalib); helper.setMassResolParametrisation(paramCharmMassShape); @@ -218,13 +220,14 @@ struct HfFilter { // Main struct for HF triggers helper.setPtRangeSoftKaonXicResoToSigmaC(ptCuts->get(0u, 5u), ptCuts->get(1u, 5u)); helper.setVtxConfiguration(dfStrangeness, true); // (DCAFitterN, useAbsDCA) dfStrangeness.setMatCorrType(matCorr); + helper.setVtxConfiguration(df2, false); // (DCAFitterN, useAbsDCA) + helper.setVtxConfiguration(df3, false); if (activateSecVtxForB) { - helper.setVtxConfiguration(df2, false); // (DCAFitterN, useAbsDCA) - helper.setVtxConfiguration(df3, false); helper.setVtxConfiguration(dfB, true); helper.setVtxConfiguration(dfBtoDstar, true); } - hProcessedEvents = registry.add("fProcessedEvents", "HF - event filtered;;counts", HistType::kTH1F, {{kNtriggersHF + 2, -0.5, +kNtriggersHF + 1.5}}); + + hProcessedEvents = registry.add("fProcessedEvents", "HF - event filtered;;counts", HistType::kTH1D, {{kNtriggersHF + 2, -0.5, +kNtriggersHF + 1.5}}); for (auto iBin = 0; iBin < kNtriggersHF + 2; ++iBin) { if (iBin < 2) hProcessedEvents->GetXaxis()->SetBinLabel(iBin + 1, eventTitles[iBin].data()); @@ -233,47 +236,48 @@ struct HfFilter { // Main struct for HF triggers } if (activateQA) { - hN2ProngCharmCand = registry.add("fN2ProngCharmCand", "Number of 2-prong charm candidates per event;#it{N}_{candidates};counts", HistType::kTH1F, {{50, -0.5, 49.5}}); - hN3ProngCharmCand = registry.add("fN3ProngCharmCand", "Number of 3-prong charm candidates per event;#it{N}_{candidates};counts", HistType::kTH1F, {{50, -0.5, 49.5}}); + hN2ProngCharmCand = registry.add("fN2ProngCharmCand", "Number of 2-prong charm candidates per event;#it{N}_{candidates};counts", HistType::kTH1D, {{50, -0.5, 49.5}}); + hN3ProngCharmCand = registry.add("fN3ProngCharmCand", "Number of 3-prong charm candidates per event;#it{N}_{candidates};counts", HistType::kTH1D, {{50, -0.5, 49.5}}); for (int iCharmPart{0}; iCharmPart < kNCharmParticles; ++iCharmPart) { - hCharmHighPt[iCharmPart] = registry.add(Form("f%sHighPt", charmParticleNames[iCharmPart].data()), Form("#it{p}_{T} distribution of triggered high-#it{p}_{T} %s candidates;#it{p}_{T} (GeV/#it{c});counts", charmParticleNames[iCharmPart].data()), HistType::kTH1F, {ptAxis}); - hCharmProtonKstarDistr[iCharmPart] = registry.add(Form("f%sProtonKstarDistr", charmParticleNames[iCharmPart].data()), Form("#it{k}* distribution of triggered p#minus%s pairs;#it{k}* (GeV/#it{c});counts", charmParticleNames[iCharmPart].data()), HistType::kTH1F, {kstarAxis}); - hCharmDeuteronKstarDistr[iCharmPart] = registry.add(Form("f%sDeuteronKstarDistr", charmParticleNames[iCharmPart].data()), Form("#it{k}* distribution of triggered de%s pairs;#it{k}* (GeV/#it{c});counts", charmParticleNames[iCharmPart].data()), HistType::kTH1F, {kstarAxis}); - hMassVsPtC[iCharmPart] = registry.add(Form("fMassVsPt%s", charmParticleNames[iCharmPart].data()), Form("#it{M} vs. #it{p}_{T} distribution of triggered %s candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", charmParticleNames[iCharmPart].data()), HistType::kTH2F, {ptAxis, massAxisC[iCharmPart]}); + hCharmHighPt[iCharmPart] = registry.add(Form("f%sHighPt", charmParticleNames[iCharmPart].data()), Form("#it{p}_{T} distribution of triggered high-#it{p}_{T} %s candidates;#it{p}_{T} (GeV/#it{c});counts", charmParticleNames[iCharmPart].data()), HistType::kTH1D, {ptAxis}); + hCharmProtonKstarDistr[iCharmPart] = registry.add(Form("f%sProtonKstarDistr", charmParticleNames[iCharmPart].data()), Form("#it{k}* distribution of triggered p#minus%s pairs;#it{k}* (GeV/#it{c});counts", charmParticleNames[iCharmPart].data()), HistType::kTH1D, {kstarAxis}); + hCharmDeuteronKstarDistr[iCharmPart] = registry.add(Form("f%sDeuteronKstarDistr", charmParticleNames[iCharmPart].data()), Form("#it{k}* distribution of triggered de%s pairs;#it{k}* (GeV/#it{c});counts", charmParticleNames[iCharmPart].data()), HistType::kTH1D, {kstarAxis}); + hMassVsPtC[iCharmPart] = registry.add(Form("fMassVsPt%s", charmParticleNames[iCharmPart].data()), Form("#it{M} vs. #it{p}_{T} distribution of triggered %s candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", charmParticleNames[iCharmPart].data()), HistType::kTH2D, {ptAxis, massAxisC[iCharmPart]}); if (activateQA > 1) { - hBDTScoreBkg[iCharmPart] = registry.add(Form("f%sBDTScoreBkgDistr", charmParticleNames[iCharmPart].data()), Form("BDT background score distribution for %s;BDT background score;counts", charmParticleNames[iCharmPart].data()), HistType::kTH1F, {bdtAxis}); - hBDTScorePrompt[iCharmPart] = registry.add(Form("f%sBDTScorePromptDistr", charmParticleNames[iCharmPart].data()), Form("BDT prompt score distribution for %s;BDT prompt score;counts", charmParticleNames[iCharmPart].data()), HistType::kTH1F, {bdtAxis}); - hBDTScoreNonPrompt[iCharmPart] = registry.add(Form("f%sBDTScoreNonPromptDistr", charmParticleNames[iCharmPart].data()), Form("BDT nonprompt score distribution for %s;BDT nonprompt score;counts", charmParticleNames[iCharmPart].data()), HistType::kTH1F, {bdtAxis}); + hBDTScoreBkg[iCharmPart] = registry.add(Form("f%sBDTScoreBkgDistr", charmParticleNames[iCharmPart].data()), Form("BDT background score distribution for %s;BDT background score;counts", charmParticleNames[iCharmPart].data()), HistType::kTH1D, {bdtAxis}); + hBDTScorePrompt[iCharmPart] = registry.add(Form("f%sBDTScorePromptDistr", charmParticleNames[iCharmPart].data()), Form("BDT prompt score distribution for %s;BDT prompt score;counts", charmParticleNames[iCharmPart].data()), HistType::kTH1D, {bdtAxis}); + hBDTScoreNonPrompt[iCharmPart] = registry.add(Form("f%sBDTScoreNonPromptDistr", charmParticleNames[iCharmPart].data()), Form("BDT nonprompt score distribution for %s;BDT nonprompt score;counts", charmParticleNames[iCharmPart].data()), HistType::kTH1D, {bdtAxis}); } } // charm resonances - hMassVsPtC[kNCharmParticles] = registry.add("fMassVsPtDStarPlus", "#Delta#it{M} vs. #it{p}_{T} distribution of triggered DStarPlus candidates;#it{p}_{T} (GeV/#it{c});#Delta#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2F, {ptAxis, massAxisC[kNCharmParticles]}); - hMassVsPtC[kNCharmParticles + 1] = registry.add("fMassVsPtDStarZero", "#Delta#it{M} vs. #it{p}_{T} distribution of triggered DStarZero candidates;#it{p}_{T} (GeV/#it{c});#Delta#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2F, {ptAxis, massAxisC[kNCharmParticles + 1]}); - hMassVsPtC[kNCharmParticles + 2] = registry.add("fMassVsPtDStarS", "#Delta#it{M} vs. #it{p}_{T} distribution of triggered DStarS candidates;#it{p}_{T} (GeV/#it{c});#Delta#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2F, {ptAxis, massAxisC[kNCharmParticles + 2]}); - hMassVsPtC[kNCharmParticles + 3] = registry.add("fMassVsPtDs1Plus", "#Delta#it{M} vs. #it{p}_{T} distribution of triggered Ds1Plus candidates;#it{p}_{T} (GeV/#it{c});#Delta#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2F, {ptAxis, massAxisC[kNCharmParticles + 3]}); - hMassVsPtC[kNCharmParticles + 4] = registry.add("fMassVsPtDs2StarPlus", "#Delta#it{M} vs. #it{p}_{T} distribution of triggered Ds2StarPlus candidates;#it{p}_{T} (GeV/#Delta#it{c});#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2F, {ptAxis, massAxisC[kNCharmParticles + 4]}); - hMassVsPtC[kNCharmParticles + 5] = registry.add("fMassVsPtXicStarToDplusLambda", "#Delta#it{M} vs. #it{p}_{T} distribution of triggered XicStar -> Dplus Lambda candidates;#it{p}_{T} (GeV/#it{c});#Delta#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2F, {ptAxis, massAxisC[kNCharmParticles + 5]}); - hMassVsPtC[kNCharmParticles + 6] = registry.add("fMassVsPtXicStarToDplusLambdaWrongSign", "#Delta#it{M} vs. #it{p}_{T} distribution of triggered opposite-sign XicStar -> Dplus Lambda candidates;#it{p}_{T} (GeV/#it{c});#Delta#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2F, {ptAxis, massAxisC[kNCharmParticles + 6]}); - hMassVsPtC[kNCharmParticles + 7] = registry.add("fMassVsPtXicStarToD0Lambda", "#Delta#it{M} vs. #it{p}_{T} distribution of triggered XicStar -> D0 Lambda candidates;#it{p}_{T} (GeV/#it{c});#Delta#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2F, {ptAxis, massAxisC[kNCharmParticles + 7]}); - hMassVsPtC[kNCharmParticles + 8] = registry.add("fMassVsPtXicStarToD0LambdaWrongSign", "#Delta#it{M} vs. #it{p}_{T} distribution of triggered opposite-sign XicStar -> D0 Lambda candidates;#it{p}_{T} (GeV/#it{c});#Delta#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2F, {ptAxis, massAxisC[kNCharmParticles + 8]}); + hMassVsPtC[kNCharmParticles] = registry.add("fMassVsPtDStarPlus", "#Delta#it{M} vs. #it{p}_{T} distribution of triggered DStarPlus candidates;#it{p}_{T} (GeV/#it{c});#Delta#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles]}); + hMassVsPtC[kNCharmParticles + 1] = registry.add("fMassVsPtDStarZero", "#Delta#it{M} vs. #it{p}_{T} distribution of triggered DStarZero candidates;#it{p}_{T} (GeV/#it{c});#Delta#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 1]}); + hMassVsPtC[kNCharmParticles + 2] = registry.add("fMassVsPtDStarS", "#Delta#it{M} vs. #it{p}_{T} distribution of triggered DStarS candidates;#it{p}_{T} (GeV/#it{c});#Delta#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 2]}); + hMassVsPtC[kNCharmParticles + 3] = registry.add("fMassVsPtDs1Plus", "#Delta#it{M} vs. #it{p}_{T} distribution of triggered Ds1Plus candidates;#it{p}_{T} (GeV/#it{c});#Delta#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 3]}); + hMassVsPtC[kNCharmParticles + 4] = registry.add("fMassVsPtDs2StarPlus", "#Delta#it{M} vs. #it{p}_{T} distribution of triggered Ds2StarPlus candidates;#it{p}_{T} (GeV/#Delta#it{c});#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 4]}); + hMassVsPtC[kNCharmParticles + 5] = registry.add("fMassVsPtXicStarToDplusLambda", "#Delta#it{M} vs. #it{p}_{T} distribution of triggered XicStar -> Dplus Lambda candidates;#it{p}_{T} (GeV/#it{c});#Delta#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 5]}); + hMassVsPtC[kNCharmParticles + 6] = registry.add("fMassVsPtXicStarToDplusLambdaWrongSign", "#Delta#it{M} vs. #it{p}_{T} distribution of triggered opposite-sign XicStar -> Dplus Lambda candidates;#it{p}_{T} (GeV/#it{c});#Delta#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 6]}); + hMassVsPtC[kNCharmParticles + 7] = registry.add("fMassVsPtXicStarToD0Lambda", "#Delta#it{M} vs. #it{p}_{T} distribution of triggered XicStar -> D0 Lambda candidates;#it{p}_{T} (GeV/#it{c});#Delta#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 7]}); + hMassVsPtC[kNCharmParticles + 8] = registry.add("fMassVsPtXicStarToD0LambdaWrongSign", "#Delta#it{M} vs. #it{p}_{T} distribution of triggered opposite-sign XicStar -> D0 Lambda candidates;#it{p}_{T} (GeV/#it{c});#Delta#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 8]}); // SigmaC0,++ - hMassVsPtC[kNCharmParticles + 9] = registry.add("fMassVsPtSigmaCPlusPlus", "#it{M}(pK#pi#pi)-M(pK#pi) vs. #it{p}_{T} distribution of #Sigma_{c}^{++} candidates for triggers;#it{p}_{T}(#Sigma_{c}^{++}) (GeV/#it{c});#it{M}(pK#pi#pi)-M(pK#pi);counts", HistType::kTH2F, {ptAxis, massAxisC[kNCharmParticles + 9]}); - hMassVsPtC[kNCharmParticles + 10] = registry.add("fMassVsPtSigmaC0", "#it{M}(pK#pi#pi)-M(pK#pi) vs. #it{p}_{T} distribution of #Sigma_{c}^{0} candidates for triggers;#it{p}_{T}(#Sigma_{c}^{0}) (GeV/#it{c});#it{M}(pK#pi#pi)-M(pK#pi);counts", HistType::kTH2F, {ptAxis, massAxisC[kNCharmParticles + 10]}); + hMassVsPtC[kNCharmParticles + 9] = registry.add("fMassVsPtSigmaCPlusPlus", "#it{M}(pK#pi#pi)-M(pK#pi) vs. #it{p}_{T} distribution of #Sigma_{c}^{++} candidates for triggers;#it{p}_{T}(#Sigma_{c}^{++}) (GeV/#it{c});#it{M}(pK#pi#pi)-M(pK#pi);counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 9]}); + hMassVsPtC[kNCharmParticles + 10] = registry.add("fMassVsPtSigmaC0", "#it{M}(pK#pi#pi)-M(pK#pi) vs. #it{p}_{T} distribution of #Sigma_{c}^{0} candidates for triggers;#it{p}_{T}(#Sigma_{c}^{0}) (GeV/#it{c});#it{M}(pK#pi#pi)-M(pK#pi);counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 10]}); // SigmaCKaon pairs - hMassVsPtC[kNCharmParticles + 11] = registry.add("fMassVsPtSigmaC2455PlusPlusKaMinus", "#it{M}(#Sigma_{c}^{++}K^{-}(2455)) vs. #it{p}_{T} distribution of of triggered #Sigma_{c}^{++}K^{-} pairs;#it{p}_{T} (GeV/#it{c});#it{M}(#Sigma_{c}^{++}K^{-});counts", HistType::kTH2F, {ptAxis, massAxisC[kNCharmParticles + 11]}); - hMassVsPtC[kNCharmParticles + 12] = registry.add("fMassVsPtSigmaC2520PlusPlusKaMinus", "#it{M}(#Sigma_{c}^{++}K^{-}(2520)) vs. #it{p}_{T} distribution of of triggered #Sigma_{c}^{++}K^{-} pairs;#it{p}_{T} (GeV/#it{c});#it{M}(#Sigma_{c}^{++}K^{-});counts", HistType::kTH2F, {ptAxis, massAxisC[kNCharmParticles + 12]}); - hMassVsPtC[kNCharmParticles + 13] = registry.add("fMassVsPtSigmaC02455Ka0s", "#it{M}(#Sigma_{c}^{0}K^{0}_{s}(2455)) vs. #it{p}_{T} distribution of of triggered #Sigma_{c}^{0}K^{0}_{s} pairs;#it{p}_{T} (GeV/#it{c});#it{M}(#Sigma_{c}^{++}K^{-});counts", HistType::kTH2F, {ptAxis, massAxisC[kNCharmParticles + 13]}); - hMassVsPtC[kNCharmParticles + 14] = registry.add("fMassVsPtSigmaC02520Ka0s", "#it{M}(#Sigma_{c}^{0}K^{0}_{s}(2520)) vs. #it{p}_{T} distribution of of triggered #Sigma_{c}^{0}K^{0}_{s} pairs;#it{p}_{T} (GeV/#it{c});#it{M}(#Sigma_{c}^{++}K^{-});counts", HistType::kTH2F, {ptAxis, massAxisC[kNCharmParticles + 14]}); + hMassVsPtC[kNCharmParticles + 11] = registry.add("fMassVsPtSigmaC2455PlusPlusKaMinus", "#it{M}(#Sigma_{c}^{++}K^{-}(2455)) vs. #it{p}_{T} distribution of of triggered #Sigma_{c}^{++}K^{-} pairs;#it{p}_{T} (GeV/#it{c});#it{M}(#Sigma_{c}^{++}K^{-});counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 11]}); + hMassVsPtC[kNCharmParticles + 12] = registry.add("fMassVsPtSigmaC2520PlusPlusKaMinus", "#it{M}(#Sigma_{c}^{++}K^{-}(2520)) vs. #it{p}_{T} distribution of of triggered #Sigma_{c}^{++}K^{-} pairs;#it{p}_{T} (GeV/#it{c});#it{M}(#Sigma_{c}^{++}K^{-});counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 12]}); + hMassVsPtC[kNCharmParticles + 13] = registry.add("fMassVsPtSigmaC02455Ka0s", "#it{M}(#Sigma_{c}^{0}K^{0}_{s}(2455)) vs. #it{p}_{T} distribution of of triggered #Sigma_{c}^{0}K^{0}_{s} pairs;#it{p}_{T} (GeV/#it{c});#it{M}(#Sigma_{c}^{++}K^{-});counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 13]}); + hMassVsPtC[kNCharmParticles + 14] = registry.add("fMassVsPtSigmaC02520Ka0s", "#it{M}(#Sigma_{c}^{0}K^{0}_{s}(2520)) vs. #it{p}_{T} distribution of of triggered #Sigma_{c}^{0}K^{0}_{s} pairs;#it{p}_{T} (GeV/#it{c});#it{M}(#Sigma_{c}^{++}K^{-});counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 14]}); // charm baryons to LF cascades - hMassVsPtC[kNCharmParticles + 15] = registry.add("fMassVsPtCharmBaryonToXiPi", "#it{M} vs. #it{p}_{T} distribution of triggered #Xi+#pi candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2F, {ptAxis, massAxisC[kNCharmParticles + 15]}); - hMassVsPtC[kNCharmParticles + 16] = registry.add("fMassVsPtCharmBaryonToXiKa", "#it{M} vs. #it{p}_{T} distribution of triggered #Xi+K candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2F, {ptAxis, massAxisC[kNCharmParticles + 16]}); + hMassVsPtC[kNCharmParticles + 15] = registry.add("fMassVsPtCharmBaryonToXiPi", "#it{M} vs. #it{p}_{T} distribution of triggered #Xi+#pi candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 15]}); + hMassVsPtC[kNCharmParticles + 16] = registry.add("fMassVsPtCharmBaryonToXiKa", "#it{M} vs. #it{p}_{T} distribution of triggered #Xi+K candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 16]}); + hMassVsPtC[kNCharmParticles + 17] = registry.add("fMassVsPtCharmBaryonToXiPiPi", "#it{M} vs. #it{p}_{T} distribution of triggered #Xi+K candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 17]}); for (int iBeautyPart{0}; iBeautyPart < kNBeautyParticles; ++iBeautyPart) { - hMassVsPtB[iBeautyPart] = registry.add(Form("fMassVsPt%s", beautyParticleNames[iBeautyPart].data()), Form("#it{M} vs. #it{p}_{T} distribution of triggered %s candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", beautyParticleNames[iBeautyPart].data()), HistType::kTH2F, {ptAxis, massAxisB[iBeautyPart]}); - hCpaVsPtB[iBeautyPart] = registry.add(Form("fCpaVsPt%s", beautyParticleNames[iBeautyPart].data()), Form("CPA vs. #it{p}_{T} distribution of triggered %s candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", beautyParticleNames[iBeautyPart].data()), HistType::kTH2F, {ptAxis, {100, -1, 1}}); - hDecayLengthVsPtB[iBeautyPart] = registry.add(Form("fDecayLengthVsPt%s", beautyParticleNames[iBeautyPart].data()), Form("DecayLength vs. #it{p}_{T} distribution of triggered %s candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", beautyParticleNames[iBeautyPart].data()), HistType::kTH2F, {ptAxis, {100, 0, 20}}); + hMassVsPtB[iBeautyPart] = registry.add(Form("fMassVsPt%s", beautyParticleNames[iBeautyPart].data()), Form("#it{M} vs. #it{p}_{T} distribution of triggered %s candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", beautyParticleNames[iBeautyPart].data()), HistType::kTH2D, {ptAxis, massAxisB[iBeautyPart]}); + hCpaVsPtB[iBeautyPart] = registry.add(Form("fCpaVsPt%s", beautyParticleNames[iBeautyPart].data()), Form("CPA vs. #it{p}_{T} distribution of triggered %s candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", beautyParticleNames[iBeautyPart].data()), HistType::kTH2D, {ptAxis, {100, -1, 1}}); + hDecayLengthVsPtB[iBeautyPart] = registry.add(Form("fDecayLengthVsPt%s", beautyParticleNames[iBeautyPart].data()), Form("DecayLength vs. #it{p}_{T} distribution of triggered %s candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", beautyParticleNames[iBeautyPart].data()), HistType::kTH2D, {ptAxis, {100, 0, 20}}); if (iBeautyPart != kB0toDStar) { - hImpactParamProductVsPtB[iBeautyPart] = registry.add(Form("fImpactParamProductVsPt%s", beautyParticleNames[iBeautyPart].data()), Form("ImpactParamProduct vs. #it{p}_{T} distribution of triggered %s candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", beautyParticleNames[iBeautyPart].data()), HistType::kTH2F, {ptAxis, {100, -2.5, +2.5}}); + hImpactParamProductVsPtB[iBeautyPart] = registry.add(Form("fImpactParamProductVsPt%s", beautyParticleNames[iBeautyPart].data()), Form("ImpactParamProduct vs. #it{p}_{T} distribution of triggered %s candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", beautyParticleNames[iBeautyPart].data()), HistType::kTH2D, {ptAxis, {100, -2.5, +2.5}}); } } constexpr int kNBinsHfVtxStages = kNHfVtxStage; @@ -282,7 +286,7 @@ struct HfFilter { // Main struct for HF triggers labels[HfVtxStage::BeautyVertex] = "vertex CharmHad-Pi pairs"; labels[HfVtxStage::CharmHadPiSelected] = "selected CharmHad-Pi pairs"; static const AxisSpec axisHfVtxStages = {kNBinsHfVtxStages, 0.5, kNBinsHfVtxStages + 0.5, ""}; - registry.add("fHfVtxStages", "HfVtxStages;;entries", HistType::kTH2F, {axisHfVtxStages, {kNBeautyParticles, -0.5, +kNBeautyParticles - 0.5}}); + registry.add("fHfVtxStages", "HfVtxStages;;entries", HistType::kTH2D, {axisHfVtxStages, {kNBeautyParticles, -0.5, +kNBeautyParticles - 0.5}}); for (int iBin = 0; iBin < kNBinsHfVtxStages; iBin++) { registry.get(HIST("fHfVtxStages"))->GetXaxis()->SetBinLabel(iBin + 1, labels[iBin].data()); } @@ -291,17 +295,18 @@ struct HfFilter { // Main struct for HF triggers } for (int iV0{kPhoton}; iV0 < kNV0; ++iV0) { - hArmPod[iV0] = registry.add(Form("fArmPod%s", v0Names[iV0].data()), Form("Armenteros Podolanski plot for selected %s;#it{#alpha};#it{q}_{T} (GeV/#it{c})", v0Labels[iV0].data()), HistType::kTH2F, {alphaAxis, qtAxis}); + hArmPod[iV0] = registry.add(Form("fArmPod%s", v0Names[iV0].data()), Form("Armenteros Podolanski plot for selected %s;#it{#alpha};#it{q}_{T} (GeV/#it{c})", v0Labels[iV0].data()), HistType::kTH2D, {alphaAxis, qtAxis}); } - hMassXi = registry.add("fMassXi", "#it{M} distribution of #Xi candidates;#it{M} (GeV/#it{c}^{2});counts", HistType::kTH1F, {{100, 1.28f, 1.36f}}); + hMassXi[0] = registry.add("fMassXi", "#it{M} distribution of #Xi candidates;#it{M} (GeV/#it{c}^{2});counts", HistType::kTH1D, {{100, 1.28f, 1.36f}}); + hMassXi[1] = registry.add("fMassTrackedXi", "#it{M} distribution of #Xi candidates;#it{M} (GeV/#it{c}^{2});counts", HistType::kTH1D, {{100, 1.28f, 1.36f}}); if (activateQA > 1) { - hProtonTPCPID = registry.add("fProtonTPCPID", "#it{N}_{#sigma}^{TPC} vs. #it{p} for selected protons;#it{p} (GeV/#it{c});#it{N}_{#sigma}^{TPC}", HistType::kTH2F, {pAxis, nSigmaAxis}); - hProtonTOFPID = registry.add("fProtonTOFPID", "#it{N}_{#sigma}^{TOF} vs. #it{p} for selected protons;#it{p} (GeV/#it{c});#it{N}_{#sigma}^{TOF}", HistType::kTH2F, {pAxis, nSigmaAxis}); - hDeuteronTPCPID = registry.add("hDeuteronTPCPID", "#it{N}_{#sigma}^{TPC} vs. #it{p} for selected deuterons;#it{p} (GeV/#it{c});#it{N}_{#sigma}^{TPC}", HistType::kTH2F, {pAxis, nSigmaAxis}); - hDeuteronTOFPID = registry.add("hDeuteronTOFPID", "#it{N}_{#sigma}^{TOF} vs. #it{p} for selected deuterons;#it{p} (GeV/#it{c});#it{N}_{#sigma}^{TOF}", HistType::kTH2F, {pAxis, nSigmaAxis}); + hProtonTPCPID = registry.add("fProtonTPCPID", "#it{N}_{#sigma}^{TPC} vs. #it{p} for selected protons;#it{p} (GeV/#it{c});#it{N}_{#sigma}^{TPC}", HistType::kTH2D, {pAxis, nSigmaAxis}); + hProtonTOFPID = registry.add("fProtonTOFPID", "#it{N}_{#sigma}^{TOF} vs. #it{p} for selected protons;#it{p} (GeV/#it{c});#it{N}_{#sigma}^{TOF}", HistType::kTH2D, {pAxis, nSigmaAxis}); + hDeuteronTPCPID = registry.add("hDeuteronTPCPID", "#it{N}_{#sigma}^{TPC} vs. #it{p} for selected deuterons;#it{p} (GeV/#it{c});#it{N}_{#sigma}^{TPC}", HistType::kTH2D, {pAxis, nSigmaAxis}); + hDeuteronTOFPID = registry.add("hDeuteronTOFPID", "#it{N}_{#sigma}^{TOF} vs. #it{p} for selected deuterons;#it{p} (GeV/#it{c});#it{N}_{#sigma}^{TOF}", HistType::kTH2D, {pAxis, nSigmaAxis}); - hV0Selected = registry.add("fV0Selected", "Selections for V0s;;counts", HistType::kTH2F, {{9, -0.5, 8.5}, {kNV0, -0.5, +kNV0 - 0.5}}); + hV0Selected = registry.add("fV0Selected", "Selections for V0s;;counts", HistType::kTH2D, {{9, -0.5, 8.5}, {kNV0, -0.5, +kNV0 - 0.5}}); for (int iV0{kPhoton}; iV0 < kNV0; ++iV0) { hV0Selected->GetYaxis()->SetBinLabel(iV0 + 1, v0Labels[iV0].data()); @@ -342,11 +347,13 @@ struct HfFilter { // Main struct for HF triggers Preslice hf3ProngPerCollision = aod::track_association::collisionId; Preslice cascPerCollision = aod::cascade::collisionId; Preslice photonsPerCollision = aod::v0photonkf::collisionId; + PresliceUnsorted trackedCascadesPerCollision = aod::track::collisionId; void process(CollsWithEvSel const& collisions, aod::BCsWithTimestamps const&, aod::V0s const& v0s, aod::Cascades const& cascades, + aod::AssignedTrackedCascades const& trackedCasc, Hf2ProngsWithMl const& cand2Prongs, Hf3ProngsWithMl const& cand3Prongs, aod::TrackAssoc const& trackIndices, @@ -359,7 +366,7 @@ struct HfFilter { // Main struct for HF triggers bool keepEvent[kNtriggersHF]{false}; if (applyEventSelection && (!collision.sel8() || std::fabs(collision.posZ()) > 11.f)) { // safety margin for Zvtx - tags(keepEvent[kHighPt2P], keepEvent[kHighPt3P], keepEvent[kBeauty3P], keepEvent[kBeauty4P], keepEvent[kFemto2P], keepEvent[kFemto3P], keepEvent[kDoubleCharm2P], keepEvent[kDoubleCharm3P], keepEvent[kDoubleCharmMix], keepEvent[kV0Charm2P], keepEvent[kV0Charm3P], keepEvent[kCharmBarToXiBach], keepEvent[kSigmaCPPK], keepEvent[kSigmaC0K0], keepEvent[kPhotonCharm2P], keepEvent[kPhotonCharm3P], keepEvent[kSingleCharm2P], keepEvent[kSingleCharm3P], keepEvent[kSingleNonPromptCharm2P], keepEvent[kSingleNonPromptCharm3P]); + tags(keepEvent[kHighPt2P], keepEvent[kHighPt3P], keepEvent[kBeauty3P], keepEvent[kBeauty4P], keepEvent[kFemto2P], keepEvent[kFemto3P], keepEvent[kDoubleCharm2P], keepEvent[kDoubleCharm3P], keepEvent[kDoubleCharmMix], keepEvent[kV0Charm2P], keepEvent[kV0Charm3P], keepEvent[kCharmBarToXiBach], keepEvent[kSigmaCPPK], keepEvent[kSigmaC0K0], keepEvent[kPhotonCharm2P], keepEvent[kPhotonCharm3P], keepEvent[kSingleCharm2P], keepEvent[kSingleCharm3P], keepEvent[kSingleNonPromptCharm2P], keepEvent[kSingleNonPromptCharm3P], keepEvent[kCharmBarToXiBachBach]); continue; } @@ -387,9 +394,9 @@ struct HfFilter { // Main struct for HF triggers auto bz = o2::base::Propagator::Instance()->getNominalBz(); dfStrangeness.setBz(bz); + df2.setBz(bz); + df3.setBz(bz); if (activateSecVtxForB) { - df2.setBz(bz); - df3.setBz(bz); dfB.setBz(bz); dfBtoDstar.setBz(bz); } @@ -1387,10 +1394,25 @@ struct HfFilter { // Main struct for HF triggers } } // end loop over 3-prong candidates - if (!keepEvent[kCharmBarToXiBach]) { + if (!keepEvent[kCharmBarToXiBach] || !keepEvent[kCharmBarToXiBachBach]) { auto cascThisColl = cascades.sliceBy(cascPerCollision, thisCollId); for (const auto& casc : cascThisColl) { + bool hasStrangeTrack{false}; + + TracksIUPID::iterator cascTrack; + int requireStrangenessTrackingAny = requireStrangenessTracking->get(0u, 0u) + requireStrangenessTracking->get(0u, 1u); + if (requireStrangenessTrackingAny > 0) { // enabled for at least one of the two + auto trackedCascIdThisColl = trackedCasc.sliceBy(trackedCascadesPerCollision, thisCollId); + for (const auto& trackedCascId : trackedCascIdThisColl) { + if (trackedCascId.cascadeId() == casc.globalIndex()) { + hasStrangeTrack = true; + cascTrack = trackedCascId.track_as(); + break; + } + } + } + CascCand cascCand; if (!helper.buildCascade(casc, v0s, tracksIU, collision, dfStrangeness, {}, cascCand)) { continue; @@ -1401,7 +1423,10 @@ struct HfFilter { // Main struct for HF triggers } if (activateQA) { - hMassXi->Fill(cascCand.mXi); + hMassXi[0]->Fill(cascCand.mXi); + if (hasStrangeTrack) { + hMassXi[1]->Fill(cascCand.mXi); + } } auto bachelorCascId = casc.bachelorId(); @@ -1409,57 +1434,101 @@ struct HfFilter { // Main struct for HF triggers auto v0DauPosId = v0.posTrackId(); auto v0DauNegId = v0.negTrackId(); + // propagate to PV + gpu::gpustd::array dcaInfo; + o2::track::TrackParCov trackParCasc; + o2::track::TrackParCov trackParCascTrack; + if (requireStrangenessTrackingAny < 2) { // needed for at least one of the two + trackParCasc = o2::track::TrackParCov(cascCand.vtx, cascCand.mom, cascCand.cov, cascCand.sign, true); + trackParCasc.setPID(o2::track::PID::XiMinus); + trackParCasc.setAbsCharge(1); // to be sure + o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParCasc, 2.f, matCorr, &dcaInfo); + } + if (requireStrangenessTrackingAny > 0 && hasStrangeTrack) { // needed for at least one of the two + trackParCascTrack = getTrackParCov(cascTrack); + trackParCascTrack.setPID(o2::track::PID::XiMinus); + o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParCascTrack, 2.f, matCorr, &dcaInfo); + } + auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); - for (const auto& trackId : trackIdsThisCollision) { // start loop over tracks + for (const auto& trackId : trackIdsThisCollision) { // start loop over tracks (first bachelor) auto track = tracks.rawIteratorAt(trackId.trackId()); - // ask for opposite sign daughters (omegac daughters) - if (track.sign() * cascCand.sign > 0) { - continue; - } - // check if track is one of the Xi daughters if (track.globalIndex() == bachelorCascId || track.globalIndex() == v0DauPosId || track.globalIndex() == v0DauNegId) { continue; } - // propagate to PV - gpu::gpustd::array dcaInfo; - std::array pVecCascade = cascCand.mom; - auto trackParCasc = o2::track::TrackPar(cascCand.vtx, cascCand.mom, cascCand.sign, true); - trackParCasc.setPID(o2::track::PID::XiMinus); - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParCasc, 2.f, matCorr, &dcaInfo); - getPxPyPz(trackParCasc, pVecCascade); - - auto trackParBachelor = getTrackPar(track); - std::array pVecBachelor = track.pVector(); + auto trackParBachelor = getTrackParCov(track); + gpu::gpustd::array dcaInfoBach; if (track.collisionId() != thisCollId) { - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParBachelor, 2.f, noMatCorr, &dcaInfo); - getPxPyPz(trackParBachelor, pVecBachelor); + o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParBachelor, 2.f, noMatCorr, &dcaInfoBach); } - auto isSelBachelor = helper.isSelectedBachelorForCharmBaryon(track, dcaInfo); + auto isSelBachelor = helper.isSelectedBachelorForCharmBaryon(track, dcaInfoBach); if (isSelBachelor == kRejected) { continue; } - auto ptCharmBaryon = RecoDecay::pt(RecoDecay::pVec(pVecCascade, pVecBachelor)); + if (!keepEvent[kCharmBarToXiBach] && track.sign() * cascCand.sign < 0) { // XiPi and XiKa - if (!keepEvent[kCharmBarToXiBach] && TESTBIT(isSelBachelor, kPionForCharmBaryon)) { - auto massXiPi = RecoDecay::m(std::array{pVecCascade, pVecBachelor}, std::array{massXi, massPi}); - if (ptCharmBaryon > cutsXiBachelor->get(0u, 0u) && massXiPi >= cutsXiBachelor->get(0u, 2u) && massXiPi <= 2.8f) { - keepEvent[kCharmBarToXiBach] = true; - if (activateQA) { - hMassVsPtC[kNCharmParticles + 15]->Fill(ptCharmBaryon, massXiPi); + bool isSelXiBach{false}; + if (requireStrangenessTracking->get(0u, 0u) > 0) { + if (!hasStrangeTrack) { + continue; } + isSelXiBach = helper.isSelectedXiBach(trackParCascTrack, trackParBachelor, isSelBachelor, collision, df2, activateQA, hMassVsPtC[kNCharmParticles + 15], hMassVsPtC[kNCharmParticles + 16]); + } else { + isSelXiBach = helper.isSelectedXiBach(trackParCasc, trackParBachelor, isSelBachelor, collision, dfStrangeness, activateQA, hMassVsPtC[kNCharmParticles + 15], hMassVsPtC[kNCharmParticles + 16]); } - } - if (!keepEvent[kCharmBarToXiBach] && TESTBIT(isSelBachelor, kKaonForCharmBaryon)) { - auto massXiKa = RecoDecay::m(std::array{pVecCascade, pVecBachelor}, std::array{massXi, massKa}); - if (ptCharmBaryon > cutsXiBachelor->get(0u, 1u) && massXiKa >= cutsXiBachelor->get(0u, 3u) && massXiKa <= 2.8f) { + if (isSelXiBach) { keepEvent[kCharmBarToXiBach] = true; - if (activateQA) { - hMassVsPtC[kNCharmParticles + 16]->Fill(ptCharmBaryon, massXiKa); + } + } + + // only pions needed below + if (!TESTBIT(isSelBachelor, kPionForCharmBaryon)) { + continue; + } + + if (!keepEvent[kCharmBarToXiBachBach]) { + for (const auto& trackIdSecond : trackIdsThisCollision) { // start loop over tracks (second bachelor) + auto trackSecond = tracks.rawIteratorAt(trackIdSecond.trackId()); + + // check if track is one of the Xi daughters + if (trackSecond.globalIndex() == track.globalIndex() || trackSecond.globalIndex() == bachelorCascId || trackSecond.globalIndex() == v0DauPosId || trackSecond.globalIndex() == v0DauNegId) { + continue; + } + + if (track.sign() * trackSecond.sign() < 0 || track.sign() * cascCand.sign > 0) { // we want same sign pions, opposite to the xi + continue; + } + + auto trackParBachelorSecond = getTrackParCov(trackSecond); + gpu::gpustd::array dcaInfoBachSecond; + if (trackSecond.collisionId() != thisCollId) { + o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParBachelorSecond, 2.f, noMatCorr, &dcaInfoBachSecond); + } + + auto isSelBachelorSecond = helper.isSelectedBachelorForCharmBaryon(trackSecond, dcaInfoBachSecond); + if (!TESTBIT(isSelBachelorSecond, kPionForCharmBaryon)) { + continue; + } + + if (!keepEvent[kCharmBarToXiBachBach]) { // XiPiPi + + bool isSelXiBachBach{false}; + if (requireStrangenessTracking->get(0u, 1u) > 0) { + if (!hasStrangeTrack) { + continue; + } + isSelXiBachBach = helper.isSelectedXiBachBach<3>(trackParCascTrack, {trackParBachelor, trackParBachelorSecond}, collision, df3, activateQA, hMassVsPtC[kNCharmParticles + 17]); + } else { // vertex with only the two bachelors + isSelXiBachBach = helper.isSelectedXiBachBach<2>(trackParCascTrack, {trackParBachelor, trackParBachelorSecond}, collision, df2, activateQA, hMassVsPtC[kNCharmParticles + 17]); + } + if (isSelXiBachBach) { + keepEvent[kCharmBarToXiBachBach] = true; + } } } } @@ -1497,7 +1566,7 @@ struct HfFilter { // Main struct for HF triggers } } - tags(keepEvent[kHighPt2P], keepEvent[kHighPt3P], keepEvent[kBeauty3P], keepEvent[kBeauty4P], keepEvent[kFemto2P], keepEvent[kFemto3P], keepEvent[kDoubleCharm2P], keepEvent[kDoubleCharm3P], keepEvent[kDoubleCharmMix], keepEvent[kV0Charm2P], keepEvent[kV0Charm3P], keepEvent[kCharmBarToXiBach], keepEvent[kSigmaCPPK], keepEvent[kSigmaC0K0], keepEvent[kPhotonCharm2P], keepEvent[kPhotonCharm3P], keepEvent[kSingleCharm2P], keepEvent[kSingleCharm3P], keepEvent[kSingleNonPromptCharm2P], keepEvent[kSingleNonPromptCharm3P]); + tags(keepEvent[kHighPt2P], keepEvent[kHighPt3P], keepEvent[kBeauty3P], keepEvent[kBeauty4P], keepEvent[kFemto2P], keepEvent[kFemto3P], keepEvent[kDoubleCharm2P], keepEvent[kDoubleCharm3P], keepEvent[kDoubleCharmMix], keepEvent[kV0Charm2P], keepEvent[kV0Charm3P], keepEvent[kCharmBarToXiBach], keepEvent[kSigmaCPPK], keepEvent[kSigmaC0K0], keepEvent[kPhotonCharm2P], keepEvent[kPhotonCharm3P], keepEvent[kSingleCharm2P], keepEvent[kSingleCharm3P], keepEvent[kSingleNonPromptCharm2P], keepEvent[kSingleNonPromptCharm3P], keepEvent[kCharmBarToXiBachBach]); if (!std::accumulate(keepEvent, keepEvent + kNtriggersHF, 0)) { hProcessedEvents->Fill(1); diff --git a/EventFiltering/PWGHF/HFFilterHelpers.h b/EventFiltering/PWGHF/HFFilterHelpers.h index f651a4cc83e..7540f276962 100644 --- a/EventFiltering/PWGHF/HFFilterHelpers.h +++ b/EventFiltering/PWGHF/HFFilterHelpers.h @@ -81,6 +81,7 @@ enum HfTriggers { kSingleCharm3P, kSingleNonPromptCharm2P, kSingleNonPromptCharm3P, + kCharmBarToXiBachBach, kNtriggersHF }; @@ -191,6 +192,7 @@ struct V0Cand { struct CascCand { std::array mom; std::array vtx; + std::array cov; V0Cand v0; float ptBach; float etaBach; @@ -216,7 +218,7 @@ static const std::array charmParticleNames{"D0", static const std::array beautyParticleNames{"Bplus", "B0toDStar", "B0", "Bs", "Lb", "Xib"}; static const std::array pdgCodesCharm{421, 411, 431, 4122, 4232}; static const std::array eventTitles = {"all", "rejected"}; -static const std::vector hfTriggerNames{filtering::HfHighPt2P::columnLabel(), filtering::HfHighPt3P::columnLabel(), filtering::HfBeauty3P::columnLabel(), filtering::HfBeauty4P::columnLabel(), filtering::HfFemto2P::columnLabel(), filtering::HfFemto3P::columnLabel(), filtering::HfDoubleCharm2P::columnLabel(), filtering::HfDoubleCharm3P::columnLabel(), filtering::HfDoubleCharmMix::columnLabel(), filtering::HfV0Charm2P::columnLabel(), filtering::HfV0Charm3P::columnLabel(), filtering::HfCharmBarToXiBach::columnLabel(), filtering::HfSigmaCPPK::columnLabel(), filtering::HfSigmaC0K0::columnLabel(), filtering::HfPhotonCharm2P::columnLabel(), filtering::HfPhotonCharm3P::columnLabel(), filtering::HfSingleCharm2P::columnLabel(), filtering::HfSingleCharm3P::columnLabel(), filtering::HfSingleNonPromptCharm2P::columnLabel(), filtering::HfSingleNonPromptCharm3P::columnLabel()}; +static const std::vector hfTriggerNames{filtering::HfHighPt2P::columnLabel(), filtering::HfHighPt3P::columnLabel(), filtering::HfBeauty3P::columnLabel(), filtering::HfBeauty4P::columnLabel(), filtering::HfFemto2P::columnLabel(), filtering::HfFemto3P::columnLabel(), filtering::HfDoubleCharm2P::columnLabel(), filtering::HfDoubleCharm3P::columnLabel(), filtering::HfDoubleCharmMix::columnLabel(), filtering::HfV0Charm2P::columnLabel(), filtering::HfV0Charm3P::columnLabel(), filtering::HfCharmBarToXiBach::columnLabel(), filtering::HfSigmaCPPK::columnLabel(), filtering::HfSigmaC0K0::columnLabel(), filtering::HfPhotonCharm2P::columnLabel(), filtering::HfPhotonCharm3P::columnLabel(), filtering::HfSingleCharm2P::columnLabel(), filtering::HfSingleCharm3P::columnLabel(), filtering::HfSingleNonPromptCharm2P::columnLabel(), filtering::HfSingleNonPromptCharm3P::columnLabel(), filtering::HfCharmBarToXiBachBach::columnLabel()}; static const std::array v0Labels{"#gamma", "K_{S}^{0}", "#Lambda", "#bar{#Lambda}"}; static const std::array v0Names{"Photon", "K0S", "Lambda", "AntiLambda"}; @@ -260,7 +262,7 @@ static const o2::framework::AxisSpec alphaAxis{100, -1.f, 1.f}; static const o2::framework::AxisSpec qtAxis{100, 0.f, 0.25f}; static const o2::framework::AxisSpec bdtAxis{100, 0.f, 1.f}; static const o2::framework::AxisSpec phiAxis{36, 0., o2::constants::math::TwoPI}; -static const std::array massAxisC = {o2::framework::AxisSpec{100, 1.65f, 2.05f}, o2::framework::AxisSpec{100, 1.65f, 2.05f}, o2::framework::AxisSpec{100, 1.75f, 2.15f}, o2::framework::AxisSpec{100, 2.05f, 2.45f}, o2::framework::AxisSpec{100, 2.25f, 2.65f}, o2::framework::AxisSpec{100, 0.139f, 0.159f}, o2::framework::AxisSpec{100, 0.f, 0.25f}, o2::framework::AxisSpec{100, 0.f, 0.25f}, o2::framework::AxisSpec{200, 0.48f, 0.88f}, o2::framework::AxisSpec{200, 0.48f, 0.88f}, o2::framework::AxisSpec{100, 1.1f, 1.4f}, o2::framework::AxisSpec{100, 1.1f, 1.4f}, o2::framework::AxisSpec{100, 1.1f, 1.4f}, o2::framework::AxisSpec{100, 1.1f, 1.4f}, o2::framework::AxisSpec{170, 0.13f, 0.3f}, o2::framework::AxisSpec{170, 0.13f, 0.3f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{100, 2.3f, 2.9f}, o2::framework::AxisSpec{100, 2.3f, 2.9f}}; +static const std::array massAxisC = {o2::framework::AxisSpec{250, 1.65f, 2.15f}, o2::framework::AxisSpec{250, 1.65f, 2.15f}, o2::framework::AxisSpec{250, 1.75f, 2.25f}, o2::framework::AxisSpec{250, 2.05f, 2.55f}, o2::framework::AxisSpec{250, 2.25f, 2.75f}, o2::framework::AxisSpec{200, 0.139f, 0.159f}, o2::framework::AxisSpec{250, 0.f, 0.25f}, o2::framework::AxisSpec{250, 0.f, 0.25f}, o2::framework::AxisSpec{200, 0.48f, 0.88f}, o2::framework::AxisSpec{200, 0.48f, 0.88f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{170, 0.13f, 0.3f}, o2::framework::AxisSpec{170, 0.13f, 0.3f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 2.3f, 2.9f}, o2::framework::AxisSpec{200, 2.3f, 2.9f}, o2::framework::AxisSpec{200, 2.3f, 2.9f}}; static const std::array massAxisB = {o2::framework::AxisSpec{240, 4.8f, 6.0f}, o2::framework::AxisSpec{240, 4.8f, 6.0f}, o2::framework::AxisSpec{240, 4.8f, 6.0f}, o2::framework::AxisSpec{240, 4.8f, 6.0f}, o2::framework::AxisSpec{240, 5.0f, 6.2f}, o2::framework::AxisSpec{240, 5.0f, 6.2f}}; // default values for configurables @@ -328,8 +330,11 @@ static const std::vector labelsColumnsV0s = {"CosPaGamma", "CosPaK0 // cascades for Xi + bachelor triggers constexpr float cutsCascades[1][8] = {{0.2, 1., 0.01, 0.01, 0.99, 0.99, 0.3, 3.}}; // ptXiBachelor, deltaMassXi, deltaMassLambda, cosPaXi, cosPaLambda, DCAxyXi, nSigmaPid static const std::vector labelsColumnsCascades = {"PtBachelor", "PtXi", "DeltaMassXi", "DeltaMassLambda", "CosPAXi", "CosPaLambda", "DCAxyXi", "NsigmaPid"}; -constexpr float cutsCharmBaryons[1][4] = {{3., 3., 2.35, 2.60}}; // MinPtXiPi, MinPtXiKa, MinMassXiPi, MinMassXiKa -static const std::vector labelsColumnsCharmBaryons = {"MinPtXiPi", "MinPtXiKa", "MinMassXiPi", "MinMassXiKa"}; +constexpr float cutsCharmBaryons[1][8] = {{5., 5., 1000., 2.35, 2.60, 2.35, -2., -2.}}; // MinPtXiPi, MinPtXiKa, MinPtXiPiPi, MinMassXiPi, MinMassXiKa, MinMassXiPiPi, CosPaXiBach, CosPaXiBachBach +static const std::vector labelsColumnsCharmBarCuts = {"MinPtXiPi", "MinPtXiKa", "MinPtXiPiPi", "MinMassXiPi", "MinMassXiKa", "MinMassXiPiPi", "CosPaXiBach", "CosPaXiBachBach"}; + +constexpr int requireStrangenessTrackedXi[1][2] = {{1, 0}}; +static const std::vector labelsColumnsCharmBaryons = {"CharmBarToXiBach", "CharmBarToXiBachBach"}; // dummy array static const std::vector labelsEmpty{}; @@ -337,7 +342,7 @@ static constexpr double cutsTrackDummy[o2::analysis::hf_cuts_single_track::nBins o2::framework::LabeledArray cutsSingleTrackDummy{cutsTrackDummy[0], o2::analysis::hf_cuts_single_track::nBinsPtTrack, o2::analysis::hf_cuts_single_track::nCutVarsTrack, o2::analysis::hf_cuts_single_track::labelsPtTrack, o2::analysis::hf_cuts_single_track::labelsCutVarTrack}; // manual downscale factors for tests -constexpr double defDownscaleFactors[kNtriggersHF][1] = {{1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}}; // one for each trigger +constexpr double defDownscaleFactors[kNtriggersHF][1] = {{1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}}; // one for each trigger static const std::vector labelsDownscaleFactor = {"Downscale factor"}; // Main helper class @@ -480,6 +485,18 @@ class HfFilterHelper mNSigmaTofKaonFromXicResoToSigmaC = nSigmaTof; } + void setXiBachelorSelections(float ptMinXiPi, float ptMinXiKa, float ptMinXiPiPi, float massMinXiPi, float massMinXiKa, float massMinXiPiPi, float cosPaMinXiBach, float cosPaMinXiBachBach) + { + mPtMinXiBach[0] = ptMinXiPi; + mPtMinXiBach[1] = ptMinXiKa; + mPtMinXiBach[2] = ptMinXiPiPi; + mMassMinXiBach[0] = massMinXiPi; + mMassMinXiBach[1] = massMinXiKa; + mMassMinXiBach[2] = massMinXiPiPi; + mCosPaMinXiBach[0] = cosPaMinXiBach; + mCosPaMinXiBach[1] = cosPaMinXiBachBach; + } + void setTpcPidCalibrationOption(int opt) { mTpcPidCalibrationOption = opt; } void setMassResolParametrisation(std::string recoPass) @@ -549,6 +566,10 @@ class HfFilterHelper bool isSelectedBzeroToDstar(T1 const& pVecTrack0, T1 const& pVecTrack1, T1 const& pVecTrack2, const T2& primVtx, const T3& secVtx); template bool isCharmHadronMassInSbRegions(T1 const& massHypo1, T1 const& massHypo2, const float& lowLimitSB, const float& upLimitSB); + template + bool isSelectedXiBach(T const& trackParCasc, T const& trackParBachelor, int8_t isSelBachelor, C const& collision, o2::vertexing::DCAFitterN<2>& dcaFitter, const int& activateQA, H2 hMassVsPtXiPi, H2 hMassVsPtXiKa); + template + bool isSelectedXiBachBach(T const& trackParCasc, std::array const& trackParBachelor, C const& collision, o2::vertexing::DCAFitterN& dcaFitter, const int& activateQA, H2 hMassVsPtXiPiPi); // helpers template @@ -656,6 +677,9 @@ class HfFilterHelper float mNSigmaTofKaonFromXicResoToSigmaC{3.}; // maximum Nsigma TOF for kaons in Xic*->SigmaC-Kaon bool mForceTofProtonForFemto = true; // flag to force TOF PID for protons bool mForceTofDeuteronForFemto = false; // flag to force TOF PID for deuterons + std::array mPtMinXiBach{5., 5., 5.}; // minimum pT for XiBachelor candidates + std::array mMassMinXiBach{2.35, 2.6, 2.35}; // minimum invariant-mass for XiBachelor candidates + std::array mCosPaMinXiBach{-2.f, -2.f}; // minimum cosine of pointing angle for XiBachelor candidates std::array, kNBeautyParticles> mCutsBhad{}; // selections for B-hadron candidates (DeltaMass, CPA, DecayLength, ImpactParameterProduct) // PID recalibrations @@ -1944,7 +1968,7 @@ inline bool HfFilterHelper::isSelectedBhadronInMassRange(T1 const& ptCand, T2 co /// \param upLimitSB is the dca of the pion daughter track /// \return true if the candidate passes the mass selection. template -inline bool isCharmHadronMassInSbRegions(T1 const& massHypo1, T1 const& massHypo2, const float& lowLimitSB, const float& upLimitSB) +inline bool HfFilterHelper::isCharmHadronMassInSbRegions(T1 const& massHypo1, T1 const& massHypo2, const float& lowLimitSB, const float& upLimitSB) { if ((massHypo1 < lowLimitSB || massHypo1 > upLimitSB) && (massHypo2 < lowLimitSB || massHypo2 > upLimitSB)) { @@ -1954,6 +1978,162 @@ inline bool isCharmHadronMassInSbRegions(T1 const& massHypo1, T1 const& massHypo return true; } +/// Method to check if charm candidates has mass between sideband limits +/// \param trackParCasc is the cascade track parametrisation +/// \param trackParBachelor is the bachelor track parametrisation +/// \param isSelBachelor flag for bachelor selection (Pi/Ka) +/// \param collision is the collision containing the candidate +/// \param dcaFitter is the DCAFitter +/// \param activateQA is the flag to activate the QA +/// \param hMassVsPtXiPi is the 2D histogram with pT vs mass(XiPi) +/// \param hMassVsPtXiKa is the 2D histogram with pT vs mass(XiKa) +template +inline bool HfFilterHelper::isSelectedXiBach(T const& trackParCasc, T const& trackParBachelor, int8_t isSelBachelor, C const& collision, o2::vertexing::DCAFitterN<2>& dcaFitter, const int& activateQA, H2 hMassVsPtXiPi, H2 hMassVsPtXiKa) +{ + bool isSelectedXiPi{false}, isSelectedXiKa{false}; + + // compute pT + std::array pVecBachelor{}, pVecCascade{}; + getPxPyPz(trackParBachelor, pVecBachelor); + getPxPyPz(trackParCasc, pVecCascade); + auto ptXiBach = RecoDecay::pt(RecoDecay::pVec(pVecCascade, pVecBachelor)); + + // compute first mass hypo + float massXiPi{0.f}; + if (TESTBIT(isSelBachelor, kPionForCharmBaryon)) { + massXiPi = RecoDecay::m(std::array{pVecCascade, pVecBachelor}, std::array{massXi, massPi}); + if (ptXiBach >= mPtMinXiBach[0] && massXiPi >= mMassMinXiBach[0] && massXiPi <= 3.f) { + isSelectedXiPi = true; + } + } + + // compute second mass hypo + float massXiKa{0.f}; + if (TESTBIT(isSelBachelor, kKaonForCharmBaryon)) { + massXiKa = RecoDecay::m(std::array{pVecCascade, pVecBachelor}, std::array{massXi, massKa}); + if (ptXiBach >= mPtMinXiBach[1] && massXiKa >= mMassMinXiBach[1] && massXiKa <= 3.f) { + isSelectedXiKa = true; + } + } + + bool isSelected = isSelectedXiPi || isSelectedXiKa; + + if (isSelected && mCosPaMinXiBach[0] > -1.f) { // if selected by pT and mass, check topology if applicable + int nCand = 0; + try { + nCand = dcaFitter.process(trackParCasc, trackParBachelor); + } catch (...) { + LOG(error) << "Exception caught in DCA fitter process call for Xi + bachelor!"; + return false; + } + if (nCand == 0) { + return false; + } + + const auto& vtx = dcaFitter.getPCACandidate(); + const auto& trackCascProp = dcaFitter.getTrack(0); + const auto& trackBachProp = dcaFitter.getTrack(1); + std::array momCasc{}, momBach{}; + trackCascProp.getPxPyPzGlo(momCasc); + trackBachProp.getPxPyPzGlo(momBach); + auto momXiBach = RecoDecay::pVec(momCasc, momBach); + + std::array primVtx = {collision.posX(), collision.posY(), collision.posZ()}; + if (RecoDecay::cpa(primVtx, std::array{vtx[0], vtx[1], vtx[2]}, momXiBach) < mCosPaMinXiBach[0]) { + return false; + } + + if (activateQA) { + if (isSelectedXiPi) { + hMassVsPtXiPi->Fill(ptXiBach, massXiPi); + } + if (isSelectedXiKa) { + hMassVsPtXiKa->Fill(ptXiBach, massXiKa); + } + } + } + + return isSelected; +} + +/// Method to check if charm candidates has mass between sideband limits +/// \param trackParCasc is the cascade track parametrisation +/// \param trackParBachelor is the array with two bachelor track parametrisations +/// \param collision is the collision containing the candidate +/// \param dcaFitter is the DCAFitter +/// \param activateQA is the flag to activate the QA +/// \param hMassVsPtXiPiPi is the 2D histogram with pT vs mass(XiPiPi) +template +inline bool HfFilterHelper::isSelectedXiBachBach(T const& trackParCasc, std::array const& trackParBachelor, C const& collision, o2::vertexing::DCAFitterN& dcaFitter, const int& activateQA, H2 hMassVsPtXiPiPi) +{ + bool isSelected{false}; + + // compute pT + std::array pVecBachelorFirst{}, pVecBachelorSecond{}, pVecCascade{}; + getPxPyPz(trackParBachelor[0], pVecBachelorFirst); + getPxPyPz(trackParBachelor[1], pVecBachelorSecond); + getPxPyPz(trackParCasc, pVecCascade); + auto ptXiBachBach = RecoDecay::pt(RecoDecay::pVec(pVecCascade, pVecBachelorFirst, pVecBachelorSecond)); + if (ptXiBachBach < mPtMinXiBach[2]) { + return isSelected; + } + + // compute mass + float massXiPiPi = RecoDecay::m(std::array{pVecCascade, pVecBachelorFirst, pVecBachelorSecond}, std::array{massXi, massPi, massPi}); + if (massXiPiPi < mMassMinXiBach[2] || massXiPiPi > 3.f) { + return isSelected; + } + + if (mCosPaMinXiBach[1] > -1.f) { // check topology if applicable + int nCand = 0; + if constexpr (Nprongs == 3) { + try { + nCand = dcaFitter.process(trackParBachelor[0], trackParBachelor[1], trackParCasc); + } catch (...) { + LOG(error) << "Exception caught in DCA fitter process call for Xi + bachelor + bachelor!"; + return false; + } + if (nCand == 0) { + return false; + } + } else if constexpr (Nprongs == 2) { + try { + nCand = dcaFitter.process(trackParBachelor[0], trackParBachelor[1]); + } catch (...) { + LOG(error) << "Exception caught in DCA fitter process call for Xi + bachelor + bachelor!"; + return false; + } + if (nCand == 0) { + return false; + } + } + + const auto& vtx = dcaFitter.getPCACandidate(); + + std::array momCasc{pVecCascade}, momBachFirst{}, momBachSecond{}; + const auto& trackBachFirstProp = dcaFitter.getTrack(0); + const auto& trackBachSecondProp = dcaFitter.getTrack(1); + trackBachFirstProp.getPxPyPzGlo(momBachFirst); + trackBachSecondProp.getPxPyPzGlo(momBachSecond); + if constexpr (Nprongs == 3) { + const auto& trackCascProp = dcaFitter.getTrack(2); + trackCascProp.getPxPyPzGlo(momCasc); + } + auto momXiBachBach = RecoDecay::pVec(momCasc, momBachFirst, momBachSecond); + + std::array primVtx = {collision.posX(), collision.posY(), collision.posZ()}; + if (RecoDecay::cpa(primVtx, std::array{vtx[0], vtx[1], vtx[2]}, momXiBachBach) < mCosPaMinXiBach[1]) { + return false; + } + + if (activateQA && isSelected) { + hMassVsPtXiPiPi->Fill(ptXiBachBach, massXiPiPi); + } + } + + return isSelected; +} + /// Update the TPC PID baesd on the spline of particles /// \param track is a track parameter /// \param pidSpecies is the particle species to be considered @@ -2147,7 +2327,7 @@ inline bool HfFilterHelper::buildV0(V const& v0Indices, T const& tracks, C const try { nCand = dcaFitter.process(trackParCovPos, trackParCovNeg); } catch (...) { - LOG(error) << "Exception caught in DCA fitter process call!"; + LOG(error) << "Exception caught in DCA fitter process call in V0!"; return false; } if (nCand == 0) { @@ -2278,7 +2458,7 @@ inline bool HfFilterHelper::buildCascade(Casc const& cascIndices, V const& v0Ind try { nCand = dcaFitter.process(v0TrackParCov, bachTrackParCov); } catch (...) { - LOG(error) << "Exception caught in DCA fitter process call!"; + LOG(error) << "Exception caught in DCA fitter process call in Xi!"; return false; } if (nCand == 0) { @@ -2309,8 +2489,24 @@ inline bool HfFilterHelper::buildCascade(Casc const& cascIndices, V const& v0Ind for (int iCoord{0}; iCoord < 3; ++iCoord) { cascCand.vtx[iCoord] = vtx[iCoord]; } + auto covVtxV = dcaFitter.calcPCACovMatrix(0); + cascCand.cov = {}; + cascCand.cov[0] = covVtxV(0, 0); + cascCand.cov[1] = covVtxV(1, 0); + cascCand.cov[2] = covVtxV(1, 1); + cascCand.cov[3] = covVtxV(2, 0); + cascCand.cov[4] = covVtxV(2, 1); + cascCand.cov[5] = covVtxV(2, 2); + std::array covTv0 = {0.}; + std::array covTbachelor = {0.}; + trackV0Prop.getCovXYZPxPyPzGlo(covTv0); + trackBachProp.getCovXYZPxPyPzGlo(covTbachelor); + constexpr int MomInd[6] = {9, 13, 14, 18, 19, 20}; // cov matrix elements for momentum component + for (int iCoord{0}; iCoord < 6; ++iCoord) { + cascCand.cov[MomInd[iCoord]] = covTv0[MomInd[iCoord]] + covTbachelor[MomInd[iCoord]]; + } + cascCand.cascradius = std::hypot(vtx[0], vtx[1]); - ; cascCand.casccosPA = RecoDecay::cpa(primVtx, vtx, cascCand.mom); auto trackParCasc = dcaFitter.createParentTrackParCov(); @@ -2322,7 +2518,6 @@ inline bool HfFilterHelper::buildCascade(Casc const& cascIndices, V const& v0Ind cascCand.dcacascdaughters = std::sqrt(dcaFitter.getChi2AtPCACandidate()); cascCand.mXi = RecoDecay::m(std::array{momBach, momV0}, std::array{massPi, massLambda}); cascCand.mOmega = RecoDecay::m(std::array{momBach, momV0}, std::array{massKa, massLambda}); - ; cascCand.hasTofBach = trackBachelor.hasTOF(); cascCand.nSigmaPiTpcBach = trackBachelor.tpcNSigmaPi(); diff --git a/EventFiltering/PWGHF/HFFilterPrepareMLSamples.cxx b/EventFiltering/PWGHF/HFFilterPrepareMLSamples.cxx index f85a7c215d7..fd4cf6dba7e 100644 --- a/EventFiltering/PWGHF/HFFilterPrepareMLSamples.cxx +++ b/EventFiltering/PWGHF/HFFilterPrepareMLSamples.cxx @@ -135,7 +135,7 @@ struct HfFilterPrepareMlSamples { // Main struct auto flag = RecoDecay::OriginType::None; - if (fillOnlyBackground && !(isCharmHadronMassInSbRegions(invMassD0, invMassD0bar, massSbLeftMin, massSbLeftMax) || (isCharmHadronMassInSbRegions(invMassD0, invMassD0bar, massSbRightMin, massSbRightMax)))) + if (fillOnlyBackground && !(helper.isCharmHadronMassInSbRegions(invMassD0, invMassD0bar, massSbLeftMin, massSbLeftMax) || (helper.isCharmHadronMassInSbRegions(invMassD0, invMassD0bar, massSbRightMin, massSbRightMax)))) continue; float pseudoRndm = trackPos.pt() * 1000. - static_cast(trackPos.pt() * 1000); if (pseudoRndm < downSampleBkgFactor) { diff --git a/EventFiltering/filterTables.h b/EventFiltering/filterTables.h index 46392cb63da..5d8c0303d79 100644 --- a/EventFiltering/filterTables.h +++ b/EventFiltering/filterTables.h @@ -71,24 +71,25 @@ DECLARE_SOA_COLUMN(LMeeHMR, hasLMeeHMR, bool); //! dielectron trigger for high m DECLARE_SOA_COLUMN(ElectronMuon, hasElectronMuon, bool); //! dimuon trigger with low pT on muons // heavy flavours -DECLARE_SOA_COLUMN(HfHighPt2P, hasHfHighPt2P, bool); //! high-pT 2-prong charm hadron -DECLARE_SOA_COLUMN(HfHighPt3P, hasHfHighPt3P, bool); //! high-pT 3-prong charm hadron -DECLARE_SOA_COLUMN(HfBeauty3P, hasHfBeauty3P, bool); //! 3-prong beauty hadron -DECLARE_SOA_COLUMN(HfBeauty4P, hasHfBeauty4P, bool); //! 4-prong beauty hadron -DECLARE_SOA_COLUMN(HfFemto2P, hasHfFemto2P, bool); //! 2-prong charm-hadron - N pair -DECLARE_SOA_COLUMN(HfFemto3P, hasHfFemto3P, bool); //! 3-prong charm-hadron - N pair -DECLARE_SOA_COLUMN(HfDoubleCharm2P, hasHfDoubleCharm2P, bool); //! at least two 2-prong charm-hadron candidates -DECLARE_SOA_COLUMN(HfDoubleCharm3P, hasHfDoubleCharm3P, bool); //! at least two 3-prong charm-hadron candidates -DECLARE_SOA_COLUMN(HfDoubleCharmMix, hasHfDoubleCharmMix, bool); //! at least one 2-prong and one 3-prong charm-hadron candidates -DECLARE_SOA_COLUMN(HfV0Charm2P, hasHfV0Charm2P, bool); //! V0 with 2-prong charm hadron -DECLARE_SOA_COLUMN(HfV0Charm3P, hasHfV0Charm3P, bool); //! V0 with 3-prong charm hadron -DECLARE_SOA_COLUMN(HfCharmBarToXiBach, hasHfCharmBarToXiBach, bool); //! Charm baryon to Xi + bachelor -DECLARE_SOA_COLUMN(HfSigmaCPPK, hasHfSigmaCPPK, bool); //! SigmaC(2455)++K- and SigmaC(2520)++K- + c.c. -DECLARE_SOA_COLUMN(HfSigmaC0K0, hasHfSigmaC0K0, bool); //! SigmaC(2455)0KS0 and SigmaC(2520)0KS0 -DECLARE_SOA_COLUMN(HfPhotonCharm2P, hasHfPhotonCharm2P, bool); //! photon with 2-prong charm hadron -DECLARE_SOA_COLUMN(HfPhotonCharm3P, hasHfPhotonCharm3P, bool); //! photon with 3-prong charm hadron -DECLARE_SOA_COLUMN(HfSingleCharm2P, hasHfSingleCharm2P, bool); //! 2-prong charm hadron (for efficiency studies) -DECLARE_SOA_COLUMN(HfSingleCharm3P, hasHfSingleCharm3P, bool); //! 3-prong charm hadron (for efficiency studies) +DECLARE_SOA_COLUMN(HfHighPt2P, hasHfHighPt2P, bool); //! high-pT 2-prong charm hadron +DECLARE_SOA_COLUMN(HfHighPt3P, hasHfHighPt3P, bool); //! high-pT 3-prong charm hadron +DECLARE_SOA_COLUMN(HfBeauty3P, hasHfBeauty3P, bool); //! 3-prong beauty hadron +DECLARE_SOA_COLUMN(HfBeauty4P, hasHfBeauty4P, bool); //! 4-prong beauty hadron +DECLARE_SOA_COLUMN(HfFemto2P, hasHfFemto2P, bool); //! 2-prong charm-hadron - N pair +DECLARE_SOA_COLUMN(HfFemto3P, hasHfFemto3P, bool); //! 3-prong charm-hadron - N pair +DECLARE_SOA_COLUMN(HfDoubleCharm2P, hasHfDoubleCharm2P, bool); //! at least two 2-prong charm-hadron candidates +DECLARE_SOA_COLUMN(HfDoubleCharm3P, hasHfDoubleCharm3P, bool); //! at least two 3-prong charm-hadron candidates +DECLARE_SOA_COLUMN(HfDoubleCharmMix, hasHfDoubleCharmMix, bool); //! at least one 2-prong and one 3-prong charm-hadron candidates +DECLARE_SOA_COLUMN(HfV0Charm2P, hasHfV0Charm2P, bool); //! V0 with 2-prong charm hadron +DECLARE_SOA_COLUMN(HfV0Charm3P, hasHfV0Charm3P, bool); //! V0 with 3-prong charm hadron +DECLARE_SOA_COLUMN(HfCharmBarToXiBach, hasHfCharmBarToXiBach, bool); //! Charm baryon to Xi + bachelor +DECLARE_SOA_COLUMN(HfCharmBarToXiBachBach, hasHfCharmBarToXiBachBach, bool); //! Charm baryon to Xi + 2 bachelors +DECLARE_SOA_COLUMN(HfSigmaCPPK, hasHfSigmaCPPK, bool); //! SigmaC(2455)++K- and SigmaC(2520)++K- + c.c. +DECLARE_SOA_COLUMN(HfSigmaC0K0, hasHfSigmaC0K0, bool); //! SigmaC(2455)0KS0 and SigmaC(2520)0KS0 +DECLARE_SOA_COLUMN(HfPhotonCharm2P, hasHfPhotonCharm2P, bool); //! photon with 2-prong charm hadron +DECLARE_SOA_COLUMN(HfPhotonCharm3P, hasHfPhotonCharm3P, bool); //! photon with 3-prong charm hadron +DECLARE_SOA_COLUMN(HfSingleCharm2P, hasHfSingleCharm2P, bool); //! 2-prong charm hadron (for efficiency studies) +DECLARE_SOA_COLUMN(HfSingleCharm3P, hasHfSingleCharm3P, bool); //! 3-prong charm hadron (for efficiency studies) DECLARE_SOA_COLUMN(HfSingleNonPromptCharm2P, hasHfSingleNonPromptCharm2P, bool); //! 2-prong charm hadron (for efficiency studies) DECLARE_SOA_COLUMN(HfSingleNonPromptCharm3P, hasHfSingleNonPromptCharm3P, bool); //! 3-prong charm hadron (for efficiency studies) @@ -233,7 +234,8 @@ DECLARE_SOA_TABLE(HfFilters, "AOD", "HfFilters", //! filtering::HfSingleCharm2P, filtering::HfSingleCharm3P, filtering::HfSingleNonPromptCharm2P, - filtering::HfSingleNonPromptCharm3P); + filtering::HfSingleNonPromptCharm3P, + filtering::HfCharmBarToXiBachBach); using HfFilter = HfFilters::iterator; From c75f208dc79754b8f605cbf326463e9b7370e328 Mon Sep 17 00:00:00 2001 From: Fabio Colamaria Date: Mon, 10 Feb 2025 21:32:35 +0100 Subject: [PATCH 0135/1650] [DPG] Add option to check generator type in qaEfficiency task (#9854) Co-authored-by: Mattia Faggin --- DPG/Tasks/AOTTrack/qaEfficiency.cxx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/DPG/Tasks/AOTTrack/qaEfficiency.cxx b/DPG/Tasks/AOTTrack/qaEfficiency.cxx index 80fe9e90fb7..8680c839724 100644 --- a/DPG/Tasks/AOTTrack/qaEfficiency.cxx +++ b/DPG/Tasks/AOTTrack/qaEfficiency.cxx @@ -203,6 +203,7 @@ struct QaEfficiency { Configurable checkForMothers{"checkForMothers", false, "Flag to use the array of mothers to check if the particle of interest come from any of those particles"}; Configurable> mothersPDGs{"mothersPDGs", std::vector{3312, -3312}, "PDGs of origin of the particle under study"}; Configurable keepOnlyHfParticles{"keepOnlyHfParticles", false, "Flag to decide wheter to consider only HF particles"}; + Configurable eventGeneratorType{"eventGeneratorType", -1, "Flag to check specific event generator (for HF): -1 -> no check, 0 -> MB events, 4 -> charm triggered, 5 -> beauty triggered"}; // Track only selection, options to select only specific tracks 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, 6 -> custom track cuts via Configurable"}; @@ -1778,6 +1779,11 @@ struct QaEfficiency { } histos.fill(HIST("MC/generatedCollisions"), 3); + if (eventGeneratorType >= 0 && mcCollision.getSubGeneratorId() != eventGeneratorType) { + LOG(debug) << "Skipping event with different type of generator than the one requested"; + continue; + } + /// loop over reconstructed collisions for (const auto& collision : groupedCollisions) { histos.fill(HIST("MC/generatedCollisions"), 4); From 0c49d43210dbe1921fc546ede5900c2d950d6c3b Mon Sep 17 00:00:00 2001 From: Zuzanna Chochulska <87480906+zchochul@users.noreply.github.com> Date: Mon, 10 Feb 2025 21:39:12 +0100 Subject: [PATCH 0136/1650] [PWGCF] FemtoUniverse -- MC reco and MC truth histograms for p and Phi (pT and pTvsEta) (#9861) Co-authored-by: Zuzanna Chochulska <01150674@pw.edu.pl> --- .../Tasks/femtoUniversePairTaskTrackPhi.cxx | 148 ++++++------------ 1 file changed, 49 insertions(+), 99 deletions(-) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx index 4cc283b8505..d1154b75a25 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx @@ -112,16 +112,6 @@ struct FemtoUniversePairTaskTrackPhi { (aod::femtouniverseparticle::pt > ConfTrack.confTrackPtLowLimit.value) && (aod::femtouniverseparticle::pt < ConfTrack.confTrackPtHighLimit.value); - Partition> partsTrackMCReco = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kTrack)) && - (aod::femtouniverseparticle::sign == ConfTrack.confTrackSign.value) && - (aod::femtouniverseparticle::pt > ConfTrack.confTrackPtLowLimit.value) && - (aod::femtouniverseparticle::pt < ConfTrack.confTrackPtHighLimit.value); - - Partition> partsTrackMCTruth = aod::femtouniverseparticle::partType == static_cast(aod::femtouniverseparticle::ParticleType::kMCTruthTrack) && - (aod::femtouniverseparticle::pidCut == static_cast(ConfTrack.confTrackPDGCode)) && - (aod::femtouniverseparticle::pt > ConfTrack.confTrackPtLowLimit.value) && - (aod::femtouniverseparticle::pt < ConfTrack.confTrackPtHighLimit.value); - /// Particle 2 --- PHI MESON struct : o2::framework::ConfigurableGroup { Configurable confPhiPtLowLimit{"confPhiPtLowLimit", 0.8, "Lower limit of the Phi pT."}; @@ -133,15 +123,6 @@ struct FemtoUniversePairTaskTrackPhi { (aod::femtouniverseparticle::pt > ConfPhi.confPhiPtLowLimit.value) && (aod::femtouniverseparticle::pt < ConfPhi.confPhiPtHighLimit.value); - Partition> partsPhiMCReco = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kPhi)) && - (aod::femtouniverseparticle::pt > ConfPhi.confPhiPtLowLimit.value) && - (aod::femtouniverseparticle::pt < ConfPhi.confPhiPtHighLimit.value); - - Partition> partsPhiMCTruth = (aod::femtouniverseparticle::partType == static_cast(aod::femtouniverseparticle::ParticleType::kMCTruthTrack)) && - - (aod::femtouniverseparticle::pidCut == static_cast(333)) && - (aod::femtouniverseparticle::pt > ConfPhi.confPhiPtLowLimit.value) && - (aod::femtouniverseparticle::pt < ConfPhi.confPhiPtHighLimit.value); /// Partitions for Phi daughters kPhiChild Partition partsPhiDaugh = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kPhiChild)); Partition> partsPhiDaughMC = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kPhiChild)); @@ -416,22 +397,36 @@ struct FemtoUniversePairTaskTrackPhi { qaRegistry.add("Hadron/nSigmaTOFKa", "; #it{p} (GeV/#it{c}); n#sigma_{TOFKa}", kTH2F, {{100, 0, 10}, {200, -4.975, 5.025}}); // MC truth - registryMCtruth.add("MCtruthPhi", "MC truth Phi;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); registryMCtruth.add("MCtruthAllPositivePt", "MC truth all positive;#it{p}_{T} (GeV/c); #eta", {HistType::kTH1F, {{500, 0, 5}}}); registryMCtruth.add("MCtruthAllNegativePt", "MC truth all negative;#it{p}_{T} (GeV/c); #eta", {HistType::kTH1F, {{500, 0, 5}}}); + // K+ registryMCtruth.add("MCtruthKp", "MC truth K+;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); - registryMCtruth.add("MCtruthKm", "MC truth protons;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); registryMCtruth.add("MCtruthKpPt", "MC truth kaons positive;#it{p}_{T} (GeV/c)", {HistType::kTH1F, {{500, 0, 5}}}); + // K- + registryMCtruth.add("MCtruthKm", "MC truth protons;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); registryMCtruth.add("MCtruthKmPt", "MC truth kaons negative;#it{p}_{T} (GeV/c)", {HistType::kTH1F, {{500, 0, 5}}}); - registryMCtruth.add("MCtruthPpos", "MC truth proton;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); - registryMCtruth.add("MCtruthPneg", "MC truth antiproton;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + // p + registryMCtruth.add("MCtruthPpos", "MC truth protons;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + registryMCtruth.add("MCtruthPposPt", "MC truth protons;#it{p}_{T} (GeV/c)", {HistType::kTH1F, {{500, 0, 5}}}); + // pbar + registryMCtruth.add("MCtruthPneg", "MC truth antiprotons;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + registryMCtruth.add("MCtruthPnegPt", "MC truth antiproton;#it{p}_{T} (GeV/c)", {HistType::kTH1F, {{500, 0, 5}}}); + // phi + registryMCtruth.add("MCtruthPhi", "MC truth phi mesons;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + registryMCtruth.add("MCtruthPhiPt", "MC truth phi mesons;#it{p}_{T} (GeV/c)", {HistType::kTH1F, {{500, 0, 5}}}); // MC reco - registryMCreco.add("MCrecoPhi", "MC reco Phi;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); registryMCreco.add("MCrecoAllPositivePt", "MC reco all;#it{p}_{T} (GeV/c); #eta", {HistType::kTH1F, {{500, 0, 5}}}); registryMCreco.add("MCrecoAllNegativePt", "MC reco all;#it{p}_{T} (GeV/c); #eta", {HistType::kTH1F, {{500, 0, 5}}}); + // p registryMCreco.add("MCrecoPpos", "MC reco proton;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + registryMCreco.add("MCrecoPposPt", "MC reco proton; #it{p_T} (GeV/#it{c}); Counts", kTH1F, {{500, 0, 5}}); + // pbar registryMCreco.add("MCrecoPneg", "MC reco antiproton;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + registryMCreco.add("MCrecoPnegPt", "MC reco antiproton; #it{p_T} (GeV/#it{c}); Counts", kTH1F, {{500, 0, 5}}); + // phi + registryMCreco.add("MCrecoPhi", "MC reco Phi;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + registryMCreco.add("MCrecoPhiPt", "MC reco Phi; #it{p_T} (GeV/#it{c}); Counts", kTH1F, {{500, 0, 5}}); trackHistoPartPhi.init(&qaRegistry, confBinsTempFitVarpT, confBinsTempFitVarInvMass, ConfBothTracks.confIsMC.value, 333); trackHistoPartTrack.init(&qaRegistry, confBinsTempFitVarpT, confBinsTempFitVar, ConfBothTracks.confIsMC.value, ConfTrack.confTrackPDGCode.value); @@ -619,31 +614,6 @@ struct FemtoUniversePairTaskTrackPhi { } PROCESS_SWITCH(FemtoUniversePairTaskTrackPhi, processSameEvent, "Enable processing same event", true); - /// process function for to call doSameEvent with Monte Carlo - /// \param col subscribe to the collision table (Monte Carlo Reconstructed reconstructed) - /// \param parts subscribe to joined table FemtoUniverseParticles and FemtoUniverseMCLables to access Monte Carlo truth - /// \param FemtoUniverseMCParticles subscribe to the Monte Carlo truth table - void processSameEventMC(o2::aod::FdCollision const& col, - soa::Join const& parts, - o2::aod::FdMCParticles const&) - { - fillCollision(col); - - auto groupMCTruthTrack = partsTrackMCTruth->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - efficiencyCalculator.doMCTruth<1>(hMCTruth1, groupMCTruthTrack); - - auto groupMCTruthPhi = partsPhiMCTruth->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - efficiencyCalculator.doMCTruth<2>(hMCTruth2, groupMCTruthPhi); - - auto thegroupPartsTrack = partsTrackMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - auto thegroupPartsPhi = partsPhiMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - auto thegroupPartsPhiDaugh = partsPhiDaughMC->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - auto thegroupPartsKaons = partsKaonsMC->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - - doSameEvent(thegroupPartsTrack, thegroupPartsPhi, thegroupPartsPhiDaugh, thegroupPartsKaons, parts, col.magField(), col.multNtr()); - } - PROCESS_SWITCH(FemtoUniversePairTaskTrackPhi, processSameEventMC, "Enable processing same event for Monte Carlo", false); - /// This function processes the mixed event /// \todo the trivial loops over the collisions and tracks should be factored out since they will be common to all combinations of T-T, T-V0, V0-V0, ... /// \tparam PartitionType @@ -722,36 +692,6 @@ struct FemtoUniversePairTaskTrackPhi { } PROCESS_SWITCH(FemtoUniversePairTaskTrackPhi, processMixedEvent, "Enable processing mixed events", true); - /// brief process function for to call doMixedEvent with Monte Carlo - /// @param cols subscribe to the collisions table (Monte Carlo Reconstructed reconstructed) - /// @param parts subscribe to joined table FemtoUniverseParticles and FemtoUniverseMCLables to access Monte Carlo truth - /// @param FemtoUniverseMCParticles subscribe to the Monte Carlo truth table - void processMixedEventMC(o2::aod::FdCollisions const& cols, - soa::Join const& parts, - o2::aod::FdMCParticles const&) - { - for (auto const& [collision1, collision2] : soa::selfCombinations(colBinning, 5, -1, cols, cols)) { - - const int multiplicityCol = collision1.multNtr(); - mixQaRegistry.fill(HIST("MixingQA/hMECollisionBins"), colBinning.getBin({collision1.posZ(), multiplicityCol})); - - auto groupPartsTrack = partsTrackMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision2.globalIndex(), cache); - auto groupPartsPhi = partsPhiMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex(), cache); - - const auto& magFieldTesla1 = collision1.magField(); - const auto& magFieldTesla2 = collision2.magField(); - - if (magFieldTesla1 != magFieldTesla2) { - continue; - } - /// \todo before mixing we should check whether both collisions contain a pair of particles! - // if (partsPhi.size() == 0 || NPart2Evt1 == 0 || NPart1Evt2 == 0 || partsTrack.size() == 0 ) continue; - - doMixedEvent(groupPartsTrack, groupPartsPhi, parts, magFieldTesla1, multiplicityCol); - } - } - PROCESS_SWITCH(FemtoUniversePairTaskTrackPhi, processMixedEventMC, "Enable processing mixed events MC", false); - ///--------------------------------------------MC-------------------------------------------------/// /// This function fills MC truth particles from derived MC table @@ -767,30 +707,39 @@ struct FemtoUniversePairTaskTrackPhi { continue; } + // charge + if (pdgParticle->Charge() > 0.0) { registryMCtruth.fill(HIST("MCtruthAllPositivePt"), part.pt()); + if (pdgCode == 2212) { + registryMCtruth.fill(HIST("MCtruthPpos"), part.pt(), part.eta()); + registryMCtruth.fill(HIST("MCtruthPposPt"), part.pt()); + continue; + } else if (pdgCode == 321) { + registryMCtruth.fill(HIST("MCtruthKp"), part.pt(), part.eta()); + registryMCtruth.fill(HIST("MCtruthKpPt"), part.pt()); + continue; + } } - if (pdgCode == 321) { - registryMCtruth.fill(HIST("MCtruthKp"), part.pt(), part.eta()); - registryMCtruth.fill(HIST("MCtruthKpPt"), part.pt()); - } + // charge 0 if (pdgCode == 333) { registryMCtruth.fill(HIST("MCtruthPhi"), part.pt(), part.eta()); + registryMCtruth.fill(HIST("MCtruthPhiPt"), part.pt()); continue; } - if (pdgCode == 2212) { - registryMCtruth.fill(HIST("MCtruthPpos"), part.pt(), part.eta()); - } + // charge - if (pdgParticle->Charge() < 0.0) { registryMCtruth.fill(HIST("MCtruthAllNegativePt"), part.pt()); - } - if (pdgCode == -321) { - registryMCtruth.fill(HIST("MCtruthKm"), part.pt(), part.eta()); - registryMCtruth.fill(HIST("MCtruthKmPt"), part.pt()); - } - if (pdgCode == -2212) { - registryMCtruth.fill(HIST("MCtruthPneg"), part.pt(), part.eta()); + + if (pdgCode == -321) { + registryMCtruth.fill(HIST("MCtruthKm"), part.pt(), part.eta()); + registryMCtruth.fill(HIST("MCtruthKmPt"), part.pt()); + continue; + } else if (pdgCode == -2212) { + registryMCtruth.fill(HIST("MCtruthPneg"), part.pt(), part.eta()); + registryMCtruth.fill(HIST("MCtruthPnegPt"), part.pt()); + continue; + } } } } @@ -803,25 +752,26 @@ struct FemtoUniversePairTaskTrackPhi { if (mcPartId == -1) continue; // no MC particle const auto& mcpart = mcparts.iteratorAt(mcPartId); - if (part.partType() == aod::femtouniverseparticle::ParticleType::kPhi) { - if ((mcpart.pdgMCTruth() == 333) && (mcpart.partOriginMCTruth() == aod::femtouniverse_mc_particle::ParticleOriginMCTruth::kPrimary)) { - registryMCreco.fill(HIST("MCrecoPhi"), mcpart.pt(), mcpart.eta()); // phi - } + if ((part.partType() == aod::femtouniverseparticle::ParticleType::kPhi) && (mcpart.pdgMCTruth() == 333) && (mcpart.partOriginMCTruth() == aod::femtouniverse_mc_particle::ParticleOriginMCTruth::kPrimary)) { + registryMCreco.fill(HIST("MCrecoPhi"), mcpart.pt(), mcpart.eta()); // phi + registryMCreco.fill(HIST("MCrecoPhiPt"), mcpart.pt()); } else if (part.partType() == aod::femtouniverseparticle::ParticleType::kTrack) { if (part.sign() > 0) { registryMCreco.fill(HIST("MCrecoAllPositivePt"), mcpart.pt()); if (mcpart.pdgMCTruth() == 2212 && isParticleNSigmaAccepted(part.p(), trackCuts.getNsigmaTPC(part, o2::track::PID::Proton), trackCuts.getNsigmaTOF(part, o2::track::PID::Proton), trackCuts.getNsigmaTPC(part, o2::track::PID::Pion), trackCuts.getNsigmaTOF(part, o2::track::PID::Pion), trackCuts.getNsigmaTPC(part, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(part, o2::track::PID::Kaon))) { registryMCreco.fill(HIST("MCrecoPpos"), mcpart.pt(), mcpart.eta()); + registryMCreco.fill(HIST("MCrecoPposPt"), mcpart.pt()); } } - if (part.sign() < 0) { + else if (part.sign() < 0) { registryMCreco.fill(HIST("MCrecoAllNegativePt"), mcpart.pt()); if (mcpart.pdgMCTruth() == -2212 && isParticleNSigmaAccepted(part.p(), trackCuts.getNsigmaTPC(part, o2::track::PID::Proton), trackCuts.getNsigmaTOF(part, o2::track::PID::Proton), trackCuts.getNsigmaTPC(part, o2::track::PID::Pion), trackCuts.getNsigmaTOF(part, o2::track::PID::Pion), trackCuts.getNsigmaTPC(part, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(part, o2::track::PID::Kaon))) { registryMCreco.fill(HIST("MCrecoPneg"), mcpart.pt(), mcpart.eta()); + registryMCreco.fill(HIST("MCrecoPnegPt"), mcpart.pt()); } } - } // partType + } // partType kTrack } } From fccaf3b72c288fe2f0d9adb19f6436cc8c0bd5d5 Mon Sep 17 00:00:00 2001 From: Tanu Gahlaut <154991749+TGahlaut1@users.noreply.github.com> Date: Tue, 11 Feb 2025 02:55:59 +0530 Subject: [PATCH 0137/1650] [PWGCF] Update efficiency corrections and histograms (#9744) --- PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx | 620 +++++++++++------- 1 file changed, 399 insertions(+), 221 deletions(-) diff --git a/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx b/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx index 56161b37473..6cf50aebc16 100644 --- a/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx @@ -16,6 +16,7 @@ /// /// \author Tanu Gahlaut +#include #include #include @@ -41,10 +42,10 @@ using namespace o2::constants::physics; using namespace std; struct MeanPtFlucId { - Configurable nPtBins{"nPtBins", 300, ""}; + Configurable nPBins{"nPBins", 300, ""}; Configurable nPartBins{"nPartBins", 250, ""}; Configurable nCentBins{"nCentBins", 101, ""}; - Configurable nEtaBins{"nEtaBins", 100, ""}; + Configurable nRapBins{"nRapBins", 100, ""}; Configurable nPhiBins{"nPhiBins", 100, ""}; Configurable cfgCutPtMax{"cfgCutPtMax", 3.0, "maximum pT"}; Configurable cfgCutPtMin{"cfgCutPtMin", 0.15, "minimum pT"}; @@ -69,23 +70,23 @@ struct MeanPtFlucId { Configurable cfgCutKaP3{"cfgCutKaP3", 1.2, "kaon p cut-3"}; Configurable cfgCutPrP1{"cfgCutPrP1", 0.9, "proton p cut-1"}; Configurable cfgCutPrP2{"cfgCutPrP2", 1.0, "proton p cut-2"}; - Configurable cfgMcTpcShiftEl{"cfgMcTpcShiftEl", 0., "Electron Shift in TPC (MC data) "}; - Configurable cfgMcTpcShiftPi{"cfgMcTpcShiftPi", 0., "Pion Shift in TPC (MC data) "}; - Configurable cfgMcTpcShiftKa{"cfgMcTpcShiftKa", 0., "Kaon Shift in TPC (MC data) "}; - Configurable cfgMcTpcShiftPr{"cfgMcTpcShiftPr", 0., "Proton Shift in TPC (MC data) "}; - Configurable cfgMcTofShiftPi{"cfgMcTofShiftPi", 0., "Pion Shift in TOF (MC data) "}; - Configurable cfgMcTofShiftKa{"cfgMcTofShiftKa", 0., "Kaon Shift in TOF (MC data) "}; - Configurable cfgMcTofShiftPr{"cfgMcTofShiftPr", 0., "Proton Shift in TOF (MC data) "}; + Configurable cfgRun3{"cfgRun3", true, ""}; + Configurable cfgRun2{"cfgRun2", false, ""}; Configurable cfgCorrection{"cfgCorrection", true, "Efficiency Correction"}; + Configurable cfgCorrectionPtEta{"cfgCorrectionPtEta", false, "Efficiency Correction for pT and eta"}; Configurable cfgPidCut{"cfgPidCut", false, ""}; Configurable cfgPDGCodeOnly{"cfgPDGCodeOnly", true, ""}; Configurable cfgMCReco{"cfgMCReco", false, ""}; Configurable cfgMCTruth{"cfgMCTruth", false, ""}; Configurable cfgPosZ{"cfgPosZ", true, "Position Z"}; + Configurable cfgSel7{"cfgSel7", true, "Run2 Sel7 trigger"}; + Configurable cfgkINT7{"cfgkINT7", true, "Run2 MB trigger"}; Configurable cfgSel8{"cfgSel8", true, "Sel8 trigger"}; - Configurable cfgEvSel1{"cfgEvSel1", true, "kNoSameBunchPileup"}; - Configurable cfgEvSel2{"cfgEvSel2", true, "kIsGoodZvtxFT0vsPV"}; - Configurable cfgEvSel3{"cfgEvSel3", true, "kIsVertexITSTPC"}; + Configurable cfgNoSameBunchPileup{"cfgNoSameBunchPileup", true, "kNoSameBunchPileup"}; + Configurable cfgIsVertexITSTPC{"cfgIsVertexITSTPC", true, "kIsVertexITSTPC"}; + Configurable cfgIsGoodZvtxFT0vsPV{"cfgIsGoodZvtxFT0vsPV", true, "kIsGoodZvtxFT0vsPV"}; + Configurable cfgTVXinTRD{"cfgTVXinTRD", true, "cfgTVXinTRD"}; + Configurable cfgNoCollInTimeRangeStandard{"cfgNoCollInTimeRangeStandard", true, "cfgNoCollInTimeRangeStandard"}; Configurable cfgRejTrk{"cfgRejTrk", true, "Rejected Tracks"}; Configurable cfgInvMass{"cfgInvMass", true, "electron Inv Mass cut selection"}; Configurable cfgSelOR{"cfgSelOR", true, "Low OR High momentum "}; @@ -100,21 +101,23 @@ struct MeanPtFlucId { ConfigurableAxis qNBins{"qNBins", {1000, 0., 100.}, "nth moments bins"}; ConfigurableAxis tpNBins{"tpNBins", {300, 0., 3000.}, ""}; ConfigurableAxis tpDBins{"tpDBins", {100, 0., 2000.}, ""}; - Configurable> effBinsCh{"effBinsCh", {0.0, 0.15, 0.21, 0.27, 0.33, 0.39, 0.45, 0.51, 0.57, 0.63, 0.69, 0.75, 0.81, 0.87, 0.93, 0.99, 1.05, 1.11, 1.17, 1.23, 1.29, 1.35, 1.41, 1.47, 1.53, 1.59, 1.65, 1.71, 1.77, 1.83, 1.89, 1.95, 2.01, 2.07, 2.13, 2.19, 2.25, 2.31, 2.37, 2.43, 2.49, 2.55, 2.61, 2.67, 2.73, 2.79, 2.85, 2.91, 2.97}, "efficiency bins (pT values) Charged Particles"}; - Configurable> effValuesCh{"effValuesCh", {0, 0, 0.435317, 0.494436, 0.503395, 0.502586, 0.512747, 0.520725, 0.529907, 0.539101, 0.54681, 0.553512, 0.560189, 0.565234, 0.569757, 0.574745, 0.57974, 0.583599, 0.589339, 0.594742, 0.60012, 0.604169, 0.607755, 0.611133, 0.613578, 0.616077, 0.618396, 0.619847, 0.621875, 0.623413, 0.627201, 0.627984, 0.631526, 0.632296, 0.63471, 0.63624, 0.637429, 0.638796, 0.640041, 0.640788, 0.641945, 0.643148, 0.643847, 0.644747, 0.645518, 0.64564, 0.64666, 0.648487, 0.648268}, "effeciency values for Charged Particles"}; - Configurable> effBinsPi{"effBinsPi", {0.0, 0.15, 0.21, 0.27, 0.33, 0.39, 0.45, 0.51, 0.57, 0.63, 0.69, 0.75, 0.81, 0.87, 0.93, 0.99, 1.05, 1.11, 1.17, 1.23, 1.29, 1.35, 1.41, 1.47, 1.53, 1.59, 1.65, 1.71, 1.77, 1.83, 1.89, 1.95, 2.01, 2.07, 2.13, 2.19, 2.25, 2.31, 2.37, 2.43, 2.49, 2.55, 2.61, 2.67, 2.73, 2.79, 2.85, 2.91, 2.97}, "efficiency bins (pT values) Pions"}; - Configurable> effValuesPi{"effValuesPi", {0, 0, 0, 0.408355, 0.488592, 0.509333, 0.497128, 0.507991, 0.496943, 0.40662, 0.258538, 0.243233, 0.241846, 0.250071, 0.262291, 0.248057, 0.267254, 0.26737, 0.265936, 0.281005, 0.274334, 0.27516, 0.300657, 0.289959, 0.282069, 0.294051, 0.301641, 0.303343, 0.307977, 0.29608, 0.331465, 0.32967, 0.336072, 0.30333, 0.348004, 0.38252, 0.327522, 0.377358, 0.367223, 0.330389, 0.34334, 0.35343, 0.358242, 0.341523, 0.369942, 0.341176, 0.317784, 0.384083, 0.359504, 0.375}, "effeciency values for Pions"}; - Configurable> effBinsKa{"effBinsKa", {0.03, 0.09, 0.15, 0.21, 0.27, 0.33, 0.39, 0.45, 0.51, 0.57, 0.63, 0.69, 0.75, 0.81, 0.87, 0.93, 0.99, 1.05, 1.11, 1.17, 1.23, 1.29, 1.35, 1.41, 1.47, 1.53, 1.59, 1.65, 1.71, 1.77, 1.83, 1.89, 1.95, 2.01, 2.07, 2.13, 2.19, 2.25, 2.31, 2.37, 2.43, 2.49, 2.55, 2.61, 2.67, 2.73, 2.79, 2.85, 2.91, 2.97}, "efficiency bins (pT values) Kaons"}; - Configurable> effValuesKa{"effValuesKa", {0, 0, 0, 0, 0, 0.365424, 0.370427, 0.386149, 0.360516, 0.266547, 0.145036, 0.145861, 0.154678, 0.15995, 0.1826, 0.198502, 0.187345, 0.187205, 0.183396, 0.223104, 0.176249, 0.215336, 0.227273, 0.233509, 0.193033, 0.25, 0.258528, 0.264529, 0.272912, 0.311301, 0.316708, 0.367816, 0.391304, 0.406897, 0.412214, 0.44843, 0.448718, 0.55665, 0.429319, 0.438272, 0.455621, 0.458647, 0.585366, 0.632812, 0.586777, 0.576087, 0.561798, 0.869565, 0.581395, 0.693548}, "effeciency values for Kaons"}; - Configurable> effBinsPr{"effBinsPr", {0.0, 0.03, 0.09, 0.15, 0.21, 0.27, 0.33, 0.39, 0.45, 0.51, 0.57, 0.63, 0.69, 0.75, 0.81, 0.87, 0.93, 0.99, 1.05, 1.11, 1.17, 1.23, 1.29, 1.35, 1.41, 1.47, 1.53, 1.59, 1.65, 1.71, 1.77, 1.83, 1.89, 1.95, 2.01, 2.07, 2.13, 2.19, 2.25, 2.31, 2.37, 2.43, 2.49, 2.55, 2.61, 2.67, 2.73, 2.79, 2.85, 2.91, 2.97}, "efficiency bins (pT values) Protons"}; - Configurable> effValuesPr{"effValuesPr", {0, 0, 0, 0, 0, 0, 0, 0, 0.595092, 0.551847, 0.519799, 0.52448, 0.52731, 0.510297, 0.495957, 0.422495, 0.348326, 0.29927, 0.263708, 0.256588, 0.261725, 0.296721, 0.240589, 0.299127, 0.292776, 0.238776, 0.319372, 0.305882, 0.27451, 0.262295, 0.302548, 0.228669, 0.301653, 0.279817, 0.271028, 0.278947, 0.370861, 0.271605, 0.421488, 0.315385, 0.322581, 0.526882, 0.397959, 0.574468, 0.564103, 0.380435, 0.296296, 0.368421, 0.480769, 0.413333}, "effeciency values for Protons"}; + Configurable> ptBins{"ptBins", {0.15, 0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50, 0.55, 0.60, 0.65, 0.70, 0.75, 0.80, 0.85, 0.90, 0.95, 1.00, 1.05, 1.10, 1.15, 1.20, 1.25, 1.30, 1.35, 1.40, 1.45, 1.50, 1.55, 1.60, 1.65, 1.70, 1.75, 1.80, 1.85, 1.90, 1.95, 2.00}, "p_{T} bins"}; + Configurable> etaBins{"etaBins", {-0.8, -0.7, -0.6, -0.5, -0.4, -0.3, -0.2, -0.1, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8}, "#eta bins"}; + Configurable> rapBins{"rapBins", {-0.6, -0.5, -0.4, -0.3, -0.2, -0.1, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6}, "#rap bins"}; + Configurable> effValuesCh{"effValuesCh", {0, 0.429014, 0.487349, 0.491862, 0.487173, 0.493464, 0.502531, 0.510066, 0.517214, 0.524902, 0.529725, 0.537065, 0.542265, 0.546103, 0.549713, 0.555139, 0.55158, 0.562156, 0.563038, 0.568055, 0.570847, 0.580461, 0.580406, 0.585776, 0.587068, 0.598144, 0.590378, 0.609363, 0.607307, 0.604931, 0.6011, 0.593467, 0.61525, 0.61393, 0.61495, 0.610359, 0.622616}, "effeciency values for Charged Particles"}; + Configurable> effPtValuesPi{"effPtValuesPi", {0, 0.408075, 0.473332, 0.48221, 0.469699, 0.472676, 0.482403, 0.478351, 0.38468, 0.249696, 0.244316, 0.235498, 0.236493, 0.241719, 0.245363, 0.248324, 0.251595, 0.254327, 0.257727, 0.260208, 0.263414, 0.267699, 0.270322, 0.275128, 0.280835, 0.284328, 0.288791, 0.294786, 0.292418, 0.299766, 0.299413, 0.301257, 0.305466, 0.304929, 0.316837, 0.317915, 0.316018}, "effeciency values for Pions"}; + Configurable> effPtEtaValuesPi{"effPtEtaValuesPi", {0, 0, 0, 0.400058, 0.469632, 0.481628, 0.470343, 0.479434, 0.485532, 0.399748, 0.252337, 0.242448, 0.238033, 0.241385, 0.247947, 0.251316, 0.253647, 0.259705, 0.26139, 0.26566, 0.270122, 0.273559, 0.281532, 0.28531, 0.290786, 0.296129, 0.298688, 0.302411, 0.304526, 0.309276, 0.310814, 0.319945, 0.322188, 0.323646, 0.333198, 0.342838, 0.349902, 0.349663, 0.357027, 0.361007, 0.361765, 0.366801, 0.369578, 0.369184, 0.375378, 0.392854, 0.381762, 0.393439, 0.40179, 0.388955}, "pT eta effeciency values for Pions"}; + Configurable> effPtValuesKa{"effPtValuesKa", {0, 0, 0, 0.312144, 0.369847, 0.38878, 0.413275, 0.393619, 0.315429, 0.1375, 0.146659, 0.147163, 0.155197, 0.163588, 0.168412, 0.177936, 0.17782, 0.186872, 0.190744, 0.199436, 0.197739, 0.192307, 0.198484, 0.19927, 0.218019, 0.221942, 0.237642, 0.235765, 0.249873, 0.251034, 0.259014, 0.268821, 0.275786, 0.280998, 0.29936, 0.304559, 0.312684}, " effeciency values for Kaons"}; + Configurable> effPtEtaValuesKa{"effPtEtaValuesKa", {0, 0, 0, 0.400058, 0.469632, 0.481628, 0.470343, 0.479434, 0.485532, 0.399748, 0.252337, 0.242448, 0.238033, 0.241385, 0.247947, 0.251316, 0.253647, 0.259705, 0.26139, 0.26566, 0.270122, 0.273559, 0.281532, 0.28531, 0.290786, 0.296129, 0.298688, 0.302411, 0.304526, 0.309276, 0.310814, 0.319945, 0.322188, 0.323646, 0.333198, 0.342838, 0.349902, 0.349663, 0.357027, 0.361007, 0.361765, 0.366801, 0.369578, 0.369184, 0.375378, 0.392854, 0.381762, 0.393439, 0.40179, 0.388955}, "pT eta effeciency values for Kaons"}; + Configurable> effPtValuesPr{"effPtValuesPr", {0, 0, 0, 0, 0, 0, 0, 0.394712, 0.425251, 0.458426, 0.489121, 0.509505, 0.516103, 0.517117, 0.491584, 0.450721, 0.379836, 0.253402, 0.257575, 0.261382, 0.260373, 0.269008, 0.266811, 0.265011, 0.272768, 0.269553, 0.276003, 0.279878, 0.284216, 0.276346, 0.293437, 0.294727, 0.281017, 0.287609, 0.292402, 0.28614, 0.307208}, "effeciency values for Protons"}; + Configurable> effPtEtaValuesPr{"effPtEtaValuesPr", {0, 0, 0, 0, 0, 0, 0, 0, 0.393911, 0.422401, 0.462856, 0.498792, 0.512802, 0.518289, 0.495488, 0.448937, 0.331976, 0.256772, 0.26324, 0.265401, 0.270093, 0.273197, 0.27106, 0.277618, 0.276226, 0.28206, 0.289245, 0.285692, 0.29644, 0.282871, 0.28963, 0.29263, 0.29947, 0.30137, 0.311748, 0.326481, 0.321903, 0.334281, 0.342607, 0.374238, 0.356596, 0.398134, 0.386997, 0.382202, 0.390039, 0.390761, 0.4034, 0.4193, 0.405995, 0.408471}, "pT eta effeciency values for Protons"}; using MyAllTracks = soa::Join; - using MyCollisions = soa::Join; - using MyMCCollisions = soa::Join; + using MyRun3Collisions = soa::Join; + using MyRun3MCCollisions = soa::Join; using MyMCTracks = soa::Join ", kTH1D, {axisMeanPt}); @@ -314,9 +358,9 @@ struct MeanPtFlucId { hist.add("Gen/Charged/h_Q3", "Q3", qNMCHist); hist.add("Gen/Charged/h_Q4", "Q4", qNMCHist); hist.add("Gen/Charged/h_Q1_var", "Q1 vs N_{TPC}", qNMCHist); - hist.add("Gen/Charged/h_N_var", "N vs N_{TPC}", kTHnSparseD, {axisMultTPC, axisMult, axisMultFT0MMC}); - hist.add("Gen/Charged/h_twopart_nume_Mult_var", "twopart numerator", kTHnSparseD, {axisMultTPC, axisTpN, axisMultFT0MMC}); - hist.add("Gen/Charged/h_twopart_deno_Mult_var", "twopart denominator", kTHnSparseD, {axisMultTPC, axisTpD, axisMultFT0MMC}); + hist.add("Gen/Charged/h_N_var", "N vs N_{TPC}", kTHnSparseD, {axisMultTPC, axisMult, axisMultFT0M}); + hist.add("Gen/Charged/h_twopart_nume_Mult_var", "twopart numerator", kTHnSparseD, {axisMultTPC, axisTpN, axisMultFT0M}); + hist.add("Gen/Charged/h_twopart_deno_Mult_var", "twopart denominator", kTHnSparseD, {axisMultTPC, axisTpD, axisMultFT0M}); hist.add("Gen/Charged/p_mean_pT_Mult_var", " ", kTProfile, {axisMultTPC}); hist.add("Gen/Charged/p_CheckNCh", " 1/denominator vs N_{TPC} ", kTProfile, {axisMultTPC}); @@ -369,25 +413,39 @@ struct MeanPtFlucId { { hist.fill(HIST("QA/after/counts_evSelCuts"), 0); - if (cfgPosZ && std::abs(col.posZ()) > cfgCutPosZ) - return false; - hist.fill(HIST("QA/after/counts_evSelCuts"), 1); - - if (cfgSel8 && !col.sel8()) - return false; - hist.fill(HIST("QA/after/counts_evSelCuts"), 2); + if (cfgPosZ) { + if (std::abs(col.posZ()) > cfgCutPosZ) { + return false; + } + hist.fill(HIST("QA/after/counts_evSelCuts"), 1); + } - if (cfgEvSel1 && !col.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) - return false; - hist.fill(HIST("QA/after/counts_evSelCuts"), 3); + if (cfgSel8) { + if (!col.sel8()) { + return false; + } + hist.fill(HIST("QA/after/counts_evSelCuts"), 2); + } + if (cfgNoSameBunchPileup) { + if (!col.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { + return false; + } + hist.fill(HIST("QA/after/counts_evSelCuts"), 4); + } - if (cfgEvSel2 && !col.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) - return false; - hist.fill(HIST("QA/after/counts_evSelCuts"), 4); + if (cfgIsGoodZvtxFT0vsPV) { + if (!col.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { + return false; + } + hist.fill(HIST("QA/after/counts_evSelCuts"), 5); + } - if (cfgEvSel3 && !col.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) - return false; - hist.fill(HIST("QA/after/counts_evSelCuts"), 5); + if (cfgIsVertexITSTPC) { + if (!col.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) { + return false; + } + hist.fill(HIST("QA/after/counts_evSelCuts"), 6); + } return true; } @@ -396,7 +454,7 @@ struct MeanPtFlucId { template bool selTrack(T const& track) { - if (!track.isGlobalTrackWoPtEta()) + if (!track.isGlobalTrack()) return false; if (track.pt() < cfgCutPtMin) @@ -421,11 +479,11 @@ struct MeanPtFlucId { template bool rejectTracks(T const& track) { - if (((track.tpcNSigmaEl() - cfgMcTpcShiftEl) > -3. && - (track.tpcNSigmaEl() - cfgMcTpcShiftEl) < 5.) && - (std::fabs(track.tpcNSigmaPi() - cfgMcTpcShiftPi) > 3 && - std::fabs(track.tpcNSigmaKa() - cfgMcTpcShiftKa) > 3 && - std::fabs(track.tpcNSigmaPr() - cfgMcTpcShiftPr) > 3)) { + if (((track.tpcNSigmaEl()) > -3. && + (track.tpcNSigmaEl()) < 5.) && + (std::fabs(track.tpcNSigmaPi()) > 3 && + std::fabs(track.tpcNSigmaKa()) > 3 && + std::fabs(track.tpcNSigmaPr()) > 3)) { return true; } @@ -435,7 +493,7 @@ struct MeanPtFlucId { template bool selElectrons(T const& track) { - if (std::fabs(track.tpcNSigmaEl() - cfgMcTpcShiftEl) < cfgCutNSig3) { + if (std::fabs(track.tpcNSigmaEl()) < cfgCutNSig3) { return true; } @@ -444,14 +502,19 @@ struct MeanPtFlucId { // PID selction cuts for Low momentum Pions template - bool selLowPi(T const& track, double p) + bool selLowPi(T const& track) { if (track.pt() >= cfgCutPiPtMin && track.p() <= cfgCutPiThrsldP && - ((std::fabs(track.tpcNSigmaPi() - cfgMcTpcShiftPi) < cfgCutNSig3 && p <= cfgCutPiP1) || - (std::fabs(track.tpcNSigmaPi() - cfgMcTpcShiftPi) < cfgCutNSig2 && p > cfgCutPiP1 && p <= cfgCutPiP2))) { + std::abs(track.rapidity(MassPiPlus)) < cfgCutRap) { + if (!track.hasTOF() && + std::fabs(track.tpcNSigmaPi()) < cfgCutNSig3) { + return true; + } - if (std::abs(track.rapidity(MassPiPlus)) < cfgCutRap) { + if (track.hasTOF() && + std::fabs(track.tpcNSigmaPi()) < cfgCutNSig3 && + std::fabs(track.tofNSigmaPi()) < cfgCutNSig3) { return true; } } @@ -460,14 +523,19 @@ struct MeanPtFlucId { // PID selction cuts for Low momentum Kaons template - bool selLowKa(T const& track, double p) + bool selLowKa(T const& track) { if (track.pt() >= cfgCutKaPtMin && track.p() <= cfgCutKaThrsldP && - ((std::fabs(track.tpcNSigmaKa() - cfgMcTpcShiftKa) < cfgCutNSig3 && p <= cfgCutKaP1) || - (std::fabs(track.tpcNSigmaKa() - cfgMcTpcShiftKa) < cfgCutNSig2 && p > cfgCutKaP1 && p <= cfgCutKaP2))) { + std::abs(track.rapidity(MassKPlus)) < cfgCutRap) { + if (!track.hasTOF() && + std::fabs(track.tpcNSigmaKa()) < cfgCutNSig3) { + return true; + } - if (std::abs(track.rapidity(MassKPlus)) < cfgCutRap) { + if (track.hasTOF() && + std::fabs(track.tpcNSigmaKa()) < cfgCutNSig3 && + std::fabs(track.tofNSigmaKa()) < cfgCutNSig3) { return true; } } @@ -477,14 +545,19 @@ struct MeanPtFlucId { // PID selction cuts for Low momentum Protons template - bool selLowPr(T const& track, double p) + bool selLowPr(T const& track) { if (track.pt() >= cfgCutPrPtMin && track.p() <= cfgCutPrThrsldP && - ((std::fabs(track.tpcNSigmaPr() - cfgMcTpcShiftPr) < cfgCutNSig3 && p <= cfgCutPrP1) || - (std::fabs(track.tpcNSigmaPr() - cfgMcTpcShiftPr) < cfgCutNSig2 && p > cfgCutPrP1 && p <= cfgCutPrP2))) { + std::abs(track.rapidity(MassProton)) < cfgCutRap) { + if (!track.hasTOF() && + std::fabs(track.tpcNSigmaPr()) < cfgCutNSig3) { + return true; + } - if (std::abs(track.rapidity(MassProton)) < cfgCutRap) { + if (track.hasTOF() && + std::fabs(track.tpcNSigmaPr()) < cfgCutNSig3 && + std::fabs(track.tofNSigmaPr()) < cfgCutNSig3) { return true; } } @@ -498,8 +571,8 @@ struct MeanPtFlucId { { if (track.hasTOF() && track.p() > cfgCutPiThrsldP && - std::fabs(track.tpcNSigmaPi() - cfgMcTpcShiftPi) < cfgCutNSig3 && - std::fabs(track.tofNSigmaPi() - cfgMcTofShiftPi) < cfgCutNSig3) { + std::fabs(track.tpcNSigmaPi()) < cfgCutNSig3 && + std::fabs(track.tofNSigmaPi()) < cfgCutNSig3) { if (std::abs(track.rapidity(MassPiPlus)) < cfgCutRap) { return true; @@ -515,9 +588,9 @@ struct MeanPtFlucId { { if (track.hasTOF() && track.p() > cfgCutKaThrsldP && - std::fabs(track.tpcNSigmaKa() - cfgMcTpcShiftKa) < cfgCutNSig3 && - ((std::fabs(track.tofNSigmaKa() - cfgMcTofShiftKa) < cfgCutNSig3 && track.p() <= cfgCutKaP3) || - (std::fabs(track.tofNSigmaKa() - cfgMcTofShiftKa) < cfgCutNSig2 && track.p() > cfgCutKaP3))) { + std::fabs(track.tpcNSigmaKa()) < cfgCutNSig3 && + ((std::fabs(track.tofNSigmaKa()) < cfgCutNSig3 && track.p() <= cfgCutKaP3) || + (std::fabs(track.tofNSigmaKa()) < cfgCutNSig2 && track.p() > cfgCutKaP3))) { if (std::abs(track.rapidity(MassKPlus)) < cfgCutRap) { return true; @@ -533,8 +606,8 @@ struct MeanPtFlucId { { if (track.hasTOF() && track.p() > cfgCutPrThrsldP && - std::fabs(track.tpcNSigmaPr() - cfgMcTpcShiftPr) < cfgCutNSig3 && - std::fabs(track.tofNSigmaPr() - cfgMcTofShiftPr) < cfgCutNSig3) { + std::fabs(track.tpcNSigmaPr()) < cfgCutNSig3 && + std::fabs(track.tofNSigmaPr()) < cfgCutNSig3) { if (std::abs(track.rapidity(MassProton)) < cfgCutRap) { return true; @@ -545,7 +618,7 @@ struct MeanPtFlucId { } // To find the pT bin - int findBin(float pT, const std::vector& bins) + int findBin(float pT, const std::vector& bins) { for (size_t i = 0; i < bins.size() - 1; ++i) { if (pT >= bins[i] && pT < bins[i + 1]) { @@ -555,6 +628,30 @@ struct MeanPtFlucId { return -1; } + // Find bin index for both pT and eta + std::pair find2DBin(float pT, float eta, const std::vector& ptBins, const std::vector& etaBins) + { + int ptBin = -1, etaBin = -1; + + // Find pT bin + for (size_t i = 0; i < ptBins.size() - 1; ++i) { + if (pT >= ptBins[i] && pT < ptBins[i + 1]) { + ptBin = i + 1; // ROOT bins start from 1 + break; + } + } + + // Find eta bin + for (size_t j = 0; j < etaBins.size() - 1; ++j) { + if (eta >= etaBins[j] && eta < etaBins[j + 1]) { + etaBin = j + 1; + break; + } + } + + return {ptBin, etaBin}; + } + // Fill hist before selection cuts: template void fillBeforeQAHistos(T const& col, U const& tracks) @@ -572,65 +669,48 @@ struct MeanPtFlucId { hist.fill(HIST("QA/before/h_DcaZ"), track.dcaZ()); hist.fill(HIST("QA/before/h2_DcaXY"), track.pt(), track.dcaXY()); hist.fill(HIST("QA/before/h2_DcaZ"), track.pt(), track.dcaZ()); - if (track.hasTOF()) hist.fill(HIST("QA/before/h2_PtofvsPinner"), track.p(), track.tpcInnerParam()); } hist.fill(HIST("QA/before/h_VtxZ"), col.posZ()); hist.fill(HIST("QA/before/h_Counts"), 2); - - int nTPC = col.multNTracksHasTPC(); - int nFT0M = col.multFT0M(); - int nFT0C = col.multFT0C(); - double centFT0C = col.centFT0C(); - double centFT0M = col.centFT0M(); - - if (nTPC != 0 && nFT0M != 0) { - hist.fill(HIST("QA/before/h_NTPC"), nTPC); - hist.fill(HIST("QA/before/h_Cent"), centFT0C); - hist.fill(HIST("QA/before/h_CentM"), centFT0M); - hist.fill(HIST("QA/before/h_NFT0M"), nFT0M); - hist.fill(HIST("QA/before/h_NFT0C"), nFT0M); - hist.fill(HIST("QA/before/h2_NTPC_NFT0M"), nFT0M, nTPC); - hist.fill(HIST("QA/before/h2_NTPC_NFT0C"), nFT0C, nTPC); - hist.fill(HIST("QA/before/h2_NTPC_Cent"), centFT0C, nTPC); - } + hist.fill(HIST("QA/before/h_NTPC"), col.multNTracksHasTPC()); + hist.fill(HIST("QA/before/h_Cent"), col.centFT0C()); + hist.fill(HIST("QA/after/h_CentM"), col.centFT0M()); + hist.fill(HIST("QA/before/h_NFT0M"), col.multFT0M()); + hist.fill(HIST("QA/before/h_NFT0C"), col.multFT0M()); + hist.fill(HIST("QA/before/h2_NTPC_NFT0M"), col.multFT0M(), col.multNTracksHasTPC()); + hist.fill(HIST("QA/before/h2_NTPC_NFT0C"), col.multFT0C(), col.multNTracksHasTPC()); + hist.fill(HIST("QA/before/h2_NTPC_Cent"), col.centFT0C(), col.multNTracksHasTPC()); } // Fill hist after selection cuts: template void fillAfterQAHistos(T const& col) { - int nTPC = col.multNTracksHasTPC(); - int nFT0M = col.multFT0M(); - int nFT0C = col.multFT0C(); - double centFT0C = col.centFT0C(); - double centFT0M = col.centFT0M(); - hist.fill(HIST("QA/after/h_VtxZ"), col.posZ()); hist.fill(HIST("QA/after/h_Counts"), 2); - if (nTPC != 0 && nFT0M != 0) { - hist.fill(HIST("QA/after/h_NTPC"), nTPC); - hist.fill(HIST("QA/after/h_Cent"), centFT0C); - hist.fill(HIST("QA/after/h_CentM"), centFT0M); - hist.fill(HIST("QA/after/h_NFT0M"), nFT0M); - hist.fill(HIST("QA/after/h_NFT0C"), nFT0C); - hist.fill(HIST("QA/after/h2_NTPC_NFT0M"), nFT0M, nTPC); - hist.fill(HIST("QA/after/h2_NTPC_NFT0C"), nFT0C, nTPC); - hist.fill(HIST("QA/after/h2_NTPC_Cent"), centFT0C, nTPC); - hist.fill(HIST("QA/after/p_NTPC_Cent"), centFT0C, nTPC); - hist.fill(HIST("QA/after/p_NTPC_NFT0M"), nFT0M, nTPC); - hist.fill(HIST("QA/after/p_NTPC_NFT0C"), nFT0C, nTPC); - } + hist.fill(HIST("QA/after/h_NTPC"), col.multNTracksHasTPC()); + hist.fill(HIST("QA/after/h_Cent"), col.centFT0C()); + hist.fill(HIST("QA/after/h_CentM"), col.centFT0M()); + hist.fill(HIST("QA/after/h_NFT0M"), col.multFT0M()); + hist.fill(HIST("QA/after/h_NFT0C"), col.multFT0C()); + hist.fill(HIST("QA/after/h2_NTPC_NFT0M"), col.multFT0M(), col.multNTracksHasTPC()); + hist.fill(HIST("QA/after/h2_NTPC_NFT0C"), col.multFT0C(), col.multNTracksHasTPC()); + hist.fill(HIST("QA/after/h2_NTPC_Cent"), col.centFT0C(), col.multNTracksHasTPC()); + hist.fill(HIST("QA/after/p_NTPC_Cent"), col.centFT0C(), col.multNTracksHasTPC()); + hist.fill(HIST("QA/after/p_NTPC_NFT0M"), col.multFT0M(), col.multNTracksHasTPC()); + hist.fill(HIST("QA/after/p_NTPC_NFT0C"), col.multFT0C(), col.multNTracksHasTPC()); } // Fill Charged particles QA: template - void fillChargedQAHistos(T const& track) + void fillChargedQAHistos(T const& track, int nFT0M) { hist.fill(HIST("QA/after/h_Eta"), track.eta()); hist.fill(HIST("QA/after/h_Phi"), track.phi()); hist.fill(HIST("QA/after/h_Pt"), track.pt()); + hist.fill(HIST("QA/after/h2_Pt_NFT0M"), track.pt(), nFT0M); hist.fill(HIST("QA/after/h2_PvsPinner"), track.p(), track.tpcInnerParam()); hist.fill(HIST("QA/after/h2_Pt_Eta"), track.eta(), track.pt()); hist.fill(HIST("QA/after/h_DcaZ"), track.dcaZ()); @@ -690,34 +770,60 @@ struct MeanPtFlucId { // Fill after PID cut QA hist: template - void fillIdParticleQAHistos(T const& track, std::vector effBins, std::vector effValues, double rap, double nSigmaTPC, double nSigmaTOF, int& N, double& Q1, double& Q2, double& Q3, double& Q4) + void fillIdParticleQAHistos(T const& track, const std::vector& ptBins, const std::vector& etaBins, const std::vector& effPtValues, const std::vector& effPtEtaValues, double rap, double nSigmaTPC, double nSigmaTOF, int nFT0M, int& N, double& Q1, double& Q2, double& Q3, double& Q4) { double pt = track.pt(); + double eta = track.eta(); - if (cfgCorrection == true) { - int binIndex = findBin(pt, effBins); - auto effVal = static_cast>(effValues); + if (cfgCorrectionPtEta) { + auto [ptBin, etaBin] = find2DBin(pt, eta, ptBins, etaBins); + auto effPtEtaVal = static_cast>(effPtEtaValues); + + if (ptBin != -1 && etaBin != -1) { + int numPtBins = ptBins.size() - 1; // Number of pt bins + float efficiency = effPtEtaVal[etaBin * numPtBins + ptBin]; + + if (efficiency > 0) { + float weight = 1.0 / efficiency; + N += weight; + hist.fill(HIST(Dire[Mode]) + HIST("h2_Pt_Eta_weighted"), eta, pt, weight); + } + } + } else if (cfgCorrection) { + int binIndex = findBin(pt, ptBins); + auto effVal = static_cast>(effPtValues); if (binIndex != -1) { float efficiency = effVal[binIndex]; if (efficiency > 0) { float weight = 1.0 / efficiency; - N += static_cast(weight); - double ptCorrected = pt * weight; - moments(ptCorrected, Q1, Q2, Q3, Q4); - hist.fill(HIST(Dire[Mode]) + HIST("h_pt_weighted"), pt, weight); + N += weight; // Correct denominator correction + hist.fill(HIST(Dire[Mode]) + HIST("h_Pt_weighted"), pt, weight); } } } else { - N++; - moments(pt, Q1, Q2, Q3, Q4); + N++; // No correction applied } + moments(pt, Q1, Q2, Q3, Q4); + hist.fill(HIST(Dire[Mode]) + HIST("h_Pt"), track.pt()); - if (track.sign() > 0) + hist.fill(HIST(Dire[Mode]) + HIST("h_Eta"), track.eta()); + hist.fill(HIST(Dire[Mode]) + HIST("h2_Pt_NFT0M"), track.pt(), nFT0M); + hist.fill(HIST(Dire[Mode]) + HIST("h2_Pt_Eta"), track.eta(), track.pt()); + if (track.sign() > 0) { hist.fill(HIST(Dire[Mode]) + HIST("h_PtPos"), track.pt()); - - if (track.sign() < 0) + hist.fill(HIST(Dire[Mode]) + HIST("h_EtaPos"), track.eta()); + hist.fill(HIST(Dire[Mode]) + HIST("h2_PtPos_NFT0M"), track.pt(), nFT0M); + hist.fill(HIST(Dire[Mode]) + HIST("h2_PtPos_Eta"), track.eta(), track.pt()); + hist.fill(HIST(Dire[Mode]) + HIST("h2_PtPos_rap"), rap, track.pt()); + } + if (track.sign() < 0) { hist.fill(HIST(Dire[Mode]) + HIST("h_PtNeg"), track.pt()); + hist.fill(HIST(Dire[Mode]) + HIST("h_EtaNeg"), track.eta()); + hist.fill(HIST(Dire[Mode]) + HIST("h2_PtNeg_NFT0M"), track.pt(), nFT0M); + hist.fill(HIST(Dire[Mode]) + HIST("h2_PtNeg_Eta"), track.eta(), track.pt()); + hist.fill(HIST(Dire[Mode]) + HIST("h2_PtNeg_rap"), rap, track.pt()); + } hist.fill(HIST(Dire[Mode]) + HIST("h_Eta"), track.eta()); hist.fill(HIST(Dire[Mode]) + HIST("h_Phi"), track.phi()); @@ -756,14 +862,27 @@ struct MeanPtFlucId { } template - void fillPtMCHist(double pt, int pid, int pdgCodePos, int pdgCodeNeg) + void fillPtMCHist(double pt, double eta, double rap, int nFT0M, int pid, int pdgCodePos, int pdgCodeNeg) { hist.fill(HIST(Dire[Mode]) + HIST("h_PtTruth"), pt); + hist.fill(HIST(Dire[Mode]) + HIST("h_EtaTruth"), eta); + hist.fill(HIST(Dire[Mode]) + HIST("h2_PtTruth_NFT0M"), pt, nFT0M); + hist.fill(HIST(Dire[Mode]) + HIST("h2_PtTruth_Eta"), eta, pt); + hist.fill(HIST(Dire[Mode]) + HIST("h2_PtTruth_Rap"), rap, pt); + if (pid == pdgCodePos) { hist.fill(HIST(Dire[Mode]) + HIST("h_PtPosTruth"), pt); + hist.fill(HIST(Dire[Mode]) + HIST("h_EtaPosTruth"), eta); + hist.fill(HIST(Dire[Mode]) + HIST("h2_PtPosTruth_NFT0M"), pt, nFT0M); + hist.fill(HIST(Dire[Mode]) + HIST("h2_PtPosTruth_Eta"), eta, pt); + hist.fill(HIST(Dire[Mode]) + HIST("h2_PtPosTruth_Rap"), rap, pt); } if (pid == pdgCodeNeg) { hist.fill(HIST(Dire[Mode]) + HIST("h_PtNegTruth"), pt); + hist.fill(HIST(Dire[Mode]) + HIST("h_EtaNegTruth"), eta); + hist.fill(HIST(Dire[Mode]) + HIST("h2_PtNegTruth_NFT0M"), pt, nFT0M); + hist.fill(HIST(Dire[Mode]) + HIST("h2_PtNegTruth_Eta"), eta, pt); + hist.fill(HIST(Dire[Mode]) + HIST("h2_PtNegTruth_Rap"), rap, pt); } } @@ -822,15 +941,17 @@ struct MeanPtFlucId { template void fillHistos(T const& col, U const& tracks) { - int nCh = 0, nTPC = 0, nFT0M = 0; + int nCh = 0, nTPC = 0, nFT0M = 0, nFT0C = 0; + int nPi = 0, nKa = 0, nPr = 0; double ptCh = 0, q1Ch = 0, q2Ch = 0, q3Ch = 0, q4Ch = 0; double ptPi = 0, q1Pi = 0, q2Pi = 0, q3Pi = 0, q4Pi = 0; double ptPr = 0, q1Pr = 0, q2Pr = 0, q3Pr = 0, q4Pr = 0; double ptKa = 0, q1Ka = 0, q2Ka = 0, q3Ka = 0, q4Ka = 0; - int nChSim = 0, nSim = 0, NFT0CSim = 0; + int nChSim = 0, nSim = 0, nFT0CSim = 0; int nPiSim = 0, nKaSim = 0, nPrSim = 0; + double eta = 0, etaSim = 0, rapSim = 0; double ptChSim = 0, q1ChSim = 0, q2ChSim = 0, q3ChSim = 0, q4ChSim = 0; double ptPiSim = 0, q1PiSim = 0, q2PiSim = 0, q3PiSim = 0, q4PiSim = 0; double ptPrSim = 0, q1PrSim = 0, q2PrSim = 0, q3PrSim = 0, q4PrSim = 0; @@ -856,7 +977,13 @@ struct MeanPtFlucId { hist.fill(HIST("QA/after/h_invMass_gamma"), invMassGamma); } + fillAfterQAHistos(col); + if constexpr (DataFlag) { + nTPC = col.multNTracksHasTPC(); + nFT0M = col.multFT0M(); + nFT0C = col.multFT0C(); + for (const auto& track : tracks) { if (!selTrack(track)) { continue; @@ -871,28 +998,26 @@ struct MeanPtFlucId { double rapPi = track.rapidity(MassPiPlus); double rapKa = track.rapidity(MassKPlus); double rapPr = track.rapidity(MassProton); - double innerParam = track.tpcInnerParam(); if (std::fabs(track.eta()) < 0.8) { ptCh = track.pt(); if (cfgCorrection == true) { - int binIndex = findBin(ptCh, effBinsCh); + int binIndex = findBin(ptCh, ptBins); auto effValCh = static_cast>(effValuesCh); if (binIndex != -1) { float efficiency = effValCh[binIndex]; if (efficiency > 0) { float weight = 1.0 / efficiency; - nCh += static_cast(weight); - double ptChCorrected = ptCh * weight; - moments(ptChCorrected, q1Ch, q2Ch, q3Ch, q4Ch); - hist.fill(HIST("QA/after/h_pt_weighted"), ptCh, weight); + nCh += weight; // Correct denominator correction + hist.fill(HIST("QA/after/h_Pt_weighted"), ptCh, weight); } } } else { nCh++; - moments(ptCh, q1Ch, q2Ch, q3Ch, q4Ch); } - fillChargedQAHistos(track); + moments(ptCh, q1Ch, q2Ch, q3Ch, q4Ch); + + fillChargedQAHistos(track, nFT0M); } fillBeforePIDQAHistos(track); @@ -906,32 +1031,32 @@ struct MeanPtFlucId { } if (cfgSelOR == true && cfgSelAND == false) { - if (selLowPi(track, innerParam) == cfgSelLow || selHighPi(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, effBinsPi, effValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nPi, q1Pi, q2Pi, q3Pi, q4Pi); + if (selLowPi(track) == cfgSelLow || selHighPi(track) == cfgSelHigh) { + fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesPi, effPtEtaValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, q1Pi, q2Pi, q3Pi, q4Pi); } } else if (cfgSelOR == false && cfgSelAND == true) { - if (selLowPi(track, innerParam) == cfgSelLow && selHighPi(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, effBinsPi, effValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nPi, q1Pi, q2Pi, q3Pi, q4Pi); + if (selLowPi(track) == cfgSelLow && selHighPi(track) == cfgSelHigh) { + fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesPi, effPtEtaValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, q1Pi, q2Pi, q3Pi, q4Pi); } } if (cfgSelOR == true && cfgSelAND == false) { - if (selLowKa(track, innerParam) == cfgSelLow || selHighKa(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, effBinsKa, effValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nKa, q1Ka, q2Ka, q3Ka, q4Ka); + if (selLowKa(track) == cfgSelLow || selHighKa(track) == cfgSelHigh) { + fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesKa, effPtEtaValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, q1Ka, q2Ka, q3Ka, q4Ka); } } else if (cfgSelOR == false && cfgSelAND == true) { - if (selLowKa(track, innerParam) == cfgSelLow && selHighKa(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, effBinsKa, effValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nKa, q1Ka, q2Ka, q3Ka, q4Ka); + if (selLowKa(track) == cfgSelLow && selHighKa(track) == cfgSelHigh) { + fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesKa, effPtEtaValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, q1Ka, q2Ka, q3Ka, q4Ka); } } if (cfgSelOR == true && cfgSelAND == false) { - if (selLowPr(track, innerParam) == cfgSelLow && selHighPr(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, effBinsPr, effValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nPr, q1Pr, q2Pr, q3Pr, q4Pr); + if (selLowPr(track) == cfgSelLow || selHighPr(track) == cfgSelHigh) { + fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesPr, effPtEtaValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, q1Pr, q2Pr, q3Pr, q4Pr); } } else if (cfgSelOR == false && cfgSelAND == true) { - if (selLowPr(track, innerParam) == cfgSelLow && selHighPr(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, effBinsPr, effValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nPr, q1Pr, q2Pr, q3Pr, q4Pr); + if (selLowPr(track) == cfgSelLow && selHighPr(track) == cfgSelHigh) { + fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesPr, effPtEtaValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, q1Pr, q2Pr, q3Pr, q4Pr); } } } @@ -940,6 +1065,9 @@ struct MeanPtFlucId { LOGF(warning, "No MC collision for this collision, skip..."); return; } + nTPC = col.multNTracksHasTPC(); + nFT0M = col.multFT0M(); + nFT0C = col.multFT0C(); for (const auto& track : tracks) { if (!track.has_mcParticle()) { @@ -952,6 +1080,10 @@ struct MeanPtFlucId { continue; } + if (std::abs(track.eta()) < 0.8) { + nTPC++; + } + //______________________________Reconstructed Level____________________________________________________// if (selTrack(track)) { @@ -964,29 +1096,25 @@ struct MeanPtFlucId { double rapPi = track.rapidity(MassPiPlus); double rapKa = track.rapidity(MassKPlus); double rapPr = track.rapidity(MassProton); - double innerParam = track.tpcInnerParam(); if (std::fabs(track.eta()) < 0.8) { - nCh++; ptCh = track.pt(); if (cfgCorrection == true) { - int binIndex = findBin(ptCh, effBinsCh); + int binIndex = findBin(ptCh, ptBins); auto effValCh = static_cast>(effValuesCh); if (binIndex != -1) { float efficiency = effValCh[binIndex]; if (efficiency > 0) { float weight = 1.0 / efficiency; - nCh += static_cast(weight); - double ptChCorrected = ptCh * weight; - moments(ptChCorrected, q1Ch, q2Ch, q3Ch, q4Ch); - hist.fill(HIST("QA/after/h_pt_weighted"), ptCh, weight); + nCh += weight; // Correct denominator correction + hist.fill(HIST("QA/after/h_Pt_weighted"), ptCh, weight); } } } else { nCh++; - moments(ptCh, q1Ch, q2Ch, q3Ch, q4Ch); } - fillChargedQAHistos(track); + moments(ptCh, q1Ch, q2Ch, q3Ch, q4Ch); + fillChargedQAHistos(track, nFT0M); } fillBeforePIDQAHistos(track); @@ -998,77 +1126,78 @@ struct MeanPtFlucId { continue; } + eta = track.eta(); if (cfgPDGCodeOnly == true) { if (std::abs(pid) == kPiPlus && std::abs(rapPi) < 0.5 && track.pt() >= cfgCutPiPtMin) { ptPi = track.pt(); - fillIdParticleQAHistos(track, effBinsPi, effValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nPi, q1Pi, q2Pi, q3Pi, q4Pi); - fillPtMCHist(ptPi, pid, kPiPlus, kPiMinus); + fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesPi, effPtEtaValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, q1Pi, q2Pi, q3Pi, q4Pi); + fillPtMCHist(ptPi, eta, rapPi, nFT0M, pid, kPiPlus, kPiMinus); } if (std::abs(pid) == kKPlus && std::abs(rapKa) < 0.5 && track.pt() >= cfgCutKaPtMin) { ptKa = track.pt(); - fillIdParticleQAHistos(track, effBinsKa, effValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nKa, q1Ka, q2Ka, q3Ka, q4Ka); - fillPtMCHist(ptKa, pid, kKPlus, kKMinus); + fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesKa, effPtEtaValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, q1Ka, q2Ka, q3Ka, q4Ka); + fillPtMCHist(ptKa, eta, rapKa, nFT0M, pid, kKPlus, kKMinus); } if (std::abs(pid) == kProton && std::abs(rapPr) < 0.5 && track.pt() >= cfgCutPrPtMin) { ptPr = track.pt(); - fillIdParticleQAHistos(track, effBinsPr, effValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nPr, q1Pr, q2Pr, q3Pr, q4Pr); - fillPtMCHist(ptPr, pid, kProton, kProtonBar); + fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesPr, effPtEtaValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, q1Pr, q2Pr, q3Pr, q4Pr); + fillPtMCHist(ptPr, eta, rapPr, nFT0M, pid, kProton, kProtonBar); } } if (cfgPidCut == true) { if (cfgSelOR == true && cfgSelAND == false) { - if (selLowPi(track, innerParam) == cfgSelLow || selHighPi(track) == cfgSelHigh) { + if (selLowPi(track) == cfgSelLow || selHighPi(track) == cfgSelHigh) { ptPi = track.pt(); - fillIdParticleQAHistos(track, effBinsPi, effValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nPi, q1Pi, q2Pi, q3Pi, q4Pi); + fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesPi, effPtEtaValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, q1Pi, q2Pi, q3Pi, q4Pi); if (std::abs(pid) == kPiPlus) { - fillPtMCHist(ptPi, pid, kPiPlus, kPiMinus); + fillPtMCHist(ptPi, eta, rapPi, nFT0M, pid, kPiPlus, kPiMinus); } } } else if (cfgSelOR == false && cfgSelAND == true) { - if (selLowPi(track, innerParam) == cfgSelLow && selHighPi(track) == cfgSelHigh) { + if (selLowPi(track) == cfgSelLow && selHighPi(track) == cfgSelHigh) { ptPi = track.pt(); - fillIdParticleQAHistos(track, effBinsPi, effValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nPi, q1Pi, q2Pi, q3Pi, q4Pi); + fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesPi, effPtEtaValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, q1Pi, q2Pi, q3Pi, q4Pi); if (std::abs(pid) == kPiPlus) { - fillPtMCHist(ptPi, pid, kPiPlus, kPiMinus); + fillPtMCHist(ptPi, eta, rapPi, nFT0M, pid, kPiPlus, kPiMinus); } } } if (cfgSelOR == true && cfgSelAND == false) { - if (selLowKa(track, innerParam) == cfgSelLow || selHighKa(track) == cfgSelHigh) { + if (selLowKa(track) == cfgSelLow || selHighKa(track) == cfgSelHigh) { ptKa = track.pt(); - fillIdParticleQAHistos(track, effBinsKa, effValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nKa, q1Ka, q2Ka, q3Ka, q4Ka); + fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesKa, effPtEtaValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, q1Ka, q2Ka, q3Ka, q4Ka); if (std::abs(pid) == kKPlus) { - fillPtMCHist(ptKa, pid, kKPlus, kKMinus); + fillPtMCHist(ptKa, eta, rapKa, nFT0M, pid, kKPlus, kKMinus); } } } else if (cfgSelOR == false && cfgSelAND == true) { - if (selLowKa(track, innerParam) == cfgSelLow && selHighKa(track) == cfgSelHigh) { + if (selLowKa(track) == cfgSelLow && selHighKa(track) == cfgSelHigh) { ptKa = track.pt(); - fillIdParticleQAHistos(track, effBinsKa, effValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nKa, q1Ka, q2Ka, q3Ka, q4Ka); + fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesKa, effPtEtaValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, q1Ka, q2Ka, q3Ka, q4Ka); if (std::abs(pid) == kKPlus) { - fillPtMCHist(ptKa, pid, kKPlus, kKMinus); + fillPtMCHist(ptKa, eta, rapKa, nFT0M, pid, kKPlus, kKMinus); } } } if (cfgSelOR == true && cfgSelAND == false) { - if (selLowPr(track, innerParam) == cfgSelLow || selHighPr(track) == cfgSelHigh) { + if (selLowPr(track) == cfgSelLow || selHighPr(track) == cfgSelHigh) { ptPr = track.pt(); - fillIdParticleQAHistos(track, effBinsPr, effValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nPr, q1Pr, q2Pr, q3Pr, q4Pr); + fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesPr, effPtEtaValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, q1Pr, q2Pr, q3Pr, q4Pr); if (std::abs(pid) == kProton) { - fillPtMCHist(ptPr, pid, kProton, kProtonBar); + fillPtMCHist(ptPr, eta, rapPr, nFT0M, pid, kProton, kProtonBar); } } } else if (cfgSelOR == false && cfgSelAND == true) { - if (selLowPr(track, innerParam) == cfgSelLow && selHighPr(track) == cfgSelHigh) { + if (selLowPr(track) == cfgSelLow && selHighPr(track) == cfgSelHigh) { ptPr = track.pt(); - fillIdParticleQAHistos(track, effBinsPr, effValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nPr, q1Pr, q2Pr, q3Pr, q4Pr); + fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesPr, effPtEtaValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, q1Pr, q2Pr, q3Pr, q4Pr); if (std::abs(pid) == kProton) { - fillPtMCHist(ptPr, pid, kProton, kProtonBar); + fillPtMCHist(ptPr, eta, rapPr, nFT0M, pid, kProton, kProtonBar); } } } @@ -1084,41 +1213,49 @@ struct MeanPtFlucId { if (std::fabs(charge) < 1e-3) { continue; } - if (std::abs(mcPart.eta()) < 0.8) { + if (std::abs(pid) != kElectron && std::abs(pid) != kMuonMinus && std::abs(pid) != kPiPlus && std::abs(pid) != kKPlus && std::abs(pid) != kProton) { + continue; + } + + if (std::fabs(mcPart.eta()) < 0.8) { nSim++; } - if (-3.3 < mcPart.eta() && mcPart.eta() < -2.1) { - NFT0CSim++; + + if (mcPart.eta() > -3.3 || mcPart.eta() < -2.1) { + nFT0CSim++; } if (mcPart.pt() > cfgCutPtMin && mcPart.pt() < cfgCutPtMax) { - if (std::abs(mcPart.eta()) > 0.8) { - continue; + if (std::abs(mcPart.eta()) < 0.8) { + nChSim++; + ptChSim = mcPart.pt(); + moments(ptChSim, q1ChSim, q2ChSim, q3ChSim, q4ChSim); + hist.fill(HIST("Gen/Charged/h_PtTruth"), mcPart.pt()); + hist.fill(HIST("Gen/Charged/h2_PtTruth_NFT0M"), mcPart.pt(), nFT0M); } - nChSim++; - ptChSim = mcPart.pt(); - moments(ptChSim, q1ChSim, q2ChSim, q3ChSim, q4ChSim); - hist.fill(HIST("Gen/Charged/h_PtTruth"), mcPart.pt()); if (std::abs(mcPart.y()) > cfgCutRap) { continue; } if (std::abs(pid) == kPiPlus && mcPart.pt() >= cfgCutPiPtMin) { + etaSim = mcPart.eta(); + rapSim = mcPart.y(); + if (cfgSelOR == true && cfgSelAND == false) { if (mcPart.p() <= cfgCutPiThrsldP || mcPart.p() > cfgCutPiThrsldP) { nPiSim++; ptPiSim = mcPart.pt(); moments(ptPiSim, q1PiSim, q2PiSim, q3PiSim, q4PiSim); - fillPtMCHist(ptPiSim, pid, kPiPlus, kPiMinus); + fillPtMCHist(ptPiSim, etaSim, rapSim, nFT0M, pid, kPiPlus, kPiMinus); } } else if (cfgSelOR == false && cfgSelAND == true) { if ((cfgSelLow == true && mcPart.p() <= cfgCutPiThrsldP) && (cfgSelHigh == true && mcPart.p() > cfgCutPiThrsldP)) { nPiSim++; ptPiSim = mcPart.pt(); moments(ptPiSim, q1PiSim, q2PiSim, q3PiSim, q4PiSim); - fillPtMCHist(ptPiSim, pid, kPiPlus, kPiMinus); + fillPtMCHist(ptPiSim, etaSim, rapSim, nFT0M, pid, kPiPlus, kPiMinus); } } } @@ -1129,14 +1266,14 @@ struct MeanPtFlucId { nKaSim++; ptKaSim = mcPart.pt(); moments(ptKaSim, q1KaSim, q2KaSim, q3KaSim, q4KaSim); - fillPtMCHist(ptKaSim, pid, kKPlus, kKMinus); + fillPtMCHist(ptKaSim, etaSim, rapSim, nFT0M, pid, kKPlus, kKMinus); } } else if (cfgSelOR == false && cfgSelAND == true) { if ((cfgSelLow == true && mcPart.p() <= cfgCutKaThrsldP) && (cfgSelHigh == true && mcPart.p() > cfgCutKaThrsldP)) { nKaSim++; ptKaSim = mcPart.pt(); moments(ptKaSim, q1KaSim, q2KaSim, q3KaSim, q4KaSim); - fillPtMCHist(ptKaSim, pid, kKPlus, kKMinus); + fillPtMCHist(ptKaSim, etaSim, rapSim, nFT0M, pid, kKPlus, kKMinus); } } } @@ -1147,44 +1284,89 @@ struct MeanPtFlucId { nPrSim++; ptPrSim = mcPart.pt(); moments(ptPrSim, q1PrSim, q2PrSim, q3PrSim, q4PrSim); - fillPtMCHist(ptPrSim, pid, kProton, kProtonBar); + fillPtMCHist(ptPrSim, etaSim, rapSim, nFT0M, pid, kProton, kProtonBar); } } else if (cfgSelOR == false && cfgSelAND == true) { if ((cfgSelLow == true && mcPart.p() <= cfgCutPrThrsldP) && (cfgSelHigh == true && mcPart.p() > cfgCutPrThrsldP)) { nPrSim++; ptPrSim = mcPart.pt(); moments(ptPrSim, q1PrSim, q2PrSim, q3PrSim, q4PrSim); - fillPtMCHist(ptPrSim, pid, kProton, kProtonBar); + fillPtMCHist(ptPrSim, etaSim, rapSim, nFT0M, pid, kProton, kProtonBar); } } } } } + + for (const auto& track : tracks) { + if (!track.has_mcParticle()) { + LOGF(warning, "No MC Particle for this track, skip..."); + continue; + } + auto mcPart = track.mcParticle(); + int pid = mcPart.pdgCode(); + if (!mcPart.isPhysicalPrimary()) { + continue; + } + + if (selTrack(track)) { + if (std::abs(track.eta()) < 0.8) { + double pt = track.pt(); + if (cfgCorrection == true) { + int binIndex = findBin(pt, ptBins); + auto effValCh = static_cast>(effValuesCh); + if (binIndex != -1) { + float efficiency = effValCh[binIndex]; + if (efficiency > 0) { + float weight = 1.0 / efficiency; + hist.fill(HIST("QA/after/h2_pt_nch"), nCh, pt, weight); + } + } + } + } + } + + auto charge = 0.; + auto* pd = pdg->GetParticle(pid); + if (pd != nullptr) { + charge = pd->Charge(); + } + if (std::fabs(charge) < 1e-3) { + continue; + } + if (std::abs(pid) != kElectron && std::abs(pid) != kMuonMinus && std::abs(pid) != kPiPlus && std::abs(pid) != kKPlus && std::abs(pid) != kProton) { + continue; + } + if (mcPart.pt() > cfgCutPtMin && mcPart.pt() < cfgCutPtMax) { + if (std::abs(mcPart.eta()) < 0.8) { + double pt = mcPart.pt(); + hist.fill(HIST("Gen/h2_pt_nch"), nChSim, pt); + } + } + } hist.fill(HIST("QA/after/h_vtxZSim"), col.mcCollision().posZ()); } - nTPC = col.multNTracksHasTPC(); - nFT0M = col.multFT0M(); + if (nTPC > 0 && nCh > 0) + hist.fill(HIST("QA/after/h2_NTPC_NCh"), nTPC, nCh); if (cfgMCTruth) { - if (nSim != 0) + if (nSim > 0) hist.fill(HIST("QA/after/h_NSim"), nSim); - if (nSim != 0 && nChSim != 0) + if (nSim > 0 && nChSim > 0) hist.fill(HIST("QA/after/h2_NChSim_NSim"), nSim, nChSim); - if (nSim != 0 && nTPC != 0) + if (nSim > 0 && nTPC > 0) hist.fill(HIST("QA/after/h2_NTPC_NSim"), nSim, nTPC); - int nFT0C = col.multFT0C(); - if (nFT0C != 0 && NFT0CSim != 0) - hist.fill(HIST("QA/after/h2_NFT0C_NFT0CSim"), NFT0CSim, nFT0C); - - nTPC = nSim; - hist.fill(HIST("Gen/NTPC"), nTPC); - hist.fill(HIST("Gen/NFT0C"), NFT0CSim); - hist.fill(HIST("Gen/h2_NTPC_NFT0C"), NFT0CSim, nTPC); + hist.fill(HIST("Gen/NFT0C"), nFT0CSim); + hist.fill(HIST("Gen/h2_NTPC_NFT0C"), nFT0CSim, nTPC); + hist.fill(HIST("Gen/h2_NTPC_NFT0M"), nFT0M, nTPC); + + if (nFT0C != 0 && nFT0CSim != 0) + hist.fill(HIST("QA/after/h2_NFT0C_NFT0CSim"), nFT0CSim, nFT0C); fillAnalysisHistos(nTPC, nFT0M, nChSim, q1ChSim, q2ChSim, q3ChSim, q4ChSim); fillAnalysisHistos(nTPC, nFT0M, nPiSim, q1PiSim, q2PiSim, q3PiSim, q4PiSim); @@ -1192,17 +1374,13 @@ struct MeanPtFlucId { fillAnalysisHistos(nTPC, nFT0M, nPrSim, q1PrSim, q2PrSim, q3PrSim, q4PrSim); } - fillAfterQAHistos(col); - if (nTPC != 0 && nCh != 0) - hist.fill(HIST("QA/after/h2_NTPC_NCh"), nTPC, nCh); - fillAnalysisHistos(nTPC, nFT0M, nCh, q1Ch, q2Ch, q3Ch, q4Ch); fillAnalysisHistos(nTPC, nFT0M, nPi, q1Pi, q2Pi, q3Pi, q4Pi); fillAnalysisHistos(nTPC, nFT0M, nKa, q1Ka, q2Ka, q3Ka, q4Ka); fillAnalysisHistos(nTPC, nFT0M, nPr, q1Pr, q2Pr, q3Pr, q4Pr); } - void processRun3(MyCollisions::iterator const& col, MyAllTracks const& tracks) + void processRun3(MyRun3Collisions::iterator const& col, MyAllTracks const& tracks) { // Before Collision and Track Cuts: fillBeforeQAHistos(col, tracks); @@ -1212,9 +1390,9 @@ struct MeanPtFlucId { fillHistos(col, tracks); } } - PROCESS_SWITCH(MeanPtFlucId, processRun3, "Process for Run3", false); + PROCESS_SWITCH(MeanPtFlucId, processRun3, "Process for Run-3", false); - void processMCRecoSimRun3(MyMCCollisions::iterator const& col, aod::McCollisions const&, MyMCTracks const& tracks, aod::McParticles const&) + void processMCRecoSimRun3(MyRun3MCCollisions::iterator const& col, aod::McCollisions const&, MyMCTracks const& tracks, aod::McParticles const&) { // Before Collision and Track Cuts: fillBeforeQAHistos(col, tracks); From a9e276e8f5b0cc1f4c49001cf483d3ed4212bf6b Mon Sep 17 00:00:00 2001 From: Swati <69241911+SwatiSaha-1997@users.noreply.github.com> Date: Tue, 11 Feb 2025 02:57:12 +0530 Subject: [PATCH 0138/1650] [PWGCF] ITS pid option added and previous PR comments addressed (#9858) --- .../Tasks/netprotonCumulantsMc.cxx | 122 +++++++++++++++--- 1 file changed, 107 insertions(+), 15 deletions(-) diff --git a/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx b/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx index bd573ac8026..3b664f4f828 100644 --- a/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx @@ -32,6 +32,7 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/Centrality.h" #include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/PIDResponseITS.h" #include "Common/DataModel/Multiplicity.h" #include "Common/Core/trackUtilities.h" #include "CommonConstants/PhysicsConstants.h" @@ -133,8 +134,10 @@ struct NetprotonCumulantsMc { Configurable cfgCutItsChi2NCl{"cfgCutItsChi2NCl", 36.0f, "Maximum ITSchi2NCl"}; Configurable cfgCutDCAxy{"cfgCutDCAxy", 2.0f, "DCAxy range for tracks"}; Configurable cfgCutDCAz{"cfgCutDCAz", 2.0f, "DCAz range for tracks"}; - Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; - Configurable cfgTPCcluster{"cfgTPCcluster", 70, "Number of TPC cluster"}; + Configurable cfgITScluster{"cfgITScluster", 1, "Minimum Number of ITS cluster"}; + Configurable cfgTPCcluster{"cfgTPCcluster", 80, "Minimum Number of TPC cluster"}; + Configurable cfgTPCnCrossedRows{"cfgTPCnCrossedRows", 70, "Minimum Number of TPC crossed-rows"}; + Configurable cfgUseItsPid{"cfgUseItsPid", true, "Use ITS nSigma Cut"}; // Calculation of cumulants central/error Configurable cfgNSubsample{"cfgNSubsample", 10, "Number of subsamples for ERR"}; @@ -149,6 +152,8 @@ struct NetprotonCumulantsMc { Configurable cfgLoadEff{"cfgLoadEff", true, "Load efficiency from file"}; Configurable cfgEvSelkNoSameBunchPileup{"cfgEvSelkNoSameBunchPileup", true, "Pileup removal"}; + ConfigurableAxis cfgCentralityBins{"cfgCentralityBins", {90, 0., 90.}, "Centrality/Multiplicity percentile bining"}; + // Connect to ccdb Service ccdb; Configurable ccdbNoLaterThan{"ccdbNoLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; @@ -207,11 +212,13 @@ struct NetprotonCumulantsMc { AxisSpec ptAxis = {ptBinning, "#it{p}_{T} (GeV/#it{c})"}; std::vector etaBinning = {-0.8, -0.7, -0.6, -0.5, -0.4, -0.3, -0.2, -0.1, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8}; AxisSpec etaAxis = {etaBinning, "#it{#eta}"}; - std::vector centBining = {0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90}; - AxisSpec centAxis = {centBining, "Multiplicity percentile from FT0M (%)"}; + // std::vector centBining = {0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90}; + // AxisSpec centAxis = {centBining, "Multiplicity percentile from FT0M (%)"}; + const AxisSpec centAxis{cfgCentralityBins, "Multiplicity percentile from FT0M (%)"}; AxisSpec netprotonAxis = {41, -20.5, 20.5, "net-proton number"}; AxisSpec protonAxis = {21, -0.5, 20.5, "proton number"}; AxisSpec antiprotonAxis = {21, -0.5, 20.5, "antiproton number"}; + AxisSpec nSigmaAxis = {200, -5.0, 5.0, "nSigma(Proton)"}; auto noSubsample = static_cast(cfgNSubsample); float maxSubsample = 1.0 * noSubsample; @@ -252,6 +259,11 @@ struct NetprotonCumulantsMc { histos.add("hgen2DEtaVsPtProton", "2D hist of Generated Proton y: eta vs. x: pT", kTH2F, {ptAxis, etaAxis}); histos.add("hgen2DEtaVsPtAntiproton", "2D hist of Generated Anti-proton y: eta vs. x: pT", kTH2F, {ptAxis, etaAxis}); + // 2D histograms of nSigma + histos.add("h2DnsigmaTpcVsPt", "2D hist of nSigmaTPC vs. pT", kTH2F, {ptAxis, nSigmaAxis}); + histos.add("h2DnsigmaTofVsPt", "2D hist of nSigmaTOF vs. pT", kTH2F, {ptAxis, nSigmaAxis}); + histos.add("h2DnsigmaItsVsPt", "2D hist of nSigmaITS vs. pT", kTH2F, {ptAxis, nSigmaAxis}); + if (cfgIsCalculateCentral) { // uncorrected histos.add("Prof_mu1_netproton", "", {HistType::kTProfile, {centAxis}}); @@ -823,6 +835,48 @@ struct NetprotonCumulantsMc { template bool selectionPIDold(const T& candidate) { + if (!candidate.hasTPC()) + return false; + + //! PID checking as done in Run2 my analysis + //! ---------------------------------------------------------------------- + int flag = 0; //! pid check main flag + + if (candidate.pt() > 0.2f && candidate.pt() <= cfgCutPtUpperTPC) { + if (std::abs(candidate.tpcNSigmaPr()) < cfgnSigmaCutTPC) { + flag = 1; + } + } + if (candidate.hasTOF() && candidate.pt() > cfgCutPtUpperTPC && candidate.pt() < 5.0f) { + const float combNSigmaPr = std::sqrt(std::pow(candidate.tpcNSigmaPr(), 2.0) + std::pow(candidate.tofNSigmaPr(), 2.0)); + const float combNSigmaPi = std::sqrt(std::pow(candidate.tpcNSigmaPi(), 2.0) + std::pow(candidate.tofNSigmaPi(), 2.0)); + const float combNSigmaKa = std::sqrt(std::pow(candidate.tpcNSigmaKa(), 2.0) + std::pow(candidate.tofNSigmaKa(), 2.0)); + + int flag2 = 0; + if (combNSigmaPr < 3.0) + flag2 += 1; + if (combNSigmaPi < 3.0) + flag2 += 1; + if (combNSigmaKa < 3.0) + flag2 += 1; + if (!(flag2 > 1) && !(combNSigmaPr > combNSigmaPi) && !(combNSigmaPr > combNSigmaKa)) { + if (combNSigmaPr < cfgnSigmaCutCombTPCTOF) { + flag = 1; + } + } + } + if (flag == 1) + return true; + else + return false; + } + + template + bool selectionPIDoldTOFveto(const T& candidate) + { + if (!candidate.hasTPC()) + return false; + //! PID checking as done in Run2 my analysis //! ---------------------------------------------------------------------- int flag = 0; //! pid check main flag @@ -860,7 +914,7 @@ struct NetprotonCumulantsMc { } template - bool selectionPIDnew(const T& candidate) + bool selectionPIDnew(const T& candidate) // Victor's BF analysis { // electron rejection if (candidate.tpcNSigmaEl() > -3.0f && candidate.tpcNSigmaEl() < 5.0f && std::abs(candidate.tpcNSigmaPi()) > 3.0f && std::abs(candidate.tpcNSigmaKa()) > 3.0f && std::abs(candidate.tpcNSigmaPr()) > 3.0f) { @@ -906,12 +960,12 @@ struct NetprotonCumulantsMc { // Find the pt bin index based on the track's pt value int binIndex = -1; // Get the array from the Configurable - auto ptBins = (std::vector)cfgPtBins; - auto effProt = (std::vector)cfgProtonEff; - auto effAntiprot = (std::vector)cfgAntiprotonEff; + // auto ptBins = (std::vector)cfgPtBins; + // auto effProt = (std::vector)cfgProtonEff; + // auto effAntiprot = (std::vector)cfgAntiprotonEff; for (int i = 0; i < 16; ++i) { - if (candidate.pt() >= ptBins[i] && candidate.pt() < ptBins[i + 1]) { + if (candidate.pt() >= cfgPtBins.value[i] && candidate.pt() < cfgPtBins.value[i + 1]) { binIndex = i; break; } @@ -921,9 +975,9 @@ struct NetprotonCumulantsMc { return 0.0; // Default efficiency (0% if outside bins) } if (candidate.sign() > 0) - return effProt[binIndex]; + return cfgProtonEff.value[binIndex]; if (candidate.sign() < 0) - return effAntiprot[binIndex]; + return cfgAntiprotonEff.value[binIndex]; return 0.0; } } @@ -1030,8 +1084,8 @@ struct NetprotonCumulantsMc { if (cfgIsCalculateError) { - float l_Random = fRndm->Rndm(); - int sampleIndex = static_cast(cfgNSubsample * l_Random); + float lRandom = fRndm->Rndm(); + int sampleIndex = static_cast(cfgNSubsample * lRandom); histos.get(HIST("GenProf2D_mu1_netproton"))->Fill(cent, sampleIndex, std::pow(netProt, 1.0)); histos.get(HIST("GenProf2D_mu2_netproton"))->Fill(cent, sampleIndex, std::pow(netProt, 2.0)); @@ -1052,6 +1106,8 @@ struct NetprotonCumulantsMc { void processMCRec(MyMCRecCollision const& collision, MyMCTracks const& tracks, aod::McCollisions const&, aod::McParticles const&) { + // auto tracksWithITSPid = soa::Attach(tracks); + if (!collision.sel8()) { return; } @@ -1071,6 +1127,8 @@ struct NetprotonCumulantsMc { std::array fTCP0 = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; std::array fTCP1 = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + o2::aod::ITSResponse itsResponse; + // Start of the Monte-Carlo reconstructed tracks for (const auto& track : tracks) { if (!track.has_mcParticle()) //! check if track has corresponding MC particle @@ -1086,6 +1144,10 @@ struct NetprotonCumulantsMc { if ((particle.pt() < cfgCutPtLower) || (particle.pt() > 5.0f) || (std::abs(particle.eta()) > 0.8f)) { continue; } + if (!(track.itsNCls() > cfgITScluster) || !(track.tpcNClsFound() >= cfgTPCcluster) || !(track.tpcNClsCrossedRows() >= cfgTPCnCrossedRows)) { + continue; + } + if (particle.isPhysicalPrimary()) { histos.fill(HIST("hrecPartPtAll"), particle.pt()); histos.fill(HIST("hrecPtAll"), track.pt()); @@ -1096,12 +1158,24 @@ struct NetprotonCumulantsMc { bool trackSelected = false; if (cfgPIDchoice == 0) - trackSelected = selectionPIDold(track); + trackSelected = selectionPIDoldTOFveto(track); if (cfgPIDchoice == 1) trackSelected = selectionPIDnew(track); + if (cfgPIDchoice == 2) + trackSelected = selectionPIDold(track); + + if (cfgUseItsPid) { + if (std::abs(itsResponse.nSigmaITS(track)) > 3.0) + continue; + } if (trackSelected) { recEbyeCompleteCollisions(recCollisions.lastIndex(), particle.pt(), particle.eta(), track.sign()); + // filling nSigma distribution + histos.fill(HIST("h2DnsigmaTpcVsPt"), track.pt(), track.tpcNSigmaPr()); + histos.fill(HIST("h2DnsigmaTofVsPt"), track.pt(), track.tofNSigmaPr()); + histos.fill(HIST("h2DnsigmaItsVsPt"), track.pt(), itsResponse.nSigmaITS(track)); + if (track.sign() > 0) { histos.fill(HIST("hrecPartPtProton"), particle.pt()); //! hist for p rec histos.fill(HIST("hrecPtProton"), track.pt()); //! hist for p rec @@ -1959,6 +2033,8 @@ struct NetprotonCumulantsMc { void processDataRec(AodCollisions::iterator const& coll, aod::BCsWithTimestamps const&, AodTracks const& inputTracks) { + // auto inputTracksWithPid = soa::Attach(inputTracks); + if (!coll.sel8()) { return; } @@ -1982,6 +2058,8 @@ struct NetprotonCumulantsMc { std::array fTCP0 = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; std::array fTCP1 = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + o2::aod::ITSResponse itsResponse; + // Start of the Monte-Carlo reconstructed tracks for (const auto& track : inputTracks) { if (!track.isPVContributor()) //! track check as used in data @@ -1991,6 +2069,9 @@ struct NetprotonCumulantsMc { if ((track.pt() < cfgCutPtLower) || (track.pt() > 5.0f) || (std::abs(track.eta()) > 0.8f)) { continue; } + if (!(track.itsNCls() > cfgITScluster) || !(track.tpcNClsFound() >= cfgTPCcluster) || !(track.tpcNClsCrossedRows() >= cfgTPCnCrossedRows)) { + continue; + } histos.fill(HIST("hrecPtAll"), track.pt()); histos.fill(HIST("hrecEtaAll"), track.eta()); @@ -2000,12 +2081,23 @@ struct NetprotonCumulantsMc { bool trackSelected = false; if (cfgPIDchoice == 0) - trackSelected = selectionPIDold(track); + trackSelected = selectionPIDoldTOFveto(track); if (cfgPIDchoice == 1) trackSelected = selectionPIDnew(track); + if (cfgPIDchoice == 2) + trackSelected = selectionPIDold(track); + + if (cfgUseItsPid) { + if (std::abs(itsResponse.nSigmaITS(track)) > 3.0) + continue; + } if (trackSelected) { recEbyeCompleteCollisions(recCollisions.lastIndex(), track.pt(), track.eta(), track.sign()); + // filling nSigma distribution + histos.fill(HIST("h2DnsigmaTpcVsPt"), track.pt(), track.tpcNSigmaPr()); + histos.fill(HIST("h2DnsigmaTofVsPt"), track.pt(), track.tofNSigmaPr()); + histos.fill(HIST("h2DnsigmaItsVsPt"), track.pt(), itsResponse.nSigmaITS(track)); // for protons if (track.sign() > 0) { From 5dd1b9bc783267b117703cfa414d674087b3faf8 Mon Sep 17 00:00:00 2001 From: omvazque Date: Mon, 10 Feb 2025 15:42:20 -0600 Subject: [PATCH 0139/1650] [PWGLF] Common PMT, Sum of Towers, and ZDC amp (#9857) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 256 ++++++++++--------- 1 file changed, 139 insertions(+), 117 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index 0234463ec6b..b0f1c9094c5 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -66,24 +66,26 @@ struct UccZdc { Configurable maxT0CcentCut{"maxT0CcentCut", 90.0, "Max T0C Cent. cut"}; // Track selection settings - Configurable minItsNclusters{"minItsNclusters", 5, - "minimum number of ITS clusters"}; - Configurable minTpcNclusters{"minTpcNclusters", 70, - "minimum number of TPC clusters"}; - Configurable minTpcNcrossedRows{"minTpcNcrossedRows", 70, "minimum number of TPC crossed pad rows"}; - Configurable maxChiSquareTpc{"maxChiSquareTpc", 4.0, "maximum TPC chi^2/Ncls"}; - Configurable maxChiSquareIts{"maxChiSquareIts", 36.0, - "maximum ITS chi^2/Ncls"}; + // Configurable minItsNclusters{"minItsNclusters", 5, + // "minimum number of ITS clusters"}; + // Configurable minTpcNclusters{"minTpcNclusters", 70, + // "minimum number of TPC clusters"}; + // Configurable minTpcNcrossedRows{ + // "minTpcNcrossedRows", 70, "minimum number of TPC crossed pad rows"}; + // Configurable maxChiSquareTpc{"maxChiSquareTpc", 4.0, + // "maximum TPC chi^2/Ncls"}; + // Configurable maxChiSquareIts{"maxChiSquareIts", 36.0, + // "maximum ITS chi^2/Ncls"}; Configurable minPt{"minPt", 0.1, "minimum pt of the tracks"}; Configurable maxPt{"maxPt", 50., "maximum pt of the tracks"}; Configurable minEta{"minEta", -0.8, "minimum eta"}; Configurable maxEta{"maxEta", +0.8, "maximum eta"}; - Configurable maxDcaxy{"maxDcaxy", 0.05, "Maximum DCAxy"}; - Configurable maxDcaz{"maxDcaz", 0.05, "Maximum DCAz"}; - Configurable setDCAselectionPtDep{"setDCAselectionPtDep", true, - "require pt dependent selection"}; - Configurable par0{"par0", 0.0105, "par 0"}; - Configurable par1{"par1", 0.035, "par 1"}; + // Configurable maxDcaxy{"maxDcaxy", 0.05, "Maximum DCAxy"}; + // Configurable maxDcaz{"maxDcaz", 0.05, "Maximum DCAz"}; + // Configurable setDCAselectionPtDep{"setDCAselectionPtDep", true, + // "require pt dependent selection"}; + // Configurable par0{"par0", 0.0105, "par 0"}; + // Configurable par1{"par1", 0.035, "par 1"}; // Configurables, binning Configurable nBinsAmpFV0{"nBinsAmpFV0", 1000, "Number of bins FV0 amplitude"}; @@ -94,6 +96,7 @@ struct UccZdc { Configurable nBinsNch{"nBinsNch", 2500, "# of bins for midrapidity Nch"}; Configurable maxNch{"maxNch", 2500, "Max Nch at midrapidity"}; Configurable nBinsZDC{"nBinsZDC", 1025, "nBinsZDC"}; + Configurable nBinsZEM{"nBinsZEM", 100, "nBinsZEM"}; Configurable maxZN{"maxZN", 4099.5, "Max ZN signal"}; Configurable maxZP{"maxZP", 3099.5, "Max ZP signal"}; Configurable maxZEM{"maxZEM", 3099.5, "Max ZEM signal"}; @@ -103,18 +106,22 @@ struct UccZdc { Configurable minMeanpT{"minMeanpT", 0.5, "minimum [pT]"}; Configurable maxMeanpT{"maxMeanpT", 1.1, "maximum [pT]"}; Configurable nBinsMeanpT{"nBinsMeanpT", 160, "# bins [pT]"}; - ConfigurableAxis binsPt{"binsPt", {VARIABLE_WIDTH, 0., 0.1, 0.25, 0.5, 1., 2., 4., 6., 8., 10., 20.}, "Binning of the pT axis"}; - ConfigurableAxis binsCent{"binsCent", {VARIABLE_WIDTH, 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.}, "T0C centrality binning"}; + ConfigurableAxis binsPt{"binsPt", {VARIABLE_WIDTH, 0., 0.1, 0.25, 0.5, 1., 2., 4., 6., 8., 10., 20.}, "pT binning"}; + ConfigurableAxis binsCent{"binsCent", {VARIABLE_WIDTH, 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.}, "T0C binning"}; // Configurable flags ZDC + Configurable isAmpZDC{"isAmpZDC", false, "Use amplitude ZDC?"}; + Configurable isCommPMT{"isCommPMT", false, "Use common PMT ZDC?"}; + Configurable isSumTowers{"isSumTowers", false, "Use sum of Tow ZDC?"}; Configurable isTDCcut{"isTDCcut", false, "Use TDC cut?"}; Configurable isZEMcut{"isZEMcut", true, "Use ZEM cut?"}; Configurable zemCut{"zemCut", 1000.0, "ZEM cut"}; Configurable tdcCut{"tdcCut", 1.0, "TDC cut"}; - Configurable tdcZNmincut{"tdcZNmincut", -4.0, "Min ZN TDC cut"}; - Configurable tdcZNmaxcut{"tdcZNmaxcut", -4.0, "Max ZN TDC cut"}; - Configurable tdcZPmincut{"tdcZPmincut", -4.0, "Min ZP TDC cut"}; - Configurable tdcZPmaxcut{"tdcZPmaxcut", -4.0, "Max ZP TDC cut"}; + + // Configurable tdcZNmincut{"tdcZNmincut", -4.0, "Min ZN TDC cut"}; + // Configurable tdcZNmaxcut{"tdcZNmaxcut", -4.0, "Max ZN TDC cut"}; + // Configurable tdcZPmincut{"tdcZPmincut", -4.0, "Min ZP TDC cut"}; + // Configurable tdcZPmaxcut{"tdcZPmaxcut", -4.0, "Max ZP TDC cut"}; // Filters Filter collFilter = (nabs(aod::collision::posZ) < posZcut); @@ -185,10 +192,6 @@ struct UccZdc { registryData.get(HIST("hEventCounter")) ->GetXaxis() ->SetBinLabel(8, "min < t0c < max"); - registryData.add("ZNAcomm", "; ZNA common energy; Entries", - {HistType::kTH1F, {{nBinsZDC, -0.5, maxZN}}}); - registryData.add("ZNCcomm", "; ZNC common energy; Entries", - {HistType::kTH1F, {{nBinsZDC, -0.5, maxZN}}}); registryData.add("ZNA", "ZNA; ZNA amplitude; Entries", {HistType::kTH1F, {{nBinsZDC, -0.5, maxZN}}}); registryData.add("ZPA", "ZPA; ZPA amplitude; Entries", @@ -198,12 +201,12 @@ struct UccZdc { registryData.add("ZPC", "ZPC; ZPC amplitude; Entries", {HistType::kTH1F, {{nBinsZDC, -0.5, maxZP}}}); registryData.add("ZEM1", "ZEM1; ZEM1 amplitude; Entries", - {HistType::kTH1F, {{nBinsZDC, -0.5, maxZEM}}}); + {HistType::kTH1F, {{nBinsZEM, -0.5, maxZEM}}}); registryData.add("ZEM2", "ZEM2; ZEM2 amplitude; Entries", - {HistType::kTH1F, {{nBinsZDC, -0.5, maxZEM}}}); + {HistType::kTH1F, {{nBinsZEM, -0.5, maxZEM}}}); registryData.add("ZNvsZEM", "ZNvsZEM; ZEM; ZNA+ZNC", {HistType::kTH2F, - {{{nBinsZDC, -0.5, maxZEM}, {nBinsZDC, -0.5, maxZN}}}}); + {{{nBinsZDC, -0.5, maxZEM}, {nBinsZEM, -0.5, maxZN}}}}); registryData.add("ZNAvsZNC", "ZNAvsZNC; ZNC; ZNA", {HistType::kTH2F, {{{nBinsZDC, -0.5, maxZN}, {nBinsZDC, -0.5, maxZN}}}}); @@ -231,11 +234,11 @@ struct UccZdc { registryData.add( "ZEM1vstdc", "ZEM1vstdc; time ZEM1; ZEM1", {HistType::kTH2F, - {{{nBinsTDC, minTdc, maxTdc}, {nBinsZDC, -0.5, maxZEM}}}}); + {{{nBinsTDC, minTdc, maxTdc}, {nBinsZEM, -0.5, maxZEM}}}}); registryData.add( "ZEM2vstdc", "ZEM2vstdc; time ZEM2; ZEM2", {HistType::kTH2F, - {{{nBinsTDC, minTdc, maxTdc}, {nBinsZDC, -0.5, maxZEM}}}}); + {{{nBinsTDC, minTdc, maxTdc}, {nBinsZEM, -0.5, maxZEM}}}}); registryData.add( "debunch", "ZN sum vs. ZN diff.; t_{ZDC}-t_{ZDA}; t_{ZDC}+t_{ZDA}", {HistType::kTH2F, @@ -329,28 +332,65 @@ struct UccZdc { } registryData.fill(HIST("hEventCounter"), 2.5); - auto aZNA = foundBC.zdc().amplitudeZNA(); - auto aZNC = foundBC.zdc().amplitudeZNC(); - auto aZPA = foundBC.zdc().amplitudeZPA(); - auto aZPC = foundBC.zdc().amplitudeZPC(); - auto aZEM1 = foundBC.zdc().amplitudeZEM1(); - auto aZEM2 = foundBC.zdc().amplitudeZEM2(); - auto tZEM1 = foundBC.zdc().timeZEM1(); - auto tZEM2 = foundBC.zdc().timeZEM2(); - auto tZNA = foundBC.zdc().timeZNA(); - auto tZNC = foundBC.zdc().timeZNC(); - auto tZPA = foundBC.zdc().timeZPA(); - auto tZPC = foundBC.zdc().timeZPC(); - double tZDCdif{tZNC + tZPC - tZNA - tZPA}; - double tZDCsum{tZNC + tZPC + tZNA + tZPA}; - float sumZNs{aZNA + aZNC}; - float sumT0s{0.}; - float aT0A{0.}; - float aT0C{0.}; - float aV0A{0.}; - double sumZEMs{0.}; + float aT0A{0.0}; + float aT0C{0.0}; + float aV0A{0.0}; + float sumT0s{0.0}; + float znA{0.0}; + float znC{0.0}; + float zpA{0.0}; + float zpC{0.0}; + float aZEM1{0.0}; + float aZEM2{0.0}; + float tZEM1{0.0}; + float tZEM2{0.0}; + float tZNA{0.0}; + float tZNC{0.0}; + float tZPA{0.0}; + float tZPC{0.0}; + float sumZNs{0.0}; + float sumZEMs{0.0}; + float tZDCdif{0.0}; + float tZDCsum{0.0}; + + aZEM1 = foundBC.zdc().amplitudeZEM1(); + aZEM2 = foundBC.zdc().amplitudeZEM2(); + tZEM1 = foundBC.zdc().timeZEM1(); + tZEM2 = foundBC.zdc().timeZEM2(); + tZNA = foundBC.zdc().timeZNA(); + tZNC = foundBC.zdc().timeZNC(); + tZPA = foundBC.zdc().timeZPA(); + tZPC = foundBC.zdc().timeZPC(); + tZDCdif = tZNC + tZPC - tZNA - tZPA; + tZDCsum = tZNC + tZPC + tZNA + tZPA; + + if (isAmpZDC) { + znA = foundBC.zdc().amplitudeZNA(); + znC = foundBC.zdc().amplitudeZNC(); + zpA = foundBC.zdc().amplitudeZPA(); + zpC = foundBC.zdc().amplitudeZPC(); + } else if (isCommPMT) { + znA = foundBC.zdc().energyCommonZNA(); + znC = foundBC.zdc().energyCommonZNC(); + zpA = foundBC.zdc().energyCommonZPA(); + zpC = foundBC.zdc().energyCommonZPC(); + } else if (isSumTowers) { + for (const auto& eZNA : foundBC.zdc().energySectorZNA()) + znA += eZNA; + for (const auto& eZNC : foundBC.zdc().energySectorZNC()) + znC += eZNC; + for (const auto& eZPA : foundBC.zdc().energySectorZPA()) + zpA += eZPA; + for (const auto& eZPC : foundBC.zdc().energySectorZPC()) + zpC += eZPC; + } else { + znA = -999.; + znC = -999.; + zpA = -999.; + zpC = -999.; + } + sumZNs = znA + znC; sumZEMs = aZEM1 + aZEM2; - float nchTPC = collision.multTPC(); if (foundBC.has_ft0()) { for (const auto& amplitude : foundBC.ft0().amplitudeA()) { @@ -399,32 +439,26 @@ struct UccZdc { registryData.fill(HIST("hEventCounter"), 7.5); registryData.fill(HIST("hT0C_cent"), collision.centFT0C()); - registryData.get(HIST("ZNA"))->Fill(aZNA); - registryData.get(HIST("ZNC"))->Fill(aZNC); - registryData.get(HIST("ZPA"))->Fill(aZPA); - registryData.get(HIST("ZPC"))->Fill(aZPC); - registryData.get(HIST("ZNAvsZNC"))->Fill(aZNC, aZNA); - registryData.get(HIST("ZNAvsZPA"))->Fill(aZPA, aZNA); - registryData.get(HIST("ZNCvsZPC"))->Fill(aZPC, aZNC); - registryData.get(HIST("ZPAvsZPC"))->Fill(aZPC, aZPA); - registryData.get(HIST("ZNAvsNch"))->Fill(nchTPC, aZNA); - registryData.get(HIST("ZNCvsNch"))->Fill(nchTPC, aZNC); - registryData.get(HIST("ZNvsZEM"))->Fill(sumZEMs, sumZNs); - registryData.get(HIST("ZNvsFV0A"))->Fill(aV0A / 100., sumZNs); - registryData.get(HIST("ZNvsFT0"))->Fill(sumT0s / 100., sumZNs); - registryData.get(HIST("ZNAcomm")) - ->Fill(foundBC.zdc().energyCommonZNA()); - registryData.get(HIST("ZNCcomm")) - ->Fill(foundBC.zdc().energyCommonZNC()); - registryData.get(HIST("ZEM1"))->Fill(aZEM1); - registryData.get(HIST("ZEM2"))->Fill(aZEM2); - registryData.get(HIST("ZNCvstdc"))->Fill(tZNC, aZNC); - registryData.get(HIST("ZNAvstdc"))->Fill(tZNA, aZNA); - registryData.get(HIST("ZPCvstdc"))->Fill(tZPC, aZPC); - registryData.get(HIST("ZPAvstdc"))->Fill(tZPA, aZPA); - registryData.get(HIST("ZEM1vstdc"))->Fill(tZEM1, aZEM1); - registryData.get(HIST("ZEM2vstdc"))->Fill(tZEM2, aZEM2); - registryData.get(HIST("debunch"))->Fill(tZDCdif, tZDCsum); + registryData.fill(HIST("ZNA"), znA); + registryData.fill(HIST("ZNC"), znC); + registryData.fill(HIST("ZPA"), zpA); + registryData.fill(HIST("ZPC"), zpC); + registryData.fill(HIST("ZNAvsZNC"), znC, znA); + registryData.fill(HIST("ZNAvsZPA"), zpA, znA); + registryData.fill(HIST("ZNCvsZPC"), zpC, znC); + registryData.fill(HIST("ZPAvsZPC"), zpC, zpA); + registryData.fill(HIST("ZNvsZEM"), sumZEMs, sumZNs); + registryData.fill(HIST("ZNvsFV0A"), aV0A / 100., sumZNs); + registryData.fill(HIST("ZNvsFT0"), sumT0s / 100., sumZNs); + registryData.fill(HIST("ZEM1"), aZEM1); + registryData.fill(HIST("ZEM2"), aZEM2); + registryData.fill(HIST("ZNCvstdc"), tZNC, znC); + registryData.fill(HIST("ZNAvstdc"), tZNA, znA); + registryData.fill(HIST("ZPCvstdc"), tZPC, zpC); + registryData.fill(HIST("ZPAvstdc"), tZPA, zpA); + registryData.fill(HIST("ZEM1vstdc"), tZEM1, aZEM1); + registryData.fill(HIST("ZEM2vstdc"), tZEM2, aZEM2); + registryData.fill(HIST("debunch"), tZDCdif, tZDCsum); float meanpT{0.0}; const int64_t nch{tracks.size()}; @@ -433,7 +467,6 @@ struct UccZdc { // if (!track.isGlobalTrack()) { // continue; // } - // if (track.pt() < minPt || track.pt() > maxPt) { // continue; // } @@ -450,8 +483,10 @@ struct UccZdc { if (nch > 0) { meanpT /= nch; } - registryData.get(HIST("ZNCvsNchvspT"))->Fill(nch, aZNC, meanpT); - registryData.get(HIST("ZNAvsNchvspT"))->Fill(nch, aZNA, meanpT); + registryData.fill(HIST("ZNAvsNch"), nch, znA); + registryData.fill(HIST("ZNCvsNch"), nch, znC); + registryData.fill(HIST("ZNCvsNchvspT"), nch, znC, meanpT); + registryData.fill(HIST("ZNAvsNchvspT"), nch, znA, meanpT); } PROCESS_SWITCH(UccZdc, processZdcCollAss, "Processing ZDC w. collision association", true); @@ -617,44 +652,31 @@ struct UccZdc { PROCESS_SWITCH(UccZdc, processMC, "process pure simulation", false); // Single-Track Selection - template - bool passedTrackSelection(const T2& track) - { - if (track.eta() < minEta || track.eta() > maxEta) - return false; - if (track.pt() < minPt) - return false; - - if (!track.hasITS()) - return false; - if (track.itsNCls() < minItsNclusters) - return false; - if (!track.hasTPC()) - return false; - if (track.tpcNClsFound() < minTpcNclusters) - return false; - if (track.tpcNClsCrossedRows() < minTpcNcrossedRows) - return false; - if (track.tpcChi2NCl() > maxChiSquareTpc) - return false; - if (track.itsChi2NCl() > maxChiSquareIts) - return false; - // pt-dependent selection - if (setDCAselectionPtDep) { - if (std::fabs(track.dcaXY()) > (par0 + par1 / track.pt())) - return false; - if (std::fabs(track.dcaZ()) > (par0 + par1 / track.pt())) - return false; - } - // standard selection - if (!setDCAselectionPtDep) { - if (std::fabs(track.dcaXY()) > maxDcaxy) - return false; - if (std::fabs(track.dcaZ()) > maxDcaz) - return false; - } - return true; - } + // template + // bool passedTrackSelection(const T2& track) { + // if (track.eta() < minEta || track.eta() > maxEta) return false; + // if (track.pt() < minPt) return false; + // + // if (!track.hasITS()) return false; + // if (track.itsNCls() < minItsNclusters) return false; + // if (!track.hasTPC()) return false; + // if (track.tpcNClsFound() < minTpcNclusters) return false; + // if (track.tpcNClsCrossedRows() < minTpcNcrossedRows) return false; + // if (track.tpcChi2NCl() > maxChiSquareTpc) return false; + // if (track.itsChi2NCl() > maxChiSquareIts) return false; + // // pt-dependent selection + // if (setDCAselectionPtDep) { + // if (std::fabs(track.dcaXY()) > (par0 + par1 / track.pt())) return + // false; if (std::fabs(track.dcaZ()) > (par0 + par1 / track.pt())) return + // false; + // } + // // standard selection + // if (!setDCAselectionPtDep) { + // if (std::fabs(track.dcaXY()) > maxDcaxy) return false; + // if (std::fabs(track.dcaZ()) > maxDcaz) return false; + // } + // return true; + // } }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 66cb39955924b269084ee7ebd2498df472f9482b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Tue, 11 Feb 2025 01:07:25 +0100 Subject: [PATCH 0140/1650] [PWGHF] Derived D+: Remove subscription to proton PID tables (#9860) --- PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx b/PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx index 0eb5b010a32..c8162a5fc6a 100644 --- a/PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx +++ b/PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx @@ -78,7 +78,7 @@ struct HfDerivedDataCreatorDplusToPiKPi { using CollisionsWCentMult = soa::Join; using CollisionsWMcCentMult = soa::Join; - using TracksWPid = soa::Join; + using TracksWPid = soa::Join; using SelectedCandidates = soa::Filtered>; using SelectedCandidatesMc = soa::Filtered>; using SelectedCandidatesMl = soa::Filtered>; From 733852311e8d0ad2ac2e2ee1a7077d63db113445 Mon Sep 17 00:00:00 2001 From: alcaliva <32872606+alcaliva@users.noreply.github.com> Date: Tue, 11 Feb 2025 07:40:22 +0100 Subject: [PATCH 0141/1650] fixed registry name for MC (#9862) --- PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx b/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx index 15301e106a1..0760b88b4ce 100644 --- a/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx +++ b/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx @@ -98,11 +98,11 @@ struct LfITSTPCMatchingSecondaryTracksQA { } if (doprocessMC) { - registryData.add("number_of_events_mc", "number of events in mc", HistType::kTH1D, {{20, 0, 20, "Event Cuts"}}); - registryData.add("trkPionTpcMc", "trkPionTpcMc", HistType::kTH1D, {{1000, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("trkPionTpcItsMc", "trkPionTpcItsMc", HistType::kTH1D, {{1000, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("secPionTpcMc", "secPionTpcMc", HistType::kTH1D, {{1000, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("secPionTpcItsMc", "secPionTpcItsMc", HistType::kTH1D, {{1000, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("number_of_events_mc", "number of events in mc", HistType::kTH1D, {{20, 0, 20, "Event Cuts"}}); + registryMC.add("trkPionTpcMc", "trkPionTpcMc", HistType::kTH1D, {{1000, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("trkPionTpcItsMc", "trkPionTpcItsMc", HistType::kTH1D, {{1000, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("secPionTpcMc", "secPionTpcMc", HistType::kTH1D, {{1000, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("secPionTpcItsMc", "secPionTpcItsMc", HistType::kTH1D, {{1000, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); } } From 72eade74dd831e9562dc5c3d9c16a99ffadb66c8 Mon Sep 17 00:00:00 2001 From: peressounko Date: Tue, 11 Feb 2025 10:56:34 +0300 Subject: [PATCH 0142/1650] [Common,PWGEM] Fix data nonlinearity; add pi0 single histos (#9846) Co-authored-by: peressounko --- Common/TableProducer/caloClusterProducer.cxx | 16 +- PWGEM/Tasks/phosPi0.cxx | 229 ++++++++++++++++--- 2 files changed, 207 insertions(+), 38 deletions(-) diff --git a/Common/TableProducer/caloClusterProducer.cxx b/Common/TableProducer/caloClusterProducer.cxx index cbebf80a53b..c9766ffeac5 100644 --- a/Common/TableProducer/caloClusterProducer.cxx +++ b/Common/TableProducer/caloClusterProducer.cxx @@ -1728,14 +1728,14 @@ struct CaloClusterProducer { case 0: return en; case 1: { // Data Run3 - const double a = 9.3494e-01; - const double b = 1.00526e-02; - const double c = 8.45164e-02; - const double d = -1.03364e-02; - const double f = 5.4803e-03; - const double g = 0.779983; - const double h = 0.622282; - const double k = 8.0182e-05; + const double a = 0.892787; + const double b = 0.004053; + const double c = 0.074652; + const double d = -0.016306; + const double f = 7.616314; + const double g = -104.409; + const double h = 1837.17; + const double k = 0.000091; double eMin = std::max(static_cast(0.1), en); // Parameterization valid down to 100 MeV return en * (a + b * eMin + c / eMin + d / (eMin * eMin) + f / ((eMin - g) * (eMin - g) + h * h) + k / std::pow(eMin, 4)); } diff --git a/PWGEM/Tasks/phosPi0.cxx b/PWGEM/Tasks/phosPi0.cxx index 529a1f29284..8ba38dd6281 100644 --- a/PWGEM/Tasks/phosPi0.cxx +++ b/PWGEM/Tasks/phosPi0.cxx @@ -63,6 +63,10 @@ struct PhosPi0 { Configurable nMixedEvents{"nMixedEvents", 10, "number of events to mix"}; Configurable fillQC{"fillQC", true, "Fill QC histos"}; Configurable minOccE{"minOccE", 0.5, "Min. cluster energy of occupancy plots"}; + Configurable nonlinA{"nonlinA", 1., "nonlinsrity param A (scale)"}; + Configurable nonlinB{"nonlinB", 0., "nonlinsrity param B (a+b*exp(-e/c))"}; + Configurable nonlinC{"nonlinC", 1., "nonlinsrity param C (a+b*exp(-e/c))"}; + Configurable tofEffParam{"tofEffParam", 0, "parameterization of TOF cut efficiency"}; using SelCollisions = soa::Join; using SelCollisionsMC = soa::Join; @@ -81,20 +85,22 @@ struct PhosPi0 { { public: Photon() = default; - Photon(double x, double y, double z, double ee, int m, bool isDispOK, bool isCPVOK, int mcLabel) : px(x), py(y), pz(z), e(ee), mod(m), mPID(isDispOK << 1 | isCPVOK << 2), label(mcLabel) {} + Photon(double x, double y, double z, double ee, double t, int m, bool isDispOK, bool isCPVOK, int mcLabel) : px(x), py(y), pz(z), e(ee), time(t), mod(m), mPID(isDispOK << 1 | isCPVOK << 2), label(mcLabel) {} ~Photon() = default; bool isCPVOK() const { return (mPID >> 2) & 1; } bool isDispOK() const { return (mPID >> 1) & 1; } + double pt() const { return std::sqrt(px * px + py * py); } public: - double px = 0.; // px - double py = 0.; // py - double pz = 0.; // pz - double e = 0.; // energy - int mod = 0; // module - int mPID = 0; // store PID bits - int label = -1; // label of MC particle + double px = 0.; // px + double py = 0.; // py + double pz = 0.; // pz + double e = 0.; // energy + double time = 0.; // time + int mod = 0; // module + int mPID = 0; // store PID bits + int label = -1; // label of MC particle }; int mRunNumber = 0; // Current run number @@ -110,11 +116,13 @@ struct PhosPi0 { TH3 *hReMod, *hMiMod; TH2 *hReAll, *hReDisp, *hReCPV, *hReBoth, *hSignalAll, *hPi0SignalAll, *hPi0SignalCPV, *hPi0SignalDisp, *hPi0SignalBoth, *hMiAll, *hMiDisp, *hMiCPV, *hMiBoth; + TH2 *hReOneAll, *hReOneDisp, *hReOneCPV, *hReOneBoth, *hMiOneAll, *hMiOneDisp, *hMiOneCPV, *hMiOneBoth; + TH2 *hReTime12, *hReTime30, *hReTime50, *hReTime100; - std::vector pt = {0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.8, 0.85, 0.9, 0.95, 1.0, 1.1, 1.2, - 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.5, 5.0, - 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 10., 11., 12., 13., 14., 15., 16., 18., 20., 22., 24., 26., 28., - 30., 34., 38., 42., 46., 50., 55., 60., 70., 80., 90., 100., 110., 120., 150.}; + std::vector pt = {0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.1, + 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.5, 4.6, 4.8, 5.0, + 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10., 11., 12., 13., 14., 15., 16., 17., 18., 19., 20., 22., 24., 26., 28., + 30., 34., 38., 42., 46., 50., 55., 60., 70., 75., 80., 85., 90., 95., 100., 110., 120., 130., 140., 150., 160., 180., 200.}; /// \brief Create output histograms void init(InitContext const&) @@ -194,6 +202,31 @@ struct PhosPi0 { hReBoth = std::get>(mHistManager.add("mggReBoth", "inv mass for centrality", HistType::kTH2F, {mggAxis, ptAxis})) .get(); + hReOneAll = std::get>(mHistManager.add("mggReOneAll", "inv mass for centrality", + HistType::kTH2F, {mggAxis, ptAxis})) + .get(); + hReOneCPV = std::get>(mHistManager.add("mggReOneCPV", "inv mass for centrality", + HistType::kTH2F, {mggAxis, ptAxis})) + .get(); + hReOneDisp = std::get>(mHistManager.add("mggReOneDisp", "inv mass for centrality", + HistType::kTH2F, {mggAxis, ptAxis})) + .get(); + hReOneBoth = std::get>(mHistManager.add("mggReOneBoth", "inv mass for centrality", + HistType::kTH2F, {mggAxis, ptAxis})) + .get(); + + hReTime12 = std::get>(mHistManager.add("mggReTime12", "inv mass for centrality", + HistType::kTH2F, {mggAxis, ptAxis})) + .get(); + hReTime30 = std::get>(mHistManager.add("mggReTime30", "inv mass for centrality", + HistType::kTH2F, {mggAxis, ptAxis})) + .get(); + hReTime50 = std::get>(mHistManager.add("mggReTime50", "inv mass for centrality", + HistType::kTH2F, {mggAxis, ptAxis})) + .get(); + hReTime100 = std::get>(mHistManager.add("mggReTime100", "inv mass for centrality", + HistType::kTH2F, {mggAxis, ptAxis})) + .get(); if (isMC) { hSignalAll = std::get>(mHistManager.add("mggSignal", "inv mass for correlated pairs", @@ -228,6 +261,18 @@ struct PhosPi0 { hMiBoth = std::get>(mHistManager.add("mggMiBoth", "inv mass for centrality", HistType::kTH2F, {mggAxis, ptAxis})) .get(); + hMiOneAll = std::get>(mHistManager.add("mggMiAll", "inv mass for centrality", + HistType::kTH2F, {mggAxis, ptAxis})) + .get(); + hMiOneCPV = std::get>(mHistManager.add("mggMiCPV", "inv mass for centrality", + HistType::kTH2F, {mggAxis, ptAxis})) + .get(); + hMiOneDisp = std::get>(mHistManager.add("mggMiDisp", "inv mass for centrality", + HistType::kTH2F, {mggAxis, ptAxis})) + .get(); + hMiOneBoth = std::get>(mHistManager.add("mggMiBoth", "inv mass for centrality", + HistType::kTH2F, {mggAxis, ptAxis})) + .get(); if (isMC) { mHistManager.add("hMCPi0SpAll", "pi0 spectrum inclusive", HistType::kTH1F, {ptAxis}); mHistManager.add("hMCPi0SpPrim", "pi0 spectrum Primary", HistType::kTH1F, {ptAxis}); @@ -395,7 +440,7 @@ struct PhosPi0 { if (mcPart->begin().mcCollisionId() != mPrevMCColId) { mPrevMCColId = mcPart->begin().mcCollisionId(); // to avoid scanning full MC table each BC for (const auto& part : *mcPart) { - if (part.mcCollision().bcId() != cluMcBCId) { + if (part.mcCollision().bcId() != col.bcId()) { continue; } if (part.pdgCode() == 111) { @@ -462,7 +507,11 @@ struct PhosPi0 { mcLabel = mcList[0]; } } - Photon ph1(clu.px(), clu.py(), clu.pz(), clu.e(), clu.mod(), testLambda(clu.e(), clu.m02(), clu.m20()), clu.trackdist() > cpvCut, mcLabel); + double enCorr = 1; + if constexpr (isMC) { // correct MC energy + enCorr = nonlinearity(clu.e()); + } + Photon ph1(clu.px() * enCorr, clu.py() * enCorr, clu.pz() * enCorr, clu.e() * enCorr, clu.time(), clu.mod(), testLambda(clu.e(), clu.m02(), clu.m20()), clu.trackdist() > cpvCut, mcLabel); // Mix with other photons added to stack for (const auto& ph2 : mCurEvent) { double m = std::pow(ph1.e + ph2.e, 2) - std::pow(ph1.px + ph2.px, 2) - @@ -473,35 +522,89 @@ struct PhosPi0 { double pt = std::sqrt(std::pow(ph1.px + ph2.px, 2) + std::pow(ph1.py + ph2.py, 2)); int modComb = moduleCombination(ph1.mod, ph2.mod); - hReMod->Fill(m, pt, modComb); - hReAll->Fill(m, pt); + double w = 1.; + if constexpr (isMC) { // correct MC energy + w = tofCutEff(ph1.e) * tofCutEff(ph2.e); + } + hReMod->Fill(m, pt, modComb, w); + hReAll->Fill(m, pt, w); + hReOneAll->Fill(m, ph1.pt(), w); + hReOneAll->Fill(m, ph2.pt(), w); + if (ph1.isCPVOK()) { + hReOneCPV->Fill(m, ph1.pt(), w); + } + if (ph2.isCPVOK()) { + hReOneCPV->Fill(m, ph2.pt(), w); + } + if (ph1.isDispOK()) { + hReOneDisp->Fill(m, ph1.pt(), w); + if (ph1.isCPVOK()) { + hReOneBoth->Fill(m, ph1.pt(), w); + } + } + if (ph2.isDispOK()) { + hReOneDisp->Fill(m, ph2.pt(), w); + if (ph2.isCPVOK()) { + hReOneBoth->Fill(m, ph2.pt(), w); + } + } + // Test time eff + if (std::abs(ph1.time) < 12.5e-9) { // strict cut on first photon + if (std::abs(ph2.time) < 100.e-9) { + hReTime100->Fill(m, ph2.pt()); + if (std::abs(ph2.time) < 50.e-9) { + hReTime50->Fill(m, ph2.pt()); + if (std::abs(ph2.time) < 30.e-9) { + hReTime30->Fill(m, ph2.pt()); + if (std::abs(ph2.time) < 12.5e-9) { + hReTime12->Fill(m, ph2.pt()); + } + } + } + } + } + if (std::abs(ph2.time) < 12.5e-9) { // strict cut on first photon + if (std::abs(ph1.time) < 100.e-9) { + hReTime100->Fill(m, ph1.pt()); + if (std::abs(ph1.time) < 50.e-9) { + hReTime50->Fill(m, ph1.pt()); + if (std::abs(ph1.time) < 30.e-9) { + hReTime30->Fill(m, ph1.pt()); + if (std::abs(ph1.time) < 12.5e-9) { + hReTime12->Fill(m, ph1.pt()); + } + } + } + } + } + bool isPi0 = false; if constexpr (isMC) { // test parent int cp = commonParentPDG(ph1.label, ph2.label, mcPart); if (cp != 0) { - hSignalAll->Fill(m, pt); + hSignalAll->Fill(m, pt, w); if (cp == 111) { isPi0 = true; - hPi0SignalAll->Fill(m, pt); + hPi0SignalAll->Fill(m, pt, w); } } } if (ph1.isCPVOK() && ph2.isCPVOK()) { - hReCPV->Fill(m, pt); + hReCPV->Fill(m, pt, w); if (isPi0) { - hPi0SignalCPV->Fill(m, pt); + hPi0SignalCPV->Fill(m, pt, w); } } if (ph1.isDispOK() && ph2.isDispOK()) { - hReDisp->Fill(m, pt); + hReDisp->Fill(m, pt, w); if (isPi0) { - hPi0SignalDisp->Fill(m, pt); + hPi0SignalDisp->Fill(m, pt, w); } if (ph1.isCPVOK() && ph2.isCPVOK()) { - hReBoth->Fill(m, pt); + hReBoth->Fill(m, pt, w); if (isPi0) { - hPi0SignalBoth->Fill(m, pt); + hPi0SignalBoth->Fill(m, pt, w); } } } @@ -523,15 +626,39 @@ struct PhosPi0 { double pt = std::sqrt(std::pow(ph1.px + ph2.px, 2) + std::pow(ph1.py + ph2.py, 2)); int modComb = moduleCombination(ph1.mod, ph2.mod); - hMiMod->Fill(m, pt, modComb); - hMiAll->Fill(m, pt); + double w = 1.; + if constexpr (isMC) { // correct MC energy + w = tofCutEff(ph1.e) * tofCutEff(ph2.e); + } + hMiMod->Fill(m, pt, modComb, w); + hMiAll->Fill(m, pt, w); + hMiOneAll->Fill(m, ph1.pt(), w); + hMiOneAll->Fill(m, ph2.pt(), w); + if (ph1.isCPVOK()) { + hMiOneCPV->Fill(m, ph1.pt(), w); + } + if (ph2.isCPVOK()) { + hMiOneCPV->Fill(m, ph2.pt(), w); + } + if (ph1.isDispOK()) { + hMiOneDisp->Fill(m, ph1.pt(), w); + if (ph1.isCPVOK()) { + hMiOneBoth->Fill(m, ph1.pt(), w); + } + } + if (ph2.isDispOK()) { + hMiOneDisp->Fill(m, ph2.pt(), w); + if (ph2.isCPVOK()) { + hMiOneBoth->Fill(m, ph2.pt(), w); + } + } if (ph1.isCPVOK() && ph2.isCPVOK()) { - hMiCPV->Fill(m, pt); + hMiCPV->Fill(m, pt, w); } if (ph1.isDispOK() && ph2.isDispOK()) { - hMiDisp->Fill(m, pt); + hMiDisp->Fill(m, pt, w); if (ph1.isCPVOK() && ph2.isCPVOK()) { - hMiBoth->Fill(m, pt); + hMiBoth->Fill(m, pt, w); } } } @@ -597,7 +724,12 @@ struct PhosPi0 { } int mcLabel = -1; - Photon ph1(clu.px(), clu.py(), clu.pz(), clu.e(), clu.mod(), testLambda(clu.e(), clu.m02(), clu.m20()), clu.trackdist() > cpvCut, mcLabel); + double enCorr = 1; + if (isMC) { // correct MC energy + enCorr = nonlinearity(clu.e()); + } + Photon ph1(clu.px() * enCorr, clu.py() * enCorr, clu.pz() * enCorr, clu.e() * enCorr, clu.time(), clu.mod(), testLambda(clu.e(), clu.m02(), clu.m20()), clu.trackdist() > cpvCut, mcLabel); + // Mix with other photons added to stack for (const auto& ph2 : mCurEvent) { double m = std::pow(ph1.e + ph2.e, 2) - std::pow(ph1.px + ph2.px, 2) - @@ -737,6 +869,43 @@ struct PhosPi0 { } return 0; // nothing found } + double nonlinearity(double e) + { + return nonlinA + nonlinB * std::exp(-e / nonlinC); + } + double tofCutEff(double en) + { + if (tofEffParam == 0) { + return 1.; + } + if (tofEffParam == 1) { // Run2 100 ns + // parameterization 01.08.2020 + if (en > 1.1) + en = 1.1; + if (en < 0.11) + en = 0.11; + return std::exp((-1.15295e+05 + 2.26754e+05 * en - 1.26063e+05 * en * en + en * en * en) / + (1. - 3.16443e+05 * en + 3.68044e+06 * en * en + en * en * en)); + } + if (tofEffParam == 2) { // Run2 30 ns + if (en > 1.6) + en = 1.6; + return 1. / (1. + std::exp((4.83230e+01 - 8.89758e+01 * en + 1.10897e+03 * en * en - 5.73755e+03 * en * en * en - + 1.43777e+03 * en * en * en * en) / + (1. - 1.23667e+02 * en + 1.07255e+03 * en * en + 5.87221e+02 * en * en * en))); + } + if (tofEffParam == 2) { // Run2 12.5 ns + if (en < 4.6) { + return std::exp(3.64952e-03 * + (-5.80032e+01 - 1.53442e+02 * en + 1.30994e+02 * en * en + -3.53094e+01 * en * en * en + en * en * en * en) / + (-7.75638e-02 + 8.64761e-01 * en + 1.22320e+00 * en * en - 1.00177e+00 * en * en * en + en * en * en * en)); + } else { + return 0.63922783 * (1. - 1.63273e-01 * std::tanh((en - 7.94528e+00) / 1.28997e+00)) * + (-4.39257e+00 * en + 2.25503e+00 * en * en + en * en * en) / (2.37160e+00 * en - 6.93786e-01 * en * en + en * en * en); + } + } + return 1.; + } }; o2::framework::WorkflowSpec defineDataProcessing(o2::framework::ConfigContext const& cfgc) From 2117c15a913f8c4dae1d957032cb701fed460d96 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Tue, 11 Feb 2025 18:41:57 +0900 Subject: [PATCH 0143/1650] [PWGEM/Dilepton] update MC study (#9865) --- PWGEM/Dilepton/Tasks/studyMCTruth.cxx | 29 +++++++++++++++------------ 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/PWGEM/Dilepton/Tasks/studyMCTruth.cxx b/PWGEM/Dilepton/Tasks/studyMCTruth.cxx index 6f173a597c8..66265b6a679 100644 --- a/PWGEM/Dilepton/Tasks/studyMCTruth.cxx +++ b/PWGEM/Dilepton/Tasks/studyMCTruth.cxx @@ -80,8 +80,8 @@ struct studyMCTruth { fRegistry.add("Event/hPtY_kaon", "K^{#pm} yield;y;p_{T} (GeV/c)", kTH2D, {{20, -1, +1}, {100, 0, 10}}, false); fRegistry.add("Event/hPtY_proton", "p(#bar{p}) yield;y;p_{T} (GeV/c)", kTH2D, {{20, -1, +1}, {100, 0, 10}}, false); - fRegistry.add("Track/default/hPt", "p_{T,e}", kTH1D, {{1000, 0, 10}}, true); - fRegistry.add("Track/default/hEtaPhi", "#eta_{e} vs. #varphi_{e};#varphi_{e} (rad.);#eta_{e};", kTH2D, {{90, 0, 2 * M_PI}, {60, -5, +1}}, true); + fRegistry.add("Track/default/hPt", "p_{T,l};p_{T,l} (GeV/c)", kTH1D, {{1000, 0, 10}}, true); + fRegistry.add("Track/default/hEtaPhi", "#eta_{l} vs. #varphi_{l};#varphi_{l} (rad.);#eta_{l};", kTH2D, {{90, 0, 2 * M_PI}, {60, -5, +1}}, true); fRegistry.addClone("Track/default/", "Track/mllPF0/"); fRegistry.addClone("Track/default/", "Track/mllPF1/"); fRegistry.addClone("Track/default/", "Track/mllPF2/"); @@ -106,7 +106,6 @@ struct studyMCTruth { fRegistry.addClone("Pair/default/", "Pair/mllPF0/"); fRegistry.addClone("Pair/default/", "Pair/mllPF1/"); fRegistry.addClone("Pair/default/", "Pair/mllPF2/"); - fRegistry.addClone("Pair/default/Pi0/uls/", "Pair/PF/all/uls/"); } template @@ -301,8 +300,6 @@ struct studyMCTruth { continue; } fillTrackInfo<0>(pos); - // fRegistry.fill(HIST("Track/default/hPt"), pos.pt()); - // fRegistry.fill(HIST("Track/default/hEtaPhi"), pos.phi(), pos.eta()); } for (const auto& neg : negLeptons_per_mccollision) { map_pfb[neg.globalIndex()] = 0; @@ -310,21 +307,31 @@ struct studyMCTruth { continue; } fillTrackInfo<0>(neg); - // fRegistry.fill(HIST("Track/default/hPt"), neg.pt()); - // fRegistry.fill(HIST("Track/default/hEtaPhi"), neg.phi(), neg.eta()); } - for (const auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posLeptonsPF_per_mccollision, negLeptonsPF_per_mccollision))) { // ULS to set prefilter bits + for (const auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posLeptons_per_mccollision, negLeptonsPF_per_mccollision))) { // ULS to set prefilter bits, default pos + loose neg if (!isSelectedMCParticle(pos, mcParticles) || !isSelectedMCParticle(neg, mcParticles)) { continue; } ROOT::Math::PtEtaPhiMVector v1(pos.pt(), pos.eta(), pos.phi(), leptonMass); ROOT::Math::PtEtaPhiMVector v2(neg.pt(), neg.eta(), neg.phi(), leptonMass); ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - fRegistry.fill(HIST("Pair/PF/all/uls/hMvsPt"), v12.M(), v12.Pt()); for (int i = 0; i < static_cast(max_mll_vec->size()); i++) { if (v12.M() < max_mll_vec->at(i)) { map_pfb[pos.globalIndex()] |= (uint8_t(1) << i); + } + } + } // end of ULS pair loop to set prefilter bits + + for (const auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posLeptonsPF_per_mccollision, negLeptons_per_mccollision))) { // ULS to set prefilter bits, loose pos + default neg + if (!isSelectedMCParticle(pos, mcParticles) || !isSelectedMCParticle(neg, mcParticles)) { + continue; + } + ROOT::Math::PtEtaPhiMVector v1(pos.pt(), pos.eta(), pos.phi(), leptonMass); + ROOT::Math::PtEtaPhiMVector v2(neg.pt(), neg.eta(), neg.phi(), leptonMass); + ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; + for (int i = 0; i < static_cast(max_mll_vec->size()); i++) { + if (v12.M() < max_mll_vec->at(i)) { map_pfb[neg.globalIndex()] |= (uint8_t(1) << i); } } @@ -338,8 +345,6 @@ struct studyMCTruth { constexpr int index = i.value; if ((map_pfb[pos.globalIndex()] & (uint8_t(1) << index)) == 0) { fillTrackInfo(pos); - // fRegistry.fill(HIST("Track/") + HIST(pfNames[index + 1]) + HIST("hPt"), pos.pt()); - // fRegistry.fill(HIST("Track/") + HIST(pfNames[index + 1]) + HIST("hEtaPhi"), pos.phi(), pos.eta()); } }); } @@ -351,8 +356,6 @@ struct studyMCTruth { constexpr int index = i.value; if ((map_pfb[neg.globalIndex()] & (uint8_t(1) << index)) == 0) { fillTrackInfo(neg); - // fRegistry.fill(HIST("Track/") + HIST(pfNames[index + 1]) + HIST("hPt"), neg.pt()); - // fRegistry.fill(HIST("Track/") + HIST(pfNames[index + 1]) + HIST("hEtaPhi"), neg.phi(), neg.eta()); } }); } From cbfdffa7064f4d61065c2356c3ddfd27e132e80c Mon Sep 17 00:00:00 2001 From: alcaliva <32872606+alcaliva@users.noreply.github.com> Date: Tue, 11 Feb 2025 12:04:05 +0100 Subject: [PATCH 0144/1650] [PWGLF] matching efficiency study extended to eta and phi (#9869) --- .../QC/lfITSTPCMatchingSecondaryTracksQA.cxx | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx b/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx index 0760b88b4ce..4667bf133d0 100644 --- a/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx +++ b/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx @@ -13,7 +13,7 @@ /// /// \brief task for QA of ITS-TPC matching efficiency of secondary tracks from V0s /// \author Alberto Caliva (alberto.caliva@cern.ch), Francesca Ercolessi (francesca.ercolessi@cern.ch), Nicolò Jacazio (nicolo.jacazio@cern.ch) -/// \since May 22, 2024 +/// \since Feb 11, 2025 #include #include @@ -91,18 +91,18 @@ struct LfITSTPCMatchingSecondaryTracksQA { // Event Counters if (doprocessData) { registryData.add("number_of_events_data", "number of events in data", HistType::kTH1D, {{20, 0, 20, "Event Cuts"}}); - registryData.add("trkPionTpc", "trkPionTpc", HistType::kTH1D, {{1000, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("trkPionTpcIts", "trkPionTpcIts", HistType::kTH1D, {{1000, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("secPionTpc", "secPionTpc", HistType::kTH1D, {{1000, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); - registryData.add("secPionTpcIts", "secPionTpcIts", HistType::kTH1D, {{1000, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); + registryData.add("gloPionTPC", "gloPionTPC", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); + registryData.add("gloPionTPC_ITS", "gloPionTPC_ITS", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); + registryData.add("secPionTPC", "secPionTPC", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); + registryData.add("secPionTPC_ITS", "secPionTPC_ITS", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); } if (doprocessMC) { registryMC.add("number_of_events_mc", "number of events in mc", HistType::kTH1D, {{20, 0, 20, "Event Cuts"}}); - registryMC.add("trkPionTpcMc", "trkPionTpcMc", HistType::kTH1D, {{1000, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("trkPionTpcItsMc", "trkPionTpcItsMc", HistType::kTH1D, {{1000, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("secPionTpcMc", "secPionTpcMc", HistType::kTH1D, {{1000, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("secPionTpcItsMc", "secPionTpcItsMc", HistType::kTH1D, {{1000, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("gloPionTPC_MC", "gloPionTPC_MC", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); + registryMC.add("gloPionTPC_ITS_MC", "gloPionTPC_ITS_MC", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); + registryMC.add("secPionTPC_MC", "secPionTPC_MC", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); + registryMC.add("secPionTPC_ITS_MC", "secPionTPC_ITS_MC", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); } } @@ -202,12 +202,12 @@ struct LfITSTPCMatchingSecondaryTracksQA { if (!passedPionSelection(track)) continue; - registryData.fill(HIST("trkPionTpc"), track.pt()); + registryData.fill(HIST("gloPionTPC"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); if (!passedTrackSelectionIts(track)) continue; - registryData.fill(HIST("trkPionTpcIts"), track.pt()); + registryData.fill(HIST("gloPionTPC_ITS"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); } for (const auto& v0 : fullV0s) { @@ -226,16 +226,16 @@ struct LfITSTPCMatchingSecondaryTracksQA { if (!passedPionSelection(negTrack)) continue; - registryData.fill(HIST("secPionTpc"), posTrack.pt()); - registryData.fill(HIST("secPionTpc"), negTrack.pt()); + registryData.fill(HIST("secPionTPC"), posTrack.pt(), posTrack.eta(), TVector2::Phi_0_2pi(posTrack.phi())); + registryData.fill(HIST("secPionTPC"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); if (!passedTrackSelectionIts(posTrack)) continue; - registryData.fill(HIST("secPionTpcIts"), posTrack.pt()); + registryData.fill(HIST("secPionTPC_ITS"), posTrack.pt(), posTrack.eta(), TVector2::Phi_0_2pi(posTrack.phi())); if (!passedTrackSelectionIts(negTrack)) continue; - registryData.fill(HIST("secPionTpcIts"), negTrack.pt()); + registryData.fill(HIST("secPionTPC_ITS"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); } } PROCESS_SWITCH(LfITSTPCMatchingSecondaryTracksQA, processData, "Process data", true); @@ -266,11 +266,11 @@ struct LfITSTPCMatchingSecondaryTracksQA { if (std::fabs(particle.pdgCode()) != 211) continue; - registryMC.fill(HIST("trkPionTpcMc"), track.pt()); + registryMC.fill(HIST("gloPionTPC_MC"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); if (!passedTrackSelectionIts(track)) continue; - registryMC.fill(HIST("trkPionTpcItsMc"), track.pt()); + registryMC.fill(HIST("gloPionTPC_ITS_MC"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); } for (const auto& v0 : v0sPerColl) { @@ -310,16 +310,16 @@ struct LfITSTPCMatchingSecondaryTracksQA { if (pdgParent != 310) continue; - registryMC.fill(HIST("secPionTpcMc"), posTrack.pt()); - registryMC.fill(HIST("secPionTpcMc"), negTrack.pt()); + registryMC.fill(HIST("secPionTPC_MC"), posTrack.pt(), posTrack.eta(), TVector2::Phi_0_2pi(posTrack.phi())); + registryMC.fill(HIST("secPionTPC_MC"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); if (!passedTrackSelectionIts(posTrack)) continue; - registryMC.fill(HIST("secPionTpcItsMc"), posTrack.pt()); + registryMC.fill(HIST("secPionTPC_ITS_MC"), posTrack.pt(), posTrack.eta(), TVector2::Phi_0_2pi(posTrack.phi())); if (!passedTrackSelectionIts(negTrack)) continue; - registryMC.fill(HIST("secPionTpcItsMc"), negTrack.pt()); + registryMC.fill(HIST("secPionTPC_ITS_MC"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); } } } From 202371b9824520321959a9c9ac816309f67e87f2 Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Tue, 11 Feb 2025 13:08:47 +0100 Subject: [PATCH 0145/1650] [Common] centrality / minor changes for modular operation (#9867) Co-authored-by: ALICE Builder --- .../Multiplicity/multGlauberNBDFitter.cxx | 24 ++++++++++++++++--- .../Tools/Multiplicity/multGlauberNBDFitter.h | 2 +- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/Common/Tools/Multiplicity/multGlauberNBDFitter.cxx b/Common/Tools/Multiplicity/multGlauberNBDFitter.cxx index f4c47b60080..a765db72448 100644 --- a/Common/Tools/Multiplicity/multGlauberNBDFitter.cxx +++ b/Common/Tools/Multiplicity/multGlauberNBDFitter.cxx @@ -309,6 +309,7 @@ Bool_t multGlauberNBDFitter::DoFit() fk = fGlauberNBD->GetParameter(1); ff = fGlauberNBD->GetParameter(2); fnorm = fGlauberNBD->GetParameter(3); + fdMu = fGlauberNBD->GetParameter(4); return fitptr.Get()->IsValid(); } @@ -369,9 +370,25 @@ Double_t multGlauberNBDFitter::ContinuousNBD(Double_t n, Double_t mu, Double_t k return F; } -void multGlauberNBDFitter::CalculateAvNpNc(TProfile* lNPartProf, TProfile* lNCollProf, TH2F* lNPart2DPlot, TH2F* lNColl2DPlot, TH1F* hPercentileMap) +void multGlauberNBDFitter::CalculateAvNpNc(TProfile* lNPartProf, TProfile* lNCollProf, TH2F* lNPart2DPlot, TH2F* lNColl2DPlot, TH1F* hPercentileMap, Double_t lLoRange, Double_t lHiRange) { cout << "Calculating , in centrality bins..." << endl; + cout << "Range to calculate: " << lLoRange << " to " << lHiRange << endl; + + cout << "Acquiring values from the fit function..." << endl; + + fMu = fGlauberNBD->GetParameter(0); + fk = fGlauberNBD->GetParameter(1); + ff = fGlauberNBD->GetParameter(2); + fnorm = fGlauberNBD->GetParameter(3); + fdMu = fGlauberNBD->GetParameter(4); + + cout << "Please inspect now: " << endl; + cout << "Glauber NBD mu ............: " << fMu << endl; + cout << "Glauber NBD k .............: " << fk << endl; + cout << "Glauber NBD f .............: " << ff << endl; + cout << "Glauber NBD norm ..........: " << fnorm << endl; + cout << "Glauber NBD dmu/dNanc .....: " << fdMu << endl; //2-fold nested loop: // + looping over all Nancestor combinations @@ -379,8 +396,9 @@ void multGlauberNBDFitter::CalculateAvNpNc(TProfile* lNPartProf, TProfile* lNCol // ^---> final product already multiplicity-binned //______________________________________________________ - Double_t lLoRange, lHiRange; - fGlauberNBD->GetRange(lLoRange, lHiRange); + if (lLoRange < -1 && lHiRange < -1) { + fGlauberNBD->GetRange(lLoRange, lHiRange); + } // bypass to zero for (int ibin = 0; ibin < fNNpNcPairs; ibin++) { if (ibin % 2000 == 0) diff --git a/Common/Tools/Multiplicity/multGlauberNBDFitter.h b/Common/Tools/Multiplicity/multGlauberNBDFitter.h index b6adb081151..42d5cab046f 100644 --- a/Common/Tools/Multiplicity/multGlauberNBDFitter.h +++ b/Common/Tools/Multiplicity/multGlauberNBDFitter.h @@ -75,7 +75,7 @@ class multGlauberNBDFitter : public TNamed Double_t ContinuousNBD(Double_t n, Double_t mu, Double_t k); //For estimating Npart, Ncoll in multiplicity bins - void CalculateAvNpNc(TProfile* lNPartProf, TProfile* lNCollProf, TH2F* lNPart2DPlot, TH2F* lNColl2DPlot, TH1F* hPercentileMap); + void CalculateAvNpNc(TProfile* lNPartProf, TProfile* lNCollProf, TH2F* lNPart2DPlot, TH2F* lNColl2DPlot, TH1F* hPercentileMap, Double_t lLoRange = -1, Double_t lHiRange = -1); //void Print(Option_t *option="") const; From 8ba9fac994a9e477788b34df6e36eb069697f92d Mon Sep 17 00:00:00 2001 From: Francesca Ercolessi Date: Tue, 11 Feb 2025 15:01:41 +0100 Subject: [PATCH 0146/1650] [PWGLF] V0 analysis vs multiplicity: add additional track info to the data model (#9873) --- PWGLF/DataModel/v0qaanalysis.h | 17 ++++- .../Strangeness/v0qaanalysis.cxx | 36 ++++++++-- PWGLF/Tasks/Strangeness/v0postprocessing.cxx | 72 +++++++++++++------ 3 files changed, 94 insertions(+), 31 deletions(-) diff --git a/PWGLF/DataModel/v0qaanalysis.h b/PWGLF/DataModel/v0qaanalysis.h index efe82ed730f..977521b472c 100644 --- a/PWGLF/DataModel/v0qaanalysis.h +++ b/PWGLF/DataModel/v0qaanalysis.h @@ -10,7 +10,6 @@ // or submit itself to any jurisdiction. /// /// \brief QA task for V0 analysis using derived data -/// /// \author Francesca Ercolessi (francesca.ercolessi@cern.ch) #ifndef PWGLF_DATAMODEL_V0QAANALYSIS_H_ @@ -62,6 +61,16 @@ DECLARE_SOA_COLUMN(MultFV0A, multfv0a, float); DECLARE_SOA_COLUMN(EvFlag, evflag, int); DECLARE_SOA_COLUMN(Alpha, alpha, float); DECLARE_SOA_COLUMN(QtArm, qtarm, float); +DECLARE_SOA_COLUMN(V0PosTPCCrossedRows, v0postpcCrossedRows, float); +DECLARE_SOA_COLUMN(V0PosTPCCRFindCls, v0postpcCRFindCls, float); +DECLARE_SOA_COLUMN(V0PosTPCNClsShared, v0postpcNClsShared, float); +DECLARE_SOA_COLUMN(V0PosITSChi2NCl, v0positsChi2NCl, float); +DECLARE_SOA_COLUMN(V0PosTPCChi2NCl, v0postpcChi2NCl, float); +DECLARE_SOA_COLUMN(V0NegTPCCrossedRows, v0negtpcCrossedRows, float); +DECLARE_SOA_COLUMN(V0NegTPCCRFindCls, v0negtpcCRFindCls, float); +DECLARE_SOA_COLUMN(V0NegTPCNClsShared, v0negtpcNClsShared, float); +DECLARE_SOA_COLUMN(V0NegITSChi2NCl, v0negitsChi2NCl, float); +DECLARE_SOA_COLUMN(V0NegTPCChi2NCl, v0negtpcChi2NCl, float); } // namespace myv0candidates @@ -77,7 +86,11 @@ DECLARE_SOA_TABLE(MyV0Candidates, "AOD", "MYV0CANDIDATES", myv0candidates::PosHasTOF, myv0candidates::NegHasTOF, myv0candidates::PDGCode, myv0candidates::IsDauK0Short, myv0candidates::IsDauLambda, myv0candidates::IsDauAntiLambda, myv0candidates::IsPhysicalPrimary, myv0candidates::MultFT0M, myv0candidates::MultFV0A, - myv0candidates::EvFlag, myv0candidates::Alpha, myv0candidates::QtArm); + myv0candidates::EvFlag, myv0candidates::Alpha, myv0candidates::QtArm, + myv0candidates::V0PosTPCCrossedRows, myv0candidates::V0PosTPCCRFindCls, myv0candidates::V0PosTPCNClsShared, + myv0candidates::V0PosITSChi2NCl, myv0candidates::V0PosTPCChi2NCl, + myv0candidates::V0NegTPCCrossedRows, myv0candidates::V0NegTPCCRFindCls, myv0candidates::V0NegTPCNClsShared, + myv0candidates::V0NegITSChi2NCl, myv0candidates::V0NegTPCChi2NCl); } // namespace o2::aod diff --git a/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx b/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx index 31aa720230b..37b27e0ac9e 100644 --- a/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx +++ b/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx @@ -74,7 +74,7 @@ struct LfV0qaanalysis { registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(5, "TFBorder"); registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(6, "ITSROFBorder"); registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(7, "isTOFVertexMatched"); - registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(8, "isGoodZvtxFT0vsPV"); + registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(8, "isNoSameBunchPileup"); registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(9, "Applied selection"); registry.add("hCentFT0M", "hCentFT0M", {HistType::kTH1F, {{1000, 0.f, 100.f}}}); @@ -134,14 +134,16 @@ struct LfV0qaanalysis { // Event selection criteria Configurable cutzvertex{"cutzvertex", 15.0f, "Accepted z-vertex range (cm)"}; + Configurable MCcutzvertex{"MCcutzvertex", 100.0f, "Accepted true MC z-vertex range (cm)"}; Configurable sel8{"sel8", 0, "Apply sel8 event selection"}; Configurable isMC{"isMC", 0, "Is MC"}; Configurable isTriggerTVX{"isTriggerTVX", 1, "Is Trigger TVX"}; Configurable isNoTimeFrameBorder{"isNoTimeFrameBorder", 1, "Is No Time Frame Border"}; Configurable isNoITSROFrameBorder{"isNoITSROFrameBorder", 1, "Is No ITS Readout Frame Border"}; Configurable isVertexTOFmatched{"isVertexTOFmatched", 0, "Is Vertex TOF matched"}; - Configurable isGoodZvtxFT0vsPV{"isGoodZvtxFT0vsPV", 0, "isGoodZvtxFT0vsPV"}; + Configurable isNoSameBunchPileup{"isNoSameBunchPileup", 0, "isNoSameBunchPileup"}; Configurable v0TypeSelection{"v0TypeSelection", 1, "select on a certain V0 type (leave negative if no selection desired)"}; + Configurable NotITSAfterburner{"NotITSAfterburner", 0, "NotITSAfterburner"}; // V0 selection criteria Configurable v0cospa{"v0cospa", 0.97, "V0 CosPA"}; @@ -172,7 +174,7 @@ struct LfV0qaanalysis { return false; } registry.fill(HIST("hNEvents"), 4.5); - if (!isMC && isNoITSROFrameBorder && !collision.selection_bit(aod::evsel::kNoITSROFrameBorder)) { + if (isNoITSROFrameBorder && !collision.selection_bit(aod::evsel::kNoITSROFrameBorder)) { return false; } registry.fill(HIST("hNEvents"), 5.5); @@ -180,7 +182,7 @@ struct LfV0qaanalysis { return false; } registry.fill(HIST("hNEvents"), 6.5); - if (isGoodZvtxFT0vsPV && !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { + if (isNoSameBunchPileup && !collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { return false; } registry.fill(HIST("hNEvents"), 7.5); @@ -235,6 +237,10 @@ struct LfV0qaanalysis { bool isPhysicalPrimary = isMC; bool isDauK0Short = false, isDauLambda = false, isDauAntiLambda = false; + if (NotITSAfterburner && (v0.negTrack_as().isITSAfterburner() || v0.posTrack_as().isITSAfterburner())) { + continue; + } + if (v0.v0radius() > v0radius && v0.v0cosPA() > v0cospa && TMath::Abs(v0.posTrack_as().eta()) < etadau && @@ -253,7 +259,13 @@ struct LfV0qaanalysis { v0.negTrack_as().tofNSigmaPr(), v0.posTrack_as().tofNSigmaPr(), v0.negTrack_as().tofNSigmaPi(), v0.posTrack_as().tofNSigmaPi(), v0.posTrack_as().hasTOF(), v0.negTrack_as().hasTOF(), lPDG, isDauK0Short, isDauLambda, isDauAntiLambda, isPhysicalPrimary, - collision.centFT0M(), collision.centFV0A(), evFlag, v0.alpha(), v0.qtarm()); + collision.centFT0M(), collision.centFV0A(), evFlag, v0.alpha(), v0.qtarm(), + v0.posTrack_as().tpcNClsCrossedRows(), v0.posTrack_as().tpcCrossedRowsOverFindableCls(), + v0.posTrack_as().tpcNClsShared(), v0.posTrack_as().itsChi2NCl(), + v0.posTrack_as().tpcChi2NCl(), + v0.negTrack_as().tpcNClsCrossedRows(), v0.negTrack_as().tpcCrossedRowsOverFindableCls(), + v0.negTrack_as().tpcNClsShared(), v0.negTrack_as().itsChi2NCl(), + v0.negTrack_as().tpcChi2NCl()); } } } @@ -307,6 +319,10 @@ struct LfV0qaanalysis { continue; } + if (NotITSAfterburner && (v0.negTrack_as().isITSAfterburner() || v0.posTrack_as().isITSAfterburner())) { + continue; + } + // Highest numerator of efficiency if (v0mcparticle.isPhysicalPrimary()) { if (v0mcparticle.pdgCode() == 310) { @@ -383,7 +399,13 @@ struct LfV0qaanalysis { v0.negTrack_as().tofNSigmaPr(), v0.posTrack_as().tofNSigmaPr(), v0.negTrack_as().tofNSigmaPi(), v0.posTrack_as().tofNSigmaPi(), v0.posTrack_as().hasTOF(), v0.negTrack_as().hasTOF(), lPDG, isDauK0Short, isDauLambda, isDauAntiLambda, isprimary, - mcCollision.centFT0M(), cent, evFlag, v0.alpha(), v0.qtarm()); + mcCollision.centFT0M(), cent, evFlag, v0.alpha(), v0.qtarm(), + v0.posTrack_as().tpcNClsCrossedRows(), v0.posTrack_as().tpcCrossedRowsOverFindableCls(), + v0.posTrack_as().tpcNClsShared(), v0.posTrack_as().itsChi2NCl(), + v0.posTrack_as().tpcChi2NCl(), + v0.negTrack_as().tpcNClsCrossedRows(), v0.negTrack_as().tpcCrossedRowsOverFindableCls(), + v0.negTrack_as().tpcNClsShared(), v0.negTrack_as().itsChi2NCl(), + v0.negTrack_as().tpcChi2NCl()); } } @@ -432,7 +454,7 @@ struct LfV0qaanalysis { registry.fill(HIST("hNEventsMCGen"), 0.5); - if (TMath::Abs(mcCollision.posZ()) > cutzvertex) { + if (TMath::Abs(mcCollision.posZ()) > MCcutzvertex) { return; } registry.fill(HIST("hNEventsMCGen"), 1.5); diff --git a/PWGLF/Tasks/Strangeness/v0postprocessing.cxx b/PWGLF/Tasks/Strangeness/v0postprocessing.cxx index 7d768b96ed3..f1b5ab3975e 100644 --- a/PWGLF/Tasks/Strangeness/v0postprocessing.cxx +++ b/PWGLF/Tasks/Strangeness/v0postprocessing.cxx @@ -31,6 +31,7 @@ using DauTracks = soa::Join radius{"radius", 0.5, "Radius"}; + Configurable maxradius{"maxradius", 1000, "Radius"}; Configurable dcanegtopv{"dcanegtopv", 0.05, "DCA Neg To PV"}; Configurable dcapostopv{"dcapostopv", 0.05, "DCA Pos To PV"}; Configurable cospaK0s{"cospaK0s", 0.97, "K0s CosPA"}; @@ -45,6 +46,11 @@ struct v0postprocessing { Configurable ntpcsigmaMC{"ntpcsigmaMC", 100, "N sigma TPC for MC"}; Configurable etadau{"etadau", 0.8, "Eta Daughters"}; Configurable minITShits{"minITShits", 2, "min ITS hits"}; + Configurable min_TPC_nClusters{"min_TPC_nClusters", 80, "min_TPC_nClusters"}; + Configurable min_TPC_nCrossedRowsOverFindableCls{"min_TPC_nCrossedRowsOverFindableCls", 0.8, "min_TPC_nCrossedRowsOverFindableCls"}; + Configurable max_tpcSharedCls{"max_tpcSharedCls", 0.4, "max_tpcSharedCls"}; + Configurable max_chi2_ITS{"max_chi2_ITS", 36, "max_chi2_ITS"}; + Configurable max_chi2_TPC{"max_chi2_TPC", 4, "max_chi2_TPC"}; Configurable isMC{"isMC", 1, "isMC"}; Configurable evSel{"evSel", 1, "evSel"}; Configurable hasTOF2Leg{"hasTOF2Leg", 0, "hasTOF2Leg"}; @@ -126,15 +132,35 @@ struct v0postprocessing { for (auto& candidate : myv0s) { // common selections - if (candidate.v0radius() < radius) + if (candidate.v0radius() < radius && candidate.v0radius() > maxradius) continue; if (TMath::Abs(candidate.v0poseta()) > etadau) continue; if (TMath::Abs(candidate.v0negeta()) > etadau) continue; - if (TMath::Abs(candidate.v0positshits()) < minITShits) + if (candidate.v0positshits() < minITShits) continue; - if (TMath::Abs(candidate.v0negitshits()) < minITShits) + if (candidate.v0negitshits() < minITShits) + continue; + if (candidate.v0postpcCrossedRows() < min_TPC_nClusters) + continue; + if (candidate.v0negtpcCrossedRows() < min_TPC_nClusters) + continue; + if (candidate.v0postpcCRFindCls() < min_TPC_nCrossedRowsOverFindableCls) + continue; + if (candidate.v0negtpcCRFindCls() < min_TPC_nCrossedRowsOverFindableCls) + continue; + if (candidate.v0postpcNClsShared() > max_tpcSharedCls) + continue; + if (candidate.v0negtpcNClsShared() > max_tpcSharedCls) + continue; + if (candidate.v0positsChi2NCl() > max_chi2_ITS) + continue; + if (candidate.v0negitsChi2NCl() > max_chi2_ITS) + continue; + if (candidate.v0postpcChi2NCl() > max_chi2_TPC) + continue; + if (candidate.v0negtpcChi2NCl() > max_chi2_TPC) continue; if (TMath::Abs(candidate.v0dcanegtopv()) < dcanegtopv) continue; @@ -160,26 +186,28 @@ struct v0postprocessing { registry.fill(HIST("hArmenterosPodolanski"), candidate.alpha(), candidate.qtarm()); - if (doArmenterosCut && candidate.qtarm() > (paramArmenterosCut * TMath::Abs(candidate.alpha()))) { - registry.fill(HIST("hArmenterosPodolanski_Sel"), candidate.alpha(), candidate.qtarm()); - registry.fill(HIST("hMassK0Short"), candidate.massk0short()); - registry.fill(HIST("hMassVsPtK0Short"), candidate.v0pt(), candidate.massk0short()); - registry.fill(HIST("hMassVsPtK0ShortVsCentFT0M"), candidate.v0pt(), candidate.multft0m(), candidate.massk0short()); - registry.fill(HIST("hMassVsPtK0ShortVsCentFV0A"), candidate.v0pt(), candidate.multfv0a(), candidate.massk0short()); + if (doArmenterosCut && candidate.qtarm() <= (paramArmenterosCut * TMath::Abs(candidate.alpha()))) { + continue; + } - // QA - if (!isMC) { - registry.fill(HIST("hK0sV0Radius"), candidate.v0radius()); - registry.fill(HIST("hK0sCosPA"), candidate.v0cospa()); - registry.fill(HIST("hK0sV0DCANegToPV"), candidate.v0dcanegtopv()); - registry.fill(HIST("hK0sV0DCAPosToPV"), candidate.v0dcapostopv()); - registry.fill(HIST("hK0sV0DCAV0Daughters"), candidate.v0dcav0daughters()); - registry.fill(HIST("hK0sCtau"), candidate.ctauk0short()); - registry.fill(HIST("hK0sEtaDau"), candidate.v0poseta()); - registry.fill(HIST("hK0sRap"), candidate.rapk0short()); - registry.fill(HIST("hK0sTPCNSigmaPosPi"), candidate.ntpcsigmapospi()); - registry.fill(HIST("hK0sTPCNSigmaNegPi"), candidate.ntpcsigmanegpi()); - } + registry.fill(HIST("hArmenterosPodolanski_Sel"), candidate.alpha(), candidate.qtarm()); + registry.fill(HIST("hMassK0Short"), candidate.massk0short()); + registry.fill(HIST("hMassVsPtK0Short"), candidate.v0pt(), candidate.massk0short()); + registry.fill(HIST("hMassVsPtK0ShortVsCentFT0M"), candidate.v0pt(), candidate.multft0m(), candidate.massk0short()); + registry.fill(HIST("hMassVsPtK0ShortVsCentFV0A"), candidate.v0pt(), candidate.multfv0a(), candidate.massk0short()); + + // QA + if (!isMC) { + registry.fill(HIST("hK0sV0Radius"), candidate.v0radius()); + registry.fill(HIST("hK0sCosPA"), candidate.v0cospa()); + registry.fill(HIST("hK0sV0DCANegToPV"), candidate.v0dcanegtopv()); + registry.fill(HIST("hK0sV0DCAPosToPV"), candidate.v0dcapostopv()); + registry.fill(HIST("hK0sV0DCAV0Daughters"), candidate.v0dcav0daughters()); + registry.fill(HIST("hK0sCtau"), candidate.ctauk0short()); + registry.fill(HIST("hK0sEtaDau"), candidate.v0poseta()); + registry.fill(HIST("hK0sRap"), candidate.rapk0short()); + registry.fill(HIST("hK0sTPCNSigmaPosPi"), candidate.ntpcsigmapospi()); + registry.fill(HIST("hK0sTPCNSigmaNegPi"), candidate.ntpcsigmanegpi()); } } From 9ebeb24d7e61f624a7484afe2c4887fb118a4152 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Tue, 11 Feb 2025 16:03:21 +0100 Subject: [PATCH 0147/1650] [PWGLF] Update k0_mixed_events.cxx (#9870) --- PWGLF/Tasks/Strangeness/k0_mixed_events.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx b/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx index cdd1eb3f8aa..c061a1fc04e 100644 --- a/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx +++ b/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx @@ -676,7 +676,7 @@ struct K0MixedEvents { } PROCESS_SWITCH(K0MixedEvents, processDerived, "process derived", true); - using RecoCollisions = soa::Join; + using RecoCollisions = soa::Join; void processData(RecoTracks const& tracks, RecoCollisions const& collisions, BCsWithTimestamps const& bcs) { From 2a125a29e4e4dc4b9dcadb8b9959ad3651aea28a Mon Sep 17 00:00:00 2001 From: Suraj Prasad Date: Tue, 11 Feb 2025 20:47:44 +0530 Subject: [PATCH 0148/1650] [PWGLF] Added histograms for FV0 Mult vs Flattenicity (#9876) --- .../Strangeness/lambdak0sflattenicity.cxx | 143 ++++++++++-------- 1 file changed, 77 insertions(+), 66 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdak0sflattenicity.cxx b/PWGLF/Tasks/Strangeness/lambdak0sflattenicity.cxx index 5fb624ab79b..5c53923f74d 100755 --- a/PWGLF/Tasks/Strangeness/lambdak0sflattenicity.cxx +++ b/PWGLF/Tasks/Strangeness/lambdak0sflattenicity.cxx @@ -134,34 +134,34 @@ struct Lambdak0sflattenicity { Configurable flattenicityforLossCorrRec{"flattenicityforLossCorrRec", true, "Flattenicity from Rec Tracks are used for Signal and Event loss calculations"}; // Common Configurable parameters for V0 selection - Configurable v0settingDcav0dau{"v0settingDcav0dau", 1, - "DCA V0 Daughters"}; - Configurable v0settingDcapostopv{"v0settingDcapostopv", 0.06, - "DCA Pos To PV"}; - Configurable v0settingDcanegtopv{"v0settingDcanegtopv", 0.06, - "DCA Neg To PV"}; - Configurable v0settingRapidity{"v0settingRapidity", 0.5, - "V0 rapidity cut"}; + Configurable v0setting_dcav0dau{"v0setting_dcav0dau", 1, + "DCA V0 Daughters"}; + Configurable v0setting_dcapostopv{"v0setting_dcapostopv", 0.06, + "DCA Pos To PV"}; + Configurable v0setting_dcanegtopv{"v0setting_dcanegtopv", 0.06, + "DCA Neg To PV"}; + Configurable v0setting_rapidity{"v0setting_rapidity", 0.5, + "V0 rapidity cut"}; // Configurable parameters for V0 selection for KOs - Configurable v0settingCospaK0s{"v0settingCospaK0s", 0.97, - "V0 CosPA for K0s"}; - Configurable v0settingRadiusK0s{"v0settingRadiusK0s", 0.5, - "v0radius for K0s"}; - Configurable v0settingctauK0s{"v0settingctauK0s", 20, - "v0ctau for K0s"}; - Configurable v0settingMassRejectionK0s{"v0settingMassRejectionK0s", 0.005, - "Competing Mass Rejection cut for K0s"}; + Configurable v0setting_cospaK0s{"v0setting_cospaK0s", 0.97, + "V0 CosPA for K0s"}; + Configurable v0setting_radiusK0s{"v0setting_radiusK0s", 0.5, + "v0radius for K0s"}; + Configurable v0setting_ctauK0s{"v0setting_ctauK0s", 20, + "v0ctau for K0s"}; + Configurable v0setting_massrejectionK0s{"v0setting_massrejectionK0s", 0.005, + "Competing Mass Rejection cut for K0s"}; // Configurable parameters for V0 selection for Lambda - Configurable v0settingCospaLambda{"v0settingCospaLambda", 0.995, - "V0 CosPA for Lambda"}; - Configurable v0settingRadiusLambda{"v0settingRadiusLambda", 0.5, - "v0radius for Lambda"}; - Configurable v0settingctauLambda{"v0settingctauLambda", 30, - "v0ctau for Lambda"}; - Configurable v0settingMassRejectionLambda{"v0settingMassRejectionLambda", 0.01, - "Competing Mass Rejection cut for Lambda"}; + Configurable v0setting_cospaLambda{"v0setting_cospaLambda", 0.995, + "V0 CosPA for Lambda"}; + Configurable v0setting_radiusLambda{"v0setting_radiusLambda", 0.5, + "v0radius for Lambda"}; + Configurable v0setting_ctauLambda{"v0setting_ctauLambda", 30, + "v0ctau for Lambda"}; + Configurable v0setting_massrejectionLambda{"v0setting_massrejectionLambda", 0.01, + "Competing Mass Rejection cut for Lambda"}; // Configurable parameters for PID selection Configurable nSigmaTPCPion{"nSigmaTPCPion", 5, "nSigmaTPCPion"}; @@ -169,7 +169,7 @@ struct Lambdak0sflattenicity { // Configurable v0daughter_etacut{"V0DaughterEtaCut", 0.8, // "V0DaughterEtaCut"}; - Configurable v0etacut{"v0etacut", 0.8, "v0etacut"}; + // Configurable v0etacut{"v0etacut", 0.8, "v0etacut"}; // acceptance cuts for Flattenicity correlation Configurable cfgTrkEtaCut{"cfgTrkEtaCut", 0.8f, @@ -270,6 +270,8 @@ struct Lambdak0sflattenicity { rEventSelection.get(HIST("hNEventsMCReco"))->GetXaxis()->SetBinLabel(2, "pass ev sel"); rEventSelection.get(HIST("hNEventsMCReco"))->GetXaxis()->SetBinLabel(3, "INELgt0"); rEventSelection.get(HIST("hNEventsMCReco"))->GetXaxis()->SetBinLabel(4, "check"); + rEventSelection.add("hTrueFV0amplvsFlat", "TrueFV0MvsFlat", HistType::kTH2D, + {{500, -0.5, +499.5, "True Nch in FV0 region"}, flatAxis}); } // K0s reconstruction // Mass @@ -427,6 +429,8 @@ struct Lambdak0sflattenicity { {{50000, -0.5, 199999.5, "FT0C amplitudes"}}); rFlattenicity.add("hFT0A", "FT0A", HistType::kTH1D, {{2000, -0.5, 1999.5, "FT0A amplitudes"}}); + rFlattenicity.add("hFV0amplvsFlat", "FV0MvsFlat", HistType::kTH2D, + {{4000, -0.5, +49999.5, "FV0 amplitude"}, flatAxis}); // estimators for (int iEe = 0; iEe < 8; ++iEe) { @@ -503,12 +507,12 @@ struct Lambdak0sflattenicity { "Both Data and MC set to false; try again with only one of " "them set to false"); } - if ((doprocessRecMC && !doprocessGenMC) || - (!doprocessRecMC && doprocessGenMC)) { - LOGF(fatal, - "MCRec and MCGen are set to opposite switches, try again " - "with both set to either true or false"); - } + // if ((doprocessRecMC && !doprocessGenMC) || + // (!doprocessRecMC && doprocessGenMC)) { + // LOGF(fatal, + // "MCRec and MCGen are set to opposite switches, try again " + // "with both set to either true or false"); + // } } int getT0ASector(int iCh) @@ -1126,6 +1130,8 @@ struct Lambdak0sflattenicity { } } float finalflattenicity = estimator[2]; + rFlattenicity.fill(HIST("hFV0amplvsFlat"), sumAmpFV0, estimator[2]); + if (flattenicityforanalysis == 1) { finalflattenicity = estimator[4]; } @@ -1142,6 +1148,8 @@ struct Lambdak0sflattenicity { float flattenicity = -1; float etamin, etamax, minphi, maxphi, dphi; int isegment = 0, nsectors; + int multFV0 = 0; + for (const auto& mcParticle : mcParticles) { if (!(mcParticle.isPhysicalPrimary() && mcParticle.pt() > 0)) { continue; @@ -1155,6 +1163,7 @@ struct Lambdak0sflattenicity { float etap = mcParticle.eta(); float phip = mcParticle.phi(); isegment = 0; + for (int ieta = 0; ieta < 5; ieta++) { etamax = kMaxEtaFV0 - ieta * kDetaFV0; if (ieta == 0) { @@ -1174,6 +1183,7 @@ struct Lambdak0sflattenicity { dphi = std::abs(maxphi - minphi); if (etap >= etamin && etap < etamax && phip >= minphi && phip < maxphi) { rhoLatticeFV0AMC[isegment] += 1.0 / std::abs(dphi * kDetaFV0); + multFV0++; } isegment++; } @@ -1182,6 +1192,7 @@ struct Lambdak0sflattenicity { flattenicity = 1.0 - getFlatenicity({rhoLatticeFV0AMC.data(), rhoLatticeFV0AMC.size()}); + rEventSelection.fill(HIST("hTrueFV0amplvsFlat"), multFV0, estimator[2]); return flattenicity; } // ====================== Flattenicity estimation ends ===================== @@ -1189,9 +1200,9 @@ struct Lambdak0sflattenicity { // Filters on V0s // Cannot filter on dynamic columns, so we cut on DCA to PV and DCA between // daughters only - Filter preFilterV0 = (nabs(aod::v0data::dcapostopv) > v0settingDcapostopv && - nabs(aod::v0data::dcanegtopv) > v0settingDcanegtopv && - aod::v0data::dcaV0daughters < v0settingDcav0dau); + Filter preFilterV0 = (nabs(aod::v0data::dcapostopv) > v0setting_dcapostopv && + nabs(aod::v0data::dcanegtopv) > v0setting_dcanegtopv && + aod::v0data::dcaV0daughters < v0setting_dcav0dau); Filter trackFilter = (nabs(aod::track::eta) < cfgTrkEtaCut && aod::track::pt > cfgTrkLowPtCut); @@ -1255,15 +1266,15 @@ struct Lambdak0sflattenicity { // Cut on dynamic columns for K0s - if (v0.v0cosPA() >= v0settingCospaK0s && - v0.v0radius() >= v0settingRadiusK0s && + if (v0.v0cosPA() >= v0setting_cospaK0s && + v0.v0radius() >= v0setting_radiusK0s && std::abs(posDaughterTrack.tpcNSigmaPi()) <= nSigmaTPCPion && std::abs(negDaughterTrack.tpcNSigmaPi()) <= nSigmaTPCPion && - ctauK0s < v0settingctauK0s && - std::abs(v0.rapidity(0)) <= v0settingRapidity && - std::abs(massLambda - pdgmassLambda) > v0settingMassRejectionK0s && + ctauK0s < v0setting_ctauK0s && + std::abs(v0.rapidity(0)) <= v0setting_rapidity && + std::abs(massLambda - pdgmassLambda) > v0setting_massrejectionK0s && std::abs(massAntiLambda - pdgmassLambda) > - v0settingMassRejectionK0s) { + v0setting_massrejectionK0s) { rKzeroShort.fill(HIST("hMassK0sSelected"), massK0s); rKzeroShort.fill(HIST("hDCAV0DaughtersK0s"), v0.dcaV0daughters()); @@ -1286,13 +1297,13 @@ struct Lambdak0sflattenicity { } // Cut on dynamic columns for Lambda - if (v0.v0cosPA() >= v0settingCospaLambda && - v0.v0radius() >= v0settingRadiusLambda && + if (v0.v0cosPA() >= v0setting_cospaLambda && + v0.v0radius() >= v0setting_radiusLambda && std::abs(posDaughterTrack.tpcNSigmaPr()) <= nSigmaTPCProton && std::abs(negDaughterTrack.tpcNSigmaPi()) <= nSigmaTPCPion && - ctauLambda < v0settingctauLambda && - std::abs(v0.rapidity(1)) <= v0settingRapidity && - std::abs(massK0s - pdgmassK0s) > v0settingMassRejectionLambda) { + ctauLambda < v0setting_ctauLambda && + std::abs(v0.rapidity(1)) <= v0setting_rapidity && + std::abs(massK0s - pdgmassK0s) > v0setting_massrejectionLambda) { rLambda.fill(HIST("hMassLambdaSelected"), massLambda); rLambda.fill(HIST("hDCAV0DaughtersLambda"), v0.dcaV0daughters()); @@ -1315,13 +1326,13 @@ struct Lambdak0sflattenicity { } // Cut on dynamic columns for AntiLambda - if (v0.v0cosPA() >= v0settingCospaLambda && - v0.v0radius() >= v0settingRadiusLambda && + if (v0.v0cosPA() >= v0setting_cospaLambda && + v0.v0radius() >= v0setting_radiusLambda && std::abs(posDaughterTrack.tpcNSigmaPi()) <= nSigmaTPCPion && std::abs(negDaughterTrack.tpcNSigmaPr()) <= nSigmaTPCProton && - ctauAntiLambda < v0settingctauLambda && - std::abs(v0.rapidity(2)) <= v0settingRapidity && - std::abs(massK0s - pdgmassK0s) > v0settingMassRejectionLambda) { + ctauAntiLambda < v0setting_ctauLambda && + std::abs(v0.rapidity(2)) <= v0setting_rapidity && + std::abs(massK0s - pdgmassK0s) > v0setting_massrejectionLambda) { rAntiLambda.fill(HIST("hMassAntiLambdaSelected"), massAntiLambda); rAntiLambda.fill(HIST("hDCAV0DaughtersAntiLambda"), @@ -1421,15 +1432,15 @@ struct Lambdak0sflattenicity { auto v0mcParticle = v0.mcParticle(); // Cut on dynamic columns for K0s - if (v0mcParticle.pdgCode() == 310 && v0.v0cosPA() >= v0settingCospaK0s && - v0.v0radius() >= v0settingRadiusK0s && + if (v0mcParticle.pdgCode() == 310 && v0.v0cosPA() >= v0setting_cospaK0s && + v0.v0radius() >= v0setting_radiusK0s && std::abs(posDaughterTrack.tpcNSigmaPi()) <= nSigmaTPCPion && std::abs(negDaughterTrack.tpcNSigmaPi()) <= nSigmaTPCPion && - ctauK0s < v0settingctauK0s && - std::abs(v0.rapidity(0)) <= v0settingRapidity && - std::abs(massLambda - pdgmassLambda) > v0settingMassRejectionK0s && + ctauK0s < v0setting_ctauK0s && + std::abs(v0.rapidity(0)) <= v0setting_rapidity && + std::abs(massLambda - pdgmassLambda) > v0setting_massrejectionK0s && std::abs(massAntiLambda - pdgmassLambda) > - v0settingMassRejectionK0s) { + v0setting_massrejectionK0s) { rKzeroShort.fill(HIST("hMassK0sSelected"), massK0s); rKzeroShort.fill(HIST("hDCAV0DaughtersK0s"), v0.dcaV0daughters()); @@ -1453,13 +1464,13 @@ struct Lambdak0sflattenicity { // Cut on dynamic columns for Lambda if (v0mcParticle.pdgCode() == 3122 && - v0.v0cosPA() >= v0settingCospaLambda && - v0.v0radius() >= v0settingRadiusLambda && + v0.v0cosPA() >= v0setting_cospaLambda && + v0.v0radius() >= v0setting_radiusLambda && std::abs(posDaughterTrack.tpcNSigmaPr()) <= nSigmaTPCProton && std::abs(negDaughterTrack.tpcNSigmaPi()) <= nSigmaTPCPion && - ctauLambda < v0settingctauLambda && - std::abs(v0.rapidity(1)) <= v0settingRapidity && - std::abs(massK0s - pdgmassK0s) > v0settingMassRejectionLambda) { + ctauLambda < v0setting_ctauLambda && + std::abs(v0.rapidity(1)) <= v0setting_rapidity && + std::abs(massK0s - pdgmassK0s) > v0setting_massrejectionLambda) { rLambda.fill(HIST("hMassLambdaSelected"), massLambda); rLambda.fill(HIST("hDCAV0DaughtersLambda"), v0.dcaV0daughters()); @@ -1483,13 +1494,13 @@ struct Lambdak0sflattenicity { // Cut on dynamic columns for AntiLambda if (v0mcParticle.pdgCode() == -3122 && - v0.v0cosPA() >= v0settingCospaLambda && - v0.v0radius() >= v0settingRadiusLambda && + v0.v0cosPA() >= v0setting_cospaLambda && + v0.v0radius() >= v0setting_radiusLambda && std::abs(posDaughterTrack.tpcNSigmaPi()) <= nSigmaTPCPion && std::abs(negDaughterTrack.tpcNSigmaPr()) <= nSigmaTPCProton && - ctauAntiLambda < v0settingctauLambda && - std::abs(v0.rapidity(2)) <= v0settingRapidity && - std::abs(massK0s - pdgmassK0s) > v0settingMassRejectionLambda) { + ctauAntiLambda < v0setting_ctauLambda && + std::abs(v0.rapidity(2)) <= v0setting_rapidity && + std::abs(massK0s - pdgmassK0s) > v0setting_massrejectionLambda) { rAntiLambda.fill(HIST("hMassAntiLambdaSelected"), massAntiLambda); rAntiLambda.fill(HIST("hDCAV0DaughtersAntiLambda"), From 23e1b3f934cd0ea24cd92046d0b0e1b5d9fc85f8 Mon Sep 17 00:00:00 2001 From: Maxim Virta <84773378+MaximVirta@users.noreply.github.com> Date: Tue, 11 Feb 2025 17:58:42 +0200 Subject: [PATCH 0149/1650] [PWGCF] NUA corrections with CCDB connection (#9868) Co-authored-by: ALICE Action Bot --- PWGCF/JCorran/Core/FlowJHistManager.cxx | 10 +- PWGCF/JCorran/Core/FlowJHistManager.h | 170 ++++++------ PWGCF/JCorran/Core/FlowJSPCAnalysis.cxx | 306 ++++++++++++--------- PWGCF/JCorran/Core/FlowJSPCAnalysis.h | 66 ++--- PWGCF/JCorran/Core/FlowJSPCObservables.h | 25 +- PWGCF/JCorran/Tasks/flowJNUACreation.cxx | 14 +- PWGCF/JCorran/Tasks/flowJSPCAnalysis.cxx | 129 ++++----- PWGCF/JCorran/Tasks/jflucAnalysisTask.cxx | 4 +- PWGCF/JCorran/Tasks/jflucWeightsLoader.cxx | 77 ++++-- 9 files changed, 428 insertions(+), 373 deletions(-) diff --git a/PWGCF/JCorran/Core/FlowJHistManager.cxx b/PWGCF/JCorran/Core/FlowJHistManager.cxx index c78dbc4af3b..8be0371f1ab 100644 --- a/PWGCF/JCorran/Core/FlowJHistManager.cxx +++ b/PWGCF/JCorran/Core/FlowJHistManager.cxx @@ -10,18 +10,20 @@ // or submit itself to any jurisdiction. // Header files. +#include // O2 headers. // O2 Physics headers. #include "PWGCF/JCorran/Core/FlowJHistManager.h" +#include "CommonConstants/MathConstants.h" // Namespaces. using namespace o2; using namespace o2::framework; /// \brief Create the histograms in the QA registry. -void FlowJHistManager::CreateHistQA() +void FlowJHistManager::createHistQA() { // Security checks for proper use of the method. if (!mHistRegistryQA) { @@ -60,7 +62,7 @@ void FlowJHistManager::CreateHistQA() mHistRegistryQA->add("Centrality_00-01/After/histEta", "Pseudorapidity", HistType::kTH1F, {axisEta}, true); - const AxisSpec axisPhi = {100, 0., 2. * M_PI, "#varphi"}; + const AxisSpec axisPhi = {100, 0., o2::constants::math::TwoPI, "#varphi"}; mHistRegistryQA->add("Centrality_00-01/After/histPhi", "Azimuthal angles (no NUA)", HistType::kTH1F, {axisPhi}, true); @@ -145,7 +147,7 @@ void FlowJHistManager::CreateHistQA() // Clone the first centrality class into the other classes. for (int iBin = 1; iBin < mNcentBins; iBin++) { - mHistRegistryQA->addClone("Centrality_00-01/", mCentClasses[iBin].data()); + mHistRegistryQA->addClone("Centrality_00-01/", MCentClasses[iBin].data()); } LOGF(info, "QA histograms created."); @@ -154,7 +156,7 @@ void FlowJHistManager::CreateHistQA() /// \brief Get the centrality bin value corresponding to the percentile. /// \param Centrality percentile of the collision. /// \return Bin for the histograms,... -int FlowJHistManager::GetCentBin(float cValue) +int FlowJHistManager::getCentBin(float cValue) { const float centClasses[] = {0., 1., 2., 5., 10., 20., 30., 40., 50., 60., 70.}; diff --git a/PWGCF/JCorran/Core/FlowJHistManager.h b/PWGCF/JCorran/Core/FlowJHistManager.h index cbb212ff917..e067a9f00b5 100644 --- a/PWGCF/JCorran/Core/FlowJHistManager.h +++ b/PWGCF/JCorran/Core/FlowJHistManager.h @@ -16,7 +16,6 @@ #define PWGCF_JCORRAN_CORE_FLOWJHISTMANAGER_H_ /* Header files. */ -#include #include #include #include @@ -33,8 +32,6 @@ // O2 Physics headers. /* Namespaces. */ -using namespace o2; -using namespace o2::framework; // ---------------------------------------------------------------------------- // Histogram manager to fill the general QA common to all flow tasks. @@ -45,52 +42,52 @@ class FlowJHistManager FlowJHistManager() = default; // Setters and getters, in the same order as the data members. - void SetHistRegistryQA(HistogramRegistry* myRegistry) + void setHistRegistryQA(o2::framework::HistogramRegistry* myRegistry) { mHistRegistryQA = myRegistry; LOGF(info, "QA histogram registry successfully set."); } - HistogramRegistry* GetHistRegistryQA() const { return mHistRegistryQA; } + o2::framework::HistogramRegistry* getHistRegistryQA() const { return mHistRegistryQA; } - void SetDebugLog(bool debug) + void setDebugLog(bool debug) { mDebugLog = debug; LOGF(info, "Debug level: %d", mDebugLog); } - bool GetDebugLog() const { return mDebugLog; } + bool getDebugLog() const { return mDebugLog; } - void SetObtainNUA(bool nua) + void setObtainNUA(bool nua) { mObtainNUA = nua; LOGF(info, "Obtain 3D Zvtx-eta-phi distribution: %d", mObtainNUA); } - bool GetObtainNUA() const { return mObtainNUA; } + bool getObtainNUA() const { return mObtainNUA; } - void SetSaveAllQA(bool saveQA) + void setSaveAllQA(bool saveQA) { mSaveAllQA = saveQA; LOGF(info, "Save the additional QA : %d.", mSaveAllQA); } - bool GetSaveAllQA() const { return mSaveAllQA; } + bool getSaveAllQA() const { return mSaveAllQA; } - void SetSaveQABefore(bool saveQA) + void setSaveQABefore(bool saveQA) { mSaveQABefore = saveQA; LOGF(info, "Save the QA before the selection : %d.", mSaveQABefore); } - bool GetSaveQABefore() const { return mSaveQABefore; } + bool getSaveQABefore() const { return mSaveQABefore; } - void SetUseVariablePtBins(bool myAxis) + void setUseVariablePtBins(bool myAxis) { mUseVariablePtBins = myAxis; LOGF(info, "Use variable pT binning: %d.", mUseVariablePtBins); } - bool GetUseVariablePtBins() const { return mUseVariablePtBins; } + bool getUseVariablePtBins() const { return mUseVariablePtBins; } /* Methods specific to this class. */ // The template functions are defined down here to prevent compilation errors. - void CreateHistQA(); - int GetCentBin(float cValue); + void createHistQA(); + int getCentBin(float cValue); /// \brief Fill the event QA histograms. /// \tparam T Type of collision. @@ -100,71 +97,72 @@ class FlowJHistManager /// \param cent Centrality percentile of the collision. /// \param multi Collision multiplicity at this step. template - void FillEventQA(T const& coll, int cBin, float cent, int multi) + void fillEventQA(T const& coll, int cBin, float cent, int multi) { if (!mHistRegistryQA) { LOGF(fatal, "QA histogram registry missing. Quitting..."); return; } - static constexpr std::string_view subDir[] = {"Before/", "After/"}; + static constexpr std::string_view SubDir[] = {"Before/", "After/"}; switch (cBin) { case 0: - mHistRegistryQA->fill(HIST(mCentClasses[0]) + HIST(subDir[mode]) + HIST("histCent"), cent); - mHistRegistryQA->fill(HIST(mCentClasses[0]) + HIST(subDir[mode]) + HIST("histMulti"), multi); - mHistRegistryQA->fill(HIST(mCentClasses[0]) + HIST(subDir[mode]) + HIST("histZvtx"), coll.posZ()); + mHistRegistryQA->fill(HIST(MCentClasses[0]) + HIST(SubDir[mode]) + HIST("histCent"), cent); + mHistRegistryQA->fill(HIST(MCentClasses[0]) + HIST(SubDir[mode]) + HIST("histMulti"), multi); + mHistRegistryQA->fill(HIST(MCentClasses[0]) + HIST(SubDir[mode]) + HIST("histZvtx"), coll.posZ()); break; case 1: - mHistRegistryQA->fill(HIST(mCentClasses[1]) + HIST(subDir[mode]) + HIST("histCent"), cent); - mHistRegistryQA->fill(HIST(mCentClasses[1]) + HIST(subDir[mode]) + HIST("histMulti"), multi); - mHistRegistryQA->fill(HIST(mCentClasses[1]) + HIST(subDir[mode]) + HIST("histZvtx"), coll.posZ()); + mHistRegistryQA->fill(HIST(MCentClasses[1]) + HIST(SubDir[mode]) + HIST("histCent"), cent); + mHistRegistryQA->fill(HIST(MCentClasses[1]) + HIST(SubDir[mode]) + HIST("histMulti"), multi); + mHistRegistryQA->fill(HIST(MCentClasses[1]) + HIST(SubDir[mode]) + HIST("histZvtx"), coll.posZ()); break; case 2: - mHistRegistryQA->fill(HIST(mCentClasses[2]) + HIST(subDir[mode]) + HIST("histCent"), cent); - mHistRegistryQA->fill(HIST(mCentClasses[2]) + HIST(subDir[mode]) + HIST("histMulti"), multi); - mHistRegistryQA->fill(HIST(mCentClasses[2]) + HIST(subDir[mode]) + HIST("histZvtx"), coll.posZ()); + mHistRegistryQA->fill(HIST(MCentClasses[2]) + HIST(SubDir[mode]) + HIST("histCent"), cent); + mHistRegistryQA->fill(HIST(MCentClasses[2]) + HIST(SubDir[mode]) + HIST("histMulti"), multi); + mHistRegistryQA->fill(HIST(MCentClasses[2]) + HIST(SubDir[mode]) + HIST("histZvtx"), coll.posZ()); break; case 3: - mHistRegistryQA->fill(HIST(mCentClasses[3]) + HIST(subDir[mode]) + HIST("histCent"), cent); - mHistRegistryQA->fill(HIST(mCentClasses[3]) + HIST(subDir[mode]) + HIST("histMulti"), multi); - mHistRegistryQA->fill(HIST(mCentClasses[3]) + HIST(subDir[mode]) + HIST("histZvtx"), coll.posZ()); + mHistRegistryQA->fill(HIST(MCentClasses[3]) + HIST(SubDir[mode]) + HIST("histCent"), cent); + mHistRegistryQA->fill(HIST(MCentClasses[3]) + HIST(SubDir[mode]) + HIST("histMulti"), multi); + mHistRegistryQA->fill(HIST(MCentClasses[3]) + HIST(SubDir[mode]) + HIST("histZvtx"), coll.posZ()); break; case 4: - mHistRegistryQA->fill(HIST(mCentClasses[4]) + HIST(subDir[mode]) + HIST("histCent"), cent); - mHistRegistryQA->fill(HIST(mCentClasses[4]) + HIST(subDir[mode]) + HIST("histMulti"), multi); - mHistRegistryQA->fill(HIST(mCentClasses[4]) + HIST(subDir[mode]) + HIST("histZvtx"), coll.posZ()); + mHistRegistryQA->fill(HIST(MCentClasses[4]) + HIST(SubDir[mode]) + HIST("histCent"), cent); + mHistRegistryQA->fill(HIST(MCentClasses[4]) + HIST(SubDir[mode]) + HIST("histMulti"), multi); + mHistRegistryQA->fill(HIST(MCentClasses[4]) + HIST(SubDir[mode]) + HIST("histZvtx"), coll.posZ()); break; case 5: - mHistRegistryQA->fill(HIST(mCentClasses[5]) + HIST(subDir[mode]) + HIST("histCent"), cent); - mHistRegistryQA->fill(HIST(mCentClasses[5]) + HIST(subDir[mode]) + HIST("histMulti"), multi); - mHistRegistryQA->fill(HIST(mCentClasses[5]) + HIST(subDir[mode]) + HIST("histZvtx"), coll.posZ()); + mHistRegistryQA->fill(HIST(MCentClasses[5]) + HIST(SubDir[mode]) + HIST("histCent"), cent); + mHistRegistryQA->fill(HIST(MCentClasses[5]) + HIST(SubDir[mode]) + HIST("histMulti"), multi); + mHistRegistryQA->fill(HIST(MCentClasses[5]) + HIST(SubDir[mode]) + HIST("histZvtx"), coll.posZ()); break; case 6: - mHistRegistryQA->fill(HIST(mCentClasses[6]) + HIST(subDir[mode]) + HIST("histCent"), cent); - mHistRegistryQA->fill(HIST(mCentClasses[6]) + HIST(subDir[mode]) + HIST("histMulti"), multi); - mHistRegistryQA->fill(HIST(mCentClasses[6]) + HIST(subDir[mode]) + HIST("histZvtx"), coll.posZ()); + mHistRegistryQA->fill(HIST(MCentClasses[6]) + HIST(SubDir[mode]) + HIST("histCent"), cent); + mHistRegistryQA->fill(HIST(MCentClasses[6]) + HIST(SubDir[mode]) + HIST("histMulti"), multi); + mHistRegistryQA->fill(HIST(MCentClasses[6]) + HIST(SubDir[mode]) + HIST("histZvtx"), coll.posZ()); break; case 7: - mHistRegistryQA->fill(HIST(mCentClasses[7]) + HIST(subDir[mode]) + HIST("histCent"), cent); - mHistRegistryQA->fill(HIST(mCentClasses[7]) + HIST(subDir[mode]) + HIST("histMulti"), multi); - mHistRegistryQA->fill(HIST(mCentClasses[7]) + HIST(subDir[mode]) + HIST("histZvtx"), coll.posZ()); + mHistRegistryQA->fill(HIST(MCentClasses[7]) + HIST(SubDir[mode]) + HIST("histCent"), cent); + mHistRegistryQA->fill(HIST(MCentClasses[7]) + HIST(SubDir[mode]) + HIST("histMulti"), multi); + mHistRegistryQA->fill(HIST(MCentClasses[7]) + HIST(SubDir[mode]) + HIST("histZvtx"), coll.posZ()); break; case 8: - mHistRegistryQA->fill(HIST(mCentClasses[8]) + HIST(subDir[mode]) + HIST("histCent"), cent); - mHistRegistryQA->fill(HIST(mCentClasses[8]) + HIST(subDir[mode]) + HIST("histMulti"), multi); - mHistRegistryQA->fill(HIST(mCentClasses[8]) + HIST(subDir[mode]) + HIST("histZvtx"), coll.posZ()); + mHistRegistryQA->fill(HIST(MCentClasses[8]) + HIST(SubDir[mode]) + HIST("histCent"), cent); + mHistRegistryQA->fill(HIST(MCentClasses[8]) + HIST(SubDir[mode]) + HIST("histMulti"), multi); + mHistRegistryQA->fill(HIST(MCentClasses[8]) + HIST(SubDir[mode]) + HIST("histZvtx"), coll.posZ()); break; case 9: - mHistRegistryQA->fill(HIST(mCentClasses[9]) + HIST(subDir[mode]) + HIST("histCent"), cent); - mHistRegistryQA->fill(HIST(mCentClasses[9]) + HIST(subDir[mode]) + HIST("histMulti"), multi); - mHistRegistryQA->fill(HIST(mCentClasses[9]) + HIST(subDir[mode]) + HIST("histZvtx"), coll.posZ()); + mHistRegistryQA->fill(HIST(MCentClasses[9]) + HIST(SubDir[mode]) + HIST("histCent"), cent); + mHistRegistryQA->fill(HIST(MCentClasses[9]) + HIST(SubDir[mode]) + HIST("histMulti"), multi); + mHistRegistryQA->fill(HIST(MCentClasses[9]) + HIST(SubDir[mode]) + HIST("histZvtx"), coll.posZ()); break; } - LOGF(info, "The EventQA has been filled."); + if (mDebugLog) + LOGF(info, "The EventQA has been filled."); } - /// \brief Hardcode the cBin for FillThisTrackQA if not constant. + /// \brief Hardcode the cBin for fillThisTrackQA if not constant. /// \tparam T Type of track. /// \tparam mode Set if we fill Before/ or After/ objects. /// \param track Track entry. @@ -172,7 +170,7 @@ class FlowJHistManager /// \param weightNUE Value of the NUE weight to apply to pT. /// \param weightNUA Value of the NUA weight to apply to phi. template - void FillTrackQA(T const& track, int cBin, + void fillTrackQA(T const& track, int cBin, float weightNUE = 1., float weightNUA = 1., float zVtx = 0.) { if (!mHistRegistryQA) { @@ -182,34 +180,34 @@ class FlowJHistManager switch (cBin) { case 0: - FillThisTrackQA<0, mode>(track, zVtx, weightNUE, weightNUA); + fillThisTrackQA<0, mode>(track, zVtx, weightNUE, weightNUA); break; case 1: - FillThisTrackQA<1, mode>(track, zVtx, weightNUE, weightNUA); + fillThisTrackQA<1, mode>(track, zVtx, weightNUE, weightNUA); break; case 2: - FillThisTrackQA<2, mode>(track, zVtx, weightNUE, weightNUA); + fillThisTrackQA<2, mode>(track, zVtx, weightNUE, weightNUA); break; case 3: - FillThisTrackQA<3, mode>(track, zVtx, weightNUE, weightNUA); + fillThisTrackQA<3, mode>(track, zVtx, weightNUE, weightNUA); break; case 4: - FillThisTrackQA<4, mode>(track, zVtx, weightNUE, weightNUA); + fillThisTrackQA<4, mode>(track, zVtx, weightNUE, weightNUA); break; case 5: - FillThisTrackQA<5, mode>(track, zVtx, weightNUE, weightNUA); + fillThisTrackQA<5, mode>(track, zVtx, weightNUE, weightNUA); break; case 6: - FillThisTrackQA<6, mode>(track, zVtx, weightNUE, weightNUA); + fillThisTrackQA<6, mode>(track, zVtx, weightNUE, weightNUA); break; case 7: - FillThisTrackQA<7, mode>(track, zVtx, weightNUE, weightNUA); + fillThisTrackQA<7, mode>(track, zVtx, weightNUE, weightNUA); break; case 8: - FillThisTrackQA<8, mode>(track, zVtx, weightNUE, weightNUA); + fillThisTrackQA<8, mode>(track, zVtx, weightNUE, weightNUA); break; case 9: - FillThisTrackQA<9, mode>(track, zVtx, weightNUE, weightNUA); + fillThisTrackQA<9, mode>(track, zVtx, weightNUE, weightNUA); break; } @@ -229,61 +227,61 @@ class FlowJHistManager /// \note This method can be directly used if no switch is previously needed. // TODO: Add filling of the weight histograms. template - void FillThisTrackQA(T const& track, float zVtx = 0., + void fillThisTrackQA(T const& track, float zVtx = 0., float weightNUE = 1., float weightNUA = 1.) { - static constexpr std::string_view subDir[] = {"Before/", "After/"}; + static constexpr std::string_view SubDir[] = {"Before/", "After/"}; - mHistRegistryQA->fill(HIST(mCentClasses[cBin]) + HIST(subDir[mode]) + HIST("histPt"), track.pt()); - mHistRegistryQA->fill(HIST(mCentClasses[cBin]) + HIST(subDir[mode]) + HIST("histEta"), track.eta()); - mHistRegistryQA->fill(HIST(mCentClasses[cBin]) + HIST(subDir[mode]) + HIST("histPhi"), track.phi()); - mHistRegistryQA->fill(HIST(mCentClasses[cBin]) + HIST(subDir[mode]) + HIST("histCharge"), track.sign()); + mHistRegistryQA->fill(HIST(MCentClasses[cBin]) + HIST(SubDir[mode]) + HIST("histPt"), track.pt()); + mHistRegistryQA->fill(HIST(MCentClasses[cBin]) + HIST(SubDir[mode]) + HIST("histEta"), track.eta()); + mHistRegistryQA->fill(HIST(MCentClasses[cBin]) + HIST(SubDir[mode]) + HIST("histPhi"), track.phi()); + mHistRegistryQA->fill(HIST(MCentClasses[cBin]) + HIST(SubDir[mode]) + HIST("histCharge"), track.sign()); if (mode == 1) { // 'Weight' distributions are defined only for After/. - mHistRegistryQA->fill(HIST(mCentClasses[cBin]) + HIST("After/histPtCorrected"), + mHistRegistryQA->fill(HIST(MCentClasses[cBin]) + HIST("After/histPtCorrected"), track.pt(), 1. / weightNUE); - mHistRegistryQA->fill(HIST(mCentClasses[cBin]) + HIST("After/histPhiCorrected"), + mHistRegistryQA->fill(HIST(MCentClasses[cBin]) + HIST("After/histPhiCorrected"), track.phi(), 1. / weightNUA); - mHistRegistryQA->fill(HIST(mCentClasses[cBin]) + HIST("After/histNUEWeights"), + mHistRegistryQA->fill(HIST(MCentClasses[cBin]) + HIST("After/histNUEWeights"), track.pt(), weightNUE); - mHistRegistryQA->fill(HIST(mCentClasses[cBin]) + HIST("After/histNUAWeights"), + mHistRegistryQA->fill(HIST(MCentClasses[cBin]) + HIST("After/histNUAWeights"), track.phi(), weightNUA); // 3D distribution Zvtx-eta-phi. if (mObtainNUA) { - mHistRegistryQA->fill(HIST(mCentClasses[cBin]) + HIST("After/histZvtxEtaPhi"), + mHistRegistryQA->fill(HIST(MCentClasses[cBin]) + HIST("After/histZvtxEtaPhi"), zVtx, track.eta(), track.phi()); } } if (mSaveAllQA) { // TPC information. - mHistRegistryQA->fill(HIST(mCentClasses[cBin]) + HIST(subDir[mode]) + HIST("histTPCNClsFound"), + mHistRegistryQA->fill(HIST(MCentClasses[cBin]) + HIST(SubDir[mode]) + HIST("histTPCNClsFound"), track.tpcNClsFound()); - mHistRegistryQA->fill(HIST(mCentClasses[cBin]) + HIST(subDir[mode]) + HIST("histTPCNClsCrossedRows"), + mHistRegistryQA->fill(HIST(MCentClasses[cBin]) + HIST(SubDir[mode]) + HIST("histTPCNClsCrossedRows"), track.tpcNClsCrossedRows()); - mHistRegistryQA->fill(HIST(mCentClasses[cBin]) + HIST(subDir[mode]) + HIST("histTPCCrossedRowsOverFindableCls"), + mHistRegistryQA->fill(HIST(MCentClasses[cBin]) + HIST(SubDir[mode]) + HIST("histTPCCrossedRowsOverFindableCls"), track.tpcCrossedRowsOverFindableCls()); - mHistRegistryQA->fill(HIST(mCentClasses[cBin]) + HIST(subDir[mode]) + HIST("histTPCFoundOverFindableCls"), + mHistRegistryQA->fill(HIST(MCentClasses[cBin]) + HIST(SubDir[mode]) + HIST("histTPCFoundOverFindableCls"), track.tpcFoundOverFindableCls()); - mHistRegistryQA->fill(HIST(mCentClasses[cBin]) + HIST(subDir[mode]) + HIST("histTPCFractionSharedCls"), + mHistRegistryQA->fill(HIST(MCentClasses[cBin]) + HIST(SubDir[mode]) + HIST("histTPCFractionSharedCls"), track.tpcFractionSharedCls()); - mHistRegistryQA->fill(HIST(mCentClasses[cBin]) + HIST(subDir[mode]) + HIST("histTPCChi2NCl"), + mHistRegistryQA->fill(HIST(MCentClasses[cBin]) + HIST(SubDir[mode]) + HIST("histTPCChi2NCl"), track.tpcChi2NCl()); // ITS information. - mHistRegistryQA->fill(HIST(mCentClasses[cBin]) + HIST(subDir[mode]) + HIST("histITSNCls"), + mHistRegistryQA->fill(HIST(MCentClasses[cBin]) + HIST(SubDir[mode]) + HIST("histITSNCls"), track.itsNCls()); - mHistRegistryQA->fill(HIST(mCentClasses[cBin]) + HIST(subDir[mode]) + HIST("histITSNClsInnerBarrel"), + mHistRegistryQA->fill(HIST(MCentClasses[cBin]) + HIST(SubDir[mode]) + HIST("histITSNClsInnerBarrel"), track.itsNClsInnerBarrel()); - mHistRegistryQA->fill(HIST(mCentClasses[cBin]) + HIST(subDir[mode]) + HIST("histITSChi2NCl"), + mHistRegistryQA->fill(HIST(MCentClasses[cBin]) + HIST(SubDir[mode]) + HIST("histITSChi2NCl"), track.itsChi2NCl()); // DCA information. - mHistRegistryQA->fill(HIST(mCentClasses[cBin]) + HIST(subDir[mode]) + HIST("histDCAxy"), + mHistRegistryQA->fill(HIST(MCentClasses[cBin]) + HIST(SubDir[mode]) + HIST("histDCAxy"), track.pt(), track.dcaXY()); - mHistRegistryQA->fill(HIST(mCentClasses[cBin]) + HIST(subDir[mode]) + HIST("histDCAz"), + mHistRegistryQA->fill(HIST(MCentClasses[cBin]) + HIST(SubDir[mode]) + HIST("histDCAz"), track.dcaZ()); } @@ -293,7 +291,7 @@ class FlowJHistManager } private: - HistogramRegistry* mHistRegistryQA = nullptr; ///< For the QA output. + o2::framework::HistogramRegistry* mHistRegistryQA = nullptr; ///< For the QA output. bool mDebugLog = false; ///< Enable to print additional log for debug. bool mObtainNUA = false; ///< Enable to get the 3D Zvtx-eta-phi distribution for NUA. @@ -302,7 +300,7 @@ class FlowJHistManager bool mUseVariablePtBins = false; ///< Enable the use of a variable width pT binning. static const int mNcentBins = 10; ///< Number of centrality classes. - static constexpr std::string_view mCentClasses[] = { ///< Centrality classes. + static constexpr std::string_view MCentClasses[] = { ///< Centrality classes. "Centrality_00-01/", "Centrality_01-02/", "Centrality_02-05/", "Centrality_05-10/", "Centrality_10-20/", "Centrality_20-30/", "Centrality_30-40/", "Centrality_40-50/", "Centrality_50-60/", diff --git a/PWGCF/JCorran/Core/FlowJSPCAnalysis.cxx b/PWGCF/JCorran/Core/FlowJSPCAnalysis.cxx index b1221432aa4..2a071f90717 100644 --- a/PWGCF/JCorran/Core/FlowJSPCAnalysis.cxx +++ b/PWGCF/JCorran/Core/FlowJSPCAnalysis.cxx @@ -21,7 +21,7 @@ using namespace o2; using namespace o2::framework; using namespace std; -TComplex FlowJSPCAnalysis::Q(const Int_t harmN, const Int_t p) +TComplex FlowJSPCAnalysis::q(const int harmN, const int p) { if (harmN >= 0) return qvecs->QvectorQC[harmN][p]; @@ -34,24 +34,24 @@ TComplex FlowJSPCAnalysis::Q(const Int_t harmN, const Int_t p) /// \return Complex value of the multiparticle correlator. /// \note Improved faster version) originally developed by Kristjan Gulbrandsen /// (gulbrand@nbi.dk). -TComplex FlowJSPCAnalysis::Recursion(int n, int* harmonic, int mult = 1, int skip = 0) +TComplex FlowJSPCAnalysis::recursion(int n, int* harmonic, int mult = 1, int skip = 0) { - Int_t nm1 = n - 1; - TComplex c(Q(harmonic[nm1], mult)); + int nm1 = n - 1; + TComplex c(q(harmonic[nm1], mult)); if (nm1 == 0) return c; - c *= Recursion(nm1, harmonic); + c *= recursion(nm1, harmonic); if (nm1 == skip) return c; - Int_t multp1 = mult + 1; - Int_t nm2 = n - 2; - Int_t counter1 = 0; - Int_t hhold = harmonic[counter1]; + int multp1 = mult + 1; + int nm2 = n - 2; + int counter1 = 0; + int hhold = harmonic[counter1]; harmonic[counter1] = harmonic[nm2]; harmonic[nm2] = hhold + harmonic[nm1]; - TComplex c2(Recursion(nm1, harmonic, multp1, nm2)); - Int_t counter2 = n - 3; + TComplex c2(recursion(nm1, harmonic, multp1, nm2)); + int counter2 = n - 3; while (counter2 >= skip) { harmonic[nm2] = harmonic[counter1]; @@ -60,7 +60,7 @@ TComplex FlowJSPCAnalysis::Recursion(int n, int* harmonic, int mult = 1, int ski hhold = harmonic[counter1]; harmonic[counter1] = harmonic[nm2]; harmonic[nm2] = hhold + harmonic[nm1]; - c2 += Recursion(nm1, harmonic, multp1, counter2); + c2 += recursion(nm1, harmonic, multp1, counter2); --counter2; } harmonic[nm2] = harmonic[counter1]; @@ -68,298 +68,338 @@ TComplex FlowJSPCAnalysis::Recursion(int n, int* harmonic, int mult = 1, int ski if (mult == 1) return c - c2; - return c - Double_t(mult) * c2; + return c - static_cast(mult) * c2; } // End of recursion -void FlowJSPCAnalysis::CalculateCorrelators(const Int_t fCentBin) +void FlowJSPCAnalysis::calculateCorrelators(const int fCentBin) { // Loop over the combinations of harmonics and calculate the corresponding SPC num and den. // Declare the arrays to later fill all the needed bins for the correlators // and the error terms. - Double_t* dataCorrelation = new Double_t[3]; // cosine, weight, sine. - Double_t correlationNum; - Double_t weightCorrelationNum; - Double_t correlationDenom; - Double_t weightCorrelationDenom; + double* dataCorrelation = new double[3]; // cosine, weight, sine. + double correlationNum; + double weightCorrelationNum; + double correlationDenom; + double weightCorrelationDenom; - for (Int_t j = 0; j < 12; j++) { + for (int j = 0; j < 12; j++) { if (fHarmosArray[j][0] == 0) { continue; } // Skip null correlator list. // Calculate the numerator. - Int_t hArrayNum[7] = {0}; + int hArrayNum[7] = {0}; for (int iH = 0; iH < 7; iH++) { hArrayNum[iH] = fHarmosArray[j][iH + 1]; } - Correlation(fHarmosArray[j][0], 7, hArrayNum, dataCorrelation); + correlation(fHarmosArray[j][0], 7, hArrayNum, dataCorrelation); correlationNum = dataCorrelation[0]; weightCorrelationNum = dataCorrelation[1]; // Calculate the denominator. - Int_t nPartDen = 2 * fHarmosArray[j][0]; - Int_t hArrayDen[14] = {0}; + int nPartDen = 2 * fHarmosArray[j][0]; + int hArrayDen[14] = {0}; for (int iH = 0; iH < 7; iH++) { hArrayDen[2 * iH] = hArrayNum[iH]; hArrayDen[2 * iH + 1] = -1 * hArrayNum[iH]; } - Correlation(nPartDen, 14, hArrayDen, dataCorrelation); + correlation(nPartDen, 14, hArrayDen, dataCorrelation); correlationDenom = dataCorrelation[0]; weightCorrelationDenom = dataCorrelation[1]; // Histogram filling - FillHistograms(fCentBin, j, correlationNum, correlationDenom, weightCorrelationNum, weightCorrelationDenom); + fillHistograms(fCentBin, j, correlationNum, correlationDenom, weightCorrelationNum, weightCorrelationDenom); - correlationNum = 0; - weightCorrelationNum = 0; - correlationDenom = 0; - weightCorrelationDenom = 0; + correlationNum = 0.; + weightCorrelationNum = 0.; + correlationDenom = 0.; + weightCorrelationDenom = 0.; } } -void FlowJSPCAnalysis::FillHistograms(const Int_t fCentBin, Int_t ind, Double_t cNum, Double_t cDenom, Double_t wNum, Double_t wDenom) +void FlowJSPCAnalysis::fillHistograms(const int fCentBin, int ind, double cNum, double cDenom, double wNum, double wDenom) { switch (fCentBin) { case 0: { - mHistRegistry->fill(HIST(mCentClasses[0]) + HIST("fResults"), 2. * (Float_t)(ind) + 0.5, cNum, wNum); - mHistRegistry->fill(HIST(mCentClasses[0]) + HIST("fResults"), 2. * (Float_t)(ind) + 1.5, cDenom, wDenom); - mHistRegistry->fill(HIST(mCentClasses[0]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 0.5, cNum * cDenom, wNum * wDenom); - mHistRegistry->fill(HIST(mCentClasses[0]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 1.5, wNum * wDenom, 1.); - mHistRegistry->fill(HIST(mCentClasses[0]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 2.5, wNum, 1.); - mHistRegistry->fill(HIST(mCentClasses[0]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 3.5, wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[0]) + HIST("fResults"), 2. * static_cast(ind) + 0.5, cNum, wNum); + mHistRegistry->fill(HIST(MCentClasses[0]) + HIST("fResults"), 2. * static_cast(ind) + 1.5, cDenom, wDenom); + mHistRegistry->fill(HIST(MCentClasses[0]) + HIST("fCovResults"), 2. * static_cast(ind) + 0.5, cNum * cDenom, wNum * wDenom); + mHistRegistry->fill(HIST(MCentClasses[0]) + HIST("fCovResults"), 2. * static_cast(ind) + 1.5, wNum * wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[0]) + HIST("fCovResults"), 2. * static_cast(ind) + 2.5, wNum, 1.); + mHistRegistry->fill(HIST(MCentClasses[0]) + HIST("fCovResults"), 2. * static_cast(ind) + 3.5, wDenom, 1.); } break; case 1: { - mHistRegistry->fill(HIST(mCentClasses[1]) + HIST("fResults"), 2. * (Float_t)(ind) + 0.5, cNum, wNum); - mHistRegistry->fill(HIST(mCentClasses[1]) + HIST("fResults"), 2. * (Float_t)(ind) + 1.5, cDenom, wDenom); - mHistRegistry->fill(HIST(mCentClasses[1]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 0.5, cNum * cDenom, wNum * wDenom); - mHistRegistry->fill(HIST(mCentClasses[1]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 1.5, wNum * wDenom, 1.); - mHistRegistry->fill(HIST(mCentClasses[1]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 2.5, wNum, 1.); - mHistRegistry->fill(HIST(mCentClasses[1]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 3.5, wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[1]) + HIST("fResults"), 2. * static_cast(ind) + 0.5, cNum, wNum); + mHistRegistry->fill(HIST(MCentClasses[1]) + HIST("fResults"), 2. * static_cast(ind) + 1.5, cDenom, wDenom); + mHistRegistry->fill(HIST(MCentClasses[1]) + HIST("fCovResults"), 2. * static_cast(ind) + 0.5, cNum * cDenom, wNum * wDenom); + mHistRegistry->fill(HIST(MCentClasses[1]) + HIST("fCovResults"), 2. * static_cast(ind) + 1.5, wNum * wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[1]) + HIST("fCovResults"), 2. * static_cast(ind) + 2.5, wNum, 1.); + mHistRegistry->fill(HIST(MCentClasses[1]) + HIST("fCovResults"), 2. * static_cast(ind) + 3.5, wDenom, 1.); } break; case 2: { - mHistRegistry->fill(HIST(mCentClasses[2]) + HIST("fResults"), 2. * (Float_t)(ind) + 0.5, cNum, wNum); - mHistRegistry->fill(HIST(mCentClasses[2]) + HIST("fResults"), 2. * (Float_t)(ind) + 1.5, cDenom, wDenom); - mHistRegistry->fill(HIST(mCentClasses[2]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 0.5, cNum * cDenom, wNum * wDenom); - mHistRegistry->fill(HIST(mCentClasses[2]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 1.5, wNum * wDenom, 1.); - mHistRegistry->fill(HIST(mCentClasses[2]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 2.5, wNum, 1.); - mHistRegistry->fill(HIST(mCentClasses[2]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 3.5, wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[2]) + HIST("fResults"), 2. * static_cast(ind) + 0.5, cNum, wNum); + mHistRegistry->fill(HIST(MCentClasses[2]) + HIST("fResults"), 2. * static_cast(ind) + 1.5, cDenom, wDenom); + mHistRegistry->fill(HIST(MCentClasses[2]) + HIST("fCovResults"), 2. * static_cast(ind) + 0.5, cNum * cDenom, wNum * wDenom); + mHistRegistry->fill(HIST(MCentClasses[2]) + HIST("fCovResults"), 2. * static_cast(ind) + 1.5, wNum * wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[2]) + HIST("fCovResults"), 2. * static_cast(ind) + 2.5, wNum, 1.); + mHistRegistry->fill(HIST(MCentClasses[2]) + HIST("fCovResults"), 2. * static_cast(ind) + 3.5, wDenom, 1.); } break; case 3: { - mHistRegistry->fill(HIST(mCentClasses[3]) + HIST("fResults"), 2. * (Float_t)(ind) + 0.5, cNum, wNum); - mHistRegistry->fill(HIST(mCentClasses[3]) + HIST("fResults"), 2. * (Float_t)(ind) + 1.5, cDenom, wDenom); - mHistRegistry->fill(HIST(mCentClasses[3]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 0.5, cNum * cDenom, wNum * wDenom); - mHistRegistry->fill(HIST(mCentClasses[3]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 1.5, wNum * wDenom, 1.); - mHistRegistry->fill(HIST(mCentClasses[3]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 2.5, wNum, 1.); - mHistRegistry->fill(HIST(mCentClasses[3]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 3.5, wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[3]) + HIST("fResults"), 2. * static_cast(ind) + 0.5, cNum, wNum); + mHistRegistry->fill(HIST(MCentClasses[3]) + HIST("fResults"), 2. * static_cast(ind) + 1.5, cDenom, wDenom); + mHistRegistry->fill(HIST(MCentClasses[3]) + HIST("fCovResults"), 2. * static_cast(ind) + 0.5, cNum * cDenom, wNum * wDenom); + mHistRegistry->fill(HIST(MCentClasses[3]) + HIST("fCovResults"), 2. * static_cast(ind) + 1.5, wNum * wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[3]) + HIST("fCovResults"), 2. * static_cast(ind) + 2.5, wNum, 1.); + mHistRegistry->fill(HIST(MCentClasses[3]) + HIST("fCovResults"), 2. * static_cast(ind) + 3.5, wDenom, 1.); } break; case 4: { - mHistRegistry->fill(HIST(mCentClasses[4]) + HIST("fResults"), 2. * (Float_t)(ind) + 0.5, cNum, wNum); - mHistRegistry->fill(HIST(mCentClasses[4]) + HIST("fResults"), 2. * (Float_t)(ind) + 1.5, cDenom, wDenom); - mHistRegistry->fill(HIST(mCentClasses[4]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 0.5, cNum * cDenom, wNum * wDenom); - mHistRegistry->fill(HIST(mCentClasses[4]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 1.5, wNum * wDenom, 1.); - mHistRegistry->fill(HIST(mCentClasses[4]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 2.5, wNum, 1.); - mHistRegistry->fill(HIST(mCentClasses[4]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 3.5, wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[4]) + HIST("fResults"), 2. * static_cast(ind) + 0.5, cNum, wNum); + mHistRegistry->fill(HIST(MCentClasses[4]) + HIST("fResults"), 2. * static_cast(ind) + 1.5, cDenom, wDenom); + mHistRegistry->fill(HIST(MCentClasses[4]) + HIST("fCovResults"), 2. * static_cast(ind) + 0.5, cNum * cDenom, wNum * wDenom); + mHistRegistry->fill(HIST(MCentClasses[4]) + HIST("fCovResults"), 2. * static_cast(ind) + 1.5, wNum * wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[4]) + HIST("fCovResults"), 2. * static_cast(ind) + 2.5, wNum, 1.); + mHistRegistry->fill(HIST(MCentClasses[4]) + HIST("fCovResults"), 2. * static_cast(ind) + 3.5, wDenom, 1.); } break; case 5: { - mHistRegistry->fill(HIST(mCentClasses[5]) + HIST("fResults"), 2. * (Float_t)(ind) + 0.5, cNum, wNum); - mHistRegistry->fill(HIST(mCentClasses[5]) + HIST("fResults"), 2. * (Float_t)(ind) + 1.5, cDenom, wDenom); - mHistRegistry->fill(HIST(mCentClasses[5]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 0.5, cNum * cDenom, wNum * wDenom); - mHistRegistry->fill(HIST(mCentClasses[5]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 1.5, wNum * wDenom, 1.); - mHistRegistry->fill(HIST(mCentClasses[5]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 2.5, wNum, 1.); - mHistRegistry->fill(HIST(mCentClasses[5]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 3.5, wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[5]) + HIST("fResults"), 2. * static_cast(ind) + 0.5, cNum, wNum); + mHistRegistry->fill(HIST(MCentClasses[5]) + HIST("fResults"), 2. * static_cast(ind) + 1.5, cDenom, wDenom); + mHistRegistry->fill(HIST(MCentClasses[5]) + HIST("fCovResults"), 2. * static_cast(ind) + 0.5, cNum * cDenom, wNum * wDenom); + mHistRegistry->fill(HIST(MCentClasses[5]) + HIST("fCovResults"), 2. * static_cast(ind) + 1.5, wNum * wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[5]) + HIST("fCovResults"), 2. * static_cast(ind) + 2.5, wNum, 1.); + mHistRegistry->fill(HIST(MCentClasses[5]) + HIST("fCovResults"), 2. * static_cast(ind) + 3.5, wDenom, 1.); } break; case 6: { - mHistRegistry->fill(HIST(mCentClasses[6]) + HIST("fResults"), 2. * (Float_t)(ind) + 0.5, cNum, wNum); - mHistRegistry->fill(HIST(mCentClasses[6]) + HIST("fResults"), 2. * (Float_t)(ind) + 1.5, cDenom, wDenom); - mHistRegistry->fill(HIST(mCentClasses[6]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 0.5, cNum * cDenom, wNum * wDenom); - mHistRegistry->fill(HIST(mCentClasses[6]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 1.5, wNum * wDenom, 1.); - mHistRegistry->fill(HIST(mCentClasses[6]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 2.5, wNum, 1.); - mHistRegistry->fill(HIST(mCentClasses[6]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 3.5, wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[6]) + HIST("fResults"), 2. * static_cast(ind) + 0.5, cNum, wNum); + mHistRegistry->fill(HIST(MCentClasses[6]) + HIST("fResults"), 2. * static_cast(ind) + 1.5, cDenom, wDenom); + mHistRegistry->fill(HIST(MCentClasses[6]) + HIST("fCovResults"), 2. * static_cast(ind) + 0.5, cNum * cDenom, wNum * wDenom); + mHistRegistry->fill(HIST(MCentClasses[6]) + HIST("fCovResults"), 2. * static_cast(ind) + 1.5, wNum * wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[6]) + HIST("fCovResults"), 2. * static_cast(ind) + 2.5, wNum, 1.); + mHistRegistry->fill(HIST(MCentClasses[6]) + HIST("fCovResults"), 2. * static_cast(ind) + 3.5, wDenom, 1.); } break; case 7: { - mHistRegistry->fill(HIST(mCentClasses[7]) + HIST("fResults"), 2. * (Float_t)(ind) + 0.5, cNum, wNum); - mHistRegistry->fill(HIST(mCentClasses[7]) + HIST("fResults"), 2. * (Float_t)(ind) + 1.5, cDenom, wDenom); - mHistRegistry->fill(HIST(mCentClasses[7]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 0.5, cNum * cDenom, wNum * wDenom); - mHistRegistry->fill(HIST(mCentClasses[7]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 1.5, wNum * wDenom, 1.); - mHistRegistry->fill(HIST(mCentClasses[7]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 2.5, wNum, 1.); - mHistRegistry->fill(HIST(mCentClasses[7]) + HIST("fCovResults"), 2. * (Float_t)(ind) + 3.5, wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[7]) + HIST("fResults"), 2. * static_cast(ind) + 0.5, cNum, wNum); + mHistRegistry->fill(HIST(MCentClasses[7]) + HIST("fResults"), 2. * static_cast(ind) + 1.5, cDenom, wDenom); + mHistRegistry->fill(HIST(MCentClasses[7]) + HIST("fCovResults"), 2. * static_cast(ind) + 0.5, cNum * cDenom, wNum * wDenom); + mHistRegistry->fill(HIST(MCentClasses[7]) + HIST("fCovResults"), 2. * static_cast(ind) + 1.5, wNum * wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[7]) + HIST("fCovResults"), 2. * static_cast(ind) + 2.5, wNum, 1.); + mHistRegistry->fill(HIST(MCentClasses[7]) + HIST("fCovResults"), 2. * static_cast(ind) + 3.5, wDenom, 1.); } break; default: return; } } -void FlowJSPCAnalysis::Correlation(Int_t c_nPart, Int_t c_nHarmo, Int_t* harmo, Double_t* correlData) +void FlowJSPCAnalysis::fillQAHistograms(const int fCentBin, double phi, double phiWeight) +{ + switch (fCentBin) { + case 0: { + mHistRegistry->fill(HIST(MCentClasses[0]) + HIST("phiBefore"), phi); + mHistRegistry->fill(HIST(MCentClasses[0]) + HIST("phiAfter"), phi, phiWeight); + } break; + case 1: { + mHistRegistry->fill(HIST(MCentClasses[1]) + HIST("phiBefore"), phi); + mHistRegistry->fill(HIST(MCentClasses[1]) + HIST("phiAfter"), phi, phiWeight); + } break; + case 2: { + mHistRegistry->fill(HIST(MCentClasses[2]) + HIST("phiBefore"), phi); + mHistRegistry->fill(HIST(MCentClasses[2]) + HIST("phiAfter"), phi, phiWeight); + } break; + case 3: { + mHistRegistry->fill(HIST(MCentClasses[3]) + HIST("phiBefore"), phi); + mHistRegistry->fill(HIST(MCentClasses[3]) + HIST("phiAfter"), phi, phiWeight); + } break; + case 4: { + mHistRegistry->fill(HIST(MCentClasses[4]) + HIST("phiBefore"), phi); + mHistRegistry->fill(HIST(MCentClasses[4]) + HIST("phiAfter"), phi, phiWeight); + } break; + case 5: { + mHistRegistry->fill(HIST(MCentClasses[5]) + HIST("phiBefore"), phi); + mHistRegistry->fill(HIST(MCentClasses[5]) + HIST("phiAfter"), phi, phiWeight); + } break; + case 6: { + mHistRegistry->fill(HIST(MCentClasses[6]) + HIST("phiBefore"), phi); + mHistRegistry->fill(HIST(MCentClasses[6]) + HIST("phiAfter"), phi, phiWeight); + } break; + case 7: { + mHistRegistry->fill(HIST(MCentClasses[7]) + HIST("phiBefore"), phi); + mHistRegistry->fill(HIST(MCentClasses[7]) + HIST("phiAfter"), phi, phiWeight); + } break; + default: + return; + } +} + +void FlowJSPCAnalysis::correlation(int c_nPart, int c_nHarmo, int* harmo, double* correlData) { // Calculate the correlators for the provided set of harmonics using Q-vectors. // Protection against anisotropic correlators. - Int_t sumHarmo = 0; - for (Int_t i = 0; i < c_nHarmo; i++) { + int sumHarmo = 0; + for (int i = 0; i < c_nHarmo; i++) { sumHarmo += harmo[i]; } if (sumHarmo != 0) { - printf("\nOups, this correlator is not isotropic(sum = %d). Bye\n", sumHarmo); + LOGF(error, "\nOups, this correlator is not isotropic(sum = %d). Bye\n", sumHarmo); return; } switch (c_nPart) { case 2: { - Int_t harmonicsTwoNum[2] = {harmo[0], harmo[1]}; - Int_t harmonicsTwoDen[2] = {0, 0}; + int harmonicsTwoNum[2] = {harmo[0], harmo[1]}; + int harmonicsTwoDen[2] = {0, 0}; if (!fCorrelDenoms[1]) { - fCorrelDenoms[1] = Recursion(2, harmonicsTwoDen).Re(); + fCorrelDenoms[1] = recursion(2, harmonicsTwoDen).Re(); } - TComplex twoRecursion = Recursion(2, harmonicsTwoNum) / fCorrelDenoms[1]; + TComplex twoRecursion = recursion(2, harmonicsTwoNum) / fCorrelDenoms[1]; correlData[0] = twoRecursion.Re(); // correlData[1] = fCorrelDenoms[1]; // weight correlData[2] = twoRecursion.Im(); // } break; case 3: { - Int_t harmonicsThreeNum[3] = {harmo[0], harmo[1], harmo[2]}; - Int_t harmonicsThreeDen[3] = {0, 0, 0}; + int harmonicsThreeNum[3] = {harmo[0], harmo[1], harmo[2]}; + int harmonicsThreeDen[3] = {0, 0, 0}; if (!fCorrelDenoms[2]) { - fCorrelDenoms[2] = Recursion(3, harmonicsThreeDen).Re(); + fCorrelDenoms[2] = recursion(3, harmonicsThreeDen).Re(); } - TComplex threeRecursion = Recursion(3, harmonicsThreeNum) / fCorrelDenoms[2]; + TComplex threeRecursion = recursion(3, harmonicsThreeNum) / fCorrelDenoms[2]; correlData[0] = threeRecursion.Re(); // correlData[1] = fCorrelDenoms[2]; // weight correlData[2] = threeRecursion.Im(); // } break; case 4: { - Int_t harmonicsFourNum[4] = {harmo[0], harmo[1], harmo[2], harmo[3]}; - Int_t harmonicsFourDen[4] = {0, 0, 0, 0}; + int harmonicsFourNum[4] = {harmo[0], harmo[1], harmo[2], harmo[3]}; + int harmonicsFourDen[4] = {0, 0, 0, 0}; if (!fCorrelDenoms[3]) { - fCorrelDenoms[3] = Recursion(4, harmonicsFourDen).Re(); + fCorrelDenoms[3] = recursion(4, harmonicsFourDen).Re(); } - TComplex fourRecursion = Recursion(4, harmonicsFourNum) / fCorrelDenoms[3]; + TComplex fourRecursion = recursion(4, harmonicsFourNum) / fCorrelDenoms[3]; correlData[0] = fourRecursion.Re(); // correlData[1] = fCorrelDenoms[3]; // weight correlData[2] = fourRecursion.Im(); // } break; case 5: { - Int_t harmonicsFiveNum[5] = {harmo[0], harmo[1], harmo[2], harmo[3], harmo[4]}; - Int_t harmonicsFiveDen[5] = {0, 0, 0, 0, 0}; + int harmonicsFiveNum[5] = {harmo[0], harmo[1], harmo[2], harmo[3], harmo[4]}; + int harmonicsFiveDen[5] = {0, 0, 0, 0, 0}; if (!fCorrelDenoms[4]) { - fCorrelDenoms[4] = Recursion(5, harmonicsFiveDen).Re(); + fCorrelDenoms[4] = recursion(5, harmonicsFiveDen).Re(); } - TComplex fiveRecursion = Recursion(5, harmonicsFiveNum) / fCorrelDenoms[4]; + TComplex fiveRecursion = recursion(5, harmonicsFiveNum) / fCorrelDenoms[4]; correlData[0] = fiveRecursion.Re(); // correlData[1] = fCorrelDenoms[4]; // weight correlData[2] = fiveRecursion.Im(); // } break; case 6: { - Int_t harmonicsSixNum[6] = {harmo[0], harmo[1], harmo[2], harmo[3], harmo[4], harmo[5]}; - Int_t harmonicsSixDen[6] = {0, 0, 0, 0, 0, 0}; + int harmonicsSixNum[6] = {harmo[0], harmo[1], harmo[2], harmo[3], harmo[4], harmo[5]}; + int harmonicsSixDen[6] = {0, 0, 0, 0, 0, 0}; if (!fCorrelDenoms[5]) { - fCorrelDenoms[5] = Recursion(6, harmonicsSixDen).Re(); + fCorrelDenoms[5] = recursion(6, harmonicsSixDen).Re(); } - TComplex sixRecursion = Recursion(6, harmonicsSixNum) / fCorrelDenoms[5]; + TComplex sixRecursion = recursion(6, harmonicsSixNum) / fCorrelDenoms[5]; correlData[0] = sixRecursion.Re(); // correlData[1] = fCorrelDenoms[5]; // weight correlData[2] = sixRecursion.Im(); // } break; case 7: { - Int_t harmonicsSevenNum[7] = {harmo[0], harmo[1], harmo[2], harmo[3], harmo[4], harmo[5], harmo[6]}; - Int_t harmonicsSevenDen[7] = {0, 0, 0, 0, 0, 0, 0}; + int harmonicsSevenNum[7] = {harmo[0], harmo[1], harmo[2], harmo[3], harmo[4], harmo[5], harmo[6]}; + int harmonicsSevenDen[7] = {0, 0, 0, 0, 0, 0, 0}; if (!fCorrelDenoms[6]) { - fCorrelDenoms[6] = Recursion(7, harmonicsSevenDen).Re(); + fCorrelDenoms[6] = recursion(7, harmonicsSevenDen).Re(); } - TComplex sevenRecursion = Recursion(7, harmonicsSevenNum) / fCorrelDenoms[6]; + TComplex sevenRecursion = recursion(7, harmonicsSevenNum) / fCorrelDenoms[6]; correlData[0] = sevenRecursion.Re(); // correlData[1] = fCorrelDenoms[6]; // weight correlData[2] = sevenRecursion.Im(); // } break; case 8: { - Int_t harmonicsEightNum[8] = {harmo[0], harmo[1], harmo[2], harmo[3], - harmo[4], harmo[5], harmo[6], harmo[7]}; - Int_t harmonicsEightDen[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + int harmonicsEightNum[8] = {harmo[0], harmo[1], harmo[2], harmo[3], + harmo[4], harmo[5], harmo[6], harmo[7]}; + int harmonicsEightDen[8] = {0, 0, 0, 0, 0, 0, 0, 0}; if (!fCorrelDenoms[7]) { - fCorrelDenoms[7] = Recursion(8, harmonicsEightDen).Re(); + fCorrelDenoms[7] = recursion(8, harmonicsEightDen).Re(); } - TComplex eightRecursion = Recursion(8, harmonicsEightNum) / fCorrelDenoms[7]; + TComplex eightRecursion = recursion(8, harmonicsEightNum) / fCorrelDenoms[7]; correlData[0] = eightRecursion.Re(); // correlData[1] = fCorrelDenoms[7]; // weight correlData[2] = eightRecursion.Im(); // } break; case 9: { - Int_t harmonicsNineNum[9] = {harmo[0], harmo[1], harmo[2], harmo[3], harmo[4], - harmo[5], harmo[6], harmo[7], harmo[8]}; - Int_t harmonicsNineDen[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; + int harmonicsNineNum[9] = {harmo[0], harmo[1], harmo[2], harmo[3], harmo[4], + harmo[5], harmo[6], harmo[7], harmo[8]}; + int harmonicsNineDen[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; if (!fCorrelDenoms[8]) { - fCorrelDenoms[8] = Recursion(9, harmonicsNineDen).Re(); + fCorrelDenoms[8] = recursion(9, harmonicsNineDen).Re(); } - TComplex nineRecursion = Recursion(9, harmonicsNineNum) / fCorrelDenoms[8]; + TComplex nineRecursion = recursion(9, harmonicsNineNum) / fCorrelDenoms[8]; correlData[0] = nineRecursion.Re(); correlData[1] = fCorrelDenoms[8]; correlData[2] = nineRecursion.Im(); } break; case 10: { - Int_t harmonicsTenNum[10] = {harmo[0], harmo[1], harmo[2], harmo[3], harmo[4], - harmo[5], harmo[6], harmo[7], harmo[8], harmo[9]}; - Int_t harmonicsTenDen[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + int harmonicsTenNum[10] = {harmo[0], harmo[1], harmo[2], harmo[3], harmo[4], + harmo[5], harmo[6], harmo[7], harmo[8], harmo[9]}; + int harmonicsTenDen[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; if (!fCorrelDenoms[9]) { - fCorrelDenoms[9] = Recursion(10, harmonicsTenDen).Re(); + fCorrelDenoms[9] = recursion(10, harmonicsTenDen).Re(); } - TComplex tenRecursion = Recursion(10, harmonicsTenNum) / fCorrelDenoms[9]; + TComplex tenRecursion = recursion(10, harmonicsTenNum) / fCorrelDenoms[9]; correlData[0] = tenRecursion.Re(); correlData[1] = fCorrelDenoms[9]; correlData[2] = tenRecursion.Im(); } break; case 12: { - Int_t harmonicsTwelveNum[12] = {harmo[0], harmo[1], harmo[2], harmo[3], harmo[4], harmo[5], - harmo[6], harmo[7], harmo[8], harmo[9], harmo[10], harmo[11]}; - Int_t harmonicsTwelveDen[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + int harmonicsTwelveNum[12] = {harmo[0], harmo[1], harmo[2], harmo[3], harmo[4], harmo[5], + harmo[6], harmo[7], harmo[8], harmo[9], harmo[10], harmo[11]}; + int harmonicsTwelveDen[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; if (!fCorrelDenoms[11]) { - fCorrelDenoms[11] = Recursion(12, harmonicsTwelveDen).Re(); + fCorrelDenoms[11] = recursion(12, harmonicsTwelveDen).Re(); } - TComplex twelveRecursion = Recursion(12, harmonicsTwelveNum) / fCorrelDenoms[11]; + TComplex twelveRecursion = recursion(12, harmonicsTwelveNum) / fCorrelDenoms[11]; correlData[0] = twelveRecursion.Re(); correlData[1] = fCorrelDenoms[11]; correlData[2] = twelveRecursion.Im(); } break; case 14: { - Int_t harmonicsFourteenNum[14] = {harmo[0], harmo[1], harmo[2], harmo[3], harmo[4], harmo[5], harmo[6], - harmo[7], harmo[8], harmo[9], harmo[10], harmo[11], harmo[12], harmo[13]}; - Int_t harmonicsFourteenDen[14] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + int harmonicsFourteenNum[14] = {harmo[0], harmo[1], harmo[2], harmo[3], harmo[4], harmo[5], harmo[6], + harmo[7], harmo[8], harmo[9], harmo[10], harmo[11], harmo[12], harmo[13]}; + int harmonicsFourteenDen[14] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; if (!fCorrelDenoms[13]) { - fCorrelDenoms[13] = Recursion(14, harmonicsFourteenDen).Re(); + fCorrelDenoms[13] = recursion(14, harmonicsFourteenDen).Re(); } - TComplex fourteenRecursion = Recursion(14, harmonicsFourteenNum) / fCorrelDenoms[13]; + TComplex fourteenRecursion = recursion(14, harmonicsFourteenNum) / fCorrelDenoms[13]; correlData[0] = fourteenRecursion.Re(); correlData[1] = fCorrelDenoms[13]; @@ -367,7 +407,7 @@ void FlowJSPCAnalysis::Correlation(Int_t c_nPart, Int_t c_nHarmo, Int_t* harmo, } break; } } -int FlowJSPCAnalysis::GetCentBin(float cValue) +int FlowJSPCAnalysis::getCentBin(float cValue) { const float centClasses[] = {0., 1., 2., 5., 10., 20., 30., 40., 50., 60., 70.}; for (int i = 0; i < 8; i++) { diff --git a/PWGCF/JCorran/Core/FlowJSPCAnalysis.h b/PWGCF/JCorran/Core/FlowJSPCAnalysis.h index 656e54c8453..8882f206255 100644 --- a/PWGCF/JCorran/Core/FlowJSPCAnalysis.h +++ b/PWGCF/JCorran/Core/FlowJSPCAnalysis.h @@ -16,7 +16,6 @@ #define PWGCF_JCORRAN_CORE_FLOWJSPCANALYSIS_H_ /* Header files. */ -#include #include #include #include @@ -25,64 +24,54 @@ // O2 headers. // #include "Framework/HistogramRegistry.h" #include "PWGCF/JCorran/Core/JQVectors.h" - -using namespace o2; -using namespace o2::framework; -using namespace std; +#include "CommonConstants/MathConstants.h" class FlowJSPCAnalysis { public: FlowJSPCAnalysis() = default; - void SetHistRegistry(HistogramRegistry* histReg) { mHistRegistry = histReg; } - Int_t GetCentBin(float cValue); + void setHistRegistry(o2::framework::HistogramRegistry* histReg) { mHistRegistry = histReg; } + int getCentBin(float cValue); using JQVectorsT = JQVectors; - inline void SetQvectors(const JQVectorsT* _qvecs) { qvecs = _qvecs; } - void Correlation(Int_t c_nPart, Int_t c_nHarmo, Int_t* harmo, Double_t* correlData); - void CalculateCorrelators(const Int_t fCentBin); - void FillHistograms(const Int_t fCentBin, Int_t ind, Double_t cNum, Double_t cDenom, Double_t wNum, Double_t wDenom); - TComplex Recursion(int n, int* harmonic, int mult, int skip); - TComplex Q(const Int_t harmN, const Int_t p); - - void CreateHistos() + inline void setQvectors(const JQVectorsT* _qvecs) { qvecs = _qvecs; } + void correlation(int c_nPart, int c_nHarmo, int* harmo, double* correlData); + void calculateCorrelators(const int fCentBin); + void fillHistograms(const int fCentBin, int ind, double cNum, double cDenom, double wNum, double wDenom); + void fillQAHistograms(const int fCentBin, double phi, double phiWeight); + TComplex recursion(int n, int* harmonic, int mult, int skip); + TComplex q(const int harmN, const int p); + + void createHistos() { if (!mHistRegistry) { LOGF(error, "QA histogram registry missing. Quitting..."); return; } - mHistRegistry->add("FullCentrality", "FullCentrality", HistType::kTH1D, {{100, 0., 100.}}, true); - mHistRegistry->add("Centrality_0/fResults", "Numerators and denominators", {HistType::kTProfile, {{24, 0., 24.}}}, true); - mHistRegistry->add("Centrality_0/fCovResults", "Covariance N*D", {HistType::kTProfile, {{48, 0., 48.}}}, true); + mHistRegistry->add("FullCentrality", "FullCentrality", o2::framework::HistType::kTH1D, {{100, 0., 100.}}, true); + mHistRegistry->add("Centrality_0/fResults", "Numerators and denominators", {o2::framework::HistType::kTProfile, {{24, 0., 24.}}}, true); + mHistRegistry->add("Centrality_0/fCovResults", "Covariance N*D", {o2::framework::HistType::kTProfile, {{48, 0., 48.}}}, true); + mHistRegistry->add("Centrality_0/phiBefore", "Phi before", {o2::framework::HistType::kTH1D, {{100, 0., o2::constants::math::TwoPI}}}, true); + mHistRegistry->add("Centrality_0/phiAfter", "Phi after", {o2::framework::HistType::kTH1D, {{100, 0., o2::constants::math::TwoPI}}}, true); - for (UInt_t i = 1; i < 8; i++) { + for (uint i = 1; i < 8; i++) { mHistRegistry->addClone("Centrality_0/", Form("Centrality_%u/", i)); } } - void SetCorrSet(Int_t obsInd, Int_t harmo[8]) + void setCorrSet(int obsInd, int harmo[8]) { for (int i = 0; i < 8; i++) { fHarmosArray[obsInd][i] = harmo[i]; } } - void SetFullCorrSet(Int_t harmo[12][8]) + void setFullCorrSet(int harmo[12][8]) { - memcpy(fHarmosArray, harmo, sizeof(Int_t) * 12 * 8); + memcpy(fHarmosArray, harmo, sizeof(int) * 12 * 8); } - private: - const Int_t mNqHarmos = 113; ///< Highest harmo for Q(n,p): (v8*14part)+1. - const Int_t mNqPowers = 15; ///< Max power for Q(n,p): 14part+1. - const JQVectorsT* qvecs; - - HistogramRegistry* mHistRegistry = nullptr; - - Int_t fHarmosArray[12][8]; - - Double_t fCorrelDenoms[14]; - static constexpr std::string_view mCentClasses[] = { + static constexpr std::string_view MCentClasses[] = { "Centrality_0/", "Centrality_1/", "Centrality_2/", @@ -94,6 +83,17 @@ class FlowJSPCAnalysis "Centrality_8/", "Centrality_9/"}; + private: + const int mNqHarmos = 113; ///< Highest harmo for Q(n,p): (v8*14part)+1. + const int mNqPowers = 15; ///< Max power for Q(n,p): 14part+1. + const JQVectorsT* qvecs; + + o2::framework::HistogramRegistry* mHistRegistry = nullptr; + + int fHarmosArray[12][8]; + + double fCorrelDenoms[14]; + ClassDefNV(FlowJSPCAnalysis, 1); }; #endif // PWGCF_JCORRAN_CORE_FLOWJSPCANALYSIS_H_ diff --git a/PWGCF/JCorran/Core/FlowJSPCObservables.h b/PWGCF/JCorran/Core/FlowJSPCObservables.h index 5bf46f8aec2..bc504fe31fe 100644 --- a/PWGCF/JCorran/Core/FlowJSPCObservables.h +++ b/PWGCF/JCorran/Core/FlowJSPCObservables.h @@ -18,27 +18,23 @@ // O2 headers. // #include "Framework/HistogramRegistry.h" -using namespace o2; -using namespace o2::framework; -using namespace std; - const int maxNrComb = 12; class FlowJSPCObservables { public: FlowJSPCObservables() = default; - Int_t harmonicArray[maxNrComb][8] = {{0}}; + int harmonicArray[maxNrComb][8] = {{0}}; - void SetSPCObservables(Int_t index) + void setSPCObservables(int index) { - // Int_t *harmonicArray = (Int_t*)malloc(sizeof(Int_t)*maxNrComb*8); + // int *harmonicArray = (int*)malloc(sizeof(int)*maxNrComb*8); // Switch to set up correct symmetry plane combinations switch (index) { case 0: { LOGF(info, "Computing three harmonic SPC"); - Int_t harmonicArray01[maxNrComb][8] = { + int harmonicArray01[maxNrComb][8] = { {3, 6, -3, -3, 0, 0, 0, 0}, {3, 4, -2, -2, 0, 0, 0, 0}, {3, 8, -4, -4, 0, 0, 0, 0}, @@ -52,11 +48,11 @@ class FlowJSPCObservables {0, 2, -3, -3, 4, 0, 0, 0}, {0, 3, 3, -2, -2, -2, 0, 0}}; - memcpy(harmonicArray, harmonicArray01, sizeof(Int_t) * maxNrComb * 8); + memcpy(harmonicArray, harmonicArray01, sizeof(int) * maxNrComb * 8); } break; case 1: { LOGF(info, "Computing four harmonic SPC"); - Int_t harmonicArray02[maxNrComb][8] = { + int harmonicArray02[maxNrComb][8] = { {4, 6, -2, -2, -2, 0, 0, 0}, {4, 2, -3, -4, 5, 0, 0, 0}, {4, 2, -3, -3, 4, 0, 0, 0}, @@ -69,11 +65,11 @@ class FlowJSPCObservables {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}; - memcpy(harmonicArray, harmonicArray02, sizeof(Int_t) * maxNrComb * 8); + memcpy(harmonicArray, harmonicArray02, sizeof(int) * maxNrComb * 8); } break; case 3: { LOGF(info, "Computing five and six harmonic SPC"); - Int_t harmonicArray03[maxNrComb][8] = { + int harmonicArray03[maxNrComb][8] = { {5, 3, 3, -2, -2, -2, 0, 0}, {5, 2, 2, -3, 4, -5, 0, 0}, {5, 2, 3, 3, -4, -4, 0, 0}, @@ -86,11 +82,10 @@ class FlowJSPCObservables {6, 2, 2, 2, 3, -4, -5, 0}, {6, 2, 2, 3, 3, -4, -6, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}; - memcpy(harmonicArray, harmonicArray03, sizeof(Int_t) * maxNrComb * 8); + memcpy(harmonicArray, harmonicArray03, sizeof(int) * maxNrComb * 8); } break; default: - std::cout << "ERROR: Invalid configuration index. Skipping this element." - << std::endl; + LOGF(error, "ERROR: Invalid configuration index. Skipping this element."); } } diff --git a/PWGCF/JCorran/Tasks/flowJNUACreation.cxx b/PWGCF/JCorran/Tasks/flowJNUACreation.cxx index 914dc37b4ab..31edc2a7c3d 100644 --- a/PWGCF/JCorran/Tasks/flowJNUACreation.cxx +++ b/PWGCF/JCorran/Tasks/flowJNUACreation.cxx @@ -93,10 +93,10 @@ struct flowJNUACreation { void init(InitContext const&) { // Add histomanager here - histManager.SetHistRegistryQA(&qaHistRegistry); - histManager.SetDebugLog(false); - histManager.SetObtainNUA(true); - histManager.CreateHistQA(); + histManager.setHistRegistryQA(&qaHistRegistry); + histManager.setDebugLog(false); + histManager.setObtainNUA(true); + histManager.createHistQA(); // Add CCDB access here ccdb->setURL(cfgCCDB.cfgURL); @@ -131,13 +131,13 @@ struct flowJNUACreation { if (cent < 0. || cent > 70.) { return; } - Int_t cBin = histManager.GetCentBin(cent); + Int_t cBin = histManager.getCentBin(cent); int nTracks = tracks.size(); for (auto& track : tracks) { - histManager.FillTrackQA<1>(track, cBin, 1., 1., coll.posZ()); + histManager.fillTrackQA<1>(track, cBin, 1., 1., coll.posZ()); } - histManager.FillEventQA<1>(coll, cBin, cent, nTracks); + histManager.fillEventQA<1>(coll, cBin, cent, nTracks); LOGF(info, "Collision analysed. Next..."); } diff --git a/PWGCF/JCorran/Tasks/flowJSPCAnalysis.cxx b/PWGCF/JCorran/Tasks/flowJSPCAnalysis.cxx index 3a533674f14..1eaebffa274 100644 --- a/PWGCF/JCorran/Tasks/flowJSPCAnalysis.cxx +++ b/PWGCF/JCorran/Tasks/flowJSPCAnalysis.cxx @@ -25,7 +25,6 @@ #include "Framework/AnalysisDataModel.h" #include "Framework/ASoAHelpers.h" -#include "CCDB/BasicCCDBManager.h" #include "Framework/HistogramRegistry.h" // O2 Physics headers. // @@ -36,6 +35,8 @@ #include "Common/Core/TrackSelection.h" #include "Common/DataModel/TrackSelectionTables.h" +#include "PWGCF/DataModel/CorrelationsDerived.h" +#include "PWGCF/JCorran/DataModel/JCatalyst.h" #include "PWGCF/JCorran/Core/FlowJSPCAnalysis.h" #include "PWGCF/JCorran/Core/FlowJSPCObservables.h" #include "PWGCF/JCorran/Core/FlowJHistManager.h" @@ -50,24 +51,24 @@ using MyCollisions = soa::Join; -using MyTracks = soa::Join; +using MyTracks = soa::Join; struct flowJSPCAnalysis { - HistogramRegistry SPCHistograms{"SPCResults", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry spcHistograms{"SPCResults", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; FlowJSPCAnalysis spcAnalysis; FlowJSPCAnalysis::JQVectorsT jqvecs; + template + using HasWeightNUA = decltype(std::declval().weightNUA()); HistogramRegistry qaHistRegistry{"qaHistRegistry", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; FlowJHistManager histManager; - FlowJSPCObservables SPCobservables; + FlowJSPCObservables spcObservables; // Set Configurables here - Configurable cfgUseNUA{"cfgUseNUA", false, "Use NUA correction"}; - Configurable cfgUseNUE{"cfgUseNUE", false, "Use NUE correction"}; Configurable cfgFillQA{"cfgFillQA", true, "Fill QA plots"}; - Configurable cfgWhichSPC{"cfgWhichSPC", 0, "Which SPC observables to compute."}; + Configurable cfgWhichSPC{"cfgWhichSPC", 0, "Which SPC observables to compute."}; struct : ConfigurableGroup { Configurable cfgPtMin{"cfgPtMin", 0.2f, "Minimum pT used for track selection."}; @@ -75,107 +76,89 @@ struct flowJSPCAnalysis { Configurable cfgEtaMax{"cfgEtaMax", 0.8f, "Maximum eta used for track selection."}; } cfgTrackCuts; - // The centrality estimators are the ones available for Run 3. - enum centEstimators { FT0M, - FT0A, - FT0C, - FDDM, - NTPV }; struct : ConfigurableGroup { Configurable cfgCentEst{"cfgCentEst", 2, "Centrality estimator."}; Configurable cfgZvtxMax{"cfgZvtxMax", 10.0f, "Maximum primary vertex cut applied for the events."}; Configurable cfgMultMin{"cfgMultMin", 10, "Minimum number of particles required for the event to have."}; } cfgEventCuts; - // Set the access to the CCDB for the NUA/NUE weights. - struct : ConfigurableGroup { - Configurable cfgUseCCDB{"cfgUseCCDB", true, "Use CCDB for NUA/NUE corrections."}; - Configurable cfgURL{"cfgURL", "http://alice-ccdb.cern.ch", - "Address of the CCDB to get the NUA/NUE."}; - Configurable cfgTime{"ccdb-no-later-than", - std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), - "Latest acceptable timestamp of creation for the object."}; - } cfgCCDB; - Service ccdb; - // // Filters to be applied to the received data. // // The analysis assumes the data has been subjected to a QA of its selection, // // and thus only the final distributions of the data for analysis are saved. Filter collFilter = (nabs(aod::collision::posZ) < cfgEventCuts.cfgZvtxMax); Filter trackFilter = (aod::track::pt > cfgTrackCuts.cfgPtMin) && (aod::track::pt < cfgTrackCuts.cfgPtMax) && (nabs(aod::track::eta) < cfgTrackCuts.cfgEtaMax); + Filter cftrackFilter = (aod::cftrack::pt > cfgTrackCuts.cfgPtMin) && (aod::cftrack::pt < cfgTrackCuts.cfgPtMax); // eta cuts done by jfluc void init(InitContext const&) { // Add histomanager here - spcAnalysis.SetHistRegistry(&SPCHistograms); - spcAnalysis.CreateHistos(); - - SPCobservables.SetSPCObservables(cfgWhichSPC); - spcAnalysis.SetFullCorrSet(SPCobservables.harmonicArray); + spcAnalysis.setHistRegistry(&spcHistograms); + spcAnalysis.createHistos(); - histManager.SetHistRegistryQA(&qaHistRegistry); - histManager.SetDebugLog(false); - histManager.CreateHistQA(); + spcObservables.setSPCObservables(cfgWhichSPC); + spcAnalysis.setFullCorrSet(spcObservables.harmonicArray); - ///////////////////// - - ccdb->setURL(cfgCCDB.cfgURL); - ccdb->setCaching(true); - ccdb->setLocalObjectValidityChecking(); - ccdb->setCreatedNotAfter(cfgCCDB.cfgTime.value); + histManager.setHistRegistryQA(&qaHistRegistry); + histManager.setDebugLog(false); + histManager.createHistQA(); } - void process(soa::Filtered::iterator const& coll, soa::Filtered const& tracks) + template + void analyze(CollisionT const& collision, TrackT const& tracks) + // void process(soa::Filtered::iterator const& coll, soa::Filtered> const& tracks) { if (tracks.size() < cfgEventCuts.cfgMultMin) return; - float cent = -1.; - switch (cfgEventCuts.cfgCentEst) { - case FT0M: - cent = coll.centFT0M(); - break; - case FT0A: - cent = coll.centFT0A(); - break; - case FT0C: - cent = coll.centFT0C(); - break; - case FDDM: - cent = coll.centFDDM(); - break; - case NTPV: - cent = coll.centNTPV(); - break; - } + float cent = collision.multiplicity(); if (cent < 0. || cent > 70.) { return; } - Int_t cBin = histManager.GetCentBin(cent); - SPCHistograms.fill(HIST("FullCentrality"), cent); + int cBin = histManager.getCentBin(cent); + spcHistograms.fill(HIST("FullCentrality"), cent); int nTracks = tracks.size(); - - for (auto& track : tracks) { - if (cfgFillQA) - histManager.FillTrackQA<1>(track, cBin, coll.posZ()); - - if (cfgUseNUE) { - ; - } - if (cfgUseNUA) { - ; + for (const auto& track : tracks) { + if (cfgFillQA) { + // histManager.FillTrackQA<0>(track, cBin, collision.posZ()); + + using JInputClassIter = typename TrackT::iterator; + if constexpr (std::experimental::is_detected::value) { + spcAnalysis.fillQAHistograms(cBin, track.phi(), 1. / track.weightNUA()); + } } } if (cfgFillQA) - histManager.FillEventQA<1>(coll, cBin, cent, nTracks); + histManager.fillEventQA<1>(collision, cBin, cent, nTracks); jqvecs.Calculate(tracks, 0.0, cfgTrackCuts.cfgEtaMax); - spcAnalysis.SetQvectors(&jqvecs); - spcAnalysis.CalculateCorrelators(cBin); + spcAnalysis.setQvectors(&jqvecs); + spcAnalysis.calculateCorrelators(cBin); + } - LOGF(info, "Collision analysed. Next..."); + void processJDerived(aod::JCollision const& collision, soa::Filtered const& tracks) + { + analyze(collision, tracks); + } + PROCESS_SWITCH(flowJSPCAnalysis, processJDerived, "Process derived data", false); + + void processJDerivedCorrected(aod::JCollision const& collision, soa::Filtered> const& tracks) + { + analyze(collision, tracks); + } + PROCESS_SWITCH(flowJSPCAnalysis, processJDerivedCorrected, "Process derived data with corrections", false); + + void processCFDerived(aod::CFCollision const& collision, soa::Filtered const& tracks) + { + analyze(collision, tracks); + } + PROCESS_SWITCH(flowJSPCAnalysis, processCFDerived, "Process CF derived data", false); + + void processCFDerivedCorrected(aod::CFCollision const& collision, soa::Filtered> const& tracks) + { + analyze(collision, tracks); } + PROCESS_SWITCH(flowJSPCAnalysis, processCFDerivedCorrected, "Process CF derived data with corrections", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) diff --git a/PWGCF/JCorran/Tasks/jflucAnalysisTask.cxx b/PWGCF/JCorran/Tasks/jflucAnalysisTask.cxx index 54f8b902d61..6e0ba68d2df 100644 --- a/PWGCF/JCorran/Tasks/jflucAnalysisTask.cxx +++ b/PWGCF/JCorran/Tasks/jflucAnalysisTask.cxx @@ -146,13 +146,13 @@ struct jflucAnalysisTask { { analyze(collision, tracks); } - PROCESS_SWITCH(jflucAnalysisTask, processCFDerived, "Process CF derived data", true); + PROCESS_SWITCH(jflucAnalysisTask, processCFDerived, "Process CF derived data", false); void processCFDerivedCorrected(aod::CFCollision const& collision, soa::Filtered> const& tracks) { analyze(collision, tracks); } - PROCESS_SWITCH(jflucAnalysisTask, processCFDerivedCorrected, "Process CF derived data with corrections", false); + PROCESS_SWITCH(jflucAnalysisTask, processCFDerivedCorrected, "Process CF derived data with corrections", true); void processCF2ProngDerived(aod::CFCollision const& collision, soa::Filtered const& tracks, soa::Filtered const& p2tracks) { diff --git a/PWGCF/JCorran/Tasks/jflucWeightsLoader.cxx b/PWGCF/JCorran/Tasks/jflucWeightsLoader.cxx index 9e2203e8a02..bf874c32a4a 100644 --- a/PWGCF/JCorran/Tasks/jflucWeightsLoader.cxx +++ b/PWGCF/JCorran/Tasks/jflucWeightsLoader.cxx @@ -10,6 +10,7 @@ // or submit itself to any jurisdiction. /// \author Jasper Parkkila (jparkkil@cern.ch) /// \since May 2024 +// o2-linter: disable='doc/file' #include #include @@ -27,7 +28,7 @@ #include "Common/DataModel/Centrality.h" #include "ReconstructionDataFormats/V0.h" -// #include "CCDB/BasicCCDBManager.h" +#include "CCDB/BasicCCDBManager.h" #include "PWGCF/JCorran/DataModel/JCatalyst.h" #include "PWGCF/DataModel/CorrelationsDerived.h" @@ -41,14 +42,19 @@ using namespace o2::framework::expressions; // The standalone jfluc code expects the entire list of tracks for an event. At the same time, it expects weights together with other track attributes. // This workflow creates a table of weights that can be joined with track tables. -struct jflucWeightsLoader { - O2_DEFINE_CONFIGURABLE(pathPhiWeights, std::string, "", "Local (local://) or CCDB path for the phi acceptance correction histogram"); +struct JflucWeightsLoader { + O2_DEFINE_CONFIGURABLE(cfgPathPhiWeights, std::string, "http://alice-ccdb.cern.ch", "Local (local://) or CCDB path for the phi acceptance correction histogram"); + O2_DEFINE_CONFIGURABLE(cfgForRunNumber, bool, false, "Get CCDB object by run"); + O2_DEFINE_CONFIGURABLE(cfgCCDBPath, std::string, "Users/m/mavirta/corrections/NUA/LHC23zzh", "Internal path in CCDB"); THnF* ph = 0; TFile* pf = 0; int runNumber = 0; + int timestamp = 0; + bool useCCDB = false; + Service ccdb; - ~jflucWeightsLoader() + ~JflucWeightsLoader() { if (ph) delete ph; @@ -58,43 +64,74 @@ struct jflucWeightsLoader { } } + void initCCDB(int runNum, int ts) + { + if (cfgForRunNumber) { + ph = ccdb->getForRun(cfgCCDBPath, runNum); + } else { + ph = ccdb->getForTimeStamp(cfgCCDBPath, ts); + } + } + void init(InitContext const&) { - if (!doprocessLoadWeights && !doprocessLoadWeightsCF) + if (!doprocessLoadWeights && !doprocessLoadWeightsCF) { return; + } + if (doprocessLoadWeights && doprocessLoadWeightsCF) LOGF(fatal, "Only one of JTracks or CFTracks processing can be enabled at a time."); - if (pathPhiWeights.value.substr(0, 8) == "local://") { - pf = new TFile(pathPhiWeights.value.substr(8).c_str(), "read"); + if (cfgPathPhiWeights.value.find("ccdb") != std::string::npos) { + LOGF(info, "Using corrections from: ccdb"); + useCCDB = true; + ccdb->setURL(cfgPathPhiWeights); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setFatalWhenNull(false); + } else if (cfgPathPhiWeights.value.substr(0, 8) == "local://") { + LOGF(info, "Using corrections from: %s", cfgPathPhiWeights.value.substr(8).c_str()); + pf = new TFile(cfgPathPhiWeights.value.substr(8).c_str(), "read"); if (!pf->IsOpen()) { delete pf; pf = 0; - LOGF(fatal, "NUA correction weights file not found: %s", pathPhiWeights.value.substr(8).c_str()); + LOGF(fatal, "NUA correction weights file not found: %s", cfgPathPhiWeights.value.substr(8).c_str()); } + useCCDB = false; + } else { + LOGF(info, "Didn't find \"local://\" or \"ccdb\""); + return; } } template - using hasDecay = decltype(std::declval().decay()); + using HasDecay = decltype(std::declval().decay()); template void loadWeights(Produces& outputT, CollisionT const& collision, TrackT const& tracks) { - if (!pf) + + if (!pf && !useCCDB) LOGF(fatal, "NUA correction weights file has not been opened."); if (collision.runNumber() != runNumber) { if (ph) delete ph; - if (!(ph = static_cast(pf->Get(Form("NUAWeights_%d", collision.runNumber()))))) + // Check if NUA correction can be found from a local file and load it + if (!useCCDB && !(ph = static_cast(pf->Get(Form("NUAWeights_%d", collision.runNumber()))))) { LOGF(warning, "NUA correction histogram not found for run %d.", collision.runNumber()); - else - LOGF(info, "Loaded NUA correction histogram for run %d.", collision.runNumber()); + } else if (useCCDB) { // Check if ccdb file is used and load it + LOGF(info, "Loaded NUA correction histogram from CCDB for run %d.", collision.runNumber()); + } else { + LOGF(info, "Loaded NUA correction histogram locally for run %d.", collision.runNumber()); + } runNumber = collision.runNumber(); + if (useCCDB) { + initCCDB(runNumber, timestamp); + } } - for (auto& track : tracks) { + for (const auto& track : tracks) { float phiWeight, effWeight; if (ph) { - UInt_t partType = 0; // partType 0 = all charged hadrons + uint partType = 0; // partType 0 = all charged hadrons // TODO: code below to be enabled /*if constexpr (std::experimental::is_detected::value) { switch (track.decay()) { @@ -106,7 +143,7 @@ struct jflucWeightsLoader { break; } }*/ - const Double_t coords[] = {collision.multiplicity(), static_cast(partType), track.phi(), track.eta(), collision.posZ()}; + const double coords[] = {collision.multiplicity(), static_cast(partType), track.phi(), track.eta(), collision.posZ()}; phiWeight = ph->GetBinContent(ph->GetBin(coords)); } else { phiWeight = 1.0f; @@ -123,23 +160,23 @@ struct jflucWeightsLoader { { loadWeights(output, collision, tracks); } - PROCESS_SWITCH(jflucWeightsLoader, processLoadWeights, "Load weights histograms for derived data table", false); + PROCESS_SWITCH(JflucWeightsLoader, processLoadWeights, "Load weights histograms for derived data table", false); void processLoadWeightsCF(aod::CFCollision const& collision, aod::CFTracks const& tracks) { loadWeights(output, collision, tracks); } - PROCESS_SWITCH(jflucWeightsLoader, processLoadWeightsCF, "Load weights histograms for CF derived data table", true); + PROCESS_SWITCH(JflucWeightsLoader, processLoadWeightsCF, "Load weights histograms for CF derived data table", true); Produces output2p; void processLoadWeightsCF2Prong(aod::CFCollision const& collision, aod::CF2ProngTracks const& tracks2p) { loadWeights(output2p, collision, tracks2p); } - PROCESS_SWITCH(jflucWeightsLoader, processLoadWeightsCF2Prong, "Load weights histograms for CF derived 2-prong tracks data table", false); + PROCESS_SWITCH(JflucWeightsLoader, processLoadWeightsCF2Prong, "Load weights histograms for CF derived 2-prong tracks data table", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{adaptAnalysisTask(cfgc)}; + return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From 01d178935ac4c4fcc93ffc5edb545442f371c8c5 Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Tue, 11 Feb 2025 17:32:42 +0100 Subject: [PATCH 0150/1650] [PWGLF] chk892Flow: Add scalar product method (#9875) --- PWGLF/Tasks/Resonances/chk892Flow.cxx | 55 +++++++++++++++++++++------ 1 file changed, 43 insertions(+), 12 deletions(-) diff --git a/PWGLF/Tasks/Resonances/chk892Flow.cxx b/PWGLF/Tasks/Resonances/chk892Flow.cxx index 973a757d86b..d9f2d697207 100644 --- a/PWGLF/Tasks/Resonances/chk892Flow.cxx +++ b/PWGLF/Tasks/Resonances/chk892Flow.cxx @@ -116,9 +116,10 @@ struct Chk892Flow { ConfigurableAxis cfgBinsVtxZ{"cfgBinsVtxZ", {VARIABLE_WIDTH, -10.0, -9.0, -8.0, -7.0, -6.0, -5.0, -4.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0}, "Binning of the z-vertex axis"}; Configurable cNbinsDiv{"cNbinsDiv", 1, "Integer to divide the number of bins"}; Configurable cNbinsDivQA{"cNbinsDivQA", 1, "Integer to divide the number of bins for QA"}; - ConfigurableAxis cfgAxisV2{"cfgAxisV2", {200, -2, 2}, "Binning of the v2 axis"}; + ConfigurableAxis cfgAxisV2{"cfgAxisV2", {200, -1, 1}, "Binning of the v2 axis (+-1 for EP method)"}; Configurable cfgFillAdditionalAxis{"cfgFillAdditionalAxis", false, "Fill additional axis"}; ConfigurableAxis cfgAxisPhi{"cfgAxisPhi", {8, 0, constants::math::PI}, "Binning of the #phi axis"}; + Configurable cfgUseScalProduct{"cfgUseScalProduct", false, "Use scalar product method"}; // Event cuts o2::analysis::CollisonCuts colCuts; @@ -278,6 +279,12 @@ struct Chk892Flow { histos.add("QA/EP/hEPResAC", "cos(n(A-C))", {HistType::kTH2D, {centAxis, epAxis}}); histos.add("QA/EP/hEPResBC", "cos(n(B-C))", {HistType::kTH2D, {centAxis, epAxis}}); + if (cfgUseScalProduct) { + histos.add("QA/EP/hEPSPResAB", "cos(n(A-B))", {HistType::kTH2D, {centAxis, epAxis}}); + histos.add("QA/EP/hEPSPResAC", "cos(n(A-C))", {HistType::kTH2D, {centAxis, epAxis}}); + histos.add("QA/EP/hEPSPResBC", "cos(n(B-C))", {HistType::kTH2D, {centAxis, epAxis}}); + } + // Rotated background if (cfgFillRotBkg) { histos.add("QA/RotBkg/hRotBkg", "Rotated angle of rotated background", HistType::kTH1F, {{360, 0.0, o2::constants::math::TwoPI}}); @@ -705,12 +712,23 @@ struct Chk892Flow { double lEPResAC = std::cos(static_cast(nmode) * (lEPDet - lEPRefC)); double lEPResBC = std::cos(static_cast(nmode) * (lEPRefB - lEPRefC)); + // EP method histos.fill(HIST("QA/EP/hEPDet"), lCentrality, lEPDet); histos.fill(HIST("QA/EP/hEPB"), lCentrality, lEPRefB); histos.fill(HIST("QA/EP/hEPC"), lCentrality, lEPRefC); histos.fill(HIST("QA/EP/hEPResAB"), lCentrality, lEPResAB); histos.fill(HIST("QA/EP/hEPResAC"), lCentrality, lEPResAC); histos.fill(HIST("QA/EP/hEPResBC"), lCentrality, lEPResBC); + // Scalar product method + if (cfgUseScalProduct) { + double lEPSPResAB = collision.qvecRe()[lQvecDetInd] * collision.qvecRe()[lQvecRefAInd] + collision.qvecIm()[lQvecDetInd] * collision.qvecIm()[lQvecRefAInd] * lEPResAB; + double lEPSPResAC = collision.qvecRe()[lQvecDetInd] * collision.qvecRe()[lQvecRefBInd] + collision.qvecIm()[lQvecDetInd] * collision.qvecIm()[lQvecRefBInd] * lEPResAC; + double lEPSPResBC = collision.qvecRe()[lQvecRefAInd] * collision.qvecRe()[lQvecRefBInd] + collision.qvecIm()[lQvecRefAInd] * collision.qvecIm()[lQvecRefBInd] * lEPResBC; + + histos.fill(HIST("QA/EP/hEPSPResAB"), lCentrality, lEPSPResAB); + histos.fill(HIST("QA/EP/hEPSPResAC"), lCentrality, lEPSPResAC); + histos.fill(HIST("QA/EP/hEPSPResBC"), lCentrality, lEPSPResBC); + } TLorentzVector lDecayDaughter1, lDecayDaughter2, lResoSecondary, lDecayDaughter_bach, lResoKstar, lDaughterRot, lResonanceRot; std::vector trackIndicies = {}; @@ -861,15 +879,22 @@ struct Chk892Flow { lDecayDaughter_bach.SetXYZM(bTrack.px(), bTrack.py(), bTrack.pz(), MassPionCharged); lResoSecondary.SetXYZM(k0sCand.px(), k0sCand.py(), k0sCand.pz(), MassK0Short); lResoKstar = lResoSecondary + lDecayDaughter_bach; - - auto lPhiMinusPsiKstar = RecoDecay::constrainAngle(lResoKstar.Phi() - lEPDet, 0.0, 2); // constrain angle to range 0, Pi - auto v2Kstar = std::cos(static_cast(nmode) * lPhiMinusPsiKstar); + auto resoPhi = lResoKstar.Phi(); + // EP method + auto lPhiMinusPsiKstar = RecoDecay::constrainAngle(resoPhi - lEPDet, 0.0, 2); // constrain angle to range 0, Pi + auto resoFlowValue = std::cos(static_cast(nmode) * lPhiMinusPsiKstar); + // Scalar product method + if (cfgUseScalProduct) { + float cosNPhi = std::cos(static_cast(nmode) * resoPhi); + float sinNPhi = std::sin(static_cast(nmode) * resoPhi); + resoFlowValue = cosNPhi * collision.qvecRe()[lQvecDetInd] + sinNPhi * collision.qvecIm()[lQvecDetInd]; + } // QA plots if constexpr (!IsMix) { histos.fill(HIST("QA/before/KstarRapidity"), lResoKstar.Rapidity()); histos.fill(HIST("QA/before/kstarinvmass"), lResoKstar.M()); - histos.fill(HIST("QA/before/kstarv2vsinvmass"), lResoKstar.M(), v2Kstar); + histos.fill(HIST("QA/before/kstarv2vsinvmass"), lResoKstar.M(), resoFlowValue); } if (lResoKstar.Rapidity() > cKstarMaxRap || lResoKstar.Rapidity() < cKstarMinRap) @@ -880,11 +905,11 @@ struct Chk892Flow { histos.fill(HIST("QA/after/KstarRapidity"), lResoKstar.Rapidity()); histos.fill(HIST("QA/after/kstarinvmass"), lResoKstar.M()); - histos.fill(HIST("QA/after/kstarv2vsinvmass"), lResoKstar.M(), v2Kstar); + histos.fill(HIST("QA/after/kstarv2vsinvmass"), lResoKstar.M(), resoFlowValue); if (cfgFillAdditionalAxis) { - histos.fill(HIST("hInvmass_Kstar"), typeKstar, lCentrality, lResoKstar.Pt(), lResoKstar.M(), v2Kstar, static_cast(nmode) * lPhiMinusPsiKstar); + histos.fill(HIST("hInvmass_Kstar"), typeKstar, lCentrality, lResoKstar.Pt(), lResoKstar.M(), resoFlowValue, static_cast(nmode) * lPhiMinusPsiKstar); } else { - histos.fill(HIST("hInvmass_Kstar"), typeKstar, lCentrality, lResoKstar.Pt(), lResoKstar.M(), v2Kstar); + histos.fill(HIST("hInvmass_Kstar"), typeKstar, lCentrality, lResoKstar.Pt(), lResoKstar.M(), resoFlowValue); } if (cfgFillRotBkg) { @@ -900,13 +925,19 @@ struct Chk892Flow { lDaughterRot.RotateZ(lRotAngle); lResonanceRot = lDecayDaughter_bach + lDaughterRot; } - auto lPhiMinusPsiKstar = RecoDecay::constrainAngle(lResonanceRot.Phi() - lEPDet, 0.0, 2); // constrain angle to range 0, Pi - auto v2Kstar = std::cos(static_cast(nmode) * lPhiMinusPsiKstar); + resoPhi = lResonanceRot.Phi(); + auto lPhiMinusPsiKstar = RecoDecay::constrainAngle(resoPhi - lEPDet, 0.0, 2); // constrain angle to range 0, Pi + auto resoFlowValue = std::cos(static_cast(nmode) * lPhiMinusPsiKstar); + if (cfgUseScalProduct) { + float cosNPhi = std::cos(static_cast(nmode) * resoPhi); + float sinNPhi = std::sin(static_cast(nmode) * resoPhi); + resoFlowValue = cosNPhi * collision.qvecRe()[lQvecDetInd] + sinNPhi * collision.qvecIm()[lQvecDetInd]; + } typeKstar = bTrack.sign() > 0 ? BinType::kKstarP_Rot : BinType::kKstarN_Rot; if (cfgFillAdditionalAxis) { - histos.fill(HIST("hInvmass_Kstar"), typeKstar, lCentrality, lResonanceRot.Pt(), lResonanceRot.M(), v2Kstar, static_cast(nmode) * lPhiMinusPsiKstar); + histos.fill(HIST("hInvmass_Kstar"), typeKstar, lCentrality, lResonanceRot.Pt(), lResonanceRot.M(), resoFlowValue, static_cast(nmode) * lPhiMinusPsiKstar); } else { - histos.fill(HIST("hInvmass_Kstar"), typeKstar, lCentrality, lResonanceRot.Pt(), lResonanceRot.M(), v2Kstar); + histos.fill(HIST("hInvmass_Kstar"), typeKstar, lCentrality, lResonanceRot.Pt(), lResonanceRot.M(), resoFlowValue); } } } From b2c7a0c4b3ebc369ce46305c0a263021d7035d12 Mon Sep 17 00:00:00 2001 From: Francesca Ercolessi Date: Tue, 11 Feb 2025 18:49:09 +0100 Subject: [PATCH 0151/1650] [PWGLF] Nuclei-proton correlation analysis fix processGen (#9879) --- .../Tasks/Nuspex/hadronnucleicorrelation.cxx | 132 +++++++----------- 1 file changed, 50 insertions(+), 82 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx b/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx index 8d0e9cbe231..82dc61f4701 100644 --- a/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx +++ b/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx @@ -92,13 +92,14 @@ struct hadronnucleicorrelation { Configurable rejectionEl{"rejectionEl", true, "use TPC El rejection"}; Configurable max_tpcSharedCls{"max_tpcSharedCls", 0.4, "maximum fraction of TPC shared clasters"}; Configurable min_itsNCls{"min_itsNCls", 0, "minimum allowed number of ITS clasters"}; + Configurable maxmixcollsGen{"maxmixcollsGen", 100, "maxmixcollsGen"}; // Mixing parameters Configurable _vertexNbinsToMix{"vertexNbinsToMix", 10, "Number of vertexZ bins for the mixing"}; Configurable _multNsubBins{"multSubBins", 10, "number of sub-bins to perform the mixing within"}; // pT/A bins - Configurable> pTBins{"pTBins", {0.4f, 0.6f, 0.8f}, "p_{T} bins"}; + Configurable> pTBins{"pTBins", {0.6f, 1.0f, 1.2f, 2.f}, "p_{T} bins"}; ConfigurableAxis AxisNSigma{"AxisNSigma", {35, -7.f, 7.f}, "n#sigma"}; @@ -359,9 +360,8 @@ struct hadronnucleicorrelation { } if (isMCGen) { - registry.add("Generated/hNEventsMC", "hNEventsMC", {HistType::kTH1D, {{2, 0.f, 2.f}}}); + registry.add("Generated/hNEventsMC", "hNEventsMC", {HistType::kTH1D, {{1, 0.f, 1.f}}}); registry.get(HIST("Generated/hNEventsMC"))->GetXaxis()->SetBinLabel(1, "All"); - registry.get(HIST("Generated/hNEventsMC"))->GetXaxis()->SetBinLabel(2, "|z_{vtx}| < 10 cm"); } } @@ -560,28 +560,26 @@ struct hadronnucleicorrelation { template void mixMCParticles(Type const& particles1, Type const& particles2) - { // last value: 0 -- SE; 1 -- ME + { for (auto it1 : particles1) { for (auto it2 : particles2) { - // Calculate Delta-eta Delta-phi (gen) float deltaEtaGen = it2->eta() - it1->eta(); - float deltaPhiGen = it2->phi() - it1->phi(); - deltaPhiGen = getDeltaPhi(deltaPhiGen); + float deltaPhiGen = getDeltaPhi(it2->phi() - it1->phi()); + // Loop over pT bins for (int k = 0; k < nBinspT; k++) { - if (it1->pt() >= pTBins.value.at(k) && it1->pt() < pTBins.value.at(k + 1)) { - - if (ME) { + // Use correct histogram based on ME flag + if constexpr (ME) { hEtaPhiGen_AntiDeAntiPr_ME[k]->Fill(deltaEtaGen, deltaPhiGen, it2->pt()); } else { hEtaPhiGen_AntiDeAntiPr_SE[k]->Fill(deltaEtaGen, deltaPhiGen, it2->pt()); - } // SE - } // pT condition - } // nBinspT loop - } // particles 2 - } // particles 1 + } + } + } + } + } } float getDeltaPhi(float deltaPhi) @@ -1294,6 +1292,10 @@ struct hadronnucleicorrelation { continue; } + if (std::abs(particle.eta()) > etacut) { + continue; + } + if (particle.pdgCode() == pdgDeuteron) { selectedparticlesMC_d[particle.mcCollisionId()].push_back(std::make_shared(particle)); } @@ -1308,83 +1310,59 @@ struct hadronnucleicorrelation { } } - for (auto collision : mcCollisions) { + for (auto collision1 : mcCollisions) { // loop on collisions registry.fill(HIST("Generated/hNEventsMC"), 0.5); - if (std::abs(collision.posZ()) < 10.f) { - // return; - registry.fill(HIST("Generated/hNEventsMC"), 1.5); - } - - int vertexBinToMix = std::floor((collision.posZ() + cutzvertex) / (2 * cutzvertex / _vertexNbinsToMix)); - // int centBinToMix = std::floor(collision.centFT0M() / (100.0 / _multNsubBins)); - - if (selectedparticlesMC_antid.find(collision.globalIndex()) != selectedparticlesMC_antid.end()) { - mixbinsMC_antidantip[vertexBinToMix].push_back(std::make_shared(collision)); - } - if (selectedparticlesMC_d.find(collision.globalIndex()) != selectedparticlesMC_d.end()) { - mixbinsMC_dp[vertexBinToMix].push_back(std::make_shared(collision)); - } - } // coll - if (!mixbinsMC_antidantip.empty()) { - - for (auto i = mixbinsMC_antidantip.begin(); i != mixbinsMC_antidantip.end(); i++) { // iterating over all vertex&mult bins - - std::vector value = i->second; - int EvPerBin = value.size(); // number of collisions in each vertex&mult bin + // anti-d - anti-p correlation + if (selectedparticlesMC_antid.find(collision1.globalIndex()) != selectedparticlesMC_antid.end()) { + if (selectedparticlesMC_antip.find(collision1.globalIndex()) != selectedparticlesMC_antip.end()) { + mixMCParticles<0>(selectedparticlesMC_antid[collision1.globalIndex()], selectedparticlesMC_antip[collision1.globalIndex()]); // mixing SE + } - for (int indx1 = 0; indx1 < EvPerBin; indx1++) { // loop over all the events in each vertex&mult bin + int stop1 = 0; - auto col1 = value[indx1]; + for (auto collision2 : mcCollisions) { // nested loop on collisions - if (selectedparticlesMC_antip.find(col1->index()) != selectedparticlesMC_antip.end()) { - mixMCParticles<0>(selectedparticlesMC_antid[col1->index()], selectedparticlesMC_antip[col1->index()]); // mixing SE + if (collision1.globalIndex() == collision2.globalIndex()) { + continue; } - for (int indx2 = indx1 + 1; indx2 < EvPerBin; indx2++) { // nested loop for all the combinations of collisions in a chosen mult/vertex bin - - auto col2 = (i->second)[indx2]; - - if (col1 == col2) { - continue; - } + if (stop1 > maxmixcollsGen) { + break; + } - if (selectedparticlesMC_antip.find(col2->index()) != selectedparticlesMC_antip.end()) { - mixMCParticles<1>(selectedparticlesMC_antid[col1->index()], selectedparticlesMC_antip[col2->index()]); // mixing ME - } + if (selectedparticlesMC_antip.find(collision2.globalIndex()) != selectedparticlesMC_antip.end()) { + mixMCParticles<1>(selectedparticlesMC_antid[collision1.globalIndex()], selectedparticlesMC_antip[collision2.globalIndex()]); // mixing ME } + + stop1++; } } - } - - if (!mixbinsMC_dp.empty()) { - for (auto i = mixbinsMC_dp.begin(); i != mixbinsMC_dp.end(); i++) { // iterating over all vertex&mult bins - - std::vector value = i->second; - int EvPerBin = value.size(); // number of collisions in each vertex&mult bin + // d - p correlation + if (selectedparticlesMC_d.find(collision1.globalIndex()) != selectedparticlesMC_d.end()) { + if (selectedparticlesMC_p.find(collision1.globalIndex()) != selectedparticlesMC_p.end()) { + mixMCParticles<0>(selectedparticlesMC_d[collision1.globalIndex()], selectedparticlesMC_p[collision1.globalIndex()]); // mixing SE + } - for (int indx1 = 0; indx1 < EvPerBin; indx1++) { // loop over all the events in each vertex&mult bin + int stop2 = 0; - auto col1 = value[indx1]; + for (auto collision2 : mcCollisions) { // nested loop on collisions - if (selectedparticlesMC_p.find(col1->index()) != selectedparticlesMC_p.end()) { - mixMCParticles<0>(selectedparticlesMC_d[col1->index()], selectedparticlesMC_p[col1->index()]); // mixing SE + if (collision1.globalIndex() == collision2.globalIndex()) { + continue; } - for (int indx2 = indx1 + 1; indx2 < EvPerBin; indx2++) { // nested loop for all the combinations of collisions in a chosen mult/vertex bin - - auto col2 = (i->second)[indx2]; - - if (col1 == col2) { - continue; - } + if (stop2 > maxmixcollsGen) { + break; + } - if (selectedparticlesMC_p.find(col2->index()) != selectedparticlesMC_p.end()) { - mixMCParticles<1>(selectedparticlesMC_d[col1->index()], selectedparticlesMC_p[col2->index()]); // mixing ME - } + if (selectedparticlesMC_p.find(collision2.globalIndex()) != selectedparticlesMC_p.end()) { + mixMCParticles<1>(selectedparticlesMC_d[collision1.globalIndex()], selectedparticlesMC_p[collision2.globalIndex()]); // mixing ME } + + stop2++; } } } @@ -1405,16 +1383,6 @@ struct hadronnucleicorrelation { for (auto i = selectedparticlesMC_p.begin(); i != selectedparticlesMC_p.end(); i++) (i->second).clear(); selectedparticlesMC_p.clear(); - - for (auto& pair : mixbinsMC_antidantip) { - pair.second.clear(); // clear the vector associated with the key - } - mixbinsMC_antidantip.clear(); // clear the map - - for (auto& pair : mixbinsMC_dp) { - pair.second.clear(); // clear the vector associated with the key - } - mixbinsMC_dp.clear(); // clear the map } PROCESS_SWITCH(hadronnucleicorrelation, processGen, "processGen", false); }; From 633fed5e7edbef9d9f89c9624bfbe2ab3d161907 Mon Sep 17 00:00:00 2001 From: Sandeep Dudi <69388148+sdudi123@users.noreply.github.com> Date: Tue, 11 Feb 2025 19:10:51 +0100 Subject: [PATCH 0152/1650] [PWGUD] PID Selection improved (#9871) Co-authored-by: Sandeep Dudi Co-authored-by: Sandeep Dudi --- PWGUD/Tasks/sginclusivePhiKstarSD.cxx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/PWGUD/Tasks/sginclusivePhiKstarSD.cxx b/PWGUD/Tasks/sginclusivePhiKstarSD.cxx index 601de7ec349..90ca2a8485d 100644 --- a/PWGUD/Tasks/sginclusivePhiKstarSD.cxx +++ b/PWGUD/Tasks/sginclusivePhiKstarSD.cxx @@ -304,7 +304,10 @@ struct SGResonanceAnalyzer { if (use_tof && pt >= pt2 && pt < pt3 && std::abs(candidate.tpcNSigmaKa()) < nsigmatpc_cut3) { return true; } - if (pt > pt3 && use_tof && candidate.hasTOF() && (candidate.tofNSigmaKa() * candidate.tofNSigmaKa() + candidate.tpcNSigmaKa() * candidate.tpcNSigmaKa()) < nsigmatof_cut) { + if (use_tof && pt >= pt3 && !candidate.hasTOF() && std::abs(candidate.tpcNSigmaKa()) < nsigmatpc_cut) { + return true; + } + if (use_tof && candidate.hasTOF() && (candidate.tofNSigmaKa() * candidate.tofNSigmaKa() + candidate.tpcNSigmaKa() * candidate.tpcNSigmaKa()) < nsigmatof_cut) { return true; } if (!use_tof && std::abs(candidate.tpcNSigmaKa()) < nsigmatpc_cut) { @@ -327,7 +330,10 @@ struct SGResonanceAnalyzer { if (use_tof && pt >= pt2 && pt < pt3 && std::abs(candidate.tpcNSigmaPi()) < nsigmatpc_cut3) { return true; } - if (pt > pt3 && use_tof && candidate.hasTOF() && (candidate.tofNSigmaPi() * candidate.tofNSigmaPi() + candidate.tpcNSigmaPi() * candidate.tpcNSigmaPi()) < nsigmatof_cut) { + if (use_tof && pt >= pt3 && !candidate.hasTOF() && std::abs(candidate.tpcNSigmaPi()) < nsigmatpc_cut) { + return true; + } + if (use_tof && candidate.hasTOF() && (candidate.tofNSigmaPi() * candidate.tofNSigmaPi() + candidate.tpcNSigmaPi() * candidate.tpcNSigmaPi()) < nsigmatof_cut) { return true; } if (!use_tof && std::abs(candidate.tpcNSigmaPi()) < nsigmatpc_cut) { From 37e05e4f0ab80af312604281010240e026af1104 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Tue, 11 Feb 2025 20:05:58 +0100 Subject: [PATCH 0153/1650] [PWGHF,Trigger] Add ITSPID slection on the deuteron of LcDe femto trigger (#9863) --- EventFiltering/PWGHF/HFFilter.cxx | 18 +++++++++++------- EventFiltering/PWGHF/HFFilterHelpers.h | 24 ++++++++++++++---------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/EventFiltering/PWGHF/HFFilter.cxx b/EventFiltering/PWGHF/HFFilter.cxx index df79c6d63fa..8a479e037bd 100644 --- a/EventFiltering/PWGHF/HFFilter.cxx +++ b/EventFiltering/PWGHF/HFFilter.cxx @@ -43,6 +43,7 @@ #include "Common/Core/trackUtilities.h" #include "Common/DataModel/CollisionAssociationTables.h" #include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/PIDResponseITS.h" #include "PWGEM/PhotonMeson/DataModel/gammaTables.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" @@ -52,6 +53,7 @@ #include "PWGHF/Utils/utilsTrkCandHf.h" using namespace o2; +using namespace o2::soa; using namespace o2::analysis; using namespace o2::aod::hffilters; using namespace o2::framework; @@ -71,7 +73,7 @@ struct HfFilter { // Main struct for HF triggers // parameters for all triggers // nsigma PID (except for V0 and cascades) - Configurable> nSigmaPidCuts{"nSigmaPidCuts", {cutsNsigma[0], 3, 7, labelsRowsNsigma, labelsColumnsNsigma}, "Nsigma cuts for TPC/TOF PID (except for V0 and cascades)"}; + Configurable> nSigmaPidCuts{"nSigmaPidCuts", {cutsNsigma[0], 4, 7, labelsRowsNsigma, labelsColumnsNsigma}, "Nsigma cuts for ITS/TPC/TOF PID (except for V0 and cascades)"}; // min and max pts for tracks and bachelors (except for V0 and cascades) Configurable> ptCuts{"ptCuts", {cutsPt[0], 2, 7, labelsRowsCutsPt, labelsColumnsCutsPt}, "minimum and maximum pT for bachelor tracks (except for V0 and cascades)"}; @@ -202,8 +204,8 @@ struct HfFilter { // Main struct for HF triggers helper.setCutsSingleTrackBeauty(cutsTrackBeauty3Prong, cutsTrackBeauty4Prong); helper.setCutsSingleTrackCharmBaryonBachelor(cutsTrackCharmBaryonBachelor); helper.setCutsBhadrons(cutsBplus, cutsBzeroToDstar, cutsBzero, cutsBs, cutsLb, cutsXib); - helper.setNsigmaProtonCutsForFemto(std::array{nSigmaPidCuts->get(0u, 3u), nSigmaPidCuts->get(1u, 3u), nSigmaPidCuts->get(2u, 3u)}); - helper.setNsigmaDeuteronCutsForFemto(std::array{nSigmaPidCuts->get(0u, 6u), nSigmaPidCuts->get(1u, 6u), nSigmaPidCuts->get(2u, 6u)}); + helper.setNsigmaProtonCutsForFemto(std::array{nSigmaPidCuts->get(0u, 3u), nSigmaPidCuts->get(1u, 3u), nSigmaPidCuts->get(2u, 3u), nSigmaPidCuts->get(3u, 3u)}); + helper.setNsigmaDeuteronCutsForFemto(std::array{nSigmaPidCuts->get(0u, 6u), nSigmaPidCuts->get(1u, 6u), nSigmaPidCuts->get(2u, 6u), nSigmaPidCuts->get(3u, 6u)}); helper.setNsigmaProtonCutsForCharmBaryons(nSigmaPidCuts->get(0u, 0u), nSigmaPidCuts->get(1u, 0u)); helper.setNsigmaPionKaonCutsForDzero(nSigmaPidCuts->get(0u, 1u), nSigmaPidCuts->get(1u, 1u)); helper.setNsigmaKaonCutsFor3Prongs(nSigmaPidCuts->get(0u, 2u), nSigmaPidCuts->get(1u, 2u)); @@ -303,8 +305,8 @@ struct HfFilter { // Main struct for HF triggers if (activateQA > 1) { hProtonTPCPID = registry.add("fProtonTPCPID", "#it{N}_{#sigma}^{TPC} vs. #it{p} for selected protons;#it{p} (GeV/#it{c});#it{N}_{#sigma}^{TPC}", HistType::kTH2D, {pAxis, nSigmaAxis}); hProtonTOFPID = registry.add("fProtonTOFPID", "#it{N}_{#sigma}^{TOF} vs. #it{p} for selected protons;#it{p} (GeV/#it{c});#it{N}_{#sigma}^{TOF}", HistType::kTH2D, {pAxis, nSigmaAxis}); - hDeuteronTPCPID = registry.add("hDeuteronTPCPID", "#it{N}_{#sigma}^{TPC} vs. #it{p} for selected deuterons;#it{p} (GeV/#it{c});#it{N}_{#sigma}^{TPC}", HistType::kTH2D, {pAxis, nSigmaAxis}); - hDeuteronTOFPID = registry.add("hDeuteronTOFPID", "#it{N}_{#sigma}^{TOF} vs. #it{p} for selected deuterons;#it{p} (GeV/#it{c});#it{N}_{#sigma}^{TOF}", HistType::kTH2D, {pAxis, nSigmaAxis}); + hDeuteronTPCPID = registry.add("fDeuteronTPCPID", "#it{N}_{#sigma}^{TPC} vs. #it{p} for selected deuterons;#it{p} (GeV/#it{c});#it{N}_{#sigma}^{TPC}", HistType::kTH2D, {pAxis, nSigmaAxis}); + hDeuteronTOFPID = registry.add("fDeuteronTOFPID", "#it{N}_{#sigma}^{TOF} vs. #it{p} for selected deuterons;#it{p} (GeV/#it{c});#it{N}_{#sigma}^{TOF}", HistType::kTH2D, {pAxis, nSigmaAxis}); hV0Selected = registry.add("fV0Selected", "Selections for V0s;;counts", HistType::kTH2D, {{9, -0.5, 8.5}, {kNV0, -0.5, +kNV0 - 0.5}}); @@ -491,8 +493,9 @@ struct HfFilter { // Main struct for HF triggers auto massD0BarCand = RecoDecay::m(std::array{pVecPos, pVecNeg}, std::array{massKa, massPi}); auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); + auto tracksWithItsPid = soa::Attach(tracks); for (const auto& trackId : trackIdsThisCollision) { // start loop over tracks - auto track = tracks.rawIteratorAt(trackId.trackId()); + auto track = tracksWithItsPid.rawIteratorAt(trackId.trackId()); if (track.globalIndex() == trackPos.globalIndex() || track.globalIndex() == trackNeg.globalIndex()) { continue; @@ -976,9 +979,10 @@ struct HfFilter { // Main struct for HF triggers } // end high-pT selection auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); + auto tracksWithItsPid = soa::Attach(tracks); for (const auto& trackId : trackIdsThisCollision) { // start loop over track indices as associated to this collision in HF code - auto track = tracks.rawIteratorAt(trackId.trackId()); + auto track = tracksWithItsPid.rawIteratorAt(trackId.trackId()); if (track.globalIndex() == trackFirst.globalIndex() || track.globalIndex() == trackSecond.globalIndex() || track.globalIndex() == trackThird.globalIndex()) { continue; } diff --git a/EventFiltering/PWGHF/HFFilterHelpers.h b/EventFiltering/PWGHF/HFFilterHelpers.h index 7540f276962..dd88a9d9050 100644 --- a/EventFiltering/PWGHF/HFFilterHelpers.h +++ b/EventFiltering/PWGHF/HFFilterHelpers.h @@ -281,11 +281,14 @@ static const std::vector labelsColumnsCutsPt = {"Beauty", "DstarPlu static const std::vector labelsRowsCutsPt = {"Minimum", "Maximum"}; // PID cuts -constexpr float cutsNsigma[3][7] = {{3., 3., 3., 5., 3., 3., 5.}, // TPC proton from Lc, pi/K from D0, K from 3-prong, femto selected proton, pi/K from Xic/Omegac, K from Xic*->SigmaC-Kaon, femto selected deuteron - {3., 3., 3., 2.5, 3., 3., 5.}, // TOF proton from Lc, pi/K from D0, K from 3-prong, femto selected proton, pi/K from Xic/Omegac, K from Xic*->SigmaC-Kaon, femto selected deuteron - {999., 999., 999., 2.5, 999., 999., 5.}}; // Sum in quadrature of TPC and TOF (used only for femto selected proton and deuteron for pT < 4 GeV/c) +constexpr float cutsNsigma[4][7] = { + {3., 3., 3., 5., 3., 3., 5.}, // TPC proton from Lc, pi/K from D0, K from 3-prong, femto selected proton, pi/K from Xic/Omegac, K from Xic*->SigmaC-Kaon, femto selected deuteron + {3., 3., 3., 2.5, 3., 3., 5.}, // TOF proton from Lc, pi/K from D0, K from 3-prong, femto selected proton, pi/K from Xic/Omegac, K from Xic*->SigmaC-Kaon, femto selected deuteron + {999., 999., 999., 2.5, 999., 999., 5.}, // Sum in quadrature of TPC and TOF (used only for femto selected proton and deuteron for pT < 4 GeV/c) + {999., 999., 999., 999., 999., 999., 4.} // used only for femto selected deuteron for less than pt threshold +}; static const std::vector labelsColumnsNsigma = {"PrFromLc", "PiKaFromDZero", "KaFrom3Prong", "PrForFemto", "PiKaFromCharmBaryon", "SoftKaonFromXicResoToSigmaC", "DeForFemto"}; -static const std::vector labelsRowsNsigma = {"TPC", "TOF", "Comb"}; +static const std::vector labelsRowsNsigma = {"TPC", "TOF", "Comb", "ITS"}; // high pt constexpr float cutsHighPtThresholds[1][2] = {{8., 8.}}; // 2-prongs, 3-prongs @@ -436,8 +439,8 @@ class HfFilterHelper mPtMaxCharmBaryonBachelor = maxPt; } - void setNsigmaProtonCutsForFemto(std::array nSigmaCuts) { mNSigmaPrCutsForFemto = nSigmaCuts; } - void setNsigmaDeuteronCutsForFemto(std::array nSigmaCuts) { mNSigmaDeCutsForFemto = nSigmaCuts; } + void setNsigmaProtonCutsForFemto(std::array nSigmaCuts) { mNSigmaPrCutsForFemto = nSigmaCuts; } + void setNsigmaDeuteronCutsForFemto(std::array nSigmaCuts) { mNSigmaDeCutsForFemto = nSigmaCuts; } void setNsigmaProtonCutsForCharmBaryons(float nSigmaTpc, float nSigmaTof) { mNSigmaTpcPrCutForCharmBaryons = nSigmaTpc; @@ -633,8 +636,8 @@ class HfFilterHelper float mPtMinSigmaC2520Zero{0.f}; // pt min SigmaC(2520)0 candidate float mPtMinSigmaCPlusPlus{0.f}; // pt min SigmaC++ candidate float mPtMinSigmaC2520PlusPlus{0.f}; // pt min SigmaC(2520)++ candidate - std::array mNSigmaPrCutsForFemto{3., 3., 3.}; // cut values for Nsigma TPC, TOF, combined for femto protons - std::array mNSigmaDeCutsForFemto{3., 3., 3.}; // cut values for Nsigma TPC, TOF, combined for femto deuterons + std::array mNSigmaPrCutsForFemto{3., 3., 3., 4.}; // cut values for Nsigma TPC, TOF, combined, ITS for femto protons + std::array mNSigmaDeCutsForFemto{3., 3., 3., 4.}; // cut values for Nsigma TPC, TOF, combined, ITS for femto deuterons float mNSigmaTpcPrCutForCharmBaryons{3.}; // maximum Nsigma TPC for protons in Lc and Xic decays float mNSigmaTofPrCutForCharmBaryons{3.}; // maximum Nsigma TOF for protons in Lc and Xic decays float mNSigmaTpcKaCutFor3Prongs{3.}; // maximum Nsigma TPC for kaons in 3-prong decays @@ -802,7 +805,7 @@ inline bool HfFilterHelper::isSelectedTrack4Femto(const T1& track, const T2& tra { float pt = trackPar.getPt(); float ptMin, ptMax, ptThresholdPidStrategy; - std::array nSigmaCuts; + std::array nSigmaCuts; bool forceTof = false; // flag to force TOF PID // Assign particle-specific parameters @@ -838,6 +841,7 @@ inline bool HfFilterHelper::isSelectedTrack4Femto(const T1& track, const T2& tra return false; // use only global tracks } // PID evaluation + float NSigmaITS = (trackSpecies == kProtonForFemto) ? track.itsNSigmaPr() : track.itsNSigmaDe(); // only used for deuteron float NSigmaTPC = (trackSpecies == kProtonForFemto) ? track.tpcNSigmaPr() : track.tpcNSigmaDe(); float NSigmaTOF = (trackSpecies == kProtonForFemto) ? track.tofNSigmaPr() : track.tofNSigmaDe(); if (!forceTof && !track.hasTOF()) { @@ -872,7 +876,7 @@ inline bool HfFilterHelper::isSelectedTrack4Femto(const T1& track, const T2& tra if (trackSpecies == kDeuteronForFemto) { // Apply different PID strategy in different pt range if (pt <= ptThresholdPidStrategy) { - if (std::fabs(NSigmaTPC) > nSigmaCuts[0]) { // Use only TPC below the threshold + if (std::fabs(NSigmaTPC) > nSigmaCuts[0] && std::fabs(NSigmaITS) > nSigmaCuts[3]) { // Use TPC and ITS below the threshold return false; } } else { From 6208da05444ac56ab26fce1f2dbfdf2bd84f29a4 Mon Sep 17 00:00:00 2001 From: Pritam Chakraborty <47203359+prchakra@users.noreply.github.com> Date: Tue, 11 Feb 2025 20:12:01 +0100 Subject: [PATCH 0154/1650] [PWGCF] FemtoUniverse: Fixing minimum TPCoccupancy cut (#9880) --- .../Tasks/femtoUniversePairTaskTrackTrack3DMultKtExtended.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack3DMultKtExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack3DMultKtExtended.cxx index c5f0b3c6a4a..d80ff0327e8 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack3DMultKtExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack3DMultKtExtended.cxx @@ -137,7 +137,7 @@ struct femtoUniversePairTaskTrackTrack3DMultKtExtended { Configurable ConfIsCent{"ConfIsCent", true, "Condition to choose centrality of multiplicity for mixing"}; Filter collfilter = (o2::aod::femtouniversecollision::multV0M > ConfV0MLow) && (o2::aod::femtouniversecollision::multV0M < ConfV0MHigh) && - (o2::aod::femtouniversecollision::occupancy > ConfTPCOccupancyLow) && (o2::aod::femtouniversecollision::occupancy < ConfTPCOccupancyHigh); + (o2::aod::femtouniversecollision::occupancy >= ConfTPCOccupancyLow) && (o2::aod::femtouniversecollision::occupancy < ConfTPCOccupancyHigh); using FilteredFDCollisions = soa::Filtered>; using FilteredFDCollision = FilteredFDCollisions::iterator; From 1007d0b797fe6ea4904f0422e60aaabb935a2cc6 Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Tue, 11 Feb 2025 20:43:40 +0100 Subject: [PATCH 0155/1650] [PWGLF] Add zorro to non-prompt cascade (#9882) --- PWGLF/Tasks/Strangeness/CMakeLists.txt | 2 +- PWGLF/Tasks/Strangeness/nonPromptCascade.cxx | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Strangeness/CMakeLists.txt b/PWGLF/Tasks/Strangeness/CMakeLists.txt index cd8b9591a97..8979a86ff5e 100644 --- a/PWGLF/Tasks/Strangeness/CMakeLists.txt +++ b/PWGLF/Tasks/Strangeness/CMakeLists.txt @@ -51,7 +51,7 @@ o2physics_add_dpl_workflow(cascadecorrelations o2physics_add_dpl_workflow(non-prompt-cascade SOURCES nonPromptCascade.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2::ReconstructionDataFormats O2Physics::AnalysisCore O2::DetectorsBase + PUBLIC_LINK_LIBRARIES O2::Framework O2::ReconstructionDataFormats O2Physics::AnalysisCore O2::DetectorsBase O2Physics::EventFilteringUtils COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(k0mixedevents diff --git a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx index 428b088166a..14ea3c9e689 100644 --- a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx +++ b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx @@ -26,6 +26,8 @@ #include "DataFormatsTPC/BetheBlochAleph.h" #include "DCAFitter/DCAFitterN.h" #include "DetectorsBase/Propagator.h" +#include "EventFiltering/Zorro.h" +#include "EventFiltering/ZorroSummary.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "Framework/ASoA.h" @@ -191,6 +193,10 @@ struct NonPromptCascadeTask { Configurable cfgCutNclusTPC{"cfgCutNclusTPC", 70, "Minimum number of TPC clusters"}; Configurable> cfgCutsPID{"particlesCutsPID", {cutsPID[0], nParticles, nCutsPID, particlesNames, cutsNames}, "Nuclei PID selections"}; + Configurable cfgSkimmedProcessing{"cfgSkimmedProcessing", true, "Skimmed dataset processing"}; + + Zorro zorro; + OutputObj zorroSummary{"zorroSummary"}; Service ccdb; int mRunNumber = 0; @@ -263,6 +269,7 @@ struct NonPromptCascadeTask { void init(InitContext const&) { + zorroSummary.setObject(zorro.getZorroSummary()); ccdb->setURL(ccdbUrl); ccdb->setFatalWhenNull(true); ccdb->setCaching(true); @@ -652,6 +659,18 @@ struct NonPromptCascadeTask { aod::V0s const& /*v0s*/, TracksExtData const& /*tracks*/, aod::BCsWithTimestamps const&) { + if (cfgSkimmedProcessing) { + int runNumber{-1}; + for (const auto& coll : collisions) { + auto bc = coll.bc_as(); + if (runNumber != bc.runNumber()) { + zorro.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), "fTrackedOmega"); + zorro.populateHistRegistry(registry, bc.runNumber()); + runNumber = bc.runNumber(); + } + zorro.isSelected(bc.globalBC()); /// Just let Zorro do the accounting + } + } fillCandidatesVector(collisions, trackedCascades); for (const auto& c : candidates) { NPCTable(c.matchingChi2, c.deltaPt, c.itsClusSize, c.hasReassociatedCluster, From e53e0b9b38855bdd5631ee9f170421a3d35e36eb Mon Sep 17 00:00:00 2001 From: prottayCMT <61418725+prottayCMT@users.noreply.github.com> Date: Tue, 11 Feb 2025 20:47:41 +0100 Subject: [PATCH 0156/1650] [PWGLF] added q vectors information in strangeness derived data tables (#9837) Co-authored-by: Prottay Das --- PWGLF/DataModel/LFStrangenessTables.h | 2 +- PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGLF/DataModel/LFStrangenessTables.h b/PWGLF/DataModel/LFStrangenessTables.h index e3cd865fae7..01e5767a67a 100644 --- a/PWGLF/DataModel/LFStrangenessTables.h +++ b/PWGLF/DataModel/LFStrangenessTables.h @@ -236,7 +236,7 @@ DECLARE_SOA_TABLE(StraFT0CQVsEv, "AOD", "STRAFT0CQVSEv", //! events used to comp epcalibrationtable::TriggerEventEP); DECLARE_SOA_TABLE(StraZDCSP, "AOD", "STRAZDCSP", //! ZDC SP information spcalibrationtable::TriggerEventSP, - spcalibrationtable::PsiZDCA, spcalibrationtable::PsiZDCC); + spcalibrationtable::PsiZDCA, spcalibrationtable::PsiZDCC, spcalibrationtable::QXZDCA, spcalibrationtable::QXZDCC, spcalibrationtable::QYZDCA, spcalibrationtable::QYZDCC); DECLARE_SOA_TABLE(StraStamps_000, "AOD", "STRASTAMPS", //! information for ID-ing mag field if needed bc::RunNumber, timestamp::Timestamp); DECLARE_SOA_TABLE_VERSIONED(StraStamps_001, "AOD", "STRASTAMPS", 1, //! information for ID-ing mag field if needed diff --git a/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx index f7fb903b432..e4a3350023d 100644 --- a/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx @@ -988,7 +988,7 @@ struct strangederivedbuilder { void processZDCSP(soa::Join::iterator const& collision) { StraZDCSP(collision.triggereventsp(), - collision.psiZDCA(), collision.psiZDCC()); + collision.psiZDCA(), collision.psiZDCC(), collision.qxZDCA(), collision.qxZDCC(), collision.qyZDCA(), collision.qyZDCC()); } void processFT0MQVectors(soa::Join::iterator const& collision) { From f54629e8efebdccd055eefc2cc608245f7090250 Mon Sep 17 00:00:00 2001 From: prottayCMT <61418725+prottayCMT@users.noreply.github.com> Date: Tue, 11 Feb 2025 20:47:54 +0100 Subject: [PATCH 0157/1650] [PWGLF] fixed overwriting of q vectors (#9859) Co-authored-by: Prottay Das --- PWGLF/Tasks/Strangeness/lambdapolsp.cxx | 60 ++++++++++++++----------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdapolsp.cxx b/PWGLF/Tasks/Strangeness/lambdapolsp.cxx index cc9106b3d61..848b43798e9 100644 --- a/PWGLF/Tasks/Strangeness/lambdapolsp.cxx +++ b/PWGLF/Tasks/Strangeness/lambdapolsp.cxx @@ -622,14 +622,24 @@ struct lambdapolsp { auto psiZDCC = collision.psiZDCC(); auto psiZDCA = collision.psiZDCA(); + double modqxZDCA; + double modqyZDCA; + double modqxZDCC; + double modqyZDCC; + if (cqvas) { - qxZDCA = TMath::Sqrt((qxZDCA * qxZDCA) + (qyZDCA * qyZDCA)) * TMath::Cos(psiZDCA); - qyZDCA = TMath::Sqrt((qxZDCA * qxZDCA) + (qyZDCA * qyZDCA)) * TMath::Sin(psiZDCA); - qxZDCC = TMath::Sqrt((qxZDCC * qxZDCC) + (qyZDCC * qyZDCC)) * TMath::Cos(psiZDCC); - qyZDCC = TMath::Sqrt((qxZDCC * qxZDCC) + (qyZDCC * qyZDCC)) * TMath::Sin(psiZDCC); + modqxZDCA = TMath::Sqrt((qxZDCA * qxZDCA) + (qyZDCA * qyZDCA)) * TMath::Cos(psiZDCA); + modqyZDCA = TMath::Sqrt((qxZDCA * qxZDCA) + (qyZDCA * qyZDCA)) * TMath::Sin(psiZDCA); + modqxZDCC = TMath::Sqrt((qxZDCC * qxZDCC) + (qyZDCC * qyZDCC)) * TMath::Cos(psiZDCC); + modqyZDCC = TMath::Sqrt((qxZDCC * qxZDCC) + (qyZDCC * qyZDCC)) * TMath::Sin(psiZDCC); + } else { + modqxZDCA = qxZDCA; + modqyZDCA = qyZDCA; + modqxZDCC = qxZDCC; + modqyZDCC = qyZDCC; } - auto psiZDC = TMath::ATan2((qyZDCC - qyZDCA), (qxZDCC - qxZDCA)); // full event plane + auto psiZDC = TMath::ATan2((modqyZDCC - modqyZDCA), (modqxZDCC - modqxZDCA)); // full event plane if (useonlypsis) { psiZDC = psiZDCC - psiZDCA; } @@ -652,11 +662,11 @@ struct lambdapolsp { ///////////checking v1//////////////////////////////// if (checkwithpub) { - auto QxtQxp = qxZDCA * qxZDCC; - auto QytQyp = qyZDCA * qyZDCC; + auto QxtQxp = modqxZDCA * modqxZDCC; + auto QytQyp = modqyZDCA * modqyZDCC; auto Qxytp = QxtQxp + QytQyp; - auto QxpQyt = qxZDCA * qyZDCC; - auto QxtQyp = qxZDCC * qyZDCA; + auto QxpQyt = modqxZDCA * modqyZDCC; + auto QxtQyp = modqxZDCC * modqyZDCA; histos.fill(HIST("hpQxtQxpvscent"), centrality, QxtQxp); histos.fill(HIST("hpQytQypvscent"), centrality, QytQyp); @@ -664,10 +674,10 @@ struct lambdapolsp { histos.fill(HIST("hpQxpQytvscent"), centrality, QxpQyt); histos.fill(HIST("hpQxtQypvscent"), centrality, QxtQyp); - histos.fill(HIST("hpQxpvscent"), centrality, qxZDCA); - histos.fill(HIST("hpQxtvscent"), centrality, qxZDCC); - histos.fill(HIST("hpQypvscent"), centrality, qyZDCA); - histos.fill(HIST("hpQytvscent"), centrality, qyZDCC); + histos.fill(HIST("hpQxpvscent"), centrality, modqxZDCA); + histos.fill(HIST("hpQxtvscent"), centrality, modqxZDCC); + histos.fill(HIST("hpQypvscent"), centrality, modqyZDCA); + histos.fill(HIST("hpQytvscent"), centrality, modqyZDCC); for (auto track : tracks) { if (!selectionTrack(track)) { @@ -682,24 +692,24 @@ struct lambdapolsp { auto uy = TMath::Sin(GetPhiInRange(track.phi())); // auto py=track.py(); - auto uxQxp = ux * qxZDCA; - auto uyQyp = uy * qyZDCA; + auto uxQxp = ux * modqxZDCA; + auto uyQyp = uy * modqyZDCA; auto uxyQxyp = uxQxp + uyQyp; - auto uxQxt = ux * qxZDCC; - auto uyQyt = uy * qyZDCC; + auto uxQxt = ux * modqxZDCC; + auto uyQyt = uy * modqyZDCC; auto uxyQxyt = uxQxt + uyQyt; - auto oddv1 = ux * (qxZDCA - qxZDCC) + uy * (qyZDCA - qyZDCC); - auto evenv1 = ux * (qxZDCA + qxZDCC) + uy * (qyZDCA + qyZDCC); + auto oddv1 = ux * (modqxZDCA - modqxZDCC) + uy * (modqyZDCA - modqyZDCC); + auto evenv1 = ux * (modqxZDCA + modqxZDCC) + uy * (modqyZDCA + modqyZDCC); auto v21 = TMath::Cos(2 * (GetPhiInRange(track.phi()) - psiZDCA - psiZDCC)); auto v22 = TMath::Cos(2 * (GetPhiInRange(track.phi()) + psiZDCA - psiZDCC)); auto v23 = TMath::Cos(2 * (GetPhiInRange(track.phi()) - psiZDC)); - auto x2Tx1Ax1C = TMath::Cos(2 * GetPhiInRange(track.phi())) * qxZDCA * qxZDCC; - auto x2Ty1Ay1C = TMath::Cos(2 * GetPhiInRange(track.phi())) * qyZDCA * qyZDCC; - auto y2Tx1Ay1C = TMath::Sin(2 * GetPhiInRange(track.phi())) * qxZDCA * qyZDCC; - auto y2Ty1Ax1C = TMath::Sin(2 * GetPhiInRange(track.phi())) * qyZDCA * qxZDCC; - auto x1Ax1C = qxZDCA * qxZDCC; - auto y1Ay1C = qyZDCA * qyZDCC; + auto x2Tx1Ax1C = TMath::Cos(2 * GetPhiInRange(track.phi())) * modqxZDCA * modqxZDCC; + auto x2Ty1Ay1C = TMath::Cos(2 * GetPhiInRange(track.phi())) * modqyZDCA * modqyZDCC; + auto y2Tx1Ay1C = TMath::Sin(2 * GetPhiInRange(track.phi())) * modqxZDCA * modqyZDCC; + auto y2Ty1Ax1C = TMath::Sin(2 * GetPhiInRange(track.phi())) * modqyZDCA * modqxZDCC; + auto x1Ax1C = modqxZDCA * modqxZDCC; + auto y1Ay1C = modqyZDCA * modqyZDCC; if (globalpt) { // if (sign > 0) { From b0082996d69c7f0c66a65d0213786dedcc4e5a30 Mon Sep 17 00:00:00 2001 From: Rafael Manhart <56776511+RafRaf11@users.noreply.github.com> Date: Tue, 11 Feb 2025 21:31:31 +0100 Subject: [PATCH 0158/1650] [PWGLF] Update NucleiEfficiencyTask.cxx (#9874) --- PWGLF/Tasks/Nuspex/NucleiEfficiencyTask.cxx | 28 +++------------------ 1 file changed, 4 insertions(+), 24 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/NucleiEfficiencyTask.cxx b/PWGLF/Tasks/Nuspex/NucleiEfficiencyTask.cxx index c0e78c82a9a..c83f1aef414 100644 --- a/PWGLF/Tasks/Nuspex/NucleiEfficiencyTask.cxx +++ b/PWGLF/Tasks/Nuspex/NucleiEfficiencyTask.cxx @@ -48,7 +48,6 @@ using namespace o2; using namespace o2::track; using namespace o2::framework; using namespace o2::framework::expressions; -// using CollisionCandidates = o2::soa::Join<>; struct NucleiEfficiencyTask { @@ -168,27 +167,11 @@ struct NucleiEfficiencyTask { //*********************************************************************************** - template - int getCentralityMC(CollisionType const& collision) - { - float multiplicity{0.f}; - int centrality = 0; - float collMult{0.f}; - collMult = collision.numContrib(); - - if (collMult > multiplicity) { - centrality = collision.centFT0C(); - multiplicity = collMult; - } - - return centrality; - } - - //*********************************************************************************** - template void process_MC_gen(const McCollisionType& mcCollision, const McParticlesType& mcParticles) { + if (mcCollision.posZ() < -cfgCutVertex || mcCollision.posZ() > cfgCutVertex) + return; MC_gen_reg.fill(HIST("histGenVtxMC"), mcCollision.posZ()); MC_gen_reg.fill(HIST("histCentrality"), mcCollision.impactParameter()); @@ -283,17 +266,14 @@ struct NucleiEfficiencyTask { void process_MC_reco(const CollisionType& collision, const TracksType& tracks, const mcParticlesType& /*mcParticles*/) { - int centrality = getCentralityMC(collision); if (event_selection_MC_sel8 && !collision.sel8()) return; - if (collision.posZ() > cfgCutVertex) - return; MC_recon_reg.fill(HIST("histRecVtxMC"), collision.posZ()); if (!isEventSelected(collision)) return; - if (centrality < minCentrality || centrality > maxCentrality) + if (collision.centFT0C() < minCentrality || collision.centFT0C() > maxCentrality) return; - MC_recon_reg.fill(HIST("histCentrality"), centrality); + MC_recon_reg.fill(HIST("histCentrality"), collision.centFT0C()); for (auto& track : tracks) { const auto particle = track.mcParticle(); From e65422f90df27c9476c2d245ccc157ec69a6423c Mon Sep 17 00:00:00 2001 From: Mario Ciacco Date: Tue, 11 Feb 2025 22:38:19 +0100 Subject: [PATCH 0159/1650] toggle pile-up cuts for pp analysis (#9893) --- PWGLF/TableProducer/Nuspex/ebyeMaker.cxx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/ebyeMaker.cxx b/PWGLF/TableProducer/Nuspex/ebyeMaker.cxx index 2e14f955622..99d2be3dc3c 100644 --- a/PWGLF/TableProducer/Nuspex/ebyeMaker.cxx +++ b/PWGLF/TableProducer/Nuspex/ebyeMaker.cxx @@ -249,7 +249,7 @@ struct ebyeMaker { Configurable triggerCut{"triggerCut", 0x0, "trigger cut to select"}; Configurable kINT7Intervals{"kINT7Intervals", false, "toggle kINT7 trigger selection in the 10-30% and 50-90% centrality intervals (2018 Pb-Pb)"}; - Configurable kUseTPCPileUpCut{"kUseTPCPileUpCut", false, "toggle strong correlation cuts (Run 2)"}; + Configurable kUsePileUpCut{"kUsePileUpCut", false, "toggle strong correlation cuts (Run 2)"}; Configurable kUseEstimatorsCorrelationCut{"kUseEstimatorsCorrelationCut", false, "toggle cut on the correlation between centrality estimators (2018 Pb-Pb)"}; Configurable antidPtMin{"antidPtMin", 0.6f, "minimum antideuteron pT (GeV/c)"}; @@ -1114,7 +1114,7 @@ struct ebyeMaker { if (!(bc.eventCuts() & BIT(aod::Run2EventCuts::kAliEventCutsAccepted))) continue; - if (kUseTPCPileUpCut && !(bc.eventCuts() & BIT(aod::Run2EventCuts::kTPCPileUp))) + if (kUsePileUpCut && !(bc.eventCuts() & BIT(aod::Run2EventCuts::kTPCPileUp))) continue; float v0m = getV0M(bc.globalIndex(), collision.posZ(), fv0as, fv0cs); @@ -1203,6 +1203,9 @@ struct ebyeMaker { if (!(bc.eventCuts() & BIT(aod::Run2EventCuts::kAliEventCutsAccepted))) continue; + if (!(bc.eventCuts() & BIT(aod::Run2EventCuts::kPileUpMV) || bc.eventCuts() & BIT(aod::Run2EventCuts::kTPCPileUp)) && kUsePileUpCut) + continue; + float v0m = getV0M(bc.globalIndex(), collision.posZ(), fv0as, fv0cs); float cV0M = 105.f; if (Run2V0MInfo.mCalibrationStored) { From 3c19382495b1c658eb2a8da72c0cf32812cd898f Mon Sep 17 00:00:00 2001 From: tutripat <73981392+tutripat@users.noreply.github.com> Date: Tue, 11 Feb 2025 23:16:23 +0100 Subject: [PATCH 0160/1650] [PWGLF] Updated task for generated MC (#9892) Co-authored-by: Tulika Tripathy Co-authored-by: ALICE Action Bot --- .../GlobalEventProperties/dndeta-mft-pp.cxx | 96 ++++++++++--------- 1 file changed, 49 insertions(+), 47 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/dndeta-mft-pp.cxx b/PWGLF/Tasks/GlobalEventProperties/dndeta-mft-pp.cxx index 5b67034937a..7a2f4887a7b 100644 --- a/PWGLF/Tasks/GlobalEventProperties/dndeta-mft-pp.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/dndeta-mft-pp.cxx @@ -774,13 +774,13 @@ struct PseudorapidityDensityMFT { } nChargedCentral++; } - - if (nChargedCentral > 0) { - registry.fill(HIST("EventEfficiency"), 2.); - registry.fill(HIST("EventsNtrkZvtxGen_gt0t"), nCharged, - mcCollision.posZ()); + if ((mcCollision.posZ() >= cfgVzCut1) && (mcCollision.posZ() <= cfgVzCut2)) { + if (nChargedCentral > 0) { + registry.fill(HIST("EventEfficiency"), 2.); + registry.fill(HIST("EventsNtrkZvtxGen_gt0t"), nCharged, + mcCollision.posZ()); + } } - //----------- bool atLeastOne = false; bool atLeastOne_gt0 = false; @@ -799,24 +799,25 @@ struct PseudorapidityDensityMFT { auto perCollisionSampleCentral = midtracks.sliceBy(perColCentral, collision.globalIndex()); + if ((collision.posZ() >= cfgVzCut1) && (collision.posZ() <= cfgVzCut2) && (mcCollision.posZ() >= cfgVzCut1) && (mcCollision.posZ() <= cfgVzCut2)) { + if (perCollisionSampleCentral.size() > 0) { + registry.fill(HIST("EventEfficiency"), 5.); + atLeastOne_gt0 = true; + registry.fill(HIST("EventsNtrkZvtxGen_gt0"), + perCollisionSample.size(), collision.posZ()); + } - if (perCollisionSampleCentral.size() > 0) { - registry.fill(HIST("EventEfficiency"), 5.); - atLeastOne_gt0 = true; - registry.fill(HIST("EventsNtrkZvtxGen_gt0"), - perCollisionSample.size(), collision.posZ()); - } - - registry.fill(HIST("EventsZposDiff"), - collision.posZ() - mcCollision.posZ()); - if (useZDiffCut) { - if (std::abs(collision.posZ() - mcCollision.posZ()) > maxZDiff) { - continue; + registry.fill(HIST("EventsZposDiff"), + collision.posZ() - mcCollision.posZ()); + if (useZDiffCut) { + if (std::abs(collision.posZ() - mcCollision.posZ()) > maxZDiff) { + continue; + } } + registry.fill(HIST("EventsNtrkZvtxGen"), perCollisionSample.size(), + collision.posZ()); + ++moreThanOne; } - registry.fill(HIST("EventsNtrkZvtxGen"), perCollisionSample.size(), - collision.posZ()); - ++moreThanOne; } } if (collisions.size() == 0) { @@ -825,37 +826,38 @@ struct PseudorapidityDensityMFT { if (moreThanOne > 1) { registry.fill(HIST("EventsSplitMult"), nCharged); } + if ((mcCollision.posZ() >= cfgVzCut1) && (mcCollision.posZ() <= cfgVzCut2)) { + for (auto& particle : particles) { + auto p = pdg->GetParticle(particle.pdgCode()); + auto charge = 0; + if (p != nullptr) { + charge = static_cast(p->Charge()); + } + if (std::abs(charge) < 3.) { + continue; + } - for (auto& particle : particles) { - auto p = pdg->GetParticle(particle.pdgCode()); - auto charge = 0; - if (p != nullptr) { - charge = static_cast(p->Charge()); - } - if (std::abs(charge) < 3.) { - continue; - } - - registry.fill(HIST("TracksEtaZvtxGen_t"), particle.eta(), - mcCollision.posZ()); - if (perCollisionMCSampleCentral.size() > 0) { - registry.fill(HIST("TracksEtaZvtxGen_gt0t"), particle.eta(), - mcCollision.posZ()); - } - if (atLeastOne) { - registry.fill(HIST("TracksEtaZvtxGen"), particle.eta(), + registry.fill(HIST("TracksEtaZvtxGen_t"), particle.eta(), mcCollision.posZ()); - registry.fill(HIST("TracksPtEtaGen"), particle.pt(), particle.eta()); - if (atLeastOne_gt0) { - registry.fill(HIST("TracksEtaZvtxGen_gt0"), particle.eta(), + if (perCollisionMCSampleCentral.size() > 0) { + registry.fill(HIST("TracksEtaZvtxGen_gt0t"), particle.eta(), mcCollision.posZ()); } - } + if (atLeastOne) { + registry.fill(HIST("TracksEtaZvtxGen"), particle.eta(), + mcCollision.posZ()); + registry.fill(HIST("TracksPtEtaGen"), particle.pt(), particle.eta()); + if (atLeastOne_gt0) { + registry.fill(HIST("TracksEtaZvtxGen_gt0"), particle.eta(), + mcCollision.posZ()); + } + } - registry.fill(HIST("TracksPhiEtaGen"), particle.phi(), particle.eta()); - registry.fill(HIST("TracksPhiZvtxGen"), particle.phi(), - mcCollision.posZ()); - registry.fill(HIST("TracksPtEtaGen_t"), particle.pt(), particle.eta()); + registry.fill(HIST("TracksPhiEtaGen"), particle.phi(), particle.eta()); + registry.fill(HIST("TracksPhiZvtxGen"), particle.phi(), + mcCollision.posZ()); + registry.fill(HIST("TracksPtEtaGen_t"), particle.pt(), particle.eta()); + } } } From 88e859c11cadcc079d70044ddfec496c61c4b04a Mon Sep 17 00:00:00 2001 From: Yash Patley <52608802+yashpatley@users.noreply.github.com> Date: Wed, 12 Feb 2025 04:23:09 +0530 Subject: [PATCH 0161/1650] [PWGCF] Update lambdaR2Correlation.cxx (#9883) --- .../Tasks/lambdaR2Correlation.cxx | 367 ++++++++++-------- 1 file changed, 201 insertions(+), 166 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx index f21427c0a51..f905c4114f0 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx @@ -23,7 +23,6 @@ #include "Framework/ASoAHelpers.h" #include "Framework/runDataProcessing.h" #include "PWGLF/DataModel/LFStrangenessTables.h" -#include "PWGLF/DataModel/mcCentrality.h" #include "CommonConstants/PhysicsConstants.h" #include "Common/Core/RecoDecay.h" #include "CCDB/BasicCCDBManager.h" @@ -49,16 +48,6 @@ DECLARE_SOA_TABLE(LambdaCollisions, "AOD", "LAMBDACOLS", o2::soa::Index<>, aod::collision::PosZ); using LambdaCollision = LambdaCollisions::iterator; -namespace lambdamcgencollision -{ -} -DECLARE_SOA_TABLE(LambdaMcGenCollisions, "AOD", "LMCGENCOLS", o2::soa::Index<>, - lambdacollision::Cent, - o2::aod::mccollision::PosX, - o2::aod::mccollision::PosY, - o2::aod::mccollision::PosZ); -using LambdaMcGenCollision = LambdaMcGenCollisions::iterator; - namespace lambdatrack { DECLARE_SOA_INDEX_COLUMN(LambdaCollision, lambdaCollision); @@ -110,10 +99,9 @@ using LambdaTrackExt = LambdaTracksExt::iterator; namespace lambdamcgentrack { -DECLARE_SOA_INDEX_COLUMN(LambdaMcGenCollision, lambdaMcGenCollision); } DECLARE_SOA_TABLE(LambdaMcGenTracks, "AOD", "LMCGENTRACKS", o2::soa::Index<>, - lambdamcgentrack::LambdaMcGenCollisionId, + lambdatrack::LambdaCollisionId, o2::aod::mcparticle::Px, o2::aod::mcparticle::Py, o2::aod::mcparticle::Pz, @@ -141,12 +129,14 @@ enum CollisionLabels { enum TrackLabels { kTracksBeforeHasMcParticle = 1, kAllV0Tracks, + kNotLambdaNotAntiLambda, + kV0IsBothLambdaAntiLambda, + kNotLambdaAfterSel, + kV0IsLambdaOrAntiLambda, kPassV0DauTrackSel, kPassV0KinCuts, kPassV0TopoSel, - kNotLambdaNotAntiLambda, - kV0AsLambdaAntiLambda, - kPassV0MassWinCuts, + kAllSelPassed, kNotPrimaryLambda, kNotSecondaryLambda, kLambdaDauNotMcParticle, @@ -197,12 +187,13 @@ struct LambdaTableProducer { Produces lambdaCollisionTable; Produces lambdaTrackTable; - Produces lambdaMCGenCollisionTable; Produces lambdaMCGenTrackTable; // Collisions Configurable cMinZVtx{"cMinZVtx", -10.0, "z vertex cut"}; Configurable cMaxZVtx{"cMaxZVtx", 10.0, "z vertex cut"}; + Configurable cMinCent{"cMinCent", 0., "Minimum Centrality"}; + Configurable cMaxCent{"cMaxCent", 100., "Maximum Centrality"}; Configurable cSel8Trig{"cSel8Trig", true, "Sel8 (T0A + T0C) Selection Run3"}; Configurable cInt7Trig{"cInt7Trig", false, "kINT7 MB Trigger"}; Configurable cSel7Trig{"cSel7Trig", false, "Sel7 (V0A + V0C) Selection Run2"}; @@ -220,14 +211,13 @@ struct LambdaTableProducer { Configurable cTrackEtaCut{"cTrackEtaCut", 0.8, "Pseudorapidity cut"}; Configurable cMinTpcCrossedRows{"cMinTpcCrossedRows", 70, "min crossed rows"}; Configurable cTpcNsigmaCut{"cTpcNsigmaCut", 2.0, "TPC NSigma Selection Cut"}; - Configurable cTrackMinDcaXY{"cTrackMinDcaXY", 0.05, "Minimum DcaXY of Daughter Tracks"}; Configurable cIsGlobalTrackWoDca{"cIsGlobalTrackWoDca", true, "Check for Global Track"}; // V0s + Configurable cMinDcaProtonToPV{"cMinDcaProtonToPV", 0.05, "Minimum Proton DCAr to PV"}; + Configurable cMinDcaPionToPV{"cMinDcaPionToPV", 0.05, "Minimum Pion DCAr to PV"}; Configurable cMinV0DcaDaughters{"cMinV0DcaDaughters", 0., "Minimum DCA between V0 daughters"}; Configurable cMaxV0DcaDaughters{"cMaxV0DcaDaughters", 1., "Maximum DCA between V0 daughters"}; - Configurable cMinDcaPosToPV{"cMinDcaPosToPV", 0.05, "Minimum V0 Positive Track DCAr cut to PV"}; - Configurable cMinDcaNegToPV{"cMinDcaNegToPV", 0.05, "Minimum V0 Negative Track DCAr cut to PV"}; Configurable cMinDcaV0ToPV{"cMinDcaV0ToPV", 0.0, "Minimum DCA V0 to PV"}; Configurable cMaxDcaV0ToPV{"cMaxDcaV0ToPV", 999.0, "Maximum DCA V0 to PV"}; Configurable cMinV0TransRadius{"cMinV0TransRadius", 0.5, "Minimum V0 radius from PV"}; @@ -235,11 +225,9 @@ struct LambdaTableProducer { Configurable cMinV0CTau{"cMinV0CTau", 0.0, "Minimum ctau"}; Configurable cMaxV0CTau{"cMaxV0CTau", 30.0, "Maximum ctau"}; Configurable cMinV0CosPA{"cMinV0CosPA", 0.995, "Minimum V0 CosPA to PV"}; - Configurable cLambdaMassWindow{"cLambdaMassWindow", 0.005, "Mass Window to select Lambda"}; Configurable cKshortRejMassWindow{"cKshortRejMassWindow", 0.01, "Reject K0Short Candidates"}; Configurable cKshortRejFlag{"cKshortRejFlag", true, "K0short Mass Rej Flag"}; - Configurable cArmPodCutValue{"cArmPodCutValue", 0.5, "Armentros-Podolanski Slope Parameter"}; - Configurable cArmPodCutFlag{"cArmPodCutFlag", false, "Armentros-Podolanski Cut Flag"}; + Configurable cLambdaMassWindow{"cLambdaMassWindow", 0.005, "Lambda Mass Window"}; // V0s kinmatic acceptance Configurable cMinV0Pt{"cMinV0Pt", 0.8, "Minimum V0 pT"}; @@ -254,6 +242,7 @@ struct LambdaTableProducer { Configurable cRecSecondaryLambda{"cRecSecondaryLambda", false, "Secondary Reconstructed Lambda"}; Configurable cGenPrimaryLambda{"cGenPrimaryLambda", true, "Primary Generated Lambda"}; Configurable cGenDecayChannel{"cGenDecayChannel", true, "Gen Level Decay Channel Flag"}; + Configurable cMcGenDauTrackKinCutFlag{"cMcGenDauTrackKinCutFlag", true, "Gen Level Daughter Track Kinematic Cut Flag"}; // Efficiency Correction Configurable cCorrectionFlag{"cCorrectionFlag", false, "Efficiency Correction Flag"}; @@ -356,7 +345,7 @@ struct LambdaTableProducer { histos.addClone("QA/Lambda/", "QA/AntiLambda/"); // MC Generated Histograms - if (doprocessMCGen) { + if (doprocessMCRecoRun3 || doprocessMCRecoRun2) { // McReco Histos histos.add("Tracks/h2f_tracks_pid_before_sel", "PIDs", kTH2F, {axisPID, axisV0Pt}); histos.add("Tracks/h2f_tracks_pid_after_sel", "PIDs", kTH2F, {axisPID, axisV0Pt}); @@ -388,12 +377,14 @@ struct LambdaTableProducer { histos.get(HIST("Events/h1f_collisions_info"))->GetXaxis()->SetBinLabel(CollisionLabels::kTotCol, "kTotCol"); histos.get(HIST("Events/h1f_collisions_info"))->GetXaxis()->SetBinLabel(CollisionLabels::kPassSelCol, "kPassSelCol"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kAllV0Tracks, "kAllV0Tracks"); + histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kNotLambdaNotAntiLambda, "kNotLambdaNotAntiLambda"); + histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kV0IsBothLambdaAntiLambda, "kV0IsBothLambdaAntiLambda"); + histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kNotLambdaAfterSel, "kNotLambdaAfterSel"); + histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kV0IsLambdaOrAntiLambda, "kV0IsLambdaOrAntiLambda"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPassV0DauTrackSel, "kPassV0DauTrackSel"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPassV0KinCuts, "kPassV0KinCuts"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPassV0TopoSel, "kPassV0TopoSel"); - histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kNotLambdaNotAntiLambda, "kNotLambdaNotAntiLambda"); - histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kV0AsLambdaAntiLambda, "kV0AsLambdaAntiLambda"); - histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPassV0MassWinCuts, "kPassV0MassWinCuts"); + histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kAllSelPassed, "kAllSelPassed"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kEffCorrPt, "kEffCorrPt"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kEffCorrPtRap, "kEffCorrPtRap"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kEffCorrPtRapVz, "kEffCorrPtRapVz"); @@ -452,14 +443,21 @@ struct LambdaTableProducer { return true; } - template - bool selDaughterTracks(T const& track) + // Kinematic Selection + bool kinCutSelection(float const& pt, float const& rap, float const& ptMin, float const& ptMax, float const& rapMax) { - if (track.pt() <= cTrackMinPt || track.pt() >= cTrackMaxPt) { + if (pt <= ptMin || pt >= ptMax || rap >= rapMax) { return false; } - if (std::abs(track.eta()) >= cTrackEtaCut) { + return true; + } + + // Track Selection + template + bool selTrack(T const& track) + { + if (!kinCutSelection(track.pt(), std::abs(track.eta()), cTrackMinPt, cTrackMaxPt, cTrackEtaCut)) { return false; } @@ -467,9 +465,7 @@ struct LambdaTableProducer { return false; } - if (std::abs(track.dcaXY()) <= cTrackMinDcaXY) { - return false; - } + // Apply further tpcCluster and other selection (To be done...) if (cIsGlobalTrackWoDca && !track.isGlobalTrackWoDCA()) { return false; @@ -478,42 +474,42 @@ struct LambdaTableProducer { return true; } - template - bool selLambdaWithTopoKinCuts(C const& col, V const& v0, T const&) + // Daughter Track Selection + template + bool selDaughterTracks(V const& v0, T const&, ParticleType const& v0Type) { - auto postrack = v0.template posTrack_as(); - auto negtrack = v0.template negTrack_as(); + auto posTrack = v0.template posTrack_as(); + auto negTrack = v0.template negTrack_as(); - if (!selDaughterTracks(postrack) || !selDaughterTracks(negtrack)) { + if (!selTrack(posTrack) || !selTrack(negTrack)) { return false; } - histos.fill(HIST("Tracks/h1f_tracks_info"), kPassV0DauTrackSel); - - // pT cut - if (v0.pt() <= cMinV0Pt || v0.pt() >= cMaxV0Pt) { - return false; + // Apply DCA Selection on Daughter Tracks Based on Lambda/AntiLambda daughters + float dcaProton = 0., dcaPion = 0.; + if (v0Type == kLambda) { + dcaProton = std::abs(v0.dcapostopv()); + dcaPion = std::abs(v0.dcanegtopv()); + } else if (v0Type == kAntiLambda) { + dcaPion = std::abs(v0.dcapostopv()); + dcaProton = std::abs(v0.dcanegtopv()); } - // rapidity cut - if (std::abs(v0.yLambda()) >= cMaxV0Rap) { + if (dcaProton < cMinDcaProtonToPV || dcaPion < cMinDcaPionToPV) { return false; } - histos.fill(HIST("Tracks/h1f_tracks_info"), kPassV0KinCuts); + return true; + } + template + bool topoCutSelection(C const& col, V const& v0, T const&) + { + // DCA if (v0.dcaV0daughters() <= cMinV0DcaDaughters || v0.dcaV0daughters() >= cMaxV0DcaDaughters) { return false; } - if (std::abs(v0.dcapostopv()) < cMinDcaPosToPV) { - return false; - } - - if (std::abs(v0.dcanegtopv()) < cMinDcaNegToPV) { - return false; - } - if (v0.dcav0topv() <= cMinDcaV0ToPV || v0.dcav0topv() >= cMaxDcaV0ToPV) { return false; } @@ -533,8 +529,6 @@ struct LambdaTableProducer { return false; } - histos.fill(HIST("Tracks/h1f_tracks_info"), kPassV0TopoSel); - // all selection criterion passed (Return True) return true; } @@ -569,6 +563,11 @@ struct LambdaTableProducer { template bool selLambdaMassWindow(V const& v0, T const&, ParticleType& v0type) { + // Kshort mass rejection hypothesis + if (cKshortRejFlag && (std::abs(v0.mK0Short() - MassK0Short) <= cKshortRejMassWindow)) { + return false; + } + // initialize daughter tracks auto postrack = v0.template posTrack_as(); auto negtrack = v0.template negTrack_as(); @@ -592,27 +591,59 @@ struct LambdaTableProducer { histos.fill(HIST("Tracks/h1f_tracks_info"), kNotLambdaNotAntiLambda); return false; } else if (lambdaFlag && antiLambdaFlag) { // check if the track is identified as lambda and anti-lambda both (DISCARD THIS TRACK) - histos.fill(HIST("Tracks/h1f_tracks_info"), kV0AsLambdaAntiLambda); + histos.fill(HIST("Tracks/h1f_tracks_info"), kV0IsBothLambdaAntiLambda); + return false; + } + + if (lambdaFlag || antiLambdaFlag) { + return true; + } + + histos.fill(HIST("Tracks/h1f_tracks_info"), kNotLambdaAfterSel); + + return false; + } + + template + bool selV0Particle(C const& col, V const& v0, T const& tracks, ParticleType& v0Type) + { + // Apply Lambda Mass Hypothesis + if (!selLambdaMassWindow(v0, tracks, v0Type)) { return false; } - // Armentros-Podolanski Selection - if (cArmPodCutFlag && (std::abs(v0.alpha()) < v0.qtarm() / cArmPodCutValue)) { + histos.fill(HIST("Tracks/h1f_tracks_info"), kV0IsLambdaOrAntiLambda); + + // Apply Daughter Track Selection + if (!selDaughterTracks(v0, tracks, v0Type)) { return false; } - // Kshort mass rejection hypothesis - if (cKshortRejFlag && (std::abs(v0.mK0Short() - MassK0Short) <= cKshortRejMassWindow)) { + histos.fill(HIST("Tracks/h1f_tracks_info"), kPassV0DauTrackSel); + + // Apply Kinematic Selection + float rap = 0.; + if (!cDoEtaAnalysis) { + rap = std::abs(v0.yLambda()); + } else { + rap = std::abs(v0.eta()); + } + + if (!kinCutSelection(v0.pt(), rap, cMinV0Pt, cMaxV0Pt, cMaxV0Rap)) { return false; } - if (lambdaFlag || antiLambdaFlag) { - return true; + histos.fill(HIST("Tracks/h1f_tracks_info"), kPassV0KinCuts); + + // Apply Topological Selection + if (!topoCutSelection(col, v0, tracks)) { + return false; } - histos.fill(HIST("Tracks/h1f_tracks_info"), 23.5); + histos.fill(HIST("Tracks/h1f_tracks_info"), kPassV0TopoSel); - return false; + // All Selection Criterion Passed + return true; } template @@ -763,6 +794,89 @@ struct LambdaTableProducer { histos.fill(HIST(SubDir[part]) + HIST("h2f_neg_prong_tpc_nsigma_pi_vs_p"), negtrack.tpcInnerParam(), negtrack.tpcNSigmaPi()); } + template + void fillLambdaMcGenTable(V const& v0tracks, T const&) + { + ParticleType v0Type = kLambda; + float rap = 0.; + + for (auto const& v0 : v0tracks) { + // Check for corresponding Generator Level Track + if (!v0.has_mcParticle() || !v0.template posTrack_as().has_mcParticle() || !v0.template negTrack_as().has_mcParticle()) { + continue; + } + + // Access corresponding Generator Level Particle + auto mcpart = v0.template mcParticle_as(); + + // check for Lambda first + if (mcpart.pdgCode() == kLambda0) { + v0Type = kLambda; + } else if (mcpart.pdgCode() == kLambda0Bar) { + v0Type = kAntiLambda; + } else { + continue; + } + + // check for Primary Lambdas/AntiLambdas + if (cGenPrimaryLambda && !mcpart.isPhysicalPrimary()) { + continue; + } + + // apply kinematic acceptance + if (!cDoEtaAnalysis) { + rap = mcpart.y(); + } else { + mcpart.eta(); + } + if (!kinCutSelection(mcpart.pt(), std::abs(rap), cMinV0Pt, cMaxV0Pt, cMaxV0Rap)) { + continue; + } + + histos.fill(HIST("Tracks/h1f_tracks_info"), kGenTotAccLambda); + + // get daughter track info and check for decay channel flag + if (!mcpart.has_daughters()) { + histos.fill(HIST("Tracks/h1f_tracks_info"), kGenLambdaNoDau); + continue; + } + auto dautracks = mcpart.template daughters_as(); + std::vector daughterPDGs, daughterIDs; + bool dauKinCutFlag = true; + for (auto const& dautrack : dautracks) { + // check kinematic selection on daughters as well + if (!kinCutSelection(dautrack.pt(), std::abs(dautrack.eta()), cTrackMinPt, cTrackMaxPt, cTrackEtaCut)) { + dauKinCutFlag = false; + } + daughterPDGs.push_back(dautrack.pdgCode()); + daughterIDs.push_back(dautrack.globalIndex()); + } + if (cMcGenDauTrackKinCutFlag && !dauKinCutFlag) { // check daughter acceptance + continue; + } + if (cGenDecayChannel && (std::abs(daughterPDGs[0]) != kProton || std::abs(daughterPDGs[1]) != kPiPlus)) { // check decay channel + continue; + } + + histos.fill(HIST("Tracks/h1f_tracks_info"), kGenLambdaToPrPi); + + if (v0Type == kLambda) { + histos.fill(HIST("McGen/h1f_lambda_daughter_PDG"), daughterPDGs[0]); + histos.fill(HIST("McGen/h1f_lambda_daughter_PDG"), daughterPDGs[1]); + histos.fill(HIST("McGen/h1f_lambda_daughter_PDG"), mcpart.pdgCode()); + } else { + histos.fill(HIST("McGen/h1f_antilambda_daughter_PDG"), daughterPDGs[0]); + histos.fill(HIST("McGen/h1f_antilambda_daughter_PDG"), daughterPDGs[1]); + histos.fill(HIST("McGen/h1f_antilambda_daughter_PDG"), mcpart.pdgCode()); + } + + lambdaMCGenTrackTable(lambdaCollisionTable.lastIndex(), mcpart.px(), mcpart.py(), mcpart.pz(), + mcpart.pt(), mcpart.eta(), mcpart.phi(), mcpart.y(), RecoDecay::m(mcpart.p(), mcpart.e()), + daughterIDs[0], daughterIDs[1], (int8_t)v0Type, -999., -999., 1.); + } + } + + // Lambda Tables template void fillLambdaTables(C const& collision, V const& v0tracks, T const& tracks) { @@ -791,10 +905,20 @@ struct LambdaTableProducer { cent = collision.centRun2V0M(); } + // Apply Centrality Selection + if (cent <= cMinCent || cent >= cMaxCent) { + return; + } + lambdaCollisionTable(cent, collision.posX(), collision.posY(), collision.posZ()); + // Fill MC Generated Level Particle Table + if constexpr (dmc == kMC) { + fillLambdaMcGenTable(v0tracks, tracks); + } + // initialize v0track objects - ParticleType v0type = kLambda; + ParticleType v0Type = kLambda; float mass = 0., corr_fact = 1.; for (auto const& v0 : v0tracks) { @@ -809,18 +933,12 @@ struct LambdaTableProducer { histos.fill(HIST("Tracks/h1f_tracks_info"), kAllV0Tracks); histos.fill(HIST("Tracks/h2f_armpod_before_sel"), v0.alpha(), v0.qtarm()); - // topological and kinematic selection - if (!selLambdaWithTopoKinCuts(collision, v0, tracks)) { - continue; - } - - // select v0 as lambda / anti-lambda - // armeteros-podolanski selection | kshort mass rejection hypothesis - if (!selLambdaMassWindow(v0, tracks, v0type)) { + // Select V0 Particle as Lambda/AntiLambda + if (!selV0Particle(collision, v0, tracks, v0Type)) { continue; } - histos.fill(HIST("Tracks/h1f_tracks_info"), kPassV0MassWinCuts); + histos.fill(HIST("Tracks/h1f_tracks_info"), kAllSelPassed); // we have v0 as lambda // do MC analysis @@ -836,11 +954,11 @@ struct LambdaTableProducer { histos.fill(HIST("Tracks/h2f_armpod_after_sel"), v0.alpha(), v0.qtarm()); // get correction factors and mass - corr_fact = (v0type == kLambda) ? getCorrectionFactors(collision, v0) : getCorrectionFactors(collision, v0); - mass = (v0type == kLambda) ? v0.mLambda() : v0.mAntiLambda(); + corr_fact = (v0Type == kLambda) ? getCorrectionFactors(collision, v0) : getCorrectionFactors(collision, v0); + mass = (v0Type == kLambda) ? v0.mLambda() : v0.mAntiLambda(); // fill lambda qa - if (v0type == kLambda) { + if (v0Type == kLambda) { histos.fill(HIST("Tracks/h1f_lambda_pt_vs_invm"), mass, v0.pt()); fillLambdaQAHistos(collision, v0, tracks); } else { @@ -852,7 +970,7 @@ struct LambdaTableProducer { lambdaTrackTable(lambdaCollisionTable.lastIndex(), v0.px(), v0.py(), v0.pz(), v0.pt(), v0.eta(), v0.phi(), v0.yLambda(), mass, v0.template posTrack_as().index(), v0.template negTrack_as().index(), - (int8_t)v0type, v0.v0cosPA(), v0.dcaV0daughters(), corr_fact); + (int8_t)v0Type, v0.v0cosPA(), v0.dcaV0daughters(), corr_fact); } } @@ -891,88 +1009,6 @@ struct LambdaTableProducer { } PROCESS_SWITCH(LambdaTableProducer, processMCRecoRun2, "Process for Run2 MC Reconstructed", false); - - void processMCGen(soa::Join::iterator const& mcCollision, aod::McParticles const& mcParticles) - { - histos.fill(HIST("McGen/h1f_collisions_info"), 1.5); - - // apply collision cuts - if (mcCollision.posZ() <= cMinZVtx || mcCollision.posZ() >= cMaxZVtx) { - return; - } - - histos.fill(HIST("McGen/h1f_collisions_info"), 2.5); - histos.fill(HIST("McGen/h1f_collision_posZ"), mcCollision.posZ()); - lambdaMCGenCollisionTable(mcCollision.centFT0M(), mcCollision.posX(), mcCollision.posY(), mcCollision.posZ()); - - // initialize track objects - ParticleType v0type = kLambda; - - for (auto const& mcpart : mcParticles) { - - // check for Lambda first - if (mcpart.pdgCode() == kLambda0) { - v0type = kLambda; - } else if (mcpart.pdgCode() == kLambda0Bar) { - v0type = kAntiLambda; - } else { - continue; - } - - // check for Primary Lambdas/AntiLambdas - if (cGenPrimaryLambda && !mcpart.isPhysicalPrimary()) { - continue; - } - - // apply kinematic acceptance - if (mcpart.pt() <= cMinV0Pt || mcpart.pt() >= cMaxV0Pt || std::abs(mcpart.y()) >= cMaxV0Rap) { - continue; - } - - histos.fill(HIST("Tracks/h1f_tracks_info"), kGenTotAccLambda); - - // get daughter track info and check for decay channel flag - if (!mcpart.has_daughters()) { - histos.fill(HIST("Tracks/h1f_tracks_info"), kGenLambdaNoDau); - continue; - } - auto dautracks = mcpart.template daughters_as(); - std::vector daughterPDGs, daughterIDs; - bool dauKinCutFlag = true; - for (auto const& dautrack : dautracks) { - // check kinematic selection on daughters as well - if (dautrack.pt() <= cTrackMinPt || dautrack.pt() >= cTrackMaxPt || std::abs(dautrack.eta()) >= cTrackEtaCut) { - dauKinCutFlag = false; - } - daughterPDGs.push_back(dautrack.pdgCode()); - daughterIDs.push_back(dautrack.globalIndex()); - } - if (!dauKinCutFlag) { // check daughter acceptance - continue; - } - if (cGenDecayChannel && (std::abs(daughterPDGs[0]) != kProton || std::abs(daughterPDGs[1]) != kPiPlus)) { // check decay channel - continue; - } - - histos.fill(HIST("Tracks/h1f_tracks_info"), kGenLambdaToPrPi); - - if (v0type == kLambda) { - histos.fill(HIST("McGen/h1f_lambda_daughter_PDG"), daughterPDGs[0]); - histos.fill(HIST("McGen/h1f_lambda_daughter_PDG"), daughterPDGs[1]); - histos.fill(HIST("McGen/h1f_lambda_daughter_PDG"), mcpart.pdgCode()); - } else { - histos.fill(HIST("McGen/h1f_antilambda_daughter_PDG"), daughterPDGs[0]); - histos.fill(HIST("McGen/h1f_antilambda_daughter_PDG"), daughterPDGs[1]); - histos.fill(HIST("McGen/h1f_antilambda_daughter_PDG"), mcpart.pdgCode()); - } - - lambdaMCGenTrackTable(lambdaMCGenCollisionTable.lastIndex(), mcpart.px(), mcpart.py(), mcpart.pz(), - mcpart.pt(), mcpart.eta(), mcpart.phi(), mcpart.y(), RecoDecay::m(mcpart.p(), mcpart.e()), - daughterIDs[0], daughterIDs[1], (int8_t)v0type, -999., -999., 1.); - } - } - - PROCESS_SWITCH(LambdaTableProducer, processMCGen, "Process for MC Generated", false); }; struct LambdaTracksExtProducer { @@ -1371,20 +1407,19 @@ struct LambdaR2Correlation { PROCESS_SWITCH(LambdaR2Correlation, processDataReco, "Process for Data and MCReco", true); - using LambdaMcGenCollisions = aod::LambdaMcGenCollisions; using LambdaMcGenTracks = aod::LambdaMcGenTracks; SliceCache cachemc; Partition partLambdaMcGenTracks = aod::lambdatrack::v0Type == (int8_t)kLambda; Partition partAntiLambdaMcGenTracks = aod::lambdatrack::v0Type == (int8_t)kAntiLambda; - void processMCGen(LambdaMcGenCollisions::iterator const& mcgencol, LambdaMcGenTracks const&) + void processMCGen(LambdaCollisions::iterator const& mcgencol, LambdaMcGenTracks const&) { histos.fill(HIST("Event/McGen/h1f_collision_posz"), mcgencol.posZ()); histos.fill(HIST("Event/McGen/h1f_ft0m_mult_percentile"), mcgencol.cent()); - auto lambdaMcGenTracks = partLambdaMcGenTracks->sliceByCached(aod::lambdamcgentrack::lambdaMcGenCollisionId, mcgencol.globalIndex(), cachemc); - auto antiLambdaMcGenTracks = partAntiLambdaMcGenTracks->sliceByCached(aod::lambdamcgentrack::lambdaMcGenCollisionId, mcgencol.globalIndex(), cachemc); + auto lambdaMcGenTracks = partLambdaMcGenTracks->sliceByCached(aod::lambdatrack::lambdaCollisionId, mcgencol.globalIndex(), cachemc); + auto antiLambdaMcGenTracks = partAntiLambdaMcGenTracks->sliceByCached(aod::lambdatrack::lambdaCollisionId, mcgencol.globalIndex(), cachemc); analyzeSingles(mcgencol, lambdaMcGenTracks); analyzeSingles(mcgencol, antiLambdaMcGenTracks); From 337de1145c5f4417f92025b9b796e1f13592bbbc Mon Sep 17 00:00:00 2001 From: Giovanni Malfattore <89481844+giovannimalfattore@users.noreply.github.com> Date: Wed, 12 Feb 2025 02:14:23 +0100 Subject: [PATCH 0162/1650] [PWGLF] NucleiTask - Add ITS average cluster size (#9886) --- PWGLF/Tasks/Nuspex/LFNucleiBATask.cxx | 73 +++++++++++++++++++++------ 1 file changed, 57 insertions(+), 16 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/LFNucleiBATask.cxx b/PWGLF/Tasks/Nuspex/LFNucleiBATask.cxx index cfffcc258e3..510529af1de 100644 --- a/PWGLF/Tasks/Nuspex/LFNucleiBATask.cxx +++ b/PWGLF/Tasks/Nuspex/LFNucleiBATask.cxx @@ -102,6 +102,7 @@ struct LFNucleiBATask { // Configurable nsigmaITSTr{"nsigmaITSTr", 3.f, "Value of the Nsigma ITS cut for tritons ( > nSigmaITSTr)"}; Configurable useITSHeCut{"useITSHeCut", false, "Select Helium if compatible with helium hypothesis (via SigmaITS)"}; Configurable nsigmaITSHe{"nsigmaITSHe", -1.f, "Value of the Nsigma ITS cut for helium-3 ( > nSigmaITSHe)"}; + Configurable showAverageClusterSize{"showAverageClusterSize", false, "Show average cluster size"}; } nsigmaITSvar; // Set additional cuts (used for debug) @@ -123,6 +124,7 @@ struct LFNucleiBATask { ConfigurableAxis binsMassDe{"binsMassDe", {180, -1.8, 1.8f}, ""}; ConfigurableAxis binsMassTr{"binsMassTr", {250, -2.5, 2.5f}, ""}; ConfigurableAxis binsMassHe{"binsMassHe", {300, -3., 3.f}, ""}; + ConfigurableAxis avClsBins{"avClsBins", {200, 0, 20}, "Binning in average cluster size"}; // Enable custom cuts/debug functions Configurable enableFiltering{"enableFiltering", false, "Flag to enable filtering for p,d,t,He only -- disable if launch on skimmed dataset!"}; @@ -190,11 +192,26 @@ struct LFNucleiBATask { static constexpr float MassHeliumVal = 2.80839f; static constexpr float MassAlphaVal = 3.72738f; + template + float averageClusterSizeTrk(const TrackType& track) + { + return o2::aod::ITSResponse::averageClusterSize(track.itsClusterSizes()); + } + + float averageClusterSizePerCoslInv(uint32_t itsClusterSizes, float eta) { return o2::aod::ITSResponse::averageClusterSize(itsClusterSizes) * std::cosh(eta); } + + template + float averageClusterSizePerCoslInv(const TrackType& track) + { + return averageClusterSizePerCoslInv(track.itsClusterSizes(), track.eta()); + } + void init(o2::framework::InitContext&) { const AxisSpec pAxis{binsPt, "#it{p} (GeV/#it{c})"}; const AxisSpec ptAxis{binsPt, "#it{p}_{T} (GeV/#it{c})"}; const AxisSpec ptHeAxis{binsPtHe, "#it{p}_{T} (GeV/#it{c})"}; + const AxisSpec pZAxis{binsPt, "#it{p}/z (GeV/#it{c})"}; const AxisSpec ptZHeAxis{binsPtZHe, "#it{p}_{T}/z (GeV/#it{c})"}; const AxisSpec dedxAxis{binsdEdx, "d#it{E}/d#it{x} A.U."}; const AxisSpec betaAxis{binsBeta, "TOF #beta"}; @@ -207,6 +224,8 @@ struct LFNucleiBATask { const AxisSpec sigmaITSAxis{binsSigmaITS, ""}; const AxisSpec sigmaTPCAxis{binsSigmaTPC, ""}; const AxisSpec sigmaTOFAxis{binsSigmaTOF, ""}; + const AxisSpec avClsAxis{avClsBins, ""}; + const AxisSpec avClsEffAxis{avClsBins, " / cosh(#eta)"}; if (doprocessData == true && doprocessMCReco == true) { LOG(fatal) << "Can't enable processData and processMCReco in the same time, pick one!"; @@ -1424,6 +1443,10 @@ struct LFNucleiBATask { // Bethe-Bloch TPC distribution and Beta vs pT TOF distribution histos.add("tracks/h2TPCsignVsTPCmomentum", "TPC <-dE/dX> vs #it{p}/Z; Signed #it{p} (GeV/#it{c}); TPC <-dE/dx> (a.u.)", HistType::kTH2F, {{400, -8.f, 8.f}, {dedxAxis}}); + if (nsigmaITSvar.showAverageClusterSize) { + histos.add("tracks/averageClusterSize", "", HistType::kTH2F, {{pZAxis}, {avClsAxis}}); + histos.add("tracks/averageClusterSizePerCoslInv", "", HistType::kTH2F, {{pZAxis}, {avClsEffAxis}}); + } if (enableDebug) { debugHistos.add("debug/h2TPCsignVsTPCmomentum_AllTracks", "TPC <-dE/dX> vs #it{p}/Z (w/o rejection); Signed #it{p} (GeV/#it{c}); TPC <-dE/dx> (a.u.)", HistType::kTH2F, {{400, -8.f, 8.f}, {dedxAxis}}); debugHistos.add("debug/h2TPCsignVsTPCmomentum_FakeHits", "TPC <-dE/dX> vs #it{p}/Z (Fake hits); Signed #it{p} (GeV/#it{c}); TPC <-dE/dx> (a.u.)", HistType::kTH2F, {{400, -8.f, 8.f}, {dedxAxis}}); @@ -1444,6 +1467,10 @@ struct LFNucleiBATask { if (enableHe) { histos.add("tracks/helium/h2TPCsignVsTPCmomentumHelium", "TPC <-dE/dX> vs #it{p}/Z; Signed #it{p} (GeV/#it{c}); TPC <-dE/dx> (a.u.)", HistType::kTH2F, {{400, 0.f, 8.f}, {dedxAxis}}); histos.add("tracks/helium/h2TPCsignVsTPCmomentumantiHelium", "TPC <-dE/dX> vs #it{p}/Z; Signed #it{p} (GeV/#it{c}); TPC <-dE/dx> (a.u.)", HistType::kTH2F, {{400, 0.f, 8.f}, {dedxAxis}}); + if (nsigmaITSvar.showAverageClusterSize) { + histos.add("tracks/helium/averageClusterSize", "", HistType::kTH2F, {{pZAxis}, {avClsAxis}}); + histos.add("tracks/helium/averageClusterSizePerCoslInv", "", HistType::kTH2F, {{pZAxis}, {avClsEffAxis}}); + } } if (enableAl) { histos.add("tracks/alpha/h2TPCsignVsTPCmomentumAlpha", "TPC <-dE/dX> vs #it{p}/Z; Signed #it{p} (GeV/#it{c}); TPC <-dE/dx> (a.u.)", HistType::kTH2F, {{400, 0.f, 8.f}, {dedxAxis}}); @@ -1503,17 +1530,17 @@ struct LFNucleiBATask { histos.add("tracks/triton/h2antiTritonVspTNSigmaTPC", "NSigmaTPC(#bar{t}) vs pT; #it{p}_{T} (GeV/#it{c}); NSigmaTPC", HistType::kTH2F, {{ptAxis}, {sigmaTPCAxis}}); } if (enableHe) { - histos.add("tracks/helium/h2HeliumVspTNSigmaITSHe", "NSigmaITS(He) vs pT/z; #it{p}_{T}/z (GeV/#it{c}); NSigmaITS(He)", HistType::kTH2F, {{ptZHeAxis}, {sigmaITSAxis}}); - histos.add("tracks/helium/h2antiHeliumVspTNSigmaITSHe", "NSigmaITS(#bar{He}) vs pT/z; #it{p}_{T}/z (GeV/#it{c}); NSigmaITS(#bar{He})", HistType::kTH2F, {{ptZHeAxis}, {sigmaITSAxis}}); + histos.add("tracks/helium/h2HeliumVspTNSigmaITSHe", "NSigmaITS(He) vs p/z; #it{p}/z (GeV/#it{c}); NSigmaITS(He)", HistType::kTH2F, {{pZAxis}, {sigmaITSAxis}}); + histos.add("tracks/helium/h2antiHeliumVspTNSigmaITSHe", "NSigmaITS(#bar{He}) vs p/z; #it{p}/z (GeV/#it{c}); NSigmaITS(#bar{He})", HistType::kTH2F, {{pZAxis}, {sigmaITSAxis}}); - histos.add("tracks/helium/h2HeliumVspTNSigmaITSTr", "NSigmaITS(t) vs pT/z; #it{p}_{T}/z (GeV/#it{c}); NSigmaITS(t)", HistType::kTH2F, {{ptZHeAxis}, {sigmaITSAxis}}); - histos.add("tracks/helium/h2antiHeliumVspTNSigmaITSTr", "NSigmaITS(#bar{t}) vs pT/z; #it{p}_{T}/z (GeV/#it{c}); NSigmaITS(#bar{t})", HistType::kTH2F, {{ptZHeAxis}, {sigmaITSAxis}}); + histos.add("tracks/helium/h2HeliumVspTNSigmaITSTr", "NSigmaITS(t) vs p/z; #it{p}/z (GeV/#it{c}); NSigmaITS(t)", HistType::kTH2F, {{pZAxis}, {sigmaITSAxis}}); + histos.add("tracks/helium/h2antiHeliumVspTNSigmaITSTr", "NSigmaITS(#bar{t}) vs p/z; #it{p}/z (GeV/#it{c}); NSigmaITS(#bar{t})", HistType::kTH2F, {{pZAxis}, {sigmaITSAxis}}); - histos.add("tracks/helium/h2HeliumVspTNSigmaITSHe_wTPCpid", "NSigmaITS(He) vs pT/z; #it{p}_{T}/z (GeV/#it{c}); NSigmaITS(He)", HistType::kTH2F, {{ptZHeAxis}, {sigmaITSAxis}}); - histos.add("tracks/helium/h2antiHeliumVspTNSigmaITSHe_wTPCpid", "NSigmaITS(#bar{He}) vs pT/z; #it{p}_{T}/z (GeV/#it{c}); NSigmaITS(#bar{He})", HistType::kTH2F, {{ptZHeAxis}, {sigmaITSAxis}}); + histos.add("tracks/helium/h2HeliumVspTNSigmaITSHe_wTPCpid", "NSigmaITS(He) vs p/z; #it{p}/z (GeV/#it{c}); NSigmaITS(He)", HistType::kTH2F, {{pZAxis}, {sigmaITSAxis}}); + histos.add("tracks/helium/h2antiHeliumVspTNSigmaITSHe_wTPCpid", "NSigmaITS(#bar{He}) vs p/z; #it{p}/z (GeV/#it{c}); NSigmaITS(#bar{He})", HistType::kTH2F, {{pZAxis}, {sigmaITSAxis}}); - histos.add("tracks/helium/h2HeliumVspTNSigmaITSTr_wTPCpid", "NSigmaITS(t) vs pT/z; #it{p}_{T}/z (GeV/#it{c}); NSigmaITS(t)", HistType::kTH2F, {{ptZHeAxis}, {sigmaITSAxis}}); - histos.add("tracks/helium/h2antiHeliumVspTNSigmaITSTr_wTPCpid", "NSigmaITS(#bar{t}) vs pT/z; #it{p}_{T}/z (GeV/#it{c}); NSigmaITS(#bar{t})", HistType::kTH2F, {{ptZHeAxis}, {sigmaITSAxis}}); + histos.add("tracks/helium/h2HeliumVspTNSigmaITSTr_wTPCpid", "NSigmaITS(t) vs p/z; #it{p}/z (GeV/#it{c}); NSigmaITS(t)", HistType::kTH2F, {{pZAxis}, {sigmaITSAxis}}); + histos.add("tracks/helium/h2antiHeliumVspTNSigmaITSTr_wTPCpid", "NSigmaITS(#bar{t}) vs p/z; #it{p}/z (GeV/#it{c}); NSigmaITS(#bar{t})", HistType::kTH2F, {{pZAxis}, {sigmaITSAxis}}); histos.add("tracks/helium/h2HeliumVspTNSigmaTPC", "NSigmaTPC(He) vs pT/z; #it{p}_{T}/z (GeV/#it{c}); NSigmaTPC", HistType::kTH2F, {{ptZHeAxis}, {sigmaTPCAxis}}); histos.add("tracks/helium/h2antiHeliumVspTNSigmaTPC", "NSigmaTPC(#bar{He}) vs pT/z; #it{p}_{T}/z (GeV/#it{c}); NSigmaTPC", HistType::kTH2F, {{ptZHeAxis}, {sigmaTPCAxis}}); @@ -3629,6 +3656,12 @@ struct LFNucleiBATask { } histos.fill(HIST("tracks/h2TPCsignVsTPCmomentum"), track.tpcInnerParam() / (1.f * track.sign()), track.tpcSignal()); + if constexpr (!IsFilteredData) { + if (nsigmaITSvar.showAverageClusterSize) { + histos.fill(HIST("tracks/averageClusterSize"), track.p(), averageClusterSizeTrk(track)); + histos.fill(HIST("tracks/averageClusterSizePerCoslInv"), track.p(), averageClusterSizePerCoslInv(track)); + } + } if (track.sign() > 0) { if (enablePr && prRapCut) { @@ -4045,24 +4078,32 @@ struct LFNucleiBATask { if (isHeWoTPCpid) { if (outFlagOptions.enableExpSignalTPC) histos.fill(HIST("tracks/helium/h2HeliumTPCExpSignalDiffVsPt"), hePt, track.tpcExpSignalDiffHe()); - histos.fill(HIST("tracks/helium/h2HeliumVspTNSigmaITSTr"), hePt, nITSTr); - histos.fill(HIST("tracks/helium/h2HeliumVspTNSigmaITSHe"), hePt, nITSHe); + histos.fill(HIST("tracks/helium/h2HeliumVspTNSigmaITSTr"), track.p(), nITSTr); + histos.fill(HIST("tracks/helium/h2HeliumVspTNSigmaITSHe"), track.p(), nITSHe); histos.fill(HIST("tracks/helium/h2HeliumVspTNSigmaTPC"), hePt, track.tpcNSigmaHe()); } if (isAntiHeWoTPCpid) { if (outFlagOptions.enableExpSignalTPC) histos.fill(HIST("tracks/helium/h2antiHeliumTPCExpSignalDiffVsPt"), antihePt, track.tpcExpSignalDiffHe()); - histos.fill(HIST("tracks/helium/h2antiHeliumVspTNSigmaITSTr"), antihePt, nITSTr); - histos.fill(HIST("tracks/helium/h2antiHeliumVspTNSigmaITSHe"), antihePt, nITSHe); + histos.fill(HIST("tracks/helium/h2antiHeliumVspTNSigmaITSTr"), track.p(), nITSTr); + histos.fill(HIST("tracks/helium/h2antiHeliumVspTNSigmaITSHe"), track.p(), nITSHe); histos.fill(HIST("tracks/helium/h2antiHeliumVspTNSigmaTPC"), antihePt, track.tpcNSigmaHe()); } if (isHeWTPCpid) { - histos.fill(HIST("tracks/helium/h2HeliumVspTNSigmaITSTr_wTPCpid"), hePt, nITSTr); - histos.fill(HIST("tracks/helium/h2HeliumVspTNSigmaITSHe_wTPCpid"), hePt, nITSHe); + histos.fill(HIST("tracks/helium/h2HeliumVspTNSigmaITSTr_wTPCpid"), track.p(), nITSTr); + histos.fill(HIST("tracks/helium/h2HeliumVspTNSigmaITSHe_wTPCpid"), track.p(), nITSHe); } if (isAntiHeWTPCpid) { - histos.fill(HIST("tracks/helium/h2antiHeliumVspTNSigmaITSTr_wTPCpid"), antihePt, nITSTr); - histos.fill(HIST("tracks/helium/h2antiHeliumVspTNSigmaITSHe_wTPCpid"), antihePt, nITSHe); + histos.fill(HIST("tracks/helium/h2antiHeliumVspTNSigmaITSTr_wTPCpid"), track.p(), nITSTr); + histos.fill(HIST("tracks/helium/h2antiHeliumVspTNSigmaITSHe_wTPCpid"), track.p(), nITSHe); + } + if constexpr (!IsFilteredData) { + if (isHeWTPCpid || isAntiHeWTPCpid) { + if (nsigmaITSvar.showAverageClusterSize) { + histos.fill(HIST("tracks/helium/averageClusterSize"), track.p(), averageClusterSizeTrk(track)); + histos.fill(HIST("tracks/helium/averageClusterSizePerCoslInv"), track.p(), averageClusterSizePerCoslInv(track)); + } + } } // TOF From ac98a3533dec81e133379a93cc6190473f1c3f55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Wed, 12 Feb 2025 07:12:46 +0100 Subject: [PATCH 0163/1650] [PWGLF] Update v0qaanalysis.cxx (#9897) --- PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx b/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx index 37b27e0ac9e..d527e928a9c 100644 --- a/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx +++ b/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx @@ -400,12 +400,12 @@ struct LfV0qaanalysis { v0.negTrack_as().tofNSigmaPi(), v0.posTrack_as().tofNSigmaPi(), v0.posTrack_as().hasTOF(), v0.negTrack_as().hasTOF(), lPDG, isDauK0Short, isDauLambda, isDauAntiLambda, isprimary, mcCollision.centFT0M(), cent, evFlag, v0.alpha(), v0.qtarm(), - v0.posTrack_as().tpcNClsCrossedRows(), v0.posTrack_as().tpcCrossedRowsOverFindableCls(), - v0.posTrack_as().tpcNClsShared(), v0.posTrack_as().itsChi2NCl(), - v0.posTrack_as().tpcChi2NCl(), - v0.negTrack_as().tpcNClsCrossedRows(), v0.negTrack_as().tpcCrossedRowsOverFindableCls(), - v0.negTrack_as().tpcNClsShared(), v0.negTrack_as().itsChi2NCl(), - v0.negTrack_as().tpcChi2NCl()); + v0.posTrack_as().tpcNClsCrossedRows(), v0.posTrack_as().tpcCrossedRowsOverFindableCls(), + v0.posTrack_as().tpcNClsShared(), v0.posTrack_as().itsChi2NCl(), + v0.posTrack_as().tpcChi2NCl(), + v0.negTrack_as().tpcNClsCrossedRows(), v0.negTrack_as().tpcCrossedRowsOverFindableCls(), + v0.negTrack_as().tpcNClsShared(), v0.negTrack_as().itsChi2NCl(), + v0.negTrack_as().tpcChi2NCl()); } } From 440e013f7bb796e474b796b7debb9dc031808e8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Wed, 12 Feb 2025 07:47:31 +0100 Subject: [PATCH 0164/1650] [PWGLF] Update k0_mixed_events.cxx (#9903) --- PWGLF/Tasks/Strangeness/k0_mixed_events.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx b/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx index c061a1fc04e..c095575cee2 100644 --- a/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx +++ b/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx @@ -242,7 +242,7 @@ struct K0MixedEvents { const AxisSpec dcaZAxis{dcaXyBinning, "DCA_{z} (cm)"}; const AxisSpec multPercentileAxis{multPercentileBinning, "Mult. Perc."}; - registry.add("hNEvents", "hNEvents", {HistType::kTH1I, {{11, 0.f, 11.f}}}); + registry.add("hNEvents", "hNEvents", {HistType::kTH1D, {{11, 0.f, 11.f}}}); registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(1, "all"); registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(2, "sel8"); registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(3, "TVX"); From 363b2083bd67f718d9142df725981c41864884a4 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Wed, 12 Feb 2025 16:12:08 +0900 Subject: [PATCH 0165/1650] [PWGEM/Dilepton] update mc study (#9887) --- PWGEM/Dilepton/DataModel/lmeeMLTables.h | 3 +- .../treeCreatorElectronMLDDA.cxx | 988 ++++++------------ PWGEM/Dilepton/Tasks/studyMCTruth.cxx | 2 +- 3 files changed, 347 insertions(+), 646 deletions(-) diff --git a/PWGEM/Dilepton/DataModel/lmeeMLTables.h b/PWGEM/Dilepton/DataModel/lmeeMLTables.h index 1c925cf9bc7..9ab6ed32781 100644 --- a/PWGEM/Dilepton/DataModel/lmeeMLTables.h +++ b/PWGEM/Dilepton/DataModel/lmeeMLTables.h @@ -16,7 +16,6 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/Centrality.h" -#include #ifndef PWGEM_DILEPTON_DATAMODEL_LMEEMLTABLES_H_ #define PWGEM_DILEPTON_DATAMODEL_LMEEMLTABLES_H_ @@ -33,7 +32,7 @@ enum class PID_Label : int { kPion = 2, kKaon = 3, kProton = 4, -}; // this can be used for eID with ITSsa. +}; // this can be used for eID. enum class Track_Type : int { kPrimary = 0, diff --git a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx index 2e5e0164aec..618699bbfee 100644 --- a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx +++ b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx @@ -17,6 +17,7 @@ #include #include #include +#include #include "Math/Vector4D.h" #include "DCAFitter/DCAFitterN.h" #include "Framework/runDataProcessing.h" @@ -40,6 +41,7 @@ #include "PWGEM/Dilepton/DataModel/lmeeMLTables.h" #include "PWGEM/Dilepton/Utils/PairUtilities.h" #include "PWGEM/PhotonMeson/Utils/PCMUtilities.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" using namespace o2; using namespace o2::framework; @@ -72,52 +74,56 @@ struct TreeCreatorElectronMLDDA { "registry", { {"hEventCounter", "hEventCounter", {HistType::kTH1F, {{5, 0.5f, 5.5f}}}}, - {"hAP", "Armenteros Podolanski", {HistType::kTH2F, {{200, -1.f, +1.f}, {250, 0, 0.25}}}}, - {"hXY_Gamma", "photon conversion point in XY;X (cm);Y (cm)", {HistType::kTH2F, {{400, -100, +100}, {400, -100, +100}}}}, - {"hMassGamma_Rxy", "V0 mass gamma", {HistType::kTH2F, {{200, 0, 100}, {100, 0, 0.1}}}}, - {"hCosPA", "V0 cosine of pointing angle", {HistType::kTH1F, {{100, 0.9, 1.f}}}}, - {"hPCA", "V0 distance between 2 legs", {HistType::kTH1F, {{200, 0.f, 2.f}}}}, - {"hMassGamma", "V0 mass gamma", {HistType::kTH1F, {{100, 0, 0.1}}}}, - {"hMassK0Short", "V0 mass K0S", {HistType::kTH1F, {{200, 0.4, 0.6}}}}, - {"hMassLambda", "V0 mass Lambda", {HistType::kTH1F, {{100, 1.05, 1.15}}}}, - {"hMassAntiLambda", "V0 mass AntiLambda", {HistType::kTH1F, {{100, 1.05, 1.15}}}}, + {"V0/hAP", "Armenteros Podolanski", {HistType::kTH2F, {{200, -1.f, +1.f}, {250, 0, 0.25}}}}, + {"V0/hXY_Gamma", "photon conversion point in XY;X (cm);Y (cm)", {HistType::kTH2F, {{400, -100, +100}, {400, -100, +100}}}}, + {"V0/hMassGamma_Rxy", "V0 mass gamma", {HistType::kTH2F, {{200, 0, 100}, {100, 0, 0.1}}}}, + {"V0/hCosPA", "V0 cosine of pointing angle", {HistType::kTH1F, {{100, 0.99, 1.f}}}}, + {"V0/hPCA", "V0 distance between 2 legs", {HistType::kTH1F, {{200, 0.f, 2.f}}}}, + {"V0/hMassGamma", "V0 mass gamma", {HistType::kTH1F, {{100, 0, 0.1}}}}, + {"V0/hMassK0Short", "V0 mass K0S", {HistType::kTH1F, {{200, 0.4, 0.6}}}}, + {"V0/hMassLambda", "V0 mass Lambda", {HistType::kTH1F, {{100, 1.05, 1.15}}}}, + {"V0/hMassAntiLambda", "V0 mass AntiLambda", {HistType::kTH1F, {{100, 1.05, 1.15}}}}, {"hMvsPhiV", "mee vs. phiv", {HistType::kTH2F, {{72, 0, M_PI}, {100, 0, 0.1}}}}, - {"hMvsPhiV_primary", "mee vs. phiv for primary e candidate", {HistType::kTH2F, {{72, 0, M_PI}, {100, 0, 0.1}}}}, - - {"hTPCdEdx_P", "TPC dEdx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, - {"hTOFbeta_P", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, - {"hTPCdEdx_P_El", "TPC dEdx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, - {"hTOFbeta_P_El", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, - {"hTPCdEdx_P_Mu", "TPC dEdx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, - {"hTOFbeta_P_Mu", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, - {"hTPCdEdx_P_Pi", "TPC dEdx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, - {"hTOFbeta_P_Pi", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, - {"hTPCdEdx_P_Ka", "TPC dEdx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, - {"hTOFbeta_P_Ka", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, - {"hTPCdEdx_P_Pr", "TPC dEdx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, - {"hTOFbeta_P_Pr", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, - {"hTPCNsigmaEl_P", "TPC n#sigma_{e} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{e}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - {"hTPCNsigmaMu_P", "TPC n#sigma_{#mu} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{#mu}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - {"hTPCNsigmaPi_P", "TPC n#sigma_{#pi} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{#pi}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - {"hTPCNsigmaKa_P", "TPC n#sigma_{K} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{K}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - {"hTPCNsigmaPr_P", "TPC n#sigma_{p} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{p}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - {"hTOFNsigmaEl_P", "TOF n#sigma_{e} vs. p;p^{ITS-TOF} (GeV/c);n #sigma_{e}^{TOF}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - {"hTOFNsigmaMu_P", "TOF n#sigma_{#mu} vs. p;p^{ITS-TOF} (GeV/c);n #sigma_{#mu}^{TOF}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - {"hTOFNsigmaPi_P", "TOF n#sigma_{#pi} vs. p;p^{ITS-TOF} (GeV/c);n #sigma_{#pi}^{TOF}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - {"hTOFNsigmaKa_P", "TOF n#sigma_{K} vs. p;p^{ITS-TOF} (GeV/c);n #sigma_{K}^{TOF}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - {"hTOFNsigmaPr_P", "TOF n#sigma_{p} vs. p;p^{ITS-TOF} (GeV/c);n #sigma_{p}^{TOF}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, + {"V0/hTPCdEdx_P_El", "TPC dEdx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, + {"V0/hTPCdEdx_P_Mu", "TPC dEdx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, + {"V0/hTPCdEdx_P_Pi", "TPC dEdx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, + {"V0/hTPCdEdx_P_Ka", "TPC dEdx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, + {"V0/hTPCdEdx_P_Pr", "TPC dEdx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, + + {"V0/hTOFbeta_P_El", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, + {"V0/hTOFbeta_P_Mu", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, + {"V0/hTOFbeta_P_Pi", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, + {"V0/hTOFbeta_P_Ka", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, + {"V0/hTOFbeta_P_Pr", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, + + {"V0/hITSobClusterSize_P_El", "mean ITSob cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, + {"V0/hITSobClusterSize_P_Mu", "mean ITSob cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, + {"V0/hITSobClusterSize_P_Pi", "mean ITSob cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, + {"V0/hITSobClusterSize_P_Ka", "mean ITSob cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, + {"V0/hITSobClusterSize_P_Pr", "mean ITSob cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, + + {"PrimaryTrack/hTPCdEdx_P", "TPC dEdx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, + {"PrimaryTrack/hTOFbeta_P", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, + {"PrimaryTrack/hITSobClusterSize_P", "mean ITSob cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, + {"PrimaryTrack/hTPCNsigmaEl_P", "TPC n#sigma_{e} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{e}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, + {"PrimaryTrack/hTPCNsigmaMu_P", "TPC n#sigma_{#mu} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{#mu}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, + {"PrimaryTrack/hTPCNsigmaPi_P", "TPC n#sigma_{#pi} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{#pi}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, + {"PrimaryTrack/hTPCNsigmaKa_P", "TPC n#sigma_{K} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{K}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, + {"PrimaryTrack/hTPCNsigmaPr_P", "TPC n#sigma_{p} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{p}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, + {"PrimaryTrack/hTOFNsigmaEl_P", "TOF n#sigma_{e} vs. p;p^{ITS-TOF} (GeV/c);n #sigma_{e}^{TOF}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, + {"PrimaryTrack/hTOFNsigmaMu_P", "TOF n#sigma_{#mu} vs. p;p^{ITS-TOF} (GeV/c);n #sigma_{#mu}^{TOF}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, + {"PrimaryTrack/hTOFNsigmaPi_P", "TOF n#sigma_{#pi} vs. p;p^{ITS-TOF} (GeV/c);n #sigma_{#pi}^{TOF}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, + {"PrimaryTrack/hTOFNsigmaKa_P", "TOF n#sigma_{K} vs. p;p^{ITS-TOF} (GeV/c);n #sigma_{K}^{TOF}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, + {"PrimaryTrack/hTOFNsigmaPr_P", "TOF n#sigma_{p} vs. p;p^{ITS-TOF} (GeV/c);n #sigma_{p}^{TOF}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - {"Cascade/hAP", "Armenteros Podolanski for cascade", {HistType::kTH2F, {{200, -1.f, +1.f}, {250, 0, 0.25}}}}, - {"Cascade/hAP_V0", "Armenteros Podolanski for #Lambda and #bar{#Lambda}", {HistType::kTH2F, {{200, -1.f, +1.f}, {250, 0, 0.25}}}}, - {"Cascade/hRxy", "R_{xy} of cascade vs. in-V0;R_{xy} of V0 (cm);R_{xy} of cascade (cm)", {HistType::kTH2F, {{200, 0, 20.f}, {200, 0, 20.f}}}}, {"Cascade/hRxy_Xi", "R_{xy} of cascade vs. mass;m_{#Lambda#pi};R_{xy} (cm)", {HistType::kTH2F, {{200, 1.2, 1.4}, {200, 0, 20.f}}}}, {"Cascade/hRxy_Omega", "R_{xy} of cascade vs. mass;m_{#LambdaK};R_{xy} (cm)", {HistType::kTH2F, {{200, 1.6, 1.8}, {200, 0, 20.f}}}}, {"Cascade/hCTau_Xi", "c#tau vs. mass;m_{#Lambda#pi};c#tau (cm)", {HistType::kTH2F, {{200, 1.2, 1.4}, {200, 0, 20.f}}}}, {"Cascade/hCTau_Omega", "c#tau vs. mass;m_{#LambdaK};c#tau (cm)", {HistType::kTH2F, {{200, 1.6, 1.8}, {200, 0, 20.f}}}}, - {"Cascade/hV0CosPA", "V0 cosine of pointing angle", {HistType::kTH1F, {{100, 0.9, 1.f}}}}, + {"Cascade/hV0CosPA", "V0 cosine of pointing angle", {HistType::kTH1F, {{50, 0.95, 1.f}}}}, {"Cascade/hV0PCA", "V0 distance between 2 legs", {HistType::kTH1F, {{200, 0.f, 2.f}}}}, - {"Cascade/hCosPA", "cascade cosine of pointing angle", {HistType::kTH1F, {{100, 0.9, 1.f}}}}, + {"Cascade/hCosPA", "cascade cosine of pointing angle", {HistType::kTH1F, {{100, 0.99, 1.f}}}}, {"Cascade/hPCA", "cascade distance between 2 legs", {HistType::kTH1F, {{200, 0.f, 2.f}}}}, {"Cascade/hMassLambda", "V0 mass Lambda in cascade", {HistType::kTH1F, {{100, 1.05, 1.15}}}}, {"Cascade/hMassAntiLambda", "V0 mass AntiLambda in cascade", {HistType::kTH1F, {{100, 1.05, 1.15}}}}, @@ -125,7 +131,7 @@ struct TreeCreatorElectronMLDDA { {"Cascade/hMassOmega", "cascade mass #Omega", {HistType::kTH1F, {{200, 1.6, 1.8}}}}, {"Cascade/hMassPt_Xi", "cascade mass #Xi;m_{#Lambda#pi} (GeV/c^{2});p_{T,#Lambda#pi} (GeV/c)", {HistType::kTH2F, {{200, 1.2, 1.4}, {100, 0, 10}}}}, {"Cascade/hMassPt_Xi_bachelor", "cascade mass #Xi;m_{#Lambda#pi} (GeV/c^{2});p_{T,#pi} (GeV/c)", {HistType::kTH2F, {{200, 1.2, 1.4}, {100, 0, 10}}}}, - {"Cascade/hMassPt_Omega", "cascade mass #Omegam_{#LambdaK} (GeV/c^{2});p_{T,#LambdaK} (GeV/c)", {HistType::kTH2F, {{200, 1.6, 1.8}, {100, 0, 10}}}}, + {"Cascade/hMassPt_Omega", "cascade mass;#Omegam_{#LambdaK} (GeV/c^{2});p_{T,#LambdaK} (GeV/c)", {HistType::kTH2F, {{200, 1.6, 1.8}, {100, 0, 10}}}}, {"Cascade/hMassPt_Omega_bachelor", "cascade mass #Omega;m_{#LambdaK} (GeV/c^{2});p_{T,K} (GeV/c)", {HistType::kTH2F, {{200, 1.6, 1.8}, {100, 0, 10}}}}, }, }; @@ -140,76 +146,104 @@ struct TreeCreatorElectronMLDDA { Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; Configurable skipGRPOquery{"skipGRPOquery", true, "skip grpo query"}; // Operation and minimisation criteria - Configurable d_bz_input{"d_bz", -999, "bz field, -999 is automatic"}; - Configurable d_UseAbsDCA{"d_UseAbsDCA", true, "Use Abs DCAs"}; - Configurable d_UseWeightedPCA{"d_UseWeightedPCA", false, "Vertices use cov matrices"}; + Configurable d_bz_input{"d_bz_input", -999, "bz field, -999 is automatic"}; Configurable useMatCorrType{"useMatCorrType", 0, "0: none, 1: TGeo, 2: LUT"}; - // TPC-related variables - Configurable mincrossedrows{"mincrossedrows", 40, "min. crossed rows"}; - Configurable maxchi2tpc{"maxchi2tpc", 5.0, "max. chi2/NclsTPC"}; - - // ITS-related variables - Configurable minitsibncls{"minitsibncls", 1, "min. number of ITSib clusters"}; - Configurable minitsncls{"minitsncls", 4, "min. number of ITS clusters"}; - Configurable maxchi2its{"maxchi2its", 6.0, "max. chi2/NclsITS"}; - - // for v0 - Configurable max_mee_pcm{"max_mee_pcm", 0.02, "max mee to v0 photon"}; - Configurable minv0cospa{"minv0cospa", 0.997, "minimum V0 CosPA"}; - Configurable maxdcav0dau{"maxdcav0dau", 0.2, "max distance between V0 Daughters"}; - Configurable mindcaxytopv_v0leg{"mindcaxytopv_v0leg", -1, "max dcaxy to pv for v0 leg"}; // 0.05 cm Configurable downscaling_electron{"downscaling_electron", 0.005, "down scaling factor to store electron"}; Configurable downscaling_pion{"downscaling_pion", 0.001, "down scaling factor to store pion"}; Configurable downscaling_kaon{"downscaling_kaon", 1.1, "down scaling factor to store kaon"}; Configurable downscaling_proton{"downscaling_proton", 0.01, "down scaling factor to store proton"}; - - // for pion - Configurable minTPCNsigmaPi{"minTPCNsigmaPi", -1e+10, "min. TPC n sigma for pion inclusion"}; // this is only for IsElectronTag - Configurable maxTPCNsigmaPi{"maxTPCNsigmaPi", 3.0, "max. TPC n sigma for pion inclusion"}; - Configurable maxTOFNsigmaPi{"maxTOFNsigmaPi", 3.0, "max. TOF n sigma for pion inclusion"}; - - // for kaon - Configurable maxTPCNsigmaKa{"maxTPCNsigmaKa", 3.0, "max. TPC n sigma for kaon inclusion"}; - Configurable maxTOFNsigmaKa{"maxTOFNsigmaKa", 3.0, "max. TOF n sigma for kaon inclusion"}; - - // for proton - Configurable maxTPCNsigmaPr{"maxTPCNsigmaPr", 3.0, "max. TPC n sigma for proton inclusion"}; - Configurable maxTOFNsigmaPr{"maxTOFNsigmaPr", 3.0, "max. TOF n sigma for proton inclusion"}; - - // for phiv vs. mee - Configurable minpt{"minpt", 0.05, "min pt for global tracks"}; - Configurable maxeta{"maxeta", 0.9, "max. eta for global tracks"}; - Configurable maxdcaXY{"maxdcaXY", 0.5, "max. DCA in XY"}; - Configurable maxdcaZ{"maxdcaZ", 0.5, "max. DCA in Z"}; - Configurable minTPCNsigmaEl{"minTPCNsigmaEl", -3.0, "min. TPC n sigma for electron inclusion"}; - Configurable maxTPCNsigmaEl{"maxTPCNsigmaEl", 3.0, "max. TPC n sigma for electron inclusion"}; - Configurable maxTOFNsigmaEl{"maxTOFNsigmaEl", 3.0, "max. TOF n sigma for electron inclusion"}; + Configurable store_v0photons{"store_v0photons", false, "create training data from v0 photons"}; Configurable slope{"slope", 0.0185, "slope for m vs. phiv"}; Configurable intercept{"intercept", -0.0380, "intercept for m vs. phiv"}; - Configurable max_mee_pi0{"max_mee_pi0", -1, "max mee to tag ee from pi0"}; // 0.04 GeV/c2 - Configurable downscaling_primary_electron{"downscaling_primary_electron", 0.1, "down scaling factor to store electron"}; - Configurable downscaling_secondary_electron{"downscaling_secondary_electron", 0.1, "down scaling factor to store electron"}; - - // for cascade - Configurable minv0cospa_casc{"minv0cospa_casc", 0.97, "minimum V0 CosPA in cascade"}; - Configurable maxdcav0dau_casc{"maxdcav0dau_casc", 0.2, "max distance between V0 Daughters in cascade"}; - Configurable min_casc_cospa{"min_casc_cospa", 0.99, "minimum cascade CosPA"}; - Configurable max_casc_dcadau{"max_casc_dcadau", 0.4, "max distance between bachelor and V0"}; - Configurable min_v0rxy_in_cascade{"min_v0rxy_in_cascade", 1.2, "minimum V0 rxy in cascade"}; - Configurable min_cascade_rxy{"min_cascade_rxy", 0.5, "minimum V0 rxy in cascade"}; - Configurable min_dcav0topv_casc{"min_dcav0topv_casc", 0.04, "min 3D dca from V0 in cascade to PV"}; - Configurable mindcaxytopv_v0leg_casc{"mindcaxytopv_v0leg_casc", -1, "max dcaxy to pv for v0 leg in cascade"}; // 0.03 cm - Configurable mindcaxytopv_bach_casc{"mindcaxytopv_bach_casc", -1, "max dcaxy to pv for bachelor in cascade"}; // 0.03 cm + + struct : ConfigurableGroup { + std::string prefix = "trackcut_group"; + Configurable cfg_min_pt{"cfg_min_pt", 0.05, "min pt for v0 legs"}; + Configurable cfg_max_eta{"cfg_max_eta", 0.9, "max. eta for v0 legs"}; + Configurable cfg_min_cr2findable_ratio_tpc{"cfg_min_cr2findable_ratio_tpc", 0.8, "min. TPC Ncr/Nf ratio"}; + Configurable cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 0.7, "max fraction of shared clusters in TPC"}; + Configurable cfg_min_ncrossedrows_tpc{"cfg_min_ncrossedrows_tpc", 70, "min ncrossed rows"}; + Configurable cfg_min_ncluster_tpc{"cfg_min_ncluster_tpc", 0, "min ncluster tpc"}; + Configurable cfg_min_ncluster_its{"cfg_min_ncluster_its", 4, "min ncluster its"}; + Configurable cfg_min_ncluster_itsib{"cfg_min_ncluster_itsib", 1, "min ncluster itsib"}; + Configurable cfg_max_chi2tpc{"cfg_max_chi2tpc", 5.0, "max chi2/NclsTPC"}; + Configurable cfg_max_chi2its{"cfg_max_chi2its", 6.0, "max chi2/NclsITS"}; + Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 0.3, "max dca XY in cm"}; + } trackcuts; + + struct : ConfigurableGroup { + std::string prefix = "v0cut_group"; + Configurable cfg_min_pt{"cfg_min_pt", 0.05, "min pt for v0 legs"}; + Configurable cfg_max_eta{"cfg_max_eta", 0.9, "max. eta for v0 legs"}; + Configurable cfg_min_mass_photon{"cfg_min_mass_photon", 0.00, "min mass for photon conversion"}; + Configurable cfg_max_mass_photon{"cfg_max_mass_photon", 0.02, "max mass for photon conversion"}; + Configurable cfg_min_mass_k0s{"cfg_min_mass_k0s", 0.490, "min mass for K0S"}; + Configurable cfg_max_mass_k0s{"cfg_max_mass_k0s", 0.505, "max mass for K0S"}; + Configurable cfg_min_mass_lambda{"cfg_min_mass_lambda", 1.11, "min mass for Lambda rejection"}; + Configurable cfg_max_mass_lambda{"cfg_max_mass_lambda", 1.12, "max mass for Lambda rejection"}; + Configurable cfg_min_cospa{"cfg_min_cospa", 0.999, "min cospa for v0"}; + Configurable cfg_max_dcadau{"cfg_max_dcadau", 0.5, "max distance between 2 legs for v0"}; + Configurable cfg_min_radius{"cfg_min_radius", 1.0, "min rxy for v0"}; + Configurable cfg_min_cr2findable_ratio_tpc{"cfg_min_cr2findable_ratio_tpc", 0.8, "min. TPC Ncr/Nf ratio"}; + Configurable cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 0.7, "max fraction of shared clusters in TPC"}; + Configurable cfg_min_ncrossedrows_tpc{"cfg_min_ncrossedrows_tpc", 70, "min ncrossed rows"}; + Configurable cfg_min_ncluster_tpc{"cfg_min_ncluster_tpc", 0, "min ncluster tpc"}; + Configurable cfg_min_ncluster_its{"cfg_min_ncluster_its", 4, "min ncluster its"}; + Configurable cfg_min_ncluster_itsib{"cfg_min_ncluster_itsib", 1, "min ncluster itsib"}; + Configurable cfg_max_chi2tpc{"cfg_max_chi2tpc", 5.0, "max chi2/NclsTPC"}; + Configurable cfg_max_chi2its{"cfg_max_chi2its", 6.0, "max chi2/NclsITS"}; + Configurable cfg_min_dcaxy_v0leg{"cfg_min_dcaxy_v0leg", 0.1, "min dca XY for v0 legs in cm"}; + + Configurable cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -4, "min n sigma e in TPC"}; + Configurable cfg_max_TPCNsigmaEl{"cfg_max_TPCNsigmaEl", +4, "max n sigma e in TPC"}; + Configurable cfg_min_TPCNsigmaPi{"cfg_min_TPCNsigmaPi", -4, "min n sigma pi in TPC"}; + Configurable cfg_max_TPCNsigmaPi{"cfg_max_TPCNsigmaPi", +4, "max n sigma pi in TPC"}; + Configurable cfg_min_TPCNsigmaKa{"cfg_min_TPCNsigmaKa", -4, "min n sigma ka in TPC"}; + Configurable cfg_max_TPCNsigmaKa{"cfg_max_TPCNsigmaKa", +4, "max n sigma ka in TPC"}; + Configurable cfg_min_TPCNsigmaPr{"cfg_min_TPCNsigmaPr", -4, "min n sigma pr in TPC"}; + Configurable cfg_max_TPCNsigmaPr{"cfg_max_TPCNsigmaPr", +4, "max n sigma pr in TPC"}; + + Configurable cfg_min_TOFNsigmaEl{"cfg_min_TOFNsigmaEl", -4, "min n sigma e in TOF"}; + Configurable cfg_max_TOFNsigmaEl{"cfg_max_TOFNsigmaEl", +4, "max n sigma e in TOF"}; + Configurable cfg_min_TOFNsigmaPi{"cfg_min_TOFNsigmaPi", -4, "min n sigma pi in TOF"}; + Configurable cfg_max_TOFNsigmaPi{"cfg_max_TOFNsigmaPi", +4, "max n sigma pi in TOF"}; + Configurable cfg_min_TOFNsigmaKa{"cfg_min_TOFNsigmaKa", -4, "min n sigma ka in TOF"}; + Configurable cfg_max_TOFNsigmaKa{"cfg_max_TOFNsigmaKa", +4, "max n sigma ka in TOF"}; + Configurable cfg_min_TOFNsigmaPr{"cfg_min_TOFNsigmaPr", -4, "min n sigma pr in TOF"}; + Configurable cfg_max_TOFNsigmaPr{"cfg_max_TOFNsigmaPr", +4, "max n sigma pr in TOF"}; + + Configurable cfg_min_TPCNsigmaPi_tight{"cfg_min_TPCNsigmaPi_tight", -2, "min n sigma pi in TPC for Lambda and cascade"}; + Configurable cfg_max_TPCNsigmaPi_tight{"cfg_max_TPCNsigmaPi_tight", +2, "max n sigma pi in TPC for Lambda and cascade"}; + Configurable cfg_min_TPCNsigmaPr_tight{"cfg_min_TPCNsigmaPr_tight", -2, "min n sigma pr in TPC for cascade"}; + Configurable cfg_max_TPCNsigmaPr_tight{"cfg_max_TPCNsigmaPr_tight", +2, "max n sigma pr in TPC for cascade"}; + + Configurable cfg_min_TOFNsigmaPi_tight{"cfg_min_TOFNsigmaPi_tight", -2, "min n sigma pi in TOF for Lambda and cascade"}; + Configurable cfg_max_TOFNsigmaPi_tight{"cfg_max_TOFNsigmaPi_tight", +2, "max n sigma pi in TOF for Lambda and cascade"}; + Configurable cfg_min_TOFNsigmaPr_tight{"cfg_min_TOFNsigmaPr_tight", -2, "min n sigma pr in TOF for cascade"}; + Configurable cfg_max_TOFNsigmaPr_tight{"cfg_max_TOFNsigmaPr_tight", +2, "max n sigma pr in TOF for cascade"}; + } v0cuts; + + struct : ConfigurableGroup { + std::string prefix = "cascadecut_group"; + Configurable cfg_min_mass_lambda{"cfg_min_mass_lambda", 1.11, "min mass for lambda in cascade"}; + Configurable cfg_max_mass_lambda{"cfg_max_mass_lambda", 1.12, "max mass for lambda in cascade"}; + Configurable cfg_min_mass_Xi{"cfg_min_mass_Xi", 1.317, "min mass for Xi"}; + Configurable cfg_max_mass_Xi{"cfg_max_mass_Xi", 1.327, "max mass for Xi"}; + Configurable cfg_min_mass_Omega{"cfg_min_mass_Omega", 1.667, "min mass for Omega"}; + Configurable cfg_max_mass_Omega{"cfg_max_mass_Omega", 1.677, "max mass for Omega"}; + Configurable cfg_min_cospa_v0{"cfg_min_cospa_v0", 0.97, "minimum V0 CosPA in cascade"}; + Configurable cfg_max_dcadau_v0{"cfg_max_dcadau_v0", 0.2, "max distance between V0 Daughters in cascade"}; + Configurable cfg_min_cospa{"cfg_min_cospa", 0.999, "minimum cascade CosPA"}; + Configurable cfg_max_dcadau{"cfg_max_dcadau", 0.4, "max distance between bachelor and V0"}; + Configurable cfg_min_rxy_v0{"cfg_min_rxy_v0", 1.2, "minimum V0 rxy in cascade"}; + Configurable cfg_min_rxy{"cfg_min_rxy", 0.5, "minimum V0 rxy in cascade"}; + } cascadecuts; int mRunNumber; float d_bz; - float maxSnp; // max sine phi for propagation - float maxStep; // max step size (cm) for propagation Service ccdb; o2::base::MatLayerCylSet* lut = nullptr; - o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; - o2::vertexing::DCAFitterN<2> fitter; std::mt19937 engine; std::uniform_real_distribution dist01; @@ -218,8 +252,6 @@ struct TreeCreatorElectronMLDDA { { mRunNumber = 0; d_bz = 0; - maxSnp = 0.85f; // could be changed later - maxStep = 2.00f; // could be changed later ccdb->setURL(ccdburl); ccdb->setCaching(true); @@ -237,22 +269,6 @@ struct TreeCreatorElectronMLDDA { lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get(lutPath)); } - fitter.setPropagateToPCA(true); - fitter.setMaxR(200.); - fitter.setMinParamChange(1e-3); - fitter.setMinRelChi2Change(0.9); - fitter.setMaxDZIni(1e9); - fitter.setMaxChi2(1e9); - fitter.setUseAbsDCA(d_UseAbsDCA); - fitter.setWeightedFinalPCA(d_UseWeightedPCA); - - if (useMatCorrType == 1) { - matCorr = o2::base::Propagator::MatCorrType::USEMatCorrTGeo; - } else if (useMatCorrType == 2) { - matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT; - } - fitter.setMatCorrType(matCorr); - std::random_device seed_gen; engine = std::mt19937(seed_gen()); dist01 = std::uniform_real_distribution(0.0f, 1.0f); @@ -267,7 +283,6 @@ struct TreeCreatorElectronMLDDA { // In case override, don't proceed, please - no CCDB access required if (d_bz_input > -990) { d_bz = d_bz_input; - fitter.setBz(d_bz); o2::parameters::GRPMagField grpmag; if (fabs(d_bz) > 1e-5) { grpmag.setL3Current(30000.f / (d_bz / 5.0f)); @@ -298,8 +313,6 @@ struct TreeCreatorElectronMLDDA { LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; } mRunNumber = bc.runNumber(); - // Set magnetic field value once known - fitter.setBz(d_bz); if (useMatCorrType == 2) { // setMatLUT only after magfield has been initalized (setMatLUT has implicit and problematic init field call if not) @@ -307,57 +320,28 @@ struct TreeCreatorElectronMLDDA { } } - float CalculateDCAStraightToPV(float X, float Y, float Z, float Px, float Py, float Pz, float pvX, float pvY, float pvZ) + template + float meanClusterSizeITS(TTrack const& track) { - return std::sqrt((std::pow((pvY - Y) * Pz - (pvZ - Z) * Py, 2) + std::pow((pvX - X) * Pz - (pvZ - Z) * Px, 2) + std::pow((pvX - X) * Py - (pvY - Y) * Px, 2)) / (Px * Px + Py * Py + Pz * Pz)); - } - - EM_V0_Label checkV0(const float alpha, const float qt) - { - // Gamma cuts - const float cutAlphaG = 0.95; - const float cutQTG = 0.01; - - // K0S cuts - const float cutQTK0S[2] = {0.1075, 0.215}; - const float cutAPK0S[2] = {0.199, 0.8}; // parameters for curved QT cut - - // Lambda & A-Lambda cuts - const float cutQTL = 0.03; - const float cutAlphaL[2] = {0.35, 0.7}; - const float cutAlphaAL[2] = {-0.7, -0.35}; - const float cutAPL[3] = {0.107, -0.69, 0.5}; // parameters for curved QT cut - - // Check for Gamma candidates - if (std::pow(alpha / cutAlphaG, 2) + std::pow(qt / cutQTG, 2) < std::pow(1.f, 2)) { - return EM_V0_Label::kGamma; - } - - // Check for K0S candidates - float q = cutAPK0S[0] * sqrt(abs(1 - alpha * alpha / (cutAPK0S[1] * cutAPK0S[1]))); - if ((qt > cutQTK0S[0]) && (qt < cutQTK0S[1]) && (qt > q)) { - return EM_V0_Label::kK0S; - } - - // Check for Lambda candidates - q = cutAPL[0] * sqrt(abs(1 - ((alpha + cutAPL[1]) * (alpha + cutAPL[1])) / (cutAPL[2] * cutAPL[2]))); - if ((alpha > cutAlphaL[0]) && (alpha < cutAlphaL[1]) && (qt > cutQTL) && (qt < q)) { - return EM_V0_Label::kLambda; + int total_size = 0; + int nl = 0; + for (int il = il0; il < il1; il++) { + if (track.itsClsSizeInLayer(il) > 0) { + total_size += track.itsClsSizeInLayer(il); + nl++; + } } - - // Check for AntiLambda candidates - q = cutAPL[0] * sqrt(abs(1 - ((alpha - cutAPL[1]) * (alpha - cutAPL[1])) / (cutAPL[2] * cutAPL[2]))); - if ((alpha > cutAlphaAL[0]) && (alpha < cutAlphaAL[1]) && (qt > cutQTL) && (qt < q)) { - return EM_V0_Label::kAntiLambda; + if (nl > 0) { + return static_cast(total_size) / static_cast(nl); + } else { + return 0.f; } - - return EM_V0_Label::kUndef; } template - bool IsSelected(TTrack const& track) + bool IsSelectedTrack(TTrack const& track) { - if (abs(track.eta()) > maxeta || track.pt() < minpt) { + if (std::fabs(track.eta()) > trackcuts.cfg_max_eta || track.pt() < trackcuts.cfg_min_pt) { return false; } @@ -365,32 +349,42 @@ struct TreeCreatorElectronMLDDA { return false; } - if (track.itsNClsInnerBarrel() < minitsibncls) { + if (std::fabs(track.dcaXY()) > trackcuts.cfg_max_dcaxy) { return false; } - if (track.itsNCls() < minitsncls) { + + if (track.itsNCls() < trackcuts.cfg_min_ncluster_its) { + return false; + } + if (track.itsNClsInnerBarrel() < trackcuts.cfg_min_ncluster_itsib) { return false; } - if (track.itsChi2NCl() > maxchi2its) { + if (track.itsChi2NCl() > trackcuts.cfg_max_chi2its) { return false; } - if (track.tpcNClsCrossedRows() < mincrossedrows) { + if (track.tpcNClsCrossedRows() < trackcuts.cfg_min_ncrossedrows_tpc) { + return false; + } + if (track.tpcNClsFound() < trackcuts.cfg_min_ncluster_tpc) { + return false; + } + if (track.tpcChi2NCl() > trackcuts.cfg_max_chi2tpc) { return false; } - if (track.tpcChi2NCl() > maxchi2tpc) { + if (track.tpcCrossedRowsOverFindableCls() < trackcuts.cfg_min_cr2findable_ratio_tpc) { return false; } - if (track.tpcCrossedRowsOverFindableCls() < 0.8) { + if (track.tpcFractionSharedCls() > trackcuts.cfg_max_frac_shared_clusters_tpc) { return false; } return true; } template - bool IsSelectedTag(TTrack const& track) + bool IsSelectedV0Leg(TTrack const& track) { - if (abs(track.eta()) > maxeta || track.pt() < minpt) { + if (std::fabs(track.eta()) > v0cuts.cfg_max_eta || track.pt() < v0cuts.cfg_min_pt) { return false; } @@ -398,24 +392,33 @@ struct TreeCreatorElectronMLDDA { return false; } - if (abs(track.dcaXY()) > 0.1 || abs(track.dcaZ()) > 0.1) { + if (std::fabs(track.dcaXY()) < v0cuts.cfg_min_dcaxy_v0leg) { return false; } - if (track.itsNCls() < 5) { + if (track.itsNCls() < v0cuts.cfg_min_ncluster_its) { return false; } - if (track.itsChi2NCl() > 5.f) { + if (track.itsNClsInnerBarrel() < v0cuts.cfg_min_ncluster_itsib) { + return false; + } + if (track.itsChi2NCl() > v0cuts.cfg_max_chi2its) { return false; } - if (track.tpcNClsCrossedRows() < 100) { + if (track.tpcNClsCrossedRows() < v0cuts.cfg_min_ncrossedrows_tpc) { + return false; + } + if (track.tpcNClsFound() < v0cuts.cfg_min_ncluster_tpc) { return false; } - if (track.tpcChi2NCl() > 4.f) { + if (track.tpcChi2NCl() > v0cuts.cfg_max_chi2tpc) { return false; } - if (track.tpcCrossedRowsOverFindableCls() < 0.8) { + if (track.tpcCrossedRowsOverFindableCls() < v0cuts.cfg_min_cr2findable_ratio_tpc) { + return false; + } + if (track.tpcFractionSharedCls() > v0cuts.cfg_max_frac_shared_clusters_tpc) { return false; } return true; @@ -424,38 +427,49 @@ struct TreeCreatorElectronMLDDA { template bool IsElectron(TTrack const& track) { - return (minTPCNsigmaEl < track.tpcNSigmaEl() && track.tpcNSigmaEl() < maxTPCNsigmaEl) && (abs(track.tofNSigmaEl()) < maxTOFNsigmaEl || track.beta() < 0.f); + bool is_El_TPC = v0cuts.cfg_min_TPCNsigmaEl < track.tpcNSigmaEl() && track.tpcNSigmaEl() < v0cuts.cfg_max_TPCNsigmaEl; + bool is_El_TOF = track.hasTOF() ? v0cuts.cfg_min_TOFNsigmaEl < track.tofNSigmaEl() && track.tofNSigmaEl() < v0cuts.cfg_max_TOFNsigmaEl : true; // TOFif + return is_El_TPC && is_El_TOF; } template - bool IsElectronTag(TTrack const& track) + bool IsPion(TTrack const& track) { - if (minTPCNsigmaPi < track.tpcNSigmaPi() && track.tpcNSigmaPi() < maxTPCNsigmaPi) { - return false; // reject pion first - } - if (track.p() < 0.4) { - return abs(track.tpcNSigmaEl()) < 2.f; - } else { - return abs(track.tpcNSigmaEl()) < 2.f && abs(track.tofNSigmaEl()) < 2.f; - } + bool is_Pi_TPC = v0cuts.cfg_min_TPCNsigmaPi < track.tpcNSigmaPi() && track.tpcNSigmaPi() < v0cuts.cfg_max_TPCNsigmaPi; + bool is_Pi_TOF = track.hasTOF() ? v0cuts.cfg_min_TOFNsigmaPi < track.tofNSigmaPi() && track.tofNSigmaPi() < v0cuts.cfg_max_TOFNsigmaPi : true; // TOFif + return is_Pi_TPC && is_Pi_TOF; } template - bool IsPion(TTrack const& track) + bool IsKaon(TTrack const& track) { - return abs(track.tpcNSigmaPi()) < maxTPCNsigmaPi && (abs(track.tofNSigmaPi()) < maxTOFNsigmaPi || track.beta() < 0.f); + bool is_Ka_TPC = v0cuts.cfg_min_TPCNsigmaKa < track.tpcNSigmaKa() && track.tpcNSigmaKa() < v0cuts.cfg_max_TPCNsigmaKa; + bool is_Ka_TOF = track.hasTOF() ? v0cuts.cfg_min_TOFNsigmaKa < track.tofNSigmaKa() && track.tofNSigmaKa() < v0cuts.cfg_max_TOFNsigmaKa : true; // TOFif + return is_Ka_TPC && is_Ka_TOF; } template - bool IsKaon(TTrack const& track) + bool IsProton(TTrack const& track) { - return abs(track.tpcNSigmaKa()) < maxTPCNsigmaKa && (abs(track.tofNSigmaKa()) < maxTOFNsigmaKa || track.beta() < 0.f); + bool is_Pr_TPC = v0cuts.cfg_min_TPCNsigmaPr < track.tpcNSigmaPr() && track.tpcNSigmaPr() < v0cuts.cfg_max_TPCNsigmaPr; + bool is_Pr_TOF = track.hasTOF() ? v0cuts.cfg_min_TOFNsigmaPr < track.tofNSigmaPr() && track.tofNSigmaPr() < v0cuts.cfg_max_TOFNsigmaPr : true; // TOFif + return is_Pr_TPC && is_Pr_TOF; } template - bool IsProton(TTrack const& track) + bool IsPionTight(TTrack const& track) + { + bool is_Pi_TPC = v0cuts.cfg_min_TPCNsigmaPi_tight < track.tpcNSigmaPi() && track.tpcNSigmaPi() < v0cuts.cfg_max_TPCNsigmaPi_tight; + bool is_Pi_TOF = track.hasTOF() ? v0cuts.cfg_min_TOFNsigmaPi_tight < track.tofNSigmaPi() && track.tofNSigmaPi() < v0cuts.cfg_max_TOFNsigmaPi_tight : true; // TOFif + return is_Pi_TPC && is_Pi_TOF; + } + + template + bool IsProtonTight(TTrack const& track) { - return abs(track.tpcNSigmaPr()) < maxTPCNsigmaPr && (abs(track.tofNSigmaPr()) < maxTOFNsigmaPr || track.beta() < 0.f); + bool is_Pr_TPC = v0cuts.cfg_min_TPCNsigmaPr_tight < track.tpcNSigmaPr() && track.tpcNSigmaPr() < v0cuts.cfg_max_TPCNsigmaPr_tight; + bool is_Pr_TOF = track.hasTOF() ? v0cuts.cfg_min_TOFNsigmaPr_tight < track.tofNSigmaPr() && track.tofNSigmaPr() < v0cuts.cfg_max_TOFNsigmaPr_tight : true; // TOFif + return is_Pr_TPC && is_Pr_TOF; } template @@ -474,129 +488,61 @@ struct TreeCreatorElectronMLDDA { } } - Filter collisionFilter_common = nabs(o2::aod::collision::posZ) < 10.f && o2::aod::collision::numContrib > (uint16_t)0 && o2::aod::evsel::sel8 == true; + //! type of V0. 0: built solely for cascades (does not pass standard V0 cuts), 1: standard 2, 3: photon-like with TPC-only use. Regular analysis should always use type 1. + Filter v0Filter = o2::aod::v0data::v0Type == uint8_t(1) && o2::aod::v0data::v0cosPA > v0cuts.cfg_min_cospa.value&& o2::aod::v0data::dcaV0daughters < v0cuts.cfg_max_dcadau.value; + using filteredV0s = soa::Filtered; + + Filter collisionFilter_common = nabs(o2::aod::collision::posZ) < 10.f && o2::aod::evsel::sel8 == true; using filteredMyCollisions = soa::Filtered; //! type of V0. 0: built solely for cascades (does not pass standard V0 cuts), 1: standard 2, 3: photon-like with TPC-only use. Regular analysis should always use type 1 or 3. - Preslice perCollision_v0 = o2::aod::v0::collisionId; - Preslice perCollision_cascade = o2::aod::cascade::collisionId; + Preslice perCollision_v0 = o2::aod::v0data::collisionId; + Preslice perCollision_cascade = o2::aod::cascdata::collisionId; Preslice perCollision_track = o2::aod::track::collisionId; // Don't apply filter to tracks, because posTrack_as<>, negTrack_as<> is used. - Partition posTracks = o2::aod::track::signed1Pt > 0.f && o2::aod::track::pt > minpt&& nabs(o2::aod::track::eta) < maxeta&& o2::aod::track::tpcChi2NCl < maxchi2tpc&& o2::aod::track::itsChi2NCl < maxchi2its&& nabs(o2::aod::track::dcaXY) < maxdcaXY&& nabs(o2::aod::track::dcaZ) < maxdcaZ&& ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::ITS) == true && ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::TPC) == true && (minTPCNsigmaEl < o2::aod::pidtpc::tpcNSigmaEl && o2::aod::pidtpc::tpcNSigmaEl < maxTPCNsigmaEl); - Partition negTracks = o2::aod::track::signed1Pt < 0.f && o2::aod::track::pt > minpt&& nabs(o2::aod::track::eta) < maxeta&& o2::aod::track::tpcChi2NCl < maxchi2tpc&& o2::aod::track::itsChi2NCl < maxchi2its&& nabs(o2::aod::track::dcaXY) < maxdcaXY&& nabs(o2::aod::track::dcaZ) < maxdcaZ&& ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::ITS) == true && ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::TPC) == true && (minTPCNsigmaEl < o2::aod::pidtpc::tpcNSigmaEl && o2::aod::pidtpc::tpcNSigmaEl < maxTPCNsigmaEl); + Partition posTracks = o2::aod::track::signed1Pt > 0.f && ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::ITS) == true && ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::TPC) == true; + Partition negTracks = o2::aod::track::signed1Pt < 0.f && ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::ITS) == true && ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::TPC) == true; std::vector stored_trackIds; - void processPID(filteredMyCollisions const& collisions, aod::BCsWithTimestamps const&, aod::V0s const& v0s, aod::Cascades const& cascades, MyTracks const& tracks) + void processPID(filteredMyCollisions const& collisions, aod::BCsWithTimestamps const&, filteredV0s const& v0s, aod::CascDatas const& cascades, MyTracks const& tracks) { stored_trackIds.reserve(tracks.size()); for (auto& collision : collisions) { registry.fill(HIST("hEventCounter"), 1.0); // all - auto bc = collision.template bc_as(); + auto bc = collision.template foundBC_as(); initCCDB(bc); - if (!collision.selection_bit(aod::evsel::kNoTimeFrameBorder)) { - continue; - } - - std::array pVtx = {collision.posX(), collision.posY(), collision.posZ()}; auto v0s_coll = v0s.sliceBy(perCollision_v0, collision.globalIndex()); for (auto& v0 : v0s_coll) { - if (v0.v0Type() != 1) { - continue; - } auto pos = v0.template posTrack_as(); auto neg = v0.template negTrack_as(); - if (!IsSelected(pos) || !IsSelected(neg)) { + if (!IsSelectedV0Leg(pos) || !IsSelectedV0Leg(neg)) { continue; } if (pos.sign() * neg.sign() > 0) { continue; } - // Calculate DCA with respect to the collision associated to the V0, not individual tracks - gpu::gpustd::array dcaInfo_pos; - auto pTrackPar = getTrackPar(pos); - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, pTrackPar, 2.f, fitter.getMatCorrType(), &dcaInfo_pos); - if (abs(dcaInfo_pos[0]) < mindcaxytopv_v0leg) { - continue; - } - - gpu::gpustd::array dcaInfo_neg; - auto nTrackPar = getTrackPar(neg); - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, nTrackPar, 2.f, fitter.getMatCorrType(), &dcaInfo_neg); - if (abs(dcaInfo_neg[0]) < mindcaxytopv_v0leg) { - continue; - } - - // reconstruct V0s - auto pTrack = getTrackParCov(pos); // positive - auto nTrack = getTrackParCov(neg); // negative - std::array svpos = {0.}; // secondary vertex position - std::array pvec0 = {0.}; - std::array pvec1 = {0.}; - - int nCand = fitter.process(pTrack, nTrack); - if (nCand != 0) { - fitter.propagateTracksToVertex(); - const auto& vtx = fitter.getPCACandidate(); - for (int i = 0; i < 3; i++) { - svpos[i] = vtx[i]; - } - fitter.getTrack(0).getPxPyPzGlo(pvec0); // positive - fitter.getTrack(1).getPxPyPzGlo(pvec1); // negative - } else { - continue; - } - std::array pvxyz{pvec0[0] + pvec1[0], pvec0[1] + pvec1[1], pvec0[2] + pvec1[2]}; - - float v0dca = std::sqrt(fitter.getChi2AtPCACandidate()); // distance between 2 legs. - float v0CosinePA = RecoDecay::cpa(pVtx, svpos, pvxyz); - registry.fill(HIST("hPCA"), v0dca); - registry.fill(HIST("hCosPA"), v0CosinePA); + registry.fill(HIST("V0/hPCA"), v0.dcaV0daughters()); + registry.fill(HIST("V0/hCosPA"), v0.v0cosPA()); + registry.fill(HIST("V0/hAP"), v0.alpha(), v0.qtarm()); - if (v0dca > maxdcav0dau) { + if (v0.dcaV0daughters() > v0cuts.cfg_max_dcadau) { continue; } - if (v0CosinePA < minv0cospa) { + if (v0.v0cosPA() < v0cuts.cfg_min_cospa) { continue; } - float alpha = v0_alpha(pvec0[0], pvec0[1], pvec0[2], pvec1[0], pvec1[1], pvec1[2]); - float qt = v0_qt(pvec0[0], pvec0[1], pvec0[2], pvec1[0], pvec1[1], pvec1[2]); - registry.fill(HIST("hAP"), alpha, qt); - - float mGamma = RecoDecay::m(std::array{std::array{pvec0[0], pvec0[1], pvec0[2]}, std::array{pvec1[0], pvec1[1], pvec1[2]}}, std::array{o2::constants::physics::MassElectron, o2::constants::physics::MassElectron}); - float mK0Short = RecoDecay::m(std::array{std::array{pvec0[0], pvec0[1], pvec0[2]}, std::array{pvec1[0], pvec1[1], pvec1[2]}}, std::array{o2::constants::physics::MassPionCharged, o2::constants::physics::MassPionCharged}); - float mLambda = RecoDecay::m(std::array{std::array{pvec0[0], pvec0[1], pvec0[2]}, std::array{pvec1[0], pvec1[1], pvec1[2]}}, std::array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged}); - float mAntiLambda = RecoDecay::m(std::array{std::array{pvec0[0], pvec0[1], pvec0[2]}, std::array{pvec1[0], pvec1[1], pvec1[2]}}, std::array{o2::constants::physics::MassPionCharged, o2::constants::physics::MassProton}); - - EM_V0_Label v0id = checkV0(alpha, qt); - if (v0id == EM_V0_Label::kGamma && (IsElectron(pos) && IsElectron(neg))) { - registry.fill(HIST("hMassGamma"), mGamma); - registry.fill(HIST("hXY_Gamma"), svpos[0], svpos[1]); - float rxy = std::sqrt(std::pow(svpos[0], 2) + std::pow(svpos[1], 2)); - registry.fill(HIST("hMassGamma_Rxy"), rxy, mGamma); - if (mGamma < max_mee_pcm && rxy < 38.f) { - if (dist01(engine) < downscaling_electron) { - fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary)); - } - if (dist01(engine) < downscaling_electron) { - fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary)); - } - registry.fill(HIST("hTPCdEdx_P_El"), neg.p(), neg.tpcSignal()); - registry.fill(HIST("hTOFbeta_P_El"), neg.p(), neg.beta()); - registry.fill(HIST("hTPCdEdx_P_El"), pos.p(), pos.tpcSignal()); - registry.fill(HIST("hTOFbeta_P_El"), pos.p(), pos.beta()); - } - } else if (v0id == EM_V0_Label::kK0S && (IsPion(pos) && IsPion(neg))) { - registry.fill(HIST("hMassK0Short"), mK0Short); - if (abs(mK0Short - 0.497) < 0.01) { - registry.fill(HIST("hTPCdEdx_P_Pi"), neg.p(), neg.tpcSignal()); - registry.fill(HIST("hTOFbeta_P_Pi"), neg.p(), neg.beta()); - registry.fill(HIST("hTPCdEdx_P_Pi"), pos.p(), pos.tpcSignal()); - registry.fill(HIST("hTOFbeta_P_Pi"), pos.p(), pos.beta()); + if (IsPion(pos) && IsPion(neg)) { + registry.fill(HIST("V0/hMassK0Short"), v0.mK0Short()); + if (v0cuts.cfg_min_mass_k0s < v0.mK0Short() && v0.mK0Short() < v0cuts.cfg_max_mass_k0s) { + registry.fill(HIST("V0/hTPCdEdx_P_Pi"), neg.p(), neg.tpcSignal()); + registry.fill(HIST("V0/hTOFbeta_P_Pi"), neg.p(), neg.beta()); + registry.fill(HIST("V0/hTPCdEdx_P_Pi"), pos.p(), pos.tpcSignal()); + registry.fill(HIST("V0/hTOFbeta_P_Pi"), pos.p(), pos.beta()); if (dist01(engine) < downscaling_pion) { fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kPion), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary)); } @@ -604,101 +550,87 @@ struct TreeCreatorElectronMLDDA { fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kPion), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary)); } } - } else if (v0id == EM_V0_Label::kLambda && (IsProton(pos) && IsPion(neg))) { - registry.fill(HIST("hMassLambda"), mLambda); - if (abs(mLambda - 1.115) < 0.005) { + } + if (IsProton(pos) && IsPionTight(neg)) { + registry.fill(HIST("V0/hMassLambda"), v0.mLambda()); + if (v0cuts.cfg_min_mass_lambda < v0.mLambda() && v0.mLambda() < v0cuts.cfg_max_mass_lambda) { if (dist01(engine) < downscaling_proton) { fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kProton), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary)); } - registry.fill(HIST("hTPCdEdx_P_Pr"), pos.p(), pos.tpcSignal()); - registry.fill(HIST("hTOFbeta_P_Pr"), pos.p(), pos.beta()); - registry.fill(HIST("hTPCdEdx_P_Pi"), neg.p(), neg.tpcSignal()); - registry.fill(HIST("hTOFbeta_P_Pi"), neg.p(), neg.beta()); - if (dist01(engine) < downscaling_pion) { - fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kPion), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary)); - } + registry.fill(HIST("V0/hTPCdEdx_P_Pr"), pos.p(), pos.tpcSignal()); + registry.fill(HIST("V0/hTOFbeta_P_Pr"), pos.p(), pos.beta()); } - } else if (v0id == EM_V0_Label::kAntiLambda && (IsPion(pos) && IsProton(neg))) { - registry.fill(HIST("hMassAntiLambda"), mAntiLambda); - if (abs(mAntiLambda - 1.115) < 0.005) { - if (dist01(engine) < downscaling_pion) { - fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kPion), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary)); - } + } + if (IsPionTight(pos) && IsProton(neg)) { + registry.fill(HIST("V0/hMassAntiLambda"), v0.mAntiLambda()); + if (v0cuts.cfg_min_mass_lambda < v0.mAntiLambda() && v0.mAntiLambda() < v0cuts.cfg_max_mass_lambda) { if (dist01(engine) < downscaling_proton) { fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kProton), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary)); } - registry.fill(HIST("hTPCdEdx_P_Pr"), neg.p(), neg.tpcSignal()); - registry.fill(HIST("hTOFbeta_P_Pr"), neg.p(), neg.beta()); - registry.fill(HIST("hTPCdEdx_P_Pi"), pos.p(), pos.tpcSignal()); - registry.fill(HIST("hTOFbeta_P_Pi"), pos.p(), pos.beta()); + registry.fill(HIST("V0/hTPCdEdx_P_Pr"), neg.p(), neg.tpcSignal()); + registry.fill(HIST("V0/hTOFbeta_P_Pr"), neg.p(), neg.beta()); } } - } // end of v0 loop - - // extra statistics for electrons tagged by photon conversions - auto posTracks_per_coll = posTracks->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); - auto negTracks_per_coll = negTracks->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); - for (auto& [pos, ele] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, negTracks_per_coll))) { - if (!IsSelected(pos) || !IsSelected(ele)) { - continue; - } - - if (!IsElectron(pos) || !IsElectron(ele)) { - continue; - } - - ROOT::Math::PtEtaPhiMVector v1(ele.pt(), ele.eta(), ele.phi(), o2::constants::physics::MassElectron); - ROOT::Math::PtEtaPhiMVector v2(pos.pt(), pos.eta(), pos.phi(), o2::constants::physics::MassElectron); - ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - float phiv = o2::aod::pwgem::dilepton::utils::pairutil::getPhivPair(pos.px(), pos.py(), pos.pz(), ele.px(), ele.py(), ele.pz(), pos.sign(), ele.sign(), d_bz); - registry.fill(HIST("hMvsPhiV"), phiv, v12.M()); - - if (v12.M() < slope * phiv + intercept) { // photon conversion is found. - if (dist01(engine) < downscaling_electron) { - fillTrackTable(collision, ele, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary)); // secondary in primary electron candidates - } - if (dist01(engine) < downscaling_electron) { - fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary)); // secondary in primary electron candidates + if (IsElectron(pos) && IsElectron(neg) && store_v0photons) { + registry.fill(HIST("V0/hMassGamma"), v0.mGamma()); + registry.fill(HIST("V0/hXY_Gamma"), v0.x(), v0.y()); + registry.fill(HIST("V0/hMassGamma_Rxy"), v0.v0radius(), v0.mGamma()); + if ((v0cuts.cfg_min_mass_photon < v0.mGamma() && v0.mGamma() < v0cuts.cfg_max_mass_photon)) { + if (dist01(engine) < downscaling_electron) { + fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary)); + } + if (dist01(engine) < downscaling_electron) { + fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary)); + } + registry.fill(HIST("V0/hTPCdEdx_P_El"), neg.p(), neg.tpcSignal()); + registry.fill(HIST("V0/hTOFbeta_P_El"), neg.p(), neg.beta()); + registry.fill(HIST("V0/hTPCdEdx_P_El"), pos.p(), pos.tpcSignal()); + registry.fill(HIST("V0/hTOFbeta_P_El"), pos.p(), pos.beta()); } } - if (v12.M() < max_mee_pi0) { // dielectron from pi0 is found. - if (dist01(engine) < downscaling_electron) { - fillTrackTable(collision, ele, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary)); + } // end of v0 loop + + if (!store_v0photons) { + auto posTracks_per_coll = posTracks->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); + auto negTracks_per_coll = negTracks->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); + for (auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, negTracks_per_coll))) { + if (!IsSelectedTrack(pos) || !IsSelectedTrack(neg)) { + continue; } - if (dist01(engine) < downscaling_electron) { - fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary)); + + if (!IsElectron(pos) || !IsElectron(neg)) { + continue; } - } - } // end of ULS pair loop - auto tracks_coll = tracks.sliceBy(perCollision_track, collision.globalIndex()); - for (auto& track : tracks_coll) { - if (!IsSelectedTag(track)) { - continue; - } + ROOT::Math::PtEtaPhiMVector v1(neg.pt(), neg.eta(), neg.phi(), o2::constants::physics::MassElectron); + ROOT::Math::PtEtaPhiMVector v2(pos.pt(), pos.eta(), pos.phi(), o2::constants::physics::MassElectron); + ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; + float phiv = o2::aod::pwgem::dilepton::utils::pairutil::getPhivPair(pos.px(), pos.py(), pos.pz(), neg.px(), neg.py(), neg.pz(), pos.sign(), neg.sign(), d_bz); + registry.fill(HIST("hMvsPhiV"), phiv, v12.M()); - registry.fill(HIST("hTPCdEdx_P"), track.p(), track.tpcSignal()); - registry.fill(HIST("hTOFbeta_P"), track.p(), track.beta()); - registry.fill(HIST("hTPCNsigmaEl_P"), track.p(), track.tpcNSigmaEl()); - registry.fill(HIST("hTOFNsigmaEl_P"), track.p(), track.tofNSigmaEl()); - registry.fill(HIST("hTPCNsigmaMu_P"), track.p(), track.tpcNSigmaMu()); - registry.fill(HIST("hTOFNsigmaMu_P"), track.p(), track.tofNSigmaMu()); - registry.fill(HIST("hTPCNsigmaPi_P"), track.p(), track.tpcNSigmaPi()); - registry.fill(HIST("hTOFNsigmaPi_P"), track.p(), track.tofNSigmaPi()); - registry.fill(HIST("hTPCNsigmaKa_P"), track.p(), track.tpcNSigmaKa()); - registry.fill(HIST("hTOFNsigmaKa_P"), track.p(), track.tofNSigmaKa()); - registry.fill(HIST("hTPCNsigmaPr_P"), track.p(), track.tpcNSigmaPr()); - registry.fill(HIST("hTOFNsigmaPr_P"), track.p(), track.tofNSigmaPr()); - } // end of track loop + if (v12.M() < slope * phiv + intercept) { // photon conversion is found. + registry.fill(HIST("V0/hTPCdEdx_P_El"), neg.p(), neg.tpcSignal()); + registry.fill(HIST("V0/hTOFbeta_P_El"), neg.p(), neg.beta()); + registry.fill(HIST("V0/hTPCdEdx_P_El"), pos.p(), pos.tpcSignal()); + registry.fill(HIST("V0/hTOFbeta_P_El"), pos.p(), pos.beta()); + + if (dist01(engine) < downscaling_electron) { + fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary)); // secondary in primary electron candidates + } + if (dist01(engine) < downscaling_electron) { + fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary)); // secondary in primary electron candidates + } + } + } // end of ULS pair loop + } auto cascades_coll = cascades.sliceBy(perCollision_cascade, collision.globalIndex()); for (auto& cascade : cascades_coll) { // Track casting auto bachelor = cascade.template bachelor_as(); - auto v0 = cascade.template v0_as(); - auto pos = v0.template posTrack_as(); - auto neg = v0.template negTrack_as(); - if (!IsSelected(pos) || !IsSelected(neg) || !IsSelected(bachelor)) { + auto pos = cascade.template posTrack_as(); + auto neg = cascade.template negTrack_as(); + if (!IsSelectedV0Leg(pos) || !IsSelectedV0Leg(neg) || !IsSelectedV0Leg(bachelor)) { continue; } @@ -706,338 +638,108 @@ struct TreeCreatorElectronMLDDA { continue; } - if (v0.v0Type() != 0 && v0.v0Type() != 1) { + if (v0cuts.cfg_min_mass_lambda < cascade.mLambda() && cascade.mLambda() < v0cuts.cfg_max_mass_lambda) { continue; } - - // Calculate DCA with respect to the collision associated to the V0, not individual tracks - gpu::gpustd::array dcaInfo_pos; - auto pTrackPar = getTrackPar(pos); - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, pTrackPar, 2.f, fitter.getMatCorrType(), &dcaInfo_pos); - if (abs(dcaInfo_pos[0]) < mindcaxytopv_v0leg) { - continue; - } - - gpu::gpustd::array dcaInfo_neg; - auto nTrackPar = getTrackPar(neg); - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, nTrackPar, 2.f, fitter.getMatCorrType(), &dcaInfo_neg); - if (abs(dcaInfo_neg[0]) < mindcaxytopv_v0leg) { - continue; - } - - // Calculate DCA with respect to the collision associated to the Cascade, not individual tracks - gpu::gpustd::array dcaInfo_bach; - auto bachTrackPar = getTrackPar(bachelor); - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, bachTrackPar, 2.f, fitter.getMatCorrType(), &dcaInfo_bach); - if (abs(dcaInfo_bach[0]) < mindcaxytopv_bach_casc) { - continue; - } - if (bachelor.sign() < 0) { // omega -> L + K- -> p + pi- + K- - if (abs(pos.tpcNSigmaPr()) > 3.f || abs(neg.tpcNSigmaPi()) > 3.f) { + if (IsProtonTight(pos) || IsPionTight(neg)) { continue; } } else { // omegabar -> Lbar + K+ -> pbar + pi+ + K+ - if (abs(pos.tpcNSigmaPi()) > 3.f || abs(neg.tpcNSigmaPr()) > 3.f) { + if (IsProtonTight(neg) || IsPionTight(pos)) { continue; } } - // reconstruct V0s - auto pTrack = getTrackParCov(pos); // positive - auto nTrack = getTrackParCov(neg); // negative - std::array svpos = {0.}; // secondary vertex position - std::array pvec0 = {0.}; - std::array pvec1 = {0.}; - - int nCand = fitter.process(pTrack, nTrack); - if (nCand != 0) { - fitter.propagateTracksToVertex(); - const auto& vtx = fitter.getPCACandidate(); - for (int i = 0; i < 3; i++) { - svpos[i] = vtx[i]; - } - fitter.getTrack(0).getPxPyPzGlo(pvec0); // positive - fitter.getTrack(1).getPxPyPzGlo(pvec1); // negative - } else { - continue; - } - std::array pvxyz{pvec0[0] + pvec1[0], pvec0[1] + pvec1[1], pvec0[2] + pvec1[2]}; - float v0_rxy = std::sqrt(std::pow(svpos[0], 2) + std::pow(svpos[1], 2)); - if (v0_rxy < min_v0rxy_in_cascade) { + if (cascade.cascradius() > cascade.v0radius()) { continue; } - float dcav0topv = CalculateDCAStraightToPV(svpos[0], svpos[1], svpos[2], pvxyz[0], pvxyz[1], pvxyz[2], collision.posX(), collision.posY(), collision.posZ()); - if (dcav0topv < min_dcav0topv_casc) { - continue; - } - - float mLambda = RecoDecay::m(std::array{std::array{pvec0[0], pvec0[1], pvec0[2]}, std::array{pvec1[0], pvec1[1], pvec1[2]}}, std::array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged}); - float mAntiLambda = RecoDecay::m(std::array{std::array{pvec0[0], pvec0[1], pvec0[2]}, std::array{pvec1[0], pvec1[1], pvec1[2]}}, std::array{o2::constants::physics::MassPionCharged, o2::constants::physics::MassProton}); - float v0dca_casc = std::sqrt(fitter.getChi2AtPCACandidate()); // distance between 2 legs. - float v0CosinePA_casc = RecoDecay::cpa(pVtx, svpos, pvxyz); - registry.fill(HIST("Cascade/hV0PCA"), v0dca_casc); - registry.fill(HIST("Cascade/hV0CosPA"), v0CosinePA_casc); - registry.fill(HIST("Cascade/hMassLambda"), mLambda); - registry.fill(HIST("Cascade/hMassAntiLambda"), mAntiLambda); + registry.fill(HIST("Cascade/hV0PCA"), cascade.dcaV0daughters()); + registry.fill(HIST("Cascade/hV0CosPA"), cascade.v0cosPA(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("Cascade/hMassLambda"), cascade.mLambda()); + registry.fill(HIST("Cascade/hPCA"), cascade.dcacascdaughters()); // distance between bachelor and V0. + registry.fill(HIST("Cascade/hCosPA"), cascade.casccosPA(collision.posX(), collision.posY(), collision.posZ())); - if (v0dca_casc > maxdcav0dau_casc) { - continue; - } - if (v0CosinePA_casc < minv0cospa_casc) { - continue; - } - if (bachelor.sign() < 0 && abs(mLambda - 1.115) > 0.005) { + if (cascade.dcaV0daughters() > cascadecuts.cfg_max_dcadau_v0) { continue; } - if (bachelor.sign() > 0 && abs(mAntiLambda - 1.115) > 0.005) { + if (cascade.v0cosPA(collision.posX(), collision.posY(), collision.posZ()) < cascadecuts.cfg_min_cospa_v0) { continue; } - float alpha = v0_alpha(pvec0[0], pvec0[1], pvec0[2], pvec1[0], pvec1[1], pvec1[2]); - float qt = v0_qt(pvec0[0], pvec0[1], pvec0[2], pvec1[0], pvec1[1], pvec1[2]); - registry.fill(HIST("Cascade/hAP_V0"), alpha, qt); - - // after V0 is found. - pTrack = fitter.getTrack(0); - nTrack = fitter.getTrack(1); - - // Calculate position covariance matrix - auto covVtxV = fitter.calcPCACovMatrix(0); - float positionCovariance[6] = {0.f}; - positionCovariance[0] = covVtxV(0, 0); - positionCovariance[1] = covVtxV(1, 0); - positionCovariance[2] = covVtxV(1, 1); - positionCovariance[3] = covVtxV(2, 0); - positionCovariance[4] = covVtxV(2, 1); - positionCovariance[5] = covVtxV(2, 2); - std::array covTpositive = {0.}; - std::array covTnegative = {0.}; - float momentumCovariance[6] = {0.f}; - pTrack.getCovXYZPxPyPzGlo(covTpositive); - nTrack.getCovXYZPxPyPzGlo(covTnegative); - constexpr int MomInd[6] = {9, 13, 14, 18, 19, 20}; // cov matrix elements for momentum component - for (int i = 0; i < 6; i++) { - momentumCovariance[i] = covTpositive[MomInd[i]] + covTnegative[MomInd[i]]; - } - - std::array covV = {0.}; - for (int i = 0; i < 6; i++) { - covV[MomInd[i]] = momentumCovariance[i]; - covV[i] = positionCovariance[i]; - } - auto lV0Track = o2::track::TrackParCov({svpos[0], svpos[1], svpos[2]}, {pvxyz[0], pvxyz[1], pvxyz[2]}, covV, 0, true); - lV0Track.setAbsCharge(0); - lV0Track.setPID(o2::track::PID::Lambda); - auto lBachelorTrack = getTrackParCov(bachelor); - - nCand = fitter.process(lV0Track, lBachelorTrack); - if (nCand != 0) { - fitter.propagateTracksToVertex(); - const auto& vtx = fitter.getPCACandidate(); - for (int i = 0; i < 3; i++) { - svpos[i] = vtx[i]; - } - fitter.getTrack(0).getPxPyPzGlo(pvec0); // v0 - fitter.getTrack(1).getPxPyPzGlo(pvec1); // bachelor - } else { - continue; - } - std::array pvxyz_casc{pvec0[0] + pvec1[0], pvec0[1] + pvec1[1], pvec0[2] + pvec1[2]}; - float casc_rxy = std::sqrt(std::pow(svpos[0], 2) + std::pow(svpos[1], 2)); - if (casc_rxy < min_cascade_rxy) { + if (cascade.v0radius() < cascadecuts.cfg_min_rxy_v0) { continue; } - if (casc_rxy > v0_rxy) { + if (cascade.cascradius() < cascadecuts.cfg_min_rxy) { continue; } - float casc_dca = std::sqrt(fitter.getChi2AtPCACandidate()); // distance between bachelor and V0. - float casc_cpa = RecoDecay::cpa(pVtx, svpos, pvxyz_casc); - registry.fill(HIST("Cascade/hPCA"), casc_dca); - registry.fill(HIST("Cascade/hCosPA"), casc_cpa); - registry.fill(HIST("Cascade/hRxy"), v0_rxy, casc_rxy); - - alpha = v0_alpha(pvec0[0], pvec0[1], pvec0[2], pvec1[0], pvec1[1], pvec1[2]); - qt = v0_qt(pvec0[0], pvec0[1], pvec0[2], pvec1[0], pvec1[1], pvec1[2]); - registry.fill(HIST("Cascade/hAP"), alpha, qt); - - if (casc_dca > max_casc_dcadau) { + if (cascade.dcacascdaughters() > cascadecuts.cfg_max_dcadau) { continue; } - if (casc_cpa < min_casc_cospa) { + if (cascade.casccosPA(collision.posX(), collision.posY(), collision.posZ()) < cascadecuts.cfg_min_cospa) { continue; } - float length = std::sqrt(std::pow(svpos[0] - collision.posX(), 2) + std::pow(svpos[1] - collision.posY(), 2) + std::pow(svpos[2] - collision.posZ(), 2)); - float mom = RecoDecay::sqrtSumOfSquares(pvxyz_casc[0], pvxyz_casc[1], pvxyz_casc[2]); - float ctauXi = length / mom * o2::constants::physics::MassXiMinus; - float ctauOmega = length / mom * o2::constants::physics::MassOmegaMinus; - float pt = RecoDecay::sqrtSumOfSquares(pvxyz_casc[0], pvxyz_casc[1]); - - // after DCAFitter - lV0Track = fitter.getTrack(0); - lBachelorTrack = fitter.getTrack(1); - float mXi = RecoDecay::m(std::array{std::array{pvec0[0], pvec0[1], pvec0[2]}, std::array{pvec1[0], pvec1[1], pvec1[2]}}, std::array{o2::constants::physics::MassLambda, o2::constants::physics::MassPionCharged}); // ctau = 4.91 cm - float mOmega = RecoDecay::m(std::array{std::array{pvec0[0], pvec0[1], pvec0[2]}, std::array{pvec1[0], pvec1[1], pvec1[2]}}, std::array{o2::constants::physics::MassLambda, o2::constants::physics::MassKaonCharged}); // ctau 2.46 cm + float length = std::sqrt(std::pow(cascade.x() - collision.posX(), 2) + std::pow(cascade.y() - collision.posY(), 2) + std::pow(cascade.z() - collision.posZ(), 2)); + float mom = cascade.p(); + float ctauXi = length / mom * o2::constants::physics::MassXiMinus; // 4.91 cm in PDG + float ctauOmega = length / mom * o2::constants::physics::MassOmegaMinus; // 2.46 cm in PDG if (IsPion(bachelor)) { - registry.fill(HIST("Cascade/hMassXi"), mXi); - registry.fill(HIST("Cascade/hMassPt_Xi"), mXi, pt); - registry.fill(HIST("Cascade/hMassPt_Xi_bachelor"), mXi, bachelor.p()); - registry.fill(HIST("Cascade/hRxy_Xi"), mXi, casc_rxy); - registry.fill(HIST("Cascade/hCTau_Xi"), mXi, ctauXi); - // if (abs(mXi - 1.321) < 0.005) { // select Xi candidates - // if (dist01(engine) < downscaling_pion) { - // fillTrackTable(collision, bachelor, static_cast(o2::aod::pwgem::dilepton::PID_Label::kPion), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary)); - // } - // } - } - if (abs(mXi - 1.322) > 0.01 && IsKaon(bachelor)) { // reject Xi candidates - registry.fill(HIST("Cascade/hMassOmega"), mOmega); - registry.fill(HIST("Cascade/hMassPt_Omega"), mOmega, pt); - registry.fill(HIST("Cascade/hMassPt_Omega_bachelor"), mOmega, bachelor.p()); - registry.fill(HIST("Cascade/hRxy_Omega"), mOmega, casc_rxy); - registry.fill(HIST("Cascade/hCTau_Omega"), mOmega, ctauOmega); - if (abs(mOmega - 1.672) < 0.004) { // select Omega candidates + registry.fill(HIST("Cascade/hMassXi"), cascade.mXi()); + registry.fill(HIST("Cascade/hMassPt_Xi"), cascade.mXi(), cascade.pt()); + registry.fill(HIST("Cascade/hMassPt_Xi_bachelor"), cascade.mXi(), bachelor.p()); + registry.fill(HIST("Cascade/hRxy_Xi"), cascade.mXi(), cascade.cascradius()); + registry.fill(HIST("Cascade/hCTau_Xi"), cascade.mXi(), ctauXi); + } + if (!(cascadecuts.cfg_min_mass_Xi < cascade.mXi() && cascade.mXi() < cascadecuts.cfg_max_mass_Xi) && IsKaon(bachelor)) { // reject Xi candidates + registry.fill(HIST("Cascade/hMassOmega"), cascade.mOmega()); + registry.fill(HIST("Cascade/hMassPt_Omega"), cascade.mOmega(), cascade.pt()); + registry.fill(HIST("Cascade/hMassPt_Omega_bachelor"), cascade.mOmega(), bachelor.p()); + registry.fill(HIST("Cascade/hRxy_Omega"), cascade.mOmega(), cascade.cascradius()); + registry.fill(HIST("Cascade/hCTau_Omega"), cascade.mOmega(), ctauOmega); + if (cascadecuts.cfg_min_mass_Omega < cascade.mOmega() && cascade.mOmega() < cascadecuts.cfg_max_mass_Omega) { // select Omega candidates + registry.fill(HIST("V0/hTPCdEdx_P_Ka"), neg.p(), neg.tpcSignal()); + registry.fill(HIST("V0/hTOFbeta_P_Ka"), neg.p(), neg.beta()); if (dist01(engine) < downscaling_kaon) { fillTrackTable(collision, bachelor, static_cast(o2::aod::pwgem::dilepton::PID_Label::kKaon), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary)); } } } - } // end of cascade loop - } // end of collision loop - stored_trackIds.clear(); - stored_trackIds.shrink_to_fit(); - } // end of process - - Partition positrons = o2::aod::track::signed1Pt > 0.f && o2::aod::track::pt > minpt&& nabs(o2::aod::track::eta) < maxeta&& o2::aod::track::tpcChi2NCl < maxchi2tpc&& o2::aod::track::itsChi2NCl < maxchi2its&& nabs(o2::aod::track::dcaXY) < maxdcaXY&& nabs(o2::aod::track::dcaZ) < maxdcaZ&& ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::ITS) == true && ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::TPC) == true && (minTPCNsigmaEl < o2::aod::pidtpc::tpcNSigmaEl && o2::aod::pidtpc::tpcNSigmaEl < maxTPCNsigmaEl); - Partition electrons = o2::aod::track::signed1Pt < 0.f && o2::aod::track::pt > minpt&& nabs(o2::aod::track::eta) < maxeta&& o2::aod::track::tpcChi2NCl < maxchi2tpc&& o2::aod::track::itsChi2NCl < maxchi2its&& nabs(o2::aod::track::dcaXY) < maxdcaXY&& nabs(o2::aod::track::dcaZ) < maxdcaZ&& ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::ITS) == true && ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::TPC) == true && (minTPCNsigmaEl < o2::aod::pidtpc::tpcNSigmaEl && o2::aod::pidtpc::tpcNSigmaEl < maxTPCNsigmaEl); - std::vector stored_secondary_electronIds; - void processPrimary(filteredMyCollisions const& collisions, aod::BCsWithTimestamps const&, aod::V0s const&, MyTracks const&) - { - stored_trackIds.reserve(positrons.size() + electrons.size()); - stored_secondary_electronIds.reserve(positrons.size() + electrons.size()); - - for (auto& collision : collisions) { - registry.fill(HIST("hEventCounter"), 1.0); // all - - auto bc = collision.template bc_as(); - initCCDB(bc); - - if (!collision.selection_bit(aod::evsel::kNoTimeFrameBorder)) { - continue; - } - - auto positrons_per_coll = positrons->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); - auto electrons_per_coll = electrons->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); - - for (auto& [pos, ele] : combinations(CombinationsFullIndexPolicy(positrons_per_coll, electrons_per_coll))) { // electron is tag, positron is probe. - if (!IsSelectedTag(ele) || !IsElectronTag(ele)) { // require tight global track selection - continue; - } - - if (!IsSelected(pos) || !IsElectron(pos)) { - continue; - } - - ROOT::Math::PtEtaPhiMVector v1(ele.pt(), ele.eta(), ele.phi(), o2::constants::physics::MassElectron); - ROOT::Math::PtEtaPhiMVector v2(pos.pt(), pos.eta(), pos.phi(), o2::constants::physics::MassElectron); - ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - float phiv = o2::aod::pwgem::dilepton::utils::pairutil::getPhivPair(pos.px(), pos.py(), pos.pz(), ele.px(), ele.py(), ele.pz(), pos.sign(), ele.sign(), d_bz); - registry.fill(HIST("hMvsPhiV"), phiv, v12.M()); - if (v12.M() < slope * phiv + intercept) { // photon conversion is found. - stored_secondary_electronIds.emplace_back(pos.globalIndex()); - if (dist01(engine) < downscaling_secondary_electron) { - fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary)); - } - } - } // end of pairing loop - - for (auto& [pos, ele] : combinations(CombinationsFullIndexPolicy(positrons_per_coll, electrons_per_coll))) { // electron is probe, positron is tag. - if (!IsSelectedTag(pos) || !IsElectronTag(pos)) { // require tight global track selection - continue; - } - - if (!IsSelected(ele) || !IsElectron(ele)) { - continue; - } - - ROOT::Math::PtEtaPhiMVector v1(ele.pt(), ele.eta(), ele.phi(), o2::constants::physics::MassElectron); - ROOT::Math::PtEtaPhiMVector v2(pos.pt(), pos.eta(), pos.phi(), o2::constants::physics::MassElectron); - ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - float phiv = o2::aod::pwgem::dilepton::utils::pairutil::getPhivPair(pos.px(), pos.py(), pos.pz(), ele.px(), ele.py(), ele.pz(), pos.sign(), ele.sign(), d_bz); - registry.fill(HIST("hMvsPhiV"), phiv, v12.M()); - if (v12.M() < slope * phiv + intercept) { // photon conversion is found. - stored_secondary_electronIds.emplace_back(ele.globalIndex()); - if (dist01(engine) < downscaling_secondary_electron) { - fillTrackTable(collision, ele, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary)); - } - } - } // end of pairing loop - - // apply prefilter to reject photon conversion - for (auto& [pos, ele] : combinations(CombinationsFullIndexPolicy(positrons_per_coll, electrons_per_coll))) { // electron is tag, positron is probe. - if (!IsSelectedTag(ele) || !IsElectronTag(ele)) { // require tight global track selection - continue; - } - - if (!IsSelected(pos) || !IsElectron(pos)) { - continue; - } - - if (std::find(stored_secondary_electronIds.begin(), stored_secondary_electronIds.end(), pos.globalIndex()) != stored_secondary_electronIds.end()) { - continue; // apply pre-filter to reject secondary electrons - } - - ROOT::Math::PtEtaPhiMVector v1(ele.pt(), ele.eta(), ele.phi(), o2::constants::physics::MassElectron); - ROOT::Math::PtEtaPhiMVector v2(pos.pt(), pos.eta(), pos.phi(), o2::constants::physics::MassElectron); - ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - float phiv = o2::aod::pwgem::dilepton::utils::pairutil::getPhivPair(pos.px(), pos.py(), pos.pz(), ele.px(), ele.py(), ele.pz(), pos.sign(), ele.sign(), d_bz); - registry.fill(HIST("hMvsPhiV_primary"), phiv, v12.M()); - if (v12.M() < max_mee_pi0 && dist01(engine) < downscaling_primary_electron) { // e from pi0 dalitz decay is found. - fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary)); - } - } // end of pairing loop - - for (auto& [pos, ele] : combinations(CombinationsFullIndexPolicy(positrons_per_coll, electrons_per_coll))) { // electron is probe, positron is tag. - if (!IsSelectedTag(pos) || !IsElectronTag(pos)) { // require tight global track selection - continue; - } - - if (!IsSelected(ele) || !IsElectron(ele)) { - continue; - } - - if (std::find(stored_secondary_electronIds.begin(), stored_secondary_electronIds.end(), ele.globalIndex()) != stored_secondary_electronIds.end()) { - continue; // apply pre-filter to reject secondary electrons - } - - ROOT::Math::PtEtaPhiMVector v1(ele.pt(), ele.eta(), ele.phi(), o2::constants::physics::MassElectron); - ROOT::Math::PtEtaPhiMVector v2(pos.pt(), pos.eta(), pos.phi(), o2::constants::physics::MassElectron); - ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - float phiv = o2::aod::pwgem::dilepton::utils::pairutil::getPhivPair(pos.px(), pos.py(), pos.pz(), ele.px(), ele.py(), ele.pz(), pos.sign(), ele.sign(), d_bz); - registry.fill(HIST("hMvsPhiV_primary"), phiv, v12.M()); - if (v12.M() < max_mee_pi0 && dist01(engine) < downscaling_primary_electron) { // e from pi0 dalitz decay is found. - fillTrackTable(collision, ele, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary)); - } - } // end of pairing loop + auto tracks_coll = tracks.sliceBy(perCollision_track, collision.globalIndex()); + for (auto& track : tracks_coll) { + if (!IsSelectedTrack(track)) { + continue; + } + + registry.fill(HIST("PrimaryTrack/hTPCdEdx_P"), track.p(), track.tpcSignal()); + registry.fill(HIST("PrimaryTrack/hTOFbeta_P"), track.p(), track.beta()); + registry.fill(HIST("PrimaryTrack/hITSobClusterSize_P"), track.p(), meanClusterSizeITS<3, 7>(track) * std::cos(std::atan(track.tgl()))); + registry.fill(HIST("PrimaryTrack/hTPCNsigmaEl_P"), track.p(), track.tpcNSigmaEl()); + registry.fill(HIST("PrimaryTrack/hTOFNsigmaEl_P"), track.p(), track.tofNSigmaEl()); + registry.fill(HIST("PrimaryTrack/hTPCNsigmaMu_P"), track.p(), track.tpcNSigmaMu()); + registry.fill(HIST("PrimaryTrack/hTOFNsigmaMu_P"), track.p(), track.tofNSigmaMu()); + registry.fill(HIST("PrimaryTrack/hTPCNsigmaPi_P"), track.p(), track.tpcNSigmaPi()); + registry.fill(HIST("PrimaryTrack/hTOFNsigmaPi_P"), track.p(), track.tofNSigmaPi()); + registry.fill(HIST("PrimaryTrack/hTPCNsigmaKa_P"), track.p(), track.tpcNSigmaKa()); + registry.fill(HIST("PrimaryTrack/hTOFNsigmaKa_P"), track.p(), track.tofNSigmaKa()); + registry.fill(HIST("PrimaryTrack/hTPCNsigmaPr_P"), track.p(), track.tpcNSigmaPr()); + registry.fill(HIST("PrimaryTrack/hTOFNsigmaPr_P"), track.p(), track.tofNSigmaPr()); + } // end of track loop } // end of collision loop stored_trackIds.clear(); stored_trackIds.shrink_to_fit(); - stored_secondary_electronIds.clear(); - stored_secondary_electronIds.shrink_to_fit(); } // end of process // please choose only 1 process function. void processDummy(filteredMyCollisions const&) {} - PROCESS_SWITCH(TreeCreatorElectronMLDDA, processPID, "produce ML input for single track level", false); // this is for eID with ITSsa. e/pi/k/p are selected by TOF, and these can be used for ITS-TPC PID. - PROCESS_SWITCH(TreeCreatorElectronMLDDA, processPrimary, "produce ML input for single track level", false); // this is for selecting electrons from primary or secondary. + PROCESS_SWITCH(TreeCreatorElectronMLDDA, processPID, "produce ML input for single track level", false); // this is for eID with ITSsa. e/pi/k/p are selected by TOF, and these can be used for ITS-TPC PID. PROCESS_SWITCH(TreeCreatorElectronMLDDA, processDummy, "process dummy", true); }; diff --git a/PWGEM/Dilepton/Tasks/studyMCTruth.cxx b/PWGEM/Dilepton/Tasks/studyMCTruth.cxx index 66265b6a679..983d8a8c4ef 100644 --- a/PWGEM/Dilepton/Tasks/studyMCTruth.cxx +++ b/PWGEM/Dilepton/Tasks/studyMCTruth.cxx @@ -238,7 +238,7 @@ struct studyMCTruth { default: break; } - } else if (hfll_type > 0) { // HFll + } else if (hfll_type > -1) { // HFll switch (hfll_type) { case static_cast(EM_HFeeType::kCe_Ce): // ULS fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("ccbar/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); From 79fac46135f35d89cacbe0f9b7013391f7f9d4f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Wed, 12 Feb 2025 10:10:37 +0100 Subject: [PATCH 0166/1650] [Infrastructure] Labeler: See DataModel directories at all levels (#9884) --- .github/labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/labeler.yml b/.github/labeler.yml index a3f4fa424f6..7d404c53f68 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -26,7 +26,7 @@ infrastructure: datamodel: - changed-files: - - any-glob-to-any-file: ['DataModel/**', '*/DataModel/**'] + - any-glob-to-any-file: ['DataModel/**', '**/DataModel/**'] dpg: - changed-files: From c247f1b6f8223a878138637536e588ddc616f64f Mon Sep 17 00:00:00 2001 From: victorvalenciatorres <118812999+victorvalenciatorres@users.noreply.github.com> Date: Wed, 12 Feb 2025 10:18:09 +0100 Subject: [PATCH 0167/1650] [PWGDQ] Adding 2D correlators (#9904) --- PWGDQ/Core/HistogramsLibrary.cxx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 8471c1079af..4e3b3eba767 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -1305,14 +1305,14 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h double minBins[4] = {0.0, 0.0, 2.5, 0.0}; double maxBins[4] = {5.0, 30.0, 4.0, 90.0}; hm->AddHistogram(histClass, "Mass_Pt_Rapidity_CentFT0C", "", 4, var, bins, minBins, maxBins, 0, -1, kTRUE); - hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2REFminus", "", true, -1, -1, -1, -1, 60, 0.0, 30.0, VarManager::kPt2, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR2REFbydimuons, VarManager::kM11REFoverMpminus); - hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr4REFminus", "", true, -1, -1, -1, -1, 60, 0.0, 30.0, VarManager::kPt2, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR4REFbydimuons, VarManager::kM1111REFoverMpminus); - hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2REFplus", "", true, -1, -1, -1, -1, 60, 0.0, 30.0, VarManager::kPt1, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR2REFbydimuons, VarManager::kM11REFoverMpplus); - hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr4REFplus", "", true, -1, -1, -1, -1, 60, 0.0, 30.0, VarManager::kPt1, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR4REFbydimuons, VarManager::kM1111REFoverMpplus); - hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2POIminus", "", true, -1, -1, -1, -1, 60, 0.0, 30.0, VarManager::kPt2, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR2POIminus, VarManager::kM01POIoverMpminus); - hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr4POIminus", "", true, -1, -1, -1, -1, 60, 0.0, 30.0, VarManager::kPt2, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR4POIminus, VarManager::kM0111POIoverMpminus); - hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2POIplus", "", true, -1, -1, -1, -1, 60, 0.0, 30.0, VarManager::kPt1, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR2POIplus, VarManager::kM01POIoverMpplus); - hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr4POIplus", "", true, -1, -1, -1, -1, 60, 0.0, 30.0, VarManager::kPt1, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR4POIplus, VarManager::kM0111POIoverMpplus); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2REFminus", "", true, 60, 0.0, 30.0, VarManager::kPt2, 18, 0.0, 90.0, VarManager::kCentFT0C, 0, 0.0, 1.0, VarManager::kCORR2REFbydimuons, "", "", "", VarManager::kNothing, VarManager::kM11REFoverMpminus); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr4REFminus", "", true, 60, 0.0, 30.0, VarManager::kPt2, 18, 0.0, 90.0, VarManager::kCentFT0C, 0, 0.0, 1.0, VarManager::kCORR4REFbydimuons, "", "", "", VarManager::kNothing, VarManager::kM1111REFoverMpminus); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2REFplus", "", true, 60, 0.0, 30.0, VarManager::kPt1, 18, 0.0, 90.0, VarManager::kCentFT0C, 0, 0.0, 1.0, VarManager::kCORR2REFbydimuons, "", "", "", VarManager::kNothing, VarManager::kM11REFoverMpplus); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr4REFplus", "", true, 60, 0.0, 30.0, VarManager::kPt1, 18, 0.0, 90.0, VarManager::kCentFT0C, 0, 0.0, 1.0, VarManager::kCORR4REFbydimuons, "", "", "", VarManager::kNothing, VarManager::kM1111REFoverMpplus); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2POIminus", "", true, 60, 0.0, 30.0, VarManager::kPt2, 18, 0.0, 90.0, VarManager::kCentFT0C, 0, 0.0, 1.0, VarManager::kCORR2POIminus, "", "", "", VarManager::kNothing, VarManager::kM01POIoverMpminus); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr4POIminus", "", true, 60, 0.0, 30.0, VarManager::kPt2, 18, 0.0, 90.0, VarManager::kCentFT0C, 0, 0.0, 1.0, VarManager::kCORR4POIminus, "", "", "", VarManager::kNothing, VarManager::kM0111POIoverMpminus); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2POIplus", "", true, 60, 0.0, 30.0, VarManager::kPt1, 18, 0.0, 90.0, VarManager::kCentFT0C, 0, 0.0, 1.0, VarManager::kCORR2POIplus, "", "", "", VarManager::kNothing, VarManager::kM01POIoverMpplus); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr4POIplus", "", true, 60, 0.0, 30.0, VarManager::kPt1, 18, 0.0, 90.0, VarManager::kCentFT0C, 0, 0.0, 1.0, VarManager::kCORR4POIplus, "", "", "", VarManager::kNothing, VarManager::kM0111POIoverMpplus); } if (subGroupStr.Contains("res-flow-dimuon")) { int varV2[6] = {VarManager::kMass, VarManager::kPt, VarManager::kRap, VarManager::kCentFT0C, VarManager::kR2SP_AB, VarManager::kR2EP_AB}; From 92cbc341eef517d49a0ad943559b68be9e8c2e05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Wed, 12 Feb 2025 10:32:09 +0100 Subject: [PATCH 0168/1650] [PWGLF] Update k0_mixed_events.cxx (#9900) Co-authored-by: ALICE Builder --- PWGLF/Tasks/Strangeness/k0_mixed_events.cxx | 29 +++++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx b/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx index c095575cee2..baab9efea6e 100644 --- a/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx +++ b/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx @@ -172,6 +172,7 @@ struct K0MixedEvents { Configurable isNoITSROFrameBorder{"evSelisNoITSROFrameBorder", 1, "Is No ITS Readout Frame Border"}; Configurable isVertexTOFmatched{"evSelisVertexTOFmatched", 0, "Is Vertex TOF matched"}; Configurable isGoodZvtxFT0vsPV{"evSelisGoodZvtxFT0vsPV", 0, "isGoodZvtxFT0vsPV"}; + Configurable isNoSameBunchPileup{"isNoSameBunchPileup", 0, "isNoSameBunchPileup"}; Configurable isInelGt0{"evSelisInelGt0", 0, "isInelGt0"}; // Binnings @@ -242,7 +243,7 @@ struct K0MixedEvents { const AxisSpec dcaZAxis{dcaXyBinning, "DCA_{z} (cm)"}; const AxisSpec multPercentileAxis{multPercentileBinning, "Mult. Perc."}; - registry.add("hNEvents", "hNEvents", {HistType::kTH1D, {{11, 0.f, 11.f}}}); + registry.add("hNEvents", "hNEvents", {HistType::kTH1D, {{14, 0.f, 14.f}}}); registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(1, "all"); registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(2, "sel8"); registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(3, "TVX"); @@ -251,8 +252,11 @@ struct K0MixedEvents { registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(6, "ITSROFBorder"); registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(7, "isTOFVertexMatched"); registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(8, "isGoodZvtxFT0vsPV"); - registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(9, "InelGT0"); - registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(10, "Applied selection"); + registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(9, "isNoSameBunchPileup"); + registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(10, "InelGT0"); + registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(11, Form("collision.centFT0M() < %f", multPercentileCut.value.second)); + registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(12, Form("collision.centFT0M() > %f", multPercentileCut.value.first)); + registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(13, "Applied selection"); registry.add("Trks", "Trks", kTH1D, {{2, 0.5, 2.5, "Tracks"}}); registry.add("VTXc", "VTXc", kTH1D, {{100, -20., 20., "vtx"}}); @@ -484,16 +488,31 @@ struct K0MixedEvents { if (fill) { registry.fill(HIST("hNEvents"), 7.5); } - if (isInelGt0 && !collision.isInelGt0()) { + if (isNoSameBunchPileup && !collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { return false; } if (fill) { registry.fill(HIST("hNEvents"), 8.5); } + if (isInelGt0 && !collision.isInelGt0()) { + return false; + } + if (fill) { + registry.fill(HIST("hNEvents"), 9.5); + } if (collision.centFT0M() > multPercentileCut.value.second) return false; + if (fill) { + registry.fill(HIST("hNEvents"), 10.5); + } if (collision.centFT0M() < multPercentileCut.value.first) return false; + if (fill) { + registry.fill(HIST("hNEvents"), 11.5); + } + if (fill) { + registry.fill(HIST("hNEvents"), 12.5); + } return true; } @@ -507,7 +526,7 @@ struct K0MixedEvents { LOGF(fatal, "One of passed PDG is 0!!!"); } registry.fill(HIST("Trks"), 2.f, tracks.size()); - for (auto collision : collisions) { + for (const auto& collision : collisions) { LOG(debug) << "Collision index " << collision.globalIndex(); registry.fill(HIST("VTXc"), collision.posZ()); registry.fill(HIST("multPerc"), collision.multPerc()); From 8ed8b571e1e081580c2b4fbd77dff61e241d509d Mon Sep 17 00:00:00 2001 From: sangwoo <141385263+sangwoo184@users.noreply.github.com> Date: Wed, 12 Feb 2025 19:45:15 +0900 Subject: [PATCH 0169/1650] [PWGLF] Add PID flag and change main loop using two for loop (#9894) Co-authored-by: sangwoo --- PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx | 113 +++++++++++-------- 1 file changed, 65 insertions(+), 48 deletions(-) diff --git a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx index febb7eeec96..97af68572b8 100644 --- a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx +++ b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx @@ -11,10 +11,12 @@ /// \author Junlee Kim (jikim1290@gmail.com) +#include #include #include #include #include +#include #include #include "TLorentzVector.h" @@ -103,6 +105,7 @@ struct f0980pbpbanalysis { Configurable cMaxTPCnSigmaPion{"cMaxTPCnSigmaPion", 5.0, "TPC nSigma cut for Pion"}; // TPC Configurable cMaxTPCnSigmaPionS{"cMaxTPCnSigmaPionS", 3.0, "TPC nSigma cut for Pion as a standalone"}; Configurable cfgUSETOF{"cfgUSETOF", false, "TPC usage"}; + Configurable SelectType{"SelectType", 0, "PID selection type"}; Configurable cfgnMods{"cfgnMods", 1, "The number of modulations of interest starting from 2"}; Configurable cfgNQvec{"cfgNQvec", 7, "The number of total Qvectors for looping over the task"}; @@ -238,16 +241,38 @@ struct f0980pbpbanalysis { template bool PIDSelected(const TrackType track) { - if (cfgUSETOF) { - if (std::fabs(track.tofNSigmaPi()) > cMaxTOFnSigmaPion) { - return 0; + if (SelectType == 0) { + if (cfgUSETOF) { + if (std::fabs(track.tofNSigmaPi()) > cMaxTOFnSigmaPion) { + return 0; + } + if (std::fabs(track.tpcNSigmaPi()) > cMaxTPCnSigmaPion) { + return 0; + } } - if (std::fabs(track.tpcNSigmaPi()) > cMaxTPCnSigmaPion) { + if (std::fabs(track.tpcNSigmaPi()) > cMaxTPCnSigmaPionS) { return 0; } } - if (std::fabs(track.tpcNSigmaPi()) > cMaxTPCnSigmaPionS) { - return 0; + if (SelectType == 1) { + if (cfgUSETOF) { + if (track.hasTOF()) { + if (std::fabs(track.tofNSigmaPi()) > cMaxTOFnSigmaPion) { + return 0; + } + if (std::fabs(track.tpcNSigmaPi()) > cMaxTPCnSigmaPion) { + return 0; + } + } else { + if (std::fabs(track.tpcNSigmaPi()) > cMaxTPCnSigmaPionS) { + return 0; + } + } + } else { + if (std::fabs(track.tpcNSigmaPi()) > cMaxTPCnSigmaPionS) { + return 0; + } + } } return 1; @@ -271,54 +296,46 @@ struct f0980pbpbanalysis { histos.fill(HIST("QA/EPResBC"), centrality, TMath::Cos(static_cast(nmode) * (eventPlaneRefA - eventPlaneRefB))); TLorentzVector Pion1, Pion2, Reco; - for (auto& [trk1, trk2] : - combinations(CombinationsUpperIndexPolicy(dTracks, dTracks))) { - if (trk1.index() == trk2.index()) { - if (!trackSelected(trk1)) - continue; - histos.fill(HIST("QA/Nsigma_TPC"), trk1.pt(), trk1.tpcNSigmaPi()); - histos.fill(HIST("QA/Nsigma_TOF"), trk1.pt(), trk1.tofNSigmaPi()); - histos.fill(HIST("QA/TPC_TOF"), trk1.tpcNSigmaPi(), trk1.tofNSigmaPi()); + for (auto& trk1 : dTracks) { + if (!trackSelected(trk1)) continue; - } + histos.fill(HIST("QA/Nsigma_TPC"), trk1.pt(), trk1.tpcNSigmaPi()); + histos.fill(HIST("QA/Nsigma_TOF"), trk1.pt(), trk1.tofNSigmaPi()); + histos.fill(HIST("QA/TPC_TOF"), trk1.tpcNSigmaPi(), trk1.tofNSigmaPi()); - if (!trackSelected(trk1) || !trackSelected(trk2)) - continue; - if (!PIDSelected(trk1) || !PIDSelected(trk2)) - continue; + for (auto& trk2 : dTracks) { + if (!trackSelected(trk1) || !trackSelected(trk2)) { + continue; + } - if (trk1.index() == trk2.index()) { - histos.fill(HIST("QA/Nsigma_TPC_selected"), trk1.pt(), trk1.tpcNSigmaPi()); - histos.fill(HIST("QA/Nsigma_TOF_selected"), trk1.pt(), trk1.tofNSigmaPi()); - histos.fill(HIST("QA/TPC_TOF_selected"), trk1.tpcNSigmaPi(), trk1.tofNSigmaPi()); - } + // PID + if (!PIDSelected(trk1) || !PIDSelected(trk2)) { + continue; + } - Pion1.SetXYZM(trk1.px(), trk1.py(), trk1.pz(), massPi); - Pion2.SetXYZM(trk2.px(), trk2.py(), trk2.pz(), massPi); - Reco = Pion1 + Pion2; + if (trk1.index() == trk2.index()) { + histos.fill(HIST("QA/Nsigma_TPC_selected"), trk1.pt(), trk1.tpcNSigmaPi()); + histos.fill(HIST("QA/Nsigma_TOF_selected"), trk1.pt(), trk1.tofNSigmaPi()); + histos.fill(HIST("QA/TPC_TOF_selected"), trk1.tpcNSigmaPi(), trk1.tofNSigmaPi()); + } - if (Reco.Rapidity() > cfgMaxRap || Reco.Rapidity() < cfgMinRap) - continue; + Pion1.SetXYZM(trk1.px(), trk1.py(), trk1.pz(), massPi); + Pion2.SetXYZM(trk2.px(), trk2.py(), trk2.pz(), massPi); + Reco = Pion1 + Pion2; + + if (Reco.Rapidity() > cfgMaxRap || Reco.Rapidity() < cfgMinRap) { + continue; + } + + relPhi = TVector2::Phi_0_2pi((Reco.Phi() - eventPlaneDet) * static_cast(nmode)); - relPhi = TVector2::Phi_0_2pi((Reco.Phi() - eventPlaneDet) * static_cast(nmode)); - - if (trk1.sign() * trk2.sign() < 0) { - histos.fill(HIST("hInvMass_f0980_US_EPA"), Reco.M(), Reco.Pt(), centrality, relPhi); - /* - if constexpr (IsMC) { - if (abs(trk1.pdgCode()) != 211 || abs(trk2.pdgCode()) != 211) - continue; - if (trk1.motherId() != trk2.motherId()) - continue; - if (abs(trk1.motherPDG()) != 9010221) - continue; - histos.fill(HIST("MCL/hpT_f0980_REC"), Reco.M(), Reco.Pt(), centrality); - } - */ - } else if (trk1.sign() > 0 && trk2.sign() > 0) { - histos.fill(HIST("hInvMass_f0980_LSpp_EPA"), Reco.M(), Reco.Pt(), centrality, relPhi); - } else if (trk1.sign() < 0 && trk2.sign() < 0) { - histos.fill(HIST("hInvMass_f0980_LSmm_EPA"), Reco.M(), Reco.Pt(), centrality, relPhi); + if (trk1.sign() * trk2.sign() < 0) { + histos.fill(HIST("hInvMass_f0980_US_EPA"), Reco.M(), Reco.Pt(), centrality, relPhi); + } else if (trk1.sign() > 0 && trk2.sign() > 0) { + histos.fill(HIST("hInvMass_f0980_LSpp_EPA"), Reco.M(), Reco.Pt(), centrality, relPhi); + } else if (trk1.sign() < 0 && trk2.sign() < 0) { + histos.fill(HIST("hInvMass_f0980_LSmm_EPA"), Reco.M(), Reco.Pt(), centrality, relPhi); + } } } } From b59ab06599fd247bd7fef623da7070114b601335 Mon Sep 17 00:00:00 2001 From: Antonio Palasciano <52152842+apalasciano@users.noreply.github.com> Date: Wed, 12 Feb 2025 12:11:44 +0100 Subject: [PATCH 0170/1650] [PWGHF] B+ improve correlated background identification (#9878) --- PWGHF/D2H/DataModel/ReducedDataModel.h | 9 ++++--- .../candidateCreatorBplusReduced.cxx | 7 ++--- .../dataCreatorCharmHadPiReduced.cxx | 27 +++++++++++++++++-- PWGHF/D2H/Tasks/taskBplusReduced.cxx | 2 ++ 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/PWGHF/D2H/DataModel/ReducedDataModel.h b/PWGHF/D2H/DataModel/ReducedDataModel.h index d8c06e0d26f..0c8218d1a07 100644 --- a/PWGHF/D2H/DataModel/ReducedDataModel.h +++ b/PWGHF/D2H/DataModel/ReducedDataModel.h @@ -40,10 +40,10 @@ namespace aod { namespace hf_reduced_collision { -DECLARE_SOA_COLUMN(Bz, bz, float); //! Magnetic field in z-direction +DECLARE_SOA_COLUMN(Bz, bz, float); //! Magnetic field in z-direction DECLARE_SOA_COLUMN(HfCollisionRejectionMap, hfCollisionRejectionMap, uint16_t); //! Bitmask with failed selection criteria // keep track of the number of studied events (for normalization purposes) -DECLARE_SOA_COLUMN(OriginalCollisionCount, originalCollisionCount, int); //! Size of COLLISION table processed +DECLARE_SOA_COLUMN(OriginalCollisionCount, originalCollisionCount, int); //! Size of COLLISION table processed DECLARE_SOA_COLUMN(ZvtxSelectedCollisionCount, zvtxSelectedCollisionCount, int); //! Number of COLLISIONS with |zvtx| < zvtxMax DECLARE_SOA_COLUMN(TriggerSelectedCollisionCount, triggerSelectedCollisionCount, int); //! Number of COLLISIONS with sel8 DECLARE_SOA_COLUMN(ZvtxAndTriggerSelectedCollisionCount, zvtxAndTriggerSelectedCollisionCount, int); //! Number of COLLISIONS with |zvtx| < zvtxMax and sel8 @@ -516,6 +516,7 @@ DECLARE_SOA_COLUMN(YProng1, yProng1, float); //! Rapidity of the track's pro DECLARE_SOA_COLUMN(EtaProng1, etaProng1, float); //! Pseudorapidity of the track's prong1 DECLARE_SOA_COLUMN(PdgCodeBeautyMother, pdgCodeBeautyMother, int); //! Pdg code of beauty mother +DECLARE_SOA_COLUMN(PdgCodeCharmMother, pdgCodeCharmMother, int); //! Pdg code of charm mother DECLARE_SOA_COLUMN(PdgCodeProng0, pdgCodeProng0, int); //! Pdg code of prong0 DECLARE_SOA_COLUMN(PdgCodeProng1, pdgCodeProng1, int); //! Pdg code of prong1 DECLARE_SOA_COLUMN(PdgCodeProng2, pdgCodeProng2, int); //! Pdg code of prong2 @@ -533,6 +534,7 @@ DECLARE_SOA_TABLE(HfMcRecRedD0Pis, "AOD", "HFMCRECREDD0PI", //! Table with recon // DECLARE_SOA_EXTENDED_TABLE_USER(ExTable, Tracks, "EXTABLE", DECLARE_SOA_TABLE(HfMcCheckD0Pis, "AOD", "HFMCCHECKD0PI", //! Table with reconstructed MC information on D0Pi(<-B0) pairs for MC checks in reduced workflow hf_bplus_mc::PdgCodeBeautyMother, + hf_bplus_mc::PdgCodeCharmMother, hf_bplus_mc::PdgCodeProng0, hf_bplus_mc::PdgCodeProng1, hf_bplus_mc::PdgCodeProng2, @@ -547,6 +549,7 @@ DECLARE_SOA_TABLE(HfMcRecRedBps, "AOD", "HFMCRECREDBP", //! Reconstruction-level DECLARE_SOA_TABLE(HfMcCheckBps, "AOD", "HFMCCHECKBP", //! Table with reconstructed MC information on B+ candidates for MC checks in reduced workflow hf_bplus_mc::PdgCodeBeautyMother, + hf_bplus_mc::PdgCodeCharmMother, hf_bplus_mc::PdgCodeProng0, hf_bplus_mc::PdgCodeProng1, hf_bplus_mc::PdgCodeProng2, @@ -687,7 +690,7 @@ DECLARE_SOA_COLUMN(Dca, dca, float); //! DCA of V0 candidate DECLARE_SOA_COLUMN(Radius, radius, float); //! Radius of V0 candidate DECLARE_SOA_COLUMN(V0Type, v0Type, uint8_t); //! Bitmap with mass hypothesis of the V0 -DECLARE_SOA_DYNAMIC_COLUMN(Px, px, //! +DECLARE_SOA_DYNAMIC_COLUMN(Px, px, //! [](float pxProng0, float pxProng1) -> float { return 1.f * pxProng0 + 1.f * pxProng1; }); DECLARE_SOA_DYNAMIC_COLUMN(Py, py, //! [](float pyProng0, float pyProng1) -> float { return 1.f * pyProng0 + 1.f * pyProng1; }); diff --git a/PWGHF/D2H/TableProducer/candidateCreatorBplusReduced.cxx b/PWGHF/D2H/TableProducer/candidateCreatorBplusReduced.cxx index f3151c20fdc..3cd3e0f571b 100644 --- a/PWGHF/D2H/TableProducer/candidateCreatorBplusReduced.cxx +++ b/PWGHF/D2H/TableProducer/candidateCreatorBplusReduced.cxx @@ -200,8 +200,8 @@ struct HfCandidateCreatorBplusReduced { } } } // pi loop - } // D0 loop - } // end runCandidateCreation + } // D0 loop + } // end runCandidateCreation void processData(HfRedCollisionsWithExtras const& collisions, soa::Join const& candsD, @@ -297,6 +297,7 @@ struct HfCandidateCreatorBplusReducedExpressions { filledMcInfo = true; if constexpr (checkDecayTypeMc) { rowBplusMcCheck(rowD0PiMcRec.pdgCodeBeautyMother(), + rowD0PiMcRec.pdgCodeCharmMother(), rowD0PiMcRec.pdgCodeProng0(), rowD0PiMcRec.pdgCodeProng1(), rowD0PiMcRec.pdgCodeProng2()); @@ -306,7 +307,7 @@ struct HfCandidateCreatorBplusReducedExpressions { if (!filledMcInfo) { // protection to get same size tables in case something went wrong: we created a candidate that was not preselected in the D0-Pi creator rowBplusMcRec(0, -1, -1, -1.f); if constexpr (checkDecayTypeMc) { - rowBplusMcCheck(-1, -1, -1, -1); + rowBplusMcCheck(-1, -1, -1, -1, -1); } } } diff --git a/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx b/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx index a3d5fab058c..da1229bef17 100644 --- a/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx +++ b/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx @@ -651,7 +651,9 @@ struct HfDataCreatorCharmHadPiReduced { auto particleProng1 = vecDaughtersB[1].mcParticle(); auto particleProng2 = vecDaughtersB[2].mcParticle(); // b-hadron hypothesis - std::array bHadronMotherHypos = {Pdg::kBPlus, Pdg::kB0, Pdg::kBS}; + std::array bHadronMotherHypos = {Pdg::kBPlus, Pdg::kB0, Pdg::kBS, Pdg::kLambdaB0}; + // c-hadron hypothesis + std::array cHadronMotherHypos = {Pdg::kDPlus, Pdg::kDS, Pdg::kDStar, Pdg::kDSStar, Pdg::kLambdaCPlus}; for (const auto& bHadronMotherHypo : bHadronMotherHypos) { int index0Mother = RecoDecay::getMother(particlesMc, particleProng0, bHadronMotherHypo, true); @@ -667,12 +669,33 @@ struct HfDataCreatorCharmHadPiReduced { pdgCodeProng0 = particleProng0.pdgCode(); pdgCodeProng1 = particleProng1.pdgCode(); pdgCodeProng2 = particleProng2.pdgCode(); + // look for common c-hadron mother among prongs 0, 1 and 2 + for (const auto& cHadronMotherHypo : cHadronMotherHypos) { + int8_t depthMax = 2; + if (cHadronMotherHypo == Pdg::kDStar || cHadronMotherHypo == Pdg::kDSStar) { // to include D* -> D π0/γ, D* -> D0 π, and Ds* -> Ds π0/γ + depthMax += 1; + } + int index0CharmMother = RecoDecay::getMother(particlesMc, particleProng0, cHadronMotherHypo, true, &sign, depthMax); + int index1CharmMother = RecoDecay::getMother(particlesMc, particleProng1, cHadronMotherHypo, true, &sign, depthMax); + if (index0CharmMother > -1 && index1CharmMother > -1) { + if (index0CharmMother == index1CharmMother) { + // pdgCodeCharmMother = + // Pdg::kDPlus (if D+ is the mother and does not come from D*+) + // Pdg::kDPlus + Pdg::kDStar (if D+ is the mother and D*+ -> D+ π0/γ) + // Pdg::kDStar (if D*+ is the mother and D*+ -> D0 π+) + // Pdg::kDS (if Ds is the mother and does not come from Ds*) + // Pdg::kDS + Pdg::kDSStar (if Ds is the mother and Ds* -> Ds π0/γ) + // Pdg::kLambdaCPlus (if Λc+ is the mother) + pdgCodeCharmMother += std::abs(particlesMc.rawIteratorAt(index0CharmMother).pdgCode()); + } + } + } break; } } } } - rowHfD0PiMcCheckReduced(pdgCodeBeautyMother, pdgCodeProng0, pdgCodeProng1, pdgCodeProng2); + rowHfD0PiMcCheckReduced(pdgCodeBeautyMother, pdgCodeCharmMother, pdgCodeProng0, pdgCodeProng1, pdgCodeProng2); } rowHfD0PiMcRecReduced(indexHfCandCharm, selectedTracksPion[vecDaughtersB.back().globalIndex()], flag, flagWrongCollision, debug, motherPt); } diff --git a/PWGHF/D2H/Tasks/taskBplusReduced.cxx b/PWGHF/D2H/Tasks/taskBplusReduced.cxx index 159241e0f0e..f296b059503 100644 --- a/PWGHF/D2H/Tasks/taskBplusReduced.cxx +++ b/PWGHF/D2H/Tasks/taskBplusReduced.cxx @@ -148,6 +148,7 @@ DECLARE_SOA_TABLE(HfRedBpMcCheck, "AOD", "HFREDBPMCCHECK", //! Table with MC dec hf_cand_bplus_lite::Pt, hf_cand_bplus_lite::MlScoreSig, hf_bplus_mc::PdgCodeBeautyMother, + hf_bplus_mc::PdgCodeCharmMother, hf_bplus_mc::PdgCodeProng0, hf_bplus_mc::PdgCodeProng1, hf_bplus_mc::PdgCodeProng2); @@ -640,6 +641,7 @@ struct HfTaskBplusReduced { ptCandBplus, candidateMlScoreSig, candidate.pdgCodeBeautyMother(), + candidate.pdgCodeCharmMother(), candidate.pdgCodeProng0(), candidate.pdgCodeProng1(), candidate.pdgCodeProng2()); From 62a3d25a6f1af119cfd3bd56dd6db43650928faf Mon Sep 17 00:00:00 2001 From: victorvalenciatorres <118812999+victorvalenciatorres@users.noreply.github.com> Date: Wed, 12 Feb 2025 12:20:32 +0100 Subject: [PATCH 0171/1650] [PWGDQ] Adding small fix for cumulants (#9855) --- PWGDQ/Core/VarManager.cxx | 4 ++++ PWGDQ/Tasks/tableReader.cxx | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/PWGDQ/Core/VarManager.cxx b/PWGDQ/Core/VarManager.cxx index b845fce10ec..70479bc8195 100644 --- a/PWGDQ/Core/VarManager.cxx +++ b/PWGDQ/Core/VarManager.cxx @@ -410,6 +410,10 @@ void VarManager::SetDefaultVarNames() fgVariableUnits[kNTPCmedianTimeShortC] = "#mu s"; fgVariableNames[kPt] = "p_{T}"; fgVariableUnits[kPt] = "GeV/c"; + fgVariableNames[kPt1] = "p_{T1}"; + fgVariableUnits[kPt1] = "GeV/c"; + fgVariableNames[kPt2] = "p_{T2}"; + fgVariableUnits[kPt2] = "GeV/c"; fgVariableNames[kInvPt] = "1/p_{T}"; fgVariableUnits[kInvPt] = "1/(GeV/c)"; fgVariableNames[kP] = "p"; diff --git a/PWGDQ/Tasks/tableReader.cxx b/PWGDQ/Tasks/tableReader.cxx index c89f696ed6d..04b1d0cdf84 100644 --- a/PWGDQ/Tasks/tableReader.cxx +++ b/PWGDQ/Tasks/tableReader.cxx @@ -106,7 +106,7 @@ using MyEventsQvectorCentr = soa::Join; using MyEventsQvectorExtra = soa::Join; using MyEventsHashSelectedQvector = soa::Join; -using MyEventsHashSelectedQvectorExtra = soa::Join; +using MyEventsHashSelectedQvectorExtra = soa::Join; using MyEventsHashSelectedQvectorCentr = soa::Join; using MyBarrelTracks = soa::Join; From 853153f4e73e6a2ac697205bc96190a33d530a25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrea=20Tavira=20Garc=C3=ADa?= <118979672+atavirag@users.noreply.github.com> Date: Wed, 12 Feb 2025 12:47:26 +0100 Subject: [PATCH 0172/1650] [PWGHF] Fix ML variable addition to tree creator (#9885) --- PWGHF/TableProducer/treeCreatorD0ToKPi.cxx | 42 +++++++++++++--------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/PWGHF/TableProducer/treeCreatorD0ToKPi.cxx b/PWGHF/TableProducer/treeCreatorD0ToKPi.cxx index 70277fc4d18..93f632378fa 100644 --- a/PWGHF/TableProducer/treeCreatorD0ToKPi.cxx +++ b/PWGHF/TableProducer/treeCreatorD0ToKPi.cxx @@ -17,6 +17,8 @@ /// \author Nicolo' Jacazio , CERN /// \author Andrea Tavira García , IJCLab +#include + #include "CommonConstants/PhysicsConstants.h" #include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" @@ -275,7 +277,7 @@ struct HfTreeCreatorD0ToKPi { template auto fillTable(const T& candidate, int candFlag, double invMass, double cosThetaStar, double topoChi2, - double ct, double y, double e, int8_t flagMc, int8_t origin) + double ct, double y, double e, int8_t flagMc, int8_t origin, std::vector const& mlProbD0) { if (fillCandidateLiteTable) { rowCandidateLite( @@ -379,18 +381,10 @@ struct HfTreeCreatorD0ToKPi { candidate.globalIndex()); } if constexpr (applyMl) { - if (candidate.isSelD0()) { - rowCandidateMl( - candidate.mlProbD0()[0], - candidate.mlProbD0()[1], - candidate.mlProbD0()[2]); - } - if (candidate.isSelD0bar()) { - rowCandidateMl( - candidate.mlProbD0bar()[0], - candidate.mlProbD0bar()[1], - candidate.mlProbD0bar()[2]); - } + rowCandidateMl( + mlProbD0[0], + mlProbD0[1], + mlProbD0[2]); } } @@ -425,6 +419,7 @@ struct HfTreeCreatorD0ToKPi { double eD = hfHelper.eD0(candidate); double ctD = hfHelper.ctD0(candidate); float massD0, massD0bar; + std::vector mlProbD0, mlProbD0bar; float topolChi2PerNdf = -999.; if constexpr (reconstructionType == aod::hf_cand::VertexerType::KfParticle) { massD0 = candidate.kfGeoMassD0(); @@ -435,10 +430,16 @@ struct HfTreeCreatorD0ToKPi { massD0bar = hfHelper.invMassD0barToKPi(candidate); } if (candidate.isSelD0()) { - fillTable(candidate, 0, massD0, hfHelper.cosThetaStarD0(candidate), topolChi2PerNdf, ctD, yD, eD, 0, 0); + if constexpr (applyMl) { + mlProbD0 = std::vector(candidate.mlProbD0().begin(), candidate.mlProbD0().end()); + } + fillTable(candidate, 0, massD0, hfHelper.cosThetaStarD0(candidate), topolChi2PerNdf, ctD, yD, eD, 0, 0, mlProbD0); } if (candidate.isSelD0bar()) { - fillTable(candidate, 1, massD0bar, hfHelper.cosThetaStarD0bar(candidate), topolChi2PerNdf, ctD, yD, eD, 0, 0); + if constexpr (applyMl) { + mlProbD0bar = std::vector(candidate.mlProbD0bar().begin(), candidate.mlProbD0bar().end()); + } + fillTable(candidate, 1, massD0bar, hfHelper.cosThetaStarD0bar(candidate), topolChi2PerNdf, ctD, yD, eD, 0, 0, mlProbD0bar); } } } @@ -524,6 +525,7 @@ struct HfTreeCreatorD0ToKPi { double ctD = hfHelper.ctD0(candidate); float massD0, massD0bar; float topolChi2PerNdf = -999.; + std::vector mlProbD0, mlProbD0bar; if constexpr (reconstructionType == aod::hf_cand::VertexerType::KfParticle) { massD0 = candidate.kfGeoMassD0(); massD0bar = candidate.kfGeoMassD0bar(); @@ -533,10 +535,16 @@ struct HfTreeCreatorD0ToKPi { massD0bar = hfHelper.invMassD0barToKPi(candidate); } if (candidate.isSelD0()) { - fillTable(candidate, 0, massD0, hfHelper.cosThetaStarD0(candidate), topolChi2PerNdf, ctD, yD, eD, candidate.flagMcMatchRec(), candidate.originMcRec()); + if constexpr (applyMl) { + mlProbD0 = std::vector(candidate.mlProbD0().begin(), candidate.mlProbD0().end()); + } + fillTable(candidate, 0, massD0, hfHelper.cosThetaStarD0(candidate), topolChi2PerNdf, ctD, yD, eD, candidate.flagMcMatchRec(), candidate.originMcRec(), mlProbD0); } if (candidate.isSelD0bar()) { - fillTable(candidate, 1, massD0bar, hfHelper.cosThetaStarD0bar(candidate), topolChi2PerNdf, ctD, yD, eD, candidate.flagMcMatchRec(), candidate.originMcRec()); + if constexpr (applyMl) { + mlProbD0bar = std::vector(candidate.mlProbD0bar().begin(), candidate.mlProbD0bar().end()); + } + fillTable(candidate, 1, massD0bar, hfHelper.cosThetaStarD0bar(candidate), topolChi2PerNdf, ctD, yD, eD, candidate.flagMcMatchRec(), candidate.originMcRec(), mlProbD0bar); } } From 33adbf160ab74ad2fe1b6fb2d9547a56e3daa4bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Wed, 12 Feb 2025 13:46:46 +0100 Subject: [PATCH 0173/1650] [PWGHF,Trigger] use lower limit nSigmaITS cut only for the deuteron (#9911) Co-authored-by: ALICE Action Bot --- EventFiltering/PWGHF/HFFilterHelpers.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/EventFiltering/PWGHF/HFFilterHelpers.h b/EventFiltering/PWGHF/HFFilterHelpers.h index dd88a9d9050..c2e3634625a 100644 --- a/EventFiltering/PWGHF/HFFilterHelpers.h +++ b/EventFiltering/PWGHF/HFFilterHelpers.h @@ -282,10 +282,10 @@ static const std::vector labelsRowsCutsPt = {"Minimum", "Maximum"}; // PID cuts constexpr float cutsNsigma[4][7] = { - {3., 3., 3., 5., 3., 3., 5.}, // TPC proton from Lc, pi/K from D0, K from 3-prong, femto selected proton, pi/K from Xic/Omegac, K from Xic*->SigmaC-Kaon, femto selected deuteron - {3., 3., 3., 2.5, 3., 3., 5.}, // TOF proton from Lc, pi/K from D0, K from 3-prong, femto selected proton, pi/K from Xic/Omegac, K from Xic*->SigmaC-Kaon, femto selected deuteron - {999., 999., 999., 2.5, 999., 999., 5.}, // Sum in quadrature of TPC and TOF (used only for femto selected proton and deuteron for pT < 4 GeV/c) - {999., 999., 999., 999., 999., 999., 4.} // used only for femto selected deuteron for less than pt threshold + {3., 3., 3., 5., 3., 3., 5.}, // TPC proton from Lc, pi/K from D0, K from 3-prong, femto selected proton, pi/K from Xic/Omegac, K from Xic*->SigmaC-Kaon, femto selected deuteron + {3., 3., 3., 2.5, 3., 3., 5.}, // TOF proton from Lc, pi/K from D0, K from 3-prong, femto selected proton, pi/K from Xic/Omegac, K from Xic*->SigmaC-Kaon, femto selected deuteron + {999., 999., 999., 2.5, 999., 999., 5.}, // Sum in quadrature of TPC and TOF (used only for femto selected proton and deuteron for pT < 4 GeV/c) + {999., 999., 999., 999., 999., 999., -4.} // ITS used only for femto selected deuteron for less than pt threshold }; static const std::vector labelsColumnsNsigma = {"PrFromLc", "PiKaFromDZero", "KaFrom3Prong", "PrForFemto", "PiKaFromCharmBaryon", "SoftKaonFromXicResoToSigmaC", "DeForFemto"}; static const std::vector labelsRowsNsigma = {"TPC", "TOF", "Comb", "ITS"}; @@ -636,8 +636,8 @@ class HfFilterHelper float mPtMinSigmaC2520Zero{0.f}; // pt min SigmaC(2520)0 candidate float mPtMinSigmaCPlusPlus{0.f}; // pt min SigmaC++ candidate float mPtMinSigmaC2520PlusPlus{0.f}; // pt min SigmaC(2520)++ candidate - std::array mNSigmaPrCutsForFemto{3., 3., 3., 4.}; // cut values for Nsigma TPC, TOF, combined, ITS for femto protons - std::array mNSigmaDeCutsForFemto{3., 3., 3., 4.}; // cut values for Nsigma TPC, TOF, combined, ITS for femto deuterons + std::array mNSigmaPrCutsForFemto{3., 3., 3., -4.}; // cut values for Nsigma TPC, TOF, combined, ITS for femto protons + std::array mNSigmaDeCutsForFemto{3., 3., 3., -4.}; // cut values for Nsigma TPC, TOF, combined, ITS for femto deuterons float mNSigmaTpcPrCutForCharmBaryons{3.}; // maximum Nsigma TPC for protons in Lc and Xic decays float mNSigmaTofPrCutForCharmBaryons{3.}; // maximum Nsigma TOF for protons in Lc and Xic decays float mNSigmaTpcKaCutFor3Prongs{3.}; // maximum Nsigma TPC for kaons in 3-prong decays @@ -876,7 +876,7 @@ inline bool HfFilterHelper::isSelectedTrack4Femto(const T1& track, const T2& tra if (trackSpecies == kDeuteronForFemto) { // Apply different PID strategy in different pt range if (pt <= ptThresholdPidStrategy) { - if (std::fabs(NSigmaTPC) > nSigmaCuts[0] && std::fabs(NSigmaITS) > nSigmaCuts[3]) { // Use TPC and ITS below the threshold + if (std::fabs(NSigmaTPC) > nSigmaCuts[0] && NSigmaITS > nSigmaCuts[3]) { // Use TPC and ITS below the threshold, NSigmaITS for deuteron with a lower limit return false; } } else { From 49f308f175b1d28848c8d1dd08a1561206d477ed Mon Sep 17 00:00:00 2001 From: Nasir Mehdi Malik <89008506+nasirmehdimalik@users.noreply.github.com> Date: Wed, 12 Feb 2025 18:39:36 +0530 Subject: [PATCH 0174/1650] =?UTF-8?q?[PWGLF]=20Removed=20collisonID=20colu?= =?UTF-8?q?mns=20from=20LFResonanceMerged=20tables=20not=20=E2=80=A6=20(#9?= =?UTF-8?q?916)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PWGLF/DataModel/LFResonanceTables.h | 4 +- .../Resonances/LFResonanceMergeDF.cxx | 19 +++-- PWGLF/Tasks/Resonances/lambda1520_PbPb.cxx | 70 +++++++++---------- 3 files changed, 45 insertions(+), 48 deletions(-) diff --git a/PWGLF/DataModel/LFResonanceTables.h b/PWGLF/DataModel/LFResonanceTables.h index af204219fc8..10b84d7d02c 100644 --- a/PWGLF/DataModel/LFResonanceTables.h +++ b/PWGLF/DataModel/LFResonanceTables.h @@ -118,7 +118,7 @@ using ResoEvtPlCollision = ResoEvtPlCollisions::iterator; // For DF mixing study DECLARE_SOA_TABLE(ResoCollisionDFs, "AOD", "RESOCOLLISIONDF", o2::soa::Index<>, - resocollision::CollisionId, + // resocollision::CollisionId, o2::aod::mult::MultNTracksPV, collision::PosX, collision::PosY, @@ -256,7 +256,7 @@ using ResoTrack = ResoTracks::iterator; DECLARE_SOA_TABLE(ResoTrackDFs, "AOD", "RESOTRACKDFs", o2::soa::Index<>, resodaughter::ResoCollisionDFId, - resodaughter::TrackId, + // resodaughter::TrackId, resodaughter::Pt, resodaughter::Px, resodaughter::Py, diff --git a/PWGLF/TableProducer/Resonances/LFResonanceMergeDF.cxx b/PWGLF/TableProducer/Resonances/LFResonanceMergeDF.cxx index 3d27c68d40e..42d81664a0c 100644 --- a/PWGLF/TableProducer/Resonances/LFResonanceMergeDF.cxx +++ b/PWGLF/TableProducer/Resonances/LFResonanceMergeDF.cxx @@ -88,8 +88,8 @@ struct reso2dfmerged { Produces reso2trksdf; int df = 0; - std::vector> vecOfTuples; - std::vector> vecOfTuples; + std::vector(tuple)); - resoCollisionsdf(std::get<0>(tuple), 0, std::get<1>(tuple), std::get<2>(tuple), std::get<3>(tuple), std::get<4>(tuple), std::get<5>(tuple), std::get<6>(tuple), 0., 0., 0., 0., 0, collision.trackOccupancyInTimeRange()); + resoCollisionsdf(0, std::get<0>(tuple), std::get<1>(tuple), std::get<2>(tuple), std::get<3>(tuple), std::get<4>(tuple), std::get<5>(tuple), 0., 0., 0., 0., 0, collision.trackOccupancyInTimeRange()); // LOGF(info, "collisions: Index = %d ) %f - %f - %f %f %d -- %d", std::get<0>(tuple).globalIndex(),std::get<1>(tuple),std::get<2>(tuple), std::get<3>(tuple), std::get<4>(tuple), std::get<5>(tuple).size(),resoCollisionsdf.lastIndex()); for (const auto& tuple : innerVector) { @@ -223,8 +223,7 @@ struct reso2dfmerged { std::get<31>(tuple), std::get<32>(tuple), std::get<33>(tuple), - std::get<34>(tuple), - std::get<35>(tuple)); + std::get<34>(tuple)); } } @@ -243,7 +242,7 @@ struct reso2dfmerged { histos.fill(HIST("Event/h1d_ft0_mult_percentile"), collision.cent()); - resoCollisionsdf(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), collision.cent(), collision.spherocity(), collision.evtPl(), 0., 0., 0., 0., 0, collision.trackOccupancyInTimeRange()); + resoCollisionsdf(0, collision.posX(), collision.posY(), collision.posZ(), collision.cent(), collision.spherocity(), collision.evtPl(), 0., 0., 0., 0., 0, collision.trackOccupancyInTimeRange()); for (auto& track : tracks) { if (isPrimary && !track.isPrimaryTrack()) @@ -271,7 +270,7 @@ struct reso2dfmerged { continue; reso2trksdf(resoCollisionsdf.lastIndex(), - track.globalIndex(), + // track.trackId(), track.pt(), track.px(), track.py(), diff --git a/PWGLF/Tasks/Resonances/lambda1520_PbPb.cxx b/PWGLF/Tasks/Resonances/lambda1520_PbPb.cxx index c094d4d0e35..ab86710e333 100644 --- a/PWGLF/Tasks/Resonances/lambda1520_PbPb.cxx +++ b/PWGLF/Tasks/Resonances/lambda1520_PbPb.cxx @@ -43,7 +43,7 @@ struct lambdaAnalysis_pb { Preslice perCollision = aod::track::collisionId; // Configurables. - Configurable ConfEvtOccupancyInTimeRange{"ConfEvtOccupancyInTimeRange", -1, "Evt sel: maximum track occupancy"}; + Configurable ConfEvtOccupancyInTimeRange{"ConfEvtOccupancyInTimeRange", false, "occupancy selection true or false"}; Configurable nBinsPt{"nBinsPt", 100, "N bins in pT histogram"}; Configurable nBinsInvM{"nBinsInvM", 120, "N bins in InvMass histogram"}; Configurable lambda1520id{"lambda1520id", 3124, "pdg"}; @@ -106,7 +106,7 @@ struct lambdaAnalysis_pb { ConfigurableAxis cMixVtxBins{"cMixVtxBins", {VARIABLE_WIDTH, -10.0f, -9.f, -8.f, -7.f, -6.f, -5.f, -4.f, -3.f, -2.f, -1.f, 0.f, 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f, 9.f, 10.f}, "Mixing bins - z-vertex"}; ConfigurableAxis cMixMultBins{"cMixMultBins", {VARIABLE_WIDTH, 0.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f, 200.0f}, "Mixing bins - multiplicity"}; ConfigurableAxis cMixEPAngle{"cMixEPAngle", {VARIABLE_WIDTH, -1.5708f, -1.25664f, -0.942478f, -0.628319f, 0.f, 0.628319f, 0.942478f, 1.25664f, 1.5708f}, "event plane"}; - + ConfigurableAxis occupancy_bins{"occupancy_bins", {VARIABLE_WIDTH, 0.0, 100, 500, 600, 1000, 1100, 1500, 1600, 2000, 2100, 2500, 2600, 3000, 3100, 3500, 3600, 4000, 4100, 4500, 4600, 5000, 5100, 9999}, "Binning of the occupancy axis"}; // Histogram Registry. HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -126,8 +126,9 @@ struct lambdaAnalysis_pb { const AxisSpec axisVz(120, -12, 12, {"vz"}); const AxisSpec axisEP(120, -3.14, 3.14, {"#theta"}); const AxisSpec axisInvM(nBinsInvM, 1.44, 2.04, {"M_{inv} (GeV/c^{2})"}); + AxisSpec axisOccupancy = {occupancy_bins, "Occupancy [-40,100]"}; - histos.add("Event/h1d_ft0_mult_percentile", "FT0 (%)", kTH1F, {axisCent}); + histos.add("Event/h1d_ft0_mult_percentile", "FT0 (%)", kTH2F, {axisCent, axisOccupancy}); if (doprocessMix || doprocessMixDF || doprocessMixepDF) { histos.add("Event/mixing_vzVsmultpercentile", "FT0(%)", kTH3F, {axisCent, axisVz, axisEP}); } @@ -174,15 +175,15 @@ struct lambdaAnalysis_pb { // Analysis // Lambda Invariant Mass if (!doprocessMC) { - histos.add("Analysis/h4d_lstar_invm_US_PM", "THn #Lambda(1520)", kTHnSparseF, {axisInvM, axisPt, axisCent}); - histos.add("Analysis/h4d_lstar_invm_US_MP", "THn #bar #Lambda(1520)", kTHnSparseF, {axisInvM, axisPt, axisCent}); - histos.add("Analysis/h4d_lstar_invm_PP", "THn Like Signs p K^{+}", kTHnSparseF, {axisInvM, axisPt, axisCent}); - histos.add("Analysis/h4d_lstar_invm_MM", "THn Like Signs #bar{p} K^{-}", kTHnSparseF, {axisInvM, axisPt, axisCent}); - histos.add("Analysis/h4d_lstar_invm_rot", "THn Rotated", kTHnSparseF, {axisInvM, axisPt, axisCent}); - histos.add("Analysis/h4d_lstar_invm_US_PM_mix", "THn Mixed Events", kTHnSparseF, {axisInvM, axisPt, axisCent}); - histos.add("Analysis/h4d_lstar_invm_US_MP_mix", "THn anti Mixed Events", kTHnSparseF, {axisInvM, axisPt, axisCent}); - histos.add("Analysis/h4d_lstar_invm_LS_PP_mix", "THn Mixed Events PP", kTHnSparseF, {axisInvM, axisPt, axisCent}); - histos.add("Analysis/h4d_lstar_invm_LS_MM_mix", "THn Mixed Events MM", kTHnSparseF, {axisInvM, axisPt, axisCent}); + histos.add("Analysis/h4d_lstar_invm_US_PM", "THn #Lambda(1520)", kTHnSparseF, {axisInvM, axisPt, axisCent, axisOccupancy}); + histos.add("Analysis/h4d_lstar_invm_US_MP", "THn #bar #Lambda(1520)", kTHnSparseF, {axisInvM, axisPt, axisCent, axisOccupancy}); + histos.add("Analysis/h4d_lstar_invm_PP", "THn Like Signs p K^{+}", kTHnSparseF, {axisInvM, axisPt, axisCent, axisOccupancy}); + histos.add("Analysis/h4d_lstar_invm_MM", "THn Like Signs #bar{p} K^{-}", kTHnSparseF, {axisInvM, axisPt, axisCent, axisOccupancy}); + histos.add("Analysis/h4d_lstar_invm_rot", "THn Rotated", kTHnSparseF, {axisInvM, axisPt, axisCent, axisOccupancy}); + histos.add("Analysis/h4d_lstar_invm_US_PM_mix", "THn Mixed Events", kTHnSparseF, {axisInvM, axisPt, axisCent, axisOccupancy}); + histos.add("Analysis/h4d_lstar_invm_US_MP_mix", "THn anti Mixed Events", kTHnSparseF, {axisInvM, axisPt, axisCent, axisOccupancy}); + histos.add("Analysis/h4d_lstar_invm_LS_PP_mix", "THn Mixed Events PP", kTHnSparseF, {axisInvM, axisPt, axisCent, axisOccupancy}); + histos.add("Analysis/h4d_lstar_invm_LS_MM_mix", "THn Mixed Events MM", kTHnSparseF, {axisInvM, axisPt, axisCent, axisOccupancy}); } // MC if (doprocessMC) { @@ -366,7 +367,7 @@ struct lambdaAnalysis_pb { } template - void fillDataHistos(trackType const& trk1, trackType const& trk2, float const& mult) + void fillDataHistos(trackType const& trk1, trackType const& trk2, float mult, int occup = 100) { TLorentzVector p1, p2, p; @@ -497,22 +498,22 @@ struct lambdaAnalysis_pb { if constexpr (!mix && !mc) { if (trkPr.sign() * trkKa.sign() < 0) { if (trkPr.sign() > 0) - histos.fill(HIST("Analysis/h4d_lstar_invm_US_PM"), _M, _pt, mult); + histos.fill(HIST("Analysis/h4d_lstar_invm_US_PM"), _M, _pt, mult, occup); else - histos.fill(HIST("Analysis/h4d_lstar_invm_US_MP"), _M, _pt, mult); + histos.fill(HIST("Analysis/h4d_lstar_invm_US_MP"), _M, _pt, mult, occup); if (doRotate) { float theta = rn->Uniform(1.56, 1.58); p1.RotateZ(theta); p = p1 + p2; if (std::abs(p.Rapidity()) < 0.5) { - histos.fill(HIST("Analysis/h4d_lstar_invm_rot"), p.M(), p.Pt(), mult); + histos.fill(HIST("Analysis/h4d_lstar_invm_rot"), p.M(), p.Pt(), mult, occup); } } } else { if (trkPr.sign() > 0) { - histos.fill(HIST("Analysis/h4d_lstar_invm_PP"), _M, _pt, mult); + histos.fill(HIST("Analysis/h4d_lstar_invm_PP"), _M, _pt, mult, occup); } else { - histos.fill(HIST("Analysis/h4d_lstar_invm_MM"), _M, _pt, mult); + histos.fill(HIST("Analysis/h4d_lstar_invm_MM"), _M, _pt, mult, occup); } } } @@ -520,14 +521,14 @@ struct lambdaAnalysis_pb { if constexpr (mix) { if (trkPr.sign() * trkKa.sign() < 0) { if (trkPr.sign() > 0) - histos.fill(HIST("Analysis/h4d_lstar_invm_US_PM_mix"), _M, _pt, mult); + histos.fill(HIST("Analysis/h4d_lstar_invm_US_PM_mix"), _M, _pt, mult, occup); else - histos.fill(HIST("Analysis/h4d_lstar_invm_US_MP_mix"), _M, _pt, mult); + histos.fill(HIST("Analysis/h4d_lstar_invm_US_MP_mix"), _M, _pt, mult, occup); } else { if (trkPr.sign() > 0) - histos.fill(HIST("Analysis/h4d_lstar_invm_LS_PP_mix"), _M, _pt, mult); + histos.fill(HIST("Analysis/h4d_lstar_invm_LS_PP_mix"), _M, _pt, mult, occup); else - histos.fill(HIST("Analysis/h4d_lstar_invm_LS_MM_mix"), _M, _pt, mult); + histos.fill(HIST("Analysis/h4d_lstar_invm_LS_MM_mix"), _M, _pt, mult, occup); } } @@ -560,9 +561,7 @@ struct lambdaAnalysis_pb { { // LOGF(info, " collisions: Index = %d %d", collision.globalIndex(),tracks.size()); - if (ConfEvtOccupancyInTimeRange > 0 && collision.trackOccupancyInTimeRange() > ConfEvtOccupancyInTimeRange) - return; - histos.fill(HIST("Event/h1d_ft0_mult_percentile"), collision.cent()); + histos.fill(HIST("Event/h1d_ft0_mult_percentile"), collision.cent(), 100); fillDataHistos(tracks, tracks, collision.cent()); } @@ -643,8 +642,6 @@ struct lambdaAnalysis_pb { SameKindPair pairs{binningPositions2, cNumMixEv, -1, collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip for (auto& [c1, t1, c2, t2] : pairs) { - if (ConfEvtOccupancyInTimeRange > 0 && c1.trackOccupancyInTimeRange() > ConfEvtOccupancyInTimeRange && c2.trackOccupancyInTimeRange() > ConfEvtOccupancyInTimeRange) - return; // LOGF(info, "processMCMixedDerived: Mixed collisions : %d (%.3f, %.3f,%d), %d (%.3f, %.3f,%d)",c1.globalIndex(), c1.posZ(), c1.cent(),c1.mult(), c2.globalIndex(), c2.posZ(), c2.cent(),c2.mult()); histos.fill(HIST("Event/mixing_vzVsmultpercentile"), c1.cent(), c1.posZ(), c1.evtPl()); fillDataHistos(t1, t2, c1.cent()); @@ -663,11 +660,13 @@ struct lambdaAnalysis_pb { if (doprocessData) LOG(error) << "Disable processData() first!"; - if (ConfEvtOccupancyInTimeRange > 0 && collision.trackOccupancyInTimeRange() > ConfEvtOccupancyInTimeRange) - return; + auto _occup = 100; + if (ConfEvtOccupancyInTimeRange) + _occup = collision.trackOccupancyInTimeRange(); + // LOGF(info, "inside df collisions: Index = %d %d", collision.globalIndex(),tracks.size()); - histos.fill(HIST("Event/h1d_ft0_mult_percentile"), collision.cent()); - fillDataHistos(tracks, tracks, collision.cent()); + histos.fill(HIST("Event/h1d_ft0_mult_percentile"), collision.cent(), _occup); + fillDataHistos(tracks, tracks, collision.cent(), _occup); } PROCESS_SWITCH(lambdaAnalysis_pb, processDatadf, "Process for data merged DF", false); @@ -684,12 +683,13 @@ struct lambdaAnalysis_pb { SameKindPair pairs{binningPositions2, cNumMixEv, -1, collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip for (auto& [c1, t1, c2, t2] : pairs) { - if (ConfEvtOccupancyInTimeRange > 0 && c1.trackOccupancyInTimeRange() > ConfEvtOccupancyInTimeRange && c2.trackOccupancyInTimeRange() > ConfEvtOccupancyInTimeRange) - return; + auto _occup = 100; + if (ConfEvtOccupancyInTimeRange) + _occup = c1.trackOccupancyInTimeRange(); // LOGF(info, "processMCMixedDerived: Mixed collisions : %d (%.3f, %.3f,%d), %d (%.3f, %.3f,%d)",c1.globalIndex(), c1.posZ(), c1.cent(),c1.mult(), c2.globalIndex(), c2.posZ(), c2.cent(),c2.mult()); histos.fill(HIST("Event/mixing_vzVsmultpercentile"), c1.cent(), c1.posZ(), c1.evtPl()); - fillDataHistos(t1, t2, c1.cent()); + fillDataHistos(t1, t2, c1.cent(), _occup); } } @@ -706,8 +706,6 @@ struct lambdaAnalysis_pb { SameKindPair pairs{binningPositions2, cNumMixEv, -1, collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip for (auto& [c1, t1, c2, t2] : pairs) { - if (ConfEvtOccupancyInTimeRange > 0 && c1.trackOccupancyInTimeRange() > ConfEvtOccupancyInTimeRange && c2.trackOccupancyInTimeRange() > ConfEvtOccupancyInTimeRange) - return; // LOGF(info, "processMCMixedDerived: Mixed collisions : %d (%.3f, %.3f,%.3f), %d (%.3f, %.3f, %.3f)",c1.globalIndex(), c1.posZ(), c1.cent(),c1.evtPl(), c2.globalIndex(), c2.posZ(), c2.cent(),c2.evtPl()); histos.fill(HIST("Event/mixing_vzVsmultpercentile"), c1.cent(), c1.posZ(), c1.evtPl()); fillDataHistos(t1, t2, c1.cent()); From 470584dd97adb27b6bfce6c2e6fda17eeb402b03 Mon Sep 17 00:00:00 2001 From: Pritam Chakraborty <47203359+prchakra@users.noreply.github.com> Date: Wed, 12 Feb 2025 14:17:23 +0100 Subject: [PATCH 0175/1650] [PWGCF] FemtoUniverse: Fixing min. TPC occupancy for SH task (#9913) --- .../femtoUniversePairTaskTrackTrackSpherHarMultKtExtended.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackSpherHarMultKtExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackSpherHarMultKtExtended.cxx index 32be5501872..0c5a91e1115 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackSpherHarMultKtExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackSpherHarMultKtExtended.cxx @@ -140,7 +140,7 @@ struct femtoUniversePairTaskTrackTrackSpherHarMultKtExtended { Filter collfilterFDtable = (o2::aod::femtouniversecollision::multV0M > ConfV0MLow) && (o2::aod::femtouniversecollision::multV0M < ConfV0MHigh); Filter collfilterFDExttable = (o2::aod::femtouniversecollision::interactionRate > ConfIntRateLow) && (o2::aod::femtouniversecollision::interactionRate < ConfIntRateHigh) && - (o2::aod::femtouniversecollision::occupancy > ConfTPCOccupancyLow) && (o2::aod::femtouniversecollision::occupancy < ConfTPCOccupancyHigh); + (o2::aod::femtouniversecollision::occupancy >= ConfTPCOccupancyLow) && (o2::aod::femtouniversecollision::occupancy < ConfTPCOccupancyHigh); using FilteredFDCollisions = soa::Filtered>; using FilteredFDCollision = FilteredFDCollisions::iterator; // Filter trackAdditionalfilter = (nabs(aod::femtouniverseparticle::eta) < twotracksconfigs.ConfEtaMax); // example filtering on configurable From f2ee285cb3d87f42d3458abf413a32d53543e7b3 Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Wed, 12 Feb 2025 14:35:41 +0100 Subject: [PATCH 0176/1650] [Common] Add PDG selection for flow test (#9910) Co-authored-by: ALICE Builder --- Common/Tasks/flowTest.cxx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Common/Tasks/flowTest.cxx b/Common/Tasks/flowTest.cxx index f08c4880a62..9e63991f928 100644 --- a/Common/Tasks/flowTest.cxx +++ b/Common/Tasks/flowTest.cxx @@ -39,6 +39,7 @@ struct flowTest { Configurable minB{"minB", 0.0f, "min impact parameter"}; Configurable maxB{"maxB", 20.0f, "max impact parameter"}; + Configurable pdgSelection{"pdgSelection", 0, "pdg code selection for tracking study (0: no selection)"}; ConfigurableAxis axisB{"axisB", {100, 0.0f, 20.0f}, ""}; ConfigurableAxis axisPhi{"axisPhi", {100, 0.0f, 2.0f * TMath::Pi()}, ""}; @@ -94,6 +95,8 @@ struct flowTest { int pdgCode = TMath::Abs(mcParticle.pdgCode()); if (pdgCode != 11 && pdgCode != 13 && pdgCode != 211 && pdgCode != 321 && pdgCode != 2212) continue; + if ((pdgSelection.value != 0) && (pdgCode != pdgSelection.value)) + continue; // isn't of desired species and pdgSelection is requested if (!mcParticle.isPhysicalPrimary()) continue; From 436f7881a9604aa62a5d423571fa975bbc71fb89 Mon Sep 17 00:00:00 2001 From: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> Date: Wed, 12 Feb 2025 14:51:04 +0100 Subject: [PATCH 0177/1650] [PWGLF] Remove TrackIU in TracksWithExtra joined table (#9853) --- PWGLF/TableProducer/Strangeness/lambdakzerobuilder.cxx | 2 +- PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/lambdakzerobuilder.cxx b/PWGLF/TableProducer/Strangeness/lambdakzerobuilder.cxx index 7097705f7a1..7351501e66c 100644 --- a/PWGLF/TableProducer/Strangeness/lambdakzerobuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/lambdakzerobuilder.cxx @@ -1217,7 +1217,7 @@ struct lambdakzeroBuilder { if (createV0PosAtDCAs) v0dauPositions(v0candidate.posPosition[0], v0candidate.posPosition[1], v0candidate.posPosition[2], v0candidate.negPosition[0], v0candidate.negPosition[1], v0candidate.negPosition[2]); - if (createV0PosAtDCAs) { + if (createV0PosAtIUs) { std::array posPositionIU; std::array negPositionIU; lPositiveTrackIU.getXYZGlo(posPositionIU); diff --git a/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx index e4a3350023d..21c4408388e 100644 --- a/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx @@ -57,7 +57,7 @@ using namespace o2::framework; using namespace o2::framework::expressions; using std::array; -using TracksWithExtra = soa::Join; +using TracksWithExtra = soa::Join; using TracksCompleteIUMC = soa::Join; using FullTracksExtIUTOF = soa::Join; using FullCollisions = soa::Join; @@ -780,18 +780,18 @@ struct strangederivedbuilder { // done! } - void processTrackExtras(aod::V0Datas const& V0s, aod::CascDatas const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, soa::Join const& tracksExtra, aod::V0s const&) + void processTrackExtras(aod::V0Datas const& V0s, aod::CascDatas const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, soa::Join const& tracksExtra, aod::V0s const&) { fillTrackExtras(V0s, Cascades, KFCascades, TraCascades, tracksExtra); } // no TPC services - void processTrackExtrasNoPID(aod::V0Datas const& V0s, aod::CascDatas const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, soa::Join const& tracksExtra, aod::V0s const&) + void processTrackExtrasNoPID(aod::V0Datas const& V0s, aod::CascDatas const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, soa::Join const& tracksExtra, aod::V0s const&) { fillTrackExtras(V0s, Cascades, KFCascades, TraCascades, tracksExtra); } - void processTrackExtrasMC(aod::V0Datas const& V0s, aod::CascDatas const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, soa::Join const& tracksExtra, aod::V0s const&) + void processTrackExtrasMC(aod::V0Datas const& V0s, aod::CascDatas const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, soa::Join const& tracksExtra, aod::V0s const&) { fillTrackExtras(V0s, Cascades, KFCascades, TraCascades, tracksExtra); } From dd07a7db6752bcded201d140090e5ae5027efdbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Wed, 12 Feb 2025 15:57:44 +0100 Subject: [PATCH 0178/1650] [PWGHF] add the missing tag of D0 bar reflection in Tcc tree creator (#9908) Co-authored-by: ALICE Action Bot --- PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx b/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx index f5037c3cd0e..56c7eed26eb 100644 --- a/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx +++ b/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx @@ -292,7 +292,7 @@ struct HfTreeCreatorTccToD0D0Pi { std::copy(candidateD1.mlProbD0().begin(), candidateD1.mlProbD0().end(), std::back_inserter(mlScoresD1)); massD01 = hfHelper.invMassD0ToPiK(candidateD1); } else if (candidateD1.isSelD0bar()) { - candFlagD1 = 2; + candFlagD1 = (candidateD1.isSelD0()) ? 3 : 2; std::copy(candidateD1.mlProbD0bar().begin(), candidateD1.mlProbD0bar().end(), std::back_inserter(mlScoresD1)); massD01 = hfHelper.invMassD0barToKPi(candidateD1); } @@ -303,7 +303,7 @@ struct HfTreeCreatorTccToD0D0Pi { massD02 = hfHelper.invMassD0ToPiK(candidateD2); } else if (candidateD2.isSelD0bar()) { - candFlagD2 = 2; + candFlagD2 = (candidateD2.isSelD0()) ? 3 : 2; std::copy(candidateD2.mlProbD0bar().begin(), candidateD2.mlProbD0bar().end(), std::back_inserter(mlScoresD2)); massD02 = hfHelper.invMassD0barToKPi(candidateD2); } From 6eeb206119a24817f4436998227f9f2056632d21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Wed, 12 Feb 2025 16:21:00 +0100 Subject: [PATCH 0179/1650] [PWGLF] Update v0qaanalysis.cxx (#9902) --- PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx b/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx index d527e928a9c..a38d6c8a27f 100644 --- a/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx +++ b/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx @@ -66,7 +66,7 @@ struct LfV0qaanalysis { } LOG(info) << "Number of process functions enabled: " << nProc; - registry.add("hNEvents", "hNEvents", {HistType::kTH1I, {{10, 0.f, 10.f}}}); + registry.add("hNEvents", "hNEvents", {HistType::kTH1D, {{10, 0.f, 10.f}}}); registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(1, "all"); registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(2, "sel8"); registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(3, "TVX"); @@ -86,14 +86,14 @@ struct LfV0qaanalysis { registry.add("hCentFT0M_GenRecoColl_MC_INELgt0", "hCentFT0M_GenRecoColl_MC_INELgt0", {HistType::kTH1F, {{1000, 0.f, 100.f}}}); registry.add("hCentFT0M_GenColl_MC", "hCentFT0M_GenColl_MC", {HistType::kTH1F, {{1000, 0.f, 100.f}}}); registry.add("hCentFT0M_GenColl_MC_INELgt0", "hCentFT0M_GenColl_MC_INELgt0", {HistType::kTH1F, {{1000, 0.f, 100.f}}}); - registry.add("hNEventsMCGen", "hNEventsMCGen", {HistType::kTH1I, {{4, 0.f, 4.f}}}); + registry.add("hNEventsMCGen", "hNEventsMCGen", {HistType::kTH1D, {{4, 0.f, 4.f}}}); registry.get(HIST("hNEventsMCGen"))->GetXaxis()->SetBinLabel(1, "all"); registry.get(HIST("hNEventsMCGen"))->GetXaxis()->SetBinLabel(2, "zvertex_true"); registry.get(HIST("hNEventsMCGen"))->GetXaxis()->SetBinLabel(3, "INELgt0_true"); - registry.add("hNEventsMCGenReco", "hNEventsMCGenReco", {HistType::kTH1I, {{2, 0.f, 2.f}}}); + registry.add("hNEventsMCGenReco", "hNEventsMCGenReco", {HistType::kTH1D, {{2, 0.f, 2.f}}}); registry.get(HIST("hNEventsMCGenReco"))->GetXaxis()->SetBinLabel(1, "INEL"); registry.get(HIST("hNEventsMCGenReco"))->GetXaxis()->SetBinLabel(2, "INELgt0"); - registry.add("hNEventsMCReco", "hNEventsMCReco", {HistType::kTH1I, {{4, 0.f, 4.f}}}); + registry.add("hNEventsMCReco", "hNEventsMCReco", {HistType::kTH1D, {{4, 0.f, 4.f}}}); registry.get(HIST("hNEventsMCReco"))->GetXaxis()->SetBinLabel(1, "all"); registry.get(HIST("hNEventsMCReco"))->GetXaxis()->SetBinLabel(2, "pass ev sel"); registry.get(HIST("hNEventsMCReco"))->GetXaxis()->SetBinLabel(3, "INELgt0"); From 2e88ace5d4a397ea209eb6eee28524e52e2a9105 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Wed, 12 Feb 2025 16:51:24 +0100 Subject: [PATCH 0180/1650] [PWGLF] Update v0qaanalysis.cxx (#9898) Co-authored-by: ALICE Builder --- .../Strangeness/v0qaanalysis.cxx | 25 ++++++------------- 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx b/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx index a38d6c8a27f..bcb5724d1ef 100644 --- a/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx +++ b/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx @@ -13,6 +13,9 @@ /// /// \author Francesca Ercolessi (francesca.ercolessi@cern.ch) +#include +#include + #include "Framework/AnalysisTask.h" #include "Common/DataModel/TrackSelectionTables.h" #include "PWGLF/DataModel/LFStrangenessTables.h" @@ -217,15 +220,8 @@ struct LfV0qaanalysis { float ctauK0s = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short; // ITS clusters - int posITSNhits = 0, negITSNhits = 0; - for (unsigned int i = 0; i < 7; i++) { - if (v0.posTrack_as().itsClusterMap() & (1 << i)) { - posITSNhits++; - } - if (v0.negTrack_as().itsClusterMap() & (1 << i)) { - negITSNhits++; - } - } + const int posITSNhits = v0.posTrack_as().itsNCls(); + const int negITSNhits = v0.negTrack_as().itsNCls(); // Event flags int evFlag = 0; @@ -366,15 +362,8 @@ struct LfV0qaanalysis { } } - int posITSNhits = 0, negITSNhits = 0; - for (unsigned int i = 0; i < 7; i++) { - if (v0.posTrack_as().itsClusterMap() & (1 << i)) { - posITSNhits++; - } - if (v0.negTrack_as().itsClusterMap() & (1 << i)) { - negITSNhits++; - } - } + const int posITSNhits = v0.posTrack_as().itsNCls(); + const int negITSNhits = v0.negTrack_as().itsNCls(); float ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0; float ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0Bar; From 925d6d5e7e59f1d5069105f52479740961ac8b67 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Wed, 12 Feb 2025 18:29:40 +0100 Subject: [PATCH 0181/1650] [PWGLF] Add Event Plane flow for phi meson (#9891) --- PWGLF/Tasks/Resonances/phipbpb.cxx | 43 +++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/PWGLF/Tasks/Resonances/phipbpb.cxx b/PWGLF/Tasks/Resonances/phipbpb.cxx index 2a628fffa78..f8122d12681 100644 --- a/PWGLF/Tasks/Resonances/phipbpb.cxx +++ b/PWGLF/Tasks/Resonances/phipbpb.cxx @@ -92,6 +92,7 @@ struct phipbpb { Configurable cfgCutCentrality{"cfgCutCentrality", 80.0f, "Accepted maximum Centrality"}; Configurable cfgCutOccupancy{"cfgCutOccupancy", 3000, "Occupancy cut"}; // track + Configurable useSP{"useSP", false, "use SP"}; Configurable additionalEvsel{"additionalEvsel", false, "Additional event selcection"}; Configurable additionalEvselITS{"additionalEvselITS", true, "Additional event selcection for ITS"}; Configurable removefaketrak{"removefaketrack", true, "Remove fake track from momentum difference"}; @@ -172,6 +173,7 @@ struct phipbpb { const AxisSpec thnAxisRapidity{configThnAxisRapidity, "Rapidity"}; const AxisSpec thnAxisSA{configThnAxisSA, "SA"}; AxisSpec cumulantAxis = {200, -1, 1, "phi"}; + AxisSpec squareAxis = {200, 0, 1, "aossquare"}; AxisSpec phiAxis = {500, -6.28, 6.28, "phi"}; AxisSpec resAxis = {6000, -30, 30, "Res"}; AxisSpec centAxis = {8, 0, 80, "V0M (%)"}; @@ -203,8 +205,8 @@ struct phipbpb { histos.add("hSparseV2SameEventCosDeltaPhi", "hSparseV2SameEventCosDeltaPhi", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); histos.add("hSparseV2MixedEventCosDeltaPhi", "hSparseV2MixedEventCosDeltaPhi", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); - histos.add("hSparseV2SameEventCosDeltaPhiSquare", "hSparseV2SameEventCosDeltaPhiSquare", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); - histos.add("hSparseV2MixedEventCosDeltaPhiSquare", "hSparseV2MixedEventCosDeltaPhiSquare", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); + histos.add("hSparseV2SameEventCosDeltaPhiSquare", "hSparseV2SameEventCosDeltaPhiSquare", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, squareAxis, thnAxisCentrality}); + histos.add("hSparseV2MixedEventCosDeltaPhiSquare", "hSparseV2MixedEventCosDeltaPhiSquare", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, squareAxis, thnAxisCentrality}); histos.add("hSparseV2SameEventSinDeltaPhi", "hSparseV2SameEventSinDeltaPhi", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); histos.add("hSparseV2MixedEventSinDeltaPhi", "hSparseV2MixedEventSinDeltaPhi", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); @@ -230,6 +232,13 @@ struct phipbpb { histos.add("ResSPFT0CFT0A", "ResSPFT0CFT0A", kTH3F, {centAxis, occupancyAxis, resAxis}); histos.add("ResSPFT0ATPC", "ResSPFT0ATPC", kTH3F, {centAxis, occupancyAxis, resAxis}); + histos.add("ResTrackSPFT0CTPC", "ResTrackSPFT0CTPC", kTH3F, {centAxis, occupancyAxis, resAxis}); + histos.add("ResTrackSPFT0CTPCR", "ResTrackSPFT0CTPCR", kTH3F, {centAxis, occupancyAxis, resAxis}); + histos.add("ResTrackSPFT0CTPCL", "ResTrackSPFT0CTPCL", kTH3F, {centAxis, occupancyAxis, resAxis}); + histos.add("ResTrackSPTPCRTPCL", "ResTrackSPTPCRTPCL", kTH3F, {centAxis, occupancyAxis, resAxis}); + histos.add("ResTrackSPFT0CFT0A", "ResTrackSPFT0CFT0A", kTH3F, {centAxis, occupancyAxis, resAxis}); + histos.add("ResTrackSPFT0ATPC", "ResTrackSPFT0ATPC", kTH3F, {centAxis, occupancyAxis, resAxis}); + // MC histogram if (isMC) { histos.add("hMC", "MC Event statistics", kTH1F, {{10, 0.0f, 10.0f}}); @@ -247,9 +256,9 @@ struct phipbpb { histos.add("hEventPlaneAngle", "hEventPlaneAngle", kTH1F, {{200, -2.0f * TMath::Pi(), 2.0f * TMath::Pi()}}); histos.add("hEventPlaneAngleRec", "hEventPlaneAngleRec", kTH1F, {{200, -2.0f * TMath::Pi(), 2.0f * TMath::Pi()}}); histos.add("hNchVsImpactParameter", "hNchVsImpactParameter", kTH2F, {{200, 0.0f, 20.0f}, {500, -0.5f, 5000.5f}}); - histos.add("hSparseMCGenWeight", "hSparseMCGenWeight", HistType::kTHnSparseF, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, axisPtKaonWeight, {8, -0.8, 0.8}}); - histos.add("hSparseMCRecWeight", "hSparseMCRecWeight", HistType::kTHnSparseF, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, axisPtKaonWeight, {8, -0.8, 0.8}}); - histos.add("hSparseMCRecAllTrackWeight", "hSparseMCRecAllTrackWeight", HistType::kTHnSparseF, {thnAxisCentrality, {36, 0.0, TMath::Pi()}, axisPtKaonWeight, {8, -0.8, 0.8}}); + histos.add("hSparseMCGenWeight", "hSparseMCGenWeight", HistType::kTHnSparseF, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {50, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); + histos.add("hSparseMCRecWeight", "hSparseMCRecWeight", HistType::kTHnSparseF, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {50, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); + histos.add("hSparseMCRecAllTrackWeight", "hSparseMCRecAllTrackWeight", HistType::kTHnSparseF, {thnAxisCentrality, {36, 0.0, TMath::Pi()}, {50, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); } // Event selection cut additional - Alex if (additionalEvsel) { @@ -541,6 +550,12 @@ struct phipbpb { } // LOGF(info, Form("weight %f %f",weight1, weight2)); if (TMath::Abs(PhiMesonMother.Rapidity()) < confRapidity) { + histos.fill(HIST("ResTrackSPFT0CTPC"), centrality, occupancy, QFT0C * QTPC * TMath::Cos(2.0 * (psiFT0C - psiTPC))); + histos.fill(HIST("ResTrackSPFT0CTPCR"), centrality, occupancy, QFT0C * QTPCR * TMath::Cos(2.0 * (psiFT0C - psiTPCR))); + histos.fill(HIST("ResTrackSPFT0CTPCL"), centrality, occupancy, QFT0C * QTPCL * TMath::Cos(2.0 * (psiFT0C - psiTPCL))); + histos.fill(HIST("ResTrackSPTPCRTPCL"), centrality, occupancy, QTPCR * QTPCL * TMath::Cos(2.0 * (psiTPCR - psiTPCL))); + histos.fill(HIST("ResTrackSPFT0CFT0A"), centrality, occupancy, QFT0C * QFT0A * TMath::Cos(2.0 * (psiFT0C - psiFT0A))); + histos.fill(HIST("ResTrackSPFT0ATPC"), centrality, occupancy, QTPC * QFT0A * TMath::Cos(2.0 * (psiTPC - psiFT0A))); if (useWeight) { histos.fill(HIST("hSparseV2SameEventCosDeltaPhi"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2 * QFT0C, centrality, 1 / totalweight); histos.fill(HIST("hSparseV2SameEventCosDeltaPhiSquare"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2 * v2, centrality, 1 / totalweight); @@ -551,7 +566,11 @@ struct phipbpb { histos.fill(HIST("hSparseV2SameEventCosPsi"), PhiMesonMother.M(), PhiMesonMother.Pt(), TMath::Cos(2.0 * psiFT0C), centrality, 1 / totalweight); histos.fill(HIST("hSparseV2SameEventSinPsi"), PhiMesonMother.M(), PhiMesonMother.Pt(), TMath::Sin(2.0 * psiFT0C), centrality, 1 / totalweight); } else { - histos.fill(HIST("hSparseV2SameEventCosDeltaPhi"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2 * QFT0C, centrality); + if (useSP) { + histos.fill(HIST("hSparseV2SameEventCosDeltaPhi"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2 * QFT0C, centrality); + } else { + histos.fill(HIST("hSparseV2SameEventCosDeltaPhi"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2, centrality); + } histos.fill(HIST("hSparseV2SameEventCosDeltaPhiSquare"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2 * v2, centrality); histos.fill(HIST("hSparseV2SameEventSinDeltaPhi"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2sin * QFT0C, centrality); @@ -666,7 +685,11 @@ struct phipbpb { auto v2sin = TMath::Sin(2.0 * phiminuspsi); histos.fill(HIST("hpTvsRapidity"), PhiMesonMother.Pt(), PhiMesonMother.Rapidity()); if (TMath::Abs(PhiMesonMother.Rapidity()) < confRapidity) { - histos.fill(HIST("hSparseV2MixedEventCosDeltaPhi"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2 * QFT0C, centrality); + if (useSP) { + histos.fill(HIST("hSparseV2MixedEventCosDeltaPhi"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2 * QFT0C, centrality); + } else { + histos.fill(HIST("hSparseV2MixedEventCosDeltaPhi"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2, centrality); + } histos.fill(HIST("hSparseV2MixedEventCosDeltaPhiSquare"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2 * v2, centrality); histos.fill(HIST("hSparseV2MixedEventSinDeltaPhi"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2sin * QFT0C, centrality); } @@ -928,7 +951,7 @@ struct phipbpb { continue; if (TMath::Abs(mcParticle.eta()) > 0.8) // main acceptance continue; - histos.fill(HIST("hSparseMCGenWeight"), centclass, GetPhiInRange(deltaPhi), mcParticle.pt(), mcParticle.eta()); + histos.fill(HIST("hSparseMCGenWeight"), centclass, GetPhiInRange(deltaPhi), TMath::Power(TMath::Cos(2.0 * GetPhiInRange(deltaPhi)), 2.0), mcParticle.pt(), mcParticle.eta()); nCh++; bool validGlobal = false; bool validAny = false; @@ -945,10 +968,10 @@ struct phipbpb { } // if valid global, fill if (validGlobal) { - histos.fill(HIST("hSparseMCRecWeight"), centclass, GetPhiInRange(deltaPhi), mcParticle.pt(), mcParticle.eta()); + histos.fill(HIST("hSparseMCRecWeight"), centclass, GetPhiInRange(deltaPhi), TMath::Power(TMath::Cos(2.0 * GetPhiInRange(deltaPhi)), 2.0), mcParticle.pt(), mcParticle.eta()); } if (validAny) { - histos.fill(HIST("hSparseMCRecAllTrackWeight"), centclass, GetPhiInRange(deltaPhi), mcParticle.pt(), mcParticle.eta()); + histos.fill(HIST("hSparseMCRecAllTrackWeight"), centclass, GetPhiInRange(deltaPhi), TMath::Power(TMath::Cos(2.0 * GetPhiInRange(deltaPhi)), 2.0), mcParticle.pt(), mcParticle.eta()); histos.fill(HIST("hEventPlaneAngleRec"), GetPhiInRange(deltaPhi)); } // if any track present, fill From cebaa887d465df979098bbf6d6cf33986a9802aa Mon Sep 17 00:00:00 2001 From: Thorkj <154221526+Thorkj@users.noreply.github.com> Date: Wed, 12 Feb 2025 20:13:36 +0100 Subject: [PATCH 0182/1650] =?UTF-8?q?[PWGCF]=20Significant=20Code=20update?= =?UTF-8?q?=20with=20proper=20event=20mixing=20and=20trigger=20Nch=20calc?= =?UTF-8?q?=E2=80=A6=20(#9912)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Thor Jensen --- .../Tasks/corrSparse.cxx | 136 +++++++++--------- 1 file changed, 65 insertions(+), 71 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx b/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx index e61155d2a48..7fc4d531fd1 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx @@ -24,6 +24,7 @@ #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/Centrality.h" +#include "Common/DataModel/Multiplicity.h" #include "PWGCF/Core/CorrelationContainer.h" #include "PWGCF/Core/PairCuts.h" #include "Common/Core/RecoDecay.h" @@ -32,138 +33,131 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; +#define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable NAME{#NAME, DEFAULT, HELP}; + struct CorrSparse { - Configurable cfgZVtxCut = {"cfgZVtxCut", 10.0, "Vertex z cut. Default 10 cm"}; - Configurable cfgPtCutMin = {"cfgPtCutMin", 0.2, "Minimum accepted track pT. Default 0.2 GeV"}; - Configurable cfgPtCutMax = {"cfgPtCutMax", 5.0, "Maximum accepted track pT. Default 5.0 GeV"}; - Configurable cfgEtaCut = {"cfgEtaCut", 0.8, "Eta cut. Default 0.8"}; - ConfigurableAxis axisVertex{"axisVertex", {7, -7, 7}, "vertex axis for histograms"}; + O2_DEFINE_CONFIGURABLE(cfgZVtxCut, float, 10.0f, "Accepted z-vertex range") + O2_DEFINE_CONFIGURABLE(cfgPtCutMin, float, 0.2f, "minimum accepted track pT") + O2_DEFINE_CONFIGURABLE(cfgPtCutMax, float, 10.0f, "maximum accepted track pT") + O2_DEFINE_CONFIGURABLE(cfgEtaCut, float, 0.8f, "Eta cut") + O2_DEFINE_CONFIGURABLE(cfgMinMixEventNum, int, 5, "Minimum number of events to mix") + + ConfigurableAxis axisVertex{"axisVertex", {20, -10, 10}, "vertex axis for histograms"}; + ConfigurableAxis axisEta{"axisEta", {40, -1., 1.}, "eta axis for histograms"}; + ConfigurableAxis axisPhi{"axisPhi", {72, 0.0, constants::math::TwoPI}, "phi axis for histograms"}; + ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt axis for histograms"}; ConfigurableAxis axisDeltaPhi{"axisDeltaPhi", {72, -PIHalf, PIHalf * 3}, "delta phi axis for histograms"}; ConfigurableAxis axisDeltaEta{"axisDeltaEta", {40, -2, 2}, "delta eta axis for histograms"}; ConfigurableAxis axisPtTrigger{"axisPtTrigger", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt trigger axis for histograms"}; ConfigurableAxis axisPtAssoc{"axisPtAssoc", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt associated axis for histograms"}; ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100}, "multiplicity / centrality axis for histograms"}; + ConfigurableAxis vtxMix{"vtxMix", {VARIABLE_WIDTH, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "vertex axis for mixed event histograms"}; + ConfigurableAxis multMix{"multMix", {VARIABLE_WIDTH, 0, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100}, "multiplicity / centrality axis for mixed event histograms"}; + + // make the filters and cuts. + + Filter collisionFilter = nabs(aod::collision::posZ) < cfgZVtxCut && (aod::evsel::sel8) == true; + + Filter trackFilter = (nabs(aod::track::eta) < cfgEtaCut) && (aod::track::pt > cfgPtCutMin) && (aod::track::pt < cfgPtCutMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)); + + // define the filtered collisions and tracks + + using AodCollisions = soa::Filtered>; // aod::CentFT0Cs + using AodTracks = soa::Filtered>; + HistogramRegistry registry{"registry"}; - int logcolls = 0; - int logcollpairs = 0; void init(InitContext&) { LOGF(info, "Starting init"); - registry.add("Yield", "pT vs eta vs Nch", {HistType::kTH3F, {{40, 0, 20, "p_{T}"}, {100, -2, 2, "#eta"}, {100, 0, 100, "Nch"}}}); // check to see total number of tracks - registry.add("etaphi_Trigger", "eta vs phi vs Nch", {HistType::kTH3F, {{100, -2, 2, "#eta"}, {200, 0, TwoPI, "#varphi"}, {100, 0, 100, "Nch"}}}); - // Make histograms to check the distributions after cuts registry.add("deltaEta_deltaPhi_same", "", {HistType::kTH2D, {axisDeltaPhi, axisDeltaEta}}); // check to see the delta eta and delta phi distribution registry.add("deltaEta_deltaPhi_mixed", "", {HistType::kTH2D, {axisDeltaPhi, axisDeltaEta}}); - registry.add("Phi", "Phi", {HistType::kTH1D, {{72, 0, TwoPI, "Phi"}}}); - registry.add("Eta", "Eta", {HistType::kTH1D, {{40, -2, 2, "Eta"}}}); + registry.add("Phi", "Phi", {HistType::kTH1D, {axisPhi}}); + registry.add("Eta", "Eta", {HistType::kTH1D, {axisEta}}); registry.add("pT", "pT", {HistType::kTH1D, {axisPtTrigger}}); registry.add("Nch", "N_{ch}", {HistType::kTH1D, {axisMultiplicity}}); + registry.add("zVtx", "zVtx", {HistType::kTH1D, {axisVertex}}); - registry.add("Sparse_mixed", "", {HistType::kTHnSparseF, {{axisVertex, axisPtTrigger, axisPtAssoc, axisMultiplicity, axisDeltaPhi, axisDeltaEta}}}); // Make the output sparse - registry.add("Sparse_same", "", {HistType::kTHnSparseF, {{axisVertex, axisPtTrigger, axisPtAssoc, axisMultiplicity, axisDeltaPhi, axisDeltaEta}}}); + registry.add("Sparse_mixed", "", {HistType::kTHnSparseF, {{axisMultiplicity, axisVertex, axisPtTrigger, axisPtAssoc, axisDeltaPhi, axisDeltaEta}}}); // Make the output sparse + registry.add("Sparse_same", "", {HistType::kTHnSparseF, {{axisMultiplicity, axisVertex, axisPtTrigger, axisPtAssoc, axisDeltaPhi, axisDeltaEta}}}); + registry.add("Trig_Hist", "", {HistType::kTH3F, {{axisMultiplicity, axisVertex, axisPtTrigger}}}); - const int maxMixBin = axisMultiplicity->size() * axisVertex->size(); - registry.add("eventcount", "bin", {HistType::kTH1F, {{maxMixBin + 2, -2.5, -0.5 + maxMixBin, "bin"}}}); // histogram to see how many events are in the same and mixed event + registry.add("eventcount", "bin", {HistType::kTH1F, {{3, 0, 3, "bin"}}}); // histogram to see how many events are in the same and mixed event } + enum EventType { + SameEvent = 1, + MixedEvent = 3 + }; // fill multiple histograms template - void fillYield(TCollision /*collision*/, float /*centrality*/, TTracks tracks) // function to fill the yield and etaphi histograms. + void fillYield(TCollision collision, TTracks tracks) // function to fill the yield and etaphi histograms. { registry.fill(HIST("Nch"), tracks.size()); + registry.fill(HIST("zVtx"), collision.posZ()); + for (auto const& track1 : tracks) { - registry.fill(HIST("Yield"), track1.pt(), track1.eta(), track1.size()); - registry.fill(HIST("etaphi_Trigger"), track1.eta(), track1.phi(), track1.size()); registry.fill(HIST("Phi"), track1.phi()); registry.fill(HIST("Eta"), track1.eta()); registry.fill(HIST("pT"), track1.pt()); } } - template - bool fillCollision(TCollision collision, float /*centrality*/) - { - - if (!collision.sel8()) { - return false; - } - - return true; - } - template void fillCorrelations(TTracks tracks1, TTracks tracks2, float posZ, int system, float Nch) // function to fill the Output functions (sparse) and the delta eta and delta phi histograms { // loop over all tracks for (auto const& track1 : tracks1) { + if (system == SameEvent) { + registry.fill(HIST("Trig_Hist"), Nch, posZ, track1.pt()); + } + for (auto const& track2 : tracks2) { - if (track1 == track2) { - continue; - } + + if (track1.pt() <= track2.pt()) + continue; // skip if the trigger pt is less than the associate p float deltaPhi = RecoDecay::constrainAngle(track1.phi() - track2.phi(), -PIHalf); float deltaEta = track1.eta() - track2.eta(); // fill the right sparse and histograms - if (system == 1) { + if (system == SameEvent) { registry.fill(HIST("deltaEta_deltaPhi_same"), deltaPhi, deltaEta); - registry.fill(HIST("Sparse_same"), posZ, track1.pt(), track2.pt(), Nch, deltaPhi, deltaEta); - } else if (system == 2) { + registry.fill(HIST("Sparse_same"), Nch, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta); + } else if (system == MixedEvent) { registry.fill(HIST("deltaEta_deltaPhi_mixed"), deltaPhi, deltaEta); - registry.fill(HIST("Sparse_mixed"), posZ, track1.pt(), track2.pt(), Nch, deltaPhi, deltaEta); + registry.fill(HIST("Sparse_mixed"), Nch, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta); } } } } - // make the filters and cuts. - - Filter collisionFilter = nabs(aod::collision::posZ) < cfgZVtxCut; - - Filter trackFilter = (nabs(aod::track::eta) < cfgEtaCut) && (aod::track::pt > cfgPtCutMin) && (aod::track::pt < cfgPtCutMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)); - - // define the filtered collisions and tracks - - using AodCollisions = soa::Filtered>; - using AodTracks = soa::Filtered>; - void processSame(AodCollisions::iterator const& collision, AodTracks const& tracks) { - const auto centrality = collision.centFT0C(); - registry.fill(HIST("eventcount"), -2); // because its same event i put it in the -2 bin - fillYield(collision, centrality, tracks); - fillCorrelations(tracks, tracks, collision.posZ(), 1, tracks.size()); // fill the SE histogram and Sparse + registry.fill(HIST("eventcount"), SameEvent); // because its same event i put it in the 1 bin + fillYield(collision, tracks); + fillCorrelations(tracks, tracks, collision.posZ(), SameEvent, tracks.size()); // fill the SE histogram and Sparse } PROCESS_SWITCH(CorrSparse, processSame, "Process same event", true); - // i do the event mixing (i have not changed this from the tutorial i got). - std::vector vtxBinsEdges{VARIABLE_WIDTH, -7.0f, -5.0f, -3.0f, -1.0f, 1.0f, 3.0f, 5.0f, 7.0f}; - std::vector multBinsEdges{VARIABLE_WIDTH, 0.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0, 100.1f}; - SliceCache cache; + // event mixing - ColumnBinningPolicy - bindingOnVtxAndMult{{vtxBinsEdges, multBinsEdges}, true}; // true is for 'ignore overflows' (true by default) - SameKindPair> - pair{bindingOnVtxAndMult, 5, -1, &cache}; // indicates that 5 events should be mixed and under/overflow (-1) to be ignored + SliceCache cache; + using MixedBinning = ColumnBinningPolicy; // the process for filling the mixed events - void processMixed(AodCollisions const& /*collisions*/, AodTracks const& /*tracks*/) + void processMixed(AodCollisions const& collisions, AodTracks const& tracks) { - for (auto const& [collision1, tracks1, collision2, tracks2] : pair) { - - if (fillCollision(collision1, collision1.centFT0C()) == false) { - continue; - } - - registry.fill(HIST("eventcount"), 1); // fill the mixed event in the 1 bin + MixedBinning binningOnVtxAndMult{{vtxMix, multMix}, true}; // true is for 'ignore overflows' (true by default) + auto tracksTuple = std::make_tuple(tracks); + SameKindPair pairs{binningOnVtxAndMult, cfgMinMixEventNum, -1, collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip - fillCorrelations(tracks1, tracks2, collision1.posZ(), 2, tracks1.size()); + for (auto const& [collision1, tracks1, collision2, tracks2] : pairs) { + registry.fill(HIST("eventcount"), MixedEvent); // fill the mixed event in the 3 bin + fillCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent, tracks1.size()); } } PROCESS_SWITCH(CorrSparse, processMixed, "Process mixed events", true); From ae6fa8281414bae3bb6d2a7e60f80de6c2a5cf74 Mon Sep 17 00:00:00 2001 From: Peter Stratmann <80676312+pestratm@users.noreply.github.com> Date: Wed, 12 Feb 2025 20:29:24 +0100 Subject: [PATCH 0183/1650] [PWGJE] Specify photon origins and general improvements (#9821) --- PWGJE/Tasks/hadronPhotonCorrelation.cxx | 161 +++++++++++++++--------- 1 file changed, 101 insertions(+), 60 deletions(-) diff --git a/PWGJE/Tasks/hadronPhotonCorrelation.cxx b/PWGJE/Tasks/hadronPhotonCorrelation.cxx index df7c9dc17b1..4681a8d586f 100644 --- a/PWGJE/Tasks/hadronPhotonCorrelation.cxx +++ b/PWGJE/Tasks/hadronPhotonCorrelation.cxx @@ -18,6 +18,7 @@ #include #include +#include #include #include "Framework/ASoA.h" @@ -67,10 +68,8 @@ struct HadronPhotonCorrelation { AxisSpec axisPhi = {72, 0., TwoPI, "#phi"}; // Axis for phi distribution AxisSpec axisDeltaPhi = {72, -PIHalf, 3 * PIHalf, "#Delta #phi"}; // Axis for Delta phi in correlations - AxisSpec axisDeltaPhiDecay = {100, -.5, .5, "#Delta #phi"}; // Axis for Delta phi between neutral hadrons and decay photons AxisSpec axisEta = {40, -.8, .8, "#eta"}; // Axis for eta distribution AxisSpec axisDeltaEta = {80, -1.6, 1.6, "#Delta #eta"}; // Axis for Delta eta in correlations - AxisSpec axisDeltaEtaDecay = {100, -.6, .6, "#Delta #eta"}; // Axis for Delta eta between neutral hadrons and decay photons ConfigurableAxis axisPtTrig = {"axisPtTrig", {VARIABLE_WIDTH, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 9.0f, 11.0f, 15.0f, 20.0f}, @@ -80,8 +79,11 @@ struct HadronPhotonCorrelation { 0.2, 0.5, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 9.0f, 11.0f, 15.0f}, "p_{T, assoc} [GeV]"}; // Axis for associated particle pt distribution AxisSpec axisDeltaPt = {200, 0., 1.2, "#Delta p_T"}; // Axis for pt ratio between neutral hadrons and decay photons - AxisSpec axisPid = {7, -1.5, 5.5, "pid"}; // Axis for PID of neutral hadrons + AxisSpec axisPid = {9, -3.5, 5.5, "pid"}; // Axis for PID of neutral hadrons AxisSpec axisMult = {100, 0., 99., "N_{ch}"}; // Axis for mutplipicity + AxisSpec axisAlpha = {100, 0., 1., "alpha"}; // Axis for decay photon pt assymetry + + AxisSpec axisDeltaRDecay = {100, 0., 0.8, "#Delta R"}; // Axis for Delta R = sqrt(Delta eta^2 + Delta phi^2) between neutral hadrons and decay photons float ptMinTrig; float ptMaxTrig; @@ -91,31 +93,15 @@ struct HadronPhotonCorrelation { HistogramRegistry registry{"histogram registry"}; // Particle ids for storing neutral hadrons - std::map pidCodes = { - {2212, -1}, - {1, -1}, - {2, -1}, - {3, -1}, - {4, -1}, - {5, -1}, - {6, -1}, - {21, -1}, // Protons, quarks, gluons (direct) - {111, 1}, // pi0 - {221, 2}, // eta - {223, 3}, // eta' - {331, 4}, // phi - {333, 5}}; // omega + std::map pidCodes = { + {"pi0", 1}, // pi0 + {"eta", 2}, // eta + {"eta'", 3}, // eta' + {"phi", 4}, // phi + {"omega", 5}}; // omega Service pdg; - // Calculate difference between two azimuthal angles, projecting into range [lowerPhi, lowerPhi + pi/2] - float calculateDelta(float phi1, float phi2, float lowerPhi) - { - float dphi = fmod((phi1 - phi2) + 3 * PI, TwoPI) - PI; - dphi = RecoDecay::constrainAngle(dphi, lowerPhi); - return dphi; - } - std::vector eventSelectionBits; int trackSelection = -1; @@ -152,8 +138,8 @@ struct HadronPhotonCorrelation { ////Neutral particles registry.add("generated/neutral/hNeutralCorrelGen", "Generated Trigger-Neutral Hadron Correlation", kTHnSparseF, {axisPtTrig, axisPtAssoc, axisDeltaEta, axisDeltaPhi, axisPid}); registry.add("generated/neutral/hNeutralMultGen", "Generated Neutral Hadron Multiplicity", kTH1F, {axisMult}); - registry.add("generated/neutral/hNeutralSpectrumGen", "Generated Neutral Hadron Spectrum", kTHnSparseF, {axisPtAssoc, axisEta, axisPhi, axisPid}); // Particle ID of neutral hadrons - registry.add("generated/neutral/hNeutralDecayGen", "Generated Neutral Hadron-Decay Photon Correlation", kTHnSparseF, {axisPtAssoc, axisDeltaPt, axisDeltaEtaDecay, axisDeltaPhiDecay, axisPid}); // Correlation with decay photons + registry.add("generated/neutral/hNeutralSpectrumGen", "Generated Neutral Hadron Spectrum", kTHnSparseF, {axisPtAssoc, axisEta, axisPhi, axisPid}); // Particle ID of neutral hadrons + registry.add("generated/neutral/hNeutralDecayGen", "Generated Neutral Hadron-Decay Photon Correlation", kTHnSparseF, {axisPtAssoc, axisDeltaPt, axisDeltaRDecay, axisAlpha, axisPid}); // Correlation with decay photons // Reconstructed histograms // Triggers @@ -192,6 +178,7 @@ struct HadronPhotonCorrelation { bool initTrack(const T& track) { + // if constexpr (HasHasMcParticle) { if constexpr (HasHasMcParticle::Value) { if (!track.has_mcParticle()) { return false; @@ -233,6 +220,7 @@ struct HadronPhotonCorrelation { template bool initTrig(const T& track) { + // if constexpr (HasHasMcParticle) { if constexpr (HasHasMcParticle::Value) { if (!track.has_mcParticle()) { return false; @@ -331,6 +319,7 @@ struct HadronPhotonCorrelation { if (!initTrig(track)) { continue; } + registry.fill(HIST("reconstructed/triggers/hTrigSpectrumReco"), track.pt(), track.eta(), track.phi()); nTrigs++; } @@ -413,7 +402,7 @@ struct HadronPhotonCorrelation { if (!initTrig(track)) { continue; } - float dphi = calculateDelta(track.phi(), v0.phi(), -PIHalf); + float dphi = RecoDecay::constrainAngle(track.phi() - v0.phi(), -PIHalf); registry.fill(HIST("reconstructed/photons/hPhotonCorrelReco"), track.pt(), v0.pt(), track.eta() - v0.eta(), dphi); } } @@ -453,7 +442,7 @@ struct HadronPhotonCorrelation { if (!initTrig(track)) { continue; } - float dphi = calculateDelta(track.phi(), v0.phi(), -PIHalf); + float dphi = RecoDecay::constrainAngle(track.phi() - v0.phi(), -PIHalf); registry.fill(HIST("reconstructed/photons/hPhotonCorrelReco"), track.pt(), v0.pt(), track.eta() - v0.eta(), dphi); } } @@ -469,20 +458,45 @@ struct HadronPhotonCorrelation { if (!initParticle(track_assoc, false)) { continue; } - if (std::abs(track_assoc.pdgCode()) != 22) { + if ((PDG_t)std::abs(track_assoc.pdgCode()) != kGamma) { continue; } - if (!track_assoc.isPhysicalPrimary() && track_assoc.getGenStatusCode() == -1) { + if (!track_assoc.isPhysicalPrimary() && track_assoc.getGenStatusCode() < 0) { continue; } // Iterate through mother particles until original mother is reached - auto mother = track_assoc.mothers_as().at(0); - while (mother.pdgCode() == 22) { - mother = mother.mothers_as().at(0); + auto origPhoton = track_assoc; + auto mother = track_assoc.mothers_as().at(0); + while ((PDG_t)mother.pdgCode() == kGamma) { + origPhoton = mother; + mother = mother.mothers_as().at(0); } - registry.fill(HIST("generated/photons/hPhotonSpectrumGen"), track_assoc.pt(), track_assoc.eta(), track_assoc.phi(), pidCodes[mother.pdgCode()]); + auto pdgMother = pdg->GetParticle(mother.pdgCode()); + if (!pdgMother) + continue; + int photonGeneration; + switch (std::abs(origPhoton.getGenStatusCode())) { + case 23: // prompt direct photons + case 33: + photonGeneration = -2; + break; + case 43: // shower photons + case 44: + case 51: + case 52: + photonGeneration = -1; + break; + case 91: // decay photons + photonGeneration = pidCodes[pdgMother->GetName()]; + break; + default: + photonGeneration = -3; + break; + } + + registry.fill(HIST("generated/photons/hPhotonSpectrumGen"), track_assoc.pt(), track_assoc.eta(), track_assoc.phi(), photonGeneration); nPhotons++; @@ -493,8 +507,8 @@ struct HadronPhotonCorrelation { if (!initParticle(track_assoc)) { continue; } - float dphi = calculateDelta(track_trig.phi(), track_assoc.phi(), -PIHalf); - registry.fill(HIST("generated/photons/hPhotonCorrelGen"), track_trig.pt(), track_assoc.pt(), track_trig.eta() - track_assoc.eta(), dphi, pidCodes[mother.pdgCode()]); + float dphi = RecoDecay::constrainAngle(track_trig.phi() - track_assoc.phi(), -PIHalf); + registry.fill(HIST("generated/photons/hPhotonCorrelGen"), track_trig.pt(), track_assoc.pt(), track_trig.eta() - track_assoc.eta(), dphi, photonGeneration); } } @@ -530,11 +544,13 @@ struct HadronPhotonCorrelation { if (!jetderiveddatautilities::selectTrack(track_trig, trackSelection)) { continue; } - + if (track_trig == track_assoc) { + continue; + } if (!initTrig(track_trig)) { continue; } - float dphi = calculateDelta(track_trig.phi(), track_assoc.phi(), -PIHalf); + float dphi = RecoDecay::constrainAngle(track_trig.phi() - track_assoc.phi(), -PIHalf); registry.fill(HIST("reconstructed/hadrons/hadrons/hHadronCorrelReco"), track_trig.pt(), track_assoc.pt(), track_trig.eta() - track_assoc.eta(), dphi); } } @@ -567,7 +583,10 @@ struct HadronPhotonCorrelation { if (!initTrigParticle(track_trig)) { continue; } - float dphi = calculateDelta(track_trig.phi(), track_assoc.phi(), -PIHalf); + if (track_trig == track_assoc) { + continue; + } + float dphi = RecoDecay::constrainAngle(track_trig.phi() - track_assoc.phi(), -PIHalf); registry.fill(HIST("generated/hadrons/hHadronCorrelGen"), track_trig.pt(), track_assoc.pt(), track_trig.eta() - track_assoc.eta(), dphi); } @@ -578,7 +597,7 @@ struct HadronPhotonCorrelation { void processHadronCorrelationsMCReco(Join::iterator const& collision_reco, JetMcCollisions const&, - Join const& tracks_reco, + Join const& tracks_reco, JetParticles const&) { if (!jetderiveddatautilities::selectCollision(collision_reco, eventSelectionBits)) { @@ -602,8 +621,6 @@ struct HadronPhotonCorrelation { if (std::abs(particle.pdgCode()) < 100) { continue; } - // if(particle.isPhysicalPrimary()){continue;} - // if(std::abs(particle.pdgCode())>1e9){continue;} registry.fill(HIST("reconstructed/hadrons/hHadronSpectrumReco"), track_assoc.pt(), track_assoc.eta(), track_assoc.phi()); @@ -618,11 +635,13 @@ struct HadronPhotonCorrelation { if (!jetderiveddatautilities::selectTrack(track_trig, trackSelection)) { continue; } - + if (track_trig == track_assoc) { + continue; + } if (!initTrig(track_trig)) { continue; } - float dphi = calculateDelta(track_trig.phi(), track_assoc.phi(), -PIHalf); + float dphi = RecoDecay::constrainAngle(track_trig.phi() - track_assoc.phi(), -PIHalf); registry.fill(HIST("reconstructed/hadrons/hHadronCorrelReco"), track_trig.pt(), track_assoc.pt(), track_trig.eta() - track_assoc.eta(), dphi); } @@ -662,11 +681,13 @@ struct HadronPhotonCorrelation { if (!jetderiveddatautilities::selectTrack(track_trig, trackSelection)) { continue; } - + if (track_trig == track_assoc) { + continue; + } if (!initTrig(track_trig)) { continue; } - float dphi = calculateDelta(track_trig.phi(), track_assoc.phi(), -PIHalf); + float dphi = RecoDecay::constrainAngle(track_trig.phi() - track_assoc.phi(), -PIHalf); registry.fill(HIST("reconstructed/charged/hPionCorrelReco"), track_trig.pt(), track_assoc.pt(), track_trig.eta() - track_assoc.eta(), dphi); } } @@ -684,7 +705,7 @@ struct HadronPhotonCorrelation { if (!initParticle(track_assoc)) { continue; } - if (std::abs(track_assoc.pdgCode()) != 211) { + if ((PDG_t)std::abs(track_assoc.pdgCode()) != kPiPlus) { continue; } @@ -695,7 +716,10 @@ struct HadronPhotonCorrelation { if (!initTrigParticle(track_trig)) { continue; } - float dphi = calculateDelta(track_trig.phi(), track_assoc.phi(), -PIHalf); + if (track_trig == track_assoc) { + continue; + } + float dphi = RecoDecay::constrainAngle(track_trig.phi() - track_assoc.phi(), -PIHalf); registry.fill(HIST("generated/charged/hPionCorrelGen"), track_trig.pt(), track_assoc.pt(), track_trig.eta() - track_assoc.eta(), dphi); } @@ -722,7 +746,7 @@ struct HadronPhotonCorrelation { if (!initTrack(track_assoc)) { continue; } - if (std::abs(track_assoc.mcParticle().pdgCode()) != 211) { + if ((PDG_t)std::abs(track_assoc.mcParticle().pdgCode()) != kPiPlus) { continue; } @@ -733,11 +757,14 @@ struct HadronPhotonCorrelation { if (!jetderiveddatautilities::selectTrack(track_trig, trackSelection)) { continue; } + if (track_trig == track_assoc) { + continue; + } if (!initTrig(track_trig)) { continue; } - float dphi = calculateDelta(track_trig.phi(), track_assoc.phi(), -PIHalf); + float dphi = RecoDecay::constrainAngle(track_trig.phi() - track_assoc.phi(), -PIHalf); registry.fill(HIST("reconstructed/charged/hPionCorrelReco"), track_trig.pt(), track_assoc.pt(), track_trig.eta() - track_assoc.eta(), dphi); } } @@ -766,22 +793,36 @@ struct HadronPhotonCorrelation { if (pdgParticle->Charge() != 0.) { continue; } // remove charged particles - if (track_assoc.pdgCode() < 100 || track_assoc.pdgCode() == 2112) { + if (track_assoc.pdgCode() < 100 || (PDG_t)track_assoc.pdgCode() == kNeutron) { continue; - } // remove non-hadrons and protons - - registry.fill(HIST("generated/neutral/hNeutralSpectrumGen"), track_assoc.pt(), track_assoc.eta(), track_assoc.phi(), pidCodes[track_assoc.pdgCode()]); + } // remove non-hadrons and neutrons + registry.fill(HIST("generated/neutral/hNeutralSpectrumGen"), track_assoc.pt(), track_assoc.eta(), track_assoc.phi(), pidCodes[pdgParticle->GetName()]); nNeutrals++; // Get correlations between neutral hadrons and their respective decay photons - for (const auto& daughter : track_assoc.daughters_as()) { - if (daughter.pdgCode() != 22) + auto daughters = track_assoc.daughters_as(); + double alpha = -1; + if (daughters.size() == 2) { + auto daughter = daughters.begin(); + double pt1 = daughter.pt(); + ++daughter; + double pt2 = daughter.pt(); + alpha = std::abs((pt1 - pt2) / (pt1 + pt2)); + } + + for (const auto& daughter : daughters) { + if ((PDG_t)std::abs(daughter.pdgCode()) != kGamma) continue; if (!initParticle(daughter, false)) continue; if (!daughter.isPhysicalPrimary() && daughter.getGenStatusCode() == -1) continue; - registry.fill(HIST("generated/neutral/hNeutralDecayGen"), track_assoc.pt(), daughter.pt() / track_assoc.pt(), daughter.eta() - track_assoc.eta(), calculateDelta(daughter.phi(), track_assoc.phi(), -PIHalf), pidCodes[track_assoc.pdgCode()]); + double deltaPt = daughter.pt() / track_assoc.pt(); + double deltaEta = daughter.eta() - track_assoc.eta(); + double deltaPhi = RecoDecay::constrainAngle(daughter.phi() - track_assoc.phi(), -PIHalf); + double deltaR = std::sqrt(deltaEta * deltaEta + deltaPhi * deltaPhi); + + registry.fill(HIST("generated/neutral/hNeutralDecayGen"), track_assoc.pt(), deltaPt, deltaR, alpha, pidCodes[pdgParticle->GetName()]); } // Get correlations between triggers and neutral hadrons @@ -789,8 +830,8 @@ struct HadronPhotonCorrelation { if (!initTrigParticle(track_trig)) { continue; } - float dphi = calculateDelta(track_assoc.phi(), track_trig.phi(), -PIHalf); - registry.fill(HIST("generated/neutral/hNeutralCorrelGen"), track_trig.pt(), track_assoc.pt(), track_assoc.eta() - track_trig.eta(), dphi, pidCodes[track_assoc.pdgCode()]); + float dphi = RecoDecay::constrainAngle(track_assoc.phi() - track_trig.phi(), -PIHalf); + registry.fill(HIST("generated/neutral/hNeutralCorrelGen"), track_trig.pt(), track_assoc.pt(), track_assoc.eta() - track_trig.eta(), dphi, pidCodes[pdgParticle->GetName()]); } } registry.fill(HIST("generated/neutral/hNeutralMultGen"), nNeutrals); From f244e6b722b4e1428d436d3469c8946a49bf0b35 Mon Sep 17 00:00:00 2001 From: Swati <69241911+SwatiSaha-1997@users.noreply.github.com> Date: Thu, 13 Feb 2025 02:39:25 +0530 Subject: [PATCH 0184/1650] [PWGCF] Additional event selection condition and PID checks added (#9929) --- .../Tasks/netprotonCumulantsMc.cxx | 87 ++++++++++++++----- 1 file changed, 63 insertions(+), 24 deletions(-) diff --git a/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx b/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx index 3b664f4f828..61491113bae 100644 --- a/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx @@ -151,6 +151,9 @@ struct NetprotonCumulantsMc { Configurable cfgLoadEff{"cfgLoadEff", true, "Load efficiency from file"}; Configurable cfgEvSelkNoSameBunchPileup{"cfgEvSelkNoSameBunchPileup", true, "Pileup removal"}; + Configurable cfgUseGoodITSLayerAllCut{"cfgUseGoodITSLayerAllCut", true, "Remove time interval with dead ITS zone"}; + Configurable cfgIfRejectElectron{"cfgIfRejectElectron", true, "Remove electrons"}; + Configurable cfgIfMandatoryTOF{"cfgIfMandatoryTOF", true, "Mandatory TOF requirement to remove pileup"}; ConfigurableAxis cfgCentralityBins{"cfgCentralityBins", {90, 0., 90.}, "Centrality/Multiplicity percentile bining"}; @@ -170,7 +173,7 @@ struct NetprotonCumulantsMc { // Filter command for rec (data)*********** Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; - Filter trackFilter = (nabs(aod::track::eta) < 0.8f) && (aod::track::pt > cfgCutPtLower) && (aod::track::pt < 5.0f) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::tpcChi2NCl < cfgCutTpcChi2NCl) && (aod::track::itsChi2NCl < cfgCutItsChi2NCl) && (aod::track::dcaZ < cfgCutDCAz) && (aod::track::dcaXY < cfgCutDCAxy); + Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtLower) && (aod::track::pt < 5.0f) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::tpcChi2NCl < cfgCutTpcChi2NCl) && (aod::track::itsChi2NCl < cfgCutItsChi2NCl) && (aod::track::dcaZ < cfgCutDCAz) && (aod::track::dcaXY < cfgCutDCAxy); // filtering collisions and tracks for real data*********** using AodCollisions = soa::Filtered>; @@ -913,6 +916,16 @@ struct NetprotonCumulantsMc { return false; } + // electron rejection function + template + bool isElectron(const T& candidate) // Victor's BF analysis + { + if (candidate.tpcNSigmaEl() > -3.0f && candidate.tpcNSigmaEl() < 5.0f && std::abs(candidate.tpcNSigmaPi()) > 3.0f && std::abs(candidate.tpcNSigmaKa()) > 3.0f && std::abs(candidate.tpcNSigmaPr()) > 3.0f) { + return true; + } + return false; + } + template bool selectionPIDnew(const T& candidate) // Victor's BF analysis { @@ -959,10 +972,6 @@ struct NetprotonCumulantsMc { } else { // Find the pt bin index based on the track's pt value int binIndex = -1; - // Get the array from the Configurable - // auto ptBins = (std::vector)cfgPtBins; - // auto effProt = (std::vector)cfgProtonEff; - // auto effAntiprot = (std::vector)cfgAntiprotonEff; for (int i = 0; i < 16; ++i) { if (candidate.pt() >= cfgPtBins.value[i] && candidate.pt() < cfgPtBins.value[i + 1]) { @@ -1010,6 +1019,13 @@ struct NetprotonCumulantsMc { if (!collision.sel8() || std::abs(collision.mcCollision().posZ()) > cfgCutVertex) { continue; } + if (cfgUseGoodITSLayerAllCut && !(collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll))) { + continue; + } + if (cfgEvSelkNoSameBunchPileup && !(collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup))) { + continue; + } + cent = collision.centFT0M(); selectedEvents[nevts++] = collision.mcCollision_as().globalIndex(); @@ -1030,7 +1046,7 @@ struct NetprotonCumulantsMc { for (const auto& mcParticle : mcParticles) { if (mcParticle.isPhysicalPrimary()) { - if ((mcParticle.pt() > cfgCutPtLower) && (mcParticle.pt() < 5.0f) && (std::abs(mcParticle.eta()) < 0.8f)) { + if ((mcParticle.pt() > cfgCutPtLower) && (mcParticle.pt() < 5.0f) && (std::abs(mcParticle.eta()) < cfgCutEta)) { histos.fill(HIST("hgenPtAll"), mcParticle.pt()); histos.fill(HIST("hgenEtaAll"), mcParticle.eta()); histos.fill(HIST("hgenPhiAll"), mcParticle.phi()); @@ -1106,14 +1122,21 @@ struct NetprotonCumulantsMc { void processMCRec(MyMCRecCollision const& collision, MyMCTracks const& tracks, aod::McCollisions const&, aod::McParticles const&) { - // auto tracksWithITSPid = soa::Attach(tracks); + if (!collision.has_mcCollision()) { + return; + } if (!collision.sel8()) { return; } - if (!collision.has_mcCollision()) { + if (cfgUseGoodITSLayerAllCut && !(collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll))) { return; } + if (cfgEvSelkNoSameBunchPileup && !(collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup))) { + return; + ; + } + auto cent = collision.centFT0M(); histos.fill(HIST("hCentrec"), cent); histos.fill(HIST("hMC"), 5.5); @@ -1141,7 +1164,7 @@ struct NetprotonCumulantsMc { } auto particle = track.mcParticle(); - if ((particle.pt() < cfgCutPtLower) || (particle.pt() > 5.0f) || (std::abs(particle.eta()) > 0.8f)) { + if ((particle.pt() < cfgCutPtLower) || (particle.pt() > 5.0f) || (std::abs(particle.eta()) > cfgCutEta)) { continue; } if (!(track.itsNCls() > cfgITScluster) || !(track.tpcNClsFound() >= cfgTPCcluster) || !(track.tpcNClsCrossedRows() >= cfgTPCnCrossedRows)) { @@ -1156,6 +1179,19 @@ struct NetprotonCumulantsMc { histos.fill(HIST("hrecDcaXYAll"), track.dcaXY()); histos.fill(HIST("hrecDcaZAll"), track.dcaZ()); + // rejecting electron + if (cfgIfRejectElectron && isElectron(track)) { + continue; + } + // use ITS pid as well + if (cfgUseItsPid && (std::abs(itsResponse.nSigmaITS(track)) > 3.0)) { + continue; + } + // required tracks with TOF mandatory to avoid pileup + if (cfgIfMandatoryTOF && !track.hasTOF()) { + continue; + } + bool trackSelected = false; if (cfgPIDchoice == 0) trackSelected = selectionPIDoldTOFveto(track); @@ -1164,11 +1200,6 @@ struct NetprotonCumulantsMc { if (cfgPIDchoice == 2) trackSelected = selectionPIDold(track); - if (cfgUseItsPid) { - if (std::abs(itsResponse.nSigmaITS(track)) > 3.0) - continue; - } - if (trackSelected) { recEbyeCompleteCollisions(recCollisions.lastIndex(), particle.pt(), particle.eta(), track.sign()); // filling nSigma distribution @@ -2033,13 +2064,13 @@ struct NetprotonCumulantsMc { void processDataRec(AodCollisions::iterator const& coll, aod::BCsWithTimestamps const&, AodTracks const& inputTracks) { - // auto inputTracksWithPid = soa::Attach(inputTracks); - if (!coll.sel8()) { return; } - - if (cfgEvSelkNoSameBunchPileup && !coll.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { + if (cfgUseGoodITSLayerAllCut && !(coll.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll))) { + return; + } + if (cfgEvSelkNoSameBunchPileup && !(coll.selection_bit(o2::aod::evsel::kNoSameBunchPileup))) { // rejects collisions which are associated with the same "found-by-T0" bunch crossing // https://indico.cern.ch/event/1396220/#1-event-selection-with-its-rof return; @@ -2066,7 +2097,7 @@ struct NetprotonCumulantsMc { { continue; } - if ((track.pt() < cfgCutPtLower) || (track.pt() > 5.0f) || (std::abs(track.eta()) > 0.8f)) { + if ((track.pt() < cfgCutPtLower) || (track.pt() > 5.0f) || (std::abs(track.eta()) > cfgCutEta)) { continue; } if (!(track.itsNCls() > cfgITScluster) || !(track.tpcNClsFound() >= cfgTPCcluster) || !(track.tpcNClsCrossedRows() >= cfgTPCnCrossedRows)) { @@ -2079,6 +2110,19 @@ struct NetprotonCumulantsMc { histos.fill(HIST("hrecDcaXYAll"), track.dcaXY()); histos.fill(HIST("hrecDcaZAll"), track.dcaZ()); + // rejecting electron + if (cfgIfRejectElectron && isElectron(track)) { + continue; + } + // use ITS pid as well + if (cfgUseItsPid && (std::abs(itsResponse.nSigmaITS(track)) > 3.0)) { + continue; + } + // required tracks with TOF mandatory to avoid pileup + if (cfgIfMandatoryTOF && !track.hasTOF()) { + continue; + } + bool trackSelected = false; if (cfgPIDchoice == 0) trackSelected = selectionPIDoldTOFveto(track); @@ -2087,11 +2131,6 @@ struct NetprotonCumulantsMc { if (cfgPIDchoice == 2) trackSelected = selectionPIDold(track); - if (cfgUseItsPid) { - if (std::abs(itsResponse.nSigmaITS(track)) > 3.0) - continue; - } - if (trackSelected) { recEbyeCompleteCollisions(recCollisions.lastIndex(), track.pt(), track.eta(), track.sign()); // filling nSigma distribution From 37039a2ab534d61fca52af9b0d350570ac1e946c Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Wed, 12 Feb 2025 22:13:35 +0100 Subject: [PATCH 0185/1650] [PWGLF] chk892Flow: Add flag for saving QA plots (#9930) --- PWGLF/Tasks/Resonances/chk892Flow.cxx | 448 +++++++++++++------------- 1 file changed, 232 insertions(+), 216 deletions(-) diff --git a/PWGLF/Tasks/Resonances/chk892Flow.cxx b/PWGLF/Tasks/Resonances/chk892Flow.cxx index d9f2d697207..f8180f073e3 100644 --- a/PWGLF/Tasks/Resonances/chk892Flow.cxx +++ b/PWGLF/Tasks/Resonances/chk892Flow.cxx @@ -120,6 +120,7 @@ struct Chk892Flow { Configurable cfgFillAdditionalAxis{"cfgFillAdditionalAxis", false, "Fill additional axis"}; ConfigurableAxis cfgAxisPhi{"cfgAxisPhi", {8, 0, constants::math::PI}, "Binning of the #phi axis"}; Configurable cfgUseScalProduct{"cfgUseScalProduct", false, "Use scalar product method"}; + Configurable cfgFillQAPlots{"cfgFillQAPlots", true, "Fill QA plots"}; // Event cuts o2::analysis::CollisonCuts colCuts; @@ -285,94 +286,150 @@ struct Chk892Flow { histos.add("QA/EP/hEPSPResBC", "cos(n(B-C))", {HistType::kTH2D, {centAxis, epAxis}}); } - // Rotated background - if (cfgFillRotBkg) { - histos.add("QA/RotBkg/hRotBkg", "Rotated angle of rotated background", HistType::kTH1F, {{360, 0.0, o2::constants::math::TwoPI}}); + if (cfgFillQAPlots) { + // Rotated background + if (cfgFillRotBkg) { + histos.add("QA/RotBkg/hRotBkg", "Rotated angle of rotated background", HistType::kTH1F, {{360, 0.0, o2::constants::math::TwoPI}}); + } + + // Bachelor pion + histos.add("QA/before/trkbpionDCAxy", "DCAxy distribution of bachelor pion candidates", HistType::kTH1D, {dcaxyAxis}); + histos.add("QA/before/trkbpionDCAz", "DCAz distribution of bachelor pion candidates", HistType::kTH1D, {dcazAxis}); + histos.add("QA/before/trkbpionpT", "pT distribution of bachelor pion candidates", HistType::kTH1D, {ptAxisQA}); + histos.add("QA/before/trkbpionTPCPID", "TPC PID of bachelor pion candidates", HistType::kTH2D, {ptAxisQA, pidQAAxis}); + histos.add("QA/before/trkbpionTOFPID", "TOF PID of bachelor pion candidates", HistType::kTH2D, {ptAxisQA, pidQAAxis}); + histos.add("QA/before/trkbpionTPCTOFPID", "TPC-TOF PID map of bachelor pion candidates", HistType::kTH2D, {pidQAAxis, pidQAAxis}); + + histos.add("QA/after/trkbpionDCAxy", "DCAxy distribution of bachelor pion candidates", HistType::kTH1D, {dcaxyAxis}); + histos.add("QA/after/trkbpionDCAz", "DCAz distribution of bachelor pion candidates", HistType::kTH1D, {dcazAxis}); + histos.add("QA/after/trkbpionpT", "pT distribution of bachelor pion candidates", HistType::kTH1D, {ptAxisQA}); + histos.add("QA/after/trkbpionTPCPID", "TPC PID of bachelor pion candidates", HistType::kTH2D, {ptAxisQA, pidQAAxis}); + histos.add("QA/after/trkbpionTOFPID", "TOF PID of bachelor pion candidates", HistType::kTH2D, {ptAxisQA, pidQAAxis}); + histos.add("QA/after/trkbpionTPCTOFPID", "TPC-TOF PID map of bachelor pion candidates", HistType::kTH2D, {pidQAAxis, pidQAAxis}); + + // Secondary pion 1 + histos.add("QA/before/trkppionTPCPID", "TPC PID of secondary pion 1 (positive) candidates", HistType::kTH2D, {ptAxisQA, pidQAAxis}); + histos.add("QA/before/trkppionTOFPID", "TOF PID of secondary pion 1 (positive) candidates", HistType::kTH2D, {ptAxisQA, pidQAAxis}); + histos.add("QA/before/trkppionTPCTOFPID", "TPC-TOF PID map of secondary pion 1 (positive) candidates", HistType::kTH2D, {pidQAAxis, pidQAAxis}); + histos.add("QA/before/trkppionpT", "pT distribution of secondary pion 1 (positive) candidates", HistType::kTH1D, {ptAxisQA}); + histos.add("QA/before/trkppionDCAxy", "DCAxy distribution of secondary pion 1 (positive) candidates", HistType::kTH1D, {dcaxyAxis}); + histos.add("QA/before/trkppionDCAz", "DCAz distribution of secondary pion 1 (positive) candidates", HistType::kTH1D, {dcazAxis}); + + histos.add("QA/after/trkppionTPCPID", "TPC PID of secondary pion 1 (positive) candidates", HistType::kTH2D, {ptAxisQA, pidQAAxis}); + histos.add("QA/after/trkppionTOFPID", "TOF PID of secondary pion 1 (positive) candidates", HistType::kTH2D, {ptAxisQA, pidQAAxis}); + histos.add("QA/after/trkppionTPCTOFPID", "TPC-TOF PID map of secondary pion 1 (positive) candidates", HistType::kTH2D, {pidQAAxis, pidQAAxis}); + histos.add("QA/after/trkppionpT", "pT distribution of secondary pion 1 (positive) candidates", HistType::kTH1D, {ptAxisQA}); + histos.add("QA/after/trkppionDCAxy", "DCAxy distribution of secondary pion 1 (positive) candidates", HistType::kTH1D, {dcaxyAxis}); + histos.add("QA/after/trkppionDCAz", "DCAz distribution of secondary pion 1 (positive) candidates", HistType::kTH1D, {dcazAxis}); + + // Secondary pion 2 + histos.add("QA/before/trknpionTPCPID", "TPC PID of secondary pion 2 (negative) candidates", HistType::kTH2D, {ptAxisQA, pidQAAxis}); + histos.add("QA/before/trknpionTOFPID", "TOF PID of secondary pion 2 (negative) candidates", HistType::kTH2D, {ptAxisQA, pidQAAxis}); + histos.add("QA/before/trknpionTPCTOFPID", "TPC-TOF PID map of secondary pion 2 (negative) candidates", HistType::kTH2D, {pidQAAxis, pidQAAxis}); + histos.add("QA/before/trknpionpT", "pT distribution of secondary pion 2 (negative) candidates", HistType::kTH1D, {ptAxisQA}); + histos.add("QA/before/trknpionDCAxy", "DCAxy distribution of secondary pion 2 (negative) candidates", HistType::kTH1D, {dcaxyAxis}); + histos.add("QA/before/trknpionDCAz", "DCAz distribution of secondary pion 2 (negative) candidates", HistType::kTH1D, {dcazAxis}); + + histos.add("QA/after/trknpionTPCPID", "TPC PID of secondary pion 2 (negative) candidates", HistType::kTH2D, {ptAxisQA, pidQAAxis}); + histos.add("QA/after/trknpionTOFPID", "TOF PID of secondary pion 2 (negative) candidates", HistType::kTH2D, {ptAxisQA, pidQAAxis}); + histos.add("QA/after/trknpionTPCTOFPID", "TPC-TOF PID map of secondary pion 2 (negative) candidates", HistType::kTH2D, {pidQAAxis, pidQAAxis}); + histos.add("QA/after/trknpionpT", "pT distribution of secondary pion 2 (negative) candidates", HistType::kTH1D, {ptAxisQA}); + histos.add("QA/after/trknpionDCAxy", "DCAxy distribution of secondary pion 2 (negative) candidates", HistType::kTH1D, {dcaxyAxis}); + histos.add("QA/after/trknpionDCAz", "DCAz distribution of secondary pion 2 (negative) candidates", HistType::kTH1D, {dcazAxis}); + + // K0s + histos.add("QA/before/hDauDCASecondary", "DCA of daughters of secondary resonance", HistType::kTH1D, {dcaAxis}); + histos.add("QA/before/hy_Secondary", "Rapidity distribution of secondary resonance", HistType::kTH1D, {yAxis}); + histos.add("QA/before/hCPASecondary", "Cosine pointing angle distribution of secondary resonance", HistType::kTH1D, {cpaAxis}); + histos.add("QA/before/hDCAtoPVSecondary", "DCA to PV distribution of secondary resonance", HistType::kTH1D, {dcaAxis}); + histos.add("QA/before/hPropTauSecondary", "Proper Lifetime distribution of secondary resonance", HistType::kTH1D, {tauAxis}); + histos.add("QA/before/hInvmassSecondary", "Invariant mass of unlike-sign secondary resonance", HistType::kTH1D, {invMassAxisK0s}); + + histos.add("QA/after/hDauDCASecondary", "DCA of daughters of secondary resonance", HistType::kTH1D, {dcaAxis}); + histos.add("QA/after/hy_Secondary", "Rapidity distribution of secondary resonance", HistType::kTH1D, {yAxis}); + histos.add("QA/after/hCPASecondary", "Cosine pointing angle distribution of secondary resonance", HistType::kTH1D, {cpaAxis}); + histos.add("QA/after/hDCAtoPVSecondary", "DCA to PV distribution of secondary resonance", HistType::kTH1D, {dcaAxis}); + histos.add("QA/after/hPropTauSecondary", "Proper Lifetime distribution of secondary resonance", HistType::kTH1D, {tauAxis}); + histos.add("QA/after/hInvmassSecondary", "Invariant mass of unlike-sign secondary resonance", HistType::kTH1D, {invMassAxisK0s}); + + // Mass QA (quick check) + histos.add("QA/before/KstarRapidity", "Rapidity distribution of chK(892)", HistType::kTH1D, {yAxis}); + histos.add("QA/before/kstarinvmass", "Invariant mass of unlike-sign chK(892)", HistType::kTH1D, {invMassAxisReso}); + histos.add("QA/before/k0sv2vsinvmass", "Invariant mass vs v2 of unlike-sign K0s", HistType::kTH2D, {invMassAxisK0s, v2Axis}); + histos.add("QA/before/kstarv2vsinvmass", "Invariant mass vs v2 of unlike-sign chK(892)", HistType::kTH2D, {invMassAxisReso, v2Axis}); + histos.add("QA/before/kstarinvmass_Mix", "Invariant mass of unlike-sign chK(892) from mixed event", HistType::kTH1D, {invMassAxisReso}); + + histos.add("QA/after/KstarRapidity", "Rapidity distribution of chK(892)", HistType::kTH1D, {yAxis}); + histos.add("QA/after/kstarinvmass", "Invariant mass of unlike-sign chK(892)", HistType::kTH1D, {invMassAxisReso}); + histos.add("QA/after/k0sv2vsinvmass", "Invariant mass vs v2 of unlike-sign K0s", HistType::kTH2D, {invMassAxisK0s, v2Axis}); + histos.add("QA/after/kstarv2vsinvmass", "Invariant mass vs v2 of unlike-sign chK(892)", HistType::kTH2D, {invMassAxisReso, v2Axis}); + histos.add("QA/after/kstarinvmass_Mix", "Invariant mass of unlike-sign chK(892) from mixed event", HistType::kTH1D, {invMassAxisReso}); + + // MC + if (doprocessMC) { + // Bachelor pion + histos.add("QAMC/trkbpionDCAxy", "DCAxy distribution of bachelor pion candidates", HistType::kTH1D, {dcaxyAxis}); + histos.add("QAMC/trkbpionDCAz", "DCAz distribution of bachelor pion candidates", HistType::kTH1D, {dcazAxis}); + histos.add("QAMC/trkbpionpT", "pT distribution of bachelor pion candidates", HistType::kTH1D, {ptAxis}); + histos.add("QAMC/trkbpionTPCPID", "TPC PID of bachelor pion candidates", HistType::kTH2D, {ptAxis, pidQAAxis}); + histos.add("QAMC/trkbpionTOFPID", "TOF PID of bachelor pion candidates", HistType::kTH2D, {ptAxis, pidQAAxis}); + histos.add("QAMC/trkbpionTPCTOFPID", "TPC-TOF PID map of bachelor pion candidates", HistType::kTH2D, {pidQAAxis, pidQAAxis}); + + // Secondary pion 1 + histos.add("QAMC/trkppionDCAxy", "DCAxy distribution of secondary pion 1 (positive) candidates", HistType::kTH1D, {dcaxyAxis}); + histos.add("QAMC/trkppionDCAz", "DCAz distribution of secondary pion 1 (positive) candidates", HistType::kTH1D, {dcazAxis}); + histos.add("QAMC/trkppionpT", "pT distribution of secondary pion 1 (positive) candidates", HistType::kTH1D, {ptAxis}); + histos.add("QAMC/trkppionTPCPID", "TPC PID of secondary pion 1 (positive) candidates", HistType::kTH2D, {ptAxis, pidQAAxis}); + histos.add("QAMC/trkppionTOFPID", "TOF PID of secondary pion 1 (positive) candidates", HistType::kTH2D, {ptAxis, pidQAAxis}); + histos.add("QAMC/trkppionTPCTOFPID", "TPC-TOF PID map of secondary pion 1 (positive) candidates", HistType::kTH2D, {pidQAAxis, pidQAAxis}); + + // Secondary pion 2 + histos.add("QAMC/trknpionTPCPID", "TPC PID of secondary pion 2 (negative) candidates", HistType::kTH2D, {ptAxis, pidQAAxis}); + histos.add("QAMC/trknpionTOFPID", "TOF PID of secondary pion 2 (negative) candidates", HistType::kTH2D, {ptAxis, pidQAAxis}); + histos.add("QAMC/trknpionTPCTOFPID", "TPC-TOF PID map of secondary pion 2 (negative) candidates", HistType::kTH2D, {pidQAAxis, pidQAAxis}); + histos.add("QAMC/trknpionpT", "pT distribution of secondary pion 2 (negative) candidates", HistType::kTH1D, {ptAxis}); + histos.add("QAMC/trknpionDCAxy", "DCAxy distribution of secondary pion 2 (negative) candidates", HistType::kTH1D, {dcaxyAxis}); + histos.add("QAMC/trknpionDCAz", "DCAz distribution of secondary pion 2 (negative) candidates", HistType::kTH1D, {dcazAxis}); + + // Secondary Resonance (K0s candidates) + histos.add("QAMC/hDauDCASecondary", "DCA of daughters of secondary resonance", HistType::kTH1D, {dcaAxis}); + histos.add("QAMC/hDauPosDCAtoPVSecondary", "Pos DCA to PV of daughters secondary resonance", HistType::kTH1D, {dcaAxis}); + histos.add("QAMC/hDauNegDCAtoPVSecondary", "Neg DCA to PV of daughters secondary resonance", HistType::kTH1D, {dcaAxis}); + + histos.add("QAMC/hy_Secondary", "Rapidity distribution of secondary resonance", HistType::kTH1D, {yAxis}); + histos.add("QAMC/hCPASecondary", "Cosine pointing angle distribution of secondary resonance", HistType::kTH1D, {cpaAxis}); + histos.add("QAMC/hDCAtoPVSecondary", "DCA to PV distribution of secondary resonance", HistType::kTH1D, {dcaAxis}); + histos.add("QAMC/hPropTauSecondary", "Proper Lifetime distribution of secondary resonance", HistType::kTH1D, {tauAxis}); + histos.add("QAMC/hInvmassSecondary", "Invariant mass of unlike-sign secondary resonance", HistType::kTH1D, {invMassAxisK0s}); + + // K892 + histos.add("QAMC/KstarOA", "Opening angle of chK(892)", HistType::kTH1D, {AxisSpec{100, 0, 3.14, "Opening angle"}}); + histos.add("QAMC/KstarPairAsym", "Pair asymmetry of chK(892)", HistType::kTH1D, {AxisSpec{100, -1, 1, "Pair asymmetry"}}); + histos.add("QAMC/KstarRapidity", "Rapidity distribution of chK(892)", HistType::kTH1D, {yAxis}); + + histos.add("QAMC/kstarinvmass", "Invariant mass of unlike-sign chK(892)", HistType::kTH1D, {invMassAxisReso}); + histos.add("QAMC/k0sv2vsinvmass", "Invariant mass vs v2 of unlike-sign K0s", HistType::kTH2D, {invMassAxisK0s, v2Axis}); + histos.add("QAMC/kstarv2vsinvmass", "Invariant mass vs v2 of unlike-sign chK(892)", HistType::kTH2D, {invMassAxisReso, v2Axis}); + histos.add("QAMC/kstarinvmass_noKstar", "Invariant mass of unlike-sign no chK(892)", HistType::kTH1D, {invMassAxisReso}); + histos.add("QAMC/kstarv2vsinvmass_noKstar", "Invariant mass vs v2 of unlike-sign no chK(892)", HistType::kTH2D, {invMassAxisReso, v2Axis}); + } } - // Bachelor pion - histos.add("QA/before/trkbpionDCAxy", "DCAxy distribution of bachelor pion candidates", HistType::kTH1D, {dcaxyAxis}); - histos.add("QA/before/trkbpionDCAz", "DCAz distribution of bachelor pion candidates", HistType::kTH1D, {dcazAxis}); - histos.add("QA/before/trkbpionpT", "pT distribution of bachelor pion candidates", HistType::kTH1D, {ptAxisQA}); - histos.add("QA/before/trkbpionTPCPID", "TPC PID of bachelor pion candidates", HistType::kTH2D, {ptAxisQA, pidQAAxis}); - histos.add("QA/before/trkbpionTOFPID", "TOF PID of bachelor pion candidates", HistType::kTH2D, {ptAxisQA, pidQAAxis}); - histos.add("QA/before/trkbpionTPCTOFPID", "TPC-TOF PID map of bachelor pion candidates", HistType::kTH2D, {pidQAAxis, pidQAAxis}); - - histos.add("QA/after/trkbpionDCAxy", "DCAxy distribution of bachelor pion candidates", HistType::kTH1D, {dcaxyAxis}); - histos.add("QA/after/trkbpionDCAz", "DCAz distribution of bachelor pion candidates", HistType::kTH1D, {dcazAxis}); - histos.add("QA/after/trkbpionpT", "pT distribution of bachelor pion candidates", HistType::kTH1D, {ptAxisQA}); - histos.add("QA/after/trkbpionTPCPID", "TPC PID of bachelor pion candidates", HistType::kTH2D, {ptAxisQA, pidQAAxis}); - histos.add("QA/after/trkbpionTOFPID", "TOF PID of bachelor pion candidates", HistType::kTH2D, {ptAxisQA, pidQAAxis}); - histos.add("QA/after/trkbpionTPCTOFPID", "TPC-TOF PID map of bachelor pion candidates", HistType::kTH2D, {pidQAAxis, pidQAAxis}); - - // Secondary pion 1 - histos.add("QA/before/trkppionTPCPID", "TPC PID of secondary pion 1 (positive) candidates", HistType::kTH2D, {ptAxisQA, pidQAAxis}); - histos.add("QA/before/trkppionTOFPID", "TOF PID of secondary pion 1 (positive) candidates", HistType::kTH2D, {ptAxisQA, pidQAAxis}); - histos.add("QA/before/trkppionTPCTOFPID", "TPC-TOF PID map of secondary pion 1 (positive) candidates", HistType::kTH2D, {pidQAAxis, pidQAAxis}); - histos.add("QA/before/trkppionpT", "pT distribution of secondary pion 1 (positive) candidates", HistType::kTH1D, {ptAxisQA}); - histos.add("QA/before/trkppionDCAxy", "DCAxy distribution of secondary pion 1 (positive) candidates", HistType::kTH1D, {dcaxyAxis}); - histos.add("QA/before/trkppionDCAz", "DCAz distribution of secondary pion 1 (positive) candidates", HistType::kTH1D, {dcazAxis}); - - histos.add("QA/after/trkppionTPCPID", "TPC PID of secondary pion 1 (positive) candidates", HistType::kTH2D, {ptAxisQA, pidQAAxis}); - histos.add("QA/after/trkppionTOFPID", "TOF PID of secondary pion 1 (positive) candidates", HistType::kTH2D, {ptAxisQA, pidQAAxis}); - histos.add("QA/after/trkppionTPCTOFPID", "TPC-TOF PID map of secondary pion 1 (positive) candidates", HistType::kTH2D, {pidQAAxis, pidQAAxis}); - histos.add("QA/after/trkppionpT", "pT distribution of secondary pion 1 (positive) candidates", HistType::kTH1D, {ptAxisQA}); - histos.add("QA/after/trkppionDCAxy", "DCAxy distribution of secondary pion 1 (positive) candidates", HistType::kTH1D, {dcaxyAxis}); - histos.add("QA/after/trkppionDCAz", "DCAz distribution of secondary pion 1 (positive) candidates", HistType::kTH1D, {dcazAxis}); - - // Secondary pion 2 - histos.add("QA/before/trknpionTPCPID", "TPC PID of secondary pion 2 (negative) candidates", HistType::kTH2D, {ptAxisQA, pidQAAxis}); - histos.add("QA/before/trknpionTOFPID", "TOF PID of secondary pion 2 (negative) candidates", HistType::kTH2D, {ptAxisQA, pidQAAxis}); - histos.add("QA/before/trknpionTPCTOFPID", "TPC-TOF PID map of secondary pion 2 (negative) candidates", HistType::kTH2D, {pidQAAxis, pidQAAxis}); - histos.add("QA/before/trknpionpT", "pT distribution of secondary pion 2 (negative) candidates", HistType::kTH1D, {ptAxisQA}); - histos.add("QA/before/trknpionDCAxy", "DCAxy distribution of secondary pion 2 (negative) candidates", HistType::kTH1D, {dcaxyAxis}); - histos.add("QA/before/trknpionDCAz", "DCAz distribution of secondary pion 2 (negative) candidates", HistType::kTH1D, {dcazAxis}); - - histos.add("QA/after/trknpionTPCPID", "TPC PID of secondary pion 2 (negative) candidates", HistType::kTH2D, {ptAxisQA, pidQAAxis}); - histos.add("QA/after/trknpionTOFPID", "TOF PID of secondary pion 2 (negative) candidates", HistType::kTH2D, {ptAxisQA, pidQAAxis}); - histos.add("QA/after/trknpionTPCTOFPID", "TPC-TOF PID map of secondary pion 2 (negative) candidates", HistType::kTH2D, {pidQAAxis, pidQAAxis}); - histos.add("QA/after/trknpionpT", "pT distribution of secondary pion 2 (negative) candidates", HistType::kTH1D, {ptAxisQA}); - histos.add("QA/after/trknpionDCAxy", "DCAxy distribution of secondary pion 2 (negative) candidates", HistType::kTH1D, {dcaxyAxis}); - histos.add("QA/after/trknpionDCAz", "DCAz distribution of secondary pion 2 (negative) candidates", HistType::kTH1D, {dcazAxis}); - - // K0s - histos.add("QA/before/hDauDCASecondary", "DCA of daughters of secondary resonance", HistType::kTH1D, {dcaAxis}); - histos.add("QA/before/hy_Secondary", "Rapidity distribution of secondary resonance", HistType::kTH1D, {yAxis}); - histos.add("QA/before/hCPASecondary", "Cosine pointing angle distribution of secondary resonance", HistType::kTH1D, {cpaAxis}); - histos.add("QA/before/hDCAtoPVSecondary", "DCA to PV distribution of secondary resonance", HistType::kTH1D, {dcaAxis}); - histos.add("QA/before/hPropTauSecondary", "Proper Lifetime distribution of secondary resonance", HistType::kTH1D, {tauAxis}); - histos.add("QA/before/hInvmassSecondary", "Invariant mass of unlike-sign secondary resonance", HistType::kTH1D, {invMassAxisK0s}); - - histos.add("QA/after/hDauDCASecondary", "DCA of daughters of secondary resonance", HistType::kTH1D, {dcaAxis}); - histos.add("QA/after/hy_Secondary", "Rapidity distribution of secondary resonance", HistType::kTH1D, {yAxis}); - histos.add("QA/after/hCPASecondary", "Cosine pointing angle distribution of secondary resonance", HistType::kTH1D, {cpaAxis}); - histos.add("QA/after/hDCAtoPVSecondary", "DCA to PV distribution of secondary resonance", HistType::kTH1D, {dcaAxis}); - histos.add("QA/after/hPropTauSecondary", "Proper Lifetime distribution of secondary resonance", HistType::kTH1D, {tauAxis}); - histos.add("QA/after/hInvmassSecondary", "Invariant mass of unlike-sign secondary resonance", HistType::kTH1D, {invMassAxisK0s}); - - // Kstar // Invariant mass nSparse if (cfgFillAdditionalAxis) { histos.add("hInvmass_Kstar", "Invariant mass of unlike-sign chK(892)", HistType::kTHnSparseD, {axisType, centAxis, ptAxis, invMassAxisReso, v2Axis, phiAxis}); histos.add("hInvmass_K0s", "Invariant mass of unlike-sign K0s", HistType::kTHnSparseD, {centAxis, ptAxis, invMassAxisK0s, v2Axis, phiAxis}); + if (doprocessMC) { + histos.add("hInvmass_Kstar_MC", "Invariant mass of unlike chK(892)", HistType::kTHnSparseD, {axisType, centAxis, ptAxis, invMassAxisReso, v2Axis, phiAxis}); + } } else { histos.add("hInvmass_Kstar", "Invariant mass of unlike-sign chK(892)", HistType::kTHnSparseD, {axisType, centAxis, ptAxis, invMassAxisReso, v2Axis}); histos.add("hInvmass_K0s", "Invariant mass of unlike-sign K0s", HistType::kTHnSparseD, {centAxis, ptAxis, invMassAxisK0s, v2Axis}); + if (doprocessMC) { + histos.add("hInvmass_Kstar_MC", "Invariant mass of unlike chK(892)", HistType::kTHnSparseD, {axisType, centAxis, ptAxis, invMassAxisReso, v2Axis}); + } } - // Mass QA (quick check) - histos.add("QA/before/KstarRapidity", "Rapidity distribution of chK(892)", HistType::kTH1D, {yAxis}); - histos.add("QA/before/kstarinvmass", "Invariant mass of unlike-sign chK(892)", HistType::kTH1D, {invMassAxisReso}); - histos.add("QA/before/k0sv2vsinvmass", "Invariant mass vs v2 of unlike-sign K0s", HistType::kTH2D, {invMassAxisK0s, v2Axis}); - histos.add("QA/before/kstarv2vsinvmass", "Invariant mass vs v2 of unlike-sign chK(892)", HistType::kTH2D, {invMassAxisReso, v2Axis}); - histos.add("QA/before/kstarinvmass_Mix", "Invariant mass of unlike-sign chK(892) from mixed event", HistType::kTH1D, {invMassAxisReso}); - - histos.add("QA/after/KstarRapidity", "Rapidity distribution of chK(892)", HistType::kTH1D, {yAxis}); - histos.add("QA/after/kstarinvmass", "Invariant mass of unlike-sign chK(892)", HistType::kTH1D, {invMassAxisReso}); - histos.add("QA/after/k0sv2vsinvmass", "Invariant mass vs v2 of unlike-sign K0s", HistType::kTH2D, {invMassAxisK0s, v2Axis}); - histos.add("QA/after/kstarv2vsinvmass", "Invariant mass vs v2 of unlike-sign chK(892)", HistType::kTH2D, {invMassAxisReso, v2Axis}); - histos.add("QA/after/kstarinvmass_Mix", "Invariant mass of unlike-sign chK(892) from mixed event", HistType::kTH1D, {invMassAxisReso}); - lDetId = getlDetId(cfgQvecDetName); lRefAId = getlDetId(cfgQvecRefAName); lRefBId = getlDetId(cfgQvecRefBName); @@ -385,66 +442,11 @@ struct Chk892Flow { lRefBId = 5; } - // MC - if (doprocessMC) { - // Bachelor pion - histos.add("QAMC/trkbpionDCAxy", "DCAxy distribution of bachelor pion candidates", HistType::kTH1D, {dcaxyAxis}); - histos.add("QAMC/trkbpionDCAz", "DCAz distribution of bachelor pion candidates", HistType::kTH1D, {dcazAxis}); - histos.add("QAMC/trkbpionpT", "pT distribution of bachelor pion candidates", HistType::kTH1D, {ptAxis}); - histos.add("QAMC/trkbpionTPCPID", "TPC PID of bachelor pion candidates", HistType::kTH2D, {ptAxis, pidQAAxis}); - histos.add("QAMC/trkbpionTOFPID", "TOF PID of bachelor pion candidates", HistType::kTH2D, {ptAxis, pidQAAxis}); - histos.add("QAMC/trkbpionTPCTOFPID", "TPC-TOF PID map of bachelor pion candidates", HistType::kTH2D, {pidQAAxis, pidQAAxis}); - - // Secondary pion 1 - histos.add("QAMC/trkppionDCAxy", "DCAxy distribution of secondary pion 1 (positive) candidates", HistType::kTH1D, {dcaxyAxis}); - histos.add("QAMC/trkppionDCAz", "DCAz distribution of secondary pion 1 (positive) candidates", HistType::kTH1D, {dcazAxis}); - histos.add("QAMC/trkppionpT", "pT distribution of secondary pion 1 (positive) candidates", HistType::kTH1D, {ptAxis}); - histos.add("QAMC/trkppionTPCPID", "TPC PID of secondary pion 1 (positive) candidates", HistType::kTH2D, {ptAxis, pidQAAxis}); - histos.add("QAMC/trkppionTOFPID", "TOF PID of secondary pion 1 (positive) candidates", HistType::kTH2D, {ptAxis, pidQAAxis}); - histos.add("QAMC/trkppionTPCTOFPID", "TPC-TOF PID map of secondary pion 1 (positive) candidates", HistType::kTH2D, {pidQAAxis, pidQAAxis}); - - // Secondary pion 2 - histos.add("QAMC/trknpionTPCPID", "TPC PID of secondary pion 2 (negative) candidates", HistType::kTH2D, {ptAxis, pidQAAxis}); - histos.add("QAMC/trknpionTOFPID", "TOF PID of secondary pion 2 (negative) candidates", HistType::kTH2D, {ptAxis, pidQAAxis}); - histos.add("QAMC/trknpionTPCTOFPID", "TPC-TOF PID map of secondary pion 2 (negative) candidates", HistType::kTH2D, {pidQAAxis, pidQAAxis}); - histos.add("QAMC/trknpionpT", "pT distribution of secondary pion 2 (negative) candidates", HistType::kTH1D, {ptAxis}); - histos.add("QAMC/trknpionDCAxy", "DCAxy distribution of secondary pion 2 (negative) candidates", HistType::kTH1D, {dcaxyAxis}); - histos.add("QAMC/trknpionDCAz", "DCAz distribution of secondary pion 2 (negative) candidates", HistType::kTH1D, {dcazAxis}); - - // Secondary Resonance (K0s candidates) - histos.add("QAMC/hDauDCASecondary", "DCA of daughters of secondary resonance", HistType::kTH1D, {dcaAxis}); - histos.add("QAMC/hDauPosDCAtoPVSecondary", "Pos DCA to PV of daughters secondary resonance", HistType::kTH1D, {dcaAxis}); - histos.add("QAMC/hDauNegDCAtoPVSecondary", "Neg DCA to PV of daughters secondary resonance", HistType::kTH1D, {dcaAxis}); - - histos.add("QAMC/hy_Secondary", "Rapidity distribution of secondary resonance", HistType::kTH1D, {yAxis}); - histos.add("QAMC/hCPASecondary", "Cosine pointing angle distribution of secondary resonance", HistType::kTH1D, {cpaAxis}); - histos.add("QAMC/hDCAtoPVSecondary", "DCA to PV distribution of secondary resonance", HistType::kTH1D, {dcaAxis}); - histos.add("QAMC/hPropTauSecondary", "Proper Lifetime distribution of secondary resonance", HistType::kTH1D, {tauAxis}); - histos.add("QAMC/hInvmassSecondary", "Invariant mass of unlike-sign secondary resonance", HistType::kTH1D, {invMassAxisK0s}); - - // K892 - histos.add("QAMC/KstarOA", "Opening angle of chK(892)", HistType::kTH1D, {AxisSpec{100, 0, 3.14, "Opening angle"}}); - histos.add("QAMC/KstarPairAsym", "Pair asymmetry of chK(892)", HistType::kTH1D, {AxisSpec{100, -1, 1, "Pair asymmetry"}}); - histos.add("QAMC/KstarRapidity", "Rapidity distribution of chK(892)", HistType::kTH1D, {yAxis}); - - histos.add("QAMC/kstarinvmass", "Invariant mass of unlike-sign chK(892)", HistType::kTH1D, {invMassAxisReso}); - histos.add("QAMC/k0sv2vsinvmass", "Invariant mass vs v2 of unlike-sign K0s", HistType::kTH2D, {invMassAxisK0s, v2Axis}); - histos.add("QAMC/kstarv2vsinvmass", "Invariant mass vs v2 of unlike-sign chK(892)", HistType::kTH2D, {invMassAxisReso, v2Axis}); - histos.add("QAMC/kstarinvmass_noKstar", "Invariant mass of unlike-sign no chK(892)", HistType::kTH1D, {invMassAxisReso}); - histos.add("QAMC/kstarv2vsinvmass_noKstar", "Invariant mass vs v2 of unlike-sign no chK(892)", HistType::kTH2D, {invMassAxisReso, v2Axis}); - - if (cfgFillAdditionalAxis) { - histos.add("hInvmass_Kstar_MC", "Invariant mass of unlike chK(892)", HistType::kTHnSparseD, {axisType, centAxis, ptAxis, invMassAxisReso, v2Axis, phiAxis}); - } else { - histos.add("hInvmass_Kstar_MC", "Invariant mass of unlike chK(892)", HistType::kTHnSparseD, {axisType, centAxis, ptAxis, invMassAxisReso, v2Axis}); - } - - ccdb->setURL(cfgURL); - ccdbApi.init("http://alice-ccdb.cern.ch"); - ccdb->setCaching(true); - ccdb->setLocalObjectValidityChecking(); - ccdb->setCreatedNotAfter(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); - } + ccdb->setURL(cfgURL); + ccdbApi.init("http://alice-ccdb.cern.ch"); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setCreatedNotAfter(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); // Print output histograms statistics LOG(info) << "Size of the histograms in chK(892) Analysis Task"; @@ -741,15 +743,17 @@ struct Chk892Flow { auto trkbNSigmaPiTOF = (istrkbhasTOF) ? bTrack.tofNSigmaPi() : -999.; if constexpr (!IsMix) { - // Bachelor pion QA plots - histos.fill(HIST("QA/before/trkbpionTPCPID"), trkbpt, trkbNSigmaPiTPC); - if (istrkbhasTOF) { - histos.fill(HIST("QA/before/trkbpionTOFPID"), trkbpt, trkbNSigmaPiTOF); - histos.fill(HIST("QA/before/trkbpionTPCTOFPID"), trkbNSigmaPiTPC, trkbNSigmaPiTOF); + if (cfgFillQAPlots) { + // Bachelor pion QA plots + histos.fill(HIST("QA/before/trkbpionTPCPID"), trkbpt, trkbNSigmaPiTPC); + if (istrkbhasTOF) { + histos.fill(HIST("QA/before/trkbpionTOFPID"), trkbpt, trkbNSigmaPiTOF); + histos.fill(HIST("QA/before/trkbpionTPCTOFPID"), trkbNSigmaPiTPC, trkbNSigmaPiTOF); + } + histos.fill(HIST("QA/before/trkbpionpT"), trkbpt); + histos.fill(HIST("QA/before/trkbpionDCAxy"), bTrack.dcaXY()); + histos.fill(HIST("QA/before/trkbpionDCAz"), bTrack.dcaZ()); } - histos.fill(HIST("QA/before/trkbpionpT"), trkbpt); - histos.fill(HIST("QA/before/trkbpionDCAxy"), bTrack.dcaXY()); - histos.fill(HIST("QA/before/trkbpionDCAz"), bTrack.dcaZ()); } if (!trackCut(bTrack)) @@ -758,15 +762,17 @@ struct Chk892Flow { continue; if constexpr (!IsMix) { - // Bachelor pion QA plots after applying cuts - histos.fill(HIST("QA/after/trkbpionTPCPID"), trkbpt, trkbNSigmaPiTPC); - if (istrkbhasTOF) { - histos.fill(HIST("QA/after/trkbpionTOFPID"), trkbpt, trkbNSigmaPiTOF); - histos.fill(HIST("QA/after/trkbpionTPCTOFPID"), trkbNSigmaPiTPC, trkbNSigmaPiTOF); + if (cfgFillQAPlots) { + // Bachelor pion QA plots after applying cuts + histos.fill(HIST("QA/after/trkbpionTPCPID"), trkbpt, trkbNSigmaPiTPC); + if (istrkbhasTOF) { + histos.fill(HIST("QA/after/trkbpionTOFPID"), trkbpt, trkbNSigmaPiTOF); + histos.fill(HIST("QA/after/trkbpionTPCTOFPID"), trkbNSigmaPiTPC, trkbNSigmaPiTOF); + } + histos.fill(HIST("QA/after/trkbpionpT"), trkbpt); + histos.fill(HIST("QA/after/trkbpionDCAxy"), bTrack.dcaXY()); + histos.fill(HIST("QA/after/trkbpionDCAz"), bTrack.dcaZ()); } - histos.fill(HIST("QA/after/trkbpionpT"), trkbpt); - histos.fill(HIST("QA/after/trkbpionDCAxy"), bTrack.dcaXY()); - histos.fill(HIST("QA/after/trkbpionDCAz"), bTrack.dcaZ()); } trackIndicies.push_back(bTrack.index()); } @@ -799,32 +805,34 @@ struct Chk892Flow { auto lPhiMinusPsiK0s = RecoDecay::constrainAngle(lResoSecondary.Phi() - lEPDet, 0.0, 2); // constrain angle to range 0, Pi auto v2K0s = std::cos(static_cast(nmode) * lPhiMinusPsiK0s); if constexpr (!IsMix) { - // Seconddary QA plots - histos.fill(HIST("QA/before/trkppionTPCPID"), trkppt, trkpNSigmaPiTPC); - if (istrkphasTOF) { - histos.fill(HIST("QA/before/trkppionTOFPID"), trkppt, trkpNSigmaPiTOF); - histos.fill(HIST("QA/before/trkppionTPCTOFPID"), trkpNSigmaPiTPC, trkpNSigmaPiTOF); - } - histos.fill(HIST("QA/before/trkppionpT"), trkppt); - histos.fill(HIST("QA/before/trkppionDCAxy"), posDauTrack.dcaXY()); - histos.fill(HIST("QA/before/trkppionDCAz"), posDauTrack.dcaZ()); - - histos.fill(HIST("QA/before/trknpionTPCPID"), trknpt, trknNSigmaPiTPC); - if (istrknhasTOF) { - histos.fill(HIST("QA/before/trknpionTOFPID"), trknpt, trknNSigmaPiTOF); - histos.fill(HIST("QA/before/trknpionTPCTOFPID"), trknNSigmaPiTPC, trknNSigmaPiTOF); + if (cfgFillQAPlots) { + // Seconddary QA plots + histos.fill(HIST("QA/before/trkppionTPCPID"), trkppt, trkpNSigmaPiTPC); + if (istrkphasTOF) { + histos.fill(HIST("QA/before/trkppionTOFPID"), trkppt, trkpNSigmaPiTOF); + histos.fill(HIST("QA/before/trkppionTPCTOFPID"), trkpNSigmaPiTPC, trkpNSigmaPiTOF); + } + histos.fill(HIST("QA/before/trkppionpT"), trkppt); + histos.fill(HIST("QA/before/trkppionDCAxy"), posDauTrack.dcaXY()); + histos.fill(HIST("QA/before/trkppionDCAz"), posDauTrack.dcaZ()); + + histos.fill(HIST("QA/before/trknpionTPCPID"), trknpt, trknNSigmaPiTPC); + if (istrknhasTOF) { + histos.fill(HIST("QA/before/trknpionTOFPID"), trknpt, trknNSigmaPiTOF); + histos.fill(HIST("QA/before/trknpionTPCTOFPID"), trknNSigmaPiTPC, trknNSigmaPiTOF); + } + histos.fill(HIST("QA/before/trknpionpT"), trknpt); + histos.fill(HIST("QA/before/trknpionDCAxy"), negDauTrack.dcaXY()); + histos.fill(HIST("QA/before/trknpionDCAz"), negDauTrack.dcaZ()); + histos.fill(HIST("QA/before/hDauDCASecondary"), trkkDauDCA); + histos.fill(HIST("QA/before/hy_Secondary"), trkky); + histos.fill(HIST("QA/before/hDCAtoPVSecondary"), trkkDCAtoPV); + histos.fill(HIST("QA/before/hCPASecondary"), trkkCPA); + histos.fill(HIST("QA/before/hPropTauSecondary"), trkkPropTau); + histos.fill(HIST("QA/before/hInvmassSecondary"), trkkMass); + + histos.fill(HIST("QA/before/k0sv2vsinvmass"), lResoSecondary.M(), v2K0s); } - histos.fill(HIST("QA/before/trknpionpT"), trknpt); - histos.fill(HIST("QA/before/trknpionDCAxy"), negDauTrack.dcaXY()); - histos.fill(HIST("QA/before/trknpionDCAz"), negDauTrack.dcaZ()); - histos.fill(HIST("QA/before/hDauDCASecondary"), trkkDauDCA); - histos.fill(HIST("QA/before/hy_Secondary"), trkky); - histos.fill(HIST("QA/before/hDCAtoPVSecondary"), trkkDCAtoPV); - histos.fill(HIST("QA/before/hCPASecondary"), trkkCPA); - histos.fill(HIST("QA/before/hPropTauSecondary"), trkkPropTau); - histos.fill(HIST("QA/before/hInvmassSecondary"), trkkMass); - - histos.fill(HIST("QA/before/k0sv2vsinvmass"), lResoSecondary.M(), v2K0s); } if (!cfgByPassDauPIDSelection && !selectionPIDPion(posDauTrack)) @@ -835,39 +843,41 @@ struct Chk892Flow { continue; if constexpr (!IsMix) { - // Seconddary QA plots after applying cuts - histos.fill(HIST("QA/after/trkppionTPCPID"), trkppt, trkpNSigmaPiTPC); - if (istrkphasTOF) { - histos.fill(HIST("QA/after/trkppionTOFPID"), trkppt, trkpNSigmaPiTOF); - histos.fill(HIST("QA/after/trkppionTPCTOFPID"), trkpNSigmaPiTPC, trkpNSigmaPiTOF); - } - histos.fill(HIST("QA/after/trkppionpT"), trkppt); - histos.fill(HIST("QA/after/trkppionDCAxy"), posDauTrack.dcaXY()); - histos.fill(HIST("QA/after/trkppionDCAz"), posDauTrack.dcaZ()); - - histos.fill(HIST("QA/after/trknpionTPCPID"), trknpt, trknNSigmaPiTPC); - if (istrknhasTOF) { - histos.fill(HIST("QA/after/trknpionTOFPID"), trknpt, trknNSigmaPiTOF); - histos.fill(HIST("QA/after/trknpionTPCTOFPID"), trknNSigmaPiTPC, trknNSigmaPiTOF); - } - histos.fill(HIST("QA/after/trknpionpT"), trknpt); - histos.fill(HIST("QA/after/trknpionDCAxy"), negDauTrack.dcaXY()); - histos.fill(HIST("QA/after/trknpionDCAz"), negDauTrack.dcaZ()); - - histos.fill(HIST("QA/after/hDauDCASecondary"), trkkDauDCA); - histos.fill(HIST("QA/after/hy_Secondary"), trkky); - histos.fill(HIST("QA/after/hDCAtoPVSecondary"), trkkDCAtoPV); - histos.fill(HIST("QA/after/hCPASecondary"), trkkCPA); - histos.fill(HIST("QA/after/hPropTauSecondary"), trkkPropTau); - histos.fill(HIST("QA/after/hInvmassSecondary"), trkkMass); - - histos.fill(HIST("QA/after/k0sv2vsinvmass"), lResoSecondary.M(), v2K0s); - if (cfgFillAdditionalAxis) { - histos.fill(HIST("hInvmass_K0s"), lCentrality, lResoSecondary.Pt(), lResoSecondary.M(), v2K0s, static_cast(nmode) * lPhiMinusPsiK0s); - } else { - histos.fill(HIST("hInvmass_K0s"), lCentrality, lResoSecondary.Pt(), lResoSecondary.M(), v2K0s); + if (cfgFillQAPlots) { + // Seconddary QA plots after applying cuts + histos.fill(HIST("QA/after/trkppionTPCPID"), trkppt, trkpNSigmaPiTPC); + if (istrkphasTOF) { + histos.fill(HIST("QA/after/trkppionTOFPID"), trkppt, trkpNSigmaPiTOF); + histos.fill(HIST("QA/after/trkppionTPCTOFPID"), trkpNSigmaPiTPC, trkpNSigmaPiTOF); + } + histos.fill(HIST("QA/after/trkppionpT"), trkppt); + histos.fill(HIST("QA/after/trkppionDCAxy"), posDauTrack.dcaXY()); + histos.fill(HIST("QA/after/trkppionDCAz"), posDauTrack.dcaZ()); + + histos.fill(HIST("QA/after/trknpionTPCPID"), trknpt, trknNSigmaPiTPC); + if (istrknhasTOF) { + histos.fill(HIST("QA/after/trknpionTOFPID"), trknpt, trknNSigmaPiTOF); + histos.fill(HIST("QA/after/trknpionTPCTOFPID"), trknNSigmaPiTPC, trknNSigmaPiTOF); + } + histos.fill(HIST("QA/after/trknpionpT"), trknpt); + histos.fill(HIST("QA/after/trknpionDCAxy"), negDauTrack.dcaXY()); + histos.fill(HIST("QA/after/trknpionDCAz"), negDauTrack.dcaZ()); + + histos.fill(HIST("QA/after/hDauDCASecondary"), trkkDauDCA); + histos.fill(HIST("QA/after/hy_Secondary"), trkky); + histos.fill(HIST("QA/after/hDCAtoPVSecondary"), trkkDCAtoPV); + histos.fill(HIST("QA/after/hCPASecondary"), trkkCPA); + histos.fill(HIST("QA/after/hPropTauSecondary"), trkkPropTau); + histos.fill(HIST("QA/after/hInvmassSecondary"), trkkMass); + + histos.fill(HIST("QA/after/k0sv2vsinvmass"), lResoSecondary.M(), v2K0s); } } + if (cfgFillAdditionalAxis) { + histos.fill(HIST("hInvmass_K0s"), lCentrality, lResoSecondary.Pt(), lResoSecondary.M(), v2K0s, static_cast(nmode) * lPhiMinusPsiK0s); + } else { + histos.fill(HIST("hInvmass_K0s"), lCentrality, lResoSecondary.Pt(), lResoSecondary.M(), v2K0s); + } k0sIndicies.push_back(k0sCand.index()); } @@ -892,9 +902,11 @@ struct Chk892Flow { // QA plots if constexpr (!IsMix) { - histos.fill(HIST("QA/before/KstarRapidity"), lResoKstar.Rapidity()); - histos.fill(HIST("QA/before/kstarinvmass"), lResoKstar.M()); - histos.fill(HIST("QA/before/kstarv2vsinvmass"), lResoKstar.M(), resoFlowValue); + if (cfgFillQAPlots) { + histos.fill(HIST("QA/before/KstarRapidity"), lResoKstar.Rapidity()); + histos.fill(HIST("QA/before/kstarinvmass"), lResoKstar.M()); + histos.fill(HIST("QA/before/kstarv2vsinvmass"), lResoKstar.M(), resoFlowValue); + } } if (lResoKstar.Rapidity() > cKstarMaxRap || lResoKstar.Rapidity() < cKstarMinRap) @@ -903,9 +915,11 @@ struct Chk892Flow { if constexpr (!IsMix) { unsigned int typeKstar = bTrack.sign() > 0 ? BinType::kKstarP : BinType::kKstarN; - histos.fill(HIST("QA/after/KstarRapidity"), lResoKstar.Rapidity()); - histos.fill(HIST("QA/after/kstarinvmass"), lResoKstar.M()); - histos.fill(HIST("QA/after/kstarv2vsinvmass"), lResoKstar.M(), resoFlowValue); + if (cfgFillQAPlots) { + histos.fill(HIST("QA/after/KstarRapidity"), lResoKstar.Rapidity()); + histos.fill(HIST("QA/after/kstarinvmass"), lResoKstar.M()); + histos.fill(HIST("QA/after/kstarv2vsinvmass"), lResoKstar.M(), resoFlowValue); + } if (cfgFillAdditionalAxis) { histos.fill(HIST("hInvmass_Kstar"), typeKstar, lCentrality, lResoKstar.Pt(), lResoKstar.M(), resoFlowValue, static_cast(nmode) * lPhiMinusPsiKstar); } else { @@ -915,7 +929,9 @@ struct Chk892Flow { if (cfgFillRotBkg) { for (int i = 0; i < cfgNrotBkg; i++) { auto lRotAngle = cfgMinRot + i * (cfgMaxRot - cfgMinRot) / (1.0 * (cfgNrotBkg - 1)); - histos.fill(HIST("QA/RotBkg/hRotBkg"), lRotAngle); + if (cfgFillQAPlots) { + histos.fill(HIST("QA/RotBkg/hRotBkg"), lRotAngle); + } if (cfgRotPion) { lDaughterRot = lDecayDaughter_bach; lDaughterRot.RotateZ(lRotAngle); From 9b4bd07c4911613b171c7f24ffe559990758f3bc Mon Sep 17 00:00:00 2001 From: Junlee Kim Date: Wed, 12 Feb 2025 22:22:16 +0100 Subject: [PATCH 0186/1650] [PWGLF] adding rotational backgrounds (#9909) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Strangeness/lambdalambda.cxx | 33 +++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdalambda.cxx b/PWGLF/Tasks/Strangeness/lambdalambda.cxx index 14fb9c40c4a..e71dad7d417 100644 --- a/PWGLF/Tasks/Strangeness/lambdalambda.cxx +++ b/PWGLF/Tasks/Strangeness/lambdalambda.cxx @@ -125,6 +125,8 @@ struct lambdalambda { Configurable cfgEffCor{"cfgEffCor", false, "flag to apply efficiency correction"}; Configurable cfgEffCorPath{"cfgEffCorPath", "", "path for pseudo efficiency correction"}; + Configurable cfgRotBkg{"cfgRotBkg", true, "flag to construct rotational backgrounds"}; + Configurable cfgNRotBkg{"cfgNRotBkg", 10, "the number of rotational backgrounds"}; Configurable cfgNoMixedEvents{"cfgNoMixedEvents", 10, "Number of mixed events per event"}; ConfigurableAxis massAxis{"massAxis", {110, 2.22, 2.33}, "Invariant mass axis"}; @@ -143,6 +145,8 @@ struct lambdalambda { float centrality; TProfile2D* EffMap = nullptr; + TRandom* rn = new TRandom(); + void init(o2::framework::InitContext&) { AxisSpec centQaAxis = {80, 0.0, 80.0}; @@ -161,6 +165,12 @@ struct lambdalambda { histos.add("h_InvMass_same", "", {HistType::kTHnSparseF, {massAxis, ptAxis, centAxis, combAxis}}); histos.add("h_InvMass_mixed", "", {HistType::kTHnSparseF, {massAxis, ptAxis, centAxis, combAxis}}); + histos.add("h_InvMass_rot", "", {HistType::kTHnSparseF, {massAxis, ptAxis, centAxis, combAxis}}); + + histos.add("h_InvMass_same_sel", "", {HistType::kTHnSparseF, {massAxis, ptAxis, centAxis, combAxis}}); + histos.add("h_InvMass_mixed_sel", "", {HistType::kTHnSparseF, {massAxis, ptAxis, centAxis, combAxis}}); + histos.add("h_InvMass_rot_sel", "", {HistType::kTHnSparseF, {massAxis, ptAxis, centAxis, combAxis}}); + if (cfgQAv0) { histos.add("QA/CentDist", "", {HistType::kTH1F, {centQaAxis}}); histos.add("QA/PVzDist", "", {HistType::kTH1F, {PVzQaAxis}}); @@ -180,6 +190,7 @@ struct lambdalambda { double massLambda = o2::constants::physics::MassLambda; ROOT::Math::PxPyPzMVector RecoV01, RecoV02, RecoV0V0; + ROOT::Math::PxPyPzMVector RecoV02Rot, RecoV0V0Rot; template bool eventSelected(TCollision collision) @@ -412,6 +423,7 @@ struct lambdalambda { } RecoV0V0 = RecoV01 + RecoV02; + if (std::abs(RecoV0V0.Rapidity()) > cfgV0V0RapMax) continue; @@ -427,14 +439,29 @@ struct lambdalambda { histos.fill(HIST("DCA_V0V0_sel"), RecoV0V0.M(), RecoV0V0.Pt(), getDCAofV0V0(v01, v02), V01Tag + V02Tag); } - if (cfgV0V0Sel && !isSelectedV0V0(v01, v02)) - continue; - if (doprocessDataSame) { histos.fill(HIST("h_InvMass_same"), RecoV0V0.M(), RecoV0V0.Pt(), centrality, V01Tag + V02Tag); + if (cfgV0V0Sel && isSelectedV0V0(v01, v02)) { + histos.fill(HIST("h_InvMass_same_sel"), RecoV0V0.M(), RecoV0V0.Pt(), centrality, V01Tag + V02Tag); + } + if (cfgRotBkg) { + for (int nr = 0; nr < cfgNRotBkg; nr++) { + auto RanPhi = rn->Uniform(o2::constants::math::PI * 5.0 / 6.0, o2::constants::math::PI * 7.0 / 6.0); + RanPhi += RecoV02.Phi(); + RecoV02Rot = ROOT::Math::PxPyPzMVector(RecoV02.Pt() * std::cos(RanPhi), RecoV02.Pt() * std::sin(RanPhi), RecoV02.Pz(), RecoV02.M()); + RecoV0V0Rot = RecoV01 + RecoV02Rot; + histos.fill(HIST("h_InvMass_rot"), RecoV0V0Rot.M(), RecoV0V0Rot.Pt(), centrality, V01Tag + V02Tag); + if (cfgV0V0Sel && isSelectedV0V0(v01, v02)) { + histos.fill(HIST("h_InvMass_rot_sel"), RecoV0V0Rot.M(), RecoV0V0Rot.Pt(), centrality, V01Tag + V02Tag); + } + } + } } if (doprocessDataMixed) { histos.fill(HIST("h_InvMass_mixed"), RecoV0V0.M(), RecoV0V0.Pt(), centrality, V01Tag + V02Tag); + if (cfgV0V0Sel && isSelectedV0V0(v01, v02)) { + histos.fill(HIST("h_InvMass_mixed_sel"), RecoV0V0.M(), RecoV0V0.Pt(), centrality, V01Tag + V02Tag); + } } } } From cb6545f98c664bc832740c5adaa00248dbf63170 Mon Sep 17 00:00:00 2001 From: Dukhishyam Mallick <160018357+dmallick2@users.noreply.github.com> Date: Wed, 12 Feb 2025 23:35:33 +0100 Subject: [PATCH 0187/1650] [PWGLF] Initial task for first-order flow harmonics of K*(892) (#9932) --- PWGLF/Tasks/Resonances/CMakeLists.txt | 5 + PWGLF/Tasks/Resonances/kstarFlowv1.cxx | 356 +++++++++++++++++++++++++ 2 files changed, 361 insertions(+) create mode 100644 PWGLF/Tasks/Resonances/kstarFlowv1.cxx diff --git a/PWGLF/Tasks/Resonances/CMakeLists.txt b/PWGLF/Tasks/Resonances/CMakeLists.txt index 6c98d0325bc..a16bc86aadd 100644 --- a/PWGLF/Tasks/Resonances/CMakeLists.txt +++ b/PWGLF/Tasks/Resonances/CMakeLists.txt @@ -188,3 +188,8 @@ o2physics_add_dpl_workflow(rho770analysis SOURCES rho770analysis.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(kstarpbpbv1 + SOURCES kstarFlowv1.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) diff --git a/PWGLF/Tasks/Resonances/kstarFlowv1.cxx b/PWGLF/Tasks/Resonances/kstarFlowv1.cxx new file mode 100644 index 00000000000..08139c3c2d2 --- /dev/null +++ b/PWGLF/Tasks/Resonances/kstarFlowv1.cxx @@ -0,0 +1,356 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// +/// \file kstarFlowv1.cxx +/// \brief first order flow harmonic for resonance +/// \author Prottay Das , Dukhishyam Mallick +/// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +// #include +#include +#include +#include + +#include "TRandom3.h" +#include "Math/Vector3D.h" +#include "Math/Vector4D.h" +#include "Math/GenVector/Boost.h" +#include "TF1.h" + +#include "Common/Core/trackUtilities.h" +#include "Common/Core/TrackSelection.h" +#include "Common/Core/RecoDecay.h" + +#include "PWGLF/DataModel/SPCalibrationTables.h" +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/StepTHn.h" +#include "Framework/O2DatabasePDGPlugin.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/Core/trackUtilities.h" +#include "CommonConstants/PhysicsConstants.h" +#include "Common/Core/TrackSelection.h" +#include "Framework/ASoAHelpers.h" +#include "ReconstructionDataFormats/Track.h" +#include "DataFormatsParameters/GRPObject.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "CCDB/BasicCCDBManager.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using std::array; +using namespace o2::constants::physics; +struct KstarFlowv1 { + + Service ccdb; + // Service pdg; + + // events + Configurable cfgCutVertex{"cfgCutVertex", 10.0f, "Accepted z-vertex range"}; + Configurable cfgCutCentrality{"cfgCutCentrality", 80.0f, "Accepted maximum Centrality"}; + // track + Configurable cfgCutCharge{"cfgCutCharge", 0.0, "cut on Charge"}; + Configurable cfgCutPT{"cfgCutPT", 0.2, "PT cut on daughter track"}; + Configurable cfgCutEta{"cfgCutEta", 0.8, "Eta cut on daughter track"}; + Configurable cfgCutDCAxy{"cfgCutDCAxy", 2.0f, "DCAxy range for tracks"}; + Configurable cfgCutDCAz{"cfgCutDCAz", 2.0f, "DCAz range for tracks"}; + Configurable useGlobalTrack{"useGlobalTrack", true, "use Global track"}; + Configurable nsigmaCutTOF{"nsigmaCutTOF", 3.0, "Value of the TOF Nsigma cut"}; + Configurable nsigmaCutTPC{"nsigmaCutTPC", 3.0, "Value of the TPC Nsigma cut"}; + Configurable nsigmaCutCombined{"nsigmaCutCombined", 3.0, "Value of the TOF Nsigma cut"}; + Configurable cfgNoMixedEvents{"cfgNoMixedEvents", 1, "Number of mixed events per event"}; + Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; + Configurable cfgTPCcluster{"cfgTPCcluster", 70, "Number of TPC cluster"}; + // Configurable removefaketrak{"removefaketrack", true, "Remove fake track from momentum difference"}; + Configurable confFakeKaonCut{"confFakeKaonCut", 0.1, "Cut based on track from momentum difference"}; + Configurable ispTdepPID{"ispTdepPID", true, "pT dependent PID"}; + Configurable onlyTOF{"onlyTOF", true, "onlyTOF"}; + Configurable strategyPID{"strategyPID", 2, "PID strategy"}; + Configurable cfgCutTOFBeta{"cfgCutTOFBeta", 0.0, "cut TOF beta"}; + Configurable confMinRot{"confMinRot", 5.0 * o2::constants::math::PI / 6.0, "Minimum of rotation"}; + Configurable confMaxRot{"confMaxRot", 7.0 * o2::constants::math::PI / 6.0, "Maximum of rotation"}; + Configurable nBkgRotations{"nBkgRotations", 9, "Number of rotated copies (background) per each original candidate"}; + Configurable fillRotation{"fillRotation", true, "fill rotation"}; + Configurable like{"like", true, "fill rotation"}; + Configurable spNbins{"spNbins", 2000, "Number of bins in sp"}; + Configurable lbinsp{"lbinsp", -1.0, "lower bin value in sp histograms"}; + Configurable hbinsp{"hbinsp", 1.0, "higher bin value in sp histograms"}; + + ConfigurableAxis configcentAxis{"configcentAxis", {VARIABLE_WIDTH, 0.0, 10.0, 30.0, 50.0, 80.0}, "Cent V0M"}; + ConfigurableAxis configthnAxisPt{"configthnAxisPt", {VARIABLE_WIDTH, 0.2, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 6.5, 8.0, 10.0, 50.0}, "#it{p}_{T} (GeV/#it{c})"}; + ConfigurableAxis configetaAxis{"configetaAxis", {VARIABLE_WIDTH, -0.8, -0.4, -0.2, 0, 0.2, 0.4, 0.8}, "Eta"}; + ConfigurableAxis configIMAxis{"configIMAxis", {VARIABLE_WIDTH, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.05, 1.1, 1.15, 1.2}, "IM"}; + + Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; + Filter centralityFilter = nabs(aod::cent::centFT0C) < cfgCutCentrality; + Filter acceptanceFilter = (nabs(aod::track::eta) < cfgCutEta && nabs(aod::track::pt) > cfgCutPT); + Filter dCAcutFilter = (nabs(aod::track::dcaXY) < cfgCutDCAxy) && (nabs(aod::track::dcaZ) < cfgCutDCAz); + + using EventCandidates = soa::Filtered>; + using TrackCandidates = soa::Filtered>; + + SliceCache cache; + Partition posTracks = aod::track::signed1Pt > cfgCutCharge; + Partition negTracks = aod::track::signed1Pt < cfgCutCharge; + + HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + + void init(o2::framework::InitContext&) + { + AxisSpec spAxis = {spNbins, lbinsp, hbinsp, "Sp"}; + + histos.add("hpQxtQxpvscent", "hpQxtQxpvscent", HistType::kTHnSparseF, {configcentAxis, spAxis}, true); + histos.add("hpQytQypvscent", "hpQytQypvscent", HistType::kTHnSparseF, {configcentAxis, spAxis}, true); + histos.add("hpQxytpvscent", "hpQxytpvscent", HistType::kTHnSparseF, {configcentAxis, spAxis}, true); + histos.add("hpQxtQypvscent", "hpQxtQypvscent", HistType::kTHnSparseF, {configcentAxis, spAxis}, true); + histos.add("hpQxpQytvscent", "hpQxpQytvscent", HistType::kTHnSparseF, {configcentAxis, spAxis}, true); + + histos.add("hpv1vscentpteta", "hpv1vscentpteta", HistType::kTHnSparseF, {configIMAxis, configcentAxis, configthnAxisPt, configetaAxis, spAxis}, true); + histos.add("hpv1vscentptetarot", "hpv1vscentptetarot", HistType::kTHnSparseF, {configIMAxis, configcentAxis, configthnAxisPt, configetaAxis, spAxis}, true); + histos.add("hpv1vscentptetalike", "hpv1vscentptetalike", HistType::kTHnSparseF, {configIMAxis, configcentAxis, configthnAxisPt, configetaAxis, spAxis}, true); + } + + double massKa = o2::constants::physics::MassKPlus; + double massPi = o2::constants::physics::MassPiMinus; + + template + bool selectionTrack(const T& candidate) + { + if (useGlobalTrack && !(candidate.isGlobalTrack() && candidate.isPVContributor() && candidate.itsNCls() > cfgITScluster && candidate.tpcNClsFound() > cfgTPCcluster)) { + return false; + } + if (!useGlobalTrack && !(candidate.isPVContributor() && candidate.itsNCls() > cfgITScluster)) { + return false; + } + return true; + } + + template + bool strategySelectionPID(const T& candidate, int PID, int strategy) + { + if (PID == 0) { + if (strategy == 0) { + if (candidate.pt() < 0.5 && std::abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.5 && std::abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC && candidate.hasTOF() && std::abs(candidate.tofNSigmaKa()) < nsigmaCutTOF && candidate.beta() > 0.5) { + return true; + } + } else if (strategy == 1) { + if (candidate.pt() < 0.5 && std::abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.5 && std::sqrt(candidate.tpcNSigmaKa() * candidate.tpcNSigmaKa() + candidate.tofNSigmaKa() * candidate.tofNSigmaKa()) < nsigmaCutTOF && candidate.beta() > 0.5) { + return true; + } + } else if (strategy == 2) { + if (candidate.pt() < 0.5 && std::abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.5 && std::abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC && candidate.hasTOF() && std::abs(candidate.tofNSigmaKa()) < nsigmaCutTOF && candidate.beta() > 0.5) { + return true; + } + if (candidate.pt() >= 0.5 && std::abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC && !candidate.hasTOF()) { + return true; + } + } + } + if (PID == 1) { + if (strategy == 0) { + if (candidate.pt() < 0.5 && std::abs(candidate.tpcNSigmaPi()) < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.5 && std::abs(candidate.tpcNSigmaPi()) < nsigmaCutTPC && candidate.hasTOF() && std::abs(candidate.tofNSigmaPi()) < nsigmaCutTOF && candidate.beta() > 0.5) { + return true; + } + } else if (strategy == 1) { + if (candidate.pt() < 0.5 && std::abs(candidate.tpcNSigmaPi()) < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.5 && std::sqrt(candidate.tpcNSigmaPi() * candidate.tpcNSigmaPi() + candidate.tofNSigmaPi() * candidate.tofNSigmaPi()) < nsigmaCutTOF && candidate.beta() > 0.5) { + return true; + } + } else if (strategy == 2) { + if (candidate.pt() < 0.5 && std::abs(candidate.tpcNSigmaPi()) < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.5 && std::abs(candidate.tpcNSigmaPi()) < nsigmaCutTPC && candidate.hasTOF() && std::abs(candidate.tofNSigmaPi()) < nsigmaCutTOF && candidate.beta() > 0.5) { + return true; + } + if (candidate.pt() >= 0.5 && std::abs(candidate.tpcNSigmaPi()) < nsigmaCutTPC && !candidate.hasTOF()) { + return true; + } + } + } + return false; + } + + double getPhiInRange(double phi) + { + double pi = o2::constants::math::PI; + double twoPi = 2.0 * pi; + double result = phi; + // Normalize to [-pi, pi] + // double result = std::fmod(phi + pi, twoPi); + // if (result < 0) { + // result += twoPi; + // } + // result -= pi; // Now result is in [-pi, pi] + + // Convert from [-pi, pi] to [0, pi] + if (result < 0) { + result += pi; // Shift negative values to positive + } + + // If phi > 2π, subtract π instead of normalizing by 2π + if (phi > twoPi) { + result -= pi; + } + + return result; // Ensures range is [0, π] + } + + template + bool isFakeKaon(T const& track, int /*PID*/) + { + const auto pglobal = track.p(); + const auto ptpc = track.tpcInnerParam(); + if (std::abs(pglobal - ptpc) > confFakeKaonCut) { + return true; + } + return false; + } + + ROOT::Math::PxPyPzMVector KstarMother, daughter1, daughter2, kaonrot, kstarrot; + + void processSE(EventCandidates::iterator const& collision, TrackCandidates const& tracks, aod::BCs const&) + { + if (!collision.sel8() || !collision.triggereventsp() || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(aod::evsel::kNoITSROFrameBorder) || !collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { + return; + } + auto centrality = collision.centFT0C(); + + auto qxZDCA = collision.qxZDCA(); + auto qxZDCC = collision.qxZDCC(); + auto qyZDCA = collision.qyZDCA(); + auto qyZDCC = collision.qyZDCC(); + + auto proQxtQxp = qxZDCA * qxZDCC; + auto proQytQyp = qyZDCA * qyZDCC; + auto proQxytp = proQxtQxp + proQytQyp; + auto proQxpQyt = qxZDCA * qyZDCC; + auto proQxtQyp = qxZDCC * qyZDCA; + + histos.fill(HIST("hpQxtQxpvscent"), centrality, proQxtQxp); + histos.fill(HIST("hpQytQypvscent"), centrality, proQytQyp); + histos.fill(HIST("hpQxytpvscent"), centrality, proQxytp); + histos.fill(HIST("hpQxpQytvscent"), centrality, proQxpQyt); + histos.fill(HIST("hpQxtQypvscent"), centrality, proQxtQyp); + + for (const auto& track1 : tracks) { + if (!selectionTrack(track1)) { + continue; + } + bool track1kaon = false; + auto track1ID = track1.globalIndex(); + if (!strategySelectionPID(track1, 0, strategyPID)) { + continue; + } + track1kaon = true; + for (const auto& track2 : tracks) { + if (!selectionTrack(track2)) { + continue; + } + bool track2pion = false; + auto track2ID = track2.globalIndex(); + if (!strategySelectionPID(track2, 1, strategyPID)) { + continue; + } + track2pion = true; + if (track2ID == track1ID) { + continue; + } + if (!track1kaon || !track2pion) { + continue; + } + daughter1 = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); + daughter2 = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massPi); + KstarMother = daughter1 + daughter2; + if (std::abs(KstarMother.Rapidity()) > 0.9) { + continue; + } + + // // constrain angle to 0 -> [0,0+2pi] + // auto phi = RecoDecay::constrainAngle(KstarMother.Phi(), 0,o2::constants::math::TwoPI); + + auto ux = std::cos(getPhiInRange(KstarMother.Phi())); + auto uy = std::sin(getPhiInRange(KstarMother.Phi())); + auto v1 = ux * (qxZDCA - qxZDCC) + uy * (qyZDCA - qyZDCC); + + // unlike sign + if (track1.sign() * track2.sign() < 0) { + histos.fill(HIST("hpv1vscentpteta"), KstarMother.M(), centrality, KstarMother.Pt(), KstarMother.Rapidity(), v1); + if (fillRotation) { + for (int nrotbkg = 0; nrotbkg < nBkgRotations; nrotbkg++) { + auto anglestart = confMinRot; + auto angleend = confMaxRot; + auto anglestep = (angleend - anglestart) / (1.0 * (nBkgRotations - 1)); + auto rotangle = anglestart + nrotbkg * anglestep; + auto rotkaonPx = track1.px() * std::cos(rotangle) - track1.py() * std::sin(rotangle); + auto rotkaonPy = track1.px() * std::sin(rotangle) + track1.py() * std::cos(rotangle); + kaonrot = ROOT::Math::PxPyPzMVector(rotkaonPx, rotkaonPy, track1.pz(), massKa); + kstarrot = kaonrot + daughter2; + + if (std::abs(kstarrot.Rapidity()) > 0.9) { + continue; + } + + auto uxrot = std::cos(getPhiInRange(KstarMother.Phi())); + auto uyrot = std::sin(getPhiInRange(KstarMother.Phi())); + + auto v1rot = uxrot * (qxZDCA - qxZDCC) + uyrot * (qyZDCA - qyZDCC); + + histos.fill(HIST("hpv1vscentptetarot"), kstarrot.M(), centrality, kstarrot.Pt(), kstarrot.Rapidity(), v1rot); + } + } + } + // like sign + if (track1.sign() * track2.sign() > 0) { + histos.fill(HIST("hpv1vscentptetalike"), kstarrot.M(), centrality, kstarrot.Pt(), kstarrot.Rapidity(), v1); + } + } + } + } + PROCESS_SWITCH(KstarFlowv1, processSE, "Process Same event", true); +}; +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} From da36c3334753912ee1c8752651bc95c4dbc7e2f2 Mon Sep 17 00:00:00 2001 From: Noor Koster <82090643+cnkoster@users.noreply.github.com> Date: Wed, 12 Feb 2025 23:44:00 +0100 Subject: [PATCH 0188/1650] [PWGCF] Added flags to minimize number of output histos for different settings (#9914) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/flowSP.cxx | 337 ++++++++++++++++++++---------------- 1 file changed, 185 insertions(+), 152 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowSP.cxx b/PWGCF/Flow/Tasks/flowSP.cxx index 952d8eb2137..7dbf51f9514 100644 --- a/PWGCF/Flow/Tasks/flowSP.cxx +++ b/PWGCF/Flow/Tasks/flowSP.cxx @@ -49,6 +49,11 @@ using namespace o2::framework::expressions; struct FlowSP { // QA Plots O2_DEFINE_CONFIGURABLE(cfgFillQAHistos, bool, true, "Fill histograms for event and track QA"); + // Flags to make and fill histograms + O2_DEFINE_CONFIGURABLE(cfgFillMixedHarmonics, bool, true, "Flag to make and fill histos for mixed harmonics"); + O2_DEFINE_CONFIGURABLE(cfgFillEventPlane, bool, true, "Flag to make and fill histos with Event Plane"); + O2_DEFINE_CONFIGURABLE(cfgFillXandYterms, bool, true, "Flag to make and fill histos for with separate x and y terms for SPM"); + O2_DEFINE_CONFIGURABLE(cfgFillChargeDependence, bool, true, "Flag to make and fill histos for charge dependent flow"); // Centrality Estimators -> standard is FT0C O2_DEFINE_CONFIGURABLE(cfgFT0Cvariant1, bool, false, "Set centrality estimator to cfgFT0Cvariant1"); O2_DEFINE_CONFIGURABLE(cfgFT0M, bool, false, "Set centrality estimator to cfgFT0M"); @@ -107,6 +112,13 @@ struct FlowSP { ConfigurableAxis axisVz = {"axisVz", {40, -10, 10}, "v_{z}"}; ConfigurableAxis axisCent = {"axisCent", {90, 0, 90}, "Centrality(%)"}; ConfigurableAxis axisPhiPlane = {"axisPhiPlane", {100, -constants::math::PI, constants::math::PI}, "#Psi"}; + ConfigurableAxis axisNch = {"axisNch", {400, 0, 4000}, "N_{ch}"}; + ConfigurableAxis axisT0c = {"axisT0c", {70, 0, 70000}, "N_{ch} (T0C)"}; + ConfigurableAxis axisT0a = {"axisT0a", {70, 0, 70000}, "N_{ch} (T0A)"}; + ConfigurableAxis axisV0a = {"axisV0a", {70, 0, 70000}, "N_{ch} (V0A)"}; + ConfigurableAxis axisMultpv = {"axisMultpv", {400, 0, 4000}, "N_{ch} (PV)"}; + ConfigurableAxis axisShCl = {"axisShCl", {200, 0, 1}, "Fraction shared cl. TPC"}; + ConfigurableAxis axisCl = {"axisCl", {160, 0, 160}, "Number of cl. TPC"}; Filter collisionFilter = nabs(aod::collision::posZ) < cfgVtxZ; Filter trackFilter = nabs(aod::track::eta) < cfgEta && aod::track::pt > cfgPtmin&& aod::track::pt < cfgPtmax && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && nabs(aod::track::dcaXY) < cfgDCAxy&& nabs(aod::track::dcaZ) < cfgDCAz; @@ -188,6 +200,7 @@ struct FlowSP { void init(InitContext const&) { + ccdb->setURL("http://alice-ccdb.cern.ch"); ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); @@ -197,12 +210,6 @@ struct FlowSP { std::vector ptbinning = {0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.2, 2.4, 2.6, 2.8, 3, 3.5, 4, 5, 6, 8, 10}; AxisSpec axisPt = {ptbinning, "#it{p}_{T} GeV/#it{c}"}; - AxisSpec nchAxis = {4000, 0, 4000, "N_{ch}"}; - AxisSpec t0cAxis = {70, 0, 70000, "N_{ch} (T0C)"}; - AxisSpec t0aAxis = {200, 0, 200, "N_{ch}"}; - AxisSpec multpvAxis = {4000, 0, 4000, "N_{ch} (PV)"}; - AxisSpec shclAxis = {200, 0, 1, "Fraction shared cl. TPC"}; - AxisSpec clAxis = {160, 0, 160, "Number of cl. TPC"}; int ptbins = ptbinning.size() - 1; @@ -224,82 +231,98 @@ struct FlowSP { registry.add("QA/after/hPt_inclusive", "", {HistType::kTH1D, {axisPt}}); registry.add("QA/after/hPt_positive", "", {HistType::kTH1D, {axisPt}}); registry.add("QA/after/hPt_negative", "", {HistType::kTH1D, {axisPt}}); - registry.add("QA/after/globalTracks_centT0C", "", {HistType::kTH2D, {axisCent, nchAxis}}); - registry.add("QA/after/PVTracks_centT0C", "", {HistType::kTH2D, {axisCent, multpvAxis}}); - registry.add("QA/after/globalTracks_PVTracks", "", {HistType::kTH2D, {multpvAxis, nchAxis}}); - registry.add("QA/after/globalTracks_multT0A", "", {HistType::kTH2D, {t0aAxis, nchAxis}}); - registry.add("QA/after/globalTracks_multV0A", "", {HistType::kTH2D, {t0aAxis, nchAxis}}); - registry.add("QA/after/multV0A_multT0A", "", {HistType::kTH2D, {t0aAxis, t0aAxis}}); - registry.add("QA/after/multT0C_centT0C", "", {HistType::kTH2D, {axisCent, t0cAxis}}); + registry.add("QA/after/globalTracks_centT0C", "", {HistType::kTH2D, {axisCent, axisNch}}); + registry.add("QA/after/PVTracks_centT0C", "", {HistType::kTH2D, {axisCent, axisMultpv}}); + registry.add("QA/after/globalTracks_PVTracks", "", {HistType::kTH2D, {axisMultpv, axisNch}}); + registry.add("QA/after/globalTracks_multT0A", "", {HistType::kTH2D, {axisT0a, axisNch}}); + registry.add("QA/after/globalTracks_multV0A", "", {HistType::kTH2D, {axisV0a, axisNch}}); + registry.add("QA/after/multV0A_multT0A", "", {HistType::kTH2D, {axisT0a, axisV0a}}); + registry.add("QA/after/multT0C_centT0C", "", {HistType::kTH2D, {axisCent, axisT0c}}); + + registry.add("QA/after/CentFT0C_vs_CentFT0Cvariant1", " ; Cent FT0C (%); Cent FT0Cvariant1 (%) ", {HistType::kTH2D, {axisCent, axisCent}}); + registry.add("QA/after/CentFT0C_vs_CentFT0M", " ; Cent FT0C (%); Cent FT0M (%) ", {HistType::kTH2D, {axisCent, axisCent}}); + registry.add("QA/after/CentFT0C_vs_CentFV0A", " ; Cent FT0C (%); Cent FV0A (%) ", {HistType::kTH2D, {axisCent, axisCent}}); + registry.add("QA/after/CentFT0C_vs_CentNGlobal", " ; Cent FT0C (%); Cent NGlobal (%) ", {HistType::kTH2D, {axisCent, axisCent}}); } if (doprocessData) { - registry.add("hSPplaneA", "hSPplaneA", kTH1D, {axisPhiPlane}); - registry.add("hSPplaneC", "hSPplaneC", kTH1D, {axisPhiPlane}); - registry.add("hSPplaneFull", "hSPplaneFull", kTH1D, {axisPhiPlane}); - - registry.add("hCosPhiACosPhiC", "hCosPhiACosPhiC; Centrality(%); #LT Cos(#Psi^{A})Cos(#Psi^{C})#GT", kTProfile, {axisCent}); - registry.add("hSinPhiASinPhiC", "hSinPhiASinPhiC; Centrality(%); #LT Sin(#Psi^{A})Sin(#Psi^{C})#GT", kTProfile, {axisCent}); - registry.add("hSinPhiACosPhiC", "hSinPhiACosPhiC; Centrality(%); #LT Sin(#Psi^{A})Cos(#Psi^{C})#GT", kTProfile, {axisCent}); - registry.add("hCosPhiASinsPhiC", "hCosPhiASinsPhiC; Centrality(%); #LT Cos(#Psi^{A})Sin(#Psi^{C})#GT", kTProfile, {axisCent}); - registry.add("hFullEvPlaneRes", "hFullEvPlaneRes; Centrality(%); -#LT Cos(#Psi^{A} - #Psi^{C})#GT ", kTProfile, {axisCent}); // track properties per centrality and per eta, pt bin - registry.add("incl/vnAx_eta", "", kTProfile, {axisEtaVn}); - registry.add("incl/vnAy_eta", "", kTProfile, {axisEtaVn}); - registry.add("incl/vnCx_eta", "", kTProfile, {axisEtaVn}); - registry.add("incl/vnCy_eta", "", kTProfile, {axisEtaVn}); registry.add("incl/vnC_eta", "", kTProfile, {axisEtaVn}); registry.add("incl/vnA_eta", "", kTProfile, {axisEtaVn}); - registry.add("incl/vnA_eta_EP", "", kTProfile, {axisEtaVn}); - registry.add("incl/vnC_eta_EP", "", kTProfile, {axisEtaVn}); - registry.add("incl/vnFull_eta_EP", "", kTProfile, {axisEtaVn}); - registry.add("incl/vnAxCxUx_eta_MH", "", kTProfile, {axisEtaVn}); - registry.add("incl/vnAxCyUx_eta_MH", "", kTProfile, {axisEtaVn}); - registry.add("incl/vnAxCyUy_eta_MH", "", kTProfile, {axisEtaVn}); - registry.add("incl/vnAyCxUy_eta_MH", "", kTProfile, {axisEtaVn}); - - registry.add("incl/vnAx_pt", "", kTProfile, {axisPt}); - registry.add("incl/vnAy_pt", "", kTProfile, {axisPt}); - registry.add("incl/vnCx_pt", "", kTProfile, {axisPt}); - registry.add("incl/vnCy_pt", "", kTProfile, {axisPt}); + registry.add("incl/vnC_pt", "", kTProfile, {axisPt}); registry.add("incl/vnA_pt", "", kTProfile, {axisPt}); registry.add("incl/vnC_pt_odd", "", kTProfile, {axisPt}); registry.add("incl/vnA_pt_odd", "", kTProfile, {axisPt}); - registry.add("incl/vnCx_pt_odd", "", kTProfile, {axisPt}); - registry.add("incl/vnAx_pt_odd", "", kTProfile, {axisPt}); - registry.add("incl/vnCy_pt_odd", "", kTProfile, {axisPt}); - registry.add("incl/vnAy_pt_odd", "", kTProfile, {axisPt}); - - registry.add("incl/vnA_pt_EP", "", kTProfile, {axisPt}); - registry.add("incl/vnC_pt_EP", "", kTProfile, {axisPt}); - registry.add("incl/vnFull_pt_EP", "", kTProfile, {axisPt}); - registry.add("incl/vnAxCxUx_pt_MH", "", kTProfile, {axisPt}); - registry.add("incl/vnAxCyUx_pt_MH", "", kTProfile, {axisPt}); - registry.add("incl/vnAxCyUy_pt_MH", "", kTProfile, {axisPt}); - registry.add("incl/vnAyCxUy_pt_MH", "", kTProfile, {axisPt}); registry.add("incl/vnC_cent_minEta", "", kTProfile, {axisCent}); registry.add("incl/vnA_cent_minEta", "", kTProfile, {axisCent}); registry.add("incl/vnC_cent_plusEta", "", kTProfile, {axisCent}); registry.add("incl/vnA_cent_plusEta", "", kTProfile, {axisCent}); - registry.add("incl/vnA_cent_EP", "", kTProfile, {axisCent}); - registry.add("incl/vnC_cent_EP", "", kTProfile, {axisCent}); - registry.add("incl/vnFull_cent_EP", "", kTProfile, {axisCent}); - registry.add("incl/vnAxCxUx_cent_MH", "", kTProfile, {axisCent}); - registry.add("incl/vnAxCyUx_cent_MH", "", kTProfile, {axisCent}); - registry.add("incl/vnAxCyUy_cent_MH", "", kTProfile, {axisCent}); - registry.add("incl/vnAyCxUy_cent_MH", "", kTProfile, {axisCent}); - - registry.add("qAqCX", "", kTProfile, {axisCent}); - registry.add("qAqCY", "", kTProfile, {axisCent}); - registry.add("qAqCXY", "", kTProfile, {axisCent}); - registry.add("qAXqCY", "", kTProfile, {axisCent}); - registry.add("qAYqCX", "", kTProfile, {axisCent}); - registry.add("qAXYqCXY", "", kTProfile, {axisCent}); + + if (cfgFillXandYterms) { + registry.add("incl/vnAx_eta", "", kTProfile, {axisEtaVn}); + registry.add("incl/vnAy_eta", "", kTProfile, {axisEtaVn}); + registry.add("incl/vnCx_eta", "", kTProfile, {axisEtaVn}); + registry.add("incl/vnCy_eta", "", kTProfile, {axisEtaVn}); + registry.add("incl/vnAx_pt", "", kTProfile, {axisPt}); + registry.add("incl/vnAy_pt", "", kTProfile, {axisPt}); + registry.add("incl/vnCx_pt", "", kTProfile, {axisPt}); + registry.add("incl/vnCy_pt", "", kTProfile, {axisPt}); + registry.add("incl/vnCx_pt_odd", "", kTProfile, {axisPt}); + registry.add("incl/vnAx_pt_odd", "", kTProfile, {axisPt}); + registry.add("incl/vnCy_pt_odd", "", kTProfile, {axisPt}); + registry.add("incl/vnAy_pt_odd", "", kTProfile, {axisPt}); + } + + if (cfgFillMixedHarmonics) { + registry.add("incl/vnAxCxUx_pt_MH", "", kTProfile, {axisPt}); + registry.add("incl/vnAxCyUx_pt_MH", "", kTProfile, {axisPt}); + registry.add("incl/vnAxCyUy_pt_MH", "", kTProfile, {axisPt}); + registry.add("incl/vnAyCxUy_pt_MH", "", kTProfile, {axisPt}); + + registry.add("incl/vnAxCxUx_cent_MH", "", kTProfile, {axisCent}); + registry.add("incl/vnAxCyUx_cent_MH", "", kTProfile, {axisCent}); + registry.add("incl/vnAxCyUy_cent_MH", "", kTProfile, {axisCent}); + registry.add("incl/vnAyCxUy_cent_MH", "", kTProfile, {axisCent}); + + registry.add("incl/vnAxCxUx_eta_MH", "", kTProfile, {axisEtaVn}); + registry.add("incl/vnAxCyUx_eta_MH", "", kTProfile, {axisEtaVn}); + registry.add("incl/vnAxCyUy_eta_MH", "", kTProfile, {axisEtaVn}); + registry.add("incl/vnAyCxUy_eta_MH", "", kTProfile, {axisEtaVn}); + } + + if (cfgFillEventPlane) { + registry.add("incl/vnA_cent_EP", "", kTProfile, {axisCent}); + registry.add("incl/vnC_cent_EP", "", kTProfile, {axisCent}); + registry.add("incl/vnFull_cent_EP", "", kTProfile, {axisCent}); + registry.add("incl/vnA_pt_EP", "", kTProfile, {axisPt}); + registry.add("incl/vnC_pt_EP", "", kTProfile, {axisPt}); + registry.add("incl/vnFull_pt_EP", "", kTProfile, {axisPt}); + registry.add("incl/vnA_eta_EP", "", kTProfile, {axisEtaVn}); + registry.add("incl/vnC_eta_EP", "", kTProfile, {axisEtaVn}); + registry.add("incl/vnFull_eta_EP", "", kTProfile, {axisEtaVn}); + } if (cfgFillQAHistos) { + registry.add("QA/qAqCX", "", kTProfile, {axisCent}); + registry.add("QA/qAqCY", "", kTProfile, {axisCent}); + registry.add("QA/qAqCXY", "", kTProfile, {axisCent}); + registry.add("QA/qAXqCY", "", kTProfile, {axisCent}); + registry.add("QA/qAYqCX", "", kTProfile, {axisCent}); + registry.add("QA/qAXYqCXY", "", kTProfile, {axisCent}); + + registry.add("QA/hSPplaneA", "hSPplaneA", kTH1D, {axisPhiPlane}); + registry.add("QA/hSPplaneC", "hSPplaneC", kTH1D, {axisPhiPlane}); + registry.add("QA/hSPplaneFull", "hSPplaneFull", kTH1D, {axisPhiPlane}); + + registry.add("QA/hCosPhiACosPhiC", "hCosPhiACosPhiC; Centrality(%); #LT Cos(#Psi^{A})Cos(#Psi^{C})#GT", kTProfile, {axisCent}); + registry.add("QA/hSinPhiASinPhiC", "hSinPhiASinPhiC; Centrality(%); #LT Sin(#Psi^{A})Sin(#Psi^{C})#GT", kTProfile, {axisCent}); + registry.add("QA/hSinPhiACosPhiC", "hSinPhiACosPhiC; Centrality(%); #LT Sin(#Psi^{A})Cos(#Psi^{C})#GT", kTProfile, {axisCent}); + registry.add("QA/hCosPhiASinsPhiC", "hCosPhiASinsPhiC; Centrality(%); #LT Cos(#Psi^{A})Sin(#Psi^{C})#GT", kTProfile, {axisCent}); + registry.add("QA/hFullEvPlaneRes", "hFullEvPlaneRes; Centrality(%); -#LT Cos(#Psi^{A} - #Psi^{C})#GT ", kTProfile, {axisCent}); + registry.add("QA/after/PsiA_vs_Cent", "", {HistType::kTH2D, {axisPhiPlane, axisCent}}); registry.add("QA/after/PsiC_vs_Cent", "", {HistType::kTH2D, {axisPhiPlane, axisCent}}); registry.add("QA/after/PsiFull_vs_Cent", "", {HistType::kTH2D, {axisPhiPlane, axisCent}}); @@ -316,26 +339,24 @@ struct FlowSP { registry.add("QA/after/PsiC_vs_Vz", "", {HistType::kTH2D, {axisPhiPlane, axisVz}}); registry.add("QA/after/PsiFull_vs_Vz", "", {HistType::kTH2D, {axisPhiPlane, axisVz}}); - registry.add("QA/after/CentFT0C_vs_CentFT0Cvariant1", "", {HistType::kTH2D, {axisCent, axisCent}}); - registry.add("QA/after/CentFT0C_vs_CentFT0M", "", {HistType::kTH2D, {axisCent, axisCent}}); - registry.add("QA/after/CentFT0C_vs_CentFV0A", "", {HistType::kTH2D, {axisCent, axisCent}}); - // registry.add("QA/after/CentFT0C_vs_CentNGlobal", "", {HistType::kTH2D, {axisCent, axisCent}}; + registry.addClone("QA/after/", "QA/before/"); + // track QA for pos, neg, incl + registry.add("incl/QA/hPt", "", kTH1D, {axisPt}); + registry.add("incl/QA/hPhi", "", kTH1D, {axisPhi}); + registry.add("incl/QA/hPhiCorrected", "", kTH1D, {axisPhi}); + registry.add("incl/QA/hEta", "", kTH1D, {axisEta}); + registry.add("incl/QA/hPhi_Eta_vz", "", kTH3D, {axisPhi, axisEta, axisVz}); + registry.add("incl/QA/hDCAxy_pt", "", kTH2D, {axisPt, axisDCAxy}); + registry.add("incl/QA/hDCAz_pt", "", kTH2D, {axisPt, axisDCAz}); + registry.add("incl/QA/hSharedClusters_pt", "", {HistType::kTH2D, {axisPt, axisShCl}}); + registry.add("incl/QA/hCrossedRows_pt", "", {HistType::kTH2D, {axisPt, axisCl}}); } } - registry.addClone("QA/after/", "QA/before/"); - // track QA for pos, neg, incl - registry.add("incl/QA/hPt", "", kTH1D, {axisPt}); - registry.add("incl/QA/hPhi", "", kTH1D, {axisPhi}); - registry.add("incl/QA/hPhiCorrected", "", kTH1D, {axisPhi}); - registry.add("incl/QA/hEta", "", kTH1D, {axisEta}); - registry.add("incl/QA/hPhi_Eta_vz", "", kTH3D, {axisPhi, axisEta, axisVz}); - registry.add("incl/QA/hDCAxy_pt", "", kTH2D, {axisPt, axisDCAxy}); - registry.add("incl/QA/hDCAz_pt", "", kTH2D, {axisPt, axisDCAz}); - registry.add("incl/QA/hSharedClusters_pt", "", {HistType::kTH2D, {axisPt, shclAxis}}); - registry.add("incl/QA/hCrossedRows_pt", "", {HistType::kTH2D, {axisPt, clAxis}}); - - registry.addClone("incl/", "pos/"); - registry.addClone("incl/", "neg/"); + + if (cfgFillChargeDependence) { + registry.addClone("incl/", "pos/"); + registry.addClone("incl/", "neg/"); + } } else if (doprocessMCGen) { registry.add("trackMCGen/before/pt_gen_incl", "", {HistType::kTH1D, {axisPt}}); registry.add("trackMCGen/before/phi_eta_vtxZ_gen", "", {HistType::kTH3D, {axisPhi, axisEta, axisVz}}); @@ -625,7 +646,7 @@ struct FlowSP { registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/CentFT0C_vs_CentFT0Cvariant1"), collision.centFT0C(), collision.centFT0CVariant1()); registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/CentFT0C_vs_CentFT0M"), collision.centFT0C(), collision.centFT0M()); registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/CentFT0C_vs_CentFV0A"), collision.centFT0C(), collision.centFV0A()); - // registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/CentFT0C_vs_CentNGlobal"), collision.centFT0C(), collision.centNGlobal()); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/CentFT0C_vs_CentNGlobal"), collision.centFT0C(), collision.centNGlobal()); double psiA = 1.0 * std::atan2(collision.qyA(), collision.qxA()); double psiC = 1.0 * std::atan2(collision.qyC(), collision.qxC()); @@ -650,37 +671,55 @@ struct FlowSP { template inline void fillHistograms(TrackObject track, float wacc, float weff, double ux, double uy, double uxMH, double uyMH, double qxA, double qyA, double qxC, double qyC, double corrQQx, double corrQQy, double corrQQ, double vnA, double vnC, double vnFull, double centrality) { - registry.fill(HIST(Charge[ct]) + HIST("vnAx_eta"), track.eta(), (ux * qxA) / std::sqrt(std::fabs(corrQQx)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAy_eta"), track.eta(), (uy * qyA) / std::sqrt(std::fabs(corrQQy)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnCx_eta"), track.eta(), (ux * qxC) / std::sqrt(std::fabs(corrQQx)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnCy_eta"), track.eta(), (uy * qyC) / std::sqrt(std::fabs(corrQQy)), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnA_eta"), track.eta(), (uy * qyA + ux * qxA) / std::sqrt(std::fabs(corrQQ)), wacc * weff); registry.fill(HIST(Charge[ct]) + HIST("vnC_eta"), track.eta(), (uy * qyC + ux * qxC) / std::sqrt(std::fabs(corrQQ)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAxCxUx_eta_MH"), track.eta(), (uxMH * qxA * qxC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUx_eta_MH"), track.eta(), (uxMH * qyA * qyC) / corrQQy, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUy_eta_MH"), track.eta(), (uyMH * qxA * qyC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAyCxUy_eta_MH"), track.eta(), (uyMH * qyA * qxC) / corrQQy, wacc * weff); - - registry.fill(HIST(Charge[ct]) + HIST("vnAx_pt"), track.pt(), (ux * qxA) / std::sqrt(std::fabs(corrQQx)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAy_pt"), track.pt(), (uy * qyA) / std::sqrt(std::fabs(corrQQy)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnCx_pt"), track.pt(), (ux * qxC) / std::sqrt(std::fabs(corrQQx)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnCy_pt"), track.pt(), (uy * qyC) / std::sqrt(std::fabs(corrQQy)), wacc * weff); registry.fill(HIST(Charge[ct]) + HIST("vnA_pt"), track.pt(), (uy * qyA + ux * qxA) / std::sqrt(std::fabs(corrQQ)), wacc * weff); registry.fill(HIST(Charge[ct]) + HIST("vnC_pt"), track.pt(), (uy * qyC + ux * qxC) / std::sqrt(std::fabs(corrQQ)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAxCxUx_pt_MH"), track.pt(), (uxMH * qxA * qxC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUx_pt_MH"), track.pt(), (uxMH * qyA * qyC) / corrQQy, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUy_pt_MH"), track.pt(), (uyMH * qxA * qyC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAyCxUy_pt_MH"), track.pt(), (uyMH * qyA * qxC) / corrQQy, wacc * weff); + if (cfgFillMixedHarmonics) { + registry.fill(HIST(Charge[ct]) + HIST("vnAxCxUx_eta_MH"), track.eta(), (uxMH * qxA * qxC) / corrQQx, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUx_eta_MH"), track.eta(), (uxMH * qyA * qyC) / corrQQy, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUy_eta_MH"), track.eta(), (uyMH * qxA * qyC) / corrQQx, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnAyCxUy_eta_MH"), track.eta(), (uyMH * qyA * qxC) / corrQQy, wacc * weff); + + registry.fill(HIST(Charge[ct]) + HIST("vnAxCxUx_pt_MH"), track.pt(), (uxMH * qxA * qxC) / corrQQx, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUx_pt_MH"), track.pt(), (uxMH * qyA * qyC) / corrQQy, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUy_pt_MH"), track.pt(), (uyMH * qxA * qyC) / corrQQx, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnAyCxUy_pt_MH"), track.pt(), (uyMH * qyA * qxC) / corrQQy, wacc * weff); + + registry.fill(HIST(Charge[ct]) + HIST("vnAxCxUx_cent_MH"), centrality, (uxMH * qxA * qxC) / corrQQx, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUx_cent_MH"), centrality, (uxMH * qyA * qyC) / corrQQy, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUy_cent_MH"), centrality, (uyMH * qxA * qyC) / corrQQx, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnAyCxUy_cent_MH"), centrality, (uyMH * qyA * qxC) / corrQQy, wacc * weff); + } - registry.fill(HIST(Charge[ct]) + HIST("vnA_eta_EP"), track.eta(), vnA, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnC_eta_EP"), track.eta(), vnC, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnFull_eta_EP"), track.eta(), vnFull, wacc * weff); + if (cfgFillXandYterms) { + registry.fill(HIST(Charge[ct]) + HIST("vnAx_eta"), track.eta(), (ux * qxA) / std::sqrt(std::fabs(corrQQx)), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnAy_eta"), track.eta(), (uy * qyA) / std::sqrt(std::fabs(corrQQy)), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnCx_eta"), track.eta(), (ux * qxC) / std::sqrt(std::fabs(corrQQx)), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnCy_eta"), track.eta(), (uy * qyC) / std::sqrt(std::fabs(corrQQy)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnA_pt_EP"), track.pt(), vnA, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnC_pt_EP"), track.pt(), vnC, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnFull_pt_EP"), track.pt(), vnFull, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnAx_pt"), track.pt(), (ux * qxA) / std::sqrt(std::fabs(corrQQx)), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnAy_pt"), track.pt(), (uy * qyA) / std::sqrt(std::fabs(corrQQy)), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnCx_pt"), track.pt(), (ux * qxC) / std::sqrt(std::fabs(corrQQx)), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnCy_pt"), track.pt(), (uy * qyC) / std::sqrt(std::fabs(corrQQy)), wacc * weff); + } + + if (cfgFillEventPlane) { + registry.fill(HIST(Charge[ct]) + HIST("vnA_eta_EP"), track.eta(), vnA, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnC_eta_EP"), track.eta(), vnC, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnFull_eta_EP"), track.eta(), vnFull, wacc * weff); + + registry.fill(HIST(Charge[ct]) + HIST("vnA_pt_EP"), track.pt(), vnA, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnC_pt_EP"), track.pt(), vnC, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnFull_pt_EP"), track.pt(), vnFull, wacc * weff); + + registry.fill(HIST(Charge[ct]) + HIST("vnA_cent_EP"), centrality, vnA, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnC_cent_EP"), centrality, vnC, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnFull_cent_EP"), centrality, vnFull, wacc * weff); + } // For integrated v1 take only tracks from eta>0. // Following https://arxiv.org/pdf/1306.4145 @@ -691,11 +730,12 @@ struct FlowSP { registry.fill(HIST(Charge[ct]) + HIST("vnA_pt_odd"), track.pt(), -1.0 * (uy * qyA + ux * qxA) / std::sqrt(std::fabs(corrQQ)), wacc * weff); registry.fill(HIST(Charge[ct]) + HIST("vnC_pt_odd"), track.pt(), -1.0 * (uy * qyC + ux * qxC) / std::sqrt(std::fabs(corrQQ)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAx_pt_odd"), track.pt(), -1.0 * (ux * qxA) / std::sqrt(std::fabs(corrQQx)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAy_pt_odd"), track.pt(), -1.0 * (uy * qyA) / std::sqrt(std::fabs(corrQQy)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnCx_pt_odd"), track.pt(), -1.0 * (ux * qxC) / std::sqrt(std::fabs(corrQQx)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnCy_pt_odd"), track.pt(), -1.0 * (uy * qyC) / std::sqrt(std::fabs(corrQQy)), wacc * weff); - + if (cfgFillXandYterms) { + registry.fill(HIST(Charge[ct]) + HIST("vnAx_pt_odd"), track.pt(), -1.0 * (ux * qxA) / std::sqrt(std::fabs(corrQQx)), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnAy_pt_odd"), track.pt(), -1.0 * (uy * qyA) / std::sqrt(std::fabs(corrQQy)), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnCx_pt_odd"), track.pt(), -1.0 * (ux * qxC) / std::sqrt(std::fabs(corrQQx)), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnCy_pt_odd"), track.pt(), -1.0 * (uy * qyC) / std::sqrt(std::fabs(corrQQy)), wacc * weff); + } } else { registry.fill(HIST(Charge[ct]) + HIST("vnA_cent_plusEta"), centrality, (uy * qyA + ux * qxA) / std::sqrt(std::fabs(corrQQ)), wacc * weff); registry.fill(HIST(Charge[ct]) + HIST("vnC_cent_plusEta"), centrality, (uy * qyC + ux * qxC) / std::sqrt(std::fabs(corrQQ)), wacc * weff); @@ -703,20 +743,13 @@ struct FlowSP { registry.fill(HIST(Charge[ct]) + HIST("vnA_pt_odd"), track.pt(), (uy * qyA + ux * qxA) / std::sqrt(std::fabs(corrQQ)), wacc * weff); registry.fill(HIST(Charge[ct]) + HIST("vnC_pt_odd"), track.pt(), (uy * qyC + ux * qxC) / std::sqrt(std::fabs(corrQQ)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAx_pt_odd"), track.pt(), (ux * qxA) / std::sqrt(std::fabs(corrQQx)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAy_pt_odd"), track.pt(), (uy * qyA) / std::sqrt(std::fabs(corrQQy)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnCx_pt_odd"), track.pt(), (ux * qxC) / std::sqrt(std::fabs(corrQQx)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnCy_pt_odd"), track.pt(), (uy * qyC) / std::sqrt(std::fabs(corrQQy)), wacc * weff); + if (cfgFillXandYterms) { + registry.fill(HIST(Charge[ct]) + HIST("vnAx_pt_odd"), track.pt(), (ux * qxA) / std::sqrt(std::fabs(corrQQx)), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnAy_pt_odd"), track.pt(), (uy * qyA) / std::sqrt(std::fabs(corrQQy)), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnCx_pt_odd"), track.pt(), (ux * qxC) / std::sqrt(std::fabs(corrQQx)), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnCy_pt_odd"), track.pt(), (uy * qyC) / std::sqrt(std::fabs(corrQQy)), wacc * weff); + } } - - registry.fill(HIST(Charge[ct]) + HIST("vnAxCxUx_cent_MH"), centrality, (uxMH * qxA * qxC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUx_cent_MH"), centrality, (uxMH * qyA * qyC) / corrQQy, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUy_cent_MH"), centrality, (uyMH * qxA * qyC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAyCxUy_cent_MH"), centrality, (uyMH * qyA * qxC) / corrQQy, wacc * weff); - - registry.fill(HIST(Charge[ct]) + HIST("vnA_cent_EP"), centrality, vnA, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnC_cent_EP"), centrality, vnC, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnFull_cent_EP"), centrality, vnFull, wacc * weff); } template @@ -773,35 +806,30 @@ struct FlowSP { double qyC = collision.qyC(); double vtxz = collision.posZ(); - double psiA = 1.0 * std::atan2(qyA, qxA); - registry.fill(HIST("hSPplaneA"), psiA, 1); - double psiC = 1.0 * std::atan2(qyC, qxC); - registry.fill(HIST("hSPplaneC"), psiC, 1); // https://twiki.cern.ch/twiki/pub/ALICE/DirectedFlowAnalysisNote/vn_ZDC_ALICE_INT_NOTE_version02.pdf double psiFull = 1.0 * std::atan2(qyA + qyC, qxA + qxC); - registry.fill(HIST("hSPplaneFull"), psiFull, 1); - if (cfgFillQAHistos) + if (cfgFillQAHistos) { fillEventQA(collision, tracks); - registry.fill(HIST("hCosPhiACosPhiC"), centrality, std::cos(psiA) * std::cos(psiC)); - registry.fill(HIST("hSinPhiASinPhiC"), centrality, std::sin(psiA) * std::sin(psiC)); - registry.fill(HIST("hSinPhiACosPhiC"), centrality, std::sin(psiA) * std::cos(psiC)); - registry.fill(HIST("hCosPhiASinsPhiC"), centrality, std::cos(psiA) * std::sin(psiC)); - - registry.fill(HIST("hFullEvPlaneRes"), centrality, -1 * std::cos(psiA - psiC)); - - registry.fill(HIST("qAqCXY"), centrality, qxA * qxC + qyA * qyC); - - registry.fill(HIST("qAXqCY"), centrality, qxA * qyC); - registry.fill(HIST("qAYqCX"), centrality, qyA * qxC); - registry.fill(HIST("qAXYqCXY"), centrality, qyA * qxC + qxA * qyC); - - registry.fill(HIST("qAqCX"), centrality, qxA * qxC); - registry.fill(HIST("qAqCY"), centrality, qyA * qyC); + registry.fill(HIST("QA/hSPplaneA"), psiA, 1); + registry.fill(HIST("QA/hSPplaneC"), psiC, 1); + registry.fill(HIST("QA/hSPplaneFull"), psiFull, 1); + registry.fill(HIST("QA/hCosPhiACosPhiC"), centrality, std::cos(psiA) * std::cos(psiC)); + registry.fill(HIST("QA/hSinPhiASinPhiC"), centrality, std::sin(psiA) * std::sin(psiC)); + registry.fill(HIST("QA/hSinPhiACosPhiC"), centrality, std::sin(psiA) * std::cos(psiC)); + registry.fill(HIST("QA/hCosPhiASinsPhiC"), centrality, std::cos(psiA) * std::sin(psiC)); + registry.fill(HIST("QA/hFullEvPlaneRes"), centrality, -1 * std::cos(psiA - psiC)); + registry.fill(HIST("QA/qAqCXY"), centrality, qxA * qxC + qyA * qyC); + registry.fill(HIST("QA/qAXqCY"), centrality, qxA * qyC); + registry.fill(HIST("QA/qAYqCX"), centrality, qyA * qxC); + registry.fill(HIST("QA/qAXYqCXY"), centrality, qyA * qxC + qxA * qyC); + registry.fill(HIST("QA/qAqCX"), centrality, qxA * qxC); + registry.fill(HIST("QA/qAqCY"), centrality, qyA * qyC); + } double corrQQ = 1., corrQQx = 1., corrQQy = 1.; @@ -892,13 +920,18 @@ struct FlowSP { double vnFull = std::cos(cfgHarm * (phi - psiFull)) / evPlaneRes; fillHistograms(track, wacc, weff, ux, uy, uxMH, uyMH, qxA, qyA, qxC, qyC, corrQQx, corrQQy, corrQQ, vnA, vnC, vnFull, centrality); - fillTrackQA(track, vtxz, wacc, weff); - if (pos) { - fillHistograms(track, waccP, weffP, ux, uy, uxMH, uyMH, qxA, qyA, qxC, qyC, corrQQx, corrQQy, corrQQ, vnA, vnC, vnFull, centrality); - fillTrackQA(track, vtxz, wacc, weff); - } else { - fillHistograms(track, waccN, weffN, ux, uy, uxMH, uyMH, qxA, qyA, qxC, qyC, corrQQx, corrQQy, corrQQ, vnA, vnC, vnFull, centrality); - fillTrackQA(track, vtxz, wacc, weff); + + if (cfgFillQAHistos) + fillTrackQA(track, vtxz, wacc, weff); + + if (cfgFillChargeDependence) { + if (pos) { + fillHistograms(track, waccP, weffP, ux, uy, uxMH, uyMH, qxA, qyA, qxC, qyC, corrQQx, corrQQy, corrQQ, vnA, vnC, vnFull, centrality); + fillTrackQA(track, vtxz, wacc, weff); + } else { + fillHistograms(track, waccN, weffN, ux, uy, uxMH, uyMH, qxA, qyA, qxC, qyC, corrQQx, corrQQy, corrQQ, vnA, vnC, vnFull, centrality); + fillTrackQA(track, vtxz, wacc, weff); + } } } // end of track loop } // end of collision isSelected loop From 667aa815cb8fdd11feb8bcf43195ef02ad4cec5d Mon Sep 17 00:00:00 2001 From: Fabio Catalano Date: Thu, 13 Feb 2025 01:08:57 +0100 Subject: [PATCH 0189/1650] [PWGHF] Cleanup table filling in D0 tree creator (#9919) --- PWGHF/TableProducer/treeCreatorD0ToKPi.cxx | 44 +++++++++------------- 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/PWGHF/TableProducer/treeCreatorD0ToKPi.cxx b/PWGHF/TableProducer/treeCreatorD0ToKPi.cxx index 93f632378fa..233b1055ea6 100644 --- a/PWGHF/TableProducer/treeCreatorD0ToKPi.cxx +++ b/PWGHF/TableProducer/treeCreatorD0ToKPi.cxx @@ -17,8 +17,6 @@ /// \author Nicolo' Jacazio , CERN /// \author Andrea Tavira García , IJCLab -#include - #include "CommonConstants/PhysicsConstants.h" #include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" @@ -276,8 +274,8 @@ struct HfTreeCreatorD0ToKPi { } template - auto fillTable(const T& candidate, int candFlag, double invMass, double cosThetaStar, double topoChi2, - double ct, double y, double e, int8_t flagMc, int8_t origin, std::vector const& mlProbD0) + auto fillTable(const T& candidate, int candFlag, double invMass, double topoChi2, + double ct, double y, double e, int8_t flagMc, int8_t origin) { if (fillCandidateLiteTable) { rowCandidateLite( @@ -317,6 +315,7 @@ struct HfTreeCreatorD0ToKPi { flagMc, origin); } else { + double cosThetaStar = candFlag == 0 ? hfHelper.cosThetaStarD0(candidate) : hfHelper.cosThetaStarD0bar(candidate); rowCandidateFull( candidate.collisionId(), candidate.posX(), @@ -381,10 +380,17 @@ struct HfTreeCreatorD0ToKPi { candidate.globalIndex()); } if constexpr (applyMl) { - rowCandidateMl( - mlProbD0[0], - mlProbD0[1], - mlProbD0[2]); + if (candFlag == 0) { + rowCandidateMl( + candidate.mlProbD0()[0], + candidate.mlProbD0()[1], + candidate.mlProbD0()[2]); + } else if (candFlag == 1) { + rowCandidateMl( + candidate.mlProbD0bar()[0], + candidate.mlProbD0bar()[1], + candidate.mlProbD0bar()[2]); + } } } @@ -419,7 +425,6 @@ struct HfTreeCreatorD0ToKPi { double eD = hfHelper.eD0(candidate); double ctD = hfHelper.ctD0(candidate); float massD0, massD0bar; - std::vector mlProbD0, mlProbD0bar; float topolChi2PerNdf = -999.; if constexpr (reconstructionType == aod::hf_cand::VertexerType::KfParticle) { massD0 = candidate.kfGeoMassD0(); @@ -430,16 +435,10 @@ struct HfTreeCreatorD0ToKPi { massD0bar = hfHelper.invMassD0barToKPi(candidate); } if (candidate.isSelD0()) { - if constexpr (applyMl) { - mlProbD0 = std::vector(candidate.mlProbD0().begin(), candidate.mlProbD0().end()); - } - fillTable(candidate, 0, massD0, hfHelper.cosThetaStarD0(candidate), topolChi2PerNdf, ctD, yD, eD, 0, 0, mlProbD0); + fillTable(candidate, 0, massD0, topolChi2PerNdf, ctD, yD, eD, 0, 0); } if (candidate.isSelD0bar()) { - if constexpr (applyMl) { - mlProbD0bar = std::vector(candidate.mlProbD0bar().begin(), candidate.mlProbD0bar().end()); - } - fillTable(candidate, 1, massD0bar, hfHelper.cosThetaStarD0bar(candidate), topolChi2PerNdf, ctD, yD, eD, 0, 0, mlProbD0bar); + fillTable(candidate, 1, massD0bar, topolChi2PerNdf, ctD, yD, eD, 0, 0); } } } @@ -525,7 +524,6 @@ struct HfTreeCreatorD0ToKPi { double ctD = hfHelper.ctD0(candidate); float massD0, massD0bar; float topolChi2PerNdf = -999.; - std::vector mlProbD0, mlProbD0bar; if constexpr (reconstructionType == aod::hf_cand::VertexerType::KfParticle) { massD0 = candidate.kfGeoMassD0(); massD0bar = candidate.kfGeoMassD0bar(); @@ -535,16 +533,10 @@ struct HfTreeCreatorD0ToKPi { massD0bar = hfHelper.invMassD0barToKPi(candidate); } if (candidate.isSelD0()) { - if constexpr (applyMl) { - mlProbD0 = std::vector(candidate.mlProbD0().begin(), candidate.mlProbD0().end()); - } - fillTable(candidate, 0, massD0, hfHelper.cosThetaStarD0(candidate), topolChi2PerNdf, ctD, yD, eD, candidate.flagMcMatchRec(), candidate.originMcRec(), mlProbD0); + fillTable(candidate, 0, massD0, topolChi2PerNdf, ctD, yD, eD, candidate.flagMcMatchRec(), candidate.originMcRec()); } if (candidate.isSelD0bar()) { - if constexpr (applyMl) { - mlProbD0bar = std::vector(candidate.mlProbD0bar().begin(), candidate.mlProbD0bar().end()); - } - fillTable(candidate, 1, massD0bar, hfHelper.cosThetaStarD0bar(candidate), topolChi2PerNdf, ctD, yD, eD, candidate.flagMcMatchRec(), candidate.originMcRec(), mlProbD0bar); + fillTable(candidate, 1, massD0bar, topolChi2PerNdf, ctD, yD, eD, candidate.flagMcMatchRec(), candidate.originMcRec()); } } From 52c16574b977494335541d1f2114c318ba21ae02 Mon Sep 17 00:00:00 2001 From: Lars <146946151+ljoergen@users.noreply.github.com> Date: Thu, 13 Feb 2025 02:19:28 +0100 Subject: [PATCH 0190/1650] [PWGLF] AngularCorrelationsInJets.cxx: bug fix and adj. hist names for o2 linter (#9920) Co-authored-by: ALICE Action Bot --- .../Nuspex/AngularCorrelationsInJets.cxx | 728 +++++++++--------- 1 file changed, 349 insertions(+), 379 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/AngularCorrelationsInJets.cxx b/PWGLF/Tasks/Nuspex/AngularCorrelationsInJets.cxx index 1a4a4a33dbe..de3097a0e40 100644 --- a/PWGLF/Tasks/Nuspex/AngularCorrelationsInJets.cxx +++ b/PWGLF/Tasks/Nuspex/AngularCorrelationsInJets.cxx @@ -14,6 +14,7 @@ #include #include #include +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -129,7 +130,6 @@ struct AngularCorrelationsInJets { Configurable useRejectionCut{"useRejectionCut", true, "use nsigmaRejection"}; Configurable nsigmaRejection{"nsigmaRejection", 1.0, "reject tracks with nsigma < nsigmaRejection for >1 species"}; Configurable deuteronAnalysis{"deuteronAnalysis", true, "true [false]: analyse (anti)deuterons [(anti)helium-3]"}; - Configurable useTOFmass{"useTOFmass", false, "use TOF mass instead of pion mass if available"}; Configurable trackBufferSize{"trackBufferSize", 200, "Number of mixed-event tracks being stored"}; @@ -141,13 +141,13 @@ struct AngularCorrelationsInJets { int mRunNumber; using FullTracksRun2 = soa::Join; + aod::TrackSelectionExtension, aod::TracksDCA, aod::pidTPCFullPr, aod::pidTPCFullDe, aod::pidTPCFullHe, aod::pidTOFFullPr, aod::pidTOFFullDe, aod::pidTOFFullHe, aod::pidTOFbeta, aod::pidTPCEl, aod::pidTPCMu, aod::pidTPCPi, aod::pidTPCKa, aod::pidTPCTr, aod::pidTPCAl, aod::pidTOFPi, aod::pidTOFKa>; using FullTracksRun3 = soa::Join; + aod::TracksDCA, aod::pidTPCFullPr, aod::pidTPCFullDe, aod::pidTPCFullHe, aod::pidTOFFullPr, aod::pidTOFFullDe, aod::pidTOFFullHe, aod::pidTOFbeta, aod::pidTPCEl, aod::pidTPCMu, aod::pidTPCPi, aod::pidTPCKa, aod::pidTPCTr, aod::pidTPCAl, aod::pidTOFPi, aod::pidTOFKa>; using McTracksRun2 = soa::Join; + aod::TrackSelectionExtension, aod::TracksDCA, aod::pidTPCFullPr, aod::pidTPCFullDe, aod::pidTPCFullHe, aod::pidTOFFullPr, aod::pidTOFFullDe, aod::pidTOFFullHe, aod::pidTOFbeta, aod::pidTPCEl, aod::pidTPCMu, aod::pidTPCPi, aod::pidTPCKa, aod::pidTPCTr, aod::pidTPCAl, aod::pidTOFPi, aod::pidTOFKa, aod::McTrackLabels>; using McTracksRun3 = soa::Join; + aod::TracksDCA, aod::pidTPCFullPr, aod::pidTPCFullDe, aod::pidTPCFullHe, aod::pidTOFFullPr, aod::pidTOFFullDe, aod::pidTOFFullHe, aod::pidTOFbeta, aod::pidTPCEl, aod::pidTPCMu, aod::pidTPCPi, aod::pidTPCKa, aod::pidTPCTr, aod::pidTPCAl, aod::pidTOFPi, aod::pidTOFKa, aod::McTrackLabels>; using JTracksRun3 = soa::Join; using BCsWithRun2Info = soa::Join; using McCollisions = soa::Join; @@ -188,141 +188,139 @@ struct AngularCorrelationsInJets { eventSelection = jetderiveddatautilities::initialiseEventSelectionBits(static_cast("sel8")); // Counters - registryData.add("hNumberOfEvents", "Number of events", HistType::kTH1I, {{1, 0, 1}}); - registryData.add("hNumberOfJets", "Total number of jets", HistType::kTH1I, {{1, 0, 1}}); - registryData.add("hEventProtocol", "Event protocol", HistType::kTH1I, {{20, 0, 20}}); - registryData.add("hTrackProtocol", "Track protocol", HistType::kTH1I, {{20, 0, 20}}); - registryData.add("hNumPartInJet", "Number of particles in a jet", HistType::kTH1I, {{200, 0, 200}}); - registryData.add("hNumJetsInEvent", "Number of jets selected", HistType::kTH1I, {{10, 0, 10}}); + registryData.add("numberOfEvents", "Number of events", HistType::kTH1I, {{1, 0, 1}}); + registryData.add("numberOfJets", "Total number of jets", HistType::kTH1I, {{1, 0, 1}}); + registryData.add("eventProtocol", "Event protocol", HistType::kTH1I, {{20, 0, 20}}); + registryData.add("trackProtocol", "Track protocol", HistType::kTH1I, {{20, 0, 20}}); + registryData.add("numPartInJet", "Number of particles in a jet", HistType::kTH1I, {{200, 0, 200}}); + registryData.add("numJetsInEvent", "Number of jets selected", HistType::kTH1I, {{10, 0, 10}}); // (Pseudo)Rapidity - registryData.add("hJetRapidity", "Jet rapidity;#it{y}", HistType::kTH1F, {{200, -1, 1}}); + registryData.add("jetRapidity", "Jet rapidity;#it{y}", HistType::kTH1F, {{200, -1, 1}}); // pT - registryData.add("hPtJetParticle", "p_{T} of particles in jets", HistType::kTH1D, {axisSpecs.ptAxisPos}); - registryData.add("hPtTotalSubJetArea", "Subtracted full jet p_{T} (area)", HistType::kTH1D, {axisSpecs.ptAxisPos}); - registryData.add("hPtTotalSubJetPerp", "Subtracted full jet p_{T} (perpendicular)", HistType::kTH1D, {axisSpecs.ptAxisPos}); - registryData.add("hPtJetProton", "p_{T} of protons", HistType::kTH1D, {axisSpecs.ptAxisPos}); - registryData.add("hPtJetAntiproton", "p_{T} of antiprotons", HistType::kTH1D, {axisSpecs.ptAxisPos}); - registryData.add("hPtJetNuclei", "p_{T} of nuclei", HistType::kTH1D, {axisSpecs.ptAxisPos}); - registryData.add("hPtJetAntinuclei", "p_{T} of antinuclei", HistType::kTH1D, {axisSpecs.ptAxisPos}); - registryData.add("hPtTotalJet", "p_{T} of entire jet;#it{p}_{T} [GeV/#it{c}]", HistType::kTH1F, {{1000, 0, 500}}); - registryQA.add("hPtJetProtonVsTotalJet", "Proton p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); - registryQA.add("hPtJetAntiprotonVsTotalJet", "Antiproton p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); - registryQA.add("hPtJetNucleiVsTotalJet", "Nuclei p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); - registryQA.add("hPtJetAntinucleiVsTotalJet", "Antinuclei p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); - registryQA.add("hPtJetPionVsTotalJet", "Pion p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); - registryQA.add("hPtJetKaonVsTotalJet", "Kaon p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); + registryData.add("ptJetParticle", "p_{T} of particles in jets", HistType::kTH1D, {axisSpecs.ptAxisPos}); + registryData.add("ptTotalSubJetArea", "Subtracted full jet p_{T} (area)", HistType::kTH1D, {axisSpecs.ptAxisPos}); + registryData.add("ptTotalSubJetPerp", "Subtracted full jet p_{T} (perpendicular)", HistType::kTH1D, {axisSpecs.ptAxisPos}); + registryData.add("ptJetProton", "p_{T} of protons", HistType::kTH1D, {axisSpecs.ptAxisPos}); + registryData.add("ptJetAntiproton", "p_{T} of antiprotons", HistType::kTH1D, {axisSpecs.ptAxisPos}); + registryData.add("ptJetNuclei", "p_{T} of nuclei", HistType::kTH1D, {axisSpecs.ptAxisPos}); + registryData.add("ptJetAntinuclei", "p_{T} of antinuclei", HistType::kTH1D, {axisSpecs.ptAxisPos}); + registryData.add("ptTotalJet", "p_{T} of entire jet;#it{p}_{T} [GeV/#it{c}]", HistType::kTH1F, {{1000, 0, 500}}); + registryQA.add("ptJetProtonVsTotalJet", "Proton p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); + registryQA.add("ptJetAntiprotonVsTotalJet", "Antiproton p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); + registryQA.add("ptJetNucleiVsTotalJet", "Nuclei p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); + registryQA.add("ptJetAntinucleiVsTotalJet", "Antinuclei p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); + registryQA.add("ptJetPionVsTotalJet", "Pion p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); + registryQA.add("ptJetKaonVsTotalJet", "Kaon p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); // nSigma - registryData.add("hTPCsignal", "TPC signal", HistType::kTH2F, {{1000, -100, 100, "#it{p} [GeV/#it{c}]"}, {1000, 0, 5000, "d#it{E}/d#it{X} (a.u.)"}}); - registryData.add("hTOFsignal", "TOF signal", HistType::kTH2F, {{1000, -100, 100, "#it{p} [GeV/#it{c}]"}, {550, 0, 1.1, "#beta (TOF)"}}); - registryData.add("hTPCnsigmaProton", "TPC n#sigma for proton", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("hTOFnsigmaProton", "TOF n#sigma for proton", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("hTPCnsigmaAntiproton", "TPC n#sigma for antiproton", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("hTOFnsigmaAntiproton", "TOF n#sigma for antiproton", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("hTPCnsigmaNuclei", "TPC n#sigma for nuclei", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("hTOFnsigmaNuclei", "TOF n#sigma for nuclei", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("hTPCnsigmaAntinuclei", "TPC n#sigma for antinuclei", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("hTOFnsigmaAntinuclei", "TOF n#sigma for antinuclei", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("hTPCnsigmaProtonCF", "TPC n#sigma for proton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("hTOFnsigmaProtonCF", "TOF n#sigma for proton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("hTPCnsigmaAntiprotonCF", "TPC n#sigma for antiproton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("hTOFnsigmaAntiprotonCF", "TOF n#sigma for antiproton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("hTPCnsigmaPion", "TPC n#sigma for pion", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("hTOFnsigmaPion", "TOF n#sigma for pion", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("hTPCnsigmaKaon", "TPC n#sigma for kaon", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("hTOFnsigmaKaon", "TOF n#sigma for kaon", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tpcSignal", "TPC signal", HistType::kTH2F, {{1000, -100, 100, "#it{p} [GeV/#it{c}]"}, {1000, 0, 5000, "d#it{E}/d#it{X} (a.u.)"}}); + registryData.add("tofSignal", "TOF signal", HistType::kTH2F, {{1000, -100, 100, "#it{p} [GeV/#it{c}]"}, {550, 0, 1.1, "#beta (TOF)"}}); + registryData.add("tpcNSigmaProton", "TPC n#sigma for proton", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tofNSigmaProton", "TOF n#sigma for proton", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tpcNSigmaAntiproton", "TPC n#sigma for antiproton", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tofNSigmaAntiproton", "TOF n#sigma for antiproton", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tpcNSigmaNuclei", "TPC n#sigma for nuclei", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tofNSigmaNuclei", "TOF n#sigma for nuclei", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tpcNSigmaAntinuclei", "TPC n#sigma for antinuclei", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tofNSigmaAntinuclei", "TOF n#sigma for antinuclei", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tpcNSigmaProtonCF", "TPC n#sigma for proton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tofNSigmaProtonCF", "TOF n#sigma for proton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tpcNSigmaAntiprotonCF", "TPC n#sigma for antiproton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tofNSigmaAntiprotonCF", "TOF n#sigma for antiproton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tpcNSigmaPion", "TPC n#sigma for pion", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tofNSigmaPion", "TOF n#sigma for pion", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tpcNSigmaKaon", "TPC n#sigma for kaon", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tofNSigmaKaon", "TOF n#sigma for kaon", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); // DCA - registryData.add("hDCAxyFullJet", "DCA_{xy} of full jet", HistType::kTH2F, {axisSpecs.ptAxisFull, axisSpecs.dcaxyAxis}); - registryData.add("hDCAzFullJet", "DCA_{z} of full jet", HistType::kTH2F, {axisSpecs.ptAxisFull, axisSpecs.dcazAxis}); - registryData.add("hDCAzJetProton", "DCA_{z} of high purity protons", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); - registryData.add("hDCAzJetAntiproton", "DCA_{z} of high purity antiprotons", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); - registryData.add("hDCAzJetNuclei", "DCA_{z} of high purity nuclei", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); - registryData.add("hDCAzJetAntinuclei", "DCA_{z} of high purity antinuclei", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); - registryData.add("hDCAzJetPion", "DCA_{z} of high purity pions", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); - registryData.add("hDCAzJetKaon", "DCA_{z} of high purity kaons", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); + registryData.add("dcaXYFullJet", "DCA_{xy} of full jet", HistType::kTH2F, {axisSpecs.ptAxisFull, axisSpecs.dcaxyAxis}); + registryData.add("dcaZFullJet", "DCA_{z} of full jet", HistType::kTH2F, {axisSpecs.ptAxisFull, axisSpecs.dcazAxis}); + registryData.add("dcaZJetProton", "DCA_{z} of high purity protons", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); + registryData.add("dcaZJetAntiproton", "DCA_{z} of high purity antiprotons", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); + registryData.add("dcaZJetNuclei", "DCA_{z} of high purity nuclei", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); + registryData.add("dcaZJetAntinuclei", "DCA_{z} of high purity antinuclei", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); + registryData.add("dcaZJetPion", "DCA_{z} of high purity pions", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); + registryData.add("dcaZJetKaon", "DCA_{z} of high purity kaons", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); // Angular Distributions - registryQA.add("hPhiFullEvent", "#varphi in full event", HistType::kTH1F, {{1000, 0, 6.3}}); - registryQA.add("hPhiPtFullEvent", "#varphi vs. p_{T} in full event", HistType::kTH2F, {axisSpecs.ptAxisPos, {1000, 0, 6.3}}); - registryQA.add("hPhiJet", "#varphi in jet", HistType::kTH1F, {{1000, 0, 6.3}}); - registryQA.add("hPhiPtJet", "#varphi vs. p_{T} in jet", HistType::kTH2F, {axisSpecs.ptAxisPos, {1000, 0, 6.3}}); - registryQA.add("hEtaFullEvent", "#eta in full event", HistType::kTH1F, {{1000, -1, 1}}); - registryQA.add("hEtaPtFullEvent", "#eta vs. p_{T} in full event", HistType::kTH2F, {axisSpecs.ptAxisPos, {1000, -1, 1}}); - registryQA.add("hEtaJet", "#eta in jet", HistType::kTH1F, {{1000, -1, 1}}); - registryQA.add("hEtaPtJet", "#eta vs. p_{T} in jet", HistType::kTH2F, {axisSpecs.ptAxisPos, {1000, -1, 1}}); - - registryData.add("hDeltaPhiSEFull", "#Delta#varphi of particles in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("hDeltaPhiSEJet", "#Delta#varphi of jet particles in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("hDeltaPhiSEProton", "#Delta#varphi of protons in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("hDeltaPhiSEAntiproton", "#Delta#varphi of antiprotons in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("hDeltaPhiMEFull", "#Delta#varphi of particles in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("hDeltaPhiMEJet", "#Delta#varphi of jet particles in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("hDeltaPhiMEProton", "#Delta#varphi of protons in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("hDeltaPhiMEAntiproton", "#Delta#varphi of antiprotons in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("hDeltaPhiEtaSEFull", "#Delta#varphi vs #Delta#eta of full particles in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("hDeltaPhiEtaSEJet", "#Delta#varphi vs #Delta#eta of jet particles in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("hDeltaPhiEtaSEProton", "#Delta#varphi vs #Delta#eta of protons in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("hDeltaPhiEtaSEAntiproton", "#Delta#varphi vs #Delta#eta of antiprotons in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("hDeltaPhiEtaMEFull", "#Delta#varphi vs #Delta#eta of particles in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("hDeltaPhiEtaMEJet", "#Delta#varphi vs #Delta#eta of jet particles in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("hDeltaPhiEtaMEProton", "#Delta#varphi vs #Delta#eta of protons in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("hDeltaPhiEtaMEAntiproton", "#Delta#varphi vs #Delta#eta of antiprotons in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - - registryData.add("hDeltaPhiSEProtonAntiproton", "#Delta#varphi of proton-antiproton in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("hDeltaPhiMEProtonAntiproton", "#Delta#varphi of proton-antiproton in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("hDeltaPhiEtaSEProtonAntiproton", "#Delta#varphi vs #Delta#eta of proton-antiproton in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("hDeltaPhiEtaMEProtonAntiproton", "#Delta#varphi vs #Delta#eta of proton-antiproton in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("hDeltaPhiSEPion", "#Delta#varphi of pions in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("hDeltaPhiMEPion", "#Delta#varphi of pions in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("hDeltaPhiEtaSEPion", "#Delta#varphi vs #Delta#eta of pions in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("hDeltaPhiEtaMEPion", "#Delta#varphi vs #Delta#eta of pions in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryQA.add("phiFullEvent", "#varphi in full event", HistType::kTH1F, {{1000, 0, 6.3}}); + registryQA.add("phiPtFullEvent", "#varphi vs. p_{T} in full event", HistType::kTH2F, {axisSpecs.ptAxisPos, {1000, 0, 6.3}}); + registryQA.add("phiJet", "#varphi in jet", HistType::kTH1F, {{1000, 0, 6.3}}); + registryQA.add("phiPtJet", "#varphi vs. p_{T} in jet", HistType::kTH2F, {axisSpecs.ptAxisPos, {1000, 0, 6.3}}); + registryQA.add("etaFullEvent", "#eta in full event", HistType::kTH1F, {{1000, -1, 1}}); + registryQA.add("etaPtFullEvent", "#eta vs. p_{T} in full event", HistType::kTH2F, {axisSpecs.ptAxisPos, {1000, -1, 1}}); + registryQA.add("etaJet", "#eta in jet", HistType::kTH1F, {{1000, -1, 1}}); + registryQA.add("etaPtJet", "#eta vs. p_{T} in jet", HistType::kTH2F, {axisSpecs.ptAxisPos, {1000, -1, 1}}); + + registryData.add("deltaPhiSEFull", "#Delta#varphi of particles in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiSEJet", "#Delta#varphi of jet particles in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiSEProton", "#Delta#varphi of protons in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiSEAntiproton", "#Delta#varphi of antiprotons in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiMEFull", "#Delta#varphi of particles in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiMEJet", "#Delta#varphi of jet particles in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiMEProton", "#Delta#varphi of protons in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiMEAntiproton", "#Delta#varphi of antiprotons in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiEtaSEFull", "#Delta#varphi vs #Delta#eta of full particles in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaSEJet", "#Delta#varphi vs #Delta#eta of jet particles in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaSEProton", "#Delta#varphi vs #Delta#eta of protons in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaSEAntiproton", "#Delta#varphi vs #Delta#eta of antiprotons in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaMEFull", "#Delta#varphi vs #Delta#eta of particles in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaMEJet", "#Delta#varphi vs #Delta#eta of jet particles in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaMEProton", "#Delta#varphi vs #Delta#eta of protons in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaMEAntiproton", "#Delta#varphi vs #Delta#eta of antiprotons in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + + registryData.add("deltaPhiSEProtonAntiproton", "#Delta#varphi of proton-antiproton in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiMEProtonAntiproton", "#Delta#varphi of proton-antiproton in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiEtaSEProtonAntiproton", "#Delta#varphi vs #Delta#eta of proton-antiproton in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaMEProtonAntiproton", "#Delta#varphi vs #Delta#eta of proton-antiproton in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiSEPion", "#Delta#varphi of pions in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiMEPion", "#Delta#varphi of pions in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiEtaSEPion", "#Delta#varphi vs #Delta#eta of pions in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaMEPion", "#Delta#varphi vs #Delta#eta of pions in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); // QA - registryQA.add("hPtDiff", "p_{T} difference PseudoJet/original track;#it{p}_{T} [GeV/#it{c}]", HistType::kTH1D, {{100, -5, 5}}); - registryQA.add("hJetConeRadius", "Jet Radius;#it{R}", HistType::kTH1F, {{100, 0, 1}}); - registryQA.add("hMaxRadiusVsPt", "Max Cone Radius vs p_{T}", HistType::kTH2F, {{axisSpecs.ptAxisPos}, {100, 0, 1}}); - registryQA.add("hRhoEstimatePerp", "Background #rho (perp)", HistType::kTH2F, {{axisSpecs.ptAxisPos}, {200, 0, 20}}); - registryQA.add("hRhoMEstimatePerp", "Background #rho_{m} (perp)", HistType::kTH2F, {{axisSpecs.ptAxisPos}, {200, 0, 20}}); - registryQA.add("hRhoEstimateArea", "Background #rho (area)", HistType::kTH2F, {{axisSpecs.ptAxisPos}, {200, 0, 20}}); - registryQA.add("hRhoMEstimateArea", "Background #rho_{m} (area)", HistType::kTH2F, {{axisSpecs.ptAxisPos}, {200, 0, 20}}); - registryQA.add("hJetBkgDeltaPt", "#Delta p_{T} Clustered Cone - Pure Jet", HistType::kTH1F, {{200, 0, 10}}); - - registryQA.add("hTOFmass", "TOF mass vs p_{T}", HistType::kTH2F, {axisSpecs.ptAxisPos, {1000, 0, 5, "#it{m} [GeV/#it{c}^{2}]"}}); - registryQA.get(HIST("hTOFmass"))->Sumw2(); - registryQA.add("hPtFullEvent", "p_{T} after basic cuts", HistType::kTH1F, {axisSpecs.ptAxisPos}); - registryQA.add("hCrossedRowsTPC", "Crossed rows TPC", HistType::kTH2I, {axisSpecs.ptAxisPos, {135, 65, 200}}); - registryQA.add("hClusterITS", "ITS clusters", HistType::kTH2I, {axisSpecs.ptAxisPos, {10, 0, 10}}); - registryQA.add("hClusterTPC", "TPC clusters", HistType::kTH2I, {axisSpecs.ptAxisPos, {135, 65, 200}}); - registryQA.add("hRatioCrossedRowsTPC", "Ratio crossed rows/findable TPC", HistType::kTH2F, {axisSpecs.ptAxisPos, {100, 0.5, 1.5}}); - registryQA.add("hChi2ITS", "ITS #chi^{2}", HistType::kTH2F, {axisSpecs.ptAxisPos, {400, 0, 40}}); - registryQA.add("hChi2TPC", "TPC #chi^{2}", HistType::kTH2F, {axisSpecs.ptAxisPos, {50, 0, 5}}); - registryQA.add("hDCAxyFullEvent", "DCA_{xy} of full event", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcaxyAxis}); - registryQA.add("hDCAzFullEvent", "DCA_{z} of full event", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); - registryQA.add("hJetPtVsNumPart", "Total jet p_{T} vs number of constituents", HistType::kTH2F, {axisSpecs.ptAxisPos, {100, 0, 100}}); + registryQA.add("ptDiff", "p_{T} difference PseudoJet/original track;#it{p}_{T} [GeV/#it{c}]", HistType::kTH1D, {{100, -5, 5}}); + registryQA.add("jetConeRadius", "Jet Radius;#it{R}", HistType::kTH1F, {{100, 0, 1}}); + registryQA.add("maxRadiusVsPt", "Max Cone Radius vs p_{T}", HistType::kTH2F, {{axisSpecs.ptAxisPos}, {100, 0, 1}}); + registryQA.add("rhoEstimatePerp", "Background #rho (perp)", HistType::kTH2F, {{axisSpecs.ptAxisPos}, {200, 0, 20}}); + registryQA.add("rhoMEstimatePerp", "Background #rho_{m} (perp)", HistType::kTH2F, {{axisSpecs.ptAxisPos}, {200, 0, 20}}); + registryQA.add("rhoEstimateArea", "Background #rho (area)", HistType::kTH2F, {{axisSpecs.ptAxisPos}, {200, 0, 20}}); + registryQA.add("rhoMEstimateArea", "Background #rho_{m} (area)", HistType::kTH2F, {{axisSpecs.ptAxisPos}, {200, 0, 20}}); + registryQA.add("jetBkgDeltaPt", "#Delta p_{T} Clustered Cone - Pure Jet", HistType::kTH1F, {{200, 0, 10}}); + + registryQA.add("ptFullEvent", "p_{T} after basic cuts", HistType::kTH1F, {axisSpecs.ptAxisPos}); + registryQA.add("crossedRowsTPC", "Crossed rows TPC", HistType::kTH2I, {axisSpecs.ptAxisPos, {135, 65, 200}}); + registryQA.add("clusterITS", "ITS clusters", HistType::kTH2I, {axisSpecs.ptAxisPos, {10, 0, 10}}); + registryQA.add("clusterTPC", "TPC clusters", HistType::kTH2I, {axisSpecs.ptAxisPos, {135, 65, 200}}); + registryQA.add("ratioCrossedRowsTPC", "Ratio crossed rows/findable TPC", HistType::kTH2F, {axisSpecs.ptAxisPos, {100, 0.5, 1.5}}); + registryQA.add("chi2ITS", "ITS #chi^{2}", HistType::kTH2F, {axisSpecs.ptAxisPos, {400, 0, 40}}); + registryQA.add("chi2TPC", "TPC #chi^{2}", HistType::kTH2F, {axisSpecs.ptAxisPos, {50, 0, 5}}); + registryQA.add("dcaXYFullEvent", "DCA_{xy} of full event", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcaxyAxis}); + registryQA.add("dcaZFullEvent", "DCA_{z} of full event", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); + registryQA.add("jetPtVsNumPart", "Total jet p_{T} vs number of constituents", HistType::kTH2F, {axisSpecs.ptAxisPos, {100, 0, 100}}); // QA Histograms for Comparison with nuclei_in_jets.cxx - registryQA.add("hMultiplicityJetPlusUE", "hMultiplicityJetPlusUE", HistType::kTH1F, {{100, 0, 100, "#it{N}_{ch}"}}); - registryQA.add("hMultiplicityJet", "hMultiplicityJet", HistType::kTH1F, {{100, 0, 100, "#it{N}_{ch}"}}); - registryQA.add("hMultiplicityUE", "hMultiplicityUE", HistType::kTH1F, {{100, 0, 100, "#it{N}_{ch}"}}); - registryQA.add("hPtJetPlusUE", "hPtJetPlusUE", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); - registryQA.add("hPtJet", "hPtJet", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); - registryQA.add("hPtUE", "hPtUE", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); - registryQA.add("hDeltaEtadeltaPhiJet", "hDeltaEtadeltaPhiJet", HistType::kTH2F, {{200, -0.5, 0.5, "#Delta#eta"}, {200, 0, 0.5 * TMath::Pi(), "#Delta#phi"}}); - registryQA.add("hDeltaEtadeltaPhiUE", "hDeltaEtadeltaPhiUE", HistType::kTH2F, {{200, -0.5, 0.5, "#Delta#eta"}, {200, 0, 0.5 * TMath::Pi(), "#Delta#phi"}}); - registryQA.add("hDeltaJetPt", "hDeltaJetPt", HistType::kTH1F, {{200, -2, 2, "#Delta#it{p}_{T} (GeV/#it{c})"}}); - - registryQA.add("hNParticlesClusteredInJet", "hNParticlesClusteredInJet", HistType::kTH1F, {{50, 0, 50, "#it{N}_{ch}"}}); - registryQA.add("hPtParticlesClusteredInJet", "hPtParticlesClusteredInJet", HistType::kTH1F, {{200, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); + registryQA.add("multiplicityJetPlusUE", "multiplicityJetPlusUE", HistType::kTH1F, {{100, 0, 100, "#it{N}_{ch}"}}); + registryQA.add("multiplicityJet", "multiplicityJet", HistType::kTH1F, {{100, 0, 100, "#it{N}_{ch}"}}); + registryQA.add("multiplicityUE", "multiplicityUE", HistType::kTH1F, {{100, 0, 100, "#it{N}_{ch}"}}); + registryQA.add("ptJetPlusUE", "ptJetPlusUE", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); + registryQA.add("ptJet", "ptJet", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); + registryQA.add("ptUE", "ptUE", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); + registryQA.add("deltaEtadeltaPhiJet", "deltaEtadeltaPhiJet", HistType::kTH2F, {{200, -0.5, 0.5, "#Delta#eta"}, {200, 0, 0.5 * TMath::Pi(), "#Delta#phi"}}); + registryQA.add("deltaEtadeltaPhiUE", "deltaEtadeltaPhiUE", HistType::kTH2F, {{200, -0.5, 0.5, "#Delta#eta"}, {200, 0, 0.5 * TMath::Pi(), "#Delta#phi"}}); + registryQA.add("deltaJetPt", "deltaJetPt", HistType::kTH1F, {{200, -2, 2, "#Delta#it{p}_{T} (GeV/#it{c})"}}); + + registryQA.add("nParticlesClusteredInJet", "nParticlesClusteredInJet", HistType::kTH1F, {{50, 0, 50, "#it{N}_{ch}"}}); + registryQA.add("ptParticlesClusteredInJet", "ptParticlesClusteredInJet", HistType::kTH1F, {{200, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); // MC - registryMC.add("hPtJetProtonMC", "Truth jet proton p_{T}", HistType::kTH1F, {axisSpecs.ptAxisPos}); - registryMC.add("hPtJetAntiprotonMC", "Truth jet antiproton p_{T}", HistType::kTH1F, {axisSpecs.ptAxisPos}); - registryMC.add("hPtJetNucleiMC", "Truth jet nuclei p_{T}", HistType::kTH1F, {axisSpecs.ptAxisPos}); - registryMC.add("hPtJetAntinucleiMC", "Truth jet antinuclei p_{T}", HistType::kTH1F, {axisSpecs.ptAxisPos}); - registryMC.add("hNumberOfTruthParticles", "Truth yields (anti)p, (anti)d, (anti)He-3", HistType::kTH1I, {{6, 0, 6}}); + registryMC.add("ptJetProtonMC", "Truth jet proton p_{T}", HistType::kTH1F, {axisSpecs.ptAxisPos}); + registryMC.add("ptJetAntiprotonMC", "Truth jet antiproton p_{T}", HistType::kTH1F, {axisSpecs.ptAxisPos}); + registryMC.add("ptJetNucleiMC", "Truth jet nuclei p_{T}", HistType::kTH1F, {axisSpecs.ptAxisPos}); + registryMC.add("ptJetAntinucleiMC", "Truth jet antinuclei p_{T}", HistType::kTH1F, {axisSpecs.ptAxisPos}); + registryMC.add("numberOfTruthParticles", "Truth yields (anti)p, (anti)d, (anti)He-3", HistType::kTH1I, {{6, 0, 6}}); } std::vector> fBufferProton; @@ -381,9 +379,9 @@ struct AngularCorrelationsInJets { if (TMath::Abs(track.dcaZ()) > protonDCAzCF) return false; - registryData.fill(HIST("hTPCnsigmaProtonCF"), track.pt(), track.tpcNSigmaPr()); + registryData.fill(HIST("tpcNSigmaProtonCF"), track.pt(), track.tpcNSigmaPr()); if (track.hasTOF()) - registryData.fill(HIST("hTOFnsigmaProtonCF"), track.pt(), track.tofNSigmaPr()); + registryData.fill(HIST("tofNSigmaProtonCF"), track.pt(), track.tofNSigmaPr()); // nsigma if (!track.hasTOF()) @@ -400,7 +398,7 @@ struct AngularCorrelationsInJets { if (TMath::Abs(track.dcaZ()) > protonDCAzYield) return false; - registryData.fill(HIST("hTPCnsigmaProton"), track.pt(), track.tpcNSigmaPr()); + registryData.fill(HIST("tpcNSigmaProton"), track.pt(), track.tpcNSigmaPr()); // TPC if (track.pt() < protonTPCTOFpT && TMath::Abs(track.tpcNSigmaPr()) > protonTPCnsigmaLowPtYield) @@ -410,7 +408,7 @@ struct AngularCorrelationsInJets { // TOF if (track.hasTOF()) { - registryData.fill(HIST("hTOFnsigmaProton"), track.pt(), track.tofNSigmaPr()); + registryData.fill(HIST("tofNSigmaProton"), track.pt(), track.tofNSigmaPr()); if (track.pt() > protonTPCTOFpT && TMath::Abs(track.tofNSigmaPr()) > protonTOFnsigmaHighPtYield) return false; } @@ -432,9 +430,9 @@ struct AngularCorrelationsInJets { if (TMath::Abs(track.dcaZ()) > antiprotonDCAzCF) return false; - registryData.fill(HIST("hTPCnsigmaAntiprotonCF"), track.pt(), track.tpcNSigmaPr()); + registryData.fill(HIST("tpcNSigmaAntiprotonCF"), track.pt(), track.tpcNSigmaPr()); if (track.hasTOF()) - registryData.fill(HIST("hTOFnsigmaAntiprotonCF"), track.pt(), track.tofNSigmaPr()); + registryData.fill(HIST("tofNSigmaAntiprotonCF"), track.pt(), track.tofNSigmaPr()); // nsigma if (!track.hasTOF()) @@ -451,7 +449,7 @@ struct AngularCorrelationsInJets { if (TMath::Abs(track.dcaZ()) > antiprotonDCAzYield) return false; - registryData.fill(HIST("hTPCnsigmaAntiproton"), track.pt(), track.tpcNSigmaPr()); + registryData.fill(HIST("tpcNSigmaAntiproton"), track.pt(), track.tpcNSigmaPr()); // TPC if (track.pt() < antiprotonTPCTOFpT && TMath::Abs(track.tpcNSigmaPr()) > antiprotonTPCnsigmaLowPtYield) @@ -461,7 +459,7 @@ struct AngularCorrelationsInJets { // TOF if (track.hasTOF()) { - registryData.fill(HIST("hTOFnsigmaAntiproton"), track.pt(), track.tofNSigmaPr()); + registryData.fill(HIST("tofNSigmaAntiproton"), track.pt(), track.tofNSigmaPr()); if (track.pt() > antiprotonTPCTOFpT && TMath::Abs(track.tofNSigmaPr()) > antiprotonTOFnsigmaHighPtYield) return false; } @@ -482,7 +480,7 @@ struct AngularCorrelationsInJets { if (TMath::Abs(track.dcaZ()) > nucleiDCAzYield) return false; - registryData.fill(HIST("hTPCnsigmaNuclei"), track.pt(), track.tpcNSigmaDe()); + registryData.fill(HIST("tpcNSigmaNuclei"), track.pt(), track.tpcNSigmaDe()); // TPC if (track.pt() < nucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaDe()) > nucleiTPCnsigmaLowPtYield) @@ -492,7 +490,7 @@ struct AngularCorrelationsInJets { // TOF if (track.hasTOF()) { - registryData.fill(HIST("hTOFnsigmaNuclei"), track.pt(), track.tofNSigmaDe()); + registryData.fill(HIST("tofNSigmaNuclei"), track.pt(), track.tofNSigmaDe()); if (track.pt() > nucleiTPCTOFpT && TMath::Abs(track.tofNSigmaDe()) > nucleiTOFnsigmaHighPtYield) return false; } @@ -503,7 +501,7 @@ struct AngularCorrelationsInJets { if (TMath::Abs(track.dcaZ()) > nucleiDCAzYield) return false; - registryData.fill(HIST("hTPCnsigmaNuclei"), track.pt(), track.tpcNSigmaHe()); + registryData.fill(HIST("tpcNSigmaNuclei"), track.pt(), track.tpcNSigmaHe()); // TPC if (track.pt() < nucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaHe()) > nucleiTPCnsigmaLowPtYield) @@ -513,7 +511,7 @@ struct AngularCorrelationsInJets { // TOF if (track.hasTOF()) { - registryData.fill(HIST("hTOFnsigmaNuclei"), track.pt(), track.tofNSigmaHe()); + registryData.fill(HIST("tofNSigmaNuclei"), track.pt(), track.tofNSigmaHe()); if (track.pt() > nucleiTPCTOFpT && TMath::Abs(track.tofNSigmaHe()) > nucleiTOFnsigmaHighPtYield) return false; } @@ -535,7 +533,7 @@ struct AngularCorrelationsInJets { if (TMath::Abs(track.dcaZ()) > antinucleiDCAzYield) return false; - registryData.fill(HIST("hTPCnsigmaAntinuclei"), track.pt(), track.tpcNSigmaDe()); + registryData.fill(HIST("tpcNSigmaAntinuclei"), track.pt(), track.tpcNSigmaDe()); // TPC if (track.pt() < antinucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaDe()) > antinucleiTPCnsigmaLowPtYield) @@ -545,7 +543,7 @@ struct AngularCorrelationsInJets { // TOF if (track.hasTOF()) { - registryData.fill(HIST("hTOFnsigmaAntinuclei"), track.pt(), track.tofNSigmaDe()); + registryData.fill(HIST("tofNSigmaAntinuclei"), track.pt(), track.tofNSigmaDe()); if (track.pt() > antinucleiTPCTOFpT && TMath::Abs(track.tofNSigmaDe()) > antinucleiTOFnsigmaHighPtYield) return false; } @@ -556,7 +554,7 @@ struct AngularCorrelationsInJets { if (TMath::Abs(track.dcaZ()) > antinucleiDCAzYield) return false; - registryData.fill(HIST("hTPCnsigmaAntinuclei"), track.pt(), track.tpcNSigmaHe()); + registryData.fill(HIST("tpcNSigmaAntinuclei"), track.pt(), track.tpcNSigmaHe()); // TPC if (track.pt() < antinucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaHe()) > antinucleiTPCnsigmaLowPtYield) @@ -566,7 +564,7 @@ struct AngularCorrelationsInJets { // TOF if (track.hasTOF()) { - registryData.fill(HIST("hTOFnsigmaAntinuclei"), track.pt(), track.tofNSigmaHe()); + registryData.fill(HIST("tofNSigmaAntinuclei"), track.pt(), track.tofNSigmaHe()); if (track.pt() > antinucleiTPCTOFpT && TMath::Abs(track.tofNSigmaHe()) > antinucleiTOFnsigmaHighPtYield) return false; } @@ -584,7 +582,7 @@ struct AngularCorrelationsInJets { if (TMath::Abs(track.dcaZ()) > pionDCAz) return false; - registryData.fill(HIST("hTPCnsigmaPion"), track.pt(), track.tpcNSigmaStorePi()); + registryData.fill(HIST("tpcNSigmaPion"), track.pt(), track.tpcNSigmaStorePi()); // TPC if (track.pt() < pionTPCTOFpT && TMath::Abs(track.tpcNSigmaStorePi()) > pionTPCnsigmaLowPt) @@ -594,7 +592,7 @@ struct AngularCorrelationsInJets { // TOF if (track.hasTOF()) { - registryData.fill(HIST("hTOFnsigmaPion"), track.pt(), track.tofNSigmaStorePi()); + registryData.fill(HIST("tofNSigmaPion"), track.pt(), track.tofNSigmaStorePi()); if (track.pt() > pionTPCTOFpT && TMath::Abs(track.tofNSigmaStorePi()) > pionTOFnsigma) return false; } @@ -611,7 +609,7 @@ struct AngularCorrelationsInJets { if (TMath::Abs(track.dcaZ()) > kaonDCAz) return false; - registryData.fill(HIST("hTPCnsigmaKaon"), track.pt(), track.tpcNSigmaStoreKa()); + registryData.fill(HIST("tpcNSigmaKaon"), track.pt(), track.tpcNSigmaStoreKa()); // TPC if (track.pt() < kaonTPCTOFpT && TMath::Abs(track.tpcNSigmaStoreKa()) > kaonTPCnsigmaLowPt) @@ -621,7 +619,7 @@ struct AngularCorrelationsInJets { // TOF if (track.hasTOF()) { - registryData.fill(HIST("hTOFnsigmaKaon"), track.pt(), track.tofNSigmaStoreKa()); + registryData.fill(HIST("tofNSigmaKaon"), track.pt(), track.tofNSigmaStoreKa()); if (track.pt() > kaonTPCTOFpT && TMath::Abs(track.tofNSigmaStoreKa()) > kaonTOFnsigma) return false; } @@ -651,7 +649,7 @@ struct AngularCorrelationsInJets { if (std::isnan(buffer.at(i).first)) continue; if (buffer.at(i).first > 2 * TMath::Pi() || buffer.at(i).first < -2 * TMath::Pi()) { - registryData.fill(HIST("hTrackProtocol"), 16); + registryData.fill(HIST("trackProtocol"), 16); continue; } @@ -665,28 +663,28 @@ struct AngularCorrelationsInJets { switch (particleType) { case -1: - registryData.fill(HIST("hDeltaPhiMEFull"), DeltaPhi); - registryData.fill(HIST("hDeltaPhiEtaMEFull"), DeltaPhi, DeltaEta); + registryData.fill(HIST("deltaPhiMEFull"), DeltaPhi); + registryData.fill(HIST("deltaPhiEtaMEFull"), DeltaPhi, DeltaEta); break; case 0: - registryData.fill(HIST("hDeltaPhiMEJet"), DeltaPhi); - registryData.fill(HIST("hDeltaPhiEtaMEJet"), DeltaPhi, DeltaEta); + registryData.fill(HIST("deltaPhiMEJet"), DeltaPhi); + registryData.fill(HIST("deltaPhiEtaMEJet"), DeltaPhi, DeltaEta); break; case 1: - registryData.fill(HIST("hDeltaPhiMEProton"), DeltaPhi); - registryData.fill(HIST("hDeltaPhiEtaMEProton"), DeltaPhi, DeltaEta); + registryData.fill(HIST("deltaPhiMEProton"), DeltaPhi); + registryData.fill(HIST("deltaPhiEtaMEProton"), DeltaPhi, DeltaEta); break; case 2: - registryData.fill(HIST("hDeltaPhiMEAntiproton"), DeltaPhi); - registryData.fill(HIST("hDeltaPhiEtaMEAntiproton"), DeltaPhi, DeltaEta); + registryData.fill(HIST("deltaPhiMEAntiproton"), DeltaPhi); + registryData.fill(HIST("deltaPhiEtaMEAntiproton"), DeltaPhi, DeltaEta); break; case 3: - registryData.fill(HIST("hDeltaPhiMEPion"), DeltaPhi); - registryData.fill(HIST("hDeltaPhiEtaMEPion"), DeltaPhi, DeltaEta); + registryData.fill(HIST("deltaPhiMEPion"), DeltaPhi); + registryData.fill(HIST("deltaPhiEtaMEPion"), DeltaPhi, DeltaEta); break; case 4: - registryData.fill(HIST("hDeltaPhiMEProtonAntiproton"), DeltaPhi); - registryData.fill(HIST("hDeltaPhiEtaMEProtonAntiproton"), DeltaPhi, DeltaEta); + registryData.fill(HIST("deltaPhiMEProtonAntiproton"), DeltaPhi); + registryData.fill(HIST("deltaPhiEtaMEProtonAntiproton"), DeltaPhi, DeltaEta); break; } } // for (int i = 0; i < static_cast(buffer.size()); i++) @@ -702,14 +700,14 @@ struct AngularCorrelationsInJets { double phiToAxis = TVector2::Phi_0_2pi(particleVector.at(i).phi() - jetAxis.Phi()); double etaToAxis = particleVector.at(i).eta() - jetAxis.Eta(); if (TMath::Abs(particleVector.at(i).phi()) > 2 * TMath::Pi()) { - registryData.fill(HIST("hTrackProtocol"), 14); + registryData.fill(HIST("trackProtocol"), 14); continue; } for (int j = i + 1; j < static_cast(particleVector.size()); j++) { if ((j == static_cast(particleVector.size())) || std::isnan(particleVector.at(j).phi())) continue; if (TMath::Abs(particleVector.at(j).phi()) > 2 * TMath::Pi()) { - registryData.fill(HIST("hTrackProtocol"), 15); + registryData.fill(HIST("trackProtocol"), 15); continue; } @@ -720,24 +718,24 @@ struct AngularCorrelationsInJets { } switch (particleType) { case -1: - registryData.fill(HIST("hDeltaPhiSEFull"), DeltaPhi); - registryData.fill(HIST("hDeltaPhiEtaSEFull"), DeltaPhi, DeltaEta); + registryData.fill(HIST("deltaPhiSEFull"), DeltaPhi); + registryData.fill(HIST("deltaPhiEtaSEFull"), DeltaPhi, DeltaEta); break; case 0: - registryData.fill(HIST("hDeltaPhiSEJet"), DeltaPhi); - registryData.fill(HIST("hDeltaPhiEtaSEJet"), DeltaPhi, DeltaEta); + registryData.fill(HIST("deltaPhiSEJet"), DeltaPhi); + registryData.fill(HIST("deltaPhiEtaSEJet"), DeltaPhi, DeltaEta); break; case 1: - registryData.fill(HIST("hDeltaPhiSEProton"), DeltaPhi); - registryData.fill(HIST("hDeltaPhiEtaSEProton"), DeltaPhi, DeltaEta); + registryData.fill(HIST("deltaPhiSEProton"), DeltaPhi); + registryData.fill(HIST("deltaPhiEtaSEProton"), DeltaPhi, DeltaEta); break; case 2: - registryData.fill(HIST("hDeltaPhiSEAntiproton"), DeltaPhi); - registryData.fill(HIST("hDeltaPhiEtaSEAntiproton"), DeltaPhi, DeltaEta); + registryData.fill(HIST("deltaPhiSEAntiproton"), DeltaPhi); + registryData.fill(HIST("deltaPhiEtaSEAntiproton"), DeltaPhi, DeltaEta); break; case 3: - registryData.fill(HIST("hDeltaPhiSEPion"), DeltaPhi); - registryData.fill(HIST("hDeltaPhiEtaSEPion"), DeltaPhi, DeltaEta); + registryData.fill(HIST("deltaPhiSEPion"), DeltaPhi); + registryData.fill(HIST("deltaPhiEtaSEPion"), DeltaPhi, DeltaEta); break; } } @@ -756,14 +754,14 @@ struct AngularCorrelationsInJets { double phiToAxis = TVector2::Phi_0_2pi(particleVector.at(i).phi() - jetAxis.Phi()); double etaToAxis = particleVector.at(i).eta() - jetAxis.Eta(); if (TMath::Abs(particleVector.at(i).phi()) > 2 * TMath::Pi()) { - registryData.fill(HIST("hTrackProtocol"), 14); + registryData.fill(HIST("trackProtocol"), 14); continue; } for (int j = 0; j < static_cast(particleVectorAnti.size()); j++) { if (std::isnan(particleVectorAnti.at(j).phi())) continue; if (TMath::Abs(particleVectorAnti.at(j).phi()) > 2 * TMath::Pi()) { - registryData.fill(HIST("hTrackProtocol"), 15); + registryData.fill(HIST("trackProtocol"), 15); continue; } @@ -772,8 +770,8 @@ struct AngularCorrelationsInJets { if (DeltaPhi > (1.5 * TMath::Pi())) { DeltaPhi = DeltaPhi - 2 * TMath::Pi(); } - registryData.fill(HIST("hDeltaPhiSEProtonAntiproton"), DeltaPhi); - registryData.fill(HIST("hDeltaPhiEtaSEProtonAntiproton"), DeltaPhi, DeltaEta); + registryData.fill(HIST("deltaPhiSEProtonAntiproton"), DeltaPhi); + registryData.fill(HIST("deltaPhiEtaSEProtonAntiproton"), DeltaPhi, DeltaEta); break; } fillMixedEventDeltas(particleVector.at(i), bufferAnti, 4, jetAxis); @@ -858,32 +856,32 @@ struct AngularCorrelationsInJets { if (subtractedJetPerp.pt() < minJetPt) // cut on jet w/o bkg return jetCounter; - registryData.fill(HIST("hPtTotalSubJetPerp"), subtractedJetPerp.pt()); - registryData.fill(HIST("hPtTotalSubJetArea"), subtractedJetArea.pt()); - registryQA.fill(HIST("hRhoEstimateArea"), jet.pt(), rho); // switch to subtracted jet pt - registryQA.fill(HIST("hRhoMEstimateArea"), jet.pt(), rhoM); - registryQA.fill(HIST("hRhoEstimatePerp"), jet.pt(), rhoPerp); - registryQA.fill(HIST("hRhoMEstimatePerp"), jet.pt(), rhoMPerp); + registryData.fill(HIST("ptTotalSubJetPerp"), subtractedJetPerp.pt()); + registryData.fill(HIST("ptTotalSubJetArea"), subtractedJetArea.pt()); + registryQA.fill(HIST("rhoEstimateArea"), jet.pt(), rho); // switch to subtracted jet pt + registryQA.fill(HIST("rhoMEstimateArea"), jet.pt(), rhoM); + registryQA.fill(HIST("rhoEstimatePerp"), jet.pt(), rhoPerp); + registryQA.fill(HIST("rhoMEstimatePerp"), jet.pt(), rhoMPerp); double jetBkgDeltaPt = jet.pt() - subtractedJetPerp.pt(); - registryQA.fill(HIST("hJetBkgDeltaPt"), jetBkgDeltaPt); + registryQA.fill(HIST("jetBkgDeltaPt"), jetBkgDeltaPt); - registryData.fill(HIST("hEventProtocol"), 4); + registryData.fill(HIST("eventProtocol"), 4); std::vector constituents = jet.constituents(); - registryData.fill(HIST("hEventProtocol"), 5); - registryData.fill(HIST("hNumberOfJets"), 0); - registryData.fill(HIST("hPtTotalJet"), jet.pt()); - registryData.fill(HIST("hJetRapidity"), jet.rap()); - registryData.fill(HIST("hNumPartInJet"), jet.constituents().size()); - registryQA.fill(HIST("hJetPtVsNumPart"), jet.pt(), jet.constituents().size()); + registryData.fill(HIST("eventProtocol"), 5); + registryData.fill(HIST("numberOfJets"), 0); + registryData.fill(HIST("ptTotalJet"), jet.pt()); + registryData.fill(HIST("jetRapidity"), jet.rap()); + registryData.fill(HIST("numPartInJet"), jet.constituents().size()); + registryQA.fill(HIST("jetPtVsNumPart"), jet.pt(), jet.constituents().size()); double maxRadius = 0; for (const auto& constituent : constituents) { - registryData.fill(HIST("hPtJetParticle"), constituent.pt()); - registryQA.fill(HIST("hPhiJet"), constituent.phi()); - registryQA.fill(HIST("hPhiPtJet"), constituent.pt(), constituent.phi()); - registryQA.fill(HIST("hEtaJet"), constituent.eta()); - registryQA.fill(HIST("hEtaPtJet"), constituent.pt(), constituent.eta()); + registryData.fill(HIST("ptJetParticle"), constituent.pt()); + registryQA.fill(HIST("phiJet"), constituent.phi()); + registryQA.fill(HIST("phiPtJet"), constituent.pt(), constituent.phi()); + registryQA.fill(HIST("etaJet"), constituent.eta()); + registryQA.fill(HIST("etaPtJet"), constituent.pt(), constituent.eta()); if (std::isnan(constituent.phi()) || std::isnan(jet.phi())) // geometric jet cone continue; @@ -892,11 +890,11 @@ struct AngularCorrelationsInJets { DeltaPhi = DeltaPhi - 2 * TMath::Pi(); double DeltaEta = constituent.eta() - jet.eta(); double Delta = TMath::Sqrt(DeltaPhi * DeltaPhi + DeltaEta * DeltaEta); - registryQA.fill(HIST("hJetConeRadius"), Delta); + registryQA.fill(HIST("jetConeRadius"), Delta); if (Delta > maxRadius) maxRadius = Delta; } - registryQA.fill(HIST("hMaxRadiusVsPt"), jet.pt(), maxRadius); + registryQA.fill(HIST("maxRadiusVsPt"), jet.pt(), maxRadius); // QA for comparison with nuclei_in_jets TVector3 pJet(0., 0., 0.); @@ -927,19 +925,19 @@ struct AngularCorrelationsInJets { if (deltaRJet < Rmax) { if (deltaPhiJet != -999) - registryQA.fill(HIST("hDeltaEtadeltaPhiJet"), deltaEtaJet, deltaPhiJet); + registryQA.fill(HIST("deltaEtadeltaPhiJet"), deltaEtaJet, deltaPhiJet); NchJetPlusUE++; ptJetPlusUE = ptJetPlusUE + track.pt(); } if (deltaRUE1 < Rmax) { if (deltaPhiUE1 != -999) - registryQA.fill(HIST("hDeltaEtadeltaPhiUE"), deltaEtaUE1, deltaPhiUE1); + registryQA.fill(HIST("deltaEtadeltaPhiUE"), deltaEtaUE1, deltaPhiUE1); NchUE++; ptUE = ptUE + track.pt(); } if (deltaRUE2 < Rmax) { if (deltaPhiUE2 != -999) - registryQA.fill(HIST("hDeltaEtadeltaPhiUE"), deltaEtaUE2, deltaPhiUE2); + registryQA.fill(HIST("deltaEtadeltaPhiUE"), deltaEtaUE2, deltaPhiUE2); NchUE++; ptUE = ptUE + track.pt(); } @@ -947,23 +945,23 @@ struct AngularCorrelationsInJets { NchJet = NchJetPlusUE - 0.5 * NchUE; ptJet = ptJetPlusUE - 0.5 * ptUE; - registryQA.fill(HIST("hMultiplicityJetPlusUE"), NchJetPlusUE); - registryQA.fill(HIST("hMultiplicityJet"), NchJet); - registryQA.fill(HIST("hMultiplicityUE"), 0.5 * NchUE); - registryQA.fill(HIST("hPtJetPlusUE"), ptJetPlusUE); - registryQA.fill(HIST("hPtJet"), ptJet); - registryQA.fill(HIST("hPtUE"), 0.5 * ptUE); - registryQA.fill(HIST("hDeltaJetPt"), jet.pt() - ptJetPlusUE); + registryQA.fill(HIST("multiplicityJetPlusUE"), NchJetPlusUE); + registryQA.fill(HIST("multiplicityJet"), NchJet); + registryQA.fill(HIST("multiplicityUE"), 0.5 * NchUE); + registryQA.fill(HIST("ptJetPlusUE"), ptJetPlusUE); + registryQA.fill(HIST("ptJet"), ptJet); + registryQA.fill(HIST("ptUE"), 0.5 * ptUE); + registryQA.fill(HIST("deltaJetPt"), jet.pt() - ptJetPlusUE); int nPartClusteredJet = static_cast(constituents.size()); // Fill QA Histograms if (ptJetPlusUE < minJetPt) { // swap for sub pt? - registryQA.fill(HIST("hNParticlesClusteredInJet"), nPartClusteredJet); + registryQA.fill(HIST("nParticlesClusteredInJet"), nPartClusteredJet); for (const auto& track : constituents) { - registryQA.fill(HIST("hPtParticlesClusteredInJet"), track.pt()); + registryQA.fill(HIST("ptParticlesClusteredInJet"), track.pt()); } } @@ -979,66 +977,64 @@ struct AngularCorrelationsInJets { fTempBufferJet.clear(); for (int i = 0; i < static_cast(constituents.size()); i++) { // analyse jet constituents - this is where the magic happens - registryData.fill(HIST("hTrackProtocol"), 3); + registryData.fill(HIST("trackProtocol"), 3); fastjet::PseudoJet pseudoParticle = constituents.at(i); int id = pseudoParticle.user_index(); const auto& jetParticle = particles.at(id); jetAll.emplace_back(jetParticle); - registryData.fill(HIST("hDCAxyFullJet"), jetParticle.pt() * jetParticle.sign(), jetParticle.dcaXY()); - registryData.fill(HIST("hDCAzFullJet"), jetParticle.pt() * jetParticle.sign(), jetParticle.dcaZ()); - registryData.fill(HIST("hTPCsignal"), jetParticle.pt() * jetParticle.sign(), jetParticle.tpcSignal()); + registryData.fill(HIST("dcaXYFullJet"), jetParticle.pt() * jetParticle.sign(), jetParticle.dcaXY()); + registryData.fill(HIST("dcaZFullJet"), jetParticle.pt() * jetParticle.sign(), jetParticle.dcaZ()); + registryData.fill(HIST("tpcSignal"), jetParticle.pt() * jetParticle.sign(), jetParticle.tpcSignal()); if (jetParticle.hasTOF()) { - registryData.fill(HIST("hTOFsignal"), jetParticle.pt() * jetParticle.sign(), jetParticle.beta()); + registryData.fill(HIST("tofSignal"), jetParticle.pt() * jetParticle.sign(), jetParticle.beta()); } double ptDiff = pseudoParticle.pt() - jetParticle.pt(); - registryQA.fill(HIST("hPtDiff"), ptDiff); + registryQA.fill(HIST("ptDiff"), ptDiff); if (jetParticle.pt() < minJetParticlePt) continue; if (isProton(jetParticle, false)) { // collect protons in jet - registryData.fill(HIST("hPtJetProton"), jetParticle.pt()); - registryQA.fill(HIST("hPtJetProtonVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); - registryData.fill(HIST("hTrackProtocol"), 4); // # protons + registryData.fill(HIST("ptJetProton"), jetParticle.pt()); + registryQA.fill(HIST("ptJetProtonVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); + registryData.fill(HIST("trackProtocol"), 4); // # protons if (isProton(jetParticle, true)) { - registryData.fill(HIST("hTrackProtocol"), 5); // # high purity protons + registryData.fill(HIST("trackProtocol"), 5); // # high purity protons jetProtons.emplace_back(jetParticle); - registryData.fill(HIST("hDCAzJetProton"), jetParticle.pt(), jetParticle.dcaZ()); + registryData.fill(HIST("dcaZJetProton"), jetParticle.pt(), jetParticle.dcaZ()); } } else if (isAntiproton(jetParticle, false)) { // collect antiprotons in jet - registryData.fill(HIST("hPtJetAntiproton"), jetParticle.pt()); - registryQA.fill(HIST("hPtJetAntiprotonVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); - registryData.fill(HIST("hTrackProtocol"), 6); // # antiprotons + registryData.fill(HIST("ptJetAntiproton"), jetParticle.pt()); + registryQA.fill(HIST("ptJetAntiprotonVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); + registryData.fill(HIST("trackProtocol"), 6); // # antiprotons if (isAntiproton(jetParticle, true)) { - registryData.fill(HIST("hTrackProtocol"), 7); // # high purity antiprotons + registryData.fill(HIST("trackProtocol"), 7); // # high purity antiprotons jetAntiprotons.emplace_back(jetParticle); - registryData.fill(HIST("hDCAzJetAntiproton"), jetParticle.pt(), jetParticle.dcaZ()); + registryData.fill(HIST("dcaZJetAntiproton"), jetParticle.pt(), jetParticle.dcaZ()); } } else if (isNucleus(jetParticle)) { // collect nuclei in jet - registryData.fill(HIST("hPtJetNuclei"), jetParticle.pt()); - registryQA.fill(HIST("hPtJetNucleiVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); - registryData.fill(HIST("hTrackProtocol"), 8); // # nuclei - registryData.fill(HIST("hDCAzJetNuclei"), jetParticle.pt(), jetParticle.dcaZ()); + registryData.fill(HIST("ptJetNuclei"), jetParticle.pt()); + registryQA.fill(HIST("ptJetNucleiVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); + registryData.fill(HIST("trackProtocol"), 8); // # nuclei + registryData.fill(HIST("dcaZJetNuclei"), jetParticle.pt(), jetParticle.dcaZ()); } else if (isAntinucleus(jetParticle)) { - registryData.fill(HIST("hPtJetAntinuclei"), jetParticle.pt()); - registryQA.fill(HIST("hPtJetAntinucleiVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); - registryData.fill(HIST("hTrackProtocol"), 10); // # antinuclei - registryData.fill(HIST("hDCAzJetAntinuclei"), jetParticle.pt(), jetParticle.dcaZ()); + registryData.fill(HIST("ptJetAntinuclei"), jetParticle.pt()); + registryQA.fill(HIST("ptJetAntinucleiVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); + registryData.fill(HIST("trackProtocol"), 10); // # antinuclei + registryData.fill(HIST("dcaZJetAntinuclei"), jetParticle.pt(), jetParticle.dcaZ()); } else if (isPion(jetParticle)) { - registryData.fill(HIST("hPtJetPion"), jetParticle.pt()); - registryQA.fill(HIST("hPtJetPionVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); - registryData.fill(HIST("hTrackProtocol"), 11); // # antinuclei - registryData.fill(HIST("hDCAzJetPion"), jetParticle.pt(), jetParticle.dcaZ()); + registryQA.fill(HIST("ptJetPionVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); + registryData.fill(HIST("trackProtocol"), 11); // # antinuclei + registryData.fill(HIST("dcaZJetPion"), jetParticle.pt(), jetParticle.dcaZ()); if (jetParticle.sign() > 0) { jetPiPlus.emplace_back(jetParticle); } else if (jetParticle.sign() < 0) { jetPiMinus.emplace_back(jetParticle); } } else if (isKaon(jetParticle)) { - registryData.fill(HIST("hPtJetKaon"), jetParticle.pt()); - registryQA.fill(HIST("hPtJetKaonVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); - registryData.fill(HIST("hTrackProtocol"), 12); // # antinuclei - registryData.fill(HIST("hDCAzJetKaon"), jetParticle.pt(), jetParticle.dcaZ()); + registryQA.fill(HIST("ptJetKaonVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); + registryData.fill(HIST("trackProtocol"), 12); // # antinuclei + registryData.fill(HIST("dcaZJetKaon"), jetParticle.pt(), jetParticle.dcaZ()); } } // for (int i=0; i(constituents.size()); i++) @@ -1054,7 +1050,7 @@ struct AngularCorrelationsInJets { } if ((jetProtons.size() < 2) && (jetAntiprotons.size() < 2)) return jetCounter; - registryData.fill(HIST("hEventProtocol"), 6); + registryData.fill(HIST("eventProtocol"), 6); if (jetProtons.size() > 1) { doCorrelations(jetProtons, fBufferProton, fTempBufferProton, 1, pJet); @@ -1096,35 +1092,23 @@ struct AngularCorrelationsInJets { if (!selectTrack(track)) continue; - double mass; - if (useTOFmass) { - if (track.hasTOF()) { - mass = track.mass(); // check reliability, maybe use only pion mass - registryQA.fill(HIST("hTOFmass"), track.pt(), track.mass()); - registryData.fill(HIST("hTrackProtocol"), 1); - } else { - mass = 0.139; // pion mass as default, ~80% are pions - registryData.fill(HIST("hTrackProtocol"), 2); - } - } else { - mass = 0.139; - } + double mass = 0.139; if (track.tpcNClsFindable() != 0) { - registryQA.fill(HIST("hRatioCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows() / track.tpcNClsFindable()); + registryQA.fill(HIST("ratioCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows() / track.tpcNClsFindable()); } - registryQA.fill(HIST("hPtFullEvent"), track.pt()); - registryQA.fill(HIST("hCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows()); - registryQA.fill(HIST("hClusterITS"), track.pt(), track.itsNCls()); - registryQA.fill(HIST("hClusterTPC"), track.pt(), track.tpcNClsFound()); - registryQA.fill(HIST("hChi2ITS"), track.pt(), track.itsChi2NCl()); - registryQA.fill(HIST("hChi2TPC"), track.pt(), track.tpcChi2NCl()); - registryQA.fill(HIST("hDCAxyFullEvent"), track.pt(), track.dcaXY()); - registryQA.fill(HIST("hDCAzFullEvent"), track.pt(), track.dcaZ()); - registryQA.fill(HIST("hPhiFullEvent"), track.phi()); - registryQA.fill(HIST("hPhiPtFullEvent"), track.pt(), track.phi()); - registryQA.fill(HIST("hEtaFullEvent"), track.eta()); - registryQA.fill(HIST("hEtaPtFullEvent"), track.pt(), track.eta()); + registryQA.fill(HIST("ptFullEvent"), track.pt()); + registryQA.fill(HIST("crossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows()); + registryQA.fill(HIST("clusterITS"), track.pt(), track.itsNCls()); + registryQA.fill(HIST("clusterTPC"), track.pt(), track.tpcNClsFound()); + registryQA.fill(HIST("chi2ITS"), track.pt(), track.itsChi2NCl()); + registryQA.fill(HIST("chi2TPC"), track.pt(), track.tpcChi2NCl()); + registryQA.fill(HIST("dcaXYFullEvent"), track.pt(), track.dcaXY()); + registryQA.fill(HIST("dcaZFullEvent"), track.pt(), track.dcaZ()); + registryQA.fill(HIST("phiFullEvent"), track.phi()); + registryQA.fill(HIST("phiPtFullEvent"), track.pt(), track.phi()); + registryQA.fill(HIST("etaFullEvent"), track.eta()); + registryQA.fill(HIST("etaPtFullEvent"), track.pt(), track.eta()); fastjet::PseudoJet inputPseudoJet(track.px(), track.py(), track.pz(), track.energy(mass)); inputPseudoJet.set_user_index(index); @@ -1137,7 +1121,7 @@ struct AngularCorrelationsInJets { if (jetInput.size() < 2) return; - registryData.fill(HIST("hEventProtocol"), 2); + registryData.fill(HIST("eventProtocol"), 2); // Reconstruct Jets double ghost_maxrap = 1.0; @@ -1153,7 +1137,7 @@ struct AngularCorrelationsInJets { if (jets.size() == 0) return; - registryData.fill(HIST("hEventProtocol"), 3); + registryData.fill(HIST("eventProtocol"), 3); bool doSparse = true; auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(jetInput, doSparse); @@ -1162,7 +1146,7 @@ struct AngularCorrelationsInJets { for (const auto& jet : jets) { jetCounter = analyseJet(jetCounter, jet, particles, jetProtons, jetAntiprotons, jetPiPlus, jetPiMinus, jetAll, rho, rhoM, rhoPerp, rhoMPerp); } - registryData.fill(HIST("hNumJetsInEvent"), jetCounter); + registryData.fill(HIST("numJetsInEvent"), jetCounter); TVector3 hardestJetAxis(jets.at(0).px(), jets.at(0).py(), jets.at(0).pz()); // for full event, use hardest jet as orientation doCorrelations(particlesForCF, fBufferFull, fTempBufferFull, -1, hardestJetAxis); @@ -1198,35 +1182,23 @@ struct AngularCorrelationsInJets { if (!selectTrack(track)) continue; - double mass; - if (useTOFmass) { - if (track.hasTOF()) { - mass = track.mass(); // check reliability, maybe use only pion mass - registryQA.fill(HIST("hTOFmass"), track.pt(), track.mass()); - registryData.fill(HIST("hTrackProtocol"), 1); - } else { - mass = 0.139; // pion mass as default, ~80% are pions - registryData.fill(HIST("hTrackProtocol"), 2); - } - } else { - mass = 0.139; - } + double mass = 0.139; // pion mass for input because 80% is pions anyway if (track.tpcNClsFindable() != 0) { - registryQA.fill(HIST("hRatioCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows() / track.tpcNClsFindable()); + registryQA.fill(HIST("ratioCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows() / track.tpcNClsFindable()); } - registryQA.fill(HIST("hPtFullEvent"), track.pt()); - registryQA.fill(HIST("hCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows()); - registryQA.fill(HIST("hClusterITS"), track.pt(), track.itsNCls()); - registryQA.fill(HIST("hClusterTPC"), track.pt(), track.tpcNClsFound()); - registryQA.fill(HIST("hChi2ITS"), track.pt(), track.itsChi2NCl()); - registryQA.fill(HIST("hChi2TPC"), track.pt(), track.tpcChi2NCl()); - registryQA.fill(HIST("hDCAxyFullEvent"), track.pt(), track.dcaXY()); - registryQA.fill(HIST("hDCAzFullEvent"), track.pt(), track.dcaZ()); - registryQA.fill(HIST("hPhiFullEvent"), track.phi()); - registryQA.fill(HIST("hPhiPtFullEvent"), track.pt(), track.phi()); - registryQA.fill(HIST("hEtaFullEvent"), track.eta()); - registryQA.fill(HIST("hEtaPtFullEvent"), track.pt(), track.eta()); + registryQA.fill(HIST("ptFullEvent"), track.pt()); + registryQA.fill(HIST("crossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows()); + registryQA.fill(HIST("clusterITS"), track.pt(), track.itsNCls()); + registryQA.fill(HIST("clusterTPC"), track.pt(), track.tpcNClsFound()); + registryQA.fill(HIST("chi2ITS"), track.pt(), track.itsChi2NCl()); + registryQA.fill(HIST("chi2TPC"), track.pt(), track.tpcChi2NCl()); + registryQA.fill(HIST("dcaXYFullEvent"), track.pt(), track.dcaXY()); + registryQA.fill(HIST("dcaZFullEvent"), track.pt(), track.dcaZ()); + registryQA.fill(HIST("phiFullEvent"), track.phi()); + registryQA.fill(HIST("phiPtFullEvent"), track.pt(), track.phi()); + registryQA.fill(HIST("etaFullEvent"), track.eta()); + registryQA.fill(HIST("etaPtFullEvent"), track.pt(), track.eta()); fastjet::PseudoJet inputPseudoJet(track.px(), track.py(), track.pz(), track.energy(mass)); inputPseudoJet.set_user_index(index); @@ -1239,7 +1211,7 @@ struct AngularCorrelationsInJets { if (jetInput.size() < 2) return; - registryData.fill(HIST("hEventProtocol"), 2); + registryData.fill(HIST("eventProtocol"), 2); // Reconstruct Jets double ghost_maxrap = 1.0; @@ -1255,7 +1227,7 @@ struct AngularCorrelationsInJets { if (jets.size() == 0) return; - registryData.fill(HIST("hEventProtocol"), 3); + registryData.fill(HIST("eventProtocol"), 3); bool doSparse = true; auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(jetInput, doSparse); @@ -1275,35 +1247,35 @@ struct AngularCorrelationsInJets { continue; switch (jetParticle.mcParticle().pdgCode()) { case 2212: - registryMC.fill(HIST("hNumberOfTruthParticles"), 0); - registryMC.fill(HIST("hPtJetProtonMC"), jetParticle.pt()); + registryMC.fill(HIST("numberOfTruthParticles"), 0); + registryMC.fill(HIST("ptJetProtonMC"), jetParticle.pt()); break; case -2212: - registryMC.fill(HIST("hNumberOfTruthParticles"), 1); - registryMC.fill(HIST("hPtJetAntiprotonMC"), jetParticle.pt()); + registryMC.fill(HIST("numberOfTruthParticles"), 1); + registryMC.fill(HIST("ptJetAntiprotonMC"), jetParticle.pt()); break; case 1000010020: - registryMC.fill(HIST("hNumberOfTruthParticles"), 2); - registryMC.fill(HIST("hPtJetNucleiMC"), jetParticle.pt()); + registryMC.fill(HIST("numberOfTruthParticles"), 2); + registryMC.fill(HIST("ptJetNucleiMC"), jetParticle.pt()); break; case -1000010020: - registryMC.fill(HIST("hNumberOfTruthParticles"), 3); - registryMC.fill(HIST("hPtJetAntinucleiMC"), jetParticle.pt()); + registryMC.fill(HIST("numberOfTruthParticles"), 3); + registryMC.fill(HIST("ptJetAntinucleiMC"), jetParticle.pt()); break; case 1000020030: - registryMC.fill(HIST("hNumberOfTruthParticles"), 4); - registryMC.fill(HIST("hPtJetNucleiMC"), jetParticle.pt()); + registryMC.fill(HIST("numberOfTruthParticles"), 4); + registryMC.fill(HIST("ptJetNucleiMC"), jetParticle.pt()); break; case -1000020030: - registryMC.fill(HIST("hNumberOfTruthParticles"), 5); - registryMC.fill(HIST("hPtJetAntinucleiMC"), jetParticle.pt()); + registryMC.fill(HIST("numberOfTruthParticles"), 5); + registryMC.fill(HIST("ptJetAntinucleiMC"), jetParticle.pt()); break; default: continue; } } // for (const auto& constituent : jet.constituents()) } // for (const auto& jet : jets) - registryData.fill(HIST("hNumJetsInEvent"), jetCounter); + registryData.fill(HIST("numJetsInEvent"), jetCounter); TVector3 hardestJetAxis(jets.at(0).px(), jets.at(0).py(), jets.at(0).pz()); // for full event, use hardest jet as orientation doCorrelations(particlesForCF, fBufferFull, fTempBufferFull, -1, hardestJetAxis); @@ -1318,11 +1290,11 @@ struct AngularCorrelationsInJets { auto bc = collision.bc_as(); initCCDB(bc); - registryData.fill(HIST("hEventProtocol"), 0); + registryData.fill(HIST("eventProtocol"), 0); if (!collision.alias_bit(kINT7)) continue; - registryData.fill(HIST("hNumberOfEvents"), 0); - registryData.fill(HIST("hEventProtocol"), 1); + registryData.fill(HIST("numberOfEvents"), 0); + registryData.fill(HIST("eventProtocol"), 1); auto slicedTracks = tracks.sliceBy(perCollisionFullTracksRun2, collision.globalIndex()); @@ -1335,11 +1307,11 @@ struct AngularCorrelationsInJets { soa::Filtered const& tracks) { for (const auto& collision : collisions) { - registryData.fill(HIST("hEventProtocol"), 0); + registryData.fill(HIST("eventProtocol"), 0); if (!collision.sel8()) continue; - registryData.fill(HIST("hNumberOfEvents"), 0); - registryData.fill(HIST("hEventProtocol"), 1); + registryData.fill(HIST("numberOfEvents"), 0); + registryData.fill(HIST("eventProtocol"), 1); if (TMath::Abs(collision.posZ()) > zVtx) continue; @@ -1351,12 +1323,12 @@ struct AngularCorrelationsInJets { PROCESS_SWITCH(AngularCorrelationsInJets, processRun3, "process Run 3 data", false); // using JetTracksMCDwID = soa::Join; - void processRun3revised(soa::Filtered>::iterator const& collision, soa::Filtered> const& allJets, /* JTracksRun3 const& jtracks, soa::Join const&, */ soa::Filtered const&) // check how to use bkg sub jets --- table or recluster + bkg sub? + void processRun3revised(soa::Filtered>::iterator const& collision, soa::Filtered> const& allJets, soa::Filtered const&) // check how to use bkg sub jets --- table or recluster + bkg sub? { - registryData.fill(HIST("hEventProtocol"), 0); + registryData.fill(HIST("eventProtocol"), 0); if (!jetderiveddatautilities::selectCollision(collision, eventSelection)) - return registryData.fill(HIST("hNumberOfEvents"), 0); - registryData.fill(HIST("hEventProtocol"), 1); + return registryData.fill(HIST("numberOfEvents"), 0); + registryData.fill(HIST("eventProtocol"), 1); int jetCounter = 0; @@ -1385,32 +1357,32 @@ struct AngularCorrelationsInJets { TVector3 pJet(0., 0., 0.); pJet.SetXYZ(jet.px(), jet.py(), jet.pz()); - registryData.fill(HIST("hNumberOfJets"), 0); - registryData.fill(HIST("hPtTotalJet"), jet.pt()); - registryData.fill(HIST("hJetRapidity"), jet.eta()); - registryData.fill(HIST("hNumPartInJet"), jet.tracksIds().size()); - registryQA.fill(HIST("hJetPtVsNumPart"), jet.pt(), jet.tracksIds().size()); - registryQA.fill(HIST("hMaxRadiusVsPt"), jet.pt(), jet.r()); + registryData.fill(HIST("numberOfJets"), 0); + registryData.fill(HIST("ptTotalJet"), jet.pt()); + registryData.fill(HIST("jetRapidity"), jet.eta()); + registryData.fill(HIST("numPartInJet"), jet.tracksIds().size()); + registryQA.fill(HIST("jetPtVsNumPart"), jet.pt(), jet.tracksIds().size()); + registryQA.fill(HIST("maxRadiusVsPt"), jet.pt(), jet.r()); for (const auto& track : jet.template tracks_as()) { // slice on jets? if (!selectTrack(track)) continue; if (track.tpcNClsFindable() != 0) { - registryQA.fill(HIST("hRatioCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows() / track.tpcNClsFindable()); + registryQA.fill(HIST("ratioCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows() / track.tpcNClsFindable()); } - registryQA.fill(HIST("hPtJetParticle"), track.pt()); - registryQA.fill(HIST("hCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows()); - registryQA.fill(HIST("hClusterITS"), track.pt(), track.itsNCls()); - registryQA.fill(HIST("hClusterTPC"), track.pt(), track.tpcNClsFound()); - registryQA.fill(HIST("hChi2ITS"), track.pt(), track.itsChi2NCl()); - registryQA.fill(HIST("hChi2TPC"), track.pt(), track.tpcChi2NCl()); - registryQA.fill(HIST("hDCAxyFullEvent"), track.pt(), track.dcaXY()); - registryQA.fill(HIST("hDCAzFullEvent"), track.pt(), track.dcaZ()); - registryQA.fill(HIST("hPhiJet"), track.phi()); - registryQA.fill(HIST("hPhiPtJet"), track.pt(), track.phi()); - registryQA.fill(HIST("hEtaJet"), track.eta()); - registryQA.fill(HIST("hEtaPtJet"), track.pt(), track.eta()); + registryQA.fill(HIST("ptJetParticle"), track.pt()); + registryQA.fill(HIST("crossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows()); + registryQA.fill(HIST("clusterITS"), track.pt(), track.itsNCls()); + registryQA.fill(HIST("clusterTPC"), track.pt(), track.tpcNClsFound()); + registryQA.fill(HIST("chi2ITS"), track.pt(), track.itsChi2NCl()); + registryQA.fill(HIST("chi2TPC"), track.pt(), track.tpcChi2NCl()); + registryQA.fill(HIST("dcaXYFullEvent"), track.pt(), track.dcaXY()); + registryQA.fill(HIST("dcaZFullEvent"), track.pt(), track.dcaZ()); + registryQA.fill(HIST("phiJet"), track.phi()); + registryQA.fill(HIST("phiPtJet"), track.pt(), track.phi()); + registryQA.fill(HIST("etaJet"), track.eta()); + registryQA.fill(HIST("etaPtJet"), track.pt(), track.eta()); if (!std::isnan(track.phi()) && !std::isnan(jet.phi())) { // geometric jet cone double DeltaPhi = TVector2::Phi_0_2pi(track.phi() - jet.phi()); @@ -1418,65 +1390,63 @@ struct AngularCorrelationsInJets { DeltaPhi = DeltaPhi - 2 * TMath::Pi(); double DeltaEta = track.eta() - jet.eta(); double Delta = TMath::Sqrt(DeltaPhi * DeltaPhi + DeltaEta * DeltaEta); - registryQA.fill(HIST("hJetConeRadius"), Delta); + registryQA.fill(HIST("jetConeRadius"), Delta); } // analyse jet constituents - this is where the magic happens - registryData.fill(HIST("hTrackProtocol"), 3); + registryData.fill(HIST("trackProtocol"), 3); jetAll.emplace_back(track); - registryData.fill(HIST("hDCAxyFullJet"), track.pt() * track.sign(), track.dcaXY()); - registryData.fill(HIST("hDCAzFullJet"), track.pt() * track.sign(), track.dcaZ()); - registryData.fill(HIST("hTPCsignal"), track.pt() * track.sign(), track.tpcSignal()); + registryData.fill(HIST("dcaXYFullJet"), track.pt() * track.sign(), track.dcaXY()); + registryData.fill(HIST("dcaZFullJet"), track.pt() * track.sign(), track.dcaZ()); + registryData.fill(HIST("tpcSignal"), track.pt() * track.sign(), track.tpcSignal()); if (track.hasTOF()) { - registryData.fill(HIST("hTOFsignal"), track.pt() * track.sign(), track.beta()); + registryData.fill(HIST("tofSignal"), track.pt() * track.sign(), track.beta()); } // double ptDiff = pseudoParticle.pt() - track.pt(); - // registryQA.fill(HIST("hPtDiff"), ptDiff); + // registryQA.fill(HIST("ptDiff"), ptDiff); if (isProton(track, false)) { // collect protons in jet - registryData.fill(HIST("hPtJetProton"), track.pt()); - registryQA.fill(HIST("hPtJetProtonVsTotalJet"), track.pt(), jet.pt()); - registryData.fill(HIST("hTrackProtocol"), 4); // # protons + registryData.fill(HIST("ptJetProton"), track.pt()); + registryQA.fill(HIST("ptJetProtonVsTotalJet"), track.pt(), jet.pt()); + registryData.fill(HIST("trackProtocol"), 4); // # protons if (isProton(track, true)) { - registryData.fill(HIST("hTrackProtocol"), 5); // # high purity protons + registryData.fill(HIST("trackProtocol"), 5); // # high purity protons jetProtons.emplace_back(track); - registryData.fill(HIST("hDCAzJetProton"), track.pt(), track.dcaZ()); + registryData.fill(HIST("dcaZJetProton"), track.pt(), track.dcaZ()); } } else if (isAntiproton(track, false)) { // collect antiprotons in jet - registryData.fill(HIST("hPtJetAntiproton"), track.pt()); - registryQA.fill(HIST("hPtJetAntiprotonVsTotalJet"), track.pt(), jet.pt()); - registryData.fill(HIST("hTrackProtocol"), 6); // # antiprotons + registryData.fill(HIST("ptJetAntiproton"), track.pt()); + registryQA.fill(HIST("ptJetAntiprotonVsTotalJet"), track.pt(), jet.pt()); + registryData.fill(HIST("trackProtocol"), 6); // # antiprotons if (isAntiproton(track, true)) { - registryData.fill(HIST("hTrackProtocol"), 7); // # high purity antiprotons + registryData.fill(HIST("trackProtocol"), 7); // # high purity antiprotons jetAntiprotons.emplace_back(track); - registryData.fill(HIST("hDCAzJetAntiproton"), track.pt(), track.dcaZ()); + registryData.fill(HIST("dcaZJetAntiproton"), track.pt(), track.dcaZ()); } } else if (isNucleus(track)) { // collect nuclei in jet - registryData.fill(HIST("hPtJetNuclei"), track.pt()); - registryQA.fill(HIST("hPtJetNucleiVsTotalJet"), track.pt(), jet.pt()); - registryData.fill(HIST("hTrackProtocol"), 8); // # nuclei - registryData.fill(HIST("hDCAzJetNuclei"), track.pt(), track.dcaZ()); + registryData.fill(HIST("ptJetNuclei"), track.pt()); + registryQA.fill(HIST("ptJetNucleiVsTotalJet"), track.pt(), jet.pt()); + registryData.fill(HIST("trackProtocol"), 8); // # nuclei + registryData.fill(HIST("dcaZJetNuclei"), track.pt(), track.dcaZ()); } else if (isAntinucleus(track)) { - registryData.fill(HIST("hPtJetAntinuclei"), track.pt()); - registryQA.fill(HIST("hPtJetAntinucleiVsTotalJet"), track.pt(), jet.pt()); - registryData.fill(HIST("hTrackProtocol"), 10); // # antinuclei - registryData.fill(HIST("hDCAzJetAntinuclei"), track.pt(), track.dcaZ()); + registryData.fill(HIST("ptJetAntinuclei"), track.pt()); + registryQA.fill(HIST("ptJetAntinucleiVsTotalJet"), track.pt(), jet.pt()); + registryData.fill(HIST("trackProtocol"), 10); // # antinuclei + registryData.fill(HIST("dcaZJetAntinuclei"), track.pt(), track.dcaZ()); } else if (isPion(track)) { - registryData.fill(HIST("hPtJetPion"), track.pt()); - registryQA.fill(HIST("hPtJetPionVsTotalJet"), track.pt(), jet.pt()); - registryData.fill(HIST("hTrackProtocol"), 11); // # antinuclei - registryData.fill(HIST("hDCAzJetPion"), track.pt(), track.dcaZ()); + registryQA.fill(HIST("ptJetPionVsTotalJet"), track.pt(), jet.pt()); + registryData.fill(HIST("trackProtocol"), 11); // # antinuclei + registryData.fill(HIST("dcaZJetPion"), track.pt(), track.dcaZ()); if (track.sign() > 0) { jetPiPlus.emplace_back(track); } else if (track.sign() < 0) { jetPiMinus.emplace_back(track); } } else if (isKaon(track)) { - registryData.fill(HIST("hPtJetKaon"), track.pt()); - registryQA.fill(HIST("hPtJetKaonVsTotalJet"), track.pt(), jet.pt()); - registryData.fill(HIST("hTrackProtocol"), 12); // # antinuclei - registryData.fill(HIST("hDCAzJetKaon"), track.pt(), track.dcaZ()); + registryQA.fill(HIST("ptJetKaonVsTotalJet"), track.pt(), jet.pt()); + registryData.fill(HIST("trackProtocol"), 12); // # antinuclei + registryData.fill(HIST("dcaZJetKaon"), track.pt(), track.dcaZ()); } } // for (const auto& jtrack : jtracks) @@ -1491,7 +1461,7 @@ struct AngularCorrelationsInJets { } if ((jetProtons.size() < 2) && (jetAntiprotons.size() < 2) && jetPiPlus.size() < 2 && jetPiMinus.size() < 2) continue; - registryData.fill(HIST("hEventProtocol"), 6); + registryData.fill(HIST("eventProtocol"), 6); if (jetProtons.size() > 1) { doCorrelations(jetProtons, fBufferProton, fTempBufferProton, 1, pJet); @@ -1511,7 +1481,7 @@ struct AngularCorrelationsInJets { } } // for (const auto& jet : allJets) - registryData.fill(HIST("hNumJetsInEvent"), jetCounter); + registryData.fill(HIST("numJetsInEvent"), jetCounter); } PROCESS_SWITCH(AngularCorrelationsInJets, processRun3revised, "process Run 3 data w jet tables", true); @@ -1521,11 +1491,11 @@ struct AngularCorrelationsInJets { auto bc = collision.bc_as(); initCCDB(bc); - registryData.fill(HIST("hEventProtocol"), 0); + registryData.fill(HIST("eventProtocol"), 0); if (!collision.alias_bit(kINT7)) continue; - registryData.fill(HIST("hNumberOfEvents"), 0); - registryData.fill(HIST("hEventProtocol"), 1); + registryData.fill(HIST("numberOfEvents"), 0); + registryData.fill(HIST("eventProtocol"), 1); auto slicedTracks = tracks.sliceBy(perCollisionMcTracksRun2, collision.globalIndex()); @@ -1537,11 +1507,11 @@ struct AngularCorrelationsInJets { void processMCRun3(McCollisions const& collisions, soa::Filtered const& tracks, aod::McParticles&, aod::McCollisions const&) { for (const auto& collision : collisions) { - registryData.fill(HIST("hEventProtocol"), 0); + registryData.fill(HIST("eventProtocol"), 0); if (!collision.sel8()) continue; - registryData.fill(HIST("hNumberOfEvents"), 0); - registryData.fill(HIST("hEventProtocol"), 1); + registryData.fill(HIST("numberOfEvents"), 0); + registryData.fill(HIST("eventProtocol"), 1); if (TMath::Abs(collision.posZ()) > zVtx) continue; From e328e04169df34e4e6e39f84102df303a2b48016 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Thu, 13 Feb 2025 04:53:55 +0100 Subject: [PATCH 0191/1650] [PWGLF] Update v0qaanalysis.cxx (#9923) --- PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx b/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx index bcb5724d1ef..93150345966 100644 --- a/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx +++ b/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx @@ -389,11 +389,11 @@ struct LfV0qaanalysis { v0.negTrack_as().tofNSigmaPi(), v0.posTrack_as().tofNSigmaPi(), v0.posTrack_as().hasTOF(), v0.negTrack_as().hasTOF(), lPDG, isDauK0Short, isDauLambda, isDauAntiLambda, isprimary, mcCollision.centFT0M(), cent, evFlag, v0.alpha(), v0.qtarm(), - v0.posTrack_as().tpcNClsCrossedRows(), v0.posTrack_as().tpcCrossedRowsOverFindableCls(), - v0.posTrack_as().tpcNClsShared(), v0.posTrack_as().itsChi2NCl(), + v0.posTrack_as().tpcNClsCrossedRows(), v0.posTrack_as().tpcCrossedRowsOverFindableCls(), + v0.posTrack_as().tpcNClsShared(), v0.posTrack_as().itsChi2NCl(), v0.posTrack_as().tpcChi2NCl(), - v0.negTrack_as().tpcNClsCrossedRows(), v0.negTrack_as().tpcCrossedRowsOverFindableCls(), - v0.negTrack_as().tpcNClsShared(), v0.negTrack_as().itsChi2NCl(), + v0.negTrack_as().tpcNClsCrossedRows(), v0.negTrack_as().tpcCrossedRowsOverFindableCls(), + v0.negTrack_as().tpcNClsShared(), v0.negTrack_as().itsChi2NCl(), v0.negTrack_as().tpcChi2NCl()); } } From 241b1768128dfbd7c48f651f1e677b22127aa4c0 Mon Sep 17 00:00:00 2001 From: dajones2 <140733426+dajones2@users.noreply.github.com> Date: Thu, 13 Feb 2025 06:21:51 +0000 Subject: [PATCH 0192/1650] [PWGJE] Removing dR = 0 bins (#9925) --- PWGJE/Tasks/jetHadronRecoil.cxx | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/PWGJE/Tasks/jetHadronRecoil.cxx b/PWGJE/Tasks/jetHadronRecoil.cxx index a1633992bea..16adb000489 100644 --- a/PWGJE/Tasks/jetHadronRecoil.cxx +++ b/PWGJE/Tasks/jetHadronRecoil.cxx @@ -218,6 +218,9 @@ struct JetHadronRecoil { double deltaPhi = RecoDecay::constrainAngle(jetWTA.phi() - jet.phi(), -o2::constants::math::PI); double deltaEta = jetWTA.eta() - jet.eta(); double dR = RecoDecay::sqrtSumOfSquares(deltaPhi, deltaEta); + if (dR == 0) { + return; + } registry.fill(HIST("hDeltaR"), dR, weight); registry.fill(HIST("hDeltaRpT"), jet.pt() - (rho * jet.area()), dR, weight); } @@ -323,6 +326,9 @@ struct JetHadronRecoil { double deltaPhi = RecoDecay::constrainAngle(jetWTA.phi() - jet.phi(), -o2::constants::math::PI); double deltaEta = jetWTA.eta() - jet.eta(); double dR = RecoDecay::sqrtSumOfSquares(deltaPhi, deltaEta); + if (dR == 0) { + return; + } registry.fill(HIST("hDeltaRPart"), dR, weight); registry.fill(HIST("hDeltaRpTPart"), jet.pt(), dR, weight); } @@ -413,6 +419,9 @@ struct JetHadronRecoil { break; } } + if (dR == 0 || dRp == 0) { + return; + } registry.fill(HIST("hPtMatched"), jetBase.pt() - (rho * jetBase.area()), jetTag.pt(), weight); registry.fill(HIST("hPhiMatched"), jetBase.phi(), jetTag.phi(), weight); registry.fill(HIST("hPtResolution"), jetTag.pt(), (jetTag.pt() - (jetBase.pt() - (rho * jetBase.area()))) / jetTag.pt(), weight); From d6a9237530380541e907a53a4398d5df3e50f132 Mon Sep 17 00:00:00 2001 From: cterrevo Date: Thu, 13 Feb 2025 08:32:28 +0100 Subject: [PATCH 0193/1650] [PWGHF] fix bug in Selector, and tune axis in task (#9926) Co-authored-by: ALICE Action Bot --- PWGHF/D2H/Tasks/taskXic.cxx | 4 +- .../candidateSelectorXicToPKPi.cxx | 42 +++++++++++++++++-- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskXic.cxx b/PWGHF/D2H/Tasks/taskXic.cxx index ec0d13cdd3e..6ec5e39a687 100644 --- a/PWGHF/D2H/Tasks/taskXic.cxx +++ b/PWGHF/D2H/Tasks/taskXic.cxx @@ -77,9 +77,9 @@ struct HfTaskXic { "registry", // histo not in pt bins { {"Data/hPt", "3-prong candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1D, {{360, 0., 36.}}}}, // pt Xic - {"Data/hEta", "3-prong candidates;candidate #it{eta};entries", {HistType::kTH1D, {{100, -5., 5.}}}}, // eta Xic + {"Data/hEta", "3-prong candidates;candidate #it{eta};entries", {HistType::kTH1D, {{100, -2., 2.}}}}, // eta Xic {"Data/hPhi", "3-prong candidates;candidate #varphi;entries", {HistType::kTH1D, {{72, 0., constants::math::TwoPI}}}}, // phi Xic - {"Data/hMass", "3-prong candidates; inv. mass (p K #pi) (GeV/#it{c}^{2})", {HistType::kTH1D, {{600, 2.18, 2.58}}}}, // mass Xic + {"Data/hMass", "3-prong candidates; inv. mass (p K #pi) (GeV/#it{c}^{2})", {HistType::kTH1D, {{600, 1.98, 2.58}}}}, // mass Xic {"Data/hMultiplicity", "multiplicity;multiplicity;entries", {HistType::kTH1D, {{1000, 0., 1000.}}}}, {"MC/generated/signal/hPtGenSig", "3-prong candidates (matched);#it{p}_{T}^{gen.} (GeV/#it{c});entries", {HistType::kTH1D, {{360, 0., 36.}}}}, {"MC/generated/signal/hPtGen", "MC particles (matched);#it{p}_{T}^{gen.} (GeV/#it{c});entries", {HistType::kTH1D, {{360, 0., 36.}}}}, diff --git a/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx b/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx index 7048be6c995..e77936a6fa5 100644 --- a/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx @@ -73,6 +73,10 @@ struct HfCandidateSelectorXicToPKPi { Configurable> onnxFileNames{"onnxFileNames", std::vector{"ModelHandler_onnx_XicToPKPi.onnx"}, "ONNX file names for each pT bin (if not from CCDB full path)"}; Configurable timestampCCDB{"timestampCCDB", -1, "timestamp of the ONNX file for ML model used to query in CCDB"}; Configurable loadModelsFromCCDB{"loadModelsFromCCDB", false, "Flag to enable or disable the loading of models from CCDB"}; + // QA switch + Configurable activateQA{"activateQA", true, "Flag to enable QA histogram"}; + + HistogramRegistry registry{"registry"}; o2::analysis::HfMlResponseXicToPKPi hfMlResponse; std::vector outputMlXicToPKPi = {}; @@ -96,6 +100,21 @@ struct HfCandidateSelectorXicToPKPi { selectorKaon = selectorPion; selectorProton = selectorPion; + if (activateQA) { + constexpr int kNBinsSelections = 1 + aod::SelectionStep::NSelectionSteps; + std::string labels[kNBinsSelections]; + labels[0] = "No selection"; + labels[1 + aod::SelectionStep::RecoSkims] = "Skims selection"; + labels[1 + aod::SelectionStep::RecoTopol] = "Skims & Topological selections"; + labels[1 + aod::SelectionStep::RecoPID] = "Skims & Topological & PID selections"; + labels[1 + aod::SelectionStep::RecoMl] = "ML selection"; + static const AxisSpec axisSelections = {kNBinsSelections, 0.5, kNBinsSelections + 0.5, ""}; + registry.add("hSelections", "Selections;;#it{p}_{T} (GeV/#it{c})", {HistType::kTH2F, {axisSelections, {(std::vector)binsPt, "#it{p}_{T} (GeV/#it{c})"}}}); + for (int iBin = 0; iBin < kNBinsSelections; ++iBin) { + registry.get(HIST("hSelections"))->GetXaxis()->SetBinLabel(iBin + 1, labels[iBin].data()); + } + } + if (applyMl) { hfMlResponse.configure(binsPtMl, cutsMl, cutDirMl, nClassesMl); if (loadModelsFromCCDB) { @@ -216,18 +235,24 @@ struct HfCandidateSelectorXicToPKPi { outputMlXicToPKPi.clear(); outputMlXicToPiKP.clear(); + auto ptCand = candidate.pt(); + if (!TESTBIT(candidate.hfflag(), aod::hf_cand_3prong::DecayType::XicToPKPi)) { hfSelXicToPKPiCandidate(statusXicToPKPi, statusXicToPiKP); if (applyMl) { hfMlXicToPKPiCandidate(outputMlXicToPKPi, outputMlXicToPiKP); } + if (activateQA) { + registry.fill(HIST("hSelections"), 1, ptCand); + } continue; } + if (activateQA) { + registry.fill(HIST("hSelections"), 2 + aod::SelectionStep::RecoSkims, ptCand); + } SETBIT(statusXicToPKPi, aod::SelectionStep::RecoSkims); SETBIT(statusXicToPiKP, aod::SelectionStep::RecoSkims); - auto ptCand = candidate.pt(); - auto trackPos1 = candidate.prong0_as(); // positive daughter (negative for the antiparticles) auto trackNeg = candidate.prong1_as(); // negative daughter (positive for the antiparticles) auto trackPos2 = candidate.prong2_as(); // positive daughter (negative for the antiparticles) @@ -262,6 +287,10 @@ struct HfCandidateSelectorXicToPKPi { SETBIT(statusXicToPiKP, aod::SelectionStep::RecoTopol); } + if (activateQA) { + registry.fill(HIST("hSelections"), 2 + aod::SelectionStep::RecoTopol, candidate.pt()); + } + auto pidXicToPKPi = -1; auto pidXicToPiKP = -1; @@ -277,6 +306,7 @@ struct HfCandidateSelectorXicToPKPi { TrackSelectorPID::Status pidTrackPos2Pion = TrackSelectorPID::Accepted; TrackSelectorPID::Status pidTrackNegKaon = TrackSelectorPID::Accepted; if (usePidTpcAndTof) { + pidTrackPos1Proton = selectorProton.statusTpcAndTof(trackPos1); pidTrackPos2Proton = selectorProton.statusTpcAndTof(trackPos2); pidTrackPos1Pion = selectorPion.statusTpcAndTof(trackPos1); @@ -324,6 +354,9 @@ struct HfCandidateSelectorXicToPKPi { if ((pidXicToPiKP == -1 || pidXicToPiKP == 1) && topolXicToPiKP) { SETBIT(statusXicToPiKP, aod::SelectionStep::RecoPID); } + if (activateQA) { + registry.fill(HIST("hSelections"), 2 + aod::SelectionStep::RecoPID, candidate.pt()); + } if (applyMl) { // ML selections @@ -350,7 +383,10 @@ struct HfCandidateSelectorXicToPKPi { SETBIT(statusXicToPKPi, aod::SelectionStep::RecoMl); } if (isSelectedMlXicToPiKP) { - SETBIT(statusXicToPKPi, aod::SelectionStep::RecoMl); + SETBIT(statusXicToPiKP, aod::SelectionStep::RecoMl); + } + if (activateQA) { + registry.fill(HIST("hSelections"), 2 + aod::SelectionStep::RecoMl, candidate.pt()); } } From 8be654be1d1a486a59a0be919a419d6c659e38c7 Mon Sep 17 00:00:00 2001 From: Yash Patley <52608802+yashpatley@users.noreply.github.com> Date: Thu, 13 Feb 2025 14:12:21 +0530 Subject: [PATCH 0194/1650] [PWGCF] Update lambdaR2Correlation.cxx (#9928) --- .../Tasks/lambdaR2Correlation.cxx | 341 ++++++++++++------ 1 file changed, 234 insertions(+), 107 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx index f905c4114f0..58a6efca60d 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx @@ -48,6 +48,16 @@ DECLARE_SOA_TABLE(LambdaCollisions, "AOD", "LAMBDACOLS", o2::soa::Index<>, aod::collision::PosZ); using LambdaCollision = LambdaCollisions::iterator; +namespace lambdamcgencollision +{ +} +DECLARE_SOA_TABLE(LambdaMcGenCollisions, "AOD", "LMCGENCOLS", o2::soa::Index<>, + lambdacollision::Cent, + o2::aod::mccollision::PosX, + o2::aod::mccollision::PosY, + o2::aod::mccollision::PosZ); +using LambdaMcGenCollision = LambdaMcGenCollisions::iterator; + namespace lambdatrack { DECLARE_SOA_INDEX_COLUMN(LambdaCollision, lambdaCollision); @@ -99,9 +109,10 @@ using LambdaTrackExt = LambdaTracksExt::iterator; namespace lambdamcgentrack { +DECLARE_SOA_INDEX_COLUMN(LambdaMcGenCollision, lambdaMcGenCollision); } DECLARE_SOA_TABLE(LambdaMcGenTracks, "AOD", "LMCGENTRACKS", o2::soa::Index<>, - lambdatrack::LambdaCollisionId, + lambdamcgentrack::LambdaMcGenCollisionId, o2::aod::mcparticle::Px, o2::aod::mcparticle::Py, o2::aod::mcparticle::Pz, @@ -123,12 +134,14 @@ using LambdaMcGenTrack = LambdaMcGenTracks::iterator; enum CollisionLabels { kTotColBeforeHasMcCollision = 1, kTotCol, - kPassSelCol + kPassSelCol, + kPassMultSelCol }; enum TrackLabels { kTracksBeforeHasMcParticle = 1, kAllV0Tracks, + kV0KShortMassRej, kNotLambdaNotAntiLambda, kV0IsBothLambdaAntiLambda, kNotLambdaAfterSel, @@ -187,13 +200,14 @@ struct LambdaTableProducer { Produces lambdaCollisionTable; Produces lambdaTrackTable; + Produces lambdaMCGenCollisionTable; Produces lambdaMCGenTrackTable; // Collisions - Configurable cMinZVtx{"cMinZVtx", -10.0, "z vertex cut"}; - Configurable cMaxZVtx{"cMaxZVtx", 10.0, "z vertex cut"}; - Configurable cMinCent{"cMinCent", 0., "Minimum Centrality"}; - Configurable cMaxCent{"cMaxCent", 100., "Maximum Centrality"}; + Configurable cMinZVtx{"cMinZVtx", -10.0, "Min VtxZ cut"}; + Configurable cMaxZVtx{"cMaxZVtx", 10.0, "Max VtxZ cut"}; + Configurable cMinMult{"cMinMult", 0., "Minumum Multiplicity"}; + Configurable cMaxMult{"cMaxMult", 100.0, "Maximum Multiplicity"}; Configurable cSel8Trig{"cSel8Trig", true, "Sel8 (T0A + T0C) Selection Run3"}; Configurable cInt7Trig{"cInt7Trig", false, "kINT7 MB Trigger"}; Configurable cSel7Trig{"cSel7Trig", false, "Sel7 (V0A + V0C) Selection Run2"}; @@ -241,8 +255,9 @@ struct LambdaTableProducer { Configurable cRecPrimaryLambda{"cRecPrimaryLambda", false, "Primary Reconstructed Lambda"}; Configurable cRecSecondaryLambda{"cRecSecondaryLambda", false, "Secondary Reconstructed Lambda"}; Configurable cGenPrimaryLambda{"cGenPrimaryLambda", true, "Primary Generated Lambda"}; + Configurable cGenSecondaryLambda{"cGenSecondaryLambda", false, "Secondary Generated Lambda"}; Configurable cGenDecayChannel{"cGenDecayChannel", true, "Gen Level Decay Channel Flag"}; - Configurable cMcGenDauTrackKinCutFlag{"cMcGenDauTrackKinCutFlag", true, "Gen Level Daughter Track Kinematic Cut Flag"}; + Configurable cMcGenDauTrackKinCutFlag{"cMcGenDauTrackKinCutFlag", false, "Gen Level Daughter Track Kinematic Cut Flag"}; // Efficiency Correction Configurable cCorrectionFlag{"cCorrectionFlag", false, "Efficiency Correction Flag"}; @@ -341,11 +356,18 @@ struct LambdaTableProducer { histos.add("QA/Lambda/h2f_pos_prong_tpc_nsigma_pi_vs_p", "TPC n#sigma Pos Prong", kTH2F, {axisMomPID, axisNsigma}); histos.add("QA/Lambda/h2f_neg_prong_tpc_nsigma_pi_vs_p", "TPC n#sigma Neg Prong", kTH2F, {axisMomPID, axisNsigma}); + // Kinematic Histograms + histos.add("McRec/Lambda/hPt", "Transverse Momentum", kTH1F, {axisV0Pt}); + histos.add("McRec/Lambda/hEta", "Pseudorapidity", kTH1F, {axisV0Eta}); + histos.add("McRec/Lambda/hRap", "Rapidity", kTH1F, {axisV0Rap}); + histos.add("McRec/Lambda/hPhi", "Azimuthal Angle", kTH1F, {axisV0Phi}); + // QA Anti-Lambda histos.addClone("QA/Lambda/", "QA/AntiLambda/"); + histos.addClone("McRec/Lambda/", "McRec/AntiLambda/"); // MC Generated Histograms - if (doprocessMCRecoRun3 || doprocessMCRecoRun2) { + if (doprocessMCGenRun3 || doprocessMCGenRun2) { // McReco Histos histos.add("Tracks/h2f_tracks_pid_before_sel", "PIDs", kTH2F, {axisPID, axisV0Pt}); histos.add("Tracks/h2f_tracks_pid_after_sel", "PIDs", kTH2F, {axisPID, axisV0Pt}); @@ -359,8 +381,22 @@ struct LambdaTableProducer { histos.add("McGen/h1f_lambda_daughter_PDG", "PDG Daughters", kTH1F, {axisPID}); histos.add("McGen/h1f_antilambda_daughter_PDG", "PDG Daughters", kTH1F, {axisPID}); + histos.addClone("McRec/", "McGen/"); + + histos.add("McGen/Lambda/Proton/hPt", "Proton p_{T}", kTH1F, {axisTrackPt}); + histos.add("McGen/Lambda/Proton/hEta", "Proton #eta", kTH1F, {axisV0Eta}); + histos.add("McGen/Lambda/Proton/hRap", "Proton y", kTH1F, {axisV0Rap}); + histos.add("McGen/Lambda/Proton/hPhi", "Proton #phi", kTH1F, {axisV0Phi}); + + histos.addClone("McGen/Lambda/Proton/", "McGen/Lambda/Pion/"); + histos.addClone("McGen/Lambda/Proton/", "McGen/AntiLambda/Proton/"); + histos.addClone("McGen/Lambda/Pion/", "McGen/AntiLambda/Pion/"); + // set bin lables specific to MC histos.get(HIST("Events/h1f_collisions_info"))->GetXaxis()->SetBinLabel(CollisionLabels::kTotColBeforeHasMcCollision, "kTotColBeforeHasMcCollision"); + histos.get(HIST("McGen/h1f_collisions_info"))->GetXaxis()->SetBinLabel(CollisionLabels::kTotCol, "kTotCol"); + histos.get(HIST("McGen/h1f_collisions_info"))->GetXaxis()->SetBinLabel(CollisionLabels::kPassSelCol, "kPassSelCol"); + histos.get(HIST("McGen/h1f_collisions_info"))->GetXaxis()->SetBinLabel(CollisionLabels::kPassMultSelCol, "kPassMultSelCol"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kTracksBeforeHasMcParticle, "kTracksBeforeHasMcParticle"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kNotPrimaryLambda, "kNotPrimaryLambda"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kNotSecondaryLambda, "kNotSecondaryLambda"); @@ -376,7 +412,9 @@ struct LambdaTableProducer { // set bin labels histos.get(HIST("Events/h1f_collisions_info"))->GetXaxis()->SetBinLabel(CollisionLabels::kTotCol, "kTotCol"); histos.get(HIST("Events/h1f_collisions_info"))->GetXaxis()->SetBinLabel(CollisionLabels::kPassSelCol, "kPassSelCol"); + histos.get(HIST("Events/h1f_collisions_info"))->GetXaxis()->SetBinLabel(CollisionLabels::kPassMultSelCol, "kPassMultSelCol"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kAllV0Tracks, "kAllV0Tracks"); + histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kV0KShortMassRej, "kV0KShortMassRej"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kNotLambdaNotAntiLambda, "kNotLambdaNotAntiLambda"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kV0IsBothLambdaAntiLambda, "kV0IsBothLambdaAntiLambda"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kNotLambdaAfterSel, "kNotLambdaAfterSel"); @@ -565,6 +603,7 @@ struct LambdaTableProducer { { // Kshort mass rejection hypothesis if (cKshortRejFlag && (std::abs(v0.mK0Short() - MassK0Short) <= cKshortRejMassWindow)) { + histos.fill(HIST("Tracks/h1f_tracks_info"), kV0KShortMassRej); return false; } @@ -794,92 +833,24 @@ struct LambdaTableProducer { histos.fill(HIST(SubDir[part]) + HIST("h2f_neg_prong_tpc_nsigma_pi_vs_p"), negtrack.tpcInnerParam(), negtrack.tpcNSigmaPi()); } - template - void fillLambdaMcGenTable(V const& v0tracks, T const&) + // Fill Lambda Kinematic Histograms + template + void fillKinematicHists(float const& pt, float const& eta, float const& y, float const& phi) { - ParticleType v0Type = kLambda; - float rap = 0.; + static constexpr std::string_view SubDirRG[] = {"McRec/", "McGen/"}; + static constexpr std::string_view SubDirPart[] = {"Lambda/", "AntiLambda/"}; - for (auto const& v0 : v0tracks) { - // Check for corresponding Generator Level Track - if (!v0.has_mcParticle() || !v0.template posTrack_as().has_mcParticle() || !v0.template negTrack_as().has_mcParticle()) { - continue; - } - - // Access corresponding Generator Level Particle - auto mcpart = v0.template mcParticle_as(); - - // check for Lambda first - if (mcpart.pdgCode() == kLambda0) { - v0Type = kLambda; - } else if (mcpart.pdgCode() == kLambda0Bar) { - v0Type = kAntiLambda; - } else { - continue; - } - - // check for Primary Lambdas/AntiLambdas - if (cGenPrimaryLambda && !mcpart.isPhysicalPrimary()) { - continue; - } - - // apply kinematic acceptance - if (!cDoEtaAnalysis) { - rap = mcpart.y(); - } else { - mcpart.eta(); - } - if (!kinCutSelection(mcpart.pt(), std::abs(rap), cMinV0Pt, cMaxV0Pt, cMaxV0Rap)) { - continue; - } - - histos.fill(HIST("Tracks/h1f_tracks_info"), kGenTotAccLambda); - - // get daughter track info and check for decay channel flag - if (!mcpart.has_daughters()) { - histos.fill(HIST("Tracks/h1f_tracks_info"), kGenLambdaNoDau); - continue; - } - auto dautracks = mcpart.template daughters_as(); - std::vector daughterPDGs, daughterIDs; - bool dauKinCutFlag = true; - for (auto const& dautrack : dautracks) { - // check kinematic selection on daughters as well - if (!kinCutSelection(dautrack.pt(), std::abs(dautrack.eta()), cTrackMinPt, cTrackMaxPt, cTrackEtaCut)) { - dauKinCutFlag = false; - } - daughterPDGs.push_back(dautrack.pdgCode()); - daughterIDs.push_back(dautrack.globalIndex()); - } - if (cMcGenDauTrackKinCutFlag && !dauKinCutFlag) { // check daughter acceptance - continue; - } - if (cGenDecayChannel && (std::abs(daughterPDGs[0]) != kProton || std::abs(daughterPDGs[1]) != kPiPlus)) { // check decay channel - continue; - } - - histos.fill(HIST("Tracks/h1f_tracks_info"), kGenLambdaToPrPi); - - if (v0Type == kLambda) { - histos.fill(HIST("McGen/h1f_lambda_daughter_PDG"), daughterPDGs[0]); - histos.fill(HIST("McGen/h1f_lambda_daughter_PDG"), daughterPDGs[1]); - histos.fill(HIST("McGen/h1f_lambda_daughter_PDG"), mcpart.pdgCode()); - } else { - histos.fill(HIST("McGen/h1f_antilambda_daughter_PDG"), daughterPDGs[0]); - histos.fill(HIST("McGen/h1f_antilambda_daughter_PDG"), daughterPDGs[1]); - histos.fill(HIST("McGen/h1f_antilambda_daughter_PDG"), mcpart.pdgCode()); - } - - lambdaMCGenTrackTable(lambdaCollisionTable.lastIndex(), mcpart.px(), mcpart.py(), mcpart.pz(), - mcpart.pt(), mcpart.eta(), mcpart.phi(), mcpart.y(), RecoDecay::m(mcpart.p(), mcpart.e()), - daughterIDs[0], daughterIDs[1], (int8_t)v0Type, -999., -999., 1.); - } + histos.fill(HIST(SubDirRG[rg]) + HIST(SubDirPart[part]) + HIST("hPt"), pt); + histos.fill(HIST(SubDirRG[rg]) + HIST(SubDirPart[part]) + HIST("hEta"), eta); + histos.fill(HIST(SubDirRG[rg]) + HIST(SubDirPart[part]) + HIST("hRap"), y); + histos.fill(HIST(SubDirRG[rg]) + HIST(SubDirPart[part]) + HIST("hPhi"), phi); } - // Lambda Tables + // Reconstructed Level Tables template - void fillLambdaTables(C const& collision, V const& v0tracks, T const& tracks) + void fillLambdaRecoTables(C const& collision, V const& v0tracks, T const& tracks) { + // Check for corresponding MC Collision if constexpr (dmc == kMC) { histos.fill(HIST("Events/h1f_collisions_info"), kTotColBeforeHasMcCollision); if (!collision.has_mcCollision()) { @@ -889,7 +860,7 @@ struct LambdaTableProducer { histos.fill(HIST("Events/h1f_collisions_info"), kTotCol); - // select collision + // Select Collision if (!selCollision(collision)) { return; } @@ -905,17 +876,14 @@ struct LambdaTableProducer { cent = collision.centRun2V0M(); } - // Apply Centrality Selection - if (cent <= cMinCent || cent >= cMaxCent) { + // Multiplicity Selection + if (cent <= cMinMult || cent >= cMaxMult) { return; } - lambdaCollisionTable(cent, collision.posX(), collision.posY(), collision.posZ()); + histos.fill(HIST("Events/h1f_collisions_info"), kPassMultSelCol); - // Fill MC Generated Level Particle Table - if constexpr (dmc == kMC) { - fillLambdaMcGenTable(v0tracks, tracks); - } + lambdaCollisionTable(cent, collision.posX(), collision.posY(), collision.posZ()); // initialize v0track objects ParticleType v0Type = kLambda; @@ -961,9 +929,11 @@ struct LambdaTableProducer { if (v0Type == kLambda) { histos.fill(HIST("Tracks/h1f_lambda_pt_vs_invm"), mass, v0.pt()); fillLambdaQAHistos(collision, v0, tracks); + fillKinematicHists(v0.pt(), v0.eta(), v0.yLambda(), v0.phi()); } else { histos.fill(HIST("Tracks/h1f_antilambda_pt_vs_invm"), mass, v0.pt()); fillLambdaQAHistos(collision, v0, tracks); + fillKinematicHists(v0.pt(), v0.eta(), v0.yLambda(), v0.phi()); } // Fill Lambda/AntiLambda Table @@ -974,6 +944,136 @@ struct LambdaTableProducer { } } + // MC Generater Level Tables + template + void fillLambdaMcGenTables(C const& collision, M const& mcParticles) + { + histos.fill(HIST("McGen/h1f_collisions_info"), kTotCol); + + // Select Collision + if (!collision.has_mcCollision() || !selCollision(collision)) { + return; + } + + histos.fill(HIST("McGen/h1f_collisions_info"), kPassSelCol); + + float cent = 0.; + if constexpr (run == kRun3) { + cent = collision.centFT0M(); + } else { + cent = collision.centRun2V0M(); + } + + // Multiplicity Selection + if (cent <= cMinMult || cent >= cMaxMult) { + return; + } + + histos.fill(HIST("McGen/h1f_collisions_info"), kPassMultSelCol); + + // Fill McGen Collision Table + lambdaMCGenCollisionTable(cent, collision.posX(), collision.posY(), collision.posZ()); + + // initialize track objects + ParticleType v0Type = kLambda; + float rap = 0.; + + for (auto const& mcpart : mcParticles) { + // check for Lambda first + if (mcpart.pdgCode() == kLambda0) { + v0Type = kLambda; + } else if (mcpart.pdgCode() == kLambda0Bar) { + v0Type = kAntiLambda; + } else { + continue; + } + + // check for Primary Lambda/AntiLambda + if (cGenPrimaryLambda && !mcpart.isPhysicalPrimary()) { + continue; + } else if (cGenSecondaryLambda && mcpart.isPhysicalPrimary()) { + continue; + } + + // Decide Eta/Rap + if (!cDoEtaAnalysis) { + rap = mcpart.y(); + } else { + rap = mcpart.eta(); + } + + // Apply Kinematic Acceptance + if (!kinCutSelection(mcpart.pt(), std::abs(rap), cMinV0Pt, cMaxV0Pt, cMaxV0Rap)) { + continue; + } + + histos.fill(HIST("Tracks/h1f_tracks_info"), kGenTotAccLambda); + + // get daughter track info and check for decay channel flag + if (!mcpart.has_daughters()) { + histos.fill(HIST("Tracks/h1f_tracks_info"), kGenLambdaNoDau); + continue; + } + auto dautracks = mcpart.template daughters_as(); + std::vector daughterPDGs, daughterIDs; + bool dauKinCutFlag = true; + std::vector vDauPt, vDauEta, vDauRap, vDauPhi; + for (auto const& dautrack : dautracks) { + // check kinematic selection on daughters as well + if (!kinCutSelection(dautrack.pt(), std::abs(dautrack.eta()), cTrackMinPt, cTrackMaxPt, cTrackEtaCut)) { + dauKinCutFlag = false; + } + daughterPDGs.push_back(dautrack.pdgCode()); + daughterIDs.push_back(dautrack.globalIndex()); + vDauPt.push_back(dautrack.pt()); + vDauEta.push_back(dautrack.eta()); + vDauRap.push_back(dautrack.y()); + vDauPhi.push_back(dautrack.phi()); + } + if (cMcGenDauTrackKinCutFlag && !dauKinCutFlag) { // check daughter acceptance + continue; + } + if (cGenDecayChannel && (std::abs(daughterPDGs[0]) != kProton || std::abs(daughterPDGs[1]) != kPiPlus)) { // check decay channel + continue; + } + + histos.fill(HIST("Tracks/h1f_tracks_info"), kGenLambdaToPrPi); + + if (v0Type == kLambda) { + histos.fill(HIST("McGen/h1f_lambda_daughter_PDG"), daughterPDGs[0]); + histos.fill(HIST("McGen/h1f_lambda_daughter_PDG"), daughterPDGs[1]); + histos.fill(HIST("McGen/h1f_lambda_daughter_PDG"), mcpart.pdgCode()); + histos.fill(HIST("McGen/Lambda/Proton/hPt"), vDauPt[0]); + histos.fill(HIST("McGen/Lambda/Proton/hEta"), vDauEta[0]); + histos.fill(HIST("McGen/Lambda/Proton/hRap"), vDauRap[0]); + histos.fill(HIST("McGen/Lambda/Proton/hPhi"), vDauPhi[0]); + histos.fill(HIST("McGen/Lambda/Pion/hPt"), vDauPt[1]); + histos.fill(HIST("McGen/Lambda/Pion/hEta"), vDauEta[1]); + histos.fill(HIST("McGen/Lambda/Pion/hRap"), vDauRap[1]); + histos.fill(HIST("McGen/Lambda/Pion/hPhi"), vDauPhi[1]); + fillKinematicHists(mcpart.pt(), mcpart.eta(), mcpart.y(), mcpart.phi()); + } else { + histos.fill(HIST("McGen/h1f_antilambda_daughter_PDG"), daughterPDGs[0]); + histos.fill(HIST("McGen/h1f_antilambda_daughter_PDG"), daughterPDGs[1]); + histos.fill(HIST("McGen/h1f_antilambda_daughter_PDG"), mcpart.pdgCode()); + histos.fill(HIST("McGen/AntiLambda/Pion/hPt"), vDauPt[0]); + histos.fill(HIST("McGen/AntiLambda/Pion/hEta"), vDauEta[0]); + histos.fill(HIST("McGen/AntiLambda/Pion/hRap"), vDauRap[0]); + histos.fill(HIST("McGen/AntiLambda/Pion/hPhi"), vDauPhi[0]); + histos.fill(HIST("McGen/AntiLambda/Proton/hPt"), vDauPt[1]); + histos.fill(HIST("McGen/AntiLambda/Proton/hEta"), vDauEta[1]); + histos.fill(HIST("McGen/AntiLambda/Proton/hRap"), vDauRap[1]); + histos.fill(HIST("McGen/AntiLambda/Proton/hPhi"), vDauPhi[1]); + fillKinematicHists(mcpart.pt(), mcpart.eta(), mcpart.y(), mcpart.phi()); + } + + // Fill Lambda McGen Table + lambdaMCGenTrackTable(lambdaMCGenCollisionTable.lastIndex(), mcpart.px(), mcpart.py(), mcpart.pz(), + mcpart.pt(), mcpart.eta(), mcpart.phi(), mcpart.y(), RecoDecay::m(mcpart.p(), mcpart.e()), + daughterIDs[0], daughterIDs[1], (int8_t)v0Type, -999., -999., 1.); + } + } + using CollisionsRun3 = soa::Join; using CollisionsRun2 = soa::Join; using Tracks = soa::Join; @@ -982,33 +1082,59 @@ struct LambdaTableProducer { void processDataRun3(CollisionsRun3::iterator const& collision, aod::V0Datas const& V0s, Tracks const& tracks) { - fillLambdaTables(collision, V0s, tracks); + fillLambdaRecoTables(collision, V0s, tracks); } PROCESS_SWITCH(LambdaTableProducer, processDataRun3, "Process for Run3 DATA", true); void processDataRun2(CollisionsRun2::iterator const& collision, aod::V0Datas const& V0s, Tracks const& tracks) { - fillLambdaTables(collision, V0s, tracks); + fillLambdaRecoTables(collision, V0s, tracks); } PROCESS_SWITCH(LambdaTableProducer, processDataRun2, "Process for Run2 DATA", false); - void processMCRecoRun3(soa::Join::iterator const& collision, aod::McCollisions const&, - McV0Tracks const& V0s, aod::McParticles const&, TracksMC const& tracks) + void processMCRecoRun3(soa::Join::iterator const& collision, + aod::McCollisions const&, + McV0Tracks const& V0s, TracksMC const& tracks, + aod::McParticles const&) { - fillLambdaTables(collision, V0s, tracks); + fillLambdaRecoTables(collision, V0s, tracks); } PROCESS_SWITCH(LambdaTableProducer, processMCRecoRun3, "Process for Run3 MC Reconstructed", false); - void processMCRecoRun2(soa::Join::iterator const& collision, aod::McCollisions const&, - McV0Tracks const& V0s, aod::McParticles const&, TracksMC const& tracks) + void processMCRecoRun2(soa::Join::iterator const& collision, + aod::McCollisions const&, + McV0Tracks const& V0s, TracksMC const& tracks, + aod::McParticles const&) { - fillLambdaTables(collision, V0s, tracks); + fillLambdaRecoTables(collision, V0s, tracks); } PROCESS_SWITCH(LambdaTableProducer, processMCRecoRun2, "Process for Run2 MC Reconstructed", false); + + void processMCGenRun3(aod::McCollisions::iterator const&, + soa::SmallGroups> const& collisions, + aod::McParticles const& mcParticles) + { + for (auto const& collision : collisions) { + fillLambdaMcGenTables(collision, mcParticles); + } + } + + PROCESS_SWITCH(LambdaTableProducer, processMCGenRun3, "Process for Run3 MC Generated", false); + + void processMCGenRun2(aod::McCollisions::iterator const&, + soa::SmallGroups> const& collisions, + aod::McParticles const& mcParticles) + { + for (auto const& collision : collisions) { + fillLambdaMcGenTables(collision, mcParticles); + } + } + + PROCESS_SWITCH(LambdaTableProducer, processMCGenRun2, "Process for Run2 MC Generated", false); }; struct LambdaTracksExtProducer { @@ -1407,19 +1533,20 @@ struct LambdaR2Correlation { PROCESS_SWITCH(LambdaR2Correlation, processDataReco, "Process for Data and MCReco", true); + using LambdaMcGenCollisions = aod::LambdaMcGenCollisions; using LambdaMcGenTracks = aod::LambdaMcGenTracks; SliceCache cachemc; Partition partLambdaMcGenTracks = aod::lambdatrack::v0Type == (int8_t)kLambda; Partition partAntiLambdaMcGenTracks = aod::lambdatrack::v0Type == (int8_t)kAntiLambda; - void processMCGen(LambdaCollisions::iterator const& mcgencol, LambdaMcGenTracks const&) + void processMCGen(LambdaMcGenCollisions::iterator const& mcgencol, LambdaMcGenTracks const&) { histos.fill(HIST("Event/McGen/h1f_collision_posz"), mcgencol.posZ()); histos.fill(HIST("Event/McGen/h1f_ft0m_mult_percentile"), mcgencol.cent()); - auto lambdaMcGenTracks = partLambdaMcGenTracks->sliceByCached(aod::lambdatrack::lambdaCollisionId, mcgencol.globalIndex(), cachemc); - auto antiLambdaMcGenTracks = partAntiLambdaMcGenTracks->sliceByCached(aod::lambdatrack::lambdaCollisionId, mcgencol.globalIndex(), cachemc); + auto lambdaMcGenTracks = partLambdaMcGenTracks->sliceByCached(aod::lambdamcgentrack::lambdaMcGenCollisionId, mcgencol.globalIndex(), cachemc); + auto antiLambdaMcGenTracks = partAntiLambdaMcGenTracks->sliceByCached(aod::lambdamcgentrack::lambdaMcGenCollisionId, mcgencol.globalIndex(), cachemc); analyzeSingles(mcgencol, lambdaMcGenTracks); analyzeSingles(mcgencol, antiLambdaMcGenTracks); From 2359770a3fd217c5a8b7b1ed72392f263d401821 Mon Sep 17 00:00:00 2001 From: nzardosh Date: Thu, 13 Feb 2025 11:05:41 +0100 Subject: [PATCH 0195/1650] [PWGJE] Seperating k7INT7 and kINT7 (#9935) Co-authored-by: ALICE Action Bot --- PWGJE/Core/JetDerivedDataUtilities.h | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/PWGJE/Core/JetDerivedDataUtilities.h b/PWGJE/Core/JetDerivedDataUtilities.h index c2c74bb1def..eed60cb6236 100644 --- a/PWGJE/Core/JetDerivedDataUtilities.h +++ b/PWGJE/Core/JetDerivedDataUtilities.h @@ -30,7 +30,7 @@ static constexpr float mPion = 0.139; // TDatabasePDG::Instance()->GetParticle(2 enum JCollisionSel { sel8 = 0, sel7 = 1, - sel7KINT7 = 2, + selKINT7 = 2, selTVX = 3, selNoTimeFrameBorder = 4, selNoITSROFrameBorder = 5, @@ -85,8 +85,8 @@ std::vector initialiseEventSelectionBits(std::string eventSelectionMasks) if (eventSelectionMasksContainSelection(eventSelectionMasks, "sel7")) { eventSelectionMaskBits.push_back(JCollisionSel::sel7); } - if (eventSelectionMasksContainSelection(eventSelectionMasks, "sel7KINT7")) { - eventSelectionMaskBits.push_back(JCollisionSel::sel7KINT7); + if (eventSelectionMasksContainSelection(eventSelectionMasks, "selKINT7")) { + eventSelectionMaskBits.push_back(JCollisionSel::selKINT7); } if (eventSelectionMasksContainSelection(eventSelectionMasks, "TVX")) { eventSelectionMaskBits.push_back(JCollisionSel::selTVX); @@ -136,6 +136,10 @@ std::vector initialiseEventSelectionBits(std::string eventSelectionMasks) eventSelectionMaskBits.push_back(JCollisionSel::selNoCollInTimeRangeStandard); eventSelectionMaskBits.push_back(JCollisionSel::selNoCollInRofStandard); } + if (eventSelectionMasksContainSelection(eventSelectionMasks, "sel7KINT7")) { + eventSelectionMaskBits.push_back(JCollisionSel::sel7); + eventSelectionMaskBits.push_back(JCollisionSel::selKINT7); + } return eventSelectionMaskBits; } @@ -148,10 +152,10 @@ uint16_t setEventSelectionBit(T const& collision) } if (collision.sel7()) { SETBIT(bit, JCollisionSel::sel7); + } if (collision.alias_bit(kINT7)) { - SETBIT(bit, JCollisionSel::sel7KINT7); + SETBIT(bit, JCollisionSel::selKINT7); } - } if (collision.selection_bit(o2::aod::evsel::kIsTriggerTVX)) { SETBIT(bit, JCollisionSel::selTVX); } From 9e38adb341526848ec69bcad2a26ce36ae9898bd Mon Sep 17 00:00:00 2001 From: Sigurd Nese <32108009+sigurdnese@users.noreply.github.com> Date: Thu, 13 Feb 2025 11:25:42 +0100 Subject: [PATCH 0196/1650] [PWGDQ] Add process function which uses SGSelector to filterPbPb. Smaller changes to UPC D meson analysis. (#9740) Co-authored-by: ALICE Builder --- PWGDQ/Core/HistogramsLibrary.cxx | 8 +- PWGDQ/Core/VarManager.h | 24 ++- PWGDQ/DataModel/ReducedInfoTables.h | 21 +++ PWGDQ/TableProducer/tableMaker_withAssoc.cxx | 51 +++++-- PWGDQ/Tasks/CMakeLists.txt | 4 +- PWGDQ/Tasks/filterPbPb.cxx | 151 ++++++++++++------- PWGDQ/Tasks/tableReader_withAssoc.cxx | 15 +- 7 files changed, 190 insertions(+), 84 deletions(-) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 4e3b3eba767..82b6330fc14 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -1449,14 +1449,16 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "MassD0region_Rapidity", "", false, 140, 1.5, 2.2, VarManager::kMass, 10, -0.8, 0.8, VarManager::kRap); hm->AddHistogram(histClass, "MassD0region_eta", "", false, 140, 1.5, 2.2, VarManager::kMass, 40, -2., 2., VarManager::kEta); hm->AddHistogram(histClass, "MassD0region_TauxyzProj", "", false, 140, 1.5, 2.2, VarManager::kMass, 200, -0.03, 0.03, VarManager::kVertexingTauxyzProjected); - hm->AddHistogram(histClass, "MassD0region_Pt_TauxyzProj", "", false, 140, 1.5, 2.2, VarManager::kMass, 80, 0., 20., VarManager::kPt, 300, 0., 0.03, VarManager::kVertexingTauxyzProjected); hm->AddHistogram(histClass, "MassD0region_TauxyProj", "", false, 140, 1.5, 2.2, VarManager::kMass, 200, -0.03, 0.03, VarManager::kVertexingTauxyProjected); hm->AddHistogram(histClass, "MassD0region_CosPointing", "", false, 140, 1.5, 2.2, VarManager::kMass, 200, -1.0, 1.0, VarManager::kCosPointingAngle); - hm->AddHistogram(histClass, "MassD0region_Pt_CosPointing", "", false, 140, 1.5, 2.2, VarManager::kMass, 80, 0., 20., VarManager::kPt, 100, -1., 0., VarManager::kCosPointingAngle); hm->AddHistogram(histClass, "MassD0region_VtxNContribReal", "", false, 140, 1.5, 2.2, VarManager::kMass, 50, 0, 50, VarManager::kVtxNcontribReal); + } + if (subGroupStr.Contains("3d-mass-histograms")) { + hm->AddHistogram(histClass, "MassD0region_Pt_TauxyzProj", "", false, 140, 1.5, 2.2, VarManager::kMass, 80, 0., 20., VarManager::kPt, 300, 0., 0.03, VarManager::kVertexingTauxyzProjected); + hm->AddHistogram(histClass, "MassD0region_Pt_CosPointing", "", false, 140, 1.5, 2.2, VarManager::kMass, 80, 0., 20., VarManager::kPt, 100, -1., 0., VarManager::kCosPointingAngle); hm->AddHistogram(histClass, "MassD0region_Rapidity_AveragePt", "", true, 140, 1.5, 2.2, VarManager::kMass, 10, -0.8, 0.8, VarManager::kRap, 150, 0.0, 30.0, VarManager::kPt); - hm->AddHistogram(histClass, "MassD0region_TPCnSigKa_pIN", "Pair mass vs kaon cand. pIN vs kaon cand. TPC n-#sigma(K)", false, 140, 1.5, 2.2, VarManager::kMass, 100, 0.0, 10.0, VarManager::kPin_leg1, 20, -5.0, 5.0, VarManager::kTPCnSigmaKa_leg1); hm->AddHistogram(histClass, "MassD0region_Pt_ITStrackOccupancy", "Pair mass vs pair Pt vs event ITS occupancy", false, 70, 1.5, 2.2, VarManager::kMass, 160, 0., 20., VarManager::kPt, 200, 0., 20000., VarManager::kTrackOccupancyInTimeRange); + hm->AddHistogram(histClass, "MassD0region_TPCnSigKa_pIN", "Pair mass vs kaon cand. pIN vs kaon cand. TPC n-#sigma(K)", false, 140, 1.5, 2.2, VarManager::kMass, 100, 0.0, 10.0, VarManager::kPin_leg1, 20, -5.0, 5.0, VarManager::kTPCnSigmaKa_leg1); } if (subGroupStr.Contains("lambdac")) { hm->AddHistogram(histClass, "MassLambdacRegion", "", false, 50, 2.15, 2.4, VarManager::kMass); diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 7bbef225d40..04ebdf94450 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -17,6 +17,7 @@ #ifndef PWGDQ_CORE_VARMANAGER_H_ #define PWGDQ_CORE_VARMANAGER_H_ +#include #include #include #ifndef HomogeneousField @@ -104,6 +105,7 @@ class VarManager : public TObject CollisionMultExtra = BIT(18), ReducedEventMultExtra = BIT(19), CollisionQvectCentr = BIT(20), + RapidityGapFilter = BIT(21), Track = BIT(0), TrackCov = BIT(1), TrackExtra = BIT(2), @@ -1533,13 +1535,22 @@ void VarManager::FillEvent(T const& event, float* values) } if constexpr ((fillMap & CollisionMult) > 0 || (fillMap & ReducedEventExtended) > 0) { + if constexpr ((fillMap & RapidityGapFilter) > 0) { + // UPC: Use the FIT signals from the nearest BC with FIT amplitude above threshold + values[kMultFV0A] = event.newBcMultFV0A(); + values[kMultFT0A] = event.newBcMultFT0A(); + values[kMultFT0C] = event.newBcMultFT0C(); + values[kMultFDDA] = event.newBcMultFDDA(); + values[kMultFDDC] = event.newBcMultFDDC(); + } else { + values[kMultFV0A] = event.multFV0A(); + values[kMultFT0A] = event.multFT0A(); + values[kMultFT0C] = event.multFT0C(); + values[kMultFDDA] = event.multFDDA(); + values[kMultFDDC] = event.multFDDC(); + } values[kMultTPC] = event.multTPC(); - values[kMultFV0A] = event.multFV0A(); values[kMultFV0C] = event.multFV0C(); - values[kMultFT0A] = event.multFT0A(); - values[kMultFT0C] = event.multFT0C(); - values[kMultFDDA] = event.multFDDA(); - values[kMultFDDC] = event.multFDDC(); values[kMultZNA] = event.multZNA(); values[kMultZNC] = event.multZNC(); values[kMultTracklets] = event.multTracklets(); @@ -1856,7 +1867,7 @@ void VarManager::FillEvent(T const& event, float* values) values[kMCEventImpParam] = event.impactParameter(); } - if constexpr ((fillMap & EventFilter) > 0) { + if constexpr ((fillMap & EventFilter) > 0 || (fillMap & RapidityGapFilter) > 0) { values[kIsDoubleGap] = (event.eventFilter() & (static_cast(1) << kDoubleGap)) > 0; values[kIsSingleGapA] = (event.eventFilter() & (static_cast(1) << kSingleGapA)) > 0; values[kIsSingleGapC] = (event.eventFilter() & (static_cast(1) << kSingleGapC)) > 0; @@ -2988,6 +2999,7 @@ void VarManager::FillTriple(T1 const& t1, T2 const& t2, T3 const& t3, float* val values[kEta] = v123.Eta(); values[kPhi] = v123.Phi(); values[kRap] = -v123.Rapidity(); + values[kCharge] = t1.sign() + t2.sign() + t3.sign(); } if (pairType == kTripleCandidateToPKPi) { diff --git a/PWGDQ/DataModel/ReducedInfoTables.h b/PWGDQ/DataModel/ReducedInfoTables.h index c586faef9c7..96d6af36daa 100644 --- a/PWGDQ/DataModel/ReducedInfoTables.h +++ b/PWGDQ/DataModel/ReducedInfoTables.h @@ -34,11 +34,32 @@ namespace o2::aod namespace dqppfilter { DECLARE_SOA_COLUMN(EventFilter, eventFilter, uint64_t); //! Bit-field used for the high level event triggering +DECLARE_SOA_COLUMN(NewBcMultFT0A, newBcMultFT0A, float); //! sum of amplitudes on A side of FT0 +DECLARE_SOA_COLUMN(NewBcMultFT0C, newBcMultFT0C, float); //! sum of amplitudes on C side of FT0 +DECLARE_SOA_COLUMN(NewBcMultFDDA, newBcMultFDDA, float); //! sum of amplitudes on A side of FDD +DECLARE_SOA_COLUMN(NewBcMultFDDC, newBcMultFDDC, float); //! sum of amplitudes on C side of FDD +DECLARE_SOA_COLUMN(NewBcMultFV0A, newBcMultFV0A, float); //! sum of amplitudes on A side of FDD } DECLARE_SOA_TABLE(DQEventFilter, "AOD", "EVENTFILTER", //! Store event-level decisions (DQ high level triggers) dqppfilter::EventFilter); +DECLARE_SOA_TABLE(DQRapidityGapFilter, "AOD", "RAPIDITYGAPFILTER", + dqppfilter::EventFilter, + dqppfilter::NewBcMultFT0A, + dqppfilter::NewBcMultFT0C, + dqppfilter::NewBcMultFDDA, + dqppfilter::NewBcMultFDDC, + dqppfilter::NewBcMultFV0A, + zdc::EnergyCommonZNA, + zdc::EnergyCommonZNC, + zdc::EnergyCommonZPA, + zdc::EnergyCommonZPC, + zdc::TimeZNA, + zdc::TimeZNC, + zdc::TimeZPA, + zdc::TimeZPC); + namespace reducedevent { diff --git a/PWGDQ/TableProducer/tableMaker_withAssoc.cxx b/PWGDQ/TableProducer/tableMaker_withAssoc.cxx index 21c09660787..72d4a3e7fab 100644 --- a/PWGDQ/TableProducer/tableMaker_withAssoc.cxx +++ b/PWGDQ/TableProducer/tableMaker_withAssoc.cxx @@ -36,6 +36,7 @@ #include "Common/DataModel/PIDResponse.h" #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/MftmchMatchingML.h" +#include "Common/Core/TableHelper.h" #include "PWGDQ/DataModel/ReducedInfoTables.h" #include "PWGDQ/Core/VarManager.h" #include "PWGDQ/Core/HistogramManager.h" @@ -98,6 +99,7 @@ using MyEvents = soa::Join; using MyEventsWithMults = soa::Join; using MyEventsWithFilter = soa::Join; using MyEventsWithMultsAndFilter = soa::Join; +using MyEventsWithMultsAndRapidityGapFilter = soa::Join; using MyEventsWithCent = soa::Join; using MyEventsWithCentAndMults = soa::Join; using MyEventsWithMultsExtra = soa::Join; @@ -116,6 +118,7 @@ constexpr static uint32_t gkEventFillMapWithMults = VarManager::ObjTypes::BC | V constexpr static uint32_t gkEventFillMapWithMultsZdc = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision | VarManager::ObjTypes::CollisionMult | VarManager::ObjTypes::Zdc; constexpr static uint32_t gkEventFillMapWithMultsAndEventFilter = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision | VarManager::ObjTypes::CollisionMult | VarManager::ObjTypes::CollisionMultExtra | VarManager::ObjTypes::EventFilter; constexpr static uint32_t gkEventFillMapWithMultsEventFilterZdc = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision | VarManager::ObjTypes::CollisionMult | VarManager::ObjTypes::CollisionMultExtra | VarManager::ObjTypes::EventFilter | VarManager::ObjTypes::Zdc; +constexpr static uint32_t gkEventFillMapWithMultsRapidityGapFilterZdc = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision | VarManager::ObjTypes::CollisionMult | VarManager::ObjTypes::CollisionMultExtra | VarManager::ObjTypes::RapidityGapFilter | VarManager::ObjTypes::Zdc; // constexpr static uint32_t gkEventFillMapWithCent = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision | VarManager::ObjTypes::CollisionCent; constexpr static uint32_t gkEventFillMapWithCentAndMults = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision | VarManager::ObjTypes::CollisionCent | VarManager::CollisionMult | VarManager::ObjTypes::CollisionMultExtra; constexpr static uint32_t gkEventFillMapWithMultsExtra = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision | VarManager::CollisionMult | VarManager::ObjTypes::CollisionMultExtra; @@ -356,7 +359,8 @@ struct TableMaker { // Check whether we have to define barrel or muon histograms bool enableBarrelHistos = (context.mOptions.get("processPPWithFilter") || context.mOptions.get("processPPWithFilterBarrelOnly") || context.mOptions.get("processPPBarrelOnly") || - context.mOptions.get("processPbPb") || context.mOptions.get("processPbPbBarrelOnly") || context.mOptions.get("processPbPbBarrelOnlyWithV0Bits") || context.mOptions.get("processPbPbBarrelOnlyWithV0BitsNoTOF")); + context.mOptions.get("processPbPb") || context.mOptions.get("processPbPbBarrelOnly") || context.mOptions.get("processPbPbBarrelOnlyWithV0Bits") || context.mOptions.get("processPbPbBarrelOnlyWithV0BitsNoTOF")) || + context.mOptions.get("processPbPbWithFilterBarrelOnly"); bool enableMuonHistos = (context.mOptions.get("processPPWithFilter") || context.mOptions.get("processPPWithFilterMuonOnly") || context.mOptions.get("processPPWithFilterMuonMFT") || context.mOptions.get("processPPMuonOnly") || context.mOptions.get("processPPMuonMFT") || context.mOptions.get("processPPMuonMFTWithMultsExtra") || context.mOptions.get("processPbPb") || context.mOptions.get("processPbPbMuonOnly") || context.mOptions.get("processPbPbMuonMFT")); @@ -772,7 +776,7 @@ struct TableMaker { (reinterpret_cast(fStatsList->At(kStatsEvent)))->Fill(1.0, static_cast(o2::aod::evsel::kNsel)); // apply the event filter computed by filter-PP - if constexpr ((TEventFillMap & VarManager::ObjTypes::EventFilter) > 0) { + if constexpr ((TEventFillMap & VarManager::ObjTypes::EventFilter) > 0 || (TEventFillMap & VarManager::ObjTypes::RapidityGapFilter) > 0) { if (!collision.eventFilter()) { continue; } @@ -788,7 +792,7 @@ struct TableMaker { tag |= (static_cast(1) << 0); } // Put the 8 first bits of the event filter in the last 8 bits of the tag - if constexpr ((TEventFillMap & VarManager::ObjTypes::EventFilter) > 0) { + if constexpr ((TEventFillMap & VarManager::ObjTypes::EventFilter) > 0 || (TEventFillMap & VarManager::ObjTypes::RapidityGapFilter) > 0) { tag |= (collision.eventFilter() << 56); } @@ -796,7 +800,10 @@ struct TableMaker { VarManager::FillBC(bc); VarManager::FillEvent(collision); // extract event information and place it in the fValues array if constexpr ((TEventFillMap & VarManager::ObjTypes::Zdc) > 0) { - if (bcEvSel.has_zdc()) { + if constexpr ((TEventFillMap & VarManager::ObjTypes::RapidityGapFilter) > 0) { + // Collision table already has ZDC info + VarManager::FillZDC(collision); + } else if (bcEvSel.has_zdc()) { auto bc_zdc = bcEvSel.zdc(); VarManager::FillZDC(bc_zdc); } @@ -863,17 +870,26 @@ struct TableMaker { // create the event tables event(tag, bc.runNumber(), collision.posX(), collision.posY(), collision.posZ(), collision.numContrib(), collision.collisionTime(), collision.collisionTimeRes()); if constexpr ((TEventFillMap & VarManager::ObjTypes::CollisionMult) > 0) { - multTPC = collision.multTPC(); - multFV0A = collision.multFV0A(); multFV0C = collision.multFV0C(); - multFT0A = collision.multFT0A(); - multFT0C = collision.multFT0C(); - multFDDA = collision.multFDDA(); - multFDDC = collision.multFDDC(); + multTPC = collision.multTPC(); multZNA = collision.multZNA(); multZNC = collision.multZNC(); multTracklets = collision.multTracklets(); multTracksPV = collision.multNTracksPV(); + if constexpr ((TEventFillMap & VarManager::ObjTypes::RapidityGapFilter) > 0) { + // Use the FIT signals from the nearest BC with FIT amplitude above threshold + multFV0A = collision.newBcMultFV0A(); + multFT0A = collision.newBcMultFT0A(); + multFT0C = collision.newBcMultFT0C(); + multFDDA = collision.newBcMultFDDA(); + multFDDC = collision.newBcMultFDDC(); + } else { + multFV0A = collision.multFV0A(); + multFT0A = collision.multFT0A(); + multFT0C = collision.multFT0C(); + multFDDA = collision.multFDDA(); + multFDDC = collision.multFDDC(); + } } if constexpr ((TEventFillMap & VarManager::ObjTypes::CollisionCent) > 0) { centFT0C = collision.centFT0C(); @@ -883,7 +899,11 @@ struct TableMaker { eventVtxCov(collision.covXX(), collision.covXY(), collision.covXZ(), collision.covYY(), collision.covYZ(), collision.covZZ(), collision.chi2()); eventInfo(collision.globalIndex()); if constexpr ((TEventFillMap & VarManager::ObjTypes::Zdc) > 0) { - if (bcEvSel.has_zdc()) { + if constexpr ((TEventFillMap & VarManager::ObjTypes::RapidityGapFilter) > 0) { + // ZDC information is already in the DQRapidityGapFilter + zdc(collision.energyCommonZNA(), collision.energyCommonZNC(), collision.energyCommonZPA(), collision.energyCommonZPC(), + collision.timeZNA(), collision.timeZNC(), collision.timeZPA(), collision.timeZPC()); + } else if (bcEvSel.has_zdc()) { auto bc_zdc = bcEvSel.zdc(); zdc(bc_zdc.energyCommonZNA(), bc_zdc.energyCommonZNC(), bc_zdc.energyCommonZPA(), bc_zdc.energyCommonZPC(), bc_zdc.timeZNA(), bc_zdc.timeZNC(), bc_zdc.timeZPA(), bc_zdc.timeZPC()); @@ -1424,6 +1444,14 @@ struct TableMaker { fullSkimming(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr); } + // produce the barrel-only DQ skimmed data model typically for UPC Pb-Pb (no centrality), subscribe to the DQ rapidity gap event filter (filter-PbPb) + void processPbPbWithFilterBarrelOnly(MyEventsWithMultsAndRapidityGapFilter const& collisions, MyBCs const& bcs, aod::Zdcs& zdcs, + MyBarrelTracksWithCov const& tracksBarrel, + TrackAssoc const& trackAssocs) + { + fullSkimming(collisions, bcs, zdcs, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr); + } + // produce the barrel only DQ skimmed data model typically for Pb-Pb (with centrality), no subscribtion to the DQ event filter void processPbPbBarrelOnlyWithV0Bits(MyEventsWithCentAndMults const& collisions, BCsWithTimestamps const& bcs, MyBarrelTracksWithV0Bits const& tracksBarrel, @@ -1478,6 +1506,7 @@ struct TableMaker { PROCESS_SWITCH(TableMaker, processPPMuonMFTWithMultsExtra, "Build muon + mft DQ skimmed data model typically for pp/p-Pb and UPC Pb-Pb", false); PROCESS_SWITCH(TableMaker, processPbPb, "Build full DQ skimmed data model typically for Pb-Pb, w/o event filtering", false); PROCESS_SWITCH(TableMaker, processPbPbBarrelOnly, "Build barrel only DQ skimmed data model typically for Pb-Pb, w/o event filtering", false); + PROCESS_SWITCH(TableMaker, processPbPbWithFilterBarrelOnly, "Build barrel only DQ skimmed data model typically for UPC Pb-Pb, w/ event filtering", false); PROCESS_SWITCH(TableMaker, processPbPbBarrelOnlyWithV0Bits, "Build barrel only DQ skimmed data model typically for Pb-Pb, w/ V0 bits, w/o event filtering", false); PROCESS_SWITCH(TableMaker, processPbPbBarrelOnlyWithV0BitsNoTOF, "Build barrel only DQ skimmed data model typically for Pb-Pb, w/ V0 bits, no TOF, w/o event filtering", false); PROCESS_SWITCH(TableMaker, processPbPbMuonOnly, "Build muon only DQ skimmed data model typically for Pb-Pb, w/o event filtering", false); diff --git a/PWGDQ/Tasks/CMakeLists.txt b/PWGDQ/Tasks/CMakeLists.txt index f64f67ee394..af4fb5b5323 100644 --- a/PWGDQ/Tasks/CMakeLists.txt +++ b/PWGDQ/Tasks/CMakeLists.txt @@ -41,7 +41,7 @@ o2physics_add_dpl_workflow(filter-pp-with-association o2physics_add_dpl_workflow(filter-pb-pb SOURCES filterPbPb.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGDQCore + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGDQCore O2Physics::SGCutParHolder COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(v0-selector @@ -112,4 +112,4 @@ o2physics_add_dpl_workflow(task-fwd-track-pid o2physics_add_dpl_workflow(quarkonia-to-hyperons SOURCES quarkoniaToHyperons.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::MLCore O2Physics::EventFilteringUtils - COMPONENT_NAME Analysis) \ No newline at end of file + COMPONENT_NAME Analysis) diff --git a/PWGDQ/Tasks/filterPbPb.cxx b/PWGDQ/Tasks/filterPbPb.cxx index 81dfa35a996..1544ea14f21 100644 --- a/PWGDQ/Tasks/filterPbPb.cxx +++ b/PWGDQ/Tasks/filterPbPb.cxx @@ -18,6 +18,7 @@ #include "PWGDQ/Core/VarManager.h" #include "CommonConstants/LHCConstants.h" #include "ReconstructionDataFormats/Vertex.h" +#include "PWGUD/Core/SGSelector.h" using namespace std; @@ -30,11 +31,10 @@ using MyEvents = soa::Join; using MyBCs = soa::Join; struct DQFilterPbPbTask { + Produces eventRapidityGapFilter; Produces eventFilter; - OutputObj fStats{"Statistics"}; OutputObj fFilterOutcome{"Filter outcome"}; - Configurable fConfigEventTypes{"cfgEventTypes", "doublegap,singlegap", "Which event types to select. doublegap, singlegap or both, comma separated"}; Configurable fConfigNDtColl{"cfgNDtColl", 4, "Number of standard deviations to consider in BC range"}; Configurable fConfigMinNBCs{"cfgMinNBCs", 7, "Minimum number of BCs to consider in BC range"}; Configurable fConfigMinNPVCs{"cfgMinNPVCs", 2, "Minimum number of PV contributors"}; @@ -52,47 +52,51 @@ struct DQFilterPbPbTask { int eventTypeMap = 0; std::vector eventTypeOptions = {"doublegap", "singlegap"}; // Map for which types of event to select + SGSelector sgSelector; + SGCutParHolder sgCuts = SGCutParHolder(); + void init(o2::framework::InitContext&) { - // setup the Stats histogram - fStats.setObject(new TH1D("Statistics", "Stats for DQ triggers", 2, -2.5, -0.5)); - fStats->GetXaxis()->SetBinLabel(1, "Events inspected"); - fStats->GetXaxis()->SetBinLabel(2, "Events selected"); // setup the FilterOutcome histogram - fFilterOutcome.setObject(new TH1D("Filter outcome", "Filter outcome", 9, 0.5, 9.5)); + fFilterOutcome.setObject(new TH1D("Filter outcome", "Filter outcome", 8, 0.5, 8.5)); fFilterOutcome->GetXaxis()->SetBinLabel(1, "Events inspected"); - fFilterOutcome->GetXaxis()->SetBinLabel(2, "Events selected"); - fFilterOutcome->GetXaxis()->SetBinLabel(3, "!A && !C"); - fFilterOutcome->GetXaxis()->SetBinLabel(4, "!A && C"); - fFilterOutcome->GetXaxis()->SetBinLabel(5, "A && !C"); - fFilterOutcome->GetXaxis()->SetBinLabel(6, "A && C"); - fFilterOutcome->GetXaxis()->SetBinLabel(7, Form("numContrib not in [%d, %d]", fConfigMinNPVCs.value, fConfigMaxNPVCs.value)); - fFilterOutcome->GetXaxis()->SetBinLabel(8, "BC not found"); - fFilterOutcome->GetXaxis()->SetBinLabel(9, "ITS UPC settings used"); + fFilterOutcome->GetXaxis()->SetBinLabel(2, "!A && !C"); + fFilterOutcome->GetXaxis()->SetBinLabel(3, "!A && C"); + fFilterOutcome->GetXaxis()->SetBinLabel(4, "A && !C"); + fFilterOutcome->GetXaxis()->SetBinLabel(5, "A && C"); + fFilterOutcome->GetXaxis()->SetBinLabel(6, Form("numContrib not in [%d, %d]", fConfigMinNPVCs.value, fConfigMaxNPVCs.value)); + fFilterOutcome->GetXaxis()->SetBinLabel(7, "BC not found"); + fFilterOutcome->GetXaxis()->SetBinLabel(8, "ITS UPC settings used"); - TString eventTypesString = fConfigEventTypes.value; - for (std::vector::size_type i = 0; i < eventTypeOptions.size(); i++) { - if (eventTypesString.Contains(eventTypeOptions[i])) { - eventTypeMap |= (uint32_t(1) << i); - LOGF(info, "filterPbPb will select '%s' events", eventTypeOptions[i]); - } - } - if (eventTypeMap == 0) { - LOGF(fatal, "No valid choice of event types to select. Use 'doublegap', 'singlegap' or both"); - } + sgCuts.SetNDtcoll(fConfigNDtColl); + sgCuts.SetMinNBCs(fConfigMinNBCs); + sgCuts.SetNTracks(fConfigMinNPVCs, fConfigMaxNPVCs); + sgCuts.SetMaxFITtime(fConfigMaxFITTime); + sgCuts.SetFITAmpLimits({static_cast((fConfigUseFV0) ? fConfigFV0AmpLimit : -1.), + static_cast((fConfigUseFT0) ? fConfigFT0AAmpLimit : -1.), + static_cast((fConfigUseFT0) ? fConfigFT0CAmpLimit : -1.), + static_cast((fConfigUseFDD) ? fConfigFDDAAmpLimit : -1.), + static_cast((fConfigUseFDD) ? fConfigFDDCAmpLimit : -1.)}); } // Helper function for selecting double gap and single gap events template uint64_t rapidityGapFilter(TEvent const& collision, TBCs const& bcs, aod::FT0s& ft0s, aod::FV0As& fv0as, aod::FDDs& fdds, - int eventTypes, std::vector FITAmpLimits, int nDtColl, int minNBCs, int minNPVCs, int maxNPVCs, float maxFITTime, + std::vector FITAmpLimits, int nDtColl, int minNBCs, int minNPVCs, int maxNPVCs, float maxFITTime, bool useFV0, bool useFT0, bool useFDD) { fFilterOutcome->Fill(1., 1.); + + // Number of primary vertex contributors + if (collision.numContrib() < minNPVCs || collision.numContrib() > maxNPVCs) { + fFilterOutcome->Fill(6, 1); + return 0; + } + // Find BC associated with collision if (!collision.has_foundBC()) { - fFilterOutcome->Fill(8., 1); + fFilterOutcome->Fill(7., 1); return 0; } // foundBCId is stored in EvSels @@ -218,37 +222,23 @@ struct DQFilterPbPbTask { // Compute FIT decision uint64_t FITDecision = 0; if (isSideAClean && isSideCClean) { - fFilterOutcome->Fill(3, 1); - if (eventTypes & (uint32_t(1) << 0)) { - FITDecision |= (uint64_t(1) << VarManager::kDoubleGap); - } + fFilterOutcome->Fill(2, 1); + FITDecision |= (uint64_t(1) << VarManager::kDoubleGap); } if (isSideAClean && !isSideCClean) { - fFilterOutcome->Fill(4, 1); - if (eventTypes & (uint32_t(1) << 1)) { - FITDecision |= (uint64_t(1) << VarManager::kSingleGapA); - } + fFilterOutcome->Fill(3, 1); + FITDecision |= (uint64_t(1) << VarManager::kSingleGapA); } else if (!isSideAClean && isSideCClean) { - fFilterOutcome->Fill(5, 1); - if (eventTypes & (uint32_t(1) << 1)) { - FITDecision |= (uint64_t(1) << VarManager::kSingleGapC); - } + fFilterOutcome->Fill(4, 1); + FITDecision |= (uint64_t(1) << VarManager::kSingleGapC); } else if (!isSideAClean && !isSideCClean) { - fFilterOutcome->Fill(6, 1); + fFilterOutcome->Fill(5, 1); } if (!FITDecision) { return 0; } - // Number of primary vertex contributors - if (collision.numContrib() < minNPVCs || collision.numContrib() > maxNPVCs) { - fFilterOutcome->Fill(7, 1); - return 0; - } - - // If we made it here, the event passed - fFilterOutcome->Fill(2, 1); // Return filter bitmap corresponding to FIT decision return FITDecision; } @@ -256,23 +246,75 @@ struct DQFilterPbPbTask { void processFilterPbPb(MyEvents::iterator const& collision, MyBCs const& bcs, aod::FT0s& ft0s, aod::FV0As& fv0as, aod::FDDs& fdds) { - fStats->Fill(-2.0); - std::vector FITAmpLimits = {fConfigFV0AmpLimit, fConfigFT0AAmpLimit, fConfigFT0CAmpLimit, fConfigFDDAAmpLimit, fConfigFDDCAmpLimit}; uint64_t filter = rapidityGapFilter(collision, bcs, ft0s, fv0as, fdds, - eventTypeMap, FITAmpLimits, fConfigNDtColl, fConfigMinNBCs, fConfigMinNPVCs, fConfigMaxNPVCs, fConfigMaxFITTime, + FITAmpLimits, fConfigNDtColl, fConfigMinNBCs, fConfigMinNPVCs, fConfigMaxNPVCs, fConfigMaxFITTime, fConfigUseFV0, fConfigUseFT0, fConfigUseFDD); - bool isSelected = filter; - fStats->Fill(-1.0, isSelected); + // Record whether UPC settings were used for this event + if (collision.flags() & dataformats::Vertex>::Flags::UPCMode) { + filter |= (uint64_t(1) << VarManager::kITSUPCMode); + fFilterOutcome->Fill(8, 1); + } + + eventRapidityGapFilter(filter, -9999.0, -9999.0, -9999.0, -9999.0, -9999.0, -9999.0, -9999.0, -9999.0, -9999.0, -9999.0, -9999.0, -9999.0, -9999.0); + eventFilter(filter); + } + + void processUDSGSelector(MyEvents::iterator const& collision, MyBCs const& bcs, + aod::FT0s& ft0s, aod::FV0As& fv0as, aod::FDDs& fdds, aod::Zdcs& /*zdcs*/) + { + uint64_t filter = 0; + fFilterOutcome->Fill(1, 1.); + if (!collision.has_foundBC()) { + fFilterOutcome->Fill(7, 1); + return; + } + + auto bc = collision.foundBC_as(); + auto newbc = bc; + auto bcRange = udhelpers::compatibleBCs(collision, fConfigNDtColl, bcs, fConfigMinNBCs); + auto isSGEvent = sgSelector.IsSelected(sgCuts, collision, bcRange, bc); + int issgevent = isSGEvent.value; + // Translate SGSelector values to DQEventFilter values + if (issgevent == 0) { + filter |= (uint64_t(1) << VarManager::kSingleGapA); + fFilterOutcome->Fill(3, 1); + } else if (issgevent == 1) { + filter |= (uint64_t(1) << VarManager::kSingleGapC); + fFilterOutcome->Fill(4, 1); + } else if (issgevent == 2) { + filter |= (uint64_t(1) << VarManager::kDoubleGap); + fFilterOutcome->Fill(2, 1); + } else if (issgevent == 3) { + fFilterOutcome->Fill(5, 1); + } else if (issgevent == 4) { + fFilterOutcome->Fill(6, 1); + } + + // Get closest bc with FIT activity above threshold + if (isSGEvent.bc && issgevent < 2) { + newbc = *(isSGEvent.bc); + } + upchelpers::FITInfo fitInfo{}; + udhelpers::getFITinfo(fitInfo, newbc, bcs, ft0s, fv0as, fdds); // Record whether UPC settings were used for this event if (collision.flags() & dataformats::Vertex>::Flags::UPCMode) { filter |= (uint64_t(1) << VarManager::kITSUPCMode); - fFilterOutcome->Fill(9, 1); + fFilterOutcome->Fill(8, 1); } + if (newbc.has_zdc()) { + auto zdc = newbc.zdc(); + eventRapidityGapFilter(filter, fitInfo.ampFT0A, fitInfo.ampFT0C, fitInfo.ampFDDA, fitInfo.ampFDDC, fitInfo.ampFV0A, + zdc.energyCommonZNA(), zdc.energyCommonZNC(), zdc.energyCommonZPA(), zdc.energyCommonZPC(), + zdc.timeZNA(), zdc.timeZNC(), zdc.timeZPA(), zdc.timeZPC()); + } else { + eventRapidityGapFilter(filter, fitInfo.ampFT0A, fitInfo.ampFT0C, fitInfo.ampFDDA, fitInfo.ampFDDC, fitInfo.ampFV0A, + -9999.0, -9999.0, -9999.0, -9999.0, -9999.0, -9999.0, -9999.0, -9999.0); + } eventFilter(filter); } @@ -282,6 +324,7 @@ struct DQFilterPbPbTask { } PROCESS_SWITCH(DQFilterPbPbTask, processFilterPbPb, "Run filter task", true); + PROCESS_SWITCH(DQFilterPbPbTask, processUDSGSelector, "Run filter task with SG selector from UD", false); PROCESS_SWITCH(DQFilterPbPbTask, processDummy, "Dummy function", false); }; diff --git a/PWGDQ/Tasks/tableReader_withAssoc.cxx b/PWGDQ/Tasks/tableReader_withAssoc.cxx index 5ef43dc909c..999ceebff6e 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.cxx +++ b/PWGDQ/Tasks/tableReader_withAssoc.cxx @@ -2252,6 +2252,7 @@ struct AnalysisAsymmetricPairing { } // end if (pair cuts) } } + // Make sure the leg cuts are covered by the configured filter masks if (fLegAFilterMask != fConstructedLegAFilterMask) { LOGF(fatal, "cfgLegAFilterMask (%d) is not equal to the mask constructed by the cuts specified in cfgLegCuts (%d)!", fLegAFilterMask, fConstructedLegAFilterMask); @@ -2369,21 +2370,19 @@ struct AnalysisAsymmetricPairing { uint32_t twoTrackFilter = static_cast(0); uint32_t twoTrackCommonFilter = static_cast(0); uint32_t pairFilter = static_cast(0); - bool isPairIdWrong = false; for (int icut = 0; icut < fNLegCuts; ++icut) { // Find leg pair definitions both candidates participate in if ((a1.isBarrelSelected_raw() & fConstructedLegAFilterMasksMap[icut]) && (a2.isBarrelSelected_raw() & fConstructedLegBFilterMasksMap[icut])) { twoTrackFilter |= (static_cast(1) << icut); // If the supposed pion passes a kaon cut, this is a K+K-. Skip it. if (TPairType == VarManager::kDecayToKPi && fConfigSkipAmbiguousIdCombinations.value) { - if (a2.isBarrelSelected_raw() & fLegAFilterMask) { - isPairIdWrong = true; + if (a2.isBarrelSelected_raw() & fConstructedLegAFilterMasksMap[icut]) { + twoTrackFilter &= ~(static_cast(1) << icut); } } } } - - if (!twoTrackFilter || isPairIdWrong) { + if (!twoTrackFilter) { continue; } @@ -2554,17 +2553,17 @@ struct AnalysisAsymmetricPairing { threeTrackFilter |= (static_cast(1) << icut); if (tripletType == VarManager::kTripleCandidateToPKPi && fConfigSkipAmbiguousIdCombinations.value) { // Check if the supposed pion passes as a proton or kaon, if so, skip this triplet. It is pKp or pKK. - if ((a3.isBarrelSelected_raw() & fLegAFilterMask) || (a3.isBarrelSelected_raw() & fLegBFilterMask)) { + if ((a3.isBarrelSelected_raw() & fConstructedLegAFilterMasksMap[icut]) || (a3.isBarrelSelected_raw() & fConstructedLegBFilterMasksMap[icut])) { return; } // Check if the supposed kaon passes as a proton, if so, skip this triplet. It is ppPi. - if (a2.isBarrelSelected_raw() & fLegAFilterMask) { + if (a2.isBarrelSelected_raw() & fConstructedLegAFilterMasksMap[icut]) { return; } } if (tripletType == VarManager::kTripleCandidateToKPiPi && fConfigSkipAmbiguousIdCombinations.value) { // Check if one of the supposed pions pass as a kaon, if so, skip this triplet. It is KKPi. - if ((a2.isBarrelSelected_raw() & fLegAFilterMask) || (a3.isBarrelSelected_raw() & fLegAFilterMask)) { + if ((a2.isBarrelSelected_raw() & fConstructedLegAFilterMasksMap[icut]) || (a3.isBarrelSelected_raw() & fConstructedLegAFilterMasksMap[icut])) { return; } } From 2cc4727cde9d88f78a9a772770422093423d63f6 Mon Sep 17 00:00:00 2001 From: rolavick Date: Thu, 13 Feb 2025 12:05:28 +0100 Subject: [PATCH 0197/1650] [PWGUD] Task to test generatorID of UD MC production on hyperloop (#9937) Co-authored-by: ALICE Action Bot --- PWGUD/Tasks/CMakeLists.txt | 6 ++ PWGUD/Tasks/testMCstdTabsRL.cxx | 107 ++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 PWGUD/Tasks/testMCstdTabsRL.cxx diff --git a/PWGUD/Tasks/CMakeLists.txt b/PWGUD/Tasks/CMakeLists.txt index a6a10b5e7b8..e5468e6829f 100644 --- a/PWGUD/Tasks/CMakeLists.txt +++ b/PWGUD/Tasks/CMakeLists.txt @@ -123,6 +123,7 @@ o2physics_add_dpl_workflow(tautau13topo SOURCES upcTauTau13topo.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGPIDSelector COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(upc-tau-rl SOURCES upcTauCentralBarrelRL.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::ReconstructionDataFormats O2::DetectorsBase O2::DetectorsCommonDataFormats @@ -226,4 +227,9 @@ o2physics_add_dpl_workflow(exclusive-rho-to-four-pi o2physics_add_dpl_workflow(upc-quarkonia-central-barrel SOURCES upcQuarkoniaCentralBarrel.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase + COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(test-mc-std-tabs-rl + SOURCES testMCstdTabsRL.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::ReconstructionDataFormats O2::DetectorsBase O2::DetectorsCommonDataFormats COMPONENT_NAME Analysis) \ No newline at end of file diff --git a/PWGUD/Tasks/testMCstdTabsRL.cxx b/PWGUD/Tasks/testMCstdTabsRL.cxx new file mode 100644 index 00000000000..6ac26211e03 --- /dev/null +++ b/PWGUD/Tasks/testMCstdTabsRL.cxx @@ -0,0 +1,107 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +// +/// \file testMCstdTabsRL.cxx +/// \brief task to test the Monte Carlo UD production generatorIDs on hyperloop +/// +/// \author Roman Lavicka , Austrian Academy of Sciences & SMI +/// \since 12.02.2025 +// + +// C++ headers +#include +#include +#include +#include + +// O2 headers +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/O2DatabasePDGPlugin.h" +#include "Framework/runDataProcessing.h" + +// O2Physics headers +#include "PWGUD/Core/UPCTauCentralBarrelHelperRL.h" + +// ROOT headers +#include "TLorentzVector.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::constants::physics; + +struct TestMCstdTabsRL { + + // Global varialbes + Service pdg; + + HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + + struct : ConfigurableGroup { + ConfigurableAxis zzAxisNtracks{"zzAxisNtracks", {30, -0.5, 29.5}, "Number of tracks in collision"}; + ConfigurableAxis zzAxisNparticles{"zzAxisNparticles", {60, -0.5, 59.5}, "Number of particles in collision"}; + ConfigurableAxis zzAxisNprocesses{"zzAxisNprocesses", {50, -0.5, 49.5}, "Number of processes"}; + ConfigurableAxis zzAxisInvMassWide{"zzAxisInvMassWide", {1000, 0., 10.}, "Invariant mass (GeV/c^{2}), wider range"}; + ConfigurableAxis zzAxisPt{"zzAxisPt", {400, 0., 2.}, "Transversal momentum (GeV/c)"}; + ConfigurableAxis zzAxisRap{"zzAxisRap", {50, -1.2, 1.2}, "Rapidity (a.u.)"}; + } confAxis; + + // init + void init(InitContext&) + { + histos.add("Events/Truth/hGenIDvsCountCollisions", ";Process ID", HistType::kTH2D, {confAxis.zzAxisNprocesses, {1, 0.5, 1.5}}); + histos.add("Events/Truth/hGenIDvsPDGcodesAll", ";Process ID ;PDG codes of all particles (-)", HistType::kTH2D, {confAxis.zzAxisNprocesses, {2001, -1000, 1000}}); + histos.add("Events/Truth/hGenIDvsPDGcodesNoMother", ";Process ID ;PDG codes of particles without mother (-)", HistType::kTH2D, {confAxis.zzAxisNprocesses, {2001, -1000, 1000}}); + histos.add("Events/Truth/hGenIDvsPDGcodesDaughters", ";Process ID ;PDG codes of daughters of particles without mother (-)", HistType::kTH2D, {confAxis.zzAxisNprocesses, {2001, -1000, 1000}}); + histos.add("Events/Truth/hGenIDvsNparticles", ";Process ID ;Number of particles in a collision (-)", HistType::kTH2D, {confAxis.zzAxisNprocesses, confAxis.zzAxisNparticles}); + histos.add("Events/Truth/hGenIDvsNdaughters", ";Process ID ;Number of daughters of no-mother particle in a collision (-)", HistType::kTH2D, {confAxis.zzAxisNprocesses, confAxis.zzAxisNparticles}); + histos.add("Events/Truth/hGenIDvsMotherMass", ";Process ID ;Mother invariant mass (GeV/c^{2})", HistType::kTH2D, {confAxis.zzAxisNprocesses, confAxis.zzAxisInvMassWide}); + histos.add("Events/Truth/hGenIDvsMotherPt", ";Process ID ;Mother p_{T} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisNprocesses, confAxis.zzAxisPt}); + histos.add("Events/Truth/hGenIDvsMotherRap", ";Process ID ;Mother rapidity (-)", HistType::kTH2D, {confAxis.zzAxisNprocesses, confAxis.zzAxisRap}); + + } // end init + + void processMCgen(aod::McCollision const& collision, aod::McParticles const& particles) + { + + histos.get(HIST("Events/Truth/hGenIDvsCountCollisions"))->Fill(collision.generatorsID(), 1); + histos.get(HIST("Events/Truth/hGenIDvsNparticles"))->Fill(collision.generatorsID(), particles.size()); + + TLorentzVector mother; + for (const auto& particle : particles) { + histos.get(HIST("Events/Truth/hGenIDvsPDGcodesAll"))->Fill(collision.generatorsID(), particle.pdgCode()); + // if (!particle.isPhysicalPrimary()) continue; + if (particle.has_mothers()) + continue; + mother.SetPxPyPzE(particle.px(), particle.py(), particle.pz(), energy(pdg->Mass(particle.pdgCode()), particle.px(), particle.py(), particle.pz())); + histos.get(HIST("Events/Truth/hGenIDvsPDGcodesNoMother"))->Fill(collision.generatorsID(), particle.pdgCode()); + histos.get(HIST("Events/Truth/hGenIDvsMotherMass"))->Fill(collision.generatorsID(), mother.M()); + histos.get(HIST("Events/Truth/hGenIDvsMotherPt"))->Fill(collision.generatorsID(), particle.pt()); + histos.get(HIST("Events/Truth/hGenIDvsMotherRap"))->Fill(collision.generatorsID(), particle.y()); + const auto& daughters = particle.daughters_as(); + histos.get(HIST("Events/Truth/hGenIDvsNdaughters"))->Fill(collision.generatorsID(), daughters.size()); + for (const auto& daughter : daughters) { + histos.get(HIST("Events/Truth/hGenIDvsPDGcodesDaughters"))->Fill(collision.generatorsID(), daughter.pdgCode()); + } + } + + } // end processMCgenDG + + PROCESS_SWITCH(TestMCstdTabsRL, processMCgen, "Iterate Monte Carlo UD tables with truth data.", true); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc)}; +} From 4bde1834a74b38e4d8b8dc7d8946134dfc155d81 Mon Sep 17 00:00:00 2001 From: Hadi Hassan Date: Thu, 13 Feb 2025 13:22:12 +0200 Subject: [PATCH 0198/1650] [PWGJE] Implementing a utility class for b-jet tagging ML methods (#9580) --- PWGJE/Core/JetTaggingUtilities.h | 307 +++++-------------- PWGJE/Core/MlResponseHfTagging.h | 453 ++++++++++++++++++++++++++++ PWGJE/TableProducer/jetTaggerHF.cxx | 81 +++-- PWGJE/Tasks/bjetTaggingML.cxx | 29 +- Tools/ML/model.h | 9 +- 5 files changed, 606 insertions(+), 273 deletions(-) create mode 100644 PWGJE/Core/MlResponseHfTagging.h diff --git a/PWGJE/Core/JetTaggingUtilities.h b/PWGJE/Core/JetTaggingUtilities.h index fda2e3ddab7..fa42b52c865 100644 --- a/PWGJE/Core/JetTaggingUtilities.h +++ b/PWGJE/Core/JetTaggingUtilities.h @@ -38,14 +38,6 @@ #include "Common/Core/trackUtilities.h" #include "PWGJE/Core/JetUtilities.h" -#if __has_include() -#include -#else -#include -#endif - -using namespace o2::constants::physics; - enum JetTaggingSpecies { none = 0, charm = 1, @@ -71,203 +63,60 @@ namespace jettaggingutilities const int cmTomum = 10000; // using cm -> #mum for impact parameter (dca) struct BJetParams { - float mJetpT = 0.0; - float mJetEta = 0.0; - float mJetPhi = 0.0; - int mNTracks = -1; - int mNSV = -1; - float mJetMass = 0.0; + float JetpT = 0.0; + float JetEta = 0.0; + float JetPhi = 0.0; + int NTracks = -1; + int NSV = -1; + float JetMass = 0.0; }; struct BJetTrackParams { - double mTrackpT = 0.0; - double mTrackEta = 0.0; - double mDotProdTrackJet = 0.0; - double mDotProdTrackJetOverJet = 0.0; - double mDeltaRJetTrack = 0.0; - double mSignedIP2D = 0.0; - double mSignedIP2DSign = 0.0; - double mSignedIP3D = 0.0; - double mSignedIP3DSign = 0.0; - double mMomFraction = 0.0; - double mDeltaRTrackVertex = 0.0; + double TrackpT = 0.0; + double TrackEta = 0.0; + double DotProdTrackJet = 0.0; + double DotProdTrackJetOverJet = 0.0; + double DeltaRJetTrack = 0.0; + double SignedIP2D = 0.0; + double SignedIP2DSign = 0.0; + double SignedIP3D = 0.0; + double SignedIP3DSign = 0.0; + double MomFraction = 0.0; + double DeltaRTrackVertex = 0.0; + double TrackPhi = 0.0; + double TrackCharge = 0.0; + double TrackITSChi2NCl = 0.0; + double TrackTPCChi2NCl = 0.0; + double TrackITSNCls = 0.0; + double TrackTPCNCls = 0.0; + double TrackTPCNCrossedRows = 0.0; + int TrackOrigin = -1; + int TrackVtxIndex = -1; }; struct BJetSVParams { - double mSVpT = 0.0; - double mDeltaRSVJet = 0.0; - double mSVMass = 0.0; - double mSVfE = 0.0; - double mIPXY = 0.0; - double mCPA = 0.0; - double mChi2PCA = 0.0; - double mDispersion = 0.0; - double mDecayLength2D = 0.0; - double mDecayLength2DError = 0.0; - double mDecayLength3D = 0.0; - double mDecayLength3DError = 0.0; -}; - -// ONNX Runtime tensor (Ort::Value) allocator for using customized inputs of ML models. -class TensorAllocator -{ - protected: -#if !__has_include() - Ort::MemoryInfo mem_info; -#endif - public: - TensorAllocator() -#if !__has_include() - : mem_info(Ort::MemoryInfo::CreateCpu(OrtAllocatorType::OrtArenaAllocator, OrtMemType::OrtMemTypeDefault)) -#endif - { - } - ~TensorAllocator() = default; - template - Ort::Value createTensor(std::vector& input, std::vector& inputShape) - { -#if __has_include() - return Ort::Experimental::Value::CreateTensor(input.data(), input.size(), inputShape); -#else - return Ort::Value::CreateTensor(mem_info, input.data(), input.size(), inputShape.data(), inputShape.size()); -#endif - } -}; - -// TensorAllocator for GNN b-jet tagger -class GNNBjetAllocator : public TensorAllocator -{ - private: - int64_t nJetFeat; - int64_t nTrkFeat; - int64_t nFlav; - int64_t nTrkOrigin; - int64_t maxNNodes; - - std::vector tfJetMean; - std::vector tfJetStdev; - std::vector tfTrkMean; - std::vector tfTrkStdev; - - std::vector> edgesList; - - // Jet feature normalization - template - T jetFeatureTransform(T feat, int idx) const - { - return (feat - tfJetMean[idx]) / tfJetStdev[idx]; - } - - // Track feature normalization - template - T trkFeatureTransform(T feat, int idx) const - { - return (feat - tfTrkMean[idx]) / tfTrkStdev[idx]; - } - - // Edge input of GNN (fully-connected graph) - void setEdgesList(void) - { - for (int64_t nNodes = 0; nNodes <= maxNNodes; ++nNodes) { - std::vector> edges; - // Generate all permutations of (i, j) where i != j - for (int64_t i = 0; i < nNodes; ++i) { - for (int64_t j = 0; j < nNodes; ++j) { - if (i != j) { - edges.emplace_back(i, j); - } - } - } - // Add self-loops (i, i) - for (int64_t i = 0; i < nNodes; ++i) { - edges.emplace_back(i, i); - } - // Flatten - std::vector flattenedEdges; - for (const auto& edge : edges) { - flattenedEdges.push_back(edge.first); - } - for (const auto& edge : edges) { - flattenedEdges.push_back(edge.second); - } - edgesList.push_back(flattenedEdges); - } - } - - // Replace NaN in a vector into value - template - static int replaceNaN(std::vector& vec, T value) - { - int numNaN = 0; - for (auto& el : vec) { - if (std::isnan(el)) { - el = value; - ++numNaN; - } - } - return numNaN; - } - - public: - GNNBjetAllocator() : TensorAllocator(), nJetFeat(4), nTrkFeat(13), nFlav(3), nTrkOrigin(5), maxNNodes(40) {} - GNNBjetAllocator(int64_t nJetFeat, int64_t nTrkFeat, int64_t nFlav, int64_t nTrkOrigin, std::vector& tfJetMean, std::vector& tfJetStdev, std::vector& tfTrkMean, std::vector& tfTrkStdev, int64_t maxNNodes = 40) - : TensorAllocator(), nJetFeat(nJetFeat), nTrkFeat(nTrkFeat), nFlav(nFlav), nTrkOrigin(nTrkOrigin), maxNNodes(maxNNodes), tfJetMean(tfJetMean), tfJetStdev(tfJetStdev), tfTrkMean(tfTrkMean), tfTrkStdev(tfTrkStdev) - { - setEdgesList(); - } - ~GNNBjetAllocator() = default; - - // Copy operator for initializing GNNBjetAllocator using Configurable values - GNNBjetAllocator& operator=(const GNNBjetAllocator& other) - { - nJetFeat = other.nJetFeat; - nTrkFeat = other.nTrkFeat; - nFlav = other.nFlav; - nTrkOrigin = other.nTrkOrigin; - maxNNodes = other.maxNNodes; - tfJetMean = other.tfJetMean; - tfJetStdev = other.tfJetStdev; - tfTrkMean = other.tfTrkMean; - tfTrkStdev = other.tfTrkStdev; - setEdgesList(); - return *this; - } - - // Allocate & Return GNN input tensors (std::vector) - template - void getGNNInput(std::vector& jetFeat, std::vector>& trkFeat, std::vector& feat, std::vector& gnnInput) - { - int64_t nNodes = trkFeat.size(); - - std::vector edgesShape{2, nNodes * nNodes}; - gnnInput.emplace_back(createTensor(edgesList[nNodes], edgesShape)); - - std::vector featShape{nNodes, nJetFeat + nTrkFeat}; - - int numNaN = replaceNaN(jetFeat, 0.f); - for (auto& aTrkFeat : trkFeat) { - for (size_t i = 0; i < jetFeat.size(); ++i) - feat.push_back(jetFeatureTransform(jetFeat[i], i)); - numNaN += replaceNaN(aTrkFeat, 0.f); - for (size_t i = 0; i < aTrkFeat.size(); ++i) - feat.push_back(trkFeatureTransform(aTrkFeat[i], i)); - } - - gnnInput.emplace_back(createTensor(feat, featShape)); - - if (numNaN > 0) { - LOGF(info, "NaN found in GNN input feature, number of NaN: %d", numNaN); - } - } + double SVpT = 0.0; + double DeltaRSVJet = 0.0; + double SVMass = 0.0; + double SVfE = 0.0; + double IPxy = 0.0; + double CPA = 0.0; + double Chi2PCA = 0.0; + double Dispersion = 0.0; + double DecayLength2D = 0.0; + double DecayLength2DError = 0.0; + double DecayLength3D = 0.0; + double DecayLength3DError = 0.0; }; //________________________________________________________________________ bool isBHadron(int pc) { + using o2::constants::physics::Pdg; std::vector bPdG = {Pdg::kB0, Pdg::kBPlus, 10511, 10521, 513, 523, 10513, 10523, 20513, 20523, 20513, 20523, 515, 525, Pdg::kBS, 10531, 533, 10533, 20533, 535, 541, 10541, 543, 10543, 20543, 545, 551, 10551, 100551, 110551, 200551, 210551, 553, 10553, 20553, 30553, 100553, 110553, 120553, 130553, 200553, 210553, 220553, 300553, 9000533, 9010553, 555, 10555, 20555, - 100555, 110555, 120555, 200555, 557, 100557, Pdg::kLambdaB0, 5112, 5212, 5222, 5114, 5214, 5224, 5132, kXiB0, 5312, 5322, + 100555, 110555, 120555, 200555, 557, 100557, Pdg::kLambdaB0, 5112, 5212, 5222, 5114, 5214, 5224, 5132, Pdg::kXiB0, 5312, 5322, 5314, 5324, 5332, 5334, 5142, 5242, 5412, 5422, 5414, 5424, 5342, 5432, 5434, 5442, 5444, 5512, 5522, 5514, 5524, 5532, 5534, 5542, 5544, 5554}; @@ -276,6 +125,7 @@ bool isBHadron(int pc) //________________________________________________________________________ bool isCHadron(int pc) { + using o2::constants::physics::Pdg; std::vector bPdG = {Pdg::kDPlus, Pdg::kD0, Pdg::kD0StarPlus, Pdg::kD0Star0, 413, 423, 10413, 10423, 20431, 20423, Pdg::kD2StarPlus, Pdg::kD2Star0, Pdg::kDS, 10431, Pdg::kDSStar, Pdg::kDS1, 20433, Pdg::kDS2Star, 441, 10441, 100441, Pdg::kJPsi, 10443, Pdg::kChiC1, 100443, 30443, 9000443, 9010443, 9020443, 445, 100445, Pdg::kLambdaCPlus, Pdg::kSigmaCPlusPlus, 4212, Pdg::kSigmaC0, 4224, 4214, 4114, Pdg::kXiCPlus, Pdg::kXiC0, 4322, 4312, 4324, 4314, Pdg::kOmegaC0, 4334, 4412, Pdg::kXiCCPlusPlus, 4414, 4424, 4432, 4434, 4444}; @@ -1106,48 +956,6 @@ int vertexClustering(AnyCollision const& collision, AnalysisJet const& jet, AnyT return nVertices; } -std::vector> getInputsForML(BJetParams jetparams, std::vector& tracksParams, std::vector& svsParams, int maxJetConst = 10) -{ - std::vector jetInput = {jetparams.mJetpT, jetparams.mJetEta, jetparams.mJetPhi, static_cast(jetparams.mNTracks), static_cast(jetparams.mNSV), jetparams.mJetMass}; - std::vector tracksInputFlat; - std::vector svsInputFlat; - - for (int iconstit = 0; iconstit < maxJetConst; iconstit++) { - - tracksInputFlat.push_back(tracksParams[iconstit].mTrackpT); - tracksInputFlat.push_back(tracksParams[iconstit].mTrackEta); - tracksInputFlat.push_back(tracksParams[iconstit].mDotProdTrackJet); - tracksInputFlat.push_back(tracksParams[iconstit].mDotProdTrackJetOverJet); - tracksInputFlat.push_back(tracksParams[iconstit].mDeltaRJetTrack); - tracksInputFlat.push_back(tracksParams[iconstit].mSignedIP2D); - tracksInputFlat.push_back(tracksParams[iconstit].mSignedIP2DSign); - tracksInputFlat.push_back(tracksParams[iconstit].mSignedIP3D); - tracksInputFlat.push_back(tracksParams[iconstit].mSignedIP3DSign); - tracksInputFlat.push_back(tracksParams[iconstit].mMomFraction); - tracksInputFlat.push_back(tracksParams[iconstit].mDeltaRTrackVertex); - - svsInputFlat.push_back(svsParams[iconstit].mSVpT); - svsInputFlat.push_back(svsParams[iconstit].mDeltaRSVJet); - svsInputFlat.push_back(svsParams[iconstit].mSVMass); - svsInputFlat.push_back(svsParams[iconstit].mSVfE); - svsInputFlat.push_back(svsParams[iconstit].mIPXY); - svsInputFlat.push_back(svsParams[iconstit].mCPA); - svsInputFlat.push_back(svsParams[iconstit].mChi2PCA); - svsInputFlat.push_back(svsParams[iconstit].mDispersion); - svsInputFlat.push_back(svsParams[iconstit].mDecayLength2D); - svsInputFlat.push_back(svsParams[iconstit].mDecayLength2DError); - svsInputFlat.push_back(svsParams[iconstit].mDecayLength3D); - svsInputFlat.push_back(svsParams[iconstit].mDecayLength3DError); - } - - std::vector> totalInput; - totalInput.push_back(jetInput); - totalInput.push_back(tracksInputFlat); - totalInput.push_back(svsInputFlat); - - return totalInput; -} - // Looping over the SV info and putting them in the input vector template void analyzeJetSVInfo4ML(AnalysisJet const& myJet, AnyTracks const& /*allTracks*/, SecondaryVertices const& /*allSVs*/, std::vector& svsParams, float svPtMin = 1.0, int svReductionFactor = 3) @@ -1193,7 +1001,7 @@ void analyzeJetTrackInfo4ML(AnalysisJet const& analysisJet, AnyTracks const& /*a double deltaRJetTrack = jetutilities::deltaR(analysisJet, constituent); double dotProduct = RecoDecay::dotProd(std::array{analysisJet.px(), analysisJet.py(), analysisJet.pz()}, std::array{constituent.px(), constituent.py(), constituent.pz()}); - int sign = jettaggingutilities::getGeoSign(analysisJet, constituent); + int sign = getGeoSign(analysisJet, constituent); float rClosestSV = 10.; for (const auto& candSV : analysisJet.template secondaryVertices_as()) { @@ -1207,7 +1015,32 @@ void analyzeJetTrackInfo4ML(AnalysisJet const& analysisJet, AnyTracks const& /*a } auto compare = [](BJetTrackParams& tr1, BJetTrackParams& tr2) { - return (tr1.mSignedIP2D / tr1.mSignedIP2DSign) > (tr2.mSignedIP2D / tr2.mSignedIP2DSign); + return (tr1.SignedIP2D / tr1.SignedIP2DSign) > (tr2.SignedIP2D / tr2.SignedIP2DSign); + }; + + // Sort the tracks based on their IP significance in descending order + std::sort(tracksParams.begin(), tracksParams.end(), compare); +} + +// Looping over the track info and putting them in the input vector without using any SV info +template +void analyzeJetTrackInfo4MLnoSV(AnalysisJet const& analysisJet, AnyTracks const& /*allTracks*/, std::vector& tracksParams, float trackPtMin = 0.5) +{ + for (const auto& constituent : analysisJet.template tracks_as()) { + + if (constituent.pt() < trackPtMin) { + continue; + } + + double deltaRJetTrack = jetutilities::deltaR(analysisJet, constituent); + double dotProduct = RecoDecay::dotProd(std::array{analysisJet.px(), analysisJet.py(), analysisJet.pz()}, std::array{constituent.px(), constituent.py(), constituent.pz()}); + int sign = getGeoSign(analysisJet, constituent); + + tracksParams.emplace_back(BJetTrackParams{constituent.pt(), constituent.eta(), dotProduct, dotProduct / analysisJet.p(), deltaRJetTrack, std::abs(constituent.dcaXY()) * sign, constituent.sigmadcaXY(), std::abs(constituent.dcaXYZ()) * sign, constituent.sigmadcaXYZ(), constituent.p() / analysisJet.p(), 0.0}); + } + + auto compare = [](BJetTrackParams& tr1, BJetTrackParams& tr2) { + return (tr1.SignedIP2D / tr1.SignedIP2DSign) > (tr2.SignedIP2D / tr2.SignedIP2DSign); }; // Sort the tracks based on their IP significance in descending order @@ -1224,7 +1057,7 @@ void analyzeJetTrackInfo4GNN(AnalysisJet const& analysisJet, AnyTracks const& /* continue; } - int sign = jettaggingutilities::getGeoSign(analysisJet, constituent); + int sign = getGeoSign(analysisJet, constituent); auto origConstit = constituent.template track_as(); @@ -1245,7 +1078,7 @@ void analyzeJetTrackInfo4GNN(AnalysisJet const& analysisJet, AnyTracks const& /* // Discriminant value for GNN b-jet tagging template -T Db(const std::vector& logits, double fC = 0.018) +T getDb(const std::vector& logits, double fC = 0.018) { auto softmax = [](const std::vector& logits) { std::vector res; diff --git a/PWGJE/Core/MlResponseHfTagging.h b/PWGJE/Core/MlResponseHfTagging.h new file mode 100644 index 00000000000..f66c16e30c1 --- /dev/null +++ b/PWGJE/Core/MlResponseHfTagging.h @@ -0,0 +1,453 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file MlResponseHfTagging.h +/// \brief Class to compute the ML response for b-jet analysis +/// \author Hadi Hassan , University of Jyväskylä + +#ifndef PWGJE_CORE_MLRESPONSEHFTAGGING_H_ +#define PWGJE_CORE_MLRESPONSEHFTAGGING_H_ + +#include +#include +#include + +#include "Tools/ML/MlResponse.h" +#include "PWGJE/Core/JetTaggingUtilities.h" + +#if __has_include() +#include +#else +#include +#endif + +// Fill the map of available input features +// the key is the feature's name (std::string) +// the value is the corresponding value in EnumInputFeatures +#define FILL_MAP_BJET(FEATURE) \ + { \ + #FEATURE, static_cast(InputFeaturesBTag::FEATURE) \ + } + +// Check if the index of mCachedIndices (index associated to a FEATURE) +// matches the entry in EnumInputFeatures associated to this FEATURE +// if so, the VECTOR vector is filled with the FEATURE's value +// by calling the corresponding GETTER from OBJECT +#define CHECK_AND_FILL_VEC_BTAG_FULL(VECTOR, OBJECT, FEATURE, GETTER) \ + case static_cast(InputFeaturesBTag::FEATURE): { \ + VECTOR.emplace_back(OBJECT.GETTER); \ + break; \ + } + +// Specific case of CHECK_AND_FILL_VEC_BTAG_FULL(VECTOR, OBJECT, FEATURE, GETTER) +// where FEATURE = GETTER +#define CHECK_AND_FILL_VEC_BTAG(VECTOR, OBJECT, GETTER) \ + case static_cast(InputFeaturesBTag::GETTER): { \ + VECTOR.emplace_back(OBJECT.GETTER); \ + break; \ + } + +namespace o2::analysis +{ +enum class InputFeaturesBTag : uint8_t { + JetpT = 0, + JetEta, + JetPhi, + NTracks, + NSV, + JetMass, + TrackpT, + TrackEta, + DotProdTrackJet, + DotProdTrackJetOverJet, + DeltaRJetTrack, + SignedIP2D, + SignedIP2DSign, + SignedIP3D, + SignedIP3DSign, + MomFraction, + DeltaRTrackVertex, + TrackPhi, + TrackCharge, + TrackITSChi2NCl, + TrackTPCChi2NCl, + TrackITSNCls, + TrackTPCNCls, + TrackTPCNCrossedRows, + TrackOrigin, + TrackVtxIndex, + SVpT, + DeltaRSVJet, + SVMass, + SVfE, + IPxy, + CPA, + Chi2PCA, + Dispersion, + DecayLength2D, + DecayLength2DError, + DecayLength3D, + DecayLength3DError, +}; + +template +class MlResponseHfTagging : public MlResponse +{ + public: + /// Default constructor + MlResponseHfTagging() = default; + /// Default destructor + virtual ~MlResponseHfTagging() = default; + + /// @brief Method to get the input shape of the model + /// @return A vector of input shapes + std::vector> getInputShape() const { return this->mModels[0].getInputShapes(); } + + /// Method to fill the inputs of jet, tracks and secondary vertices + /// \param jet is the b-jet candidate + /// \param tracks is the vector of tracks associated to the jet + /// \param svs is the vector of secondary vertices associated to the jet + /// \param jetInput the jet input features vector to be filled + /// \param trackInput the tracks input features vector to be filled + /// \param svInput the SVs input features vector to be filled + template + void fillInputFeatures(T1 const& jet, std::vector const& tracks, std::vector const& svs, std::vector& jetInput, std::vector& trackInput, std::vector& svInput) + { + + // Jet features + for (const auto& idx : MlResponse::mCachedIndices) { + switch (idx) { + CHECK_AND_FILL_VEC_BTAG(jetInput, jet, JetpT) + CHECK_AND_FILL_VEC_BTAG(jetInput, jet, JetEta) + CHECK_AND_FILL_VEC_BTAG(jetInput, jet, JetPhi) + CHECK_AND_FILL_VEC_BTAG(jetInput, jet, NTracks) + CHECK_AND_FILL_VEC_BTAG(jetInput, jet, NSV) + CHECK_AND_FILL_VEC_BTAG(jetInput, jet, JetMass) + + default: + break; + } + } + + // Track features + for (const auto& track : tracks) { + for (const auto& idx : MlResponse::mCachedIndices) { + switch (idx) { + CHECK_AND_FILL_VEC_BTAG(trackInput, track, TrackpT) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, TrackEta) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, DotProdTrackJet) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, DotProdTrackJetOverJet) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, DeltaRJetTrack) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, SignedIP2D) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, SignedIP2DSign) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, SignedIP3D) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, SignedIP3DSign) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, MomFraction) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, DeltaRTrackVertex) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, TrackPhi) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, TrackCharge) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, TrackITSChi2NCl) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, TrackTPCChi2NCl) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, TrackITSNCls) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, TrackTPCNCls) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, TrackTPCNCrossedRows) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, TrackOrigin) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, TrackVtxIndex) + + default: + break; + } + } + } + + // Secondary vertex features + for (const auto& sv : svs) { + for (const auto& idx : MlResponse::mCachedIndices) { + switch (idx) { + CHECK_AND_FILL_VEC_BTAG(svInput, sv, SVpT) + CHECK_AND_FILL_VEC_BTAG(svInput, sv, DeltaRSVJet) + CHECK_AND_FILL_VEC_BTAG(svInput, sv, SVMass) + CHECK_AND_FILL_VEC_BTAG(svInput, sv, SVfE) + CHECK_AND_FILL_VEC_BTAG(svInput, sv, IPxy) + CHECK_AND_FILL_VEC_BTAG(svInput, sv, CPA) + CHECK_AND_FILL_VEC_BTAG(svInput, sv, Chi2PCA) + CHECK_AND_FILL_VEC_BTAG(svInput, sv, Dispersion) + CHECK_AND_FILL_VEC_BTAG(svInput, sv, DecayLength2D) + CHECK_AND_FILL_VEC_BTAG(svInput, sv, DecayLength2DError) + CHECK_AND_FILL_VEC_BTAG(svInput, sv, DecayLength3D) + CHECK_AND_FILL_VEC_BTAG(svInput, sv, DecayLength3DError) + + default: + break; + } + } + } + } + + /// Method to get the input features vector needed for ML inference in a 2D vector + /// \param jet is the b-jet candidate + /// \param tracks is the vector of tracks associated to the jet + /// \param svs is the vector of secondary vertices associated to the jet + /// \return inputFeatures vector + template + std::vector> getInputFeatures2D(T1 const& jet, std::vector const& tracks, std::vector const& svs) + { + + std::vector jetInput; + std::vector trackInput; + std::vector svInput; + + fillInputFeatures(jet, tracks, svs, jetInput, trackInput, svInput); + + std::vector> inputFeatures; + + inputFeatures.push_back(jetInput); + inputFeatures.push_back(trackInput); + inputFeatures.push_back(svInput); + + return inputFeatures; + } + + /// Method to get the input features vector needed for ML inference in a 1D vector + /// \param jet is the b-jet candidate + /// \param tracks is the vector of tracks associated to the jet + /// \param svs is the vector of secondary vertices associated to the jet + /// \return inputFeatures vector + template + std::vector getInputFeatures1D(T1 const& jet, std::vector const& tracks, std::vector const& svs) + { + + std::vector jetInput; + std::vector trackInput; + std::vector svInput; + + fillInputFeatures(jet, tracks, svs, jetInput, trackInput, svInput); + + std::vector inputFeatures; + + inputFeatures.insert(inputFeatures.end(), jetInput.begin(), jetInput.end()); + inputFeatures.insert(inputFeatures.end(), trackInput.begin(), trackInput.end()); + inputFeatures.insert(inputFeatures.end(), svInput.begin(), svInput.end()); + + return inputFeatures; + } + + protected: + /// Method to fill the map of available input features + void setAvailableInputFeatures() + { + MlResponse::mAvailableInputFeatures = { + // Jet features + FILL_MAP_BJET(JetpT), + FILL_MAP_BJET(JetEta), + FILL_MAP_BJET(JetPhi), + FILL_MAP_BJET(NTracks), + FILL_MAP_BJET(NSV), + FILL_MAP_BJET(JetMass), + + // Track features + FILL_MAP_BJET(TrackpT), + FILL_MAP_BJET(TrackEta), + FILL_MAP_BJET(DotProdTrackJet), + FILL_MAP_BJET(DotProdTrackJetOverJet), + FILL_MAP_BJET(DeltaRJetTrack), + FILL_MAP_BJET(SignedIP2D), + FILL_MAP_BJET(SignedIP2DSign), + FILL_MAP_BJET(SignedIP3D), + FILL_MAP_BJET(SignedIP3DSign), + FILL_MAP_BJET(MomFraction), + FILL_MAP_BJET(DeltaRTrackVertex), + FILL_MAP_BJET(TrackPhi), + FILL_MAP_BJET(TrackCharge), + FILL_MAP_BJET(TrackITSChi2NCl), + FILL_MAP_BJET(TrackTPCChi2NCl), + FILL_MAP_BJET(TrackITSNCls), + FILL_MAP_BJET(TrackTPCNCls), + FILL_MAP_BJET(TrackTPCNCrossedRows), + FILL_MAP_BJET(TrackOrigin), + FILL_MAP_BJET(TrackVtxIndex), + + // Secondary vertex features + FILL_MAP_BJET(SVpT), + FILL_MAP_BJET(DeltaRSVJet), + FILL_MAP_BJET(SVMass), + FILL_MAP_BJET(SVfE), + FILL_MAP_BJET(IPxy), + FILL_MAP_BJET(CPA), + FILL_MAP_BJET(Chi2PCA), + FILL_MAP_BJET(Dispersion), + FILL_MAP_BJET(DecayLength2D), + FILL_MAP_BJET(DecayLength2DError), + FILL_MAP_BJET(DecayLength3D), + FILL_MAP_BJET(DecayLength3DError)}; + } +}; + +// ONNX Runtime tensor (Ort::Value) allocator for using customized inputs of ML models. +class TensorAllocator +{ + protected: +#if !__has_include() + Ort::MemoryInfo memInfo; +#endif + public: + TensorAllocator() +#if !__has_include() + : memInfo(Ort::MemoryInfo::CreateCpu(OrtAllocatorType::OrtArenaAllocator, OrtMemType::OrtMemTypeDefault)) +#endif + { + } + ~TensorAllocator() = default; + template + Ort::Value createTensor(std::vector& input, std::vector& inputShape) + { +#if __has_include() + return Ort::Experimental::Value::CreateTensor(input.data(), input.size(), inputShape); +#else + return Ort::Value::CreateTensor(memInfo, input.data(), input.size(), inputShape.data(), inputShape.size()); +#endif + } +}; + +// TensorAllocator for GNN b-jet tagger +class GNNBjetAllocator : public TensorAllocator +{ + private: + int64_t nJetFeat; + int64_t nTrkFeat; + int64_t nFlav; + int64_t nTrkOrigin; + int64_t maxNNodes; + + std::vector tfJetMean; + std::vector tfJetStdev; + std::vector tfTrkMean; + std::vector tfTrkStdev; + + std::vector> edgesList; + + // Jet feature normalization + template + T jetFeatureTransform(T feat, int idx) const + { + return (feat - tfJetMean[idx]) / tfJetStdev[idx]; + } + + // Track feature normalization + template + T trkFeatureTransform(T feat, int idx) const + { + return (feat - tfTrkMean[idx]) / tfTrkStdev[idx]; + } + + // Edge input of GNN (fully-connected graph) + void setEdgesList(void) + { + for (int64_t nNodes = 0; nNodes <= maxNNodes; ++nNodes) { + std::vector> edges; + // Generate all permutations of (i, j) where i != j + for (int64_t i = 0; i < nNodes; ++i) { + for (int64_t j = 0; j < nNodes; ++j) { + if (i != j) { + edges.emplace_back(i, j); + } + } + } + // Add self-loops (i, i) + for (int64_t i = 0; i < nNodes; ++i) { + edges.emplace_back(i, i); + } + // Flatten + std::vector flattenedEdges; + for (const auto& edge : edges) { + flattenedEdges.push_back(edge.first); + } + for (const auto& edge : edges) { + flattenedEdges.push_back(edge.second); + } + edgesList.push_back(flattenedEdges); + } + } + + // Replace NaN in a vector into value + template + static int replaceNaN(std::vector& vec, T value) + { + int numNaN = 0; + for (auto& el : vec) { // o2-linter: disable=const-ref-in-for-loop + if (std::isnan(el)) { + el = value; + ++numNaN; + } + } + return numNaN; + } + + public: + GNNBjetAllocator() : TensorAllocator(), nJetFeat(4), nTrkFeat(13), nFlav(3), nTrkOrigin(5), maxNNodes(40) {} + GNNBjetAllocator(int64_t nJetFeat, int64_t nTrkFeat, int64_t nFlav, int64_t nTrkOrigin, std::vector& tfJetMean, std::vector& tfJetStdev, std::vector& tfTrkMean, std::vector& tfTrkStdev, int64_t maxNNodes = 40) + : TensorAllocator(), nJetFeat(nJetFeat), nTrkFeat(nTrkFeat), nFlav(nFlav), nTrkOrigin(nTrkOrigin), maxNNodes(maxNNodes), tfJetMean(tfJetMean), tfJetStdev(tfJetStdev), tfTrkMean(tfTrkMean), tfTrkStdev(tfTrkStdev) + { + setEdgesList(); + } + ~GNNBjetAllocator() = default; + + // Copy operator for initializing GNNBjetAllocator using Configurable values + GNNBjetAllocator& operator=(const GNNBjetAllocator& other) + { + nJetFeat = other.nJetFeat; + nTrkFeat = other.nTrkFeat; + nFlav = other.nFlav; + nTrkOrigin = other.nTrkOrigin; + maxNNodes = other.maxNNodes; + tfJetMean = other.tfJetMean; + tfJetStdev = other.tfJetStdev; + tfTrkMean = other.tfTrkMean; + tfTrkStdev = other.tfTrkStdev; + setEdgesList(); + return *this; + } + + // Allocate & Return GNN input tensors (std::vector) + template + void getGNNInput(std::vector& jetFeat, std::vector>& trkFeat, std::vector& feat, std::vector& gnnInput) + { + int64_t nNodes = trkFeat.size(); + + std::vector edgesShape{2, nNodes * nNodes}; + gnnInput.emplace_back(createTensor(edgesList[nNodes], edgesShape)); + + std::vector featShape{nNodes, nJetFeat + nTrkFeat}; + + int numNaN = replaceNaN(jetFeat, 0.f); + for (auto& aTrkFeat : trkFeat) { // o2-linter: disable=const-ref-in-for-loop + for (size_t i = 0; i < jetFeat.size(); ++i) + feat.push_back(jetFeatureTransform(jetFeat[i], i)); + numNaN += replaceNaN(aTrkFeat, 0.f); + for (size_t i = 0; i < aTrkFeat.size(); ++i) + feat.push_back(trkFeatureTransform(aTrkFeat[i], i)); + } + + gnnInput.emplace_back(createTensor(feat, featShape)); + + if (numNaN > 0) { + LOGF(info, "NaN found in GNN input feature, number of NaN: %d", numNaN); + } + } +}; + +} // namespace o2::analysis + +#undef FILL_MAP_BJET +#undef CHECK_AND_FILL_VEC_BTAG_FULL +#undef CHECK_AND_FILL_VEC_BTAG + +#endif // PWGJE_CORE_MLRESPONSEHFTAGGING_H_ diff --git a/PWGJE/TableProducer/jetTaggerHF.cxx b/PWGJE/TableProducer/jetTaggerHF.cxx index 87500439614..785118fa180 100644 --- a/PWGJE/TableProducer/jetTaggerHF.cxx +++ b/PWGJE/TableProducer/jetTaggerHF.cxx @@ -36,7 +36,7 @@ #include "PWGJE/DataModel/JetTagging.h" #include "PWGJE/Core/JetTaggingUtilities.h" #include "PWGJE/Core/JetDerivedDataUtilities.h" -#include "Tools/ML/MlResponse.h" +#include "PWGJE/Core/MlResponseHfTagging.h" using namespace o2; using namespace o2::framework; @@ -64,13 +64,13 @@ struct JetTaggerHFTask { Configurable trackProbQA{"trackProbQA", false, "fill track probability histograms separately for geometric positive and negative tracks for QA"}; Configurable numCount{"numCount", 3, "number of track counting"}; Configurable resoFuncMatching{"resoFuncMatching", 0, "matching parameters of resolution function as MC samble (0: custom, 1: custom & inc, 2: MB, 3: MB & inc, 4: JJ, 5: JJ & inc)"}; - Configurable> IPparameterPathsCCDB{"IPparameterPathsCCDB", std::vector{"Users/l/leehy/LHC24g4/f_inclusive_0", "Users/l/leehy/LHC24g4/f_inclusive_1", "Users/l/leehy/LHC24g4/f_inclusive_2", "Users/l/leehy/LHC24g4/f_inclusive_3", "Users/l/leehy/LHC24g4/f_inclusive_4", "Users/l/leehy/LHC24g4/f_inclusive_5", "Users/l/leehy/LHC24g4/f_inclusive_6"}, "Paths for fitting parameters of resolution functions for IP method on CCDB"}; + Configurable> pathsCCDBforIPparamer{"pathsCCDBforIPparamer", std::vector{"Users/l/leehy/LHC24g4/f_inclusive_0"}, "Paths for fitting parameters of resolution functions for IP method on CCDB"}; Configurable usepTcategorize{"usepTcategorize", false, "p_T categorize TF1 function with Inclusive jet"}; - Configurable> paramsResoFuncData{"paramsResoFuncData", std::vector{1306800, -0.1049, 0.861425, 13.7547, 0.977967, 8.96823, 0.151595, 6.94499, 0.0250301}, "parameters of gaus(0)+expo(3)+expo(5)+expo(7))"}; - Configurable> paramsResoFuncIncJetMC{"paramsResoFuncIncJetMC", std::vector{1908803.027, -0.059, 0.895, 13.467, 1.005, 8.867, 0.098, 6.929, 0.011}, "parameters of gaus(0)+expo(3)+expo(5)+expo(7)))"}; - Configurable> paramsResoFuncCharmJetMC{"paramsResoFuncCharmJetMC", std::vector{282119.753, -0.065, 0.893, 11.608, 0.945, 8.029, 0.131, 6.244, 0.027}, "parameters of gaus(0)+expo(3)+expo(5)+expo(7)))"}; - Configurable> paramsResoFuncBeautyJetMC{"paramsResoFuncBeautyJetMC", std::vector{74901.583, -0.082, 0.874, 10.332, 0.941, 7.352, 0.097, 6.220, 0.022}, "parameters of gaus(0)+expo(3)+expo(5)+expo(7)))"}; - Configurable> paramsResoFuncLfJetMC{"paramsResoFuncLfJetMC", std::vector{1539435.343, -0.061, 0.896, 13.272, 1.034, 5.884, 0.004, 7.843, 0.090}, "parameters of gaus(0)+expo(3)+expo(5)+expo(7)))"}; + Configurable> paramsResoFuncData{"paramsResoFuncData", std::vector{-1.0}, "parameters of gaus(0)+expo(3)+expo(5)+expo(7))"}; + Configurable> paramsResoFuncIncJetMC{"paramsResoFuncIncJetMC", std::vector{-1.0}, "parameters of gaus(0)+expo(3)+expo(5)+expo(7)))"}; + Configurable> paramsResoFuncCharmJetMC{"paramsResoFuncCharmJetMC", std::vector{-1.0}, "parameters of gaus(0)+expo(3)+expo(5)+expo(7)))"}; + Configurable> paramsResoFuncBeautyJetMC{"paramsResoFuncBeautyJetMC", std::vector{-1.0}, "parameters of gaus(0)+expo(3)+expo(5)+expo(7)))"}; + Configurable> paramsResoFuncLfJetMC{"paramsResoFuncLfJetMC", std::vector{-1.0}, "parameters of gaus(0)+expo(3)+expo(5)+expo(7)))"}; Configurable minSignImpXYSig{"minSignImpXYSig", -40.0, "minimum of signed impact parameter significance"}; Configurable tagPointForIP{"tagPointForIP", 2.5, "tagging working point for IP"}; Configurable tagPointForIPxyz{"tagPointForIPxyz", 2.5, "tagging working point for IP xyz"}; @@ -103,23 +103,23 @@ struct JetTaggerHFTask { Configurable nTrkFeat{"nTrkFeat", 13, "Number of track GNN input features"}; Configurable nTrkOrigin{"nTrkOrigin", 5, "Number of track origin categories"}; Configurable> transformFeatureJetMean{"transformFeatureJetMean", - std::vector{3.7093048e+01, 3.1462731e+00, -8.9617318e-04, 4.5036483e+00}, + std::vector{-999}, "Mean values for each GNN input feature (jet)"}; Configurable> transformFeatureJetStdev{"transformFeatureJetStdev", - std::vector{3.9559139e+01, 1.8156786e+00, 2.8845072e-01, 4.6293869e+00}, + std::vector{-999}, "Stdev values for each GNN input feature (jet)"}; Configurable> transformFeatureTrkMean{"transformFeatureTrkMean", - std::vector{5.8772368e+00, 3.1470699e+00, -1.4703944e-03, 1.9976571e-03, 1.7700187e-03, 3.5821514e-03, 1.9987826e-03, 7.3673888e-03, 6.6411214e+00, 1.3810074e+02, 1.4888744e+02, 6.5751970e-01, 1.6469173e+00}, + std::vector{-999}, "Mean values for each GNN input feature (track)"}; Configurable> transformFeatureTrkStdev{"transformFeatureTrkStdev", - std::vector{9.2763824e+00, 1.8162115e+00, 3.1512174e-01, 9.9999982e-01, 5.6147423e-02, 2.3086982e-02, 1.6523319e+00, 4.8507337e-02, 8.1565088e-01, 1.2891182e+01, 1.1064601e+01, 9.5457840e-01, 2.8930053e-01}, + std::vector{-999}, "Stdev values for each GNN input feature (track)"}; // axis spec ConfigurableAxis binTrackProbability{"binTrackProbability", {100, 0.f, 1.f}, ""}; ConfigurableAxis binJetFlavour{"binJetFlavour", {6, -0.5, 5.5}, ""}; - o2::analysis::MlResponse bMlResponse; + o2::analysis::MlResponseHfTagging bMlResponse; o2::ccdb::CcdbApi ccdbApi; using JetTracksExt = soa::Join; @@ -141,7 +141,7 @@ struct JetTaggerHFTask { std::vector decisionNonML; std::vector scoreML; - jettaggingutilities::GNNBjetAllocator tensorAlloc; + o2::analysis::GNNBjetAllocator tensorAlloc; template float calculateJetProbability(int origin, T const& jet, U const& tracks, bool const& isMC = false) @@ -263,7 +263,7 @@ struct JetTaggerHFTask { std::map metadata; // dummy meta data (will be updated) // fill the timestamp directly of each TF1 according to p_T track range (0, 0.5, 1, 2, 4, 6, 9) for (int i = 0; i < 7; i++) { - resoFuncCCDB.push_back(ccdbApi.retrieveFromTFileAny(IPparameterPathsCCDB->at(i), metadata, -1)); + resoFuncCCDB.push_back(ccdbApi.retrieveFromTFileAny(pathsCCDBforIPparamer->at(i), metadata, -1)); } } @@ -364,12 +364,12 @@ struct JetTaggerHFTask { } else { bMlResponse.setModelPathsLocal(onnxFileNames); } - // bMlResponse.cacheInputFeaturesIndices(namesInputFeatures); + bMlResponse.cacheInputFeaturesIndices(namesInputFeatures); bMlResponse.init(); } if (doprocessAlgorithmGNN) { - tensorAlloc = jettaggingutilities::GNNBjetAllocator(nJetFeat.value, nTrkFeat.value, nClassesMl.value, nTrkOrigin.value, transformFeatureJetMean.value, transformFeatureJetStdev.value, transformFeatureTrkMean.value, transformFeatureTrkStdev.value, nJetConst); + tensorAlloc = o2::analysis::GNNBjetAllocator(nJetFeat.value, nTrkFeat.value, nClassesMl.value, nTrkOrigin.value, transformFeatureJetMean.value, transformFeatureJetStdev.value, transformFeatureTrkMean.value, transformFeatureTrkStdev.value, nJetConst); registry.add("h_db_b", "#it{D}_{b} b-jet;#it{D}_{b}", {HistType::kTH1F, {{50, -10., 35.}}}); registry.add("h_db_c", "#it{D}_{b} c-jet;#it{D}_{b}", {HistType::kTH1F, {{50, -10., 35.}}}); registry.add("h_db_lf", "#it{D}_{b} lf-jet;#it{D}_{b}", {HistType::kTH1F, {{50, -10., 35.}}}); @@ -385,8 +385,8 @@ struct JetTaggerHFTask { std::vector tracksParams; std::vector svsParams; - analyzeJetSVInfo4ML(analysisJet, allTracks, allSVs, svsParams, svPtMin, svReductionFactor); - analyzeJetTrackInfo4ML(analysisJet, allTracks, allSVs, tracksParams, trackPtMin); + jettaggingutilities::analyzeJetSVInfo4ML(analysisJet, allTracks, allSVs, svsParams, svPtMin, svReductionFactor); + jettaggingutilities::analyzeJetTrackInfo4ML(analysisJet, allTracks, allSVs, tracksParams, trackPtMin); int nSVs = analysisJet.template secondaryVertices_as().size(); @@ -394,11 +394,42 @@ struct JetTaggerHFTask { tracksParams.resize(nJetConst); // resize to the number of inputs of the ML svsParams.resize(nJetConst); // resize to the number of inputs of the ML - auto inputML = getInputsForML(jetparam, tracksParams, svsParams, nJetConst); + std::vector output; + + if (bMlResponse.getInputShape().size() > 1) { + auto inputML = bMlResponse.getInputFeatures2D(jetparam, tracksParams, svsParams); + bMlResponse.isSelectedMl(inputML, analysisJet.pt(), output); + } else { + auto inputML = bMlResponse.getInputFeatures1D(jetparam, tracksParams, svsParams); + bMlResponse.isSelectedMl(inputML, analysisJet.pt(), output); + } + + scoreML[analysisJet.globalIndex()] = output[0]; + } + } + + template + void analyzeJetAlgorithmMLnoSV(AnyJets const& alljets, AnyTracks const& allTracks) + { + for (const auto& analysisJet : alljets) { + + std::vector tracksParams; + std::vector svsParams; + + jettaggingutilities::analyzeJetTrackInfo4MLnoSV(analysisJet, allTracks, tracksParams, trackPtMin); + + jettaggingutilities::BJetParams jetparam = {analysisJet.pt(), analysisJet.eta(), analysisJet.phi(), static_cast(tracksParams.size()), 0, analysisJet.mass()}; + tracksParams.resize(nJetConst); // resize to the number of inputs of the ML std::vector output; - // bool isSelectedMl = bMlResponse.isSelectedMl(inputML, analysisJet.pt(), output); - bMlResponse.isSelectedMl(inputML, analysisJet.pt(), output); + + if (bMlResponse.getInputShape().size() > 1) { + auto inputML = bMlResponse.getInputFeatures2D(jetparam, tracksParams, svsParams); + bMlResponse.isSelectedMl(inputML, analysisJet.pt(), output); + } else { + auto inputML = bMlResponse.getInputFeatures1D(jetparam, tracksParams, svsParams); + bMlResponse.isSelectedMl(inputML, analysisJet.pt(), output); + } scoreML[analysisJet.globalIndex()] = output[0]; } @@ -419,7 +450,7 @@ struct JetTaggerHFTask { tensorAlloc.getGNNInput(jetFeat, trkFeat, feat, gnnInput); auto modelOutput = bMlResponse.getModelOutput(gnnInput, 0); - scoreML[jet.globalIndex()] = jettaggingutilities::Db(modelOutput, fC); + scoreML[jet.globalIndex()] = jettaggingutilities::getDb(modelOutput, fC); } else { scoreML[jet.globalIndex()] = -999.; LOGF(debug, "doprocessAlgorithmGNN, trkFeat.size() <= 0 (%d)", jet.globalIndex()); @@ -465,6 +496,12 @@ struct JetTaggerHFTask { } PROCESS_SWITCH(JetTaggerHFTask, processAlgorithmML, "Fill ML evaluation score for charged jets", false); + void processAlgorithmMLnoSV(JetTable const& allJets, JetTracksExt const& allTracks) + { + analyzeJetAlgorithmMLnoSV(allJets, allTracks); + } + PROCESS_SWITCH(JetTaggerHFTask, processAlgorithmMLnoSV, "Fill ML evaluation score for charged jets but without using SVs", false); + void processAlgorithmGNN(JetTable const& jets, JetTracksExt const& jtracks, OriginalTracks const& origTracks) { analyzeJetAlgorithmGNN(jets, jtracks, origTracks); diff --git a/PWGJE/Tasks/bjetTaggingML.cxx b/PWGJE/Tasks/bjetTaggingML.cxx index df6939ae504..8cf97bd2049 100644 --- a/PWGJE/Tasks/bjetTaggingML.cxx +++ b/PWGJE/Tasks/bjetTaggingML.cxx @@ -89,6 +89,7 @@ struct BJetTaggingML { registry.add("h_vertexZ", "Vertex Z;#it{Z} (cm)", {HistType::kTH1F, {{40, -20.0, 20.0}}}); registry.add("h2_score_jetpT", "ML scores for inclusive jets;#it{p}_{T,jet} (GeV/#it{c});Score", {HistType::kTH2F, {{200, 0., 200.}, {120, -0.1, 1.1}}}); + registry.add("h2_logscore_jetpT", "ML scores for inclusive jets;#it{p}_{T,jet} (GeV/#it{c});- log(1 - Score)", {HistType::kTH2F, {{200, 0., 200.}, {120, 0, 30}}}); registry.add("h2_nTracks_jetpT", "Number of tracks;#it{p}_{T,jet} (GeV/#it{c});nTracks", {HistType::kTH2F, {{200, 0., 200.}, {100, 0, 100.0}}}); registry.add("h2_nSV_jetpT", "Number of secondary vertices;#it{p}_{T,jet} (GeV/#it{c});nSVs", {HistType::kTH2F, {{200, 0., 200.}, {250, 0, 250.0}}}); @@ -101,17 +102,18 @@ struct BJetTaggingML { registry.add("h2_SVMass_jetpT", "Secondary vertex mass;#it{p}_{T,jet} (GeV/#it{c});#it{m}_{SV} (GeV/#it{c}^{2})", {HistType::kTH2F, {{200, 0., 200.}, {50, 0, 10}}}); if (doDataDriven) { - registry.add("hSparse_Incljets", "Inclusive jets Info;#it{p}_{T,jet} (GeV/#it{c});Score;#it{m}_{jet} (GeV/#it{c}^{2});-log(JP);#it{m}_{SV} (GeV/#it{c}^{2});SVfE;", {HistType::kTHnSparseF, {{200, 0., 200.}, {120, -0.1, 1.1}, {50, 0, 50}, {375, 0, 30}, {50, 0, 10}, {50, 0, 1}}}); + registry.add("hSparse_Incljets", "Inclusive jets Info;#it{p}_{T,jet} (GeV/#it{c});Score;-log(1-score);#it{m}_{jet} (GeV/#it{c}^{2});-log(JP);#it{m}_{SV} (GeV/#it{c}^{2});SVfE;", {HistType::kTHnSparseF, {{200, 0., 200.}, {120, -0.1, 1.1}, {120, 0, 30}, {50, 0, 50}, {375, 0, 30}, {50, 0, 10}, {50, 0, 1}}}); if (doprocessMCJets) { - registry.add("hSparse_bjets", "Tagged b-jets Info;#it{p}_{T,jet} (GeV/#it{c});Score;#it{m}_{jet} (GeV/#it{c}^{2});-log(JP);#it{m}_{SV} (GeV/#it{c}^{2});SVfE;", {HistType::kTHnSparseF, {{200, 0., 200.}, {120, -0.1, 1.1}, {50, 0, 50}, {375, 0, 30}, {50, 0, 10}, {50, 0, 1}}}); - registry.add("hSparse_cjets", "Tagged c-jets Info;#it{p}_{T,jet} (GeV/#it{c});Score;#it{m}_{jet} (GeV/#it{c}^{2});-log(JP);#it{m}_{SV} (GeV/#it{c}^{2});SVfE;", {HistType::kTHnSparseF, {{200, 0., 200.}, {120, -0.1, 1.1}, {50, 0, 50}, {375, 0, 30}, {50, 0, 10}, {50, 0, 1}}}); - registry.add("hSparse_lfjets", "Tagged lf-jets Info;#it{p}_{T,jet} (GeV/#it{c});Score;#it{m}_{jet} (GeV/#it{c}^{2});-log(JP);#it{m}_{SV} (GeV/#it{c}^{2});SVfE;", {HistType::kTHnSparseF, {{200, 0., 200.}, {120, -0.1, 1.1}, {50, 0, 50}, {375, 0, 30}, {50, 0, 10}, {50, 0, 1}}}); + registry.add("hSparse_bjets", "Tagged b-jets Info;#it{p}_{T,jet} (GeV/#it{c});Score;-log(1-score);#it{m}_{jet} (GeV/#it{c}^{2});-log(JP);#it{m}_{SV} (GeV/#it{c}^{2});SVfE;", {HistType::kTHnSparseF, {{200, 0., 200.}, {120, -0.1, 1.1}, {120, 0, 30}, {50, 0, 50}, {375, 0, 30}, {50, 0, 10}, {50, 0, 1}}}); + registry.add("hSparse_cjets", "Tagged c-jets Info;#it{p}_{T,jet} (GeV/#it{c});Score;-log(1-score);#it{m}_{jet} (GeV/#it{c}^{2});-log(JP);#it{m}_{SV} (GeV/#it{c}^{2});SVfE;", {HistType::kTHnSparseF, {{200, 0., 200.}, {120, -0.1, 1.1}, {120, 0, 30}, {50, 0, 50}, {375, 0, 30}, {50, 0, 10}, {50, 0, 1}}}); + registry.add("hSparse_lfjets", "Tagged lf-jets Info;#it{p}_{T,jet} (GeV/#it{c});Score;-log(1-score);#it{m}_{jet} (GeV/#it{c}^{2});-log(JP);#it{m}_{SV} (GeV/#it{c}^{2});SVfE;", {HistType::kTHnSparseF, {{200, 0., 200.}, {120, -0.1, 1.1}, {120, 0, 30}, {50, 0, 50}, {375, 0, 30}, {50, 0, 10}, {50, 0, 1}}}); } } if (doprocessMCJets) { registry.add("h2_score_jetpT_bjet", "ML scores for b-jets;#it{p}_{T,jet} (GeV/#it{c});Score", {HistType::kTH2F, {{200, 0., 200.}, {120, -0.1, 1.1}}}); + registry.add("h2_logscore_jetpT_bjet", "ML scores for b-jets;#it{p}_{T,jet} (GeV/#it{c});- log(1 - Score)", {HistType::kTH2F, {{200, 0., 200.}, {120, 0, 30}}}); registry.add("h2_SIPs2D_jetpT_bjet", "2D IP significance b-jets;#it{p}_{T,jet} (GeV/#it{c});IPs", {HistType::kTH2F, {{200, 0., 200.}, {100, -50.0, 50.0}}}); registry.add("h2_SIPs3D_jetpT_bjet", "3D IP significance b-jets;#it{p}_{T,jet} (GeV/#it{c});IPs", {HistType::kTH2F, {{200, 0., 200.}, {100, -50.0, 50.0}}}); registry.add("h2_LxyS_jetpT_bjet", "Decay length in XY b-jets;#it{p}_{T,jet} (GeV/#it{c});S#it{L}_{xy}", {HistType::kTH2F, {{200, 0., 200.}, {100, 0., 100.0}}}); @@ -120,6 +122,7 @@ struct BJetTaggingML { registry.add("h2_SVMass_jetpT_bjet", "Secondary vertex mass b-jets;#it{p}_{T,jet} (GeV/#it{c});#it{m}_{SV} (GeV/#it{c}^{2})", {HistType::kTH2F, {{200, 0., 200.}, {50, 0, 10.0}}}); registry.add("h2_score_jetpT_cjet", "ML scores for c-jets;#it{p}_{T,jet} (GeV/#it{c});Score", {HistType::kTH2F, {{200, 0., 200.}, {120, -0.1, 1.1}}}); + registry.add("h2_logscore_jetpT_cjet", "ML scores for c-jets;#it{p}_{T,jet} (GeV/#it{c});- log(1 - Score)", {HistType::kTH2F, {{200, 0., 200.}, {120, 0, 30}}}); registry.add("h2_SIPs2D_jetpT_cjet", "2D IP significance c-jets;#it{p}_{T,jet} (GeV/#it{c});IPs", {HistType::kTH2F, {{200, 0., 200.}, {100, -50.0, 50.0}}}); registry.add("h2_SIPs3D_jetpT_cjet", "3D IP significance c-jets;#it{p}_{T,jet} (GeV/#it{c});IPs", {HistType::kTH2F, {{200, 0., 200.}, {100, -50.0, 50.0}}}); registry.add("h2_LxyS_jetpT_cjet", "Decay length in XY c-jets;#it{p}_{T,jet} (GeV/#it{c});S#it{L}_{xy}", {HistType::kTH2F, {{200, 0., 200.}, {100, 0., 100.0}}}); @@ -128,6 +131,7 @@ struct BJetTaggingML { registry.add("h2_SVMass_jetpT_cjet", "Secondary vertex mass c-jets;#it{p}_{T,jet} (GeV/#it{c});#it{m}_{SV} (GeV/#it{c}^{2})", {HistType::kTH2F, {{200, 0., 200.}, {50, 0, 10.0}}}); registry.add("h2_score_jetpT_lfjet", "ML scores for lf-jets;#it{p}_{T,jet} (GeV/#it{c});Score", {HistType::kTH2F, {{200, 0., 200.}, {120, -0.1, 1.1}}}); + registry.add("h2_logscore_jetpT_lfjet", "ML scores for lf-jets;#it{p}_{T,jet} (GeV/#it{c});- log(1 - Score)", {HistType::kTH2F, {{200, 0., 200.}, {120, 0, 30}}}); registry.add("h2_SIPs2D_jetpT_lfjet", "2D IP significance lf-jet;#it{p}_{T,jet} (GeV/#it{c});IPs", {HistType::kTH2F, {{200, 0., 200.}, {100, -50.0, 50.0}}}); registry.add("h2_SIPs3D_jetpT_lfjet", "3D IP significance lf-jet;#it{p}_{T,jet} (GeV/#it{c});IPs", {HistType::kTH2F, {{200, 0., 200.}, {100, -50.0, 50.0}}}); registry.add("h2_LxyS_jetpT_lfjet", "Decay length in XY lf-jet;#it{p}_{T,jet} (GeV/#it{c});S#it{L}_{xy}", {HistType::kTH2F, {{200, 0., 200.}, {100, 0., 100.0}}}); @@ -255,7 +259,7 @@ struct BJetTaggingML { } auto compare = [](jettaggingutilities::BJetTrackParams& tr1, jettaggingutilities::BJetTrackParams& tr2) { - return (tr1.mSignedIP2D / tr1.mSignedIP2DSign) > (tr2.mSignedIP2D / tr2.mSignedIP2DSign); + return (tr1.SignedIP2D / tr1.SignedIP2DSign) > (tr2.SignedIP2D / tr2.SignedIP2DSign); }; // Sort the tracks based on their IP significance in descending order @@ -303,11 +307,12 @@ struct BJetTaggingML { registry.fill(HIST("h2_nSV_jetpT"), analysisJet.pt(), nSVs < 250 ? nSVs : 249); registry.fill(HIST("h2_score_jetpT"), analysisJet.pt(), analysisJet.scoreML()); + registry.fill(HIST("h2_logscore_jetpT"), analysisJet.pt(), -1 * std::log(1 - analysisJet.scoreML())); registry.fill(HIST("h2_jetMass_jetpT"), analysisJet.pt(), analysisJet.mass()); if (doDataDriven) { - registry.fill(HIST("hSparse_Incljets"), analysisJet.pt(), analysisJet.scoreML(), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].mSVMass, svsParams[0].mSVfE); + registry.fill(HIST("hSparse_Incljets"), analysisJet.pt(), analysisJet.scoreML(), -1 * std::log(1 - analysisJet.scoreML()), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].SVMass, svsParams[0].SVfE); } } } @@ -364,29 +369,33 @@ struct BJetTaggingML { registry.fill(HIST("h2_nSV_jetpT"), analysisJet.pt(), nSVs < 250 ? nSVs : 249); registry.fill(HIST("h2_score_jetpT"), analysisJet.pt(), analysisJet.scoreML(), eventWeight); + registry.fill(HIST("h2_logscore_jetpT"), analysisJet.pt(), -1 * std::log(1 - analysisJet.scoreML()), eventWeight); registry.fill(HIST("h2_jetMass_jetpT"), analysisJet.pt(), analysisJet.mass(), eventWeight); if (doDataDriven) { - registry.fill(HIST("hSparse_Incljets"), analysisJet.pt(), analysisJet.scoreML(), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].mSVMass, svsParams[0].mSVfE); + registry.fill(HIST("hSparse_Incljets"), analysisJet.pt(), analysisJet.scoreML(), -1 * std::log(1 - analysisJet.scoreML()), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].SVMass, svsParams[0].SVfE); if (jetFlavor == 2) { - registry.fill(HIST("hSparse_bjets"), analysisJet.pt(), analysisJet.scoreML(), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].mSVMass, svsParams[0].mSVfE); + registry.fill(HIST("hSparse_bjets"), analysisJet.pt(), analysisJet.scoreML(), -1 * std::log(1 - analysisJet.scoreML()), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].SVMass, svsParams[0].SVfE); } else if (jetFlavor == 1) { - registry.fill(HIST("hSparse_cjets"), analysisJet.pt(), analysisJet.scoreML(), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].mSVMass, svsParams[0].mSVfE); + registry.fill(HIST("hSparse_cjets"), analysisJet.pt(), analysisJet.scoreML(), -1 * std::log(1 - analysisJet.scoreML()), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].SVMass, svsParams[0].SVfE); } else { - registry.fill(HIST("hSparse_lfjets"), analysisJet.pt(), analysisJet.scoreML(), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].mSVMass, svsParams[0].mSVfE); + registry.fill(HIST("hSparse_lfjets"), analysisJet.pt(), analysisJet.scoreML(), -1 * std::log(1 - analysisJet.scoreML()), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].SVMass, svsParams[0].SVfE); } } if (jetFlavor == 2) { registry.fill(HIST("h2_score_jetpT_bjet"), analysisJet.pt(), analysisJet.scoreML(), eventWeight); + registry.fill(HIST("h2_logscore_jetpT_bjet"), analysisJet.pt(), -1 * std::log(1 - analysisJet.scoreML()), eventWeight); registry.fill(HIST("h2_jetMass_jetpT_bjet"), analysisJet.pt(), analysisJet.mass(), eventWeight); registry.fill(HIST("h_jetpT_detector_bjet"), analysisJet.pt(), eventWeight); } else if (jetFlavor == 1) { registry.fill(HIST("h2_score_jetpT_cjet"), analysisJet.pt(), analysisJet.scoreML(), eventWeight); + registry.fill(HIST("h2_logscore_jetpT_cjet"), analysisJet.pt(), -1 * std::log(1 - analysisJet.scoreML()), eventWeight); registry.fill(HIST("h2_jetMass_jetpT_cjet"), analysisJet.pt(), analysisJet.mass(), eventWeight); registry.fill(HIST("h_jetpT_detector_cjet"), analysisJet.pt(), eventWeight); } else { registry.fill(HIST("h2_score_jetpT_lfjet"), analysisJet.pt(), analysisJet.scoreML(), eventWeight); + registry.fill(HIST("h2_logscore_jetpT_lfjet"), analysisJet.pt(), -1 * std::log(1 - analysisJet.scoreML()), eventWeight); registry.fill(HIST("h2_jetMass_jetpT_lfjet"), analysisJet.pt(), analysisJet.mass(), eventWeight); registry.fill(HIST("h_jetpT_detector_lfjet"), analysisJet.pt(), eventWeight); } diff --git a/Tools/ML/model.h b/Tools/ML/model.h index caca77f1a25..84872224104 100644 --- a/Tools/ML/model.h +++ b/Tools/ML/model.h @@ -103,9 +103,9 @@ class OnnxModel #if __has_include() inputTensors.emplace_back(Ort::Experimental::Value::CreateTensor(input.data(), size, inputShape)); #else - Ort::MemoryInfo mem_info = + Ort::MemoryInfo memInfo = Ort::MemoryInfo::CreateCpu(OrtAllocatorType::OrtArenaAllocator, OrtMemType::OrtMemTypeDefault); - inputTensors.emplace_back(Ort::Value::CreateTensor(mem_info, input.data(), size, inputShape.data(), inputShape.size())); + inputTensors.emplace_back(Ort::Value::CreateTensor(memInfo, input.data(), size, inputShape.data(), inputShape.size())); #endif LOG(debug) << "Input shape calculated from vector: " << printShape(inputShape); return evalModel(inputTensors); @@ -118,7 +118,7 @@ class OnnxModel std::vector inputTensors; #if !__has_include() - Ort::MemoryInfo mem_info = Ort::MemoryInfo::CreateCpu(OrtAllocatorType::OrtArenaAllocator, OrtMemType::OrtMemTypeDefault); + Ort::MemoryInfo memInfo = Ort::MemoryInfo::CreateCpu(OrtAllocatorType::OrtArenaAllocator, OrtMemType::OrtMemTypeDefault); #endif for (size_t iinput = 0; iinput < input.size(); iinput++) { @@ -137,7 +137,7 @@ class OnnxModel #if __has_include() inputTensors.emplace_back(Ort::Experimental::Value::CreateTensor(input[iinput].data(), size, inputShape)); #else - inputTensors.emplace_back(Ort::Value::CreateTensor(mem_info, input[iinput].data(), size, inputShape.data(), inputShape.size())); + inputTensors.emplace_back(Ort::Value::CreateTensor(memInfo, input[iinput].data(), size, inputShape.data(), inputShape.size())); #endif } @@ -165,6 +165,7 @@ class OnnxModel } #endif int getNumInputNodes() const { return mInputShapes[0][1]; } + std::vector> getInputShapes() const { return mInputShapes; } int getNumOutputNodes() const { return mOutputShapes[0][1]; } uint64_t getValidityFrom() const { return validFrom; } uint64_t getValidityUntil() const { return validUntil; } From 10e0eb6c119b2778e47018e77cf785f9a6bcfa3e Mon Sep 17 00:00:00 2001 From: prottayCMT <61418725+prottayCMT@users.noreply.github.com> Date: Thu, 13 Feb 2025 13:06:52 +0100 Subject: [PATCH 0199/1650] [PWGLF] added cumulant corrections for v2 (#9943) Co-authored-by: Prottay Das --- PWGLF/Tasks/Strangeness/lambdapolsp.cxx | 39 +++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/PWGLF/Tasks/Strangeness/lambdapolsp.cxx b/PWGLF/Tasks/Strangeness/lambdapolsp.cxx index 848b43798e9..d8e9782cd2f 100644 --- a/PWGLF/Tasks/Strangeness/lambdapolsp.cxx +++ b/PWGLF/Tasks/Strangeness/lambdapolsp.cxx @@ -190,6 +190,19 @@ struct lambdapolsp { histos.add("hpx1Ax1Cvscentpteta", "hpx1Ax1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); histos.add("hpy1Ay1Cvscentpteta", "hpy1Ay1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpx2Tx1Avscentpteta", "hpx2Tx1Avscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpx2Tx1Cvscentpteta", "hpx2Tx1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpx2Ty1Avscentpteta", "hpx2Ty1Avscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpx2Ty1Cvscentpteta", "hpx2Ty1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpy2Tx1Avscentpteta", "hpy2Tx1Avscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpy2Ty1Cvscentpteta", "hpy2Ty1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpy2Ty1Avscentpteta", "hpy2Ty1Avscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpy2Tx1Cvscentpteta", "hpy2Tx1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpx1Ay1Cvscentpteta", "hpx1Ay1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpy1Ax1Cvscentpteta", "hpy1Ax1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpx2Tvscentpteta", "hpx2Tvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpy2Tvscentpteta", "hpy2Tvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpuxvscentpteta", "hpuxvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); histos.add("hpuyvscentpteta", "hpuyvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); /* @@ -710,6 +723,20 @@ struct lambdapolsp { auto y2Ty1Ax1C = TMath::Sin(2 * GetPhiInRange(track.phi())) * modqyZDCA * modqxZDCC; auto x1Ax1C = modqxZDCA * modqxZDCC; auto y1Ay1C = modqyZDCA * modqyZDCC; + auto x1Ay1C = modqxZDCA * modqyZDCC; + auto x1Cy1A = modqxZDCC * modqyZDCA; + + // detector acceptance corrections to match v2{ZDC} + auto x2T = TMath::Cos(2 * GetPhiInRange(track.phi())); + auto y2T = TMath::Sin(2 * GetPhiInRange(track.phi())); + auto x2Tx1A = TMath::Cos(2 * GetPhiInRange(track.phi())) * modqxZDCA; + auto x2Tx1C = TMath::Cos(2 * GetPhiInRange(track.phi())) * modqxZDCC; + auto x2Ty1A = TMath::Cos(2 * GetPhiInRange(track.phi())) * modqyZDCA; + auto x2Ty1C = TMath::Cos(2 * GetPhiInRange(track.phi())) * modqyZDCC; + auto y2Tx1A = TMath::Sin(2 * GetPhiInRange(track.phi())) * modqxZDCA; + auto y2Tx1C = TMath::Sin(2 * GetPhiInRange(track.phi())) * modqxZDCC; + auto y2Ty1A = TMath::Sin(2 * GetPhiInRange(track.phi())) * modqyZDCA; + auto y2Ty1C = TMath::Sin(2 * GetPhiInRange(track.phi())) * modqyZDCC; if (globalpt) { // if (sign > 0) { @@ -734,8 +761,20 @@ struct lambdapolsp { histos.fill(HIST("hpx2Ty1Ay1Cvscentpteta"), centrality, track.pt(), track.eta(), x2Ty1Ay1C); histos.fill(HIST("hpy2Tx1Ay1Cvscentpteta"), centrality, track.pt(), track.eta(), y2Tx1Ay1C); histos.fill(HIST("hpy2Ty1Ax1Cvscentpteta"), centrality, track.pt(), track.eta(), y2Ty1Ax1C); + histos.fill(HIST("hpx2Tvscentpteta"), centrality, track.pt(), track.eta(), x2T); + histos.fill(HIST("hpy2Tvscentpteta"), centrality, track.pt(), track.eta(), y2T); + histos.fill(HIST("hpx2Tx1Avscentpteta"), centrality, track.pt(), track.eta(), x2Tx1A); + histos.fill(HIST("hpx2Tx1Cvscentpteta"), centrality, track.pt(), track.eta(), x2Tx1C); + histos.fill(HIST("hpx2Ty1Avscentpteta"), centrality, track.pt(), track.eta(), x2Ty1A); + histos.fill(HIST("hpx2Ty1Cvscentpteta"), centrality, track.pt(), track.eta(), x2Ty1C); + histos.fill(HIST("hpy2Tx1Avscentpteta"), centrality, track.pt(), track.eta(), y2Tx1A); + histos.fill(HIST("hpy2Ty1Cvscentpteta"), centrality, track.pt(), track.eta(), y2Ty1C); + histos.fill(HIST("hpy2Ty1Avscentpteta"), centrality, track.pt(), track.eta(), y2Ty1A); + histos.fill(HIST("hpy2Tx1Cvscentpteta"), centrality, track.pt(), track.eta(), y2Tx1C); histos.fill(HIST("hpx1Ax1Cvscentpteta"), centrality, track.pt(), track.eta(), x1Ax1C); histos.fill(HIST("hpy1Ay1Cvscentpteta"), centrality, track.pt(), track.eta(), y1Ay1C); + histos.fill(HIST("hpx1Ay1Cvscentpteta"), centrality, track.pt(), track.eta(), x1Ay1C); + histos.fill(HIST("hpy1Ax1Cvscentpteta"), centrality, track.pt(), track.eta(), x1Cy1A); /*} else { histos.fill(HIST("hpuxQxpvscentptetaneg"), centrality, track.pt(), track.eta(), uxQxp); From 779c3f24cf7cae18ffa9f63c5c3594704d0606d1 Mon Sep 17 00:00:00 2001 From: Jesper Gumprecht <113693781+jesgum@users.noreply.github.com> Date: Thu, 13 Feb 2025 14:27:40 +0100 Subject: [PATCH 0200/1650] [ALICE3] Additional selections to decayfinder (#9939) --- ALICE3/TableProducer/alice3-decayfinder.cxx | 120 ++++++++++++++++++-- 1 file changed, 108 insertions(+), 12 deletions(-) diff --git a/ALICE3/TableProducer/alice3-decayfinder.cxx b/ALICE3/TableProducer/alice3-decayfinder.cxx index fa83de9ea6c..9efcf908aaf 100644 --- a/ALICE3/TableProducer/alice3-decayfinder.cxx +++ b/ALICE3/TableProducer/alice3-decayfinder.cxx @@ -80,6 +80,15 @@ struct alice3decayFinder { Configurable kaFromD_dcaXYconstant{"kaFromD_dcaXYconstant", -1.0f, "[0] in |DCAxy| > [0]+[1]/pT"}; Configurable kaFromD_dcaXYpTdep{"kaFromD_dcaXYpTdep", 0.0, "[1] in |DCAxy| > [0]+[1]/pT"}; + Configurable DCosPA{"Cos of pointing angle", 0.99, " Cos of pointing angle: pt < 3 GeV"}; + Configurable DCosPAHighPt{"Cos of pointing angle high pt", 0.995, " Cos of pointing angle: 3 GeV < pt"}; + Configurable DCosPAxy{"Cos of pointing angle xy", 0.99, " Cos of pointing angle xy: pt < 3 GeV"}; + Configurable DCosPAxyHighPt{"Cos of pointing angle xy high pt", 0.995, " Cos of pointing angle xy: 3 GeV < pt"}; + Configurable DCosThetaStarLowPt{"Cos theta low pt", 0.8, "Cos theta; pt < 9"}; + Configurable DCosThetaStarHighPt{"Cos theta high pt", 0.9, "Cos theta; 9 < pt < 16"}; + Configurable DCosThetaStarVHighPt{"Cos theta vhigh", 1.0, "Cos theta; 16 < pt"}; + Configurable DDauDecayLength{"Normalized dau decay length", 3, "|Normalized dau decay length| > [0]"}; + Configurable piFromLc_dcaXYconstant{"piFromLc_dcaXYconstant", -1.0f, "[0] in |DCAxy| > [0]+[1]/pT"}; Configurable piFromLc_dcaXYpTdep{"piFromLc_dcaXYpTdep", 0.0, "[1] in |DCAxy| > [0]+[1]/pT"}; Configurable kaFromLc_dcaXYconstant{"kaFromLc_dcaXYconstant", -1.0f, "[0] in |DCAxy| > [0]+[1]/pT"}; @@ -90,8 +99,8 @@ struct alice3decayFinder { ConfigurableAxis axisEta{"axisEta", {8, -4.0f, +4.0f}, "#eta"}; ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.2f, 2.4f, 2.6f, 2.8f, 3.0f, 3.2f, 3.4f, 3.6f, 3.8f, 4.0f, 4.4f, 4.8f, 5.2f, 5.6f, 6.0f, 6.5f, 7.0f, 7.5f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 17.0f, 19.0f, 21.0f, 23.0f, 25.0f, 30.0f, 35.0f, 40.0f, 50.0f}, "pt axis for QA histograms"}; ConfigurableAxis axisDCA{"axisDCA", {200, -100, 100}, "DCA (#mum)"}; - ConfigurableAxis axisDMass{"axisDMass", {200, 1.765f, 1.965f}, "D Inv Mass (GeV/c^{2})"}; ConfigurableAxis axisDCADaughters{"axisDCADaughters", {200, 0, 100}, "DCA (#mum)"}; + ConfigurableAxis axisDMass{"axisDMass", {200, 1.765f, 1.965f}, "D Inv Mass (GeV/c^{2})"}; ConfigurableAxis axisLcMass{"axisLcMass", {200, 2.186f, 2.386f}, "#Lambda_{c} Inv Mass (GeV/c^{2})"}; o2::vertexing::DCAFitterN<2> fitter; @@ -120,7 +129,9 @@ struct alice3decayFinder { // partitions for D mesons Partition tracksPiPlusFromD = - ((aod::a3DecayMap::decayMap & trackSelectionPiPlusFromD) == trackSelectionPiPlusFromD) && aod::track::signed1Pt > 0.0f && nabs(aod::track::dcaXY) > piFromD_dcaXYconstant + piFromD_dcaXYpTdep* nabs(aod::track::signed1Pt); + ((aod::a3DecayMap::decayMap & trackSelectionPiPlusFromD) == trackSelectionPiPlusFromD) && + aod::track::signed1Pt > 0.0f && + nabs(aod::track::dcaXY) > piFromD_dcaXYconstant + piFromD_dcaXYpTdep* nabs(aod::track::signed1Pt); Partition tracksPiMinusFromD = ((aod::a3DecayMap::decayMap & trackSelectionPiMinusFromD) == trackSelectionPiMinusFromD) && aod::track::signed1Pt < 0.0f && nabs(aod::track::dcaXY) > piFromD_dcaXYconstant + piFromD_dcaXYpTdep* nabs(aod::track::signed1Pt); Partition tracksKaPlusFromD = @@ -147,8 +158,14 @@ struct alice3decayFinder { struct { float dcaDau; float mass; + std::array posSV; + std::array P; float pt; float eta; + float cosPA; + float cosPAxy; + float cosThetaStar; + float normalizedDecayLength; } dmeson; struct { @@ -183,15 +200,19 @@ struct alice3decayFinder { std::array negP; posTrack.getPxPyPzGlo(posP); negTrack.getPxPyPzGlo(negP); - dmeson.dcaDau = TMath::Sqrt(fitter.getChi2AtPCACandidate()); - if (dmeson.dcaDau > dcaDaughtersSelection) - return false; // return mass dmeson.mass = RecoDecay::m(array{array{posP[0], posP[1], posP[2]}, array{negP[0], negP[1], negP[2]}}, array{posMass, negMass}); dmeson.pt = std::hypot(posP[0] + negP[0], posP[1] + negP[1]); dmeson.eta = RecoDecay::eta(array{posP[0] + negP[0], posP[1] + negP[1], posP[2] + negP[2]}); + const auto posSV = fitter.getPCACandidate(); + dmeson.posSV[0] = posSV[0]; + dmeson.posSV[1] = posSV[1]; + dmeson.posSV[2] = posSV[2]; + o2::track::TrackParCov parentTrack = fitter.createParentTrackParCov(); + parentTrack.getPxPyPzGlo(dmeson.P); + dmeson.cosThetaStar = RecoDecay::cosThetaStar(std::array{std::array{posP[0], posP[1], posP[2]}, std::array{negP[0], negP[1], negP[2]}}, std::array{posMass, negMass}, dmeson.mass, 0); return true; } @@ -225,7 +246,7 @@ struct alice3decayFinder { t1.getPxPyPzGlo(P1); t2.getPxPyPzGlo(P2); - lcbaryon.dcaDau = TMath::Sqrt(fitter.getChi2AtPCACandidate()); + lcbaryon.dcaDau = TMath::Sqrt(fitter3.getChi2AtPCACandidate()); if (lcbaryon.dcaDau > dcaDaughtersSelection) return false; @@ -292,10 +313,15 @@ struct alice3decayFinder { histos.add("hMassD", "hMassD", kTH1F, {axisDMass}); histos.add("hMassDbar", "hMassDbar", kTH1F, {axisDMass}); - histos.add("hDCADDaughters", "hDCADDaughters", kTH1D, {axisDCADaughters}); - histos.add("hDCADbarDaughters", "hDCADbarDaughters", kTH1D, {axisDCADaughters}); + + histos.add("hDCosPA", "hDCosPA", kTH1F, {{200, 0, 1}}); + histos.add("hDCosPAxy", "hDCosPAxy", kTH1F, {{200, 0, 1}}); + histos.add("hDCosThetaStar", "hDCosThetaStar", kTH1F, {{200, -1, 1}}); + histos.add("hDDauDecayLength", "hDDauDecayLength", kTH1F, {{100, 0, 10}}); if (doDCAplotsD) { + histos.add("hDCADDaughters", "hDCADDaughters", kTH1D, {axisDCADaughters}); + histos.add("hDCADbarDaughters", "hDCADbarDaughters", kTH1D, {axisDCA}); histos.add("h2dDCAxyVsPtPiPlusFromD", "h2dDCAxyVsPtPiPlusFromD", kTH2F, {axisPt, axisDCA}); histos.add("h2dDCAxyVsPtPiMinusFromD", "h2dDCAxyVsPtPiMinusFromD", kTH2F, {axisPt, axisDCA}); histos.add("h2dDCAxyVsPtKaPlusFromD", "h2dDCAxyVsPtKaPlusFromD", kTH2F, {axisPt, axisDCA}); @@ -310,10 +336,10 @@ struct alice3decayFinder { histos.add("hMassLc", "hMassLc", kTH1F, {axisLcMass}); histos.add("hMassLcbar", "hMassLcbar", kTH1F, {axisLcMass}); - histos.add("hDCALcDaughters", "hDCALcDaughters", kTH1D, {axisDCADaughters}); - histos.add("hDCALcbarDaughters", "hDCALcbarDaughters", kTH1D, {axisDCADaughters}); if (doDCAplotsD) { + histos.add("hDCALcDaughters", "hDCALcDaughters", kTH1D, {axisDCADaughters}); + histos.add("hDCALcbarDaughters", "hDCALcbarDaughters", kTH1D, {axisDCA}); histos.add("h2dDCAxyVsPtPiPlusFromLc", "h2dDCAxyVsPtPiPlusFromLc", kTH2F, {axisPt, axisDCA}); histos.add("h2dDCAxyVsPtPiMinusFromLc", "h2dDCAxyVsPtPiMinusFromLc", kTH2F, {axisPt, axisDCA}); histos.add("h2dDCAxyVsPtKaPlusFromLc", "h2dDCAxyVsPtKaPlusFromLc", kTH2F, {axisPt, axisDCA}); @@ -369,6 +395,41 @@ struct alice3decayFinder { continue; if (!buildDecayCandidateTwoBody(posTrackRow, negTrackRow, o2::constants::physics::MassPionCharged, o2::constants::physics::MassKaonCharged)) continue; + + dmeson.cosPA = RecoDecay::cpa(std::array{collision.posX(), collision.posY(), collision.posZ()}, std::array{dmeson.posSV[0], dmeson.posSV[1], dmeson.posSV[2]}, std::array{dmeson.P[0], dmeson.P[1], dmeson.P[2]}); + dmeson.cosPAxy = RecoDecay::cpaXY(std::array{collision.posX(), collision.posY(), collision.posZ()}, std::array{dmeson.posSV[0], dmeson.posSV[1], dmeson.posSV[2]}, std::array{dmeson.P[0], dmeson.P[1], dmeson.P[2]}); + + const float dmesonCtau = 0.012301; + dmeson.normalizedDecayLength = ((dmeson.mass * std::fabs(std::hypot(collision.posX(), collision.posY(), collision.posZ()) - std::hypot(dmeson.posSV[0], dmeson.posSV[1], dmeson.posSV[2]))) / std::hypot(dmeson.P[0], dmeson.P[1], dmeson.P[2])) / dmesonCtau; + + histos.fill(HIST("hDCosPA"), dmeson.cosPA); + histos.fill(HIST("hDCosPAxy"), dmeson.cosPAxy); + histos.fill(HIST("hDCosThetaStar"), dmeson.cosThetaStar); + histos.fill(HIST("hDDauDecayLength"), dmeson.normalizedDecayLength); + + if (dmeson.dcaDau > dcaDaughtersSelection) + continue; + + if (dmeson.pt <= 3 && dmeson.cosPA < DCosPA) + continue; + else if (dmeson.pt > 3 && dmeson.cosPA < DCosPAHighPt) + continue; + + if (dmeson.pt <= 3 && dmeson.cosPAxy < DCosPAxy) + continue; + else if (dmeson.pt > 3 && dmeson.cosPAxy < DCosPAxyHighPt) + continue; + + if (dmeson.pt <= 9 && std::fabs(dmeson.cosThetaStar) > DCosThetaStarLowPt) + continue; + else if (dmeson.pt <= 16 && std::fabs(dmeson.cosThetaStar) > DCosThetaStarHighPt) + continue; + else if (dmeson.pt > 16 && std::fabs(dmeson.cosThetaStar) > DCosThetaStarVHighPt) + continue; + + if (dmeson.normalizedDecayLength < DDauDecayLength) + continue; + histos.fill(HIST("hDCADDaughters"), dmeson.dcaDau * 1e+4); histos.fill(HIST("hMassD"), dmeson.mass); histos.fill(HIST("h3dRecD"), dmeson.pt, dmeson.eta, dmeson.mass); @@ -381,6 +442,41 @@ struct alice3decayFinder { continue; if (!buildDecayCandidateTwoBody(posTrackRow, negTrackRow, o2::constants::physics::MassKaonCharged, o2::constants::physics::MassPionCharged)) continue; + + dmeson.cosPA = RecoDecay::cpa(std::array{collision.posX(), collision.posY(), collision.posZ()}, std::array{dmeson.posSV[0], dmeson.posSV[1], dmeson.posSV[2]}, std::array{dmeson.P[0], dmeson.P[1], dmeson.P[2]}); + dmeson.cosPAxy = RecoDecay::cpaXY(std::array{collision.posX(), collision.posY(), collision.posZ()}, std::array{dmeson.posSV[0], dmeson.posSV[1], dmeson.posSV[2]}, std::array{dmeson.P[0], dmeson.P[1], dmeson.P[2]}); + + const float dmesonCtau = 0.012301; + dmeson.normalizedDecayLength = ((dmeson.mass * std::fabs(std::hypot(collision.posX(), collision.posY(), collision.posZ()) - std::hypot(dmeson.posSV[0], dmeson.posSV[1], dmeson.posSV[2]))) / std::hypot(dmeson.P[0], dmeson.P[1], dmeson.P[2])) / dmesonCtau; + + histos.fill(HIST("hDCosPA"), dmeson.cosPA); + histos.fill(HIST("hDCosPAxy"), dmeson.cosPAxy); + histos.fill(HIST("hDCosThetaStar"), dmeson.cosThetaStar); + histos.fill(HIST("hDDauDecayLength"), dmeson.normalizedDecayLength); + + if (dmeson.dcaDau > dcaDaughtersSelection) + continue; + + if (dmeson.pt <= 3 && dmeson.cosPA < DCosPA) + continue; + else if (dmeson.pt > 3 && dmeson.cosPA < DCosPAHighPt) + continue; + + if (dmeson.pt <= 3 && dmeson.cosPAxy < DCosPAxy) + continue; + else if (dmeson.pt > 3 && dmeson.cosPAxy < DCosPAxyHighPt) + continue; + + if (dmeson.pt <= 9 && std::fabs(dmeson.cosThetaStar) > DCosThetaStarLowPt) + continue; + else if (dmeson.pt <= 16 && std::fabs(dmeson.cosThetaStar) > DCosThetaStarHighPt) + continue; + else if (dmeson.pt > 16 && std::fabs(dmeson.cosThetaStar) > DCosThetaStarVHighPt) + continue; + + if (dmeson.normalizedDecayLength < DDauDecayLength) + continue; + histos.fill(HIST("hDCADbarDaughters"), dmeson.dcaDau * 1e+4); histos.fill(HIST("hMassDbar"), dmeson.mass); histos.fill(HIST("h3dRecDbar"), dmeson.pt, dmeson.eta, dmeson.mass); @@ -426,7 +522,7 @@ struct alice3decayFinder { continue; if (!buildDecayCandidateThreeBody(proton, kaon, pion, o2::constants::physics::MassProton, o2::constants::physics::MassKaonCharged, o2::constants::physics::MassPionCharged)) continue; - histos.fill(HIST("hDCALcDaughters"), lcbaryon.dcaDau); + histos.fill(HIST("hDCALcDaughters"), lcbaryon.dcaDau * 1e+4); histos.fill(HIST("hMassLc"), lcbaryon.mass); histos.fill(HIST("h3dRecLc"), lcbaryon.pt, lcbaryon.eta, lcbaryon.mass); } @@ -442,7 +538,7 @@ struct alice3decayFinder { continue; if (!buildDecayCandidateThreeBody(proton, kaon, pion, o2::constants::physics::MassProton, o2::constants::physics::MassKaonCharged, o2::constants::physics::MassPionCharged)) continue; - histos.fill(HIST("hDCALcbarDaughters"), lcbaryon.dcaDau); + histos.fill(HIST("hDCALcbarDaughters"), lcbaryon.dcaDau * 1e+4); histos.fill(HIST("hMassLcbar"), lcbaryon.mass); histos.fill(HIST("h3dRecLcbar"), lcbaryon.pt, lcbaryon.eta, lcbaryon.mass); } From 65b8dc197316a91748287505c1922304e74f849e Mon Sep 17 00:00:00 2001 From: Fabrizio Chinu <91954233+fchinu@users.noreply.github.com> Date: Thu, 13 Feb 2025 14:48:39 +0100 Subject: [PATCH 0201/1650] [PWGHF] Restore backward compatibility of Ds and D+ tasks (#9948) --- PWGHF/D2H/Tasks/taskDplus.cxx | 25 +++++++++++++------------ PWGHF/D2H/Tasks/taskDs.cxx | 19 +++++++++---------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskDplus.cxx b/PWGHF/D2H/Tasks/taskDplus.cxx index 77685e37c69..e67ec0dfa69 100644 --- a/PWGHF/D2H/Tasks/taskDplus.cxx +++ b/PWGHF/D2H/Tasks/taskDplus.cxx @@ -178,11 +178,6 @@ struct HfTaskDplus { std::vector axesGenPrompt = {thnAxisPt, thnAxisY}; std::vector axesGenFD = {thnAxisPt, thnAxisY}; - axesFD.insert(axesFD.end(), {thnAxisPtBHad}); - axesFD.insert(axesFD.end(), {thnAxisFlagBHad}); - axesGenFD.insert(axesGenFD.end(), {thnAxisPtBHad}); - axesGenFD.insert(axesGenFD.end(), {thnAxisFlagBHad}); - if (doprocessMcWithMl) { axes.insert(axes.end(), {thnAxisMlScore0, thnAxisMlScore1, thnAxisMlScore2}); axesFD.insert(axesFD.end(), {thnAxisMlScore0, thnAxisMlScore1, thnAxisMlScore2}); @@ -199,6 +194,12 @@ struct HfTaskDplus { axesGenPrompt.insert(axesGenPrompt.end(), {thnAxisOccupancy}); axesGenFD.insert(axesGenFD.end(), {thnAxisOccupancy}); } + + axesFD.insert(axesFD.end(), {thnAxisPtBHad}); + axesFD.insert(axesFD.end(), {thnAxisFlagBHad}); + axesGenFD.insert(axesGenFD.end(), {thnAxisPtBHad}); + axesGenFD.insert(axesGenFD.end(), {thnAxisFlagBHad}); + registry.add("hSparseMassPrompt", "THn for Dplus Prompt", HistType::kTHnSparseF, axes); registry.add("hSparseMassFD", "THn for Dplus FD", HistType::kTHnSparseF, axesFD); if (fillMcBkgHistos) { @@ -275,13 +276,13 @@ struct HfTaskDplus { } else if (candidate.originMcRec() == RecoDecay::OriginType::NonPrompt) { // FD if (storeCentrality && storeOccupancy) { - registry.fill(HIST("hSparseMassFD"), hfHelper.invMassDplusToPiKPi(candidate), candidate.pt(), ptbhad, flagBHad, outputMl[0], outputMl[1], outputMl[2], centrality, occupancy); + registry.fill(HIST("hSparseMassFD"), hfHelper.invMassDplusToPiKPi(candidate), candidate.pt(), outputMl[0], outputMl[1], outputMl[2], centrality, occupancy, ptbhad, flagBHad); } else if (storeCentrality && !storeOccupancy) { - registry.fill(HIST("hSparseMassFD"), hfHelper.invMassDplusToPiKPi(candidate), candidate.pt(), ptbhad, flagBHad, outputMl[0], outputMl[1], outputMl[2], centrality); + registry.fill(HIST("hSparseMassFD"), hfHelper.invMassDplusToPiKPi(candidate), candidate.pt(), outputMl[0], outputMl[1], outputMl[2], centrality, ptbhad, flagBHad); } else if (!storeCentrality && storeOccupancy) { - registry.fill(HIST("hSparseMassFD"), hfHelper.invMassDplusToPiKPi(candidate), candidate.pt(), ptbhad, flagBHad, outputMl[0], outputMl[1], outputMl[2], occupancy); + registry.fill(HIST("hSparseMassFD"), hfHelper.invMassDplusToPiKPi(candidate), candidate.pt(), outputMl[0], outputMl[1], outputMl[2], occupancy, ptbhad, flagBHad); } else { - registry.fill(HIST("hSparseMassFD"), hfHelper.invMassDplusToPiKPi(candidate), candidate.pt(), ptbhad, flagBHad, outputMl[0], outputMl[1], outputMl[2]); + registry.fill(HIST("hSparseMassFD"), hfHelper.invMassDplusToPiKPi(candidate), candidate.pt(), outputMl[0], outputMl[1], outputMl[2], ptbhad, flagBHad); } } else { // Bkg @@ -416,11 +417,11 @@ struct HfTaskDplus { } } else { if (storeCentrality && storeOccupancy) { - registry.fill(HIST("hSparseMassGenFD"), particle.pt(), yGen, ptGenB, flagGenB, centrality, occupancy); + registry.fill(HIST("hSparseMassGenFD"), particle.pt(), yGen, centrality, occupancy, ptGenB, flagGenB); } else if (storeCentrality && !storeOccupancy) { - registry.fill(HIST("hSparseMassGenFD"), particle.pt(), yGen, ptGenB, flagGenB, centrality); + registry.fill(HIST("hSparseMassGenFD"), particle.pt(), yGen, centrality, ptGenB, flagGenB); } else if (!storeCentrality && storeOccupancy) { - registry.fill(HIST("hSparseMassGenFD"), particle.pt(), yGen, ptGenB, flagGenB, occupancy); + registry.fill(HIST("hSparseMassGenFD"), particle.pt(), yGen, occupancy, ptGenB, flagGenB); } else { registry.fill(HIST("hSparseMassGenFD"), particle.pt(), yGen, ptGenB, flagGenB); } diff --git a/PWGHF/D2H/Tasks/taskDs.cxx b/PWGHF/D2H/Tasks/taskDs.cxx index 8cc2ac4d1e5..8c18474b5c5 100644 --- a/PWGHF/D2H/Tasks/taskDs.cxx +++ b/PWGHF/D2H/Tasks/taskDs.cxx @@ -58,8 +58,7 @@ enum DataType { Data = 0, kDataTypes }; template -concept hasDsMlInfo = requires(T candidate) -{ +concept hasDsMlInfo = requires(T candidate) { candidate.mlProbDsToKKPi(); candidate.mlProbDsToPiKK(); }; @@ -182,9 +181,9 @@ struct HfTaskDs { std::vector axesFd = {massbins, ptbins, centralitybins, ptBHad, flagBHad}; std::vector axesFdMl = {massbins, ptbins, centralitybins, mlscore0bins, mlscore1bins, mlscore2bins, ptBHad, flagBHad}; std::vector axesWithNpv = {massbins, ptbins, centralitybins, npvcontributorsbins}; - std::vector axesWithNpvMl = {massbins, ptbins, centralitybins, npvcontributorsbins, mlscore0bins, mlscore1bins, mlscore2bins}; + std::vector axesWithNpvMl = {massbins, ptbins, centralitybins, mlscore0bins, mlscore1bins, mlscore2bins, npvcontributorsbins}; std::vector axesGenPrompt = {ptbins, ybins, npvcontributorsbins, centralitybins}; - std::vector axesGenFd = {ptbins, ybins, npvcontributorsbins, ptBHad, flagBHad, centralitybins}; + std::vector axesGenFd = {ptbins, ybins, npvcontributorsbins, centralitybins, ptBHad, flagBHad}; if (storeOccupancy) { axes.insert(axes.end(), {occupancybins}); @@ -464,10 +463,10 @@ struct HfTaskDs { } } else { if (storeOccupancy) { - std::get(histosPtr[dataType]["hSparseMass"])->Fill(mass, pt, evaluateCentralityCand(candidate), candidate.template collision_as().numContrib(), outputMl[0], outputMl[1], outputMl[2], o2::hf_occupancy::getOccupancyColl(candidate.template collision_as(), occEstimator)); + std::get(histosPtr[dataType]["hSparseMass"])->Fill(mass, pt, evaluateCentralityCand(candidate), outputMl[0], outputMl[1], outputMl[2], candidate.template collision_as().numContrib(), o2::hf_occupancy::getOccupancyColl(candidate.template collision_as(), occEstimator)); return; } else { - std::get(histosPtr[dataType]["hSparseMass"])->Fill(mass, pt, evaluateCentralityCand(candidate), candidate.template collision_as().numContrib(), outputMl[0], outputMl[1], outputMl[2]); + std::get(histosPtr[dataType]["hSparseMass"])->Fill(mass, pt, evaluateCentralityCand(candidate), outputMl[0], outputMl[1], outputMl[2], candidate.template collision_as().numContrib()); return; } } @@ -712,9 +711,9 @@ struct HfTaskDs { int flagGenB = getBHadMotherFlag(bHadMother.pdgCode()); float ptGenB = bHadMother.pt(); if (storeOccupancy && occEstimator != o2::hf_occupancy::OccupancyEstimator::None) { - std::get(histosPtr[DataType::McDsNonPrompt]["hSparseGen"])->Fill(pt, y, maxNumContrib, ptGenB, flagGenB, cent, occ); + std::get(histosPtr[DataType::McDsNonPrompt]["hSparseGen"])->Fill(pt, y, maxNumContrib, cent, occ, ptGenB, flagGenB); } else { - std::get(histosPtr[DataType::McDsNonPrompt]["hSparseGen"])->Fill(pt, y, maxNumContrib, ptGenB, flagGenB, cent); + std::get(histosPtr[DataType::McDsNonPrompt]["hSparseGen"])->Fill(pt, y, maxNumContrib, cent, ptGenB, flagGenB); } } } else if (fillDplusMc) { @@ -738,9 +737,9 @@ struct HfTaskDs { int flagGenB = getBHadMotherFlag(bHadMother.pdgCode()); float ptGenB = bHadMother.pt(); if (storeOccupancy && occEstimator != o2::hf_occupancy::OccupancyEstimator::None) { - std::get(histosPtr[DataType::McDplusNonPrompt]["hSparseGen"])->Fill(pt, y, maxNumContrib, ptGenB, flagGenB, cent, occ); + std::get(histosPtr[DataType::McDplusNonPrompt]["hSparseGen"])->Fill(pt, y, maxNumContrib, cent, occ, ptGenB, flagGenB); } else { - std::get(histosPtr[DataType::McDplusNonPrompt]["hSparseGen"])->Fill(pt, y, maxNumContrib, ptGenB, flagGenB, cent); + std::get(histosPtr[DataType::McDplusNonPrompt]["hSparseGen"])->Fill(pt, y, maxNumContrib, cent, ptGenB, flagGenB); } } } From b7bdaa1ce626b957f5bee2432c21cf9072b59e38 Mon Sep 17 00:00:00 2001 From: peressounko Date: Thu, 13 Feb 2025 17:58:11 +0300 Subject: [PATCH 0202/1650] [PWGEM] Histo hame fixes; Time cut fixes (#9938) Co-authored-by: peressounko --- PWGEM/Tasks/phosPi0.cxx | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/PWGEM/Tasks/phosPi0.cxx b/PWGEM/Tasks/phosPi0.cxx index 8ba38dd6281..a47aaa0d485 100644 --- a/PWGEM/Tasks/phosPi0.cxx +++ b/PWGEM/Tasks/phosPi0.cxx @@ -67,6 +67,7 @@ struct PhosPi0 { Configurable nonlinB{"nonlinB", 0., "nonlinsrity param B (a+b*exp(-e/c))"}; Configurable nonlinC{"nonlinC", 1., "nonlinsrity param C (a+b*exp(-e/c))"}; Configurable tofEffParam{"tofEffParam", 0, "parameterization of TOF cut efficiency"}; + Configurable timeOffset{"timeOffset", 0., "time offset to compensate imperfection of time calibration"}; using SelCollisions = soa::Join; using SelCollisionsMC = soa::Join; @@ -261,16 +262,16 @@ struct PhosPi0 { hMiBoth = std::get>(mHistManager.add("mggMiBoth", "inv mass for centrality", HistType::kTH2F, {mggAxis, ptAxis})) .get(); - hMiOneAll = std::get>(mHistManager.add("mggMiAll", "inv mass for centrality", + hMiOneAll = std::get>(mHistManager.add("mggMiOneAll", "inv mass for centrality", HistType::kTH2F, {mggAxis, ptAxis})) .get(); - hMiOneCPV = std::get>(mHistManager.add("mggMiCPV", "inv mass for centrality", + hMiOneCPV = std::get>(mHistManager.add("mggMiOneCPV", "inv mass for centrality", HistType::kTH2F, {mggAxis, ptAxis})) .get(); - hMiOneDisp = std::get>(mHistManager.add("mggMiDisp", "inv mass for centrality", + hMiOneDisp = std::get>(mHistManager.add("mggMiOneDisp", "inv mass for centrality", HistType::kTH2F, {mggAxis, ptAxis})) .get(); - hMiOneBoth = std::get>(mHistManager.add("mggMiBoth", "inv mass for centrality", + hMiOneBoth = std::get>(mHistManager.add("mggMiOneBoth", "inv mass for centrality", HistType::kTH2F, {mggAxis, ptAxis})) .get(); if (isMC) { @@ -549,28 +550,28 @@ struct PhosPi0 { } } // Test time eff - if (std::abs(ph1.time) < 12.5e-9) { // strict cut on first photon - if (std::abs(ph2.time) < 100.e-9) { + if (std::abs(ph1.time - timeOffset) < 12.5e-9) { // strict cut on first photon + if (std::abs(ph2.time - timeOffset) < 100.e-9) { hReTime100->Fill(m, ph2.pt()); - if (std::abs(ph2.time) < 50.e-9) { + if (std::abs(ph2.time - timeOffset) < 50.e-9) { hReTime50->Fill(m, ph2.pt()); - if (std::abs(ph2.time) < 30.e-9) { + if (std::abs(ph2.time - timeOffset) < 30.e-9) { hReTime30->Fill(m, ph2.pt()); - if (std::abs(ph2.time) < 12.5e-9) { + if (std::abs(ph2.time - timeOffset) < 12.5e-9) { hReTime12->Fill(m, ph2.pt()); } } } } } - if (std::abs(ph2.time) < 12.5e-9) { // strict cut on first photon - if (std::abs(ph1.time) < 100.e-9) { + if (std::abs(ph2.time - timeOffset) < 12.5e-9) { // strict cut on first photon + if (std::abs(ph1.time - timeOffset) < 100.e-9) { hReTime100->Fill(m, ph1.pt()); - if (std::abs(ph1.time) < 50.e-9) { + if (std::abs(ph1.time - timeOffset) < 50.e-9) { hReTime50->Fill(m, ph1.pt()); - if (std::abs(ph1.time) < 30.e-9) { + if (std::abs(ph1.time - timeOffset) < 30.e-9) { hReTime30->Fill(m, ph1.pt()); - if (std::abs(ph1.time) < 12.5e-9) { + if (std::abs(ph1.time - timeOffset) < 12.5e-9) { hReTime12->Fill(m, ph1.pt()); } } From 113e7f61589755b21a70041dbfd545090121d9c3 Mon Sep 17 00:00:00 2001 From: Gyula Bencedi Date: Thu, 13 Feb 2025 17:16:17 +0100 Subject: [PATCH 0203/1650] [PWGLF] Updated with new centrality estimators (#9945) --- PWGMM/Mult/Core/include/Functions.h | 56 +- PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx | 1501 +++++++++++++++------------ 2 files changed, 866 insertions(+), 691 deletions(-) diff --git a/PWGMM/Mult/Core/include/Functions.h b/PWGMM/Mult/Core/include/Functions.h index a0ef3928fa5..00d1ef0ee2a 100644 --- a/PWGMM/Mult/Core/include/Functions.h +++ b/PWGMM/Mult/Core/include/Functions.h @@ -46,9 +46,14 @@ concept iterator_with_FT0C = requires(IC const& c) { c.centFT0C(); }; +template +concept has_centFT0CVariant1 = requires(C::iterator const& c) { + c.centFT0CVariant1(); +}; + template -concept iterator_with_FT0M = requires(IC const& c) { - c.centFT0M(); +concept iterator_with_centFT0CVariant1 = requires(IC const& c) { + c.centFT0CVariant1(); }; template @@ -56,6 +61,31 @@ concept has_FT0M = requires(C::iterator const& c) { c.centFT0M(); }; +template +concept iterator_with_FT0M = requires(IC const& c) { + c.centFT0M(); +}; + +template +concept has_centNGlobal = requires(C::iterator const& c) { + c.centNGlobal(); +}; + +template +concept iterator_with_centNGlobal = requires(IC const& c) { + c.centNGlobal(); +}; + +template +concept has_centMFT = requires(C::iterator const& c) { + c.centMFT(); +}; + +template +concept iterator_with_centMFT = requires(IC const& c) { + c.centMFT(); +}; + template concept has_genFT0C = requires(C::iterator const& c) { c.gencentFT0C(); @@ -77,7 +107,7 @@ concept iterator_with_genFT0M = requires(C const& c) { }; template -concept has_reco_cent = has_FT0C || has_FT0M; +concept has_reco_cent = has_FT0C || has_centFT0CVariant1 || has_FT0M || has_centNGlobal || has_centMFT; template concept has_gen_cent = has_genFT0C && has_genFT0M; @@ -93,7 +123,7 @@ concept iterator_with_Centrality = requires(MCC const& mcc) { }; template - requires(!(iterator_with_FT0C || iterator_with_FT0M)) + requires(!(iterator_with_FT0C || iterator_with_centFT0CVariant1 || iterator_with_FT0M || iterator_with_centNGlobal || iterator_with_centMFT)) static float getRecoCent(C const&) { return -1; @@ -105,12 +135,30 @@ static float getRecoCent(C const& collision) return collision.centFT0C(); } +template +static float getRecoCent(C const& collision) +{ + return collision.centFT0CVariant1(); +} + template static float getRecoCent(C const& collision) { return collision.centFT0M(); } +template +static float getRecoCent(C const& collision) +{ + return collision.centNGlobal(); +} + +template +static float getRecoCent(C const& collision) +{ + return collision.centMFT(); +} + template requires(!iterator_with_genFT0C) static float getGenCentFT0C(MCC const&) diff --git a/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx b/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx index ef74e75b287..a38d5787449 100644 --- a/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx +++ b/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx @@ -17,6 +17,8 @@ #include #include #include +#include +#include #include "Framework/ASoAHelpers.h" #include "Framework/AnalysisDataModel.h" @@ -36,28 +38,37 @@ #include "MathUtils/Utils.h" #include "ReconstructionDataFormats/GlobalTrackID.h" -#include +#include "TPDGCode.h" #include "Index.h" #include "bestCollisionTable.h" +#include "Functions.h" + using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::aod::track; using namespace o2::aod::fwdtrack; +using namespace o2::constants::physics; +using namespace o2::constants::math; +using namespace pwgmm::mult; AxisSpec ptAxis = {1001, -0.005, 10.005}; AxisSpec multAxis = {701, -0.5, 700.5, "N_{trk}"}; AxisSpec zAxis = {60, -30., 30.}; AxisSpec deltaZAxis = {61, -6.1, 6.1}; AxisSpec dcaxyAxis = {500, -1, 50}; -AxisSpec phiAxis = {629, 0, o2::constants::math::TwoPI, "Rad", "#phi"}; +AxisSpec phiAxis = {629, 0, TwoPI, "Rad", "#phi"}; AxisSpec etaAxis = {20, -4., -2.}; +AxisSpec centAxis{100, 0, 100, "centrality"}; struct DndetaMFTPbPb { SliceCache cache; + enum OccupancyEst { TrkITS = 1, + Ft0C }; + // Histogram registry HistogramRegistry registry{ "registry", @@ -72,8 +83,7 @@ struct DndetaMFTPbPb { // analysis specific conf. Configurable usePhiCut{"usePhiCut", false, "use azimuthal angle cut"}; - Configurable cfgPhiCut{"cfgPhiCut", 0.1f, - "Cut on azimuthal angle of MFT tracks"}; + Configurable cfgPhiCut{"cfgPhiCut", 0.1f, "Cut on azimuthal angle of MFT tracks"}; // track selection conf. struct : ConfigurableGroup { @@ -92,8 +102,8 @@ struct DndetaMFTPbPb { // event selection conf. Configurable cfgCutZvtx{"cfgCutZvtx", 10.0f, "Cut on z-vtx"}; - Configurable cfgCutCent{"cfgCutCent", 80.0f, - "Cut on maximum centrality"}; + Configurable cfgCutCent{"cfgCutCent", 80.0f, "Cut on maximum centrality"}; + Configurable cfgCentEstimator{"cfgCentEstimator", 1, "Centrality estimator: 1 = FT0C, 2 = FT0CVariant1, 3 = FT0M, 4 = NGlobal, 5 = MFT"}; Configurable useZDiffCut{"useZDiffCut", false, "use Zvtx reco-mc diff. cut"}; Configurable maxZvtxDiff{"maxZvtxDiff", 1.0f, @@ -109,11 +119,10 @@ struct DndetaMFTPbPb { 1000.0f, 1500.0f, 2000.0f, 3000.0f, 4500.0f, 6000.0f, 8000.0f, 10000.0f, 50000.0f}, "Occupancy"}; + Configurable cfgOccEstimator{"cfgOccEstimator", 1, "Occupancy estimator: 1 = trackOccupancyInTimeRange, 2 = ft0cOccupancyInTimeRange"}; Configurable minOccupancy{"minOccupancy", -1, "minimum occupancy from neighbouring collisions"}; Configurable maxOccupancy{"maxOccupancy", -1, "maximum occupancy from neighbouring collisions"}; - ConfigurableAxis centBins{"centBins", - {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100}, - ""}; + ConfigurableAxis centralityBins{"centralityBins", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100}, "Centrality"}; Service pdg; @@ -127,11 +136,9 @@ struct DndetaMFTPbPb { "Either processDataInclusive OR " "processDatawBestTracksInclusive should be enabled!"); } - if (static_cast(doprocessDataCent) + - static_cast(doprocessDatawBestTracksCent) > - 1) { + if ((static_cast(doprocessDataCentFT0C) + static_cast(doprocessDatawBestTracksCentFT0C) > 1) || (static_cast(doprocessDataCentFT0CVariant1) + static_cast(doprocessDatawBestTracksCentFT0CVariant1) > 1) || (static_cast(doprocessDataCentFT0M) + static_cast(doprocessDatawBestTracksCentFT0M) > 1) || (static_cast(doprocessDataCentNGlobal) + static_cast(doprocessDatawBestTracksCentNGlobal) > 1) || (static_cast(doprocessDataCentMFT) + static_cast(doprocessDatawBestTracksCentMFT) > 1)) { LOGP(fatal, - "Either processDataCent OR processDatawBestTracksCent should " + "Either processDataCent[ESTIMATOR] OR processDatawBestTracksCent[ESTIMATOR] should " "be enabled!"); } if (static_cast(doprocessMCInclusive) + @@ -141,12 +148,10 @@ struct DndetaMFTPbPb { "Either processMCInclusive OR processMCwBestTracksInclusive " "should be enabled!"); } - if (static_cast(doprocessMCCent) + - static_cast(doprocessMCwBestTracksCent) > - 1) { + if ((static_cast(doprocessMCCentFT0C) + static_cast(doprocessMCwBestTracksCentFT0C) > 1) || (static_cast(doprocessMCCentFT0CVariant1) + static_cast(doprocessMCwBestTracksCentFT0CVariant1) > 1) || (static_cast(doprocessMCCentFT0M) + static_cast(doprocessMCwBestTracksCentFT0M) > 1) || (static_cast(doprocessMCCentNGlobal) + static_cast(doprocessMCwBestTracksCentNGlobal) > 1) || (static_cast(doprocessMCCentMFT) + static_cast(doprocessMCwBestTracksCentMFT) > 1)) { LOGP(fatal, - "Either processMCCent OR processMCwBestTracksCent should be " - "enabled!"); + "Either processMCCent[ESTIMATOR] OR processMCwBestTracksCent[ESTIMATOR] should " + "be enabled!"); } auto hev = registry.add("hEvtSel", "hEvtSel", HistType::kTH1F, @@ -161,175 +166,153 @@ struct DndetaMFTPbPb { hev->GetXaxis()->SetBinLabel(8, "Below min occup."); hev->GetXaxis()->SetBinLabel(9, "Above max occup."); - auto hBcSel = registry.add("hBcSel", "hBcSel", HistType::kTH1F, - {{3, -0.5f, +2.5f}}); + auto hBcSel = registry.add("hBcSel", "hBcSel", HistType::kTH1F, {{3, -0.5f, +2.5f}}); hBcSel->GetXaxis()->SetBinLabel(1, "Good BCs"); hBcSel->GetXaxis()->SetBinLabel(2, "BCs with collisions"); hBcSel->GetXaxis()->SetBinLabel(3, "BCs with pile-up/splitting"); - AxisSpec centAxis = {centBins, "Centrality", "CentralityAxis"}; + AxisSpec centralityAxis = {centralityBins, "Centrality", "centralityAxis"}; AxisSpec occupancyAxis = {occupancyBins, "Occupancy", "occupancyAxis"}; - if (doprocessDataInclusive || doprocessDatawBestTracksInclusive) { - registry.add({"Events/Selection", - ";status;events", - {HistType::kTH1F, {{2, 0.5, 2.5}}}}); - auto hstat = registry.get(HIST("Events/Selection")); + if (doprocessDataInclusive || doprocessDatawBestTracksInclusive || doprocessMCInclusive || doprocessMCwBestTracksInclusive) { + registry.add({"Events/Selection", ";status;occupancy", {HistType::kTH2F, {{2, 0.5, 2.5}, occupancyAxis}}}); + auto hstat = registry.get(HIST("Events/Selection")); auto* x = hstat->GetXaxis(); x->SetBinLabel(1, "All"); x->SetBinLabel(2, "Selected"); - registry.add({"Events/NtrkZvtx", - "; N_{trk}; Z_{vtx} (cm);", - {HistType::kTH2F, {multAxis, zAxis}}}); - registry.add({"Tracks/EtaZvtx", - "; #eta; Z_{vtx} (cm);", - {HistType::kTH2F, {etaAxis, zAxis}}}); - registry.add({"Tracks/PhiEta", - "; #varphi; #eta;", - {HistType::kTH2F, {phiAxis, etaAxis}}}); - qaregistry.add({"Tracks/Chi2Eta", - "; #chi^{2}; #it{#eta};", - {HistType::kTH2F, {{600, 0, 20}, {100, -8, 8}}}}); - qaregistry.add( - {"Tracks/Chi2", "; #chi^{2};", {HistType::kTH1F, {{600, 0, 20}}}}); - qaregistry.add({"Tracks/NclustersEta", - "; nClusters; #eta;", - {HistType::kTH2F, {{7, 4, 10}, {100, -8, 8}}}}); - qaregistry.add("Events/Occupancy", "; Z_{vtx} (cm); Occupancy", - HistType::kTH2F, {zAxis, occupancyAxis}, false); + registry.add({"Events/NtrkZvtx", "; N_{trk}; Z_{vtx} (cm); occupancy", {HistType::kTHnSparseF, {multAxis, zAxis, occupancyAxis}}}); + registry.add({"Tracks/EtaZvtx", "; #eta; Z_{vtx} (cm); occupancy", {HistType::kTHnSparseF, {etaAxis, zAxis, occupancyAxis}}}); + registry.add({"Tracks/PhiEta", "; #varphi; #eta; occupancy", {HistType::kTHnSparseF, {phiAxis, etaAxis, occupancyAxis}}}); + + qaregistry.add({"Tracks/Chi2Eta", "; #chi^{2}; #it{#eta}; occupancy", {HistType::kTHnSparseF, {{600, 0, 20}, etaAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/Chi2", "; #chi^{2};", {HistType::kTH2F, {{600, 0, 20}, occupancyAxis}}}); + qaregistry.add({"Tracks/NclustersEta", "; nClusters; #eta; occupancy", {HistType::kTHnSparseF, {{7, 4, 10}, etaAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/NchSel", "; N_{ch}; occupancy", {HistType::kTH2F, {multAxis, occupancyAxis}}}); if (doprocessDatawBestTracksInclusive) { registry.add({"Events/NtrkZvtxBest", - "; N_{trk}; Z_{vtx} (cm);", - {HistType::kTH2F, {multAxis, zAxis}}}); + "; N_{trk}; Z_{vtx} (cm); occupancy", + {HistType::kTHnSparseF, {multAxis, zAxis, occupancyAxis}}}); registry.add({"Tracks/EtaZvtxBest", - "; #eta; Z_{vtx} (cm);", - {HistType::kTH2F, {etaAxis, zAxis}}}); + "; #eta; Z_{vtx} (cm); occupancy", + {HistType::kTHnSparseF, {etaAxis, zAxis, occupancyAxis}}}); registry.add({"Tracks/PhiEtaBest", - "; #varphi; #eta;", - {HistType::kTH2F, {phiAxis, etaAxis}}}); + "; #varphi; #eta; occupancy", + {HistType::kTHnSparseF, {phiAxis, etaAxis, occupancyAxis}}}); qaregistry.add({"Tracks/NclustersEtaBest", - "; nClusters; #eta;", - {HistType::kTH2F, {{7, 4, 10}, {100, -8, 8}}}}); + "; nClusters; #eta; occupancy", + {HistType::kTHnSparseF, {{7, 4, 10}, etaAxis, occupancyAxis}}}); qaregistry.add({"Tracks/DCAXYPt", - " ; p_{T} (GeV/c) ; DCA_{XY} (cm); centrality", - {HistType::kTH2F, {ptAxis, dcaxyAxis}}}); + "; p_{T} (GeV/c) ; DCA_{XY} (cm); occupancy", + {HistType::kTHnSparseF, {ptAxis, dcaxyAxis, occupancyAxis}}}); qaregistry.add({"Tracks/DCAXY", - " ; DCA_{XY} (cm)", - {HistType::kTH1F, {dcaxyAxis}}}); + "; DCA_{XY} (cm); occupancy", + {HistType::kTH2F, {dcaxyAxis, occupancyAxis}}}); qaregistry.add({"Tracks/ReTracksEtaZvtx", - "; #eta; #it{z}_{vtx} (cm); tracks", - {HistType::kTH2F, {etaAxis, zAxis}}}); + "; #eta; #it{z}_{vtx} (cm); occupancy", + {HistType::kTHnSparseF, {etaAxis, zAxis, occupancyAxis}}}); qaregistry.add({"Tracks/ReTracksPhiEta", - "; #varphi; #eta; tracks", - {HistType::kTH2F, {phiAxis, etaAxis}}}); + "; #varphi; #eta; occupancy", + {HistType::kTHnSparseF, {phiAxis, etaAxis, occupancyAxis}}}); qaregistry.add({"Tracks/TrackAmbDegree", - " ; N_{coll}^{comp}", - {HistType::kTH1F, {{51, -0.5, 50.5}}}}); + "; N_{coll}^{comp}; occupancy", + {HistType::kTH2F, {{51, -0.5, 50.5}, occupancyAxis}}}); } } - if (doprocessDataCent || doprocessDatawBestTracksCent) { + if (doprocessDataCentFT0C || doprocessDatawBestTracksCentFT0C || doprocessMCCentFT0C || doprocessMCwBestTracksCentFT0C || + doprocessDataCentFT0CVariant1 || doprocessDatawBestTracksCentFT0CVariant1 || doprocessMCCentFT0CVariant1 || doprocessMCwBestTracksCentFT0CVariant1 || + doprocessDataCentFT0M || doprocessDatawBestTracksCentFT0M || doprocessMCCentFT0M || doprocessMCwBestTracksCentFT0M || + doprocessDataCentNGlobal || doprocessDatawBestTracksCentNGlobal || doprocessMCCentNGlobal || doprocessMCwBestTracksCentNGlobal || + doprocessDataCentMFT || doprocessDatawBestTracksCentMFT || doprocessMCCentMFT || doprocessMCwBestTracksCentMFT) { registry.add({"Events/Centrality/Selection", - ";status;centrality;events", - {HistType::kTH2F, {{2, 0.5, 2.5}, centAxis}}}); - auto hstat = registry.get(HIST("Events/Centrality/Selection")); - auto* x = hstat->GetXaxis(); - x->SetBinLabel(1, "All"); - x->SetBinLabel(2, "Selected"); + ";status;centrality;occupancy", + {HistType::kTHnSparseF, {{2, 0.5, 2.5}, centralityAxis, occupancyAxis}}}); + auto hstat = registry.get(HIST("Events/Centrality/Selection")); + hstat->GetAxis(0)->SetBinLabel(1, "All"); + hstat->GetAxis(0)->SetBinLabel(2, "Selected"); + + qaregistry.add({"Events/Centrality/hCent", + "; centrality; occupancy", + {HistType::kTH2F, {centAxis, occupancyAxis}}, + true}); + qaregistry.add({"Events/Centrality/hZvtxCent", + "; Z_{vtx} (cm); centrality; occupancy", + {HistType::kTHnSparseF, {zAxis, centralityAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/Centrality/EtaZvtxCentOcc", "; #eta; Z_{vtx} (cm); centrality; occupancy", {HistType::kTHnSparseF, {etaAxis, zAxis, centralityAxis, occupancyAxis}}}); registry.add({"Events/Centrality/NtrkZvtx", - "; N_{trk}; Z_{vtx} (cm); centrality", - {HistType::kTH3F, {multAxis, zAxis, centAxis}}}); + "; N_{trk}; Z_{vtx} (cm); centrality; occupancy", + {HistType::kTHnSparseF, {multAxis, zAxis, centralityAxis, occupancyAxis}}}); registry.add({"Tracks/Centrality/EtaZvtx", - "; #eta; Z_{vtx} (cm); centrality", - {HistType::kTH3F, {etaAxis, zAxis, centAxis}}}); + "; #eta; Z_{vtx} (cm); centrality; occupancy", + {HistType::kTHnSparseF, {etaAxis, zAxis, centralityAxis, occupancyAxis}}}); registry.add({"Tracks/Centrality/PhiEta", - "; #varphi; #eta; centrality", - {HistType::kTH3F, {phiAxis, etaAxis, centAxis}}}); - qaregistry.add({"Events/Centrality/hcentFT0C", - " ; cent FT0C", - {HistType::kTH1F, {centAxis}}, - true}); - qaregistry.add( - {"Tracks/Centrality/Chi2Eta", - "; #chi^{2}; #it{#eta}; centrality", - {HistType::kTH3F, {{600, 0, 20}, {100, -8, 8}, centAxis}}}); + "; #varphi; #eta; centrality; occupancy", + {HistType::kTHnSparseF, {phiAxis, etaAxis, centralityAxis, occupancyAxis}}}); + + qaregistry.add({"Tracks/Centrality/NchSel", "; N_{ch}; centrality; occupancy", {HistType::kTHnSparseF, {multAxis, centralityAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/Centrality/Chi2Eta", "; #chi^{2}; #it{#eta}; centrality; occupancy", {HistType::kTHnSparseF, {{600, 0, 20}, etaAxis, centralityAxis, occupancyAxis}}}); qaregistry.add({"Tracks/Centrality/Chi2", - "; #chi^{2}; centrality", - {HistType::kTH2F, {{600, 0, 20}, centAxis}}}); + "; #chi^{2}; centrality; occupancy", + {HistType::kTHnSparseF, {{600, 0, 20}, centralityAxis, occupancyAxis}}}); qaregistry.add({"Tracks/Centrality/NclustersEta", - "; nClusters; #eta; centrality", - {HistType::kTH3F, {{7, 4, 10}, {100, -8, 8}, centAxis}}}); - qaregistry.add("Events/Centrality/Occupancy", - "; Z_{vtx} (cm); centrality; Occupancy", HistType::kTH3F, - {zAxis, centAxis, occupancyAxis}, false); - qaregistry.add("Tracks/Centrality/Occupancy", "dndeta occupancy", - HistType::kTHnSparseF, - {zAxis, centAxis, etaAxis, phiAxis, occupancyAxis}, false); - - if (doprocessDatawBestTracksCent) { + "; nClusters; #eta; centrality; occupancy", + {HistType::kTHnSparseF, {{7, 4, 10}, etaAxis, centralityAxis, occupancyAxis}}}); + + if (doprocessDatawBestTracksCentFT0C || doprocessDatawBestTracksCentFT0CVariant1 || doprocessDatawBestTracksCentFT0M || doprocessDatawBestTracksCentNGlobal || doprocessDatawBestTracksCentMFT) { registry.add({"Events/Centrality/NtrkZvtxBest", - "; N_{trk}; Z_{vtx} (cm); centrality", - {HistType::kTH3F, {multAxis, zAxis, centAxis}}}); + "; N_{trk}; Z_{vtx} (cm); centrality; occupancy", + {HistType::kTHnSparseF, {multAxis, zAxis, centralityAxis, occupancyAxis}}}); registry.add({"Tracks/Centrality/EtaZvtxBest", - "; #eta; Z_{vtx} (cm); centrality", - {HistType::kTH3F, {etaAxis, zAxis, centAxis}}}); + "; #eta; Z_{vtx} (cm); centrality; occupancy", + {HistType::kTHnSparseF, {etaAxis, zAxis, centralityAxis, occupancyAxis}}}); registry.add({"Tracks/Centrality/PhiEtaBest", - "; #varphi; #eta; centrality", - {HistType::kTH3F, {phiAxis, etaAxis, centAxis}}}); - qaregistry.add( - {"Tracks/Centrality/NclustersEtaBest", - "; nClusters; #eta; centrality", - {HistType::kTH3F, {{7, 4, 10}, {100, -8, 8}, centAxis}}}); + "; #varphi; #eta; centrality; occupancy", + {HistType::kTHnSparseF, {phiAxis, etaAxis, centralityAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/Centrality/NclustersEtaBest", "; nClusters; #eta; centrality; occupancy", {HistType::kTHnSparseF, {{7, 4, 10}, etaAxis, centralityAxis, occupancyAxis}}}); qaregistry.add({"Tracks/Centrality/TrackAmbDegree", - " ; N_{coll}^{comp}", - {HistType::kTH2F, {{51, -0.5, 50.5}, centAxis}}}); + "; N_{coll}^{comp}; centrality; occupancy", + {HistType::kTHnSparseF, {{51, -0.5, 50.5}, centralityAxis, occupancyAxis}}}); qaregistry.add({"Tracks/Centrality/DCAXY", - " ; DCA_{XY} (cm)", - {HistType::kTH2F, {dcaxyAxis, centAxis}}}); + "; DCA_{XY} (cm); centrality; occupancy", + {HistType::kTHnSparseF, {dcaxyAxis, centralityAxis, occupancyAxis}}}); qaregistry.add({"Tracks/Centrality/DCAXYPt", - " ; p_{T} (GeV/c) ; DCA_{XY} (cm); centrality", - {HistType::kTH3F, {ptAxis, dcaxyAxis, centAxis}}}); + "; p_{T} (GeV/c) ; DCA_{XY} (cm); centrality; occupancy", + {HistType::kTHnSparseF, {ptAxis, dcaxyAxis, centralityAxis, occupancyAxis}}}); qaregistry.add({"Tracks/Centrality/ReTracksEtaZvtx", - "; #eta; #it{z}_{vtx} (cm); tracks", - {HistType::kTH3F, {etaAxis, zAxis, centAxis}}}); + "; #eta; #it{z}_{vtx} (cm); occupancy", + {HistType::kTHnSparseF, {etaAxis, zAxis, centralityAxis, occupancyAxis}}}); qaregistry.add({"Tracks/Centrality/ReTracksPhiEta", - "; #varphi; #eta; tracks", - {HistType::kTH3F, {phiAxis, etaAxis, centAxis}}}); - qaregistry.add("Events/Centrality/OccupancyBest", - "; Z_{vtx} (cm); centrality; Occupancy", HistType::kTH3F, - {zAxis, centAxis, occupancyAxis}, false); - qaregistry.add("Tracks/Centrality/OccupancyBest", "dndeta occupancy", - HistType::kTHnSparseF, - {zAxis, centAxis, etaAxis, phiAxis, occupancyAxis}, - false); + "; #varphi; #eta; occupancy", + {HistType::kTHnSparseF, {phiAxis, etaAxis, centralityAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/Centrality/EtaZvtxCentOccBest", "; #eta; Z_{vtx} (cm); centrality; occupancy", {HistType::kTHnSparseF, {etaAxis, zAxis, centralityAxis, occupancyAxis}}}); } } if (doprocessMCInclusive || doprocessMCwBestTracksInclusive) { registry.add({"Events/EvtEffGen", - ";status;events", - {HistType::kTH1F, {{3, 0.5, 3.5}}}}); - auto heff = registry.get(HIST("Events/EvtEffGen")); - auto* x = heff->GetXaxis(); - x->SetBinLabel(1, "All reconstructed"); - x->SetBinLabel(2, "Selected reconstructed"); - x->SetBinLabel(3, "All generated"); + ";status;occupancy", + {HistType::kTH2F, {{3, 0.5, 3.5}, occupancyAxis}}}); + auto heff = registry.get(HIST("Events/EvtEffGen")); + auto* h = heff->GetXaxis(); + h->SetBinLabel(1, "All reconstructed"); + h->SetBinLabel(2, "Selected reconstructed"); + h->SetBinLabel(3, "All generated"); registry.add({"Events/NtrkZvtxGen_t", "; N_{trk}; Z_{vtx} (cm);", {HistType::kTH2F, {multAxis, zAxis}}}); registry.add({"Events/NtrkZvtxGen", - "; N_{trk}; Z_{vtx} (cm);", - {HistType::kTH2F, {multAxis, zAxis}}}); + "; N_{trk}; Z_{vtx} (cm); occupancy", + {HistType::kTHnSparseF, {multAxis, zAxis, occupancyAxis}}}); registry.add({"Tracks/EtaZvtxGen", - "; #eta; Z_{vtx} (cm);", - {HistType::kTH2F, {etaAxis, zAxis}}}); + "; #eta; Z_{vtx} (cm); occupancy", + {HistType::kTHnSparseF, {etaAxis, zAxis, occupancyAxis}}}); registry.add({"Tracks/PhiEtaGen", "; #varphi; #eta;", - {HistType::kTH2F, {phiAxis, etaAxis}}}); + {HistType::kTHnSparseF, {phiAxis, etaAxis, occupancyAxis}}}); registry.add({"Tracks/EtaZvtxGen_t", "; #eta; Z_{vtx} (cm);", {HistType::kTH2F, {etaAxis, zAxis}}}); @@ -337,188 +320,183 @@ struct DndetaMFTPbPb { "; #varphi; #eta;", {HistType::kTH2F, {phiAxis, etaAxis}}}); qaregistry.add({"Events/NotFoundEventZvtx", - " ; #it{z}_{vtx} (cm)", + "; #it{z}_{vtx} (cm)", {HistType::kTH1F, {zAxis}}}); qaregistry.add({"Events/ZvtxDiff", - " ; Z_{rec} - Z_{gen} (cm)", + "; Z_{rec} - Z_{gen} (cm)", {HistType::kTH1F, {deltaZAxis}}}); - qaregistry.add( - {"Events/SplitMult", " ; N_{gen}", {HistType::kTH1F, {multAxis}}}); + qaregistry.add({"Events/SplitMult", "; N_{gen}; #it{z}_{vtx} (cm)", {HistType::kTH2F, {multAxis, zAxis}}}); } - if (doprocessMCCent || doprocessMCwBestTracksCent) { + if (doprocessMCCentFT0C || doprocessMCwBestTracksCentFT0C || + doprocessMCCentFT0CVariant1 || doprocessMCwBestTracksCentFT0CVariant1 || + doprocessMCCentFT0M || doprocessMCwBestTracksCentFT0M || + doprocessMCCentNGlobal || doprocessMCwBestTracksCentNGlobal || + doprocessMCCentMFT || doprocessMCwBestTracksCentMFT) { registry.add({"Events/Centrality/EvtEffGen", - ";status;events", - {HistType::kTH2F, {{3, 0.5, 3.5}, centAxis}}}); - auto heff = registry.get(HIST("Events/Centrality/EvtEffGen")); - auto* x = heff->GetXaxis(); - x->SetBinLabel(1, "All reconstructed"); - x->SetBinLabel(2, "Selected reconstructed"); - x->SetBinLabel(3, "All generated"); + ";status;centrality;occupancy", + {HistType::kTHnSparseF, {{3, 0.5, 3.5}, centralityAxis, occupancyAxis}}}); + auto heff = registry.get(HIST("Events/Centrality/EvtEffGen")); + heff->GetAxis(0)->SetBinLabel(1, "All reconstructed"); + heff->GetAxis(0)->SetBinLabel(2, "Selected reconstructed"); + heff->GetAxis(0)->SetBinLabel(3, "All generated"); registry.add({"Events/Centrality/NtrkZvtxGen_t", - "; N_{trk}; Z_{vtx} (cm);", - {HistType::kTH3F, {multAxis, zAxis, centAxis}}}); + "; N_{trk}; Z_{vtx} (cm); centrality", + {HistType::kTHnSparseF, {multAxis, zAxis, centralityAxis}}}); registry.add({"Events/Centrality/NtrkZvtxGen", - "; N_{trk}; Z_{vtx} (cm);", - {HistType::kTH3F, {multAxis, zAxis, centAxis}}}); + "; N_{trk}; Z_{vtx} (cm); centrality; occupancy", + {HistType::kTHnSparseF, {multAxis, zAxis, centralityAxis, occupancyAxis}}}); registry.add({"Events/Centrality/hRecCent", - "Events/Centrality/hRecCent", - {HistType::kTH1F, {centAxis}}}); + "; centrality; occupancy", + {HistType::kTH2F, {centralityAxis, occupancyAxis}}}); registry.add({"Events/Centrality/hRecZvtxCent", - "Events/Centrality/hRecZvtxCent", - {HistType::kTH2F, {zAxis, centAxis}}}); + "; Z_{vtx} (cm); centrality; occupancy", + {HistType::kTHnSparseF, {zAxis, centralityAxis, occupancyAxis}}}); registry.add({"Tracks/Centrality/EtaZvtxGen", - "; #eta; Z_{vtx} (cm);", - {HistType::kTH3F, {etaAxis, zAxis, centAxis}}}); + "; #eta; Z_{vtx} (cm); centrality; occupancy", + {HistType::kTHnSparseF, {etaAxis, zAxis, centralityAxis, occupancyAxis}}}); registry.add({"Tracks/Centrality/PhiEtaGen", - "; #varphi; #eta;", - {HistType::kTH3F, {phiAxis, etaAxis, centAxis}}}); + "; #varphi; #eta; centrality; occupancy", + {HistType::kTHnSparseF, {phiAxis, etaAxis, centralityAxis, occupancyAxis}}}); registry.add({"Tracks/Centrality/EtaZvtxGen_t", - "; #eta; Z_{vtx} (cm);", - {HistType::kTH3F, {etaAxis, zAxis, centAxis}}}); + "; #eta; Z_{vtx} (cm); centrality", + {HistType::kTHnSparseF, {etaAxis, zAxis, centralityAxis}}}); registry.add({"Tracks/Centrality/PhiEtaGen_t", - "; #varphi; #eta;", - {HistType::kTH3F, {phiAxis, etaAxis, centAxis}}}); + "; #varphi; #eta; centrality", + {HistType::kTHnSparseF, {phiAxis, etaAxis, centralityAxis}}}); qaregistry.add({"Events/Centrality/NotFoundEventZvtx", - " ; #it{z}_{vtx} (cm)", - {HistType::kTH2F, {zAxis, centAxis}}}); + "; #it{z}_{vtx} (cm); centrality", + {HistType::kTH2F, {zAxis, centralityAxis}}}); qaregistry.add({"Events/Centrality/ZvtxDiff", - " ; Z_{rec} - Z_{gen} (cm)", - {HistType::kTH2F, {deltaZAxis, centAxis}}}); + "; Z_{rec} - Z_{gen} (cm); centrality", + {HistType::kTH2F, {deltaZAxis, centralityAxis}}}); qaregistry.add({"Events/Centrality/SplitMult", - " ; N_{gen}", - {HistType::kTH2F, {multAxis, centAxis}}}); + "; N_{gen}; #it{z}_{vtx} (cm); centrality", + {HistType::kTHnSparseF, {multAxis, zAxis, centralityAxis}}}); } if (doprocessTrkEffIdxInlusive) { - qaregistry.add( - {"Tracks/hPtPhiEtaZvtxEffGen", - "hPtPhiEtaZvtxEffGen", - {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis}}}); - qaregistry.add( - {"Tracks/hPtPhiEtaZvtxEffRec", - "hPtPhiEtaZvtxEffRec", - {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis}}}); + qaregistry.add({"Tracks/hPtPhiEtaZvtxEffGen", + "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", + {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/hPtPhiEtaZvtxEffRec", + "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", + {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); qaregistry.add({"Tracks/hPhiEtaDuplicates", - " ; p_{T} (GeV/c);", - {HistType::kTH2F, {phiAxis, etaAxis}}}); - qaregistry.add( - {"Tracks/hPtPhiEtaZvtxEffDuplicates", - "hPtPhiEtaZvtxEffDuplicates", - {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis}}}); - qaregistry.add( - {"Tracks/hPtPhiEtaZvtxEffGenDuplicates", - "hPtPhiEtaZvtxEffGenDuplicates", - {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis}}}); + "; #varphi; #eta; occupancy", + {HistType::kTHnSparseF, {phiAxis, etaAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/hPtPhiEtaZvtxEffDuplicates", + "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", + {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/hPtPhiEtaZvtxEffGenDuplicates", + "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", + {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); qaregistry.add({"Tracks/NmftTrkPerPart", - "; #it{N}_{mft tracks per particle};", - {HistType::kTH1F, {{200, -0.5, 200.}}}}); + "; #it{N}_{mft tracks per particle}; occupancy", + {HistType::kTH2F, {multAxis, occupancyAxis}}}); } - if (doprocessTrkEffIdxCent) { + if (doprocessTrkEffIdxCentFT0C) { qaregistry.add({"Tracks/Centrality/hPtPhiEtaZvtxEffGen", - "hPtPhiEtaZvtxEffGen", + "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); centrality; occupancy", {HistType::kTHnSparseF, - {ptAxis, phiAxis, etaAxis, zAxis, centAxis}}}); + {ptAxis, phiAxis, etaAxis, zAxis, centralityAxis, occupancyAxis}}}); qaregistry.add({"Tracks/Centrality/hPtPhiEtaZvtxEffRec", - "hPtPhiEtaZvtxEffRec", + "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); centrality; occupancy", {HistType::kTHnSparseF, - {ptAxis, phiAxis, etaAxis, zAxis, centAxis}}}); + {ptAxis, phiAxis, etaAxis, zAxis, centralityAxis, occupancyAxis}}}); qaregistry.add({"Tracks/Centrality/hPhiEtaDuplicates", - " ; p_{T} (GeV/c);", - {HistType::kTH3F, {phiAxis, etaAxis, centAxis}}}); + "; #varphi; #eta; centrality; occupancy", + {HistType::kTHnSparseF, {phiAxis, etaAxis, centralityAxis, occupancyAxis}}}); qaregistry.add({"Tracks/Centrality/hPtPhiEtaZvtxEffDuplicates", - "hPtPhiEtaZvtxEffDuplicates", + "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); centrality; occupancy", {HistType::kTHnSparseF, - {ptAxis, phiAxis, etaAxis, zAxis, centAxis}}}); + {ptAxis, phiAxis, etaAxis, zAxis, centralityAxis, occupancyAxis}}}); qaregistry.add({"Tracks/Centrality/hPtPhiEtaZvtxEffGenDuplicates", - "hPtPhiEtaZvtxEffGenDuplicates", + "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); centrality; occupancy", {HistType::kTHnSparseF, - {ptAxis, phiAxis, etaAxis, zAxis, centAxis}}}); + {ptAxis, phiAxis, etaAxis, zAxis, centralityAxis, occupancyAxis}}}); qaregistry.add({"Tracks/Centrality/NmftTrkPerPart", - "; #it{N}_{mft tracks per particle};", - {HistType::kTH2F, {{200, -0.5, 200.}, centAxis}}}); + "; #it{N}_{mft tracks per particle}; centrality; occupancy", + {HistType::kTHnSparseF, {multAxis, centralityAxis, occupancyAxis}}}); } if (doprocessTrkEffBestInclusive) { - qaregistry.add( - {"Tracks/hPtPhiEtaZvtxEffBestGen", - "hPtPhiEtaZvtxEffGen", - {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis}}}); - qaregistry.add( - {"Tracks/hPtPhiEtaZvtxEffBestRec", - "hPtPhiEtaZvtxEffRec", - {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis}}}); - qaregistry.add({"Tracks/hPtEffBestFakeRec", - " ; p_{T} (GeV/c);", - {HistType::kTH1F, {ptAxis}}}); - } - - if (doprocessTrkEffBestCent) { - qaregistry.add({"Tracks/Centrality/hPtPhiEtaZvtxEffBestGen", - "hPtPhiEtaZvtxEffGen", - {HistType::kTHnSparseF, - {ptAxis, phiAxis, etaAxis, zAxis, centAxis}}}); - qaregistry.add({"Tracks/Centrality/hPtPhiEtaZvtxEffBestRec", - "hPtPhiEtaZvtxEffRec", - {HistType::kTHnSparseF, - {ptAxis, phiAxis, etaAxis, zAxis, centAxis}}}); - qaregistry.add({"Tracks/Centrality/hPtEffBestFakeRec", - " ; p_{T} (GeV/c);", - {HistType::kTH2F, {ptAxis, centAxis}}}); + qaregistry.add({"Tracks/hPtPhiEtaZvtxEffBestGen", "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/hPtPhiEtaZvtxEffBestRec", "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/hPtEffBestFakeRec", " ; p_{T} (GeV/c); occupancy", {HistType::kTH2F, {ptAxis, occupancyAxis}}}); + } + + if (doprocessTrkEffBestCentFT0C) { + qaregistry.add({"Tracks/Centrality/hPtPhiEtaZvtxEffBestGen", "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); centrality; occupancy", {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis, centralityAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/Centrality/hPtPhiEtaZvtxEffBestRec", "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); centrality; occupancy", {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis, centralityAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/Centrality/hPtEffBestFakeRec", "; p_{T} (GeV/c); centrality; occupancy", {HistType::kTHnSparseF, {ptAxis, centralityAxis, occupancyAxis}}}); } if (doprocessMcQAInclusive) { qaregistry.add({"Events/hRecPerGenColls", "; #it{N}_{reco collisions} / #it{N}_{gen collisions};", - {HistType::kTH1F, {{200, 0., 2.}}}}); + {HistType::kTH2F, {{200, 0., 2.}, occupancyAxis}}}); qaregistry.add({"Tracks/hNmftTrks", "; #it{N}_{mft tracks};", - {HistType::kTH1F, {{200, -0.5, 200.}}}}); + {HistType::kTH2F, {{200, -0.5, 200.}, occupancyAxis}}}); qaregistry.add({"Tracks/hFracAmbiguousMftTrks", "; #it{N}_{ambiguous tracks} / #it{N}_{tracks};", - {HistType::kTH1F, {{100, 0., 1.}}}}); - } - - if (doprocessMcQACent) { - qaregistry.add( - {"Events/Centrality/hRecPerGenColls", - "; #it{N}_{reco collisions} / #it{N}_{gen collisions}; centrality", - {HistType::kTH2F, {{200, 0., 2.}, centAxis}}}); - qaregistry.add({"Tracks/Centrality/hNmftTrks", - "; #it{N}_{mft tracks}; centrality", - {HistType::kTH2F, {{200, -0.5, 200.}, centAxis}}}); - qaregistry.add( - {"Tracks/Centrality/hFracAmbiguousMftTrks", - "; #it{N}_{ambiguous tracks} / #it{N}_{tracks}; centrality", - {HistType::kTH2F, {{100, 0., 1.}, centAxis}}}); + {HistType::kTH2F, {{100, 0., 1.}, occupancyAxis}}}); + } + + if (doprocessMcQACentFT0C) { + qaregistry.add({"Events/Centrality/hRecPerGenColls", "; #it{N}_{reco collisions} / #it{N}_{gen collisions}; centrality", {HistType::kTHnSparseF, {{200, 0., 2.}, centralityAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/Centrality/hNmftTrks", "; #it{N}_{mft tracks}; centrality", {HistType::kTHnSparseF, {{200, -0.5, 200.}, centralityAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/Centrality/hFracAmbiguousMftTrks", "; #it{N}_{ambiguous tracks} / #it{N}_{tracks}; centrality", {HistType::kTHnSparseF, {{100, 0., 1.}, centralityAxis, occupancyAxis}}}); + } + + if (doprocessCheckAmbiguousMftTracksInclusive) { + qaregistry.add({"Tracks/hMftTracksAmbDegree", " ; N_{coll}^{comp}; occupancy", {HistType::kTH2F, {{41, -0.5, 40.5}, occupancyAxis}}}); + qaregistry.add({"Tracks/hAmbTrackType", " ; Ambiguous track type; occupancy", {HistType::kTH2F, {{5, -0.5, 4.5}, occupancyAxis}}}); + qaregistry.add({"Tracks/histAmbZvtx", "#it{z}_{vtx} of collisions associated to a track;#it{z}_{vtx} (cm);", {HistType::kTH1F, {zAxis}}}); + } + + if (doprocessCheckAmbiguousMftTracksCentFT0C) { + qaregistry.add({"Tracks/Centrality/hMftTracksAmbDegree", " ; N_{coll}^{comp}; occupancy", {HistType::kTHnSparseF, {{41, -0.5, 40.5}, centralityAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/Centrality/hAmbTrackType", " ; Ambiguous track type; occupancy", {HistType::kTHnSparseF, {{5, -0.5, 4.5}, centralityAxis, occupancyAxis}}}); + } + + if (doprocessEfficiencyInclusive) { + qaregistry.add({"Tracks/hEffRec", "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/hEffFake", "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); + } + + if (doprocessEfficiencyCentFT0C) { + qaregistry.add({"Tracks/Centrality/hEffRec", "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/Centrality/hEffFake", "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); } } /// Filters - tracks - Filter filtTrkEta = (aod::fwdtrack::eta < trkcuts.cfgEtaMax) && - (aod::fwdtrack::eta > trkcuts.cfgEtaMin); + Filter filtTrkEta = (aod::fwdtrack::eta < trkcuts.cfgEtaMax) && (aod::fwdtrack::eta > trkcuts.cfgEtaMin); Filter filtATrackID = (aod::fwdtrack::bestCollisionId >= 0); Filter filtATrackDCA = (nabs(aod::fwdtrack::bestDCAXY) < trkcuts.cfgDCAxyMax); /// Filters - mc particles - Filter primaries = (aod::mcparticle::flags & - (uint8_t)o2::aod::mcparticle::enums::PhysicalPrimary) == - (uint8_t)o2::aod::mcparticle::enums::PhysicalPrimary; + Filter primaries = (aod::mcparticle::flags & (uint8_t)o2::aod::mcparticle::enums::PhysicalPrimary) == (uint8_t)o2::aod::mcparticle::enums::PhysicalPrimary; /// Joined tables using FullBCs = soa::Join; - using CollBCs = - soa::Join; + using CollBCs = soa::Join; using Colls = soa::Join; using Coll = Colls::iterator; - using CollsCent = soa::Join; - using CollCent = CollsCent::iterator; - using CollsGenCent = soa::Join; - using CollGenCent = CollsGenCent::iterator; - using MFTTracksLabeled = soa::Join; + using CollsCentFT0C = soa::Join; + using CollsCentFT0CVariant1 = soa::Join; + using CollsCentFT0M = soa::Join; + using CollsCentNGlobal = soa::Join; + using CollsCentMFT = soa::Join; + using CollCentFT0C = CollsCentFT0C::iterator; + using CollsGenCentFT0C = soa::Join; + using CollGenCent = CollsGenCentFT0C::iterator; + using MFTTracksLabeled = soa::Join; + using MftTracksWColls = soa::Join; /// Filtered tables using FiltMftTracks = soa::Filtered; @@ -543,16 +521,7 @@ struct DndetaMFTPbPb { if (phi < trkcuts.cfgPhiMin || trkcuts.cfgPhiMax < phi) { return false; } - if ((phi < cfgPhiCut) || - ((phi > o2::constants::math::PI - cfgPhiCut) && - (phi < o2::constants::math::PI + cfgPhiCut)) || - (phi > o2::constants::math::TwoPI - cfgPhiCut) || - ((phi > - ((o2::constants::math::PIHalf - 0.1) * o2::constants::math::PI) - - cfgPhiCut) && - (phi < - ((o2::constants::math::PIHalf - 0.1) * o2::constants::math::PI) + - cfgPhiCut))) + if ((phi < cfgPhiCut) || ((phi > PI - cfgPhiCut) && (phi < PI + cfgPhiCut)) || (phi > TwoPI - cfgPhiCut) || ((phi > ((PIHalf - 0.1) * PI) - cfgPhiCut) && (phi < ((PIHalf - 0.1) * PI) + cfgPhiCut))) return false; } return true; @@ -565,17 +534,14 @@ struct DndetaMFTPbPb { if (tracks.size() > 0) { for (auto const& track : tracks) { if (fillHis) { - if constexpr (C::template contains()) { - qaregistry.fill(HIST("Tracks/Centrality/Chi2Eta"), track.chi2(), - track.eta(), c); - qaregistry.fill(HIST("Tracks/Centrality/Chi2"), track.chi2(), c); - qaregistry.fill(HIST("Tracks/Centrality/NclustersEta"), - track.nClusters(), track.eta(), c); + if constexpr (has_reco_cent) { + qaregistry.fill(HIST("Tracks/Centrality/Chi2Eta"), track.chi2(), track.eta(), c, occ); + qaregistry.fill(HIST("Tracks/Centrality/Chi2"), track.chi2(), c, occ); + qaregistry.fill(HIST("Tracks/Centrality/NclustersEta"), track.nClusters(), track.eta(), c, occ); } else { - qaregistry.fill(HIST("Tracks/Chi2Eta"), track.chi2(), track.eta()); - qaregistry.fill(HIST("Tracks/Chi2"), track.chi2()); - qaregistry.fill(HIST("Tracks/NclustersEta"), track.nClusters(), - track.eta()); + qaregistry.fill(HIST("Tracks/Chi2Eta"), track.chi2(), track.eta(), occ); + qaregistry.fill(HIST("Tracks/Chi2"), track.chi2(), occ); + qaregistry.fill(HIST("Tracks/NclustersEta"), track.nClusters(), track.eta(), occ); } } if (!isTrackSelected(track)) { @@ -584,29 +550,32 @@ struct DndetaMFTPbPb { if (fillHis) { float phi = track.phi(); o2::math_utils::bringTo02Pi(phi); - if (phi < 0.f || o2::constants::math::TwoPI < phi) { + if (phi < 0.f || TwoPI < phi) { continue; } - if constexpr (C::template contains()) { - registry.fill(HIST("Tracks/Centrality/EtaZvtx"), track.eta(), z, c); - registry.fill(HIST("Tracks/Centrality/PhiEta"), phi, track.eta(), - c); - qaregistry.fill(HIST("Tracks/Centrality/Occupancy"), z, c, - track.eta(), track.phi(), occ); + if constexpr (has_reco_cent) { + registry.fill(HIST("Tracks/Centrality/EtaZvtx"), track.eta(), z, c, occ); + registry.fill(HIST("Tracks/Centrality/PhiEta"), phi, track.eta(), c, occ); } else { - registry.fill(HIST("Tracks/EtaZvtx"), track.eta(), z); - registry.fill(HIST("Tracks/PhiEta"), phi, track.eta()); + registry.fill(HIST("Tracks/EtaZvtx"), track.eta(), z, occ); + registry.fill(HIST("Tracks/PhiEta"), phi, track.eta(), occ); } } ++nTrk; } } + if (fillHis) { + if constexpr (has_reco_cent) { + qaregistry.fill(HIST("Tracks/Centrality/NchSel"), nTrk, c, occ); + } else { + qaregistry.fill(HIST("Tracks/NchSel"), nTrk, occ); + } + } return nTrk; } template - int countBestTracks(T const& /*tracks*/, B const& besttracks, float z, - float c, float occ) + int countBestTracks(T const& /*tracks*/, B const& besttracks, float z, float c, float occ) { auto nATrk = 0; if (besttracks.size() > 0) { @@ -618,43 +587,32 @@ struct DndetaMFTPbPb { if (fillHis) { float phi = itrack.phi(); o2::math_utils::bringTo02Pi(phi); - if (phi < 0.f || o2::constants::math::TwoPI < phi) { + if (phi < 0.f || TwoPI < phi) { continue; } - if constexpr (C::template contains()) { - registry.fill(HIST("Tracks/Centrality/EtaZvtxBest"), itrack.eta(), - z, c); - registry.fill(HIST("Tracks/Centrality/PhiEtaBest"), phi, - itrack.eta(), c); - qaregistry.fill(HIST("Tracks/Centrality/OccupancyBest"), z, c, - itrack.eta(), itrack.phi(), occ); - qaregistry.fill(HIST("Tracks/Centrality/DCAXYPt"), itrack.pt(), - atrack.bestDCAXY(), c); - qaregistry.fill(HIST("Tracks/Centrality/DCAXY"), atrack.bestDCAXY(), - c); - qaregistry.fill(HIST("Tracks/Centrality/NclustersEtaBest"), - itrack.nClusters(), itrack.eta(), c); + if constexpr (has_reco_cent) { + registry.fill(HIST("Tracks/Centrality/EtaZvtxBest"), itrack.eta(), z, c, occ); + registry.fill(HIST("Tracks/Centrality/PhiEtaBest"), phi, itrack.eta(), c, occ); + qaregistry.fill(HIST("Tracks/Centrality/EtaZvtxCentOccBest"), itrack.eta(), z, c, occ); + qaregistry.fill(HIST("Tracks/Centrality/DCAXYPt"), itrack.pt(), atrack.bestDCAXY(), c, occ); + qaregistry.fill(HIST("Tracks/Centrality/DCAXY"), atrack.bestDCAXY(), c, occ); + qaregistry.fill(HIST("Tracks/Centrality/NclustersEtaBest"), itrack.nClusters(), itrack.eta(), c, occ); if (itrack.collisionId() != atrack.bestCollisionId()) { - qaregistry.fill(HIST("Tracks/Centrality/ReTracksEtaZvtx"), - itrack.eta(), z, c); - qaregistry.fill(HIST("Tracks/Centrality/ReTracksPhiEta"), phi, - itrack.eta(), c); + qaregistry.fill(HIST("Tracks/Centrality/ReTracksEtaZvtx"), itrack.eta(), z, c, occ); + qaregistry.fill(HIST("Tracks/Centrality/ReTracksPhiEta"), phi, itrack.eta(), c, occ); } - qaregistry.fill(HIST("Tracks/Centrality/TrackAmbDegree"), - atrack.ambDegree(), c); + qaregistry.fill(HIST("Tracks/Centrality/TrackAmbDegree"), atrack.ambDegree(), c, occ); } else { - registry.fill(HIST("Tracks/EtaZvtxBest"), itrack.eta(), z); - registry.fill(HIST("Tracks/PhiEtaBest"), phi, itrack.eta()); - qaregistry.fill(HIST("Tracks/DCAXYPt"), itrack.pt(), - atrack.bestDCAXY()); - qaregistry.fill(HIST("Tracks/DCAXY"), atrack.bestDCAXY()); - qaregistry.fill(HIST("Tracks/NclustersEtaBest"), itrack.nClusters(), - itrack.eta()); + registry.fill(HIST("Tracks/EtaZvtxBest"), itrack.eta(), z, occ); + registry.fill(HIST("Tracks/PhiEtaBest"), phi, itrack.eta(), occ); + qaregistry.fill(HIST("Tracks/DCAXYPt"), itrack.pt(), atrack.bestDCAXY(), occ); + qaregistry.fill(HIST("Tracks/DCAXY"), atrack.bestDCAXY(), occ); + qaregistry.fill(HIST("Tracks/NclustersEtaBest"), itrack.nClusters(), itrack.eta(), occ); if (itrack.collisionId() != atrack.bestCollisionId()) { - qaregistry.fill(HIST("Tracks/ReTracksEtaZvtx"), itrack.eta(), z); - qaregistry.fill(HIST("Tracks/ReTracksPhiEta"), phi, itrack.eta()); + qaregistry.fill(HIST("Tracks/ReTracksEtaZvtx"), itrack.eta(), z, occ); + qaregistry.fill(HIST("Tracks/ReTracksPhiEta"), phi, itrack.eta(), occ); } - qaregistry.fill(HIST("Tracks/TrackAmbDegree"), atrack.ambDegree()); + qaregistry.fill(HIST("Tracks/TrackAmbDegree"), atrack.ambDegree(), occ); } } ++nATrk; @@ -676,6 +634,21 @@ struct DndetaMFTPbPb { return nCharged; } + template + float getOccupancy(C const& collision, uint occEstimator) + { + switch (occEstimator) { + case OccupancyEst::TrkITS: + return collision.trackOccupancyInTimeRange(); + case OccupancyEst::Ft0C: + return collision.ft0cOccupancyInTimeRange(); + default: + LOG(fatal) << "No valid occupancy estimator "; + break; + } + return -1.f; + } + template bool isGoodEvent(C const& collision) { @@ -721,14 +694,14 @@ struct DndetaMFTPbPb { registry.fill(HIST("hEvtSel"), 6); } if (minOccupancy > 0 && - collision.trackOccupancyInTimeRange() < minOccupancy) { + getOccupancy(collision, cfgOccEstimator) < minOccupancy) { return false; } if constexpr (fillHis) { registry.fill(HIST("hEvtSel"), 7); } if (maxOccupancy > 0 && - collision.trackOccupancyInTimeRange() > maxOccupancy) { + getOccupancy(collision, cfgOccEstimator) > maxOccupancy) { return false; } if constexpr (fillHis) { @@ -750,8 +723,7 @@ struct DndetaMFTPbPb { } template - void fillHistMC(P const& particles, float cent, float zvtx, - bool const atLeastOne) + void fillHistMC(P const& particles, float c, float occ, float zvtx, bool const gtZeroColl) { for (auto const& particle : particles) { if (!isChrgParticle(particle.pdgCode())) { @@ -760,40 +732,36 @@ struct DndetaMFTPbPb { float phi = particle.phi(); o2::math_utils::bringTo02Pi(phi); - if (phi < 0.f || o2::constants::math::TwoPI < phi) { + if (phi < 0.f || TwoPI < phi) { continue; } if constexpr (isCent) { - registry.fill(HIST("Tracks/Centrality/EtaZvtxGen_t"), particle.eta(), - zvtx, cent); - registry.fill(HIST("Tracks/Centrality/PhiEtaGen_t"), phi, - particle.eta(), cent); + registry.fill(HIST("Tracks/Centrality/EtaZvtxGen_t"), particle.eta(), zvtx, c); + registry.fill(HIST("Tracks/Centrality/PhiEtaGen_t"), phi, particle.eta(), c); } else { registry.fill(HIST("Tracks/EtaZvtxGen_t"), particle.eta(), zvtx); registry.fill(HIST("Tracks/PhiEtaGen_t"), phi, particle.eta()); } - if (atLeastOne) { + if (gtZeroColl) { float phi = particle.phi(); o2::math_utils::bringTo02Pi(phi); - if (phi < 0.f || o2::constants::math::TwoPI < phi) { + if (phi < 0.f || TwoPI < phi) { continue; } if constexpr (isCent) { - registry.fill(HIST("Tracks/Centrality/EtaZvtxGen"), particle.eta(), - zvtx, cent); - registry.fill(HIST("Tracks/Centrality/PhiEtaGen"), phi, - particle.eta(), cent); + registry.fill(HIST("Tracks/Centrality/EtaZvtxGen"), particle.eta(), zvtx, c, occ); + registry.fill(HIST("Tracks/Centrality/PhiEtaGen"), phi, particle.eta(), c, occ); } else { - registry.fill(HIST("Tracks/EtaZvtxGen"), particle.eta(), zvtx); - registry.fill(HIST("Tracks/PhiEtaGen"), phi, particle.eta()); + registry.fill(HIST("Tracks/EtaZvtxGen"), particle.eta(), zvtx, occ); + registry.fill(HIST("Tracks/PhiEtaGen"), phi, particle.eta(), occ); } } } } - /// @brief process fnc. for general event statistics - void processTagging(FullBCs const& bcs, CollsCent const& collisions) + /// @brief process function for general event statistics + void processTagging(FullBCs const& bcs, CollsCentFT0C const& collisions) { std::vector::iterator> cols; for (auto const& bc : bcs) { @@ -821,175 +789,222 @@ struct DndetaMFTPbPb { } } - PROCESS_SWITCH(DndetaMFTPbPb, processTagging, - "Collect event sample stats", true); + PROCESS_SWITCH(DndetaMFTPbPb, processTagging, "Collect event sample stats", true); + /// @brief process function for counting tracks template - void processData(typename C::iterator const& collision, - FiltMftTracks const& tracks) + void processData(typename C::iterator const& collision, FiltMftTracks const& tracks) { - float c = -1; - if constexpr (C::template contains()) { - c = collision.centFT0C(); - registry.fill(HIST("Events/Centrality/Selection"), 1., c); + auto occ = getOccupancy(collision, cfgOccEstimator); + float c = getRecoCent(collision); + + if constexpr (has_reco_cent) { + registry.fill(HIST("Events/Centrality/Selection"), 1., c, occ); } else { - registry.fill(HIST("Events/Selection"), 1.); + registry.fill(HIST("Events/Selection"), 1., occ); } if (!isGoodEvent(collision)) { return; } auto z = collision.posZ(); - auto occ = collision.trackOccupancyInTimeRange(); - if constexpr (C::template contains()) { - registry.fill(HIST("Events/Centrality/Selection"), 2., c); - qaregistry.fill(HIST("Events/Centrality/Occupancy"), z, c, occ); - qaregistry.fill(HIST("Events/Centrality/hcentFT0C"), c); + if constexpr (has_reco_cent) { + registry.fill(HIST("Events/Centrality/Selection"), 2., c, occ); + qaregistry.fill(HIST("Events/Centrality/hZvtxCent"), z, c, occ); + qaregistry.fill(HIST("Events/Centrality/hCent"), c, occ); } else { - registry.fill(HIST("Events/Selection"), 2.); + registry.fill(HIST("Events/Selection"), 2., occ); } - auto nTrk = countTracks( - tracks, z, c, occ); //!@note here we obtain eta-z and phi-eta - if constexpr (C::template contains()) { - registry.fill(HIST("Events/Centrality/NtrkZvtx"), nTrk, z, c); + auto nTrk = countTracks(tracks, z, c, occ); + + if constexpr (has_reco_cent) { + registry.fill(HIST("Events/Centrality/NtrkZvtx"), nTrk, z, c, occ); } else { - registry.fill(HIST("Events/NtrkZvtx"), nTrk, z); + registry.fill(HIST("Events/NtrkZvtx"), nTrk, z, occ); } } + /// @brief process function for counting tracks (based on BestCollisionsFwd table) template - void processDatawBestTracks( - typename C::iterator const& collision, FiltMftTracks const& tracks, - soa::SmallGroups const& besttracks) + void processDatawBestTracks(typename C::iterator const& collision, FiltMftTracks const& tracks, soa::SmallGroups const& besttracks) { - float c = -1; - if constexpr (C::template contains()) { - c = collision.centFT0C(); - registry.fill(HIST("Events/Centrality/Selection"), 1., c); + auto occ = getOccupancy(collision, cfgOccEstimator); + float c = getRecoCent(collision); + + if constexpr (has_reco_cent) { + registry.fill(HIST("Events/Centrality/Selection"), 1., c, occ); } else { - registry.fill(HIST("Events/Selection"), 1.); + registry.fill(HIST("Events/Selection"), 1., occ); } if (!isGoodEvent(collision)) { return; } auto z = collision.posZ(); - auto occ = collision.trackOccupancyInTimeRange(); - if constexpr (C::template contains()) { - registry.fill(HIST("Events/Centrality/Selection"), 2., c); - qaregistry.fill(HIST("Events/Centrality/OccupancyBest"), z, c, occ); + if constexpr (has_reco_cent) { + registry.fill(HIST("Events/Centrality/Selection"), 2., c, occ); } else { - registry.fill(HIST("Events/Selection"), 2.); + registry.fill(HIST("Events/Selection"), 2., occ); } - auto nBestTrks = - countBestTracks(tracks, besttracks, z, c, - occ); //!@note here we obtain eta-z and phi-eta - if constexpr (C::template contains()) { - registry.fill(HIST("Events/Centrality/NtrkZvtxBest"), nBestTrks, z, c); + auto nBestTrks = countBestTracks(tracks, besttracks, z, c, occ); + + if constexpr (has_reco_cent) { + registry.fill(HIST("Events/Centrality/NtrkZvtxBest"), nBestTrks, z, c, occ); } else { - registry.fill(HIST("Events/NtrkZvtxBest"), nBestTrks, z); + registry.fill(HIST("Events/NtrkZvtxBest"), nBestTrks, z, occ); } } - /// @brief process fnc. to run on DATA and REC MC w/o centrality selection - void processDataInclusive(Colls::iterator const& collision, - FiltMftTracks const& tracks) + void processDataInclusive(Colls::iterator const& collision, FiltMftTracks const& tracks) { processData(collision, tracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processDataInclusive, "Count tracks", - false); + PROCESS_SWITCH(DndetaMFTPbPb, processDataInclusive, "Count tracks (inclusive)", false); + + void processDataCentFT0C(CollsCentFT0C::iterator const& collision, FiltMftTracks const& tracks) + { + processData(collision, tracks); + } + + PROCESS_SWITCH(DndetaMFTPbPb, processDataCentFT0C, "Count tracks in FT0C centrality bins", false); + + void processDataCentFT0CVariant1(CollsCentFT0CVariant1::iterator const& collision, FiltMftTracks const& tracks) + { + processData(collision, tracks); + } + + PROCESS_SWITCH(DndetaMFTPbPb, processDataCentFT0CVariant1, "Count tracks in FT0CVariant1 centrality bins", false); + + void processDataCentFT0M(CollsCentFT0M::iterator const& collision, FiltMftTracks const& tracks) + { + processData(collision, tracks); + } + + PROCESS_SWITCH(DndetaMFTPbPb, processDataCentFT0M, "Count tracks in FT0M centrality bins", false); - /// @brief process fnc. to run on DATA and REC MC w/ FT0C centrality selection - void processDataCent(CollsCent::iterator const& collision, - FiltMftTracks const& tracks) + void processDataCentNGlobal(CollsCentNGlobal::iterator const& collision, FiltMftTracks const& tracks) { - processData(collision, tracks); + processData(collision, tracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processDataCent, - "Count tracks in FT0C bins", false); + PROCESS_SWITCH(DndetaMFTPbPb, processDataCentNGlobal, "Count tracks in NGlobal centrality bins", false); - /// @brief process fnc. to run on DATA and REC MC based on BestCollisionsFwd - /// table w/o centrality selection - void processDatawBestTracksInclusive( - Colls::iterator const& collision, FiltMftTracks const& tracks, - soa::SmallGroups const& besttracks) + void processDataCentMFT(CollsCentMFT::iterator const& collision, FiltMftTracks const& tracks) + { + processData(collision, tracks); + } + + PROCESS_SWITCH(DndetaMFTPbPb, processDataCentMFT, "Count tracks in MFT centrality bins", false); + + void processDatawBestTracksInclusive(Colls::iterator const& collision, FiltMftTracks const& tracks, soa::SmallGroups const& besttracks) { processDatawBestTracks(collision, tracks, besttracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processDatawBestTracksInclusive, - "Count tracks based on BestCollisionsFwd table", false); + PROCESS_SWITCH(DndetaMFTPbPb, processDatawBestTracksInclusive, "Count tracks based on BestCollisionsFwd table (inclusive)", false); + + void processDatawBestTracksCentFT0C(CollsCentFT0C::iterator const& collision, FiltMftTracks const& tracks, soa::SmallGroups const& besttracks) + { + processDatawBestTracks(collision, tracks, besttracks); + } + + PROCESS_SWITCH(DndetaMFTPbPb, processDatawBestTracksCentFT0C, "Count tracks in FT0C centrality bins based on BestCollisionsFwd table", false); + + void processDatawBestTracksCentFT0CVariant1(CollsCentFT0CVariant1::iterator const& collision, FiltMftTracks const& tracks, soa::SmallGroups const& besttracks) + { + processDatawBestTracks(collision, tracks, besttracks); + } + + PROCESS_SWITCH(DndetaMFTPbPb, processDatawBestTracksCentFT0CVariant1, "Count tracks in FT0CVariant1 centrality bins based on BestCollisionsFwd table", false); + + void processDatawBestTracksCentFT0M(CollsCentFT0M::iterator const& collision, FiltMftTracks const& tracks, soa::SmallGroups const& besttracks) + { + processDatawBestTracks(collision, tracks, besttracks); + } + + PROCESS_SWITCH(DndetaMFTPbPb, processDatawBestTracksCentFT0M, "Count tracks in FT0M centrality bins based on BestCollisionsFwd table", false); + + void processDatawBestTracksCentNGlobal(CollsCentNGlobal::iterator const& collision, FiltMftTracks const& tracks, soa::SmallGroups const& besttracks) + { + processDatawBestTracks(collision, tracks, besttracks); + } + + PROCESS_SWITCH(DndetaMFTPbPb, processDatawBestTracksCentNGlobal, "Count tracks in NGlobal centrality bins based on BestCollisionsFwd table", false); - /// @brief process fnc. to run on DATA and REC MC based on BestCollisionsFwd - /// table w/ FT0C centrality selection - void processDatawBestTracksCent( - CollsCent::iterator const& collision, FiltMftTracks const& tracks, - soa::SmallGroups const& besttracks) + void processDatawBestTracksCentMFT(CollsCentMFT::iterator const& collision, FiltMftTracks const& tracks, soa::SmallGroups const& besttracks) { - processDatawBestTracks(collision, tracks, besttracks); + processDatawBestTracks(collision, tracks, besttracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processDatawBestTracksCent, - "Count tracks in FT0C bins based on BestCollisionsFwd table", - false); + PROCESS_SWITCH(DndetaMFTPbPb, processDatawBestTracksCentMFT, "Count tracks in MFT centrality bins based on BestCollisionsFwd table", false); Preslice perCol = o2::aod::fwdtrack::collisionId; + PresliceUnsorted recColPerMcCol = aod::mccollisionlabel::mcCollisionId; Partition mcSample = nabs(aod::mcparticle::eta) < 1.0f; - /// @brief process template function to run on MC truth - /// @param cols subscribe to the collisions - /// @param parts subscribe to filtered MC particle table + /// @brief process template function to run on MC gen template - void processMC( - typename MC::iterator const& mcCollision, - soa::SmallGroups> const& collisions, - FiltParticles const& particles, FiltMcMftTracks const& tracks) + void processMC(typename MC::iterator const& mcCollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks) { + bool gtZeroColl = false; + int gtOneColl = 0; + float cgen = -1; - bool atLeastOne = false; - int moreThanOne = 0; + if constexpr (has_reco_cent) { + float crec_min = 105.f; + for (const auto& collision : collisions) { + if (isGoodEvent(collision)) { + float c = getRecoCent(collision); + if (c < crec_min) { + crec_min = c; + } + } + } + if (cgen < 0) + cgen = crec_min; + } + + float occgen = -1.; + for (const auto& collision : collisions) { + if (isGoodEvent(collision)) { + float o = getOccupancy(collision, cfgOccEstimator); + if (o > occgen) { + occgen = o; + } + } + } + for (auto const& collision : collisions) { - float crec = -1; - if constexpr (C::template contains()) { - crec = collision.centFT0C(); - registry.fill(HIST("Events/Centrality/EvtEffGen"), 1., crec); + float occrec = getOccupancy(collision, cfgOccEstimator); + float crec = getRecoCent(collision); + + if constexpr (has_reco_cent) { + registry.fill(HIST("Events/Centrality/EvtEffGen"), 1., crec, occrec); } else { - registry.fill(HIST("Events/EvtEffGen"), 1.); + registry.fill(HIST("Events/EvtEffGen"), 1., occrec); } if (isGoodEvent(collision)) { - if constexpr (C::template contains()) { - if (!atLeastOne) { - cgen = crec; - } - } - atLeastOne = true; - ++moreThanOne; + gtZeroColl = true; + ++gtOneColl; auto z = collision.posZ(); - if constexpr (C::template contains()) { - registry.fill(HIST("Events/Centrality/EvtEffGen"), 2., crec); - registry.fill(HIST("Events/Centrality/hRecCent"), crec); - registry.fill(HIST("Events/Centrality/hRecZvtxCent"), z, crec); + if constexpr (has_reco_cent) { + registry.fill(HIST("Events/Centrality/EvtEffGen"), 2., crec, occrec); + registry.fill(HIST("Events/Centrality/hRecCent"), crec, occrec); + registry.fill(HIST("Events/Centrality/hRecZvtxCent"), z, crec, occrec); } else { - registry.fill(HIST("Events/EvtEffGen"), 2.); + registry.fill(HIST("Events/EvtEffGen"), 2., occrec); } - auto perCollisionSample = - tracks.sliceBy(perCol, collision.globalIndex()); - auto nTrkRec = - countTracks(perCollisionSample, z, crec, - collision.trackOccupancyInTimeRange()); + auto perColSample = tracks.sliceBy(perCol, collision.globalIndex()); + auto nTrkRec = countTracks(perColSample, z, crec, occrec); - if constexpr (C::template contains()) { - qaregistry.fill(HIST("Events/Centrality/ZvtxDiff"), - collision.posZ() - mcCollision.posZ(), crec); + if constexpr (has_reco_cent) { + qaregistry.fill(HIST("Events/Centrality/ZvtxDiff"), collision.posZ() - mcCollision.posZ(), crec); } else { - qaregistry.fill(HIST("Events/ZvtxDiff"), - collision.posZ() - mcCollision.posZ()); + qaregistry.fill(HIST("Events/ZvtxDiff"), collision.posZ() - mcCollision.posZ()); } if (useZDiffCut) { @@ -998,26 +1013,24 @@ struct DndetaMFTPbPb { } } - if constexpr (C::template contains()) { - registry.fill(HIST("Events/Centrality/NtrkZvtxGen"), nTrkRec, - collision.posZ(), crec); + if constexpr (has_reco_cent) { + registry.fill(HIST("Events/Centrality/NtrkZvtxGen"), nTrkRec, collision.posZ(), crec, occrec); } else { - registry.fill(HIST("Events/NtrkZvtxGen"), nTrkRec, collision.posZ()); + registry.fill(HIST("Events/NtrkZvtxGen"), nTrkRec, collision.posZ(), occrec); } } } - if constexpr (C::template contains()) { - registry.fill(HIST("Events/Centrality/EvtEffGen"), 3., cgen); + if constexpr (has_reco_cent) { + registry.fill(HIST("Events/Centrality/EvtEffGen"), 3., cgen, occgen); } else { - registry.fill(HIST("Events/EvtEffGen"), 3.); + registry.fill(HIST("Events/EvtEffGen"), 3., occgen); } - auto perCollMCsample = mcSample->sliceByCached( - aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); + auto perCollMCsample = mcSample->sliceByCached(aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); auto nchrg = countPart(perCollMCsample); - if (moreThanOne > 1) { - if constexpr (C::template contains()) { + if (gtOneColl > 1) { + if constexpr (has_reco_cent) { qaregistry.fill(HIST("Events/Centrality/SplitMult"), nchrg, cgen); } else { qaregistry.fill(HIST("Events/SplitMult"), nchrg); @@ -1026,183 +1039,202 @@ struct DndetaMFTPbPb { auto zvtxMC = mcCollision.posZ(); auto nCharged = countPart(particles); - if constexpr (C::template contains()) { - registry.fill(HIST("Events/Centrality/NtrkZvtxGen_t"), nCharged, zvtxMC, - cgen); + if constexpr (has_reco_cent) { + registry.fill(HIST("Events/Centrality/NtrkZvtxGen_t"), nCharged, zvtxMC, cgen); } else { registry.fill(HIST("Events/NtrkZvtxGen_t"), nCharged, zvtxMC); } - fillHistMC()>(particles, cgen, - zvtxMC, atLeastOne); + fillHistMC>(particles, cgen, occgen, zvtxMC, gtZeroColl); if (collisions.size() == 0) { - if constexpr (C::template contains()) { - qaregistry.fill(HIST("Events/Centrality/NotFoundEventZvtx"), - mcCollision.posZ(), cgen); + if constexpr (has_reco_cent) { + qaregistry.fill(HIST("Events/Centrality/NotFoundEventZvtx"), mcCollision.posZ(), cgen); } else { qaregistry.fill(HIST("Events/NotFoundEventZvtx"), mcCollision.posZ()); } } } - /// @brief process fnc. to run on MC w/o centrality selection - void processMCInclusive( - aod::McCollisions::iterator const& mccollision, - soa::SmallGroups> const& collisions, - FiltParticles const& particles, FiltMcMftTracks const& tracks) + void processMCInclusive(aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks) + { + processMC(mccollision, collisions, particles, tracks); + } + + PROCESS_SWITCH(DndetaMFTPbPb, processMCInclusive, "Count MC particles (inclusive)", false); + + void processMCCentFT0C(aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks) { - processMC(mccollision, collisions, particles, - tracks); + processMC(mccollision, collisions, particles, tracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processMCInclusive, - "Count MC particles", false); + PROCESS_SWITCH(DndetaMFTPbPb, processMCCentFT0C, "Count MC particles in FT0C centrality bins", false); - /// @brief process fnc. to run on MC w FT0C centrality selection - void processMCCent( - aod::McCollisions::iterator const& mccollision, - soa::SmallGroups> const& collisions, - FiltParticles const& particles, FiltMcMftTracks const& tracks) + void processMCCentFT0CVariant1(aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks) { - processMC(mccollision, collisions, particles, - tracks); + processMC(mccollision, collisions, particles, tracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processMCCent, - "Count MC particles in FT0C bins", false); + PROCESS_SWITCH(DndetaMFTPbPb, processMCCentFT0CVariant1, "Count MC particles in FT0CVariant1 centrality bins", false); - PresliceUnsorted perColU = - aod::fwdtrack::bestCollisionId; + void processMCCentFT0M(aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks) + { + processMC(mccollision, collisions, particles, tracks); + } + + PROCESS_SWITCH(DndetaMFTPbPb, processMCCentFT0M, "Count MC particles in FT0M centrality bins", false); - /// @brief process template function to run on MC truth using - /// aod::BestCollisionsFwd tracks + void processMCCentNGlobal(aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks) + { + processMC(mccollision, collisions, particles, tracks); + } + + PROCESS_SWITCH(DndetaMFTPbPb, processMCCentNGlobal, "Count MC particles in NGlobal centrality bins", false); + + void processMCCentMFT(aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks) + { + processMC(mccollision, collisions, particles, tracks); + } + + PROCESS_SWITCH(DndetaMFTPbPb, processMCCentMFT, "Count MC particles in MFT centrality bins", false); + + PresliceUnsorted perColU = aod::fwdtrack::bestCollisionId; + + /// @brief process template function to run on MC truth using aod::BestCollisionsFwd tracks template - void processMCwBestTracks( - typename MC::iterator const& mcCollision, - soa::SmallGroups> const& collisions, - FiltParticles const& particles, FiltMcMftTracks const& tracks, - FiltBestTracks const& besttracks) + void processMCwBestTracks(typename MC::iterator const& mcCollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks, FiltBestTracks const& besttracks) { + bool gtZeroColl = false; float cgen = -1; - bool atLeastOne = false; - // int moreThanOne = 0; + if constexpr (has_reco_cent) { + float crec_min = 105.f; + for (const auto& collision : collisions) { + if (isGoodEvent(collision)) { + float c = getRecoCent(collision); + if (c < crec_min) { + crec_min = c; + } + } + } + if (cgen < 0) + cgen = crec_min; + } + + float occgen = -1.; + for (const auto& collision : collisions) { + if (isGoodEvent(collision)) { + float o = getOccupancy(collision, cfgOccEstimator); + if (o > occgen) { + occgen = o; + } + } + } + for (auto const& collision : collisions) { - float crec = -1; - if constexpr (C::template contains()) { - crec = collision.centFT0C(); - registry.fill(HIST("Events/Centrality/EvtEffGen"), 1., crec); + auto occrec = getOccupancy(collision, cfgOccEstimator); + float crec = getRecoCent(collision); + + if constexpr (has_reco_cent) { + registry.fill(HIST("Events/Centrality/EvtEffGen"), 1., crec, occrec); } else { - registry.fill(HIST("Events/EvtEffGen"), 1.); + registry.fill(HIST("Events/EvtEffGen"), 1., occrec); } if (isGoodEvent(collision)) { - if constexpr (C::template contains()) { - if (!atLeastOne) { - cgen = crec; - } - } - atLeastOne = true; - // ++moreThanOne; + gtZeroColl = true; auto z = collision.posZ(); - if constexpr (C::template contains()) { - registry.fill(HIST("Events/Centrality/EvtEffGen"), 2., crec); + if constexpr (has_reco_cent) { + registry.fill(HIST("Events/Centrality/EvtEffGen"), 2., crec, occrec); } else { - registry.fill(HIST("Events/EvtEffGen"), 2.); + registry.fill(HIST("Events/EvtEffGen"), 2., occrec); } - auto perCollisionSample = - tracks.sliceBy(perCol, collision.globalIndex()); - auto perCollisionASample = - besttracks.sliceBy(perColU, collision.globalIndex()); - auto nTrkRec = countBestTracks( - perCollisionSample, perCollisionASample, z, crec, - collision.trackOccupancyInTimeRange()); - - if constexpr (C::template contains()) { - registry.fill(HIST("Events/Centrality/NtrkZvtxGen"), nTrkRec, z, - crec); + auto perCollisionSample = tracks.sliceBy(perCol, collision.globalIndex()); + auto perCollisionASample = besttracks.sliceBy(perColU, collision.globalIndex()); + auto nTrkRec = countBestTracks(perCollisionSample, perCollisionASample, z, crec, collision.trackOccupancyInTimeRange()); + + if constexpr (has_reco_cent) { + registry.fill(HIST("Events/Centrality/NtrkZvtxGen"), nTrkRec, z, crec); } else { registry.fill(HIST("Events/NtrkZvtxGen"), nTrkRec, z); } } } - if constexpr (C::template contains()) { - registry.fill(HIST("Events/Centrality/EvtEffGen"), 3., cgen); + if constexpr (has_reco_cent) { + registry.fill(HIST("Events/Centrality/EvtEffGen"), 3., cgen, occgen); } else { - registry.fill(HIST("Events/EvtEffGen"), 3.); + registry.fill(HIST("Events/EvtEffGen"), 3., occgen); } auto zvtxMC = mcCollision.posZ(); auto nCharged = countPart(particles); - if constexpr (C::template contains()) { - registry.fill(HIST("Events/Centrality/NtrkZvtxGen_t"), nCharged, zvtxMC, - cgen); + if constexpr (has_reco_cent) { + registry.fill(HIST("Events/Centrality/NtrkZvtxGen_t"), nCharged, zvtxMC, cgen); } else { registry.fill(HIST("Events/NtrkZvtxGen_t"), nCharged, zvtxMC); } - fillHistMC()>(particles, cgen, - zvtxMC, atLeastOne); + fillHistMC>(particles, cgen, occgen, zvtxMC, gtZeroColl); if (collisions.size() == 0) { - if constexpr (C::template contains()) { - qaregistry.fill(HIST("Events/Centrality/NotFoundEventZvtx"), - mcCollision.posZ(), cgen); + if constexpr (has_reco_cent) { + qaregistry.fill(HIST("Events/Centrality/NotFoundEventZvtx"), mcCollision.posZ(), cgen); } else { qaregistry.fill(HIST("Events/NotFoundEventZvtx"), mcCollision.posZ()); } } } - /// @brief process fnc. to run on MC (inclusive, using aod::BestCollisionsFwd - /// tracks) - void processMCwBestTracksInclusive( - aod::McCollisions::iterator const& mccollision, - soa::SmallGroups> const& collisions, - FiltParticles const& particles, FiltMcMftTracks const& tracks, - // aod::BestCollisionsFwd const - // &besttracks - FiltBestTracks const& besttracks) + void processMCwBestTracksInclusive(aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks, FiltBestTracks const& besttracks) + { + processMCwBestTracks(mccollision, collisions, particles, tracks, besttracks); + } + + PROCESS_SWITCH(DndetaMFTPbPb, processMCwBestTracksInclusive, "Count MC particles using aod::BestCollisionsFwd (inclusive)", false); + + void processMCwBestTracksCentFT0C(aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks, FiltBestTracks const& besttracks) + { + processMCwBestTracks(mccollision, collisions, particles, tracks, besttracks); + } + + PROCESS_SWITCH(DndetaMFTPbPb, processMCwBestTracksCentFT0C, "Count MC particles in FT0C centrality bins using aod::BestCollisionsFwd", false); + + void processMCwBestTracksCentFT0CVariant1(aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks, FiltBestTracks const& besttracks) + { + processMCwBestTracks(mccollision, collisions, particles, tracks, besttracks); + } + + PROCESS_SWITCH(DndetaMFTPbPb, processMCwBestTracksCentFT0CVariant1, "Count MC particles in FT0CVariant1 centrality bins using aod::BestCollisionsFwd", false); + + void processMCwBestTracksCentFT0M(aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks, FiltBestTracks const& besttracks) { - processMCwBestTracks( - mccollision, collisions, particles, tracks, besttracks); + processMCwBestTracks(mccollision, collisions, particles, tracks, besttracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processMCwBestTracksInclusive, - "Count MC particles using aod::BestCollisionsFwd", false); + PROCESS_SWITCH(DndetaMFTPbPb, processMCwBestTracksCentFT0M, "Count MC particles in FT0M centrality bins using aod::BestCollisionsFwd", false); - /// @brief process fnc. to run on MC (FT0C centrality, using - /// aod::BestCollisionsFwd tracks) - void processMCwBestTracksCent( - aod::McCollisions::iterator const& mccollision, - soa::SmallGroups> const& collisions, - FiltParticles const& particles, FiltMcMftTracks const& tracks, - FiltBestTracks const& besttracks) + void processMCwBestTracksCentNGlobal(aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks, FiltBestTracks const& besttracks) { - processMCwBestTracks( - mccollision, collisions, particles, tracks, besttracks); + processMCwBestTracks(mccollision, collisions, particles, tracks, besttracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processMCwBestTracksCent, - "Count MC particles in FT0C bins using aod::BestCollisionsFwd", - false); + PROCESS_SWITCH(DndetaMFTPbPb, processMCwBestTracksCentNGlobal, "Count MC particles in NGlobal centrality bins using aod::BestCollisionsFwd", false); + + void processMCwBestTracksCentMFT(aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks, FiltBestTracks const& besttracks) + { + processMCwBestTracks(mccollision, collisions, particles, tracks, besttracks); + } + + PROCESS_SWITCH(DndetaMFTPbPb, processMCwBestTracksCentMFT, "Count MC particles in MFT centrality bins using aod::BestCollisionsFwd", false); using ParticlesI = soa::Join; - Partition primariesI = - ((aod::mcparticle::flags & - (uint8_t)o2::aod::mcparticle::enums::PhysicalPrimary) == - (uint8_t)o2::aod::mcparticle::enums::PhysicalPrimary); + Partition primariesI = ((aod::mcparticle::flags & (uint8_t)o2::aod::mcparticle::enums::PhysicalPrimary) == (uint8_t)o2::aod::mcparticle::enums::PhysicalPrimary); - /// @brief process template function to calculate tracking efficiency (indexed - /// as particle-to-MFT-tracks) + /// @brief process template function to calculate tracking efficiency (indexed as particle-to-MFT-tracks) template - void processTrkEffIdx( - typename soa::Join const& collisions, - MC const& /*mccollisions*/, ParticlesI const& /*particles*/, - MFTTracksLabeled const& tracks) + void processTrkEffIdx(typename soa::Join const& collisions, MC const& /*mccollisions*/, ParticlesI const& /*particles*/, MFTTracksLabeled const& tracks) { for (auto const& collision : collisions) { if (!isGoodEvent(collision)) { @@ -1212,28 +1244,51 @@ struct DndetaMFTPbPb { continue; } - float crec = -1; - if constexpr (C::template contains()) { - crec = collision.centFT0C(); + float crec = getRecoCent(collision); + auto occrec = getOccupancy(collision, cfgOccEstimator); + auto mcCollision = collision.mcCollision(); + + float cgen = -1; + if constexpr (has_reco_cent) { + float crec_min = 105.f; + for (const auto& collision : collisions) { + if (isGoodEvent(collision)) { + float c = getRecoCent(collision); + if (c < crec_min) { + crec_min = c; + } + } + } + if (cgen < 0) + cgen = crec_min; } - auto mcCollision = collision.mcCollision(); - auto particlesPerCol = primariesI->sliceByCached( - aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); - particlesPerCol.bindExternalIndices(&tracks); + float occgen = -1.; + for (const auto& collision : collisions) { + if (isGoodEvent(collision)) { + float o = getOccupancy(collision, cfgOccEstimator); + if (o > occgen) { + occgen = o; + } + } + } - for (auto const& particle : particlesPerCol) { + auto partsPerCol = primariesI->sliceByCached(aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); + partsPerCol.bindExternalIndices(&tracks); + + for (auto const& particle : partsPerCol) { if (!isChrgParticle(particle.pdgCode())) { continue; } + // MC gen - if constexpr (C::template contains()) { + if constexpr (has_reco_cent) { qaregistry.fill(HIST("Tracks/Centrality/hPtPhiEtaZvtxEffGen"), particle.pt(), particle.phi(), particle.eta(), - mcCollision.posZ(), crec); + mcCollision.posZ(), cgen, occgen); } else { qaregistry.fill(HIST("Tracks/hPtPhiEtaZvtxEffGen"), particle.pt(), - particle.phi(), particle.eta(), mcCollision.posZ()); + particle.phi(), particle.eta(), mcCollision.posZ(), occgen); } // MC rec if (particle.has_mfttracks()) { @@ -1246,53 +1301,53 @@ struct DndetaMFTPbPb { continue; } ++ncnt; - if constexpr (C::template contains()) { + if constexpr (has_reco_cent) { if (!iscounted) { // primaries qaregistry.fill(HIST("Tracks/Centrality/hPtPhiEtaZvtxEffRec"), particle.pt(), particle.phi(), particle.eta(), - mcCollision.posZ(), crec); + mcCollision.posZ(), crec, occrec); iscounted = true; } if (ncnt > 1) { // duplicates qaregistry.fill(HIST("Tracks/Centrality/hPhiEtaDuplicates"), - track.phi(), track.eta(), crec); + track.phi(), track.eta(), crec, occrec); qaregistry.fill( HIST("Tracks/Centrality/hPtPhiEtaZvtxEffDuplicates"), particle.pt(), particle.phi(), particle.eta(), - mcCollision.posZ(), crec); + mcCollision.posZ(), crec, occrec); } } else { if (!iscounted) { // primaries qaregistry.fill(HIST("Tracks/hPtPhiEtaZvtxEffRec"), particle.pt(), particle.phi(), particle.eta(), - mcCollision.posZ()); + mcCollision.posZ(), occrec); iscounted = true; } if (ncnt > 1) { // duplicates qaregistry.fill(HIST("Tracks/hPhiEtaDuplicates"), track.phi(), - track.eta()); + track.eta(), occrec); qaregistry.fill(HIST("Tracks/hPtPhiEtaZvtxEffDuplicates"), particle.pt(), particle.phi(), particle.eta(), - mcCollision.posZ()); + mcCollision.posZ(), occrec); } } } - if constexpr (C::template contains()) { + if constexpr (has_reco_cent) { qaregistry.fill(HIST("Tracks/Centrality/NmftTrkPerPart"), ncnt, - crec); + crec, occrec); } else { - qaregistry.fill(HIST("Tracks/NmftTrkPerPart"), ncnt); + qaregistry.fill(HIST("Tracks/NmftTrkPerPart"), ncnt, occrec); } if (relatedTracks.size() > 1) { - if constexpr (C::template contains()) { + if constexpr (has_reco_cent) { qaregistry.fill( HIST("Tracks/Centrality/hPtPhiEtaZvtxEffGenDuplicates"), particle.pt(), particle.phi(), particle.eta(), - mcCollision.posZ(), crec); + mcCollision.posZ(), crec, occrec); } else { qaregistry.fill(HIST("Tracks/hPtPhiEtaZvtxEffGenDuplicates"), particle.pt(), particle.phi(), particle.eta(), - mcCollision.posZ()); + mcCollision.posZ(), occrec); } } } @@ -1300,42 +1355,23 @@ struct DndetaMFTPbPb { } } - /// @brief process function to calculate tracking efficiency (inclusive, - /// indexed) - void processTrkEffIdxInlusive( - soa::Join const& collisions, - aod::McCollisions const& mccollisions, ParticlesI const& particles, - MFTTracksLabeled const& tracks) + void processTrkEffIdxInlusive(soa::Join const& collisions, aod::McCollisions const& mccollisions, ParticlesI const& particles, MFTTracksLabeled const& tracks) { - processTrkEffIdx(collisions, mccollisions, - particles, tracks); + processTrkEffIdx(collisions, mccollisions, particles, tracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processTrkEffIdxInlusive, - "Process tracking efficiency (inclusive)", false); + PROCESS_SWITCH(DndetaMFTPbPb, processTrkEffIdxInlusive, "Process tracking efficiency (inclusive, indexed)", false); - /// @brief process function to calculate tracking efficiency (FT0 bins, - /// indexed) - void processTrkEffIdxCent( - soa::Join const& collisions, - aod::McCollisions const& mccollisions, ParticlesI const& particles, - MFTTracksLabeled const& tracks) + void processTrkEffIdxCentFT0C(soa::Join const& collisions, aod::McCollisions const& mccollisions, ParticlesI const& particles, MFTTracksLabeled const& tracks) { - processTrkEffIdx(collisions, mccollisions, - particles, tracks); + processTrkEffIdx(collisions, mccollisions, particles, tracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processTrkEffIdxCent, - "Process tracking efficiency in FT0 bins", false); + PROCESS_SWITCH(DndetaMFTPbPb, processTrkEffIdxCentFT0C, "Process tracking efficiency (in FT0C centrality bins, indexed)", false); - /// @brief process function to calculate tracking efficiency (indexed) based - /// on BestCollisionsFwd in FT0C bins + /// @brief process function to calculate tracking efficiency (indexed) based on BestCollisionsFwd in FT0C bins template - void processTrkEffBest( - typename soa::Join::iterator const& collision, - MC const& /*mccollisions*/, FiltParticles const& particles, - FiltMcMftTracks const& /*tracks*/, - soa::SmallGroups const& besttracks) + void processTrkEffBest(typename soa::Join::iterator const& collision, MC const& /*mccollisions*/, FiltParticles const& particles, FiltMcMftTracks const& /*tracks*/, soa::SmallGroups const& besttracks) { if (!isGoodEvent(collision)) { return; @@ -1344,25 +1380,22 @@ struct DndetaMFTPbPb { return; } - float crec = -1; - if constexpr (C::template contains()) { - crec = collision.centFT0C(); - } - + float crec = getRecoCent(collision); + auto occrec = getOccupancy(collision, cfgOccEstimator); auto mcCollision = collision.mcCollision(); - auto particlesPerCol = particles.sliceByCached( - aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); - for (auto const& particle : particlesPerCol) { + auto partsPerCol = particles.sliceByCached(aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); + + for (auto const& particle : partsPerCol) { if (!isChrgParticle(particle.pdgCode())) { continue; } - if constexpr (C::template contains()) { + if constexpr (has_reco_cent) { qaregistry.fill(HIST("Tracks/Centrality/hPtPhiEtaZvtxEffBestGen"), particle.pt(), particle.phi(), particle.eta(), - mcCollision.posZ(), crec); + mcCollision.posZ(), crec, occrec); } else { qaregistry.fill(HIST("Tracks/hPtPhiEtaZvtxEffBestGen"), particle.pt(), - particle.phi(), particle.eta(), mcCollision.posZ()); + particle.phi(), particle.eta(), mcCollision.posZ(), occrec); } } @@ -1373,78 +1406,177 @@ struct DndetaMFTPbPb { } if (itrack.has_mcParticle()) { auto particle = itrack.mcParticle_as(); - if constexpr (C::template contains()) { + if constexpr (has_reco_cent) { qaregistry.fill(HIST("Tracks/Centrality/hPtPhiEtaZvtxEffBestRec"), particle.pt(), itrack.phi(), itrack.eta(), - mcCollision.posZ(), crec); + mcCollision.posZ(), crec, occrec); } else { qaregistry.fill(HIST("Tracks/hPtPhiEtaZvtxEffBestRec"), particle.pt(), - itrack.phi(), itrack.eta(), mcCollision.posZ()); + itrack.phi(), itrack.eta(), mcCollision.posZ(), occrec); } } else { - if constexpr (C::template contains()) { + if constexpr (has_reco_cent) { qaregistry.fill(HIST("Tracks/Centrality/hPtEffBestFakeRec"), - itrack.pt(), crec); + itrack.pt(), crec, occrec); + } else { + qaregistry.fill(HIST("Tracks/hPtEffBestFakeRec"), itrack.pt(), occrec); + } + } + } + } + + void processTrkEffBestInclusive(soa::Join::iterator const& collision, aod::McCollisions const& mccollisions, FiltParticles const& particles, FiltMcMftTracks const& tracks, soa::SmallGroups const& besttracks) + { + processTrkEffBest(collision, mccollisions, particles, tracks, besttracks); + } + + PROCESS_SWITCH(DndetaMFTPbPb, processTrkEffBestInclusive, "Process tracking efficiency (inclusive, based on BestCollisionsFwd)", false); + + void processTrkEffBestCentFT0C(soa::Join::iterator const& collision, aod::McCollisions const& mccollisions, FiltParticles const& particles, FiltMcMftTracks const& tracks, soa::SmallGroups const& besttracks) + { + processTrkEffBest(collision, mccollisions, particles, tracks, besttracks); + } + + PROCESS_SWITCH(DndetaMFTPbPb, processTrkEffBestCentFT0C, "Process tracking efficiency (in FT0 centrality bins, based on BestCollisionsFwd)", false); + + Preslice filtMcTrkperCol = o2::aod::fwdtrack::collisionId; + + /// @brief process function to calculate MC efficiency and fraction of fake tracks + template + void processEfficiency(typename soa::Join const& collisions, MC const& /*mccollisions*/, FiltParticles const& /*particles*/, FiltMcMftTracks const& tracks) + { + for (auto const& collision : collisions) { + if (!isGoodEvent(collision)) { + continue; + } + + float crec = getRecoCent(collision); + auto occrec = getOccupancy(collision, cfgOccEstimator); + auto mcCollision = collision.mcCollision(); + auto perColTrks = tracks.sliceBy(filtMcTrkperCol, collision.globalIndex()); + + for (auto const& track : perColTrks) { + if (!isTrackSelected(track)) { + continue; + } + if (track.has_mcParticle()) { + auto particle = track.template mcParticle_as(); + if constexpr (has_reco_cent) { + qaregistry.fill(HIST("Tracks/Centrality/hEffRec"), + particle.pt(), particle.phi(), particle.eta(), + mcCollision.posZ(), crec, occrec); + } else { + qaregistry.fill(HIST("Tracks/hEffRec"), + particle.pt(), particle.phi(), particle.eta(), + mcCollision.posZ(), crec, occrec); + } + } else { + if constexpr (has_reco_cent) { + qaregistry.fill(HIST("Tracks/Centrality/hEffFake"), + track.pt(), track.phi(), track.eta(), + mcCollision.posZ(), crec, occrec); + } else { + qaregistry.fill(HIST("Tracks/hEffFake"), + track.pt(), track.phi(), track.eta(), + mcCollision.posZ(), crec, occrec); + } + } + } + } + } + + void processEfficiencyInclusive(soa::Join const& collisions, aod::McCollisions const& mccollisions, FiltParticles const& particles, FiltMcMftTracks const& tracks) + { + processEfficiency(collisions, mccollisions, particles, tracks); + } + + PROCESS_SWITCH(DndetaMFTPbPb, processEfficiencyInclusive, "Process efficiencies (inclusive)", false); + + void processEfficiencyCentFT0C(soa::Join const& collisions, aod::McCollisions const& mccollisions, FiltParticles const& particles, FiltMcMftTracks const& tracks) + { + processEfficiency(collisions, mccollisions, particles, tracks); + } + + PROCESS_SWITCH(DndetaMFTPbPb, processEfficiencyCentFT0C, "Process efficiencies in FT0C centrality bins", false); + + /// @brief process function to check ambiguous tracks + template + void processCheckAmbiguousMftTracks(typename C::iterator const& collision, allC const& allcollisions, MftTracksWColls const& tracks) + { + auto occ = getOccupancy(collision, cfgOccEstimator); + float c = getRecoCent(collision); + + bool ambTrk = false; + int typeAmbTrk = 0; + for (auto const& track : tracks) { + if constexpr (has_reco_cent) { + qaregistry.fill(HIST("Tracks/Centrality/hMftTracksAmbDegree"), track.compatibleCollIds().size(), c, occ); + } else { + qaregistry.fill(HIST("Tracks/hMftTracksAmbDegree"), track.compatibleCollIds().size(), occ); + } + if (track.compatibleCollIds().size() > 0) { + if (track.compatibleCollIds().size() == 1) { + if (track.collisionId() != track.compatibleCollIds()[0]) { + ambTrk = true; + typeAmbTrk = 2; + } else { + typeAmbTrk = 1; + } } else { - qaregistry.fill(HIST("Tracks/hPtEffBestFakeRec"), itrack.pt()); + ambTrk = true; + typeAmbTrk = 3; + + for (const auto& collIdx : track.compatibleCollIds()) { + auto ambColl = allcollisions.rawIteratorAt(collIdx); + qaregistry.fill(HIST("Tracks/histAmbZvtx"), ambColl.posZ()); + } } } } + + if (ambTrk) { + if constexpr (has_reco_cent) { + qaregistry.fill(HIST("Tracks/Centrality/hAmbTrackType"), typeAmbTrk, c, occ); + } else { + qaregistry.fill(HIST("Tracks/hAmbTrackType"), typeAmbTrk, occ); + } + } else { + if constexpr (has_reco_cent) { + qaregistry.fill(HIST("Tracks/Centrality/hAmbTrackType"), typeAmbTrk, c, occ); + } else { + qaregistry.fill(HIST("Tracks/hAmbTrackType"), typeAmbTrk, occ); + } + } } - /// @brief process function to calculate tracking efficiency (inclusive, based - /// on BestCollisionsFwd) - void processTrkEffBestInclusive( - soa::Join::iterator const& collision, - aod::McCollisions const& mccollisions, FiltParticles const& particles, - FiltMcMftTracks const& tracks, - soa::SmallGroups const& besttracks) + void processCheckAmbiguousMftTracksInclusive(Colls::iterator const& collision, Colls const& allcollisions, MftTracksWColls const& track) { - processTrkEffBest(collision, mccollisions, - particles, tracks, besttracks); + processCheckAmbiguousMftTracks(collision, allcollisions, track); } - PROCESS_SWITCH(DndetaMFTPbPb, processTrkEffBestInclusive, - "Process tracking efficiency (inclusive, based on BestCollisionsFwd)", - false); - - /// @brief process function to calculate tracking efficiency (in FT0 bins, - /// based on BestCollisionsFwd) - void processTrkEffBestCent( - soa::Join::iterator const& collision, - aod::McCollisions const& mccollisions, FiltParticles const& particles, - FiltMcMftTracks const& tracks, - soa::SmallGroups const& besttracks) + PROCESS_SWITCH(DndetaMFTPbPb, processCheckAmbiguousMftTracksInclusive, "Process checks for Ambiguous MFT tracks (inclusive)", false); + + void processCheckAmbiguousMftTracksCentFT0C(CollsCentFT0C::iterator const& collision, CollsCentFT0C const& allcollisions, MftTracksWColls const& track) { - processTrkEffBest( - collision, mccollisions, particles, tracks, besttracks); + processCheckAmbiguousMftTracks(collision, allcollisions, track); } - PROCESS_SWITCH(DndetaMFTPbPb, processTrkEffBestCent, - "Process tracking efficiency (in FT0 bins, based on BestCollisionsFwd)", - false); + PROCESS_SWITCH(DndetaMFTPbPb, processCheckAmbiguousMftTracksCentFT0C, "Process checks for Ambiguous MFT tracks (in FT0C centrality bins)", false); Preslice filtTrkperCol = o2::aod::fwdtrack::collisionId; /// @brief process template function for MC QA checks template - void processMcQA( - typename soa::SmallGroups> const& collisions, - aod::McCollisions const& mcCollisions, - FiltParticles const& /*particles*/, MFTTracksLabeled const& tracks, - aod::AmbiguousMFTTracks const& atracks) + void processMcQA(typename soa::Join const& collisions, MFTTracksLabeled const& tracks, aod::AmbiguousMFTTracks const& atracks, aod::McCollisions const& mcCollisions, FiltParticles const& /*particles*/) { for (const auto& collision : collisions) { - float crec = -1; - if constexpr (C::template contains()) { - crec = collision.centFT0C(); - qaregistry.fill( - HIST("Events/Centrality/hRecPerGenColls"), - static_cast(collisions.size()) / mcCollisions.size(), crec); + float crec = getRecoCent(collision); + auto occrec = getOccupancy(collision, cfgOccEstimator); + + if constexpr (has_reco_cent) { + qaregistry.fill(HIST("Events/Centrality/hRecPerGenColls"), static_cast(collisions.size()) / mcCollisions.size(), crec, occrec); } else { - qaregistry.fill(HIST("Events/hRecPerGenColls"), - static_cast(collisions.size()) / - mcCollisions.size()); + qaregistry.fill(HIST("Events/hRecPerGenColls"), static_cast(collisions.size()) / mcCollisions.size(), occrec); } if (!isGoodEvent(collision)) { @@ -1462,42 +1594,37 @@ struct DndetaMFTPbPb { } } } - if constexpr (C::template contains()) { - qaregistry.fill(HIST("Tracks/Centrality/hNmftTrks"), ntracks, crec); + if constexpr (has_reco_cent) { + qaregistry.fill(HIST("Tracks/Centrality/hNmftTrks"), ntracks, crec, occrec); qaregistry.fill(HIST("Tracks/Centrality/hFracAmbiguousMftTrks"), - static_cast(nAtracks) / ntracks, crec); + static_cast(nAtracks) / ntracks, crec, occrec); } else { - qaregistry.fill(HIST("Tracks/hNmftTrks"), ntracks); + qaregistry.fill(HIST("Tracks/hNmftTrks"), ntracks, occrec); qaregistry.fill(HIST("Tracks/hFracAmbiguousMftTrks"), - static_cast(nAtracks) / ntracks); + static_cast(nAtracks) / ntracks, occrec); } } } - /// @brief process function for QA checks (inclusive) void processMcQAInclusive( - soa::SmallGroups> const& collisions, - aod::McCollisions const& mcCollisions, FiltParticles const& particles, - MFTTracksLabeled const& tracks, aod::AmbiguousMFTTracks const& atracks) + soa::Join const& collisions, + MFTTracksLabeled const& tracks, aod::AmbiguousMFTTracks const& atracks, + aod::McCollisions const& mcCollisions, FiltParticles const& particles) { - processMcQA(collisions, mcCollisions, particles, tracks, atracks); + processMcQA(collisions, tracks, atracks, mcCollisions, particles); } - PROCESS_SWITCH(DndetaMFTPbPb, processMcQAInclusive, - "Process MC QA checks (inclusive)", false); + PROCESS_SWITCH(DndetaMFTPbPb, processMcQAInclusive, "Process MC QA checks (inclusive)", false); - /// @brief process function for QA checks (in FT0 bins) - void processMcQACent( - soa::SmallGroups> const& collisions, - aod::McCollisions const& mcCollisions, FiltParticles const& particles, - MFTTracksLabeled const& tracks, aod::AmbiguousMFTTracks const& atracks) + void processMcQACentFT0C( + soa::Join const& collisions, + MFTTracksLabeled const& tracks, aod::AmbiguousMFTTracks const& atracks, + aod::McCollisions const& mcCollisions, FiltParticles const& particles) { - processMcQA(collisions, mcCollisions, particles, tracks, - atracks); + processMcQA(collisions, tracks, atracks, mcCollisions, particles); } - PROCESS_SWITCH(DndetaMFTPbPb, processMcQACent, - "Process MC QA checks (in FT0 bins)", false); + PROCESS_SWITCH(DndetaMFTPbPb, processMcQACentFT0C, "Process MC QA checks (in FT0 centrality bins)", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From a85ac25224a229fa3cafc194bd5054d1f1117066 Mon Sep 17 00:00:00 2001 From: Francesca Ercolessi Date: Thu, 13 Feb 2025 18:01:16 +0100 Subject: [PATCH 0204/1650] [PWGLF] nuclei-proton correlation, avoid autocorrelations (#9955) --- .../Tasks/Nuspex/hadronnucleicorrelation.cxx | 43 +++++++++++-------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx b/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx index 82dc61f4701..4bfb99b0e3d 100644 --- a/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx +++ b/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx @@ -61,6 +61,7 @@ struct hadronnucleicorrelation { Configurable isMC{"isMC", false, "is MC"}; Configurable isMCGen{"isMCGen", false, "is isMCGen"}; Configurable isPrim{"isPrim", true, "is isPrim"}; + Configurable domatterGen{"domatterGen", true, "domatterGen"}; Configurable mcCorrelation{"mcCorrelation", false, "true: build the correlation function only for SE"}; Configurable docorrection{"docorrection", false, "do efficiency correction"}; @@ -1303,10 +1304,14 @@ struct hadronnucleicorrelation { selectedparticlesMC_antid[particle.mcCollisionId()].push_back(std::make_shared(particle)); } if (particle.pdgCode() == pdgProton) { - selectedparticlesMC_p[particle.mcCollisionId()].push_back(std::make_shared(particle)); + if (!particle.has_daughters()) { + selectedparticlesMC_p[particle.mcCollisionId()].push_back(std::make_shared(particle)); + } } if (particle.pdgCode() == -pdgProton) { - selectedparticlesMC_antip[particle.mcCollisionId()].push_back(std::make_shared(particle)); + if (!particle.has_daughters()) { + selectedparticlesMC_antip[particle.mcCollisionId()].push_back(std::make_shared(particle)); + } } } @@ -1341,28 +1346,30 @@ struct hadronnucleicorrelation { } // d - p correlation - if (selectedparticlesMC_d.find(collision1.globalIndex()) != selectedparticlesMC_d.end()) { - if (selectedparticlesMC_p.find(collision1.globalIndex()) != selectedparticlesMC_p.end()) { - mixMCParticles<0>(selectedparticlesMC_d[collision1.globalIndex()], selectedparticlesMC_p[collision1.globalIndex()]); // mixing SE - } + if (domatterGen) { + if (selectedparticlesMC_d.find(collision1.globalIndex()) != selectedparticlesMC_d.end()) { + if (selectedparticlesMC_p.find(collision1.globalIndex()) != selectedparticlesMC_p.end()) { + mixMCParticles<0>(selectedparticlesMC_d[collision1.globalIndex()], selectedparticlesMC_p[collision1.globalIndex()]); // mixing SE + } - int stop2 = 0; + int stop2 = 0; - for (auto collision2 : mcCollisions) { // nested loop on collisions + for (auto collision2 : mcCollisions) { // nested loop on collisions - if (collision1.globalIndex() == collision2.globalIndex()) { - continue; - } + if (collision1.globalIndex() == collision2.globalIndex()) { + continue; + } - if (stop2 > maxmixcollsGen) { - break; - } + if (stop2 > maxmixcollsGen) { + break; + } - if (selectedparticlesMC_p.find(collision2.globalIndex()) != selectedparticlesMC_p.end()) { - mixMCParticles<1>(selectedparticlesMC_d[collision1.globalIndex()], selectedparticlesMC_p[collision2.globalIndex()]); // mixing ME - } + if (selectedparticlesMC_p.find(collision2.globalIndex()) != selectedparticlesMC_p.end()) { + mixMCParticles<1>(selectedparticlesMC_d[collision1.globalIndex()], selectedparticlesMC_p[collision2.globalIndex()]); // mixing ME + } - stop2++; + stop2++; + } } } } From f0bbd61b12cfef4b5c59095a1f2cd206d110e122 Mon Sep 17 00:00:00 2001 From: Nasir Mehdi Malik <89008506+nasirmehdimalik@users.noreply.github.com> Date: Thu, 13 Feb 2025 22:34:35 +0530 Subject: [PATCH 0205/1650] [PWGLF] Fixed incorrect occupancy filling logic (#9946) --- PWGLF/TableProducer/Resonances/LFResonanceMergeDF.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PWGLF/TableProducer/Resonances/LFResonanceMergeDF.cxx b/PWGLF/TableProducer/Resonances/LFResonanceMergeDF.cxx index 42d81664a0c..97013ea7d44 100644 --- a/PWGLF/TableProducer/Resonances/LFResonanceMergeDF.cxx +++ b/PWGLF/TableProducer/Resonances/LFResonanceMergeDF.cxx @@ -88,7 +88,7 @@ struct reso2dfmerged { Produces reso2trksdf; int df = 0; - std::vector> vecOfTuples; + std::vector> vecOfTuples; std::vector(tuple)); - resoCollisionsdf(0, std::get<0>(tuple), std::get<1>(tuple), std::get<2>(tuple), std::get<3>(tuple), std::get<4>(tuple), std::get<5>(tuple), 0., 0., 0., 0., 0, collision.trackOccupancyInTimeRange()); + resoCollisionsdf(0, std::get<0>(tuple), std::get<1>(tuple), std::get<2>(tuple), std::get<3>(tuple), std::get<4>(tuple), std::get<5>(tuple), 0., 0., 0., 0., 0, std::get<6>(tuple)); // LOGF(info, "collisions: Index = %d ) %f - %f - %f %f %d -- %d", std::get<0>(tuple).globalIndex(),std::get<1>(tuple),std::get<2>(tuple), std::get<3>(tuple), std::get<4>(tuple), std::get<5>(tuple).size(),resoCollisionsdf.lastIndex()); for (const auto& tuple : innerVector) { From bd92b4a0c6c578f14b3bae1078a95f54b9669328 Mon Sep 17 00:00:00 2001 From: Maxim Virta <84773378+MaximVirta@users.noreply.github.com> Date: Thu, 13 Feb 2025 20:16:56 +0200 Subject: [PATCH 0206/1650] [PWGCF] SPC computation fixed & correlators reset (#9947) Co-authored-by: ALICE Action Bot --- PWGCF/JCorran/Core/FlowJSPCAnalysis.cxx | 67 +++++++++++++------------ 1 file changed, 35 insertions(+), 32 deletions(-) diff --git a/PWGCF/JCorran/Core/FlowJSPCAnalysis.cxx b/PWGCF/JCorran/Core/FlowJSPCAnalysis.cxx index 2a071f90717..1ce55de4f34 100644 --- a/PWGCF/JCorran/Core/FlowJSPCAnalysis.cxx +++ b/PWGCF/JCorran/Core/FlowJSPCAnalysis.cxx @@ -83,6 +83,9 @@ void FlowJSPCAnalysis::calculateCorrelators(const int fCentBin) double correlationDenom; double weightCorrelationDenom; + for (int i = 0; i < 14; ++i) + fCorrelDenoms[i] = 0; + for (int j = 0; j < 12; j++) { if (fHarmosArray[j][0] == 0) { continue; @@ -126,66 +129,66 @@ void FlowJSPCAnalysis::fillHistograms(const int fCentBin, int ind, double cNum, case 0: { mHistRegistry->fill(HIST(MCentClasses[0]) + HIST("fResults"), 2. * static_cast(ind) + 0.5, cNum, wNum); mHistRegistry->fill(HIST(MCentClasses[0]) + HIST("fResults"), 2. * static_cast(ind) + 1.5, cDenom, wDenom); - mHistRegistry->fill(HIST(MCentClasses[0]) + HIST("fCovResults"), 2. * static_cast(ind) + 0.5, cNum * cDenom, wNum * wDenom); - mHistRegistry->fill(HIST(MCentClasses[0]) + HIST("fCovResults"), 2. * static_cast(ind) + 1.5, wNum * wDenom, 1.); - mHistRegistry->fill(HIST(MCentClasses[0]) + HIST("fCovResults"), 2. * static_cast(ind) + 2.5, wNum, 1.); - mHistRegistry->fill(HIST(MCentClasses[0]) + HIST("fCovResults"), 2. * static_cast(ind) + 3.5, wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[0]) + HIST("fCovResults"), 4. * static_cast(ind) + 0.5, cNum * cDenom, wNum * wDenom); + mHistRegistry->fill(HIST(MCentClasses[0]) + HIST("fCovResults"), 4. * static_cast(ind) + 1.5, wNum * wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[0]) + HIST("fCovResults"), 4. * static_cast(ind) + 2.5, wNum, 1.); + mHistRegistry->fill(HIST(MCentClasses[0]) + HIST("fCovResults"), 4. * static_cast(ind) + 3.5, wDenom, 1.); } break; case 1: { mHistRegistry->fill(HIST(MCentClasses[1]) + HIST("fResults"), 2. * static_cast(ind) + 0.5, cNum, wNum); mHistRegistry->fill(HIST(MCentClasses[1]) + HIST("fResults"), 2. * static_cast(ind) + 1.5, cDenom, wDenom); - mHistRegistry->fill(HIST(MCentClasses[1]) + HIST("fCovResults"), 2. * static_cast(ind) + 0.5, cNum * cDenom, wNum * wDenom); - mHistRegistry->fill(HIST(MCentClasses[1]) + HIST("fCovResults"), 2. * static_cast(ind) + 1.5, wNum * wDenom, 1.); - mHistRegistry->fill(HIST(MCentClasses[1]) + HIST("fCovResults"), 2. * static_cast(ind) + 2.5, wNum, 1.); - mHistRegistry->fill(HIST(MCentClasses[1]) + HIST("fCovResults"), 2. * static_cast(ind) + 3.5, wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[1]) + HIST("fCovResults"), 4. * static_cast(ind) + 0.5, cNum * cDenom, wNum * wDenom); + mHistRegistry->fill(HIST(MCentClasses[1]) + HIST("fCovResults"), 4. * static_cast(ind) + 1.5, wNum * wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[1]) + HIST("fCovResults"), 4. * static_cast(ind) + 2.5, wNum, 1.); + mHistRegistry->fill(HIST(MCentClasses[1]) + HIST("fCovResults"), 4. * static_cast(ind) + 3.5, wDenom, 1.); } break; case 2: { mHistRegistry->fill(HIST(MCentClasses[2]) + HIST("fResults"), 2. * static_cast(ind) + 0.5, cNum, wNum); mHistRegistry->fill(HIST(MCentClasses[2]) + HIST("fResults"), 2. * static_cast(ind) + 1.5, cDenom, wDenom); - mHistRegistry->fill(HIST(MCentClasses[2]) + HIST("fCovResults"), 2. * static_cast(ind) + 0.5, cNum * cDenom, wNum * wDenom); - mHistRegistry->fill(HIST(MCentClasses[2]) + HIST("fCovResults"), 2. * static_cast(ind) + 1.5, wNum * wDenom, 1.); - mHistRegistry->fill(HIST(MCentClasses[2]) + HIST("fCovResults"), 2. * static_cast(ind) + 2.5, wNum, 1.); - mHistRegistry->fill(HIST(MCentClasses[2]) + HIST("fCovResults"), 2. * static_cast(ind) + 3.5, wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[2]) + HIST("fCovResults"), 4. * static_cast(ind) + 0.5, cNum * cDenom, wNum * wDenom); + mHistRegistry->fill(HIST(MCentClasses[2]) + HIST("fCovResults"), 4. * static_cast(ind) + 1.5, wNum * wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[2]) + HIST("fCovResults"), 4. * static_cast(ind) + 2.5, wNum, 1.); + mHistRegistry->fill(HIST(MCentClasses[2]) + HIST("fCovResults"), 4. * static_cast(ind) + 3.5, wDenom, 1.); } break; case 3: { mHistRegistry->fill(HIST(MCentClasses[3]) + HIST("fResults"), 2. * static_cast(ind) + 0.5, cNum, wNum); mHistRegistry->fill(HIST(MCentClasses[3]) + HIST("fResults"), 2. * static_cast(ind) + 1.5, cDenom, wDenom); - mHistRegistry->fill(HIST(MCentClasses[3]) + HIST("fCovResults"), 2. * static_cast(ind) + 0.5, cNum * cDenom, wNum * wDenom); - mHistRegistry->fill(HIST(MCentClasses[3]) + HIST("fCovResults"), 2. * static_cast(ind) + 1.5, wNum * wDenom, 1.); - mHistRegistry->fill(HIST(MCentClasses[3]) + HIST("fCovResults"), 2. * static_cast(ind) + 2.5, wNum, 1.); - mHistRegistry->fill(HIST(MCentClasses[3]) + HIST("fCovResults"), 2. * static_cast(ind) + 3.5, wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[3]) + HIST("fCovResults"), 4. * static_cast(ind) + 0.5, cNum * cDenom, wNum * wDenom); + mHistRegistry->fill(HIST(MCentClasses[3]) + HIST("fCovResults"), 4. * static_cast(ind) + 1.5, wNum * wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[3]) + HIST("fCovResults"), 4. * static_cast(ind) + 2.5, wNum, 1.); + mHistRegistry->fill(HIST(MCentClasses[3]) + HIST("fCovResults"), 4. * static_cast(ind) + 3.5, wDenom, 1.); } break; case 4: { mHistRegistry->fill(HIST(MCentClasses[4]) + HIST("fResults"), 2. * static_cast(ind) + 0.5, cNum, wNum); mHistRegistry->fill(HIST(MCentClasses[4]) + HIST("fResults"), 2. * static_cast(ind) + 1.5, cDenom, wDenom); - mHistRegistry->fill(HIST(MCentClasses[4]) + HIST("fCovResults"), 2. * static_cast(ind) + 0.5, cNum * cDenom, wNum * wDenom); - mHistRegistry->fill(HIST(MCentClasses[4]) + HIST("fCovResults"), 2. * static_cast(ind) + 1.5, wNum * wDenom, 1.); - mHistRegistry->fill(HIST(MCentClasses[4]) + HIST("fCovResults"), 2. * static_cast(ind) + 2.5, wNum, 1.); - mHistRegistry->fill(HIST(MCentClasses[4]) + HIST("fCovResults"), 2. * static_cast(ind) + 3.5, wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[4]) + HIST("fCovResults"), 4. * static_cast(ind) + 0.5, cNum * cDenom, wNum * wDenom); + mHistRegistry->fill(HIST(MCentClasses[4]) + HIST("fCovResults"), 4. * static_cast(ind) + 1.5, wNum * wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[4]) + HIST("fCovResults"), 4. * static_cast(ind) + 2.5, wNum, 1.); + mHistRegistry->fill(HIST(MCentClasses[4]) + HIST("fCovResults"), 4. * static_cast(ind) + 3.5, wDenom, 1.); } break; case 5: { mHistRegistry->fill(HIST(MCentClasses[5]) + HIST("fResults"), 2. * static_cast(ind) + 0.5, cNum, wNum); mHistRegistry->fill(HIST(MCentClasses[5]) + HIST("fResults"), 2. * static_cast(ind) + 1.5, cDenom, wDenom); - mHistRegistry->fill(HIST(MCentClasses[5]) + HIST("fCovResults"), 2. * static_cast(ind) + 0.5, cNum * cDenom, wNum * wDenom); - mHistRegistry->fill(HIST(MCentClasses[5]) + HIST("fCovResults"), 2. * static_cast(ind) + 1.5, wNum * wDenom, 1.); - mHistRegistry->fill(HIST(MCentClasses[5]) + HIST("fCovResults"), 2. * static_cast(ind) + 2.5, wNum, 1.); - mHistRegistry->fill(HIST(MCentClasses[5]) + HIST("fCovResults"), 2. * static_cast(ind) + 3.5, wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[5]) + HIST("fCovResults"), 4. * static_cast(ind) + 0.5, cNum * cDenom, wNum * wDenom); + mHistRegistry->fill(HIST(MCentClasses[5]) + HIST("fCovResults"), 4. * static_cast(ind) + 1.5, wNum * wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[5]) + HIST("fCovResults"), 4. * static_cast(ind) + 2.5, wNum, 1.); + mHistRegistry->fill(HIST(MCentClasses[5]) + HIST("fCovResults"), 4. * static_cast(ind) + 3.5, wDenom, 1.); } break; case 6: { mHistRegistry->fill(HIST(MCentClasses[6]) + HIST("fResults"), 2. * static_cast(ind) + 0.5, cNum, wNum); mHistRegistry->fill(HIST(MCentClasses[6]) + HIST("fResults"), 2. * static_cast(ind) + 1.5, cDenom, wDenom); - mHistRegistry->fill(HIST(MCentClasses[6]) + HIST("fCovResults"), 2. * static_cast(ind) + 0.5, cNum * cDenom, wNum * wDenom); - mHistRegistry->fill(HIST(MCentClasses[6]) + HIST("fCovResults"), 2. * static_cast(ind) + 1.5, wNum * wDenom, 1.); - mHistRegistry->fill(HIST(MCentClasses[6]) + HIST("fCovResults"), 2. * static_cast(ind) + 2.5, wNum, 1.); - mHistRegistry->fill(HIST(MCentClasses[6]) + HIST("fCovResults"), 2. * static_cast(ind) + 3.5, wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[6]) + HIST("fCovResults"), 4. * static_cast(ind) + 0.5, cNum * cDenom, wNum * wDenom); + mHistRegistry->fill(HIST(MCentClasses[6]) + HIST("fCovResults"), 4. * static_cast(ind) + 1.5, wNum * wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[6]) + HIST("fCovResults"), 4. * static_cast(ind) + 2.5, wNum, 1.); + mHistRegistry->fill(HIST(MCentClasses[6]) + HIST("fCovResults"), 4. * static_cast(ind) + 3.5, wDenom, 1.); } break; case 7: { mHistRegistry->fill(HIST(MCentClasses[7]) + HIST("fResults"), 2. * static_cast(ind) + 0.5, cNum, wNum); mHistRegistry->fill(HIST(MCentClasses[7]) + HIST("fResults"), 2. * static_cast(ind) + 1.5, cDenom, wDenom); - mHistRegistry->fill(HIST(MCentClasses[7]) + HIST("fCovResults"), 2. * static_cast(ind) + 0.5, cNum * cDenom, wNum * wDenom); - mHistRegistry->fill(HIST(MCentClasses[7]) + HIST("fCovResults"), 2. * static_cast(ind) + 1.5, wNum * wDenom, 1.); - mHistRegistry->fill(HIST(MCentClasses[7]) + HIST("fCovResults"), 2. * static_cast(ind) + 2.5, wNum, 1.); - mHistRegistry->fill(HIST(MCentClasses[7]) + HIST("fCovResults"), 2. * static_cast(ind) + 3.5, wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[7]) + HIST("fCovResults"), 4. * static_cast(ind) + 0.5, cNum * cDenom, wNum * wDenom); + mHistRegistry->fill(HIST(MCentClasses[7]) + HIST("fCovResults"), 4. * static_cast(ind) + 1.5, wNum * wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[7]) + HIST("fCovResults"), 4. * static_cast(ind) + 2.5, wNum, 1.); + mHistRegistry->fill(HIST(MCentClasses[7]) + HIST("fCovResults"), 4. * static_cast(ind) + 3.5, wDenom, 1.); } break; default: return; From f9e641981f9e487f045f56225e84d7ec90fb0e67 Mon Sep 17 00:00:00 2001 From: Stefano Cannito <143754257+scannito@users.noreply.github.com> Date: Thu, 13 Feb 2025 19:33:59 +0100 Subject: [PATCH 0207/1650] [PWGLF] Study of phi purity in pt bins (#9957) --- .../Tasks/Strangeness/phik0shortanalysis.cxx | 243 +++++++++++------- 1 file changed, 147 insertions(+), 96 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx index 3a79d270a19..c1e19675ca2 100644 --- a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx @@ -57,18 +57,18 @@ struct Phik0shortanalysis { // Histograms are defined with HistogramRegistry HistogramRegistry dataEventHist{"dataEventHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry mcEventHist{"mcEventHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; - HistogramRegistry candPhiHist{"candPhiHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; - HistogramRegistry candK0SHist{"candK0SHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry dataPhiHist{"dataPhiHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry mcPhiHist{"mcPhiHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry closureMCPhiHist{"closureMCPhiHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry dataK0SHist{"dataK0SHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry mcK0SHist{"mcK0SHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry dataPhiK0SHist{"dataPhiK0SHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry mcPhiK0SHist{"mcPhiK0SHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry closureMCPhiK0SHist{"closureMCPhiK0SHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry dataPionHist{"dataPionHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry mcPionHist{"mcPionHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry dataPhiPionHist{"dataPhiPionHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry mcPhiPionHist{"mcPhiPionHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; - HistogramRegistry mcPhiHist{"mcPhiHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; - HistogramRegistry mcK0SHist{"mcK0SHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; - HistogramRegistry mcPionHist{"mcPionHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; - HistogramRegistry closureMCPhiHist{"closureMCPhiHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; - HistogramRegistry closureMCPhiK0SHist{"closureMCPhiK0SHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry closureMCPhiPionHist{"closureMCPhiPionHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; // Configurable for event selection @@ -77,6 +77,29 @@ struct Phik0shortanalysis { // Configurable on multiplicity bins Configurable> binsMult{"binsMult", {0.0, 1.0, 5.0, 10.0, 15.0, 20.0, 30.0, 40.0, 50.0, 70.0, 100.0}, "Multiplicity bin limits"}; + // Configurables on phi pT bins + Configurable> binspTPhi{"binspTPhi", {0.4, 0.8, 1.4, 2.0, 2.8, 4.0, 6.0, 10.0}, "pT bin limits for Phi"}; + + // Configurables on phi mass + Configurable nBinsMPhi{"nBinsMPhi", 13, "N bins in cfgmassPhiaxis"}; + Configurable lowMPhi{"lowMPhi", 1.0095, "Upper limits on Phi mass for signal extraction"}; + Configurable upMPhi{"upMPhi", 1.029, "Upper limits on Phi mass for signal extraction"}; + + // Configurables for Phi selection + Configurable cfgCutCharge{"cfgCutCharge", 0.0, "Cut on charge"}; + Configurable cfgPrimaryTrack{"cfgPrimaryTrack", false, "Primary track selection"}; + Configurable cfgGlobalWoDCATrack{"cfgGlobalWoDCATrack", true, "Global track selection without DCA"}; + Configurable cfgPVContributor{"cfgPVContributor", true, "PV contributor track selection"}; + Configurable cMinKaonPtcut{"cMinKaonPtcut", 0.15f, "Track minimum pt cut"}; + Configurable cMaxDCAzToPVcut{"cMaxDCAzToPVcut", 2.0f, "Track DCAz cut to PV Maximum"}; + Configurable cMaxDCArToPV1{"cMaxDCArToPV1", 0.004f, "Track DCAr cut to PV config 1"}; + Configurable cMaxDCArToPV2{"cMaxDCArToPV2", 0.013f, "Track DCAr cut to PV config 2"}; + Configurable cMaxDCArToPV3{"cMaxDCArToPV3", 1.0f, "Track DCAr cut to PV config 3"}; + + Configurable isNoTOF{"isNoTOF", false, "isNoTOF"}; + Configurable nSigmaCutTPCKa{"nSigmaCutTPCKa", 3.0, "Value of the TPC Nsigma cut for Kaons"}; + Configurable nSigmaCutCombinedKa{"nSigmaCutCombinedKa", 3.0, "Value of the TOF Nsigma cut for Kaons"}; + // Configurables for V0 selection Configurable minTPCnClsFound{"minTPCnClsFound", 70, "min number of found TPC clusters"}; Configurable minNCrossedRowsTPC{"minNCrossedRowsTPC", 80, "min number of TPC crossed rows"}; @@ -102,27 +125,7 @@ struct Phik0shortanalysis { Configurable upMK0S{"upMK0S", 0.52, "Upper limit on K0Short mass"}; // Configurable on K0S pT bins - Configurable> binspTK0S{"binspTK0S", {0.0, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0}, "pT bin limits for K0S"}; - - // Configurables on Phi mass - Configurable nBinsMPhi{"nBinsMPhi", 13, "N bins in cfgmassPhiaxis"}; - Configurable lowMPhi{"lowMPhi", 1.0095, "Upper limits on Phi mass for signal extraction"}; - Configurable upMPhi{"upMPhi", 1.029, "Upper limits on Phi mass for signal extraction"}; - - // Configurables for phi selection - Configurable cfgCutCharge{"cfgCutCharge", 0.0, "Cut on charge"}; - Configurable cfgPrimaryTrack{"cfgPrimaryTrack", false, "Primary track selection"}; - Configurable cfgGlobalWoDCATrack{"cfgGlobalWoDCATrack", true, "Global track selection without DCA"}; - Configurable cfgPVContributor{"cfgPVContributor", true, "PV contributor track selection"}; - Configurable cMinKaonPtcut{"cMinKaonPtcut", 0.15f, "Track minimum pt cut"}; - Configurable cMaxDCAzToPVcut{"cMaxDCAzToPVcut", 2.0f, "Track DCAz cut to PV Maximum"}; - Configurable cMaxDCArToPV1{"cMaxDCArToPV1", 0.004f, "Track DCAr cut to PV config 1"}; - Configurable cMaxDCArToPV2{"cMaxDCArToPV2", 0.013f, "Track DCAr cut to PV config 2"}; - Configurable cMaxDCArToPV3{"cMaxDCArToPV3", 1.0f, "Track DCAr cut to PV config 3"}; - - Configurable isNoTOF{"isNoTOF", false, "isNoTOF"}; - Configurable nSigmaCutTPCKa{"nSigmaCutTPCKa", 3.0, "Value of the TPC Nsigma cut for Kaons"}; - Configurable nSigmaCutCombinedKa{"nSigmaCutCombinedKa", 3.0, "Value of the TOF Nsigma cut for Kaons"}; + Configurable> binspTK0S{"binspTK0S", {0.1, 0.8, 1.2, 1.6, 2.0, 2.5, 3.0, 4.0, 6.0}, "pT bin limits for K0S"}; // Configurables for pions selection(extra with respect to a few of those defined for V0) Configurable minITSnCls{"minITSnCls", 4, "min number of ITS clusters"}; @@ -203,6 +206,7 @@ struct Phik0shortanalysis { AxisSpec deltayAxis = {nBinsy, 0.0f, 1.6f, "|#it{#Deltay}|"}; AxisSpec multAxis = {120, 0.0f, 120.0f, "centFT0M"}; AxisSpec binnedmultAxis{(std::vector)binsMult, "centFT0M"}; + AxisSpec binnedpTPhiAxis{(std::vector)binspTPhi, "#it{p}_{T} (GeV/#it{c})"}; AxisSpec ptK0SAxis = {60, 0.0f, 6.0f, "#it{p}_{T} (GeV/#it{c})"}; AxisSpec binnedptK0SAxis{(std::vector)binspTK0S, "#it{p}_{T} (GeV/#it{c})"}; AxisSpec ptPiAxis = {30, 0.0f, 3.0f, "#it{p}_{T} (GeV/#it{c})"}; @@ -249,42 +253,49 @@ struct Phik0shortanalysis { mcEventHist.add("hGenMCVertexZ", "hGenMCVertexZ", kTH1F, {vertexZAxis}); mcEventHist.add("hGenMCMultiplicityPercent", "GenMC Multiplicity Percentile", kTH1F, {binnedmultAxis}); - // Phi tpological/PID cuts - candPhiHist.add("hDCAxyPreCut", "Dcaxy distribution vs pt before DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); - candPhiHist.add("hDCAzPreCut", "Dcaz distribution vs pt before DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); - candPhiHist.add("hDCAxyPostCut", "Dcaxy distribution vs pt after DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); - candPhiHist.add("hDCAzPostCut", "Dcaz distribution vs pt after DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); - candPhiHist.add("hEta", "Eta distribution", kTH1F, {{200, -1.0f, 1.0f}}); - candPhiHist.add("hNsigmaKaonTPC", "NsigmaKaon TPC distribution", kTH2F, {{100, 0.0, 5.0, "#it{p} (GeV/#it{c})"}, {100, -10.0f, 10.0f}}); - candPhiHist.add("hNsigmaKaonTOF", "NsigmaKaon TOF distribution", kTH2F, {{100, 0.0, 5.0, "#it{p} (GeV/#it{c})"}, {100, -10.0f, 10.0f}}); + // Phi topological/PID cuts + dataPhiHist.add("h2DauTracksPhiDCAxyPreCutData", "Dcaxy distribution vs pt before DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); + dataPhiHist.add("h2DauTracksPhiDCAzPreCutData", "Dcaz distribution vs pt before DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{z} (cm)"}}); + dataPhiHist.add("h2DauTracksPhiDCAxyPostCutData", "Dcaxy distribution vs pt after DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); + dataPhiHist.add("h2DauTracksPhiDCAzPostCutData", "Dcaz distribution vs pt after DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{z} (cm)"}}); - // K0S topological/PID cuts - candK0SHist.add("hDCAV0Daughters", "hDCAV0Daughters", kTH1F, {{55, 0.0f, 2.2f}}); - candK0SHist.add("hV0CosPA", "hV0CosPA", kTH1F, {{100, 0.95f, 1.f}}); - candK0SHist.add("hNSigmaPosPionFromK0S", "hNSigmaPosPionFromK0Short", kTH2F, {{100, 0.0, 5.0, "#it{p} (GeV/#it{c})"}, {100, -10.0f, 10.0f}}); - candK0SHist.add("hNSigmaNegPionFromK0S", "hNSigmaNegPionFromK0Short", kTH2F, {{100, 0.0, 5.0, "#it{p} (GeV/#it{c})"}, {100, -10.0f, 10.0f}}); + dataPhiHist.add("hEta", "Eta distribution", kTH1F, {{200, -1.0f, 1.0f}}); + dataPhiHist.add("hNsigmaKaonTPC", "NsigmaKaon TPC distribution", kTH2F, {{100, 0.0, 5.0, "#it{p} (GeV/#it{c})"}, {100, -10.0f, 10.0f}}); + dataPhiHist.add("hNsigmaKaonTOF", "NsigmaKaon TOF distribution", kTH2F, {{100, 0.0, 5.0, "#it{p} (GeV/#it{c})"}, {100, -10.0f, 10.0f}}); // Phi invariant mass for computing purities and normalisation - dataPhiHist.add("h2PhipurInvMass", "Invariant mass of Phi for Purity (no K0S/Pi)", kTH2F, {binnedmultAxis, massPhiAxis}); + dataPhiHist.add("h3PhipurInvMass", "Invariant mass of Phi for Purity (no K0S/Pi)", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); + + dataPhiHist.add("h3PhipurK0SInvMassInc", "Invariant mass of Phi for Purity (K0S) Inclusive", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); + dataPhiHist.add("h3PhipurK0SInvMassFCut", "Invariant mass of Phi for Purity (K0S) Deltay < FirstCut", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); + dataPhiHist.add("h3PhipurK0SInvMassSCut", "Invariant mass of Phi for Purity (K0S) Deltay < SecondCut", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); - dataPhiHist.add("h3PhipurK0SInvMassInc", "Invariant mass of Phi for Purity (K0S) Inclusive", kTH3F, {binnedmultAxis, binnedptK0SAxis, massPhiAxis}); - dataPhiHist.add("h3PhipurK0SInvMassFCut", "Invariant mass of Phi for Purity (K0S) Deltay < FirstCut", kTH3F, {binnedmultAxis, binnedptK0SAxis, massPhiAxis}); - dataPhiHist.add("h3PhipurK0SInvMassSCut", "Invariant mass of Phi for Purity (K0S) Deltay < SecondCut", kTH3F, {binnedmultAxis, binnedptK0SAxis, massPhiAxis}); + dataPhiHist.add("h3PhipurPiInvMassInc", "Invariant mass of Phi for Purity (Pi) Inclusive", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); + dataPhiHist.add("h3PhipurPiInvMassFCut", "Invariant mass of Phi for Purity (Pi) Deltay < FirstCut", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); + dataPhiHist.add("h3PhipurPiInvMassSCut", "Invariant mass of Phi for Purity (Pi) Deltay < SecondCut", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); - dataPhiHist.add("h3PhipurPiInvMassInc", "Invariant mass of Phi for Purity (Pi) Inclusive", kTH3F, {binnedmultAxis, binnedptPiAxis, massPhiAxis}); - dataPhiHist.add("h3PhipurPiInvMassFCut", "Invariant mass of Phi for Purity (Pi) Deltay < FirstCut", kTH3F, {binnedmultAxis, binnedptPiAxis, massPhiAxis}); - dataPhiHist.add("h3PhipurPiInvMassSCut", "Invariant mass of Phi for Purity (Pi) Deltay < SecondCut", kTH3F, {binnedmultAxis, binnedptPiAxis, massPhiAxis}); + // DCA plots for phi daughters in MCReco + mcPhiHist.add("h2DauTracksPhiDCAxyPreCutMCReco", "Dcaxy distribution vs pt before DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); + mcPhiHist.add("h2DauTracksPhiDCAzPreCutMCReco", "Dcaz distribution vs pt before DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{z} (cm)"}}); + mcPhiHist.add("h2DauTracksPhiDCAxyPostCutMCReco", "Dcaxy distribution vs pt after DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); + mcPhiHist.add("h2DauTracksPhiDCAzPostCutMCReco", "Dcaz distribution vs pt after DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{z} (cm)"}}); // MCPhi invariant mass for computing purities - closureMCPhiHist.add("h2MCPhipurInvMass", "Invariant mass of Phi for Purity (no K0S/Pi)", kTH2F, {binnedmultAxis, massPhiAxis}); + closureMCPhiHist.add("h3MCPhipurInvMass", "Invariant mass of Phi for Purity (no K0S/Pi)", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); - closureMCPhiHist.add("h3MCPhipurK0SInvMassInc", "Invariant mass of Phi for Purity (K0S) Inclusive", kTH3F, {binnedmultAxis, binnedptK0SAxis, massPhiAxis}); - closureMCPhiHist.add("h3MCPhipurK0SInvMassFCut", "Invariant mass of Phi for Purity (K0S) Deltay < FirstCut", kTH3F, {binnedmultAxis, binnedptK0SAxis, massPhiAxis}); - closureMCPhiHist.add("h3MCPhipurK0SInvMassSCut", "Invariant mass of Phi for Purity (K0S) Deltay < SecondCut", kTH3F, {binnedmultAxis, binnedptK0SAxis, massPhiAxis}); + closureMCPhiHist.add("h3MCPhipurK0SInvMassInc", "Invariant mass of Phi for Purity (K0S) Inclusive", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); + closureMCPhiHist.add("h3MCPhipurK0SInvMassFCut", "Invariant mass of Phi for Purity (K0S) Deltay < FirstCut", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); + closureMCPhiHist.add("h3MCPhipurK0SInvMassSCut", "Invariant mass of Phi for Purity (K0S) Deltay < SecondCut", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); - closureMCPhiHist.add("h3MCPhipurPiInvMassInc", "Invariant mass of Phi for Purity (Pi) Inclusive", kTH3F, {binnedmultAxis, binnedptPiAxis, massPhiAxis}); - closureMCPhiHist.add("h3MCPhipurPiInvMassFCut", "Invariant mass of Phi for Purity (Pi) Deltay < FirstCut", kTH3F, {binnedmultAxis, binnedptPiAxis, massPhiAxis}); - closureMCPhiHist.add("h3MCPhipurPiInvMassSCut", "Invariant mass of Phi for Purity (Pi) Deltay < SecondCut", kTH3F, {binnedmultAxis, binnedptPiAxis, massPhiAxis}); + closureMCPhiHist.add("h3MCPhipurPiInvMassInc", "Invariant mass of Phi for Purity (Pi) Inclusive", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); + closureMCPhiHist.add("h3MCPhipurPiInvMassFCut", "Invariant mass of Phi for Purity (Pi) Deltay < FirstCut", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); + closureMCPhiHist.add("h3MCPhipurPiInvMassSCut", "Invariant mass of Phi for Purity (Pi) Deltay < SecondCut", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); + + // K0S topological/PID cuts + dataK0SHist.add("hDCAV0Daughters", "hDCAV0Daughters", kTH1F, {{55, 0.0f, 2.2f}}); + dataK0SHist.add("hV0CosPA", "hV0CosPA", kTH1F, {{100, 0.95f, 1.f}}); + dataK0SHist.add("hNSigmaPosPionFromK0S", "hNSigmaPosPionFromK0Short", kTH2F, {{100, 0.0, 5.0, "#it{p} (GeV/#it{c})"}, {100, -10.0f, 10.0f}}); + dataK0SHist.add("hNSigmaNegPionFromK0S", "hNSigmaNegPionFromK0Short", kTH2F, {{100, 0.0, 5.0, "#it{p} (GeV/#it{c})"}, {100, -10.0f, 10.0f}}); // 2D mass for Phi and K0S for Data dataPhiK0SHist.add("h4PhiK0SSEInc", "2D Invariant mass of Phi and K0Short for Same Event Inclusive", kTHnSparseF, {binnedmultAxis, binnedptK0SAxis, massK0SAxis, sigmassPhiAxis}); @@ -292,7 +303,7 @@ struct Phik0shortanalysis { dataPhiK0SHist.add("h4PhiK0SSESCut", "2D Invariant mass of Phi and K0Short for Same Event Deltay < SecondCut", kTHnSparseF, {binnedmultAxis, binnedptK0SAxis, massK0SAxis, sigmassPhiAxis}); // K0S rapidity in Data - dataPhiK0SHist.add("h3K0SRapidityData", "K0Short rapidity for Data", kTH3F, {binnedmultAxis, binnedptK0SAxis, yAxis}); + dataK0SHist.add("h3K0SRapidityData", "K0Short rapidity for Data", kTH3F, {binnedmultAxis, binnedptK0SAxis, yAxis}); // RecMC K0S coupled to Phi mcPhiK0SHist.add("h3RecMCPhiK0SInc", "RecoMC K0Short coupled to Phi Inclusive", kTH3F, {binnedmultAxis, binnedptK0SAxis, massK0SAxis}); @@ -319,7 +330,19 @@ struct Phik0shortanalysis { dataPhiPionHist.add("h5PhiPiSESCut", "Phi Invariant mass vs Pion nSigma TPC/TOF for Same Event Deltay < SecondCut", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); // Pion rapidity in Data - dataPhiPionHist.add("h3PiRapidityData", "Pion rapidity for Data", kTH3F, {binnedmultAxis, binnedptPiAxis, yAxis}); + dataPionHist.add("h3PiRapidityData", "Pion rapidity for Data", kTH3F, {binnedmultAxis, binnedptPiAxis, yAxis}); + + // DCA plots for pions in Data + dataPionHist.add("h2TracksPiDCAxyPreCutData", "Dcaxy distribution vs pt before DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); + dataPionHist.add("h2TracksPiDCAzPreCutData", "Dcaz distribution vs pt before DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{z} (cm)"}}); + dataPionHist.add("h2TracksPiDCAxyPostCutData", "Dcaxy distribution vs pt after DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); + dataPionHist.add("h2TracksPiDCAzPostCutData", "Dcaz distribution vs pt after DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{z} (cm)"}}); + + // DCA plots for pions in MCReco + mcPionHist.add("h2TracksPiDCAxyPreCutMCReco", "Dcaxy distribution vs pt before DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); + mcPionHist.add("h2TracksPiDCAzPreCutMCReco", "Dcaz distribution vs pt before DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{z} (cm)"}}); + mcPionHist.add("h2TracksPiDCAxyPostCutMCReco", "Dcaxy distribution vs pt after DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); + mcPionHist.add("h2TracksPiDCAzPostCutMCReco", "Dcaz distribution vs pt after DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{z} (cm)"}}); // RecMC Pion coupled to Phi with TPC mcPhiPionHist.add("h3RecMCPhiPiTPCInc", "RecoMC Pion coupled to Phi with TPC Inclusive", kTH3F, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}}); @@ -507,7 +530,7 @@ struct Phik0shortanalysis { } // Topological track selection - template + template bool selectionTrackResonance(const T& track, bool isQA) { if (cfgPrimaryTrack && !track.isPrimaryTrack()) @@ -526,14 +549,24 @@ struct Phik0shortanalysis { return false; if (isQA) { - candPhiHist.fill(HIST("hDCAxyPreCut"), track.pt(), track.dcaXY()); - candPhiHist.fill(HIST("hDCAzPreCut"), track.pt(), track.dcaZ()); + if constexpr (!isMC) { + dataPhiHist.fill(HIST("h2DauTracksPhiDCAxyPreCutData"), track.pt(), track.dcaXY()); + dataPhiHist.fill(HIST("h2DauTracksPhiDCAzPreCutData"), track.pt(), track.dcaZ()); + } else { + mcPhiHist.fill(HIST("h2DauTracksPhiDCAxyPreCutMCReco"), track.pt(), track.dcaXY()); + mcPhiHist.fill(HIST("h2DauTracksPhiDCAzPreCutMCReco"), track.pt(), track.dcaZ()); + } } if (std::abs(track.dcaXY()) > cMaxDCArToPV1 + (cMaxDCArToPV2 / std::pow(track.pt(), cMaxDCArToPV3))) return false; if (isQA) { - candPhiHist.fill(HIST("hDCAxyPostCut"), track.pt(), track.dcaXY()); - candPhiHist.fill(HIST("hDCAzPostCut"), track.pt(), track.dcaZ()); + if constexpr (!isMC) { + dataPhiHist.fill(HIST("h2DauTracksPhiDCAxyPostCutData"), track.pt(), track.dcaXY()); + dataPhiHist.fill(HIST("h2DauTracksPhiDCAzPostCutData"), track.pt(), track.dcaZ()); + } else { + mcPhiHist.fill(HIST("h2DauTracksPhiDCAxyPostCutMCReco"), track.pt(), track.dcaXY()); + mcPhiHist.fill(HIST("h2DauTracksPhiDCAzPostCutMCReco"), track.pt(), track.dcaZ()); + } } if (std::abs(track.dcaZ()) > cMaxDCAzToPVcut) return false; @@ -577,8 +610,8 @@ struct Phik0shortanalysis { } // Topological selection for pions - template - bool selectionPion(const T& track) + template + bool selectionPion(const T& track, bool isQA) { if (!track.hasITS()) return false; @@ -606,10 +639,28 @@ struct Phik0shortanalysis { return false; } - if (std::abs(track.dcaZ()) > cMaxDCAzToPVcut) - return false; + if (isQA) { + if constexpr (!isMC) { + dataPionHist.fill(HIST("h2TracksPiDCAxyPreCutData"), track.pt(), track.dcaXY()); + dataPionHist.fill(HIST("h2TracksPiDCAzPreCutData"), track.pt(), track.dcaZ()); + } else { + mcPionHist.fill(HIST("h2TracksPiDCAxyPreCutMCReco"), track.pt(), track.dcaXY()); + mcPionHist.fill(HIST("h2TracksPiDCAzPreCutMCReco"), track.pt(), track.dcaZ()); + } + } if (std::abs(track.dcaXY()) > cMaxDCArToPV1 + (cMaxDCArToPV2 / std::pow(track.pt(), cMaxDCArToPV3))) return false; + if (isQA) { + if constexpr (!isMC) { + dataPionHist.fill(HIST("h2TracksPiDCAxyPostCutData"), track.pt(), track.dcaXY()); + dataPionHist.fill(HIST("h2TracksPiDCAzPostCutData"), track.pt(), track.dcaZ()); + } else { + mcPionHist.fill(HIST("h2TracksPiDCAxyPostCutMCReco"), track.pt(), track.dcaXY()); + mcPionHist.fill(HIST("h2TracksPiDCAzPostCutMCReco"), track.pt(), track.dcaZ()); + } + } + if (std::abs(track.dcaZ()) > cMaxDCAzToPVcut) + return false; return true; } @@ -683,18 +734,18 @@ struct Phik0shortanalysis { // Loop over all positive tracks for (const auto& track1 : posThisColl) { - if (!selectionTrackResonance(track1, true) || !selectionPIDKaonpTdependent(track1)) + if (!selectionTrackResonance(track1, true) || !selectionPIDKaonpTdependent(track1)) continue; // topological and PID selection - candPhiHist.fill(HIST("hEta"), track1.eta()); - candPhiHist.fill(HIST("hNsigmaKaonTPC"), track1.tpcInnerParam(), track1.tpcNSigmaKa()); - candPhiHist.fill(HIST("hNsigmaKaonTOF"), track1.tpcInnerParam(), track1.tofNSigmaKa()); + dataPhiHist.fill(HIST("hEta"), track1.eta()); + dataPhiHist.fill(HIST("hNsigmaKaonTPC"), track1.tpcInnerParam(), track1.tpcNSigmaKa()); + dataPhiHist.fill(HIST("hNsigmaKaonTOF"), track1.tpcInnerParam(), track1.tofNSigmaKa()); auto track1ID = track1.globalIndex(); // Loop over all negative tracks for (const auto& track2 : negThisColl) { - if (!selectionTrackResonance(track2, true) || !selectionPIDKaonpTdependent(track2)) + if (!selectionTrackResonance(track2, true) || !selectionPIDKaonpTdependent(track2)) continue; // topological and PID selection auto track2ID = track2.globalIndex(); @@ -711,7 +762,7 @@ struct Phik0shortanalysis { isCountedPhi = true; } - dataPhiHist.fill(HIST("h2PhipurInvMass"), multiplicity, recPhi.M()); + dataPhiHist.fill(HIST("h3PhipurInvMass"), multiplicity, recPhi.M()); std::array isCountedK0S{false, false, false}; @@ -727,13 +778,13 @@ struct Phik0shortanalysis { continue; if (!isFilledhV0) { - candK0SHist.fill(HIST("hDCAV0Daughters"), v0.dcaV0daughters()); - candK0SHist.fill(HIST("hV0CosPA"), v0.v0cosPA()); + dataK0SHist.fill(HIST("hDCAV0Daughters"), v0.dcaV0daughters()); + dataK0SHist.fill(HIST("hV0CosPA"), v0.v0cosPA()); // Filling the PID of the V0 daughters in the region of the K0 peak if (lowMK0S < v0.mK0Short() && v0.mK0Short() < upMK0S) { - candK0SHist.fill(HIST("hNSigmaPosPionFromK0S"), posDaughterTrack.tpcInnerParam(), posDaughterTrack.tpcNSigmaPi()); - candK0SHist.fill(HIST("hNSigmaNegPionFromK0S"), negDaughterTrack.tpcInnerParam(), negDaughterTrack.tpcNSigmaPi()); + dataK0SHist.fill(HIST("hNSigmaPosPionFromK0S"), posDaughterTrack.tpcInnerParam(), posDaughterTrack.tpcNSigmaPi()); + dataK0SHist.fill(HIST("hNSigmaNegPionFromK0S"), negDaughterTrack.tpcInnerParam(), negDaughterTrack.tpcNSigmaPi()); } } @@ -763,7 +814,7 @@ struct Phik0shortanalysis { // Loop over all primary pion candidates for (const auto& track : fullTracks) { - if (!selectionPion(track)) + if (!selectionPion(track, false)) continue; if (std::abs(track.rapidity(massPi)) > cfgYAcceptance) @@ -814,7 +865,7 @@ struct Phik0shortanalysis { if (cfgFurtherV0Selection && !furtherSelectionV0(v0, collision)) continue; - dataPhiK0SHist.fill(HIST("h3K0SRapidityData"), multiplicity, v0.pt(), v0.yK0Short()); + dataK0SHist.fill(HIST("h3K0SRapidityData"), multiplicity, v0.pt(), v0.yK0Short()); if (std::abs(v0.yK0Short()) > cfgYAcceptance) continue; @@ -825,14 +876,14 @@ struct Phik0shortanalysis { // Phi reconstruction // Loop over positive tracks for (const auto& track1 : posThisColl) { - if (!selectionTrackResonance(track1, false) || !selectionPIDKaonpTdependent(track1)) + if (!selectionTrackResonance(track1, false) || !selectionPIDKaonpTdependent(track1)) continue; // topological and PID selection auto track1ID = track1.globalIndex(); // Loop over all negative tracks for (const auto& track2 : negThisColl) { - if (!selectionTrackResonance(track2, false) || !selectionPIDKaonpTdependent(track2)) + if (!selectionTrackResonance(track2, false) || !selectionPIDKaonpTdependent(track2)) continue; // topological and PID selection auto track2ID = track2.globalIndex(); @@ -884,7 +935,7 @@ struct Phik0shortanalysis { for (const auto& track : fullTracks) { // Pion selection - if (!selectionPion(track)) + if (!selectionPion(track, true)) continue; dataPhiPionHist.fill(HIST("h3PiRapidityData"), multiplicity, track.pt(), track.rapidity(massPi)); @@ -898,14 +949,14 @@ struct Phik0shortanalysis { // Phi reconstruction // Loop over positive tracks for (const auto& track1 : posThisColl) { // loop over all selected tracks - if (!selectionTrackResonance(track1, false) || !selectionPIDKaonpTdependent(track1)) + if (!selectionTrackResonance(track1, false) || !selectionPIDKaonpTdependent(track1)) continue; // topological and PID selection auto track1ID = track1.globalIndex(); // Loop over all negative tracks for (const auto& track2 : negThisColl) { - if (!selectionTrackResonance(track2, false) || !selectionPIDKaonpTdependent(track2)) + if (!selectionTrackResonance(track2, false) || !selectionPIDKaonpTdependent(track2)) continue; // topological and PID selection auto track2ID = track2.globalIndex(); @@ -965,7 +1016,7 @@ struct Phik0shortanalysis { // Loop over all positive tracks for (const auto& track1 : posThisColl) { - if (!selectionTrackResonance(track1, false) || !selectionPIDKaonpTdependent(track1)) + if (!selectionTrackResonance(track1, false) || !selectionPIDKaonpTdependent(track1)) continue; // topological and PID selection auto track1ID = track1.globalIndex(); @@ -978,7 +1029,7 @@ struct Phik0shortanalysis { // Loop over all negative tracks for (const auto& track2 : negThisColl) { - if (!selectionTrackResonance(track2, false) || !selectionPIDKaonpTdependent(track2)) + if (!selectionTrackResonance(track2, false) || !selectionPIDKaonpTdependent(track2)) continue; // topological and PID selection auto track2ID = track2.globalIndex(); @@ -1071,7 +1122,7 @@ struct Phik0shortanalysis { if (std::abs(mcTrack.pdgCode()) != 211 || !mcTrack.isPhysicalPrimary()) continue; - if (!selectionPion(track)) + if (!selectionPion(track, false)) continue; if (std::abs(track.rapidity(massPi)) > cfgYAcceptance) @@ -1200,7 +1251,7 @@ struct Phik0shortanalysis { continue; // Pion selection - if (!selectionPion(track)) + if (!selectionPion(track, false)) continue; mcPionHist.fill(HIST("h4PiRapiditySmearing"), genmultiplicity, track.pt(), track.rapidity(massPi), mcTrack.y()); @@ -1293,14 +1344,14 @@ struct Phik0shortanalysis { // Loop over all positive tracks for (const auto& track1 : posThisColl) { - if (!selectionTrackResonance(track1, true) || !selectionPIDKaonpTdependent(track1)) + if (!selectionTrackResonance(track1, true) || !selectionPIDKaonpTdependent(track1)) continue; // topological and PID selection auto track1ID = track1.globalIndex(); // Loop over all negative tracks for (const auto& track2 : negThisColl) { - if (!selectionTrackResonance(track2, true) || !selectionPIDKaonpTdependent(track2)) + if (!selectionTrackResonance(track2, true) || !selectionPIDKaonpTdependent(track2)) continue; // topological and PID selection auto track2ID = track2.globalIndex(); @@ -1317,7 +1368,7 @@ struct Phik0shortanalysis { isCountedPhi = true; } - closureMCPhiHist.fill(HIST("h2MCPhipurInvMass"), genmultiplicity, recPhi.M()); + closureMCPhiHist.fill(HIST("h3MCPhipurInvMass"), genmultiplicity, recPhi.M()); std::array isCountedK0S{false, false, false}; @@ -1372,7 +1423,7 @@ struct Phik0shortanalysis { continue; } - if (!selectionPion(track)) + if (!selectionPion(track, false)) continue; if (std::abs(track.rapidity(massPi)) > cfgYAcceptance) @@ -1442,13 +1493,13 @@ struct Phik0shortanalysis { // Phi reconstruction for (const auto& track1 : posThisColl) { // loop over all selected tracks - if (!selectionTrackResonance(track1, false) || !selectionPIDKaonpTdependent(track1)) + if (!selectionTrackResonance(track1, false) || !selectionPIDKaonpTdependent(track1)) continue; // topological and PID selection auto track1ID = track1.globalIndex(); for (const auto& track2 : negThisColl) { - if (!selectionTrackResonance(track2, false) || !selectionPIDKaonpTdependent(track2)) + if (!selectionTrackResonance(track2, false) || !selectionPIDKaonpTdependent(track2)) continue; // topological and PID selection auto track2ID = track2.globalIndex(); @@ -1539,7 +1590,7 @@ struct Phik0shortanalysis { } // Pion selection - if (!selectionPion(track)) + if (!selectionPion(track, true)) continue; if (std::abs(track.rapidity(massPi)) > cfgYAcceptance) @@ -1550,13 +1601,13 @@ struct Phik0shortanalysis { // Phi reconstruction for (const auto& track1 : posThisColl) { // loop over all selected tracks - if (!selectionTrackResonance(track1, false) || !selectionPIDKaonpTdependent(track1)) + if (!selectionTrackResonance(track1, false) || !selectionPIDKaonpTdependent(track1)) continue; // topological and PID selection auto track1ID = track1.globalIndex(); for (const auto& track2 : negThisColl) { - if (!selectionTrackResonance(track2, false) || !selectionPIDKaonpTdependent(track2)) + if (!selectionTrackResonance(track2, false) || !selectionPIDKaonpTdependent(track2)) continue; // topological and PID selection auto track2ID = track2.globalIndex(); From 6618571c422fd7c530c6623f2931db08e034cd10 Mon Sep 17 00:00:00 2001 From: sjzhu0v0 <87005502+sjzhu0v0@users.noreply.github.com> Date: Thu, 13 Feb 2025 20:28:22 +0100 Subject: [PATCH 0208/1650] [PWGDQ] FT0C occupancy added to DQ code. (#9760) Co-authored-by: sjzhu0v0 Co-authored-by: Senjie Zhu --- PWGDQ/Core/HistogramsLibrary.cxx | 7 ++- PWGDQ/Core/VarManager.cxx | 9 +++ PWGDQ/Core/VarManager.h | 9 +++ PWGDQ/DataModel/ReducedInfoTables.h | 9 ++- PWGDQ/TableProducer/tableMaker.cxx | 6 +- PWGDQ/TableProducer/tableMakerMC.cxx | 3 +- .../TableProducer/tableMakerMC_withAssoc.cxx | 7 ++- PWGDQ/TableProducer/tableMaker_withAssoc.cxx | 7 ++- PWGDQ/Tasks/CMakeLists.txt | 5 ++ PWGDQ/Tasks/ModelConverterMultPv.cxx | 56 +++++++++++++++++++ PWGDQ/Tasks/tableReader.cxx | 26 +++++++-- 11 files changed, 127 insertions(+), 17 deletions(-) create mode 100644 PWGDQ/Tasks/ModelConverterMultPv.cxx diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 82b6330fc14..976b197e247 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -11,6 +11,8 @@ // // Contact: iarsene@cern.ch, i.c.arsene@fys.uio.no // +#include +#include #include "PWGDQ/Core/HistogramsLibrary.h" #include "VarManager.h" #include "CommonConstants/MathConstants.h" @@ -88,8 +90,10 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "MultFDDA", "MultFDDA", false, 300, 0.0, 300.0, VarManager::kMultFDDA); hm->AddHistogram(histClass, "MultFDDC", "MultFDDC", false, 50, 0.0, 50.0, VarManager::kMultFDDC); hm->AddHistogram(histClass, "MultTracklets", "MultTracklets", false, 250, 0.0, 250.0, VarManager::kMultTracklets); - hm->AddHistogram(histClass, "VtxNContribReal", "Vtx n contributors", false, 100, 0.0, 100.0, VarManager::kVtxNcontribReal); + hm->AddHistogram(histClass, "VtxNContribReal", "Vtx n contributors", false, 200, 0.0, 200.0, VarManager::kVtxNcontribReal); hm->AddHistogram(histClass, "VtxNContrib", "Vtx n contributors", false, 100, 0.0, 100.0, VarManager::kVtxNcontrib); + hm->AddHistogram(histClass, "MultNTracksPVeta1", "MultNTracksPVeta1", false, 200, 0, 200.0, VarManager::kMultNTracksPVeta1); + hm->AddHistogram(histClass, "MultNTracksPVetaHalf", "MultNTracksPVetaHalf", false, 200, 0, 200.0, VarManager::kMultNTracksPVetaHalf); hm->AddHistogram(histClass, "MultTPC_MultFV0A", "MultTPC vs MultFV0A", false, 100, 0, 500.0, VarManager::kMultTPC, 100, 0, 500.0, VarManager::kMultFV0A); hm->AddHistogram(histClass, "MultTPC_MultFT0A", "MultTPC vs MultFT0A", false, 100, 0, 500.0, VarManager::kMultTPC, 100, 0, 200.0, VarManager::kMultFT0A); hm->AddHistogram(histClass, "MultTPC_MultFT0C", "MultTPC vs MultFT0C", false, 100, 0, 500.0, VarManager::kMultTPC, 100, 0, 300.0, VarManager::kMultFT0C); @@ -180,6 +184,7 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h } if (subGroupStr.Contains("occupancy")) { hm->AddHistogram(histClass, "ITStrackOccupancy", "ITStrackOccupancy", false, 200, 0.0, 20000.0, VarManager::kTrackOccupancyInTimeRange); + hm->AddHistogram(histClass, "Ft0cOccupancy", "Ft0cOccupancy", false, 200, 0.0, 20000.0, VarManager::kFT0COccupancyInTimeRange); } if (subGroupStr.Contains("mc")) { hm->AddHistogram(histClass, "MCVtxX_VtxX", "Vtx X (MC vs rec)", false, 100, -0.5, 0.5, VarManager::kVtxX, 100, -0.5, 0.5, VarManager::kMCVtxX); diff --git a/PWGDQ/Core/VarManager.cxx b/PWGDQ/Core/VarManager.cxx index 70479bc8195..73d4b3c49bd 100644 --- a/PWGDQ/Core/VarManager.cxx +++ b/PWGDQ/Core/VarManager.cxx @@ -364,8 +364,14 @@ void VarManager::SetDefaultVarNames() fgVariableUnits[kMultNTracksTPCOnly] = ""; fgVariableNames[kMultNTracksITSTPC] = "# ITS-TPC tracks in PV"; fgVariableUnits[kMultNTracksITSTPC] = ""; + fgVariableNames[kMultNTracksPVeta1] = "# Mult Tracks PV |#eta| < 1"; + fgVariableUnits[kMultNTracksPVeta1] = ""; + fgVariableNames[kMultNTracksPVetaHalf] = "# Mult Tracks PV |#eta| < 0.5"; + fgVariableUnits[kMultNTracksPVetaHalf] = ""; fgVariableNames[kTrackOccupancyInTimeRange] = "track occupancy in TPC drift time (PV tracks)"; fgVariableUnits[kTrackOccupancyInTimeRange] = ""; + fgVariableNames[kFT0COccupancyInTimeRange] = "FT0C occupancy"; + fgVariableUnits[kFT0COccupancyInTimeRange] = ""; fgVariableNames[kNoCollInTimeRangeStandard] = "track occupancy in TPC drift standart time"; fgVariableUnits[kNoCollInTimeRangeStandard] = ""; fgVariableNames[kMultAllTracksITSTPC] = "# ITS-TPC tracks"; @@ -1146,7 +1152,10 @@ void VarManager::SetDefaultVarNames() fgVarNamesMap["kMultNTracksITSOnly"] = kMultNTracksITSOnly; fgVarNamesMap["kMultNTracksTPCOnly"] = kMultNTracksTPCOnly; fgVarNamesMap["kMultNTracksITSTPC"] = kMultNTracksITSTPC; + fgVarNamesMap["kMultNTracksPVeta1"] = kMultNTracksPVeta1; + fgVarNamesMap["kMultNTracksPVetaHalf"] = kMultNTracksPVetaHalf; fgVarNamesMap["kTrackOccupancyInTimeRange"] = kTrackOccupancyInTimeRange; + fgVarNamesMap["kFT0COccupancyInTimeRange"] = kFT0COccupancyInTimeRange; fgVarNamesMap["kNoCollInTimeRangeStandard"] = kNoCollInTimeRangeStandard; fgVarNamesMap["kMultAllTracksTPCOnly"] = kMultAllTracksTPCOnly; fgVarNamesMap["kMultAllTracksITSTPC"] = kMultAllTracksITSTPC; diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 04ebdf94450..8f5ad6f4332 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -241,7 +241,10 @@ class VarManager : public TObject kMultNTracksITSOnly, kMultNTracksTPCOnly, kMultNTracksITSTPC, + kMultNTracksPVeta1, + kMultNTracksPVetaHalf, kTrackOccupancyInTimeRange, + kFT0COccupancyInTimeRange, kNoCollInTimeRangeStandard, kMultAllTracksTPCOnly, kMultAllTracksITSTPC, @@ -1448,6 +1451,9 @@ void VarManager::FillEvent(T const& event, float* values) if (fgUsedVars[kTrackOccupancyInTimeRange]) { values[kTrackOccupancyInTimeRange] = event.trackOccupancyInTimeRange(); } + if (fgUsedVars[kFT0COccupancyInTimeRange]) { + values[kFT0COccupancyInTimeRange] = event.ft0cOccupancyInTimeRange(); + } if (fgUsedVars[kNoCollInTimeRangeStandard]) { values[kNoCollInTimeRangeStandard] = event.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard); } @@ -1565,9 +1571,12 @@ void VarManager::FillEvent(T const& event, float* values) values[kMultNTracksITSOnly] = event.multNTracksITSOnly(); values[kMultNTracksTPCOnly] = event.multNTracksTPCOnly(); values[kMultNTracksITSTPC] = event.multNTracksITSTPC(); + values[kMultNTracksPVeta1] = event.multNTracksPVeta1(); + values[kMultNTracksPVetaHalf] = event.multNTracksPVetaHalf(); values[kMultAllTracksTPCOnly] = event.multAllTracksTPCOnly(); values[kMultAllTracksITSTPC] = event.multAllTracksITSTPC(); values[kTrackOccupancyInTimeRange] = event.trackOccupancyInTimeRange(); + values[kFT0COccupancyInTimeRange] = event.ft0cOccupancyInTimeRange(); if constexpr ((fillMap & ReducedEventMultExtra) > 0) { values[kNTPCcontribLongA] = event.nTPCoccupContribLongA(); values[kNTPCcontribLongC] = event.nTPCoccupContribLongC(); diff --git a/PWGDQ/DataModel/ReducedInfoTables.h b/PWGDQ/DataModel/ReducedInfoTables.h index 96d6af36daa..31bf8bc39e1 100644 --- a/PWGDQ/DataModel/ReducedInfoTables.h +++ b/PWGDQ/DataModel/ReducedInfoTables.h @@ -152,11 +152,18 @@ DECLARE_SOA_TABLE(ReducedEventsExtended, "AOD", "REEXTENDED", //! Extended even mult::MultFDDA, mult::MultFDDC, mult::MultZNA, mult::MultZNC, mult::MultTracklets, mult::MultNTracksPV, cent::CentFT0C); -DECLARE_SOA_TABLE(ReducedEventsMultPV, "AOD", "REMULTPV", //! Multiplicity information for primary vertex +DECLARE_SOA_TABLE(ReducedEventsMultPV_000, "AOD", "REMULTPV", //! Multiplicity information for primary vertex mult::MultNTracksHasITS, mult::MultNTracksHasTPC, mult::MultNTracksHasTOF, mult::MultNTracksHasTRD, mult::MultNTracksITSOnly, mult::MultNTracksTPCOnly, mult::MultNTracksITSTPC, evsel::NumTracksInTimeRange); +DECLARE_SOA_TABLE_VERSIONED(ReducedEventsMultPV_001, "AOD", "REMULTPV", 1, //! Multiplicity information for primary vertex + mult::MultNTracksHasITS, mult::MultNTracksHasTPC, mult::MultNTracksHasTOF, mult::MultNTracksHasTRD, + mult::MultNTracksITSOnly, mult::MultNTracksTPCOnly, mult::MultNTracksITSTPC, + mult::MultNTracksPVeta1, mult::MultNTracksPVetaHalf, evsel::NumTracksInTimeRange, evsel::SumAmpFT0CInTimeRange); + +using ReducedEventsMultPV = ReducedEventsMultPV_001; + DECLARE_SOA_TABLE(ReducedEventsMultAll, "AOD", "REMULTALL", //! Multiplicity information for all tracks in the event mult::MultAllTracksTPCOnly, mult::MultAllTracksITSTPC, reducedevent::NTPCoccupContribLongA, reducedevent::NTPCoccupContribLongC, diff --git a/PWGDQ/TableProducer/tableMaker.cxx b/PWGDQ/TableProducer/tableMaker.cxx index 04c45aeee86..3a212fdba9f 100644 --- a/PWGDQ/TableProducer/tableMaker.cxx +++ b/PWGDQ/TableProducer/tableMaker.cxx @@ -498,7 +498,8 @@ struct TableMaker { eventInfo(collision.globalIndex()); if constexpr ((TEventFillMap & VarManager::ObjTypes::CollisionMultExtra) > 0) { multPV(collision.multNTracksHasITS(), collision.multNTracksHasTPC(), collision.multNTracksHasTOF(), collision.multNTracksHasTRD(), - collision.multNTracksITSOnly(), collision.multNTracksTPCOnly(), collision.multNTracksITSTPC(), collision.trackOccupancyInTimeRange()); + collision.multNTracksITSOnly(), collision.multNTracksTPCOnly(), collision.multNTracksITSTPC(), + collision.multNTracksPVeta1(), collision.multNTracksPVetaHalf(), collision.trackOccupancyInTimeRange(), collision.ft0cOccupancyInTimeRange()); multAll(collision.multAllTracksTPCOnly(), collision.multAllTracksITSTPC(), 0, 0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0, 0.0, 0.0, 0.0); } @@ -970,7 +971,8 @@ struct TableMaker { eventInfo(collision.globalIndex()); if constexpr ((TEventFillMap & VarManager::ObjTypes::CollisionMultExtra) > 0) { multPV(collision.multNTracksHasITS(), collision.multNTracksHasTPC(), collision.multNTracksHasTOF(), collision.multNTracksHasTRD(), - collision.multNTracksITSOnly(), collision.multNTracksTPCOnly(), collision.multNTracksITSTPC(), collision.trackOccupancyInTimeRange()); + collision.multNTracksITSOnly(), collision.multNTracksTPCOnly(), collision.multNTracksITSTPC(), + collision.multNTracksPVeta1(), collision.multNTracksPVetaHalf(), collision.trackOccupancyInTimeRange(), collision.ft0cOccupancyInTimeRange()); multAll(collision.multAllTracksTPCOnly(), collision.multAllTracksITSTPC(), 0, 0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0, 0.0, 0.0, 0.0); } diff --git a/PWGDQ/TableProducer/tableMakerMC.cxx b/PWGDQ/TableProducer/tableMakerMC.cxx index cd25c5c1a9d..a8ae3c833f9 100644 --- a/PWGDQ/TableProducer/tableMakerMC.cxx +++ b/PWGDQ/TableProducer/tableMakerMC.cxx @@ -468,7 +468,8 @@ struct TableMakerMC { eventMClabels(fEventLabels.find(mcCollision.globalIndex())->second, collision.mcMask()); if constexpr ((TEventFillMap & VarManager::ObjTypes::CollisionMultExtra) > 0) { multPV(collision.multNTracksHasITS(), collision.multNTracksHasTPC(), collision.multNTracksHasTOF(), collision.multNTracksHasTRD(), - collision.multNTracksITSOnly(), collision.multNTracksTPCOnly(), collision.multNTracksITSTPC(), collision.trackOccupancyInTimeRange()); + collision.multNTracksITSOnly(), collision.multNTracksTPCOnly(), collision.multNTracksITSTPC(), + collision.multNTracksPVeta1(), collision.multNTracksPVetaHalf(), collision.trackOccupancyInTimeRange(), collision.ft0cOccupancyInTimeRange()); multAll(collision.multAllTracksTPCOnly(), collision.multAllTracksITSTPC(), 0, 0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0, 0.0, 0.0, 0.0); } diff --git a/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx b/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx index 92ea1647e11..661d2869768 100644 --- a/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx +++ b/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx @@ -378,7 +378,7 @@ struct TableMakerMC { if (addTrackCutsStr != "") { std::vector addTrackCuts = dqcuts::GetCutsFromJSON(addTrackCutsStr.Data()); for (auto& t : addTrackCuts) { - fTrackCuts.push_back((AnalysisCompositeCut*)t); + fTrackCuts.push_back(reinterpret_cast(t)); } } @@ -395,7 +395,7 @@ struct TableMakerMC { if (addMuonCutsStr != "") { std::vector addMuonCuts = dqcuts::GetCutsFromJSON(addMuonCutsStr.Data()); for (auto& t : addMuonCuts) { - fMuonCuts.push_back((AnalysisCompositeCut*)t); + fMuonCuts.push_back(reinterpret_cast(t)); } } @@ -585,7 +585,8 @@ struct TableMakerMC { eventInfo(collision.globalIndex()); if constexpr ((TEventFillMap & VarManager::ObjTypes::CollisionMultExtra) > 0) { multPV(collision.multNTracksHasITS(), collision.multNTracksHasTPC(), collision.multNTracksHasTOF(), collision.multNTracksHasTRD(), - collision.multNTracksITSOnly(), collision.multNTracksTPCOnly(), collision.multNTracksITSTPC(), collision.trackOccupancyInTimeRange()); + collision.multNTracksITSOnly(), collision.multNTracksTPCOnly(), collision.multNTracksITSTPC(), + collision.multNTracksPVeta1(), collision.multNTracksPVetaHalf(), collision.trackOccupancyInTimeRange(), collision.ft0cOccupancyInTimeRange()); multAll(collision.multAllTracksTPCOnly(), collision.multAllTracksITSTPC(), 0, 0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0.0, 0.0, 0.0, 0.0); } diff --git a/PWGDQ/TableProducer/tableMaker_withAssoc.cxx b/PWGDQ/TableProducer/tableMaker_withAssoc.cxx index 72d4a3e7fab..b359b190529 100644 --- a/PWGDQ/TableProducer/tableMaker_withAssoc.cxx +++ b/PWGDQ/TableProducer/tableMaker_withAssoc.cxx @@ -441,7 +441,7 @@ struct TableMaker { if (addTrackCutsStr != "") { std::vector addTrackCuts = dqcuts::GetCutsFromJSON(addTrackCutsStr.Data()); for (auto& t : addTrackCuts) { - fTrackCuts.push_back((AnalysisCompositeCut*)t); + fTrackCuts.push_back(reinterpret_cast(t)); } } @@ -458,7 +458,7 @@ struct TableMaker { if (addMuonCutsStr != "") { std::vector addMuonCuts = dqcuts::GetCutsFromJSON(addMuonCutsStr.Data()); for (auto& t : addMuonCuts) { - fMuonCuts.push_back((AnalysisCompositeCut*)t); + fMuonCuts.push_back(reinterpret_cast(t)); } } @@ -913,7 +913,8 @@ struct TableMaker { } if constexpr ((TEventFillMap & VarManager::ObjTypes::CollisionMultExtra) > 0) { multPV(collision.multNTracksHasITS(), collision.multNTracksHasTPC(), collision.multNTracksHasTOF(), collision.multNTracksHasTRD(), - collision.multNTracksITSOnly(), collision.multNTracksTPCOnly(), collision.multNTracksITSTPC(), collision.trackOccupancyInTimeRange()); + collision.multNTracksITSOnly(), collision.multNTracksTPCOnly(), collision.multNTracksITSTPC(), + collision.multNTracksPVeta1(), collision.multNTracksPVetaHalf(), collision.trackOccupancyInTimeRange(), collision.ft0cOccupancyInTimeRange()); multAll(collision.multAllTracksTPCOnly(), collision.multAllTracksITSTPC(), fOccup.oContribLongA[collision.globalIndex()], fOccup.oContribLongC[collision.globalIndex()], diff --git a/PWGDQ/Tasks/CMakeLists.txt b/PWGDQ/Tasks/CMakeLists.txt index af4fb5b5323..a10d6bb117d 100644 --- a/PWGDQ/Tasks/CMakeLists.txt +++ b/PWGDQ/Tasks/CMakeLists.txt @@ -113,3 +113,8 @@ o2physics_add_dpl_workflow(quarkonia-to-hyperons SOURCES quarkoniaToHyperons.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::MLCore O2Physics::EventFilteringUtils COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(model-converter-mult-pv + SOURCES ModelConverterMultPv.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::PWGDQCore + COMPONENT_NAME Analysis) diff --git a/PWGDQ/Tasks/ModelConverterMultPv.cxx b/PWGDQ/Tasks/ModelConverterMultPv.cxx new file mode 100644 index 00000000000..088590435b8 --- /dev/null +++ b/PWGDQ/Tasks/ModelConverterMultPv.cxx @@ -0,0 +1,56 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +// +// Contact: iarsene@cern.ch, i.c.arsene@fys.uio.no +// +// Task used to convert the data model from the old format to the new format. To avoid +// the conflict with the old data model. + +// other includes +#include +#include +#include +#include "DataFormatsParameters/GRPObject.h" +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/ASoAHelpers.h" +#include "PWGDQ/DataModel/ReducedInfoTables.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::aod; + +struct MultPVConverter000_001 { + Produces multPV_001; + void processConverting(aod::ReducedEventsMultPV_000 const& multsPV) + { + for (const auto& r : multsPV) { + multPV_001(r.multNTracksHasITS(), r.multNTracksHasTPC(), r.multNTracksHasTOF(), r.multNTracksHasTRD(), + r.multNTracksITSOnly(), r.multNTracksTPCOnly(), r.multNTracksITSTPC(), -1.0f, -1.0f, r.trackOccupancyInTimeRange(), -999.0f); + } + } + + void processDummy(o2::aod::ReducedEvents&) + { + // do nothing + } + + PROCESS_SWITCH(MultPVConverter000_001, processConverting, "Convert Table MultPV_000 to Table MultPV_001", false); + PROCESS_SWITCH(MultPVConverter000_001, processDummy, "do nothing", true); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc)}; +} diff --git a/PWGDQ/Tasks/tableReader.cxx b/PWGDQ/Tasks/tableReader.cxx index 04b1d0cdf84..ac276daca09 100644 --- a/PWGDQ/Tasks/tableReader.cxx +++ b/PWGDQ/Tasks/tableReader.cxx @@ -91,6 +91,7 @@ DECLARE_SOA_TABLE(BmesonCandidates, "AOD", "DQBMESONS", dqanalysisflags::massBca // Declarations of various short names using MyEvents = soa::Join; +using MyEventsMultExtra = soa::Join; using MyEventsSelected = soa::Join; using MyEventsHashSelected = soa::Join; using MyEventsVtxCov = soa::Join; @@ -262,6 +263,10 @@ struct AnalysisEventSelection { { runEventSelection(event); } + void processSkimmedWithMultPV(MyEventsMultExtra::iterator const& event) + { + runEventSelection(event); + } void processSkimmedQVector(MyEventsQvector::iterator const& event) { runEventSelection(event); @@ -288,6 +293,7 @@ struct AnalysisEventSelection { } PROCESS_SWITCH(AnalysisEventSelection, processSkimmed, "Run event selection on DQ skimmed events", false); + PROCESS_SWITCH(AnalysisEventSelection, processSkimmedWithMultPV, "Run event selection on DQ skimmed events with mult", false); PROCESS_SWITCH(AnalysisEventSelection, processSkimmedQVector, "Run event selection on DQ skimmed events with Q vector from GFW", false); PROCESS_SWITCH(AnalysisEventSelection, processSkimmedQVectorCentr, "Run event selection on DQ skimmed events with Q vector from CFW", false); PROCESS_SWITCH(AnalysisEventSelection, processSkimmedQVectorMultExtra, "Run event selection on DQ skimmed events with Q vector from GFW and MultPV", false); @@ -651,13 +657,13 @@ struct AnalysisEventMixing { Service ccdb; o2::parameters::GRPMagField* grpmag = nullptr; - TH1D* ResoFlowSP = nullptr; // Resolution factors for flow analysis, this will be loaded from CCDB - TH1D* ResoFlowEP = nullptr; // Resolution factors for flow analysis, this will be loaded from CCDB + TH1D* ResoFlowSP = nullptr; // Resolution factors for flow analysis, this will be loaded from CCDB + TH1D* ResoFlowEP = nullptr; // Resolution factors for flow analysis, this will be loaded from CCDB TH2D* SingleMuv22m = nullptr; // Single muon v22, loaded from CCDB TH2D* SingleMuv24m = nullptr; // Single muon v24, loaded from CCDB TH2D* SingleMuv22p = nullptr; // Single antimuon v22, loaded from CCDB TH2D* SingleMuv24p = nullptr; // Single antimuon v24, loaded from CCDB - int fCurrentRun; // needed to detect if the run changed and trigger update of calibrations etc. + int fCurrentRun; // needed to detect if the run changed and trigger update of calibrations etc. Filter filterEventSelected = aod::dqanalysisflags::isEventSelected == 1; Filter filterTrackSelected = aod::dqanalysisflags::isBarrelSelected > 0; @@ -750,7 +756,7 @@ struct AnalysisEventMixing { DefineHistograms(fHistMan, histNames.Data(), fConfigAddEventMixingHistogram); // define all histograms // Additional histograms via JSON dqhistograms::AddHistogramsFromJSON(fHistMan, fConfigAddJSONHistograms.value.c_str()); - VarManager::SetUseVars(fHistMan->GetUsedVars()); // provide the list of required variables so that VarManager knows what to fill + VarManager::SetUseVars(fHistMan->GetUsedVars()); // provide the list of required variables so that VarManager knows what to fill fOutputList.setObject(fHistMan->GetMainHistogramList()); } @@ -1179,9 +1185,9 @@ struct AnalysisSameEventPairing { VarManager::SetCollisionSystem((TString)fCollisionSystem, fCenterMassEnergy); // set collision system and center of mass energy - DefineHistograms(fHistMan, histNames.Data(), fConfigAddSEPHistogram); // define all histograms + DefineHistograms(fHistMan, histNames.Data(), fConfigAddSEPHistogram); // define all histograms dqhistograms::AddHistogramsFromJSON(fHistMan, fConfigAddJSONHistograms.value.c_str()); // ad-hoc histograms via JSON - VarManager::SetUseVars(fHistMan->GetUsedVars()); // provide the list of required variables so that VarManager knows what to fill + VarManager::SetUseVars(fHistMan->GetUsedVars()); // provide the list of required variables so that VarManager knows what to fill fOutputList.setObject(fHistMan->GetMainHistogramList()); } @@ -1491,6 +1497,13 @@ struct AnalysisSameEventPairing { VarManager::FillEvent(event, VarManager::fgValues); runSameEventPairing(event, tracks, tracks); } + void processDecayToEESkimmedWithMult(soa::Filtered::iterator const& event, soa::Filtered const& tracks) + { + // Reset the fValues array + VarManager::ResetValues(0, VarManager::kNVars); + VarManager::FillEvent(event, VarManager::fgValues); + runSameEventPairing(event, tracks, tracks); + } void processDecayToEESkimmedNoTwoProngFitter(soa::Filtered::iterator const& event, soa::Filtered const& tracks) { // Reset the fValues array @@ -1642,6 +1655,7 @@ struct AnalysisSameEventPairing { } PROCESS_SWITCH(AnalysisSameEventPairing, processDecayToEESkimmed, "Run electron-electron pairing, with skimmed tracks", false); + PROCESS_SWITCH(AnalysisSameEventPairing, processDecayToEESkimmedWithMult, "Run electron-electron pairing, with skimmed tracks and multiplicity", false); PROCESS_SWITCH(AnalysisSameEventPairing, processDecayToEESkimmedNoTwoProngFitter, "Run electron-electron pairing, with skimmed tracks but no two prong fitter", false); PROCESS_SWITCH(AnalysisSameEventPairing, processDecayToEESkimmedWithCov, "Run electron-electron pairing, with skimmed covariant tracks", false); PROCESS_SWITCH(AnalysisSameEventPairing, processDecayToEESkimmedWithCovNoTwoProngFitter, "Run electron-electron pairing, with skimmed covariant tracks but no two prong fitter", false); From 3233aa741364ecd14faf894a6824abe842bc668f Mon Sep 17 00:00:00 2001 From: FDUEnrich <23210190047@m.fudan.edu.cn> Date: Fri, 14 Feb 2025 04:43:48 +0800 Subject: [PATCH 0209/1650] [PWGHF] Save only mc signal in treecreator. (#9934) Co-authored-by: ALICE Action Bot --- .../candidateSelectorOmegac0ToOmegaPi.cxx | 11 +++++++++++ PWGHF/TableProducer/treeCreatorOmegacToOmegaPi.cxx | 9 ++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx b/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx index 97e98b26d87..117dee5430c 100644 --- a/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx @@ -156,6 +156,7 @@ struct HfCandidateSelectorToOmegaPi { HistogramRegistry registry{"registry"}; // for QA of selections OutputObj hInvMassCharmBaryon{TH1D("hInvMassCharmBaryon", "Charm baryon invariant mass;inv mass;entries", 500, 2.3, 3.1)}; + OutputObj hPtCharmBaryon{TH1D("hPtCharmBaryon", "Charm baryon transverse momentum before sel;Pt;entries", 8000, 0., 80)}; void init(InitContext const&) { @@ -192,6 +193,7 @@ struct HfCandidateSelectorToOmegaPi { registry.add("hStatusCheck", "Check consecutive selections status;status;entries", {HistType::kTH1D, {{12, 0., 12.}}}); // for QA of the selections (bin 0 -> candidates that did not pass the selection, bin 1 -> candidates that passed the selection) + registry.add("hSelPtOmegac", "hSelPtOmegac;status;entries", {HistType::kTH1D, {axisSel}}); registry.add("hSelSignDec", "hSelSignDec;status;entries", {HistType::kTH1D, {axisSel}}); registry.add("hSelEtaPosV0Dau", "hSelEtaPosV0Dau;status;entries", {HistType::kTH1D, {axisSel}}); registry.add("hSelEtaNegV0Dau", "hSelEtaNegV0Dau;status;entries", {HistType::kTH1D, {axisSel}}); @@ -425,6 +427,15 @@ struct HfCandidateSelectorToOmegaPi { } } + // Omegac Pt selection + hPtCharmBaryon->Fill(std::abs(candidate.kfptOmegac())); + if (std::abs(candidate.kfptOmegac()) < ptCandMin || std::abs(candidate.kfptOmegac()) > ptCandMax) { + resultSelections = false; + registry.fill(HIST("hSelPtOmegac"), 0); + } else { + registry.fill(HIST("hSelPtOmegac"), 1); + } + // v0&Casc&Omegac ldl selection if ((candidate.v0ldl() < v0LdlMin) || (candidate.cascldl() < cascLdlMin) || (candidate.omegacldl() > omegacLdlMax)) { resultSelections = false; diff --git a/PWGHF/TableProducer/treeCreatorOmegacToOmegaPi.cxx b/PWGHF/TableProducer/treeCreatorOmegacToOmegaPi.cxx index 11f7d20a63e..0b0c3a2a4e4 100644 --- a/PWGHF/TableProducer/treeCreatorOmegacToOmegaPi.cxx +++ b/PWGHF/TableProducer/treeCreatorOmegacToOmegaPi.cxx @@ -207,6 +207,7 @@ struct HfTreeCreatorOmegac0ToOmegaPi { Produces rowEv; Configurable zPvCut{"zPvCut", 10., "Cut on absolute value of primary vertex z coordinate"}; + Configurable keepOnlyMcSignal{"keepOnlyMcSignal", true, "Fill MC tree only with signal candidates"}; using MyTrackTable = soa::Join; using MyEventTable = soa::Join; @@ -425,7 +426,13 @@ struct HfTreeCreatorOmegac0ToOmegaPi { // Filling candidate properties rowCandidateLite.reserve(candidates.size()); for (const auto& candidate : candidates) { - fillKfCandidate(candidate, candidate.flagMcMatchRec(), candidate.originRec(), candidate.collisionMatched()); + if (keepOnlyMcSignal) { + if (candidate.originRec() != 0) { + fillKfCandidate(candidate, candidate.flagMcMatchRec(), candidate.originRec(), candidate.collisionMatched()); + } + } else { + fillKfCandidate(candidate, candidate.flagMcMatchRec(), candidate.originRec(), candidate.collisionMatched()); + } } } PROCESS_SWITCH(HfTreeCreatorOmegac0ToOmegaPi, processKFMcFull, "Process KF MC", false); From de2f6aa993ae884ba852ea08e7e7dfd770cc7d43 Mon Sep 17 00:00:00 2001 From: czhang Date: Fri, 14 Feb 2025 00:04:54 +0100 Subject: [PATCH 0210/1650] [Common,PWGDQ] A First version of process using realigned muon tracks in table-maker (#9933) --- Common/DataModel/FwdTrackReAlignTables.h | 156 +++++++++++++---- Common/TableProducer/muonRealignment.cxx | 206 ++++++++++++++--------- PWGDQ/Core/CMakeLists.txt | 2 +- PWGDQ/Core/VarManager.h | 16 +- PWGDQ/TableProducer/tableMaker.cxx | 76 +++++++-- 5 files changed, 320 insertions(+), 136 deletions(-) diff --git a/Common/DataModel/FwdTrackReAlignTables.h b/Common/DataModel/FwdTrackReAlignTables.h index 14367a8a2cd..e8249e56608 100644 --- a/Common/DataModel/FwdTrackReAlignTables.h +++ b/Common/DataModel/FwdTrackReAlignTables.h @@ -20,48 +20,136 @@ namespace o2::aod { -namespace fwdtrack +namespace fwdtrackrealign { -// Extra columns for re-aligned forward tracks +// FwdTracksRealign Columns definitions +DECLARE_SOA_INDEX_COLUMN(Collision, collision); //! +DECLARE_SOA_INDEX_COLUMN(FwdTrack, fwdtrack); //! FwdTrack index +DECLARE_SOA_COLUMN(TrackType, trackType, uint8_t); //! Type of track. See enum ForwardTrackTypeEnum +DECLARE_SOA_COLUMN(X, x, float); //! TrackParFwd parameter x +DECLARE_SOA_COLUMN(Y, y, float); //! TrackParFwd parameter y +DECLARE_SOA_COLUMN(Z, z, float); //! TrackParFwd propagation parameter z +DECLARE_SOA_COLUMN(Phi, phi, float); //! TrackParFwd parameter phi; (i.e. pt pointing direction) +DECLARE_SOA_COLUMN(Tgl, tgl, float); //! TrackParFwd parameter tan(\lamba); (\lambda = 90 - \theta_{polar}) +DECLARE_SOA_COLUMN(Signed1Pt, signed1Pt, float); //! TrackParFwd parameter: charged inverse transverse momentum; (q/pt) DECLARE_SOA_COLUMN(IsRemovable, isRemovable, int); //! flag to validate the re-aligned track -} // namespace fwdtrack +DECLARE_SOA_COLUMN(Chi2, chi2, float); //! Track chi^2 + +// FwdTracksCovRealign columns definitions +DECLARE_SOA_COLUMN(SigmaX, sigmaX, float); //! Covariance matrix +DECLARE_SOA_COLUMN(SigmaY, sigmaY, float); //! Covariance matrix +DECLARE_SOA_COLUMN(SigmaPhi, sigmaPhi, float); //! Covariance matrix +DECLARE_SOA_COLUMN(SigmaTgl, sigmaTgl, float); //! Covariance matrix +DECLARE_SOA_COLUMN(Sigma1Pt, sigma1Pt, float); //! Covariance matrix +DECLARE_SOA_COLUMN(RhoXY, rhoXY, int8_t); //! Covariance matrix in compressed form +DECLARE_SOA_COLUMN(RhoPhiX, rhoPhiX, int8_t); //! Covariance matrix in compressed form +DECLARE_SOA_COLUMN(RhoPhiY, rhoPhiY, int8_t); //! Covariance matrix in compressed form +DECLARE_SOA_COLUMN(RhoTglX, rhoTglX, int8_t); //! Covariance matrix in compressed form +DECLARE_SOA_COLUMN(RhoTglY, rhoTglY, int8_t); //! Covariance matrix in compressed form +DECLARE_SOA_COLUMN(RhoTglPhi, rhoTglPhi, int8_t); //! Covariance matrix in compressed form +DECLARE_SOA_COLUMN(Rho1PtX, rho1PtX, int8_t); //! Covariance matrix in compressed form +DECLARE_SOA_COLUMN(Rho1PtY, rho1PtY, int8_t); //! Covariance matrix in compressed form +DECLARE_SOA_COLUMN(Rho1PtPhi, rho1PtPhi, int8_t); //! Covariance matrix in compressed form +DECLARE_SOA_COLUMN(Rho1PtTgl, rho1PtTgl, int8_t); //! Covariance matrix in compressed form + +// Dynamic and expression columns +DECLARE_SOA_DYNAMIC_COLUMN(Sign, sign, //! Sign of the track eletric charge + [](float signed1Pt) -> short { return (signed1Pt > 0) ? 1 : -1; }); +DECLARE_SOA_DYNAMIC_COLUMN(Px, px, //! + [](float pt, float phi) -> float { + return pt * std::cos(phi); + }); +DECLARE_SOA_DYNAMIC_COLUMN(Py, py, //! + [](float pt, float phi) -> float { + return pt * std::sin(phi); + }); +DECLARE_SOA_DYNAMIC_COLUMN(Pz, pz, //! + [](float pt, float tgl) -> float { + return pt * tgl; + }); + +DECLARE_SOA_EXPRESSION_COLUMN(Eta, eta, float, //! + -1.f * nlog(ntan(o2::constants::math::PIQuarter - 0.5f * natan(aod::fwdtrackrealign::tgl)))); +DECLARE_SOA_EXPRESSION_COLUMN(Pt, pt, float, //! + ifnode(nabs(aod::fwdtrackrealign::signed1Pt) < o2::constants::math::Almost0, o2::constants::math::VeryBig, nabs(1.f / aod::fwdtrackrealign::signed1Pt))); +DECLARE_SOA_EXPRESSION_COLUMN(P, p, float, //! + ifnode((nabs(aod::fwdtrackrealign::signed1Pt) < o2::constants::math::Almost0) || (nabs(o2::constants::math::PIQuarter - 0.5f * natan(aod::fwdtrackrealign::tgl)) < o2::constants::math::Almost0), o2::constants::math::VeryBig, 0.5f * (ntan(o2::constants::math::PIQuarter - 0.5f * natan(aod::fwdtrackrealign::tgl)) + 1.f / ntan(o2::constants::math::PIQuarter - 0.5f * natan(aod::fwdtrackrealign::tgl))) / nabs(aod::fwdtrackrealign::signed1Pt))); +DECLARE_SOA_EXPRESSION_COLUMN(CXX, cXX, float, //! + aod::fwdtrackrealign::sigmaX* aod::fwdtrackrealign::sigmaX); +DECLARE_SOA_EXPRESSION_COLUMN(CXY, cXY, float, //! + (aod::fwdtrackrealign::rhoXY / 128.f) * (aod::fwdtrackrealign::sigmaX * aod::fwdtrackrealign::sigmaY)); +DECLARE_SOA_EXPRESSION_COLUMN(CYY, cYY, float, //! + aod::fwdtrackrealign::sigmaY* aod::fwdtrackrealign::sigmaY); +DECLARE_SOA_EXPRESSION_COLUMN(CPhiX, cPhiX, float, //! + (aod::fwdtrackrealign::rhoPhiX / 128.f) * (aod::fwdtrackrealign::sigmaPhi * aod::fwdtrackrealign::sigmaX)); +DECLARE_SOA_EXPRESSION_COLUMN(CPhiY, cPhiY, float, //! + (aod::fwdtrackrealign::rhoPhiY / 128.f) * (aod::fwdtrackrealign::sigmaPhi * aod::fwdtrackrealign::sigmaY)); +DECLARE_SOA_EXPRESSION_COLUMN(CPhiPhi, cPhiPhi, float, //! + aod::fwdtrackrealign::sigmaPhi* aod::fwdtrackrealign::sigmaPhi); +DECLARE_SOA_EXPRESSION_COLUMN(CTglX, cTglX, float, //! + (aod::fwdtrackrealign::rhoTglX / 128.f) * (aod::fwdtrackrealign::sigmaTgl * aod::fwdtrackrealign::sigmaX)); +DECLARE_SOA_EXPRESSION_COLUMN(CTglY, cTglY, float, //! + (aod::fwdtrackrealign::rhoTglY / 128.f) * (aod::fwdtrackrealign::sigmaTgl * aod::fwdtrackrealign::sigmaY)); +DECLARE_SOA_EXPRESSION_COLUMN(CTglPhi, cTglPhi, float, //! + (aod::fwdtrackrealign::rhoTglPhi / 128.f) * (aod::fwdtrackrealign::sigmaTgl * aod::fwdtrackrealign::sigmaPhi)); +DECLARE_SOA_EXPRESSION_COLUMN(CTglTgl, cTglTgl, float, //! + aod::fwdtrackrealign::sigmaTgl* aod::fwdtrackrealign::sigmaTgl); +DECLARE_SOA_EXPRESSION_COLUMN(C1PtY, c1PtY, float, //! + (aod::fwdtrackrealign::rho1PtY / 128.f) * (aod::fwdtrackrealign::sigma1Pt * aod::fwdtrackrealign::sigmaY)); +DECLARE_SOA_EXPRESSION_COLUMN(C1PtX, c1PtX, float, //! + (aod::fwdtrackrealign::rho1PtX / 128.f) * (aod::fwdtrackrealign::sigma1Pt * aod::fwdtrackrealign::sigmaX)); +DECLARE_SOA_EXPRESSION_COLUMN(C1PtPhi, c1PtPhi, float, //! + (aod::fwdtrackrealign::rho1PtPhi / 128.f) * (aod::fwdtrackrealign::sigma1Pt * aod::fwdtrackrealign::sigmaPhi)); +DECLARE_SOA_EXPRESSION_COLUMN(C1PtTgl, c1PtTgl, float, //! + (aod::fwdtrackrealign::rho1PtTgl / 128.f) * (aod::fwdtrackrealign::sigma1Pt * aod::fwdtrackrealign::sigmaTgl)); +DECLARE_SOA_EXPRESSION_COLUMN(C1Pt21Pt2, c1Pt21Pt2, float, //! + aod::fwdtrackrealign::sigma1Pt* aod::fwdtrackrealign::sigma1Pt); +} // namespace fwdtrackrealign // Tracks including MCH and/or MCH (plus optionally MFT) //! DECLARE_SOA_TABLE_FULL(StoredFwdTracksReAlign, "FwdTracksReAlign", "AOD", "FWDTRACKREALIGN", - fwdtrack::X, fwdtrack::Y, fwdtrack::Z, fwdtrack::Phi, fwdtrack::Tgl, - fwdtrack::Signed1Pt, - fwdtrack::Px, - fwdtrack::Py, - fwdtrack::Pz, - fwdtrack::Chi2, - fwdtrack::IsRemovable); + o2::soa::Index<>, fwdtrackrealign::CollisionId, fwdtrackrealign::FwdTrackId, fwdtrackrealign::TrackType, fwdtrackrealign::X, fwdtrackrealign::Y, fwdtrackrealign::Z, fwdtrackrealign::Phi, fwdtrackrealign::Tgl, + fwdtrackrealign::Signed1Pt, + fwdtrackrealign::Px, + fwdtrackrealign::Py, + fwdtrackrealign::Pz, + fwdtrackrealign::Sign, + fwdtrackrealign::Chi2, + fwdtrackrealign::IsRemovable); + +DECLARE_SOA_TABLE_FULL(StoredFwdTrksCovReAlign, "FwdCovsReAlign", "AOD", "FWDCOVREALIGN", //! + fwdtrackrealign::SigmaX, fwdtrackrealign::SigmaY, fwdtrackrealign::SigmaPhi, fwdtrackrealign::SigmaTgl, fwdtrackrealign::Sigma1Pt, + fwdtrackrealign::RhoXY, fwdtrackrealign::RhoPhiY, fwdtrackrealign::RhoPhiX, fwdtrackrealign::RhoTglX, fwdtrackrealign::RhoTglY, + fwdtrackrealign::RhoTglPhi, fwdtrackrealign::Rho1PtX, fwdtrackrealign::Rho1PtY, fwdtrackrealign::Rho1PtPhi, fwdtrackrealign::Rho1PtTgl); -DECLARE_SOA_EXTENDED_TABLE(FwdTracksReAlign, StoredFwdTracksReAlign, "FWDTRACKREALIGN", //! - aod::fwdtrack::Eta, - aod::fwdtrack::Pt, - aod::fwdtrack::P); +// extended table with expression columns that can be used as arguments of dynamic columns +DECLARE_SOA_EXTENDED_TABLE_USER(FwdTracksReAlign, StoredFwdTracksReAlign, "FWDTRKREALIGNEXT", //! + fwdtrackrealign::Pt, + fwdtrackrealign::Eta, + fwdtrackrealign::P); // the table name has here to be the one with EXT which is not nice and under study -DECLARE_SOA_TABLE_FULL(StoredFwdTrksCovReAlign, "FwdTrksCovReAlign", "AOD", "FWDTRKCOVREALIGN", //! - fwdtrack::SigmaX, fwdtrack::SigmaY, fwdtrack::SigmaPhi, fwdtrack::SigmaTgl, fwdtrack::Sigma1Pt, - fwdtrack::RhoXY, fwdtrack::RhoPhiY, fwdtrack::RhoPhiX, fwdtrack::RhoTglX, fwdtrack::RhoTglY, - fwdtrack::RhoTglPhi, fwdtrack::Rho1PtX, fwdtrack::Rho1PtY, fwdtrack::Rho1PtPhi, fwdtrack::Rho1PtTgl); +// extended table with expression columns that can be used as arguments of dynamic columns +DECLARE_SOA_EXTENDED_TABLE_USER(FwdTrksCovReAlign, StoredFwdTrksCovReAlign, "FWDCOVREALIGNEXT", //! + fwdtrackrealign::CXX, + fwdtrackrealign::CXY, + fwdtrackrealign::CYY, + fwdtrackrealign::CPhiX, + fwdtrackrealign::CPhiY, + fwdtrackrealign::CPhiPhi, + fwdtrackrealign::CTglX, + fwdtrackrealign::CTglY, + fwdtrackrealign::CTglPhi, + fwdtrackrealign::CTglTgl, + fwdtrackrealign::C1PtX, + fwdtrackrealign::C1PtY, + fwdtrackrealign::C1PtPhi, + fwdtrackrealign::C1PtTgl, + fwdtrackrealign::C1Pt21Pt2); // the table name has here to be the one with EXT which is not nice and under study -DECLARE_SOA_EXTENDED_TABLE(FwdTrksCovReAlign, StoredFwdTrksCovReAlign, "FWDTRKCOVREALIGN", //! - aod::fwdtrack::CXX, - aod::fwdtrack::CXY, - aod::fwdtrack::CYY, - aod::fwdtrack::CPhiX, - aod::fwdtrack::CPhiY, - aod::fwdtrack::CPhiPhi, - aod::fwdtrack::CTglX, - aod::fwdtrack::CTglY, - aod::fwdtrack::CTglPhi, - aod::fwdtrack::CTglTgl, - aod::fwdtrack::C1PtX, - aod::fwdtrack::C1PtY, - aod::fwdtrack::C1PtPhi, - aod::fwdtrack::C1PtTgl, - aod::fwdtrack::C1Pt21Pt2); +using FwdTrackRealign = FwdTracksReAlign::iterator; +using FwdTrkCovRealign = FwdTrksCovReAlign::iterator; +using FullFwdTracksRealign = soa::Join; +using FullFwdTrackRealign = FullFwdTracksRealign::iterator; } // namespace o2::aod #endif // COMMON_DATAMODEL_FWDTRACKREALIGNTABLES_H_ diff --git a/Common/TableProducer/muonRealignment.cxx b/Common/TableProducer/muonRealignment.cxx index 16e6fa366d4..9da3a27d97f 100644 --- a/Common/TableProducer/muonRealignment.cxx +++ b/Common/TableProducer/muonRealignment.cxx @@ -18,6 +18,7 @@ #include "Framework/AnalysisDataModel.h" #include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" +#include "Framework/ASoAHelpers.h" #include "CCDB/BasicCCDBManager.h" #include "CCDB/CCDBTimeStampUtils.h" @@ -38,6 +39,8 @@ #include "GlobalTracking/MatchGlobalFwd.h" #include "ReconstructionDataFormats/TrackFwd.h" #include "Common/DataModel/FwdTrackReAlignTables.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/CollisionAssociationTables.h" using namespace std; using namespace o2; @@ -48,6 +51,24 @@ using namespace o2::framework::expressions; const int fgNDetElemCh[10] = {4, 4, 4, 4, 18, 18, 26, 26, 26, 26}; const int fgSNDetElemCh[11] = {0, 4, 8, 12, 16, 34, 52, 78, 104, 130, 156}; +struct FwdTrkCovRealignInfo { + float sigX = 0.f; + float sigY = 0.f; + float sigPhi = 0.f; + float sigTgl = 0.f; + float sig1Pt = 0.f; + int8_t rhoXY = 0; + int8_t rhoPhiX = 0; + int8_t rhoPhiY = 0; + int8_t rhoTglX = 0; + int8_t rhoTglY = 0; + int8_t rhoTglPhi = 0; + int8_t rho1PtX = 0; + int8_t rho1PtY = 0; + int8_t rho1PtPhi = 0; + int8_t rho1PtTgl = 0; +}; + struct MuonRealignment { Produces realignFwdTrks; Produces realignFwdTrksCov; @@ -80,6 +101,7 @@ struct MuonRealignment { TGeoManager* geoRef = nullptr; Preslice perMuon = aod::fwdtrkcl::fwdtrackId; + Preslice fwdtrackIndicesPerCollision = aod::track_association::collisionId; int GetDetElemId(int iDetElemNumber) { @@ -200,7 +222,8 @@ struct MuonRealignment { mImproveCutChi2 = 2. * cfgSigmaCutImprove.value * cfgSigmaCutImprove.value; } - void process(aod::Collision const& collision, aod::FwdTracks const& tracks, aod::FwdTrkCls const& clusters, aod::BCsWithTimestamps const&) + template + void runMuonRealignment(TEvent const& collision, aod::BCsWithTimestamps const&, TMuons const&, TMuonCls const& clusters, AssocMuons const& fwdtrackIndices) { auto bc = collision.template bc_as(); if (fCurrentRun != bc.runNumber()) { @@ -273,96 +296,115 @@ struct MuonRealignment { } // Reserve storage for output table - realignFwdTrks.reserve(tracks.size()); - realignFwdTrksCov.reserve(tracks.size()); - - // Loop over forward tracks - for (auto const& track : tracks) { - if (track.has_collision()) { - if (track.trackType() == aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack || track.trackType() == aod::fwdtrack::ForwardTrackTypeEnum::MCHStandaloneTrack) { - - auto clustersSliced = clusters.sliceBy(perMuon, track.globalIndex()); // Slice clusters by muon id - mch::Track convertedTrack = mch::Track(); // Temporary variable to store re-aligned clusters - int clIndex = -1; - // Get re-aligned clusters associated to current track - for (auto const& cluster : clustersSliced) { - clIndex += 1; - - mch::Cluster* clusterMCH = new mch::Cluster(); - - math_utils::Point3D local; - math_utils::Point3D master; - master.SetXYZ(cluster.x(), cluster.y(), cluster.z()); - - // Transformation from reference geometry frame to new geometry frame - transformRef[cluster.deId()].MasterToLocal(master, local); - transformNew[cluster.deId()].LocalToMaster(local, master); - - clusterMCH->x = master.x(); - clusterMCH->y = master.y(); - clusterMCH->z = master.z(); - - uint32_t ClUId = mch::Cluster::buildUniqueId(static_cast(cluster.deId() / 100) - 1, cluster.deId(), clIndex); - clusterMCH->uid = ClUId; - clusterMCH->ex = cluster.isGoodX() ? 0.2 : 10.0; - clusterMCH->ey = cluster.isGoodY() ? 0.2 : 10.0; - - // Add transformed cluster into temporary variable - convertedTrack.createParamAtCluster(*clusterMCH); - LOGF(debug, "Track %d, cluster DE%d: x:%g y:%g z:%g", track.globalIndex(), cluster.deId(), cluster.x(), cluster.y(), cluster.z()); - LOGF(debug, "Track %d, re-aligned cluster DE%d: x:%g y:%g z:%g", track.globalIndex(), cluster.deId(), clusterMCH->getX(), clusterMCH->getY(), clusterMCH->getZ()); - } - - // Refit the re-aligned track - int removable = 0; - if (convertedTrack.getNClusters() != 0) { - removable = RemoveTrack(convertedTrack); - } else { - LOGF(fatal, "Muon track %d has no associated clusters.", track.globalIndex()); - } + realignFwdTrks.reserve(fwdtrackIndices.size()); + realignFwdTrksCov.reserve(fwdtrackIndices.size()); + + // Loop over forward tracks using association indices + FwdTrkCovRealignInfo fwdTrkCovRealignInfo; + for (auto const& muonId : fwdtrackIndices) { + auto muon = muonId.template fwdtrack_as(); + int muonRealignId = muon.globalIndex(); + if ((muon.trackType() == aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) || (muon.trackType() == aod::fwdtrack::ForwardTrackTypeEnum::MCHStandaloneTrack)) { + + auto clustersSliced = clusters.sliceBy(perMuon, muon.globalIndex()); // Slice clusters by muon id + mch::Track convertedTrack = mch::Track(); // Temporary variable to store re-aligned clusters + int clIndex = -1; + // Get re-aligned clusters associated to current track + for (auto const& cluster : clustersSliced) { + clIndex += 1; + + mch::Cluster* clusterMCH = new mch::Cluster(); + + math_utils::Point3D local; + math_utils::Point3D master; + master.SetXYZ(cluster.x(), cluster.y(), cluster.z()); + + // Transformation from reference geometry frame to new geometry frame + transformRef[cluster.deId()].MasterToLocal(master, local); + transformNew[cluster.deId()].LocalToMaster(local, master); + + clusterMCH->x = master.x(); + clusterMCH->y = master.y(); + clusterMCH->z = master.z(); + + uint32_t ClUId = mch::Cluster::buildUniqueId(static_cast(cluster.deId() / 100) - 1, cluster.deId(), clIndex); + clusterMCH->uid = ClUId; + clusterMCH->ex = cluster.isGoodX() ? 0.2 : 10.0; + clusterMCH->ey = cluster.isGoodY() ? 0.2 : 10.0; + + // Add transformed cluster into temporary variable + convertedTrack.createParamAtCluster(*clusterMCH); + LOGF(debug, "Track %d, cluster DE%d: x:%g y:%g z:%g", muon.globalIndex(), cluster.deId(), cluster.x(), cluster.y(), cluster.z()); + LOGF(debug, "Track %d, re-aligned cluster DE%d: x:%g y:%g z:%g", muonRealignId, cluster.deId(), clusterMCH->getX(), clusterMCH->getY(), clusterMCH->getZ()); + } - // Get the re-aligned track parameter: track param at the first cluster - mch::TrackParam trackParam = mch::TrackParam(convertedTrack.first()); - - // Convert MCH track to FWD track and get new parameters - auto fwdtrack = mMatching.MCHtoFwd(trackParam); - fwdtrack.setTrackChi2(trackParam.getTrackChi2() / convertedTrack.getNDF()); - float sigX = TMath::Sqrt(fwdtrack.getCovariances()(0, 0)); - float sigY = TMath::Sqrt(fwdtrack.getCovariances()(1, 1)); - float sigPhi = TMath::Sqrt(fwdtrack.getCovariances()(2, 2)); - float sigTgl = TMath::Sqrt(fwdtrack.getCovariances()(3, 3)); - float sig1Pt = TMath::Sqrt(fwdtrack.getCovariances()(4, 4)); - float rhoXY = (Char_t)(128. * fwdtrack.getCovariances()(0, 1) / (sigX * sigY)); - float rhoPhiX = (Char_t)(128. * fwdtrack.getCovariances()(0, 2) / (sigPhi * sigX)); - float rhoPhiY = (Char_t)(128. * fwdtrack.getCovariances()(1, 2) / (sigPhi * sigY)); - float rhoTglX = (Char_t)(128. * fwdtrack.getCovariances()(0, 3) / (sigTgl * sigX)); - float rhoTglY = (Char_t)(128. * fwdtrack.getCovariances()(1, 3) / (sigTgl * sigY)); - float rhoTglPhi = (Char_t)(128. * fwdtrack.getCovariances()(2, 3) / (sigTgl * sigPhi)); - float rho1PtX = (Char_t)(128. * fwdtrack.getCovariances()(0, 4) / (sig1Pt * sigX)); - float rho1PtY = (Char_t)(128. * fwdtrack.getCovariances()(1, 4) / (sig1Pt * sigY)); - float rho1PtPhi = (Char_t)(128. * fwdtrack.getCovariances()(2, 4) / (sig1Pt * sigPhi)); - float rho1PtTgl = (Char_t)(128. * fwdtrack.getCovariances()(3, 4) / (sig1Pt * sigTgl)); - - LOGF(debug, "TrackParm %d, x:%g y:%g z:%g phi:%g tgl:%g InvQPt:%g chi2:%g nClusters:%d", track.globalIndex(), track.x(), track.y(), track.z(), track.phi(), track.tgl(), track.signed1Pt(), track.chi2(), track.nClusters()); - LOGF(debug, "Re-aligned trackParm %d, x:%g y:%g z:%g phi:%g tgl:%g InvQPt:%g chi2:%g nClusters:%d removable:%d", track.globalIndex(), fwdtrack.getX(), fwdtrack.getY(), fwdtrack.getZ(), fwdtrack.getPhi(), fwdtrack.getTgl(), fwdtrack.getInvQPt(), fwdtrack.getTrackChi2(), convertedTrack.getNClusters(), removable); - // Fill refitted track info - realignFwdTrks(fwdtrack.getX(), fwdtrack.getY(), fwdtrack.getZ(), fwdtrack.getPhi(), fwdtrack.getTgl(), fwdtrack.getInvQPt(), fwdtrack.getTrackChi2(), removable); - realignFwdTrksCov(sigX, sigY, sigPhi, sigTgl, sig1Pt, rhoXY, rhoPhiX, rhoPhiY, rhoTglX, rhoTglY, rhoTglPhi, rho1PtX, rho1PtY, rho1PtPhi, rho1PtTgl); + // Refit the re-aligned track + int removable = 0; + if (convertedTrack.getNClusters() != 0) { + removable = RemoveTrack(convertedTrack); } else { - // Fill nothing for global muons - realignFwdTrks(-999., -999., -999., -999., -999., -999., -999., -999.); - realignFwdTrksCov(-999., -999., -999., -999., -999., 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + LOGF(fatal, "Muon track %d has no associated clusters.", muon.globalIndex()); } + + // Get the re-aligned track parameter: track param at the first cluster + mch::TrackParam trackParam = mch::TrackParam(convertedTrack.first()); + + // Convert MCH track to FWD track and get new parameters + auto fwdtrack = mMatching.MCHtoFwd(trackParam); + fwdtrack.setTrackChi2(trackParam.getTrackChi2() / convertedTrack.getNDF()); + fwdTrkCovRealignInfo.sigX = TMath::Sqrt(fwdtrack.getCovariances()(0, 0)); + fwdTrkCovRealignInfo.sigY = TMath::Sqrt(fwdtrack.getCovariances()(1, 1)); + fwdTrkCovRealignInfo.sigPhi = TMath::Sqrt(fwdtrack.getCovariances()(2, 2)); + fwdTrkCovRealignInfo.sigTgl = TMath::Sqrt(fwdtrack.getCovariances()(3, 3)); + fwdTrkCovRealignInfo.sig1Pt = TMath::Sqrt(fwdtrack.getCovariances()(4, 4)); + fwdTrkCovRealignInfo.rhoXY = (Char_t)(128. * fwdtrack.getCovariances()(0, 1) / (fwdTrkCovRealignInfo.sigX * fwdTrkCovRealignInfo.sigY)); + fwdTrkCovRealignInfo.rhoPhiX = (Char_t)(128. * fwdtrack.getCovariances()(0, 2) / (fwdTrkCovRealignInfo.sigPhi * fwdTrkCovRealignInfo.sigX)); + fwdTrkCovRealignInfo.rhoPhiY = (Char_t)(128. * fwdtrack.getCovariances()(1, 2) / (fwdTrkCovRealignInfo.sigPhi * fwdTrkCovRealignInfo.sigY)); + fwdTrkCovRealignInfo.rhoTglX = (Char_t)(128. * fwdtrack.getCovariances()(0, 3) / (fwdTrkCovRealignInfo.sigTgl * fwdTrkCovRealignInfo.sigX)); + fwdTrkCovRealignInfo.rhoTglY = (Char_t)(128. * fwdtrack.getCovariances()(1, 3) / (fwdTrkCovRealignInfo.sigTgl * fwdTrkCovRealignInfo.sigY)); + fwdTrkCovRealignInfo.rhoTglPhi = (Char_t)(128. * fwdtrack.getCovariances()(2, 3) / (fwdTrkCovRealignInfo.sigTgl * fwdTrkCovRealignInfo.sigPhi)); + fwdTrkCovRealignInfo.rho1PtX = (Char_t)(128. * fwdtrack.getCovariances()(0, 4) / (fwdTrkCovRealignInfo.sig1Pt * fwdTrkCovRealignInfo.sigX)); + fwdTrkCovRealignInfo.rho1PtY = (Char_t)(128. * fwdtrack.getCovariances()(1, 4) / (fwdTrkCovRealignInfo.sig1Pt * fwdTrkCovRealignInfo.sigY)); + fwdTrkCovRealignInfo.rho1PtPhi = (Char_t)(128. * fwdtrack.getCovariances()(2, 4) / (fwdTrkCovRealignInfo.sig1Pt * fwdTrkCovRealignInfo.sigPhi)); + fwdTrkCovRealignInfo.rho1PtTgl = (Char_t)(128. * fwdtrack.getCovariances()(3, 4) / (fwdTrkCovRealignInfo.sig1Pt * fwdTrkCovRealignInfo.sigTgl)); + LOGF(debug, "TrackParm %d, x:%g y:%g z:%g phi:%g tgl:%g InvQPt:%g chi2:%g nClusters:%d", muon.globalIndex(), muon.x(), muon.y(), muon.z(), muon.phi(), muon.tgl(), muon.signed1Pt(), muon.chi2(), muon.nClusters()); + LOGF(debug, "Re-aligned trackParm %d, x:%g y:%g z:%g phi:%g tgl:%g InvQPt:%g chi2:%g nClusters:%d removable:%d", muonRealignId, fwdtrack.getX(), fwdtrack.getY(), fwdtrack.getZ(), fwdtrack.getPhi(), fwdtrack.getTgl(), fwdtrack.getInvQPt(), fwdtrack.getTrackChi2(), convertedTrack.getNClusters(), removable); + // Fill refitted track info + realignFwdTrks(muonId.collisionId(), muonId.fwdtrackId(), muon.trackType(), fwdtrack.getX(), fwdtrack.getY(), fwdtrack.getZ(), fwdtrack.getPhi(), fwdtrack.getTgl(), fwdtrack.getInvQPt(), fwdtrack.getTrackChi2(), removable); + realignFwdTrksCov(fwdTrkCovRealignInfo.sigX, fwdTrkCovRealignInfo.sigY, fwdTrkCovRealignInfo.sigPhi, + fwdTrkCovRealignInfo.sigTgl, fwdTrkCovRealignInfo.sig1Pt, fwdTrkCovRealignInfo.rhoXY, + fwdTrkCovRealignInfo.rhoPhiX, fwdTrkCovRealignInfo.rhoPhiY, fwdTrkCovRealignInfo.rhoTglX, + fwdTrkCovRealignInfo.rhoTglY, fwdTrkCovRealignInfo.rhoTglPhi, fwdTrkCovRealignInfo.rho1PtX, + fwdTrkCovRealignInfo.rho1PtY, fwdTrkCovRealignInfo.rho1PtPhi, fwdTrkCovRealignInfo.rho1PtTgl); + muonRealignId++; } else { - // Fill nothing for tracks having no associated collision - realignFwdTrks(-999., -999., -999., -999., -999., -999., -999., -999.); - realignFwdTrksCov(-999., -999., -999., -999., -999., 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + // Fill nothing for global muons + realignFwdTrks(muonId.collisionId(), muonId.fwdtrackId(), muon.trackType(), 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, -1.0); + realignFwdTrksCov(0.f, 0.f, 0.f, 0.f, 0.f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + muonRealignId++; } } } + + void processMuonReAlignmentWithAssoc(aod::Collisions const& collisions, aod::BCsWithTimestamps const& bcs, aod::FwdTracks const& tracks, aod::FwdTrkCls const& clusters, aod::FwdTrackAssoc const& fwdtrackIndices) + { + for (auto& collision : collisions) { + auto muonIdsThisCollision = fwdtrackIndices.sliceBy(fwdtrackIndicesPerCollision, collision.globalIndex()); + runMuonRealignment(collision, bcs, tracks, clusters, muonIdsThisCollision); + } + } + PROCESS_SWITCH(MuonRealignment, processMuonReAlignmentWithAssoc, "Process to produce realigned muons based on associated fwdtracks info", true); +}; + +// Extends the fwdtracksrealign table with expression columns +struct MuonRealignmentSpawner { + Spawns realignFwdTrksCov; + Spawns realignFwdTrks; + void init(InitContext const&) {} }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{adaptAnalysisTask(cfgc)}; + return WorkflowSpec{adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc)}; } diff --git a/PWGDQ/Core/CMakeLists.txt b/PWGDQ/Core/CMakeLists.txt index 5ce05ab82d1..d19a66a68e6 100644 --- a/PWGDQ/Core/CMakeLists.txt +++ b/PWGDQ/Core/CMakeLists.txt @@ -21,7 +21,7 @@ o2physics_add_library(PWGDQCore AnalysisCompositeCut.cxx MCProng.cxx MCSignal.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2::DCAFitter O2::GlobalTracking O2Physics::AnalysisCore KFParticle::KFParticle) + PUBLIC_LINK_LIBRARIES O2::Framework O2::DCAFitter O2::GlobalTracking O2Physics::AnalysisCore KFParticle::KFParticle) o2physics_target_root_dictionary(PWGDQCore HEADERS AnalysisCut.h diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 8f5ad6f4332..8cf5853c9a7 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -131,7 +131,9 @@ class VarManager : public TObject TrackTPCPID = BIT(22), TrackMFT = BIT(23), ReducedTrackCollInfo = BIT(24), // TODO: remove it once new reduced data tables are produced for dielectron with ReducedTracksBarrelInfo - ReducedMuonCollInfo = BIT(25) // TODO: remove it once new reduced data tables are produced for dielectron with ReducedTracksBarrelInfo + ReducedMuonCollInfo = BIT(25), // TODO: remove it once new reduced data tables are produced for dielectron with ReducedTracksBarrelInfo + MuonRealign = BIT(26), + MuonCovRealign = BIT(27) }; enum PairCandidateType { @@ -1350,7 +1352,7 @@ void VarManager::FillPropagateMuon(const T& muon, const C& collision, float* val } } - if constexpr ((fillMap & MuonCov) > 0 || (fillMap & ReducedMuonCov) > 0) { + if constexpr ((fillMap & MuonCov) > 0 || (fillMap & ReducedMuonCov) > 0 || (fillMap & MuonCovRealign) > 0) { o2::dataformats::GlobalFwdTrack propmuon = PropagateMuon(muon, collision); values[kPt] = propmuon.getPt(); values[kX] = propmuon.getX(); @@ -2110,7 +2112,7 @@ void VarManager::FillTrack(T const& track, float* values) } // Quantities based on the basic table (contains just kine information and filter bits) - if constexpr ((fillMap & Track) > 0 || (fillMap & Muon) > 0 || (fillMap & ReducedTrack) > 0 || (fillMap & ReducedMuon) > 0) { + if constexpr ((fillMap & Track) > 0 || (fillMap & Muon) > 0 || (fillMap & MuonRealign) > 0 || (fillMap & ReducedTrack) > 0 || (fillMap & ReducedMuon) > 0) { values[kPt] = track.pt(); values[kSignedPt] = track.pt() * track.sign(); if (fgUsedVars[kP]) { @@ -2169,6 +2171,10 @@ void VarManager::FillTrack(T const& track, float* values) values[kIsDalitzLeg + i] = track.filteringFlags_bit(VarManager::kDalitzBits + i); } } + + if constexpr ((fillMap & MuonRealign) > 0) { + values[kMuonChi2] = track.chi2(); + } } // Quantities based on the barrel tables @@ -2495,7 +2501,7 @@ void VarManager::FillTrack(T const& track, float* values) values[kMuonTimeRes] = track.trackTimeRes(); } // Quantities based on the muon covariance table - if constexpr ((fillMap & ReducedMuonCov) > 0 || (fillMap & MuonCov) > 0) { + if constexpr ((fillMap & ReducedMuonCov) > 0 || (fillMap & MuonCov) > 0 || (fillMap & MuonCovRealign) > 0) { values[kX] = track.x(); values[kY] = track.y(); values[kZ] = track.z(); @@ -2552,7 +2558,7 @@ void VarManager::FillTrackCollision(T const& track, C const& collision, float* v } } } - if constexpr ((fillMap & MuonCov) > 0 || (fillMap & ReducedMuonCov) > 0) { + if constexpr ((fillMap & MuonCov) > 0 || (fillMap & MuonCovRealign) > 0 || (fillMap & ReducedMuonCov) > 0) { o2::dataformats::GlobalFwdTrack propmuonAtDCA = PropagateMuon(track, collision, kToDCA); diff --git a/PWGDQ/TableProducer/tableMaker.cxx b/PWGDQ/TableProducer/tableMaker.cxx index 3a212fdba9f..3abfcb317e7 100644 --- a/PWGDQ/TableProducer/tableMaker.cxx +++ b/PWGDQ/TableProducer/tableMaker.cxx @@ -37,6 +37,7 @@ #include "Common/DataModel/PIDResponse.h" #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/MftmchMatchingML.h" +#include "Common/DataModel/FwdTrackReAlignTables.h" #include "PWGDQ/DataModel/ReducedInfoTables.h" #include "PWGDQ/Core/VarManager.h" #include "PWGDQ/Core/HistogramManager.h" @@ -118,6 +119,7 @@ using MyMuons = soa::Join; using MyMuonsWithCov = soa::Join; using MyMuonsColl = soa::Join; using MyMuonsCollWithCov = soa::Join; +using MyMuonsRealignWithCov = soa::Join; using ExtBCs = soa::Join; constexpr static uint32_t gkEventFillMap = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision; @@ -137,6 +139,7 @@ constexpr static uint32_t gkTrackFillMapForElectronMuon = VarManager::ObjTypes:: constexpr static uint32_t gkMuonFillMap = VarManager::ObjTypes::Muon; constexpr static uint32_t gkMuonFillMapWithCov = VarManager::ObjTypes::Muon | VarManager::ObjTypes::MuonCov; constexpr static uint32_t gkMuonFillMapWithCovAmbi = VarManager::ObjTypes::Muon | VarManager::ObjTypes::MuonCov | VarManager::ObjTypes::AmbiMuon; +constexpr static uint32_t gkMuonRealignFillMapWithCov = VarManager::ObjTypes::MuonRealign | VarManager::ObjTypes::MuonCovRealign; constexpr static uint32_t gkTrackFillMapWithAmbi = VarManager::ObjTypes::Track | VarManager::ObjTypes::AmbiTrack; constexpr static uint32_t gkMFTFillMap = VarManager::ObjTypes::TrackMFT; @@ -844,8 +847,8 @@ struct TableMaker { } // end fullSkimming() // Templated function instantianed for all of the process functions - template - void fullSkimmingIndices(TEvent const& collision, aod::BCsWithTimestamps const&, TTracks const& tracksBarrel, TMuons const& tracksMuon, AssocTracks const& trackIndices, AssocMuons const& fwdtrackIndices) + template + void fullSkimmingIndices(TEvent const& collision, aod::BCsWithTimestamps const&, TTracks const& tracksBarrel, TMuons const& tracksMuon, TMuonsRealign const& tracksMuonRealign, AssocTracks const& trackIndices, AssocMuons const& fwdtrackIndices) { auto bc = collision.template bc_as(); if (fCurrentRun != bc.runNumber()) { @@ -1106,7 +1109,7 @@ struct TableMaker { muonBasic.reserve(tracksMuon.size()); muonExtra.reserve(tracksMuon.size()); muonInfo.reserve(tracksMuon.size()); - if constexpr (static_cast(TMuonFillMap & VarManager::ObjTypes::MuonCov)) { + if constexpr (static_cast((TMuonFillMap & VarManager::ObjTypes::MuonCov) || (TMuonRealignFillMap & VarManager::ObjTypes::MuonCovRealign))) { muonCov.reserve(tracksMuon.size()); } // loop over muons @@ -1152,13 +1155,48 @@ struct TableMaker { trackFilteringTag = static_cast(0); trackTempFilterMap = uint8_t(0); - VarManager::FillTrack(muon); + if constexpr (static_cast(TMuonRealignFillMap)) { + // Update muon information using realigned tracks + if (static_cast(muon.trackType()) > 2) { + // Update only MCH or MCH-MID tracks with realigned information + auto muonRealignSelected = tracksMuonRealign.select(aod::fwdtrackrealign::fwdtrackId == muonId.fwdtrackId() && aod::fwdtrackrealign::collisionId == collision.globalIndex()); + if (muonRealignSelected.size() == 1) { + for (const auto& muonRealign : muonRealignSelected) { + LOGF(debug, "Muon original - collisionId:%d x:%g y:%g z:%g phi:%g tgl:%g signed1pt:%g pt:%g p:%g eta:%g chi2:%g", muon.collisionId(), muon.x(), muon.y(), muon.z(), muon.phi(), muon.tgl(), muon.signed1Pt(), muon.pt(), muon.p(), muon.eta(), muon.chi2()); + LOGF(debug, "Muon realigned - collisionId:%d x:%g y:%g z:%g phi:%g tgl:%g signed1pt:%g pt:%g p:%g eta:%g chi2:%g", muonRealign.collisionId(), muonRealign.x(), muonRealign.y(), muonRealign.z(), muonRealign.phi(), muonRealign.tgl(), muonRealign.signed1Pt(), muonRealign.pt(), muonRealign.p(), muonRealign.eta(), muonRealign.chi2()); + VarManager::FillTrack(muonRealign); + + // recalculte pDca for global muon tracks + VarManager::FillTrackCollision(muonRealign, collision); + + if (fPropMuon) { + VarManager::FillPropagateMuon(muonRealign, collision); + } + } + } else { + LOGF(fatal, "Inconsistent size of realigned muon track candidates."); + } + } else { + // For global tracks, their matched muon tracks should be updated already - // recalculte pDca for global muon tracks - VarManager::FillTrackCollision(muon, collision); + VarManager::FillTrack(muon); - if (fPropMuon) { - VarManager::FillPropagateMuon(muon, collision); + // recalculte pDca for global muon tracks + VarManager::FillTrackCollision(muon, collision); + + if (fPropMuon) { + VarManager::FillPropagateMuon(muon, collision); + } + } + } else { + VarManager::FillTrack(muon); + + // recalculte pDca for global muon tracks + VarManager::FillTrackCollision(muon, collision); + + if (fPropMuon) { + VarManager::FillPropagateMuon(muon, collision); + } } if (fDoDetailedQA) { @@ -1213,17 +1251,17 @@ struct TableMaker { muonBasic(event.lastIndex(), newMatchIndex.find(muon.index())->second, -1, trackFilteringTag, VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kEta], VarManager::fgValues[VarManager::kPhi], muon.sign(), isAmbiguous); muonInfo(muon.collisionId(), collision.posX(), collision.posY(), collision.posZ()); - if constexpr (static_cast(TMuonFillMap & VarManager::ObjTypes::MuonCov)) { + if constexpr (static_cast((TMuonFillMap & VarManager::ObjTypes::MuonCov))) { if (fPropMuon) { muonExtra(muon.nClusters(), VarManager::fgValues[VarManager::kMuonPDca], VarManager::fgValues[VarManager::kMuonRAtAbsorberEnd], - muon.chi2(), muon.chi2MatchMCHMID(), muon.chi2MatchMCHMFT(), + VarManager::fgValues[VarManager::kMuonChi2], muon.chi2MatchMCHMID(), muon.chi2MatchMCHMFT(), muon.matchScoreMCHMFT(), muon.mchBitMap(), muon.midBitMap(), muon.midBoards(), muon.trackType(), VarManager::fgValues[VarManager::kMuonDCAx], VarManager::fgValues[VarManager::kMuonDCAy], muon.trackTime(), muon.trackTimeRes()); } else { muonExtra(muon.nClusters(), muon.pDca(), muon.rAtAbsorberEnd(), - muon.chi2(), muon.chi2MatchMCHMID(), muon.chi2MatchMCHMFT(), + VarManager::fgValues[VarManager::kMuonChi2], muon.chi2MatchMCHMID(), muon.chi2MatchMCHMFT(), muon.matchScoreMCHMFT(), muon.mchBitMap(), muon.midBitMap(), muon.midBoards(), muon.trackType(), muon.fwdDcaX(), muon.fwdDcaY(), muon.trackTime(), muon.trackTimeRes()); @@ -1623,7 +1661,16 @@ struct TableMaker { { for (auto& collision : collisions) { auto muonIdsThisCollision = fwdtrackIndices.sliceBy(fwdtrackIndicesPerCollision, collision.globalIndex()); - fullSkimmingIndices(collision, bcs, nullptr, tracksMuon, nullptr, muonIdsThisCollision); + fullSkimmingIndices(collision, bcs, nullptr, tracksMuon, nullptr, nullptr, muonIdsThisCollision); + } + } + + void processAssociatedRealignedMuonOnlyWithCov(MyEvents const& collisions, aod::BCsWithTimestamps const& bcs, + soa::Filtered const& tracksMuon, MyMuonsRealignWithCov const& tracksMuonRealign, aod::AmbiguousFwdTracks const&, aod::FwdTrackAssoc const& fwdtrackIndices) + { + for (auto& collision : collisions) { + auto muonIdsThisCollision = fwdtrackIndices.sliceBy(fwdtrackIndicesPerCollision, collision.globalIndex()); + fullSkimmingIndices(collision, bcs, nullptr, tracksMuon, tracksMuonRealign, nullptr, muonIdsThisCollision); } } @@ -1632,7 +1679,7 @@ struct TableMaker { { for (auto& collision : collisions) { auto muonIdsThisCollision = fwdtrackIndices.sliceBy(fwdtrackIndicesPerCollision, collision.globalIndex()); - fullSkimmingIndices(collision, bcs, nullptr, tracksMuon, nullptr, muonIdsThisCollision); + fullSkimmingIndices(collision, bcs, nullptr, tracksMuon, nullptr, nullptr, muonIdsThisCollision); } } @@ -1641,7 +1688,7 @@ struct TableMaker { { for (auto& collision : collisions) { auto muonIdsThisCollision = fwdtrackIndices.sliceBy(fwdtrackIndicesPerCollision, collision.globalIndex()); - fullSkimmingIndices(collision, bcs, nullptr, tracksMuon, nullptr, muonIdsThisCollision); + fullSkimmingIndices(collision, bcs, nullptr, tracksMuon, nullptr, nullptr, muonIdsThisCollision); } } @@ -1803,6 +1850,7 @@ struct TableMaker { PROCESS_SWITCH(TableMaker, processAmbiguousMuonOnlyWithCov, "Build muon-only with cov DQ skimmed data model with QA plots for ambiguous muons", false); PROCESS_SWITCH(TableMaker, processAmbiguousBarrelOnly, "Build barrel-only DQ skimmed data model with QA plots for ambiguous tracks", false); PROCESS_SWITCH(TableMaker, processAssociatedMuonOnlyWithCov, "Build muon-only with cov DQ skimmed data model using track-collision association tables", false); + PROCESS_SWITCH(TableMaker, processAssociatedRealignedMuonOnlyWithCov, "Build realigned muon-only with cov DQ skimmed data model using track-collision association tables", false); PROCESS_SWITCH(TableMaker, processAssociatedMuonOnlyWithCovAndCentMults, "Build muon-only with cov DQ skimmed data model using track-collision association tables and centrality", false); PROCESS_SWITCH(TableMaker, processAssociatedMuonOnlyWithCovAndMults, "Build muon-only with cov DQ skimmed data model using track-collision association tables and multiplicity", false); PROCESS_SWITCH(TableMaker, processMuonsAndMFT, "Build MFT and muons DQ skimmed data model", false); From fdd8c47ed9df89c19759315d98da7cc656705860 Mon Sep 17 00:00:00 2001 From: rolavick Date: Fri, 14 Feb 2025 01:18:04 +0100 Subject: [PATCH 0211/1650] [PWGUD] Modification of personal task (#9951) Co-authored-by: ALICE Action Bot --- PWGUD/Tasks/upcTauCentralBarrelRL.cxx | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/PWGUD/Tasks/upcTauCentralBarrelRL.cxx b/PWGUD/Tasks/upcTauCentralBarrelRL.cxx index a79710c34a4..bbcfbb4e63c 100644 --- a/PWGUD/Tasks/upcTauCentralBarrelRL.cxx +++ b/PWGUD/Tasks/upcTauCentralBarrelRL.cxx @@ -100,6 +100,8 @@ struct UpcTauRl { Configurable cutMinTPCnClsXrows{"cutMinTPCnClsXrows", 70, {"Global track cut"}}; Configurable cutMinTPCnClsXrowsOverNcls{"cutMinTPCnClsXrowsOverNcls", 0.8f, {"Global track cut"}}; Configurable cutMaxTPCchi2{"cutMaxTPCchi2", 4.f, {"Global track cut"}}; + Configurable cutGoodITSTPCmatching{"cutGoodITSTPCmatching", true, {"Global track cut"}}; + Configurable cutMaxTOFchi2{"cutMaxTOFchi2", 3.f, {"Global track cut"}}; } cutGlobalTrack; struct : ConfigurableGroup { @@ -122,6 +124,8 @@ struct UpcTauRl { Configurable cutMaxElectronNsigmaKa{"cutMaxElectronNsigmaKa", 4.0, {"Good Ka hypo out. Upper n sigma cut on Ka hypo of selected electron. What is less till lower cut goes away."}}; Configurable cutMinElectronNsigmaPr{"cutMinElectronNsigmaPr", -4.0, {"Good Pr hypo out. Lower n sigma cut on Pr hypo of selected electron. What is more till upper cut goes away."}}; Configurable cutMaxElectronNsigmaPr{"cutMaxElectronNsigmaPr", 4.0, {"Good Pr hypo out. Upper n sigma cut on Pr hypo of selected electron. What is less till lower cut goes away."}}; + Configurable cutMinElectronTofNsigmaEl{"cutMinElectronTofNsigmaEl", 3.0, {"Good el TOF hypo in. Upper n sigma cut on el hypo of selected electron. What is more goes away."}}; + Configurable cutMaxElectronTofNsigmaEl{"cutMaxElectronTofNsigmaEl", -3.0, {"Good el TOF hypo in. Lower n sigma cut on el hypo of selected electron. What is less goes away."}}; Configurable cutMinElectronTofNsigmaKa{"cutMinElectronTofNsigmaKa", -4.0, {"Good Ka TOF hypo out. Lower n sigma cut on Ka TOF hypo of selected electron. What is more till upper cut goes away."}}; Configurable cutMaxElectronTofNsigmaKa{"cutMaxElectronTofNsigmaKa", 4.0, {"Good Ka TOF hypo out. Upper n sigma cut on Ka TOF hypo of selected electron. What is less till lower cut goes away."}}; Configurable cutPionHasTOF{"cutPionHasTOF", true, {"Pion is required to hit TOF."}}; @@ -130,6 +134,8 @@ struct UpcTauRl { Configurable cutMaxPionNsigmaPi{"cutMaxPionNsigmaPi", -4.0, {"Good pi hypo in. Lower n sigma cut on pi hypo of selected electron. What is less goes away."}}; Configurable cutMinPionNsigmaKa{"cutMinPionNsigmaKa", -4.0, {"Good Ka hypo out. Lower n sigma cut on Ka hypo of selected electron. What is more till upper cut goes away."}}; Configurable cutMaxPionNsigmaKa{"cutMaxPionNsigmaKa", 4.0, {"Good Ka hypo out. Upper n sigma cut on Ka hypo of selected electron. What is less till lower cut goes away."}}; + Configurable cutMinPionTofNsigmaPi{"cutMinPionTofNsigmaPi", 4.0, {"Good pi TOF hypo in. Upper n sigma cut on pi hypo of selected electron. What is more goes away."}}; + Configurable cutMaxPionTofNsigmaPi{"cutMaxPionTofNsigmaPi", -4.0, {"Good pi TOF hypo in. Lower n sigma cut on pi hypo of selected electron. What is less goes away."}}; Configurable cutElectronPt{"cutElectronPt", 0.9, {"Pt, where PiKaon invariant mass histos will split."}}; } cutTauEvent; @@ -155,7 +161,7 @@ struct UpcTauRl { ConfigurableAxis zzAxisEta{"zzAxisEta", {50, -1.2, 1.2}, "Pseudorapidity (a.u.)"}; ConfigurableAxis zzAxisRap{"zzAxisRap", {50, -1.2, 1.2}, "Rapidity (a.u.)"}; ConfigurableAxis zzAxisFraction{"zzAxisFraction", {500, 0., 1.}, "Fraction (-)"}; - ConfigurableAxis zzAxisMirrorFraction{"zzAxisMirrorFraction", {500, 0., 1.}, "Fraction (-)"}; + ConfigurableAxis zzAxisMirrorFraction{"zzAxisMirrorFraction", {500, -1., 1.}, "Fraction (-)"}; ConfigurableAxis zzAxisAcoplanarity{"zzAxisAcoplanarity", {32, 0.0, o2::constants::math::PI}, "Acoplanarity (rad)"}; ConfigurableAxis zzAxisCollinearity{"zzAxisCollinearity", {200, 0, 20}, "Collinearity (-)"}; ConfigurableAxis zzAxisTPCdEdx{"zzAxisTPCdEdx", {2000, 0., 200.}, "TPC dE/dx (a.u.)"}; @@ -834,6 +840,15 @@ struct UpcTauRl { return false; if (track.tpcChi2NCl() > cutGlobalTrack.cutMaxTPCchi2) return false; // TPC chi2 + if (cutGlobalTrack.cutGoodITSTPCmatching) { + if (track.itsChi2NCl() < 0.) + return false; // TPC chi2 + } + // TOF + if (track.hasTOF()) { + if (track.tpcChi2NCl() > cutGlobalTrack.cutMaxTOFchi2) + return false; // TOF chi2 + } return true; } @@ -956,6 +971,8 @@ struct UpcTauRl { if (cutTauEvent.cutElectronHasTOF && !electronCandidate.hasTOF()) return false; if (electronCandidate.hasTOF()) { + if (electronCandidate.tofNSigmaEl() < cutTauEvent.cutMaxElectronTofNsigmaEl || electronCandidate.tofNSigmaEl() > cutTauEvent.cutMinElectronTofNsigmaEl) + return false; if (electronCandidate.tofNSigmaPr() > cutTauEvent.cutMinElectronNsigmaPr && electronCandidate.tofNSigmaPr() < cutTauEvent.cutMaxElectronNsigmaPr) return false; if (momentum(electronCandidate.px(), electronCandidate.py(), electronCandidate.pz()) < 1.0) { @@ -977,6 +994,8 @@ struct UpcTauRl { if (cutTauEvent.cutPionHasTOF && !pionCandidate.hasTOF()) return false; if (pionCandidate.hasTOF()) { + if (pionCandidate.tofNSigmaPi() < cutTauEvent.cutMaxPionTofNsigmaPi || pionCandidate.tofNSigmaPi() > cutTauEvent.cutMinPionTofNsigmaPi) + return false; if (pionCandidate.tofNSigmaPr() > cutTauEvent.cutMinElectronNsigmaPr && pionCandidate.tofNSigmaPr() < cutTauEvent.cutMaxElectronNsigmaPr) return false; if (momentum(pionCandidate.px(), pionCandidate.py(), pionCandidate.pz()) < 1.0) { From a0fe7701e488e8ca0f1e7f0760b8218111131de4 Mon Sep 17 00:00:00 2001 From: Luca Barioglio Date: Fri, 14 Feb 2025 03:42:48 +0100 Subject: [PATCH 0212/1650] [PWGLF] Fix Qvector components with ep tables (#9954) --- PWGLF/TableProducer/QC/flowQC.cxx | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/PWGLF/TableProducer/QC/flowQC.cxx b/PWGLF/TableProducer/QC/flowQC.cxx index 6e33f5561f0..b5fa4586f71 100644 --- a/PWGLF/TableProducer/QC/flowQC.cxx +++ b/PWGLF/TableProducer/QC/flowQC.cxx @@ -259,30 +259,30 @@ struct flowQC { float centrality = getCentrality(collision); // EP method + float QmodFT0A_EP = collision.qFT0A(); float psiFT0A_EP = collision.psiFT0A(); - float QxFT0A_EP = std::cos(2 * psiFT0A_EP); - float QyFT0A_EP = std::sin(2 * psiFT0A_EP); - float QmodFT0A_EP = std::hypot(QxFT0A_EP, QyFT0A_EP); + float QxFT0A_EP = QmodFT0A_EP * std::cos(2 * psiFT0A_EP); + float QyFT0A_EP = QmodFT0A_EP * std::sin(2 * psiFT0A_EP); + float QmodFT0C_EP = collision.qFT0C(); float psiFT0C_EP = collision.psiFT0C(); - float QxFT0C_EP = std::cos(2 * psiFT0C_EP); - float QyFT0C_EP = std::sin(2 * psiFT0C_EP); - float QmodFT0C_EP = std::hypot(QxFT0C_EP, QyFT0C_EP); + float QxFT0C_EP = QmodFT0C_EP * std::cos(2 * psiFT0C_EP); + float QyFT0C_EP = QmodFT0C_EP * std::sin(2 * psiFT0C_EP); + float QmodTPCl_EP = collision.qTPCL(); float psiTPCl_EP = collision.psiTPCL(); - float QxTPCl_EP = std::cos(2 * psiTPCl_EP); - float QyTPCl_EP = std::sin(2 * psiTPCl_EP); - float QmodTPCl_EP = std::hypot(QxTPCl_EP, QyTPCl_EP); + float QxTPCl_EP = QmodTPCl_EP * std::cos(2 * psiTPCl_EP); + float QyTPCl_EP = QmodTPCl_EP * std::sin(2 * psiTPCl_EP); + float QmodTPCr_EP = collision.qTPCR(); float psiTPCr_EP = collision.psiTPCR(); - float QxTPCr_EP = std::cos(2 * psiTPCr_EP); - float QyTPCr_EP = std::sin(2 * psiTPCr_EP); - float QmodTPCr_EP = std::hypot(QxTPCr_EP, QyTPCr_EP); + float QxTPCr_EP = QmodTPCr_EP * std::cos(2 * psiTPCr_EP); + float QyTPCr_EP = QmodTPCr_EP * std::sin(2 * psiTPCr_EP); + float QmodTPC_EP = collision.qTPC(); float psiTPC_EP = collision.psiTPC(); - float QxTPC_EP = std::cos(2 * psiTPC_EP); - float QyTPC_EP = std::sin(2 * psiTPC_EP); - float QmodTPC_EP = std::hypot(QxTPC_EP, QyTPC_EP); + float QxTPC_EP = QmodTPC_EP * std::cos(2 * psiTPC_EP); + float QyTPC_EP = QmodTPC_EP * std::sin(2 * psiTPC_EP); // Qvec method float QxFT0A_Qvec = collision.qvecFT0ARe(); From 73653a9f424de5386677e2b3b97337bcca57b2e1 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Fri, 14 Feb 2025 13:32:59 +0900 Subject: [PATCH 0213/1650] [PWGEM/Dilepton] remove unused configurable variable (#9961) --- PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx | 1 - 1 file changed, 1 deletion(-) diff --git a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx index 618699bbfee..a08fbdff724 100644 --- a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx +++ b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx @@ -184,7 +184,6 @@ struct TreeCreatorElectronMLDDA { Configurable cfg_max_mass_lambda{"cfg_max_mass_lambda", 1.12, "max mass for Lambda rejection"}; Configurable cfg_min_cospa{"cfg_min_cospa", 0.999, "min cospa for v0"}; Configurable cfg_max_dcadau{"cfg_max_dcadau", 0.5, "max distance between 2 legs for v0"}; - Configurable cfg_min_radius{"cfg_min_radius", 1.0, "min rxy for v0"}; Configurable cfg_min_cr2findable_ratio_tpc{"cfg_min_cr2findable_ratio_tpc", 0.8, "min. TPC Ncr/Nf ratio"}; Configurable cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 0.7, "max fraction of shared clusters in TPC"}; Configurable cfg_min_ncrossedrows_tpc{"cfg_min_ncrossedrows_tpc", 70, "min ncrossed rows"}; From fa53e66bb3ff8b96b2051341cb6d2b816b1f66c8 Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Fri, 14 Feb 2025 06:41:58 +0100 Subject: [PATCH 0214/1650] [PWGLF] Use concepts everywhere, not only for MC (#9940) --- PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx index c0c182cef88..f2960485a6f 100644 --- a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx +++ b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx @@ -479,7 +479,7 @@ struct nucleiSpectra { float getCentrality(Tcoll const& collision) { float centrality = 1.; - if constexpr (std::is_same::value || std::is_same::value || std::is_same::value) { + if constexpr (o2::aod::HasCentrality) { if (cfgCentralityEstimator == nuclei::centDetectors::kFV0A) { centrality = collision.centFV0A(); } else if (cfgCentralityEstimator == nuclei::centDetectors::kFT0M) { @@ -640,13 +640,18 @@ struct nucleiSpectra { } if (cfgFlowHist->get(iS) && doprocessDataFlow) { - if constexpr (std::is_same::value) { + if constexpr (requires { + collision.psiFT0C(); + }) { auto deltaPhiInRange = RecoDecay::constrainAngle(fvector.phi() - collision.psiFT0C(), 0.f, 2); auto v2 = std::cos(2.0 * deltaPhiInRange); nuclei::hFlowHists[iC][iS]->Fill(collision.centFT0C(), fvector.pt(), nSigma[0][iS], tofMasses[iS], v2, track.itsNCls(), track.tpcNClsFound()); } } else if (cfgFlowHist->get(iS) && doprocessDataFlowAlternative) { - if constexpr (std::is_same::value) { + if constexpr (requires { + collision.qvecFT0CIm(); + collision.qvecFT0CRe(); + }) { auto deltaPhiInRange = RecoDecay::constrainAngle(fvector.phi() - computeEventPlane(collision.qvecFT0CIm(), collision.qvecFT0CRe()), 0.f, 2); auto v2 = std::cos(2.0 * deltaPhiInRange); nuclei::hFlowHists[iC][iS]->Fill(collision.centFT0C(), fvector.pt(), nSigma[0][iS], tofMasses[iS], v2, track.itsNCls(), track.tpcNClsFound()); @@ -672,7 +677,9 @@ struct nucleiSpectra { } } if (flag & (kProton | kDeuteron | kTriton | kHe3 | kHe4) || doprocessMC) { /// ignore PID pre-selections for the MC - if constexpr (std::is_same::value) { + if constexpr (requires { + collision.psiFT0A(); + }) { nuclei::candidates_flow.emplace_back(NucleusCandidateFlow{ collision.centFV0A(), collision.centFT0M(), @@ -689,7 +696,9 @@ struct nucleiSpectra { collision.qTPCL(), collision.qTPCR(), }); - } else if constexpr (std::is_same::value) { + } else if constexpr (requires { + collision.qvecFT0AIm(); + }) { nuclei::candidates_flow.emplace_back(NucleusCandidateFlow{ collision.centFV0A(), collision.centFT0M(), From 83e3def38d60c967368e7380a7b10aa2df10f51d Mon Sep 17 00:00:00 2001 From: GijsvWeelden <55794847+GijsvWeelden@users.noreply.github.com> Date: Fri, 14 Feb 2025 08:40:35 +0100 Subject: [PATCH 0215/1650] [PWGLF] Update V0 Selector (#9942) --- .../TableProducer/Strangeness/v0selector.cxx | 328 ++++++++++-------- 1 file changed, 183 insertions(+), 145 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/v0selector.cxx b/PWGLF/TableProducer/Strangeness/v0selector.cxx index 454fce2c6da..7d06871d78c 100644 --- a/PWGLF/TableProducer/Strangeness/v0selector.cxx +++ b/PWGLF/TableProducer/Strangeness/v0selector.cxx @@ -15,6 +15,7 @@ #include #include +#include #include #include "Framework/runDataProcessing.h" @@ -36,27 +37,44 @@ struct V0SelectorTask { Produces v0FlagTable; Configurable> K0SPtBins{"K0SPtBins", {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 10.0, 15.0, 20.0, 25.0, 30.0}, "K0S pt Vals"}; - Configurable> K0SRVals{"K0SRVals", {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}, "K0S min R values"}; - Configurable> K0SCtauVals{"K0SCtauVals", {20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0}, "K0S max ctau values"}; - Configurable> K0SCosPAVals{"K0SCosPAVals", {0.997, 0.997, 0.997, 0.997, 0.997, 0.997, 0.997, 0.997, 0.997, 0.997}, "K0S min cosPA values"}; - Configurable> K0SDCAVals{"K0SDCAVals", {0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.15, 0.15, 0.10, 0.10}, "K0S min DCA +- values"}; - Configurable> K0SDCAdVals{"K0SDCAdVals", {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}, "K0S max DCAd values"}; + Configurable> K0SRminVals{"K0SRminVals", {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}, "K0S min R values"}; + Configurable> K0SRmaxVals{"K0SRmaxVals", {40.0, 40.0, 40.0, 40.0, 40.0, 40.0, 40.0, 40.0, 40.0, 40.0}, "K0S max R values"}; + Configurable> K0SCtauminVals{"K0SCtauminVals", {-1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3}, "K0S min ctau values"}; + Configurable> K0SCtaumaxVals{"K0SCtaumaxVals", {20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0}, "K0S max ctau values"}; + Configurable> K0SCosPAminVals{"K0SCosPAminVals", {0.997, 0.997, 0.997, 0.997, 0.997, 0.997, 0.997, 0.997, 0.997, 0.997}, "K0S min cosPA values"}; + Configurable> K0SCosPAmaxVals{"K0SCosPAmaxVals", {-1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3}, "K0S max cosPA values"}; + Configurable> K0SDCAminVals{"K0SDCAminVals", {0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.15, 0.15, 0.10, 0.10}, "K0S min DCA +- values"}; + Configurable> K0SDCAmaxVals{"K0SDCAmaxVals", {-1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3}, "K0S max DCA +- values"}; + Configurable> K0SDCAdminVals{"K0SDCAdminVals", {-1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3}, "K0S min DCAd values"}; + Configurable> K0SDCAdmaxVals{"K0SDCAdmaxVals", {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}, "K0S max DCAd values"}; Configurable> LambdaPtBins{"LambdaPtBins", {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 10.0, 15.0, 20.0}, "Lambda pt Vals"}; - Configurable> LambdaRVals{"LambdaRVals", {1.0, 10.0, 10.0, 10.0, 10.0, 10.0, 20.0, 20.0}, "Lambda min R values"}; - Configurable> LambdaCtauVals{"LambdaCtauVals", {22.5, 25.0, 25.0, 25.0, 25.0, 25.0, 25.0, 25.0}, "Lambda max ctau values"}; - Configurable> LambdaCosPAVals{"LambdaCosPAVals", {0.997, 0.997, 0.997, 0.997, 0.997, 0.997, 0.997, 0.997}, "Lambda min cosPA values"}; - Configurable> LambdaDCApVals{"LambdaDCApVals", {0.20, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10}, "Lambda min DCA+ values"}; - Configurable> LambdaDCAnVals{"LambdaDCAnVals", {0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.15, 0.15}, "Lambda min DCA- values"}; - Configurable> LambdaDCAdVals{"LambdaDCAdVals", {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}, "Lambda max DCAd values"}; + Configurable> LambdaRminVals{"LambdaRminVals", {1.0, 10.0, 10.0, 10.0, 10.0, 10.0, 20.0, 20.0}, "Lambda min R values"}; + Configurable> LambdaRmaxVals{"LambdaRmaxVals", {40.0, 40.0, 40.0, 40.0, 40.0, 40.0, 40.0, 40.0}, "Lambda max R values"}; + Configurable> LambdaCtauminVals{"LambdaCtauminVals", {-1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3}, "Lambda min ctau values"}; + Configurable> LambdaCtaumaxVals{"LambdaCtaumaxVals", {22.5, 25.0, 25.0, 25.0, 25.0, 25.0, 25.0, 25.0}, "Lambda max ctau values"}; + Configurable> LambdaCosPAminVals{"LambdaCosPAminVals", {0.997, 0.997, 0.997, 0.997, 0.997, 0.997, 0.997, 0.997}, "Lambda min cosPA values"}; + Configurable> LambdaCosPAmaxVals{"LambdaCosPAmaxVals", {-1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3}, "Lambda max cosPA values"}; + Configurable> LambdaDCApminVals{"LambdaDCApminVals", {0.20, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10}, "Lambda min DCA+ values"}; + Configurable> LambdaDCApmaxVals{"LambdaDCApmaxVals", {-1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3}, "Lambda max DCA+ values"}; + Configurable> LambdaDCAnminVals{"LambdaDCAnminVals", {0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.15, 0.15}, "Lambda min DCA- values"}; + Configurable> LambdaDCAnmaxVals{"LambdaDCAnmaxVals", {-1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3}, "Lambda max DCA- values"}; + Configurable> LambdaDCAdminVals{"LambdaDCAdminVals", {-1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3}, "Lambda max DCAd values"}; + Configurable> LambdaDCAdmaxVals{"LambdaDCAdmaxVals", {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}, "Lambda max DCAd values"}; Configurable> AntiLambdaPtBins{"AntiLambdaPtBins", {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 10.0, 15.0, 20.0}, "AntiLambda pt Vals"}; - Configurable> AntiLambdaRVals{"AntiLambdaRVals", {10.0, 10.0, 10.0, 10.0, 20.0, 20.0, 20.0, 20.0}, "AntiLambda min R values"}; - Configurable> AntiLambdaCtauVals{"AntiLambdaCtauVals", {22.5, 25.0, 25.0, 25.0, 25.0, 25.0, 25.0, 25.0}, "AntiLambda max ctau values"}; - Configurable> AntiLambdaCosPAVals{"AntiLambdaCosPAVals", {0.997, 0.997, 0.997, 0.997, 0.997, 0.997, 0.997, 0.997}, "AntiLambda min cosPA values"}; - Configurable> AntiLambdaDCApVals{"AntiLambdaDCApVals", {0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20}, "AntiLambda min DCA+ values"}; - Configurable> AntiLambdaDCAnVals{"AntiLambdaDCAnVals", {0.20, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10}, "AntiLambda min DCA- values"}; - Configurable> AntiLambdaDCAdVals{"AntiLambdaDCAdVals", {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}, "AntiLambda max DCAd values"}; + Configurable> AntiLambdaRminVals{"AntiLambdaRminVals", {10.0, 10.0, 10.0, 10.0, 20.0, 20.0, 20.0, 20.0}, "AntiLambda min R values"}; + Configurable> AntiLambdaRmaxVals{"AntiLambdaRmaxVals", {40.0, 40.0, 40.0, 40.0, 40.0, 40.0, 40.0, 40.0}, "AntiLambda max R values"}; + Configurable> AntiLambdaCtauminVals{"AntiLambdaCtauminVals", {-1e-3, -1e-3, -1e-3, -1e-3, -1e-3, -1e-3, -1e-3, -1e-3}, "AntiLambda min ctau values"}; + Configurable> AntiLambdaCtaumaxVals{"AntiLambdaCtaumaxVals", {22.5, 25.0, 25.0, 25.0, 25.0, 25.0, 25.0, 25.0}, "AntiLambda max ctau values"}; + Configurable> AntiLambdaCosPAminVals{"AntiLambdaCosPAminVals", {0.997, 0.997, 0.997, 0.997, 0.997, 0.997, 0.997, 0.997}, "AntiLambda min cosPA values"}; + Configurable> AntiLambdaCosPAmaxVals{"AntiLambdaCosPAmaxVals", {-1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3}, "AntiLambda max cosPA values"}; + Configurable> AntiLambdaDCApminVals{"AntiLambdaDCApminVals", {0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20}, "AntiLambda min DCA+ values"}; + Configurable> AntiLambdaDCApmaxVals{"AntiLambdaDCApmaxVals", {-1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3}, "AntiLambda max DCA+ values"}; + Configurable> AntiLambdaDCAnminVals{"AntiLambdaDCAnminVals", {0.20, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10}, "AntiLambda min DCA- values"}; + Configurable> AntiLambdaDCAnmaxVals{"AntiLambdaDCAnmaxVals", {-1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3}, "AntiLambda max DCA- values"}; + Configurable> AntiLambdaDCAdminVals{"AntiLambdaDCAdminVals", {-1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3, -1e3}, "AntiLambda min DCAd values"}; + Configurable> AntiLambdaDCAdmaxVals{"AntiLambdaDCAdmaxVals", {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}, "AntiLambda max DCAd values"}; Configurable massCuts{"massCuts", true, "Apply mass cuts"}; Configurable competingMassCuts{"competingMassCuts", true, "Apply competing mass cuts"}; @@ -68,7 +86,7 @@ struct V0SelectorTask { Configurable> AntiLambdaMassHighVals{"AntiLambdaMassHighVals", {1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125, 1.125}, "AntiLambda mass cut upper values (MeV)"}; Configurable randomSelection{"randomSelection", true, "Randomly select V0s"}; - Configurable> K0SFraction{"randomSelectionFraction", {2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0}, "Fraction of K0S to randomly select"}; + Configurable> K0SFraction{"K0SFraction", {2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0}, "Fraction of K0S to randomly select"}; Configurable> LambdaFraction{"LambdaFraction", {2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0}, "Fraction of Lambda to randomly select"}; Configurable> AntiLambdaFraction{"AntiLambdaFraction", {2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0}, "Fraction of AntiLambda to randomly select"}; @@ -76,178 +94,198 @@ struct V0SelectorTask { { } - template - bool K0SCuts(T const& collision, U const& v0) + int getPtBin(float pt, std::vector ptBins) { - if (v0.pt() < K0SPtBins->at(0) || v0.pt() > K0SPtBins->at(K0SPtBins->size() - 1)) { - return false; - } - int ptBin = std::distance(K0SPtBins->begin(), std::upper_bound(K0SPtBins->begin(), K0SPtBins->end(), v0.pt())) - 1; - if (v0.v0radius() < K0SRVals->at(ptBin)) { - return false; - } - if (v0.v0cosPA() < K0SCosPAVals->at(ptBin)) { - return false; - } - if (v0.dcaV0daughters() > K0SDCAdVals->at(ptBin)) { - return false; + if (pt < ptBins.at(0)) + return -1; + if (pt > ptBins.at(ptBins.size() - 1)) + return -2; + + for (unsigned int i = 0; i < ptBins.size() - 1; i++) { + if (pt >= ptBins.at(i) && pt < ptBins.at(i + 1)) { + return i; + } } - if (TMath::Abs(v0.dcapostopv()) < K0SDCAVals->at(ptBin)) { - return false; + return -3; + } + bool cuts(std::vector values, std::vector mincuts, std::vector maxcuts) + { + for (unsigned int i = 0; i < values.size(); i++) { + float val = values.at(i); + float min = mincuts.at(i); + float max = maxcuts.at(i); + + if (val < min && min > -1e2) + return false; + if (val > max && max > -1e2) + return false; } - if (TMath::Abs(v0.dcanegtopv()) < K0SDCAVals->at(ptBin)) { + return true; + } + template + bool K0SCuts(T const& collision, U const& v0) + { + int ptBin = getPtBin(v0.pt(), K0SPtBins); + if (ptBin < 0) return false; + + // This is the only time we need to check min and max simultaneously + // K0S and Lambda(bar) do not share pt binning, so check the ptBin for Lambda(bar) separately + if (competingMassCuts) { + int ptBinCMC = getPtBin(v0.pt(), LambdaPtBins); + if (ptBinCMC >= 0) { // TODO: Should we still do CMC when v0 is out of pT range for Lambda(bar)? + if (v0.mLambda() > LambdaMassLowVals->at(ptBinCMC) && v0.mLambda() < LambdaMassHighVals->at(ptBinCMC)) { + return false; + } + } + ptBinCMC = getPtBin(v0.pt(), AntiLambdaPtBins); + if (ptBinCMC >= 0) { + if (v0.mAntiLambda() > AntiLambdaMassLowVals->at(ptBinCMC) && v0.mAntiLambda() < AntiLambdaMassHighVals->at(ptBinCMC)) { + return false; + } + } } + + float rmin = K0SRminVals->at(ptBin); + float rmax = K0SRmaxVals->at(ptBin); + float ctaumin = K0SCtauminVals->at(ptBin); + float ctaumax = K0SCtaumaxVals->at(ptBin); + float cospamin = K0SCosPAminVals->at(ptBin); + float cospamax = K0SCosPAmaxVals->at(ptBin); + float dcapmin = K0SDCAminVals->at(ptBin); + float dcapmax = K0SDCAmaxVals->at(ptBin); + float dcanmin = K0SDCAminVals->at(ptBin); + float dcanmax = K0SDCAmaxVals->at(ptBin); + float dcadmin = K0SDCAdminVals->at(ptBin); + float dcadmax = K0SDCAdmaxVals->at(ptBin); + float ctau = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short; - if (ctau < K0SCtauVals->at(ptBin)) { - return false; - } - // Apply mass cuts only if requested - if (!massCuts) { - return true; - } - if (v0.mK0Short() < K0SMassLowVals->at(ptBin) || v0.mK0Short() > K0SMassHighVals->at(ptBin)) { - return false; - } - if (!competingMassCuts) { - return true; - } - if (v0.mLambda() > LambdaMassLowVals->at(ptBin) && v0.mLambda() < LambdaMassHighVals->at(ptBin)) { - return false; - } - if (v0.mAntiLambda() > AntiLambdaMassLowVals->at(ptBin) && v0.mAntiLambda() < AntiLambdaMassHighVals->at(ptBin)) { - return false; + std::vector vals = {v0.v0radius(), ctau, v0.v0cosPA(), v0.dcaV0daughters(), TMath::Abs(v0.dcapostopv()), TMath::Abs(v0.dcanegtopv())}; + std::vector mincuts = {rmin, ctaumin, cospamin, dcadmin, dcapmin, dcanmin}; + std::vector maxcuts = {rmax, ctaumax, cospamax, dcadmax, dcapmax, dcanmax}; + + if (massCuts) { + vals.push_back(v0.mK0Short()); + mincuts.push_back(K0SMassLowVals->at(ptBin)); + maxcuts.push_back(K0SMassHighVals->at(ptBin)); } - return true; + + return cuts(vals, mincuts, maxcuts); } template bool LambdaCuts(T const& collision, U const& v0) { - if (v0.pt() < LambdaPtBins->at(0) || v0.pt() > LambdaPtBins->at(LambdaPtBins->size() - 1)) { - return false; - } - int ptBin = std::distance(LambdaPtBins->begin(), std::upper_bound(LambdaPtBins->begin(), LambdaPtBins->end(), v0.pt())) - 1; - if (v0.v0radius() < LambdaRVals->at(ptBin)) { - return false; - } - if (v0.v0cosPA() < LambdaCosPAVals->at(ptBin)) { - return false; - } - if (v0.dcaV0daughters() > LambdaDCAdVals->at(ptBin)) { - return false; - } - if (TMath::Abs(v0.dcapostopv()) < LambdaDCApVals->at(ptBin)) { - return false; - } - if (TMath::Abs(v0.dcanegtopv()) < LambdaDCAnVals->at(ptBin)) { + int ptBin = getPtBin(v0.pt(), LambdaPtBins); + if (ptBin < 0) return false; + + if (competingMassCuts) { + int ptBinCMC = getPtBin(v0.pt(), K0SPtBins); + if (ptBinCMC >= 0) { + if (v0.mK0Short() > K0SMassLowVals->at(ptBinCMC) && v0.mK0Short() < K0SMassHighVals->at(ptBinCMC)) + return false; + } } + + float rmin = LambdaRminVals->at(ptBin); + float rmax = LambdaRmaxVals->at(ptBin); + float ctaumin = LambdaCtauminVals->at(ptBin); + float ctaumax = LambdaCtaumaxVals->at(ptBin); + float cospamin = LambdaCosPAminVals->at(ptBin); + float cospamax = LambdaCosPAmaxVals->at(ptBin); + float dcapmin = LambdaDCApminVals->at(ptBin); + float dcapmax = LambdaDCApmaxVals->at(ptBin); + float dcanmin = LambdaDCAnminVals->at(ptBin); + float dcanmax = LambdaDCAnmaxVals->at(ptBin); + float dcadmin = LambdaDCAdminVals->at(ptBin); + float dcadmax = LambdaDCAdmaxVals->at(ptBin); + float ctau = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0; - if (ctau < LambdaCtauVals->at(ptBin)) { - return false; - } - // Apply mass cuts only if requested - if (!massCuts) { - return true; - } - if (v0.mLambda() < LambdaMassLowVals->at(ptBin) || v0.mLambda() > LambdaMassHighVals->at(ptBin)) { - return false; - } - if (!competingMassCuts) { - return true; - } - if (v0.mK0Short() > K0SMassLowVals->at(ptBin) && v0.mK0Short() < K0SMassHighVals->at(ptBin)) { - return false; + std::vector vals = {v0.v0radius(), ctau, v0.v0cosPA(), v0.dcaV0daughters(), TMath::Abs(v0.dcapostopv()), TMath::Abs(v0.dcanegtopv())}; + std::vector mincuts = {rmin, ctaumin, cospamin, dcadmin, dcapmin, dcanmin}; + std::vector maxcuts = {rmax, ctaumax, cospamax, dcadmax, dcapmax, dcanmax}; + + if (massCuts) { + vals.push_back(v0.mLambda()); + mincuts.push_back(LambdaMassLowVals->at(ptBin)); + maxcuts.push_back(LambdaMassHighVals->at(ptBin)); } - return true; + return cuts(vals, mincuts, maxcuts); } template bool AntiLambdaCuts(T const& collision, U const& v0) { - if (v0.pt() < AntiLambdaPtBins->at(0) || v0.pt() > AntiLambdaPtBins->at(AntiLambdaPtBins->size() - 1)) { - return false; - } - int ptBin = std::distance(AntiLambdaPtBins->begin(), std::upper_bound(AntiLambdaPtBins->begin(), AntiLambdaPtBins->end(), v0.pt())) - 1; - if (v0.v0radius() < AntiLambdaRVals->at(ptBin)) { - return false; - } - if (v0.v0cosPA() < AntiLambdaCosPAVals->at(ptBin)) { - return false; - } - if (v0.dcaV0daughters() > AntiLambdaDCAdVals->at(ptBin)) { - return false; - } - if (TMath::Abs(v0.dcapostopv()) < AntiLambdaDCApVals->at(ptBin)) { - return false; - } - if (TMath::Abs(v0.dcanegtopv()) < AntiLambdaDCAnVals->at(ptBin)) { + int ptBin = getPtBin(v0.pt(), AntiLambdaPtBins); + if (ptBin < 0) return false; + + if (competingMassCuts) { + int ptBinCMC = getPtBin(v0.pt(), K0SPtBins); + if (ptBinCMC >= 0) { + if (v0.mK0Short() > K0SMassLowVals->at(ptBinCMC) && v0.mK0Short() < K0SMassHighVals->at(ptBinCMC)) + return false; + } } + + float rmin = AntiLambdaRminVals->at(ptBin); + float rmax = AntiLambdaRmaxVals->at(ptBin); + float ctaumin = AntiLambdaCtauminVals->at(ptBin); + float ctaumax = AntiLambdaCtaumaxVals->at(ptBin); + float cospamin = AntiLambdaCosPAminVals->at(ptBin); + float cospamax = AntiLambdaCosPAmaxVals->at(ptBin); + float dcapmin = AntiLambdaDCApminVals->at(ptBin); + float dcapmax = AntiLambdaDCApmaxVals->at(ptBin); + float dcanmin = AntiLambdaDCAnminVals->at(ptBin); + float dcanmax = AntiLambdaDCAnmaxVals->at(ptBin); + float dcadmin = AntiLambdaDCAdminVals->at(ptBin); + float dcadmax = AntiLambdaDCAdmaxVals->at(ptBin); + float ctau = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0; - if (ctau < AntiLambdaCtauVals->at(ptBin)) { - return false; - } - // Apply mass cuts only if requested - if (!massCuts) { - return true; - } - if (v0.mAntiLambda() < AntiLambdaMassLowVals->at(ptBin) || v0.mAntiLambda() > AntiLambdaMassHighVals->at(ptBin)) { - return false; - } - if (!competingMassCuts) { - return true; - } - if (v0.mK0Short() > K0SMassLowVals->at(ptBin) && v0.mK0Short() < K0SMassHighVals->at(ptBin)) { - return false; + std::vector vals = {v0.v0radius(), ctau, v0.v0cosPA(), v0.dcaV0daughters(), TMath::Abs(v0.dcapostopv()), TMath::Abs(v0.dcanegtopv())}; + std::vector mincuts = {rmin, ctaumin, cospamin, dcadmin, dcapmin, dcanmin}; + std::vector maxcuts = {rmax, ctaumax, cospamax, dcadmax, dcapmax, dcanmax}; + + if (competingMassCuts) { + vals.push_back(v0.mAntiLambda()); + mincuts.push_back(AntiLambdaMassLowVals->at(ptBin)); + maxcuts.push_back(AntiLambdaMassHighVals->at(ptBin)); } - return true; + return cuts(vals, mincuts, maxcuts); } template bool RandomlyReject(T const& v0, uint8_t flag) { - if (!(flag & aod::v0flags::FK0S || flag & aod::v0flags::FLAMBDA || flag & aod::v0flags::FANTILAMBDA)) { - return true; - } - // In case of multiple candidate types, only check the lowest threshold value float threshold = 2.; if (flag & aod::v0flags::FK0S) { - int ptBin = std::distance(K0SPtBins->begin(), std::upper_bound(K0SPtBins->begin(), K0SPtBins->end(), v0.pt())) - 1; - if (threshold > K0SFraction->at(ptBin)) { - threshold = K0SFraction->at(ptBin); - } + int ptBin = getPtBin(v0.pt(), K0SPtBins); + threshold = std::min(threshold, K0SFraction->at(ptBin)); } if (flag & aod::v0flags::FLAMBDA) { - int ptBin = std::distance(LambdaPtBins->begin(), std::upper_bound(LambdaPtBins->begin(), LambdaPtBins->end(), v0.pt())) - 1; - if (threshold > LambdaFraction->at(ptBin)) { - threshold = LambdaFraction->at(ptBin); - } + int ptBin = getPtBin(v0.pt(), LambdaPtBins); + threshold = std::min(threshold, LambdaFraction->at(ptBin)); } if (flag & aod::v0flags::FANTILAMBDA) { - int ptBin = std::distance(AntiLambdaPtBins->begin(), std::upper_bound(AntiLambdaPtBins->begin(), AntiLambdaPtBins->end(), v0.pt())) - 1; - if (threshold > AntiLambdaFraction->at(ptBin)) { - threshold = AntiLambdaFraction->at(ptBin); - } + int ptBin = getPtBin(v0.pt(), AntiLambdaPtBins); + threshold = std::min(threshold, AntiLambdaFraction->at(ptBin)); } + // If gRandom > threshold, reject the candidate return (gRandom->Uniform() > threshold); } void processV0(aod::Collision const& collision, aod::V0Datas const& v0s) { for (const auto& v0 : v0s) { - bool candidateK0S = K0SCuts(collision, v0); - bool candidateLambda = LambdaCuts(collision, v0); - bool candidateAntiLambda = AntiLambdaCuts(collision, v0); uint8_t flag = 0; - flag += candidateK0S * aod::v0flags::FK0S; - flag += candidateLambda * aod::v0flags::FLAMBDA; - flag += candidateAntiLambda * aod::v0flags::FANTILAMBDA; + flag += K0SCuts(collision, v0) * aod::v0flags::FK0S; + flag += LambdaCuts(collision, v0) * aod::v0flags::FLAMBDA; + flag += AntiLambdaCuts(collision, v0) * aod::v0flags::FANTILAMBDA; - if (candidateK0S + candidateLambda + candidateAntiLambda == 0) { + if (flag == 0) flag += aod::v0flags::FREJECTED; - } else if (randomSelection) { + else flag += RandomlyReject(v0, flag) * aod::v0flags::FREJECTED; - } + v0FlagTable(flag); } } From 81fee4252e6ea5580963dec8ea7549fb20acc154 Mon Sep 17 00:00:00 2001 From: omvazque Date: Fri, 14 Feb 2025 01:52:04 -0600 Subject: [PATCH 0216/1650] [PWGLF] Adds more event selection cuts (#9959) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 286 +++++++++++-------- 1 file changed, 165 insertions(+), 121 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index b0f1c9094c5..a80ef21071f 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -16,6 +16,7 @@ /// \since January 29, 2025 #include +#include #include #include "Common/CCDB/EventSelectionParams.h" @@ -26,6 +27,7 @@ #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/TrackSelectionTables.h" #include "CommonConstants/MathConstants.h" +#include "CommonConstants/ZDCConstants.h" #include "Framework/ASoAHelpers.h" // required for Filter op. #include "Framework/AnalysisDataModel.h" #include "Framework/AnalysisTask.h" @@ -109,7 +111,15 @@ struct UccZdc { ConfigurableAxis binsPt{"binsPt", {VARIABLE_WIDTH, 0., 0.1, 0.25, 0.5, 1., 2., 4., 6., 8., 10., 20.}, "pT binning"}; ConfigurableAxis binsCent{"binsCent", {VARIABLE_WIDTH, 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.}, "T0C binning"}; - // Configurable flags ZDC + // Configurable event selectiond and flags ZDC + Configurable isApplySameBunchPileup{"isApplySameBunchPileup", true, + "Enable SameBunchPileup cut"}; + Configurable isApplyGoodZvtxFT0vsPV{"isApplyGoodZvtxFT0vsPV", true, + "Enable GoodZvtxFT0vsPV cut"}; + Configurable isApplyVertexITSTPC{"isApplyVertexITSTPC", true, + "Enable VertexITSTPC cut"}; + Configurable isApplyVertexTOFmatched{"isApplyVertexTOFmatched", true, + "Enable VertexTOFmatched cut"}; Configurable isAmpZDC{"isAmpZDC", false, "Use amplitude ZDC?"}; Configurable isCommPMT{"isCommPMT", false, "Use common PMT ZDC?"}; Configurable isSumTowers{"isSumTowers", false, "Use sum of Tow ZDC?"}; @@ -152,121 +162,87 @@ struct UccZdc { void init(InitContext const&) { // define axes you want to use - const AxisSpec axisEvent{10, 0., +10.0, ""}; + const AxisSpec axisEvent{15, 0., +15.0, ""}; const AxisSpec axisEta{30, -1.5, +1.5, "#eta"}; const AxisSpec axisPt{binsPt, "#it{p}_{T} (GeV/#it{c})"}; const AxisSpec axisDeltaPt{100, -1.0, +1.0, "#Delta(p_{T})"}; const AxisSpec axisCent{binsCent, "T0C centrality"}; + const AxisSpec axisAmpCh{250, 0., 2500., "Amplitude of non-zero channels"}; + const AxisSpec axisEneCh{300, 0., 300., "Energy of non-zero channels"}; // Histograms: paritcle-level info registryData.add("EtaVsPhi", ";#eta;#varphi", kTH2F, {{{axisEta}, {100, -0.1 * PI, +2.1 * PI}}}); registryData.add("etaHistogram", "etaHistogram", kTH1F, {axisEta}); registryData.add("ptHistogram", "ptHistogram", kTH1F, {axisPt}); - registryData.add("dcaXYvspT", ";DCA_{xy};p_{T};", - {HistType::kTH2F, {{{50, -1., 1.}, {axisPt}}}}); - - registryData.add("hT0C_cent", ";T0C centrality;Entries", kTH1F, {axisCent}); + registryData.add("dcaXYvspT", "", kTH2F, {{{50, -1., 1.}, {axisPt}}}); + registryData.add("T0Ccent", ";T0C centrality;Entries", kTH1F, {axisCent}); registryData.add("hEventCounter", "Event counter", kTH1F, {axisEvent}); - registryData.get(HIST("hEventCounter")) - ->GetXaxis() - ->SetBinLabel(1, "total"); - registryData.get(HIST("hEventCounter")) - ->GetXaxis() - ->SetBinLabel(2, "sel8?"); - registryData.get(HIST("hEventCounter")) - ->GetXaxis() - ->SetBinLabel(3, "zdc?"); - registryData.get(HIST("hEventCounter")) - ->GetXaxis() - ->SetBinLabel(4, "t0?"); - registryData.get(HIST("hEventCounter")) - ->GetXaxis() - ->SetBinLabel(5, "v0a?"); - registryData.get(HIST("hEventCounter")) - ->GetXaxis() - ->SetBinLabel(6, "TDC cut"); - registryData.get(HIST("hEventCounter")) - ->GetXaxis() - ->SetBinLabel(7, "zem cut"); - registryData.get(HIST("hEventCounter")) - ->GetXaxis() - ->SetBinLabel(8, "min < t0c < max"); - registryData.add("ZNA", "ZNA; ZNA amplitude; Entries", - {HistType::kTH1F, {{nBinsZDC, -0.5, maxZN}}}); - registryData.add("ZPA", "ZPA; ZPA amplitude; Entries", - {HistType::kTH1F, {{nBinsZDC, -0.5, maxZP}}}); - registryData.add("ZNC", "ZNC; ZNC amplitude; Entries", - {HistType::kTH1F, {{nBinsZDC, -0.5, maxZN}}}); - registryData.add("ZPC", "ZPC; ZPC amplitude; Entries", - {HistType::kTH1F, {{nBinsZDC, -0.5, maxZP}}}); - registryData.add("ZEM1", "ZEM1; ZEM1 amplitude; Entries", - {HistType::kTH1F, {{nBinsZEM, -0.5, maxZEM}}}); - registryData.add("ZEM2", "ZEM2; ZEM2 amplitude; Entries", - {HistType::kTH1F, {{nBinsZEM, -0.5, maxZEM}}}); - registryData.add("ZNvsZEM", "ZNvsZEM; ZEM; ZNA+ZNC", - {HistType::kTH2F, - {{{nBinsZDC, -0.5, maxZEM}, {nBinsZEM, -0.5, maxZN}}}}); - registryData.add("ZNAvsZNC", "ZNAvsZNC; ZNC; ZNA", - {HistType::kTH2F, - {{{nBinsZDC, -0.5, maxZN}, {nBinsZDC, -0.5, maxZN}}}}); - registryData.add("ZPAvsZPC", "ZPAvsZPC; ZPA; ZPC", - {HistType::kTH2F, - {{{nBinsZDC, -0.5, maxZP}, {nBinsZDC, -0.5, maxZP}}}}); - registryData.add("ZNAvsZPA", "ZNAvsZPA; ZPA; ZNA", - {HistType::kTH2F, - {{{nBinsZDC, -0.5, maxZP}, {nBinsZDC, -0.5, maxZN}}}}); - registryData.add("ZNCvsZPC", "ZNCvsZPC; ZPC; ZNC", - {HistType::kTH2F, - {{{nBinsZDC, -0.5, maxZP}, {nBinsZDC, -0.5, maxZN}}}}); - registryData.add("ZNCvstdc", "ZNCvstdc; time ZNC; ZNC", - {HistType::kTH2F, - {{{nBinsTDC, minTdc, maxTdc}, {nBinsZDC, -0.5, maxZN}}}}); - registryData.add("ZNAvstdc", "ZNAvstdc; time ZNA; ZNA", - {HistType::kTH2F, - {{{nBinsTDC, minTdc, maxTdc}, {nBinsZDC, -0.5, maxZN}}}}); - registryData.add("ZPCvstdc", "ZPCvstdc; time ZPC; ZPC", - {HistType::kTH2F, - {{{nBinsTDC, minTdc, maxTdc}, {nBinsZDC, -0.5, maxZP}}}}); - registryData.add("ZPAvstdc", "ZPAvstdc; time ZPA; ZPA", - {HistType::kTH2F, - {{{nBinsTDC, minTdc, maxTdc}, {nBinsZDC, -0.5, maxZP}}}}); - registryData.add( - "ZEM1vstdc", "ZEM1vstdc; time ZEM1; ZEM1", - {HistType::kTH2F, - {{{nBinsTDC, minTdc, maxTdc}, {nBinsZEM, -0.5, maxZEM}}}}); - registryData.add( - "ZEM2vstdc", "ZEM2vstdc; time ZEM2; ZEM2", - {HistType::kTH2F, - {{{nBinsTDC, minTdc, maxTdc}, {nBinsZEM, -0.5, maxZEM}}}}); - registryData.add( - "debunch", "ZN sum vs. ZN diff.; t_{ZDC}-t_{ZDA}; t_{ZDC}+t_{ZDA}", - {HistType::kTH2F, - {{{nBinsTDC, minTdc, maxTdc}, {nBinsTDC, minTdc, maxTdc}}}}); - registryData.add( - "ZNvsFV0A", "ZNvsFV0A", - {HistType::kTH2F, - {{{nBinsAmpFV0, 0., maxAmpFV0}, {nBinsZDC, -0.5, maxZN}}}}); + + auto hstat = registryData.get(HIST("hEventCounter")); + auto* x = hstat->GetXaxis(); + x->SetBinLabel(1, "All events"); + x->SetBinLabel(2, "sel8"); + x->SetBinLabel(3, "kNoSameBunchPileup"); + x->SetBinLabel(4, "kIsGoodZvtxFT0vsPV"); + x->SetBinLabel(5, "kIsVertexITSTPC"); + x->SetBinLabel(6, "kIsVertexTOFmatched"); + x->SetBinLabel(7, "Centrality"); + x->SetBinLabel(8, "has ZDC?"); + x->SetBinLabel(9, "has T0?"); + x->SetBinLabel(10, "has V0A?"); + x->SetBinLabel(11, "inside TDC cut?"); + x->SetBinLabel(12, "within ZEM cut?"); + x->SetBinLabel(13, "min + bool isEventSelected(CheckCol const& col) + { + registryData.fill(HIST("hEventCounter"), 0.5); + if (!col.sel8()) { + return false; + } + registryData.fill(HIST("hEventCounter"), 1.5); + + if (isApplySameBunchPileup && + !col.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { + return false; + } + registryData.fill(HIST("hEventCounter"), 2.5); + + if (isApplyGoodZvtxFT0vsPV && + !col.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { + return false; + } + registryData.fill(HIST("hEventCounter"), 3.5); + + if (isApplyVertexITSTPC && + !col.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) { + return false; + } + registryData.fill(HIST("hEventCounter"), 4.5); + + if (isApplyVertexTOFmatched && + !col.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) { + return false; + } + registryData.fill(HIST("hEventCounter"), 5.5); + + // if (isApplyVertexTRDmatched && + // !col.selection_bit(o2::aod::evsel::kIsVertexTRDmatched)) { + // return false; + // } + // histos.fill(HIST("EventHist"), 7); + + if (col.centFT0C() < 0. || col.centFT0C() > 100.) { + return false; + } + registryData.fill(HIST("hEventCounter"), 6.5); + + // if (isApplyExtraCorrCut && col.multNTracksPV() > npvTracksCut && + // col.multFT0C() < (10 * col.multNTracksPV() - ft0cCut)) { + // return false; + // } + // histos.fill(HIST("EventHist"), 9); + // + // if (isApplyNoCollInTimeRangeStandard && + // !col.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + // return false; + // } + // histos.fill(HIST("EventHist"), 10); + // + // if (isApplyNoCollInRofStandard && + // !col.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { + // return false; + // } + // histos.fill(HIST("EventHist"), 11); + // + // if (isApplyNoHighMultCollInPrevRof && + // !col.selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof)) { + // return false; + // } + // histos.fill(HIST("EventHist"), 12); + return true; + } + void processZdcCollAss(TheFilteredCollision const& collision, o2::aod::BCsRun3 const& /*bcs*/, aod::Zdcs const& /*zdcs*/, aod::FV0As const& /*fv0as*/, aod::FT0s const& /*ft0s*/, TheFilteredTracks const& tracks) { - registryData.fill(HIST("hEventCounter"), 0.5); - if (!collision.sel8()) { + if (!isEventSelected(collision)) { return; } - registryData.fill(HIST("hEventCounter"), 1.5); const auto& foundBC = collision.foundBC_as(); - // Does the event has ZDC? - if (!foundBC.has_zdc()) { + if (!foundBC.has_zdc()) { // has ZDC? return; } - registryData.fill(HIST("hEventCounter"), 2.5); + registryData.fill(HIST("hEventCounter"), 7.5); float aT0A{0.0}; float aT0C{0.0}; @@ -400,20 +443,21 @@ struct UccZdc { aT0C += amplitude; } sumT0s = aT0A + aT0C; - registryData.fill(HIST("hEventCounter"), 3.5); } else { - aT0A = aT0C = -999.; sumT0s = -999.; + return; } + registryData.fill(HIST("hEventCounter"), 8.5); if (foundBC.has_fv0a()) { for (const auto& amplitude : foundBC.fv0a().amplitude()) { aV0A += amplitude; } - registryData.fill(HIST("hEventCounter"), 4.5); } else { aV0A = -999.; + return; } + registryData.fill(HIST("hEventCounter"), 9.5); // TDC cut if (isTDCcut) { @@ -421,7 +465,7 @@ struct UccZdc { return; } } - registryData.fill(HIST("hEventCounter"), 5.5); + registryData.fill(HIST("hEventCounter"), 10.5); // ZEM cut if (isZEMcut) { @@ -429,7 +473,7 @@ struct UccZdc { return; } } - registryData.fill(HIST("hEventCounter"), 6.5); + registryData.fill(HIST("hEventCounter"), 11.5); // T0C centrality cut if (collision.centFT0C() < minT0CcentCut || @@ -437,8 +481,9 @@ struct UccZdc { return; } - registryData.fill(HIST("hEventCounter"), 7.5); - registryData.fill(HIST("hT0C_cent"), collision.centFT0C()); + registryData.fill(HIST("zPos"), collision.posZ()); + registryData.fill(HIST("hEventCounter"), 12.5); + registryData.fill(HIST("T0Ccent"), collision.centFT0C()); registryData.fill(HIST("ZNA"), znA); registryData.fill(HIST("ZNC"), znC); registryData.fill(HIST("ZPA"), zpA); @@ -450,8 +495,6 @@ struct UccZdc { registryData.fill(HIST("ZNvsZEM"), sumZEMs, sumZNs); registryData.fill(HIST("ZNvsFV0A"), aV0A / 100., sumZNs); registryData.fill(HIST("ZNvsFT0"), sumT0s / 100., sumZNs); - registryData.fill(HIST("ZEM1"), aZEM1); - registryData.fill(HIST("ZEM2"), aZEM2); registryData.fill(HIST("ZNCvstdc"), tZNC, znC); registryData.fill(HIST("ZNAvstdc"), tZNA, znA); registryData.fill(HIST("ZPCvstdc"), tZPC, zpC); @@ -483,6 +526,7 @@ struct UccZdc { if (nch > 0) { meanpT /= nch; } + registryData.fill(HIST("Nch"), nch); registryData.fill(HIST("ZNAvsNch"), nch, znA); registryData.fill(HIST("ZNCvsNch"), nch, znC); registryData.fill(HIST("ZNCvsNchvspT"), nch, znC, meanpT); @@ -667,8 +711,8 @@ struct UccZdc { // // pt-dependent selection // if (setDCAselectionPtDep) { // if (std::fabs(track.dcaXY()) > (par0 + par1 / track.pt())) return - // false; if (std::fabs(track.dcaZ()) > (par0 + par1 / track.pt())) return - // false; + // false; if (std::fabs(track.dcaZ()) > (par0 + par1 / track.pt())) + // return false; // } // // standard selection // if (!setDCAselectionPtDep) { From a1d35907477ae4d81935e36be7ad25943dbf233b Mon Sep 17 00:00:00 2001 From: Suraj Prasad Date: Fri, 14 Feb 2025 13:37:57 +0530 Subject: [PATCH 0217/1650] [PWGLF] Armenteros-Podolanski cut implemented for K0s (#9949) --- .../Strangeness/lambdak0sflattenicity.cxx | 187 ++++++++++-------- 1 file changed, 107 insertions(+), 80 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdak0sflattenicity.cxx b/PWGLF/Tasks/Strangeness/lambdak0sflattenicity.cxx index 5c53923f74d..a931ae21070 100755 --- a/PWGLF/Tasks/Strangeness/lambdak0sflattenicity.cxx +++ b/PWGLF/Tasks/Strangeness/lambdak0sflattenicity.cxx @@ -17,11 +17,11 @@ /// \brief V0 task for production of strange hadrons as a function of flattenicity /// \author Suraj Prasad (suraj.prasad@cern.ch) +#include +#include #include #include #include -#include -#include #include "Framework/AnalysisDataModel.h" #include "Framework/AnalysisTask.h" @@ -67,6 +67,13 @@ struct Lambdak0sflattenicity { OutputObjHandlingPolicy::AnalysisObject, true, true}; + + HistogramRegistry rCommonHist{ + "commonhists", + {}, + OutputObjHandlingPolicy::AnalysisObject, + true, + true}; HistogramRegistry rFlattenicity{ "flattenicity", {}, @@ -134,34 +141,36 @@ struct Lambdak0sflattenicity { Configurable flattenicityforLossCorrRec{"flattenicityforLossCorrRec", true, "Flattenicity from Rec Tracks are used for Signal and Event loss calculations"}; // Common Configurable parameters for V0 selection - Configurable v0setting_dcav0dau{"v0setting_dcav0dau", 1, - "DCA V0 Daughters"}; - Configurable v0setting_dcapostopv{"v0setting_dcapostopv", 0.06, - "DCA Pos To PV"}; - Configurable v0setting_dcanegtopv{"v0setting_dcanegtopv", 0.06, - "DCA Neg To PV"}; - Configurable v0setting_rapidity{"v0setting_rapidity", 0.5, - "V0 rapidity cut"}; + Configurable v0settingDCAv0dau{"v0settingDCAv0dau", 1, + "DCA V0 Daughters"}; + Configurable v0settingDCApostopv{"v0settingDCApostopv", 0.06, + "DCA Pos To PV"}; + Configurable v0settingDCAnegtopv{"v0settingDCAnegtopv", 0.06, + "DCA Neg To PV"}; + Configurable v0settingRapidity{"v0settingRapidity", 0.5, + "V0 rapidity cut"}; // Configurable parameters for V0 selection for KOs - Configurable v0setting_cospaK0s{"v0setting_cospaK0s", 0.97, - "V0 CosPA for K0s"}; - Configurable v0setting_radiusK0s{"v0setting_radiusK0s", 0.5, - "v0radius for K0s"}; - Configurable v0setting_ctauK0s{"v0setting_ctauK0s", 20, - "v0ctau for K0s"}; - Configurable v0setting_massrejectionK0s{"v0setting_massrejectionK0s", 0.005, - "Competing Mass Rejection cut for K0s"}; + Configurable v0settingCosPAK0s{"v0settingCosPAK0s", 0.97, + "V0 CosPA for K0s"}; + Configurable v0settingRadiusK0s{"v0settingRadiusK0s", 0.5, + "v0radius for K0s"}; + Configurable v0settingcTauK0s{"v0settingcTauK0s", 20, + "v0ctau for K0s"}; + Configurable v0settingMassRejectionK0s{"v0settingMassRejectionK0s", 0.005, + "Competing Mass Rejection cut for K0s"}; + Configurable v0settingArmePodoK0s{"v0settingArmePodoK0s", 0.2, + "Armenteros-Podolanski cut for K0s"}; // Configurable parameters for V0 selection for Lambda - Configurable v0setting_cospaLambda{"v0setting_cospaLambda", 0.995, - "V0 CosPA for Lambda"}; - Configurable v0setting_radiusLambda{"v0setting_radiusLambda", 0.5, - "v0radius for Lambda"}; - Configurable v0setting_ctauLambda{"v0setting_ctauLambda", 30, - "v0ctau for Lambda"}; - Configurable v0setting_massrejectionLambda{"v0setting_massrejectionLambda", 0.01, - "Competing Mass Rejection cut for Lambda"}; + Configurable v0settingCosPALambda{"v0settingCosPALambda", 0.995, + "V0 CosPA for Lambda"}; + Configurable v0settingRadiusLambda{"v0settingRadiusLambda", 0.5, + "v0radius for Lambda"}; + Configurable v0settingcTauLambda{"v0settingcTauLambda", 30, + "v0ctau for Lambda"}; + Configurable v0settingMassRejectionLambda{"v0settingMassRejectionLambda", 0.01, + "Competing Mass Rejection cut for Lambda"}; // Configurable parameters for PID selection Configurable nSigmaTPCPion{"nSigmaTPCPion", 5, "nSigmaTPCPion"}; @@ -230,19 +239,19 @@ struct Lambdak0sflattenicity { if (isINELgt0) { rEventSelection.get(HIST("hEventsSelected"))->GetXaxis()->SetBinLabel(nbin++, "INEL>0"); } - if (doprocessGenMC) { + if (doprocessGenMCLambdaK0s) { rEventSelection.get(HIST("hEventsSelected"))->GetXaxis()->SetBinLabel(nbin, "Applied selection"); } rEventSelection.add("hFlattenicityDistribution", "hFlattenicityDistribution", {HistType::kTH1D, {flatAxis}}); - if (doprocessRecMC) { + if (doprocessRecMCLambdaK0s) { rEventSelection.add("hFlattenicityDistributionMCGen_Rec", "hFlattenicityDistributionMCGen_Rec", {HistType::kTH1D, {flatAxis}}); rEventSelection.add("hFlattenicity_Corr_Gen_vs_Rec", "hFlattenicity_Corr_Gen_vs_Rec", {HistType::kTH2D, {flatAxis, flatAxis}}); } - if (doprocessGenMC) { + if (doprocessGenMCLambdaK0s) { rEventSelection.add("hVertexZGen", "hVertexZGen", {HistType::kTH1D, {vertexZAxis}}); @@ -299,12 +308,15 @@ struct Lambdak0sflattenicity { {HistType::kTH2D, {{k0sMassAxis}, {ptAxis}}}); rKzeroShort.add("hMassK0spTFlat", "hMassK0spTFlat", {HistType::kTH3D, {{k0sMassAxis}, {ptAxis}, {flatAxis}}}); - if (doprocessRecMC) { + rKzeroShort.add("hArmPodoAlphavsQTK0sAfterCut", "hArmPodoAlphavsQTK0sAfterCut", + {HistType::kTH2D, {{200, -1, 1, "#alpha"}, {70, 0, 0.35, "Q_{T}"}}}); + + if (doprocessRecMCLambdaK0s) { rKzeroShort.add("Generated_MCRecoCollCheck_INEL_K0Short", "Generated_MCRecoCollCheck_INEL_K0Short", {HistType::kTH2D, {{ptAxis}, {flatAxis}}}); } - if (doprocessGenMC) { + if (doprocessGenMCLambdaK0s) { rKzeroShort.add("pGen_MCGenRecoColl_INEL_K0Short", "pGen_MCGenRecoColl_INEL_K0Short", {HistType::kTH2D, {ptAxis, flatAxis}}); rKzeroShort.add("Generated_MCRecoColl_INEL_K0Short", "Generated_MCRecoColl_INEL_K0Short", @@ -345,12 +357,12 @@ struct Lambdak0sflattenicity { {HistType::kTH2D, {{lambdaMassAxis}, {ptAxis}}}); rLambda.add("hMassLambdapTFlat", "hMassLambdapTFlat", {HistType::kTH3D, {{lambdaMassAxis}, {ptAxis}, {flatAxis}}}); - if (doprocessRecMC) { + if (doprocessRecMCLambdaK0s) { rLambda.add("Generated_MCRecoCollCheck_INEL_Lambda", "Generated_MCRecoCollCheck_INEL_Lambda", {HistType::kTH2D, {{ptAxis}, {flatAxis}}}); } - if (doprocessGenMC) { + if (doprocessGenMCLambdaK0s) { rLambda.add("pGen_MCGenRecoColl_INEL_Lambda", "pGen_MCGenRecoColl_INEL_Lambda", {HistType::kTH2D, {ptAxis, flatAxis}}); rLambda.add("Generated_MCRecoColl_INEL_Lambda", "Generated_MCRecoColl_INEL_Lambda", @@ -394,12 +406,12 @@ struct Lambdak0sflattenicity { {HistType::kTH2D, {{antilambdaMassAxis}, {ptAxis}}}); rAntiLambda.add("hMassAntiLambdapTFlat", "hMassAntiLambdapTFlat", {HistType::kTH3D, {{antilambdaMassAxis}, {ptAxis}, {flatAxis}}}); - if (doprocessRecMC) { + if (doprocessRecMCLambdaK0s) { rAntiLambda.add("Generated_MCRecoCollCheck_INEL_AntiLambda", "Generated_MCRecoCollCheck_INEL_AntiLambda", {HistType::kTH2D, {{ptAxis}, {flatAxis}}}); } - if (doprocessGenMC) { + if (doprocessGenMCLambdaK0s) { rAntiLambda.add("pGen_MCGenRecoColl_INEL_AntiLambda", "pGen_MCGenRecoColl_INEL_AntiLambda", {HistType::kTH2D, {ptAxis, flatAxis}}); rAntiLambda.add("Generated_MCRecoColl_INEL_AntiLambda", "Generated_MCRecoColl_INEL_AntiLambda", @@ -415,6 +427,8 @@ struct Lambdak0sflattenicity { rAntiLambda.add("pGen_MCGenColl_INELgt0_AntiLambda", "pGen_MCGenColl_INELgt0_AntiLambda", {HistType::kTH2D, {ptAxis, flatAxis}}); } + rCommonHist.add("hArmPodoAlphavsQT", "hArmPodoAlphavsQT", + {HistType::kTH2D, {{200, -1, 1, "#alpha"}, {70, 0, 0.35, "Q_{T}"}}}); if (flattenicityQA) { rFlattenicity.add("hEv", "Ev", HistType::kTH1D, @@ -497,18 +511,18 @@ struct Lambdak0sflattenicity { "hAmpT0CvsVtx", "", HistType::kTH2D, {{30, -15.0, +15.0, "Vtx_z"}, {600, -0.5, +5999.5, "FT0C amplitude"}}); } - if (doprocessDataRun3 && (doprocessRecMC || doprocessGenMC)) { + if (doprocessDataRun3LambdaK0s && (doprocessRecMCLambdaK0s || doprocessGenMCLambdaK0s)) { LOGF(fatal, "Both Data and MC are both set to true; try again with only " "one of them set to true"); } - if (!doprocessDataRun3 && !(doprocessRecMC || doprocessGenMC)) { + if (!doprocessDataRun3LambdaK0s && !(doprocessRecMCLambdaK0s || doprocessGenMCLambdaK0s)) { LOGF(fatal, "Both Data and MC set to false; try again with only one of " "them set to false"); } - // if ((doprocessRecMC && !doprocessGenMC) || - // (!doprocessRecMC && doprocessGenMC)) { + // if ((doprocessRecMCLambdaK0s && !doprocessGenMCLambdaK0s) || + // (!doprocessRecMCLambdaK0s && doprocessGenMCLambdaK0s)) { // LOGF(fatal, // "MCRec and MCGen are set to opposite switches, try again " // "with both set to either true or false"); @@ -1200,9 +1214,9 @@ struct Lambdak0sflattenicity { // Filters on V0s // Cannot filter on dynamic columns, so we cut on DCA to PV and DCA between // daughters only - Filter preFilterV0 = (nabs(aod::v0data::dcapostopv) > v0setting_dcapostopv && - nabs(aod::v0data::dcanegtopv) > v0setting_dcanegtopv && - aod::v0data::dcaV0daughters < v0setting_dcav0dau); + Filter preFilterV0 = (nabs(aod::v0data::dcapostopv) > v0settingDCApostopv && + nabs(aod::v0data::dcanegtopv) > v0settingDCAnegtopv && + aod::v0data::dcaV0daughters < v0settingDCAv0dau); Filter trackFilter = (nabs(aod::track::eta) < cfgTrkEtaCut && aod::track::pt > cfgTrkLowPtCut); @@ -1211,7 +1225,7 @@ struct Lambdak0sflattenicity { soa::Join>; - void processDataRun3( + void processDataRun3LambdaK0s( soa::Join::iterator const& collision, soa::Filtered const& V0s, TrackCandidates const& tracks, @@ -1264,17 +1278,22 @@ struct Lambdak0sflattenicity { float ctauLambda = decaylength * massLambda / v0p; float ctauAntiLambda = decaylength * massAntiLambda / v0p; + float alpha = v0.alpha(); + float qtarm = v0.qtarm(); + // Cut on dynamic columns for K0s + rCommonHist.fill(HIST("hArmPodoAlphavsQT"), alpha, qtarm); - if (v0.v0cosPA() >= v0setting_cospaK0s && - v0.v0radius() >= v0setting_radiusK0s && + if (v0.v0cosPA() >= v0settingCosPAK0s && + v0.v0radius() >= v0settingRadiusK0s && std::abs(posDaughterTrack.tpcNSigmaPi()) <= nSigmaTPCPion && std::abs(negDaughterTrack.tpcNSigmaPi()) <= nSigmaTPCPion && - ctauK0s < v0setting_ctauK0s && - std::abs(v0.rapidity(0)) <= v0setting_rapidity && - std::abs(massLambda - pdgmassLambda) > v0setting_massrejectionK0s && + ctauK0s < v0settingcTauK0s && + std::abs(v0.rapidity(0)) <= v0settingRapidity && + std::abs(massLambda - pdgmassLambda) > v0settingMassRejectionK0s && std::abs(massAntiLambda - pdgmassLambda) > - v0setting_massrejectionK0s) { + v0settingMassRejectionK0s && + qtarm > v0settingArmePodoK0s * std::abs(alpha)) { rKzeroShort.fill(HIST("hMassK0sSelected"), massK0s); rKzeroShort.fill(HIST("hDCAV0DaughtersK0s"), v0.dcaV0daughters()); @@ -1284,6 +1303,7 @@ struct Lambdak0sflattenicity { rKzeroShort.fill(HIST("h2DdecayRadiusK0s"), v0.v0radius()); rKzeroShort.fill(HIST("hMassK0spT"), massK0s, v0.pt()); rKzeroShort.fill(HIST("hMassK0spTFlat"), massK0s, v0.pt(), flattenicity); + rKzeroShort.fill(HIST("hArmPodoAlphavsQTK0sAfterCut"), alpha, qtarm); // Filling the PID of the V0 daughters in the region of the K0s peak if (0.45 < massK0s && massK0s < 0.55) { @@ -1297,13 +1317,13 @@ struct Lambdak0sflattenicity { } // Cut on dynamic columns for Lambda - if (v0.v0cosPA() >= v0setting_cospaLambda && - v0.v0radius() >= v0setting_radiusLambda && + if (v0.v0cosPA() >= v0settingCosPALambda && + v0.v0radius() >= v0settingRadiusLambda && std::abs(posDaughterTrack.tpcNSigmaPr()) <= nSigmaTPCProton && std::abs(negDaughterTrack.tpcNSigmaPi()) <= nSigmaTPCPion && - ctauLambda < v0setting_ctauLambda && - std::abs(v0.rapidity(1)) <= v0setting_rapidity && - std::abs(massK0s - pdgmassK0s) > v0setting_massrejectionLambda) { + ctauLambda < v0settingcTauLambda && + std::abs(v0.rapidity(1)) <= v0settingRapidity && + std::abs(massK0s - pdgmassK0s) > v0settingMassRejectionLambda) { rLambda.fill(HIST("hMassLambdaSelected"), massLambda); rLambda.fill(HIST("hDCAV0DaughtersLambda"), v0.dcaV0daughters()); @@ -1326,13 +1346,13 @@ struct Lambdak0sflattenicity { } // Cut on dynamic columns for AntiLambda - if (v0.v0cosPA() >= v0setting_cospaLambda && - v0.v0radius() >= v0setting_radiusLambda && + if (v0.v0cosPA() >= v0settingCosPALambda && + v0.v0radius() >= v0settingRadiusLambda && std::abs(posDaughterTrack.tpcNSigmaPi()) <= nSigmaTPCPion && std::abs(negDaughterTrack.tpcNSigmaPr()) <= nSigmaTPCProton && - ctauAntiLambda < v0setting_ctauLambda && - std::abs(v0.rapidity(2)) <= v0setting_rapidity && - std::abs(massK0s - pdgmassK0s) > v0setting_massrejectionLambda) { + ctauAntiLambda < v0settingcTauLambda && + std::abs(v0.rapidity(2)) <= v0settingRapidity && + std::abs(massK0s - pdgmassK0s) > v0settingMassRejectionLambda) { rAntiLambda.fill(HIST("hMassAntiLambdaSelected"), massAntiLambda); rAntiLambda.fill(HIST("hDCAV0DaughtersAntiLambda"), @@ -1367,7 +1387,7 @@ struct Lambdak0sflattenicity { Preslice perMCCol = aod::mcparticle::mcCollisionId; SliceCache cache1; - void processRecMC( + void processRecMCLambdaK0s( soa::Join const& collisions, soa::Filtered> const& V0s, aod::McCollisions const&, TrackCandidatesMC const& tracks, @@ -1429,18 +1449,24 @@ struct Lambdak0sflattenicity { float ctauK0s = decaylength * massK0s / v0p; float ctauLambda = decaylength * massLambda / v0p; float ctauAntiLambda = decaylength * massAntiLambda / v0p; + + float alpha = v0.alpha(); + float qtarm = v0.qtarm(); + rCommonHist.fill(HIST("hArmPodoAlphavsQT"), alpha, qtarm); + auto v0mcParticle = v0.mcParticle(); // Cut on dynamic columns for K0s - if (v0mcParticle.pdgCode() == 310 && v0.v0cosPA() >= v0setting_cospaK0s && - v0.v0radius() >= v0setting_radiusK0s && + if (v0mcParticle.pdgCode() == 310 && v0.v0cosPA() >= v0settingCosPAK0s && + v0.v0radius() >= v0settingRadiusK0s && std::abs(posDaughterTrack.tpcNSigmaPi()) <= nSigmaTPCPion && std::abs(negDaughterTrack.tpcNSigmaPi()) <= nSigmaTPCPion && - ctauK0s < v0setting_ctauK0s && - std::abs(v0.rapidity(0)) <= v0setting_rapidity && - std::abs(massLambda - pdgmassLambda) > v0setting_massrejectionK0s && + ctauK0s < v0settingcTauK0s && + std::abs(v0.rapidity(0)) <= v0settingRapidity && + std::abs(massLambda - pdgmassLambda) > v0settingMassRejectionK0s && std::abs(massAntiLambda - pdgmassLambda) > - v0setting_massrejectionK0s) { + v0settingMassRejectionK0s && + qtarm > v0settingArmePodoK0s * std::abs(alpha)) { rKzeroShort.fill(HIST("hMassK0sSelected"), massK0s); rKzeroShort.fill(HIST("hDCAV0DaughtersK0s"), v0.dcaV0daughters()); @@ -1450,6 +1476,7 @@ struct Lambdak0sflattenicity { rKzeroShort.fill(HIST("h2DdecayRadiusK0s"), v0.v0radius()); rKzeroShort.fill(HIST("hMassK0spT"), massK0s, v0.pt()); rKzeroShort.fill(HIST("hMassK0spTFlat"), massK0s, v0.pt(), flattenicity); + rKzeroShort.fill(HIST("hArmPodoAlphavsQTK0sAfterCut"), alpha, qtarm); // Filling the PID of the V0 daughters in the region of the K0s peak if (0.45 < massK0s && massK0s < 0.55) { @@ -1464,13 +1491,13 @@ struct Lambdak0sflattenicity { // Cut on dynamic columns for Lambda if (v0mcParticle.pdgCode() == 3122 && - v0.v0cosPA() >= v0setting_cospaLambda && - v0.v0radius() >= v0setting_radiusLambda && + v0.v0cosPA() >= v0settingCosPALambda && + v0.v0radius() >= v0settingRadiusLambda && std::abs(posDaughterTrack.tpcNSigmaPr()) <= nSigmaTPCProton && std::abs(negDaughterTrack.tpcNSigmaPi()) <= nSigmaTPCPion && - ctauLambda < v0setting_ctauLambda && - std::abs(v0.rapidity(1)) <= v0setting_rapidity && - std::abs(massK0s - pdgmassK0s) > v0setting_massrejectionLambda) { + ctauLambda < v0settingcTauLambda && + std::abs(v0.rapidity(1)) <= v0settingRapidity && + std::abs(massK0s - pdgmassK0s) > v0settingMassRejectionLambda) { rLambda.fill(HIST("hMassLambdaSelected"), massLambda); rLambda.fill(HIST("hDCAV0DaughtersLambda"), v0.dcaV0daughters()); @@ -1494,13 +1521,13 @@ struct Lambdak0sflattenicity { // Cut on dynamic columns for AntiLambda if (v0mcParticle.pdgCode() == -3122 && - v0.v0cosPA() >= v0setting_cospaLambda && - v0.v0radius() >= v0setting_radiusLambda && + v0.v0cosPA() >= v0settingCosPALambda && + v0.v0radius() >= v0settingRadiusLambda && std::abs(posDaughterTrack.tpcNSigmaPi()) <= nSigmaTPCPion && std::abs(negDaughterTrack.tpcNSigmaPr()) <= nSigmaTPCProton && - ctauAntiLambda < v0setting_ctauLambda && - std::abs(v0.rapidity(2)) <= v0setting_rapidity && - std::abs(massK0s - pdgmassK0s) > v0setting_massrejectionLambda) { + ctauAntiLambda < v0settingcTauLambda && + std::abs(v0.rapidity(2)) <= v0settingRapidity && + std::abs(massK0s - pdgmassK0s) > v0settingMassRejectionLambda) { rAntiLambda.fill(HIST("hMassAntiLambdaSelected"), massAntiLambda); rAntiLambda.fill(HIST("hDCAV0DaughtersAntiLambda"), @@ -1553,7 +1580,7 @@ struct Lambdak0sflattenicity { } // Filter posZFilterMC = (nabs(o2::aod::mccollision::posZ) < cutzvertex); - void processGenMC( + void processGenMCLambdaK0s( o2::aod::McCollision const& mcCollision, const soa::SmallGroups>& collisions, TrackCandidatesMC const& tracks, aod::FT0s const& /*ft0s*/, aod::FV0As const& /*fv0s*/, o2::aod::McParticles const& mcParticles) { @@ -1738,11 +1765,11 @@ struct Lambdak0sflattenicity { } } - PROCESS_SWITCH(Lambdak0sflattenicity, processDataRun3, "Process Run 3 Data", + PROCESS_SWITCH(Lambdak0sflattenicity, processDataRun3LambdaK0s, "Process Run 3 Data", true); - PROCESS_SWITCH(Lambdak0sflattenicity, processRecMC, + PROCESS_SWITCH(Lambdak0sflattenicity, processRecMCLambdaK0s, "Process Run 3 mc, reconstructed", false); - PROCESS_SWITCH(Lambdak0sflattenicity, processGenMC, + PROCESS_SWITCH(Lambdak0sflattenicity, processGenMCLambdaK0s, "Process Run 3 mc, generated", false); }; From 67f2d8f5efb765f4aa87e0e2d8a49d8660cc1fbc Mon Sep 17 00:00:00 2001 From: Junlee Kim Date: Fri, 14 Feb 2025 09:29:10 +0100 Subject: [PATCH 0218/1650] [PWGLF] adding qa plots (#9941) Co-authored-by: ALICE Action Bot --- .../Tasks/Strangeness/lambdapolarization.cxx | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/PWGLF/Tasks/Strangeness/lambdapolarization.cxx b/PWGLF/Tasks/Strangeness/lambdapolarization.cxx index 93d6b4ec2ba..15dad3e7e15 100644 --- a/PWGLF/Tasks/Strangeness/lambdapolarization.cxx +++ b/PWGLF/Tasks/Strangeness/lambdapolarization.cxx @@ -134,10 +134,15 @@ struct lambdapolarization { Configurable cfgCalcCum{"cfgCalcCum", false, "flag to calculate cumulants"}; + Configurable cfgRapidityDep{"cfgRapidityDep", false, "flag for rapidity dependent study"}; + Configurable cfgAccAzimuth{"cfgAccAzimuth", false, "flag for azimuth closure study"}; + ConfigurableAxis massAxis{"massAxis", {30, 1.1, 1.13}, "Invariant mass axis"}; ConfigurableAxis ptAxis{"ptAxis", {VARIABLE_WIDTH, 0.2, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 6.5, 8.0, 10.0, 100.0}, "Transverse momentum bins"}; ConfigurableAxis centAxis{"centAxis", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 100}, "Centrality interval"}; ConfigurableAxis cosAxis{"cosAxis", {110, -1.05, 1.05}, "Cosine axis"}; + ConfigurableAxis RapAxis{"RapAxis", {10, -0.5, 0.5}, "Rapidity axis"}; + ConfigurableAxis qqAxis{"qqAxis", {100, -0.1, 0.1}, "qq axis"}; TF1* fMultPVCutLow = nullptr; TF1* fMultPVCutHigh = nullptr; @@ -203,9 +208,19 @@ struct lambdapolarization { histos.add(Form("psi%d/h_lambda_cos2", i), "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis, epAxis}}); histos.add(Form("psi%d/h_alambda_cos2", i), "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis, epAxis}}); + if (cfgRapidityDep) { + histos.add(Form("psi%d/h_lambda_cos2_rap", i), "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis, RapAxis}}); + histos.add(Form("psi%d/h_alambda_cos2_rap", i), "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis, RapAxis}}); + } + histos.add(Form("psi%d/h_lambda_cossin", i), "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); histos.add(Form("psi%d/h_alambda_cossin", i), "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); + if (cfgAccAzimuth) { + histos.add(Form("psi%d/h_lambda_coscos", i), "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); + histos.add(Form("psi%d/h_alambda_coscos", i), "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); + } + histos.add(Form("psi%d/h_lambda_vncos", i), "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); histos.add(Form("psi%d/h_lambda_vnsin", i), "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); histos.add(Form("psi%d/h_alambda_vncos", i), "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); @@ -264,6 +279,14 @@ struct lambdapolarization { histos.add(Form("psi%d/QA/EP_RefA", i), "", {HistType::kTH2F, {centQaAxis, epQaAxis}}); histos.add(Form("psi%d/QA/EP_RefB", i), "", {HistType::kTH2F, {centQaAxis, epQaAxis}}); + histos.add(Form("psi%d/QA/qqAxis_Det_RefA_xx", i), "", {HistType::kTH2F, {centQaAxis, qqAxis}}); + histos.add(Form("psi%d/QA/qqAxis_Det_RefB_xx", i), "", {HistType::kTH2F, {centQaAxis, qqAxis}}); + histos.add(Form("psi%d/QA/qqAxis_RefA_RefB_xx", i), "", {HistType::kTH2F, {centQaAxis, qqAxis}}); + + histos.add(Form("psi%d/QA/qqAxis_Det_RefA_yy", i), "", {HistType::kTH2F, {centQaAxis, qqAxis}}); + histos.add(Form("psi%d/QA/qqAxis_Det_RefB_yy", i), "", {HistType::kTH2F, {centQaAxis, qqAxis}}); + histos.add(Form("psi%d/QA/qqAxis_RefA_RefB_yy", i), "", {HistType::kTH2F, {centQaAxis, qqAxis}}); + histos.add(Form("psi%d/QA/EPRes_Det_RefA", i), "", {HistType::kTH2F, {centQaAxis, cosAxis}}); histos.add(Form("psi%d/QA/EPRes_Det_RefB", i), "", {HistType::kTH2F, {centQaAxis, cosAxis}}); histos.add(Form("psi%d/QA/EPRes_RefA_RefB", i), "", {HistType::kTH2F, {centQaAxis, cosAxis}}); @@ -457,6 +480,14 @@ struct lambdapolarization { histos.fill(HIST("psi2/QA/EP_RefA"), centrality, TMath::ATan2(collision.qvecIm()[QvecRefAInd], collision.qvecRe()[QvecRefAInd]) / static_cast(nmode)); histos.fill(HIST("psi2/QA/EP_RefB"), centrality, TMath::ATan2(collision.qvecIm()[QvecRefBInd], collision.qvecRe()[QvecRefBInd]) / static_cast(nmode)); + histos.fill(HIST("psi2/QA/qqAxis_Det_RefA_xx"), centrality, collision.qvecRe()[QvecDetInd] * collision.qvecRe()[QvecRefAInd]); + histos.fill(HIST("psi2/QA/qqAxis_Det_RefB_xx"), centrality, collision.qvecRe()[QvecDetInd] * collision.qvecRe()[QvecRefBInd]); + histos.fill(HIST("psi2/QA/qqAxis_RefA_RefB_xx"), centrality, collision.qvecRe()[QvecRefAInd] * collision.qvecRe()[QvecRefBInd]); + + histos.fill(HIST("psi2/QA/qqAxis_Det_RefA_yy"), centrality, collision.qvecIm()[QvecDetInd] * collision.qvecIm()[QvecRefAInd]); + histos.fill(HIST("psi2/QA/qqAxis_Det_RefB_yy"), centrality, collision.qvecIm()[QvecDetInd] * collision.qvecIm()[QvecRefBInd]); + histos.fill(HIST("psi2/QA/qqAxis_RefA_RefB_yy"), centrality, collision.qvecIm()[QvecRefAInd] * collision.qvecIm()[QvecRefBInd]); + histos.fill(HIST("psi2/QA/EPRes_Det_RefA"), centrality, TMath::Cos(TMath::ATan2(collision.qvecIm()[QvecDetInd], collision.qvecRe()[QvecDetInd]) - TMath::ATan2(collision.qvecIm()[QvecRefAInd], collision.qvecRe()[QvecRefAInd]))); histos.fill(HIST("psi2/QA/EPRes_Det_RefB"), centrality, TMath::Cos(TMath::ATan2(collision.qvecIm()[QvecDetInd], collision.qvecRe()[QvecDetInd]) - TMath::ATan2(collision.qvecIm()[QvecRefBInd], collision.qvecRe()[QvecRefBInd]))); histos.fill(HIST("psi2/QA/EPRes_RefA_RefB"), centrality, TMath::Cos(TMath::ATan2(collision.qvecIm()[QvecRefAInd], collision.qvecRe()[QvecRefAInd]) - TMath::ATan2(collision.qvecIm()[QvecRefBInd], collision.qvecRe()[QvecRefBInd]))); @@ -465,6 +496,14 @@ struct lambdapolarization { histos.fill(HIST("psi3/QA/EP_RefA"), centrality, TMath::ATan2(collision.qvecIm()[QvecRefAInd], collision.qvecRe()[QvecRefAInd]) / static_cast(nmode)); histos.fill(HIST("psi3/QA/EP_RefB"), centrality, TMath::ATan2(collision.qvecIm()[QvecRefBInd], collision.qvecRe()[QvecRefBInd]) / static_cast(nmode)); + histos.fill(HIST("psi3/QA/qqAxis_Det_RefA_xx"), centrality, collision.qvecRe()[QvecDetInd] * collision.qvecRe()[QvecRefAInd]); + histos.fill(HIST("psi3/QA/qqAxis_Det_RefB_xx"), centrality, collision.qvecRe()[QvecDetInd] * collision.qvecRe()[QvecRefBInd]); + histos.fill(HIST("psi3/QA/qqAxis_RefA_RefB_xx"), centrality, collision.qvecRe()[QvecRefAInd] * collision.qvecRe()[QvecRefBInd]); + + histos.fill(HIST("psi3/QA/qqAxis_Det_RefA_yy"), centrality, collision.qvecIm()[QvecDetInd] * collision.qvecIm()[QvecRefAInd]); + histos.fill(HIST("psi3/QA/qqAxis_Det_RefB_yy"), centrality, collision.qvecIm()[QvecDetInd] * collision.qvecIm()[QvecRefBInd]); + histos.fill(HIST("psi3/QA/qqAxis_RefA_RefB_yy"), centrality, collision.qvecIm()[QvecRefAInd] * collision.qvecIm()[QvecRefBInd]); + histos.fill(HIST("psi3/QA/EPRes_Det_RefA"), centrality, TMath::Cos(TMath::ATan2(collision.qvecIm()[QvecDetInd], collision.qvecRe()[QvecDetInd]) - TMath::ATan2(collision.qvecIm()[QvecRefAInd], collision.qvecRe()[QvecRefAInd]))); histos.fill(HIST("psi3/QA/EPRes_Det_RefB"), centrality, TMath::Cos(TMath::ATan2(collision.qvecIm()[QvecDetInd], collision.qvecRe()[QvecDetInd]) - TMath::ATan2(collision.qvecIm()[QvecRefBInd], collision.qvecRe()[QvecRefBInd]))); histos.fill(HIST("psi3/QA/EPRes_RefA_RefB"), centrality, TMath::Cos(TMath::ATan2(collision.qvecIm()[QvecRefAInd], collision.qvecRe()[QvecRefAInd]) - TMath::ATan2(collision.qvecIm()[QvecRefBInd], collision.qvecRe()[QvecRefBInd]))); @@ -473,6 +512,14 @@ struct lambdapolarization { histos.fill(HIST("psi4/QA/EP_RefA"), centrality, TMath::ATan2(collision.qvecIm()[QvecRefAInd], collision.qvecRe()[QvecRefAInd]) / static_cast(nmode)); histos.fill(HIST("psi4/QA/EP_RefB"), centrality, TMath::ATan2(collision.qvecIm()[QvecRefBInd], collision.qvecRe()[QvecRefBInd]) / static_cast(nmode)); + histos.fill(HIST("psi4/QA/qqAxis_Det_RefA_xx"), centrality, collision.qvecRe()[QvecDetInd] * collision.qvecRe()[QvecRefAInd]); + histos.fill(HIST("psi4/QA/qqAxis_Det_RefB_xx"), centrality, collision.qvecRe()[QvecDetInd] * collision.qvecRe()[QvecRefBInd]); + histos.fill(HIST("psi4/QA/qqAxis_RefA_RefB_xx"), centrality, collision.qvecRe()[QvecRefAInd] * collision.qvecRe()[QvecRefBInd]); + + histos.fill(HIST("psi4/QA/qqAxis_Det_RefA_yy"), centrality, collision.qvecIm()[QvecDetInd] * collision.qvecIm()[QvecRefAInd]); + histos.fill(HIST("psi4/QA/qqAxis_Det_RefB_yy"), centrality, collision.qvecIm()[QvecDetInd] * collision.qvecIm()[QvecRefBInd]); + histos.fill(HIST("psi4/QA/qqAxis_RefA_RefB_yy"), centrality, collision.qvecIm()[QvecRefAInd] * collision.qvecIm()[QvecRefBInd]); + histos.fill(HIST("psi4/QA/EPRes_Det_RefA"), centrality, TMath::Cos(TMath::ATan2(collision.qvecIm()[QvecDetInd], collision.qvecRe()[QvecDetInd]) - TMath::ATan2(collision.qvecIm()[QvecRefAInd], collision.qvecRe()[QvecRefAInd]))); histos.fill(HIST("psi4/QA/EPRes_Det_RefB"), centrality, TMath::Cos(TMath::ATan2(collision.qvecIm()[QvecDetInd], collision.qvecRe()[QvecDetInd]) - TMath::ATan2(collision.qvecIm()[QvecRefBInd], collision.qvecRe()[QvecRefBInd]))); histos.fill(HIST("psi4/QA/EPRes_RefA_RefB"), centrality, TMath::Cos(TMath::ATan2(collision.qvecIm()[QvecRefAInd], collision.qvecRe()[QvecRefAInd]) - TMath::ATan2(collision.qvecIm()[QvecRefBInd], collision.qvecRe()[QvecRefBInd]))); @@ -638,6 +685,14 @@ struct lambdapolarization { histos.fill(HIST("psi2/h_lambda_vncos"), v0.mLambda(), v0.pt(), qvecMag * TMath::Cos(relphi), centrality, weight); histos.fill(HIST("psi2/h_lambda_vnsin"), v0.mLambda(), v0.pt(), TMath::Sin(relphi), centrality, weight); + if (cfgRapidityDep) { + histos.fill(HIST("psi2/h_lambda_cos2_rap"), v0.mLambda(), v0.pt(), angle * angle, centrality, v0.yLambda(), weight); + } + + if (cfgAccAzimuth) { + histos.fill(HIST("psi2/h_lambda_coscos"), v0.mLambda(), v0.pt(), angle * TMath::Cos(relphi), centrality, weight); + } + if (cfgCalcCum) { histos.fill(HIST("psi2/QA/cosTheta_l"), v0.mLambda(), v0.pt(), angle, centrality); histos.fill(HIST("psi2/QA/cosPsi_l"), v0.mLambda(), v0.pt(), TMath::Cos(psi * 2.0), centrality); @@ -663,6 +718,14 @@ struct lambdapolarization { histos.fill(HIST("psi2/h_alambda_vncos"), v0.mAntiLambda(), v0.pt(), qvecMag * TMath::Cos(relphi), centrality, weight); histos.fill(HIST("psi2/h_alambda_vnsin"), v0.mAntiLambda(), v0.pt(), TMath::Sin(relphi), centrality, weight); + if (cfgRapidityDep) { + histos.fill(HIST("psi2/h_alambda_cos2_rap"), v0.mAntiLambda(), v0.pt(), angle * angle, centrality, v0.yLambda(), weight); + } + + if (cfgAccAzimuth) { + histos.fill(HIST("psi2/h_alambda_coscos"), v0.mAntiLambda(), v0.pt(), angle * TMath::Cos(relphi), centrality, weight); + } + if (cfgCalcCum) { histos.fill(HIST("psi2/QA/cosTheta_al"), v0.mLambda(), v0.pt(), angle, centrality); histos.fill(HIST("psi2/QA/cosPsi_al"), v0.mLambda(), v0.pt(), TMath::Cos(psi * 2.0), centrality); @@ -688,6 +751,14 @@ struct lambdapolarization { histos.fill(HIST("psi3/h_lambda_cossin"), v0.mLambda(), v0.pt(), angle * TMath::Sin(relphi), centrality, weight); histos.fill(HIST("psi3/h_lambda_vncos"), v0.mLambda(), v0.pt(), qvecMag * TMath::Cos(relphi), centrality, weight); histos.fill(HIST("psi3/h_lambda_vnsin"), v0.mLambda(), v0.pt(), TMath::Sin(relphi), centrality, weight); + + if (cfgRapidityDep) { + histos.fill(HIST("psi3/h_lambda_cos2_rap"), v0.mLambda(), v0.pt(), angle * angle, centrality, v0.yLambda(), weight); + } + + if (cfgAccAzimuth) { + histos.fill(HIST("psi3/h_lambda_coscos"), v0.mLambda(), v0.pt(), angle * TMath::Cos(relphi), centrality, weight); + } } if (aLambdaTag) { histos.fill(HIST("psi3/h_alambda_cos"), v0.mAntiLambda(), v0.pt(), angle, centrality, relphi, weight); @@ -695,6 +766,14 @@ struct lambdapolarization { histos.fill(HIST("psi3/h_alambda_cossin"), v0.mAntiLambda(), v0.pt(), angle * TMath::Sin(relphi), centrality, weight); histos.fill(HIST("psi3/h_alambda_vncos"), v0.mAntiLambda(), v0.pt(), qvecMag * TMath::Cos(relphi), centrality, weight); histos.fill(HIST("psi3/h_alambda_vnsin"), v0.mAntiLambda(), v0.pt(), TMath::Sin(relphi), centrality, weight); + + if (cfgRapidityDep) { + histos.fill(HIST("psi3/h_alambda_cos2_rap"), v0.mAntiLambda(), v0.pt(), angle * angle, centrality, v0.yLambda(), weight); + } + + if (cfgAccAzimuth) { + histos.fill(HIST("psi3/h_alambda_coscos"), v0.mAntiLambda(), v0.pt(), angle * TMath::Cos(relphi), centrality, weight); + } } } else if (nmode == 4) { if (LambdaTag) { @@ -703,6 +782,14 @@ struct lambdapolarization { histos.fill(HIST("psi4/h_lambda_cossin"), v0.mLambda(), v0.pt(), angle * TMath::Sin(relphi), centrality, weight); histos.fill(HIST("psi4/h_lambda_vncos"), v0.mLambda(), v0.pt(), qvecMag * TMath::Cos(relphi), centrality, weight); histos.fill(HIST("psi4/h_lambda_vnsin"), v0.mLambda(), v0.pt(), TMath::Sin(relphi), centrality, weight); + + if (cfgRapidityDep) { + histos.fill(HIST("psi4/h_lambda_cos2_rap"), v0.mLambda(), v0.pt(), angle * angle, centrality, v0.yLambda(), weight); + } + + if (cfgAccAzimuth) { + histos.fill(HIST("psi4/h_lambda_coscos"), v0.mLambda(), v0.pt(), angle * TMath::Cos(relphi), centrality, weight); + } } if (aLambdaTag) { histos.fill(HIST("psi4/h_alambda_cos"), v0.mAntiLambda(), v0.pt(), angle, centrality, relphi, weight); @@ -710,6 +797,14 @@ struct lambdapolarization { histos.fill(HIST("psi4/h_alambda_cossin"), v0.mAntiLambda(), v0.pt(), angle * TMath::Sin(relphi), centrality, weight); histos.fill(HIST("psi4/h_alambda_vncos"), v0.mAntiLambda(), v0.pt(), qvecMag * TMath::Cos(relphi), centrality, weight); histos.fill(HIST("psi4/h_alambda_vnsin"), v0.mAntiLambda(), v0.pt(), TMath::Sin(relphi), centrality, weight); + + if (cfgRapidityDep) { + histos.fill(HIST("psi4/h_alambda_cos2_rap"), v0.mAntiLambda(), v0.pt(), angle * angle, centrality, v0.yLambda(), weight); + } + + if (cfgAccAzimuth) { + histos.fill(HIST("psi4/h_alambda_coscos"), v0.mAntiLambda(), v0.pt(), angle * TMath::Cos(relphi), centrality, weight); + } } } ////////// FIXME: not possible to get histograms using nmode } From fa880610b8c0fbd0bafaca5d351733f1ddcd1635 Mon Sep 17 00:00:00 2001 From: eloviyo <38348689+Eloviyo@users.noreply.github.com> Date: Fri, 14 Feb 2025 10:29:16 +0100 Subject: [PATCH 0219/1650] [PWGCF] FemtoUniverse cascade task -- added process function for cascade efficiency correction (#9960) Co-authored-by: Shirajum Monira --- .../femtoUniverseProducerTask.cxx | 115 ++++++++++++++---- 1 file changed, 89 insertions(+), 26 deletions(-) diff --git a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx index ad2144873d0..705af03faac 100644 --- a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx +++ b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx @@ -15,7 +15,9 @@ /// \author Zuzanna Chochulska, WUT Warsaw & CTU Prague, zchochul@cern.ch /// \author Malgorzata Janik, WUT Warsaw, majanik@cern.ch /// \author Pritam Chakraborty, WUT Warsaw, pritam.chakraborty@cern.ch +/// \author Shirajum Monira, WUT Warsaw, shirajum.monira@cern.ch +#include #include #include #include @@ -465,10 +467,10 @@ struct FemtoUniverseProducerTask { void init(InitContext&) { - if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackCascadeData || doprocessTrackD0mesonData || doprocessTrackD0DataML || doprocessTrackCentRun2Data || doprocessTrackV0CentRun2Data || doprocessTrackCentRun3Data || doprocessV0CentRun3Data || doprocessCascadeCentRun3Data || doprocessTrackDataCentPP) == false && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth || doprocessTrackMCGen || doprocessTruthAndFullMC || doprocessFullMCCent || doprocessTrackCentRun3DataMC) == false) { + if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackCascadeData || doprocessTrackD0mesonData || doprocessTrackD0DataML || doprocessTrackCentRun2Data || doprocessTrackV0CentRun2Data || doprocessTrackCentRun3Data || doprocessV0CentRun3Data || doprocessCascadeCentRun3Data || doprocessTrackDataCentPP) == false && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth || doprocessTrackMCGen || doprocessTruthAndFullMCV0 || doprocessTruthAndFullMCCasc || doprocessFullMCCent || doprocessTrackCentRun3DataMC) == false) { LOGF(fatal, "Neither processFullData nor processFullMC enabled. Please choose one."); } - if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackCascadeData || doprocessTrackD0mesonData || doprocessTrackD0DataML || doprocessTrackCentRun2Data || doprocessTrackV0CentRun2Data || doprocessTrackCentRun3Data || doprocessV0CentRun3Data || doprocessCascadeCentRun3Data || doprocessTrackDataCentPP) == true && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth || doprocessTrackMCGen || doprocessTruthAndFullMC || doprocessFullMCCent || doprocessTrackCentRun3DataMC) == true) { + if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackCascadeData || doprocessTrackD0mesonData || doprocessTrackD0DataML || doprocessTrackCentRun2Data || doprocessTrackV0CentRun2Data || doprocessTrackCentRun3Data || doprocessV0CentRun3Data || doprocessCascadeCentRun3Data || doprocessTrackDataCentPP) == true && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth || doprocessTrackMCGen || doprocessTruthAndFullMCV0 || doprocessTruthAndFullMCCasc || doprocessFullMCCent || doprocessTrackCentRun3DataMC) == true) { LOGF(fatal, "Cannot enable process Data and process MC at the same time. " "Please choose one."); @@ -1121,9 +1123,9 @@ struct FemtoUniverseProducerTask { 0, 0); const int rowOfPosTrack = outputCascParts.lastIndex(); - // if constexpr (isMC) { - // fillMCParticle(postrack, o2::aod::femtouniverseparticle::ParticleType::kV0Child); - // } + if constexpr (isMC) { + fillMCParticle(posTrackCasc, o2::aod::femtouniverseparticle::ParticleType::kV0Child); + } int negtrackID = casc.negTrackId(); int rowInPrimaryTrackTableNeg = -1; rowInPrimaryTrackTableNeg = getRowDaughters(negtrackID, tmpIDtrack); @@ -1152,9 +1154,9 @@ struct FemtoUniverseProducerTask { 0, 0); const int rowOfNegTrack = outputCascParts.lastIndex(); - // if constexpr (isMC) { - // fillMCParticle(negtrack, o2::aod::femtouniverseparticle::ParticleType::kV0Child); - // } + if constexpr (isMC) { + fillMCParticle(negTrackCasc, o2::aod::femtouniverseparticle::ParticleType::kV0Child); + } // bachelor int bachtrackID = casc.bachelorId(); int rowInPrimaryTrackTableBach = -1; @@ -1184,6 +1186,9 @@ struct FemtoUniverseProducerTask { 0, 0); const int rowOfBachTrack = outputCascParts.lastIndex(); + if constexpr (isMC) { + fillMCParticle(bachTrackCasc, o2::aod::femtouniverseparticle::ParticleType::kCascadeBachelor); + } // cascade std::vector indexCascChildID = {rowOfPosTrack, rowOfNegTrack, rowOfBachTrack}; outputCascParts(outputCollision.lastIndex(), @@ -1213,6 +1218,9 @@ struct FemtoUniverseProducerTask { fillDebugParticle(bachTrackCasc); // QA for negative daughter fillDebugParticle(casc); // QA for cascade } + if constexpr (isMC) { + fillMCParticle(casc, o2::aod::femtouniverseparticle::ParticleType::kCascade); + } } } @@ -1676,6 +1684,7 @@ struct FemtoUniverseProducerTask { 0, 0); } else { + childIDs.push_back(0); outputCascParts(outputCollision.lastIndex(), particle.pt(), particle.eta(), @@ -1699,9 +1708,14 @@ struct FemtoUniverseProducerTask { if constexpr (resolveDaughs) { childIDs[0] = 0; childIDs[1] = 0; + auto minDaughs = 2ul; + if (confIsActivateCascade) { + childIDs.push_back(0); + minDaughs = 3ul; + } for (std::size_t i = 0; i < tmpIDtrack.size(); i++) { const auto& particle = tracks.iteratorAt(tmpIDtrack[i] - tracks.begin().globalIndex()); - for (int daughIndex = 0, n = std::min(2ul, particle.daughtersIds().size()); daughIndex < n; daughIndex++) { + for (int daughIndex = 0, n = std::min(minDaughs, particle.daughtersIds().size()); daughIndex < n; daughIndex++) { // loop to find the corresponding index of the daughters for (std::size_t j = 0; j < tmpIDtrack.size(); j++) { if (tmpIDtrack[j] == particle.daughtersIds()[daughIndex]) { @@ -1710,17 +1724,29 @@ struct FemtoUniverseProducerTask { } } } - outputParts(outputCollision.lastIndex(), - particle.pt(), - particle.eta(), - particle.phi(), - aod::femtouniverseparticle::ParticleType::kMCTruthTrack, - 0, - static_cast(particle.pdgCode()), - particle.pdgCode(), - childIDs, - 0, - 0); + if (!confIsActivateCascade) { + outputParts(outputCollision.lastIndex(), + particle.pt(), + particle.eta(), + particle.phi(), + aod::femtouniverseparticle::ParticleType::kMCTruthTrack, + 0, + static_cast(particle.pdgCode()), + particle.pdgCode(), + childIDs, + 0, + 0); + } else { + outputCascParts(outputCollision.lastIndex(), + particle.pt(), + particle.eta(), + particle.phi(), + aod::femtouniverseparticle::ParticleType::kMCTruthTrack, + 0, + static_cast(particle.pdgCode()), + particle.pdgCode(), + childIDs, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + } if (confIsDebug) { fillDebugParticle(particle); } @@ -1980,25 +2006,37 @@ struct FemtoUniverseProducerTask { } PROCESS_SWITCH(FemtoUniverseProducerTask, processTrackMCGen, "Provide MC Generated for model comparisons", false); + template + using HasBachelor = decltype(std::declval().bachelorphi()); + Preslice perMCCollision = aod::mcparticle::mcCollisionId; PresliceUnsorted> recoCollsPerMCColl = aod::mcparticle::mcCollisionId; Preslice> perCollisionTracks = aod::track::collisionId; - Preslice> perCollisionV0s = aod::track::collisionId; + template void processTruthAndFullMC( aod::McCollisions const& mccols, aod::McParticles const& mcParticles, soa::Join const& collisions, soa::Filtered> const& tracks, - soa::Join const& fullV0s, - aod::BCsWithTimestamps const&) + StrangePartType const& strangeParts, + aod::BCsWithTimestamps const&, + Preslice& ps) { // recos std::set recoMcIds; for (const auto& col : collisions) { auto groupedTracks = tracks.sliceBy(perCollisionTracks, col.globalIndex()); - auto groupedV0s = fullV0s.sliceBy(perCollisionV0s, col.globalIndex()); + auto groupedStrageParts = strangeParts.sliceBy(ps, col.globalIndex()); getMagneticFieldTesla(col.bc_as()); - fillCollisionsAndTracksAndV0AndPhi(col, groupedTracks, groupedV0s); + if constexpr (std::experimental::is_detected::value) { + const auto colcheck = fillCollisions(col, groupedTracks); + if (colcheck) { + fillTracks(groupedTracks); + fillCascade(col, groupedStrageParts, groupedTracks); + } + } else { + fillCollisionsAndTracksAndV0AndPhi(col, groupedTracks, groupedStrageParts); + } for (const auto& track : groupedTracks) { if (trackCuts.isSelectedMinimal(track)) recoMcIds.insert(track.mcParticleId()); @@ -2013,7 +2051,32 @@ struct FemtoUniverseProducerTask { fillParticles(groupedMCParticles, recoMcIds); // fills mc particles } } - PROCESS_SWITCH(FemtoUniverseProducerTask, processTruthAndFullMC, "Provide both MC truth and reco for tracks and V0s", false); + + Preslice> perCollisionV0s = aod::track::collisionId; + void processTruthAndFullMCV0( + aod::McCollisions const& mccols, + aod::McParticles const& mcParticles, + soa::Join const& collisions, + soa::Filtered> const& tracks, + soa::Join const& fullV0s, + aod::BCsWithTimestamps const& bcs) + { + processTruthAndFullMC(mccols, mcParticles, collisions, tracks, fullV0s, bcs, perCollisionV0s); + } + PROCESS_SWITCH(FemtoUniverseProducerTask, processTruthAndFullMCV0, "Provide both MC truth and reco for tracks and V0s", false); + + Preslice> perCollisionCascs = aod::track::collisionId; + void processTruthAndFullMCCasc( + aod::McCollisions const& mccols, + aod::McParticles const& mcParticles, + soa::Join const& collisions, + soa::Filtered> const& tracks, + soa::Join const& fullCascades, + aod::BCsWithTimestamps const& bcs) + { + processTruthAndFullMC(mccols, mcParticles, collisions, tracks, fullCascades, bcs, perCollisionCascs); + } + PROCESS_SWITCH(FemtoUniverseProducerTask, processTruthAndFullMCCasc, "Provide both MC truth and reco for tracks and Cascades", false); void processFullMCCent(aod::FemtoFullCollisionCentRun3 const& col, aod::BCsWithTimestamps const&, From 54c297bb105287caaa17c38e933d866132d02816 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Fri, 14 Feb 2025 19:34:03 +0900 Subject: [PATCH 0220/1650] [PWGEM/Dilepton] quick fix to treeCreator MLDDA (#9962) --- .../treeCreatorElectronMLDDA.cxx | 47 ++++++++++--------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx index a08fbdff724..e603030d364 100644 --- a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx +++ b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx @@ -97,15 +97,15 @@ struct TreeCreatorElectronMLDDA { {"V0/hTOFbeta_P_Ka", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, {"V0/hTOFbeta_P_Pr", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, - {"V0/hITSobClusterSize_P_El", "mean ITSob cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, - {"V0/hITSobClusterSize_P_Mu", "mean ITSob cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, - {"V0/hITSobClusterSize_P_Pi", "mean ITSob cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, - {"V0/hITSobClusterSize_P_Ka", "mean ITSob cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, - {"V0/hITSobClusterSize_P_Pr", "mean ITSob cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, + {"V0/hITSClusterSize_P_El", "mean ITS cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, + {"V0/hITSClusterSize_P_Mu", "mean ITS cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, + {"V0/hITSClusterSize_P_Pi", "mean ITS cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, + {"V0/hITSClusterSize_P_Ka", "mean ITS cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, + {"V0/hITSClusterSize_P_Pr", "mean ITS cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, {"PrimaryTrack/hTPCdEdx_P", "TPC dEdx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, {"PrimaryTrack/hTOFbeta_P", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, - {"PrimaryTrack/hITSobClusterSize_P", "mean ITSob cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, + {"PrimaryTrack/hITSClusterSize_P", "mean ITS cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, {"PrimaryTrack/hTPCNsigmaEl_P", "TPC n#sigma_{e} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{e}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, {"PrimaryTrack/hTPCNsigmaMu_P", "TPC n#sigma_{#mu} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{#mu}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, {"PrimaryTrack/hTPCNsigmaPi_P", "TPC n#sigma_{#pi} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{#pi}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, @@ -129,10 +129,10 @@ struct TreeCreatorElectronMLDDA { {"Cascade/hMassAntiLambda", "V0 mass AntiLambda in cascade", {HistType::kTH1F, {{100, 1.05, 1.15}}}}, {"Cascade/hMassXi", "cascade mass #Xi", {HistType::kTH1F, {{200, 1.2, 1.4}}}}, {"Cascade/hMassOmega", "cascade mass #Omega", {HistType::kTH1F, {{200, 1.6, 1.8}}}}, - {"Cascade/hMassPt_Xi", "cascade mass #Xi;m_{#Lambda#pi} (GeV/c^{2});p_{T,#Lambda#pi} (GeV/c)", {HistType::kTH2F, {{200, 1.2, 1.4}, {100, 0, 10}}}}, - {"Cascade/hMassPt_Xi_bachelor", "cascade mass #Xi;m_{#Lambda#pi} (GeV/c^{2});p_{T,#pi} (GeV/c)", {HistType::kTH2F, {{200, 1.2, 1.4}, {100, 0, 10}}}}, - {"Cascade/hMassPt_Omega", "cascade mass;#Omegam_{#LambdaK} (GeV/c^{2});p_{T,#LambdaK} (GeV/c)", {HistType::kTH2F, {{200, 1.6, 1.8}, {100, 0, 10}}}}, - {"Cascade/hMassPt_Omega_bachelor", "cascade mass #Omega;m_{#LambdaK} (GeV/c^{2});p_{T,K} (GeV/c)", {HistType::kTH2F, {{200, 1.6, 1.8}, {100, 0, 10}}}}, + {"Cascade/hMassPt_Xi", "cascade mass #Xi^{#pm};m_{#Lambda#pi} (GeV/c^{2});p_{T,#Lambda#pi} (GeV/c)", {HistType::kTH2F, {{200, 1.2, 1.4}, {100, 0, 10}}}}, + {"Cascade/hMassPt_Xi_bachelor", "cascade mass #Xi^{#pm};m_{#Lambda#pi} (GeV/c^{2});p_{T,#pi} (GeV/c)", {HistType::kTH2F, {{200, 1.2, 1.4}, {100, 0, 10}}}}, + {"Cascade/hMassPt_Omega", "cascade mass #Omega^{#pm};m_{#LambdaK} (GeV/c^{2});p_{T,#LambdaK} (GeV/c)", {HistType::kTH2F, {{200, 1.6, 1.8}, {100, 0, 10}}}}, + {"Cascade/hMassPt_Omega_bachelor", "cascade mass #Omega^{#pm};m_{#LambdaK} (GeV/c^{2});p_{T,K} (GeV/c)", {HistType::kTH2F, {{200, 1.6, 1.8}, {100, 0, 10}}}}, }, }; @@ -153,7 +153,7 @@ struct TreeCreatorElectronMLDDA { Configurable downscaling_pion{"downscaling_pion", 0.001, "down scaling factor to store pion"}; Configurable downscaling_kaon{"downscaling_kaon", 1.1, "down scaling factor to store kaon"}; Configurable downscaling_proton{"downscaling_proton", 0.01, "down scaling factor to store proton"}; - Configurable store_v0photons{"store_v0photons", false, "create training data from v0 photons"}; + Configurable store_v0photons{"store_v0photons", true, "create training data from v0 photons"}; Configurable slope{"slope", 0.0185, "slope for m vs. phiv"}; Configurable intercept{"intercept", -0.0380, "intercept for m vs. phiv"}; @@ -165,8 +165,8 @@ struct TreeCreatorElectronMLDDA { Configurable cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 0.7, "max fraction of shared clusters in TPC"}; Configurable cfg_min_ncrossedrows_tpc{"cfg_min_ncrossedrows_tpc", 70, "min ncrossed rows"}; Configurable cfg_min_ncluster_tpc{"cfg_min_ncluster_tpc", 0, "min ncluster tpc"}; - Configurable cfg_min_ncluster_its{"cfg_min_ncluster_its", 4, "min ncluster its"}; - Configurable cfg_min_ncluster_itsib{"cfg_min_ncluster_itsib", 1, "min ncluster itsib"}; + Configurable cfg_min_ncluster_its{"cfg_min_ncluster_its", 2, "min ncluster its"}; + Configurable cfg_min_ncluster_itsib{"cfg_min_ncluster_itsib", 0, "min ncluster itsib"}; Configurable cfg_max_chi2tpc{"cfg_max_chi2tpc", 5.0, "max chi2/NclsTPC"}; Configurable cfg_max_chi2its{"cfg_max_chi2its", 6.0, "max chi2/NclsITS"}; Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 0.3, "max dca XY in cm"}; @@ -188,8 +188,8 @@ struct TreeCreatorElectronMLDDA { Configurable cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 0.7, "max fraction of shared clusters in TPC"}; Configurable cfg_min_ncrossedrows_tpc{"cfg_min_ncrossedrows_tpc", 70, "min ncrossed rows"}; Configurable cfg_min_ncluster_tpc{"cfg_min_ncluster_tpc", 0, "min ncluster tpc"}; - Configurable cfg_min_ncluster_its{"cfg_min_ncluster_its", 4, "min ncluster its"}; - Configurable cfg_min_ncluster_itsib{"cfg_min_ncluster_itsib", 1, "min ncluster itsib"}; + Configurable cfg_min_ncluster_its{"cfg_min_ncluster_its", 2, "min ncluster its"}; + Configurable cfg_min_ncluster_itsib{"cfg_min_ncluster_itsib", 0, "min ncluster itsib"}; Configurable cfg_max_chi2tpc{"cfg_max_chi2tpc", 5.0, "max chi2/NclsTPC"}; Configurable cfg_max_chi2its{"cfg_max_chi2its", 6.0, "max chi2/NclsITS"}; Configurable cfg_min_dcaxy_v0leg{"cfg_min_dcaxy_v0leg", 0.1, "min dca XY for v0 legs in cm"}; @@ -237,6 +237,8 @@ struct TreeCreatorElectronMLDDA { Configurable cfg_max_dcadau{"cfg_max_dcadau", 0.4, "max distance between bachelor and V0"}; Configurable cfg_min_rxy_v0{"cfg_min_rxy_v0", 1.2, "minimum V0 rxy in cascade"}; Configurable cfg_min_rxy{"cfg_min_rxy", 0.5, "minimum V0 rxy in cascade"}; + Configurable cfg_min_dcaxy_v0leg{"cfg_min_dcaxy_v0leg", 0.1, "min dca XY for v0 legs in cm"}; + Configurable cfg_min_dcaxy_bachelor{"cfg_min_dcaxy_bachelor", 0.1, "min dca XY for bachelor in cm"}; } cascadecuts; int mRunNumber; @@ -391,9 +393,9 @@ struct TreeCreatorElectronMLDDA { return false; } - if (std::fabs(track.dcaXY()) < v0cuts.cfg_min_dcaxy_v0leg) { - return false; - } + // if (std::fabs(track.dcaXY()) < v0cuts.cfg_min_dcaxy_v0leg) { // this is applied in filter. + // return false; + // } if (track.itsNCls() < v0cuts.cfg_min_ncluster_its) { return false; @@ -488,18 +490,19 @@ struct TreeCreatorElectronMLDDA { } //! type of V0. 0: built solely for cascades (does not pass standard V0 cuts), 1: standard 2, 3: photon-like with TPC-only use. Regular analysis should always use type 1. - Filter v0Filter = o2::aod::v0data::v0Type == uint8_t(1) && o2::aod::v0data::v0cosPA > v0cuts.cfg_min_cospa.value&& o2::aod::v0data::dcaV0daughters < v0cuts.cfg_max_dcadau.value; + Filter v0Filter = o2::aod::v0data::v0Type == uint8_t(1) && o2::aod::v0data::v0cosPA > v0cuts.cfg_min_cospa.value&& o2::aod::v0data::dcaV0daughters v0cuts.cfg_min_dcaxy_v0leg&& nabs(o2::aod::v0data::dcanegtopv) > v0cuts.cfg_min_dcaxy_v0leg; using filteredV0s = soa::Filtered; + Filter cascadeFilter = o2::aod::cascdata::dcacascdaughters < cascadecuts.cfg_max_dcadau.value && nabs(o2::aod::cascdata::dcanegtopv) > cascadecuts.cfg_min_dcaxy_v0leg&& nabs(o2::aod::cascdata::dcanegtopv) > cascadecuts.cfg_min_dcaxy_v0leg&& nabs(o2::aod::cascdata::dcabachtopv) > cascadecuts.cfg_min_dcaxy_bachelor; + using filteredCascades = soa::Filtered; + Filter collisionFilter_common = nabs(o2::aod::collision::posZ) < 10.f && o2::aod::evsel::sel8 == true; using filteredMyCollisions = soa::Filtered; - //! type of V0. 0: built solely for cascades (does not pass standard V0 cuts), 1: standard 2, 3: photon-like with TPC-only use. Regular analysis should always use type 1 or 3. Preslice perCollision_v0 = o2::aod::v0data::collisionId; Preslice perCollision_cascade = o2::aod::cascdata::collisionId; Preslice perCollision_track = o2::aod::track::collisionId; - // Don't apply filter to tracks, because posTrack_as<>, negTrack_as<> is used. Partition posTracks = o2::aod::track::signed1Pt > 0.f && ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::ITS) == true && ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::TPC) == true; Partition negTracks = o2::aod::track::signed1Pt < 0.f && ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::ITS) == true && ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::TPC) == true; std::vector stored_trackIds; @@ -717,7 +720,7 @@ struct TreeCreatorElectronMLDDA { registry.fill(HIST("PrimaryTrack/hTPCdEdx_P"), track.p(), track.tpcSignal()); registry.fill(HIST("PrimaryTrack/hTOFbeta_P"), track.p(), track.beta()); - registry.fill(HIST("PrimaryTrack/hITSobClusterSize_P"), track.p(), meanClusterSizeITS<3, 7>(track) * std::cos(std::atan(track.tgl()))); + registry.fill(HIST("PrimaryTrack/hITSClusterSize_P"), track.p(), meanClusterSizeITS<0, 7>(track) * std::cos(std::atan(track.tgl()))); registry.fill(HIST("PrimaryTrack/hTPCNsigmaEl_P"), track.p(), track.tpcNSigmaEl()); registry.fill(HIST("PrimaryTrack/hTOFNsigmaEl_P"), track.p(), track.tofNSigmaEl()); registry.fill(HIST("PrimaryTrack/hTPCNsigmaMu_P"), track.p(), track.tpcNSigmaMu()); From 58543574e07d6f0d2c3394c111978431b9a13cc9 Mon Sep 17 00:00:00 2001 From: navneetkumar231295 <71565461+navneetkumar231295@users.noreply.github.com> Date: Fri, 14 Feb 2025 17:39:38 +0530 Subject: [PATCH 0221/1650] [PWGLF] To add the qa plots (#9936) Co-authored-by: Navneet --- .../Tasks/Resonances/chargedkstaranalysis.cxx | 1203 +++-------------- 1 file changed, 157 insertions(+), 1046 deletions(-) diff --git a/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx b/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx index 9daeae66180..d8820fff52a 100644 --- a/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx +++ b/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx @@ -8,12 +8,15 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. + +/// \file chargedkstaranalysis.cxx +/// \brief Reconstruction of track-track decay resonance candidates +/// /// -/// \brief this is a code for the CKS resonance -/// \author prottay das -/// \since 13/01/2024 +/// \author Protay -#include +#include "TF1.h" +// #include #include #include #include @@ -22,8 +25,8 @@ #include #include #include -#include -#include "TF1.h" +// #include +#include #include #include @@ -60,59 +63,62 @@ using std::array; struct chargedkstaranalysis { // Connect to ccdb - Service ccdb; - Configurable nolaterthan{ - "ccdb-no-later-than", - std::chrono::duration_cast( - std::chrono::system_clock::now().time_since_epoch()) - .count(), - "latest acceptable timestamp of creation for the object"}; - Configurable url{"ccdb-url", "http://ccdb-test.cern.ch:8080", - "url of the ccdb repository"}; - SliceCache cache; - + Preslice perRCol = aod::resodaughter::resoCollisionId; + Preslice perCollision = aod::track::collisionId; // For charged Kstarpp analysis use Resonance Initalizer and THnSparse ConfigurableAxis binsCent{"binsCent", {VARIABLE_WIDTH, 0., 1., 5., 10., 30., 50., 70., 100., 110.}, "Binning of the centrality axis"}; - ConfigurableAxis binsPt{"binsPt", {VARIABLE_WIDTH, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5.0, 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 6.0, 6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 6.7, 6.8, 6.9, 7.0, 7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 7.7, 7.8, 7.9, 8.0, 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9, 9.0, 9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7, 9.8, 9.9, 10.0, 10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8, 10.9, 11.0, 11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7, 11.8, 11.9, 12.0, 12.1, 12.2, 12.3, 12.4, 12.5, 12.6, 12.7, 12.8, 12.9, 13.0, 13.1, 13.2, 13.3, 13.4, 13.5, 13.6, 13.7, 13.8, 13.9, 14.0, 14.1, 14.2, 14.3, 14.4, 14.5, 14.6, 14.7, 14.8, 14.9, 15.0}, "Binning of the pT axis"}; - ConfigurableAxis Etabins{"Etabins", {VARIABLE_WIDTH, -1.0, -0.9, -0.8, -0.7, -0.6, -0.5, -0.4, -0.3, -0.2, -0.1, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0}, "Eta Binning"}; + ConfigurableAxis binsPt{"binsPt", + {VARIABLE_WIDTH, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5.0, 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 6.0, 6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 6.7, 6.8, 6.9, 7.0, 7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 7.7, 7.8, 7.9, 8.0, 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9, 9.0, 9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7, 9.8, 9.9, 10.0, 10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8, 10.9, 11.0, 11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7, 11.8, 11.9, 12.0, 12.1, 12.2, 12.3, 12.4, 12.5, 12.6, 12.7, 12.8, 12.9, 13.0, 13.1, 13.2, 13.3, 13.4, 13.5, 13.6, 13.7, 13.8, 13.9, 14.0, 14.1, 14.2, 14.3, 14.4, 14.5, 14.6, 14.7, 14.8, 14.9, 15.0}, + "Binning of the pT axis"}; + ConfigurableAxis etabins{"etabins", + {VARIABLE_WIDTH, -1.0, -0.9, -0.8, -0.7, -0.6, -0.5, -0.4, -0.3, -0.2, -0.1, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0}, + "Eta Binning"}; Configurable cDCABinsQA{"cDCABinsQA", 150, "DCA binning"}; - ConfigurableAxis binsPtQA{"binsPtQA", {VARIABLE_WIDTH, 0.0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8, 5.0, 5.2, 5.4, 5.6, 5.8, 6.0, 6.2, 6.4, 6.6, 6.8, 7.0, 7.2, 7.4, 7.6, 7.8, 8.0, 8.2, 8.4, 8.6, 8.8, 9.0, 9.2, 9.4, 9.6, 9.8, 10.0}, "Binning of the pT axis"}; + ConfigurableAxis binsPtQA{"binsPtQA", + {VARIABLE_WIDTH, 0.0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8, 5.0, 5.2, 5.4, 5.6, 5.8, 6.0, 6.2, 6.4, 6.6, 6.8, 7.0, 7.2, 7.4, 7.6, 7.8, 8.0, 8.2, 8.4, 8.6, 8.8, 9.0, 9.2, 9.4, 9.6, 9.8, 10.0}, + "Binning of the pT axis"}; - HistogramRegistry histos1{"histos1", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; - - // Histograms are defined with HistogramRegistry - HistogramRegistry rEventSelection{"eventSelection", - {}, - OutputObjHandlingPolicy::AnalysisObject, - true, - true}; - HistogramRegistry histos{ - "histos", + HistogramRegistry histos1{ + "histos1", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; - HistogramRegistry rGenParticles{"genParticles", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; - HistogramRegistry rRecParticles{"recParticles", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; - // Pre-selection cuts Configurable cMinPtcut{"cMinPtcut", 0.15, "Track minimum pt cut"}; + Configurable confevtcollintimerangestandard{"confevtcollintimerangestandard", true, "Evt sel: apply NoCollInTimeRangeStandard"}; /// PID Selections - Configurable nsigmaCutCombinedPion{"nsigmaCutCombinedPion", -999, "Combined nSigma cut for Pion"}; // Combined + Configurable nsigmaCutCombinedPion{"nsigmaCutCombinedPion", -999, + "Combined nSigma cut for Pion"}; // Combined + Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; // DCAr to PV - Configurable cMaxDCArToPVcut{"cMaxDCArToPVcut", 0.5, "Track DCAr cut to PV Maximum"}; + Configurable cMaxDCArToPVcut{"cMaxDCArToPVcut", 0.5, + "Track DCAr cut to PV Maximum"}; // DCAz to PV - Configurable cMaxDCAzToPVcut{"cMaxDCAzToPVcut", 2.0, "Track DCAz cut to PV Maximum"}; + Configurable cMaxDCAzToPVcut{"cMaxDCAzToPVcut", 2.0, + "Track DCAz cut to PV Maximum"}; // Track selections - Configurable cfgPrimaryTrack{"cfgPrimaryTrack", true, "Primary track selection"}; // kGoldenChi2 | kDCAxy | kDCAz - Configurable cfgGlobalWoDCATrack{"cfgGlobalWoDCATrack", true, "Global track selection without DCA"}; // kQualityTracks (kTrackType | kTPCNCls | kTPCCrossedRows | kTPCCrossedRowsOverNCls | kTPCChi2NDF | kTPCRefit | kITSNCls | kITSChi2NDF | kITSRefit | kITSHits) | kInAcceptanceTracks (kPtRange | kEtaRange) - Configurable cfgPVContributor{"cfgPVContributor", true, "PV contributor track selection"}; // PV Contributor + Configurable cfgPrimaryTrack{"cfgPrimaryTrack", true, + "Primary track selection"}; // kGoldenChi2 | kDCAxy | kDCAz + Configurable cfgGlobalWoDCATrack{"cfgGlobalWoDCATrack", true, + "Global track selection without DCA"}; // kQualityTracks (kTrackType | + // kTPCNCls | kTPCCrossedRows | + // kTPCCrossedRowsOverNCls | + // kTPCChi2NDF | kTPCRefit | + // kITSNCls | kITSChi2NDF | + // kITSRefit | kITSHits) | + // kInAcceptanceTracks (kPtRange | + // kEtaRange) + Configurable cfgPVContributor{"cfgPVContributor", true, + "PV contributor track selection"}; // PV Contributor // V0 selections - Configurable cV0MinCosPA{"cV0MinCosPA", 0.97, "V0 minimum pointing angle cosine"}; - Configurable cV0MaxDaughDCA{"cV0MaxDaughDCA", 1.0, "V0 daughter DCA Maximum"}; + Configurable cV0MinCosPA{"cV0MinCosPA", 0.97, + "V0 minimum pointing angle cosine"}; + Configurable cV0MaxDaughDCA{"cV0MaxDaughDCA", 1.0, + "V0 daughter DCA Maximum"}; // Competing V0 rejection Configurable cV0MassWindow{"cV0MassWindow", 0.0043, "Mass window for competing Lambda0 rejection"}; Configurable cInvMassStart{"cInvMassStart", 0.6, "Invariant mass start"}; @@ -121,123 +127,83 @@ struct chargedkstaranalysis { // Event mixing Configurable nEvtMixing{"nEvtMixing", 5, "Number of events to mix"}; - ConfigurableAxis CfgVtxBins{"CfgVtxBins", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; - ConfigurableAxis CfgMultBins{"CfgMultBins", {VARIABLE_WIDTH, 0., 1., 5., 10., 30., 50., 70., 100., 110.}, "Mixing bins - multiplicity"}; + ConfigurableAxis cfgvtxbins{"cfgvtxbins", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; + ConfigurableAxis cfgmultbins{"cfgmultbins", {VARIABLE_WIDTH, 0., 1., 5., 10., 30., 50., 70., 100., 110.}, "Mixing bins - multiplicity"}; Configurable cTpcNsigmaPionBinsQA{"cTpcNsigmaPionBinsQA", 140, "tpcNSigmaPi binning"}; // Configurable for histograms Configurable nBins{"nBins", 100, "N bins in all histos"}; - // Confugrable for QA histograms - Configurable QAbefore{"QAbefore", false, "QAbefore"}; - Configurable QAafter{"QAafter", false, "QAafter"}; - Configurable QAv0{"QAv0", false, "QAv0"}; - - // Configurable for event selection - Configurable cutzvertex{"cutzvertex", 10.0f, - "Accepted z-vertex range (cm)"}; - // Configurable parameters for V0 selection - Configurable ConfV0PtMin{"ConfV0PtMin", 0.f, - "Minimum transverse momentum of V0"}; - Configurable ConfV0DCADaughMax{"ConfV0DCADaughMax", 1.0f, - "Maximum DCA between the V0 daughters"}; - Configurable ConfV0CPAMin{"ConfV0CPAMin", 0.985f, "Minimum CPA of V0"}; - Configurable ConfV0TranRadV0Min{"ConfV0TranRadV0Min", 0.5f, - "Minimum transverse radius"}; - Configurable ConfV0TranRadV0Max{"ConfV0TranRadV0Max", 200.f, - "Maximum transverse radius"}; - Configurable cMaxV0LifeTime{"cMaxV0LifeTime", 15, - "Maximum V0 life time"}; - Configurable cMaxV0DCA{"cMaxV0DCA", 0.3, "DCA V0 to PV"}; - Configurable cSigmaMassKs0{"cSigmaMassKs0", 4, - "n Sigma cut on KS0 mass"}; - Configurable cWidthKs0{"cWidthKs0", 0.005, "Width of KS0"}; - - Configurable ConfDaughEta{"ConfDaughEta", 0.8f, - "V0 Daugh sel: max eta"}; - Configurable ConfDaughTPCnclsMin{"ConfDaughTPCnclsMin", 70.f, - "V0 Daugh sel: Min. nCls TPC"}; - Configurable ConfDaughDCAMin{ - "ConfDaughDCAMin", 0.06f, "V0 Daugh sel: Max. DCA Daugh to PV (cm)"}; - Configurable ConfDaughPIDCuts{"ConfDaughPIDCuts", 4, - "PID selections for KS0 daughters"}; - - // Configurables for track selections - Configurable cfgCutPT{"cfgCutPT", 0.2f, "PT cut on daughter track"}; - Configurable cfgCutEta{"cfgCutEta", 0.8f, "Eta cut on daughter track"}; - Configurable cfgCutDCAxy{"cfgCutDCAxy", 2.0f, - "DCAxy range for tracks"}; - Configurable cfgCutDCAz{"cfgCutDCAz", 2.0f, "DCAz range for tracks"}; - Configurable nsigmaCutTPC{"nsigmacutTPC", 3.0, - "Value of the TPC Nsigma cut"}; - Configurable nsigmaCutTOF{"nsigmacutTOF", 3.0, + Configurable confdaugheta{"confdaugheta", 0.8f, "V0 Daugh sel: max eta"}; + Configurable nSigmaCutTPC{"nSigmaCutTPC", 3.0, "Value of the TPC Nsigma cut"}; + Configurable nSigmaCutTOF{"nSigmaCutTOF", 3.0, "Value of the TOF Nsigma cut"}; - Configurable nsigmaCutCombined{"nsigmaCutCombined", 3.0, - "Value of the Combined Nsigma cut"}; - Configurable cfgNoMixedEvents{"cfgNoMixedEvents", 5, - "Number of mixed events per event"}; - Configurable cfgMultFT0{"cfgMultFT0", false, "cfgMultFT0"}; - Configurable cfgCentFT0C{"cfgCentFT0C", true, "cfgCentFT0C"}; - Configurable iscustomDCAcut{"iscustomDCAcut", false, "iscustomDCAcut"}; - Configurable ismanualDCAcut{"ismanualDCAcut", true, "ismanualDCAcut"}; - Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; - Configurable cfgTPCcluster{"cfgTPCcluster", 70, "Number of TPC cluster"}; - Configurable isMC{"isMC", true, "Run MC"}; - Configurable avoidsplitrackMC{"avoidsplitrackMC", false, "avoid split track in MC"}; - Configurable isNoTOF{"isNoTOF", false, "isNoTOF"}; - Configurable timFrameEvsel{"timFrameEvsel", false, "TPC Time frame boundary cut"}; - Configurable TVXEvsel{"TVXEvsel", false, "Triggger selection"}; - Configurable additionalEvsel{"additionalEvsel", false, "Additional event selcection"}; - - // Event selection cuts - Alex - TF1* fMultPVCutLow = nullptr; - TF1* fMultPVCutHigh = nullptr; - TF1* fMultCutLow = nullptr; - TF1* fMultCutHigh = nullptr; - TF1* fMultMultPVCut = nullptr; - + Configurable nsigmaCutCombined{"nsigmaCutCombined", 3.0, "Value of the Combined Nsigma cut"}; + Configurable cfgNoMixedEvents{"cfgNoMixedEvents", 5, "Number of mixed events per event"}; void init(InitContext const&) { AxisSpec dcaxyAxisQA = {cDCABinsQA, 0.0, 3.0, "DCA_{#it{xy}} (cm)"}; AxisSpec dcazAxisQA = {cDCABinsQA, 0.0, 3.0, "DCA_{#it{xy}} (cm)"}; AxisSpec ptAxisQA = {binsPtQA, "#it{p}_{T} (GeV/#it{c})"}; - AxisSpec tpcNSigmaPiAxisQA = {cTpcNsigmaPionBinsQA, -7.0, 7.0, "N#sigma_{TPC}"}; - + AxisSpec tpcNSigmaPiAxisQA = {cTpcNsigmaPionBinsQA, -7.0, 7.0, + "N#sigma_{TPC}"}; + AxisSpec pidQAAxis = {130, -6.5, 6.5}; AxisSpec centAxis = {binsCent, "V0M (%)"}; AxisSpec ptAxis = {binsPt, "#it{p}_{T} (GeV/#it{c})"}; - AxisSpec invMassAxis = {cInvMassBins, cInvMassStart, cInvMassEnd, "Invariant Mass (GeV/#it{c}^2)"}; - AxisSpec etaAxis = {Etabins, "#eta"}; - AxisSpec goodTrackCountAxis = {3, 0., 3., "Passed track = 1, Passed V0 = 2, Passed track and V0 = 3"}; + AxisSpec invMassAxis = {cInvMassBins, cInvMassStart, cInvMassEnd, + "Invariant Mass (GeV/#it{c}^2)"}; + AxisSpec etaAxis = {etabins, "#eta"}; + AxisSpec goodTrackCountAxis = { + 3, 0., 3., "Passed track = 1, Passed V0 = 2, Passed track and V0 = 3"}; // register histograms histos1.add("hVertexZ", "hVertexZ", HistType::kTH1F, {{nBins, -15., 15.}}); - histos1.add("hEta", "Eta distribution", kTH1F, {{200, -1.0f, 1.0f}}); // Multiplicity and accepted events QA - histos1.add("QAbefore/collMult", "Collision multiplicity", HistType::kTH1F, {centAxis}); + histos1.add("QAbefore/collMult", "Collision multiplicity", HistType::kTH1F, + {centAxis}); // QA before histos1.add("QAbefore/pi_Eta", "Primary pion track eta", kTH1F, {etaAxis}); histos1.add("QAbefore/k0s_Eta", "K0short track eta", kTH1F, {etaAxis}); - histos1.add("QAbefore/chargedkstarpmRapidity", "Reconstructed K*^{#pm} rapidity", kTH1F, {etaAxis}); - - histos1.add("QAbefore/DCAxy_pi", "DCAxy distribution of pion track candidates", HistType::kTH1F, {dcaxyAxisQA}); - histos1.add("QAbefore/DCAz_pi", "DCAz distribution of pion track candidates", HistType::kTH1F, {dcazAxisQA}); - histos1.add("QAbefore/pT_pi", "pT distribution of pion track candidates", kTH1F, {ptAxisQA}); - histos1.add("QAbefore/tpcNsigmaPionQA", "NsigmaTPC distribution of primary pion candidates", kTH2F, {ptAxisQA, tpcNSigmaPiAxisQA}); + histos1.add("QAbefore/chargedkstarpmRapidity", + "Reconstructed K*^{#pm} rapidity", kTH1F, {etaAxis}); + histos1.add("QAbefore/trkpionTOFPID", "TOF PID of bachelor pion candidates", HistType::kTH2D, {ptAxisQA, pidQAAxis}); + + histos1.add("QAbefore/DCAxy_pi", + "DCAxy distribution of pion track candidates", HistType::kTH1F, + {dcaxyAxisQA}); + histos1.add("QAbefore/DCAz_pi", + "DCAz distribution of pion track candidates", HistType::kTH1F, + {dcazAxisQA}); + histos1.add("QAbefore/pT_pi", "pT distribution of pion track candidates", + kTH1F, {ptAxisQA}); + histos1.add("QAbefore/tpcNsigmaPionQA", + "NsigmaTPC distribution of primary pion candidates", kTH2F, + {ptAxisQA, tpcNSigmaPiAxisQA}); // QA after - histos1.add("QAAfter/DCAxy_pi", "DCAxy distribution of pion track candidates", HistType::kTH1F, {dcaxyAxisQA}); - histos1.add("QAAfter/DCAz_pi", "DCAz distribution of pion track candidates", HistType::kTH1F, {dcazAxisQA}); - histos1.add("QAAfter/pT_pi", "pT distribution of pion track candidates", kTH1F, {ptAxisQA}); - histos1.add("QAAfter/tpcNsigmaPionQA", "NsigmaTPC distribution of primary pion candidates", kTH2F, {ptAxisQA, tpcNSigmaPiAxisQA}); + histos1.add("QAAfter/DCAxy_pi", + "DCAxy distribution of pion track candidates", HistType::kTH1F, + {dcaxyAxisQA}); + histos1.add("QAAfter/DCAz_pi", "DCAz distribution of pion track candidates", + HistType::kTH1F, {dcazAxisQA}); + histos1.add("QAAfter/pT_pi", "pT distribution of pion track candidates", + kTH1F, {ptAxisQA}); + histos1.add("QAAfter/tpcNsigmaPionQA", + "NsigmaTPC distribution of primary pion candidates", kTH2F, + {ptAxisQA, tpcNSigmaPiAxisQA}); histos1.add("QAAfter/pi_Eta", "Primary pion track eta", kTH1F, {etaAxis}); // Good tracks and V0 counts QA - histos1.add("QAafter/hGoodTracksV0s", "Number of good track and V0 passed", kTH1F, {goodTrackCountAxis}); - histos1.add("chargedkstarinvmassUlikeSign", "Invariant mass of charged K*(892)", kTH1F, {invMassAxis}); - histos1.add("chargedkstarinvmassMixedEvent", "Invariant mass of charged K*(892)", kTH1F, {invMassAxis}); + histos1.add("QAafter/hGoodTracksV0s", "Number of good track and V0 passed", + kTH1F, {goodTrackCountAxis}); + histos1.add("chargedkstarinvmassUlikeSign", + "Invariant mass of charged K*(892)", kTH1F, {invMassAxis}); + histos1.add("chargedkstarinvmassMixedEvent", + "Invariant mass of charged K*(892)", kTH1F, {invMassAxis}); // Mass vs Pt vs Multiplicity 3-dimensional histogram - // histos1.add("chargekstarMassPtMult", "Charged K*(892) mass vs pT vs V0 multiplicity distribution", kTH3F, {invMassAxis, ptAxis, centAxis}); + // histos1.add("chargekstarMassPtMult", "Charged K*(892) mass vs pT vs V0 + // multiplicity distribution", kTH3F, {invMassAxis, ptAxis, centAxis}); histos1.add("chargekstarMassPtMultPtUnlikeSign", "Invariant mass of CKS meson Unlike Sign", kTHnSparseF, @@ -245,333 +211,44 @@ struct chargedkstaranalysis { histos1.add("chargekstarMassPtMultPtMixedEvent", "Invariant mass of CKS meson MixedEvent Sign", kTHnSparseF, {invMassAxis, ptAxis, centAxis}, true); - - // Axes - AxisSpec K0ShortMassAxis = {200, 0.45f, 0.55f, - "#it{M}_{inv} [GeV/#it{c}^{2}]"}; - AxisSpec vertexZAxis = {nBins, -10., 10., "vrtx_{Z} [cm]"}; - AxisSpec multAxis = {100, 0.0f, 100.0f, "Multiplicity"}; - - // Histograms - // Event selection - rEventSelection.add("hVertexZRec", "hVertexZRec", - {HistType::kTH1F, {vertexZAxis}}); - rEventSelection.add("hmult", "Centrality distribution", kTH1F, - {{200, 0.0f, 200.0f}}); - - // for primary tracks - if (QAbefore && QAafter) { - histos.add("hNsigmaPionTPC_before", "NsigmaPion TPC distribution before", - kTH1F, {{200, -10.0f, 10.0f}}); - histos.add("hNsigmaPionTOF_before", "NsigmaPion TOF distribution before", - kTH1F, {{200, -10.0f, 10.0f}}); - - histos.add("hEta_after", "Eta distribution", kTH1F, {{200, -1.0f, 1.0f}}); - histos.add("hDcaxy_after", "Dcaxy distribution", kTH1F, - {{200, -10.0f, 10.0f}}); - histos.add("hDcaz_after", "Dcaz distribution", kTH1F, - {{200, -10.0f, 10.0f}}); - histos.add("hNsigmaPionTPC_after", "NsigmaPion TPC distribution", kTH1F, - {{200, -10.0f, 10.0f}}); - histos.add("hNsigmaPionTOF_after", "NsigmaPion TOF distribution", kTH1F, - {{200, -10.0f, 10.0f}}); - } - - if (QAv0) { - // K0s reconstruction - histos.add( - "hMassvsptvsmult", "hMassvsptvsmult", - {HistType::kTHnSparseF, {{K0ShortMassAxis}, {ptAxis}, {multAxis}}}, - true); - // K0s topological/PID cuts - histos.add("hDCAV0Daughters", "hDCAV0Daughters", - {HistType::kTH1F, {{50, 0.0f, 5.0f}}}); - histos.add("hLT", "hLT", {HistType::kTH1F, {{100, 0.0f, 50.0f}}}); - histos.add("hV0CosPA", "hV0CosPA", - {HistType::kTH1F, {{100, 0.95f, 1.f}}}); - } - - // histos.add("counter", "counter", {HistType::kTH1F, {{10, 0.0f, 10.0f}}}); - - // CKStar histograms - histos.add("h3CKSInvMassUnlikeSign", - "Invariant mass of CKS meson Unlike Sign", kTHnSparseF, - {{200, 0.0, 200.0}, {200, 0.0f, 20.0f}, {90, 0.6, 1.5}}, true); - histos.add("h3CKSInvMassMixed", "Invariant mass of CKS meson Mixed", - kTHnSparseF, - {{200, 0.0, 200.0}, {200, 0.0f, 20.0f}, {90, 0.6, 1.5}}, true); - - if (isMC) { - rGenParticles.add("hMC", "Gen MC Event statistics", kTH1F, {{10, 0.0f, 10.0f}}); - rGenParticles.add("hCentGen", "Gen MC Event centrality", kTH1F, {{100, 0.0f, 100.0f}}); - rRecParticles.add("hCentRec", "Rec MC Event centrality", kTH1F, {{100, 0.0f, 100.0f}}); - rRecParticles.add("hMCRec", "Rec MC Event statistics", kTH1F, {{10, 0.0f, 10.0f}}); - rGenParticles.add("hPtK0ShortGen", "hPtK0ShortGen", {HistType::kTH1F, {{ptAxis}}}); - // rGenParticles.add("hCKSGen", "hCKSGen", {HistType::kTH1F, {{ptAxis}}}); - // rRecParticles.add("hCKSRec", "hCKSRec", {HistType::kTH1F, {{ptAxis}}}); - - rGenParticles.add("hCKSGen", - "Invariant mass of CKS meson Gen", kTHnSparseF, - {{200, 0.0, 20.0}, {100, 0.0f, 100.0f}}, true); - rRecParticles.add("hCKSRec", - "Invariant mass of CKS meson Rec", kTHnSparseF, - {{200, 0.0, 20.0}, {100, 0.0f, 100.0f}}, true); - } - - // Event selection cut additional - Alex - if (additionalEvsel) { - fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x - 2.5*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); - fMultPVCutLow->SetParameters(2834.66, -87.0127, 0.915126, -0.00330136, 332.513, -12.3476, 0.251663, -0.00272819, 1.12242e-05); - fMultPVCutHigh = new TF1("fMultPVCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x + 2.5*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); - fMultPVCutHigh->SetParameters(2834.66, -87.0127, 0.915126, -0.00330136, 332.513, -12.3476, 0.251663, -0.00272819, 1.12242e-05); - fMultCutLow = new TF1("fMultCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x - 2.5*([4]+[5]*x)", 0, 100); - fMultCutLow->SetParameters(1893.94, -53.86, 0.502913, -0.0015122, 109.625, -1.19253); - fMultCutHigh = new TF1("fMultCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x + 3.*([4]+[5]*x)", 0, 100); - fMultCutHigh->SetParameters(1893.94, -53.86, 0.502913, -0.0015122, 109.625, -1.19253); - fMultMultPVCut = new TF1("fMultMultPVCut", "[0]+[1]*x+[2]*x*x", 0, 5000); - fMultMultPVCut->SetParameters(-0.1, 0.785, -4.7e-05); - } } - - double massPi = TDatabasePDG::Instance() - ->GetParticle(kPiPlus) - ->Mass(); - double massK0s = TDatabasePDG::Instance() - ->GetParticle(kK0Short) - ->Mass(); + double massPi = o2::constants::physics::MassPionCharged; + double massK0s = o2::constants::physics::MassK0Short; double massKa = o2::constants::physics::MassKPlus; - ROOT::Math::PtEtaPhiMVector CKSVector; - - template - bool eventSelected(TCollision collision, const float& centrality) - { - if (collision.alias_bit(kTVXinTRD)) { - // TRD triggered - // return 0; - } - auto multNTracksPV = collision.multNTracksPV(); - if (multNTracksPV < fMultPVCutLow->Eval(centrality)) - return 0; - if (multNTracksPV > fMultPVCutHigh->Eval(centrality)) - return 0; - // if (multTrk < fMultCutLow->Eval(centrality)) - // return 0; - // if (multTrk > fMultCutHigh->Eval(centrality)) - // return 0; - // if (multTrk > fMultMultPVCut->Eval(multNTracksPV)) - // return 0; - - return 1; - } - - template - bool selectionTrack(const T& candidate) - { - if (iscustomDCAcut && - (!candidate.isGlobalTrack() || !candidate.isPVContributor() || - candidate.itsNCls() < cfgITScluster)) { - return false; - } - /* - if (ismanualDCAcut && - (!candidate.isGlobalTrackWoDCA() || !candidate.isPVContributor() || - std::abs(candidate.dcaXY()) > cfgCutDCAxy || - std::abs(candidate.dcaZ()) > cfgCutDCAz || - candidate.itsNCls() < cfgITScluster || candidate.tpcNClsFound() < 70)) { - return false; - } - */ - if (ismanualDCAcut && !(candidate.isGlobalTrackWoDCA() && candidate.isPVContributor() && std::abs(candidate.dcaXY()) < cfgCutDCAxy && std::abs(candidate.dcaZ()) < cfgCutDCAz && candidate.itsNCls() > cfgITScluster && candidate.tpcNClsFound() > cfgTPCcluster)) { - return false; - } - - return true; - } - - template - bool selectionPID(const T& candidate) - { - - if (candidate.hasTOF() && - (candidate.tofNSigmaPi() * candidate.tofNSigmaPi() + - candidate.tpcNSigmaPi() * candidate.tpcNSigmaPi()) < - (nsigmaCutCombined * nsigmaCutCombined)) { - return true; - } - - if (!candidate.hasTOF() && - std::abs(candidate.tpcNSigmaPi()) < nsigmaCutTPC) { - return true; - } - - /* - if (!candidate.hasTOF() && - std::abs(candidate.tpcNSigmaPi()) < nsigmaCutTPC) { - return true; - } - else if (candidate.hasTOF() && - std::abs(candidate.tofNSigmaPi()) < nsigmaCutTOF) { - return true; - } - */ - - /* - if (candidate.hasTOF() && - (candidate.tofNSigmaKa() * candidate.tofNSigmaKa() + - candidate.tpcNSigmaKa() * candidate.tpcNSigmaKa()) < - (nsigmaCutCombined * nsigmaCutCombined)) { - return true; - } - if (!candidate.hasTOF() && - std::abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC) { - return true; - } - */ - - /* - if (!isNoTOF && candidate.hasTOF() && (candidate.tofNSigmaKa() * candidate.tofNSigmaKa() + candidate.tpcNSigmaKa() * candidate.tpcNSigmaKa()) < (nsigmaCutCombined * nsigmaCutCombined)) { - return true; - } - if (!isNoTOF && !candidate.hasTOF() && std::abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC) { - return true; - } - if (isNoTOF && std::abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC) { - return true; - } - */ - - return false; - } - - template - bool SelectionV0(Collision const& collision, V0 const& candidate, - float multiplicity) - { - if (fabs(candidate.dcav0topv()) > cMaxV0DCA) { - return false; - } - - if (TMath::Abs(candidate.yK0Short()) > 0.5) { - return false; - } - - const float qtarm = candidate.qtarm(); - const float alph = candidate.alpha(); - float arm = qtarm / alph; - const float pT = candidate.pt(); - const float tranRad = candidate.v0radius(); - const float dcaDaughv0 = candidate.dcaV0daughters(); - const float cpav0 = candidate.v0cosPA(); - float CtauK0s = candidate.distovertotmom(collision.posX(), collision.posY(), - collision.posZ()) * - TDatabasePDG::Instance() - ->GetParticle(kK0Short) - ->Mass(); // FIXME: Get from the common header - float lowmasscutks0 = 0.497 - cWidthKs0 * cSigmaMassKs0; - float highmasscutks0 = 0.497 + cWidthKs0 * cSigmaMassKs0; - // float decayLength = candidate.distovertotmom(collision.posX(), - // collision.posY(), collision.posZ()) * - // RecoDecay::sqrtSumOfSquares(candidate.px(), candidate.py(), - // candidate.pz()); - - if (pT < ConfV0PtMin) { - return false; - } - if (dcaDaughv0 > ConfV0DCADaughMax) { - return false; - } - if (cpav0 < ConfV0CPAMin) { - return false; - } - if (tranRad < ConfV0TranRadV0Min) { - return false; - } - if (tranRad > ConfV0TranRadV0Max) { - return false; - } - if (fabs(CtauK0s) > cMaxV0LifeTime || - candidate.mK0Short() < lowmasscutks0 || - candidate.mK0Short() > highmasscutks0) { - return false; - } - if (arm < 0.2) { - return false; - } - - if (QAv0) { - histos.fill(HIST("hLT"), CtauK0s); - histos.fill(HIST("hMassvsptvsmult"), candidate.mK0Short(), candidate.pt(), - multiplicity); - histos.fill(HIST("hDCAV0Daughters"), candidate.dcaV0daughters()); - histos.fill(HIST("hV0CosPA"), candidate.v0cosPA()); - } - return true; - } - - template - bool isSelectedV0Daughter(T const& track, float charge, - double nsigmaV0Daughter) - { - const auto eta = track.eta(); - const auto tpcNClsF = track.tpcNClsFound(); - const auto dcaXY = track.dcaXY(); - const auto sign = track.sign(); - - if (!track.hasTPC()) - return false; - if (track.tpcNClsCrossedRows() < 70) - return false; - if (track.tpcCrossedRowsOverFindableCls() < 0.8) - return false; - - if (charge < 0 && sign > 0) { - return false; - } - if (charge > 0 && sign < 0) { - return false; - } - if (std::abs(eta) > ConfDaughEta) { - return false; - } - if (tpcNClsF < ConfDaughTPCnclsMin) { - return false; - } - if (std::abs(dcaXY) < ConfDaughDCAMin) { - return false; - } - if (std::abs(nsigmaV0Daughter) > ConfDaughPIDCuts) { - return false; - } - - return true; - } + ROOT::Math::PtEtaPhiMVector cksvector; double massK0 = o2::constants::physics::MassK0Short; double massPicharged = o2::constants::physics::MassPionCharged; double massLambda0 = o2::constants::physics::MassLambda; double massAntiLambda0 = o2::constants::physics::MassLambda0Bar; // Fill histograms (main function) - template - void fillHistograms(const CollisionType& collision, const TracksType& dTracks, const V0sType& dV0s) + template + void fillHistograms(const CollisionType& collision, const TracksType& dTracks, + const V0sType& dV0s) { // auto multiplicity = collision.cent(); auto multiplicity = collision.cent(); histos1.fill(HIST("QAbefore/collMult"), multiplicity); TLorentzVector lDecayDaughter, lDecayV0, lResonance; - for (auto track : dTracks) { // loop over all dTracks1 - // if (!trackCut(track1)) - // continue; // track selection and PID selection - // trying to see the information without applying any cut yet //Let's I am trying to reconstruct the charged kstar it is V0s + pion - histos1.fill(HIST("hEta"), track.eta()); - + for (const auto& track : dTracks) { // loop over all dTracks1 to find the bachelor pion auto trackId = track.index(); auto trackptPi = track.pt(); auto tracketaPi = track.eta(); + auto istrkhasTOF = track.hasTOF(); + auto trkNSigmaPiTPC = track.tpcNSigmaPi(); + auto trkNSigmaPiTOF = (istrkhasTOF) ? track.tofNSigmaPi() : -999.; histos1.fill(HIST("QAbefore/pi_Eta"), tracketaPi); if (!IsMix) { + // TPC PID (before cuts) + histos1.fill(HIST("QAbefore/tpcNsigmaPionQA"), trackptPi, trkNSigmaPiTPC); + if (istrkhasTOF) { + histos1.fill(HIST("QA/before/trkpionTOFPID"), trackptPi, trkNSigmaPiTOF); + histos1.fill(HIST("QA/before/trkpionTPCTOFPID"), trkNSigmaPiTPC, trkNSigmaPiTOF); + } // DCA QA (before cuts) histos1.fill(HIST("QAbefore/DCAxy_pi"), track.dcaXY()); histos1.fill(HIST("QAbefore/DCAz_pi"), track.dcaZ()); @@ -579,8 +256,6 @@ struct chargedkstaranalysis { histos1.fill(HIST("QAbefore/pi_Eta"), tracketaPi); // pT QA (before cuts) histos1.fill(HIST("QAbefore/pT_pi"), trackptPi); - // TPC PID (before cuts) - histos1.fill(HIST("QAbefore/tpcNsigmaPionQA"), trackptPi, track.tpcNSigmaPi()); } // apply the track cut @@ -598,10 +273,11 @@ struct chargedkstaranalysis { // pT QA (before cuts) histos1.fill(HIST("QAAfter/pT_pi"), trackptPi); // TPC PID (before cuts) - histos1.fill(HIST("QAAfter/tpcNsigmaPionQA"), trackptPi, track.tpcNSigmaPi()); + histos1.fill(HIST("QAAfter/tpcNsigmaPionQA"), trackptPi, + track.tpcNSigmaPi()); } - for (auto& v0 : dV0s) { + for (const auto& v0 : dV0s) { // Full index policy is needed to consider all possible combinations if (v0.indices()[0] == trackId || v0.indices()[1] == trackId) @@ -609,7 +285,7 @@ struct chargedkstaranalysis { //// Initialize variables // trk: Pion, v0: K0s // apply the track cut - if (!V0Cut(v0)) + if (!v0cut(v0)) continue; histos1.fill(HIST("QAafter/hGoodTracksV0s"), 1.5); @@ -620,17 +296,19 @@ struct chargedkstaranalysis { histos1.fill(HIST("QAafter/hGoodTracksV0s"), 2.5); // Checking whether the mid-rapidity condition is met - if (abs(lResonance.Rapidity()) > 0.5) + if (std::abs(lResonance.Rapidity()) > 0.5) continue; if constexpr (!IsMix) { histos1.fill(HIST("chargedkstarinvmassUlikeSign"), lResonance.M()); // Reconstructed K*(892)pm 3d mass, pt, multiplicity histogram - histos1.fill(HIST("chargekstarMassPtMultPtUnlikeSign"), lResonance.M(), lResonance.Pt(), multiplicity); + histos1.fill(HIST("chargekstarMassPtMultPtUnlikeSign"), + lResonance.M(), lResonance.Pt(), multiplicity); } else { histos1.fill(HIST("chargedkstarinvmassMixedEvent"), lResonance.M()); // Reconstructed K*(892)pm 3d mass, pt, multiplicity histogram - histos1.fill(HIST("chargekstarMassPtMultPtMixedEvent"), lResonance.M(), lResonance.Pt(), multiplicity); + histos1.fill(HIST("chargekstarMassPtMultPtMixedEvent"), + lResonance.M(), lResonance.Pt(), multiplicity); } } } @@ -640,14 +318,17 @@ struct chargedkstaranalysis { bool selectionPIDpp(const T& candidate) { bool tpcPIDPassed{false}, tofPIDPassed{false}; - if (std::abs(candidate.tpcNSigmaPi()) < nsigmaCutTPC) { + if (std::abs(candidate.tpcNSigmaPi()) < nSigmaCutTPC) { tpcPIDPassed = true; } if (candidate.hasTOF()) { - if (std::abs(candidate.tofNSigmaPi()) < nsigmaCutTOF) { + if (std::abs(candidate.tofNSigmaPi()) < nSigmaCutTOF) { tofPIDPassed = true; } - if ((nsigmaCutCombinedPion > 0) && (candidate.tpcNSigmaPi() * candidate.tpcNSigmaPi() + candidate.tofNSigmaPi() * candidate.tofNSigmaPi() < nsigmaCutCombinedPion * nsigmaCutCombinedPion)) { + if ((nsigmaCutCombinedPion > 0) && + (candidate.tpcNSigmaPi() * candidate.tpcNSigmaPi() + + candidate.tofNSigmaPi() * candidate.tofNSigmaPi() < + nsigmaCutCombinedPion * nsigmaCutCombinedPion)) { tofPIDPassed = true; } } else { @@ -665,7 +346,9 @@ struct chargedkstaranalysis { // basic track cuts if (std::abs(track.pt()) < cMinPtcut) return false; - if (std::abs(track.eta()) > ConfDaughEta) + if (std::abs(track.eta()) > confdaugheta) + return false; + if (track.itsNCls() < cfgITScluster) return false; if (std::abs(track.dcaXY()) > cMaxDCArToPVcut) return false; @@ -681,17 +364,18 @@ struct chargedkstaranalysis { return true; } template - bool V0Cut(const V0Type v0) + bool v0cut(const V0Type v0) { // V0 track cuts - if (std::abs(v0.eta()) > ConfDaughEta) + if (std::abs(v0.eta()) > confdaugheta) return false; if (v0.v0CosPA() < cV0MinCosPA) return false; if (v0.daughDCA() > cV0MaxDaughDCA) return false; - // apply the competing V0 rejection cut (excluding Lambda0 candidates, massLambdaPDG = 1115.683 MeV/c2) + // apply the competing V0 rejection cut (excluding Lambda0 candidates, + // massLambdaPDG = 1115.683 MeV/c2) if (std::abs(v0.mLambda() - massLambda0) < cV0MassWindow) return false; @@ -701,615 +385,42 @@ struct chargedkstaranalysis { return true; } - // Defining filters for events (event selection) - // Processed events will be already fulfilling the event selection - // requirements - // Filter eventFilter = (o2::aod::evsel::sel8 == true); - Filter posZFilter = (nabs(o2::aod::collision::posZ) < cutzvertex); - Filter posZFilterMC = (nabs(o2::aod::mccollision::posZ) < cutzvertex); - - Filter acceptanceFilter = - (nabs(aod::track::eta) < cfgCutEta && nabs(aod::track::pt) > cfgCutPT); - Filter DCAcutFilter = (nabs(aod::track::dcaXY) < cfgCutDCAxy) && - (nabs(aod::track::dcaZ) < cfgCutDCAz); - - using EventCandidatesMC = soa::Join; - // using EventCandidates = soa::Filtered< - // soa::Join>; - using EventCandidates = soa::Filtered>; - - using TrackCandidates = soa::Filtered>; - using TrackCandidatesMC = soa::Filtered< - soa::Join>; - - using V0TrackCandidatesMC = soa::Join; - using V0TrackCandidate = aod::V0Datas; - - ConfigurableAxis axisVertex{ - "axisVertex", - {20, -10, 10}, - "vertex axis for bin"}; - ConfigurableAxis axisMultiplicityClass{ - "axisMultiplicityClass", - {2, 0, 100}, - "multiplicity percentile for bin"}; - ConfigurableAxis axisMultiplicity{ - "axisMultiplicity", - {2000, 0, 10000}, - "TPC multiplicity for bin"}; - - using BinningTypeTPCMultiplicity = - ColumnBinningPolicy; - // using BinningTypeVertexContributor = - // ColumnBinningPolicy; - using BinningTypeCentralityM = - ColumnBinningPolicy; - using BinningTypeVertexContributor = - ColumnBinningPolicy; - - BinningTypeVertexContributor binningOnPositions{ - {axisVertex, axisMultiplicityClass}, - true}; - - Pair - pair{binningOnPositions, cfgNoMixedEvents, -1, &cache}; - /* SameKindPair pair{binningOnPositions, cfgNoMixedEvents, -1, &cache}; */ - void processSE(EventCandidates::iterator const& collision, - TrackCandidates const& tracks, aod::V0Datas const& V0s, - aod::BCs const&) - - /* - void processSE(EventCandidates::iterator const& collision, - TrackCandidates const& tracks, aod::BCs const&) - */ - { - - if (!collision.sel8()) { - return; - } - - std::vector pions, kaons, kshorts; - std::vector pions2, kaons2; - std::vector PionIndex = {}; - std::vector PionSign = {}; - std::vector PioncollIndex = {}; - std::vector PionIndex2 = {}; - std::vector PionSign2 = {}; - std::vector PioncollIndex2 = {}; - - std::vector KaonIndex = {}; - std::vector KaonSign = {}; - std::vector KaoncollIndex = {}; - std::vector KaonIndex2 = {}; - std::vector KaonSign2 = {}; - std::vector KaoncollIndex2 = {}; - - std::vector V0collIndex = {}; - std::vector KshortPosDaughIndex = {}; - std::vector KshortNegDaughIndex = {}; - /* - float multiplicity = 0.0f; - if (cfgMultFT0) - multiplicity = collision.multZeqFT0A() + collision.multZeqFT0C(); - if (cfgMultFT0 == 0 && cfgCentFT0C == 1) - multiplicity = collision.centFT0C(); - if (cfgMultFT0 == 0 && cfgCentFT0C == 0) - multiplicity = collision.centFT0M(); - */ - float centrality = 0.0f; - centrality = collision.centFT0C(); - - if (timFrameEvsel && (!collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(aod::evsel::kNoITSROFrameBorder))) { - return; - } - - if (TVXEvsel && (!collision.selection_bit(aod::evsel::kIsTriggerTVX))) { - return; - } - - if (additionalEvsel && !eventSelected(collision, centrality)) { - return; - } - - // Fill the event counter - rEventSelection.fill(HIST("hVertexZRec"), collision.posZ()); - rEventSelection.fill(HIST("hmult"), centrality); - - for (auto track1 : tracks) { - /* - if (QAbefore) { - histos.fill(HIST("hNsigmaPionTPC_before"), track1.tpcNSigmaPi()); - histos.fill(HIST("hNsigmaPionTOF_before"), track1.tofNSigmaPi()); - } - */ - if (!selectionPID(track1)) - continue; // for primary particle PID - - if (!selectionTrack(track1)) { - continue; - } - - if (QAafter) { - histos.fill(HIST("hEta_after"), track1.eta()); - histos.fill(HIST("hDcaxy_after"), track1.dcaXY()); - histos.fill(HIST("hDcaz_after"), track1.dcaZ()); - // histos.fill(HIST("hNsigmaPionTPC_after"), track1.tpcNSigmaPi()); - // histos.fill(HIST("hNsigmaPionTOF_after"), track1.tofNSigmaPi()); - } - - ROOT::Math::PtEtaPhiMVector temp1(track1.pt(), track1.eta(), track1.phi(), - massPi); - pions.push_back(temp1); - PionIndex.push_back(track1.globalIndex()); - // PionIndex.push_back(track1.index()); - PioncollIndex.push_back(track1.collisionId()); - PionSign.push_back(track1.sign()); - } - /* - for (auto track2 : tracks) { - - if (!selectionPID(track2)) - continue; // for primary particle PID - - if (!selectionTrack(track2)) { - continue; - } - - ROOT::Math::PtEtaPhiMVector temp2(track2.pt(), track2.eta(), track2.phi(), - massKa); - kaons.push_back(temp2); - //PionIndex.push_back(track1.globalIndex()); - KaonIndex.push_back(track2.index()); - KaoncollIndex.push_back(track2.collisionId()); - KaonSign.push_back(track2.sign()); - } // track loop ends - */ - - for (auto& v0 : V0s) { - - auto postrack = v0.template posTrack_as(); - auto negtrack = v0.template negTrack_as(); - double nTPCSigmaPos[1]{postrack.tpcNSigmaPi()}; - double nTPCSigmaNeg[1]{negtrack.tpcNSigmaPi()}; - - if (!isSelectedV0Daughter(postrack, 1, nTPCSigmaPos[0])) { - continue; - } - if (!isSelectedV0Daughter(negtrack, -1, nTPCSigmaNeg[0])) { - continue; - } - - if (!SelectionV0(collision, v0, centrality)) { - continue; - } - - ROOT::Math::PtEtaPhiMVector temp2(v0.pt(), v0.eta(), v0.phi(), massK0s); - kshorts.push_back(temp2); - V0collIndex.push_back(v0.collisionId()); - // KshortPosDaughIndex.push_back(postrack.index()); - // KshortNegDaughIndex.push_back(negtrack.index()); - KshortPosDaughIndex.push_back(postrack.globalIndex()); - KshortNegDaughIndex.push_back(negtrack.globalIndex()); - } - - if (pions.size() != 0 && kshorts.size() != 0) { - // if (pions.size() != 0 && kaons.size() != 0) { - // if (pions.size() != 0 && pions2.size() != 0) { - for (auto ipion = pions.begin(); ipion != pions.end(); ++ipion) { - auto i1 = std::distance(pions.begin(), ipion); - if (PionSign.at(i1) == 0) - continue; - for (auto ikshort = kshorts.begin(); ikshort != kshorts.end(); - ++ikshort) { - // for (auto ikaon = kaons.begin(); ikaon != kaons.end(); - // ++ikaon) { - // for (auto ikshort = pions2.begin(); ikshort != pions2.end(); - // ++ikshort) { - auto i3 = std::distance(kshorts.begin(), ikshort); - // auto i3 = std::distance(kaons.begin(), ikaon); - if (PionIndex.at(i1) == KshortPosDaughIndex.at(i3)) - continue; - if (PionIndex.at(i1) == KshortNegDaughIndex.at(i3)) - continue; - // if (KaonIndex.at(i3) <= PionIndex.at(i1)) - // continue; - if (PioncollIndex.at(i1) != V0collIndex.at(i3)) - continue; - - // if (PionSign.at(i1) * KaonSign.at(i3) >= 0) - // continue; - - CKSVector = pions.at(i1) + kshorts.at(i3); - // CKSVector = pions.at(i1) + kaons.at(i3); - if (TMath::Abs(CKSVector.Rapidity()) < 0.5) { - histos.fill(HIST("h3CKSInvMassUnlikeSign"), centrality, - CKSVector.Pt(), CKSVector.M()); - } - } - } - } - } - - PROCESS_SWITCH(chargedkstaranalysis, processSE, "Process Same event", false); - - void processME(EventCandidates const& /*collisions*/, - TrackCandidates const& /*tracks*/, V0TrackCandidate const& /*V0s*/) - - /* - void processME(EventCandidates const& collisions, - TrackCandidates const& tracks)*/ - { - - // histos.fill(HIST("counter"), 1.5); - /* - auto tracksTuple = std::make_tuple(tracks); - //////// currently mixing the event with similar TPC multiplicity //////// - BinningTypeVertexContributor binningOnPositions{{axisVertex, axisMultiplicity}, true}; - SameKindPair pair{binningOnPositions, cfgNoMixedEvents, -1, collisions, t - racksTuple, &cache}; - */ - - for (auto& [c1, tracks1, c2, tracks2] : pair) { - - if (!c1.sel8()) { - continue; - } - if (!c2.sel8()) { - continue; - } - - // histos.fill(HIST("counter"), 2.5); - - auto centrality = c1.centFT0C(); - auto centrality2 = c2.centFT0C(); - - if (timFrameEvsel && (!c1.selection_bit(aod::evsel::kNoTimeFrameBorder) || !c2.selection_bit(aod::evsel::kNoTimeFrameBorder) || !c1.selection_bit(aod::evsel::kNoITSROFrameBorder) || !c2.selection_bit(aod::evsel::kNoITSROFrameBorder))) { - continue; - } - - if (TVXEvsel && (!c1.selection_bit(aod::evsel::kIsTriggerTVX) || !c2.selection_bit(aod::evsel::kIsTriggerTVX))) { - continue; - } - - if (additionalEvsel && !eventSelected(c1, centrality)) { - continue; - } - if (additionalEvsel && !eventSelected(c2, centrality2)) { - continue; - } - - for (auto& [t1, t2] : o2::soa::combinations( - o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { - - // histos.fill(HIST("counter"), 3.5); - if (!selectionTrack(t1)) - continue; - // histos.fill(HIST("counter"), 4.5); - if (!selectionPID(t1)) - continue; - // histos.fill(HIST("counter"), 5.5); - if (t1.sign() == 0) - continue; - // histos.fill(HIST("counter"), 6.5); - - /*if (!selectionTrack(t2)) - continue; - if (!selectionPID(t2)) - continue; - */ - - if (!SelectionV0(c2, t2, centrality2)) - continue; - - // histos.fill(HIST("counter"), 7.5); - - auto postrack = t2.template posTrack_as(); - auto negtrack = t2.template negTrack_as(); - double nTPCSigmaPos[1]{postrack.tpcNSigmaPi()}; - double nTPCSigmaNeg[1]{negtrack.tpcNSigmaPi()}; - - if (!isSelectedV0Daughter(postrack, 1, nTPCSigmaPos[0])) { - continue; - } - // histos.fill(HIST("counter"), 8.5); - if (!isSelectedV0Daughter(negtrack, -1, nTPCSigmaNeg[0])) { - continue; - } - // histos.fill(HIST("counter"), 9.5); - - // if (t1.sign() * t2.sign() >= 0) - // continue; - - TLorentzVector pi; - pi.SetPtEtaPhiM(t1.pt(), t1.eta(), t1.phi(), massPi); - TLorentzVector KSh; - KSh.SetPtEtaPhiM(t2.pt(), t2.eta(), t2.phi(), massK0s); - - TLorentzVector CKSmix = pi + KSh; - - if (TMath::Abs(CKSmix.Rapidity()) < 0.5) { - histos.fill(HIST("h3CKSInvMassMixed"), centrality, CKSmix.Pt(), - CKSmix.M()); - } - } - } - } - - PROCESS_SWITCH(chargedkstaranalysis, processME, "Process Mixed event", false); - - void processGenMC(aod::McCollision const& mcCollision, aod::McParticles& mcParticles, const soa::SmallGroups& collisions) - { - - if (std::abs(mcCollision.posZ()) < cutzvertex) - rGenParticles.fill(HIST("hMC"), 0.5); - std::vector SelectedEvents(collisions.size()); - int nevts = 0; - auto cent = 0; - for (const auto& collision : collisions) { - // if (!collision.sel8() || std::abs(collision.mcCollision().posZ()) > cutzvertex) { - if (std::abs(collision.mcCollision().posZ()) > cutzvertex) { - continue; - } - rGenParticles.fill(HIST("hMC"), 1.5); - /*if (timFrameEvsel && (!collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(aod::evsel::kNoITSROFrameBorder))) { - continue; - }*/ - if (timFrameEvsel && (!collision.selection_bit(aod::evsel::kNoTimeFrameBorder))) { - continue; - } - if (TVXEvsel && (!collision.selection_bit(aod::evsel::kIsTriggerTVX))) { - continue; - } - rGenParticles.fill(HIST("hMC"), 2.5); - - cent = collision.centFT0C(); - rGenParticles.fill(HIST("hCentGen"), cent); - SelectedEvents[nevts++] = collision.mcCollision_as().globalIndex(); - } - SelectedEvents.resize(nevts); - const auto evtReconstructedAndSelected = std::find(SelectedEvents.begin(), SelectedEvents.end(), mcCollision.globalIndex()) != SelectedEvents.end(); - - if (!evtReconstructedAndSelected) { // Check that the event is reconstructed and that the reconstructed events pass the selection - return; - } - - rGenParticles.fill(HIST("hMC"), 3.5); - for (auto& mcParticle : mcParticles) { - if (std::abs(mcParticle.y()) >= 0.5) { - continue; - } - rGenParticles.fill(HIST("hMC"), 4.5); - if (std::abs(mcParticle.pdgCode()) != 323) { - continue; - } - rGenParticles.fill(HIST("hMC"), 5.5); - auto kDaughters = mcParticle.daughters_as(); - if (kDaughters.size() != 2) { - continue; - } - - rGenParticles.fill(HIST("hMC"), 6.5); - auto daughts = false; - auto daughtp = false; - // int count = 0; - for (auto kCurrentDaughter : kDaughters) { - // LOG(info) << "Daughters PDG:\t" << count<<" "<(); - for (auto kCurrentDaughter2 : kDaughter2) { - if (kCurrentDaughter2.pdgCode() == 310) - daughts = true; - } - } else if (std::abs(kCurrentDaughter.pdgCode()) == 211) { - if (kCurrentDaughter.isPhysicalPrimary() == 1) - daughtp = true; - } - // count += 1; - } - rGenParticles.fill(HIST("hMC"), 7.5); - if (daughtp && daughts) { - rGenParticles.fill(HIST("hCKSGen"), mcParticle.pt(), cent); - } - } - } - - void processRecMC(EventCandidatesMC::iterator const& collision, - TrackCandidatesMC const& tracks, V0TrackCandidatesMC const& V0s, - aod::McParticles const& /*mcParticles*/, aod::McCollisions const& /*mcCollisions*/) - - { - - if (!collision.has_mcCollision()) { - return; - } - // if (std::abs(collision.mcCollision().posZ()) > cutzvertex || !collision.sel8()) { - if (std::abs(collision.mcCollision().posZ()) > cutzvertex) { - return; - } - - rRecParticles.fill(HIST("hMCRec"), 0.5); - - // if (timFrameEvsel && (!collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(aod::evsel::kNoITSROFrameBorder))) { - if (timFrameEvsel && (!collision.selection_bit(aod::evsel::kNoTimeFrameBorder))) { - return; - } - if (TVXEvsel && (!collision.selection_bit(aod::evsel::kIsTriggerTVX))) { - return; - } - - auto cent = 0; - cent = collision.centFT0C(); - - rRecParticles.fill(HIST("hMCRec"), 1.5); - rRecParticles.fill(HIST("hCentRec"), cent); - - float centrality = 0.0f; - auto oldindex = -999; - - for (auto track1 : tracks) { - - if (!selectionPID(track1)) - continue; // for primary particle PID - - if (!track1.has_mcParticle()) { - continue; - } - - if (!selectionTrack(track1)) { - continue; - } - - auto mctrack1 = track1.mcParticle(); - - if (!mctrack1.isPhysicalPrimary()) { - continue; - } - - for (auto& v0 : V0s) { - - if (!v0.has_mcParticle()) { - continue; - } - - auto postrack = v0.template posTrack_as(); - auto negtrack = v0.template negTrack_as(); - - if (!postrack.has_mcParticle()) - continue; // Checking that the daughter tracks come from particles and are not fake - if (!negtrack.has_mcParticle()) // Checking that the daughter tracks come from particles and are not fake - continue; - - // auto posParticle = postrack.mcParticle(); - // auto negParticle = negtrack.mcParticle(); - - double nTPCSigmaPos[1]{postrack.tpcNSigmaPi()}; - double nTPCSigmaNeg[1]{negtrack.tpcNSigmaPi()}; - - if (!isSelectedV0Daughter(postrack, 1, nTPCSigmaPos[0])) { - continue; - } - - if (!isSelectedV0Daughter(negtrack, -1, nTPCSigmaNeg[0])) { - continue; - } - - if (!SelectionV0(collision, v0, centrality)) { - continue; - } - - auto mctrackv0 = v0.mcParticle(); - - int track1PDG = std::abs(mctrack1.pdgCode()); - // int track2PDG = std::abs(mctrack2.pdgCode()); - int trackv0PDG = std::abs(mctrackv0.pdgCode()); - - if (postrack.globalIndex() == track1.globalIndex()) - continue; - if (negtrack.globalIndex() == track1.globalIndex()) - continue; - - rRecParticles.fill(HIST("hMCRec"), 2.5); - - if (track1PDG != 211) { - continue; - } - // if (track2PDG != 321) { - // continue; - // } - if (trackv0PDG != 310) { - continue; - } - - rRecParticles.fill(HIST("hMCRec"), 3.5); - - for (auto& mothertrack1 : mctrack1.mothers_as()) { - // for (auto& mothertrack2 : mctrack2.mothers_as()) { - for (auto& mothertrack2 : mctrackv0.mothers_as()) { - - rRecParticles.fill(HIST("hMCRec"), 4.5); - // LOG(info) << "Initial Mothers PDG:\t" <()) { - - // LOG(info) << "final Mothers PDG:\t" <= 0.5) { - continue; - } - - rRecParticles.fill(HIST("hMCRec"), 7.5); - - rRecParticles.fill(HIST("hCKSRec"), mothertrack1.pt(), cent); - } - } - } - } - } // track loop ends - } - - PROCESS_SWITCH(chargedkstaranalysis, processGenMC, "Process Gen event", false); - PROCESS_SWITCH(chargedkstaranalysis, processRecMC, "Process Rec event", false); - - void processSEnew(aod::ResoCollision& collision, aod::ResoTracks const& resotracks, aod::ResoV0s const& resov0s) + void processSEnew(aod::ResoCollision const& collision, + aod::ResoTracks const& resotracks, + aod::ResoV0s const& resov0s) { // Fill the event counter histos1.fill(HIST("hVertexZ"), collision.posZ()); - fillHistograms(collision, resotracks, resov0s); // Fill histograms, no MC, no mixing + fillHistograms(collision, resotracks, + resov0s); // Fill histograms, no MC, no mixing } - PROCESS_SWITCH(chargedkstaranalysis, processSEnew, "Process Same event new", true); - - using BinningTypeVtxZT0M = ColumnBinningPolicy; - void processMEnew(aod::ResoCollisions& collisions, aod::ResoTracks const& resotracks, aod::ResoV0s const& resov0s) + PROCESS_SWITCH(chargedkstaranalysis, processSEnew, "Process Same event new", + true); + + using BinningTypeVtxZT0M = + ColumnBinningPolicy; + void processMEnew(aod::ResoCollisions const& collisions, + aod::ResoTracks const& resotracks, + aod::ResoV0s const& resov0s) { auto tracksV0sTuple = std::make_tuple(resotracks, resov0s); - auto V0sTuple = std::make_tuple(resov0s); - BinningTypeVtxZT0M colBinning{{CfgVtxBins, CfgMultBins}, true}; - Pair pairs{colBinning, nEvtMixing, -1, collisions, tracksV0sTuple, &cache}; // -1 is the number of the bin to skip - for (auto& [c1, restrk1, c2, resov0s2] : pairs) { + auto v0stuple = std::make_tuple(resov0s); + BinningTypeVtxZT0M colBinning{{cfgvtxbins, cfgmultbins}, true}; + Pair + pairs{colBinning, nEvtMixing, -1, collisions, + tracksV0sTuple, &cache}; // -1 is the number of the bin to skip + for (const auto& [c1, restrk1, c2, resov0s2] : pairs) { fillHistograms(c1, restrk1, resov0s2); } } - PROCESS_SWITCH(chargedkstaranalysis, processMEnew, "Process Mixed events new", true); + PROCESS_SWITCH(chargedkstaranalysis, processMEnew, "Process Mixed events new", + true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From d973762cbbe230320f4c9d089687f6654a4f5c2b Mon Sep 17 00:00:00 2001 From: Jesper Gumprecht <113693781+jesgum@users.noreply.github.com> Date: Fri, 14 Feb 2025 14:33:51 +0100 Subject: [PATCH 0222/1650] [ALICE3] Switch to otf-rich (#9965) --- ALICE3/TableProducer/alice3-decaypreselector.cxx | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/ALICE3/TableProducer/alice3-decaypreselector.cxx b/ALICE3/TableProducer/alice3-decaypreselector.cxx index 66569360db9..e27e1e3ad94 100644 --- a/ALICE3/TableProducer/alice3-decaypreselector.cxx +++ b/ALICE3/TableProducer/alice3-decaypreselector.cxx @@ -22,6 +22,7 @@ #include #include #include +#include #include #include "Framework/runDataProcessing.h" @@ -44,7 +45,7 @@ #include "CCDB/BasicCCDBManager.h" #include "DataFormatsCalibration/MeanVertexObject.h" #include "ALICE3/DataModel/OTFTOF.h" -#include "ALICE3/DataModel/RICH.h" +#include "ALICE3/DataModel/OTFRICH.h" #include "ALICE3/DataModel/A3DecayFinderTables.h" using namespace o2; @@ -62,7 +63,7 @@ using FullTracksExt = soa::Join; // For MC association in pre-selection using labeledTracks = soa::Join; using tofTracks = soa::Join; -using richTracks = soa::Join; +using richTracks = soa::Join; struct alice3decaypreselector { Produces a3decayMaps; @@ -111,9 +112,9 @@ struct alice3decaypreselector { Partition pOuterTOFPi = nabs(aod::upgrade_tof::nSigmaPionOuterTOF) > nSigmaTOF; Partition pOuterTOFKa = nabs(aod::upgrade_tof::nSigmaKaonOuterTOF) > nSigmaTOF; Partition pOuterTOFPr = nabs(aod::upgrade_tof::nSigmaProtonOuterTOF) > nSigmaTOF; - Partition pRICHPi = nabs(aod::alice3rich::richNsigmaPi) > nSigmaRICH; - Partition pRICHKa = nabs(aod::alice3rich::richNsigmaKa) > nSigmaRICH; - Partition pRICHPr = nabs(aod::alice3rich::richNsigmaPr) > nSigmaRICH; + Partition pRICHPi = nabs(aod::upgrade_rich::nSigmaPionRich) > nSigmaRICH; + Partition pRICHKa = nabs(aod::upgrade_rich::nSigmaKaonRich) > nSigmaRICH; + Partition pRICHPr = nabs(aod::upgrade_rich::nSigmaProtonRich) > nSigmaRICH; //*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+* /// Initialization of mask vectors if uninitialized From 13fa33ca6cd2bdd8fe4a78c5202035fdb32a9e1a Mon Sep 17 00:00:00 2001 From: Jesper Gumprecht <113693781+jesgum@users.noreply.github.com> Date: Fri, 14 Feb 2025 14:56:52 +0100 Subject: [PATCH 0223/1650] [ALICE3] Update decayfinder configurables (#9964) --- ALICE3/TableProducer/alice3-decayfinder.cxx | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/ALICE3/TableProducer/alice3-decayfinder.cxx b/ALICE3/TableProducer/alice3-decayfinder.cxx index 9efcf908aaf..ae0ea6b5e20 100644 --- a/ALICE3/TableProducer/alice3-decayfinder.cxx +++ b/ALICE3/TableProducer/alice3-decayfinder.cxx @@ -80,14 +80,14 @@ struct alice3decayFinder { Configurable kaFromD_dcaXYconstant{"kaFromD_dcaXYconstant", -1.0f, "[0] in |DCAxy| > [0]+[1]/pT"}; Configurable kaFromD_dcaXYpTdep{"kaFromD_dcaXYpTdep", 0.0, "[1] in |DCAxy| > [0]+[1]/pT"}; - Configurable DCosPA{"Cos of pointing angle", 0.99, " Cos of pointing angle: pt < 3 GeV"}; - Configurable DCosPAHighPt{"Cos of pointing angle high pt", 0.995, " Cos of pointing angle: 3 GeV < pt"}; - Configurable DCosPAxy{"Cos of pointing angle xy", 0.99, " Cos of pointing angle xy: pt < 3 GeV"}; - Configurable DCosPAxyHighPt{"Cos of pointing angle xy high pt", 0.995, " Cos of pointing angle xy: 3 GeV < pt"}; - Configurable DCosThetaStarLowPt{"Cos theta low pt", 0.8, "Cos theta; pt < 9"}; - Configurable DCosThetaStarHighPt{"Cos theta high pt", 0.9, "Cos theta; 9 < pt < 16"}; - Configurable DCosThetaStarVHighPt{"Cos theta vhigh", 1.0, "Cos theta; 16 < pt"}; - Configurable DDauDecayLength{"Normalized dau decay length", 3, "|Normalized dau decay length| > [0]"}; + Configurable DCosPA{"DCosPA", 0.99, " Cos of pointing angle: pt < 3 GeV"}; + Configurable DCosPAHighPt{"DCosPAHighPt", 0.995, " Cos of pointing angle: 3 GeV < pt"}; + Configurable DCosPAxy{"DCosPAxy", 0.99, " Cos of pointing angle xy: pt < 3 GeV"}; + Configurable DCosPAxyHighPt{"DCosPAxyHighPt", 0.995, " Cos of pointing angle xy: 3 GeV < pt"}; + Configurable DCosThetaStarLowPt{"DCosThetaStarLowPt", 0.8, "Cos theta; pt < 9"}; + Configurable DCosThetaStarHighPt{"DCosThetaStarHighPt", 0.9, "Cos theta; 9 < pt < 16"}; + Configurable DCosThetaStarVHighPt{"DCosThetaStarVHighPt", 1.0, "Cos theta; 16 < pt"}; + Configurable DDauDecayLength{"DDauDecayLength", 3, "|Normalized dau decay length| > [0]"}; Configurable piFromLc_dcaXYconstant{"piFromLc_dcaXYconstant", -1.0f, "[0] in |DCAxy| > [0]+[1]/pT"}; Configurable piFromLc_dcaXYpTdep{"piFromLc_dcaXYpTdep", 0.0, "[1] in |DCAxy| > [0]+[1]/pT"}; @@ -427,7 +427,7 @@ struct alice3decayFinder { else if (dmeson.pt > 16 && std::fabs(dmeson.cosThetaStar) > DCosThetaStarVHighPt) continue; - if (dmeson.normalizedDecayLength < DDauDecayLength) + if (dmeson.normalizedDecayLength > DDauDecayLength) continue; histos.fill(HIST("hDCADDaughters"), dmeson.dcaDau * 1e+4); @@ -474,7 +474,7 @@ struct alice3decayFinder { else if (dmeson.pt > 16 && std::fabs(dmeson.cosThetaStar) > DCosThetaStarVHighPt) continue; - if (dmeson.normalizedDecayLength < DDauDecayLength) + if (dmeson.normalizedDecayLength > DDauDecayLength) continue; histos.fill(HIST("hDCADbarDaughters"), dmeson.dcaDau * 1e+4); From 5b9a9f8a0659be7d480caa5e3e61b08a1fcae405 Mon Sep 17 00:00:00 2001 From: Anantha Padmanabhan M Nair <82643666+ananthapadmanabhan18@users.noreply.github.com> Date: Fri, 14 Feb 2025 20:22:39 +0530 Subject: [PATCH 0224/1650] [PWGUD] Added Acceptance Cuts (#9958) --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index 40f024f737c..603b81aa4aa 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -56,8 +56,8 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct Configurable zdcCut{"zdcCut", 10., "ZDC threshold"}; Configurable pvCut{"pvCut", 1.0, "Use Only PV tracks"}; - Configurable dcaZcut{"dcaZcut", 3.2, "dcaZ cut"}; - Configurable dcaXYcut{"dcaXYcut", 2.4, "dcaXY cut (0 for Pt-function)"}; + Configurable dcaZcut{"dcaZcut", 2, "dcaZ cut"}; + Configurable dcaXYcut{"dcaXYcut", 0, "dcaXY cut (0 for Pt-function)"}; Configurable tpcChi2Cut{"tpcChi2Cut", 4, "Max tpcChi2NCl"}; Configurable tpcNClsFindableCut{"tpcNClsFindableCut", 70, "Min tpcNClsFindable"}; Configurable itsChi2Cut{"itsChi2Cut", 36, "Max itsChi2NCl"}; @@ -67,8 +67,8 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct Configurable nSigmaTPCcut{"nSigmaTPCcut", 3, "TPC cut"}; Configurable nSigmaTOFcut{"nSigmaTOFcut", 3, "TOF cut"}; Configurable strictEventSelection{"strictEventSelection", true, "Event Selection"}; - Configurable ifDataAnalysis{"ifDataAnalysis", false, "Data Analysis"}; - Configurable ifMCAnalysis{"ifMCAnalysis", true, "MC Analysis"}; + Configurable ifDataAnalysis{"ifDataAnalysis", true, "Data Analysis"}; + Configurable ifMCAnalysis{"ifMCAnalysis", false, "MC Analysis"}; Configurable nBinsPt{"nBinsPt", 1000, "Number of bins for pT"}; Configurable nBinsInvariantMass{"nBinsInvariantMass", 1000, "Number of bins for Invariant Mass"}; @@ -542,21 +542,24 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct for (const auto& mother : particle.mothers_as()) { if (mother.pdgCode() == 30113) { - if (flag == false) { histosMCgen.fill(HIST("rhoPrimeCounts"), 5); } flag = true; if (particle.pdgCode() == 211) { - piPlusvectors.push_back(tempVector); - histosMCgen.fill(HIST("MCgen_particle_pT"), tempVector.Pt()); - histosMCgen.fill(HIST("MCgen_particle_rapidity"), tempVector.Rapidity()); + if (std::abs(tempVector.Rapidity()) < 0.9) { + piPlusvectors.push_back(tempVector); + histosMCgen.fill(HIST("MCgen_particle_pT"), tempVector.Pt()); + histosMCgen.fill(HIST("MCgen_particle_rapidity"), tempVector.Rapidity()); + } } if (particle.pdgCode() == -211) { - piMinusvectors.push_back(tempVector); - histosMCgen.fill(HIST("MCgen_particle_pT"), tempVector.Pt()); - histosMCgen.fill(HIST("MCgen_particle_rapidity"), tempVector.Rapidity()); + if (std::abs(tempVector.Rapidity()) < 0.9) { + piMinusvectors.push_back(tempVector); + histosMCgen.fill(HIST("MCgen_particle_pT"), tempVector.Pt()); + histosMCgen.fill(HIST("MCgen_particle_rapidity"), tempVector.Rapidity()); + } } } // End of Mother ID 30113 rho prime } // End of loop over mothers @@ -598,7 +601,7 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct } // End of 4 Pion MC Generation Process function PROCESS_SWITCH(exclusiveRhoTo4Pi, processMCgen, "The Process for 4 Pion Analysis from MC Generation", ifMCAnalysis); - using CollisionStuff = soa::Join; // + using CollisionStuff = soa::Join; using CollisionTotal = CollisionStuff::iterator; using TrackStuff = soa::Join; From 5f3fd8ad03d7c6fd039b8484dd1d9643356e443f Mon Sep 17 00:00:00 2001 From: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> Date: Fri, 14 Feb 2025 16:23:10 +0100 Subject: [PATCH 0225/1650] [PWGLF] Add Interaction Rate Vs Occupancy 2D histograms + limit number of ccdb calls (#9952) --- .../Strangeness/derivedlambdakzeroanalysis.cxx | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx b/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx index 048ded5722f..437bae703e5 100644 --- a/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx @@ -461,6 +461,8 @@ struct derivedlambdakzeroanalysis { histos.add("hInteractionRate", "hInteractionRate", kTH1F, {axisIRBinning}); histos.add("hCentralityVsInteractionRate", "hCentralityVsInteractionRate", kTH2F, {{101, 0.0f, 101.0f}, axisIRBinning}); + histos.add("hInteractionRateVsOccupancy", "hInteractionRateVsOccupancy", kTH2F, {axisIRBinning, axisOccupancy}); + // for QA and test purposes auto hRawCentrality = histos.add("hRawCentrality", "hRawCentrality", kTH1F, {axisRawCentrality}); @@ -1593,7 +1595,8 @@ struct derivedlambdakzeroanalysis { histos.fill(HIST("hEventSelection"), 17 /* Above max occupancy */); } - double interactionRate = rateFetcher.fetch(ccdb.service, collision.timestamp(), collision.runNumber(), irSource) * 1.e-3; + // Fetch interaction rate only if required (in order to limit ccdb calls) + double interactionRate = (eventSelections.minIR >= 0 || eventSelections.maxIR >= 0) ? rateFetcher.fetch(ccdb.service, collision.timestamp(), collision.runNumber(), irSource) * 1.e-3 : -1; if (eventSelections.minIR >= 0 && interactionRate < eventSelections.minIR) { return false; } @@ -1721,7 +1724,8 @@ struct derivedlambdakzeroanalysis { centrality = hRawCentrality->GetBinContent(hRawCentrality->FindBin(doPPAnalysis ? collision.multFT0A() + collision.multFT0C() : collision.multFT0C())); } float collisionOccupancy = eventSelections.useFT0CbasedOccupancy ? collision.ft0cOccupancyInTimeRange() : collision.trackOccupancyInTimeRange(); - double interactionRate = rateFetcher.fetch(ccdb.service, collision.timestamp(), collision.runNumber(), irSource) * 1.e-3; + // Fetch interaction rate only if required (in order to limit ccdb calls) + double interactionRate = !irSource.value.empty() ? rateFetcher.fetch(ccdb.service, collision.timestamp(), collision.runNumber(), irSource) * 1.e-3 : -1; // gap side int gapSide = collision.gapSide(); @@ -1748,6 +1752,8 @@ struct derivedlambdakzeroanalysis { histos.fill(HIST("hInteractionRate"), interactionRate); histos.fill(HIST("hCentralityVsInteractionRate"), centrality, interactionRate); + histos.fill(HIST("hInteractionRateVsOccupancy"), interactionRate, collisionOccupancy); + // __________________________________________ // perform main analysis int nK0Shorts = 0; @@ -1805,7 +1811,8 @@ struct derivedlambdakzeroanalysis { centrality = hRawCentrality->GetBinContent(hRawCentrality->FindBin(doPPAnalysis ? collision.multFT0A() + collision.multFT0C() : collision.multFT0C())); } float collisionOccupancy = eventSelections.useFT0CbasedOccupancy ? collision.ft0cOccupancyInTimeRange() : collision.trackOccupancyInTimeRange(); - double interactionRate = rateFetcher.fetch(ccdb.service, collision.timestamp(), collision.runNumber(), irSource) * 1.e-3; + // Fetch interaction rate only if required (in order to limit ccdb calls) + double interactionRate = !irSource.value.empty() ? rateFetcher.fetch(ccdb.service, collision.timestamp(), collision.runNumber(), irSource) * 1.e-3 : -1; // gap side int gapSide = collision.gapSide(); @@ -1832,6 +1839,8 @@ struct derivedlambdakzeroanalysis { histos.fill(HIST("hInteractionRate"), interactionRate); histos.fill(HIST("hCentralityVsInteractionRate"), centrality, interactionRate); + histos.fill(HIST("hInteractionRateVsOccupancy"), interactionRate, collisionOccupancy); + // __________________________________________ // perform main analysis int nK0Shorts = 0; From 5ed41a1a4381fdb846ad46f983de9666415a61fe Mon Sep 17 00:00:00 2001 From: Luca Barioglio Date: Fri, 14 Feb 2025 17:59:09 +0100 Subject: [PATCH 0226/1650] Add event selection configurable (#9967) --- PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx | 95 +++++++++++++++++++- 1 file changed, 93 insertions(+), 2 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx index f2960485a6f..aad2ff9afe4 100644 --- a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx +++ b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx @@ -222,6 +222,31 @@ enum centDetectors { }; static const std::vector centDetectorNames{"FV0A", "FT0M", "FT0A", "FT0C"}; + +enum evSel { + kTVX = 0, + kZvtx, + kTFborder, + kITSROFborder, + kNoSameBunchPileup, + kIsGoodZvtxFT0vsPV, + kIsGoodITSLayersAll, + kIsEPtriggered, + kNevSels +}; + +static const std::vector eventSelectionTitle{"Event selections"}; +static const std::vector eventSelectionLabels{"TVX", "Z vtx", "TF border", "ITS ROF border", "No same-bunch pile-up", "kIsGoodZvtxFT0vsPV", "isGoodITSLayersAll", "isEPtriggered"}; + +constexpr int EvSelDefault[8][1]{ + {1}, + {1}, + {0}, + {0}, + {0}, + {0}, + {0}, + {0}}; } // namespace nuclei struct nucleiSpectra { @@ -263,6 +288,8 @@ struct nucleiSpectra { Configurable cfgCutPtMinTree{"cfgCutPtMinTree", 0.2f, "Minimum track transverse momentum for tree saving"}; Configurable cfgCutPtMaxTree{"cfgCutPtMaxTree", 15.0f, "Maximum track transverse momentum for tree saving"}; + Configurable> cfgEventSelections{"cfgEventSelections", {nuclei::EvSelDefault[0], 8, 1, nuclei::eventSelectionLabels, nuclei::eventSelectionTitle}, "Event selections"}; + Configurable> cfgMomentumScalingBetheBloch{"cfgMomentumScalingBetheBloch", {nuclei::bbMomScalingDefault[0], 5, 2, nuclei::names, nuclei::chargeLabelNames}, "TPC Bethe-Bloch momentum scaling for light nuclei"}; Configurable> cfgBetheBlochParams{"cfgBetheBlochParams", {nuclei::betheBlochDefault[0], 5, 6, nuclei::names, nuclei::betheBlochParNames}, "TPC Bethe-Bloch parameterisation for light nuclei"}; Configurable> cfgNsigmaTPC{"cfgNsigmaTPC", {nuclei::nSigmaTPCdefault[0], 5, 2, nuclei::names, nuclei::nSigmaConfigName}, "TPC nsigma selection for light nuclei"}; @@ -354,6 +381,59 @@ struct nucleiSpectra { return collision.selection_bit(aod::evsel::kIsTriggerTVX) && collision.posZ() > -cfgCutVertex && collision.posZ() < cfgCutVertex && collision.selection_bit(aod::evsel::kNoTimeFrameBorder); } + template + bool eventSelectionWithHisto(Tcoll& collision) + { + spectra.fill(HIST("hEventSelections"), 0); + + if (cfgEventSelections->get(nuclei::evSel::kTVX) && !collision.selection_bit(aod::evsel::kIsTriggerTVX)) { + return false; + } + spectra.fill(HIST("hEventSelections"), nuclei::evSel::kTVX + 1); + + if (cfgEventSelections->get(nuclei::evSel::kZvtx) && std::abs(collision.posZ()) > cfgCutVertex) { + return false; + } + spectra.fill(HIST("hEventSelections"), nuclei::evSel::kZvtx + 1); + + if (cfgEventSelections->get(nuclei::evSel::kTFborder) && !collision.selection_bit(aod::evsel::kNoTimeFrameBorder)) { + return false; + } + spectra.fill(HIST("hEventSelections"), nuclei::evSel::kTFborder + 1); + + if (cfgEventSelections->get(nuclei::evSel::kITSROFborder) && !collision.selection_bit(aod::evsel::kNoITSROFrameBorder)) { + return false; + } + spectra.fill(HIST("hEventSelections"), nuclei::evSel::kITSROFborder + 1); + + if (cfgEventSelections->get(nuclei::evSel::kNoSameBunchPileup) && !collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { + return false; + } + spectra.fill(HIST("hEventSelections"), nuclei::evSel::kNoSameBunchPileup + 1); + + if (cfgEventSelections->get(nuclei::evSel::kIsGoodZvtxFT0vsPV) && !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { + return false; + } + spectra.fill(HIST("hEventSelections"), nuclei::evSel::kIsGoodZvtxFT0vsPV + 1); + + if (cfgEventSelections->get(nuclei::evSel::kIsGoodITSLayersAll) && !collision.selection_bit(aod::evsel::kIsGoodITSLayersAll)) { + return false; + } + spectra.fill(HIST("hEventSelections"), nuclei::evSel::kIsGoodITSLayersAll + 1); + + if constexpr ( + requires { + collision.triggereventep(); + }) { + if (cfgEventSelections->get(nuclei::evSel::kIsEPtriggered) && !collision.triggereventep()) { + return false; + } + spectra.fill(HIST("hEventSelections"), nuclei::evSel::kIsEPtriggered + 1); + } + + return true; + } + void initCCDB(aod::BCsWithTimestamps::iterator const& bc) { if (mRunNumber == bc.runNumber()) { @@ -414,6 +494,17 @@ struct nucleiSpectra { {cfgDCAxyBinsAlpha, "DCA_{z} (cm)"}}; const AxisSpec etaAxis{40, -1., 1., "#eta"}; + spectra.add("hEventSelections", "hEventSelections", {HistType::kTH1I, {{nuclei::evSel::kNevSels + 1, -0.5f, float(nuclei::evSel::kNevSels) + 0.5f}}}); + spectra.get(HIST("hEventSelections"))->GetXaxis()->SetBinLabel(1, "all"); + spectra.get(HIST("hEventSelections"))->GetXaxis()->SetBinLabel(nuclei::evSel::kTVX + 2, "TVX"); + spectra.get(HIST("hEventSelections"))->GetXaxis()->SetBinLabel(nuclei::evSel::kZvtx + 2, "Zvtx"); + spectra.get(HIST("hEventSelections"))->GetXaxis()->SetBinLabel(nuclei::evSel::kTFborder + 2, "TFborder"); + spectra.get(HIST("hEventSelections"))->GetXaxis()->SetBinLabel(nuclei::evSel::kITSROFborder + 2, "ITSROFborder"); + spectra.get(HIST("hEventSelections"))->GetXaxis()->SetBinLabel(nuclei::evSel::kNoSameBunchPileup + 2, "kNoSameBunchPileup"); + spectra.get(HIST("hEventSelections"))->GetXaxis()->SetBinLabel(nuclei::evSel::kIsGoodZvtxFT0vsPV + 2, "isGoodZvtxFT0vsPV"); + spectra.get(HIST("hEventSelections"))->GetXaxis()->SetBinLabel(nuclei::evSel::kIsGoodITSLayersAll + 2, "IsGoodITSLayersAll"); + spectra.get(HIST("hEventSelections"))->GetXaxis()->SetBinLabel(nuclei::evSel::kIsEPtriggered + 2, "IsEPtriggered"); + spectra.add("hRecVtxZData", "collision z position", HistType::kTH1F, {{200, -20., +20., "z position (cm)"}}); if (doprocessMC) { spectra.add("hGenVtxZ", " generated collision z position", HistType::kTH1F, {{200, -20., +20., "z position (cm)"}}); @@ -760,7 +851,7 @@ struct nucleiSpectra { { nuclei::candidates.clear(); nuclei::candidates_flow.clear(); - if (!eventSelection(collision)) { + if (!eventSelectionWithHisto(collision)) { return; } if (!collision.triggereventep() || !collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { @@ -789,7 +880,7 @@ struct nucleiSpectra { { nuclei::candidates.clear(); nuclei::candidates_flow.clear(); - if (!eventSelection(collision)) { + if (!eventSelectionWithHisto(collision)) { return; } if (!collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { From 13f1a08c17c399f5d05e417d78595cda63cd816f Mon Sep 17 00:00:00 2001 From: Noor Koster <82090643+cnkoster@users.noreply.github.com> Date: Fri, 14 Feb 2025 18:00:44 +0100 Subject: [PATCH 0227/1650] [PWGCF] Changed acc * eff for positive and negative QA histos (#9966) --- PWGCF/Flow/Tasks/flowSP.cxx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowSP.cxx b/PWGCF/Flow/Tasks/flowSP.cxx index 7dbf51f9514..79445d4c124 100644 --- a/PWGCF/Flow/Tasks/flowSP.cxx +++ b/PWGCF/Flow/Tasks/flowSP.cxx @@ -339,7 +339,6 @@ struct FlowSP { registry.add("QA/after/PsiC_vs_Vz", "", {HistType::kTH2D, {axisPhiPlane, axisVz}}); registry.add("QA/after/PsiFull_vs_Vz", "", {HistType::kTH2D, {axisPhiPlane, axisVz}}); - registry.addClone("QA/after/", "QA/before/"); // track QA for pos, neg, incl registry.add("incl/QA/hPt", "", kTH1D, {axisPt}); registry.add("incl/QA/hPhi", "", kTH1D, {axisPhi}); @@ -353,6 +352,8 @@ struct FlowSP { } } + registry.addClone("QA/after/", "QA/before/"); + if (cfgFillChargeDependence) { registry.addClone("incl/", "pos/"); registry.addClone("incl/", "neg/"); @@ -927,10 +928,10 @@ struct FlowSP { if (cfgFillChargeDependence) { if (pos) { fillHistograms(track, waccP, weffP, ux, uy, uxMH, uyMH, qxA, qyA, qxC, qyC, corrQQx, corrQQy, corrQQ, vnA, vnC, vnFull, centrality); - fillTrackQA(track, vtxz, wacc, weff); + fillTrackQA(track, vtxz, waccP, weffP); } else { fillHistograms(track, waccN, weffN, ux, uy, uxMH, uyMH, qxA, qyA, qxC, qyC, corrQQx, corrQQy, corrQQ, vnA, vnC, vnFull, centrality); - fillTrackQA(track, vtxz, wacc, weff); + fillTrackQA(track, vtxz, waccN, weffN); } } } // end of track loop From 6a15bfd086b13a58d85505bebb6812fe99378647 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Fri, 14 Feb 2025 19:05:39 +0100 Subject: [PATCH 0228/1650] [PWGLF] Add additional histogram for resonance flow measurement (#9972) --- PWGLF/Tasks/Resonances/highmasslambda.cxx | 79 +++++++++++++++++------ PWGLF/Tasks/Resonances/phipbpb.cxx | 6 ++ 2 files changed, 67 insertions(+), 18 deletions(-) diff --git a/PWGLF/Tasks/Resonances/highmasslambda.cxx b/PWGLF/Tasks/Resonances/highmasslambda.cxx index 9bbe5243e5c..49f6c0d8218 100644 --- a/PWGLF/Tasks/Resonances/highmasslambda.cxx +++ b/PWGLF/Tasks/Resonances/highmasslambda.cxx @@ -77,22 +77,25 @@ struct highmasslambda { double bz{0.}; Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; - Configurable ccdbPathLut{"ccdbPathLut", "GLO/Param/MatLUT", "Path for LUT parametrization"}; - Configurable ccdbPathGrp{"ccdbPathGrp", "GLO/GRP/GRP", "Path of the grp file (Run 2)"}; + // Configurable ccdbPathLut{"ccdbPathLut", "GLO/Param/MatLUT", "Path for LUT parametrization"}; + // Configurable ccdbPathGrp{"ccdbPathGrp", "GLO/GRP/GRP", "Path of the grp file (Run 2)"}; Configurable ccdbPathGrpMag{"ccdbPathGrpMag", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object (Run 3)"}; - Configurable isRun2{"isRun2", false, "enable Run 2 or Run 3 GRP objects for magnetic field"}; + // Configurable isRun2{"isRun2", false, "enable Run 2 or Run 3 GRP objects for magnetic field"}; Configurable cnfabsdca{"cnfabsdca", false, "Use Abs DCA for secondary vertex fitting"}; // fill output Configurable cfgOccupancyCut{"cfgOccupancyCut", 2500, "Occupancy cut"}; Configurable fillRotation{"fillRotation", false, "fill rotation"}; Configurable useSP{"useSP", false, "useSP"}; + Configurable useKshortOpti{"useKshortOpti", 1, "useKshortOpti"}; // events Configurable cfgCutVertex{"cfgCutVertex", 10.0f, "Accepted z-vertex range"}; Configurable cfgCutCentralityMax{"cfgCutCentralityMax", 50.0f, "Accepted maximum Centrality"}; Configurable cfgCutCentralityMin{"cfgCutCentralityMin", 30.0f, "Accepted minimum Centrality"}; Configurable additionalEvSel{"additionalEvSel", true, "additionalEvSel"}; // proton track cut + Configurable confMinDCAProtonV0{"confMinDCAProtonV0", -5.0, "Minimum DCA between Proton and V0"}; + Configurable confMaxDCAProtonV0{"confMaxDCAProtonV0", 5.0, "Maximum DCA between Proton and V0"}; Configurable confMinRot{"confMinRot", 5.0 * TMath::Pi() / 6.0, "Minimum of rotation"}; Configurable confMaxRot{"confMaxRot", 7.0 * TMath::Pi() / 6.0, "Maximum of rotation"}; Configurable confRapidity{"confRapidity", 0.8, "cut on Rapidity"}; @@ -173,9 +176,16 @@ struct highmasslambda { // std::vector ptLambdaBinning = {2.0, 3.0, 4.0, 5.0, 6.0}; std::vector occupancyBinning = {-0.5, 500.0, 1000.0, 1500.0, 2000.0, 3000.0, 4000.0, 5000.0, 50000.0}; + std::vector dcaV0toPVBinning = {0.0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.08, 0.1, 0.15, 0.2, 0.3, 0.5, 1.0}; + std::vector cpaV0Binning = {0.995, 0.996, 0.997, 0.998, 0.999, 0.9995, 0.9997, 0.9999, 1.005}; + std::vector ptV0Binning = {0.0, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1.0, 1.5, 100.0}; + std::vector dcaBetweenV0 = {0.0, 0.05, 0.1, 0.15, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1.0}; + std::vector dcaBetweenProtonV0 = {-0.05, -0.04, -0.03, -0.025, -0.02, -0.01, -0.005, -0.004, -0.003, -0.003, -0.002, -0.001, 0.0, 0.001, 0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.01, 0.012, 0.014, 0.016, 0.018, 0.02, 0.025, 0.03, 0.04, 0.05, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2, 0.3, 0.4, 0.5, 1.0}; + AxisSpec resAxis = {1600, -30, 30, "Res"}; AxisSpec phiAxis = {500, -6.28, 6.28, "phi"}; AxisSpec centAxis = {8, 0, 80, "V0M (%)"}; + AxisSpec dcaV0toPVAxis = {dcaV0toPVBinning, "dcaV0toPV"}; const AxisSpec thnAxisInvMass{configThnAxisInvMass, "#it{M} (GeV/#it{c}^{2})"}; const AxisSpec thnAxisPt{configThnAxisPt, "#it{p}_{T} (GeV/#it{c})"}; const AxisSpec thnAxisV2{configThnAxisV2, "V2"}; @@ -215,14 +225,21 @@ struct highmasslambda { histos.add("hImpactPar0", "hImpactPar0", kTH1F, {{500, 0.0f, 0.1f}}); histos.add("hImpactPar1", "hImpactPar1", kTH1F, {{500, 0.0f, 0.1f}}); histos.add("hCPA", "hCPA", kTH1F, {{220, -1.1f, 1.1f}}); - - histos.add("hSparseV2SASameEvent_V2", "hSparseV2SASameEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisDCA, thnAxisPtProton}); - histos.add("hSparseV2SASameEventRotational_V2", "hSparseV2SASameEventRotational", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisDCA, thnAxisPtProton}); - histos.add("hSparseV2SAMixedEvent_V2", "hSparseV2SAMixedEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisDCA, thnAxisPtProton}); - histos.add("hSparseV2SASameEvent_V2_SVX", "hSparseV2SASameEvent_V2_SVX", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisDecayLength, thnAxisCPA}); histos.add("hSparseV2SASameEventRotational_V2_SVX", "hSparseV2SASameEventRotational_SVX", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisDecayLength, thnAxisCPA}); - + histos.add("hSparseV2SASameEventRotational_V2", "hSparseV2SASameEventRotational", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2}); + if (useKshortOpti == 0) { + histos.add("hSparseV2SASameEvent_V2", "hSparseV2SASameEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisDCA, thnAxisPtProton}); + histos.add("hSparseV2SAMixedEvent_V2", "hSparseV2SAMixedEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisDCA, thnAxisPtProton}); + } + if (useKshortOpti == 1) { + histos.add("hSparseV2SASameEvent_V2", "hSparseV2SASameEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, dcaV0toPVBinning, cpaV0Binning, ptV0Binning, dcaBetweenV0, dcaBetweenProtonV0}); + histos.add("hSparseV2SAMixedEvent_V2", "hSparseV2SAMixedEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, dcaV0toPVBinning, cpaV0Binning, ptV0Binning, dcaBetweenV0, dcaBetweenProtonV0}); + } + if (useKshortOpti == 2) { + histos.add("hSparseV2SASameEvent_V2", "hSparseV2SASameEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2}); + histos.add("hSparseV2SAMixedEvent_V2", "hSparseV2SAMixedEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2}); + } // histogram for resolution histos.add("ResFT0CTPC", "ResFT0CTPC", kTH2F, {centAxis, resAxis}); histos.add("ResFT0CTPCR", "ResFT0CTPCR", kTH2F, {centAxis, resAxis}); @@ -249,7 +266,7 @@ struct highmasslambda { template bool selectionTrack(const T& candidate) { - if (!(candidate.isGlobalTrackWoDCA() && candidate.itsNCls() > cfgITScluster && candidate.tpcNClsFound() > cfgTPCcluster)) { + if (!(candidate.isGlobalTrackWoDCA() && candidate.itsNCls() > cfgITScluster && candidate.tpcNClsCrossedRows() > cfgTPCcluster)) { return false; } if (candidate.pt() > 0.0 && candidate.pt() < 0.5 && std::abs(candidate.dcaXY()) < cfgCutDCAxymin1) { @@ -531,7 +548,7 @@ struct highmasslambda { { const auto eta = track.eta(); const auto pt = track.pt(); - const auto tpcNClsF = track.tpcNClsFound(); + const auto tpcNClsF = track.tpcNClsCrossedRows(); const auto dcaXY = track.dcaXY(); const auto sign = track.sign(); if (charge < 0 && sign > 0) { @@ -546,7 +563,7 @@ struct highmasslambda { if (std::abs(pt) < 0.15) { return false; } - if (tpcNClsF < 50) { + if (tpcNClsF < 70) { return false; } if (std::abs(dcaXY) < ConfDaughDCAMin) { @@ -687,8 +704,21 @@ struct highmasslambda { if (useSP) { v2 = TMath::Cos(2.0 * phiminuspsi); } - if (Lambdac.M() > cMinLambdaMass && Lambdac.M() <= cMaxLambdaMass && std::abs(Lambdac.Rapidity()) < confRapidity && Lambdac.Pt() > 1.0 && Lambdac.Pt() <= 6.0) { - histos.fill(HIST("hSparseV2SASameEvent_V2"), Lambdac.M(), Lambdac.Pt(), v2, std::abs(track1.dcaXY()), Proton.Pt()); + auto dcaV0toPV = std::abs(v0.dcav0topv()); + auto cpaV0 = v0.v0cosPA(); + auto ptV0 = v0.pt(); + auto dcaV0Daughters = std::abs(v0.dcaV0daughters()); + auto dcaProtonV0 = v0.dcav0topv() - track1.dcaXY(); + if (Lambdac.M() > cMinLambdaMass && Lambdac.M() <= cMaxLambdaMass && std::abs(Lambdac.Rapidity()) < confRapidity && Lambdac.Pt() > 1.0 && Lambdac.Pt() <= 6.0 && dcaProtonV0 > confMinDCAProtonV0 && dcaProtonV0 < confMaxDCAProtonV0) { + if (useKshortOpti == 0) { + histos.fill(HIST("hSparseV2SASameEvent_V2"), Lambdac.M(), Lambdac.Pt(), std::abs(track1.dcaXY()), Proton.Pt()); + } + if (useKshortOpti == 1) { + histos.fill(HIST("hSparseV2SASameEvent_V2"), Lambdac.M(), Lambdac.Pt(), dcaV0toPV, cpaV0, ptV0, dcaV0Daughters, dcaProtonV0); + } + if (useKshortOpti == 2) { + histos.fill(HIST("hSparseV2SASameEvent_V2"), Lambdac.M(), Lambdac.Pt(), v2); + } } if (fillRotation) { for (int nrotbkg = 0; nrotbkg < nBkgRotations; nrotbkg++) { @@ -706,8 +736,8 @@ struct highmasslambda { if (useSP) { v2Rot = TMath::Cos(2.0 * phiminuspsiRot); } - if (LambdacRot.M() > cMinLambdaMass && LambdacRot.M() <= cMaxLambdaMass && std::abs(LambdacRot.Rapidity()) < confRapidity && LambdacRot.Pt() > 1.0 && LambdacRot.Pt() <= 6.0) { - histos.fill(HIST("hSparseV2SASameEventRotational_V2"), LambdacRot.M(), LambdacRot.Pt(), v2Rot, std::abs(track1.dcaXY()), Proton.Pt()); + if (LambdacRot.M() > cMinLambdaMass && LambdacRot.M() <= cMaxLambdaMass && std::abs(LambdacRot.Rapidity()) < confRapidity && LambdacRot.Pt() > 1.0 && LambdacRot.Pt() <= 6.0 && dcaProtonV0 > confMinDCAProtonV0 && dcaProtonV0 < confMaxDCAProtonV0) { + histos.fill(HIST("hSparseV2SASameEventRotational_V2"), LambdacRot.M(), LambdacRot.Pt(), v2Rot); } } } @@ -807,8 +837,21 @@ struct highmasslambda { if (useSP) { v2 = TMath::Cos(2.0 * phiminuspsi); } - if (occupancy1 < cfgOccupancyCut && occupancy2 < cfgOccupancyCut && Lambdac.M() > cMinLambdaMass && Lambdac.M() <= cMaxLambdaMass && std::abs(Lambdac.Rapidity()) < confRapidity && Lambdac.Pt() > 1.0 && Lambdac.Pt() <= 6.0) { - histos.fill(HIST("hSparseV2SAMixedEvent_V2"), Lambdac.M(), Lambdac.Pt(), v2, std::abs(track1.dcaXY()), Proton.Pt()); + auto dcaV0toPV = std::abs(v0.dcav0topv()); + auto cpaV0 = v0.v0cosPA(); + auto ptV0 = v0.pt(); + auto dcaV0Daughters = std::abs(v0.dcaV0daughters()); + auto dcaProtonV0 = v0.dcav0topv() - track1.dcaXY(); + if (Lambdac.M() > cMinLambdaMass && Lambdac.M() <= cMaxLambdaMass && std::abs(Lambdac.Rapidity()) < confRapidity && Lambdac.Pt() > 1.0 && Lambdac.Pt() <= 6.0 && dcaProtonV0 > confMinDCAProtonV0 && dcaProtonV0 < confMaxDCAProtonV0) { + if (useKshortOpti == 0) { + histos.fill(HIST("hSparseV2SAMixedEvent_V2"), Lambdac.M(), Lambdac.Pt(), std::abs(track1.dcaXY()), Proton.Pt()); + } + if (useKshortOpti == 1) { + histos.fill(HIST("hSparseV2SAMixedEvent_V2"), Lambdac.M(), Lambdac.Pt(), dcaV0toPV, cpaV0, ptV0, dcaV0Daughters, dcaProtonV0); + } + if (useKshortOpti == 2) { + histos.fill(HIST("hSparseV2SAMixedEvent_V2"), Lambdac.M(), Lambdac.Pt(), v2); + } } } } diff --git a/PWGLF/Tasks/Resonances/phipbpb.cxx b/PWGLF/Tasks/Resonances/phipbpb.cxx index f8122d12681..987bd6d6849 100644 --- a/PWGLF/Tasks/Resonances/phipbpb.cxx +++ b/PWGLF/Tasks/Resonances/phipbpb.cxx @@ -206,6 +206,7 @@ struct phipbpb { histos.add("hSparseV2MixedEventCosDeltaPhi", "hSparseV2MixedEventCosDeltaPhi", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); histos.add("hSparseV2SameEventCosDeltaPhiSquare", "hSparseV2SameEventCosDeltaPhiSquare", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, squareAxis, thnAxisCentrality}); + histos.add("hSparseV2SameEventCosDeltaPhiCube", "hSparseV2SameEventCosDeltaPhiCube", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); histos.add("hSparseV2MixedEventCosDeltaPhiSquare", "hSparseV2MixedEventCosDeltaPhiSquare", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, squareAxis, thnAxisCentrality}); histos.add("hSparseV2SameEventSinDeltaPhi", "hSparseV2SameEventSinDeltaPhi", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); @@ -259,6 +260,8 @@ struct phipbpb { histos.add("hSparseMCGenWeight", "hSparseMCGenWeight", HistType::kTHnSparseF, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {50, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); histos.add("hSparseMCRecWeight", "hSparseMCRecWeight", HistType::kTHnSparseF, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {50, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); histos.add("hSparseMCRecAllTrackWeight", "hSparseMCRecAllTrackWeight", HistType::kTHnSparseF, {thnAxisCentrality, {36, 0.0, TMath::Pi()}, {50, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); + histos.add("hSparseMCGenV2", "hSparseMCGenV2", HistType::kTHnSparseF, {thnAxisCentrality, {200, -1.0, 1.0}, axisPtKaonWeight}); + histos.add("hSparseMCRecV2", "hSparseMCRecV2", HistType::kTHnSparseF, {thnAxisCentrality, {200, -1.0, 1.0}, axisPtKaonWeight}); } // Event selection cut additional - Alex if (additionalEvsel) { @@ -572,6 +575,7 @@ struct phipbpb { histos.fill(HIST("hSparseV2SameEventCosDeltaPhi"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2, centrality); } histos.fill(HIST("hSparseV2SameEventCosDeltaPhiSquare"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2 * v2, centrality); + histos.fill(HIST("hSparseV2SameEventCosDeltaPhiCube"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2 * v2 * v2, centrality); histos.fill(HIST("hSparseV2SameEventSinDeltaPhi"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2sin * QFT0C, centrality); histos.fill(HIST("hSparseV2SameEventCosPhi"), PhiMesonMother.M(), PhiMesonMother.Pt(), TMath::Cos(2.0 * phimother), centrality); @@ -952,6 +956,7 @@ struct phipbpb { if (TMath::Abs(mcParticle.eta()) > 0.8) // main acceptance continue; histos.fill(HIST("hSparseMCGenWeight"), centclass, GetPhiInRange(deltaPhi), TMath::Power(TMath::Cos(2.0 * GetPhiInRange(deltaPhi)), 2.0), mcParticle.pt(), mcParticle.eta()); + histos.fill(HIST("hSparseMCGenV2"), centclass, TMath::Cos(2.0 * GetPhiInRange(deltaPhi)), mcParticle.pt()); nCh++; bool validGlobal = false; bool validAny = false; @@ -969,6 +974,7 @@ struct phipbpb { // if valid global, fill if (validGlobal) { histos.fill(HIST("hSparseMCRecWeight"), centclass, GetPhiInRange(deltaPhi), TMath::Power(TMath::Cos(2.0 * GetPhiInRange(deltaPhi)), 2.0), mcParticle.pt(), mcParticle.eta()); + histos.fill(HIST("hSparseMCRecV2"), centclass, TMath::Cos(2.0 * GetPhiInRange(deltaPhi)), mcParticle.pt()); } if (validAny) { histos.fill(HIST("hSparseMCRecAllTrackWeight"), centclass, GetPhiInRange(deltaPhi), TMath::Power(TMath::Cos(2.0 * GetPhiInRange(deltaPhi)), 2.0), mcParticle.pt(), mcParticle.eta()); From 41826e11106820788f8ca4a8fa466149470b33d4 Mon Sep 17 00:00:00 2001 From: Fabrizio Chinu <91954233+fchinu@users.noreply.github.com> Date: Fri, 14 Feb 2025 21:41:01 +0100 Subject: [PATCH 0229/1650] [PWGHF] Add npv contributors axis for non prompt outputs (#9970) --- PWGHF/D2H/Tasks/taskDs.cxx | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskDs.cxx b/PWGHF/D2H/Tasks/taskDs.cxx index 8c18474b5c5..f8d848e596f 100644 --- a/PWGHF/D2H/Tasks/taskDs.cxx +++ b/PWGHF/D2H/Tasks/taskDs.cxx @@ -178,8 +178,8 @@ struct HfTaskDs { std::vector axes = {massbins, ptbins, centralitybins}; std::vector axesMl = {massbins, ptbins, centralitybins, mlscore0bins, mlscore1bins, mlscore2bins}; - std::vector axesFd = {massbins, ptbins, centralitybins, ptBHad, flagBHad}; - std::vector axesFdMl = {massbins, ptbins, centralitybins, mlscore0bins, mlscore1bins, mlscore2bins, ptBHad, flagBHad}; + std::vector axesFdWithNpv = {massbins, ptbins, centralitybins, npvcontributorsbins, ptBHad, flagBHad}; + std::vector axesFdWithNpvMl = {massbins, ptbins, centralitybins, mlscore0bins, mlscore1bins, mlscore2bins, npvcontributorsbins, ptBHad, flagBHad}; std::vector axesWithNpv = {massbins, ptbins, centralitybins, npvcontributorsbins}; std::vector axesWithNpvMl = {massbins, ptbins, centralitybins, mlscore0bins, mlscore1bins, mlscore2bins, npvcontributorsbins}; std::vector axesGenPrompt = {ptbins, ybins, npvcontributorsbins, centralitybins}; @@ -188,8 +188,8 @@ struct HfTaskDs { if (storeOccupancy) { axes.insert(axes.end(), {occupancybins}); axesMl.insert(axesMl.end(), {occupancybins}); - axesFd.insert(axesFd.end(), {occupancybins}); - axesFdMl.insert(axesFdMl.end(), {occupancybins}); + axesFdWithNpv.insert(axesFdWithNpv.end(), {occupancybins}); + axesFdWithNpvMl.insert(axesFdWithNpvMl.end(), {occupancybins}); axesWithNpv.insert(axesWithNpv.end(), {occupancybins}); axesWithNpvMl.insert(axesWithNpvMl.end(), {occupancybins}); axesGenPrompt.insert(axesGenPrompt.end(), {occupancybins}); @@ -200,8 +200,8 @@ struct HfTaskDs { if (doprocessDataWithCentFT0C || doprocessDataWithCentFT0M || doprocessDataWithCentNTracksPV || doprocessData || doprocessMcWithCentFT0C || doprocessMcWithCentFT0M || doprocessMcWithCentNTracksPV || doprocessMc) { if (i == DataType::Data) { // If data do not fill PV contributors in sparse histosPtr[i]["hSparseMass"] = registry.add((folders[i] + "hSparseMass").c_str(), "THn for Ds", HistType::kTHnSparseF, axes); - } else if (i == DataType::McDsNonPrompt) { // If data do not fill PV contributors in sparse - histosPtr[i]["hSparseMass"] = registry.add((folders[i] + "hSparseMass").c_str(), "THn for Ds", HistType::kTHnSparseF, axesFd); + } else if (i == DataType::McDsNonPrompt || i == DataType::McDplusNonPrompt) { + histosPtr[i]["hSparseMass"] = registry.add((folders[i] + "hSparseMass").c_str(), "THn for Ds", HistType::kTHnSparseF, axesFdWithNpv); } else { histosPtr[i]["hSparseMass"] = registry.add((folders[i] + "hSparseMass").c_str(), "THn for Ds", HistType::kTHnSparseF, axesWithNpv); } @@ -212,8 +212,8 @@ struct HfTaskDs { if (i == DataType::Data) { // If data do not fill PV contributors in sparse histosPtr[i]["hSparseMass"] = registry.add((folders[i] + "hSparseMass").c_str(), "THn for Ds", HistType::kTHnSparseF, axesMl); - } else if (i == DataType::McDsNonPrompt) { // If data do not fill PV contributors in sparse - histosPtr[i]["hSparseMass"] = registry.add((folders[i] + "hSparseMass").c_str(), "THn for Ds", HistType::kTHnSparseF, axesFdMl); + } else if (i == DataType::McDsNonPrompt || i == DataType::McDplusNonPrompt) { + histosPtr[i]["hSparseMass"] = registry.add((folders[i] + "hSparseMass").c_str(), "THn for Ds", HistType::kTHnSparseF, axesFdWithNpvMl); } else { histosPtr[i]["hSparseMass"] = registry.add((folders[i] + "hSparseMass").c_str(), "THn for Ds", HistType::kTHnSparseF, axesWithNpvMl); } @@ -453,12 +453,12 @@ struct HfTaskDs { } } if constexpr (isMc) { - if (dataType == DataType::McDsNonPrompt) { // If data do not fill PV contributors in sparse + if (dataType == DataType::McDsNonPrompt || dataType == DataType::McDplusNonPrompt) { if (storeOccupancy) { - std::get(histosPtr[dataType]["hSparseMass"])->Fill(mass, pt, evaluateCentralityCand(candidate), outputMl[0], outputMl[1], outputMl[2], candidate.ptBhadMotherPart(), getBHadMotherFlag(candidate.pdgBhadMotherPart()), o2::hf_occupancy::getOccupancyColl(candidate.template collision_as(), occEstimator)); + std::get(histosPtr[dataType]["hSparseMass"])->Fill(mass, pt, evaluateCentralityCand(candidate), outputMl[0], outputMl[1], outputMl[2], candidate.template collision_as().numContrib(), candidate.ptBhadMotherPart(), getBHadMotherFlag(candidate.pdgBhadMotherPart()), o2::hf_occupancy::getOccupancyColl(candidate.template collision_as(), occEstimator)); return; } else { - std::get(histosPtr[dataType]["hSparseMass"])->Fill(mass, pt, evaluateCentralityCand(candidate), outputMl[0], outputMl[1], outputMl[2], candidate.ptBhadMotherPart(), getBHadMotherFlag(candidate.pdgBhadMotherPart())); + std::get(histosPtr[dataType]["hSparseMass"])->Fill(mass, pt, evaluateCentralityCand(candidate), outputMl[0], outputMl[1], outputMl[2], candidate.template collision_as().numContrib(), candidate.ptBhadMotherPart(), getBHadMotherFlag(candidate.pdgBhadMotherPart())); return; } } else { @@ -493,12 +493,12 @@ struct HfTaskDs { } } if constexpr (isMc) { - if (dataType == DataType::McDsNonPrompt) { // If data do not fill PV contributors in sparse + if (dataType == DataType::McDsNonPrompt || dataType == DataType::McDplusNonPrompt) { if (storeOccupancy) { - std::get(histosPtr[dataType]["hSparseMass"])->Fill(mass, pt, evaluateCentralityCand(candidate), candidate.ptBhadMotherPart(), getBHadMotherFlag(candidate.pdgBhadMotherPart()), o2::hf_occupancy::getOccupancyColl(candidate.template collision_as(), occEstimator)); + std::get(histosPtr[dataType]["hSparseMass"])->Fill(mass, pt, evaluateCentralityCand(candidate), candidate.template collision_as().numContrib(), candidate.ptBhadMotherPart(), getBHadMotherFlag(candidate.pdgBhadMotherPart()), o2::hf_occupancy::getOccupancyColl(candidate.template collision_as(), occEstimator)); return; } else { - std::get(histosPtr[dataType]["hSparseMass"])->Fill(mass, pt, evaluateCentralityCand(candidate), candidate.ptBhadMotherPart(), getBHadMotherFlag(candidate.pdgBhadMotherPart())); + std::get(histosPtr[dataType]["hSparseMass"])->Fill(mass, pt, evaluateCentralityCand(candidate), candidate.template collision_as().numContrib(), candidate.ptBhadMotherPart(), getBHadMotherFlag(candidate.pdgBhadMotherPart())); return; } } else { From 376a2b0cf36f77dc8401e1d7a2664d6f4dd88d68 Mon Sep 17 00:00:00 2001 From: Stefano Cannito <143754257+scannito@users.noreply.github.com> Date: Fri, 14 Feb 2025 22:56:33 +0100 Subject: [PATCH 0230/1650] [PWGLF] Complete phi purity study and use ConfigurableGroup (#9971) --- .../Tasks/Strangeness/phik0shortanalysis.cxx | 193 +++++++++--------- 1 file changed, 97 insertions(+), 96 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx index c1e19675ca2..efe2ce5652e 100644 --- a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx @@ -77,6 +77,32 @@ struct Phik0shortanalysis { // Configurable on multiplicity bins Configurable> binsMult{"binsMult", {0.0, 1.0, 5.0, 10.0, 15.0, 20.0, 30.0, 40.0, 50.0, 70.0, 100.0}, "Multiplicity bin limits"}; + // Configurables for track selection (not necessarily common for trigger and the two associated particles) + struct : ConfigurableGroup { + Configurable cfgCutCharge{"cfgCutCharge", 0.0, "Cut on charge"}; + Configurable cfgPrimaryTrack{"cfgPrimaryTrack", false, "Primary track selection"}; + Configurable cfgGlobalWoDCATrack{"cfgGlobalWoDCATrack", true, "Global track selection without DCA"}; + Configurable cfgPVContributor{"cfgPVContributor", true, "PV contributor track selection"}; + Configurable cMinKaonPtcut{"cMinKaonPtcut", 0.15f, "Track minimum pt cut"}; + Configurable cMaxDCAzToPVcut{"cMaxDCAzToPVcut", 2.0f, "Track DCAz cut to PV Maximum"}; + Configurable cMaxDCArToPV1{"cMaxDCArToPV1", 0.004f, "Track DCAr cut to PV config 1"}; + Configurable cMaxDCArToPV2{"cMaxDCArToPV2", 0.013f, "Track DCAr cut to PV config 2"}; + Configurable cMaxDCArToPV3{"cMaxDCArToPV3", 1.0f, "Track DCAr cut to PV config 3"}; + Configurable etaMax{"etaMax", 0.8f, "eta max"}; + + Configurable isNoTOF{"isNoTOF", false, "isNoTOF"}; + Configurable nSigmaCutTPCKa{"nSigmaCutTPCKa", 3.0, "Value of the TPC Nsigma cut for Kaons"}; + Configurable nSigmaCutCombinedKa{"nSigmaCutCombinedKa", 3.0, "Value of the TOF Nsigma cut for Kaons"}; + + Configurable nSigmaCutTPCPion{"nSigmaCutTPCPion", 4.0, "Value of the TPC Nsigma cut for Pions"}; + Configurable cMinPionPtcut{"cMinPionPtcut", 0.3f, "Track minimum pt cut"}; + Configurable minTPCnClsFound{"minTPCnClsFound", 70, "min number of found TPC clusters"}; + Configurable minNCrossedRowsTPC{"minNCrossedRowsTPC", 80, "min number of TPC crossed rows"}; + Configurable maxChi2TPC{"maxChi2TPC", 4.0f, "max chi2 per cluster TPC"}; + Configurable minITSnCls{"minITSnCls", 4, "min number of ITS clusters"}; + Configurable maxChi2ITS{"maxChi2ITS", 36.0f, "max chi2 per cluster ITS"}; + } trackConfigs; + // Configurables on phi pT bins Configurable> binspTPhi{"binspTPhi", {0.4, 0.8, 1.4, 2.0, 2.8, 4.0, 6.0, 10.0}, "pT bin limits for Phi"}; @@ -85,40 +111,21 @@ struct Phik0shortanalysis { Configurable lowMPhi{"lowMPhi", 1.0095, "Upper limits on Phi mass for signal extraction"}; Configurable upMPhi{"upMPhi", 1.029, "Upper limits on Phi mass for signal extraction"}; - // Configurables for Phi selection - Configurable cfgCutCharge{"cfgCutCharge", 0.0, "Cut on charge"}; - Configurable cfgPrimaryTrack{"cfgPrimaryTrack", false, "Primary track selection"}; - Configurable cfgGlobalWoDCATrack{"cfgGlobalWoDCATrack", true, "Global track selection without DCA"}; - Configurable cfgPVContributor{"cfgPVContributor", true, "PV contributor track selection"}; - Configurable cMinKaonPtcut{"cMinKaonPtcut", 0.15f, "Track minimum pt cut"}; - Configurable cMaxDCAzToPVcut{"cMaxDCAzToPVcut", 2.0f, "Track DCAz cut to PV Maximum"}; - Configurable cMaxDCArToPV1{"cMaxDCArToPV1", 0.004f, "Track DCAr cut to PV config 1"}; - Configurable cMaxDCArToPV2{"cMaxDCArToPV2", 0.013f, "Track DCAr cut to PV config 2"}; - Configurable cMaxDCArToPV3{"cMaxDCArToPV3", 1.0f, "Track DCAr cut to PV config 3"}; - - Configurable isNoTOF{"isNoTOF", false, "isNoTOF"}; - Configurable nSigmaCutTPCKa{"nSigmaCutTPCKa", 3.0, "Value of the TPC Nsigma cut for Kaons"}; - Configurable nSigmaCutCombinedKa{"nSigmaCutCombinedKa", 3.0, "Value of the TOF Nsigma cut for Kaons"}; - // Configurables for V0 selection - Configurable minTPCnClsFound{"minTPCnClsFound", 70, "min number of found TPC clusters"}; - Configurable minNCrossedRowsTPC{"minNCrossedRowsTPC", 80, "min number of TPC crossed rows"}; - Configurable maxChi2TPC{"maxChi2TPC", 4.0f, "max chi2 per cluster TPC"}; - Configurable etaMax{"etaMax", 0.8f, "eta max"}; + struct : ConfigurableGroup { + Configurable v0SettingCosPA{"v0SettingCosPA", 0.98, "V0 CosPA"}; + Configurable v0SettingRadius{"v0SettingRadius", 0.5, "v0radius"}; + Configurable v0SettingDCAV0Dau{"v0SettingDCAV0Dau", 1, "DCA V0 Daughters"}; + Configurable v0SettingDCAPosToPV{"v0SettingDCAPosToPV", 0.06, "DCA Pos To PV"}; + Configurable v0SettingDCANegToPV{"v0SettingDCANegToPV", 0.06, "DCA Neg To PV"}; - Configurable v0SettingCosPA{"v0SettingCosPA", 0.98, "V0 CosPA"}; - Configurable v0SettingRadius{"v0SettingRadius", 0.5, "v0radius"}; - Configurable v0SettingDCAV0Dau{"v0SettingDCAV0Dau", 1, "DCA V0 Daughters"}; - Configurable v0SettingDCAPosToPV{"v0SettingDCAPosToPV", 0.06, "DCA Pos To PV"}; - Configurable v0SettingDCANegToPV{"v0SettingDCANegToPV", 0.06, "DCA Neg To PV"}; + Configurable cfgisV0ForData{"cfgisV0ForData", true, "isV0ForData"}; - Configurable cfgisV0ForData{"cfgisV0ForData", true, "isV0ForData"}; - Configurable nSigmaCutTPCPion{"nSigmaCutTPCPion", 4.0, "Value of the TPC Nsigma cut for Pions"}; - - Configurable cfgFurtherV0Selection{"cfgFurtherV0Selection", false, "Further V0 selection"}; - Configurable ctauK0s{"ctauK0s", 20.0f, "C tau K0s(cm)"}; - Configurable paramArmenterosCut{"paramArmenterosCut", 0.2, "parameter Armenteros Cut"}; - Configurable v0rejK0s{"v0rejK0s", 0.005, "V0 rej K0s"}; + Configurable cfgFurtherV0Selection{"cfgFurtherV0Selection", false, "Further V0 selection"}; + Configurable ctauK0s{"ctauK0s", 20.0f, "C tau K0s(cm)"}; + Configurable paramArmenterosCut{"paramArmenterosCut", 0.2, "parameter Armenteros Cut"}; + Configurable v0rejK0s{"v0rejK0s", 0.005, "V0 rej K0s"}; + } v0Configs; // Configurables on K0S mass Configurable lowMK0S{"lowMK0S", 0.48, "Lower limit on K0Short mass"}; @@ -127,12 +134,6 @@ struct Phik0shortanalysis { // Configurable on K0S pT bins Configurable> binspTK0S{"binspTK0S", {0.1, 0.8, 1.2, 1.6, 2.0, 2.5, 3.0, 4.0, 6.0}, "pT bin limits for K0S"}; - // Configurables for pions selection(extra with respect to a few of those defined for V0) - Configurable minITSnCls{"minITSnCls", 4, "min number of ITS clusters"}; - Configurable maxChi2ITS{"maxChi2ITS", 36.0f, "max chi2 per cluster ITS"}; - Configurable dcaxyMax{"dcaxyMax", 0.1f, "Maximum DCAxy to primary vertex"}; - Configurable dcazMax{"dcazMax", 0.1f, "Maximum DCAz to primary vertex"}; - // Configurable on pion pT bins Configurable> binspTPi{"binspTPi", {0.3, 0.4, 0.5, 0.6, 0.8, 1.0, 1.2, 1.5, 2.0, 3.0}, "pT bin limits for pions"}; @@ -163,7 +164,7 @@ struct Phik0shortanalysis { Filter posZFilter = (nabs(o2::aod::collision::posZ) < cutZVertex); // Defining filters on V0s (cannot filter on dynamic columns) - Filter preFilterV0 = (nabs(aod::v0data::dcapostopv) > v0SettingDCAPosToPV && nabs(aod::v0data::dcanegtopv) > v0SettingDCANegToPV && aod::v0data::dcaV0daughters < v0SettingDCAV0Dau); + Filter preFilterV0 = (nabs(aod::v0data::dcapostopv) > v0Configs.v0SettingDCAPosToPV && nabs(aod::v0data::dcanegtopv) > v0Configs.v0SettingDCANegToPV && aod::v0data::dcaV0daughters < v0Configs.v0SettingDCAV0Dau); // Defining the type of the collisions for data and MC using SelCollisions = soa::Join; @@ -186,11 +187,11 @@ struct Phik0shortanalysis { SliceCache cache; - Partition posTracks = aod::track::signed1Pt > cfgCutCharge; - Partition negTracks = aod::track::signed1Pt < cfgCutCharge; + Partition posTracks = aod::track::signed1Pt > trackConfigs.cfgCutCharge; + Partition negTracks = aod::track::signed1Pt < trackConfigs.cfgCutCharge; - Partition posMCTracks = aod::track::signed1Pt > cfgCutCharge; - Partition negMCTracks = aod::track::signed1Pt < cfgCutCharge; + Partition posMCTracks = aod::track::signed1Pt > trackConfigs.cfgCutCharge; + Partition negMCTracks = aod::track::signed1Pt < trackConfigs.cfgCutCharge; // Necessary to flag INEL>0 events in GenMC Service pdgDB; @@ -483,14 +484,14 @@ struct Phik0shortanalysis { { if (!track.hasTPC()) return false; - if (track.tpcNClsFound() < minTPCnClsFound) + if (track.tpcNClsFound() < trackConfigs.minTPCnClsFound) return false; - if (track.tpcNClsCrossedRows() < minNCrossedRowsTPC) + if (track.tpcNClsCrossedRows() < trackConfigs.minNCrossedRowsTPC) return false; - if (track.tpcChi2NCl() > maxChi2TPC) + if (track.tpcChi2NCl() > trackConfigs.maxChi2TPC) return false; - if (std::abs(track.eta()) > etaMax) + if (std::abs(track.eta()) > trackConfigs.etaMax) return false; return true; } @@ -502,15 +503,15 @@ struct Phik0shortanalysis { if (!selectionTrackStrangeness(daughter1) || !selectionTrackStrangeness(daughter2)) return false; - if (v0.v0cosPA() < v0SettingCosPA) + if (v0.v0cosPA() < v0Configs.v0SettingCosPA) return false; - if (v0.v0radius() < v0SettingRadius) + if (v0.v0radius() < v0Configs.v0SettingRadius) return false; - if (cfgisV0ForData) { - if (std::abs(daughter1.tpcNSigmaPi()) > nSigmaCutTPCPion) + if (v0Configs.cfgisV0ForData) { + if (std::abs(daughter1.tpcNSigmaPi()) > trackConfigs.nSigmaCutTPCPion) return false; - if (std::abs(daughter2.tpcNSigmaPi()) > nSigmaCutTPCPion) + if (std::abs(daughter2.tpcNSigmaPi()) > trackConfigs.nSigmaCutTPCPion) return false; } return true; @@ -520,11 +521,11 @@ struct Phik0shortanalysis { template bool furtherSelectionV0(const T1& v0, const T2& collision) { - if (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * massK0S > ctauK0s) + if (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * massK0S > v0Configs.ctauK0s) return false; - if (v0.qtarm() < (paramArmenterosCut * std::abs(v0.alpha()))) + if (v0.qtarm() < (v0Configs.paramArmenterosCut * std::abs(v0.alpha()))) return false; - if (std::abs(v0.mLambda() - massLambda) < v0rejK0s) + if (std::abs(v0.mLambda() - massLambda) < v0Configs.v0rejK0s) return false; return true; } @@ -533,19 +534,19 @@ struct Phik0shortanalysis { template bool selectionTrackResonance(const T& track, bool isQA) { - if (cfgPrimaryTrack && !track.isPrimaryTrack()) + if (trackConfigs.cfgPrimaryTrack && !track.isPrimaryTrack()) return false; - if (cfgGlobalWoDCATrack && !track.isGlobalTrackWoDCA()) + if (trackConfigs.cfgGlobalWoDCATrack && !track.isGlobalTrackWoDCA()) return false; - if (cfgPVContributor && !track.isPVContributor()) + if (trackConfigs.cfgPVContributor && !track.isPVContributor()) return false; - if (track.tpcNClsFound() < minTPCnClsFound) + if (track.tpcNClsFound() < trackConfigs.minTPCnClsFound) return false; - if (track.pt() < cMinKaonPtcut) + if (track.pt() < trackConfigs.cMinKaonPtcut) return false; - if (std::abs(track.eta()) > etaMax) + if (std::abs(track.eta()) > trackConfigs.etaMax) return false; if (isQA) { @@ -557,7 +558,7 @@ struct Phik0shortanalysis { mcPhiHist.fill(HIST("h2DauTracksPhiDCAzPreCutMCReco"), track.pt(), track.dcaZ()); } } - if (std::abs(track.dcaXY()) > cMaxDCArToPV1 + (cMaxDCArToPV2 / std::pow(track.pt(), cMaxDCArToPV3))) + if (std::abs(track.dcaXY()) > trackConfigs.cMaxDCArToPV1 + (trackConfigs.cMaxDCArToPV2 / std::pow(track.pt(), trackConfigs.cMaxDCArToPV3))) return false; if (isQA) { if constexpr (!isMC) { @@ -568,7 +569,7 @@ struct Phik0shortanalysis { mcPhiHist.fill(HIST("h2DauTracksPhiDCAzPostCutMCReco"), track.pt(), track.dcaZ()); } } - if (std::abs(track.dcaZ()) > cMaxDCAzToPVcut) + if (std::abs(track.dcaZ()) > trackConfigs.cMaxDCAzToPVcut) return false; return true; } @@ -577,11 +578,11 @@ struct Phik0shortanalysis { template bool selectionPIDKaon(const T& track) { - if (!isNoTOF && track.hasTOF() && (track.tofNSigmaKa() * track.tofNSigmaKa() + track.tpcNSigmaKa() * track.tpcNSigmaKa()) < (nSigmaCutCombinedKa * nSigmaCutCombinedKa)) + if (!trackConfigs.isNoTOF && track.hasTOF() && (std::pow(track.tofNSigmaKa(), 2) + std::pow(track.tpcNSigmaKa(), 2)) < std::pow(trackConfigs.nSigmaCutCombinedKa, 2)) return true; - if (!isNoTOF && !track.hasTOF() && std::abs(track.tpcNSigmaKa()) < nSigmaCutTPCKa) + if (!trackConfigs.isNoTOF && !track.hasTOF() && std::abs(track.tpcNSigmaKa()) < trackConfigs.nSigmaCutTPCKa) return true; - if (isNoTOF && std::abs(track.tpcNSigmaKa()) < nSigmaCutTPCKa) + if (trackConfigs.isNoTOF && std::abs(track.tpcNSigmaKa()) < trackConfigs.nSigmaCutTPCKa) return true; return false; } @@ -589,9 +590,9 @@ struct Phik0shortanalysis { template bool selectionPIDKaonpTdependent(const T& track) { - if (track.pt() < 0.5 && std::abs(track.tpcNSigmaKa()) < nSigmaCutTPCKa) + if (track.pt() < 0.5 && std::abs(track.tpcNSigmaKa()) < trackConfigs.nSigmaCutTPCKa) return true; - if (track.pt() >= 0.5 && track.hasTOF() && ((track.tofNSigmaKa() * track.tofNSigmaKa()) + (track.tpcNSigmaKa() * track.tpcNSigmaKa())) < (nSigmaCutCombinedKa * nSigmaCutCombinedKa)) + if (track.pt() >= 0.5 && track.hasTOF() && (std::pow(track.tofNSigmaKa(), 2) + std::pow(track.tpcNSigmaKa(), 2)) < std::pow(trackConfigs.nSigmaCutCombinedKa, 2)) return true; return false; } @@ -615,23 +616,23 @@ struct Phik0shortanalysis { { if (!track.hasITS()) return false; - if (track.itsNCls() < minITSnCls) + if (track.itsNCls() < trackConfigs.minITSnCls) return false; - if (track.itsChi2NCl() > maxChi2ITS) + if (track.itsChi2NCl() > trackConfigs.maxChi2ITS) return false; if (!track.hasTPC()) return false; - if (track.tpcNClsFound() < minTPCnClsFound) + if (track.tpcNClsFound() < trackConfigs.minTPCnClsFound) return false; - if (track.tpcNClsCrossedRows() < minNCrossedRowsTPC) + if (track.tpcNClsCrossedRows() < trackConfigs.minNCrossedRowsTPC) return false; - if (track.tpcChi2NCl() > maxChi2TPC) + if (track.tpcChi2NCl() > trackConfigs.maxChi2TPC) return false; - if (track.pt() < 0.3) + if (track.pt() < trackConfigs.cMinPionPtcut) return false; - if (std::abs(track.eta()) > etaMax) + if (std::abs(track.eta()) > trackConfigs.etaMax) return false; if constexpr (isTOFChecked) { @@ -648,7 +649,7 @@ struct Phik0shortanalysis { mcPionHist.fill(HIST("h2TracksPiDCAzPreCutMCReco"), track.pt(), track.dcaZ()); } } - if (std::abs(track.dcaXY()) > cMaxDCArToPV1 + (cMaxDCArToPV2 / std::pow(track.pt(), cMaxDCArToPV3))) + if (std::abs(track.dcaXY()) > trackConfigs.cMaxDCArToPV1 + (trackConfigs.cMaxDCArToPV2 / std::pow(track.pt(), trackConfigs.cMaxDCArToPV3))) return false; if (isQA) { if constexpr (!isMC) { @@ -659,7 +660,7 @@ struct Phik0shortanalysis { mcPionHist.fill(HIST("h2TracksPiDCAzPostCutMCReco"), track.pt(), track.dcaZ()); } } - if (std::abs(track.dcaZ()) > cMaxDCAzToPVcut) + if (std::abs(track.dcaZ()) > trackConfigs.cMaxDCAzToPVcut) return false; return true; } @@ -762,7 +763,7 @@ struct Phik0shortanalysis { isCountedPhi = true; } - dataPhiHist.fill(HIST("h3PhipurInvMass"), multiplicity, recPhi.M()); + dataPhiHist.fill(HIST("h3PhipurInvMass"), multiplicity, recPhi.Pt(), recPhi.M()); std::array isCountedK0S{false, false, false}; @@ -774,7 +775,7 @@ struct Phik0shortanalysis { // Cut on V0 dynamic columns if (!selectionV0(v0, posDaughterTrack, negDaughterTrack)) continue; - if (cfgFurtherV0Selection && !furtherSelectionV0(v0, collision)) + if (v0Configs.cfgFurtherV0Selection && !furtherSelectionV0(v0, collision)) continue; if (!isFilledhV0) { @@ -791,19 +792,19 @@ struct Phik0shortanalysis { if (std::abs(v0.yK0Short()) > cfgYAcceptance) continue; if (!isCountedK0S.at(0)) { - dataPhiHist.fill(HIST("h3PhipurK0SInvMassInc"), multiplicity, v0.pt(), recPhi.M()); + dataPhiHist.fill(HIST("h3PhipurK0SInvMassInc"), multiplicity, recPhi.Pt(), recPhi.M()); isCountedK0S.at(0) = true; } if (std::abs(v0.yK0Short() - recPhi.Rapidity()) > cfgFCutOnDeltaY) continue; if (!isCountedK0S.at(1)) { - dataPhiHist.fill(HIST("h3PhipurK0SInvMassFCut"), multiplicity, v0.pt(), recPhi.M()); + dataPhiHist.fill(HIST("h3PhipurK0SInvMassFCut"), multiplicity, recPhi.Pt(), recPhi.M()); isCountedK0S.at(1) = true; } if (std::abs(v0.yK0Short() - recPhi.Rapidity()) > cfgSCutOnDeltaY) continue; if (!isCountedK0S.at(2)) { - dataPhiHist.fill(HIST("h3PhipurK0SInvMassSCut"), multiplicity, v0.pt(), recPhi.M()); + dataPhiHist.fill(HIST("h3PhipurK0SInvMassSCut"), multiplicity, recPhi.Pt(), recPhi.M()); isCountedK0S.at(2) = true; } } @@ -820,19 +821,19 @@ struct Phik0shortanalysis { if (std::abs(track.rapidity(massPi)) > cfgYAcceptance) continue; if (!isCountedPi.at(0)) { - dataPhiHist.fill(HIST("h3PhipurPiInvMassInc"), multiplicity, track.pt(), recPhi.M()); + dataPhiHist.fill(HIST("h3PhipurPiInvMassInc"), multiplicity, recPhi.Pt(), recPhi.M()); isCountedPi.at(0) = true; } if (std::abs(track.rapidity(massPi) - recPhi.Rapidity()) > cfgFCutOnDeltaY) continue; if (!isCountedPi.at(1)) { - dataPhiHist.fill(HIST("h3PhipurPiInvMassFCut"), multiplicity, track.pt(), recPhi.M()); + dataPhiHist.fill(HIST("h3PhipurPiInvMassFCut"), multiplicity, recPhi.Pt(), recPhi.M()); isCountedPi.at(1) = true; } if (std::abs(track.rapidity(massPi) - recPhi.Rapidity()) > cfgSCutOnDeltaY) continue; if (!isCountedPi.at(2)) { - dataPhiHist.fill(HIST("h3PhipurPiInvMassSCut"), multiplicity, track.pt(), recPhi.M()); + dataPhiHist.fill(HIST("h3PhipurPiInvMassSCut"), multiplicity, recPhi.Pt(), recPhi.M()); isCountedPi.at(2) = true; } } @@ -862,7 +863,7 @@ struct Phik0shortanalysis { // Cut on V0 dynamic columns if (!selectionV0(v0, posDaughterTrack, negDaughterTrack)) continue; - if (cfgFurtherV0Selection && !furtherSelectionV0(v0, collision)) + if (v0Configs.cfgFurtherV0Selection && !furtherSelectionV0(v0, collision)) continue; dataK0SHist.fill(HIST("h3K0SRapidityData"), multiplicity, v0.pt(), v0.yK0Short()); @@ -1088,7 +1089,7 @@ struct Phik0shortanalysis { // Cut on V0 dynamic columns if (!selectionV0(v0, posDaughterTrack, negDaughterTrack)) continue; - if (cfgFurtherV0Selection && !furtherSelectionV0(v0, collision)) + if (v0Configs.cfgFurtherV0Selection && !furtherSelectionV0(v0, collision)) continue; if (std::abs(v0.yK0Short()) > cfgYAcceptance) @@ -1182,7 +1183,7 @@ struct Phik0shortanalysis { if (!selectionV0(v0, posDaughterTrack, negDaughterTrack)) continue; - if (cfgFurtherV0Selection && !furtherSelectionV0(v0, collision)) + if (v0Configs.cfgFurtherV0Selection && !furtherSelectionV0(v0, collision)) continue; mcK0SHist.fill(HIST("h4K0SRapiditySmearing"), genmultiplicity, v0.pt(), v0.yK0Short(), v0mcparticle.y()); @@ -1368,7 +1369,7 @@ struct Phik0shortanalysis { isCountedPhi = true; } - closureMCPhiHist.fill(HIST("h3MCPhipurInvMass"), genmultiplicity, recPhi.M()); + closureMCPhiHist.fill(HIST("h3MCPhipurInvMass"), genmultiplicity, recPhi.Pt(), recPhi.M()); std::array isCountedK0S{false, false, false}; @@ -1387,26 +1388,26 @@ struct Phik0shortanalysis { if (!selectionV0(v0, posDaughterTrack, negDaughterTrack)) continue; - if (cfgFurtherV0Selection && !furtherSelectionV0(v0, collision)) + if (v0Configs.cfgFurtherV0Selection && !furtherSelectionV0(v0, collision)) continue; if (std::abs(v0.yK0Short()) > cfgYAcceptance) continue; if (!isCountedK0S.at(0)) { - closureMCPhiHist.fill(HIST("h3MCPhipurK0SInvMassInc"), genmultiplicity, v0.pt(), recPhi.M()); + closureMCPhiHist.fill(HIST("h3MCPhipurK0SInvMassInc"), genmultiplicity, recPhi.Pt(), recPhi.M()); isCountedK0S.at(0) = true; } if (std::abs(v0.yK0Short() - recPhi.Rapidity()) > cfgFCutOnDeltaY) continue; if (!isCountedK0S.at(1)) { - closureMCPhiHist.fill(HIST("h3MCPhipurK0SInvMassFCut"), genmultiplicity, v0.pt(), recPhi.M()); + closureMCPhiHist.fill(HIST("h3MCPhipurK0SInvMassFCut"), genmultiplicity, recPhi.Pt(), recPhi.M()); isCountedK0S.at(1) = true; } if (std::abs(v0.yK0Short() - recPhi.Rapidity()) > cfgSCutOnDeltaY) continue; if (!isCountedK0S.at(2)) { - closureMCPhiHist.fill(HIST("h3MCPhipurK0SInvMassSCut"), genmultiplicity, v0.pt(), recPhi.M()); + closureMCPhiHist.fill(HIST("h3MCPhipurK0SInvMassSCut"), genmultiplicity, recPhi.Pt(), recPhi.M()); isCountedK0S.at(2) = true; } } @@ -1430,19 +1431,19 @@ struct Phik0shortanalysis { continue; if (!isCountedPi.at(0)) { - closureMCPhiHist.fill(HIST("h3MCPhipurPiInvMassInc"), genmultiplicity, track.pt(), recPhi.M()); + closureMCPhiHist.fill(HIST("h3MCPhipurPiInvMassInc"), genmultiplicity, recPhi.Pt(), recPhi.M()); isCountedPi.at(0) = true; } if (std::abs(track.rapidity(massPi) - recPhi.Rapidity()) > cfgFCutOnDeltaY) continue; if (!isCountedPi.at(1)) { - closureMCPhiHist.fill(HIST("h3MCPhipurPiInvMassFCut"), genmultiplicity, track.pt(), recPhi.M()); + closureMCPhiHist.fill(HIST("h3MCPhipurPiInvMassFCut"), genmultiplicity, recPhi.Pt(), recPhi.M()); isCountedPi.at(1) = true; } if (std::abs(track.rapidity(massPi) - recPhi.Rapidity()) > cfgSCutOnDeltaY) continue; if (!isCountedPi.at(2)) { - closureMCPhiHist.fill(HIST("h3MCPhipurPiInvMassSCut"), genmultiplicity, track.pt(), recPhi.M()); + closureMCPhiHist.fill(HIST("h3MCPhipurPiInvMassSCut"), genmultiplicity, recPhi.Pt(), recPhi.M()); isCountedPi.at(2) = true; } } @@ -1482,7 +1483,7 @@ struct Phik0shortanalysis { if (!selectionV0(v0, posDaughterTrack, negDaughterTrack)) continue; - if (cfgFurtherV0Selection && !furtherSelectionV0(v0, collision)) + if (v0Configs.cfgFurtherV0Selection && !furtherSelectionV0(v0, collision)) continue; if (std::abs(v0.yK0Short()) > cfgYAcceptance) From 7c8d9d83fa0dbbc59efd9c2bfe3be3a8a3fb2d14 Mon Sep 17 00:00:00 2001 From: Ravindra Singh <56298081+1994ra@users.noreply.github.com> Date: Fri, 14 Feb 2025 23:02:45 +0100 Subject: [PATCH 0231/1650] [PWGHF] added tracks efficiency calculation block (#9877) Co-authored-by: ALICE Action Bot --- .../HFC/TableProducer/correlatorLcHadrons.cxx | 53 +++++++++++++------ 1 file changed, 36 insertions(+), 17 deletions(-) diff --git a/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx b/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx index 1af43022dce..6b03099d3fa 100644 --- a/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx @@ -226,6 +226,8 @@ struct HfCorrelatorLcHadrons { Filter lcFilter = ((o2::aod::hf_track_index::hfflag & static_cast(1 << aod::hf_cand_3prong::DecayType::LcToPKPi)) != static_cast(0)) && (aod::hf_sel_candidate_lc::isSelLcToPKPi >= selectionFlagLc || aod::hf_sel_candidate_lc::isSelLcToPiKP >= selectionFlagLc); Filter trackFilter = (nabs(aod::track::eta) < etaTrackMax) && (nabs(aod::track::pt) > ptTrackMin) && (nabs(aod::track::dcaXY) < dcaXYTrackMax) && (nabs(aod::track::dcaZ) < dcaZTrackMax); + // Preslice perTrueCollision = o2::aod::mcparticle::McCollisionId; + Preslice perTrueCollision = o2::aod::mcparticle::mcCollisionId; // configurable axis definition ConfigurableAxis binsMultiplicity{"binsMultiplicity", {VARIABLE_WIDTH, 0.0f, 2000.0f, 6000.0f, 100000.0f}, "Mixing bins - multiplicity"}; ConfigurableAxis binsZVtx{"binsZVtx", {VARIABLE_WIDTH, -10.0f, -2.5f, 2.5f, 10.0f}, "Mixing bins - z-vertex"}; @@ -247,6 +249,7 @@ struct HfCorrelatorLcHadrons { AxisSpec axisPhi = {binsPhi, "#it{#varphi}"}; AxisSpec axisPtLc = {(std::vector)binsPtLc, "#it{p}_{T} (GeV/#it{c})"}; AxisSpec axisPtHadron = {(std::vector)binsPtHadron, "#it{p}_{T} Hadron (GeV/#it{c})"}; + AxisSpec axisPtTrack = {500, 0, 50, "#it{p}_{T} Hadron (GeV/#it{c})"}; AxisSpec axisMultiplicity = {binsMultiplicity, "Multiplicity"}; AxisSpec axisMultFT0M = {binsMultFT0M, "MultiplicityFT0M"}; AxisSpec axisPosZ = {binsZVtx, "PosZ"}; @@ -298,9 +301,9 @@ struct HfCorrelatorLcHadrons { registry.add("hYMcRecBkg", "Lc,Hadron candidates - MC reco;candidate #it{#y};entries", {HistType::kTH1F, {axisRapidity}}); registry.add("hFakeTracksMcRec", "Fake tracks - MC Rec", {HistType::kTH1F, {axisPtHadron}}); registry.add("hPtParticleAssocVsCandMcRec", "Associated Particle - MC Rec", {HistType::kTH2F, {{axisPtHadron}, {axisPtLc}}}); - registry.add("hPtTracksVsSignRec", "Associated Particle - MC Rec", {HistType::kTH2F, {{axisPtHadron}, {axisSign}}}); - registry.add("hPtTracksVsSignRecTrue", "Associated Particle - MC Rec (True)", {HistType::kTH2F, {{axisPtHadron}, {axisSign}}}); - registry.add("hPtTracksVsSignGen", "Associated Particle - MC Gen", {HistType::kTH2F, {{axisPtHadron}, {axisSign}}}); + registry.add("hPtTracksVsSignRec", "Associated Particle - MC Rec", {HistType::kTH2F, {{axisPtTrack}, {axisSign}}}); + registry.add("hPtTracksVsSignRecTrue", "Associated Particle - MC Rec (True)", {HistType::kTH2F, {{axisPtTrack}, {axisSign}}}); + registry.add("hPtTracksVsSignGen", "Associated Particle - MC Gen", {HistType::kTH2F, {{axisPtTrack}, {axisSign}}}); registry.add("hPtPrimaryParticleAssocVsCandMcRec", "Associated Particle - MC Rec", {HistType::kTH2F, {{axisPtHadron}, {axisPtLc}}}); registry.add("hPtVsMultiplicityMcRecPrompt", "Multiplicity FT0M - MC Rec Prompt", {HistType::kTH2F, {{axisPtLc}, {axisMultFT0M}}}); registry.add("hPtVsMultiplicityMcRecNonPrompt", "Multiplicity FT0M - MC Rec Non Prompt", {HistType::kTH2F, {{axisPtLc}, {axisMultFT0M}}}); @@ -508,6 +511,7 @@ struct HfCorrelatorLcHadrons { efficiencyWeightLc = 1. / efficiencyLc->at(o2::analysis::findBin(binsPtEfficiencyLc, candidate.pt())); } auto trackPos1 = candidate.template prong0_as(); // positive daughter (negative for the antiparticles) + auto trackPos2 = candidate.template prong2_as(); int8_t chargeLc = trackPos1.sign(); // charge of 1st prong will be the charge of Lc candidate isLcSignal = TESTBIT(std::abs(candidate.flagMcMatchRec()), aod::hf_cand_3prong::DecayType::LcToPKPi); isLcPrompt = candidate.originMcRec() == RecoDecay::OriginType::Prompt; @@ -586,12 +590,18 @@ struct HfCorrelatorLcHadrons { } registry.fill(HIST("hLcBin"), poolBin); - if (calTrkEff && !isLcSignal && calEffLcEvent) - continue; - - if (calTrkEff && countLc == 1) { + if (calTrkEff && countLc == 1 && (isLcSignal || !calEffLcEvent)) { // genrated tracks - for (const auto& track : mcParticles) { + decltype(trackPos1.mcParticle_as()) mctrk{}; + if (trackPos1.has_mcParticle()) { // ambiguous tracks should be small + mctrk = trackPos1.template mcParticle_as(); + } else if (trackPos2.has_mcParticle()) { + mctrk = trackPos2.template mcParticle_as(); + } else { + continue; + } + auto gentracks = mcParticles.sliceBy(perTrueCollision, mctrk.mcCollisionId()); + for (const auto& track : gentracks) { if (std::abs(track.eta()) > etaTrackMax || track.pt() < ptTrackMin || track.pt() > ptTrackMax) { continue; } @@ -606,9 +616,14 @@ struct HfCorrelatorLcHadrons { continue; } - int8_t chargeTrack = pdg->GetParticle(track.pdgCode())->Charge(); // Retrieve charge - registry.fill(HIST("hPtTracksVsSignGen"), track.pt(), chargeTrack); + auto motherTrkGen = mcParticles.iteratorAt(track.mothersIds()[0]); + if (std::abs(motherTrkGen.pdgCode()) == kLambdaCPlus) + continue; + + auto chargeTrack = pdg->GetParticle(track.pdgCode())->Charge(); // Retrieve charge + registry.fill(HIST("hPtTracksVsSignGen"), track.pt(), chargeTrack / (2 * std::abs(chargeTrack))); } + //} } // Lc-Hadron correlation dedicated section @@ -625,14 +640,18 @@ struct HfCorrelatorLcHadrons { continue; } - if (calTrkEff && countLc == 1 && track.has_mcParticle()) { + if (calTrkEff && countLc == 1 && (isLcSignal || !calEffLcEvent) && track.has_mcParticle()) { auto mcParticle = track.template mcParticle_as(); if (!mcParticle.isPhysicalPrimary() && isRecTrkPhyPrimary) continue; - registry.fill(HIST("hPtTracksVsSignRec"), track.pt(), track.sign()); + auto motherTrk = mcParticles.iteratorAt(mcParticle.mothersIds()[0]); + if (std::abs(motherTrk.pdgCode()) == kLambdaCPlus) + continue; + + registry.fill(HIST("hPtTracksVsSignRec"), track.pt(), track.sign() / 2.); if (std::abs(mcParticle.pdgCode()) == kProton) - registry.fill(HIST("hPtTracksVsSignRecTrue"), track.pt(), track.sign()); + registry.fill(HIST("hPtTracksVsSignRecTrue"), track.pt(), track.sign() / 2.); } // Removing Lc daughters by checking track indices @@ -812,8 +831,8 @@ struct HfCorrelatorLcHadrons { registry.fill(HIST("hPtParticleAssocMcGen"), particleAssoc.pt()); entryLcHadronPair(getDeltaPhi(particleAssoc.phi(), particle.phi()), particleAssoc.eta() - particle.eta(), - particle.pt() * chargeLc, - particleAssoc.pt() * chargeAssoc, + particle.pt() * chargeLc / std::abs(chargeLc), + particleAssoc.pt() * chargeAssoc / std::abs(chargeAssoc), poolBin, correlationStatus); entryLcHadronRecoInfo(MassLambdaCPlus, true); @@ -1042,8 +1061,8 @@ struct HfCorrelatorLcHadrons { bool isLcPrompt = candidate.originMcGen() == RecoDecay::OriginType::Prompt; entryLcHadronPair(getDeltaPhi(particleAssoc.phi(), candidate.phi()), particleAssoc.eta() - candidate.eta(), - candidate.pt() * chargeLc, - particleAssoc.pt() * chargeAssoc, + candidate.pt() * chargeLc / std::abs(chargeLc), + particleAssoc.pt() * chargeAssoc / std::abs(chargeAssoc), poolBin, correlationStatus); entryLcHadronRecoInfo(MassLambdaCPlus, true); From e6cbcfaa4d98ed240586f7a1eb1e2036bac60b47 Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Sat, 15 Feb 2025 06:21:17 +0800 Subject: [PATCH 0232/1650] [PWGCF] debug, fix GFW dictionart problem (#9974) --- PWGCF/GenericFramework/Core/GFWWeights.cxx | 5 +++-- PWGCF/GenericFramework/Core/GFWWeights.h | 3 --- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/PWGCF/GenericFramework/Core/GFWWeights.cxx b/PWGCF/GenericFramework/Core/GFWWeights.cxx index 5893fb24459..2c6419c0c5c 100644 --- a/PWGCF/GenericFramework/Core/GFWWeights.cxx +++ b/PWGCF/GenericFramework/Core/GFWWeights.cxx @@ -10,6 +10,7 @@ // or submit itself to any jurisdiction. #include "GFWWeights.h" +#include "TMath.h" #include GFWWeights::GFWWeights() : TNamed("", ""), @@ -67,7 +68,7 @@ void GFWWeights::init(bool AddData, bool AddMC) fW_data->SetName("GFWWeights_Data"); fW_data->SetOwner(kTRUE); const char* tnd = getBinName(0, 0, Form("data_%s", this->GetName())); - fW_data->Add(new TH3D(tnd, ";#varphi;#eta;v_{z}", 60, 0, TwoPI, 64, -1.6, 1.6, 40, -10, 10)); + fW_data->Add(new TH3D(tnd, ";#varphi;#eta;v_{z}", 60, 0, TMath::TwoPi(), 64, -1.6, 1.6, 40, -10, 10)); fDataFilled = kTRUE; } if (AddMC) { @@ -108,7 +109,7 @@ void GFWWeights::fill(double phi, double eta, double vz, double pt, double /*cen TH3D* th3 = reinterpret_cast(tar->FindObject(getBinName(0, 0, pf))); // pT bin 0, V0M bin 0, since all integrated if (!th3) { if (!htype) - tar->Add(new TH3D(getBinName(0, 0, pf), ";#varphi;#eta;v_{z}", 60, 0, TwoPI, 64, -1.6, 1.6, 40, -10, 10)); // 0,0 since all integrated + tar->Add(new TH3D(getBinName(0, 0, pf), ";#varphi;#eta;v_{z}", 60, 0, TMath::TwoPi(), 64, -1.6, 1.6, 40, -10, 10)); // 0,0 since all integrated th3 = reinterpret_cast(tar->At(tar->GetEntries() - 1)); } th3->Fill(htype ? pt : phi, eta, vz, weight); diff --git a/PWGCF/GenericFramework/Core/GFWWeights.h b/PWGCF/GenericFramework/Core/GFWWeights.h index 8cb8bfc1bb8..913194d266c 100644 --- a/PWGCF/GenericFramework/Core/GFWWeights.h +++ b/PWGCF/GenericFramework/Core/GFWWeights.h @@ -17,7 +17,6 @@ #define PWGCF_GENERICFRAMEWORK_CORE_GFWWEIGHTS_H_ #include "Framework/Logger.h" -#include "Framework/AnalysisTask.h" #include "TObjArray.h" #include "TNamed.h" @@ -28,8 +27,6 @@ #include "TCollection.h" #include "TString.h" -using namespace o2::constants::math; - class GFWWeights : public TNamed { public: From 37db7facea3bb31439046fb7ebbdfacf52f0a6eb Mon Sep 17 00:00:00 2001 From: hernasab Date: Fri, 14 Feb 2025 18:19:40 -0600 Subject: [PATCH 0233/1650] [PWGCF] edited structure of filter (#9975) Co-authored-by: Sabrina Hernandez --- PWGCF/Flow/Tasks/flowZdcTask.cxx | 42 ++++++++++++++++---------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowZdcTask.cxx b/PWGCF/Flow/Tasks/flowZdcTask.cxx index a3497dac4c0..2af09504c4f 100644 --- a/PWGCF/Flow/Tasks/flowZdcTask.cxx +++ b/PWGCF/Flow/Tasks/flowZdcTask.cxx @@ -43,14 +43,6 @@ using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::aod::mult; using namespace o2::aod::evsel; -using ColEvSels = soa::Join; -using AodCollisions = soa::Filtered>; -using AodTracks = soa::Filtered>; -using BCsRun3 = soa::Join; -using AodZDCs = soa::Join; -using CollisionDataTable = soa::Join; -using TrackDataTable = soa::Join; -using FilTrackDataTable = soa::Filtered; #define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable NAME{#NAME, DEFAULT, HELP}; @@ -93,21 +85,21 @@ struct FlowZdcTask { Configurable npvTracksCut{"npvTracksCut", 1.0f, "Apply extra NPVtracks cut"}; Configurable isApplySameBunchPileup{"isApplySameBunchPileup", true, "Enable SameBunchPileup cut"}; Configurable isApplyGoodZvtxFT0vsPV{"isApplyGoodZvtxFT0vsPV", true, "Enable GoodZvtxFT0vsPV cut"}; - Configurable isApplyVertexITSTPC{"isApplyVertexITSTPC", true, "Enable VertexITSTPC cut"}; - Configurable isApplyVertexTOFmatched{"isApplyVertexTOFmatched", true, "Enable VertexTOFmatched cut"}; - Configurable isApplyVertexTRDmatched{"isApplyVertexTRDmatched", true, "Enable VertexTRDmatched cut"}; + Configurable isApplyVertexITSTPC{"isApplyVertexITSTPC", false, "Enable VertexITSTPC cut"}; + Configurable isApplyVertexTOFmatched{"isApplyVertexTOFmatched", false, "Enable VertexTOFmatched cut"}; + Configurable isApplyVertexTRDmatched{"isApplyVertexTRDmatched", false, "Enable VertexTRDmatched cut"}; Configurable isApplyExtraCorrCut{"isApplyExtraCorrCut", false, "Enable extra NPVtracks vs FTOC correlation cut"}; Configurable isApplyExtraPhiCut{"isApplyExtraPhiCut", false, "Enable extra phi cut"}; - Configurable isApplyNoCollInTimeRangeStandard{"isApplyNoCollInTimeRangeStandard", true, "Enable NoCollInTimeRangeStandard cut"}; - Configurable isApplyNoCollInRofStandard{"isApplyNoCollInRofStandard", true, "Enable NoCollInRofStandard cut"}; - Configurable isApplyNoHighMultCollInPrevRof{"isApplyNoHighMultCollInPrevRof", true, "Enable NoHighMultCollInPrevRof cut"}; - Configurable isApplyFT0CbasedOccupancy{"isApplyFT0CbasedOccupancy", true, "Enable FT0CbasedOccupancy cut"}; + Configurable isApplyNoCollInTimeRangeStandard{"isApplyNoCollInTimeRangeStandard", false, "Enable NoCollInTimeRangeStandard cut"}; + Configurable isApplyNoCollInRofStandard{"isApplyNoCollInRofStandard", false, "Enable NoCollInRofStandard cut"}; + Configurable isApplyNoHighMultCollInPrevRof{"isApplyNoHighMultCollInPrevRof", false, "Enable NoHighMultCollInPrevRof cut"}; + Configurable isApplyFT0CbasedOccupancy{"isApplyFT0CbasedOccupancy", false, "Enable FT0CbasedOccupancy cut"}; Configurable isApplyCentFT0C{"isApplyCentFT0C", false, "Centrality based on FT0C"}; Configurable isApplyCentFT0CVariant1{"isApplyCentFT0CVariant1", false, "Centrality based on FT0C variant1"}; Configurable isApplyCentFT0M{"isApplyCentFT0M", false, "Centrality based on FT0A + FT0C"}; Configurable isApplyCentNGlobal{"isApplyCentNGlobal", false, "Centrality based on global tracks"}; Configurable isApplyCentMFT{"isApplyCentMFT", false, "Centrality based on MFT tracks"}; - Configurable isGoodITSLayersAll{"isGoodITSLayersAll", true, "Centrality based on no other collisions in this Readout Frame with per-collision multiplicity above threshold tracks"}; + Configurable isGoodITSLayersAll{"isGoodITSLayersAll", false, "Centrality based on no other collisions in this Readout Frame with per-collision multiplicity above threshold tracks"}; Configurable ft0cCut{"ft0cCut", 1.0f, "Apply extra FT0C cut"}; ConfigurableAxis axisVertex{"axisVertex", {20, -10, 10}, "vertex axis for histograms"}; @@ -128,8 +120,15 @@ struct FlowZdcTask { Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls) && (nabs(aod::track::dcaZ) < cfgCutDCAz) && (nabs(aod::track::dcaXY) < cfgCutDCAxy); + using ColEvSels = soa::Join; + using AodCollisions = soa::Filtered>; + using AodTracks = soa::Filtered>; Partition tracksIUWithTPC = (aod::track::tpcNClsFindable > (uint8_t)0); - + using BCsRun3 = soa::Join; + using AodZDCs = soa::Join; + using CollisionDataTable = soa::Join; + using TrackDataTable = soa::Join; + using FilTrackDataTable = soa::Filtered; std::complex qTPC; // init q TPC std::complex qZNA{0, 0}; // init qZNA std::complex qZNC{0, 0}; // init qZNC @@ -216,6 +215,7 @@ struct FlowZdcTask { {AxisSpec{100, 0, 100, "Centrality [%]"}, AxisSpec{100, 0, 500, "ZP Energy"}}); histos.add("revsimag", "revsimag", kTH2F, {axisREQ, axisIMQ}); // for q vector recentering histos.add("hYield", "Nch vs pT", kTH2F, {axisMultiplicity, axisPt}); + histos.add("hGlobalTracks", "hGlobalTracks", kTH1F, {axisMultiplicity}); histos.add("eventSelectionSteps", "eventSelectionSteps", kTH1D, {axisEvent}); auto hstat = histos.get(HIST("eventSelectionSteps")); auto* xAxis = hstat->GetXaxis(); @@ -335,16 +335,15 @@ struct FlowZdcTask { const auto& tracksGrouped = tracksIUWithTPC->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); const int multTPC = tracksGrouped.size(); const auto cent = collision.centFT0C(); + int globalTracks = tracks.size(); + if (globalTracks < 1) + return; // this is the q vector for the TPC data. it is a complex function double qTpcReal = 0.0; // Initialize qTPC_real double qTpcIm = 0.0; // init qTPC_imaginary std::complex qTPC(0, 0); // Starting with a q-vector of zero int nTot{0}; // Tracks are already filtered with GlobalTrack || GlobalTrackSDD for (const auto& track : tracks) { - if (track.tpcNClsCrossedRows() < minTpcNcrossedRows) - continue; - if (std::fabs(track.dcaXY()) > cfgCutDCAxy) - continue; double phi = track.phi(); nTot++; histos.fill(HIST("etaHistogram"), track.eta()); @@ -371,6 +370,7 @@ struct FlowZdcTask { histos.fill(HIST("IMqHistogram"), qTpcIm); histos.fill(HIST("TPCmultiplicity"), multTPC); + histos.fill(HIST("hGlobalTracks"), globalTracks); histos.fill(HIST("revsimag"), qTpcReal, qTpcIm); } From 2d1db30e16242bcdec4f6dd2822528d998fd69e0 Mon Sep 17 00:00:00 2001 From: Marta Urioni <78807256+murioni@users.noreply.github.com> Date: Sat, 15 Feb 2025 02:33:25 +0100 Subject: [PATCH 0234/1650] [PWGLF] k892analysispbpb - MC studies, signal and event loss (#9969) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Resonances/CMakeLists.txt | 2 +- ...analysis_PbPb.cxx => k892analysispbpb.cxx} | 247 +++++++++++++----- 2 files changed, 176 insertions(+), 73 deletions(-) rename PWGLF/Tasks/Resonances/{k892analysis_PbPb.cxx => k892analysispbpb.cxx} (84%) diff --git a/PWGLF/Tasks/Resonances/CMakeLists.txt b/PWGLF/Tasks/Resonances/CMakeLists.txt index a16bc86aadd..cb94f52dfcd 100644 --- a/PWGLF/Tasks/Resonances/CMakeLists.txt +++ b/PWGLF/Tasks/Resonances/CMakeLists.txt @@ -25,7 +25,7 @@ o2physics_add_dpl_workflow(k892analysis COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(k892analysispbpb - SOURCES k892analysis_PbPb.cxx + SOURCES k892analysispbpb.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) diff --git a/PWGLF/Tasks/Resonances/k892analysis_PbPb.cxx b/PWGLF/Tasks/Resonances/k892analysispbpb.cxx similarity index 84% rename from PWGLF/Tasks/Resonances/k892analysis_PbPb.cxx rename to PWGLF/Tasks/Resonances/k892analysispbpb.cxx index 4efc780c7a9..303a6cd6fc9 100644 --- a/PWGLF/Tasks/Resonances/k892analysis_PbPb.cxx +++ b/PWGLF/Tasks/Resonances/k892analysispbpb.cxx @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. // -/// +/// \file k892analysispbpb.cxx /// \brief K*0 spectra in Pb-Pb /// \author Marta Urioni @@ -53,7 +53,7 @@ using namespace o2::soa; using namespace o2::constants::physics; using std::array; -struct k892analysis_PbPb { +struct K892analysispbpb { SliceCache cache; HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -69,6 +69,8 @@ struct k892analysis_PbPb { Configurable cPIDBins{"cPIDBins", 65, "PID binning"}; Configurable cPIDQALimit{"cPIDQALimit", 6.5, "PID QA limit"}; Configurable cDCABins{"cDCABins", 300, "DCA binning"}; + Configurable cPDGbins{"cPDGbins", 5000, "number of PDG bins"}; + Configurable cPDGMax{"cPDGMax", 9500000.0f, "PDG limit"}; // events Configurable cfgCutVertex{"cfgCutVertex", 10.0f, "Accepted z-vertex range"}; @@ -107,10 +109,9 @@ struct k892analysis_PbPb { Configurable cByPassTOF{"cByPassTOF", false, "By pass TOF PID selection"}; // By pass TOF PID selection Configurable cTofBetaCut{"cTofBetaCut", false, "selection on TOF beta"}; - Configurable tofAndTpcPID{"tofAndTpcPID", false, "apply both TOF and TPC PID"}; - - Configurable tpclowpt{"tpclowpt", true, "apply TPC at low pt"}; - Configurable tofhighpt{"tofhighpt", false, "apply TOF at high pt"}; + Configurable cTPClowpt{"cTPClowpt", true, "apply TPC at low pt"}; + Configurable cTOFonlyHighpt{"cTOFonlyHighpt", false, "apply TOF only at high pt"}; + Configurable cTOFandTPCHighpt{"cTOFandTPCHighpt", false, "apply TOF and TPC at high pt"}; // rotational bkg Configurable cfgNoRotations{"cfgNoRotations", 3, "Number of rotations per pair for rotbkg"}; @@ -119,8 +120,10 @@ struct k892analysis_PbPb { // event mixing Configurable cfgNoMixedEvents{"cfgNoMixedEvents", 5, "Number of mixed events per event"}; + ConfigurableAxis cfgVtxBins{"cfgVtxBins", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; ConfigurableAxis cfgMultBins{"cfgMultBins", {VARIABLE_WIDTH, 0.0f, 1.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f}, "Mixing bins - z-vertex"}; + ConfigurableAxis binsImpactPar{"binsImpactPar", {VARIABLE_WIDTH, 0.0, 3.00065, 4.28798, 6.14552, 7.6196, 8.90942, 10.0897, 11.2002, 12.2709, 13.3167, 14.4173, 23.2518}, "Binning of the impact parameter axis"}; // cuts on mother Configurable cfgCutsOnMother{"cfgCutsOnMother", false, "Enamble additional cuts on mother"}; @@ -153,6 +156,8 @@ struct k892analysis_PbPb { AxisSpec ptAxisDau = {binsPtQA, "Dau #it{p}_{T} (GeV/#it{c})"}; AxisSpec invMassAxis = {cInvMassBins, cInvMassStart, cInvMassEnd, "Invariant Mass (GeV/#it{c}^2)"}; AxisSpec pidQAAxis = {cPIDBins, -cPIDQALimit, cPIDQALimit}; + AxisSpec pdgCodeAxis = {cPDGbins, 0, cPDGMax}; + AxisSpec impactParAxis = {binsImpactPar, "Impact Parameter"}; if ((!doprocessMC && !doprocessMCRun2) || doprocessMixedEventMC || doprocessMixedEventMCRun2) { // event histograms @@ -291,10 +296,30 @@ struct k892analysis_PbPb { histos.add("h3k892GenInvmass", "Invariant mass of generated K(892)0", kTH3F, {centAxis, ptAxis, invMassAxis}); histos.add("h3k892GenInvmassAnti", "Invariant mass of generated Anti-K(892)0", kTH3F, {centAxis, ptAxis, invMassAxis}); + histos.add("h3Reck892invmassPtGen", "Invariant mass of Reconstructed MC K(892)0 with Pt Gen", kTH3F, {centAxis, ptAxis, invMassAxis}); + histos.add("h3Reck892invmassAntiPtGen", "Invariant mass of Reconstructed MC Anti-K(892)0 with Pt Gen", kTH3F, {centAxis, ptAxis, invMassAxis}); + histos.add("h3PtRecvsPtGenAnti", "reconstructed K* Pt vs generated K* pt", kTH3F, {centAxis, ptAxis, ptAxis}); + histos.add("h3PtRecvsPtGen", "reconstructed Anti-K* Pt vs generated Anti-K* pt", kTH3F, {centAxis, ptAxis, ptAxis}); + histos.add("h3k892invmassWrongDaughters_DS", "Invariant mass of K*0 with wrong daughters DS", kTH3F, {centAxis, ptAxis, invMassAxis}); histos.add("h3k892invmassWrongDaughters_DSAnti", "Invariant mass of K*0 with wrong daughters DS anti", kTH3F, {centAxis, ptAxis, invMassAxis}); histos.add("h3k892invmassRightDaughters_DS", "Invariant mass of K*0 with right daughters DS", kTH3F, {centAxis, ptAxis, invMassAxis}); histos.add("h3k892invmassRightDaughters_DSAnti", "Invariant mass of K*0 with right daughters DS anti", kTH3F, {centAxis, ptAxis, invMassAxis}); + + histos.add("h3k892invmassSameMother_DS", "Invariant mass same mother DS", kTH3F, {centAxis, ptAxis, invMassAxis}); + histos.add("h3k892invmassSameMother_DSAnti", "Invariant mass same mother DS anti", kTH3F, {centAxis, ptAxis, invMassAxis}); + histos.add("h3PdgCodeSameMother_DS", "PDG code same mother DS", kTH3F, {centAxis, ptAxis, pdgCodeAxis}); + histos.add("h3PdgCodeSameMother_DSAnti", "PDG code same mother DS anti", kTH3F, {centAxis, ptAxis, pdgCodeAxis}); + } + + if (doprocessEvtLossSigLossMC) { + histos.add("QAevent/hImpactParameterGen", "Impact parameter of generated MC events", kTH1F, {impactParAxis}); + histos.add("QAevent/hImpactParameterRec", "Impact parameter of selected MC events", kTH1F, {impactParAxis}); + histos.add("QAevent/hImpactParvsCentrRec", "Impact parameter of selected MC events vs centrality", kTH2F, {{120, 0.0f, 120.0f}, impactParAxis}); + histos.add("QAevent/k892genBeforeEvtSel", "K* before event selections", kTH2F, {ptAxis, impactParAxis}); + histos.add("QAevent/k892genBeforeEvtSelAnti", "K* before event selections", kTH2F, {ptAxis, impactParAxis}); + histos.add("QAevent/k892genAfterEvtSel", "K* after event selections", kTH2F, {ptAxis, impactParAxis}); + histos.add("QAevent/k892genAfterEvtSelAnti", "K* after event selections", kTH2F, {ptAxis, impactParAxis}); } // Print output histograms statistics @@ -374,8 +399,13 @@ struct k892analysis_PbPb { template bool selectionPIDKaon(const T& candidate) { + if (cTOFonlyHighpt) { + + if (candidate.hasTOF() && std::abs(candidate.tofNSigmaKa()) <= cMaxTOFnSigmaKaon) { // tof cut only + return true; + } - if (tofAndTpcPID) { + } else if (cTOFandTPCHighpt) { if (candidate.hasTOF() && std::abs(candidate.tofNSigmaKa()) <= cMaxTOFnSigmaKaon && candidate.hasTPC() && std::abs(candidate.tpcNSigmaKa()) <= cMaxTPCnSigmaKaon) { // tof and tpc cut return true; @@ -407,8 +437,13 @@ struct k892analysis_PbPb { template bool selectionPIDPion(const T& candidate) { + if (cTOFonlyHighpt) { + + if (candidate.hasTOF() && std::abs(candidate.tofNSigmaPi()) <= cMaxTOFnSigmaPion) { // tof cut only + return true; + } - if (tofAndTpcPID) { + } else if (cTOFandTPCHighpt) { if (candidate.hasTOF() && std::abs(candidate.tofNSigmaPi()) <= cMaxTOFnSigmaPion && candidate.hasTPC() && std::abs(candidate.tpcNSigmaPi()) <= cMaxTPCnSigmaPion) { // tof and tpc cut return true; @@ -440,6 +475,7 @@ struct k892analysis_PbPb { template void fillHistograms(const CollisionType& collision, const TracksType& dTracks1, const TracksType& dTracks2) { + auto multiplicity = -999; if constexpr (!IsRun2) @@ -483,10 +519,10 @@ struct k892analysis_PbPb { continue; if constexpr (IsMC) { - if (tpclowpt) { + if (cTPClowpt) { if (trk1ptPi >= cMaxPtTPC || trk2ptKa >= cMaxPtTPC) continue; - } else if (tofhighpt) { + } else if (cTOFonlyHighpt || cTOFandTPCHighpt) { if (trk1ptPi <= cMinPtTOF || trk2ptKa <= cMinPtTOF) continue; } @@ -567,7 +603,8 @@ struct k892analysis_PbPb { ldaughterRot.SetPtEtaPhiM(trk2.pt(), trk2.eta(), trk2.phi() + theta, massKa); lResonanceRot = lDecayDaughter1 + ldaughterRot; } - + if (std::abs(lResonanceRot.Rapidity()) >= 0.5) + continue; if (cfgCutsOnMother) { if (lResonanceRot.Pt() >= cMaxPtMotherCut) // excluding candidates in overflow continue; @@ -668,14 +705,24 @@ struct k892analysis_PbPb { if constexpr (!IsMix) { - bool ismotherok = false; - int pdgcodeMother = -999; + bool isSameMother = false; + bool isMotherOk = false; + int pdgCodeMother = -999; + float ptMother = -9999.; for (const auto& mothertrack1 : mctrack1.template mothers_as()) { for (const auto& mothertrack2 : mctrack2.template mothers_as()) { if (mothertrack1.pdgCode() != mothertrack2.pdgCode()) continue; if (mothertrack1.globalIndex() != mothertrack2.globalIndex()) continue; + + if (std::abs(mothertrack1.pdgCode()) == 1000822080) // Pb PDG code + continue; + + pdgCodeMother = mothertrack1.pdgCode(); + ptMother = mothertrack1.pt(); + isSameMother = true; + if (std::abs(mothertrack1.pdgCode()) != 313) continue; @@ -684,12 +731,21 @@ struct k892analysis_PbPb { continue; } oldindex = mothertrack1.globalIndex(); - pdgcodeMother = mothertrack1.pdgCode(); - ismotherok = true; + isMotherOk = true; + } + } + + if (isSameMother) { + if (track1Sign < 0) { + histos.fill(HIST("h3k892invmassSameMother_DS"), multiplicity, lResonance.Pt(), lResonance.M()); + histos.fill(HIST("h3PdgCodeSameMother_DS"), multiplicity, lResonance.Pt(), pdgCodeMother); + } else if (track1Sign > 0) { + histos.fill(HIST("h3k892invmassSameMother_DSAnti"), multiplicity, lResonance.Pt(), lResonance.M()); + histos.fill(HIST("h3PdgCodeSameMother_DSAnti"), multiplicity, lResonance.Pt(), pdgCodeMother); } } - if (!ismotherok) + if (!isMotherOk) continue; histos.fill(HIST("QAMCTrue/hGlobalIndexMotherRec"), oldindex); @@ -704,14 +760,18 @@ struct k892analysis_PbPb { } // MC histograms - if (pdgcodeMother > 0) { + if (pdgCodeMother > 0) { histos.fill(HIST("k892Rec"), lResonance.Pt(), multiplicity); histos.fill(HIST("k892Recinvmass"), lResonance.M()); histos.fill(HIST("h3Reck892invmass"), multiplicity, lResonance.Pt(), lResonance.M()); + histos.fill(HIST("h3Reck892invmassPtGen"), multiplicity, ptMother, lResonance.M()); + histos.fill(HIST("h3PtRecvsPtGen"), multiplicity, lResonance.Pt(), ptMother); } else { histos.fill(HIST("k892RecAnti"), lResonance.Pt(), multiplicity); histos.fill(HIST("k892RecinvmassAnti"), lResonance.M()); histos.fill(HIST("h3Reck892invmassAnti"), multiplicity, lResonance.Pt(), lResonance.M()); + histos.fill(HIST("h3Reck892invmassAntiPtGen"), multiplicity, ptMother, lResonance.M()); + histos.fill(HIST("h3PtRecvsPtGenAnti"), multiplicity, lResonance.Pt(), ptMother); } } } // end of IsMC @@ -761,47 +821,23 @@ struct k892analysis_PbPb { Partition negKatpc = (aod::track::signed1Pt < static_cast(0)) && (nabs(aod::pidtpc::tpcNSigmaKa) <= cMaxTPCnSigmaKaon) && (nabs(aod::track::pt) < cMaxPtTPC); // tpc & tof, high pt - Partition negPitof = (aod::track::signed1Pt < static_cast(0)) && (nabs(aod::pidtof::tofNSigmaPi) <= cMaxTOFnSigmaPion) && (nabs(aod::pidtpc::tpcNSigmaPi) <= cMaxTPCnSigmaPion) && (nabs(aod::track::pt) > cMinPtTOF); - Partition posKatof = (aod::track::signed1Pt > static_cast(0)) && (nabs(aod::pidtof::tofNSigmaKa) <= cMaxTOFnSigmaKaon) && (nabs(aod::pidtpc::tpcNSigmaKa) <= cMaxTPCnSigmaKaon) && (nabs(aod::track::pt) > cMinPtTOF); - - Partition posPitof = (aod::track::signed1Pt > static_cast(0)) && (nabs(aod::pidtof::tofNSigmaPi) <= cMaxTOFnSigmaPion) && (nabs(aod::pidtpc::tpcNSigmaPi) <= cMaxTPCnSigmaPion) && (nabs(aod::track::pt) > cMinPtTOF); - Partition negKatof = (aod::track::signed1Pt < static_cast(0)) && (nabs(aod::pidtof::tofNSigmaKa) <= cMaxTOFnSigmaKaon) && (nabs(aod::pidtpc::tpcNSigmaKa) <= cMaxTPCnSigmaKaon) && (nabs(aod::track::pt) > cMinPtTOF); - - template - void callFillHistoswithPartitions(const CollisionType& collision, const TracksType&) - { - if (tpclowpt) { - //+- - auto candPosPitpc = posPitpc->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - auto candNegKatpc = negKatpc->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - - fillHistograms(collision, candPosPitpc, candNegKatpc); + Partition negPitoftpc = (aod::track::signed1Pt < static_cast(0)) && (nabs(aod::pidtof::tofNSigmaPi) <= cMaxTOFnSigmaPion) && (nabs(aod::pidtpc::tpcNSigmaPi) <= cMaxTPCnSigmaPion) && (nabs(aod::track::pt) > cMinPtTOF); + Partition posKatoftpc = (aod::track::signed1Pt > static_cast(0)) && (nabs(aod::pidtof::tofNSigmaKa) <= cMaxTOFnSigmaKaon) && (nabs(aod::pidtpc::tpcNSigmaKa) <= cMaxTPCnSigmaKaon) && (nabs(aod::track::pt) > cMinPtTOF); - //-+ - auto candNegPitpc = negPitpc->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - auto candPosKatpc = posKatpc->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - - fillHistograms(collision, candNegPitpc, candPosKatpc); + Partition posPitoftpc = (aod::track::signed1Pt > static_cast(0)) && (nabs(aod::pidtof::tofNSigmaPi) <= cMaxTOFnSigmaPion) && (nabs(aod::pidtpc::tpcNSigmaPi) <= cMaxTPCnSigmaPion) && (nabs(aod::track::pt) > cMinPtTOF); + Partition negKatoftpc = (aod::track::signed1Pt < static_cast(0)) && (nabs(aod::pidtof::tofNSigmaKa) <= cMaxTOFnSigmaKaon) && (nabs(aod::pidtpc::tpcNSigmaKa) <= cMaxTPCnSigmaKaon) && (nabs(aod::track::pt) > cMinPtTOF); - } else if (tofhighpt) { - //+- - auto candPosPitof = posPitof->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - auto candNegKatof = negKatof->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + // tof only, high pt + Partition negPitof = (aod::track::signed1Pt < static_cast(0)) && (nabs(aod::pidtof::tofNSigmaPi) <= cMaxTOFnSigmaPion) && (nabs(aod::track::pt) > cMinPtTOF); + Partition posKatof = (aod::track::signed1Pt > static_cast(0)) && (nabs(aod::pidtof::tofNSigmaKa) <= cMaxTOFnSigmaKaon) && (nabs(aod::track::pt) > cMinPtTOF); - fillHistograms(collision, candPosPitof, candNegKatof); - - //-+ - auto candNegPitof = negPitof->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - auto candPosKatof = posKatof->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - - fillHistograms(collision, candNegPitof, candPosKatof); - } - } + Partition posPitof = (aod::track::signed1Pt > static_cast(0)) && (nabs(aod::pidtof::tofNSigmaPi) <= cMaxTOFnSigmaPion) && (nabs(aod::track::pt) > cMinPtTOF); + Partition negKatof = (aod::track::signed1Pt < static_cast(0)) && (nabs(aod::pidtof::tofNSigmaKa) <= cMaxTOFnSigmaKaon) && (nabs(aod::track::pt) > cMinPtTOF); template - void callFillHistoswithPartitionsMixedEvt(const CollisionType& collision1, const TracksType&, const CollisionType& collision2, const TracksType&) + void callFillHistoswithPartitions(const CollisionType& collision1, const TracksType&, const CollisionType& collision2, const TracksType&) { - if (tpclowpt) { + if (cTPClowpt) { //+- auto candPosPitpc = posPitpc->sliceByCached(aod::track::collisionId, collision1.globalIndex(), cache); auto candNegKatpc = negKatpc->sliceByCached(aod::track::collisionId, collision2.globalIndex(), cache); @@ -814,7 +850,20 @@ struct k892analysis_PbPb { fillHistograms(collision1, candNegPitpc, candPosKatpc); - } else if (tofhighpt) { + } else if (cTOFandTPCHighpt) { + //+- + auto candPosPitoftpc = posPitoftpc->sliceByCached(aod::track::collisionId, collision1.globalIndex(), cache); + auto candNegKatoftpc = negKatoftpc->sliceByCached(aod::track::collisionId, collision2.globalIndex(), cache); + + fillHistograms(collision1, candPosPitoftpc, candNegKatoftpc); + + //-+ + auto candNegPitoftpc = negPitoftpc->sliceByCached(aod::track::collisionId, collision1.globalIndex(), cache); + auto candPosKatoftpc = posKatoftpc->sliceByCached(aod::track::collisionId, collision2.globalIndex(), cache); + + fillHistograms(collision1, candNegPitoftpc, candPosKatoftpc); + + } else if (cTOFonlyHighpt) { //+- auto candPosPitof = posPitof->sliceByCached(aod::track::collisionId, collision1.globalIndex(), cache); auto candNegKatof = negKatof->sliceByCached(aod::track::collisionId, collision2.globalIndex(), cache); @@ -846,9 +895,9 @@ struct k892analysis_PbPb { histos.fill(HIST("TestME/hnTrksSameE"), tracks.size()); } // - callFillHistoswithPartitions(collision, tracks); + callFillHistoswithPartitions(collision, tracks, collision, tracks); } - PROCESS_SWITCH(k892analysis_PbPb, processSameEvent, "Process Same event", true); + PROCESS_SWITCH(K892analysispbpb, processSameEvent, "Process Same event", true); void processSameEventRun2(Run2Events::iterator const& collision, TrackCandidates const& tracks, BCsWithRun2Info const& bcs) { @@ -866,9 +915,9 @@ struct k892analysis_PbPb { } // - callFillHistoswithPartitions(collision, tracks); + callFillHistoswithPartitions(collision, tracks, collision, tracks); } - PROCESS_SWITCH(k892analysis_PbPb, processSameEventRun2, "Process Same event Run2", false); + PROCESS_SWITCH(K892analysispbpb, processSameEventRun2, "Process Same event Run2", false); void processRotationalBkg(EventCandidates::iterator const& collision, TrackCandidates const& tracks, aod::BCs const&) { @@ -877,9 +926,9 @@ struct k892analysis_PbPb { return; // - callFillHistoswithPartitions(collision, tracks); + callFillHistoswithPartitions(collision, tracks, collision, tracks); } - PROCESS_SWITCH(k892analysis_PbPb, processRotationalBkg, "Process Rotational Background", false); + PROCESS_SWITCH(K892analysispbpb, processRotationalBkg, "Process Rotational Background", false); void processRotationalBkgMC(EventCandidatesMCrec::iterator const& recCollision, TrackCandidatesMCrec const& RecTracks) { @@ -890,7 +939,7 @@ struct k892analysis_PbPb { // fillHistograms(recCollision, RecTracks, RecTracks); } - PROCESS_SWITCH(k892analysis_PbPb, processRotationalBkgMC, "Process Rotational Background MC", false); + PROCESS_SWITCH(K892analysispbpb, processRotationalBkgMC, "Process Rotational Background MC", false); void processMixedEvent(EventCandidates const& collisions, TrackCandidates const& tracks) { @@ -913,11 +962,11 @@ struct k892analysis_PbPb { histos.fill(HIST("TestME/hnTrksMixedE"), tracks1.size()); } - // - callFillHistoswithPartitionsMixedEvt(collision1, tracks1, collision2, tracks2); + // + callFillHistoswithPartitions(collision1, tracks1, collision2, tracks2); } } - PROCESS_SWITCH(k892analysis_PbPb, processMixedEvent, "Process Mixed event", true); + PROCESS_SWITCH(K892analysispbpb, processMixedEvent, "Process Mixed event", true); void processMixedEventRun2(Run2Events const& collisions, TrackCandidates const& tracks, BCsWithRun2Info const& bcs) { @@ -938,11 +987,11 @@ struct k892analysis_PbPb { histos.fill(HIST("TestME/hnTrksMixedE"), tracks1.size()); } - // - callFillHistoswithPartitionsMixedEvt(collision1, tracks1, collision2, tracks2); + // + callFillHistoswithPartitions(collision1, tracks1, collision2, tracks2); } } - PROCESS_SWITCH(k892analysis_PbPb, processMixedEventRun2, "Process Mixed event Run2", false); + PROCESS_SWITCH(K892analysispbpb, processMixedEventRun2, "Process Mixed event Run2", false); void processMixedEventMC(EventCandidatesMCrec const& recCollisions, TrackCandidatesMCrec const& RecTracks, aod::McParticles const&) { @@ -967,7 +1016,7 @@ struct k892analysis_PbPb { fillHistograms(collision1, tracks1, tracks2); } } - PROCESS_SWITCH(k892analysis_PbPb, processMixedEventMC, "Process Mixed event MC", false); + PROCESS_SWITCH(K892analysispbpb, processMixedEventMC, "Process Mixed event MC", false); void processMixedEventMCRun2(EventCandidatesMCrecRun2 const& recCollisions, TrackCandidatesMCrec const& RecTracks, BCsWithRun2Info const& bcs, aod::McParticles const&) { @@ -992,10 +1041,63 @@ struct k892analysis_PbPb { fillHistograms(collision1, tracks1, tracks2); } } - PROCESS_SWITCH(k892analysis_PbPb, processMixedEventMCRun2, "Process Mixed event MC Run2", false); + PROCESS_SWITCH(K892analysispbpb, processMixedEventMCRun2, "Process Mixed event MC Run2", false); + + void processEvtLossSigLossMC(aod::McCollisions::iterator const& mcCollision, aod::McParticles const& mcParticles, const soa::SmallGroups& recCollisions) + { + + // Event loss estimation + auto impactPar = mcCollision.impactParameter(); + histos.fill(HIST("QAevent/hImpactParameterGen"), impactPar); + + bool isSel = false; + auto centrality = -999.; + if (recCollisions.size() > 0) { + auto numcontributors = -999; + for (const auto& RecCollision : recCollisions) { + if (!myEventSelections(RecCollision)) + continue; + + if (RecCollision.numContrib() <= numcontributors) + continue; + else + numcontributors = RecCollision.numContrib(); + + centrality = RecCollision.centFT0C(); + isSel = true; + } + } + + if (isSel) { + histos.fill(HIST("QAevent/hImpactParameterRec"), impactPar); + histos.fill(HIST("QAevent/hImpactParvsCentrRec"), centrality, impactPar); + } + + // Generated MC + for (const auto& mcPart : mcParticles) { + if (std::abs(mcPart.y()) >= 0.5 || std::abs(mcPart.pdgCode()) != 313) + continue; + + // signal loss estimation + if (mcPart.pdgCode() > 0) // no cuts, purely generated + histos.fill(HIST("QAevent/k892genBeforeEvtSel"), mcPart.pt(), impactPar); + else + histos.fill(HIST("QAevent/k892genBeforeEvtSelAnti"), mcPart.pt(), impactPar); + + if (isSel) { + // signal loss estimation + if (mcPart.pdgCode() > 0) // no cuts, purely generated + histos.fill(HIST("QAevent/k892genAfterEvtSel"), mcPart.pt(), impactPar); + else + histos.fill(HIST("QAevent/k892genAfterEvtSelAnti"), mcPart.pt(), impactPar); + } + } // end loop on gen particles + } + PROCESS_SWITCH(K892analysispbpb, processEvtLossSigLossMC, "Process Signal Loss, Event Loss", false); void processMC(aod::McCollisions::iterator const& /*mcCollision*/, aod::McParticles const& mcParticles, const soa::SmallGroups& recCollisions, TrackCandidatesMCrec const& RecTracks) { + histos.fill(HIST("QAevent/hMCrecCollSels"), 0); if (recCollisions.size() == 0) { histos.fill(HIST("QAevent/hMCrecCollSels"), 1); @@ -1010,10 +1112,11 @@ struct k892analysis_PbPb { if (!myEventSelections(RecCollision)) continue; - histos.fill(HIST("QAevent/hMCrecCollSels"), 8); + histos.fill(HIST("QAevent/hMCrecCollSels"), 8); auto centrality = RecCollision.centFT0C(); histos.fill(HIST("QAevent/hMultiplicityPercentMC"), centrality); + auto tracks = RecTracks.sliceByCached(aod::track::collisionId, RecCollision.globalIndex(), cache); // @@ -1067,7 +1170,7 @@ struct k892analysis_PbPb { } // end loop on rec collisions } - PROCESS_SWITCH(k892analysis_PbPb, processMC, "Process Monte Carlo", false); + PROCESS_SWITCH(K892analysispbpb, processMC, "Process Monte Carlo", false); void processMCRun2(aod::McCollisions::iterator const& /*mcCollision*/, aod::McParticles const& mcParticles, const soa::SmallGroups& recCollisions, TrackCandidatesMCrec const& RecTracks, BCsWithRun2Info const& bcs) { @@ -1142,9 +1245,9 @@ struct k892analysis_PbPb { } // end loop on rec collisions } - PROCESS_SWITCH(k892analysis_PbPb, processMCRun2, "Process Monte Carlo Run2", false); + PROCESS_SWITCH(K892analysispbpb, processMCRun2, "Process Monte Carlo Run2", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{adaptAnalysisTask(cfgc, TaskName{"k892analysis_PbPb"})}; + return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From 3eedf5b8b701e80ca2069dc5464ef0d1c1aaebe2 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Sat, 15 Feb 2025 17:58:05 +0900 Subject: [PATCH 0235/1650] [PWGEM/Dilepton] quick fix to tree creator ML DDA (#9978) --- PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx index e603030d364..16af43fc05a 100644 --- a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx +++ b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx @@ -507,7 +507,7 @@ struct TreeCreatorElectronMLDDA { Partition negTracks = o2::aod::track::signed1Pt < 0.f && ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::ITS) == true && ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::TPC) == true; std::vector stored_trackIds; - void processPID(filteredMyCollisions const& collisions, aod::BCsWithTimestamps const&, filteredV0s const& v0s, aod::CascDatas const& cascades, MyTracks const& tracks) + void processPID(filteredMyCollisions const& collisions, aod::BCsWithTimestamps const&, filteredV0s const& v0s, filteredCascades const& cascades, MyTracks const& tracks) { stored_trackIds.reserve(tracks.size()); for (auto& collision : collisions) { From a05c0cced1d348604d9545a69046ffcc402dfeac Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Sat, 15 Feb 2025 11:17:01 +0100 Subject: [PATCH 0236/1650] [Common] Update QA task for debug / studies (#9980) Co-authored-by: ALICE Builder --- Common/Tasks/flowTest.cxx | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/Common/Tasks/flowTest.cxx b/Common/Tasks/flowTest.cxx index 9e63991f928..9d5423b65fc 100644 --- a/Common/Tasks/flowTest.cxx +++ b/Common/Tasks/flowTest.cxx @@ -32,6 +32,8 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; +#define bitcheck(var, nbit) ((var) & (1 << (nbit))) + #include "Framework/runDataProcessing.h" struct flowTest { @@ -57,10 +59,13 @@ struct flowTest { histos.add("hPtVsPhiGlobal", "hPtVsPhiGlobal", HistType::kTH2D, {axisPhi, axisPt}); histos.add("hBVsPtVsPhiGenerated", "hBVsPtVsPhiGenerated", HistType::kTH3D, {axisB, axisPhi, axisPt}); histos.add("hBVsPtVsPhiGlobal", "hBVsPtVsPhiGlobal", HistType::kTH3D, {axisB, axisPhi, axisPt}); + histos.add("hBVsPtVsPhiGlobalFake", "hBVsPtVsPhiGlobalFake", HistType::kTH3D, {axisB, axisPhi, axisPt}); histos.add("hBVsPtVsPhiAny", "hBVsPtVsPhiAny", HistType::kTH3D, {axisB, axisPhi, axisPt}); histos.add("hBVsPtVsPhiTPCTrack", "hBVsPtVsPhiTPCTrack", HistType::kTH3D, {axisB, axisPhi, axisPt}); histos.add("hBVsPtVsPhiITSTrack", "hBVsPtVsPhiITSTrack", HistType::kTH3D, {axisB, axisPhi, axisPt}); + histos.add("hBVsPtVsPhiITSTrackFake", "hBVsPtVsPhiITSTrackFake", HistType::kTH3D, {axisB, axisPhi, axisPt}); histos.add("hBVsPtVsPhiITSABTrack", "hBVsPtVsPhiITSABTrack", HistType::kTH3D, {axisB, axisPhi, axisPt}); + histos.add("hBVsPtVsPhiITSABTrackFake", "hBVsPtVsPhiITSABTrackFake", HistType::kTH3D, {axisB, axisPhi, axisPt}); histos.add("hBVsPtVsPhiGeneratedK0Short", "hBVsPtVsPhiGeneratedK0Short", HistType::kTH3D, {axisB, axisPhi, axisPt}); histos.add("hBVsPtVsPhiGlobalK0Short", "hBVsPtVsPhiGlobalK0Short", HistType::kTH3D, {axisB, axisPhi, axisPt}); @@ -73,7 +78,7 @@ struct flowTest { histos.add("hBVsPtVsPhiGlobalOmega", "hBVsPtVsPhiGlobalOmega", HistType::kTH3D, {axisB, axisPhi, axisPt}); } - using recoTracks = soa::Join; + using recoTracks = soa::Join; void process(aod::McCollision const& mcCollision, soa::Join const& mcParticles, recoTracks const&) { @@ -114,15 +119,29 @@ struct flowTest { nCh++; bool validGlobal = false; + bool validGlobalFake = false; bool validTrack = false; bool validTPCTrack = false; bool validITSTrack = false; + bool validITSTrackFake = false; bool validITSABTrack = false; + bool validITSABTrackFake = false; if (mcParticle.has_tracks()) { auto const& tracks = mcParticle.tracks_as(); for (auto const& track : tracks) { + bool isITSFake = false; + + for (int bit = 0; bit < 7; bit++) { + if (bitcheck(track.mcMask(), bit)) { + isITSFake = true; + } + } + if (track.hasTPC() && track.hasITS()) { validGlobal = true; + if (isITSFake) { + validGlobalFake = true; + } } if (track.hasTPC() || track.hasITS()) { validTrack = true; @@ -132,9 +151,15 @@ struct flowTest { } if (track.hasITS() && track.itsChi2NCl() > -1e-6) { validITSTrack = true; + if (isITSFake) { + validITSTrackFake = true; + } } if (track.hasITS() && track.itsChi2NCl() < -1e-6) { validITSABTrack = true; + if (isITSFake) { + validITSABTrackFake = true; + } } } } @@ -144,6 +169,9 @@ struct flowTest { histos.fill(HIST("hPtVsPhiGlobal"), deltaPhi, mcParticle.pt()); histos.fill(HIST("hBVsPtVsPhiGlobal"), imp, deltaPhi, mcParticle.pt()); } + if (validGlobalFake) { + histos.fill(HIST("hBVsPtVsPhiGlobalFake"), imp, deltaPhi, mcParticle.pt()); + } // if any track present, fill if (validTrack) histos.fill(HIST("hBVsPtVsPhiAny"), imp, deltaPhi, mcParticle.pt()); @@ -151,8 +179,12 @@ struct flowTest { histos.fill(HIST("hBVsPtVsPhiTPCTrack"), imp, deltaPhi, mcParticle.pt()); if (validITSTrack) histos.fill(HIST("hBVsPtVsPhiITSTrack"), imp, deltaPhi, mcParticle.pt()); + if (validITSTrackFake) + histos.fill(HIST("hBVsPtVsPhiITSTrackFake"), imp, deltaPhi, mcParticle.pt()); if (validITSABTrack) histos.fill(HIST("hBVsPtVsPhiITSABTrack"), imp, deltaPhi, mcParticle.pt()); + if (validITSABTrackFake) + histos.fill(HIST("hBVsPtVsPhiITSABTrackFake"), imp, deltaPhi, mcParticle.pt()); } } histos.fill(HIST("hNchVsImpactParameter"), imp, nCh); From e917216e431093dd396f32142db1edb6f28119e6 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Sat, 15 Feb 2025 22:35:19 +0900 Subject: [PATCH 0237/1650] [PWGEM/Dilepton] add a task to study event selection bias in MC (#9981) --- PWGEM/Dilepton/Tasks/studyMCTruth.cxx | 361 ++++++++------------------ 1 file changed, 110 insertions(+), 251 deletions(-) diff --git a/PWGEM/Dilepton/Tasks/studyMCTruth.cxx b/PWGEM/Dilepton/Tasks/studyMCTruth.cxx index 983d8a8c4ef..33efc409e99 100644 --- a/PWGEM/Dilepton/Tasks/studyMCTruth.cxx +++ b/PWGEM/Dilepton/Tasks/studyMCTruth.cxx @@ -14,8 +14,7 @@ // This code is to study MC truth. e.g. S/B // Please write to: daiki.sekihata@cern.ch -#include -#include +#include #include "Math/Vector4D.h" #include "Framework/StaticFor.h" @@ -25,6 +24,7 @@ #include "Framework/ASoAHelpers.h" #include "ReconstructionDataFormats/Track.h" #include "Common/Core/TableHelper.h" +#include "Common/DataModel/EventSelection.h" #include "PWGEM/Dilepton/Utils/MCUtilities.h" using namespace o2; @@ -34,21 +34,26 @@ using namespace o2::soa; using namespace o2::aod::pwgem::dilepton::utils::mcutil; struct studyMCTruth { - Configurable pdg_lepton{"pdg_lepton", 11, "pdg code for desired lepton"}; - Configurable max_rxy_PC{"max_rxy_PC", 2.4, "max. rxy for electron from photon conversions"}; // beam pipe:1.8 cm, ITSLayerRadii{2.33959f, 3.14076f, 3.91924f, 19.6213f, 24.5597f, 34.388f, 39.3329f}; in cm - Configurable min_imp_par{"min_imp_par", -1.f, "min. impact parameter in fm"}; // [0, 4] fm for centrality FT0C 0-10%, [8, 10] fm for centrality FT0C 30-50%, - Configurable max_imp_par{"max_imp_par", 999.f, "max. impact parameter in fm"}; - - Configurable min_pt_gen{"min_pt_gen", 0.4, "min. pT of single lepton"}; - Configurable max_pt_gen{"max_pt_gen", 1e+10f, "max. pT of single lepton"}; - Configurable min_eta_gen{"min_eta_gen", -0.8, "min. eta of for single lepton"}; - Configurable max_eta_gen{"max_eta_gen", +0.8, "max. eta of for single lepton"}; - - Configurable min_pt_gen_pf{"min_pt_gen_pf", 0.05, "min. pT of single lepton used for prefilter"}; - Configurable max_pt_gen_pf{"max_pt_gen_pf", 1e+10f, "max. pT of single lepton used for prefilter"}; - Configurable min_eta_gen_pf{"min_eta_gen_pf", -0.9, "min. eta of single lepton used for prefilter"}; - Configurable max_eta_gen_pf{"max_eta_gen_pf", +0.9, "max. eta of single lepton used for prefilter"}; - Configurable> max_mll_vec{"max_mll_vec", std::vector{0.08, 0.10, 0.12}, "vector fo max mll for prefilter in ULS. Please use exactly 3 values."}; // currently, 3 thoresholds are allowed. + + struct : ConfigurableGroup { + std::string prefix = "mccut_group"; + Configurable cfgPdgCodeLepton{"cfgPdgCodeLepton", 11, "pdg code for desired lepton"}; + Configurable cfgMinPtGen{"cfgMinPtGen", 0.1, "min. pT of single lepton"}; + Configurable cfgMaxPtGen{"cfgMaxPtGen", 1e+10f, "max. pT of single lepton"}; + Configurable cfgMinEtaGen{"cfgMinEtaGen", -0.8, "min. eta of for single lepton"}; + Configurable cfgMaxEtaGen{"cfgMaxEtaGen", +0.8, "max. eta of for single lepton"}; + } mccuts; + + struct : ConfigurableGroup { + std::string prefix = "eventcut_group"; + Configurable cfgZvtxMin{"cfgZvtxMin", -10.f, "min. Zvtx"}; + Configurable cfgZvtxMax{"cfgZvtxMax", 10.f, "max. Zvtx"}; + Configurable cfgRequireFT0AND{"cfgRequireFT0AND", true, "require FT0AND in event cut"}; + Configurable cfgRequireNoTFB{"cfgRequireNoTFB", false, "require No time frame border in event cut"}; + Configurable cfgRequireNoITSROFB{"cfgRequireNoITSROFB", false, "require no ITS readout frame border in event cut"}; + Configurable cfgMinImpPar{"cfgMinImpPar", -1.f, "min. impact parameter in fm"}; // [0, 4] fm for centrality FT0C 0-10%, [8, 10] fm for centrality FT0C 30-50% in PbPb + Configurable cfgMaxImpPar{"cfgMaxImpPar", 999.f, "max. impact parameter in fm"}; + } eventcuts; ConfigurableAxis ConfMllBins{"ConfMllBins", {400, 0.f, 4.f}, "mll bins for output histograms"}; ConfigurableAxis ConfPtllBins{"ConfPtllBins", {100, 0.f, 10.f}, "pTll bins for output histograms"}; @@ -58,120 +63,102 @@ struct studyMCTruth { float leptonMass = o2::constants::physics::MassElectron; void init(o2::framework::InitContext&) { - if (std::abs(pdg_lepton.value) == 11) { + if (std::abs(mccuts.cfgPdgCodeLepton.value) == 11) { leptonMass = o2::constants::physics::MassElectron; - } else if (std::abs(pdg_lepton.value) == 13) { + } else if (std::abs(mccuts.cfgPdgCodeLepton.value) == 13) { leptonMass = o2::constants::physics::MassMuon; + } else { + LOGF(fatal, "pdg code must be 11 or 13."); } addHistograms(); } static constexpr std::string_view dileptonSigns[3] = {"uls/", "lspp/", "lsmm/"}; - static constexpr std::string_view pfNames[4] = {"default/", "mllPF0/", "mllPF1/", "mllPF2/"}; + static constexpr std::string_view evNames[4] = {"before/", "after/"}; void addHistograms() { const AxisSpec axis_mll{ConfMllBins, "m_{ll} (GeV/c^{2})"}; const AxisSpec axis_ptll{ConfPtllBins, "p_{T,ll} (GeV/c)"}; - fRegistry.add("Event/hZvtx", "MC Zvtx;Z_{vtx} (cm)", kTH1D, {{100, -50, +50}}, false); - fRegistry.add("Event/hImpactParameter", "impact parameter;impact parameter b (fm)", kTH1D, {{200, 0, 20}}, false); - fRegistry.add("Event/hPtY_pion", "#pi^{#pm} yield;y;p_{T} (GeV/c)", kTH2D, {{20, -1, +1}, {100, 0, 10}}, false); - fRegistry.add("Event/hPtY_kaon", "K^{#pm} yield;y;p_{T} (GeV/c)", kTH2D, {{20, -1, +1}, {100, 0, 10}}, false); - fRegistry.add("Event/hPtY_proton", "p(#bar{p}) yield;y;p_{T} (GeV/c)", kTH2D, {{20, -1, +1}, {100, 0, 10}}, false); - - fRegistry.add("Track/default/hPt", "p_{T,l};p_{T,l} (GeV/c)", kTH1D, {{1000, 0, 10}}, true); - fRegistry.add("Track/default/hEtaPhi", "#eta_{l} vs. #varphi_{l};#varphi_{l} (rad.);#eta_{l};", kTH2D, {{90, 0, 2 * M_PI}, {60, -5, +1}}, true); - fRegistry.addClone("Track/default/", "Track/mllPF0/"); - fRegistry.addClone("Track/default/", "Track/mllPF1/"); - fRegistry.addClone("Track/default/", "Track/mllPF2/"); - - fRegistry.add("Pair/default/Pi0/uls/hMvsPt", "m_{ll} vs. p_{T,ll}", kTH2D, {axis_mll, axis_ptll}, true); - fRegistry.addClone("Pair/default/Pi0/uls/", "Pair/default/Pi0/lspp/"); - fRegistry.addClone("Pair/default/Pi0/uls/", "Pair/default/Pi0/lsmm/"); - fRegistry.addClone("Pair/default/Pi0/", "Pair/default/Eta/"); - fRegistry.addClone("Pair/default/Pi0/", "Pair/default/EtaPrime/"); - fRegistry.addClone("Pair/default/Pi0/", "Pair/default/Rho/"); - fRegistry.addClone("Pair/default/Pi0/", "Pair/default/Omega/"); - fRegistry.addClone("Pair/default/Pi0/", "Pair/default/Phi/"); - fRegistry.addClone("Pair/default/Pi0/", "Pair/default/JPsi/"); - fRegistry.addClone("Pair/default/Pi0/", "Pair/default/Psi2S/"); - fRegistry.addClone("Pair/default/Pi0/", "Pair/default/Upsilon1S/"); - fRegistry.addClone("Pair/default/Pi0/", "Pair/default/Upsilon2S/"); - fRegistry.addClone("Pair/default/Pi0/", "Pair/default/Upsilon3S/"); - fRegistry.addClone("Pair/default/Pi0/", "Pair/default/ccbar/"); - fRegistry.addClone("Pair/default/Pi0/", "Pair/default/bbbar/"); - fRegistry.addClone("Pair/default/Pi0/", "Pair/default/Photon/"); - fRegistry.addClone("Pair/default/Pi0/", "Pair/default/comb_bkg/"); - fRegistry.addClone("Pair/default/", "Pair/mllPF0/"); - fRegistry.addClone("Pair/default/", "Pair/mllPF1/"); - fRegistry.addClone("Pair/default/", "Pair/mllPF2/"); + fRegistry.add("Event/before/hZvtx", "MC Zvtx;Z_{vtx} (cm)", kTH1D, {{100, -50, +50}}, false); + fRegistry.add("Event/before/hImpactParameter", "impact parameter;impact parameter b (fm)", kTH1D, {{200, 0, 20}}, false); + fRegistry.addClone("Event/before/", "Event/after/"); + + fRegistry.add("Pair/before/Pi0/uls/hMvsPt", "m_{ll} vs. p_{T,ll}", kTH2D, {axis_mll, axis_ptll}, true); + fRegistry.addClone("Pair/before/Pi0/uls/", "Pair/before/Pi0/lspp/"); + fRegistry.addClone("Pair/before/Pi0/uls/", "Pair/before/Pi0/lsmm/"); + fRegistry.addClone("Pair/before/Pi0/", "Pair/before/Eta/"); + fRegistry.addClone("Pair/before/Pi0/", "Pair/before/EtaPrime/"); + fRegistry.addClone("Pair/before/Pi0/", "Pair/before/Rho/"); + fRegistry.addClone("Pair/before/Pi0/", "Pair/before/Omega/"); + fRegistry.addClone("Pair/before/Pi0/", "Pair/before/Phi/"); + fRegistry.addClone("Pair/before/Pi0/", "Pair/before/JPsi/"); + fRegistry.addClone("Pair/before/Pi0/", "Pair/before/ccbar/"); + fRegistry.addClone("Pair/before/Pi0/", "Pair/before/bbbar/"); + fRegistry.addClone("Pair/before/", "Pair/after/"); } template int FindLF(TTrack const& posmc, TTrack const& negmc, TMCParticles const& mcparticles) { int arr[] = { - FindCommonMotherFrom2Prongs(posmc, negmc, -pdg_lepton, pdg_lepton, 22, mcparticles), - FindCommonMotherFrom2Prongs(posmc, negmc, -pdg_lepton, pdg_lepton, 111, mcparticles), - FindCommonMotherFrom2Prongs(posmc, negmc, -pdg_lepton, pdg_lepton, 221, mcparticles), - FindCommonMotherFrom2Prongs(posmc, negmc, -pdg_lepton, pdg_lepton, 331, mcparticles), - FindCommonMotherFrom2Prongs(posmc, negmc, -pdg_lepton, pdg_lepton, 113, mcparticles), - FindCommonMotherFrom2Prongs(posmc, negmc, -pdg_lepton, pdg_lepton, 223, mcparticles), - FindCommonMotherFrom2Prongs(posmc, negmc, -pdg_lepton, pdg_lepton, 333, mcparticles), - FindCommonMotherFrom2Prongs(posmc, negmc, -pdg_lepton, pdg_lepton, 443, mcparticles), - FindCommonMotherFrom2Prongs(posmc, negmc, -pdg_lepton, pdg_lepton, 100443, mcparticles), - FindCommonMotherFrom2Prongs(posmc, negmc, -pdg_lepton, pdg_lepton, 553, mcparticles), - FindCommonMotherFrom2Prongs(posmc, negmc, -pdg_lepton, pdg_lepton, 100553, mcparticles), - FindCommonMotherFrom2Prongs(posmc, negmc, -pdg_lepton, pdg_lepton, 200553, mcparticles)}; + FindCommonMotherFrom2Prongs(posmc, negmc, -mccuts.cfgPdgCodeLepton, mccuts.cfgPdgCodeLepton, 111, mcparticles), + FindCommonMotherFrom2Prongs(posmc, negmc, -mccuts.cfgPdgCodeLepton, mccuts.cfgPdgCodeLepton, 221, mcparticles), + FindCommonMotherFrom2Prongs(posmc, negmc, -mccuts.cfgPdgCodeLepton, mccuts.cfgPdgCodeLepton, 331, mcparticles), + FindCommonMotherFrom2Prongs(posmc, negmc, -mccuts.cfgPdgCodeLepton, mccuts.cfgPdgCodeLepton, 113, mcparticles), + FindCommonMotherFrom2Prongs(posmc, negmc, -mccuts.cfgPdgCodeLepton, mccuts.cfgPdgCodeLepton, 223, mcparticles), + FindCommonMotherFrom2Prongs(posmc, negmc, -mccuts.cfgPdgCodeLepton, mccuts.cfgPdgCodeLepton, 333, mcparticles), + FindCommonMotherFrom2Prongs(posmc, negmc, -mccuts.cfgPdgCodeLepton, mccuts.cfgPdgCodeLepton, 443, mcparticles)}; int size = sizeof(arr) / sizeof(*arr); int max = *std::max_element(arr, arr + size); return max; } - template - bool isEleFromPCOnITSib(TMCParticle const& mcparticle, TMCParticles const& mcParticles) + template + bool isSelectedMCParticle(TMCParticle const& mcparticle) { - if (!mcparticle.has_mothers()) { + if (std::abs(mcparticle.pdgCode()) != mccuts.cfgPdgCodeLepton) { return false; } - if (std::abs(mcparticle.pdgCode()) != 11) { + if (!mcparticle.has_mothers()) { return false; } if (mcparticle.isPhysicalPrimary() || mcparticle.producedByGenerator()) { - return false; - } - if (std::sqrt(std::pow(mcparticle.vx(), 2) + std::pow(mcparticle.vy(), 2)) > max_rxy_PC) { - return false; - } - const auto& mp = mcParticles.iteratorAt(mcparticle.mothersIds()[0]); - if (std::abs(mp.pdgCode()) == 22) { return true; } else { return false; } } - template - bool isSelectedMCParticle(TMCParticle const& mcparticle, TMCParticles const& mcParticles) + template + bool isSelectedCollision(TMCCollision const& mcCollision) { - if (std::abs(mcparticle.pdgCode()) != pdg_lepton) { + const auto& bc = mcCollision.template bc_as(); + + if (mcCollision.posZ() < eventcuts.cfgZvtxMin || eventcuts.cfgZvtxMax < mcCollision.posZ()) { return false; } - if (!mcparticle.has_mothers()) { + + if (eventcuts.cfgRequireFT0AND && !bc.selection_bit(o2::aod::evsel::kIsTriggerTVX)) { return false; } - if (mcparticle.isPhysicalPrimary() || mcparticle.producedByGenerator() || isEleFromPCOnITSib(mcparticle, mcParticles)) { - return true; - } else { + + if (eventcuts.cfgRequireNoTFB && !bc.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { + return false; + } + + if (eventcuts.cfgRequireNoITSROFB && !bc.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { return false; } + + return true; } - template + template void fillTrueInfo(TMCLepton const& t1, TMCLepton const& t2, TMCParticles const& mcParticles) { - if (!isSelectedMCParticle(t1, mcParticles) || !isSelectedMCParticle(t2, mcParticles)) { + if (!isSelectedMCParticle(t1) || !isSelectedMCParticle(t2)) { return; } @@ -179,61 +166,39 @@ struct studyMCTruth { ROOT::Math::PtEtaPhiMVector v2(t2.pt(), t2.eta(), t2.phi(), leptonMass); ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - int mother_id = FindLF(t1, t2, mcParticles); - int hfll_type = IsHF(t1, t2, mcParticles); - if (mother_id < 0 && hfll_type < 0) { - fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("comb_bkg/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + if (v12.Rapidity() < mccuts.cfgMinEtaGen || mccuts.cfgMaxEtaGen < v12.Rapidity()) { return; } + int mother_id = FindLF(t1, t2, mcParticles); + int hfll_type = IsHF(t1, t2, mcParticles); + if (mother_id > 0) { // same mother (photon, LF, Quarkonia) const auto& mp = mcParticles.iteratorAt(mother_id); - if (std::abs(mp.pdgCode()) == 22 && isEleFromPCOnITSib(t1, mcParticles) && isEleFromPCOnITSib(t2, mcParticles)) { - fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("Photon/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); - return; - } - if (!t1.isPhysicalPrimary() && !t1.producedByGenerator()) { - return; - } - if (!t2.isPhysicalPrimary() && !t2.producedByGenerator()) { - return; - } - if (!mp.isPhysicalPrimary() && !mp.producedByGenerator()) { + if (!(mp.isPhysicalPrimary() || mp.producedByGenerator())) { return; } switch (std::abs(mp.pdgCode())) { case 111: - fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("Pi0/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + fRegistry.fill(HIST("Pair/") + HIST(evNames[evtype]) + HIST("Pi0/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); break; case 221: - fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("Eta/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + fRegistry.fill(HIST("Pair/") + HIST(evNames[evtype]) + HIST("Eta/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); break; case 331: - fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("EtaPrime/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + fRegistry.fill(HIST("Pair/") + HIST(evNames[evtype]) + HIST("EtaPrime/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); break; case 113: - fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("Rho/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + fRegistry.fill(HIST("Pair/") + HIST(evNames[evtype]) + HIST("Rho/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); break; case 223: - fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("Omega/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + fRegistry.fill(HIST("Pair/") + HIST(evNames[evtype]) + HIST("Omega/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); break; case 333: - fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("Phi/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + fRegistry.fill(HIST("Pair/") + HIST(evNames[evtype]) + HIST("Phi/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); break; case 443: - fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("JPsi/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); - break; - case 100443: - fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("Psi2S/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); - break; - case 553: - fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("Upsilon1S/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); - break; - case 100553: - fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("Upsilon2S/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); - break; - case 200553: - fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("Upsilon3S/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + fRegistry.fill(HIST("Pair/") + HIST(evNames[evtype]) + HIST("JPsi/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); break; default: break; @@ -241,167 +206,63 @@ struct studyMCTruth { } else if (hfll_type > -1) { // HFll switch (hfll_type) { case static_cast(EM_HFeeType::kCe_Ce): // ULS - fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("ccbar/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + fRegistry.fill(HIST("Pair/") + HIST(evNames[evtype]) + HIST("ccbar/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); break; case static_cast(EM_HFeeType::kBe_Be): // ULS - fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("bbbar/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + fRegistry.fill(HIST("Pair/") + HIST(evNames[evtype]) + HIST("bbbar/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); break; case static_cast(EM_HFeeType::kBCe_BCe): // ULS - fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("bbbar/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + fRegistry.fill(HIST("Pair/") + HIST(evNames[evtype]) + HIST("bbbar/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); break; case static_cast(EM_HFeeType::kBCe_Be_SameB): // ULS - fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("bbbar/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + fRegistry.fill(HIST("Pair/") + HIST(evNames[evtype]) + HIST("bbbar/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); break; case static_cast(EM_HFeeType::kBCe_Be_DiffB): // LS - fRegistry.fill(HIST("Pair/") + HIST(pfNames[pftype]) + HIST("bbbar/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + fRegistry.fill(HIST("Pair/") + HIST(evNames[evtype]) + HIST("bbbar/") + HIST(dileptonSigns[signtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); default: break; } } } - template - void fillTrackInfo(TMCParticle const& mcparticle) + template + void runMC(TMCCollisions const& mcCollisions, TMCParticles const& mcParticles, TBCs const&) { - fRegistry.fill(HIST("Track/") + HIST(pfNames[pftype]) + HIST("hPt"), mcparticle.pt()); - fRegistry.fill(HIST("Track/") + HIST(pfNames[pftype]) + HIST("hEtaPhi"), mcparticle.phi(), mcparticle.eta()); - } - - template - void runMC(TMCCollisions const& mcCollisions, TMCParticles const& mcParticles) - { - std::unordered_map map_pfb; // global index of mc particle -> prefilter bit for (const auto& mcCollision : mcCollisions) { - fRegistry.fill(HIST("Event/hZvtx"), mcCollision.posZ()); - fRegistry.fill(HIST("Event/hImpactParameter"), mcCollision.impactParameter()); - - auto mcParticles_per_mccollision = mcParticles.sliceBy(perMcCollision, mcCollision.globalIndex()); - for (const auto& mcparticle : mcParticles_per_mccollision) { - if (mcparticle.isPhysicalPrimary() || mcparticle.producedByGenerator()) { - if (std::abs(mcparticle.pdgCode()) == 211) { - fRegistry.fill(HIST("Event/hPtY_pion"), mcparticle.y(), mcparticle.pt()); - } else if (std::abs(mcparticle.pdgCode()) == 321) { - fRegistry.fill(HIST("Event/hPtY_kaon"), mcparticle.y(), mcparticle.pt()); - } else if (std::abs(mcparticle.pdgCode()) == 2212) { - fRegistry.fill(HIST("Event/hPtY_proton"), mcparticle.y(), mcparticle.pt()); - } - } - } + fRegistry.fill(HIST("Event/before/hZvtx"), mcCollision.posZ()); + fRegistry.fill(HIST("Event/before/hImpactParameter"), mcCollision.impactParameter()); // store MC true information auto posLeptons_per_mccollision = mcPosLeptons.sliceBy(perMcCollision, mcCollision.globalIndex()); auto negLeptons_per_mccollision = mcNegLeptons.sliceBy(perMcCollision, mcCollision.globalIndex()); - auto posLeptonsPF_per_mccollision = mcPosLeptonsPF.sliceBy(perMcCollision, mcCollision.globalIndex()); - auto negLeptonsPF_per_mccollision = mcNegLeptonsPF.sliceBy(perMcCollision, mcCollision.globalIndex()); - - for (const auto& pos : posLeptons_per_mccollision) { - map_pfb[pos.globalIndex()] = 0; - if (!isSelectedMCParticle(pos, mcParticles)) { - continue; - } - fillTrackInfo<0>(pos); - } - for (const auto& neg : negLeptons_per_mccollision) { - map_pfb[neg.globalIndex()] = 0; - if (!isSelectedMCParticle(neg, mcParticles)) { - continue; - } - fillTrackInfo<0>(neg); - } - - for (const auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posLeptons_per_mccollision, negLeptonsPF_per_mccollision))) { // ULS to set prefilter bits, default pos + loose neg - if (!isSelectedMCParticle(pos, mcParticles) || !isSelectedMCParticle(neg, mcParticles)) { - continue; - } - ROOT::Math::PtEtaPhiMVector v1(pos.pt(), pos.eta(), pos.phi(), leptonMass); - ROOT::Math::PtEtaPhiMVector v2(neg.pt(), neg.eta(), neg.phi(), leptonMass); - ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - for (int i = 0; i < static_cast(max_mll_vec->size()); i++) { - if (v12.M() < max_mll_vec->at(i)) { - map_pfb[pos.globalIndex()] |= (uint8_t(1) << i); - } - } - } // end of ULS pair loop to set prefilter bits - for (const auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posLeptonsPF_per_mccollision, negLeptons_per_mccollision))) { // ULS to set prefilter bits, loose pos + default neg - if (!isSelectedMCParticle(pos, mcParticles) || !isSelectedMCParticle(neg, mcParticles)) { - continue; - } - ROOT::Math::PtEtaPhiMVector v1(pos.pt(), pos.eta(), pos.phi(), leptonMass); - ROOT::Math::PtEtaPhiMVector v2(neg.pt(), neg.eta(), neg.phi(), leptonMass); - ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - for (int i = 0; i < static_cast(max_mll_vec->size()); i++) { - if (v12.M() < max_mll_vec->at(i)) { - map_pfb[neg.globalIndex()] |= (uint8_t(1) << i); - } - } - } // end of ULS pair loop to set prefilter bits - - for (const auto& pos : posLeptons_per_mccollision) { - if (!isSelectedMCParticle(pos, mcParticles)) { - continue; - } - static_for<0, 3 - 1>([&](auto i) { - constexpr int index = i.value; - if ((map_pfb[pos.globalIndex()] & (uint8_t(1) << index)) == 0) { - fillTrackInfo(pos); - } - }); - } - for (const auto& neg : negLeptons_per_mccollision) { - if (!isSelectedMCParticle(neg, mcParticles)) { - continue; - } - static_for<0, 3 - 1>([&](auto i) { - constexpr int index = i.value; - if ((map_pfb[neg.globalIndex()] & (uint8_t(1) << index)) == 0) { - fillTrackInfo(neg); - } - }); + bool isSelected = isSelectedCollision(mcCollision); + if (isSelected) { + fRegistry.fill(HIST("Event/after/hZvtx"), mcCollision.posZ()); + fRegistry.fill(HIST("Event/after/hImpactParameter"), mcCollision.impactParameter()); } for (const auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posLeptons_per_mccollision, negLeptons_per_mccollision))) { // ULS - if (!isSelectedMCParticle(pos, mcParticles) || !isSelectedMCParticle(neg, mcParticles)) { - continue; + fillTrueInfo<0, 0>(pos, neg, mcParticles); + if (isSelected) { + fillTrueInfo<1, 0>(pos, neg, mcParticles); } - // LOGF(info, "mcCollision.globalIndex() = %d, pos.globalIndex() = %d, map_pfb[pos.globalIndex()] = %d, neg.globalIndex() = %d, map_pfb[neg.globalIndex()] = %d", mcCollision.globalIndex(), pos.globalIndex(), map_pfb[pos.globalIndex()], neg.globalIndex(), map_pfb[neg.globalIndex()]); - - fillTrueInfo<0, 0>(pos, neg, mcParticles); // default - static_for<0, 3 - 1>([&](auto i) { - constexpr int index = i.value; - if ((map_pfb[pos.globalIndex()] & (uint8_t(1) << index)) == 0 && (map_pfb[neg.globalIndex()] & (uint8_t(1) << index)) == 0) { - fillTrueInfo(pos, neg, mcParticles); // mllPF0,1,2 - } - }); } // end of ULS pair loop for (auto& [pos1, pos2] : combinations(CombinationsStrictlyUpperIndexPolicy(posLeptons_per_mccollision, posLeptons_per_mccollision))) { // LS++ - if (!isSelectedMCParticle(pos1, mcParticles) || !isSelectedMCParticle(pos2, mcParticles)) { - continue; + fillTrueInfo<0, 1>(pos1, pos2, mcParticles); + if (isSelected) { + fillTrueInfo<1, 1>(pos1, pos2, mcParticles); } - fillTrueInfo<0, 1>(pos1, pos2, mcParticles); // default - static_for<0, 3 - 1>([&](auto i) { - constexpr int index = i.value; - if ((map_pfb[pos1.globalIndex()] & (uint8_t(1) << index)) == 0 && (map_pfb[pos2.globalIndex()] & (uint8_t(1) << index)) == 0) { - fillTrueInfo(pos1, pos2, mcParticles); // mllPF0,1,2 - } - }); } // end of LS++ pair loop for (auto& [neg1, neg2] : combinations(CombinationsStrictlyUpperIndexPolicy(negLeptons_per_mccollision, negLeptons_per_mccollision))) { // LS-- - if (!isSelectedMCParticle(neg1, mcParticles) || !isSelectedMCParticle(neg2, mcParticles)) { - continue; + fillTrueInfo<0, 2>(neg1, neg2, mcParticles); + if (isSelected) { + fillTrueInfo<1, 2>(neg1, neg2, mcParticles); } - fillTrueInfo<0, 2>(neg1, neg2, mcParticles); // default - static_for<0, 3 - 1>([&](auto i) { - constexpr int index = i.value; - if ((map_pfb[neg1.globalIndex()] & (uint8_t(1) << index)) == 0 && (map_pfb[neg2.globalIndex()] & (uint8_t(1) << index)) == 0) { - fillTrueInfo(neg1, neg2, mcParticles); // mllPF0,1,2 - } - }); } // end of LS-- pair loop - map_pfb.clear(); } // end of mc collision loop } // end of skimmingMC @@ -409,17 +270,15 @@ struct studyMCTruth { SliceCache cache; Preslice perMcCollision = aod::mcparticle::mcCollisionId; - Filter collisionFilter = min_imp_par < o2::aod::mccollision::impactParameter && o2::aod::mccollision::impactParameter < max_imp_par; + Filter collisionFilter = eventcuts.cfgMinImpPar < o2::aod::mccollision::impactParameter && o2::aod::mccollision::impactParameter < eventcuts.cfgMaxImpPar; using FilteredMcCollisions = soa::Filtered; - Partition mcPosLeptons = o2::aod::mcparticle::pdgCode == -pdg_lepton && (min_pt_gen < o2::aod::mcparticle::pt && o2::aod::mcparticle::pt < max_pt_gen) && (min_eta_gen < o2::aod::mcparticle::eta && o2::aod::mcparticle::eta < max_eta_gen); - Partition mcNegLeptons = o2::aod::mcparticle::pdgCode == pdg_lepton && (min_pt_gen < o2::aod::mcparticle::pt && o2::aod::mcparticle::pt < max_pt_gen) && (min_eta_gen < o2::aod::mcparticle::eta && o2::aod::mcparticle::eta < max_eta_gen); - Partition mcPosLeptonsPF = o2::aod::mcparticle::pdgCode == -pdg_lepton && (min_pt_gen_pf < o2::aod::mcparticle::pt && o2::aod::mcparticle::pt < max_pt_gen_pf) && (min_eta_gen_pf < o2::aod::mcparticle::eta && o2::aod::mcparticle::eta < max_eta_gen_pf); - Partition mcNegLeptonsPF = o2::aod::mcparticle::pdgCode == pdg_lepton && (min_pt_gen_pf < o2::aod::mcparticle::pt && o2::aod::mcparticle::pt < max_pt_gen_pf) && (min_eta_gen_pf < o2::aod::mcparticle::eta && o2::aod::mcparticle::eta < max_eta_gen_pf); + Partition mcPosLeptons = o2::aod::mcparticle::pdgCode == -mccuts.cfgPdgCodeLepton && (mccuts.cfgMinPtGen < o2::aod::mcparticle::pt && o2::aod::mcparticle::pt < mccuts.cfgMaxPtGen) && (mccuts.cfgMinEtaGen < o2::aod::mcparticle::eta && o2::aod::mcparticle::eta < mccuts.cfgMaxEtaGen); + Partition mcNegLeptons = o2::aod::mcparticle::pdgCode == mccuts.cfgPdgCodeLepton && (mccuts.cfgMinPtGen < o2::aod::mcparticle::pt && o2::aod::mcparticle::pt < mccuts.cfgMaxPtGen) && (mccuts.cfgMinEtaGen < o2::aod::mcparticle::eta && o2::aod::mcparticle::eta < mccuts.cfgMaxEtaGen); - void processMC(FilteredMcCollisions const& mcCollisions, aod::McParticles const& mcParticles) + void processMC(FilteredMcCollisions const& mcCollisions, aod::McParticles const& mcParticles, soa::Join const& bcs) { - runMC(mcCollisions, mcParticles); + runMC(mcCollisions, mcParticles, bcs); } PROCESS_SWITCH(studyMCTruth, processMC, "process", true); From 4cf32febe7d9928ff09ca30904a9dcd1566c9099 Mon Sep 17 00:00:00 2001 From: alcaliva <32872606+alcaliva@users.noreply.github.com> Date: Sat, 15 Feb 2025 16:32:05 +0100 Subject: [PATCH 0238/1650] [PWGLF] new analysis task for antinuclei in jets using fastjet (#9983) --- PWGLF/Tasks/Nuspex/CMakeLists.txt | 5 + PWGLF/Tasks/Nuspex/antinucleiInJets.cxx | 746 ++++++++++++++++++++++++ 2 files changed, 751 insertions(+) create mode 100644 PWGLF/Tasks/Nuspex/antinucleiInJets.cxx diff --git a/PWGLF/Tasks/Nuspex/CMakeLists.txt b/PWGLF/Tasks/Nuspex/CMakeLists.txt index 55afb720ab4..8cf61dda93f 100644 --- a/PWGLF/Tasks/Nuspex/CMakeLists.txt +++ b/PWGLF/Tasks/Nuspex/CMakeLists.txt @@ -154,4 +154,9 @@ o2physics_add_dpl_workflow(angular-correlations-in-jets SOURCES AngularCorrelationsInJets.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::PWGJECore FastJet::FastJet FastJet::Contrib COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(antinuclei-in-jets + SOURCES antinucleiInJets.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::PWGJECore FastJet::FastJet FastJet::Contrib + COMPONENT_NAME Analysis) endif() diff --git a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx new file mode 100644 index 00000000000..3f4af79c926 --- /dev/null +++ b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx @@ -0,0 +1,746 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// +/// \file antinucleiInJets.cxx +/// +/// \brief task for analysis of antinuclei in jets using Fastjet +/// \author Alberto Caliva (alberto.caliva@cern.ch), Chiara Pinto (chiara.pinto@cern.ch) +/// \since February 13, 2025 + +#include +#include +#include +#include +#include +#include +#include +#include +#include "TGrid.h" + +#include "CCDB/BasicCCDBManager.h" +#include "CCDB/CcdbApi.h" +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/ASoA.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/RunningWorkflowInfo.h" +#include "Framework/DataTypes.h" +#include "Framework/Logger.h" +#include "ReconstructionDataFormats/Track.h" +#include "ReconstructionDataFormats/PID.h" +#include "ReconstructionDataFormats/DCA.h" +#include "Common/Core/trackUtilities.h" +#include "Common/Core/TrackSelection.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/PIDResponseITS.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "PWGJE/Core/JetBkgSubUtils.h" +#include "PWGJE/Core/JetDerivedDataUtilities.h" +#include "PWGJE/DataModel/JetReducedData.h" +#include "PWGJE/DataModel/Jet.h" + +using namespace std; +using namespace o2; +using namespace o2::soa; +using namespace o2::aod; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::constants::physics; +using namespace o2::constants::math; +using std::array; + +using SelectedCollisions = soa::Join; +using SimCollisions = soa::Join; + +using FullNucleiTracks = soa::Join; + +using MCTracks = soa::Join; + +struct AntinucleiInJets { + + // histogram registries + HistogramRegistry registryData{"registryData", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry registryMC{"registryMC", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry registryQC{"registryQC", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + + // global parameters + Configurable minJetPt{"minJetPt", 10.0, "Minimum pt of the jet"}; + Configurable rJet{"rJet", 0.3, "Jet resolution parameter R"}; + Configurable zVtx{"zVtx", 10.0, "Maximum zVertex"}; + + // track parameters + Configurable requirePvContributor{"requirePvContributor", false, "require that the track is a PV contributor"}; + Configurable applyItsPid{"applyItsPid", true, "apply ITS PID"}; + Configurable minItsNclusters{"minItsNclusters", 5, "minimum number of ITS clusters"}; + Configurable minTpcNcrossedRows{"minTpcNcrossedRows", 80, "minimum number of TPC crossed pad rows"}; + Configurable minTpcNcrossedRowsOverFindable{"minTpcNcrossedRowsOverFindable", 0.8, "crossed rows/findable"}; + Configurable maxChiSquareTpc{"maxChiSquareTpc", 4.0, "maximum TPC chi^2/Ncls"}; + Configurable maxChiSquareIts{"maxChiSquareIts", 36.0, "maximum ITS chi^2/Ncls"}; + Configurable minPt{"minPt", 0.3, "minimum pt of the tracks"}; + Configurable minEta{"minEta", -0.8, "minimum eta"}; + Configurable maxEta{"maxEta", +0.8, "maximum eta"}; + Configurable maxDcaxy{"maxDcaxy", 0.05, "Maximum DCAxy"}; + Configurable maxDcaz{"maxDcaz", 0.05, "Maximum DCAz"}; + Configurable minNsigmaTpc{"minNsigmaTpc", -3.0, "Minimum nsigma TPC"}; + Configurable maxNsigmaTpc{"maxNsigmaTpc", +3.0, "Maximum nsigma TPC"}; + Configurable minNsigmaTof{"minNsigmaTof", -3.0, "Minimum nsigma TOF"}; + Configurable maxNsigmaTof{"maxNsigmaTof", +3.5, "Maximum nsigma TOF"}; + Configurable ptMaxItsPidProt{"ptMaxItsPidProt", 1.0, "maximum pt for ITS PID for protons"}; + Configurable ptMaxItsPidDeut{"ptMaxItsPidDeut", 1.0, "maximum pt for ITS PID for deuterons"}; + Configurable ptMaxItsPidHel{"ptMaxItsPidHel", 1.0, "maximum pt for ITS PID for helium"}; + Configurable nSigmaItsMin{"nSigmaItsMin", -2.0, "nSigmaITS min"}; + Configurable nSigmaItsMax{"nSigmaItsMax", +2.0, "nSigmaITS max"}; + + // reweighting + Configurable applyReweighting{"applyReweighting", true, "apply reweighting"}; + Configurable urlToCcdb{"urlToCcdb", "http://alice-ccdb.cern.ch", "url of the personal ccdb"}; + Configurable pathToFile{"pathToFile", "", "path to file with reweighting"}; + Configurable histoNameWeightAntipJet{"histoNameWeightAntipJet", "", "reweighting histogram: antip in jet"}; + Configurable histoNameWeightAntipUe{"histoNameWeightAntipUe", "", "reweighting histogram: antip in ue"}; + + TH2F* twoDweightsAntipJet; + TH2F* twoDweightsAntipUe; + + Service ccdb; + o2::ccdb::CcdbApi ccdbApi; + + JetBkgSubUtils backgroundSub; + + void init(InitContext const&) + { + ccdb->setURL(urlToCcdb.value); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setCreatedNotAfter(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); + ccdb->setFatalWhenNull(false); + + if (applyReweighting) { + getReweightingHistograms(ccdb, TString(pathToFile), TString(histoNameWeightAntipJet), TString(histoNameWeightAntipUe)); + } else { + twoDweightsAntipJet = nullptr; + twoDweightsAntipUe = nullptr; + } + + // QC Histograms + if (doprocessQC) { + registryQC.add("deltaEta_deltaPhi_jet", "deltaEta_deltaPhi_jet", HistType::kTH2F, {{200, -0.5, 0.5, "#Delta#eta"}, {200, 0, PIHalf, "#Delta#phi"}}); + registryQC.add("deltaEta_deltaPhi_ue", "deltaEta_deltaPhi_ue", HistType::kTH2F, {{200, -0.5, 0.5, "#Delta#eta"}, {200, 0, PIHalf, "#Delta#phi"}}); + registryQC.add("NchJetCone", "NchJetCone", HistType::kTH1F, {{100, 0, 100, "#it{N}_{ch}"}}); + registryQC.add("NchJet", "NchJet", HistType::kTH1F, {{100, 0, 100, "#it{N}_{ch}"}}); + registryQC.add("NchUE", "NchUE", HistType::kTH1F, {{100, 0, 100, "#it{N}_{ch}"}}); + registryQC.add("sumPtJetCone", "sumPtJetCone", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); + registryQC.add("sumPtJet", "sumPtJet", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); + registryQC.add("sumPtUE", "sumPtUE", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); + registryQC.add("nJetsFound", "nJetsFound", HistType::kTH1F, {{10, 0, 10, "#it{n}_{Jet}"}}); + registryQC.add("nJetsInAcceptance", "nJetsInAcceptance", HistType::kTH1F, {{10, 0, 10, "#it{n}_{Jet}"}}); + registryQC.add("nJetsSelectedHighPt", "nJetsSelectedHighPt", HistType::kTH1F, {{10, 0, 10, "#it{n}_{Jet}"}}); + registryQC.add("jetEffectiveArea", "jetEffectiveArea", HistType::kTH1F, {{2000, 0, 2, "Area/#piR^{2}"}}); + } + + // event counter MC + registryMC.add("number_of_events_mc", "number of events in mc", HistType::kTH1F, {{10, 0, 10, "counter"}}); + + // Binning + double min = 0.0; + double max = 6.0; + int nbins = 120; + + // data + if (doprocessData) { + + // event counter data + registryData.add("number_of_events_data", "number of events in data", HistType::kTH1F, {{10, 0, 10, "counter"}}); + + // antiprotons + registryData.add("antiproton_jet_tpc", "antiproton_jet_tpc", HistType::kTH2F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}}); + registryData.add("antiproton_jet_tof", "antiproton_jet_tof", HistType::kTH2F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TOF}"}}); + registryData.add("antiproton_ue_tpc", "antiproton_ue_tpc", HistType::kTH2F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}}); + registryData.add("antiproton_ue_tof", "antiproton_ue_tof", HistType::kTH2F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TOF}"}}); + registryData.add("antiproton_dca_jet", "antiproton_dca_jet", HistType::kTH2F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {200, -0.5, 0.5, "DCA_{xy} (cm)"}}); + registryData.add("antiproton_dca_ue", "antiproton_dca_ue", HistType::kTH2F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {200, -0.5, 0.5, "DCA_{xy} (cm)"}}); + + // antideuterons + registryData.add("antideuteron_jet_tpc", "antideuteron_jet_tpc", HistType::kTH2F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}}); + registryData.add("antideuteron_jet_tof", "antideuteron_jet_tof", HistType::kTH2F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TOF}"}}); + registryData.add("antideuteron_ue_tpc", "antideuteron_ue_tpc", HistType::kTH2F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}}); + registryData.add("antideuteron_ue_tof", "antideuteron_ue_tof", HistType::kTH2F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TOF}"}}); + + // deuterons + registryData.add("deuteron_jet_tof", "deuteron_jet_tof", HistType::kTH2F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TOF}"}}); + registryData.add("deuteron_ue_tof", "deuteron_ue_tof", HistType::kTH2F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TOF}"}}); + + // antihelium-3 + registryData.add("antihelium3_jet_tpc", "antihelium3_jet_tpc", HistType::kTH2F, {{nbins, min * 3, max * 3, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}}); + registryData.add("antihelium3_ue_tpc", "antihelium3_ue_tpc", HistType::kTH2F, {{nbins, min * 3, max * 3, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}}); + + // helium-3 + registryData.add("helium3_jet_tpc", "helium3_jet_tpc", HistType::kTH2F, {{nbins, min * 3, max * 3, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}}); + registryData.add("helium3_ue_tpc", "helium3_ue_tpc", HistType::kTH2F, {{nbins, min * 3, max * 3, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}}); + } + + // Generated + registryMC.add("antiproton_jet_gen", "antiproton_jet_gen", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antideuteron_jet_gen", "antideuteron_jet_gen", HistType::kTH1F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antihelium3_jet_gen", "antihelium3_jet_gen", HistType::kTH1F, {{nbins, min * 3, max * 3, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antiproton_ue_gen", "antiproton_ue_gen", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antideuteron_ue_gen", "antideuteron_ue_gen", HistType::kTH1F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antihelium3_ue_gen", "antihelium3_ue_gen", HistType::kTH1F, {{nbins, min * 3, max * 3, "#it{p}_{T} (GeV/#it{c})"}}); + + // Reconstructed TPC + registryMC.add("antiproton_jet_rec_tpc", "antiproton_jet_rec_tpc", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antideuteron_jet_rec_tpc", "antideuteron_jet_rec_tpc", HistType::kTH1F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antihelium3_jet_rec_tpc", "antihelium3_jet_rec_tpc", HistType::kTH1F, {{nbins, min * 3, max * 3, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antiproton_ue_rec_tpc", "antiproton_ue_rec_tpc", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antideuteron_ue_rec_tpc", "antideuteron_ue_rec_tpc", HistType::kTH1F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antihelium3_ue_rec_tpc", "antihelium3_ue_rec_tpc", HistType::kTH1F, {{nbins, min * 3, max * 3, "#it{p}_{T} (GeV/#it{c})"}}); + + // Reconstructed TOF + registryMC.add("antiproton_jet_rec_tof", "antiproton_jet_rec_tof", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antideuteron_jet_rec_tof", "antideuteron_jet_rec_tof", HistType::kTH1F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antiproton_ue_rec_tof", "antiproton_ue_rec_tof", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antideuteron_ue_rec_tof", "antideuteron_ue_rec_tof", HistType::kTH1F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}}); + + // Fraction of Primary Antiprotons from MC + registryMC.add("antiproton_prim", "antiproton_prim", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antiproton_all", "antiproton_all", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antiproton_prim_jet", "antiproton_prim_jet", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antiproton_all_jet", "antiproton_all_jet", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antiproton_prim_ue", "antiproton_prim_ue", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antiproton_all_ue", "antiproton_all_ue", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + + // Antiproton Reweighting + registryMC.add("antiproton_eta_pt_pythia", "antiproton_eta_pt_pythia", HistType::kTH2F, {{200, 0.0, 10.0, "#it{p}_{T} (GeV/#it{c})"}, {20, -1.0, 1.0, "#it{#eta}"}}); + registryMC.add("antiproton_eta_pt_jet", "antiproton_eta_pt_jet", HistType::kTH2F, {{200, 0.0, 10.0, "#it{p}_{T} (GeV/#it{c})"}, {20, -1.0, 1.0, "#it{#eta}"}}); + registryMC.add("antiproton_eta_pt_ue", "antiproton_eta_pt_ue", HistType::kTH2F, {{200, 0.0, 10.0, "#it{p}_{T} (GeV/#it{c})"}, {20, -1.0, 1.0, "#it{#eta}"}}); + + // Detector Response Matrix + registryMC.add("detectorResponseMatrix", "detectorResponseMatrix", HistType::kTH2F, {{5000, 0.0, 50.0, "#it{p}_{T}^{gen} (GeV/#it{c})"}, {5000, 0.0, 50.0, "#it{p}_{T}^{rec} (GeV/#it{c})"}}); + } + + void getPerpendicularAxis(TVector3 p, TVector3& u, double sign) + { + // initialization + double ux(0), uy(0), uz(0); + + // components of vector p + double px = p.X(); + double py = p.Y(); + double pz = p.Z(); + + // protection 1 + if (px == 0 && py != 0) { + uy = -(pz * pz) / py; + ux = sign * std::sqrt(py * py - (pz * pz * pz * pz) / (py * py)); + uz = pz; + u.SetXYZ(ux, uy, uz); + return; + } + + // protection 2 + if (py == 0 && px != 0) { + ux = -(pz * pz) / px; + uy = sign * std::sqrt(px * px - (pz * pz * pz * pz) / (px * px)); + uz = pz; + u.SetXYZ(ux, uy, uz); + return; + } + + // equation parameters + double a = px * px + py * py; + double b = 2.0 * px * pz * pz; + double c = pz * pz * pz * pz - py * py * py * py - px * px * py * py; + double delta = b * b - 4.0 * a * c; + + // protection agains delta<0 + if (delta < 0) { + return; + } + + // solutions + ux = (-b + sign * std::sqrt(delta)) / (2.0 * a); + uy = (-pz * pz - px * ux) / py; + uz = pz; + u.SetXYZ(ux, uy, uz); + return; + } + + double getDeltaPhi(double a1, double a2) + { + double deltaPhi(0); + double phi1 = TVector2::Phi_0_2pi(a1); + double phi2 = TVector2::Phi_0_2pi(a2); + double diff = std::fabs(phi1 - phi2); + + if (diff <= PI) + deltaPhi = diff; + if (diff > PI) + deltaPhi = TwoPI - diff; + + return deltaPhi; + } + + // ITS hit + template + bool hasITSHit(const TrackIts& track, int layer) + { + int ibit = layer - 1; + return (track.itsClusterMap() & (1 << ibit)); + } + + // single-track selection for particles inside jets + template + bool passedTrackSelectionForJetReconstruction(const JetTrack& track) + { + if (!track.hasITS()) + return false; + if ((!hasITSHit(track, 1)) && (!hasITSHit(track, 2)) && (!hasITSHit(track, 3))) + return false; + if (!track.hasTPC()) + return false; + if (track.tpcNClsCrossedRows() < 70) + return false; + if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < 0.8) + return false; + if (track.tpcChi2NCl() > 4) + return false; + if (track.itsChi2NCl() > 36) + return false; + if (track.eta() < -0.8 || track.eta() > 0.8) + return false; + if (track.pt() < 0.15) + return false; + if (std::fabs(track.dcaXY()) > 0.25) + return false; + if (std::fabs(track.dcaZ()) > 2.0) + return false; + return true; + } + + // single-track selection + template + bool passedTrackSelection(const AntinucleusTrack& track) + { + if (requirePvContributor && !(track.isPVContributor())) + return false; + if (!track.hasITS()) + return false; + if (track.itsNCls() < minItsNclusters) + return false; + if (!track.hasTPC()) + return false; + if (track.tpcNClsCrossedRows() < minTpcNcrossedRows) + return false; + if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < minTpcNcrossedRowsOverFindable) + return false; + if (track.tpcChi2NCl() > maxChiSquareTpc) + return false; + if (track.itsChi2NCl() > maxChiSquareIts) + return false; + if (track.eta() < minEta || track.eta() > maxEta) + return false; + if (track.pt() < minPt) + return false; + + return true; + } + + template + bool isHighPurityAntiproton(const AntiprotonTrack& track) + { + // variables + double nsigmaTPCPr = track.tpcNSigmaPr(); + double nsigmaTOFPr = track.tofNSigmaPr(); + double pt = track.pt(); + + if (pt < 0.5 && std::fabs(nsigmaTPCPr) < 2.0) + return true; + if (pt >= 0.5 && std::fabs(nsigmaTPCPr) < 2.0 && track.hasTOF() && std::fabs(nsigmaTOFPr) < 2.0) + return true; + return false; + } + + double getCorrectedPt(double ptRec) + { + // to be developed + return ptRec; + } + + void getReweightingHistograms(o2::framework::Service const& ccdbObj, TString filepath, TString histname_antip_jet, TString histname_antip_ue) + { + TList* l = ccdbObj->get(filepath.Data()); + if (!l) { + LOGP(error, "Could not open the file {}", Form("%s", filepath.Data())); + return; + } + twoDweightsAntipJet = static_cast(l->FindObject(Form("%s_antiproton", histname_antip_jet.Data()))); + if (!twoDweightsAntipJet) { + LOGP(error, "Could not open histogram {}", Form("%s_antiproton", histname_antip_jet.Data())); + return; + } + twoDweightsAntipUe = static_cast(l->FindObject(Form("%s_antiproton", histname_antip_ue.Data()))); + if (!twoDweightsAntipUe) { + LOGP(error, "Could not open histogram {}", Form("%s_antiproton", histname_antip_ue.Data())); + return; + } + LOGP(info, "Opened histogram {}", Form("%s_antiproton", histname_antip_jet.Data())); + LOGP(info, "Opened histogram {}", Form("%s_antiproton", histname_antip_ue.Data())); + } + + // Process Data + void processData(SelectedCollisions::iterator const& collision, FullNucleiTracks const& tracks) + { + // event counter: before event selection + registryData.fill(HIST("number_of_events_data"), 0.5); + + // event selection + if (!collision.sel8() || std::fabs(collision.posZ()) > zVtx) + return; + + // event counter: after event selection + registryData.fill(HIST("number_of_events_data"), 1.5); + + // loop over reconstructed tracks + int id(-1); + std::vector fjParticles; + for (auto track : tracks) { // o2-linter: disable=[const-ref-in-for-loop] + id++; + if (!passedTrackSelectionForJetReconstruction(track)) + continue; + + // 4-momentum representation of a particle + fastjet::PseudoJet fourMomentum(track.px(), track.py(), track.pz(), track.energy(MassPionCharged)); + fourMomentum.set_user_index(id); + fjParticles.emplace_back(fourMomentum); + } + + // reject empty events + if (fjParticles.size() < 1) + return; + registryData.fill(HIST("number_of_events_data"), 2.5); + + // cluster particles using the anti-kt algorithm + fastjet::JetDefinition jetDef(fastjet::antikt_algorithm, rJet); + fastjet::AreaDefinition areaDef(fastjet::active_area, fastjet::GhostedAreaSpec(1.0)); // active_area_explicit_ghosts + fastjet::ClusterSequenceArea cs(fjParticles, jetDef, areaDef); + std::vector jets = fastjet::sorted_by_pt(cs.inclusive_jets()); + auto [rhoPerp, rhoMPerp] = backgroundSub.estimateRhoPerpCone(fjParticles, jets); + + // loop over reconstructed jets + bool isAtLeastOneJetSelected = false; + for (auto& jet : jets) { // o2-linter: disable=[const-ref-in-for-loop] + + // jet must be fully contained in the acceptance + if ((std::fabs(jet.eta()) + rJet) > (maxEta - 0.5)) + continue; + + // jet pt must be larger than threshold + fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jet, rhoPerp, rhoMPerp); + if (getCorrectedPt(jetMinusBkg.pt()) < minJetPt) + continue; + isAtLeastOneJetSelected = true; + + // get jet constituents + std::vector jetConstituents = jet.constituents(); + o2::aod::ITSResponse itsResponse; + + // loop over jet constituents + for (const auto& particle : jetConstituents) { // o2-linter: disable=[const-ref-in-for-loop] + + // get corresponding track and apply track selection criteria + auto const& track = tracks.iteratorAt(particle.user_index()); + if (!passedTrackSelection(track)) + continue; + + // variables + double nsigmaTPCPr = track.tpcNSigmaPr(); + double nsigmaTOFPr = track.tofNSigmaPr(); + double nsigmaTPCDe = track.tpcNSigmaDe(); + double nsigmaTOFDe = track.tofNSigmaDe(); + double nsigmaTPCHe = track.tpcNSigmaHe(); + double pt = track.pt(); + double dcaxy = track.dcaXY(); + double dcaz = track.dcaZ(); + + // fill DCA distribution for antiprotons + if (track.sign() < 0 && isHighPurityAntiproton(track) && std::fabs(dcaz) < maxDcaz) { + registryData.fill(HIST("antiproton_dca_jet"), pt, dcaxy); + } + + // DCA selections + if (std::fabs(dcaxy) > maxDcaxy || std::fabs(dcaz) > maxDcaz) + continue; + + // particle identification using the ITS cluster size + bool passedItsPidProt(false), passedItsPidDeut(false), passedItsPidHel(false); + if (itsResponse.nSigmaITS(track) > nSigmaItsMin && itsResponse.nSigmaITS(track) < nSigmaItsMax) { + passedItsPidProt = true; + } + if (itsResponse.nSigmaITS(track) > nSigmaItsMin && itsResponse.nSigmaITS(track) < nSigmaItsMax) { + passedItsPidDeut = true; + } + if (itsResponse.nSigmaITS(track) > nSigmaItsMin && itsResponse.nSigmaITS(track) < nSigmaItsMax) { + passedItsPidHel = true; + } + if (!applyItsPid) { + passedItsPidProt = true; + passedItsPidDeut = true; + passedItsPidHel = true; + } + if (pt > ptMaxItsPidProt) + passedItsPidProt = true; + if (pt > ptMaxItsPidDeut) + passedItsPidDeut = true; + if ((2.0 * pt) > ptMaxItsPidHel) + passedItsPidHel = true; + + // antimatter + if (track.sign() < 0) { + if (passedItsPidProt) { + registryData.fill(HIST("antiproton_jet_tpc"), pt, nsigmaTPCPr); + if (nsigmaTPCPr > minNsigmaTpc && nsigmaTPCPr < maxNsigmaTpc && track.hasTOF()) + registryData.fill(HIST("antiproton_jet_tof"), pt, nsigmaTOFPr); + } + if (passedItsPidDeut) { + registryData.fill(HIST("antideuteron_jet_tpc"), pt, nsigmaTPCDe); + if (nsigmaTPCDe > minNsigmaTpc && nsigmaTPCDe < maxNsigmaTpc && track.hasTOF()) + registryData.fill(HIST("antideuteron_jet_tof"), pt, nsigmaTOFDe); + } + if (passedItsPidHel) { + registryData.fill(HIST("antihelium3_jet_tpc"), 2.0 * pt, nsigmaTPCHe); + } + } + + // matter + if (track.sign() > 0) { + if (passedItsPidDeut && nsigmaTPCDe > minNsigmaTpc && nsigmaTPCDe < maxNsigmaTpc && track.hasTOF()) + registryData.fill(HIST("deuteron_jet_tof"), pt, nsigmaTOFDe); + if (passedItsPidHel) { + registryData.fill(HIST("helium3_jet_tpc"), 2.0 * pt, nsigmaTPCHe); + } + } + } + + // perpendicular cone + double coneRadius = std::sqrt(jet.area() / PI); + TVector3 jetAxis(jet.px(), jet.py(), jet.pz()); + TVector3 ueAxis1(0, 0, 0); + TVector3 ueAxis2(0, 0, 0); + getPerpendicularAxis(jetAxis, ueAxis1, +1); + getPerpendicularAxis(jetAxis, ueAxis2, -1); + + for (auto track : tracks) { // o2-linter: disable=[const-ref-in-for-loop] + + // get corresponding track and apply track selection criteria + if (!passedTrackSelection(track)) + continue; + + double deltaEtaUe1 = track.eta() - ueAxis1.Eta(); + double deltaPhiUe1 = getDeltaPhi(track.phi(), ueAxis1.Phi()); + double deltaRUe1 = std::sqrt(deltaEtaUe1 * deltaEtaUe1 + deltaPhiUe1 * deltaPhiUe1); + double deltaEtaUe2 = track.eta() - ueAxis2.Eta(); + double deltaPhiUe2 = getDeltaPhi(track.phi(), ueAxis2.Phi()); + double deltaRUe2 = std::sqrt(deltaEtaUe2 * deltaEtaUe2 + deltaPhiUe2 * deltaPhiUe2); + if (deltaRUe1 > coneRadius && deltaRUe2 > coneRadius) + continue; + + // variables + double nsigmaTPCPr = track.tpcNSigmaPr(); + double nsigmaTOFPr = track.tofNSigmaPr(); + double nsigmaTPCDe = track.tpcNSigmaDe(); + double nsigmaTOFDe = track.tofNSigmaDe(); + double nsigmaTPCHe = track.tpcNSigmaHe(); + double pt = track.pt(); + double dcaxy = track.dcaXY(); + double dcaz = track.dcaZ(); + + // fill DCA distribution for antiprotons + if (track.sign() < 0 && isHighPurityAntiproton(track) && std::fabs(dcaz) < maxDcaz) { + registryData.fill(HIST("antiproton_dca_ue"), pt, dcaxy); + } + + // DCA selections + if (std::fabs(dcaxy) > maxDcaxy || std::fabs(dcaz) > maxDcaz) + continue; + + // particle identification using the ITS cluster size + bool passedItsPidProt(false), passedItsPidDeut(false), passedItsPidHel(false); + if (itsResponse.nSigmaITS(track) > nSigmaItsMin && itsResponse.nSigmaITS(track) < nSigmaItsMax) { + passedItsPidProt = true; + } + if (itsResponse.nSigmaITS(track) > nSigmaItsMin && itsResponse.nSigmaITS(track) < nSigmaItsMax) { + passedItsPidDeut = true; + } + if (itsResponse.nSigmaITS(track) > nSigmaItsMin && itsResponse.nSigmaITS(track) < nSigmaItsMax) { + passedItsPidHel = true; + } + if (!applyItsPid) { + passedItsPidProt = true; + passedItsPidDeut = true; + passedItsPidHel = true; + } + if (pt > ptMaxItsPidProt) + passedItsPidProt = true; + if (pt > ptMaxItsPidDeut) + passedItsPidDeut = true; + if ((2.0 * pt) > ptMaxItsPidHel) + passedItsPidHel = true; + + // antimatter + if (track.sign() < 0) { + if (passedItsPidProt) { + registryData.fill(HIST("antiproton_ue_tpc"), pt, nsigmaTPCPr); + if (nsigmaTPCPr > minNsigmaTpc && nsigmaTPCPr < maxNsigmaTpc && track.hasTOF()) + registryData.fill(HIST("antiproton_ue_tof"), pt, nsigmaTOFPr); + } + if (passedItsPidDeut) { + registryData.fill(HIST("antideuteron_ue_tpc"), pt, nsigmaTPCDe); + if (nsigmaTPCDe > minNsigmaTpc && nsigmaTPCDe < maxNsigmaTpc && track.hasTOF()) + registryData.fill(HIST("antideuteron_ue_tof"), pt, nsigmaTOFDe); + } + if (passedItsPidHel) { + registryData.fill(HIST("antihelium3_ue_tpc"), 2.0 * pt, nsigmaTPCHe); + } + } + + // matter + if (track.sign() > 0) { + if (passedItsPidDeut && nsigmaTPCDe > minNsigmaTpc && nsigmaTPCDe < maxNsigmaTpc && track.hasTOF()) + registryData.fill(HIST("deuteron_ue_tof"), pt, nsigmaTOFDe); + // helium3 + if (passedItsPidHel) { + registryData.fill(HIST("helium3_ue_tpc"), 2.0 * pt, nsigmaTPCHe); + } + } + } + } + if (isAtLeastOneJetSelected) { + registryData.fill(HIST("number_of_events_data"), 3.5); + } + } + PROCESS_SWITCH(AntinucleiInJets, processData, "Process Data", true); + + // Process QC + void processQC(SelectedCollisions::iterator const& collision, FullNucleiTracks const& tracks) + { + // event selection + if (!collision.sel8() || std::fabs(collision.posZ()) > zVtx) + return; + + // loop over reconstructed tracks + std::vector fjParticles; + for (auto track : tracks) { // o2-linter: disable=[const-ref-in-for-loop] + if (!passedTrackSelectionForJetReconstruction(track)) + continue; + + // 4-momentum representation of a particle + fastjet::PseudoJet fourMomentum(track.px(), track.py(), track.pz(), track.energy(MassPionCharged)); + fjParticles.emplace_back(fourMomentum); + } + + // reject empty events + if (fjParticles.size() < 1) + return; + + // cluster particles using the anti-kt algorithm + fastjet::JetDefinition jetDef(fastjet::antikt_algorithm, rJet); + fastjet::AreaDefinition areaDef(fastjet::active_area, fastjet::GhostedAreaSpec(1.0)); // active_area_explicit_ghosts + fastjet::ClusterSequenceArea cs(fjParticles, jetDef, areaDef); + std::vector jets = fastjet::sorted_by_pt(cs.inclusive_jets()); + auto [rhoPerp, rhoMPerp] = backgroundSub.estimateRhoPerpCone(fjParticles, jets); + + // loop over reconstructed jets + int njetsInAcc(0); + int njetsHighPt(0); + for (auto& jet : jets) { // o2-linter: disable=[const-ref-in-for-loop] + + // jet must be fully contained in the acceptance + if ((std::fabs(jet.eta()) + rJet) > (maxEta - 0.5)) + continue; + njetsInAcc++; + + // jet pt must be larger than threshold + fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jet, rhoPerp, rhoMPerp); + if (getCorrectedPt(jetMinusBkg.pt()) < minJetPt) + continue; + njetsHighPt++; + + // jet properties and perpendicular cone + std::vector jetConstituents = jet.constituents(); + TVector3 jetAxis(jet.px(), jet.py(), jet.pz()); + double coneRadius = std::sqrt(jet.area() / PI); + TVector3 ueAxis1(0, 0, 0); + TVector3 ueAxis2(0, 0, 0); + getPerpendicularAxis(jetAxis, ueAxis1, +1); + getPerpendicularAxis(jetAxis, ueAxis2, -1); + + registryQC.fill(HIST("jetEffectiveArea"), jet.area() / (PI * rJet * rJet)); + registryQC.fill(HIST("NchJetCone"), static_cast(jetConstituents.size())); + registryQC.fill(HIST("sumPtJetCone"), jet.pt()); + + // loop over jet constituents + for (const auto& particle : jetConstituents) { // o2-linter: disable=[const-ref-in-for-loop] + + double deltaEta = particle.eta() - jetAxis.Eta(); + double deltaPhi = getDeltaPhi(particle.phi(), jetAxis.Phi()); + registryQC.fill(HIST("deltaEta_deltaPhi_jet"), deltaEta, deltaPhi); + } + + // loop over particles in perpendicular cones + double nParticlesPerp(0); + double ptPerp(0); + for (auto track : tracks) { // o2-linter: disable=[const-ref-in-for-loop] + + if (!passedTrackSelectionForJetReconstruction(track)) + continue; + + double deltaEtaUe1 = track.eta() - ueAxis1.Eta(); + double deltaPhiUe1 = getDeltaPhi(track.phi(), ueAxis1.Phi()); + double deltaRUe1 = std::sqrt(deltaEtaUe1 * deltaEtaUe1 + deltaPhiUe1 * deltaPhiUe1); + double deltaEtaUe2 = track.eta() - ueAxis2.Eta(); + double deltaPhiUe2 = getDeltaPhi(track.phi(), ueAxis2.Phi()); + double deltaRUe2 = std::sqrt(deltaEtaUe2 * deltaEtaUe2 + deltaPhiUe2 * deltaPhiUe2); + if (deltaRUe1 > coneRadius && deltaRUe2 > coneRadius) + continue; + + ptPerp = ptPerp + track.pt(); + nParticlesPerp++; + registryQC.fill(HIST("deltaEta_deltaPhi_ue"), deltaEtaUe1, deltaPhiUe1); + registryQC.fill(HIST("deltaEta_deltaPhi_ue"), deltaEtaUe2, deltaPhiUe2); + } + registryQC.fill(HIST("NchUE"), 0.5 * nParticlesPerp); + registryQC.fill(HIST("NchJet"), static_cast(jetConstituents.size()) - 0.5 * nParticlesPerp); + registryQC.fill(HIST("sumPtUE"), 0.5 * ptPerp); + registryQC.fill(HIST("sumPtJet"), jet.pt() - 0.5 * ptPerp); + } + registryQC.fill(HIST("nJetsFound"), static_cast(jets.size())); + registryQC.fill(HIST("nJetsInAcceptance"), njetsInAcc); + registryQC.fill(HIST("nJetsSelectedHighPt"), njetsHighPt); + } + PROCESS_SWITCH(AntinucleiInJets, processQC, "Process QC", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} From db50e37863347b61c5db53e8a4f7ad98b1ed3b29 Mon Sep 17 00:00:00 2001 From: Chiara Pinto <48326672+chiarapinto@users.noreply.github.com> Date: Sat, 15 Feb 2025 17:47:02 +0100 Subject: [PATCH 0239/1650] [PWGLF] added selection of events used for EP calibration (#9984) --- PWGLF/TableProducer/Nuspex/hyperRecoTask.cxx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/PWGLF/TableProducer/Nuspex/hyperRecoTask.cxx b/PWGLF/TableProducer/Nuspex/hyperRecoTask.cxx index 5d176dfecba..0bf77ee8724 100644 --- a/PWGLF/TableProducer/Nuspex/hyperRecoTask.cxx +++ b/PWGLF/TableProducer/Nuspex/hyperRecoTask.cxx @@ -155,6 +155,7 @@ struct hyperRecoTask { Configurable nTPCClusMinPi{"nTPCClusMinPi", -1., "pion NTPC clusters cut"}; Configurable mcSignalOnly{"mcSignalOnly", true, "If true, save only signal in MC"}; Configurable cfgSkimmedProcessing{"cfgSkimmedProcessing", false, "Skimmed dataset processing"}; + Configurable isEventUsedForEPCalibration{"isEventUsedForEPCalibration", 1, "Event is used for EP calibration"}; // Define o2 fitter, 2-prong, active memory (no need to redefine per event) o2::vertexing::DCAFitterN<2> fitter; @@ -699,6 +700,9 @@ struct hyperRecoTask { for (auto& hypCand : hyperCandidates) { auto collision = collisions.rawIteratorAt(hypCand.collisionID); + if (isEventUsedForEPCalibration && !collision.triggereventep()) { + return; + } float trackedHypClSize = !trackedClSize.empty() ? trackedClSize[hypCand.v0ID] : 0; outputDataTableWithFlow(collision.centFT0A(), collision.centFT0C(), collision.centFT0M(), collision.psiFT0A(), collision.multFT0A(), From be14c143e0642dad367a3c711563098045394711 Mon Sep 17 00:00:00 2001 From: mhartung71 <50153519+mhartung71@users.noreply.github.com> Date: Sat, 15 Feb 2025 18:59:46 +0100 Subject: [PATCH 0240/1650] [PWGLF] Update double hypernuclei tree (#9982) --- PWGLF/TableProducer/Nuspex/hypKfRecoTask.cxx | 31 ++++++++++--------- .../TableProducer/Nuspex/hypKfTreeCreator.cxx | 11 ++++--- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/hypKfRecoTask.cxx b/PWGLF/TableProducer/Nuspex/hypKfRecoTask.cxx index 57ec616e7fe..68e334f5766 100644 --- a/PWGLF/TableProducer/Nuspex/hypKfRecoTask.cxx +++ b/PWGLF/TableProducer/Nuspex/hypKfRecoTask.cxx @@ -475,6 +475,7 @@ struct HypKfRecoTask { const AxisSpec axisdEdx{2000, 0, 2000, "d#it{E}/d#it{x}"}; const AxisSpec axisInvMass{1000, 1, 6, "inv mass"}; const AxisSpec axisCent{100, 0, 100, "centrality"}; + const AxisSpec axisOccupancy{5000, 0, 50000, "occupancy"}; const AxisSpec axisVtxZ{100, -10, 10, "z"}; // create histograms histos.add("histMagField", "histMagField", kTH1F, {axisMagField}); @@ -483,6 +484,7 @@ struct HypKfRecoTask { histos.add("histCentFT0A", "histCentFT0A", kTH1F, {axisCent}); histos.add("histCentFT0C", "histCentFT0C", kTH1F, {axisCent}); histos.add("histCentFT0M", "histCentFT0M", kTH1F, {axisCent}); + histos.add("histEvents", "histEvents", kTH2F, {axisCent, axisOccupancy}); hDeDx.resize(2 * nDaughterParticles + 2); for (int i = 0; i < nDaughterParticles + 1; i++) { TString histName = i < nDaughterParticles ? daughterParticles[i].name : "all"; @@ -870,7 +872,7 @@ struct HypKfRecoTask { for (auto& hypCand : candidateVector->at(hyperNucIter)) { // o2-linter: disable=[const-ref-in-for-loop] if (!hypCand.isPrimaryCandidate && !hypCand.isUsedSecondary && !hypCand.isCascade()) continue; - if (saveOnlyMcTrue && !hypCand.mcTrue) + if (saveOnlyMcTrue && !hypCand.mcTrue && !hypCand.isCascade()) continue; hInvMass[vec * nHyperNuclei + hyperNucIter]->Fill(hypCand.mass); std::vector vecDaugtherTracks, vecAddons, vecSubDaughters; @@ -1107,14 +1109,15 @@ struct HypKfRecoTask { histos.fill(HIST("histMagField"), dBz); histos.fill(HIST("histNev"), 0.5); collPassedEvSel = collision.sel8() && std::abs(collision.posZ()) < 10; + occupancy = collision.trackOccupancyInTimeRange(); if (collPassedEvSel) { histos.fill(HIST("histNev"), 1.5); histos.fill(HIST("histVtxZ"), collision.posZ()); histos.fill(HIST("histCentFT0A"), collision.centFT0A()); histos.fill(HIST("histCentFT0C"), collision.centFT0C()); histos.fill(HIST("histCentFT0M"), collision.centFT0M()); + histos.fill(HIST("histEvents"), collision.centFT0C(), occupancy); } - occupancy = collision.trackOccupancyInTimeRange(); kfPrimVtx = createKFPVertexFromCollision(collision); primVtx.assign({collision.posX(), collision.posY(), collision.posZ()}); cents.assign({collision.centFT0A(), collision.centFT0C(), collision.centFT0M()}); @@ -1139,18 +1142,18 @@ struct HypKfRecoTask { if (!track.hasTPC()) return -999; - if (particle.name == "pion" && cfgTrackPIDsettings->get("pion", "useBBparams") == 0) - return track.tpcNSigmaPi(); - if (particle.name == "proton" && cfgTrackPIDsettings->get("proton", "useBBparams") == 0) - return track.tpcNSigmaPr(); - if (particle.name == "deuteron" && cfgTrackPIDsettings->get("deuteron", "useBBparams") == 0) - return track.tpcNSigmaDe(); - if (particle.name == "triton" && cfgTrackPIDsettings->get("triton", "useBBparams") == 0) - return track.tpcNSigmaTr(); - if (particle.name == "helion" && cfgTrackPIDsettings->get("helion", "useBBparams") == 0) - return track.tpcNSigmaHe(); - if (particle.name == "alpha" && cfgTrackPIDsettings->get("alpha", "useBBparams") == 0) - return track.tpcNSigmaAl(); + if (particle.name == "pion" && cfgTrackPIDsettings->get("pion", "useBBparams") < 1) + return cfgTrackPIDsettings->get("pion", "useBBparams") == 0 ? track.tpcNSigmaPi() : 0; + if (particle.name == "proton" && cfgTrackPIDsettings->get("proton", "useBBparams") < 1) + return cfgTrackPIDsettings->get("proton", "useBBparams") == 0 ? track.tpcNSigmaPr() : 0; + if (particle.name == "deuteron" && cfgTrackPIDsettings->get("deuteron", "useBBparams") < 1) + return cfgTrackPIDsettings->get("deuteron", "useBBparams") == 0 ? track.tpcNSigmaDe() : 0; + if (particle.name == "triton" && cfgTrackPIDsettings->get("triton", "useBBparams") < 1) + return cfgTrackPIDsettings->get("triton", "useBBparams") == 0 ? track.tpcNSigmaTr() : 0; + if (particle.name == "helion" && cfgTrackPIDsettings->get("helion", "useBBparams") < 1) + return cfgTrackPIDsettings->get("helion", "useBBparams") == 0 ? track.tpcNSigmaHe() : 0; + if (particle.name == "alpha" && cfgTrackPIDsettings->get("alpha", "useBBparams") < 1) + return cfgTrackPIDsettings->get("alpha", "useBBparams") == 0 ? track.tpcNSigmaAl() : 0; double expBethe{tpc::BetheBlochAleph(static_cast(particle.charge * rigidity / particle.mass), particle.betheParams[0], particle.betheParams[1], particle.betheParams[2], particle.betheParams[3], particle.betheParams[4])}; double expSigma{expBethe * particle.resolution}; diff --git a/PWGLF/TableProducer/Nuspex/hypKfTreeCreator.cxx b/PWGLF/TableProducer/Nuspex/hypKfTreeCreator.cxx index 167336aa7c7..da8316e3c8d 100644 --- a/PWGLF/TableProducer/Nuspex/hypKfTreeCreator.cxx +++ b/PWGLF/TableProducer/Nuspex/hypKfTreeCreator.cxx @@ -56,10 +56,10 @@ struct TrackProperties { }; struct HyperNucleus { - HyperNucleus() : pdgCode(0), isReconstructed(0), globalIndex(0), species(0), isMatter(0), passedEvSel(0), isMatterMC(0), passedEvSelMC(0), isPhysicalPrimary(0), collisionMcTrue(0), mass(0), y(0), pt(0), ct(0), yGen(0), ptGen(0), ctGen(0), cpaPvGen(0), cpaPv(0), cpaSv(0), maxDcaTracks(0), maxDcaTracksSv(0), dcaToPvXY(0), dcaToPvZ(0), dcaToVtxXY(0), dcaToVtxZ(0), devToPvXY(0), chi2(0), pvx(0), pvy(0), pvz(0), svx(0), svy(0), svz(0), px(0), py(0), pz(0), pvxGen(0), pvyGen(0), pvzGen(0), svxGen(0), svyGen(0), svzGen(0), pxGen(0), pyGen(0), pzGen(0), nSingleDaughters(0), nCascadeDaughters(0), mcTrue(0), mcTrueVtx(0), mcPhysicalPrimary(0), hypNucDaughter(0) {} + HyperNucleus() : pdgCode(0), isReconstructed(0), globalIndex(0), species(0), isPrimaryCandidate(0), isMatter(0), passedEvSel(0), isMatterMC(0), passedEvSelMC(0), isPhysicalPrimary(0), collisionMcTrue(0), mass(0), y(0), pt(0), ct(0), yGen(0), ptGen(0), ctGen(0), cpaPvGen(0), cpaPv(0), cpaSv(0), maxDcaTracks(0), maxDcaTracksSv(0), dcaToPvXY(0), dcaToPvZ(0), dcaToVtxXY(0), dcaToVtxZ(0), devToPvXY(0), chi2(0), pvx(0), pvy(0), pvz(0), svx(0), svy(0), svz(0), px(0), py(0), pz(0), pvxGen(0), pvyGen(0), pvzGen(0), svxGen(0), svyGen(0), svzGen(0), pxGen(0), pyGen(0), pzGen(0), nSingleDaughters(0), nCascadeDaughters(0), mcTrue(0), mcTrueVtx(0), mcPhysicalPrimary(0), hypNucDaughter(0) {} int pdgCode, isReconstructed, globalIndex; uint8_t species; - bool isMatter, passedEvSel, isMatterMC, passedEvSelMC, isPhysicalPrimary, collisionMcTrue; + bool isPrimaryCandidate, isMatter, passedEvSel, isMatterMC, passedEvSelMC, isPhysicalPrimary, collisionMcTrue; float mass, y, pt, ct, yGen, ptGen, ctGen, cpaPvGen, cpaPv, cpaSv, maxDcaTracks, maxDcaTracksSv; float dcaToPvXY, dcaToPvZ, dcaToVtxXY, dcaToVtxZ, devToPvXY, chi2; float pvx, pvy, pvz, svx, svy, svz, px, py, pz; @@ -360,7 +360,7 @@ struct HypKfTreeCreator { void processData(aod::HypKfHypNucs const& hypNucs, aod::HypKfColls const& hypKfColls, aod::HypKfTracks const& hypKfTrks, aod::HypKfDaughtAdds const& hypKfDAdd, aod::HypKfSubDs const& hypKfDSub) { for (const auto& hypNuc : hypNucs) { - if (std::abs(hypNuc.species()) != cfgSpecies) + if (cfgSpecies && std::abs(hypNuc.species()) != cfgSpecies) continue; HyperNucleus candidate, hypNucDaughter; fillCandidatePrim(candidate, hypNuc, hypNucs, hypKfColls, hypKfTrks, hypKfDAdd, hypKfDSub); @@ -409,7 +409,7 @@ struct HypKfTreeCreator { d2.x, d2.y, d2.z, d2.px, d2.py, d2.pz, d2.tpcNcls, d2.tpcChi2, d2.itsNcls, d2.itsChi2, d2.itsMeanClsSizeL, d2.rigidity, d2.tpcSignal, d2.tpcNsigma, d2.tpcNsigmaNhp, d2.tpcNsigmaNlp, d2.tofMass, d2.dcaXY, d2.dcaZ, d2.isPvContributor); } - if (cfgNprimDaughters == 3 && cfgNsecDaughters == 0) { + if (cand.isPrimaryCandidate && ((cfgNprimDaughters == 3 && cfgNsecDaughters == 0) || (cfgNsecDaughters == 3 && cfgSpecies == 0))) { const auto& d1 = cand.daughterTracks.at(0); const auto& d2 = cand.daughterTracks.at(1); const auto& d3 = cand.daughterTracks.at(2); @@ -545,6 +545,7 @@ struct HypKfTreeCreator { auto addOns = hypNuc.hypKfDaughtAdd_as(); auto posVec = posVector(addOns); cand.species = std::abs(hypNuc.species()); + cand.isPrimaryCandidate = hypNuc.primary(); cand.isMatter = hypNuc.isMatter(); cand.cent = coll.centFT0C(); cand.occu = coll.occupancy(); @@ -619,7 +620,7 @@ struct HypKfTreeCreator { { isMC = true; for (const auto& mcHypNuc : mcHypNucs) { - if (std::abs(mcHypNuc.species()) != cfgSpecies) + if (cfgSpecies && std::abs(mcHypNuc.species()) != cfgSpecies) continue; auto mcColl = mcHypNuc.hypKfMcColl(); const auto mcParticleIdx = mcHypNuc.globalIndex(); From 7b60ecfb90cbfca2a19581dc7472b48eccae01e7 Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Sat, 15 Feb 2025 21:24:35 +0100 Subject: [PATCH 0241/1650] [Common] Further QA test output added (#9986) Co-authored-by: ALICE Builder --- Common/Tasks/flowTest.cxx | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Common/Tasks/flowTest.cxx b/Common/Tasks/flowTest.cxx index 9d5423b65fc..1a0c93ef7ee 100644 --- a/Common/Tasks/flowTest.cxx +++ b/Common/Tasks/flowTest.cxx @@ -43,6 +43,9 @@ struct flowTest { Configurable maxB{"maxB", 20.0f, "max impact parameter"}; Configurable pdgSelection{"pdgSelection", 0, "pdg code selection for tracking study (0: no selection)"}; + Configurable analysisMinimumITSClusters{"analysisMinimumITSClusters", 5, "minimum ITS clusters for analysis track category"}; + Configurable analysisMinimumTPCClusters{"analysisMinimumTPCClusters", 70, "minimum TPC clusters for analysis track category"}; + ConfigurableAxis axisB{"axisB", {100, 0.0f, 20.0f}, ""}; ConfigurableAxis axisPhi{"axisPhi", {100, 0.0f, 2.0f * TMath::Pi()}, ""}; ConfigurableAxis axisNch{"axisNch", {300, 0.0f, 3000.0f}, "Nch in |eta|<0.8"}; @@ -60,6 +63,8 @@ struct flowTest { histos.add("hBVsPtVsPhiGenerated", "hBVsPtVsPhiGenerated", HistType::kTH3D, {axisB, axisPhi, axisPt}); histos.add("hBVsPtVsPhiGlobal", "hBVsPtVsPhiGlobal", HistType::kTH3D, {axisB, axisPhi, axisPt}); histos.add("hBVsPtVsPhiGlobalFake", "hBVsPtVsPhiGlobalFake", HistType::kTH3D, {axisB, axisPhi, axisPt}); + histos.add("hBVsPtVsPhiAnalysis", "hBVsPtVsPhiAnalysis", HistType::kTH3D, {axisB, axisPhi, axisPt}); + histos.add("hBVsPtVsPhiAnalysisFake", "hBVsPtVsPhiAnalysisFake", HistType::kTH3D, {axisB, axisPhi, axisPt}); histos.add("hBVsPtVsPhiAny", "hBVsPtVsPhiAny", HistType::kTH3D, {axisB, axisPhi, axisPt}); histos.add("hBVsPtVsPhiTPCTrack", "hBVsPtVsPhiTPCTrack", HistType::kTH3D, {axisB, axisPhi, axisPt}); histos.add("hBVsPtVsPhiITSTrack", "hBVsPtVsPhiITSTrack", HistType::kTH3D, {axisB, axisPhi, axisPt}); @@ -126,6 +131,8 @@ struct flowTest { bool validITSTrackFake = false; bool validITSABTrack = false; bool validITSABTrackFake = false; + bool validAnalysisTrack = false; + bool validAnalysisTrackFake = false; if (mcParticle.has_tracks()) { auto const& tracks = mcParticle.tracks_as(); for (auto const& track : tracks) { @@ -137,6 +144,12 @@ struct flowTest { } } + if (track.tpcNClsFound() >= analysisMinimumTPCClusters && track.itsNCls() >= analysisMinimumITSClusters) { + validAnalysisTrack = true; + if (isITSFake) { + validAnalysisTrackFake = true; + } + } if (track.hasTPC() && track.hasITS()) { validGlobal = true; if (isITSFake) { @@ -172,6 +185,12 @@ struct flowTest { if (validGlobalFake) { histos.fill(HIST("hBVsPtVsPhiGlobalFake"), imp, deltaPhi, mcParticle.pt()); } + if (validAnalysisTrack) { + histos.fill(HIST("hBVsPtVsPhiAnalysis"), imp, deltaPhi, mcParticle.pt()); + } + if (validAnalysisTrackFake) { + histos.fill(HIST("hBVsPtVsPhiAnalysisFake"), imp, deltaPhi, mcParticle.pt()); + } // if any track present, fill if (validTrack) histos.fill(HIST("hBVsPtVsPhiAny"), imp, deltaPhi, mcParticle.pt()); From d74869ac49d49a04b3b12155e1ea0c507b2c3976 Mon Sep 17 00:00:00 2001 From: Yash Patley <52608802+yashpatley@users.noreply.github.com> Date: Sun, 16 Feb 2025 04:08:02 +0530 Subject: [PATCH 0242/1650] [PWGCF] Update lambdaR2Correlation.cxx (#9977) --- .../Tasks/lambdaR2Correlation.cxx | 160 ++++++++---------- 1 file changed, 66 insertions(+), 94 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx index 58a6efca60d..e4bec628913 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx @@ -23,6 +23,7 @@ #include "Framework/ASoAHelpers.h" #include "Framework/runDataProcessing.h" #include "PWGLF/DataModel/LFStrangenessTables.h" +#include "PWGLF/DataModel/mcCentrality.h" #include "CommonConstants/PhysicsConstants.h" #include "Common/Core/RecoDecay.h" #include "CCDB/BasicCCDBManager.h" @@ -134,8 +135,7 @@ using LambdaMcGenTrack = LambdaMcGenTracks::iterator; enum CollisionLabels { kTotColBeforeHasMcCollision = 1, kTotCol, - kPassSelCol, - kPassMultSelCol + kPassSelCol }; enum TrackLabels { @@ -281,6 +281,9 @@ struct LambdaTableProducer { {"hEffVsPtYVzLambda", "hEffVsPtYVzAntiLambda"}, {"hEffVsPtEtaVzLambda", "hEffVsPtEtaVzAntiLambda"}}; + // Initialize Global Variables + float cent = 0.; + void init(InitContext const&) { // Set CCDB url @@ -367,7 +370,7 @@ struct LambdaTableProducer { histos.addClone("McRec/Lambda/", "McRec/AntiLambda/"); // MC Generated Histograms - if (doprocessMCGenRun3 || doprocessMCGenRun2) { + if (doprocessMCRun3 || doprocessMCRun2) { // McReco Histos histos.add("Tracks/h2f_tracks_pid_before_sel", "PIDs", kTH2F, {axisPID, axisV0Pt}); histos.add("Tracks/h2f_tracks_pid_after_sel", "PIDs", kTH2F, {axisPID, axisV0Pt}); @@ -376,8 +379,9 @@ struct LambdaTableProducer { histos.add("Tracks/h2f_lambda_from_omega", "PIDs", kTH2F, {axisPID, axisV0Pt}); // McGen Histos + histos.add("McGen/h1f_collision_recgen", "# of Reco Collision Associated to One Mc Generator Collision", kTH1F, {axisMult}); histos.add("McGen/h1f_collisions_info", "# of collisions", kTH1F, {axisCols}); - histos.add("McGen/h1f_collision_posZ", "V_{z}-distribution", kTH1F, {axisVz}); + histos.add("McGen/h2f_collision_posZ", "V_{z}-distribution", kTH2F, {axisVz, axisVz}); histos.add("McGen/h1f_lambda_daughter_PDG", "PDG Daughters", kTH1F, {axisPID}); histos.add("McGen/h1f_antilambda_daughter_PDG", "PDG Daughters", kTH1F, {axisPID}); @@ -396,7 +400,6 @@ struct LambdaTableProducer { histos.get(HIST("Events/h1f_collisions_info"))->GetXaxis()->SetBinLabel(CollisionLabels::kTotColBeforeHasMcCollision, "kTotColBeforeHasMcCollision"); histos.get(HIST("McGen/h1f_collisions_info"))->GetXaxis()->SetBinLabel(CollisionLabels::kTotCol, "kTotCol"); histos.get(HIST("McGen/h1f_collisions_info"))->GetXaxis()->SetBinLabel(CollisionLabels::kPassSelCol, "kPassSelCol"); - histos.get(HIST("McGen/h1f_collisions_info"))->GetXaxis()->SetBinLabel(CollisionLabels::kPassMultSelCol, "kPassMultSelCol"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kTracksBeforeHasMcParticle, "kTracksBeforeHasMcParticle"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kNotPrimaryLambda, "kNotPrimaryLambda"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kNotSecondaryLambda, "kNotSecondaryLambda"); @@ -412,7 +415,6 @@ struct LambdaTableProducer { // set bin labels histos.get(HIST("Events/h1f_collisions_info"))->GetXaxis()->SetBinLabel(CollisionLabels::kTotCol, "kTotCol"); histos.get(HIST("Events/h1f_collisions_info"))->GetXaxis()->SetBinLabel(CollisionLabels::kPassSelCol, "kPassSelCol"); - histos.get(HIST("Events/h1f_collisions_info"))->GetXaxis()->SetBinLabel(CollisionLabels::kPassMultSelCol, "kPassMultSelCol"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kAllV0Tracks, "kAllV0Tracks"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kV0KShortMassRej, "kV0KShortMassRej"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kNotLambdaNotAntiLambda, "kNotLambdaNotAntiLambda"); @@ -432,24 +434,31 @@ struct LambdaTableProducer { template bool selCollision(C const& col) { + // VtxZ Selection if (col.posZ() <= cMinZVtx || col.posZ() >= cMaxZVtx) { return false; } - if constexpr (run == kRun3) { + if constexpr (run == kRun3) { // Run3 Min-Bias Trigger + cent = col.centFT0M(); if (cSel8Trig && !col.sel8()) { return false; } - } else { + } else { // Run2 Min-Bias Trigger + cent = col.centRun2V0M(); if (cInt7Trig && !col.alias_bit(kINT7)) { return false; } - if (cSel7Trig && !col.sel7()) { return false; } } + // Multiplicity Selection + if (cent <= cMinMult || cent >= cMaxMult) { + return false; + } + if (cTriggerTvxSel && !col.selection_bit(aod::evsel::kIsTriggerTVX)) { return false; } @@ -850,39 +859,20 @@ struct LambdaTableProducer { template void fillLambdaRecoTables(C const& collision, V const& v0tracks, T const& tracks) { - // Check for corresponding MC Collision - if constexpr (dmc == kMC) { - histos.fill(HIST("Events/h1f_collisions_info"), kTotColBeforeHasMcCollision); - if (!collision.has_mcCollision()) { - return; - } - } - + // Total Collisions histos.fill(HIST("Events/h1f_collisions_info"), kTotCol); - // Select Collision - if (!selCollision(collision)) { - return; + // Select Collision (Only for Data... McRec has been selected already !!!) + if constexpr (dmc == kData) { + if (!selCollision(collision)) { + return; + } } histos.fill(HIST("Events/h1f_collisions_info"), kPassSelCol); histos.fill(HIST("Events/h1f_collision_posZ"), collision.posZ()); - float cent = 0.; - - if constexpr (run == kRun3) { - cent = collision.centFT0M(); - } else { - cent = collision.centRun2V0M(); - } - - // Multiplicity Selection - if (cent <= cMinMult || cent >= cMaxMult) { - return; - } - - histos.fill(HIST("Events/h1f_collisions_info"), kPassMultSelCol); - + // Fill Collision Table lambdaCollisionTable(cent, collision.posX(), collision.posY(), collision.posZ()); // initialize v0track objects @@ -946,33 +936,10 @@ struct LambdaTableProducer { // MC Generater Level Tables template - void fillLambdaMcGenTables(C const& collision, M const& mcParticles) + void fillLambdaMcGenTables(C const& mcCollision, M const& mcParticles) { - histos.fill(HIST("McGen/h1f_collisions_info"), kTotCol); - - // Select Collision - if (!collision.has_mcCollision() || !selCollision(collision)) { - return; - } - - histos.fill(HIST("McGen/h1f_collisions_info"), kPassSelCol); - - float cent = 0.; - if constexpr (run == kRun3) { - cent = collision.centFT0M(); - } else { - cent = collision.centRun2V0M(); - } - - // Multiplicity Selection - if (cent <= cMinMult || cent >= cMaxMult) { - return; - } - - histos.fill(HIST("McGen/h1f_collisions_info"), kPassMultSelCol); - // Fill McGen Collision Table - lambdaMCGenCollisionTable(cent, collision.posX(), collision.posY(), collision.posZ()); + lambdaMCGenCollisionTable(mcCollision.centFT0M(), mcCollision.posX(), mcCollision.posY(), mcCollision.posZ()); // initialize track objects ParticleType v0Type = kLambda; @@ -1074,6 +1041,33 @@ struct LambdaTableProducer { } } + template + void analyzeMcRecoGen(M const& mcCollision, C const& collisions, V const& V0s, T const& tracks, P const& mcParticles) + { + // Number of Rec Collisions Associated to One Mc Gen Collision + int nRecCols = collisions.size(); + if (nRecCols != 0) { + histos.fill(HIST("McGen/h1f_collision_recgen"), nRecCols); + } + // Do not analyze if more than one reco collision is accociated to one mc gen collision + if (nRecCols != 1) { + return; + } + histos.fill(HIST("McGen/h1f_collisions_info"), kTotCol); + // Check the reco collision + if (!collisions.begin().has_mcCollision() || !selCollision(collisions.begin()) || collisions.begin().mcCollisionId() != mcCollision.globalIndex()) { + return; + } + histos.fill(HIST("McGen/h1f_collisions_info"), kPassSelCol); + histos.fill(HIST("McGen/h2f_collision_posZ"), mcCollision.posZ(), collisions.begin().posZ()); + auto v0Tracks = V0s.sliceBy(perCollision, collisions.begin().globalIndex()); + fillLambdaRecoTables(collisions.begin(), v0Tracks, tracks); + fillLambdaMcGenTables(mcCollision, mcParticles); + } + + SliceCache cache; + Preslice> perCollision = aod::track::collisionId; + using CollisionsRun3 = soa::Join; using CollisionsRun2 = soa::Join; using Tracks = soa::Join; @@ -1094,47 +1088,25 @@ struct LambdaTableProducer { PROCESS_SWITCH(LambdaTableProducer, processDataRun2, "Process for Run2 DATA", false); - void processMCRecoRun3(soa::Join::iterator const& collision, - aod::McCollisions const&, - McV0Tracks const& V0s, TracksMC const& tracks, - aod::McParticles const&) + void processMCRun3(soa::Join::iterator const& mcCollision, + soa::SmallGroups> const& collisions, + McV0Tracks const& V0s, TracksMC const& tracks, + aod::McParticles const& mcParticles) { - fillLambdaRecoTables(collision, V0s, tracks); + analyzeMcRecoGen(mcCollision, collisions, V0s, tracks, mcParticles); } - PROCESS_SWITCH(LambdaTableProducer, processMCRecoRun3, "Process for Run3 MC Reconstructed", false); + PROCESS_SWITCH(LambdaTableProducer, processMCRun3, "Process for Run3 MC Generated", false); - void processMCRecoRun2(soa::Join::iterator const& collision, - aod::McCollisions const&, - McV0Tracks const& V0s, TracksMC const& tracks, - aod::McParticles const&) + void processMCRun2(soa::Join::iterator const& mcCollision, + soa::SmallGroups> const& collisions, + McV0Tracks const& V0s, TracksMC const& tracks, + aod::McParticles const& mcParticles) { - fillLambdaRecoTables(collision, V0s, tracks); - } - - PROCESS_SWITCH(LambdaTableProducer, processMCRecoRun2, "Process for Run2 MC Reconstructed", false); - - void processMCGenRun3(aod::McCollisions::iterator const&, - soa::SmallGroups> const& collisions, - aod::McParticles const& mcParticles) - { - for (auto const& collision : collisions) { - fillLambdaMcGenTables(collision, mcParticles); - } - } - - PROCESS_SWITCH(LambdaTableProducer, processMCGenRun3, "Process for Run3 MC Generated", false); - - void processMCGenRun2(aod::McCollisions::iterator const&, - soa::SmallGroups> const& collisions, - aod::McParticles const& mcParticles) - { - for (auto const& collision : collisions) { - fillLambdaMcGenTables(collision, mcParticles); - } + analyzeMcRecoGen(mcCollision, collisions, V0s, tracks, mcParticles); } - PROCESS_SWITCH(LambdaTableProducer, processMCGenRun2, "Process for Run2 MC Generated", false); + PROCESS_SWITCH(LambdaTableProducer, processMCRun2, "Process for Run2 MC Generated", false); }; struct LambdaTracksExtProducer { From 637b9d9c23be72f3ed01f14fc7c8f2b92dc0fbb2 Mon Sep 17 00:00:00 2001 From: Junlee Kim Date: Sat, 15 Feb 2025 23:41:18 +0100 Subject: [PATCH 0243/1650] [PWGCF] adding ML selection in the correlations task (#9968) Co-authored-by: ALICE Action Bot --- PWGCF/Tasks/correlations.cxx | 92 ++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/PWGCF/Tasks/correlations.cxx b/PWGCF/Tasks/correlations.cxx index 25bd72aff28..10dc955abdb 100644 --- a/PWGCF/Tasks/correlations.cxx +++ b/PWGCF/Tasks/correlations.cxx @@ -96,6 +96,9 @@ struct CorrelationTask { O2_DEFINE_CONFIGURABLE(cfgMassAxis, int, 0, "Use invariant mass axis (0 = OFF, 1 = ON)") O2_DEFINE_CONFIGURABLE(cfgMcTriggerPDGs, std::vector, {}, "MC PDG codes to use exclusively as trigger particles and exclude from associated particles. Empty = no selection.") + O2_DEFINE_CONFIGURABLE(cfgPtDepMLbkg, std::vector, {}, "pT interval for ML training") + O2_DEFINE_CONFIGURABLE(cfgPtCentDepMLbkgSel, std::vector, {}, "Bkg ML selection") + ConfigurableAxis axisVertex{"axisVertex", {7, -7, 7}, "vertex axis for histograms"}; ConfigurableAxis axisDeltaPhi{"axisDeltaPhi", {72, -PIHalf, PIHalf * 3}, "delta phi axis for histograms"}; ConfigurableAxis axisDeltaEta{"axisDeltaEta", {40, -2, 2}, "delta eta axis for histograms"}; @@ -324,6 +327,8 @@ struct CorrelationTask { using HasProng0Id = decltype(std::declval().cfTrackProng0Id()); template using HasProng1Id = decltype(std::declval().cfTrackProng1Id()); + template + using HasMlProbD0 = decltype(std::declval().mlProbD0()); template void fillCorrelations(TTarget target, TTracks1& tracks1, TTracks2& tracks2, float multiplicity, float posZ, int magField, float eventWeight) @@ -371,6 +376,18 @@ struct CorrelationTask { } } + if constexpr (std::experimental::is_detected::value) { + if (doprocessSame2Prong2ProngML || doprocessMixed2Prong2ProngML) { + auto it = std::lower_bound(cfgPtDepMLbkg->begin(), cfgPtDepMLbkg->end(), track1.pt()); + int idx = std::distance(cfgPtDepMLbkg->begin(), it) - 1; + if (track1.decay() == 0 && track1.mlProbD0()[0] > cfgPtCentDepMLbkgSel->at(idx)) { + continue; + } else if (track1.decay() == 1 && track1.mlProbD0bar()[0] > cfgPtCentDepMLbkgSel->at(idx)) { + continue; + } + } + } + if (cfgMassAxis) { if constexpr (std::experimental::is_detected::value) target->getTriggerHist()->Fill(step, track1.pt(), multiplicity, posZ, track1.invMass(), triggerWeight); @@ -484,6 +501,18 @@ struct CorrelationTask { float deltaPhi = RecoDecay::constrainAngle(track1.phi() - track2.phi(), -o2::constants::math::PIHalf); + if constexpr (std::experimental::is_detected::value) { + if (doprocessSame2Prong2ProngML || doprocessMixed2Prong2ProngML) { + auto it = std::lower_bound(cfgPtDepMLbkg->begin(), cfgPtDepMLbkg->end(), track2.pt()); + int idx = std::distance(cfgPtDepMLbkg->begin(), it) - 1; + if (track2.decay() == 0 && track2.mlProbD0()[0] > cfgPtCentDepMLbkgSel->at(idx)) { + continue; + } else if (track2.decay() == 1 && track2.mlProbD0bar()[0] > cfgPtCentDepMLbkgSel->at(idx)) { + continue; + } + } + } + // last param is the weight if (cfgMassAxis && (doprocessSame2Prong2Prong || doprocessMixed2Prong2Prong) && !(doprocessSame2ProngDerived || doprocessMixed2ProngDerived)) { if constexpr (std::experimental::is_detected::value && std::experimental::is_detected::value) @@ -644,6 +673,30 @@ struct CorrelationTask { } PROCESS_SWITCH(CorrelationTask, processSame2Prong2Prong, "Process same event on derived data", false); + void processSame2Prong2ProngML(DerivedCollisions::iterator const& collision, soa::Filtered> const& p2tracks) + { + BinningTypeDerived configurableBinningDerived{{axisVertex, axisMultiplicity}, true}; // true is for 'ignore overflows' (true by default). Underflows and overflows will have bin -1. + if (cfgVerbosity > 0) { + LOGF(info, "processSame2ProngDerived: 2-prong candidates: %d | Vertex: %.1f | Multiplicity/Centrality: %.1f", p2tracks.size(), collision.posZ(), collision.multiplicity()); + } + loadEfficiency(collision.timestamp()); + + const auto multiplicity = collision.multiplicity(); + + int bin = configurableBinningDerived.getBin({collision.posZ(), collision.multiplicity()}); + registry.fill(HIST("eventcount_same"), bin); + fillQA(collision, multiplicity, p2tracks, p2tracks); + + same->fillEvent(multiplicity, CorrelationContainer::kCFStepReconstructed); + fillCorrelations(same, p2tracks, p2tracks, multiplicity, collision.posZ(), 0, 1.0f); + + if (cfg.mEfficiencyAssociated || cfg.mEfficiencyTrigger) { + same->fillEvent(multiplicity, CorrelationContainer::kCFStepCorrected); + fillCorrelations(same, p2tracks, p2tracks, multiplicity, collision.posZ(), 0, 1.0f); + } + } + PROCESS_SWITCH(CorrelationTask, processSame2Prong2ProngML, "Process same event on derived data", false); + using BinningTypeAOD = ColumnBinningPolicy; void processMixedAOD(AodCollisions const& collisions, AodTracks const& tracks, aod::BCsWithTimestamps const&) { @@ -807,6 +860,45 @@ struct CorrelationTask { } PROCESS_SWITCH(CorrelationTask, processMixed2Prong2Prong, "Process mixed events on derived data", false); + void processMixed2Prong2ProngML(DerivedCollisions const& collisions, soa::Filtered> const& p2tracks) + { + BinningTypeDerived configurableBinningDerived{{axisVertex, axisMultiplicity}, true}; // true is for 'ignore overflows' (true by default). Underflows and overflows will have bin -1. + // Strictly upper categorised collisions, for cfgNoMixedEvents combinations per bin, skipping those in entry -1 + auto tracksTuple = std::make_tuple(p2tracks); + SameKindPair>, BinningTypeDerived> pairs{configurableBinningDerived, cfgNoMixedEvents, -1, collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip + + for (auto it = pairs.begin(); it != pairs.end(); it++) { + auto& [collision1, tracks1, collision2, tracks2] = *it; + int bin = configurableBinningDerived.getBin({collision1.posZ(), collision1.multiplicity()}); + float eventWeight = 1.0f / it.currentWindowNeighbours(); + int field = 0; + if (cfgTwoTrackCut > 0) { + field = getMagneticField(collision1.timestamp()); + } + + if (cfgVerbosity > 0) { + LOGF(info, "processMixedDerived: Mixed collisions bin: %d pair: [%d, %d] %d (%.3f, %.3f), %d (%.3f, %.3f)", bin, it.isNewWindow(), it.currentWindowNeighbours(), collision1.globalIndex(), collision1.posZ(), collision1.multiplicity(), collision2.globalIndex(), collision2.posZ(), collision2.multiplicity()); + } + + if (it.isNewWindow()) { + loadEfficiency(collision1.timestamp()); + mixed->fillEvent(collision1.multiplicity(), CorrelationContainer::kCFStepReconstructed); + } + + // LOGF(info, "Tracks: %d and %d entries", tracks1.size(), tracks2.size()); + + registry.fill(HIST("eventcount_mixed"), bin); + fillCorrelations(mixed, tracks1, tracks2, collision1.multiplicity(), collision1.posZ(), field, eventWeight); + if (cfg.mEfficiencyAssociated || cfg.mEfficiencyTrigger) { + if (it.isNewWindow()) { + mixed->fillEvent(collision1.multiplicity(), CorrelationContainer::kCFStepCorrected); + } + fillCorrelations(mixed, tracks1, tracks2, collision1.multiplicity(), collision1.posZ(), field, eventWeight); + } + } + } + PROCESS_SWITCH(CorrelationTask, processMixed2Prong2ProngML, "Process mixed events on derived data", false); + // Version with combinations /*void processWithCombinations(soa::Join::iterator const& collision, aod::BCsWithTimestamps const&, soa::Filtered const& tracks) { From f5fc9e0da4fd32edef2d57ff1078338bc34b156e Mon Sep 17 00:00:00 2001 From: ilikmeta <152337132+ilikmeta@users.noreply.github.com> Date: Sun, 16 Feb 2025 00:44:13 +0200 Subject: [PATCH 0244/1650] [PWGCF] Change to Global+ITS tracks and add centrality estimators. (#9976) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/flowGfwTask.cxx | 141 ++++++++++++++++++++++++++++--- 1 file changed, 129 insertions(+), 12 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowGfwTask.cxx b/PWGCF/Flow/Tasks/flowGfwTask.cxx index fd256b810a7..985352364a5 100644 --- a/PWGCF/Flow/Tasks/flowGfwTask.cxx +++ b/PWGCF/Flow/Tasks/flowGfwTask.cxx @@ -63,6 +63,11 @@ struct FlowGfwTask { O2_DEFINE_CONFIGURABLE(cfgCutITSclu, float, 5.0f, "minimum ITS clusters") O2_DEFINE_CONFIGURABLE(cfgMinCentFT0C, float, 0.0f, "Minimum FT0C Centrality") O2_DEFINE_CONFIGURABLE(cfgMaxCentFT0C, float, 100.0f, "Maximum FT0C Centrality") + O2_DEFINE_CONFIGURABLE(cfgcentEstFt0c, bool, false, "Centrality estimator based on FT0C signal") + O2_DEFINE_CONFIGURABLE(cfgcentEstFt0a, bool, false, "Centrality estimator based on FT0A signal") + O2_DEFINE_CONFIGURABLE(cfgcentEstFt0m, bool, false, " A centrality estimator based on FT0A+FT0C signals.") + O2_DEFINE_CONFIGURABLE(cfgcentEstFv0a, bool, false, "Centrality estimator based on FV0A signal") + O2_DEFINE_CONFIGURABLE(cfgcentEstFt0cVariant1, bool, false, "A variant of FT0C") O2_DEFINE_CONFIGURABLE(cfgUseAdditionalEventCut, bool, false, "Use additional event cut on mult correlations") O2_DEFINE_CONFIGURABLE(cfgUseAdditionalTrackCut, bool, false, "Use additional track cut on phi") O2_DEFINE_CONFIGURABLE(cfgUseNch, bool, false, "Use Nch for flow observables") @@ -83,7 +88,10 @@ struct FlowGfwTask { O2_DEFINE_CONFIGURABLE(cfgEvSelkIsGoodITSLayersAll, bool, false, "kIsGoodITSLayersAll") O2_DEFINE_CONFIGURABLE(cfgOccupancy, bool, false, "Bool for event selection on detector occupancy"); O2_DEFINE_CONFIGURABLE(cfgMultCut, bool, false, "Use additional event cut on mult correlations"); - O2_DEFINE_CONFIGURABLE(FineBinning, bool, false, "Manually change to fine binning") + O2_DEFINE_CONFIGURABLE(cfgGlobalplusITS, bool, false, "Global and ITS tracks") + O2_DEFINE_CONFIGURABLE(cfgGlobalonly, bool, false, "Global only tracks") + O2_DEFINE_CONFIGURABLE(cfgITSonly, bool, false, "ITS only tracks") + O2_DEFINE_CONFIGURABLE(cfgFineBinning, bool, false, "Manually change to fine binning") O2_DEFINE_CONFIGURABLE(cfgTrackSelRun3ITSMatch, bool, false, "System check: Run3ITSMatch") O2_DEFINE_CONFIGURABLE(cfgTrackSel, bool, false, "System check: track selection") @@ -183,6 +191,28 @@ struct FlowGfwTask { kNOOFEVENTSTEPS }; + enum CentEstimators { + kCentFT0C, + kCentFT0A, + kCentFT0M, + kCentFV0A, + kCentFT0CVariant1, + kNoCentEstimators + }; + + // Contruct Global+ITS sample + static constexpr TrackSelectionFlags::flagtype TrackSelectionITS = + TrackSelectionFlags::kITSNCls | TrackSelectionFlags::kITSChi2NDF | + TrackSelectionFlags::kITSHits; + static constexpr TrackSelectionFlags::flagtype TrackSelectionTPC = + TrackSelectionFlags::kTPCNCls | + TrackSelectionFlags::kTPCCrossedRowsOverNCls | + TrackSelectionFlags::kTPCChi2NDF; + static constexpr TrackSelectionFlags::flagtype TrackSelectionDCA = + TrackSelectionFlags::kDCAz | TrackSelectionFlags::kDCAxy; + static constexpr TrackSelectionFlags::flagtype TrackSelectionDCAXYonly = + TrackSelectionFlags::kDCAxy; + // Additional Event selection cuts - Copy from flowGenericFramework.cxx TrackSelection myTrackSel; TF1* fPhiCutLow = nullptr; @@ -222,6 +252,19 @@ struct FlowGfwTask { registry.add("hCent", "Centrality distribution", {HistType::kTH1D, {{90, 0, 90}}}); registry.add("cent_vs_Nch", ";Centrality (%); M (|#eta| < 0.8);", {HistType::kTH2D, {axisCentrality, axisNch}}); + // Centrality estimators + registry.add("hCentEstimators", "Number of Unfiltered Events;; No. of Events", {HistType::kTH1D, {{kNoCentEstimators, -0.5, static_cast(kNoCentEstimators) - 0.5}}}); + registry.get(HIST("hCentEstimators"))->GetXaxis()->SetBinLabel(kCentFT0C + 1, "FT0C"); + registry.get(HIST("hCentEstimators"))->GetXaxis()->SetBinLabel(kCentFT0A + 1, "FT0A"); + registry.get(HIST("hCentEstimators"))->GetXaxis()->SetBinLabel(kCentFT0M + 1, "FT0M"); + registry.get(HIST("hCentEstimators"))->GetXaxis()->SetBinLabel(kCentFV0A + 1, "FV0A"); + registry.get(HIST("hCentEstimators"))->GetXaxis()->SetBinLabel(kCentFT0CVariant1 + 1, "FT0CVar1"); + registry.add("hCentFT0C", "FT0C Unfiltered;Centrality FT0C ;Events", kTH1F, {axisCentrality}); + registry.add("hCentFT0A", "FT0A Unfiltered;Centrality FT0A ;Events", kTH1F, {axisCentrality}); + registry.add("hCentFT0M", "FT0M Unfiltered;Centrality FT0M ;Events", kTH1F, {axisCentrality}); + registry.add("hCentFV0A", "FV0A Unfiltered;Centrality FV0A ;Events", kTH1F, {axisCentrality}); + registry.add("hCentFT0CVariant1", "FT0CVariant1 Unfiltered;Centrality FT0CVariant1 ;Events", kTH1F, {axisCentrality}); + // Before cuts registry.add("BeforeCut_globalTracks_centT0C", "before cut;Centrality T0C;mulplicity global tracks", {HistType::kTH2D, {axisCentForQA, axisNch}}); registry.add("BeforeCut_PVTracks_centT0C", "before cut;Centrality T0C;mulplicity PV tracks", {HistType::kTH2D, {axisCentForQA, axisNchPV}}); @@ -268,9 +311,17 @@ struct FlowGfwTask { registry.add("ZNvsZEMcollrest", "ZNvsZEMcoll; ZEM; ZDC energy (GeV)", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); // Track plots - registry.add("Nch", "N_{ch 0-5%} vs #Events of;N_{ch 0-5%};No. of Events", {HistType::kTH1D, {axisNch}}); + registry.add("Nch", "N_{ch 0-5%} vs #Events;N_{ch 0-5%};No. of Events", {HistType::kTH1D, {axisNch}}); registry.add("Events_per_Centrality_Bin", "Events_per_Centrality_Bin;Centrality FT0C;No. of Events", kTH1F, {axisCentrality}); - registry.add("Global_Tracks_Nch_vs_Cent", "Global Tracks;Centrality (%); M (|#eta| < 0.8);", {HistType::kTH2D, {axisCentrality, axisNch}}); + registry.add("pt_Cen_GlobalOnly", "pt_Cen_Global;Centrality (%); p_{T} (GeV/c);", {HistType::kTH2D, {axisCentrality, axisPt}}); + registry.add("phi_Cen_GlobalOnly", "phi_Cen_Global;Centrality (%); #phi;", {HistType::kTH2D, {axisCentrality, axisPhi}}); + registry.add("pt_Cen_ITSOnly", "pt_Cen_ITS;Centrality (%); p_{T} (GeV/c);", {HistType::kTH2D, {axisCentrality, axisPt}}); + registry.add("phi_Cen_ITSOnly", "phi_Cen_ITS;Centrality (%); #phi;", {HistType::kTH2D, {axisCentrality, axisPhi}}); + + // Track types + registry.add("GlobalplusITS", "Global plus ITS;Centrality FT0C;Nch", kTH1F, {axisCentrality}); + registry.add("Globalonly", "Global only;Centrality FT0C;Nch", kTH1F, {axisCentrality}); + registry.add("ITSonly", "ITS only;Centrality FT0C;Nch", kTH1F, {axisCentrality}); // Track QA registry.add("hPt", "p_{T} distribution before cut", {HistType::kTH1D, {axisPtHist}}); @@ -646,9 +697,15 @@ struct FlowGfwTask { // Apply process filters Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex && (aod::cent::centFT0C > cfgMinCentFT0C) && (aod::cent::centFT0C < cfgMaxCentFT0C); - Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls) && (nabs(aod::track::dcaZ) < cfgCutDCAz) && (nabs(aod::track::dcaXY) < cfgCutDCAxy); - - using Colls = soa::Filtered>; // collisions filter + Filter trackFilter = ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::ITS) && + ncheckbit(aod::track::trackCutFlag, TrackSelectionITS) && + ifnode(ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::TPC), + ncheckbit(aod::track::trackCutFlag, TrackSelectionTPC), true) && + ifnode(dcaZ > 0.f, nabs(aod::track::dcaZ) <= dcaZ && ncheckbit(aod::track::trackCutFlag, TrackSelectionDCAXYonly), + ncheckbit(aod::track::trackCutFlag, TrackSelectionDCA)) && + (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls); + + using Colls = soa::Filtered>; // collisions filter using AodTracks = soa::Filtered>; // tracks filter using BCsRun3 = soa::Join; @@ -663,7 +720,31 @@ struct FlowGfwTask { if (nTotal < 1) return; - const auto centrality = collision.centFT0C(); + // Choose centrality estimator -- Only one can be true + float centrality = 0; + if (cfgcentEstFt0c) { + const auto centrality = collision.centFT0C(); + registry.fill(HIST("hCentEstimators"), kCentFT0C); + registry.fill(HIST("hCentFT0C"), centrality); + } else if (cfgcentEstFt0a) { + const auto centrality = collision.centFT0A(); + registry.fill(HIST("hCentEstimators"), kCentFT0A); + registry.fill(HIST("hCentFT0A"), centrality); + } else if (cfgcentEstFt0m) { + const auto centrality = collision.centFT0M(); + registry.fill(HIST("hCentEstimators"), kCentFT0M); + registry.fill(HIST("hCentFT0M"), centrality); + } else if (cfgcentEstFv0a) { + const auto centrality = collision.centFV0A(); + registry.fill(HIST("hCentEstimators"), kCentFV0A); + registry.fill(HIST("hCentFV0A"), centrality); + } else if (cfgcentEstFt0cVariant1) { + const auto centrality = collision.centFT0CVariant1(); + registry.fill(HIST("hCentEstimators"), kCentFT0CVariant1); + registry.fill(HIST("hCentFT0CVariant1"), centrality); + } else { + return; + } // fill event QA before cuts registry.fill(HIST("BeforeCut_globalTracks_centT0C"), collision.centFT0C(), tracks.size()); @@ -785,6 +866,9 @@ struct FlowGfwTask { // track loop int globalTracksNch = 0; + int globalPlusitsNch = 0; + int gloabalOnlyNch = 0; + int itsOnlyNch = 0; for (const auto& track : tracks) { if (!trackSelected(track)) @@ -814,18 +898,51 @@ struct FlowGfwTask { registry.fill(HIST("hDCAxy"), track.dcaXY(), track.pt()); } - globalTracksNch++; + globalPlusitsNch++; - if (withinPtRef) - fGFW->Fill(track.eta(), 1, track.phi(), wacc * weff, 1); + registry.fill(HIST("GlobalplusITS"), centrality); - if (FineBinning == true) + if (cfgGlobalplusITS) { + if (withinPtRef) { + fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), wacc * weff, 1); + } + } + + if (track.hasTPC()) { + if (cfgGlobalonly) { + if (withinPtRef) { + fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), wacc * weff, 1); + gloabalOnlyNch++; + registry.fill(HIST("Globalonly"), centrality); + registry.fill(HIST("pt_Cen_ITSOnly"), centrality, track.pt()); + registry.fill(HIST("phi_Cen_GlobalOnly"), centrality, track.pt()); + } + } + } else { + if (cfgITSonly) { + if (withinPtRef) { + fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), wacc * weff, 1); + itsOnlyNch++; + registry.fill(HIST("ITSonly"), centrality); + registry.fill(HIST("pt_Cen_ITSOnly"), centrality, track.pt()); + registry.fill(HIST("phi_Cen_ITSOnly"), centrality, track.pt()); + } + } + } + + if (cfgFineBinning) fGFW->Fill(track.eta(), 1, track.phi(), wacc * weff, 1); } // End of track loop + globalTracksNch = globalPlusitsNch; + globalTracksNch = gloabalOnlyNch; + globalTracksNch = itsOnlyNch; + registry.fill(HIST("Events_per_Centrality_Bin"), centrality); - registry.fill(HIST("Global_Tracks_Nch_vs_Cent"), centrality, globalTracksNch); + registry.fill(HIST("GlobalplusITS"), centrality, globalPlusitsNch); + registry.fill(HIST("Globalonly"), centrality, gloabalOnlyNch); + registry.fill(HIST("ITSonly"), centrality, itsOnlyNch); // Filling c22 with ROOT TProfile fillProfile(corrconfigs.at(0), HIST("c22"), centrality); From 2505dc25a21997e2892aa2eca546e237233204c3 Mon Sep 17 00:00:00 2001 From: Gyula Bencedi Date: Sun, 16 Feb 2025 10:26:41 +0100 Subject: [PATCH 0245/1650] [PWGLF] Added checks for interaction rate (#9987) --- PWGMM/Mult/Tasks/CMakeLists.txt | 2 +- PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx | 1342 ++++++++++++++++++++-------- 2 files changed, 946 insertions(+), 398 deletions(-) diff --git a/PWGMM/Mult/Tasks/CMakeLists.txt b/PWGMM/Mult/Tasks/CMakeLists.txt index 6d2098a29ea..2c56cc8fc96 100644 --- a/PWGMM/Mult/Tasks/CMakeLists.txt +++ b/PWGMM/Mult/Tasks/CMakeLists.txt @@ -36,7 +36,7 @@ o2physics_add_dpl_workflow(dndeta-mft o2physics_add_dpl_workflow(dndeta-mft-pbpb SOURCES dndetaMFTPbPb.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::AnalysisCCDB COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(flatenicity-fv0 diff --git a/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx b/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx index a38d5787449..520751f92a9 100644 --- a/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx +++ b/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx @@ -14,11 +14,14 @@ /// \author Gyula Bencedi, gyula.bencedi@cern.ch /// \since Nov 2024 +#include #include #include -#include -#include #include +#include +#include + +#include "CCDB/BasicCCDBManager.h" #include "Framework/ASoAHelpers.h" #include "Framework/AnalysisDataModel.h" @@ -28,6 +31,7 @@ #include "Framework/RuntimeError.h" #include "Framework/runDataProcessing.h" +#include "Common/CCDB/ctpRateFetcher.h" #include "Common/DataModel/Centrality.h" #include "Common/DataModel/CollisionAssociationTables.h" #include "Common/DataModel/EventSelection.h" @@ -35,16 +39,13 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "CommonConstants/MathConstants.h" +#include "Functions.h" +#include "Index.h" #include "MathUtils/Utils.h" #include "ReconstructionDataFormats/GlobalTrackID.h" - #include "TPDGCode.h" - -#include "Index.h" #include "bestCollisionTable.h" -#include "Functions.h" - using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; @@ -69,7 +70,6 @@ struct DndetaMFTPbPb { enum OccupancyEst { TrkITS = 1, Ft0C }; - // Histogram registry HistogramRegistry registry{ "registry", {}, @@ -81,54 +81,82 @@ struct DndetaMFTPbPb { false, true}; - // analysis specific conf. - Configurable usePhiCut{"usePhiCut", false, "use azimuthal angle cut"}; - Configurable cfgPhiCut{"cfgPhiCut", 0.1f, "Cut on azimuthal angle of MFT tracks"}; + struct : ConfigurableGroup { + Configurable usephiCut{"usephiCut", false, "use azimuthal angle cut"}; + Configurable phiCut{"phiCut", 0.1f, + "Cut on azimuthal angle of MFT tracks"}; + Configurable minPhi{"minPhi", 0.f, ""}; + Configurable maxPhi{"maxPhi", 6.2832, ""}; + Configurable minEta{"minEta", -3.6f, ""}; + Configurable maxEta{"maxEta", -2.5f, ""}; + Configurable minNclusterMft{"minNclusterMft", 5, + "minimum number of MFT clusters"}; + Configurable minPt{"minPt", 0., "minimum pT of the MFT tracks"}; + Configurable requireCA{ + "requireCA", false, "Use Cellular Automaton track-finding algorithm"}; + Configurable maxDCAxy{"maxDCAxy", 2.0f, "Cut on dcaXY"}; + } trackCuts; - // track selection conf. struct : ConfigurableGroup { - Configurable cfgPhiMin{"cfgPhiMin", 0.f, ""}; - Configurable cfgPhiMax{"cfgPhiMax", 6.2832, ""}; - Configurable cfgEtaMin{"cfgEtaMin", -3.6f, ""}; - Configurable cfgEtaMax{"cfgEtaMax", -2.5f, ""}; - Configurable cfgMinNclusterMft{"cfgMinNclusterMft", 5, - "minimum number of MFT clusters"}; - Configurable cfgPtMin{"cfgPtMin", 0., - "minimum pT of the MFT tracks"}; - Configurable cfgRequireCA{"cfgRequireCA", false, - "Use Cellular Automaton track-finding algorithm"}; - Configurable cfgDCAxyMax{"cfgDCAxyMax", 2.0f, "Cut on dcaXY"}; - } trkcuts; - - // event selection conf. - Configurable cfgCutZvtx{"cfgCutZvtx", 10.0f, "Cut on z-vtx"}; - Configurable cfgCutCent{"cfgCutCent", 80.0f, "Cut on maximum centrality"}; - Configurable cfgCentEstimator{"cfgCentEstimator", 1, "Centrality estimator: 1 = FT0C, 2 = FT0CVariant1, 3 = FT0M, 4 = NGlobal, 5 = MFT"}; - Configurable useZDiffCut{"useZDiffCut", false, - "use Zvtx reco-mc diff. cut"}; - Configurable maxZvtxDiff{"maxZvtxDiff", 1.0f, - "max allowed Z vtx difference for reconstruced collisions (cm)"}; - Configurable requireNoCollInTimeRangeStd{"requireNoCollInTimeRangeStd", false, - "reject collisions corrupted by the cannibalism, with other collisions " - "within +/- 10 microseconds"}; - Configurable requireNoCollInTimeRangeNarrow{"requireNoCollInTimeRangeNarrow", false, - "reject collisions corrupted by the cannibalism, with other collisions " - "within +/- 10 microseconds"}; + Configurable maxZvtx{"maxZvtx", 10.0f, "Cut on z-vtx"}; + Configurable useZDiffCut{"useZDiffCut", false, + "use Zvtx reco-mc diff. cut"}; + Configurable maxZvtxDiff{ + "maxZvtxDiff", 1.0f, + "max allowed Z vtx difference for reconstruced collisions (cm)"}; + Configurable requireNoCollInTimeRangeStd{ + "requireNoCollInTimeRangeStd", false, + "reject collisions corrupted by the cannibalism, with other collisions " + "within +/- 10 microseconds"}; + Configurable requireNoCollInTimeRangeNarrow{ + "requireNoCollInTimeRangeNarrow", false, + "reject collisions corrupted by the cannibalism, with other collisions " + "within +/- 10 microseconds"}; + Configurable occupancyEstimator{ + "occupancyEstimator", 1, + "Occupancy estimator: 1 = trackOccupancyInTimeRange, 2 = " + "ft0cOccupancyInTimeRange"}; + Configurable minOccupancy{ + "minOccupancy", -1, "minimum occupancy from neighbouring collisions"}; + Configurable maxOccupancy{ + "maxOccupancy", -1, "maximum occupancy from neighbouring collisions"}; + Configurable minIR{"minIR", -1, "minimum IR (kHz) collisions"}; + Configurable maxIR{"maxIR", -1, "maximum IR (kHz) collisions"}; + } eventCuts; + ConfigurableAxis occupancyBins{"occupancyBins", {VARIABLE_WIDTH, 0.0f, 250.0f, 500.0f, 750.0f, 1000.0f, 1500.0f, 2000.0f, 3000.0f, 4500.0f, 6000.0f, 8000.0f, 10000.0f, 50000.0f}, "Occupancy"}; - Configurable cfgOccEstimator{"cfgOccEstimator", 1, "Occupancy estimator: 1 = trackOccupancyInTimeRange, 2 = ft0cOccupancyInTimeRange"}; - Configurable minOccupancy{"minOccupancy", -1, "minimum occupancy from neighbouring collisions"}; - Configurable maxOccupancy{"maxOccupancy", -1, "maximum occupancy from neighbouring collisions"}; - ConfigurableAxis centralityBins{"centralityBins", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100}, "Centrality"}; + ConfigurableAxis centralityBins{ + "centralityBins", + {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100}, + "Centrality"}; + ConfigurableAxis IrBins{"IrBins", {500, 0, 50}, "Interaction rate (kHz)"}; Service pdg; + Service ccdb; + Configurable ccdbNoLaterThan{ + "ccdbNoLaterThan", + std::chrono::duration_cast( + std::chrono::system_clock::now().time_since_epoch()) + .count(), + "latest acceptable timestamp of creation for the object"}; + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", + "url of the ccdb repository"}; + ctpRateFetcher rateFetcher; + /// @brief init function, definition of histograms void init(InitContext&) { + ccdb->setURL(ccdbUrl.value); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setCreatedNotAfter(ccdbNoLaterThan.value); + ccdb->setFatalWhenNull(false); + if (static_cast(doprocessDataInclusive) + static_cast(doprocessDatawBestTracksInclusive) > 1) { @@ -136,9 +164,24 @@ struct DndetaMFTPbPb { "Either processDataInclusive OR " "processDatawBestTracksInclusive should be enabled!"); } - if ((static_cast(doprocessDataCentFT0C) + static_cast(doprocessDatawBestTracksCentFT0C) > 1) || (static_cast(doprocessDataCentFT0CVariant1) + static_cast(doprocessDatawBestTracksCentFT0CVariant1) > 1) || (static_cast(doprocessDataCentFT0M) + static_cast(doprocessDatawBestTracksCentFT0M) > 1) || (static_cast(doprocessDataCentNGlobal) + static_cast(doprocessDatawBestTracksCentNGlobal) > 1) || (static_cast(doprocessDataCentMFT) + static_cast(doprocessDatawBestTracksCentMFT) > 1)) { + if ((static_cast(doprocessDataCentFT0C) + + static_cast(doprocessDatawBestTracksCentFT0C) > + 1) || + (static_cast(doprocessDataCentFT0CVariant1) + + static_cast(doprocessDatawBestTracksCentFT0CVariant1) > + 1) || + (static_cast(doprocessDataCentFT0M) + + static_cast(doprocessDatawBestTracksCentFT0M) > + 1) || + (static_cast(doprocessDataCentNGlobal) + + static_cast(doprocessDatawBestTracksCentNGlobal) > + 1) || + (static_cast(doprocessDataCentMFT) + + static_cast(doprocessDatawBestTracksCentMFT) > + 1)) { LOGP(fatal, - "Either processDataCent[ESTIMATOR] OR processDatawBestTracksCent[ESTIMATOR] should " + "Either processDataCent[ESTIMATOR] OR " + "processDatawBestTracksCent[ESTIMATOR] should " "be enabled!"); } if (static_cast(doprocessMCInclusive) + @@ -148,14 +191,29 @@ struct DndetaMFTPbPb { "Either processMCInclusive OR processMCwBestTracksInclusive " "should be enabled!"); } - if ((static_cast(doprocessMCCentFT0C) + static_cast(doprocessMCwBestTracksCentFT0C) > 1) || (static_cast(doprocessMCCentFT0CVariant1) + static_cast(doprocessMCwBestTracksCentFT0CVariant1) > 1) || (static_cast(doprocessMCCentFT0M) + static_cast(doprocessMCwBestTracksCentFT0M) > 1) || (static_cast(doprocessMCCentNGlobal) + static_cast(doprocessMCwBestTracksCentNGlobal) > 1) || (static_cast(doprocessMCCentMFT) + static_cast(doprocessMCwBestTracksCentMFT) > 1)) { + if ((static_cast(doprocessMCCentFT0C) + + static_cast(doprocessMCwBestTracksCentFT0C) > + 1) || + (static_cast(doprocessMCCentFT0CVariant1) + + static_cast(doprocessMCwBestTracksCentFT0CVariant1) > + 1) || + (static_cast(doprocessMCCentFT0M) + + static_cast(doprocessMCwBestTracksCentFT0M) > + 1) || + (static_cast(doprocessMCCentNGlobal) + + static_cast(doprocessMCwBestTracksCentNGlobal) > + 1) || + (static_cast(doprocessMCCentMFT) + + static_cast(doprocessMCwBestTracksCentMFT) > + 1)) { LOGP(fatal, - "Either processMCCent[ESTIMATOR] OR processMCwBestTracksCent[ESTIMATOR] should " + "Either processMCCent[ESTIMATOR] OR " + "processMCwBestTracksCent[ESTIMATOR] should " "be enabled!"); } auto hev = registry.add("hEvtSel", "hEvtSel", HistType::kTH1F, - {{10, -0.5f, +9.5f}}); + {{12, -0.5f, +11.5f}}); hev->GetXaxis()->SetBinLabel(1, "All collisions"); hev->GetXaxis()->SetBinLabel(2, "Ev. sel."); hev->GetXaxis()->SetBinLabel(3, "kIsGoodZvtxFT0vsPV"); @@ -165,8 +223,11 @@ struct DndetaMFTPbPb { hev->GetXaxis()->SetBinLabel(7, "kNoCollInTimeRangeNarrow"); hev->GetXaxis()->SetBinLabel(8, "Below min occup."); hev->GetXaxis()->SetBinLabel(9, "Above max occup."); + hev->GetXaxis()->SetBinLabel(10, "Below min IR (kHz)"); + hev->GetXaxis()->SetBinLabel(11, "Above max IR (kHz)"); - auto hBcSel = registry.add("hBcSel", "hBcSel", HistType::kTH1F, {{3, -0.5f, +2.5f}}); + auto hBcSel = registry.add("hBcSel", "hBcSel", HistType::kTH1F, + {{3, -0.5f, +2.5f}}); hBcSel->GetXaxis()->SetBinLabel(1, "Good BCs"); hBcSel->GetXaxis()->SetBinLabel(2, "BCs with collisions"); hBcSel->GetXaxis()->SetBinLabel(3, "BCs with pile-up/splitting"); @@ -174,120 +235,187 @@ struct DndetaMFTPbPb { AxisSpec centralityAxis = {centralityBins, "Centrality", "centralityAxis"}; AxisSpec occupancyAxis = {occupancyBins, "Occupancy", "occupancyAxis"}; - if (doprocessDataInclusive || doprocessDatawBestTracksInclusive || doprocessMCInclusive || doprocessMCwBestTracksInclusive) { - registry.add({"Events/Selection", ";status;occupancy", {HistType::kTH2F, {{2, 0.5, 2.5}, occupancyAxis}}}); + if (doprocessDataInclusive || doprocessDatawBestTracksInclusive || + doprocessMCInclusive || doprocessMCwBestTracksInclusive) { + registry.add({"Events/Selection", + ";status;occupancy", + {HistType::kTH2F, {{2, 0.5, 2.5}, occupancyAxis}}}); auto hstat = registry.get(HIST("Events/Selection")); auto* x = hstat->GetXaxis(); x->SetBinLabel(1, "All"); x->SetBinLabel(2, "Selected"); - registry.add({"Events/NtrkZvtx", "; N_{trk}; Z_{vtx} (cm); occupancy", {HistType::kTHnSparseF, {multAxis, zAxis, occupancyAxis}}}); - registry.add({"Tracks/EtaZvtx", "; #eta; Z_{vtx} (cm); occupancy", {HistType::kTHnSparseF, {etaAxis, zAxis, occupancyAxis}}}); - registry.add({"Tracks/PhiEta", "; #varphi; #eta; occupancy", {HistType::kTHnSparseF, {phiAxis, etaAxis, occupancyAxis}}}); + qaregistry.add("hOccIRate", "hOccIRate", HistType::kTH2F, + {occupancyAxis, IrBins}); - qaregistry.add({"Tracks/Chi2Eta", "; #chi^{2}; #it{#eta}; occupancy", {HistType::kTHnSparseF, {{600, 0, 20}, etaAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/Chi2", "; #chi^{2};", {HistType::kTH2F, {{600, 0, 20}, occupancyAxis}}}); - qaregistry.add({"Tracks/NclustersEta", "; nClusters; #eta; occupancy", {HistType::kTHnSparseF, {{7, 4, 10}, etaAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/NchSel", "; N_{ch}; occupancy", {HistType::kTH2F, {multAxis, occupancyAxis}}}); + registry.add({"Events/NtrkZvtx", + "; N_{trk}; Z_{vtx} (cm); occupancy", + {HistType::kTHnSparseF, {multAxis, zAxis, occupancyAxis}}}); + registry.add({"Tracks/EtaZvtx", + "; #eta; Z_{vtx} (cm); occupancy", + {HistType::kTHnSparseF, {etaAxis, zAxis, occupancyAxis}}}); + registry.add( + {"Tracks/PhiEta", + "; #varphi; #eta; occupancy", + {HistType::kTHnSparseF, {phiAxis, etaAxis, occupancyAxis}}}); + + qaregistry.add( + {"Tracks/Chi2Eta", + "; #chi^{2}; #it{#eta}; occupancy", + {HistType::kTHnSparseF, {{600, 0, 20}, etaAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/Chi2", + "; #chi^{2};", + {HistType::kTH2F, {{600, 0, 20}, occupancyAxis}}}); + qaregistry.add( + {"Tracks/NclustersEta", + "; nClusters; #eta; occupancy", + {HistType::kTHnSparseF, {{7, 4, 10}, etaAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/NchSel", + "; N_{ch}; occupancy", + {HistType::kTH2F, {multAxis, occupancyAxis}}}); if (doprocessDatawBestTracksInclusive) { - registry.add({"Events/NtrkZvtxBest", - "; N_{trk}; Z_{vtx} (cm); occupancy", - {HistType::kTHnSparseF, {multAxis, zAxis, occupancyAxis}}}); - registry.add({"Tracks/EtaZvtxBest", - "; #eta; Z_{vtx} (cm); occupancy", - {HistType::kTHnSparseF, {etaAxis, zAxis, occupancyAxis}}}); - registry.add({"Tracks/PhiEtaBest", - "; #varphi; #eta; occupancy", - {HistType::kTHnSparseF, {phiAxis, etaAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/NclustersEtaBest", - "; nClusters; #eta; occupancy", - {HistType::kTHnSparseF, {{7, 4, 10}, etaAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/DCAXYPt", - "; p_{T} (GeV/c) ; DCA_{XY} (cm); occupancy", - {HistType::kTHnSparseF, {ptAxis, dcaxyAxis, occupancyAxis}}}); + registry.add( + {"Events/NtrkZvtxBest", + "; N_{trk}; Z_{vtx} (cm); occupancy", + {HistType::kTHnSparseF, {multAxis, zAxis, occupancyAxis}}}); + registry.add( + {"Tracks/EtaZvtxBest", + "; #eta; Z_{vtx} (cm); occupancy", + {HistType::kTHnSparseF, {etaAxis, zAxis, occupancyAxis}}}); + registry.add( + {"Tracks/PhiEtaBest", + "; #varphi; #eta; occupancy", + {HistType::kTHnSparseF, {phiAxis, etaAxis, occupancyAxis}}}); + qaregistry.add( + {"Tracks/NclustersEtaBest", + "; nClusters; #eta; occupancy", + {HistType::kTHnSparseF, {{7, 4, 10}, etaAxis, occupancyAxis}}}); + qaregistry.add( + {"Tracks/DCAXYPt", + "; p_{T} (GeV/c) ; DCA_{XY} (cm); occupancy", + {HistType::kTHnSparseF, {ptAxis, dcaxyAxis, occupancyAxis}}}); qaregistry.add({"Tracks/DCAXY", "; DCA_{XY} (cm); occupancy", {HistType::kTH2F, {dcaxyAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/ReTracksEtaZvtx", - "; #eta; #it{z}_{vtx} (cm); occupancy", - {HistType::kTHnSparseF, {etaAxis, zAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/ReTracksPhiEta", - "; #varphi; #eta; occupancy", - {HistType::kTHnSparseF, {phiAxis, etaAxis, occupancyAxis}}}); + qaregistry.add( + {"Tracks/ReTracksEtaZvtx", + "; #eta; #it{z}_{vtx} (cm); occupancy", + {HistType::kTHnSparseF, {etaAxis, zAxis, occupancyAxis}}}); + qaregistry.add( + {"Tracks/ReTracksPhiEta", + "; #varphi; #eta; occupancy", + {HistType::kTHnSparseF, {phiAxis, etaAxis, occupancyAxis}}}); qaregistry.add({"Tracks/TrackAmbDegree", "; N_{coll}^{comp}; occupancy", {HistType::kTH2F, {{51, -0.5, 50.5}, occupancyAxis}}}); } } - if (doprocessDataCentFT0C || doprocessDatawBestTracksCentFT0C || doprocessMCCentFT0C || doprocessMCwBestTracksCentFT0C || - doprocessDataCentFT0CVariant1 || doprocessDatawBestTracksCentFT0CVariant1 || doprocessMCCentFT0CVariant1 || doprocessMCwBestTracksCentFT0CVariant1 || - doprocessDataCentFT0M || doprocessDatawBestTracksCentFT0M || doprocessMCCentFT0M || doprocessMCwBestTracksCentFT0M || - doprocessDataCentNGlobal || doprocessDatawBestTracksCentNGlobal || doprocessMCCentNGlobal || doprocessMCwBestTracksCentNGlobal || - doprocessDataCentMFT || doprocessDatawBestTracksCentMFT || doprocessMCCentMFT || doprocessMCwBestTracksCentMFT) { + if (doprocessDataCentFT0C || doprocessDatawBestTracksCentFT0C || + doprocessMCCentFT0C || doprocessMCwBestTracksCentFT0C || + doprocessDataCentFT0CVariant1 || + doprocessDatawBestTracksCentFT0CVariant1 || + doprocessMCCentFT0CVariant1 || doprocessMCwBestTracksCentFT0CVariant1 || + doprocessDataCentFT0M || doprocessDatawBestTracksCentFT0M || + doprocessMCCentFT0M || doprocessMCwBestTracksCentFT0M || + doprocessDataCentNGlobal || doprocessDatawBestTracksCentNGlobal || + doprocessMCCentNGlobal || doprocessMCwBestTracksCentNGlobal || + doprocessDataCentMFT || doprocessDatawBestTracksCentMFT || + doprocessMCCentMFT || doprocessMCwBestTracksCentMFT) { registry.add({"Events/Centrality/Selection", ";status;centrality;occupancy", - {HistType::kTHnSparseF, {{2, 0.5, 2.5}, centralityAxis, occupancyAxis}}}); + {HistType::kTHnSparseF, + {{2, 0.5, 2.5}, centralityAxis, occupancyAxis}}}); auto hstat = registry.get(HIST("Events/Centrality/Selection")); hstat->GetAxis(0)->SetBinLabel(1, "All"); hstat->GetAxis(0)->SetBinLabel(2, "Selected"); + qaregistry.add("hCentOccIRate", "hCentOccIRate", HistType::kTHnSparseF, + {centralityAxis, occupancyAxis, IrBins}); + qaregistry.add({"Events/Centrality/hCent", "; centrality; occupancy", {HistType::kTH2F, {centAxis, occupancyAxis}}, true}); - qaregistry.add({"Events/Centrality/hZvtxCent", - "; Z_{vtx} (cm); centrality; occupancy", - {HistType::kTHnSparseF, {zAxis, centralityAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/Centrality/EtaZvtxCentOcc", "; #eta; Z_{vtx} (cm); centrality; occupancy", {HistType::kTHnSparseF, {etaAxis, zAxis, centralityAxis, occupancyAxis}}}); - + qaregistry.add( + {"Events/Centrality/hZvtxCent", + "; Z_{vtx} (cm); centrality; occupancy", + {HistType::kTHnSparseF, {zAxis, centralityAxis, occupancyAxis}}}); registry.add({"Events/Centrality/NtrkZvtx", "; N_{trk}; Z_{vtx} (cm); centrality; occupancy", - {HistType::kTHnSparseF, {multAxis, zAxis, centralityAxis, occupancyAxis}}}); + {HistType::kTHnSparseF, + {multAxis, zAxis, centralityAxis, occupancyAxis}}}); registry.add({"Tracks/Centrality/EtaZvtx", "; #eta; Z_{vtx} (cm); centrality; occupancy", - {HistType::kTHnSparseF, {etaAxis, zAxis, centralityAxis, occupancyAxis}}}); + {HistType::kTHnSparseF, + {etaAxis, zAxis, centralityAxis, occupancyAxis}}}); registry.add({"Tracks/Centrality/PhiEta", "; #varphi; #eta; centrality; occupancy", - {HistType::kTHnSparseF, {phiAxis, etaAxis, centralityAxis, occupancyAxis}}}); - - qaregistry.add({"Tracks/Centrality/NchSel", "; N_{ch}; centrality; occupancy", {HistType::kTHnSparseF, {multAxis, centralityAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/Centrality/Chi2Eta", "; #chi^{2}; #it{#eta}; centrality; occupancy", {HistType::kTHnSparseF, {{600, 0, 20}, etaAxis, centralityAxis, occupancyAxis}}}); + {HistType::kTHnSparseF, + {phiAxis, etaAxis, centralityAxis, occupancyAxis}}}); + + qaregistry.add( + {"Tracks/Centrality/NchSel", + "; N_{ch}; centrality; occupancy", + {HistType::kTHnSparseF, {multAxis, centralityAxis, occupancyAxis}}}); + qaregistry.add( + {"Tracks/Centrality/Chi2Eta", + "; #chi^{2}; #it{#eta}; centrality; occupancy", + {HistType::kTHnSparseF, + {{600, 0, 20}, etaAxis, centralityAxis, occupancyAxis}}}); qaregistry.add({"Tracks/Centrality/Chi2", "; #chi^{2}; centrality; occupancy", - {HistType::kTHnSparseF, {{600, 0, 20}, centralityAxis, occupancyAxis}}}); + {HistType::kTHnSparseF, + {{600, 0, 20}, centralityAxis, occupancyAxis}}}); qaregistry.add({"Tracks/Centrality/NclustersEta", "; nClusters; #eta; centrality; occupancy", - {HistType::kTHnSparseF, {{7, 4, 10}, etaAxis, centralityAxis, occupancyAxis}}}); + {HistType::kTHnSparseF, + {{7, 4, 10}, etaAxis, centralityAxis, occupancyAxis}}}); - if (doprocessDatawBestTracksCentFT0C || doprocessDatawBestTracksCentFT0CVariant1 || doprocessDatawBestTracksCentFT0M || doprocessDatawBestTracksCentNGlobal || doprocessDatawBestTracksCentMFT) { + if (doprocessDatawBestTracksCentFT0C || + doprocessDatawBestTracksCentFT0CVariant1 || + doprocessDatawBestTracksCentFT0M || + doprocessDatawBestTracksCentNGlobal || + doprocessDatawBestTracksCentMFT) { registry.add({"Events/Centrality/NtrkZvtxBest", "; N_{trk}; Z_{vtx} (cm); centrality; occupancy", - {HistType::kTHnSparseF, {multAxis, zAxis, centralityAxis, occupancyAxis}}}); + {HistType::kTHnSparseF, + {multAxis, zAxis, centralityAxis, occupancyAxis}}}); registry.add({"Tracks/Centrality/EtaZvtxBest", "; #eta; Z_{vtx} (cm); centrality; occupancy", - {HistType::kTHnSparseF, {etaAxis, zAxis, centralityAxis, occupancyAxis}}}); + {HistType::kTHnSparseF, + {etaAxis, zAxis, centralityAxis, occupancyAxis}}}); registry.add({"Tracks/Centrality/PhiEtaBest", "; #varphi; #eta; centrality; occupancy", - {HistType::kTHnSparseF, {phiAxis, etaAxis, centralityAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/Centrality/NclustersEtaBest", "; nClusters; #eta; centrality; occupancy", {HistType::kTHnSparseF, {{7, 4, 10}, etaAxis, centralityAxis, occupancyAxis}}}); + {HistType::kTHnSparseF, + {phiAxis, etaAxis, centralityAxis, occupancyAxis}}}); + qaregistry.add( + {"Tracks/Centrality/NclustersEtaBest", + "; nClusters; #eta; centrality; occupancy", + {HistType::kTHnSparseF, + {{7, 4, 10}, etaAxis, centralityAxis, occupancyAxis}}}); qaregistry.add({"Tracks/Centrality/TrackAmbDegree", "; N_{coll}^{comp}; centrality; occupancy", - {HistType::kTHnSparseF, {{51, -0.5, 50.5}, centralityAxis, occupancyAxis}}}); + {HistType::kTHnSparseF, + {{51, -0.5, 50.5}, centralityAxis, occupancyAxis}}}); qaregistry.add({"Tracks/Centrality/DCAXY", "; DCA_{XY} (cm); centrality; occupancy", - {HistType::kTHnSparseF, {dcaxyAxis, centralityAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/Centrality/DCAXYPt", - "; p_{T} (GeV/c) ; DCA_{XY} (cm); centrality; occupancy", - {HistType::kTHnSparseF, {ptAxis, dcaxyAxis, centralityAxis, occupancyAxis}}}); + {HistType::kTHnSparseF, + {dcaxyAxis, centralityAxis, occupancyAxis}}}); + qaregistry.add( + {"Tracks/Centrality/DCAXYPt", + "; p_{T} (GeV/c) ; DCA_{XY} (cm); centrality; occupancy", + {HistType::kTHnSparseF, + {ptAxis, dcaxyAxis, centralityAxis, occupancyAxis}}}); qaregistry.add({"Tracks/Centrality/ReTracksEtaZvtx", "; #eta; #it{z}_{vtx} (cm); occupancy", - {HistType::kTHnSparseF, {etaAxis, zAxis, centralityAxis, occupancyAxis}}}); + {HistType::kTHnSparseF, + {etaAxis, zAxis, centralityAxis, occupancyAxis}}}); qaregistry.add({"Tracks/Centrality/ReTracksPhiEta", "; #varphi; #eta; occupancy", - {HistType::kTHnSparseF, {phiAxis, etaAxis, centralityAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/Centrality/EtaZvtxCentOccBest", "; #eta; Z_{vtx} (cm); centrality; occupancy", {HistType::kTHnSparseF, {etaAxis, zAxis, centralityAxis, occupancyAxis}}}); + {HistType::kTHnSparseF, + {phiAxis, etaAxis, centralityAxis, occupancyAxis}}}); } } @@ -310,9 +438,10 @@ struct DndetaMFTPbPb { registry.add({"Tracks/EtaZvtxGen", "; #eta; Z_{vtx} (cm); occupancy", {HistType::kTHnSparseF, {etaAxis, zAxis, occupancyAxis}}}); - registry.add({"Tracks/PhiEtaGen", - "; #varphi; #eta;", - {HistType::kTHnSparseF, {phiAxis, etaAxis, occupancyAxis}}}); + registry.add( + {"Tracks/PhiEtaGen", + "; #varphi; #eta;", + {HistType::kTHnSparseF, {phiAxis, etaAxis, occupancyAxis}}}); registry.add({"Tracks/EtaZvtxGen_t", "; #eta; Z_{vtx} (cm);", {HistType::kTH2F, {etaAxis, zAxis}}}); @@ -325,7 +454,9 @@ struct DndetaMFTPbPb { qaregistry.add({"Events/ZvtxDiff", "; Z_{rec} - Z_{gen} (cm)", {HistType::kTH1F, {deltaZAxis}}}); - qaregistry.add({"Events/SplitMult", "; N_{gen}; #it{z}_{vtx} (cm)", {HistType::kTH2F, {multAxis, zAxis}}}); + qaregistry.add({"Events/SplitMult", + "; N_{gen}; #it{z}_{vtx} (cm)", + {HistType::kTH2F, {multAxis, zAxis}}}); } if (doprocessMCCentFT0C || doprocessMCwBestTracksCentFT0C || @@ -335,103 +466,147 @@ struct DndetaMFTPbPb { doprocessMCCentMFT || doprocessMCwBestTracksCentMFT) { registry.add({"Events/Centrality/EvtEffGen", ";status;centrality;occupancy", - {HistType::kTHnSparseF, {{3, 0.5, 3.5}, centralityAxis, occupancyAxis}}}); + {HistType::kTHnSparseF, + {{3, 0.5, 3.5}, centralityAxis, occupancyAxis}}}); auto heff = registry.get(HIST("Events/Centrality/EvtEffGen")); heff->GetAxis(0)->SetBinLabel(1, "All reconstructed"); heff->GetAxis(0)->SetBinLabel(2, "Selected reconstructed"); heff->GetAxis(0)->SetBinLabel(3, "All generated"); - registry.add({"Events/Centrality/NtrkZvtxGen_t", - "; N_{trk}; Z_{vtx} (cm); centrality", - {HistType::kTHnSparseF, {multAxis, zAxis, centralityAxis}}}); + registry.add( + {"Events/Centrality/NtrkZvtxGen_t", + "; N_{trk}; Z_{vtx} (cm); centrality", + {HistType::kTHnSparseF, {multAxis, zAxis, centralityAxis}}}); registry.add({"Events/Centrality/NtrkZvtxGen", "; N_{trk}; Z_{vtx} (cm); centrality; occupancy", - {HistType::kTHnSparseF, {multAxis, zAxis, centralityAxis, occupancyAxis}}}); + {HistType::kTHnSparseF, + {multAxis, zAxis, centralityAxis, occupancyAxis}}}); registry.add({"Events/Centrality/hRecCent", "; centrality; occupancy", {HistType::kTH2F, {centralityAxis, occupancyAxis}}}); - registry.add({"Events/Centrality/hRecZvtxCent", - "; Z_{vtx} (cm); centrality; occupancy", - {HistType::kTHnSparseF, {zAxis, centralityAxis, occupancyAxis}}}); + registry.add( + {"Events/Centrality/hRecZvtxCent", + "; Z_{vtx} (cm); centrality; occupancy", + {HistType::kTHnSparseF, {zAxis, centralityAxis, occupancyAxis}}}); registry.add({"Tracks/Centrality/EtaZvtxGen", "; #eta; Z_{vtx} (cm); centrality; occupancy", - {HistType::kTHnSparseF, {etaAxis, zAxis, centralityAxis, occupancyAxis}}}); + {HistType::kTHnSparseF, + {etaAxis, zAxis, centralityAxis, occupancyAxis}}}); registry.add({"Tracks/Centrality/PhiEtaGen", "; #varphi; #eta; centrality; occupancy", - {HistType::kTHnSparseF, {phiAxis, etaAxis, centralityAxis, occupancyAxis}}}); + {HistType::kTHnSparseF, + {phiAxis, etaAxis, centralityAxis, occupancyAxis}}}); registry.add({"Tracks/Centrality/EtaZvtxGen_t", "; #eta; Z_{vtx} (cm); centrality", {HistType::kTHnSparseF, {etaAxis, zAxis, centralityAxis}}}); - registry.add({"Tracks/Centrality/PhiEtaGen_t", - "; #varphi; #eta; centrality", - {HistType::kTHnSparseF, {phiAxis, etaAxis, centralityAxis}}}); + registry.add( + {"Tracks/Centrality/PhiEtaGen_t", + "; #varphi; #eta; centrality", + {HistType::kTHnSparseF, {phiAxis, etaAxis, centralityAxis}}}); qaregistry.add({"Events/Centrality/NotFoundEventZvtx", "; #it{z}_{vtx} (cm); centrality", {HistType::kTH2F, {zAxis, centralityAxis}}}); qaregistry.add({"Events/Centrality/ZvtxDiff", "; Z_{rec} - Z_{gen} (cm); centrality", {HistType::kTH2F, {deltaZAxis, centralityAxis}}}); - qaregistry.add({"Events/Centrality/SplitMult", - "; N_{gen}; #it{z}_{vtx} (cm); centrality", - {HistType::kTHnSparseF, {multAxis, zAxis, centralityAxis}}}); + qaregistry.add( + {"Events/Centrality/SplitMult", + "; N_{gen}; #it{z}_{vtx} (cm); centrality", + {HistType::kTHnSparseF, {multAxis, zAxis, centralityAxis}}}); } if (doprocessTrkEffIdxInlusive) { qaregistry.add({"Tracks/hPtPhiEtaZvtxEffGen", "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", - {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); + {HistType::kTHnSparseF, + {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); qaregistry.add({"Tracks/hPtPhiEtaZvtxEffRec", "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", - {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/hPhiEtaDuplicates", - "; #varphi; #eta; occupancy", - {HistType::kTHnSparseF, {phiAxis, etaAxis, occupancyAxis}}}); + {HistType::kTHnSparseF, + {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); + qaregistry.add( + {"Tracks/hPhiEtaDuplicates", + "; #varphi; #eta; occupancy", + {HistType::kTHnSparseF, {phiAxis, etaAxis, occupancyAxis}}}); qaregistry.add({"Tracks/hPtPhiEtaZvtxEffDuplicates", "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", - {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); + {HistType::kTHnSparseF, + {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); qaregistry.add({"Tracks/hPtPhiEtaZvtxEffGenDuplicates", "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", - {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); + {HistType::kTHnSparseF, + {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); qaregistry.add({"Tracks/NmftTrkPerPart", "; #it{N}_{mft tracks per particle}; occupancy", {HistType::kTH2F, {multAxis, occupancyAxis}}}); } if (doprocessTrkEffIdxCentFT0C) { - qaregistry.add({"Tracks/Centrality/hPtPhiEtaZvtxEffGen", - "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); centrality; occupancy", - {HistType::kTHnSparseF, - {ptAxis, phiAxis, etaAxis, zAxis, centralityAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/Centrality/hPtPhiEtaZvtxEffRec", - "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); centrality; occupancy", - {HistType::kTHnSparseF, - {ptAxis, phiAxis, etaAxis, zAxis, centralityAxis, occupancyAxis}}}); + qaregistry.add( + {"Tracks/Centrality/hPtPhiEtaZvtxEffGen", + "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); centrality; " + "occupancy", + {HistType::kTHnSparseF, + {ptAxis, phiAxis, etaAxis, zAxis, centralityAxis, occupancyAxis}}}); + qaregistry.add( + {"Tracks/Centrality/hPtPhiEtaZvtxEffRec", + "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); centrality; " + "occupancy", + {HistType::kTHnSparseF, + {ptAxis, phiAxis, etaAxis, zAxis, centralityAxis, occupancyAxis}}}); qaregistry.add({"Tracks/Centrality/hPhiEtaDuplicates", "; #varphi; #eta; centrality; occupancy", - {HistType::kTHnSparseF, {phiAxis, etaAxis, centralityAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/Centrality/hPtPhiEtaZvtxEffDuplicates", - "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); centrality; occupancy", {HistType::kTHnSparseF, - {ptAxis, phiAxis, etaAxis, zAxis, centralityAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/Centrality/hPtPhiEtaZvtxEffGenDuplicates", - "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); centrality; occupancy", - {HistType::kTHnSparseF, - {ptAxis, phiAxis, etaAxis, zAxis, centralityAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/Centrality/NmftTrkPerPart", - "; #it{N}_{mft tracks per particle}; centrality; occupancy", - {HistType::kTHnSparseF, {multAxis, centralityAxis, occupancyAxis}}}); + {phiAxis, etaAxis, centralityAxis, occupancyAxis}}}); + qaregistry.add( + {"Tracks/Centrality/hPtPhiEtaZvtxEffDuplicates", + "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); centrality; " + "occupancy", + {HistType::kTHnSparseF, + {ptAxis, phiAxis, etaAxis, zAxis, centralityAxis, occupancyAxis}}}); + qaregistry.add( + {"Tracks/Centrality/hPtPhiEtaZvtxEffGenDuplicates", + "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); centrality; " + "occupancy", + {HistType::kTHnSparseF, + {ptAxis, phiAxis, etaAxis, zAxis, centralityAxis, occupancyAxis}}}); + qaregistry.add( + {"Tracks/Centrality/NmftTrkPerPart", + "; #it{N}_{mft tracks per particle}; centrality; occupancy", + {HistType::kTHnSparseF, {multAxis, centralityAxis, occupancyAxis}}}); } if (doprocessTrkEffBestInclusive) { - qaregistry.add({"Tracks/hPtPhiEtaZvtxEffBestGen", "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/hPtPhiEtaZvtxEffBestRec", "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/hPtEffBestFakeRec", " ; p_{T} (GeV/c); occupancy", {HistType::kTH2F, {ptAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/hPtPhiEtaZvtxEffBestGen", + "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", + {HistType::kTHnSparseF, + {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/hPtPhiEtaZvtxEffBestRec", + "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", + {HistType::kTHnSparseF, + {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/hPtEffBestFakeRec", + " ; p_{T} (GeV/c); occupancy", + {HistType::kTH2F, {ptAxis, occupancyAxis}}}); } if (doprocessTrkEffBestCentFT0C) { - qaregistry.add({"Tracks/Centrality/hPtPhiEtaZvtxEffBestGen", "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); centrality; occupancy", {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis, centralityAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/Centrality/hPtPhiEtaZvtxEffBestRec", "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); centrality; occupancy", {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis, centralityAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/Centrality/hPtEffBestFakeRec", "; p_{T} (GeV/c); centrality; occupancy", {HistType::kTHnSparseF, {ptAxis, centralityAxis, occupancyAxis}}}); + qaregistry.add( + {"Tracks/Centrality/hPtPhiEtaZvtxEffBestGen", + "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); centrality; " + "occupancy", + {HistType::kTHnSparseF, + {ptAxis, phiAxis, etaAxis, zAxis, centralityAxis, occupancyAxis}}}); + qaregistry.add( + {"Tracks/Centrality/hPtPhiEtaZvtxEffBestRec", + "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); centrality; " + "occupancy", + {HistType::kTHnSparseF, + {ptAxis, phiAxis, etaAxis, zAxis, centralityAxis, occupancyAxis}}}); + qaregistry.add( + {"Tracks/Centrality/hPtEffBestFakeRec", + "; p_{T} (GeV/c); centrality; occupancy", + {HistType::kTHnSparseF, {ptAxis, centralityAxis, occupancyAxis}}}); } if (doprocessMcQAInclusive) { @@ -447,53 +622,95 @@ struct DndetaMFTPbPb { } if (doprocessMcQACentFT0C) { - qaregistry.add({"Events/Centrality/hRecPerGenColls", "; #it{N}_{reco collisions} / #it{N}_{gen collisions}; centrality", {HistType::kTHnSparseF, {{200, 0., 2.}, centralityAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/Centrality/hNmftTrks", "; #it{N}_{mft tracks}; centrality", {HistType::kTHnSparseF, {{200, -0.5, 200.}, centralityAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/Centrality/hFracAmbiguousMftTrks", "; #it{N}_{ambiguous tracks} / #it{N}_{tracks}; centrality", {HistType::kTHnSparseF, {{100, 0., 1.}, centralityAxis, occupancyAxis}}}); + qaregistry.add( + {"Events/Centrality/hRecPerGenColls", + "; #it{N}_{reco collisions} / #it{N}_{gen collisions}; centrality", + {HistType::kTHnSparseF, + {{200, 0., 2.}, centralityAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/Centrality/hNmftTrks", + "; #it{N}_{mft tracks}; centrality", + {HistType::kTHnSparseF, + {{200, -0.5, 200.}, centralityAxis, occupancyAxis}}}); + qaregistry.add( + {"Tracks/Centrality/hFracAmbiguousMftTrks", + "; #it{N}_{ambiguous tracks} / #it{N}_{tracks}; centrality", + {HistType::kTHnSparseF, + {{100, 0., 1.}, centralityAxis, occupancyAxis}}}); } if (doprocessCheckAmbiguousMftTracksInclusive) { - qaregistry.add({"Tracks/hMftTracksAmbDegree", " ; N_{coll}^{comp}; occupancy", {HistType::kTH2F, {{41, -0.5, 40.5}, occupancyAxis}}}); - qaregistry.add({"Tracks/hAmbTrackType", " ; Ambiguous track type; occupancy", {HistType::kTH2F, {{5, -0.5, 4.5}, occupancyAxis}}}); - qaregistry.add({"Tracks/histAmbZvtx", "#it{z}_{vtx} of collisions associated to a track;#it{z}_{vtx} (cm);", {HistType::kTH1F, {zAxis}}}); + qaregistry.add({"Tracks/hMftTracksAmbDegree", + " ; N_{coll}^{comp}; occupancy", + {HistType::kTH2F, {{41, -0.5, 40.5}, occupancyAxis}}}); + qaregistry.add({"Tracks/hAmbTrackType", + " ; Ambiguous track type; occupancy", + {HistType::kTH2F, {{5, -0.5, 4.5}, occupancyAxis}}}); + qaregistry.add({"Tracks/histAmbZvtx", + "#it{z}_{vtx} of collisions associated to a " + "track;#it{z}_{vtx} (cm);", + {HistType::kTH1F, {zAxis}}}); } if (doprocessCheckAmbiguousMftTracksCentFT0C) { - qaregistry.add({"Tracks/Centrality/hMftTracksAmbDegree", " ; N_{coll}^{comp}; occupancy", {HistType::kTHnSparseF, {{41, -0.5, 40.5}, centralityAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/Centrality/hAmbTrackType", " ; Ambiguous track type; occupancy", {HistType::kTHnSparseF, {{5, -0.5, 4.5}, centralityAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/Centrality/hMftTracksAmbDegree", + " ; N_{coll}^{comp}; occupancy", + {HistType::kTHnSparseF, + {{41, -0.5, 40.5}, centralityAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/Centrality/hAmbTrackType", + " ; Ambiguous track type; occupancy", + {HistType::kTHnSparseF, + {{5, -0.5, 4.5}, centralityAxis, occupancyAxis}}}); } if (doprocessEfficiencyInclusive) { - qaregistry.add({"Tracks/hEffRec", "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/hEffFake", "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/hEffRec", + "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", + {HistType::kTHnSparseF, + {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/hEffFake", + "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", + {HistType::kTHnSparseF, + {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); } if (doprocessEfficiencyCentFT0C) { - qaregistry.add({"Tracks/Centrality/hEffRec", "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/Centrality/hEffFake", "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", {HistType::kTHnSparseF, {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/Centrality/hEffRec", + "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", + {HistType::kTHnSparseF, + {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/Centrality/hEffFake", + "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", + {HistType::kTHnSparseF, + {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); } } /// Filters - tracks - Filter filtTrkEta = (aod::fwdtrack::eta < trkcuts.cfgEtaMax) && (aod::fwdtrack::eta > trkcuts.cfgEtaMin); + Filter filtTrkEta = (aod::fwdtrack::eta < trackCuts.maxEta) && + (aod::fwdtrack::eta > trackCuts.minEta); Filter filtATrackID = (aod::fwdtrack::bestCollisionId >= 0); - Filter filtATrackDCA = (nabs(aod::fwdtrack::bestDCAXY) < trkcuts.cfgDCAxyMax); + Filter filtATrackDCA = (nabs(aod::fwdtrack::bestDCAXY) < trackCuts.maxDCAxy); /// Filters - mc particles - Filter primaries = (aod::mcparticle::flags & (uint8_t)o2::aod::mcparticle::enums::PhysicalPrimary) == (uint8_t)o2::aod::mcparticle::enums::PhysicalPrimary; + Filter primaries = (aod::mcparticle::flags & + (uint8_t)o2::aod::mcparticle::enums::PhysicalPrimary) == + (uint8_t)o2::aod::mcparticle::enums::PhysicalPrimary; /// Joined tables using FullBCs = soa::Join; - using CollBCs = soa::Join; + using CollBCs = soa::Join; using Colls = soa::Join; using Coll = Colls::iterator; using CollsCentFT0C = soa::Join; - using CollsCentFT0CVariant1 = soa::Join; + using CollsCentFT0CVariant1 = + soa::Join; using CollsCentFT0M = soa::Join; - using CollsCentNGlobal = soa::Join; + using CollsCentNGlobal = + soa::Join; using CollsCentMFT = soa::Join; using CollCentFT0C = CollsCentFT0C::iterator; - using CollsGenCentFT0C = soa::Join; + using CollsGenCentFT0C = soa::Join; using CollGenCent = CollsGenCentFT0C::iterator; using MFTTracksLabeled = soa::Join; using MftTracksWColls = soa::Join; @@ -504,24 +721,50 @@ struct DndetaMFTPbPb { using FiltBestTracks = soa::Filtered; using FiltParticles = soa::Filtered; + bool isIRSelected(CollBCs::iterator const& bc, bool fillHis = false) + { + double ir = (eventCuts.minIR >= 0 || eventCuts.maxIR >= 0) + ? rateFetcher.fetch(ccdb.service, bc.timestamp(), + bc.runNumber(), "ZNC hadronic") * + 1.e-3 + : -1; + if (eventCuts.minIR >= 0 && ir < eventCuts.minIR) { + return false; + } + if (fillHis) { + registry.fill(HIST("hEvtSel"), 9); + } + if (eventCuts.maxIR >= 0 && ir > eventCuts.maxIR) { + return false; + } + if (fillHis) { + registry.fill(HIST("hEvtSel"), 10); + } + return true; + } + template bool isTrackSelected(const T& track) { - if (track.eta() < trkcuts.cfgEtaMin || track.eta() > trkcuts.cfgEtaMax) + if (track.eta() < trackCuts.minEta || track.eta() > trackCuts.maxEta) return false; - if (trkcuts.cfgRequireCA && !track.isCA()) + if (trackCuts.requireCA && !track.isCA()) return false; - if (track.nClusters() < trkcuts.cfgMinNclusterMft) + if (track.nClusters() < trackCuts.minNclusterMft) return false; - if (track.pt() < trkcuts.cfgPtMin) + if (track.pt() < trackCuts.minPt) return false; - if (usePhiCut) { + if (trackCuts.usephiCut) { float phi = track.phi(); o2::math_utils::bringTo02Pi(phi); - if (phi < trkcuts.cfgPhiMin || trkcuts.cfgPhiMax < phi) { + if (phi < trackCuts.minPhi || trackCuts.maxPhi < phi) { return false; } - if ((phi < cfgPhiCut) || ((phi > PI - cfgPhiCut) && (phi < PI + cfgPhiCut)) || (phi > TwoPI - cfgPhiCut) || ((phi > ((PIHalf - 0.1) * PI) - cfgPhiCut) && (phi < ((PIHalf - 0.1) * PI) + cfgPhiCut))) + if ((phi < trackCuts.phiCut) || + ((phi > PI - trackCuts.phiCut) && (phi < PI + trackCuts.phiCut)) || + (phi > TwoPI - trackCuts.phiCut) || + ((phi > ((PIHalf - 0.1) * PI) - trackCuts.phiCut) && + (phi < ((PIHalf - 0.1) * PI) + trackCuts.phiCut))) return false; } return true; @@ -535,13 +778,18 @@ struct DndetaMFTPbPb { for (auto const& track : tracks) { if (fillHis) { if constexpr (has_reco_cent) { - qaregistry.fill(HIST("Tracks/Centrality/Chi2Eta"), track.chi2(), track.eta(), c, occ); - qaregistry.fill(HIST("Tracks/Centrality/Chi2"), track.chi2(), c, occ); - qaregistry.fill(HIST("Tracks/Centrality/NclustersEta"), track.nClusters(), track.eta(), c, occ); + qaregistry.fill(HIST("Tracks/Centrality/Chi2Eta"), track.chi2(), + track.eta(), c, occ); + qaregistry.fill(HIST("Tracks/Centrality/Chi2"), track.chi2(), c, + occ); + qaregistry.fill(HIST("Tracks/Centrality/NclustersEta"), + track.nClusters(), track.eta(), c, occ); } else { - qaregistry.fill(HIST("Tracks/Chi2Eta"), track.chi2(), track.eta(), occ); + qaregistry.fill(HIST("Tracks/Chi2Eta"), track.chi2(), track.eta(), + occ); qaregistry.fill(HIST("Tracks/Chi2"), track.chi2(), occ); - qaregistry.fill(HIST("Tracks/NclustersEta"), track.nClusters(), track.eta(), occ); + qaregistry.fill(HIST("Tracks/NclustersEta"), track.nClusters(), + track.eta(), occ); } } if (!isTrackSelected(track)) { @@ -554,8 +802,10 @@ struct DndetaMFTPbPb { continue; } if constexpr (has_reco_cent) { - registry.fill(HIST("Tracks/Centrality/EtaZvtx"), track.eta(), z, c, occ); - registry.fill(HIST("Tracks/Centrality/PhiEta"), phi, track.eta(), c, occ); + registry.fill(HIST("Tracks/Centrality/EtaZvtx"), track.eta(), z, c, + occ); + registry.fill(HIST("Tracks/Centrality/PhiEta"), phi, track.eta(), c, + occ); } else { registry.fill(HIST("Tracks/EtaZvtx"), track.eta(), z, occ); registry.fill(HIST("Tracks/PhiEta"), phi, track.eta(), occ); @@ -575,7 +825,8 @@ struct DndetaMFTPbPb { } template - int countBestTracks(T const& /*tracks*/, B const& besttracks, float z, float c, float occ) + int countBestTracks(T const& /*tracks*/, B const& besttracks, float z, + float c, float occ) { auto nATrk = 0; if (besttracks.size() > 0) { @@ -591,28 +842,40 @@ struct DndetaMFTPbPb { continue; } if constexpr (has_reco_cent) { - registry.fill(HIST("Tracks/Centrality/EtaZvtxBest"), itrack.eta(), z, c, occ); - registry.fill(HIST("Tracks/Centrality/PhiEtaBest"), phi, itrack.eta(), c, occ); - qaregistry.fill(HIST("Tracks/Centrality/EtaZvtxCentOccBest"), itrack.eta(), z, c, occ); - qaregistry.fill(HIST("Tracks/Centrality/DCAXYPt"), itrack.pt(), atrack.bestDCAXY(), c, occ); - qaregistry.fill(HIST("Tracks/Centrality/DCAXY"), atrack.bestDCAXY(), c, occ); - qaregistry.fill(HIST("Tracks/Centrality/NclustersEtaBest"), itrack.nClusters(), itrack.eta(), c, occ); + registry.fill(HIST("Tracks/Centrality/EtaZvtxBest"), itrack.eta(), + z, c, occ); + registry.fill(HIST("Tracks/Centrality/PhiEtaBest"), phi, + itrack.eta(), c, occ); + qaregistry.fill(HIST("Tracks/Centrality/DCAXYPt"), itrack.pt(), + atrack.bestDCAXY(), c, occ); + qaregistry.fill(HIST("Tracks/Centrality/DCAXY"), atrack.bestDCAXY(), + c, occ); + qaregistry.fill(HIST("Tracks/Centrality/NclustersEtaBest"), + itrack.nClusters(), itrack.eta(), c, occ); if (itrack.collisionId() != atrack.bestCollisionId()) { - qaregistry.fill(HIST("Tracks/Centrality/ReTracksEtaZvtx"), itrack.eta(), z, c, occ); - qaregistry.fill(HIST("Tracks/Centrality/ReTracksPhiEta"), phi, itrack.eta(), c, occ); + qaregistry.fill(HIST("Tracks/Centrality/ReTracksEtaZvtx"), + itrack.eta(), z, c, occ); + qaregistry.fill(HIST("Tracks/Centrality/ReTracksPhiEta"), phi, + itrack.eta(), c, occ); } - qaregistry.fill(HIST("Tracks/Centrality/TrackAmbDegree"), atrack.ambDegree(), c, occ); + qaregistry.fill(HIST("Tracks/Centrality/TrackAmbDegree"), + atrack.ambDegree(), c, occ); } else { registry.fill(HIST("Tracks/EtaZvtxBest"), itrack.eta(), z, occ); registry.fill(HIST("Tracks/PhiEtaBest"), phi, itrack.eta(), occ); - qaregistry.fill(HIST("Tracks/DCAXYPt"), itrack.pt(), atrack.bestDCAXY(), occ); + qaregistry.fill(HIST("Tracks/DCAXYPt"), itrack.pt(), + atrack.bestDCAXY(), occ); qaregistry.fill(HIST("Tracks/DCAXY"), atrack.bestDCAXY(), occ); - qaregistry.fill(HIST("Tracks/NclustersEtaBest"), itrack.nClusters(), itrack.eta(), occ); + qaregistry.fill(HIST("Tracks/NclustersEtaBest"), itrack.nClusters(), + itrack.eta(), occ); if (itrack.collisionId() != atrack.bestCollisionId()) { - qaregistry.fill(HIST("Tracks/ReTracksEtaZvtx"), itrack.eta(), z, occ); - qaregistry.fill(HIST("Tracks/ReTracksPhiEta"), phi, itrack.eta(), occ); + qaregistry.fill(HIST("Tracks/ReTracksEtaZvtx"), itrack.eta(), z, + occ); + qaregistry.fill(HIST("Tracks/ReTracksPhiEta"), phi, itrack.eta(), + occ); } - qaregistry.fill(HIST("Tracks/TrackAmbDegree"), atrack.ambDegree(), occ); + qaregistry.fill(HIST("Tracks/TrackAmbDegree"), atrack.ambDegree(), + occ); } } ++nATrk; @@ -673,35 +936,37 @@ struct DndetaMFTPbPb { if constexpr (fillHis) { registry.fill(HIST("hEvtSel"), 3); } - if (std::abs(collision.posZ()) >= cfgCutZvtx) { + if (std::abs(collision.posZ()) >= eventCuts.maxZvtx) { return false; } if constexpr (fillHis) { registry.fill(HIST("hEvtSel"), 4); } - if (requireNoCollInTimeRangeStd && + if (eventCuts.requireNoCollInTimeRangeStd && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { return false; } if constexpr (fillHis) { registry.fill(HIST("hEvtSel"), 5); } - if (requireNoCollInTimeRangeNarrow && + if (eventCuts.requireNoCollInTimeRangeNarrow && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeNarrow)) { return false; } if constexpr (fillHis) { registry.fill(HIST("hEvtSel"), 6); } - if (minOccupancy > 0 && - getOccupancy(collision, cfgOccEstimator) < minOccupancy) { + if (eventCuts.minOccupancy >= 0 && + getOccupancy(collision, eventCuts.occupancyEstimator) < + eventCuts.minOccupancy) { return false; } if constexpr (fillHis) { registry.fill(HIST("hEvtSel"), 7); } - if (maxOccupancy > 0 && - getOccupancy(collision, cfgOccEstimator) > maxOccupancy) { + if (eventCuts.maxOccupancy >= 0 && + getOccupancy(collision, eventCuts.occupancyEstimator) > + eventCuts.maxOccupancy) { return false; } if constexpr (fillHis) { @@ -723,7 +988,8 @@ struct DndetaMFTPbPb { } template - void fillHistMC(P const& particles, float c, float occ, float zvtx, bool const gtZeroColl) + void fillHistMC(P const& particles, float c, float occ, float zvtx, + bool const gtZeroColl) { for (auto const& particle : particles) { if (!isChrgParticle(particle.pdgCode())) { @@ -736,8 +1002,10 @@ struct DndetaMFTPbPb { continue; } if constexpr (isCent) { - registry.fill(HIST("Tracks/Centrality/EtaZvtxGen_t"), particle.eta(), zvtx, c); - registry.fill(HIST("Tracks/Centrality/PhiEtaGen_t"), phi, particle.eta(), c); + registry.fill(HIST("Tracks/Centrality/EtaZvtxGen_t"), particle.eta(), + zvtx, c); + registry.fill(HIST("Tracks/Centrality/PhiEtaGen_t"), phi, + particle.eta(), c); } else { registry.fill(HIST("Tracks/EtaZvtxGen_t"), particle.eta(), zvtx); registry.fill(HIST("Tracks/PhiEtaGen_t"), phi, particle.eta()); @@ -750,8 +1018,10 @@ struct DndetaMFTPbPb { continue; } if constexpr (isCent) { - registry.fill(HIST("Tracks/Centrality/EtaZvtxGen"), particle.eta(), zvtx, c, occ); - registry.fill(HIST("Tracks/Centrality/PhiEtaGen"), phi, particle.eta(), c, occ); + registry.fill(HIST("Tracks/Centrality/EtaZvtxGen"), particle.eta(), + zvtx, c, occ); + registry.fill(HIST("Tracks/Centrality/PhiEtaGen"), phi, + particle.eta(), c, occ); } else { registry.fill(HIST("Tracks/EtaZvtxGen"), particle.eta(), zvtx, occ); registry.fill(HIST("Tracks/PhiEtaGen"), phi, particle.eta(), occ); @@ -789,29 +1059,43 @@ struct DndetaMFTPbPb { } } - PROCESS_SWITCH(DndetaMFTPbPb, processTagging, "Collect event sample stats", true); + PROCESS_SWITCH(DndetaMFTPbPb, processTagging, "Collect event sample stats", + true); /// @brief process function for counting tracks template - void processData(typename C::iterator const& collision, FiltMftTracks const& tracks) + void processData(typename C::iterator const& collision, + FiltMftTracks const& tracks, CollBCs const& /*bcs*/) { - auto occ = getOccupancy(collision, cfgOccEstimator); + auto occ = getOccupancy(collision, eventCuts.occupancyEstimator); float c = getRecoCent(collision); + auto bc = collision.template foundBC_as(); + double ir = rateFetcher.fetch(ccdb.service, bc.timestamp(), bc.runNumber(), + "ZNC hadronic") * + 1.e-3; if constexpr (has_reco_cent) { registry.fill(HIST("Events/Centrality/Selection"), 1., c, occ); } else { registry.fill(HIST("Events/Selection"), 1., occ); } + if (!isGoodEvent(collision)) { return; } + if (!isIRSelected(bc, true)) { + return; + } + auto z = collision.posZ(); if constexpr (has_reco_cent) { registry.fill(HIST("Events/Centrality/Selection"), 2., c, occ); qaregistry.fill(HIST("Events/Centrality/hZvtxCent"), z, c, occ); qaregistry.fill(HIST("Events/Centrality/hCent"), c, occ); + qaregistry.fill(HIST("hCentOccIRate"), c, occ, ir); + } else { + qaregistry.fill(HIST("hOccIRate"), occ, ir); registry.fill(HIST("Events/Selection"), 2., occ); } @@ -824,128 +1108,199 @@ struct DndetaMFTPbPb { } } - /// @brief process function for counting tracks (based on BestCollisionsFwd table) + /// @brief process function for counting tracks (based on BestCollisionsFwd + /// table) template - void processDatawBestTracks(typename C::iterator const& collision, FiltMftTracks const& tracks, soa::SmallGroups const& besttracks) + void processDatawBestTracks( + typename C::iterator const& collision, FiltMftTracks const& tracks, + soa::SmallGroups const& besttracks, + CollBCs const& /*bcs*/) { - auto occ = getOccupancy(collision, cfgOccEstimator); + auto occ = getOccupancy(collision, eventCuts.occupancyEstimator); float c = getRecoCent(collision); + auto bc = collision.template foundBC_as(); + double ir = rateFetcher.fetch(ccdb.service, bc.timestamp(), bc.runNumber(), + "ZNC hadronic") * + 1.e-3; if constexpr (has_reco_cent) { registry.fill(HIST("Events/Centrality/Selection"), 1., c, occ); } else { registry.fill(HIST("Events/Selection"), 1., occ); } + if (!isGoodEvent(collision)) { return; } + if (!isIRSelected(bc, true)) { + return; + } + auto z = collision.posZ(); if constexpr (has_reco_cent) { registry.fill(HIST("Events/Centrality/Selection"), 2., c, occ); + qaregistry.fill(HIST("hCentOccIRate"), c, occ, ir); } else { registry.fill(HIST("Events/Selection"), 2., occ); + qaregistry.fill(HIST("hOccIRate"), occ, ir); } auto nBestTrks = countBestTracks(tracks, besttracks, z, c, occ); if constexpr (has_reco_cent) { - registry.fill(HIST("Events/Centrality/NtrkZvtxBest"), nBestTrks, z, c, occ); + registry.fill(HIST("Events/Centrality/NtrkZvtxBest"), nBestTrks, z, c, + occ); } else { registry.fill(HIST("Events/NtrkZvtxBest"), nBestTrks, z, occ); } } - void processDataInclusive(Colls::iterator const& collision, FiltMftTracks const& tracks) + void processDataInclusive(Colls::iterator const& collision, + FiltMftTracks const& tracks, CollBCs const& bcs) { - processData(collision, tracks); + processData(collision, tracks, bcs); } - PROCESS_SWITCH(DndetaMFTPbPb, processDataInclusive, "Count tracks (inclusive)", false); + PROCESS_SWITCH(DndetaMFTPbPb, processDataInclusive, + "Count tracks (inclusive)", false); - void processDataCentFT0C(CollsCentFT0C::iterator const& collision, FiltMftTracks const& tracks) + void processDataCentFT0C(CollsCentFT0C::iterator const& collision, + FiltMftTracks const& tracks, CollBCs const& bcs) { - processData(collision, tracks); + processData(collision, tracks, bcs); } - PROCESS_SWITCH(DndetaMFTPbPb, processDataCentFT0C, "Count tracks in FT0C centrality bins", false); + PROCESS_SWITCH(DndetaMFTPbPb, processDataCentFT0C, + "Count tracks in FT0C centrality bins", false); - void processDataCentFT0CVariant1(CollsCentFT0CVariant1::iterator const& collision, FiltMftTracks const& tracks) + void + processDataCentFT0CVariant1(CollsCentFT0CVariant1::iterator const& collision, + FiltMftTracks const& tracks, CollBCs const& bcs) { - processData(collision, tracks); + processData(collision, tracks, bcs); } - PROCESS_SWITCH(DndetaMFTPbPb, processDataCentFT0CVariant1, "Count tracks in FT0CVariant1 centrality bins", false); + PROCESS_SWITCH(DndetaMFTPbPb, processDataCentFT0CVariant1, + "Count tracks in FT0CVariant1 centrality bins", false); - void processDataCentFT0M(CollsCentFT0M::iterator const& collision, FiltMftTracks const& tracks) + void processDataCentFT0M(CollsCentFT0M::iterator const& collision, + FiltMftTracks const& tracks, CollBCs const& bcs) { - processData(collision, tracks); + processData(collision, tracks, bcs); } - PROCESS_SWITCH(DndetaMFTPbPb, processDataCentFT0M, "Count tracks in FT0M centrality bins", false); + PROCESS_SWITCH(DndetaMFTPbPb, processDataCentFT0M, + "Count tracks in FT0M centrality bins", false); - void processDataCentNGlobal(CollsCentNGlobal::iterator const& collision, FiltMftTracks const& tracks) + void processDataCentNGlobal(CollsCentNGlobal::iterator const& collision, + FiltMftTracks const& tracks, CollBCs const& bcs) { - processData(collision, tracks); + processData(collision, tracks, bcs); } - PROCESS_SWITCH(DndetaMFTPbPb, processDataCentNGlobal, "Count tracks in NGlobal centrality bins", false); + PROCESS_SWITCH(DndetaMFTPbPb, processDataCentNGlobal, + "Count tracks in NGlobal centrality bins", false); - void processDataCentMFT(CollsCentMFT::iterator const& collision, FiltMftTracks const& tracks) + void processDataCentMFT(CollsCentMFT::iterator const& collision, + FiltMftTracks const& tracks, CollBCs const& bcs) { - processData(collision, tracks); + processData(collision, tracks, bcs); } - PROCESS_SWITCH(DndetaMFTPbPb, processDataCentMFT, "Count tracks in MFT centrality bins", false); + PROCESS_SWITCH(DndetaMFTPbPb, processDataCentMFT, + "Count tracks in MFT centrality bins", false); - void processDatawBestTracksInclusive(Colls::iterator const& collision, FiltMftTracks const& tracks, soa::SmallGroups const& besttracks) + void processDatawBestTracksInclusive( + Colls::iterator const& collision, FiltMftTracks const& tracks, + soa::SmallGroups const& besttracks, + CollBCs const& bcs) { - processDatawBestTracks(collision, tracks, besttracks); + processDatawBestTracks(collision, tracks, besttracks, bcs); } - PROCESS_SWITCH(DndetaMFTPbPb, processDatawBestTracksInclusive, "Count tracks based on BestCollisionsFwd table (inclusive)", false); + PROCESS_SWITCH(DndetaMFTPbPb, processDatawBestTracksInclusive, + "Count tracks based on BestCollisionsFwd table (inclusive)", + false); - void processDatawBestTracksCentFT0C(CollsCentFT0C::iterator const& collision, FiltMftTracks const& tracks, soa::SmallGroups const& besttracks) + void processDatawBestTracksCentFT0C( + CollsCentFT0C::iterator const& collision, FiltMftTracks const& tracks, + soa::SmallGroups const& besttracks, + CollBCs const& bcs) { - processDatawBestTracks(collision, tracks, besttracks); + processDatawBestTracks(collision, tracks, besttracks, bcs); } - PROCESS_SWITCH(DndetaMFTPbPb, processDatawBestTracksCentFT0C, "Count tracks in FT0C centrality bins based on BestCollisionsFwd table", false); + PROCESS_SWITCH( + DndetaMFTPbPb, processDatawBestTracksCentFT0C, + "Count tracks in FT0C centrality bins based on BestCollisionsFwd table", + false); - void processDatawBestTracksCentFT0CVariant1(CollsCentFT0CVariant1::iterator const& collision, FiltMftTracks const& tracks, soa::SmallGroups const& besttracks) + void processDatawBestTracksCentFT0CVariant1( + CollsCentFT0CVariant1::iterator const& collision, + FiltMftTracks const& tracks, + soa::SmallGroups const& besttracks, + CollBCs const& bcs) { - processDatawBestTracks(collision, tracks, besttracks); + processDatawBestTracks(collision, tracks, besttracks, + bcs); } - PROCESS_SWITCH(DndetaMFTPbPb, processDatawBestTracksCentFT0CVariant1, "Count tracks in FT0CVariant1 centrality bins based on BestCollisionsFwd table", false); + PROCESS_SWITCH(DndetaMFTPbPb, processDatawBestTracksCentFT0CVariant1, + "Count tracks in FT0CVariant1 centrality bins based on " + "BestCollisionsFwd table", + false); - void processDatawBestTracksCentFT0M(CollsCentFT0M::iterator const& collision, FiltMftTracks const& tracks, soa::SmallGroups const& besttracks) + void processDatawBestTracksCentFT0M( + CollsCentFT0M::iterator const& collision, FiltMftTracks const& tracks, + soa::SmallGroups const& besttracks, + CollBCs const& bcs) { - processDatawBestTracks(collision, tracks, besttracks); + processDatawBestTracks(collision, tracks, besttracks, bcs); } - PROCESS_SWITCH(DndetaMFTPbPb, processDatawBestTracksCentFT0M, "Count tracks in FT0M centrality bins based on BestCollisionsFwd table", false); + PROCESS_SWITCH( + DndetaMFTPbPb, processDatawBestTracksCentFT0M, + "Count tracks in FT0M centrality bins based on BestCollisionsFwd table", + false); - void processDatawBestTracksCentNGlobal(CollsCentNGlobal::iterator const& collision, FiltMftTracks const& tracks, soa::SmallGroups const& besttracks) + void processDatawBestTracksCentNGlobal( + CollsCentNGlobal::iterator const& collision, FiltMftTracks const& tracks, + soa::SmallGroups const& besttracks, + CollBCs const& bcs) { - processDatawBestTracks(collision, tracks, besttracks); + processDatawBestTracks(collision, tracks, besttracks, + bcs); } - PROCESS_SWITCH(DndetaMFTPbPb, processDatawBestTracksCentNGlobal, "Count tracks in NGlobal centrality bins based on BestCollisionsFwd table", false); + PROCESS_SWITCH(DndetaMFTPbPb, processDatawBestTracksCentNGlobal, + "Count tracks in NGlobal centrality bins based on " + "BestCollisionsFwd table", + false); - void processDatawBestTracksCentMFT(CollsCentMFT::iterator const& collision, FiltMftTracks const& tracks, soa::SmallGroups const& besttracks) + void processDatawBestTracksCentMFT( + CollsCentMFT::iterator const& collision, FiltMftTracks const& tracks, + soa::SmallGroups const& besttracks, + CollBCs const& bcs) { - processDatawBestTracks(collision, tracks, besttracks); + processDatawBestTracks(collision, tracks, besttracks, bcs); } - PROCESS_SWITCH(DndetaMFTPbPb, processDatawBestTracksCentMFT, "Count tracks in MFT centrality bins based on BestCollisionsFwd table", false); + PROCESS_SWITCH( + DndetaMFTPbPb, processDatawBestTracksCentMFT, + "Count tracks in MFT centrality bins based on BestCollisionsFwd table", + false); Preslice perCol = o2::aod::fwdtrack::collisionId; - PresliceUnsorted recColPerMcCol = aod::mccollisionlabel::mcCollisionId; + PresliceUnsorted recColPerMcCol = + aod::mccollisionlabel::mcCollisionId; Partition mcSample = nabs(aod::mcparticle::eta) < 1.0f; /// @brief process template function to run on MC gen template - void processMC(typename MC::iterator const& mcCollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks) + void processMC( + typename MC::iterator const& mcCollision, + soa::SmallGroups> const& collisions, + FiltParticles const& particles, FiltMcMftTracks const& tracks) { bool gtZeroColl = false; int gtOneColl = 0; @@ -968,7 +1323,7 @@ struct DndetaMFTPbPb { float occgen = -1.; for (const auto& collision : collisions) { if (isGoodEvent(collision)) { - float o = getOccupancy(collision, cfgOccEstimator); + float o = getOccupancy(collision, eventCuts.occupancyEstimator); if (o > occgen) { occgen = o; } @@ -976,7 +1331,7 @@ struct DndetaMFTPbPb { } for (auto const& collision : collisions) { - float occrec = getOccupancy(collision, cfgOccEstimator); + float occrec = getOccupancy(collision, eventCuts.occupancyEstimator); float crec = getRecoCent(collision); if constexpr (has_reco_cent) { @@ -993,7 +1348,8 @@ struct DndetaMFTPbPb { if constexpr (has_reco_cent) { registry.fill(HIST("Events/Centrality/EvtEffGen"), 2., crec, occrec); registry.fill(HIST("Events/Centrality/hRecCent"), crec, occrec); - registry.fill(HIST("Events/Centrality/hRecZvtxCent"), z, crec, occrec); + registry.fill(HIST("Events/Centrality/hRecZvtxCent"), z, crec, + occrec); } else { registry.fill(HIST("Events/EvtEffGen"), 2., occrec); } @@ -1002,21 +1358,26 @@ struct DndetaMFTPbPb { auto nTrkRec = countTracks(perColSample, z, crec, occrec); if constexpr (has_reco_cent) { - qaregistry.fill(HIST("Events/Centrality/ZvtxDiff"), collision.posZ() - mcCollision.posZ(), crec); + qaregistry.fill(HIST("Events/Centrality/ZvtxDiff"), + collision.posZ() - mcCollision.posZ(), crec); } else { - qaregistry.fill(HIST("Events/ZvtxDiff"), collision.posZ() - mcCollision.posZ()); + qaregistry.fill(HIST("Events/ZvtxDiff"), + collision.posZ() - mcCollision.posZ()); } - if (useZDiffCut) { - if (std::abs(collision.posZ() - mcCollision.posZ()) > maxZvtxDiff) { + if (eventCuts.useZDiffCut) { + if (std::abs(collision.posZ() - mcCollision.posZ()) > + eventCuts.maxZvtxDiff) { continue; } } if constexpr (has_reco_cent) { - registry.fill(HIST("Events/Centrality/NtrkZvtxGen"), nTrkRec, collision.posZ(), crec, occrec); + registry.fill(HIST("Events/Centrality/NtrkZvtxGen"), nTrkRec, + collision.posZ(), crec, occrec); } else { - registry.fill(HIST("Events/NtrkZvtxGen"), nTrkRec, collision.posZ(), occrec); + registry.fill(HIST("Events/NtrkZvtxGen"), nTrkRec, collision.posZ(), + occrec); } } } @@ -1027,7 +1388,8 @@ struct DndetaMFTPbPb { registry.fill(HIST("Events/EvtEffGen"), 3., occgen); } - auto perCollMCsample = mcSample->sliceByCached(aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); + auto perCollMCsample = mcSample->sliceByCached( + aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); auto nchrg = countPart(perCollMCsample); if (gtOneColl > 1) { if constexpr (has_reco_cent) { @@ -1040,7 +1402,8 @@ struct DndetaMFTPbPb { auto zvtxMC = mcCollision.posZ(); auto nCharged = countPart(particles); if constexpr (has_reco_cent) { - registry.fill(HIST("Events/Centrality/NtrkZvtxGen_t"), nCharged, zvtxMC, cgen); + registry.fill(HIST("Events/Centrality/NtrkZvtxGen_t"), nCharged, zvtxMC, + cgen); } else { registry.fill(HIST("Events/NtrkZvtxGen_t"), nCharged, zvtxMC); } @@ -1049,60 +1412,99 @@ struct DndetaMFTPbPb { if (collisions.size() == 0) { if constexpr (has_reco_cent) { - qaregistry.fill(HIST("Events/Centrality/NotFoundEventZvtx"), mcCollision.posZ(), cgen); + qaregistry.fill(HIST("Events/Centrality/NotFoundEventZvtx"), + mcCollision.posZ(), cgen); } else { qaregistry.fill(HIST("Events/NotFoundEventZvtx"), mcCollision.posZ()); } } } - void processMCInclusive(aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks) + void processMCInclusive( + aod::McCollisions::iterator const& mccollision, + soa::SmallGroups> const& collisions, + FiltParticles const& particles, FiltMcMftTracks const& tracks) { - processMC(mccollision, collisions, particles, tracks); + processMC(mccollision, collisions, particles, + tracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processMCInclusive, "Count MC particles (inclusive)", false); + PROCESS_SWITCH(DndetaMFTPbPb, processMCInclusive, + "Count MC particles (inclusive)", false); - void processMCCentFT0C(aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks) + void processMCCentFT0C( + aod::McCollisions::iterator const& mccollision, + soa::SmallGroups> const& collisions, + FiltParticles const& particles, FiltMcMftTracks const& tracks) { - processMC(mccollision, collisions, particles, tracks); + processMC(mccollision, collisions, + particles, tracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processMCCentFT0C, "Count MC particles in FT0C centrality bins", false); + PROCESS_SWITCH(DndetaMFTPbPb, processMCCentFT0C, + "Count MC particles in FT0C centrality bins", false); - void processMCCentFT0CVariant1(aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks) + void processMCCentFT0CVariant1( + aod::McCollisions::iterator const& mccollision, + soa::SmallGroups> const& collisions, + FiltParticles const& particles, FiltMcMftTracks const& tracks) { - processMC(mccollision, collisions, particles, tracks); + processMC(mccollision, collisions, + particles, tracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processMCCentFT0CVariant1, "Count MC particles in FT0CVariant1 centrality bins", false); + PROCESS_SWITCH(DndetaMFTPbPb, processMCCentFT0CVariant1, + "Count MC particles in FT0CVariant1 centrality bins", false); - void processMCCentFT0M(aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks) + void processMCCentFT0M( + aod::McCollisions::iterator const& mccollision, + soa::SmallGroups> const& collisions, + FiltParticles const& particles, FiltMcMftTracks const& tracks) { - processMC(mccollision, collisions, particles, tracks); + processMC(mccollision, collisions, + particles, tracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processMCCentFT0M, "Count MC particles in FT0M centrality bins", false); + PROCESS_SWITCH(DndetaMFTPbPb, processMCCentFT0M, + "Count MC particles in FT0M centrality bins", false); - void processMCCentNGlobal(aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks) + void processMCCentNGlobal( + aod::McCollisions::iterator const& mccollision, + soa::SmallGroups> const& collisions, + FiltParticles const& particles, FiltMcMftTracks const& tracks) { - processMC(mccollision, collisions, particles, tracks); + processMC(mccollision, collisions, + particles, tracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processMCCentNGlobal, "Count MC particles in NGlobal centrality bins", false); + PROCESS_SWITCH(DndetaMFTPbPb, processMCCentNGlobal, + "Count MC particles in NGlobal centrality bins", false); - void processMCCentMFT(aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks) + void processMCCentMFT( + aod::McCollisions::iterator const& mccollision, + soa::SmallGroups> const& collisions, + FiltParticles const& particles, FiltMcMftTracks const& tracks) { - processMC(mccollision, collisions, particles, tracks); + processMC(mccollision, collisions, + particles, tracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processMCCentMFT, "Count MC particles in MFT centrality bins", false); + PROCESS_SWITCH(DndetaMFTPbPb, processMCCentMFT, + "Count MC particles in MFT centrality bins", false); - PresliceUnsorted perColU = aod::fwdtrack::bestCollisionId; + PresliceUnsorted perColU = + aod::fwdtrack::bestCollisionId; - /// @brief process template function to run on MC truth using aod::BestCollisionsFwd tracks + /// @brief process template function to run on MC truth using + /// aod::BestCollisionsFwd tracks template - void processMCwBestTracks(typename MC::iterator const& mcCollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks, FiltBestTracks const& besttracks) + void processMCwBestTracks( + typename MC::iterator const& mcCollision, + soa::SmallGroups> const& collisions, + FiltParticles const& particles, FiltMcMftTracks const& tracks, + FiltBestTracks const& besttracks) { bool gtZeroColl = false; float cgen = -1; @@ -1123,7 +1525,7 @@ struct DndetaMFTPbPb { float occgen = -1.; for (const auto& collision : collisions) { if (isGoodEvent(collision)) { - float o = getOccupancy(collision, cfgOccEstimator); + float o = getOccupancy(collision, eventCuts.occupancyEstimator); if (o > occgen) { occgen = o; } @@ -1131,7 +1533,7 @@ struct DndetaMFTPbPb { } for (auto const& collision : collisions) { - auto occrec = getOccupancy(collision, cfgOccEstimator); + auto occrec = getOccupancy(collision, eventCuts.occupancyEstimator); float crec = getRecoCent(collision); if constexpr (has_reco_cent) { @@ -1150,12 +1552,17 @@ struct DndetaMFTPbPb { registry.fill(HIST("Events/EvtEffGen"), 2., occrec); } - auto perCollisionSample = tracks.sliceBy(perCol, collision.globalIndex()); - auto perCollisionASample = besttracks.sliceBy(perColU, collision.globalIndex()); - auto nTrkRec = countBestTracks(perCollisionSample, perCollisionASample, z, crec, collision.trackOccupancyInTimeRange()); + auto perCollisionSample = + tracks.sliceBy(perCol, collision.globalIndex()); + auto perCollisionASample = + besttracks.sliceBy(perColU, collision.globalIndex()); + auto nTrkRec = countBestTracks( + perCollisionSample, perCollisionASample, z, crec, + collision.trackOccupancyInTimeRange()); if constexpr (has_reco_cent) { - registry.fill(HIST("Events/Centrality/NtrkZvtxGen"), nTrkRec, z, crec); + registry.fill(HIST("Events/Centrality/NtrkZvtxGen"), nTrkRec, z, + crec); } else { registry.fill(HIST("Events/NtrkZvtxGen"), nTrkRec, z); } @@ -1171,7 +1578,8 @@ struct DndetaMFTPbPb { auto zvtxMC = mcCollision.posZ(); auto nCharged = countPart(particles); if constexpr (has_reco_cent) { - registry.fill(HIST("Events/Centrality/NtrkZvtxGen_t"), nCharged, zvtxMC, cgen); + registry.fill(HIST("Events/Centrality/NtrkZvtxGen_t"), nCharged, zvtxMC, + cgen); } else { registry.fill(HIST("Events/NtrkZvtxGen_t"), nCharged, zvtxMC); } @@ -1180,61 +1588,118 @@ struct DndetaMFTPbPb { if (collisions.size() == 0) { if constexpr (has_reco_cent) { - qaregistry.fill(HIST("Events/Centrality/NotFoundEventZvtx"), mcCollision.posZ(), cgen); + qaregistry.fill(HIST("Events/Centrality/NotFoundEventZvtx"), + mcCollision.posZ(), cgen); } else { qaregistry.fill(HIST("Events/NotFoundEventZvtx"), mcCollision.posZ()); } } } - void processMCwBestTracksInclusive(aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks, FiltBestTracks const& besttracks) + void processMCwBestTracksInclusive( + aod::McCollisions::iterator const& mccollision, + soa::SmallGroups> const& collisions, + FiltParticles const& particles, FiltMcMftTracks const& tracks, + FiltBestTracks const& besttracks) { - processMCwBestTracks(mccollision, collisions, particles, tracks, besttracks); + processMCwBestTracks( + mccollision, collisions, particles, tracks, besttracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processMCwBestTracksInclusive, "Count MC particles using aod::BestCollisionsFwd (inclusive)", false); + PROCESS_SWITCH(DndetaMFTPbPb, processMCwBestTracksInclusive, + "Count MC particles using aod::BestCollisionsFwd (inclusive)", + false); - void processMCwBestTracksCentFT0C(aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks, FiltBestTracks const& besttracks) + void processMCwBestTracksCentFT0C( + aod::McCollisions::iterator const& mccollision, + soa::SmallGroups> const& collisions, + FiltParticles const& particles, FiltMcMftTracks const& tracks, + FiltBestTracks const& besttracks) { - processMCwBestTracks(mccollision, collisions, particles, tracks, besttracks); + processMCwBestTracks( + mccollision, collisions, particles, tracks, besttracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processMCwBestTracksCentFT0C, "Count MC particles in FT0C centrality bins using aod::BestCollisionsFwd", false); - - void processMCwBestTracksCentFT0CVariant1(aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks, FiltBestTracks const& besttracks) + PROCESS_SWITCH( + DndetaMFTPbPb, processMCwBestTracksCentFT0C, + "Count MC particles in FT0C centrality bins using aod::BestCollisionsFwd", + false); + + void processMCwBestTracksCentFT0CVariant1( + aod::McCollisions::iterator const& mccollision, + soa::SmallGroups> const& collisions, + FiltParticles const& particles, FiltMcMftTracks const& tracks, + FiltBestTracks const& besttracks) { - processMCwBestTracks(mccollision, collisions, particles, tracks, besttracks); + processMCwBestTracks( + mccollision, collisions, particles, tracks, besttracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processMCwBestTracksCentFT0CVariant1, "Count MC particles in FT0CVariant1 centrality bins using aod::BestCollisionsFwd", false); + PROCESS_SWITCH(DndetaMFTPbPb, processMCwBestTracksCentFT0CVariant1, + "Count MC particles in FT0CVariant1 centrality bins using " + "aod::BestCollisionsFwd", + false); - void processMCwBestTracksCentFT0M(aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks, FiltBestTracks const& besttracks) + void processMCwBestTracksCentFT0M( + aod::McCollisions::iterator const& mccollision, + soa::SmallGroups> const& collisions, + FiltParticles const& particles, FiltMcMftTracks const& tracks, + FiltBestTracks const& besttracks) { - processMCwBestTracks(mccollision, collisions, particles, tracks, besttracks); + processMCwBestTracks( + mccollision, collisions, particles, tracks, besttracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processMCwBestTracksCentFT0M, "Count MC particles in FT0M centrality bins using aod::BestCollisionsFwd", false); - - void processMCwBestTracksCentNGlobal(aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks, FiltBestTracks const& besttracks) + PROCESS_SWITCH( + DndetaMFTPbPb, processMCwBestTracksCentFT0M, + "Count MC particles in FT0M centrality bins using aod::BestCollisionsFwd", + false); + + void processMCwBestTracksCentNGlobal( + aod::McCollisions::iterator const& mccollision, + soa::SmallGroups> const& collisions, + FiltParticles const& particles, FiltMcMftTracks const& tracks, + FiltBestTracks const& besttracks) { - processMCwBestTracks(mccollision, collisions, particles, tracks, besttracks); + processMCwBestTracks( + mccollision, collisions, particles, tracks, besttracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processMCwBestTracksCentNGlobal, "Count MC particles in NGlobal centrality bins using aod::BestCollisionsFwd", false); + PROCESS_SWITCH(DndetaMFTPbPb, processMCwBestTracksCentNGlobal, + "Count MC particles in NGlobal centrality bins using " + "aod::BestCollisionsFwd", + false); - void processMCwBestTracksCentMFT(aod::McCollisions::iterator const& mccollision, soa::SmallGroups> const& collisions, FiltParticles const& particles, FiltMcMftTracks const& tracks, FiltBestTracks const& besttracks) + void processMCwBestTracksCentMFT( + aod::McCollisions::iterator const& mccollision, + soa::SmallGroups> const& collisions, + FiltParticles const& particles, FiltMcMftTracks const& tracks, + FiltBestTracks const& besttracks) { - processMCwBestTracks(mccollision, collisions, particles, tracks, besttracks); + processMCwBestTracks( + mccollision, collisions, particles, tracks, besttracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processMCwBestTracksCentMFT, "Count MC particles in MFT centrality bins using aod::BestCollisionsFwd", false); + PROCESS_SWITCH( + DndetaMFTPbPb, processMCwBestTracksCentMFT, + "Count MC particles in MFT centrality bins using aod::BestCollisionsFwd", + false); using ParticlesI = soa::Join; - Partition primariesI = ((aod::mcparticle::flags & (uint8_t)o2::aod::mcparticle::enums::PhysicalPrimary) == (uint8_t)o2::aod::mcparticle::enums::PhysicalPrimary); + Partition primariesI = + ((aod::mcparticle::flags & + (uint8_t)o2::aod::mcparticle::enums::PhysicalPrimary) == + (uint8_t)o2::aod::mcparticle::enums::PhysicalPrimary); - /// @brief process template function to calculate tracking efficiency (indexed as particle-to-MFT-tracks) + /// @brief process template function to calculate tracking efficiency (indexed + /// as particle-to-MFT-tracks) template - void processTrkEffIdx(typename soa::Join const& collisions, MC const& /*mccollisions*/, ParticlesI const& /*particles*/, MFTTracksLabeled const& tracks) + void processTrkEffIdx( + typename soa::Join const& collisions, + MC const& /*mccollisions*/, ParticlesI const& /*particles*/, + MFTTracksLabeled const& tracks) { for (auto const& collision : collisions) { if (!isGoodEvent(collision)) { @@ -1245,7 +1710,7 @@ struct DndetaMFTPbPb { } float crec = getRecoCent(collision); - auto occrec = getOccupancy(collision, cfgOccEstimator); + auto occrec = getOccupancy(collision, eventCuts.occupancyEstimator); auto mcCollision = collision.mcCollision(); float cgen = -1; @@ -1266,14 +1731,15 @@ struct DndetaMFTPbPb { float occgen = -1.; for (const auto& collision : collisions) { if (isGoodEvent(collision)) { - float o = getOccupancy(collision, cfgOccEstimator); + float o = getOccupancy(collision, eventCuts.occupancyEstimator); if (o > occgen) { occgen = o; } } } - auto partsPerCol = primariesI->sliceByCached(aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); + auto partsPerCol = primariesI->sliceByCached( + aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); partsPerCol.bindExternalIndices(&tracks); for (auto const& particle : partsPerCol) { @@ -1288,7 +1754,8 @@ struct DndetaMFTPbPb { mcCollision.posZ(), cgen, occgen); } else { qaregistry.fill(HIST("Tracks/hPtPhiEtaZvtxEffGen"), particle.pt(), - particle.phi(), particle.eta(), mcCollision.posZ(), occgen); + particle.phi(), particle.eta(), mcCollision.posZ(), + occgen); } // MC rec if (particle.has_mfttracks()) { @@ -1355,23 +1822,39 @@ struct DndetaMFTPbPb { } } - void processTrkEffIdxInlusive(soa::Join const& collisions, aod::McCollisions const& mccollisions, ParticlesI const& particles, MFTTracksLabeled const& tracks) + void processTrkEffIdxInlusive( + soa::Join const& collisions, + aod::McCollisions const& mccollisions, ParticlesI const& particles, + MFTTracksLabeled const& tracks) { - processTrkEffIdx(collisions, mccollisions, particles, tracks); + processTrkEffIdx(collisions, mccollisions, + particles, tracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processTrkEffIdxInlusive, "Process tracking efficiency (inclusive, indexed)", false); + PROCESS_SWITCH(DndetaMFTPbPb, processTrkEffIdxInlusive, + "Process tracking efficiency (inclusive, indexed)", false); - void processTrkEffIdxCentFT0C(soa::Join const& collisions, aod::McCollisions const& mccollisions, ParticlesI const& particles, MFTTracksLabeled const& tracks) + void processTrkEffIdxCentFT0C( + soa::Join const& collisions, + aod::McCollisions const& mccollisions, ParticlesI const& particles, + MFTTracksLabeled const& tracks) { - processTrkEffIdx(collisions, mccollisions, particles, tracks); + processTrkEffIdx(collisions, mccollisions, + particles, tracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processTrkEffIdxCentFT0C, "Process tracking efficiency (in FT0C centrality bins, indexed)", false); + PROCESS_SWITCH( + DndetaMFTPbPb, processTrkEffIdxCentFT0C, + "Process tracking efficiency (in FT0C centrality bins, indexed)", false); - /// @brief process function to calculate tracking efficiency (indexed) based on BestCollisionsFwd in FT0C bins + /// @brief process function to calculate tracking efficiency (indexed) based + /// on BestCollisionsFwd in FT0C bins template - void processTrkEffBest(typename soa::Join::iterator const& collision, MC const& /*mccollisions*/, FiltParticles const& particles, FiltMcMftTracks const& /*tracks*/, soa::SmallGroups const& besttracks) + void processTrkEffBest( + typename soa::Join::iterator const& collision, + MC const& /*mccollisions*/, FiltParticles const& particles, + FiltMcMftTracks const& /*tracks*/, + soa::SmallGroups const& besttracks) { if (!isGoodEvent(collision)) { return; @@ -1381,9 +1864,10 @@ struct DndetaMFTPbPb { } float crec = getRecoCent(collision); - auto occrec = getOccupancy(collision, cfgOccEstimator); + auto occrec = getOccupancy(collision, eventCuts.occupancyEstimator); auto mcCollision = collision.mcCollision(); - auto partsPerCol = particles.sliceByCached(aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); + auto partsPerCol = particles.sliceByCached( + aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); for (auto const& particle : partsPerCol) { if (!isChrgParticle(particle.pdgCode())) { @@ -1395,7 +1879,8 @@ struct DndetaMFTPbPb { mcCollision.posZ(), crec, occrec); } else { qaregistry.fill(HIST("Tracks/hPtPhiEtaZvtxEffBestGen"), particle.pt(), - particle.phi(), particle.eta(), mcCollision.posZ(), occrec); + particle.phi(), particle.eta(), mcCollision.posZ(), + occrec); } } @@ -1412,38 +1897,60 @@ struct DndetaMFTPbPb { mcCollision.posZ(), crec, occrec); } else { qaregistry.fill(HIST("Tracks/hPtPhiEtaZvtxEffBestRec"), particle.pt(), - itrack.phi(), itrack.eta(), mcCollision.posZ(), occrec); + itrack.phi(), itrack.eta(), mcCollision.posZ(), + occrec); } } else { if constexpr (has_reco_cent) { qaregistry.fill(HIST("Tracks/Centrality/hPtEffBestFakeRec"), itrack.pt(), crec, occrec); } else { - qaregistry.fill(HIST("Tracks/hPtEffBestFakeRec"), itrack.pt(), occrec); + qaregistry.fill(HIST("Tracks/hPtEffBestFakeRec"), itrack.pt(), + occrec); } } } } - void processTrkEffBestInclusive(soa::Join::iterator const& collision, aod::McCollisions const& mccollisions, FiltParticles const& particles, FiltMcMftTracks const& tracks, soa::SmallGroups const& besttracks) + void processTrkEffBestInclusive( + soa::Join::iterator const& collision, + aod::McCollisions const& mccollisions, FiltParticles const& particles, + FiltMcMftTracks const& tracks, + soa::SmallGroups const& besttracks) { - processTrkEffBest(collision, mccollisions, particles, tracks, besttracks); + processTrkEffBest(collision, mccollisions, + particles, tracks, besttracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processTrkEffBestInclusive, "Process tracking efficiency (inclusive, based on BestCollisionsFwd)", false); + PROCESS_SWITCH( + DndetaMFTPbPb, processTrkEffBestInclusive, + "Process tracking efficiency (inclusive, based on BestCollisionsFwd)", + false); - void processTrkEffBestCentFT0C(soa::Join::iterator const& collision, aod::McCollisions const& mccollisions, FiltParticles const& particles, FiltMcMftTracks const& tracks, soa::SmallGroups const& besttracks) + void processTrkEffBestCentFT0C( + soa::Join::iterator const& collision, + aod::McCollisions const& mccollisions, FiltParticles const& particles, + FiltMcMftTracks const& tracks, + soa::SmallGroups const& besttracks) { - processTrkEffBest(collision, mccollisions, particles, tracks, besttracks); + processTrkEffBest( + collision, mccollisions, particles, tracks, besttracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processTrkEffBestCentFT0C, "Process tracking efficiency (in FT0 centrality bins, based on BestCollisionsFwd)", false); + PROCESS_SWITCH(DndetaMFTPbPb, processTrkEffBestCentFT0C, + "Process tracking efficiency (in FT0 centrality bins, based " + "on BestCollisionsFwd)", + false); Preslice filtMcTrkperCol = o2::aod::fwdtrack::collisionId; - /// @brief process function to calculate MC efficiency and fraction of fake tracks + /// @brief process function to calculate MC efficiency and fraction of fake + /// tracks template - void processEfficiency(typename soa::Join const& collisions, MC const& /*mccollisions*/, FiltParticles const& /*particles*/, FiltMcMftTracks const& tracks) + void processEfficiency( + typename soa::Join const& collisions, + MC const& /*mccollisions*/, FiltParticles const& /*particles*/, + FiltMcMftTracks const& tracks) { for (auto const& collision : collisions) { if (!isGoodEvent(collision)) { @@ -1451,9 +1958,10 @@ struct DndetaMFTPbPb { } float crec = getRecoCent(collision); - auto occrec = getOccupancy(collision, cfgOccEstimator); + auto occrec = getOccupancy(collision, eventCuts.occupancyEstimator); auto mcCollision = collision.mcCollision(); - auto perColTrks = tracks.sliceBy(filtMcTrkperCol, collision.globalIndex()); + auto perColTrks = + tracks.sliceBy(filtMcTrkperCol, collision.globalIndex()); for (auto const& track : perColTrks) { if (!isTrackSelected(track)) { @@ -1462,57 +1970,70 @@ struct DndetaMFTPbPb { if (track.has_mcParticle()) { auto particle = track.template mcParticle_as(); if constexpr (has_reco_cent) { - qaregistry.fill(HIST("Tracks/Centrality/hEffRec"), - particle.pt(), particle.phi(), particle.eta(), - mcCollision.posZ(), crec, occrec); + qaregistry.fill(HIST("Tracks/Centrality/hEffRec"), particle.pt(), + particle.phi(), particle.eta(), mcCollision.posZ(), + crec, occrec); } else { - qaregistry.fill(HIST("Tracks/hEffRec"), - particle.pt(), particle.phi(), particle.eta(), - mcCollision.posZ(), crec, occrec); + qaregistry.fill(HIST("Tracks/hEffRec"), particle.pt(), + particle.phi(), particle.eta(), mcCollision.posZ(), + crec, occrec); } } else { if constexpr (has_reco_cent) { - qaregistry.fill(HIST("Tracks/Centrality/hEffFake"), - track.pt(), track.phi(), track.eta(), - mcCollision.posZ(), crec, occrec); + qaregistry.fill(HIST("Tracks/Centrality/hEffFake"), track.pt(), + track.phi(), track.eta(), mcCollision.posZ(), crec, + occrec); } else { - qaregistry.fill(HIST("Tracks/hEffFake"), - track.pt(), track.phi(), track.eta(), - mcCollision.posZ(), crec, occrec); + qaregistry.fill(HIST("Tracks/hEffFake"), track.pt(), track.phi(), + track.eta(), mcCollision.posZ(), crec, occrec); } } } } } - void processEfficiencyInclusive(soa::Join const& collisions, aod::McCollisions const& mccollisions, FiltParticles const& particles, FiltMcMftTracks const& tracks) + void processEfficiencyInclusive( + soa::Join const& collisions, + aod::McCollisions const& mccollisions, FiltParticles const& particles, + FiltMcMftTracks const& tracks) { - processEfficiency(collisions, mccollisions, particles, tracks); + processEfficiency(collisions, mccollisions, + particles, tracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processEfficiencyInclusive, "Process efficiencies (inclusive)", false); + PROCESS_SWITCH(DndetaMFTPbPb, processEfficiencyInclusive, + "Process efficiencies (inclusive)", false); - void processEfficiencyCentFT0C(soa::Join const& collisions, aod::McCollisions const& mccollisions, FiltParticles const& particles, FiltMcMftTracks const& tracks) + void processEfficiencyCentFT0C( + soa::Join const& collisions, + aod::McCollisions const& mccollisions, FiltParticles const& particles, + FiltMcMftTracks const& tracks) { - processEfficiency(collisions, mccollisions, particles, tracks); + processEfficiency( + collisions, mccollisions, particles, tracks); } - PROCESS_SWITCH(DndetaMFTPbPb, processEfficiencyCentFT0C, "Process efficiencies in FT0C centrality bins", false); + PROCESS_SWITCH(DndetaMFTPbPb, processEfficiencyCentFT0C, + "Process efficiencies in FT0C centrality bins", false); /// @brief process function to check ambiguous tracks template - void processCheckAmbiguousMftTracks(typename C::iterator const& collision, allC const& allcollisions, MftTracksWColls const& tracks) + void processCheckAmbiguousMftTracks(typename C::iterator const& collision, + allC const& allcollisions, + MftTracksWColls const& tracks) { - auto occ = getOccupancy(collision, cfgOccEstimator); + auto occ = getOccupancy(collision, eventCuts.occupancyEstimator); float c = getRecoCent(collision); bool ambTrk = false; int typeAmbTrk = 0; for (auto const& track : tracks) { if constexpr (has_reco_cent) { - qaregistry.fill(HIST("Tracks/Centrality/hMftTracksAmbDegree"), track.compatibleCollIds().size(), c, occ); + qaregistry.fill(HIST("Tracks/Centrality/hMftTracksAmbDegree"), + track.compatibleCollIds().size(), c, occ); } else { - qaregistry.fill(HIST("Tracks/hMftTracksAmbDegree"), track.compatibleCollIds().size(), occ); + qaregistry.fill(HIST("Tracks/hMftTracksAmbDegree"), + track.compatibleCollIds().size(), occ); } if (track.compatibleCollIds().size() > 0) { if (track.compatibleCollIds().size() == 1) { @@ -1536,47 +2057,70 @@ struct DndetaMFTPbPb { if (ambTrk) { if constexpr (has_reco_cent) { - qaregistry.fill(HIST("Tracks/Centrality/hAmbTrackType"), typeAmbTrk, c, occ); + qaregistry.fill(HIST("Tracks/Centrality/hAmbTrackType"), typeAmbTrk, c, + occ); } else { qaregistry.fill(HIST("Tracks/hAmbTrackType"), typeAmbTrk, occ); } } else { if constexpr (has_reco_cent) { - qaregistry.fill(HIST("Tracks/Centrality/hAmbTrackType"), typeAmbTrk, c, occ); + qaregistry.fill(HIST("Tracks/Centrality/hAmbTrackType"), typeAmbTrk, c, + occ); } else { qaregistry.fill(HIST("Tracks/hAmbTrackType"), typeAmbTrk, occ); } } } - void processCheckAmbiguousMftTracksInclusive(Colls::iterator const& collision, Colls const& allcollisions, MftTracksWColls const& track) + void processCheckAmbiguousMftTracksInclusive(Colls::iterator const& collision, + Colls const& allcollisions, + MftTracksWColls const& track) { - processCheckAmbiguousMftTracks(collision, allcollisions, track); + processCheckAmbiguousMftTracks(collision, allcollisions, + track); } - PROCESS_SWITCH(DndetaMFTPbPb, processCheckAmbiguousMftTracksInclusive, "Process checks for Ambiguous MFT tracks (inclusive)", false); + PROCESS_SWITCH(DndetaMFTPbPb, processCheckAmbiguousMftTracksInclusive, + "Process checks for Ambiguous MFT tracks (inclusive)", false); - void processCheckAmbiguousMftTracksCentFT0C(CollsCentFT0C::iterator const& collision, CollsCentFT0C const& allcollisions, MftTracksWColls const& track) + void processCheckAmbiguousMftTracksCentFT0C( + CollsCentFT0C::iterator const& collision, + CollsCentFT0C const& allcollisions, MftTracksWColls const& track) { - processCheckAmbiguousMftTracks(collision, allcollisions, track); + processCheckAmbiguousMftTracks( + collision, allcollisions, track); } - PROCESS_SWITCH(DndetaMFTPbPb, processCheckAmbiguousMftTracksCentFT0C, "Process checks for Ambiguous MFT tracks (in FT0C centrality bins)", false); + PROCESS_SWITCH( + DndetaMFTPbPb, processCheckAmbiguousMftTracksCentFT0C, + "Process checks for Ambiguous MFT tracks (in FT0C centrality bins)", + false); Preslice filtTrkperCol = o2::aod::fwdtrack::collisionId; /// @brief process template function for MC QA checks template - void processMcQA(typename soa::Join const& collisions, MFTTracksLabeled const& tracks, aod::AmbiguousMFTTracks const& atracks, aod::McCollisions const& mcCollisions, FiltParticles const& /*particles*/) + void + processMcQA(typename soa::Join const& collisions, + MFTTracksLabeled const& tracks, + aod::AmbiguousMFTTracks const& atracks, + aod::McCollisions const& mcCollisions, + FiltParticles const& /*particles*/) { for (const auto& collision : collisions) { float crec = getRecoCent(collision); - auto occrec = getOccupancy(collision, cfgOccEstimator); + auto occrec = getOccupancy(collision, eventCuts.occupancyEstimator); if constexpr (has_reco_cent) { - qaregistry.fill(HIST("Events/Centrality/hRecPerGenColls"), static_cast(collisions.size()) / mcCollisions.size(), crec, occrec); + qaregistry.fill(HIST("Events/Centrality/hRecPerGenColls"), + static_cast(collisions.size()) / + mcCollisions.size(), + crec, occrec); } else { - qaregistry.fill(HIST("Events/hRecPerGenColls"), static_cast(collisions.size()) / mcCollisions.size(), occrec); + qaregistry.fill(HIST("Events/hRecPerGenColls"), + static_cast(collisions.size()) / + mcCollisions.size(), + occrec); } if (!isGoodEvent(collision)) { @@ -1595,7 +2139,8 @@ struct DndetaMFTPbPb { } } if constexpr (has_reco_cent) { - qaregistry.fill(HIST("Tracks/Centrality/hNmftTrks"), ntracks, crec, occrec); + qaregistry.fill(HIST("Tracks/Centrality/hNmftTrks"), ntracks, crec, + occrec); qaregistry.fill(HIST("Tracks/Centrality/hFracAmbiguousMftTrks"), static_cast(nAtracks) / ntracks, crec, occrec); } else { @@ -1614,17 +2159,20 @@ struct DndetaMFTPbPb { processMcQA(collisions, tracks, atracks, mcCollisions, particles); } - PROCESS_SWITCH(DndetaMFTPbPb, processMcQAInclusive, "Process MC QA checks (inclusive)", false); + PROCESS_SWITCH(DndetaMFTPbPb, processMcQAInclusive, + "Process MC QA checks (inclusive)", false); void processMcQACentFT0C( soa::Join const& collisions, MFTTracksLabeled const& tracks, aod::AmbiguousMFTTracks const& atracks, aod::McCollisions const& mcCollisions, FiltParticles const& particles) { - processMcQA(collisions, tracks, atracks, mcCollisions, particles); + processMcQA(collisions, tracks, atracks, mcCollisions, + particles); } - PROCESS_SWITCH(DndetaMFTPbPb, processMcQACentFT0C, "Process MC QA checks (in FT0 centrality bins)", false); + PROCESS_SWITCH(DndetaMFTPbPb, processMcQACentFT0C, + "Process MC QA checks (in FT0 centrality bins)", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 0ad6726da89d569527e958f041158d6c2aec9d71 Mon Sep 17 00:00:00 2001 From: creetz16 <79141119+creetz16@users.noreply.github.com> Date: Sun, 16 Feb 2025 11:11:35 +0100 Subject: [PATCH 0246/1650] [PWGLF] Few additions for hypertriton 3-body decay reconstruction KFParticle (new) (#9963) --- PWGLF/DataModel/Vtx3BodyTables.h | 25 ++++++-- .../Nuspex/decay3bodybuilder.cxx | 60 ++++++++++++++++--- .../TableProducer/Nuspex/threebodyKFTask.cxx | 32 ++++++++-- 3 files changed, 100 insertions(+), 17 deletions(-) diff --git a/PWGLF/DataModel/Vtx3BodyTables.h b/PWGLF/DataModel/Vtx3BodyTables.h index 9020f0ae452..122b8136b5f 100644 --- a/PWGLF/DataModel/Vtx3BodyTables.h +++ b/PWGLF/DataModel/Vtx3BodyTables.h @@ -388,6 +388,12 @@ DECLARE_SOA_COLUMN(Track2Sign, track2sign, float); //! sign of DECLARE_SOA_COLUMN(TPCInnerParamTrack0, tpcinnerparamtrack0, float); //! momentum at inner wall of TPC of proton daughter DECLARE_SOA_COLUMN(TPCInnerParamTrack1, tpcinnerparamtrack1, float); //! momentum at inner wall of TPC of pion daughter DECLARE_SOA_COLUMN(TPCInnerParamTrack2, tpcinnerparamtrack2, float); //! momentum at inner wall of TPC of deuteron daughter +DECLARE_SOA_COLUMN(TPCNClTrack0, tpcncltrack0, int); //! Number of TPC clusters of proton daughter +DECLARE_SOA_COLUMN(TPCNClTrack1, tpcncltrack1, int); //! Number of TPC clusters of pion daughter +DECLARE_SOA_COLUMN(TPCNClTrack2, tpcncltrack2, int); //! Number of TPC clusters of deuteron daughter +DECLARE_SOA_COLUMN(TPCChi2NClDeuteron, tpcchi2ncldeuteron, float); //! TPC Chi2 / cluster of deuteron daughter +DECLARE_SOA_COLUMN(DeltaPhiDeuteron, deltaphideuteron, float); //! phi before track rotation - phi after track rotation for deuteron track +DECLARE_SOA_COLUMN(DeltaPhiProton, deltaphiproton, float); //! phi before track rotation - phi after track rotation for proton track // PID DECLARE_SOA_COLUMN(TPCNSigmaProton, tpcnsigmaproton, float); //! nsigma proton of TPC PID of the proton daughter DECLARE_SOA_COLUMN(TPCNSigmaPion, tpcnsigmapion, float); //! nsigma pion of TPC PID of the pion daughter @@ -418,7 +424,10 @@ DECLARE_SOA_COLUMN(GenBachP, genbachp, float); //! generated momentum b DECLARE_SOA_COLUMN(GenBachPt, genbachpt, float); //! generated transverse momentum bachelor daughter particle DECLARE_SOA_COLUMN(IsTrueH3L, istrueh3l, bool); //! flag for true hypertriton candidate DECLARE_SOA_COLUMN(IsTrueAntiH3L, istrueantih3l, bool); //! flag for true anti-hypertriton candidate -DECLARE_SOA_COLUMN(PdgCode, pdgcode, int); //! MC particle PDG code +DECLARE_SOA_COLUMN(PdgCode, pdgcode, int); //! MC particle mother PDG code +DECLARE_SOA_COLUMN(PdgCodeDau0, pdgcodedau0, int); //! MC particle daughter 0 PDG code +DECLARE_SOA_COLUMN(PdgCodeDau1, pdgcodedau1, int); //! MC particle daughter 1 PDG code +DECLARE_SOA_COLUMN(PdgCodeDau2, pdgcodedau2, int); //! MC particle daughter 2 PDG code DECLARE_SOA_COLUMN(SurvEvSel, survevsel, int); //! flag if reco collision survived event selection DECLARE_SOA_COLUMN(IsReco, isreco, int); //! flag if candidate was reconstructed @@ -455,6 +464,9 @@ DECLARE_SOA_TABLE(KFVtx3BodyDatas, "AOD", "KFVTX3BODYDATA", vtx3body::PxTrack1, vtx3body::PyTrack1, vtx3body::PzTrack1, // pion vtx3body::PxTrack2, vtx3body::PyTrack2, vtx3body::PzTrack2, // deuteron kfvtx3body::TPCInnerParamTrack0, kfvtx3body::TPCInnerParamTrack1, kfvtx3body::TPCInnerParamTrack2, // proton, pion, deuteron + kfvtx3body::TPCNClTrack0, kfvtx3body::TPCNClTrack1, kfvtx3body::TPCNClTrack2, // proton, pion, deuteron + kfvtx3body::TPCChi2NClDeuteron, + kfvtx3body::DeltaPhiDeuteron, kfvtx3body::DeltaPhiProton, kfvtx3body::DCATrack0ToPVKF, kfvtx3body::DCATrack1ToPVKF, kfvtx3body::DCATrack2ToPVKF, kfvtx3body::DCAxyTrack0ToPVKF, kfvtx3body::DCAxyTrack1ToPVKF, kfvtx3body::DCAxyTrack2ToPVKF, kfvtx3body::DCAxyTrack0ToSVKF, kfvtx3body::DCAxyTrack1ToSVKF, kfvtx3body::DCAxyTrack2ToSVKF, kfvtx3body::DCATrack0ToTrack1KF, kfvtx3body::DCATrack0ToTrack2KF, kfvtx3body::DCATrack1ToTrack2KF, @@ -495,7 +507,7 @@ DECLARE_SOA_TABLE(KFVtx3BodyDatasLite, "AOD", "KF3BODYLITE", kfvtx3body::CTauKFtopo, kfvtx3body::TrackedClSize, // V0 - kfvtx3body::MassV0, kfvtx3body::Chi2MassV0, + kfvtx3body::MassV0, kfvtx3body::CosPAV0, // daughters @@ -503,13 +515,15 @@ DECLARE_SOA_TABLE(KFVtx3BodyDatasLite, "AOD", "KF3BODYLITE", vtx3body::PxTrack1, vtx3body::PyTrack1, vtx3body::PzTrack1, // pion vtx3body::PxTrack2, vtx3body::PyTrack2, vtx3body::PzTrack2, // deuteron kfvtx3body::TPCInnerParamTrack0, kfvtx3body::TPCInnerParamTrack1, kfvtx3body::TPCInnerParamTrack2, // proton, pion, deuteron + kfvtx3body::TPCNClTrack0, kfvtx3body::TPCNClTrack1, kfvtx3body::TPCNClTrack2, // proton, pion, deuteron + kfvtx3body::TPCChi2NClDeuteron, + kfvtx3body::DeltaPhiDeuteron, kfvtx3body::DeltaPhiProton, kfvtx3body::DCATrack0ToPVKF, kfvtx3body::DCATrack1ToPVKF, kfvtx3body::DCATrack2ToPVKF, kfvtx3body::DCAxyTrack0ToPVKF, kfvtx3body::DCAxyTrack1ToPVKF, kfvtx3body::DCAxyTrack2ToPVKF, kfvtx3body::DCAxyTrack0ToSVKF, kfvtx3body::DCAxyTrack1ToSVKF, kfvtx3body::DCAxyTrack2ToSVKF, kfvtx3body::DCATrack0ToTrack1KF, kfvtx3body::DCATrack0ToTrack2KF, kfvtx3body::DCATrack1ToTrack2KF, kfvtx3body::DCAVtxDaughtersKF, kfvtx3body::Track0Sign, kfvtx3body::Track1Sign, kfvtx3body::Track2Sign, // track sing: proton, pion, deuteron kfvtx3body::TPCNSigmaProton, kfvtx3body::TPCNSigmaPion, kfvtx3body::TPCNSigmaDeuteron, kfvtx3body::TPCNSigmaPionBach, - kfvtx3body::TPCdEdxProton, kfvtx3body::TPCdEdxPion, kfvtx3body::TPCdEdxDeuteron, kfvtx3body::TOFNSigmaDeuteron, kfvtx3body::ITSClusSizeDeuteron, kfvtx3body::PIDTrackingDeuteron); @@ -542,6 +556,9 @@ DECLARE_SOA_TABLE(McKFVtx3BodyDatas, "AOD", "MCKF3BODYDATAS", vtx3body::PxTrack1, vtx3body::PyTrack1, vtx3body::PzTrack1, // pion vtx3body::PxTrack2, vtx3body::PyTrack2, vtx3body::PzTrack2, // deuteron kfvtx3body::TPCInnerParamTrack0, kfvtx3body::TPCInnerParamTrack1, kfvtx3body::TPCInnerParamTrack2, // proton, pion, deuteron + kfvtx3body::TPCNClTrack0, kfvtx3body::TPCNClTrack1, kfvtx3body::TPCNClTrack2, // proton, pion, deuteron + kfvtx3body::TPCChi2NClDeuteron, + kfvtx3body::DeltaPhiDeuteron, kfvtx3body::DeltaPhiProton, kfvtx3body::DCATrack0ToPVKF, kfvtx3body::DCATrack1ToPVKF, kfvtx3body::DCATrack2ToPVKF, kfvtx3body::DCAxyTrack0ToPVKF, kfvtx3body::DCAxyTrack1ToPVKF, kfvtx3body::DCAxyTrack2ToPVKF, kfvtx3body::DCAxyTrack0ToSVKF, kfvtx3body::DCAxyTrack1ToSVKF, kfvtx3body::DCAxyTrack2ToSVKF, kfvtx3body::DCATrack0ToTrack1KF, kfvtx3body::DCATrack0ToTrack2KF, kfvtx3body::DCATrack1ToTrack2KF, @@ -567,7 +584,7 @@ DECLARE_SOA_TABLE(McKFVtx3BodyDatas, "AOD", "MCKF3BODYDATAS", kfvtx3body::GenNegP, kfvtx3body::GenNegPt, kfvtx3body::GenBachP, kfvtx3body::GenBachPt, kfvtx3body::IsTrueH3L, kfvtx3body::IsTrueAntiH3L, - kfvtx3body::PdgCode, + kfvtx3body::PdgCode, kfvtx3body::PdgCodeDau0, kfvtx3body::PdgCodeDau1, kfvtx3body::PdgCodeDau2, kfvtx3body::IsReco, kfvtx3body::SurvEvSel); diff --git a/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx b/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx index 80b27744557..3621716228b 100644 --- a/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx +++ b/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx @@ -117,15 +117,20 @@ struct kfCandidate { float chi2topoNDF; float ctau; float trackedClSize; + float DeltaPhiRotDeuteron; + float DeltaPhiRotProton; // V0 float massV0; float chi2massV0; float cpaV0ToPV; - // daughter momenta at vertex + // daughter momenta float protonMom[3]; float pionMom[3]; float deuteronMom[3]; float tpcInnerParam[3]; // proton, pion, deuteron + // daughter track quality + int tpcNClDaughters[3]; // proton, pion, deuteron + float tpcChi2NClDeuteron; // daughter DCAs KF float DCAdaughterToPV[3]; // proton, pion, deuteron float DCAdaughterToPVxy[3]; // proton, pion, deuteron @@ -816,13 +821,17 @@ struct decay3bodyBuilder { candidate.ctau, candidate.trackedClSize, // V0 - candidate.massV0, candidate.chi2massV0, + candidate.massV0, candidate.cpaV0ToPV, // daughter momenta at vertex candidate.protonMom[0], candidate.protonMom[1], candidate.protonMom[2], candidate.pionMom[0], candidate.pionMom[1], candidate.pionMom[2], candidate.deuteronMom[0], candidate.deuteronMom[1], candidate.deuteronMom[2], candidate.tpcInnerParam[0], candidate.tpcInnerParam[1], candidate.tpcInnerParam[2], // proton, pion, deuteron + // daughter track quality + candidate.tpcNClDaughters[0], candidate.tpcNClDaughters[1], candidate.tpcNClDaughters[2], // proton, pion, deuteron + candidate.tpcChi2NClDeuteron, + candidate.DeltaPhiRotDeuteron, candidate.DeltaPhiRotProton, // daughter DCAs KF candidate.DCAdaughterToPV[0], candidate.DCAdaughterToPV[1], candidate.DCAdaughterToPV[2], // proton, pion, deuteron candidate.DCAdaughterToPVxy[0], candidate.DCAdaughterToPVxy[1], candidate.DCAdaughterToPVxy[2], // proton, pion, deuteron @@ -833,7 +842,6 @@ struct decay3bodyBuilder { candidate.daughterCharge[0], candidate.daughterCharge[1], candidate.daughterCharge[2], // proton, pion, deuteron // daughter PID candidate.tpcNsigma[0], candidate.tpcNsigma[1], candidate.tpcNsigma[2], candidate.tpcNsigma[3], // proton, pion, deuteron, bach with pion hyp - candidate.tpcdEdx[0], candidate.tpcdEdx[1], candidate.tpcdEdx[2], // proton, pion, deuteron candidate.tofNsigmaDeuteron, candidate.averageClusterSizeDeuteron, candidate.pidForTrackingDeuteron); @@ -864,6 +872,10 @@ struct decay3bodyBuilder { candidate.pionMom[0], candidate.pionMom[1], candidate.pionMom[2], candidate.deuteronMom[0], candidate.deuteronMom[1], candidate.deuteronMom[2], candidate.tpcInnerParam[0], candidate.tpcInnerParam[1], candidate.tpcInnerParam[2], // proton, pion, deuteron + // daughter track quality + candidate.tpcNClDaughters[0], candidate.tpcNClDaughters[1], candidate.tpcNClDaughters[2], // proton, pion, deuteron + candidate.tpcChi2NClDeuteron, + candidate.DeltaPhiRotDeuteron, candidate.DeltaPhiRotProton, // daughter DCAs KF candidate.DCAdaughterToPV[0], candidate.DCAdaughterToPV[1], candidate.DCAdaughterToPV[2], // proton, pion, deuteron candidate.DCAdaughterToPVxy[0], candidate.DCAdaughterToPVxy[1], candidate.DCAdaughterToPVxy[2], // proton, pion, deuteron @@ -1011,13 +1023,25 @@ struct decay3bodyBuilder { registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxEta); // number of TPC clusters + int tpcNClProton; + int tpcNClPion; + int tpcNClDeuteron = trackBach.tpcNClsFound(); + float tpcChi2NCl = trackBach.tpcChi2NCl(); if (trackBach.tpcNClsFound() <= kfparticleConfigurations.mintpcNClsBach) { return; } - if (isMatter && ((kfparticleConfigurations.useTPCforPion && trackNeg.tpcNClsFound() <= kfparticleConfigurations.mintpcNClsPion) || trackPos.tpcNClsFound() <= kfparticleConfigurations.mintpcNClsProton)) { - return; - } else if (!isMatter && ((kfparticleConfigurations.useTPCforPion && trackPos.tpcNClsFound() <= kfparticleConfigurations.mintpcNClsPion) || trackNeg.tpcNClsFound() <= kfparticleConfigurations.mintpcNClsProton)) { - return; + if (isMatter) { + tpcNClPion = trackNeg.tpcNClsFound(); + tpcNClProton = trackPos.tpcNClsFound(); + if ((kfparticleConfigurations.useTPCforPion && trackNeg.tpcNClsFound() <= kfparticleConfigurations.mintpcNClsPion) || trackPos.tpcNClsFound() <= kfparticleConfigurations.mintpcNClsProton) { + return; + } + } else if (!isMatter) { + tpcNClPion = trackPos.tpcNClsFound(); + tpcNClProton = trackNeg.tpcNClsFound(); + if ((kfparticleConfigurations.useTPCforPion && trackPos.tpcNClsFound() <= kfparticleConfigurations.mintpcNClsPion) || trackNeg.tpcNClsFound() <= kfparticleConfigurations.mintpcNClsProton) { + return; + } } registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxTPCNcls); @@ -1195,6 +1219,13 @@ struct decay3bodyBuilder { kfpDeuteron = createKFParticleFromTrackParCov(trackParCovBach, trackBach.sign() * bachelorcharge, constants::physics::MassDeuteron); LOG(debug) << "KFParticle created from deuteron track."; float kfpvPos[3] = {kfpv.GetX(), kfpv.GetY(), kfpv.GetZ()}; + // Check phi angle of "default" candidate daughter tracks + float phiDeuteron_noRotation; + float phiDeuteronSigma_noRotation; + float phiProton_noRotation; + float phiProtonSigma_noRotation; + kfpDeuteron.GetPhi(phiDeuteron_noRotation, phiDeuteronSigma_noRotation); + kfpProton.GetPhi(phiProton_noRotation, phiProtonSigma_noRotation); // Construct vertex /// BRIEF: Case 1: fully uncorrelated bkg via rotation of proton track @@ -1340,6 +1371,14 @@ struct decay3bodyBuilder { trackedClSize = !fTrackedClSizeVector.empty() ? fTrackedClSizeVector[decay3bodyID] : 0; } + // get deuteron and proton phi after rotation + float phiDeuteron_afterRotation; + float phiDeuteronSigma_afterRotation; + float phiProton_afterRotation; + float phiProtonSigma_afterRotation; + kfDeuteronDaughters[i].GetPhi(phiDeuteron_afterRotation, phiDeuteronSigma_afterRotation); + kfProtonDaughters[i].GetPhi(phiProton_afterRotation, phiProtonSigma_afterRotation); + // candidate filling kfCandidate candidate; candidate.collisionID = collision.globalIndex(); @@ -1377,6 +1416,8 @@ struct decay3bodyBuilder { candidate.chi2topoNDF = chi2topoNDF; candidate.ctau = KFHtPV.GetLifeTime(); candidate.trackedClSize = trackedClSize; + candidate.DeltaPhiRotDeuteron = phiDeuteron_noRotation - phiDeuteron_afterRotation; + candidate.DeltaPhiRotProton = phiProton_noRotation - phiProton_afterRotation; // V0 candidate.massV0 = massV0; candidate.chi2massV0 = chi2massV0; @@ -1394,6 +1435,11 @@ struct decay3bodyBuilder { candidate.tpcInnerParam[0] = tpcInnerParamProton; candidate.tpcInnerParam[1] = tpcInnerParamPion; candidate.tpcInnerParam[2] = tpcInnerParamDeuteron; + // daughter track quality + candidate.tpcNClDaughters[0] = tpcNClProton; + candidate.tpcNClDaughters[1] = tpcNClPion; + candidate.tpcNClDaughters[2] = tpcNClDeuteron; + candidate.tpcChi2NClDeuteron = tpcChi2NCl; // daughter DCAs with KF candidate.DCAdaughterToPV[0] = kfProtonDaughters[i].GetDistanceFromVertex(kfpv); candidate.DCAdaughterToPV[1] = kfPionDaughters[i].GetDistanceFromVertex(kfpv); diff --git a/PWGLF/TableProducer/Nuspex/threebodyKFTask.cxx b/PWGLF/TableProducer/Nuspex/threebodyKFTask.cxx index 206e2e1bff2..d85a0e11b53 100644 --- a/PWGLF/TableProducer/Nuspex/threebodyKFTask.cxx +++ b/PWGLF/TableProducer/Nuspex/threebodyKFTask.cxx @@ -183,6 +183,9 @@ struct threebodyKFTask { float genPt = -1.; std::array genDecVtx{-1.f}; int vtx3bodyPDGcode = -1; + int daughter0PDGcode = -1; + int daughter1PDGcode = -1; + int daughter2PDGcode = -1; double MCmassPrPi = -1.; float genPosP = -1.; float genPosPt = -1.; @@ -197,15 +200,18 @@ struct threebodyKFTask { if (vtx3bodydata.has_mcParticle() && vtx3bodydata.mcParticleId() > -1 && vtx3bodydata.mcParticleId() <= particlesMC.size()) { // mother to daughter association already checked in decay3bodybuilder auto MCvtx3body = vtx3bodydata.mcParticle(); + vtx3bodyPDGcode = MCvtx3body.pdgCode(); registry.fill(HIST("hLabelCounter"), 1.5); if (MCvtx3body.has_daughters()) { auto lMCTrack0 = track0.mcParticle_as(); auto lMCTrack1 = track1.mcParticle_as(); auto lMCTrack2 = track2.mcParticle_as(); + daughter0PDGcode = lMCTrack0.pdgCode(); + daughter1PDGcode = lMCTrack1.pdgCode(); + daughter2PDGcode = lMCTrack2.pdgCode(); // check PDG codes if ((MCvtx3body.pdgCode() == motherPdgCode && lMCTrack0.pdgCode() == 2212 && lMCTrack1.pdgCode() == -211 && lMCTrack2.pdgCode() == bachelorPdgCode) || (MCvtx3body.pdgCode() == -motherPdgCode && lMCTrack0.pdgCode() == 211 && lMCTrack1.pdgCode() == -2212 && lMCTrack2.pdgCode() == -bachelorPdgCode)) { - vtx3bodyPDGcode = MCvtx3body.pdgCode(); genDecVtx = {lMCTrack0.vx(), lMCTrack0.vy(), lMCTrack0.vz()}; MClifetime = RecoDecay::sqrtSumOfSquares(lMCTrack2.vx() - MCvtx3body.vx(), lMCTrack2.vy() - MCvtx3body.vy(), lMCTrack2.vz() - MCvtx3body.vz()) * o2::constants::physics::MassHyperTriton / MCvtx3body.p(); genPhi = MCvtx3body.phi(); @@ -264,9 +270,12 @@ struct threebodyKFTask { vtx3bodydata.pxtrack1(), vtx3bodydata.pytrack1(), vtx3bodydata.pztrack1(), // pion vtx3bodydata.pxtrack2(), vtx3bodydata.pytrack2(), vtx3bodydata.pztrack2(), // deuteron vtx3bodydata.tpcinnerparamtrack0(), vtx3bodydata.tpcinnerparamtrack1(), vtx3bodydata.tpcinnerparamtrack2(), // proton, pion, deuteron - vtx3bodydata.dcatrack0topvkf(), vtx3bodydata.dcatrack1topvkf(), vtx3bodydata.dcatrack2topvkf(), // proton, pion, deuteron - vtx3bodydata.dcaxytrack0topvkf(), vtx3bodydata.dcaxytrack1topvkf(), vtx3bodydata.dcaxytrack2topvkf(), // proton, pion, deuteron - vtx3bodydata.dcaxytrack0tosvkf(), vtx3bodydata.dcaxytrack1tosvkf(), vtx3bodydata.dcaxytrack2tosvkf(), // proton, pion, deuteron + vtx3bodydata.tpcncltrack0(), vtx3bodydata.tpcncltrack1(), vtx3bodydata.tpcncltrack1(), // proton, pion, deuteron + vtx3bodydata.tpcchi2ncldeuteron(), + vtx3bodydata.deltaphideuteron(), vtx3bodydata.deltaphiproton(), + vtx3bodydata.dcatrack0topvkf(), vtx3bodydata.dcatrack1topvkf(), vtx3bodydata.dcatrack2topvkf(), // proton, pion, deuteron + vtx3bodydata.dcaxytrack0topvkf(), vtx3bodydata.dcaxytrack1topvkf(), vtx3bodydata.dcaxytrack2topvkf(), // proton, pion, deuteron + vtx3bodydata.dcaxytrack0tosvkf(), vtx3bodydata.dcaxytrack1tosvkf(), vtx3bodydata.dcaxytrack2tosvkf(), // proton, pion, deuteron vtx3bodydata.dcatrack0totrack1kf(), vtx3bodydata.dcatrack0totrack2kf(), vtx3bodydata.dcatrack1totrack2kf(), vtx3bodydata.dcavtxdaughterskf(), vtx3bodydata.dcaxytrackpostopv(), vtx3bodydata.dcaxytracknegtopv(), vtx3bodydata.dcaxytrackbachtopv(), @@ -287,7 +296,7 @@ struct threebodyKFTask { genRap, genPosP, genPosPt, genNegP, genNegPt, genBachP, genBachPt, isTrueH3L, isTrueAntiH3L, - vtx3bodyPDGcode, + vtx3bodyPDGcode, daughter0PDGcode, daughter1PDGcode, daughter2PDGcode, true, // is reconstructed true); // reco event passed event selection } // end vtx3bodydatas loop @@ -306,6 +315,9 @@ struct threebodyKFTask { float genPtPos = -1.; float genPNeg = -1.; float genPtNeg = -1.; + int posDauPdgCode = -1; + int negDauPdgCode = -1; + int bachDauPdgCode = -1; // check if mcparticle was reconstructed and already filled in the table if (std::find(filledMothers.begin(), filledMothers.end(), mcparticle.globalIndex()) != std::end(filledMothers)) { @@ -347,10 +359,12 @@ struct threebodyKFTask { protonMom = {mcparticleDaughter.px(), mcparticleDaughter.py(), mcparticleDaughter.pz()}; genPPos = mcparticleDaughter.p(); genPtPos = mcparticleDaughter.pt(); + posDauPdgCode = mcparticleDaughter.pdgCode(); } else if (mcparticleDaughter.pdgCode() == -211) { piMinusMom = {mcparticleDaughter.px(), mcparticleDaughter.py(), mcparticleDaughter.pz()}; genPNeg = mcparticleDaughter.p(); genPtNeg = mcparticleDaughter.pt(); + negDauPdgCode = mcparticleDaughter.pdgCode(); } } genMCmassPrPi = RecoDecay::m(array{protonMom, piMinusMom}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged}); @@ -367,10 +381,12 @@ struct threebodyKFTask { antiProtonMom = {mcparticleDaughter.px(), mcparticleDaughter.py(), mcparticleDaughter.pz()}; genPNeg = mcparticleDaughter.p(); genPtNeg = mcparticleDaughter.pt(); + negDauPdgCode = mcparticleDaughter.pdgCode(); } else if (mcparticleDaughter.pdgCode() == 211) { piPlusMom = {mcparticleDaughter.px(), mcparticleDaughter.py(), mcparticleDaughter.pz()}; genPPos = mcparticleDaughter.p(); genPtPos = mcparticleDaughter.pt(); + posDauPdgCode = mcparticleDaughter.pdgCode(); } } genMCmassPrPi = RecoDecay::m(array{antiProtonMom, piPlusMom}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged}); @@ -388,6 +404,7 @@ struct threebodyKFTask { genDecayVtx = {mcDaughter.vx(), mcDaughter.vy(), mcDaughter.vz()}; genPBach = mcDaughter.p(); genPtBach = mcDaughter.pt(); + bachDauPdgCode = mcDaughter.pdgCode(); } } double genMClifetime = RecoDecay::sqrtSumOfSquares(genDecayVtx[0] - mcparticle.vx(), genDecayVtx[1] - mcparticle.vy(), genDecayVtx[2] - mcparticle.vz()) * o2::constants::physics::MassHyperTriton / mcparticle.p(); @@ -412,6 +429,9 @@ struct threebodyKFTask { -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, + -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -434,7 +454,7 @@ struct threebodyKFTask { mcparticle.y(), genPPos, genPtPos, genPNeg, genPtNeg, genPBach, genPtBach, isTrueGenH3L, isTrueGenAntiH3L, - mcparticle.pdgCode(), + mcparticle.pdgCode(), posDauPdgCode, negDauPdgCode, bachDauPdgCode, false, // is reconstructed survEvSel); } // end mcparticles loop From 0941243a26203c4fed7c2f903d4c90b01dd9d88d Mon Sep 17 00:00:00 2001 From: yuanzhe <90246048+wang-yuanzhe@users.noreply.github.com> Date: Sun, 16 Feb 2025 11:11:57 +0100 Subject: [PATCH 0247/1650] [PWGLF] Add Reduced decay3body table (#9988) --- PWGLF/DataModel/Reduced3BodyTables.h | 269 +++++++++++++++ PWGLF/DataModel/pidTOFGeneric.h | 127 ++++--- PWGLF/TableProducer/Nuspex/CMakeLists.txt | 5 + .../Nuspex/decay3bodybuilder.cxx | 112 ++++-- .../Nuspex/reduced3bodyCreator.cxx | 318 ++++++++++++++++++ 5 files changed, 751 insertions(+), 80 deletions(-) create mode 100644 PWGLF/DataModel/Reduced3BodyTables.h create mode 100644 PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx diff --git a/PWGLF/DataModel/Reduced3BodyTables.h b/PWGLF/DataModel/Reduced3BodyTables.h new file mode 100644 index 00000000000..a11081cd848 --- /dev/null +++ b/PWGLF/DataModel/Reduced3BodyTables.h @@ -0,0 +1,269 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +#ifndef PWGLF_DATAMODEL_REDUCED3BODYTABLES_H_ +#define PWGLF_DATAMODEL_REDUCED3BODYTABLES_H_ + +#include +#include "Framework/AnalysisDataModel.h" +#include "Common/Core/RecoDecay.h" +#include "CommonConstants/PhysicsConstants.h" +#include "PWGLF/DataModel/Vtx3BodyTables.h" + +namespace o2::aod +{ + +DECLARE_SOA_TABLE(ReducedCollisions, "AOD", "REDUCEDCOLLISION", //! reduced collision table (same structure as the original collision table) + o2::soa::Index<>, collision::BCId, + collision::PosX, collision::PosY, collision::PosZ, + collision::CovXX, collision::CovXY, collision::CovYY, collision::CovXZ, collision::CovYZ, collision::CovZZ, + collision::Flags, collision::Chi2, collision::NumContrib, + collision::CollisionTime, collision::CollisionTimeRes, + bc::RunNumber); + +DECLARE_SOA_TABLE(ReducedPVMults, "AOD", "REDUCEDPVMULT", //! Multiplicity from the PV contributors, joinable with reducedCollisions + mult::MultNTracksPV); + +DECLARE_SOA_TABLE(ReducedCentFT0Cs, "AOD", "REDUCEDCENTFT0C", //! Reduced Run 3 FT0C centrality table, joinable with reducedCollisions + cent::CentFT0C); + +namespace reducedtracks3body +{ +// track parameter definition +DECLARE_SOA_INDEX_COLUMN(Collision, collision); //! Collision to which this track belongs +DECLARE_SOA_COLUMN(X, x, float); //! +DECLARE_SOA_COLUMN(Alpha, alpha, float); //! +DECLARE_SOA_COLUMN(Y, y, float); //! +DECLARE_SOA_COLUMN(Z, z, float); //! +DECLARE_SOA_COLUMN(Snp, snp, float); //! +DECLARE_SOA_COLUMN(Tgl, tgl, float); //! +DECLARE_SOA_COLUMN(Signed1Pt, signed1Pt, float); //! (sign of charge)/Pt in c/GeV. Use pt() and sign() instead +DECLARE_SOA_EXPRESSION_COLUMN(Phi, phi, float, //! Phi of the track, in radians within [0, 2pi) + ifnode(nasin(aod::track::snp) + aod::track::alpha < 0.0f, nasin(aod::track::snp) + aod::track::alpha + o2::constants::math::TwoPI, + ifnode(nasin(aod::track::snp) + aod::track::alpha >= o2::constants::math::TwoPI, nasin(aod::track::snp) + aod::track::alpha - o2::constants::math::TwoPI, + nasin(aod::track::snp) + aod::track::alpha))); +DECLARE_SOA_EXPRESSION_COLUMN(Eta, eta, float, //! Pseudorapidity + -1.f * nlog(ntan(o2::constants::math::PIQuarter - 0.5f * natan(aod::track::tgl)))); +DECLARE_SOA_EXPRESSION_COLUMN(Pt, pt, float, //! Transverse momentum of the track in GeV/c + ifnode(nabs(aod::track::signed1Pt) <= o2::constants::math::Almost0, o2::constants::math::VeryBig, nabs(1.f / aod::track::signed1Pt))); +DECLARE_SOA_DYNAMIC_COLUMN(Sign, sign, //! Charge: positive: 1, negative: -1 + [](float signed1Pt) -> short { return (signed1Pt > 0) ? 1 : -1; }); +DECLARE_SOA_DYNAMIC_COLUMN(Px, px, //! Momentum in x-direction in GeV/c + [](float signed1Pt, float snp, float alpha) -> float { + auto pt = 1.f / std::abs(signed1Pt); + // FIXME: GCC & clang should optimize to sincosf + float cs = cosf(alpha), sn = sinf(alpha); + auto r = std::sqrt((1.f - snp) * (1.f + snp)); + return pt * (r * cs - snp * sn); + }); +DECLARE_SOA_DYNAMIC_COLUMN(Py, py, //! Momentum in y-direction in GeV/c + [](float signed1Pt, float snp, float alpha) -> float { + auto pt = 1.f / std::abs(signed1Pt); + // FIXME: GCC & clang should optimize to sincosf + float cs = cosf(alpha), sn = sinf(alpha); + auto r = std::sqrt((1.f - snp) * (1.f + snp)); + return pt * (snp * cs + r * sn); + }); +DECLARE_SOA_DYNAMIC_COLUMN(Pz, pz, //! Momentum in z-direction in GeV/c + [](float signed1Pt, float tgl) -> float { + auto pt = 1.f / std::abs(signed1Pt); + return pt * tgl; + }); +DECLARE_SOA_EXPRESSION_COLUMN(P, p, float, //! Momentum in Gev/c + ifnode(nabs(aod::track::signed1Pt) <= o2::constants::math::Almost0, o2::constants::math::VeryBig, 0.5f * (ntan(o2::constants::math::PIQuarter - 0.5f * natan(aod::track::tgl)) + 1.f / ntan(o2::constants::math::PIQuarter - 0.5f * natan(aod::track::tgl))) / nabs(aod::track::signed1Pt))); +DECLARE_SOA_DYNAMIC_COLUMN(Rapidity, rapidity, //! Track rapidity, computed under the mass assumption given as input + [](float signed1Pt, float tgl, float mass) -> float { + const auto pt = 1.f / std::abs(signed1Pt); + const auto pz = pt * tgl; + const auto p = 0.5f * (std::tan(o2::constants::math::PIQuarter - 0.5f * std::atan(tgl)) + 1.f / std::tan(o2::constants::math::PIQuarter - 0.5f * std::atan(tgl))) * pt; + const auto energy = std::sqrt(p * p + mass * mass); + return 0.5f * std::log((energy + pz) / (energy - pz)); + }); + +// tracks cov matrix parameter definition +DECLARE_SOA_COLUMN(SigmaY, sigmaY, float); //! Covariance matrix +DECLARE_SOA_COLUMN(SigmaZ, sigmaZ, float); //! Covariance matrix +DECLARE_SOA_COLUMN(SigmaSnp, sigmaSnp, float); //! Covariance matrix +DECLARE_SOA_COLUMN(SigmaTgl, sigmaTgl, float); //! Covariance matrix +DECLARE_SOA_COLUMN(Sigma1Pt, sigma1Pt, float); //! Covariance matrix +DECLARE_SOA_COLUMN(RhoZY, rhoZY, int8_t); //! Covariance matrix in compressed form +DECLARE_SOA_COLUMN(RhoSnpY, rhoSnpY, int8_t); //! Covariance matrix in compressed form +DECLARE_SOA_COLUMN(RhoSnpZ, rhoSnpZ, int8_t); //! Covariance matrix in compressed form +DECLARE_SOA_COLUMN(RhoTglY, rhoTglY, int8_t); //! Covariance matrix in compressed form +DECLARE_SOA_COLUMN(RhoTglZ, rhoTglZ, int8_t); //! Covariance matrix in compressed form +DECLARE_SOA_COLUMN(RhoTglSnp, rhoTglSnp, int8_t); //! Covariance matrix in compressed form +DECLARE_SOA_COLUMN(Rho1PtY, rho1PtY, int8_t); //! Covariance matrix in compressed form +DECLARE_SOA_COLUMN(Rho1PtZ, rho1PtZ, int8_t); //! Covariance matrix in compressed form +DECLARE_SOA_COLUMN(Rho1PtSnp, rho1PtSnp, int8_t); //! Covariance matrix in compressed form +DECLARE_SOA_COLUMN(Rho1PtTgl, rho1PtTgl, int8_t); //! Covariance matrix in compressed form + +DECLARE_SOA_EXPRESSION_COLUMN(CYY, cYY, float, //! + aod::track::sigmaY* aod::track::sigmaY); +DECLARE_SOA_EXPRESSION_COLUMN(CZY, cZY, float, //! + (aod::track::rhoZY / 128.f) * (aod::track::sigmaZ * aod::track::sigmaY)); +DECLARE_SOA_EXPRESSION_COLUMN(CZZ, cZZ, float, //! + aod::track::sigmaZ* aod::track::sigmaZ); +DECLARE_SOA_EXPRESSION_COLUMN(CSnpY, cSnpY, float, //! + (aod::track::rhoSnpY / 128.f) * (aod::track::sigmaSnp * aod::track::sigmaY)); +DECLARE_SOA_EXPRESSION_COLUMN(CSnpZ, cSnpZ, float, //! + (aod::track::rhoSnpZ / 128.f) * (aod::track::sigmaSnp * aod::track::sigmaZ)); +DECLARE_SOA_EXPRESSION_COLUMN(CSnpSnp, cSnpSnp, float, //! + aod::track::sigmaSnp* aod::track::sigmaSnp); +DECLARE_SOA_EXPRESSION_COLUMN(CTglY, cTglY, float, //! + (aod::track::rhoTglY / 128.f) * (aod::track::sigmaTgl * aod::track::sigmaY)); +DECLARE_SOA_EXPRESSION_COLUMN(CTglZ, cTglZ, float, //! + (aod::track::rhoTglZ / 128.f) * (aod::track::sigmaTgl * aod::track::sigmaZ)); +DECLARE_SOA_EXPRESSION_COLUMN(CTglSnp, cTglSnp, float, //! + (aod::track::rhoTglSnp / 128.f) * (aod::track::sigmaTgl * aod::track::sigmaSnp)); +DECLARE_SOA_EXPRESSION_COLUMN(CTglTgl, cTglTgl, float, //! + aod::track::sigmaTgl* aod::track::sigmaTgl); +DECLARE_SOA_EXPRESSION_COLUMN(C1PtY, c1PtY, float, //! + (aod::track::rho1PtY / 128.f) * (aod::track::sigma1Pt * aod::track::sigmaY)); +DECLARE_SOA_EXPRESSION_COLUMN(C1PtZ, c1PtZ, float, //! + (aod::track::rho1PtZ / 128.f) * (aod::track::sigma1Pt * aod::track::sigmaZ)); +DECLARE_SOA_EXPRESSION_COLUMN(C1PtSnp, c1PtSnp, float, //! + (aod::track::rho1PtSnp / 128.f) * (aod::track::sigma1Pt * aod::track::sigmaSnp)); +DECLARE_SOA_EXPRESSION_COLUMN(C1PtTgl, c1PtTgl, float, //! + (aod::track::rho1PtTgl / 128.f) * (aod::track::sigma1Pt * aod::track::sigmaTgl)); +DECLARE_SOA_EXPRESSION_COLUMN(C1Pt21Pt2, c1Pt21Pt2, float, //! + aod::track::sigma1Pt* aod::track::sigma1Pt); + +// tracks extra parameter definition +DECLARE_SOA_COLUMN(TPCInnerParam, tpcInnerParam, float); //! Momentum at inner wall of the TPC +DECLARE_SOA_COLUMN(Flags, flags, uint32_t); //! Track flags. Run 2: see TrackFlagsRun2Enum | Run 3: see TrackFlags +DECLARE_SOA_COLUMN(ITSClusterSizes, itsClusterSizes, uint32_t); //! Clusters sizes, four bits per a layer, starting from the innermost +DECLARE_SOA_COLUMN(TPCNClsFindable, tpcNClsFindable, uint8_t); //! Findable TPC clusters for this track geometry +DECLARE_SOA_COLUMN(TPCNClsFindableMinusFound, tpcNClsFindableMinusFound, int8_t); //! TPC Clusters: Findable - Found +DECLARE_SOA_COLUMN(TPCNClsFindableMinusCrossedRows, tpcNClsFindableMinusCrossedRows, int8_t); //! TPC Clusters: Findable - crossed rows +DECLARE_SOA_COLUMN(TRDPattern, trdPattern, uint8_t); //! Contributor to the track on TRD layer in bits 0-5, starting from the innermost, bit 6 indicates a potentially split tracklet, bit 7 if the track crossed a padrow +DECLARE_SOA_COLUMN(TPCChi2NCl, tpcChi2NCl, float); //! Chi2 / cluster for the TPC track segment +DECLARE_SOA_COLUMN(TOFChi2, tofChi2, float); //! Chi2 for the TOF track segment +DECLARE_SOA_COLUMN(TPCSignal, tpcSignal, float); //! dE/dx signal in the TPC +DECLARE_SOA_COLUMN(TOFExpMom, tofExpMom, float); //! TOF expected momentum obtained in tracking, used to compute the expected times + +DECLARE_SOA_EXPRESSION_COLUMN(DetectorMap, detectorMap, uint8_t, //! Detector map version 1, see enum DetectorMapEnum + ifnode(aod::track::itsClusterSizes > (uint32_t)0, static_cast(o2::aod::track::ITS), (uint8_t)0x0) | + ifnode(aod::track::tpcNClsFindable > (uint8_t)0, static_cast(o2::aod::track::TPC), (uint8_t)0x0) | + ifnode(aod::track::trdPattern > (uint8_t)0, static_cast(o2::aod::track::TRD), (uint8_t)0x0) | + ifnode((aod::track::tofChi2 >= 0.f) && (aod::track::tofExpMom > 0.f), static_cast(o2::aod::track::TOF), (uint8_t)0x0)); + +DECLARE_SOA_DYNAMIC_COLUMN(ITSClsSizeInLayer, itsClsSizeInLayer, //! Size of the ITS cluster in a given layer + [](uint32_t itsClusterSizes, int layer) -> uint8_t { + if (layer >= 7 || layer < 0) { + return 0; + } + return (itsClusterSizes >> (layer * 4)) & 0xf; + }); + +DECLARE_SOA_DYNAMIC_COLUMN(HasTPC, hasTPC, //! Flag to check if track has a TPC match + [](uint8_t detectorMap) -> bool { return detectorMap & o2::aod::track::TPC; }); +DECLARE_SOA_DYNAMIC_COLUMN(HasTOF, hasTOF, //! Flag to check if track has a TOF measurement + [](uint8_t detectorMap) -> bool { return detectorMap & o2::aod::track::TOF; }); +DECLARE_SOA_DYNAMIC_COLUMN(IsPVContributor, isPVContributor, //! Run 3: Has this track contributed to the collision vertex fit + [](uint8_t flags) -> bool { return (flags & o2::aod::track::PVContributor) == o2::aod::track::PVContributor; }); +DECLARE_SOA_DYNAMIC_COLUMN(PIDForTracking, pidForTracking, //! PID hypothesis used during tracking. See the constants in the class PID in PID.h + [](uint32_t flags) -> uint32_t { return flags >> 28; }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCNClsFound, tpcNClsFound, //! Number of found TPC clusters + [](uint8_t tpcNClsFindable, int8_t tpcNClsFindableMinusFound) -> int16_t { return (int16_t)tpcNClsFindable - tpcNClsFindableMinusFound; }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCNClsCrossedRows, tpcNClsCrossedRows, //! Number of crossed TPC Rows + [](uint8_t tpcNClsFindable, int8_t TPCNClsFindableMinusCrossedRows) -> int16_t { return (int16_t)tpcNClsFindable - TPCNClsFindableMinusCrossedRows; }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCCrossedRowsOverFindableCls, tpcCrossedRowsOverFindableCls, //! Ratio crossed rows over findable clusters + [](uint8_t tpcNClsFindable, int8_t tpcNClsFindableMinusCrossedRows) -> float { + int16_t tpcNClsCrossedRows = (int16_t)tpcNClsFindable - tpcNClsFindableMinusCrossedRows; + return (float)tpcNClsCrossedRows / (float)tpcNClsFindable; + }); + +// track PID definition +DECLARE_SOA_COLUMN(TPCNSigmaPr, tpcNSigmaPr, float); //! Nsigma separation with the TPC detector for proton +DECLARE_SOA_COLUMN(TPCNSigmaDe, tpcNSigmaDe, float); //! Nsigma separation with the TPC detector for deuteron +DECLARE_SOA_COLUMN(TPCNSigmaPi, tpcNSigmaPi, float); //! Nsigma separation with the TPC detector for pion +DECLARE_SOA_COLUMN(TOFNSigmaDe, tofNSigmaDe, float); //! Nsigma separation with the TOF detector for deuteron (recalculated) + +} // namespace reducedtracks3body + +DECLARE_SOA_TABLE_FULL(StoredReducedTracksIU, "ReducedTracks_IU", "AOD", "REDUCEDTRACK_IU", //! On disk version of the track parameters at inner most update (e.g. ITS) as it comes from the tracking + o2::soa::Index<>, reducedtracks3body::CollisionId, + reducedtracks3body::X, reducedtracks3body::Alpha, + reducedtracks3body::Y, reducedtracks3body::Z, reducedtracks3body::Snp, reducedtracks3body::Tgl, + reducedtracks3body::Signed1Pt, + // cov matrix + reducedtracks3body::SigmaY, reducedtracks3body::SigmaZ, reducedtracks3body::SigmaSnp, reducedtracks3body::SigmaTgl, reducedtracks3body::Sigma1Pt, + reducedtracks3body::RhoZY, reducedtracks3body::RhoSnpY, reducedtracks3body::RhoSnpZ, reducedtracks3body::RhoTglY, reducedtracks3body::RhoTglZ, + reducedtracks3body::RhoTglSnp, reducedtracks3body::Rho1PtY, reducedtracks3body::Rho1PtZ, reducedtracks3body::Rho1PtSnp, reducedtracks3body::Rho1PtTgl, + // tracks extra + reducedtracks3body::TPCInnerParam, reducedtracks3body::Flags, reducedtracks3body::ITSClusterSizes, + reducedtracks3body::TPCNClsFindable, reducedtracks3body::TPCNClsFindableMinusFound, reducedtracks3body::TPCNClsFindableMinusCrossedRows, + reducedtracks3body::TRDPattern, reducedtracks3body::TPCChi2NCl, reducedtracks3body::TOFChi2, + reducedtracks3body::TPCSignal, reducedtracks3body::TOFExpMom, + // TPC PID + reducedtracks3body::TPCNSigmaPr, reducedtracks3body::TPCNSigmaPi, reducedtracks3body::TPCNSigmaDe, + reducedtracks3body::TOFNSigmaDe, + + // ----------- dynmaic columns ------------ + // tracks IU + reducedtracks3body::Px, + reducedtracks3body::Py, + reducedtracks3body::Pz, + reducedtracks3body::Rapidity, + reducedtracks3body::Sign, + // tracks extra + reducedtracks3body::PIDForTracking, + reducedtracks3body::IsPVContributor, + reducedtracks3body::HasTPC, + reducedtracks3body::HasTOF, + reducedtracks3body::TPCNClsFound, + reducedtracks3body::TPCNClsCrossedRows, + reducedtracks3body::ITSClsSizeInLayer, + reducedtracks3body::TPCCrossedRowsOverFindableCls); + +DECLARE_SOA_EXTENDED_TABLE(ReducedTracksIU, StoredReducedTracksIU, "EXREDUCEDTRACK_IU", 0, //! Track parameters at inner most update (e.g. ITS) as it comes from the tracking + reducedtracks3body::Pt, + reducedtracks3body::P, + reducedtracks3body::Eta, + reducedtracks3body::Phi, + // cov matrix + reducedtracks3body::CYY, + reducedtracks3body::CZY, + reducedtracks3body::CZZ, + reducedtracks3body::CSnpY, + reducedtracks3body::CSnpZ, + reducedtracks3body::CSnpSnp, + reducedtracks3body::CTglY, + reducedtracks3body::CTglZ, + reducedtracks3body::CTglSnp, + reducedtracks3body::CTglTgl, + reducedtracks3body::C1PtY, + reducedtracks3body::C1PtZ, + reducedtracks3body::C1PtSnp, + reducedtracks3body::C1PtTgl, + reducedtracks3body::C1Pt21Pt2, + // tracks extra + reducedtracks3body::DetectorMap); + +using ReducedTrackIU = ReducedTracksIU::iterator; + +namespace reduceddecay3body +{ +DECLARE_SOA_INDEX_COLUMN_FULL(Track0, track0, int, ReducedTracksIU, "_0"); //! Track 0 index +DECLARE_SOA_INDEX_COLUMN_FULL(Track1, track1, int, ReducedTracksIU, "_1"); //! Track 1 index +DECLARE_SOA_INDEX_COLUMN_FULL(Track2, track2, int, ReducedTracksIU, "_2"); //! Track 2 index +DECLARE_SOA_INDEX_COLUMN_FULL(Collision, collision, int, ReducedCollisions, ""); //! Collision index +} // namespace reduceddecay3body + +DECLARE_SOA_TABLE(ReducedDecay3Bodys, "AOD", "REDUCEDDECAY3BODY", //! reduced 3-body decay table + o2::soa::Index<>, reduceddecay3body::CollisionId, reduceddecay3body::Track0Id, reduceddecay3body::Track1Id, reduceddecay3body::Track2Id); + +using ReducedDecay3BodysLinked = soa::Join; +using ReducedDecay3BodyLinked = ReducedDecay3BodysLinked::iterator; + +} // namespace o2::aod + +#endif // PWGLF_DATAMODEL_REDUCED3BODYTABLES_H_ diff --git a/PWGLF/DataModel/pidTOFGeneric.h b/PWGLF/DataModel/pidTOFGeneric.h index b43d4ecc9ff..a0d287a7643 100644 --- a/PWGLF/DataModel/pidTOFGeneric.h +++ b/PWGLF/DataModel/pidTOFGeneric.h @@ -88,19 +88,76 @@ class TofPidNewCollision template float GetTOFNSigma(TTrack const& track, TCollision const& originalcol, TCollision const& correctedcol, bool EnableBCAO2D = true); + + float GetTOFNSigma(TTrack const& track); + float GetTOFNSigma(o2::track::PID::ID pidId, TTrack const& track); + + float CalculateTOFNSigma(o2::track::PID::ID pidId, TTrack const& track, double tofsignal, double evTime, double evTimeErr) + { + + float expSigma, tofNsigma = -999; + + switch (pidId) { + case 0: + expSigma = responseEl.GetExpectedSigma(mRespParamsV2, track, tofsignal, evTimeErr); + tofNsigma = (tofsignal - evTime - responseEl.GetCorrectedExpectedSignal(mRespParamsV2, track)) / expSigma; + break; + case 1: + expSigma = responseMu.GetExpectedSigma(mRespParamsV2, track, tofsignal, evTimeErr); + tofNsigma = (tofsignal - evTime - responseMu.GetCorrectedExpectedSignal(mRespParamsV2, track)) / expSigma; + break; + case 2: + expSigma = responsePi.GetExpectedSigma(mRespParamsV2, track, tofsignal, evTimeErr); + tofNsigma = (tofsignal - evTime - responsePi.GetCorrectedExpectedSignal(mRespParamsV2, track)) / expSigma; + break; + case 3: + expSigma = responseKa.GetExpectedSigma(mRespParamsV2, track, tofsignal, evTimeErr); + tofNsigma = (tofsignal - evTime - responseKa.GetCorrectedExpectedSignal(mRespParamsV2, track)) / expSigma; + break; + case 4: + expSigma = responsePr.GetExpectedSigma(mRespParamsV2, track, tofsignal, evTimeErr); + tofNsigma = (tofsignal - evTime - responsePr.GetCorrectedExpectedSignal(mRespParamsV2, track)) / expSigma; + break; + case 5: + expSigma = responseDe.GetExpectedSigma(mRespParamsV2, track, tofsignal, evTimeErr); + tofNsigma = (tofsignal - evTime - responseDe.GetCorrectedExpectedSignal(mRespParamsV2, track)) / expSigma; + break; + case 6: + expSigma = responseTr.GetExpectedSigma(mRespParamsV2, track, tofsignal, evTimeErr); + tofNsigma = (tofsignal - evTime - responseTr.GetCorrectedExpectedSignal(mRespParamsV2, track)) / expSigma; + break; + case 7: + expSigma = responseHe.GetExpectedSigma(mRespParamsV2, track, tofsignal, evTimeErr); + tofNsigma = (tofsignal - evTime - responseHe.GetCorrectedExpectedSignal(mRespParamsV2, track)) / expSigma; + break; + case 8: + expSigma = responseAl.GetExpectedSigma(mRespParamsV2, track, tofsignal, evTimeErr); + tofNsigma = (tofsignal - evTime - responseAl.GetCorrectedExpectedSignal(mRespParamsV2, track)) / expSigma; + break; + default: + LOG(fatal) << "Wrong particle ID in TofPidSecondary class"; + return -999; + } + + return tofNsigma; + } }; template template float TofPidNewCollision::GetTOFNSigma(o2::track::PID::ID pidId, TTrack const& track, TCollision const& originalcol, TCollision const& correctedcol, bool EnableBCAO2D) { + + if (!track.has_collision() || !track.hasTOF()) { + return -999; + } + float mMassHyp = o2::track::pid_constants::sMasses2Z[track.pidForTracking()]; float expTime = track.length() * sqrt((mMassHyp * mMassHyp) + (track.tofExpMom() * track.tofExpMom())) / (kCSPEED * track.tofExpMom()); // L*E/(p*c) = L/v float evTime = correctedcol.evTime(); float evTimeErr = correctedcol.evTimeErr(); float tofsignal = track.trackTime() * 1000 + expTime; // in ps - float expSigma, tofNsigma; if (originalcol.globalIndex() == correctedcol.globalIndex()) { evTime = track.evTimeForTrack(); @@ -121,48 +178,7 @@ float TofPidNewCollision::GetTOFNSigma(o2::track::PID::ID pidId, TTrack } } - switch (pidId) { - case 0: - expSigma = responseEl.GetExpectedSigma(mRespParamsV2, track, tofsignal, evTimeErr); - tofNsigma = (tofsignal - evTime - responseEl.GetCorrectedExpectedSignal(mRespParamsV2, track)) / expSigma; - break; - case 1: - expSigma = responseMu.GetExpectedSigma(mRespParamsV2, track, tofsignal, evTimeErr); - tofNsigma = (tofsignal - evTime - responseMu.GetCorrectedExpectedSignal(mRespParamsV2, track)) / expSigma; - break; - case 2: - expSigma = responsePi.GetExpectedSigma(mRespParamsV2, track, tofsignal, evTimeErr); - tofNsigma = (tofsignal - evTime - responsePi.GetCorrectedExpectedSignal(mRespParamsV2, track)) / expSigma; - break; - case 3: - expSigma = responseKa.GetExpectedSigma(mRespParamsV2, track, tofsignal, evTimeErr); - tofNsigma = (tofsignal - evTime - responseKa.GetCorrectedExpectedSignal(mRespParamsV2, track)) / expSigma; - break; - case 4: - expSigma = responsePr.GetExpectedSigma(mRespParamsV2, track, tofsignal, evTimeErr); - tofNsigma = (tofsignal - evTime - responsePr.GetCorrectedExpectedSignal(mRespParamsV2, track)) / expSigma; - break; - case 5: - expSigma = responseDe.GetExpectedSigma(mRespParamsV2, track, tofsignal, evTimeErr); - tofNsigma = (tofsignal - evTime - responseDe.GetCorrectedExpectedSignal(mRespParamsV2, track)) / expSigma; - break; - case 6: - expSigma = responseTr.GetExpectedSigma(mRespParamsV2, track, tofsignal, evTimeErr); - tofNsigma = (tofsignal - evTime - responseTr.GetCorrectedExpectedSignal(mRespParamsV2, track)) / expSigma; - break; - case 7: - expSigma = responseHe.GetExpectedSigma(mRespParamsV2, track, tofsignal, evTimeErr); - tofNsigma = (tofsignal - evTime - responseHe.GetCorrectedExpectedSignal(mRespParamsV2, track)) / expSigma; - break; - case 8: - expSigma = responseAl.GetExpectedSigma(mRespParamsV2, track, tofsignal, evTimeErr); - tofNsigma = (tofsignal - evTime - responseAl.GetCorrectedExpectedSignal(mRespParamsV2, track)) / expSigma; - break; - default: - LOG(fatal) << "Wrong particle ID in TofPidSecondary class"; - return -999; - } - + float tofNsigma = CalculateTOFNSigma(pidId, track, tofsignal, evTime, evTimeErr); return tofNsigma; } @@ -173,6 +189,31 @@ float TofPidNewCollision::GetTOFNSigma(TTrack const& track, TCollision c return GetTOFNSigma(pidType, track, originalcol, correctedcol, EnableBCAO2D); } +template +float TofPidNewCollision::GetTOFNSigma(o2::track::PID::ID pidId, TTrack const& track) +{ + + if (!track.has_collision() || !track.hasTOF()) { + return -999; + } + + float mMassHyp = o2::track::pid_constants::sMasses2Z[track.pidForTracking()]; + float expTime = track.length() * sqrt((mMassHyp * mMassHyp) + (track.tofExpMom() * track.tofExpMom())) / (kCSPEED * track.tofExpMom()); // L*E/(p*c) = L/v + + float evTime = track.evTimeForTrack(); + float evTimeErr = track.evTimeErrForTrack(); + float tofsignal = track.trackTime() * 1000 + expTime; // in ps + + float tofNsigma = CalculateTOFNSigma(pidId, track, tofsignal, evTime, evTimeErr); + return tofNsigma; +} + +template +float TofPidNewCollision::GetTOFNSigma(TTrack const& track) +{ + return GetTOFNSigma(pidType, track); +} + } // namespace pidtofgeneric } // namespace o2::aod diff --git a/PWGLF/TableProducer/Nuspex/CMakeLists.txt b/PWGLF/TableProducer/Nuspex/CMakeLists.txt index be724d080ad..076349f3af5 100644 --- a/PWGLF/TableProducer/Nuspex/CMakeLists.txt +++ b/PWGLF/TableProducer/Nuspex/CMakeLists.txt @@ -98,3 +98,8 @@ o2physics_add_dpl_workflow(tr-he-analysis SOURCES trHeAnalysis.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(reduced3body-creator + SOURCES reduced3bodyCreator.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::EventFilteringUtils O2::TOFBase + COMPONENT_NAME Analysis) diff --git a/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx b/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx index 3621716228b..53a44016ddb 100644 --- a/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx +++ b/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx @@ -32,6 +32,7 @@ #include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" #include "PWGLF/DataModel/LFStrangenessTables.h" +#include "PWGLF/DataModel/Reduced3BodyTables.h" #include "PWGLF/DataModel/Vtx3BodyTables.h" #include "PWGLF/DataModel/pidTOFGeneric.h" #include "Common/Core/TrackSelection.h" @@ -69,7 +70,7 @@ using namespace o2::framework::expressions; using std::array; using FullTracksExtIU = soa::Join; -using FullTracksExtPIDIU = soa::Join; +using FullTracksExtPIDIU = soa::Join; using ColwithEvTimes = o2::soa::Join; using FullCols = o2::soa::Join; @@ -329,6 +330,7 @@ struct decay3bodyBuilder { // Filters and slices // Filter collisionFilter = (aod::evsel::sel8 == true && nabs(aod::collision::posZ) < 10.f); Preslice perCollision = o2::aod::decay3body::collisionId; + Preslice perReducedCollision = o2::aod::reduceddecay3body::collisionId; int mRunNumber; float d_bz; @@ -404,7 +406,7 @@ struct decay3bodyBuilder { fitter3body.setMatCorrType(matCorr); // Add histograms separately for different process functions - if (doprocessRun3 == true || doprocessRun3EM == true || doprocessRun3EMLikeSign == true) { + if (doprocessRun3 == true || doprocessRun3Reduced || doprocessRun3EM == true || doprocessRun3EMLikeSign == true) { registry.add("hEventCounter", "hEventCounter", HistType::kTH1F, {{1, 0.0f, 1.0f}}); auto hVtx3BodyCounter = registry.add("hVtx3BodyCounter", "hVtx3BodyCounter", HistType::kTH1F, {{6, 0.0f, 6.0f}}); hVtx3BodyCounter->GetXaxis()->SetBinLabel(1, "Total"); @@ -516,7 +518,7 @@ struct decay3bodyBuilder { KFParticle::SetField(d_bz); #endif o2::parameters::GRPMagField grpmag; - if (fabs(d_bz) > 1e-5) { + if (std::fabs(d_bz) > 1e-5) { grpmag.setL3Current(30000.f / (d_bz / 5.0f)); } o2::base::Propagator::initFieldFromGRP(&grpmag); @@ -649,7 +651,7 @@ struct decay3bodyBuilder { //------------------------------------------------------------------ // 3body candidate builder template - void fillVtxCand(TCollisionTable const& collision, TTrackTable const& t0, TTrackTable const& t1, TTrackTable const& t2, int64_t decay3bodyId, int bachelorcharge = 1) + void fillVtxCand(TCollisionTable const& collision, TTrackTable const& t0, TTrackTable const& t1, TTrackTable const& t2, int64_t decay3bodyId, int bachelorcharge = 1, double tofNSigmaBach = -999) { registry.fill(HIST("hVtx3BodyCounter"), kVtxAll); @@ -659,18 +661,6 @@ struct decay3bodyBuilder { } registry.fill(HIST("hVtx3BodyCounter"), kVtxTPCNcls); - // Recalculate the TOF PID - double tofNSigmaBach = -999; - if (t2.has_collision() && t2.hasTOF()) { - if (decay3bodyId == -1) { - // for event-mixing, the collisionId of tracks not equal to global index - tofNSigmaBach = bachelorTOFPID.GetTOFNSigma(t2, collision, collision); - } else { - auto originalcol = t2.template collision_as(); - tofNSigmaBach = bachelorTOFPID.GetTOFNSigma(t2, originalcol, collision); - } - } - if (enablePidCut) { if (t2.sign() > 0) { if (!checkPIDH3L(t0, t1, t2, tofNSigmaBach)) @@ -733,7 +723,7 @@ struct decay3bodyBuilder { } registry.fill(HIST("hVtx3BodyCounter"), kVtxDcaDau); - float VtxcosPA = RecoDecay::cpa(array{collision.posX(), collision.posY(), collision.posZ()}, array{pos[0], pos[1], pos[2]}, array{p3B[0], p3B[1], p3B[2]}); + float VtxcosPA = RecoDecay::cpa(array{collision.posX(), collision.posY(), collision.posZ()}, std::array{pos[0], pos[1], pos[2]}, std::array{p3B[0], p3B[1], p3B[2]}); if (VtxcosPA < minCosPA3body) { return; } @@ -1498,21 +1488,52 @@ struct decay3bodyBuilder { initCCDB(bc); registry.fill(HIST("hEventCounter"), 0.5); - const auto& d3bodysInCollision = decay3bodys.sliceBy(perCollision, collision.globalIndex()); - for (auto& d3body : d3bodysInCollision) { + const auto& d3bodys_thisCollision = decay3bodys.sliceBy(perCollision, collision.globalIndex()); + for (const auto& d3body : d3bodys_thisCollision) { auto t0 = d3body.template track0_as(); auto t1 = d3body.template track1_as(); auto t2 = d3body.template track2_as(); - fillVtxCand(collision, t0, t1, t2, d3body.globalIndex(), bachelorcharge); + + // Recalculate the TOF PID + double tofNSigmaBach = -999; + if (t2.has_collision() && t2.hasTOF()) { + auto originalcol = t2.template collision_as(); + tofNSigmaBach = bachelorTOFPID.GetTOFNSigma(t2, originalcol, collision); + } + + fillVtxCand(collision, t0, t1, t2, d3body.globalIndex(), bachelorcharge, tofNSigmaBach); } } - for (auto& candVtx : vtxCandidates) { + for (const auto& candVtx : vtxCandidates) { fillVtx3BodyTable(candVtx); } } PROCESS_SWITCH(decay3bodyBuilder, processRun3, "Produce DCA fitter decay3body tables", true); + //------------------------------------------------------------------ + void processRun3Reduced(aod::ReducedCollisions const& collisions, aod::ReducedTracksIU const&, aod::ReducedDecay3Bodys const& decay3bodys, aod::BCsWithTimestamps const&) + { + vtxCandidates.clear(); + + registry.fill(HIST("hEventCounter"), 0.5, collisions.size()); + + for (const auto& d3body : decay3bodys) { + auto t0 = d3body.template track0_as(); + auto t1 = d3body.template track1_as(); + auto t2 = d3body.template track2_as(); + auto collision = d3body.template collision_as(); + auto bc = collision.bc_as(); + initCCDB(bc); + fillVtxCand(collision, t0, t1, t2, d3body.globalIndex(), bachelorcharge, t2.tofNSigmaDe()); + } + + for (const auto& candVtx : vtxCandidates) { + fillVtx3BodyTable(candVtx); + } + } + PROCESS_SWITCH(decay3bodyBuilder, processRun3Reduced, "Produce DCA fitter decay3body tables with reduced data", false); + //------------------------------------------------------------------ // Event-mixing background void processRun3EM(FullCols const& collisions, TrackExtPIDIUwithEvTimes const& tracksIU, aod::BCsWithTimestamps const&) @@ -1537,7 +1558,7 @@ struct decay3bodyBuilder { candBachelors.bindTable(tracksIU); candAntiBachelors.bindTable(tracksIU); - for (auto& [c1, tracks1, c2, tracks2] : pair) { + for (const auto& [c1, tracks1, c2, tracks2] : pair) { if (EMTrackSel.em_event_sel8_selection && (!c1.sel8() || !c2.sel8())) { continue; } @@ -1551,10 +1572,12 @@ struct decay3bodyBuilder { auto antibachelors = candAntiBachelors->sliceByCached(aod::track::collisionId, c2.globalIndex(), cache); for (auto const& [tpos, tneg, tbach] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(protons, pionsminus, bachelors))) { - fillVtxCand(c1, tpos, tneg, tbach, -1, bachelorcharge); + double tofNSigmaBach = bachelorTOFPID.GetTOFNSigma(tbach); // Recalculate the TOF PID + fillVtxCand(c1, tpos, tneg, tbach, -1, bachelorcharge, tofNSigmaBach); } for (auto const& [tpos, tneg, tbach] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(pionsplus, antiprotons, antibachelors))) { - fillVtxCand(c1, tpos, tneg, tbach, -1, bachelorcharge); + double tofNSigmaBach = bachelorTOFPID.GetTOFNSigma(tbach); // Recalculate the TOF PID + fillVtxCand(c1, tpos, tneg, tbach, -1, bachelorcharge, tofNSigmaBach); } } @@ -1563,7 +1586,7 @@ struct decay3bodyBuilder { return a.collisionId < b.collisionId; }); - for (auto& candVtx : vtxCandidates) { + for (const auto& candVtx : vtxCandidates) { fillVtx3BodyTable(candVtx); } } @@ -1593,7 +1616,7 @@ struct decay3bodyBuilder { candBachelors.bindTable(tracksIU); candAntiBachelors.bindTable(tracksIU); - for (auto& [c1, tracks1, c2, tracks2] : pair) { + for (const auto& [c1, tracks1, c2, tracks2] : pair) { if (EMTrackSel.em_event_sel8_selection && (!c1.sel8() || !c2.sel8())) { continue; } @@ -1607,10 +1630,12 @@ struct decay3bodyBuilder { auto antibachelors = candAntiBachelors->sliceByCached(aod::track::collisionId, c2.globalIndex(), cache); for (auto const& [tpos, tneg, tbach] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(protons, pionsminus, antibachelors))) { - fillVtxCand(c1, tpos, tneg, tbach, -1, bachelorcharge); + double tofNSigmaBach = bachelorTOFPID.GetTOFNSigma(tbach); // Recalculate the TOF PID + fillVtxCand(c1, tpos, tneg, tbach, -1, bachelorcharge, tofNSigmaBach); } for (auto const& [tpos, tneg, tbach] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(pionsplus, antiprotons, bachelors))) { - fillVtxCand(c1, tpos, tneg, tbach, -1, bachelorcharge); + double tofNSigmaBach = bachelorTOFPID.GetTOFNSigma(tbach); // Recalculate the TOF PID + fillVtxCand(c1, tpos, tneg, tbach, -1, bachelorcharge, tofNSigmaBach); } } @@ -1619,7 +1644,7 @@ struct decay3bodyBuilder { return a.collisionId < b.collisionId; }); - for (auto& candVtx : vtxCandidates) { + for (const auto& candVtx : vtxCandidates) { fillVtx3BodyTable(candVtx); } } @@ -1773,13 +1798,14 @@ struct decay3bodyDataLinkBuilder { void init(InitContext const&) {} - void process(aod::Decay3Bodys const& decay3bodytable, aod::Vtx3BodyDatas const& vtxdatatable) + template + void buildDecay3BodyLabel(TDecay3Bodys const& decay3bodytable, TVtx3BodyDatas const& vtxdatatable) { std::vector lIndices; lIndices.reserve(decay3bodytable.size()); for (int ii = 0; ii < decay3bodytable.size(); ii++) lIndices[ii] = -1; - for (auto& vtxdata : vtxdatatable) { + for (const auto& vtxdata : vtxdatatable) { if (vtxdata.decay3bodyId() != -1) { lIndices[vtxdata.decay3bodyId()] = vtxdata.globalIndex(); } @@ -1788,6 +1814,18 @@ struct decay3bodyDataLinkBuilder { vtxdataLink(lIndices[ii]); } } + + void processStandard(aod::Decay3Bodys const& decay3bodytable, aod::Vtx3BodyDatas const& vtxdatatable) + { + buildDecay3BodyLabel(decay3bodytable, vtxdatatable); + } + PROCESS_SWITCH(decay3bodyDataLinkBuilder, processStandard, "Produce label from decay3body to vtx3body", true); + + void processReduced(aod::ReducedDecay3Bodys const& decay3bodytable, aod::Vtx3BodyDatas const& vtxdatatable) + { + buildDecay3BodyLabel(decay3bodytable, vtxdatatable); + } + PROCESS_SWITCH(decay3bodyDataLinkBuilder, processReduced, "Produce label from reducedDecay3body to vtx3body", false); }; struct kfdecay3bodyDataLinkBuilder { @@ -1860,7 +1898,7 @@ struct decay3bodyLabelBuilder { lIndices[ii] = -1; } - for (auto& decay3body : decay3bodys) { + for (const auto& decay3body : decay3bodys) { int lLabel = -1; int lPDG = -1; @@ -1888,9 +1926,9 @@ struct decay3bodyLabelBuilder { continue; } - for (auto& lMother0 : lMCTrack0.mothers_as()) { - for (auto& lMother1 : lMCTrack1.mothers_as()) { - for (auto& lMother2 : lMCTrack2.mothers_as()) { + for (const auto& lMother0 : lMCTrack0.mothers_as()) { + for (const auto& lMother1 : lMCTrack1.mothers_as()) { + for (const auto& lMother2 : lMCTrack2.mothers_as()) { if (lMother0.globalIndex() == lMother1.globalIndex() && lMother0.globalIndex() == lMother2.globalIndex()) { lGlobalIndex = lMother1.globalIndex(); lPt = lMother1.pt(); @@ -1910,7 +1948,7 @@ struct decay3bodyLabelBuilder { // Intended for hypertriton cross-checks only if (lPDG == 1010010030 && lMCTrack0.pdgCode() == 2212 && lMCTrack1.pdgCode() == -211 && lMCTrack2.pdgCode() == 1000010020) { lLabel = lGlobalIndex; - double hypertritonMCMass = RecoDecay::m(array{array{lMCTrack0.px(), lMCTrack0.py(), lMCTrack0.pz()}, array{lMCTrack1.px(), lMCTrack1.py(), lMCTrack1.pz()}, array{lMCTrack2.px(), lMCTrack2.py(), lMCTrack2.pz()}}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged, o2::constants::physics::MassDeuteron}); + double hypertritonMCMass = RecoDecay::m(std::array{std::array{lMCTrack0.px(), lMCTrack0.py(), lMCTrack0.pz()}, std::array{lMCTrack1.px(), lMCTrack1.py(), lMCTrack1.pz()}, std::array{lMCTrack2.px(), lMCTrack2.py(), lMCTrack2.pz()}}, std::array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged, o2::constants::physics::MassDeuteron}); registry.fill(HIST("hLabelCounter"), 2.5); registry.fill(HIST("hHypertritonMCPt"), lPt); registry.fill(HIST("hHypertritonMCLifetime"), MClifetime); @@ -1918,7 +1956,7 @@ struct decay3bodyLabelBuilder { } if (lPDG == -1010010030 && lMCTrack0.pdgCode() == 211 && lMCTrack1.pdgCode() == -2212 && lMCTrack2.pdgCode() == -1000010020) { lLabel = lGlobalIndex; - double antiHypertritonMCMass = RecoDecay::m(array{array{lMCTrack0.px(), lMCTrack0.py(), lMCTrack0.pz()}, array{lMCTrack1.px(), lMCTrack1.py(), lMCTrack1.pz()}, array{lMCTrack2.px(), lMCTrack2.py(), lMCTrack2.pz()}}, array{o2::constants::physics::MassPionCharged, o2::constants::physics::MassProton, o2::constants::physics::MassDeuteron}); + double antiHypertritonMCMass = RecoDecay::m(std::array{std::array{lMCTrack0.px(), lMCTrack0.py(), lMCTrack0.pz()}, std::array{lMCTrack1.px(), lMCTrack1.py(), lMCTrack1.pz()}, std::array{lMCTrack2.px(), lMCTrack2.py(), lMCTrack2.pz()}}, std::array{o2::constants::physics::MassPionCharged, o2::constants::physics::MassProton, o2::constants::physics::MassDeuteron}); registry.fill(HIST("hLabelCounter"), 2.5); registry.fill(HIST("hAntiHypertritonMCPt"), lPt); registry.fill(HIST("hAntiHypertritonMCLifetime"), MClifetime); diff --git a/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx b/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx new file mode 100644 index 00000000000..e6d38c83bc9 --- /dev/null +++ b/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx @@ -0,0 +1,318 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \brief Task to produce reduced AO2Ds for use in the hypertriton 3body reconstruction with the decay3bodybuilder.cxx +/// \author Yuanzhe Wang +/// \author Carolina Reetz + +#include +#include +#include +#include +#include +#include + +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/ASoAHelpers.h" +#include "ReconstructionDataFormats/Track.h" +#include "Common/Core/RecoDecay.h" +#include "Common/Core/trackUtilities.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/Centrality.h" +#include "PWGLF/DataModel/pidTOFGeneric.h" +#include "PWGLF/DataModel/Reduced3BodyTables.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/Core/PID/PIDTOF.h" +#include "TableHelper.h" + +#include "EventFiltering/Zorro.h" +#include "EventFiltering/ZorroSummary.h" + +#include "DetectorsBase/GeometryManager.h" +#include "DataFormatsParameters/GRPObject.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "CCDB/BasicCCDBManager.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +using FullTracksExtIU = soa::Join; +using FullTracksExtPIDIU = soa::Join; + +using ColwithEvTimes = o2::soa::Join; +using ColwithEvTimesMultsCents = o2::soa::Join; +using TrackExtIUwithEvTimes = soa::Join; +using TrackExtPIDIUwithEvTimes = soa::Join; + +struct reduced3bodyCreator { + + Produces reducedCollisions; + Produces reducedPVMults; + Produces reducedCentFTOCs; + Produces reducedDecay3Bodys; + Produces reducedFullTracksPIDIU; + + Service ccdb; + Zorro zorro; + OutputObj zorroSummary{"zorroSummary"}; + + o2::aod::pidtofgeneric::TofPidNewCollision bachelorTOFPID; + + std::vector daughterTracks; + + Configurable event_sel8_selection{"event_sel8_selection", true, "event selection count post sel8 cut"}; + Configurable mc_event_selection{"mc_event_selection", true, "mc event selection count post kIsTriggerTVX and kNoTimeFrameBorder"}; + Configurable event_posZ_selection{"event_posZ_selection", true, "event selection count post poZ cut"}; + // CCDB options + Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + // CCDB TOF PID paras + Configurable timestamp{"ccdb-timestamp", -1, "timestamp of the object"}; + Configurable paramFileName{"paramFileName", "", "Path to the parametrization object. If empty the parametrization is not taken from file"}; + Configurable parametrizationPath{"parametrizationPath", "TOF/Calib/Params", "Path of the TOF parametrization on the CCDB or in the file, if the paramFileName is not empty"}; + Configurable passName{"passName", "", "Name of the pass inside of the CCDB parameter collection. If empty, the automatically deceted from metadata (to be implemented!!!)"}; + Configurable timeShiftCCDBPath{"timeShiftCCDBPath", "", "Path of the TOF time shift vs eta. If empty none is taken"}; + Configurable loadResponseFromCCDB{"loadResponseFromCCDB", false, "Flag to load the response from the CCDB"}; + Configurable fatalOnPassNotAvailable{"fatalOnPassNotAvailable", true, "Flag to throw a fatal if the pass is not available in the retrieved CCDB object"}; + // Zorro counting + Configurable cfgSkimmedProcessing{"cfgSkimmedProcessing", false, "Skimmed dataset processing"}; + + int mRunNumber; + o2::pid::tof::TOFResoParamsV2 mRespParamsV2; + + HistogramRegistry registry{"registry", {}}; + + void init(InitContext&) + { + mRunNumber = 0; + zorroSummary.setObject(zorro.getZorroSummary()); + bachelorTOFPID.SetPidType(o2::track::PID::Deuteron); + + ccdb->setURL(ccdburl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setFatalWhenNull(false); + + registry.add("hAllSelEventsVtxZ", "hAllSelEventsVtxZ", HistType::kTH1F, {{500, -15.0f, 15.0f, "PV Z (cm)"}}); + + auto hEventCounter = registry.add("hEventCounter", "hEventCounter", HistType::kTH1F, {{4, 0.0f, 4.0f}}); + hEventCounter->GetXaxis()->SetBinLabel(1, "total"); + hEventCounter->GetXaxis()->SetBinLabel(2, "sel8"); + hEventCounter->GetXaxis()->SetBinLabel(3, "vertexZ"); + hEventCounter->GetXaxis()->SetBinLabel(4, "reduced"); + hEventCounter->LabelsOption("v"); + + auto hEventCounterZorro = registry.add("hEventCounterZorro", "hEventCounterZorro", HistType::kTH1D, {{2, -0.5, 1.5}}); + hEventCounterZorro->GetXaxis()->SetBinLabel(1, "Zorro before evsel"); + hEventCounterZorro->GetXaxis()->SetBinLabel(2, "Zorro after evsel"); + } + + void initCCDB(aod::BCsWithTimestamps::iterator const& bc) + { + // In case override, don't proceed, please - no CCDB access required + if (mRunNumber == bc.runNumber()) { + return; + } + + mRunNumber = bc.runNumber(); + if (cfgSkimmedProcessing) { + zorro.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), "fH3L3Body"); + zorro.populateHistRegistry(registry, bc.runNumber()); + } + + // Initial TOF PID Paras, copied from PIDTOF.h + timestamp.value = bc.timestamp(); + ccdb->setTimestamp(timestamp.value); + // Not later than now objects + ccdb->setCreatedNotAfter(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); + // TODO: implement the automatic pass name detection from metadata + if (passName.value == "") { + passName.value = "unanchored"; // temporary default + LOG(warning) << "Passed autodetect mode for pass, not implemented yet, waiting for metadata. Taking '" << passName.value << "'"; + } + LOG(info) << "Using parameter collection, starting from pass '" << passName.value << "'"; + + const std::string fname = paramFileName.value; + if (!fname.empty()) { // Loading the parametrization from file + LOG(info) << "Loading exp. sigma parametrization from file " << fname << ", using param: " << parametrizationPath.value; + if (1) { + o2::tof::ParameterCollection paramCollection; + paramCollection.loadParamFromFile(fname, parametrizationPath.value); + LOG(info) << "+++ Loaded parameter collection from file +++"; + if (!paramCollection.retrieveParameters(mRespParamsV2, passName.value)) { + if (fatalOnPassNotAvailable) { + LOGF(fatal, "Pass '%s' not available in the retrieved CCDB object", passName.value.data()); + } else { + LOGF(warning, "Pass '%s' not available in the retrieved CCDB object", passName.value.data()); + } + } else { + mRespParamsV2.setShiftParameters(paramCollection.getPars(passName.value)); + mRespParamsV2.printShiftParameters(); + } + } else { + mRespParamsV2.loadParamFromFile(fname.data(), parametrizationPath.value); + } + } else if (loadResponseFromCCDB) { // Loading it from CCDB + LOG(info) << "Loading exp. sigma parametrization from CCDB, using path: " << parametrizationPath.value << " for timestamp " << timestamp.value; + o2::tof::ParameterCollection* paramCollection = ccdb->getForTimeStamp(parametrizationPath.value, timestamp.value); + paramCollection->print(); + if (!paramCollection->retrieveParameters(mRespParamsV2, passName.value)) { // Attempt at loading the parameters with the pass defined + if (fatalOnPassNotAvailable) { + LOGF(fatal, "Pass '%s' not available in the retrieved CCDB object", passName.value.data()); + } else { + LOGF(warning, "Pass '%s' not available in the retrieved CCDB object", passName.value.data()); + } + } else { // Pass is available, load non standard parameters + mRespParamsV2.setShiftParameters(paramCollection->getPars(passName.value)); + mRespParamsV2.printShiftParameters(); + } + } + mRespParamsV2.print(); + if (timeShiftCCDBPath.value != "") { + if (timeShiftCCDBPath.value.find(".root") != std::string::npos) { + mRespParamsV2.setTimeShiftParameters(timeShiftCCDBPath.value, "gmean_Pos", true); + mRespParamsV2.setTimeShiftParameters(timeShiftCCDBPath.value, "gmean_Neg", false); + } else { + mRespParamsV2.setTimeShiftParameters(ccdb->getForTimeStamp(Form("%s/pos", timeShiftCCDBPath.value.c_str()), timestamp.value), true); + mRespParamsV2.setTimeShiftParameters(ccdb->getForTimeStamp(Form("%s/neg", timeShiftCCDBPath.value.c_str()), timestamp.value), false); + } + } + + bachelorTOFPID.SetParams(mRespParamsV2); + } + + void process(ColwithEvTimesMultsCents const& collisions, TrackExtPIDIUwithEvTimes const&, aod::Decay3Bodys const& decay3bodys, aod::BCsWithTimestamps const&) + { + + int lastCollisionID = -1; // collisionId of last analysed decay3body. Table is sorted. + + // Event counting + for (const auto& collision : collisions) { + // Zorro event counting + bool isZorroSelected = false; + if (cfgSkimmedProcessing) { + isZorroSelected = zorro.isSelected(collision.bc_as().globalBC()); + if (isZorroSelected) { + registry.fill(HIST("hEventCounterZorro"), 0.5); + } + } + + // Event selection + registry.fill(HIST("hEventCounter"), 0.5); + if (event_sel8_selection && !collision.sel8()) { + continue; + } + registry.fill(HIST("hEventCounter"), 1.5); + if (event_posZ_selection && (collision.posZ() >= 10.0f || collision.posZ() <= -10.0f)) { // 10cm + continue; + } + registry.fill(HIST("hEventCounter"), 2.5); + registry.fill(HIST("hAllSelEventsVtxZ"), collision.posZ()); + + if (cfgSkimmedProcessing && isZorroSelected) { + registry.fill(HIST("hEventCounterZorro"), 1.5); + } + } + + // Creat reduced table + for (const auto& d3body : decay3bodys) { + + daughterTracks.clear(); + + auto collision = d3body.template collision_as(); + + if (event_sel8_selection && !collision.sel8()) { + continue; + } + if (event_posZ_selection && (collision.posZ() >= 10.0f || collision.posZ() <= -10.0f)) { // 10cm + continue; + } + + auto bc = collision.bc_as(); + initCCDB(bc); + + // Save the collision + if (collision.globalIndex() != lastCollisionID) { + int runNumber = bc.runNumber(); + reducedCollisions( + collision.bcId(), + collision.posX(), collision.posY(), collision.posZ(), + collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ(), + collision.flags(), collision.chi2(), collision.numContrib(), + collision.collisionTime(), collision.collisionTimeRes(), + runNumber); + reducedPVMults(collision.multNTracksPV()); + reducedCentFTOCs(collision.centFT0C()); + + lastCollisionID = collision.globalIndex(); + } + + // Save daughter tracks + const auto daughter0 = d3body.template track0_as(); + const auto daughter1 = d3body.template track1_as(); + const auto daughter2 = d3body.template track2_as(); + + // TOF PID of bachelor must be calcualted here + // ---------------------------------------------- + auto originalcol = daughter2.template collision_as(); + double tofNSigmaBach = bachelorTOFPID.GetTOFNSigma(daughter2, originalcol, collision); + // ---------------------------------------------- + + // save reduced track table with decay3body daughters + daughterTracks.push_back(daughter0); + daughterTracks.push_back(daughter1); + daughterTracks.push_back(daughter2); + for (int i = 0; i < 3; i++) { + double tofNSigmaTrack = (i == 2) ? tofNSigmaBach : -999.; + reducedFullTracksPIDIU( + // TrackIU + // reducedTrackID + i, + reducedCollisions.lastIndex(), + daughterTracks[i].x(), daughterTracks[i].alpha(), + daughterTracks[i].y(), daughterTracks[i].z(), daughterTracks[i].snp(), daughterTracks[i].tgl(), + daughterTracks[i].signed1Pt(), + // TracksCovIU + daughterTracks[i].sigmaY(), daughterTracks[i].sigmaZ(), daughterTracks[i].sigmaSnp(), daughterTracks[i].sigmaTgl(), daughterTracks[i].sigma1Pt(), + daughterTracks[i].rhoZY(), daughterTracks[i].rhoSnpY(), daughterTracks[i].rhoSnpZ(), daughterTracks[i].rhoTglY(), daughterTracks[i].rhoTglZ(), + daughterTracks[i].rhoTglSnp(), daughterTracks[i].rho1PtY(), daughterTracks[i].rho1PtZ(), daughterTracks[i].rho1PtSnp(), daughterTracks[i].rho1PtTgl(), + // TracksExtra + daughterTracks[i].tpcInnerParam(), daughterTracks[i].flags(), daughterTracks[i].itsClusterSizes(), + daughterTracks[i].tpcNClsFindable(), daughterTracks[i].tpcNClsFindableMinusFound(), daughterTracks[i].tpcNClsFindableMinusCrossedRows(), + daughterTracks[i].trdPattern(), daughterTracks[i].tpcChi2NCl(), daughterTracks[i].tofChi2(), + daughterTracks[i].tpcSignal(), daughterTracks[i].tofExpMom(), + // PID + daughterTracks[i].tpcNSigmaPr(), daughterTracks[i].tpcNSigmaPi(), daughterTracks[i].tpcNSigmaDe(), + tofNSigmaTrack); + } + + // save reduced decay3body table + reducedDecay3Bodys(reducedCollisions.lastIndex(), reducedFullTracksPIDIU.lastIndex() - 2, reducedFullTracksPIDIU.lastIndex() - 1, reducedFullTracksPIDIU.lastIndex()); + } + + registry.fill(HIST("hEventCounter"), 3.5, reducedCollisions.lastIndex() + 1); + } +}; + +struct reduced3bodyInitializer { + Spawns reducedTracksIU; + void init(InitContext const&) {} +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc), + }; +} From ff3543d6a7c6e3ad75fd9da0988fa416dc47003a Mon Sep 17 00:00:00 2001 From: Junlee Kim Date: Sun, 16 Feb 2025 11:12:31 +0100 Subject: [PATCH 0248/1650] [PWGLF] initial commit for heptaquark search (#9915) Co-authored-by: ALICE Action Bot --- PWGLF/DataModel/ReducedHeptaQuarkTables.h | 91 ++++ PWGLF/TableProducer/Resonances/CMakeLists.txt | 5 + .../Resonances/HeptaQuarktable.cxx | 401 ++++++++++++++++++ 3 files changed, 497 insertions(+) create mode 100644 PWGLF/DataModel/ReducedHeptaQuarkTables.h create mode 100644 PWGLF/TableProducer/Resonances/HeptaQuarktable.cxx diff --git a/PWGLF/DataModel/ReducedHeptaQuarkTables.h b/PWGLF/DataModel/ReducedHeptaQuarkTables.h new file mode 100644 index 00000000000..54ad99884da --- /dev/null +++ b/PWGLF/DataModel/ReducedHeptaQuarkTables.h @@ -0,0 +1,91 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// +/// \author Junlee Kim + +#ifndef PWGLF_DATAMODEL_REDUCEDHEPTAQUARKTABLES_H_ +#define PWGLF_DATAMODEL_REDUCEDHEPTAQUARKTABLES_H_ + +#include + +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/Core/RecoDecay.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/ASoA.h" + +namespace o2::aod +{ +namespace redhqevent +{ +DECLARE_SOA_COLUMN(NumPhi, numPhi, int); //! Number of negative K +DECLARE_SOA_COLUMN(NumLambda, numLambda, int); //! Number of lambda +} // namespace redhqevent +DECLARE_SOA_TABLE(RedHQEvents, "AOD", "REDHQEVENT", + o2::soa::Index<>, + bc::GlobalBC, + bc::RunNumber, + timestamp::Timestamp, + collision::PosZ, + collision::NumContrib, + redhqevent::NumPhi, + redhqevent::NumLambda); +using RedHQEvent = RedHQEvents::iterator; + +namespace hqtrack +{ +DECLARE_SOA_INDEX_COLUMN(RedHQEvent, redHQEvent); +DECLARE_SOA_COLUMN(HQId, hqId, int); //! HQ ID +DECLARE_SOA_COLUMN(HQPx, hqPx, float); //! HQ Px +DECLARE_SOA_COLUMN(HQPy, hqPy, float); //! HQ Py +DECLARE_SOA_COLUMN(HQPz, hqPz, float); //! HQ Pz +DECLARE_SOA_COLUMN(HQd1Px, hqd1Px, float); //! HQ d1 Px +DECLARE_SOA_COLUMN(HQd1Py, hqd1Py, float); //! HQ d1 Py +DECLARE_SOA_COLUMN(HQd1Pz, hqd1Pz, float); //! HQ d1 Pz +DECLARE_SOA_COLUMN(HQd2Px, hqd2Px, float); //! HQ d2 Px +DECLARE_SOA_COLUMN(HQd2Py, hqd2Py, float); //! HQ d2 Py +DECLARE_SOA_COLUMN(HQd2Pz, hqd2Pz, float); //! HQ d2 Pz +DECLARE_SOA_COLUMN(HQMass, hqMass, float); //! HQ Mass +DECLARE_SOA_COLUMN(HQd1Index, hqd1Index, int64_t); //! HQ d1 index +DECLARE_SOA_COLUMN(HQd2Index, hqd2Index, int64_t); //! HQ d2 index +DECLARE_SOA_COLUMN(HQd1Charge, hqd1Charge, float); //! HQ d1 charge +DECLARE_SOA_COLUMN(HQd2Charge, hqd2Charge, float); //! HQ d1 charge +DECLARE_SOA_COLUMN(HQd1TPC, hqd1TPC, float); //! TPC nsigma d1 +DECLARE_SOA_COLUMN(HQd2TPC, hqd2TPC, float); //! TPC nsigma d2 + +} // namespace hqtrack +DECLARE_SOA_TABLE(HQTracks, "AOD", "HQTRACK", + o2::soa::Index<>, + hqtrack::RedHQEventId, + hqtrack::HQId, + hqtrack::HQPx, + hqtrack::HQPy, + hqtrack::HQPz, + hqtrack::HQd1Px, + hqtrack::HQd1Py, + hqtrack::HQd1Pz, + hqtrack::HQd2Px, + hqtrack::HQd2Py, + hqtrack::HQd2Pz, + hqtrack::HQMass, + hqtrack::HQd1Index, + hqtrack::HQd2Index, + hqtrack::HQd1Charge, + hqtrack::HQd2Charge, + hqtrack::HQd1TPC, + hqtrack::HQd2TPC); + +using HQTrack = HQTracks::iterator; +} // namespace o2::aod +#endif // PWGLF_DATAMODEL_REDUCEDHEPTAQUARKTABLES_H_ diff --git a/PWGLF/TableProducer/Resonances/CMakeLists.txt b/PWGLF/TableProducer/Resonances/CMakeLists.txt index 236ac38e2d9..a914e69a3f7 100644 --- a/PWGLF/TableProducer/Resonances/CMakeLists.txt +++ b/PWGLF/TableProducer/Resonances/CMakeLists.txt @@ -44,3 +44,8 @@ o2physics_add_dpl_workflow(reso2mergedf SOURCES LFResonanceMergeDF.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DetectorsBase COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(heptaquarktable + SOURCES HeptaQuarktable.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DetectorsVertexing + COMPONENT_NAME Analysis) diff --git a/PWGLF/TableProducer/Resonances/HeptaQuarktable.cxx b/PWGLF/TableProducer/Resonances/HeptaQuarktable.cxx new file mode 100644 index 00000000000..91d5fce5081 --- /dev/null +++ b/PWGLF/TableProducer/Resonances/HeptaQuarktable.cxx @@ -0,0 +1,401 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file heptaquarktable.cxx +/// \brief Selection of events with triplets and pairs for femtoscopic studies +/// +/// \author Junlee Kim, (junlee.kim@cern.ch) + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "EventFiltering/Zorro.h" +#include "EventFiltering/ZorroSummary.h" + +#include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/runDataProcessing.h" + +#include "CommonConstants/MathConstants.h" +#include "Common/Core/TrackSelection.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/PIDResponseITS.h" + +#include "CCDB/BasicCCDBManager.h" +#include "CCDB/CcdbApi.h" + +#include "PWGLF/DataModel/ReducedHeptaQuarkTables.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +struct heptaquarktable { + + // Produce derived tables + Produces redHQEvents; + Produces hqTrack; + + // events + Configurable cfgCutVertex{"cfgCutVertex", 10.0f, "Accepted z-vertex range"}; + + Configurable cfgUseGlobalTrack{"cfgUseGlobalTrack", true, "use Global track"}; + Configurable cfgCutCharge{"cfgCutCharge", 0.0, "cut on Charge"}; + Configurable cfgCutPt{"cfgCutPt", 0.2, "PT cut on daughter track"}; + Configurable cfgCutEta{"cfgCutEta", 0.8, "Eta cut on daughter track"}; + Configurable cfgCutDCAxy{"cfgCutDCAxy", 2.0f, "DCAxy range for tracks"}; + Configurable cfgCutDCAz{"cfgCutDCAz", 2.0f, "DCAz range for tracks"}; + Configurable cfgNsigmaTPCKa{"cfgNsigmaTPCKa", 3.0, "Value of the TPC Nsigma cut for kaon"}; + Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; + Configurable cfgTPCcluster{"cfgTPCcluster", 70, "Number of TPC cluster"}; + + Configurable cfgMinPhiMass{"cfgMinPhiMass", 1.01, "Minimum phi mass"}; + Configurable cfgMaxPhiMass{"cfgMaxPhiMass", 1.03, "Maximum phi mass"}; + Configurable cfgDeepAngleFlag{"cfgDeepAngleFlag", true, "Deep Angle cut"}; + Configurable cfgDeepAngle{"cfgDeepAngle", 0.04, "Deep Angle cut value"}; + + Configurable cfgv0radiusMin{"cfgv0radiusMin", 1.2, "minimum decay radius"}; + Configurable cfgDCAPosToPVMin{"cfgDCAPosToPVMin", 0.05, "minimum DCA to PV for positive track"}; + Configurable cfgDCANegToPVMin{"cfgDCANegToPVMin", 0.2, "minimum DCA to PV for negative track"}; + Configurable cfgv0CosPA{"cfgv0CosPA", 0.995, "minimum v0 cosine"}; + Configurable cfgDCAV0Dau{"cfgDCAV0Dau", 1.0, "maximum DCA between daughters"}; + + Configurable cfgV0PtMin{"cfgV0PtMin", 0, "minimum pT for lambda"}; + Configurable cfgV0EtaMin{"cfgV0EtaMin", -0.5, "maximum rapidity"}; + Configurable cfgV0EtaMax{"cfgV0EtaMax", 0.5, "maximum rapidity"}; + Configurable cfgV0LifeTime{"cfgV0LifeTime", 30., "maximum lambda lifetime"}; + + Configurable cfgDaughTPCnclsMin{"cfgDaughTPCnclsMin", 70, "minimum fired crossed rows"}; + Configurable cfgDaughPIDCutsTPCPr{"cfgDaughPIDCutsTPCPr", 3, "proton nsigma for TPC"}; + Configurable cfgDaughPIDCutsTPCPi{"cfgDaughPIDCutsTPCPi", 3, "pion nsigma for TPC"}; + Configurable cfgDaughEtaMin{"cfgDaughEtaMin", -0.8, "minimum daughter eta"}; + Configurable cfgDaughEtaMax{"cfgDaughEtaMax", 0.8, "maximum daughter eta"}; + Configurable cfgDaughPrPt{"cfgDaughPrPt", 0.5, "minimum daughter proton pt"}; + Configurable cfgDaughPiPt{"cfgDaughPiPt", 0.5, "minimum daughter pion pt"}; + + Configurable cfgMinLambdaMass{"cfgMinLambdaMass", 1.105, "Minimum lambda mass"}; + Configurable cfgMaxLambdaMass{"cfgMaxLambdaMass", 1.125, "Maximum lambda mass"}; + + ConfigurableAxis massAxis{"massAxis", {200, 3.0, 3.4}, "Invariant mass axis"}; + ConfigurableAxis ptAxis{"ptAxis", {VARIABLE_WIDTH, 0.2, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 6.5, 8.0, 10.0, 100.0}, "Transverse momentum bins"}; + ConfigurableAxis centAxis{"centAxis", {VARIABLE_WIDTH, 0, 20, 50, 100}, "Centrality interval"}; + ConfigurableAxis vertexAxis{"vertexAxis", {10, -10, 10}, "vertex axis for mixing"}; + + Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; + Filter acceptanceFilter = (nabs(aod::track::eta) < cfgCutEta && nabs(aod::track::pt) > cfgCutPt); + Filter DCAcutFilter = (nabs(aod::track::dcaXY) < cfgCutDCAxy) && (nabs(aod::track::dcaZ) < cfgCutDCAz); + + using EventCandidates = soa::Filtered>; + using TrackCandidates = soa::Filtered>; + + HistogramRegistry histos{ + "histos", + {}, + OutputObjHandlingPolicy::AnalysisObject}; + + SliceCache cache; + Partition posTracks = aod::track::signed1Pt > cfgCutCharge; + Partition negTracks = aod::track::signed1Pt < cfgCutCharge; + + double massLambda = o2::constants::physics::MassLambda; + double massPr = o2::constants::physics::MassProton; + double massPi = o2::constants::physics::MassPionCharged; + double massKa = o2::constants::physics::MassKPlus; + + void init(o2::framework::InitContext&) + { + histos.add("hEventstat", "", {HistType::kTH1F, {{2, 0, 2}}}); + } + + template + bool selectionTrack(const T& candidate) + { + if (cfgUseGlobalTrack && !(candidate.isGlobalTrack() && candidate.isPVContributor() && candidate.itsNCls() > cfgITScluster && candidate.tpcNClsFound() > cfgTPCcluster)) { + return false; + } + return true; + } + + template + bool selectionPID(const T& candidate, int pid) + { + if (pid == 0) { + if (std::abs(candidate.tpcNSigmaPi()) > cfgDaughPIDCutsTPCPi) { + return false; + } + } else if (pid == 1) { + if (std::abs(candidate.tpcNSigmaKa()) > cfgNsigmaTPCKa) { + return false; + } + } else if (pid == 2) { + if (std::abs(candidate.tpcNSigmaPr()) > cfgDaughPIDCutsTPCPr) { + return false; + } + } + return true; + } + + template + bool selectionPair(const T1& candidate1, const T2& candidate2) + { + double pt1, pt2, pz1, pz2, p1, p2, angle; + pt1 = candidate1.pt(); + pt2 = candidate2.pt(); + pz1 = candidate1.pz(); + pz2 = candidate2.pz(); + p1 = candidate1.p(); + p2 = candidate2.p(); + angle = TMath::ACos((pt1 * pt2 + pz1 * pz2) / (p1 * p2)); + if (cfgDeepAngleFlag && angle < cfgDeepAngle) { + return false; + } + return true; + } + + template + bool selectionV0(TCollision const& collision, V0 const& candidate) + { + if (candidate.v0radius() < cfgv0radiusMin) + return false; + if (std::abs(candidate.dcapostopv()) < cfgDCAPosToPVMin) + return false; + if (std::abs(candidate.dcanegtopv()) < cfgDCANegToPVMin) + return false; + if (candidate.v0cosPA() < cfgv0CosPA) + return false; + if (std::abs(candidate.dcaV0daughters()) > cfgDCAV0Dau) + return false; + if (candidate.pt() < cfgV0PtMin) + return false; + if (candidate.yLambda() < cfgV0EtaMin) + return false; + if (candidate.yLambda() > cfgV0EtaMax) + return false; + if (candidate.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * massLambda > cfgV0LifeTime) + return false; + + return true; + } + + template + bool selectionV0Daughter(T const& track, int pid) // pid 0: proton, pid 1: pion + { + if (track.tpcNClsFound() < cfgDaughTPCnclsMin) + return false; + if (pid == 0 && std::abs(track.tpcNSigmaPr()) > cfgDaughPIDCutsTPCPr) + return false; + if (pid == 1 && std::abs(track.tpcNSigmaPi()) > cfgDaughPIDCutsTPCPi) + return false; + if (track.eta() > cfgDaughEtaMax) + return false; + if (track.eta() < cfgDaughEtaMin) + return false; + if (pid == 0 && track.pt() < cfgDaughPrPt) + return false; + if (pid == 1 && track.pt() < cfgDaughPiPt) + return false; + + return true; + } + + ROOT::Math::PxPyPzMVector DauVec1, DauVec2, HQMesonMother, HQVectorDummy, HQd1dummy, HQd2dummy; + + void processHQReducedTable(EventCandidates::iterator const& collision, TrackCandidates const& /*tracks*/, aod::V0Datas const& V0s, aod::BCsWithTimestamps const&) + { + o2::aod::ITSResponse itsResponse; + bool keepEventDoubleHQ = false; + int numberPhi = 0; + int numberLambda = 0; + auto currentRunNumber = collision.bc_as().runNumber(); + auto bc = collision.bc_as(); + + std::vector HQId = {}; + + std::vector HQd1Index = {}; + std::vector HQd2Index = {}; + + std::vector HQd1Charge = {}; + std::vector HQd2Charge = {}; + + std::vector HQd1TPC = {}; + std::vector HQd2TPC = {}; + + std::vector hqresonance, hqresonanced1, hqresonanced2; + + if (!(collision.sel8() && collision.selection_bit(aod::evsel::kNoTimeFrameBorder) && collision.selection_bit(aod::evsel::kNoITSROFrameBorder) && collision.selection_bit(aod::evsel::kNoSameBunchPileup) && collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) + return; + + auto posThisColl = posTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + auto negThisColl = negTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + for (auto track1 : posThisColl) { + if (!selectionTrack(track1)) + continue; + + if (!selectionPID(track1, 1)) + continue; + + if (!(itsResponse.nSigmaITS(track1) > -3.0 && itsResponse.nSigmaITS(track1) < 3.0)) + continue; + + /* + qaRegistry.fill(HIST("hNsigmaPtkaonTPC"), track1.tpcNSigmaKa(), track1.pt()); + if (track1.hasTOF()) { + qaRegistry.fill(HIST("hNsigmaPtkaonTOF"), track1.tofNSigmaKa(), track1.pt()); + } + */ + auto track1ID = track1.globalIndex(); + for (auto track2 : negThisColl) { + if (!selectionTrack(track2)) + continue; + + if (!selectionPID(track2, 1)) + continue; + + if (!(itsResponse.nSigmaITS(track2) > -3.0 && itsResponse.nSigmaITS(track2) < 3.0)) + continue; + + auto track2ID = track2.globalIndex(); + if (track2ID == track1ID) + continue; + + if (!selectionPair(track1, track2)) + continue; + + DauVec1 = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); + DauVec2 = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massKa); + HQMesonMother = DauVec1 + DauVec2; + if (!(HQMesonMother.M() > cfgMinPhiMass && HQMesonMother.M() < cfgMaxPhiMass)) + continue; + + numberPhi++; + ROOT::Math::PtEtaPhiMVector temp1(track1.pt(), track1.eta(), track1.phi(), massKa); + ROOT::Math::PtEtaPhiMVector temp2(track2.pt(), track2.eta(), track2.phi(), massKa); + ROOT::Math::PtEtaPhiMVector temp3(HQMesonMother.pt(), HQMesonMother.eta(), HQMesonMother.phi(), HQMesonMother.M()); + + hqresonanced1.push_back(temp1); + hqresonanced2.push_back(temp2); + hqresonance.push_back(temp3); + + HQId.push_back(333); + + HQd1Index.push_back(track1.globalIndex()); + HQd2Index.push_back(track2.globalIndex()); + + HQd1Charge.push_back(track1.sign()); + HQd2Charge.push_back(track2.sign()); + + HQd1TPC.push_back(track1.tpcNSigmaKa()); + HQd2TPC.push_back(track2.tpcNSigmaKa()); + } + } + for (auto& v0 : V0s) { + auto postrack_v0 = v0.template posTrack_as(); + auto negtrack_v0 = v0.template negTrack_as(); + + int LambdaTag = 0; + int aLambdaTag = 0; + + if (selectionV0Daughter(postrack_v0, 0) && selectionV0Daughter(negtrack_v0, 1)) + LambdaTag = 1; + + if (selectionV0Daughter(negtrack_v0, 0) && selectionV0Daughter(postrack_v0, 1)) + aLambdaTag = 1; + + if (LambdaTag == aLambdaTag) + continue; + + if (!selectionV0(collision, v0)) + continue; + + if (LambdaTag) { + if (v0.mLambda() < cfgMinLambdaMass || v0.mLambda() > cfgMaxLambdaMass) { + continue; + } + DauVec1 = ROOT::Math::PxPyPzMVector(v0.pxpos(), v0.pypos(), v0.pzpos(), massPr); + DauVec2 = ROOT::Math::PxPyPzMVector(v0.pxneg(), v0.pyneg(), v0.pzneg(), massPi); + + HQId.push_back(3122); + } else if (aLambdaTag) { + if (v0.mAntiLambda() < cfgMinLambdaMass || v0.mAntiLambda() > cfgMaxLambdaMass) { + continue; + } + DauVec1 = ROOT::Math::PxPyPzMVector(v0.pxpos(), v0.pypos(), v0.pzpos(), massPi); + DauVec2 = ROOT::Math::PxPyPzMVector(v0.pxneg(), v0.pyneg(), v0.pzneg(), massPr); + HQId.push_back(-3122); + } + numberLambda++; + + HQMesonMother = DauVec1 + DauVec2; + + ROOT::Math::PtEtaPhiMVector temp1(DauVec1.Pt(), DauVec1.Eta(), DauVec1.Phi(), DauVec1.M()); + ROOT::Math::PtEtaPhiMVector temp2(DauVec2.Pt(), DauVec2.Eta(), DauVec2.Phi(), DauVec2.M()); + ROOT::Math::PtEtaPhiMVector temp3(HQMesonMother.Pt(), HQMesonMother.Eta(), HQMesonMother.Phi(), HQMesonMother.M()); + + hqresonanced1.push_back(temp1); + hqresonanced2.push_back(temp2); + hqresonance.push_back(temp3); + + HQd1Index.push_back(postrack_v0.globalIndex()); + HQd2Index.push_back(negtrack_v0.globalIndex()); + + HQd1Charge.push_back(postrack_v0.sign()); + HQd2Charge.push_back(negtrack_v0.sign()); + + HQd1TPC.push_back(postrack_v0.tpcNSigmaKa()); + HQd2TPC.push_back(negtrack_v0.tpcNSigmaKa()); + } // select collision + if (numberPhi < 2 || numberLambda < 1) + return; + + keepEventDoubleHQ = true; + + histos.fill(HIST("hEventstat"), 0.5); + if (keepEventDoubleHQ && numberPhi > 1 && numberLambda > 0 && (hqresonance.size() == hqresonanced1.size()) && (hqresonance.size() == hqresonanced2.size())) { + histos.fill(HIST("hEventstat"), 1.5); + /////////// Fill collision table/////////////// + redHQEvents(bc.globalBC(), currentRunNumber, bc.timestamp(), collision.posZ(), collision.numContrib(), numberPhi, numberLambda); + auto indexEvent = redHQEvents.lastIndex(); + //// Fill track table for HQ////////////////// + for (auto if1 = hqresonance.begin(); if1 != hqresonance.end(); ++if1) { + auto i5 = std::distance(hqresonance.begin(), if1); + HQVectorDummy = hqresonance.at(i5); + HQd1dummy = hqresonanced1.at(i5); + HQd2dummy = hqresonanced2.at(i5); + hqTrack(indexEvent, HQId.at(i5), HQVectorDummy.Px(), HQVectorDummy.Py(), HQVectorDummy.Pz(), + HQd1dummy.Px(), HQd1dummy.Py(), HQd1dummy.Pz(), HQd2dummy.Px(), HQd2dummy.Py(), HQd2dummy.Pz(), + HQVectorDummy.M(), + HQd1Index.at(i5), HQd2Index.at(i5), + HQd1Charge.at(i5), HQd2Charge.at(i5), + HQd1TPC.at(i5), HQd2TPC.at(i5)); + } + } + } // process + PROCESS_SWITCH(heptaquarktable, processHQReducedTable, "Process table creation for double hq", true); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfg) +{ + return WorkflowSpec{adaptAnalysisTask(cfg)}; +} From 79bd3c47ef3d0f6400c225f58416a43e6d12847b Mon Sep 17 00:00:00 2001 From: nepeivodaRS <94179174+nepeivodaRS@users.noreply.github.com> Date: Sun, 16 Feb 2025 11:13:19 +0100 Subject: [PATCH 0249/1650] [PWGLF] MC process functions + dcaXY selection (#9896) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Strangeness/CMakeLists.txt | 4 +- .../Tasks/Strangeness/derivedupcanalysis.cxx | 1856 +++++++++++++++++ .../Tasks/Strangeness/strange-yield-pbpb.cxx | 1572 -------------- PWGLF/Utils/strangenessMasks.h | 52 +- 4 files changed, 1885 insertions(+), 1599 deletions(-) create mode 100644 PWGLF/Tasks/Strangeness/derivedupcanalysis.cxx delete mode 100644 PWGLF/Tasks/Strangeness/strange-yield-pbpb.cxx diff --git a/PWGLF/Tasks/Strangeness/CMakeLists.txt b/PWGLF/Tasks/Strangeness/CMakeLists.txt index 8979a86ff5e..cb9eab4fb0f 100644 --- a/PWGLF/Tasks/Strangeness/CMakeLists.txt +++ b/PWGLF/Tasks/Strangeness/CMakeLists.txt @@ -119,8 +119,8 @@ o2physics_add_dpl_workflow(v0ptinvmassplots PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(strange-yield-pbpb - SOURCES strange-yield-pbpb.cxx +o2physics_add_dpl_workflow(derivedupcanalysis + SOURCES derivedupcanalysis.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) diff --git a/PWGLF/Tasks/Strangeness/derivedupcanalysis.cxx b/PWGLF/Tasks/Strangeness/derivedupcanalysis.cxx new file mode 100644 index 00000000000..820be5aa408 --- /dev/null +++ b/PWGLF/Tasks/Strangeness/derivedupcanalysis.cxx @@ -0,0 +1,1856 @@ +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +// +/// \file derivedupcanalysis.cxx +/// \brief Analysis of strangeness production in UPC collisions +/// \author Roman Nepeivoda (roman.nepeivoda@cern.ch) + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/O2DatabasePDGPlugin.h" +#include "ReconstructionDataFormats/Track.h" +#include "Common/Core/RecoDecay.h" +#include "Common/Core/trackUtilities.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" +#include "PWGLF/DataModel/LFStrangenessPIDTables.h" +#include "Common/Core/TrackSelection.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/PIDResponse.h" +#include "Framework/StaticFor.h" +#include "PWGUD/Core/SGSelector.h" +#include "PWGLF/Utils/strangenessMasks.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using std::array; + +using DauTracks = soa::Join; +using DauMCTracks = soa::Join; + +using V0Candidates = soa::Join; +using V0CandidatesMC = soa::Join; + +using CascadeCandidates = soa::Join; +using CascadeCandidatesMC = soa::Join; + +using CascMCCoresFull = soa::Join; + +using StraCollisonFull = soa::Join::iterator; +using StraCollisonFullMC = soa::Join::iterator; + +using StraCollisonsFullMC = soa::Join; + +using StraMCCollisionsFull = soa::Join; +using V0MCCoresFull = soa::Join; + +struct Derivedupcanalysis { + HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + + // master analysis switches + Configurable analyseK0Short{"analyseK0Short", true, "process K0Short-like candidates"}; + Configurable analyseLambda{"analyseLambda", true, "process Lambda-like candidates"}; + Configurable analyseAntiLambda{"analyseAntiLambda", true, "process AntiLambda-like candidates"}; + Configurable analyseXi{"analyseXi", true, "process Xi-like candidates"}; + Configurable analyseAntiXi{"analyseAntiXi", true, "process AntiXi-like candidates"}; + Configurable analyseOmega{"analyseOmega", true, "process Omega-like candidates"}; + Configurable analyseAntiOmega{"analyseAntiOmega", true, "process AntiOmega-like candidates"}; + + // Event selections + Configurable rejectITSROFBorder{"rejectITSROFBorder", true, "reject events at ITS ROF border"}; + Configurable rejectTFBorder{"rejectTFBorder", true, "reject events at TF border"}; + Configurable rejectSameBunchPileup{"rejectSameBunchPileup", true, "reject collisions in case of pileup with another collision in the same foundBC"}; + Configurable requireIsTriggerTVX{"requireIsTriggerTVX", false, "require coincidence in FT0A and FT0C"}; + Configurable requireIsVertexITSTPC{"requireIsVertexITSTPC", false, "require events with at least one ITS-TPC track"}; + Configurable requireIsGoodZvtxFT0VsPV{"requireIsGoodZvtxFT0VsPV", false, "require events with PV position along z consistent (within 1 cm) between PV reconstructed using tracks and PV using FT0 A-C time difference"}; + Configurable requireIsVertexTOFmatched{"requireIsVertexTOFmatched", false, "require events with at least one of vertex contributors matched to TOF"}; + Configurable requireIsVertexTRDmatched{"requireIsVertexTRDmatched", false, "require events with at least one of vertex contributors matched to TRD"}; + Configurable requireNoCollInTimeRangeStd{"requireNoCollInTimeRangeStd", false, "reject collisions corrupted by the cannibalism, with other collisions within +/- 10 microseconds"}; + Configurable requireNoCollInTimeRangeNarrow{"requireNoCollInTimeRangeNarrow", true, "reject collisions corrupted by the cannibalism, with other collisions within +/- 10 microseconds"}; + Configurable studyUPConly{"studyUPConly", true, "is UPC-only analysis"}; + Configurable useUPCflag{"useUPCflag", false, "select UPC flagged events"}; + + Configurable verbose{"verbose", false, "additional printouts"}; + + // Acceptance selections + Configurable rapidityCut{"rapidityCut", 0.5, "rapidity"}; + Configurable daughterEtaCut{"daughterEtaCut", 0.8, "max eta for daughters"}; + + Configurable doDaughterDCA{"doDaughterDCA", true, "dcaXY cut for daughter tracks"}; + + // Standard V0 topological criteria + struct : ConfigurableGroup { + Configurable v0cospa{"v0cospa", 0.97, "min V0 CosPA"}; + Configurable dcav0dau{"dcav0dau", 1.5, "max DCA V0 Daughters (cm)"}; + Configurable dcanegtopv{"dcanegtopv", .05, "min DCA Neg To PV (cm)"}; + Configurable dcapostopv{"dcapostopv", .05, "min DCA Pos To PV (cm)"}; + Configurable v0radius{"v0radius", 1.2, "minimum V0 radius (cm)"}; + Configurable v0radiusMax{"v0radiusMax", 1E5, "maximum V0 radius (cm)"}; + // Additional selection on the AP plot (exclusive for K0Short) + // original equation: lArmPt*5>std::fabs(lArmAlpha) + Configurable armPodCut{"armPodCut", 5.0f, "pT * (cut) > |alpha|, AP cut. Negative: no cut"}; + Configurable v0TypeSelection{"v0TypeSelection", 1, "select on a certain V0 type (leave negative if no selection desired)"}; + } v0cuts; + static constexpr float kLifetimeCutsV0[1][2] = {{30., 20.}}; + Configurable> lifetimecutV0{"lifetimecutV0", {kLifetimeCutsV0[0], 2, {"lifetimecutLambda", "lifetimecutK0S"}}, "lifetimecutV0"}; + + // Standard cascade topological criteria + struct : ConfigurableGroup { + Configurable casccospa{"casccospa", 0.97, "Casc CosPA"}; + Configurable dcacascdau{"dcacascdau", 1.2, "DCA Casc Daughters"}; + Configurable cascradius{"cascradius", 0.6, "minimum cascade radius (cm)"}; + Configurable cascradiusMax{"cascradiusMax", 1E5, "maximum cascade radius (cm)"}; + Configurable bachbaryoncospa{"bachbaryoncospa", 2, "Bachelor baryon CosPA"}; + Configurable bachbaryondcaxytopv{"bachbaryondcaxytopv", -1, "DCA bachelor baryon to PV"}; + Configurable dcamesontopv{"dcamesontopv", 0.1, "DCA of meson doughter track To PV"}; + Configurable dcabaryontopv{"dcabaryontopv", 0.05, "DCA of baryon doughter track To PV"}; + Configurable dcabachtopv{"dcabachtopv", 0.04, "DCA Bach To PV"}; + Configurable dcav0topv{"dcav0topv", 0.06, "DCA V0 To PV"}; + // Cascade specific selections + Configurable masswin{"masswin", 0.05, "mass window limit"}; + Configurable lambdamasswin{"lambdamasswin", 0.005, "V0 Mass window limit"}; + Configurable rejcomp{"rejcomp", 0.008, "competing Cascade rejection"}; + } casccuts; + Configurable doBachelorBaryonCut{"doBachelorBaryonCut", false, "Enable Bachelor-Baryon cut "}; + static constexpr float kNCtauCutsCasc[1][2] = {{6., 6.}}; + Configurable> nCtauCutCasc{"nCtauCutCasc", {kNCtauCutsCasc[0], 2, {"lifetimecutXi", "lifetimecutOmega"}}, "nCtauCutCasc"}; + + // UPC selections + SGSelector sgSelector; + struct : ConfigurableGroup { + Configurable fv0a{"fv0a", 50., "FV0A threshold"}; + Configurable ft0a{"ft0a", 100., "FT0A threshold"}; + Configurable ft0c{"ft0c", 50., "FT0C threshold"}; + Configurable zdc{"zdc", 1., "ZDC threshold"}; + Configurable genGapSide{"genGapSide", 0, "0 -- A, 1 -- C, 2 -- double"}; + } upcCuts; + + // Track quality + struct : ConfigurableGroup { + Configurable minTPCrows{"minTPCrows", 70, "minimum TPC crossed rows"}; + Configurable minITSclusters{"minITSclusters", -1, "minimum ITS clusters"}; + Configurable skipTPConly{"skipTPConly", false, "skip V0s comprised of at least one TPC only prong"}; + Configurable requireBachITSonly{"requireBachITSonly", false, "require that bachelor track is ITSonly (overrides TPC quality)"}; + Configurable requirePosITSonly{"requirePosITSonly", false, "require that positive track is ITSonly (overrides TPC quality)"}; + Configurable requireNegITSonly{"requireNegITSonly", false, "require that negative track is ITSonly (overrides TPC quality)"}; + } TrackConfigurations; + + // PID (TPC/TOF) + struct : ConfigurableGroup { + Configurable tpcPidNsigmaCut{"tpcPidNsigmaCut", 1e+6, "tpcPidNsigmaCut"}; + Configurable tofPidNsigmaCutLaPr{"tofPidNsigmaCutLaPr", 1e+6, "tofPidNsigmaCutLaPr"}; + Configurable tofPidNsigmaCutLaPi{"tofPidNsigmaCutLaPi", 1e+6, "tofPidNsigmaCutLaPi"}; + Configurable tofPidNsigmaCutK0Pi{"tofPidNsigmaCutK0Pi", 1e+6, "tofPidNsigmaCutK0Pi"}; + + Configurable tofPidNsigmaCutXiPi{"tofPidNsigmaCutXiPi", 1e+6, "tofPidNsigmaCutXiPi"}; + Configurable tofPidNsigmaCutOmegaKaon{"tofPidNsigmaCutOmegaKaon", 1e+6, "tofPidNsigmaCutOmegaKaon"}; + + Configurable doTPCQA{"doTPCQA", false, "do TPC QA histograms"}; + Configurable doTOFQA{"doTOFQA", false, "do TOF QA histograms"}; + + // PID (TOF) + Configurable maxDeltaTimeProton{"maxDeltaTimeProton", 1e+9, "check maximum allowed time"}; + Configurable maxDeltaTimePion{"maxDeltaTimePion", 1e+9, "check maximum allowed time"}; + Configurable maxDeltaTimeKaon{"maxDeltaTimeKaon", 1e+9, "check maximum allowed time"}; + } PIDConfigurations; + + Configurable doKienmaticQA{"doKienmaticQA", true, "do Kinematic QA histograms"}; + Configurable doDetectPropQA{"doDetectPropQA", 0, "do Detector/ITS map QA: 0: no, 1: 4D, 2: 5D with mass"}; + Configurable doPlainTopoQA{"doPlainTopoQA", true, "do simple 1D QA of candidates"}; + + struct : ConfigurableGroup { + ConfigurableAxis axisFT0Aampl{"axisFT0Aampl", {100, 0.0f, 2000.0f}, "FT0Aamplitude"}; + ConfigurableAxis axisFT0Campl{"axisFT0Campl", {100, 0.0f, 2000.0f}, "FT0Camplitude"}; + ConfigurableAxis axisFV0Aampl{"axisFV0Aampl", {100, 0.0f, 2000.0f}, "FV0Aamplitude"}; + ConfigurableAxis axisFDDAampl{"axisFDDAampl", {100, 0.0f, 2000.0f}, "FDDAamplitude"}; + ConfigurableAxis axisFDDCampl{"axisFDDCampl", {100, 0.0f, 2000.0f}, "FDDCamplitude"}; + ConfigurableAxis axisZNAampl{"axisZNAampl", {100, 0.0f, 250.0f}, "ZNAamplitude"}; + ConfigurableAxis axisZNCampl{"axisZNCampl", {100, 0.0f, 250.0f}, "ZNCamplitude"}; + } axisDetectors; + + // for MC + Configurable doMCAssociation{"doMCAssociation", true, "if MC, do MC association"}; + Configurable doTreatPiToMuon{"doTreatPiToMuon", false, "Take pi decay into muon into account in MC"}; + + // fast check on occupancy + Configurable minOccupancy{"minOccupancy", -1, "minimum occupancy from neighbouring collisions"}; + Configurable maxOccupancy{"maxOccupancy", 1000, "maximum occupancy from neighbouring collisions"}; + + // Kinematic axes + ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.2f, 2.4f, 2.6f, 2.8f, 3.0f, 3.2f, 3.4f, 3.6f, 3.8f, 4.0f, 4.4f, 4.8f, 5.2f, 5.6f, 6.0f, 6.5f, 7.0f, 7.5f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 17.0f, 19.0f, 21.0f, 23.0f, 25.0f, 30.0f, 35.0f, 40.0f, 50.0f}, "pt axis for v0 analysis"}; + ConfigurableAxis axisPtXi{"axisPtXi", {VARIABLE_WIDTH, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.2f, 2.4f, 2.6f, 2.8f, 3.0f, 3.2f, 3.4f, 3.6f, 3.8f, 4.0f, 4.4f, 4.8f, 5.2f, 5.6f, 6.0f, 6.5f, 7.0f, 7.5f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 17.0f, 19.0f, 21.0f, 23.0f, 25.0f, 30.0f, 35.0f, 40.0f, 50.0f}, "pt axis for cascade analysis"}; + ConfigurableAxis axisPtCoarse{"axisPtCoarse", {VARIABLE_WIDTH, 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 7.0f, 10.0f, 15.0f}, "pt axis for QA"}; + ConfigurableAxis axisEta{"axisEta", {100, -2.0f, 2.0f}, "#eta"}; + ConfigurableAxis axisRap{"axisRap", {100, -2.0f, 2.0f}, "y"}; + + // Invariant mass axes + ConfigurableAxis axisK0Mass{"axisK0Mass", {200, 0.4f, 0.6f}, ""}; + ConfigurableAxis axisLambdaMass{"axisLambdaMass", {200, 1.101f, 1.131f}, ""}; + ConfigurableAxis axisXiMass{"axisXiMass", {200, 1.28f, 1.36f}, ""}; + ConfigurableAxis axisOmegaMass{"axisOmegaMass", {200, 1.59f, 1.75f}, ""}; + std::vector axisInvMass = {axisK0Mass, + axisLambdaMass, + axisLambdaMass, + axisXiMass, + axisXiMass, + axisOmegaMass, + axisOmegaMass}; + + ConfigurableAxis axisNTracksGlobal{"axisNTracksGlobal", {101, -1.5f, 99.5f}, "Number of global tracks"}; + ConfigurableAxis axisNTracksPVeta1{"axisNTracksPVeta1", {100, -0.5f, 99.5f}, "Number of PV contributors in |eta| < 1"}; + ConfigurableAxis axisNTracksPVeta05{"axisNTracksPVeta05", {100, -0.5f, 99.5f}, "Number of PV contributors in |eta| < 0.5"}; + ConfigurableAxis axisNAssocColl{"axisNAssocColl", {10, -0.5f, 9.5f}, "Number of assoc. rec. collisions"}; + ConfigurableAxis axisNTracksTotalExceptITSonly{"axisNTracksTotalExceptITSonly", {100, -0.5f, 99.5f}, "Number of ITS-TPC and TPC only tracks"}; + ConfigurableAxis axisNchInvMass{"axisNchInvMass", {201, -1.5f, 199.5f}, "Number of charged particles for kTHnSparseF"}; + + ConfigurableAxis axisFT0Cqa{"axisFT0Cqa", + {VARIABLE_WIDTH, -1.5, -0.5, 0., 0.01, 0.05, 0.1, 0.5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 105.5}, + "FT0C (%)"}; + + ConfigurableAxis axisFT0C{"axisFT0C", + {VARIABLE_WIDTH, 0., 0.01, 0.05, 0.1, 0.5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 105.5}, + "FT0C (%)"}; + + ConfigurableAxis axisOccupancy{"axisOccupancy", {VARIABLE_WIDTH, 0.0f, 250.0f, 500.0f, 750.0f, 1000.0f, 1500.0f, 2000.0f, 3000.0f, 4500.0f, 6000.0f, 8000.0f, 10000.0f, 50000.0f}, "Occupancy"}; + + // UPC axes + ConfigurableAxis axisSelGap{"axisSelGap", {4, -1.5, 2.5}, "Gap side"}; + + // AP plot axes + ConfigurableAxis axisAPAlpha{"axisAPAlpha", {220, -1.1f, 1.1f}, "V0 AP alpha"}; + ConfigurableAxis axisAPQt{"axisAPQt", {220, 0.0f, 0.5f}, "V0 AP alpha"}; + + // MC coll assoc QA axis + ConfigurableAxis axisMonteCarloNch{"axisMonteCarloNch", {300, 0.0f, 3000.0f}, "N_{ch} MC"}; + + // Track quality axes + ConfigurableAxis axisTPCrows{"axisTPCrows", {160, -0.5f, 159.5f}, "N TPC rows"}; + ConfigurableAxis axisITSclus{"axisITSclus", {7, -0.5f, 6.5f}, "N ITS Clusters"}; + ConfigurableAxis axisITScluMap{"axisITScluMap", {128, -0.5f, 127.5f}, "ITS Cluster map"}; + ConfigurableAxis axisDetMap{"axisDetMap", {16, -0.5f, 15.5f}, "Detector use map"}; + ConfigurableAxis axisITScluMapCoarse{"axisITScluMapCoarse", {16, -3.5f, 12.5f}, "ITS Coarse cluster map"}; + ConfigurableAxis axisDetMapCoarse{"axisDetMapCoarse", {5, -0.5f, 4.5f}, "Detector Coarse user map"}; + + // Topological variable QA axes + ConfigurableAxis axisDCAtoPV{"axisDCAtoPV", {80, -4.0f, 4.0f}, "DCA (cm)"}; + ConfigurableAxis axisDCAdau{"axisDCAdau", {24, 0.0f, 1.2f}, "DCA (cm)"}; + ConfigurableAxis axisPointingAngle{"axisPointingAngle", {100, 0.0f, 0.5f}, "pointing angle (rad)"}; + ConfigurableAxis axisV0Radius{"axisV0Radius", {60, 0.0f, 60.0f}, "V0 2D radius (cm)"}; + ConfigurableAxis axisNsigmaTPC{"axisNsigmaTPC", {200, -10.0f, 10.0f}, "N sigma TPC"}; + ConfigurableAxis axisTPCsignal{"axisTPCsignal", {200, 0.0f, 200.0f}, "TPC signal"}; + ConfigurableAxis axisTOFdeltaT{"axisTOFdeltaT", {200, -5000.0f, 5000.0f}, "TOF Delta T (ps)"}; + ConfigurableAxis axisNctau{"axisNctau", {100, 0.0f, 10.0f}, "n c x tau"}; + + static constexpr std::string_view kParticlenames[] = {"K0Short", "Lambda", "AntiLambda", "Xi", "AntiXi", "Omega", "AntiOmega"}; + + void setBits(std::bitset& mask, std::initializer_list selections) + { + for (const int& sel : selections) { + mask.set(sel); + } + } + + template + void addTopoHistograms(HistogramRegistry& histos) + { + const bool isCascade = (partID > 2.5) ? true : false; + if (isCascade) { + histos.add(Form("%s/hCascCosPA", kParticlenames[partID].data()), "hCascCosPA", kTH2F, {axisPtCoarse, {100, 0.9f, 1.0f}}); + histos.add(Form("%s/hDCACascDaughters", kParticlenames[partID].data()), "hDCACascDaughters", kTH2F, {axisPtCoarse, {44, 0.0f, 2.2f}}); + histos.add(Form("%s/hCascRadius", kParticlenames[partID].data()), "hCascRadius", kTH2D, {axisPtCoarse, {500, 0.0f, 50.0f}}); + histos.add(Form("%s/hMesonDCAToPV", kParticlenames[partID].data()), "hMesonDCAToPV", kTH2F, {axisPtCoarse, axisDCAtoPV}); + histos.add(Form("%s/hBaryonDCAToPV", kParticlenames[partID].data()), "hBaryonDCAToPV", kTH2F, {axisPtCoarse, axisDCAtoPV}); + histos.add(Form("%s/hBachDCAToPV", kParticlenames[partID].data()), "hBachDCAToPV", kTH2F, {axisPtCoarse, {200, -1.0f, 1.0f}}); + histos.add(Form("%s/hV0CosPA", kParticlenames[partID].data()), "hV0CosPA", kTH2F, {axisPtCoarse, {100, 0.9f, 1.0f}}); + histos.add(Form("%s/hV0Radius", kParticlenames[partID].data()), "hV0Radius", kTH2D, {axisPtCoarse, axisV0Radius}); + histos.add(Form("%s/hDCAV0Daughters", kParticlenames[partID].data()), "hDCAV0Daughters", kTH2F, {axisPtCoarse, axisDCAdau}); + histos.add(Form("%s/hDCAV0ToPV", kParticlenames[partID].data()), "hDCAV0ToPV", kTH2F, {axisPtCoarse, {44, 0.0f, 2.2f}}); + histos.add(Form("%s/hMassLambdaDau", kParticlenames[partID].data()), "hMassLambdaDau", kTH2F, {axisPtCoarse, axisLambdaMass}); + histos.add(Form("%s/hNctau", kParticlenames[partID].data()), "hNctau", kTH2F, {axisPtCoarse, axisNctau}); + if (doBachelorBaryonCut) { + histos.add(Form("%s/hBachBaryonCosPA", kParticlenames[partID].data()), "hBachBaryonCosPA", kTH2F, {axisPtCoarse, {100, 0.0f, 1.0f}}); + histos.add(Form("%s/hBachBaryonDCAxyToPV", kParticlenames[partID].data()), "hBachBaryonDCAxyToPV", kTH2F, {axisPtCoarse, {300, -3.0f, 3.0f}}); + } + } else { + histos.add(Form("%s/hPosDCAToPV", kParticlenames[partID].data()), "hPosDCAToPV", kTH1F, {axisDCAtoPV}); + histos.add(Form("%s/hNegDCAToPV", kParticlenames[partID].data()), "hNegDCAToPV", kTH1F, {axisDCAtoPV}); + histos.add(Form("%s/hDCADaughters", kParticlenames[partID].data()), "hDCADaughters", kTH1F, {axisDCAdau}); + histos.add(Form("%s/hPointingAngle", kParticlenames[partID].data()), "hPointingAngle", kTH1F, {axisPointingAngle}); + histos.add(Form("%s/hV0Radius", kParticlenames[partID].data()), "hV0Radius", kTH1F, {axisV0Radius}); + histos.add(Form("%s/h2dPositiveITSvsTPCpts", kParticlenames[partID].data()), "h2dPositiveITSvsTPCpts", kTH2F, {axisTPCrows, axisITSclus}); + histos.add(Form("%s/h2dNegativeITSvsTPCpts", kParticlenames[partID].data()), "h2dNegativeITSvsTPCpts", kTH2F, {axisTPCrows, axisITSclus}); + } + } + + template + void addTPCQAHistograms(HistogramRegistry& histos) + { + const bool isCascade = (partID > 2.5) ? true : false; + histos.add(Form("%s/h3dPosNsigmaTPC", kParticlenames[partID].data()), "h3dPosNsigmaTPC", kTH3F, {axisFT0C, axisPtCoarse, axisNsigmaTPC}); + histos.add(Form("%s/h3dNegNsigmaTPC", kParticlenames[partID].data()), "h3dNegNsigmaTPC", kTH3F, {axisFT0C, axisPtCoarse, axisNsigmaTPC}); + histos.add(Form("%s/h3dPosTPCsignal", kParticlenames[partID].data()), "h3dPosTPCsignal", kTH3F, {axisFT0C, axisPtCoarse, axisTPCsignal}); + histos.add(Form("%s/h3dNegTPCsignal", kParticlenames[partID].data()), "h3dNegTPCsignal", kTH3F, {axisFT0C, axisPtCoarse, axisTPCsignal}); + + histos.add(Form("%s/h3dPosNsigmaTPCvsTrackPtot", kParticlenames[partID].data()), "h3dPosNsigmaTPCvsTrackPtot", kTH3F, {axisFT0C, axisPtCoarse, axisNsigmaTPC}); + histos.add(Form("%s/h3dNegNsigmaTPCvsTrackPtot", kParticlenames[partID].data()), "h3dNegNsigmaTPCvsTrackPtot", kTH3F, {axisFT0C, axisPtCoarse, axisNsigmaTPC}); + + histos.add(Form("%s/h3dPosTPCsignalVsTrackPtot", kParticlenames[partID].data()), "h3dPosTPCsignalVsTrackPtot", kTH3F, {axisFT0C, axisPtCoarse, axisTPCsignal}); + histos.add(Form("%s/h3dNegTPCsignalVsTrackPtot", kParticlenames[partID].data()), "h3dNegTPCsignalVsTrackPtot", kTH3F, {axisFT0C, axisPtCoarse, axisTPCsignal}); + + histos.add(Form("%s/h3dPosNsigmaTPCvsTrackPt", kParticlenames[partID].data()), "h3dPosNsigmaTPCvsTrackPt", kTH3F, {axisFT0C, axisPtCoarse, axisNsigmaTPC}); + histos.add(Form("%s/h3dNegNsigmaTPCvsTrackPt", kParticlenames[partID].data()), "h3dNegNsigmaTPCvsTrackPt", kTH3F, {axisFT0C, axisPtCoarse, axisNsigmaTPC}); + + histos.add(Form("%s/h3dPosTPCsignalVsTrackPt", kParticlenames[partID].data()), "h3dPosTPCsignalVsTrackPt", kTH3F, {axisFT0C, axisPtCoarse, axisTPCsignal}); + histos.add(Form("%s/h3dNegTPCsignalVsTrackPt", kParticlenames[partID].data()), "h3dNegTPCsignalVsTrackPt", kTH3F, {axisFT0C, axisPtCoarse, axisTPCsignal}); + + if (isCascade) { + histos.add(Form("%s/h3dBachTPCsignal", kParticlenames[partID].data()), "h3dBachTPCsignal", kTH3F, {axisFT0C, axisPtCoarse, axisTPCsignal}); + histos.add(Form("%s/h3dBachNsigmaTPC", kParticlenames[partID].data()), "h3dBachNsigmaTPC", kTH3F, {axisFT0C, axisPtCoarse, axisNsigmaTPC}); + histos.add(Form("%s/h3dBachNsigmaTPCvsTrackPtot", kParticlenames[partID].data()), "h3dBachNsigmaTPCvsTrackPtot", kTH3F, {axisFT0C, axisPtCoarse, axisNsigmaTPC}); + histos.add(Form("%s/h3dBachTPCsignalVsTrackPtot", kParticlenames[partID].data()), "h3dBachTPCsignalVsTrackPtot", kTH3F, {axisFT0C, axisPtCoarse, axisTPCsignal}); + histos.add(Form("%s/h3dBachNsigmaTPCvsTrackPt", kParticlenames[partID].data()), "h3dBachNsigmaTPCvsTrackPt", kTH3F, {axisFT0C, axisPtCoarse, axisNsigmaTPC}); + histos.add(Form("%s/h3dBachTPCsignalVsTrackPt", kParticlenames[partID].data()), "h3dBachTPCsignalVsTrackPt", kTH3F, {axisFT0C, axisPtCoarse, axisTPCsignal}); + } + } + + template + void addTOFQAHistograms(HistogramRegistry& histos) + { + const bool isCascade = (partID > 2.5) ? true : false; + histos.add(Form("%s/h3dPosTOFdeltaT", kParticlenames[partID].data()), "h3dPosTOFdeltaT", kTH3F, {axisFT0C, axisPtCoarse, axisTOFdeltaT}); + histos.add(Form("%s/h3dNegTOFdeltaT", kParticlenames[partID].data()), "h3dNegTOFdeltaT", kTH3F, {axisFT0C, axisPtCoarse, axisTOFdeltaT}); + histos.add(Form("%s/h3dPosTOFdeltaTvsTrackPtot", kParticlenames[partID].data()), "h3dPosTOFdeltaTvsTrackPtot", kTH3F, {axisFT0C, axisPtCoarse, axisTOFdeltaT}); + histos.add(Form("%s/h3dNegTOFdeltaTvsTrackPtot", kParticlenames[partID].data()), "h3dNegTOFdeltaTvsTrackPtot", kTH3F, {axisFT0C, axisPtCoarse, axisTOFdeltaT}); + histos.add(Form("%s/h3dPosTOFdeltaTvsTrackPt", kParticlenames[partID].data()), "h3dPosTOFdeltaTvsTrackPt", kTH3F, {axisFT0C, axisPtCoarse, axisTOFdeltaT}); + histos.add(Form("%s/h3dNegTOFdeltaTvsTrackPt", kParticlenames[partID].data()), "h3dNegTOFdeltaTvsTrackPt", kTH3F, {axisFT0C, axisPtCoarse, axisTOFdeltaT}); + if (isCascade) { + histos.add(Form("%s/h3dBachTOFdeltaT", kParticlenames[partID].data()), "h3dBachTOFdeltaT", kTH3F, {axisFT0C, axisPtCoarse, axisTOFdeltaT}); + histos.add(Form("%s/h3dBachTOFdeltaTvsTrackPtot", kParticlenames[partID].data()), "h3dBachTOFdeltaTvsTrackPtot", kTH3F, {axisFT0C, axisPtCoarse, axisTOFdeltaT}); + histos.add(Form("%s/h3dBachTOFdeltaTvsTrackPt", kParticlenames[partID].data()), "h3dBachTOFdeltaTvsTrackPt", kTH3F, {axisFT0C, axisPtCoarse, axisTOFdeltaT}); + } + } + + template + void addKinematicQAHistograms(HistogramRegistry& histos) + { + const bool isCascade = (partID > 2.5) ? true : false; + histos.add(Form("%s/h3dPosEtaPt", kParticlenames[partID].data()), "h3dPosEtaPt", kTH3F, {axisPtCoarse, axisEta, axisSelGap}); + histos.add(Form("%s/h3dNegEtaPt", kParticlenames[partID].data()), "h3dNegEtaPt", kTH3F, {axisPtCoarse, axisEta, axisSelGap}); + histos.add(Form("%s/h3dRapPt", kParticlenames[partID].data()), "h3dRapPt", kTH3F, {axisPtCoarse, axisRap, axisSelGap}); + if (isCascade) { + histos.add(Form("%s/h3dBachEtaPt", kParticlenames[partID].data()), "h3dBachEtaPt", kTH3F, {axisPtCoarse, axisEta, axisSelGap}); + } + } + + template + void addDetectorPropHistograms(HistogramRegistry& histos) + { + const bool isCascade = (partID > 2.5) ? true : false; + if (doDetectPropQA == 1) { + if (isCascade) { + histos.add(Form("%s/h8dDetectPropVsCentrality", kParticlenames[partID].data()), "h8dDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse}); + } else { + histos.add(Form("%s/h6dDetectPropVsCentrality", kParticlenames[partID].data()), "h6dDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse}); + } + histos.add(Form("%s/h4dPosDetectPropVsCentrality", kParticlenames[partID].data()), "h4dPosDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMap, axisITScluMap, axisPtCoarse}); + histos.add(Form("%s/h4dNegDetectPropVsCentrality", kParticlenames[partID].data()), "h4dNegDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMap, axisITScluMap, axisPtCoarse}); + histos.add(Form("%s/h4dBachDetectPropVsCentrality", kParticlenames[partID].data()), "h4dBachDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMap, axisITScluMap, axisPtCoarse}); + } + if (doDetectPropQA == 2) { + if (isCascade) { + histos.add(Form("%s/h9dDetectPropVsCentrality", kParticlenames[partID].data()), "h9dDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse, axisInvMass.at(partID)}); + } else { + histos.add(Form("%s/h7dDetectPropVsCentrality", kParticlenames[partID].data()), "h7dDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse, axisInvMass.at(partID)}); + } + histos.add(Form("%s/h5dPosDetectPropVsCentrality", kParticlenames[partID].data()), "h5dPosDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMap, axisITScluMap, axisPtCoarse, axisInvMass.at(partID)}); + histos.add(Form("%s/h5dNegDetectPropVsCentrality", kParticlenames[partID].data()), "h5dNegDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMap, axisITScluMap, axisPtCoarse, axisInvMass.at(partID)}); + histos.add(Form("%s/h5dBachDetectPropVsCentrality", kParticlenames[partID].data()), "h5dBachDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMap, axisITScluMap, axisPtCoarse, axisInvMass.at(partID)}); + } + } + + template + void addHistograms(HistogramRegistry& histos) + { + histos.add(Form("%s/h7dMass", kParticlenames[partID].data()), "h7dMass", kTHnSparseF, {axisFT0C, axisPt, axisInvMass.at(partID), axisSelGap, axisNchInvMass, axisRap, axisEta}); + histos.add(Form("%s/h2dMass", kParticlenames[partID].data()), "h2dMass", kTH2F, {axisInvMass.at(partID), axisSelGap}); + if (doPlainTopoQA) { + addTopoHistograms(histos); + } + if (PIDConfigurations.doTPCQA) { + addTPCQAHistograms(histos); + } + if (PIDConfigurations.doTOFQA) { + addTOFQAHistograms(histos); + } + if (doKienmaticQA) { + addKinematicQAHistograms(histos); + } + addDetectorPropHistograms(histos); + } + + template + void fillHistogramsV0(TCand cand, TCollision coll, int gap) + { + float invMass = 0; + float centrality = coll.centFT0C(); + float pT = cand.pt(); + float rapidity = 1e6; + + float tpcNsigmaPos = 0; + float tpcNsigmaNeg = 0; + float tofDeltaTPos = 0; + float tofDeltaTNeg = 0; + + auto posTrackExtra = cand.template posTrackExtra_as(); + auto negTrackExtra = cand.template negTrackExtra_as(); + + bool posIsFromAfterburner = posTrackExtra.itsChi2PerNcl() < 0; + bool negIsFromAfterburner = negTrackExtra.itsChi2PerNcl() < 0; + + uint posDetMap = computeDetBitmap(posTrackExtra.detectorMap()); + int posITSclusMap = computeITSclusBitmap(posTrackExtra.itsClusterMap(), posIsFromAfterburner); + uint negDetMap = computeDetBitmap(negTrackExtra.detectorMap()); + int negITSclusMap = computeITSclusBitmap(negTrackExtra.itsClusterMap(), negIsFromAfterburner); + + if (partID == 0) { + histos.fill(HIST("generalQA/h2dArmenterosSelected"), cand.alpha(), cand.qtarm()); + invMass = cand.mK0Short(); + rapidity = cand.yK0Short(); + if (PIDConfigurations.doTOFQA) { + tofDeltaTPos = cand.posTOFDeltaTK0Pi(); + tofDeltaTNeg = cand.negTOFDeltaTK0Pi(); + } + if (PIDConfigurations.doTPCQA) { + tpcNsigmaPos = posTrackExtra.tpcNSigmaPi(); + tpcNsigmaNeg = negTrackExtra.tpcNSigmaPi(); + } + } else if (partID == 1) { + invMass = cand.mLambda(); + rapidity = cand.yLambda(); + if (PIDConfigurations.doTOFQA) { + tofDeltaTPos = cand.posTOFDeltaTLaPr(); + tofDeltaTNeg = cand.negTOFDeltaTLaPi(); + } + if (PIDConfigurations.doTPCQA) { + tpcNsigmaPos = posTrackExtra.tpcNSigmaPr(); + tpcNsigmaNeg = negTrackExtra.tpcNSigmaPi(); + } + } else if (partID == 2) { + invMass = cand.mAntiLambda(); + rapidity = cand.yLambda(); + if (PIDConfigurations.doTOFQA) { + tofDeltaTPos = cand.posTOFDeltaTLaPi(); + tofDeltaTNeg = cand.negTOFDeltaTLaPr(); + } + if (PIDConfigurations.doTPCQA) { + tpcNsigmaPos = posTrackExtra.tpcNSigmaPi(); + tpcNsigmaNeg = negTrackExtra.tpcNSigmaPr(); + } + } else { + LOG(fatal) << "Particle is unknown!"; + } + + histos.fill(HIST(kParticlenames[partID]) + HIST("/h2dMass"), invMass, gap); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h7dMass"), centrality, pT, invMass, gap, coll.multNTracksGlobal(), rapidity, cand.eta()); + if (doKienmaticQA) { + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosEtaPt"), pT, cand.positiveeta(), gap); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegEtaPt"), pT, cand.negativeeta(), gap); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dRapPt"), pT, rapidity, gap); + } + if (doPlainTopoQA) { + histos.fill(HIST(kParticlenames[partID]) + HIST("/hPosDCAToPV"), cand.dcapostopv()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/hNegDCAToPV"), cand.dcanegtopv()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/hDCADaughters"), cand.dcaV0daughters()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/hPointingAngle"), std::acos(cand.v0cosPA())); + histos.fill(HIST(kParticlenames[partID]) + HIST("/hV0Radius"), cand.v0radius()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h2dPositiveITSvsTPCpts"), posTrackExtra.tpcCrossedRows(), posTrackExtra.itsNCls()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h2dNegativeITSvsTPCpts"), negTrackExtra.tpcCrossedRows(), negTrackExtra.itsNCls()); + } + if (doDetectPropQA == 1) { + histos.fill(HIST(kParticlenames[partID]) + HIST("/h6dDetectPropVsCentrality"), centrality, posDetMap, posITSclusMap, negDetMap, negITSclusMap, pT); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h4dPosDetectPropVsCentrality"), centrality, posTrackExtra.detectorMap(), posTrackExtra.itsClusterMap(), pT); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h4dNegDetectPropVsCentrality"), centrality, negTrackExtra.detectorMap(), negTrackExtra.itsClusterMap(), pT); + } + if (doDetectPropQA == 2) { + histos.fill(HIST(kParticlenames[partID]) + HIST("/h7dPosDetectPropVsCentrality"), centrality, posDetMap, posITSclusMap, negDetMap, negITSclusMap, pT, invMass); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h5dPosDetectPropVsCentrality"), centrality, posTrackExtra.detectorMap(), posTrackExtra.itsClusterMap(), pT, invMass); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h5dNegDetectPropVsCentrality"), centrality, negTrackExtra.detectorMap(), negTrackExtra.itsClusterMap(), pT, invMass); + } + if (PIDConfigurations.doTPCQA) { + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosTPCsignal"), centrality, pT, posTrackExtra.tpcSignal()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegTPCsignal"), centrality, pT, negTrackExtra.tpcSignal()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosTPCsignalVsTrackPtot"), centrality, cand.positivept() * std::cosh(cand.positiveeta()), posTrackExtra.tpcSignal()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegTPCsignalVsTrackPtot"), centrality, cand.negativept() * std::cosh(cand.negativeeta()), negTrackExtra.tpcSignal()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosTPCsignalVsTrackPt"), centrality, cand.positivept(), posTrackExtra.tpcSignal()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegTPCsignalVsTrackPt"), centrality, cand.negativept(), negTrackExtra.tpcSignal()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosNsigmaTPCvsTrackPt"), centrality, cand.positivept(), posTrackExtra.tpcNSigmaPi()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegNsigmaTPCvsTrackPt"), centrality, cand.negativept(), negTrackExtra.tpcNSigmaPi()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosNsigmaTPCvsTrackPtot"), centrality, cand.positivept() * std::cosh(cand.positiveeta()), tpcNsigmaPos); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegNsigmaTPCvsTrackPtot"), centrality, cand.negativept() * std::cosh(cand.negativeeta()), tpcNsigmaNeg); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosNsigmaTPC"), centrality, pT, tpcNsigmaPos); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegNsigmaTPC"), centrality, pT, tpcNsigmaNeg); + } + if (PIDConfigurations.doTOFQA) { + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosTOFdeltaTvsTrackPt"), centrality, cand.positivept(), tofDeltaTPos); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegTOFdeltaTvsTrackPt"), centrality, cand.negativept(), tofDeltaTNeg); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosTOFdeltaT"), centrality, pT, tofDeltaTPos); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegTOFdeltaT"), centrality, pT, tofDeltaTNeg); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosTOFdeltaTvsTrackPtot"), centrality, cand.positivept() * std::cosh(cand.positiveeta()), tofDeltaTPos); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegTOFdeltaTvsTrackPtot"), centrality, cand.negativept() * std::cosh(cand.negativeeta()), tofDeltaTNeg); + } + } + + template + void fillHistogramsCasc(TCand cand, TCollision coll, int gap) + { + float invMass = 0; + float centrality = coll.centFT0C(); + float pT = cand.pt(); + float rapidity = 1e6; + + // Access daughter tracks + auto posTrackExtra = cand.template posTrackExtra_as(); + auto negTrackExtra = cand.template negTrackExtra_as(); + auto bachTrackExtra = cand.template bachTrackExtra_as(); + + bool posIsFromAfterburner = posTrackExtra.itsChi2PerNcl() < 0; + bool negIsFromAfterburner = negTrackExtra.itsChi2PerNcl() < 0; + bool bachIsFromAfterburner = bachTrackExtra.itsChi2PerNcl() < 0; + + uint posDetMap = computeDetBitmap(posTrackExtra.detectorMap()); + int posITSclusMap = computeITSclusBitmap(posTrackExtra.itsClusterMap(), posIsFromAfterburner); + uint negDetMap = computeDetBitmap(negTrackExtra.detectorMap()); + int negITSclusMap = computeITSclusBitmap(negTrackExtra.itsClusterMap(), negIsFromAfterburner); + uint bachDetMap = computeDetBitmap(bachTrackExtra.detectorMap()); + int bachITSclusMap = computeITSclusBitmap(bachTrackExtra.itsClusterMap(), bachIsFromAfterburner); + + // c x tau + float decayPos = std::hypot(cand.x() - coll.posX(), cand.y() - coll.posY(), cand.z() - coll.posZ()); + float totalMom = std::hypot(cand.px(), cand.py(), cand.pz()); + + float ctau = 0; + + float tpcNsigmaPos = 0; + float tpcNsigmaNeg = 0; + float tpcNsigmaBach = 0; + float tofDeltaTPos = 0; + float tofDeltaTNeg = 0; + float tofDeltaTBach = 0; + + if (partID == 3) { + invMass = cand.mXi(); + ctau = totalMom != 0 ? o2::constants::physics::MassXiMinus * decayPos / (totalMom * ctauxiPDG) : 1e6; + rapidity = cand.yXi(); + + if (PIDConfigurations.doTPCQA) { + tpcNsigmaPos = posTrackExtra.tpcNSigmaPr(); + tpcNsigmaNeg = negTrackExtra.tpcNSigmaPi(); + tpcNsigmaBach = bachTrackExtra.tpcNSigmaPi(); + } + if (PIDConfigurations.doTOFQA) { + tofDeltaTPos = cand.posTOFDeltaTXiPr(); + tofDeltaTNeg = cand.negTOFDeltaTXiPi(); + tofDeltaTBach = cand.bachTOFDeltaTXiPi(); + } + } else if (partID == 4) { + invMass = cand.mXi(); + ctau = totalMom != 0 ? o2::constants::physics::MassXiPlusBar * decayPos / (totalMom * ctauxiPDG) : 1e6; + rapidity = cand.yXi(); + + if (PIDConfigurations.doTPCQA) { + tpcNsigmaPos = posTrackExtra.tpcNSigmaPi(); + tpcNsigmaNeg = negTrackExtra.tpcNSigmaPr(); + tpcNsigmaBach = bachTrackExtra.tpcNSigmaPi(); + } + if (PIDConfigurations.doTOFQA) { + tofDeltaTPos = cand.posTOFDeltaTXiPi(); + tofDeltaTNeg = cand.negTOFDeltaTXiPr(); + tofDeltaTBach = cand.bachTOFDeltaTXiPi(); + } + + } else if (partID == 5) { + invMass = cand.mOmega(); + ctau = totalMom != 0 ? o2::constants::physics::MassOmegaMinus * decayPos / (totalMom * ctauomegaPDG) : 1e6; + rapidity = cand.yOmega(); + + if (PIDConfigurations.doTPCQA) { + tpcNsigmaPos = posTrackExtra.tpcNSigmaPr(); + tpcNsigmaNeg = negTrackExtra.tpcNSigmaPi(); + tpcNsigmaBach = bachTrackExtra.tpcNSigmaKa(); + } + if (PIDConfigurations.doTOFQA) { + tofDeltaTPos = cand.posTOFDeltaTOmPi(); + tofDeltaTNeg = cand.posTOFDeltaTOmPr(); + tofDeltaTBach = cand.bachTOFDeltaTOmKa(); + } + + } else if (partID == 6) { + invMass = cand.mOmega(); + ctau = totalMom != 0 ? o2::constants::physics::MassOmegaPlusBar * decayPos / (totalMom * ctauomegaPDG) : 1e6; + rapidity = cand.yOmega(); + + if (PIDConfigurations.doTPCQA) { + tpcNsigmaPos = posTrackExtra.tpcNSigmaPi(); + tpcNsigmaNeg = negTrackExtra.tpcNSigmaPr(); + tpcNsigmaBach = bachTrackExtra.tpcNSigmaKa(); + } + if (PIDConfigurations.doTOFQA) { + tofDeltaTPos = cand.posTOFDeltaTOmPr(); + tofDeltaTNeg = cand.posTOFDeltaTOmPi(); + tofDeltaTBach = cand.bachTOFDeltaTOmKa(); + } + } + histos.fill(HIST(kParticlenames[partID]) + HIST("/h2dMass"), invMass, gap); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h7dMass"), centrality, pT, invMass, gap, coll.multNTracksGlobal(), rapidity, cand.eta()); + if (doKienmaticQA) { + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosEtaPt"), pT, cand.positiveeta(), gap); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegEtaPt"), pT, cand.negativeeta(), gap); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dBachEtaPt"), pT, cand.bacheloreta(), gap); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dRapPt"), pT, rapidity, gap); + } + if (doPlainTopoQA) { + histos.fill(HIST(kParticlenames[partID]) + HIST("/hCascCosPA"), pT, cand.casccosPA(coll.posX(), coll.posY(), coll.posZ())); + histos.fill(HIST(kParticlenames[partID]) + HIST("/hDCACascDaughters"), pT, cand.dcacascdaughters()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/hCascRadius"), pT, cand.cascradius()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/hMesonDCAToPV"), pT, cand.dcanegtopv()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/hBaryonDCAToPV"), pT, cand.dcapostopv()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/hBachDCAToPV"), pT, cand.dcabachtopv()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/hV0CosPA"), pT, cand.v0cosPA(coll.posX(), coll.posY(), coll.posZ())); + histos.fill(HIST(kParticlenames[partID]) + HIST("/hV0Radius"), pT, cand.v0radius()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/hDCAV0Daughters"), pT, cand.dcaV0daughters()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/hDCAV0ToPV"), pT, std::fabs(cand.dcav0topv(coll.posX(), coll.posY(), coll.posZ()))); + histos.fill(HIST(kParticlenames[partID]) + HIST("/hMassLambdaDau"), pT, cand.mLambda()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/hNctau"), pT, ctau); + } + if (PIDConfigurations.doTPCQA) { + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosNsigmaTPC"), centrality, pT, tpcNsigmaPos); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegNsigmaTPC"), centrality, pT, tpcNsigmaNeg); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dBachNsigmaTPC"), centrality, pT, tpcNsigmaBach); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosTPCsignal"), centrality, pT, posTrackExtra.tpcSignal()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegTPCsignal"), centrality, pT, negTrackExtra.tpcSignal()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dBachTPCsignal"), centrality, pT, bachTrackExtra.tpcSignal()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosNsigmaTPCvsTrackPtot"), centrality, cand.positivept() * std::cosh(cand.positiveeta()), tpcNsigmaPos); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegNsigmaTPCvsTrackPtot"), centrality, cand.negativept() * std::cosh(cand.negativeeta()), tpcNsigmaNeg); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dBachNsigmaTPCvsTrackPtot"), centrality, cand.bachelorpt() * std::cosh(cand.bacheloreta()), tpcNsigmaBach); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosTPCsignalVsTrackPtot"), centrality, cand.positivept() * std::cosh(cand.positiveeta()), posTrackExtra.tpcSignal()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegTPCsignalVsTrackPtot"), centrality, cand.negativept() * std::cosh(cand.negativeeta()), negTrackExtra.tpcSignal()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dBachTPCsignalVsTrackPtot"), centrality, cand.bachelorpt() * std::cosh(cand.bacheloreta()), bachTrackExtra.tpcSignal()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosNsigmaTPCvsTrackPt"), centrality, cand.positivept(), tpcNsigmaPos); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegNsigmaTPCvsTrackPt"), centrality, cand.negativept(), tpcNsigmaNeg); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dBachNsigmaTPCvsTrackPt"), centrality, cand.bachelorpt(), tpcNsigmaBach); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosTPCsignalVsTrackPt"), centrality, cand.positivept(), posTrackExtra.tpcSignal()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegTPCsignalVsTrackPt"), centrality, cand.negativept(), negTrackExtra.tpcSignal()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dBachTPCsignalVsTrackPt"), centrality, cand.bachelorpt(), bachTrackExtra.tpcSignal()); + } + if (PIDConfigurations.doTOFQA) { + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosTOFdeltaT"), centrality, pT, tofDeltaTPos); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegTOFdeltaT"), centrality, pT, tofDeltaTNeg); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dBachTOFdeltaT"), centrality, pT, tofDeltaTBach); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosTOFdeltaTvsTrackPtot"), centrality, cand.positivept() * std::cosh(cand.positiveeta()), tofDeltaTPos); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegTOFdeltaTvsTrackPtot"), centrality, cand.negativept() * std::cosh(cand.negativeeta()), tofDeltaTNeg); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dBachTOFdeltaTvsTrackPtot"), centrality, cand.bachelorpt() * std::cosh(cand.bacheloreta()), tofDeltaTBach); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosTOFdeltaTvsTrackPt"), centrality, cand.positivept(), tofDeltaTPos); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegTOFdeltaTvsTrackPt"), centrality, cand.negativept(), tofDeltaTNeg); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dBachTOFdeltaTvsTrackPt"), centrality, cand.bachelorpt(), tofDeltaTBach); + } + if (doDetectPropQA == 1) { + histos.fill(HIST(kParticlenames[partID]) + HIST("/h8dDetectPropVsCentrality"), centrality, posDetMap, posITSclusMap, negDetMap, negITSclusMap, bachDetMap, bachITSclusMap, pT); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h4dPosDetectPropVsCentrality"), centrality, posTrackExtra.detectorMap(), posTrackExtra.itsClusterMap(), pT); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h4dNegDetectPropVsCentrality"), centrality, negTrackExtra.detectorMap(), negTrackExtra.itsClusterMap(), pT); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h4dBachDetectPropVsCentrality"), centrality, bachTrackExtra.detectorMap(), bachTrackExtra.itsClusterMap(), pT); + } + if (doDetectPropQA == 2) { + histos.fill(HIST(kParticlenames[partID]) + HIST("/h9dDetectPropVsCentrality"), centrality, posDetMap, posITSclusMap, negDetMap, negITSclusMap, bachDetMap, bachITSclusMap, pT, invMass); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h5dPosDetectPropVsCentrality"), centrality, posTrackExtra.detectorMap(), posTrackExtra.itsClusterMap(), pT, invMass); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h5dNegDetectPropVsCentrality"), centrality, negTrackExtra.detectorMap(), negTrackExtra.itsClusterMap(), pT, invMass); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h5dBachDetectPropVsCentrality"), centrality, bachTrackExtra.detectorMap(), bachTrackExtra.itsClusterMap(), pT, invMass); + } + } + + void init(InitContext const&) + { + if (doprocessV0s && doprocessCascades) { + LOG(fatal) << "Unable to analyze both v0s and cascades simultaneously. Please enable only one process at a time"; + } + + if ((doprocessV0sMC || doprocessGenerated) && (doprocessV0s || doprocessCascades)) { + LOG(fatal) << "Cannot analyze both data and MC simultaneously. Please select one of them."; + } + + // initialise bit masks + setBits(maskTopologicalV0, {selV0CosPA, selDCANegToPV, selDCAPosToPV, selDCAV0Dau, selV0Radius, selV0RadiusMax}); + setBits(maskTopologicalCasc, {selCascCosPA, selDCACascDau, selCascRadius, selCascRadiusMax, selBachToPV, selMesonToPV, selBaryonToPV, + selDCAV0ToPV, selV0CosPA, selDCAV0Dau, selV0Radius, selV0RadiusMax, selLambdaMassWin}); + + if (doBachelorBaryonCut) + maskTopologicalCasc.set(selBachBaryon); + + setBits(maskKinematicV0, {selPosEta, selNegEta}); + setBits(maskKinematicCasc, {selPosEta, selNegEta, selBachEta}); + + if (doDaughterDCA) { + maskKinematicV0.set(selDauDCA); + maskKinematicCasc.set(selDauDCA); + } + + // Specific masks + setBits(maskK0ShortSpecific, {selK0ShortRapidity, selK0ShortCTau, selK0ShortArmenteros, selConsiderK0Short}); + setBits(maskLambdaSpecific, {selLambdaRapidity, selLambdaCTau, selConsiderLambda}); + setBits(maskAntiLambdaSpecific, {selLambdaRapidity, selLambdaCTau, selConsiderAntiLambda}); + setBits(maskXiSpecific, {selXiRapidity, selXiCTau, selRejCompXi, selMassWinXi, selConsiderXi}); + setBits(maskAntiXiSpecific, {selXiRapidity, selXiCTau, selRejCompXi, selMassWinXi, selConsiderAntiXi}); + setBits(maskOmegaSpecific, {selOmegaRapidity, selOmegaCTau, selRejCompOmega, selMassWinOmega, selConsiderOmega}); + setBits(maskAntiOmegaSpecific, {selOmegaRapidity, selOmegaCTau, selRejCompOmega, selMassWinOmega, selConsiderAntiOmega}); + + // ask for specific TPC/TOF PID selections + // positive track + if (TrackConfigurations.requirePosITSonly) { + setBits(maskTrackPropertiesV0, {selPosItsOnly, selPosGoodITSTrack}); + } else { + setBits(maskTrackPropertiesV0, {selPosGoodTPCTrack, selPosGoodITSTrack}); + // TPC signal is available: ask for positive track PID + if (PIDConfigurations.tpcPidNsigmaCut < 1e+5) { // safeguard for no cut + maskK0ShortSpecific.set(selTPCPIDPositivePion); + maskLambdaSpecific.set(selTPCPIDPositiveProton); + maskAntiLambdaSpecific.set(selTPCPIDPositivePion); + + maskXiSpecific.set(selTPCPIDPositiveProton); + maskAntiXiSpecific.set(selTPCPIDPositivePion); + maskOmegaSpecific.set(selTPCPIDPositiveProton); + maskAntiOmegaSpecific.set(selTPCPIDPositivePion); + } + // TOF PID + if (PIDConfigurations.tofPidNsigmaCutK0Pi < 1e+5) { // safeguard for no cut + setBits(maskK0ShortSpecific, {selTOFNSigmaPositivePionK0Short, selTOFDeltaTPositivePionK0Short}); + } + if (PIDConfigurations.tofPidNsigmaCutLaPr < 1e+5) { // safeguard for no cut + setBits(maskLambdaSpecific, {selTOFNSigmaPositiveProtonLambda, selTOFDeltaTPositiveProtonLambda}); + setBits(maskXiSpecific, {selTOFNSigmaPositiveProtonLambdaXi, selTOFDeltaTPositiveProtonLambdaXi}); + setBits(maskOmegaSpecific, {selTOFNSigmaPositiveProtonLambdaOmega, selTOFDeltaTPositiveProtonLambdaOmega}); + } + if (PIDConfigurations.tofPidNsigmaCutLaPi < 1e+5) { // safeguard for no cut + setBits(maskAntiLambdaSpecific, {selTOFNSigmaPositivePionLambda, selTOFDeltaTPositivePionLambda}); + setBits(maskAntiXiSpecific, {selTOFNSigmaPositivePionLambdaXi, selTOFDeltaTPositivePionLambdaXi}); + setBits(maskAntiOmegaSpecific, {selTOFNSigmaPositivePionLambdaOmega, selTOFDeltaTPositivePionLambdaOmega}); + } + } + // negative track + if (TrackConfigurations.requireNegITSonly) { + setBits(maskTrackPropertiesV0, {selNegItsOnly, selNegGoodITSTrack}); + } else { + setBits(maskTrackPropertiesV0, {selNegGoodTPCTrack, selNegGoodITSTrack}); + // TPC signal is available: ask for negative track PID + if (PIDConfigurations.tpcPidNsigmaCut < 1e+5) { // safeguard for no cut + maskK0ShortSpecific.set(selTPCPIDNegativePion); + maskLambdaSpecific.set(selTPCPIDNegativePion); + maskAntiLambdaSpecific.set(selTPCPIDNegativeProton); + + maskXiSpecific.set(selTPCPIDNegativePion); + maskAntiXiSpecific.set(selTPCPIDPositiveProton); + maskOmegaSpecific.set(selTPCPIDNegativePion); + maskAntiOmegaSpecific.set(selTPCPIDPositiveProton); + } + // TOF PID + if (PIDConfigurations.tofPidNsigmaCutK0Pi < 1e+5) { // safeguard for no cut + setBits(maskK0ShortSpecific, {selTOFNSigmaNegativePionK0Short, selTOFDeltaTNegativePionK0Short}); + } + if (PIDConfigurations.tofPidNsigmaCutLaPr < 1e+5) { // safeguard for no cut + setBits(maskAntiLambdaSpecific, {selTOFNSigmaNegativeProtonLambda, selTOFDeltaTNegativeProtonLambda}); + setBits(maskAntiXiSpecific, {selTOFNSigmaNegativeProtonLambdaXi, selTOFDeltaTNegativeProtonLambdaXi}); + setBits(maskAntiOmegaSpecific, {selTOFNSigmaNegativeProtonLambdaOmega, selTOFDeltaTNegativeProtonLambdaOmega}); + } + if (PIDConfigurations.tofPidNsigmaCutLaPi < 1e+5) { // safeguard for no cut + setBits(maskLambdaSpecific, {selTOFNSigmaNegativePionLambda, selTOFDeltaTNegativePionLambda}); + setBits(maskXiSpecific, {selTOFNSigmaNegativePionLambdaXi, selTOFDeltaTNegativePionLambdaXi}); + setBits(maskOmegaSpecific, {selTOFNSigmaNegativePionLambdaOmega, selTOFDeltaTNegativePionLambdaOmega}); + } + } + // bachelor track + maskTrackPropertiesCasc = maskTrackPropertiesV0; + if (TrackConfigurations.requireBachITSonly) { + setBits(maskTrackPropertiesCasc, {selBachItsOnly, selBachGoodITSTrack}); + } else { + setBits(maskTrackPropertiesCasc, {selBachGoodTPCTrack, selBachGoodITSTrack}); + // TPC signal is available: ask for positive track PID + if (PIDConfigurations.tpcPidNsigmaCut < 1e+5) { // safeguard for no cut + maskXiSpecific.set(selTPCPIDBachPion); + maskAntiXiSpecific.set(selTPCPIDBachPion); + maskOmegaSpecific.set(selTPCPIDBachKaon); + maskAntiOmegaSpecific.set(selTPCPIDBachKaon); + } + // TOF PID + if (PIDConfigurations.tofPidNsigmaCutXiPi < 1e+5) { // safeguard for no cut + setBits(maskXiSpecific, {selTOFNSigmaBachPionXi, selTOFDeltaTBachPionXi}); + setBits(maskAntiXiSpecific, {selTOFNSigmaBachPionXi, selTOFDeltaTBachPionXi}); + } + if (PIDConfigurations.tofPidNsigmaCutOmegaKaon < 1e+5) { // safeguard for no cut + setBits(maskOmegaSpecific, {selTOFNSigmaBachKaonOmega, selTOFDeltaTBachKaonOmega}); + setBits(maskAntiOmegaSpecific, {selTOFNSigmaBachKaonOmega, selTOFDeltaTBachKaonOmega}); + } + } + + if (TrackConfigurations.skipTPConly) { + setBits(maskK0ShortSpecific, {selPosNotTPCOnly, selNegNotTPCOnly}); + setBits(maskLambdaSpecific, {selPosNotTPCOnly, selNegNotTPCOnly}); + setBits(maskAntiLambdaSpecific, {selPosNotTPCOnly, selNegNotTPCOnly}); + setBits(maskXiSpecific, {selPosNotTPCOnly, selNegNotTPCOnly, selBachNotTPCOnly}); + setBits(maskOmegaSpecific, {selPosNotTPCOnly, selNegNotTPCOnly, selBachNotTPCOnly}); + setBits(maskAntiXiSpecific, {selPosNotTPCOnly, selNegNotTPCOnly, selBachNotTPCOnly}); + setBits(maskAntiOmegaSpecific, {selPosNotTPCOnly, selNegNotTPCOnly, selBachNotTPCOnly}); + } + + // Primary particle selection, central to analysis + maskSelectionK0Short = maskTopologicalV0 | maskKinematicV0 | maskTrackPropertiesV0 | maskK0ShortSpecific | (std::bitset(1) << selPhysPrimK0Short); + maskSelectionLambda = maskTopologicalV0 | maskKinematicV0 | maskTrackPropertiesV0 | maskLambdaSpecific | (std::bitset(1) << selPhysPrimLambda); + maskSelectionAntiLambda = maskTopologicalV0 | maskKinematicV0 | maskTrackPropertiesV0 | maskAntiLambdaSpecific | (std::bitset(1) << selPhysPrimAntiLambda); + maskSelectionXi = maskTopologicalCasc | maskKinematicCasc | maskTrackPropertiesCasc | maskXiSpecific | (std::bitset(1) << selPhysPrimXi); + maskSelectionAntiXi = maskTopologicalCasc | maskKinematicCasc | maskTrackPropertiesCasc | maskAntiXiSpecific | (std::bitset(1) << selPhysPrimAntiXi); + maskSelectionOmega = maskTopologicalCasc | maskKinematicCasc | maskTrackPropertiesCasc | maskOmegaSpecific | (std::bitset(1) << selPhysPrimOmega); + maskSelectionAntiOmega = maskTopologicalCasc | maskKinematicCasc | maskTrackPropertiesCasc | maskAntiOmegaSpecific | (std::bitset(1) << selPhysPrimAntiOmega); + + // Event Counter + histos.add("eventQA/hEventSelection", "hEventSelection", kTH1F, {{16, -0.5f, +15.5f}}); + histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(1, "All collisions"); + histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(2, "kIsTriggerTVX"); + histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(3, "posZ cut"); + histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(4, "kNoITSROFrameBorder"); + histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(5, "kNoTimeFrameBorder"); + histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(6, "kIsVertexITSTPC"); + histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(7, "kIsGoodZvtxFT0vsPV"); + histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(8, "kIsVertexTOFmatched"); + histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(9, "kIsVertexTRDmatched"); + histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(10, "kNoSameBunchPileup"); + histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(11, "kNoCollInTimeRangeStd"); + histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(12, "kNoCollInTimeRangeNarrow"); + histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(13, "Below min occup."); + histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(14, "Above max occup."); + histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(15, "isUPC"); + histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(16, "has UPC flag"); + + // Event QA + histos.add("eventQA/hCentrality", "hCentrality", kTH2F, {axisFT0Cqa, axisSelGap}); + histos.add("eventQA/hCentralityVsTracksPVeta1", "hCentralityVsTracksPVeta1", kTH3F, {axisFT0Cqa, axisNTracksPVeta1, axisSelGap}); + histos.add("eventQA/hCentralityVsTracksTotalExceptITSonly", "hCentralityVsTracksTotalExceptITSonly", kTH3F, {axisFT0Cqa, axisNTracksTotalExceptITSonly, axisSelGap}); + histos.add("eventQA/hOccupancy", "hOccupancy", kTH2F, {axisOccupancy, axisSelGap}); + histos.add("eventQA/hCentralityVsOccupancy", "hCentralityVsOccupancy", kTH3F, {axisFT0Cqa, axisOccupancy, axisSelGap}); + histos.add("eventQA/hTracksPVeta1VsTracksGlobal", "hTracksPVeta1VsTracksGlobal", kTH3F, {axisNTracksPVeta1, axisNTracksGlobal, axisSelGap}); + histos.add("eventQA/hCentralityVsTracksGlobal", "hCentralityVsTracksGlobal", kTH3F, {axisFT0Cqa, axisNTracksGlobal, axisSelGap}); + histos.add("eventQA/hGapSide", "Gap side; Entries", kTH1F, {{5, -0.5, 4.5}}); + histos.add("eventQA/hSelGapSide", "Selected gap side; Entries", kTH1F, {axisSelGap}); + histos.add("eventQA/hPosX", "Vertex position in x", kTH2F, {{100, -0.1, 0.1}, axisSelGap}); + histos.add("eventQA/hPosY", "Vertex position in y", kTH2F, {{100, -0.1, 0.1}, axisSelGap}); + histos.add("eventQA/hPosZ", "Vertex position in z", kTH2F, {{100, -20., 20.}, axisSelGap}); + histos.add("eventQA/hFT0", "hFT0", kTH3F, {axisDetectors.axisFT0Aampl, axisDetectors.axisFT0Campl, axisSelGap}); + histos.add("eventQA/hFDD", "hFDD", kTH3F, {axisDetectors.axisFDDAampl, axisDetectors.axisFDDCampl, axisSelGap}); + histos.add("eventQA/hZN", "hZN", kTH3F, {axisDetectors.axisZNAampl, axisDetectors.axisZNCampl, axisSelGap}); + + if (doprocessGenerated) { + // Event Counter + histos.add("eventQA/mc/hEventSelectionMC", "hEventSelectionMC", kTH1F, {{2, -0.5f, +1.5f}}); + histos.get(HIST("eventQA/mc/hEventSelectionMC"))->GetXaxis()->SetBinLabel(1, "All collisions"); + histos.get(HIST("eventQA/mc/hEventSelectionMC"))->GetXaxis()->SetBinLabel(2, "posZ cut"); + + histos.add("eventQA/mc/hMCNParticlesEta10", "hMCNParticlesEta10", kTH2F, {axisNTracksPVeta1, {2, -0.5, 1.5}}); + histos.add("eventQA/mc/hTracksGlobalvsMCNParticlesEta10gen", "hTracksGlobalvsMCNParticlesEta10gen", kTH2F, {axisNTracksGlobal, axisNTracksPVeta1}); + histos.add("eventQA/mc/hTracksGlobalVsNcoll_beforeEvSel", "hTracksGlobalVsNcoll_beforeEvSel", kTH2F, {axisNTracksGlobal, axisNAssocColl}); + histos.add("eventQA/mc/hTracksGlobalVsNcoll_afterEvSel", "hTracksGlobalVsNcoll_afterEvSel", kTH2F, {axisNTracksGlobal, axisNAssocColl}); + histos.add("eventQA/mc/hTracksGlobalVsPVzMC", "hTracksGlobalVsPVzMC", kTH2F, {axisNTracksGlobal, {100, -20., 20.}}); + histos.add("eventQA/mc/hEventPVzMC", "hEventPVzMC", kTH1F, {{100, -20., 20.}}); + histos.add("eventQA/mc/hGenEventCentrality", "hGenEventCentrality", kTH1F, {axisFT0Cqa}); + } + + if (doprocessV0sMC) { + // Event QA + histos.add("eventQA/mc/hFakeEvents", "hFakeEvents", {kTH1F, {{1, -0.5f, 0.5f}}}); + histos.add("eventQA/mc/hNTracksGlobalvsMCNParticlesEta10rec", "hNTracksGlobalvsMCNParticlesEta10rec", kTH2F, {axisNTracksGlobal, axisNTracksPVeta1}); + histos.add("eventQA/mc/hNTracksPVeta1vsMCNParticlesEta10rec", "hNTracksPVeta1vsMCNParticlesEta10rec", kTH2F, {axisNTracksPVeta1, axisNTracksPVeta1}); + histos.add("eventQA/mc/hNTracksGlobalvstotalMultMCParticles", "hNTracksGlobalvstotalMultMCParticles", kTH2F, {axisNTracksGlobal, axisNchInvMass}); + histos.add("eventQA/mc/hNTracksPVeta1vstotalMultMCParticles", "hNTracksPVeta1vstotalMultMCParticles", kTH2F, {axisNTracksPVeta1, axisNchInvMass}); + } + + if (doprocessGenerated) { + for (int partID = 0; partID <= 6; partID++) { + histos.add(Form("%s/mc/h6dGen", kParticlenames[partID].data()), "h6dGen", kTHnSparseF, {axisFT0Cqa, axisNchInvMass, axisNchInvMass, axisPt, axisSelGap, axisRap}); + } + } + + if (doprocessV0s || doprocessV0sMC) { + // For all candidates + if (doPlainTopoQA) { + histos.add("generalQA/hPt", "hPt", kTH1F, {axisPtCoarse}); + histos.add("generalQA/hPosDCAToPV", "hPosDCAToPV", kTH1F, {axisDCAtoPV}); + histos.add("generalQA/hNegDCAToPV", "hNegDCAToPV", kTH1F, {axisDCAtoPV}); + histos.add("generalQA/hDCADaughters", "hDCADaughters", kTH1F, {axisDCAdau}); + histos.add("generalQA/hPointingAngle", "hPointingAngle", kTH1F, {axisPointingAngle}); + histos.add("generalQA/hV0Radius", "hV0Radius", kTH1F, {axisV0Radius}); + histos.add("generalQA/h2dPositiveITSvsTPCpts", "h2dPositiveITSvsTPCpts", kTH2F, {axisTPCrows, axisITSclus}); + histos.add("generalQA/h2dNegativeITSvsTPCpts", "h2dNegativeITSvsTPCpts", kTH2F, {axisTPCrows, axisITSclus}); + histos.add("generalQA/h2dArmenterosAll", "h2dArmenterosAll", kTH2F, {axisAPAlpha, axisAPQt}); + histos.add("generalQA/h2dArmenterosSelected", "h2dArmenterosSelected", kTH2F, {axisAPAlpha, axisAPQt}); + } + + // K0s + if (analyseK0Short) { + addHistograms<0>(histos); + } + + // Lambda + if (analyseLambda) { + addHistograms<1>(histos); + } + + // Anti-Lambda + if (analyseAntiLambda) { + addHistograms<2>(histos); + } + } + + if (doprocessCascades) { + // For all candidates + if (doPlainTopoQA) { + histos.add("generalQA/hPt", "hPt", kTH1F, {axisPtCoarse}); + histos.add("generalQA/hCascCosPA", "hCascCosPA", kTH2F, {axisPtCoarse, {100, 0.9f, 1.0f}}); + histos.add("generalQA/hDCACascDaughters", "hDCACascDaughters", kTH2F, {axisPtCoarse, {44, 0.0f, 2.2f}}); + histos.add("generalQA/hCascRadius", "hCascRadius", kTH2D, {axisPtCoarse, {500, 0.0f, 50.0f}}); + histos.add("generalQA/hMesonDCAToPV", "hMesonDCAToPV", kTH2F, {axisPtCoarse, axisDCAtoPV}); + histos.add("generalQA/hBaryonDCAToPV", "hBaryonDCAToPV", kTH2F, {axisPtCoarse, axisDCAtoPV}); + histos.add("generalQA/hBachDCAToPV", "hBachDCAToPV", kTH2F, {axisPtCoarse, {200, -1.0f, 1.0f}}); + histos.add("generalQA/hV0CosPA", "hV0CosPA", kTH2F, {axisPtCoarse, {100, 0.9f, 1.0f}}); + histos.add("generalQA/hV0Radius", "hV0Radius", kTH2D, {axisPtCoarse, axisV0Radius}); + histos.add("generalQA/hDCAV0Daughters", "hDCAV0Daughters", kTH2F, {axisPtCoarse, axisDCAdau}); + histos.add("generalQA/hDCAV0ToPV", "hDCAV0ToPV", kTH2F, {axisPtCoarse, {44, 0.0f, 2.2f}}); + histos.add("generalQA/hMassLambdaDau", "hMassLambdaDau", kTH2F, {axisPtCoarse, axisLambdaMass}); + histos.add("generalQA/h2dPositiveITSvsTPCpts", "h2dPositiveITSvsTPCpts", kTH2F, {axisTPCrows, axisITSclus}); + histos.add("generalQA/h2dNegativeITSvsTPCpts", "h2dNegativeITSvsTPCpts", kTH2F, {axisTPCrows, axisITSclus}); + histos.add("generalQA/h2dBachITSvsTPCpts", "h2dBachITSvsTPCpts", kTH2F, {axisTPCrows, axisITSclus}); + } + + // Xi + if (analyseXi) { + addHistograms<3>(histos); + } + + // Anti-Xi + if (analyseAntiXi) { + addHistograms<4>(histos); + } + + // Omega + if (analyseOmega) { + addHistograms<5>(histos); + } + + // Anti-Omega + if (analyseAntiOmega) { + addHistograms<6>(histos); + } + } + + if (verbose) { + histos.print(); + } + } + + template + int getGapSide(TCollision const& collision) + { + int selGapSide = sgSelector.trueGap(collision, upcCuts.fv0a, upcCuts.ft0a, upcCuts.ft0c, upcCuts.zdc); + histos.fill(HIST("eventQA/hGapSide"), collision.gapSide()); + histos.fill(HIST("eventQA/hSelGapSide"), selGapSide); + histos.fill(HIST("eventQA/hFT0"), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), selGapSide); + histos.fill(HIST("eventQA/hFDD"), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), selGapSide); + histos.fill(HIST("eventQA/hZN"), collision.energyCommonZNA(), collision.energyCommonZNC(), selGapSide); + return selGapSide; + } + + template + void fillHistogramsQA(TCollision const& collision, int const& gap) + { + // QA histograms + float centrality = collision.centFT0C(); + histos.fill(HIST("eventQA/hCentrality"), centrality, gap); + histos.fill(HIST("eventQA/hCentralityVsTracksTotalExceptITSonly"), centrality, collision.multAllTracksTPCOnly() + collision.multAllTracksITSTPC(), gap); + histos.fill(HIST("eventQA/hCentralityVsTracksPVeta1"), centrality, collision.multNTracksPVeta1(), gap); + histos.fill(HIST("eventQA/hOccupancy"), collision.trackOccupancyInTimeRange(), gap); + histos.fill(HIST("eventQA/hCentralityVsOccupancy"), centrality, collision.trackOccupancyInTimeRange(), gap); + histos.fill(HIST("eventQA/hTracksPVeta1VsTracksGlobal"), collision.multNTracksPVeta1(), collision.multNTracksGlobal(), gap); + histos.fill(HIST("eventQA/hCentralityVsTracksGlobal"), centrality, collision.multNTracksGlobal(), gap); + histos.fill(HIST("eventQA/hPosX"), collision.posX(), gap); + histos.fill(HIST("eventQA/hPosY"), collision.posY(), gap); + histos.fill(HIST("eventQA/hPosZ"), collision.posZ(), gap); + } + + template + bool acceptEvent(TCollision const& collision, bool fillQA) + { + struct SelectionCheck { + bool selection; + bool condition; + float qaBin; + }; + + const std::array checks = {{ + {true, true, 0.0}, // All collisions + {requireIsTriggerTVX, collision.selection_bit(aod::evsel::kIsTriggerTVX), 1.0}, // Triggered by FT0M + {true, std::fabs(collision.posZ()) <= 10.f, 2.0}, // Vertex-Z selected + {rejectITSROFBorder, collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder), 3.0}, // Not at ITS ROF border + {rejectTFBorder, collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder), 4.0}, // Not at TF border + {requireIsVertexITSTPC, collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC), 5.0}, // At least one ITS-TPC track + {requireIsGoodZvtxFT0VsPV, collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV), 6.0}, // PV position consistency + {requireIsVertexTOFmatched, collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched), 7.0}, // PV with TOF match + {requireIsVertexTRDmatched, collision.selection_bit(o2::aod::evsel::kIsVertexTRDmatched), 8.0}, // PV with TRD match + {rejectSameBunchPileup, collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup), 9.0}, // No same-bunch pileup + {requireNoCollInTimeRangeStd, collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard), 10.0}, // No collision within +-10 µs + {requireNoCollInTimeRangeNarrow, collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeNarrow), 11.0}, // No collision within +-4 µs + {minOccupancy >= 0, collision.trackOccupancyInTimeRange() >= minOccupancy, 12.0}, // Above min occupancy + {maxOccupancy > 0, collision.trackOccupancyInTimeRange() < maxOccupancy, 13.0}, // Below max occupancy + {studyUPConly, collision.isUPC(), 14.0}, // Study UPC collisions only + }}; + + for (const auto& check : checks) { + if (check.selection && !check.condition) { + return false; + } + if (fillQA && check.selection) { + histos.fill(HIST("eventQA/hEventSelection"), check.qaBin); + } + } + + // Additional check for UPC collision flag + if (useUPCflag && collision.flags() < 1) { + return false; + } + if (collision.flags() >= 1 && fillQA) { + histos.fill(HIST("eventQA/hEventSelection"), 15.0); // UPC event + } + + return true; + } + + bool verifyMask(std::bitset bitmap, std::bitset mask) + { + return (bitmap & mask) == mask; + } + + int computeITSclusBitmap(uint8_t itsClusMap, bool fromAfterburner) + { + int bitMap = 0; + + struct MaskBitmapPair { + uint8_t mask; + int bitmap; + int afterburnerBitmap; + }; + + constexpr MaskBitmapPair kConfigs[] = { + // L6 <-- L0 + {0x7F, 12, 12}, // 01111 111 (L0 to L6) + {0x7E, 11, 11}, // 01111 110 (L1 to L6) + {0x7C, 10, 10}, // 01111 100 (L2 to L6) + {0x78, 9, -3}, // 01111 000 (L3 to L6) + {0x70, 8, -2}, // 01110 000 (L4 to L6) + {0x60, 7, -1}, // 01100 000 (L5 to L6) + {0x3F, 6, 6}, // 00111 111 (L0 to L5) + {0x3E, 5, 5}, // 00111 110 (L1 to L5) + {0x3C, 4, 4}, // 00111 100 (L2 to L5) + {0x1F, 3, 3}, // 00011 111 (L0 to L4) + {0x1E, 2, 2}, // 00011 110 (L1 to L4) + {0x0F, 1, 1}, // 00001 111 (L0 to L3) + }; + + for (const auto& config : kConfigs) { + if (verifyMask(itsClusMap, config.mask)) { + bitMap = fromAfterburner ? config.afterburnerBitmap : config.bitmap; + break; + } + } + + return bitMap; + } + + uint computeDetBitmap(uint8_t detMap) + { + uint bitMap = 0; + + struct MaskBitmapPair { + uint8_t mask; + int bitmap; + }; + + constexpr MaskBitmapPair kConfigs[] = { + {o2::aod::track::ITS | o2::aod::track::TPC | o2::aod::track::TRD | o2::aod::track::TOF, 4}, // ITS-TPC-TRD-TOF + {o2::aod::track::ITS | o2::aod::track::TPC | o2::aod::track::TOF, 3}, // ITS-TPC-TOF + {o2::aod::track::ITS | o2::aod::track::TPC | o2::aod::track::TRD, 2}, // ITS-TPC-TRD + {o2::aod::track::ITS | o2::aod::track::TPC, 1} // ITS-TPC + }; + + for (const auto& config : kConfigs) { + if (verifyMask(detMap, config.mask)) { + bitMap = config.bitmap; + break; + } + } + + return bitMap; + } + + template + std::bitset computeBitmapCascade(TCasc const& casc, TCollision const& coll) + { + float rapidityXi = casc.yXi(); + float rapidityOmega = casc.yOmega(); + + // Access daughter tracks + auto posTrackExtra = casc.template posTrackExtra_as(); + auto negTrackExtra = casc.template negTrackExtra_as(); + auto bachTrackExtra = casc.template bachTrackExtra_as(); + + // c x tau + float decayPos = std::hypot(casc.x() - coll.posX(), casc.y() - coll.posY(), casc.z() - coll.posZ()); + float totalMom = std::hypot(casc.px(), casc.py(), casc.pz()); + float ctauXi = totalMom != 0 ? o2::constants::physics::MassXiMinus * decayPos / totalMom : 1e6; + float ctauOmega = totalMom != 0 ? o2::constants::physics::MassOmegaMinus * decayPos / totalMom : 1e6; + + std::bitset bitMap = 0; + + if (casc.casccosPA(coll.posX(), coll.posY(), coll.posZ()) > casccuts.casccospa) + bitMap.set(selCascCosPA); + if (casc.dcacascdaughters() < casccuts.dcacascdau) + bitMap.set(selDCACascDau); + if (casc.cascradius() > casccuts.cascradius) + bitMap.set(selCascRadius); + if (casc.cascradius() < casccuts.cascradiusMax) + bitMap.set(selCascRadiusMax); + if (doBachelorBaryonCut && (casc.bachBaryonCosPA() < casccuts.bachbaryoncospa) && (std::fabs(casc.bachBaryonDCAxyToPV()) > casccuts.bachbaryondcaxytopv)) + bitMap.set(selBachBaryon); + if (std::fabs(casc.dcabachtopv()) > casccuts.dcabachtopv) + bitMap.set(selBachToPV); + + if (casc.sign() > 0) { + if (std::fabs(casc.dcanegtopv()) > casccuts.dcabaryontopv) + bitMap.set(selBaryonToPV); + if (std::fabs(casc.dcapostopv()) > casccuts.dcamesontopv) + bitMap.set(selMesonToPV); + } else { // no sign == 0, in principle + if (std::fabs(casc.dcapostopv()) > casccuts.dcabaryontopv) + bitMap.set(selBaryonToPV); + if (std::fabs(casc.dcanegtopv()) > casccuts.dcamesontopv) + bitMap.set(selMesonToPV); + } + + if (std::fabs(casc.mXi() - o2::constants::physics::MassXiMinus) < casccuts.masswin) + bitMap.set(selMassWinXi); + if (std::fabs(casc.mOmega() - o2::constants::physics::MassOmegaMinus) < casccuts.masswin) + bitMap.set(selMassWinOmega); + if (std::fabs(casc.mLambda() - o2::constants::physics::MassLambda0) < casccuts.lambdamasswin) + bitMap.set(selLambdaMassWin); + + if (std::fabs(casc.dcav0topv(coll.posX(), coll.posY(), coll.posZ())) > casccuts.dcav0topv) + bitMap.set(selDCAV0ToPV); + if (casc.v0radius() > v0cuts.v0radius) + bitMap.set(selV0Radius); + if (casc.v0radius() < v0cuts.v0radiusMax) + bitMap.set(selV0RadiusMax); + if (casc.v0cosPA(coll.posX(), coll.posY(), coll.posZ()) > v0cuts.v0cospa) + bitMap.set(selV0CosPA); + if (casc.dcaV0daughters() < v0cuts.dcav0dau) + bitMap.set(selDCAV0Dau); + + // proper lifetime + if (ctauXi < nCtauCutCasc->get("lifetimecutXi") * ctauxiPDG) + bitMap.set(selXiCTau); + if (ctauOmega < nCtauCutCasc->get("lifetimecutOmega") * ctauomegaPDG) + bitMap.set(selOmegaCTau); + + auto poseta = RecoDecay::eta(std::array{casc.pxpos(), casc.pypos(), casc.pzpos()}); + auto negeta = RecoDecay::eta(std::array{casc.pxneg(), casc.pyneg(), casc.pzneg()}); + auto bacheta = RecoDecay::eta(std::array{casc.pxbach(), casc.pybach(), casc.pzbach()}); + + // kinematic + if (std::fabs(rapidityXi) < rapidityCut) + bitMap.set(selXiRapidity); + if (std::fabs(rapidityOmega) < rapidityCut) + bitMap.set(selOmegaRapidity); + if (std::fabs(poseta) < daughterEtaCut) + bitMap.set(selNegEta); + if (std::fabs(negeta) < daughterEtaCut) + bitMap.set(selPosEta); + if (std::fabs(bacheta) < daughterEtaCut) + bitMap.set(selBachEta); + + // DCA cuts + auto pospt = std::sqrt(std::pow(casc.pxpos(), 2) + std::pow(casc.pypos(), 2)); + auto negpt = std::sqrt(std::pow(casc.pxneg(), 2) + std::pow(casc.pyneg(), 2)); + auto bachpt = std::sqrt(std::pow(casc.pxbach(), 2) + std::pow(casc.pybach(), 2)); + + double posDcaXYLimit = 0.0105f + 0.035f / std::pow(pospt, 1.1f); + double negDcaXYLimit = 0.0105f + 0.035f / std::pow(negpt, 1.1f); + double bachDcaXYLimit = 0.0105f + 0.035f / std::pow(bachpt, 1.1f); + + // TODO: separate xy and z // + if ((std::abs(casc.dcapostopv()) > posDcaXYLimit) && + (std::abs(casc.dcanegtopv()) > negDcaXYLimit) && + (std::abs(casc.dcabachtopv()) > bachDcaXYLimit)) { + bitMap.set(selDauDCA); + } + + // ITS quality flags + if (posTrackExtra.itsNCls() >= TrackConfigurations.minITSclusters) + bitMap.set(selPosGoodITSTrack); + if (negTrackExtra.itsNCls() >= TrackConfigurations.minITSclusters) + bitMap.set(selNegGoodITSTrack); + if (bachTrackExtra.itsNCls() >= TrackConfigurations.minITSclusters) + bitMap.set(selBachGoodITSTrack); + + // TPC quality flags + if (posTrackExtra.tpcCrossedRows() >= TrackConfigurations.minTPCrows) + bitMap.set(selPosGoodTPCTrack); + if (negTrackExtra.tpcCrossedRows() >= TrackConfigurations.minTPCrows) + bitMap.set(selNegGoodTPCTrack); + if (bachTrackExtra.tpcCrossedRows() >= TrackConfigurations.minTPCrows) + bitMap.set(selBachGoodTPCTrack); + + // TPC PID + // positive track + if (std::fabs(posTrackExtra.tpcNSigmaPi()) < PIDConfigurations.tpcPidNsigmaCut) + bitMap.set(selTPCPIDPositivePion); + if (std::fabs(posTrackExtra.tpcNSigmaPr()) < PIDConfigurations.tpcPidNsigmaCut) + bitMap.set(selTPCPIDPositiveProton); + // negative track + if (std::fabs(negTrackExtra.tpcNSigmaPi()) < PIDConfigurations.tpcPidNsigmaCut) + bitMap.set(selTPCPIDNegativePion); + if (std::fabs(negTrackExtra.tpcNSigmaPr()) < PIDConfigurations.tpcPidNsigmaCut) + bitMap.set(selTPCPIDNegativeProton); + // bachelor track + if (std::fabs(bachTrackExtra.tpcNSigmaPi()) < PIDConfigurations.tpcPidNsigmaCut) + bitMap.set(selTPCPIDBachPion); + if (std::fabs(bachTrackExtra.tpcNSigmaKa()) < PIDConfigurations.tpcPidNsigmaCut) + bitMap.set(selTPCPIDBachKaon); + + // TOF PID in DeltaT + // positive track + if (std::fabs(casc.posTOFDeltaTXiPr()) < PIDConfigurations.maxDeltaTimeProton) + bitMap.set(selTOFDeltaTPositiveProtonLambdaXi); + if (std::fabs(casc.posTOFDeltaTXiPi()) < PIDConfigurations.maxDeltaTimePion) + bitMap.set(selTOFDeltaTPositivePionLambdaXi); + if (std::fabs(casc.posTOFDeltaTOmPr()) < PIDConfigurations.maxDeltaTimeProton) + bitMap.set(selTOFDeltaTPositiveProtonLambdaOmega); + if (std::fabs(casc.posTOFDeltaTOmPi()) < PIDConfigurations.maxDeltaTimePion) + bitMap.set(selTOFDeltaTPositivePionLambdaOmega); + // negative track + if (std::fabs(casc.negTOFDeltaTXiPr()) < PIDConfigurations.maxDeltaTimeProton) + bitMap.set(selTOFDeltaTNegativeProtonLambdaXi); + if (std::fabs(casc.negTOFDeltaTXiPi()) < PIDConfigurations.maxDeltaTimePion) + bitMap.set(selTOFDeltaTNegativePionLambdaXi); + if (std::fabs(casc.negTOFDeltaTOmPr()) < PIDConfigurations.maxDeltaTimeProton) + bitMap.set(selTOFDeltaTNegativeProtonLambdaOmega); + if (std::fabs(casc.negTOFDeltaTOmPi()) < PIDConfigurations.maxDeltaTimePion) + bitMap.set(selTOFDeltaTNegativePionLambdaOmega); + // bachelor track + if (std::fabs(casc.bachTOFDeltaTOmKa()) < PIDConfigurations.maxDeltaTimeKaon) + bitMap.set(selTOFDeltaTBachKaonOmega); + if (std::fabs(casc.bachTOFDeltaTXiPi()) < PIDConfigurations.maxDeltaTimePion) + bitMap.set(selTOFDeltaTBachPionXi); + + // TOF PID in NSigma + // meson track + if (std::fabs(casc.tofNSigmaXiLaPi()) < PIDConfigurations.tofPidNsigmaCutLaPi) { + bitMap.set(selTOFNSigmaPositivePionLambdaXi); + bitMap.set(selTOFNSigmaNegativePionLambdaXi); + } + if (std::fabs(casc.tofNSigmaOmLaPi()) < PIDConfigurations.tofPidNsigmaCutLaPi) { + bitMap.set(selTOFNSigmaPositivePionLambdaOmega); + bitMap.set(selTOFNSigmaNegativePionLambdaOmega); + } + // baryon track + if (std::fabs(casc.tofNSigmaXiLaPr()) < PIDConfigurations.tofPidNsigmaCutLaPr) { + bitMap.set(selTOFNSigmaNegativeProtonLambdaXi); + bitMap.set(selTOFNSigmaPositiveProtonLambdaXi); + } + if (std::fabs(casc.tofNSigmaOmLaPr()) < PIDConfigurations.tofPidNsigmaCutLaPr) { + bitMap.set(selTOFNSigmaNegativePionLambdaOmega); + bitMap.set(selTOFNSigmaPositivePionLambdaOmega); + } + // bachelor track + if (std::fabs(casc.tofNSigmaXiPi()) < PIDConfigurations.tofPidNsigmaCutXiPi) { + bitMap.set(selTOFNSigmaBachPionXi); + } + if (std::fabs(casc.tofNSigmaOmKa()) < PIDConfigurations.tofPidNsigmaCutOmegaKaon) { + bitMap.set(selTOFNSigmaBachKaonOmega); + } + + // ITS only tag + if (posTrackExtra.tpcCrossedRows() < 1) + bitMap.set(selPosItsOnly); + if (negTrackExtra.tpcCrossedRows() < 1) + bitMap.set(selNegItsOnly); + if (bachTrackExtra.tpcCrossedRows() < 1) + bitMap.set(selBachItsOnly); + + // rej. comp. + if (std::fabs(casc.mOmega() - o2::constants::physics::MassOmegaMinus) > casccuts.rejcomp) + bitMap.set(selRejCompXi); + if (std::fabs(casc.mXi() - o2::constants::physics::MassXiMinus) > casccuts.rejcomp) + bitMap.set(selRejCompOmega); + + // TPC only tag + if (posTrackExtra.detectorMap() != o2::aod::track::TPC) + bitMap.set(selPosNotTPCOnly); + if (negTrackExtra.detectorMap() != o2::aod::track::TPC) + bitMap.set(selNegNotTPCOnly); + if (bachTrackExtra.detectorMap() != o2::aod::track::TPC) + bitMap.set(selBachNotTPCOnly); + + return bitMap; + } + + template + std::bitset computeBitmapV0(TV0 const& v0, TCollision const& collision) + { + float rapidityLambda = v0.yLambda(); + float rapidityK0Short = v0.yK0Short(); + + std::bitset bitMap = 0; + + // base topological variables + if (v0.v0radius() > v0cuts.v0radius) + bitMap.set(selV0Radius); + if (v0.v0radius() < v0cuts.v0radiusMax) + bitMap.set(selV0RadiusMax); + if (std::fabs(v0.dcapostopv()) > v0cuts.dcapostopv) + bitMap.set(selDCAPosToPV); + if (std::fabs(v0.dcanegtopv()) > v0cuts.dcanegtopv) + bitMap.set(selDCANegToPV); + if (v0.v0cosPA() > v0cuts.v0cospa) + bitMap.set(selV0CosPA); + if (v0.dcaV0daughters() < v0cuts.dcav0dau) + bitMap.set(selDCAV0Dau); + + // kinematic + if (std::fabs(rapidityLambda) < rapidityCut) + bitMap.set(selLambdaRapidity); + if (std::fabs(rapidityK0Short) < rapidityCut) + bitMap.set(selK0ShortRapidity); + if (std::fabs(v0.negativeeta()) < daughterEtaCut) + bitMap.set(selNegEta); + if (std::fabs(v0.positiveeta()) < daughterEtaCut) + bitMap.set(selPosEta); + + auto posTrackExtra = v0.template posTrackExtra_as(); + auto negTrackExtra = v0.template negTrackExtra_as(); + + // DCA cuts + auto pospt = std::sqrt(std::pow(v0.pxpos(), 2) + std::pow(v0.pypos(), 2)); + auto negpt = std::sqrt(std::pow(v0.pxneg(), 2) + std::pow(v0.pyneg(), 2)); + + double posDcaXYLimit = 0.0105f + 0.035f / std::pow(pospt, 1.1f); + double negDcaXYLimit = 0.0105f + 0.035f / std::pow(negpt, 1.1f); + + // TODO: separate xy and z // + if ((std::abs(v0.dcapostopv()) > posDcaXYLimit) && + (std::abs(v0.dcanegtopv()) > negDcaXYLimit)) { + bitMap.set(selDauDCA); + } + + // ITS quality flags + if (posTrackExtra.itsNCls() >= TrackConfigurations.minITSclusters) + bitMap.set(selPosGoodITSTrack); + if (negTrackExtra.itsNCls() >= TrackConfigurations.minITSclusters) + bitMap.set(selNegGoodITSTrack); + + // TPC quality flags + if (posTrackExtra.tpcCrossedRows() >= TrackConfigurations.minTPCrows) + bitMap.set(selPosGoodTPCTrack); + if (negTrackExtra.tpcCrossedRows() >= TrackConfigurations.minTPCrows) + bitMap.set(selNegGoodTPCTrack); + + // TPC PID + if (std::fabs(posTrackExtra.tpcNSigmaPi()) < PIDConfigurations.tpcPidNsigmaCut) + bitMap.set(selTPCPIDPositivePion); + if (std::fabs(posTrackExtra.tpcNSigmaPr()) < PIDConfigurations.tpcPidNsigmaCut) + bitMap.set(selTPCPIDPositiveProton); + if (std::fabs(negTrackExtra.tpcNSigmaPi()) < PIDConfigurations.tpcPidNsigmaCut) + bitMap.set(selTPCPIDNegativePion); + if (std::fabs(negTrackExtra.tpcNSigmaPr()) < PIDConfigurations.tpcPidNsigmaCut) + bitMap.set(selTPCPIDNegativeProton); + + // TOF PID in DeltaT + // positive track + if (std::fabs(v0.posTOFDeltaTLaPr()) < PIDConfigurations.maxDeltaTimeProton) + bitMap.set(selTOFDeltaTPositiveProtonLambda); + if (std::fabs(v0.posTOFDeltaTLaPi()) < PIDConfigurations.maxDeltaTimePion) + bitMap.set(selTOFDeltaTPositivePionLambda); + if (std::fabs(v0.posTOFDeltaTK0Pi()) < PIDConfigurations.maxDeltaTimePion) + bitMap.set(selTOFDeltaTPositivePionK0Short); + // negative track + if (std::fabs(v0.negTOFDeltaTLaPr()) < PIDConfigurations.maxDeltaTimeProton) + bitMap.set(selTOFDeltaTNegativeProtonLambda); + if (std::fabs(v0.negTOFDeltaTLaPi()) < PIDConfigurations.maxDeltaTimePion) + bitMap.set(selTOFDeltaTNegativePionLambda); + if (std::fabs(v0.negTOFDeltaTK0Pi()) < PIDConfigurations.maxDeltaTimePion) + bitMap.set(selTOFDeltaTNegativePionK0Short); + + // TOF PID in NSigma + // positive track + if (std::fabs(v0.tofNSigmaLaPr()) < PIDConfigurations.tofPidNsigmaCutLaPr) + bitMap.set(selTOFNSigmaPositiveProtonLambda); + if (std::fabs(v0.tofNSigmaALaPi()) < PIDConfigurations.tofPidNsigmaCutLaPi) + bitMap.set(selTOFNSigmaPositivePionLambda); + if (std::fabs(v0.tofNSigmaK0PiPlus()) < PIDConfigurations.tofPidNsigmaCutK0Pi) + bitMap.set(selTOFNSigmaPositivePionK0Short); + // negative track + if (std::fabs(v0.tofNSigmaALaPr()) < PIDConfigurations.tofPidNsigmaCutLaPr) + bitMap.set(selTOFNSigmaNegativeProtonLambda); + if (std::fabs(v0.tofNSigmaLaPi()) < PIDConfigurations.tofPidNsigmaCutLaPi) + bitMap.set(selTOFNSigmaNegativePionLambda); + if (std::fabs(v0.tofNSigmaK0PiMinus()) < PIDConfigurations.tofPidNsigmaCutK0Pi) + bitMap.set(selTOFNSigmaNegativePionK0Short); + + // ITS only tag + if (posTrackExtra.tpcCrossedRows() < 1) + bitMap.set(selPosItsOnly); + if (negTrackExtra.tpcCrossedRows() < 1) + bitMap.set(selNegItsOnly); + + // TPC only tag + if (posTrackExtra.detectorMap() != o2::aod::track::TPC) + bitMap.set(selPosNotTPCOnly); + if (negTrackExtra.detectorMap() != o2::aod::track::TPC) + bitMap.set(selNegNotTPCOnly); + + // proper lifetime + if (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0 < lifetimecutV0->get("lifetimecutLambda")) + bitMap.set(selLambdaCTau); + if (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutV0->get("lifetimecutK0S")) + bitMap.set(selK0ShortCTau); + + // armenteros + if (v0.qtarm() * v0cuts.armPodCut > std::fabs(v0.alpha()) || v0cuts.armPodCut < 1e-4) + bitMap.set(selK0ShortArmenteros); + + return bitMap; + } + + template + void analyseCascCandidate(TCasc const& casc, TCollision const& coll, int const& gap, std::bitset const& selMap) + { + // Access daughter tracks + auto posTrackExtra = casc.template posTrackExtra_as(); + auto negTrackExtra = casc.template negTrackExtra_as(); + auto bachTrackExtra = casc.template bachTrackExtra_as(); + + if (doPlainTopoQA) { + histos.fill(HIST("generalQA/hPt"), casc.pt()); + histos.fill(HIST("generalQA/hCascCosPA"), casc.pt(), casc.casccosPA(coll.posX(), coll.posY(), coll.posZ())); + histos.fill(HIST("generalQA/hDCACascDaughters"), casc.pt(), casc.dcacascdaughters()); + histos.fill(HIST("generalQA/hCascRadius"), casc.pt(), casc.cascradius()); + histos.fill(HIST("generalQA/hMesonDCAToPV"), casc.pt(), casc.dcanegtopv()); + histos.fill(HIST("generalQA/hBaryonDCAToPV"), casc.pt(), casc.dcapostopv()); + histos.fill(HIST("generalQA/hBachDCAToPV"), casc.pt(), casc.dcabachtopv()); + histos.fill(HIST("generalQA/hV0CosPA"), casc.pt(), casc.v0cosPA(coll.posX(), coll.posY(), coll.posZ())); + histos.fill(HIST("generalQA/hV0Radius"), casc.pt(), casc.v0radius()); + histos.fill(HIST("generalQA/hDCAV0Daughters"), casc.pt(), casc.dcaV0daughters()); + histos.fill(HIST("generalQA/hDCAV0ToPV"), casc.pt(), std::fabs(casc.dcav0topv(coll.posX(), coll.posY(), coll.posZ()))); + histos.fill(HIST("generalQA/hMassLambdaDau"), casc.pt(), casc.mLambda()); + histos.fill(HIST("generalQA/h2dPositiveITSvsTPCpts"), posTrackExtra.tpcCrossedRows(), posTrackExtra.itsNCls()); + histos.fill(HIST("generalQA/h2dNegativeITSvsTPCpts"), negTrackExtra.tpcCrossedRows(), negTrackExtra.itsNCls()); + histos.fill(HIST("generalQA/h2dBachITSvsTPCpts"), bachTrackExtra.tpcCrossedRows(), bachTrackExtra.itsNCls()); + } + + // Xi + if (verifyMask(selMap, maskSelectionXi) && analyseXi) { + fillHistogramsCasc<3>(casc, coll, gap); + } + + // Anti-Xi + if (verifyMask(selMap, maskSelectionAntiXi) && analyseAntiXi) { + fillHistogramsCasc<4>(casc, coll, gap); + } + + // Omega + if (verifyMask(selMap, maskSelectionOmega) && analyseOmega) { + fillHistogramsCasc<5>(casc, coll, gap); + } + + // Anti-Omega + if (verifyMask(selMap, maskSelectionAntiOmega) && analyseAntiOmega) { + fillHistogramsCasc<6>(casc, coll, gap); + } + } + + template + void computeV0MCAssociation(const TV0& v0, std::bitset& bitMap) + { + const int pdgPos = v0.pdgCodePositive(); + const int pdgNeg = v0.pdgCodeNegative(); + const int pdgV0 = v0.pdgCode(); + const bool isPhysPrim = v0.isPhysicalPrimary(); + + const bool isPositiveProton = (pdgPos == 2212); + const bool isPositivePion = (pdgPos == 211) || (doTreatPiToMuon && pdgPos == -13); + const bool isNegativeProton = (pdgNeg == -2212); + const bool isNegativePion = (pdgNeg == -211) || (doTreatPiToMuon && pdgNeg == 13); + + switch (pdgV0) { + case 310: // K0Short + if (isPositivePion && isNegativePion) { + bitMap.set(selConsiderK0Short); + if (isPhysPrim) + bitMap.set(selPhysPrimK0Short); + } + break; + case 3122: // Lambda + if (isPositiveProton && isNegativePion) { + bitMap.set(selConsiderLambda); + if (isPhysPrim) + bitMap.set(selPhysPrimLambda); + } + break; + case -3122: // AntiLambda + if (isPositivePion && isNegativeProton) { + bitMap.set(selConsiderAntiLambda); + if (isPhysPrim) + bitMap.set(selPhysPrimAntiLambda); + } + break; + } + } + + template + void analyseV0Candidate(TV0 const& v0, TCollision const& coll, int const& gap, std::bitset const& selMap) + { + auto posTrackExtra = v0.template posTrackExtra_as(); + auto negTrackExtra = v0.template negTrackExtra_as(); + + // QA plots + if (doPlainTopoQA) { + histos.fill(HIST("generalQA/hPt"), v0.pt()); + histos.fill(HIST("generalQA/hPosDCAToPV"), v0.dcapostopv()); + histos.fill(HIST("generalQA/hNegDCAToPV"), v0.dcanegtopv()); + histos.fill(HIST("generalQA/hDCADaughters"), v0.dcaV0daughters()); + histos.fill(HIST("generalQA/hPointingAngle"), std::acos(v0.v0cosPA())); + histos.fill(HIST("generalQA/hV0Radius"), v0.v0radius()); + histos.fill(HIST("generalQA/h2dPositiveITSvsTPCpts"), posTrackExtra.tpcCrossedRows(), posTrackExtra.itsNCls()); + histos.fill(HIST("generalQA/h2dNegativeITSvsTPCpts"), negTrackExtra.tpcCrossedRows(), negTrackExtra.itsNCls()); + } + + histos.fill(HIST("generalQA/h2dArmenterosAll"), v0.alpha(), v0.qtarm()); + + // K0s + if (verifyMask(selMap, maskSelectionK0Short) && analyseK0Short) { + fillHistogramsV0<0>(v0, coll, gap); + } + + // Lambda + if (verifyMask(selMap, maskSelectionLambda) && analyseLambda) { + fillHistogramsV0<1>(v0, coll, gap); + } + + // Anti-Lambda + if (verifyMask(selMap, maskSelectionAntiLambda) && analyseAntiLambda) { + fillHistogramsV0<2>(v0, coll, gap); + } + } + + PresliceUnsorted perMcCollision = aod::v0data::straMCCollisionId; + + std::vector getListOfRecoCollIndices(StraMCCollisionsFull const& mcCollisions, + StraCollisonsFullMC const& collisions) + { + std::vector listBestCollisionIdx(mcCollisions.size(), -1); + + for (auto const& mcCollision : mcCollisions) { + auto groupedCollisions = collisions.sliceBy(perMcCollision, mcCollision.globalIndex()); + // Find the collision with the biggest nbr of PV contributors + // Follows what was done here: https://github.com/AliceO2Group/O2Physics/blob/master/Common/TableProducer/mcCollsExtra.cxx#L93 + int biggestNContribs = -1; + int bestCollisionIndex = -1; + for (auto const& collision : groupedCollisions) { + if (biggestNContribs < collision.multPVTotalContributors()) { + biggestNContribs = collision.multPVTotalContributors(); + bestCollisionIndex = collision.globalIndex(); + } + } + listBestCollisionIdx[mcCollision.globalIndex()] = bestCollisionIndex; + } + + return listBestCollisionIdx; + } + + void fillGenMCHistogramsQA(StraMCCollisionsFull const& mcCollisions, StraCollisonsFullMC const& collisions) + { + for (auto const& mcCollision : mcCollisions) { + histos.fill(HIST("eventQA/mc/hEventSelectionMC"), 0.0); + histos.fill(HIST("eventQA/mc/hMCNParticlesEta10"), mcCollision.multMCNParticlesEta10(), 0 /* all gen. events*/); + + if (std::abs(mcCollision.posZ()) > 10.f) + continue; + + histos.fill(HIST("eventQA/mc/hEventSelectionMC"), 1.0); + + // Group collisions by MC collision index + auto groupedCollisions = collisions.sliceBy(perMcCollision, mcCollision.globalIndex()); + + bool atLeastOne = false; + float centrality = -1.f; + int nCollisions = 0; + int biggestNContribs = -1; + int nTracksGlobal = -1; + + // Find the max contributors and count accepted collisions + for (auto const& collision : groupedCollisions) { + if (!acceptEvent(collision, false)) { + continue; + } + + int selGapSide = collision.isUPC() ? getGapSide(collision) : -1; + if (studyUPConly && (selGapSide < -0.5)) + continue; + + if (biggestNContribs < collision.multPVTotalContributors()) { + biggestNContribs = collision.multPVTotalContributors(); + centrality = collision.centFT0C(); + nTracksGlobal = collision.multNTracksGlobal(); + } + + ++nCollisions; + atLeastOne = true; + } + + // Fill histograms + histos.fill(HIST("eventQA/mc/hTracksGlobalVsNcoll_beforeEvSel"), nTracksGlobal, groupedCollisions.size()); + histos.fill(HIST("eventQA/mc/hTracksGlobalVsNcoll_afterEvSel"), nTracksGlobal, nCollisions); + histos.fill(HIST("eventQA/mc/hTracksGlobalvsMCNParticlesEta10gen"), nTracksGlobal, mcCollision.multMCNParticlesEta10()); + histos.fill(HIST("eventQA/mc/hTracksGlobalVsPVzMC"), nTracksGlobal, mcCollision.posZ()); + histos.fill(HIST("eventQA/mc/hEventPVzMC"), mcCollision.posZ()); + + if (atLeastOne) { + histos.fill(HIST("eventQA/mc/hMCNParticlesEta10"), mcCollision.multMCNParticlesEta10(), 1 /* at least 1 rec. event*/); + histos.fill(HIST("eventQA/mc/hGenEventCentrality"), centrality); + } + } + } + + void processV0s(StraCollisonFull const& collision, V0Candidates const& fullV0s, DauTracks const&) + { + if (!acceptEvent(collision, true)) { + return; + } // event is accepted + + int selGapSide = collision.isUPC() ? getGapSide(collision) : -1; + if (studyUPConly && (selGapSide < -0.5)) + return; + + fillHistogramsQA(collision, selGapSide); + + for (const auto& v0 : fullV0s) { + if ((v0.v0Type() != v0cuts.v0TypeSelection) && (v0cuts.v0TypeSelection > 0)) + continue; // skip V0s that are not standard + + std::bitset selMap = computeBitmapV0(v0, collision); + + // consider all species for the candidate + setBits(selMap, {selConsiderK0Short, selConsiderLambda, selConsiderAntiLambda, + selPhysPrimK0Short, selPhysPrimLambda, selPhysPrimAntiLambda}); + + analyseV0Candidate(v0, collision, selGapSide, selMap); + } // end v0 loop + } + + void processV0sMC(StraCollisonFullMC const& collision, + V0CandidatesMC const& fullV0s, + DauTracks const&, + aod::MotherMCParts const&, + StraMCCollisionsFull const&, + V0MCCoresFull const&) + { + if (!acceptEvent(collision, true)) { + return; + } // event is accepted + + if (!collision.has_straMCCollision()) { + histos.fill(HIST("eventQA/mc/hFakeEvents"), 0); // no assoc. MC collisions + } + + int selGapSide = collision.isUPC() ? getGapSide(collision) : -1; + if (studyUPConly && (selGapSide < -0.5)) + return; + + fillHistogramsQA(collision, selGapSide); + + if (collision.has_straMCCollision()) { + const auto& mcCollision = collision.straMCCollision_as(); + histos.fill(HIST("eventQA/mc/hNTracksGlobalvsMCNParticlesEta10rec"), collision.multNTracksGlobal(), mcCollision.multMCNParticlesEta10()); + histos.fill(HIST("eventQA/mc/hNTracksPVeta1vsMCNParticlesEta10rec"), collision.multNTracksPVeta1(), mcCollision.multMCNParticlesEta10()); + histos.fill(HIST("eventQA/mc/hNTracksGlobalvstotalMultMCParticles"), collision.multNTracksGlobal(), mcCollision.totalMultMCParticles()); + histos.fill(HIST("eventQA/mc/hNTracksPVeta1vstotalMultMCParticles"), collision.multNTracksPVeta1(), mcCollision.totalMultMCParticles()); + } + + for (const auto& v0 : fullV0s) { + if ((v0.v0Type() != v0cuts.v0TypeSelection) && (v0cuts.v0TypeSelection > 0)) + continue; // skip V0s that are not standard + + std::bitset selMap = computeBitmapV0(v0, collision); + + if (doMCAssociation) { + if (v0.has_v0MCCore()) { + const auto& v0MC = v0.v0MCCore_as(); + computeV0MCAssociation(v0MC, selMap); + } + } else { + // consider all species for the candidate + setBits(selMap, {selConsiderK0Short, selConsiderLambda, selConsiderAntiLambda, + selPhysPrimK0Short, selPhysPrimLambda, selPhysPrimAntiLambda}); + } + + analyseV0Candidate(v0, collision, selGapSide, selMap); + } // end v0 loop + } + + void processCascades(StraCollisonFull const& collision, + CascadeCandidates const& fullCascades, + DauTracks const&) + { + if (!acceptEvent(collision, true)) { + return; + } // event is accepted + + int selGapSide = collision.isUPC() ? getGapSide(collision) : -1; + if (studyUPConly && (selGapSide < -0.5)) + return; + + fillHistogramsQA(collision, selGapSide); + + for (const auto& casc : fullCascades) { + std::bitset selMap = computeBitmapCascade(casc, collision); + // the candidate may belong to any particle species + setBits(selMap, {selConsiderXi, selConsiderAntiXi, selConsiderOmega, selConsiderAntiOmega, + selPhysPrimXi, selPhysPrimAntiXi, selPhysPrimOmega, selPhysPrimAntiOmega}); + + analyseCascCandidate(casc, collision, selGapSide, selMap); + } // end casc loop + } + + void processGenerated(StraMCCollisionsFull const& mcCollisions, + V0MCCoresFull const& V0MCCores, + CascMCCoresFull const& CascMCCores, + StraCollisonsFullMC const& collisions) + { + fillGenMCHistogramsQA(mcCollisions, collisions); + std::vector listBestCollisionIdx = getListOfRecoCollIndices(mcCollisions, collisions); + // V0 start + for (auto const& v0MC : V0MCCores) { + // Consider only primaries + if (!v0MC.has_straMCCollision() || !v0MC.isPhysicalPrimary()) + continue; + + // Kinematics (|y| < rapidityCut) + float pTmc = v0MC.ptMC(); + float ymc = 1e3; + if (v0MC.pdgCode() == 310) + ymc = v0MC.rapidityMC(0); + else if (std::abs(v0MC.pdgCode()) == 3122) + ymc = v0MC.rapidityMC(1); + if (std::abs(ymc) > rapidityCut) + continue; + + auto mcCollision = v0MC.straMCCollision_as(); // take gen. collision + if (std::abs(mcCollision.posZ()) > 10.f) + continue; + + float centrality = -1.f; + int nTracksGlobal = -1; + if (listBestCollisionIdx[mcCollision.globalIndex()] > -1) { + auto collision = collisions.iteratorAt(listBestCollisionIdx[mcCollision.globalIndex()]); + centrality = collision.centFT0C(); + nTracksGlobal = collision.multNTracksGlobal(); + } + + // Fill histograms + if (v0MC.pdgCode() == 310) { + histos.fill(HIST(kParticlenames[0]) + HIST("/mc/h6dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc); + } + if (v0MC.pdgCode() == 3122) { + histos.fill(HIST(kParticlenames[1]) + HIST("/mc/h6dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc); + } + if (v0MC.pdgCode() == -3122) { + histos.fill(HIST(kParticlenames[2]) + HIST("/mc/h6dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc); + } + } // V0 end + + // Cascade start + for (auto const& cascMC : CascMCCores) { + // Consider only primaries + if (!cascMC.has_straMCCollision() || !cascMC.isPhysicalPrimary()) + continue; + // Kinematics (|y| < rapidityCut) + float pTmc = cascMC.ptMC(); + float ymc = 1e3; + if (std::abs(cascMC.pdgCode()) == 3312) + ymc = RecoDecay::y(std::array{cascMC.pxMC(), cascMC.pyMC(), cascMC.pzMC()}, o2::constants::physics::MassXiMinus); + else if (std::abs(cascMC.pdgCode()) == 3334) + ymc = RecoDecay::y(std::array{cascMC.pxMC(), cascMC.pyMC(), cascMC.pzMC()}, o2::constants::physics::MassOmegaMinus); + if (std::abs(ymc) > rapidityCut) + continue; + + auto mcCollision = cascMC.straMCCollision_as(); // take gen. collision + if (std::abs(mcCollision.posZ()) > 10.f) + continue; + + float centrality = -1.f; + int nTracksGlobal = -1; + if (listBestCollisionIdx[mcCollision.globalIndex()] > -1) { + auto collision = collisions.iteratorAt(listBestCollisionIdx[mcCollision.globalIndex()]); + centrality = collision.centFT0C(); + nTracksGlobal = collision.multNTracksGlobal(); + } + + // Fill histograms + if (cascMC.pdgCode() == 3312) { + histos.fill(HIST(kParticlenames[3]) + HIST("/mc/h6dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc); + } + if (cascMC.pdgCode() == -3312) { + histos.fill(HIST(kParticlenames[4]) + HIST("/mc/h6dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc); + } + if (cascMC.pdgCode() == 3334) { + histos.fill(HIST(kParticlenames[5]) + HIST("/mc/h6dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc); + } + if (cascMC.pdgCode() == -3334) { + histos.fill(HIST(kParticlenames[6]) + HIST("/mc/h6dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc); + } + } // Cascade end + } + + PROCESS_SWITCH(Derivedupcanalysis, processV0s, "Process V0s", true); + PROCESS_SWITCH(Derivedupcanalysis, processV0sMC, "Process V0s MC", false); + PROCESS_SWITCH(Derivedupcanalysis, processCascades, "Process Cascades", false); + PROCESS_SWITCH(Derivedupcanalysis, processGenerated, "Process Generated Level", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc)}; +} diff --git a/PWGLF/Tasks/Strangeness/strange-yield-pbpb.cxx b/PWGLF/Tasks/Strangeness/strange-yield-pbpb.cxx deleted file mode 100644 index 63c866695dc..00000000000 --- a/PWGLF/Tasks/Strangeness/strange-yield-pbpb.cxx +++ /dev/null @@ -1,1572 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. -// -// Strangeness in UPC analysis task -// ================ -// This code is meant to be run over derived data. -// -// Comments, questions, complaints, suggestions? -// Please write to: -// roman.nepeivoda@cern.ch -// - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoAHelpers.h" -#include "Framework/O2DatabasePDGPlugin.h" -#include "ReconstructionDataFormats/Track.h" -#include "Common/Core/RecoDecay.h" -#include "Common/Core/trackUtilities.h" -#include "PWGLF/DataModel/LFStrangenessTables.h" -#include "PWGLF/DataModel/LFStrangenessPIDTables.h" -#include "Common/Core/TrackSelection.h" -#include "Common/DataModel/TrackSelectionTables.h" -#include "Common/DataModel/EventSelection.h" -#include "Common/DataModel/Centrality.h" -#include "Common/DataModel/PIDResponse.h" -#include "Framework/StaticFor.h" -#include "PWGUD/Core/SGSelector.h" -#include "PWGLF/Utils/strangenessMasks.h" - -using namespace o2; -using namespace o2::framework; -using namespace o2::framework::expressions; -using std::array; - -using dauTracks = soa::Join; -using dauMCTracks = soa::Join; - -using v0Candidates = soa::Join; -using v0MCCandidates = soa::Join; - -using cascadeCandidates = soa::Join; - -using straCollisonFull = soa::Join::iterator; - -struct strangeYieldPbPb { - HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; - - // master analysis switches - Configurable analyseK0Short{"analyseK0Short", true, "process K0Short-like candidates"}; - Configurable analyseLambda{"analyseLambda", true, "process Lambda-like candidates"}; - Configurable analyseAntiLambda{"analyseAntiLambda", true, "process AntiLambda-like candidates"}; - Configurable analyseXi{"analyseXi", true, "process Xi-like candidates"}; - Configurable analyseAntiXi{"analyseAntiXi", true, "process AntiXi-like candidates"}; - Configurable analyseOmega{"analyseOmega", true, "process Omega-like candidates"}; - Configurable analyseAntiOmega{"analyseAntiOmega", true, "process AntiOmega-like candidates"}; - - // Event selections - Configurable rejectITSROFBorder{"rejectITSROFBorder", true, "reject events at ITS ROF border"}; - Configurable rejectTFBorder{"rejectTFBorder", true, "reject events at TF border"}; - Configurable rejectSameBunchPileup{"rejectSameBunchPileup", true, "reject collisions in case of pileup with another collision in the same foundBC"}; - Configurable requireIsTriggerTVX{"requireIsTriggerTVX", true, "require coincidence in FT0A and FT0C"}; - Configurable requireIsVertexITSTPC{"requireIsVertexITSTPC", false, "require events with at least one ITS-TPC track"}; - Configurable requireIsGoodZvtxFT0VsPV{"requireIsGoodZvtxFT0VsPV", true, "require events with PV position along z consistent (within 1 cm) between PV reconstructed using tracks and PV using FT0 A-C time difference"}; - Configurable requireIsVertexTOFmatched{"requireIsVertexTOFmatched", false, "require events with at least one of vertex contributors matched to TOF"}; - Configurable requireIsVertexTRDmatched{"requireIsVertexTRDmatched", false, "require events with at least one of vertex contributors matched to TRD"}; - Configurable requireNoCollInTimeRangeStd{"requireNoCollInTimeRangeStd", false, "reject collisions corrupted by the cannibalism, with other collisions within +/- 10 microseconds"}; - Configurable requireNoCollInTimeRangeNarrow{"requireNoCollInTimeRangeNarrow", false, "reject collisions corrupted by the cannibalism, with other collisions within +/- 10 microseconds"}; - Configurable studyUPConly{"studyUPConly", false, "is UPC-only analysis"}; - Configurable useUPCflag{"useUPCflag", false, "select UPC flagged events"}; - - Configurable verbose{"verbose", false, "additional printouts"}; - - // Acceptance selections - Configurable rapidityCut{"rapidityCut", 0.5, "rapidity"}; - Configurable daughterEtaCut{"daughterEtaCut", 0.8, "max eta for daughters"}; - - // Standard V0 topological criteria - struct : ConfigurableGroup { - Configurable v0cospa{"v0cospa", 0.97, "min V0 CosPA"}; - Configurable dcav0dau{"dcav0dau", 1.5, "max DCA V0 Daughters (cm)"}; - Configurable dcanegtopv{"dcanegtopv", .05, "min DCA Neg To PV (cm)"}; - Configurable dcapostopv{"dcapostopv", .05, "min DCA Pos To PV (cm)"}; - Configurable v0radius{"v0radius", 1.2, "minimum V0 radius (cm)"}; - Configurable v0radiusMax{"v0radiusMax", 1E5, "maximum V0 radius (cm)"}; - // Additional selection on the AP plot (exclusive for K0Short) - // original equation: lArmPt*5>fabs(lArmAlpha) - Configurable armPodCut{"armPodCut", 5.0f, "pT * (cut) > |alpha|, AP cut. Negative: no cut"}; - Configurable v0TypeSelection{"v0TypeSelection", 1, "select on a certain V0 type (leave negative if no selection desired)"}; - } v0cuts; - static constexpr float lifetimeCutsV0[1][2] = {{30., 20.}}; - Configurable> lifetimecutV0{"lifetimecutV0", {lifetimeCutsV0[0], 2, {"lifetimecutLambda", "lifetimecutK0S"}}, "lifetimecutV0"}; - - // Standard cascade topological criteria - struct : ConfigurableGroup { - Configurable casccospa{"casccospa", 0.97, "Casc CosPA"}; - Configurable dcacascdau{"dcacascdau", 1.2, "DCA Casc Daughters"}; - Configurable cascradius{"cascradius", 0.6, "minimum cascade radius (cm)"}; - Configurable cascradiusMax{"cascradiusMax", 1E5, "maximum cascade radius (cm)"}; - Configurable bachbaryoncospa{"bachbaryoncospa", 2, "Bachelor baryon CosPA"}; - Configurable bachbaryondcaxytopv{"bachbaryondcaxytopv", -1, "DCA bachelor baryon to PV"}; - Configurable dcamesontopv{"dcamesontopv", 0.1, "DCA of meson doughter track To PV"}; - Configurable dcabaryontopv{"dcabaryontopv", 0.05, "DCA of baryon doughter track To PV"}; - Configurable dcabachtopv{"dcabachtopv", 0.04, "DCA Bach To PV"}; - Configurable dcav0topv{"dcav0topv", 0.06, "DCA V0 To PV"}; - // Cascade specific selections - Configurable masswin{"masswin", 0.05, "mass window limit"}; - Configurable lambdamasswin{"lambdamasswin", 0.005, "V0 Mass window limit"}; - Configurable rejcomp{"rejcomp", 0.008, "competing Cascade rejection"}; - } casccuts; - Configurable doBachelorBaryonCut{"doBachelorBaryonCut", false, "Enable Bachelor-Baryon cut "}; - static constexpr float nCtauCutsCasc[1][2] = {{6., 6.}}; - Configurable> nCtauCutCasc{"nCtauCutCasc", {nCtauCutsCasc[0], 2, {"lifetimecutXi", "lifetimecutOmega"}}, "nCtauCutCasc"}; - - // UPC selections - SGSelector sgSelector; - struct : ConfigurableGroup { - Configurable FV0cut{"FV0cut", 100., "FV0A threshold"}; - Configurable FT0Acut{"FT0Acut", 200., "FT0A threshold"}; - Configurable FT0Ccut{"FT0Ccut", 100., "FT0C threshold"}; - Configurable ZDCcut{"ZDCcut", 10., "ZDC threshold"}; - // Configurable gapSel{"gapSel", 2, "Gap selection"}; - } upcCuts; - - // Track quality - struct : ConfigurableGroup { - Configurable minTPCrows{"minTPCrows", 70, "minimum TPC crossed rows"}; - Configurable minITSclusters{"minITSclusters", -1, "minimum ITS clusters"}; - Configurable skipTPConly{"skipTPConly", false, "skip V0s comprised of at least one TPC only prong"}; - Configurable requireBachITSonly{"requireBachITSonly", false, "require that bachelor track is ITSonly (overrides TPC quality)"}; - Configurable requirePosITSonly{"requirePosITSonly", false, "require that positive track is ITSonly (overrides TPC quality)"}; - Configurable requireNegITSonly{"requireNegITSonly", false, "require that negative track is ITSonly (overrides TPC quality)"}; - } TrackConfigurations; - - // PID (TPC/TOF) - struct : ConfigurableGroup { - Configurable TpcPidNsigmaCut{"TpcPidNsigmaCut", 1e+6, "TpcPidNsigmaCut"}; - Configurable TofPidNsigmaCutLaPr{"TofPidNsigmaCutLaPr", 1e+6, "TofPidNsigmaCutLaPr"}; - Configurable TofPidNsigmaCutLaPi{"TofPidNsigmaCutLaPi", 1e+6, "TofPidNsigmaCutLaPi"}; - Configurable TofPidNsigmaCutK0Pi{"TofPidNsigmaCutK0Pi", 1e+6, "TofPidNsigmaCutK0Pi"}; - - Configurable TofPidNsigmaCutXiPi{"TofPidNsigmaCutXiPi", 1e+6, "TofPidNsigmaCutXiPi"}; - Configurable TofPidNsigmaCutOmegaKaon{"TofPidNsigmaCutOmegaKaon", 1e+6, "TofPidNsigmaCutOmegaKaon"}; - - Configurable doTPCQA{"doTPCQA", false, "do TPC QA histograms"}; - Configurable doTOFQA{"doTOFQA", false, "do TOF QA histograms"}; - - // PID (TOF) - Configurable maxDeltaTimeProton{"maxDeltaTimeProton", 1e+9, "check maximum allowed time"}; - Configurable maxDeltaTimePion{"maxDeltaTimePion", 1e+9, "check maximum allowed time"}; - Configurable maxDeltaTimeKaon{"maxDeltaTimeKaon", 1e+9, "check maximum allowed time"}; - } PIDConfigurations; - - Configurable doKienmaticQA{"doKienmaticQA", true, "do Kinematic QA histograms"}; - Configurable doDetectPropQA{"doDetectPropQA", 0, "do Detector/ITS map QA: 0: no, 1: 4D, 2: 5D with mass"}; - Configurable doPlainTopoQA{"doPlainTopoQA", true, "do simple 1D QA of candidates"}; - - struct : ConfigurableGroup { - ConfigurableAxis axisFT0Aampl{"axisFT0Aampl", {100, 0.0f, 2000.0f}, "FT0Aamplitude"}; - ConfigurableAxis axisFT0Campl{"axisFT0Campl", {100, 0.0f, 2000.0f}, "FT0Camplitude"}; - ConfigurableAxis axisFV0Aampl{"axisFV0Aampl", {100, 0.0f, 2000.0f}, "FV0Aamplitude"}; - ConfigurableAxis axisFDDAampl{"axisFDDAampl", {100, 0.0f, 2000.0f}, "FDDAamplitude"}; - ConfigurableAxis axisFDDCampl{"axisFDDCampl", {100, 0.0f, 2000.0f}, "FDDCamplitude"}; - ConfigurableAxis axisZNAampl{"axisZNAampl", {100, 0.0f, 250.0f}, "ZNAamplitude"}; - ConfigurableAxis axisZNCampl{"axisZNCampl", {100, 0.0f, 250.0f}, "ZNCamplitude"}; - } axisDetectors; - - // for MC - Configurable doMCAssociation{"doMCAssociation", false, "if MC, do MC association"}; - Configurable doCollisionAssociationQA{"doCollisionAssociationQA", false, "check collision association"}; - - // fast check on occupancy - Configurable minOccupancy{"minOccupancy", -1, "minimum occupancy from neighbouring collisions"}; - Configurable maxOccupancy{"maxOccupancy", -1, "maximum occupancy from neighbouring collisions"}; - - // Kinematic axes - ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.2f, 2.4f, 2.6f, 2.8f, 3.0f, 3.2f, 3.4f, 3.6f, 3.8f, 4.0f, 4.4f, 4.8f, 5.2f, 5.6f, 6.0f, 6.5f, 7.0f, 7.5f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 17.0f, 19.0f, 21.0f, 23.0f, 25.0f, 30.0f, 35.0f, 40.0f, 50.0f}, "pt axis for v0 analysis"}; - ConfigurableAxis axisPtXi{"axisPtCasc", {VARIABLE_WIDTH, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.2f, 2.4f, 2.6f, 2.8f, 3.0f, 3.2f, 3.4f, 3.6f, 3.8f, 4.0f, 4.4f, 4.8f, 5.2f, 5.6f, 6.0f, 6.5f, 7.0f, 7.5f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 17.0f, 19.0f, 21.0f, 23.0f, 25.0f, 30.0f, 35.0f, 40.0f, 50.0f}, "pt axis for cascade analysis"}; - ConfigurableAxis axisPtCoarse{"axisPtCoarse", {VARIABLE_WIDTH, 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 7.0f, 10.0f, 15.0f}, "pt axis for QA"}; - ConfigurableAxis axisEta{"axisEta", {100, -2.0f, 2.0f}, "#eta"}; - ConfigurableAxis axisRap{"axisRap", {100, -2.0f, 2.0f}, "y"}; - - // Invariant mass axes - ConfigurableAxis axisK0Mass{"axisK0Mass", {200, 0.4f, 0.6f}, ""}; - ConfigurableAxis axisLambdaMass{"axisLambdaMass", {200, 1.101f, 1.131f}, ""}; - ConfigurableAxis axisXiMass{"axisXiMass", {200, 1.28f, 1.36f}, ""}; - ConfigurableAxis axisOmegaMass{"axisOmegaMass", {200, 1.59f, 1.75f}, ""}; - std::vector axisInvMass = {axisK0Mass, - axisLambdaMass, - axisLambdaMass, - axisXiMass, - axisXiMass, - axisOmegaMass, - axisOmegaMass}; - - ConfigurableAxis axisNTracksGlobal{"axisNTracksGlobal", {100, -0.5f, 99.5f}, "Number of global tracks"}; - ConfigurableAxis axisNTracksPVeta1{"axisNTracksPVeta1", {100, -0.5f, 99.5f}, "Number of PV contributors in |eta| < 1"}; - ConfigurableAxis axisNTracksTotalExceptITSonly{"axisNTracksTotalExceptITSonly", {100, -0.5f, 99.5f}, "Number of ITS-TPC and TPC only tracks"}; - ConfigurableAxis axisNchInvMass{"axisNchInvMass", {200, -0.5f, 199.5f}, "Number of charged particles for kTHnSparseF"}; - - ConfigurableAxis axisFT0C_QA{"axisFT0C_QA", - {VARIABLE_WIDTH, 0., 0.01, 0.05, 0.1, 0.5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 105.5}, - "FT0C (%)"}; - - ConfigurableAxis axisFT0C{"axisFT0C", - {VARIABLE_WIDTH, 0., 0.01, 0.05, 0.1, 0.5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 105.5}, - "FT0C (%)"}; - - ConfigurableAxis axisOccupancy{"axisOccupancy", {VARIABLE_WIDTH, 0.0f, 250.0f, 500.0f, 750.0f, 1000.0f, 1500.0f, 2000.0f, 3000.0f, 4500.0f, 6000.0f, 8000.0f, 10000.0f, 50000.0f}, "Occupancy"}; - - // UPC axes - ConfigurableAxis axisSelGap{"axisSelGap", {4, -1.5, 2.5}, "Gap side"}; - - // AP plot axes - ConfigurableAxis axisAPAlpha{"axisAPAlpha", {220, -1.1f, 1.1f}, "V0 AP alpha"}; - ConfigurableAxis axisAPQt{"axisAPQt", {220, 0.0f, 0.5f}, "V0 AP alpha"}; - - // MC coll assoc QA axis - ConfigurableAxis axisMonteCarloNch{"axisMonteCarloNch", {300, 0.0f, 3000.0f}, "N_{ch} MC"}; - - // Track quality axes - ConfigurableAxis axisTPCrows{"axisTPCrows", {160, -0.5f, 159.5f}, "N TPC rows"}; - ConfigurableAxis axisITSclus{"axisITSclus", {7, -0.5f, 6.5f}, "N ITS Clusters"}; - ConfigurableAxis axisITScluMap{"axisITSMap", {128, -0.5f, 127.5f}, "ITS Cluster map"}; - ConfigurableAxis axisDetMap{"axisDetMap", {16, -0.5f, 15.5f}, "Detector use map"}; - ConfigurableAxis axisITScluMapCoarse{"axisITScluMapCoarse", {16, -3.5f, 12.5f}, "ITS Coarse cluster map"}; - ConfigurableAxis axisDetMapCoarse{"axisDetMapCoarse", {5, -0.5f, 4.5f}, "Detector Coarse user map"}; - - // Topological variable QA axes - ConfigurableAxis axisDCAtoPV{"axisDCAtoPV", {80, -4.0f, 4.0f}, "DCA (cm)"}; - ConfigurableAxis axisDCAdau{"axisDCAdau", {24, 0.0f, 1.2f}, "DCA (cm)"}; - ConfigurableAxis axisPointingAngle{"axisPointingAngle", {100, 0.0f, 0.5f}, "pointing angle (rad)"}; - ConfigurableAxis axisV0Radius{"axisV0Radius", {60, 0.0f, 60.0f}, "V0 2D radius (cm)"}; - ConfigurableAxis axisNsigmaTPC{"axisNsigmaTPC", {200, -10.0f, 10.0f}, "N sigma TPC"}; - ConfigurableAxis axisTPCsignal{"axisTPCsignal", {200, 0.0f, 200.0f}, "TPC signal"}; - ConfigurableAxis axisTOFdeltaT{"axisTOFdeltaT", {200, -5000.0f, 5000.0f}, "TOF Delta T (ps)"}; - ConfigurableAxis axisNctau{"axisNctau", {100, 0.0f, 10.0f}, "n c x tau"}; - - // PDG database - Service pdgDB; - - static constexpr std::string_view particlenames[] = {"K0Short", "Lambda", "AntiLambda", "Xi", "AntiXi", "Omega", "AntiOmega"}; - - void setBits(std::bitset& mask, std::initializer_list selections) - { - for (int sel : selections) { - mask.set(sel); - } - } - - template - void addTopoHistograms(HistogramRegistry& histos) - { - const bool isCascade = (partID > 2.5) ? true : false; - if (isCascade) { - histos.add(Form("%s/hCascCosPA", particlenames[partID].data()), "hCascCosPA", kTH2F, {axisPtCoarse, {100, 0.9f, 1.0f}}); - histos.add(Form("%s/hDCACascDaughters", particlenames[partID].data()), "hDCACascDaughters", kTH2F, {axisPtCoarse, {44, 0.0f, 2.2f}}); - histos.add(Form("%s/hCascRadius", particlenames[partID].data()), "hCascRadius", kTH2D, {axisPtCoarse, {500, 0.0f, 50.0f}}); - histos.add(Form("%s/hMesonDCAToPV", particlenames[partID].data()), "hMesonDCAToPV", kTH2F, {axisPtCoarse, axisDCAtoPV}); - histos.add(Form("%s/hBaryonDCAToPV", particlenames[partID].data()), "hBaryonDCAToPV", kTH2F, {axisPtCoarse, axisDCAtoPV}); - histos.add(Form("%s/hBachDCAToPV", particlenames[partID].data()), "hBachDCAToPV", kTH2F, {axisPtCoarse, {200, -1.0f, 1.0f}}); - histos.add(Form("%s/hV0CosPA", particlenames[partID].data()), "hV0CosPA", kTH2F, {axisPtCoarse, {100, 0.9f, 1.0f}}); - histos.add(Form("%s/hV0Radius", particlenames[partID].data()), "hV0Radius", kTH2D, {axisPtCoarse, axisV0Radius}); - histos.add(Form("%s/hDCAV0Daughters", particlenames[partID].data()), "hDCAV0Daughters", kTH2F, {axisPtCoarse, axisDCAdau}); - histos.add(Form("%s/hDCAV0ToPV", particlenames[partID].data()), "hDCAV0ToPV", kTH2F, {axisPtCoarse, {44, 0.0f, 2.2f}}); - histos.add(Form("%s/hMassLambdaDau", particlenames[partID].data()), "hMassLambdaDau", kTH2F, {axisPtCoarse, axisLambdaMass}); - histos.add(Form("%s/hNctau", particlenames[partID].data()), "hNctau", kTH2F, {axisPtCoarse, axisNctau}); - if (doBachelorBaryonCut) { - histos.add(Form("%s/hBachBaryonCosPA", particlenames[partID].data()), "hBachBaryonCosPA", kTH2F, {axisPtCoarse, {100, 0.0f, 1.0f}}); - histos.add(Form("%s/hBachBaryonDCAxyToPV", particlenames[partID].data()), "hBachBaryonDCAxyToPV", kTH2F, {axisPtCoarse, {300, -3.0f, 3.0f}}); - } - } else { - histos.add(Form("%s/hPosDCAToPV", particlenames[partID].data()), "hPosDCAToPV", kTH1F, {axisDCAtoPV}); - histos.add(Form("%s/hNegDCAToPV", particlenames[partID].data()), "hNegDCAToPV", kTH1F, {axisDCAtoPV}); - histos.add(Form("%s/hDCADaughters", particlenames[partID].data()), "hDCADaughters", kTH1F, {axisDCAdau}); - histos.add(Form("%s/hPointingAngle", particlenames[partID].data()), "hPointingAngle", kTH1F, {axisPointingAngle}); - histos.add(Form("%s/hV0Radius", particlenames[partID].data()), "hV0Radius", kTH1F, {axisV0Radius}); - histos.add(Form("%s/h2dPositiveITSvsTPCpts", particlenames[partID].data()), "h2dPositiveITSvsTPCpts", kTH2F, {axisTPCrows, axisITSclus}); - histos.add(Form("%s/h2dNegativeITSvsTPCpts", particlenames[partID].data()), "h2dNegativeITSvsTPCpts", kTH2F, {axisTPCrows, axisITSclus}); - } - } - - template - void addTPCQAHistograms(HistogramRegistry& histos) - { - const bool isCascade = (partID > 2.5) ? true : false; - histos.add(Form("%s/h3dPosNsigmaTPC", particlenames[partID].data()), "h3dPosNsigmaTPC", kTH3F, {axisFT0C, axisPtCoarse, axisNsigmaTPC}); - histos.add(Form("%s/h3dNegNsigmaTPC", particlenames[partID].data()), "h3dNegNsigmaTPC", kTH3F, {axisFT0C, axisPtCoarse, axisNsigmaTPC}); - histos.add(Form("%s/h3dPosTPCsignal", particlenames[partID].data()), "h3dPosTPCsignal", kTH3F, {axisFT0C, axisPtCoarse, axisTPCsignal}); - histos.add(Form("%s/h3dNegTPCsignal", particlenames[partID].data()), "h3dNegTPCsignal", kTH3F, {axisFT0C, axisPtCoarse, axisTPCsignal}); - - histos.add(Form("%s/h3dPosNsigmaTPCvsTrackPtot", particlenames[partID].data()), "h3dPosNsigmaTPCvsTrackPtot", kTH3F, {axisFT0C, axisPtCoarse, axisNsigmaTPC}); - histos.add(Form("%s/h3dNegNsigmaTPCvsTrackPtot", particlenames[partID].data()), "h3dNegNsigmaTPCvsTrackPtot", kTH3F, {axisFT0C, axisPtCoarse, axisNsigmaTPC}); - - histos.add(Form("%s/h3dPosTPCsignalVsTrackPtot", particlenames[partID].data()), "h3dPosTPCsignalVsTrackPtot", kTH3F, {axisFT0C, axisPtCoarse, axisTPCsignal}); - histos.add(Form("%s/h3dNegTPCsignalVsTrackPtot", particlenames[partID].data()), "h3dNegTPCsignalVsTrackPtot", kTH3F, {axisFT0C, axisPtCoarse, axisTPCsignal}); - - histos.add(Form("%s/h3dPosNsigmaTPCvsTrackPt", particlenames[partID].data()), "h3dPosNsigmaTPCvsTrackPt", kTH3F, {axisFT0C, axisPtCoarse, axisNsigmaTPC}); - histos.add(Form("%s/h3dNegNsigmaTPCvsTrackPt", particlenames[partID].data()), "h3dNegNsigmaTPCvsTrackPt", kTH3F, {axisFT0C, axisPtCoarse, axisNsigmaTPC}); - - histos.add(Form("%s/h3dPosTPCsignalVsTrackPt", particlenames[partID].data()), "h3dPosTPCsignalVsTrackPt", kTH3F, {axisFT0C, axisPtCoarse, axisTPCsignal}); - histos.add(Form("%s/h3dNegTPCsignalVsTrackPt", particlenames[partID].data()), "h3dNegTPCsignalVsTrackPt", kTH3F, {axisFT0C, axisPtCoarse, axisTPCsignal}); - - if (isCascade) { - histos.add(Form("%s/h3dBachTPCsignal", particlenames[partID].data()), "h3dBachTPCsignal", kTH3F, {axisFT0C, axisPtCoarse, axisTPCsignal}); - histos.add(Form("%s/h3dBachNsigmaTPC", particlenames[partID].data()), "h3dBachNsigmaTPC", kTH3F, {axisFT0C, axisPtCoarse, axisNsigmaTPC}); - histos.add(Form("%s/h3dBachNsigmaTPCvsTrackPtot", particlenames[partID].data()), "h3dBachNsigmaTPCvsTrackPtot", kTH3F, {axisFT0C, axisPtCoarse, axisNsigmaTPC}); - histos.add(Form("%s/h3dBachTPCsignalVsTrackPtot", particlenames[partID].data()), "h3dBachTPCsignalVsTrackPtot", kTH3F, {axisFT0C, axisPtCoarse, axisTPCsignal}); - histos.add(Form("%s/h3dBachNsigmaTPCvsTrackPt", particlenames[partID].data()), "h3dBachNsigmaTPCvsTrackPt", kTH3F, {axisFT0C, axisPtCoarse, axisNsigmaTPC}); - histos.add(Form("%s/h3dBachTPCsignalVsTrackPt", particlenames[partID].data()), "h3dBachTPCsignalVsTrackPt", kTH3F, {axisFT0C, axisPtCoarse, axisTPCsignal}); - } - } - - template - void addTOFQAHistograms(HistogramRegistry& histos) - { - const bool isCascade = (partID > 2.5) ? true : false; - histos.add(Form("%s/h3dPosTOFdeltaT", particlenames[partID].data()), "h3dPosTOFdeltaT", kTH3F, {axisFT0C, axisPtCoarse, axisTOFdeltaT}); - histos.add(Form("%s/h3dNegTOFdeltaT", particlenames[partID].data()), "h3dNegTOFdeltaT", kTH3F, {axisFT0C, axisPtCoarse, axisTOFdeltaT}); - histos.add(Form("%s/h3dPosTOFdeltaTvsTrackPtot", particlenames[partID].data()), "h3dPosTOFdeltaTvsTrackPtot", kTH3F, {axisFT0C, axisPtCoarse, axisTOFdeltaT}); - histos.add(Form("%s/h3dNegTOFdeltaTvsTrackPtot", particlenames[partID].data()), "h3dNegTOFdeltaTvsTrackPtot", kTH3F, {axisFT0C, axisPtCoarse, axisTOFdeltaT}); - histos.add(Form("%s/h3dPosTOFdeltaTvsTrackPt", particlenames[partID].data()), "h3dPosTOFdeltaTvsTrackPt", kTH3F, {axisFT0C, axisPtCoarse, axisTOFdeltaT}); - histos.add(Form("%s/h3dNegTOFdeltaTvsTrackPt", particlenames[partID].data()), "h3dNegTOFdeltaTvsTrackPt", kTH3F, {axisFT0C, axisPtCoarse, axisTOFdeltaT}); - if (isCascade) { - histos.add(Form("%s/h3dBachTOFdeltaT", particlenames[partID].data()), "h3dBachTOFdeltaT", kTH3F, {axisFT0C, axisPtCoarse, axisTOFdeltaT}); - histos.add(Form("%s/h3dBachTOFdeltaTvsTrackPtot", particlenames[partID].data()), "h3dBachTOFdeltaTvsTrackPtot", kTH3F, {axisFT0C, axisPtCoarse, axisTOFdeltaT}); - histos.add(Form("%s/h3dBachTOFdeltaTvsTrackPt", particlenames[partID].data()), "h3dBachTOFdeltaTvsTrackPt", kTH3F, {axisFT0C, axisPtCoarse, axisTOFdeltaT}); - } - } - - template - void addKinematicQAHistograms(HistogramRegistry& histos) - { - const bool isCascade = (partID > 2.5) ? true : false; - histos.add(Form("%s/h3dPosEtaPt", particlenames[partID].data()), "h3dPosEtaPt", kTH3F, {axisPtCoarse, axisEta, axisSelGap}); - histos.add(Form("%s/h3dNegEtaPt", particlenames[partID].data()), "h3dNegEtaPt", kTH3F, {axisPtCoarse, axisEta, axisSelGap}); - histos.add(Form("%s/h3dRapPt", particlenames[partID].data()), "h3dRapPt", kTH3F, {axisPtCoarse, axisRap, axisSelGap}); - if (isCascade) { - histos.add(Form("%s/h3dBachEtaPt", particlenames[partID].data()), "h3dBachEtaPt", kTH3F, {axisPtCoarse, axisEta, axisSelGap}); - } - } - - template - void addDetectorPropHistograms(HistogramRegistry& histos) - { - const bool isCascade = (partID > 2.5) ? true : false; - if (doDetectPropQA == 1) { - if (isCascade) { - histos.add(Form("%s/h8dDetectPropVsCentrality", particlenames[partID].data()), "h8dDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse}); - } else { - histos.add(Form("%s/h6dDetectPropVsCentrality", particlenames[partID].data()), "h6dDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse}); - } - histos.add(Form("%s/h4dPosDetectPropVsCentrality", particlenames[partID].data()), "h4dPosDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMap, axisITScluMap, axisPtCoarse}); - histos.add(Form("%s/h4dNegDetectPropVsCentrality", particlenames[partID].data()), "h4dNegDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMap, axisITScluMap, axisPtCoarse}); - histos.add(Form("%s/h4dBachDetectPropVsCentrality", particlenames[partID].data()), "h4dBachDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMap, axisITScluMap, axisPtCoarse}); - } - if (doDetectPropQA == 2) { - if (isCascade) { - histos.add(Form("%s/h9dDetectPropVsCentrality", particlenames[partID].data()), "h9dDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse, axisInvMass.at(partID)}); - } else { - histos.add(Form("%s/h7dDetectPropVsCentrality", particlenames[partID].data()), "h7dDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse, axisInvMass.at(partID)}); - } - histos.add(Form("%s/h5dPosDetectPropVsCentrality", particlenames[partID].data()), "h5dPosDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMap, axisITScluMap, axisPtCoarse, axisInvMass.at(partID)}); - histos.add(Form("%s/h5dNegDetectPropVsCentrality", particlenames[partID].data()), "h5dNegDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMap, axisITScluMap, axisPtCoarse, axisInvMass.at(partID)}); - histos.add(Form("%s/h5dBachDetectPropVsCentrality", particlenames[partID].data()), "h5dBachDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMap, axisITScluMap, axisPtCoarse, axisInvMass.at(partID)}); - } - } - - template - void addHistograms(HistogramRegistry& histos) - { - histos.add(Form("%s/h7dMass", particlenames[partID].data()), "h7dMass", kTHnSparseF, {axisFT0C, axisPt, axisInvMass.at(partID), axisSelGap, axisNchInvMass, axisRap, axisEta}); - histos.add(Form("%s/h2dMass", particlenames[partID].data()), "h2dMass", kTH2F, {axisInvMass.at(partID), axisSelGap}); - if (doPlainTopoQA) { - addTopoHistograms(histos); - } - if (PIDConfigurations.doTPCQA) { - addTPCQAHistograms(histos); - } - if (PIDConfigurations.doTOFQA) { - addTOFQAHistograms(histos); - } - if (doKienmaticQA) { - addKinematicQAHistograms(histos); - } - addDetectorPropHistograms(histos); - } - - template - void addCollisionAssocHistograms(HistogramRegistry& histos) - { - histos.add(Form("%s/h2dPtVsNch", particlenames[partID].data()), "h2dPtVsNch", kTH2F, {axisMonteCarloNch, axisPt}); - histos.add(Form("%s/h2dPtVsNch_BadCollAssig", particlenames[partID].data()), "h2dPtVsNch_BadCollAssig", kTH2F, {axisMonteCarloNch, axisPt}); - } - - template - void fillHistogramsV0(TCand cand, TCollision coll, int gap) - { - float invMass = 0; - float centrality = coll.centFT0C(); - float pT = cand.pt(); - float rapidity = 1e6; - - float tpcNsigmaPos = 0; - float tpcNsigmaNeg = 0; - float tofDeltaTPos = 0; - float tofDeltaTNeg = 0; - - auto posTrackExtra = cand.template posTrackExtra_as(); - auto negTrackExtra = cand.template negTrackExtra_as(); - - bool posIsFromAfterburner = posTrackExtra.itsChi2PerNcl() < 0; - bool negIsFromAfterburner = negTrackExtra.itsChi2PerNcl() < 0; - - uint posDetMap = computeDetBitmap(posTrackExtra.detectorMap()); - int posITSclusMap = computeITSclusBitmap(posTrackExtra.itsClusterMap(), posIsFromAfterburner); - uint negDetMap = computeDetBitmap(negTrackExtra.detectorMap()); - int negITSclusMap = computeITSclusBitmap(negTrackExtra.itsClusterMap(), negIsFromAfterburner); - - if (partID == 0) { - histos.fill(HIST("generalQA/h2dArmenterosSelected"), cand.alpha(), cand.qtarm()); - invMass = cand.mK0Short(); - rapidity = cand.yK0Short(); - if (PIDConfigurations.doTOFQA) { - tofDeltaTPos = cand.posTOFDeltaTK0Pi(); - tofDeltaTNeg = cand.negTOFDeltaTK0Pi(); - } - if (PIDConfigurations.doTPCQA) { - tpcNsigmaPos = posTrackExtra.tpcNSigmaPi(); - tpcNsigmaNeg = negTrackExtra.tpcNSigmaPi(); - } - } else if (partID == 1) { - invMass = cand.mLambda(); - rapidity = cand.yLambda(); - if (PIDConfigurations.doTOFQA) { - tofDeltaTPos = cand.posTOFDeltaTLaPr(); - tofDeltaTNeg = cand.negTOFDeltaTLaPi(); - } - if (PIDConfigurations.doTPCQA) { - tpcNsigmaPos = posTrackExtra.tpcNSigmaPr(); - tpcNsigmaNeg = negTrackExtra.tpcNSigmaPi(); - } - } else if (partID == 2) { - invMass = cand.mAntiLambda(); - rapidity = cand.yLambda(); - if (PIDConfigurations.doTOFQA) { - tofDeltaTPos = cand.posTOFDeltaTLaPi(); - tofDeltaTNeg = cand.negTOFDeltaTLaPr(); - } - if (PIDConfigurations.doTPCQA) { - tpcNsigmaPos = posTrackExtra.tpcNSigmaPi(); - tpcNsigmaNeg = negTrackExtra.tpcNSigmaPr(); - } - } else { - LOG(fatal) << "Particle is unknown!"; - } - - histos.fill(HIST(particlenames[partID]) + HIST("/h2dMass"), invMass, gap); - histos.fill(HIST(particlenames[partID]) + HIST("/h7dMass"), centrality, pT, invMass, gap, coll.multNTracksGlobal(), rapidity, cand.eta()); - if (doKienmaticQA) { - histos.fill(HIST(particlenames[partID]) + HIST("/h3dPosEtaPt"), pT, cand.positiveeta(), gap); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dNegEtaPt"), pT, cand.negativeeta(), gap); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dRapPt"), pT, rapidity, gap); - } - if (doPlainTopoQA) { - histos.fill(HIST(particlenames[partID]) + HIST("/hPosDCAToPV"), cand.dcapostopv()); - histos.fill(HIST(particlenames[partID]) + HIST("/hNegDCAToPV"), cand.dcanegtopv()); - histos.fill(HIST(particlenames[partID]) + HIST("/hDCADaughters"), cand.dcaV0daughters()); - histos.fill(HIST(particlenames[partID]) + HIST("/hPointingAngle"), TMath::ACos(cand.v0cosPA())); - histos.fill(HIST(particlenames[partID]) + HIST("/hV0Radius"), cand.v0radius()); - histos.fill(HIST(particlenames[partID]) + HIST("/h2dPositiveITSvsTPCpts"), posTrackExtra.tpcCrossedRows(), posTrackExtra.itsNCls()); - histos.fill(HIST(particlenames[partID]) + HIST("/h2dNegativeITSvsTPCpts"), negTrackExtra.tpcCrossedRows(), negTrackExtra.itsNCls()); - } - if (doDetectPropQA == 1) { - histos.fill(HIST(particlenames[partID]) + HIST("/h6dDetectPropVsCentrality"), centrality, posDetMap, posITSclusMap, negDetMap, negITSclusMap, pT); - histos.fill(HIST(particlenames[partID]) + HIST("/h4dPosDetectPropVsCentrality"), centrality, posTrackExtra.detectorMap(), posTrackExtra.itsClusterMap(), pT); - histos.fill(HIST(particlenames[partID]) + HIST("/h4dNegDetectPropVsCentrality"), centrality, negTrackExtra.detectorMap(), negTrackExtra.itsClusterMap(), pT); - } - if (doDetectPropQA == 2) { - histos.fill(HIST(particlenames[partID]) + HIST("/h7dPosDetectPropVsCentrality"), centrality, posDetMap, posITSclusMap, negDetMap, negITSclusMap, pT, invMass); - histos.fill(HIST(particlenames[partID]) + HIST("/h5dPosDetectPropVsCentrality"), centrality, posTrackExtra.detectorMap(), posTrackExtra.itsClusterMap(), pT, invMass); - histos.fill(HIST(particlenames[partID]) + HIST("/h5dNegDetectPropVsCentrality"), centrality, negTrackExtra.detectorMap(), negTrackExtra.itsClusterMap(), pT, invMass); - } - if (PIDConfigurations.doTPCQA) { - histos.fill(HIST(particlenames[partID]) + HIST("/h3dPosTPCsignal"), centrality, pT, posTrackExtra.tpcSignal()); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dNegTPCsignal"), centrality, pT, negTrackExtra.tpcSignal()); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dPosTPCsignalVsTrackPtot"), centrality, cand.positivept() * TMath::CosH(cand.positiveeta()), posTrackExtra.tpcSignal()); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dNegTPCsignalVsTrackPtot"), centrality, cand.negativept() * TMath::CosH(cand.negativeeta()), negTrackExtra.tpcSignal()); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dPosTPCsignalVsTrackPt"), centrality, cand.positivept(), posTrackExtra.tpcSignal()); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dNegTPCsignalVsTrackPt"), centrality, cand.negativept(), negTrackExtra.tpcSignal()); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dPosNsigmaTPCvsTrackPt"), centrality, cand.positivept(), posTrackExtra.tpcNSigmaPi()); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dNegNsigmaTPCvsTrackPt"), centrality, cand.negativept(), negTrackExtra.tpcNSigmaPi()); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dPosNsigmaTPCvsTrackPtot"), centrality, cand.positivept() * TMath::CosH(cand.positiveeta()), tpcNsigmaPos); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dNegNsigmaTPCvsTrackPtot"), centrality, cand.negativept() * TMath::CosH(cand.negativeeta()), tpcNsigmaNeg); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dPosNsigmaTPC"), centrality, pT, tpcNsigmaPos); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dNegNsigmaTPC"), centrality, pT, tpcNsigmaNeg); - } - if (PIDConfigurations.doTOFQA) { - histos.fill(HIST(particlenames[partID]) + HIST("/h3dPosTOFdeltaTvsTrackPt"), centrality, cand.positivept(), tofDeltaTPos); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dNegTOFdeltaTvsTrackPt"), centrality, cand.negativept(), tofDeltaTNeg); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dPosTOFdeltaT"), centrality, pT, tofDeltaTPos); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dNegTOFdeltaT"), centrality, pT, tofDeltaTNeg); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dPosTOFdeltaTvsTrackPtot"), centrality, cand.positivept() * TMath::CosH(cand.positiveeta()), tofDeltaTPos); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dNegTOFdeltaTvsTrackPtot"), centrality, cand.negativept() * TMath::CosH(cand.negativeeta()), tofDeltaTNeg); - } - } - - template - void fillHistogramsCasc(TCand cand, TCollision coll, int gap) - { - float invMass = 0; - float centrality = coll.centFT0C(); - float pT = cand.pt(); - float rapidity = 1e6; - - // Access daughter tracks - auto posTrackExtra = cand.template posTrackExtra_as(); - auto negTrackExtra = cand.template negTrackExtra_as(); - auto bachTrackExtra = cand.template bachTrackExtra_as(); - - bool posIsFromAfterburner = posTrackExtra.itsChi2PerNcl() < 0; - bool negIsFromAfterburner = negTrackExtra.itsChi2PerNcl() < 0; - bool bachIsFromAfterburner = bachTrackExtra.itsChi2PerNcl() < 0; - - uint posDetMap = computeDetBitmap(posTrackExtra.detectorMap()); - int posITSclusMap = computeITSclusBitmap(posTrackExtra.itsClusterMap(), posIsFromAfterburner); - uint negDetMap = computeDetBitmap(negTrackExtra.detectorMap()); - int negITSclusMap = computeITSclusBitmap(negTrackExtra.itsClusterMap(), negIsFromAfterburner); - uint bachDetMap = computeDetBitmap(bachTrackExtra.detectorMap()); - int bachITSclusMap = computeITSclusBitmap(bachTrackExtra.itsClusterMap(), bachIsFromAfterburner); - - // c x tau - float decayPos = std::hypot(cand.x() - coll.posX(), cand.y() - coll.posY(), cand.z() - coll.posZ()); - float totalMom = std::hypot(cand.px(), cand.py(), cand.pz()); - - float ctau = 0; - - float tpcNsigmaPos = 0; - float tpcNsigmaNeg = 0; - float tpcNsigmaBach = 0; - float tofDeltaTPos = 0; - float tofDeltaTNeg = 0; - float tofDeltaTBach = 0; - - if (partID == 3) { - invMass = cand.mXi(); - ctau = totalMom != 0 ? pdgDB->Mass(3312) * decayPos / (totalMom * ctauxiPDG) : 1e6; - rapidity = cand.yXi(); - - if (PIDConfigurations.doTPCQA) { - tpcNsigmaPos = posTrackExtra.tpcNSigmaPr(); - tpcNsigmaNeg = negTrackExtra.tpcNSigmaPi(); - tpcNsigmaBach = bachTrackExtra.tpcNSigmaPi(); - } - if (PIDConfigurations.doTOFQA) { - tofDeltaTPos = cand.posTOFDeltaTXiPr(); - tofDeltaTNeg = cand.negTOFDeltaTXiPi(); - tofDeltaTBach = cand.bachTOFDeltaTXiPi(); - } - } else if (partID == 4) { - invMass = cand.mXi(); - ctau = totalMom != 0 ? pdgDB->Mass(3312) * decayPos / (totalMom * ctauxiPDG) : 1e6; - rapidity = cand.yXi(); - - if (PIDConfigurations.doTPCQA) { - tpcNsigmaPos = posTrackExtra.tpcNSigmaPi(); - tpcNsigmaNeg = negTrackExtra.tpcNSigmaPr(); - tpcNsigmaBach = bachTrackExtra.tpcNSigmaPi(); - } - if (PIDConfigurations.doTOFQA) { - tofDeltaTPos = cand.posTOFDeltaTXiPi(); - tofDeltaTNeg = cand.negTOFDeltaTXiPr(); - tofDeltaTBach = cand.bachTOFDeltaTXiPi(); - } - - } else if (partID == 5) { - invMass = cand.mOmega(); - ctau = totalMom != 0 ? pdgDB->Mass(3334) * decayPos / (totalMom * ctauomegaPDG) : 1e6; - rapidity = cand.yOmega(); - - if (PIDConfigurations.doTPCQA) { - tpcNsigmaPos = posTrackExtra.tpcNSigmaPr(); - tpcNsigmaNeg = negTrackExtra.tpcNSigmaPi(); - tpcNsigmaBach = bachTrackExtra.tpcNSigmaKa(); - } - if (PIDConfigurations.doTOFQA) { - tofDeltaTPos = cand.posTOFDeltaTOmPi(); - tofDeltaTNeg = cand.posTOFDeltaTOmPr(); - tofDeltaTBach = cand.bachTOFDeltaTOmKa(); - } - - } else if (partID == 6) { - invMass = cand.mOmega(); - ctau = totalMom != 0 ? pdgDB->Mass(3334) * decayPos / (totalMom * ctauomegaPDG) : 1e6; - rapidity = cand.yOmega(); - - if (PIDConfigurations.doTPCQA) { - tpcNsigmaPos = posTrackExtra.tpcNSigmaPi(); - tpcNsigmaNeg = negTrackExtra.tpcNSigmaPr(); - tpcNsigmaBach = bachTrackExtra.tpcNSigmaKa(); - } - if (PIDConfigurations.doTOFQA) { - tofDeltaTPos = cand.posTOFDeltaTOmPr(); - tofDeltaTNeg = cand.posTOFDeltaTOmPi(); - tofDeltaTBach = cand.bachTOFDeltaTOmKa(); - } - } - histos.fill(HIST(particlenames[partID]) + HIST("/h2dMass"), invMass, gap); - histos.fill(HIST(particlenames[partID]) + HIST("/h7dMass"), centrality, pT, invMass, gap, coll.multNTracksGlobal(), rapidity, cand.eta()); - if (doKienmaticQA) { - histos.fill(HIST(particlenames[partID]) + HIST("/h3dPosEtaPt"), pT, cand.positiveeta(), gap); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dNegEtaPt"), pT, cand.negativeeta(), gap); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dBachEtaPt"), pT, cand.bacheloreta(), gap); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dRapPt"), pT, rapidity, gap); - } - if (doPlainTopoQA) { - histos.fill(HIST(particlenames[partID]) + HIST("/hCascCosPA"), pT, cand.casccosPA(coll.posX(), coll.posY(), coll.posZ())); - histos.fill(HIST(particlenames[partID]) + HIST("/hDCACascDaughters"), pT, cand.dcacascdaughters()); - histos.fill(HIST(particlenames[partID]) + HIST("/hCascRadius"), pT, cand.cascradius()); - histos.fill(HIST(particlenames[partID]) + HIST("/hMesonDCAToPV"), pT, cand.dcanegtopv()); - histos.fill(HIST(particlenames[partID]) + HIST("/hBaryonDCAToPV"), pT, cand.dcapostopv()); - histos.fill(HIST(particlenames[partID]) + HIST("/hBachDCAToPV"), pT, cand.dcabachtopv()); - histos.fill(HIST(particlenames[partID]) + HIST("/hV0CosPA"), pT, cand.v0cosPA(coll.posX(), coll.posY(), coll.posZ())); - histos.fill(HIST(particlenames[partID]) + HIST("/hV0Radius"), pT, cand.v0radius()); - histos.fill(HIST(particlenames[partID]) + HIST("/hDCAV0Daughters"), pT, cand.dcaV0daughters()); - histos.fill(HIST(particlenames[partID]) + HIST("/hDCAV0ToPV"), pT, fabs(cand.dcav0topv(coll.posX(), coll.posY(), coll.posZ()))); - histos.fill(HIST(particlenames[partID]) + HIST("/hMassLambdaDau"), pT, cand.mLambda()); - histos.fill(HIST(particlenames[partID]) + HIST("/hNctau"), pT, ctau); - } - if (PIDConfigurations.doTPCQA) { - histos.fill(HIST(particlenames[partID]) + HIST("/h3dPosNsigmaTPC"), centrality, pT, tpcNsigmaPos); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dNegNsigmaTPC"), centrality, pT, tpcNsigmaNeg); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dBachNsigmaTPC"), centrality, pT, tpcNsigmaBach); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dPosTPCsignal"), centrality, pT, posTrackExtra.tpcSignal()); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dNegTPCsignal"), centrality, pT, negTrackExtra.tpcSignal()); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dBachTPCsignal"), centrality, pT, bachTrackExtra.tpcSignal()); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dPosNsigmaTPCvsTrackPtot"), centrality, cand.positivept() * TMath::CosH(cand.positiveeta()), tpcNsigmaPos); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dNegNsigmaTPCvsTrackPtot"), centrality, cand.negativept() * TMath::CosH(cand.negativeeta()), tpcNsigmaNeg); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dBachNsigmaTPCvsTrackPtot"), centrality, cand.bachelorpt() * TMath::CosH(cand.bacheloreta()), tpcNsigmaBach); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dPosTPCsignalVsTrackPtot"), centrality, cand.positivept() * TMath::CosH(cand.positiveeta()), posTrackExtra.tpcSignal()); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dNegTPCsignalVsTrackPtot"), centrality, cand.negativept() * TMath::CosH(cand.negativeeta()), negTrackExtra.tpcSignal()); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dBachTPCsignalVsTrackPtot"), centrality, cand.bachelorpt() * TMath::CosH(cand.bacheloreta()), bachTrackExtra.tpcSignal()); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dPosNsigmaTPCvsTrackPt"), centrality, cand.positivept(), tpcNsigmaPos); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dNegNsigmaTPCvsTrackPt"), centrality, cand.negativept(), tpcNsigmaNeg); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dBachNsigmaTPCvsTrackPt"), centrality, cand.bachelorpt(), tpcNsigmaBach); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dPosTPCsignalVsTrackPt"), centrality, cand.positivept(), posTrackExtra.tpcSignal()); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dNegTPCsignalVsTrackPt"), centrality, cand.negativept(), negTrackExtra.tpcSignal()); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dBachTPCsignalVsTrackPt"), centrality, cand.bachelorpt(), bachTrackExtra.tpcSignal()); - } - if (PIDConfigurations.doTOFQA) { - histos.fill(HIST(particlenames[partID]) + HIST("/h3dPosTOFdeltaT"), centrality, pT, tofDeltaTPos); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dNegTOFdeltaT"), centrality, pT, tofDeltaTNeg); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dBachTOFdeltaT"), centrality, pT, tofDeltaTBach); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dPosTOFdeltaTvsTrackPtot"), centrality, cand.positivept() * TMath::CosH(cand.positiveeta()), tofDeltaTPos); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dNegTOFdeltaTvsTrackPtot"), centrality, cand.negativept() * TMath::CosH(cand.negativeeta()), tofDeltaTNeg); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dBachTOFdeltaTvsTrackPtot"), centrality, cand.bachelorpt() * TMath::CosH(cand.bacheloreta()), tofDeltaTBach); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dPosTOFdeltaTvsTrackPt"), centrality, cand.positivept(), tofDeltaTPos); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dNegTOFdeltaTvsTrackPt"), centrality, cand.negativept(), tofDeltaTNeg); - histos.fill(HIST(particlenames[partID]) + HIST("/h3dBachTOFdeltaTvsTrackPt"), centrality, cand.bachelorpt(), tofDeltaTBach); - } - if (doDetectPropQA == 1) { - histos.fill(HIST(particlenames[partID]) + HIST("/h8dDetectPropVsCentrality"), centrality, posDetMap, posITSclusMap, negDetMap, negITSclusMap, bachDetMap, bachITSclusMap, pT); - histos.fill(HIST(particlenames[partID]) + HIST("/h4dPosDetectPropVsCentrality"), centrality, posTrackExtra.detectorMap(), posTrackExtra.itsClusterMap(), pT); - histos.fill(HIST(particlenames[partID]) + HIST("/h4dNegDetectPropVsCentrality"), centrality, negTrackExtra.detectorMap(), negTrackExtra.itsClusterMap(), pT); - histos.fill(HIST(particlenames[partID]) + HIST("/h4dBachDetectPropVsCentrality"), centrality, bachTrackExtra.detectorMap(), bachTrackExtra.itsClusterMap(), pT); - } - if (doDetectPropQA == 2) { - histos.fill(HIST(particlenames[partID]) + HIST("/h9dDetectPropVsCentrality"), centrality, posDetMap, posITSclusMap, negDetMap, negITSclusMap, bachDetMap, bachITSclusMap, pT, invMass); - histos.fill(HIST(particlenames[partID]) + HIST("/h5dPosDetectPropVsCentrality"), centrality, posTrackExtra.detectorMap(), posTrackExtra.itsClusterMap(), pT, invMass); - histos.fill(HIST(particlenames[partID]) + HIST("/h5dNegDetectPropVsCentrality"), centrality, negTrackExtra.detectorMap(), negTrackExtra.itsClusterMap(), pT, invMass); - histos.fill(HIST(particlenames[partID]) + HIST("/h5dBachDetectPropVsCentrality"), centrality, bachTrackExtra.detectorMap(), bachTrackExtra.itsClusterMap(), pT, invMass); - } - } - - void init(InitContext const&) - { - if ((doprocessV0s == true) && (doprocessCascades == true)) { - LOG(fatal) << "Unable to analyze both v0s and cascades simultaneously. Please enable only one process at a time"; - } - - // initialise bit masks - setBits(maskTopologicalV0, {selV0CosPA, selDCANegToPV, selDCAPosToPV, selDCAV0Dau, selV0Radius, selV0RadiusMax}); - setBits(maskTopologicalCasc, {selCascCosPA, selDCACascDau, selCascRadius, selCascRadiusMax, selBachToPV, selMesonToPV, selBaryonToPV, - selDCAV0ToPV, selV0CosPA, selDCAV0Dau, selV0Radius, selV0RadiusMax, selLambdaMassWin}); - - if (doBachelorBaryonCut) - maskTopologicalCasc.set(selBachBaryon); - - setBits(maskKinematicV0, {selPosEta, selNegEta}); - setBits(maskKinematicCasc, {selPosEta, selNegEta, selBachEta}); - - // Specific masks - setBits(maskK0ShortSpecific, {selK0ShortRapidity, selK0ShortCTau, selK0ShortArmenteros, selConsiderK0Short}); - setBits(maskLambdaSpecific, {selLambdaRapidity, selLambdaCTau, selConsiderLambda}); - setBits(maskAntiLambdaSpecific, {selLambdaRapidity, selLambdaCTau, selConsiderAntiLambda}); - setBits(maskXiSpecific, {selXiRapidity, selXiCTau, selRejCompXi, selMassWinXi, selConsiderXi}); - setBits(maskAntiXiSpecific, {selXiRapidity, selXiCTau, selRejCompXi, selMassWinXi, selConsiderAntiXi}); - setBits(maskOmegaSpecific, {selOmegaRapidity, selOmegaCTau, selRejCompOmega, selMassWinOmega, selConsiderOmega}); - setBits(maskAntiOmegaSpecific, {selOmegaRapidity, selOmegaCTau, selRejCompOmega, selMassWinOmega, selConsiderAntiOmega}); - - // ask for specific TPC/TOF PID selections - // positive track - if (TrackConfigurations.requirePosITSonly) { - setBits(maskTrackPropertiesV0, {selPosItsOnly, selPosGoodITSTrack}); - } else { - setBits(maskTrackPropertiesV0, {selPosGoodTPCTrack, selPosGoodITSTrack}); - // TPC signal is available: ask for positive track PID - if (PIDConfigurations.TpcPidNsigmaCut < 1e+5) { // safeguard for no cut - maskK0ShortSpecific.set(selTPCPIDPositivePion); - maskLambdaSpecific.set(selTPCPIDPositiveProton); - maskAntiLambdaSpecific.set(selTPCPIDPositivePion); - - maskXiSpecific.set(selTPCPIDPositiveProton); - maskAntiXiSpecific.set(selTPCPIDPositivePion); - maskOmegaSpecific.set(selTPCPIDPositiveProton); - maskAntiOmegaSpecific.set(selTPCPIDPositivePion); - } - // TOF PID - if (PIDConfigurations.TofPidNsigmaCutK0Pi < 1e+5) { // safeguard for no cut - setBits(maskK0ShortSpecific, {selTOFNSigmaPositivePionK0Short, selTOFDeltaTPositivePionK0Short}); - } - if (PIDConfigurations.TofPidNsigmaCutLaPr < 1e+5) { // safeguard for no cut - setBits(maskLambdaSpecific, {selTOFNSigmaPositiveProtonLambda, selTOFDeltaTPositiveProtonLambda}); - setBits(maskXiSpecific, {selTOFNSigmaPositiveProtonLambdaXi, selTOFDeltaTPositiveProtonLambdaXi}); - setBits(maskOmegaSpecific, {selTOFNSigmaPositiveProtonLambdaOmega, selTOFDeltaTPositiveProtonLambdaOmega}); - } - if (PIDConfigurations.TofPidNsigmaCutLaPi < 1e+5) { // safeguard for no cut - setBits(maskAntiLambdaSpecific, {selTOFNSigmaPositivePionLambda, selTOFDeltaTPositivePionLambda}); - setBits(maskAntiXiSpecific, {selTOFNSigmaPositivePionLambdaXi, selTOFDeltaTPositivePionLambdaXi}); - setBits(maskAntiOmegaSpecific, {selTOFNSigmaPositivePionLambdaOmega, selTOFDeltaTPositivePionLambdaOmega}); - } - } - // negative track - if (TrackConfigurations.requireNegITSonly) { - setBits(maskTrackPropertiesV0, {selNegItsOnly, selNegGoodITSTrack}); - } else { - setBits(maskTrackPropertiesV0, {selNegGoodTPCTrack, selNegGoodITSTrack}); - // TPC signal is available: ask for negative track PID - if (PIDConfigurations.TpcPidNsigmaCut < 1e+5) { // safeguard for no cut - maskK0ShortSpecific.set(selTPCPIDNegativePion); - maskLambdaSpecific.set(selTPCPIDNegativePion); - maskAntiLambdaSpecific.set(selTPCPIDNegativeProton); - - maskXiSpecific.set(selTPCPIDNegativePion); - maskAntiXiSpecific.set(selTPCPIDPositiveProton); - maskOmegaSpecific.set(selTPCPIDNegativePion); - maskAntiOmegaSpecific.set(selTPCPIDPositiveProton); - } - // TOF PID - if (PIDConfigurations.TofPidNsigmaCutK0Pi < 1e+5) { // safeguard for no cut - setBits(maskK0ShortSpecific, {selTOFNSigmaNegativePionK0Short, selTOFDeltaTNegativePionK0Short}); - } - if (PIDConfigurations.TofPidNsigmaCutLaPr < 1e+5) { // safeguard for no cut - setBits(maskAntiLambdaSpecific, {selTOFNSigmaNegativeProtonLambda, selTOFDeltaTNegativeProtonLambda}); - setBits(maskAntiXiSpecific, {selTOFNSigmaNegativeProtonLambdaXi, selTOFDeltaTNegativeProtonLambdaXi}); - setBits(maskAntiOmegaSpecific, {selTOFNSigmaNegativeProtonLambdaOmega, selTOFDeltaTNegativeProtonLambdaOmega}); - } - if (PIDConfigurations.TofPidNsigmaCutLaPi < 1e+5) { // safeguard for no cut - setBits(maskLambdaSpecific, {selTOFNSigmaNegativePionLambda, selTOFDeltaTNegativePionLambda}); - setBits(maskXiSpecific, {selTOFNSigmaNegativePionLambdaXi, selTOFDeltaTNegativePionLambdaXi}); - setBits(maskOmegaSpecific, {selTOFNSigmaNegativePionLambdaOmega, selTOFDeltaTNegativePionLambdaOmega}); - } - } - // bachelor track - maskTrackPropertiesCasc = maskTrackPropertiesV0; - if (TrackConfigurations.requireBachITSonly) { - setBits(maskTrackPropertiesCasc, {selBachItsOnly, selBachGoodITSTrack}); - } else { - setBits(maskTrackPropertiesCasc, {selBachGoodTPCTrack, selBachGoodITSTrack}); - // TPC signal is available: ask for positive track PID - if (PIDConfigurations.TpcPidNsigmaCut < 1e+5) { // safeguard for no cut - maskXiSpecific.set(selTPCPIDBachPion); - maskAntiXiSpecific.set(selTPCPIDBachPion); - maskOmegaSpecific.set(selTPCPIDBachKaon); - maskAntiOmegaSpecific.set(selTPCPIDBachKaon); - } - // TOF PID - if (PIDConfigurations.TofPidNsigmaCutXiPi < 1e+5) { // safeguard for no cut - setBits(maskXiSpecific, {selTOFNSigmaBachPionXi, selTOFDeltaTBachPionXi}); - setBits(maskAntiXiSpecific, {selTOFNSigmaBachPionXi, selTOFDeltaTBachPionXi}); - } - if (PIDConfigurations.TofPidNsigmaCutOmegaKaon < 1e+5) { // safeguard for no cut - setBits(maskOmegaSpecific, {selTOFNSigmaBachKaonOmega, selTOFDeltaTBachKaonOmega}); - setBits(maskAntiOmegaSpecific, {selTOFNSigmaBachKaonOmega, selTOFDeltaTBachKaonOmega}); - } - } - - if (TrackConfigurations.skipTPConly) { - setBits(maskK0ShortSpecific, {selPosNotTPCOnly, selNegNotTPCOnly}); - setBits(maskLambdaSpecific, {selPosNotTPCOnly, selNegNotTPCOnly}); - setBits(maskAntiLambdaSpecific, {selPosNotTPCOnly, selNegNotTPCOnly}); - setBits(maskXiSpecific, {selPosNotTPCOnly, selNegNotTPCOnly, selBachNotTPCOnly}); - setBits(maskOmegaSpecific, {selPosNotTPCOnly, selNegNotTPCOnly, selBachNotTPCOnly}); - setBits(maskAntiXiSpecific, {selPosNotTPCOnly, selNegNotTPCOnly, selBachNotTPCOnly}); - setBits(maskAntiOmegaSpecific, {selPosNotTPCOnly, selNegNotTPCOnly, selBachNotTPCOnly}); - } - - // Primary particle selection, central to analysis - maskSelectionK0Short = maskTopologicalV0 | maskKinematicV0 | maskTrackPropertiesV0 | maskK0ShortSpecific | (std::bitset(1) << selPhysPrimK0Short); - maskSelectionLambda = maskTopologicalV0 | maskKinematicV0 | maskTrackPropertiesV0 | maskLambdaSpecific | (std::bitset(1) << selPhysPrimLambda); - maskSelectionAntiLambda = maskTopologicalV0 | maskKinematicV0 | maskTrackPropertiesV0 | maskAntiLambdaSpecific | (std::bitset(1) << selPhysPrimAntiLambda); - maskSelectionXi = maskTopologicalCasc | maskKinematicCasc | maskTrackPropertiesCasc | maskXiSpecific | (std::bitset(1) << selPhysPrimXi); - maskSelectionAntiXi = maskTopologicalCasc | maskKinematicCasc | maskTrackPropertiesCasc | maskAntiXiSpecific | (std::bitset(1) << selPhysPrimAntiXi); - maskSelectionOmega = maskTopologicalCasc | maskKinematicCasc | maskTrackPropertiesCasc | maskOmegaSpecific | (std::bitset(1) << selPhysPrimOmega); - maskSelectionAntiOmega = maskTopologicalCasc | maskKinematicCasc | maskTrackPropertiesCasc | maskAntiOmegaSpecific | (std::bitset(1) << selPhysPrimAntiOmega); - - // Event Counters - histos.add("hEventSelection", "hEventSelection", kTH1F, {{16, -0.5f, +15.5f}}); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(1, "All collisions"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(2, "kIsTriggerTVX"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(3, "posZ cut"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(4, "kNoITSROFrameBorder"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(5, "kNoTimeFrameBorder"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(6, "kIsVertexITSTPC"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(7, "kIsGoodZvtxFT0vsPV"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(8, "kIsVertexTOFmatched"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(9, "kIsVertexTRDmatched"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(10, "kNoSameBunchPileup"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(11, "kNoCollInTimeRangeStd"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(12, "kNoCollInTimeRangeNarrow"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(13, "Below min occup."); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(14, "Above max occup."); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(15, "isUPC"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(16, "has UPC flag"); - - // Event QA - histos.add("eventQA/hCentrality", "hCentrality", kTH2F, {axisFT0C_QA, axisSelGap}); - histos.add("eventQA/hCentralityVsTracksPVeta1", "hCentralityVsTracksPVeta1", kTH3F, {axisFT0C_QA, axisNTracksPVeta1, axisSelGap}); - histos.add("eventQA/hCentralityVsTracksTotalExceptITSonly", "hCentralityVsTracksTotalExceptITSonly", kTH3F, {axisFT0C_QA, axisNTracksTotalExceptITSonly, axisSelGap}); - histos.add("eventQA/hOccupancy", "hOccupancy", kTH2F, {axisOccupancy, axisSelGap}); - histos.add("eventQA/hCentralityVsOccupancy", "hCentralityVsOccupancy", kTH3F, {axisFT0C_QA, axisOccupancy, axisSelGap}); - histos.add("eventQA/hTracksPVeta1VsTracksGlobal", "hTracksPVeta1VsTracksGlobal", kTH3F, {axisNTracksPVeta1, axisNTracksGlobal, axisSelGap}); - histos.add("eventQA/hCentralityVsTracksGlobal", "hCentralityVsTracksGlobal", kTH3F, {axisFT0C_QA, axisNTracksGlobal, axisSelGap}); - histos.add("eventQA/hGapSide", "Gap side; Entries", kTH1F, {{5, -0.5, 4.5}}); - histos.add("eventQA/hSelGapSide", "Selected gap side; Entries", kTH1F, {axisSelGap}); - histos.add("eventQA/hPosX", "Vertex position in x", kTH2F, {{100, -0.1, 0.1}, axisSelGap}); - histos.add("eventQA/hPosY", "Vertex position in y", kTH2F, {{100, -0.1, 0.1}, axisSelGap}); - histos.add("eventQA/hPosZ", "Vertex position in z", kTH2F, {{100, -20., 20.}, axisSelGap}); - histos.add("eventQA/hFT0", "hFT0", kTH3F, {axisDetectors.axisFT0Aampl, axisDetectors.axisFT0Campl, axisSelGap}); - histos.add("eventQA/hFDD", "hFDD", kTH3F, {axisDetectors.axisFDDAampl, axisDetectors.axisFDDCampl, axisSelGap}); - histos.add("eventQA/hZN", "hZN", kTH3F, {axisDetectors.axisZNAampl, axisDetectors.axisZNCampl, axisSelGap}); - - if (doprocessV0s) { - // For all candidates - if (doPlainTopoQA) { - histos.add("generalQA/hPt", "hPt", kTH1F, {axisPtCoarse}); - histos.add("generalQA/hPosDCAToPV", "hPosDCAToPV", kTH1F, {axisDCAtoPV}); - histos.add("generalQA/hNegDCAToPV", "hNegDCAToPV", kTH1F, {axisDCAtoPV}); - histos.add("generalQA/hDCADaughters", "hDCADaughters", kTH1F, {axisDCAdau}); - histos.add("generalQA/hPointingAngle", "hPointingAngle", kTH1F, {axisPointingAngle}); - histos.add("generalQA/hV0Radius", "hV0Radius", kTH1F, {axisV0Radius}); - histos.add("generalQA/h2dPositiveITSvsTPCpts", "h2dPositiveITSvsTPCpts", kTH2F, {axisTPCrows, axisITSclus}); - histos.add("generalQA/h2dNegativeITSvsTPCpts", "h2dNegativeITSvsTPCpts", kTH2F, {axisTPCrows, axisITSclus}); - histos.add("generalQA/h2dArmenterosAll", "h2dArmenterosAll", kTH2F, {axisAPAlpha, axisAPQt}); - histos.add("generalQA/h2dArmenterosSelected", "h2dArmenterosSelected", kTH2F, {axisAPAlpha, axisAPQt}); - } - - // K0s - if (analyseK0Short) { - addHistograms<0>(histos); - } - - // Lambda - if (analyseLambda) { - addHistograms<1>(histos); - if (doCollisionAssociationQA) { - addCollisionAssocHistograms<1>(histos); - } - } - - // Anti-Lambda - if (analyseAntiLambda) { - addHistograms<2>(histos); - if (doCollisionAssociationQA) { - addCollisionAssocHistograms<2>(histos); - } - } - } - - if (doprocessCascades) { - // For all candidates - if (doPlainTopoQA) { - histos.add("generalQA/hPt", "hPt", kTH1F, {axisPtCoarse}); - histos.add("generalQA/hCascCosPA", "hCascCosPA", kTH2F, {axisPtCoarse, {100, 0.9f, 1.0f}}); - histos.add("generalQA/hDCACascDaughters", "hDCACascDaughters", kTH2F, {axisPtCoarse, {44, 0.0f, 2.2f}}); - histos.add("generalQA/hCascRadius", "hCascRadius", kTH2D, {axisPtCoarse, {500, 0.0f, 50.0f}}); - histos.add("generalQA/hMesonDCAToPV", "hMesonDCAToPV", kTH2F, {axisPtCoarse, axisDCAtoPV}); - histos.add("generalQA/hBaryonDCAToPV", "hBaryonDCAToPV", kTH2F, {axisPtCoarse, axisDCAtoPV}); - histos.add("generalQA/hBachDCAToPV", "hBachDCAToPV", kTH2F, {axisPtCoarse, {200, -1.0f, 1.0f}}); - histos.add("generalQA/hV0CosPA", "hV0CosPA", kTH2F, {axisPtCoarse, {100, 0.9f, 1.0f}}); - histos.add("generalQA/hV0Radius", "hV0Radius", kTH2D, {axisPtCoarse, axisV0Radius}); - histos.add("generalQA/hDCAV0Daughters", "hDCAV0Daughters", kTH2F, {axisPtCoarse, axisDCAdau}); - histos.add("generalQA/hDCAV0ToPV", "hDCAV0ToPV", kTH2F, {axisPtCoarse, {44, 0.0f, 2.2f}}); - histos.add("generalQA/hMassLambdaDau", "hMassLambdaDau", kTH2F, {axisPtCoarse, axisLambdaMass}); - histos.add("generalQA/h2dPositiveITSvsTPCpts", "h2dPositiveITSvsTPCpts", kTH2F, {axisTPCrows, axisITSclus}); - histos.add("generalQA/h2dNegativeITSvsTPCpts", "h2dNegativeITSvsTPCpts", kTH2F, {axisTPCrows, axisITSclus}); - histos.add("generalQA/h2dBachITSvsTPCpts", "h2dBachITSvsTPCpts", kTH2F, {axisTPCrows, axisITSclus}); - } - - // Xi - if (analyseXi) { - addHistograms<3>(histos); - } - - // Anti-Xi - if (analyseAntiXi) { - addHistograms<4>(histos); - } - - // Omega - if (analyseOmega) { - addHistograms<5>(histos); - } - - // Anti-Omega - if (analyseAntiOmega) { - addHistograms<6>(histos); - } - } - - if (verbose) { - histos.print(); - } - } - - template - int getGapSide(TCollision const& collision) - { - int selGapSide = sgSelector.trueGap(collision, upcCuts.FV0cut, upcCuts.FT0Acut, upcCuts.FT0Ccut, upcCuts.ZDCcut); - histos.fill(HIST("eventQA/hGapSide"), collision.gapSide()); - histos.fill(HIST("eventQA/hSelGapSide"), selGapSide); - histos.fill(HIST("eventQA/hFT0"), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), selGapSide); - histos.fill(HIST("eventQA/hFDD"), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), selGapSide); - histos.fill(HIST("eventQA/hZN"), collision.energyCommonZNA(), collision.energyCommonZNC(), selGapSide); - return selGapSide; - } - - template - void fillHistogramsQA(TCollision const& collision, int const& gap) - { - // QA histograms - float centrality = collision.centFT0C(); - histos.fill(HIST("eventQA/hCentrality"), centrality, gap); - histos.fill(HIST("eventQA/hCentralityVsTracksTotalExceptITSonly"), centrality, collision.multAllTracksTPCOnly() + collision.multAllTracksITSTPC(), gap); - histos.fill(HIST("eventQA/hCentralityVsTracksPVeta1"), centrality, collision.multNTracksPVeta1(), gap); - histos.fill(HIST("eventQA/hOccupancy"), collision.trackOccupancyInTimeRange(), gap); - histos.fill(HIST("eventQA/hCentralityVsOccupancy"), centrality, collision.trackOccupancyInTimeRange(), gap); - histos.fill(HIST("eventQA/hTracksPVeta1VsTracksGlobal"), collision.multNTracksPVeta1(), collision.multNTracksGlobal(), gap); - histos.fill(HIST("eventQA/hCentralityVsTracksGlobal"), centrality, collision.multNTracksGlobal(), gap); - histos.fill(HIST("eventQA/hPosX"), collision.posX(), gap); - histos.fill(HIST("eventQA/hPosY"), collision.posY(), gap); - histos.fill(HIST("eventQA/hPosZ"), collision.posZ(), gap); - } - - template - bool acceptEvent(TCollision const& collision) - { - histos.fill(HIST("hEventSelection"), 0. /* all collisions */); - - if (requireIsTriggerTVX && !collision.selection_bit(aod::evsel::kIsTriggerTVX)) { - return false; - } - histos.fill(HIST("hEventSelection"), 1 /* triggered by FT0M */); - - if (fabs(collision.posZ()) > 10.f) { - return false; - } - histos.fill(HIST("hEventSelection"), 2 /* vertex-Z selected */); - - if (rejectITSROFBorder && !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { - return false; - } - histos.fill(HIST("hEventSelection"), 3 /* Not at ITS ROF border */); - - if (rejectTFBorder && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { - return false; - } - histos.fill(HIST("hEventSelection"), 4 /* Not at TF border */); - - if (requireIsVertexITSTPC && !collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) { - return false; - } - histos.fill(HIST("hEventSelection"), 5 /* Contains at least one ITS-TPC track */); - - if (requireIsGoodZvtxFT0VsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { - return false; - } - histos.fill(HIST("hEventSelection"), 6 /* PV position consistency check */); - - if (requireIsVertexTOFmatched && !collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) { - return false; - } - histos.fill(HIST("hEventSelection"), 7 /* PV with at least one contributor matched with TOF */); - - if (requireIsVertexTRDmatched && !collision.selection_bit(o2::aod::evsel::kIsVertexTRDmatched)) { - return false; - } - histos.fill(HIST("hEventSelection"), 8 /* PV with at least one contributor matched with TRD */); - - if (rejectSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { - return false; - } - histos.fill(HIST("hEventSelection"), 9 /* Not at same bunch pile-up */); - - if (requireNoCollInTimeRangeStd && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { - return false; - } - histos.fill(HIST("hEventSelection"), 10 /* No other collision within +/- 10 microseconds */); - - if (requireNoCollInTimeRangeNarrow && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeNarrow)) { - return false; - } - histos.fill(HIST("hEventSelection"), 11 /* No other collision within +/- 4 microseconds */); - - if (minOccupancy > 0 && collision.trackOccupancyInTimeRange() < minOccupancy) { - return false; - } - histos.fill(HIST("hEventSelection"), 12 /* Above min occupancy */); - - if (maxOccupancy > 0 && collision.trackOccupancyInTimeRange() > maxOccupancy) { - return false; - } - histos.fill(HIST("hEventSelection"), 13 /* Below max occupancy */); - - if (studyUPConly && !collision.isUPC()) { - return false; - } else if (collision.isUPC()) { - histos.fill(HIST("hEventSelection"), 14 /* is UPC compatible */); - } - - if (useUPCflag && (collision.flags() < 1)) { - return false; - } else if (collision.flags() >= 1) { - histos.fill(HIST("hEventSelection"), 15 /* UPC event */); - } - - return true; - } - - bool verifyMask(std::bitset bitmap, std::bitset mask) - { - return (bitmap & mask) == mask; - } - - int computeITSclusBitmap(uint8_t itsClusMap, bool fromAfterburner) - { - int bitMap = 0; - - struct MaskBitmapPair { - uint8_t mask; - int bitmap; - int afterburnerBitmap; - }; - - constexpr MaskBitmapPair configs[] = { - // L6 <-- L0 - {0x7F, 12, 12}, // 01111 111 (L0 to L6) - {0x7E, 11, 11}, // 01111 110 (L1 to L6) - {0x7C, 10, 10}, // 01111 100 (L2 to L6) - {0x78, 9, -3}, // 01111 000 (L3 to L6) - {0x70, 8, -2}, // 01110 000 (L4 to L6) - {0x60, 7, -1}, // 01100 000 (L5 to L6) - {0x3F, 6, 6}, // 00111 111 (L0 to L5) - {0x3E, 5, 5}, // 00111 110 (L1 to L5) - {0x3C, 4, 4}, // 00111 100 (L2 to L5) - {0x1F, 3, 3}, // 00011 111 (L0 to L4) - {0x1E, 2, 2}, // 00011 110 (L1 to L4) - {0x0F, 1, 1}, // 00001 111 (L0 to L3) - }; - - for (const auto& config : configs) { - if (verifyMask(itsClusMap, config.mask)) { - bitMap = fromAfterburner ? config.afterburnerBitmap : config.bitmap; - break; - } - } - - return bitMap; - } - - uint computeDetBitmap(uint8_t detMap) - { - uint bitMap = 0; - - struct MaskBitmapPair { - uint8_t mask; - int bitmap; - }; - - constexpr MaskBitmapPair configs[] = { - {o2::aod::track::ITS | o2::aod::track::TPC | o2::aod::track::TRD | o2::aod::track::TOF, 4}, // ITS-TPC-TRD-TOF - {o2::aod::track::ITS | o2::aod::track::TPC | o2::aod::track::TOF, 3}, // ITS-TPC-TOF - {o2::aod::track::ITS | o2::aod::track::TPC | o2::aod::track::TRD, 2}, // ITS-TPC-TRD - {o2::aod::track::ITS | o2::aod::track::TPC, 1} // ITS-TPC - }; - - for (const auto& config : configs) { - if (verifyMask(detMap, config.mask)) { - bitMap = config.bitmap; - break; - } - } - - return bitMap; - } - - template - std::bitset computeBitmapCascade(TCasc const& casc, TCollision const& coll) - { - float rapidityXi = casc.yXi(); - float rapidityOmega = casc.yOmega(); - - // Access daughter tracks - auto posTrackExtra = casc.template posTrackExtra_as(); - auto negTrackExtra = casc.template negTrackExtra_as(); - auto bachTrackExtra = casc.template bachTrackExtra_as(); - - // c x tau - float decayPos = std::hypot(casc.x() - coll.posX(), casc.y() - coll.posY(), casc.z() - coll.posZ()); - float totalMom = std::hypot(casc.px(), casc.py(), casc.pz()); - float ctauXi = totalMom != 0 ? pdgDB->Mass(3312) * decayPos / totalMom : 1e6; - float ctauOmega = totalMom != 0 ? pdgDB->Mass(3334) * decayPos / totalMom : 1e6; - - std::bitset bitMap = 0; - - if (casc.casccosPA(coll.posX(), coll.posY(), coll.posZ()) > casccuts.casccospa) - bitMap.set(selCascCosPA); - if (casc.dcacascdaughters() < casccuts.dcacascdau) - bitMap.set(selDCACascDau); - if (casc.cascradius() > casccuts.cascradius) - bitMap.set(selCascRadius); - if (casc.cascradius() < casccuts.cascradiusMax) - bitMap.set(selCascRadiusMax); - if (doBachelorBaryonCut && (casc.bachBaryonCosPA() < casccuts.bachbaryoncospa) && (fabs(casc.bachBaryonDCAxyToPV()) > casccuts.bachbaryondcaxytopv)) - bitMap.set(selBachBaryon); - if (fabs(casc.dcabachtopv()) > casccuts.dcabachtopv) - bitMap.set(selBachToPV); - - if (casc.sign() > 0) { - if (fabs(casc.dcanegtopv()) > casccuts.dcabaryontopv) - bitMap.set(selBaryonToPV); - if (fabs(casc.dcapostopv()) > casccuts.dcamesontopv) - bitMap.set(selMesonToPV); - } else { // no sign == 0, in principle - if (fabs(casc.dcapostopv()) > casccuts.dcabaryontopv) - bitMap.set(selBaryonToPV); - if (fabs(casc.dcanegtopv()) > casccuts.dcamesontopv) - bitMap.set(selMesonToPV); - } - - if (fabs(casc.mXi() - pdgDB->Mass(3312)) < casccuts.masswin) - bitMap.set(selMassWinXi); - if (fabs(casc.mOmega() - pdgDB->Mass(3334)) < casccuts.masswin) - bitMap.set(selMassWinOmega); - if (fabs(casc.mLambda() - pdgDB->Mass(3122)) < casccuts.lambdamasswin) - bitMap.set(selLambdaMassWin); - - if (fabs(casc.dcav0topv(coll.posX(), coll.posY(), coll.posZ())) > casccuts.dcav0topv) - bitMap.set(selDCAV0ToPV); - if (casc.v0radius() > v0cuts.v0radius) - bitMap.set(selV0Radius); - if (casc.v0radius() < v0cuts.v0radiusMax) - bitMap.set(selV0RadiusMax); - if (casc.v0cosPA(coll.posX(), coll.posY(), coll.posZ()) > v0cuts.v0cospa) - bitMap.set(selV0CosPA); - if (casc.dcaV0daughters() < v0cuts.dcav0dau) - bitMap.set(selDCAV0Dau); - - // proper lifetime - if (ctauXi < nCtauCutCasc->get("lifetimecutXi") * ctauxiPDG) - bitMap.set(selXiCTau); - if (ctauOmega < nCtauCutCasc->get("lifetimecutOmega") * ctauomegaPDG) - bitMap.set(selOmegaCTau); - - auto poseta = RecoDecay::eta(std::array{casc.pxpos(), casc.pypos(), casc.pzpos()}); - auto negeta = RecoDecay::eta(std::array{casc.pxneg(), casc.pyneg(), casc.pzneg()}); - auto bacheta = RecoDecay::eta(std::array{casc.pxbach(), casc.pybach(), casc.pzbach()}); - - // kinematic - if (fabs(rapidityXi) < rapidityCut) - bitMap.set(selXiRapidity); - if (fabs(rapidityOmega) < rapidityCut) - bitMap.set(selOmegaRapidity); - if (fabs(poseta) < daughterEtaCut) - bitMap.set(selNegEta); - if (fabs(negeta) < daughterEtaCut) - bitMap.set(selPosEta); - if (fabs(bacheta) < daughterEtaCut) - bitMap.set(selBachEta); - - // ITS quality flags - if (posTrackExtra.itsNCls() >= TrackConfigurations.minITSclusters) - bitMap.set(selPosGoodITSTrack); - if (negTrackExtra.itsNCls() >= TrackConfigurations.minITSclusters) - bitMap.set(selNegGoodITSTrack); - if (bachTrackExtra.itsNCls() >= TrackConfigurations.minITSclusters) - bitMap.set(selBachGoodITSTrack); - - // TPC quality flags - if (posTrackExtra.tpcCrossedRows() >= TrackConfigurations.minTPCrows) - bitMap.set(selPosGoodTPCTrack); - if (negTrackExtra.tpcCrossedRows() >= TrackConfigurations.minTPCrows) - bitMap.set(selNegGoodTPCTrack); - if (bachTrackExtra.tpcCrossedRows() >= TrackConfigurations.minTPCrows) - bitMap.set(selBachGoodTPCTrack); - - // TPC PID - // positive track - if (fabs(posTrackExtra.tpcNSigmaPi()) < PIDConfigurations.TpcPidNsigmaCut) - bitMap.set(selTPCPIDPositivePion); - if (fabs(posTrackExtra.tpcNSigmaPr()) < PIDConfigurations.TpcPidNsigmaCut) - bitMap.set(selTPCPIDPositiveProton); - // negative track - if (fabs(negTrackExtra.tpcNSigmaPi()) < PIDConfigurations.TpcPidNsigmaCut) - bitMap.set(selTPCPIDNegativePion); - if (fabs(negTrackExtra.tpcNSigmaPr()) < PIDConfigurations.TpcPidNsigmaCut) - bitMap.set(selTPCPIDNegativeProton); - // bachelor track - if (fabs(bachTrackExtra.tpcNSigmaPi()) < PIDConfigurations.TpcPidNsigmaCut) - bitMap.set(selTPCPIDBachPion); - if (fabs(bachTrackExtra.tpcNSigmaKa()) < PIDConfigurations.TpcPidNsigmaCut) - bitMap.set(selTPCPIDBachKaon); - - // TOF PID in DeltaT - // positive track - if (fabs(casc.posTOFDeltaTXiPr()) < PIDConfigurations.maxDeltaTimeProton) - bitMap.set(selTOFDeltaTPositiveProtonLambdaXi); - if (fabs(casc.posTOFDeltaTXiPi()) < PIDConfigurations.maxDeltaTimePion) - bitMap.set(selTOFDeltaTPositivePionLambdaXi); - if (fabs(casc.posTOFDeltaTOmPr()) < PIDConfigurations.maxDeltaTimeProton) - bitMap.set(selTOFDeltaTPositiveProtonLambdaOmega); - if (fabs(casc.posTOFDeltaTOmPi()) < PIDConfigurations.maxDeltaTimePion) - bitMap.set(selTOFDeltaTPositivePionLambdaOmega); - // negative track - if (fabs(casc.negTOFDeltaTXiPr()) < PIDConfigurations.maxDeltaTimeProton) - bitMap.set(selTOFDeltaTNegativeProtonLambdaXi); - if (fabs(casc.negTOFDeltaTXiPi()) < PIDConfigurations.maxDeltaTimePion) - bitMap.set(selTOFDeltaTNegativePionLambdaXi); - if (fabs(casc.negTOFDeltaTOmPr()) < PIDConfigurations.maxDeltaTimeProton) - bitMap.set(selTOFDeltaTNegativeProtonLambdaOmega); - if (fabs(casc.negTOFDeltaTOmPi()) < PIDConfigurations.maxDeltaTimePion) - bitMap.set(selTOFDeltaTNegativePionLambdaOmega); - // bachelor track - if (fabs(casc.bachTOFDeltaTOmKa()) < PIDConfigurations.maxDeltaTimeKaon) - bitMap.set(selTOFDeltaTBachKaonOmega); - if (fabs(casc.bachTOFDeltaTXiPi()) < PIDConfigurations.maxDeltaTimePion) - bitMap.set(selTOFDeltaTBachPionXi); - - // TOF PID in NSigma - // meson track - if (fabs(casc.tofNSigmaXiLaPi()) < PIDConfigurations.TofPidNsigmaCutLaPi) { - bitMap.set(selTOFNSigmaPositivePionLambdaXi); - bitMap.set(selTOFNSigmaNegativePionLambdaXi); - } - if (fabs(casc.tofNSigmaOmLaPi()) < PIDConfigurations.TofPidNsigmaCutLaPi) { - bitMap.set(selTOFNSigmaPositivePionLambdaOmega); - bitMap.set(selTOFNSigmaNegativePionLambdaOmega); - } - // baryon track - if (fabs(casc.tofNSigmaXiLaPr()) < PIDConfigurations.TofPidNsigmaCutLaPr) { - bitMap.set(selTOFNSigmaNegativeProtonLambdaXi); - bitMap.set(selTOFNSigmaPositiveProtonLambdaXi); - } - if (fabs(casc.tofNSigmaOmLaPr()) < PIDConfigurations.TofPidNsigmaCutLaPr) { - bitMap.set(selTOFNSigmaNegativePionLambdaOmega); - bitMap.set(selTOFNSigmaPositivePionLambdaOmega); - } - // bachelor track - if (fabs(casc.tofNSigmaXiPi()) < PIDConfigurations.TofPidNsigmaCutXiPi) { - bitMap.set(selTOFNSigmaBachPionXi); - } - if (fabs(casc.tofNSigmaOmKa()) < PIDConfigurations.TofPidNsigmaCutOmegaKaon) { - bitMap.set(selTOFNSigmaBachKaonOmega); - } - - // ITS only tag - if (posTrackExtra.tpcCrossedRows() < 1) - bitMap.set(selPosItsOnly); - if (negTrackExtra.tpcCrossedRows() < 1) - bitMap.set(selNegItsOnly); - if (bachTrackExtra.tpcCrossedRows() < 1) - bitMap.set(selBachItsOnly); - - // rej. comp. - if (fabs(casc.mOmega() - pdgDB->Mass(3334)) > casccuts.rejcomp) - bitMap.set(selRejCompXi); - if (fabs(casc.mXi() - pdgDB->Mass(3312)) > casccuts.rejcomp) - bitMap.set(selRejCompOmega); - - // TPC only tag - if (posTrackExtra.detectorMap() != o2::aod::track::TPC) - bitMap.set(selPosNotTPCOnly); - if (negTrackExtra.detectorMap() != o2::aod::track::TPC) - bitMap.set(selNegNotTPCOnly); - if (bachTrackExtra.detectorMap() != o2::aod::track::TPC) - bitMap.set(selBachNotTPCOnly); - - return bitMap; - } - - template - std::bitset computeBitmapV0(TV0 const& v0, TCollision const& collision) - { - float rapidityLambda = v0.yLambda(); - float rapidityK0Short = v0.yK0Short(); - - std::bitset bitMap = 0; - - // base topological variables - if (v0.v0radius() > v0cuts.v0radius) - bitMap.set(selV0Radius); - if (v0.v0radius() < v0cuts.v0radiusMax) - bitMap.set(selV0RadiusMax); - if (fabs(v0.dcapostopv()) > v0cuts.dcapostopv) - bitMap.set(selDCAPosToPV); - if (fabs(v0.dcanegtopv()) > v0cuts.dcanegtopv) - bitMap.set(selDCANegToPV); - if (v0.v0cosPA() > v0cuts.v0cospa) - bitMap.set(selV0CosPA); - if (v0.dcaV0daughters() < v0cuts.dcav0dau) - bitMap.set(selDCAV0Dau); - - // kinematic - if (fabs(rapidityLambda) < rapidityCut) - bitMap.set(selLambdaRapidity); - if (fabs(rapidityK0Short) < rapidityCut) - bitMap.set(selK0ShortRapidity); - if (fabs(v0.negativeeta()) < daughterEtaCut) - bitMap.set(selNegEta); - if (fabs(v0.positiveeta()) < daughterEtaCut) - bitMap.set(selPosEta); - - auto posTrackExtra = v0.template posTrackExtra_as(); - auto negTrackExtra = v0.template negTrackExtra_as(); - - // ITS quality flags - if (posTrackExtra.itsNCls() >= TrackConfigurations.minITSclusters) - bitMap.set(selPosGoodITSTrack); - if (negTrackExtra.itsNCls() >= TrackConfigurations.minITSclusters) - bitMap.set(selNegGoodITSTrack); - - // TPC quality flags - if (posTrackExtra.tpcCrossedRows() >= TrackConfigurations.minTPCrows) - bitMap.set(selPosGoodTPCTrack); - if (negTrackExtra.tpcCrossedRows() >= TrackConfigurations.minTPCrows) - bitMap.set(selNegGoodTPCTrack); - - // TPC PID - if (fabs(posTrackExtra.tpcNSigmaPi()) < PIDConfigurations.TpcPidNsigmaCut) - bitMap.set(selTPCPIDPositivePion); - if (fabs(posTrackExtra.tpcNSigmaPr()) < PIDConfigurations.TpcPidNsigmaCut) - bitMap.set(selTPCPIDPositiveProton); - if (fabs(negTrackExtra.tpcNSigmaPi()) < PIDConfigurations.TpcPidNsigmaCut) - bitMap.set(selTPCPIDNegativePion); - if (fabs(negTrackExtra.tpcNSigmaPr()) < PIDConfigurations.TpcPidNsigmaCut) - bitMap.set(selTPCPIDNegativeProton); - - // TOF PID in DeltaT - // positive track - if (fabs(v0.posTOFDeltaTLaPr()) < PIDConfigurations.maxDeltaTimeProton) - bitMap.set(selTOFDeltaTPositiveProtonLambda); - if (fabs(v0.posTOFDeltaTLaPi()) < PIDConfigurations.maxDeltaTimePion) - bitMap.set(selTOFDeltaTPositivePionLambda); - if (fabs(v0.posTOFDeltaTK0Pi()) < PIDConfigurations.maxDeltaTimePion) - bitMap.set(selTOFDeltaTPositivePionK0Short); - // negative track - if (fabs(v0.negTOFDeltaTLaPr()) < PIDConfigurations.maxDeltaTimeProton) - bitMap.set(selTOFDeltaTNegativeProtonLambda); - if (fabs(v0.negTOFDeltaTLaPi()) < PIDConfigurations.maxDeltaTimePion) - bitMap.set(selTOFDeltaTNegativePionLambda); - if (fabs(v0.negTOFDeltaTK0Pi()) < PIDConfigurations.maxDeltaTimePion) - bitMap.set(selTOFDeltaTNegativePionK0Short); - - // TOF PID in NSigma - // positive track - if (fabs(v0.tofNSigmaLaPr()) < PIDConfigurations.TofPidNsigmaCutLaPr) - bitMap.set(selTOFNSigmaPositiveProtonLambda); - if (fabs(v0.tofNSigmaALaPi()) < PIDConfigurations.TofPidNsigmaCutLaPi) - bitMap.set(selTOFNSigmaPositivePionLambda); - if (fabs(v0.tofNSigmaK0PiPlus()) < PIDConfigurations.TofPidNsigmaCutK0Pi) - bitMap.set(selTOFNSigmaPositivePionK0Short); - // negative track - if (fabs(v0.tofNSigmaALaPr()) < PIDConfigurations.TofPidNsigmaCutLaPr) - bitMap.set(selTOFNSigmaNegativeProtonLambda); - if (fabs(v0.tofNSigmaLaPi()) < PIDConfigurations.TofPidNsigmaCutLaPi) - bitMap.set(selTOFNSigmaNegativePionLambda); - if (fabs(v0.tofNSigmaK0PiMinus()) < PIDConfigurations.TofPidNsigmaCutK0Pi) - bitMap.set(selTOFNSigmaNegativePionK0Short); - - // ITS only tag - if (posTrackExtra.tpcCrossedRows() < 1) - bitMap.set(selPosItsOnly); - if (negTrackExtra.tpcCrossedRows() < 1) - bitMap.set(selNegItsOnly); - - // TPC only tag - if (posTrackExtra.detectorMap() != o2::aod::track::TPC) - bitMap.set(selPosNotTPCOnly); - if (negTrackExtra.detectorMap() != o2::aod::track::TPC) - bitMap.set(selNegNotTPCOnly); - - // proper lifetime - if (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0 < lifetimecutV0->get("lifetimecutLambda")) - bitMap.set(selLambdaCTau); - if (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutV0->get("lifetimecutK0S")) - bitMap.set(selK0ShortCTau); - - // armenteros - if (v0.qtarm() * v0cuts.armPodCut > fabs(v0.alpha()) || v0cuts.armPodCut < 1e-4) - bitMap.set(selK0ShortArmenteros); - - return bitMap; - } - - template - void analyseCascCandidate(TCasc const& casc, TCollision const& coll, int const& gap, std::bitset const& selMap) - { - // Access daughter tracks - auto posTrackExtra = casc.template posTrackExtra_as(); - auto negTrackExtra = casc.template negTrackExtra_as(); - auto bachTrackExtra = casc.template bachTrackExtra_as(); - - if (doPlainTopoQA) { - histos.fill(HIST("generalQA/hPt"), casc.pt()); - histos.fill(HIST("generalQA/hCascCosPA"), casc.pt(), casc.casccosPA(coll.posX(), coll.posY(), coll.posZ())); - histos.fill(HIST("generalQA/hDCACascDaughters"), casc.pt(), casc.dcacascdaughters()); - histos.fill(HIST("generalQA/hCascRadius"), casc.pt(), casc.cascradius()); - histos.fill(HIST("generalQA/hMesonDCAToPV"), casc.pt(), casc.dcanegtopv()); - histos.fill(HIST("generalQA/hBaryonDCAToPV"), casc.pt(), casc.dcapostopv()); - histos.fill(HIST("generalQA/hBachDCAToPV"), casc.pt(), casc.dcabachtopv()); - histos.fill(HIST("generalQA/hV0CosPA"), casc.pt(), casc.v0cosPA(coll.posX(), coll.posY(), coll.posZ())); - histos.fill(HIST("generalQA/hV0Radius"), casc.pt(), casc.v0radius()); - histos.fill(HIST("generalQA/hDCAV0Daughters"), casc.pt(), casc.dcaV0daughters()); - histos.fill(HIST("generalQA/hDCAV0ToPV"), casc.pt(), fabs(casc.dcav0topv(coll.posX(), coll.posY(), coll.posZ()))); - histos.fill(HIST("generalQA/hMassLambdaDau"), casc.pt(), casc.mLambda()); - histos.fill(HIST("generalQA/h2dPositiveITSvsTPCpts"), posTrackExtra.tpcCrossedRows(), posTrackExtra.itsNCls()); - histos.fill(HIST("generalQA/h2dNegativeITSvsTPCpts"), negTrackExtra.tpcCrossedRows(), negTrackExtra.itsNCls()); - histos.fill(HIST("generalQA/h2dBachITSvsTPCpts"), bachTrackExtra.tpcCrossedRows(), bachTrackExtra.itsNCls()); - } - - // Xi - if (verifyMask(selMap, maskSelectionXi) && analyseXi) { - fillHistogramsCasc<3>(casc, coll, gap); - } - - // Anti-Xi - if (verifyMask(selMap, maskSelectionAntiXi) && analyseAntiXi) { - fillHistogramsCasc<4>(casc, coll, gap); - } - - // Omega - if (verifyMask(selMap, maskSelectionOmega) && analyseOmega) { - fillHistogramsCasc<5>(casc, coll, gap); - } - - // Anti-Omega - if (verifyMask(selMap, maskSelectionAntiOmega) && analyseAntiOmega) { - fillHistogramsCasc<6>(casc, coll, gap); - } - } - - template - void analyseV0Candidate(TV0 const& v0, TCollision const& coll, int const& gap, std::bitset const& selMap) - { - auto posTrackExtra = v0.template posTrackExtra_as(); - auto negTrackExtra = v0.template negTrackExtra_as(); - - // QA plots - if (doPlainTopoQA) { - histos.fill(HIST("generalQA/hPt"), v0.pt()); - histos.fill(HIST("generalQA/hPosDCAToPV"), v0.dcapostopv()); - histos.fill(HIST("generalQA/hNegDCAToPV"), v0.dcanegtopv()); - histos.fill(HIST("generalQA/hDCADaughters"), v0.dcaV0daughters()); - histos.fill(HIST("generalQA/hPointingAngle"), TMath::ACos(v0.v0cosPA())); - histos.fill(HIST("generalQA/hV0Radius"), v0.v0radius()); - histos.fill(HIST("generalQA/h2dPositiveITSvsTPCpts"), posTrackExtra.tpcCrossedRows(), posTrackExtra.itsNCls()); - histos.fill(HIST("generalQA/h2dNegativeITSvsTPCpts"), negTrackExtra.tpcCrossedRows(), negTrackExtra.itsNCls()); - } - - histos.fill(HIST("generalQA/h2dArmenterosAll"), v0.alpha(), v0.qtarm()); - - // K0s - if (verifyMask(selMap, maskSelectionK0Short) && analyseK0Short) { - fillHistogramsV0<0>(v0, coll, gap); - } - - // Lambda - if (verifyMask(selMap, maskSelectionLambda) && analyseLambda) { - fillHistogramsV0<1>(v0, coll, gap); - } - - // Anti-Lambda - if (verifyMask(selMap, maskSelectionAntiLambda) && analyseAntiLambda) { - fillHistogramsV0<2>(v0, coll, gap); - } - } - - void processV0s(straCollisonFull const& collision, v0Candidates const& fullV0s, dauTracks const&) - { - if (!acceptEvent(collision)) { - return; - } // event is accepted - - int selGapSide = collision.isUPC() ? getGapSide(collision) : -1; - if (studyUPConly && (selGapSide < -0.5)) - return; - - fillHistogramsQA(collision, selGapSide); - - for (auto& v0 : fullV0s) { - if ((v0.v0Type() != v0cuts.v0TypeSelection) && (v0cuts.v0TypeSelection > 0)) - continue; // skip V0s that are not standard - - std::bitset selMap = computeBitmapV0(v0, collision); - - // consider for histograms for all species - setBits(selMap, {selConsiderK0Short, selConsiderLambda, selConsiderAntiLambda, - selPhysPrimK0Short, selPhysPrimLambda, selPhysPrimAntiLambda}); - - analyseV0Candidate(v0, collision, selGapSide, selMap); - } // end v0 loop - } - - void processCascades(straCollisonFull const& collision, cascadeCandidates const& fullCascades, dauTracks const&) - { - if (!acceptEvent(collision)) { - return; - } // event is accepted - - int selGapSide = collision.isUPC() ? getGapSide(collision) : -1; - if (studyUPConly && (selGapSide < -0.5)) - return; - - fillHistogramsQA(collision, selGapSide); - - for (auto& casc : fullCascades) { - std::bitset selMap = computeBitmapCascade(casc, collision); - // consider for histograms for all species - setBits(selMap, {selConsiderXi, selConsiderAntiXi, selConsiderOmega, selConsiderAntiOmega, - selPhysPrimXi, selPhysPrimAntiXi, selPhysPrimOmega, selPhysPrimAntiOmega}); - - analyseCascCandidate(casc, collision, selGapSide, selMap); - } // end casc loop - } - - PROCESS_SWITCH(strangeYieldPbPb, processV0s, "Process V0s", true); - PROCESS_SWITCH(strangeYieldPbPb, processCascades, "Process Cascades", false); -}; - -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - return WorkflowSpec{ - adaptAnalysisTask(cfgc)}; -} diff --git a/PWGLF/Utils/strangenessMasks.h b/PWGLF/Utils/strangenessMasks.h index 7b567218de6..423fd7f5228 100644 --- a/PWGLF/Utils/strangenessMasks.h +++ b/PWGLF/Utils/strangenessMasks.h @@ -1,4 +1,4 @@ -// Copyright 2019-2024 CERN and copyright holders of ALICE O2. +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // @@ -8,14 +8,15 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// +// +/// \file strangenessMasks.h +/// \brief Defines selection criteria and bit masks for identifying v0 and cascade particles /// \author Roman Nepeivoda (roman.nepeivoda@cern.ch) -/// \since August 27, 2024 #ifndef PWGLF_UTILS_STRANGENESSMASKS_H_ #define PWGLF_UTILS_STRANGENESSMASKS_H_ -enum selectionsCombined : int { selV0CosPA = 0, +enum SelectionsCombined : int { selV0CosPA = 0, selV0Radius, selV0RadiusMax, selDCANegToPV, @@ -58,6 +59,7 @@ enum selectionsCombined : int { selV0CosPA = 0, selPhysPrimAntiLambda, // for mc tagging selPosEta, selNegEta, + selDauDCA, // cascade selections selCascCosPA, selMassWinXi, @@ -115,36 +117,36 @@ enum selectionsCombined : int { selV0CosPA = 0, selCount, }; -static constexpr int selNum = static_cast(selectionsCombined::selCount); +static constexpr int kSelNum = static_cast(SelectionsCombined::selCount); // constants const float ctauxiPDG = 4.91; // from PDG const float ctauomegaPDG = 2.461; // from PDG // bit masks -std::bitset maskTopologicalV0; -std::bitset maskTopologicalCasc; +std::bitset maskTopologicalV0; +std::bitset maskTopologicalCasc; -std::bitset maskKinematicV0; -std::bitset maskKinematicCasc; +std::bitset maskKinematicV0; +std::bitset maskKinematicCasc; -std::bitset maskTrackPropertiesV0; -std::bitset maskTrackPropertiesCasc; +std::bitset maskTrackPropertiesV0; +std::bitset maskTrackPropertiesCasc; -std::bitset maskK0ShortSpecific; -std::bitset maskLambdaSpecific; -std::bitset maskAntiLambdaSpecific; -std::bitset maskXiSpecific; -std::bitset maskAntiXiSpecific; -std::bitset maskOmegaSpecific; -std::bitset maskAntiOmegaSpecific; +std::bitset maskK0ShortSpecific; +std::bitset maskLambdaSpecific; +std::bitset maskAntiLambdaSpecific; +std::bitset maskXiSpecific; +std::bitset maskAntiXiSpecific; +std::bitset maskOmegaSpecific; +std::bitset maskAntiOmegaSpecific; -std::bitset maskSelectionK0Short; -std::bitset maskSelectionLambda; -std::bitset maskSelectionAntiLambda; -std::bitset maskSelectionXi; -std::bitset maskSelectionAntiXi; -std::bitset maskSelectionOmega; -std::bitset maskSelectionAntiOmega; +std::bitset maskSelectionK0Short; +std::bitset maskSelectionLambda; +std::bitset maskSelectionAntiLambda; +std::bitset maskSelectionXi; +std::bitset maskSelectionAntiXi; +std::bitset maskSelectionOmega; +std::bitset maskSelectionAntiOmega; #endif // PWGLF_UTILS_STRANGENESSMASKS_H_ From 15336cca78e8cbcb9a339203a2752a45ed086cad Mon Sep 17 00:00:00 2001 From: alcaliva <32872606+alcaliva@users.noreply.github.com> Date: Sun, 16 Feb 2025 12:30:18 +0100 Subject: [PATCH 0250/1650] [PWGLF] bug fix: adjusted eta range for jet selection (#9989) --- PWGLF/Tasks/Nuspex/antinucleiInJets.cxx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx index 3f4af79c926..643824ff125 100644 --- a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx +++ b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx @@ -152,9 +152,9 @@ struct AntinucleiInJets { registryQC.add("sumPtJetCone", "sumPtJetCone", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); registryQC.add("sumPtJet", "sumPtJet", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); registryQC.add("sumPtUE", "sumPtUE", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); - registryQC.add("nJetsFound", "nJetsFound", HistType::kTH1F, {{10, 0, 10, "#it{n}_{Jet}"}}); - registryQC.add("nJetsInAcceptance", "nJetsInAcceptance", HistType::kTH1F, {{10, 0, 10, "#it{n}_{Jet}"}}); - registryQC.add("nJetsSelectedHighPt", "nJetsSelectedHighPt", HistType::kTH1F, {{10, 0, 10, "#it{n}_{Jet}"}}); + registryQC.add("nJetsFound", "nJetsFound", HistType::kTH1F, {{50, 0, 50, "#it{n}_{Jet}"}}); + registryQC.add("nJetsInAcceptance", "nJetsInAcceptance", HistType::kTH1F, {{50, 0, 50, "#it{n}_{Jet}"}}); + registryQC.add("nJetsSelectedHighPt", "nJetsSelectedHighPt", HistType::kTH1F, {{50, 0, 50, "#it{n}_{Jet}"}}); registryQC.add("jetEffectiveArea", "jetEffectiveArea", HistType::kTH1F, {{2000, 0, 2, "Area/#piR^{2}"}}); } @@ -451,7 +451,7 @@ struct AntinucleiInJets { for (auto& jet : jets) { // o2-linter: disable=[const-ref-in-for-loop] // jet must be fully contained in the acceptance - if ((std::fabs(jet.eta()) + rJet) > (maxEta - 0.5)) + if ((std::fabs(jet.eta()) + rJet) > (maxEta - 0.05)) continue; // jet pt must be larger than threshold @@ -675,7 +675,7 @@ struct AntinucleiInJets { for (auto& jet : jets) { // o2-linter: disable=[const-ref-in-for-loop] // jet must be fully contained in the acceptance - if ((std::fabs(jet.eta()) + rJet) > (maxEta - 0.5)) + if ((std::fabs(jet.eta()) + rJet) > (maxEta - 0.05)) continue; njetsInAcc++; From 838e96f473b68d15b62b5bdd3c145d12af26b511 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Sun, 16 Feb 2025 16:47:03 +0100 Subject: [PATCH 0251/1650] [PWGLF] Fix histogram bin size for phi meson flow (#9990) --- PWGLF/Tasks/Resonances/phipbpb.cxx | 54 +++++++++++++++++------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/PWGLF/Tasks/Resonances/phipbpb.cxx b/PWGLF/Tasks/Resonances/phipbpb.cxx index 987bd6d6849..760fb5a2e05 100644 --- a/PWGLF/Tasks/Resonances/phipbpb.cxx +++ b/PWGLF/Tasks/Resonances/phipbpb.cxx @@ -197,26 +197,26 @@ struct phipbpb { histos.add("hPsiTPCR", "PsiTPCR", kTH3F, {centAxis, occupancyAxis, phiAxis}); histos.add("hPsiTPCL", "PsiTPCL", kTH3F, {centAxis, occupancyAxis, phiAxis}); - histos.add("hSparseV2SameEventCosPhi", "hSparseV2SameEventCosPhi", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, cumulantAxis, thnAxisCentrality}); - histos.add("hSparseV2SameEventSinPhi", "hSparseV2SameEventSinPhi", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, cumulantAxis, thnAxisCentrality}); - histos.add("hSparseV2SameEventCosPsi", "hSparseV2SameEventCosPsi", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, cumulantAxis, thnAxisCentrality}); - histos.add("hSparseV2SameEventSinPsi", "hSparseV2SameEventSinPsi", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, cumulantAxis, thnAxisCentrality}); + histos.add("hSparseV2SameEventCosPhi", "hSparseV2SameEventCosPhi", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, cumulantAxis, thnAxisCentrality}); + histos.add("hSparseV2SameEventSinPhi", "hSparseV2SameEventSinPhi", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, cumulantAxis, thnAxisCentrality}); + histos.add("hSparseV2SameEventCosPsi", "hSparseV2SameEventCosPsi", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, cumulantAxis, thnAxisCentrality}); + histos.add("hSparseV2SameEventSinPsi", "hSparseV2SameEventSinPsi", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, cumulantAxis, thnAxisCentrality}); - histos.add("hSparseV2SameEventCosDeltaPhi", "hSparseV2SameEventCosDeltaPhi", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); - histos.add("hSparseV2MixedEventCosDeltaPhi", "hSparseV2MixedEventCosDeltaPhi", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); + histos.add("hSparseV2SameEventCosDeltaPhi", "hSparseV2SameEventCosDeltaPhi", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); + histos.add("hSparseV2MixedEventCosDeltaPhi", "hSparseV2MixedEventCosDeltaPhi", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); - histos.add("hSparseV2SameEventCosDeltaPhiSquare", "hSparseV2SameEventCosDeltaPhiSquare", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, squareAxis, thnAxisCentrality}); - histos.add("hSparseV2SameEventCosDeltaPhiCube", "hSparseV2SameEventCosDeltaPhiCube", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); - histos.add("hSparseV2MixedEventCosDeltaPhiSquare", "hSparseV2MixedEventCosDeltaPhiSquare", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, squareAxis, thnAxisCentrality}); + histos.add("hSparseV2SameEventCosDeltaPhiSquare", "hSparseV2SameEventCosDeltaPhiSquare", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, squareAxis, thnAxisCentrality}); + histos.add("hSparseV2SameEventCosDeltaPhiCube", "hSparseV2SameEventCosDeltaPhiCube", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); + histos.add("hSparseV2MixedEventCosDeltaPhiSquare", "hSparseV2MixedEventCosDeltaPhiSquare", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, squareAxis, thnAxisCentrality}); - histos.add("hSparseV2SameEventSinDeltaPhi", "hSparseV2SameEventSinDeltaPhi", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); - histos.add("hSparseV2MixedEventSinDeltaPhi", "hSparseV2MixedEventSinDeltaPhi", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); + histos.add("hSparseV2SameEventSinDeltaPhi", "hSparseV2SameEventSinDeltaPhi", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); + histos.add("hSparseV2MixedEventSinDeltaPhi", "hSparseV2MixedEventSinDeltaPhi", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); if (fillSA) { - histos.add("hSparseV2SameEventSA", "hSparseV2SameEventSA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisSA, thnAxisRapidity, thnAxisCentrality}); - histos.add("hSparseV2MixedEventSA", "hSparseV2MixedEventSA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisSA, thnAxisRapidity, thnAxisCentrality}); - histos.add("hSparseV2SameEventCosThetaStar", "hSparseV2SameEventCosThetaStar", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisCosThetaStar, thnAxisRapidity, thnAxisCentrality}); - histos.add("hSparseV2MixedEventCosThetaStar", "hSparseV2MixedEventCosThetaStar", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisCosThetaStar, thnAxisRapidity, thnAxisCentrality}); + histos.add("hSparseV2SameEventSA", "hSparseV2SameEventSA", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, thnAxisSA, thnAxisRapidity, thnAxisCentrality}); + histos.add("hSparseV2MixedEventSA", "hSparseV2MixedEventSA", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, thnAxisSA, thnAxisRapidity, thnAxisCentrality}); + histos.add("hSparseV2SameEventCosThetaStar", "hSparseV2SameEventCosThetaStar", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, thnAxisCosThetaStar, thnAxisRapidity, thnAxisCentrality}); + histos.add("hSparseV2MixedEventCosThetaStar", "hSparseV2MixedEventCosThetaStar", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, thnAxisCosThetaStar, thnAxisRapidity, thnAxisCentrality}); } // histogram for resolution histos.add("ResFT0CTPC", "ResFT0CTPC", kTH3F, {centAxis, occupancyAxis, resAxis}); @@ -246,22 +246,26 @@ struct phipbpb { histos.add("h1PhiRecsplit", "Phi meson Rec split", kTH1F, {{100, 0.0f, 10.0f}}); histos.add("CentPercentileMCRecHist", "MC Centrality", kTH1F, {{100, 0.0f, 100.0f}}); - histos.add("hSparseV2MCGenSA", "hSparseV2SameEventSA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisSA, thnAxisRapidity, thnAxisCentrality}); - histos.add("hSparseV2MCGenCosThetaStar_effy", "hSparseV2SameEventCosThetaStar_effy", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisCosThetaStar, thnAxisRapidity, thnAxisCentrality}); + histos.add("hSparseV2MCGenSA", "hSparseV2SameEventSA", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, thnAxisSA, thnAxisRapidity, thnAxisCentrality}); + histos.add("hSparseV2MCGenCosThetaStar_effy", "hSparseV2SameEventCosThetaStar_effy", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, thnAxisCosThetaStar, thnAxisRapidity, thnAxisCentrality}); - histos.add("hSparseV2MCRecSA", "hSparseV2SameEventSA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisSA, thnAxisRapidity, thnAxisCentrality}); - histos.add("hSparseV2MCRecCosThetaStar_effy", "hSparseV2SameEventCosThetaStar_effy", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisCosThetaStar, thnAxisRapidity, thnAxisCentrality}); + histos.add("hSparseV2MCRecSA", "hSparseV2SameEventSA", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, thnAxisSA, thnAxisRapidity, thnAxisCentrality}); + histos.add("hSparseV2MCRecCosThetaStar_effy", "hSparseV2SameEventCosThetaStar_effy", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, thnAxisCosThetaStar, thnAxisRapidity, thnAxisCentrality}); // weight histos.add("hImpactParameter", "Impact parameter", kTH1F, {{200, 0.0f, 20.0f}}); histos.add("hEventPlaneAngle", "hEventPlaneAngle", kTH1F, {{200, -2.0f * TMath::Pi(), 2.0f * TMath::Pi()}}); histos.add("hEventPlaneAngleRec", "hEventPlaneAngleRec", kTH1F, {{200, -2.0f * TMath::Pi(), 2.0f * TMath::Pi()}}); histos.add("hNchVsImpactParameter", "hNchVsImpactParameter", kTH2F, {{200, 0.0f, 20.0f}, {500, -0.5f, 5000.5f}}); - histos.add("hSparseMCGenWeight", "hSparseMCGenWeight", HistType::kTHnSparseF, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {50, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); - histos.add("hSparseMCRecWeight", "hSparseMCRecWeight", HistType::kTHnSparseF, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {50, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); - histos.add("hSparseMCRecAllTrackWeight", "hSparseMCRecAllTrackWeight", HistType::kTHnSparseF, {thnAxisCentrality, {36, 0.0, TMath::Pi()}, {50, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); - histos.add("hSparseMCGenV2", "hSparseMCGenV2", HistType::kTHnSparseF, {thnAxisCentrality, {200, -1.0, 1.0}, axisPtKaonWeight}); - histos.add("hSparseMCRecV2", "hSparseMCRecV2", HistType::kTHnSparseF, {thnAxisCentrality, {200, -1.0, 1.0}, axisPtKaonWeight}); + histos.add("hSparseMCGenWeight", "hSparseMCGenWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); + histos.add("hSparseMCRecWeight", "hSparseMCRecWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); + histos.add("hSparseMCRecAllTrackWeight", "hSparseMCRecAllTrackWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); + histos.add("hSparseMCGenV2", "hSparseMCGenV2", HistType::kTHnSparseD, {thnAxisCentrality, {200, -1.0, 1.0}, axisPtKaonWeight}); + histos.add("hSparseMCRecV2", "hSparseMCRecV2", HistType::kTHnSparseD, {thnAxisCentrality, {200, -1.0, 1.0}, axisPtKaonWeight}); + // histos.add("hSparseMCGenV2Square", "hSparseMCGenV2Square", HistType::kTHnSparseD, {thnAxisCentrality, {1000, 0.0, 1.0}, axisPtKaonWeight}); + // histos.add("hSparseMCRecV2Square", "hSparseMCRecV2Square", HistType::kTHnSparseD, {thnAxisCentrality, {1000, 0.0, 1.0}, axisPtKaonWeight}); + histos.add("hSparseMCGenV2Square", "hSparseMCGenV2Square", HistType::kTH3D, {thnAxisCentrality, {1000, 0.0, 1.0}, axisPtKaonWeight}); + histos.add("hSparseMCRecV2Square", "hSparseMCRecV2Square", HistType::kTH3D, {thnAxisCentrality, {1000, 0.0, 1.0}, axisPtKaonWeight}); } // Event selection cut additional - Alex if (additionalEvsel) { @@ -957,6 +961,7 @@ struct phipbpb { continue; histos.fill(HIST("hSparseMCGenWeight"), centclass, GetPhiInRange(deltaPhi), TMath::Power(TMath::Cos(2.0 * GetPhiInRange(deltaPhi)), 2.0), mcParticle.pt(), mcParticle.eta()); histos.fill(HIST("hSparseMCGenV2"), centclass, TMath::Cos(2.0 * GetPhiInRange(deltaPhi)), mcParticle.pt()); + histos.fill(HIST("hSparseMCGenV2Square"), centclass, TMath::Power(TMath::Cos(2.0 * GetPhiInRange(deltaPhi)), 2.0), mcParticle.pt()); nCh++; bool validGlobal = false; bool validAny = false; @@ -975,6 +980,7 @@ struct phipbpb { if (validGlobal) { histos.fill(HIST("hSparseMCRecWeight"), centclass, GetPhiInRange(deltaPhi), TMath::Power(TMath::Cos(2.0 * GetPhiInRange(deltaPhi)), 2.0), mcParticle.pt(), mcParticle.eta()); histos.fill(HIST("hSparseMCRecV2"), centclass, TMath::Cos(2.0 * GetPhiInRange(deltaPhi)), mcParticle.pt()); + histos.fill(HIST("hSparseMCRecV2Square"), centclass, TMath::Power(TMath::Cos(2.0 * GetPhiInRange(deltaPhi)), 2.0), mcParticle.pt()); } if (validAny) { histos.fill(HIST("hSparseMCRecAllTrackWeight"), centclass, GetPhiInRange(deltaPhi), TMath::Power(TMath::Cos(2.0 * GetPhiInRange(deltaPhi)), 2.0), mcParticle.pt(), mcParticle.eta()); From e06b2dc20238637b15ab37eb862db20dc0906167 Mon Sep 17 00:00:00 2001 From: Paul Buehler Date: Sun, 16 Feb 2025 16:47:23 +0100 Subject: [PATCH 0252/1650] [PWGUD,Tutorial] Adding analysis task decayTreeAnalyzer (#9366) Co-authored-by: rolavick --- PWGUD/Core/CMakeLists.txt | 8 + PWGUD/Core/UDHelpers.h | 97 +- PWGUD/Core/decayTree.cxx | 1220 ++++++++++++++++++++++++ PWGUD/Core/decayTree.h | 1004 +++++++++++++++++++ PWGUD/Core/decayTreeLinkDef.h | 19 + PWGUD/TableProducer/CMakeLists.txt | 2 +- PWGUD/TableProducer/DGCandProducer.cxx | 145 ++- PWGUD/TableProducer/SGCandProducer.cxx | 7 +- PWGUD/Tasks/CMakeLists.txt | 7 +- PWGUD/Tasks/decayTreeAnalyzer.cxx | 143 +++ PWGUD/Tasks/dgCandAnalyzer.cxx | 4 +- Tutorials/PWGUD/CMakeLists.txt | 4 - 12 files changed, 2572 insertions(+), 88 deletions(-) create mode 100644 PWGUD/Core/decayTree.cxx create mode 100644 PWGUD/Core/decayTree.h create mode 100644 PWGUD/Core/decayTreeLinkDef.h create mode 100644 PWGUD/Tasks/decayTreeAnalyzer.cxx diff --git a/PWGUD/Core/CMakeLists.txt b/PWGUD/Core/CMakeLists.txt index d5ef6f9a085..7686edd8eea 100644 --- a/PWGUD/Core/CMakeLists.txt +++ b/PWGUD/Core/CMakeLists.txt @@ -56,3 +56,11 @@ o2physics_add_library(UPCCutparHolder o2physics_target_root_dictionary(UPCCutparHolder HEADERS UPCCutparHolder.h LINKDEF UPCCutparHolderLinkDef.h) + +o2physics_add_library(decayTree + SOURCES decayTree.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore ROOT::EG RapidJSON::RapidJSON) + +o2physics_target_root_dictionary(decayTree + HEADERS decayTree.h + LINKDEF decayTreeLinkDef.h) diff --git a/PWGUD/Core/UDHelpers.h b/PWGUD/Core/UDHelpers.h index 6c77b28f007..4b8050cf6f1 100644 --- a/PWGUD/Core/UDHelpers.h +++ b/PWGUD/Core/UDHelpers.h @@ -18,6 +18,7 @@ #include #include + #include "TLorentzVector.h" #include "Framework/Logger.h" #include "DataFormatsFT0/Digit.h" @@ -42,7 +43,7 @@ template ::type* = nullptr, typenam int8_t netCharge(TCs tracks) { int8_t nch = 0; - for (auto track : tracks) { + for (const auto& track : tracks) { if (track.isPVContributor()) { nch += track.sign(); } @@ -55,7 +56,7 @@ template ::type* = nullptr, typena int8_t netCharge(TCs tracks) { int8_t nch = 0; - for (auto track : tracks) { + for (const auto& track : tracks) { nch += track.sign(); } return nch; @@ -67,7 +68,7 @@ template ::type* = nullptr, typenam float rPVtrwTOF(TCs tracks, int nPVTracks) { float rpvrwTOF = 0.; - for (auto& track : tracks) { + for (const auto& track : tracks) { if (track.isPVContributor() && track.hasTOF()) { rpvrwTOF += 1.; } @@ -83,7 +84,7 @@ template ::type* = nullptr, typena float rPVtrwTOF(TCs tracks, int nPVTracks) { float rpvrwTOF = 0.; - for (auto& track : tracks) { + for (const auto& track : tracks) { if (track.hasTOF()) { rpvrwTOF += 1.; } @@ -115,14 +116,14 @@ T compatibleBCs(B const& bc, uint64_t const& meanBC, int const& deltaBC, T const auto bcIter = bcs.iteratorAt(bc.globalIndex()); // range of BCs to consider - uint64_t minBC = (uint64_t)deltaBC < meanBC ? meanBC - (uint64_t)deltaBC : 0; - uint64_t maxBC = meanBC + (uint64_t)deltaBC; + uint64_t minBC = static_cast(deltaBC) < meanBC ? meanBC - static_cast(deltaBC) : 0; + uint64_t maxBC = meanBC + static_cast(deltaBC); LOGF(debug, " minBC %d maxBC %d bcIterator %d (%d) #BCs %d", minBC, maxBC, bcIter.globalBC(), bcIter.globalIndex(), bcs.size()); // check [min,max]BC to overlap with [bcs.iteratorAt([0,bcs.size() - 1]) if (maxBC < bcs.iteratorAt(0).globalBC() || minBC > bcs.iteratorAt(bcs.size() - 1).globalBC()) { LOGF(info, " No overlap of [%d, %d] and [%d, %d]", minBC, maxBC, bcs.iteratorAt(0).globalBC(), bcs.iteratorAt(bcs.size() - 1).globalBC()); - return T{{bcs.asArrowTable()->Slice(0, 0)}, (uint64_t)0}; + return T{{bcs.asArrowTable()->Slice(0, 0)}, static_cast(0)}; } // find slice of BCs table with BC in [minBC, maxBC] @@ -156,7 +157,7 @@ T compatibleBCs(B const& bc, uint64_t const& meanBC, int const& deltaBC, T const } // create bc slice - T bcslice{{bcs.asArrowTable()->Slice(minBCId, maxBCId - minBCId + 1)}, (uint64_t)minBCId}; + T bcslice{{bcs.asArrowTable()->Slice(minBCId, maxBCId - minBCId + 1)}, static_cast(minBCId)}; bcs.copyIndexBindings(bcslice); LOGF(debug, " size of slice %d", bcslice.size()); return bcslice; @@ -171,7 +172,7 @@ T compatibleBCs(C const& collision, int ndt, T const& bcs, int nMinBCs = 7) // return if collisions has no associated BC if (!collision.has_foundBC() || ndt < 0) { - return T{{bcs.asArrowTable()->Slice(0, 0)}, (uint64_t)0}; + return T{{bcs.asArrowTable()->Slice(0, 0)}, static_cast(0)}; } // get associated BC @@ -196,7 +197,7 @@ template T compatibleBCs(uint64_t const& meanBC, int const& deltaBC, T const& bcs) { // find BC with globalBC ~ meanBC - uint64_t ind = (uint64_t)(bcs.size() / 2); + uint64_t ind = static_cast(bcs.size() / 2); auto bcIter = bcs.iteratorAt(ind); return compatibleBCs(bcIter, meanBC, deltaBC, bcs); @@ -212,7 +213,7 @@ T MCcompatibleBCs(F const& collision, int const& ndt, T const& bcs, int const& n // return if collisions has no associated BC if (!collision.has_foundBC()) { LOGF(debug, "Collision %i - no BC found!", collision.globalIndex()); - return T{{bcs.asArrowTable()->Slice(0, 0)}, (uint64_t)0}; + return T{{bcs.asArrowTable()->Slice(0, 0)}, static_cast(0)}; } // get associated BC @@ -245,19 +246,19 @@ bool hasGoodPID(DGCutparHolder diffCuts, TC track) track.tpcNSigmaPi(), track.tpcNSigmaKa(), track.tpcNSigmaPr()); - if (TMath::Abs(track.tpcNSigmaEl()) < diffCuts.maxNSigmaTPC()) { + if (std::abs(track.tpcNSigmaEl()) < diffCuts.maxNSigmaTPC()) { return true; } - if (TMath::Abs(track.tpcNSigmaMu()) < diffCuts.maxNSigmaTPC()) { + if (std::abs(track.tpcNSigmaMu()) < diffCuts.maxNSigmaTPC()) { return true; } - if (TMath::Abs(track.tpcNSigmaPi()) < diffCuts.maxNSigmaTPC()) { + if (std::abs(track.tpcNSigmaPi()) < diffCuts.maxNSigmaTPC()) { return true; } - if (TMath::Abs(track.tpcNSigmaKa()) < diffCuts.maxNSigmaTPC()) { + if (std::abs(track.tpcNSigmaKa()) < diffCuts.maxNSigmaTPC()) { return true; } - if (TMath::Abs(track.tpcNSigmaPr()) < diffCuts.maxNSigmaTPC()) { + if (std::abs(track.tpcNSigmaPr()) < diffCuts.maxNSigmaTPC()) { return true; } @@ -268,19 +269,19 @@ bool hasGoodPID(DGCutparHolder diffCuts, TC track) track.tofNSigmaPi(), track.tofNSigmaKa(), track.tofNSigmaPr()); - if (TMath::Abs(track.tofNSigmaEl()) < diffCuts.maxNSigmaTOF()) { + if (std::abs(track.tofNSigmaEl()) < diffCuts.maxNSigmaTOF()) { return true; } - if (TMath::Abs(track.tofNSigmaMu()) < diffCuts.maxNSigmaTOF()) { + if (std::abs(track.tofNSigmaMu()) < diffCuts.maxNSigmaTOF()) { return true; } - if (TMath::Abs(track.tofNSigmaPi()) < diffCuts.maxNSigmaTOF()) { + if (std::abs(track.tofNSigmaPi()) < diffCuts.maxNSigmaTOF()) { return true; } - if (TMath::Abs(track.tofNSigmaKa()) < diffCuts.maxNSigmaTOF()) { + if (std::abs(track.tofNSigmaKa()) < diffCuts.maxNSigmaTOF()) { return true; } - if (TMath::Abs(track.tofNSigmaPr()) < diffCuts.maxNSigmaTOF()) { + if (std::abs(track.tofNSigmaPr()) < diffCuts.maxNSigmaTOF()) { return true; } } @@ -741,14 +742,14 @@ int64_t sameMCCollision(T tracks, aod::McCollisions, aod::McParticles) colID = mccol.globalIndex(); } else { if (colID != mccol.globalIndex()) { - return (int64_t)-1; + return static_cast(-1); } } } else { - return (int64_t)-1; + return static_cast(-1); } } else { - return (int64_t)-1; + return static_cast(-1); } } @@ -761,7 +762,7 @@ int64_t sameMCCollision(T tracks, aod::McCollisions, aod::McParticles) template bool isPythiaCDE(T MCparts) { - for (auto mcpart : MCparts) { + for (const auto& mcpart : MCparts) { if (mcpart.pdgCode() == 9900110) { return true; } @@ -780,7 +781,7 @@ bool isSTARLightJPsimumu(T MCparts) } else { if (MCparts.iteratorAt(0).pdgCode() != 443013) return false; - if (abs(MCparts.iteratorAt(1).pdgCode()) != 13) + if (std::abs(MCparts.iteratorAt(1).pdgCode()) != 13) return false; if (MCparts.iteratorAt(2).pdgCode() != -MCparts.iteratorAt(1).pdgCode()) return false; @@ -788,35 +789,48 @@ bool isSTARLightJPsimumu(T MCparts) return true; } +// ----------------------------------------------------------------------------- +// PbPb di electron production +// [15, 11, 13], [15, 11, 13] +template +bool isUpcgen(T MCparts) +{ + if (MCparts.size() < 4) { + return false; + } else { + auto pid1 = std::abs(MCparts.iteratorAt(0).pdgCode()); + auto pid2 = std::abs(MCparts.iteratorAt(1).pdgCode()); + if (pid1 != 11 && pid1 != 13 && pid1 != 15) + return false; + if (pid2 != 11 && pid2 != 13 && pid2 != 15) + return false; + } + return true; +} + // ----------------------------------------------------------------------------- // In pp events produced with GRANIITTI the stack starts with -// 22212/22212/99/22212/2212/99/90 +// 22212/22212/22212/2212/[211,321,]/[211,321,] template bool isGraniittiCDE(T MCparts) { - for (auto MCpart : MCparts) { - LOGF(debug, " MCpart.pdgCode() %d", MCpart.pdgCode()); - } - LOGF(debug, ""); + // for (auto MCpart : MCparts) { + // LOGF(info, " MCpart.pdgCode() %d", MCpart.pdgCode()); + // } + // LOGF(debug, ""); - if (MCparts.size() < 7) { + if (MCparts.size() < 6) { return false; } else { if (MCparts.iteratorAt(0).pdgCode() != 2212) return false; if (MCparts.iteratorAt(1).pdgCode() != 2212) return false; - if (MCparts.iteratorAt(2).pdgCode() != 99) + if (MCparts.iteratorAt(2).pdgCode() != 2212) return false; if (MCparts.iteratorAt(3).pdgCode() != 2212) return false; - if (MCparts.iteratorAt(4).pdgCode() != 2212) - return false; - if (MCparts.iteratorAt(5).pdgCode() != 99) - return false; - if (MCparts.iteratorAt(6).pdgCode() != 90) - return false; } return true; @@ -843,6 +857,11 @@ int isOfInterest(T MCparts) return 3; } + // Upcgen + if (isUpcgen(MCparts)) { + return 4; + } + return 0; } diff --git a/PWGUD/Core/decayTree.cxx b/PWGUD/Core/decayTree.cxx new file mode 100644 index 00000000000..026c77af706 --- /dev/null +++ b/PWGUD/Core/decayTree.cxx @@ -0,0 +1,1220 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +#include +#include +#include +#include +#include + +#include "rapidjson/document.h" +#include "rapidjson/filereadstream.h" +#include "decayTree.h" + +using namespace rapidjson; + +// ----------------------------------------------------------------------------- +// pidSelector holds an array of pidcut +// pidcut +// double[8] +// 0: pid to apply +// 1: detector: 1 - TPC, 2 - TOF +// 2: cut type: +// 1: pt and nSigma within limits +// -1: nSigma out of limits within pt range +// 2: pt and detector signal within limits +// -2: detector signal out of limits within pt range +// 3: How to apply cut: +// 0: not active +// 1: if information available +// 2: return false if information not available +// 4: pT min +// 5: pT max +// 6: signal/nSigma min +// 7: signal/nSigma max +// pidSelector +pidSelector::pidSelector(std::vector>& pidcuts) +{ + fpidCuts = pidcuts; +} + +void pidSelector::clear() +{ + fpidCuts.clear(); +} + +int pidSelector::pid2ind(int pid) +{ + switch (std::abs(pid)) { + case 11: // electron + return 0; + case 211: // pion + return 1; + case 13: // muon + return 2; + case 321: // kaon + return 3; + case 2212: // proton + return 4; + default: // unknown + return -1.; + } +}; + +void pidSelector::Print() +{ + LOGF(info, " PID cuts"); + for (const auto& cut : fpidCuts) { + LOGF(info, " [ %.0f %.0f %.0f %.0f %.0f %.2f %.2f %.2f ]", cut[0], cut[1], cut[2], cut[3], cut[4], cut[5], cut[6], cut[7]); + } +} + +// ----------------------------------------------------------------------------- +// angleCut +angleCut::angleCut(std::pair rnames, double angleMin, double angleMax) +{ + fRnames = rnames; + fAngleMin = angleMin; + fAngleMax = angleMax; +} + +void angleCut::Print() +{ + LOGF(info, " %s ^ %s: %f : %f", fRnames.first, fRnames.second, fAngleMin, fAngleMax); +} + +// ----------------------------------------------------------------------------- +// Resonance +resonance::resonance() +{ + init(); +} + +// reset to default values +void resonance::init() +{ + // initialisations + fisFinal = false; + fCounter = -1; + fName = ""; + fStatus = 0; + fPID = 0; + fPIDfun = 0; + fdetectorHits = std::vector{-1, -1, -1, -1}; + fParents.clear(); + fDaughters.clear(); + + // initialize mass, pT, eta range + setMassRange(0., 100.); + setPtRange(0., 100.); + setEtaRange(-10., 10.); + setNcltpcRange(0, 200); + setChi2ncltpcRange(0., 100.); + setDCAxyzMax(100., 100.); + + // histogram axes + fnmassBins = 350; + fmassHistMin = 0.0; + fmassHistMax = 3.5; + fnmomBins = 300; + fmomHistMin = 0.0; + fmomHistMax = 3.0; + + // invariant mass + fIVM = TLorentzVector(0., 0., 0., 0.); + fCharge = 0; + + // pid cuts + fpidSelector.clear(); + fangleCuts.clear(); +} + +void resonance::reset() +{ + fStatus = 0; +} + +// check mass, pt, eta range and charge +void resonance::updateStatus() +{ + // IVM has to be computed + if (fStatus == 0) { + return; + } + + // check mass, pt, and eta range + fStatus = 2; + if (fIVM.M() < fmassMin || fIVM.M() > fmassMax) { + return; + } + if (fIVM.Perp() < fptMin || fIVM.Perp() > fptMax) { + return; + } + if (fIVM.Eta() < fetaMin || fIVM.Eta() > fetaMax) { + return; + } + + // good candidate + fStatus = 3; +} + +void resonance::Print() +{ + if (fisFinal) { + // final + LOGF(info, " %s : %d", fName, fPID); + LOGF(info, " status: %d", fStatus); + LOGF(info, " final: %d", fCounter); + LOGF(info, " nCluster TPC: %d : %d", fncltpcMin, fncltpcMax); + LOGF(info, " chi2 per cluster TPC: %f : %f", fchi2ncltpcMin, fchi2ncltpcMax); + LOGF(info, " maximum dca_XY : %f", fdcaxyMax); + LOGF(info, " maximum dca_Z: %f", fdcazMax); + LOGF(info, " parents"); + for (const auto& parent : fParents) { + LOGF(info, " %s", parent); + } + } else { + // resonance + LOGF(info, " %s", fName); + LOGF(info, " status: %d", fStatus); + LOGF(info, " parents"); + for (const auto& parent : fParents) { + LOGF(info, " %s", parent); + } + LOGF(info, " daughters"); + for (const auto& daugh : fDaughters) { + LOGF(info, " %s", daugh); + } + } + LOGF(info, " mass range: %f : %f", fmassMin, fmassMax); + LOGF(info, " pt range: %f : %f", fptMin, fptMax); + LOGF(info, " eta range: %f : %f", fetaMin, fetaMax); + if (fisFinal) { + fpidSelector.Print(); + } else { + LOGF(info, " Angle cuts"); + for (const auto& anglecut : fangleCuts) { + anglecut->Print(); + } + } + + if (fStatus > 0) { + LOGF(info, " charge: %d", fCharge); + LOGF(info, " mass: %f", fIVM.M()); + LOGF(info, " E: %f", fIVM.E()); + LOGF(info, " pT: %f", fIVM.Perp()); + LOGF(info, " eta: %f", fIVM.Eta()); + } + LOGF(info, ""); +} + +// ----------------------------------------------------------------------------- +// decayTree +decayTree::decayTree() +{ + fPDG = TDatabasePDG::Instance(); +} + +bool decayTree::init(std::string const& parFile, o2::framework::HistogramRegistry& registry) +{ + // initialisation of constants + fccs = {"ULS", "LS"}; + fdets = {"TPC", "TOF"}; + fparts = {"el", "pi", "mu", "ka", "pr"}; + + // open the decayTree file + FILE* fjson = fopen(parFile.c_str(), "r"); + if (!fjson) { + LOGF(error, "Could not open parameter file %s", parFile); + return false; + } + + // create streamer + char readBuffer[65536]; + FileReadStream jsonStream(fjson, readBuffer, sizeof(readBuffer)); + + // parse the json file + Document jsonDocument; + jsonDocument.ParseStream(jsonStream); + + // is it a proper json document? + if (jsonDocument.HasParseError()) { + LOGF(error, "Check the parameter file! There is a problem with the format!"); + return false; + } + + // check for decayTree + const char* itemName = "decayTree"; + if (!jsonDocument.HasMember(itemName)) { + LOGF(error, "Check the parameter file! Item %s is missing!", itemName); + return false; + } + const Value& decTree = jsonDocument[itemName]; + + // finals and resonance parameters + std::string name; + int pid; + int pidfun; + std::vector daughters; + std::vector charges; + std::vector> vcuts; + std::vector vanglecuts; + + itemName = "finals"; + if (!decTree.HasMember(itemName)) { + LOGF(info, "No %s defined!", itemName); + return false; + } + if (!decTree[itemName].IsArray()) { + LOGF(error, "Check the parameter file! Item %s must be an array!", itemName); + return false; + } + + // loop over finals + fnFinals = 0; + auto fins = decTree[itemName].GetArray(); + for (const auto& fin : fins) { + if (!fin.IsObject()) { + LOGF(error, "Check the parameter file! %s must be objects!", itemName); + return false; + } + + // create new finals (resonance) + resonance* newRes = new resonance(); + newRes->setisFinal(); + + // check for name + itemName = "name"; + if (fin.HasMember(itemName)) { + if (fin[itemName].IsString()) { + name = fin[itemName].GetString(); + newRes->setName(name); + } else { + LOGF(error, "Check the parameter file! %s must be a string!", itemName); + delete newRes; + return false; + } + } else { + LOGF(error, "Check the parameter file! Finals must have a %s!", itemName); + delete newRes; + return false; + } + + // check for pid + itemName = "pid"; + if (fin.HasMember(itemName)) { + pid = fin[itemName].GetInt(); + newRes->setPID(pid); + } else { + LOGF(error, "Check the parameter file! Finals must have a %s!", itemName); + delete newRes; + return false; + } + + // check for ptrange + itemName = "ptrange"; + if (fin.HasMember(itemName)) { + if (fin[itemName].IsArray()) { + auto lims = fin[itemName].GetArray(); + if (lims.Size() == 2) { + newRes->setPtRange(lims[0].GetFloat(), lims[1].GetFloat()); + } else { + LOGF(error, "Check the parameter file! %s must have two elements!", itemName); + delete newRes; + return false; + } + } else { + LOGF(error, "Check the parameter file! Item %s must be an array!", itemName); + delete newRes; + return false; + } + } + + // check for etarange + itemName = "etarange"; + if (fin.HasMember(itemName)) { + if (fin[itemName].IsArray()) { + auto lims = fin[itemName].GetArray(); + if (lims.Size() == 2) { + newRes->setEtaRange(lims[0].GetFloat(), lims[1].GetFloat()); + } else { + LOGF(error, "Check the parameter file! %s must have two elements!", itemName); + delete newRes; + return false; + } + } else { + LOGF(error, "Check the parameter file! Item %s must be an array!", itemName); + delete newRes; + return false; + } + } + + // check for detectorhits + // 0: ITS + // 1: TPC + // 2: TRD + // 3: TOF + itemName = "detectorhits"; + if (fin.HasMember(itemName)) { + if (fin[itemName].IsArray()) { + auto hits = fin[itemName].GetArray(); + if (hits.Size() == 4) { + newRes->setDetectorHits(hits[0].GetInt(), hits[1].GetInt(), hits[2].GetInt(), hits[3].GetInt()); + } else { + LOGF(error, "Check the parameter file! %s must have four elements!", itemName); + delete newRes; + return false; + } + } else { + LOGF(error, "Check the parameter file! Item %s must be an array!", itemName); + delete newRes; + return false; + } + } + + // check for ncltpcrange + itemName = "ncltpcrange"; + if (fin.HasMember(itemName)) { + if (fin[itemName].IsArray()) { + auto lims = fin[itemName].GetArray(); + if (lims.Size() == 2) { + newRes->setNcltpcRange(lims[0].GetFloat(), lims[1].GetFloat()); + } else { + LOGF(error, "Check the parameter file! %s must have two elements!", itemName); + delete newRes; + return false; + } + } else { + LOGF(error, "Check the parameter file! Item %s must be an array!", itemName); + delete newRes; + return false; + } + } + + // check for chi2ncltpcrange + itemName = "chi2ncltpcrange"; + if (fin.HasMember(itemName)) { + if (fin[itemName].IsArray()) { + auto lims = fin[itemName].GetArray(); + if (lims.Size() == 2) { + newRes->setChi2ncltpcRange(lims[0].GetFloat(), lims[1].GetFloat()); + } else { + LOGF(error, "Check the parameter file! %s must have two elements!", itemName); + delete newRes; + return false; + } + } else { + LOGF(error, "Check the parameter file! Item %s must be an array!", itemName); + delete newRes; + return false; + } + } + + // check for dcaxyzmax + itemName = "dcaxyzmax"; + if (fin.HasMember(itemName)) { + if (fin[itemName].IsArray()) { + auto lims = fin[itemName].GetArray(); + if (lims.Size() == 2) { + newRes->setDCAxyzMax(lims[0].GetFloat(), lims[1].GetFloat()); + } else { + LOGF(error, "Check the parameter file! %s must have two elements!", itemName); + delete newRes; + return false; + } + } else { + LOGF(error, "Check the parameter file! Item %s must be an array!", itemName); + delete newRes; + return false; + } + } + + // pid cuts + vcuts.clear(); + itemName = "pidcuts"; + if (fin.HasMember(itemName)) { + if (fin[itemName].IsArray()) { + auto pidcuts = fin[itemName].GetArray(); + for (const auto& pidcut : pidcuts) { + if (pidcut.HasMember("pidcut")) { + if (pidcut["pidcut"].IsArray()) { + auto vals = pidcut["pidcut"].GetArray(); + if (vals.Size() == 8) { + std::vector vs; + for (const auto& val : vals) { + vs.push_back(val.GetFloat()); + } + vcuts.push_back(vs); + } else { + LOGF(error, "Check the parameter file! A pidcut has %d members", vals.Size()); + delete newRes; + return false; + } + } else { + LOGF(error, "Check the parameter file! Item pidcuts['pidcut'] must be an array!"); + delete newRes; + return false; + } + } + } + auto pidsel = pidSelector(vcuts); + newRes->setPIDSelector(pidsel); + } else { + LOGF(error, "Check the parameter file! Item %s must be an array!", itemName); + delete newRes; + return false; + } + } + + // check for massaxis + itemName = "massaxis"; + if (fin.HasMember(itemName)) { + if (fin[itemName].IsArray()) { + auto max = fin[itemName].GetArray(); + if (max.Size() == 3) { + newRes->setMassHistAxis(max[0].GetInt(), max[1].GetFloat(), max[2].GetFloat()); + } else { + LOGF(error, "Check the parameter file! %s must have three elements!", itemName); + delete newRes; + return false; + } + } else { + LOGF(error, "Check the parameter file! Item %s must be an array!", itemName); + delete newRes; + return false; + } + } + + // check for momaxis + itemName = "momaxis"; + if (fin.HasMember(itemName)) { + if (fin[itemName].IsArray()) { + auto momax = fin[itemName].GetArray(); + if (momax.Size() == 3) { + newRes->setMomHistAxis(momax[0].GetInt(), momax[1].GetFloat(), momax[2].GetFloat()); + } else { + LOGF(error, "Check the parameter file! %s must have three elements!", itemName); + delete newRes; + return false; + } + } else { + LOGF(error, "Check the parameter file! Item %s must be an array!", itemName); + delete newRes; + return false; + } + } + + // update fResonances + fnFinals++; + newRes->setCounter(fnFinals - 1); + fResonances.push_back(newRes); + } + + itemName = "ulsstates"; + if (decTree.HasMember(itemName)) { + LOGF(info, "No %s defined!", itemName); + if (!decTree[itemName].IsArray()) { + LOGF(error, "Check the parameter file! Item %s must be an array!", itemName); + return false; + } + auto ulsstates = decTree[itemName].GetArray(); + for (const auto& obj : ulsstates) { + if (obj.IsArray()) { + auto ulsstate = obj.GetArray(); + if (static_cast(ulsstate.Size()) != fnFinals) { + LOGF(error, "%s with wrong number of elements!", itemName); + return false; + } + charges.clear(); + for (const auto& ch : ulsstate) { + charges.push_back(ch.GetInt()); + } + LOGF(info, "adding charge state %d", chargeState(charges)); + fULSstates.push_back(chargeState(charges)); + } else { + LOGF(error, "Check the parameter file! Elements of item %s must be arrays!", itemName); + return false; + } + } + } + + itemName = "lsstates"; + if (decTree.HasMember(itemName)) { + LOGF(info, "No %s defined!", itemName); + if (!decTree[itemName].IsArray()) { + LOGF(error, "Check the parameter file! Item %s must be an array!", itemName); + return false; + } + auto lsstates = decTree[itemName].GetArray(); + for (const auto& obj : lsstates) { + if (obj.IsArray()) { + auto lsstate = obj.GetArray(); + if (static_cast(lsstate.Size()) != fnFinals) { + LOGF(error, "%s with wrong number of elements!", itemName); + return false; + } + charges.clear(); + for (const auto& ch : lsstate) { + charges.push_back(ch.GetInt()); + } + fLSstates.push_back(chargeState(charges)); + } else { + LOGF(error, "Check the parameter file! Elements of item %s must be arrays!", itemName); + return false; + } + } + } + + // update permutations + permutations(fnFinals, fPermutations); + + itemName = "resonances"; + if (!decTree.HasMember(itemName)) { + LOGF(info, "No resonances defined!"); + } else { + if (!decTree[itemName].IsArray()) { + LOGF(error, "Check the parameter file! Item %s must be an array!", itemName); + return false; + } + + // loop over resonances + auto ress = decTree[itemName].GetArray(); + for (const auto& res : ress) { + if (!res.IsObject()) { + LOGF(error, "Check the parameter file! %s must be objects!", itemName); + return false; + } + + // create new resonance + resonance* newRes = new resonance(); + + // check for name + itemName = "name"; + if (res.HasMember(itemName)) { + if (res[itemName].IsString()) { + name = res[itemName].GetString(); + newRes->setName(name); + } else { + LOGF(error, "Check the parameter file! %s must be a string!", itemName); + delete newRes; + return false; + } + } else { + LOGF(error, "Check the parameter file! Resonances must have a name!"); + delete newRes; + return false; + } + + // check for daughters + itemName = "daughters"; + if (res.HasMember(itemName)) { + if (res[itemName].IsArray()) { + auto daughs = res[itemName].GetArray(); + if (daughs.Size() >= 2) { + daughters.clear(); + for (const auto& daugh : daughs) { + daughters.push_back(daugh.GetString()); + } + newRes->setDaughters(daughters); + } else { + LOGF(error, "Check the parameter file! %s must have at least two elements!", itemName); + delete newRes; + return false; + } + } else { + LOGF(error, "Check the parameter file! Item %s must be an array!", itemName); + delete newRes; + return false; + } + } else { + LOGF(error, "Check the parameter file! Resonances must have daughters!"); + delete newRes; + return false; + } + + // check for massrange + itemName = "massrange"; + if (res.HasMember(itemName)) { + if (res[itemName].IsArray()) { + auto lims = res[itemName].GetArray(); + if (lims.Size() != 2) { + LOGF(error, "Check the parameter file! %s must have two elements!", itemName); + delete newRes; + return false; + } + newRes->setMassRange(lims[0].GetFloat(), lims[1].GetFloat()); + } else { + LOGF(error, "Check the parameter file! Item %s must be an array!", itemName); + delete newRes; + return false; + } + } + + // check for ptrange + itemName = "ptrange"; + if (res.HasMember(itemName)) { + if (res[itemName].IsArray()) { + auto lims = res[itemName].GetArray(); + if (lims.Size() == 2) { + newRes->setPtRange(lims[0].GetFloat(), lims[1].GetFloat()); + } else { + LOGF(error, "Check the parameter file! %s must have two elements!", itemName); + delete newRes; + return false; + } + } else { + LOGF(error, "Check the parameter file! Item %s must be an array!", itemName); + delete newRes; + return false; + } + } + + // check for etarange + itemName = "etarange"; + if (res.HasMember(itemName)) { + if (res[itemName].IsArray()) { + auto lims = res[itemName].GetArray(); + if (lims.Size() == 2) { + newRes->setEtaRange(lims[0].GetFloat(), lims[1].GetFloat()); + } else { + LOGF(error, "Check the parameter file! %s must have two elements!", itemName); + delete newRes; + return false; + } + } else { + LOGF(error, "Check the parameter file! Item %s must be an array!", itemName); + delete newRes; + return false; + } + } + + // check for pidfun + itemName = "pidfun"; + if (res.HasMember(itemName)) { + pidfun = res[itemName].GetInt(); + newRes->setPIDFun(pidfun); + } + + // angle cuts + vanglecuts.clear(); + itemName = "anglecuts"; + if (res.HasMember(itemName)) { + if (res[itemName].IsArray()) { + auto anglecuts = res[itemName].GetArray(); + for (const auto& anglecut : anglecuts) { + if (anglecut.HasMember("pair")) { + if (anglecut["pair"].IsArray()) { + auto daughters = anglecut["pair"].GetArray(); + if (daughters.Size() == 2) { + std::pair pair{daughters[0].GetString(), daughters[1].GetString()}; + if (anglecut.HasMember("anglerange")) { + if (anglecut["anglerange"].IsArray()) { + auto arange = anglecut["anglerange"].GetArray(); + if (arange.Size() == 2) { + vanglecuts.push_back(new angleCut(pair, arange[0].GetFloat(), arange[1].GetFloat())); + } else { + LOGF(error, "Check the parameter file! An anglecut['anglerange'] has %d members", arange.Size()); + delete newRes; + return false; + } + } else { + LOGF(error, "Check the parameter file! Item anglerange must be an array!"); + delete newRes; + return false; + } + } else { + LOGF(error, "Check the parameter file! An anglecut must have an anglerange!"); + delete newRes; + return false; + } + } else { + LOGF(error, "Check the parameter file! A anglecut['pair'] has %d members", daughters.Size()); + delete newRes; + return false; + } + } else { + LOGF(error, "Check the parameter file! Item anglecut must be an array!"); + delete newRes; + return false; + } + } else { + LOGF(error, "Check the parameter file! An anglecut must have a pair!"); + delete newRes; + return false; + } + } + newRes->setAngleCuts(vanglecuts); + } else { + LOGF(error, "Check the parameter file! Item %s must be an array!", itemName); + delete newRes; + return false; + } + } + + // check for massaxis + itemName = "massaxis"; + if (res.HasMember(itemName)) { + if (res[itemName].IsArray()) { + auto max = res[itemName].GetArray(); + if (max.Size() == 3) { + newRes->setMassHistAxis(max[0].GetInt(), max[1].GetFloat(), max[2].GetFloat()); + } else { + LOGF(error, "Check the parameter file! %s must have three elements!", itemName); + delete newRes; + return false; + } + } else { + LOGF(error, "Check the parameter file! Item %s must be an array!", itemName); + delete newRes; + return false; + } + } + + // check for momaxis + itemName = "momaxis"; + if (res.HasMember(itemName)) { + if (res[itemName].IsArray()) { + auto momax = res[itemName].GetArray(); + if (momax.Size() == 3) { + newRes->setMomHistAxis(momax[0].GetInt(), momax[1].GetFloat(), momax[2].GetFloat()); + } else { + LOGF(error, "Check the parameter file! %s must have three elements!", itemName); + delete newRes; + return false; + } + } else { + LOGF(error, "Check the parameter file! Item %s must be an array!", itemName); + delete newRes; + return false; + } + } + + // use the items to create a new resonance + fResonances.push_back(newRes); + } + } + + // update the parents information + updateParents(); + + // check for eventCuts + // set default values + fnTracksMin = fnFinals; + fnTracksMax = fnFinals; + frgtwtofMin = 0.0; + fdBCMin = 0; + fdBCMax = 0; + fFITvetos = {0, 1, 1, 0, 0}; + + itemName = "eventCuts"; + if (!jsonDocument.HasMember(itemName)) { + return true; + } + const Value& evset = jsonDocument[itemName]; + + // check for ntrackrange + itemName = "ntrackrange"; + if (evset.HasMember(itemName)) { + if (evset[itemName].IsArray()) { + auto lims = evset[itemName].GetArray(); + if (lims.Size() == 2) { + fnTracksMin = lims[0].GetFloat(); + fnTracksMax = lims[1].GetFloat(); + } else { + LOGF(error, "Check the parameter file! %s must have two elements!", itemName); + return false; + } + } else { + LOGF(error, "Check the parameter file! Item %s must be an array!", itemName); + return false; + } + } + + // check for rgtwtofmin + itemName = "rgtrwtofmin"; + if (evset.HasMember(itemName)) { + frgtwtofMin = evset[itemName].GetFloat(); + } + + // check for dBCrange + itemName = "dBCrange"; + if (evset.HasMember(itemName)) { + if (evset[itemName].IsArray()) { + auto lims = evset[itemName].GetArray(); + if (lims.Size() == 2) { + fdBCMin = lims[0].GetInt(); + fdBCMax = lims[1].GetInt(); + } else { + LOGF(error, "Check the parameter file! %s must have two elements!", itemName); + return false; + } + } else { + LOGF(error, "Check the parameter file! Item %s must be an array!", itemName); + return false; + } + } + + // check for FITvetos + itemName = "FITvetos"; + if (evset.HasMember(itemName)) { + if (evset[itemName].IsArray()) { + auto vetoes = evset[itemName].GetArray(); + if (vetoes.Size() == 5) { + fFITvetos.clear(); + for (auto i = 0; i < 5; i++) { + fFITvetos.push_back(vetoes[i].GetInt()); + } + } else { + LOGF(error, "Check the parameter file! %s must have five elements!", itemName); + return false; + } + } else { + LOGF(error, "Check the parameter file! Item %s must be an array!", itemName); + return false; + } + } + + // clean up + fclose(fjson); + + // create the histograms + createHistograms(registry); + + return true; +} + +void decayTree::updateParents() +{ + // reset parents + for (const auto& res : fResonances) { + res->clearParents(); + } + + for (const auto& res : fResonances) { + for (const auto& daughName : res->getDaughters()) { + auto daugh = getResonance(daughName); + daugh->addParent(res->name()); + } + } +} + +void decayTree::reset() +{ + fStatus = 0; + fChargeState = -1; + for (const auto& res : fResonances) { + res->reset(); + } +} + +// decayTree status +// 0: unset +// 1: not accepted +// 2: ULS accepted +// 3: LS accepted +void decayTree::updateStatus() +{ + bool isULS = true; + bool isLS = true; + fStatus = 1; + for (const auto& res : fResonances) { + if (res->status() < 3) { + return; + } + + // check the charge state + updateChargeState(); + if (std::find(fULSstates.begin(), fULSstates.end(), fChargeState) == fULSstates.end()) { + isULS = false; + } + if (std::find(fLSstates.begin(), fLSstates.end(), fChargeState) == fLSstates.end()) { + isLS = false; + } + } + if (isULS) { + fStatus = 2; + } else if (isLS) { + fStatus = 3; + } +} + +void decayTree::Print() +{ + LOGF(info, "eventCuts"); + LOGF(info, " ntrkRange: %d : %d", fnTracksMin, fnTracksMax); + LOGF(info, " dBCRange: %d : %d", fdBCMin, fdBCMax); + LOGF(info, " FITVetoes: [ %d %d %d %d %d ]", fFITvetos[0], fFITvetos[1], fFITvetos[2], fFITvetos[3], fFITvetos[4]); + LOGF(info, " ULS states"); + for (const auto& chstat : fULSstates) { + LOGF(info, " %d", chstat); + } + LOGF(info, " LS states"); + for (const auto& chstat : fLSstates) { + LOGF(info, " %d", chstat); + } + LOGF(info, ""); + LOGF(info, "decayTree"); + LOGF(info, " nResonances: %d", fResonances.size()); + LOGF(info, " nFinals: %d", fnFinals); + LOGF(info, " Resonances"); + for (const auto& res : fResonances) { + res->Print(); + } +} + +resonance* decayTree::getResonance(std::string name) +{ + for (const auto& res : fResonances) { + if (res->name() == name) { + return res; + } + } + LOGF(error, "A resonance %s does not exists!", name); + return new resonance(); // is needed to satisfy return type +} + +resonance* decayTree::getFinal(int counter) +{ + for (const auto& res : fResonances) { + if (res->counter() == counter) { + return res; + } + } + LOGF(error, "The final %d does not exists!", counter); + return new resonance(); // is needed to satisfy return type +} + +std::vector decayTree::getFinals(resonance* res) +{ + std::vector resFinals; + + for (const auto& d1Name : res->getDaughters()) { + auto d1 = getResonance(d1Name); + if (d1->isFinal()) { + resFinals.push_back(d1); + } else { + for (const auto& d2Name : d1->getDaughters()) { + auto d2 = getResonance(d2Name); + for (const auto& d3 : getFinals(d2)) { + resFinals.push_back(d3); + } + } + } + } + return resFinals; +} + +// apply anglecuts +void decayTree::checkAngles() +{ + // loop over resonances + for (const auto& res : fResonances) { + auto anglecuts = res->getAngleCuts(); + // loop over angle cuts + for (const auto& anglecut : anglecuts) { + auto rnames = anglecut->rNames(); + auto anglerange = anglecut->angleRange(); + + // compute angle between two resonances + auto lv1 = getResonance(rnames.first)->IVM(); + auto lv2 = getResonance(rnames.second)->IVM(); + auto ang = lv1.Angle(lv2.Vect()); + + // apply cut + if (ang < anglerange.first || ang > anglerange.second) { + res->setStatus(2); + break; + } + } + } +} + +// compute charge state +int decayTree::chargeState(std::vector chs) +{ + int chargeState = -1; + if (static_cast(chs.size()) == fnFinals) { + // loop over elements of chargestate + chargeState = 0; + for (auto ind = 0; ind < fnFinals; ind++) { + chargeState += (chs[ind] > 0) * std::pow(2, ind); + } + } + return chargeState; +} +void decayTree::updateChargeState() +{ + fChargeState = 0; + + // loop over all finals + for (auto ind = 0; ind < fnFinals; ind++) { + fChargeState += (getFinal(ind)->charge() > 0) * std::pow(2, ind); + } +} + +std::size_t decayTree::combHash(std::vector& comb) +{ + // comb contains indices to tracks + // the combination hash is created from a string which is comprised of a sorted list of track indices + + // sort comb + std::map m_unsorted; + for (size_t cnt = 0; cnt < comb.size(); cnt++) { + m_unsorted.insert(std::pair(comb[cnt], cnt)); + } + std::vector v_sorted(comb.size()); + partial_sort_copy(begin(comb), end(comb), begin(v_sorted), end(v_sorted)); + + // create the hash + std::hash hasher; + std::string hashstr{""}; + for (size_t cnt = 0; cnt < comb.size(); cnt++) { + hashstr += std::to_string(v_sorted[cnt]); + } + + return hasher(hashstr); +} + +// find all permutations of n0 elements +void decayTree::permutations(std::vector& ref, int n0, int np, std::vector>& perms) +{ + // create local reference + auto ref2u = ref; + + // loop over np-1 rotations of last np elements of ref + for (auto ii = 0; ii < np; ii++) { + + // create a new permutation + // copy first n0-np elements from ref + // then rotate last np elements of ref + std::vector perm(n0, 0); + for (auto ii = 0; ii < n0 - np; ii++) { + perm[ii] = ref2u[ii]; + } + for (auto ii = n0 - np + 1; ii < n0; ii++) { + perm[ii - 1] = ref2u[ii]; + } + perm[n0 - 1] = ref2u[n0 - np]; + + // add new permutation to the list of permuutations + if (ii < (np - 1)) { + perms.push_back(perm); + } + + // if np>2 then do permutation of next level + // use the new combination as reference + if (np > 2) { + auto newnp = np - 1; + permutations(perm, n0, newnp, perms); + } + + // update reference + ref2u = perm; + } +} + +// find all permutations of n0 elements +int decayTree::permutations(int n0, std::vector>& perms) +{ + // initialize with first trivial combination + perms.clear(); + if (n0 == 0) { + return 0; + } + + std::vector ref(n0, 0); + for (auto ii = 0; ii < n0; ii++) { + ref[ii] = ii; + } + perms.push_back(ref); + + // iterate recursively + permutations(ref, n0, n0, perms); + + return perms.size(); +} + +void decayTree::combinations(int n0, std::vector& pool, int np, std::vector& inds, int n, + std::vector>& combs) +{ + // loop over pool + for (auto ii = 0; ii < n0 - n; ii++) { + + inds[n] = pool[ii]; + + // if all inds are defined then print them out + // else get next inds + if (np == 1) { + + std::vector comb(n + 1, 0); + for (uint ii = 0; ii < inds.size(); ii++) { + comb[ii] = inds[ii]; + } + combs.push_back(comb); + + } else { + + auto n0new = n0 - ii; + std::vector newpool(n0new, 0); + for (auto kk = 0; kk < n0new; kk++) { + newpool[kk] = pool[kk + ii + 1]; + } + + auto npnew = np - 1; + auto nnew = n + 1; + combinations(n0new, newpool, npnew, inds, nnew, combs); + } + } +} + +// find all possible selections of np out of n0 +int decayTree::combinations(int n0, int np, std::vector>& combs) +{ + // initialisations + combs.clear(); + if (n0 < np) { + return 0; + } + + std::vector pool(n0, 0); + for (auto ii = 0; ii < n0; ii++) { + pool[ii] = ii; + } + std::vector inds(np, 0); + + // iterate recursively + combinations(n0, pool, np, inds, 0, combs); + + return combs.size(); +} + +std::vector> decayTree::combinations(int nPool) +{ + // all selections of fnFinals items from nPool elements + std::vector> combs; + combinations(nPool, fnFinals, combs); + + // permute the combinations + std::vector> copes; + for (const auto& comb : combs) { + for (const auto& perm : fPermutations) { + std::vector cope(fnFinals, 0); + for (auto jj = 0; jj < fnFinals; jj++) { + cope[perm[jj]] = comb[jj]; + } + copes.push_back(cope); + } + } + + return copes; +} + +// ----------------------------------------------------------------------------- diff --git a/PWGUD/Core/decayTree.h b/PWGUD/Core/decayTree.h new file mode 100644 index 00000000000..a23f688adea --- /dev/null +++ b/PWGUD/Core/decayTree.h @@ -0,0 +1,1004 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +#ifndef PWGUD_CORE_DECAYTREE_H_ +#define PWGUD_CORE_DECAYTREE_H_ + +#include +#include +#include +#include + +#include "Framework/AnalysisTask.h" +#include "Framework/O2DatabasePDGPlugin.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/Logger.h" +#include "TLorentzVector.h" +#include "TDatabasePDG.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +// ----------------------------------------------------------------------------- +class pidSelector +{ + public: + // constructor/destructor + pidSelector() {} + explicit pidSelector(std::vector>& pidcuts); + ~pidSelector() {} + + // setter + void clear(); + + // getters + void Print(); + + // templated functions + template + double getTPCnSigma(TTs track, int pid) + { + auto hypo = pid2ind(pid); + switch (hypo) { + case 0: + return track.tpcNSigmaEl(); + case 1: + return track.tpcNSigmaPi(); + case 2: + return track.tpcNSigmaMu(); + case 3: + return track.tpcNSigmaKa(); + case 4: + return track.tpcNSigmaPr(); + default: + return 0.; + } + }; + + template + double getTOFnSigma(TTs track, int pid) + { + auto hypo = pid2ind(pid); + switch (hypo) { + case 0: + return track.tofNSigmaEl(); + case 1: + return track.tofNSigmaPi(); + case 2: + return track.tofNSigmaMu(); + case 3: + return track.tofNSigmaKa(); + case 4: + return track.tofNSigmaPr(); + default: + return 0.; + } + }; + + template + bool goodTrack(TTs track) + { + // loop over pidcuts + for (const auto& pidcut : fpidCuts) { + + float mom = 0.; + float detValue = 0.; + if (pidcut[1] == 1) { + // TPC + if (track.hasTPC()) { + mom = track.tpcInnerParam(); + if (mom < pidcut[4] || mom > pidcut[5]) { + // not in relevant momentum range + continue; + } + if (std::abs(pidcut[2]) == 1) { + // nSigma + detValue = getTPCnSigma(track, pidcut[0]); + } else { + // signal + detValue = track.tpcSignal(); + } + } else { + if (pidcut[3] == 2) { + // TPC is required + return false; + } else { + continue; + } + } + } else { + // TOF + if (track.hasTOF()) { + mom = track.tofExpMom(); + if (mom < pidcut[4] || mom > pidcut[5]) { + // not in relevant momentum range + continue; + } + if (std::abs(pidcut[2]) == 1) { + // nSigma + detValue = getTOFnSigma(track, pidcut[0]); + } else { + // signal + detValue = track.tofSignal(); + } + } else { + if (pidcut[3] == 2) { + // TOF is required + return false; + } else { + continue; + } + } + } + + // inclusive / exclusive + if (pidcut[2] > 0 && (detValue < pidcut[6] || detValue > pidcut[7])) { + return false; + } else if (pidcut[2] < 0 && (detValue > pidcut[6] && detValue < pidcut[7])) { + return false; + } + } + + // the track is good if we arrive here + return true; + } + + private: + std::vector> fpidCuts; + int pid2ind(int pid); + + // ClassDefNV(pidSelector, 1); +}; + +// ----------------------------------------------------------------------------- +class angleCut +{ + public: + // constructor/destructor + angleCut() {} + explicit angleCut(std::pair rNames, double angleMin, double angleMax); + ~angleCut() {} + + std::pair rNames() { return fRnames; } + std::pair angleRange() { return std::pair{fAngleMin, fAngleMax}; } + + void Print(); + + private: + std::pair fRnames; + double fAngleMin; + double fAngleMax; + + // ClassDefNV(angleCut, 1); +}; + +// ----------------------------------------------------------------------------- +class reconstructedParticle +{ + public: + // constructor/destructor + reconstructedParticle() {} + explicit reconstructedParticle(std::string name, TLorentzVector ivm, std::vector& comb) + { + fName = name; + fIVM = ivm; + fComb = comb; + }; + ~reconstructedParticle() {} + + std::string name() { return fName; } + TLorentzVector lv() { return fIVM; } + std::vector comb() { return fComb; } + + private: + std::string fName; + + // status + // 0: not defined + // 1: ULS + // 2: LS + TLorentzVector fIVM; + std::vector fComb; +}; + +using recResType = std::vector>; + +class reconstructedEvent +{ + public: + // constructor/destructor + reconstructedEvent() {} + explicit reconstructedEvent(recResType recs, int chargeState, std::vector& comb) + { + fRecs = recs; + fComb = comb; + fChargeState = chargeState; + }; + ~reconstructedEvent() {} + + recResType recResonances() { return fRecs; } + std::vector comb() { return fComb; } + + private: + recResType fRecs; + std::vector fComb; + int fChargeState; +}; + +using decayTreeResType = std::map; + +// ----------------------------------------------------------------------------- +class resonance +{ + public: + // constructor/destructor + resonance(); + ~resonance() {} + + // setters + void init(); + void reset(); + + void setisFinal() { fisFinal = true; } + void setCounter(int counter) { fCounter = counter; } + void setName(std::string name) { fName = name; } + void setStatus(int status) { fStatus = status; } + void setPID(int pid) { fPID = pid; } + void setPIDFun(int pidfun) { fPIDfun = pidfun; } + void setDetectorHits(int its, int tpc, int trd, int tof) + { + fdetectorHits = std::vector{its, tpc, trd, tof}; + } + void clearParents() { fParents.clear(); } + void addParent(std::string parent) { fParents.push_back(parent); } + void setDaughters(std::vector& daughters) { fDaughters = daughters; } + void setIVM(TLorentzVector ivm) + { + fIVM = ivm; + fStatus = 1; + } + void setCharge(int charge) { fCharge = charge; } + + // selections + void setMassRange(double mmin, double mmax) + { + fmassMin = mmin; + fmassMax = mmax; + } + void setPtRange(double ptmin, double ptmax) + { + fptMin = ptmin; + fptMax = ptmax; + } + void setEtaRange(double etamin, double etamax) + { + fetaMin = etamin; + fetaMax = etamax; + } + void setNcltpcRange(int ncltpcmin, int ncltpcmax) + { + fncltpcMin = ncltpcmin; + fncltpcMax = ncltpcmax; + } + void setChi2ncltpcRange(double chi2ncltpcmin, double chi2ncltpcmax) + { + fchi2ncltpcMin = chi2ncltpcmin; + fchi2ncltpcMax = chi2ncltpcmax; + } + void setDCAxyzMax(double dcaxymax, double dcazmax) + { + fdcaxyMax = dcaxymax; + fdcazMax = dcazmax; + } + void setPIDSelector(pidSelector pidcuts) { fpidSelector = pidcuts; } + void setAngleCuts(std::vector anglecuts) { fangleCuts = anglecuts; } + + // histograms + void setMassHistAxis(int nbins, double binmin, double binmax) + { + fnmassBins = nbins; + fmassHistMin = binmin; + fmassHistMax = binmax; + } + void setMomHistAxis(int nbins, double binmin, double binmax) + { + fnmomBins = nbins; + fmomHistMin = binmin; + fmomHistMax = binmax; + } + void updateStatus(); + + // getters + bool isFinal() { return fisFinal; } + int counter() { return fCounter; } + std::string name() { return fName; } + int status() { return fStatus; } + int pid() { return fPID; } + int pidFun() { return fPIDfun; } + std::vector detectorHits() { return fdetectorHits; } + std::vector getParents() { return fParents; } + std::vector getDaughters() { return fDaughters; } + double massMin() { return fmassMin; } + double massMax() { return fmassMax; } + double ptMin() { return fptMin; } + double ptMax() { return fptMax; } + double etaMin() { return fetaMin; } + double etaMax() { return fetaMax; } + TLorentzVector IVM() { return fIVM; } + int charge() { return fCharge; } + pidSelector getPIDSelector() { return fpidSelector; } + std::vector getAngleCuts() { return fangleCuts; } + + // histograms + int nmassBins() { return fnmassBins; } + std::vector massHistRange() { return std::vector({fmassHistMin, fmassHistMax}); } + int nmomBins() { return fnmomBins; } + std::vector momHistRange() { return std::vector({fmomHistMin, fmomHistMax}); } + + void Print(); + + // templated functions + // resonance status + // 0: unset + // 1: IVM calculated + // 2: not accepted + // 3: accepted + template + void updateStatus(TTs const& track) + { + // IVM has to be computed + if (fStatus == 0) { + return; + } + + // check mass, pt, eta range and charge + updateStatus(); + + // check detector hits, track cuts + if (fStatus >= 3) { + // detector hits + if (fdetectorHits[0] >= 0) { + if ((fdetectorHits[0] == 0 && track.hasITS()) || (fdetectorHits[0] > 0 && !track.hasITS())) { + fStatus = 2; + } + } + if (fdetectorHits[1] >= 0) { + if ((fdetectorHits[1] == 0 && track.hasTPC()) || (fdetectorHits[1] > 0 && !track.hasTPC())) { + fStatus = 2; + } + } + if (fdetectorHits[2] >= 0) { + if ((fdetectorHits[2] == 0 && track.hasTRD()) || (fdetectorHits[2] > 0 && !track.hasTRD())) { + fStatus = 2; + } + } + if (fdetectorHits[3] >= 0) { + if ((fdetectorHits[3] == 0 && track.hasTOF()) || (fdetectorHits[3] > 0 && !track.hasTOF())) { + fStatus = 2; + } + } + // PID cuts + if (!fpidSelector.goodTrack(track)) { + fStatus = 2; + } + // nclTPC + auto nclTPC = track.tpcNClsFindable() - track.tpcNClsFindableMinusFound(); + if (nclTPC < fncltpcMin || nclTPC > fncltpcMax) { + fStatus = 2; + } + // chi2nclTPC + if (track.tpcChi2NCl() < fchi2ncltpcMin || track.tpcChi2NCl() > fchi2ncltpcMax) { + fStatus = 2; + } + // dcaxyz + auto lim = fdcaxyMax + std::pow(0.0350 / track.pt(), 1.1); + if (std::abs(track.dcaXY()) > lim || std::abs(track.dcaZ()) > fdcazMax) { + fStatus = 2; + } + } + } + + private: + bool fisFinal; + int fCounter; + + // resonance name + std::string fName; + int fStatus; + + // nominal pid + int fPID; + int fPIDfun; + std::vector fdetectorHits; + + // name of parents and daughters + std::vector fParents; + std::vector fDaughters; + void updateParents(); + + // mass, pT, , eta range + double fmassMin; + double fmassMax; + double fptMin; + double fptMax; + double fetaMin; + double fetaMax; + int fncltpcMin; + int fncltpcMax; + double fchi2ncltpcMin; + double fchi2ncltpcMax; + double fdcaxyMax; + double fdcazMax; + + // histogram axes + int fnmassBins; + double fmassHistMax; + double fmassHistMin; + int fnmomBins; + double fmomHistMax; + double fmomHistMin; + + // invariant mass + TLorentzVector fIVM; + int fCharge; + + // pidcuts, anglecuts + pidSelector fpidSelector; + std::vector fangleCuts; + + // ClassDefNV(resonance, 1); +}; + +// ----------------------------------------------------------------------------- +class decayTree +{ + public: + // constructor/destructor + decayTree(); + ~decayTree() {} + + // setters + // read decay tree from json file + bool init(std::string const& filename, HistogramRegistry& registry); + + // reset status of all resonances to 0 + void reset(); + void updateStatus(); + + // getters + int nFinals() { return fnFinals; } + std::vector getResonances() { return fResonances; } + resonance* getResonance(std::string name); + resonance* getFinal(int counter); + std::vector getFinals(resonance* res); + std::vector ntrackRange() { return std::vector{fnTracksMin, fnTracksMax}; } + double rgtrTOFMin() { return frgtwtofMin; } + std::vector dBCRange() { return std::vector{fdBCMin, fdBCMax}; } + std::vector FITvetos() { return fFITvetos; } + + void Print(); + + template + decayTreeResType processTree(TTs const& tracks, bool withFill = true) + { + recResType ULSresults; + recResType LSresults; + + // return if nFinals > tracks.size() + if (fnFinals > tracks.size()) { + LOGF(info, "Number of tracks (%d) is smaller than the number of finals (%d)", tracks.size(), fnFinals); + return decayTreeResType{{"ULS", ULSresults}, {"LS", LSresults}}; + } + + // create all possible track combinations including permutations + auto combs = combinations(tracks.size()); + + // a vector to keep track of successful combinations + std::vector goodCombs; + + // loop over possible combinations + LOGF(debug, "New event"); + for (auto& comb : combs) { + std::string scomb(""); + for (const auto& i : comb) { + scomb.append(" ").append(std::to_string(i)); + } + LOGF(debug, " combination:%s", scomb); + + // has an equivalent combination been accepted already? + auto newHash = combHash(comb); + if (std::find(goodCombs.begin(), goodCombs.end(), newHash) != goodCombs.end()) { + LOGF(debug, " Equivalent combination is already accepted!"); + continue; + } + + // loop over resonances and compute + reset(); + for (auto res : fResonances) { + computeResonance(res, tracks, comb); + } + + // check angles between daughters of all resonances + checkAngles(); + + // check status of all resonances + updateStatus(); + if (fStatus >= 2) { + goodCombs.push_back(newHash); + std::map recResonances; + for (const auto& res : fResonances) { + recResonances.insert({res->name(), reconstructedParticle(res->name(), res->IVM(), comb)}); + } + + if (fStatus == 2) { + ULSresults.push_back(recResonances); + } else { + LSresults.push_back(recResonances); + } + } + } + auto results = decayTreeResType{{"ULS", ULSresults}, {"LS", LSresults}}; + if (withFill) { + fillHistograms(results, tracks); + } + return results; + } + +#define getHist(type, name) std::get>(fhistPointers[name]) + template + void fillHistograms(decayTreeResType results, TTs const& tracks) + { + // fill the histograms + std::string base; + std::string hname; + + // results["ULS"] contains the ULS results + // results["LS"] contains the LS results + for (const auto& cc : fccs) { + // result is a std::vector> + for (auto result : results[cc]) { + + // loop over the reconstructed particles + // rec.first: name of the reconstructed particle + // rec.second: reconstructed particle + for (auto rec : result) { + auto lv = rec.second.lv(); + base = cc; + base.append("/").append(rec.first).append("/"); + + hname = base + "mpt"; + getHist(TH2, hname)->Fill(lv.M(), lv.Perp(), 1.); + hname = base + "meta"; + getHist(TH2, hname)->Fill(lv.M(), lv.Eta(), 1.); + hname = base + "pteta"; + getHist(TH2, hname)->Fill(lv.Perp(), lv.Eta(), 1.); + + // M vs daughters + auto res = getResonance(rec.first); + auto daughs = res->getDaughters(); + auto ndaughs = daughs.size(); + for (auto i = 0; i < static_cast(ndaughs); i++) { + auto d1 = getResonance(daughs[i]); + + // M vs pT daughter + hname = base; + hname.append("MvspT_").append(rec.first).append(d1->name()); + getHist(TH2, hname)->Fill(lv.M(), result[d1->name()].lv().Perp(), 1.); + + // M vs eta daughter + hname = base; + hname.append("Mvseta_").append(rec.first).append(d1->name()); + getHist(TH2, hname)->Fill(lv.M(), result[d1->name()].lv().Eta(), 1.); + + if (d1->isFinal()) { + auto tr = tracks.begin() + result[d1->name()].comb()[d1->counter()]; + + // M vs dca + hname = base; + hname.append("MvsdcaXY_").append(rec.first).append(d1->name()); + getHist(TH2, hname)->Fill(lv.M(), tr.dcaXY(), 1.); + hname = base; + hname.append("MvsdcaZ_").append(rec.first).append(d1->name()); + getHist(TH2, hname)->Fill(lv.M(), tr.dcaZ(), 1.); + + // M vs chi2 track + hname = base; + hname.append("Mvschi2_").append(rec.first).append(d1->name()); + getHist(TH2, hname)->Fill(lv.M(), tr.tpcChi2NCl(), 1.); + + // M vs nCl track + hname = base; + hname.append("MvsnCl_").append(rec.first).append(d1->name()); + getHist(TH2, hname)->Fill(lv.M(), tr.tpcNClsFindable() - tr.tpcNClsFindableMinusFound(), 1.); + + // M versus detector hits + hname = base; + hname.append("MvsdetHits_").append(rec.first).append(d1->name()); + auto ind = tr.hasITS() + tr.hasTPC() * 2 + tr.hasTRD() * 4 + tr.hasTOF() * 8; + getHist(TH2, hname)->Fill(lv.M(), ind, 1.); + } else { + // M vs Mi + hname = base; + hname.append("MvsM_").append(rec.first).append(d1->name()); + getHist(TH2, hname)->Fill(lv.M(), result[d1->name()].lv().M(), 1.); + } + } + + // daughters vs daughters + for (auto i = 0; i < static_cast(ndaughs - 1); i++) { + auto d1 = getResonance(daughs[i]); + auto ivm1 = result[daughs[i]].lv(); + for (auto j = i + 1; j < static_cast(ndaughs); j++) { + auto d2 = getResonance(daughs[j]); + auto ivm2 = result[daughs[j]].lv(); + + // M1 vs M2 + hname = base; + hname.append("MvsM_").append(d1->name()).append(d2->name()); + getHist(TH2, hname)->Fill(ivm1.M(), ivm2.M(), 1.); + + // angle(d1, d2) + auto ang = ivm1.Angle(ivm2.Vect()); + hname = base; + hname.append("angle_").append(d1->name()).append(d2->name()); + getHist(TH1, hname)->Fill(ang, 1.); + + // M vs angle(d1, d2) + hname = base; + hname.append("Mvsangle_").append(d1->name()).append(d2->name()); + getHist(TH2, hname)->Fill(lv.M(), ang, 1.); + + // both daughters are finals + if (d1->isFinal() && d2->isFinal()) { + auto tr1 = tracks.begin() + result[d1->name()].comb()[d1->counter()]; + auto tr2 = tracks.begin() + result[d2->name()].comb()[d2->counter()]; + + // TPC signal vs TPC signal + hname = base; + hname.append("TPCsignal_").append(d1->name()).append(d2->name()); + getHist(TH2, hname)->Fill(tr1.tpcSignal(), tr2.tpcSignal(), 1.); + } + } + } + + // finals specific histograms + if (res->isFinal()) { + auto tr = tracks.begin() + rec.second.comb()[res->counter()]; + + // dca XYZ + hname = base; + hname.append("dcaXY"); + getHist(TH1, hname)->Fill(tr.dcaXY(), 1.); + hname = base; + hname.append("dcaZ"); + getHist(TH1, hname)->Fill(tr.dcaZ(), 1.); + + // TPC + hname = base; + hname.append("nS").append(fparts[0]).append(fdets[0]); + getHist(TH2, hname)->Fill(tr.tpcInnerParam(), tr.tpcNSigmaEl(), 1.); + hname = base; + hname.append("nS").append(fparts[1]).append(fdets[0]); + getHist(TH2, hname)->Fill(tr.tpcInnerParam(), tr.tpcNSigmaPi(), 1.); + hname = base; + hname.append("nS").append(fparts[2]).append(fdets[0]); + getHist(TH2, hname)->Fill(tr.tpcInnerParam(), tr.tpcNSigmaMu(), 1.); + hname = base; + hname.append("nS").append(fparts[3]).append(fdets[0]); + getHist(TH2, hname)->Fill(tr.tpcInnerParam(), tr.tpcNSigmaKa(), 1.); + hname = base; + hname.append("nS").append(fparts[4]).append(fdets[0]); + getHist(TH2, hname)->Fill(tr.tpcInnerParam(), tr.tpcNSigmaPr(), 1.); + + // TOF + if (tr.hasTOF()) { + hname = base; + hname.append("nS").append(fparts[0]).append(fdets[1]); + getHist(TH2, hname)->Fill(tr.tofExpMom(), tr.tofNSigmaEl(), 1.); + hname = base; + hname.append("nS").append(fparts[1]).append(fdets[1]); + getHist(TH2, hname)->Fill(tr.tofExpMom(), tr.tofNSigmaPi(), 1.); + hname = base; + hname.append("nS").append(fparts[2]).append(fdets[1]); + getHist(TH2, hname)->Fill(tr.tofExpMom(), tr.tofNSigmaMu(), 1.); + hname = base; + hname.append("nS").append(fparts[3]).append(fdets[1]); + getHist(TH2, hname)->Fill(tr.tofExpMom(), tr.tofNSigmaKa(), 1.); + hname = base; + hname.append("nS").append(fparts[4]).append(fdets[1]); + getHist(TH2, hname)->Fill(tr.tofExpMom(), tr.tofNSigmaPr(), 1.); + } + + // detector hits + hname = base; + hname.append("detectorHits"); + if (tr.hasITS()) { + getHist(TH1, hname)->Fill(1, 1.); + } + if (tr.hasTPC()) { + getHist(TH1, hname)->Fill(2, 1.); + } + if (tr.hasTRD()) { + getHist(TH1, hname)->Fill(3, 1.); + } + if (tr.hasTOF()) { + getHist(TH1, hname)->Fill(4, 1.); + } + } + } + } + } + } + + private: + // decayTree status + // 0: unset + // 1: not accepted + // 2: ULS accepted + // 3: LS accepted + int fStatus; + TDatabasePDG* fPDG; + + // event requierements + int fnTracksMin; + int fnTracksMax; + double frgtwtofMin; + int fdBCMin; + int fdBCMax; + std::vector fFITvetos; + std::vector fULSstates; + std::vector fLSstates; + + // vectors of Resonances + std::vector fResonances; + int fChargeState; + + // number of finals + int fnFinals; + std::vector> fPermutations; + + // histogram registry + std::vector fccs; + std::vector fdets; + std::vector fparts; + std::map fhistPointers; + + // generate parent information for all resonances + void updateParents(); + + // helper functions to compute combinations and permutations + // combination: selection of n out of N + // permutation: order of n selected items + // create all permutations of all combinations + std::size_t combHash(std::vector& comb); + void permutations(std::vector& ref, int n0, int np, std::vector>& perms); + int permutations(int n0, std::vector>& perms); + void combinations(int n0, std::vector& pool, int np, std::vector& inds, int n, + std::vector>& combs); + int combinations(int n0, int np, std::vector>& combs); + std::vector> combinations(int nPool); + + // check all angle requirements + void checkAngles(); + + // compute the charge state + int chargeState(std::vector chs); + void updateChargeState(); + + // templated functions + template + void computeResonance(resonance* res, TTs const& tracks, std::vector& comb) + { + // if status > 0 then return + if (res->status() > 0) { + return; + } + + // initialisations + TLorentzVector ivm{0., 0., 0., 0.}; + int charge = 0; + + // is this a final state or a resonance + if (res->isFinal()) { + // is a final + auto pdgparticle = fPDG->GetParticle(res->pid()); + auto track = (tracks.begin() + comb[res->counter()]); + ivm.SetXYZM(track.px(), track.py(), track.pz(), pdgparticle->Mass()); + res->setIVM(ivm); + res->setCharge(track.sign()); + res->setStatus(1); + + // apply cuts + res->updateStatus(track); + + } else { + // is a resonance + // loop over daughters + for (const auto& daughName : res->getDaughters()) { + auto daugh = getResonance(daughName); + computeResonance(daugh, tracks, comb); + ivm += daugh->IVM(); + charge += daugh->charge(); + } + res->setIVM(ivm); + res->setCharge(charge); + res->setStatus(1); + + // apply cuts + res->updateStatus(); + } + } + + // create histograms + void createHistograms(HistogramRegistry& registry) + { + // definitions + auto etax = AxisSpec(100, -1.5, 1.5); + auto nSax = AxisSpec(300, -15.0, 15.0); + auto chi2ax = AxisSpec(100, 0.0, 5.0); + auto nClax = AxisSpec(170, 0.0, 170.0); + auto angax = AxisSpec(315, 0.0, 3.15); + auto dcaxyax = AxisSpec(400, -0.2, 0.2); + auto dcazax = AxisSpec(600, -0.3, 0.3); + auto sTPCax = AxisSpec(1000, 0., 1000.); + + std::string base; + std::string hname; + std::string annot; + fhistPointers.clear(); + for (const auto& res : getResonances()) { + auto max = AxisSpec(res->nmassBins(), res->massHistRange()[0], res->massHistRange()[1]); + auto momax = AxisSpec(res->nmomBins(), res->momHistRange()[0], res->momHistRange()[1]); + + // M-pT, M-eta, pT-eta + for (const auto& cc : fccs) { + base = cc; + base.append("/").append(res->name()).append("/"); + hname = base + "mpt"; + annot = "M versus pT; M (" + res->name() + ") GeV/c^{2}; pT (" + res->name() + ") GeV/c"; + fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {HistType::kTH2F, {max, momax}})}); + hname = base + "meta"; + annot = "M versus eta; M (" + res->name() + ") GeV/c^{2}; eta (" + res->name() + ")"; + fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {HistType::kTH2F, {max, etax}})}); + hname = base + "pteta"; + annot = "pT versus eta; pT (" + res->name() + ") GeV/c; eta (" + res->name() + ")"; + fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {HistType::kTH2F, {momax, etax}})}); + + // M versus daughters + auto daughs = res->getDaughters(); + auto ndaughs = daughs.size(); + for (auto i = 0; i < static_cast(ndaughs); i++) { + auto d1 = getResonance(daughs[i]); + + // M vs pT daughter + hname = base; + hname.append("MvspT_").append(res->name()).append(d1->name()); + annot = "M versus pT; M (" + res->name() + ") GeV/c^{2}; pT (" + d1->name() + ") GeV/c"; + auto momax1 = AxisSpec(d1->nmomBins(), d1->momHistRange()[0], d1->momHistRange()[1]); + fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {HistType::kTH2F, {max, momax1}})}); + + // M vs eta daughter + hname = base; + hname.append("Mvseta_").append(res->name()).append(d1->name()); + annot = "M versus eta; M (" + res->name() + ") GeV/c^{2}; eta (" + d1->name() + ")"; + fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {HistType::kTH2F, {max, etax}})}); + + if (d1->isFinal()) { + // M vs dcaXYZ + hname = base; + hname.append("MvsdcaXY_").append(res->name()).append(d1->name()); + annot = "M versus dcaXY; M (" + res->name() + ") GeV/c^{2}; dca_{XY} (" + d1->name() + ") {mu}m"; + fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {HistType::kTH2F, {max, dcaxyax}})}); + hname = base; + hname.append("MvsdcaZ_").append(res->name()).append(d1->name()); + annot = "M versus dcaZ; M (" + res->name() + ") GeV/c^{2}; dca_{Z} (" + d1->name() + ") {mu}m"; + fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {HistType::kTH2F, {max, dcazax}})}); + + // M vs chi2 track + hname = base; + hname.append("Mvschi2_").append(res->name()).append(d1->name()); + annot = "M versus chi2; M (" + res->name() + ") GeV/c^{2}; chi2 (" + d1->name() + ")"; + fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {HistType::kTH2F, {max, chi2ax}})}); + + // M vs nCl track + hname = base; + hname.append("MvsnCl_").append(res->name()).append(d1->name()); + annot = "M versus nCl; M (" + res->name() + ") GeV/c^{2}; nCl (" + d1->name() + ")"; + fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {HistType::kTH2F, {max, nClax}})}); + + // M versus detector hits + hname = base; + hname.append("MvsdetHits_").append(res->name()).append(d1->name()); + annot = "M versus detector hits; M (" + res->name() + ") GeV/c^{2}; ITS + 2*TPC + 4*TRD + 8*TOF (" + d1->name() + ")"; + fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {HistType::kTH2F, {max, {16, -0.5, 15.5}}})}); + } else { + // M vs Mi + hname = base; + hname.append("MvsM_").append(res->name()).append(d1->name()); + annot = "M versus M; M (" + res->name() + ") GeV/c^{2}; M (" + d1->name() + ") GeV/c^{2}"; + auto max1 = AxisSpec(res->nmassBins(), d1->massHistRange()[0], d1->massHistRange()[1]); + fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {HistType::kTH2F, {max, max1}})}); + } + } + + // daughters vs daughters + for (auto i = 0; i < static_cast(ndaughs - 1); i++) { + auto d1 = getResonance(daughs[i]); + auto max1 = AxisSpec(d1->nmassBins(), d1->massHistRange()[0], d1->massHistRange()[1]); + for (auto j = i + 1; j < static_cast(ndaughs); j++) { + auto d2 = getResonance(daughs[j]); + auto max2 = AxisSpec(d2->nmassBins(), d2->massHistRange()[0], d2->massHistRange()[1]); + + // M1 vs M2 + hname = base; + hname.append("MvsM_").append(d1->name()).append(d2->name()); + annot = std::string("M versus M; M (").append(d1->name()).append(") GeV/c^{2}; M (").append(d2->name()).append(") GeV/c^{2}"); + fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {HistType::kTH2F, {max1, max2}})}); + + // angle(d1, d2) + hname = base; + hname.append("angle_").append(d1->name()).append(d2->name()); + annot = std::string("angle; Angle (").append(d1->name()).append(", ").append(d2->name()).append(")"); + fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {HistType::kTH1F, {angax}})}); + + // M vs angle(d1, d2) + hname = base; + hname.append("Mvsangle_").append(d1->name()).append(d2->name()); + annot = std::string("M versus angle; M (").append(res->name()).append(") GeV/c^{2}; Angle (").append(d1->name()).append(", ").append(d2->name()).append(")"); + fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {HistType::kTH2F, {max, angax}})}); + + // both daughters are finals + if (d1->isFinal() && d2->isFinal()) { + hname = base; + hname.append("TPCsignal_").append(d1->name()).append(d2->name()); + annot = std::string("TPC signal of both tracks; TPCsignal (").append(d1->name()).append("); TPCsignal (").append(d2->name()).append(")"); + fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {HistType::kTH2F, {sTPCax, sTPCax}})}); + } + } + } + + // for finals only + if (res->isFinal()) { + // dca + hname = base; + hname.append("dcaXY"); + annot = std::string("dcaXY; dca_{XY}(").append(res->name()).append(")"); + fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {HistType::kTH1F, {dcaxyax}})}); + hname = base; + hname.append("dcaZ"); + annot = std::string("dcaZ; dca_{Z}(").append(res->name()).append(")"); + fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {HistType::kTH1F, {dcazax}})}); + + // nSIgma[TPC, TOF] vs pT + for (const auto& det : fdets) { + for (const auto& part : fparts) { + hname = base; + hname.append("nS").append(part).append(det); + annot = std::string("nSigma_").append(det).append(" versus p; p (").append(res->name()).append(") GeV/c; nSigma_{").append(det).append(", ").append(part).append("} (").append(res->name()).append(")"); + fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {HistType::kTH2F, {momax, nSax}})}); + } + } + + // detector hits + hname = base; + hname.append("detectorHits"); + annot = std::string("detectorHits; Detector(").append(res->name()).append(")"); + fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {HistType::kTH1F, {{4, 0.5, 4.5}}})}); + } + } + } + } + + // ClassDefNV(decayTree, 1); +}; + +#endif // PWGUD_CORE_DECAYTREE_H_ diff --git a/PWGUD/Core/decayTreeLinkDef.h b/PWGUD/Core/decayTreeLinkDef.h new file mode 100644 index 00000000000..92d99ccf1bc --- /dev/null +++ b/PWGUD/Core/decayTreeLinkDef.h @@ -0,0 +1,19 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +#ifndef PWGUD_CORE_DECAYTREELINKDEF_H_ +#define PWGUD_CORE_DECAYTREELINKDEF_H_ + +#pragma link off all globals; +#pragma link off all classes; +#pragma link off all functions; +#pragma link C++ class decayTree + ; + +#endif // PWGUD_CORE_DECAYTREELINKDEF_H_ diff --git a/PWGUD/TableProducer/CMakeLists.txt b/PWGUD/TableProducer/CMakeLists.txt index cc9943b366d..5b4200ce804 100644 --- a/PWGUD/TableProducer/CMakeLists.txt +++ b/PWGUD/TableProducer/CMakeLists.txt @@ -13,7 +13,7 @@ add_subdirectory(Converters) o2physics_add_dpl_workflow(dgcand-producer SOURCES DGCandProducer.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGCutparHolder O2Physics::AnalysisCCDB + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGCutparHolder O2Physics::EventFilteringUtils O2Physics::AnalysisCCDB COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(sgcand-producer diff --git a/PWGUD/TableProducer/DGCandProducer.cxx b/PWGUD/TableProducer/DGCandProducer.cxx index f7c9ff038ec..20f3b7f1a4a 100644 --- a/PWGUD/TableProducer/DGCandProducer.cxx +++ b/PWGUD/TableProducer/DGCandProducer.cxx @@ -15,10 +15,14 @@ #include #include #include -#include "CCDB/BasicCCDBManager.h" + #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" #include "ReconstructionDataFormats/Vertex.h" +#include "EventFiltering/Zorro.h" +#include "EventFiltering/ZorroSummary.h" +#include "CCDB/BasicCCDBManager.h" #include "Common/CCDB/ctpRateFetcher.h" #include "PWGUD/DataModel/UDTables.h" #include "PWGUD/Core/UPCHelpers.h" @@ -29,17 +33,6 @@ using namespace o2::framework; using namespace o2::framework::expressions; struct DGCandProducer { - Service ccdb; - ctpRateFetcher mRateFetcher; - // get a DGCutparHolder - DGCutparHolder diffCuts = DGCutparHolder(); - Configurable DGCuts{"DGCuts", {}, "DG event cuts"}; - Configurable saveAllTracks{"saveAllTracks", true, "save only PV contributors or all tracks associated to a collision"}; - Configurable fillFIThistos{"fillFIThistos", false, "fill the histograms with the FIT amplitudes"}; - - // DG selector - DGSelector dgSelector; - // data tables Produces outputCollisions; Produces outputCollisionsSels; @@ -57,10 +50,32 @@ struct DGCandProducer { Produces outputFwdTracksExtra; Produces outputTracksLabel; + // get a DGCutparHolder + DGCutparHolder diffCuts = DGCutparHolder(); + Configurable DGCuts{"DGCuts", {}, "DG event cuts"}; + + // DG selector + DGSelector dgSelector; + + // configurables + Configurable saveAllTracks{"saveAllTracks", true, "save only PV contributors or all tracks associated to a collision"}; + Configurable fillFIThistos{"fillFIThistos", false, "fill the histograms with the FIT amplitudes"}; + + // zorro object + int mRunNumber; + Service ccdb; + Zorro zorro; + OutputObj zorroSummary{"zorroSummary"}; + Configurable cfgCCDBurl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable cfgZorroCCDBpath{"cfgZorroCCDBpath", "/Users/m/mpuccio/EventFiltering/OTS/", "path to the zorro ccdb objects"}; + Configurable cfgSkimmedProcessing{"cfgSkimmedProcessing", false, "Skimmed dataset processing"}; + Configurable triggerName{"triggerName", "fUDiff,fUDdiffSmall,fUDiffLarge", "Name of the software trigger"}; + + // ctpRateFetcher + ctpRateFetcher mRateFetcher; + // initialize histogram registry - HistogramRegistry registry{ - "registry", - {}}; + HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; // data inputs using CCs = soa::Join; @@ -203,14 +218,20 @@ struct DGCandProducer { void init(InitContext&) { LOGF(debug, " beginning of init reached"); - ccdb->setURL("http://alice-ccdb.cern.ch"); + // initialize zorro + mRunNumber = -1; + zorroSummary.setObject(zorro.getZorroSummary()); + zorro.setBaseCCDBPath(cfgZorroCCDBpath.value); + ccdb->setURL(cfgCCDBurl); ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); ccdb->setFatalWhenNull(false); - diffCuts = (DGCutparHolder)DGCuts; - const int nXbinsInStatH = 25; + // DGCuts + diffCuts = (DGCutparHolder)DGCuts; // add histograms for the different process functions + const int nXbinsInStatH = 26; registry.add("reco/Stat", "Cut statistics;; Collisions", {HistType::kTH1F, {{nXbinsInStatH, -0.5, static_cast(nXbinsInStatH - 0.5)}}}); registry.add("reco/pt1Vspt2", "2 prong events, p_{T} versus p_{T}", {HistType::kTH2F, {{100, -3., 3.}, {100, -3., 3.0}}}); registry.add("reco/TPCsignal1", "2 prong events, TPC signal versus p_{T} of particle 1", {HistType::kTH2F, {{200, -3., 3.}, {200, 0., 100.0}}}); @@ -232,9 +253,10 @@ struct DGCandProducer { registry.add("reco/fddA", "FDDA amplitudes", {HistType::kTH2F, {{nXbinsFITH, -0.5, nXbinsFITH - 0.5}, {13, -0.5, 12.5}}}); registry.add("reco/fddC", "FDDC amplitudes", {HistType::kTH2F, {{nXbinsFITH, -0.5, nXbinsFITH - 0.5}, {13, -0.5, 12.5}}}); - std::string labels[nXbinsInStatH] = {"all", "hasBC", "accepted", "FITveto", "MID trk", "global not PV trk", "not global PV trk", + std::string labels[nXbinsInStatH] = {"all", "hasBC", "zorro", "accepted", "FITveto", "MID trk", "global not PV trk", "not global PV trk", "ITS-only PV trk", "TOF PV trk fraction", "n PV trks", "PID", "pt", "eta", "net charge", - "inv mass", "evsel TF border", "evsel no pile-up", "evsel ITSROF", "evsel z-vtx", "evsel ITSTPC vtx", "evsel TRD vtx", "evsel TOF vtx", "", "", ""}; + "inv mass", "evsel TF border", "evsel no pile-up", "evsel ITSROF", "evsel z-vtx", "evsel ITSTPC vtx", + "evsel TRD vtx", "evsel TOF vtx", "", "", ""}; registry.get(HIST("reco/Stat"))->SetNdivisions(nXbinsInStatH, "X"); for (int iXbin(1); iXbin < nXbinsInStatH + 1; iXbin++) { @@ -244,9 +266,9 @@ struct DGCandProducer { LOGF(debug, " end of init reached"); } - // process function for real data - void process(CC const& collision, BCs const& bcs, TCs& tracks, FWs& fwdtracks, - aod::Zdcs& /*zdcs*/, aod::FV0As& fv0as, aod::FT0s& ft0s, aod::FDDs& fdds) + // process function for reconstructed data + void process(CC const& collision, BCs const& bcs, TCs const& tracks, FWs const& fwdtracks, + aod::Zdcs const& /*zdcs*/, aod::FV0As const& fv0as, aod::FT0s const& ft0s, aod::FDDs const& fdds) { LOGF(debug, " collision %d", collision.globalIndex()); registry.get(HIST("reco/Stat"))->Fill(0., 1.); @@ -257,6 +279,10 @@ struct DGCandProducer { } registry.get(HIST("reco/Stat"))->Fill(1., 1.); auto bc = collision.foundBC_as(); + LOGF(debug, " BC id %d", bc.globalBC()); + const uint64_t ts = bc.timestamp(); + const int runnumber = bc.runNumber(); + int trs = 0; if (collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { trs = 1; @@ -270,8 +296,6 @@ struct DGCandProducer { hmpr = 1; } double ir = 0.; - const uint64_t ts = bc.timestamp(); - const int runnumber = bc.runNumber(); if (bc.has_zdc()) { ir = mRateFetcher.fetch(ccdb.service, ts, runnumber, "ZNC hadronic") * 1.e-3; } @@ -282,7 +306,15 @@ struct DGCandProducer { uint8_t chFV0A = 0; int occ = 0; occ = collision.trackOccupancyInTimeRange(); - LOGF(debug, " BC id %d", bc.globalBC()); + + if (cfgSkimmedProcessing) { + // update ccdb setting for zorro + if (mRunNumber != bc.runNumber()) { + mRunNumber = bc.runNumber(); + zorro.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), triggerName.value); + zorro.populateHistRegistry(registry, bc.runNumber()); + } + } // fill FIT histograms fillFIThistograms(bc); @@ -295,10 +327,19 @@ struct DGCandProducer { auto isDGEvent = dgSelector.IsSelected(diffCuts, collision, bcRange, tracks, fwdtracks); // save DG candidates - registry.get(HIST("reco/Stat"))->Fill(isDGEvent + 2, 1.); + registry.get(HIST("reco/Stat"))->Fill(isDGEvent + 3, 1.); if (isDGEvent == 0) { LOGF(debug, " Data: good collision!"); + if (cfgSkimmedProcessing) { + // let zorro do the accounting + auto zorroDecision = zorro.isSelected(bc.globalBC()); + LOGF(info, " zorroDecision %d", zorroDecision); + if (zorroDecision) { + registry.get(HIST("reco/Stat"))->Fill(2, 1.); + } + } + // fill FITInfo upchelpers::FITInfo fitInfo{}; udhelpers::getFITinfo(fitInfo, bc, bcs, ft0s, fv0as, fdds); @@ -325,14 +366,14 @@ struct DGCandProducer { outputCollsLabels(collision.globalIndex()); // update DGTracks tables - for (auto& track : tracks) { + for (const auto& track : tracks) { if (saveAllTracks || track.isPVContributor()) { updateUDTrackTables(outputCollisions.lastIndex(), track, bc.globalBC()); } } // update DGFwdTracks tables - for (auto& fwdtrack : fwdtracks) { + for (const auto& fwdtrack : fwdtracks) { updateUDFwdTrackTables(fwdtrack, bc.globalBC()); } @@ -359,7 +400,7 @@ struct DGCandProducer { auto cnt = 0; float pt1 = 0., pt2 = 0.; float signalTPC1 = 0., signalTPC2 = 0.; - for (auto tr : tracks) { + for (const auto& tr : tracks) { if (tr.isPVContributor()) { cnt++; switch (cnt) { @@ -410,6 +451,7 @@ struct McDGCandProducer { template void updateUDMcCollisions(TMcCollision const& mccol) { + LOGF(debug, ""); // save mccol auto bc = mccol.template bc_as(); outputMcCollisions(bc.globalBC(), @@ -425,6 +467,8 @@ struct McDGCandProducer { template void updateUDMcParticle(TMcParticle const& McPart, int64_t McCollisionId, std::map& mcPartIsSaved) { + LOGF(debug, " McCollisionId %d", McCollisionId); + // save McPart // mother and daughter indices are set to -1 // ATTENTION: this can be improved to also include mother and daughter indices @@ -451,7 +495,23 @@ struct McDGCandProducer { template void updateUDMcParticles(TMcParticles const& McParts, int64_t McCollisionId, std::map& mcPartIsSaved) { - LOGF(debug, "number of McParticles %d", McParts.size()); + LOGF(debug, " number of McParticles %d", McParts.size()); + LOGF(debug, " McCollisionId %d", McCollisionId); + + /* + LOGF(info, "PStack"); + for (auto const& part : McParts) { + LOGF(info, "P - Id %d PID %d", part.globalIndex(), part.pdgCode()); + for (auto const& mother : part.template mothers_as()) { + LOGF(info, " M - Id %d PID %d", mother.globalIndex(), mother.pdgCode()); + } + for (auto const& daughter : part.template daughters_as()) { + LOGF(info, " D - Id %d PID %d", daughter.globalIndex(), daughter.pdgCode()); + } + } + LOGF(info, ""); + */ + // save McParts // new mother and daughter ids std::vector newmids; @@ -463,7 +523,7 @@ struct McDGCandProducer { // This is needed to be able to assign the new daughter indices std::map oldnew; auto lastId = outputMcParticles.lastIndex(); - for (auto mcpart : McParts) { + for (const auto& mcpart : McParts) { auto oldId = mcpart.globalIndex(); if (mcPartIsSaved.find(oldId) != mcPartIsSaved.end()) { oldnew[oldId] = mcPartIsSaved[oldId]; @@ -474,13 +534,13 @@ struct McDGCandProducer { } // all particles of the McCollision are saved - for (auto mcpart : McParts) { + for (const auto& mcpart : McParts) { LOGF(debug, " p (%d) %d", mcpart.pdgCode(), mcpart.globalIndex()); if (mcPartIsSaved.find(mcpart.globalIndex()) == mcPartIsSaved.end()) { // mothers newmids.clear(); auto oldmids = mcpart.mothersIds(); - for (auto oldmid : oldmids) { + for (const auto& oldmid : oldmids) { auto m = McParts.rawIteratorAt(oldmid); LOGF(debug, " m %d", m.globalIndex()); if (mcPartIsSaved.find(oldmid) != mcPartIsSaved.end()) { @@ -549,7 +609,7 @@ struct McDGCandProducer { void updateUDMcTrackLabels(TTrack const& udtracks, std::map& mcPartIsSaved) { // loop over all tracks - for (auto udtrack : udtracks) { + for (const auto& udtrack : udtracks) { // udtrack (UDTCs) -> track (TCs) -> mcTrack (McParticles) -> udMcTrack (UDMcParticles) auto trackId = udtrack.trackId(); if (trackId >= 0) { @@ -586,9 +646,9 @@ struct McDGCandProducer { UDCCs const& dgcands, UDTCs const& udtracks, CCs const& /*collisions*/, BCs const& /*bcs*/, TCs const& /*tracks*/) { - LOGF(info, "Number of McCollisions %d", mccols.size()); - LOGF(info, "Number of DG candidates %d", dgcands.size()); - LOGF(info, "Number of UD tracks %d", udtracks.size()); + LOGF(debug, "Number of McCollisions %d", mccols.size()); + LOGF(debug, "Number of DG candidates %d", dgcands.size()); + LOGF(debug, "Number of UD tracks %d", udtracks.size()); if (dgcands.size() <= 0) { LOGF(info, "No DG candidates to save!"); return; @@ -675,12 +735,17 @@ struct McDGCandProducer { // update UDMcParticles and UDMcTrackLabels (for each UDTrack -> UDMcParticles) // loop over tracks of dgcand - for (auto dgtrack : dgTracks) { + for (const auto& dgtrack : dgTracks) { if (dgtrack.has_track()) { auto track = dgtrack.track_as(); if (track.has_mcParticle()) { auto mcPart = track.mcParticle(); - updateUDMcParticle(mcPart, -1, mcPartIsSaved); + auto mcCol = mcPart.mcCollision(); + if (mcColIsSaved.find(mcCol.globalIndex()) == mcColIsSaved.end()) { + updateUDMcCollisions(mcCol); + mcColIsSaved[mcCol.globalIndex()] = outputMcCollisions.lastIndex(); + } + updateUDMcParticle(mcPart, mcColIsSaved[mcCol.globalIndex()], mcPartIsSaved); updateUDMcTrackLabel(dgtrack, mcPartIsSaved); } else { outputMcTrackLabels(-1, track.mcMask()); diff --git a/PWGUD/TableProducer/SGCandProducer.cxx b/PWGUD/TableProducer/SGCandProducer.cxx index 424e7d44b7f..bbded07d3f6 100644 --- a/PWGUD/TableProducer/SGCandProducer.cxx +++ b/PWGUD/TableProducer/SGCandProducer.cxx @@ -620,7 +620,12 @@ struct McSGCandProducer { auto track = sgtrack.track_as(); if (track.has_mcParticle()) { auto mcPart = track.mcParticle(); - updateUDMcParticle(mcPart, -1, mcPartIsSaved); + auto mcCol = mcPart.mcCollision(); + if (mcColIsSaved.find(mcCol.globalIndex()) == mcColIsSaved.end()) { + updateUDMcCollisions(mcCol, mcCol.bc_as().globalBC()); + mcColIsSaved[mcCol.globalIndex()] = outputMcCollisions.lastIndex(); + } + updateUDMcParticle(mcPart, mcColIsSaved[mcCol.globalIndex()], mcPartIsSaved); updateUDMcTrackLabel(sgtrack, mcPartIsSaved); } else { outputMcTrackLabels(-1, track.mcMask()); diff --git a/PWGUD/Tasks/CMakeLists.txt b/PWGUD/Tasks/CMakeLists.txt index e5468e6829f..3e31bfe9b0c 100644 --- a/PWGUD/Tasks/CMakeLists.txt +++ b/PWGUD/Tasks/CMakeLists.txt @@ -232,4 +232,9 @@ o2physics_add_dpl_workflow(upc-quarkonia-central-barrel o2physics_add_dpl_workflow(test-mc-std-tabs-rl SOURCES testMCstdTabsRL.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::ReconstructionDataFormats O2::DetectorsBase O2::DetectorsCommonDataFormats - COMPONENT_NAME Analysis) \ No newline at end of file + COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(decaytree-analyzer + SOURCES decayTreeAnalyzer.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::UDGoodRunSelector O2Physics::decayTree + COMPONENT_NAME Analysis) diff --git a/PWGUD/Tasks/decayTreeAnalyzer.cxx b/PWGUD/Tasks/decayTreeAnalyzer.cxx new file mode 100644 index 00000000000..c725a2ca72a --- /dev/null +++ b/PWGUD/Tasks/decayTreeAnalyzer.cxx @@ -0,0 +1,143 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +// +// \brief Analyses UD tables (DGCandidates, DGTracks) of DG candidates produced with DGCandProducer +// \author Paul Buehler, paul.buehler@oeaw.ac.at +// \since 01.03.2024 + +#include + +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" + +#include "CCDB/BasicCCDBManager.h" +#include "DataFormatsParameters/GRPLHCIFData.h" +#include "CommonConstants/LHCConstants.h" +#include "PWGUD/DataModel/UDTables.h" +#include "PWGUD/Core/UDHelpers.h" +#include "PWGUD/Core/UDGoodRunSelector.h" +#include "PWGUD/Core/decayTree.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +struct decayTreeAnalyzer { + + // ccdb + Service ccdb; + int lastRun = -1; // last run number (needed to access ccdb only if run!=lastRun) + std::bitset bcPatternB; // bc pattern of colliding bunches + + // goodRun selector + Configurable goodRunsFile{"goodRunsFile", {}, "json with list of good runs"}; + UDGoodRunSelector grsel = UDGoodRunSelector(); + + // decay tree object + Configurable parsFile{"parsFile", {}, "json with parameters"}; + decayTree decTree = decayTree(); + + // initialize histogram registry + HistogramRegistry registry{ + "registry", + {}}; + + void init(InitContext&) + { + // goodRun selector + grsel.init(goodRunsFile); + grsel.Print(); + + // decay tree object + decTree.init(parsFile, registry); + decTree.Print(); + } + + using UDCollisionsFull = soa::Join; + using UDCollisionFull = UDCollisionsFull::iterator; + using UDTracksFull = soa::Join; + + // PV contributors + Filter PVContributorFilter = aod::udtrack::isPVContributor == true; + using PVTracks = soa::Filtered; + + void process(UDCollisionFull const& dgcand, UDTracksFull const& dgtracks, PVTracks const& PVContributors) + { + + // accept only selected run numbers + int run = dgcand.runNumber(); + if (!grsel.isGoodRun(run)) { + return; + } + + // extract bc pattern from CCDB for data or anchored MC only + if (run != lastRun && run >= 500000) { + LOGF(info, "Updating bcPattern %d ...", run); + auto tss = ccdb->getRunDuration(run); + auto grplhcif = ccdb->getForTimeStamp("GLO/Config/GRPLHCIF", tss.first); + bcPatternB = grplhcif->getBunchFilling().getBCPattern(); + lastRun = run; + } + + // is BB bunch? + auto bcnum = dgcand.globalBC(); + if (run >= 500000 && bcPatternB[bcnum % o2::constants::lhc::LHCMaxBunches] == 0) { + LOGF(debug, "bcnum[1] %d is not a BB BC", bcnum % o2::constants::lhc::LHCMaxBunches); + return; + } + + // check FIT information + auto bitMin = decTree.dBCRange()[0] + 16; + auto bitMax = decTree.dBCRange()[1] + 16; + for (auto bit = bitMin; bit <= bitMax; bit++) { + if (decTree.FITvetos()[0] && TESTBIT(dgcand.bbFV0Apf(), bit)) + return; + if (decTree.FITvetos()[1] && TESTBIT(dgcand.bbFT0Apf(), bit)) + return; + if (decTree.FITvetos()[2] && TESTBIT(dgcand.bbFT0Cpf(), bit)) + return; + if (decTree.FITvetos()[3] && TESTBIT(dgcand.bbFDDApf(), bit)) + return; + if (decTree.FITvetos()[4] && TESTBIT(dgcand.bbFDDCpf(), bit)) + return; + } + + // check number of PV contributors + if (dgcand.numContrib() != PVContributors.size()) { + LOGF(info, "Missmatch of PVContributors %d != %d", dgcand.numContrib(), PVContributors.size()); + } + auto nTrackRange = decTree.ntrackRange(); + if (dgcand.numContrib() < nTrackRange[0] || dgcand.numContrib() > nTrackRange[1]) { + LOGF(debug, "Rejected 1: %d not in range [%d, %d].", dgcand.numContrib(), nTrackRange[0], nTrackRange[1]); + return; + } + + // skip events with out-of-range rgtrwTOF + auto rtrwTOF = udhelpers::rPVtrwTOF(dgtracks, PVContributors.size()); + auto minRgtrwTOF = decTree.rgtrTOFMin(); + if (rtrwTOF < minRgtrwTOF) { + LOGF(debug, "Rejected 3: %f below threshold of %f.", rtrwTOF, minRgtrwTOF); + return; + } + + // compute the decay tree + LOGF(debug, "BC %d", dgcand.globalBC()); + decayTreeResType results = decTree.processTree(PVContributors); + // decTree.fillHistograms(results, PVContributors); + } +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc, TaskName{"decaytree-analyzer"}), + }; +} diff --git a/PWGUD/Tasks/dgCandAnalyzer.cxx b/PWGUD/Tasks/dgCandAnalyzer.cxx index 90d4bd8e011..93c62c567d5 100644 --- a/PWGUD/Tasks/dgCandAnalyzer.cxx +++ b/PWGUD/Tasks/dgCandAnalyzer.cxx @@ -14,6 +14,8 @@ // \since 06.06.2022 #include +#include + #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -277,8 +279,6 @@ struct DGCandAnalyzer { registry.fill(HIST("FIT/FDDCAmplitude"), dgcand.totalFDDAmplitudeC(), 1.); // skip events with too few/many tracks - // Partition PVContributors = aod::udtrack::isPVContributor == true; - // PVContributors.bindTable(dgtracks); if (dgcand.numContrib() != PVContributors.size()) { LOGF(info, "Missmatch of PVContributors %d != %d", dgcand.numContrib(), PVContributors.size()); } diff --git a/Tutorials/PWGUD/CMakeLists.txt b/Tutorials/PWGUD/CMakeLists.txt index de978b518dc..1be9c2f6815 100644 --- a/Tutorials/PWGUD/CMakeLists.txt +++ b/Tutorials/PWGUD/CMakeLists.txt @@ -53,7 +53,3 @@ o2physics_add_dpl_workflow(udtutorial-07 SOURCES UDTutorial_07.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore COMPONENT_NAME Analysis) - - - - From 1c7b1d7ba6dfb41fac05be0347454f8fbf660036 Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Sun, 16 Feb 2025 19:21:21 +0100 Subject: [PATCH 0253/1650] [Common] Further changes to QA task (#9992) Co-authored-by: ALICE Builder --- Common/Tasks/flowTest.cxx | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/Common/Tasks/flowTest.cxx b/Common/Tasks/flowTest.cxx index 1a0c93ef7ee..04e404d4f33 100644 --- a/Common/Tasks/flowTest.cxx +++ b/Common/Tasks/flowTest.cxx @@ -54,10 +54,14 @@ struct flowTest { void init(InitContext&) { - // pT histograms + // QA and detailed studies histos.add("hImpactParameter", "hImpactParameter", HistType::kTH1D, {axisB}); histos.add("hNchVsImpactParameter", "hNchVsImpactParameter", HistType::kTH2D, {axisB, axisNch}); histos.add("hEventPlaneAngle", "hEventPlaneAngle", HistType::kTH1D, {axisPhi}); + histos.add("hTrackPhiVsEventPlaneAngle", "hTrackPhiVsEventPlaneAngle", HistType::kTH2D, {axisPhi, axisPhi}); + histos.add("hTrackDeltaPhiVsEventPlaneAngle", "hTrackDeltaPhiVsEventPlaneAngle", HistType::kTH2D, {axisPhi, axisPhi}); + + // analysis histos.add("hPtVsPhiGenerated", "hPtVsPhiGenerated", HistType::kTH2D, {axisPhi, axisPt}); histos.add("hPtVsPhiGlobal", "hPtVsPhiGlobal", HistType::kTH2D, {axisPhi, axisPt}); histos.add("hBVsPtVsPhiGenerated", "hBVsPtVsPhiGenerated", HistType::kTH3D, {axisB, axisPhi, axisPt}); @@ -83,9 +87,10 @@ struct flowTest { histos.add("hBVsPtVsPhiGlobalOmega", "hBVsPtVsPhiGlobalOmega", HistType::kTH3D, {axisB, axisPhi, axisPt}); } - using recoTracks = soa::Join; + using recoTracks = soa::Join; + using recoTracksWithLabels = soa::Join; - void process(aod::McCollision const& mcCollision, soa::Join const& mcParticles, recoTracks const&) + void process(aod::McCollision const& mcCollision, soa::Join const& mcParticles, recoTracksWithLabels const&) { float imp = mcCollision.impactParameter(); @@ -118,6 +123,9 @@ struct flowTest { deltaPhi += 2. * TMath::Pi(); if (deltaPhi > 2. * TMath::Pi()) deltaPhi -= 2. * TMath::Pi(); + + histos.fill(HIST("hTrackDeltaPhiVsEventPlaneAngle"), evPhi, deltaPhi); + histos.fill(HIST("hTrackPhiVsEventPlaneAngle"), evPhi, mcParticle.phi()); histos.fill(HIST("hPtVsPhiGenerated"), deltaPhi, mcParticle.pt()); histos.fill(HIST("hBVsPtVsPhiGenerated"), imp, deltaPhi, mcParticle.pt()); @@ -134,7 +142,7 @@ struct flowTest { bool validAnalysisTrack = false; bool validAnalysisTrackFake = false; if (mcParticle.has_tracks()) { - auto const& tracks = mcParticle.tracks_as(); + auto const& tracks = mcParticle.tracks_as(); for (auto const& track : tracks) { bool isITSFake = false; From cce3aaeb9e628a4f79a94b46776d85175014cb1e Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Sun, 16 Feb 2025 21:01:50 +0100 Subject: [PATCH 0254/1650] [PWGLF] chk892Fliow - Hot fix for resolution in SC method (#9995) --- PWGLF/Tasks/Resonances/chk892Flow.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PWGLF/Tasks/Resonances/chk892Flow.cxx b/PWGLF/Tasks/Resonances/chk892Flow.cxx index f8180f073e3..79414bae1a5 100644 --- a/PWGLF/Tasks/Resonances/chk892Flow.cxx +++ b/PWGLF/Tasks/Resonances/chk892Flow.cxx @@ -723,9 +723,9 @@ struct Chk892Flow { histos.fill(HIST("QA/EP/hEPResBC"), lCentrality, lEPResBC); // Scalar product method if (cfgUseScalProduct) { - double lEPSPResAB = collision.qvecRe()[lQvecDetInd] * collision.qvecRe()[lQvecRefAInd] + collision.qvecIm()[lQvecDetInd] * collision.qvecIm()[lQvecRefAInd] * lEPResAB; - double lEPSPResAC = collision.qvecRe()[lQvecDetInd] * collision.qvecRe()[lQvecRefBInd] + collision.qvecIm()[lQvecDetInd] * collision.qvecIm()[lQvecRefBInd] * lEPResAC; - double lEPSPResBC = collision.qvecRe()[lQvecRefAInd] * collision.qvecRe()[lQvecRefBInd] + collision.qvecIm()[lQvecRefAInd] * collision.qvecIm()[lQvecRefBInd] * lEPResBC; + double lEPSPResAB = (collision.qvecRe()[lQvecDetInd] * collision.qvecRe()[lQvecRefAInd] + collision.qvecIm()[lQvecDetInd] * collision.qvecIm()[lQvecRefAInd]) * lEPResAB; + double lEPSPResAC = (collision.qvecRe()[lQvecDetInd] * collision.qvecRe()[lQvecRefBInd] + collision.qvecIm()[lQvecDetInd] * collision.qvecIm()[lQvecRefBInd]) * lEPResAC; + double lEPSPResBC = (collision.qvecRe()[lQvecRefAInd] * collision.qvecRe()[lQvecRefBInd] + collision.qvecIm()[lQvecRefAInd] * collision.qvecIm()[lQvecRefBInd]) * lEPResBC; histos.fill(HIST("QA/EP/hEPSPResAB"), lCentrality, lEPSPResAB); histos.fill(HIST("QA/EP/hEPSPResAC"), lCentrality, lEPSPResAC); From 4e6ffd6b3c934a38793b3372904b504c115d567b Mon Sep 17 00:00:00 2001 From: mcoquet642 <74600025+mcoquet642@users.noreply.github.com> Date: Sun, 16 Feb 2025 23:18:34 +0100 Subject: [PATCH 0255/1650] [PWGDQ] [PWGDQ] Fixing fill of dimuon multiplicity for event mixing (#9973) Co-authored-by: Maurice Coquet --- PWGDQ/Tasks/tableReader.cxx | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/PWGDQ/Tasks/tableReader.cxx b/PWGDQ/Tasks/tableReader.cxx index ac276daca09..04f5a3c6717 100644 --- a/PWGDQ/Tasks/tableReader.cxx +++ b/PWGDQ/Tasks/tableReader.cxx @@ -776,7 +776,23 @@ struct AnalysisEventMixing { } uint32_t twoTrackFilter = 0; - uint32_t mult_dimuons = 0; + + if (fConfigSingleMuCumulants) { + uint32_t mult_dimuons = 0; + for (auto& track1 : tracks1) { + for (auto& track2 : tracks2) { + if constexpr (TPairType == VarManager::kDecayToMuMu) { + twoTrackFilter = static_cast(track1.isMuonSelected()) & static_cast(track2.isMuonSelected()) & fTwoMuonFilterMask; + } + if (twoTrackFilter && track1.sign() * track2.sign() < 0) { + mult_dimuons++; + } + } // end for (track2) + } // end for (track1) + VarManager::fgValues[VarManager::kMultDimuonsME] = mult_dimuons; + } + + twoTrackFilter = 0; for (auto& track1 : tracks1) { for (auto& track2 : tracks2) { if constexpr (TPairType == VarManager::kDecayToEE) { @@ -800,7 +816,6 @@ struct AnalysisEventMixing { for (unsigned int icut = 0; icut < ncuts; icut++) { if (twoTrackFilter & (static_cast(1) << icut)) { if (track1.sign() * track2.sign() < 0) { - mult_dimuons++; fHistMan->FillHistClass(histNames[icut][0].Data(), VarManager::fgValues); if (fConfigAmbiguousHist && !(track1.isAmbiguous() || track2.isAmbiguous())) { fHistMan->FillHistClass(Form("%s_unambiguous", histNames[icut][0].Data()), VarManager::fgValues); @@ -822,7 +837,6 @@ struct AnalysisEventMixing { } // end for (cuts) } // end for (track2) } // end for (track1) - VarManager::fgValues[VarManager::kMultDimuonsME] = mult_dimuons; } // barrel-barrel and muon-muon event mixing From 6d8010808be47534be39ea04e06eb3f571dff2f9 Mon Sep 17 00:00:00 2001 From: Tanu Gahlaut <154991749+TGahlaut1@users.noreply.github.com> Date: Mon, 17 Feb 2025 04:28:24 +0530 Subject: [PATCH 0256/1650] [PWGCF] Add pT and rap dependent efficiency correction for identified particles (#9996) --- PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx | 473 +++++++++--------- 1 file changed, 246 insertions(+), 227 deletions(-) diff --git a/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx b/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx index 6cf50aebc16..da9f23818d1 100644 --- a/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx @@ -73,7 +73,9 @@ struct MeanPtFlucId { Configurable cfgRun3{"cfgRun3", true, ""}; Configurable cfgRun2{"cfgRun2", false, ""}; Configurable cfgCorrection{"cfgCorrection", true, "Efficiency Correction"}; - Configurable cfgCorrectionPtEta{"cfgCorrectionPtEta", false, "Efficiency Correction for pT and eta"}; + Configurable cfgCorrectionPID{"cfgCorrectionPID", true, "ID particles Efficiency Correction"}; + Configurable cfgCorrectionPtRap{"cfgCorrectionPtRap", false, "Efficiency Correction for pT and eta"}; + Configurable cfgCorrectionPtRapPID{"cfgCorrectionPtRapPID", false, "ID particles Efficiency Correction for pT and eta"}; Configurable cfgPidCut{"cfgPidCut", false, ""}; Configurable cfgPDGCodeOnly{"cfgPDGCodeOnly", true, ""}; Configurable cfgMCReco{"cfgMCReco", false, ""}; @@ -94,7 +96,7 @@ struct MeanPtFlucId { Configurable cfgSelLow{"cfgSelLow", true, "PID selection cut for Low momentum"}; Configurable cfgSelHigh{"cfgSelHigh", true, "PID selection cut for High momentum"}; ConfigurableAxis multTPCBins{"multTPCBins", {150, 0, 150}, "TPC Multiplicity bins"}; - ConfigurableAxis multFT0MBins{"multFT0MBins", {400, 0, 4000}, "Forward Multiplicity bins"}; + ConfigurableAxis multFT0MBins{"multFT0MBins", {1000, 0, 5000}, "Forward Multiplicity bins"}; ConfigurableAxis multFT0MMCBins{"multFT0MMCBins", {250, 0, 250}, "Forward Multiplicity bins"}; ConfigurableAxis dcaXYBins{"dcaXYBins", {100, -0.15, 0.15}, "dcaXY bins"}; ConfigurableAxis dcaZBins{"dcaZBins", {100, -1.2, 1.2}, "dcaZ bins"}; @@ -102,15 +104,15 @@ struct MeanPtFlucId { ConfigurableAxis tpNBins{"tpNBins", {300, 0., 3000.}, ""}; ConfigurableAxis tpDBins{"tpDBins", {100, 0., 2000.}, ""}; Configurable> ptBins{"ptBins", {0.15, 0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50, 0.55, 0.60, 0.65, 0.70, 0.75, 0.80, 0.85, 0.90, 0.95, 1.00, 1.05, 1.10, 1.15, 1.20, 1.25, 1.30, 1.35, 1.40, 1.45, 1.50, 1.55, 1.60, 1.65, 1.70, 1.75, 1.80, 1.85, 1.90, 1.95, 2.00}, "p_{T} bins"}; - Configurable> etaBins{"etaBins", {-0.8, -0.7, -0.6, -0.5, -0.4, -0.3, -0.2, -0.1, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8}, "#eta bins"}; - Configurable> rapBins{"rapBins", {-0.6, -0.5, -0.4, -0.3, -0.2, -0.1, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6}, "#rap bins"}; + Configurable> etaBins{"etaBins", {-0.8, -0.75, -0.7, -0.65, -0.6, -0.55, -0.5, -0.45, -0.4, -0.35, -0.3, -0.25, -0.2, -0.15, -0.1, -0.05, 0.0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8}, "#eta bins"}; + Configurable> rapBins{"rapBins", {-0.6, -0.55, -0.5, -0.45, -0.4, -0.35, -0.3, -0.25, -0.2, -0.15, -0.1, -0.05, 0.0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6}, "#rap bins"}; Configurable> effValuesCh{"effValuesCh", {0, 0.429014, 0.487349, 0.491862, 0.487173, 0.493464, 0.502531, 0.510066, 0.517214, 0.524902, 0.529725, 0.537065, 0.542265, 0.546103, 0.549713, 0.555139, 0.55158, 0.562156, 0.563038, 0.568055, 0.570847, 0.580461, 0.580406, 0.585776, 0.587068, 0.598144, 0.590378, 0.609363, 0.607307, 0.604931, 0.6011, 0.593467, 0.61525, 0.61393, 0.61495, 0.610359, 0.622616}, "effeciency values for Charged Particles"}; Configurable> effPtValuesPi{"effPtValuesPi", {0, 0.408075, 0.473332, 0.48221, 0.469699, 0.472676, 0.482403, 0.478351, 0.38468, 0.249696, 0.244316, 0.235498, 0.236493, 0.241719, 0.245363, 0.248324, 0.251595, 0.254327, 0.257727, 0.260208, 0.263414, 0.267699, 0.270322, 0.275128, 0.280835, 0.284328, 0.288791, 0.294786, 0.292418, 0.299766, 0.299413, 0.301257, 0.305466, 0.304929, 0.316837, 0.317915, 0.316018}, "effeciency values for Pions"}; - Configurable> effPtEtaValuesPi{"effPtEtaValuesPi", {0, 0, 0, 0.400058, 0.469632, 0.481628, 0.470343, 0.479434, 0.485532, 0.399748, 0.252337, 0.242448, 0.238033, 0.241385, 0.247947, 0.251316, 0.253647, 0.259705, 0.26139, 0.26566, 0.270122, 0.273559, 0.281532, 0.28531, 0.290786, 0.296129, 0.298688, 0.302411, 0.304526, 0.309276, 0.310814, 0.319945, 0.322188, 0.323646, 0.333198, 0.342838, 0.349902, 0.349663, 0.357027, 0.361007, 0.361765, 0.366801, 0.369578, 0.369184, 0.375378, 0.392854, 0.381762, 0.393439, 0.40179, 0.388955}, "pT eta effeciency values for Pions"}; - Configurable> effPtValuesKa{"effPtValuesKa", {0, 0, 0, 0.312144, 0.369847, 0.38878, 0.413275, 0.393619, 0.315429, 0.1375, 0.146659, 0.147163, 0.155197, 0.163588, 0.168412, 0.177936, 0.17782, 0.186872, 0.190744, 0.199436, 0.197739, 0.192307, 0.198484, 0.19927, 0.218019, 0.221942, 0.237642, 0.235765, 0.249873, 0.251034, 0.259014, 0.268821, 0.275786, 0.280998, 0.29936, 0.304559, 0.312684}, " effeciency values for Kaons"}; - Configurable> effPtEtaValuesKa{"effPtEtaValuesKa", {0, 0, 0, 0.400058, 0.469632, 0.481628, 0.470343, 0.479434, 0.485532, 0.399748, 0.252337, 0.242448, 0.238033, 0.241385, 0.247947, 0.251316, 0.253647, 0.259705, 0.26139, 0.26566, 0.270122, 0.273559, 0.281532, 0.28531, 0.290786, 0.296129, 0.298688, 0.302411, 0.304526, 0.309276, 0.310814, 0.319945, 0.322188, 0.323646, 0.333198, 0.342838, 0.349902, 0.349663, 0.357027, 0.361007, 0.361765, 0.366801, 0.369578, 0.369184, 0.375378, 0.392854, 0.381762, 0.393439, 0.40179, 0.388955}, "pT eta effeciency values for Kaons"}; - Configurable> effPtValuesPr{"effPtValuesPr", {0, 0, 0, 0, 0, 0, 0, 0.394712, 0.425251, 0.458426, 0.489121, 0.509505, 0.516103, 0.517117, 0.491584, 0.450721, 0.379836, 0.253402, 0.257575, 0.261382, 0.260373, 0.269008, 0.266811, 0.265011, 0.272768, 0.269553, 0.276003, 0.279878, 0.284216, 0.276346, 0.293437, 0.294727, 0.281017, 0.287609, 0.292402, 0.28614, 0.307208}, "effeciency values for Protons"}; - Configurable> effPtEtaValuesPr{"effPtEtaValuesPr", {0, 0, 0, 0, 0, 0, 0, 0, 0.393911, 0.422401, 0.462856, 0.498792, 0.512802, 0.518289, 0.495488, 0.448937, 0.331976, 0.256772, 0.26324, 0.265401, 0.270093, 0.273197, 0.27106, 0.277618, 0.276226, 0.28206, 0.289245, 0.285692, 0.29644, 0.282871, 0.28963, 0.29263, 0.29947, 0.30137, 0.311748, 0.326481, 0.321903, 0.334281, 0.342607, 0.374238, 0.356596, 0.398134, 0.386997, 0.382202, 0.390039, 0.390761, 0.4034, 0.4193, 0.405995, 0.408471}, "pT eta effeciency values for Protons"}; + Configurable> effPtRapValuesPi{"effPtRapValuesPi", {0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5520, 0.5331, 0.5201, 0.5140, 0.5135, 0.5271, 0.4378, 0.2341, 0.2668, 0.2606, 0.2484, 0.2553, 0.2533, 0.2606, 0.2621, 0.2645, 0.2651, 0.2785, 0.2767, 0.2867, 0.2927, 0.2862, 0.3046, 0.3050, 0.3078, 0.3025, 0.3156, 0.2991, 0.3137, 0.3093, 0.3210, 0.3300, 0.3207, 0.3356, 0.3495, 0.3475, 0.0000, 0.5487, 0.5299, 0.5228, 0.5152, 0.5165, 0.5260, 0.5123, 0.2426, 0.2604, 0.2523, 0.2404, 0.2459, 0.2472, 0.2482, 0.2519, 0.2541, 0.2563, 0.2577, 0.2620, 0.2598, 0.2636, 0.2791, 0.2770, 0.2866, 0.2798, 0.2887, 0.2969, 0.3003, 0.2947, 0.2927, 0.2917, 0.3183, 0.3067, 0.3099, 0.3234, 0.3285, 0.0000, 0.5350, 0.5276, 0.5192, 0.5150, 0.5209, 0.5296, 0.5339, 0.2891, 0.2645, 0.2591, 0.2535, 0.2577, 0.2597, 0.2652, 0.2697, 0.2695, 0.2754, 0.2892, 0.2815, 0.2849, 0.2885, 0.2946, 0.3080, 0.3094, 0.3208, 0.3174, 0.3211, 0.3239, 0.3231, 0.3332, 0.3319, 0.3381, 0.3369, 0.3325, 0.3442, 0.3663, 0.0000, 0.4808, 0.5197, 0.5194, 0.5159, 0.5217, 0.5304, 0.5366, 0.3708, 0.2952, 0.2832, 0.2743, 0.2762, 0.2824, 0.2870, 0.2895, 0.2874, 0.2922, 0.2953, 0.2996, 0.3024, 0.3084, 0.3159, 0.3138, 0.3305, 0.3309, 0.3366, 0.3340, 0.3404, 0.3292, 0.3403, 0.3279, 0.3486, 0.3729, 0.3447, 0.3603, 0.3566, 0.0000, 0.4303, 0.5043, 0.5166, 0.5174, 0.5203, 0.5282, 0.5341, 0.4151, 0.2868, 0.2790, 0.2662, 0.2682, 0.2718, 0.2771, 0.2761, 0.2790, 0.2824, 0.2820, 0.2873, 0.2869, 0.2835, 0.2888, 0.3004, 0.3002, 0.3143, 0.3159, 0.3056, 0.3083, 0.3197, 0.3315, 0.3146, 0.3280, 0.3207, 0.3138, 0.3467, 0.3454, 0.0000, 0.4125, 0.4794, 0.5124, 0.5108, 0.5186, 0.5265, 0.5342, 0.4518, 0.2585, 0.2503, 0.2408, 0.2399, 0.2449, 0.2506, 0.2588, 0.2568, 0.2575, 0.2597, 0.2636, 0.2693, 0.2664, 0.2763, 0.2773, 0.2808, 0.2902, 0.2899, 0.2872, 0.2968, 0.3056, 0.2918, 0.3007, 0.3048, 0.3077, 0.3041, 0.2981, 0.3222, 0.0000, 0.4042, 0.4703, 0.5100, 0.5087, 0.5131, 0.5238, 0.5280, 0.4796, 0.2243, 0.2254, 0.2157, 0.2245, 0.2249, 0.2374, 0.2325, 0.2372, 0.2463, 0.2433, 0.2444, 0.2506, 0.2525, 0.2526, 0.2661, 0.2605, 0.2831, 0.2841, 0.2878, 0.2874, 0.2964, 0.2937, 0.3050, 0.3100, 0.2976, 0.3073, 0.3083, 0.3122, 0.0000, 0.4036, 0.4928, 0.5121, 0.4988, 0.5041, 0.5162, 0.5238, 0.5000, 0.2092, 0.2117, 0.1977, 0.2032, 0.2100, 0.2097, 0.2180, 0.2140, 0.2196, 0.2170, 0.2174, 0.2269, 0.2259, 0.2318, 0.2318, 0.2415, 0.2447, 0.2391, 0.2604, 0.2516, 0.2619, 0.2569, 0.2600, 0.2573, 0.2637, 0.2717, 0.2740, 0.2681, 0.0000, 0.3452, 0.4427, 0.4595, 0.4499, 0.4631, 0.4782, 0.4818, 0.4794, 0.1810, 0.1763, 0.1678, 0.1683, 0.1725, 0.1760, 0.1765, 0.1788, 0.1778, 0.1792, 0.1834, 0.1799, 0.1872, 0.1882, 0.1866, 0.1915, 0.1917, 0.1996, 0.2100, 0.2097, 0.2089, 0.2145, 0.2168, 0.2099, 0.2127, 0.2073, 0.2149, 0.2060, 0.0000, 0.2717, 0.3686, 0.4011, 0.3970, 0.4118, 0.4221, 0.4316, 0.4357, 0.1215, 0.1172, 0.1120, 0.1131, 0.1175, 0.1202, 0.1243, 0.1230, 0.1247, 0.1276, 0.1210, 0.1237, 0.1244, 0.1311, 0.1279, 0.1349, 0.1413, 0.1449, 0.1452, 0.1355, 0.1478, 0.1471, 0.1443, 0.1558, 0.1395, 0.1451, 0.1489, 0.1403, 0.0000, 0.2701, 0.3727, 0.4013, 0.4013, 0.4164, 0.4267, 0.4355, 0.4404, 0.1342, 0.1344, 0.1293, 0.1253, 0.1289, 0.1308, 0.1340, 0.1330, 0.1395, 0.1402, 0.1358, 0.1421, 0.1385, 0.1481, 0.1470, 0.1513, 0.1497, 0.1598, 0.1516, 0.1558, 0.1605, 0.1635, 0.1601, 0.1610, 0.1599, 0.1601, 0.1727, 0.1671, 0.0000, 0.3255, 0.4427, 0.4688, 0.4548, 0.4695, 0.4819, 0.4880, 0.4857, 0.1827, 0.1819, 0.1737, 0.1721, 0.1753, 0.1782, 0.1812, 0.1846, 0.1798, 0.1907, 0.1844, 0.1904, 0.1916, 0.1968, 0.1888, 0.2013, 0.2075, 0.2080, 0.1968, 0.2124, 0.2114, 0.2100, 0.2169, 0.2154, 0.2192, 0.2189, 0.2242, 0.2097, 0.0000, 0.3559, 0.4877, 0.5037, 0.4938, 0.4998, 0.5092, 0.5187, 0.4925, 0.1932, 0.1911, 0.1847, 0.1877, 0.1948, 0.1948, 0.1996, 0.2005, 0.2017, 0.2029, 0.2009, 0.2049, 0.2076, 0.2177, 0.2211, 0.2158, 0.2359, 0.2317, 0.2399, 0.2390, 0.2345, 0.2436, 0.2378, 0.2438, 0.2376, 0.2495, 0.2477, 0.2544, 0.0000, 0.3632, 0.4649, 0.5039, 0.4997, 0.5064, 0.5164, 0.5270, 0.4722, 0.2336, 0.2317, 0.2199, 0.2248, 0.2287, 0.2334, 0.2378, 0.2367, 0.2405, 0.2390, 0.2434, 0.2463, 0.2497, 0.2564, 0.2580, 0.2573, 0.2702, 0.2775, 0.2865, 0.2808, 0.2899, 0.2966, 0.2892, 0.2826, 0.2860, 0.2987, 0.2915, 0.3188, 0.0000, 0.3912, 0.4740, 0.5051, 0.5038, 0.5093, 0.5205, 0.5300, 0.4531, 0.2901, 0.2830, 0.2754, 0.2772, 0.2822, 0.2859, 0.2954, 0.2940, 0.2955, 0.2977, 0.2976, 0.3012, 0.3065, 0.3059, 0.3208, 0.3244, 0.3326, 0.3296, 0.3297, 0.3454, 0.3402, 0.3265, 0.3414, 0.3474, 0.3438, 0.3496, 0.3428, 0.3895, 0.0000, 0.4220, 0.4939, 0.5100, 0.5090, 0.5090, 0.5183, 0.5215, 0.4323, 0.3189, 0.3098, 0.2970, 0.3009, 0.3036, 0.3102, 0.3106, 0.3132, 0.3145, 0.3170, 0.3242, 0.3323, 0.3320, 0.3308, 0.3345, 0.3471, 0.3511, 0.3423, 0.3487, 0.3591, 0.3691, 0.3523, 0.3801, 0.3492, 0.3678, 0.3793, 0.3818, 0.3993, 0.0000, 0.4704, 0.5064, 0.5109, 0.5062, 0.5106, 0.5219, 0.5250, 0.3847, 0.3256, 0.3213, 0.3061, 0.3100, 0.3152, 0.3253, 0.3235, 0.3294, 0.3316, 0.3300, 0.3438, 0.3404, 0.3513, 0.3530, 0.3572, 0.3688, 0.3709, 0.3792, 0.3676, 0.3775, 0.3744, 0.3786, 0.3887, 0.3953, 0.4057, 0.3939, 0.4099, 0.4465, 0.0000, 0.5253, 0.5212, 0.5124, 0.5030, 0.5088, 0.5185, 0.5247, 0.3098, 0.2995, 0.2949, 0.2843, 0.2866, 0.2991, 0.3002, 0.3030, 0.3063, 0.3106, 0.3176, 0.3178, 0.3224, 0.3323, 0.3324, 0.3369, 0.3503, 0.3554, 0.3458, 0.3615, 0.3689, 0.3563, 0.3619, 0.3656, 0.3689, 0.3717, 0.3991, 0.3880, 0.4147, 0.0000, 0.5410, 0.5214, 0.5112, 0.5068, 0.5073, 0.5173, 0.5006, 0.2571, 0.2815, 0.2729, 0.2671, 0.2652, 0.2720, 0.2758, 0.2746, 0.2820, 0.2832, 0.2870, 0.2906, 0.2963, 0.2961, 0.2997, 0.3028, 0.3165, 0.3137, 0.3139, 0.3317, 0.3318, 0.3241, 0.3317, 0.3324, 0.3305, 0.3340, 0.3501, 0.3671, 0.3516, 0.0000, 0.5411, 0.5255, 0.5099, 0.5021, 0.5054, 0.5161, 0.4317, 0.2497, 0.2792, 0.2713, 0.2659, 0.2699, 0.2748, 0.2805, 0.2782, 0.2890, 0.2846, 0.2897, 0.2942, 0.3005, 0.3039, 0.3034, 0.3167, 0.3165, 0.3181, 0.3328, 0.3217, 0.3308, 0.3305, 0.3281, 0.3323, 0.3493, 0.3511, 0.3402, 0.3450, 0.3665, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000}, "pT rap effeciency values for Pions"}; + Configurable> effPtValuesKa{"effPtValuesKa", {0, 0, 0, 0.312144, 0.369847, 0.38878, 0.413275, 0.393619, 0.315429, 0.1375, 0.146659, 0.147163, 0.155197, 0.163588, 0.168412, 0.177936, 0.17782, 0.186872, 0.190744, 0.199436, 0.197739, 0.192307, 0.198484, 0.19927, 0.218019, 0.221942, 0.237642, 0.235765, 0.249873, 0.251034, 0.259014, 0.268821, 0.275786, 0.280998, 0.29936, 0.304559, 0.312684}, "pT eta effeciency values for Kaons"}; + Configurable> effPtRapValuesKa{"effPtRapValuesKa", {0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1711, 0.4322, 0.4572, 0.4474, 0.1392, 0.1648, 0.1836, 0.1891, 0.1732, 0.1794, 0.1778, 0.1914, 0.2058, 0.2122, 0.2190, 0.2180, 0.2156, 0.2448, 0.2679, 0.2626, 0.2984, 0.2953, 0.3137, 0.3228, 0.3696, 0.3786, 0.3517, 0.4040, 0.3901, 0.4604, 0.5460, 0.5458, 0.4860, 0.5755, 0.0000, 0.0000, 0.0000, 0.4031, 0.4326, 0.4559, 0.4946, 0.2264, 0.1289, 0.1516, 0.1633, 0.1679, 0.1906, 0.2048, 0.2132, 0.2183, 0.2247, 0.2651, 0.2572, 0.2406, 0.2365, 0.2701, 0.2525, 0.2643, 0.2806, 0.3142, 0.3317, 0.3364, 0.3298, 0.3212, 0.3564, 0.3873, 0.3982, 0.4500, 0.4643, 0.5220, 0.6104, 0.0000, 0.0000, 0.0000, 0.3993, 0.4172, 0.4474, 0.4974, 0.3636, 0.1374, 0.1723, 0.1809, 0.1743, 0.1815, 0.1985, 0.2034, 0.2150, 0.2187, 0.2393, 0.2346, 0.2479, 0.2409, 0.2599, 0.2530, 0.2897, 0.2897, 0.2922, 0.3214, 0.3364, 0.3855, 0.4070, 0.4153, 0.3828, 0.4269, 0.4225, 0.5101, 0.5487, 0.5465, 0.0000, 0.0000, 0.0000, 0.4002, 0.4271, 0.4676, 0.4789, 0.4990, 0.1447, 0.1659, 0.1784, 0.1734, 0.1930, 0.2012, 0.2124, 0.2340, 0.2522, 0.2673, 0.2594, 0.2609, 0.2565, 0.2824, 0.2783, 0.2727, 0.2953, 0.3379, 0.3473, 0.3603, 0.3743, 0.4059, 0.3903, 0.4152, 0.4254, 0.4361, 0.4638, 0.5754, 0.5599, 0.0000, 0.0000, 0.0000, 0.4020, 0.4132, 0.4547, 0.4768, 0.5111, 0.2441, 0.1760, 0.1872, 0.1925, 0.2073, 0.2169, 0.2318, 0.2329, 0.2453, 0.2519, 0.2538, 0.2599, 0.2565, 0.2559, 0.2720, 0.2844, 0.2968, 0.3048, 0.3230, 0.3233, 0.3402, 0.3664, 0.3795, 0.4017, 0.3661, 0.3992, 0.4338, 0.4848, 0.5206, 0.0000, 0.0000, 0.0000, 0.3770, 0.4073, 0.4435, 0.4825, 0.5040, 0.3451, 0.1814, 0.1806, 0.1758, 0.1899, 0.1964, 0.1949, 0.2105, 0.2144, 0.2261, 0.2461, 0.2451, 0.2293, 0.2176, 0.2297, 0.2395, 0.2615, 0.2716, 0.2832, 0.2936, 0.3194, 0.3466, 0.3317, 0.3598, 0.3355, 0.4052, 0.3900, 0.4260, 0.4737, 0.0000, 0.0000, 0.0000, 0.3688, 0.4227, 0.4245, 0.4550, 0.4903, 0.4048, 0.1576, 0.1597, 0.1740, 0.1776, 0.1911, 0.2010, 0.2130, 0.1963, 0.2356, 0.2175, 0.2320, 0.2517, 0.2136, 0.2220, 0.2380, 0.2635, 0.2890, 0.2978, 0.3152, 0.3344, 0.3124, 0.3439, 0.3770, 0.3441, 0.3936, 0.3892, 0.4360, 0.4348, 0.0000, 0.0000, 0.0000, 0.3585, 0.4101, 0.4185, 0.4567, 0.4896, 0.4543, 0.1239, 0.1382, 0.1451, 0.1523, 0.1614, 0.1722, 0.1873, 0.1906, 0.2008, 0.2057, 0.2276, 0.2153, 0.1922, 0.2014, 0.2141, 0.2305, 0.2502, 0.2477, 0.2940, 0.2962, 0.2987, 0.3237, 0.3023, 0.3161, 0.3414, 0.3568, 0.3466, 0.3992, 0.0000, 0.0000, 0.0000, 0.3535, 0.3858, 0.3940, 0.4202, 0.4460, 0.4512, 0.1152, 0.1319, 0.1280, 0.1366, 0.1450, 0.1519, 0.1673, 0.1597, 0.1797, 0.1727, 0.1865, 0.1909, 0.1746, 0.1674, 0.1788, 0.1923, 0.2043, 0.2303, 0.2264, 0.2317, 0.2345, 0.2547, 0.2597, 0.2948, 0.3002, 0.2719, 0.3049, 0.2998, 0.0000, 0.0000, 0.0000, 0.2898, 0.3194, 0.3320, 0.3707, 0.3963, 0.4181, 0.0748, 0.0840, 0.0799, 0.0835, 0.0968, 0.0985, 0.1080, 0.1054, 0.1080, 0.1286, 0.1336, 0.1204, 0.1228, 0.1232, 0.1261, 0.1495, 0.1487, 0.1535, 0.1564, 0.1631, 0.1768, 0.1956, 0.1909, 0.1957, 0.1873, 0.2248, 0.2199, 0.2283, 0.0000, 0.0000, 0.0000, 0.1413, 0.1521, 0.1386, 0.1263, 0.1148, 0.1107, 0.0205, 0.0212, 0.0217, 0.0234, 0.0245, 0.0235, 0.0265, 0.0263, 0.0262, 0.0308, 0.0299, 0.0331, 0.0280, 0.0296, 0.0291, 0.0286, 0.0337, 0.0370, 0.0326, 0.0355, 0.0382, 0.0408, 0.0384, 0.0408, 0.0433, 0.0463, 0.0443, 0.0464, 0.0000, 0.0000, 0.0000, 0.3353, 0.3807, 0.3944, 0.4307, 0.4725, 0.4790, 0.1181, 0.1269, 0.1314, 0.1350, 0.1546, 0.1514, 0.1554, 0.1507, 0.1604, 0.1682, 0.1766, 0.1862, 0.1731, 0.1818, 0.1945, 0.2096, 0.2152, 0.2253, 0.2221, 0.2372, 0.2559, 0.2340, 0.2753, 0.2901, 0.2818, 0.2684, 0.2700, 0.3042, 0.0000, 0.0000, 0.0000, 0.3494, 0.4016, 0.4101, 0.4368, 0.4755, 0.4433, 0.1166, 0.1291, 0.1342, 0.1404, 0.1585, 0.1586, 0.1631, 0.1759, 0.1788, 0.1769, 0.2053, 0.2112, 0.1885, 0.1921, 0.2021, 0.2006, 0.2387, 0.2434, 0.2547, 0.2705, 0.2690, 0.2966, 0.2698, 0.2877, 0.3023, 0.3092, 0.3123, 0.3627, 0.0000, 0.0000, 0.0000, 0.3515, 0.4035, 0.4132, 0.4501, 0.4755, 0.3929, 0.1655, 0.1738, 0.1867, 0.1915, 0.2132, 0.2122, 0.2105, 0.2303, 0.2302, 0.2343, 0.2467, 0.2437, 0.2364, 0.2472, 0.2688, 0.2485, 0.2821, 0.3039, 0.3322, 0.3020, 0.3388, 0.3728, 0.3620, 0.3690, 0.3572, 0.4131, 0.4549, 0.4871, 0.0000, 0.0000, 0.0000, 0.3803, 0.4282, 0.4350, 0.4591, 0.4858, 0.3540, 0.1968, 0.2057, 0.2057, 0.2208, 0.2226, 0.2314, 0.2284, 0.2425, 0.2542, 0.2500, 0.2618, 0.2562, 0.2512, 0.2674, 0.2827, 0.3082, 0.2932, 0.3296, 0.3233, 0.3689, 0.3794, 0.4202, 0.4337, 0.4032, 0.4574, 0.4255, 0.4487, 0.6078, 0.0000, 0.0000, 0.0000, 0.3940, 0.4184, 0.4363, 0.4688, 0.5184, 0.2523, 0.1979, 0.2038, 0.2260, 0.2290, 0.2466, 0.2631, 0.2637, 0.2640, 0.2802, 0.3055, 0.3082, 0.2831, 0.2731, 0.2934, 0.2987, 0.3306, 0.3460, 0.3697, 0.3769, 0.3792, 0.4081, 0.4194, 0.4079, 0.4766, 0.4226, 0.4606, 0.5413, 0.5926, 0.0000, 0.0000, 0.0000, 0.4037, 0.4264, 0.4461, 0.4638, 0.4895, 0.1648, 0.1881, 0.1862, 0.1997, 0.2273, 0.2403, 0.2347, 0.2588, 0.2769, 0.2900, 0.3019, 0.3046, 0.2762, 0.2977, 0.3163, 0.3498, 0.3600, 0.3686, 0.3807, 0.4021, 0.4237, 0.4305, 0.4928, 0.4549, 0.4803, 0.4745, 0.5351, 0.6006, 0.6772, 0.0000, 0.0000, 0.0000, 0.4067, 0.4231, 0.4615, 0.4870, 0.3601, 0.1493, 0.1847, 0.1981, 0.2003, 0.1911, 0.2023, 0.2315, 0.2318, 0.2385, 0.2464, 0.2636, 0.2626, 0.2690, 0.2777, 0.2707, 0.3373, 0.2916, 0.3545, 0.3536, 0.4019, 0.4201, 0.3934, 0.4489, 0.4565, 0.4178, 0.5096, 0.5585, 0.5518, 0.6223, 0.0000, 0.0000, 0.0000, 0.4070, 0.4335, 0.4495, 0.4745, 0.2224, 0.1328, 0.1608, 0.1702, 0.1827, 0.1939, 0.2113, 0.2331, 0.2482, 0.2555, 0.2676, 0.2594, 0.2693, 0.2592, 0.2608, 0.2601, 0.3022, 0.3137, 0.3099, 0.3338, 0.3411, 0.3938, 0.3477, 0.3983, 0.3982, 0.3937, 0.4450, 0.4986, 0.5582, 0.5724, 0.0000, 0.0000, 0.0000, 0.1654, 0.4371, 0.4530, 0.4372, 0.1515, 0.1719, 0.2036, 0.1941, 0.1823, 0.1778, 0.1908, 0.1862, 0.2106, 0.2292, 0.2369, 0.2251, 0.2314, 0.2476, 0.2559, 0.2732, 0.2931, 0.3197, 0.3373, 0.3648, 0.3785, 0.3693, 0.4063, 0.4223, 0.4156, 0.4548, 0.5356, 0.5663, 0.5616, 0.5979, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000}, "pT rap effeciency values for Kaons"}; + Configurable> effPtValuesPr{"effPtValuesPr", {0, 0, 0, 0, 0, 0, 0, 0.394712, 0.425251, 0.458426, 0.489121, 0.509505, 0.516103, 0.517117, 0.491584, 0.450721, 0.379836, 0.253402, 0.257575, 0.261382, 0.260373, 0.269008, 0.266811, 0.265011, 0.272768, 0.269553, 0.276003, 0.279878, 0.284216, 0.276346, 0.293437, 0.294727, 0.281017, 0.287609, 0.292402, 0.28614, 0.307208}, "effeciency values for Kaons"}; + Configurable> effPtRapValuesPr{"effPtRapValuesPr", {0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0345, 0.3209, 0.6345, 0.7076, 0.6968, 0.3865, 0.3562, 0.3741, 0.3760, 0.3825, 0.3930, 0.3762, 0.3869, 0.3708, 0.3414, 0.3246, 0.3439, 0.3257, 0.3233, 0.3185, 0.3693, 0.3426, 0.3601, 0.3260, 0.3715, 0.3373, 0.4214, 0.3766, 0.3692, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.2474, 0.5755, 0.6398, 0.6618, 0.6986, 0.7487, 0.6339, 0.3570, 0.3286, 0.3126, 0.3066, 0.2918, 0.2906, 0.3151, 0.3293, 0.3585, 0.3321, 0.3348, 0.3798, 0.3705, 0.3326, 0.3756, 0.4221, 0.3602, 0.3791, 0.4167, 0.4121, 0.3948, 0.4191, 0.3476, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5490, 0.6266, 0.6415, 0.6566, 0.6976, 0.7392, 0.7155, 0.4702, 0.3043, 0.3034, 0.3037, 0.3458, 0.3393, 0.3188, 0.3545, 0.3541, 0.3383, 0.3254, 0.3477, 0.3959, 0.3584, 0.3581, 0.3751, 0.3855, 0.3655, 0.4074, 0.3771, 0.3188, 0.3816, 0.3437, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5701, 0.6201, 0.6612, 0.6533, 0.6684, 0.6916, 0.7126, 0.7208, 0.3838, 0.3316, 0.3169, 0.3159, 0.3281, 0.3361, 0.3345, 0.3542, 0.3535, 0.3339, 0.3527, 0.3803, 0.3599, 0.3745, 0.3810, 0.4013, 0.4036, 0.4118, 0.4016, 0.4161, 0.4036, 0.4198, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5860, 0.6117, 0.6459, 0.6697, 0.6637, 0.7082, 0.7381, 0.7367, 0.5968, 0.3374, 0.3051, 0.3492, 0.3423, 0.3498, 0.3690, 0.3573, 0.4151, 0.3900, 0.3929, 0.4092, 0.3775, 0.4070, 0.3861, 0.4141, 0.3865, 0.4036, 0.3960, 0.4424, 0.3997, 0.3739, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5673, 0.6094, 0.6451, 0.6705, 0.6427, 0.6821, 0.7109, 0.7315, 0.7319, 0.4056, 0.3433, 0.3316, 0.3208, 0.3931, 0.3721, 0.3669, 0.3688, 0.3418, 0.3440, 0.3496, 0.3414, 0.3877, 0.3804, 0.3131, 0.3899, 0.3649, 0.3495, 0.4038, 0.3501, 0.3558, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5497, 0.6281, 0.6455, 0.6752, 0.6818, 0.6935, 0.7480, 0.7510, 0.7712, 0.5599, 0.3500, 0.3410, 0.3289, 0.3403, 0.3424, 0.3240, 0.3404, 0.3540, 0.3268, 0.3331, 0.3636, 0.3601, 0.3469, 0.3593, 0.3637, 0.3669, 0.4036, 0.3625, 0.3350, 0.3712, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5518, 0.5855, 0.6229, 0.6740, 0.6720, 0.6969, 0.7505, 0.7625, 0.7747, 0.6585, 0.2959, 0.2823, 0.2930, 0.2922, 0.3070, 0.3106, 0.3171, 0.3162, 0.3181, 0.3020, 0.3095, 0.3160, 0.3324, 0.3606, 0.3356, 0.3447, 0.3284, 0.3208, 0.3748, 0.3126, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5482, 0.5687, 0.5996, 0.6375, 0.6556, 0.6755, 0.6978, 0.7299, 0.7756, 0.7260, 0.2638, 0.2749, 0.2854, 0.2523, 0.2516, 0.2650, 0.2604, 0.2451, 0.3007, 0.2926, 0.2598, 0.2695, 0.2873, 0.2964, 0.2977, 0.2946, 0.3014, 0.2974, 0.3122, 0.3164, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.4730, 0.5139, 0.5155, 0.5724, 0.6327, 0.6003, 0.6216, 0.6769, 0.7379, 0.6791, 0.1884, 0.1699, 0.1829, 0.1780, 0.1624, 0.1892, 0.1804, 0.1976, 0.1994, 0.1923, 0.1981, 0.1878, 0.1947, 0.2073, 0.2188, 0.2078, 0.1938, 0.1953, 0.2260, 0.1745, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1458, 0.1096, 0.1024, 0.0974, 0.0973, 0.0919, 0.0947, 0.1018, 0.1024, 0.1042, 0.0298, 0.0291, 0.0299, 0.0289, 0.0281, 0.0325, 0.0319, 0.0316, 0.0329, 0.0310, 0.0377, 0.0349, 0.0370, 0.0328, 0.0397, 0.0414, 0.0379, 0.0395, 0.0388, 0.0340, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5397, 0.5801, 0.5897, 0.6112, 0.6864, 0.6721, 0.6859, 0.7086, 0.7534, 0.7322, 0.2720, 0.2496, 0.2315, 0.2494, 0.2812, 0.2877, 0.2433, 0.2465, 0.2750, 0.2883, 0.2848, 0.2793, 0.2909, 0.2771, 0.2888, 0.2923, 0.2572, 0.2723, 0.2758, 0.2731, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5495, 0.5804, 0.6113, 0.6502, 0.6647, 0.6813, 0.7079, 0.7474, 0.7657, 0.6306, 0.2714, 0.2598, 0.2601, 0.2452, 0.2792, 0.2720, 0.2845, 0.2724, 0.2774, 0.2813, 0.2949, 0.2674, 0.2935, 0.2860, 0.3022, 0.2930, 0.2968, 0.3176, 0.3171, 0.2917, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5416, 0.5600, 0.6354, 0.6564, 0.6746, 0.6809, 0.6946, 0.7371, 0.7607, 0.5364, 0.3708, 0.3458, 0.3653, 0.3599, 0.3769, 0.3640, 0.3667, 0.3653, 0.3829, 0.3929, 0.3713, 0.3772, 0.3674, 0.3810, 0.4024, 0.3838, 0.4130, 0.4039, 0.3830, 0.4046, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5512, 0.5967, 0.6277, 0.6578, 0.6424, 0.6641, 0.7317, 0.7343, 0.7142, 0.4351, 0.3927, 0.4098, 0.3937, 0.4046, 0.3986, 0.4117, 0.4140, 0.4294, 0.4020, 0.4036, 0.3858, 0.3582, 0.4257, 0.3741, 0.3968, 0.4209, 0.4387, 0.4221, 0.4059, 0.4374, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5739, 0.6044, 0.6561, 0.6594, 0.6280, 0.6595, 0.6962, 0.7008, 0.5354, 0.3991, 0.3788, 0.3769, 0.3824, 0.4046, 0.4187, 0.4477, 0.4040, 0.4276, 0.4801, 0.4211, 0.4550, 0.4688, 0.4087, 0.4302, 0.4011, 0.4649, 0.4776, 0.4433, 0.4286, 0.5134, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.6076, 0.6062, 0.6302, 0.6758, 0.6457, 0.6936, 0.7342, 0.7175, 0.3698, 0.3439, 0.3499, 0.3405, 0.3785, 0.3427, 0.3453, 0.3833, 0.3716, 0.3945, 0.4290, 0.4172, 0.4177, 0.3970, 0.4051, 0.4350, 0.4395, 0.4208, 0.4605, 0.4489, 0.4315, 0.4499, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5830, 0.6400, 0.6661, 0.6551, 0.6424, 0.6899, 0.7067, 0.4596, 0.2994, 0.3129, 0.3194, 0.3341, 0.3655, 0.3699, 0.3448, 0.3879, 0.3518, 0.3476, 0.3879, 0.3961, 0.3959, 0.4016, 0.3773, 0.3704, 0.4236, 0.4153, 0.3890, 0.4157, 0.4405, 0.3765, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.2265, 0.5939, 0.6490, 0.6726, 0.6857, 0.7228, 0.6359, 0.3889, 0.3641, 0.3183, 0.2852, 0.2965, 0.2959, 0.2933, 0.3224, 0.3247, 0.3324, 0.3821, 0.3729, 0.3990, 0.3941, 0.3753, 0.3909, 0.3909, 0.3953, 0.3842, 0.4036, 0.4685, 0.4010, 0.4241, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0364, 0.3236, 0.6224, 0.6982, 0.6916, 0.4223, 0.3984, 0.3900, 0.4060, 0.3757, 0.3848, 0.3947, 0.3534, 0.3863, 0.3527, 0.3452, 0.3373, 0.3268, 0.3212, 0.3690, 0.3220, 0.3078, 0.3798, 0.3162, 0.3735, 0.3842, 0.4035, 0.4351, 0.4374, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000}, "pT rap effeciency values for Protons"}; using MyAllTracks = soa::Join ", kTH1D, {axisMeanPt}); hist.add("Gen/Charged/h_Q1", "Q1", qNMCHist); @@ -376,8 +372,17 @@ struct MeanPtFlucId { hist.add("Gen/Charged/h_fourpart_Mult_kurto", "Fourpart vs N_{TPC} ", partMCHist); hist.addClone("Gen/Charged/", "Gen/Pion/"); - hist.addClone("Gen/Charged/", "Gen/Kaon/"); - hist.addClone("Gen/Charged/", "Gen/Proton/"); + + hist.add("Gen/Pion/h2_PtTruth_Rap", "p_{T} vs y", kTH2D, {{axisY}, {axisPt}}); + hist.add("Gen/Pion/h2_PtPosTruth_Rap", "p_{T} vs y", kTH2D, {{axisY}, {axisPt}}); + hist.add("Gen/Pion/h2_PtNegTruth_Rap", "p_{T} vs y", kTH2D, {{axisY}, {axisPt}}); + hist.add("Gen/Pion/h_PtPosTruth", "p_{T} (Positive)", kTH1D, {axisPt}); + hist.add("Gen/Pion/h_PtNegTruth", "p_{T} (negative)", kTH1D, {axisPt}); + hist.add("Gen/Pion/h2_PtPosTruth_NFT0M", "p_{T} in Multiplicity Classes ", kTH2D, {{axisPt}, {axisMultFT0M}}); + hist.add("Gen/Pion/h2_PtNegTruth_NFT0M", "p_{T} in Multiplicity Classes ", kTH2D, {{axisPt}, {axisMultFT0M}}); + + hist.addClone("Gen/Pion/", "Gen/Kaon/"); + hist.addClone("Gen/Pion/", "Gen/Proton/"); } enum Mode { @@ -411,40 +416,33 @@ struct MeanPtFlucId { template bool selRun3Col(T const& col) { - hist.fill(HIST("QA/after/counts_evSelCuts"), 0); + hist.fill(HIST("QA/after/h_counts_evSelCuts"), 0); if (cfgPosZ) { if (std::abs(col.posZ()) > cfgCutPosZ) { return false; } - hist.fill(HIST("QA/after/counts_evSelCuts"), 1); + hist.fill(HIST("QA/after/h_counts_evSelCuts"), 1); } if (cfgSel8) { if (!col.sel8()) { return false; } - hist.fill(HIST("QA/after/counts_evSelCuts"), 2); + hist.fill(HIST("QA/after/h_counts_evSelCuts"), 2); } if (cfgNoSameBunchPileup) { if (!col.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { return false; } - hist.fill(HIST("QA/after/counts_evSelCuts"), 4); - } - - if (cfgIsGoodZvtxFT0vsPV) { - if (!col.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { - return false; - } - hist.fill(HIST("QA/after/counts_evSelCuts"), 5); + hist.fill(HIST("QA/after/h_counts_evSelCuts"), 4); } if (cfgIsVertexITSTPC) { if (!col.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) { return false; } - hist.fill(HIST("QA/after/counts_evSelCuts"), 6); + hist.fill(HIST("QA/after/h_counts_evSelCuts"), 5); } return true; @@ -508,7 +506,7 @@ struct MeanPtFlucId { track.p() <= cfgCutPiThrsldP && std::abs(track.rapidity(MassPiPlus)) < cfgCutRap) { if (!track.hasTOF() && - std::fabs(track.tpcNSigmaPi()) < cfgCutNSig3) { + std::fabs(track.tpcNSigmaPi()) < cfgCutNSig2) { return true; } @@ -529,7 +527,7 @@ struct MeanPtFlucId { track.p() <= cfgCutKaThrsldP && std::abs(track.rapidity(MassKPlus)) < cfgCutRap) { if (!track.hasTOF() && - std::fabs(track.tpcNSigmaKa()) < cfgCutNSig3) { + std::fabs(track.tpcNSigmaKa()) < cfgCutNSig2) { return true; } @@ -551,7 +549,7 @@ struct MeanPtFlucId { track.p() <= cfgCutPrThrsldP && std::abs(track.rapidity(MassProton)) < cfgCutRap) { if (!track.hasTOF() && - std::fabs(track.tpcNSigmaPr()) < cfgCutNSig3) { + std::fabs(track.tpcNSigmaPr()) < cfgCutNSig2) { return true; } @@ -629,9 +627,9 @@ struct MeanPtFlucId { } // Find bin index for both pT and eta - std::pair find2DBin(float pT, float eta, const std::vector& ptBins, const std::vector& etaBins) + std::pair find2DBin(float pT, float rap, const std::vector& ptBins, const std::vector& rapBins) { - int ptBin = -1, etaBin = -1; + int ptBin = -1, rapBin = -1; // Find pT bin for (size_t i = 0; i < ptBins.size() - 1; ++i) { @@ -642,14 +640,14 @@ struct MeanPtFlucId { } // Find eta bin - for (size_t j = 0; j < etaBins.size() - 1; ++j) { - if (eta >= etaBins[j] && eta < etaBins[j + 1]) { - etaBin = j + 1; + for (size_t j = 0; j < rapBins.size() - 1; ++j) { + if (rap >= rapBins[j] && rap < rapBins[j + 1]) { + rapBin = j + 1; break; } } - return {ptBin, etaBin}; + return {ptBin, rapBin}; } // Fill hist before selection cuts: @@ -660,17 +658,10 @@ struct MeanPtFlucId { hist.fill(HIST("QA/before/h_Eta"), track.eta()); hist.fill(HIST("QA/before/h_Phi"), track.phi()); hist.fill(HIST("QA/before/h_Pt"), track.pt()); - hist.fill(HIST("QA/before/h2_PvsPinner"), track.p(), track.tpcInnerParam()); - hist.fill(HIST("QA/before/h2_Pt_Eta"), track.eta(), track.pt()); - hist.fill(HIST("QA/before/h_TPCChi2perCluster"), track.tpcChi2NCl()); - hist.fill(HIST("QA/before/h_ITSChi2perCluster"), track.itsChi2NCl()); - hist.fill(HIST("QA/before/h_crossedTPC"), track.tpcNClsCrossedRows()); hist.fill(HIST("QA/before/h_DcaXY"), track.dcaXY()); hist.fill(HIST("QA/before/h_DcaZ"), track.dcaZ()); hist.fill(HIST("QA/before/h2_DcaXY"), track.pt(), track.dcaXY()); hist.fill(HIST("QA/before/h2_DcaZ"), track.pt(), track.dcaZ()); - if (track.hasTOF()) - hist.fill(HIST("QA/before/h2_PtofvsPinner"), track.p(), track.tpcInnerParam()); } hist.fill(HIST("QA/before/h_VtxZ"), col.posZ()); hist.fill(HIST("QA/before/h_Counts"), 2); @@ -678,10 +669,6 @@ struct MeanPtFlucId { hist.fill(HIST("QA/before/h_Cent"), col.centFT0C()); hist.fill(HIST("QA/after/h_CentM"), col.centFT0M()); hist.fill(HIST("QA/before/h_NFT0M"), col.multFT0M()); - hist.fill(HIST("QA/before/h_NFT0C"), col.multFT0M()); - hist.fill(HIST("QA/before/h2_NTPC_NFT0M"), col.multFT0M(), col.multNTracksHasTPC()); - hist.fill(HIST("QA/before/h2_NTPC_NFT0C"), col.multFT0C(), col.multNTracksHasTPC()); - hist.fill(HIST("QA/before/h2_NTPC_Cent"), col.centFT0C(), col.multNTracksHasTPC()); } // Fill hist after selection cuts: @@ -721,9 +708,6 @@ struct MeanPtFlucId { hist.fill(HIST("QA/after/h_TPCChi2perCluster"), track.tpcChi2NCl()); hist.fill(HIST("QA/after/h_ITSChi2perCluster"), track.itsChi2NCl()); hist.fill(HIST("QA/after/h_crossedTPC"), track.tpcNClsCrossedRows()); - - if (track.hasTOF()) - hist.fill(HIST("QA/after/h2_PtofvsPinner"), track.p(), track.tpcInnerParam()); } // Fill before PID cut QA hist: @@ -760,68 +744,69 @@ struct MeanPtFlucId { } // Moments Calculation: - void moments(double pt, double& Q1, double& Q2, double& Q3, double& Q4) + void moments(double pt, double weight, double& Q1, double& Q2, double& Q3, double& Q4) { - Q1 += pt; - Q2 += pt * pt; - Q3 += pt * pt * pt; - Q4 += pt * pt * pt * pt; + Q1 += pt * weight; + Q2 += pt * pt * weight; + Q3 += pt * pt * pt * weight; + Q4 += pt * pt * pt * pt * weight; } - // Fill after PID cut QA hist: - template - void fillIdParticleQAHistos(T const& track, const std::vector& ptBins, const std::vector& etaBins, const std::vector& effPtValues, const std::vector& effPtEtaValues, double rap, double nSigmaTPC, double nSigmaTOF, int nFT0M, int& N, double& Q1, double& Q2, double& Q3, double& Q4) + double getCorrectedWeight(const std::vector& ptBins, const std::vector& rapBins, + const std::vector& effPtValues, const std::vector& effPtRapValues, + double pt, double rap, bool cfgCorrectionPtRap, bool cfgCorrection) { - double pt = track.pt(); - double eta = track.eta(); + double weight = 1.0; - if (cfgCorrectionPtEta) { - auto [ptBin, etaBin] = find2DBin(pt, eta, ptBins, etaBins); - auto effPtEtaVal = static_cast>(effPtEtaValues); + if (cfgCorrectionPtRap) { + auto [ptBin, rapBin] = find2DBin(pt, rap, ptBins, rapBins); - if (ptBin != -1 && etaBin != -1) { + if (ptBin != -1 && rapBin != -1) { int numPtBins = ptBins.size() - 1; // Number of pt bins - float efficiency = effPtEtaVal[etaBin * numPtBins + ptBin]; + double efficiency = effPtRapValues[rapBin * numPtBins + ptBin]; if (efficiency > 0) { - float weight = 1.0 / efficiency; - N += weight; - hist.fill(HIST(Dire[Mode]) + HIST("h2_Pt_Eta_weighted"), eta, pt, weight); + weight = 1.0 / efficiency; } } } else if (cfgCorrection) { int binIndex = findBin(pt, ptBins); - auto effVal = static_cast>(effPtValues); + if (binIndex != -1) { - float efficiency = effVal[binIndex]; + double efficiency = effPtValues[binIndex]; if (efficiency > 0) { - float weight = 1.0 / efficiency; - N += weight; // Correct denominator correction - hist.fill(HIST(Dire[Mode]) + HIST("h_Pt_weighted"), pt, weight); + weight = 1.0 / efficiency; } } - } else { - N++; // No correction applied } - moments(pt, Q1, Q2, Q3, Q4); + return weight; + } + + // Fill after PID cut QA hist: + template + void fillIdParticleQAHistos(T const& track, const std::vector& ptBins, const std::vector& rapBins, const std::vector& effPtValues, const std::vector& effPtRapValues, double rap, double nSigmaTPC, double nSigmaTOF, int nFT0M, int& N, double& Q1, double& Q2, double& Q3, double& Q4) + { + double pt = track.pt(); + double weight = getCorrectedWeight(ptBins, rapBins, effPtValues, effPtRapValues, pt, rap, cfgCorrectionPtRapPID, cfgCorrectionPID); + + N += weight; + moments(pt, weight, Q1, Q2, Q3, Q4); + + hist.fill(HIST(Dire[Mode]) + HIST("h2_Pt_rap_weighted"), rap, pt, weight); + hist.fill(HIST(Dire[Mode]) + HIST("h_Pt_weighted"), pt, weight); hist.fill(HIST(Dire[Mode]) + HIST("h_Pt"), track.pt()); - hist.fill(HIST(Dire[Mode]) + HIST("h_Eta"), track.eta()); hist.fill(HIST(Dire[Mode]) + HIST("h2_Pt_NFT0M"), track.pt(), nFT0M); hist.fill(HIST(Dire[Mode]) + HIST("h2_Pt_Eta"), track.eta(), track.pt()); if (track.sign() > 0) { hist.fill(HIST(Dire[Mode]) + HIST("h_PtPos"), track.pt()); - hist.fill(HIST(Dire[Mode]) + HIST("h_EtaPos"), track.eta()); hist.fill(HIST(Dire[Mode]) + HIST("h2_PtPos_NFT0M"), track.pt(), nFT0M); - hist.fill(HIST(Dire[Mode]) + HIST("h2_PtPos_Eta"), track.eta(), track.pt()); hist.fill(HIST(Dire[Mode]) + HIST("h2_PtPos_rap"), rap, track.pt()); } if (track.sign() < 0) { hist.fill(HIST(Dire[Mode]) + HIST("h_PtNeg"), track.pt()); - hist.fill(HIST(Dire[Mode]) + HIST("h_EtaNeg"), track.eta()); hist.fill(HIST(Dire[Mode]) + HIST("h2_PtNeg_NFT0M"), track.pt(), nFT0M); - hist.fill(HIST(Dire[Mode]) + HIST("h2_PtNeg_Eta"), track.eta(), track.pt()); hist.fill(HIST(Dire[Mode]) + HIST("h2_PtNeg_rap"), rap, track.pt()); } @@ -833,8 +818,6 @@ struct MeanPtFlucId { hist.fill(HIST(Dire[Mode]) + HIST("h_DcaXY"), track.dcaXY()); hist.fill(HIST(Dire[Mode]) + HIST("h2_DcaZ"), track.pt(), track.dcaZ()); hist.fill(HIST(Dire[Mode]) + HIST("h2_DcaXY"), track.pt(), track.dcaXY()); - hist.fill(HIST(Dire[Mode]) + HIST("h2_Pt_Pinner"), track.tpcInnerParam(), track.pt()); - hist.fill(HIST(Dire[Mode]) + HIST("h2_P_Pinner"), track.tpcInnerParam(), track.p()); hist.fill(HIST(Dire[Mode]) + HIST("h2_TPCNsigma_El"), track.p(), track.tpcNSigmaEl()); hist.fill(HIST(Dire[Mode]) + HIST("h2_TOFNsigma_El"), track.p(), track.tofNSigmaEl()); @@ -867,21 +850,16 @@ struct MeanPtFlucId { hist.fill(HIST(Dire[Mode]) + HIST("h_PtTruth"), pt); hist.fill(HIST(Dire[Mode]) + HIST("h_EtaTruth"), eta); hist.fill(HIST(Dire[Mode]) + HIST("h2_PtTruth_NFT0M"), pt, nFT0M); - hist.fill(HIST(Dire[Mode]) + HIST("h2_PtTruth_Eta"), eta, pt); hist.fill(HIST(Dire[Mode]) + HIST("h2_PtTruth_Rap"), rap, pt); if (pid == pdgCodePos) { hist.fill(HIST(Dire[Mode]) + HIST("h_PtPosTruth"), pt); - hist.fill(HIST(Dire[Mode]) + HIST("h_EtaPosTruth"), eta); hist.fill(HIST(Dire[Mode]) + HIST("h2_PtPosTruth_NFT0M"), pt, nFT0M); - hist.fill(HIST(Dire[Mode]) + HIST("h2_PtPosTruth_Eta"), eta, pt); hist.fill(HIST(Dire[Mode]) + HIST("h2_PtPosTruth_Rap"), rap, pt); } if (pid == pdgCodeNeg) { hist.fill(HIST(Dire[Mode]) + HIST("h_PtNegTruth"), pt); - hist.fill(HIST(Dire[Mode]) + HIST("h_EtaNegTruth"), eta); hist.fill(HIST(Dire[Mode]) + HIST("h2_PtNegTruth_NFT0M"), pt, nFT0M); - hist.fill(HIST(Dire[Mode]) + HIST("h2_PtNegTruth_Eta"), eta, pt); hist.fill(HIST(Dire[Mode]) + HIST("h2_PtNegTruth_Rap"), rap, pt); } } @@ -1001,21 +979,9 @@ struct MeanPtFlucId { if (std::fabs(track.eta()) < 0.8) { ptCh = track.pt(); - if (cfgCorrection == true) { - int binIndex = findBin(ptCh, ptBins); - auto effValCh = static_cast>(effValuesCh); - if (binIndex != -1) { - float efficiency = effValCh[binIndex]; - if (efficiency > 0) { - float weight = 1.0 / efficiency; - nCh += weight; // Correct denominator correction - hist.fill(HIST("QA/after/h_Pt_weighted"), ptCh, weight); - } - } - } else { - nCh++; - } - moments(ptCh, q1Ch, q2Ch, q3Ch, q4Ch); + double weight = getCorrectedWeight(ptBins, {}, effValuesCh, {}, ptCh, 0.0, false, cfgCorrection); + hist.fill(HIST("QA/after/h_Pt_weighted"), ptCh, weight); + moments(ptCh, weight, q1Ch, q2Ch, q3Ch, q4Ch); fillChargedQAHistos(track, nFT0M); } @@ -1032,31 +998,31 @@ struct MeanPtFlucId { if (cfgSelOR == true && cfgSelAND == false) { if (selLowPi(track) == cfgSelLow || selHighPi(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesPi, effPtEtaValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, q1Pi, q2Pi, q3Pi, q4Pi); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPi, effPtRapValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, q1Pi, q2Pi, q3Pi, q4Pi); } } else if (cfgSelOR == false && cfgSelAND == true) { if (selLowPi(track) == cfgSelLow && selHighPi(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesPi, effPtEtaValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, q1Pi, q2Pi, q3Pi, q4Pi); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPi, effPtRapValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, q1Pi, q2Pi, q3Pi, q4Pi); } } if (cfgSelOR == true && cfgSelAND == false) { if (selLowKa(track) == cfgSelLow || selHighKa(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesKa, effPtEtaValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, q1Ka, q2Ka, q3Ka, q4Ka); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesKa, effPtRapValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, q1Ka, q2Ka, q3Ka, q4Ka); } } else if (cfgSelOR == false && cfgSelAND == true) { if (selLowKa(track) == cfgSelLow && selHighKa(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesKa, effPtEtaValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, q1Ka, q2Ka, q3Ka, q4Ka); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesKa, effPtRapValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, q1Ka, q2Ka, q3Ka, q4Ka); } } if (cfgSelOR == true && cfgSelAND == false) { if (selLowPr(track) == cfgSelLow || selHighPr(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesPr, effPtEtaValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, q1Pr, q2Pr, q3Pr, q4Pr); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPr, effPtRapValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, q1Pr, q2Pr, q3Pr, q4Pr); } } else if (cfgSelOR == false && cfgSelAND == true) { if (selLowPr(track) == cfgSelLow && selHighPr(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesPr, effPtEtaValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, q1Pr, q2Pr, q3Pr, q4Pr); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPr, effPtRapValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, q1Pr, q2Pr, q3Pr, q4Pr); } } } @@ -1084,36 +1050,25 @@ struct MeanPtFlucId { nTPC++; } + double nSigmaTPCPi = track.tpcNSigmaPi(); + double nSigmaTPCKa = track.tpcNSigmaKa(); + double nSigmaTPCPr = track.tpcNSigmaPr(); + double nSigmaTOFPi = track.tofNSigmaPi(); + double nSigmaTOFKa = track.tofNSigmaKa(); + double nSigmaTOFPr = track.tofNSigmaPr(); + double rapPi = track.rapidity(MassPiPlus); + double rapKa = track.rapidity(MassKPlus); + double rapPr = track.rapidity(MassProton); + //______________________________Reconstructed Level____________________________________________________// if (selTrack(track)) { - double nSigmaTPCPi = track.tpcNSigmaPi(); - double nSigmaTPCKa = track.tpcNSigmaKa(); - double nSigmaTPCPr = track.tpcNSigmaPr(); - double nSigmaTOFPi = track.tofNSigmaPi(); - double nSigmaTOFKa = track.tofNSigmaKa(); - double nSigmaTOFPr = track.tofNSigmaPr(); - double rapPi = track.rapidity(MassPiPlus); - double rapKa = track.rapidity(MassKPlus); - double rapPr = track.rapidity(MassProton); if (std::fabs(track.eta()) < 0.8) { ptCh = track.pt(); - if (cfgCorrection == true) { - int binIndex = findBin(ptCh, ptBins); - auto effValCh = static_cast>(effValuesCh); - if (binIndex != -1) { - float efficiency = effValCh[binIndex]; - if (efficiency > 0) { - float weight = 1.0 / efficiency; - nCh += weight; // Correct denominator correction - hist.fill(HIST("QA/after/h_Pt_weighted"), ptCh, weight); - } - } - } else { - nCh++; - } - moments(ptCh, q1Ch, q2Ch, q3Ch, q4Ch); + double weight = getCorrectedWeight(ptBins, {}, effValuesCh, {}, ptCh, 0.0, false, cfgCorrection); + hist.fill(HIST("QA/after/h_Pt_weighted"), ptCh, weight); + moments(ptCh, weight, q1Ch, q2Ch, q3Ch, q4Ch); fillChargedQAHistos(track, nFT0M); } fillBeforePIDQAHistos(track); @@ -1130,19 +1085,19 @@ struct MeanPtFlucId { if (cfgPDGCodeOnly == true) { if (std::abs(pid) == kPiPlus && std::abs(rapPi) < 0.5 && track.pt() >= cfgCutPiPtMin) { ptPi = track.pt(); - fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesPi, effPtEtaValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, q1Pi, q2Pi, q3Pi, q4Pi); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPi, effPtRapValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, q1Pi, q2Pi, q3Pi, q4Pi); fillPtMCHist(ptPi, eta, rapPi, nFT0M, pid, kPiPlus, kPiMinus); } if (std::abs(pid) == kKPlus && std::abs(rapKa) < 0.5 && track.pt() >= cfgCutKaPtMin) { ptKa = track.pt(); - fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesKa, effPtEtaValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, q1Ka, q2Ka, q3Ka, q4Ka); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesKa, effPtRapValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, q1Ka, q2Ka, q3Ka, q4Ka); fillPtMCHist(ptKa, eta, rapKa, nFT0M, pid, kKPlus, kKMinus); } if (std::abs(pid) == kProton && std::abs(rapPr) < 0.5 && track.pt() >= cfgCutPrPtMin) { ptPr = track.pt(); - fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesPr, effPtEtaValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, q1Pr, q2Pr, q3Pr, q4Pr); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPr, effPtRapValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, q1Pr, q2Pr, q3Pr, q4Pr); fillPtMCHist(ptPr, eta, rapPr, nFT0M, pid, kProton, kProtonBar); } } @@ -1151,7 +1106,7 @@ struct MeanPtFlucId { if (cfgSelOR == true && cfgSelAND == false) { if (selLowPi(track) == cfgSelLow || selHighPi(track) == cfgSelHigh) { ptPi = track.pt(); - fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesPi, effPtEtaValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, q1Pi, q2Pi, q3Pi, q4Pi); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPi, effPtRapValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, q1Pi, q2Pi, q3Pi, q4Pi); if (std::abs(pid) == kPiPlus) { fillPtMCHist(ptPi, eta, rapPi, nFT0M, pid, kPiPlus, kPiMinus); } @@ -1159,7 +1114,7 @@ struct MeanPtFlucId { } else if (cfgSelOR == false && cfgSelAND == true) { if (selLowPi(track) == cfgSelLow && selHighPi(track) == cfgSelHigh) { ptPi = track.pt(); - fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesPi, effPtEtaValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, q1Pi, q2Pi, q3Pi, q4Pi); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPi, effPtRapValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, q1Pi, q2Pi, q3Pi, q4Pi); if (std::abs(pid) == kPiPlus) { fillPtMCHist(ptPi, eta, rapPi, nFT0M, pid, kPiPlus, kPiMinus); } @@ -1169,7 +1124,7 @@ struct MeanPtFlucId { if (cfgSelOR == true && cfgSelAND == false) { if (selLowKa(track) == cfgSelLow || selHighKa(track) == cfgSelHigh) { ptKa = track.pt(); - fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesKa, effPtEtaValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, q1Ka, q2Ka, q3Ka, q4Ka); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesKa, effPtRapValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, q1Ka, q2Ka, q3Ka, q4Ka); if (std::abs(pid) == kKPlus) { fillPtMCHist(ptKa, eta, rapKa, nFT0M, pid, kKPlus, kKMinus); } @@ -1177,7 +1132,7 @@ struct MeanPtFlucId { } else if (cfgSelOR == false && cfgSelAND == true) { if (selLowKa(track) == cfgSelLow && selHighKa(track) == cfgSelHigh) { ptKa = track.pt(); - fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesKa, effPtEtaValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, q1Ka, q2Ka, q3Ka, q4Ka); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesKa, effPtRapValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, q1Ka, q2Ka, q3Ka, q4Ka); if (std::abs(pid) == kKPlus) { fillPtMCHist(ptKa, eta, rapKa, nFT0M, pid, kKPlus, kKMinus); } @@ -1187,7 +1142,7 @@ struct MeanPtFlucId { if (cfgSelOR == true && cfgSelAND == false) { if (selLowPr(track) == cfgSelLow || selHighPr(track) == cfgSelHigh) { ptPr = track.pt(); - fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesPr, effPtEtaValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, q1Pr, q2Pr, q3Pr, q4Pr); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPr, effPtRapValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, q1Pr, q2Pr, q3Pr, q4Pr); if (std::abs(pid) == kProton) { fillPtMCHist(ptPr, eta, rapPr, nFT0M, pid, kProton, kProtonBar); } @@ -1195,7 +1150,7 @@ struct MeanPtFlucId { } else if (cfgSelOR == false && cfgSelAND == true) { if (selLowPr(track) == cfgSelLow && selHighPr(track) == cfgSelHigh) { ptPr = track.pt(); - fillIdParticleQAHistos(track, ptBins, etaBins, effPtValuesPr, effPtEtaValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, q1Pr, q2Pr, q3Pr, q4Pr); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPr, effPtRapValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, q1Pr, q2Pr, q3Pr, q4Pr); if (std::abs(pid) == kProton) { fillPtMCHist(ptPr, eta, rapPr, nFT0M, pid, kProton, kProtonBar); } @@ -1230,9 +1185,12 @@ struct MeanPtFlucId { if (std::abs(mcPart.eta()) < 0.8) { nChSim++; ptChSim = mcPart.pt(); - moments(ptChSim, q1ChSim, q2ChSim, q3ChSim, q4ChSim); + moments(ptChSim, 1.0, q1ChSim, q2ChSim, q3ChSim, q4ChSim); hist.fill(HIST("Gen/Charged/h_PtTruth"), mcPart.pt()); hist.fill(HIST("Gen/Charged/h2_PtTruth_NFT0M"), mcPart.pt(), nFT0M); + hist.fill(HIST("Gen/Charged/h2_PtTruth_Eta"), mcPart.pt(), mcPart.eta()); + hist.fill(HIST("Gen/Charged/h_EtaTruth"), mcPart.eta()); + hist.fill(HIST("Gen/Charged/h_PhiTruth"), mcPart.phi()); } if (std::abs(mcPart.y()) > cfgCutRap) { @@ -1247,17 +1205,18 @@ struct MeanPtFlucId { if (mcPart.p() <= cfgCutPiThrsldP || mcPart.p() > cfgCutPiThrsldP) { nPiSim++; ptPiSim = mcPart.pt(); - moments(ptPiSim, q1PiSim, q2PiSim, q3PiSim, q4PiSim); + moments(ptPiSim, 1.0, q1PiSim, q2PiSim, q3PiSim, q4PiSim); fillPtMCHist(ptPiSim, etaSim, rapSim, nFT0M, pid, kPiPlus, kPiMinus); } } else if (cfgSelOR == false && cfgSelAND == true) { if ((cfgSelLow == true && mcPart.p() <= cfgCutPiThrsldP) && (cfgSelHigh == true && mcPart.p() > cfgCutPiThrsldP)) { nPiSim++; ptPiSim = mcPart.pt(); - moments(ptPiSim, q1PiSim, q2PiSim, q3PiSim, q4PiSim); + moments(ptPiSim, 1.0, q1PiSim, q2PiSim, q3PiSim, q4PiSim); fillPtMCHist(ptPiSim, etaSim, rapSim, nFT0M, pid, kPiPlus, kPiMinus); } } + hist.fill(HIST("Gen/Pion/h_PhiTruth"), mcPart.phi()); } if (std::abs(pid) == kKPlus && mcPart.pt() >= cfgCutKaPtMin) { @@ -1265,17 +1224,18 @@ struct MeanPtFlucId { if ((cfgSelLow == true && mcPart.p() <= cfgCutPiThrsldP) || (cfgSelHigh == true && mcPart.p() > cfgCutPiThrsldP)) { nKaSim++; ptKaSim = mcPart.pt(); - moments(ptKaSim, q1KaSim, q2KaSim, q3KaSim, q4KaSim); + moments(ptKaSim, 1.0, q1KaSim, q2KaSim, q3KaSim, q4KaSim); fillPtMCHist(ptKaSim, etaSim, rapSim, nFT0M, pid, kKPlus, kKMinus); } } else if (cfgSelOR == false && cfgSelAND == true) { if ((cfgSelLow == true && mcPart.p() <= cfgCutKaThrsldP) && (cfgSelHigh == true && mcPart.p() > cfgCutKaThrsldP)) { nKaSim++; ptKaSim = mcPart.pt(); - moments(ptKaSim, q1KaSim, q2KaSim, q3KaSim, q4KaSim); + moments(ptKaSim, 1.0, q1KaSim, q2KaSim, q3KaSim, q4KaSim); fillPtMCHist(ptKaSim, etaSim, rapSim, nFT0M, pid, kKPlus, kKMinus); } } + hist.fill(HIST("Gen/Kaon/h_PhiTruth"), mcPart.phi()); } if (std::abs(pid) == kProton && mcPart.pt() >= cfgCutPrPtMin) { @@ -1283,21 +1243,24 @@ struct MeanPtFlucId { if ((cfgSelLow == true && mcPart.p() <= cfgCutPrThrsldP) || (cfgSelHigh == true && mcPart.p() > cfgCutPrThrsldP)) { nPrSim++; ptPrSim = mcPart.pt(); - moments(ptPrSim, q1PrSim, q2PrSim, q3PrSim, q4PrSim); + moments(ptPrSim, 1.0, q1PrSim, q2PrSim, q3PrSim, q4PrSim); fillPtMCHist(ptPrSim, etaSim, rapSim, nFT0M, pid, kProton, kProtonBar); } } else if (cfgSelOR == false && cfgSelAND == true) { if ((cfgSelLow == true && mcPart.p() <= cfgCutPrThrsldP) && (cfgSelHigh == true && mcPart.p() > cfgCutPrThrsldP)) { nPrSim++; ptPrSim = mcPart.pt(); - moments(ptPrSim, q1PrSim, q2PrSim, q3PrSim, q4PrSim); + moments(ptPrSim, 1.0, q1PrSim, q2PrSim, q3PrSim, q4PrSim); fillPtMCHist(ptPrSim, etaSim, rapSim, nFT0M, pid, kProton, kProtonBar); } } + hist.fill(HIST("Gen/Proton/h_PhiTruth"), mcPart.phi()); } } } + ////////////////////////////////////////////////////////////////////////////////////////////////////////////// + for (const auto& track : tracks) { if (!track.has_mcParticle()) { LOGF(warning, "No MC Particle for this track, skip..."); @@ -1309,20 +1272,37 @@ struct MeanPtFlucId { continue; } + double rapPi = track.rapidity(MassPiPlus); + double rapKa = track.rapidity(MassKPlus); + double rapPr = track.rapidity(MassProton); + if (selTrack(track)) { if (std::abs(track.eta()) < 0.8) { double pt = track.pt(); - if (cfgCorrection == true) { - int binIndex = findBin(pt, ptBins); - auto effValCh = static_cast>(effValuesCh); - if (binIndex != -1) { - float efficiency = effValCh[binIndex]; - if (efficiency > 0) { - float weight = 1.0 / efficiency; - hist.fill(HIST("QA/after/h2_pt_nch"), nCh, pt, weight); - } - } - } + double weight = getCorrectedWeight(ptBins, {}, effValuesCh, {}, pt, 0.0, false, cfgCorrection); + hist.fill(HIST("QA/after/h2_pt_nch"), nCh, pt, weight); + hist.fill(HIST("QA/after/h2_pt_nch_prof"), nCh, pt, weight); + } + + if (selLowPi(track) == cfgSelLow || selHighPi(track) == cfgSelHigh) { + ptPi = track.pt(); + double weight = getCorrectedWeight(ptBins, rapBins, effPtValuesPi, effPtRapValuesPi, ptPi, rapPi, cfgCorrectionPtRapPID, cfgCorrectionPID); + hist.fill(HIST("QA/Pion/h2_pt_nch"), nPi, ptPi, weight); + hist.fill(HIST("QA/Pion/h2_pt_nch_prof"), nPi, ptPi, weight); + } + + if (selLowKa(track) == cfgSelLow || selHighKa(track) == cfgSelHigh) { + ptKa = track.pt(); + double weight = getCorrectedWeight(ptBins, rapBins, effPtValuesKa, effPtRapValuesKa, ptKa, rapKa, cfgCorrectionPtRapPID, cfgCorrectionPID); + hist.fill(HIST("QA/Kaon/h2_pt_nch"), nKa, ptKa, weight); + hist.fill(HIST("QA/Kaon/h2_pt_nch_prof"), nKa, ptKa, weight); + } + + if (selLowPr(track) == cfgSelLow || selHighPr(track) == cfgSelHigh) { + ptPr = track.pt(); + double weight = getCorrectedWeight(ptBins, rapBins, effPtValuesPr, effPtRapValuesPr, ptPr, rapPr, cfgCorrectionPtRapPID, cfgCorrectionPID); + hist.fill(HIST("QA/Proton/h2_pt_nch"), nPr, ptPr, weight); + hist.fill(HIST("QA/Proton/h2_pt_nch_prof"), nPr, ptPr, weight); } } @@ -1340,33 +1320,60 @@ struct MeanPtFlucId { if (mcPart.pt() > cfgCutPtMin && mcPart.pt() < cfgCutPtMax) { if (std::abs(mcPart.eta()) < 0.8) { double pt = mcPart.pt(); - hist.fill(HIST("Gen/h2_pt_nch"), nChSim, pt); + hist.fill(HIST("Gen/Charged/h2_pt_nch"), nChSim, pt); + hist.fill(HIST("Gen/Charged/h2_pt_nch_prof"), nChSim, pt); + } + + if (std::abs(mcPart.y()) > 0.5) + continue; + + if (std::abs(pid) == kPiPlus && mcPart.pt() >= cfgCutPiPtMin) { + hist.fill(HIST("Gen/Pion/h2_pt_nch"), nPiSim, mcPart.pt()); + hist.fill(HIST("Gen/Pion/h2_pt_nch_prof"), nPiSim, mcPart.pt()); + } + if (std::abs(pid) == kKPlus && mcPart.pt() >= cfgCutKaPtMin) { + hist.fill(HIST("Gen/Kaon/h2_pt_nch"), nKaSim, mcPart.pt()); + hist.fill(HIST("Gen/Kaon/h2_pt_nch_prof"), nKaSim, mcPart.pt()); + } + if (std::abs(pid) == kProton && mcPart.pt() >= cfgCutPrPtMin) { + hist.fill(HIST("Gen/Proton/h2_pt_nch"), nPrSim, mcPart.pt()); + hist.fill(HIST("Gen/Proton/h2_pt_nch_prof"), nPrSim, mcPart.pt()); } } } - hist.fill(HIST("QA/after/h_vtxZSim"), col.mcCollision().posZ()); - } - if (nTPC > 0 && nCh > 0) - hist.fill(HIST("QA/after/h2_NTPC_NCh"), nTPC, nCh); + hist.fill(HIST("Gen/h_Counts"), 2); + hist.fill(HIST("QA/after/h_vtxZReco"), col.posZ()); + hist.fill(HIST("Gen/h_vtxZ"), col.mcCollision().posZ()); - if (cfgMCTruth) { if (nSim > 0) - hist.fill(HIST("QA/after/h_NSim"), nSim); + hist.fill(HIST("Gen/h_NSim"), nSim); if (nSim > 0 && nChSim > 0) - hist.fill(HIST("QA/after/h2_NChSim_NSim"), nSim, nChSim); + hist.fill(HIST("Gen/h2_NChSim_NSim"), nSim, nChSim); if (nSim > 0 && nTPC > 0) - hist.fill(HIST("QA/after/h2_NTPC_NSim"), nSim, nTPC); + hist.fill(HIST("Gen/h2_NTPC_NSim"), nSim, nTPC); + + if (nChSim > 0 && nTPC > 0) + hist.fill(HIST("Gen/h2_NTPC_NChSim"), nTPC, nChSim); + + if (nPiSim > 0 && nTPC > 0) + hist.fill(HIST("Gen/h2_NTPC_NPiSim"), nTPC, nPiSim); + + if (nKaSim > 0 && nTPC > 0) + hist.fill(HIST("Gen/h2_NTPC_NKaSim"), nTPC, nKaSim); + + if (nPrSim > 0 && nTPC > 0) + hist.fill(HIST("Gen/h2_NTPC_NPrSim"), nTPC, nPrSim); - hist.fill(HIST("Gen/NTPC"), nTPC); - hist.fill(HIST("Gen/NFT0C"), nFT0CSim); + hist.fill(HIST("Gen/h_NTPC"), nTPC); + hist.fill(HIST("Gen/h_NFT0C"), nFT0CSim); hist.fill(HIST("Gen/h2_NTPC_NFT0C"), nFT0CSim, nTPC); hist.fill(HIST("Gen/h2_NTPC_NFT0M"), nFT0M, nTPC); if (nFT0C != 0 && nFT0CSim != 0) - hist.fill(HIST("QA/after/h2_NFT0C_NFT0CSim"), nFT0CSim, nFT0C); + hist.fill(HIST("Gen/h2_NFT0C_NFT0CSim"), nFT0CSim, nFT0C); fillAnalysisHistos(nTPC, nFT0M, nChSim, q1ChSim, q2ChSim, q3ChSim, q4ChSim); fillAnalysisHistos(nTPC, nFT0M, nPiSim, q1PiSim, q2PiSim, q3PiSim, q4PiSim); @@ -1374,6 +1381,18 @@ struct MeanPtFlucId { fillAnalysisHistos(nTPC, nFT0M, nPrSim, q1PrSim, q2PrSim, q3PrSim, q4PrSim); } + if (nTPC > 0 && nCh > 0) + hist.fill(HIST("QA/after/h2_NTPC_NCh"), nTPC, nCh); + + if (nPi > 0 && nTPC > 0) + hist.fill(HIST("QA/after/h2_NTPC_NPi"), nTPC, nPi); + + if (nKa > 0 && nTPC > 0) + hist.fill(HIST("QA/after/h2_NTPC_NKa"), nTPC, nKa); + + if (nPr > 0 && nTPC > 0) + hist.fill(HIST("QA/after/h2_NTPC_NPr"), nTPC, nPr); + fillAnalysisHistos(nTPC, nFT0M, nCh, q1Ch, q2Ch, q3Ch, q4Ch); fillAnalysisHistos(nTPC, nFT0M, nPi, q1Pi, q2Pi, q3Pi, q4Pi); fillAnalysisHistos(nTPC, nFT0M, nKa, q1Ka, q2Ka, q3Ka, q4Ka); From 294509192346586fad03660c7e9e3d3b49baa31c Mon Sep 17 00:00:00 2001 From: Youssef El Mard <143704238+yelmardb@users.noreply.github.com> Date: Mon, 17 Feb 2025 02:07:52 +0100 Subject: [PATCH 0257/1650] [PWGEM] Add histogram that retrieves DCAz vs. Pt for V0 in data and MC (#9956) Co-authored-by: Youssef El Mard Bouziani --- PWGEM/PhotonMeson/Tasks/pcmQC.cxx | 2 ++ PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx | 2 ++ 2 files changed, 4 insertions(+) diff --git a/PWGEM/PhotonMeson/Tasks/pcmQC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQC.cxx index 5b4d9c6be48..feb1a31f6cc 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQC.cxx @@ -156,6 +156,7 @@ struct PCMQC { fRegistry.add("V0/hThetaResolution", "#theta resolution;p_{#gamma} (GeV/c);#Delta#theta (rad.)", kTH2F, {{1000, 0.0f, 10}, {100, 0, 0.01}}, false); fRegistry.add("V0/hPhiResolution", "#varphi resolution;p_{#gamma} (GeV/c);#Delta#varphi (rad.)", kTH2F, {{1000, 0.0f, 10}, {100, 0, 0.01}}, false); fRegistry.add("V0/hNgamma", "Number of #gamma candidates per collision", kTH1F, {{101, -0.5f, 100.5f}}); + fRegistry.add("V0/hDCAz_Pt", "DCA to PV vs. p_{T} (GeV/c);DCA_{z} (cm);p_{T} (GeV/c)", kTH2F, {{200, -5.f, +5.f}, {1000, 0.0f, 10}}, false); // v0leg info fRegistry.add("V0Leg/hPt", "pT;p_{T,e} (GeV/c)", kTH1F, {{1000, 0.0f, 10}}, false); @@ -316,6 +317,7 @@ struct PCMQC { fRegistry.fill(HIST("V0/hEtaResolution"), v0.p(), getEtaResolution(v0)); fRegistry.fill(HIST("V0/hThetaResolution"), v0.p(), getThetaResolution(v0)); fRegistry.fill(HIST("V0/hPhiResolution"), v0.p(), getPhiResolution(v0)); + fRegistry.fill(HIST("V0/hDCAz_Pt"), v0.dcaZtopv(), v0.pt()); } template diff --git a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx index bb050239175..1cd44c89301 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx @@ -206,6 +206,7 @@ struct PCMQCMC { fRegistry.add("V0/primary/hPtGen_DeltaPhi", "photon #varphi resolution;p_{T}^{gen} (GeV/c);#varphi^{rec} - #varphi^{gen} (rad.)", kTH2F, {{1000, 0, 10}, {400, -1.0f, 1.0f}}, true); fRegistry.add("V0/primary/hXY_Photon_MC", "X vs. Y of true photon conversion point.;X (cm);Y (cm)", kTH2F, {{400, -100.0f, +100}, {400, -100, +100}}, true); fRegistry.add("V0/primary/hRZ_Photon_MC", "R vs. Z of true photon conversion point;Z (cm);R_{xy} (cm)", kTH2F, {{200, -100.0f, +100}, {200, 0, 100}}, true); + fRegistry.add("V0/primary/hDCAz_Pt", "DCA to PV vs. p_{T} (GeV/c);DCA_{z} (cm);p_{T} (GeV/c)", kTH2F, {{200, -5.f, +5.f}, {1000, 0.0f, 20}}, true); fRegistry.addClone("V0/primary/", "V0/fromWD/"); // from weak decay fRegistry.addClone("V0/primary/", "V0/fromHS/"); // from hadronic shower in detector materials @@ -381,6 +382,7 @@ struct PCMQCMC { fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hConvPoint_diffZ"), mcleg.vz(), v0.vz() - mcleg.vz()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hXY_Photon_MC"), mcleg.vx(), mcleg.vy()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hRZ_Photon_MC"), mcleg.vz(), std::sqrt(std::pow(mcleg.vx(), 2) + std::pow(mcleg.vy(), 2))); + fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hDCAz_Pt"), v0.dcaZtopv(), v0.pt()); } template From 305e2860fc6d6a26d068c34b28b52051edd2d175 Mon Sep 17 00:00:00 2001 From: lauraser <45659867+lauraser@users.noreply.github.com> Date: Mon, 17 Feb 2025 03:23:37 +0100 Subject: [PATCH 0258/1650] [PWGCF] Addition of new QA histograms and also track selections (#9997) Co-authored-by: Laura Serksnyte --- .../FemtoDream/Core/femtoDreamParticleHisto.h | 2 ++ .../TableProducer/femtoDreamProducerTask.cxx | 27 +++++++++++++++++++ .../Tasks/femtoDreamCollisionMasker.cxx | 20 ++++++++++++-- PWGCF/FemtoDream/Tasks/femtoDreamDebugV0.cxx | 18 +++++++++++++ .../femtoDreamTripletTaskTrackTrackTrack.cxx | 14 +++++++--- .../femtoDreamTripletTaskTrackTrackV0.cxx | 14 +++++++--- 6 files changed, 85 insertions(+), 10 deletions(-) diff --git a/PWGCF/FemtoDream/Core/femtoDreamParticleHisto.h b/PWGCF/FemtoDream/Core/femtoDreamParticleHisto.h index 0e6f4e81da6..1b72e1b09ef 100644 --- a/PWGCF/FemtoDream/Core/femtoDreamParticleHisto.h +++ b/PWGCF/FemtoDream/Core/femtoDreamParticleHisto.h @@ -141,6 +141,7 @@ class FemtoDreamParticleHisto } else if constexpr (mParticleType == o2::aod::femtodreamparticle::ParticleType::kCascade) { mHistogramRegistry->add((folderName + folderSuffix + "/hDaughDCA").c_str(), "; DCA^{daugh} (cm); Entries", kTH1F, {{1000, 0, 10}}); mHistogramRegistry->add((folderName + folderSuffix + "/hTransRadius").c_str(), "; #it{r}_{xy} (cm); Entries", kTH1F, {{1500, 0, 150}}); + mHistogramRegistry->add((folderName + folderSuffix + "/hTransRadius_pT").c_str(), "; p_{T}; #it{r}_{xy} (cm)", kTH2F, {{100, 0, 6}, {1500, 0, 150}}); mHistogramRegistry->add((folderName + folderSuffix + "/hDecayVtxX").c_str(), "; #it{Vtx}_{x} (cm); Entries", kTH1F, {{2000, 0, 200}}); mHistogramRegistry->add((folderName + folderSuffix + "/hDecayVtxY").c_str(), "; #it{Vtx}_{y} (cm)); Entries", kTH1F, {{2000, 0, 200}}); mHistogramRegistry->add((folderName + folderSuffix + "/hDecayVtxZ").c_str(), "; #it{Vtx}_{z} (cm); Entries", kTH1F, {{2000, 0, 200}}); @@ -446,6 +447,7 @@ class FemtoDreamParticleHisto } else if constexpr (mParticleType == o2::aod::femtodreamparticle::ParticleType::kCascade) { mHistogramRegistry->fill(HIST(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]) + HIST(o2::aod::femtodreamMCparticle::MCTypeName[mc]) + HIST("/hDaughDCA"), part.daughDCA()); mHistogramRegistry->fill(HIST(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]) + HIST(o2::aod::femtodreamMCparticle::MCTypeName[mc]) + HIST("/hTransRadius"), part.transRadius()); + mHistogramRegistry->fill(HIST(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]) + HIST(o2::aod::femtodreamMCparticle::MCTypeName[mc]) + HIST("/hTransRadius_pT"), part.pt(), part.transRadius()); mHistogramRegistry->fill(HIST(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]) + HIST(o2::aod::femtodreamMCparticle::MCTypeName[mc]) + HIST("/hDecayVtxX"), part.decayVtxX()); mHistogramRegistry->fill(HIST(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]) + HIST(o2::aod::femtodreamMCparticle::MCTypeName[mc]) + HIST("/hDecayVtxY"), part.decayVtxY()); mHistogramRegistry->fill(HIST(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]) + HIST(o2::aod::femtodreamMCparticle::MCTypeName[mc]) + HIST("/hDecayVtxZ"), part.decayVtxZ()); diff --git a/PWGCF/FemtoDream/TableProducer/femtoDreamProducerTask.cxx b/PWGCF/FemtoDream/TableProducer/femtoDreamProducerTask.cxx index d91a13ed09e..ed9b0044666 100644 --- a/PWGCF/FemtoDream/TableProducer/femtoDreamProducerTask.cxx +++ b/PWGCF/FemtoDream/TableProducer/femtoDreamProducerTask.cxx @@ -246,6 +246,16 @@ struct femtoDreamProducerTask { // (aod::v0data::v0radius > V0TranRadV0Min.value); to be added, not working // for now do not know why + /// General options + struct : o2::framework::ConfigurableGroup { + Configurable ConfTrkMinChi2PerClusterTPC{"ConfTrkMinChi2PerClusterTPC", 0.f, "Lower limit for chi2 of TPC; currently for testing only"}; + Configurable ConfTrkMaxChi2PerClusterTPC{"ConfTrkMaxChi2PerClusterTPC", 1000.f, "Upper limit for chi2 of TPC; currently for testing only"}; + Configurable ConfTrkMaxChi2PerClusterITS{"ConfTrkMaxChi2PerClusterITS", 1000.0f, "Minimal track selection: max allowed chi2 per ITS cluster"}; // 36.0 is default + Configurable ConfTrkTPCRefit{"ConfTrkTPCRefit", false, "True: require TPC refit"}; + Configurable ConfTrkITSRefit{"ConfTrkITSRefit", false, "True: require ITS refit"}; + + } OptionTrackSpecialSelections; + HistogramRegistry qaRegistry{"QAHistos", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry TrackRegistry{"Tracks", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry V0Registry{"V0", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -270,6 +280,8 @@ struct femtoDreamProducerTask { int CutBits = 8 * sizeof(o2::aod::femtodreamparticle::cutContainerType); TrackRegistry.add("AnalysisQA/CutCounter", "; Bit; Counter", kTH1F, {{CutBits + 1, -0.5, CutBits + 0.5}}); + TrackRegistry.add("AnalysisQA/Chi2ITSTPCperCluster", "; ITS_Chi2; TPC_Chi2", kTH2F, {{100, 0, 50}, {100, 0, 20}}); + TrackRegistry.add("AnalysisQA/RefitITSTPC", "; ITS_Refit; TPC_Refit", kTH2F, {{2, 0, 2}, {2, 0, 2}}); TrackRegistry.add("AnalysisQA/getGenStatusCode", "; Bit; Entries", kTH1F, {{200, 0, 200}}); TrackRegistry.add("AnalysisQA/getProcess", "; Bit; Entries", kTH1F, {{200, 0, 200}}); TrackRegistry.add("AnalysisQA/Mother", "; Bit; Entries", kTH1F, {{4000, -4000, 4000}}); @@ -700,9 +712,24 @@ struct femtoDreamProducerTask { /// if the most open selection criteria are not fulfilled there is no /// point looking further at the track trackCuts.fillQA(track); + + if (track.tpcChi2NCl() < OptionTrackSpecialSelections.ConfTrkMinChi2PerClusterTPC || track.tpcChi2NCl() > OptionTrackSpecialSelections.ConfTrkMaxChi2PerClusterTPC) { + continue; + } + if (track.itsChi2NCl() > OptionTrackSpecialSelections.ConfTrkMaxChi2PerClusterITS) { + continue; + } + if ((OptionTrackSpecialSelections.ConfTrkTPCRefit && !track.hasTPC()) || (OptionTrackSpecialSelections.ConfTrkITSRefit && !track.hasITS())) { + continue; + } + if (!trackCuts.isSelectedMinimal(track)) { continue; } + + TrackRegistry.fill(HIST("AnalysisQA/Chi2ITSTPCperCluster"), track.itsChi2NCl(), track.tpcChi2NCl()); + TrackRegistry.fill(HIST("AnalysisQA/RefitITSTPC"), track.hasITS(), track.hasTPC()); + trackCuts.fillQA(track); // the bit-wise container of the systematic variations is obtained std::array cutContainer; diff --git a/PWGCF/FemtoDream/Tasks/femtoDreamCollisionMasker.cxx b/PWGCF/FemtoDream/Tasks/femtoDreamCollisionMasker.cxx index 9da124d1a9c..218c69d9699 100644 --- a/PWGCF/FemtoDream/Tasks/femtoDreamCollisionMasker.cxx +++ b/PWGCF/FemtoDream/Tasks/femtoDreamCollisionMasker.cxx @@ -264,6 +264,8 @@ struct femoDreamCollisionMasker { FilterTempFitVarMax.at(CollisionMasks::kPartOne).push_back(option.defaultValue.get()); } else if (option.name.compare(std::string("ConfMinDCAxy")) == 0) { FilterTempFitVarMin.at(CollisionMasks::kPartOne).push_back(option.defaultValue.get()); + } else if (option.name.compare(std::string("ConfDCACutPtDep")) == 0) { + TrackDCACutPtDep.push_back(option.defaultValue.get()); } } } else if (device.name.find("femto-dream-triplet-task-track-track-v0") != std::string::npos) { @@ -308,6 +310,8 @@ struct femoDreamCollisionMasker { FilterPtMin.at(CollisionMasks::kPartThree).push_back(option.defaultValue.get()); } else if (option.name.compare(std::string("Conf_maxPt_V0")) == 0) { FilterPtMax.at(CollisionMasks::kPartThree).push_back(option.defaultValue.get()); + } else if (option.name.compare(std::string("ConfDCACutPtDep")) == 0) { + TrackDCACutPtDep.push_back(option.defaultValue.get()); } } } @@ -388,12 +392,24 @@ struct femoDreamCollisionMasker { if (track.partType() != static_cast(femtodreamparticle::kTrack)) { continue; } + // check filter cuts - if (track.pt() < FilterPtMin.at(P).at(index) || track.pt() > FilterPtMax.at(P).at(index) || - track.tempFitVar() > FilterTempFitVarMax.at(P).at(index) || track.tempFitVar() < FilterTempFitVarMin.at(P).at(index)) { + if (track.pt() < FilterPtMin.at(P).at(index) || track.pt() > FilterPtMax.at(P).at(index)) { // if they are not passed, skip the particle continue; } + + if (TrackDCACutPtDep.at(index)) { + if (std::fabs(track.tempFitVar()) > 0.0105f + (0.035f / std::pow(track.pt(), 1.1f))) { + continue; + } + } else { + // or cut on the DCA directly + if (track.tempFitVar() < FilterTempFitVarMin.at(P).at(index) || track.tempFitVar() > FilterTempFitVarMax.at(P).at(index)) { + continue; + } + } + // set the bit at the index of the selection equal to one if the track passes all selections // check track cuts if ((track.cut() & TrackCutBits.at(P).at(index)) == TrackCutBits.at(P).at(index)) { diff --git a/PWGCF/FemtoDream/Tasks/femtoDreamDebugV0.cxx b/PWGCF/FemtoDream/Tasks/femtoDreamDebugV0.cxx index e68104e3414..11f12ed9b44 100644 --- a/PWGCF/FemtoDream/Tasks/femtoDreamDebugV0.cxx +++ b/PWGCF/FemtoDream/Tasks/femtoDreamDebugV0.cxx @@ -16,6 +16,9 @@ #include #include #include + +#include "TVector3.h" + #include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" #include "Framework/HistogramRegistry.h" @@ -84,6 +87,7 @@ struct femtoDreamDebugV0 { posChildHistos.init(&V0Registry, ConfBinmult, ConfDummy, ConfV0ChildTempFitVarMomentumBins, ConfDummy, ConfDummy, ConfChildTempFitVarBins, ConfV0ChildNsigmaTPCBins, ConfV0ChildNsigmaTOFBins, ConfV0ChildNsigmaTPCTOFBins, ConfV0ChildNsigmaITSBins, ConfV0InvMassBins, false, ConfV01_ChildPos_PDGCode.value, true); negChildHistos.init(&V0Registry, ConfBinmult, ConfDummy, ConfV0ChildTempFitVarMomentumBins, ConfDummy, ConfDummy, ConfChildTempFitVarBins, ConfV0ChildNsigmaTPCBins, ConfV0ChildNsigmaTOFBins, ConfV0ChildNsigmaTPCTOFBins, ConfV0ChildNsigmaITSBins, ConfV0InvMassBins, false, ConfV01_ChildNeg_PDGCode, true); V0Histos.init(&V0Registry, ConfBinmult, ConfDummy, ConfV0TempFitVarMomentumBins, ConfDummy, ConfDummy, ConfV0TempFitVarBins, ConfV0ChildNsigmaTPCBins, ConfV0ChildNsigmaTOFBins, ConfV0ChildNsigmaTPCTOFBins, ConfV0ChildNsigmaITSBins, ConfV0InvMassBins, false, ConfV01_PDGCode.value, true); + V0Registry.add("hArmenterosPodolanski/hArmenterosPodolanskiPlot", "; #alpha; p_{T} (MeV/#it{c})", kTH2F, {{100, -1, 1}, {500, -0.3, 2}}); } /// Porduce QA plots for V0 selection in FemtoDream framework @@ -112,6 +116,20 @@ struct femtoDreamDebugV0 { negChild.partType() == uint8_t(aod::femtodreamparticle::ParticleType::kV0Child) && (negChild.cut() & ConfV01_ChildNeg_CutBit) == ConfV01_ChildNeg_CutBit && (negChild.pidcut() & ConfV01_ChildNeg_TPCBit) == ConfV01_ChildNeg_TPCBit) { + + TVector3 p_parent(part.px(), part.py(), part.pz()); // Parent momentum (px, py, pz) + TVector3 p_plus(posChild.px(), posChild.py(), posChild.pz()); // Daughter 1 momentum (px, py, pz) + TVector3 p_minus(negChild.px(), negChild.py(), negChild.pz()); // Daughter 2 momentum (px, py, pz) + + double pL_plus = p_plus.Dot(p_parent) / p_parent.Mag(); + double pL_minus = p_minus.Dot(p_parent) / p_parent.Mag(); + float alpha = (pL_plus - pL_minus) / (pL_plus + pL_minus); + + TVector3 p_perp = p_plus - (p_parent * (pL_plus / p_parent.Mag())); + double qtarm = p_perp.Mag(); + + V0Registry.fill(HIST("hArmenterosPodolanski/hArmenterosPodolanskiPlot"), alpha, qtarm); + V0Histos.fillQA(part, static_cast(ConfV0TempFitVarMomentum.value), col.multNtr(), col.multV0M()); posChildHistos.fillQA(posChild, static_cast(ConfV0TempFitVarMomentum.value), col.multNtr(), col.multV0M()); negChildHistos.fillQA(negChild, static_cast(ConfV0TempFitVarMomentum.value), col.multNtr(), col.multV0M()); diff --git a/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackTrack.cxx b/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackTrack.cxx index d897fa90b06..10f59840862 100644 --- a/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackTrack.cxx +++ b/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackTrack.cxx @@ -65,6 +65,7 @@ struct femtoDreamTripletTaskTrackTrackTrack { Configurable ConfTPCTOFPIDBit{"ConfTPCTOFPIDBit", 8, "PID TPCTOF bit from cutCulator"}; Configurable ConfIsMC{"ConfIsMC", false, "Enable additional Histogramms in the case of a MonteCarlo Run"}; Configurable ConfUse3D{"ConfUse3D", false, "Enable three dimensional histogramms (to be used only for analysis with high statistics): k* vs mT vs multiplicity"}; + Configurable ConfDCACutPtDep{"ConfDCACutPtDep", false, "Use pt dependent dca cut for tracks"}; // Which particles to analyse; currently support only for same species and cuts triplets Configurable ConfPDGCodePart{"ConfPDGCodePart", 2212, "Particle PDG code"}; @@ -76,15 +77,20 @@ struct femtoDreamTripletTaskTrackTrackTrack { (ncheckbit(aod::femtodreamparticle::cut, ConfCutPart)) && (aod::femtodreamparticle::pt < ConfMaxpT) && (aod::femtodreamparticle::pt > ConfMinpT) && - (aod::femtodreamparticle::tempFitVar < ConfMaxDCAxy) && - (aod::femtodreamparticle::tempFitVar > ConfMinDCAxy); + ifnode(ConfDCACutPtDep, (nabs(aod::femtodreamparticle::tempFitVar) <= 0.0105f + (0.035f / npow(aod::femtodreamparticle::pt, 1.1f))), + ((aod::femtodreamparticle::tempFitVar >= ConfMinDCAxy) && + (aod::femtodreamparticle::tempFitVar <= ConfMaxDCAxy))); + ; + Partition> SelectedPartsMC = (aod::femtodreamparticle::partType == uint8_t(aod::femtodreamparticle::ParticleType::kTrack)) && ifnode(aod::femtodreamparticle::pt * (nexp(aod::femtodreamparticle::eta) + nexp(-1.f * aod::femtodreamparticle::eta)) / 2.f <= ConfPIDthrMom, ncheckbit(aod::femtodreamparticle::pidcut, ConfTPCPIDBit), ncheckbit(aod::femtodreamparticle::pidcut, ConfTPCTOFPIDBit)) && (ncheckbit(aod::femtodreamparticle::cut, ConfCutPart)) && (aod::femtodreamparticle::pt < ConfMaxpT) && (aod::femtodreamparticle::pt > ConfMinpT) && - (aod::femtodreamparticle::tempFitVar < ConfMaxDCAxy) && - (aod::femtodreamparticle::tempFitVar > ConfMinDCAxy); + ifnode(ConfDCACutPtDep, (nabs(aod::femtodreamparticle::tempFitVar) <= 0.0105f + (0.035f / npow(aod::femtodreamparticle::pt, 1.1f))), + ((aod::femtodreamparticle::tempFitVar >= ConfMinDCAxy) && + (aod::femtodreamparticle::tempFitVar <= ConfMaxDCAxy))); + ; /// Histogramming of Selected Particles FemtoDreamParticleHisto trackHistoSelectedParts; diff --git a/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackV0.cxx b/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackV0.cxx index c1f7a9ead68..b61191caeb5 100644 --- a/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackV0.cxx +++ b/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackV0.cxx @@ -69,6 +69,7 @@ struct femtoDreamTripletTaskTrackTrackV0 { Configurable ConfPIDthrMom{"ConfPIDthrMom", 1.f, "Momentum threshold from which TPC and TOF are required for PID"}; Configurable ConfIsMC{"ConfIsMC", false, "Enable additional Histogramms in the case of a MonteCarlo Run"}; Configurable ConfUse3D{"ConfUse3D", false, "Enable three dimensional histogramms (to be used only for analysis with high statistics): k* vs mT vs multiplicity"}; + Configurable ConfDCACutPtDep{"ConfDCACutPtDep", false, "Use pt dependent dca cut for tracks"}; /// Partition for selected particles Partition SelectedParts = (aod::femtodreamparticle::partType == uint8_t(aod::femtodreamparticle::ParticleType::kTrack)) && @@ -76,15 +77,20 @@ struct femtoDreamTripletTaskTrackTrackV0 { (ncheckbit(aod::femtodreamparticle::cut, ConfCutPart)) && (aod::femtodreamparticle::pt < ConfMaxpT) && (aod::femtodreamparticle::pt > ConfMinpT) && - (aod::femtodreamparticle::tempFitVar < ConfMaxDCAxy) && - (aod::femtodreamparticle::tempFitVar > ConfMinDCAxy); + ifnode(ConfDCACutPtDep, (nabs(aod::femtodreamparticle::tempFitVar) <= 0.0105f + (0.035f / npow(aod::femtodreamparticle::pt, 1.1f))), + ((aod::femtodreamparticle::tempFitVar >= ConfMinDCAxy) && + (aod::femtodreamparticle::tempFitVar <= ConfMaxDCAxy))); + ; + Partition> SelectedPartsMC = (aod::femtodreamparticle::partType == uint8_t(aod::femtodreamparticle::ParticleType::kTrack)) && ifnode(aod::femtodreamparticle::pt * (nexp(aod::femtodreamparticle::eta) + nexp(-1.f * aod::femtodreamparticle::eta)) / 2.f <= ConfPIDthrMom, ncheckbit(aod::femtodreamparticle::pidcut, ConfTPCPIDBit), ncheckbit(aod::femtodreamparticle::pidcut, ConfTPCTOFPIDBit)) && (ncheckbit(aod::femtodreamparticle::cut, ConfCutPart)) && (aod::femtodreamparticle::pt < ConfMaxpT) && (aod::femtodreamparticle::pt > ConfMinpT) && - (aod::femtodreamparticle::tempFitVar < ConfMaxDCAxy) && - (aod::femtodreamparticle::tempFitVar > ConfMinDCAxy); + ifnode(ConfDCACutPtDep, (nabs(aod::femtodreamparticle::tempFitVar) <= 0.0105f + (0.035f / npow(aod::femtodreamparticle::pt, 1.1f))), + ((aod::femtodreamparticle::tempFitVar >= ConfMinDCAxy) && + (aod::femtodreamparticle::tempFitVar <= ConfMaxDCAxy))); + ; /// Histogramming of selected tracks FemtoDreamParticleHisto trackHistoSelectedParts; From 4a742711e0f03b1db7dbd002adc35eba576d1d1f Mon Sep 17 00:00:00 2001 From: omvazque Date: Mon, 17 Feb 2025 01:46:27 -0600 Subject: [PATCH 0259/1650] [PWGLF] Updates to MC (#9998) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 517 +++++++++---------- 1 file changed, 255 insertions(+), 262 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index a80ef21071f..4e098871b14 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -48,18 +48,18 @@ using namespace o2::constants::math; namespace o2::aod { -using ColEvSels = soa::Join; +using ColEvSels = + soa::Join; using BCsRun3 = soa::Join; using TracksSel = soa::Join; -} // namespace o2::aod - using SimCollisions = soa::Join; using SimTracks = soa::Join; +} // namespace o2::aod struct UccZdc { // Event selection @@ -89,14 +89,12 @@ struct UccZdc { // Configurable par0{"par0", 0.0105, "par 0"}; // Configurable par1{"par1", 0.035, "par 1"}; // Configurables, binning - Configurable nBinsAmpFV0{"nBinsAmpFV0", 1000, - "Number of bins FV0 amplitude"}; - Configurable maxAmpFV0{"maxAmpFV0", 3000, "Max FV0 amplitude"}; - Configurable nBinsAmpFT0{"nBinsAmpFT0", 1000, - "Number of bins FT0 amplitude"}; - Configurable maxAmpFT0{"maxAmpFT0", 3000, "Max FT0 amplitude"}; - Configurable nBinsNch{"nBinsNch", 2500, "# of bins for midrapidity Nch"}; - Configurable maxNch{"maxNch", 2500, "Max Nch at midrapidity"}; + Configurable nBinsAmpFV0{"nBinsAmpFV0", 1000, "N bins FV0 amp"}; + Configurable maxAmpFV0{"maxAmpFV0", 3000, "Max FV0 amp"}; + Configurable nBinsAmpFT0{"nBinsAmpFT0", 1000, "N bins FT0 amp"}; + Configurable maxAmpFT0{"maxAmpFT0", 3000, "Max FT0 amp"}; + Configurable nBinsNch{"nBinsNch", 2500, "N bins Nch (|eta|<0.8)"}; + Configurable maxNch{"maxNch", 2500, "Max Nch (|eta|<0.8)"}; Configurable nBinsZDC{"nBinsZDC", 1025, "nBinsZDC"}; Configurable nBinsZEM{"nBinsZEM", 100, "nBinsZEM"}; Configurable maxZN{"maxZN", 4099.5, "Max ZN signal"}; @@ -128,32 +126,36 @@ struct UccZdc { Configurable zemCut{"zemCut", 1000.0, "ZEM cut"}; Configurable tdcCut{"tdcCut", 1.0, "TDC cut"}; - // Configurable tdcZNmincut{"tdcZNmincut", -4.0, "Min ZN TDC cut"}; - // Configurable tdcZNmaxcut{"tdcZNmaxcut", -4.0, "Max ZN TDC cut"}; - // Configurable tdcZPmincut{"tdcZPmincut", -4.0, "Min ZP TDC cut"}; - // Configurable tdcZPmaxcut{"tdcZPmaxcut", -4.0, "Max ZP TDC cut"}; + enum EvCutLabel { All = 1, + SelEigth, + NoSameBunchPileup, + IsGoodZvtxFT0vsPV, + IsVertexITSTPC, + IsVertexTOFmatched, + Centrality, + VtxZ, + CentralityCut, + Zdc, + TZero, + Tdc, + Zem }; // Filters Filter collFilter = (nabs(aod::collision::posZ) < posZcut); Filter trackFilter = (requireGlobalTrackInFilter()); // Apply Filters - using TheFilteredCollisions = soa::Filtered; - using TheFilteredCollision = TheFilteredCollisions::iterator; + // using TheFilteredCollisions = soa::Filtered; + // using TheFilteredCollision = TheFilteredCollisions::iterator; using TheFilteredTracks = soa::Filtered; // using TheFilteredTrack = TheFilteredTracks::iterator; - // Histograms: Data - HistogramRegistry registryData{ - "registryData", - {}, - OutputObjHandlingPolicy::AnalysisObject, - true, - true}; + using TheFilteredSimCollisions = soa::Filtered; + using TheFilteredSimTracks = soa::Filtered; - // Histograms: Sim - HistogramRegistry registrySim{ - "registrySim", + // Histograms: Data + HistogramRegistry registry{ + "registry", {}, OutputObjHandlingPolicy::AnalysisObject, true, @@ -162,7 +164,8 @@ struct UccZdc { void init(InitContext const&) { // define axes you want to use - const AxisSpec axisEvent{15, 0., +15.0, ""}; + const AxisSpec axisZpos{48, -12., 12., "Vtx_{z} (cm)"}; + const AxisSpec axisEvent{14, 0.5, 14.5, ""}; const AxisSpec axisEta{30, -1.5, +1.5, "#eta"}; const AxisSpec axisPt{binsPt, "#it{p}_{T} (GeV/#it{c})"}; const AxisSpec axisDeltaPt{100, -1.0, +1.0, "#Delta(p_{T})"}; @@ -170,16 +173,9 @@ struct UccZdc { const AxisSpec axisAmpCh{250, 0., 2500., "Amplitude of non-zero channels"}; const AxisSpec axisEneCh{300, 0., 300., "Energy of non-zero channels"}; - // Histograms: paritcle-level info - registryData.add("EtaVsPhi", ";#eta;#varphi", kTH2F, - {{{axisEta}, {100, -0.1 * PI, +2.1 * PI}}}); - registryData.add("etaHistogram", "etaHistogram", kTH1F, {axisEta}); - registryData.add("ptHistogram", "ptHistogram", kTH1F, {axisPt}); - registryData.add("dcaXYvspT", "", kTH2F, {{{50, -1., 1.}, {axisPt}}}); - registryData.add("T0Ccent", ";T0C centrality;Entries", kTH1F, {axisCent}); - registryData.add("hEventCounter", "Event counter", kTH1F, {axisEvent}); - - auto hstat = registryData.get(HIST("hEventCounter")); + registry.add("zPos", ";;Entries;", kTH1F, {axisZpos}); + registry.add("hEventCounter", ";;Events", kTH1F, {axisEvent}); + auto hstat = registry.get(HIST("hEventCounter")); auto* x = hstat->GetXaxis(); x->SetBinLabel(1, "All events"); x->SetBinLabel(2, "sel8"); @@ -188,139 +184,144 @@ struct UccZdc { x->SetBinLabel(5, "kIsVertexITSTPC"); x->SetBinLabel(6, "kIsVertexTOFmatched"); x->SetBinLabel(7, "Centrality"); - x->SetBinLabel(8, "has ZDC?"); - x->SetBinLabel(9, "has T0?"); - x->SetBinLabel(10, "has V0A?"); - x->SetBinLabel(11, "inside TDC cut?"); - x->SetBinLabel(12, "within ZEM cut?"); - x->SetBinLabel(13, "minSetBinLabel(8, "VtxZ"); + x->SetBinLabel(9, "Centrality cut"); + x->SetBinLabel(10, "has ZDC?"); + x->SetBinLabel(11, "has T0?"); + x->SetBinLabel(12, "inside TDC cut?"); + x->SetBinLabel(13, "within ZEM cut?"); + + // Histograms: paritcle-level info + if (doprocessZdcCollAss) { + registry.add("EtaVsPhi", ";#eta;#varphi", kTH2F, + {{{axisEta}, {100, -0.1 * PI, +2.1 * PI}}}); + registry.add("etaHistogram", "etaHistogram", kTH1F, {axisEta}); + registry.add("ptHistogram", "ptHistogram", kTH1F, {axisPt}); + registry.add("dcaXYvspT", "", kTH2F, {{{50, -1., 1.}, {axisPt}}}); + registry.add("T0Ccent", ";T0C centrality;Entries", kTH1F, {axisCent}); + registry.add("Nch", ";Nch (|#eta|<0.8);", kTH1F, + {{nBinsNch, -0.5, maxNch}}); + registry.add("ZNA", "", kTH1F, {{nBinsZDC, -0.5, maxZN}}); + registry.add("ZPA", "", kTH1F, {{nBinsZDC, -0.5, maxZP}}); + registry.add("ZNC", "", kTH1F, {{nBinsZDC, -0.5, maxZN}}); + registry.add("ZPC", "", kTH1F, {{nBinsZDC, -0.5, maxZP}}); + registry.add("ZNvsZEM", "ZNvsZEM; ZEM; ZNA+ZNC", kTH2F, + {{{nBinsZDC, -0.5, maxZEM}, {nBinsZEM, -0.5, maxZN}}}); + registry.add("ZNAvsZNC", "ZNAvsZNC; ZNC; ZNA", kTH2F, + {{{nBinsZDC, -0.5, maxZN}, {nBinsZDC, -0.5, maxZN}}}); + registry.add("ZPAvsZPC", "ZPAvsZPC; ZPA; ZPC", kTH2F, + {{{nBinsZDC, -0.5, maxZP}, {nBinsZDC, -0.5, maxZP}}}); + registry.add("ZNAvsZPA", "ZNAvsZPA; ZPA; ZNA", kTH2F, + {{{nBinsZDC, -0.5, maxZP}, {nBinsZDC, -0.5, maxZN}}}); + registry.add("ZNCvsZPC", "ZNCvsZPC; ZPC; ZNC", kTH2F, + {{{nBinsZDC, -0.5, maxZP}, {nBinsZDC, -0.5, maxZN}}}); + registry.add("ZNCvstdc", "ZNCvstdc; time ZNC; ZNC", kTH2F, + {{{nBinsTDC, minTdc, maxTdc}, {nBinsZDC, -0.5, maxZN}}}); + registry.add("ZNAvstdc", "ZNAvstdc; time ZNA; ZNA", kTH2F, + {{{nBinsTDC, minTdc, maxTdc}, {nBinsZDC, -0.5, maxZN}}}); + registry.add("ZPCvstdc", "ZPCvstdc; time ZPC; ZPC", kTH2F, + {{{nBinsTDC, minTdc, maxTdc}, {nBinsZDC, -0.5, maxZP}}}); + registry.add("ZPAvstdc", "ZPAvstdc; time ZPA; ZPA", kTH2F, + {{{nBinsTDC, minTdc, maxTdc}, {nBinsZDC, -0.5, maxZP}}}); + registry.add("ZEM1vstdc", "ZEM1vstdc; time ZEM1; ZEM1", kTH2F, + {{{nBinsTDC, minTdc, maxTdc}, {nBinsZEM, -0.5, maxZEM}}}); + registry.add("ZEM2vstdc", "ZEM2vstdc; time ZEM2; ZEM2", kTH2F, + {{{nBinsTDC, minTdc, maxTdc}, {nBinsZEM, -0.5, maxZEM}}}); + registry.add("debunch", ";t_{ZDC}-t_{ZDA};t_{ZDC}+t_{ZDA}", kTH2F, + {{{nBinsTDC, minTdc, maxTdc}, {nBinsTDC, minTdc, maxTdc}}}); + registry.add("NchvsFT0C", ";T0C;N_{ch} (|#eta|<0.8);", kTH2F, + {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsNch, -0.5, maxNch}}}); + registry.add("NchvsFT0A", ";T0A;N_{ch} (|#eta|<0.8);", kTH2F, + {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsNch, -0.5, maxNch}}}); + registry.add("NchvsFV0A", ";V0A;N_{ch} (|#eta|<0.8);", kTH2F, + {{{nBinsAmpFV0, 0., maxAmpFV0}, {nBinsNch, -0.5, maxNch}}}); + registry.add("NchvsNPV", ";NPVTracks (|#eta|<1);N_{ch} (|#eta|<0.8);", + kTH2F, + {{{nBinsNch, -0.5, maxNch}, {nBinsNch, -0.5, maxNch}}}); + registry.add("ZNCvsNch", ";Nch (|#eta|<0.8);ZNC", kTH2F, + {{{nBinsNch, -0.5, maxNch}, {nBinsZDC, -0.5, maxZN}}}); + registry.add("ZNAvsNch", ";Nch (|#eta|<0.8);ZNA", kTH2F, + {{{nBinsNch, -0.5, maxNch}, {nBinsZDC, -0.5, maxZN}}}); + registry.add("ZNCvsNchvspT", ";Nch (|#eta|<0.8);ZNC;[p_{T}]", kTH3F, + {{{nBinsNch, -0.5, maxNch}, + {nBinsZDC, -0.5, maxZN}, + {nBinsMeanpT, minMeanpT, maxMeanpT}}}); + registry.add("ZNAvsNchvspT", ";Nch (|#eta|<0.8);ZNA;[p_{T}]", kTH3F, + {{{nBinsNch, -0.5, maxNch}, + {nBinsZDC, -0.5, maxZN}, + {nBinsMeanpT, minMeanpT, maxMeanpT}}}); + } // MC Histograms - registrySim.add("hEvent_MC_rec", "Event counter", kTH1F, {axisEvent}); - registrySim.add("hT0C_cent_rec", ";T0C centrality;Entries", kTH1F, - {axisCent}); - registrySim.add("Pt_MC_rec_ch", ";p_{T};Entries;", kTH1F, {axisPt}); - registrySim.add("Pt_MC_rec_pi", ";p_{T};Entries;", kTH1F, {axisPt}); - registrySim.add("Pt_MC_rec_ka", ";p_{T};Entries;", kTH1F, {axisPt}); - registrySim.add("Pt_MC_rec_pr", ";p_{T};Entries;", kTH1F, {axisPt}); - registrySim.add("Pt_MC_rec_sigpos", "#Sigma^{+};p_{T};Entries;", kTH1F, - {axisPt}); - registrySim.add("Pt_MC_rec_signeg", "#Sigma^{-};p_{T};Entries;", kTH1F, - {axisPt}); - registrySim.add("Pt_MC_rec_re", "Remaining ch particles;p_{T};Entries;", - kTH1F, {axisPt}); - registrySim.add("EtaVsPhi_MC_rec", ";#eta;#varphi", kTH2F, - {{{axisEta}, {100, -0.1 * PI, +2.1 * PI}}}); - - registrySim.add("numberOfRecoCollisions", "", - {HistType::kTH1F, {{6, -0.5, 5.5}}}); - registrySim.add("hEvent_MC_tru", "Event counter", kTH1F, {axisEvent}); - registrySim.add("hZpos_MC_tru", "z_{vtx}", - {HistType::kTH1F, {{48, -12., 12}}}); - registrySim.add("hZpos_MC_rec", "z_{vtx}", - {HistType::kTH1F, {{48, -12., 12}}}); - registrySim.add( - "aV0Avsb", ";V0A amplitude; Impact parameter", - {HistType::kTH2F, {{{nBinsAmpFV0, 0., maxAmpFV0}, {19, 0., 18.}}}}); - registrySim.add( - "aT0Avsb", ";T0A amplitude; Impact parameter", - {HistType::kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {19, 0., 18.}}}}); - registrySim.add( - "aT0Cvsb", ";T0C amplitude; Impact parameter", - {HistType::kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {19, -0.5, 18.5}}}}); - registrySim.add("Pt_MC_tru_ch", ";p_{T};Entries;", kTH1F, {axisPt}); - registrySim.add("Pt_MC_tru_pi", ";p_{T};Entries;", kTH1F, {axisPt}); - registrySim.add("Pt_MC_tru_ka", ";p_{T};Entries;", kTH1F, {axisPt}); - registrySim.add("Pt_MC_tru_pr", ";p_{T};Entries;", kTH1F, {axisPt}); - registrySim.add("Pt_MC_tru_sigpos", "#Sigma^{+};p_{T};Entries;", kTH1F, - {axisPt}); - registrySim.add("Pt_MC_tru_signeg", "#Sigma^{-};p_{T};Entries;", kTH1F, - {axisPt}); - registrySim.add("Pt_MC_tru_re", "Remaining ch particles;p_{T};Entries;", - kTH1F, {axisPt}); + if (doprocessMC) { + registry.add("hT0C_cent_rec", ";T0C centrality;Entries", kTH1F, + {axisCent}); + registry.add("Pt_MC_rec_all_ch", ";;Entries;", kTH1F, {axisPt}); + registry.add("Pt_MC_rec_ch", ";;Entries;", kTH1F, {axisPt}); + registry.add("Pt_MC_rec_pi", ";;Entries;", kTH1F, {axisPt}); + registry.add("Pt_MC_rec_ka", ";;Entries;", kTH1F, {axisPt}); + registry.add("Pt_MC_rec_pr", ";;Entries;", kTH1F, {axisPt}); + registry.add("Pt_MC_rec_sigpos", ";;Entries;", kTH1F, {axisPt}); + registry.add("Pt_MC_rec_signeg", ";;Entries;", kTH1F, {axisPt}); + registry.add("Pt_MC_rec_re", ";;Entries;", kTH1F, {axisPt}); + registry.add("EtaVsPhi_MC_rec", ";;#varphi;", kTH2F, + {{{axisEta}, {100, -0.1 * PI, +2.1 * PI}}}); + + // registry.add("numberOfRecoCollisions", "", + // {HistType::kTH1F, {{6, -0.5, 5.5}}}); + registry.add("hEventCounter_MC", "Event counter", kTH1F, {axisEvent}); + registry.add("zPos_MC", ";;Entries;", kTH1F, {axisZpos}); + registry.add("aV0Avsb", ";V0A amplitude;Impact parameter", kTH2F, + {{{nBinsAmpFV0, 0., maxAmpFV0}, {19, 0., 18.}}}); + registry.add("aT0Avsb", ";T0A amplitude; Impact parameter", kTH2F, + {{{nBinsAmpFT0, 0., maxAmpFT0}, {19, 0., 18.}}}); + registry.add("aT0Cvsb", ";T0C amplitude; Impact parameter", kTH2F, + {{{nBinsAmpFT0, 0., maxAmpFT0}, {19, -0.5, 18.5}}}); + registry.add("Pt_MC_tru_ch", ";p_{T};Entries;", kTH1F, {axisPt}); + registry.add("Pt_MC_tru_pi", ";p_{T};Entries;", kTH1F, {axisPt}); + registry.add("Pt_MC_tru_ka", ";p_{T};Entries;", kTH1F, {axisPt}); + registry.add("Pt_MC_tru_pr", ";p_{T};Entries;", kTH1F, {axisPt}); + registry.add("Pt_MC_tru_sigpos", "#Sigma^{+};p_{T};Entries;", kTH1F, + {axisPt}); + registry.add("Pt_MC_tru_signeg", "#Sigma^{-};p_{T};Entries;", kTH1F, + {axisPt}); + registry.add("Pt_MC_tru_re", "Remaining ch particles;p_{T};Entries;", + kTH1F, {axisPt}); + } } template bool isEventSelected(CheckCol const& col) { - registryData.fill(HIST("hEventCounter"), 0.5); + registry.fill(HIST("hEventCounter"), EvCutLabel::All); if (!col.sel8()) { return false; } - registryData.fill(HIST("hEventCounter"), 1.5); + registry.fill(HIST("hEventCounter"), EvCutLabel::SelEigth); if (isApplySameBunchPileup && !col.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { return false; } - registryData.fill(HIST("hEventCounter"), 2.5); + registry.fill(HIST("hEventCounter"), EvCutLabel::NoSameBunchPileup); if (isApplyGoodZvtxFT0vsPV && !col.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { return false; } - registryData.fill(HIST("hEventCounter"), 3.5); + registry.fill(HIST("hEventCounter"), EvCutLabel::IsGoodZvtxFT0vsPV); if (isApplyVertexITSTPC && !col.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) { return false; } - registryData.fill(HIST("hEventCounter"), 4.5); + registry.fill(HIST("hEventCounter"), EvCutLabel::IsVertexITSTPC); if (isApplyVertexTOFmatched && !col.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) { return false; } - registryData.fill(HIST("hEventCounter"), 5.5); + registry.fill(HIST("hEventCounter"), EvCutLabel::IsVertexTOFmatched); // if (isApplyVertexTRDmatched && // !col.selection_bit(o2::aod::evsel::kIsVertexTRDmatched)) { @@ -331,7 +332,19 @@ struct UccZdc { if (col.centFT0C() < 0. || col.centFT0C() > 100.) { return false; } - registryData.fill(HIST("hEventCounter"), 6.5); + registry.fill(HIST("hEventCounter"), EvCutLabel::Centrality); + + // Z-vertex position cut + if (std::fabs(col.posZ()) > posZcut) { + return false; + } + registry.fill(HIST("hEventCounter"), EvCutLabel::VtxZ); + + // T0C centrality cut + if (col.centFT0C() < minT0CcentCut || col.centFT0C() > maxT0CcentCut) { + return false; + } + registry.fill(HIST("hEventCounter"), EvCutLabel::CentralityCut); // if (isApplyExtraCorrCut && col.multNTracksPV() > npvTracksCut && // col.multFT0C() < (10 * col.multNTracksPV() - ft0cCut)) { @@ -359,7 +372,7 @@ struct UccZdc { return true; } - void processZdcCollAss(TheFilteredCollision const& collision, + void processZdcCollAss(o2::aod::ColEvSels::iterator const& collision, o2::aod::BCsRun3 const& /*bcs*/, aod::Zdcs const& /*zdcs*/, aod::FV0As const& /*fv0as*/, aod::FT0s const& /*ft0s*/, @@ -373,12 +386,11 @@ struct UccZdc { if (!foundBC.has_zdc()) { // has ZDC? return; } - registryData.fill(HIST("hEventCounter"), 7.5); + registry.fill(HIST("hEventCounter"), EvCutLabel::Zdc); float aT0A{0.0}; float aT0C{0.0}; float aV0A{0.0}; - float sumT0s{0.0}; float znA{0.0}; float znC{0.0}; float zpA{0.0}; @@ -442,12 +454,10 @@ struct UccZdc { for (const auto& amplitude : foundBC.ft0().amplitudeC()) { aT0C += amplitude; } - sumT0s = aT0A + aT0C; } else { - sumT0s = -999.; return; } - registryData.fill(HIST("hEventCounter"), 8.5); + registry.fill(HIST("hEventCounter"), EvCutLabel::TZero); if (foundBC.has_fv0a()) { for (const auto& amplitude : foundBC.fv0a().amplitude()) { @@ -455,9 +465,7 @@ struct UccZdc { } } else { aV0A = -999.; - return; } - registryData.fill(HIST("hEventCounter"), 9.5); // TDC cut if (isTDCcut) { @@ -465,7 +473,7 @@ struct UccZdc { return; } } - registryData.fill(HIST("hEventCounter"), 10.5); + registry.fill(HIST("hEventCounter"), EvCutLabel::Tdc); // ZEM cut if (isZEMcut) { @@ -473,86 +481,92 @@ struct UccZdc { return; } } - registryData.fill(HIST("hEventCounter"), 11.5); - // T0C centrality cut - if (collision.centFT0C() < minT0CcentCut || - collision.centFT0C() > maxT0CcentCut) { - return; - } - - registryData.fill(HIST("zPos"), collision.posZ()); - registryData.fill(HIST("hEventCounter"), 12.5); - registryData.fill(HIST("T0Ccent"), collision.centFT0C()); - registryData.fill(HIST("ZNA"), znA); - registryData.fill(HIST("ZNC"), znC); - registryData.fill(HIST("ZPA"), zpA); - registryData.fill(HIST("ZPC"), zpC); - registryData.fill(HIST("ZNAvsZNC"), znC, znA); - registryData.fill(HIST("ZNAvsZPA"), zpA, znA); - registryData.fill(HIST("ZNCvsZPC"), zpC, znC); - registryData.fill(HIST("ZPAvsZPC"), zpC, zpA); - registryData.fill(HIST("ZNvsZEM"), sumZEMs, sumZNs); - registryData.fill(HIST("ZNvsFV0A"), aV0A / 100., sumZNs); - registryData.fill(HIST("ZNvsFT0"), sumT0s / 100., sumZNs); - registryData.fill(HIST("ZNCvstdc"), tZNC, znC); - registryData.fill(HIST("ZNAvstdc"), tZNA, znA); - registryData.fill(HIST("ZPCvstdc"), tZPC, zpC); - registryData.fill(HIST("ZPAvstdc"), tZPA, zpA); - registryData.fill(HIST("ZEM1vstdc"), tZEM1, aZEM1); - registryData.fill(HIST("ZEM2vstdc"), tZEM2, aZEM2); - registryData.fill(HIST("debunch"), tZDCdif, tZDCsum); - - float meanpT{0.0}; + registry.fill(HIST("hEventCounter"), EvCutLabel::Zem); + registry.fill(HIST("zPos"), collision.posZ()); + registry.fill(HIST("T0Ccent"), collision.centFT0C()); + registry.fill(HIST("ZNA"), znA); + registry.fill(HIST("ZNC"), znC); + registry.fill(HIST("ZPA"), zpA); + registry.fill(HIST("ZPC"), zpC); + registry.fill(HIST("ZNAvsZNC"), znC, znA); + registry.fill(HIST("ZNAvsZPA"), zpA, znA); + registry.fill(HIST("ZNCvsZPC"), zpC, znC); + registry.fill(HIST("ZPAvsZPC"), zpC, zpA); + registry.fill(HIST("ZNvsZEM"), sumZEMs, sumZNs); + registry.fill(HIST("ZNCvstdc"), tZNC, znC); + registry.fill(HIST("ZNAvstdc"), tZNA, znA); + registry.fill(HIST("ZPCvstdc"), tZPC, zpC); + registry.fill(HIST("ZPAvstdc"), tZPA, zpA); + registry.fill(HIST("ZEM1vstdc"), tZEM1, aZEM1); + registry.fill(HIST("ZEM2vstdc"), tZEM2, aZEM2); + registry.fill(HIST("debunch"), tZDCdif, tZDCsum); + + float p1{0.0}; + // float p2{0.0}; + float oneParCorr{0.0}; + // float twoParCorr{0.0}; const int64_t nch{tracks.size()}; for (const auto& track : tracks) { // Track Selection - // if (!track.isGlobalTrack()) { + if (!track.isGlobalTrack()) { + continue; + } + // if (track.eta() < minEta || track.eta() > maxEta) { // continue; // } // if (track.pt() < minPt || track.pt() > maxPt) { // continue; // } - // if (!passedTrackSelection(track)) { - // continue; - // } - meanpT += track.pt(); - registryData.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); - registryData.fill(HIST("etaHistogram"), track.eta()); - registryData.fill(HIST("ptHistogram"), track.pt()); - registryData.fill(HIST("dcaXYvspT"), track.dcaXY(), track.pt()); + + float pt{track.pt()}; + p1 += pt; + // p2 += std::pow(pt, 2.); + + registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); + registry.fill(HIST("etaHistogram"), track.eta()); + registry.fill(HIST("ptHistogram"), track.pt()); + registry.fill(HIST("dcaXYvspT"), track.dcaXY(), track.pt()); } + oneParCorr = p1; + // twoParCorr = std::pow(p1, 2.) - p2; + // std::cout << "twoParCorr= " << twoParCorr << '\n'; + if (nch > 0) { - meanpT /= nch; + oneParCorr /= nch; } - registryData.fill(HIST("Nch"), nch); - registryData.fill(HIST("ZNAvsNch"), nch, znA); - registryData.fill(HIST("ZNCvsNch"), nch, znC); - registryData.fill(HIST("ZNCvsNchvspT"), nch, znC, meanpT); - registryData.fill(HIST("ZNAvsNchvspT"), nch, znA, meanpT); + + registry.fill(HIST("NchvsFV0A"), aV0A / 100., nch); + registry.fill(HIST("NchvsFT0A"), aT0A / 100., nch); + registry.fill(HIST("NchvsFT0C"), aT0C / 100., nch); + registry.fill(HIST("NchvsNPV"), collision.multNTracksPVeta1(), nch); + registry.fill(HIST("Nch"), nch); + registry.fill(HIST("ZNAvsNch"), nch, znA); + registry.fill(HIST("ZNCvsNch"), nch, znC); + registry.fill(HIST("ZNCvsNchvspT"), nch, znC, oneParCorr); + registry.fill(HIST("ZNAvsNchvspT"), nch, znA, oneParCorr); } - PROCESS_SWITCH(UccZdc, processZdcCollAss, - "Processing ZDC w. collision association", true); + PROCESS_SWITCH(UccZdc, processZdcCollAss, "Process ZDC W/Coll Ass.", true); Preslice perMCCollision = aod::mcparticle::mcCollisionId; - Preslice perCollision = aod::track::collisionId; + Preslice perCollision = aod::track::collisionId; void processMC(aod::McCollisions const& mcCollisions, o2::aod::BCsRun3 const& /*bcs*/, aod::Zdcs const& /*zdcs*/, aod::FT0s const& /*ft0s*/, aod::FV0As const& /*fv0as*/, - SimCollisions const& collisions, + o2::aod::SimCollisions const& collisions, aod::McParticles const& mcParticles, - SimTracks const& simTracks) + TheFilteredSimTracks const& simTracks) { // Generated MC for (const auto& mccollision : mcCollisions) { - registrySim.fill(HIST("hEvent_MC_tru"), 0.5); + registry.fill(HIST("hEventCounter_MC"), EvCutLabel::All); // Z-vtx position cut if (std::fabs(mccollision.posZ()) > posZcut) { continue; } - registrySim.fill(HIST("hZpos_MC_tru"), mccollision.posZ()); - registrySim.fill(HIST("hEvent_MC_tru"), 1.5); + registry.fill(HIST("zPos_MC"), mccollision.posZ()); + registry.fill(HIST("hEventCounter_MC"), EvCutLabel::VtxZ); auto mcParticlesPerColl = mcParticles.sliceBy(perMCCollision, mccollision.globalIndex()); @@ -564,65 +578,50 @@ struct UccZdc { if (particle.pt() < minPt || particle.pt() > maxPt) { continue; } - registrySim.fill(HIST("Pt_MC_tru_ch"), particle.pt()); + if (!particle.isPhysicalPrimary()) { + continue; + } + registry.fill(HIST("Pt_MC_tru_ch"), particle.pt()); if (particle.pdgCode() == PDG_t::kPiPlus || particle.pdgCode() == PDG_t::kPiMinus) { // pion - registrySim.fill(HIST("Pt_MC_tru_pi"), particle.pt()); + registry.fill(HIST("Pt_MC_tru_pi"), particle.pt()); } else if (particle.pdgCode() == PDG_t::kKPlus || particle.pdgCode() == PDG_t::kKMinus) { // kaon - registrySim.fill(HIST("Pt_MC_tru_ka"), particle.pt()); + registry.fill(HIST("Pt_MC_tru_ka"), particle.pt()); } else if (particle.pdgCode() == PDG_t::kProton || particle.pdgCode() == PDG_t::kProtonBar) { // proton - registrySim.fill(HIST("Pt_MC_tru_pr"), particle.pt()); + registry.fill(HIST("Pt_MC_tru_pr"), particle.pt()); } else if (particle.pdgCode() == PDG_t::kSigmaPlus || particle.pdgCode() == PDG_t::kSigmaBarMinus) { // positive sigma - registrySim.fill(HIST("Pt_MC_tru_sigpos"), particle.pt()); + registry.fill(HIST("Pt_MC_tru_sigpos"), particle.pt()); } else if (particle.pdgCode() == PDG_t::kSigmaMinus || particle.pdgCode() == PDG_t::kSigmaBarPlus) { // negative sigma - registrySim.fill(HIST("Pt_MC_tru_signeg"), particle.pt()); + registry.fill(HIST("Pt_MC_tru_signeg"), particle.pt()); } else { // rest - registrySim.fill(HIST("Pt_MC_tru_re"), particle.pt()); + registry.fill(HIST("Pt_MC_tru_re"), particle.pt()); } } } - registrySim.fill(HIST("numberOfRecoCollisions"), collisions.size()); + // registry.fill(HIST("numberOfRecoCollisions"), collisions.size()); // if (collisions.size() == 0 || collisions.size() > 1) { // return; // } //----- MC reconstructed -----// for (const auto& collision : collisions) { - if (!collision.has_mcCollision()) { - continue; - } - const auto& mccollision = collision.mcCollision_as(); - registrySim.fill(HIST("hEvent_MC_rec"), 0.5); - - // Event Selection - if (!collision.sel8()) { - continue; - } - registrySim.fill(HIST("hEvent_MC_rec"), 1.5); - - // Z-vertex position cut - if (std::fabs(collision.posZ()) > posZcut) { + // Event selection + if (!isEventSelected(collision)) { continue; } - - // T0C centrality cut - if (collision.centFT0C() < minT0CcentCut || - collision.centFT0C() > maxT0CcentCut) { + // MC collision? + if (!collision.has_mcCollision()) { continue; } - - registrySim.fill(HIST("hEvent_MC_rec"), 2.5); - registrySim.fill(HIST("hZpos_MC_rec"), collision.posZ()); - + const auto& mccollision = collision.mcCollision_as(); const auto& foundBC = collision.foundBC_as(); - if (foundBC.has_zdc()) { - return; - } + registry.fill(HIST("zPos"), collision.posZ()); + float aT0A{0.0}; float aT0C{0.0}; float aV0A{0.0}; @@ -645,55 +644,49 @@ struct UccZdc { aV0A = -999; } - registrySim.fill(HIST("hT0C_cent_rec"), collision.centFT0C()); - registrySim.fill(HIST("aT0Avsb"), aT0A / 100., b); - registrySim.fill(HIST("aT0Cvsb"), aT0C / 100., b); - registrySim.fill(HIST("aV0Avsb"), aV0A / 100., b); + registry.fill(HIST("hT0C_cent_rec"), collision.centFT0C()); + registry.fill(HIST("aT0Avsb"), aT0A / 100., b); + registry.fill(HIST("aT0Cvsb"), aT0C / 100., b); + registry.fill(HIST("aV0Avsb"), aV0A / 100., b); - auto groupedTracks = + const auto groupedTracks = simTracks.sliceBy(perCollision, collision.globalIndex()); for (const auto& track : groupedTracks) { if (!track.has_mcParticle()) { continue; } - // Track Selection - if (!track.isGlobalTrack()) { - continue; - } - if (track.pt() < minPt || track.pt() > maxPt) { + const auto particle = track.mcParticle(); + + registry.fill(HIST("Pt_MC_rec_all_ch"), track.pt()); + if (!particle.isPhysicalPrimary()) { continue; } - // if (!passedTrackSelection(track)) { - // continue; - // } - - registrySim.fill(HIST("EtaVsPhi_MC_rec"), track.eta(), track.phi()); - const auto particle = track.mcParticle(); - registrySim.fill(HIST("Pt_MC_rec_ch"), track.pt()); + registry.fill(HIST("EtaVsPhi_MC_rec"), track.eta(), track.phi()); + registry.fill(HIST("Pt_MC_rec_ch"), track.pt()); if (particle.pdgCode() == PDG_t::kPiPlus || particle.pdgCode() == PDG_t::kPiMinus) { - registrySim.fill(HIST("Pt_MC_rec_pi"), track.pt()); + registry.fill(HIST("Pt_MC_rec_pi"), track.pt()); } else if (particle.pdgCode() == PDG_t::kKPlus || particle.pdgCode() == PDG_t::kKMinus) { - registrySim.fill(HIST("Pt_MC_rec_ka"), track.pt()); + registry.fill(HIST("Pt_MC_rec_ka"), track.pt()); } else if (particle.pdgCode() == PDG_t::kProton || particle.pdgCode() == PDG_t::kProtonBar) { - registrySim.fill(HIST("Pt_MC_rec_pr"), track.pt()); + registry.fill(HIST("Pt_MC_rec_pr"), track.pt()); } else if (particle.pdgCode() == PDG_t::kSigmaPlus || particle.pdgCode() == PDG_t::kSigmaBarMinus) { - registrySim.fill(HIST("Pt_MC_rec_sigpos"), track.pt()); + registry.fill(HIST("Pt_MC_rec_sigpos"), track.pt()); } else if (particle.pdgCode() == PDG_t::kSigmaMinus || particle.pdgCode() == PDG_t::kSigmaBarPlus) { - registrySim.fill(HIST("Pt_MC_rec_signeg"), track.pt()); + registry.fill(HIST("Pt_MC_rec_signeg"), track.pt()); } else { - registrySim.fill(HIST("Pt_MC_rec_re"), track.pt()); + registry.fill(HIST("Pt_MC_rec_re"), track.pt()); } } } } - PROCESS_SWITCH(UccZdc, processMC, "process pure simulation", false); + PROCESS_SWITCH(UccZdc, processMC, "Process MC", false); // Single-Track Selection // template From e2b008eff7923435ce42fd03bcbcb38959e0478d Mon Sep 17 00:00:00 2001 From: victorvalenciatorres <118812999+victorvalenciatorres@users.noreply.github.com> Date: Mon, 17 Feb 2025 11:30:05 +0100 Subject: [PATCH 0260/1650] [PWGDQ] Fix multiplicity of dimuons in event mixing (#10006) --- PWGDQ/Tasks/tableReader.cxx | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/PWGDQ/Tasks/tableReader.cxx b/PWGDQ/Tasks/tableReader.cxx index 04f5a3c6717..9b2da8c4986 100644 --- a/PWGDQ/Tasks/tableReader.cxx +++ b/PWGDQ/Tasks/tableReader.cxx @@ -776,21 +776,18 @@ struct AnalysisEventMixing { } uint32_t twoTrackFilter = 0; - - if (fConfigSingleMuCumulants) { - uint32_t mult_dimuons = 0; - for (auto& track1 : tracks1) { - for (auto& track2 : tracks2) { - if constexpr (TPairType == VarManager::kDecayToMuMu) { - twoTrackFilter = static_cast(track1.isMuonSelected()) & static_cast(track2.isMuonSelected()) & fTwoMuonFilterMask; - } - if (twoTrackFilter && track1.sign() * track2.sign() < 0) { - mult_dimuons++; - } - } // end for (track2) - } // end for (track1) - VarManager::fgValues[VarManager::kMultDimuonsME] = mult_dimuons; - } + uint32_t mult_dimuons = 0; + for (auto& track1 : tracks1) { + for (auto& track2 : tracks2) { + if constexpr (TPairType == VarManager::kDecayToMuMu) { + twoTrackFilter = static_cast(track1.isMuonSelected()) & static_cast(track2.isMuonSelected()) & fTwoMuonFilterMask; + } + if (twoTrackFilter && track1.sign() * track2.sign() < 0) { + mult_dimuons++; + } + } // end for (track2) + } // end for (track1) + VarManager::fgValues[VarManager::kMultDimuonsME] = mult_dimuons; twoTrackFilter = 0; for (auto& track1 : tracks1) { From 3e11c6d2513f6a91c49486aaa06e5d795905adf2 Mon Sep 17 00:00:00 2001 From: Gyula Bencedi Date: Mon, 17 Feb 2025 11:36:12 +0100 Subject: [PATCH 0261/1650] [Infrastructure] Add Gyula as PWGMM/Mult codeowner (#10002) --- CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index 9601a091dc8..3946f9c6dd8 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -50,7 +50,7 @@ # PWG-MM /PWGMM @alibuild @njacazio @skundu692 @aalkin -/PWGMM/Mult @alibuild @njacazio @skundu692 @aalkin @aortizve @ddobrigk +/PWGMM/Mult @alibuild @njacazio @skundu692 @aalkin @aortizve @ddobrigk @gbencedi /PWGMM/Lumi @alibuild @aalkin /PWGMM/UE @alibuild @aalkin @aortizve From 1d47535571e30d9c5e6cbf1f128c7994a004845a Mon Sep 17 00:00:00 2001 From: prottayCMT <61418725+prottayCMT@users.noreply.github.com> Date: Mon, 17 Feb 2025 11:51:07 +0100 Subject: [PATCH 0262/1650] [PWGLF] initial commit for LStar v2 (#9889) Co-authored-by: Prottay Das --- PWGLF/Tasks/Resonances/CMakeLists.txt | 5 + PWGLF/Tasks/Resonances/lstarpbpbv2.cxx | 530 +++++++++++++++++++++++++ 2 files changed, 535 insertions(+) create mode 100644 PWGLF/Tasks/Resonances/lstarpbpbv2.cxx diff --git a/PWGLF/Tasks/Resonances/CMakeLists.txt b/PWGLF/Tasks/Resonances/CMakeLists.txt index cb94f52dfcd..47267af9f97 100644 --- a/PWGLF/Tasks/Resonances/CMakeLists.txt +++ b/PWGLF/Tasks/Resonances/CMakeLists.txt @@ -134,6 +134,11 @@ o2physics_add_dpl_workflow(kstarpbpb PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(lstarpbpbv2 + SOURCES lstarpbpbv2.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(xi1530analysis SOURCES xi1530Analysis.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore diff --git a/PWGLF/Tasks/Resonances/lstarpbpbv2.cxx b/PWGLF/Tasks/Resonances/lstarpbpbv2.cxx new file mode 100644 index 00000000000..4b9bdb5aede --- /dev/null +++ b/PWGLF/Tasks/Resonances/lstarpbpbv2.cxx @@ -0,0 +1,530 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +// L* baryon v2 +// Prottay Das (prottay.das@cern.ch) + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "TRandom3.h" +#include "Math/Vector3D.h" +#include "Math/Vector4D.h" +#include "Math/GenVector/Boost.h" +#include "TF1.h" + +#include "PWGLF/DataModel/EPCalibrationTables.h" +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/StepTHn.h" +#include "Framework/O2DatabasePDGPlugin.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/Core/trackUtilities.h" +#include "CommonConstants/PhysicsConstants.h" +#include "Common/Core/TrackSelection.h" +#include "Framework/ASoAHelpers.h" +#include "ReconstructionDataFormats/Track.h" +#include "DataFormatsParameters/GRPObject.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "Common/DataModel/PIDResponseITS.h" +#include "CCDB/BasicCCDBManager.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using std::array; +struct lstarpbpbv2 { + + Service ccdb; + Service pdg; + + // events + Configurable cfgCutVertex{"cfgCutVertex", 10.0f, "Accepted z-vertex range"}; + Configurable cfgCutCentrality{"cfgCutCentrality", 80.0f, "Accepted maximum Centrality"}; + // track + Configurable cfgCutCharge{"cfgCutCharge", 0.0, "cut on Charge"}; + Configurable cfgCutPT{"cfgCutPT", 0.2, "PT cut on daughter track"}; + Configurable cfgCutEta{"cfgCutEta", 0.8, "Eta cut on daughter track"}; + Configurable cfgCutDCAxy{"cfgCutDCAxy", 2.0f, "DCAxy range for tracks"}; + Configurable cfgCutDCAz{"cfgCutDCAz", 2.0f, "DCAz range for tracks"}; + Configurable useGlobalTrack{"useGlobalTrack", true, "use Global track"}; + Configurable nsigmaCutTOF{"nsigmacutTOF", 3.0, "Value of the TOF Nsigma cut"}; + Configurable nsigmaCutTPC{"nsigmacutTPC", 3.0, "Value of the TPC Nsigma cut"}; + Configurable nsigmaCutCombined{"nsigmaCutCombined", 3.0, "Value of the TOF Nsigma cut"}; + Configurable cfgNoMixedEvents{"cfgNoMixedEvents", 1, "Number of mixed events per event"}; + Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; + Configurable cfgTPCcluster{"cfgTPCcluster", 70, "Number of TPC cluster"}; + Configurable removefaketrak{"removefaketrack", true, "Remove fake track from momentum difference"}; + Configurable ConfFakeKaonCut{"ConfFakeKaonCut", 0.1, "Cut based on track from momentum difference"}; + Configurable ispTdepPID{"ispTdepPID", true, "pT dependent PID"}; + Configurable OnlyTOF{"OnlyTOF", true, "OnlyTOF"}; + Configurable strategyPID{"strategyPID", 2, "PID strategy"}; + Configurable cfgCutTOFBeta{"cfgCutTOFBeta", 0.0, "cut TOF beta"}; + Configurable confMinRot{"confMinRot", 5.0 * TMath::Pi() / 6.0, "Minimum of rotation"}; + Configurable confMaxRot{"confMaxRot", 7.0 * TMath::Pi() / 6.0, "Maximum of rotation"}; + Configurable nBkgRotations{"nBkgRotations", 9, "Number of rotated copies (background) per each original candidate"}; + Configurable fillRotation{"fillRotation", true, "fill rotation"}; + Configurable like{"like", true, "fill rotation"}; + Configurable spNbins{"spNbins", 2000, "Number of bins in sp"}; + Configurable lbinsp{"lbinsp", -1.0, "lower bin value in sp histograms"}; + Configurable hbinsp{"hbinsp", 1.0, "higher bin value in sp histograms"}; + Configurable nsigmaCutITS{"nsigmaCutITS", 3.0, "Value of the ITS Nsigma cut"}; + Configurable PIDstrategy{"PIDstrategy", 0, "0: TOF Veto, 1: TOF Veto opti, 2: TOF, 3: TOF loose 1, 4: TOF loose 2, 5: old pt dep"}; + + ConfigurableAxis configcentAxis{"configcentAxis", {VARIABLE_WIDTH, 0.0, 10.0, 40.0, 80.0}, "Cent V0M"}; + ConfigurableAxis configresAxis{"configresAxis", {VARIABLE_WIDTH, -2.0, -1.5, -1.0, -0.6, -0.2, 0.2, 0.6, 1.0, 1.5, 2.0}, "Resolution"}; + ConfigurableAxis configthnAxispT{"configthnAxisPt", {VARIABLE_WIDTH, 0.2, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 6.5, 8.0, 10.0, 100.0}, "#it{p}_{T} (GeV/#it{c})"}; + ConfigurableAxis configIMAxis{"configIMAxis", {VARIABLE_WIDTH, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.5, 1.7, 1.8, 1.9, 2.0}, "IM"}; + + Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; + Filter centralityFilter = nabs(aod::cent::centFT0C) < cfgCutCentrality; + Filter acceptanceFilter = (nabs(aod::track::eta) < cfgCutEta && nabs(aod::track::pt) > cfgCutPT); + Filter DCAcutFilter = (nabs(aod::track::dcaXY) < cfgCutDCAxy) && (nabs(aod::track::dcaZ) < cfgCutDCAz); + + using EventCandidates = soa::Filtered>; + using TrackCandidates = soa::Filtered>; + + HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + + void init(o2::framework::InitContext&) + { + AxisSpec spAxis = {spNbins, lbinsp, hbinsp, "Sp"}; + + histos.add("hCentrality", "Centrality distribution", kTH1F, {{20, 0.0, 100.0}}); + + histos.add("ResFT0CTPCSP", "ResFT0CTPCSP", HistType::kTHnSparseF, {configcentAxis, configresAxis}); + histos.add("ResFT0CFT0ASP", "ResFT0CFT0ASP", HistType::kTHnSparseF, {configcentAxis, configresAxis}); + histos.add("ResFT0ATPCSP", "ResFT0ATPCSP", HistType::kTHnSparseF, {configcentAxis, configresAxis}); + histos.add("hpv2vscentpt", "hpv2vscentpt", HistType::kTHnSparseF, {configIMAxis, configcentAxis, configthnAxispT, spAxis}, true); + histos.add("hpv2vscentptrot", "hpv2vscentptrot", HistType::kTHnSparseF, {configIMAxis, configcentAxis, configthnAxispT, spAxis}, true); + histos.add("hpv2vscentptlike", "hpv2vscentptlike", HistType::kTHnSparseF, {configIMAxis, configcentAxis, configthnAxispT, spAxis}, true); + } + + double massKa = o2::constants::physics::MassKPlus; + double massPr = o2::constants::physics::MassProton; + + template + bool selectionTrack(const T& candidate) + { + if (useGlobalTrack && !(candidate.isGlobalTrack() && candidate.isPVContributor() && candidate.itsNCls() > cfgITScluster && candidate.tpcNClsFound() > cfgTPCcluster)) { + return false; + } + if (!useGlobalTrack && !(candidate.isPVContributor() && candidate.itsNCls() > cfgITScluster)) { + return false; + } + return true; + } + + template + bool strategySelectionPID(const T& candidate, int PID, int strategy) + { + if (PID == 0) { + if (strategy == 0) { + if (candidate.pt() < 0.5 && TMath::Abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.5 && TMath::Abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC && candidate.hasTOF() && TMath::Abs(candidate.tofNSigmaKa()) < nsigmaCutTOF && candidate.beta() > 0.5) { + return true; + } + } else if (strategy == 1) { + if (candidate.pt() < 0.5 && TMath::Abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.5 && TMath::Sqrt(candidate.tpcNSigmaKa() * candidate.tpcNSigmaKa() + candidate.tofNSigmaKa() * candidate.tofNSigmaKa()) < nsigmaCutTOF && candidate.beta() > 0.5) { + return true; + } + } else if (strategy == 2) { + if (candidate.pt() < 0.5 && TMath::Abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.5 && TMath::Abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC && candidate.hasTOF() && TMath::Abs(candidate.tofNSigmaKa()) < nsigmaCutTOF && candidate.beta() > 0.5) { + return true; + } + if (candidate.pt() >= 0.5 && TMath::Abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC && !candidate.hasTOF()) { + return true; + } + } + } + return false; + } + + // TOF Veto + template + bool selectionPID1(const T& candidate) + { + if (candidate.hasTOF()) { + if (candidate.p() < 0.5 && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + return true; + } + if (candidate.p() >= 0.5 && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC && std::abs(candidate.tofNSigmaPr()) < nsigmaCutTOF) { + return true; + } + } + if (!candidate.hasTOF()) { + if (std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + return true; + } + } + return false; + } + + // TPC TOF + template + bool selectionPID2(const T& candidate) + { + if (candidate.pt() < 0.7 && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.7 && candidate.pt() < 1.4) { + if (candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC && std::abs(candidate.tofNSigmaPr()) < nsigmaCutTOF) { + return true; + } + if (!candidate.hasTOF()) { + if (candidate.pt() >= 0.7 && candidate.pt() < 0.8 && candidate.tpcNSigmaPr() > -1.8 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.8 && candidate.pt() < 0.9 && candidate.tpcNSigmaPr() > -1.7 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.9 && candidate.pt() < 1.0 && candidate.tpcNSigmaPr() > -1.6 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 1.0 && candidate.pt() < 1.4 && candidate.tpcNSigmaPr() > -1.0 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + } + } + if (candidate.pt() >= 1.4) { + if (candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC && std::abs(candidate.tofNSigmaPr()) < nsigmaCutTOF) { + return true; + } + if (!candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + return true; + } + } + return false; + } + + // TPC TOF + template + bool selectionPID3(const T& candidate) + { + if (candidate.pt() < 0.7 && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.7 && candidate.pt() < 1.8) { + if (candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC && std::abs(candidate.tofNSigmaPr()) < nsigmaCutTOF) { + return true; + } + if (!candidate.hasTOF()) { + if (candidate.pt() >= 0.7 && candidate.pt() < 0.8 && candidate.tpcNSigmaPr() > -1.8 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.8 && candidate.pt() < 0.9 && candidate.tpcNSigmaPr() > -1.7 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.9 && candidate.pt() < 1.0 && candidate.tpcNSigmaPr() > -1.6 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + } + } + if (candidate.pt() >= 1.8) { + if (candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC && std::abs(candidate.tofNSigmaPr()) < nsigmaCutTOF) { + return true; + } + if (!candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + return true; + } + } + return false; + } + + // TPC TOF + template + bool selectionPID4(const T& candidate) + { + if (candidate.pt() < 0.7 && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.7 && candidate.pt() < 1.4) { + if (candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC && std::abs(candidate.tofNSigmaPr()) < nsigmaCutTOF) { + return true; + } + if (!candidate.hasTOF()) { + if (candidate.pt() >= 0.7 && candidate.pt() < 0.8 && candidate.tpcNSigmaPr() > -1.8 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.8 && candidate.pt() < 0.9 && candidate.tpcNSigmaPr() > -1.7 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.9 && candidate.pt() < 1.0 && candidate.tpcNSigmaPr() > -1.6 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 1.0 && candidate.pt() < 1.4 && candidate.tpcNSigmaPr() > -1.0 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + } + } + if (candidate.pt() >= 1.4) { + if (candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + if (candidate.pt() < 2.5 && std::abs(candidate.tofNSigmaPr()) < nsigmaCutTOF) { + return true; + } + if (candidate.pt() >= 2.5 && candidate.pt() < 4 && candidate.tofNSigmaPr() > -2.0 && candidate.tofNSigmaPr() < nsigmaCutTOF) { + return true; + } + if (candidate.pt() >= 4 && candidate.pt() < 5 && candidate.tofNSigmaPr() > -1.5 && candidate.tofNSigmaPr() < nsigmaCutTOF) { + return true; + } + if (candidate.pt() >= 5 && candidate.tofNSigmaPr() > -1.0 && candidate.tofNSigmaPr() < nsigmaCutTOF) { + return true; + } + } + if (!candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + return true; + } + } + return false; + } + + // TPC TOF + template + bool selectionPID5(const T& candidate) + { + if (candidate.pt() < 0.7 && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.7 && candidate.pt() < 1.8) { + if (candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC && std::abs(candidate.tofNSigmaPr()) < nsigmaCutTOF) { + return true; + } + if (!candidate.hasTOF()) { + if (candidate.pt() >= 0.7 && candidate.pt() < 0.8 && candidate.tpcNSigmaPr() > -1.8 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.8 && candidate.pt() < 0.9 && candidate.tpcNSigmaPr() > -1.7 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.9 && candidate.pt() < 1.0 && candidate.tpcNSigmaPr() > -1.6 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + } + } + if (candidate.pt() >= 1.8) { + if (candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + if (candidate.pt() < 2.5 && std::abs(candidate.tofNSigmaPr()) < nsigmaCutTOF) { + return true; + } + if (candidate.pt() >= 2.5 && candidate.pt() < 4 && candidate.tofNSigmaPr() > -2.0 && candidate.tofNSigmaPr() < nsigmaCutTOF) { + return true; + } + if (candidate.pt() >= 4 && candidate.pt() < 5 && candidate.tofNSigmaPr() > -1.5 && candidate.tofNSigmaPr() < nsigmaCutTOF) { + return true; + } + if (candidate.pt() >= 5 && candidate.tofNSigmaPr() > -1.0 && candidate.tofNSigmaPr() < nsigmaCutTOF) { + return true; + } + } + if (!candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + return true; + } + } + return false; + } + // TPC TOF + template + bool selectionPID6(const T& candidate) + { + if (candidate.pt() < 0.7 && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.7) { + if (candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + if (candidate.pt() < 2.5 && std::abs(candidate.tofNSigmaPr()) < nsigmaCutTOF) { + return true; + } + if (candidate.pt() >= 2.5 && candidate.pt() < 4 && candidate.tofNSigmaPr() > -2.0 && candidate.tofNSigmaPr() < nsigmaCutTOF) { + return true; + } + if (candidate.pt() >= 4 && candidate.pt() < 5 && candidate.tofNSigmaPr() > -1.5 && candidate.tofNSigmaPr() < nsigmaCutTOF) { + return true; + } + if (candidate.pt() >= 5 && candidate.tofNSigmaPr() > -1.0 && candidate.tofNSigmaPr() < nsigmaCutTOF) { + return true; + } + } + if (!candidate.hasTOF()) { + if (candidate.pt() >= 0.7 && candidate.pt() < 0.8 && candidate.tpcNSigmaPr() > -1.8 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.8 && candidate.pt() < 0.9 && candidate.tpcNSigmaPr() > -1.7 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.9 && candidate.pt() < 1.0 && candidate.tpcNSigmaPr() > -1.6 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + } + } + return false; + } + + double GetPhiInRange(double phi) + { + double result = phi; + while (result < 0) { + result = result + 2. * TMath::Pi() / 2; + } + while (result > 2. * TMath::Pi() / 2) { + result = result - 2. * TMath::Pi() / 2; + } + return result; + } + + ROOT::Math::PxPyPzMVector LstarMother, daughter1, daughter2, kaonrot, lstarrot; + + void processSE(EventCandidates::iterator const& collision, TrackCandidates const& tracks, aod::BCs const&) + { + if (!collision.sel8() || !collision.triggereventep() || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(aod::evsel::kNoITSROFrameBorder) || !collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { + return; + } + + o2::aod::ITSResponse itsResponse; + + auto centrality = collision.centFT0C(); + auto QFT0C = collision.qFT0C(); + auto QFT0A = collision.qFT0A(); + auto QTPC = collision.qTPC(); + auto psiFT0C = collision.psiFT0C(); + auto psiFT0A = collision.psiFT0A(); + auto psiTPC = collision.psiTPC(); + + histos.fill(HIST("hCentrality"), centrality); + + histos.fill(HIST("ResFT0CTPCSP"), centrality, QFT0C * QTPC * TMath::Cos(2.0 * (psiFT0C - psiTPC))); + histos.fill(HIST("ResFT0CFT0ASP"), centrality, QFT0C * QFT0A * TMath::Cos(2.0 * (psiFT0C - psiFT0A))); + histos.fill(HIST("ResFT0ATPCSP"), centrality, QTPC * QFT0A * TMath::Cos(2.0 * (psiTPC - psiFT0A))); + + for (auto track1 : tracks) { + if (!selectionTrack(track1)) { + continue; + } + bool track1kaon = false; + auto track1ID = track1.globalIndex(); + if (!strategySelectionPID(track1, 0, strategyPID)) { + continue; + } + track1kaon = true; + + for (auto track2 : tracks) { + if (!selectionTrack(track2)) { + continue; + } + + if (track2.p() < 0.5 && !(itsResponse.nSigmaITS(track2) > -nsigmaCutITS && itsResponse.nSigmaITS(track2) < nsigmaCutITS)) { // required for protons only + continue; + } + + bool track2proton = false; + if (PIDstrategy == 0 && !selectionPID1(track2)) { + continue; + } + if (PIDstrategy == 1 && !selectionPID2(track2)) { + continue; + } + if (PIDstrategy == 2 && !selectionPID3(track2)) { + continue; + } + if (PIDstrategy == 3 && !selectionPID4(track2)) { + continue; + } + if (PIDstrategy == 4 && !selectionPID5(track2)) { + continue; + } + if (PIDstrategy == 5 && !selectionPID6(track2)) { + continue; + } + + track2proton = true; + auto track2ID = track2.globalIndex(); + + if (track2ID == track1ID) { + continue; + } + if (!track1kaon || !track2proton) { + continue; + } + daughter1 = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); + daughter2 = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massPr); + LstarMother = daughter1 + daughter2; + if (TMath::Abs(LstarMother.Rapidity()) >= 0.5) { + continue; + } + + auto phiminuspsi = GetPhiInRange(LstarMother.Phi() - psiFT0C); + auto v2 = TMath::Cos(2.0 * phiminuspsi) * QFT0C; + + // unlike sign + if (track1.sign() * track2.sign() < 0) { + histos.fill(HIST("hpv2vscentpt"), LstarMother.M(), centrality, LstarMother.Pt(), v2); + if (fillRotation) { + for (int nrotbkg = 0; nrotbkg < nBkgRotations; nrotbkg++) { + auto anglestart = confMinRot; + auto angleend = confMaxRot; + auto anglestep = (angleend - anglestart) / (1.0 * (nBkgRotations - 1)); + auto rotangle = anglestart + nrotbkg * anglestep; + auto rotkaonPx = track1.px() * std::cos(rotangle) - track1.py() * std::sin(rotangle); + auto rotkaonPy = track1.px() * std::sin(rotangle) + track1.py() * std::cos(rotangle); + kaonrot = ROOT::Math::PxPyPzMVector(rotkaonPx, rotkaonPy, track1.pz(), massKa); + lstarrot = kaonrot + daughter2; + if (TMath::Abs(lstarrot.Rapidity()) >= 0.5) { + continue; + } + + auto phiminuspsirot = GetPhiInRange(lstarrot.Phi() - psiFT0C); + auto v2rot = TMath::Cos(2.0 * phiminuspsirot) * QFT0C; + + histos.fill(HIST("hpv2vscentptrot"), lstarrot.M(), centrality, lstarrot.Pt(), v2rot); + } + } + } + // like sign + if (track1.sign() * track2.sign() > 0) { + histos.fill(HIST("hpv2vscentptlike"), lstarrot.M(), centrality, lstarrot.Pt(), v2); + } + } + } + } + PROCESS_SWITCH(lstarpbpbv2, processSE, "Process Same event", true); +}; +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc, TaskName{"lstarpbpbv2"})}; +} From 58fb4260808ec41cc2f42cf042d274c22683fac6 Mon Sep 17 00:00:00 2001 From: rebeccacerri <116571396+rebeccacerri@users.noreply.github.com> Date: Mon, 17 Feb 2025 13:52:46 +0100 Subject: [PATCH 0263/1650] [PWGDQ] Fixing Upsilon minitree (#10012) --- PWGDQ/Tasks/tableReader.cxx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/PWGDQ/Tasks/tableReader.cxx b/PWGDQ/Tasks/tableReader.cxx index 9b2da8c4986..3502825be02 100644 --- a/PWGDQ/Tasks/tableReader.cxx +++ b/PWGDQ/Tasks/tableReader.cxx @@ -1449,12 +1449,12 @@ struct AnalysisSameEventPairing { VarManager::fgValues[VarManager::kRap], VarManager::fgValues[VarManager::kCentFT0C], VarManager::fgValues[VarManager::kCos2DeltaPhi], - VarManager::fgValues[VarManager::kPt1], - VarManager::fgValues[VarManager::kEta1], - VarManager::fgValues[VarManager::kPhi1], - VarManager::fgValues[VarManager::kPt2], - VarManager::fgValues[VarManager::kEta2], - VarManager::fgValues[VarManager::kPhi2]); + t1.pt(), + t1.eta(), + t1.phi(), + t2.pt(), + t2.eta(), + t2.phi()); } } } else { From d662824b46de467fa2caf6890b07d3bb10fd8f09 Mon Sep 17 00:00:00 2001 From: Fabio Colamaria Date: Mon, 17 Feb 2025 14:01:31 +0100 Subject: [PATCH 0264/1650] [PWGHF] Add option to fill ME tables of Lc-h in a fraction of events (#10009) Co-authored-by: fcolamar Co-authored-by: ALICE Action Bot --- .../HFC/TableProducer/correlatorLcHadrons.cxx | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx b/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx index 6b03099d3fa..00d10d40b20 100644 --- a/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx @@ -17,6 +17,7 @@ /// \author Ravindra Singh #include +#include "TRandom3.h" #include "CommonConstants/PhysicsConstants.h" #include "Framework/AnalysisTask.h" @@ -201,12 +202,14 @@ struct HfCorrelatorLcHadrons { Configurable calTrkEff{"calTrkEff", false, "fill histograms to calculate efficiency"}; Configurable isRecTrkPhyPrimary{"isRecTrkPhyPrimary", true, "Calculate the efficiency of reconstructed primary physical tracks"}; Configurable calEffLcEvent{"calEffLcEvent", true, "Calculate the efficiency of Lc candidate"}; + Configurable eventFractionToAnalyze{"eventFractionToAnalyze", -1, "Fraction of events to analyze (use only for ME offline on very large samples)"}; HfHelper hfHelper; SliceCache cache; Service pdg; int leadingIndex = 0; bool correlationStatus = false; + TRandom3* rnd = new TRandom3(0); // Event Mixing for the Data Mode using SelCollisionsWithLc = soa::Filtered>; @@ -330,6 +333,13 @@ struct HfCorrelatorLcHadrons { return; } + bool skipMixedEventTableFilling = false; + if (eventFractionToAnalyze > 0) { + if (rnd->Uniform(0, 1) > eventFractionToAnalyze) { + skipMixedEventTableFilling = true; + } + } + // find leading particle if (correlateLcWithLeadingParticle) { leadingIndex = findLeadingParticle(tracks, dcaXYTrackMax.value, dcaZTrackMax.value, etaTrackMax.value); @@ -394,7 +404,9 @@ struct HfCorrelatorLcHadrons { outputMl[iclass] = candidate.mlProbLcToPiKP()[classMl->at(iclass)]; } entryLcCandRecoInfo(hfHelper.invMassLcToPiKP(candidate), candidate.pt() * chargeLc, outputMl[0], outputMl[1]); // 0: BkgBDTScore, 1:PromptBDTScore - entryLc(candidate.phi(), candidate.eta(), candidate.pt(), hfHelper.invMassLcToPiKP(candidate), poolBin, gCollisionId, timeStamp); + if (!skipMixedEventTableFilling) { + entryLc(candidate.phi(), candidate.eta(), candidate.pt(), hfHelper.invMassLcToPiKP(candidate), poolBin, gCollisionId, timeStamp); + } } // Lc-Hadron correlation dedicated section @@ -450,11 +462,13 @@ struct HfCorrelatorLcHadrons { } } if (countLc == 0) { - entryHadron(track.phi(), track.eta(), track.pt() * track.sign(), poolBin, gCollisionId, timeStamp); - if (fillTrkPID) { - entryTrkPID(track.tpcNSigmaPr(), track.tpcNSigmaKa(), track.tpcNSigmaPi(), track.tofNSigmaPr(), track.tofNSigmaKa(), track.tofNSigmaPi()); + if (!skipMixedEventTableFilling) { + entryHadron(track.phi(), track.eta(), track.pt() * track.sign(), poolBin, gCollisionId, timeStamp); + if (fillTrkPID) { + entryTrkPID(track.tpcNSigmaPr(), track.tpcNSigmaKa(), track.tpcNSigmaPi(), track.tofNSigmaPr(), track.tofNSigmaKa(), track.tofNSigmaPi()); + } + registry.fill(HIST("hTracksBin"), poolBin); } - registry.fill(HIST("hTracksBin"), poolBin); } } // Hadron Tracks loop countLc++; From 984501f97e924de2c8bba313450984e8dab201a1 Mon Sep 17 00:00:00 2001 From: Antonio Palasciano <52152842+apalasciano@users.noreply.github.com> Date: Mon, 17 Feb 2025 14:27:48 +0100 Subject: [PATCH 0265/1650] [PWGHF] B+ corr. bkg, add charm mother PDGs (#10013) --- PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx b/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx index da1229bef17..1c1bea74eb2 100644 --- a/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx +++ b/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx @@ -653,7 +653,7 @@ struct HfDataCreatorCharmHadPiReduced { // b-hadron hypothesis std::array bHadronMotherHypos = {Pdg::kBPlus, Pdg::kB0, Pdg::kBS, Pdg::kLambdaB0}; // c-hadron hypothesis - std::array cHadronMotherHypos = {Pdg::kDPlus, Pdg::kDS, Pdg::kDStar, Pdg::kDSStar, Pdg::kLambdaCPlus}; + std::array cHadronMotherHypos = {Pdg::kD0, Pdg::kDPlus, Pdg::kDS, Pdg::kDStar, 423, Pdg::kDSStar, Pdg::kLambdaCPlus}; for (const auto& bHadronMotherHypo : bHadronMotherHypos) { int index0Mother = RecoDecay::getMother(particlesMc, particleProng0, bHadronMotherHypo, true); @@ -672,7 +672,7 @@ struct HfDataCreatorCharmHadPiReduced { // look for common c-hadron mother among prongs 0, 1 and 2 for (const auto& cHadronMotherHypo : cHadronMotherHypos) { int8_t depthMax = 2; - if (cHadronMotherHypo == Pdg::kDStar || cHadronMotherHypo == Pdg::kDSStar) { // to include D* -> D π0/γ, D* -> D0 π, and Ds* -> Ds π0/γ + if (cHadronMotherHypo == Pdg::kDStar || cHadronMotherHypo == 423 || cHadronMotherHypo == Pdg::kDSStar) { // to include D* -> D π0/γ, D* -> D0 π, and Ds* -> Ds π0/γ depthMax += 1; } int index0CharmMother = RecoDecay::getMother(particlesMc, particleProng0, cHadronMotherHypo, true, &sign, depthMax); From 64b65cf14cb71a552e901a0cb4e1281a7df14823 Mon Sep 17 00:00:00 2001 From: shreyasiacharya <34233706+shreyasiacharya@users.noreply.github.com> Date: Mon, 17 Feb 2025 15:27:48 +0100 Subject: [PATCH 0266/1650] [PWGDQ] Add Pole-mass to pseudoproper decay time and TOF-PID to cut library (#9881) --- PWGDQ/Core/CutsLibrary.cxx | 16 ++++++++++++++-- PWGDQ/Core/HistogramsLibrary.cxx | 1 + PWGDQ/Core/VarManager.cxx | 3 +++ PWGDQ/Core/VarManager.h | 3 +++ PWGDQ/Tasks/dqEfficiency_withAssoc.cxx | 5 +++-- PWGDQ/Tasks/tableReader_withAssoc.cxx | 5 +++-- 6 files changed, 27 insertions(+), 6 deletions(-) diff --git a/PWGDQ/Core/CutsLibrary.cxx b/PWGDQ/Core/CutsLibrary.cxx index d24196f9e4d..b5d8c35ffa9 100644 --- a/PWGDQ/Core/CutsLibrary.cxx +++ b/PWGDQ/Core/CutsLibrary.cxx @@ -153,7 +153,13 @@ AnalysisCompositeCut* o2::aod::dqcuts::GetCompositeCut(const char* cutName) cut->AddCut(GetAnalysisCut("electronPIDnsigmaMedium")); return cut; } - + if (!nameStr.compare("electronSelection1_ionut_withTOFPID")) { + cut->AddCut(GetAnalysisCut("jpsiStandardKine")); + cut->AddCut(GetAnalysisCut("electronStandardQualityForO2MCdebug")); + cut->AddCut(GetAnalysisCut("dcaCut1_ionut")); + cut->AddCut(GetAnalysisCut("electronPIDnsigmaMedium_withLargeTOFPID")); + return cut; + } if (!nameStr.compare("electronSelection1_idstoreh")) { // same as electronSelection1_ionut, but with kIsSPDAny -> kIsITSibAny cut->AddCut(GetAnalysisCut("jpsiStandardKine")); cut->AddCut(GetAnalysisCut("electronStandardQualityForO2MCdebug4")); @@ -5406,7 +5412,13 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) cut->AddCut(VarManager::kTPCnSigmaPi, 2.7, 3000.0); return cut; } - + if (!nameStr.compare("electronPIDnsigmaMedium_withLargeTOFPID")) { + cut->AddCut(VarManager::kTPCnSigmaEl, -3.0, 3.0); + cut->AddCut(VarManager::kTPCnSigmaPr, 2.7, 3000.0); + cut->AddCut(VarManager::kTPCnSigmaPi, 2.7, 3000.0); + cut->AddCut(VarManager::kTOFnSigmaEl, -5.0, 5.0); + return cut; + } if (!nameStr.compare("electronPIDnsigmaSkewed")) { cut->AddCut(VarManager::kTPCnSigmaEl, -2.0, 3.0); cut->AddCut(VarManager::kTPCnSigmaPr, 3.5, 3000.0); diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 976b197e247..d30687516f0 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -912,6 +912,7 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h } hm->AddHistogram(histClass, "Mass_PtFine", "", false, 75, massBins, VarManager::kMass, 69, ptBins, VarManager::kPt); hm->AddHistogram(histClass, "Eta_Pt", "", false, 40, -2.0, 2.0, VarManager::kEta, 40, 0.0, 20.0, VarManager::kPt); + hm->AddHistogram(histClass, "Y_Pt", "", false, 40, -2.0, 2.0, VarManager::kRap, 40, 0.0, 20.0, VarManager::kPt); hm->AddHistogram(histClass, "Mass_VtxZ", "", true, 30, -15.0, 15.0, VarManager::kVtxZ, 500, 0.0, 5.0, VarManager::kMass); if (subGroupStr.Contains("pbpb")) { hm->AddHistogram(histClass, "Mass_CentFT0C", "", false, 125, 0.0, 5.0, VarManager::kMass, 20, 0.0, 100.0, VarManager::kCentFT0C); diff --git a/PWGDQ/Core/VarManager.cxx b/PWGDQ/Core/VarManager.cxx index 73d4b3c49bd..46597170321 100644 --- a/PWGDQ/Core/VarManager.cxx +++ b/PWGDQ/Core/VarManager.cxx @@ -639,6 +639,8 @@ void VarManager::SetDefaultVarNames() fgVariableUnits[kVertexingTauzProjected] = "ns"; fgVariableNames[kVertexingTauxyProjected] = "Pair pseudo-proper Tauxy"; fgVariableUnits[kVertexingTauxyProjected] = "ns"; + fgVariableNames[kVertexingTauxyProjectedPoleJPsiMass] = "Pair pseudo-proper Tauxy (with pole JPsi mass)"; + fgVariableUnits[kVertexingTauxyProjectedPoleJPsiMass] = "ns"; fgVariableNames[kVertexingTauxyzProjected] = "Pair pseudo-proper Tauxyz"; fgVariableUnits[kVertexingTauxyzProjected] = "ns"; fgVariableNames[kCosPointingAngle] = "cos(#theta_{pointing})"; @@ -1521,6 +1523,7 @@ void VarManager::SetDefaultVarNames() fgVarNamesMap["kVertexingLxyzProjected"] = kVertexingLxyzProjected; fgVarNamesMap["kVertexingTauzProjected"] = kVertexingTauzProjected; fgVarNamesMap["kVertexingTauxyProjected"] = kVertexingTauxyProjected; + fgVarNamesMap["kVertexingTauxyProjectedPoleJPsiMass"] = kVertexingTauxyProjectedPoleJPsiMass; fgVarNamesMap["kVertexingTauxyProjectedNs"] = kVertexingTauxyProjectedNs; fgVarNamesMap["kVertexingTauxyzProjected"] = kVertexingTauxyzProjected; fgVarNamesMap["kVertexingTauz"] = kVertexingTauz; diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 8cf5853c9a7..66224b79a75 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -635,6 +635,7 @@ class VarManager : public TObject kVertexingLxyzProjected, kVertexingTauzProjected, kVertexingTauxyProjected, + kVertexingTauxyProjectedPoleJPsiMass, kVertexingTauxyProjectedNs, kVertexingTauxyzProjected, kVertexingTauz, @@ -3406,6 +3407,7 @@ void VarManager::FillPairVertexing(C const& collision, T const& t1, T const& t2, values[kVertexingLxyzProjected] = ((secondaryVertex[0] - collision.posX()) * v12.Px()) + ((secondaryVertex[1] - collision.posY()) * v12.Py()) + ((secondaryVertex[2] - collision.posZ()) * v12.Pz()); values[kVertexingLxyzProjected] = values[kVertexingLxyzProjected] / TMath::Sqrt((v12.Px() * v12.Px()) + (v12.Py() * v12.Py()) + (v12.Pz() * v12.Pz())); values[kVertexingTauxyProjected] = values[kVertexingLxyProjected] * v12.M() / (v12.Pt()); + values[kVertexingTauxyProjectedPoleJPsiMass] = values[kVertexingLxyProjected] * o2::constants::physics::MassJPsi / (v12.Pt()); values[kVertexingTauxyProjectedNs] = values[kVertexingTauxyProjected] / o2::constants::physics::LightSpeedCm2NS; values[kVertexingTauzProjected] = values[kVertexingLzProjected] * v12.M() / TMath::Abs(v12.Pz()); values[kVertexingTauxyzProjected] = values[kVertexingLxyzProjected] * v12.M() / (v12.P()); @@ -3494,6 +3496,7 @@ void VarManager::FillPairVertexing(C const& collision, T const& t1, T const& t2, values[kVertexingLxyzProjected] = (dxPair2PV * KFGeoTwoProng.GetPx()) + (dyPair2PV * KFGeoTwoProng.GetPy()) + (dzPair2PV * KFGeoTwoProng.GetPz()); values[kVertexingLxyzProjected] = values[kVertexingLxyzProjected] / TMath::Sqrt((KFGeoTwoProng.GetPx() * KFGeoTwoProng.GetPx()) + (KFGeoTwoProng.GetPy() * KFGeoTwoProng.GetPy()) + (KFGeoTwoProng.GetPz() * KFGeoTwoProng.GetPz())); values[kVertexingTauxyProjected] = values[kVertexingLxyProjected] * KFGeoTwoProng.GetMass() / (KFGeoTwoProng.GetPt()); + values[kVertexingTauxyProjectedPoleJPsiMass] = values[kVertexingLxyProjected] * o2::constants::physics::MassJPsi / (KFGeoTwoProng.GetPt()); values[kVertexingTauxyProjectedNs] = values[kVertexingTauxyProjected] / o2::constants::physics::LightSpeedCm2NS; values[kVertexingTauzProjected] = values[kVertexingLzProjected] * KFGeoTwoProng.GetMass() / TMath::Abs(KFGeoTwoProng.GetPz()); } diff --git a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx index 153073490b8..fe86e4a8621 100644 --- a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx +++ b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx @@ -87,6 +87,7 @@ DECLARE_SOA_COLUMN(McFlag, mcFlag, int8_t); DECLARE_SOA_COLUMN(Massee, massee, float); DECLARE_SOA_COLUMN(Ptee, ptee, float); DECLARE_SOA_COLUMN(Lxyee, lxyee, float); +DECLARE_SOA_COLUMN(LxyeePoleMass, lxyeepolemass, float); DECLARE_SOA_COLUMN(Lzee, lzee, float); DECLARE_SOA_COLUMN(AmbiguousInBunchPairs, AmbiguousJpsiPairsInBunch, bool); DECLARE_SOA_COLUMN(AmbiguousOutOfBunchPairs, AmbiguousJpsiPairsOutOfBunch, bool); @@ -100,7 +101,7 @@ DECLARE_SOA_TABLE(MuonTrackCuts, "AOD", "DQANAMUONCUTS", dqanalysisflags::IsMuon DECLARE_SOA_TABLE(MuonAmbiguities, "AOD", "DQMUONAMB", dqanalysisflags::MuonAmbiguityInBunch, dqanalysisflags::MuonAmbiguityOutOfBunch); //! joinable to ReducedMuonTracks DECLARE_SOA_TABLE(Prefilter, "AOD", "DQPREFILTER", dqanalysisflags::IsBarrelSelectedPrefilter); //! joinable to ReducedTracksAssoc DECLARE_SOA_TABLE(BmesonCandidates, "AOD", "DQBMESONS", dqanalysisflags::massBcandidate, dqanalysisflags::deltaMassBcandidate, dqanalysisflags::pTBcandidate, dqanalysisflags::LxyBcandidate, dqanalysisflags::LxyzBcandidate, dqanalysisflags::LzBcandidate, dqanalysisflags::TauxyBcandidate, dqanalysisflags::TauzBcandidate, dqanalysisflags::DCAxyzBetweenProngs, dqanalysisflags::CosPBcandidate, dqanalysisflags::Chi2Bcandidate, dqanalysisflags::McFlag); -DECLARE_SOA_TABLE(JPsieeCandidates, "AOD", "DQPSEUDOPROPER", dqanalysisflags::Massee, dqanalysisflags::Ptee, dqanalysisflags::Lxyee, dqanalysisflags::Lzee, dqanalysisflags::AmbiguousInBunchPairs, dqanalysisflags::AmbiguousOutOfBunchPairs, dqanalysisflags::Corrassoc); +DECLARE_SOA_TABLE(JPsieeCandidates, "AOD", "DQPSEUDOPROPER", dqanalysisflags::Massee, dqanalysisflags::Ptee, dqanalysisflags::Lxyee, dqanalysisflags::LxyeePoleMass, dqanalysisflags::Lzee, dqanalysisflags::AmbiguousInBunchPairs, dqanalysisflags::AmbiguousOutOfBunchPairs, dqanalysisflags::Corrassoc); } // namespace o2::aod // Declarations of various short names @@ -1839,7 +1840,7 @@ struct AnalysisSameEventPairing { fHistMan->FillHistClass(histNames[icut][0].Data(), VarManager::fgValues); // reconstructed, unmatched for (unsigned int isig = 0; isig < fRecMCSignals.size(); isig++) { // loop over MC signals if (mcDecision & (static_cast(1) << isig)) { - PromptNonPromptSepTable(VarManager::fgValues[VarManager::kMass], VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kVertexingTauxyProjected], VarManager::fgValues[VarManager::kVertexingTauzProjected], isAmbiInBunch, isAmbiOutOfBunch, isCorrect_pair); + PromptNonPromptSepTable(VarManager::fgValues[VarManager::kMass], VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kVertexingTauxyProjected], VarManager::fgValues[VarManager::kVertexingTauxyProjectedPoleJPsiMass], VarManager::fgValues[VarManager::kVertexingTauzProjected], isAmbiInBunch, isAmbiOutOfBunch, isCorrect_pair); fHistMan->FillHistClass(histNamesMC[icut * fRecMCSignals.size() + isig][0].Data(), VarManager::fgValues); // matched signal if (fConfigQA) { if (isCorrectAssoc_leg1 && isCorrectAssoc_leg2) { // correct track-collision association diff --git a/PWGDQ/Tasks/tableReader_withAssoc.cxx b/PWGDQ/Tasks/tableReader_withAssoc.cxx index 999ceebff6e..d0fc2fb839c 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.cxx +++ b/PWGDQ/Tasks/tableReader_withAssoc.cxx @@ -93,6 +93,7 @@ DECLARE_SOA_COLUMN(Chi2Bcandidate, chi2Bcandidate, float); DECLARE_SOA_COLUMN(Massee, massJPsi2ee, float); DECLARE_SOA_COLUMN(Ptee, ptJPsi2ee, float); DECLARE_SOA_COLUMN(Lxyee, lxyJPsi2ee, float); +DECLARE_SOA_COLUMN(LxyeePoleMass, lxyJPsi2eePoleMass, float); DECLARE_SOA_COLUMN(Lzee, lzJPsi2ee, float); DECLARE_SOA_COLUMN(AmbiguousInBunchPairs, AmbiguousJpsiPairsInBunch, bool); DECLARE_SOA_COLUMN(AmbiguousOutOfBunchPairs, AmbiguousJpsiPairsOutOfBunch, bool); @@ -106,7 +107,7 @@ DECLARE_SOA_TABLE(MuonTrackCuts, "AOD", "DQANAMUONCUTSA", dqanalysisflags::IsMuo DECLARE_SOA_TABLE(MuonAmbiguities, "AOD", "DQMUONAMBA", dqanalysisflags::MuonAmbiguityInBunch, dqanalysisflags::MuonAmbiguityOutOfBunch); //! joinable to ReducedMuonTracks DECLARE_SOA_TABLE(Prefilter, "AOD", "DQPREFILTERA", dqanalysisflags::IsBarrelSelectedPrefilter); //! joinable to ReducedTracksAssoc DECLARE_SOA_TABLE(BmesonCandidates, "AOD", "DQBMESONSA", dqanalysisflags::massBcandidate, dqanalysisflags::deltamassBcandidate, dqanalysisflags::pTBcandidate, dqanalysisflags::LxyBcandidate, dqanalysisflags::LxyzBcandidate, dqanalysisflags::LzBcandidate, dqanalysisflags::TauxyBcandidate, dqanalysisflags::TauzBcandidate, dqanalysisflags::CosPBcandidate, dqanalysisflags::Chi2Bcandidate); -DECLARE_SOA_TABLE(JPsieeCandidates, "AOD", "DQPSEUDOPROPER", dqanalysisflags::Massee, dqanalysisflags::Ptee, dqanalysisflags::Lxyee, dqanalysisflags::Lzee, dqanalysisflags::AmbiguousInBunchPairs, dqanalysisflags::AmbiguousOutOfBunchPairs); +DECLARE_SOA_TABLE(JPsieeCandidates, "AOD", "DQPSEUDOPROPER", dqanalysisflags::Massee, dqanalysisflags::Ptee, dqanalysisflags::Lxyee, dqanalysisflags::LxyeePoleMass, dqanalysisflags::Lzee, dqanalysisflags::AmbiguousInBunchPairs, dqanalysisflags::AmbiguousOutOfBunchPairs); } // namespace o2::aod // Declarations of various short names @@ -1703,7 +1704,7 @@ struct AnalysisSameEventPairing { isUnambiguous = !(isAmbiInBunch || isAmbiOutOfBunch); if (sign1 * sign2 < 0) { fHistMan->FillHistClass(histNames[icut][0].Data(), VarManager::fgValues); - PromptNonPromptSepTable(VarManager::fgValues[VarManager::kMass], VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kVertexingTauxyProjected], VarManager::fgValues[VarManager::kVertexingTauzProjected], isAmbiInBunch, isAmbiOutOfBunch); + PromptNonPromptSepTable(VarManager::fgValues[VarManager::kMass], VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kVertexingTauxyProjected], VarManager::fgValues[VarManager::kVertexingTauxyProjectedPoleJPsiMass], VarManager::fgValues[VarManager::kVertexingTauzProjected], isAmbiInBunch, isAmbiOutOfBunch); if (isAmbiInBunch) { fHistMan->FillHistClass(histNames[icut][3 + histIdxOffset].Data(), VarManager::fgValues); } From 976aad1fbf6835ed8e31a3252fc538b6c0068623 Mon Sep 17 00:00:00 2001 From: alcaliva <32872606+alcaliva@users.noreply.github.com> Date: Mon, 17 Feb 2025 16:30:38 +0100 Subject: [PATCH 0267/1650] [PWGLF] moved calculation of perpendicular cone outside of particle loop (#10017) --- PWGLF/Tasks/Nuspex/antinucleiInJets.cxx | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx index 643824ff125..b3f576b3013 100644 --- a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx +++ b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx @@ -460,6 +460,14 @@ struct AntinucleiInJets { continue; isAtLeastOneJetSelected = true; + // perpendicular cone + double coneRadius = std::sqrt(jet.area() / PI); + TVector3 jetAxis(jet.px(), jet.py(), jet.pz()); // before or after subtraction of perpendicular cone? + TVector3 ueAxis1(0, 0, 0); + TVector3 ueAxis2(0, 0, 0); + getPerpendicularAxis(jetAxis, ueAxis1, +1); + getPerpendicularAxis(jetAxis, ueAxis2, -1); + // get jet constituents std::vector jetConstituents = jet.constituents(); o2::aod::ITSResponse itsResponse; @@ -541,14 +549,7 @@ struct AntinucleiInJets { } } - // perpendicular cone - double coneRadius = std::sqrt(jet.area() / PI); - TVector3 jetAxis(jet.px(), jet.py(), jet.pz()); - TVector3 ueAxis1(0, 0, 0); - TVector3 ueAxis2(0, 0, 0); - getPerpendicularAxis(jetAxis, ueAxis1, +1); - getPerpendicularAxis(jetAxis, ueAxis2, -1); - + // underlying event for (auto track : tracks) { // o2-linter: disable=[const-ref-in-for-loop] // get corresponding track and apply track selection criteria @@ -678,12 +679,14 @@ struct AntinucleiInJets { if ((std::fabs(jet.eta()) + rJet) > (maxEta - 0.05)) continue; njetsInAcc++; + registryQC.fill(HIST("sumPtJetCone"), jet.pt()); // jet pt must be larger than threshold fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jet, rhoPerp, rhoMPerp); if (getCorrectedPt(jetMinusBkg.pt()) < minJetPt) continue; njetsHighPt++; + registryQC.fill(HIST("sumPtJet"), jet.pt()); // jet properties and perpendicular cone std::vector jetConstituents = jet.constituents(); @@ -696,7 +699,6 @@ struct AntinucleiInJets { registryQC.fill(HIST("jetEffectiveArea"), jet.area() / (PI * rJet * rJet)); registryQC.fill(HIST("NchJetCone"), static_cast(jetConstituents.size())); - registryQC.fill(HIST("sumPtJetCone"), jet.pt()); // loop over jet constituents for (const auto& particle : jetConstituents) { // o2-linter: disable=[const-ref-in-for-loop] @@ -731,7 +733,6 @@ struct AntinucleiInJets { registryQC.fill(HIST("NchUE"), 0.5 * nParticlesPerp); registryQC.fill(HIST("NchJet"), static_cast(jetConstituents.size()) - 0.5 * nParticlesPerp); registryQC.fill(HIST("sumPtUE"), 0.5 * ptPerp); - registryQC.fill(HIST("sumPtJet"), jet.pt() - 0.5 * ptPerp); } registryQC.fill(HIST("nJetsFound"), static_cast(jets.size())); registryQC.fill(HIST("nJetsInAcceptance"), njetsInAcc); From 0fcbcf02947421d972bc01f0c65e85b78e1e616f Mon Sep 17 00:00:00 2001 From: Junlee Kim Date: Mon, 17 Feb 2025 17:33:28 +0100 Subject: [PATCH 0268/1650] [PWGLF] calculating ITS-TPC matching efficiency (#10014) Co-authored-by: ALICE Action Bot --- .../Tasks/Strangeness/lambdapolarization.cxx | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/PWGLF/Tasks/Strangeness/lambdapolarization.cxx b/PWGLF/Tasks/Strangeness/lambdapolarization.cxx index 15dad3e7e15..489b70cc9b7 100644 --- a/PWGLF/Tasks/Strangeness/lambdapolarization.cxx +++ b/PWGLF/Tasks/Strangeness/lambdapolarization.cxx @@ -42,6 +42,7 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Qvectors.h" +#include "Common/DataModel/PIDResponseITS.h" #include "Common/Core/trackUtilities.h" #include "Common/Core/TrackSelection.h" @@ -57,6 +58,7 @@ #include "CCDB/BasicCCDBManager.h" #include "PWGLF/DataModel/LFStrangenessTables.h" +#include "PWGMM/Mult/DataModel/Index.h" // for Particles2Tracks table using namespace o2; using namespace o2::framework; @@ -168,6 +170,18 @@ struct lambdapolarization { std::string fullCCDBShiftCorrPath; + double GetPhiInRange(double phi) + { + double result = phi; + while (result < 0) { + result = result + 2. * TMath::Pi() / 2; + } + while (result > 2. * TMath::Pi() / 2) { + result = result - 2. * TMath::Pi() / 2; + } + return result; + } + template int GetDetId(const T& name) { @@ -301,6 +315,16 @@ struct lambdapolarization { } } + if (doprocessMC_ITSTPC) { + histos.add("hImpactParameter", "Impact parameter", kTH1F, {{200, 0.0f, 20.0f}}); + histos.add("hEventPlaneAngle", "hEventPlaneAngle", kTH1F, {{200, -2.0f * TMath::Pi(), 2.0f * TMath::Pi()}}); + histos.add("hEventPlaneAngleRec", "hEventPlaneAngleRec", kTH1F, {{200, -2.0f * TMath::Pi(), 2.0f * TMath::Pi()}}); + histos.add("hNchVsImpactParameter", "hNchVsImpactParameter", kTH2F, {{200, 0.0f, 20.0f}, {500, -0.5f, 5000.5f}}); + histos.add("hSparseMCGenWeight", "hSparseMCGenWeight", HistType::kTHnSparseF, {centAxis, {36, 0.0f, TMath::Pi()}, {50, 0.0f, 1}, ptAxis, {8, -0.8, 0.8}}); + histos.add("hSparseMCRecWeight", "hSparseMCRecWeight", HistType::kTHnSparseF, {centAxis, {36, 0.0f, TMath::Pi()}, {50, 0.0f, 1}, ptAxis, {8, -0.8, 0.8}}); + histos.add("hSparseMCRecAllTrackWeight", "hSparseMCRecAllTrackWeight", HistType::kTHnSparseF, {centAxis, {36, 0.0, TMath::Pi()}, {50, 0.0f, 1}, ptAxis, {8, -0.8, 0.8}}); + } + if (cfgShiftCorrDef) { for (auto i = 2; i < cfgnMods + 2; i++) { histos.add(Form("psi%d/ShiftFIT", i), "", kTProfile3D, {centQaAxis, basisAxis, shiftAxis}); @@ -855,6 +879,89 @@ struct lambdapolarization { } // FIXME: need to fill different histograms for different harmonic } PROCESS_SWITCH(lambdapolarization, processData, "Process Event for data", true); + + using recoTracks = soa::Join; + void processMC_ITSTPC(aod::McCollision const& mcCollision, soa::Join const& mcParticles, recoTracks const&) + { + float imp = mcCollision.impactParameter(); + float evPhi = mcCollision.eventPlaneAngle() / 2.0; + float centclass = -999; + if (imp >= 0 && imp < 3.49) { + centclass = 2.5; + } + if (imp >= 3.49 && imp < 4.93) { + centclass = 7.5; + } + if (imp >= 4.93 && imp < 6.98) { + centclass = 15.0; + } + if (imp >= 6.98 && imp < 8.55) { + centclass = 25.0; + } + if (imp >= 8.55 && imp < 9.87) { + centclass = 35.0; + } + if (imp >= 9.87 && imp < 11) { + centclass = 45.0; + } + if (imp >= 11 && imp < 12.1) { + centclass = 55.0; + } + if (imp >= 12.1 && imp < 13.1) { + centclass = 65.0; + } + if (imp >= 13.1 && imp < 14) { + centclass = 75.0; + } + // if (evPhi < 0) + // evPhi += 2. * TMath::Pi(); + + int nCh = 0; + + if (centclass > 0 && centclass < 80) { + // event within range + histos.fill(HIST("hImpactParameter"), imp); + histos.fill(HIST("hEventPlaneAngle"), evPhi); + for (auto const& mcParticle : mcParticles) { + + float deltaPhi = mcParticle.phi() - mcCollision.eventPlaneAngle(); + // focus on bulk: e, mu, pi, k, p + int pdgCode = TMath::Abs(mcParticle.pdgCode()); + if (pdgCode != 3122) + continue; + if (!mcParticle.isPhysicalPrimary()) + continue; + if (TMath::Abs(mcParticle.eta()) > 0.8) // main acceptance + continue; + histos.fill(HIST("hSparseMCGenWeight"), centclass, GetPhiInRange(deltaPhi), TMath::Power(TMath::Cos(2.0 * GetPhiInRange(deltaPhi)), 2.0), mcParticle.pt(), mcParticle.eta()); + nCh++; + bool validGlobal = false; + bool validAny = false; + if (mcParticle.has_tracks()) { + auto const& tracks = mcParticle.tracks_as(); + for (auto const& track : tracks) { + if (track.hasTPC() && track.hasITS()) { + validGlobal = true; + } + if (track.hasTPC() || track.hasITS()) { + validAny = true; + } + } + } + // if valid global, fill + if (validGlobal) { + histos.fill(HIST("hSparseMCRecWeight"), centclass, GetPhiInRange(deltaPhi), TMath::Power(TMath::Cos(2.0 * GetPhiInRange(deltaPhi)), 2.0), mcParticle.pt(), mcParticle.eta()); + } + if (validAny) { + histos.fill(HIST("hSparseMCRecAllTrackWeight"), centclass, GetPhiInRange(deltaPhi), TMath::Power(TMath::Cos(2.0 * GetPhiInRange(deltaPhi)), 2.0), mcParticle.pt(), mcParticle.eta()); + histos.fill(HIST("hEventPlaneAngleRec"), GetPhiInRange(deltaPhi)); + } + // if any track present, fill + } + } + histos.fill(HIST("hNchVsImpactParameter"), imp, nCh); + } + PROCESS_SWITCH(lambdapolarization, processMC_ITSTPC, "Process MC for ITSTPC", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 1e64217322134d519ca1ee0f84260b825e0f6ea7 Mon Sep 17 00:00:00 2001 From: Pritam Chakraborty <47203359+prchakra@users.noreply.github.com> Date: Mon, 17 Feb 2025 18:31:08 +0100 Subject: [PATCH 0269/1650] [PWGCF] FemtoUniverse: Adding MC truth and reco info for PbPb (#10020) Co-authored-by: ALICE Action Bot --- .../femtoUniverseProducerTask.cxx | 61 +++++++++++++- ...ersePairTaskTrackTrack3DMultKtExtended.cxx | 80 ++++++++++++++----- 2 files changed, 117 insertions(+), 24 deletions(-) diff --git a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx index 705af03faac..6f74943d1e9 100644 --- a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx +++ b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx @@ -75,6 +75,8 @@ using FemtoFullCollisionCentRun2 = using FemtoFullCollisionCentRun3 = soa::Join::iterator; using FemtoFullCollisionMC = soa::Join::iterator; +using FemtoFullCollisionCentRun3MCs = + soa::Join; using FemtoFullCollisionCentRun3MC = soa::Join::iterator; using FemtoFullTracks = @@ -467,10 +469,10 @@ struct FemtoUniverseProducerTask { void init(InitContext&) { - if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackCascadeData || doprocessTrackD0mesonData || doprocessTrackD0DataML || doprocessTrackCentRun2Data || doprocessTrackV0CentRun2Data || doprocessTrackCentRun3Data || doprocessV0CentRun3Data || doprocessCascadeCentRun3Data || doprocessTrackDataCentPP) == false && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth || doprocessTrackMCGen || doprocessTruthAndFullMCV0 || doprocessTruthAndFullMCCasc || doprocessFullMCCent || doprocessTrackCentRun3DataMC) == false) { + if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackCascadeData || doprocessTrackD0mesonData || doprocessTrackD0DataML || doprocessTrackCentRun2Data || doprocessTrackV0CentRun2Data || doprocessTrackCentRun3Data || doprocessV0CentRun3Data || doprocessCascadeCentRun3Data || doprocessTrackDataCentPP) == false && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth || doprocessTrackMCGen || doprocessTruthAndFullMCV0 || doprocessTruthAndFullMCCasc || doprocessFullMCCent || doprocessTrackCentRun3DataMC || doprocessTruthAndFullMCCentRun3) == false) { LOGF(fatal, "Neither processFullData nor processFullMC enabled. Please choose one."); } - if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackCascadeData || doprocessTrackD0mesonData || doprocessTrackD0DataML || doprocessTrackCentRun2Data || doprocessTrackV0CentRun2Data || doprocessTrackCentRun3Data || doprocessV0CentRun3Data || doprocessCascadeCentRun3Data || doprocessTrackDataCentPP) == true && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth || doprocessTrackMCGen || doprocessTruthAndFullMCV0 || doprocessTruthAndFullMCCasc || doprocessFullMCCent || doprocessTrackCentRun3DataMC) == true) { + if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackCascadeData || doprocessTrackD0mesonData || doprocessTrackD0DataML || doprocessTrackCentRun2Data || doprocessTrackV0CentRun2Data || doprocessTrackCentRun3Data || doprocessV0CentRun3Data || doprocessCascadeCentRun3Data || doprocessTrackDataCentPP) == true && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth || doprocessTrackMCGen || doprocessTruthAndFullMCV0 || doprocessTruthAndFullMCCasc || doprocessFullMCCent || doprocessTrackCentRun3DataMC || doprocessTruthAndFullMCCentRun3) == true) { LOGF(fatal, "Cannot enable process Data and process MC at the same time. " "Please choose one."); @@ -925,6 +927,19 @@ struct FemtoUniverseProducerTask { } } + template + bool fillMCTruthCollisionsCentRun3(CollisionType const& col) + { + const auto vtxZ = col.posZ(); + + if (std::abs(vtxZ) > confEvtZvtx) { + return false; + } else { + outputCollision(vtxZ, 0, 0, 2, mMagField); + return true; + } + } + template void fillCollisionsCentRun3ColExtra(CollisionType const& col, double irrate) { @@ -2011,6 +2026,7 @@ struct FemtoUniverseProducerTask { Preslice perMCCollision = aod::mcparticle::mcCollisionId; PresliceUnsorted> recoCollsPerMCColl = aod::mcparticle::mcCollisionId; + PresliceUnsorted> recoCollsPerMCCollCentPbPb = aod::mcparticle::mcCollisionId; Preslice> perCollisionTracks = aod::track::collisionId; template void processTruthAndFullMC( @@ -2052,6 +2068,47 @@ struct FemtoUniverseProducerTask { } } + void processTruthAndFullMCCentRun3(aod::McCollisions const& mccols, + aod::McParticles const& mcParticles, + aod::FemtoFullCollisionCentRun3MCs const& collisions, + soa::Filtered> const& tracks, + aod::BCsWithTimestamps const&) + { + // recos + std::set recoMcIds; + for (const auto& col : collisions) { + auto groupedTracks = tracks.sliceBy(perCollisionTracks, col.globalIndex()); + auto bc = col.bc_as(); + getMagneticFieldTesla(bc); + const auto ir = mRateFetcher.fetch(ccdb.service, bc.timestamp(), mRunNumber, "ZNC hadronic") * 1.e-3; // fetch IR + + // fill the tables + const auto colcheck = fillCollisionsCentRun3(col); + if (colcheck) { + fillCollisionsCentRun3ColExtra(col, ir); + fillTracks(groupedTracks); + } + for (const auto& track : groupedTracks) { + if (trackCuts.isSelectedMinimal(track)) + recoMcIds.insert(track.mcParticleId()); + } + } + + // truth + for (const auto& mccol : mccols) { + auto groupedCollisions = collisions.sliceBy(recoCollsPerMCCollCentPbPb, mccol.globalIndex()); + for (const auto& col : groupedCollisions) { + const auto colcheck = fillMCTruthCollisionsCentRun3(col); // fills the reco collisions for mc collision + if (colcheck) { + auto groupedMCParticles = mcParticles.sliceBy(perMCCollision, mccol.globalIndex()); + outputCollExtra(1.0, 1.0); + fillParticles(groupedMCParticles, recoMcIds); // fills mc particles + } + } + } + } + PROCESS_SWITCH(FemtoUniverseProducerTask, processTruthAndFullMCCentRun3, "Provide both MC truth and reco for tracks in Pb-Pb", false); + Preslice> perCollisionV0s = aod::track::collisionId; void processTruthAndFullMCV0( aod::McCollisions const& mccols, diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack3DMultKtExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack3DMultKtExtended.cxx index d80ff0327e8..9fb4531076f 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack3DMultKtExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack3DMultKtExtended.cxx @@ -32,6 +32,7 @@ #include "PWGCF/FemtoUniverse/Core/FemtoUniverseEventHisto.h" #include "PWGCF/FemtoUniverse/Core/FemtoUniversePairCleaner.h" #include "PWGCF/FemtoUniverse/Core/FemtoUniverse3DContainer.h" +#include "PWGCF/FemtoUniverse/Core/FemtoUniverseContainer.h" #include "PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h" #include "PWGCF/FemtoUniverse/Core/femtoUtils.h" #include "PWGCF/FemtoUniverse/Core/FemtoUniverseMath.h" @@ -75,15 +76,17 @@ struct femtoUniversePairTaskTrackTrack3DMultKtExtended { Configurable ConfUse3D{"ConfUse3D", false, "Enable three dimensional histogramms (to be used only for analysis with high statistics): k* vs mT vs multiplicity"}; } twotracksconfigs; + SliceCache cache; + using FemtoFullParticles = soa::Join; - // Filters for selecting particles (both p1 and p2) Filter trackAdditionalfilter = (nabs(aod::femtouniverseparticle::eta) < twotracksconfigs.ConfEtaMax); // example filtering on configurable using FilteredFemtoFullParticles = soa::Filtered; - // using FilteredFemtoFullParticles = FemtoFullParticles; //if no filtering is applied uncomment this option - - SliceCache cache; Preslice perCol = aod::femtouniverseparticle::fdCollisionId; + using FemtoRecoParticles = soa::Join; + using FilteredFemtoRecoParticles = soa::Filtered; + Preslice perColMC = aod::femtouniverseparticle::fdCollisionId; + /// Particle 1 struct : o2::framework::ConfigurableGroup { Configurable ConfPDGCodePartOne{"ConfPDGCodePartOne", 211, "Particle 1 - PDG code"}; @@ -97,7 +100,7 @@ struct femtoUniversePairTaskTrackTrack3DMultKtExtended { /// Partition for particle 1 Partition partsOne = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kTrack)) && aod::femtouniverseparticle::sign == trackonefilter.ConfChargePart1 && aod::femtouniverseparticle::pt < trackonefilter.ConfPtHighPart1 && aod::femtouniverseparticle::pt > trackonefilter.ConfPtLowPart1; - Partition> partsOneMC = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kTrack)) && aod::femtouniverseparticle::sign == trackonefilter.ConfChargePart1 && aod::femtouniverseparticle::pt < trackonefilter.ConfPtHighPart1 && aod::femtouniverseparticle::pt > trackonefilter.ConfPtLowPart1; + Partition partsOneMC = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kTrack)) && aod::femtouniverseparticle::sign == trackonefilter.ConfChargePart1 && aod::femtouniverseparticle::pt < trackonefilter.ConfPtHighPart1 && aod::femtouniverseparticle::pt > trackonefilter.ConfPtLowPart1; // /// Histogramming for particle 1 @@ -117,7 +120,7 @@ struct femtoUniversePairTaskTrackTrack3DMultKtExtended { /// Partition for particle 2 Partition partsTwo = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kTrack)) && (aod::femtouniverseparticle::sign == tracktwofilter.ConfChargePart2) && aod::femtouniverseparticle::pt < tracktwofilter.ConfPtHighPart2 && aod::femtouniverseparticle::pt > tracktwofilter.ConfPtLowPart2; - Partition> partsTwoMC = aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kTrack) && (aod::femtouniverseparticle::sign == tracktwofilter.ConfChargePart2) && aod::femtouniverseparticle::pt < tracktwofilter.ConfPtHighPart2 && aod::femtouniverseparticle::pt > tracktwofilter.ConfPtLowPart2; + Partition partsTwoMC = aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kTrack) && (aod::femtouniverseparticle::sign == tracktwofilter.ConfChargePart2) && aod::femtouniverseparticle::pt < tracktwofilter.ConfPtHighPart2 && aod::femtouniverseparticle::pt > tracktwofilter.ConfPtLowPart2; /// Histogramming for particle 2 FemtoUniverseParticleHisto trackHistoPartTwo; @@ -170,6 +173,8 @@ struct femtoUniversePairTaskTrackTrack3DMultKtExtended { Configurable ConfCPRdeltaEtaCutMax{"ConfCPRdeltaEtaCutMax", 0.0, "Delta Eta max cut for Close Pair Rejection"}; Configurable ConfCPRdeltaEtaCutMin{"ConfCPRdeltaEtaCutMin", 0.0, "Delta Eta min cut for Close Pair Rejection"}; Configurable ConfCPRChosenRadii{"ConfCPRChosenRadii", 0.80, "Delta Eta cut for Close Pair Rejection"}; + Configurable ConfPhiBins{"ConfPhiBins", 29, "Number of phi bins in deta dphi"}; + Configurable ConfEtaBins{"ConfEtaBins", 29, "Number of eta bins in deta dphi"}; Configurable cfgProcessPM{"cfgProcessPM", false, "Process particles of the opposite charge"}; Configurable cfgProcessPP{"cfgProcessPP", true, "Process particles of the same, positice charge"}; Configurable cfgProcessMM{"cfgProcessMM", true, "Process particles of the same, positice charge"}; @@ -177,6 +182,9 @@ struct femtoUniversePairTaskTrackTrack3DMultKtExtended { Configurable cfgProcessKtBins{"cfgProcessKtBins", true, "Process kstar histograms in kT bins (if cfgProcessMultBins is set false, this will not be processed regardless this Configurable state)"}; Configurable cfgProcessKtMt3DCF{"cfgProcessKtMt3DCF", false, "Process 3D histograms in kT and Mult bins"}; + FemtoUniverseContainer sameEventCont1D; + FemtoUniverseContainer mixedEventCont1D; + FemtoUniverse3DContainer sameEventCont; FemtoUniverse3DContainer mixedEventCont; @@ -205,6 +213,7 @@ struct femtoUniversePairTaskTrackTrack3DMultKtExtended { /// Histogram output HistogramRegistry qaRegistry{"TrackQA", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry resultRegistry{"Correlations", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry resultRegistry1D{"Correlations1D", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry resultRegistryPM{"CorrelationsPM", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry resultRegistryPP{"CorrelationsPP", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry resultRegistryMM{"CorrelationsMM", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; @@ -393,6 +402,10 @@ struct femtoUniversePairTaskTrackTrack3DMultKtExtended { sameEventMultContPP.init(&SameMultRegistryPP, ConfkstarBins, ConfMultKstarBins, ConfKtKstarBins, cfgProcessKtBins, cfgProcessKtMt3DCF); mixedEventMultContPP.init(&MixedMultRegistryPP, ConfkstarBins, ConfMultKstarBins, ConfKtKstarBins, cfgProcessKtBins, cfgProcessKtMt3DCF); } + sameEventCont1D.init(&resultRegistry1D, ConfkstarBins, ConfMultBins, ConfkTBins, ConfmTBins, ConfmultBins3D, ConfmTBins3D, ConfEtaBins, ConfPhiBins, twotracksconfigs.ConfIsMC, twotracksconfigs.ConfUse3D); + sameEventCont1D.setPDGCodes(trackonefilter.ConfPDGCodePartOne, tracktwofilter.ConfPDGCodePartTwo); + mixedEventCont1D.init(&resultRegistry1D, ConfkstarBins, ConfMultBins, ConfkTBins, ConfmTBins, ConfmultBins3D, ConfmTBins3D, ConfEtaBins, ConfPhiBins, twotracksconfigs.ConfIsMC, twotracksconfigs.ConfUse3D); + mixedEventCont1D.setPDGCodes(trackonefilter.ConfPDGCodePartOne, tracktwofilter.ConfPDGCodePartTwo); } if (cfgProcessMM) { @@ -438,8 +451,8 @@ struct femtoUniversePairTaskTrackTrack3DMultKtExtended { /// @param parts femtoUniverseParticles table (in case of Monte Carlo joined with FemtoUniverseMCLabels) /// @param magFieldTesla magnetic field of the collision /// @param multCol multiplicity of the collision - template - void doSameEvent(PartitionType groupPartsOne, PartitionType groupPartsTwo, PartType parts, float magFieldTesla, int multCol, int ContType, bool fillQA) + template + void doSameEvent(PartitionType groupPartsOne, PartitionType groupPartsTwo, PartType parts, float magFieldTesla, int multCol, int ContType, bool fillQA, [[maybe_unused]] MCParticles mcParts = nullptr) { /// Histogramming same event @@ -531,13 +544,25 @@ struct femtoUniversePairTaskTrackTrack3DMultKtExtended { k3d = FemtoUniverseMath::newpairfunc(p1, mass1, p2, mass2, ConfIsIden); sameEventMultContPP.fill3D(k3d[1], k3d[2], k3d[3], multCol, kT); } + float weight = 1.0f; + if constexpr (std::is_same::value) { + sameEventCont1D.setPair(p1, p2, multCol, twotracksconfigs.ConfUse3D, weight); + } else { + sameEventCont1D.setPair(p1, p2, multCol, twotracksconfigs.ConfUse3D, weight); + } } else { if (!cfgProcessMultBins) { - sameEventContPP.setPair(p2, p1, multCol, twotracksconfigs.ConfUse3D, ConfIsIden); + sameEventContPP.setPair(p2, p1, multCol, twotracksconfigs.ConfUse3D, ConfIsIden); } else { k3d = FemtoUniverseMath::newpairfunc(p2, mass2, p1, mass1, ConfIsIden); sameEventMultContPP.fill3D(k3d[1], k3d[2], k3d[3], multCol, kT); } + float weight = 1.0f; + if constexpr (std::is_same::value) { + sameEventCont1D.setPair(p1, p2, multCol, twotracksconfigs.ConfUse3D, weight); + } else { + sameEventCont1D.setPair(p1, p2, multCol, twotracksconfigs.ConfUse3D, weight); + } } break; } @@ -554,13 +579,25 @@ struct femtoUniversePairTaskTrackTrack3DMultKtExtended { k3d = FemtoUniverseMath::newpairfunc(p1, mass1, p2, mass2, ConfIsIden); sameEventMultContMM.fill3D(k3d[1], k3d[2], k3d[3], multCol, kT); } + float weight = 1.0f; + if constexpr (std::is_same::value) { + sameEventCont1D.setPair(p1, p2, multCol, twotracksconfigs.ConfUse3D, weight); + } else { + sameEventCont1D.setPair(p1, p2, multCol, twotracksconfigs.ConfUse3D, weight); + } } else { if (!cfgProcessMultBins) { - sameEventContMM.setPair(p2, p1, multCol, twotracksconfigs.ConfUse3D, ConfIsIden); + sameEventContMM.setPair(p2, p1, multCol, twotracksconfigs.ConfUse3D, ConfIsIden); } else { k3d = FemtoUniverseMath::newpairfunc(p2, mass2, p1, mass1, ConfIsIden); sameEventMultContMM.fill3D(k3d[1], k3d[2], k3d[3], multCol, kT); } + float weight = 1.0f; + if constexpr (std::is_same::value) { + sameEventCont1D.setPair(p1, p2, multCol, twotracksconfigs.ConfUse3D, weight); + } else { + sameEventCont1D.setPair(p1, p2, multCol, twotracksconfigs.ConfUse3D, weight); + } } break; } @@ -614,12 +651,11 @@ struct femtoUniversePairTaskTrackTrack3DMultKtExtended { /// \param col subscribe to the collision table (Monte Carlo Reconstructed reconstructed) /// \param parts subscribe to joined table FemtoUniverseParticles and FemtoUniverseMCLables to access Monte Carlo truth /// \param FemtoUniverseMCParticles subscribe to the Monte Carlo truth table - void processSameEventMC(o2::aod::FdCollision const& col, - soa::Join const& parts, - o2::aod::FdMCParticles const&) + void processSameEventMC(FilteredFDCollision const& col, + FilteredFemtoRecoParticles const& parts, + aod::FdMCParticles const& mcparts) { fillCollision(col, ConfIsCent); - auto thegroupPartsOne = partsOneMC->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); auto thegroupPartsTwo = partsTwoMC->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); @@ -631,7 +667,7 @@ struct femtoUniversePairTaskTrackTrack3DMultKtExtended { doSameEvent(thegroupPartsOne, thegroupPartsTwo, parts, col.magField(), col.multV0M(), 1, fillQA); } if (cfgProcessPP) { - doSameEvent(thegroupPartsOne, thegroupPartsOne, parts, col.magField(), col.multV0M(), 2, fillQA); + doSameEvent(thegroupPartsOne, thegroupPartsOne, parts, col.magField(), col.multV0M(), 2, fillQA, mcparts); } if (cfgProcessMM) { doSameEvent(thegroupPartsTwo, thegroupPartsTwo, parts, col.magField(), col.multV0M(), 3, fillQA); @@ -641,7 +677,7 @@ struct femtoUniversePairTaskTrackTrack3DMultKtExtended { doSameEvent(thegroupPartsOne, thegroupPartsTwo, parts, col.magField(), col.multNtr(), 1, fillQA); } if (cfgProcessPP) { - doSameEvent(thegroupPartsOne, thegroupPartsOne, parts, col.magField(), col.multNtr(), 2, fillQA); + doSameEvent(thegroupPartsOne, thegroupPartsOne, parts, col.magField(), col.multNtr(), 2, fillQA, mcparts); } if (cfgProcessMM) { doSameEvent(thegroupPartsTwo, thegroupPartsTwo, parts, col.magField(), col.multNtr(), 3, fillQA); @@ -797,9 +833,9 @@ struct femtoUniversePairTaskTrackTrack3DMultKtExtended { /// @param cols subscribe to the collisions table (Monte Carlo Reconstructed reconstructed) /// @param parts subscribe to joined table FemtoUniverseParticles and FemtoUniverseMCLables to access Monte Carlo truth /// @param FemtoUniverseMCParticles subscribe to the Monte Carlo truth table - void processMixedEventMCCent(o2::aod::FdCollisions const& cols, - soa::Join const& parts, - o2::aod::FdMCParticles const&) + void processMixedEventMCCent(FilteredFDCollisions const& cols, + FemtoRecoParticles const& parts, + aod::FdMCParticles const&) { randgen = new TRandom2(0); @@ -881,9 +917,9 @@ struct femtoUniversePairTaskTrackTrack3DMultKtExtended { /// @param cols subscribe to the collisions table (Monte Carlo Reconstructed reconstructed) /// @param parts subscribe to joined table FemtoUniverseParticles and FemtoUniverseMCLables to access Monte Carlo truth /// @param FemtoUniverseMCParticles subscribe to the Monte Carlo truth table - void processMixedEventMCNtr(o2::aod::FdCollisions& cols, - soa::Join& parts, - o2::aod::FdMCParticles&) + void processMixedEventMCNtr(FilteredFDCollisions const& cols, + FemtoRecoParticles const& parts, + aod::FdMCParticles const&) { randgen = new TRandom2(0); From 2f9eca34f309580eda1a0b146571d597d684602a Mon Sep 17 00:00:00 2001 From: yuanzhe <90246048+wang-yuanzhe@users.noreply.github.com> Date: Mon, 17 Feb 2025 18:41:31 +0100 Subject: [PATCH 0270/1650] [PWGLF] Fix bugs for hypertriton 3body mc analysis (#10021) --- PWGLF/Tasks/Nuspex/hypertriton3bodyMcqa.cxx | 41 +++++---- .../Tasks/Nuspex/hypertriton3bodyanalysis.cxx | 86 +++++++++---------- 2 files changed, 60 insertions(+), 67 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/hypertriton3bodyMcqa.cxx b/PWGLF/Tasks/Nuspex/hypertriton3bodyMcqa.cxx index ad465ca435d..ef8dfb4b958 100644 --- a/PWGLF/Tasks/Nuspex/hypertriton3bodyMcqa.cxx +++ b/PWGLF/Tasks/Nuspex/hypertriton3bodyMcqa.cxx @@ -238,7 +238,7 @@ struct Hypertriton3bodyMcqa { registry.get(HIST("hDauDeuteronMatchCounter"))->GetXaxis()->SetBinLabel(3, "hasTOF"); registry.get(HIST("hDauDeuteronMatchCounter"))->GetXaxis()->SetBinLabel(4, "hasTOF & correct collsion"); - registry.get(HIST("hDauDeuteronTOFPIDCounter"))->GetXaxis()->SetBinLabel(1, "Origin |n#sigma| >= 6"); + registry.get(HIST("hDauDeuteronTOFPIDCounter"))->GetXaxis()->SetBinLabel(1, "Origin |n#sigma| >= 5"); registry.get(HIST("hDauDeuteronTOFPIDCounter"))->GetXaxis()->SetBinLabel(2, "BothBC work"); registry.get(HIST("hDauDeuteronTOFPIDCounter"))->GetXaxis()->SetBinLabel(3, "Only BCAO2D work"); registry.get(HIST("hDauDeuteronTOFPIDCounter"))->GetXaxis()->SetBinLabel(4, "Only BCEvSel work"); @@ -361,7 +361,7 @@ struct Hypertriton3bodyMcqa { continue; } registry.fill(HIST("hEventCounter"), 1.5); - if (event_posZ_selection && abs(collision.posZ()) > 10.f) { // 10cm + if (event_posZ_selection && std::abs(collision.posZ()) > 10.f) { // 10cm continue; } registry.fill(HIST("hEventCounter"), 2.5); @@ -489,8 +489,8 @@ struct Hypertriton3bodyMcqa { // float bachExpTime = track.length() * sqrt((o2::constants::physics::MassDeuteron * o2::constants::physics::MassDeuteron) + (track.tofExpMom() * track.tofExpMom())) / (kCSPEED * track.tofExpMom()); // L*E/(p*c) = L/v float mMassHyp = o2::track::pid_constants::sMasses2Z[track.pidForTracking()]; - float bachExpTime = track.length() * sqrt((mMassHyp * mMassHyp) + (track.tofExpMom() * track.tofExpMom())) / (kCSPEED * track.tofExpMom()); // L*E/(p*c) = L/v - float tofsignal = track.trackTime() * 1000 + bachExpTime; // in ps + float bachExpTime = track.length() * std::sqrt((mMassHyp * mMassHyp) + (track.tofExpMom() * track.tofExpMom())) / (kCSPEED * track.tofExpMom()); // L*E/(p*c) = L/v + float tofsignal = track.trackTime() * 1000 + bachExpTime; // in ps float expSigma = responseDe.GetExpectedSigma(mRespParamsV2, track, tofsignal, track.tofEvTimeErr()); // tofNsigmaDe = (track.tofSignal() - track.tofEvTime() - responseDe.GetCorrectedExpectedSignal(mRespParamsV2, track)) / expSigma; @@ -581,7 +581,7 @@ struct Hypertriton3bodyMcqa { if (isPairedH3LDaughters(mctrack0, mctrack1, mctrack2)) { registry.fill(HIST("hPairedH3LDaughers"), 0); // MC mass cut, to check if the daughters are from materials - double hypertritonMCMass = RecoDecay::m(array{array{mctrack0.px(), mctrack0.py(), mctrack0.pz()}, array{mctrack1.px(), mctrack1.py(), mctrack1.pz()}, array{mctrack2.px(), mctrack2.py(), mctrack2.pz()}}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged, o2::constants::physics::MassDeuteron}); + double hypertritonMCMass = RecoDecay::m(std::array{std::array{mctrack0.px(), mctrack0.py(), mctrack0.pz()}, std::array{mctrack1.px(), mctrack1.py(), mctrack1.pz()}, std::array{mctrack2.px(), mctrack2.py(), mctrack2.pz()}}, std::array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged, o2::constants::physics::MassDeuteron}); registry.fill(HIST("hPairedH3LDaughersInvMass"), hypertritonMCMass); if (hypertritonMCMass < 2.990 || hypertritonMCMass > 2.993) continue; @@ -641,7 +641,7 @@ struct Hypertriton3bodyMcqa { /*auto responseDe = o2::pid::tof::ExpTimes(); //float bachExpTime = track.length() * sqrt((o2::constants::physics::MassDeuteron * o2::constants::physics::MassDeuteron) + (track.tofExpMom() * track.tofExpMom())) / (kCSPEED * track.tofExpMom()); // L*E/(p*c) = L/v float mMassHyp = o2::track::pid_constants::sMasses2Z[track.pidForTracking()]; - float bachExpTime = track.length() * sqrt((mMassHyp * mMassHyp) + (track.tofExpMom() * track.tofExpMom())) / (kCSPEED * track.tofExpMom()); // L*E/(p*c) = L/v + float bachExpTime = track.length() * std::sqrt((mMassHyp * mMassHyp) + (track.tofExpMom() * track.tofExpMom())) / (kCSPEED * track.tofExpMom()); // L*E/(p*c) = L/v */ tofNsigmaDeAO2D = bachelorTOFPID.GetTOFNSigma(o2::track::PID::Deuteron, track, originalcollision, collision); @@ -663,26 +663,26 @@ struct Hypertriton3bodyMcqa { registry.fill(HIST("hDauDeuteronTOFNSigmaVsColTimeRes_v2_AO2D"), originalcollision.collisionTimeRes(), tofNsigmaDeAO2D); registry.fill(HIST("hDauDeuteronTOFNSigmaVsColTimeRes_v2_EvSel"), originalcollision.collisionTimeRes(), tofNsigmaDeEvSel); - if (std::abs(track.tofNSigmaDe()) >= 6) { + if (std::abs(track.tofNSigmaDe()) >= 5) { registry.fill(HIST("hDauDeuteronTOFPIDCounter"), 0.5); - if (std::abs(tofNsigmaDeAO2D) < 6 && std::abs(tofNsigmaDeEvSel) < 6) { + if (std::abs(tofNsigmaDeAO2D) < 5 && std::abs(tofNsigmaDeEvSel) < 5) { registry.fill(HIST("hDauDeuteronTOFPIDCounter"), 1.5); - } else if (std::abs(tofNsigmaDeAO2D) < 6 && std::abs(tofNsigmaDeEvSel) >= 6) { + } else if (std::abs(tofNsigmaDeAO2D) < 5 && std::abs(tofNsigmaDeEvSel) >= 5) { registry.fill(HIST("hDauDeuteronTOFPIDCounter"), 2.5); - } else if (std::abs(tofNsigmaDeAO2D) >= 6 && std::abs(tofNsigmaDeEvSel) < 6) { + } else if (std::abs(tofNsigmaDeAO2D) >= 5 && std::abs(tofNsigmaDeEvSel) < 5) { registry.fill(HIST("hDauDeuteronTOFPIDCounter"), 3.5); - } else if (std::abs(tofNsigmaDeAO2D) >= 6 && std::abs(tofNsigmaDeEvSel) >= 6) { + } else if (std::abs(tofNsigmaDeAO2D) >= 5 && std::abs(tofNsigmaDeEvSel) >= 5) { registry.fill(HIST("hDauDeuteronTOFPIDCounter"), 4.5); } - } else if (std::abs(track.tofNSigmaDe()) < 6) { + } else if (std::abs(track.tofNSigmaDe()) < 5) { registry.fill(HIST("hDauDeuteronTOFPIDCounter_CloseBC"), 0.5); - if (std::abs(tofNsigmaDeAO2D) < 6 && std::abs(tofNsigmaDeEvSel) < 6) { + if (std::abs(tofNsigmaDeAO2D) < 5 && std::abs(tofNsigmaDeEvSel) < 5) { registry.fill(HIST("hDauDeuteronTOFPIDCounter_CloseBC"), 1.5); - } else if (std::abs(tofNsigmaDeAO2D) < 6 && std::abs(tofNsigmaDeEvSel) >= 6) { + } else if (std::abs(tofNsigmaDeAO2D) < 5 && std::abs(tofNsigmaDeEvSel) >= 5) { registry.fill(HIST("hDauDeuteronTOFPIDCounter_CloseBC"), 2.5); - } else if (std::abs(tofNsigmaDeAO2D) >= 6 && std::abs(tofNsigmaDeEvSel) < 6) { + } else if (std::abs(tofNsigmaDeAO2D) >= 5 && std::abs(tofNsigmaDeEvSel) < 5) { registry.fill(HIST("hDauDeuteronTOFPIDCounter_CloseBC"), 3.5); - } else if (std::abs(tofNsigmaDeAO2D) >= 6 && std::abs(tofNsigmaDeEvSel) >= 6) { + } else if (std::abs(tofNsigmaDeAO2D) >= 5 && std::abs(tofNsigmaDeEvSel) >= 5) { registry.fill(HIST("hDauDeuteronTOFPIDCounter_CloseBC"), 4.5); } } @@ -723,7 +723,7 @@ struct Hypertriton3bodyMcParticleCheck { void init(InitContext&) { registry.get(HIST("hMcCollCounter"))->GetXaxis()->SetBinLabel(1, "Total Counter"); - registry.get(HIST("hMcCollCounter"))->GetXaxis()->SetBinLabel(2, "Recoonstructed"); + registry.get(HIST("hMcCollCounter"))->GetXaxis()->SetBinLabel(2, "Reconstructed"); registry.get(HIST("hMcHypertritonCounter"))->GetXaxis()->SetBinLabel(1, "Hypertriton All"); registry.get(HIST("hMcHypertritonCounter"))->GetXaxis()->SetBinLabel(2, "Matter All"); @@ -736,7 +736,6 @@ struct Hypertriton3bodyMcParticleCheck { registry.get(HIST("hMcHypertritonCounter"))->GetXaxis()->SetBinLabel(9, "PtCut"); } - Configurable rapidityMCcut{"rapidityMCcut", 1, "rapidity cut MC count"}; Configurable mc_event_selection{"mc_event_selection", true, "mc event selection count post kIsTriggerTVX and kNoTimeFrameBorder"}; Configurable event_posZ_selection{"event_posZ_selection", true, "event selection count post poZ cut"}; @@ -770,7 +769,7 @@ struct Hypertriton3bodyMcParticleCheck { } } - void process(aod::McCollisions const& mcCollisions, aod::McParticles const& particlesMC, const soa::SmallGroups>& collisions, MCLabeledTracksIU const& tracks) + void process(aod::McCollisions const& mcCollisions, aod::McParticles const& particlesMC, const o2::soa::Join& collisions, MCLabeledTracksIU const& tracks) { SetTrackIDForMC(particlesMC, tracks); std::vector SelectedEvents(collisions.size()); @@ -779,7 +778,7 @@ struct Hypertriton3bodyMcParticleCheck { if (mc_event_selection && (!collision.selection_bit(aod::evsel::kIsTriggerTVX) || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder))) { continue; } - if (event_posZ_selection && abs(collision.posZ()) > 10.f) { // 10cm + if (event_posZ_selection && std::abs(collision.posZ()) > 10.f) { // 10cm continue; } SelectedEvents[nevts++] = collision.mcCollision_as().globalIndex(); @@ -866,7 +865,7 @@ struct Hypertriton3bodyMcParticleCheck { registry.fill(HIST("hMcHypertritonCounter"), 3.5); registry.fill(HIST("hMcHypertritonCounter"), 5.5); } - double hypertritonMCMass = RecoDecay::m(array{array{dauProtonMom[0], dauProtonMom[1], dauProtonMom[2]}, array{dauPionMom[0], dauPionMom[1], dauPionMom[2]}, array{dauDeuteronMom[0], dauDeuteronMom[1], dauDeuteronMom[2]}}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged, o2::constants::physics::MassDeuteron}); + double hypertritonMCMass = RecoDecay::m(std::array{std::array{dauProtonMom[0], dauProtonMom[1], dauProtonMom[2]}, std::array{dauPionMom[0], dauPionMom[1], dauPionMom[2]}, std::array{dauDeuteronMom[0], dauDeuteronMom[1], dauDeuteronMom[2]}}, std::array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged, o2::constants::physics::MassDeuteron}); registry.fill(HIST("hMcRecoInvMass"), hypertritonMCMass); if (hypertritonMCMass > 2.990 && hypertritonMCMass < 2.993) { diff --git a/PWGLF/Tasks/Nuspex/hypertriton3bodyanalysis.cxx b/PWGLF/Tasks/Nuspex/hypertriton3bodyanalysis.cxx index 6d07b9e1de4..b8aeb1d34c3 100644 --- a/PWGLF/Tasks/Nuspex/hypertriton3bodyanalysis.cxx +++ b/PWGLF/Tasks/Nuspex/hypertriton3bodyanalysis.cxx @@ -9,20 +9,15 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. // -// StoredVtx3BodyDatas analysis task -// ======================== -// -// This code loops over a StoredVtx3BodyDatas table and produces some -// standard analysis output. It requires either -// the hypertriton3bodybuilder or hypertriton3bodyfinder (not recommended) tasks -// to have been executed in the workflow (before). -// -// author: yuanzhe.wang@cern.ch -// +/// \file hypertriton3bodyanalysis.cxx +/// \brief Standard analysis workflow for hypertriton 3-body decay +/// \author Yuanzhe Wang #include #include #include +#include +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -31,7 +26,7 @@ #include "ReconstructionDataFormats/Track.h" #include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" -#include "PWGLF/DataModel/LFStrangenessTables.h" +// #include "PWGLF/DataModel/LFStrangenessTables.h" #include "PWGLF/DataModel/Vtx3BodyTables.h" #include "Common/Core/TrackSelection.h" #include "Common/DataModel/TrackSelectionTables.h" @@ -43,7 +38,6 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; -using std::array; using FullTracksExtIU = soa::Join; // using FullTracksExtIU = soa::Join; // For TOF PID check @@ -93,7 +87,7 @@ struct hypertriton3bodyQa { void process(aod::Collision const& collision, aod::Vtx3BodyDatas const& vtx3bodydatas, FullTracksExtIU const& /*tracks*/) { - for (auto& vtx : vtx3bodydatas) { + for (const auto& vtx : vtx3bodydatas) { auto track0 = vtx.track0_as(); auto track1 = vtx.track1_as(); auto track2 = vtx.track2_as(); @@ -154,9 +148,9 @@ struct hypertriton3bodyAnalysis { Configurable dcapiontopv{"dcapiontopv", .05, "DCA Pion To PV"}; Configurable etacut{"etacut", 0.9, "etacut"}; Configurable rapiditycut{"rapiditycut", 1, "rapiditycut"}; - Configurable TofPidNsigmaMin{"TofPidNsigmaMin", -5, "TofPidNsigmaMin"}; - Configurable TofPidNsigmaMax{"TofPidNsigmaMax", 5, "TofPidNsigmaMax"}; - Configurable TpcPidNsigmaCut{"TpcPidNsigmaCut", 5, "TpcPidNsigmaCut"}; + Configurable tofPIDNSigmaMin{"tofPIDNSigmaMin", -5, "tofPIDNSigmaMin"}; + Configurable tofPIDNSigmaMax{"tofPIDNSigmaMax", 5, "tofPIDNSigmaMax"}; + Configurable tpcPIDNSigmaCut{"tpcPIDNSigmaCut", 5, "tpcPIDNSigmaCut"}; Configurable event_sel8_selection{"event_sel8_selection", true, "event selection count post sel8 cut"}; Configurable mc_event_selection{"mc_event_selection", true, "mc event selection count post kIsTriggerTVX and kNoTimeFrameBorder"}; Configurable event_posZ_selection{"event_posZ_selection", true, "event selection count post poZ cut"}; @@ -259,7 +253,7 @@ struct hypertriton3bodyAnalysis { void resetHistos() { - for (Int_t ii = 0; ii < kNCandSteps; ii++) { + for (int ii = 0; ii < kNCandSteps; ii++) { statisticsRegistry.candstats[ii] = 0; statisticsRegistry.truecandstats[ii] = 0; } @@ -273,7 +267,7 @@ struct hypertriton3bodyAnalysis { } void fillHistos() { - for (Int_t ii = 0; ii < kNCandSteps; ii++) { + for (int ii = 0; ii < kNCandSteps; ii++) { registry.fill(HIST("hCandidatesCounter"), ii, statisticsRegistry.candstats[ii]); if (doprocessMC == true) { registry.fill(HIST("hTrueHypertritonCounter"), ii, statisticsRegistry.truecandstats[ii]); @@ -338,7 +332,7 @@ struct hypertriton3bodyAnalysis { } FillCandCounter(kCandTPCNcls, isTrueCand); - if (std::abs(trackProton.tpcNSigmaPr()) > TpcPidNsigmaCut || std::abs(trackPion.tpcNSigmaPi()) > TpcPidNsigmaCut || std::abs(trackDeuteron.tpcNSigmaDe()) > TpcPidNsigmaCut) { + if (std::abs(trackProton.tpcNSigmaPr()) > tpcPIDNSigmaCut || std::abs(trackPion.tpcNSigmaPi()) > tpcPIDNSigmaCut || std::abs(trackDeuteron.tpcNSigmaDe()) > tpcPIDNSigmaCut) { return false; } FillCandCounter(kCandTPCPID, isTrueCand); @@ -349,7 +343,7 @@ struct hypertriton3bodyAnalysis { // registry.fill(HIST("hDeuteronDefaultTOFVsPBeforeTOFCutSig"), trackDeuteron.sign() * trackDeuteron.p(), trackDeuteron.tofNSigmaDe()); registry.fill(HIST("hDeuteronTOFVsPBeforeTOFCutSig"), trackDeuteron.sign() * trackDeuteron.p(), candData.tofNSigmaBachDe()); } - if ((candData.tofNSigmaBachDe() < TofPidNsigmaMin || candData.tofNSigmaBachDe() > TofPidNsigmaMax) && trackDeuteron.p() > minDeuteronPUseTOF) { + if ((candData.tofNSigmaBachDe() < tofPIDNSigmaMin || candData.tofNSigmaBachDe() > tofPIDNSigmaMax) && trackDeuteron.p() > minDeuteronPUseTOF) { return false; } FillCandCounter(kCandTOFPID, isTrueCand); @@ -404,7 +398,7 @@ struct hypertriton3bodyAnalysis { registry.fill(HIST("h3dMassHypertriton"), 0., candData.pt(), candData.mHypertriton()); // collision.centV0M() instead of 0. once available registry.fill(HIST("h3dTotalHypertriton"), ct, candData.pt(), candData.mHypertriton()); if (candData.mHypertriton() > lowersignallimit && candData.mHypertriton() < uppersignallimit) { - registry.fill(HIST("hDalitz"), RecoDecay::m2(array{array{candData.pxtrack0(), candData.pytrack0(), candData.pztrack0()}, array{candData.pxtrack2(), candData.pytrack2(), candData.pztrack2()}}, array{o2::constants::physics::MassProton, o2::constants::physics::MassDeuteron}), RecoDecay::m2(array{array{candData.pxtrack0(), candData.pytrack0(), candData.pztrack0()}, array{candData.pxtrack1(), candData.pytrack1(), candData.pztrack1()}}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged})); + registry.fill(HIST("hDalitz"), RecoDecay::m2(std::array{std::array{candData.pxtrack0(), candData.pytrack0(), candData.pztrack0()}, std::array{candData.pxtrack2(), candData.pytrack2(), candData.pztrack2()}}, std::array{o2::constants::physics::MassProton, o2::constants::physics::MassDeuteron}), RecoDecay::m2(std::array{std::array{candData.pxtrack0(), candData.pytrack0(), candData.pztrack0()}, std::array{candData.pxtrack1(), candData.pytrack1(), candData.pztrack1()}}, std::array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged})); } if (isTrueCand) { registry.fill(HIST("h3dTotalTrueHypertriton"), MClifetime, lPt, candData.mHypertriton()); @@ -424,7 +418,7 @@ struct hypertriton3bodyAnalysis { registry.fill(HIST("h3dMassAntiHypertriton"), 0., candData.pt(), candData.mAntiHypertriton()); // collision.centV0M() instead of 0. once available registry.fill(HIST("h3dTotalHypertriton"), ct, candData.pt(), candData.mAntiHypertriton()); if (candData.mAntiHypertriton() > lowersignallimit && candData.mAntiHypertriton() < uppersignallimit) { - registry.fill(HIST("hDalitz"), RecoDecay::m2(array{array{candData.pxtrack1(), candData.pytrack1(), candData.pztrack1()}, array{candData.pxtrack2(), candData.pytrack2(), candData.pztrack2()}}, array{o2::constants::physics::MassProton, o2::constants::physics::MassDeuteron}), RecoDecay::m2(array{array{candData.pxtrack1(), candData.pytrack1(), candData.pztrack1()}, array{candData.pxtrack0(), candData.pytrack0(), candData.pztrack0()}}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged})); + registry.fill(HIST("hDalitz"), RecoDecay::m2(std::array{std::array{candData.pxtrack1(), candData.pytrack1(), candData.pztrack1()}, std::array{candData.pxtrack2(), candData.pytrack2(), candData.pztrack2()}}, std::array{o2::constants::physics::MassProton, o2::constants::physics::MassDeuteron}), RecoDecay::m2(std::array{std::array{candData.pxtrack1(), candData.pytrack1(), candData.pztrack1()}, std::array{candData.pxtrack0(), candData.pytrack0(), candData.pztrack0()}}, std::array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged})); } if (isTrueCand) { registry.fill(HIST("h3dTotalTrueHypertriton"), MClifetime, lPt, candData.mHypertriton()); @@ -481,7 +475,7 @@ struct hypertriton3bodyAnalysis { // collect information for generated hypertriton (should be called after event selection) void GetGeneratedH3LInfo(aod::McParticles const& particlesMC) { - for (auto& mcparticle : particlesMC) { + for (const auto& mcparticle : particlesMC) { if (std::abs(mcparticle.pdgCode()) != motherPdgCode) { continue; } @@ -490,7 +484,7 @@ struct hypertriton3bodyAnalysis { bool haveProton = false, havePionPlus = false, haveDeuteron = false; bool haveAntiProton = false, havePionMinus = false, haveAntiDeuteron = false; double MClifetime = -1; - for (auto& mcparticleDaughter : mcparticle.template daughters_as()) { + for (const auto& mcparticleDaughter : mcparticle.template daughters_as()) { if (mcparticleDaughter.pdgCode() == 2212) haveProton = true; if (mcparticleDaughter.pdgCode() == -2212) @@ -533,14 +527,14 @@ struct hypertriton3bodyAnalysis { return; } registry.fill(HIST("hEventCounter"), 1.5); - if (event_posZ_selection && abs(collision.posZ()) > 10.f) { // 10cm + if (event_posZ_selection && std::abs(collision.posZ()) > 10.f) { // 10cm return; } registry.fill(HIST("hEventCounter"), 2.5); bool if_hasvtx = false; - for (auto& vtx : vtx3bodydatas) { + for (const auto& vtx : vtx3bodydatas) { CandidateAnalysis(collision, vtx, if_hasvtx); } @@ -563,7 +557,7 @@ struct hypertriton3bodyAnalysis { continue; } registry.fill(HIST("hEventCounter"), 1.5); - if (event_posZ_selection && abs(collision.posZ()) > 10.f) { // 10cm + if (event_posZ_selection && std::abs(collision.posZ()) > 10.f) { // 10cm continue; } registry.fill(HIST("hEventCounter"), 2.5); @@ -571,7 +565,7 @@ struct hypertriton3bodyAnalysis { bool if_hasvtx = false; auto vtxsthiscol = vtx3bodydatas.sliceBy(perCollisionVtx3BodyDatas, collision.globalIndex()); - for (auto& vtx : vtxsthiscol) { + for (const auto& vtx : vtxsthiscol) { // int lLabel = -1; int lPDG = -1; float lPt = -1; @@ -585,9 +579,9 @@ struct hypertriton3bodyAnalysis { auto lMCTrack1 = track1.mcParticle_as(); auto lMCTrack2 = track2.mcParticle_as(); if (lMCTrack0.has_mothers() && lMCTrack1.has_mothers() && lMCTrack2.has_mothers()) { - for (auto& lMother0 : lMCTrack0.mothers_as()) { - for (auto& lMother1 : lMCTrack1.mothers_as()) { - for (auto& lMother2 : lMCTrack2.mothers_as()) { + for (const auto& lMother0 : lMCTrack0.mothers_as()) { + for (const auto& lMother1 : lMCTrack1.mothers_as()) { + for (const auto& lMother2 : lMCTrack2.mothers_as()) { if (lMother0.globalIndex() == lMother1.globalIndex() && lMother0.globalIndex() == lMother2.globalIndex()) { // lLabel = lMother1.globalIndex(); lPt = lMother1.pt(); @@ -621,7 +615,7 @@ struct hypertriton3bodyLabelCheck { Configurable mc_event_selection{"mc_event_selection", true, "mc event selection count post kIsTriggerTVX and kNoTimeFrameBorder"}; Configurable event_posZ_selection{"event_posZ_selection", false, "event selection count post poZ cut"}; - Configurable TpcPidNsigmaCut{"TpcPidNsigmaCut", 5, "TpcPidNsigmaCut"}; + Configurable tpcPIDNSigmaCut{"tpcPIDNSigmaCut", 5, "tpcPIDNSigmaCut"}; Configurable motherPdgCode{"motherPdgCode", 1010010030, "pdgCode of mother track"}; HistogramRegistry registry{"registry", {}}; @@ -680,7 +674,7 @@ struct hypertriton3bodyLabelCheck { { // check the decay3body table std::vector set_pair; - for (auto& d3body : decay3bodys) { + for (const auto& d3body : decay3bodys) { registry.fill(HIST("hDecay3BodyCounter"), 0.5); auto lTrack0 = d3body.track0_as(); auto lTrack1 = d3body.track1_as(); @@ -695,9 +689,9 @@ struct hypertriton3bodyLabelCheck { continue; } - for (auto& lMother0 : lMCTrack0.mothers_as()) { - for (auto& lMother1 : lMCTrack1.mothers_as()) { - for (auto& lMother2 : lMCTrack2.mothers_as()) { + for (const auto& lMother0 : lMCTrack0.mothers_as()) { + for (const auto& lMother1 : lMCTrack1.mothers_as()) { + for (const auto& lMother2 : lMCTrack2.mothers_as()) { if (lMother0.globalIndex() == lMother1.globalIndex() && lMother0.globalIndex() == lMother2.globalIndex()) { registry.fill(HIST("hDecay3BodyCounter"), 1.5); // duplicated daughters check @@ -723,12 +717,12 @@ struct hypertriton3bodyLabelCheck { return; } - if (event_posZ_selection && abs(collision.posZ()) > 10.f) { // 10cm + if (event_posZ_selection && std::abs(collision.posZ()) > 10.f) { // 10cm return; } std::vector set_mothertrack; - for (auto& vtx : vtx3bodydatas) { + for (const auto& vtx : vtx3bodydatas) { registry.fill(HIST("hLabeledVtxCounter"), 0.5); if (vtx.mcParticleId() != -1) { auto mcparticle = vtx.mcParticle_as(); @@ -751,16 +745,16 @@ struct hypertriton3bodyLabelCheck { set_mothertrack.push_back(mcparticle.globalIndex()); registry.fill(HIST("hLabeledVtxCounter"), 2.5); } - if (TMath::Abs(lTrack0.tpcNSigmaPr()) > TpcPidNsigmaCut) { + if (std::abs(lTrack0.tpcNSigmaPr()) > tpcPIDNSigmaCut) { registry.fill(HIST("hPIDCounter"), 0.5); } - if (TMath::Abs(lTrack1.tpcNSigmaPi()) > TpcPidNsigmaCut) { + if (std::abs(lTrack1.tpcNSigmaPi()) > tpcPIDNSigmaCut) { registry.fill(HIST("hPIDCounter"), 1.5); } - if (TMath::Abs(lTrack2.tpcNSigmaDe()) > TpcPidNsigmaCut) { + if (std::abs(lTrack2.tpcNSigmaDe()) > tpcPIDNSigmaCut) { registry.fill(HIST("hPIDCounter"), 2.5); } - if (TMath::Abs(lTrack0.tpcNSigmaPr()) < TpcPidNsigmaCut && TMath::Abs(lTrack1.tpcNSigmaPi()) < TpcPidNsigmaCut && TMath::Abs(lTrack2.tpcNSigmaDe()) < TpcPidNsigmaCut) { + if (std::abs(lTrack0.tpcNSigmaPr()) < tpcPIDNSigmaCut && std::abs(lTrack1.tpcNSigmaPi()) < tpcPIDNSigmaCut && std::abs(lTrack2.tpcNSigmaDe()) < tpcPIDNSigmaCut) { registry.fill(HIST("hHypertritonCounter"), 1.5); } } else { @@ -774,16 +768,16 @@ struct hypertriton3bodyLabelCheck { set_mothertrack.push_back(mcparticle.globalIndex()); registry.fill(HIST("hLabeledVtxCounter"), 2.5); } - if (TMath::Abs(lTrack0.tpcNSigmaPi()) > TpcPidNsigmaCut) { + if (std::abs(lTrack0.tpcNSigmaPi()) > tpcPIDNSigmaCut) { registry.fill(HIST("hPIDCounter"), 4.5); } - if (TMath::Abs(lTrack1.tpcNSigmaPr()) > TpcPidNsigmaCut) { + if (std::abs(lTrack1.tpcNSigmaPr()) > tpcPIDNSigmaCut) { registry.fill(HIST("hPIDCounter"), 3.5); } - if (TMath::Abs(lTrack2.tpcNSigmaDe()) > TpcPidNsigmaCut) { + if (std::abs(lTrack2.tpcNSigmaDe()) > tpcPIDNSigmaCut) { registry.fill(HIST("hPIDCounter"), 5.5); } - if (TMath::Abs(lTrack0.tpcNSigmaPi()) < TpcPidNsigmaCut && TMath::Abs(lTrack1.tpcNSigmaPr()) < TpcPidNsigmaCut && TMath::Abs(lTrack2.tpcNSigmaDe()) < TpcPidNsigmaCut) { + if (std::abs(lTrack0.tpcNSigmaPi()) < tpcPIDNSigmaCut && std::abs(lTrack1.tpcNSigmaPr()) < tpcPIDNSigmaCut && std::abs(lTrack2.tpcNSigmaDe()) < tpcPIDNSigmaCut) { registry.fill(HIST("hHypertritonCounter"), 3.5); } } From 020bba1e5ce62afaaca382d40c293b65bf2b4bf8 Mon Sep 17 00:00:00 2001 From: Fabrizio Date: Mon, 17 Feb 2025 18:43:59 +0100 Subject: [PATCH 0271/1650] [PWGHF,Trigger] Updates in HF filters (#10015) Co-authored-by: ALICE Action Bot --- EventFiltering/PWGHF/HFFilter.cxx | 305 ++++++++++------ .../PWGHF/HFFilterCharmHadronSignals.cxx | 7 +- EventFiltering/PWGHF/HFFilterHelpers.h | 336 ++++++++++++++---- EventFiltering/filterTables.h | 14 +- 4 files changed, 490 insertions(+), 172 deletions(-) diff --git a/EventFiltering/PWGHF/HFFilter.cxx b/EventFiltering/PWGHF/HFFilter.cxx index 8a479e037bd..1222700797a 100644 --- a/EventFiltering/PWGHF/HFFilter.cxx +++ b/EventFiltering/PWGHF/HFFilter.cxx @@ -68,14 +68,13 @@ struct HfFilter { // Main struct for HF triggers Produces optimisationTreeCollisions; Configurable activateQA{"activateQA", 0, "flag to enable QA histos (0 no QA, 1 basic QA, 2 extended QA, 3 very extended QA)"}; - Configurable applyEventSelection{"applyEventSelection", true, "flag to enable event selection (sel8 + Zvt and possibly time-frame border cut)"}; Configurable activateSecVtxForB{"activateSecVtxForB", false, "flag to enable 2nd vertex fitting - only beauty hadrons"}; // parameters for all triggers // nsigma PID (except for V0 and cascades) - Configurable> nSigmaPidCuts{"nSigmaPidCuts", {cutsNsigma[0], 4, 7, labelsRowsNsigma, labelsColumnsNsigma}, "Nsigma cuts for ITS/TPC/TOF PID (except for V0 and cascades)"}; + Configurable> nSigmaPidCuts{"nSigmaPidCuts", {cutsNsigma[0], 4, 8, labelsRowsNsigma, labelsColumnsNsigma}, "Nsigma cuts for ITS/TPC/TOF PID (except for V0 and cascades)"}; // min and max pts for tracks and bachelors (except for V0 and cascades) - Configurable> ptCuts{"ptCuts", {cutsPt[0], 2, 7, labelsRowsCutsPt, labelsColumnsCutsPt}, "minimum and maximum pT for bachelor tracks (except for V0 and cascades)"}; + Configurable> ptCuts{"ptCuts", {cutsPt[0], 2, 8, labelsRowsCutsPt, labelsColumnsCutsPt}, "minimum and maximum pT for bachelor tracks (except for V0 and cascades)"}; // parameters for high-pT triggers Configurable> ptThresholds{"ptThresholds", {cutsHighPtThresholds[0], 1, 2, labelsEmpty, labelsColumnsHighPtThresholds}, "pT treshold for high pT charm hadron candidates for kHighPt triggers in GeV/c"}; @@ -84,20 +83,21 @@ struct HfFilter { // Main struct for HF triggers Configurable> pTBinsTrack{"pTBinsTrack", std::vector{hf_cuts_single_track::vecBinsPtTrack}, "track pT bin limits for DCAXY pT-dependent cut"}; Configurable> cutsTrackBeauty3Prong{"cutsTrackBeauty3Prong", {hf_cuts_single_track::cutsTrack[0], hf_cuts_single_track::nBinsPtTrack, hf_cuts_single_track::nCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for 3-prong beauty candidates"}; Configurable> cutsTrackBeauty4Prong{"cutsTrackBeauty4Prong", {hf_cuts_single_track::cutsTrack[0], hf_cuts_single_track::nBinsPtTrack, hf_cuts_single_track::nCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for 4-prong beauty candidates"}; + Configurable> cutsTrackBeautyToJPsi{"cutsTrackBeautyToJPsi", {hf_cuts_single_track::cutsTrack[0], hf_cuts_single_track::nBinsPtTrack, hf_cuts_single_track::nCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for beauty->JPsi candidates (not muons)"}; Configurable paramCharmMassShape{"paramCharmMassShape", "2023_pass3", "Parametrisation of charm-hadron mass shape (options: 2023_pass3)"}; Configurable numSigmaDeltaMassCharmHad{"numSigmaDeltaMassCharmHad", 2.5, "Number of sigma for charm-hadron delta mass cut in B and D resonance triggers"}; Configurable> pTBinsBHadron{"pTBinsBHadron", std::vector{hf_trigger_cuts_presel_beauty::vecBinsPt}, "pT bin limits for beauty hadrons preselections"}; - Configurable> cutsBplus{"cutsBplus", {hf_trigger_cuts_presel_beauty::cuts[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsRowsTopolBeauty}, "B+ candidate selection per pT bin"}; - Configurable> cutsBzeroToDstar{"cutsBzeroToDstar", {hf_trigger_cuts_presel_beauty::cuts[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsRowsTopolBeauty}, "B0 -> D*+ candidate selection per pT bin"}; - Configurable> cutsBzero{"cutsBzero", {hf_trigger_cuts_presel_beauty::cuts[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsRowsTopolBeauty}, "B0 candidate selection per pT bin"}; - Configurable> cutsBs{"cutsBs", {hf_trigger_cuts_presel_beauty::cuts[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsRowsTopolBeauty}, "Bs candidate selection per pT bin"}; - Configurable> cutsLb{"cutsLb", {hf_trigger_cuts_presel_beauty::cuts[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsRowsTopolBeauty}, "Lb candidate selection per pT bin"}; - Configurable> cutsXib{"cutsXib", {hf_trigger_cuts_presel_beauty::cuts[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsRowsTopolBeauty}, "Xib candidate selection per pT bin"}; + Configurable> cutsBplus{"cutsBplus", {hf_trigger_cuts_presel_beauty::cuts[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, "B+ candidate selection per pT bin"}; + Configurable> cutsBzeroToDstar{"cutsBzeroToDstar", {hf_trigger_cuts_presel_beauty::cuts[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, "B0 -> D*+ candidate selection per pT bin"}; + Configurable> cutsBzero{"cutsBzero", {hf_trigger_cuts_presel_beauty::cuts[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, "B0 candidate selection per pT bin"}; + Configurable> cutsBs{"cutsBs", {hf_trigger_cuts_presel_beauty::cuts[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, "Bs candidate selection per pT bin"}; + Configurable> cutsLb{"cutsLb", {hf_trigger_cuts_presel_beauty::cuts[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, "Lb candidate selection per pT bin"}; + Configurable> cutsXib{"cutsXib", {hf_trigger_cuts_presel_beauty::cuts[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, "Xib candidate selection per pT bin"}; + Configurable> cutsBtoJPsiX{"cutsBtoJPsiX", {hf_trigger_cuts_presel_beauty::cutsBtoJPsi[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVarsBtoJPsi, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsCutsBeautyToJPsi}, "B->JPsiX candidate selection"}; // parameters for femto triggers Configurable femtoMaxRelativeMomentum{"femtoMaxRelativeMomentum", 2., "Maximal allowed value for relative momentum between charm-proton pairs in GeV/c"}; Configurable> enableFemtoChannels{"enableFemtoChannels", {activeFemtoChannels[0], 2, 5, labelsRowsFemtoChannels, labelsColumnsFemtoChannels}, "Flags to enable/disable femto channels"}; - Configurable requireCharmMassForFemto{"requireCharmMassForFemto", false, "Flags to enable/disable cut on charm-hadron invariant-mass window for femto"}; Configurable> ptThresholdsForFemto{"ptThresholdsForFemto", {cutsPtThresholdsForFemto[0], 1, 2, labelsEmpty, labelsColumnsPtThresholdsForFemto}, "pT treshold for proton or deuteron for kFemto triggers in GeV/c"}; Configurable forceTofProtonForFemto{"forceTofProtonForFemto", true, "flag to force TOF PID for protons"}; Configurable forceTofDeuteronForFemto{"forceTofDeuteronForFemto", false, "flag to force TOF PID for deuterons"}; @@ -155,7 +155,8 @@ struct HfFilter { // Main struct for HF triggers std::array, kNCharmParticles> thresholdBDTScores; o2::vertexing::DCAFitterN<2> df2; // fitter for Charm Hadron vertex (2-prong vertex fitter) - o2::vertexing::DCAFitterN<3> df3; // fitter for Charm Hadron vertex (3-prong vertex fitter) + o2::vertexing::DCAFitterN<3> df3; // fitter for Charm/Beauty Hadron vertex (3-prong vertex fitter) + o2::vertexing::DCAFitterN<4> df4; // fitter for Beauty Hadron vertex (4-prong vertex fitter) o2::vertexing::DCAFitterN<2> dfB; // fitter for Beauty Hadron vertex (2-prong vertex fitter) o2::vertexing::DCAFitterN<3> dfBtoDstar; // fitter for Beauty Hadron to D* vertex (3-prong vertex fitter) o2::vertexing::DCAFitterN<2> dfStrangeness; // fitter for V0s and cascades (2-prong vertex fitter) @@ -168,10 +169,9 @@ struct HfFilter { // Main struct for HF triggers std::array, kNCharmParticles> hCharmHighPt{}; std::array, kNCharmParticles> hCharmProtonKstarDistr{}; std::array, kNCharmParticles> hCharmDeuteronKstarDistr{}; - std::array, kNBeautyParticles> hMassVsPtB{}; - std::array, kNCharmParticles + 18> hMassVsPtC{}; // +9 for resonances (D*+, D*0, Ds*+, Ds1+, Ds2*+, Xic+* right sign, Xic+* wrong sign, Xic0* right sign, Xic0* wrong sign) +2 for SigmaC (SigmaC++, SigmaC0) +2 for SigmaCK pairs (SigmaC++K-, SigmaC0K0s) +3 for charm baryons (Xi+Pi, Xi+Ka, Xi+Pi+Pi) - std::shared_ptr hProtonTPCPID, hProtonTOFPID; - std::shared_ptr hDeuteronTPCPID, hDeuteronTOFPID; + std::array, nTotBeautyParts> hMassVsPtB{}; + std::array, kNCharmParticles + 19> hMassVsPtC{}; // +9 for resonances (D*+, D*0, Ds*+, Ds1+, Ds2*+, Xic+* right sign, Xic+* wrong sign, Xic0* right sign, Xic0* wrong sign) +2 for SigmaC (SigmaC++, SigmaC0) +2 for SigmaCK pairs (SigmaC++K-, SigmaC0K0s) +3 for charm baryons (Xi+Pi, Xi+Ka, Xi+Pi+Pi) + JPsi + std::array, 4> hPrDePID; // proton TPC, proton TOF, deuteron TPC, deuteron TOF std::array, kNCharmParticles> hBDTScoreBkg{}; std::array, kNCharmParticles> hBDTScorePrompt{}; std::array, kNCharmParticles> hBDTScoreNonPrompt{}; @@ -196,19 +196,21 @@ struct HfFilter { // Main struct for HF triggers helper.setPtTriggerThresholdsForFemto(ptThresholdsForFemto->get(0u, 0u), ptThresholdsForFemto->get(0u, 1u)); helper.setPtBinsSingleTracks(pTBinsTrack); helper.setPtBinsBeautyHadrons(pTBinsBHadron); - helper.setPtLimitsBeautyBachelor(ptCuts->get(0u, 0u), ptCuts->get(1u, 0u)); + helper.setPtLimitsBeautyBachelor(ptCuts->get(0u, 0u), ptCuts->get(1u, 0u), ptCuts->get(0u, 7u), ptCuts->get(1u, 7u)); helper.setPtLimitsDstarSoftPion(ptCuts->get(0u, 1u), ptCuts->get(1u, 1u)); helper.setPtLimitsProtonForFemto(ptCuts->get(0u, 2u), ptCuts->get(1u, 2u)); helper.setPtLimitsDeuteronForFemto(ptCuts->get(0u, 6u), ptCuts->get(1u, 6u)); helper.setPtLimitsCharmBaryonBachelor(ptCuts->get(0u, 3u), ptCuts->get(1u, 3u)); - helper.setCutsSingleTrackBeauty(cutsTrackBeauty3Prong, cutsTrackBeauty4Prong); + helper.setCutsSingleTrackBeauty(cutsTrackBeauty3Prong, cutsTrackBeauty4Prong, cutsTrackBeauty4Prong); helper.setCutsSingleTrackCharmBaryonBachelor(cutsTrackCharmBaryonBachelor); helper.setCutsBhadrons(cutsBplus, cutsBzeroToDstar, cutsBzero, cutsBs, cutsLb, cutsXib); + helper.setCutsBtoJPsi(cutsBtoJPsiX); helper.setNsigmaProtonCutsForFemto(std::array{nSigmaPidCuts->get(0u, 3u), nSigmaPidCuts->get(1u, 3u), nSigmaPidCuts->get(2u, 3u), nSigmaPidCuts->get(3u, 3u)}); helper.setNsigmaDeuteronCutsForFemto(std::array{nSigmaPidCuts->get(0u, 6u), nSigmaPidCuts->get(1u, 6u), nSigmaPidCuts->get(2u, 6u), nSigmaPidCuts->get(3u, 6u)}); helper.setNsigmaProtonCutsForCharmBaryons(nSigmaPidCuts->get(0u, 0u), nSigmaPidCuts->get(1u, 0u)); helper.setNsigmaPionKaonCutsForDzero(nSigmaPidCuts->get(0u, 1u), nSigmaPidCuts->get(1u, 1u)); helper.setNsigmaKaonCutsFor3Prongs(nSigmaPidCuts->get(0u, 2u), nSigmaPidCuts->get(1u, 2u)); + helper.setNsigmaKaonProtonCutsForBeautyToJPsi(nSigmaPidCuts->get(0u, 7u), nSigmaPidCuts->get(1u, 7u)); helper.setForceTofForFemto(forceTofProtonForFemto, forceTofDeuteronForFemto); helper.setV0Selections(cutsGammaK0sLambda->get(0u, 0u), cutsGammaK0sLambda->get(0u, 1u), cutsGammaK0sLambda->get(0u, 2u), cutsGammaK0sLambda->get(0u, 3u), cutsGammaK0sLambda->get(0u, 4u), cutsGammaK0sLambda->get(0u, 5u)); helper.setXiSelections(cutsXiCascades->get(0u, 0u), cutsXiCascades->get(0u, 1u), cutsXiCascades->get(0u, 2u), cutsXiCascades->get(0u, 3u), cutsXiCascades->get(0u, 4u), cutsXiCascades->get(0u, 5u), cutsXiCascades->get(0u, 6u), cutsXiCascades->get(0u, 7u)); @@ -224,6 +226,7 @@ struct HfFilter { // Main struct for HF triggers dfStrangeness.setMatCorrType(matCorr); helper.setVtxConfiguration(df2, false); // (DCAFitterN, useAbsDCA) helper.setVtxConfiguration(df3, false); + helper.setVtxConfiguration(df4, false); if (activateSecVtxForB) { helper.setVtxConfiguration(dfB, true); helper.setVtxConfiguration(dfBtoDstar, true); @@ -272,7 +275,9 @@ struct HfFilter { // Main struct for HF triggers // charm baryons to LF cascades hMassVsPtC[kNCharmParticles + 15] = registry.add("fMassVsPtCharmBaryonToXiPi", "#it{M} vs. #it{p}_{T} distribution of triggered #Xi+#pi candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 15]}); hMassVsPtC[kNCharmParticles + 16] = registry.add("fMassVsPtCharmBaryonToXiKa", "#it{M} vs. #it{p}_{T} distribution of triggered #Xi+K candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 16]}); - hMassVsPtC[kNCharmParticles + 17] = registry.add("fMassVsPtCharmBaryonToXiPiPi", "#it{M} vs. #it{p}_{T} distribution of triggered #Xi+K candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 17]}); + hMassVsPtC[kNCharmParticles + 17] = registry.add("fMassVsPtCharmBaryonToXiPiPi", "#it{M} vs. #it{p}_{T} distribution of triggered #Xi+#pi+#pi candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 17]}); + // JPsi + hMassVsPtC[kNCharmParticles + 18] = registry.add("fMassVsPtJPsiToMuMu", "#it{M} vs. #it{p}_{T} distribution of triggered J/#psi to #mu#mu candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 18]}); for (int iBeautyPart{0}; iBeautyPart < kNBeautyParticles; ++iBeautyPart) { hMassVsPtB[iBeautyPart] = registry.add(Form("fMassVsPt%s", beautyParticleNames[iBeautyPart].data()), Form("#it{M} vs. #it{p}_{T} distribution of triggered %s candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", beautyParticleNames[iBeautyPart].data()), HistType::kTH2D, {ptAxis, massAxisB[iBeautyPart]}); @@ -282,6 +287,9 @@ struct HfFilter { // Main struct for HF triggers hImpactParamProductVsPtB[iBeautyPart] = registry.add(Form("fImpactParamProductVsPt%s", beautyParticleNames[iBeautyPart].data()), Form("ImpactParamProduct vs. #it{p}_{T} distribution of triggered %s candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", beautyParticleNames[iBeautyPart].data()), HistType::kTH2D, {ptAxis, {100, -2.5, +2.5}}); } } + for (int iBeautyPart{kNBeautyParticles}; iBeautyPart < nTotBeautyParts; ++iBeautyPart) { + hMassVsPtB[iBeautyPart] = registry.add(Form("fMassVsPt%s", beautyParticleNames[iBeautyPart].data()), Form("#it{M} vs. #it{p}_{T} distribution of triggered %s candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", beautyParticleNames[iBeautyPart].data()), HistType::kTH2D, {ptAxis, massAxisB[iBeautyPart]}); + } constexpr int kNBinsHfVtxStages = kNHfVtxStage; std::string labels[kNBinsHfVtxStages]; labels[HfVtxStage::Skimmed] = "Skimm CharmHad-Pi pairs"; @@ -303,10 +311,10 @@ struct HfFilter { // Main struct for HF triggers hMassXi[1] = registry.add("fMassTrackedXi", "#it{M} distribution of #Xi candidates;#it{M} (GeV/#it{c}^{2});counts", HistType::kTH1D, {{100, 1.28f, 1.36f}}); if (activateQA > 1) { - hProtonTPCPID = registry.add("fProtonTPCPID", "#it{N}_{#sigma}^{TPC} vs. #it{p} for selected protons;#it{p} (GeV/#it{c});#it{N}_{#sigma}^{TPC}", HistType::kTH2D, {pAxis, nSigmaAxis}); - hProtonTOFPID = registry.add("fProtonTOFPID", "#it{N}_{#sigma}^{TOF} vs. #it{p} for selected protons;#it{p} (GeV/#it{c});#it{N}_{#sigma}^{TOF}", HistType::kTH2D, {pAxis, nSigmaAxis}); - hDeuteronTPCPID = registry.add("fDeuteronTPCPID", "#it{N}_{#sigma}^{TPC} vs. #it{p} for selected deuterons;#it{p} (GeV/#it{c});#it{N}_{#sigma}^{TPC}", HistType::kTH2D, {pAxis, nSigmaAxis}); - hDeuteronTOFPID = registry.add("fDeuteronTOFPID", "#it{N}_{#sigma}^{TOF} vs. #it{p} for selected deuterons;#it{p} (GeV/#it{c});#it{N}_{#sigma}^{TOF}", HistType::kTH2D, {pAxis, nSigmaAxis}); + hPrDePID[0] = registry.add("fProtonTPCPID", "#it{N}_{#sigma}^{TPC} vs. #it{p} for selected protons;#it{p} (GeV/#it{c});#it{N}_{#sigma}^{TPC}", HistType::kTH2D, {pAxis, nSigmaAxis}); + hPrDePID[1] = registry.add("fProtonTOFPID", "#it{N}_{#sigma}^{TOF} vs. #it{p} for selected protons;#it{p} (GeV/#it{c});#it{N}_{#sigma}^{TOF}", HistType::kTH2D, {pAxis, nSigmaAxis}); + hPrDePID[2] = registry.add("fDeuteronTPCPID", "#it{N}_{#sigma}^{TPC} vs. #it{p} for selected deuterons;#it{p} (GeV/#it{c});#it{N}_{#sigma}^{TPC}", HistType::kTH2D, {pAxis, nSigmaAxis}); + hPrDePID[3] = registry.add("fDeuteronTOFPID", "#it{N}_{#sigma}^{TOF} vs. #it{p} for selected deuterons;#it{p} (GeV/#it{c});#it{N}_{#sigma}^{TOF}", HistType::kTH2D, {pAxis, nSigmaAxis}); hV0Selected = registry.add("fV0Selected", "Selections for V0s;;counts", HistType::kTH2D, {{9, -0.5, 8.5}, {kNV0, -0.5, +kNV0 - 0.5}}); @@ -367,8 +375,8 @@ struct HfFilter { // Main struct for HF triggers for (const auto& collision : collisions) { bool keepEvent[kNtriggersHF]{false}; - if (applyEventSelection && (!collision.sel8() || std::fabs(collision.posZ()) > 11.f)) { // safety margin for Zvtx - tags(keepEvent[kHighPt2P], keepEvent[kHighPt3P], keepEvent[kBeauty3P], keepEvent[kBeauty4P], keepEvent[kFemto2P], keepEvent[kFemto3P], keepEvent[kDoubleCharm2P], keepEvent[kDoubleCharm3P], keepEvent[kDoubleCharmMix], keepEvent[kV0Charm2P], keepEvent[kV0Charm3P], keepEvent[kCharmBarToXiBach], keepEvent[kSigmaCPPK], keepEvent[kSigmaC0K0], keepEvent[kPhotonCharm2P], keepEvent[kPhotonCharm3P], keepEvent[kSingleCharm2P], keepEvent[kSingleCharm3P], keepEvent[kSingleNonPromptCharm2P], keepEvent[kSingleNonPromptCharm3P], keepEvent[kCharmBarToXiBachBach]); + if (!collision.sel8() || std::fabs(collision.posZ()) > 11.f) { // safety margin for Zvtx + tags(keepEvent[kHighPt2P], keepEvent[kHighPt3P], keepEvent[kBeauty3P], keepEvent[kBeauty4P], keepEvent[kFemto2P], keepEvent[kFemto3P], keepEvent[kDoubleCharm2P], keepEvent[kDoubleCharm3P], keepEvent[kDoubleCharmMix], keepEvent[kV0Charm2P], keepEvent[kV0Charm3P], keepEvent[kCharmBarToXiBach], keepEvent[kSigmaCPPK], keepEvent[kSigmaC0K0], keepEvent[kPhotonCharm2P], keepEvent[kPhotonCharm3P], keepEvent[kSingleCharm2P], keepEvent[kSingleCharm3P], keepEvent[kSingleNonPromptCharm2P], keepEvent[kSingleNonPromptCharm3P], keepEvent[kCharmBarToXi2Bach], keepEvent[kBtoJPsiKa], keepEvent[kBtoJPsiKstar], keepEvent[kBtoJPsiPhi], keepEvent[kBtoJPsiPrKa], keepEvent[kBtoJPsiPi]); continue; } @@ -412,16 +420,18 @@ struct HfFilter { // Main struct for HF triggers auto cand2ProngsThisColl = cand2Prongs.sliceBy(hf2ProngPerCollision, thisCollId); for (const auto& cand2Prong : cand2ProngsThisColl) { // start loop over 2 prongs - if (!TESTBIT(cand2Prong.hfflag(), o2::aod::hf_cand_2prong::DecayType::D0ToPiK)) { // check if it's a D0 + + int8_t preselD0 = TESTBIT(cand2Prong.hfflag(), o2::aod::hf_cand_2prong::DecayType::D0ToPiK); // check if it's a D0 + int8_t preselJPsiToMuMu = TESTBIT(cand2Prong.hfflag(), o2::aod::hf_cand_2prong::DecayType::JpsiToMuMu); // check if it's a JPsi + if (preselD0 == 0 && preselJPsiToMuMu == 0) { continue; } auto trackPos = tracks.rawIteratorAt(cand2Prong.prong0Id()); // positive daughter auto trackNeg = tracks.rawIteratorAt(cand2Prong.prong1Id()); // negative daughter - auto preselD0 = helper.isDzeroPreselected(trackPos, trackNeg); - if (!preselD0) { - continue; + if (preselD0) { + preselD0 = helper.isDzeroPreselected(trackPos, trackNeg); } auto trackParPos = getTrackParCov(trackPos); @@ -439,58 +449,76 @@ struct HfFilter { // Main struct for HF triggers getPxPyPz(trackParNeg, pVecNeg); } - // apply ML models + // apply ML models for D0 + bool isD0CharmTagged{false}, isD0BeautyTagged{false}, isD0SignalTagged{false}; std::vector scores{}; - scores.insert(scores.end(), cand2Prong.mlProbSkimD0ToKPi().begin(), cand2Prong.mlProbSkimD0ToKPi().end()); - if (scores.size() != 3) { - scores.resize(3); - scores[0] = 2.; - scores[1] = -1.; - scores[2] = -1.; - } - auto tagBDT = helper.isBDTSelected(scores, thresholdBDTScores[kD0]); - bool isCharmTagged = TESTBIT(tagBDT, RecoDecay::OriginType::Prompt); - bool isBeautyTagged = TESTBIT(tagBDT, RecoDecay::OriginType::NonPrompt); - bool isSignalTagged = acceptBdtBkgOnly ? TESTBIT(tagBDT, RecoDecay::OriginType::None) : (isCharmTagged || isBeautyTagged); - - if (activateQA > 1) { - hBDTScoreBkg[kD0]->Fill(scores[0]); - hBDTScorePrompt[kD0]->Fill(scores[1]); - hBDTScoreNonPrompt[kD0]->Fill(scores[2]); - } - - if (!isSignalTagged) { - continue; - } + if (preselD0) { + scores.insert(scores.end(), cand2Prong.mlProbSkimD0ToKPi().begin(), cand2Prong.mlProbSkimD0ToKPi().end()); + if (scores.size() != 3) { + scores.resize(3); + scores[0] = 2.; + scores[1] = -1.; + scores[2] = -1.; + } + auto tagBDT = helper.isBDTSelected(scores, thresholdBDTScores[kD0]); + isD0CharmTagged = TESTBIT(tagBDT, RecoDecay::OriginType::Prompt); + isD0BeautyTagged = TESTBIT(tagBDT, RecoDecay::OriginType::NonPrompt); + isD0SignalTagged = acceptBdtBkgOnly ? TESTBIT(tagBDT, RecoDecay::OriginType::None) : (isD0CharmTagged || isD0BeautyTagged); - keepEvent[kSingleCharm2P] = true; - if (isBeautyTagged) { - keepEvent[kSingleNonPromptCharm2P] = true; + if (activateQA > 1) { + hBDTScoreBkg[kD0]->Fill(scores[0]); + hBDTScorePrompt[kD0]->Fill(scores[1]); + hBDTScoreNonPrompt[kD0]->Fill(scores[2]); + } } auto pVec2Prong = RecoDecay::pVec(pVecPos, pVecNeg); auto pt2Prong = RecoDecay::pt(pVec2Prong); - if (applyOptimisation) { - optimisationTreeCharm(thisCollId, o2::constants::physics::Pdg::kD0, pt2Prong, scores[0], scores[1], scores[2]); + if (preselJPsiToMuMu) { + float ptMuonMin = cutsBtoJPsiX->get(0u, 0u); // assuming that the cut is looser in the first pT bin + auto ptPos = RecoDecay::pt(pVecPos); + auto ptNeg = RecoDecay::pt(pVecNeg); + if (ptPos < ptMuonMin || ptNeg < ptMuonMin) { + preselJPsiToMuMu = 0u; + } else { + auto massJPsiCand = RecoDecay::m(std::array{pVecPos, pVecNeg}, std::array{massMu, massMu}); + hMassVsPtC[kNCharmParticles + 18]->Fill(pt2Prong, massJPsiCand); + } } - auto selD0 = helper.isSelectedD0InMassRange(pVecPos, pVecNeg, pt2Prong, preselD0, activateQA, hMassVsPtC[kD0]); + if (!isD0SignalTagged && !preselJPsiToMuMu) { + continue; + } - if (helper.isSelectedHighPt2Prong(pt2Prong)) { - keepEvent[kHighPt2P] = true; - if (activateQA) { - hCharmHighPt[kD0]->Fill(pt2Prong); + int8_t selD0InMass{0}; + double massD0Cand{-1.}, massD0BarCand{-1.}; + if (isD0SignalTagged) { + // single D0 + keepEvent[kSingleCharm2P] = true; + if (isD0BeautyTagged) { + keepEvent[kSingleNonPromptCharm2P] = true; + } + // single D0 at high pT + if (helper.isSelectedHighPt2Prong(pt2Prong)) { + keepEvent[kHighPt2P] = true; + if (activateQA) { + hCharmHighPt[kD0]->Fill(pt2Prong); + } + } + // multi-charm selection + if (isD0CharmTagged) { + indicesDau2Prong.push_back(std::vector{trackPos.globalIndex(), trackNeg.globalIndex()}); } - } // end high-pT selection - - if (isCharmTagged) { - indicesDau2Prong.push_back(std::vector{trackPos.globalIndex(), trackNeg.globalIndex()}); - } // end multi-charm selection - // compute masses already here, needed both for B0 --> D* (--> D0 Pi) Pi and Ds1 --> D* (--> D0 Pi) K0S - auto massD0Cand = RecoDecay::m(std::array{pVecPos, pVecNeg}, std::array{massPi, massKa}); - auto massD0BarCand = RecoDecay::m(std::array{pVecPos, pVecNeg}, std::array{massKa, massPi}); + if (applyOptimisation) { + optimisationTreeCharm(thisCollId, o2::constants::physics::Pdg::kD0, pt2Prong, scores[0], scores[1], scores[2]); + } + selD0InMass = helper.isSelectedD0InMassRange(pVecPos, pVecNeg, pt2Prong, preselD0, activateQA, hMassVsPtC[kD0]); + // compute masses already here, needed both for B0 --> D* (--> D0 Pi) Pi and Ds1 --> D* (--> D0 Pi) K0S + massD0Cand = RecoDecay::m(std::array{pVecPos, pVecNeg}, std::array{massPi, massKa}); + massD0BarCand = RecoDecay::m(std::array{pVecPos, pVecNeg}, std::array{massKa, massPi}); + } auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); auto tracksWithItsPid = soa::Attach(tracks); @@ -509,9 +537,10 @@ struct HfFilter { // Main struct for HF triggers getPxPyPz(trackParThird, pVecThird); } - if (!keepEvent[kBeauty3P] && isBeautyTagged) { - auto isTrackSelected = helper.isSelectedTrackForSoftPionOrBeauty(track, trackParThird, dcaThird, kBeauty3P); - if (TESTBIT(isTrackSelected, kForBeauty) && ((TESTBIT(selD0, 0) && track.sign() < 0) || (TESTBIT(selD0, 1) && track.sign() > 0))) { // D0 pi- and D0bar pi+ + // Beauty with D0 + if (!keepEvent[kBeauty3P] && isD0BeautyTagged) { + auto isTrackSelected = helper.isSelectedTrackForSoftPionOrBeauty(track, trackParThird, dcaThird); + if (TESTBIT(isTrackSelected, kForBeauty) && ((TESTBIT(selD0InMass, 0) && track.sign() < 0) || (TESTBIT(selD0InMass, 1) && track.sign() > 0))) { // D0 pi- and D0bar pi+ auto massCand = RecoDecay::m(std::array{pVec2Prong, pVecThird}, std::array{massD0, massPi}); auto pVecBeauty3Prong = RecoDecay::pVec(pVec2Prong, pVecThird); auto ptCand = RecoDecay::pt(pVecBeauty3Prong); @@ -530,6 +559,7 @@ struct HfFilter { // Main struct for HF triggers } } else { df2.process(trackParPos, trackParNeg); + df2.propagateTracksToVertex(); std::array pVecPosVtx{}, pVecNegVtx{}; df2.getTrack(0).getPxPyPzGlo(pVecPosVtx); df2.getTrack(1).getPxPyPzGlo(pVecNegVtx); @@ -540,8 +570,8 @@ struct HfFilter { // Main struct for HF triggers if (activateQA) { registry.fill(HIST("fHfVtxStages"), 1 + HfVtxStage::BeautyVertex, kBplus); } - const auto& secondaryVertexBplus = dfB.getPCACandidate(); dfB.propagateTracksToVertex(); + const auto& secondaryVertexBplus = dfB.getPCACandidate(); std::array pVecThirdVtx{}; dfB.getTrack(0).getPxPyPzGlo(pVec2ProngVtx); dfB.getTrack(1).getPxPyPzGlo(pVecThirdVtx); @@ -566,7 +596,7 @@ struct HfFilter { // Main struct for HF triggers } } } - if (!keepEvent[kBeauty3P] && TESTBIT(isTrackSelected, kSoftPionForBeauty) && ((TESTBIT(selD0, 0) && track.sign() > 0) || (TESTBIT(selD0, 1) && track.sign() < 0))) { // D0 pi+ and D0bar pi- + if (!keepEvent[kBeauty3P] && TESTBIT(isTrackSelected, kSoftPionForBeauty) && ((TESTBIT(selD0InMass, 0) && track.sign() > 0) || (TESTBIT(selD0InMass, 1) && track.sign() < 0))) { // D0 pi+ and D0bar pi- auto pVecBeauty3Prong = RecoDecay::pVec(pVec2Prong, pVecThird); auto ptCand = RecoDecay::pt(pVecBeauty3Prong); std::array massDausD0{massPi, massKa}; @@ -595,7 +625,7 @@ struct HfFilter { // Main struct for HF triggers getPxPyPz(trackParFourth, pVecFourth); } - auto isTrackFourthSelected = helper.isSelectedTrackForSoftPionOrBeauty(trackB, trackParFourth, dcaFourth, kBeauty3P); + auto isTrackFourthSelected = helper.isSelectedTrackForSoftPionOrBeauty(trackB, trackParFourth, dcaFourth); if (track.sign() * trackB.sign() < 0 && TESTBIT(isTrackFourthSelected, kForBeauty)) { auto massCandB0 = RecoDecay::m(std::array{pVecBeauty3Prong, pVecFourth}, std::array{massDStar, massPi}); auto pVecBeauty4Prong = RecoDecay::pVec(pVec2Prong, pVecThird, pVecFourth); @@ -615,6 +645,7 @@ struct HfFilter { // Main struct for HF triggers } } else { df2.process(trackParPos, trackParNeg); + df2.propagateTracksToVertex(); std::array pVecPosVtx{}, pVecNegVtx{}; df2.getTrack(0).getPxPyPzGlo(pVecPosVtx); df2.getTrack(1).getPxPyPzGlo(pVecNegVtx); @@ -625,8 +656,8 @@ struct HfFilter { // Main struct for HF triggers if (activateQA) { registry.fill(HIST("fHfVtxStages"), 1 + HfVtxStage::BeautyVertex, kB0toDStar); } - const auto& secondaryVertexBzero = dfBtoDstar.getPCACandidate(); dfBtoDstar.propagateTracksToVertex(); + const auto& secondaryVertexBzero = dfBtoDstar.getPCACandidate(); std::array pVecThirdVtx{}, pVecFourthVtx{}; dfBtoDstar.getTrack(0).getPxPyPzGlo(pVec2ProngVtx); dfBtoDstar.getTrack(1).getPxPyPzGlo(pVecThirdVtx); @@ -655,8 +686,8 @@ struct HfFilter { // Main struct for HF triggers } // end beauty selection // 2-prong femto - if (!keepEvent[kFemto2P] && enableFemtoChannels->get(0u, 0u) && isCharmTagged && track.collisionId() == thisCollId && (TESTBIT(selD0, 0) || TESTBIT(selD0, 1) || !requireCharmMassForFemto)) { - bool isProton = helper.isSelectedTrack4Femto(track, trackParThird, activateQA, hProtonTPCPID, hProtonTOFPID, kProtonForFemto); + if (!keepEvent[kFemto2P] && enableFemtoChannels->get(0u, 0u) && isD0CharmTagged && track.collisionId() == thisCollId) { + bool isProton = helper.isSelectedTrack4Femto(track, trackParThird, activateQA, hPrDePID[0], hPrDePID[1], kProtonForFemto); if (isProton) { float relativeMomentum = helper.computeRelativeMomentum(pVecThird, pVec2Prong, massD0); if (applyOptimisation) { @@ -671,10 +702,74 @@ struct HfFilter { // Main struct for HF triggers } } // end femto selection + // Beauty with JPsi + if (preselJPsiToMuMu) { + if (TESTBIT(helper.isSelectedTrackForSoftPionOrBeauty(track, trackParThird, dcaThird), kForBeauty)) { // same for all channels + continue; + } + std::array pVecPosVtx{}, pVecNegVtx{}, pVecThirdVtx{}, pVecFourthVtx{}; + // 3-prong vertices + if (!keepEvent[kBtoJPsiKa] || !keepEvent[kBtoJPsiPi]) { + if (df3.process(trackParPos, trackParNeg, trackParThird) != 0) { + df3.propagateTracksToVertex(); + const auto& secondaryVertexBto3tracks = df3.getPCACandidate(); + df3.getTrack(0).getPxPyPzGlo(pVecPosVtx); + df3.getTrack(1).getPxPyPzGlo(pVecNegVtx); + df3.getTrack(2).getPxPyPzGlo(pVecThirdVtx); + auto isBhadSel = helper.isSelectedBhadronToJPsi<3>(std::array{pVecPosVtx, pVecNegVtx, pVecThirdVtx}, std::array{track}, std::array{static_cast(collision.posX()), static_cast(collision.posY()), static_cast(collision.posZ())}, std::array{secondaryVertexBto3tracks[0], secondaryVertexBto3tracks[1], secondaryVertexBto3tracks[2]}, activateQA, hMassVsPtB); + if (TESTBIT(isBhadSel, kBplusToJPsi)) { + keepEvent[kBtoJPsiKa] = true; + } + if (TESTBIT(isBhadSel, kBcToJPsi)) { + keepEvent[kBtoJPsiPi] = true; + } + } + } + // 4-prong vertices + if (!keepEvent[kBtoJPsiKstar] || !keepEvent[kBtoJPsiPhi] || !keepEvent[kBtoJPsiPrKa]) { + for (const auto& trackIdB : trackIdsThisCollision) { // start loop over tracks + if (keepEvent[kBtoJPsiKstar] && keepEvent[kBtoJPsiPhi] && keepEvent[kBtoJPsiPrKa]) { + break; + } + auto trackFourth = tracksWithItsPid.rawIteratorAt(trackIdB.trackId()); + if (trackFourth.globalIndex() == track.globalIndex() || trackFourth.globalIndex() == trackPos.globalIndex() || trackFourth.globalIndex() == trackNeg.globalIndex() || trackFourth.sign() * track.sign() > 0) { + continue; + } + auto trackParFourth = getTrackParCov(trackFourth); + o2::gpu::gpustd::array dcaFourth{trackFourth.dcaXY(), trackFourth.dcaZ()}; + std::array pVecFourth = trackFourth.pVector(); + if (trackFourth.collisionId() != thisCollId) { + o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParFourth, 2.f, noMatCorr, &dcaFourth); + getPxPyPz(trackParFourth, pVecFourth); + } + if (TESTBIT(helper.isSelectedTrackForSoftPionOrBeauty(trackFourth, trackParFourth, dcaFourth), kForBeauty)) { // same for all channels + continue; + } + if (df4.process(trackParPos, trackParNeg, trackParThird, trackParFourth) != 0) { + df4.propagateTracksToVertex(); + const auto& secondaryVertexBto4tracks = df4.getPCACandidate(); + df4.getTrack(0).getPxPyPzGlo(pVecPosVtx); + df4.getTrack(1).getPxPyPzGlo(pVecNegVtx); + df4.getTrack(2).getPxPyPzGlo(pVecThirdVtx); + df4.getTrack(3).getPxPyPzGlo(pVecFourthVtx); + auto isBhadSel = helper.isSelectedBhadronToJPsi<4>(std::array{pVecPosVtx, pVecNegVtx, pVecThirdVtx, pVecFourthVtx}, std::array{track, trackFourth}, std::array{static_cast(collision.posX()), static_cast(collision.posY()), static_cast(collision.posZ())}, std::array{secondaryVertexBto4tracks[0], secondaryVertexBto4tracks[1], secondaryVertexBto4tracks[2]}, activateQA, hMassVsPtB); + if (TESTBIT(isBhadSel, kB0ToJPsi)) { + keepEvent[kBtoJPsiKstar] = true; + } + if (TESTBIT(isBhadSel, kBsToJPsi)) { + keepEvent[kBtoJPsiPhi] = true; + } + if (TESTBIT(isBhadSel, kLbToJPsi)) { + keepEvent[kBtoJPsiPrKa] = true; + } + } + } + } + } } // end loop over tracks // 2-prong with Gamma (conversion photon) - if (!keepEvent[kPhotonCharm2P] && isSignalTagged && (TESTBIT(selD0, 0) || TESTBIT(selD0, 1))) { + if (!keepEvent[kPhotonCharm2P] && isD0SignalTagged && (TESTBIT(selD0InMass, 0) || TESTBIT(selD0InMass, 1))) { auto photonsThisCollision = photons.sliceBy(photonsPerCollision, thisCollId); for (const auto& photon : photonsThisCollision) { auto posTrack = photon.posTrack_as(); @@ -695,11 +790,11 @@ struct HfFilter { // Main struct for HF triggers auto pVecReso2Prong = RecoDecay::pVec(pVec2Prong, pVecPhoton); auto ptCand = RecoDecay::pt(pVecReso2Prong); if (ptCand > cutsPtDeltaMassCharmReso->get(2u, 1u)) { - if (TESTBIT(selD0, 0)) { + if (TESTBIT(selD0InMass, 0)) { massDStarCand = RecoDecay::m(std::array{pVecPos, pVecNeg, pVecPhoton}, std::array{massPi, massKa, massGamma}); massDiffDstar = massDStarCand - massD0Cand; } - if (TESTBIT(selD0, 1)) { + if (TESTBIT(selD0InMass, 1)) { massDStarBarCand = RecoDecay::m(std::array{pVecPos, pVecNeg, pVecPhoton}, std::array{massKa, massPi, massGamma}); massDiffDstarBar = massDStarBarCand - massD0BarCand; } @@ -723,7 +818,7 @@ struct HfFilter { // Main struct for HF triggers } // 2-prong with K0S or Lambda - if (!keepEvent[kV0Charm2P] && isSignalTagged && (TESTBIT(selD0, 0) || TESTBIT(selD0, 1))) { + if (!keepEvent[kV0Charm2P] && isD0SignalTagged && (TESTBIT(selD0InMass, 0) || TESTBIT(selD0InMass, 1))) { auto v0sThisCollision = v0s.sliceBy(v0sPerCollision, thisCollId); for (const auto& v0 : v0sThisCollision) { V0Cand v0Cand; @@ -752,8 +847,8 @@ struct HfFilter { // Main struct for HF triggers getPxPyPz(trackParBachelor, pVecBachelor); } - int isTrackSelected = helper.isSelectedTrackForSoftPionOrBeauty(trackBachelor, trackParBachelor, dcaBachelor, -1); - if (TESTBIT(isTrackSelected, kSoftPion) && ((TESTBIT(selD0, 0) && trackBachelor.sign() > 0) || (TESTBIT(selD0, 1) && trackBachelor.sign() < 0))) { + int isTrackSelected = helper.isSelectedTrackForSoftPionOrBeauty(trackBachelor, trackParBachelor, dcaBachelor); + if (TESTBIT(isTrackSelected, kSoftPion) && ((TESTBIT(selD0InMass, 0) && trackBachelor.sign() > 0) || (TESTBIT(selD0InMass, 1) && trackBachelor.sign() < 0))) { std::array massDausD0{massPi, massKa}; auto massD0dau = massD0Cand; if (trackBachelor.sign() < 0) { @@ -796,12 +891,12 @@ struct HfFilter { // Main struct for HF triggers auto pVecReso2Prong = RecoDecay::pVec(pVec2Prong, v0Cand.mom); auto ptCand = RecoDecay::pt(pVecReso2Prong); if (ptCand > cutsPtDeltaMassCharmReso->get(2u, 5u)) { - if (TESTBIT(selD0, 0)) { + if (TESTBIT(selD0InMass, 0)) { massXicStarCand = RecoDecay::m(std::array{pVecPos, pVecNeg, v0Cand.mom}, std::array{massPi, massKa, massLambda}); massDiffXicStarCand = massXicStarCand - massD0Cand; isRightSignXicStar = TESTBIT(selV0, kLambda); // right sign if Lambda } - if (TESTBIT(selD0, 1)) { + if (TESTBIT(selD0InMass, 1)) { massXicStarBarCand = RecoDecay::m(std::array{pVecPos, pVecNeg, v0Cand.mom}, std::array{massKa, massPi, massLambda}); massDiffXicStarBarCand = massXicStarBarCand - massD0BarCand; isRightSignXicStarBar = TESTBIT(selV0, kAntiLambda); // right sign if AntiLambda @@ -998,7 +1093,7 @@ struct HfFilter { // Main struct for HF triggers int charmParticleID[kNBeautyParticles - 2] = {o2::constants::physics::Pdg::kDPlus, o2::constants::physics::Pdg::kDS, o2::constants::physics::Pdg::kLambdaCPlus, o2::constants::physics::Pdg::kXiCPlus}; float massCharmHypos[kNBeautyParticles - 2] = {massDPlus, massDs, massLc, massXic}; - auto isTrackSelected = helper.isSelectedTrackForSoftPionOrBeauty(track, trackParFourth, dcaFourth, kBeauty4P); + auto isTrackSelected = helper.isSelectedTrackForSoftPionOrBeauty(track, trackParFourth, dcaFourth); if (track.sign() * sign3Prong < 0 && TESTBIT(isTrackSelected, kForBeauty)) { for (int iHypo{0}; iHypo < kNBeautyParticles - 2 && !keepEvent[kBeauty4P]; ++iHypo) { if (isBeautyTagged[iHypo] && (TESTBIT(is3ProngInMass[iHypo], 0) || TESTBIT(is3ProngInMass[iHypo], 1))) { @@ -1019,6 +1114,7 @@ struct HfFilter { // Main struct for HF triggers } } else { df3.process(trackParFirst, trackParSecond, trackParThird); + df3.propagateTracksToVertex(); std::array pVecFirstVtx{}, pVecSecondVtx{}, pVecThirdVtx{}; df3.getTrack(0).getPxPyPzGlo(pVecFirstVtx); df3.getTrack(1).getPxPyPzGlo(pVecSecondVtx); @@ -1030,8 +1126,8 @@ struct HfFilter { // Main struct for HF triggers if (activateQA) { registry.fill(HIST("fHfVtxStages"), 1 + HfVtxStage::BeautyVertex, iHypo + 2); } - const auto& secondaryVertexB = dfB.getPCACandidate(); dfB.propagateTracksToVertex(); + const auto& secondaryVertexB = dfB.getPCACandidate(); std::array pVecFourtVtx{}; dfB.getTrack(0).getPxPyPzGlo(pVec3ProngVtx); dfB.getTrack(1).getPxPyPzGlo(pVecFourtVtx); @@ -1060,12 +1156,12 @@ struct HfFilter { // Main struct for HF triggers } // end beauty selection // 3-prong femto - bool isProton = helper.isSelectedTrack4Femto(track, trackParFourth, activateQA, hProtonTPCPID, hProtonTOFPID, kProtonForFemto); - bool isDeuteron = helper.isSelectedTrack4Femto(track, trackParFourth, activateQA, hDeuteronTPCPID, hDeuteronTOFPID, kDeuteronForFemto); + bool isProton = helper.isSelectedTrack4Femto(track, trackParFourth, activateQA, hPrDePID[0], hPrDePID[1], kProtonForFemto); + bool isDeuteron = helper.isSelectedTrack4Femto(track, trackParFourth, activateQA, hPrDePID[2], hPrDePID[3], kDeuteronForFemto); if (isProton && track.collisionId() == thisCollId) { for (int iHypo{0}; iHypo < kNCharmParticles - 1 && !keepEvent[kFemto3P]; ++iHypo) { - if (isCharmTagged[iHypo] && enableFemtoChannels->get(0u, iHypo + 1) && (TESTBIT(is3ProngInMass[iHypo], 0) || TESTBIT(is3ProngInMass[iHypo], 1) || !requireCharmMassForFemto)) { + if (isCharmTagged[iHypo] && enableFemtoChannels->get(0u, iHypo + 1)) { float relativeMomentum = helper.computeRelativeMomentum(pVecFourth, pVec3Prong, massCharmHypos[iHypo]); if (applyOptimisation) { optimisationTreeFemto(thisCollId, charmParticleID[iHypo], pt3Prong, scores[iHypo][0], scores[iHypo][1], scores[iHypo][2], relativeMomentum, track.tpcNSigmaPr(), track.tofNSigmaPr(), track.tpcNSigmaDe(), track.tofNSigmaDe()); @@ -1080,7 +1176,7 @@ struct HfFilter { // Main struct for HF triggers } } else if (isDeuteron && track.collisionId() == thisCollId) { for (int iHypo{0}; iHypo < kNCharmParticles - 1 && !keepEvent[kFemto3P]; ++iHypo) { - if (isCharmTagged[iHypo] && enableFemtoChannels->get(1u, iHypo + 1) && (TESTBIT(is3ProngInMass[iHypo], 0) || TESTBIT(is3ProngInMass[iHypo], 1) || !requireCharmMassForFemto)) { + if (isCharmTagged[iHypo] && enableFemtoChannels->get(1u, iHypo + 1)) { float relativeMomentum = helper.computeRelativeMomentum(pVecFourth, pVec3Prong, massCharmHypos[iHypo]); if (applyOptimisation) { optimisationTreeFemto(thisCollId, charmParticleID[iHypo], pt3Prong, scores[iHypo][0], scores[iHypo][1], scores[iHypo][2], relativeMomentum, track.tpcNSigmaPr(), track.tofNSigmaPr(), track.tpcNSigmaDe(), track.tofNSigmaDe()); @@ -1134,7 +1230,7 @@ struct HfFilter { // Main struct for HF triggers o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParSoftPi, 2.f, noMatCorr, &dcaSoftPi); getPxPyPz(trackParSoftPi, pVecSoftPi); } - int8_t isSoftPionSelected = helper.isSelectedTrackForSoftPionOrBeauty(trackSoftPi, trackParSoftPi, dcaSoftPi, kSigmaCPPK); + int8_t isSoftPionSelected = helper.isSelectedTrackForSoftPionOrBeauty(trackSoftPi, trackParSoftPi, dcaSoftPi); if (TESTBIT(isSoftPionSelected, kSoftPionForSigmaC) /*&& (TESTBIT(is3Prong[2], 0) || TESTBIT(is3Prong[2], 1))*/) { // check the mass of the SigmaC++ candidate @@ -1340,7 +1436,7 @@ struct HfFilter { // Main struct for HF triggers o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParSoftPi, 2.f, noMatCorr, &dcaSoftPi); getPxPyPz(trackParSoftPi, pVecSoftPi); } - int8_t isSoftPionSelected = helper.isSelectedTrackForSoftPionOrBeauty(trackSoftPi, trackParSoftPi, dcaSoftPi, kSigmaC0K0); + int8_t isSoftPionSelected = helper.isSelectedTrackForSoftPionOrBeauty(trackSoftPi, trackParSoftPi, dcaSoftPi); if (TESTBIT(isSoftPionSelected, kSoftPionForSigmaC) /*&& (TESTBIT(is3Prong[2], 0) || TESTBIT(is3Prong[2], 1))*/) { // check the mass of the SigmaC0 candidate @@ -1398,7 +1494,7 @@ struct HfFilter { // Main struct for HF triggers } } // end loop over 3-prong candidates - if (!keepEvent[kCharmBarToXiBach] || !keepEvent[kCharmBarToXiBachBach]) { + if (!keepEvent[kCharmBarToXiBach] || !keepEvent[kCharmBarToXi2Bach]) { auto cascThisColl = cascades.sliceBy(cascPerCollision, thisCollId); for (const auto& casc : cascThisColl) { @@ -1478,10 +1574,9 @@ struct HfFilter { // Main struct for HF triggers bool isSelXiBach{false}; if (requireStrangenessTracking->get(0u, 0u) > 0) { - if (!hasStrangeTrack) { - continue; + if (hasStrangeTrack) { + isSelXiBach = helper.isSelectedXiBach(trackParCascTrack, trackParBachelor, isSelBachelor, collision, df2, activateQA, hMassVsPtC[kNCharmParticles + 15], hMassVsPtC[kNCharmParticles + 16]); } - isSelXiBach = helper.isSelectedXiBach(trackParCascTrack, trackParBachelor, isSelBachelor, collision, df2, activateQA, hMassVsPtC[kNCharmParticles + 15], hMassVsPtC[kNCharmParticles + 16]); } else { isSelXiBach = helper.isSelectedXiBach(trackParCasc, trackParBachelor, isSelBachelor, collision, dfStrangeness, activateQA, hMassVsPtC[kNCharmParticles + 15], hMassVsPtC[kNCharmParticles + 16]); } @@ -1495,7 +1590,7 @@ struct HfFilter { // Main struct for HF triggers continue; } - if (!keepEvent[kCharmBarToXiBachBach]) { + if (!keepEvent[kCharmBarToXi2Bach]) { for (const auto& trackIdSecond : trackIdsThisCollision) { // start loop over tracks (second bachelor) auto trackSecond = tracks.rawIteratorAt(trackIdSecond.trackId()); @@ -1518,20 +1613,18 @@ struct HfFilter { // Main struct for HF triggers if (!TESTBIT(isSelBachelorSecond, kPionForCharmBaryon)) { continue; } - - if (!keepEvent[kCharmBarToXiBachBach]) { // XiPiPi + if (!keepEvent[kCharmBarToXi2Bach]) { // XiPiPi bool isSelXiBachBach{false}; if (requireStrangenessTracking->get(0u, 1u) > 0) { - if (!hasStrangeTrack) { - continue; + if (hasStrangeTrack) { + isSelXiBachBach = helper.isSelectedXiBachBach<3>(trackParCascTrack, {trackParBachelor, trackParBachelorSecond}, collision, df3, activateQA, hMassVsPtC[kNCharmParticles + 17]); } - isSelXiBachBach = helper.isSelectedXiBachBach<3>(trackParCascTrack, {trackParBachelor, trackParBachelorSecond}, collision, df3, activateQA, hMassVsPtC[kNCharmParticles + 17]); } else { // vertex with only the two bachelors - isSelXiBachBach = helper.isSelectedXiBachBach<2>(trackParCascTrack, {trackParBachelor, trackParBachelorSecond}, collision, df2, activateQA, hMassVsPtC[kNCharmParticles + 17]); + isSelXiBachBach = helper.isSelectedXiBachBach<2>(trackParCasc, {trackParBachelor, trackParBachelorSecond}, collision, df2, activateQA, hMassVsPtC[kNCharmParticles + 17]); } if (isSelXiBachBach) { - keepEvent[kCharmBarToXiBachBach] = true; + keepEvent[kCharmBarToXi2Bach] = true; } } } @@ -1570,7 +1663,7 @@ struct HfFilter { // Main struct for HF triggers } } - tags(keepEvent[kHighPt2P], keepEvent[kHighPt3P], keepEvent[kBeauty3P], keepEvent[kBeauty4P], keepEvent[kFemto2P], keepEvent[kFemto3P], keepEvent[kDoubleCharm2P], keepEvent[kDoubleCharm3P], keepEvent[kDoubleCharmMix], keepEvent[kV0Charm2P], keepEvent[kV0Charm3P], keepEvent[kCharmBarToXiBach], keepEvent[kSigmaCPPK], keepEvent[kSigmaC0K0], keepEvent[kPhotonCharm2P], keepEvent[kPhotonCharm3P], keepEvent[kSingleCharm2P], keepEvent[kSingleCharm3P], keepEvent[kSingleNonPromptCharm2P], keepEvent[kSingleNonPromptCharm3P], keepEvent[kCharmBarToXiBachBach]); + tags(keepEvent[kHighPt2P], keepEvent[kHighPt3P], keepEvent[kBeauty3P], keepEvent[kBeauty4P], keepEvent[kFemto2P], keepEvent[kFemto3P], keepEvent[kDoubleCharm2P], keepEvent[kDoubleCharm3P], keepEvent[kDoubleCharmMix], keepEvent[kV0Charm2P], keepEvent[kV0Charm3P], keepEvent[kCharmBarToXiBach], keepEvent[kSigmaCPPK], keepEvent[kSigmaC0K0], keepEvent[kPhotonCharm2P], keepEvent[kPhotonCharm3P], keepEvent[kSingleCharm2P], keepEvent[kSingleCharm3P], keepEvent[kSingleNonPromptCharm2P], keepEvent[kSingleNonPromptCharm3P], keepEvent[kCharmBarToXi2Bach], keepEvent[kBtoJPsiKa], keepEvent[kBtoJPsiKstar], keepEvent[kBtoJPsiPhi], keepEvent[kBtoJPsiPrKa], keepEvent[kBtoJPsiPi]); if (!std::accumulate(keepEvent, keepEvent + kNtriggersHF, 0)) { hProcessedEvents->Fill(1); diff --git a/EventFiltering/PWGHF/HFFilterCharmHadronSignals.cxx b/EventFiltering/PWGHF/HFFilterCharmHadronSignals.cxx index 11796fc9d21..00876d642be 100644 --- a/EventFiltering/PWGHF/HFFilterCharmHadronSignals.cxx +++ b/EventFiltering/PWGHF/HFFilterCharmHadronSignals.cxx @@ -15,6 +15,9 @@ /// /// \author Fabrizio Grosa , CERN +#include +#include + #include "CCDB/BasicCCDBManager.h" #include "DataFormatsParameters/GRPMagField.h" #include "DataFormatsParameters/GRPObject.h" @@ -97,7 +100,7 @@ struct HfFilterCharmHadronSignals { // Main struct for HF triggers { helper.setPtLimitsDstarSoftPion(minPtSoftPion, maxPtSoftPion); helper.setPtBinsSingleTracks(pTBinsTrack); - helper.setCutsSingleTrackBeauty(cutsTrackBeauty3Prong, cutsTrackBeauty3Prong); + helper.setCutsSingleTrackBeauty(cutsTrackBeauty3Prong, cutsTrackBeauty3Prong, cutsTrackBeauty3Prong); helper.setMassResolParametrisation(paramCharmMassShape); helper.setNumSigmaForDeltaMassCharmHadCut(numSigmaDeltaMassCharmHad); @@ -221,7 +224,7 @@ struct HfFilterCharmHadronSignals { // Main struct for HF triggers o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParThird, 2.f, noMatCorr, &dcaThird); getPxPyPz(trackParThird, pVecThird); } - auto isTrackSelected = helper.isSelectedTrackForSoftPionOrBeauty(track, trackParThird, dcaThird, kBeauty3P); + auto isTrackSelected = helper.isSelectedTrackForSoftPionOrBeauty(track, trackParThird, dcaThird); if (TESTBIT(isTrackSelected, kSoftPion)) { std::array massDausD0{massPi, massKa}; auto invMassD0dau = invMassD0; diff --git a/EventFiltering/PWGHF/HFFilterHelpers.h b/EventFiltering/PWGHF/HFFilterHelpers.h index c2e3634625a..c4d97eec439 100644 --- a/EventFiltering/PWGHF/HFFilterHelpers.h +++ b/EventFiltering/PWGHF/HFFilterHelpers.h @@ -81,7 +81,12 @@ enum HfTriggers { kSingleCharm3P, kSingleNonPromptCharm2P, kSingleNonPromptCharm3P, - kCharmBarToXiBachBach, + kCharmBarToXi2Bach, + kBtoJPsiKa, + kBtoJPsiKstar, + kBtoJPsiPhi, + kBtoJPsiPrKa, + kBtoJPsiPi, kNtriggersHF }; @@ -104,6 +109,15 @@ enum beautyParticles { kNBeautyParticles }; +enum beautyToJPsiParticles { + kBplusToJPsi = 0, + kB0ToJPsi, + kBsToJPsi, + kLbToJPsi, + kBcToJPsi, + kNBeautyParticlesToJPsi +}; + enum bachelorTrackSelection { kRejected = 0, kSoftPion, @@ -215,10 +229,11 @@ struct CascCand { }; static const std::array charmParticleNames{"D0", "Dplus", "Ds", "Lc", "Xic"}; -static const std::array beautyParticleNames{"Bplus", "B0toDStar", "B0", "Bs", "Lb", "Xib"}; +static const int nTotBeautyParts = static_cast(kNBeautyParticles) + static_cast(kNBeautyParticlesToJPsi); +static const std::array beautyParticleNames{"Bplus", "B0toDStar", "B0", "Bs", "Lb", "Xib", "BplusToJPsi", "B0ToJPsi", "BsToJPsi", "LbToJPsi", "BcToJPsi"}; static const std::array pdgCodesCharm{421, 411, 431, 4122, 4232}; static const std::array eventTitles = {"all", "rejected"}; -static const std::vector hfTriggerNames{filtering::HfHighPt2P::columnLabel(), filtering::HfHighPt3P::columnLabel(), filtering::HfBeauty3P::columnLabel(), filtering::HfBeauty4P::columnLabel(), filtering::HfFemto2P::columnLabel(), filtering::HfFemto3P::columnLabel(), filtering::HfDoubleCharm2P::columnLabel(), filtering::HfDoubleCharm3P::columnLabel(), filtering::HfDoubleCharmMix::columnLabel(), filtering::HfV0Charm2P::columnLabel(), filtering::HfV0Charm3P::columnLabel(), filtering::HfCharmBarToXiBach::columnLabel(), filtering::HfSigmaCPPK::columnLabel(), filtering::HfSigmaC0K0::columnLabel(), filtering::HfPhotonCharm2P::columnLabel(), filtering::HfPhotonCharm3P::columnLabel(), filtering::HfSingleCharm2P::columnLabel(), filtering::HfSingleCharm3P::columnLabel(), filtering::HfSingleNonPromptCharm2P::columnLabel(), filtering::HfSingleNonPromptCharm3P::columnLabel(), filtering::HfCharmBarToXiBachBach::columnLabel()}; +static const std::vector hfTriggerNames{filtering::HfHighPt2P::columnLabel(), filtering::HfHighPt3P::columnLabel(), filtering::HfBeauty3P::columnLabel(), filtering::HfBeauty4P::columnLabel(), filtering::HfFemto2P::columnLabel(), filtering::HfFemto3P::columnLabel(), filtering::HfDoubleCharm2P::columnLabel(), filtering::HfDoubleCharm3P::columnLabel(), filtering::HfDoubleCharmMix::columnLabel(), filtering::HfV0Charm2P::columnLabel(), filtering::HfV0Charm3P::columnLabel(), filtering::HfCharmBarToXiBach::columnLabel(), filtering::HfSigmaCPPK::columnLabel(), filtering::HfSigmaC0K0::columnLabel(), filtering::HfPhotonCharm2P::columnLabel(), filtering::HfPhotonCharm3P::columnLabel(), filtering::HfSingleCharm2P::columnLabel(), filtering::HfSingleCharm3P::columnLabel(), filtering::HfSingleNonPromptCharm2P::columnLabel(), filtering::HfSingleNonPromptCharm3P::columnLabel(), filtering::HfCharmBarToXi2Bach::columnLabel(), filtering::HfBtoJPsiKa::columnLabel(), filtering::HfBtoJPsiKstar::columnLabel(), filtering::HfBtoJPsiPhi::columnLabel(), filtering::HfBtoJPsiPrKa::columnLabel(), filtering::HfBtoJPsiPi::columnLabel()}; static const std::array v0Labels{"#gamma", "K_{S}^{0}", "#Lambda", "#bar{#Lambda}"}; static const std::array v0Names{"Photon", "K0S", "Lambda", "AntiLambda"}; @@ -233,6 +248,7 @@ static const std::tuple pdgCharmDaughters{ constexpr float massPi = o2::constants::physics::MassPiPlus; constexpr float massKa = o2::constants::physics::MassKPlus; constexpr float massProton = o2::constants::physics::MassProton; +constexpr float massMu = o2::constants::physics::MassMuon; constexpr float massDeuteron = o2::constants::physics::MassDeuteron; constexpr float massGamma = o2::constants::physics::MassGamma; constexpr float massK0S = o2::constants::physics::MassK0Short; @@ -250,8 +266,11 @@ constexpr float massB0 = o2::constants::physics::MassB0; constexpr float massBs = o2::constants::physics::MassBS; constexpr float massLb = o2::constants::physics::MassLambdaB0; constexpr float massXib = o2::constants::physics::MassXiB0; +constexpr float massBc = 6.2744700f; // TODO add Bc mass to o2::constants::physics constexpr float massSigmaCPlusPlus = o2::constants::physics::MassSigmaCPlusPlus; constexpr float massSigmaC0 = o2::constants::physics::MassSigmaC0; +constexpr float massK0Star892 = o2::constants::physics::MassK0Star892; +constexpr float massJPsi = o2::constants::physics::MassJPsi; static const o2::framework::AxisSpec ptAxis{50, 0.f, 50.f}; static const o2::framework::AxisSpec pAxis{50, 0.f, 10.f}; @@ -262,8 +281,8 @@ static const o2::framework::AxisSpec alphaAxis{100, -1.f, 1.f}; static const o2::framework::AxisSpec qtAxis{100, 0.f, 0.25f}; static const o2::framework::AxisSpec bdtAxis{100, 0.f, 1.f}; static const o2::framework::AxisSpec phiAxis{36, 0., o2::constants::math::TwoPI}; -static const std::array massAxisC = {o2::framework::AxisSpec{250, 1.65f, 2.15f}, o2::framework::AxisSpec{250, 1.65f, 2.15f}, o2::framework::AxisSpec{250, 1.75f, 2.25f}, o2::framework::AxisSpec{250, 2.05f, 2.55f}, o2::framework::AxisSpec{250, 2.25f, 2.75f}, o2::framework::AxisSpec{200, 0.139f, 0.159f}, o2::framework::AxisSpec{250, 0.f, 0.25f}, o2::framework::AxisSpec{250, 0.f, 0.25f}, o2::framework::AxisSpec{200, 0.48f, 0.88f}, o2::framework::AxisSpec{200, 0.48f, 0.88f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{170, 0.13f, 0.3f}, o2::framework::AxisSpec{170, 0.13f, 0.3f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 2.3f, 2.9f}, o2::framework::AxisSpec{200, 2.3f, 2.9f}, o2::framework::AxisSpec{200, 2.3f, 2.9f}}; -static const std::array massAxisB = {o2::framework::AxisSpec{240, 4.8f, 6.0f}, o2::framework::AxisSpec{240, 4.8f, 6.0f}, o2::framework::AxisSpec{240, 4.8f, 6.0f}, o2::framework::AxisSpec{240, 4.8f, 6.0f}, o2::framework::AxisSpec{240, 5.0f, 6.2f}, o2::framework::AxisSpec{240, 5.0f, 6.2f}}; +static const std::array massAxisC = {o2::framework::AxisSpec{250, 1.65f, 2.15f}, o2::framework::AxisSpec{250, 1.65f, 2.15f}, o2::framework::AxisSpec{250, 1.75f, 2.25f}, o2::framework::AxisSpec{250, 2.05f, 2.55f}, o2::framework::AxisSpec{250, 2.25f, 2.75f}, o2::framework::AxisSpec{200, 0.139f, 0.159f}, o2::framework::AxisSpec{250, 0.f, 0.25f}, o2::framework::AxisSpec{250, 0.f, 0.25f}, o2::framework::AxisSpec{200, 0.48f, 0.88f}, o2::framework::AxisSpec{200, 0.48f, 0.88f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{170, 0.13f, 0.3f}, o2::framework::AxisSpec{170, 0.13f, 0.3f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{350, 2.3f, 3.0f}, o2::framework::AxisSpec{350, 2.3f, 3.0f}, o2::framework::AxisSpec{350, 2.3f, 3.0f}, o2::framework::AxisSpec{240, 2.4f, 3.6f}}; +static const std::array massAxisB = {o2::framework::AxisSpec{240, 4.8f, 6.0f}, o2::framework::AxisSpec{240, 4.8f, 6.0f}, o2::framework::AxisSpec{240, 4.8f, 6.0f}, o2::framework::AxisSpec{240, 4.8f, 6.0f}, o2::framework::AxisSpec{240, 5.0f, 6.2f}, o2::framework::AxisSpec{240, 5.0f, 6.2f}, o2::framework::AxisSpec{240, 4.8f, 6.0f}, o2::framework::AxisSpec{240, 4.8f, 6.0f}, o2::framework::AxisSpec{240, 5.0f, 6.2f}, o2::framework::AxisSpec{240, 5.0f, 6.2f}, o2::framework::AxisSpec{240, 5.8f, 7.0f}}; // default values for configurables // channels to trigger on for femto @@ -275,19 +294,19 @@ constexpr float cutsPtThresholdsForFemto[1][2] = {{8., 1.4}}; // proton, deutero static const std::vector labelsColumnsPtThresholdsForFemto = {"Proton", "Deuteron"}; // min and max pT for all tracks combined (except for V0 and cascades) -constexpr float cutsPt[2][7] = {{1., 0.1, 0.8, 0.5, 0.1, 0.2, 0.4}, - {100000., 100000., 5., 100000., 100000., 100000., 100000.}}; // beauty, D*, femto, SigmaC, Xic*+ -> SigmaC++K- -static const std::vector labelsColumnsCutsPt = {"Beauty", "DstarPlus", "PrForFemto", "CharmBaryon", "SoftPiSigmaC", "SoftKaonXicResoToSigmaC", "DeForFemto"}; +constexpr float cutsPt[2][8] = {{1., 0.1, 0.8, 0.5, 0.1, 0.2, 0.4, 0.5}, + {100000., 100000., 5., 100000., 100000., 100000., 100000., 100000.}}; // beauty, D*, femto, SigmaC, Xic*+ -> SigmaC++K-, beauty to JPsi +static const std::vector labelsColumnsCutsPt = {"Beauty", "DstarPlus", "PrForFemto", "CharmBaryon", "SoftPiSigmaC", "SoftKaonXicResoToSigmaC", "DeForFemto", "BeautyToJPsi"}; static const std::vector labelsRowsCutsPt = {"Minimum", "Maximum"}; // PID cuts -constexpr float cutsNsigma[4][7] = { - {3., 3., 3., 5., 3., 3., 5.}, // TPC proton from Lc, pi/K from D0, K from 3-prong, femto selected proton, pi/K from Xic/Omegac, K from Xic*->SigmaC-Kaon, femto selected deuteron - {3., 3., 3., 2.5, 3., 3., 5.}, // TOF proton from Lc, pi/K from D0, K from 3-prong, femto selected proton, pi/K from Xic/Omegac, K from Xic*->SigmaC-Kaon, femto selected deuteron - {999., 999., 999., 2.5, 999., 999., 5.}, // Sum in quadrature of TPC and TOF (used only for femto selected proton and deuteron for pT < 4 GeV/c) - {999., 999., 999., 999., 999., 999., -4.} // ITS used only for femto selected deuteron for less than pt threshold +constexpr float cutsNsigma[4][8] = { + {3., 3., 3., 5., 3., 3., 5., 3.}, // TPC proton from Lc, pi/K from D0, K from 3-prong, femto selected proton, pi/K from Xic/Omegac, K from Xic*->SigmaC-Kaon, femto selected deuteron, K/p from beauty->JPsiX + {3., 3., 3., 2.5, 3., 3., 5., 3.}, // TOF proton from Lc, pi/K from D0, K from 3-prong, femto selected proton, pi/K from Xic/Omegac, K from Xic*->SigmaC-Kaon, femto selected deuteron, K/p from beauty->JPsiX + {999., 999., 999., 2.5, 999., 999., 5., 999.}, // Sum in quadrature of TPC and TOF (used only for femto selected proton and deuteron for pT < 4 GeV/c) + {999., 999., 999., 999., 999., 999., -4., 999.} // ITS used only for femto selected deuteron for less than pt threshold }; -static const std::vector labelsColumnsNsigma = {"PrFromLc", "PiKaFromDZero", "KaFrom3Prong", "PrForFemto", "PiKaFromCharmBaryon", "SoftKaonFromXicResoToSigmaC", "DeForFemto"}; +static const std::vector labelsColumnsNsigma = {"PrFromLc", "PiKaFromDZero", "KaFrom3Prong", "PrForFemto", "PiKaFromCharmBaryon", "SoftKaonFromXicResoToSigmaC", "DeForFemto", "KaPrFromBeautyToJPsi"}; static const std::vector labelsRowsNsigma = {"TPC", "TOF", "Comb", "ITS"}; // high pt @@ -298,21 +317,26 @@ namespace hf_trigger_cuts_presel_beauty { static constexpr int nBinsPt = 2; static constexpr int nCutVars = 4; +static constexpr int nCutVarsBtoJPsi = 4; // default values for the pT bin edges (can be used to configure histogram axis) // common for any beauty candidate constexpr double binsPt[nBinsPt + 1] = { - 1., + 0., 5., 1000.0}; auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; // default values for the cuts -constexpr double cuts[nBinsPt][nCutVars] = {{0.4, -1, -1, 10.}, /* 1 < pt < 5 */ +constexpr double cuts[nBinsPt][nCutVars] = {{0.4, -1, -1, 10.}, /* 0 < pt < 5 */ {0.4, -1, -1, 10.}}; /* 5 < pt < 1000 */ +constexpr double cutsBtoJPsi[nBinsPt][nCutVarsBtoJPsi] = {{1., 0.6, 0.9, 0.02}, /* 0 < pt < 5 */ + {1., 0.8, 0.9, 0.02}}; /* 5 < pt < 1000 */ + // row labels static const std::vector labelsPt{}; // column labels -static const std::vector labelsRowsTopolBeauty = {"DeltaMassB", "minCPA", "minDecayLength", "maxImpParProd"}; +static const std::vector labelsColumnsTopolBeauty = {"DeltaMassB", "minCPA", "minDecayLength", "maxImpParProd"}; +static const std::vector labelsColumnsCutsBeautyToJPsi = {"minPtMuon", "DeltaMassB", "minCPA", "minDecayLength"}; } // namespace hf_trigger_cuts_presel_beauty @@ -345,7 +369,7 @@ static constexpr double cutsTrackDummy[o2::analysis::hf_cuts_single_track::nBins o2::framework::LabeledArray cutsSingleTrackDummy{cutsTrackDummy[0], o2::analysis::hf_cuts_single_track::nBinsPtTrack, o2::analysis::hf_cuts_single_track::nCutVarsTrack, o2::analysis::hf_cuts_single_track::labelsPtTrack, o2::analysis::hf_cuts_single_track::labelsCutVarTrack}; // manual downscale factors for tests -constexpr double defDownscaleFactors[kNtriggersHF][1] = {{1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}}; // one for each trigger +constexpr double defDownscaleFactors[kNtriggersHF][1] = {{1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}}; // one for each trigger static const std::vector labelsDownscaleFactor = {"Downscale factor"}; // Main helper class @@ -374,10 +398,11 @@ class HfFilterHelper } void setPtBinsSingleTracks(std::vector ptBins) { mPtBinsTracks = ptBins; } void setPtBinsBeautyHadrons(std::vector ptBins) { mPtBinsBeautyHadrons = ptBins; } - void setCutsSingleTrackBeauty(o2::framework::LabeledArray cutsSingleTrack3P, o2::framework::LabeledArray cutsSingleTrack4P) + void setCutsSingleTrackBeauty(o2::framework::LabeledArray cutsSingleTrack3P, o2::framework::LabeledArray cutsSingleTrack4P, o2::framework::LabeledArray cutsSingleToJPsi) { mCutsSingleTrackBeauty3Prong = cutsSingleTrack3P; mCutsSingleTrackBeauty4Prong = cutsSingleTrack4P; + mCutsSingleTrackBeautyToJPsi = cutsSingleToJPsi; } void setCutsBhadrons(o2::framework::LabeledArray cutsBplus, o2::framework::LabeledArray cutsB0toDstar, o2::framework::LabeledArray cutsB0, o2::framework::LabeledArray cutsBs, o2::framework::LabeledArray cutsLb, o2::framework::LabeledArray cutsXib) { @@ -388,6 +413,10 @@ class HfFilterHelper mCutsBhad[kLb] = cutsLb; mCutsBhad[kXib] = cutsXib; } + void setCutsBtoJPsi(o2::framework::LabeledArray cuts) + { + mCutsBhadToJPsi = cuts; + } void setPtLimitsProtonForFemto(float minPt, float maxPt) { mPtMinProtonForFemto = minPt; @@ -398,10 +427,12 @@ class HfFilterHelper mPtMinDeuteronForFemto = minPt; mPtMaxDeuteronForFemto = maxPt; } - void setPtLimitsBeautyBachelor(float minPt, float maxPt) + void setPtLimitsBeautyBachelor(float minPt, float maxPt, float minPtBtoJPsiBach, float maxPtBtoJPsiBach) { mPtMinBeautyBachelor = minPt; mPtMaxBeautyBachelor = maxPt; + mPtMinBeautyToJPsiBachelor = minPtBtoJPsiBach; + mPtMaxBeautyToJPsiBachelor = maxPtBtoJPsiBach; } void setPtLimitsDstarSoftPion(float minPt, float maxPt) { @@ -456,6 +487,11 @@ class HfFilterHelper mNSigmaTpcPiKaCutForDzero = nSigmaTpc; mNSigmaTofPiKaCutForDzero = nSigmaTof; } + void setNsigmaKaonProtonCutsForBeautyToJPsi(float nSigmaTpc, float nSigmaTof) + { + mNSigmaTpcPrKaCutForBeautyToJPsi = nSigmaTpc; + mNSigmaTofPrKaCutForBeautyToJPsi = nSigmaTof; + } void setV0Selections(float minGammaCosPa, float minK0sLambdaCosPa, float minK0sLambdaRadius, float nSigmaPrFromLambda, float deltaMassK0s, float deltaMassLambda) { mMinGammaCosinePa = minGammaCosPa; @@ -525,8 +561,8 @@ class HfFilterHelper bool isSelectedHighPt2Prong(const T& pt); template bool isSelectedHighPt3Prong(const T& pt); - template - int8_t isSelectedTrackForSoftPionOrBeauty(const T& track, const T1& trackPar, const T2& dca, const int& whichTrigger); + template + int8_t isSelectedTrackForSoftPionOrBeauty(const T& track, const T1& trackPar, const T2& dca); template bool isSelectedTrack4Femto(const T1& track, const T2& trackPar, const int& activateQA, H2 hTPCPID, H2 hTOFPID, const int& trackSpecies); template @@ -567,6 +603,8 @@ class HfFilterHelper bool isSelectedBhadronInMassRange(T1 const& ptCand, T2 const& massCand, const int whichB); template bool isSelectedBzeroToDstar(T1 const& pVecTrack0, T1 const& pVecTrack1, T1 const& pVecTrack2, const T2& primVtx, const T3& secVtx); + template + int8_t isSelectedBhadronToJPsi(std::array pVecDauTracks, std::array tracksDauNoMu, const T3& primVtx, const T4& secVtx, const int& activateQA, std::array& hMassVsPt); template bool isCharmHadronMassInSbRegions(T1 const& massHypo1, T1 const& massHypo2, const float& lowLimitSB, const float& upLimitSB); template @@ -592,10 +630,10 @@ class HfFilterHelper private: // selections - template - bool isSelectedKaon4Charm3Prong(const T& track); - template - bool isSelectedProton4CharmBaryons(const T& track); + template + bool isSelectedKaon4Charm3ProngOrBeautyToJPsi(const T& track); + template + bool isSelectedProton4CharmOrBeautyBaryons(const T& track); // PID float getTPCSplineCalib(const float tpcPin, const float dEdx, const int& pidSpecies); @@ -616,17 +654,20 @@ class HfFilterHelper std::vector mPtBinsBeautyHadrons{}; // vector of pT bins for beauty hadron candidates o2::framework::LabeledArray mCutsSingleTrackBeauty3Prong{}; // dca selections for the 3-prong b-hadron pion daughter o2::framework::LabeledArray mCutsSingleTrackBeauty4Prong{}; // dca selections for the 4-prong b-hadron pion daughter + o2::framework::LabeledArray mCutsSingleTrackBeautyToJPsi{}; // dca selections for the b-hadron -> JPsi X daughters (not the muons) float mPtMinSoftPionForDstar{0.1}; // minimum pt for the D*+ soft pion float mPtMinSoftPionForSigmaC{0.1}; // minimum pt for the Σ0,++ soft pion float mPtMaxSoftPionForSigmaC{10000.f}; // maximum pt for the Σ0,++ soft pion float mPtMinSoftKaonForXicResoToSigmaC{0.1}; // minimum pt for the soft kaon of Xic* to SigmaC-Kaon float mPtMaxSoftKaonForXicResoToSigmaC{10000.f}; // maximum pt for the soft kaon of Xic* to SigmaC-Kaon float mPtMinBeautyBachelor{0.5}; // minimum pt for the b-hadron pion daughter + float mPtMinBeautyToJPsiBachelor{0.5}; // minimum pt for the b-hadron -> JPsi X daughters (not the muons) float mPtMinProtonForFemto{0.8}; // minimum pt for the proton for femto float mPtMinDeuteronForFemto{0.8}; // minimum pt for the deuteron for femto float mPtMinCharmBaryonBachelor{0.5}; // minimum pt for the bachelor pion from Xic/Omegac decays float mPtMaxSoftPionForDstar{2.}; // maximum pt for the D*+ soft pion float mPtMaxBeautyBachelor{100000.}; // maximum pt for the b-hadron pion daughter + float mPtMaxBeautyToJPsiBachelor{100000.}; // maximum pt for the b-hadron -> JPsi X daughters (not the muons) float mPtMaxProtonForFemto{5.0}; // maximum pt for the proton for femto float mPtMaxDeuteronForFemto{5.0}; // maximum pt for the deuteron for femto float mPtMaxCharmBaryonBachelor{100000.}; // maximum pt for the bachelor pion from Xic/Omegac decays @@ -644,6 +685,8 @@ class HfFilterHelper float mNSigmaTofKaCutFor3Prongs{3.}; // maximum Nsigma TOF for kaons in 3-prong decays float mNSigmaTpcPiKaCutForDzero{3.}; // maximum Nsigma TPC for pions/kaons in D0 decays float mNSigmaTofPiKaCutForDzero{3.}; // maximum Nsigma TOF for pions/kaons in D0 decays + float mNSigmaTpcPrKaCutForBeautyToJPsi{3.}; // maximum Nsigma TPC for kaons and protons in B->JPsiX decays + float mNSigmaTofPrKaCutForBeautyToJPsi{3.}; // maximum Nsigma TPC for kaons and protons in B->JPsiX decays float mDeltaMassMinSigmaCZero{0.155}; // minimum delta mass M(pKpipi)-M(pKpi) of SigmaC0 candidates float mDeltaMassMaxSigmaCZero{0.18}; // maximum delta mass M(pKpipi)-M(pKpi) of SigmaC0 candidates float mDeltaMassMinSigmaC2520Zero{0.2}; // minimum delta mass M(pKpipi)-M(pKpi) of SigmaC(2520)0 candidates @@ -684,6 +727,7 @@ class HfFilterHelper std::array mMassMinXiBach{2.35, 2.6, 2.35}; // minimum invariant-mass for XiBachelor candidates std::array mCosPaMinXiBach{-2.f, -2.f}; // minimum cosine of pointing angle for XiBachelor candidates std::array, kNBeautyParticles> mCutsBhad{}; // selections for B-hadron candidates (DeltaMass, CPA, DecayLength, ImpactParameterProduct) + o2::framework::LabeledArray mCutsBhadToJPsi{}; // selections for B->JPsi candidates (PtMinMu, DeltaMass, CPA, DecayLength) // PID recalibrations int mTpcPidCalibrationOption{0}; // Option for TPC PID calibration (0 -> AO2D, 1 -> postcalibrations, 2 -> alternative bethe bloch parametrisation) @@ -718,8 +762,8 @@ inline bool HfFilterHelper::isSelectedHighPt3Prong(const T& pt) /// \param trackPar is a track parameter /// \param dca is the 2d array with dcaXY and dcaZ of the track /// \return a flag that encodes the selection for soft pions BIT(kSoftPion), tracks for beauty BIT(kForBeauty), or soft pions for beauty BIT(kSoftPionForBeauty) -template -inline int8_t HfFilterHelper::isSelectedTrackForSoftPionOrBeauty(const T& track, const T1& trackPar, const T2& dca, const int& whichTrigger) +template +inline int8_t HfFilterHelper::isSelectedTrackForSoftPionOrBeauty(const T& track, const T1& trackPar, const T2& dca) { int8_t retValue{BIT(kSoftPion) | BIT(kForBeauty) | BIT(kSoftPionForBeauty) | BIT(kSoftPionForSigmaC)}; @@ -748,7 +792,7 @@ inline int8_t HfFilterHelper::isSelectedTrackForSoftPionOrBeauty(const T& track, return kRejected; } - if (whichTrigger == kSigmaCPPK || whichTrigger == kSigmaC0K0) { + if constexpr (whichTrigger == kSigmaCPPK || whichTrigger == kSigmaC0K0) { // SigmaC0,++ soft pion pt cut if (pT < mPtMinSoftPionForSigmaC || pT > mPtMaxSoftPionForSigmaC) { @@ -766,18 +810,29 @@ inline int8_t HfFilterHelper::isSelectedTrackForSoftPionOrBeauty(const T& track, } // below only regular beauty tracks, not required for soft pions - if (pT < mPtMinBeautyBachelor || pT > mPtMaxBeautyBachelor) { + float ptMin{-1.f}, ptMax{1000.f}; + if constexpr (whichTrigger == kBeauty3P || whichTrigger == kBeauty4P) { + ptMin = mPtMinBeautyBachelor; + ptMax = mPtMaxBeautyBachelor; + } else if constexpr (whichTrigger == kBtoJPsiKa || whichTrigger == kBtoJPsiPi || whichTrigger == kBtoJPsiKstar || whichTrigger == kBtoJPsiPhi || whichTrigger == kBtoJPsiPrKa) { + ptMin = mPtMinBeautyToJPsiBachelor; + ptMax = mPtMaxBeautyToJPsiBachelor; + } + + if (pT < ptMin || pT > ptMax) { CLRBIT(retValue, kForBeauty); } - float minDca = 1000.f; - float maxDca = 0.f; - if (whichTrigger == kBeauty3P) { + float minDca{1000.f}, maxDca{0.f}; + if constexpr (whichTrigger == kBeauty3P) { minDca = mCutsSingleTrackBeauty3Prong.get(pTBinTrack, 0u); maxDca = mCutsSingleTrackBeauty3Prong.get(pTBinTrack, 1u); - } else if (whichTrigger == kBeauty4P) { + } else if constexpr (whichTrigger == kBeauty4P) { minDca = mCutsSingleTrackBeauty4Prong.get(pTBinTrack, 0u); maxDca = mCutsSingleTrackBeauty4Prong.get(pTBinTrack, 1u); + } else if constexpr (whichTrigger == kBtoJPsiKa || whichTrigger == kBtoJPsiPi || whichTrigger == kBtoJPsiKstar || whichTrigger == kBtoJPsiPhi || whichTrigger == kBtoJPsiPrKa) { + minDca = mCutsSingleTrackBeautyToJPsi.get(pTBinTrack, 0u); + maxDca = mCutsSingleTrackBeautyToJPsi.get(pTBinTrack, 1u); } if (std::fabs(dca[0]) < minDca) { // minimum DCAxy @@ -876,7 +931,7 @@ inline bool HfFilterHelper::isSelectedTrack4Femto(const T1& track, const T2& tra if (trackSpecies == kDeuteronForFemto) { // Apply different PID strategy in different pt range if (pt <= ptThresholdPidStrategy) { - if (std::fabs(NSigmaTPC) > nSigmaCuts[0] && NSigmaITS > nSigmaCuts[3]) { // Use TPC and ITS below the threshold, NSigmaITS for deuteron with a lower limit + if (std::fabs(NSigmaTPC) > nSigmaCuts[0] || NSigmaITS < nSigmaCuts[3]) { // Use TPC and ITS below the threshold, NSigmaITS for deuteron with a lower limit return false; } } else { @@ -910,7 +965,7 @@ inline int8_t HfFilterHelper::isDplusPreselected(const T& trackOppositeCharge) int8_t retValue = 0; // check PID of opposite charge track - if (!isSelectedKaon4Charm3Prong(trackOppositeCharge)) { + if (!isSelectedKaon4Charm3ProngOrBeautyToJPsi(trackOppositeCharge)) { return retValue; } @@ -930,7 +985,7 @@ inline int8_t HfFilterHelper::isDsPreselected(const P& pTrackSameChargeFirst, co int8_t retValue = 0; // check PID of opposite charge track - if (!isSelectedKaon4Charm3Prong(trackOppositeCharge)) { + if (!isSelectedKaon4Charm3ProngOrBeautyToJPsi(trackOppositeCharge)) { return retValue; } @@ -958,13 +1013,13 @@ inline int8_t HfFilterHelper::isCharmBaryonPreselected(const T& trackSameChargeF { int8_t retValue = 0; // check PID of opposite charge track - if (!isSelectedKaon4Charm3Prong(trackOppositeCharge)) { + if (!isSelectedKaon4Charm3ProngOrBeautyToJPsi(trackOppositeCharge)) { return retValue; } - if (isSelectedProton4CharmBaryons(trackSameChargeFirst)) { + if (isSelectedProton4CharmOrBeautyBaryons(trackSameChargeFirst)) { retValue |= BIT(0); } - if (isSelectedProton4CharmBaryons(trackSameChargeSecond)) { + if (isSelectedProton4CharmOrBeautyBaryons(trackSameChargeSecond)) { retValue |= BIT(1); } @@ -1772,8 +1827,8 @@ inline void HfFilterHelper::setTpcRecalibMaps(o2::framework::Service -inline bool HfFilterHelper::isSelectedProton4CharmBaryons(const T& track) +template +inline bool HfFilterHelper::isSelectedProton4CharmOrBeautyBaryons(const T& track) { float NSigmaTPC = track.tpcNSigmaPr(); float NSigmaTOF = track.tofNSigmaPr(); @@ -1788,11 +1843,20 @@ inline bool HfFilterHelper::isSelectedProton4CharmBaryons(const T& track) } } - if (std::fabs(NSigmaTPC) > mNSigmaTpcPrCutForCharmBaryons) { - return false; - } - if (track.hasTOF() && std::fabs(NSigmaTOF) > mNSigmaTofPrCutForCharmBaryons) { - return false; + if constexpr (is4beauty) { + if (std::fabs(NSigmaTPC) > mNSigmaTpcPrKaCutForBeautyToJPsi) { + return false; + } + if (track.hasTOF() && std::fabs(NSigmaTOF) > mNSigmaTofPrKaCutForBeautyToJPsi) { + return false; + } + } else { + if (std::fabs(NSigmaTPC) > mNSigmaTpcPrCutForCharmBaryons) { + return false; + } + if (track.hasTOF() && std::fabs(NSigmaTOF) > mNSigmaTofPrCutForCharmBaryons) { + return false; + } } return true; @@ -1814,7 +1878,7 @@ inline bool HfFilterHelper::isSelectedKaonFromXicResoToSigmaC(const T& track) if constexpr (isKaonTrack) { /// if the kaon is a track, and not a K0s (V0), check the PID as well - return isSelectedKaon4Charm3Prong(track); + return isSelectedKaon4Charm3ProngOrBeautyToJPsi(track); } return true; @@ -1823,8 +1887,8 @@ inline bool HfFilterHelper::isSelectedKaonFromXicResoToSigmaC(const T& track) /// Basic selection of kaon candidates for charm candidates /// \param track is a track /// \return true if track passes all cuts -template -inline bool HfFilterHelper::isSelectedKaon4Charm3Prong(const T& track) +template +inline bool HfFilterHelper::isSelectedKaon4Charm3ProngOrBeautyToJPsi(const T& track) { float NSigmaTPC = track.tpcNSigmaKa(); float NSigmaTOF = track.tofNSigmaKa(); @@ -1839,11 +1903,20 @@ inline bool HfFilterHelper::isSelectedKaon4Charm3Prong(const T& track) } } - if (std::fabs(NSigmaTPC) > mNSigmaTpcKaCutFor3Prongs) { - return false; - } - if (track.hasTOF() && std::fabs(NSigmaTOF) > mNSigmaTofKaCutFor3Prongs) { - return false; + if constexpr (is4beauty) { + if (std::fabs(NSigmaTPC) > mNSigmaTpcPrKaCutForBeautyToJPsi) { + return false; + } + if (track.hasTOF() && std::fabs(NSigmaTOF) > mNSigmaTofPrKaCutForBeautyToJPsi) { + return false; + } + } else { + if (std::fabs(NSigmaTPC) > mNSigmaTpcKaCutFor3Prongs) { + return false; + } + if (track.hasTOF() && std::fabs(NSigmaTOF) > mNSigmaTofKaCutFor3Prongs) { + return false; + } } return true; @@ -1965,6 +2038,143 @@ inline bool HfFilterHelper::isSelectedBhadronInMassRange(T1 const& ptCand, T2 co return true; } +/// Method to perform selections for B -> JPsiX candidates after vertex reconstruction +/// \param pVecDauTracks is the array of momentum vectors of all daughter tracks +/// \param tracksDauNoMu is the array of tracks for the daughters that are no muons +/// \param primVtx is the primary vertex +/// \param secVtx is the secondary vertex +/// \param activateQA is the flag to enable the +/// \param hMassVsPt is the array of histograms for QA +/// \return true if the beauty candidate passes all cuts +template +inline int8_t HfFilterHelper::isSelectedBhadronToJPsi(std::array pVecDauTracks, std::array tracksDauNoMu, const T3& primVtx, const T4& secVtx, const int& activateQA, std::array& hMassVsPt) +{ + int8_t isSelected{0}; + + auto pVecJPsi = RecoDecay::pVec(pVecDauTracks[0], pVecDauTracks[1]); + const int offset = static_cast(kNBeautyParticles); + + if constexpr (Nprongs == 3) { + auto pVecBhad = RecoDecay::pVec(pVecDauTracks[0], pVecDauTracks[1], pVecDauTracks[2]); + auto ptBhad = RecoDecay::pt(pVecBhad); + auto binPtB = findBin(mPtBinsBeautyHadrons, ptBhad); + if (binPtB == -1) { + return isSelected; + } + auto ptMu1 = RecoDecay::pt(pVecDauTracks[0]); + auto ptMu2 = RecoDecay::pt(pVecDauTracks[1]); + if (ptMu1 < mCutsBhadToJPsi.get(binPtB, 0u) || ptMu2 < mCutsBhadToJPsi.get(binPtB, 0u)) { + return isSelected; + } + + if (RecoDecay::cpa(primVtx, secVtx, pVecBhad) < mCutsBhadToJPsi.get(binPtB, 2u)) { + return isSelected; + } + + if (RecoDecay::distance(primVtx, secVtx) < mCutsBhadToJPsi.get(binPtB, 3u)) { + return isSelected; + } + + if (isSelectedKaon4Charm3ProngOrBeautyToJPsi(tracksDauNoMu[0])) { + auto massJPsiKa = RecoDecay::m(std::array{pVecJPsi, pVecDauTracks[2]}, std::array{massJPsi, massKa}); + if (std::fabs(massJPsiKa - massBPlus) < mCutsBhadToJPsi.get(binPtB, 1u)) { + SETBIT(isSelected, kBplusToJPsi); + if (activateQA) { + hMassVsPt[offset + kBplusToJPsi]->Fill(ptBhad, massJPsiKa); + } + } + } + auto massJPsiPi = RecoDecay::m(std::array{pVecJPsi, pVecDauTracks[2]}, std::array{massJPsi, massPi}); + if (std::fabs(massJPsiPi - massBc) < mCutsBhadToJPsi.get(binPtB, 1u)) { + SETBIT(isSelected, kBcToJPsi); + if (activateQA) { + hMassVsPt[offset + kBcToJPsi]->Fill(ptBhad, massJPsiPi); + } + } + } else if constexpr (Nprongs == 4) { + auto pVecBhad = RecoDecay::pVec(pVecDauTracks[0], pVecDauTracks[1], pVecDauTracks[2], pVecDauTracks[3]); + auto ptBhad = RecoDecay::pt(pVecBhad); + auto binPtB = findBin(mPtBinsBeautyHadrons, ptBhad); + if (binPtB == -1) { + return isSelected; + } + auto ptMu1 = RecoDecay::pt(pVecDauTracks[0]); + auto ptMu2 = RecoDecay::pt(pVecDauTracks[1]); + if (ptMu1 < mCutsBhadToJPsi.get(binPtB, 0u) || ptMu2 < mCutsBhadToJPsi.get(binPtB, 0u)) { + return isSelected; + } + + if (RecoDecay::cpa(primVtx, secVtx, pVecBhad) < mCutsBhadToJPsi.get(binPtB, 2u)) { + return isSelected; + } + + if (RecoDecay::distance(primVtx, secVtx) < mCutsBhadToJPsi.get(binPtB, 3u)) { + return isSelected; + } + + bool isFirstKaon = isSelectedKaon4Charm3ProngOrBeautyToJPsi(tracksDauNoMu[0]); + bool isSeconKaon = isSelectedKaon4Charm3ProngOrBeautyToJPsi(tracksDauNoMu[1]); + bool isFirstProton = isSelectedProton4CharmOrBeautyBaryons(tracksDauNoMu[0]); + bool isSecondProton = isSelectedProton4CharmOrBeautyBaryons(tracksDauNoMu[1]); + auto massKaKa = RecoDecay::m(std::array{pVecDauTracks[2], pVecDauTracks[3]}, std::array{massKa, massKa}); + if (isFirstKaon && isSeconKaon) { + if (std::fabs(massKaKa - massPhi) < 0.02f) { + auto massJPsiKaKa = RecoDecay::m(std::array{pVecJPsi, pVecDauTracks[2], pVecDauTracks[3]}, std::array{massJPsi, massKa, massKa}); + if (std::fabs(massJPsiKaKa - massBs) < mCutsBhadToJPsi.get(binPtB, 1u)) { + SETBIT(isSelected, kBsToJPsi); + if (activateQA) { + hMassVsPt[offset + kBsToJPsi]->Fill(ptBhad, massJPsiKaKa); + } + } + } + } + if (isFirstKaon) { + auto massKaPi = RecoDecay::m(std::array{pVecDauTracks[2], pVecDauTracks[3]}, std::array{massKa, massPi}); + if (std::fabs(massKaPi - massPhi) < 0.1f) { + auto massJPsiKaPi = RecoDecay::m(std::array{pVecJPsi, pVecDauTracks[2], pVecDauTracks[3]}, std::array{massJPsi, massKa, massPi}); + if (std::fabs(massJPsiKaPi - massB0) < mCutsBhadToJPsi.get(binPtB, 1u)) { + SETBIT(isSelected, kB0ToJPsi); + if (activateQA) { + hMassVsPt[offset + kB0ToJPsi]->Fill(ptBhad, massJPsiKaPi); + } + } + } + } + if (isSeconKaon) { + auto massPiKa = RecoDecay::m(std::array{pVecDauTracks[2], pVecDauTracks[3]}, std::array{massPi, massKa}); + if (std::fabs(massPiKa - massPhi) < 0.1f) { + auto massJPsiPiKa = RecoDecay::m(std::array{pVecJPsi, pVecDauTracks[2], pVecDauTracks[3]}, std::array{massJPsi, massPi, massKa}); + if (std::fabs(massJPsiPiKa - massB0) < mCutsBhadToJPsi.get(binPtB, 1u)) { + SETBIT(isSelected, kB0ToJPsi); + if (activateQA) { + hMassVsPt[offset + kB0ToJPsi]->Fill(ptBhad, massJPsiPiKa); + } + } + } + } + if (isFirstProton && isSeconKaon) { + auto massLbToJPsiPrKa = RecoDecay::m(std::array{pVecDauTracks[0], pVecDauTracks[1], pVecDauTracks[2], pVecDauTracks[3]}, std::array{massMu, massMu, massProton, massKa}); + if (std::fabs(massLbToJPsiPrKa - massLb) < mCutsBhadToJPsi.get(binPtB, 1u)) { + SETBIT(isSelected, kLbToJPsi); + if (activateQA) { + hMassVsPt[offset + kLbToJPsi]->Fill(ptBhad, massLbToJPsiPrKa); + } + } + } + if (isFirstKaon && isSecondProton) { + auto massLbToJPsiKaPr = RecoDecay::m(std::array{pVecDauTracks[0], pVecDauTracks[1], pVecDauTracks[2], pVecDauTracks[3]}, std::array{massMu, massMu, massKa, massProton}); + if (std::fabs(massLbToJPsiKaPr - massLb) < mCutsBhadToJPsi.get(binPtB, 1u)) { + SETBIT(isSelected, kLbToJPsi); + if (activateQA) { + hMassVsPt[offset + kLbToJPsi]->Fill(ptBhad, massLbToJPsiKaPr); + } + } + } + } + + return isSelected; +} + /// Method to check if charm candidates has mass between sideband limits /// \param massHypo1 is the array for the candidate D daughter momentum after reconstruction of secondary vertex /// \param massHypo2 is the array for the candidate bachelor pion momentum after reconstruction of secondary vertex @@ -2035,6 +2245,7 @@ inline bool HfFilterHelper::isSelectedXiBach(T const& trackParCasc, T const& tra } const auto& vtx = dcaFitter.getPCACandidate(); + dcaFitter.propagateTracksToVertex(); const auto& trackCascProp = dcaFitter.getTrack(0); const auto& trackBachProp = dcaFitter.getTrack(1); std::array momCasc{}, momBach{}; @@ -2070,8 +2281,6 @@ inline bool HfFilterHelper::isSelectedXiBach(T const& trackParCasc, T const& tra template inline bool HfFilterHelper::isSelectedXiBachBach(T const& trackParCasc, std::array const& trackParBachelor, C const& collision, o2::vertexing::DCAFitterN& dcaFitter, const int& activateQA, H2 hMassVsPtXiPiPi) { - bool isSelected{false}; - // compute pT std::array pVecBachelorFirst{}, pVecBachelorSecond{}, pVecCascade{}; getPxPyPz(trackParBachelor[0], pVecBachelorFirst); @@ -2079,13 +2288,13 @@ inline bool HfFilterHelper::isSelectedXiBachBach(T const& trackParCasc, std::arr getPxPyPz(trackParCasc, pVecCascade); auto ptXiBachBach = RecoDecay::pt(RecoDecay::pVec(pVecCascade, pVecBachelorFirst, pVecBachelorSecond)); if (ptXiBachBach < mPtMinXiBach[2]) { - return isSelected; + return false; } // compute mass float massXiPiPi = RecoDecay::m(std::array{pVecCascade, pVecBachelorFirst, pVecBachelorSecond}, std::array{massXi, massPi, massPi}); if (massXiPiPi < mMassMinXiBach[2] || massXiPiPi > 3.f) { - return isSelected; + return false; } if (mCosPaMinXiBach[1] > -1.f) { // check topology if applicable @@ -2115,6 +2324,7 @@ inline bool HfFilterHelper::isSelectedXiBachBach(T const& trackParCasc, std::arr const auto& vtx = dcaFitter.getPCACandidate(); std::array momCasc{pVecCascade}, momBachFirst{}, momBachSecond{}; + dcaFitter.propagateTracksToVertex(); const auto& trackBachFirstProp = dcaFitter.getTrack(0); const auto& trackBachSecondProp = dcaFitter.getTrack(1); trackBachFirstProp.getPxPyPzGlo(momBachFirst); @@ -2130,15 +2340,15 @@ inline bool HfFilterHelper::isSelectedXiBachBach(T const& trackParCasc, std::arr return false; } - if (activateQA && isSelected) { + if (activateQA) { hMassVsPtXiPiPi->Fill(ptXiBachBach, massXiPiPi); } } - return isSelected; + return true; } -/// Update the TPC PID baesd on the spline of particles +/// Update the TPC PID based on the spline of particles /// \param track is a track parameter /// \param pidSpecies is the particle species to be considered /// \return updated nsigma value for TPC PID @@ -2339,6 +2549,7 @@ inline bool HfFilterHelper::buildV0(V const& v0Indices, T const& tracks, C const } // compute candidate momentum from tracks propagated to decay vertex + dcaFitter.propagateTracksToVertex(); auto& trackPosProp = dcaFitter.getTrack(0); auto& trackNegProp = dcaFitter.getTrack(1); std::array momPos{}, momNeg{}; @@ -2470,6 +2681,7 @@ inline bool HfFilterHelper::buildCascade(Casc const& cascIndices, V const& v0Ind } // compute candidate momentum from tracks propagated to decay vertex + dcaFitter.propagateTracksToVertex(); auto& trackV0Prop = dcaFitter.getTrack(0); auto& trackBachProp = dcaFitter.getTrack(1); std::array momV0{}, momBach{}; diff --git a/EventFiltering/filterTables.h b/EventFiltering/filterTables.h index 5d8c0303d79..2155e6528eb 100644 --- a/EventFiltering/filterTables.h +++ b/EventFiltering/filterTables.h @@ -83,7 +83,7 @@ DECLARE_SOA_COLUMN(HfDoubleCharmMix, hasHfDoubleCharmMix, bool); DECLARE_SOA_COLUMN(HfV0Charm2P, hasHfV0Charm2P, bool); //! V0 with 2-prong charm hadron DECLARE_SOA_COLUMN(HfV0Charm3P, hasHfV0Charm3P, bool); //! V0 with 3-prong charm hadron DECLARE_SOA_COLUMN(HfCharmBarToXiBach, hasHfCharmBarToXiBach, bool); //! Charm baryon to Xi + bachelor -DECLARE_SOA_COLUMN(HfCharmBarToXiBachBach, hasHfCharmBarToXiBachBach, bool); //! Charm baryon to Xi + 2 bachelors +DECLARE_SOA_COLUMN(HfCharmBarToXi2Bach, hasHfCharmBarToXi2Bach, bool); //! Charm baryon to Xi + 2 bachelors DECLARE_SOA_COLUMN(HfSigmaCPPK, hasHfSigmaCPPK, bool); //! SigmaC(2455)++K- and SigmaC(2520)++K- + c.c. DECLARE_SOA_COLUMN(HfSigmaC0K0, hasHfSigmaC0K0, bool); //! SigmaC(2455)0KS0 and SigmaC(2520)0KS0 DECLARE_SOA_COLUMN(HfPhotonCharm2P, hasHfPhotonCharm2P, bool); //! photon with 2-prong charm hadron @@ -92,6 +92,11 @@ DECLARE_SOA_COLUMN(HfSingleCharm2P, hasHfSingleCharm2P, bool); DECLARE_SOA_COLUMN(HfSingleCharm3P, hasHfSingleCharm3P, bool); //! 3-prong charm hadron (for efficiency studies) DECLARE_SOA_COLUMN(HfSingleNonPromptCharm2P, hasHfSingleNonPromptCharm2P, bool); //! 2-prong charm hadron (for efficiency studies) DECLARE_SOA_COLUMN(HfSingleNonPromptCharm3P, hasHfSingleNonPromptCharm3P, bool); //! 3-prong charm hadron (for efficiency studies) +DECLARE_SOA_COLUMN(HfBtoJPsiKa, hasHfBtoJPsiKa, bool); //! B+ -> JPsi(->mumu)K+ +DECLARE_SOA_COLUMN(HfBtoJPsiKstar, hasHfBtoJPsiKstar, bool); //! B0 -> JPsi(->mumu)K*+(->Kpi) +DECLARE_SOA_COLUMN(HfBtoJPsiPhi, hasHfBtoJPsiPhi, bool); //! B0s -> JPsi(->mumu)phi(->KK) +DECLARE_SOA_COLUMN(HfBtoJPsiPrKa, hasHfBtoJPsiPrKa, bool); //! Lb -> JPsi(->mumu)pK+ +DECLARE_SOA_COLUMN(HfBtoJPsiPi, hasHfBtoJPsiPi, bool); //! Bc -> JPsi(->mumu)pi+ // CF two body triggers DECLARE_SOA_COLUMN(PD, hasPD, bool); //! has d-p pair @@ -235,7 +240,12 @@ DECLARE_SOA_TABLE(HfFilters, "AOD", "HfFilters", //! filtering::HfSingleCharm3P, filtering::HfSingleNonPromptCharm2P, filtering::HfSingleNonPromptCharm3P, - filtering::HfCharmBarToXiBachBach); + filtering::HfCharmBarToXi2Bach, + filtering::HfBtoJPsiKa, + filtering::HfBtoJPsiKstar, + filtering::HfBtoJPsiPhi, + filtering::HfBtoJPsiPrKa, + filtering::HfBtoJPsiPi); using HfFilter = HfFilters::iterator; From bee1433abb5ca79ca952225f1783dea6a8acad09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Mon, 17 Feb 2025 20:02:41 +0100 Subject: [PATCH 0272/1650] [Common] Update QA histograms of FT0 (#10005) --- Common/TableProducer/ft0CorrectedTable.cxx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Common/TableProducer/ft0CorrectedTable.cxx b/Common/TableProducer/ft0CorrectedTable.cxx index bf99be86c45..a8a2787aa5a 100644 --- a/Common/TableProducer/ft0CorrectedTable.cxx +++ b/Common/TableProducer/ft0CorrectedTable.cxx @@ -73,7 +73,8 @@ struct ft0CorrectedTable { histos.add("t0A", "t0A", kTH1D, {{1000, -1, 1, "t0A (ns)"}}); histos.add("t0C", "t0C", kTH1D, {{1000, -1, 1, "t0C (ns)"}}); histos.add("t0AC", "t0AC", kTH1D, {{1000, -1000, 1000, "t0AC (ns)"}}); - histos.add("deltat0AC", "deltat0AC", kTH1D, {{1000, -10, 10, "#Deltat0AC (ns)"}}); + histos.add("deltat0AC", "deltat0AC", kTH1D, {{1000, -1, 1, "#Deltat0AC (ns)"}}); + histos.add("deltat0ACps", "deltat0ACps", kTH1D, {{1000, -1000, 1000, "#Deltat0AC (ps)"}}); if (doprocessWithBypassFT0timeInMC) { histos.add("MC/deltat0A", "t0A", kTH1D, {{1000, -50, 50, "t0A (ps)"}}); histos.add("MC/deltat0C", "t0C", kTH1D, {{1000, -50, 50, "t0C (ps)"}}); @@ -88,7 +89,7 @@ struct ft0CorrectedTable { table.reserve(collisions.size()); float t0A = 1e10f; float t0C = 1e10f; - for (auto& collision : collisions) { + for (const auto& collision : collisions) { t0A = 1e10f; t0C = 1e10f; const float vertexPV = collision.posZ(); @@ -112,8 +113,11 @@ struct ft0CorrectedTable { if (addHistograms) { histos.fill(HIST("t0A"), t0A); histos.fill(HIST("t0C"), t0C); - histos.fill(HIST("t0AC"), (t0A + t0C) * 0.5f); - histos.fill(HIST("deltat0AC"), t0A - t0C); + if (t0A < 1e10f && t0C < 1e10f) { + histos.fill(HIST("t0AC"), (t0A + t0C) * 0.5f); + histos.fill(HIST("deltat0AC"), (t0A - t0C) * 0.5f); + histos.fill(HIST("deltat0ACps"), (t0A - t0C) * 500.f); + } } table(t0A, t0C); } @@ -152,7 +156,7 @@ struct ft0CorrectedTable { float posZMC = 0; bool hasMCcoll = false; - for (auto& collision : collisions) { + for (const auto& collision : collisions) { hasMCcoll = false; eventtimeMC = 1e10f; t0A = 1e10f; From 6bb594c9e9bd251b63ede861a1633285fff8fbff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Mon, 17 Feb 2025 20:51:56 +0100 Subject: [PATCH 0273/1650] [Common] Merge beta and Nsigma tasks for TOF (#10008) --- Common/TableProducer/PID/pidTOFMerge.cxx | 294 +++++++++++------------ 1 file changed, 144 insertions(+), 150 deletions(-) diff --git a/Common/TableProducer/PID/pidTOFMerge.cxx b/Common/TableProducer/PID/pidTOFMerge.cxx index 845edc2c6e6..83b4546e81f 100644 --- a/Common/TableProducer/PID/pidTOFMerge.cxx +++ b/Common/TableProducer/PID/pidTOFMerge.cxx @@ -8,12 +8,11 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. - /// -/// \file tofPidMerge.cxx -/// \author Nicolò Jacazio nicolo.jacazio@cern.ch +/// \file pidTOFMerge.cxx /// \brief Task to produce PID tables for TOF split for each particle. /// Only the tables for the mass hypotheses requested are filled, the others are sent empty. +/// \author Nicolò Jacazio nicolo.jacazio@cern.ch /// #include @@ -515,10 +514,10 @@ struct tofEventTime { Produces tableEvTime; Produces tableEvTimeTOFOnly; Produces tableFlags; - static constexpr bool removeTOFEvTimeBias = true; // Flag to subtract the Ev. Time bias for low multiplicity events with TOF - static constexpr float diamond = 6.0; // Collision diamond used in the estimation of the TOF event time - static constexpr float errDiamond = diamond * 33.356409f; - static constexpr float weightDiamond = 1.f / (errDiamond * errDiamond); + static constexpr bool kRemoveTOFEvTimeBias = true; // Flag to subtract the Ev. Time bias for low multiplicity events with TOF + static constexpr float kDiamond = 6.0; // Collision diamond used in the estimation of the TOF event time + static constexpr float kErrDiamond = kDiamond * 33.356409f; + static constexpr float kWeightDiamond = 1.f / (kErrDiamond * kErrDiamond); bool enableTableTOFEvTime = false; bool enableTableEvTimeTOFOnly = false; @@ -692,7 +691,7 @@ struct tofEventTime { const auto& collision = t.collision_as(); // Compute the TOF event time - const auto evTimeMakerTOF = evTimeMakerForTracks(tracksInCollision, mRespParamsV3, diamond); + const auto evTimeMakerTOF = evTimeMakerForTracks(tracksInCollision, mRespParamsV3, kDiamond); float t0AC[2] = {.0f, 999.f}; // Value and error of T0A or T0C or T0AC float t0TOF[2] = {static_cast(evTimeMakerTOF.mEventTime), static_cast(evTimeMakerTOF.mEventTimeError)}; // Value and error of TOF @@ -711,10 +710,10 @@ struct tofEventTime { sumOfWeights = 0.f; weight = 0.f; // Remove the bias on TOF ev. time - if constexpr (removeTOFEvTimeBias) { + if constexpr (kRemoveTOFEvTimeBias) { evTimeMakerTOF.removeBias(trk, nGoodTracksForTOF, t0TOF[0], t0TOF[1], 2); } - if (t0TOF[1] < errDiamond && (maxEvTimeTOF <= 0 || std::abs(t0TOF[0]) < maxEvTimeTOF)) { + if (t0TOF[1] < kErrDiamond && (maxEvTimeTOF <= 0 || std::abs(t0TOF[0]) < maxEvTimeTOF)) { flags |= o2::aod::pidflags::enums::PIDFlags::EvTimeTOF; weight = 1.f / (t0TOF[1] * t0TOF[1]); @@ -735,9 +734,9 @@ struct tofEventTime { sumOfWeights += weight; } - if (sumOfWeights < weightDiamond) { // avoiding sumOfWeights = 0 or worse that diamond + if (sumOfWeights < kWeightDiamond) { // avoiding sumOfWeights = 0 or worse that kDiamond eventTime = 0; - sumOfWeights = weightDiamond; + sumOfWeights = kWeightDiamond; tableFlags(0); } else { tableFlags(flags); @@ -768,21 +767,21 @@ struct tofEventTime { const auto& tracksInCollision = tracks.sliceBy(perCollision, lastCollisionId); // First make table for event time - const auto evTimeMakerTOF = evTimeMakerForTracks(tracksInCollision, mRespParamsV3, diamond); + const auto evTimeMakerTOF = evTimeMakerForTracks(tracksInCollision, mRespParamsV3, kDiamond); int nGoodTracksForTOF = 0; float et = evTimeMakerTOF.mEventTime; float erret = evTimeMakerTOF.mEventTimeError; for (auto const& trk : tracksInCollision) { // Loop on Tracks - if constexpr (removeTOFEvTimeBias) { + if constexpr (kRemoveTOFEvTimeBias) { evTimeMakerTOF.removeBias(trk, nGoodTracksForTOF, et, erret, 2); } uint8_t flags = 0; - if (erret < errDiamond && (maxEvTimeTOF <= 0.f || std::abs(et) < maxEvTimeTOF)) { + if (erret < kErrDiamond && (maxEvTimeTOF <= 0.f || std::abs(et) < maxEvTimeTOF)) { flags |= o2::aod::pidflags::enums::PIDFlags::EvTimeTOF; } else { et = 0.f; - erret = errDiamond; + erret = kErrDiamond; } tableFlags(flags); tableEvTime(et, erret); @@ -823,19 +822,19 @@ struct tofEventTime { // Part 3 Nsigma computation -static constexpr int nParameters2 = 2; -static const std::vector parameterNames2{"Enable", "EnableFull"}; -static constexpr int idxEl = 0; -static constexpr int idxMu = 1; -static constexpr int idxPi = 2; -static constexpr int idxKa = 3; -static constexpr int idxPr = 4; -static constexpr int idxDe = 5; -static constexpr int idxTr = 6; -static constexpr int idxHe = 7; -static constexpr int idxAl = 8; - -static constexpr int defaultParameters2[nSpecies][nParameters2]{{-1, -1}, +static constexpr int kParEnabledN = 2; +static constexpr int kIdxEl = 0; +static constexpr int kIdxMu = 1; +static constexpr int kIdxPi = 2; +static constexpr int kIdxKa = 3; +static constexpr int kIdxPr = 4; +static constexpr int kIdxDe = 5; +static constexpr int kIdxTr = 6; +static constexpr int kIdxHe = 7; +static constexpr int kIdxAl = 8; + +static const std::vector kParEnabledNames{"Enable", "EnableFull"}; +static constexpr int kDefaultParEnabled[nSpecies][kParEnabledN]{{-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, @@ -869,15 +868,22 @@ struct tofPidMerge { Produces tablePIDFullHe; Produces tablePIDFullAl; + // Beta tables + Produces tablePIDBeta; + Produces tablePIDTOFMass; + bool enableTableBeta = false; + bool enableTableMass = false; + // Detector response parameters o2::pid::tof::TOFResoParamsV3 mRespParamsV3; Service ccdb; TOFCalibConfig mTOFCalibConfig; // TOF Calib configuration Configurable enableQaHistograms{"enableQaHistograms", false, "Flag to enable the QA histograms"}; + Configurable enableTOFParamsForBetaMass{"enableTOFParamsForBetaMass", false, "Flag to use TOF parameters for TOF Beta and Mass"}; // Configuration flags to include and exclude particle hypotheses Configurable> enableParticle{"enableParticle", - {defaultParameters2[0], nSpecies, nParameters2, particleNames, parameterNames2}, + {kDefaultParEnabled[0], nSpecies, kParEnabledN, particleNames, kParEnabledNames}, "Produce PID information for the various mass hypotheses. Values different than -1 override the automatic setup: the corresponding table can be set off (0) or on (1)"}; // Histograms for QA @@ -912,19 +918,24 @@ struct tofPidMerge { LOG(info) << "No PID tables are required, disabling the task"; doprocessRun3.value = false; doprocessRun2.value = false; - return; - } else if (doprocessRun3.value == false && doprocessRun2.value == false) { - LOG(fatal) << "PID tables are required but process data is disabled. Please enable it"; - } - if (doprocessRun3.value == true && doprocessRun2.value == true) { - LOG(fatal) << "Both processRun2 and processRun3 are enabled. Pick one of the two"; - } - if (metadataInfo.isFullyDefined()) { - if (metadataInfo.isRun3() && doprocessRun2) { - LOG(fatal) << "Run2 process function is enabled but the metadata says it is Run3"; + } else { + if (mTOFCalibConfig.autoSetProcessFunctions()) { + LOG(info) << "Autodetecting process functions for mass and beta"; + if (metadataInfo.isFullyDefined()) { + if (metadataInfo.isRun3()) { + doprocessRun3.value = true; + doprocessRun2.value = false; + } else { + doprocessRun2.value = true; + doprocessRun3.value = false; + } + } } - if (!metadataInfo.isRun3() && doprocessRun3) { - LOG(fatal) << "Run3 process function is enabled but the metadata says it is Run2"; + if (doprocessRun2 && doprocessRun3) { + LOG(fatal) << "Both processRun2 and processRun3 are enabled. Pick one of the two"; + } + if (!doprocessRun2 && !doprocessRun3) { + LOG(fatal) << "Neither processRun2 nor processRun3 are enabled. Pick one of the two"; } } mTOFCalibConfig.initSetup(mRespParamsV3, ccdb); // Getting the parametrization parameters @@ -947,13 +958,42 @@ struct tofPidMerge { } hnsigmaFull[i] = histos.add(Form("nsigmaFull/%s", particleNames[i].c_str()), Form("N_{#sigma}^{TOF}(%s)", particleNames[i].c_str()), kTH2F, {pAxis, nSigmaAxis}); } + + // Checking the TOF mass and TOF beta tables + enableTableBeta = isTableRequiredInWorkflow(initContext, "pidTOFbeta"); + enableTableMass = isTableRequiredInWorkflow(initContext, "pidTOFmass"); + + if (!enableTableBeta && !enableTableMass) { + LOG(info) << "No table for TOF mass and beta is required. Disabling beta and mass tables"; + doprocessRun2BetaM.value = false; + doprocessRun3BetaM.value = false; + } else { + if (mTOFCalibConfig.autoSetProcessFunctions()) { + LOG(info) << "Autodetecting process functions for mass and beta"; + if (metadataInfo.isFullyDefined()) { + if (metadataInfo.isRun3()) { + doprocessRun3BetaM.value = true; + doprocessRun2BetaM.value = false; + } else { + doprocessRun2BetaM.value = true; + doprocessRun3BetaM.value = false; + } + } + } + if (doprocessRun2BetaM && doprocessRun3BetaM) { + LOG(fatal) << "Both processRun2BetaM and processRun3BetaM are enabled. Pick one of the two"; + } + if (!doprocessRun2BetaM && !doprocessRun3BetaM) { + LOG(fatal) << "Neither processRun2BetaM nor processRun3BetaM are enabled. Pick one of the two"; + } + } } // Reserves an empty table for the given particle ID with size of the given track table void reserveTable(const int id, const int64_t& size, const bool fullTable = false) { switch (id) { - case idxEl: { + case kIdxEl: { if (fullTable) { tablePIDFullEl.reserve(size); } else { @@ -961,7 +1001,7 @@ struct tofPidMerge { } break; } - case idxMu: { + case kIdxMu: { if (fullTable) { tablePIDFullMu.reserve(size); } else { @@ -969,7 +1009,7 @@ struct tofPidMerge { } break; } - case idxPi: { + case kIdxPi: { if (fullTable) { tablePIDFullPi.reserve(size); } else { @@ -977,7 +1017,7 @@ struct tofPidMerge { } break; } - case idxKa: { + case kIdxKa: { if (fullTable) { tablePIDFullKa.reserve(size); } else { @@ -985,7 +1025,7 @@ struct tofPidMerge { } break; } - case idxPr: { + case kIdxPr: { if (fullTable) { tablePIDFullPr.reserve(size); } else { @@ -993,7 +1033,7 @@ struct tofPidMerge { } break; } - case idxDe: { + case kIdxDe: { if (fullTable) { tablePIDFullDe.reserve(size); } else { @@ -1001,7 +1041,7 @@ struct tofPidMerge { } break; } - case idxTr: { + case kIdxTr: { if (fullTable) { tablePIDFullTr.reserve(size); } else { @@ -1009,7 +1049,7 @@ struct tofPidMerge { } break; } - case idxHe: { + case kIdxHe: { if (fullTable) { tablePIDFullHe.reserve(size); } else { @@ -1017,7 +1057,7 @@ struct tofPidMerge { } break; } - case idxAl: { + case kIdxAl: { if (fullTable) { tablePIDFullAl.reserve(size); } else { @@ -1035,7 +1075,7 @@ struct tofPidMerge { void makeTableEmpty(const int id, bool fullTable = false) { switch (id) { - case idxEl: + case kIdxEl: if (fullTable) { tablePIDFullEl(-999.f, -999.f); } else { @@ -1043,7 +1083,7 @@ struct tofPidMerge { tablePIDEl); } break; - case idxMu: + case kIdxMu: if (fullTable) { tablePIDFullMu(-999.f, -999.f); } else { @@ -1051,7 +1091,7 @@ struct tofPidMerge { tablePIDMu); } break; - case idxPi: + case kIdxPi: if (fullTable) { tablePIDFullPi(-999.f, -999.f); } else { @@ -1059,7 +1099,7 @@ struct tofPidMerge { tablePIDPi); } break; - case idxKa: + case kIdxKa: if (fullTable) { tablePIDFullKa(-999.f, -999.f); } else { @@ -1067,7 +1107,7 @@ struct tofPidMerge { tablePIDKa); } break; - case idxPr: + case kIdxPr: if (fullTable) { tablePIDFullPr(-999.f, -999.f); } else { @@ -1075,7 +1115,7 @@ struct tofPidMerge { tablePIDPr); } break; - case idxDe: + case kIdxDe: if (fullTable) { tablePIDFullDe(-999.f, -999.f); } else { @@ -1083,7 +1123,7 @@ struct tofPidMerge { tablePIDDe); } break; - case idxTr: + case kIdxTr: if (fullTable) { tablePIDFullTr(-999.f, -999.f); } else { @@ -1091,7 +1131,7 @@ struct tofPidMerge { tablePIDTr); } break; - case idxHe: + case kIdxHe: if (fullTable) { tablePIDFullHe(-999.f, -999.f); } else { @@ -1099,7 +1139,7 @@ struct tofPidMerge { tablePIDHe); } break; - case idxAl: + case kIdxAl: if (fullTable) { tablePIDFullAl(-999.f, -999.f); } else { @@ -1156,47 +1196,47 @@ struct tofPidMerge { for (auto const& pidId : mEnabledParticles) { // Loop on enabled particle hypotheses switch (pidId) { - case idxEl: { + case kIdxEl: { nsigma = responseEl.GetSeparation(mRespParamsV3, trk); aod::pidutils::packInTable(nsigma, tablePIDEl); break; } - case idxMu: { + case kIdxMu: { nsigma = responseMu.GetSeparation(mRespParamsV3, trk); aod::pidutils::packInTable(nsigma, tablePIDMu); break; } - case idxPi: { + case kIdxPi: { nsigma = responsePi.GetSeparation(mRespParamsV3, trk); aod::pidutils::packInTable(nsigma, tablePIDPi); break; } - case idxKa: { + case kIdxKa: { nsigma = responseKa.GetSeparation(mRespParamsV3, trk); aod::pidutils::packInTable(nsigma, tablePIDKa); break; } - case idxPr: { + case kIdxPr: { nsigma = responsePr.GetSeparation(mRespParamsV3, trk); aod::pidutils::packInTable(nsigma, tablePIDPr); break; } - case idxDe: { + case kIdxDe: { nsigma = responseDe.GetSeparation(mRespParamsV3, trk); aod::pidutils::packInTable(nsigma, tablePIDDe); break; } - case idxTr: { + case kIdxTr: { nsigma = responseTr.GetSeparation(mRespParamsV3, trk); aod::pidutils::packInTable(nsigma, tablePIDTr); break; } - case idxHe: { + case kIdxHe: { nsigma = responseHe.GetSeparation(mRespParamsV3, trk); aod::pidutils::packInTable(nsigma, tablePIDHe); break; } - case idxAl: { + case kIdxAl: { nsigma = responseAl.GetSeparation(mRespParamsV3, trk); aod::pidutils::packInTable(nsigma, tablePIDAl); break; @@ -1211,55 +1251,55 @@ struct tofPidMerge { } for (auto const& pidId : mEnabledParticlesFull) { // Loop on enabled particle hypotheses with full tables switch (pidId) { - case idxEl: { + case kIdxEl: { resolution = responseEl.GetExpectedSigma(mRespParamsV3, trk); nsigma = responseEl.GetSeparation(mRespParamsV3, trk, resolution); tablePIDFullEl(resolution, nsigma); break; } - case idxMu: { + case kIdxMu: { resolution = responseMu.GetExpectedSigma(mRespParamsV3, trk); nsigma = responseMu.GetSeparation(mRespParamsV3, trk, resolution); tablePIDFullMu(resolution, nsigma); break; } - case idxPi: { + case kIdxPi: { resolution = responsePi.GetExpectedSigma(mRespParamsV3, trk); nsigma = responsePi.GetSeparation(mRespParamsV3, trk); tablePIDFullPi(resolution, nsigma); break; } - case idxKa: { + case kIdxKa: { resolution = responseKa.GetExpectedSigma(mRespParamsV3, trk); nsigma = responseKa.GetSeparation(mRespParamsV3, trk, resolution); tablePIDFullKa(resolution, nsigma); break; } - case idxPr: { + case kIdxPr: { resolution = responsePr.GetExpectedSigma(mRespParamsV3, trk); nsigma = responsePr.GetSeparation(mRespParamsV3, trk, resolution); tablePIDFullPr(resolution, nsigma); break; } - case idxDe: { + case kIdxDe: { resolution = responseDe.GetExpectedSigma(mRespParamsV3, trk); nsigma = responseDe.GetSeparation(mRespParamsV3, trk, resolution); tablePIDFullDe(resolution, nsigma); break; } - case idxTr: { + case kIdxTr: { resolution = responseTr.GetExpectedSigma(mRespParamsV3, trk); nsigma = responseTr.GetSeparation(mRespParamsV3, trk, resolution); tablePIDFullTr(resolution, nsigma); break; } - case idxHe: { + case kIdxHe: { resolution = responseHe.GetExpectedSigma(mRespParamsV3, trk); nsigma = responseHe.GetSeparation(mRespParamsV3, trk, resolution); tablePIDFullHe(resolution, nsigma); break; } - case idxAl: { + case kIdxAl: { resolution = responseAl.GetExpectedSigma(mRespParamsV3, trk); nsigma = responseAl.GetSeparation(mRespParamsV3, trk, resolution); tablePIDFullAl(resolution, nsigma); @@ -1275,7 +1315,7 @@ struct tofPidMerge { } } } - PROCESS_SWITCH(tofPidMerge, processRun3, "Produce tables. Set to off if the tables are not required", true); + PROCESS_SWITCH(tofPidMerge, processRun3, "Produce Run 3 Nsigma table. Set to off if the tables are not required, or autoset is on", false); template using ResponseImplementationRun2 = o2::pid::tof::ExpTimes; @@ -1318,47 +1358,47 @@ struct tofPidMerge { for (auto const& pidId : mEnabledParticles) { // Loop on enabled particle hypotheses switch (pidId) { - case idxEl: { + case kIdxEl: { nsigma = responseEl.GetSeparation(mRespParamsV3, trk); aod::pidutils::packInTable(nsigma, tablePIDEl); break; } - case idxMu: { + case kIdxMu: { nsigma = responseMu.GetSeparation(mRespParamsV3, trk); aod::pidutils::packInTable(nsigma, tablePIDMu); break; } - case idxPi: { + case kIdxPi: { nsigma = responsePi.GetSeparation(mRespParamsV3, trk); aod::pidutils::packInTable(nsigma, tablePIDPi); break; } - case idxKa: { + case kIdxKa: { nsigma = responseKa.GetSeparation(mRespParamsV3, trk); aod::pidutils::packInTable(nsigma, tablePIDKa); break; } - case idxPr: { + case kIdxPr: { nsigma = responsePr.GetSeparation(mRespParamsV3, trk); aod::pidutils::packInTable(nsigma, tablePIDPr); break; } - case idxDe: { + case kIdxDe: { nsigma = responseDe.GetSeparation(mRespParamsV3, trk); aod::pidutils::packInTable(nsigma, tablePIDDe); break; } - case idxTr: { + case kIdxTr: { nsigma = responseTr.GetSeparation(mRespParamsV3, trk); aod::pidutils::packInTable(nsigma, tablePIDTr); break; } - case idxHe: { + case kIdxHe: { nsigma = responseHe.GetSeparation(mRespParamsV3, trk); aod::pidutils::packInTable(nsigma, tablePIDHe); break; } - case idxAl: { + case kIdxAl: { nsigma = responseAl.GetSeparation(mRespParamsV3, trk); aod::pidutils::packInTable(nsigma, tablePIDAl); break; @@ -1373,55 +1413,55 @@ struct tofPidMerge { } for (auto const& pidId : mEnabledParticlesFull) { // Loop on enabled particle hypotheses with full tables switch (pidId) { - case idxEl: { + case kIdxEl: { resolution = responseEl.GetExpectedSigma(mRespParamsV3, trk); nsigma = responseEl.GetSeparation(mRespParamsV3, trk, resolution); tablePIDFullEl(resolution, nsigma); break; } - case idxMu: { + case kIdxMu: { resolution = responseMu.GetExpectedSigma(mRespParamsV3, trk); nsigma = responseMu.GetSeparation(mRespParamsV3, trk, resolution); tablePIDFullMu(resolution, nsigma); break; } - case idxPi: { + case kIdxPi: { resolution = responsePi.GetExpectedSigma(mRespParamsV3, trk); nsigma = responsePi.GetSeparation(mRespParamsV3, trk); tablePIDFullPi(resolution, nsigma); break; } - case idxKa: { + case kIdxKa: { resolution = responseKa.GetExpectedSigma(mRespParamsV3, trk); nsigma = responseKa.GetSeparation(mRespParamsV3, trk, resolution); tablePIDFullKa(resolution, nsigma); break; } - case idxPr: { + case kIdxPr: { resolution = responsePr.GetExpectedSigma(mRespParamsV3, trk); nsigma = responsePr.GetSeparation(mRespParamsV3, trk, resolution); tablePIDFullPr(resolution, nsigma); break; } - case idxDe: { + case kIdxDe: { resolution = responseDe.GetExpectedSigma(mRespParamsV3, trk); nsigma = responseDe.GetSeparation(mRespParamsV3, trk, resolution); tablePIDFullDe(resolution, nsigma); break; } - case idxTr: { + case kIdxTr: { resolution = responseTr.GetExpectedSigma(mRespParamsV3, trk); nsigma = responseTr.GetSeparation(mRespParamsV3, trk, resolution); tablePIDFullTr(resolution, nsigma); break; } - case idxHe: { + case kIdxHe: { resolution = responseHe.GetExpectedSigma(mRespParamsV3, trk); nsigma = responseHe.GetSeparation(mRespParamsV3, trk, resolution); tablePIDFullHe(resolution, nsigma); break; } - case idxAl: { + case kIdxAl: { resolution = responseAl.GetExpectedSigma(mRespParamsV3, trk); nsigma = responseAl.GetSeparation(mRespParamsV3, trk, resolution); tablePIDFullAl(resolution, nsigma); @@ -1437,55 +1477,10 @@ struct tofPidMerge { } } } - PROCESS_SWITCH(tofPidMerge, processRun2, "Produce tables. Set to off if the tables are not required", false); -}; - -// Part 4 Beta and TOF mass computation - -struct tofPidBeta { - Produces tablePIDBeta; - Produces tablePIDTOFMass; - Configurable expreso{"tof-expreso", 80, "Expected resolution for the computation of the expected beta"}; - // Detector response and input parameters - o2::pid::tof::TOFResoParamsV3 mRespParamsV3; - TOFCalibConfig mTOFCalibConfig; // TOF Calib configuration - Service ccdb; - Configurable enableTOFParams{"enableTOFParams", false, "Flag to use TOF parameters"}; - - bool enableTableBeta = false; - bool enableTableMass = false; - void init(o2::framework::InitContext& initContext) - { - mTOFCalibConfig.inheritFromBaseTask(initContext); - enableTableBeta = isTableRequiredInWorkflow(initContext, "pidTOFbeta"); - enableTableMass = isTableRequiredInWorkflow(initContext, "pidTOFmass"); - if (!enableTableBeta && !enableTableMass && !doprocessRun2 && !doprocessRun3) { - LOG(info) << "No table or process is enabled. Disabling task"; - return; - } - - if (mTOFCalibConfig.autoSetProcessFunctions()) { - LOG(info) << "Autodetecting process functions"; - if (metadataInfo.isFullyDefined()) { - if (metadataInfo.isRun3()) { - doprocessRun3.value = true; - } else { - doprocessRun2.value = true; - } - } - } - - responseBeta.mExpectedResolution = expreso.value; - if (!enableTOFParams) { - return; - } - mTOFCalibConfig.initSetup(mRespParamsV3, ccdb); // Getting the parametrization parameters - } - - void process(aod::BCs const&) {} + PROCESS_SWITCH(tofPidMerge, processRun2, "Produce Run 2 Nsigma table. Set to off if the tables are not required, or autoset is on", false); o2::pid::tof::Beta responseBetaRun2; - void processRun2(Run2TrksWtofWevTime const& tracks) + void processRun2BetaM(Run2TrksWtofWevTime const& tracks) { if (!enableTableBeta && !enableTableMass) { return; @@ -1498,7 +1493,7 @@ struct tofPidBeta { tablePIDBeta(beta, responseBetaRun2.GetExpectedSigma(trk)); } if (enableTableMass) { - if (enableTOFParams) { + if (enableTOFParamsForBetaMass) { tablePIDTOFMass(o2::pid::tof::TOFMass::GetTOFMass(trk.tofExpMom() / (1.f + trk.sign() * mRespParamsV3.getMomentumChargeShift(trk.eta())), beta)); } else { tablePIDTOFMass(o2::pid::tof::TOFMass::GetTOFMass(trk, beta)); @@ -1506,10 +1501,10 @@ struct tofPidBeta { } } } - PROCESS_SWITCH(tofPidBeta, processRun2, "Process Run3 data i.e. input is TrackIU. If false, taken from metadata automatically", true); + PROCESS_SWITCH(tofPidMerge, processRun2BetaM, "Produce Run 2 Beta and Mass table. Set to off if the tables are not required, or autoset is on", false); o2::pid::tof::Beta responseBeta; - void processRun3(Run3TrksWtofWevTime const& tracks) + void processRun3BetaM(Run3TrksWtofWevTime const& tracks) { if (!enableTableBeta && !enableTableMass) { return; @@ -1523,7 +1518,7 @@ struct tofPidBeta { responseBeta.GetExpectedSigma(trk)); } if (enableTableMass) { - if (enableTOFParams) { + if (enableTOFParamsForBetaMass) { tablePIDTOFMass(o2::pid::tof::TOFMass::GetTOFMass(trk.tofExpMom() / (1.f + trk.sign() * mRespParamsV3.getMomentumChargeShift(trk.eta())), beta)); } else { tablePIDTOFMass(o2::pid::tof::TOFMass::GetTOFMass(trk, beta)); @@ -1531,7 +1526,7 @@ struct tofPidBeta { } } } - PROCESS_SWITCH(tofPidBeta, processRun3, "Process Run3 data i.e. input is TrackIU. If false, taken from metadata automatically", true); + PROCESS_SWITCH(tofPidMerge, processRun3BetaM, "Produce Run 3 Beta and Mass table. Set to off if the tables are not required, or autoset is on", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) @@ -1541,6 +1536,5 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) auto workflow = WorkflowSpec{adaptAnalysisTask(cfgc)}; workflow.push_back(adaptAnalysisTask(cfgc)); workflow.push_back(adaptAnalysisTask(cfgc)); - workflow.push_back(adaptAnalysisTask(cfgc)); return workflow; } From 5f869f79f98a81aa10ac8dea9426cdab45f0ad2a Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Mon, 17 Feb 2025 20:57:09 +0100 Subject: [PATCH 0274/1650] [PWGLF] Add findable mode for new strangeness builder (#10024) Co-authored-by: ALICE Builder --- .../TableProducer/Strangeness/CMakeLists.txt | 6 +- .../strangenessbuilderfindable.cxx | 2016 +++++++++++++++++ PWGLF/Utils/strangenessBuilderHelper.h | 16 +- 3 files changed, 2029 insertions(+), 9 deletions(-) create mode 100644 PWGLF/TableProducer/Strangeness/strangenessbuilderfindable.cxx diff --git a/PWGLF/TableProducer/Strangeness/CMakeLists.txt b/PWGLF/TableProducer/Strangeness/CMakeLists.txt index eca7a3ee7d5..542455b6203 100644 --- a/PWGLF/TableProducer/Strangeness/CMakeLists.txt +++ b/PWGLF/TableProducer/Strangeness/CMakeLists.txt @@ -61,7 +61,6 @@ o2physics_add_dpl_workflow(double-casc-tree-creator PUBLIC_LINK_LIBRARIES O2Physics::EventFilteringUtils COMPONENT_NAME Analysis) - o2physics_add_dpl_workflow(lambdakzerobuilder SOURCES lambdakzerobuilder.cxx PUBLIC_LINK_LIBRARIES O2::DCAFitter O2Physics::AnalysisCore O2Physics::MLCore @@ -112,6 +111,11 @@ o2physics_add_dpl_workflow(strangenessbuilder PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DCAFitter KFParticle::KFParticle COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(strangenessbuilderfindable + SOURCES strangenessbuilderfindable.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DCAFitter KFParticle::KFParticle + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(v0-selector SOURCES v0selector.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore diff --git a/PWGLF/TableProducer/Strangeness/strangenessbuilderfindable.cxx b/PWGLF/TableProducer/Strangeness/strangenessbuilderfindable.cxx new file mode 100644 index 00000000000..38b0f938eda --- /dev/null +++ b/PWGLF/TableProducer/Strangeness/strangenessbuilderfindable.cxx @@ -0,0 +1,2016 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +// +// Strangeness builder task +// ======================== +// +// This task produces all tables that may be necessary for +// strangeness analyses. A single device is provided to +// ensure better computing resource (memory) management. +// +// process functions: +// +// -- processRealData[Run2] .........: use this OR processMonteCarlo but NOT both +// -- processMonteCarlo[Run2] .......: use this OR processRealData but NOT both +// + +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Common/DataModel/PIDResponse.h" +#include "TableHelper.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" +#include "PWGLF/DataModel/LFStrangenessPIDTables.h" +#include "PWGLF/Utils/strangenessBuilderHelper.h" +#include "CCDB/BasicCCDBManager.h" +#include "DataFormatsParameters/GRPObject.h" +#include "DataFormatsParameters/GRPMagField.h" + +using namespace o2; +using namespace o2::framework; + +static constexpr int nParameters = 1; +static const std::vector tableNames{ + "V0Indices", //.0 (standard analysis: V0Cores) + "V0CoresBase", //.1 (standard analyses: main table) + "V0Covs", //.2 (joinable with V0Cores) + "CascIndices", //.3 (standard analyses: CascData) + "KFCascIndices", //.4 (standard analyses: KFCascData) + "TraCascIndices", //.5 (standard analyses: TraCascData) + "StoredCascCores", //.6 (standard analyses: CascData, main table) + "StoredKFCascCores", //.7 (standard analyses: KFCascData, main table) + "StoredTraCascCores", //.8 (standard analyses: TraCascData, main table) + "CascCovs", //.9 (joinable with CascData) + "KFCascCovs", //.10 (joinable with KFCascData) + "TraCascCovs", //.11 (joinable with TraCascData) + "V0TrackXs", //.12 (joinable with V0Data) + "CascTrackXs", //.13 (joinable with CascData) + "CascBBs", //.14 (standard, bachelor-baryon vars) + "V0DauCovs", //.15 (requested: tracking studies) + "V0DauCovIUs", //.16 (requested: tracking studies) + "V0TraPosAtDCAs", //.17 (requested: tracking studies) + "V0TraPosAtIUs", //.18 (requested: tracking studies) + "V0Ivanovs", //.19 (requested: tracking studies) + "McV0Labels", //.20 (MC/standard analysis) + "V0MCCores", //.21 (MC, all generated desired V0s) + "V0CoreMCLabels", //.22 (MC, refs V0Cores to V0MCCores) + "V0MCCollRefs", //.23 (MC, refs V0MCCores to McCollisions) + "McCascLabels", //.24 (MC/standard analysis) + "McKFCascLabels", //.25 (MC, refs KFCascCores to CascMCCores) + "McTraCascLabels", //.26 (MC, refs TraCascCores to CascMCCores) + "McCascBBTags", //.27 (MC, joinable with CascCores, tags reco-ed) + "CascMCCores", //.28 (MC, all generated desired cascades) + "CascCoreMCLabels", //.29 (MC, refs CascCores to CascMCCores) + "CascMCCollRefs", // 30 (MC, refs CascMCCores to McCollisions) + "CascToTraRefs", //.31 (interlink CascCores -> TraCascCores) + "CascToKFRefs", //.32 (interlink CascCores -> KFCascCores) + "TraToCascRefs", //.33 (interlink TraCascCores -> CascCores) + "KFToCascRefs" //.34 (interlink KFCascCores -> CascCores) +}; + +static constexpr int nTablesConst = 35; + +static const std::vector parameterNames{"enable"}; +static const int defaultParameters[nTablesConst][nParameters]{ + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, // index 9 + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, // index 19 + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, // index 29 + {-1}, + {-1}, + {-1}, + {-1}, + {-1}}; + +// use parameters + cov mat non-propagated, aux info + (extension propagated) +using FullTracksExt = soa::Join; +using FullTracksExtIU = soa::Join; +using FullTracksExtLabeled = soa::Join; +using FullTracksExtLabeledIU = soa::Join; +using TracksWithExtra = soa::Join; + +// For dE/dx association in pre-selection +using TracksExtraWithPID = soa::Join; + +struct StrangenessBuilder { + // helper object + o2::pwglf::strangenessBuilderHelper straHelper; + + // table index : match order above + enum tableIndex { kV0Indices = 0, + kV0CoresBase, + kV0Covs, + kCascIndices, + kKFCascIndices, + kTraCascIndices, + kStoredCascCores, + kStoredKFCascCores, + kStoredTraCascCores, + kCascCovs, + kKFCascCovs, + kTraCascCovs, + kV0TrackXs, + kCascTrackXs, + kCascBBs, + kV0DauCovs, + kV0DauCovIUs, + kV0TraPosAtDCAs, + kV0TraPosAtIUs, + kV0Ivanovs, + kMcV0Labels, + kV0MCCores, + kV0CoreMCLabels, + kV0MCCollRefs, + kMcCascLabels, + kMcKFCascLabels, + kMcTraCascLabels, + kMcCascBBTags, + kCascMCCores, + kCascCoreMCLabels, + kCascMCCollRefs, + kCascToTraRefs, + kCascToKFRefs, + kTraToCascRefs, + kKFToCascRefs, + nTables }; + + //__________________________________________________ + // V0 tables + Produces v0indices; // standard part of V0Datas + Produces v0cores; // standard part of V0Datas + Produces v0covs; // for decay chain reco + + //__________________________________________________ + // cascade tables + Produces cascidx; // standard part of CascDatas + Produces kfcascidx; // standard part of KFCascDatas + Produces tracascidx; // standard part of TraCascDatas + Produces cascdata; // standard part of CascDatas + Produces kfcascdata; // standard part of KFCascDatas + Produces tracascdata; // standard part of TraCascDatas + Produces casccovs; // for decay chain reco + Produces kfcasccovs; // for decay chain reco + Produces tracasccovs; // for decay chain reco + + //__________________________________________________ + // interlink tables + Produces v0dataLink; // de-refs V0s -> V0Data + Produces cascdataLink; // de-refs Cascades -> CascData + Produces kfcascdataLink; // de-refs Cascades -> KFCascData + Produces tracascdataLink; // de-refs Cascades -> TraCascData + + //__________________________________________________ + // secondary auxiliary tables + Produces v0trackXs; // for decay chain reco + Produces cascTrackXs; // for decay chain reco + + //__________________________________________________ + // further auxiliary / optional if desired + Produces cascbb; + Produces v0daucovs; // covariances of daughter tracks + Produces v0daucovIUs; // covariances of daughter tracks + Produces v0dauPositions; // auxiliary debug information + Produces v0dauPositionsIU; // auxiliary debug information + Produces v0ivanovs; // information for Marian's tests + + //__________________________________________________ + // MC information: V0 + Produces v0labels; // MC labels for V0s + Produces v0mccores; // mc info storage + Produces v0CoreMCLabels; // interlink V0Cores -> V0MCCores + Produces v0mccollref; // references collisions from V0MCCores + + // MC information: Cascades + Produces casclabels; // MC labels for cascades + Produces kfcasclabels; // MC labels for KF cascades + Produces tracasclabels; // MC labels for tracked cascades + Produces bbtags; // bb tags (inv structure tagging in mc) + Produces cascmccores; // mc info storage + Produces cascCoreMClabels; // interlink CascCores -> CascMCCores + Produces cascmccollrefs; // references MC collisions from MC cascades + + //__________________________________________________ + // cascade interlinks + // FIXME: commented out until strangederivedbuilder adjusted accordingly + // Produces cascToTraRefs; // cascades -> tracked + // Produces cascToKFRefs; // cascades -> KF + // Produces traToCascRefs; // tracked -> cascades + // Produces kfToCascRefs; // KF -> cascades + + Configurable> enabledTables{"enabledTables", + {defaultParameters[0], nTables, nParameters, tableNames, parameterNames}, + "Produce this table: -1 for autodetect; otherwise, 0/1 is false/true"}; + std::vector mEnabledTables; // Vector of enabled tables + + // CCDB options + struct : ConfigurableGroup { + std::string prefix = "ccdb"; + Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; + Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; + Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; + } ccdbConfigurations; + + Configurable mc_findableMode{"mc_findableMode", 0, "0: disabled; 1: add findable-but-not-found to existing V0s from AO2D; 2: reset V0s and generate only findable-but-not-found"}; + + // V0 building options + struct : ConfigurableGroup { + std::string prefix = "v0BuilderOpts"; + Configurable generatePhotonCandidates{"generatePhotonCandidates", false, "generate gamma conversion candidates (V0s using TPC-only tracks)"}; + + // baseline conditionals of V0 building + Configurable minCrossedRows{"minCrossedRows", 50, "minimum TPC crossed rows for daughter tracks"}; + Configurable dcanegtopv{"dcanegtopv", .1, "DCA Neg To PV"}; + Configurable dcapostopv{"dcapostopv", .1, "DCA Pos To PV"}; + Configurable v0cospa{"v0cospa", 0.95, "V0 CosPA"}; // double -> N.B. dcos(x)/dx = 0 at x=0) + Configurable dcav0dau{"dcav0dau", 1.0, "DCA V0 Daughters"}; + Configurable v0radius{"v0radius", 0.9, "v0radius"}; + Configurable maxDaughterEta{"maxDaughterEta", 5.0, "Maximum daughter eta (in abs value)"}; + + // MC builder options + Configurable mc_populateV0MCCoresSymmetric{"mc_populateV0MCCoresSymmetric", false, "populate V0MCCores table for derived data analysis, keep V0MCCores joinable with V0Cores"}; + Configurable mc_populateV0MCCoresAsymmetric{"mc_populateV0MCCoresAsymmetric", true, "populate V0MCCores table for derived data analysis, create V0Cores -> V0MCCores interlink. Saves only labeled V0s."}; + Configurable mc_treatPiToMuDecays{"mc_treatPiToMuDecays", true, "if true, will correctly capture pi -> mu and V0 label will still point to originating V0 decay in those cases. Nota bene: prong info will still be for the muon!"}; + Configurable mc_rapidityWindow{"mc_rapidityWindow", 0.5, "rapidity window to save non-recoed candidates"}; + Configurable mc_addGeneratedK0Short{"mc_addGeneratedK0Short", false, "add V0MCCore entry for generated, not-recoed K0Short"}; + Configurable mc_addGeneratedLambda{"mc_addGeneratedLambda", false, "add V0MCCore entry for generated, not-recoed Lambda"}; + Configurable mc_addGeneratedAntiLambda{"mc_addGeneratedAntiLambda", false, "add V0MCCore entry for generated, not-recoed AntiLambda"}; + Configurable mc_addGeneratedGamma{"mc_addGeneratedGamma", false, "add V0MCCore entry for generated, not-recoed Gamma"}; + Configurable mc_findableDetachedV0{"mc_findableDetachedV0", true, "if true, generate findable V0s that have collisionId -1. Caution advised."}; + } v0BuilderOpts; + + // cascade building options + struct : ConfigurableGroup { + std::string prefix = "cascadeBuilderOpts"; + Configurable useCascadeMomentumAtPrimVtx{"useCascadeMomentumAtPrimVtx", false, "use cascade momentum at PV"}; + + // conditionals + Configurable minCrossedRows{"minCrossedRows", 50, "minimum TPC crossed rows for daughter tracks"}; + Configurable dcabachtopv{"dcabachtopv", .05, "DCA Bach To PV"}; + Configurable cascradius{"cascradius", 0.9, "cascradius"}; + Configurable casccospa{"casccospa", 0.95, "casccospa"}; + Configurable dcacascdau{"dcacascdau", 1.0, "DCA cascade Daughters"}; + Configurable lambdaMassWindow{"lambdaMassWindow", .010, "Distance from Lambda mass (does not apply to KF path)"}; + Configurable maxDaughterEta{"maxDaughterEta", 5.0, "Maximum daughter eta (in abs value)"}; + + // KF building specific + Configurable kfTuneForOmega{"kfTuneForOmega", false, "if enabled, take main cascade properties from Omega fit instead of Xi fit (= default)"}; + Configurable kfConstructMethod{"kfConstructMethod", 2, "KF Construct Method"}; + Configurable kfUseV0MassConstraint{"kfUseV0MassConstraint", true, "KF: use Lambda mass constraint"}; + Configurable kfUseCascadeMassConstraint{"kfUseCascadeMassConstraint", false, "KF: use Cascade mass constraint - WARNING: not adequate for inv mass analysis of Xi"}; + Configurable kfDoDCAFitterPreMinimV0{"kfDoDCAFitterPreMinimV0", true, "KF: do DCAFitter pre-optimization before KF fit to include material corrections for V0"}; + Configurable kfDoDCAFitterPreMinimCasc{"kfDoDCAFitterPreMinimCasc", true, "KF: do DCAFitter pre-optimization before KF fit to include material corrections for Xi"}; + + // MC builder options + Configurable mc_populateCascMCCoresSymmetric{"mc_populateCascMCCoresSymmetric", false, "populate CascMCCores table for derived data analysis, keep CascMCCores joinable with CascCores"}; + Configurable mc_populateCascMCCoresAsymmetric{"mc_populateCascMCCoresAsymmetric", true, "populate CascMCCores table for derived data analysis, create CascCores -> CascMCCores interlink. Saves only labeled Cascades."}; + Configurable mc_addGeneratedXiMinus{"mc_addGeneratedXiMinus", false, "add CascMCCore entry for generated, not-recoed XiMinus"}; + Configurable mc_addGeneratedXiPlus{"mc_addGeneratedXiPlus", false, "add CascMCCore entry for generated, not-recoed XiPlus"}; + Configurable mc_addGeneratedOmegaMinus{"mc_addGeneratedOmegaMinus", false, "add CascMCCore entry for generated, not-recoed OmegaMinus"}; + Configurable mc_addGeneratedOmegaPlus{"mc_addGeneratedOmegaPlus", false, "add CascMCCore entry for generated, not-recoed OmegaPlus"}; + Configurable mc_treatPiToMuDecays{"mc_treatPiToMuDecays", true, "if true, will correctly capture pi -> mu and V0 label will still point to originating V0 decay in those cases. Nota bene: prong info will still be for the muon!"}; + Configurable mc_rapidityWindow{"mc_rapidityWindow", 0.5, "rapidity window to save non-recoed candidates"}; + Configurable mc_findableDetachedCascade{"mc_findableDetachedCascade", true, "if true, generate findable cascades that have collisionId -1. Caution advised."}; + } cascadeBuilderOpts; + + o2::ccdb::CcdbApi ccdbApi; + Service ccdb; + + int mRunNumber; + o2::base::MatLayerCylSet* lut = nullptr; + + // for tagging V0s used in cascades + std::vector v0sFromCascades; // Vector of v0 candidates used in cascades + std::vector v0Map; // index to relate V0s -> v0sFromCascades + + // for establishing CascData/KFData/TraCascData interlinks + struct { + std::vector cascCoreToCascades; + std::vector kfCascCoreToCascades; + std::vector traCascCoreToCascades; + std::vector cascadeToCascCores; + std::vector cascadeToKFCascCores; + std::vector cascadeToTraCascCores; + } interlinks; + + //*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+* + // struct to add abstraction layer between V0s, Cascades and build indices + // desirable for adding extra (findable, etc) V0s, Cascades to built list + struct trackEntry { + int globalId = -1; + int originId = -1; + int mcCollisionId = -1; + int pdgCode = -1; + }; + struct v0Entry { + int globalId = -1; + int collisionId = -1; + int posTrackId = -1; + int negTrackId = -1; + int v0Type = 0; + int pdgCode = 0; // undefined if not MC - useful for faster finding + int particleId = -1; // de-reference the V0 particle if necessary + bool isCollinearV0 = false; + }; + struct cascadeEntry { + int globalId = -1; + int collisionId = -1; + int v0Id = -1; + int posTrackId = -1; + int negTrackId = -1; + int bachTrackId = -1; + int cascadeType = 0; // extra addition (0: standard, 1: findable but not found) + }; + std::vector v0List; + std::vector cascadeList; + std::vector sorted_v0; + std::vector sorted_cascade; + //*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+* + // Helper struct to contain V0MCCore information prior to filling + struct mcV0info { + int label = -1; + int motherLabel = -1; + int pdgCode = 0; + int pdgCodeMother = 0; + int pdgCodePositive = 0; + int pdgCodeNegative = 0; + int mcCollision = -1; + bool isPhysicalPrimary = false; + int processPositive = -1; + int processNegative = -1; + std::array xyz; + std::array posP; + std::array negP; + std::array momentum; + }; + mcV0info thisInfo; + //*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+* + // Helper struct to contain CascMCCore information prior to filling + struct mcCascinfo { + int label; + int motherLabel; + int mcCollision; + int pdgCode; + int pdgCodeMother; + int pdgCodeV0; + int pdgCodePositive; + int pdgCodeNegative; + int pdgCodeBachelor; + bool isPhysicalPrimary; + int processPositive = -1; + int processNegative = -1; + int processBachelor = -1; + std::array xyz; + std::array lxyz; + std::array posP; + std::array negP; + std::array bachP; + std::array momentum; + int mcParticlePositive; + int mcParticleNegative; + int mcParticleBachelor; + }; + mcCascinfo thisCascInfo; + //*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+* + + HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + + void init(InitContext& context) + { + // setup bookkeeping histogram + auto h = histos.add("hTableBuildingStatistics", "hTableBuildingStatistics", kTH1D, {{nTablesConst, -0.5f, static_cast(nTablesConst)}}); + auto h2 = histos.add("hInputStatistics", "hInputStatistics", kTH1D, {{nTablesConst, -0.5f, static_cast(nTablesConst)}}); + h2->SetTitle("Input table sizes"); + + if (mc_findableMode.value > 0) { + // save statistics of findable candidate processing + auto hFindable = histos.add("hFindableStatistics", "hFindableStatistics", kTH1D, {{10, -0.5f, 9.5f}}); + } + + mRunNumber = 0; + + mEnabledTables.resize(nTables, 0); + + LOGF(info, "Configuring tables to generate"); + auto& workflows = context.services().get(); + + for (int i = 0; i < nTables; i++) { + // adjust bookkeeping histogram + h->GetXaxis()->SetBinLabel(i + 1, tableNames[i].c_str()); + h2->GetXaxis()->SetBinLabel(i + 1, tableNames[i].c_str()); + h->SetBinContent(i + 1, -1); // mark all as disabled to start + + int f = enabledTables->get(tableNames[i].c_str(), "enable"); + if (f == 1) { + mEnabledTables[i] = 1; + } + if (f == -1) { + // autodetect this table in other devices + for (DeviceSpec const& device : workflows.devices) { + // Step 1: check if this device subscribed to the V0data table + for (auto const& input : device.inputs) { + if (device.name.compare("strangenessbuilder-initializer") == 0) + continue; // don't listen to the initializer + if (input.matcher.binding == tableNames[i]) { + LOGF(info, "Device %s has subscribed to %s", device.name, tableNames[i]); + mEnabledTables[i] = 1; + } + } + } + } + } + + // list enabled tables + LOGF(info, "*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*"); + LOGF(info, " Strangeness builder: enabled table listing"); + LOGF(info, "*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*"); + for (int i = 0; i < nTables; i++) { + // printout to be improved in the future + if (mEnabledTables[i]) { + LOGF(info, " -~> Table enabled: %s", tableNames[i]); + h->SetBinContent(i + 1, 0); // mark enabled + } + } + LOGF(info, "*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*"); + // print base cuts + LOGF(info, "-~> V0 | min crossed rows ..............: %i", v0BuilderOpts.minCrossedRows.value); + LOGF(info, "-~> V0 | DCA pos track to PV ...........: %f", v0BuilderOpts.dcapostopv.value); + LOGF(info, "-~> V0 | DCA neg track to PV ...........: %f", v0BuilderOpts.dcanegtopv.value); + LOGF(info, "-~> V0 | V0 cosine of PA ...............: %f", v0BuilderOpts.v0cospa.value); + LOGF(info, "-~> V0 | DCA between V0 daughters ......: %f", v0BuilderOpts.dcav0dau.value); + LOGF(info, "-~> V0 | V0 2D decay radius ............: %f", v0BuilderOpts.v0radius.value); + LOGF(info, "-~> V0 | Maximum daughter eta ..........: %f", v0BuilderOpts.maxDaughterEta.value); + + LOGF(info, "-~> Cascade | min crossed rows .........: %i", cascadeBuilderOpts.minCrossedRows.value); + LOGF(info, "-~> Cascade | DCA bach track to PV .....: %f", cascadeBuilderOpts.dcabachtopv.value); + LOGF(info, "-~> Cascade | Cascade cosine of PA .....: %f", cascadeBuilderOpts.casccospa.value); + LOGF(info, "-~> Cascade | Cascade daughter DCA .....: %f", cascadeBuilderOpts.dcacascdau.value); + LOGF(info, "-~> Cascade | Cascade radius ...........: %f", cascadeBuilderOpts.cascradius.value); + LOGF(info, "-~> Cascade | Lambda mass window .......: %f", cascadeBuilderOpts.lambdaMassWindow.value); + LOGF(info, "-~> Cascade | Maximum daughter eta .....: %f", cascadeBuilderOpts.maxDaughterEta.value); + LOGF(info, "*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*"); + + ccdb->setURL(ccdbConfigurations.ccdburl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setFatalWhenNull(false); + + // set V0 parameters in the helper + straHelper.v0selections.minCrossedRows = v0BuilderOpts.minCrossedRows; + straHelper.v0selections.dcanegtopv = v0BuilderOpts.dcanegtopv; + straHelper.v0selections.dcapostopv = v0BuilderOpts.dcapostopv; + straHelper.v0selections.v0cospa = v0BuilderOpts.v0cospa; + straHelper.v0selections.dcav0dau = v0BuilderOpts.dcav0dau; + straHelper.v0selections.v0radius = v0BuilderOpts.v0radius; + straHelper.v0selections.maxDaughterEta = v0BuilderOpts.maxDaughterEta; + + // set cascade parameters in the helper + straHelper.cascadeselections.minCrossedRows = cascadeBuilderOpts.minCrossedRows; + straHelper.cascadeselections.dcabachtopv = cascadeBuilderOpts.dcabachtopv; + straHelper.cascadeselections.cascradius = cascadeBuilderOpts.cascradius; + straHelper.cascadeselections.casccospa = cascadeBuilderOpts.casccospa; + straHelper.cascadeselections.dcacascdau = cascadeBuilderOpts.dcacascdau; + straHelper.cascadeselections.lambdaMassWindow = cascadeBuilderOpts.lambdaMassWindow; + straHelper.cascadeselections.maxDaughterEta = cascadeBuilderOpts.maxDaughterEta; + } + + // for sorting + template + std::vector sort_indices(const std::vector& v) + { + std::vector idx(v.size()); + std::iota(idx.begin(), idx.end(), 0); + std::stable_sort(idx.begin(), idx.end(), + [&v](std::size_t i1, std::size_t i2) { return v[i1].collisionId < v[i2].collisionId; }); + return idx; + } + + template + bool initCCDB(aod::BCsWithTimestamps const& bcs, TCollisions const& collisions) + { + auto bc = collisions.size() ? collisions.begin().template bc_as() : bcs.begin(); + if (!bcs.size()) { + LOGF(warn, "No BC found, skipping this DF."); + return false; // signal to skip this DF + } + + if (mRunNumber == bc.runNumber()) { + return true; + } + + auto timestamp = bc.timestamp(); + o2::parameters::GRPObject* grpo = 0x0; + o2::parameters::GRPMagField* grpmag = 0x0; + if (doprocessRealDataRun2) { + grpo = ccdb->getForTimeStamp(ccdbConfigurations.grpPath, timestamp); + if (!grpo) { + LOG(fatal) << "Got nullptr from CCDB for path " << ccdbConfigurations.grpPath << " of object GRPObject for timestamp " << timestamp; + } + o2::base::Propagator::initFieldFromGRP(grpo); + } else { + grpmag = ccdb->getForTimeStamp(ccdbConfigurations.grpmagPath, timestamp); + if (!grpmag) { + LOG(fatal) << "Got nullptr from CCDB for path " << ccdbConfigurations.grpmagPath << " of object GRPMagField for timestamp " << timestamp; + } + o2::base::Propagator::initFieldFromGRP(grpmag); + } + // Fetch magnetic field from ccdb for current collision + auto magneticField = o2::base::Propagator::Instance()->getNominalBz(); + LOG(info) << "Retrieved GRP for timestamp " << timestamp << " with magnetic field of " << magneticField << " kG"; + + // Set magnetic field value once known + straHelper.fitter.setBz(magneticField); + + // acquire LUT for this timestamp + LOG(info) << "Loading material look-up table for timestamp: " << timestamp; + lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->getForTimeStamp(ccdbConfigurations.lutPath, timestamp)); + o2::base::Propagator::Instance()->setMatLUT(lut); + straHelper.lut = lut; + + LOG(info) << "Fully configured for run: " << bc.runNumber(); + // mmark this run as configured + mRunNumber = bc.runNumber(); + + return true; + } + + //__________________________________________________ + void resetInterlinks() + { + interlinks.cascCoreToCascades.clear(); + interlinks.kfCascCoreToCascades.clear(); + interlinks.traCascCoreToCascades.clear(); + interlinks.cascadeToCascCores.clear(); + interlinks.cascadeToKFCascCores.clear(); + interlinks.cascadeToTraCascCores.clear(); + } + + //__________________________________________________ + void populateCascadeInterlinks() + { + // if (mEnabledTables[kCascToKFRefs]) { + // for (auto& cascCore : interlinks.cascCoreToCascades) { + // cascToKFRefs(interlinks.cascadeToKFCascCores[cascCore]); + // histos.fill(HIST("hTableBuildingStatistics"), kCascToKFRefs); + // } + // } + // if (mEnabledTables[kCascToTraRefs]) { + // for (auto& cascCore : interlinks.cascCoreToCascades) { + // cascToTraRefs(interlinks.cascadeToTraCascCores[cascCore]); + // histos.fill(HIST("hTableBuildingStatistics"), kCascToTraRefs); + // } + // } + // if (mEnabledTables[kKFToCascRefs]) { + // for (auto& kfCascCore : interlinks.kfCascCoreToCascades) { + // kfToCascRefs(interlinks.cascadeToCascCores[kfCascCore]); + // histos.fill(HIST("hTableBuildingStatistics"), kKFToCascRefs); + // } + // } + // if (mEnabledTables[kTraToCascRefs]) { + // for (auto& traCascCore : interlinks.traCascCoreToCascades) { + // traToCascRefs(interlinks.cascadeToCascCores[traCascCore]); + // histos.fill(HIST("hTableBuildingStatistics"), kTraToCascRefs); + // } + // } + } + + //__________________________________________________ + template + void prepareBuildingLists(TCollisions const& collisions, TMCCollisions const& mcCollisions, TV0s const& v0s, TCascades const& cascades, TTracks const& tracks, TMCParticles const& mcParticles) + { + // this function prepares the v0List and cascadeList depending on + // how the task has been set up. Standard operation simply uses + // the existing V0s and Cascades from AO2D, while findable MC + // operation either complements with all findable-but-not-found + // or resets and fills with all findable. + // + // Whenever using findable candidates, they will be appropriately + // marked for posterior analysis using 'type' variables. + // + // findable mode legend: + // 0: simple passthrough of V0s, Cascades in AO2Ds + // (in data, this is the only mode possible!) + // 1: add extra findable that haven't been found + // 2: generate only findable (no background) + + // redo lists from scratch + v0List.clear(); + cascadeList.clear(); + sorted_v0.clear(); + sorted_cascade.clear(); + + trackEntry currentTrackEntry; + v0Entry currentV0Entry; + cascadeEntry currentCascadeEntry; + + std::vector bestCollisionArray; // stores McCollision -> Collision map + std::vector bestCollisionNContribsArray; // stores Ncontribs for biggest coll assoc to mccoll + + if (mc_findableMode.value > 0) { + if constexpr (soa::is_table) { + // if mcCollisions exist, assemble mcColl -> bestRecoColl map here + bestCollisionArray.clear(); + bestCollisionNContribsArray.clear(); + bestCollisionArray.resize(mcCollisions.size(), -1); // marks not reconstructed + bestCollisionNContribsArray.resize(mcCollisions.size(), -1); // marks not reconstructed + + // single loop over double loop at a small cost in memory for extra array + for (auto& collision : collisions) { + if (collision.has_mcCollision()) { + if (collision.numContrib() > bestCollisionNContribsArray[collision.mcCollisionId()]) { + bestCollisionArray[collision.mcCollisionId()] = collision.globalIndex(); + bestCollisionNContribsArray[collision.mcCollisionId()] = collision.numContrib(); + } + } + } // end collision loop + } // end is_table + } // end findable mode check + + if (mc_findableMode.value < 2) { + // simple passthrough: copy existing v0s to build list + for (auto& v0 : v0s) { + currentV0Entry.globalId = v0.globalIndex(); + currentV0Entry.collisionId = v0.collisionId(); + currentV0Entry.posTrackId = v0.posTrackId(); + currentV0Entry.negTrackId = v0.negTrackId(); + currentV0Entry.v0Type = v0.v0Type(); + currentV0Entry.pdgCode = 0; + currentV0Entry.particleId = -1; + currentV0Entry.isCollinearV0 = v0.isCollinearV0(); + v0List.push_back(currentV0Entry); + } + } + // any mode other than 0 will require mcParticles + if constexpr (soa::is_table) { + if (mc_findableMode.value > 0) { + // for search if existing or not + int v0ListReconstructedSize = v0List.size(); + + // find extra candidates, step 1: find subset of tracks that interest + std::vector positiveTrackArray; + std::vector negativeTrackArray; + // vector elements: track index, origin index [, mc collision id, pdg code] + int dummy = -1; // unnecessary in this path + for (auto& track : tracks) { + if (!track.has_mcParticle()) { + continue; // skip this, it's trouble + } + auto particle = track.template mcParticle_as(); + int originParticleIndex = getOriginatingParticle(particle, dummy, v0BuilderOpts.mc_treatPiToMuDecays); + if (originParticleIndex < 0) { + continue; // skip this, it's trouble (2) + } + auto originParticle = mcParticles.rawIteratorAt(originParticleIndex); + + bool trackIsInteresting = false; + if ( + (originParticle.pdgCode() == 310 && v0BuilderOpts.mc_addGeneratedK0Short.value > 0) || + (originParticle.pdgCode() == 3122 && v0BuilderOpts.mc_addGeneratedLambda.value > 0) || + (originParticle.pdgCode() == -3122 && v0BuilderOpts.mc_addGeneratedAntiLambda.value > 0) || + (originParticle.pdgCode() == 22 && v0BuilderOpts.mc_addGeneratedGamma.value > 0)) { + trackIsInteresting = true; + } + if (!trackIsInteresting) { + continue; // skip this, it's uninteresting + } + + currentTrackEntry.globalId = static_cast(track.globalIndex()); + currentTrackEntry.originId = originParticleIndex; + currentTrackEntry.mcCollisionId = originParticle.mcCollisionId(); + currentTrackEntry.pdgCode = originParticle.pdgCode(); + + // now separate according to particle species + if (track.sign() < 0) { + negativeTrackArray.push_back(currentTrackEntry); + } else { + positiveTrackArray.push_back(currentTrackEntry); + } + } + + // Nested loop only with valuable tracks + for (auto& positiveTrackIndex : positiveTrackArray) { + for (auto& negativeTrackIndex : negativeTrackArray) { + if (positiveTrackIndex.originId != negativeTrackIndex.originId) { + continue; // not the same originating particle + } + // findable mode 1: add non-reconstructed as v0Type 8 + if (mc_findableMode.value == 1) { + bool detected = false; + for (int ii = 0; ii < v0ListReconstructedSize; ii++) { + // check if this particular combination already exists in v0List + if (v0List[ii].posTrackId == positiveTrackIndex.globalId && + v0List[ii].negTrackId == negativeTrackIndex.globalId) { + detected = true; + // override pdg code with something useful for cascade findable math + v0List[ii].pdgCode = positiveTrackIndex.pdgCode; + } + } + if (detected == false) { + // collision index: from best-version-of-this-mcCollision + // nota bene: this could be negative, caution advised + currentV0Entry.globalId = -1; + currentV0Entry.collisionId = bestCollisionArray[positiveTrackIndex.mcCollisionId]; + currentV0Entry.posTrackId = positiveTrackIndex.globalId; + currentV0Entry.negTrackId = negativeTrackIndex.globalId; + currentV0Entry.v0Type = 8; // mark with bit 3 + currentV0Entry.pdgCode = positiveTrackIndex.pdgCode; + currentV0Entry.particleId = positiveTrackIndex.originId; + currentV0Entry.isCollinearV0 = false; + if (v0BuilderOpts.mc_findableDetachedV0.value || currentV0Entry.collisionId >= 0) { + v0List.push_back(currentV0Entry); + } + } + } + // findable mode 2: determine type based on V0 table, + // with type 8 being reserved to findable-but-not-found + if (mc_findableMode.value == 2) { + currentV0Entry.globalId = -1; + currentV0Entry.collisionId = bestCollisionArray[positiveTrackIndex.mcCollisionId]; + currentV0Entry.posTrackId = positiveTrackIndex.globalId; + currentV0Entry.negTrackId = negativeTrackIndex.globalId; + currentV0Entry.v0Type = 8; + currentV0Entry.pdgCode = positiveTrackIndex.pdgCode; + currentV0Entry.particleId = positiveTrackIndex.originId; + currentV0Entry.isCollinearV0 = false; + for (auto& v0 : v0s) { + if (v0.posTrackId() == positiveTrackIndex.globalId && + v0.negTrackId() == negativeTrackIndex.globalId) { + // this will override type, but not collision index + // N.B.: collision index checks still desirable! + currentV0Entry.globalId = v0.globalIndex(); + currentV0Entry.v0Type = v0.v0Type(); + currentV0Entry.isCollinearV0 = v0.isCollinearV0(); + } + } + if (v0BuilderOpts.mc_findableDetachedV0.value || currentV0Entry.collisionId >= 0) { + v0List.push_back(currentV0Entry); + } + } + } + } // end positive / negative track loops + } // end findableMode > 0 check + } // end soa::is_table + + // determine properly collision-id-sorted index array for later use + // N.B.: necessary also before cascade part + sorted_v0.clear(); + sorted_v0 = sort_indices(v0List); + + // Cascade part + if (mc_findableMode.value < 2) { + // simple passthrough: copy existing cascades to build list + for (auto& cascade : cascades) { + auto const& v0 = cascade.v0(); + currentCascadeEntry.globalId = cascade.globalIndex(); + currentCascadeEntry.collisionId = cascade.collisionId(); + currentCascadeEntry.v0Id = -1; // fill this in one go later + currentCascadeEntry.posTrackId = v0.posTrackId(); + currentCascadeEntry.negTrackId = v0.negTrackId(); + currentCascadeEntry.bachTrackId = cascade.bachelorId(); + currentCascadeEntry.cascadeType = 0; // found + cascadeList.push_back(currentCascadeEntry); + } + } + + // any mode other than 0 will require mcParticles + if constexpr (soa::is_table) { + if (mc_findableMode.value > 0) { + // for search if existing or not + size_t cascadeListReconstructedSize = cascadeList.size(); + + // determine which tracks are of interest + std::vector bachelorTrackArray; + // vector elements: track index, origin index, mc collision id, pdg code] + int dummy = -1; // unnecessary in this path + for (auto& track : tracks) { + if (!track.has_mcParticle()) { + continue; // skip this, it's trouble + } + auto particle = track.template mcParticle_as(); + int originParticleIndex = getOriginatingParticle(particle, dummy, v0BuilderOpts.mc_treatPiToMuDecays); + if (originParticleIndex < 0) { + continue; // skip this, it's trouble (2) + } + auto originParticle = mcParticles.rawIteratorAt(originParticleIndex); + + bool trackIsInteresting = false; + if ( + (originParticle.pdgCode() == 3312 && cascadeBuilderOpts.mc_addGeneratedXiMinus.value > 0) || + (originParticle.pdgCode() == -3312 && cascadeBuilderOpts.mc_addGeneratedXiPlus.value > 0) || + (originParticle.pdgCode() == 3334 && cascadeBuilderOpts.mc_addGeneratedOmegaMinus.value > 0) || + (originParticle.pdgCode() == -3334 && cascadeBuilderOpts.mc_addGeneratedOmegaPlus.value > 0)) { + trackIsInteresting = true; + } + if (!trackIsInteresting) { + continue; // skip this, it's uninteresting + } + + currentTrackEntry.globalId = static_cast(track.globalIndex()); + currentTrackEntry.originId = originParticleIndex; + currentTrackEntry.mcCollisionId = originParticle.mcCollisionId(); + currentTrackEntry.pdgCode = originParticle.pdgCode(); + + // populate list of bachelor tracks to pair + bachelorTrackArray.push_back(currentTrackEntry); + } + + // determine which V0s are of interest to pair and do pairing + for (size_t v0i = 0; v0i < v0List.size(); v0i++) { + auto v0 = v0List[sorted_v0[v0i]]; + + if (std::abs(v0.pdgCode) != 3122) { + continue; // this V0 isn't a lambda, can't come from a cascade: skip + } + if (v0.particleId < 0) { + continue; // no de-referencing possible (e.g. background, ...) + } + auto v0Particle = mcParticles.rawIteratorAt(v0.particleId); + + int v0OriginParticleIndex = -1; + if (v0Particle.has_mothers()) { + auto const& motherList = v0Particle.template mothers_as(); + if (motherList.size() == 1) { + for (const auto& mother : motherList) { + v0OriginParticleIndex = mother.globalIndex(); + } + } + } + if (v0OriginParticleIndex < 0) { + continue; + } + auto v0OriginParticle = mcParticles.rawIteratorAt(v0OriginParticleIndex); + + if (std::abs(v0OriginParticle.pdgCode()) != 3312 && std::abs(v0OriginParticle.pdgCode()) != 3334) { + continue; // this V0 does not come from any particle of interest, don't try + } + for (auto& bachelorTrackIndex : bachelorTrackArray) { + if (bachelorTrackIndex.originId != v0OriginParticle.pdgCode()) { + continue; + } + // if we are here: v0 origin is 3312 or 3334, bachelor origin matches V0 origin + // findable mode 1: add non-reconstructed as cascadeType 1 + if (mc_findableMode.value == 1) { + bool detected = false; + for (size_t ii = 0; ii < cascadeListReconstructedSize; ii++) { + // check if this particular combination already exists in cascadeList + // caution: use track indices (immutable) but not V0 indices (re-indexing) + if (cascadeList[ii].posTrackId == v0.posTrackId && + cascadeList[ii].negTrackId == v0.negTrackId && + cascadeList[ii].bachTrackId == bachelorTrackIndex.globalId) { + detected = true; + } + } + if (detected == false) { + // collision index: from best-version-of-this-mcCollision + // nota bene: this could be negative, caution advised + currentCascadeEntry.globalId = -1; + currentCascadeEntry.collisionId = bestCollisionArray[bachelorTrackIndex.mcCollisionId]; + currentCascadeEntry.v0Id = v0i; // correct information here + currentCascadeEntry.posTrackId = v0.posTrackId; + currentCascadeEntry.negTrackId = v0.negTrackId; + currentCascadeEntry.bachTrackId = bachelorTrackIndex.globalId; + currentCascadeEntry.cascadeType = 1; // findable (but not found) + cascadeList.push_back(currentCascadeEntry); + if (cascadeBuilderOpts.mc_findableDetachedCascade.value || currentV0Entry.collisionId >= 0) { + v0List.push_back(currentV0Entry); + } + } + } + + // findable mode 2: determine type based on cascade table, + // with type 1 being reserved to findable-but-not-found + if (mc_findableMode.value == 2) { + currentCascadeEntry.globalId = -1; + currentCascadeEntry.collisionId = bestCollisionArray[bachelorTrackIndex.mcCollisionId]; + currentCascadeEntry.v0Id = v0i; // fill this in one go later + currentCascadeEntry.posTrackId = v0.posTrackId; + currentCascadeEntry.negTrackId = v0.negTrackId; + currentCascadeEntry.bachTrackId = bachelorTrackIndex.globalId; + currentCascadeEntry.cascadeType = 1; // findable (but not found) + for (auto& cascade : cascades) { + auto const& v0fromAOD = cascade.v0(); + if (v0fromAOD.posTrackId() == v0.posTrackId && + v0fromAOD.negTrackId() == v0.negTrackId && + cascade.bachelorId() == bachelorTrackIndex.globalId) { + // this will override type, but not collision index + // N.B.: collision index checks still desirable! + currentCascadeEntry.cascadeType = 0; + currentCascadeEntry.globalId = v0fromAOD.globalIndex(); + } + } + if (cascadeBuilderOpts.mc_findableDetachedCascade.value || currentV0Entry.collisionId >= 0) { + cascadeList.push_back(currentCascadeEntry); + } + } + } // end bachelorTrackArray loop + } // end v0List loop + + // at this stage, cascadeList is alright, but the v0 indices are still not + // correct. We'll have to loop over all V0s and find the appropriate matches + // ---> but only in mode 1, and only for AO2D-native V0s + if (mc_findableMode.value == 1) { + for (size_t casci = 0; casci < cascadeListReconstructedSize; casci++) { + // loop over v0List to find corresponding v0 index, but do it in sorted way + for (size_t v0i = 0; v0i < v0List.size(); v0i++) { + auto v0 = v0List[sorted_v0[v0i]]; + if (cascadeList[casci].posTrackId == v0.posTrackId && + cascadeList[casci].negTrackId == v0.negTrackId) { + cascadeList[casci].v0Id = v0i; // fix, point to correct V0 index + } + } + } + } + + // we need to allow for sorted use of cascadeList + sorted_cascade.clear(); + sorted_cascade = sort_indices(cascadeList); + + // we should now be done! + } // end findable mode check + } // end soa::is_table + } + + //__________________________________________________ + template + void markV0sUsedInCascades(TV0s const& v0s, TCascades const& cascades, TTrackedCascades const& trackedCascades) + { + int v0sUsedInCascades = 0; + v0sFromCascades.clear(); + v0Map.clear(); + v0Map.resize(v0List.size(), -2); // marks not used + if (mEnabledTables[kStoredCascCores]) { + for (auto& cascade : cascadeList) { + if (v0Map[cascade.v0Id] == -2) { + v0sUsedInCascades++; + } + v0Map[cascade.v0Id] = -1; // marks used (but isn't the index of a properly built V0, which would be >= 0) + } + } + int trackedCascadeCount = 0; + if constexpr (soa::is_table) { + // tracked only created outside of findable mode + if (mEnabledTables[kStoredTraCascCores] && mc_findableMode.value == 0) { + trackedCascadeCount = trackedCascades.size(); + for (auto& trackedCascade : trackedCascades) { + auto const& cascade = trackedCascade.cascade(); + if (v0Map[cascade.v0Id()] == -2) { + v0sUsedInCascades++; + } + v0Map[cascade.v0Id()] = -1; // marks used (but isn't the index of a properly built V0, which would be >= 0) + } + } + } + LOGF(debug, "V0 total %i, Cascade total %i, Tracked cascade total %i, V0s flagged used in cascades: %i", v0s.size(), cascades.size(), trackedCascadeCount, v0sUsedInCascades); + } + + //__________________________________________________ + template + void buildV0s(TCollisions const& collisions, TV0s const& v0s, TTracks const& tracks, TMCParticles const& mcParticles) + { + // prepare MC containers (not necessarily used) + std::vector mcV0infos; // V0MCCore information + std::vector mcParticleIsReco; + + if constexpr (soa::is_table) { + // do this if provided with a mcParticle table as well + mcParticleIsReco.resize(mcParticles.size(), false); + } + + int nV0s = 0; + // Loops over all V0s in the time frame + histos.fill(HIST("hInputStatistics"), kV0CoresBase, v0s.size()); + for (auto& v0 : v0s) { + if (!mEnabledTables[kV0CoresBase] && v0Map[v0.globalId] == -2) { + // this v0 hasn't been used by cascades and we're not generating V0s, so skip it + v0dataLink(-1, -1); + continue; + } + + // Get tracks and generate candidate + auto const& collision = collisions.rawIteratorAt(v0.collisionId); + auto const& posTrack = tracks.rawIteratorAt(v0.posTrackId); + auto const& negTrack = tracks.rawIteratorAt(v0.negTrackId); + if (!straHelper.buildV0Candidate(collision, posTrack, negTrack, v0.isCollinearV0, mEnabledTables[kV0Covs])) { + v0dataLink(-1, -1); + continue; + } + if (v0Map[v0.globalId] == -1) { + v0Map[v0.globalId] = v0sFromCascades.size(); // provide actual valid index in buffer + v0sFromCascades.push_back(straHelper.v0); + } + // fill requested cursors only if type is not 0 + if (v0.v0Type == 1 || (v0.v0Type > 1 && v0BuilderOpts.generatePhotonCandidates)) { + nV0s++; + if (mEnabledTables[kV0Indices]) { + // for referencing (especially - but not only - when using derived data) + v0indices(v0.posTrackId, v0.negTrackId, + v0.collisionId, v0.globalId); + histos.fill(HIST("hTableBuildingStatistics"), kV0Indices); + } + if (mEnabledTables[kV0TrackXs]) { + // further decay chains may need this + v0trackXs(straHelper.v0.positiveTrackX, straHelper.v0.negativeTrackX); + histos.fill(HIST("hTableBuildingStatistics"), kV0TrackXs); + } + if (mEnabledTables[kV0CoresBase]) { + // standard analysis + v0cores(straHelper.v0.position[0], straHelper.v0.position[1], straHelper.v0.position[2], + straHelper.v0.positiveMomentum[0], straHelper.v0.positiveMomentum[1], straHelper.v0.positiveMomentum[2], + straHelper.v0.negativeMomentum[0], straHelper.v0.negativeMomentum[1], straHelper.v0.negativeMomentum[2], + straHelper.v0.daughterDCA, + straHelper.v0.positiveDCAxy, + straHelper.v0.negativeDCAxy, + TMath::Cos(straHelper.v0.pointingAngle), + straHelper.v0.dcaXY, + v0.v0Type); + v0dataLink(v0cores.lastIndex(), -1); + histos.fill(HIST("hTableBuildingStatistics"), kV0CoresBase); + } + if (mEnabledTables[kV0TraPosAtDCAs]) { + // for tracking studies + v0dauPositions(straHelper.v0.positivePosition[0], straHelper.v0.positivePosition[1], straHelper.v0.positivePosition[2], + straHelper.v0.negativePosition[0], straHelper.v0.negativePosition[1], straHelper.v0.negativePosition[2]); + histos.fill(HIST("hTableBuildingStatistics"), kV0TraPosAtDCAs); + } + if (mEnabledTables[kV0TraPosAtIUs]) { + // for tracking studies + std::array positivePositionIU; + std::array negativePositionIU; + o2::track::TrackPar positiveTrackParam = getTrackPar(posTrack); + o2::track::TrackPar negativeTrackParam = getTrackPar(negTrack); + positiveTrackParam.getXYZGlo(positivePositionIU); + negativeTrackParam.getXYZGlo(negativePositionIU); + v0dauPositionsIU(positivePositionIU[0], positivePositionIU[1], positivePositionIU[2], + negativePositionIU[0], negativePositionIU[1], negativePositionIU[2]); + histos.fill(HIST("hTableBuildingStatistics"), kV0TraPosAtIUs); + } + if (mEnabledTables[kV0Covs]) { + v0covs(straHelper.v0.positionCovariance, straHelper.v0.momentumCovariance); + histos.fill(HIST("hTableBuildingStatistics"), kV0Covs); + } + + //_________________________________________________________ + // MC handling part + if constexpr (soa::is_table) { + // only worry about this if someone else worried about this + if ((mEnabledTables[kV0MCCores] || mEnabledTables[kMcV0Labels] || mEnabledTables[kV0MCCollRefs])) { + thisInfo.label = -1; + thisInfo.motherLabel = -1; + thisInfo.pdgCode = 0; + thisInfo.pdgCodeMother = 0; + thisInfo.pdgCodePositive = 0; + thisInfo.pdgCodeNegative = 0; + thisInfo.mcCollision = -1; + thisInfo.xyz[0] = thisInfo.xyz[1] = thisInfo.xyz[2] = 0.0f; + thisInfo.posP[0] = thisInfo.posP[1] = thisInfo.posP[2] = 0.0f; + thisInfo.negP[0] = thisInfo.negP[1] = thisInfo.negP[2] = 0.0f; + thisInfo.momentum[0] = thisInfo.momentum[1] = thisInfo.momentum[2] = 0.0f; + + // Association check + // There might be smarter ways of doing this in the future + if (negTrack.has_mcParticle() && posTrack.has_mcParticle()) { + auto lMCNegTrack = negTrack.template mcParticle_as(); + auto lMCPosTrack = posTrack.template mcParticle_as(); + + thisInfo.pdgCodePositive = lMCPosTrack.pdgCode(); + thisInfo.pdgCodeNegative = lMCNegTrack.pdgCode(); + thisInfo.processPositive = lMCPosTrack.getProcess(); + thisInfo.processNegative = lMCNegTrack.getProcess(); + thisInfo.posP[0] = lMCPosTrack.px(); + thisInfo.posP[1] = lMCPosTrack.py(); + thisInfo.posP[2] = lMCPosTrack.pz(); + thisInfo.negP[0] = lMCNegTrack.px(); + thisInfo.negP[1] = lMCNegTrack.py(); + thisInfo.negP[2] = lMCNegTrack.pz(); + + // check for pi -> mu + antineutrino decay + // if present, de-reference original V0 correctly and provide label to original object + // NOTA BENE: the prong info will still correspond to a muon, treat carefully! + int negOriginating = -1, posOriginating = -1, particleForDecayPositionIdx = -1; + negOriginating = getOriginatingParticle(lMCNegTrack, particleForDecayPositionIdx, v0BuilderOpts.mc_treatPiToMuDecays); + posOriginating = getOriginatingParticle(lMCPosTrack, particleForDecayPositionIdx, v0BuilderOpts.mc_treatPiToMuDecays); + + if (negOriginating > -1 && negOriginating == posOriginating) { + auto originatingV0 = mcParticles.rawIteratorAt(negOriginating); + auto particleForDecayPosition = mcParticles.rawIteratorAt(particleForDecayPositionIdx); + + thisInfo.label = originatingV0.globalIndex(); + thisInfo.xyz[0] = particleForDecayPosition.vx(); + thisInfo.xyz[1] = particleForDecayPosition.vy(); + thisInfo.xyz[2] = particleForDecayPosition.vz(); + + if (originatingV0.has_mcCollision()) { + thisInfo.mcCollision = originatingV0.mcCollisionId(); // save this reference, please + } + + // acquire information + thisInfo.pdgCode = originatingV0.pdgCode(); + thisInfo.isPhysicalPrimary = originatingV0.isPhysicalPrimary(); + thisInfo.momentum[0] = originatingV0.px(); + thisInfo.momentum[1] = originatingV0.py(); + thisInfo.momentum[2] = originatingV0.pz(); + + if (originatingV0.has_mothers()) { + for (auto& lV0Mother : originatingV0.template mothers_as()) { + thisInfo.pdgCodeMother = lV0Mother.pdgCode(); + thisInfo.motherLabel = lV0Mother.globalIndex(); + } + } + } + + } // end association check + // Construct label table (note: this will be joinable with V0Datas!) + if (mEnabledTables[kMcV0Labels]) { + v0labels(thisInfo.label, thisInfo.motherLabel); + histos.fill(HIST("hTableBuildingStatistics"), kMcV0Labels); + } + + // Mark mcParticle as recoed (no searching necessary afterwards) + if (thisInfo.label > -1) { + mcParticleIsReco[thisInfo.label] = true; + } + + // ---] Symmetric populate [--- + // in this approach, V0Cores will be joinable with V0MCCores. + // this is the most pedagogical approach, but it is also more limited + // and it might use more disk space unnecessarily. + if (v0BuilderOpts.mc_populateV0MCCoresSymmetric) { + if (mEnabledTables[kV0MCCores]) { + v0mccores( + thisInfo.label, thisInfo.pdgCode, + thisInfo.pdgCodeMother, thisInfo.pdgCodePositive, thisInfo.pdgCodeNegative, + thisInfo.isPhysicalPrimary, thisInfo.xyz[0], thisInfo.xyz[1], thisInfo.xyz[2], + thisInfo.posP[0], thisInfo.posP[1], thisInfo.posP[2], + thisInfo.negP[0], thisInfo.negP[1], thisInfo.negP[2], + thisInfo.momentum[0], thisInfo.momentum[1], thisInfo.momentum[2]); + histos.fill(HIST("hTableBuildingStatistics"), kV0MCCores); + } + if (mEnabledTables[kV0MCCollRefs]) { + v0mccollref(thisInfo.mcCollision); + histos.fill(HIST("hTableBuildingStatistics"), kV0MCCollRefs); + } + + // n.b. placing the interlink index here allows for the writing of + // code that is agnostic with respect to the joinability of + // V0Cores and V0MCCores (always dereference -> safe) + if (mEnabledTables[kV0CoreMCLabels]) { + v0CoreMCLabels(v0.globalId); // interlink index + histos.fill(HIST("hTableBuildingStatistics"), kV0CoreMCLabels); + } + } + // ---] Asymmetric populate [--- + // in this approach, V0Cores will NOT be joinable with V0MCCores. + // an additional reference to V0MCCore that IS joinable with V0Cores + // will be provided to the user. + if (v0BuilderOpts.mc_populateV0MCCoresAsymmetric) { + int thisV0MCCoreIndex = -1; + // step 1: check if this element is already provided in the table + // using the packedIndices variable calculated above + for (uint32_t ii = 0; ii < mcV0infos.size(); ii++) { + if (thisInfo.label == mcV0infos[ii].label && mcV0infos[ii].label > -1) { + thisV0MCCoreIndex = ii; + break; // this exists already in list + } + } + if (thisV0MCCoreIndex < 0 && thisInfo.label > -1) { + // this V0MCCore does not exist yet. Create it and reference it + thisV0MCCoreIndex = mcV0infos.size(); + mcV0infos.push_back(thisInfo); + } + if (mEnabledTables[kV0CoreMCLabels]) { + v0CoreMCLabels(thisV0MCCoreIndex); // interlink index + histos.fill(HIST("hTableBuildingStatistics"), kV0CoreMCLabels); + } + } + } // enabled tables check + } // constexpr requires check + } + } + + // finish populating V0MCCores if in asymmetric mode + if constexpr (soa::is_table) { + if (v0BuilderOpts.mc_populateV0MCCoresAsymmetric && (mEnabledTables[kV0MCCores] || mEnabledTables[kV0MCCollRefs])) { + // first step: add any un-recoed v0mmcores that were requested + for (auto& mcParticle : mcParticles) { + thisInfo.label = -1; + thisInfo.motherLabel = -1; + thisInfo.pdgCode = 0; + thisInfo.pdgCodeMother = -1; + thisInfo.pdgCodePositive = -1; + thisInfo.pdgCodeNegative = -1; + thisInfo.mcCollision = -1; + thisInfo.xyz[0] = thisInfo.xyz[1] = thisInfo.xyz[2] = 0.0f; + thisInfo.posP[0] = thisInfo.posP[1] = thisInfo.posP[2] = 0.0f; + thisInfo.negP[0] = thisInfo.negP[1] = thisInfo.negP[2] = 0.0f; + thisInfo.momentum[0] = thisInfo.momentum[1] = thisInfo.momentum[2] = 0.0f; + + if (mcParticleIsReco[mcParticle.globalIndex()] == true) + continue; // skip if already created in list + + if (TMath::Abs(mcParticle.y()) > v0BuilderOpts.mc_rapidityWindow) + continue; // skip outside midrapidity + + if ( + (v0BuilderOpts.mc_addGeneratedK0Short && mcParticle.pdgCode() == 310) || + (v0BuilderOpts.mc_addGeneratedLambda && mcParticle.pdgCode() == 3122) || + (v0BuilderOpts.mc_addGeneratedAntiLambda && mcParticle.pdgCode() == -3122) || + (v0BuilderOpts.mc_addGeneratedGamma && mcParticle.pdgCode() == 22)) { + thisInfo.pdgCode = mcParticle.pdgCode(); + thisInfo.isPhysicalPrimary = mcParticle.isPhysicalPrimary(); + thisInfo.label = mcParticle.globalIndex(); + + if (mcParticle.has_mcCollision()) { + thisInfo.mcCollision = mcParticle.mcCollisionId(); // save this reference, please + } + + // + thisInfo.momentum[0] = mcParticle.px(); + thisInfo.momentum[1] = mcParticle.py(); + thisInfo.momentum[2] = mcParticle.pz(); + + if (mcParticle.has_mothers()) { + auto const& mother = mcParticle.template mothers_first_as(); + thisInfo.pdgCodeMother = mother.pdgCode(); + thisInfo.motherLabel = mother.globalIndex(); + } + if (mcParticle.has_daughters()) { + auto const& daughters = mcParticle.template daughters_as(); + + for (auto& dau : daughters) { + if (dau.getProcess() != 4) + continue; + + if (dau.pdgCode() > 0) { + thisInfo.pdgCodePositive = dau.pdgCode(); + thisInfo.processPositive = dau.getProcess(); + thisInfo.posP[0] = dau.px(); + thisInfo.posP[1] = dau.py(); + thisInfo.posP[2] = dau.pz(); + thisInfo.xyz[0] = dau.vx(); + thisInfo.xyz[1] = dau.vy(); + thisInfo.xyz[2] = dau.vz(); + } + if (dau.pdgCode() < 0) { + thisInfo.pdgCodeNegative = dau.pdgCode(); + thisInfo.processNegative = dau.getProcess(); + thisInfo.negP[0] = dau.px(); + thisInfo.negP[1] = dau.py(); + thisInfo.negP[2] = dau.pz(); + } + } + } + + // if I got here, it means this MC particle was not recoed and is of interest. Add it please + mcV0infos.push_back(thisInfo); + } + } + + for (auto info : mcV0infos) { + if (mEnabledTables[kV0MCCores]) { + v0mccores( + info.label, info.pdgCode, + info.pdgCodeMother, info.pdgCodePositive, info.pdgCodeNegative, + info.isPhysicalPrimary, info.xyz[0], info.xyz[1], info.xyz[2], + info.posP[0], info.posP[1], info.posP[2], + info.negP[0], info.negP[1], info.negP[2], + info.momentum[0], info.momentum[1], info.momentum[2]); + histos.fill(HIST("hTableBuildingStatistics"), kV0MCCores); + } + if (mEnabledTables[kV0MCCollRefs]) { + v0mccollref(info.mcCollision); + histos.fill(HIST("hTableBuildingStatistics"), kV0MCCollRefs); + } + } + } // end V0MCCores filling in case of MC + } // end constexpr requires mcParticles + + LOGF(debug, "V0s in DF: %i, V0s built: %i, V0s built and buffered for cascades: %i.", v0s.size(), nV0s, v0sFromCascades.size()); + } + + //__________________________________________________ + template + void extractMonteCarloProperties(TTrack const& posTrack, TTrack const& negTrack, TTrack const& bachTrack, TMCParticles const& mcParticles) + { + // encapsulates acquisition of MC properties from MC + thisCascInfo.pdgCode = -1, thisCascInfo.pdgCodeMother = -1; + thisCascInfo.pdgCodePositive = -1, thisCascInfo.pdgCodeNegative = -1; + thisCascInfo.pdgCodeBachelor = -1, thisCascInfo.pdgCodeV0 = -1; + thisCascInfo.isPhysicalPrimary = false; + thisCascInfo.xyz[0] = -999.0f, thisCascInfo.xyz[1] = -999.0f, thisCascInfo.xyz[2] = -999.0f; + thisCascInfo.lxyz[0] = -999.0f, thisCascInfo.lxyz[1] = -999.0f, thisCascInfo.lxyz[2] = -999.0f; + thisCascInfo.posP[0] = -999.0f, thisCascInfo.posP[1] = -999.0f, thisCascInfo.posP[2] = -999.0f; + thisCascInfo.negP[0] = -999.0f, thisCascInfo.negP[1] = -999.0f, thisCascInfo.negP[2] = -999.0f; + thisCascInfo.bachP[0] = -999.0f, thisCascInfo.bachP[1] = -999.0f, thisCascInfo.bachP[2] = -999.0f; + thisCascInfo.momentum[0] = -999.0f, thisCascInfo.momentum[1] = -999.0f, thisCascInfo.momentum[2] = -999.0f; + thisCascInfo.label = -1, thisCascInfo.motherLabel = -1; + thisCascInfo.mcParticlePositive = -1; + thisCascInfo.mcParticleNegative = -1; + thisCascInfo.mcParticleBachelor = -1; + + // Association check + // There might be smarter ways of doing this in the future + if (negTrack.has_mcParticle() && posTrack.has_mcParticle() && bachTrack.has_mcParticle()) { + auto lMCBachTrack = bachTrack.template mcParticle_as(); + auto lMCNegTrack = negTrack.template mcParticle_as(); + auto lMCPosTrack = posTrack.template mcParticle_as(); + + thisCascInfo.mcParticlePositive = lMCPosTrack.globalIndex(); + thisCascInfo.mcParticleNegative = lMCNegTrack.globalIndex(); + thisCascInfo.mcParticleBachelor = lMCBachTrack.globalIndex(); + thisCascInfo.pdgCodePositive = lMCPosTrack.pdgCode(); + thisCascInfo.pdgCodeNegative = lMCNegTrack.pdgCode(); + thisCascInfo.pdgCodeBachelor = lMCBachTrack.pdgCode(); + thisCascInfo.posP[0] = lMCPosTrack.px(); + thisCascInfo.posP[1] = lMCPosTrack.py(); + thisCascInfo.posP[2] = lMCPosTrack.pz(); + thisCascInfo.negP[0] = lMCNegTrack.px(); + thisCascInfo.negP[1] = lMCNegTrack.py(); + thisCascInfo.negP[2] = lMCNegTrack.pz(); + thisCascInfo.bachP[0] = lMCBachTrack.px(); + thisCascInfo.bachP[1] = lMCBachTrack.py(); + thisCascInfo.bachP[2] = lMCBachTrack.pz(); + thisCascInfo.processPositive = lMCPosTrack.getProcess(); + thisCascInfo.processNegative = lMCNegTrack.getProcess(); + thisCascInfo.processBachelor = lMCBachTrack.getProcess(); + + // Step 0: treat pi -> mu + antineutrino + // if present, de-reference original V0 correctly and provide label to original object + // NOTA BENE: the prong info will still correspond to a muon, treat carefully! + int negOriginating = -1, posOriginating = -1, bachOriginating = -1; + int particleForLambdaDecayPositionIdx = -1, particleForCascadeDecayPositionIdx = -1; + negOriginating = getOriginatingParticle(lMCNegTrack, particleForLambdaDecayPositionIdx, cascadeBuilderOpts.mc_treatPiToMuDecays); + posOriginating = getOriginatingParticle(lMCPosTrack, particleForLambdaDecayPositionIdx, cascadeBuilderOpts.mc_treatPiToMuDecays); + bachOriginating = getOriginatingParticle(lMCBachTrack, particleForCascadeDecayPositionIdx, cascadeBuilderOpts.mc_treatPiToMuDecays); + + if (negOriginating > -1 && negOriginating == posOriginating) { + auto originatingV0 = mcParticles.rawIteratorAt(negOriginating); + auto particleForLambdaDecayPosition = mcParticles.rawIteratorAt(particleForLambdaDecayPositionIdx); + + thisCascInfo.label = originatingV0.globalIndex(); + thisCascInfo.lxyz[0] = particleForLambdaDecayPosition.vx(); + thisCascInfo.lxyz[1] = particleForLambdaDecayPosition.vy(); + thisCascInfo.lxyz[2] = particleForLambdaDecayPosition.vz(); + thisCascInfo.pdgCodeV0 = originatingV0.pdgCode(); + + if (originatingV0.has_mothers()) { + for (auto& lV0Mother : originatingV0.template mothers_as()) { + if (lV0Mother.globalIndex() == bachOriginating) { // found mother particle + thisCascInfo.label = lV0Mother.globalIndex(); + + if (lV0Mother.has_mcCollision()) { + thisCascInfo.mcCollision = lV0Mother.mcCollisionId(); // save this reference, please + } + + thisCascInfo.pdgCode = lV0Mother.pdgCode(); + thisCascInfo.isPhysicalPrimary = lV0Mother.isPhysicalPrimary(); + thisCascInfo.xyz[0] = originatingV0.vx(); + thisCascInfo.xyz[1] = originatingV0.vy(); + thisCascInfo.xyz[2] = originatingV0.vz(); + thisCascInfo.momentum[0] = lV0Mother.px(); + thisCascInfo.momentum[1] = lV0Mother.py(); + thisCascInfo.momentum[2] = lV0Mother.pz(); + if (lV0Mother.has_mothers()) { + for (auto& lV0GrandMother : lV0Mother.template mothers_as()) { + thisCascInfo.pdgCodeMother = lV0GrandMother.pdgCode(); + thisCascInfo.motherLabel = lV0GrandMother.globalIndex(); + } + } + } + } // end v0 mother loop + } // end has_mothers check for V0 + } // end conditional of pos/neg originating being the same + } // end association check + } + + //__________________________________________________ + template + void buildCascades(TCollisions const& collisions, TCascades const& cascades, TTracks const& tracks, TMCParticles const& mcParticles) + { + // prepare MC containers (not necessarily used) + std::vector mcCascinfos; // V0MCCore information + std::vector mcParticleIsReco; + + if constexpr (soa::is_table) { + // do this if provided with a mcParticle table as well + mcParticleIsReco.resize(mcParticles.size(), false); + } + + if (!mEnabledTables[kStoredCascCores]) { + return; // don't do if no request for cascades in place + } + int nCascades = 0; + // Loops over all cascades in the time frame + histos.fill(HIST("hInputStatistics"), kStoredCascCores, cascades.size()); + for (auto& cascade : cascades) { + // Get tracks and generate candidate + auto const& collision = collisions.rawIteratorAt(cascade.collisionId); + auto const& posTrack = tracks.rawIteratorAt(cascade.posTrackId); + auto const& negTrack = tracks.rawIteratorAt(cascade.negTrackId); + auto const& bachTrack = tracks.rawIteratorAt(cascade.bachTrackId); + if (v0Map[cascade.v0Id] < 0) { + // this V0 hasn't been stored / cached + cascdataLink(-1); + interlinks.cascadeToCascCores.push_back(-1); + continue; // didn't work out, skip + } + if (!straHelper.buildCascadeCandidate(collision, + v0sFromCascades[v0Map[cascade.v0Id]], + posTrack, + negTrack, + bachTrack, + mEnabledTables[kCascBBs], + cascadeBuilderOpts.useCascadeMomentumAtPrimVtx, + mEnabledTables[kCascCovs])) { + cascdataLink(-1); + interlinks.cascadeToCascCores.push_back(-1); + continue; // didn't work out, skip + } + nCascades++; + + // generate analysis tables as required + if (mEnabledTables[kCascIndices]) { + cascidx(cascade.globalId, + straHelper.cascade.positiveTrack, straHelper.cascade.negativeTrack, + straHelper.cascade.bachelorTrack, straHelper.cascade.collisionId); + histos.fill(HIST("hTableBuildingStatistics"), kCascIndices); + } + if (mEnabledTables[kStoredCascCores]) { + cascdata(straHelper.cascade.charge, straHelper.cascade.massXi, straHelper.cascade.massOmega, + straHelper.cascade.cascadePosition[0], straHelper.cascade.cascadePosition[1], straHelper.cascade.cascadePosition[2], + straHelper.cascade.v0Position[0], straHelper.cascade.v0Position[1], straHelper.cascade.v0Position[2], + straHelper.cascade.positiveMomentum[0], straHelper.cascade.positiveMomentum[1], straHelper.cascade.positiveMomentum[2], + straHelper.cascade.negativeMomentum[0], straHelper.cascade.negativeMomentum[1], straHelper.cascade.negativeMomentum[2], + straHelper.cascade.bachelorMomentum[0], straHelper.cascade.bachelorMomentum[1], straHelper.cascade.bachelorMomentum[2], + straHelper.cascade.cascadeMomentum[0], straHelper.cascade.cascadeMomentum[1], straHelper.cascade.cascadeMomentum[2], + straHelper.cascade.v0DaughterDCA, straHelper.cascade.cascadeDaughterDCA, + straHelper.cascade.positiveDCAxy, straHelper.cascade.negativeDCAxy, + straHelper.cascade.bachelorDCAxy, straHelper.cascade.cascadeDCAxy, straHelper.cascade.cascadeDCAz); + histos.fill(HIST("hTableBuildingStatistics"), kStoredCascCores); + + // interlink always produced if cascades generated + cascdataLink(cascdata.lastIndex()); + interlinks.cascCoreToCascades.push_back(cascade.globalId); + interlinks.cascadeToCascCores.push_back(cascdata.lastIndex()); + } + + if (mEnabledTables[kCascTrackXs]) { + cascTrackXs(straHelper.cascade.positiveTrackX, straHelper.cascade.negativeTrackX, straHelper.cascade.bachelorTrackX); + histos.fill(HIST("hTableBuildingStatistics"), kCascTrackXs); + } + if (mEnabledTables[kCascBBs]) { + cascbb(straHelper.cascade.bachBaryonCosPA, straHelper.cascade.bachBaryonDCAxyToPV); + histos.fill(HIST("hTableBuildingStatistics"), kCascBBs); + } + if (mEnabledTables[kCascCovs]) { + casccovs(straHelper.cascade.covariance); + histos.fill(HIST("hTableBuildingStatistics"), kCascCovs); + } + + //_________________________________________________________ + // MC handling part + if constexpr (soa::is_table) { + // only worry about this if someone else worried about this + if ((mEnabledTables[kCascMCCores] || mEnabledTables[kMcCascLabels] || mEnabledTables[kCascMCCollRefs])) { + extractMonteCarloProperties(posTrack, negTrack, bachTrack, mcParticles); + + // Construct label table (note: this will be joinable with CascDatas) + if (mEnabledTables[kMcCascLabels]) { + casclabels( + thisCascInfo.label, thisCascInfo.motherLabel); + histos.fill(HIST("hTableBuildingStatistics"), kMcCascLabels); + } + + // Mark mcParticle as recoed (no searching necessary afterwards) + if (thisCascInfo.label > -1) { + mcParticleIsReco[thisCascInfo.label] = true; + } + + if (cascadeBuilderOpts.mc_populateCascMCCoresSymmetric) { + if (mEnabledTables[kCascMCCores]) { + cascmccores( + thisCascInfo.pdgCode, thisCascInfo.pdgCodeMother, thisCascInfo.pdgCodeV0, thisCascInfo.isPhysicalPrimary, + thisCascInfo.pdgCodePositive, thisCascInfo.pdgCodeNegative, thisCascInfo.pdgCodeBachelor, + thisCascInfo.xyz[0], thisCascInfo.xyz[1], thisCascInfo.xyz[2], + thisCascInfo.lxyz[0], thisCascInfo.lxyz[1], thisCascInfo.lxyz[2], + thisCascInfo.posP[0], thisCascInfo.posP[1], thisCascInfo.posP[2], + thisCascInfo.negP[0], thisCascInfo.negP[1], thisCascInfo.negP[2], + thisCascInfo.bachP[0], thisCascInfo.bachP[1], thisCascInfo.bachP[2], + thisCascInfo.momentum[0], thisCascInfo.momentum[1], thisCascInfo.momentum[2]); + histos.fill(HIST("hTableBuildingStatistics"), kCascMCCores); + } + if (mEnabledTables[kCascMCCollRefs]) { + cascmccollrefs(thisCascInfo.mcCollision); + histos.fill(HIST("hTableBuildingStatistics"), kCascMCCollRefs); + } + } + + if (cascadeBuilderOpts.mc_populateCascMCCoresAsymmetric) { + int thisCascMCCoreIndex = -1; + // step 1: check if this element is already provided in the table + // using the packedIndices variable calculated above + for (uint32_t ii = 0; ii < mcCascinfos.size(); ii++) { + if (thisCascInfo.label == mcCascinfos[ii].label && mcCascinfos[ii].label > -1) { + thisCascMCCoreIndex = ii; + break; // this exists already in list + } + } + if (thisCascMCCoreIndex < 0) { + // this CascMCCore does not exist yet. Create it and reference it + thisCascMCCoreIndex = mcCascinfos.size(); + mcCascinfos.push_back(thisCascInfo); + } + if (mEnabledTables[kCascCoreMCLabels]) { + cascCoreMClabels(thisCascMCCoreIndex); // interlink: reconstructed -> MC index + histos.fill(HIST("hTableBuildingStatistics"), kCascCoreMCLabels); + } + } + + } // enabled tables check + + // if BB tags requested, generate them now + if (mEnabledTables[kMcCascBBTags]) { + bool bbTag = false; + if (bachTrack.has_mcParticle()) { + auto bachelorParticle = bachTrack.template mcParticle_as(); + if (bachelorParticle.pdgCode() == 211) { // pi+, look for antiproton in negative prong + if (negTrack.has_mcParticle()) { + auto baryonParticle = negTrack.template mcParticle_as(); + if (baryonParticle.has_mothers() && bachelorParticle.has_mothers() && baryonParticle.pdgCode() == -2212) { + for (auto& baryonMother : baryonParticle.template mothers_as()) { + for (auto& pionMother : bachelorParticle.template mothers_as()) { + if (baryonMother.globalIndex() == pionMother.globalIndex() && baryonMother.pdgCode() == -3122) { + bbTag = true; + } + } + } + } + } + } // end if-pion + if (bachelorParticle.pdgCode() == -211) { // pi-, look for proton in positive prong + if (posTrack.has_mcParticle()) { + auto baryonParticle = posTrack.template mcParticle_as(); + if (baryonParticle.has_mothers() && bachelorParticle.has_mothers() && baryonParticle.pdgCode() == 2212) { + for (auto& baryonMother : baryonParticle.template mothers_as()) { + for (auto& pionMother : bachelorParticle.template mothers_as()) { + if (baryonMother.globalIndex() == pionMother.globalIndex() && baryonMother.pdgCode() == 3122) { + bbTag = true; + } + } + } + } + } + } // end if-pion + } // end bachelor has mcparticle + // Construct label table (note: this will be joinable with CascDatas) + bbtags(bbTag); + histos.fill(HIST("hTableBuildingStatistics"), kMcCascBBTags); + } // end BB tag table enabled check + + } // constexpr requires mcParticles check + } // cascades loop + + //_________________________________________________________ + // MC handling part + if constexpr (soa::is_table) { + if ((mEnabledTables[kCascMCCores] || mEnabledTables[kMcCascLabels] || mEnabledTables[kCascMCCollRefs])) { + // now populate V0MCCores if in asymmetric mode + if (cascadeBuilderOpts.mc_populateCascMCCoresAsymmetric) { + // first step: add any un-recoed v0mmcores that were requested + for (auto& mcParticle : mcParticles) { + thisCascInfo.pdgCode = -1, thisCascInfo.pdgCodeMother = -1; + thisCascInfo.pdgCodePositive = -1, thisCascInfo.pdgCodeNegative = -1; + thisCascInfo.pdgCodeBachelor = -1, thisCascInfo.pdgCodeV0 = -1; + thisCascInfo.isPhysicalPrimary = false; + thisCascInfo.xyz[0] = 0.0f, thisCascInfo.xyz[1] = 0.0f, thisCascInfo.xyz[2] = 0.0f; + thisCascInfo.lxyz[0] = 0.0f, thisCascInfo.lxyz[1] = 0.0f, thisCascInfo.lxyz[2] = 0.0f; + thisCascInfo.posP[0] = 0.0f, thisCascInfo.posP[1] = 0.0f, thisCascInfo.posP[2] = 0.0f; + thisCascInfo.negP[0] = 0.0f, thisCascInfo.negP[1] = 0.0f, thisCascInfo.negP[2] = 0.0f; + thisCascInfo.bachP[0] = 0.0f, thisCascInfo.bachP[1] = 0.0f, thisCascInfo.bachP[2] = 0.0f; + thisCascInfo.momentum[0] = 0.0f, thisCascInfo.momentum[1] = 0.0f, thisCascInfo.momentum[2] = 0.0f; + thisCascInfo.label = -1, thisCascInfo.motherLabel = -1; + thisCascInfo.mcParticlePositive = -1; + thisCascInfo.mcParticleNegative = -1; + thisCascInfo.mcParticleBachelor = -1; + + if (mcParticleIsReco[mcParticle.globalIndex()] == true) + continue; // skip if already created in list + + if (TMath::Abs(mcParticle.y()) > cascadeBuilderOpts.mc_rapidityWindow) + continue; // skip outside midrapidity + + if ( + (cascadeBuilderOpts.mc_addGeneratedXiMinus && mcParticle.pdgCode() == 3312) || + (cascadeBuilderOpts.mc_addGeneratedXiPlus && mcParticle.pdgCode() == -3312) || + (cascadeBuilderOpts.mc_addGeneratedOmegaMinus && mcParticle.pdgCode() == 3334) || + (cascadeBuilderOpts.mc_addGeneratedOmegaPlus && mcParticle.pdgCode() == -3334)) { + thisCascInfo.pdgCode = mcParticle.pdgCode(); + thisCascInfo.isPhysicalPrimary = mcParticle.isPhysicalPrimary(); + + if (mcParticle.has_mcCollision()) { + thisCascInfo.mcCollision = mcParticle.mcCollisionId(); // save this reference, please + } + thisCascInfo.momentum[0] = mcParticle.px(); + thisCascInfo.momentum[1] = mcParticle.py(); + thisCascInfo.momentum[2] = mcParticle.pz(); + thisCascInfo.label = mcParticle.globalIndex(); + + if (mcParticle.has_daughters()) { + auto const& daughters = mcParticle.template daughters_as(); + for (auto& dau : daughters) { + if (dau.getProcess() != 4) // check whether the daughter comes from a decay + continue; + + if (TMath::Abs(dau.pdgCode()) == 211 || TMath::Abs(dau.pdgCode()) == 321) { + thisCascInfo.pdgCodeBachelor = dau.pdgCode(); + thisCascInfo.bachP[0] = dau.px(); + thisCascInfo.bachP[1] = dau.py(); + thisCascInfo.bachP[2] = dau.pz(); + thisCascInfo.xyz[0] = dau.vx(); + thisCascInfo.xyz[1] = dau.vy(); + thisCascInfo.xyz[2] = dau.vz(); + thisCascInfo.mcParticleBachelor = dau.globalIndex(); + } + if (TMath::Abs(dau.pdgCode()) == 2212) { + thisCascInfo.pdgCodeV0 = dau.pdgCode(); + + for (auto& v0Dau : dau.template daughters_as()) { + if (v0Dau.getProcess() != 4) + continue; + + if (v0Dau.pdgCode() > 0) { + thisCascInfo.pdgCodePositive = v0Dau.pdgCode(); + thisCascInfo.processPositive = v0Dau.getProcess(); + thisCascInfo.posP[0] = v0Dau.px(); + thisCascInfo.posP[1] = v0Dau.py(); + thisCascInfo.posP[2] = v0Dau.pz(); + thisCascInfo.lxyz[0] = v0Dau.vx(); + thisCascInfo.lxyz[1] = v0Dau.vy(); + thisCascInfo.lxyz[2] = v0Dau.vz(); + thisCascInfo.mcParticlePositive = v0Dau.globalIndex(); + } + if (v0Dau.pdgCode() < 0) { + thisCascInfo.pdgCodeNegative = v0Dau.pdgCode(); + thisCascInfo.processNegative = v0Dau.getProcess(); + thisCascInfo.negP[0] = v0Dau.px(); + thisCascInfo.negP[1] = v0Dau.py(); + thisCascInfo.negP[2] = v0Dau.pz(); + thisCascInfo.mcParticleNegative = v0Dau.globalIndex(); + } + } + } + } + } + + // if I got here, it means this MC particle was not recoed and is of interest. Add it please + mcCascinfos.push_back(thisCascInfo); + } + } + + for (auto thisInfoToFill : mcCascinfos) { + if (mEnabledTables[kCascMCCores]) { + cascmccores( // a lot of the info below will be compressed in case of not-recoed MC (good!) + thisInfoToFill.pdgCode, thisInfoToFill.pdgCodeMother, thisInfoToFill.pdgCodeV0, thisInfoToFill.isPhysicalPrimary, + thisInfoToFill.pdgCodePositive, thisInfoToFill.pdgCodeNegative, thisInfoToFill.pdgCodeBachelor, + thisInfoToFill.xyz[0], thisInfoToFill.xyz[1], thisInfoToFill.xyz[2], + thisInfoToFill.lxyz[0], thisInfoToFill.lxyz[1], thisInfoToFill.lxyz[2], + thisInfoToFill.posP[0], thisInfoToFill.posP[1], thisInfoToFill.posP[2], + thisInfoToFill.negP[0], thisInfoToFill.negP[1], thisInfoToFill.negP[2], + thisInfoToFill.bachP[0], thisInfoToFill.bachP[1], thisInfoToFill.bachP[2], + thisInfoToFill.momentum[0], thisInfoToFill.momentum[1], thisInfoToFill.momentum[2]); + histos.fill(HIST("hTableBuildingStatistics"), kCascMCCores); + } + if (mEnabledTables[kCascMCCollRefs]) { + cascmccollrefs(thisInfoToFill.mcCollision); + histos.fill(HIST("hTableBuildingStatistics"), kCascMCCollRefs); + } + } + } + } // enabled tables check + } // constexpr requires mcParticles check + + LOGF(debug, "Cascades in DF: %i, cascades built: %i", cascades.size(), nCascades); + } + + //__________________________________________________ + template + void buildKFCascades(TCollisions const& collisions, TCascades const& cascades, TTracks const& tracks, TMCParticles const& mcParticles) + { + if (!mEnabledTables[kStoredKFCascCores]) { + return; // don't do if no request for cascades in place + } + int nCascades = 0; + // Loops over all cascades in the time frame + histos.fill(HIST("hInputStatistics"), kStoredKFCascCores, cascades.size()); + for (auto& cascade : cascades) { + // Get tracks and generate candidate + auto const& collision = collisions.rawIteratorAt(cascade.collisionId); + auto const& posTrack = tracks.rawIteratorAt(cascade.posTrackId); + auto const& negTrack = tracks.rawIteratorAt(cascade.negTrackId); + auto const& bachTrack = tracks.rawIteratorAt(cascade.bachTrackId); + if (!straHelper.buildCascadeCandidateWithKF(collision, + posTrack, + negTrack, + bachTrack, + mEnabledTables[kCascBBs], + cascadeBuilderOpts.kfConstructMethod, + cascadeBuilderOpts.kfTuneForOmega, + cascadeBuilderOpts.kfUseV0MassConstraint, + cascadeBuilderOpts.kfUseCascadeMassConstraint, + cascadeBuilderOpts.kfDoDCAFitterPreMinimV0, + cascadeBuilderOpts.kfDoDCAFitterPreMinimCasc)) { + kfcascdataLink(-1); + interlinks.cascadeToKFCascCores.push_back(-1); + continue; // didn't work out, skip + } + nCascades++; + + // generate analysis tables as required + if (mEnabledTables[kKFCascIndices]) { + kfcascidx(cascade.globalId, + straHelper.cascade.positiveTrack, straHelper.cascade.negativeTrack, + straHelper.cascade.bachelorTrack, straHelper.cascade.collisionId); + histos.fill(HIST("hTableBuildingStatistics"), kKFCascIndices); + } + if (mEnabledTables[kStoredKFCascCores]) { + kfcascdata(straHelper.cascade.charge, straHelper.cascade.massXi, straHelper.cascade.massOmega, + straHelper.cascade.cascadePosition[0], straHelper.cascade.cascadePosition[1], straHelper.cascade.cascadePosition[2], + straHelper.cascade.v0Position[0], straHelper.cascade.v0Position[1], straHelper.cascade.v0Position[2], + straHelper.cascade.positivePosition[0], straHelper.cascade.positivePosition[1], straHelper.cascade.positivePosition[2], + straHelper.cascade.negativePosition[0], straHelper.cascade.negativePosition[1], straHelper.cascade.negativePosition[2], + straHelper.cascade.positiveMomentum[0], straHelper.cascade.positiveMomentum[1], straHelper.cascade.positiveMomentum[2], + straHelper.cascade.negativeMomentum[0], straHelper.cascade.negativeMomentum[1], straHelper.cascade.negativeMomentum[2], + straHelper.cascade.bachelorMomentum[0], straHelper.cascade.bachelorMomentum[1], straHelper.cascade.bachelorMomentum[2], + straHelper.cascade.v0Momentum[0], straHelper.cascade.v0Momentum[1], straHelper.cascade.v0Momentum[2], + straHelper.cascade.cascadeMomentum[0], straHelper.cascade.cascadeMomentum[1], straHelper.cascade.cascadeMomentum[2], + straHelper.cascade.v0DaughterDCA, straHelper.cascade.cascadeDaughterDCA, + straHelper.cascade.positiveDCAxy, straHelper.cascade.negativeDCAxy, + straHelper.cascade.bachelorDCAxy, straHelper.cascade.cascadeDCAxy, straHelper.cascade.cascadeDCAz, + straHelper.cascade.kfMLambda, straHelper.cascade.kfV0Chi2, straHelper.cascade.kfCascadeChi2); + histos.fill(HIST("hTableBuildingStatistics"), kStoredKFCascCores); + + // interlink always produced if cascades generated + kfcascdataLink(kfcascdata.lastIndex()); + interlinks.kfCascCoreToCascades.push_back(cascade.globalId); + interlinks.cascadeToKFCascCores.push_back(kfcascdata.lastIndex()); + } + if (mEnabledTables[kKFCascCovs]) { + kfcasccovs(straHelper.cascade.covariance, straHelper.cascade.kfTrackCovarianceV0, straHelper.cascade.kfTrackCovariancePos, straHelper.cascade.kfTrackCovarianceNeg); + histos.fill(HIST("hTableBuildingStatistics"), kKFCascCovs); + } + + //_________________________________________________________ + // MC handling part (labels only) + if constexpr (soa::is_table) { + // only worry about this if someone else worried about this + if ((mEnabledTables[kMcKFCascLabels])) { + extractMonteCarloProperties(posTrack, negTrack, bachTrack, mcParticles); + + // Construct label table (note: this will be joinable with KFCascDatas) + kfcasclabels(thisCascInfo.label); + histos.fill(HIST("hTableBuildingStatistics"), kMcKFCascLabels); + } // enabled tables check + } // constexpr requires mcParticles check + } // end loop over cascades + + LOGF(debug, "KF Cascades in DF: %i, KF cascades built: %i", cascades.size(), nCascades); + } + + //__________________________________________________ + template + void buildTrackedCascades(TStrangeTracks const& cascadeTracks, TMCParticles const& mcParticles) + { + if (!mEnabledTables[kStoredTraCascCores] || mc_findableMode.value != 0) { + return; // don't do if no request for cascades in place or findable mode used + } + int nCascades = 0; + // Loops over all V0s in the time frame + histos.fill(HIST("hInputStatistics"), kStoredTraCascCores, cascadeTracks.size()); + for (auto& cascadeTrack : cascadeTracks) { + // Get tracks and generate candidate + if (!cascadeTrack.has_track()) + continue; // safety (should be fine but depends on future stratrack dev) + + auto const& strangeTrack = cascadeTrack.template track_as(); + auto const& collision = strangeTrack.collision(); + auto const& cascade = cascadeTrack.cascade(); + auto const& v0 = cascade.v0(); + auto const& posTrack = v0.template posTrack_as(); + auto const& negTrack = v0.template negTrack_as(); + auto const& bachTrack = cascade.template bachelor_as(); + if (!straHelper.buildCascadeCandidate(collision, + posTrack, + negTrack, + bachTrack, + mEnabledTables[kCascBBs], + cascadeBuilderOpts.useCascadeMomentumAtPrimVtx, + mEnabledTables[kCascCovs])) { + tracascdataLink(-1); + interlinks.cascadeToTraCascCores.push_back(-1); + continue; // didn't work out, skip + } + + // recalculate DCAxy, DCAz with strange track + auto strangeTrackParCov = getTrackParCov(strangeTrack); + gpu::gpustd::array dcaInfo; + strangeTrackParCov.setPID(o2::track::PID::XiMinus); // FIXME: not OK for omegas + o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, strangeTrackParCov, 2.f, straHelper.fitter.getMatCorrType(), &dcaInfo); + straHelper.cascade.cascadeDCAxy = dcaInfo[0]; + straHelper.cascade.cascadeDCAz = dcaInfo[1]; + + // get momentum from strange track (should not be very different) + strangeTrackParCov.getPxPyPzGlo(straHelper.cascade.cascadeMomentum); + + // accounting + nCascades++; + + // generate analysis tables as required + if (mEnabledTables[kTraCascIndices]) { + tracascidx(cascade.globalIndex(), + straHelper.cascade.positiveTrack, straHelper.cascade.negativeTrack, + straHelper.cascade.bachelorTrack, cascadeTrack.trackId(), straHelper.cascade.collisionId); + histos.fill(HIST("hTableBuildingStatistics"), kTraCascIndices); + } + if (mEnabledTables[kStoredTraCascCores]) { + tracascdata(straHelper.cascade.charge, cascadeTrack.xiMass(), cascadeTrack.omegaMass(), + cascadeTrack.decayX(), cascadeTrack.decayY(), cascadeTrack.decayZ(), + straHelper.cascade.v0Position[0], straHelper.cascade.v0Position[1], straHelper.cascade.v0Position[2], + straHelper.cascade.positiveMomentum[0], straHelper.cascade.positiveMomentum[1], straHelper.cascade.positiveMomentum[2], + straHelper.cascade.negativeMomentum[0], straHelper.cascade.negativeMomentum[1], straHelper.cascade.negativeMomentum[2], + straHelper.cascade.bachelorMomentum[0], straHelper.cascade.bachelorMomentum[1], straHelper.cascade.bachelorMomentum[2], + straHelper.cascade.cascadeMomentum[0], straHelper.cascade.cascadeMomentum[1], straHelper.cascade.cascadeMomentum[2], + straHelper.cascade.v0DaughterDCA, straHelper.cascade.cascadeDaughterDCA, + straHelper.cascade.positiveDCAxy, straHelper.cascade.negativeDCAxy, + straHelper.cascade.bachelorDCAxy, straHelper.cascade.cascadeDCAxy, straHelper.cascade.cascadeDCAz, + cascadeTrack.matchingChi2(), cascadeTrack.topologyChi2(), cascadeTrack.itsClsSize()); + histos.fill(HIST("hTableBuildingStatistics"), kStoredTraCascCores); + + // interlink always produced if base core table generated + tracascdataLink(tracascdata.lastIndex()); + interlinks.traCascCoreToCascades.push_back(cascade.globalIndex()); + interlinks.cascadeToTraCascCores.push_back(tracascdata.lastIndex()); + } + if (mEnabledTables[kCascCovs]) { + std::array traCovMat = {0.}; + strangeTrackParCov.getCovXYZPxPyPzGlo(traCovMat); + float traCovMatArray[21]; + for (int ii = 0; ii < 21; ii++) { + traCovMatArray[ii] = traCovMat[ii]; + } + tracasccovs(traCovMatArray); + histos.fill(HIST("hTableBuildingStatistics"), kCascCovs); + } + + //_________________________________________________________ + // MC handling part (labels only) + if constexpr (soa::is_table) { + // only worry about this if someone else worried about this + if ((mEnabledTables[kMcTraCascLabels])) { + extractMonteCarloProperties(posTrack, negTrack, bachTrack, mcParticles); + + // Construct label table (note: this will be joinable with KFCascDatas) + tracasclabels(thisCascInfo.label); + histos.fill(HIST("hTableBuildingStatistics"), kMcTraCascLabels); + } // enabled tables check + } // constexpr requires mcParticles check + } // end loop over cascades + LOGF(debug, "Tracked cascades in DF: %i, tracked cascades built: %i", cascadeTracks.size(), nCascades); + } + + //__________________________________________________ + // MC kink handling + template + int getOriginatingParticle(mcpart const& part, int& indexForPositionOfDecay, bool treatPiToMuDecays) + { + int returnValue = -1; + if (part.has_mothers()) { + auto const& motherList = part.template mothers_as(); + if (motherList.size() == 1) { + for (const auto& mother : motherList) { + if (std::abs(part.pdgCode()) == 13 && treatPiToMuDecays) { + // muon decay, de-ref mother twice + if (mother.has_mothers()) { + auto grandMotherList = mother.template mothers_as(); + if (grandMotherList.size() == 1) { + for (const auto& grandMother : grandMotherList) { + returnValue = grandMother.globalIndex(); + indexForPositionOfDecay = mother.globalIndex(); // for V0 decay position: grab muon + } + } + } + } else { + returnValue = mother.globalIndex(); + indexForPositionOfDecay = part.globalIndex(); + } + } + } + } + return returnValue; + } + + //__________________________________________________ + template + void dataProcess(TCollisions const& collisions, TMCCollisions const& mccollisions, TV0s const& v0s, TCascades const& cascades, TTrackedCascades const& trackedCascades, TTracks const& tracks, TBCs const& bcs, TMCParticles const& mcParticles) + { + if (!initCCDB(bcs, collisions)) + return; + + // reset vectors for cascade interlinks + resetInterlinks(); + + // prepare v0List, cascadeList + prepareBuildingLists(collisions, mccollisions, v0s, cascades, tracks, mcParticles); + + // mark V0s that will be buffered for the cascade building + markV0sUsedInCascades(v0List, cascadeList, trackedCascades); + + // build V0s + buildV0s(collisions, v0List, tracks, mcParticles); + + // build cascades + buildCascades(collisions, cascadeList, tracks, mcParticles); + buildKFCascades(collisions, cascadeList, tracks, mcParticles); + + // build tracked cascades only if subscription is Run 3 like (doesn't exist in Run 2) + if constexpr (soa::is_table) { + buildTrackedCascades(trackedCascades, mcParticles); + } + + populateCascadeInterlinks(); + } + + void processRealData(aod::Collisions const& collisions, aod::V0s const& v0s, aod::Cascades const& cascades, aod::TrackedCascades const& trackedCascades, FullTracksExtIU const& tracks, aod::BCsWithTimestamps const& bcs) + { + dataProcess(collisions, (TObject*)nullptr, v0s, cascades, trackedCascades, tracks, bcs, (TObject*)nullptr); + } + + void processRealDataRun2(aod::Collisions const& collisions, aod::V0s const& v0s, aod::Cascades const& cascades, FullTracksExt const& tracks, aod::BCsWithTimestamps const& bcs) + { + dataProcess(collisions, (TObject*)nullptr, v0s, cascades, (TObject*)nullptr, tracks, bcs, (TObject*)nullptr); + } + + void processMonteCarlo(soa::Join const& collisions, aod::McCollisions const& mccollisions, aod::V0s const& v0s, aod::Cascades const& cascades, aod::TrackedCascades const& trackedCascades, FullTracksExtLabeledIU const& tracks, aod::BCsWithTimestamps const& bcs, aod::McParticles const& mcParticles) + { + dataProcess(collisions, mccollisions, v0s, cascades, trackedCascades, tracks, bcs, mcParticles); + } + + void processMonteCarloRun2(soa::Join const& collisions, aod::McCollisions const& mccollisions, aod::V0s const& v0s, aod::Cascades const& cascades, FullTracksExtLabeled const& tracks, aod::BCsWithTimestamps const& bcs, aod::McParticles const& mcParticles) + { + dataProcess(collisions, mccollisions, v0s, cascades, (TObject*)nullptr, tracks, bcs, mcParticles); + } + + PROCESS_SWITCH(StrangenessBuilder, processRealData, "process real data", true); + PROCESS_SWITCH(StrangenessBuilder, processRealDataRun2, "process real data (Run 2)", false); + PROCESS_SWITCH(StrangenessBuilder, processMonteCarlo, "process monte carlo", false); + PROCESS_SWITCH(StrangenessBuilder, processMonteCarloRun2, "process monte carlo (Run 2)", false); +}; + +// Extends the v0data table with expression columns +struct strangenessbuilderInitializer { + Spawns v0cores; + Spawns cascdataext; + Spawns kfcascdataext; + Spawns tracascdataext; + void init(InitContext const&) {} +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc)}; +} diff --git a/PWGLF/Utils/strangenessBuilderHelper.h b/PWGLF/Utils/strangenessBuilderHelper.h index b85ab2280f5..a2582daa9fa 100644 --- a/PWGLF/Utils/strangenessBuilderHelper.h +++ b/PWGLF/Utils/strangenessBuilderHelper.h @@ -161,8 +161,8 @@ class strangenessBuilderHelper fitter.setBz(-999.9f); // will NOT make sense if not changed }; - template - bool buildV0Candidate(o2::aod::Collision const& collision, + template + bool buildV0Candidate(TCollision const& collision, TTrack const& positiveTrack, TTrack const& negativeTrack, bool useCollinearFit = false, @@ -304,8 +304,8 @@ class strangenessBuilderHelper } // cascade builder creating a cascade from plain tracks - template - bool buildCascadeCandidate(o2::aod::Collision const& collision, + template + bool buildCascadeCandidate(TCollision const& collision, TTrack const& positiveTrack, TTrack const& negativeTrack, TTrack const& bachelorTrack, @@ -325,8 +325,8 @@ class strangenessBuilderHelper // cascade builder using pre-fabricated information, thus not calling // the DCAfitter again for the V0 contained in the cascade // if generating from scratch, prefer the other variant - template - bool buildCascadeCandidate(o2::aod::Collision const& collision, + template + bool buildCascadeCandidate(TCollision const& collision, v0candidate const& v0input, TTrack const& positiveTrack, TTrack const& negativeTrack, @@ -530,8 +530,8 @@ class strangenessBuilderHelper return true; } - template - bool buildCascadeCandidateWithKF(o2::aod::Collision const& collision, + template + bool buildCascadeCandidateWithKF(TCollision const& collision, TTrack const& positiveTrack, TTrack const& negativeTrack, TTrack const& bachelorTrack, From 1a69a1771e1d96e6ee4552dbab71fa859002273e Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Mon, 17 Feb 2025 21:08:04 +0100 Subject: [PATCH 0275/1650] [Common] Fix fake tag check (#10023) --- Common/Tasks/flowTest.cxx | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Common/Tasks/flowTest.cxx b/Common/Tasks/flowTest.cxx index 04e404d4f33..bb27c0cc504 100644 --- a/Common/Tasks/flowTest.cxx +++ b/Common/Tasks/flowTest.cxx @@ -145,11 +145,8 @@ struct flowTest { auto const& tracks = mcParticle.tracks_as(); for (auto const& track : tracks) { bool isITSFake = false; - - for (int bit = 0; bit < 7; bit++) { - if (bitcheck(track.mcMask(), bit)) { - isITSFake = true; - } + if (bitcheck(track.mcMask(), 13)) { // should perhaps be done better at some point + isITSFake = true; } if (track.tpcNClsFound() >= analysisMinimumTPCClusters && track.itsNCls() >= analysisMinimumITSClusters) { From 9624ee34a27b87de1b93c30b93ff1f650629db2c Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Tue, 18 Feb 2025 04:17:30 +0800 Subject: [PATCH 0276/1650] [PWGCF] fix flowptefficiency and flowrunbyrun (#9993) --- PWGCF/Flow/Tasks/flowMc.cxx | 25 ++-- PWGCF/Flow/Tasks/flowPtEfficiency.cxx | 39 ++++--- PWGCF/Flow/Tasks/flowRunbyRun.cxx | 159 ++++++++++++++++++++++---- 3 files changed, 175 insertions(+), 48 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowMc.cxx b/PWGCF/Flow/Tasks/flowMc.cxx index ab3eee0daab..79c9c6e2c3f 100644 --- a/PWGCF/Flow/Tasks/flowMc.cxx +++ b/PWGCF/Flow/Tasks/flowMc.cxx @@ -35,6 +35,7 @@ #include "GFW.h" #include "GFWCumulant.h" #include "GFWWeights.h" +#include using namespace o2; using namespace o2::framework; @@ -98,6 +99,7 @@ struct FlowMc { histos.add("hPhi", "#phi distribution", HistType::kTH1D, {axisPhi}); histos.add("hPhiWeighted", "corrected #phi distribution", HistType::kTH1D, {axisPhi}); + histos.add("hEPVsPhi", "hEPVsPhi;Event Plane Angle; #varphi", HistType::kTH2D, {axisPhi, axisPhi}); if (cfgOutputNUAWeights) { o2::framework::AxisSpec axis = axisPt; @@ -172,7 +174,7 @@ struct FlowMc { for (auto const& mcParticle : mcParticles) { // focus on bulk: e, mu, pi, k, p int pdgCode = std::abs(mcParticle.pdgCode()); - if (pdgCode != 11 && pdgCode != 13 && pdgCode != 211 && pdgCode != 321 && pdgCode != 2212) + if (pdgCode != PDG_t::kElectron && pdgCode != PDG_t::kMuonMinus && pdgCode != PDG_t::kPiPlus && pdgCode != kKPlus && pdgCode != PDG_t::kProton) continue; if (!mcParticle.isPhysicalPrimary()) @@ -224,6 +226,7 @@ struct FlowMc { if (withinPtRef) { histos.fill(HIST("hPhi"), mcParticle.phi()); histos.fill(HIST("hPhiWeighted"), mcParticle.phi(), wacc); + histos.fill(HIST("hEPVsPhi"), evPhi, mcParticle.phi()); } // if valid global, fill @@ -253,7 +256,7 @@ struct FlowMc { float imp = mcCollision.impactParameter(); int pdgCode = std::abs(mcParticle.pdgCode()); - if (pdgCode != 3312 && pdgCode != 3334) + if (pdgCode != PDG_t::kXiMinus && pdgCode != PDG_t::kOmegaMinus) return; if (!mcParticle.isPhysicalPrimary()) @@ -266,15 +269,15 @@ struct FlowMc { deltaPhi += constants::math::TwoPI; if (deltaPhi > constants::math::TwoPI) deltaPhi -= constants::math::TwoPI; - if (pdgCode == 3312) + if (pdgCode == PDG_t::kXiMinus) histos.fill(HIST("hBVsPtVsPhiGeneratedXi"), imp, deltaPhi, mcParticle.pt()); - if (pdgCode == 3334) + if (pdgCode == PDG_t::kOmegaMinus) histos.fill(HIST("hBVsPtVsPhiGeneratedOmega"), imp, deltaPhi, mcParticle.pt()); if (cascades.size() > 0) { - if (pdgCode == 3312) + if (pdgCode == PDG_t::kXiMinus) histos.fill(HIST("hBVsPtVsPhiGlobalXi"), imp, deltaPhi, mcParticle.pt()); - if (pdgCode == 3334) + if (pdgCode == PDG_t::kOmegaMinus) histos.fill(HIST("hBVsPtVsPhiGlobalOmega"), imp, deltaPhi, mcParticle.pt()); } } @@ -288,7 +291,7 @@ struct FlowMc { float imp = mcCollision.impactParameter(); int pdgCode = std::abs(mcParticle.pdgCode()); - if (pdgCode != 310 && pdgCode != 3122) + if (pdgCode != PDG_t::kK0Short && pdgCode != PDG_t::kLambda0) return; if (!mcParticle.isPhysicalPrimary()) @@ -301,15 +304,15 @@ struct FlowMc { deltaPhi += constants::math::TwoPI; if (deltaPhi > constants::math::TwoPI) deltaPhi -= constants::math::TwoPI; - if (pdgCode == 310) + if (pdgCode == PDG_t::kK0Short) histos.fill(HIST("hBVsPtVsPhiGeneratedK0Short"), imp, deltaPhi, mcParticle.pt()); - if (pdgCode == 3122) + if (pdgCode == PDG_t::kLambda0) histos.fill(HIST("hBVsPtVsPhiGeneratedLambda"), imp, deltaPhi, mcParticle.pt()); if (v0s.size() > 0) { - if (pdgCode == 310) + if (pdgCode == PDG_t::kK0Short) histos.fill(HIST("hBVsPtVsPhiGlobalK0Short"), imp, deltaPhi, mcParticle.pt()); - if (pdgCode == 3122) + if (pdgCode == PDG_t::kLambda0) histos.fill(HIST("hBVsPtVsPhiGlobalLambda"), imp, deltaPhi, mcParticle.pt()); } } diff --git a/PWGCF/Flow/Tasks/flowPtEfficiency.cxx b/PWGCF/Flow/Tasks/flowPtEfficiency.cxx index 27fc0f3a047..92256cb3517 100644 --- a/PWGCF/Flow/Tasks/flowPtEfficiency.cxx +++ b/PWGCF/Flow/Tasks/flowPtEfficiency.cxx @@ -35,6 +35,7 @@ #include "FlowContainer.h" #include #include +#include using namespace o2; using namespace o2::framework; @@ -119,20 +120,21 @@ struct FlowPtEfficiency { GFW* fGFWTrue = new GFW(); GFW* fGFWReco = new GFW(); TAxis* fPtAxis; - std::vector corrconfigs; + std::vector corrconfigsTruth; + std::vector corrconfigsReco; TRandom3* fRndm = new TRandom3(0); bool isStable(int pdg) { - if (std::abs(pdg) == 211) + if (std::abs(pdg) == PDG_t::kPiPlus) return true; - if (std::abs(pdg) == 321) + if (std::abs(pdg) == PDG_t::kKPlus) return true; - if (std::abs(pdg) == 2212) + if (std::abs(pdg) == PDG_t::kProton) return true; - if (std::abs(pdg) == 11) + if (std::abs(pdg) == PDG_t::kElectron) return true; - if (std::abs(pdg) == 13) + if (std::abs(pdg) == PDG_t::kMuonMinus) return true; return false; } @@ -143,9 +145,11 @@ struct FlowPtEfficiency { // create histograms registry.add("eventCounter", "eventCounter", kTH1F, {axisCounter}); registry.add("hPtMCRec", "Monte Carlo Reco", {HistType::kTH1D, {axisPt}}); + registry.add("hPtCentMCRec", "Reco production; pT (GeV/c); centrality (%)", {HistType::kTH2D, {axisPt, axisCentrality}}); registry.add("mcEventCounter", "Monte Carlo Truth EventCounter", kTH1F, {axisCounter}); registry.add("hPtMCGen", "Monte Carlo Truth", {HistType::kTH1D, {axisPt}}); + registry.add("hPtCentMCGen", "Truth production; pT (GeV/c); centrality (%)", {HistType::kTH2D, {axisPt, axisCentrality}}); if (cfgFlowEnabled) { registry.add("hImpactParameterReco", "hImpactParameterReco", {HistType::kTH1D, {axisB}}); @@ -183,10 +187,10 @@ struct FlowPtEfficiency { fGFWTrue->AddRegion("poifull", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 2); fGFWTrue->AddRegion("olN10", -0.8, -0.5, 1, 4); fGFWTrue->AddRegion("olfull", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 4); - corrconfigs.push_back(fGFWTrue->GetCorrelatorConfig("full {2 -2}", "ChFull22", kFALSE)); - corrconfigs.push_back(fGFWTrue->GetCorrelatorConfig("poifull full | olfull {2 -2}", "ChFull22", kTRUE)); - corrconfigs.push_back(fGFWTrue->GetCorrelatorConfig("refN10 {2} refP10 {-2}", "Ch10Gap22", kFALSE)); - corrconfigs.push_back(fGFWTrue->GetCorrelatorConfig("poiN10 refN10 | olN10 {2} refP10 {-2}", "Ch10Gap22", kTRUE)); + corrconfigsTruth.push_back(fGFWTrue->GetCorrelatorConfig("full {2 -2}", "ChFull22", kFALSE)); + corrconfigsTruth.push_back(fGFWTrue->GetCorrelatorConfig("poifull full | olfull {2 -2}", "ChFull22", kTRUE)); + corrconfigsTruth.push_back(fGFWTrue->GetCorrelatorConfig("refN10 {2} refP10 {-2}", "Ch10Gap22", kFALSE)); + corrconfigsTruth.push_back(fGFWTrue->GetCorrelatorConfig("poiN10 refN10 | olN10 {2} refP10 {-2}", "Ch10Gap22", kTRUE)); fGFWTrue->CreateRegions(); fGFWReco->AddRegion("full", -0.8, 0.8, 1, 1); @@ -196,6 +200,10 @@ struct FlowPtEfficiency { fGFWReco->AddRegion("poifull", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 2); fGFWReco->AddRegion("olN10", -0.8, -0.5, 1, 4); fGFWReco->AddRegion("olfull", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 4); + corrconfigsReco.push_back(fGFWReco->GetCorrelatorConfig("full {2 -2}", "ChFull22", kFALSE)); + corrconfigsReco.push_back(fGFWReco->GetCorrelatorConfig("poifull full | olfull {2 -2}", "ChFull22", kTRUE)); + corrconfigsReco.push_back(fGFWReco->GetCorrelatorConfig("refN10 {2} refP10 {-2}", "Ch10Gap22", kFALSE)); + corrconfigsReco.push_back(fGFWReco->GetCorrelatorConfig("poiN10 refN10 | olN10 {2} refP10 {-2}", "Ch10Gap22", kTRUE)); fGFWReco->CreateRegions(); } @@ -385,6 +393,7 @@ struct FlowPtEfficiency { } if (isStable(mcParticle.pdgCode())) { registry.fill(HIST("hPtMCRec"), track.pt()); + registry.fill(HIST("hPtCentMCRec"), track.pt(), centrality); if (cfgFlowEnabled) { bool withinPtPOI = (cfgFlowCutPtPOIMin < track.pt()) && (track.pt() < cfgFlowCutPtPOIMax); // within POI pT range @@ -409,8 +418,8 @@ struct FlowPtEfficiency { } if (cfgFlowEnabled) { // Filling Flow Container - for (uint l_ind = 0; l_ind < corrconfigs.size(); l_ind++) { - fillFC(fGFWReco, false, corrconfigs.at(l_ind), centrality, lRandom); + for (uint l_ind = 0; l_ind < corrconfigsReco.size(); l_ind++) { + fillFC(fGFWReco, false, corrconfigsReco.at(l_ind), centrality, lRandom); } } } @@ -442,6 +451,8 @@ struct FlowPtEfficiency { for (const auto& mcParticle : mcParticles) { if (mcParticle.isPhysicalPrimary() && isStable(mcParticle.pdgCode())) { registry.fill(HIST("hPtMCGen"), mcParticle.pt()); + registry.fill(HIST("hPtCentMCGen"), mcParticle.pt(), centrality); + if (cfgFlowEnabled) { bool withinPtPOI = (cfgFlowCutPtPOIMin < mcParticle.pt()) && (mcParticle.pt() < cfgFlowCutPtPOIMax); // within POI pT range bool withinPtRef = (cfgFlowCutPtRefMin < mcParticle.pt()) && (mcParticle.pt() < cfgFlowCutPtRefMax); // within RF pT range @@ -456,8 +467,8 @@ struct FlowPtEfficiency { } if (cfgFlowEnabled) { // Filling Flow Container - for (uint l_ind = 0; l_ind < corrconfigs.size(); l_ind++) { - fillFC(fGFWTrue, true, corrconfigs.at(l_ind), centrality, lRandom); + for (uint l_ind = 0; l_ind < corrconfigsTruth.size(); l_ind++) { + fillFC(fGFWTrue, true, corrconfigsTruth.at(l_ind), centrality, lRandom); } } } diff --git a/PWGCF/Flow/Tasks/flowRunbyRun.cxx b/PWGCF/Flow/Tasks/flowRunbyRun.cxx index d78a279f06e..d9a80549077 100644 --- a/PWGCF/Flow/Tasks/flowRunbyRun.cxx +++ b/PWGCF/Flow/Tasks/flowRunbyRun.cxx @@ -40,11 +40,11 @@ #include "GFW.h" #include "GFWCumulant.h" #include "GFWWeights.h" -#include "GFWWeightsList.h" #include "FlowContainer.h" #include "TList.h" #include #include +#include using namespace o2; using namespace o2::framework; @@ -63,7 +63,22 @@ struct FlowRunbyRun { O2_DEFINE_CONFIGURABLE(cfgCutPtMax, float, 10.0f, "Maximal pT for all tracks") O2_DEFINE_CONFIGURABLE(cfgCutEta, float, 0.8f, "Eta range for tracks") O2_DEFINE_CONFIGURABLE(cfgCutChi2prTPCcls, float, 2.5, "Chi2 per TPC clusters") + O2_DEFINE_CONFIGURABLE(cfgCutTPCclu, float, 70.0f, "minimum TPC clusters") + O2_DEFINE_CONFIGURABLE(cfgCutITSclu, float, 5.0f, "minimum ITS clusters") O2_DEFINE_CONFIGURABLE(cfgCutDCAz, float, 2.0f, "max DCA to vertex z") + O2_DEFINE_CONFIGURABLE(cfgCutDCAzPtDepEnabled, bool, false, "switch of DCAz pt dependent cut") + O2_DEFINE_CONFIGURABLE(cfgUseAdditionalEventCut, bool, false, "Use additional event cut on mult correlations") + O2_DEFINE_CONFIGURABLE(cfgEvSelkNoSameBunchPileup, bool, false, "rejects collisions which are associated with the same found-by-T0 bunch crossing") + O2_DEFINE_CONFIGURABLE(cfgEvSelkIsGoodZvtxFT0vsPV, bool, false, "removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference, use this cut at low multiplicities with caution") + O2_DEFINE_CONFIGURABLE(cfgEvSelkNoCollInTimeRangeStandard, bool, false, "no collisions in specified time range") + O2_DEFINE_CONFIGURABLE(cfgEvSelkIsGoodITSLayersAll, bool, true, "cut time intervals with dead ITS staves") + O2_DEFINE_CONFIGURABLE(cfgEvSelkNoCollInRofStandard, bool, false, "no other collisions in this Readout Frame with per-collision multiplicity above threshold") + O2_DEFINE_CONFIGURABLE(cfgEvSelkNoHighMultCollInPrevRof, bool, false, "veto an event if FT0C amplitude in previous ITS ROF is above threshold") + O2_DEFINE_CONFIGURABLE(cfgEvSelMultCorrelation, bool, true, "Multiplicity correlation cut") + O2_DEFINE_CONFIGURABLE(cfgEvSelV0AT0ACut, bool, true, "V0A T0A 5 sigma cut") + O2_DEFINE_CONFIGURABLE(cfgEvSelOccupancy, bool, true, "Occupancy cut") + O2_DEFINE_CONFIGURABLE(cfgCutOccupancyHigh, int, 500, "High cut on TPC occupancy") + O2_DEFINE_CONFIGURABLE(cfgCutOccupancyLow, int, 0, "Low cut on TPC occupancy") O2_DEFINE_CONFIGURABLE(cfgUseNch, bool, false, "Use Nch for flow observables") O2_DEFINE_CONFIGURABLE(cfgNbootstrap, int, 30, "Number of subsamples") O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeights, bool, false, "NUA weights are filled in ref pt bins") @@ -93,7 +108,6 @@ struct FlowRunbyRun { // Define output OutputObj fFC{FlowContainer("FlowContainer")}; - OutputObj fGFWWeightsList{GFWWeightsList("GFWWeightsList")}; HistogramRegistry registry{"registry"}; // define global variables @@ -105,6 +119,7 @@ struct FlowRunbyRun { int lastRunNumer = -1; std::vector runNumbers; // vector of run numbers std::map>> th1sList; // map of histograms for all runs + std::map>> th3sList; // map of TH3 histograms for all runs std::map>> profilesList; // map of profiles for all runs enum OutputTH1Names { // here are TProfiles for vn-pt correlations that are not implemented in GFW @@ -115,9 +130,16 @@ struct FlowRunbyRun { hCent, kCount_TH1Names }; + enum OutputTH3Names { + hPhiEtaVtxz = 0, + kCount_TH3Names + }; enum OutputTProfileNames { c22 = 0, c22_gap10, + c32, + c32_gap10, + c3232, kCount_TProfileNames }; int mRunNumber{-1}; @@ -127,6 +149,15 @@ struct FlowRunbyRun { ctpRateFetcher mRateFetcher; TH2* gCurrentHadronicRate; + // Additional Event selection cuts - Copy from flowGenericFramework.cxx + TF1* fMultPVCutLow = nullptr; + TF1* fMultPVCutHigh = nullptr; + TF1* fMultCutLow = nullptr; + TF1* fMultCutHigh = nullptr; + TF1* fMultMultPVCut = nullptr; + TF1* fT0AV0AMean = nullptr; + TF1* fT0AV0ASigma = nullptr; + using AodCollisions = soa::Filtered>; using AodTracks = soa::Filtered>; @@ -136,8 +167,6 @@ struct FlowRunbyRun { ccdb->setCaching(true); ccdb->setCreatedNotAfter(ccdbNoLaterThan.value); - fGFWWeightsList->init("weightList"); - // Add output histograms to the registry runNumbers = cfgRunNumbers; for (const auto& runNumber : runNumbers) { @@ -169,6 +198,9 @@ struct FlowRunbyRun { corrconfigs.resize(kCount_TProfileNames); corrconfigs[c22] = fGFW->GetCorrelatorConfig("full {2 -2}", "ChFull22", kFALSE); corrconfigs[c22_gap10] = fGFW->GetCorrelatorConfig("refN10 {2} refP10 {-2}", "Ch10Gap22", kFALSE); + corrconfigs[c32] = fGFW->GetCorrelatorConfig("full {3 -3}", "ChFull32", kFALSE); + corrconfigs[c32_gap10] = fGFW->GetCorrelatorConfig("refN10 {3} refP10 {-3}", "Ch10Gap32", kFALSE); + corrconfigs[c3232] = fGFW->GetCorrelatorConfig("full {3 2 -3 -2}", "ChFull3232", kFALSE); if (!userDefineGFWCorr.empty() && !userDefineGFWName.empty()) { LOGF(info, "User adding GFW CorrelatorConfig:"); // attentaion: here we follow the index of cfgUserDefineGFWCorr @@ -182,6 +214,23 @@ struct FlowRunbyRun { } } fGFW->CreateRegions(); + + if (cfgUseAdditionalEventCut) { + fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x - 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); + fMultPVCutLow->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); + fMultPVCutHigh = new TF1("fMultPVCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x + 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); + fMultPVCutHigh->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); + + fMultCutLow = new TF1("fMultCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x - 2.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); + fMultCutLow->SetParameters(1654.46, -47.2379, 0.449833, -0.0014125, 150.773, -3.67334, 0.0530503, -0.000614061, 3.15956e-06); + fMultCutHigh = new TF1("fMultCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x + 3.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); + fMultCutHigh->SetParameters(1654.46, -47.2379, 0.449833, -0.0014125, 150.773, -3.67334, 0.0530503, -0.000614061, 3.15956e-06); + + fT0AV0AMean = new TF1("fT0AV0AMean", "[0]+[1]*x", 0, 200000); + fT0AV0AMean->SetParameters(-1601.0581, 9.417652e-01); + fT0AV0ASigma = new TF1("fT0AV0ASigma", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 200000); + fT0AV0ASigma->SetParameters(463.4144, 6.796509e-02, -9.097136e-07, 7.971088e-12, -2.600581e-17); + } } template @@ -236,14 +285,15 @@ struct FlowRunbyRun { std::vector> profiles(kCount_TProfileNames); profiles[c22] = registry.add(Form("%d/c22", runNumber), "", {HistType::kTProfile, {axisIndependent}}); profiles[c22_gap10] = registry.add(Form("%d/c22_gap10", runNumber), "", {HistType::kTProfile, {axisIndependent}}); + profiles[c32] = registry.add(Form("%d/c32", runNumber), "", {HistType::kTProfile, {axisIndependent}}); + profiles[c32_gap10] = registry.add(Form("%d/c32_gap10", runNumber), "", {HistType::kTProfile, {axisIndependent}}); + profiles[c3232] = registry.add(Form("%d/c3232", runNumber), "", {HistType::kTProfile, {axisIndependent}}); profilesList.insert(std::make_pair(runNumber, profiles)); if (cfgOutputNUAWeights) { - // weightsList - o2::framework::AxisSpec axis = axisPt; - int nPtBins = axis.binEdges.size() - 1; - double* ptBins = &(axis.binEdges)[0]; - fGFWWeightsList->addGFWWeightsByRun(runNumber, nPtBins, ptBins, true, false); + std::vector> tH3s(kCount_TH3Names); + tH3s[hPhiEtaVtxz] = registry.add(Form("%d/hPhiEtaVtxz", runNumber), ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); + th3sList.insert(std::make_pair(runNumber, tH3s)); } } @@ -259,11 +309,80 @@ struct FlowRunbyRun { mMinSeconds = std::floor(mSOR * 1.e-3); /// round tsSOR to the highest integer lower than tsSOR double maxSec = std::ceil(runDuration.second * 1.e-3); /// round tsEOR to the lowest integer higher than tsEOR const AxisSpec axisSeconds{static_cast((maxSec - mMinSeconds) / 20.f), 0, maxSec - mMinSeconds, "Seconds since SOR"}; - gHadronicRate[mRunNumber] = registry.add(Form("HadronicRate/%i", mRunNumber), ";Time since SOR (s);Hadronic rate (kHz)", kTH2D, {axisSeconds, {510, 0., 51.}}).get(); + int hadronicRateBins = static_cast(cfgCutMaxIR - cfgCutMinIR); + gHadronicRate[mRunNumber] = registry.add(Form("HadronicRate/%i", mRunNumber), ";Time since SOR (s);Hadronic rate (kHz)", kTH2D, {axisSeconds, {hadronicRateBins, cfgCutMinIR, cfgCutMaxIR}}).get(); } gCurrentHadronicRate = gHadronicRate[mRunNumber]; } + template + bool eventSelected(TCollision collision, const int multTrk, const float centrality) + { + if (cfgEvSelkNoSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { + // rejects collisions which are associated with the same "found-by-T0" bunch crossing + // https://indico.cern.ch/event/1396220/#1-event-selection-with-its-rof + return 0; + } + + if (cfgEvSelkIsGoodZvtxFT0vsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { + // removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference + // use this cut at low multiplicities with caution + return 0; + } + + if (cfgEvSelkNoCollInTimeRangeStandard && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + // no collisions in specified time range + return 0; + } + + if (cfgEvSelkIsGoodITSLayersAll && !collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + // from Jan 9 2025 AOT meeting + // cut time intervals with dead ITS staves + return 0; + } + + if (cfgEvSelkNoCollInRofStandard && !collision.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { + // no other collisions in this Readout Frame with per-collision multiplicity above threshold + return 0; + } + + if (cfgEvSelkNoHighMultCollInPrevRof && !collision.selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof)) { + // veto an event if FT0C amplitude in previous ITS ROF is above threshold + return 0; + } + + auto multNTracksPV = collision.multNTracksPV(); + auto occupancy = collision.trackOccupancyInTimeRange(); + if (cfgEvSelOccupancy && (occupancy < cfgCutOccupancyLow || occupancy > cfgCutOccupancyHigh)) + return 0; + + if (cfgEvSelMultCorrelation) { + if (multNTracksPV < fMultPVCutLow->Eval(centrality)) + return 0; + if (multNTracksPV > fMultPVCutHigh->Eval(centrality)) + return 0; + if (multTrk < fMultCutLow->Eval(centrality)) + return 0; + if (multTrk > fMultCutHigh->Eval(centrality)) + return 0; + } + + // V0A T0A 5 sigma cut + if (cfgEvSelV0AT0ACut && (std::fabs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > 5 * fT0AV0ASigma->Eval(collision.multFT0A()))) + return 0; + + return 1; + } + + template + bool trackSelected(TTrack track) + { + if (cfgCutDCAzPtDepEnabled && (std::fabs(track.dcaZ()) > (0.004f + 0.013f / track.pt()))) + return false; + + return ((track.tpcNClsFound() >= cfgCutTPCclu) && (track.itsNCls() >= cfgCutITSclu)); + } + void process(AodCollisions::iterator const& collision, aod::BCsWithTimestamps const&, AodTracks const& tracks) { if (!collision.sel8()) @@ -272,6 +391,9 @@ struct FlowRunbyRun { return; // detect run number auto bc = collision.bc_as(); + const auto cent = collision.centFT0C(); + if (cfgUseAdditionalEventCut && !eventSelected(collision, tracks.size(), cent)) + return; if (cfgGetInteractionRate) { initHadronicRate(bc); double hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), mRunNumber, "ZNC hadronic") * 1.e-3; // @@ -301,9 +423,10 @@ struct FlowRunbyRun { th1sList[runNumber][hCent]->Fill(collision.centFT0C()); fGFW->Clear(); - const auto cent = collision.centFT0C(); float weff = 1, wacc = 1; for (const auto& track : tracks) { + if (!trackSelected(track)) + continue; th1sList[runNumber][hPhi]->Fill(track.phi()); th1sList[runNumber][hEta]->Fill(track.eta()); // bool WithinPtPOI = (cfgCutPtPOIMin < track.pt()) && (track.pt() < cfgCutPtPOIMax); // within POI pT range @@ -314,20 +437,10 @@ struct FlowRunbyRun { if (cfgOutputNUAWeights) { if (cfgOutputNUAWeightsRefPt) { if (withinPtRef) { - GFWWeights* weight = fGFWWeightsList->getGFWWeightsByRun(runNumber); - if (!weight) { - LOGF(fatal, "Could not find the weight for run %d", runNumber); - return; - } - weight->fill(track.phi(), track.eta(), collision.posZ(), track.pt(), cent, 0); + th3sList[runNumber][hPhiEtaVtxz]->Fill(track.phi(), track.eta(), collision.posZ()); } } else { - GFWWeights* weight = fGFWWeightsList->getGFWWeightsByRun(runNumber); - if (!weight) { - LOGF(fatal, "Could not find the weight for run %d", runNumber); - return; - } - weight->fill(track.phi(), track.eta(), collision.posZ(), track.pt(), cent, 0); + th3sList[runNumber][hPhiEtaVtxz]->Fill(track.phi(), track.eta(), collision.posZ()); } } } From e6c8aed78ed659214b3894952c28150b157db310 Mon Sep 17 00:00:00 2001 From: Noor Koster <82090643+cnkoster@users.noreply.github.com> Date: Mon, 17 Feb 2025 21:18:16 +0100 Subject: [PATCH 0277/1650] [PWGCF] Change histos for MC reco (#10011) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/flowSP.cxx | 67 +++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 32 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowSP.cxx b/PWGCF/Flow/Tasks/flowSP.cxx index 79445d4c124..02bf82e2b44 100644 --- a/PWGCF/Flow/Tasks/flowSP.cxx +++ b/PWGCF/Flow/Tasks/flowSP.cxx @@ -243,10 +243,28 @@ struct FlowSP { registry.add("QA/after/CentFT0C_vs_CentFT0M", " ; Cent FT0C (%); Cent FT0M (%) ", {HistType::kTH2D, {axisCent, axisCent}}); registry.add("QA/after/CentFT0C_vs_CentFV0A", " ; Cent FT0C (%); Cent FV0A (%) ", {HistType::kTH2D, {axisCent, axisCent}}); registry.add("QA/after/CentFT0C_vs_CentNGlobal", " ; Cent FT0C (%); Cent NGlobal (%) ", {HistType::kTH2D, {axisCent, axisCent}}); + + // track QA for pos, neg, incl + registry.add("incl/QA/hPt", "", kTH1D, {axisPt}); + registry.add("incl/QA/hPhi", "", kTH1D, {axisPhi}); + registry.add("incl/QA/hPhiCorrected", "", kTH1D, {axisPhi}); + registry.add("incl/QA/hEta", "", kTH1D, {axisEta}); + registry.add("incl/QA/hPhi_Eta_vz", "", kTH3D, {axisPhi, axisEta, axisVz}); + registry.add("incl/QA/hDCAxy_pt", "", kTH2D, {axisPt, axisDCAxy}); + registry.add("incl/QA/hDCAz_pt", "", kTH2D, {axisPt, axisDCAz}); + registry.add("incl/QA/hSharedClusters_pt", "", {HistType::kTH2D, {axisPt, axisShCl}}); + registry.add("incl/QA/hCrossedRows_pt", "", {HistType::kTH2D, {axisPt, axisCl}}); } - if (doprocessData) { + if (doprocessMCReco) { + registry.add("trackMCReco/after/hPt_inclusive", "", {HistType::kTH1D, {axisPt}}); + registry.add("trackMCReco/after/hPt_positive", "", {HistType::kTH1D, {axisPt}}); + registry.add("trackMCReco/after/hPt_negative", "", {HistType::kTH1D, {axisPt}}); + + registry.addClone("trackMCReco/after/", "trackMCReco/before/"); + } + if (doprocessData) { // track properties per centrality and per eta, pt bin registry.add("incl/vnC_eta", "", kTProfile, {axisEtaVn}); registry.add("incl/vnA_eta", "", kTProfile, {axisEtaVn}); @@ -338,17 +356,6 @@ struct FlowSP { registry.add("QA/after/PsiA_vs_Vz", "", {HistType::kTH2D, {axisPhiPlane, axisVz}}); registry.add("QA/after/PsiC_vs_Vz", "", {HistType::kTH2D, {axisPhiPlane, axisVz}}); registry.add("QA/after/PsiFull_vs_Vz", "", {HistType::kTH2D, {axisPhiPlane, axisVz}}); - - // track QA for pos, neg, incl - registry.add("incl/QA/hPt", "", kTH1D, {axisPt}); - registry.add("incl/QA/hPhi", "", kTH1D, {axisPhi}); - registry.add("incl/QA/hPhiCorrected", "", kTH1D, {axisPhi}); - registry.add("incl/QA/hEta", "", kTH1D, {axisEta}); - registry.add("incl/QA/hPhi_Eta_vz", "", kTH3D, {axisPhi, axisEta, axisVz}); - registry.add("incl/QA/hDCAxy_pt", "", kTH2D, {axisPt, axisDCAxy}); - registry.add("incl/QA/hDCAz_pt", "", kTH2D, {axisPt, axisDCAz}); - registry.add("incl/QA/hSharedClusters_pt", "", {HistType::kTH2D, {axisPt, axisShCl}}); - registry.add("incl/QA/hCrossedRows_pt", "", {HistType::kTH2D, {axisPt, axisCl}}); } } @@ -642,13 +649,12 @@ struct FlowSP { registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/globalTracks_multV0A"), collision.multFV0A(), tracks.size()); registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/multV0A_multT0A"), collision.multFT0A(), collision.multFV0A()); registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/multT0C_centT0C"), collision.centFT0C(), collision.multFT0C()); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/CentFT0C_vs_CentFT0Cvariant1"), collision.centFT0C(), collision.centFT0CVariant1()); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/CentFT0C_vs_CentFT0M"), collision.centFT0C(), collision.centFT0M()); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/CentFT0C_vs_CentFV0A"), collision.centFT0C(), collision.centFV0A()); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/CentFT0C_vs_CentNGlobal"), collision.centFT0C(), collision.centNGlobal()); if constexpr (framework::has_type_v) { - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/CentFT0C_vs_CentFT0Cvariant1"), collision.centFT0C(), collision.centFT0CVariant1()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/CentFT0C_vs_CentFT0M"), collision.centFT0C(), collision.centFT0M()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/CentFT0C_vs_CentFV0A"), collision.centFT0C(), collision.centFV0A()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/CentFT0C_vs_CentNGlobal"), collision.centFT0C(), collision.centNGlobal()); - double psiA = 1.0 * std::atan2(collision.qyA(), collision.qxA()); double psiC = 1.0 * std::atan2(collision.qyC(), collision.qxC()); double psiFull = 1.0 * std::atan2(collision.qyA() + collision.qyC(), collision.qxA() + collision.qxC()); @@ -977,28 +983,25 @@ struct FlowSP { continue; bool pos = (track.sign() > 0) ? true : false; - if (cfgFillQAHistos) { - registry.fill(HIST("QA/before/hPt_inclusive"), track.pt()); - if (pos) { - registry.fill(HIST("QA/before/hPt_positive"), track.pt()); - } else { - registry.fill(HIST("QA/before/hPt_negative"), track.pt()); - } + registry.fill(HIST("trackMCReco/before/hPt_inclusive"), track.pt()); + if (pos) { + registry.fill(HIST("trackMCReco/before/hPt_positive"), track.pt()); + } else { + registry.fill(HIST("trackMCReco/before/hPt_negative"), track.pt()); } if (!trackSelected(track, field)) continue; - if (cfgFillQAHistos) { - registry.fill(HIST("QA/after/hPt_inclusive"), track.pt()); - if (pos) { - registry.fill(HIST("QA/after/hPt_positive"), track.pt()); - } else { - registry.fill(HIST("QA/after/hPt_negative"), track.pt()); - } + registry.fill(HIST("trackMCReco/after/hPt_inclusive"), track.pt()); + if (pos) { + registry.fill(HIST("trackMCReco/after/hPt_positive"), track.pt()); + } else { + registry.fill(HIST("trackMCReco/after/hPt_negative"), track.pt()); } - fillTrackQA(track, vtxz); + if (cfgFillQAHistos) + fillTrackQA(track, vtxz); } // end of track loop } From a1607b8f3eac72c1f410136d158988c5134346ed Mon Sep 17 00:00:00 2001 From: Thorkj <154221526+Thorkj@users.noreply.github.com> Date: Mon, 17 Feb 2025 21:18:51 +0100 Subject: [PATCH 0278/1650] [PWGCF] Changed trigger histogram from TH3F to THnSparseD (#9953) Co-authored-by: Thor Jensen --- PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx b/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx index 7fc4d531fd1..a41644270b2 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx @@ -11,7 +11,7 @@ /// \file corrSparse.cxx /// \brief Provides a sparse with usefull two particle correlation info -/// \author Thor Jensen (djt288@alumni.ku.dk) +/// \author Thor Jensen (thor.kjaersgaard.jensen@cern.ch) and Debojit Sarkar (debojit.sarkar@cern.ch) #include #include "Framework/runDataProcessing.h" @@ -42,7 +42,7 @@ struct CorrSparse { O2_DEFINE_CONFIGURABLE(cfgEtaCut, float, 0.8f, "Eta cut") O2_DEFINE_CONFIGURABLE(cfgMinMixEventNum, int, 5, "Minimum number of events to mix") - ConfigurableAxis axisVertex{"axisVertex", {20, -10, 10}, "vertex axis for histograms"}; + ConfigurableAxis axisVertex{"axisVertex", {10, -10, 10}, "vertex axis for histograms"}; ConfigurableAxis axisEta{"axisEta", {40, -1., 1.}, "eta axis for histograms"}; ConfigurableAxis axisPhi{"axisPhi", {72, 0.0, constants::math::TwoPI}, "phi axis for histograms"}; ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt axis for histograms"}; @@ -81,7 +81,7 @@ struct CorrSparse { registry.add("Sparse_mixed", "", {HistType::kTHnSparseF, {{axisMultiplicity, axisVertex, axisPtTrigger, axisPtAssoc, axisDeltaPhi, axisDeltaEta}}}); // Make the output sparse registry.add("Sparse_same", "", {HistType::kTHnSparseF, {{axisMultiplicity, axisVertex, axisPtTrigger, axisPtAssoc, axisDeltaPhi, axisDeltaEta}}}); - registry.add("Trig_Hist", "", {HistType::kTH3F, {{axisMultiplicity, axisVertex, axisPtTrigger}}}); + registry.add("Trig_Hist", "", {HistType::kTHnSparseF, {{axisMultiplicity, axisVertex, axisPtTrigger}}}); registry.add("eventcount", "bin", {HistType::kTH1F, {{3, 0, 3, "bin"}}}); // histogram to see how many events are in the same and mixed event } From 649bbaea6a571d41714ece1fe0f4e40f4da77a33 Mon Sep 17 00:00:00 2001 From: Junlee Kim Date: Mon, 17 Feb 2025 21:57:19 +0100 Subject: [PATCH 0279/1650] [PWGCF] adding switch for different correlations (#10019) --- PWGCF/Tasks/correlations.cxx | 66 +++++++++++++++++++++++++----------- 1 file changed, 46 insertions(+), 20 deletions(-) diff --git a/PWGCF/Tasks/correlations.cxx b/PWGCF/Tasks/correlations.cxx index 10dc955abdb..8cb9bc7f877 100644 --- a/PWGCF/Tasks/correlations.cxx +++ b/PWGCF/Tasks/correlations.cxx @@ -75,7 +75,7 @@ struct CorrelationTask { O2_DEFINE_CONFIGURABLE(cfgTriggerCharge, int, 0, "Select on charge of trigger particle: 0 = all; 1 = positive; -1 = negative"); O2_DEFINE_CONFIGURABLE(cfgAssociatedCharge, int, 0, "Select on charge of associated particle: 0 = all; 1 = positive; -1 = negative"); O2_DEFINE_CONFIGURABLE(cfgPairCharge, int, 0, "Select on charge of particle pair: 0 = all; 1 = like sign; -1 = unlike sign"); - O2_DEFINE_CONFIGURABLE(cfgCorrelateTheSame, int, 0, "Correlate the d0 with d0 or d0bar with d0bar, 0 = no, 1 = yes"); + O2_DEFINE_CONFIGURABLE(cfgCorrelationMethod, int, 0, "Correlation method, 0 = all, 1 = dd, 2 = ddbar"); O2_DEFINE_CONFIGURABLE(cfgTwoTrackCut, float, -1, "Two track cut: -1 = off; >0 otherwise distance value (suggested: 0.02)"); O2_DEFINE_CONFIGURABLE(cfgTwoTrackCutMinRadius, float, 0.8f, "Two track cut: radius in m from which two track cuts are applied"); @@ -157,11 +157,11 @@ struct CorrelationTask { { registry.add("yields", "multiplicity/centrality vs pT vs eta", {HistType::kTH3F, {{100, 0, 100, "/multiplicity/centrality"}, {40, 0, 20, "p_{T}"}, {100, -2, 2, "#eta"}}}); registry.add("etaphi", "multiplicity/centrality vs eta vs phi", {HistType::kTH3F, {{100, 0, 100, "multiplicity/centrality"}, {100, -2, 2, "#eta"}, {200, 0, o2::constants::math::TwoPI, "#varphi"}}}); - if (doprocessSame2ProngDerived || doprocessMixed2ProngDerived || doprocessSame2Prong2Prong) { + if (doprocessSame2ProngDerived || doprocessSame2Prong2Prong || doprocessSame2Prong2ProngML) { registry.add("yieldsTrigger", "multiplicity/centrality vs pT vs eta (triggers)", {HistType::kTH3F, {{100, 0, 100, "/multiplicity/centrality"}, {40, 0, 20, "p_{T}"}, {100, -2, 2, "#eta"}}}); registry.add("etaphiTrigger", "multiplicity/centrality vs eta vs phi (triggers)", {HistType::kTH3F, {{100, 0, 100, "multiplicity/centrality"}, {100, -2, 2, "#eta"}, {200, 0, o2::constants::math::TwoPI, "#varphi"}}}); registry.add("invMass", "2-prong invariant mass (GeV/c^2)", {HistType::kTH3F, {axisInvMassHistogram, axisPtTrigger, axisMultiplicity}}); - if (doprocessSame2Prong2Prong) { + if (doprocessSame2Prong2Prong || doprocessSame2Prong2ProngML) { registry.add("invMassTwoPart", "2D 2-prong invariant mass (GeV/c^2)", {HistType::kTHnSparseF, {axisInvMassHistogram, axisInvMassHistogram, axisPtTrigger, axisPtAssoc, axisMultiplicity}}); } } @@ -204,9 +204,9 @@ struct CorrelationTask { userAxis.emplace_back(axisInvMass, "m (GeV/c^2)"); userMixingAxis.emplace_back(axisInvMass, "m (GeV/c^2)"); } - if (doprocessSame2Prong2Prong) + if (doprocessSame2Prong2Prong || doprocessSame2Prong2ProngML) userAxis.emplace_back(axisInvMass, "m (GeV/c^2)"); - if (doprocessMixed2Prong2Prong) + if (doprocessMixed2Prong2Prong || doprocessMixed2Prong2ProngML) userMixingAxis.emplace_back(axisInvMass, "m (GeV/c^2)"); same.setObject(new CorrelationContainer("sameEvent", "sameEvent", corrAxis, effAxis, userAxis)); @@ -263,18 +263,45 @@ struct CorrelationTask { void fillQA(const TCollision& collision, float multiplicity, const TTracks1& tracks1, const TTracks2& tracks2) { for (const auto& track1 : tracks1) { - if constexpr (std::experimental::is_detected::value) { - if constexpr (std::experimental::is_detected::value) { - if (cfgDecayParticleMask != 0 && (cfgDecayParticleMask & (1u << static_cast(track1.decay()))) == 0u) - continue; - } + if constexpr (std::experimental::is_detected::value && std::experimental::is_detected::value) { + if (cfgDecayParticleMask != 0 && (cfgDecayParticleMask & (1u << static_cast(track1.decay()))) == 0u) + continue; registry.fill(HIST("invMass"), track1.invMass(), track1.pt(), multiplicity); for (const auto& track2 : tracks2) { if constexpr (std::experimental::is_detected::value && std::experimental::is_detected::value) { - if (doprocessSame2Prong2Prong || doprocessMixed2Prong2Prong) { + if (doprocessSame2Prong2Prong || doprocessMixed2Prong2Prong || doprocessSame2Prong2ProngML || doprocessMixed2Prong2ProngML) { if (cfgDecayParticleMask != 0 && (cfgDecayParticleMask & (1u << static_cast(track1.decay()))) == 0u) continue; - if ((track1.decay() != 0) || (track2.decay() != 1)) // D0 in trk1, D0bar in trk2 + + if constexpr (std::experimental::is_detected::value) { + if constexpr (std::experimental::is_detected::value) { + if (track1.cfTrackProng0Id() == track2.cfTrackProng0Id()) { + continue; + } + } + if constexpr (std::experimental::is_detected::value) { + if (track1.cfTrackProng0Id() == track2.cfTrackProng1Id()) { + continue; + } + } + } + + if constexpr (std::experimental::is_detected::value) { + if constexpr (std::experimental::is_detected::value) { + if (track1.cfTrackProng1Id() == track2.cfTrackProng0Id()) { + continue; + } + } + if constexpr (std::experimental::is_detected::value) { + if (track1.cfTrackProng1Id() == track2.cfTrackProng1Id()) { + continue; + } + } + } // no shared prong for two mothers + + if (cfgCorrelationMethod == 1 && track1.decay() != track2.decay()) + continue; + if (cfgCorrelationMethod == 2 && track1.decay() == track2.decay()) continue; registry.fill(HIST("invMassTwoPart"), track1.invMass(), track2.invMass(), track1.pt(), track2.pt(), multiplicity); } @@ -386,7 +413,7 @@ struct CorrelationTask { continue; } } - } + } // ML selection if (cfgMassAxis) { if constexpr (std::experimental::is_detected::value) @@ -430,11 +457,10 @@ struct CorrelationTask { } if constexpr (std::experimental::is_detected::value && std::experimental::is_detected::value) { - if (cfgCorrelateTheSame == 0 && (doprocessSame2Prong2Prong || doprocessMixed2Prong2Prong) && (track1.decay() == track2.decay() || track1.decay() > 1 || track2.decay() > 1)) { - continue; // D0 and anti-D0 selection - } else if (cfgCorrelateTheSame == 1 && (doprocessSame2Prong2Prong || doprocessMixed2Prong2Prong) && (track1.decay() != track2.decay() || track1.decay() > 1 || track2.decay() > 1)) { - continue; // the same particle selection - } + if (cfgCorrelationMethod == 1 && track1.decay() != track2.decay()) + continue; + if (cfgCorrelationMethod == 2 && track1.decay() == track2.decay()) + continue; } if constexpr (std::experimental::is_detected::value) { @@ -511,10 +537,10 @@ struct CorrelationTask { continue; } } - } + } // ML selection // last param is the weight - if (cfgMassAxis && (doprocessSame2Prong2Prong || doprocessMixed2Prong2Prong) && !(doprocessSame2ProngDerived || doprocessMixed2ProngDerived)) { + if (cfgMassAxis && (doprocessSame2Prong2Prong || doprocessMixed2Prong2Prong || doprocessSame2Prong2ProngML || doprocessMixed2Prong2ProngML) && !(doprocessSame2ProngDerived || doprocessMixed2ProngDerived)) { if constexpr (std::experimental::is_detected::value && std::experimental::is_detected::value) target->getPairHist()->Fill(step, track1.eta() - track2.eta(), track2.pt(), track1.pt(), multiplicity, deltaPhi, posZ, track2.invMass(), track1.invMass(), associatedWeight); else From 183ede1a3281df9dcd94d39e9b0c9523371b25cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Mon, 17 Feb 2025 22:22:01 +0100 Subject: [PATCH 0280/1650] [PWGLF] Update strangenessInJets.cxx (#10010) --- PWGLF/Tasks/Strangeness/strangenessInJets.cxx | 436 ++++++++++++------ 1 file changed, 303 insertions(+), 133 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/strangenessInJets.cxx b/PWGLF/Tasks/Strangeness/strangenessInJets.cxx index fcc3d333e0c..1876716dd93 100644 --- a/PWGLF/Tasks/Strangeness/strangenessInJets.cxx +++ b/PWGLF/Tasks/Strangeness/strangenessInJets.cxx @@ -51,7 +51,9 @@ using std::array; using SelCollisions = soa::Join; using SimCollisions = soa::Join; -using StrHadronDaughterTracks = soa::Join; +using StrHadronDaughterTracks = soa::Join; using MCTracks = soa::Join; struct StrangenessInJets { @@ -61,7 +63,7 @@ struct StrangenessInJets { HistogramRegistry registryQC{"registryQC", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; // Global Parameters - Configurable particleOfInterest{"particleOfInterest", 0, "0=v0, 1=cascade, 2=pions"}; + Configurable particleOfInterest{"particleOfInterest", 0, "0=v0, 1=cascade, 2=pions, 3=k+-, 4=proton"}; Configurable minimumJetPt{"minimumJetPt", 10.0, "Minimum pt of the jet"}; Configurable rJet{"rJet", 0.3, "Jet resolution parameter R"}; Configurable zVtx{"zVtx", 10.0, "Maximum zVertex"}; @@ -163,7 +165,9 @@ struct StrangenessInJets { // List of Particles enum Option { KZeroLambda, CascadePart, - ChargedPions }; + ChargedPions, + ChargedKaon, + ProtonAntiproton }; void init(InitContext const&) { @@ -233,41 +237,75 @@ struct StrangenessInJets { // Histograms for pions (data) if (doprocessData || doprocessK0s) { - registryData.add("piplus_tpc_in_jet", "piplus_tpc_in_jet", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTPCAxis}); - registryData.add("piplus_tof_in_jet", "piplus_tof_in_jet", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTOFAxis}); - registryData.add("piplus_tpc_in_ue", "piplus_tpc_in_ue", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTPCAxis}); - registryData.add("piplus_tof_in_ue", "piplus_tof_in_ue", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTOFAxis}); - registryData.add("piminus_tpc_in_jet", "piminus_tpc_in_jet", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTPCAxis}); - registryData.add("piminus_tof_in_jet", "piminus_tof_in_jet", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTOFAxis}); - registryData.add("piminus_tpc_in_ue", "piminus_tpc_in_ue", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTPCAxis}); - registryData.add("piminus_tof_in_ue", "piminus_tof_in_ue", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTOFAxis}); - - registryData.add("piplus_dcaxy_in_jet", "piplus_dcaxy_in_jet", HistType::kTH3F, {multBinning, ptAxisPi, dcaAxis}); - registryData.add("piplus_dcaxy_in_ue", "piplus_dcaxy_in_ue", HistType::kTH3F, {multBinning, ptAxisPi, dcaAxis}); - registryData.add("piminus_dcaxy_in_jet", "piminus_dcaxy_in_jet", HistType::kTH3F, {multBinning, ptAxisPi, dcaAxis}); - registryData.add("piminus_dcaxy_in_ue", "piminus_dcaxy_in_ue", HistType::kTH3F, {multBinning, ptAxisPi, dcaAxis}); - - // Histograms for lambda (data) - registryData.add("Lambda_in_jet", "Lambda_in_jet", HistType::kTH3F, {multBinning, ptAxis, invMassLambdaAxis}); - registryData.add("AntiLambda_in_jet", "AntiLambda_in_jet", HistType::kTH3F, {multBinning, ptAxis, invMassLambdaAxis}); - registryData.add("Lambda_in_ue", "Lambda_in_ue", HistType::kTH3F, {multBinning, ptAxis, invMassLambdaAxis}); - registryData.add("AntiLambda_in_ue", "AntiLambda_in_ue", HistType::kTH3F, {multBinning, ptAxis, invMassLambdaAxis}); - - // Histograms for K0s (data) - registryData.add("K0s_in_jet", "K0s_in_jet", HistType::kTH3F, {multBinning, ptAxis, invMassK0sAxis}); - registryData.add("K0s_in_ue", "K0s_in_ue", HistType::kTH3F, {multBinning, ptAxis, invMassK0sAxis}); - - // Histograms for xi (data) - registryData.add("XiPos_in_jet", "XiPos_in_jet", HistType::kTH3F, {multBinning, ptAxis, invMassXiAxis}); - registryData.add("XiPos_in_ue", "XiPos_in_ue", HistType::kTH3F, {multBinning, ptAxis, invMassXiAxis}); - registryData.add("XiNeg_in_jet", "XiNeg_in_jet", HistType::kTH3F, {multBinning, ptAxis, invMassXiAxis}); - registryData.add("XiNeg_in_ue", "XiNeg_in_ue", HistType::kTH3F, {multBinning, ptAxis, invMassXiAxis}); - - // Histograms for omega (data) - registryData.add("OmegaPos_in_jet", "OmegaPos_in_jet", HistType::kTH3F, {multBinning, ptAxis, invMassOmegaAxis}); - registryData.add("OmegaPos_in_ue", "OmegaPos_in_ue", HistType::kTH3F, {multBinning, ptAxis, invMassOmegaAxis}); - registryData.add("OmegaNeg_in_jet", "OmegaNeg_in_jet", HistType::kTH3F, {multBinning, ptAxis, invMassOmegaAxis}); - registryData.add("OmegaNeg_in_ue", "OmegaNeg_in_ue", HistType::kTH3F, {multBinning, ptAxis, invMassOmegaAxis}); + switch (particleOfInterest) { + case KZeroLambda: + // Histograms for lambda (data) + registryData.add("Lambda_in_jet", "Lambda_in_jet", HistType::kTH3F, {multBinning, ptAxis, invMassLambdaAxis}); + registryData.add("AntiLambda_in_jet", "AntiLambda_in_jet", HistType::kTH3F, {multBinning, ptAxis, invMassLambdaAxis}); + registryData.add("Lambda_in_ue", "Lambda_in_ue", HistType::kTH3F, {multBinning, ptAxis, invMassLambdaAxis}); + registryData.add("AntiLambda_in_ue", "AntiLambda_in_ue", HistType::kTH3F, {multBinning, ptAxis, invMassLambdaAxis}); + // Histograms for K0s (data) + registryData.add("K0s_in_jet", "K0s_in_jet", HistType::kTH3F, {multBinning, ptAxis, invMassK0sAxis}); + registryData.add("K0s_in_ue", "K0s_in_ue", HistType::kTH3F, {multBinning, ptAxis, invMassK0sAxis}); + break; + case CascadePart: + // Histograms for xi (data) + registryData.add("XiPos_in_jet", "XiPos_in_jet", HistType::kTH3F, {multBinning, ptAxis, invMassXiAxis}); + registryData.add("XiPos_in_ue", "XiPos_in_ue", HistType::kTH3F, {multBinning, ptAxis, invMassXiAxis}); + registryData.add("XiNeg_in_jet", "XiNeg_in_jet", HistType::kTH3F, {multBinning, ptAxis, invMassXiAxis}); + registryData.add("XiNeg_in_ue", "XiNeg_in_ue", HistType::kTH3F, {multBinning, ptAxis, invMassXiAxis}); + // Histograms for omega (data) + registryData.add("OmegaPos_in_jet", "OmegaPos_in_jet", HistType::kTH3F, {multBinning, ptAxis, invMassOmegaAxis}); + registryData.add("OmegaPos_in_ue", "OmegaPos_in_ue", HistType::kTH3F, {multBinning, ptAxis, invMassOmegaAxis}); + registryData.add("OmegaNeg_in_jet", "OmegaNeg_in_jet", HistType::kTH3F, {multBinning, ptAxis, invMassOmegaAxis}); + registryData.add("OmegaNeg_in_ue", "OmegaNeg_in_ue", HistType::kTH3F, {multBinning, ptAxis, invMassOmegaAxis}); + break; + case ChargedPions: + registryData.add("piplus_tpc_in_jet", "piplus_tpc_in_jet", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTPCAxis}); + registryData.add("piplus_tof_in_jet", "piplus_tof_in_jet", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTOFAxis}); + registryData.add("piplus_tpc_in_ue", "piplus_tpc_in_ue", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTPCAxis}); + registryData.add("piplus_tof_in_ue", "piplus_tof_in_ue", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTOFAxis}); + registryData.add("piminus_tpc_in_jet", "piminus_tpc_in_jet", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTPCAxis}); + registryData.add("piminus_tof_in_jet", "piminus_tof_in_jet", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTOFAxis}); + registryData.add("piminus_tpc_in_ue", "piminus_tpc_in_ue", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTPCAxis}); + registryData.add("piminus_tof_in_ue", "piminus_tof_in_ue", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTOFAxis}); + registryData.add("piplus_dcaxy_in_jet", "piplus_dcaxy_in_jet", HistType::kTH3F, {multBinning, ptAxisPi, dcaAxis}); + registryData.add("piplus_dcaxy_in_ue", "piplus_dcaxy_in_ue", HistType::kTH3F, {multBinning, ptAxisPi, dcaAxis}); + registryData.add("piminus_dcaxy_in_jet", "piminus_dcaxy_in_jet", HistType::kTH3F, {multBinning, ptAxisPi, dcaAxis}); + registryData.add("piminus_dcaxy_in_ue", "piminus_dcaxy_in_ue", HistType::kTH3F, {multBinning, ptAxisPi, dcaAxis}); + break; + case ChargedKaon: // Here we keep the name but just change the title to avoid rewriting everything + registryData.add("piplus_tpc_in_jet", "kaplus_tpc_in_jet", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTPCAxis}); + registryData.add("piplus_tof_in_jet", "kaplus_tof_in_jet", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTOFAxis}); + registryData.add("piplus_tpc_in_ue", "kaplus_tpc_in_ue", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTPCAxis}); + registryData.add("piplus_tof_in_ue", "kaplus_tof_in_ue", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTOFAxis}); + registryData.add("piminus_tpc_in_jet", "kaminus_tpc_in_jet", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTPCAxis}); + registryData.add("piminus_tof_in_jet", "kaminus_tof_in_jet", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTOFAxis}); + registryData.add("piminus_tpc_in_ue", "kaminus_tpc_in_ue", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTPCAxis}); + registryData.add("piminus_tof_in_ue", "kaminus_tof_in_ue", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTOFAxis}); + registryData.add("piplus_dcaxy_in_jet", "kaplus_dcaxy_in_jet", HistType::kTH3F, {multBinning, ptAxisPi, dcaAxis}); + registryData.add("piplus_dcaxy_in_ue", "kaplus_dcaxy_in_ue", HistType::kTH3F, {multBinning, ptAxisPi, dcaAxis}); + registryData.add("piminus_dcaxy_in_jet", "kaminus_dcaxy_in_jet", HistType::kTH3F, {multBinning, ptAxisPi, dcaAxis}); + registryData.add("piminus_dcaxy_in_ue", "kaminus_dcaxy_in_ue", HistType::kTH3F, {multBinning, ptAxisPi, dcaAxis}); + break; + case ProtonAntiproton: // Here we keep the name but just change the title to avoid rewriting everything + registryData.add("piplus_tpc_in_jet", "prplus_tpc_in_jet", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTPCAxis}); + registryData.add("piplus_tof_in_jet", "prplus_tof_in_jet", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTOFAxis}); + registryData.add("piplus_tpc_in_ue", "prplus_tpc_in_ue", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTPCAxis}); + registryData.add("piplus_tof_in_ue", "prplus_tof_in_ue", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTOFAxis}); + registryData.add("piminus_tpc_in_jet", "prminus_tpc_in_jet", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTPCAxis}); + registryData.add("piminus_tof_in_jet", "prminus_tof_in_jet", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTOFAxis}); + registryData.add("piminus_tpc_in_ue", "prminus_tpc_in_ue", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTPCAxis}); + registryData.add("piminus_tof_in_ue", "prminus_tof_in_ue", HistType::kTH3F, {multBinning, ptAxisPi, nsigmaTOFAxis}); + registryData.add("piplus_dcaxy_in_jet", "prplus_dcaxy_in_jet", HistType::kTH3F, {multBinning, ptAxisPi, dcaAxis}); + registryData.add("piplus_dcaxy_in_ue", "prplus_dcaxy_in_ue", HistType::kTH3F, {multBinning, ptAxisPi, dcaAxis}); + registryData.add("piminus_dcaxy_in_jet", "prminus_dcaxy_in_jet", HistType::kTH3F, {multBinning, ptAxisPi, dcaAxis}); + registryData.add("piminus_dcaxy_in_ue", "prminus_dcaxy_in_ue", HistType::kTH3F, {multBinning, ptAxisPi, dcaAxis}); + break; + default: + LOG(fatal) << "Cannot interpret particle " << particleOfInterest; + break; + } } // Histograms for efficiency (generated) @@ -307,13 +345,17 @@ struct StrangenessInJets { registryMC.add("Secondary_AntiLambda_InUe", "Secondary_AntiLambda_InUe", HistType::kTH1F, {ptAxis}); // Histograms for 2d reweighting (pion) - registryMC.add("pi_plus_eta_pt_jet", "pi_plus_eta_pt_jet", HistType::kTH2F, {ptAxisPi, etaAxis}); - registryMC.add("pi_plus_eta_pt_ue", "pi_plus_eta_pt_ue", HistType::kTH2F, {ptAxisPi, etaAxis}); - registryMC.add("pi_plus_eta_pt_pythia", "pi_plus_eta_pt_pythia", HistType::kTH2F, {ptAxisPi, etaAxis}); + registryMC.add("mc_pi_plus_eta_pt/jet", "", HistType::kTH2F, {ptAxisPi, etaAxis}); + registryMC.addClone("mc_pi_plus_eta_pt/jet", "mc_pi_plus_eta_pt/ue"); + registryMC.addClone("mc_pi_plus_eta_pt/jet", "mc_pi_plus_eta_pt/pythia"); + + registryMC.addClone("mc_pi_plus_eta_pt/", "mc_pi_minus_eta_pt/"); + + registryMC.addClone("mc_pi_plus_eta_pt/", "mc_ka_plus_eta_pt/"); + registryMC.addClone("mc_pi_minus_eta_pt/", "mc_ka_minus_eta_pt/"); - registryMC.add("pi_minus_eta_pt_jet", "pi_minus_eta_pt_jet", HistType::kTH2F, {ptAxisPi, etaAxis}); - registryMC.add("pi_minus_eta_pt_ue", "pi_minus_eta_pt_ue", HistType::kTH2F, {ptAxisPi, etaAxis}); - registryMC.add("pi_minus_eta_pt_pythia", "pi_minus_eta_pt_pythia", HistType::kTH2F, {ptAxisPi, etaAxis}); + registryMC.addClone("mc_pi_plus_eta_pt/", "mc_pr_plus_eta_pt/"); + registryMC.addClone("mc_pi_minus_eta_pt/", "mc_pr_minus_eta_pt/"); // Histograms for 2d reweighting (K0s) registryMC.add("K0s_eta_pt_jet", "K0s_eta_pt_jet", HistType::kTH2F, {ptAxis, etaAxis}); @@ -345,25 +387,32 @@ struct StrangenessInJets { registryMC.add("AntiOmega_eta_pt_pythia", "AntiOmega_eta_pt_pythia", HistType::kTH2F, {ptAxis, etaAxis}); // Histograms for efficiency (pions) - registryMC.add("pi_plus_gen_in_jet", "pi_plus_gen_in_jet", HistType::kTH2F, {multBinning, ptAxisPi}); - registryMC.add("pi_plus_rec_in_jet_tpc", "pi_plus_rec_in_jet_tpc", HistType::kTH2F, {multBinning, ptAxisPi}); - registryMC.add("pi_plus_rec_in_jet_tof", "pi_plus_rec_in_jet_tof", HistType::kTH2F, {multBinning, ptAxisPi}); - registryMC.add("pi_plus_gen_in_ue", "pi_plus_gen_in_ue", HistType::kTH2F, {multBinning, ptAxisPi}); - registryMC.add("pi_plus_rec_in_ue_tpc", "pi_plus_rec_in_ue_tpc", HistType::kTH2F, {multBinning, ptAxisPi}); - registryMC.add("pi_plus_rec_in_ue_tof", "pi_plus_rec_in_ue_tof", HistType::kTH2F, {multBinning, ptAxisPi}); - - registryMC.add("pi_minus_gen_in_jet", "pi_minus_gen_in_jet", HistType::kTH2F, {multBinning, ptAxisPi}); - registryMC.add("pi_minus_rec_in_jet_tpc", "pi_minus_rec_in_jet_tpc", HistType::kTH2F, {multBinning, ptAxisPi}); - registryMC.add("pi_minus_rec_in_jet_tof", "pi_minus_rec_in_jet_tof", HistType::kTH2F, {multBinning, ptAxisPi}); - registryMC.add("pi_minus_gen_in_ue", "pi_minus_gen_in_ue", HistType::kTH2F, {multBinning, ptAxisPi}); - registryMC.add("pi_minus_rec_in_ue_tpc", "pi_minus_rec_in_ue_tpc", HistType::kTH2F, {multBinning, ptAxisPi}); - registryMC.add("pi_minus_rec_in_ue_tof", "pi_minus_rec_in_ue_tof", HistType::kTH2F, {multBinning, ptAxisPi}); + registryMC.add("mc_pi_plus/in_jet/gen", "", HistType::kTH2F, {multBinning, ptAxisPi}); + registryMC.addClone("mc_pi_plus/in_jet/gen", "mc_pi_plus/in_jet/rec_tpc"); + registryMC.addClone("mc_pi_plus/in_jet/gen", "mc_pi_plus/in_jet/rec_tof"); + registryMC.addClone("mc_pi_plus/in_jet/", "mc_pi_plus/in_ue/"); + + registryMC.addClone("mc_pi_plus/", "mc_pi_minus/"); + + // Histograms for efficiency (kaons) + registryMC.addClone("mc_pi_plus/", "mc_ka_plus/"); + registryMC.addClone("mc_pi_minus/", "mc_ka_minus/"); + + // Histograms for efficiency (protons) + registryMC.addClone("mc_pi_plus/", "mc_pr_plus/"); + registryMC.addClone("mc_pi_minus/", "mc_pr_minus/"); // MC Templates - registryMC.add("piplus_dcaxy_prim", "piplus_dcaxy_prim", HistType::kTH3F, {multBinning, ptAxisPi, dcaAxis}); - registryMC.add("piminus_dcaxy_prim", "piminus_dcaxy_prim", HistType::kTH3F, {multBinning, ptAxisPi, dcaAxis}); - registryMC.add("piplus_dcaxy_sec", "piplus_dcaxy_sec", HistType::kTH3F, {multBinning, ptAxisPi, dcaAxis}); - registryMC.add("piminus_dcaxy_sec", "piminus_dcaxy_sec", HistType::kTH3F, {multBinning, ptAxisPi, dcaAxis}); + registryMC.add("pi_plus_dcaxy/prm", "", HistType::kTH3F, {multBinning, ptAxisPi, dcaAxis}); + registryMC.addClone("pi_plus_dcaxy/prm", "pi_plus_dcaxy/sec"); + + registryMC.addClone("pi_plus_dcaxy/", "pi_minus_dcaxy/"); + + registryMC.addClone("pi_plus_dcaxy/", "kaplus_dcaxy/"); + registryMC.addClone("pi_minus_dcaxy/", "kaminus_dcaxy/"); + + registryMC.addClone("pi_plus_dcaxy/", "prplus_dcaxy/"); + registryMC.addClone("pi_minus_dcaxy/", "prminus_dcaxy/"); } } @@ -804,11 +853,11 @@ struct StrangenessInJets { // Pion Selection template - bool isHighPurityPion(const pionTrack& track) + bool isHighPurityPion(const pionTrack& track, const float nsigmaTPC, const float nsigmaTOF) { - if (track.p() < 0.6 && std::fabs(track.tpcNSigmaPi()) < 3.0) + if (track.p() < 0.6 && std::fabs(nsigmaTPC) < 2.0) return true; - if (track.p() > 0.6 && std::fabs(track.tpcNSigmaPi()) < 3.0 && std::fabs(track.tofNSigmaPi()) < 3.0) + if (track.p() > 0.6 && std::fabs(nsigmaTPC) < 2.0 && std::fabs(nsigmaTOF) < 2.0) return true; return false; } @@ -979,7 +1028,10 @@ struct StrangenessInJets { get1DWeightHisto(histoNameWeightsAntiXiInUe, weightsAntiXiInUe); } - void processData(SelCollisions::iterator const& collision, aod::V0Datas const& fullV0s, aod::CascDataExt const& Cascades, StrHadronDaughterTracks const& tracks) + void processData(SelCollisions::iterator const& collision, + aod::V0Datas const& fullV0s, + aod::CascDataExt const& Cascades, + StrHadronDaughterTracks const& tracks) { // Event Counter: before event selection @@ -1160,7 +1212,7 @@ struct StrangenessInJets { registryData.fill(HIST("number_of_events_data"), 6.5); // Event multiplicity - float multiplicity = collision.centFT0M(); + const float multiplicity = collision.centFT0M(); registryData.fill(HIST("number_of_events_vsmultiplicity"), multiplicity); @@ -1287,15 +1339,32 @@ struct StrangenessInJets { continue; TVector3 trackDir(track.px(), track.py(), track.pz()); - float deltaEtaJet = trackDir.Eta() - jet[i].Eta(); - float deltaPhiJet = getDeltaPhi(trackDir.Phi(), jet[i].Phi()); - float deltaRjet = std::sqrt(deltaEtaJet * deltaEtaJet + deltaPhiJet * deltaPhiJet); - float deltaEtaUe1 = trackDir.Eta() - ue1[i].Eta(); - float deltaPhiUe1 = getDeltaPhi(trackDir.Phi(), ue1[i].Phi()); - float deltaRue1 = std::sqrt(deltaEtaUe1 * deltaEtaUe1 + deltaPhiUe1 * deltaPhiUe1); - float deltaEtaUe2 = trackDir.Eta() - ue2[i].Eta(); - float deltaPhiUe2 = getDeltaPhi(trackDir.Phi(), ue2[i].Phi()); - float deltaRue2 = std::sqrt(deltaEtaUe2 * deltaEtaUe2 + deltaPhiUe2 * deltaPhiUe2); + const float deltaEtaJet = trackDir.Eta() - jet[i].Eta(); + const float deltaPhiJet = getDeltaPhi(trackDir.Phi(), jet[i].Phi()); + const float deltaRjet = std::sqrt(deltaEtaJet * deltaEtaJet + deltaPhiJet * deltaPhiJet); + const float deltaEtaUe1 = trackDir.Eta() - ue1[i].Eta(); + const float deltaPhiUe1 = getDeltaPhi(trackDir.Phi(), ue1[i].Phi()); + const float deltaRue1 = std::sqrt(deltaEtaUe1 * deltaEtaUe1 + deltaPhiUe1 * deltaPhiUe1); + const float deltaEtaUe2 = trackDir.Eta() - ue2[i].Eta(); + const float deltaPhiUe2 = getDeltaPhi(trackDir.Phi(), ue2[i].Phi()); + const float deltaRue2 = std::sqrt(deltaEtaUe2 * deltaEtaUe2 + deltaPhiUe2 * deltaPhiUe2); + + float nsigmaTPC = 999.f; + float nsigmaTOF = 999.f; + switch (particleOfInterest) { + case Option::ChargedPions: + nsigmaTPC = track.tpcNSigmaPi(); + nsigmaTOF = track.tofNSigmaPi(); + break; + case Option::ChargedKaon: + nsigmaTPC = track.tpcNSigmaKa(); + nsigmaTOF = track.tofNSigmaKa(); + break; + case Option::ProtonAntiproton: + nsigmaTPC = track.tpcNSigmaPr(); + nsigmaTOF = track.tofNSigmaPr(); + break; + } bool isInJet = false; bool isInUe = false; @@ -1304,17 +1373,18 @@ struct StrangenessInJets { if (deltaRue1 < rJet || deltaRue2 < rJet) isInUe = true; - if (isHighPurityPion(track) && track.sign() > 0) { - if (isInJet) - registryData.fill(HIST("piplus_dcaxy_in_jet"), multiplicity, track.pt(), track.dcaXY()); - if (isInUe) - registryData.fill(HIST("piplus_dcaxy_in_ue"), multiplicity, track.pt(), track.dcaXY()); - } - if (isHighPurityPion(track) && track.sign() < 0) { - if (isInJet) - registryData.fill(HIST("piminus_dcaxy_in_jet"), multiplicity, track.pt(), track.dcaXY()); - if (isInUe) - registryData.fill(HIST("piminus_dcaxy_in_ue"), multiplicity, track.pt(), track.dcaXY()); + if (isHighPurityPion(track, nsigmaTPC, nsigmaTOF)) { + if (track.sign() > 0) { + if (isInJet) + registryData.fill(HIST("piplus_dcaxy_in_jet"), multiplicity, track.pt(), track.dcaXY()); + if (isInUe) + registryData.fill(HIST("piplus_dcaxy_in_ue"), multiplicity, track.pt(), track.dcaXY()); + } else { + if (isInJet) + registryData.fill(HIST("piminus_dcaxy_in_jet"), multiplicity, track.pt(), track.dcaXY()); + if (isInUe) + registryData.fill(HIST("piminus_dcaxy_in_ue"), multiplicity, track.pt(), track.dcaXY()); + } } // DCAxy Selection @@ -1322,35 +1392,51 @@ struct StrangenessInJets { continue; // TPC - if (isInJet && track.sign() > 0) { - registryData.fill(HIST("piplus_tpc_in_jet"), multiplicity, track.pt(), track.tpcNSigmaPi()); - } - if (isInUe && track.sign() > 0) { - registryData.fill(HIST("piplus_tpc_in_ue"), multiplicity, track.pt(), track.tpcNSigmaPi()); - } - if (isInJet && track.sign() < 0) { - registryData.fill(HIST("piminus_tpc_in_jet"), multiplicity, track.pt(), track.tpcNSigmaPi()); - } - if (isInUe && track.sign() < 0) { - registryData.fill(HIST("piminus_tpc_in_ue"), multiplicity, track.pt(), track.tpcNSigmaPi()); + switch (track.sign()) { + case 1: + if (isInJet) { + registryData.fill(HIST("piplus_tpc_in_jet"), multiplicity, track.pt(), nsigmaTPC); + } + if (isInUe) { + registryData.fill(HIST("piplus_tpc_in_ue"), multiplicity, track.pt(), nsigmaTPC); + } + break; + case -1: + if (isInJet) { + registryData.fill(HIST("piminus_tpc_in_jet"), multiplicity, track.pt(), nsigmaTPC); + } + if (isInUe) { + registryData.fill(HIST("piminus_tpc_in_ue"), multiplicity, track.pt(), nsigmaTPC); + } + break; + default: + LOG(fatal) << "Error in the charge"; } - if (track.tpcNSigmaPi() < nsigmaTPCmin || track.tpcNSigmaPi() > nsigmaTPCmax) + if (nsigmaTPC < nsigmaTPCmin || nsigmaTPC > nsigmaTPCmax) continue; if (!track.hasTOF()) continue; // TOF - if (isInJet && track.sign() > 0) { - registryData.fill(HIST("piplus_tof_in_jet"), multiplicity, track.pt(), track.tofNSigmaPi()); - } - if (isInUe && track.sign() > 0) { - registryData.fill(HIST("piplus_tof_in_ue"), multiplicity, track.pt(), track.tofNSigmaPi()); - } - if (isInJet && track.sign() < 0) { - registryData.fill(HIST("piminus_tof_in_jet"), multiplicity, track.pt(), track.tofNSigmaPi()); - } - if (isInUe && track.sign() < 0) { - registryData.fill(HIST("piminus_tof_in_ue"), multiplicity, track.pt(), track.tofNSigmaPi()); + switch (track.sign()) { + case 1: + if (isInJet) { + registryData.fill(HIST("piplus_tof_in_jet"), multiplicity, track.pt(), nsigmaTOF); + } + if (isInUe) { + registryData.fill(HIST("piplus_tof_in_ue"), multiplicity, track.pt(), nsigmaTOF); + } + break; + case -1: + if (isInJet) { + registryData.fill(HIST("piminus_tof_in_jet"), multiplicity, track.pt(), nsigmaTOF); + } + if (isInUe) { + registryData.fill(HIST("piminus_tof_in_ue"), multiplicity, track.pt(), nsigmaTOF); + } + break; + default: + LOG(fatal) << "Error in the charge"; } } } @@ -1701,20 +1787,48 @@ struct StrangenessInJets { continue; const auto particle = track.mcParticle(); - if (std::fabs(particle.pdgCode()) != 211) - continue; - - if (particle.isPhysicalPrimary()) { - if (track.sign() > 0) - registryMC.fill(HIST("piplus_dcaxy_prim"), multiplicity, track.pt(), track.dcaXY()); - if (track.sign() < 0) - registryMC.fill(HIST("piminus_dcaxy_prim"), multiplicity, track.pt(), track.dcaXY()); - } - if (!particle.isPhysicalPrimary()) { - if (track.sign() > 0) - registryMC.fill(HIST("piplus_dcaxy_sec"), multiplicity, track.pt(), track.dcaXY()); - if (track.sign() < 0) - registryMC.fill(HIST("piminus_dcaxy_sec"), multiplicity, track.pt(), track.dcaXY()); + switch (std::abs(particle.pdgCode())) { + case 211: + if (particle.isPhysicalPrimary()) { + if (track.sign() > 0) + registryMC.fill(HIST("pi_plus_dcaxy/prm"), multiplicity, track.pt(), track.dcaXY()); + else + registryMC.fill(HIST("pi_minus_dcaxy/prm"), multiplicity, track.pt(), track.dcaXY()); + } else { + if (track.sign() > 0) + registryMC.fill(HIST("pi_plus_dcaxy/sec"), multiplicity, track.pt(), track.dcaXY()); + else + registryMC.fill(HIST("pi_minus_dcaxy/sec"), multiplicity, track.pt(), track.dcaXY()); + } + break; + case 321: + if (particle.isPhysicalPrimary()) { + if (track.sign() > 0) + registryMC.fill(HIST("ka_plus_dcaxy/prm"), multiplicity, track.pt(), track.dcaXY()); + else + registryMC.fill(HIST("ka_minus_dcaxy/prm"), multiplicity, track.pt(), track.dcaXY()); + } else { + if (track.sign() > 0) + registryMC.fill(HIST("ka_plus_dcaxy/sec"), multiplicity, track.pt(), track.dcaXY()); + else + registryMC.fill(HIST("ka_minus_dcaxy/sec"), multiplicity, track.pt(), track.dcaXY()); + } + break; + case 2212: + if (particle.isPhysicalPrimary()) { + if (track.sign() > 0) + registryMC.fill(HIST("pr_plus_dcaxy/prm"), multiplicity, track.pt(), track.dcaXY()); + else + registryMC.fill(HIST("pr_minus_dcaxy/prm"), multiplicity, track.pt(), track.dcaXY()); + } else { + if (track.sign() > 0) + registryMC.fill(HIST("pr_plus_dcaxy/sec"), multiplicity, track.pt(), track.dcaXY()); + else + registryMC.fill(HIST("pr_minus_dcaxy/sec"), multiplicity, track.pt(), track.dcaXY()); + } + break; + default: + continue; } if (std::fabs(track.dcaXY()) > dcaxyMax) @@ -1733,10 +1847,10 @@ struct StrangenessInJets { if (!histo) return 1.0; const int bx = histo->GetXaxis()->FindBin(track.pt()); - const int by = histo->GetYaxis()->FindBin(track.eta()); if (bx <= 0 || bx > histo->GetNbinsX()) { return 1.0; } + const int by = histo->GetYaxis()->FindBin(track.eta()); if (by <= 0 || by > histo->GetNbinsX()) { return 1.0; } @@ -1749,8 +1863,8 @@ struct StrangenessInJets { } if (track.sign() > 0) { - registryMC.fill(HIST("pi_plus_rec_in_jet_tpc"), multiplicity, track.pt(), wPiplusJet); - registryMC.fill(HIST("pi_plus_rec_in_ue_tpc"), multiplicity, track.pt(), wPiplusUe); + registryMC.fill(HIST("mc_pi_plus/in_jet/rec_tpc"), multiplicity, track.pt(), wPiplusJet); + registryMC.fill(HIST("mc_pi_plus/in_ue/rec_tpc"), multiplicity, track.pt(), wPiplusUe); } else { registryMC.fill(HIST("pi_minus_rec_in_jet_tpc"), multiplicity, track.pt(), wPiminusJet); registryMC.fill(HIST("pi_minus_rec_in_ue_tpc"), multiplicity, track.pt(), wPiminusUe); @@ -1762,8 +1876,8 @@ struct StrangenessInJets { continue; if (track.sign() > 0) { - registryMC.fill(HIST("pi_plus_rec_in_jet_tof"), multiplicity, track.pt(), wPiplusJet); - registryMC.fill(HIST("pi_plus_rec_in_ue_tof"), multiplicity, track.pt(), wPiplusUe); + registryMC.fill(HIST("mc_pi_plus/in_jet/rec_tof"), multiplicity, track.pt(), wPiplusJet); + registryMC.fill(HIST("mc_pi_plus/in_ue/rec_tof"), multiplicity, track.pt(), wPiplusUe); } else { registryMC.fill(HIST("pi_minus_rec_in_jet_tof"), multiplicity, track.pt(), wPiminusJet); registryMC.fill(HIST("pi_minus_rec_in_ue_tof"), multiplicity, track.pt(), wPiminusUe); @@ -1779,6 +1893,10 @@ struct StrangenessInJets { double wPiplusJet(1.0), wPiplusUe(1.0); double wPiminusJet(1.0), wPiminusUe(1.0); + double wKaplusJet(1.0), wKaplusUe(1.0); + double wKaminusJet(1.0), wKaminusUe(1.0); + double wPrplusJet(1.0), wPrplusUe(1.0); + double wPrminusJet(1.0), wPrminusUe(1.0); double wK0jet(1.0), wK0Ue(1.0), wLambdaJet(1.0), wLambdaUe(1.0), wAntilambdaJet(1.0), wAntilambdaUe(1.0); if (applyReweighting) { auto getWeight = [&](TH2F* histo) { @@ -1786,10 +1904,10 @@ struct StrangenessInJets { return 1.0; } const int bx = histo->GetXaxis()->FindBin(mcParticle.pt()); - const int by = histo->GetYaxis()->FindBin(mcParticle.eta()); if (bx <= 0 || bx > histo->GetNbinsX()) { return 1.0; } + const int by = histo->GetYaxis()->FindBin(mcParticle.eta()); if (by <= 0 || by > histo->GetNbinsX()) { return 1.0; } @@ -1830,15 +1948,35 @@ struct StrangenessInJets { switch (mcParticle.pdgCode()) { case 211: // Pi+ - registryMC.fill(HIST("pi_plus_gen_in_jet"), multiplicity, mcParticle.pt(), wPiplusJet); - registryMC.fill(HIST("pi_plus_gen_in_ue"), multiplicity, mcParticle.pt(), wPiplusUe); + registryMC.fill(HIST("mc_pi_plus/in_jet/gen"), multiplicity, mcParticle.pt(), wPiplusJet); + registryMC.fill(HIST("mc_pi_plus/in_ue/gen"), multiplicity, mcParticle.pt(), wPiplusUe); registryMC.fill(HIST("pi_plus_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); break; case -211: // Pi- - registryMC.fill(HIST("pi_minus_gen_in_jet"), multiplicity, mcParticle.pt(), wPiminusJet); - registryMC.fill(HIST("pi_minus_gen_in_ue"), multiplicity, mcParticle.pt(), wPiminusUe); + registryMC.fill(HIST("mc_pi_minus/in_jet/gen"), multiplicity, mcParticle.pt(), wPiminusJet); + registryMC.fill(HIST("mc_pi_minus/in_ue/gen"), multiplicity, mcParticle.pt(), wPiminusUe); registryMC.fill(HIST("pi_minus_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); break; + case 321: // Ka+ + registryMC.fill(HIST("mc_ka_plus/in_jet/gen"), multiplicity, mcParticle.pt(), wKaplusJet); + registryMC.fill(HIST("mc_ka_plus/in_ue/gen"), multiplicity, mcParticle.pt(), wKaplusUe); + registryMC.fill(HIST("ka_plus_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); + break; + case -321: // Ka- + registryMC.fill(HIST("mc_ka_minus/in_jet/gen"), multiplicity, mcParticle.pt(), wKaminusJet); + registryMC.fill(HIST("mc_ka_minus/in_ue/gen"), multiplicity, mcParticle.pt(), wKaminusUe); + registryMC.fill(HIST("ka_minus_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); + break; + case 2212: // Pr+ + registryMC.fill(HIST("mc_pr_plus/in_jet/gen"), multiplicity, mcParticle.pt(), wPrplusJet); + registryMC.fill(HIST("mc_pr_plus/in_ue/gen"), multiplicity, mcParticle.pt(), wPrplusUe); + registryMC.fill(HIST("pr_plus_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); + break; + case -2212: // Pr- + registryMC.fill(HIST("mc_pr_minus/in_jet/gen"), multiplicity, mcParticle.pt(), wPrminusJet); + registryMC.fill(HIST("mc_pr_minus/in_ue/gen"), multiplicity, mcParticle.pt(), wPrminusUe); + registryMC.fill(HIST("pr_minus_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); + break; case 310: // K0s registryMC.fill(HIST("K0s_generated_jet"), multiplicity, mcParticle.pt(), wK0jet); registryMC.fill(HIST("K0s_generated_ue"), multiplicity, mcParticle.pt(), wK0Ue); @@ -2062,6 +2200,38 @@ struct StrangenessInJets { registryMC.fill(HIST("pi_minus_eta_pt_ue"), particle.pt(), particle.eta()); } break; + case 321: + if (deltaRjet < rJet) { + registryMC.fill(HIST("pi_plus_eta_pt_jet"), particle.pt(), particle.eta()); + } + if (deltaRue1 < rJet || deltaRue2 < rJet) { + registryMC.fill(HIST("pi_plus_eta_pt_ue"), particle.pt(), particle.eta()); + } + break; + case -321: + if (deltaRjet < rJet) { + registryMC.fill(HIST("pi_minus_eta_pt_jet"), particle.pt(), particle.eta()); + } + if (deltaRue1 < rJet || deltaRue2 < rJet) { + registryMC.fill(HIST("pi_minus_eta_pt_ue"), particle.pt(), particle.eta()); + } + break; + case 2212: + if (deltaRjet < rJet) { + registryMC.fill(HIST("pi_plus_eta_pt_jet"), particle.pt(), particle.eta()); + } + if (deltaRue1 < rJet || deltaRue2 < rJet) { + registryMC.fill(HIST("pi_plus_eta_pt_ue"), particle.pt(), particle.eta()); + } + break; + case -2212: + if (deltaRjet < rJet) { + registryMC.fill(HIST("pi_minus_eta_pt_jet"), particle.pt(), particle.eta()); + } + if (deltaRue1 < rJet || deltaRue2 < rJet) { + registryMC.fill(HIST("pi_minus_eta_pt_ue"), particle.pt(), particle.eta()); + } + break; case 310: if (deltaRjet < rJet) { registryMC.fill(HIST("K0s_eta_pt_jet"), particle.pt(), particle.eta()); From 6a45c0adfdd7712a5bc2ffb9238bacdc3000995d Mon Sep 17 00:00:00 2001 From: Pritam Chakraborty <47203359+prchakra@users.noreply.github.com> Date: Mon, 17 Feb 2025 22:30:32 +0100 Subject: [PATCH 0281/1650] [PWGCF] FemtoUnivserse: Filling resolution matrix for 2kstar (#10030) --- .../FemtoUniverse/Core/FemtoUniverseContainer.h | 14 +++++++++++--- ...niversePairTaskTrackTrack3DMultKtExtended.cxx | 16 ++++++++-------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseContainer.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseContainer.h index bd6484abcd7..67dce9fc125 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseContainer.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseContainer.h @@ -226,12 +226,16 @@ class FemtoUniverseContainer /// \param part2 Particle two /// \param mult Multiplicity of the event template - void setPair(T const& part1, T const& part2, const int mult, bool use3dplots, float weight = 1.0f) + void setPair(T const& part1, T const& part2, const int mult, bool use3dplots, float weight = 1.0f, bool isiden = false) { float femtoObs, femtoObsMC; // Calculate femto observable and the mT with reconstructed information if constexpr (FemtoObs == femto_universe_container::Observable::kstar) { - femtoObs = FemtoUniverseMath::getkstar(part1, mMassOne, part2, mMassTwo); + if (!isiden) { + femtoObs = FemtoUniverseMath::getkstar(part1, mMassOne, part2, mMassTwo); + } else { + femtoObs = 2.0 * FemtoUniverseMath::getkstar(part1, mMassOne, part2, mMassTwo); + } } const float mT = FemtoUniverseMath::getmT(part1, mMassOne, part2, mMassTwo); @@ -242,7 +246,11 @@ class FemtoUniverseContainer if (part1.has_fdMCParticle() && part2.has_fdMCParticle()) { // calculate the femto observable and the mT with MC truth information if constexpr (FemtoObs == femto_universe_container::Observable::kstar) { - femtoObsMC = FemtoUniverseMath::getkstar(part1.fdMCParticle(), mMassOne, part2.fdMCParticle(), mMassTwo); + if (!isiden) { + femtoObsMC = FemtoUniverseMath::getkstar(part1.fdMCParticle(), mMassOne, part2.fdMCParticle(), mMassTwo); + } else { + femtoObsMC = 2.0 * FemtoUniverseMath::getkstar(part1.fdMCParticle(), mMassOne, part2.fdMCParticle(), mMassTwo); + } } const float mTMC = FemtoUniverseMath::getmT(part1.fdMCParticle(), mMassOne, part2.fdMCParticle(), mMassTwo); diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack3DMultKtExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack3DMultKtExtended.cxx index 9fb4531076f..5a3c67cf461 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack3DMultKtExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack3DMultKtExtended.cxx @@ -546,9 +546,9 @@ struct femtoUniversePairTaskTrackTrack3DMultKtExtended { } float weight = 1.0f; if constexpr (std::is_same::value) { - sameEventCont1D.setPair(p1, p2, multCol, twotracksconfigs.ConfUse3D, weight); + sameEventCont1D.setPair(p1, p2, multCol, twotracksconfigs.ConfUse3D, weight, ConfIsIden); } else { - sameEventCont1D.setPair(p1, p2, multCol, twotracksconfigs.ConfUse3D, weight); + sameEventCont1D.setPair(p1, p2, multCol, twotracksconfigs.ConfUse3D, weight, ConfIsIden); } } else { if (!cfgProcessMultBins) { @@ -559,9 +559,9 @@ struct femtoUniversePairTaskTrackTrack3DMultKtExtended { } float weight = 1.0f; if constexpr (std::is_same::value) { - sameEventCont1D.setPair(p1, p2, multCol, twotracksconfigs.ConfUse3D, weight); + sameEventCont1D.setPair(p1, p2, multCol, twotracksconfigs.ConfUse3D, weight, ConfIsIden); } else { - sameEventCont1D.setPair(p1, p2, multCol, twotracksconfigs.ConfUse3D, weight); + sameEventCont1D.setPair(p1, p2, multCol, twotracksconfigs.ConfUse3D, weight, ConfIsIden); } } break; @@ -581,9 +581,9 @@ struct femtoUniversePairTaskTrackTrack3DMultKtExtended { } float weight = 1.0f; if constexpr (std::is_same::value) { - sameEventCont1D.setPair(p1, p2, multCol, twotracksconfigs.ConfUse3D, weight); + sameEventCont1D.setPair(p1, p2, multCol, twotracksconfigs.ConfUse3D, weight, ConfIsIden); } else { - sameEventCont1D.setPair(p1, p2, multCol, twotracksconfigs.ConfUse3D, weight); + sameEventCont1D.setPair(p1, p2, multCol, twotracksconfigs.ConfUse3D, weight, ConfIsIden); } } else { if (!cfgProcessMultBins) { @@ -594,9 +594,9 @@ struct femtoUniversePairTaskTrackTrack3DMultKtExtended { } float weight = 1.0f; if constexpr (std::is_same::value) { - sameEventCont1D.setPair(p1, p2, multCol, twotracksconfigs.ConfUse3D, weight); + sameEventCont1D.setPair(p1, p2, multCol, twotracksconfigs.ConfUse3D, weight, ConfIsIden); } else { - sameEventCont1D.setPair(p1, p2, multCol, twotracksconfigs.ConfUse3D, weight); + sameEventCont1D.setPair(p1, p2, multCol, twotracksconfigs.ConfUse3D, weight, ConfIsIden); } } break; From f7617de401c1794a53562db7c8b3ebe1a401cb68 Mon Sep 17 00:00:00 2001 From: nzardosh Date: Tue, 18 Feb 2025 01:33:13 +0100 Subject: [PATCH 0282/1650] [PWGJE] splitting process functions in substrcutre outputs for powheg (#10028) --- PWGJE/Tasks/jetSubstructureHFOutput.cxx | 12 ++++++++---- PWGJE/Tasks/jetSubstructureOutput.cxx | 7 ++++++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/PWGJE/Tasks/jetSubstructureHFOutput.cxx b/PWGJE/Tasks/jetSubstructureHFOutput.cxx index 2e47f204787..266fb7aba7c 100644 --- a/PWGJE/Tasks/jetSubstructureHFOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureHFOutput.cxx @@ -377,16 +377,20 @@ struct JetSubstructureHFOutputTask { void processClearMaps(aod::JetCollisions const&) { candidateMapping.clear(); - candidateCollisionMapping.clear(); - candidateMappingMCP.clear(); jetMappingData.clear(); jetMappingDataSub.clear(); jetMappingMCD.clear(); - jetMappingMCP.clear(); candidateCollisionMapping.clear(); + } + PROCESS_SWITCH(JetSubstructureHFOutputTask, processClearMaps, "process function that clears all the non-mcp maps in each dataframe", true); + + void processClearMapsMCP(aod::JetMcCollisions const&) + { + candidateMappingMCP.clear(); + jetMappingMCP.clear(); candidateMcCollisionMapping.clear(); } - PROCESS_SWITCH(JetSubstructureHFOutputTask, processClearMaps, "process function that clears all the maps in each dataframe", true); + PROCESS_SWITCH(JetSubstructureHFOutputTask, processClearMapsMCP, "process function that clears all the mcp maps in each dataframe", true); void processOutputCollisionsData(aod::JetCollisions const& collisions, JetTableData const& jets, diff --git a/PWGJE/Tasks/jetSubstructureOutput.cxx b/PWGJE/Tasks/jetSubstructureOutput.cxx index 602c6526523..c4899b7a8af 100644 --- a/PWGJE/Tasks/jetSubstructureOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureOutput.cxx @@ -193,9 +193,14 @@ struct JetSubstructureOutputTask { jetMappingData.clear(); jetMappingDataSub.clear(); jetMappingMCD.clear(); + } + PROCESS_SWITCH(JetSubstructureOutputTask, processClearMaps, "process function that clears all the non-mcp maps in each dataframe", true); + + void processClearMapsMCP(aod::JetMcCollisions const&) + { jetMappingMCP.clear(); } - PROCESS_SWITCH(JetSubstructureOutputTask, processClearMaps, "process function that clears all the maps in each dataframe", true); + PROCESS_SWITCH(JetSubstructureOutputTask, processClearMapsMCP, "process function that clears all the mcp maps in each dataframe", true); void processOutputData(aod::JetCollision const& collision, soa::Join const& jets) From c429b4c589b80353eb211c3c7d23600186245256 Mon Sep 17 00:00:00 2001 From: omvazque Date: Mon, 17 Feb 2025 23:35:29 -0600 Subject: [PATCH 0283/1650] [PWGLF] Adds occupancy cut (#10027) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 104 +++++++++---------- 1 file changed, 50 insertions(+), 54 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index 4e098871b14..5d163088962 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -110,14 +110,17 @@ struct UccZdc { ConfigurableAxis binsCent{"binsCent", {VARIABLE_WIDTH, 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.}, "T0C binning"}; // Configurable event selectiond and flags ZDC + Configurable isOccupancyCut{"isOccupancyCut", true, "Occupancy cut?"}; + Configurable isApplyFT0CbasedOccupancy{"isApplyFT0CbasedOccupancy", + false, "T0C Occu cut?"}; Configurable isApplySameBunchPileup{"isApplySameBunchPileup", true, - "Enable SameBunchPileup cut"}; + "SameBunchPileup cut?"}; Configurable isApplyGoodZvtxFT0vsPV{"isApplyGoodZvtxFT0vsPV", true, - "Enable GoodZvtxFT0vsPV cut"}; + "GoodZvtxFT0vsPV cut?"}; Configurable isApplyVertexITSTPC{"isApplyVertexITSTPC", true, - "Enable VertexITSTPC cut"}; + "VertexITSTPC cut?"}; Configurable isApplyVertexTOFmatched{"isApplyVertexTOFmatched", true, - "Enable VertexTOFmatched cut"}; + "VertexTOFmatched cut?"}; Configurable isAmpZDC{"isAmpZDC", false, "Use amplitude ZDC?"}; Configurable isCommPMT{"isCommPMT", false, "Use common PMT ZDC?"}; Configurable isSumTowers{"isSumTowers", false, "Use sum of Tow ZDC?"}; @@ -125,20 +128,25 @@ struct UccZdc { Configurable isZEMcut{"isZEMcut", true, "Use ZEM cut?"}; Configurable zemCut{"zemCut", 1000.0, "ZEM cut"}; Configurable tdcCut{"tdcCut", 1.0, "TDC cut"}; - - enum EvCutLabel { All = 1, - SelEigth, - NoSameBunchPileup, - IsGoodZvtxFT0vsPV, - IsVertexITSTPC, - IsVertexTOFmatched, - Centrality, - VtxZ, - CentralityCut, - Zdc, - TZero, - Tdc, - Zem }; + Configurable minOccCut{"minOccCut", 0, "min Occu cut"}; + Configurable maxOccCut{"maxOccCut", 500, "max Occu cut"}; + + enum EvCutLabel { + All = 1, + SelEigth, + NoSameBunchPileup, + IsGoodZvtxFT0vsPV, + IsVertexITSTPC, + IsVertexTOFmatched, + OccuCut, + Centrality, + VtxZ, + CentralityCut, + Zdc, + TZero, + Tdc, + Zem + }; // Filters Filter collFilter = (nabs(aod::collision::posZ) < posZcut); @@ -177,19 +185,20 @@ struct UccZdc { registry.add("hEventCounter", ";;Events", kTH1F, {axisEvent}); auto hstat = registry.get(HIST("hEventCounter")); auto* x = hstat->GetXaxis(); - x->SetBinLabel(1, "All events"); - x->SetBinLabel(2, "sel8"); - x->SetBinLabel(3, "kNoSameBunchPileup"); - x->SetBinLabel(4, "kIsGoodZvtxFT0vsPV"); - x->SetBinLabel(5, "kIsVertexITSTPC"); - x->SetBinLabel(6, "kIsVertexTOFmatched"); - x->SetBinLabel(7, "Centrality"); - x->SetBinLabel(8, "VtxZ"); - x->SetBinLabel(9, "Centrality cut"); - x->SetBinLabel(10, "has ZDC?"); - x->SetBinLabel(11, "has T0?"); - x->SetBinLabel(12, "inside TDC cut?"); - x->SetBinLabel(13, "within ZEM cut?"); + x->SetBinLabel(1, "All"); + x->SetBinLabel(2, "SelEigth"); + x->SetBinLabel(3, "NoSameBunchPileup"); + x->SetBinLabel(4, "IsGoodZvtxFT0vsPV"); + x->SetBinLabel(5, "IsVertexITSTPC"); + x->SetBinLabel(6, "IsVertexTOFmatched"); + x->SetBinLabel(7, "Occupancy Cut"); + x->SetBinLabel(8, "Centrality"); + x->SetBinLabel(9, "VtxZ cut"); + x->SetBinLabel(10, "Centrality cut"); + x->SetBinLabel(11, "has ZDC?"); + x->SetBinLabel(12, "has T0?"); + x->SetBinLabel(13, "Within TDC cut?"); + x->SetBinLabel(14, "Within ZEM cut?"); // Histograms: paritcle-level info if (doprocessZdcCollAss) { @@ -323,6 +332,16 @@ struct UccZdc { } registry.fill(HIST("hEventCounter"), EvCutLabel::IsVertexTOFmatched); + if (isOccupancyCut) { + auto occuValue{isApplyFT0CbasedOccupancy + ? col.ft0cOccupancyInTimeRange() + : col.trackOccupancyInTimeRange()}; + + if (occuValue < minOccCut || occuValue > maxOccCut) + return false; + } + registry.fill(HIST("hEventCounter"), EvCutLabel::OccuCut); + // if (isApplyVertexTRDmatched && // !col.selection_bit(o2::aod::evsel::kIsVertexTRDmatched)) { // return false; @@ -346,29 +365,6 @@ struct UccZdc { } registry.fill(HIST("hEventCounter"), EvCutLabel::CentralityCut); - // if (isApplyExtraCorrCut && col.multNTracksPV() > npvTracksCut && - // col.multFT0C() < (10 * col.multNTracksPV() - ft0cCut)) { - // return false; - // } - // histos.fill(HIST("EventHist"), 9); - // - // if (isApplyNoCollInTimeRangeStandard && - // !col.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { - // return false; - // } - // histos.fill(HIST("EventHist"), 10); - // - // if (isApplyNoCollInRofStandard && - // !col.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { - // return false; - // } - // histos.fill(HIST("EventHist"), 11); - // - // if (isApplyNoHighMultCollInPrevRof && - // !col.selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof)) { - // return false; - // } - // histos.fill(HIST("EventHist"), 12); return true; } From 2a99d229643f9243ed7828dfd14cda9dbc2cd636 Mon Sep 17 00:00:00 2001 From: sarjeetagami <162087855+sarjeetagami@users.noreply.github.com> Date: Tue, 18 Feb 2025 12:42:40 +0530 Subject: [PATCH 0284/1650] [PWGLF] added different combinatorial bkg for phi and kstar task (#10018) Co-authored-by: sarjeeta gami --- PWGLF/Tasks/Resonances/kstarpbpb.cxx | 137 +++++------------- .../Tasks/Resonances/phianalysisrun3_PbPb.cxx | 120 +++++++++++++-- 2 files changed, 142 insertions(+), 115 deletions(-) diff --git a/PWGLF/Tasks/Resonances/kstarpbpb.cxx b/PWGLF/Tasks/Resonances/kstarpbpb.cxx index 356def5dedd..2275d62d05d 100644 --- a/PWGLF/Tasks/Resonances/kstarpbpb.cxx +++ b/PWGLF/Tasks/Resonances/kstarpbpb.cxx @@ -123,7 +123,6 @@ struct kstarpbpb { Configurable fillRotation{"fillRotation", true, "fill rotation"}; Configurable same{"same", true, "same event"}; Configurable like{"like", false, "like-sign"}; - Configurable mix{"mix", false, "mix"}; Configurable fillOccupancy{"fillOccupancy", false, "fill Occupancy"}; Configurable cfgOccupancyCut{"cfgOccupancyCut", 500, "Occupancy cut"}; Configurable useWeight{"useWeight", false, "use EP dep effi weight"}; @@ -161,9 +160,9 @@ struct kstarpbpb { AxisSpec resAxis = {6000, -30, 30, "Res"}; AxisSpec centAxis = {8, 0, 80, "V0M (%)"}; AxisSpec occupancyAxis = {occupancyBinning, "Occupancy"}; - - histos.add("hSparseV2SASameEvent_V2", "hSparseV2SASameEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); - + if (same) { + histos.add("hSparseV2SASameEvent_V2", "hSparseV2SASameEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); + } if (like) { histos.add("hSparseV2SAlikeEventNN_V2", "hSparseV2SAlikeEventNN_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); histos.add("hSparseV2SAlikeEventPP_V2", "hSparseV2SAlikeEventPP_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); @@ -172,9 +171,8 @@ struct kstarpbpb { histos.add("hRotation", "hRotation", kTH1F, {{360, 0.0, 2.0 * TMath::Pi()}}); histos.add("hSparseV2SASameEventRotational_V2", "hSparseV2SASameEventRotational_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); } - if (mix) { - histos.add("hSparseV2SAMixedEvent_V2", "hSparseV2SAMixedEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); - } + + histos.add("hSparseV2SAMixedEvent_V2", "hSparseV2SAMixedEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); if (additionalQAplots1) { histos.add("hFTOCvsTPCSelected", "Mult correlation FT0C vs. TPC after selection", kTH2F, {{80, 0.0f, 80.0f}, {100, -0.5f, 5999.5f}}); @@ -514,6 +512,7 @@ struct kstarpbpb { if (!track1kaon || !track2pion) { continue; } + if (useWeight) { if (track2.pt() < 10.0 && track2.pt() > 0.15) { weight2 = hweight->GetBinContent(hweight->FindBin(centrality, GetPhiInRange(track2.phi() - psiFT0C), track2.pt() + 0.000005)); @@ -534,11 +533,12 @@ struct kstarpbpb { if (totalweight <= 0.0005) { totalweight = 1.0; } - - if (useWeight) { - histos.fill(HIST("hSparseV2SASameEvent_V2"), KstarMother.M(), KstarMother.Pt(), v2, centrality, 1 / totalweight); - } else { - histos.fill(HIST("hSparseV2SASameEvent_V2"), KstarMother.M(), KstarMother.Pt(), v2, centrality); + if (same) { + if (useWeight) { + histos.fill(HIST("hSparseV2SASameEvent_V2"), KstarMother.M(), KstarMother.Pt(), v2, centrality, 1 / totalweight); + } else { + histos.fill(HIST("hSparseV2SASameEvent_V2"), KstarMother.M(), KstarMother.Pt(), v2, centrality); + } } if (fillRotation) { for (int nrotbkg = 0; nrotbkg < nBkgRotations; nrotbkg++) { @@ -889,124 +889,65 @@ struct kstarpbpb { } PROCESS_SWITCH(kstarpbpb, processlikeEvent, "Process like event", false); - void processMixedEvent(EventCandidates const& collisions, TrackCandidates const& /*tracks*/) + void processMixedEvent(EventCandidates const& collisions, TrackCandidates const& tracks) { + + auto tracksTuple = std::make_tuple(tracks); BinningTypeVertexContributor binningOnPositions{{axisVertex, axisMultiplicityClass, axisEPAngle}, true}; - for (auto const& [collision1, collision2] : o2::soa::selfCombinations(binningOnPositions, cfgNoMixedEvents, -1, collisions, collisions)) { - if (!collision1.sel8() || !collision2.sel8()) { - // printf("Mix = %d\n", 1); - continue; - } - if (!collision1.triggereventep() || !collision2.triggereventep()) { - // printf("Mix = %d\n", 2); + SameKindPair pair{binningOnPositions, cfgNoMixedEvents, -1, collisions, tracksTuple, &cache}; + for (auto& [collision1, tracks1, collision2, tracks2] : pair) { + if (!collision1.sel8() || !collision1.triggereventep() || !collision1.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision1.selection_bit(aod::evsel::kNoITSROFrameBorder) || !collision1.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision1.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV) || !collision1.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { continue; } - if (timFrameEvsel && (!collision1.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision2.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision1.selection_bit(aod::evsel::kNoITSROFrameBorder) || !collision2.selection_bit(aod::evsel::kNoITSROFrameBorder))) { - // printf("Mix = %d\n", 3); + if (!collision2.sel8() || !collision2.triggereventep() || !collision2.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision2.selection_bit(aod::evsel::kNoITSROFrameBorder) || !collision2.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision2.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV) || !collision2.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { continue; } - if (additionalEvSel2 && (!collision1.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision1.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { - continue; - } - if (additionalEvSel2 && (!collision2.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision2.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { - continue; - } - if (additionalEvSel3 && (!collision1.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard))) { - continue; - } - if (additionalEvSel3 && (!collision2.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard))) { - continue; - } - if (additionalEvselITS && !collision1.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { - continue; - } - if (additionalEvselITS && !collision2.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + if (collision1.bcId() == collision2.bcId()) { continue; } int occupancy1 = collision1.trackOccupancyInTimeRange(); int occupancy2 = collision2.trackOccupancyInTimeRange(); - auto posThisColl = posTracks->sliceByCached(aod::track::collisionId, collision1.globalIndex(), cache); - auto negThisColl = negTracks->sliceByCached(aod::track::collisionId, collision2.globalIndex(), cache); + if (fillOccupancy && occupancy1 >= cfgOccupancyCut && occupancy2 >= cfgOccupancyCut) // occupancy info is available for this collision (*) + { + continue; + } auto centrality = collision1.centFT0C(); auto centrality2 = collision2.centFT0C(); auto psiFT0C = collision1.psiFT0C(); auto QFT0C = collision1.qFT0C(); - bool track1pion = false; - bool track1kaon = false; - bool track2pion = false; - bool track2kaon = false; if (additionalEvsel && !eventSelected(collision1, centrality)) { - // printf("Mix = %d\n", 4); continue; } if (additionalEvsel && !eventSelected(collision2, centrality2)) { - // printf("Mix = %d\n", 5); continue; } - if (fillOccupancy && occupancy1 >= cfgOccupancyCut && occupancy2 >= cfgOccupancyCut) // occupancy info is available for this collision (*) - { + if (additionalEvselITS && !collision1.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { continue; } - for (auto& [track1, track2] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(posThisColl, negThisColl))) { + if (additionalEvselITS && !collision2.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + continue; + } + + for (auto& [track1, track2] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { // track selection if (!selectionTrack(track1) || !selectionTrack(track2)) { // printf("Mix = %d\n", 6); continue; } - if (ispTdepPID && !(selectionPIDNew(track1, 0) || selectionPIDNew(track1, 1))) { + if (ispTdepPID && !(selectionPIDNew(track1, 0))) { continue; } - if (ispTdepPID && !(selectionPIDNew(track2, 1) || selectionPIDNew(track2, 0))) { + if (ispTdepPID && !(selectionPIDNew(track2, 1))) { continue; } - if (!ispTdepPID && !(selectionPID(track1, 0) || selectionPID(track1, 1))) { + if (!ispTdepPID && !(selectionPID(track1, 0))) { continue; } - if (!ispTdepPID && !(selectionPID(track2, 1) || selectionPID(track2, 0))) { - continue; - } - - if (ispTdepPID) { - if (selectionPIDNew(track1, 1) && selectionPIDNew(track2, 0)) { - track1pion = true; - track2kaon = true; - if (removefaketrak && isFakeKaon(track2, 0)) { - continue; - } - } - if (selectionPIDNew(track2, 1) && selectionPIDNew(track1, 0)) { - track2pion = true; - track1kaon = true; - if (removefaketrak && isFakeKaon(track1, 0)) { - continue; - } - } - } - if (!ispTdepPID) { - if (selectionPID(track1, 1) && selectionPID(track2, 0)) { - track1pion = true; - track2kaon = true; - if (removefaketrak && isFakeKaon(track2, 0)) { - continue; - } - } - if (selectionPID(track2, 1) && selectionPID(track1, 0)) { - track2pion = true; - track1kaon = true; - if (removefaketrak && isFakeKaon(track1, 0)) { - continue; - } - } - } - if (track1kaon && track2pion) { - daughter1 = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); - daughter2 = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massPi); - } else if (track1pion && track2kaon) { - daughter1 = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massPi); - daughter2 = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massKa); - } else { + if (!ispTdepPID && !(selectionPID(track2, 1))) { continue; } + daughter1 = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); + daughter2 = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massPi); KstarMother = daughter1 + daughter2; if (TMath::Abs(KstarMother.Rapidity()) > confRapidity) { continue; @@ -1015,13 +956,11 @@ struct kstarpbpb { v2 = TMath::Cos(2.0 * phiminuspsi) * QFT0C; - if (mix) { - histos.fill(HIST("hSparseV2SAMixedEvent_V2"), KstarMother.M(), KstarMother.Pt(), v2, centrality); - } + histos.fill(HIST("hSparseV2SAMixedEvent_V2"), KstarMother.M(), KstarMother.Pt(), v2, centrality); } } } - PROCESS_SWITCH(kstarpbpb, processMixedEvent, "Process Mixed event", false); + PROCESS_SWITCH(kstarpbpb, processMixedEvent, "Process Mixed event", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx b/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx index 51af74455f2..f079e7e8a28 100644 --- a/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx +++ b/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx @@ -92,6 +92,10 @@ struct phianalysisrun3_PbPb { Configurable timFrameEvsel{"timFrameEvsel", false, "TPC Time frame boundary cut"}; Configurable isDeepAngle{"isDeepAngle", false, "Deep Angle cut"}; Configurable cfgDeepAngle{"cfgDeepAngle", 0.04, "Deep Angle cut value"}; + Configurable nBkgRotations{"nBkgRotations", 3, "Number of rotated copies (background) per each original candidate"}; + Configurable fillRotation{"fillRotation", true, "fill rotation"}; + Configurable confMinRot{"confMinRot", 5.0 * TMath::Pi() / 6.0, "Minimum of rotation"}; + Configurable confMaxRot{"confMaxRot", 7.0 * TMath::Pi() / 6.0, "Maximum of rotation"}; Configurable genacceptancecut{"genacceptancecut", true, "use acceptance cut for generated"}; // MC @@ -106,9 +110,12 @@ struct phianalysisrun3_PbPb { if (!isMC) { histos.add("h3PhiInvMassUnlikeSign", "Invariant mass of Phi meson Unlike Sign", kTH3F, {{200, 0.0, 200.0}, {200, 0.0f, 20.0f}, {200, 0.9, 1.1}}); histos.add("h3PhiInvMassMixed", "Invariant mass of Phi meson Mixed", kTH3F, {{200, 0.0, 200.0}, {200, 0.0f, 20.0f}, {200, 0.9, 1.1}}); + histos.add("h3PhiInvMassRot", "Invariant mass of Phi meson Rotation", kTH3F, {{200, 0.0, 200.0}, {200, 0.0f, 20.0f}, {200, 0.9, 1.1}}); + histos.add("h3PhiInvMassSame", "Invariant mass of Phi meson same", kTH3F, {{200, 0.0, 200.0}, {200, 0.0f, 20.0f}, {200, 0.9, 1.1}}); } else if (isMC) { histos.add("hMC", "MC Event statistics", kTH1F, {{10, 0.0f, 10.0f}}); histos.add("h1PhiGen", "Phi meson Gen", kTH1F, {{200, 0.0f, 20.0f}}); + histos.add("h1PhiGen1", "Phi meson Gen", kTH1F, {{200, 0.0f, 20.0f}}); histos.add("h1PhiRecsplit", "Phi meson Rec split", kTH1F, {{200, 0.0f, 20.0f}}); histos.add("Centrec", "MC Centrality", kTH1F, {{200, 0.0, 200.0}}); histos.add("Centgen", "MC Centrality", kTH1F, {{200, 0.0, 200.0}}); @@ -120,6 +127,8 @@ struct phianalysisrun3_PbPb { histos.add("h1Phimassrec", "Phi meson Rec", kTH1F, {{200, 0.9, 1.1}}); histos.add("h1Phipt", "Phi meson Rec", kTH1F, {{200, 0.0f, 20.0f}}); histos.add("hOccupancy1", "Occupancy distribution", kTH1F, {{500, 0, 50000}}); + histos.add("TOF_Nsigma_MC", "TOF NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Kaon};", {HistType::kTH2D, {{200, -12, 12}, {200, 0.0, 200.0}}}); + histos.add("TPC_Nsigma_MC", "TPC NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Kaon};", {HistType::kTH2D, {{200, -12, 12}, {200, 0.0, 200.0}}}); } // DCA QA @@ -129,12 +138,12 @@ struct phianalysisrun3_PbPb { histos.add("QAafter/trkDCAz", "DCAz distribution of kaon track candidates", HistType::kTH1F, {{150, 0.0f, 1.0f}}); // PID QA before cuts histos.add("QAbefore/TOF_TPC_Mapka_all", "TOF + TPC Combined PID for Kaon;#sigma_{TOF}^{Kaon};#sigma_{TPC}^{Kaon}", {HistType::kTH2D, {{100, -6, 6}, {100, -6, 6}}}); - histos.add("QAbefore/TOF_Nsigma_all", "TOF NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Kaon};", {HistType::kTH2D, {{200, 0.0, 20.0}, {100, -6, 6}}}); - histos.add("QAbefore/TPC_Nsigma_all", "TPC NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Kaon};", {HistType::kTH2D, {{200, 0.0, 20.0}, {100, -6, 6}}}); + histos.add("QAbefore/TOF_Nsigma_all", "TOF NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Kaon};", {HistType::kTH2D, {{100, -6, 6}, {200, 0.0, 200.0}}}); + histos.add("QAbefore/TPC_Nsigma_all", "TPC NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Kaon};", {HistType::kTH2D, {{100, -6, 6}, {200, 0.0, 200.0}}}); // PID QA after cuts histos.add("QAafter/TOF_TPC_Mapka_all", "TOF + TPC Combined PID for Kaon;#sigma_{TOF}^{Kaon};#sigma_{TPC}^{Kaon}", {HistType::kTH2D, {{100, -6, 6}, {100, -6, 6}}}); - histos.add("QAafter/TOF_Nsigma_all", "TOF NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Kaon};", {HistType::kTH2D, {{200, 0.0, 20.0}, {100, -6, 6}}}); - histos.add("QAafter/TPC_Nsigma_all", "TPC NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Kaon};", {HistType::kTH2D, {{200, 0.0, 20.0}, {100, -6, 6}}}); + histos.add("QAafter/TOF_Nsigma_all", "TOF NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Kaon};", {HistType::kTH2D, {{100, -6, 6}, {200, 0.0, 200.0}}}); + histos.add("QAafter/TPC_Nsigma_all", "TPC NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Kaon};", {HistType::kTH2D, {{100, -6, 6}, {200, 0.0, 200.0}}}); } double massKa = o2::constants::physics::MassKPlus; @@ -275,8 +284,8 @@ struct phianalysisrun3_PbPb { if (!selectionTrack(track1)) { continue; } - histos.fill(HIST("QAbefore/TPC_Nsigma_all"), track1.pt(), track1.tpcNSigmaKa()); - histos.fill(HIST("QAbefore/TOF_Nsigma_all"), track1.pt(), track1.tofNSigmaKa()); + histos.fill(HIST("QAbefore/TPC_Nsigma_all"), track1.tpcNSigmaKa(), multiplicity); + histos.fill(HIST("QAbefore/TOF_Nsigma_all"), track1.tofNSigmaKa(), multiplicity); histos.fill(HIST("QAbefore/trkDCAxy"), track1.dcaXY()); histos.fill(HIST("QAbefore/trkDCAz"), track1.dcaZ()); histos.fill(HIST("QAbefore/TOF_TPC_Mapka_all"), track1.tofNSigmaKa(), track1.tpcNSigmaKa()); @@ -296,16 +305,16 @@ struct phianalysisrun3_PbPb { bool unlike = true; bool mix = false; if (!ispTdepPID && selectionPID(track1) && selectionPID(track2)) { - histos.fill(HIST("QAafter/TPC_Nsigma_all"), track1.pt(), track1.tpcNSigmaKa()); - histos.fill(HIST("QAafter/TOF_Nsigma_all"), track1.pt(), track1.tofNSigmaKa()); + histos.fill(HIST("QAafter/TPC_Nsigma_all"), track1.tpcNSigmaKa(), multiplicity); + histos.fill(HIST("QAafter/TOF_Nsigma_all"), track1.tofNSigmaKa(), multiplicity); histos.fill(HIST("QAafter/trkDCAxy"), track1.dcaXY()); histos.fill(HIST("QAafter/trkDCAz"), track1.dcaZ()); histos.fill(HIST("QAafter/TOF_TPC_Mapka_all"), track1.tofNSigmaKa(), track1.tpcNSigmaKa()); FillinvMass(track1, track2, multiplicity, unlike, mix, massKa, massKa); } if (ispTdepPID && selectionPIDpTdependent(track1) && selectionPIDpTdependent(track2)) { - histos.fill(HIST("QAafter/TPC_Nsigma_all"), track1.pt(), track1.tpcNSigmaKa()); - histos.fill(HIST("QAafter/TOF_Nsigma_all"), track1.pt(), track1.tofNSigmaKa()); + histos.fill(HIST("QAafter/TPC_Nsigma_all"), track1.tpcNSigmaKa(), multiplicity); + histos.fill(HIST("QAafter/TOF_Nsigma_all"), track1.tofNSigmaKa(), multiplicity); histos.fill(HIST("QAafter/trkDCAxy"), track1.dcaXY()); histos.fill(HIST("QAafter/trkDCAz"), track1.dcaZ()); histos.fill(HIST("QAafter/TOF_TPC_Mapka_all"), track1.tofNSigmaKa(), track1.tpcNSigmaKa()); @@ -378,7 +387,88 @@ struct phianalysisrun3_PbPb { } PROCESS_SWITCH(phianalysisrun3_PbPb, processMixedEvent, "Process Mixed event", false); + void processRotEvent(EventCandidates::iterator const& collision, TrackCandidates const& tracks, aod::BCs const&) + { + if (!collision.sel8()) { + return; + } + if (additionalEvSel2 && (!collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { + return; + } + if (additionalEvSel3 && (!collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard))) { + return; + } + int occupancy = collision.trackOccupancyInTimeRange(); + if (fillOccupancy && !(occupancy > cfgOccupancyCut1 && occupancy < cfgOccupancyCut2)) { + return; + } + float multiplicity{-1}; + if (cfgMultFT0) + multiplicity = collision.centFT0C(); + histos.fill(HIST("hCentrality"), multiplicity); + histos.fill(HIST("hVtxZ"), collision.posZ()); + histos.fill(HIST("hOccupancy"), occupancy); + for (auto track1 : tracks) { + if (!selectionTrack(track1)) { + continue; + } + histos.fill(HIST("QAbefore/TPC_Nsigma_all"), track1.tpcNSigmaKa(), multiplicity); + histos.fill(HIST("QAbefore/TOF_Nsigma_all"), track1.tofNSigmaKa(), multiplicity); + histos.fill(HIST("QAbefore/trkDCAxy"), track1.dcaXY()); + histos.fill(HIST("QAbefore/trkDCAz"), track1.dcaZ()); + histos.fill(HIST("QAbefore/TOF_TPC_Mapka_all"), track1.tofNSigmaKa(), track1.tpcNSigmaKa()); + + auto track1ID = track1.globalIndex(); + for (auto track2 : tracks) { + if (!selectionTrack(track2)) { + continue; + } + auto track2ID = track2.globalIndex(); + if (track2ID <= track1ID) { + continue; + } + if (!selectionPair(track1, track2)) { + continue; + } + if (!ispTdepPID && (!selectionPID(track1) || !selectionPID(track2))) { + continue; + } + if (ispTdepPID && (!selectionPIDpTdependent(track1) || !selectionPIDpTdependent(track2))) { + continue; + } + if (track1.sign() * track2.sign() < 0) { + KaonPlus = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); + KaonMinus = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massKa); + } + PhiMesonMother = KaonPlus + KaonMinus; + if (TMath::Abs(PhiMesonMother.Rapidity()) > confRapidity) { + continue; + } + histos.fill(HIST("h3PhiInvMassSame"), multiplicity, PhiMesonMother.pt(), PhiMesonMother.M()); + if (fillRotation) { + for (int nrotbkg = 0; nrotbkg < nBkgRotations; nrotbkg++) { + auto anglestart = confMinRot; + auto angleend = confMaxRot; + auto anglestep = (angleend - anglestart) / (1.0 * (nBkgRotations - 1)); + auto rotangle = anglestart + nrotbkg * anglestep; + if (track1.sign() * track2.sign() < 0) { + auto rotkaonPx = track1.px() * std::cos(rotangle) - track1.py() * std::sin(rotangle); + auto rotkaonPy = track1.px() * std::sin(rotangle) + track1.py() * std::cos(rotangle); + KaonPlus = ROOT::Math::PxPyPzMVector(rotkaonPx, rotkaonPy, track1.pz(), massKa); + KaonMinus = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massKa); + } + PhiMesonMother = KaonPlus + KaonMinus; + if (TMath::Abs(PhiMesonMother.Rapidity()) > confRapidity) { + continue; + } + histos.fill(HIST("h3PhiInvMassRot"), multiplicity, PhiMesonMother.pt(), PhiMesonMother.M()); + } + } + } + } + } + PROCESS_SWITCH(phianalysisrun3_PbPb, processRotEvent, "Process Rot event", false); void processMC(CollisionMCTrueTable::iterator const& /*TrueCollision*/, CollisionMCRecTableCentFT0C const& RecCollisions, TrackMCTrueTable const& GenParticles, FilTrackMCRecTable const& RecTracks) { histos.fill(HIST("hMC"), 0); @@ -489,14 +579,10 @@ struct phianalysisrun3_PbPb { continue; } oldindex = mothertrack1.globalIndex(); - if (track1.sign() > 0 && track2.sign() < 0) { + if (track1.sign() * track2.sign() < 0) { KaonPlus = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); KaonMinus = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massKa); } - if (track1.sign() < 0 && track2.sign() > 0) { - KaonMinus = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); - KaonPlus = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massKa); - } PhiMesonMother = KaonPlus + KaonMinus; if (TMath::Abs(PhiMesonMother.Rapidity()) > confRapidity) { @@ -583,7 +669,7 @@ struct phianalysisrun3_PbPb { } int occupancy = collision.trackOccupancyInTimeRange(); if (fillOccupancy && !(occupancy > cfgOccupancyCut1 && occupancy < cfgOccupancyCut2)) { - return; + continue; } histos.fill(HIST("hOccupancy1"), occupancy); multiplicity = collision.centFT0C(); @@ -708,6 +794,8 @@ struct phianalysisrun3_PbPb { histos.fill(HIST("h1PhiRecsplit"), mothertrack1.pt()); continue; } + histos.fill(HIST("TPC_Nsigma_MC"), track1.tpcNSigmaKa(), multiplicity); + histos.fill(HIST("TOF_Nsigma_MC"), track1.tofNSigmaKa(), multiplicity); oldindex = mothertrack1.globalIndex(); pvec0 = array{track1.px(), track1.py(), track1.pz()}; pvec1 = array{track2.px(), track2.py(), track2.pz()}; From 681574a47045e9d88a389d8e8ce45968f9229f6d Mon Sep 17 00:00:00 2001 From: Sigurd Nese <32108009+sigurdnese@users.noreply.github.com> Date: Tue, 18 Feb 2025 09:27:05 +0100 Subject: [PATCH 0285/1650] [PWGDQ,PWGEM] Add histogram group for reflected pairs. Fill generated pair MC quantities. (#10022) Co-authored-by: ALICE Builder --- PWGDQ/Core/VarManager.cxx | 8 +- PWGDQ/Core/VarManager.h | 27 ++++--- PWGDQ/Tasks/dqEfficiency.cxx | 2 +- PWGDQ/Tasks/dqEfficiency_withAssoc.cxx | 107 +++++++++++++++++++++---- PWGDQ/Tasks/tableReader_withAssoc.cxx | 42 +++++++++- PWGEM/Dilepton/Tasks/MCtemplates.cxx | 2 +- 6 files changed, 155 insertions(+), 33 deletions(-) diff --git a/PWGDQ/Core/VarManager.cxx b/PWGDQ/Core/VarManager.cxx index 46597170321..f9a71a28c9b 100644 --- a/PWGDQ/Core/VarManager.cxx +++ b/PWGDQ/Core/VarManager.cxx @@ -442,6 +442,10 @@ void VarManager::SetDefaultVarNames() fgVariableUnits[kDeltaPtotTracks] = "GeV/c"; fgVariableNames[kCharge] = "charge"; fgVariableUnits[kCharge] = ""; + fgVariableNames[kCharge1] = "charge track 1"; + fgVariableUnits[kCharge1] = ""; + fgVariableNames[kCharge2] = "charge track 2"; + fgVariableUnits[kCharge2] = ""; fgVariableNames[kPin] = "p_{IN}"; fgVariableUnits[kPin] = "GeV/c"; fgVariableNames[kPin_leg1] = "p_{IN}"; @@ -591,7 +595,7 @@ void VarManager::SetDefaultVarNames() fgVariableUnits[kMCPy] = "GeV/c"; fgVariableNames[kMCPz] = "MC pz"; fgVariableUnits[kMCPz] = "GeV/c"; - fgVariableNames[kMCPt] = "MC pt"; + fgVariableNames[kMCPt] = "MC p_{T}"; fgVariableUnits[kMCPt] = "GeV/c"; fgVariableNames[kMCPhi] = "#varphi"; fgVariableUnits[kMCPhi] = "rad"; @@ -601,6 +605,8 @@ void VarManager::SetDefaultVarNames() fgVariableUnits[kMCY] = ""; fgVariableNames[kMCE] = "MC Energy"; fgVariableUnits[kMCE] = "GeV"; + fgVariableNames[kMCMass] = "MC Mass"; + fgVariableUnits[kMCMass] = "GeV/c2"; fgVariableNames[kMCVx] = "MC vx"; fgVariableUnits[kMCVx] = "cm"; // TODO: check the unit fgVariableNames[kMCVy] = "MC vy"; diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 66224b79a75..4e12d4eb013 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -604,6 +604,7 @@ class VarManager : public TObject kMCPx, kMCPy, kMCPz, + kMCMass, kMCE, kMCVx, kMCVy, @@ -1053,8 +1054,8 @@ class VarManager : public TObject static void FillTriple(T1 const& t1, T2 const& t2, T3 const& t3, float* values = nullptr, PairCandidateType pairType = kTripleCandidateToEEPhoton); template static void FillPairME(T1 const& t1, T2 const& t2, float* values = nullptr); - template - static void FillPairMC(T1 const& t1, T2 const& t2, float* values = nullptr, PairCandidateType pairType = kDecayToEE); + template + static void FillPairMC(T1 const& t1, T2 const& t2, float* values = nullptr); template static void FillTripleMC(T1 const& t1, T2 const& t2, T3 const& t3, float* values = nullptr, PairCandidateType pairType = kTripleCandidateToEEPhoton); template @@ -2719,6 +2720,9 @@ void VarManager::FillPair(T1 const& t1, T2 const& t2, float* values) m2 = o2::constants::physics::MassMuon; } + values[kCharge] = t1.sign() + t2.sign(); + values[kCharge1] = t1.sign(); + values[kCharge2] = t2.sign(); ROOT::Math::PtEtaPhiMVector v1(t1.pt(), t1.eta(), t1.phi(), m1); ROOT::Math::PtEtaPhiMVector v2(t2.pt(), t2.eta(), t2.phi(), m2); ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; @@ -3154,8 +3158,8 @@ void VarManager::FillPairME(T1 const& t1, T2 const& t2, float* values) } } -template -void VarManager::FillPairMC(T1 const& t1, T2 const& t2, float* values, PairCandidateType pairType) +template +void VarManager::FillPairMC(T1 const& t1, T2 const& t2, float* values) { if (!values) { values = fgValues; @@ -3173,6 +3177,11 @@ void VarManager::FillPairMC(T1 const& t1, T2 const& t2, float* values, PairCandi m2 = o2::constants::physics::MassPionCharged; } + if (pairType == kDecayToKPi) { + m1 = o2::constants::physics::MassKaonCharged; + m2 = o2::constants::physics::MassPionCharged; + } + if (pairType == kElectronMuon) { m2 = o2::constants::physics::MassMuon; } @@ -3181,11 +3190,11 @@ void VarManager::FillPairMC(T1 const& t1, T2 const& t2, float* values, PairCandi ROOT::Math::PtEtaPhiMVector v1(t1.pt(), t1.eta(), t1.phi(), m1); ROOT::Math::PtEtaPhiMVector v2(t2.pt(), t2.eta(), t2.phi(), m2); ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - values[kMass] = v12.M(); - values[kPt] = v12.Pt(); - values[kEta] = v12.Eta(); - values[kPhi] = v12.Phi(); - values[kRap] = -v12.Rapidity(); + values[kMCMass] = v12.M(); + values[kMCPt] = v12.Pt(); + values[kMCEta] = v12.Eta(); + values[kMCPhi] = v12.Phi(); + values[kMCY] = -v12.Rapidity(); } template diff --git a/PWGDQ/Tasks/dqEfficiency.cxx b/PWGDQ/Tasks/dqEfficiency.cxx index ffa3835c119..e898e4c4f19 100644 --- a/PWGDQ/Tasks/dqEfficiency.cxx +++ b/PWGDQ/Tasks/dqEfficiency.cxx @@ -942,7 +942,7 @@ struct AnalysisSameEventPairing { checked = sig.CheckSignal(false, t1, t2); } if (checked) { - VarManager::FillPairMC(t1, t2); + VarManager::FillPairMC(t1, t2); fHistMan->FillHistClass(Form("MCTruthGenPair_%s", sig.GetName()), VarManager::fgValues); } } diff --git a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx index fe86e4a8621..e7b7cc9dd0a 100644 --- a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx +++ b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx @@ -538,8 +538,11 @@ struct AnalysisTrackSelection { VarManager::ResetValues(0, VarManager::kNBarrelTrackVariables); // fill event information which might be needed in histograms/cuts that combine track and event properties VarManager::FillEvent(event); - auto eventMC = event.reducedMCevent(); - VarManager::FillEvent(eventMC); + ReducedMCEvent* eventMC = nullptr; + if (event.has_reducedMCevent()) { + auto eventMC = event.reducedMCevent(); + VarManager::FillEvent(eventMC); + } auto track = assoc.template reducedtrack_as(); VarManager::FillTrack(track); @@ -550,7 +553,9 @@ struct AnalysisTrackSelection { if (track.has_reducedMCTrack()) { auto trackMC = track.reducedMCTrack(); auto eventMCfromTrack = trackMC.reducedMCevent(); - isCorrectAssoc = (eventMCfromTrack.globalIndex() == eventMC.globalIndex()); + if (eventMC != nullptr) { + isCorrectAssoc = (eventMCfromTrack.globalIndex() == eventMC->globalIndex()); + } VarManager::FillTrackMC(tracksMC, trackMC); } @@ -1970,7 +1975,7 @@ struct AnalysisSameEventPairing { continue; } if (sig->CheckSignal(true, t1_raw, t2_raw)) { - VarManager::FillPairMC(t1, t2); + VarManager::FillPairMC(t1, t2); fHistMan->FillHistClass(Form("MCTruthGenPair_%s", sig->GetName()), VarManager::fgValues); } } // end loop over MC signals @@ -2052,11 +2057,13 @@ struct AnalysisAsymmetricPairing { Configurable fConfigLegCFilterMask{"cfgLegCFilterMask", 0, "Filter mask corresponding to cuts in event-selection"}; Configurable fConfigCommonTrackCuts{"cfgCommonTrackCuts", "", "Comma separated list of cuts to be applied to all legs"}; Configurable fConfigPairCuts{"cfgPairCuts", "", "Comma separated list of pair cuts"}; + Configurable fConfigPairCutsJSON{"cfgPairCutsJSON", "", "Additional list of pair cuts in JSON format"}; Configurable fConfigSkipAmbiguousIdCombinations{"cfgSkipAmbiguousIdCombinations", true, "Choose whether to skip pairs/triples which pass a stricter combination of cuts, e.g. KKPi triplets for D+ -> KPiPi"}; Configurable fConfigHistogramSubgroups{"cfgAsymmetricPairingHistogramsSubgroups", "barrel,vertexing", "Comma separated list of asymmetric-pairing histogram subgroups"}; Configurable fConfigSameSignHistograms{"cfgSameSignHistograms", false, "Include same sign pair histograms for 2-prong decays"}; // Configurable fConfigAmbiguousHistograms{"cfgAmbiguousHistograms", false, "Include separate histograms for pairs/triplets with ambiguous tracks"}; + Configurable fConfigReflectedHistograms{"cfgReflectedHistograms", false, "Include separate histograms for pairs which are reflections of previously counted pairs"}; Configurable fConfigQA{"cfgQA", false, "If true, fill QA histograms"}; Configurable fConfigAddJSONHistograms{"cfgAddJSONHistograms", "", "Histograms in JSON format"}; @@ -2080,7 +2087,8 @@ struct AnalysisAsymmetricPairing { std::map> fTrackHistNames; std::map> fBarrelHistNamesMCmatched; - std::vector fPairCuts; + std::vector fPairCuts; + int fNPairHistPrefixes; std::vector fRecMCSignals; std::vector fGenMCSignals; @@ -2109,6 +2117,9 @@ struct AnalysisAsymmetricPairing { Partition> legBCandidateAssocs = (o2::aod::dqanalysisflags::isBarrelSelected & fConfigLegBFilterMask) > static_cast(0); Partition> legCCandidateAssocs = (o2::aod::dqanalysisflags::isBarrelSelected & fConfigLegCFilterMask) > static_cast(0); + // Map to track how many times a pair of tracks has been encountered + std::map, int8_t> fPairCount; + void init(o2::framework::InitContext& context) { if (context.mOptions.get("processDummy")) { @@ -2129,7 +2140,16 @@ struct AnalysisAsymmetricPairing { if (!cutNamesStr.IsNull()) { std::unique_ptr objArray(cutNamesStr.Tokenize(",")); for (int icut = 0; icut < objArray->GetEntries(); ++icut) { - fPairCuts.push_back(*dqcuts::GetCompositeCut(objArray->At(icut)->GetName())); + fPairCuts.push_back(dqcuts::GetCompositeCut(objArray->At(icut)->GetName())); + } + } + // Extra pair cuts via JSON + TString addPairCutsStr = fConfigPairCutsJSON.value; + if (addPairCutsStr != "") { + std::vector addPairCuts = dqcuts::GetCutsFromJSON(addPairCutsStr.Data()); + for (auto& t : addPairCuts) { + fPairCuts.push_back((AnalysisCompositeCut*)t); + cutNamesStr += Form(",%s", t->GetName()); } } @@ -2148,6 +2168,15 @@ struct AnalysisAsymmetricPairing { string tempCuts; getTaskOptionValue(context, "analysis-track-selection", "cfgTrackCuts", tempCuts, false); TString tempCutsStr = tempCuts; + // check also the cuts added via JSON and add them to the string of cuts + getTaskOptionValue(context, "analysis-track-selection", "cfgBarrelTrackCutsJSON", tempCuts, false); + TString addTrackCutsStr = tempCuts; + if (addTrackCutsStr != "") { + std::vector addTrackCuts = dqcuts::GetCutsFromJSON(addTrackCutsStr.Data()); + for (auto& t : addTrackCuts) { + tempCutsStr += Form(",%s", t->GetName()); + } + } std::unique_ptr objArray(tempCutsStr.Tokenize(",")); // Get the common leg cuts int commonCutIdx; @@ -2306,7 +2335,7 @@ struct AnalysisAsymmetricPairing { pairHistPrefixes.push_back("PairsBarrelSEPP"); pairHistPrefixes.push_back("PairsBarrelSEMM"); } - int fNPairHistPrefixes = pairHistPrefixes.size(); + fNPairHistPrefixes = pairHistPrefixes.size(); for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) { names.push_back(Form("%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data())); @@ -2318,6 +2347,12 @@ struct AnalysisAsymmetricPairing { histNames += Form("%s;", names[fNPairHistPrefixes + iPrefix].Data()); } } + if (fConfigReflectedHistograms.value) { + for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) { + names.push_back(Form("%s_reflected_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data())); + histNames += Form("%s;", names[(1 + fConfigQA.value) * fNPairHistPrefixes + iPrefix].Data()); + } + } fTrackHistNames[icut] = names; std::unique_ptr objArrayCommon(commonNamesStr.Tokenize(",")); @@ -2361,6 +2396,12 @@ struct AnalysisAsymmetricPairing { names.push_back(Form("%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), sig.GetName())); histNames += Form("%s;", names[iPrefix].Data()); } + if (fConfigReflectedHistograms.value) { + for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) { + names.push_back(Form("%s_reflected_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), sig.GetName())); + histNames += Form("%s;", names[fNPairHistPrefixes + iPrefix].Data()); + } + } fBarrelHistNamesMCmatched[offset + icut] = names; for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { @@ -2489,6 +2530,8 @@ struct AnalysisAsymmetricPairing { template void runAsymmetricPairing(TEvents const& events, Preslice& preslice, TTrackAssocs const& /*assocs*/, TTracks const& /*tracks*/, ReducedMCEvents const& /*mcEvents*/, ReducedMCTracks const& /*mcTracks*/) { + fPairCount.clear(); + if (events.size() > 0) { // Additional protection to avoid crashing of events.begin().runNumber() if (fCurrentRun != events.begin().runNumber()) { initParamsFromCCDB(events.begin().timestamp(), false); @@ -2558,6 +2601,18 @@ struct AnalysisAsymmetricPairing { continue; } + bool isReflected = false; + std::pair trackIds(t1.globalIndex(), t2.globalIndex()); + if (fPairCount.find(trackIds) != fPairCount.end()) { + // Double counting is possible due to track-collision ambiguity. Skip pairs which were counted before + fPairCount[trackIds] += 1; + continue; + } + if (fPairCount.find(std::pair(trackIds.second, trackIds.first)) != fPairCount.end()) { + isReflected = true; + } + fPairCount[trackIds] += 1; + sign1 = t1.sign(); sign2 = t2.sign(); // store the ambiguity number of the two dilepton legs in the last 4 digits of the two-track filter @@ -2573,6 +2628,7 @@ struct AnalysisAsymmetricPairing { mcDecision = 0; for (auto sig = fRecMCSignals.begin(); sig != fRecMCSignals.end(); sig++, isig++) { if (t1.has_reducedMCTrack() && t2.has_reducedMCTrack()) { + VarManager::FillPairMC(t1.reducedMCTrack(), t2.reducedMCTrack()); if ((*sig).CheckSignal(true, t1.reducedMCTrack(), t2.reducedMCTrack())) { mcDecision |= static_cast(1) << isig; } @@ -2592,18 +2648,27 @@ struct AnalysisAsymmetricPairing { if (sign1 * sign2 < 0) { // +- pairs fHistMan->FillHistClass(histNames[icut][0].Data(), VarManager::fgValues); // reconstructed, unmatched if (isAmbi && fConfigQA) { - fHistMan->FillHistClass(histNames[icut][3].Data(), VarManager::fgValues); + fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes].Data(), VarManager::fgValues); + } + if (isReflected && fConfigReflectedHistograms.value) { + fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes * (1 + fConfigQA.value)].Data(), VarManager::fgValues); } } else if (fConfigSameSignHistograms.value) { if (sign1 > 0) { // ++ pairs fHistMan->FillHistClass(histNames[icut][1].Data(), VarManager::fgValues); if (isAmbi && fConfigQA) { - fHistMan->FillHistClass(histNames[icut][4].Data(), VarManager::fgValues); + fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes + 1].Data(), VarManager::fgValues); + } + if (isReflected && fConfigReflectedHistograms.value) { + fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes * (1 + fConfigQA.value) + 1].Data(), VarManager::fgValues); } } else { // -- pairs fHistMan->FillHistClass(histNames[icut][2].Data(), VarManager::fgValues); if (isAmbi && fConfigQA) { - fHistMan->FillHistClass(histNames[icut][5].Data(), VarManager::fgValues); + fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes + 2].Data(), VarManager::fgValues); + } + if (isReflected && fConfigReflectedHistograms) { + fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes * (1 + fConfigQA.value) + 2].Data(), VarManager::fgValues); } } } @@ -2612,11 +2677,20 @@ struct AnalysisAsymmetricPairing { if (mcDecision & (static_cast(1) << isig)) { if (sign1 * sign2 < 0) { fHistMan->FillHistClass(histNamesMC[offset + icut][0].Data(), VarManager::fgValues); + if (isReflected && fConfigReflectedHistograms.value) { + fHistMan->FillHistClass(histNamesMC[offset + icut][fNPairHistPrefixes].Data(), VarManager::fgValues); + } } else if (fConfigSameSignHistograms.value) { if (sign1 > 0) { fHistMan->FillHistClass(histNamesMC[offset + icut][1].Data(), VarManager::fgValues); + if (isReflected && fConfigReflectedHistograms.value) { + fHistMan->FillHistClass(histNamesMC[offset + icut][fNPairHistPrefixes + 1].Data(), VarManager::fgValues); + } } else { fHistMan->FillHistClass(histNamesMC[offset + icut][2].Data(), VarManager::fgValues); + if (isReflected && fConfigReflectedHistograms.value) { + fHistMan->FillHistClass(histNamesMC[offset + icut][fNPairHistPrefixes + 2].Data(), VarManager::fgValues); + } } } } @@ -2648,9 +2722,9 @@ struct AnalysisAsymmetricPairing { } } } // end loop (common cuts) - for (unsigned int iPairCut = 0; iPairCut < fPairCuts.size(); iPairCut++) { - AnalysisCompositeCut cut = fPairCuts.at(iPairCut); - if (!(cut.IsSelected(VarManager::fgValues))) // apply pair cuts + int iPairCut = 0; + for (auto cut = fPairCuts.begin(); cut != fPairCuts.end(); cut++, iPairCut++) { + if (!((*cut)->IsSelected(VarManager::fgValues))) // apply pair cuts continue; pairFilter |= (static_cast(1) << iPairCut); // Histograms with pair cuts @@ -2881,11 +2955,10 @@ struct AnalysisAsymmetricPairing { } // end loop (MC signals) } } // end loop (common cuts) - for (unsigned int iPairCut = 0; iPairCut < fPairCuts.size(); iPairCut++) { - AnalysisCompositeCut cut = fPairCuts.at(iPairCut); - if (!(cut.IsSelected(VarManager::fgValues))) { // apply pair cuts + int iPairCut = 0; + for (auto cut = fPairCuts.begin(); cut != fPairCuts.end(); cut++, iPairCut++) { + if (!((*cut)->IsSelected(VarManager::fgValues))) // apply pair cuts continue; - } // Histograms with pair cuts fHistMan->FillHistClass(histNames[fNLegCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut][0].Data(), VarManager::fgValues); for (unsigned int isig = 0; isig < fRecMCSignals.size(); isig++) { // loop over MC signals diff --git a/PWGDQ/Tasks/tableReader_withAssoc.cxx b/PWGDQ/Tasks/tableReader_withAssoc.cxx index d0fc2fb839c..c8282de9e45 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.cxx +++ b/PWGDQ/Tasks/tableReader_withAssoc.cxx @@ -1998,6 +1998,7 @@ struct AnalysisAsymmetricPairing { Configurable fConfigHistogramSubgroups{"cfgAsymmetricPairingHistogramsSubgroups", "barrel,vertexing", "Comma separated list of asymmetric-pairing histogram subgroups"}; Configurable fConfigSameSignHistograms{"cfgSameSignHistograms", false, "Include same sign pair histograms for 2-prong decays"}; Configurable fConfigAmbiguousHistograms{"cfgAmbiguousHistograms", false, "Include separate histograms for pairs/triplets with ambiguous tracks"}; + Configurable fConfigReflectedHistograms{"cfgReflectedHistograms", false, "Include separate histograms for pairs which are reflections of previously counted pairs"}; Configurable fConfigAddJSONHistograms{"cfgAddJSONHistograms", "", "Histograms in JSON format"}; Configurable fConfigCcdbUrl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; @@ -2016,6 +2017,7 @@ struct AnalysisAsymmetricPairing { std::map> fTrackHistNames; std::vector fPairCuts; + int fNPairHistPrefixes; // Filter masks to find legs in BarrelTrackCuts table uint32_t fLegAFilterMask; @@ -2041,6 +2043,9 @@ struct AnalysisAsymmetricPairing { Partition> legBCandidateAssocs = (o2::aod::dqanalysisflags::isBarrelSelected & fConfigLegBFilterMask) > static_cast(0); Partition> legCCandidateAssocs = (o2::aod::dqanalysisflags::isBarrelSelected & fConfigLegCFilterMask) > static_cast(0); + // Map to track how many times a pair of tracks has been encountered + std::map, int8_t> fPairCount; + void init(o2::framework::InitContext& context) { if (context.mOptions.get("processDummy")) { @@ -2207,7 +2212,7 @@ struct AnalysisAsymmetricPairing { pairHistPrefixes.push_back("PairsBarrelSEPP"); pairHistPrefixes.push_back("PairsBarrelSEMM"); } - int fNPairHistPrefixes = pairHistPrefixes.size(); + fNPairHistPrefixes = pairHistPrefixes.size(); for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) { names.push_back(Form("%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data())); @@ -2219,6 +2224,12 @@ struct AnalysisAsymmetricPairing { histNames += Form("%s;", names[fNPairHistPrefixes + iPrefix].Data()); } } + if (fConfigReflectedHistograms.value) { + for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) { + names.push_back(Form("%s_reflected_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data())); + histNames += Form("%s;", names[(1 + fConfigAmbiguousHistograms.value) * fNPairHistPrefixes + iPrefix].Data()); + } + } fTrackHistNames[icut] = names; std::unique_ptr objArrayCommon(commonNamesStr.Tokenize(",")); @@ -2333,6 +2344,8 @@ struct AnalysisAsymmetricPairing { template void runAsymmetricPairing(TEvents const& events, Preslice& preslice, TTrackAssocs const& /*assocs*/, TTracks const& /*tracks*/) { + fPairCount.clear(); + if (events.size() > 0) { // Additional protection to avoid crashing of events.begin().runNumber() if (fCurrentRun != events.begin().runNumber()) { initParamsFromCCDB(events.begin().timestamp(), false); @@ -2398,6 +2411,18 @@ struct AnalysisAsymmetricPairing { continue; } + bool isReflected = false; + std::pair trackIds(t1.globalIndex(), t2.globalIndex()); + if (fPairCount.find(trackIds) != fPairCount.end()) { + // Double counting is possible due to track-collision ambiguity. Skip pairs which were counted before + fPairCount[trackIds] += 1; + continue; + } + if (fPairCount.find(std::pair(trackIds.second, trackIds.first)) != fPairCount.end()) { + isReflected = true; + } + fPairCount[trackIds] += 1; + sign1 = t1.sign(); sign2 = t2.sign(); // store the ambiguity number of the two dilepton legs in the last 4 digits of the two-track filter @@ -2421,18 +2446,27 @@ struct AnalysisAsymmetricPairing { if (sign1 * sign2 < 0) { fHistMan->FillHistClass(histNames[icut][0].Data(), VarManager::fgValues); if (isAmbi && fConfigAmbiguousHistograms.value) { - fHistMan->FillHistClass(histNames[icut][3].Data(), VarManager::fgValues); + fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes].Data(), VarManager::fgValues); + } + if (isReflected && fConfigReflectedHistograms.value) { + fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes * (1 + fConfigAmbiguousHistograms.value)].Data(), VarManager::fgValues); } } else if (fConfigSameSignHistograms.value) { if (sign1 > 0) { fHistMan->FillHistClass(histNames[icut][1].Data(), VarManager::fgValues); if (isAmbi && fConfigAmbiguousHistograms.value) { - fHistMan->FillHistClass(histNames[icut][4].Data(), VarManager::fgValues); + fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes + 1].Data(), VarManager::fgValues); + } + if (isReflected && fConfigReflectedHistograms.value) { + fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes * (1 + fConfigAmbiguousHistograms.value) + 1].Data(), VarManager::fgValues); } } else { fHistMan->FillHistClass(histNames[icut][2].Data(), VarManager::fgValues); if (isAmbi && fConfigAmbiguousHistograms.value) { - fHistMan->FillHistClass(histNames[icut][5].Data(), VarManager::fgValues); + fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes + 2].Data(), VarManager::fgValues); + } + if (isReflected && fConfigReflectedHistograms) { + fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes * (1 + fConfigAmbiguousHistograms.value) + 2].Data(), VarManager::fgValues); } } } diff --git a/PWGEM/Dilepton/Tasks/MCtemplates.cxx b/PWGEM/Dilepton/Tasks/MCtemplates.cxx index 30b60856cb5..3288bd2745e 100644 --- a/PWGEM/Dilepton/Tasks/MCtemplates.cxx +++ b/PWGEM/Dilepton/Tasks/MCtemplates.cxx @@ -604,7 +604,7 @@ struct AnalysisSameEventPairing { checked = sig.CheckSignal(true, t1, t2); } if (checked) { - VarManager::FillPairMC(t1, t2); + VarManager::FillPairMC(t1, t2); fHistMan->FillHistClass(Form("MCTruthGenPair_%s", sig.GetName()), VarManager::fgValues); } } From 568fae6c1e690a82bcd0cbc06ed894129fac6a0c Mon Sep 17 00:00:00 2001 From: Kai Cui <129373281+kcui1@users.noreply.github.com> Date: Tue, 18 Feb 2025 17:49:46 +0800 Subject: [PATCH 0286/1650] [PWGLF] Bug Fix of hStrangeness Correlation Filter (#10000) --- .../TableProducer/Strangeness/hStrangeCorrelationFilter.cxx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx b/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx index c2fd9b5074e..e8bb824c8b1 100644 --- a/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx +++ b/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx @@ -29,6 +29,7 @@ #include "Common/DataModel/Centrality.h" #include "CCDB/BasicCCDBManager.h" #include "TF1.h" +#include "string" #include "EventFiltering/Zorro.h" #include "EventFiltering/ZorroSummary.h" @@ -137,8 +138,8 @@ struct hstrangecorrelationfilter { using V0LinkedTagged = soa::Join; using CascadesLinkedTagged = soa::Join; - using FullTracks = soa::Join; - using FullTracksMC = soa::Join; + using FullTracks = soa::Join; + using FullTracksMC = soa::Join; using DauTracks = soa::Join; using DauTracksMC = soa::Join; // using IDTracks= soa::Join; // prepared for Bayesian PID From 4ac1baff3c057b6230b395c23a22305e68b54992 Mon Sep 17 00:00:00 2001 From: Anantha Padmanabhan M Nair <82643666+ananthapadmanabhan18@users.noreply.github.com> Date: Tue, 18 Feb 2025 16:37:52 +0530 Subject: [PATCH 0287/1650] [PWGUD] Minor Changes: Bin wdth and dew more histograms (#10033) --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 440 +++++++++++++++++------------- 1 file changed, 253 insertions(+), 187 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index 603b81aa4aa..b12a4ae4be1 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -67,11 +67,13 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct Configurable nSigmaTPCcut{"nSigmaTPCcut", 3, "TPC cut"}; Configurable nSigmaTOFcut{"nSigmaTOFcut", 3, "TOF cut"}; Configurable strictEventSelection{"strictEventSelection", true, "Event Selection"}; - Configurable ifDataAnalysis{"ifDataAnalysis", true, "Data Analysis"}; - Configurable ifMCAnalysis{"ifMCAnalysis", false, "MC Analysis"}; + // Configurable ifDataAnalysis{"ifDataAnalysis", true, "Data Analysis"}; + // Configurable ifMCAnalysis{"ifMCAnalysis", false, "MC Analysis"}; Configurable nBinsPt{"nBinsPt", 1000, "Number of bins for pT"}; Configurable nBinsInvariantMass{"nBinsInvariantMass", 1000, "Number of bins for Invariant Mass"}; + Configurable invariantMassMin{"invariantMassMin", 0.8, "Minimum Invariant Mass"}; + Configurable invariantMassMax{"invariantMassMax", 2.5, "Maximum Invariant Mass"}; Configurable nBinsRapidity{"nBinsRapidity", 1000, "Number of bins for Rapidity"}; Configurable nBinsPhi{"nBinsPhi", 360, "Number of bins for Phi"}; Configurable nBinsCosTheta{"nBinsCosTheta", 360, "Number of bins for cos Theta"}; @@ -82,186 +84,199 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct void init(InitContext const&) { - if (ifDataAnalysis) { - histosData.add("GapSide", "Gap Side; Events", kTH1F, {{4, -1.5, 2.5}}); - histosData.add("TrueGapSide", "Gap Side; Events", kTH1F, {{4, -1.5, 2.5}}); - histosData.add("EventCounts", "Total Events; Events", kTH1F, {{10, 0, 10}}); - - // TPC nSigma - histosData.add("tpcNSigmaPi_WOTS", "TPC nSigma Pion without track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosData.add("tpcNSigmaPi_WTS", "TPC nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosData.add("tpcNSigmaPi_WTS_PID_Pi", "TPC nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - - // TPC nSigma of other particles with selected pion tracks - histosData.add("tpcNSigmaKa_WTS_PID_Pi", "TPC nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosData.add("tpcNSigmaPr_WTS_PID_Pi", "TPC nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosData.add("tpcNSigmaEl_WTS_PID_Pi", "TPC nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosData.add("tpcNSigmaMu_WTS_PID_Pi", "TPC nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - - // TOF nSigma - histosData.add("tofNSigmaPi_WTS", "TOF nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosData.add("tofNSigmaPi_WOTS", "TOF nSigma Pion without track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosData.add("tofNSigmaPi_WTS_PID_Pi", "TOF nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - - // TOF nSigma of other particles with selected pion tracks - histosData.add("tofNSigmaKa_WTS_PID_Pi", "TOF nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosData.add("tofNSigmaPr_WTS_PID_Pi", "TOF nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosData.add("tofNSigmaEl_WTS_PID_Pi", "TOF nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosData.add("tofNSigmaMu_WTS_PID_Pi", "TOF nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - - // Track Transverse Momentum - histosData.add("pT_track_WOTS", "pT without track selection; pT [GeV/c]; Counts", kTH1F, {{nBinsPt, 0, 2}}); - histosData.add("pT_track_WTS", "pT with track selection; pT [GeV/c]; Counts", kTH1F, {{nBinsPt, 0, 2}}); - histosData.add("pT_track_WTS_PID_Pi", "pT with track selection and PID selection of Pi; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); - - // Zero charge Event Transverse Momentum - histosData.add("pT_event_0charge_WTS_PID_Pi", "Event pT in 0 Charge Events With Track Selection and PID Selection of Pi; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); - - // Non Zero charge Event Transverse Momentum - histosData.add("pT_event_non0charge_WTS_PID_Pi", "Event pT in Non 0 Charge Events With Track Selection and PID Selection of Pi; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); - - // Rapidity of 0 charge Events - histosData.add("rapidity_event_0charge_WTS_PID_Pi_domainA", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} < 0.15 GeV/c; y; Events", kTH1F, {{1000, -2.5, 2.5}}); - histosData.add("rapidity_event_0charge_WTS_PID_Pi_domainB", "Rapidity of Events With Track Selection and PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; y; Events", kTH1F, {{1000, -2.5, 2.5}}); - histosData.add("rapidity_event_0charge_WTS_PID_Pi_domainC", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} > 0.80 GeV/c; y; Events", kTH1F, {{1000, -2.5, 2.5}}); - - // Rapidity of non 0 charge Events - histosData.add("rapidity_event_non0charge_WTS_PID_Pi_domainA", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} < 0.15 GeV/c; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); - histosData.add("rapidity_event_non0charge_WTS_PID_Pi_domainB", "Rapidity of Events With Track Selection and PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c$; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); - histosData.add("rapidity_event_non0charge_WTS_PID_Pi_domainC", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} > 0.80 GeV/c; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); - - // Invariant Mass of 0 charge events - histosData.add("invMass_event_0charge_WTS_PID_Pi_domainA", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for p_{T} < 0.15 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, 0.8, 2.5}}); // pT < 0.15GeV - histosData.add("invMass_event_0charge_WTS_PID_Pi_domainB", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, 0.8, 2.5}}); // 0.15GeV < pT < 0.8GeV - histosData.add("invMass_event_0charge_WTS_PID_Pi_domainC", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for p_{T} > 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, 0.8, 2.5}}); // 0.8GeV < pT - - // Invariant mass of non 0 charge events - histosData.add("invMass_event_non0charge_WTS_PID_Pi_domainA", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for p_{T} < 0.15 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, 0.8, 2.5}}); // pT < 0.15GeV - histosData.add("invMass_event_non0charge_WTS_PID_Pi_domainB", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, 0.8, 2.5}}); // 0.15GeV < pT < 0.8GeV - histosData.add("invMass_event_non0charge_WTS_PID_Pi_domainC", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for p_{T} > 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, 0.8, 2.5}}); // 0.8GeV < pT - - // tpc signal - histosData.add("tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); - histosData.add("tpcSignal_Pi", "TPC dEdx vs p for pions; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); - - // tof beta - histosData.add("tofBeta", "TOF beta vs p; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); - histosData.add("tofBeta_Pi", "TOF beta vs p for pions; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); - - // Other signals - histosData.add("FT0A", "T0A amplitude", kTH1F, {{200, 0.0, 500.0}}); - histosData.add("FT0C", "T0C amplitude", kTH1F, {{200, 0.0, 500.0}}); - histosData.add("ZDC_A", "ZDC amplitude", kTH1F, {{1000, 0.0, 15}}); - histosData.add("ZDC_C", "ZDC amplitude", kTH1F, {{1000, 0.0, 15}}); - histosData.add("V0A", "V0A amplitude", kTH1F, {{1000, 0.0, 100}}); - - // Collin Soper Theta and Phi - histosData.add("CS_phi_pair_1", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); - histosData.add("CS_phi_pair_2", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); - histosData.add("CS_costheta_pair_1", "#theta Distribution;cos(#theta); Counts", kTH1F, {{nBinsCosTheta, -1, 1}}); - histosData.add("CS_costheta_pair_2", "#theta Distribution;cos(#theta); Counts", kTH1F, {{nBinsCosTheta, -1, 1}}); - } + histosData.add("GapSide", "Gap Side; Events", kTH1F, {{4, -1.5, 2.5}}); + histosData.add("TrueGapSide", "Gap Side; Events", kTH1F, {{4, -1.5, 2.5}}); + histosData.add("EventCounts", "Total Events; Events", kTH1F, {{10, 0, 10}}); + + // TPC nSigma + histosData.add("tpcNSigmaPi_WOTS", "TPC nSigma Pion without track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tpcNSigmaPi_WTS", "TPC nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tpcNSigmaPi_WTS_PID_Pi", "TPC nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + + // TPC nSigma of other particles with selected pion tracks + histosData.add("tpcNSigmaKa_WTS_PID_Pi", "TPC nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tpcNSigmaPr_WTS_PID_Pi", "TPC nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tpcNSigmaEl_WTS_PID_Pi", "TPC nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tpcNSigmaMu_WTS_PID_Pi", "TPC nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + + // TOF nSigma + histosData.add("tofNSigmaPi_WTS", "TOF nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tofNSigmaPi_WOTS", "TOF nSigma Pion without track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tofNSigmaPi_WTS_PID_Pi", "TOF nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + + // TOF nSigma of other particles with selected pion tracks + histosData.add("tofNSigmaKa_WTS_PID_Pi", "TOF nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tofNSigmaPr_WTS_PID_Pi", "TOF nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tofNSigmaEl_WTS_PID_Pi", "TOF nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tofNSigmaMu_WTS_PID_Pi", "TOF nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + + // Track Transverse Momentum + histosData.add("pT_track_WOTS", "pT without track selection; pT [GeV/c]; Counts", kTH1F, {{nBinsPt, 0, 2}}); + histosData.add("pT_track_WTS", "pT with track selection; pT [GeV/c]; Counts", kTH1F, {{nBinsPt, 0, 2}}); + histosData.add("pT_track_WTS_PID_Pi", "pT with track selection and PID selection of Pi; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); + histosData.add("pT_track_WTS_PID_Pi_contributed", "pT with track selection and PID selection of Pi which are contributed to selected event; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); + + // Track Rapidity + histosData.add("rapidity_track_WOTS", "Rapidity without track selection; y; Counts", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + histosData.add("rapidity_track_WTS", "Rapidity with track selection; y; Counts", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + histosData.add("rapidity_track_WTS_PID_Pi", "Rapidity with track selection and PID selection of Pi; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + histosData.add("rapidity_track_WTS_PID_Pi_contributed", "Rapidity with track selection and PID selection of Pi which are contributed to selected event; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + + // Zero charge Event Transverse Momentum + histosData.add("pT_event_0charge_WTS_PID_Pi", "Event pT in 0 Charge Events With Track Selection and PID Selection of Pi; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); + + // Non Zero charge Event Transverse Momentum + histosData.add("pT_event_non0charge_WTS_PID_Pi", "Event pT in Non 0 Charge Events With Track Selection and PID Selection of Pi; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); + + // Rapidity of 0 charge Events + histosData.add("rapidity_event_0charge_WTS_PID_Pi_domainA", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} < 0.15 GeV/c; y; Events", kTH1F, {{1000, -2.5, 2.5}}); + histosData.add("rapidity_event_0charge_WTS_PID_Pi_domainB", "Rapidity of Events With Track Selection and PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; y; Events", kTH1F, {{1000, -2.5, 2.5}}); + histosData.add("rapidity_event_0charge_WTS_PID_Pi_domainC", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} > 0.80 GeV/c; y; Events", kTH1F, {{1000, -2.5, 2.5}}); + + // Rapidity of non 0 charge Events + histosData.add("rapidity_event_non0charge_WTS_PID_Pi_domainA", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} < 0.15 GeV/c; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + histosData.add("rapidity_event_non0charge_WTS_PID_Pi_domainB", "Rapidity of Events With Track Selection and PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c$; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + histosData.add("rapidity_event_non0charge_WTS_PID_Pi_domainC", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} > 0.80 GeV/c; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + + // Invariant Mass of 0 charge events + histosData.add("invMass_event_0charge_WTS_PID_Pi_domainA", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for p_{T} < 0.15 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // pT < 0.15GeV + histosData.add("invMass_event_0charge_WTS_PID_Pi_domainB", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // 0.15GeV < pT < 0.8GeV + histosData.add("invMass_event_0charge_WTS_PID_Pi_domainC", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for p_{T} > 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // 0.8GeV < pT + + // Invariant mass of non 0 charge events + histosData.add("invMass_event_non0charge_WTS_PID_Pi_domainA", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for p_{T} < 0.15 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // pT < 0.15GeV + histosData.add("invMass_event_non0charge_WTS_PID_Pi_domainB", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // 0.15GeV < pT < 0.8GeV + histosData.add("invMass_event_non0charge_WTS_PID_Pi_domainC", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for p_{T} > 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // 0.8GeV < pT + + // tpc signal + histosData.add("tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); + histosData.add("tpcSignal_Pi", "TPC dEdx vs p for pions; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); + + // tof beta + histosData.add("tofBeta", "TOF beta vs p; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); + histosData.add("tofBeta_Pi", "TOF beta vs p for pions; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); + + // Other signals + histosData.add("FT0A", "T0A amplitude", kTH1F, {{200, 0.0, 500.0}}); + histosData.add("FT0C", "T0C amplitude", kTH1F, {{200, 0.0, 500.0}}); + histosData.add("ZDC_A", "ZDC amplitude", kTH1F, {{1000, 0.0, 15}}); + histosData.add("ZDC_C", "ZDC amplitude", kTH1F, {{1000, 0.0, 15}}); + histosData.add("V0A", "V0A amplitude", kTH1F, {{1000, 0.0, 100}}); + + // Collin Soper Theta and Phi + histosData.add("CS_phi_pair_1", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); + histosData.add("CS_phi_pair_2", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); + histosData.add("CS_costheta_pair_1", "#theta Distribution;cos(#theta); Counts", kTH1F, {{nBinsCosTheta, -1, 1}}); + histosData.add("CS_costheta_pair_2", "#theta Distribution;cos(#theta); Counts", kTH1F, {{nBinsCosTheta, -1, 1}}); // MC Gen Stuff - if (ifMCAnalysis) { - // counts - histosMCgen.add("rhoPrimeCounts", "Total Rho prime Events; Events", kTH1F, {{10, 0, 10}}); - - // Track Stuff - histosMCgen.add("MCgen_particle_pT", "Generated pT; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 10}}); - histosMCgen.add("MCgen_particle_rapidity", "Generated Rapidity; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); - - // Generated Transverse Momentum, Rapidty and Invariant Mass - histosMCgen.add("MCgen_4pion_pT", "Generated pT; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); - histosMCgen.add("MCgen_4pion_rapidity", "Generated Rapidity; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); - histosMCgen.add("MCgen_4pion_invmass", "Invariant Mass of 4-Pions; m(4-pion); Events", kTH1F, {{nBinsInvariantMass, 0.8, 2.5}}); - - // Collin Soper Theta and Phi - histosMCgen.add("MCgen_CS_phi_pair_1", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); - histosMCgen.add("MCgen_CS_phi_pair_2", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); - histosMCgen.add("MCgen_CS_costheta_pair_1", "#theta Distribution;cos(#theta); Events", kTH1F, {{nBinsCosTheta, -1, 1}}); - histosMCgen.add("MCgen_CS_costheta_pair_2", "#theta Distribution;cos(#theta); Events", kTH1F, {{nBinsCosTheta, -1, 1}}); - - // MC Reco Stuff - - histosMCreco.add("GapSide", "Gap Side; Events", kTH1F, {{4, -1.5, 2.5}}); - histosMCreco.add("TrueGapSide", "Gap Side; Events", kTH1F, {{4, -1.5, 2.5}}); - histosMCreco.add("EventCounts", "Total Events; Events", kTH1F, {{10, 0, 10}}); - - // TPC nSigma - histosMCreco.add("tpcNSigmaPi_WOTS", "TPC nSigma Pion without track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosMCreco.add("tpcNSigmaPi_WTS", "TPC nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosMCreco.add("tpcNSigmaPi_WTS_PID_Pi", "TPC nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - - // TPC nSigma of other particles with selected pion tracks - histosMCreco.add("tpcNSigmaKa_WTS_PID_Pi", "TPC nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosMCreco.add("tpcNSigmaPr_WTS_PID_Pi", "TPC nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosMCreco.add("tpcNSigmaEl_WTS_PID_Pi", "TPC nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosMCreco.add("tpcNSigmaMu_WTS_PID_Pi", "TPC nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - - // TOF nSigma - histosMCreco.add("tofNSigmaPi_WTS", "TOF nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosMCreco.add("tofNSigmaPi_WOTS", "TOF nSigma Pion without track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosMCreco.add("tofNSigmaPi_WTS_PID_Pi", "TOF nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - - // TOF nSigma of other particles with selected pion tracks - histosMCreco.add("tofNSigmaKa_WTS_PID_Pi", "TOF nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosMCreco.add("tofNSigmaPr_WTS_PID_Pi", "TOF nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosMCreco.add("tofNSigmaEl_WTS_PID_Pi", "TOF nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosMCreco.add("tofNSigmaMu_WTS_PID_Pi", "TOF nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - - // Track Transverse Momentum - histosMCreco.add("pT_track_WOTS", "pT without track selection; pT [GeV/c]; Counts", kTH1F, {{nBinsPt, 0, 2}}); - histosMCreco.add("pT_track_WTS", "pT with track selection; pT [GeV/c]; Counts", kTH1F, {{nBinsPt, 0, 2}}); - histosMCreco.add("pT_track_WTS_PID_Pi", "pT with track selection and PID selection of Pi; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); - - // Zero charge Event Transverse Momentum - histosMCreco.add("pT_event_0charge_WTS_PID_Pi", "Event pT in 0 Charge Events With Track Selection and PID Selection of Pi; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); - - // Non Zero charge Event Transverse Momentum - histosMCreco.add("pT_event_non0charge_WTS_PID_Pi", "Event pT in Non 0 Charge Events With Track Selection and PID Selection of Pi; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); - - // Rapidity of 0 charge Events - histosMCreco.add("rapidity_event_0charge_WTS_PID_Pi_domainA", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} < 0.15 GeV/c; y; Events", kTH1F, {{1000, -2.5, 2.5}}); - histosMCreco.add("rapidity_event_0charge_WTS_PID_Pi_domainB", "Rapidity of Events With Track Selection and PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; y; Events", kTH1F, {{1000, -2.5, 2.5}}); - histosMCreco.add("rapidity_event_0charge_WTS_PID_Pi_domainC", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} > 0.80 GeV/c; y; Events", kTH1F, {{1000, -2.5, 2.5}}); - - // Rapidity of non 0 charge Events - histosMCreco.add("rapidity_event_non0charge_WTS_PID_Pi_domainA", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} < 0.15 GeV/c; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); - histosMCreco.add("rapidity_event_non0charge_WTS_PID_Pi_domainB", "Rapidity of Events With Track Selection and PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c$; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); - histosMCreco.add("rapidity_event_non0charge_WTS_PID_Pi_domainC", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} > 0.80 GeV/c; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); - - // Invariant Mass of 0 charge events - histosMCreco.add("invMass_event_0charge_WTS_PID_Pi_domainA", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for p_{T} < 0.15 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, 0.8, 2.5}}); // pT < 0.15GeV - histosMCreco.add("invMass_event_0charge_WTS_PID_Pi_domainB", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, 0.8, 2.5}}); // 0.15GeV < pT < 0.8GeV - histosMCreco.add("invMass_event_0charge_WTS_PID_Pi_domainC", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for p_{T} > 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, 0.8, 2.5}}); // 0.8GeV < pT - - // Invariant mass of non 0 charge events - histosMCreco.add("invMass_event_non0charge_WTS_PID_Pi_domainA", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for p_{T} < 0.15 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, 0.8, 2.5}}); // pT < 0.15GeV - histosMCreco.add("invMass_event_non0charge_WTS_PID_Pi_domainB", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, 0.8, 2.5}}); // 0.15GeV < pT < 0.8GeV - histosMCreco.add("invMass_event_non0charge_WTS_PID_Pi_domainC", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for p_{T} > 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, 0.8, 2.5}}); // 0.8GeV < pT - - // tpc signal - histosMCreco.add("tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); - histosMCreco.add("tpcSignal_Pi", "TPC dEdx vs p for pions; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); - - // tof beta - histosMCreco.add("tofBeta", "TOF beta vs p; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); - histosMCreco.add("tofBeta_Pi", "TOF beta vs p for pions; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); - - // Other signals - histosMCreco.add("FT0A", "T0A amplitude", kTH1F, {{200, 0.0, 500.0}}); - histosMCreco.add("FT0C", "T0C amplitude", kTH1F, {{200, 0.0, 500.0}}); - histosMCreco.add("ZDC_A", "ZDC amplitude", kTH1F, {{1000, 0.0, 15}}); - histosMCreco.add("ZDC_C", "ZDC amplitude", kTH1F, {{1000, 0.0, 15}}); - histosMCreco.add("V0A", "V0A amplitude", kTH1F, {{1000, 0.0, 100}}); - - // Collin Soper Theta and Phi - histosMCreco.add("CS_phi_pair_1", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); - histosMCreco.add("CS_phi_pair_2", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); - histosMCreco.add("CS_costheta_pair_1", "#theta Distribution;cos(#theta); Counts", kTH1F, {{nBinsCosTheta, -1, 1}}); - histosMCreco.add("CS_costheta_pair_2", "#theta Distribution;cos(#theta); Counts", kTH1F, {{nBinsCosTheta, -1, 1}}); - } + + // counts + histosMCgen.add("rhoPrimeCounts", "Total Rho prime Events; Events", kTH1F, {{10, 0, 10}}); + + // Track Stuff + histosMCgen.add("MCgen_particle_pT", "Generated pT; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 10}}); + histosMCgen.add("MCgen_particle_pT_contributed", "Generated pT; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 10}}); + histosMCgen.add("MCgen_particle_rapidity", "Generated Rapidity; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + histosMCgen.add("MCgen_particle_rapidity_contributed", "Generated Rapidity; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + + // Generated Transverse Momentum, Rapidty and Invariant Mass + histosMCgen.add("MCgen_4pion_pT", "Generated pT; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); + histosMCgen.add("MCgen_4pion_rapidity", "Generated Rapidity; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + histosMCgen.add("MCgen_4pion_invmass", "Invariant Mass of 4-Pions; m(4-pion); Events", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); + + // Collin Soper Theta and Phi + histosMCgen.add("MCgen_CS_phi_pair_1", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); + histosMCgen.add("MCgen_CS_phi_pair_2", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); + histosMCgen.add("MCgen_CS_costheta_pair_1", "#theta Distribution;cos(#theta); Events", kTH1F, {{nBinsCosTheta, -1, 1}}); + histosMCgen.add("MCgen_CS_costheta_pair_2", "#theta Distribution;cos(#theta); Events", kTH1F, {{nBinsCosTheta, -1, 1}}); + + // MC Reco Stuff + + histosMCreco.add("GapSide", "Gap Side; Events", kTH1F, {{4, -1.5, 2.5}}); + histosMCreco.add("TrueGapSide", "Gap Side; Events", kTH1F, {{4, -1.5, 2.5}}); + histosMCreco.add("EventCounts", "Total Events; Events", kTH1F, {{10, 0, 10}}); + + // TPC nSigma + histosMCreco.add("tpcNSigmaPi_WOTS", "TPC nSigma Pion without track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tpcNSigmaPi_WTS", "TPC nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tpcNSigmaPi_WTS_PID_Pi", "TPC nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + + // TPC nSigma of other particles with selected pion tracks + histosMCreco.add("tpcNSigmaKa_WTS_PID_Pi", "TPC nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tpcNSigmaPr_WTS_PID_Pi", "TPC nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tpcNSigmaEl_WTS_PID_Pi", "TPC nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tpcNSigmaMu_WTS_PID_Pi", "TPC nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + + // TOF nSigma + histosMCreco.add("tofNSigmaPi_WTS", "TOF nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tofNSigmaPi_WOTS", "TOF nSigma Pion without track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tofNSigmaPi_WTS_PID_Pi", "TOF nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + + // TOF nSigma of other particles with selected pion tracks + histosMCreco.add("tofNSigmaKa_WTS_PID_Pi", "TOF nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tofNSigmaPr_WTS_PID_Pi", "TOF nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tofNSigmaEl_WTS_PID_Pi", "TOF nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tofNSigmaMu_WTS_PID_Pi", "TOF nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + + // Track Transverse Momentum + histosMCreco.add("pT_track_WOTS", "pT without track selection; pT [GeV/c]; Counts", kTH1F, {{nBinsPt, 0, 2}}); + histosMCreco.add("pT_track_WTS", "pT with track selection; pT [GeV/c]; Counts", kTH1F, {{nBinsPt, 0, 2}}); + histosMCreco.add("pT_track_WTS_PID_Pi", "pT with track selection and PID selection of Pi; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); + histosMCreco.add("pT_track_WTS_PID_Pi_contributed", "pT with track selection and PID selection of Pi which are contributed to selected event; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); + + // Track Rapidity + histosMCreco.add("rapidity_track_WOTS", "Rapidity without track selection; y; Counts", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + histosMCreco.add("rapidity_track_WTS", "Rapidity with track selection; y; Counts", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + histosMCreco.add("rapidity_track_WTS_PID_Pi", "Rapidity with track selection and PID selection of Pi; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + histosMCreco.add("rapidity_track_WTS_PID_Pi_contributed", "Rapidity with track selection and PID selection of Pi which are contributed to selected event; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + + // Zero charge Event Transverse Momentum + histosMCreco.add("pT_event_0charge_WTS_PID_Pi", "Event pT in 0 Charge Events With Track Selection and PID Selection of Pi; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); + + // Non Zero charge Event Transverse Momentum + histosMCreco.add("pT_event_non0charge_WTS_PID_Pi", "Event pT in Non 0 Charge Events With Track Selection and PID Selection of Pi; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); + + // Rapidity of 0 charge Events + histosMCreco.add("rapidity_event_0charge_WTS_PID_Pi_domainA", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} < 0.15 GeV/c; y; Events", kTH1F, {{1000, -2.5, 2.5}}); + histosMCreco.add("rapidity_event_0charge_WTS_PID_Pi_domainB", "Rapidity of Events With Track Selection and PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; y; Events", kTH1F, {{1000, -2.5, 2.5}}); + histosMCreco.add("rapidity_event_0charge_WTS_PID_Pi_domainC", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} > 0.80 GeV/c; y; Events", kTH1F, {{1000, -2.5, 2.5}}); + + // Rapidity of non 0 charge Events + histosMCreco.add("rapidity_event_non0charge_WTS_PID_Pi_domainA", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} < 0.15 GeV/c; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + histosMCreco.add("rapidity_event_non0charge_WTS_PID_Pi_domainB", "Rapidity of Events With Track Selection and PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c$; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + histosMCreco.add("rapidity_event_non0charge_WTS_PID_Pi_domainC", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} > 0.80 GeV/c; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + + // Invariant Mass of 0 charge events + histosMCreco.add("invMass_event_0charge_WTS_PID_Pi_domainA", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for p_{T} < 0.15 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // pT < 0.15GeV + histosMCreco.add("invMass_event_0charge_WTS_PID_Pi_domainB", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // 0.15GeV < pT < 0.8GeV + histosMCreco.add("invMass_event_0charge_WTS_PID_Pi_domainC", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for p_{T} > 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // 0.8GeV < pT + + // Invariant mass of non 0 charge events + histosMCreco.add("invMass_event_non0charge_WTS_PID_Pi_domainA", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for p_{T} < 0.15 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // pT < 0.15GeV + histosMCreco.add("invMass_event_non0charge_WTS_PID_Pi_domainB", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // 0.15GeV < pT < 0.8GeV + histosMCreco.add("invMass_event_non0charge_WTS_PID_Pi_domainC", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for p_{T} > 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // 0.8GeV < pT + + // tpc signal + histosMCreco.add("tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); + histosMCreco.add("tpcSignal_Pi", "TPC dEdx vs p for pions; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); + + // tof beta + histosMCreco.add("tofBeta", "TOF beta vs p; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); + histosMCreco.add("tofBeta_Pi", "TOF beta vs p for pions; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); + + // Other signals + histosMCreco.add("FT0A", "T0A amplitude", kTH1F, {{200, 0.0, 500.0}}); + histosMCreco.add("FT0C", "T0C amplitude", kTH1F, {{200, 0.0, 500.0}}); + histosMCreco.add("ZDC_A", "ZDC amplitude", kTH1F, {{1000, 0.0, 15}}); + histosMCreco.add("ZDC_C", "ZDC amplitude", kTH1F, {{1000, 0.0, 15}}); + histosMCreco.add("V0A", "V0A amplitude", kTH1F, {{1000, 0.0, 100}}); + + // Collin Soper Theta and Phi + histosMCreco.add("CS_phi_pair_1", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); + histosMCreco.add("CS_phi_pair_2", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); + histosMCreco.add("CS_costheta_pair_1", "#theta Distribution;cos(#theta); Counts", kTH1F, {{nBinsCosTheta, -1, 1}}); + histosMCreco.add("CS_costheta_pair_2", "#theta Distribution;cos(#theta); Counts", kTH1F, {{nBinsCosTheta, -1, 1}}); } // End of init function //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -399,22 +414,31 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct int numPiPlusTracks = static_cast(Pi_plus_tracks.size()); int numPionMinusTRacks = static_cast(Pi_minus_tracks.size()); + TLorentzVector tempWOTS; for (int i = 0; i < numTracksWOTS; i++) { + tempWOTS.SetXYZM(WOTS_tracks[i].px(), WOTS_tracks[i].py(), WOTS_tracks[i].pz(), o2::constants::physics::MassPionCharged); histosData.fill(HIST("tpcNSigmaPi_WOTS"), WOTS_tracks[i].tpcNSigmaPi(), std::sqrt(WOTS_tracks[i].px() * WOTS_tracks[i].px() + WOTS_tracks[i].py() * WOTS_tracks[i].py())); histosData.fill(HIST("tofNSigmaPi_WOTS"), WOTS_tracks[i].tofNSigmaPi(), std::sqrt(WOTS_tracks[i].px() * WOTS_tracks[i].px() + WOTS_tracks[i].py() * WOTS_tracks[i].py())); histosData.fill(HIST("pT_track_WOTS"), std::sqrt(WOTS_tracks[i].px() * WOTS_tracks[i].px() + WOTS_tracks[i].py() * WOTS_tracks[i].py())); + histosData.fill(HIST("rapidity_track_WOTS"), tempWOTS.Rapidity()); } // End of loop over tracks without selection + TLorentzVector tempWTS; for (int i = 0; i < numTracksWTS; i++) { + tempWTS.SetXYZM(WTS_tracks[i].px(), WTS_tracks[i].py(), WTS_tracks[i].pz(), o2::constants::physics::MassPionCharged); histosData.fill(HIST("tpcSignal"), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py() + WTS_tracks[i].pz() * WTS_tracks[i].pz()), WTS_tracks[i].tpcSignal()); histosData.fill(HIST("tofBeta"), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py() + WTS_tracks[i].pz() * WTS_tracks[i].pz()), WTS_tracks[i].beta()); histosData.fill(HIST("tpcNSigmaPi_WTS"), WTS_tracks[i].tpcNSigmaPi(), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py())); histosData.fill(HIST("tofNSigmaPi_WTS"), WTS_tracks[i].tofNSigmaPi(), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py())); histosData.fill(HIST("pT_track_WTS"), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py())); + histosData.fill(HIST("rapidity_track_WTS"), tempWTS.Rapidity()); } // End of loop over tracks with selection only + TLorentzVector tempWTSPIDPi; for (int i = 0; i < numTracksWTSandPIDpi; i++) { + tempWTSPIDPi.SetXYZM(WTS_PID_Pi_tracks[i].px(), WTS_PID_Pi_tracks[i].py(), WTS_PID_Pi_tracks[i].pz(), o2::constants::physics::MassPionCharged); + histosData.fill(HIST("tpcSignal_Pi"), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py() + WTS_PID_Pi_tracks[i].pz() * WTS_PID_Pi_tracks[i].pz()), WTS_PID_Pi_tracks[i].tpcSignal()); histosData.fill(HIST("tofBeta_Pi"), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py() + WTS_PID_Pi_tracks[i].pz() * WTS_PID_Pi_tracks[i].pz()), WTS_PID_Pi_tracks[i].beta()); @@ -431,6 +455,7 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosData.fill(HIST("tofNSigmaMu_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaMu(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); histosData.fill(HIST("pT_track_WTS_PID_Pi"), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); + histosData.fill(HIST("rapidity_track_WTS_PID_Pi"), tempWTSPIDPi.Rapidity()); } // End of loop over tracks with selection and PID selection of Pions if (numTracksWTSandPIDpi != 4) { @@ -448,6 +473,16 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct p3.SetXYZM(Pi_minus_tracks[0].px(), Pi_minus_tracks[0].py(), Pi_minus_tracks[0].pz(), o2::constants::physics::MassPionCharged); p4.SetXYZM(Pi_minus_tracks[1].px(), Pi_minus_tracks[1].py(), Pi_minus_tracks[1].pz(), o2::constants::physics::MassPionCharged); + histosData.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p1.Pt()); + histosData.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p2.Pt()); + histosData.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p3.Pt()); + histosData.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p4.Pt()); + + histosData.fill(HIST("rapidity_track_WTS_PID_Pi_contributed"), p1.Rapidity()); + histosData.fill(HIST("rapidity_track_WTS_PID_Pi_contributed"), p2.Rapidity()); + histosData.fill(HIST("rapidity_track_WTS_PID_Pi_contributed"), p3.Rapidity()); + histosData.fill(HIST("rapidity_track_WTS_PID_Pi_contributed"), p4.Rapidity()); + k1.SetCoordinates(p1.Pt(), p1.Eta(), p1.Phi(), o2::constants::physics::MassPionCharged); k2.SetCoordinates(p2.Pt(), p2.Eta(), p2.Phi(), o2::constants::physics::MassPionCharged); k3.SetCoordinates(p3.Pt(), p3.Eta(), p3.Phi(), o2::constants::physics::MassPionCharged); @@ -520,7 +555,7 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct } // End of Analysis for non 0 charge events } // End of 4 Pion Analysis Process function for Data - PROCESS_SWITCH(exclusiveRhoTo4Pi, processData, "The Process for 4 Pion Analysis from data", ifDataAnalysis); + PROCESS_SWITCH(exclusiveRhoTo4Pi, processData, "The Process for 4 Pion Analysis from data", true); //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- // Begin of MC Generation function----------------------------------------------------------------------------------------------------------------------------------------------- @@ -548,17 +583,17 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct flag = true; if (particle.pdgCode() == 211) { + histosMCgen.fill(HIST("MCgen_particle_pT"), tempVector.Pt()); + histosMCgen.fill(HIST("MCgen_particle_rapidity"), tempVector.Rapidity()); if (std::abs(tempVector.Rapidity()) < 0.9) { piPlusvectors.push_back(tempVector); - histosMCgen.fill(HIST("MCgen_particle_pT"), tempVector.Pt()); - histosMCgen.fill(HIST("MCgen_particle_rapidity"), tempVector.Rapidity()); } } if (particle.pdgCode() == -211) { + histosMCgen.fill(HIST("MCgen_particle_pT"), tempVector.Pt()); + histosMCgen.fill(HIST("MCgen_particle_rapidity"), tempVector.Rapidity()); if (std::abs(tempVector.Rapidity()) < 0.9) { piMinusvectors.push_back(tempVector); - histosMCgen.fill(HIST("MCgen_particle_pT"), tempVector.Pt()); - histosMCgen.fill(HIST("MCgen_particle_rapidity"), tempVector.Rapidity()); } } } // End of Mother ID 30113 rho prime @@ -570,6 +605,17 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct } p1234 = piPlusvectors[0] + piPlusvectors[1] + piMinusvectors[0] + piMinusvectors[1]; + + histosMCgen.fill(HIST("MCgen_particle_pT_contributed"), piPlusvectors[0].Pt()); + histosMCgen.fill(HIST("MCgen_particle_pT_contributed"), piPlusvectors[1].Pt()); + histosMCgen.fill(HIST("MCgen_particle_pT_contributed"), piMinusvectors[0].Pt()); + histosMCgen.fill(HIST("MCgen_particle_pT_contributed"), piMinusvectors[1].Pt()); + + histosMCgen.fill(HIST("MCgen_particle_rapidity_contributed"), piPlusvectors[0].Rapidity()); + histosMCgen.fill(HIST("MCgen_particle_rapidity_contributed"), piPlusvectors[1].Rapidity()); + histosMCgen.fill(HIST("MCgen_particle_rapidity_contributed"), piMinusvectors[0].Rapidity()); + histosMCgen.fill(HIST("MCgen_particle_rapidity_contributed"), piMinusvectors[1].Rapidity()); + histosMCgen.fill(HIST("MCgen_4pion_pT"), p1234.Pt()); histosMCgen.fill(HIST("MCgen_4pion_rapidity"), p1234.Rapidity()); histosMCgen.fill(HIST("MCgen_4pion_invmass"), p1234.M()); @@ -599,7 +645,7 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosMCgen.fill(HIST("MCgen_CS_costheta_pair_2"), cosThetaPair2); } // End of 4 Pion MC Generation Process function - PROCESS_SWITCH(exclusiveRhoTo4Pi, processMCgen, "The Process for 4 Pion Analysis from MC Generation", ifMCAnalysis); + PROCESS_SWITCH(exclusiveRhoTo4Pi, processMCgen, "The Process for 4 Pion Analysis from MC Generation", false); using CollisionStuff = soa::Join; using CollisionTotal = CollisionStuff::iterator; @@ -678,22 +724,31 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct int numPiPlusTracks = static_cast(Pi_plus_tracks.size()); int numPionMinusTRacks = static_cast(Pi_minus_tracks.size()); + TLorentzVector tempWOTS; for (int i = 0; i < numTracksWOTS; i++) { + tempWOTS.SetXYZM(WOTS_tracks[i].px(), WOTS_tracks[i].py(), WOTS_tracks[i].pz(), o2::constants::physics::MassPionCharged); histosMCreco.fill(HIST("tpcNSigmaPi_WOTS"), WOTS_tracks[i].tpcNSigmaPi(), std::sqrt(WOTS_tracks[i].px() * WOTS_tracks[i].px() + WOTS_tracks[i].py() * WOTS_tracks[i].py())); histosMCreco.fill(HIST("tofNSigmaPi_WOTS"), WOTS_tracks[i].tofNSigmaPi(), std::sqrt(WOTS_tracks[i].px() * WOTS_tracks[i].px() + WOTS_tracks[i].py() * WOTS_tracks[i].py())); histosMCreco.fill(HIST("pT_track_WOTS"), std::sqrt(WOTS_tracks[i].px() * WOTS_tracks[i].px() + WOTS_tracks[i].py() * WOTS_tracks[i].py())); + histosMCreco.fill(HIST("rapidity_track_WOTS"), tempWOTS.Rapidity()); } // End of loop over tracks without selection + TLorentzVector tempWTS; for (int i = 0; i < numTracksWTS; i++) { + tempWTS.SetXYZM(WTS_tracks[i].px(), WTS_tracks[i].py(), WTS_tracks[i].pz(), o2::constants::physics::MassPionCharged); histosMCreco.fill(HIST("tpcSignal"), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py() + WTS_tracks[i].pz() * WTS_tracks[i].pz()), WTS_tracks[i].tpcSignal()); histosMCreco.fill(HIST("tofBeta"), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py() + WTS_tracks[i].pz() * WTS_tracks[i].pz()), WTS_tracks[i].beta()); histosMCreco.fill(HIST("tpcNSigmaPi_WTS"), WTS_tracks[i].tpcNSigmaPi(), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py())); histosMCreco.fill(HIST("tofNSigmaPi_WTS"), WTS_tracks[i].tofNSigmaPi(), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py())); histosMCreco.fill(HIST("pT_track_WTS"), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py())); + histosMCreco.fill(HIST("rapidity_track_WTS"), tempWTS.Rapidity()); } // End of loop over tracks with selection only + TLorentzVector tempWTSPIDPi; for (int i = 0; i < numTracksWTSandPIDpi; i++) { + tempWTSPIDPi.SetXYZM(WTS_PID_Pi_tracks[i].px(), WTS_PID_Pi_tracks[i].py(), WTS_PID_Pi_tracks[i].pz(), o2::constants::physics::MassPionCharged); + histosMCreco.fill(HIST("tpcSignal_Pi"), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py() + WTS_PID_Pi_tracks[i].pz() * WTS_PID_Pi_tracks[i].pz()), WTS_PID_Pi_tracks[i].tpcSignal()); histosMCreco.fill(HIST("tofBeta_Pi"), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py() + WTS_PID_Pi_tracks[i].pz() * WTS_PID_Pi_tracks[i].pz()), WTS_PID_Pi_tracks[i].beta()); @@ -710,6 +765,7 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosMCreco.fill(HIST("tofNSigmaMu_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaMu(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); histosMCreco.fill(HIST("pT_track_WTS_PID_Pi"), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); + histosMCreco.fill(HIST("rapidity_track_WTS_PID_Pi"), tempWTSPIDPi.Rapidity()); } // End of loop over tracks with selection and PID selection of Pions if (numTracksWTSandPIDpi != 4) { @@ -727,6 +783,16 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct p3.SetXYZM(Pi_minus_tracks[0].px(), Pi_minus_tracks[0].py(), Pi_minus_tracks[0].pz(), o2::constants::physics::MassPionCharged); p4.SetXYZM(Pi_minus_tracks[1].px(), Pi_minus_tracks[1].py(), Pi_minus_tracks[1].pz(), o2::constants::physics::MassPionCharged); + histosMCreco.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p1.Pt()); + histosMCreco.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p2.Pt()); + histosMCreco.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p3.Pt()); + histosMCreco.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p4.Pt()); + + histosMCreco.fill(HIST("rapidity_track_WTS_PID_Pi_contributed"), p1.Rapidity()); + histosMCreco.fill(HIST("rapidity_track_WTS_PID_Pi_contributed"), p2.Rapidity()); + histosMCreco.fill(HIST("rapidity_track_WTS_PID_Pi_contributed"), p3.Rapidity()); + histosMCreco.fill(HIST("rapidity_track_WTS_PID_Pi_contributed"), p4.Rapidity()); + k1.SetCoordinates(p1.Pt(), p1.Eta(), p1.Phi(), o2::constants::physics::MassPionCharged); k2.SetCoordinates(p2.Pt(), p2.Eta(), p2.Phi(), o2::constants::physics::MassPionCharged); k3.SetCoordinates(p3.Pt(), p3.Eta(), p3.Phi(), o2::constants::physics::MassPionCharged); @@ -799,7 +865,7 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct } // End of Analysis for non 0 charge events } // End of 4 Pion Analysis Process function for MC Reconstruction - PROCESS_SWITCH(exclusiveRhoTo4Pi, processMCrec, "The Process for 4 Pion Analysis from MC Reconstruction", ifMCAnalysis); + PROCESS_SWITCH(exclusiveRhoTo4Pi, processMCrec, "The Process for 4 Pion Analysis from MC Reconstruction", false); }; // End of Struct exclusiveRhoTo4Pi ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// From 00b836fcf26145977b024a24598be6454f53db94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Jura=C4=8Dka?= <137087737+jjuracka@users.noreply.github.com> Date: Tue, 18 Feb 2025 12:08:48 +0100 Subject: [PATCH 0288/1650] [PWGUD] changes to upcRhoAnalysis.cxx (#10034) Co-authored-by: ALICE Action Bot --- PWGUD/Tasks/upcRhoAnalysis.cxx | 1341 ++++++++++++-------------------- 1 file changed, 484 insertions(+), 857 deletions(-) diff --git a/PWGUD/Tasks/upcRhoAnalysis.cxx b/PWGUD/Tasks/upcRhoAnalysis.cxx index 597f4945a3f..1395d66c04b 100644 --- a/PWGUD/Tasks/upcRhoAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoAnalysis.cxx @@ -13,8 +13,10 @@ /// includes event tagging based on ZN information, track selection, reconstruction, /// and also some basic stuff for decay phi anisotropy studies /// \author Jakub Juracka, jakub.juracka@cern.ch +/// \file upcRhoAnalysis.cxx #include +#include #include #include "Framework/AnalysisTask.h" @@ -39,16 +41,15 @@ using FullUdTracks = soa::Join); -// for lorentz vector reconstruction -DECLARE_SOA_COLUMN(TrackPt, trackPt, std::vector); -DECLARE_SOA_COLUMN(TrackEta, trackEta, std::vector); -DECLARE_SOA_COLUMN(TrackPhi, trackPhi, std::vector); -DECLARE_SOA_COLUMN(TrackM, trackM, std::vector); -// other stuff -DECLARE_SOA_COLUMN(TrackPiPID, trackPiPID, std::vector); -DECLARE_SOA_COLUMN(TrackElPID, trackElPID, std::vector); -DECLARE_SOA_COLUMN(TrackDcaXY, trackDcaXY, std::vector); -DECLARE_SOA_COLUMN(TrackDcaZ, trackDcaZ, std::vector); -DECLARE_SOA_COLUMN(TrackTpcSignal, trackTpcSignal, std::vector); -} // namespace tree -DECLARE_SOA_TABLE(Tree, "AOD", "TREE", - tree::RunNumber, tree::GlobalBC, tree::NumContrib, - tree::PosX, tree::PosY, tree::PosZ, tree::TotalFT0AmplitudeA, tree::TotalFT0AmplitudeC, tree::TotalFV0AmplitudeA, tree::TotalFDDAmplitudeA, tree::TotalFDDAmplitudeC, - tree::TimeFT0A, tree::TimeFT0C, tree::TimeFV0A, tree::TimeFDDA, tree::TimeFDDC, - tree::EnergyCommonZNA, tree::EnergyCommonZNC, tree::TimeZNA, tree::TimeZNC, tree::NeutronClass, - tree::TotalCharge, tree::RhoPt, tree::RhoEta, tree::RhoPhi, tree::RhoM, tree::RhoPhiRandom, tree::RhoPhiCharge, - tree::TrackSign, tree::TrackPt, tree::TrackEta, tree::TrackPhi, tree::TrackM, tree::TrackPiPID, tree::TrackElPID, tree::TrackDcaXY, tree::TrackDcaZ, tree::TrackTpcSignal); +// pion tracks +DECLARE_SOA_COLUMN(PhiRandom, phiRandom, float); +DECLARE_SOA_COLUMN(PhiCharge, phiCharge, float); +DECLARE_SOA_COLUMN(TrackSign, trackSign, int[2]); +DECLARE_SOA_COLUMN(TrackPt, trackPt, float[2]); +DECLARE_SOA_COLUMN(TrackEta, trackEta, float[2]); +DECLARE_SOA_COLUMN(TrackPhi, trackPhi, float[2]); +DECLARE_SOA_COLUMN(TrackPiPID, trackPiPID, float[2]); +DECLARE_SOA_COLUMN(TrackElPID, trackElPID, float[2]); +DECLARE_SOA_COLUMN(TrackKaPID, trackKaPID, float[2]); +DECLARE_SOA_COLUMN(TrackDcaXY, trackDcaXY, float[2]); +DECLARE_SOA_COLUMN(TrackDcaZ, trackDcaZ, float[2]); +DECLARE_SOA_COLUMN(TrackTpcSignal, trackTpcSignal, float[2]); +} // namespace reco_tree +DECLARE_SOA_TABLE(RecoTree, "AOD", "RECOTREE", + reco_tree::RunNumber, reco_tree::LocalBC, reco_tree::NumContrib, reco_tree::PosX, reco_tree::PosY, reco_tree::PosZ, + reco_tree::TotalFT0AmplitudeA, reco_tree::TotalFT0AmplitudeC, reco_tree::TotalFV0AmplitudeA, reco_tree::TotalFDDAmplitudeA, reco_tree::TotalFDDAmplitudeC, + reco_tree::TimeFT0A, reco_tree::TimeFT0C, reco_tree::TimeFV0A, reco_tree::TimeFDDA, reco_tree::TimeFDDC, + reco_tree::EnergyCommonZNA, reco_tree::EnergyCommonZNC, reco_tree::TimeZNA, reco_tree::TimeZNC, + reco_tree::PhiRandom, reco_tree::PhiCharge, reco_tree::TrackSign, reco_tree::TrackPt, reco_tree::TrackEta, reco_tree::TrackPhi, reco_tree::TrackPiPID, reco_tree::TrackElPID, reco_tree::TrackKaPID, reco_tree::TrackDcaXY, reco_tree::TrackDcaZ, reco_tree::TrackTpcSignal); + +namespace mc_tree +{ +// misc event info +DECLARE_SOA_COLUMN(LocalBc, localBc, int); +// event vertex +DECLARE_SOA_COLUMN(PosX, posX, float); +DECLARE_SOA_COLUMN(PosY, posY, float); +DECLARE_SOA_COLUMN(PosZ, posZ, float); +// pion tracks +DECLARE_SOA_COLUMN(PhiRandom, phiRandom, float); +DECLARE_SOA_COLUMN(PhiCharge, phiCharge, float); +DECLARE_SOA_COLUMN(TrackSign, trackSign, int[2]); +DECLARE_SOA_COLUMN(TrackPt, trackPt, float[2]); +DECLARE_SOA_COLUMN(TrackEta, trackEta, float[2]); +DECLARE_SOA_COLUMN(TrackPhi, trackPhi, float[2]); +} // namespace mc_tree +DECLARE_SOA_TABLE(McTree, "AOD", "MCTREE", + mc_tree::LocalBc, + mc_tree::PosX, mc_tree::PosY, mc_tree::PosZ, + mc_tree::PhiRandom, mc_tree::PhiCharge, mc_tree::TrackSign, mc_tree::TrackPt, mc_tree::TrackEta, mc_tree::TrackPhi); } // namespace o2::aod -struct upcRhoAnalysis { - Produces Tree; +struct UpcRhoAnalysis { + Produces recoTree; + Produces mcTree; - double PcEtaCut = 0.9; // physics coordination recommendation + Configurable savePions{"savePions", true, "save pion tracks into derived tables"}; + Configurable saveElectrons{"saveElectrons", false, "save electron tracks into derived tables"}; + Configurable saveKaons{"saveKaons", false, "save kaon tracks into derived tables"}; + + float pcEtaCut = 0.9; // physics coordination recommendation Configurable requireTof{"requireTof", false, "require TOF signal"}; - Configurable do4pi{"do4pi", true, "do 4pi analysis"}; - Configurable collisionsPosZMaxCut{"collisionsPosZMaxCut", 10.0, "max Z position cut on collisions"}; - Configurable ZNcommonEnergyCut{"ZNcommonEnergyCut", 0.0, "ZN common energy cut"}; - Configurable ZNtimeCut{"ZNtimeCut", 2.0, "ZN time cut"}; + Configurable collisionsPosZMaxCut{"collisionsPosZMaxCut", 10.0, "max Z position cut on collisions"}; + Configurable collisionsNumContribsMaxCut{"collisionsNumContribsMaxCut", 4, "max number of contributors cut on collisions"}; + Configurable znCommonEnergyCut{"znCommonEnergyCut", 0.0, "ZN common energy cut"}; + Configurable znTimeCut{"znTimeCut", 2.0, "ZN time cut"}; - Configurable tracksTpcNSigmaPiCut{"tracksTpcNSigmaPiCut", 3.0, "TPC nSigma pion cut"}; - Configurable tracksDcaMaxCut{"tracksDcaMaxCut", 1.0, "max DCA cut on tracks"}; + Configurable tracksTpcNSigmaPiCut{"tracksTpcNSigmaPiCut", 3.0, "TPC nSigma pion cut"}; + Configurable tracksTpcNSigmaElCut{"tracksTpcNSigmaElCut", 3.0, "TPC nSigma electron cut"}; + Configurable tracksTpcNSigmaKaCut{"tracksTpcNSigmaKaCut", 3.0, "TPC nSigma kaon cut"}; + Configurable tracksDcaMaxCut{"tracksDcaMaxCut", 1.0, "max DCA cut on tracks"}; Configurable tracksMinItsNClsCut{"tracksMinItsNClsCut", 6, "min ITS clusters cut"}; - Configurable tracksMaxItsChi2NClCut{"tracksMaxItsChi2NClCut", 3.0, "max ITS chi2/Ncls cut"}; + Configurable tracksMaxItsChi2NClCut{"tracksMaxItsChi2NClCut", 3.0, "max ITS chi2/Ncls cut"}; Configurable tracksMinTpcNClsCut{"tracksMinTpcNClsCut", 120, "min TPC clusters cut"}; Configurable tracksMinTpcNClsCrossedRowsCut{"tracksMinTpcNClsCrossedRowsCut", 140, "min TPC crossed rows cut"}; - Configurable tracksMinTpcChi2NClCut{"tracksMinTpcChi2NClCut", 1.0, "min TPC chi2/Ncls cut"}; - Configurable tracksMaxTpcChi2NClCut{"tracksMaxTpcChi2NClCut", 1.8, "max TPC chi2/Ncls cut"}; - Configurable tracksMinTpcNClsCrossedOverFindableCut{"tracksMinTpcNClsCrossedOverFindableCut", 1.05, "min TPC crossed rows / findable clusters cut"}; - Configurable tracksMinPtCut{"tracksMinPtCut", 0.2, "min pT cut on tracks"}; + Configurable tracksMinTpcChi2NClCut{"tracksMinTpcChi2NClCut", 1.0, "min TPC chi2/Ncls cut"}; + Configurable tracksMaxTpcChi2NClCut{"tracksMaxTpcChi2NClCut", 1.8, "max TPC chi2/Ncls cut"}; + Configurable tracksMinTpcNClsCrossedOverFindableCut{"tracksMinTpcNClsCrossedOverFindableCut", 1.05, "min TPC crossed rows / findable clusters cut"}; + Configurable tracksMinPtCut{"tracksMinPtCut", 0.2, "min pT cut on tracks"}; - Configurable systemMassMinCut{"systemMassMinCut", 0.4, "min M cut for reco system"}; - Configurable systemMassMaxCut{"systemMassMaxCut", 1.2, "max M cut for reco system"}; - Configurable systemPtCut{"systemPtMaxCut", 0.1, "max pT cut for reco system"}; - Configurable systemYCut{"systemYCut", 0.9, "rapiditiy cut for reco system"}; + Configurable systemMassMinCut{"systemMassMinCut", 0.4, "min M cut for reco system"}; + Configurable systemMassMaxCut{"systemMassMaxCut", 1.2, "max M cut for reco system"}; + Configurable systemPtCut{"systemPtCut", 0.1, "max pT cut for reco system"}; + Configurable systemYCut{"systemYCut", 0.9, "rapiditiy cut for reco system"}; ConfigurableAxis mAxis{"mAxis", {1000, 0.0, 10.0}, "m (GeV/#it{c}^{2})"}; ConfigurableAxis mCutAxis{"mCutAxis", {160, 0.4, 1.2}, "m (GeV/#it{c}^{2})"}; @@ -138,424 +155,295 @@ struct upcRhoAnalysis { ConfigurableAxis phiAxis{"phiAxis", {180, 0.0, o2::constants::math::TwoPI}, "#phi"}; ConfigurableAxis phiAsymmAxis{"phiAsymmAxis", {182, -o2::constants::math::PI, o2::constants::math::PI}, "#phi"}; ConfigurableAxis momentumFromPhiAxis{"momentumFromPhiAxis", {400, -0.1, 0.1}, "p (GeV/#it{c})"}; - // ConfigurableAxis ptQuantileAxis{"ptQuantileAxis", {0, 0.0181689, 0.0263408, 0.0330488, 0.0390369, 0.045058, 0.0512604, 0.0582598, 0.066986, 0.0788085, 0.1}, "p_{T} (GeV/#it{c})"}; + ConfigurableAxis znCommonEnergyAxis{"znCommonEnergyAxis", {250, -5.0, 20.0}, "ZN common energy (TeV)"}; + ConfigurableAxis znTimeAxis{"znTimeAxis", {200, -10.0, 10.0}, "ZN time (ns)"}; - HistogramRegistry QC{"QC", {}, OutputObjHandlingPolicy::AnalysisObject}; - HistogramRegistry Pions{"Pions", {}, OutputObjHandlingPolicy::AnalysisObject}; - HistogramRegistry System{"System", {}, OutputObjHandlingPolicy::AnalysisObject}; - HistogramRegistry MC{"MC", {}, OutputObjHandlingPolicy::AnalysisObject}; - HistogramRegistry FourPiQA{"4piQA", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry rQC{"rQC", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry rTracks{"rTracks", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry rSystem{"rSystem", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry rMC{"rMC", {}, OutputObjHandlingPolicy::AnalysisObject}; void init(o2::framework::InitContext&) { // QA // // collisions - QC.add("QC/collisions/all/hPosXY", ";x (cm);y (cm);counts", kTH2D, {{2000, -0.1, 0.1}, {2000, -0.1, 0.1}}); - QC.add("QC/collisions/all/hPosZ", ";z (cm);counts", kTH1D, {{400, -20.0, 20.0}}); - QC.add("QC/collisions/all/hNumContrib", ";number of contributors;counts", kTH1D, {{36, -0.5, 35.5}}); - QC.add("QC/collisions/all/hZdcCommonEnergy", ";ZNA common energy;ZNC common energy;counts", kTH2D, {{250, -5.0, 20.0}, {250, -5.0, 20.0}}); - QC.add("QC/collisions/all/hZdcTime", ";ZNA time (ns);ZNC time (ns);counts", kTH2D, {{200, -10.0, 10.0}, {200, -10.0, 10.0}}); - QC.add("QC/collisions/all/hTotalFT0AmplitudeA", ";FT0A amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); - QC.add("QC/collisions/all/hTotalFT0AmplitudeC", ";FT0C amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); - QC.add("QC/collisions/all/hTotalFV0AmplitudeA", ";FV0A amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); - QC.add("QC/collisions/all/hTotalFDDAmplitudeA", ";FDDA amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); - QC.add("QC/collisions/all/hTotalFDDAmplitudeC", ";FDDC amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); - QC.add("QC/collisions/all/hTimeFT0A", ";FT0A time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); - QC.add("QC/collisions/all/hTimeFT0C", ";FT0C time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); - QC.add("QC/collisions/all/hTimeFV0A", ";FV0A time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); - QC.add("QC/collisions/all/hTimeFDDA", ";FDDA time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); - QC.add("QC/collisions/all/hTimeFDDC", ";FDDC time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); + rQC.add("QC/collisions/all/hPosXY", ";x (cm);y (cm);counts", kTH2D, {{2000, -0.1, 0.1}, {2000, -0.1, 0.1}}); + rQC.add("QC/collisions/all/hPosZ", ";z (cm);counts", kTH1D, {{400, -20.0, 20.0}}); + rQC.add("QC/collisions/all/hNumContrib", ";number of contributors;counts", kTH1D, {{36, -0.5, 35.5}}); + rQC.add("QC/collisions/all/hZdcCommonEnergy", ";ZNA common energy (TeV);ZNC common energy (TeV);counts", kTH2D, {znCommonEnergyAxis, znCommonEnergyAxis}); + rQC.add("QC/collisions/all/hZdcTime", ";ZNA time (ns);ZNC time (ns);counts", kTH2D, {znTimeAxis, znTimeAxis}); + rQC.add("QC/collisions/all/hTotalFT0AmplitudeA", ";FT0A amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); + rQC.add("QC/collisions/all/hTotalFT0AmplitudeC", ";FT0C amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); + rQC.add("QC/collisions/all/hTotalFV0AmplitudeA", ";FV0A amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); + rQC.add("QC/collisions/all/hTotalFDDAmplitudeA", ";FDDA amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); + rQC.add("QC/collisions/all/hTotalFDDAmplitudeC", ";FDDC amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); + rQC.add("QC/collisions/all/hTimeFT0A", ";FT0A time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); + rQC.add("QC/collisions/all/hTimeFT0C", ";FT0C time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); + rQC.add("QC/collisions/all/hTimeFV0A", ";FV0A time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); + rQC.add("QC/collisions/all/hTimeFDDA", ";FDDA time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); + rQC.add("QC/collisions/all/hTimeFDDC", ";FDDC time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); // events with selected rho candidates - QC.add("QC/collisions/selected/hPosXY", ";x (cm);y (cm);counts", kTH2D, {{2000, -0.1, 0.1}, {2000, -0.1, 0.1}}); - QC.add("QC/collisions/selected/hPosZ", ";z (cm);counts", kTH1D, {{400, -20.0, 20.0}}); - QC.add("QC/collisions/selected/hNumContrib", ";number of contributors;counts", kTH1D, {{36, -0.5, 35.5}}); - QC.add("QC/collisions/selected/hZdcCommonEnergy", ";ZNA common energy;ZNC common energy;counts", kTH2D, {{250, -5.0, 20.0}, {250, -5.0, 20.0}}); - QC.add("QC/collisions/selected/hZdcTime", ";ZNA time (ns);ZNC time (ns);counts", kTH2D, {{200, -10.0, 10.0}, {200, -10.0, 10.0}}); - QC.add("QC/collisions/selected/hTotalFT0AmplitudeA", ";FT0A amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); - QC.add("QC/collisions/selected/hTotalFT0AmplitudeC", ";FT0C amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); - QC.add("QC/collisions/selected/hTotalFV0AmplitudeA", ";FV0A amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); - QC.add("QC/collisions/selected/hTotalFDDAmplitudeA", ";FDDA amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); - QC.add("QC/collisions/selected/hTotalFDDAmplitudeC", ";FDDC amplitude;counts", kTH1D, {{1000, 0.0, 1000.0}}); - QC.add("QC/collisions/selected/hTimeFT0A", ";FT0A time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); - QC.add("QC/collisions/selected/hTimeFT0C", ";FT0C time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); - QC.add("QC/collisions/selected/hTimeFV0A", ";FV0A time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); - QC.add("QC/collisions/selected/hTimeFDDA", ";FDDA time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); - QC.add("QC/collisions/selected/hTimeFDDC", ";FDDC time (ns);counts", kTH1D, {{200, -100.0, 100.0}}); - // all tracks - QC.add("QC/tracks/raw/hTpcNSigmaPi", ";TPC n#sigma_{#pi};counts", kTH1D, {{400, -10.0, 30.0}}); - QC.add("QC/tracks/raw/hTofNSigmaPi", ";TOF n#sigma_{#pi};counts", kTH1D, {{400, -20.0, 20.0}}); - QC.add("QC/tracks/raw/hTpcNSigmaEl", ";TPC n#sigma_{e};counts", kTH1D, {{400, -10.0, 30.0}}); - QC.add("QC/tracks/raw/hDcaXYZ", ";DCA_{z} (cm);DCA_{xy} (cm);counts", kTH2D, {{1000, -5.0, 5.0}, {1000, -5.0, 5.0}}); - QC.add("QC/tracks/raw/hItsNCls", ";ITS N_{cls};counts", kTH1D, {{11, -0.5, 10.5}}); - QC.add("QC/tracks/raw/hItsChi2NCl", ";ITS #chi^{2}/N_{cls};counts", kTH1D, {{1000, 0.0, 100.0}}); - QC.add("QC/tracks/raw/hTpcChi2NCl", ";TPC #chi^{2}/N_{cls};counts", kTH1D, {{1000, 0.0, 100.0}}); - QC.add("QC/tracks/raw/hTpcNCls", ";TPC N_{cls} found;counts", kTH1D, {{200, 0.0, 200.0}}); - QC.add("QC/tracks/raw/hTpcNClsCrossedRows", ";TPC crossed rows;counts", kTH1D, {{200, 0.0, 200.0}}); - QC.add("QC/tracks/raw/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - QC.add("QC/tracks/raw/hEta", ";y;counts", kTH1D, {etaAxis}); - QC.add("QC/tracks/raw/hPhi", ";#phi;counts", kTH1D, {phiAxis}); // tracks passing selections - QC.add("QC/tracks/cut/hTpcNSigmaPi2D", ";TPC n#sigma(#pi_{leading});TPC n#sigma(#pi_{subleading});counts", kTH2D, {{400, -10.0, 30.0}, {400, -10.0, 30.0}}); - QC.add("QC/tracks/cut/hTpcNSigmaEl2D", ";TPC n#sigma(e_{leading});TPC n#sigma(e_{subleading});counts", kTH2D, {{400, -10.0, 30.0}, {400, -10.0, 30.0}}); - QC.add("QC/tracks/cut/hTpcSignalVsP", ";p (GeV/#it{c});TPC signal;counts", kTH2D, {ptAxis, {500, 0.0, 500.0}}); - QC.add("QC/tracks/cut/hTpcSignalVsPt", ";p_{T} (GeV/#it{c});TPC signal;counts", kTH2D, {ptAxis, {500, 0.0, 500.0}}); - QC.add("QC/tracks/cut/hRemainingTracks", ";remaining tracks;counts", kTH1D, {{21, -0.5, 20.5}}); - QC.add("QC/tracks/cut/hDcaXYZ", ";DCA_{z} (cm);DCA_{xy} (cm);counts", kTH2D, {{1000, -5.0, 5.0}, {1000, -5.0, 5.0}}); + rQC.addClone("QC/collisions/all/", "QC/collisions/selected/"); // clone "all" histograms as "selected" + + // tracks + rQC.add("QC/tracks/all/hTpcNSigmaPi", ";TPC n#sigma(#pi);counts", kTH1D, {{400, -10.0, 30.0}}); + rQC.add("QC/tracks/all/hTpcNSigmaEl", ";TPC n#sigma(e);counts", kTH1D, {{400, -10.0, 30.0}}); + rQC.add("QC/tracks/all/hTpcNSigmaKa", ";TPC n#sigma(K);counts", kTH1D, {{400, -10.0, 30.0}}); + rQC.add("QC/tracks/all/hDcaXYZ", ";DCA_{z} (cm);DCA_{xy} (cm);counts", kTH2D, {{1000, -5.0, 5.0}, {1000, -5.0, 5.0}}); + rQC.add("QC/tracks/all/hItsNCls", ";ITS N_{cls};counts", kTH1D, {{11, -0.5, 10.5}}); + rQC.add("QC/tracks/all/hItsChi2NCl", ";ITS #chi^{2}/N_{cls};counts", kTH1D, {{1000, 0.0, 100.0}}); + rQC.add("QC/tracks/all/hTpcChi2NCl", ";TPC #chi^{2}/N_{cls};counts", kTH1D, {{1000, 0.0, 100.0}}); + rQC.add("QC/tracks/all/hTpcNCls", ";TPC N_{cls} found;counts", kTH1D, {{200, 0.0, 200.0}}); + rQC.add("QC/tracks/all/hTpcNClsCrossedRows", ";TPC crossed rows;counts", kTH1D, {{200, 0.0, 200.0}}); + rQC.add("QC/tracks/all/hTpcNClsCrossedRowsOverNClsFindable", ";TPC crossed rows/findable N_{cls};counts", kTH1D, {{100, 0.0, 10.0}}); + rQC.add("QC/tracks/all/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); + rQC.add("QC/tracks/all/hEta", ";y;counts", kTH1D, {etaAxis}); + rQC.add("QC/tracks/all/hPhi", ";#phi;counts", kTH1D, {phiAxis}); + rQC.add("QC/tracks/all/hTpcSignalVsP", ";p (GeV/#it{c});TPC signal;counts", kTH2D, {ptAxis, {500, 0.0, 500.0}}); + rQC.add("QC/tracks/all/hTpcSignalVsPt", ";p_{T} (GeV/#it{c});TPC signal;counts", kTH2D, {ptAxis, {500, 0.0, 500.0}}); + // tracks passing selections + rQC.addClone("QC/tracks/all/", "QC/tracks/selected/"); // clone "raw" histograms as "cut" + rQC.add("QC/tracks/selected/hRemainingTracks", ";remaining tracks;counts", kTH1D, {{21, -0.5, 20.5}}); + rQC.add("QC/tracks/selected/hTpcNSigmaPi2D", ";TPC n#sigma(#pi_{leading});TPC n#sigma(#pi_{subleading});counts", kTH2D, {{400, -10.0, 30.0}, {400, -10.0, 30.0}}); + rQC.add("QC/tracks/selected/hTpcNSigmaEl2D", ";TPC n#sigma(e_{leading});TPC n#sigma(e_{subleading});counts", kTH2D, {{400, -10.0, 30.0}, {400, -10.0, 30.0}}); + rQC.add("QC/tracks/selected/hTpcNSigmaKa2D", ";TPC n#sigma(K_{leading});TPC n#sigma(K_{subleading});counts", kTH2D, {{400, -10.0, 30.0}, {400, -10.0, 30.0}}); // selection counter std::vector selectionCounterLabels = {"all tracks", "PV contributor", "ITS hit", "ITS N_{clusters}", "ITS #chi^{2}/N_{clusters}", "TPC hit", "TPC N_{clusters} found", "TPC #chi^{2}/N_{clusters}", "TPC crossed rows", "TPC crossed rows/N_{clusters}", "TOF requirement", - "p_{T}", "DCA", "#eta", "exactly 2 tracks", "PID"}; - auto hSelectionCounter = QC.add("QC/tracks/hSelectionCounter", ";;counts", kTH1D, {{static_cast(selectionCounterLabels.size()), -0.5, static_cast(selectionCounterLabels.size()) - 0.5}}); + "p_{T}", "DCA", "#eta", "exactly 2 tracks"}; + rQC.add("QC/tracks/hSelectionCounter", ";;tracks passing selections", kTH1D, {{static_cast(selectionCounterLabels.size()), -0.5, static_cast(selectionCounterLabels.size()) - 0.5}}); for (int i = 0; i < static_cast(selectionCounterLabels.size()); ++i) - hSelectionCounter->GetXaxis()->SetBinLabel(i + 1, selectionCounterLabels[i].c_str()); - // TOF hit check - QC.add("QC/tracks/hTofHitCheck", ";leading track TOF hit;subleading track TOF hit;counts", kTH2D, {{2, -0.5, 1.5}, {2, -0.5, 1.5}}); - // RECO HISTOS // - // PIONS - // no selection - Pions.add("pions/no-selection/unlike-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); - Pions.add("pions/no-selection/unlike-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); - Pions.add("pions/no-selection/unlike-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); - Pions.add("pions/no-selection/like-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); - Pions.add("pions/no-selection/like-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); - Pions.add("pions/no-selection/like-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); - // selected - Pions.add("pions/selected/unlike-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); - Pions.add("pions/selected/unlike-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); - Pions.add("pions/selected/unlike-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); - Pions.add("pions/selected/like-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); - Pions.add("pions/selected/like-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); - Pions.add("pions/selected/like-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); - - // RAW RHOS - System.add("system/raw/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); - System.add("system/raw/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - System.add("system/raw/unlike-sign/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mAxis, ptAxis}); - System.add("system/raw/unlike-sign/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/raw/unlike-sign/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - System.add("system/raw/like-sign/positive/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); - System.add("system/raw/like-sign/positive/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - System.add("system/raw/like-sign/positive/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mAxis, ptAxis}); - System.add("system/raw/like-sign/positive/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/raw/like-sign/positive/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - System.add("system/raw/like-sign/negative/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); - System.add("system/raw/like-sign/negative/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - System.add("system/raw/like-sign/negative/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mAxis, ptAxis}); - System.add("system/raw/like-sign/negative/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/raw/like-sign/negative/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - - // SELECTED RHOS - // no selection - System.add("system/cut/no-selection/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/no-selection/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/no-selection/unlike-sign/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/no-selection/unlike-sign/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/no-selection/unlike-sign/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/no-selection/unlike-sign/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - System.add("system/cut/no-selection/unlike-sign/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/no-selection/unlike-sign/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/no-selection/unlike-sign/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/no-selection/unlike-sign/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/no-selection/unlike-sign/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/no-selection/unlike-sign/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - System.add("system/cut/no-selection/like-sign/positive/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/no-selection/like-sign/positive/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/no-selection/like-sign/positive/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/no-selection/like-sign/positive/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/no-selection/like-sign/positive/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/no-selection/like-sign/positive/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - System.add("system/cut/no-selection/like-sign/positive/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/no-selection/like-sign/positive/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/no-selection/like-sign/positive/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/no-selection/like-sign/positive/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/no-selection/like-sign/positive/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/no-selection/like-sign/positive/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - System.add("system/cut/no-selection/like-sign/negative/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/no-selection/like-sign/negative/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/no-selection/like-sign/negative/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/no-selection/like-sign/negative/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/no-selection/like-sign/negative/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/no-selection/like-sign/negative/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - System.add("system/cut/no-selection/like-sign/negative/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/no-selection/like-sign/negative/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/no-selection/like-sign/negative/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/no-selection/like-sign/negative/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/no-selection/like-sign/negative/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/no-selection/like-sign/negative/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - // 0n0n - System.add("system/cut/0n0n/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/0n0n/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/0n0n/unlike-sign/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/0n0n/unlike-sign/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/0n0n/unlike-sign/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/0n0n/unlike-sign/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - System.add("system/cut/0n0n/unlike-sign/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0n0n/unlike-sign/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0n0n/unlike-sign/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/0n0n/unlike-sign/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/0n0n/unlike-sign/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/0n0n/unlike-sign/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - System.add("system/cut/0n0n/like-sign/positive/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/0n0n/like-sign/positive/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/0n0n/like-sign/positive/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/0n0n/like-sign/positive/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/0n0n/like-sign/positive/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/0n0n/like-sign/positive/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0n0n/like-sign/positive/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0n0n/like-sign/positive/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0n0n/like-sign/positive/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/0n0n/like-sign/positive/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/0n0n/like-sign/positive/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/0n0n/like-sign/positive/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - System.add("system/cut/0n0n/like-sign/negative/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/0n0n/like-sign/negative/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/0n0n/like-sign/negative/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/0n0n/like-sign/negative/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/0n0n/like-sign/negative/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/0n0n/like-sign/negative/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0n0n/like-sign/negative/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0n0n/like-sign/negative/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0n0n/like-sign/negative/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/0n0n/like-sign/negative/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/0n0n/like-sign/negative/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/0n0n/like-sign/negative/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - // Xn0n - System.add("system/cut/Xn0n/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/Xn0n/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/Xn0n/unlike-sign/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/Xn0n/unlike-sign/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/Xn0n/unlike-sign/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/Xn0n/unlike-sign/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/Xn0n/unlike-sign/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/Xn0n/unlike-sign/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/Xn0n/unlike-sign/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/Xn0n/unlike-sign/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/Xn0n/unlike-sign/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/Xn0n/unlike-sign/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - System.add("system/cut/Xn0n/like-sign/positive/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/Xn0n/like-sign/positive/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/Xn0n/like-sign/positive/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/Xn0n/like-sign/positive/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/Xn0n/like-sign/positive/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/Xn0n/like-sign/positive/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/Xn0n/like-sign/positive/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/Xn0n/like-sign/positive/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/Xn0n/like-sign/positive/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/Xn0n/like-sign/positive/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/Xn0n/like-sign/positive/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/Xn0n/like-sign/positive/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - System.add("system/cut/Xn0n/like-sign/negative/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/Xn0n/like-sign/negative/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/Xn0n/like-sign/negative/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/Xn0n/like-sign/negative/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/Xn0n/like-sign/negative/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/Xn0n/like-sign/negative/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/Xn0n/like-sign/negative/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/Xn0n/like-sign/negative/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/Xn0n/like-sign/negative/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/Xn0n/like-sign/negative/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/Xn0n/like-sign/negative/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/Xn0n/like-sign/negative/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - // 0nXn - System.add("system/cut/0nXn/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/0nXn/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/0nXn/unlike-sign/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/0nXn/unlike-sign/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/0nXn/unlike-sign/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/0nXn/unlike-sign/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0nXn/unlike-sign/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0nXn/unlike-sign/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0nXn/unlike-sign/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/0nXn/unlike-sign/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/0nXn/unlike-sign/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/0nXn/unlike-sign/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - System.add("system/cut/0nXn/like-sign/positive/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/0nXn/like-sign/positive/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/0nXn/like-sign/positive/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/0nXn/like-sign/positive/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/0nXn/like-sign/positive/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/0nXn/like-sign/positive/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0nXn/like-sign/positive/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0nXn/like-sign/positive/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0nXn/like-sign/positive/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/0nXn/like-sign/positive/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/0nXn/like-sign/positive/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/0nXn/like-sign/positive/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - System.add("system/cut/0nXn/like-sign/negative/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/0nXn/like-sign/negative/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/0nXn/like-sign/negative/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/0nXn/like-sign/negative/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/0nXn/like-sign/negative/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/0nXn/like-sign/negative/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0nXn/like-sign/negative/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0nXn/like-sign/negative/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/0nXn/like-sign/negative/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/0nXn/like-sign/negative/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/0nXn/like-sign/negative/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/0nXn/like-sign/negative/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - // XnXn - System.add("system/cut/XnXn/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/XnXn/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/XnXn/unlike-sign/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/XnXn/unlike-sign/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/XnXn/unlike-sign/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/XnXn/unlike-sign/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/XnXn/unlike-sign/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/XnXn/unlike-sign/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/XnXn/unlike-sign/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/XnXn/unlike-sign/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/XnXn/unlike-sign/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/XnXn/unlike-sign/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - System.add("system/cut/XnXn/like-sign/positive/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/XnXn/like-sign/positive/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/XnXn/like-sign/positive/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/XnXn/like-sign/positive/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/XnXn/like-sign/positive/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/XnXn/like-sign/positive/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/XnXn/like-sign/positive/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/XnXn/like-sign/positive/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/XnXn/like-sign/positive/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/XnXn/like-sign/positive/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/XnXn/like-sign/positive/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/XnXn/like-sign/positive/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - - System.add("system/cut/XnXn/like-sign/negative/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mCutAxis}); - System.add("system/cut/XnXn/like-sign/negative/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptCutAxis}); - System.add("system/cut/XnXn/like-sign/negative/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - System.add("system/cut/XnXn/like-sign/negative/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mCutAxis, ptCutAxis}); - System.add("system/cut/XnXn/like-sign/negative/hY", ";y;counts", kTH1D, {yAxis}); - System.add("system/cut/XnXn/like-sign/negative/hPhi", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/XnXn/like-sign/negative/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/XnXn/like-sign/negative/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - System.add("system/cut/XnXn/like-sign/negative/hPhiRandomVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/XnXn/like-sign/negative/hPhiChargeVsM", ";m (GeV/#it{c}^{2});#phi;counts", kTH2D, {mCutAxis, phiAsymmAxis}); - System.add("system/cut/XnXn/like-sign/negative/hPyVsPxRandom", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); - System.add("system/cut/XnXn/like-sign/negative/hPyVsPxCharge", ";p_{x} (GeV/#it{c});p_{y} (GeV/#it{c});counts", kTH2D, {momentumFromPhiAxis, momentumFromPhiAxis}); + rQC.get(HIST("QC/tracks/hSelectionCounter"))->GetXaxis()->SetBinLabel(i + 1, selectionCounterLabels[i].c_str()); + rQC.add("QC/tracks/hTofHitCheck", ";leading track TOF hit;subleading track TOF hit;counts", kTH2D, {{2, -0.5, 1.5}, {2, -0.5, 1.5}}); + + // TRACKS (2D) + rTracks.add("tracks/all/unlike-sign/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); + rTracks.add("tracks/all/unlike-sign/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaCutAxis, etaCutAxis}); + rTracks.add("tracks/all/unlike-sign/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); + rTracks.addClone("tracks/all/unlike-sign/", "tracks/all/like-sign/positive/"); + rTracks.addClone("tracks/all/unlike-sign/", "tracks/all/like-sign/negative/"); + rTracks.addClone("tracks/all/", "tracks/selected/"); + + // SYSTEM + rSystem.add("system/all/unlike-sign/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); + rSystem.add("system/all/unlike-sign/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); + rSystem.add("system/all/unlike-sign/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); + rSystem.add("system/all/unlike-sign/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mAxis, ptAxis}); + rSystem.add("system/all/unlike-sign/hY", ";y;counts", kTH1D, {yAxis}); + rSystem.add("system/all/unlike-sign/hPhi", ";#phi;counts", kTH1D, {phiAxis}); + rSystem.add("system/all/unlike-sign/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rSystem.add("system/all/unlike-sign/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); + // clones for like-sign + rSystem.addClone("system/all/unlike-sign/", "system/all/like-sign/positive/"); + rSystem.addClone("system/all/unlike-sign/", "system/all/like-sign/negative/"); + // selected rhos + rSystem.addClone("system/all/", "system/selected/no-selection/"); + // clones for neutron classes + rSystem.addClone("system/selected/no-selection/", "system/selected/0n0n/"); + rSystem.addClone("system/selected/no-selection/", "system/selected/Xn0n/"); + rSystem.addClone("system/selected/no-selection/", "system/selected/0nXn/"); + rSystem.addClone("system/selected/no-selection/", "system/selected/XnXn/"); // MC - MC.add("MC/collisions/hPosXY", ";x (cm);y (cm);counts", kTH2D, {{2000, -0.1, 0.1}, {2000, -0.1, 0.1}}); - MC.add("MC/collisions/hPosZ", ";z (cm);counts", kTH1D, {{400, -20.0, 20.0}}); - MC.add("MC/collisions/hNPions", ";number of pions;counts", kTH1D, {{11, -0.5, 10.5}}); - MC.add("MC/collisions/hNumOfCollisionRecos", ";number of collision reconstructions;counts", kTH1D, {{11, -0.5, 10.5}}); - - MC.add("MC/tracks/all/hPdgCode", ";pdg code;counts", kTH1D, {{2001, -1000.5, 1000.5}}); - MC.add("MC/tracks/all/hProducedByGenerator", ";produced by generator;counts", kTH1D, {{2, -0.5, 1.5}}); - MC.add("MC/tracks/all/hIsPhysicalPrimary", ";is physical primary;counts", kTH1D, {{2, -0.5, 1.5}}); - MC.add("MC/tracks/all/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - MC.add("MC/tracks/all/hEta", ";#eta;counts", kTH1D, {etaAxis}); - MC.add("MC/tracks/all/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - MC.add("MC/tracks/pions/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); - MC.add("MC/tracks/pions/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaAxis, etaAxis}); - MC.add("MC/tracks/pions/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); - - MC.add("MC/system/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); - MC.add("MC/system/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - MC.add("MC/system/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); - MC.add("MC/system/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mAxis, ptAxis}); - MC.add("MC/system/hY", ";y;counts", kTH1D, {yAxis}); - MC.add("MC/system/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - MC.add("MC/system/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); - MC.add("MC/system/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); - - // 4 pi QA - if (do4pi) { - FourPiQA.add("FourPiQA/reco/tracks/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - FourPiQA.add("FourPiQA/reco/tracks/hEta", ";#eta;counts", kTH1D, {etaAxis}); - FourPiQA.add("FourPiQA/reco/tracks/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - FourPiQA.add("FourPiQA/reco/system/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); - FourPiQA.add("FourPiQA/reco/system/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - FourPiQA.add("FourPiQA/reco/system/hY", ";y;counts", kTH1D, {yAxis}); - FourPiQA.add("FourPiQA/reco/system/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - FourPiQA.add("FourPiQA/MC/tracks/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - FourPiQA.add("FourPiQA/MC/tracks/hEta", ";#eta;counts", kTH1D, {etaAxis}); - FourPiQA.add("FourPiQA/MC/tracks/hPhi", ";#phi;counts", kTH1D, {phiAxis}); - FourPiQA.add("FourPiQA/MC/system/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); - FourPiQA.add("FourPiQA/MC/system/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - FourPiQA.add("FourPiQA/MC/system/hY", ";y;counts", kTH1D, {yAxis}); - FourPiQA.add("FourPiQA/MC/system/hPhi", ";#phi;counts", kTH1D, {phiAxis}); + // collisions + rMC.add("MC/collisions/hPosXY", ";x (cm);y (cm);counts", kTH2D, {{2000, -0.1, 0.1}, {2000, -0.1, 0.1}}); + rMC.add("MC/collisions/hPosZ", ";z (cm);counts", kTH1D, {{400, -20.0, 20.0}}); + rMC.add("MC/collisions/hNPions", ";number of pions;counts", kTH1D, {{11, -0.5, 10.5}}); + rMC.add("MC/collisions/hNumOfCollisionRecos", ";number of collision reconstructions;counts", kTH1D, {{11, -0.5, 10.5}}); + // tracks + rMC.add("MC/tracks/all/hPdgCode", ";pdg code;counts", kTH1D, {{2001, -1000.5, 1000.5}}); + rMC.add("MC/tracks/all/hProducedByGenerator", ";produced by generator;counts", kTH1D, {{2, -0.5, 1.5}}); + rMC.add("MC/tracks/all/hIsPhysicalPrimary", ";is physical primary;counts", kTH1D, {{2, -0.5, 1.5}}); + rMC.add("MC/tracks/all/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); + rMC.add("MC/tracks/all/hEta", ";#eta;counts", kTH1D, {etaAxis}); + rMC.add("MC/tracks/all/hPhi", ";#phi;counts", kTH1D, {phiAxis}); + rMC.add("MC/tracks/hPt", ";p_{T}(#pi_{leading}) (GeV/#it{c});p_{T}(#pi_{subleading}) (GeV/#it{c});counts", kTH2D, {ptAxis, ptAxis}); + rMC.add("MC/tracks/hEta", ";#eta(#pi_{leading});#eta(#pi_{subleading});counts", kTH2D, {etaAxis, etaAxis}); + rMC.add("MC/tracks/hPhi", ";#phi(#pi_{leading});#phi(#pi_{subleading});counts", kTH2D, {phiAxis, phiAxis}); + // system + rMC.add("MC/system/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); + rMC.add("MC/system/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); + rMC.add("MC/system/hPt2", ";p_{T}^{2} (GeV^{2}/#it{c}^{2});counts", kTH1D, {pt2Axis}); + rMC.add("MC/system/hPtVsM", ";m (GeV/#it{c}^{2});p_{T} (GeV/#it{c});counts", kTH2D, {mAxis, ptAxis}); + rMC.add("MC/system/hY", ";y;counts", kTH1D, {yAxis}); + rMC.add("MC/system/hPhi", ";#phi;counts", kTH1D, {phiAxis}); + rMC.add("MC/system/hPhiRandom", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rMC.add("MC/system/hPhiCharge", ";#phi;counts", kTH1D, {phiAsymmAxis}); + rMC.addClone("MC/system/", "MC/system/selected/"); + } + + static constexpr std::string_view AppliedSelections[2] = {"all/", "selected/"}; + static constexpr std::string_view ChargeLabel[3] = {"unlike-sign/", "like-sign/positive/", "like-sign/negative/"}; + static constexpr std::string_view NeutronClass[5] = {"no-selection/", "0n0n/", "Xn0n/", "0nXn/", "XnXn/"}; + + template + void fillCollisionQcHistos(const C& collision) // fills collision QC histograms before/after cuts + { + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hPosXY"), collision.posX(), collision.posY()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hPosZ"), collision.posZ()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hZdcCommonEnergy"), collision.energyCommonZNA(), collision.energyCommonZNC()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hZdcTime"), collision.timeZNA(), collision.timeZNC()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hNumContrib"), collision.numContrib()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hTotalFT0AmplitudeA"), collision.totalFT0AmplitudeA()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hTotalFT0AmplitudeC"), collision.totalFT0AmplitudeC()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hTotalFV0AmplitudeA"), collision.totalFV0AmplitudeA()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hTotalFDDAmplitudeA"), collision.totalFDDAmplitudeA()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hTotalFDDAmplitudeC"), collision.totalFDDAmplitudeC()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hTimeFT0A"), collision.timeFT0A()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hTimeFT0C"), collision.timeFT0C()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hTimeFV0A"), collision.timeFV0A()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hTimeFDDA"), collision.timeFDDA()); + rQC.fill(HIST("QC/collisions/") + HIST(AppliedSelections[cuts]) + HIST("hTimeFDDC"), collision.timeFDDC()); + } + + template + void fillTrackQcHistos(const T& track) + { + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hPt"), track.pt()); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hEta"), eta(track.px(), track.py(), track.pz())); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hPhi"), phi(track.px(), track.py())); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hTpcNSigmaPi"), track.tpcNSigmaPi()); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hTpcNSigmaEl"), track.tpcNSigmaEl()); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hTpcNSigmaKa"), track.tpcNSigmaKa()); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hDcaXYZ"), track.dcaZ(), track.dcaXY()); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hItsNCls"), track.itsNCls()); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hItsChi2NCl"), track.itsChi2NCl()); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hTpcChi2NCl"), track.tpcChi2NCl()); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hTpcNCls"), (track.tpcNClsFindable() - track.tpcNClsFindableMinusFound())); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hTpcNClsCrossedRows"), track.tpcNClsCrossedRows()); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hTpcNClsCrossedRowsOverNClsFindable"), (static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable()))); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hTpcSignalVsP"), momentum(track.px(), track.py(), track.pz()), track.tpcSignal()); + rQC.fill(HIST("QC/tracks/") + HIST(AppliedSelections[cuts]) + HIST("hTpcSignalVsPt"), track.pt(), track.tpcSignal()); + } + + template + void fillTrack2dHistos(float leadingPt, float subleadingPt, float leadingEta, float subleadingEta, float leadingPhi, float subleadingPhi) + { + rTracks.fill(HIST("tracks/") + HIST(AppliedSelections[cuts]) + HIST(ChargeLabel[charge]) + HIST("hPt"), leadingPt, subleadingPt); + rTracks.fill(HIST("tracks/") + HIST(AppliedSelections[cuts]) + HIST(ChargeLabel[charge]) + HIST("hEta"), leadingEta, subleadingEta); + rTracks.fill(HIST("tracks/") + HIST(AppliedSelections[cuts]) + HIST(ChargeLabel[charge]) + HIST("hPhi"), leadingPhi, subleadingPhi); + } + + template + void fillSystemHistos(float mass, float pt, float rapidity, float phi, float phiRandom, float phiCharge) + { + if (cuts == 0) { + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(ChargeLabel[charge]) + HIST("hM"), mass); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(ChargeLabel[charge]) + HIST("hPt"), pt); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(ChargeLabel[charge]) + HIST("hPt2"), pt * pt); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(ChargeLabel[charge]) + HIST("hPtVsM"), mass, pt); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(ChargeLabel[charge]) + HIST("hY"), rapidity); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(ChargeLabel[charge]) + HIST("hPhi"), phi); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(ChargeLabel[charge]) + HIST("hPhiRandom"), phiRandom); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(ChargeLabel[charge]) + HIST("hPhiCharge"), phiCharge); + } else { + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(NeutronClass[neutronClass]) + HIST(ChargeLabel[charge]) + HIST("hM"), mass); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(NeutronClass[neutronClass]) + HIST(ChargeLabel[charge]) + HIST("hPt"), pt); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(NeutronClass[neutronClass]) + HIST(ChargeLabel[charge]) + HIST("hPt2"), pt * pt); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(NeutronClass[neutronClass]) + HIST(ChargeLabel[charge]) + HIST("hPtVsM"), mass, pt); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(NeutronClass[neutronClass]) + HIST(ChargeLabel[charge]) + HIST("hY"), rapidity); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(NeutronClass[neutronClass]) + HIST(ChargeLabel[charge]) + HIST("hPhi"), phi); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(NeutronClass[neutronClass]) + HIST(ChargeLabel[charge]) + HIST("hPhiRandom"), phiRandom); + rSystem.fill(HIST("system/") + HIST(AppliedSelections[cuts]) + HIST(NeutronClass[neutronClass]) + HIST(ChargeLabel[charge]) + HIST("hPhiCharge"), phiCharge); } } + template + bool collisionPassesCuts(const C& collision) // collision cuts + { + if (std::abs(collision.posZ()) > collisionsPosZMaxCut) + return false; + if (collision.numContrib() > collisionsNumContribsMaxCut) + return false; + return true; + } + template bool trackPassesCuts(const T& track) // track cuts (PID done separately) { if (!track.isPVContributor()) return false; - QC.fill(HIST("QC/tracks/hSelectionCounter"), 1); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 1); if (!track.hasITS()) return false; - QC.fill(HIST("QC/tracks/hSelectionCounter"), 2); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 2); if (track.itsNCls() < tracksMinItsNClsCut) return false; - QC.fill(HIST("QC/tracks/hSelectionCounter"), 3); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 3); if (track.itsChi2NCl() > tracksMaxItsChi2NClCut) return false; - QC.fill(HIST("QC/tracks/hSelectionCounter"), 4); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 4); if (!track.hasTPC()) return false; - QC.fill(HIST("QC/tracks/hSelectionCounter"), 5); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 5); if ((track.tpcNClsFindable() - track.tpcNClsFindableMinusFound()) < tracksMinTpcNClsCut) return false; - QC.fill(HIST("QC/tracks/hSelectionCounter"), 6); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 6); if (track.tpcChi2NCl() > tracksMaxTpcChi2NClCut || track.tpcChi2NCl() < tracksMinTpcChi2NClCut) return false; - QC.fill(HIST("QC/tracks/hSelectionCounter"), 7); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 7); if (track.tpcNClsCrossedRows() < tracksMinTpcNClsCrossedRowsCut) return false; - QC.fill(HIST("QC/tracks/hSelectionCounter"), 8); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 8); if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < tracksMinTpcNClsCrossedOverFindableCut) return false; - QC.fill(HIST("QC/tracks/hSelectionCounter"), 9); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 9); if (requireTof && !track.hasTOF()) return false; - QC.fill(HIST("QC/tracks/hSelectionCounter"), 10); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 10); if (track.pt() < tracksMinPtCut) return false; - QC.fill(HIST("QC/tracks/hSelectionCounter"), 11); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 11); if (std::abs(track.dcaZ()) > tracksDcaMaxCut || std::abs(track.dcaXY()) > (0.0105 + 0.0350 / std::pow(track.pt(), 1.01))) return false; - QC.fill(HIST("QC/tracks/hSelectionCounter"), 12); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 12); - if (std::abs(eta(track.px(), track.py(), track.pz())) > PcEtaCut) + if (std::abs(eta(track.px(), track.py(), track.pz())) > pcEtaCut) return false; - QC.fill(HIST("QC/tracks/hSelectionCounter"), 13); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 13); // if all selections passed return true; } template - bool tracksPassPiPID(const T& cutTracks) // n-dimensional PID cut + bool tracksPassPiPID(const T& cutTracks) // n-dimensional pion PID cut { - double radius = 0.0; + float radius = 0.0; for (const auto& track : cutTracks) radius += std::pow(track.tpcNSigmaPi(), 2); return radius < std::pow(tracksTpcNSigmaPiCut, 2); } + template + bool tracksPassElPID(const T& cutTracks) // n-dimensional electron PID cut + { + float radius = 0.0; + for (const auto& track : cutTracks) + radius += std::pow(track.tpcNSigmaEl(), 2); + return radius < std::pow(tracksTpcNSigmaElCut, 2); + } + + template + bool tracksPassKaPID(const T& cutTracks) // n-dimensional kaon PID cut + { + float radius = 0.0; + for (const auto& track : cutTracks) + radius += std::pow(track.tpcNSigmaKa(), 2); + return radius < std::pow(tracksTpcNSigmaKaCut, 2); + } + template int tracksTotalCharge(const T& cutTracks) // total charge of selected tracks { @@ -566,7 +454,7 @@ struct upcRhoAnalysis { } template - int tracksTotalChargeMC(const T& cutTracks) // total charge of selected tracks + int tracksTotalChargeMC(const T& cutTracks) // total charge of selected MC tracks { int charge = 0; for (const auto& track : cutTracks) @@ -574,7 +462,7 @@ struct upcRhoAnalysis { return charge; } - bool systemPassCuts(const TLorentzVector& system) // system cuts + bool systemPassesCuts(const TLorentzVector& system) // system cuts { if (system.M() < systemMassMinCut || system.M() > systemMassMaxCut) return false; @@ -585,44 +473,44 @@ struct upcRhoAnalysis { return true; } - TLorentzVector reconstructSystem(const std::vector& cutTracks4Vecs) // reconstruct system from 4-vectors + TLorentzVector reconstructSystem(const std::vector& cutTracksLVs) // reconstruct system from 4-vectors { TLorentzVector system; - for (const auto& track4Vec : cutTracks4Vecs) - system += track4Vec; + for (const auto& trackLV : cutTracksLVs) + system += trackLV; return system; } - double getPhiRandom(const std::vector& cutTracks4Vecs) // decay phi anisotropy + float getPhiRandom(const std::vector& cutTracksLVs) // decay phi anisotropy { // two possible definitions of phi: randomize the tracks - std::vector indices = {0, 1}; + int indices[2] = {0, 1}; unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); // get time-based seed - std::shuffle(indices.begin(), indices.end(), std::default_random_engine(seed)); // shuffle indices + std::shuffle(std::begin(indices), std::end(indices), std::default_random_engine(seed)); // shuffle indices // calculate phi - TLorentzVector pOne = cutTracks4Vecs[indices[0]]; - TLorentzVector pTwo = cutTracks4Vecs[indices[1]]; + TLorentzVector pOne = cutTracksLVs[indices[0]]; + TLorentzVector pTwo = cutTracksLVs[indices[1]]; TLorentzVector pPlus = pOne + pTwo; TLorentzVector pMinus = pOne - pTwo; return pPlus.DeltaPhi(pMinus); } template - double getPhiCharge(const T& cutTracks, const std::vector& cutTracks4Vecs) + float getPhiCharge(const T& cutTracks, const std::vector& cutTracksLVs) { // two possible definitions of phi: charge-based assignment TLorentzVector pOne, pTwo; - pOne = (cutTracks[0].sign() > 0) ? cutTracks4Vecs[0] : cutTracks4Vecs[1]; - pTwo = (cutTracks[0].sign() > 0) ? cutTracks4Vecs[1] : cutTracks4Vecs[0]; + pOne = (cutTracks[0].sign() > 0) ? cutTracksLVs[0] : cutTracksLVs[1]; + pTwo = (cutTracks[0].sign() > 0) ? cutTracksLVs[1] : cutTracksLVs[0]; TLorentzVector pPlus = pOne + pTwo; TLorentzVector pMinus = pOne - pTwo; return pPlus.DeltaPhi(pMinus); } template - double getPhiChargeMC(const T& cutTracks, const std::vector& cutTracks4Vecs) + float getPhiChargeMC(const T& cutTracks, const std::vector& cutTracksLVs) { // the same as for data but using pdg code instead of charge TLorentzVector pOne, pTwo; - pOne = (cutTracks[0].pdgCode() > 0) ? cutTracks4Vecs[0] : cutTracks4Vecs[1]; - pTwo = (cutTracks[0].pdgCode() > 0) ? cutTracks4Vecs[1] : cutTracks4Vecs[0]; + pOne = (cutTracks[0].pdgCode() > 0) ? cutTracksLVs[0] : cutTracksLVs[1]; + pTwo = (cutTracks[0].pdgCode() > 0) ? cutTracksLVs[1] : cutTracksLVs[0]; TLorentzVector pPlus = pOne + pTwo; TLorentzVector pMinus = pOne - pTwo; return pPlus.DeltaPhi(pMinus); @@ -631,185 +519,107 @@ struct upcRhoAnalysis { template void processReco(C const& collision, T const& tracks) { - // QC histograms - QC.fill(HIST("QC/collisions/all/hPosXY"), collision.posX(), collision.posY()); - QC.fill(HIST("QC/collisions/all/hPosZ"), collision.posZ()); - QC.fill(HIST("QC/collisions/all/hZdcCommonEnergy"), collision.energyCommonZNA(), collision.energyCommonZNC()); - QC.fill(HIST("QC/collisions/all/hZdcTime"), collision.timeZNA(), collision.timeZNC()); - QC.fill(HIST("QC/collisions/all/hNumContrib"), collision.numContrib()); - QC.fill(HIST("QC/collisions/all/hTotalFT0AmplitudeA"), collision.totalFT0AmplitudeA()); - QC.fill(HIST("QC/collisions/all/hTotalFT0AmplitudeC"), collision.totalFT0AmplitudeC()); - QC.fill(HIST("QC/collisions/all/hTotalFV0AmplitudeA"), collision.totalFV0AmplitudeA()); - QC.fill(HIST("QC/collisions/all/hTotalFDDAmplitudeA"), collision.totalFDDAmplitudeA()); - QC.fill(HIST("QC/collisions/all/hTotalFDDAmplitudeC"), collision.totalFDDAmplitudeC()); - QC.fill(HIST("QC/collisions/all/hTimeFT0A"), collision.timeFT0A()); - QC.fill(HIST("QC/collisions/all/hTimeFT0C"), collision.timeFT0C()); - QC.fill(HIST("QC/collisions/all/hTimeFV0A"), collision.timeFV0A()); - QC.fill(HIST("QC/collisions/all/hTimeFDDA"), collision.timeFDDA()); - QC.fill(HIST("QC/collisions/all/hTimeFDDC"), collision.timeFDDC()); - - // vertex z-position cut - if (std::abs(collision.posZ()) > collisionsPosZMaxCut) + fillCollisionQcHistos<0>(collision); // fill QC histograms before cuts + if (!collisionPassesCuts(collision)) return; - // event tagging - bool XnXn = false, OnOn = false, XnOn = false, OnXn = false; // note: On == 0n... - int neutronClass = -1; - if (collision.energyCommonZNA() < ZNcommonEnergyCut && collision.energyCommonZNC() < ZNcommonEnergyCut) { - OnOn = true; - neutronClass = 0; - } - if (collision.energyCommonZNA() > ZNcommonEnergyCut && std::abs(collision.timeZNA()) < ZNtimeCut && collision.energyCommonZNC() < ZNcommonEnergyCut) { - XnOn = true; - neutronClass = 1; - } - if (collision.energyCommonZNA() < ZNcommonEnergyCut && collision.energyCommonZNC() > ZNcommonEnergyCut && std::abs(collision.timeZNC()) < ZNtimeCut) { - OnXn = true; - neutronClass = 2; - } - if (collision.energyCommonZNA() > ZNcommonEnergyCut && std::abs(collision.timeZNA()) < ZNtimeCut && - collision.energyCommonZNC() > ZNcommonEnergyCut && std::abs(collision.timeZNC()) < ZNtimeCut) { - XnXn = true; - neutronClass = 3; - } - // vectors for storing selected tracks and their 4-vectors - std::vector cutTracks; - std::vector cutTracks4Vecs; - + bool xnxn = false, onon = false, xnon = false, onxn = false; // note: On == 0n... + if (collision.energyCommonZNA() < znCommonEnergyCut && collision.energyCommonZNC() < znCommonEnergyCut) + onon = true; + if (collision.energyCommonZNA() > znCommonEnergyCut && std::abs(collision.timeZNA()) < znTimeCut && collision.energyCommonZNC() < znCommonEnergyCut) + xnon = true; + if (collision.energyCommonZNA() < znCommonEnergyCut && collision.energyCommonZNC() > znCommonEnergyCut && std::abs(collision.timeZNC()) < znTimeCut) + onxn = true; + if (collision.energyCommonZNA() > znCommonEnergyCut && std::abs(collision.timeZNA()) < znTimeCut && + collision.energyCommonZNC() > znCommonEnergyCut && std::abs(collision.timeZNC()) < znTimeCut) + xnxn = true; + + std::vector cutTracks; // store selected tracks for (const auto& track : tracks) { - // double p = momentum(track.px(), track.py(), track.pz()); - QC.fill(HIST("QC/tracks/raw/hPt"), track.pt()); - QC.fill(HIST("QC/tracks/raw/hEta"), eta(track.px(), track.py(), track.pz())); - QC.fill(HIST("QC/tracks/raw/hPhi"), phi(track.px(), track.py())); - QC.fill(HIST("QC/tracks/raw/hTpcNSigmaPi"), track.tpcNSigmaPi()); - QC.fill(HIST("QC/tracks/raw/hTofNSigmaPi"), track.tofNSigmaPi()); - QC.fill(HIST("QC/tracks/raw/hTpcNSigmaEl"), track.tpcNSigmaEl()); - QC.fill(HIST("QC/tracks/raw/hDcaXYZ"), track.dcaZ(), track.dcaXY()); - QC.fill(HIST("QC/tracks/raw/hItsNCls"), track.itsNCls()); - QC.fill(HIST("QC/tracks/raw/hItsChi2NCl"), track.itsChi2NCl()); - QC.fill(HIST("QC/tracks/raw/hTpcChi2NCl"), track.tpcChi2NCl()); - QC.fill(HIST("QC/tracks/raw/hTpcNCls"), (track.tpcNClsFindable() - track.tpcNClsFindableMinusFound())); - QC.fill(HIST("QC/tracks/raw/hTpcNClsCrossedRows"), track.tpcNClsCrossedRows()); - QC.fill(HIST("QC/tracks/hSelectionCounter"), 0); - - if (!trackPassesCuts(track)) + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 0); + fillTrackQcHistos<0>(track); // fill QC histograms before cuts + + if (!trackPassesCuts(track)) // apply track cuts continue; + fillTrackQcHistos<1>(track); // fill QC histograms after cuts cutTracks.push_back(track); - TLorentzVector track4Vec; - track4Vec.SetXYZM(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged); // apriori assume pion mass - cutTracks4Vecs.push_back(track4Vec); - QC.fill(HIST("QC/tracks/cut/hTpcSignalVsP"), momentum(track.px(), track.py(), track.pz()), track.tpcSignal()); - QC.fill(HIST("QC/tracks/cut/hTpcSignalVsPt"), track.pt(), track.tpcSignal()); - QC.fill(HIST("QC/tracks/cut/hDcaXYZ"), track.dcaZ(), track.dcaXY()); - } - QC.fill(HIST("QC/tracks/cut/hRemainingTracks"), cutTracks.size()); - if (cutTracks.size() != cutTracks4Vecs.size()) { // sanity check - LOG(error); - return; - } - // reonstruct system and calculate total charge, save commonly used values into variables - TLorentzVector system = reconstructSystem(cutTracks4Vecs); - int totalCharge = tracksTotalCharge(cutTracks); - double mass = system.M(); - double pT = system.Pt(); - double pTsquare = pT * pT; - double rapidity = system.Rapidity(); - double systemPhi = system.Phi() + o2::constants::math::PI; - - if (do4pi && cutTracks.size() == 4 && totalCharge == 0) { - // fill out some 4pi QC histograms - for (int i = 0; i < static_cast(cutTracks.size()); i++) { - FourPiQA.fill(HIST("FourPiQA/reco/tracks/hPt"), cutTracks[i].pt()); - FourPiQA.fill(HIST("FourPiQA/reco/tracks/hEta"), eta(cutTracks[i].px(), cutTracks[i].py(), cutTracks[i].pz())); - FourPiQA.fill(HIST("FourPiQA/reco/tracks/hPhi"), phi(cutTracks[i].px(), cutTracks[i].py())); - } - FourPiQA.fill(HIST("FourPiQA/reco/system/hM"), mass); - FourPiQA.fill(HIST("FourPiQA/reco/system/hPt"), pT); - FourPiQA.fill(HIST("FourPiQA/reco/system/hY"), rapidity); - FourPiQA.fill(HIST("FourPiQA/reco/system/hPhi"), systemPhi); } + rQC.fill(HIST("QC/tracks/selected/hRemainingTracks"), cutTracks.size()); - // further consider only two pion systems - if (cutTracks.size() != 2) + if (cutTracks.size() != 2) // further consider only two pion systems return; for (int i = 0; i < static_cast(cutTracks.size()); i++) - QC.fill(HIST("QC/tracks/hSelectionCounter"), 14); - - QC.fill(HIST("QC/tracks/cut/hTpcNSigmaPi2D"), cutTracks[0].tpcNSigmaPi(), cutTracks[1].tpcNSigmaPi()); - QC.fill(HIST("QC/tracks/cut/hTpcNSigmaEl2D"), cutTracks[0].tpcNSigmaEl(), cutTracks[1].tpcNSigmaEl()); - - if (!tracksPassPiPID(cutTracks)) - return; - for (int i = 0; i < static_cast(cutTracks.size()); i++) - QC.fill(HIST("QC/tracks/hSelectionCounter"), 15); - - double phiRandom = getPhiRandom(cutTracks4Vecs); - double phiCharge = getPhiCharge(cutTracks, cutTracks4Vecs); + rQC.fill(HIST("QC/tracks/hSelectionCounter"), 14); + rQC.fill(HIST("QC/tracks/selected/hTpcNSigmaPi2D"), cutTracks[0].tpcNSigmaPi(), cutTracks[1].tpcNSigmaPi()); + rQC.fill(HIST("QC/tracks/selected/hTpcNSigmaEl2D"), cutTracks[0].tpcNSigmaEl(), cutTracks[1].tpcNSigmaEl()); + rQC.fill(HIST("QC/tracks/selected/hTpcNSigmaKa2D"), cutTracks[0].tpcNSigmaKa(), cutTracks[1].tpcNSigmaKa()); + + // create a vector of 4-vectors for selected tracks + std::vector cutTracksLVs; + for (const auto& track : cutTracks) { + TLorentzVector trackLV; + trackLV.SetXYZM(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged); // apriori assume pion mass + cutTracksLVs.push_back(trackLV); + } // differentiate leading- and subleading-momentum tracks auto leadingMomentumTrack = momentum(cutTracks[0].px(), cutTracks[0].py(), cutTracks[0].pz()) > momentum(cutTracks[1].px(), cutTracks[1].py(), cutTracks[1].pz()) ? cutTracks[0] : cutTracks[1]; auto subleadingMomentumTrack = (leadingMomentumTrack == cutTracks[0]) ? cutTracks[1] : cutTracks[0]; - double leadingPt = leadingMomentumTrack.pt(); - double subleadingPt = subleadingMomentumTrack.pt(); - double leadingEta = eta(leadingMomentumTrack.px(), leadingMomentumTrack.py(), leadingMomentumTrack.pz()); - double subleadingEta = eta(subleadingMomentumTrack.px(), subleadingMomentumTrack.py(), subleadingMomentumTrack.pz()); - double leadingPhi = phi(leadingMomentumTrack.px(), leadingMomentumTrack.py()); - double subleadingPhi = phi(subleadingMomentumTrack.px(), subleadingMomentumTrack.py()); - // fill TOF hit checker - QC.fill(HIST("QC/tracks/hTofHitCheck"), leadingMomentumTrack.hasTOF(), subleadingMomentumTrack.hasTOF()); - - // fill tree - std::vector trackSigns = {leadingMomentumTrack.sign(), subleadingMomentumTrack.sign()}; - std::vector trackPts = {leadingPt, subleadingPt}; - std::vector trackEtas = {leadingEta, subleadingEta}; - std::vector trackPhis = {leadingPhi, subleadingPhi}; - std::vector trackMs = {o2::constants::physics::MassPionCharged, o2::constants::physics::MassPionCharged}; - std::vector trackPiPIDs = {leadingMomentumTrack.tpcNSigmaPi(), subleadingMomentumTrack.tpcNSigmaPi()}; - std::vector trackElPIDs = {leadingMomentumTrack.tpcNSigmaEl(), subleadingMomentumTrack.tpcNSigmaEl()}; - std::vector trackDcaXYs = {leadingMomentumTrack.dcaXY(), subleadingMomentumTrack.dcaXY()}; - std::vector trackDcaZs = {leadingMomentumTrack.dcaZ(), subleadingMomentumTrack.dcaZ()}; - std::vector trackTpcSignals = {leadingMomentumTrack.tpcSignal(), subleadingMomentumTrack.tpcSignal()}; - Tree(collision.runNumber(), collision.globalBC(), collision.numContrib(), - collision.posX(), collision.posY(), collision.posZ(), - collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFV0AmplitudeA(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), - collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC(), - collision.energyCommonZNA(), collision.energyCommonZNC(), collision.timeZNA(), collision.timeZNC(), neutronClass, - totalCharge, pT, system.Eta(), system.Phi(), mass, phiRandom, phiCharge, - trackSigns, trackPts, trackEtas, trackPhis, trackMs, trackPiPIDs, trackElPIDs, trackDcaXYs, trackDcaZs, trackTpcSignals); - // fill raw histograms according to the total charge + rQC.fill(HIST("QC/tracks/hTofHitCheck"), leadingMomentumTrack.hasTOF(), subleadingMomentumTrack.hasTOF()); + + float leadingPt = leadingMomentumTrack.pt(); + float subleadingPt = subleadingMomentumTrack.pt(); + float leadingEta = eta(leadingMomentumTrack.px(), leadingMomentumTrack.py(), leadingMomentumTrack.pz()); + float subleadingEta = eta(subleadingMomentumTrack.px(), subleadingMomentumTrack.py(), subleadingMomentumTrack.pz()); + float leadingPhi = phi(leadingMomentumTrack.px(), leadingMomentumTrack.py()); + float subleadingPhi = phi(subleadingMomentumTrack.px(), subleadingMomentumTrack.py()); + float phiRandom = getPhiRandom(cutTracksLVs); + float phiCharge = getPhiCharge(cutTracks, cutTracksLVs); + + // fill recoTree + int localBc = collision.globalBC() % o2::constants::lhc::LHCMaxBunches; + int trackSigns[2] = {leadingMomentumTrack.sign(), subleadingMomentumTrack.sign()}; + float trackPts[2] = {leadingPt, subleadingPt}; + float trackEtas[2] = {leadingEta, subleadingEta}; + float trackPhis[2] = {leadingPhi, subleadingPhi}; + float trackPiPIDs[2] = {leadingMomentumTrack.tpcNSigmaPi(), subleadingMomentumTrack.tpcNSigmaPi()}; + float trackElPIDs[2] = {leadingMomentumTrack.tpcNSigmaEl(), subleadingMomentumTrack.tpcNSigmaEl()}; + float trackKaPIDs[2] = {leadingMomentumTrack.tpcNSigmaKa(), subleadingMomentumTrack.tpcNSigmaKa()}; + float trackDcaXYs[2] = {leadingMomentumTrack.dcaXY(), subleadingMomentumTrack.dcaXY()}; + float trackDcaZs[2] = {leadingMomentumTrack.dcaZ(), subleadingMomentumTrack.dcaZ()}; + float trackTpcSignals[2] = {leadingMomentumTrack.tpcSignal(), subleadingMomentumTrack.tpcSignal()}; + if ((savePions && tracksPassPiPID(cutTracks)) || (saveElectrons && tracksPassElPID(cutTracks)) || (saveKaons && tracksPassKaPID(cutTracks))) + recoTree(collision.runNumber(), localBc, collision.numContrib(), collision.posX(), collision.posY(), collision.posZ(), + collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFV0AmplitudeA(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), + collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC(), + collision.energyCommonZNA(), collision.energyCommonZNC(), collision.timeZNA(), collision.timeZNC(), + phiRandom, phiCharge, trackSigns, trackPts, trackEtas, trackPhis, trackPiPIDs, trackElPIDs, trackKaPIDs, trackDcaXYs, trackDcaZs, trackTpcSignals); + + if (!tracksPassPiPID(cutTracks)) // apply PID cut + return; + TLorentzVector system = reconstructSystem(cutTracksLVs); + int totalCharge = tracksTotalCharge(cutTracks); + float mass = system.M(); + float pT = system.Pt(); + float rapidity = system.Rapidity(); + float systemPhi = system.Phi() + o2::constants::math::PI; + + // fill raw histograms according to total charge switch (totalCharge) { case 0: - Pions.fill(HIST("pions/no-selection/unlike-sign/hPt"), leadingPt, subleadingPt); - Pions.fill(HIST("pions/no-selection/unlike-sign/hEta"), leadingEta, subleadingEta); - Pions.fill(HIST("pions/no-selection/unlike-sign/hPhi"), leadingPhi, subleadingPhi); - System.fill(HIST("system/raw/unlike-sign/hM"), mass); - System.fill(HIST("system/raw/unlike-sign/hPt"), pT); - System.fill(HIST("system/raw/unlike-sign/hPtVsM"), mass, pT); - System.fill(HIST("system/raw/unlike-sign/hY"), rapidity); - System.fill(HIST("system/raw/unlike-sign/hPhi"), systemPhi); + fillTrack2dHistos<0, 0>(leadingPt, subleadingPt, leadingEta, subleadingEta, leadingPhi, subleadingPhi); + fillSystemHistos<0, 0, 0>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); break; case 2: - Pions.fill(HIST("pions/no-selection/like-sign/hPt"), leadingPt, subleadingPt); - Pions.fill(HIST("pions/no-selection/like-sign/hEta"), leadingEta, subleadingEta); - Pions.fill(HIST("pions/no-selection/like-sign/hPhi"), leadingPhi, subleadingPhi); - System.fill(HIST("system/raw/like-sign/positive/hM"), mass); - System.fill(HIST("system/raw/like-sign/positive/hPt"), pT); - System.fill(HIST("system/raw/like-sign/positive/hPtVsM"), mass, pT); - System.fill(HIST("system/raw/like-sign/positive/hY"), rapidity); - System.fill(HIST("system/raw/like-sign/positive/hPhi"), systemPhi); + fillTrack2dHistos<0, 1>(leadingPt, subleadingPt, leadingEta, subleadingEta, leadingPhi, subleadingPhi); + fillSystemHistos<0, 0, 1>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); break; case -2: - Pions.fill(HIST("pions/no-selection/like-sign/hPt"), leadingPt, subleadingPt); - Pions.fill(HIST("pions/no-selection/like-sign/hEta"), leadingEta, subleadingEta); - Pions.fill(HIST("pions/no-selection/like-sign/hPhi"), leadingPhi, subleadingPhi); - System.fill(HIST("system/raw/like-sign/negative/hM"), mass); - System.fill(HIST("system/raw/like-sign/negative/hPt"), pT); - System.fill(HIST("system/raw/like-sign/negative/hPtVsM"), mass, pT); - System.fill(HIST("system/raw/like-sign/negative/hY"), rapidity); - System.fill(HIST("system/raw/like-sign/negative/hPhi"), systemPhi); + fillTrack2dHistos<0, 2>(leadingPt, subleadingPt, leadingEta, subleadingEta, leadingPhi, subleadingPhi); + fillSystemHistos<0, 0, 2>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); break; default: @@ -817,238 +627,49 @@ struct upcRhoAnalysis { } // apply cuts to system - if (!systemPassCuts(system)) + if (!systemPassesCuts(system)) return; - - QC.fill(HIST("QC/collisions/selected/hPosXY"), collision.posX(), collision.posY()); - QC.fill(HIST("QC/collisions/selected/hPosZ"), collision.posZ()); - QC.fill(HIST("QC/collisions/selected/hZdcCommonEnergy"), collision.energyCommonZNA(), collision.energyCommonZNC()); - QC.fill(HIST("QC/collisions/selected/hZdcTime"), collision.timeZNA(), collision.timeZNC()); - QC.fill(HIST("QC/collisions/selected/hNumContrib"), collision.numContrib()); - QC.fill(HIST("QC/collisions/selected/hTotalFT0AmplitudeA"), collision.totalFT0AmplitudeA()); - QC.fill(HIST("QC/collisions/selected/hTotalFT0AmplitudeC"), collision.totalFT0AmplitudeC()); - QC.fill(HIST("QC/collisions/selected/hTotalFV0AmplitudeA"), collision.totalFV0AmplitudeA()); - QC.fill(HIST("QC/collisions/selected/hTotalFDDAmplitudeA"), collision.totalFDDAmplitudeA()); - QC.fill(HIST("QC/collisions/selected/hTotalFDDAmplitudeC"), collision.totalFDDAmplitudeC()); - QC.fill(HIST("QC/collisions/selected/hTimeFT0A"), collision.timeFT0A()); - QC.fill(HIST("QC/collisions/selected/hTimeFT0C"), collision.timeFT0C()); - QC.fill(HIST("QC/collisions/selected/hTimeFV0A"), collision.timeFV0A()); - QC.fill(HIST("QC/collisions/selected/hTimeFDDA"), collision.timeFDDA()); - QC.fill(HIST("QC/collisions/selected/hTimeFDDC"), collision.timeFDDC()); + fillCollisionQcHistos<1>(collision); // fill QC histograms for collisions with selected system // fill histograms for system passing cuts switch (totalCharge) { case 0: - Pions.fill(HIST("pions/selected/unlike-sign/hPt"), leadingPt, subleadingPt); - Pions.fill(HIST("pions/selected/unlike-sign/hEta"), leadingEta, subleadingEta); - Pions.fill(HIST("pions/selected/unlike-sign/hPhi"), leadingPhi, subleadingPhi); - System.fill(HIST("system/cut/no-selection/unlike-sign/hM"), mass); - System.fill(HIST("system/cut/no-selection/unlike-sign/hPt"), pT); - System.fill(HIST("system/cut/no-selection/unlike-sign/hPt2"), pTsquare); - System.fill(HIST("system/cut/no-selection/unlike-sign/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/no-selection/unlike-sign/hY"), rapidity); - System.fill(HIST("system/cut/no-selection/unlike-sign/hPhi"), systemPhi); - System.fill(HIST("system/cut/no-selection/unlike-sign/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/no-selection/unlike-sign/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/no-selection/unlike-sign/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/no-selection/unlike-sign/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/no-selection/unlike-sign/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/no-selection/unlike-sign/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - if (OnOn) { - System.fill(HIST("system/cut/0n0n/unlike-sign/hM"), mass); - System.fill(HIST("system/cut/0n0n/unlike-sign/hPt"), pT); - System.fill(HIST("system/cut/0n0n/unlike-sign/hPt2"), pTsquare); - System.fill(HIST("system/cut/0n0n/unlike-sign/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/0n0n/unlike-sign/hY"), rapidity); - System.fill(HIST("system/cut/0n0n/unlike-sign/hPhi"), systemPhi); - System.fill(HIST("system/cut/0n0n/unlike-sign/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/0n0n/unlike-sign/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/0n0n/unlike-sign/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/0n0n/unlike-sign/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/0n0n/unlike-sign/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/0n0n/unlike-sign/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } else if (XnOn) { - System.fill(HIST("system/cut/Xn0n/unlike-sign/hM"), mass); - System.fill(HIST("system/cut/Xn0n/unlike-sign/hPt"), pT); - System.fill(HIST("system/cut/Xn0n/unlike-sign/hPt2"), pTsquare); - System.fill(HIST("system/cut/Xn0n/unlike-sign/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/Xn0n/unlike-sign/hY"), rapidity); - System.fill(HIST("system/cut/Xn0n/unlike-sign/hPhi"), systemPhi); - System.fill(HIST("system/cut/Xn0n/unlike-sign/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/Xn0n/unlike-sign/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/Xn0n/unlike-sign/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/Xn0n/unlike-sign/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/Xn0n/unlike-sign/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/Xn0n/unlike-sign/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } else if (OnXn) { - System.fill(HIST("system/cut/0nXn/unlike-sign/hM"), mass); - System.fill(HIST("system/cut/0nXn/unlike-sign/hPt"), pT); - System.fill(HIST("system/cut/0nXn/unlike-sign/hPt2"), pTsquare); - System.fill(HIST("system/cut/0nXn/unlike-sign/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/0nXn/unlike-sign/hY"), rapidity); - System.fill(HIST("system/cut/0nXn/unlike-sign/hPhi"), systemPhi); - System.fill(HIST("system/cut/0nXn/unlike-sign/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/0nXn/unlike-sign/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/0nXn/unlike-sign/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/0nXn/unlike-sign/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/0nXn/unlike-sign/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/0nXn/unlike-sign/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } else if (XnXn) { - System.fill(HIST("system/cut/XnXn/unlike-sign/hM"), mass); - System.fill(HIST("system/cut/XnXn/unlike-sign/hPt"), pT); - System.fill(HIST("system/cut/XnXn/unlike-sign/hPt2"), pTsquare); - System.fill(HIST("system/cut/XnXn/unlike-sign/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/XnXn/unlike-sign/hY"), rapidity); - System.fill(HIST("system/cut/XnXn/unlike-sign/hPhi"), systemPhi); - System.fill(HIST("system/cut/XnXn/unlike-sign/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/XnXn/unlike-sign/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/XnXn/unlike-sign/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/XnXn/unlike-sign/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/XnXn/unlike-sign/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/XnXn/unlike-sign/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } + fillTrack2dHistos<1, 0>(leadingPt, subleadingPt, leadingEta, subleadingEta, leadingPhi, subleadingPhi); + fillSystemHistos<1, 0, 0>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); + if (onon) + fillSystemHistos<1, 1, 0>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); + if (xnon) + fillSystemHistos<1, 2, 0>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); + if (onxn) + fillSystemHistos<1, 3, 0>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); + if (xnxn) + fillSystemHistos<1, 4, 0>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); break; case 2: - Pions.fill(HIST("pions/selected/like-sign/hPt"), leadingPt, subleadingPt); - Pions.fill(HIST("pions/selected/like-sign/hEta"), leadingEta, subleadingEta); - Pions.fill(HIST("pions/selected/like-sign/hPhi"), leadingPhi, subleadingPhi); - System.fill(HIST("system/cut/no-selection/like-sign/positive/hM"), mass); - System.fill(HIST("system/cut/no-selection/like-sign/positive/hPt"), pT); - System.fill(HIST("system/cut/no-selection/like-sign/positive/hPt2"), pTsquare); - System.fill(HIST("system/cut/no-selection/like-sign/positive/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/no-selection/like-sign/positive/hY"), rapidity); - System.fill(HIST("system/cut/no-selection/like-sign/positive/hPhi"), systemPhi); - System.fill(HIST("system/cut/no-selection/like-sign/positive/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/no-selection/like-sign/positive/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/no-selection/like-sign/positive/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/no-selection/like-sign/positive/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/no-selection/like-sign/positive/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/no-selection/like-sign/positive/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - if (OnOn) { - System.fill(HIST("system/cut/0n0n/like-sign/positive/hM"), mass); - System.fill(HIST("system/cut/0n0n/like-sign/positive/hPt"), pT); - System.fill(HIST("system/cut/0n0n/like-sign/positive/hPt2"), pTsquare); - System.fill(HIST("system/cut/0n0n/like-sign/positive/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/0n0n/like-sign/positive/hY"), rapidity); - System.fill(HIST("system/cut/0n0n/like-sign/positive/hPhi"), systemPhi); - System.fill(HIST("system/cut/0n0n/like-sign/positive/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/0n0n/like-sign/positive/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/0n0n/like-sign/positive/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/0n0n/like-sign/positive/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/0n0n/like-sign/positive/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/0n0n/like-sign/positive/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } else if (XnOn) { - System.fill(HIST("system/cut/Xn0n/like-sign/positive/hM"), mass); - System.fill(HIST("system/cut/Xn0n/like-sign/positive/hPt"), pT); - System.fill(HIST("system/cut/Xn0n/like-sign/positive/hPt2"), pTsquare); - System.fill(HIST("system/cut/Xn0n/like-sign/positive/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/Xn0n/like-sign/positive/hY"), rapidity); - System.fill(HIST("system/cut/Xn0n/like-sign/positive/hPhi"), systemPhi); - System.fill(HIST("system/cut/Xn0n/like-sign/positive/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/Xn0n/like-sign/positive/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/Xn0n/like-sign/positive/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/Xn0n/like-sign/positive/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/Xn0n/like-sign/positive/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/Xn0n/like-sign/positive/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } else if (OnXn) { - System.fill(HIST("system/cut/0nXn/like-sign/positive/hM"), mass); - System.fill(HIST("system/cut/0nXn/like-sign/positive/hPt"), pT); - System.fill(HIST("system/cut/0nXn/like-sign/positive/hPt2"), pTsquare); - System.fill(HIST("system/cut/0nXn/like-sign/positive/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/0nXn/like-sign/positive/hY"), rapidity); - System.fill(HIST("system/cut/0nXn/like-sign/positive/hPhi"), systemPhi); - System.fill(HIST("system/cut/0nXn/like-sign/positive/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/0nXn/like-sign/positive/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/0nXn/like-sign/positive/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/0nXn/like-sign/positive/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/0nXn/like-sign/positive/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/0nXn/like-sign/positive/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } else if (XnXn) { - System.fill(HIST("system/cut/XnXn/like-sign/positive/hM"), mass); - System.fill(HIST("system/cut/XnXn/like-sign/positive/hPt"), pT); - System.fill(HIST("system/cut/XnXn/like-sign/positive/hPt2"), pTsquare); - System.fill(HIST("system/cut/XnXn/like-sign/positive/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/XnXn/like-sign/positive/hY"), rapidity); - System.fill(HIST("system/cut/XnXn/like-sign/positive/hPhi"), systemPhi); - System.fill(HIST("system/cut/XnXn/like-sign/positive/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/XnXn/like-sign/positive/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/XnXn/like-sign/positive/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/XnXn/like-sign/positive/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/XnXn/like-sign/positive/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/XnXn/like-sign/positive/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } + fillTrack2dHistos<1, 1>(leadingPt, subleadingPt, leadingEta, subleadingEta, leadingPhi, subleadingPhi); + fillSystemHistos<1, 0, 1>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); + if (onon) + fillSystemHistos<1, 1, 1>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); + if (xnon) + fillSystemHistos<1, 2, 1>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); + if (onxn) + fillSystemHistos<1, 3, 1>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); + if (xnxn) + fillSystemHistos<1, 4, 1>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); break; case -2: - Pions.fill(HIST("pions/selected/like-sign/hPt"), leadingPt, subleadingPt); - Pions.fill(HIST("pions/selected/like-sign/hEta"), leadingEta, subleadingEta); - Pions.fill(HIST("pions/selected/like-sign/hPhi"), leadingPhi, subleadingPhi); - System.fill(HIST("system/cut/no-selection/like-sign/negative/hM"), mass); - System.fill(HIST("system/cut/no-selection/like-sign/negative/hPt"), pT); - System.fill(HIST("system/cut/no-selection/like-sign/negative/hPt2"), pTsquare); - System.fill(HIST("system/cut/no-selection/like-sign/negative/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/no-selection/like-sign/negative/hY"), rapidity); - System.fill(HIST("system/cut/no-selection/like-sign/negative/hPhi"), systemPhi); - System.fill(HIST("system/cut/no-selection/like-sign/negative/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/no-selection/like-sign/negative/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/no-selection/like-sign/negative/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/no-selection/like-sign/negative/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/no-selection/like-sign/negative/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/no-selection/like-sign/negative/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - if (OnOn) { - System.fill(HIST("system/cut/0n0n/like-sign/negative/hM"), mass); - System.fill(HIST("system/cut/0n0n/like-sign/negative/hPt"), pT); - System.fill(HIST("system/cut/0n0n/like-sign/negative/hPt2"), pTsquare); - System.fill(HIST("system/cut/0n0n/like-sign/negative/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/0n0n/like-sign/negative/hY"), rapidity); - System.fill(HIST("system/cut/0n0n/like-sign/negative/hPhi"), systemPhi); - System.fill(HIST("system/cut/0n0n/like-sign/negative/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/0n0n/like-sign/negative/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/0n0n/like-sign/negative/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/0n0n/like-sign/negative/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/0n0n/like-sign/negative/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/0n0n/like-sign/negative/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } else if (XnOn) { - System.fill(HIST("system/cut/Xn0n/like-sign/negative/hM"), mass); - System.fill(HIST("system/cut/Xn0n/like-sign/negative/hPt"), pT); - System.fill(HIST("system/cut/Xn0n/like-sign/negative/hPt2"), pTsquare); - System.fill(HIST("system/cut/Xn0n/like-sign/negative/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/Xn0n/like-sign/negative/hY"), rapidity); - System.fill(HIST("system/cut/Xn0n/like-sign/negative/hPhi"), systemPhi); - System.fill(HIST("system/cut/Xn0n/like-sign/negative/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/Xn0n/like-sign/negative/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/Xn0n/like-sign/negative/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/Xn0n/like-sign/negative/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/Xn0n/like-sign/negative/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/Xn0n/like-sign/negative/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } else if (OnXn) { - System.fill(HIST("system/cut/0nXn/like-sign/negative/hM"), mass); - System.fill(HIST("system/cut/0nXn/like-sign/negative/hPt"), pT); - System.fill(HIST("system/cut/0nXn/like-sign/negative/hPt2"), pTsquare); - System.fill(HIST("system/cut/0nXn/like-sign/negative/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/0nXn/like-sign/negative/hY"), rapidity); - System.fill(HIST("system/cut/0nXn/like-sign/negative/hPhi"), systemPhi); - System.fill(HIST("system/cut/0nXn/like-sign/negative/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/0nXn/like-sign/negative/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/0nXn/like-sign/negative/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/0nXn/like-sign/negative/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/0nXn/like-sign/negative/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/0nXn/like-sign/negative/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } else if (XnXn) { - System.fill(HIST("system/cut/XnXn/like-sign/negative/hM"), mass); - System.fill(HIST("system/cut/XnXn/like-sign/negative/hPt"), pT); - System.fill(HIST("system/cut/XnXn/like-sign/negative/hPt2"), pTsquare); - System.fill(HIST("system/cut/XnXn/like-sign/negative/hPtVsM"), mass, pT); - System.fill(HIST("system/cut/XnXn/like-sign/negative/hY"), rapidity); - System.fill(HIST("system/cut/XnXn/like-sign/negative/hPhi"), systemPhi); - System.fill(HIST("system/cut/XnXn/like-sign/negative/hPhiRandom"), phiRandom); - System.fill(HIST("system/cut/XnXn/like-sign/negative/hPhiCharge"), phiCharge); - System.fill(HIST("system/cut/XnXn/like-sign/negative/hPhiRandomVsM"), mass, phiRandom); - System.fill(HIST("system/cut/XnXn/like-sign/negative/hPhiChargeVsM"), mass, phiCharge); - System.fill(HIST("system/cut/XnXn/like-sign/negative/hPyVsPxRandom"), pT * std::cos(phiRandom), pT * std::sin(phiRandom)); - System.fill(HIST("system/cut/XnXn/like-sign/negative/hPyVsPxCharge"), pT * std::cos(phiCharge), pT * std::sin(phiCharge)); - } + fillTrack2dHistos<1, 2>(leadingPt, subleadingPt, leadingEta, subleadingEta, leadingPhi, subleadingPhi); + fillSystemHistos<1, 0, 2>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); + if (onon) + fillSystemHistos<1, 1, 2>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); + if (xnon) + fillSystemHistos<1, 2, 2>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); + if (onxn) + fillSystemHistos<1, 3, 2>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); + if (xnxn) + fillSystemHistos<1, 4, 2>(mass, pT, rapidity, systemPhi, phiRandom, phiCharge); break; default: @@ -1059,78 +680,84 @@ struct upcRhoAnalysis { template void processMC(C const& mcCollision, T const& mcParticles) { - MC.fill(HIST("MC/collisions/hPosXY"), mcCollision.posX(), mcCollision.posY()); - MC.fill(HIST("MC/collisions/hPosZ"), mcCollision.posZ()); + rMC.fill(HIST("MC/collisions/hPosXY"), mcCollision.posX(), mcCollision.posY()); + rMC.fill(HIST("MC/collisions/hPosZ"), mcCollision.posZ()); std::vector cutMcParticles; - std::vector mcParticles4Vecs; + std::vector mcParticlesLVs; for (auto const& mcParticle : mcParticles) { - MC.fill(HIST("MC/tracks/all/hPdgCode"), mcParticle.pdgCode()); - MC.fill(HIST("MC/tracks/all/hProducedByGenerator"), mcParticle.producedByGenerator()); - MC.fill(HIST("MC/tracks/all/hIsPhysicalPrimary"), mcParticle.isPhysicalPrimary()); - MC.fill(HIST("MC/tracks/all/hPt"), pt(mcParticle.px(), mcParticle.py())); - MC.fill(HIST("MC/tracks/all/hEta"), eta(mcParticle.px(), mcParticle.py(), mcParticle.pz())); - MC.fill(HIST("MC/tracks/all/hPhi"), phi(mcParticle.px(), mcParticle.py())); + rMC.fill(HIST("MC/tracks/all/hPdgCode"), mcParticle.pdgCode()); + rMC.fill(HIST("MC/tracks/all/hProducedByGenerator"), mcParticle.producedByGenerator()); + rMC.fill(HIST("MC/tracks/all/hIsPhysicalPrimary"), mcParticle.isPhysicalPrimary()); + rMC.fill(HIST("MC/tracks/all/hPt"), pt(mcParticle.px(), mcParticle.py())); + rMC.fill(HIST("MC/tracks/all/hEta"), eta(mcParticle.px(), mcParticle.py(), mcParticle.pz())); + rMC.fill(HIST("MC/tracks/all/hPhi"), phi(mcParticle.px(), mcParticle.py())); if (!mcParticle.isPhysicalPrimary() || std::abs(mcParticle.pdgCode()) != 211) continue; cutMcParticles.push_back(mcParticle); - TLorentzVector pion4Vec; - pion4Vec.SetPxPyPzE(mcParticle.px(), mcParticle.py(), mcParticle.pz(), mcParticle.e()); - mcParticles4Vecs.push_back(pion4Vec); + TLorentzVector pionLV; + pionLV.SetPxPyPzE(mcParticle.px(), mcParticle.py(), mcParticle.pz(), mcParticle.e()); + mcParticlesLVs.push_back(pionLV); } - MC.fill(HIST("MC/collisions/hNPions"), cutMcParticles.size()); + rMC.fill(HIST("MC/collisions/hNPions"), cutMcParticles.size()); - if (mcParticles4Vecs.size() != cutMcParticles.size()) + if (cutMcParticles.size() != 2) + return; + if (mcParticlesLVs.size() != cutMcParticles.size()) return; if (tracksTotalChargeMC(cutMcParticles) != 0) // shouldn't happen in theory return; - TLorentzVector system = reconstructSystem(mcParticles4Vecs); - double mass = system.M(); - double pT = system.Pt(); - double pTsquare = pT * pT; - double rapidity = system.Rapidity(); - double systemPhi = system.Phi() + o2::constants::math::PI; - - if (do4pi && cutMcParticles.size() == 4) { - for (int i = 0; i < static_cast(cutMcParticles.size()); i++) { - FourPiQA.fill(HIST("FourPiQA/MC/tracks/hPt"), pt(cutMcParticles[i].px(), cutMcParticles[i].py())); - FourPiQA.fill(HIST("FourPiQA/MC/tracks/hEta"), eta(cutMcParticles[i].px(), cutMcParticles[i].py(), cutMcParticles[i].pz())); - FourPiQA.fill(HIST("FourPiQA/MC/tracks/hPhi"), phi(cutMcParticles[i].px(), cutMcParticles[i].py())); - } - FourPiQA.fill(HIST("FourPiQA/MC/system/hM"), mass); - FourPiQA.fill(HIST("FourPiQA/MC/system/hPt"), pT); - FourPiQA.fill(HIST("FourPiQA/MC/system/hY"), rapidity); - FourPiQA.fill(HIST("FourPiQA/MC/system/hPhi"), systemPhi); - } - - if (cutMcParticles.size() != 2) - return; + TLorentzVector system = reconstructSystem(mcParticlesLVs); + float mass = system.M(); + float pT = system.Pt(); + float rapidity = system.Rapidity(); + float systemPhi = system.Phi() + o2::constants::math::PI; + float phiRandom = getPhiRandom(mcParticlesLVs); + float phiCharge = getPhiChargeMC(cutMcParticles, mcParticlesLVs); auto leadingMomentumPion = momentum(cutMcParticles[0].px(), cutMcParticles[0].py(), cutMcParticles[0].pz()) > momentum(cutMcParticles[1].px(), cutMcParticles[1].py(), cutMcParticles[1].pz()) ? cutMcParticles[0] : cutMcParticles[1]; auto subleadingMomentumPion = (leadingMomentumPion == cutMcParticles[0]) ? cutMcParticles[1] : cutMcParticles[0]; - MC.fill(HIST("MC/tracks/pions/hPt"), pt(leadingMomentumPion.px(), leadingMomentumPion.py()), pt(subleadingMomentumPion.px(), subleadingMomentumPion.py())); - MC.fill(HIST("MC/tracks/pions/hEta"), eta(leadingMomentumPion.px(), leadingMomentumPion.py(), leadingMomentumPion.pz()), eta(subleadingMomentumPion.px(), subleadingMomentumPion.py(), subleadingMomentumPion.pz())); - MC.fill(HIST("MC/tracks/pions/hPhi"), phi(leadingMomentumPion.px(), leadingMomentumPion.py()), phi(subleadingMomentumPion.px(), subleadingMomentumPion.py())); - - double phiRandom = getPhiRandom(mcParticles4Vecs); - double phiCharge = getPhiChargeMC(cutMcParticles, mcParticles4Vecs); - - MC.fill(HIST("MC/system/hM"), mass); - MC.fill(HIST("MC/system/hPt"), pT); - MC.fill(HIST("MC/system/hPtVsM"), mass, pT); - MC.fill(HIST("MC/system/hPt2"), pTsquare); - MC.fill(HIST("MC/system/hY"), rapidity); - MC.fill(HIST("MC/system/hPhi"), systemPhi); - MC.fill(HIST("MC/system/hPhiRandom"), phiRandom); - MC.fill(HIST("MC/system/hPhiCharge"), phiCharge); + rMC.fill(HIST("MC/tracks/hPt"), pt(leadingMomentumPion.px(), leadingMomentumPion.py()), pt(subleadingMomentumPion.px(), subleadingMomentumPion.py())); + rMC.fill(HIST("MC/tracks/hEta"), eta(leadingMomentumPion.px(), leadingMomentumPion.py(), leadingMomentumPion.pz()), eta(subleadingMomentumPion.px(), subleadingMomentumPion.py(), subleadingMomentumPion.pz())); + rMC.fill(HIST("MC/tracks/hPhi"), phi(leadingMomentumPion.px(), leadingMomentumPion.py()), phi(subleadingMomentumPion.px(), subleadingMomentumPion.py())); + + rMC.fill(HIST("MC/system/hM"), mass); + rMC.fill(HIST("MC/system/hPt"), pT); + rMC.fill(HIST("MC/system/hPtVsM"), mass, pT); + rMC.fill(HIST("MC/system/hPt2"), pT * pT); + rMC.fill(HIST("MC/system/hY"), rapidity); + rMC.fill(HIST("MC/system/hPhi"), systemPhi); + rMC.fill(HIST("MC/system/hPhiRandom"), phiRandom); + rMC.fill(HIST("MC/system/hPhiCharge"), phiCharge); + + if (systemPassesCuts(system)) { + rMC.fill(HIST("MC/system/selected/hM"), mass); + rMC.fill(HIST("MC/system/selected/hPt"), pT); + rMC.fill(HIST("MC/system/selected/hPtVsM"), mass, pT); + rMC.fill(HIST("MC/system/selected/hPt2"), pT * pT); + rMC.fill(HIST("MC/system/selected/hY"), rapidity); + rMC.fill(HIST("MC/system/selected/hPhi"), systemPhi); + rMC.fill(HIST("MC/system/selected/hPhiRandom"), phiRandom); + rMC.fill(HIST("MC/system/selected/hPhiCharge"), phiCharge); + } + + // fill mcTree + int localBc = mcCollision.globalBC() % o2::constants::lhc::LHCMaxBunches; + int trackSigns[2] = {leadingMomentumPion.pdgCode() / std::abs(leadingMomentumPion.pdgCode()), subleadingMomentumPion.pdgCode() / std::abs(subleadingMomentumPion.pdgCode())}; + float trackPts[2] = {pt(leadingMomentumPion.px(), leadingMomentumPion.py()), pt(subleadingMomentumPion.px(), subleadingMomentumPion.py())}; + float trackEtas[2] = {eta(leadingMomentumPion.px(), leadingMomentumPion.py(), leadingMomentumPion.pz()), eta(subleadingMomentumPion.px(), subleadingMomentumPion.py(), subleadingMomentumPion.pz())}; + float trackPhis[2] = {phi(leadingMomentumPion.px(), leadingMomentumPion.py()), phi(subleadingMomentumPion.px(), subleadingMomentumPion.py())}; + mcTree(localBc, + mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), + phiRandom, phiCharge, trackSigns, trackPts, trackEtas, trackPhis); } template void checkNumberOfCollisionReconstructions(C const& collisions) { - MC.fill(HIST("MC/collisions/hNumOfCollisionRecos"), collisions.size()); + rMC.fill(HIST("MC/collisions/hNumOfCollisionRecos"), collisions.size()); } void processSGdata(FullUdSgCollision const& collision, FullUdTracks const& tracks) @@ -1139,29 +766,29 @@ struct upcRhoAnalysis { return; processReco(collision, tracks); } - PROCESS_SWITCH(upcRhoAnalysis, processSGdata, "analyse SG data", true); + PROCESS_SWITCH(UpcRhoAnalysis, processSGdata, "analyse SG data", true); void processDGdata(FullUdDgCollision const& collision, FullUdTracks const& tracks) { processReco(collision, tracks); } - PROCESS_SWITCH(upcRhoAnalysis, processDGdata, "analyse DG data", false); + PROCESS_SWITCH(UpcRhoAnalysis, processDGdata, "analyse DG data", false); void processMCdata(aod::UDMcCollision const& mcCollision, aod::UDMcParticles const& mcParticles) { processMC(mcCollision, mcParticles); } - PROCESS_SWITCH(upcRhoAnalysis, processMCdata, "analyse MC data", false); + PROCESS_SWITCH(UpcRhoAnalysis, processMCdata, "analyse MC data", false); void processCollisionRecoCheck(aod::McCollision const& /* mcCollision */, soa::SmallGroups> const& collisions) { checkNumberOfCollisionReconstructions(collisions); } - PROCESS_SWITCH(upcRhoAnalysis, processCollisionRecoCheck, "check number of collision reconstructions", false); + PROCESS_SWITCH(UpcRhoAnalysis, processCollisionRecoCheck, "check number of collision reconstructions", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - o2::framework::adaptAnalysisTask(cfgc)}; + o2::framework::adaptAnalysisTask(cfgc)}; } From 01465a08449ce613cfa527db42283ebe36cf95a6 Mon Sep 17 00:00:00 2001 From: smaff92 <33285879+smaff92@users.noreply.github.com> Date: Tue, 18 Feb 2025 21:37:40 +0900 Subject: [PATCH 0289/1650] [PWGJE] - updating stat prompt photon (#9999) Co-authored-by: ALICE Action Bot --- PWGJE/Tasks/statPromptPhoton.cxx | 929 +++++++++++++++++++++++++++---- 1 file changed, 823 insertions(+), 106 deletions(-) diff --git a/PWGJE/Tasks/statPromptPhoton.cxx b/PWGJE/Tasks/statPromptPhoton.cxx index ea25a14b00c..d27b32b5b16 100644 --- a/PWGJE/Tasks/statPromptPhoton.cxx +++ b/PWGJE/Tasks/statPromptPhoton.cxx @@ -14,6 +14,11 @@ /// /// /// \author Adrian Fereydon Nassirpour +#include + +#include +#include +#include #include #include @@ -45,6 +50,10 @@ #include "DataFormatsEMCAL/Cell.h" #include "DataFormatsEMCAL/Constants.h" #include "DataFormatsEMCAL/AnalysisCluster.h" +#include "DataFormatsParameters/GRPObject.h" +#include "DataFormatsParameters/GRPMagField.h" + +#include "DetectorsBase/Propagator.h" #include "CommonDataFormat/InteractionRecord.h" @@ -79,6 +88,14 @@ struct statPromptPhoton { Configurable cfgMinTrig{"MinTrig", 1, "Min. Trigger energy/momentum"}; Configurable cfgMaxTrig{"MaxTrig", 5, "Max. Trigger energy/momentum"}; Configurable cfgVtxCut{"cfgVtxCut", 10.0, "V_z cut selection"}; + Configurable cfgLowM02{"cfgLowM02", 0.1, "Lower-bound M02 cut"}; + Configurable cfgHighM02{"cfgHighM02", 0.3, "Higher-bound M02 cut"}; + Configurable cfgLowClusterE{"cfgLowClusterE", 0.5, "Higher-bound Cluster E cut"}; + Configurable cfgHighClusterE{"cfgHighClusterE", 500, "Lower-bound Cluster E cut"}; + Configurable cfgEmcTrigger{"cfgEmcTrigger", true, "Require EMC readout for event"}; + Configurable cfgGeoCut{"cfgGeoCut", true, "Performs Geometric TPC cut"}; + Configurable cfgPtClusterCut{"cfgPtClusterCut", true, "Performs Pt-dependent cluster-track matching"}; + Configurable cfgDebug{"cfgDebug", false, "Enables debug information for local running"}; // INIT void init(InitContext const&) @@ -91,12 +108,64 @@ struct statPromptPhoton { histos.add("REC_PtHadSum_Photon", "REC_PtHadSum_Photon", kTH1F, {pthadAxis}); histos.add("REC_TrackPhi_photontrigger", "REC_TrackPhi_photontrigger", kTH1F, {{64, 0, 2 * TMath::Pi()}}); histos.add("REC_TrackEta_photontrigger", "REC_TrackEta_photontrigger", kTH1F, {{100, -1, 1}}); + histos.add("REC_ClusterPhi", "REC_ClusterPhi", kTH1F, {{640 * 2, 0, 2 * TMath::Pi()}}); + histos.add("REC_ClusterEta", "REC_ClusterEta", kTH1F, {{100, -1, 1}}); + + histos.add("REC_Track_Pt", "REC_Track_Pt", kTH1F, {{82, -1.0, 40.0}}); + histos.add("REC_Track_Phi", "REC_Track_Phi", kTH1F, {{640 * 2, 0, 2 * TMath::Pi()}}); + histos.add("REC_Track_PhiPrime_Pt", "REC_Track_PhiPrime_Pt", kTH2F, {{640, 0, 2 * TMath::Pi()}, {82, -1.0, 40.0}}); + histos.add("REC_Cluster_PhiPrime_Pt", "REC_Cluster_PhiPrime_Pt", kTH2F, {{640, 0, 2 * TMath::Pi()}, {82, -1.0, 40.0}}); + histos.add("REC_Cluster_PhiPrime_Pt_AC", "REC_Cluster_PhiPrime_Pt_AC", kTH2F, {{640, 0, 2 * TMath::Pi()}, {82, -1.0, 40.0}}); + histos.add("REC_Cluster_PhiPrime_Pt_C", "REC_Cluster_PhiPrime_Pt_C", kTH2F, {{640, 0, 2 * TMath::Pi()}, {82, -1.0, 40.0}}); + + histos.add("REC_Cluster_Particle_Pt", "REC_Cluster_Particle_Pt", kTH1F, {{82, -1.0, 40.0}}); + histos.add("REC_Cluster_ParticleWITHtrack_Pt", "REC_Cluster_ParticleWITHtrack_Pt", kTH1F, {{82, -1.0, 40.0}}); + histos.add("REC_Cluster_ParticleWITHtrack_Phi", "REC_Cluster_ParticleWITHtrack_Phi", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Cluster_ParticleWITHtrack_Eta", "REC_Cluster_ParticleWITHtrack_Eta", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Cluster_ParticleWITHtrack_TrackPt", "REC_Cluster_ParticleWITHtrack_TrackPt", kTH1F, {{82, -1.0, 40.0}}); + histos.add("REC_Cluster_ParticleWITHtrack_Pt_Phi", "REC_Cluster_ParticleWITHtrack_Pt_Phi", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Cluster_ParticleWITHtrack_Pt_PhiPrime", "REC_Cluster_ParticleWITHtrack_Pt_PhiPrime", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Impurity_ParticleWITHtrack_Pt_PhiPrime", "REC_Impurity_ParticleWITHtrack_Pt_PhiPrime", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + + histos.add("REC_Cluster_ParticleWITHtrack_Pt_Eta", "REC_Cluster_ParticleWITHtrack_Pt_Eta", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + + histos.add("REC_Cluster_ParticleWITHOUTtrack_Pt", "REC_Cluster_ParticleWITHOUTtrack_Pt", kTH1F, {{82, -1.0, 40.0}}); + histos.add("REC_Cluster_ParticleWITHOUTtrack_Phi", "REC_Cluster_ParticleWITHOUTtrack_Phi", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Cluster_ParticleWITHOUTtrack_Eta", "REC_Cluster_ParticleWITHOUTtrack_Eta", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Cluster_ParticleWITHOUTtrack_Pt_Phi", "REC_Cluster_ParticleWITHOUTtrack_Pt_Phi", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Cluster_ParticleWITHOUTtrack_Pt_PhiPrime", "REC_Cluster_ParticleWITHOUTtrack_Pt_PhiPrime", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Cluster_ParticleWITHOUTtrack_Pt_Eta", "REC_Cluster_ParticleWITHOUTtrack_Pt_Eta", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Impurity_ParticleWITHOUTtrack_Pt_PhiPrime", "REC_Impurity_ParticleWITHOUTtrack_Pt_PhiPrime", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + + histos.add("REC_TrackPt_ClusterE", "REC_TrackPt_ClusterE", kTH2F, {{82, -1.0, 40.0}, {82, -1.0, 40.0}}); + histos.add("REC_ParticlePt_ClusterE", "REC_ParticlePt_ClusterE", kTH2F, {{82, -1.0, 40.0}, {82, -1.0, 40.0}}); + histos.add("REC_TrackPt_Phi_Eta", "REC_TrackPt_Phi_Eta", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_ParticlePt_Phi_Eta", "REC_ParticlePt_Phi_Eta", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_True_v_Cluster_Phi", "REC_True_v_Cluster_Phi", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); histos.add("REC_True_v_Cluster_Eta", "REC_True_v_Cluster_Eta", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_TrueImpurity_v_Cluster_Phi", "REC_TrueImpurity_v_Cluster_Phi", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_TrueImpurity_v_Cluster_Eta", "REC_TrueImpurity_v_Cluster_Eta", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_TrueImpurity_v_Cluster_PhiAbs", "REC_TrueImpurity_v_Cluster_PhiAbs", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_TrueImpurity_v_Cluster_EtaAbs", "REC_TrueImpurity_v_Cluster_EtaAbs", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + + histos.add("REC_TrueImpurity_v_Cluster_Phi_Eta", "REC_TrueImpurity_v_Cluster_Phi_Eta", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Track_v_Cluster_Phi", "REC_Track_v_Cluster_Phi", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); histos.add("REC_Track_v_Cluster_Eta", "REC_Track_v_Cluster_Eta", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Track_v_Cluster_Phi_Pt", "REC_Track_v_Cluster_Phi_Pt", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {82, -1.0, 40.0}}); + histos.add("REC_Track_v_Cluster_Eta_Pt", "REC_Track_v_Cluster_Eta_Pt", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {82, -1.0, 40.0}}); + + histos.add("REC_Track_v_Cluster_Phi_Eta", "REC_Track_v_Cluster_Phi_Eta", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Track_v_Cluster_Phi_AC", "REC_Track_v_Cluster_Phi_AC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); histos.add("REC_Track_v_Cluster_Eta_AC", "REC_Track_v_Cluster_Eta_AC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Track_v_Cluster_Phi_Eta_AC", "REC_Track_v_Cluster_Phi_Eta_AC", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + + histos.add("REC_Track_v_Cluster_Phi_C", "REC_Track_v_Cluster_Phi_C", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Track_v_Cluster_Eta_C", "REC_Track_v_Cluster_Eta_C", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Track_v_Cluster_Phi_Eta_C", "REC_Track_v_Cluster_Phi_Eta_C", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_SumPt_BC", "REC_SumPt_BC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); histos.add("REC_SumPt_AC", "REC_SumPt_AC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); histos.add("REC_M02_BC", "REC_M02_BC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); @@ -105,11 +174,20 @@ struct statPromptPhoton { histos.add("REC_Trigger_Purity", "REC_Trigger_Purity", kTH1F, {{4, 0.0, 4.0}}); histos.add("REC_Trigger_Energy", "REC_Trigger_Energy", kTH1F, {{82, -1.0, 40.0}}); + histos.add("REC_Trigger_Purity_v_Energy", "REC_Trigger_Purity_v_Energy", kTH2F, {{4, 0.0, 4.0}, {82, -1.0, 40.0}}); + histos.add("REC_Trigger_Energy_GOOD", "REC_Trigger_Energy_GOOD", kTH1F, {{82, -1.0, 40.0}}); histos.add("REC_Trigger_Energy_MISS", "REC_Trigger_Energy_MISS", kTH1F, {{82, -1.0, 40.0}}); histos.add("REC_Trigger_Energy_FAKE", "REC_Trigger_Energy_FAKE", kTH1F, {{82, -1.0, 40.0}}); histos.add("REC_All_Energy", "REC_All_Energy", kTH1F, {{82, -1.0, 40.0}}); + histos.add("REC_Impurity_Energy", "REC_Impurity_Energy", kTH1F, {{82, -1.0, 40.0}}); + histos.add("REC_Impurity_Energy_v_Cluster_Phi", "REC_Impurity_Energy_v_Cluster_Phi", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Impurity_Energy_v_ClusterE_Phi", "REC_Impurity_Energy_v_ClusterE_Phi", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Impurity_Energy_v_ClusterEoP_Phi", "REC_Impurity_Energy_v_ClusterEoP_Phi", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + + histos.add("REC_Impurity_Energy_v_Cluster_Energy", "REC_Impurity_Energy_v_Cluster_Energy", kTH2F, {{82, -1.0, 40.0}, {82, -1.0, 40.0}}); + histos.add("REC_True_Trigger_Energy", "REC_True_Trigger_Energy", kTH1F, {{82, -1.0, 40.0}}); histos.add("REC_True_Prompt_Trigger_Energy", "REC_True_Prompt_Trigger_Energy", kTH1F, {{82, -1.0, 40.0}}); @@ -120,6 +198,8 @@ struct statPromptPhoton { histos.add("REC_dR_Stern", "REC_dR_Stern", kTH1F, {{628, 0.0, 2 * TMath::Pi()}}); histos.add("GEN_nEvents", "GEN_nEvents", kTH1F, {{4, 0.0, 4.0}}); + + histos.add("GEN_Particle_Pt", "GEN_Particle_Pt", kTH1F, {{82, -1.0, 40.0}}); histos.add("GEN_True_Photon_Energy", "GEN_True_Photon_Energy", kTH1F, {{8200, -1.0, 40.0}}); histos.add("GEN_True_Prompt_Photon_Energy", "GEN_True_Prompt_Photon_Energy", kTH1F, {{8200, -1.0, 40.0}}); histos.add("GEN_Trigger_V_PtHadSum_Stern", "GEN_Trigger_V_PtHadSum_Stern", kTH2F, {{100, 0, 100}, pthadAxis}); @@ -128,26 +208,78 @@ struct statPromptPhoton { histos.add("GEN_dR_Photon", "GEN_dR_Photon", kTH1F, {{628, 0.0, 2 * TMath::Pi()}}); histos.add("GEN_dR_Stern", "GEN_dR_Stern", kTH1F, {{628, 0.0, 2 * TMath::Pi()}}); - } // end of init + histos.add("DATA_nEvents", "DATA_nEvents", kTH1F, {{4, 0.0, 4.0}}); + histos.add("DATA_M02_BC", "DATA_M02_BC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("DATA_M02_AC", "DATA_M02_AC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("DATA_Cluster_QA", "DATA_Cluster_QA", kTH1F, {{10, -0.5, 9.5}}); + histos.add("DATA_ClusterPhi", "DATA_ClusterPhi", kTH1F, {{640 * 2, 0, 2 * TMath::Pi()}}); + histos.add("DATA_ClusterEta", "DATA_ClusterEta", kTH1F, {{100, -1, 1}}); + histos.add("DATA_All_Energy", "DATA_All_Energy", kTH1F, {{82, -1.0, 40.0}}); + histos.add("DATA_Cluster_PhiPrime_Pt", "DATA_Cluster_PhiPrime_Pt", kTH2F, {{640, 0, 2 * TMath::Pi()}, {82, -1.0, 40.0}}); + histos.add("DATA_Cluster_PhiPrime_Pt_AC", "DATA_Cluster_PhiPrime_Pt_AC", kTH2F, {{640, 0, 2 * TMath::Pi()}, {82, -1.0, 40.0}}); + histos.add("DATA_Cluster_PhiPrime_Pt_C", "DATA_Cluster_PhiPrime_Pt_C", kTH2F, {{640, 0, 2 * TMath::Pi()}, {82, -1.0, 40.0}}); + histos.add("DATA_Track_v_Cluster_Phi", "DATA_Track_v_Cluster_Phi", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("DATA_Track_v_Cluster_Eta", "DATA_Track_v_Cluster_Eta", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("DATA_Track_v_Cluster_Phi_Pt", "DATA_Track_v_Cluster_Phi_Pt", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {82, -1.0, 40.0}}); + histos.add("DATA_Track_v_Cluster_Phi_Eta", "DATA_Track_v_Cluster_Phi_Eta", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("DATA_SumPt_BC", "DATA_SumPt_BC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("DATA_SumPt_AC", "DATA_SumPt_AC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("DATA_Trigger_V_PtHadSum_Photon", "DATA_Trigger_V_PtHadSum_Photon", kTH2F, {{100, 0, 100}, pthadAxis}); + histos.add("DATA_PtHadSum_Photon", "DATA_PtHadSum_Photon", kTH1F, {pthadAxis}); + histos.add("DATA_Trigger_Energy", "DATA_Trigger_Energy", kTH1F, {{82, -1.0, 40.0}}); + histos.add("DATA_Track_PhiPrime_Pt", "DATA_Track_PhiPrime_Pt", kTH2F, {{640, 0, 2 * TMath::Pi()}, {82, -1.0, 40.0}}); + histos.add("DATA_Track_Pt", "DATA_Track_Pt", kTH1F, {{82, -1.0, 40.0}}); + histos.add("DATA_Track_Phi", "DATA_Track_Phi", kTH1F, {{640 * 2, 0, 2 * TMath::Pi()}}); + histos.add("DATA_TrackPhi_photontrigger", "DATA_TrackPhi_photontrigger", kTH1F, {{64, 0, 2 * TMath::Pi()}}); + histos.add("DATA_TrackEta_photontrigger", "DATA_TrackEta_photontrigger", kTH1F, {{100, -1, 1}}); + histos.add("DATA_Trigger_V_PtHadSum_Stern", "DATA_Trigger_V_PtHadSum_Stern", kTH2F, {{100, 0, 100}, pthadAxis}); - Filter clusterDefinitionSelection = (o2::aod::emcalcluster::definition == cfgClusterDefinition) && (o2::aod::emcalcluster::time >= cfgMinTime) && (o2::aod::emcalcluster::time <= cfgMaxTime) && (o2::aod::emcalcluster::energy > cfgMinClusterEnergy) && (o2::aod::emcalcluster::nCells >= cfgMinNCells) && (o2::aod::emcalcluster::nlm <= cfgMaxNLM) && (o2::aod::emcalcluster::isExotic == cfgExoticContribution); - Filter emccellfilter = aod::calo::caloType == 1; // mc emcal cell - Filter PosZFilter = nabs(aod::collision::posZ) < cfgVtxCut; - Filter mcPosZFilter = nabs(aod::mccollision::posZ) < cfgVtxCut; + } // end of init - using MCCells = o2::soa::Join; + /* //Legacy non-je classes + Service ccdb; + std::string runs = ""; + double bfield = 0; + Filter clusterDefinitionSelection = (o2::aod::emcalcluster::definition == cfgClusterDefinition) && (o2::aod::emcalcluster::time >= cfgMinTime) && (o2::aod::emcalcluster::time <= cfgMaxTime) && (o2::aod::emcalcluster::energy > cfgMinClusterEnergy) && (o2::aod::emcalcluster::nCells >= cfgMinNCells) && (o2::aod::emcalcluster::nlm <= cfgMaxNLM) && (o2::aod::emcalcluster::isExotic == cfgExoticContribution); + Filter emccellfilter = aod::calo::caloType == 1; // mc emcal cell + Filter PosZFilter = nabs(aod::jcollision::posZ) < cfgVtxCut; + Filter mcPosZFilter = nabs(aod::jmccollision::posZ) < cfgVtxCut; + + using MCCells = o2::soa::Join; + using MCClusters = o2::soa::Join; + using Clusters = o2::aod::EMCALMCClusters; + + // using selectedCollisions = soa::Join; + using selectedMCCollisions = aod::JMcCollisions; + using TrackCandidates = soa::Join; + using BcCandidates = soa::Join; + using filteredMCCells = o2::soa::Filtered; + using filteredMCClusters = soa::Filtered; + using filteredClusters = soa::Filtered; + // using filteredCollisions = soa::Filtered; + using filteredMCCollisions = soa::Filtered; + */ - using MCClusters = o2::soa::Join; - using selectedCollisions = soa::Join; - using selectedMCCollisions = aod::McCollisions; + Filter PosZFilter_JE = nabs(aod::jcollision::posZ) < cfgVtxCut; + Filter clusterDefinitionSelection_JE = (o2::aod::jcluster::definition == cfgClusterDefinition) && (o2::aod::jcluster::time >= cfgMinTime) && (o2::aod::jcluster::time <= cfgMaxTime) && (o2::aod::jcluster::energy > cfgMinClusterEnergy) && (o2::aod::jcluster::nCells >= cfgMinNCells) && (o2::aod::jcluster::nlm <= cfgMaxNLM) && (o2::aod::jcluster::isExotic == cfgExoticContribution); + using selectedMCCollisions = aod::JMcCollisions; + using filteredMCCollisions = soa::Filtered; using TrackCandidates = soa::Join; + using BcCandidates = soa::Join; - using filteredMCCells = o2::soa::Filtered; - using filteredMCClusters = soa::Filtered; - using filteredCollisions = soa::Filtered; - using filteredMCCollisions = soa::Filtered; + // using jTrackCandidates = soa::Join; + using jTrackCandidates = soa::Join; + using jDataTrackCandidates = soa::Join; + using jMCClusters = o2::soa::Join; + using jClusters = o2::soa::Join; + using jselectedCollisions = soa::Join; + using jfilteredCollisions = soa::Filtered; + using jfilteredMCClusters = soa::Filtered; + using jfilteredClusters = soa::Filtered; + + // aod::JCollisions, aod::JCollisionPIs, aod::JCollisionBCs, aod::JEMCCollisionLbs Preslice perClusterMatchedTracks = o2::aod::emcalclustercell::emcalclusterId; // Helper functions @@ -296,11 +428,14 @@ struct statPromptPhoton { ///////////////////////////////////////////////////////////////////////////// int nEventsGenMC = 0; - void processMCGen(filteredMCCollisions::iterator const& collision, soa::SmallGroups> const& recocolls, aod::McParticles const& mcParticles, filteredMCClusters const&) + // void processMCGen(filteredMCCollisions::iterator const& collision, soa::SmallGroups> const& recocolls, aod::McParticles const& mcParticles, filteredMCClusters const&) + void processMCGen(filteredMCCollisions::iterator const& collision, soa::SmallGroups> const& recocolls, aod::JMcParticles const& mcParticles, jfilteredMCClusters const&) { nEventsGenMC++; - if ((nEventsGenMC + 1) % 10000 == 0) { - std::cout << "Processed Gen MC Events: " << nEventsGenMC << std::endl; + if (cfgDebug) { + if ((nEventsGenMC + 1) % 10000 == 0) { + std::cout << "Processed Gen MC Events: " << nEventsGenMC << std::endl; + } } histos.fill(HIST("GEN_nEvents"), 0.5); if (fabs(collision.posZ()) > cfgVtxCut) @@ -315,8 +450,11 @@ struct statPromptPhoton { return; histos.fill(HIST("GEN_nEvents"), 1.5); - if (!recocoll.alias_bit(kTVXinEMC)) - return; + + if (cfgEmcTrigger) { + if (!recocoll.isEmcalReadout()) + return; + } histos.fill(HIST("GEN_nEvents"), 2.5); } @@ -326,6 +464,12 @@ struct statPromptPhoton { continue; if (std::abs(mcPhoton.eta()) > cfgtrkMaxEta) continue; + double pdgcode = fabs(mcPhoton.pdgCode()); + if (mcPhoton.isPhysicalPrimary()) { + if (pdgcode == 211 || pdgcode == 321 || pdgcode == 2212 || pdgcode == 11) { + histos.fill(HIST("GEN_Particle_Pt"), mcPhoton.pt()); + } + } if (mcPhoton.getGenStatusCode() < 20) continue; @@ -374,8 +518,75 @@ struct statPromptPhoton { double truepthadsum = GetPtHadSum(mcParticles, lRealPhoton, cfgMinR, cfgMaxR, false, true, false); histos.fill(HIST("GEN_Trigger_V_PtHadSum_Photon"), mcPhoton.e(), truepthadsum); } + // now we do all PROMPT photons - if (std::abs(mcPhoton.getGenStatusCode()) > 19 && std::abs(mcPhoton.getGenStatusCode()) < 70) { + histos.fill(HIST("REC_True_Trigger_Energy"), mcPhoton.e()); + + int mompdg1 = 0; + int momindex1 = 0; + int momstatus1 = 0; + for (auto& photon_mom : mcPhoton.mothers_as()) { + if (mompdg1 == 0) { + mompdg1 = photon_mom.pdgCode(); + momindex1 = photon_mom.globalIndex(); + momstatus1 = photon_mom.getGenStatusCode(); + } + } // first photon loop + + if (std::fabs(mompdg1) < 40 && std::fabs(mompdg1) > 0) { + int mompdg2 = 0; + int momindex2 = 0; + int momstatus2 = 0; + int mompdg3 = 0; + int momindex3 = 0; + int momstatus3 = 0; + for (auto& mcPhoton_mom : mcParticles) { + if (mcPhoton_mom.globalIndex() == momindex1) { + for (auto& photon_momom : mcPhoton_mom.mothers_as()) { + if (mompdg2 == 0) { + mompdg2 = photon_momom.pdgCode(); + momindex2 = photon_momom.globalIndex(); + momstatus2 = photon_momom.getGenStatusCode(); + } + } + break; + } + } // 2nd photon loop + if (std::fabs(mompdg2) < 40 && std::fabs(mompdg2) > 0) { + for (auto& mcPhoton_mom : mcParticles) { + if (mcPhoton_mom.globalIndex() == momindex2) { + for (auto& photon_momom : mcPhoton_mom.mothers_as()) { + if (mompdg3 == 0) { + mompdg3 = photon_momom.pdgCode(); + momindex3 = photon_momom.globalIndex(); + momstatus3 = photon_momom.getGenStatusCode(); + } + } + break; + } + } // 3rd photon loop + } // 2nd photon check + + if (cfgDebug) { + std::cout << "We have a GEN prompt photon" << std::endl; + std::cout << "Photon gen status code chain: " << std::endl; + std::cout << "Photon stat: " << mcPhoton.getGenStatusCode() << std::endl; + std::cout << "Photon index: " << mcPhoton.globalIndex() << std::endl; + std::cout << "Photon mompdg 1: " << mompdg1 << std::endl; + std::cout << "Photon momstatus 1: " << momstatus1 << std::endl; + std::cout << "Photon momindex 1: " << momindex1 << std::endl; + std::cout << "Photon mompdg 2: " << mompdg2 << std::endl; + std::cout << "Photon momstatus 2: " << momstatus2 << std::endl; + std::cout << "Photon momindex 2: " << momindex2 << std::endl; + std::cout << "Photon mompdg 3: " << mompdg3 << std::endl; + std::cout << "Photon momstatus 3: " << momstatus3 << std::endl; + std::cout << "Photon momindex 3: " << momindex3 << std::endl; + } + } else { + continue; + } + + if (std::abs(mcPhoton.getGenStatusCode()) > 19 && std::abs(mcPhoton.getGenStatusCode()) < 90) { if (mcPhoton.isPhysicalPrimary()) { histos.fill(HIST("GEN_True_Prompt_Photon_Energy"), mcPhoton.e()); if (photontrigger) { @@ -395,26 +606,19 @@ struct statPromptPhoton { PROCESS_SWITCH(statPromptPhoton, processMCGen, "process MC Gen", true); - Filter PosZFilter_JE = nabs(aod::jcollision::posZ) < cfgVtxCut; - Filter clusterDefinitionSelection_JE = (o2::aod::jcluster::definition == cfgClusterDefinition) && (o2::aod::jcluster::time >= cfgMinTime) && (o2::aod::jcluster::time <= cfgMaxTime) && (o2::aod::jcluster::energy > cfgMinClusterEnergy) && (o2::aod::jcluster::nCells >= cfgMinNCells) && (o2::aod::jcluster::nlm <= cfgMaxNLM) && (o2::aod::jcluster::isExotic == cfgExoticContribution); - - using jTrackCandidates = soa::Join; - using jMCClusters = o2::soa::Join; - using jselectedCollisions = soa::Join; - using jfilteredCollisions = soa::Filtered; - using jfilteredMCClusters = soa::Filtered; - int nEventsRecMC_JE = 0; - void processMCRec_JE(jfilteredCollisions::iterator const& collision, jfilteredMCClusters const& mcclusters, jTrackCandidates const& tracks, soa::Join const& /*caltracks*/, aod::JMcParticles const&, TrackCandidates const&) + void processMCRec_JE(jfilteredCollisions::iterator const& collision, jfilteredMCClusters const& mcclusters, jTrackCandidates const& tracks, soa::Join const&, TrackCandidates const&, aod::JMcParticles const&, BcCandidates const&) { nEventsRecMC_JE++; - if ((nEventsRecMC_JE + 1) % 10000 == 0) { - std::cout << "Processed JE Rec MC Events: " << nEventsRecMC_JE << std::endl; + if (cfgDebug) { + if ((nEventsRecMC_JE + 1) % 10000 == 0) { + std::cout << "Processed JE Rec MC Events: " << nEventsRecMC_JE << std::endl; + } } - histos.fill(HIST("REC_nEvents"), 0.5); + // required cuts if (fabs(collision.posZ()) > cfgVtxCut) return; if (!collision.sel8()) @@ -422,30 +626,84 @@ struct statPromptPhoton { histos.fill(HIST("REC_nEvents"), 1.5); - if (!collision.isEmcalReadout()) - return; - + if (cfgEmcTrigger) { + if (!collision.isEmcalReadout()) + return; + } histos.fill(HIST("REC_nEvents"), 2.5); + bool noTrk = true; + for (auto& track : tracks) { + auto ogtrack = track.track_as(); + if (!trackSelection(ogtrack)) { + continue; + } + if (!ogtrack.isGlobalTrack()) { + continue; + } + noTrk = false; + break; + } + + if (noTrk) + return; + // now we do clusters bool clustertrigger = false; for (auto& mccluster : mcclusters) { - histos.fill(HIST("REC_M02_BC"), mccluster.energy()); - if (mccluster.m02() < 0.1) + histos.fill(HIST("REC_M02_BC"), mccluster.m02()); + if (mccluster.m02() < cfgLowM02) + continue; + if (mccluster.m02() > cfgHighM02) continue; + if (mccluster.energy() < cfgLowClusterE) + continue; + if (mccluster.energy() > cfgHighClusterE) + continue; + if (fabs(mccluster.eta()) > cfgtrkMaxEta) + continue; + histos.fill(HIST("REC_Cluster_QA"), 0.5); - histos.fill(HIST("REC_M02_AC"), mccluster.energy()); + histos.fill(HIST("REC_M02_AC"), mccluster.m02()); histos.fill(HIST("REC_All_Energy"), mccluster.energy()); - bool photontrigger = false; // is a neutral cluster - bool vetotrigger = false; // might be a neutral cluster - bool chargetrigger = false; // is definitely not a neutral cluster - double photonPt = 0.0; + histos.fill(HIST("REC_ClusterPhi"), mccluster.phi()); + histos.fill(HIST("REC_ClusterEta"), mccluster.eta()); + + bool photontrigger = false; // is a neutral cluster + bool chargetrigger = false; // is definitely not a neutral cluster + // double photonPt = 0.0; double truephotonPt = 0.0; auto tracksofcluster = mccluster.matchedTracks_as>(); + /////////////// + /////////////// + /////////////// + + double phiPrimeC = mccluster.phi(); + phiPrimeC = phiPrimeC + TMath::Pi() / 18.; + phiPrimeC = fmod(phiPrimeC, 2 * TMath::Pi() / 18.); + double ptC = mccluster.energy(); + bool geocut = false; + histos.fill(HIST("REC_Cluster_PhiPrime_Pt"), phiPrimeC, mccluster.energy()); + if (phiPrimeC > (0.12 / ptC + TMath::Pi() / 18. + 0.035) || + phiPrimeC < (0.1 / ptC / ptC + TMath::Pi() / 18. - 0.025)) { + geocut = false; + } else { + geocut = true; + } + + if (cfgGeoCut) { + if (geocut) { + histos.fill(HIST("REC_Cluster_PhiPrime_Pt_C"), phiPrimeC, mccluster.energy()); + continue; + } + } + + histos.fill(HIST("REC_Cluster_PhiPrime_Pt_AC"), phiPrimeC, mccluster.energy()); + // first, we check if veto is required double sumptT = 0; - double sumptTAC = 0; + bool clusterqa = false; for (auto& ctrack : tracksofcluster) { auto ogtrack = ctrack.track_as(); if (!trackSelection(ogtrack)) { @@ -455,104 +713,221 @@ struct statPromptPhoton { continue; } + // bool nodoublecount = false; + double etaT = ogtrack.trackEtaEmcal(); + double etaC = mccluster.eta(); + double phiT = ogtrack.trackPhiEmcal(); + double phiC = mccluster.phi(); double ptT = ctrack.pt(); - sumptT += ptT; - double phidiff = TVector2::Phi_mpi_pi(mccluster.phi() - ctrack.phi()); - double etadiff = mccluster.eta() - ctrack.eta(); + bool etatrigger = false; + bool phitrigger = false; + double phidiff = TVector2::Phi_mpi_pi(mccluster.phi() - ogtrack.phi()); + double etadiff = mccluster.eta() - ogtrack.eta(); + + if (cfgPtClusterCut) { + if (fabs(etaT - etaC) < (0.010 + pow(ptT + 4.07, -2.5))) { + etatrigger = true; + } + + if (fabs(TVector2::Phi_mpi_pi(phiT - phiC)) < (0.015 + pow(ptT + 3.65, -2.0))) { + phitrigger = true; + } + } else { + if (fabs(etadiff) < 0.05) { + etatrigger = true; + } + + if (fabs(phidiff) < 0.05) { + phitrigger = true; + } + } + + if (etatrigger && phitrigger) { + chargetrigger = true; + sumptT += ptT; + } + if (chargetrigger) { + if (!clusterqa) { + histos.fill(HIST("REC_Cluster_QA"), 1.5); + clusterqa = true; + } + } histos.fill(HIST("REC_Track_v_Cluster_Phi"), phidiff); histos.fill(HIST("REC_Track_v_Cluster_Eta"), etadiff); - } - if (sumptT > 0) { + histos.fill(HIST("REC_Track_v_Cluster_Phi_Eta"), phidiff, etadiff); + + } // track of cluster loop + + if (chargetrigger && sumptT > 0) { double mccluster_over_sumptT = mccluster.energy() / sumptT; histos.fill(HIST("REC_SumPt_BC"), mccluster_over_sumptT); if (mccluster_over_sumptT < 1.7) { - histos.fill(HIST("REC_Cluster_QA"), 2.5); - vetotrigger = true; + histos.fill(HIST("REC_Cluster_QA"), 2.5); // veto fails, cluster is charged } else { - photontrigger = true; - histos.fill(HIST("REC_Cluster_QA"), 1.5); + histos.fill(HIST("REC_Cluster_QA"), 3.5); // veto is good, cluster is converted to neutral cluster + // chargetrigger = false; + histos.fill(HIST("REC_SumPt_AC"), mccluster_over_sumptT); } - } else { + } // sumptT check + + if (!chargetrigger) { photontrigger = true; } - // veto is required - if (vetotrigger) { - for (auto& ctrack : tracksofcluster) { - auto ogtrack = ctrack.track_as(); - if (!trackSelection(ogtrack)) { - continue; - } - if (!ogtrack.isGlobalTrack()) { - continue; - } + /////////////// + /////////////// + /////////////// - double etaT = ctrack.eta(); - double etaC = mccluster.eta(); - double phiT = ctrack.phi(); - double phiC = mccluster.phi(); - double ptT = ctrack.pt(); + // check if cluster is good + for (auto& ctrack : tracksofcluster) { - if (fabs(etaT - etaC) < (0.010 + pow(ptT + 4.07, -2.5))) { - chargetrigger = true; - } - if (fabs(TVector2::Phi_mpi_pi(phiT - phiC)) < (0.015 + pow(ptT + 3.65, -2.0))) { - chargetrigger = true; - } - if (chargetrigger) { - histos.fill(HIST("REC_Cluster_QA"), 3.5); - break; - } - } // tracks - } // veto + auto ogtrack = ctrack.track_as(); + if (!trackSelection(ogtrack)) { + continue; + } + if (!ogtrack.isGlobalTrack()) { + continue; + } + bool etatrigger = false; + bool phitrigger = false; + // double ptT = ctrack.pt(); + double phidiff = TVector2::Phi_mpi_pi(mccluster.phi() - ogtrack.phi()); + double etadiff = mccluster.eta() - ogtrack.eta(); + if (fabs(etadiff) < 0.05) { + etatrigger = true; + } - // check if cluster is good - if (!chargetrigger) { - for (auto& ctrack : tracksofcluster) { - auto ogtrack = ctrack.track_as(); - if (!trackSelection(ogtrack)) { - continue; - } - if (!ogtrack.isGlobalTrack()) { - continue; - } + if (fabs(phidiff) < 0.05) { + phitrigger = true; + } - double ptT = ctrack.pt(); - sumptTAC += ptT; - double phidiff = TVector2::Phi_mpi_pi(mccluster.phi() - ctrack.phi()); - double etadiff = mccluster.eta() - ctrack.eta(); + if (chargetrigger) { + histos.fill(HIST("REC_Track_v_Cluster_Phi_C"), phidiff); + histos.fill(HIST("REC_Track_v_Cluster_Eta_C"), etadiff); + histos.fill(HIST("REC_Track_v_Cluster_Phi_Eta_C"), phidiff, etadiff); + } else { + if ((etatrigger || phitrigger) && chargetrigger) { + if (cfgDebug) { + std::cout << "????????????????????" << std::endl; + } + } histos.fill(HIST("REC_Track_v_Cluster_Phi_AC"), phidiff); histos.fill(HIST("REC_Track_v_Cluster_Eta_AC"), etadiff); - } // tracks - - if (sumptTAC > 0) { - double mccluster_over_sumptTAC = mccluster.energy() / sumptTAC; - histos.fill(HIST("REC_SumPt_AC"), mccluster_over_sumptTAC); + histos.fill(HIST("REC_Track_v_Cluster_Phi_Eta_AC"), phidiff, etadiff); } + } // tracks - photontrigger = true; - } // check if there is no charge trigger + /////////////// + /////////////// + /////////////// if (photontrigger) { // if no charge trigger, cluster is good! histos.fill(HIST("REC_Cluster_QA"), 4.5); clustertrigger = true; double pthadsum = GetPtHadSum(tracks, mccluster, cfgMinR, cfgMaxR, false, false, true); - histos.fill(HIST("REC_Trigger_V_PtHadSum_Photon"), photonPt, pthadsum); + histos.fill(HIST("REC_Trigger_V_PtHadSum_Photon"), mccluster.energy(), pthadsum); histos.fill(HIST("REC_PtHadSum_Photon"), pthadsum); histos.fill(HIST("REC_Trigger_Energy"), mccluster.energy()); } - // now we check the realness of our prompt photons auto ClusterParticles = mccluster.mcParticles_as(); + + // now we check the realness of our prompt photons bool goodgentrigger = true; + double chPe = 0; for (auto& clusterparticle : ClusterParticles) { - if (clusterparticle.pdgCode() == 211 || clusterparticle.pdgCode() == 321 || clusterparticle.pdgCode() == 2212) { - goodgentrigger = false; + // double etaP = clusterparticle.eta(); + // double etaC = mccluster.eta(); + // double phiP = clusterparticle.phi(); + // double phiC = mccluster.phi(); + // double ptP = clusterparticle.pt(); + int cindex = clusterparticle.globalIndex(); + double pdgcode = fabs(clusterparticle.pdgCode()); + if (!clusterparticle.isPhysicalPrimary()) { + continue; } + if (pdgcode == 211 || pdgcode == 321 || pdgcode == 2212 || pdgcode == 11) { + bool notrack = true; + histos.fill(HIST("REC_Cluster_Particle_Pt"), clusterparticle.pt()); + + double phiPrimeP = clusterparticle.phi(); + if (clusterparticle.pdgCode() < 0) { + phiPrimeP = 2 * TMath::Pi() - phiPrimeP; + } + phiPrimeP = phiPrimeP + TMath::Pi() / 18.; + phiPrimeP = fmod(phiPrimeP, 2 * TMath::Pi() / 18.); + double ptP = clusterparticle.pt(); + for (auto& track : tracks) { + if (!track.has_mcParticle()) + continue; + auto ogtrack = track.track_as(); + if (!trackSelection(ogtrack)) { + continue; + } + if (!ogtrack.isGlobalTrack()) { + continue; + } + + int tindex = track.mcParticleId(); + if (tindex == cindex) { + histos.fill(HIST("REC_Cluster_ParticleWITHtrack_Pt"), clusterparticle.pt()); + histos.fill(HIST("REC_Cluster_ParticleWITHtrack_Phi"), clusterparticle.phi()); + histos.fill(HIST("REC_Cluster_ParticleWITHtrack_Eta"), clusterparticle.eta()); + histos.fill(HIST("REC_Cluster_ParticleWITHtrack_Pt_Phi"), clusterparticle.pt(), clusterparticle.phi()); + // if (phiPrimeP > (0.12/ptP + TMath::Pi()/18. + 0.035) || + // phiPrimeP < (0.1/ptP/ptP + TMath::Pi()/18. - 0.025) ) { + histos.fill(HIST("REC_Cluster_ParticleWITHtrack_Pt_PhiPrime"), ptP, phiPrimeP); + if (photontrigger) { + histos.fill(HIST("REC_Impurity_ParticleWITHtrack_Pt_PhiPrime"), ptP, phiPrimeP); + } + // }//geo cut + histos.fill(HIST("REC_Cluster_ParticleWITHtrack_Pt_Eta"), clusterparticle.pt(), clusterparticle.eta()); + + histos.fill(HIST("REC_Cluster_ParticleWITHtrack_TrackPt"), track.pt()); + notrack = false; + break; + } + } // track loop + + if (notrack) { + histos.fill(HIST("REC_Cluster_ParticleWITHOUTtrack_Pt"), clusterparticle.pt()); + histos.fill(HIST("REC_Cluster_ParticleWITHOUTtrack_Phi"), clusterparticle.phi()); + histos.fill(HIST("REC_Cluster_ParticleWITHOUTtrack_Eta"), clusterparticle.eta()); + histos.fill(HIST("REC_Cluster_ParticleWITHOUTtrack_Pt_Phi"), clusterparticle.pt(), clusterparticle.phi()); + // if (phiPrimeP > (0.12/ptP + TMath::Pi()/18. + 0.035) || + // phiPrimeP < (0.1/ptP/ptP + TMath::Pi()/18. - 0.025) ) { + histos.fill(HIST("REC_Cluster_ParticleWITHOUTtrack_Pt_PhiPrime"), ptP, phiPrimeP); + if (photontrigger) { + histos.fill(HIST("REC_Impurity_ParticleWITHOUTtrack_Pt_PhiPrime"), ptP, phiPrimeP); + } + // }//geo cut + histos.fill(HIST("REC_Cluster_ParticleWITHOUTtrack_Pt_Eta"), clusterparticle.pt(), clusterparticle.eta()); + } + } // pdg code check + double phidiff = TVector2::Phi_mpi_pi(mccluster.phi() - clusterparticle.phi()); double etadiff = mccluster.eta() - clusterparticle.eta(); + + if (pdgcode == 211 || pdgcode == 321 || pdgcode == 2212 || pdgcode == 11) { + if (clusterparticle.e() > 0.01) { + chPe += clusterparticle.e(); + goodgentrigger = false; + if (photontrigger) { + histos.fill(HIST("REC_Impurity_Energy_v_Cluster_Phi"), clusterparticle.e(), phidiff); + histos.fill(HIST("REC_Impurity_Energy_v_ClusterE_Phi"), mccluster.energy(), phidiff); + histos.fill(HIST("REC_Impurity_Energy_v_ClusterEoP_Phi"), mccluster.energy() / clusterparticle.e(), phidiff); + histos.fill(HIST("REC_Impurity_Energy_v_Cluster_Energy"), mccluster.energy(), clusterparticle.e()); + + histos.fill(HIST("REC_TrueImpurity_v_Cluster_Phi"), phidiff); + histos.fill(HIST("REC_TrueImpurity_v_Cluster_PhiAbs"), clusterparticle.phi()); + histos.fill(HIST("REC_TrueImpurity_v_Cluster_Eta"), etadiff); + histos.fill(HIST("REC_TrueImpurity_v_Cluster_EtaAbs"), clusterparticle.eta()); + histos.fill(HIST("REC_TrueImpurity_v_Cluster_Phi_Eta"), phidiff, etadiff); + } + } + } histos.fill(HIST("REC_True_v_Cluster_Phi"), phidiff); histos.fill(HIST("REC_True_v_Cluster_Eta"), etadiff); @@ -561,7 +936,26 @@ struct statPromptPhoton { } if (clusterparticle.pdgCode() == 22) { histos.fill(HIST("REC_True_Trigger_Energy"), clusterparticle.e()); - if (std::abs(clusterparticle.getGenStatusCode()) > 19 && std::abs(clusterparticle.getGenStatusCode()) < 70) { + int mom1 = 0; + int mom2 = 0; + for (auto& photon_mom : clusterparticle.mothers_as()) { + if (mom1 == 0) { + mom1 = photon_mom.pdgCode(); + } + if (mom1 != 0) { + mom2 = photon_mom.pdgCode(); + } + } + if (std::fabs(mom1) > 40 && std::fabs(mom1) > 0) + continue; + + if (cfgDebug) { + std::cout << "We have a REC prompt photon" << std::endl; + std::cout << "Photon gen status code: " << clusterparticle.getGenStatusCode() << std::endl; + std::cout << "Photon mom 1: " << mom1 << std::endl; + std::cout << "Photon mom 2: " << mom2 << std::endl; + } + if (std::abs(clusterparticle.getGenStatusCode()) > 19 && std::abs(clusterparticle.getGenStatusCode()) < 90) { histos.fill(HIST("REC_True_Prompt_Trigger_Energy"), clusterparticle.e()); TLorentzVector lRealPhoton; lRealPhoton.SetPxPyPzE(clusterparticle.px(), clusterparticle.py(), clusterparticle.pz(), clusterparticle.e()); @@ -571,20 +965,66 @@ struct statPromptPhoton { } } // photon check } // clusterparticle loop + + if (cfgDebug) { + if (chPe > 0) { + if (photontrigger) { + if (chPe / mccluster.energy() < 0.50) { + goodgentrigger = true; + } + } + } + } if (goodgentrigger && photontrigger) { histos.fill(HIST("REC_Trigger_Purity"), 0.5); histos.fill(HIST("REC_Trigger_Energy_GOOD"), mccluster.energy()); + histos.fill(HIST("REC_Trigger_Purity_v_Energy"), 0.5, mccluster.energy()); } if (goodgentrigger && !photontrigger) { histos.fill(HIST("REC_Trigger_Purity"), 1.5); histos.fill(HIST("REC_Trigger_Energy_MISS"), mccluster.energy()); + histos.fill(HIST("REC_Trigger_Purity_v_Energy"), 1.5, mccluster.energy()); } if (!goodgentrigger && photontrigger) { histos.fill(HIST("REC_Trigger_Purity"), 2.5); histos.fill(HIST("REC_Trigger_Energy_FAKE"), mccluster.energy()); + histos.fill(HIST("REC_Trigger_Purity_v_Energy"), 2.5, mccluster.energy()); } } // cluster loop + // auto bc = collision.bc_as(); + // int rnr = bc.runNumber(); + + // std::string rnrstring = std::to_string(rnr); + // if (runs.find(rnrstring) == std::string::npos) { + // std::cout<<"++++++++++++++++++++++++++++++++"<getForTimeStamp(ccdbpath, bc.timestamp()); + // if(grpmag) { + // bfield = std::lround(5.f * grpmag->getL3Current() / 30000.f); + // std::cout<<"++++++++++++++++++++++++++++++++"<getForTimeStamp(ccdbpath, bc.timestamp()); + // if(!grpo) { + // std::cout<<"WE CAN NEITHER FETCH GRPMAG OR GRPO!!! SHIT IS SCREWED"<getNominalL3Field(); + // } + // bfield = 5; + // runs += rnrstring; + // std::cout << "++++++++++++++++++++++++++++++++" << std::endl; + // std::cout << "Run is now appended to string: " << runs << std::endl; + // std::cout << "++++++++++++++++++++++++++++++++" << std::endl; + + // } // check mag field for current run number: done! + // clusters done, now we do the sternheimer tracks for (auto& track : tracks) { bool sterntrigger = false; @@ -593,6 +1033,31 @@ struct statPromptPhoton { if (!trackSelection(ogtrack)) { continue; } + if (!ogtrack.isGlobalTrack()) { + continue; + } + + // Do stuff with geometric cuts + double phiPrime = track.phi(); + if (track.sign() < 0) { + phiPrime = 2 * TMath::Pi() - phiPrime; + } + + // if (bfield < 0) { + // phiPrime = 2 * TMath::Pi() - phiPrime; + // } + + phiPrime = phiPrime + TMath::Pi() / 18.; + phiPrime = fmod(phiPrime, 2 * TMath::Pi() / 18.); + // double pt = track.pt(); + // if (phiPrime > (0.12/pt + TMath::Pi()/18. + 0.035) || + // phiPrime < (0.1/pt/pt + TMath::Pi()/18. - 0.025) ) { + histos.fill(HIST("REC_Track_PhiPrime_Pt"), phiPrime, track.pt()); + // }//geo cut + // Done with geometric cuts + + histos.fill(HIST("REC_Track_Pt"), track.pt()); + histos.fill(HIST("REC_Track_Phi"), track.phi()); if (clustertrigger) { histos.fill(HIST("REC_TrackPhi_photontrigger"), track.phi()); histos.fill(HIST("REC_TrackEta_photontrigger"), track.eta()); @@ -623,6 +1088,258 @@ struct statPromptPhoton { PROCESS_SWITCH(statPromptPhoton, processMCRec_JE, "processJE MC data", false); + int nEventsData = 0; + void processData(jfilteredCollisions::iterator const& collision, jfilteredClusters const& clusters, jDataTrackCandidates const& tracks, soa::Join const&, TrackCandidates const&, BcCandidates const&) + { + + nEventsData++; + if (cfgDebug) { + if (nEventsData == 1) { + std::cout << "Starting Data Processing: " << nEventsData << std::endl; + } + if ((nEventsData + 1) % 10000 == 0) { + std::cout << "Processed Data Events: " << nEventsData << std::endl; + } + } + histos.fill(HIST("DATA_nEvents"), 0.5); + + // required cuts + if (fabs(collision.posZ()) > cfgVtxCut) + return; + if (!collision.sel8()) + return; + + histos.fill(HIST("DATA_nEvents"), 1.5); + + if (cfgEmcTrigger) { + if (!collision.isEmcalReadout()) + return; + } + histos.fill(HIST("DATA_nEvents"), 2.5); + + bool noTrk = true; + for (auto& track : tracks) { + auto ogtrack = track.track_as(); + if (!trackSelection(ogtrack)) { + continue; + } + if (!ogtrack.isGlobalTrack()) { + continue; + } + noTrk = false; + break; + } + + if (noTrk) + return; + + // now we do clusters + bool clustertrigger = false; + for (auto& cluster : clusters) { + histos.fill(HIST("DATA_M02_BC"), cluster.m02()); + if (cluster.m02() < cfgLowM02) + continue; + if (cluster.m02() > cfgHighM02) + continue; + if (cluster.energy() < cfgLowClusterE) + continue; + if (cluster.energy() > cfgHighClusterE) + continue; + if (fabs(cluster.eta()) > cfgtrkMaxEta) + continue; + + histos.fill(HIST("DATA_Cluster_QA"), 0.5); + histos.fill(HIST("DATA_M02_AC"), cluster.m02()); + histos.fill(HIST("DATA_All_Energy"), cluster.energy()); + histos.fill(HIST("DATA_ClusterPhi"), cluster.phi()); + histos.fill(HIST("DATA_ClusterEta"), cluster.eta()); + + bool photontrigger = false; // is a neutral cluster + bool chargetrigger = false; // is definitely not a neutral cluster + auto tracksofcluster = cluster.matchedTracks_as>(); + + ///*GEOMETRICAL CUT*/// + + double phiPrimeC = cluster.phi(); + phiPrimeC = phiPrimeC + TMath::Pi() / 18.; + phiPrimeC = fmod(phiPrimeC, 2 * TMath::Pi() / 18.); + double ptC = cluster.energy(); + bool geocut = false; + histos.fill(HIST("DATA_Cluster_PhiPrime_Pt"), phiPrimeC, cluster.energy()); + if (phiPrimeC > (0.12 / ptC + TMath::Pi() / 18. + 0.035) || + phiPrimeC < (0.1 / ptC / ptC + TMath::Pi() / 18. - 0.025)) { + geocut = false; + } else { + geocut = true; + } + + if (cfgGeoCut) { + if (geocut) { + histos.fill(HIST("DATA_Cluster_PhiPrime_Pt_C"), phiPrimeC, cluster.energy()); + continue; + } + } + + histos.fill(HIST("DATA_Cluster_PhiPrime_Pt_AC"), phiPrimeC, cluster.energy()); + + ///*GEOMETRICAL CUT*/// + + ///*CHECK FOR PHOTON CANDIDATE*/// + + // first, we check if veto is required + double sumptT = 0; + bool clusterqa = false; + for (auto& ctrack : tracksofcluster) { + auto ogtrack = ctrack.track_as(); + if (!trackSelection(ogtrack)) { + continue; + } + if (!ogtrack.isGlobalTrack()) { + continue; + } + + double etaT = ogtrack.trackEtaEmcal(); + double etaC = cluster.eta(); + double phiT = ogtrack.trackPhiEmcal(); + double phiC = cluster.phi(); + double ptT = ctrack.pt(); + bool etatrigger = false; + bool phitrigger = false; + double phidiff = TVector2::Phi_mpi_pi(cluster.phi() - ogtrack.phi()); + double etadiff = cluster.eta() - ogtrack.eta(); + if (cfgPtClusterCut) { + if (fabs(etaT - etaC) < (0.010 + pow(ptT + 4.07, -2.5))) { + etatrigger = true; + } + + if (fabs(TVector2::Phi_mpi_pi(phiT - phiC)) < (0.015 + pow(ptT + 3.65, -2.0))) { + phitrigger = true; + } + } else { + if (fabs(etadiff) < 0.05) { + etatrigger = true; + } + + if (fabs(phidiff) < 0.05) { + phitrigger = true; + } + } + + if (etatrigger && phitrigger) { + chargetrigger = true; + sumptT += ptT; + } + if (chargetrigger) { + if (!clusterqa) { + histos.fill(HIST("DATA_Cluster_QA"), 1.5); + clusterqa = true; + } + } + histos.fill(HIST("DATA_Track_v_Cluster_Phi"), phidiff); + histos.fill(HIST("DATA_Track_v_Cluster_Eta"), etadiff); + histos.fill(HIST("DATA_Track_v_Cluster_Phi_Eta"), phidiff, etadiff); + + } // track of cluster loop + + if (chargetrigger && sumptT > 0) { + double cluster_over_sumptT = cluster.energy() / sumptT; + histos.fill(HIST("DATA_SumPt_BC"), cluster_over_sumptT); + if (cluster_over_sumptT < 1.7) { + histos.fill(HIST("DATA_Cluster_QA"), 2.5); // veto fails, cluster is charged + } else { + histos.fill(HIST("DATA_Cluster_QA"), 3.5); // veto is good, cluster is converted to neutral cluster + chargetrigger = false; + histos.fill(HIST("DATA_SumPt_AC"), cluster_over_sumptT); + } + } // sumptT check + + if (!chargetrigger) { + photontrigger = true; + } + + ///*CHECK FOR PHOTON CANDIDATE*/// + + ///*CALCULATE PTHAD SUM*/// + + if (photontrigger) { // if no charge trigger, cluster is good! + histos.fill(HIST("DATA_Cluster_QA"), 4.5); + clustertrigger = true; + double pthadsum = GetPtHadSum(tracks, cluster, cfgMinR, cfgMaxR, false, false, true); + histos.fill(HIST("DATA_Trigger_V_PtHadSum_Photon"), cluster.energy(), pthadsum); + histos.fill(HIST("DATA_PtHadSum_Photon"), pthadsum); + histos.fill(HIST("DATA_Trigger_Energy"), cluster.energy()); + } + + ///*CALCULATE PTHAD SUM*/// + + } // cluster loop + + ///*CALCULATE STERNHEIMER*/// + + for (auto& track : tracks) { + bool sterntrigger = false; + double sternPt = 0.0; + auto ogtrack = track.track_as(); + if (!trackSelection(ogtrack)) { + continue; + } + if (!ogtrack.isGlobalTrack()) { + continue; + } + + // Do stuff with geometric cuts + double phiPrime = track.phi(); + if (track.sign() < 0) { + phiPrime = 2 * TMath::Pi() - phiPrime; + } + + // if (bfield < 0) { + // phiPrime = 2 * TMath::Pi() - phiPrime; + // } + + phiPrime = phiPrime + TMath::Pi() / 18.; + phiPrime = fmod(phiPrime, 2 * TMath::Pi() / 18.); + double pt = track.pt(); + if (phiPrime > (0.12 / pt + TMath::Pi() / 18. + 0.035) || + phiPrime < (0.1 / pt / pt + TMath::Pi() / 18. - 0.025)) { + histos.fill(HIST("DATA_Track_PhiPrime_Pt"), phiPrime, track.pt()); + } // geo cut + // Done with geometric cuts + + histos.fill(HIST("DATA_Track_Pt"), track.pt()); + histos.fill(HIST("DATA_Track_Phi"), track.phi()); + if (clustertrigger) { + histos.fill(HIST("DATA_TrackPhi_photontrigger"), track.phi()); + histos.fill(HIST("DATA_TrackEta_photontrigger"), track.eta()); + } + if (track.pt() > cfgMinTrig && track.pt() < cfgMaxTrig) { + if (fabs(track.eta()) <= cfgtrkMaxEta) { + sterntrigger = true; + sternPt = track.pt(); + } + } + + if (sterntrigger) { + bool doStern = true; + double sterncount = 1.0; + while (doStern) { + double pthadsum = GetPtHadSum(tracks, track, cfgMinR, cfgMaxR, true, false, true); + histos.fill(HIST("DATA_Trigger_V_PtHadSum_Stern"), sterncount, pthadsum, 2.0 / sternPt); + if (sterncount < sternPt) { + sterncount++; + } else { + doStern = false; + } + } // While sternin' + } // stern trigger loop + } // track loop + + ///*CALCULATE STERNHEIMER*/// + + } // end of process + + PROCESS_SWITCH(statPromptPhoton, processData, "processJE data", false); + }; // end of main struct WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 3a76794acf43d084df9f95c1bb424246c757e496 Mon Sep 17 00:00:00 2001 From: choich08365 <157435123+choich08365@users.noreply.github.com> Date: Tue, 18 Feb 2025 21:38:51 +0900 Subject: [PATCH 0290/1650] [PWGJE] Added analysis code for b-jet tagging using GNN (bjetTaggingGNN.cxx) (#9905) Co-authored-by: Changhwan Choi Co-authored-by: ALICE Action Bot --- PWGJE/Tasks/CMakeLists.txt | 4 + PWGJE/Tasks/bjetTaggingGNN.cxx | 503 +++++++++++++++++++++++++++++++++ 2 files changed, 507 insertions(+) create mode 100644 PWGJE/Tasks/bjetTaggingGNN.cxx diff --git a/PWGJE/Tasks/CMakeLists.txt b/PWGJE/Tasks/CMakeLists.txt index a3e6be92270..7d9fae0b221 100644 --- a/PWGJE/Tasks/CMakeLists.txt +++ b/PWGJE/Tasks/CMakeLists.txt @@ -260,4 +260,8 @@ if(FastJet_FOUND) SOURCES dijetFinderQA.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(bjet-tagging-gnn + SOURCES bjetTaggingGNN.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore + COMPONENT_NAME Analysis) endif() \ No newline at end of file diff --git a/PWGJE/Tasks/bjetTaggingGNN.cxx b/PWGJE/Tasks/bjetTaggingGNN.cxx new file mode 100644 index 00000000000..a3e453435db --- /dev/null +++ b/PWGJE/Tasks/bjetTaggingGNN.cxx @@ -0,0 +1,503 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file bjetTaggingGNN.cxx +/// \brief b-jet tagging using GNN +/// +/// \author Changhwan Choi , Pusan National University + +#include +#include +#include +#include + +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/ASoA.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/runDataProcessing.h" +#include "PWGJE/Core/JetUtilities.h" +#include "PWGJE/Core/JetDerivedDataUtilities.h" +#include "PWGJE/Core/JetTaggingUtilities.h" +#include "PWGJE/DataModel/JetTagging.h" +#include "PWGJE/DataModel/Jet.h" + +#include "Common/Core/trackUtilities.h" +#include "Common/Core/TrackSelection.h" +#include "Common/Core/TrackSelectionDefaults.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/Core/RecoDecay.h" + +#include "Framework/Logger.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +struct BjetTaggingGNN { + + HistogramRegistry registry; + + // event level configurables + Configurable vertexZCut{"vertexZCut", 10.0f, "Accepted z-vertex range"}; + Configurable eventSelections{"eventSelections", "sel8", "choose event selection"}; + Configurable useEventWeight{"useEventWeight", true, "Flag whether to scale histograms with the event weight"}; + + Configurable pTHatMaxMCD{"pTHatMaxMCD", 999.0, "maximum fraction of hard scattering for jet acceptance in detector MC"}; + Configurable pTHatMaxMCP{"pTHatMaxMCP", 999.0, "maximum fraction of hard scattering for jet acceptance in particle MC"}; + Configurable pTHatExponent{"pTHatExponent", 6.0, "exponent of the event weight for the calculation of pTHat"}; + + // track level configurables + Configurable trackPtMin{"trackPtMin", 0.5, "minimum track pT"}; + Configurable trackPtMax{"trackPtMax", 1000.0, "maximum track pT"}; + Configurable trackEtaMin{"trackEtaMin", -0.9, "minimum track eta"}; + Configurable trackEtaMax{"trackEtaMax", 0.9, "maximum track eta"}; + + Configurable trackNppCrit{"trackNppCrit", 0.95, "track not physical primary ratio"}; + + // track level configurables + Configurable svPtMin{"svPtMin", 0.5, "minimum SV pT"}; + + // Configurable prongsigmaLxyMax{"prongsigmaLxyMax", 100, "maximum sigma of decay length of prongs on xy plane"}; + // // Configurable prongsigmaLxyzMax{"prongsigmaLxyzMax", 100, "maximum sigma of decay length of prongs on xyz plane"}; + // Configurable prongIPxyMin{"prongIPxyMin", 0.008, "minimum impact paramter of prongs on xy plane [cm]"}; + // Configurable prongIPxyMax{"prongIPxyMax", 1, "maximum impact parmeter of prongs on xy plane [cm]"}; + // Configurable prongChi2PCAMin{"prongChi2PCAMin", 4, "minimum Chi2 PCA of decay length of prongs"}; + // Configurable prongChi2PCAMax{"prongChi2PCAMax", 100, "maximum Chi2 PCA of decay length of prongs"}; + + // jet level configurables + Configurable jetPtMin{"jetPtMin", 5.0, "minimum jet pT"}; + Configurable jetPtMax{"jetPtMax", 1000.0, "maximum jet pT"}; + Configurable jetEtaMin{"jetEtaMin", -99.0, "minimum jet pseudorapidity"}; + Configurable jetEtaMax{"jetEtaMax", 99.0, "maximum jet pseudorapidity"}; + + Configurable> jetRadii{"jetRadii", std::vector{0.4}, "jet resolution parameters"}; + + Configurable doDataDriven{"doDataDriven", false, "Flag whether to use fill THnSpase for data driven methods"}; + + std::vector eventSelectionBits; + + std::vector jetRadiiValues; + + void init(InitContext const&) + { + jetRadiiValues = (std::vector)jetRadii; + + eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast(eventSelections)); + + registry.add("h_vertexZ", "Vertex Z;#it{Z} (cm)", {HistType::kTH1F, {{40, -20.0, 20.0}}}); + + const AxisSpec axisJetpT{200, 0., 200., "#it{p}_{T} (GeV/#it{c})"}; + const AxisSpec axisDb{200, -10., 20., "#it{D}_{b}"}; + const AxisSpec axisDbFine{3000, -10., 20., "#it{D}_{b}"}; + const AxisSpec axisSVMass{200, 0., 10., "#it{m}_{SV} (GeV/#it{c}^{2})"}; + const AxisSpec axisSVEnergy{200, 0., 100., "#it{E}_{SV} (GeV)"}; + const AxisSpec axisSLxy{200, 0., 100., "#it{SL}_{xy}"}; + const AxisSpec axisJetMass{200, 0., 50., "#it{m}_{jet} (GeV/#it{c}^{2})"}; + const AxisSpec axisJetProb{200, 0., 40., "-ln(JP)"}; + const AxisSpec axisNTracks{42, 0, 42, "#it{n}_{tracks}"}; + + registry.add("h_jetpT", "", {HistType::kTH1F, {axisJetpT}}); + registry.add("h_Db", "", {HistType::kTH1F, {axisDbFine}}); + registry.add("h2_jetpT_Db", "", {HistType::kTH2F, {axisJetpT, axisDb}}); + registry.add("h2_jetpT_SVMass", "", {HistType::kTH2F, {axisJetpT, axisSVMass}}); + registry.add("h2_jetpT_SVEnergy", "", {HistType::kTH2F, {axisJetpT, axisSVEnergy}}); + registry.add("h2_jetpT_SLxy", "", {HistType::kTH2F, {axisJetpT, axisSLxy}}); + registry.add("h2_jetpT_jetMass", "", {HistType::kTH2F, {axisJetpT, axisJetMass}}); + registry.add("h2_jetpT_jetProb", "", {HistType::kTH2F, {axisJetpT, axisJetProb}}); + registry.add("h2_jetpT_nTracks", "", {HistType::kTH2F, {axisJetpT, axisNTracks}}); + + registry.add("h3_jetpT_nTracks_Db", "", {HistType::kTH3F, {axisJetpT, axisNTracks, axisDb}}); + registry.add("h3_mSV_eSV_slXY", ";m_{SV};E_{SV};SL_{XY}", {HistType::kTH3F, {{110, -2., 20.}, {110, -2., 20.}, {102, -2., 100.}}}); + + if (doprocessMCJets) { + registry.add("h_jetpT_b", "b-jet", {HistType::kTH1F, {axisJetpT}}); + registry.add("h_jetpT_c", "c-jet", {HistType::kTH1F, {axisJetpT}}); + registry.add("h_jetpT_lf", "lf-jet", {HistType::kTH1F, {axisJetpT}}); + registry.add("h_Db_b", "b-jet", {HistType::kTH1F, {axisDbFine}}); + registry.add("h_Db_c", "c-jet", {HistType::kTH1F, {axisDbFine}}); + registry.add("h_Db_lf", "lf-jet", {HistType::kTH1F, {axisDbFine}}); + registry.add("h2_jetpT_Db_b", "b-jet", {HistType::kTH2F, {axisJetpT, axisDb}}); + registry.add("h2_jetpT_Db_c", "c-jet", {HistType::kTH2F, {axisJetpT, axisDb}}); + registry.add("h2_jetpT_Db_lf", "lf-jet", {HistType::kTH2F, {axisJetpT, axisDb}}); + registry.add("h2_jetpT_SVMass_b", "b-jet", {HistType::kTH2F, {axisJetpT, axisSVMass}}); + registry.add("h2_jetpT_SVMass_c", "c-jet", {HistType::kTH2F, {axisJetpT, axisSVMass}}); + registry.add("h2_jetpT_SVMass_lf", "lf-jet", {HistType::kTH2F, {axisJetpT, axisSVMass}}); + registry.add("h2_jetpT_SVEnergy_b", "b-jet", {HistType::kTH2F, {axisJetpT, axisSVEnergy}}); + registry.add("h2_jetpT_SVEnergy_c", "c-jet", {HistType::kTH2F, {axisJetpT, axisSVEnergy}}); + registry.add("h2_jetpT_SVEnergy_lf", "lf-jet", {HistType::kTH2F, {axisJetpT, axisSVEnergy}}); + registry.add("h2_jetpT_SLxy_b", "b-jet", {HistType::kTH2F, {axisJetpT, axisSLxy}}); + registry.add("h2_jetpT_SLxy_c", "c-jet", {HistType::kTH2F, {axisJetpT, axisSLxy}}); + registry.add("h2_jetpT_SLxy_lf", "lf-jet", {HistType::kTH2F, {axisJetpT, axisSLxy}}); + registry.add("h2_jetpT_jetMass_b", "b-jet", {HistType::kTH2F, {axisJetpT, axisJetMass}}); + registry.add("h2_jetpT_jetMass_c", "c-jet", {HistType::kTH2F, {axisJetpT, axisJetMass}}); + registry.add("h2_jetpT_jetMass_lf", "lf-jet", {HistType::kTH2F, {axisJetpT, axisJetMass}}); + registry.add("h2_jetpT_jetProb_b", "b-jet", {HistType::kTH2F, {axisJetpT, axisJetProb}}); + registry.add("h2_jetpT_jetProb_c", "c-jet", {HistType::kTH2F, {axisJetpT, axisJetProb}}); + registry.add("h2_jetpT_jetProb_lf", "lf-jet", {HistType::kTH2F, {axisJetpT, axisJetProb}}); + registry.add("h2_jetpT_nTracks_b", "b-jet", {HistType::kTH2F, {axisJetpT, axisNTracks}}); + registry.add("h2_jetpT_nTracks_c", "c-jet", {HistType::kTH2F, {axisJetpT, axisNTracks}}); + registry.add("h2_jetpT_nTracks_lf", "lf-jet", {HistType::kTH2F, {axisJetpT, axisNTracks}}); + registry.add("h2_Response_DetjetpT_PartjetpT", "", {HistType::kTH2F, {axisJetpT, axisJetpT}}); + registry.add("h2_Response_DetjetpT_PartjetpT_b", "b-jet", {HistType::kTH2F, {axisJetpT, axisJetpT}}); + registry.add("h2_Response_DetjetpT_PartjetpT_c", "c-jet", {HistType::kTH2F, {axisJetpT, axisJetpT}}); + registry.add("h2_Response_DetjetpT_PartjetpT_lf", "lf-jet", {HistType::kTH2F, {axisJetpT, axisJetpT}}); + registry.add("h2_jetpT_Db_lf_none", "lf-jet (none)", {HistType::kTH2F, {axisJetpT, axisDb}}); + registry.add("h2_jetpT_Db_lf_matched", "lf-jet (matched)", {HistType::kTH2F, {axisJetpT, axisDb}}); + registry.add("h2_jetpT_Db_npp", "NotPhysPrim", {HistType::kTH2F, {axisJetpT, axisDb}}); + registry.add("h2_jetpT_Db_npp_b", "NotPhysPrim b-jet", {HistType::kTH2F, {axisJetpT, axisDb}}); + registry.add("h2_jetpT_Db_npp_c", "NotPhysPrim c-jet", {HistType::kTH2F, {axisJetpT, axisDb}}); + registry.add("h2_jetpT_Db_npp_lf", "NotPhysPrim lf-jet", {HistType::kTH2F, {axisJetpT, axisDb}}); + registry.add("h_Db_npp", "NotPhysPrim", {HistType::kTH1F, {axisDbFine}}); + registry.add("h_Db_npp_b", "NotPhysPrim b-jet", {HistType::kTH1F, {axisDbFine}}); + registry.add("h_Db_npp_c", "NotPhysPrim c-jet", {HistType::kTH1F, {axisDbFine}}); + registry.add("h_Db_npp_lf", "NotPhysPrim lf-jet", {HistType::kTH1F, {axisDbFine}}); + } + + if (doprocessMCTruthJets) { + registry.add("h_jetpT_particle", "", {HistType::kTH1F, {axisJetpT}}); + registry.add("h_jetpT_particle_b", "particle b-jet", {HistType::kTH1F, {axisJetpT}}); + registry.add("h_jetpT_particle_c", "particle c-jet", {HistType::kTH1F, {axisJetpT}}); + registry.add("h_jetpT_particle_lf", "particle lf-jet", {HistType::kTH1F, {axisJetpT}}); + } + + if (doDataDriven) { + registry.add("hSparse_Incljets", "", {HistType::kTHnSparseF, {axisJetpT, axisDbFine, axisSVMass, axisJetMass, axisNTracks}}); + if (doprocessMCJets) { + registry.add("hSparse_bjets", "", {HistType::kTHnSparseF, {axisJetpT, axisDbFine, axisSVMass, axisJetMass, axisNTracks}}); + registry.add("hSparse_cjets", "", {HistType::kTHnSparseF, {axisJetpT, axisDbFine, axisSVMass, axisJetMass, axisNTracks}}); + registry.add("hSparse_lfjets", "", {HistType::kTHnSparseF, {axisJetpT, axisDbFine, axisSVMass, axisJetMass, axisNTracks}}); + registry.add("hSparse_lfjets_none", "", {HistType::kTHnSparseF, {axisJetpT, axisDbFine, axisSVMass, axisJetMass, axisNTracks}}); + registry.add("hSparse_lfjets_matched", "", {HistType::kTHnSparseF, {axisJetpT, axisDbFine, axisSVMass, axisJetMass, axisNTracks}}); + } + } + } + + Filter collisionFilter = nabs(aod::jcollision::posZ) < vertexZCut; + Filter trackCuts = (aod::jtrack::pt > trackPtMin && aod::jtrack::pt < trackPtMax && aod::jtrack::eta > trackEtaMin && aod::jtrack::eta < trackEtaMax); + Filter jetFilter = (aod::jet::pt >= jetPtMin && aod::jet::pt <= jetPtMax && aod::jet::eta < jetEtaMax - aod::jet::r / 100.f && aod::jet::eta > jetEtaMin + aod::jet::r / 100.f); + + using FilteredCollision = soa::Filtered>; + using DataJets = soa::Filtered>; + using JetTrackswID = soa::Filtered>; + using JetTracksMCDwID = soa::Filtered>; + using SVTable = aod::DataSecondaryVertex3Prongs; + using MCDSVTable = aod::MCDSecondaryVertex3Prongs; + + template + int analyzeJetTrackInfo(AnyCollision const& /*collision*/, AnalysisJet const& analysisJet, AnyTracks const& /*allTracks*/ /*, int8_t jetFlavor = 0, double weight = 1.0*/) + { + int nTracks = 0; + for (auto& constituent : analysisJet.template tracks_as()) { + + if (constituent.pt() < trackPtMin) { + continue; + } + + // ... + + ++nTracks; + } + return nTracks; + } + + template + SecondaryVertices::iterator analyzeJetSVInfo(AnalysisJet const& analysisJet, SecondaryVertices const& allSVs, bool& checkSV /*, int8_t jetFlavor = 0, double weight = 1.0*/) + { + using SVType = typename SecondaryVertices::iterator; + + auto compare = [](SVType& sv1, SVType& sv2) { + return (sv1.decayLengthXY() / sv1.errorDecayLengthXY()) > (sv2.decayLengthXY() / sv2.errorDecayLengthXY()); + }; + + auto svs = analysisJet.template secondaryVertices_as(); + + std::sort(svs.begin(), svs.end(), compare); + + checkSV = false; + for (const auto& candSV : svs) { + + if (candSV.pt() < svPtMin) { + continue; + } + + checkSV = true; + return candSV; + } + + // No SV found + return *allSVs.begin(); + } + + void processDummy(FilteredCollision::iterator const& /*collision*/) + { + } + PROCESS_SWITCH(BjetTaggingGNN, processDummy, "Dummy process function turned on by default", true); + + void processDataJets(FilteredCollision::iterator const& collision, DataJets const& alljets, JetTrackswID const& allTracks, SVTable const& allSVs) + { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + return; + } + + registry.fill(HIST("h_vertexZ"), collision.posZ()); + + for (const auto& analysisJet : alljets) { + + bool jetIncluded = false; + for (const auto& jetR : jetRadiiValues) { + if (analysisJet.r() == static_cast(jetR * 100)) { + jetIncluded = true; + break; + } + } + + if (!jetIncluded) { + continue; + } + + int nTracks = analyzeJetTrackInfo(collision, analysisJet, allTracks); + + float mSV = -1.f; + float eSV = -1.f; + float slXY = -1.f; + + bool checkSV; + // auto sv = jettaggingutilities::jetFromProngMaxDecayLength(analysisJet, prongChi2PCAMin, prongChi2PCAMax, prongsigmaLxyMax, prongIPxyMin, prongIPxyMax, false, &checkSV); + auto sv = analyzeJetSVInfo(analysisJet, allSVs, checkSV); + + if (checkSV) { + mSV = sv.m(); + eSV = sv.e(); + slXY = sv.decayLengthXY() / sv.errorDecayLengthXY(); + } + + registry.fill(HIST("h_jetpT"), analysisJet.pt()); + registry.fill(HIST("h_Db"), analysisJet.scoreML()); + registry.fill(HIST("h2_jetpT_Db"), analysisJet.pt(), analysisJet.scoreML()); + registry.fill(HIST("h2_jetpT_SVMass"), analysisJet.pt(), mSV); + registry.fill(HIST("h2_jetpT_SVEnergy"), analysisJet.pt(), eSV); + registry.fill(HIST("h2_jetpT_SLxy"), analysisJet.pt(), slXY); + registry.fill(HIST("h2_jetpT_jetMass"), analysisJet.pt(), analysisJet.mass()); + registry.fill(HIST("h2_jetpT_jetProb"), analysisJet.pt(), analysisJet.jetProb()); + registry.fill(HIST("h2_jetpT_nTracks"), analysisJet.pt(), nTracks); + + if (doDataDriven) { + registry.fill(HIST("hSparse_Incljets"), analysisJet.pt(), analysisJet.scoreML(), mSV, analysisJet.mass(), nTracks); + } + } + } + PROCESS_SWITCH(BjetTaggingGNN, processDataJets, "jet information in Data", false); + + using MCDJetTable = soa::Filtered>; + using MCPJetTable = soa::Filtered>; + using FilteredCollisionMCD = soa::Filtered>; + + void processMCJets(FilteredCollisionMCD::iterator const& collision, MCDJetTable const& MCDjets, MCPJetTable const& /*MCPjets*/, JetTracksMCDwID const& allTracks, MCDSVTable const& allSVs, aod::JetParticles const& /*MCParticles*/) + { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + return; + } + + registry.fill(HIST("h_vertexZ"), collision.posZ()); + + for (const auto& analysisJet : MCDjets) { + + bool jetIncluded = false; + for (const auto& jetR : jetRadiiValues) { + if (analysisJet.r() == static_cast(jetR * 100)) { + jetIncluded = true; + break; + } + } + + if (!jetIncluded) { + continue; + } + + float weight = useEventWeight ? analysisJet.eventWeight() : 1.f; + float pTHat = 10. / (std::pow(analysisJet.eventWeight(), 1.0 / pTHatExponent)); + if (analysisJet.pt() > pTHatMaxMCD * pTHat) { + continue; + } + + int8_t jetFlavor = analysisJet.origin(); + + int nTracks = analyzeJetTrackInfo(collision, analysisJet, allTracks /*, jetFlavor, weight*/); + + int nNppTracks = 0; + for (auto& constituent : analysisJet.template tracks_as()) { + if (!constituent.has_mcParticle() || !constituent.template mcParticle_as().isPhysicalPrimary() || constituent.pt() < trackPtMin) { + ++nNppTracks; + } + } + + float mSV = -1.f; + float eSV = -1.f; + float slXY = -1.f; + + bool checkSV; + // auto sv = jettaggingutilities::jetFromProngMaxDecayLength(analysisJet, prongChi2PCAMin, prongChi2PCAMax, prongsigmaLxyMax, prongIPxyMin, prongIPxyMax, false, &checkSV); + auto sv = analyzeJetSVInfo(analysisJet, allSVs, checkSV /*, jetFlavor, weight*/); + + if (checkSV) { + mSV = sv.m(); + eSV = sv.e(); + slXY = sv.decayLengthXY() / sv.errorDecayLengthXY(); + registry.fill(HIST("h3_mSV_eSV_slXY"), mSV, eSV, slXY, weight); + } + + registry.fill(HIST("h_jetpT"), analysisJet.pt(), weight); + registry.fill(HIST("h_Db"), analysisJet.scoreML(), weight); + registry.fill(HIST("h2_jetpT_Db"), analysisJet.pt(), analysisJet.scoreML(), weight); + registry.fill(HIST("h2_jetpT_SVMass"), analysisJet.pt(), mSV, weight); + registry.fill(HIST("h2_jetpT_SVEnergy"), analysisJet.pt(), eSV, weight); + registry.fill(HIST("h2_jetpT_SLxy"), analysisJet.pt(), slXY, weight); + registry.fill(HIST("h2_jetpT_jetMass"), analysisJet.pt(), analysisJet.mass(), weight); + registry.fill(HIST("h2_jetpT_jetProb"), analysisJet.pt(), analysisJet.jetProb(), weight); + registry.fill(HIST("h2_jetpT_nTracks"), analysisJet.pt(), nTracks, weight); + + registry.fill(HIST("h3_jetpT_nTracks_Db"), analysisJet.pt(), nTracks, analysisJet.scoreML(), weight); + + if (jetFlavor == JetTaggingSpecies::beauty) { + registry.fill(HIST("h_jetpT_b"), analysisJet.pt(), weight); + registry.fill(HIST("h_Db_b"), analysisJet.scoreML(), weight); + registry.fill(HIST("h2_jetpT_Db_b"), analysisJet.pt(), analysisJet.scoreML(), weight); + registry.fill(HIST("h2_jetpT_SVMass_b"), analysisJet.pt(), mSV, weight); + registry.fill(HIST("h2_jetpT_SVEnergy_b"), analysisJet.pt(), eSV, weight); + registry.fill(HIST("h2_jetpT_SLxy_b"), analysisJet.pt(), slXY, weight); + registry.fill(HIST("h2_jetpT_jetMass_b"), analysisJet.pt(), analysisJet.mass(), weight); + registry.fill(HIST("h2_jetpT_jetProb_b"), analysisJet.pt(), analysisJet.jetProb(), weight); + registry.fill(HIST("h2_jetpT_nTracks_b"), analysisJet.pt(), nTracks, weight); + } else if (jetFlavor == JetTaggingSpecies::charm) { + registry.fill(HIST("h_jetpT_c"), analysisJet.pt(), weight); + registry.fill(HIST("h_Db_c"), analysisJet.scoreML(), weight); + registry.fill(HIST("h2_jetpT_Db_c"), analysisJet.pt(), analysisJet.scoreML(), weight); + registry.fill(HIST("h2_jetpT_SVMass_c"), analysisJet.pt(), mSV, weight); + registry.fill(HIST("h2_jetpT_SVEnergy_c"), analysisJet.pt(), eSV, weight); + registry.fill(HIST("h2_jetpT_SLxy_c"), analysisJet.pt(), slXY, weight); + registry.fill(HIST("h2_jetpT_jetMass_c"), analysisJet.pt(), analysisJet.mass(), weight); + registry.fill(HIST("h2_jetpT_jetProb_c"), analysisJet.pt(), analysisJet.jetProb(), weight); + registry.fill(HIST("h2_jetpT_nTracks_c"), analysisJet.pt(), nTracks, weight); + } else { + registry.fill(HIST("h_jetpT_lf"), analysisJet.pt(), weight); + registry.fill(HIST("h_Db_lf"), analysisJet.scoreML(), weight); + registry.fill(HIST("h2_jetpT_Db_lf"), analysisJet.pt(), analysisJet.scoreML(), weight); + registry.fill(HIST("h2_jetpT_SVMass_lf"), analysisJet.pt(), mSV, weight); + registry.fill(HIST("h2_jetpT_SVEnergy_lf"), analysisJet.pt(), eSV, weight); + registry.fill(HIST("h2_jetpT_SLxy_lf"), analysisJet.pt(), slXY, weight); + registry.fill(HIST("h2_jetpT_jetMass_lf"), analysisJet.pt(), analysisJet.mass(), weight); + registry.fill(HIST("h2_jetpT_jetProb_lf"), analysisJet.pt(), analysisJet.jetProb(), weight); + registry.fill(HIST("h2_jetpT_nTracks_lf"), analysisJet.pt(), nTracks, weight); + if (jetFlavor == JetTaggingSpecies::none) { + registry.fill(HIST("h2_jetpT_Db_lf_none"), analysisJet.pt(), analysisJet.scoreML(), weight); + } else { + registry.fill(HIST("h2_jetpT_Db_lf_matched"), analysisJet.pt(), analysisJet.scoreML(), weight); + } + } + + if (static_cast(nNppTracks) / nTracks > trackNppCrit) { + registry.fill(HIST("h_Db_npp"), analysisJet.scoreML(), weight); + registry.fill(HIST("h2_jetpT_Db_npp"), analysisJet.pt(), analysisJet.scoreML(), weight); + if (jetFlavor == JetTaggingSpecies::beauty) { + registry.fill(HIST("h_Db_npp_b"), analysisJet.scoreML(), weight); + registry.fill(HIST("h2_jetpT_Db_npp_b"), analysisJet.pt(), analysisJet.scoreML(), weight); + } else if (jetFlavor == JetTaggingSpecies::charm) { + registry.fill(HIST("h_Db_npp_c"), analysisJet.scoreML(), weight); + registry.fill(HIST("h2_jetpT_Db_npp_c"), analysisJet.pt(), analysisJet.scoreML(), weight); + } else { + registry.fill(HIST("h_Db_npp_lf"), analysisJet.scoreML(), weight); + registry.fill(HIST("h2_jetpT_Db_npp_lf"), analysisJet.pt(), analysisJet.scoreML(), weight); + } + } + + if (doDataDriven) { + registry.fill(HIST("hSparse_Incljets"), analysisJet.pt(), analysisJet.scoreML(), mSV, analysisJet.mass(), nTracks, weight); + if (jetFlavor == JetTaggingSpecies::beauty) { + registry.fill(HIST("hSparse_bjets"), analysisJet.pt(), analysisJet.scoreML(), mSV, analysisJet.mass(), nTracks, weight); + } else if (jetFlavor == JetTaggingSpecies::charm) { + registry.fill(HIST("hSparse_cjets"), analysisJet.pt(), analysisJet.scoreML(), mSV, analysisJet.mass(), nTracks, weight); + } else { + registry.fill(HIST("hSparse_lfjets"), analysisJet.pt(), analysisJet.scoreML(), mSV, analysisJet.mass(), nTracks, weight); + if (jetFlavor == JetTaggingSpecies::none) { + registry.fill(HIST("hSparse_lfjets_none"), analysisJet.pt(), analysisJet.scoreML(), mSV, analysisJet.mass(), nTracks, weight); + } else { + registry.fill(HIST("hSparse_lfjets_matched"), analysisJet.pt(), analysisJet.scoreML(), mSV, analysisJet.mass(), nTracks, weight); + } + } + } + + for (const auto& mcpjet : analysisJet.template matchedJetGeo_as()) { + if (mcpjet.pt() > pTHatMaxMCP * pTHat) { + continue; + } + + registry.fill(HIST("h2_Response_DetjetpT_PartjetpT"), analysisJet.pt(), mcpjet.pt(), weight); + if (jetFlavor == JetTaggingSpecies::beauty) { + registry.fill(HIST("h2_Response_DetjetpT_PartjetpT_b"), analysisJet.pt(), mcpjet.pt(), weight); + } else if (jetFlavor == JetTaggingSpecies::charm) { + registry.fill(HIST("h2_Response_DetjetpT_PartjetpT_c"), analysisJet.pt(), mcpjet.pt(), weight); + } else { + registry.fill(HIST("h2_Response_DetjetpT_PartjetpT_lf"), analysisJet.pt(), mcpjet.pt(), weight); + } + } + } + } + PROCESS_SWITCH(BjetTaggingGNN, processMCJets, "jet information in MC", false); + + Filter mccollisionFilter = nabs(aod::jmccollision::posZ) < vertexZCut; + using FilteredCollisionMCP = soa::Filtered; + + void processMCTruthJets(FilteredCollisionMCP::iterator const& /*collision*/, MCPJetTable const& MCPjets, aod::JetParticles const& /*MCParticles*/) + { + + for (const auto& mcpjet : MCPjets) { + + bool jetIncluded = false; + for (const auto& jetR : jetRadiiValues) { + if (mcpjet.r() == static_cast(jetR * 100)) { + jetIncluded = true; + break; + } + } + + if (!jetIncluded) { + continue; + } + + float weight = useEventWeight ? mcpjet.eventWeight() : 1.0; + float pTHat = 10. / (std::pow(mcpjet.eventWeight(), 1.0 / pTHatExponent)); + if (mcpjet.pt() > pTHatMaxMCP * pTHat) { + continue; + } + + int8_t jetFlavor = mcpjet.origin(); + + registry.fill(HIST("h_jetpT_particle"), mcpjet.pt(), weight); + + if (jetFlavor == JetTaggingSpecies::beauty) { + registry.fill(HIST("h_jetpT_particle_b"), mcpjet.pt(), weight); + } else if (jetFlavor == JetTaggingSpecies::charm) { + registry.fill(HIST("h_jetpT_particle_c"), mcpjet.pt(), weight); + } else { + registry.fill(HIST("h_jetpT_particle_lf"), mcpjet.pt(), weight); + } + } + } + PROCESS_SWITCH(BjetTaggingGNN, processMCTruthJets, "truth jet information", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc, TaskName{"bjet-tagging-gnn"})}; +} From 66e4fa049e7ebe3ffd04fc54f67b4f7c1a5e7b4c Mon Sep 17 00:00:00 2001 From: creetz16 <79141119+creetz16@users.noreply.github.com> Date: Tue, 18 Feb 2025 14:14:34 +0100 Subject: [PATCH 0291/1650] [PWGLF] Update reduced3bodyCreator and add reduced EM processing in decay3bodybuilder (#10029) --- PWGLF/DataModel/Reduced3BodyTables.h | 14 +- .../Nuspex/decay3bodybuilder.cxx | 288 +++++++++++++----- .../Nuspex/reduced3bodyCreator.cxx | 59 ++-- 3 files changed, 247 insertions(+), 114 deletions(-) diff --git a/PWGLF/DataModel/Reduced3BodyTables.h b/PWGLF/DataModel/Reduced3BodyTables.h index a11081cd848..9f963951cf0 100644 --- a/PWGLF/DataModel/Reduced3BodyTables.h +++ b/PWGLF/DataModel/Reduced3BodyTables.h @@ -21,18 +21,18 @@ namespace o2::aod { -DECLARE_SOA_TABLE(ReducedCollisions, "AOD", "REDUCEDCOLLISION", //! reduced collision table (same structure as the original collision table) - o2::soa::Index<>, collision::BCId, +DECLARE_SOA_TABLE(ReducedCollisions, "AOD", "REDCOLLISION", //! reduced collision table (same structure as the original collision table) + o2::soa::Index<>, collision::PosX, collision::PosY, collision::PosZ, collision::CovXX, collision::CovXY, collision::CovYY, collision::CovXZ, collision::CovYZ, collision::CovZZ, collision::Flags, collision::Chi2, collision::NumContrib, collision::CollisionTime, collision::CollisionTimeRes, bc::RunNumber); -DECLARE_SOA_TABLE(ReducedPVMults, "AOD", "REDUCEDPVMULT", //! Multiplicity from the PV contributors, joinable with reducedCollisions +DECLARE_SOA_TABLE(ReducedPVMults, "AOD", "REDPVMULT", //! Multiplicity from the PV contributors, joinable with reducedCollisions mult::MultNTracksPV); -DECLARE_SOA_TABLE(ReducedCentFT0Cs, "AOD", "REDUCEDCENTFT0C", //! Reduced Run 3 FT0C centrality table, joinable with reducedCollisions +DECLARE_SOA_TABLE(ReducedCentFT0Cs, "AOD", "REDCENTFT0C", //! Reduced Run 3 FT0C centrality table, joinable with reducedCollisions cent::CentFT0C); namespace reducedtracks3body @@ -189,7 +189,7 @@ DECLARE_SOA_COLUMN(TOFNSigmaDe, tofNSigmaDe, float); //! Nsigma separation with } // namespace reducedtracks3body -DECLARE_SOA_TABLE_FULL(StoredReducedTracksIU, "ReducedTracks_IU", "AOD", "REDUCEDTRACK_IU", //! On disk version of the track parameters at inner most update (e.g. ITS) as it comes from the tracking +DECLARE_SOA_TABLE_FULL(StoredReducedTracksIU, "ReducedTracks_IU", "AOD", "REDTRACK_IU", //! On disk version of the track parameters at inner most update (e.g. ITS) as it comes from the tracking o2::soa::Index<>, reducedtracks3body::CollisionId, reducedtracks3body::X, reducedtracks3body::Alpha, reducedtracks3body::Y, reducedtracks3body::Z, reducedtracks3body::Snp, reducedtracks3body::Tgl, @@ -224,7 +224,7 @@ DECLARE_SOA_TABLE_FULL(StoredReducedTracksIU, "ReducedTracks_IU", "AOD", "REDUCE reducedtracks3body::ITSClsSizeInLayer, reducedtracks3body::TPCCrossedRowsOverFindableCls); -DECLARE_SOA_EXTENDED_TABLE(ReducedTracksIU, StoredReducedTracksIU, "EXREDUCEDTRACK_IU", 0, //! Track parameters at inner most update (e.g. ITS) as it comes from the tracking +DECLARE_SOA_EXTENDED_TABLE(ReducedTracksIU, StoredReducedTracksIU, "EXREDTRACK_IU", 0, //! Track parameters at inner most update (e.g. ITS) as it comes from the tracking reducedtracks3body::Pt, reducedtracks3body::P, reducedtracks3body::Eta, @@ -258,7 +258,7 @@ DECLARE_SOA_INDEX_COLUMN_FULL(Track2, track2, int, ReducedTracksIU, "_2"); DECLARE_SOA_INDEX_COLUMN_FULL(Collision, collision, int, ReducedCollisions, ""); //! Collision index } // namespace reduceddecay3body -DECLARE_SOA_TABLE(ReducedDecay3Bodys, "AOD", "REDUCEDDECAY3BODY", //! reduced 3-body decay table +DECLARE_SOA_TABLE(ReducedDecay3Bodys, "AOD", "REDDECAY3BODY", //! reduced 3-body decay table o2::soa::Index<>, reduceddecay3body::CollisionId, reduceddecay3body::Track0Id, reduceddecay3body::Track1Id, reduceddecay3body::Track2Id); using ReducedDecay3BodysLinked = soa::Join; diff --git a/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx b/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx index 53a44016ddb..09f2b7ba530 100644 --- a/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx +++ b/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx @@ -35,8 +35,6 @@ #include "PWGLF/DataModel/Reduced3BodyTables.h" #include "PWGLF/DataModel/Vtx3BodyTables.h" #include "PWGLF/DataModel/pidTOFGeneric.h" -#include "Common/Core/TrackSelection.h" -#include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/PIDResponse.h" #include "Common/Core/PID/PIDTOF.h" @@ -80,6 +78,9 @@ using TrackExtPIDIUwithEvTimes = soa::Join; +using ReducedCollisionsMults = soa::Join; +using ReducedCollisionsMultsCents = soa::Join; + struct vtxCandidate { int track0Id; int track1Id; @@ -170,8 +171,6 @@ struct decay3bodyBuilder { std::vector kfPionDaughters; std::vector kfDeuteronDaughters; std::vector kf3bodyVtxCandidates; - std::vector kfCandidates; - // kfCandidate candidate; // Configurables Configurable d_UseAbsDCA{"d_UseAbsDCA", true, "Use Abs DCAs"}; @@ -325,10 +324,8 @@ struct decay3bodyBuilder { // KF event mixing using BinningTypeKF = ColumnBinningPolicy; - BinningTypeKF binningOnPosAndMult{{kfparticleConfigurations.binsVtxZ, kfparticleConfigurations.binsMultiplicity}, true}; // Filters and slices - // Filter collisionFilter = (aod::evsel::sel8 == true && nabs(aod::collision::posZ) < 10.f); Preslice perCollision = o2::aod::decay3body::collisionId; Preslice perReducedCollision = o2::aod::reduceddecay3body::collisionId; @@ -418,7 +415,7 @@ struct decay3bodyBuilder { registry.add("hBachelorTOFNSigmaDe", "", HistType::kTH2F, {{40, -10.0f, 10.0f, "p/z (GeV/c)"}, {40, -10.0f, 10.0f, "TOF n#sigma"}}); } - if (doprocessRun3withKFParticle == true || doprocessRun3withKFParticleEM == true || doprocessRun3withKFParticleStrangenessTracking == true || doprocessRun3withKFParticleTrackRotation == true) { + if (doprocessRun3withKFParticle == true || doprocessRun3withKFParticleEM == true || doprocessRun3withKFParticleStrangenessTracking == true || doprocessRun3withKFParticleTrackRotation == true || doprocessRun3withKFParticleReduced == true || doprocessRun3withKFParticleReducedEM == true) { auto hEventCounterZorro = registry.add("Counters/hEventCounterZorro", "hEventCounterZorro", HistType::kTH1D, {{2, -0.5, 1.5}}); hEventCounterZorro->GetXaxis()->SetBinLabel(1, "Zorro before evsel"); hEventCounterZorro->GetXaxis()->SetBinLabel(2, "Zorro after evsel"); @@ -486,7 +483,7 @@ struct decay3bodyBuilder { registry.add("QA/Event/hVtxCovYZ", "hVtxCovYZ", HistType::kTH1F, {{200, -0.0001f, 0.0001f, "PV cov(YZ) (cm^{2})"}}); } - if (doprocessRun3withKFParticleEM == true) { + if (doprocessRun3withKFParticleEM == true || doprocessRun3withKFParticleReducedEM == true) { auto hPairCounterMixing = registry.add("QA/EM/hPairCounterMixing", "hPairCounterMixing", HistType::kTH1F, {{3, 0.0f, 3.0f}}); hPairCounterMixing->GetXaxis()->SetBinLabel(1, "total"); hPairCounterMixing->GetXaxis()->SetBinLabel(2, "sel8"); @@ -495,8 +492,15 @@ struct decay3bodyBuilder { auto hCombinationCounterMixing = registry.add("QA/EM/hCombinationCounterMixing", "hCombinationCounterMixing", HistType::kTH1F, {{3, 0.0f, 3.0f}}); hCombinationCounterMixing->GetXaxis()->SetBinLabel(1, "total"); hCombinationCounterMixing->GetXaxis()->SetBinLabel(2, "bach sign/ID"); - hCombinationCounterMixing->GetXaxis()->SetBinLabel(3, "bach pT"); + hCombinationCounterMixing->GetXaxis()->SetBinLabel(3, "bach pT or radius, phi"); hCombinationCounterMixing->LabelsOption("v"); + + registry.add("QA/EM/hRadius1", "hRadius1", HistType::kTH1F, {{200, 0.0f, 20.0f, "Radius (cm)"}}); + registry.add("QA/EM/hRadius2", "hRadius2", HistType::kTH1F, {{200, 0.0f, 20.0f, "Radius (cm)"}}); + registry.add("QA/EM/hPhi1", "hPhi1", HistType::kTH1F, {{360, 0.0f, 360.0f, "#phi (degree)"}}); + registry.add("QA/EM/hPhi2", "hPhi2", HistType::kTH1F, {{360, 0.0f, 360.0f, "#phi (degree)"}}); + registry.add("QA/EM/hDeltaRadius", "hDeltaRadius", HistType::kTH1F, {{200, 0.0f, 10.0f, "#Delta Radius (cm)"}}); + registry.add("QA/EM/hDeltaPhi", "hDeltaPhi", HistType::kTH1F, {{360, 0.0f, 360.0f, "#Delta #phi (degree)"}}); } } @@ -620,6 +624,30 @@ struct decay3bodyBuilder { bachelorTOFPID.SetParams(mRespParamsV2); } + void initCCDBReduced(const int& runNumber) + { + o2::parameters::GRPMagField* grpmag = ccdb->getForRun(grpmagPath, runNumber); + if (!grpmag) { + LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for run number " << runNumber; + } + o2::base::Propagator::initFieldFromGRP(grpmag); + // Fetch magnetic field from ccdb for current collision + d_bz = o2::base::Propagator::Instance()->getNominalBz(); + LOG(info) << "Retrieved GRP for run number " << runNumber << " with magnetic field of " << d_bz << " kZG"; + + // Set magnetic field for KF vertexing +#ifdef HomogeneousField + KFParticle::SetField(d_bz); +#endif + // Set field for DCAfitter + fitter3body.setBz(d_bz); + + if (useMatCorrType == 2) { + // setMatLUT only after magfield has been initalized + o2::base::Propagator::Instance()->setMatLUT(lut); + } + } + //------------------------------------------------------------------ //-------------------- DCA fitter reconstruction ------------------- //------------------------------------------------------------------ @@ -792,6 +820,22 @@ struct decay3bodyBuilder { return true; } + template + double getTOFnSigma(TCollision const& collision, TTrack const& track, bool isEventMixing) + { + // TOF PID of deuteron (set motherhyp correctly) + double tofNSigmaDeuteron = -999; + if (track.has_collision() && track.hasTOF()) { + if (isEventMixing) { + tofNSigmaDeuteron = bachelorTOFPID.GetTOFNSigma(track, collision, collision); + } else { + auto originalcol = track.template collision_as(); + tofNSigmaDeuteron = bachelorTOFPID.GetTOFNSigma(track, originalcol, collision); + } + } + return tofNSigmaDeuteron; + } + //------------------------------------------------------------------ // function to fill candidate table template @@ -916,7 +960,7 @@ struct decay3bodyBuilder { //------------------------------------------------------------------ // 3body candidate builder with KFParticle template - void buildVtx3BodyDataTableKFParticle(TCollision const& collision, TTrack const& trackPos, TTrack const& trackNeg, TTrack const& trackBach, int64_t decay3bodyID, int bachelorcharge, int nRotations) + void buildVtx3BodyDataTableKFParticle(TCollision const& collision, TTrack const& trackPos, TTrack const& trackNeg, TTrack const& trackBach, int64_t decay3bodyID, int bachelorcharge, int nRotations, double tofNSigmaDeuteron) { gROOT->SetBatch(true); gRandom->SetSeed(42); @@ -1013,25 +1057,13 @@ struct decay3bodyBuilder { registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxEta); // number of TPC clusters - int tpcNClProton; - int tpcNClPion; - int tpcNClDeuteron = trackBach.tpcNClsFound(); - float tpcChi2NCl = trackBach.tpcChi2NCl(); if (trackBach.tpcNClsFound() <= kfparticleConfigurations.mintpcNClsBach) { return; } - if (isMatter) { - tpcNClPion = trackNeg.tpcNClsFound(); - tpcNClProton = trackPos.tpcNClsFound(); - if ((kfparticleConfigurations.useTPCforPion && trackNeg.tpcNClsFound() <= kfparticleConfigurations.mintpcNClsPion) || trackPos.tpcNClsFound() <= kfparticleConfigurations.mintpcNClsProton) { - return; - } - } else if (!isMatter) { - tpcNClPion = trackPos.tpcNClsFound(); - tpcNClProton = trackNeg.tpcNClsFound(); - if ((kfparticleConfigurations.useTPCforPion && trackPos.tpcNClsFound() <= kfparticleConfigurations.mintpcNClsPion) || trackNeg.tpcNClsFound() <= kfparticleConfigurations.mintpcNClsProton) { - return; - } + if (isMatter && ((kfparticleConfigurations.useTPCforPion && trackNeg.tpcNClsFound() <= kfparticleConfigurations.mintpcNClsPion) || trackPos.tpcNClsFound() <= kfparticleConfigurations.mintpcNClsProton)) { + return; + } else if (!isMatter && ((kfparticleConfigurations.useTPCforPion && trackPos.tpcNClsFound() <= kfparticleConfigurations.mintpcNClsPion) || trackNeg.tpcNClsFound() <= kfparticleConfigurations.mintpcNClsProton)) { + return; } registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxTPCNcls); @@ -1074,17 +1106,6 @@ struct decay3bodyBuilder { registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxTPCPID); LOG(debug) << "Basic track selections done."; - // TOF PID of deuteron (set motherhyp correctly) - double tofNSigmaDeuteron = -999; - if (trackBach.has_collision() && trackBach.hasTOF()) { - if (isEventMixing) { - tofNSigmaDeuteron = bachelorTOFPID.GetTOFNSigma(trackBach, collision, collision); - } else { - auto originalcol = trackBach.template collision_as(); - tofNSigmaDeuteron = bachelorTOFPID.GetTOFNSigma(trackBach, originalcol, collision); - } - } - // Average ITS cluster size of deuteron track double averageClusterSizeDeuteron(0); int nCls(0); @@ -1209,13 +1230,6 @@ struct decay3bodyBuilder { kfpDeuteron = createKFParticleFromTrackParCov(trackParCovBach, trackBach.sign() * bachelorcharge, constants::physics::MassDeuteron); LOG(debug) << "KFParticle created from deuteron track."; float kfpvPos[3] = {kfpv.GetX(), kfpv.GetY(), kfpv.GetZ()}; - // Check phi angle of "default" candidate daughter tracks - float phiDeuteron_noRotation; - float phiDeuteronSigma_noRotation; - float phiProton_noRotation; - float phiProtonSigma_noRotation; - kfpDeuteron.GetPhi(phiDeuteron_noRotation, phiDeuteronSigma_noRotation); - kfpProton.GetPhi(phiProton_noRotation, phiProtonSigma_noRotation); // Construct vertex /// BRIEF: Case 1: fully uncorrelated bkg via rotation of proton track @@ -1361,14 +1375,6 @@ struct decay3bodyBuilder { trackedClSize = !fTrackedClSizeVector.empty() ? fTrackedClSizeVector[decay3bodyID] : 0; } - // get deuteron and proton phi after rotation - float phiDeuteron_afterRotation; - float phiDeuteronSigma_afterRotation; - float phiProton_afterRotation; - float phiProtonSigma_afterRotation; - kfDeuteronDaughters[i].GetPhi(phiDeuteron_afterRotation, phiDeuteronSigma_afterRotation); - kfProtonDaughters[i].GetPhi(phiProton_afterRotation, phiProtonSigma_afterRotation); - // candidate filling kfCandidate candidate; candidate.collisionID = collision.globalIndex(); @@ -1406,8 +1412,6 @@ struct decay3bodyBuilder { candidate.chi2topoNDF = chi2topoNDF; candidate.ctau = KFHtPV.GetLifeTime(); candidate.trackedClSize = trackedClSize; - candidate.DeltaPhiRotDeuteron = phiDeuteron_noRotation - phiDeuteron_afterRotation; - candidate.DeltaPhiRotProton = phiProton_noRotation - phiProton_afterRotation; // V0 candidate.massV0 = massV0; candidate.chi2massV0 = chi2massV0; @@ -1425,11 +1429,6 @@ struct decay3bodyBuilder { candidate.tpcInnerParam[0] = tpcInnerParamProton; candidate.tpcInnerParam[1] = tpcInnerParamPion; candidate.tpcInnerParam[2] = tpcInnerParamDeuteron; - // daughter track quality - candidate.tpcNClDaughters[0] = tpcNClProton; - candidate.tpcNClDaughters[1] = tpcNClPion; - candidate.tpcNClDaughters[2] = tpcNClDeuteron; - candidate.tpcChi2NClDeuteron = tpcChi2NCl; // daughter DCAs with KF candidate.DCAdaughterToPV[0] = kfProtonDaughters[i].GetDistanceFromVertex(kfpv); candidate.DCAdaughterToPV[1] = kfPionDaughters[i].GetDistanceFromVertex(kfpv); @@ -1518,13 +1517,21 @@ struct decay3bodyBuilder { registry.fill(HIST("hEventCounter"), 0.5, collisions.size()); + int lastRunNumber = -1; + for (const auto& d3body : decay3bodys) { auto t0 = d3body.template track0_as(); auto t1 = d3body.template track1_as(); auto t2 = d3body.template track2_as(); auto collision = d3body.template collision_as(); - auto bc = collision.bc_as(); - initCCDB(bc); + // auto bc = collision.bc_as(); + // initCCDB(bc); + // set magnetic field only when run number changes + if (collision.runNumber() != lastRunNumber) { + initCCDBReduced(collision.runNumber()); + lastRunNumber = collision.runNumber(); // Update the last run number + LOG(debug) << "CCDB initialized for run " << lastRunNumber; + } fillVtxCand(collision, t0, t1, t2, d3body.globalIndex(), bachelorcharge, t2.tofNSigmaDe()); } @@ -1691,9 +1698,9 @@ struct decay3bodyBuilder { auto trackPos = vtx3body.template track0_as(); auto trackNeg = vtx3body.template track1_as(); auto trackBach = vtx3body.template track2_as(); - buildVtx3BodyDataTableKFParticle(collision, trackPos, trackNeg, trackBach, vtx3body.globalIndex(), bachelorcharge, 1); + buildVtx3BodyDataTableKFParticle(collision, trackPos, trackNeg, trackBach, vtx3body.globalIndex(), bachelorcharge, 1 /*nRotations*/, getTOFnSigma(collision, trackBach, false /*isEventMixing*/)); + LOG(debug) << "End of processKFParticle."; } - LOG(debug) << "End of processKFParticle."; } } PROCESS_SWITCH(decay3bodyBuilder, processRun3withKFParticle, "Produce KFParticle decay3body tables", false); @@ -1711,9 +1718,8 @@ struct decay3bodyBuilder { void processRun3withKFParticleEM(ColwithEvTimesMults const& collisions, TrackExtPIDIUwithEvTimes const& tracksIU, aod::Decay3Bodys const& decay3bodys, aod::BCsWithTimestamps const&) { - kf3bodyVtxCandidates.clear(); - auto tuple = std::make_tuple(decay3bodys, tracksIU); + BinningTypeKF binningOnPosAndMult{{kfparticleConfigurations.binsVtxZ, kfparticleConfigurations.binsMultiplicity}, true}; Pair pair{binningOnPosAndMult, kfparticleConfigurations.nEvtMixing, -1, collisions, tuple, &cache}; // indicates that under/overflow (-1) to be ignored for (auto& [c1, decays3body, c2, tracks] : pair) { @@ -1748,7 +1754,7 @@ struct decay3bodyBuilder { continue; } registry.fill(HIST("QA/EM/hCombinationCounterMixing"), 2.5); - buildVtx3BodyDataTableKFParticle(c1, trackPos, trackNeg, track, -1, bachelorcharge, 1); + buildVtx3BodyDataTableKFParticle(c1, trackPos, trackNeg, track, -1 /*vtx3bodyID*/, bachelorcharge, 1 /*nRotations*/, getTOFnSigma(c1, trackBach, true /*isEventMixing*/)); LOG(debug) << "buildVtx3BodyDataTableKFParticle called."; } } @@ -1757,8 +1763,6 @@ struct decay3bodyBuilder { void processRun3withKFParticleTrackRotation(ColwithEvTimes const& collisions, TrackExtPIDIUwithEvTimes const&, aod::Decay3Bodys const& decay3bodys, aod::BCsWithTimestamps const&) { - kf3bodyVtxCandidates.clear(); - // same process as processRun3withKFParticle but with nRotations set according to configurable for (const auto& collision : collisions) { // event selection @@ -1784,12 +1788,131 @@ struct decay3bodyBuilder { auto trackPos = vtx3body.template track0_as(); auto trackNeg = vtx3body.template track1_as(); auto trackBach = vtx3body.template track2_as(); - buildVtx3BodyDataTableKFParticle(collision, trackPos, trackNeg, trackBach, vtx3body.globalIndex(), bachelorcharge, kfparticleConfigurations.nRotations); + buildVtx3BodyDataTableKFParticle(collision, trackPos, trackNeg, trackBach, vtx3body.globalIndex(), bachelorcharge, kfparticleConfigurations.nRotations, getTOFnSigma(collision, trackBach, false /*isEventMixing*/)); } LOG(debug) << "End of processKFParticle."; } } PROCESS_SWITCH(decay3bodyBuilder, processRun3withKFParticleTrackRotation, "Produce KFParticle decay3body tables with rotated tracks", false); + + void processRun3withKFParticleReduced(aod::ReducedCollisions const& collisions, aod::ReducedTracksIU const&, aod::ReducedDecay3Bodys const& decay3bodys) + { + int lastRunNumber = -1; + + for (const auto& collision : collisions) { + // set magnetic field only when run number changes + if (collision.runNumber() != lastRunNumber) { + initCCDBReduced(collision.runNumber()); + lastRunNumber = collision.runNumber(); // Update the last run number + LOG(debug) << "CCDB initialized for run " << lastRunNumber; + } + + // event selection + registry.fill(HIST("Counters/hEventCounterKFParticle"), 2.5); + registry.fill(HIST("QA/Event/hAllSelEventsVtxZ"), collision.posZ()); + + // slice Decay3Body table by collision + const uint64_t collIdx = collision.globalIndex(); + auto Decay3BodyTable_thisCollision = decay3bodys.sliceBy(perReducedCollision, collIdx); + for (auto& vtx3body : Decay3BodyTable_thisCollision) { + auto trackPos = vtx3body.template track0_as(); + auto trackNeg = vtx3body.template track1_as(); + auto trackBach = vtx3body.template track2_as(); + buildVtx3BodyDataTableKFParticle(collision, trackPos, trackNeg, trackBach, vtx3body.globalIndex(), bachelorcharge, 1 /*nRotations*/, trackBach.tofNSigmaDe()); + } + LOG(debug) << "End of processKFParticleDerived."; + } + } + PROCESS_SWITCH(decay3bodyBuilder, processRun3withKFParticleReduced, "Produce KFParticle decay3body tables from derived decay3body data", false); + + void processRun3withKFParticleReducedEM(ReducedCollisionsMults const& collisions, aod::ReducedTracksIU const&, aod::ReducedDecay3Bodys const& decay3bodys) + { + auto tuple = std::make_tuple(decay3bodys); + BinningTypeKF binningOnPosAndMult{{kfparticleConfigurations.binsVtxZ, kfparticleConfigurations.binsMultiplicity}, true}; + SameKindPair pair{binningOnPosAndMult, kfparticleConfigurations.nEvtMixing, -1, collisions, tuple, &cache}; // indicates that under/overflow (-1) to be ignored + + int lastRunNumber = -1; + + for (auto& [c1, decays3body1, c2, decays3body2] : pair) { + registry.fill(HIST("QA/EM/hPairCounterMixing"), 0.5); + + // event selection already applied in reducer task + + // set magnetic field only when run number changes + if (c1.runNumber() != lastRunNumber) { + initCCDBReduced(c1.runNumber()); + lastRunNumber = c1.runNumber(); // Update the last run number + LOG(debug) << "CCDB initialized for run " << lastRunNumber; + } + + for (auto& [decay3body1, decay3body2] : soa::combinations(soa::CombinationsFullIndexPolicy(decays3body1, decays3body2))) { + auto trackPos1 = decay3body1.template track0_as(); + auto trackNeg1 = decay3body1.template track1_as(); + auto trackBach1 = decay3body1.template track2_as(); + auto trackPos2 = decay3body2.template track0_as(); + auto trackNeg2 = decay3body2.template track1_as(); + auto trackBach2 = decay3body2.template track2_as(); + + registry.fill(HIST("QA/EM/hCombinationCounterMixing"), 0.5); + + // ---------- selections bachelor track ---------- + if ((trackBach1.sign() > 0 && !(trackBach2.sign() > 0)) || (trackBach1.sign() < 0 && !(trackBach2.sign() < 0)) || trackBach1.globalIndex() == trackBach2.globalIndex()) { // only combine if trackBach2 has correct sign and is not same as trackBach1 + continue; + } + registry.fill(HIST("QA/EM/hCombinationCounterMixing"), 1.5); + + // ---------- check radius and phi of decay3bodys ---------- + auto trackParCovPos1 = getTrackParCov(trackPos1); + auto trackParCovNeg1 = getTrackParCov(trackNeg1); + auto trackParCovBach1 = getTrackParCov(trackBach1); + auto trackParCovPos2 = getTrackParCov(trackPos2); + auto trackParCovNeg2 = getTrackParCov(trackNeg2); + auto trackParCovBach2 = getTrackParCov(trackBach2); + // create KFParticle objects from tracks + KFParticle kfpProton1, kfpPion1, kfpDeuteron1; + if (trackBach1.sign() > 0) { + kfpProton1 = createKFParticleFromTrackParCov(trackParCovPos1, trackPos1.sign(), constants::physics::MassProton); + kfpPion1 = createKFParticleFromTrackParCov(trackParCovNeg1, trackNeg1.sign(), constants::physics::MassPionCharged); + } else if (!(trackBach1.sign() > 0)) { + kfpProton1 = createKFParticleFromTrackParCov(trackParCovNeg1, trackNeg1.sign(), constants::physics::MassProton); + kfpPion1 = createKFParticleFromTrackParCov(trackParCovPos1, trackPos1.sign(), constants::physics::MassPionCharged); + } + kfpDeuteron1 = createKFParticleFromTrackParCov(trackParCovBach1, trackBach1.sign() * bachelorcharge, constants::physics::MassDeuteron); + KFParticle kfpProton2, kfpPion2, kfpDeuteron2; + if (trackBach2.sign() > 0) { + kfpProton2 = createKFParticleFromTrackParCov(trackParCovPos2, trackPos2.sign(), constants::physics::MassProton); + kfpPion2 = createKFParticleFromTrackParCov(trackParCovNeg2, trackNeg2.sign(), constants::physics::MassPionCharged); + } else if (!(trackBach2.sign() > 0)) { + kfpProton2 = createKFParticleFromTrackParCov(trackParCovNeg2, trackNeg2.sign(), constants::physics::MassProton); + kfpPion2 = createKFParticleFromTrackParCov(trackParCovPos2, trackPos2.sign(), constants::physics::MassPionCharged); + } + kfpDeuteron1 = createKFParticleFromTrackParCov(trackParCovBach2, trackBach2.sign() * bachelorcharge, constants::physics::MassDeuteron); + // fit vertices + KFParticle KFHt1, KFHt2; + fit3bodyVertex(kfpProton1, kfpPion1, kfpDeuteron1, KFHt1); + fit3bodyVertex(kfpProton2, kfpPion2, kfpDeuteron2, KFHt2); + + // ---------- select common radius and phi region ---------- + auto radius1 = std::sqrt(KFHt1.GetX() * KFHt1.GetX() + KFHt1.GetY() * KFHt1.GetY()); + auto radius2 = std::sqrt(KFHt2.GetX() * KFHt2.GetX() + KFHt2.GetY() * KFHt2.GetY()); + registry.fill(HIST("QA/EM/hRadius1"), radius1); + registry.fill(HIST("QA/EM/hRadius2"), radius2); + registry.fill(HIST("QA/EM/hPhi1"), radius1); + registry.fill(HIST("QA/EM/hPhi2"), radius2); + registry.fill(HIST("QA/EM/hDeltaRadius"), std::abs(radius1 - radius2)); + registry.fill(HIST("QA/EM/hDeltaPhi"), std::abs(KFHt1.GetPhi() - KFHt2.GetPhi()) * (180.0 / TMath::Pi())); + if (std::abs(KFHt1.GetPhi() - KFHt2.GetPhi()) * (180.0 / TMath::Pi()) > 10 || std::abs(radius1 - radius2) > 2) { + continue; + } + registry.fill(HIST("QA/EM/hCombinationCounterMixing"), 2.5); + + // ---------- do candidate analysis ---------- + buildVtx3BodyDataTableKFParticle(c1, trackPos1, trackNeg1, trackBach2, -1 /*vtx3bodyID*/, bachelorcharge, 1 /*nRotations*/, trackBach2.tofNSigmaDe()); + LOG(debug) << "buildVtx3BodyDataTableKFParticle called."; + } + } // end pairing loop + } + PROCESS_SWITCH(decay3bodyBuilder, processRun3withKFParticleReducedEM, "Produce KFParticle event mixing decay3body tables from derived decay3body data", false); }; // build link from decay3body -> vtx3body @@ -1833,27 +1956,34 @@ struct kfdecay3bodyDataLinkBuilder { void init(InitContext const&) {} - void processDoNotBuildLink(aod::Collisions::iterator const&) - { - // dummy process function - } - PROCESS_SWITCH(kfdecay3bodyDataLinkBuilder, processDoNotBuildLink, "Do not build data link table.", false); - - // build Decay3Body -> KFDecay3BodyData link table - void processBuildLink(aod::Decay3Bodys const& decay3bodytable, aod::KFVtx3BodyDatas const& vtxdatatable) + template + void buildDataLink(TDecay3Bodys const& decay3bodytable, TVtx3BodyDatas const& vtxdatatable) { std::vector lIndices; lIndices.reserve(decay3bodytable.size()); for (int ii = 0; ii < decay3bodytable.size(); ii++) lIndices[ii] = -1; for (auto& vtxdata : vtxdatatable) { - lIndices[vtxdata.decay3bodyId()] = vtxdata.globalIndex(); + if (vtxdata.decay3bodyId() != -1) { + lIndices[vtxdata.decay3bodyId()] = vtxdata.globalIndex(); + } } for (int ii = 0; ii < decay3bodytable.size(); ii++) { kfvtxdataLink(lIndices[ii]); } } - PROCESS_SWITCH(kfdecay3bodyDataLinkBuilder, processBuildLink, "Build data link table.", true); + + void processStandard(aod::Decay3Bodys const& decay3bodytable, aod::KFVtx3BodyDatas const& vtxdatatable) + { + buildDataLink(decay3bodytable, vtxdatatable); // build Decay3Body -> KFDecay3BodyData link table + } + PROCESS_SWITCH(kfdecay3bodyDataLinkBuilder, processStandard, "Build data link table.", true); + + void processReduced(aod::ReducedDecay3Bodys const& decay3bodytable, aod::KFVtx3BodyDatas const& vtxdatatable) + { + buildDataLink(decay3bodytable, vtxdatatable); // build ReducedDecay3Body -> KFDecay3BodyData link table + } + PROCESS_SWITCH(kfdecay3bodyDataLinkBuilder, processReduced, "Build data link table for reduced data.", true); }; struct decay3bodyLabelBuilder { diff --git a/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx b/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx index e6d38c83bc9..99ab175eca0 100644 --- a/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx +++ b/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx @@ -17,7 +17,6 @@ #include #include #include -#include #include #include "Framework/runDataProcessing.h" @@ -192,6 +191,29 @@ struct reduced3bodyCreator { bachelorTOFPID.SetParams(mRespParamsV2); } + template + void fillTrackTable(TTrack const& daughter, double tofNSigmaTrack, auto collisionIndex) + { + reducedFullTracksPIDIU( + // TrackIU + collisionIndex, + daughter.x(), daughter.alpha(), + daughter.y(), daughter.z(), daughter.snp(), daughter.tgl(), + daughter.signed1Pt(), + // TracksCovIU + daughter.sigmaY(), daughter.sigmaZ(), daughter.sigmaSnp(), daughter.sigmaTgl(), daughter.sigma1Pt(), + daughter.rhoZY(), daughter.rhoSnpY(), daughter.rhoSnpZ(), daughter.rhoTglY(), daughter.rhoTglZ(), + daughter.rhoTglSnp(), daughter.rho1PtY(), daughter.rho1PtZ(), daughter.rho1PtSnp(), daughter.rho1PtTgl(), + // TracksExtra + daughter.tpcInnerParam(), daughter.flags(), daughter.itsClusterSizes(), + daughter.tpcNClsFindable(), daughter.tpcNClsFindableMinusFound(), daughter.tpcNClsFindableMinusCrossedRows(), + daughter.trdPattern(), daughter.tpcChi2NCl(), daughter.tofChi2(), + daughter.tpcSignal(), daughter.tofExpMom(), + // PID + daughter.tpcNSigmaPr(), daughter.tpcNSigmaPi(), daughter.tpcNSigmaDe(), + tofNSigmaTrack); + } + void process(ColwithEvTimesMultsCents const& collisions, TrackExtPIDIUwithEvTimes const&, aod::Decay3Bodys const& decay3bodys, aod::BCsWithTimestamps const&) { @@ -246,7 +268,6 @@ struct reduced3bodyCreator { if (collision.globalIndex() != lastCollisionID) { int runNumber = bc.runNumber(); reducedCollisions( - collision.bcId(), collision.posX(), collision.posY(), collision.posZ(), collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ(), collision.flags(), collision.chi2(), collision.numContrib(), @@ -258,6 +279,9 @@ struct reduced3bodyCreator { lastCollisionID = collision.globalIndex(); } + // Precompute collision index + const auto collisionIndex = reducedCollisions.lastIndex(); + // Save daughter tracks const auto daughter0 = d3body.template track0_as(); const auto daughter1 = d3body.template track1_as(); @@ -270,34 +294,13 @@ struct reduced3bodyCreator { // ---------------------------------------------- // save reduced track table with decay3body daughters - daughterTracks.push_back(daughter0); - daughterTracks.push_back(daughter1); - daughterTracks.push_back(daughter2); - for (int i = 0; i < 3; i++) { - double tofNSigmaTrack = (i == 2) ? tofNSigmaBach : -999.; - reducedFullTracksPIDIU( - // TrackIU - // reducedTrackID + i, - reducedCollisions.lastIndex(), - daughterTracks[i].x(), daughterTracks[i].alpha(), - daughterTracks[i].y(), daughterTracks[i].z(), daughterTracks[i].snp(), daughterTracks[i].tgl(), - daughterTracks[i].signed1Pt(), - // TracksCovIU - daughterTracks[i].sigmaY(), daughterTracks[i].sigmaZ(), daughterTracks[i].sigmaSnp(), daughterTracks[i].sigmaTgl(), daughterTracks[i].sigma1Pt(), - daughterTracks[i].rhoZY(), daughterTracks[i].rhoSnpY(), daughterTracks[i].rhoSnpZ(), daughterTracks[i].rhoTglY(), daughterTracks[i].rhoTglZ(), - daughterTracks[i].rhoTglSnp(), daughterTracks[i].rho1PtY(), daughterTracks[i].rho1PtZ(), daughterTracks[i].rho1PtSnp(), daughterTracks[i].rho1PtTgl(), - // TracksExtra - daughterTracks[i].tpcInnerParam(), daughterTracks[i].flags(), daughterTracks[i].itsClusterSizes(), - daughterTracks[i].tpcNClsFindable(), daughterTracks[i].tpcNClsFindableMinusFound(), daughterTracks[i].tpcNClsFindableMinusCrossedRows(), - daughterTracks[i].trdPattern(), daughterTracks[i].tpcChi2NCl(), daughterTracks[i].tofChi2(), - daughterTracks[i].tpcSignal(), daughterTracks[i].tofExpMom(), - // PID - daughterTracks[i].tpcNSigmaPr(), daughterTracks[i].tpcNSigmaPi(), daughterTracks[i].tpcNSigmaDe(), - tofNSigmaTrack); - } + fillTrackTable(daughter0, -999, collisionIndex); + fillTrackTable(daughter1, -999, collisionIndex); + fillTrackTable(daughter2, tofNSigmaBach, collisionIndex); // save reduced decay3body table - reducedDecay3Bodys(reducedCollisions.lastIndex(), reducedFullTracksPIDIU.lastIndex() - 2, reducedFullTracksPIDIU.lastIndex() - 1, reducedFullTracksPIDIU.lastIndex()); + const auto trackStartIndex = reducedFullTracksPIDIU.lastIndex(); + reducedDecay3Bodys(collisionIndex, trackStartIndex - 2, trackStartIndex - 1, trackStartIndex); } registry.fill(HIST("hEventCounter"), 3.5, reducedCollisions.lastIndex() + 1); From cb0b14c8366fcc77e4caf99c0b7830b3f9fa62b6 Mon Sep 17 00:00:00 2001 From: Chuntai <48704924+wuctlby@users.noreply.github.com> Date: Tue, 18 Feb 2025 14:32:22 +0100 Subject: [PATCH 0292/1650] [PWGHF] add the THnSparse of resolution with occupancy (#10025) Co-authored-by: ALICE Action Bot --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 83 +++++++++++++++++------- 1 file changed, 58 insertions(+), 25 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index a154b416b2b..7c79e56010b 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -65,6 +65,7 @@ struct HfTaskFlowCharmHadrons { Configurable centralityMax{"centralityMax", 100., "Maximum centrality accepted in SP/EP computation (not applied in resolution process)"}; Configurable storeEP{"storeEP", false, "Flag to store EP-related axis"}; Configurable storeMl{"storeMl", false, "Flag to store ML scores"}; + Configurable storeResoOccu{"storeResoOccu", false, "Flag to store Occupancy in resolution ThnSparse"}; Configurable occEstimator{"occEstimator", 0, "Occupancy estimation (0: None, 1: ITS, 2: FT0C)"}; Configurable saveEpResoHisto{"saveEpResoHisto", false, "Flag to save event plane resolution histogram"}; Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; @@ -85,6 +86,9 @@ struct HfTaskFlowCharmHadrons { ConfigurableAxis thnConfigAxisNoCollInTimeRangeNarrow{"thnConfigAxisNoCollInTimeRangeNarrow", {2, 0, 2}, ""}; ConfigurableAxis thnConfigAxisNoCollInTimeRangeStandard{"thnConfigAxisNoCollInTimeRangeStandard", {2, 0, 2}, ""}; ConfigurableAxis thnConfigAxisNoCollInRofStandard{"thnConfigAxisNoCollInRofStandard", {2, 0, 2}, ""}; + ConfigurableAxis thnConfigAxisResoFT0cFV0a{"thnConfigAxisResoFT0cFV0a", {160, -8, 8}, ""}; + ConfigurableAxis thnConfigAxisResoFT0cTPCtot{"thnConfigAxisResoFT0cTPCtot", {160, -8, 8}, ""}; + ConfigurableAxis thnConfigAxisResoFV0aTPCtot{"thnConfigAxisResoFV0aTPCtot", {160, -8, 8}, ""}; using CandDsDataWMl = soa::Filtered>; using CandDsData = soa::Filtered>; @@ -124,6 +128,9 @@ struct HfTaskFlowCharmHadrons { void init(InitContext&) { + if (storeResoOccu && occEstimator == 0) { + LOGP(fatal, "Occupancy estimation must be enabled to store resolution THnSparse! Please check your configuration!"); + } const AxisSpec thnAxisInvMass{thnConfigAxisInvMass, "Inv. mass (GeV/#it{c}^{2})"}; const AxisSpec thnAxisPt{thnConfigAxisPt, "#it{p}_{T} (GeV/#it{c})"}; const AxisSpec thnAxisCent{thnConfigAxisCent, "Centrality"}; @@ -139,6 +146,10 @@ struct HfTaskFlowCharmHadrons { const AxisSpec thnAxisNoCollInTimeRangeNarrow{thnConfigAxisNoCollInTimeRangeNarrow, "NoCollInTimeRangeNarrow"}; const AxisSpec thnAxisNoCollInTimeRangeStandard{thnConfigAxisNoCollInTimeRangeStandard, "NoCollInTimeRangeStandard"}; const AxisSpec thnAxisNoCollInRofStandard{thnConfigAxisNoCollInRofStandard, "NoCollInRofStandard"}; + // TODO: currently only the Q vector of FT0c FV0a and TPCtot are considered + const AxisSpec thnAxisResoFT0cFV0a{thnConfigAxisResoFT0cFV0a, "Q_{FT0c} #bullet Q_{FV0a}"}; + const AxisSpec thnAxisResoFT0cTPCtot{thnConfigAxisResoFT0cTPCtot, "Q_{FT0c} #bullet Q_{TPCtot}"}; + const AxisSpec thnAxisResoFV0aTPCtot{thnConfigAxisResoFV0aTPCtot, "Q_{FV0a} #bullet Q_{TPCtot}"}; std::vector axes = {thnAxisInvMass, thnAxisPt, thnAxisCent, thnAxisScalarProd}; if (storeEP) { @@ -201,6 +212,18 @@ struct HfTaskFlowCharmHadrons { registry.add("epReso/hEpResoTPCposTPCneg", "hEpResoTPCposTPCneg; centrality; #Delta#Psi_{sub}", {HistType::kTH2F, {thnAxisCent, thnAxisCosNPhi}}); } + if (storeResoOccu) { + std::vector axes_reso = {thnAxisCent, thnAxisResoFT0cFV0a, thnAxisResoFT0cTPCtot, thnAxisResoFV0aTPCtot}; + if (occEstimator == 1) { + axes_reso.insert(axes_reso.end(), {thnAxisOccupancyITS, thnAxisNoSameBunchPileup, thnAxisOccupancy, + thnAxisNoCollInTimeRangeNarrow, thnAxisNoCollInTimeRangeStandard, thnAxisNoCollInRofStandard}); + } else { + axes_reso.insert(axes_reso.end(), {thnAxisOccupancyFT0C, thnAxisNoSameBunchPileup, thnAxisOccupancy, + thnAxisNoCollInTimeRangeNarrow, thnAxisNoCollInTimeRangeStandard, thnAxisNoCollInRofStandard}); + } + registry.add("spReso/hSparseReso", "THn for resolution with occupancy", HistType::kTHnSparseF, axes_reso); + } + hfEvSel.addHistograms(registry); // collision monitoring ccdb->setURL(ccdbUrl); ccdb->setCaching(true); @@ -260,6 +283,18 @@ struct HfTaskFlowCharmHadrons { return deltaPsi; } + /// Get the event selection flags + /// \param hfevselflag is the event selection flag + std::vector getEventSelectionFlags(uint16_t hfevselflag) + { + return { + TESTBIT(hfevselflag, o2::hf_evsel::EventRejection::NoSameBunchPileup), + TESTBIT(hfevselflag, o2::hf_evsel::EventRejection::Occupancy), + TESTBIT(hfevselflag, o2::hf_evsel::EventRejection::NoCollInTimeRangeNarrow), + TESTBIT(hfevselflag, o2::hf_evsel::EventRejection::NoCollInTimeRangeStandard), + TESTBIT(hfevselflag, o2::hf_evsel::EventRejection::NoCollInRofStandard)}; + } + /// Fill THnSparse /// \param mass is the invariant mass of the candidate /// \param pt is the transverse momentum of the candidate @@ -281,37 +316,22 @@ struct HfTaskFlowCharmHadrons { uint16_t& hfevselflag) { if (occEstimator != 0) { + std::vector evtSelFlags = getEventSelectionFlags(hfevselflag); if (storeMl) { if (storeEP) { registry.fill(HIST("hSparseFlowCharm"), mass, pt, cent, sp, cosNPhi, cosDeltaPhi, outputMl[0], outputMl[1], occupancy, - TESTBIT(hfevselflag, o2::hf_evsel::EventRejection::NoSameBunchPileup), - TESTBIT(hfevselflag, o2::hf_evsel::EventRejection::Occupancy), - TESTBIT(hfevselflag, o2::hf_evsel::EventRejection::NoCollInTimeRangeNarrow), - TESTBIT(hfevselflag, o2::hf_evsel::EventRejection::NoCollInTimeRangeStandard), - TESTBIT(hfevselflag, o2::hf_evsel::EventRejection::NoCollInRofStandard)); + evtSelFlags[0], evtSelFlags[1], evtSelFlags[2], evtSelFlags[3], evtSelFlags[4]); } else { registry.fill(HIST("hSparseFlowCharm"), mass, pt, cent, sp, outputMl[0], outputMl[1], occupancy, - TESTBIT(hfevselflag, o2::hf_evsel::EventRejection::NoSameBunchPileup), - TESTBIT(hfevselflag, o2::hf_evsel::EventRejection::Occupancy), - TESTBIT(hfevselflag, o2::hf_evsel::EventRejection::NoCollInTimeRangeNarrow), - TESTBIT(hfevselflag, o2::hf_evsel::EventRejection::NoCollInTimeRangeStandard), - TESTBIT(hfevselflag, o2::hf_evsel::EventRejection::NoCollInRofStandard)); + evtSelFlags[0], evtSelFlags[1], evtSelFlags[2], evtSelFlags[3], evtSelFlags[4]); } } else { if (storeEP) { registry.fill(HIST("hSparseFlowCharm"), mass, pt, cent, sp, cosNPhi, cosDeltaPhi, occupancy, - TESTBIT(hfevselflag, o2::hf_evsel::EventRejection::NoSameBunchPileup), - TESTBIT(hfevselflag, o2::hf_evsel::EventRejection::Occupancy), - TESTBIT(hfevselflag, o2::hf_evsel::EventRejection::NoCollInTimeRangeNarrow), - TESTBIT(hfevselflag, o2::hf_evsel::EventRejection::NoCollInTimeRangeStandard), - TESTBIT(hfevselflag, o2::hf_evsel::EventRejection::NoCollInRofStandard)); + evtSelFlags[0], evtSelFlags[1], evtSelFlags[2], evtSelFlags[3], evtSelFlags[4]); } else { registry.fill(HIST("hSparseFlowCharm"), mass, pt, cent, sp, occupancy, - TESTBIT(hfevselflag, o2::hf_evsel::EventRejection::NoSameBunchPileup), - TESTBIT(hfevselflag, o2::hf_evsel::EventRejection::Occupancy), - TESTBIT(hfevselflag, o2::hf_evsel::EventRejection::NoCollInTimeRangeNarrow), - TESTBIT(hfevselflag, o2::hf_evsel::EventRejection::NoCollInTimeRangeStandard), - TESTBIT(hfevselflag, o2::hf_evsel::EventRejection::NoCollInRofStandard)); + evtSelFlags[0], evtSelFlags[1], evtSelFlags[2], evtSelFlags[3], evtSelFlags[4]); } } } else { @@ -607,11 +627,6 @@ struct HfTaskFlowCharmHadrons { aod::BCsWithTimestamps const& bcs) { float centrality{-1.f}; - if (!isCollSelected(collision, bcs, centrality)) { - // no selection on the centrality is applied on purpose to allow for the resolution study in post-processing - return; - } - float xQVecFT0a = collision.qvecFT0ARe(); float yQVecFT0a = collision.qvecFT0AIm(); float xQVecFT0c = collision.qvecFT0CRe(); @@ -627,6 +642,24 @@ struct HfTaskFlowCharmHadrons { float xQVecBTot = collision.qvecBTotRe(); float yQVecBTot = collision.qvecBTotIm(); + centrality = o2::hf_centrality::getCentralityColl(collision, o2::hf_centrality::CentralityEstimator::FT0C); + if (storeResoOccu) { + float occupancy{-1.f}; + occupancy = getOccupancyColl(collision, occEstimator); + registry.fill(HIST("trackOccVsFT0COcc"), collision.trackOccupancyInTimeRange(), collision.ft0cOccupancyInTimeRange()); + uint16_t hfevflag = hfEvSel.getHfCollisionRejectionMask(collision, centrality, ccdb, registry); + std::vector evtSelFlags = getEventSelectionFlags(hfevflag); + registry.fill(HIST("spReso/hSparseReso"), centrality, xQVecFT0c * xQVecFV0a + yQVecFT0c * yQVecFV0a, + xQVecFT0c * xQVecBTot + yQVecFT0c * yQVecBTot, + xQVecFV0a * xQVecBTot + yQVecFV0a * yQVecBTot, + occupancy, evtSelFlags[0], evtSelFlags[1], evtSelFlags[2], evtSelFlags[3], evtSelFlags[4]); + } + + if (!isCollSelected(collision, bcs, centrality)) { + // no selection on the centrality is applied, but on event selection flags + return; + } + registry.fill(HIST("spReso/hSpResoFT0cFT0a"), centrality, xQVecFT0c * xQVecFT0a + yQVecFT0c * yQVecFT0a); registry.fill(HIST("spReso/hSpResoFT0cFV0a"), centrality, xQVecFT0c * xQVecFV0a + yQVecFT0c * yQVecFV0a); registry.fill(HIST("spReso/hSpResoFT0cTPCpos"), centrality, xQVecFT0c * xQVecBPos + yQVecFT0c * yQVecBPos); From 27dc669cbe6b97d723afbd9f16b5012672c72b12 Mon Sep 17 00:00:00 2001 From: feisenhu <53603353+feisenhu@users.noreply.github.com> Date: Tue, 18 Feb 2025 18:01:24 +0100 Subject: [PATCH 0293/1650] [PWGEM] DileptonMC: differentiate between PromptPi0 and NonPromptPi0 (#10043) --- PWGEM/Dilepton/Core/DileptonMC.h | 50 ++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/PWGEM/Dilepton/Core/DileptonMC.h b/PWGEM/Dilepton/Core/DileptonMC.h index bb4920c0888..8c72345639f 100644 --- a/PWGEM/Dilepton/Core/DileptonMC.h +++ b/PWGEM/Dilepton/Core/DileptonMC.h @@ -344,18 +344,19 @@ struct DileptonMC { const AxisSpec axis_dphi_e_ee{cfg_nbin_dphi_e_ee, 0, M_PI, "#Delta#varphi = #varphi_{l} - #varphi_{ll} (rad.)"}; // for kUPC // generated info - fRegistry.add("Generated/sm/Pi0/hs", "gen. dilepton signal", kTHnSparseD, {axis_mass, axis_pt, axis_y, axis_dphi_ee, axis_deta_ee, axis_cos_theta_cs, axis_phi_cs, axis_aco, axis_asym_pt, axis_dphi_e_ee}, true); - fRegistry.addClone("Generated/sm/Pi0/", "Generated/sm/Eta/"); - fRegistry.addClone("Generated/sm/Pi0/", "Generated/sm/EtaPrime/"); - fRegistry.addClone("Generated/sm/Pi0/", "Generated/sm/Rho/"); - fRegistry.addClone("Generated/sm/Pi0/", "Generated/sm/Omega/"); - fRegistry.addClone("Generated/sm/Pi0/", "Generated/sm/Omega2ll/"); - fRegistry.addClone("Generated/sm/Pi0/", "Generated/sm/Phi/"); - fRegistry.addClone("Generated/sm/Pi0/", "Generated/sm/Phi2ll/"); - fRegistry.addClone("Generated/sm/Pi0/", "Generated/sm/PromptJPsi/"); - fRegistry.addClone("Generated/sm/Pi0/", "Generated/sm/NonPromptJPsi/"); - fRegistry.addClone("Generated/sm/Pi0/", "Generated/sm/PromptPsi2S/"); - fRegistry.addClone("Generated/sm/Pi0/", "Generated/sm/NonPromptPsi2S/"); + fRegistry.add("Generated/sm/PromptPi0/hs", "gen. dilepton signal", kTHnSparseD, {axis_mass, axis_pt, axis_y, axis_dphi_ee, axis_deta_ee, axis_cos_theta_cs, axis_phi_cs, axis_aco, axis_asym_pt, axis_dphi_e_ee}, true); + fRegistry.addClone("Generated/sm/PromptPi0/", "Generated/sm/NonPromptPi0/"); + fRegistry.addClone("Generated/sm/PromptPi0/", "Generated/sm/Eta/"); + fRegistry.addClone("Generated/sm/PromptPi0/", "Generated/sm/EtaPrime/"); + fRegistry.addClone("Generated/sm/PromptPi0/", "Generated/sm/Rho/"); + fRegistry.addClone("Generated/sm/PromptPi0/", "Generated/sm/Omega/"); + fRegistry.addClone("Generated/sm/PromptPi0/", "Generated/sm/Omega2ll/"); + fRegistry.addClone("Generated/sm/PromptPi0/", "Generated/sm/Phi/"); + fRegistry.addClone("Generated/sm/PromptPi0/", "Generated/sm/Phi2ll/"); + fRegistry.addClone("Generated/sm/PromptPi0/", "Generated/sm/PromptJPsi/"); + fRegistry.addClone("Generated/sm/PromptPi0/", "Generated/sm/NonPromptJPsi/"); + fRegistry.addClone("Generated/sm/PromptPi0/", "Generated/sm/PromptPsi2S/"); + fRegistry.addClone("Generated/sm/PromptPi0/", "Generated/sm/NonPromptPsi2S/"); fRegistry.add("Generated/sm/Omega2ll/hPtY", "pT of #omega meson", kTH2F, {axis_y_meson, axis_pt_meson}, true); fRegistry.add("Generated/sm/Phi2ll/hPtY", "pT of #phi meson", kTH2F, {axis_y_meson, axis_pt_meson}, true); @@ -402,7 +403,8 @@ struct DileptonMC { // reconstructed pair info fRegistry.add("Pair/sm/Photon/hs", "rec. dilepton signal", kTHnSparseD, {axis_mass, axis_pt, axis_y, axis_dphi_ee, axis_deta_ee, axis_cos_theta_cs, axis_phi_cs, axis_aco, axis_asym_pt, axis_dphi_e_ee, axis_dca}, true); - fRegistry.addClone("Pair/sm/Photon/", "Pair/sm/Pi0/"); + fRegistry.addClone("Pair/sm/Photon/", "Pair/sm/PromptPi0/"); + fRegistry.addClone("Pair/sm/Photon/", "Pair/sm/NonPromptPi0/"); fRegistry.addClone("Pair/sm/Photon/", "Pair/sm/Eta/"); fRegistry.addClone("Pair/sm/Photon/", "Pair/sm/EtaPrime/"); fRegistry.addClone("Pair/sm/Photon/", "Pair/sm/Rho/"); @@ -418,7 +420,8 @@ struct DileptonMC { if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { fRegistry.add("Pair/sm/Photon/hMvsPhiV", "m_{ee} vs. #varphi_{V};#varphi (rad.);m_{ee} (GeV/c^{2})", kTH2F, {{90, 0, M_PI}, {100, 0.0f, 1.0f}}, true); fRegistry.add("Pair/sm/Photon/hMvsRxy", "m_{ee} vs. r_{xy};r_{xy}^{true} (cm);m_{ee} (GeV/c^{2})", kTH2F, {{100, 0, 100}, {100, 0.0f, 1.0f}}, true); - fRegistry.add("Pair/sm/Pi0/hMvsPhiV", "m_{ee} vs. #varphi_{V};#varphi (rad.);m_{ee} (GeV/c^{2})", kTH2F, {{90, 0, M_PI}, {100, 0.0f, 1.0f}}, true); + fRegistry.add("Pair/sm/PromptPi0/hMvsPhiV", "m_{ee} vs. #varphi_{V};#varphi (rad.);m_{ee} (GeV/c^{2})", kTH2F, {{90, 0, M_PI}, {100, 0.0f, 1.0f}}, true); + fRegistry.add("Pair/sm/NonPromptPi0/hMvsPhiV", "m_{ee} vs. #varphi_{V};#varphi (rad.);m_{ee} (GeV/c^{2})", kTH2F, {{90, 0, M_PI}, {100, 0.0f, 1.0f}}, true); } fRegistry.add("Pair/ccbar/c2l_c2l/hadron_hadron/hs", "hs pair", kTHnSparseD, {axis_mass, axis_pt, axis_y, axis_dphi_ee, axis_deta_ee, axis_cos_theta_cs, axis_phi_cs, axis_aco, axis_asym_pt, axis_dphi_e_ee, axis_dca}, true); @@ -967,9 +970,16 @@ struct DileptonMC { if ((t1mc.isPhysicalPrimary() || t1mc.producedByGenerator()) && (t2mc.isPhysicalPrimary() || t2mc.producedByGenerator())) { switch (abs(mcmother.pdgCode())) { case 111: - fRegistry.fill(HIST("Pair/sm/Pi0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); - if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { - fRegistry.fill(HIST("Pair/sm/Pi0/hMvsPhiV"), phiv, v12.M()); + if (IsFromCharm(mcmother, mcparticles) < 0 && IsFromBeauty(mcmother, mcparticles) < 0) { // prompt pi0 + fRegistry.fill(HIST("Pair/sm/PromptPi0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { + fRegistry.fill(HIST("Pair/sm/PromptPi0/hMvsPhiV"), phiv, v12.M()); + } + } else { // non-prompt pi0 + fRegistry.fill(HIST("Pair/sm/NonPromptPi0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { + fRegistry.fill(HIST("Pair/sm/NonPromptPi0/hMvsPhiV"), phiv, v12.M()); + } } break; case 221: @@ -1370,7 +1380,11 @@ struct DileptonMC { switch (abs(mcmother.pdgCode())) { case 111: - fRegistry.fill(HIST("Generated/sm/Pi0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + if (IsFromCharm(mcmother, mcparticles) < 0 && IsFromBeauty(mcmother, mcparticles) < 0) { // prompt pi0 + fRegistry.fill(HIST("Generated/sm/PromptPi0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + } else { // non-prompt pi0 + fRegistry.fill(HIST("Generated/sm/NonPromptPi0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + } break; case 221: fRegistry.fill(HIST("Generated/sm/Eta/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); From 25d5e873029164268071e8b54182d8743b6539ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Tue, 18 Feb 2025 18:07:00 +0100 Subject: [PATCH 0294/1650] [PWGHF] change the tag value of reflection case for D0 bar in Tcc tree creator (#10040) --- PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx b/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx index 56c7eed26eb..e50597e7c9f 100644 --- a/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx +++ b/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx @@ -292,7 +292,7 @@ struct HfTreeCreatorTccToD0D0Pi { std::copy(candidateD1.mlProbD0().begin(), candidateD1.mlProbD0().end(), std::back_inserter(mlScoresD1)); massD01 = hfHelper.invMassD0ToPiK(candidateD1); } else if (candidateD1.isSelD0bar()) { - candFlagD1 = (candidateD1.isSelD0()) ? 3 : 2; + candFlagD1 = (candidateD1.isSelD0()) ? 4 : 2; std::copy(candidateD1.mlProbD0bar().begin(), candidateD1.mlProbD0bar().end(), std::back_inserter(mlScoresD1)); massD01 = hfHelper.invMassD0barToKPi(candidateD1); } @@ -303,7 +303,7 @@ struct HfTreeCreatorTccToD0D0Pi { massD02 = hfHelper.invMassD0ToPiK(candidateD2); } else if (candidateD2.isSelD0bar()) { - candFlagD2 = (candidateD2.isSelD0()) ? 3 : 2; + candFlagD2 = (candidateD2.isSelD0()) ? 4 : 2; std::copy(candidateD2.mlProbD0bar().begin(), candidateD2.mlProbD0bar().end(), std::back_inserter(mlScoresD2)); massD02 = hfHelper.invMassD0barToKPi(candidateD2); } From fc8c7f71b2dcc98576058ecb4db4d728c463ddc4 Mon Sep 17 00:00:00 2001 From: alcaliva <32872606+alcaliva@users.noreply.github.com> Date: Tue, 18 Feb 2025 19:13:34 +0100 Subject: [PATCH 0295/1650] [PWGLF] added QC histo and configurable eta gap (#10047) --- PWGLF/Tasks/Nuspex/antinucleiInJets.cxx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx index b3f576b3013..eb33686a64d 100644 --- a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx +++ b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx @@ -88,6 +88,7 @@ struct AntinucleiInJets { Configurable minJetPt{"minJetPt", 10.0, "Minimum pt of the jet"}; Configurable rJet{"rJet", 0.3, "Jet resolution parameter R"}; Configurable zVtx{"zVtx", 10.0, "Maximum zVertex"}; + Configurable deltaEtaEdge{"deltaEtaEdge", 0.05, "eta gap from the edge"}; // track parameters Configurable requirePvContributor{"requirePvContributor", false, "require that the track is a PV contributor"}; @@ -156,6 +157,7 @@ struct AntinucleiInJets { registryQC.add("nJetsInAcceptance", "nJetsInAcceptance", HistType::kTH1F, {{50, 0, 50, "#it{n}_{Jet}"}}); registryQC.add("nJetsSelectedHighPt", "nJetsSelectedHighPt", HistType::kTH1F, {{50, 0, 50, "#it{n}_{Jet}"}}); registryQC.add("jetEffectiveArea", "jetEffectiveArea", HistType::kTH1F, {{2000, 0, 2, "Area/#piR^{2}"}}); + registryQC.add("jetPtDifference", "jetPtDifference", HistType::kTH1F, {{200, -1, 1, "#Deltap_{T}^{jet}"}}); } // event counter MC @@ -451,7 +453,7 @@ struct AntinucleiInJets { for (auto& jet : jets) { // o2-linter: disable=[const-ref-in-for-loop] // jet must be fully contained in the acceptance - if ((std::fabs(jet.eta()) + rJet) > (maxEta - 0.05)) + if ((std::fabs(jet.eta()) + rJet) > (maxEta - deltaEtaEdge)) continue; // jet pt must be larger than threshold @@ -676,13 +678,17 @@ struct AntinucleiInJets { for (auto& jet : jets) { // o2-linter: disable=[const-ref-in-for-loop] // jet must be fully contained in the acceptance - if ((std::fabs(jet.eta()) + rJet) > (maxEta - 0.05)) + if ((std::fabs(jet.eta()) + rJet) > (maxEta - deltaEtaEdge)) continue; njetsInAcc++; registryQC.fill(HIST("sumPtJetCone"), jet.pt()); + double ptJetBeforeSub = jet.pt(); // jet pt must be larger than threshold fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jet, rhoPerp, rhoMPerp); + double ptJetAfterSub = jet.pt(); + registryQC.fill(HIST("jetPtDifference"), ptJetAfterSub - ptJetBeforeSub); + if (getCorrectedPt(jetMinusBkg.pt()) < minJetPt) continue; njetsHighPt++; From ca05de110ff7962e6066addfd1cef7cb53ce92f2 Mon Sep 17 00:00:00 2001 From: Marvin Hemmer <53471402+mhemmer-cern@users.noreply.github.com> Date: Tue, 18 Feb 2025 19:49:11 +0100 Subject: [PATCH 0296/1650] =?UTF-8?q?[PWGEM,PWGEM-36]=20Pi0=20Flow=20Task:?= =?UTF-8?q?=20Enable=20running=20Mixed=20and=20rotation=20tog=E2=80=A6=20(?= =?UTF-8?q?#10050)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PWGEM/PhotonMeson/Tasks/taskPi0FlowEMC.cxx | 160 +++++++++++++++++---- 1 file changed, 133 insertions(+), 27 deletions(-) diff --git a/PWGEM/PhotonMeson/Tasks/taskPi0FlowEMC.cxx b/PWGEM/PhotonMeson/Tasks/taskPi0FlowEMC.cxx index 774d8aef80b..360638f4f12 100644 --- a/PWGEM/PhotonMeson/Tasks/taskPi0FlowEMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/taskPi0FlowEMC.cxx @@ -95,14 +95,16 @@ struct TaskPi0FlowEMC { Configurable cfgEMCalMapLevelSameEvent{"cfgEMCalMapLevelSameEvent", 1, "Different levels of correction for the same event, the smaller number includes the level of the higher number (4: none, 3: only inside EMCal, 2: exclude bad channels, 1: remove edges)"}; Configurable cfgRotAngle{"cfgRotAngle", std::move(const_cast(o2::constants::math::PIHalf)), "Angle used for the rotation method"}; Configurable cfgDistanceToEdge{"cfgDistanceToEdge", 1, "Distance to edge in cells required for rotated cluster to be accepted"}; + Configurable cfgDoM02{"cfgDoM02", false, "Flag to enable flow vs M02 for single photons"}; // configurable axis - ConfigurableAxis thnConfigAxisInvMass{"thnConfigAxisInvMass", {200, 0.0, 0.4}, ""}; + ConfigurableAxis thnConfigAxisInvMass{"thnConfigAxisInvMass", {400, 0.0, 0.8}, ""}; ConfigurableAxis thnConfigAxisPt{"thnConfigAxisPt", {100, 0., 20.}, ""}; ConfigurableAxis thnConfigAxisCent{"thnConfigAxisCent", {20, 0., 100.}, ""}; ConfigurableAxis thnConfigAxisCosNPhi{"thnConfigAxisCosNPhi", {100, -1., 1.}, ""}; ConfigurableAxis thnConfigAxisCosDeltaPhi{"thnConfigAxisCosDeltaPhi", {100, -1., 1.}, ""}; ConfigurableAxis thnConfigAxisScalarProd{"thnConfigAxisScalarProd", {100, -5., 5.}, ""}; + ConfigurableAxis thnConfigAxisM02{"thnConfigAxisM02", {200, 0., 5.}, ""}; EMPhotonEventCut fEMEventCut; struct : ConfigurableGroup { @@ -276,6 +278,7 @@ struct TaskPi0FlowEMC { const AxisSpec thnAxisCosNPhi{thnConfigAxisCosNPhi, Form("cos(%d#varphi)", harmonic.value)}; const AxisSpec thnAxisCosDeltaPhi{thnConfigAxisCosDeltaPhi, Form("cos(%d(#varphi - #Psi_{sub}))", harmonic.value)}; const AxisSpec thnAxisScalarProd{thnConfigAxisScalarProd, "SP"}; + const AxisSpec thnAxisM02{thnConfigAxisM02, "M_{02}"}; const AxisSpec thAxisTanThetaPhi{mesonConfig.thConfigAxisTanThetaPhi, "atan(#Delta#theta/#Delta#varphi)"}; const AxisSpec thAxisClusterEnergy{thnConfigAxisPt, "#it{E} (GeV)"}; const AxisSpec thAxisAlpha{100, -1., +1, "#alpha"}; @@ -291,8 +294,14 @@ struct TaskPi0FlowEMC { const AxisSpec thAxisSN{8, 0.5, 8.5, "#it{s}_{n}"}; const AxisSpec thAxisCPUTime{1000, 0, 10000, "#it{t} (#mus)"}; + const AxisSpec thnAxisMixingVtx{mixingConfig.cfgVtxBins, "#it{z} (cm)"}; + const AxisSpec thnAxisMixingCent{mixingConfig.cfgCentBins, "Centrality (%)"}; + const AxisSpec thnAxisMixingEP{mixingConfig.cfgEPBins, Form("cos(%d#varphi)", harmonic.value)}; + registry.add("hSparsePi0Flow", "THn for SP", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisCent, thnAxisScalarProd}); - registry.add("hSparseBkgFlow", "THn for SP", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisCent, thnAxisScalarProd}); + registry.add("hSparseBkgRotFlow", "THn for SP", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisCent, thnAxisScalarProd}); + registry.add("hSparseBkgMixFlow", "THn for SP", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisCent, thnAxisScalarProd}); + registry.add("h3DMixingCount", "THn Event Mixing QA", HistType::kTH3D, {thnAxisMixingVtx, thnAxisMixingCent, thnAxisMixingEP}); auto hClusterCuts = registry.add("hClusterCuts", "hClusterCuts;;Counts", kTH1D, {{6, 0.5, 6.5}}, false); hClusterCuts->GetXaxis()->SetBinLabel(1, "in"); hClusterCuts->GetXaxis()->SetBinLabel(2, "opening angle"); @@ -301,6 +310,14 @@ struct TaskPi0FlowEMC { hClusterCuts->GetXaxis()->SetBinLabel(5, "conversion cut"); hClusterCuts->GetXaxis()->SetBinLabel(6, "out"); + auto hClusterCutsMixed = registry.add("hClusterCutsMixed", "hClusterCutsMixed;;Counts", kTH1D, {{6, 0.5, 6.5}}, false); + hClusterCutsMixed->GetXaxis()->SetBinLabel(1, "in"); + hClusterCutsMixed->GetXaxis()->SetBinLabel(2, "opening angle"); + hClusterCutsMixed->GetXaxis()->SetBinLabel(3, "#it{M}_{#gamma#gamma}"); + hClusterCutsMixed->GetXaxis()->SetBinLabel(4, "#it{p}_{T}"); + hClusterCutsMixed->GetXaxis()->SetBinLabel(5, "conversion cut"); + hClusterCutsMixed->GetXaxis()->SetBinLabel(6, "out"); + if (saveSPResoHist) { registry.add("spReso/hSpResoFT0cFT0a", "hSpResoFT0cFT0a; centrality; Q_{FT0c} #bullet Q_{FT0a}", HistType::kTH2D, {thnAxisCent, thnConfigAxisScalarProd}); registry.add("spReso/hSpResoFT0cTPCpos", "hSpResoFT0cTPCpos; centrality; Q_{FT0c} #bullet Q_{TPCpos}", HistType::kTH2D, {thnAxisCent, thnConfigAxisScalarProd}); @@ -352,10 +369,6 @@ struct TaskPi0FlowEMC { hCollisionEMCCheck->GetXaxis()->SetBinLabel(5, "EMC MB Readout but no clusters"); hCollisionEMCCheck->GetXaxis()->SetBinLabel(6, "No EMC MB Readout but has clusters"); hCollisionEMCCheck->GetXaxis()->SetBinLabel(7, "No EMC MB Readout and no clusters"); - registry.add("LED/hMult", "multiplicity in LED events", HistType::kTH1D, {thAxisMult}); - registry.add("LED/hClusterEtaPhi", "hClusterEtaPhi", HistType::kTH2D, {thAxisPhi, thAxisEta}); - registry.add("LED/clusterTimeVsE", "Cluster time vs energy", HistType::kTH2D, {thAxisTime, thAxisEnergy}); - registry.add("LED/hNCell", "hNCell", HistType::kTH1D, {thAxisNCell}); } if (emccuts.cfgEnableQA) { @@ -369,6 +382,11 @@ struct TaskPi0FlowEMC { registry.add("hAlphaPt", "Histo of meson asymmetry vs pT", HistType::kTH2D, {thAxisAlpha, thnAxisPt}); registry.add("mesonQA/hClusterEtaPhiBefore", "hClusterEtaPhiBefore", HistType::kTH2D, {thAxisPhi, thAxisEta}); registry.add("mesonQA/hClusterEtaPhiAfter", "hClusterEtaPhiAfter", HistType::kTH2D, {thAxisPhi, thAxisEta}); + registry.add("hInvMassPtMixed", "Histo for inv pair mass vs pt for mixed event", HistType::kTH2D, {thnAxisInvMass, thnAxisPt}); + registry.add("hTanThetaPhiMixed", "Histo for identification of conversion cluster for mixed event", HistType::kTH2D, {thnAxisInvMass, thAxisTanThetaPhi}); + registry.add("hAlphaPtMixed", "Histo of meson asymmetry vs pT for mixed event", HistType::kTH2D, {thAxisAlpha, thnAxisPt}); + registry.add("mesonQA/hClusterEtaPhiBeforeMixed", "hClusterEtaPhiBefore for mixed event", HistType::kTH2D, {thAxisPhi, thAxisEta}); + registry.add("mesonQA/hClusterEtaPhiAfterMixed", "hClusterEtaPhiAfter for mixed event", HistType::kTH2D, {thAxisPhi, thAxisEta}); if (cfgDoRotation) { registry.add("mesonQA/hClusterBackEtaPhiBefore", "hClusterBackEtaPhiBefore", HistType::kTH2D, {thAxisPhi, thAxisEta}); registry.add("mesonQA/hClusterBackEtaPhiAfter", "hClusterBackEtaPhiAfter", HistType::kTH2D, {thAxisPhi, thAxisEta}); @@ -380,6 +398,10 @@ struct TaskPi0FlowEMC { registry.add("hSparseCalibBack", "THn for Calib background", HistType::kTHnSparseF, {thnAxisInvMass, thAxisEnergyCalib, thnAxisCent}); } + if (cfgDoM02.value) { + registry.add("hSparseFlow", "THn for SP", HistType::kTHnSparseF, {thnAxisM02, thnAxisPt, thnAxisCent, thnAxisScalarProd}); + } + ccdb->setURL(ccdbUrl); ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); @@ -417,7 +439,7 @@ struct TaskPi0FlowEMC { float& cent, float& sp) { - static constexpr std::string_view HistTypes[2] = {"hSparsePi0Flow", "hSparseBkgFlow"}; + static constexpr std::string_view HistTypes[3] = {"hSparsePi0Flow", "hSparseBkgRotFlow", "hSparseBkgMixFlow"}; registry.fill(HIST(HistTypes[histType]), mass, pt, cent, sp); } @@ -693,10 +715,10 @@ struct TaskPi0FlowEMC { float dTheta = photon1.Theta() - photon3.Theta(); float dPhi = photon1.Phi() - photon3.Phi(); if (mesonConfig.enableTanThetadPhi && mesonConfig.minTanThetadPhi > std::fabs(getAngleDegree(std::atan(dTheta / dPhi)))) { - registry.fill(HIST("hSparseBkgFlow"), mother1.M(), mother1.Pt(), cent, scalprodCand1); + registry.fill(HIST("hSparseBkgRotFlow"), mother1.M(), mother1.Pt(), cent, scalprodCand1); } } else { - registry.fill(HIST("hSparseBkgFlow"), mother1.M(), mother1.Pt(), cent, scalprodCand1); + registry.fill(HIST("hSparseBkgRotFlow"), mother1.M(), mother1.Pt(), cent, scalprodCand1); } } } @@ -716,10 +738,10 @@ struct TaskPi0FlowEMC { float dTheta = photon2.Theta() - photon3.Theta(); float dPhi = photon2.Phi() - photon3.Phi(); if (mesonConfig.enableTanThetadPhi && mesonConfig.minTanThetadPhi > std::fabs(getAngleDegree(std::atan(dTheta / dPhi)))) { - registry.fill(HIST("hSparseBkgFlow"), mother2.M(), mother2.Pt(), cent, scalprodCand2); + registry.fill(HIST("hSparseBkgRotFlow"), mother2.M(), mother2.Pt(), cent, scalprodCand2); } } else { - registry.fill(HIST("hSparseBkgFlow"), mother2.M(), mother2.Pt(), cent, scalprodCand2); + registry.fill(HIST("hSparseBkgRotFlow"), mother2.M(), mother2.Pt(), cent, scalprodCand2); } } } @@ -853,12 +875,6 @@ struct TaskPi0FlowEMC { if (photonsPerCollision.size() > 0) { registry.fill(HIST("hCollisionEMCCheck"), 3.); // has EMC cluster registry.fill(HIST("hCollisionEMCCheck"), 6.); // has no EMC read out and clusters - registry.fill(HIST("LED/hMult"), collision.multFT0C()); - for (const auto& photon : photonsPerCollision) { - registry.fill(HIST("LED/hClusterEtaPhi"), photon.phi(), photon.eta()); - registry.fill(HIST("LED/clusterTimeVsE"), photon.time(), photon.e()); - registry.fill(HIST("LED/hNCell"), photon.nCells()); - } } else { registry.fill(HIST("hCollisionEMCCheck"), 7.); // has no EMC read out and no clusters } @@ -1004,6 +1020,7 @@ struct TaskPi0FlowEMC { initCCDB(c1); runBefore = runNow; } + registry.fill(HIST("h3DMixingCount"), c1.posZ(), getCentrality(c1), c1.ep2ft0m()); for (const auto& [g1, g2] : combinations(CombinationsFullIndexPolicy(clusters1, clusters2))) { if (!(fEMCCut.IsSelected(g1)) || !(fEMCCut.IsSelected(g2))) { continue; @@ -1025,30 +1042,30 @@ struct TaskPi0FlowEMC { float dPhi = v1.Phi() - v2.Phi(); float openingAngle = std::acos(v1.Vect().Dot(v2.Vect()) / (v1.P() * v2.P())); - registry.fill(HIST("hClusterCuts"), 1); + registry.fill(HIST("hClusterCutsMixed"), 1); if (openingAngle <= mesonConfig.minOpenAngle) { - registry.fill(HIST("hClusterCuts"), 2); + registry.fill(HIST("hClusterCutsMixed"), 2); continue; } if (thnConfigAxisInvMass.value[1] > vMeson.M() || thnConfigAxisInvMass.value.back() < vMeson.M()) { - registry.fill(HIST("hClusterCuts"), 3); + registry.fill(HIST("hClusterCutsMixed"), 3); continue; } if (thnConfigAxisPt.value[1] > vMeson.Pt() || thnConfigAxisPt.value.back() < vMeson.Pt()) { - registry.fill(HIST("hClusterCuts"), 4); + registry.fill(HIST("hClusterCutsMixed"), 4); continue; } if (mesonConfig.cfgEnableQA) { - registry.fill(HIST("hInvMassPt"), vMeson.M(), vMeson.Pt()); - registry.fill(HIST("hTanThetaPhi"), vMeson.M(), getAngleDegree(std::atan(dTheta / dPhi))); - registry.fill(HIST("hAlphaPt"), (v1.E() - v2.E()) / (v1.E() + v2.E()), vMeson.Pt()); + registry.fill(HIST("hInvMassPtMixed"), vMeson.M(), vMeson.Pt()); + registry.fill(HIST("hTanThetaPhiMixed"), vMeson.M(), getAngleDegree(std::atan(dTheta / dPhi))); + registry.fill(HIST("hAlphaPtMixed"), (v1.E() - v2.E()) / (v1.E() + v2.E()), vMeson.Pt()); } if (mesonConfig.enableTanThetadPhi && mesonConfig.minTanThetadPhi > std::fabs(getAngleDegree(std::atan(dTheta / dPhi)))) { - registry.fill(HIST("hClusterCuts"), 5); + registry.fill(HIST("hClusterCutsMixed"), 5); continue; } - registry.fill(HIST("hClusterCuts"), 6); - runFlowAnalysis<1>(c1, vMeson); + registry.fill(HIST("hClusterCutsMixed"), 6); + runFlowAnalysis<2>(c1, vMeson); } } } @@ -1283,6 +1300,95 @@ struct TaskPi0FlowEMC { } PROCESS_SWITCH(TaskPi0FlowEMC, processEMCalCalib, "Process EMCal calibration", false); + // Pi0 from EMCal + void processM02(CollsWithQvecs const& collisions, EMCalPhotons const& clusters) + { + for (const auto& collision : collisions) { + auto photonsPerCollision = clusters.sliceBy(perCollisionEMC, collision.globalIndex()); + + if (eventcuts.cfgEnableQA) { + registry.fill(HIST("hCollisionEMCCheck"), 1.); // all + if (collision.alias_bit(kTVXinEMC) == true) { + registry.fill(HIST("hCollisionEMCCheck"), 2.); // has EMC read out + if (photonsPerCollision.size() > 0) { + registry.fill(HIST("hCollisionEMCCheck"), 3.); // has EMC cluster + registry.fill(HIST("hCollisionEMCCheck"), 4.); // has EMC read out and clusters + } else { + registry.fill(HIST("hCollisionEMCCheck"), 5.); // has EMC read out but no clusters + } + } else { + if (photonsPerCollision.size() > 0) { + registry.fill(HIST("hCollisionEMCCheck"), 3.); // has EMC cluster + registry.fill(HIST("hCollisionEMCCheck"), 6.); // has no EMC read out and clusters + } else { + registry.fill(HIST("hCollisionEMCCheck"), 7.); // has no EMC read out and no clusters + } + } + } + o2::aod::pwgem::photonmeson::utils::eventhistogram::fillEventInfo<0>(®istry, collision); + if (!(fEMEventCut.IsSelected(collision))) { + // general event selection + continue; + } + if (!(eventcuts.cfgFT0COccupancyMin <= collision.ft0cOccupancyInTimeRange() && collision.ft0cOccupancyInTimeRange() < eventcuts.cfgFT0COccupancyMax)) { + // occupancy selection + continue; + } + float cent = getCentrality(collision); + if (cent < eventcuts.cfgMinCent || cent > eventcuts.cfgMaxCent) { + // event selection + continue; + } + if (!isQvecGood(getAllQvec(collision))) { + // selection based on QVector + continue; + } + runNow = collision.runNumber(); + if (runNow != runBefore) { + initCCDB(collision); + runBefore = runNow; + } + o2::aod::pwgem::photonmeson::utils::eventhistogram::fillEventInfo<1>(®istry, collision); + registry.fill(HIST("Event/before/hCollisionCounter"), 12.0); // accepted + registry.fill(HIST("Event/after/hCollisionCounter"), 12.0); // accepted + + for (const auto& photon : photonsPerCollision) { + if (mesonConfig.cfgEnableQA) { + registry.fill(HIST("hEClusterBefore"), photon.e()); // before cuts + registry.fill(HIST("mesonQA/hClusterEtaPhiBefore"), photon.phi(), photon.eta()); // before cuts + } + if (!(fEMCCut.IsSelected(photon))) { + continue; + } + if (cfgDistanceToEdge.value && (checkEtaPhi1D(photon.eta(), RecoDecay::constrainAngle(photon.phi())) >= cfgEMCalMapLevelSameEvent.value)) { + continue; + } + if (mesonConfig.cfgEnableQA) { + registry.fill(HIST("hEClusterAfter"), photon.e()); // accepted after cuts + registry.fill(HIST("mesonQA/hClusterEtaPhiAfter"), photon.phi(), photon.eta()); // before cuts + } + + auto [xQVec, yQVec] = getQvec(collision, qvecDetector); + float cent = getCentrality(collision); + + float phiCand = photon.phi(); + + float cosNPhi = std::cos(harmonic * phiCand); + float sinNPhi = std::sin(harmonic * phiCand); + float scalprodCand = cosNPhi * xQVec + sinNPhi * yQVec; + + if (correctionConfig.cfgApplySPresolution.value) { + scalprodCand = scalprodCand / h1SPResolution->GetBinContent(h1SPResolution->FindBin(cent + epsilon)); + } + if (cfgDoM02.value) { + registry.fill(HIST("hSparseFlow"), photon.m02(), photon.pt(), cent, scalprodCand); + } + return; + } // end of loop over single cluster + } // end of loop over collisions + } // processM02 + PROCESS_SWITCH(TaskPi0FlowEMC, processM02, "Process single EMCal clusters as function of M02", false); + }; // End struct TaskPi0FlowEMC WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 4173e12c52b6c57b37cc13be66bd4d0f290247da Mon Sep 17 00:00:00 2001 From: Zhengqing Wang Date: Wed, 19 Feb 2025 03:24:35 +0800 Subject: [PATCH 0297/1650] [PWGCF] Add checks for remove ITS-TPC contaminations (#10051) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/pidcme.cxx | 1037 ++++++++++++++++++++++------------- 1 file changed, 651 insertions(+), 386 deletions(-) diff --git a/PWGCF/Flow/Tasks/pidcme.cxx b/PWGCF/Flow/Tasks/pidcme.cxx index a78a2049241..baf95cdd60a 100644 --- a/PWGCF/Flow/Tasks/pidcme.cxx +++ b/PWGCF/Flow/Tasks/pidcme.cxx @@ -14,10 +14,12 @@ /// \brief task to calculate the pikp cme signal and bacground. // C++/ROOT includes. // o2-linter: disable=name/workflow-file +#include #include #include #include #include +#include #include #include #include @@ -57,7 +59,7 @@ namespace o2::aod { namespace cme_track_pid_columns { -DECLARE_SOA_COLUMN(NPidFlag, nPidFlag, int8_t); // Flag tracks without proper binning as -1, and indicate type of particle 0->un-Id, 1->pion, 2->kaon, 3->proton +DECLARE_SOA_COLUMN(NPidFlag, nPidFlag, int8_t); // Flag tracks without proper binning as -1, and indicate type of particle [0->(un_Id) 1->(pi_only), 2->(ka_only), 3->(pr_only), 4->(pi_ITSleft), 5->(ka_ITSleft), 6->(pr_ITSleft), 7->(pi_ka), 8->(pi_Pr), 9->(ka_pr), 10->(pi_ka_pr), 11->(pi_ka_ITSleft), 12->(pi_pr_ITSleft), 13->(ka_pr_ITSleft), 14->(pi_ka_pr_ITSleft)] DECLARE_SOA_COLUMN(AverClusterSizeCosl, averClusterSizeCosl, float); DECLARE_SOA_COLUMN(NSigmaPiITS, nSigmaPiITS, float); DECLARE_SOA_COLUMN(NSigmaKaITS, nSigmaKaITS, float); @@ -96,6 +98,8 @@ struct FillPIDcolums { Configurable cfgOpenITSCut{"cfgOpenITSCut", true, "open ITSnsigma cut"}; Configurable cfgOpenDetailPlots{"cfgOpenDetailPlots", true, "open detail TH3D plots for nSigmaTPC-ITS Pt-eta-Phi nSigmaITS-clustersize"}; + Configurable cfgOpenAllowCrossTrack{"cfgOpenAllowCrossTrack", true, "Allow one track to be identified as different kind of PID particles"}; + Configurable cfgOpenCrossTrackQAPlots{"cfgOpenCrossTrackQAPlots", true, "open cross pid track QA plots"}; Configurable> cfgnSigmaCutTPC{"cfgnSigmaCutTPC", {3, 3, 3}, "TPC cut for pi k p respectively at low pt"}; Configurable> cfgnSigmaCutRMS{"cfgnSigmaCutRMS", {3, 3, 3}, "TPC_TOF combined cut for pi k p respectively at high pt"}; @@ -151,6 +155,7 @@ struct FillPIDcolums { std::array nSigmaCombined = {std::hypot(candidate.tpcNSigmaPi(), candidate.tofNSigmaPi()), std::hypot(candidate.tpcNSigmaKa(), candidate.tofNSigmaKa()), std::hypot(candidate.tpcNSigmaPr(), candidate.tofNSigmaPr())}; // Choose which nSigma to use int pid = -1; + bool kIsPi = false, kIsKa = false, kIsPr = false; std::vector pidVector = (candidate.pt() > cfgPtMaxforTPCOnlyPID && candidate.hasTOF()) ? cfgnSigmaCutRMS.value : cfgnSigmaCutTPC.value; float nsigma = pidVector[0]; std::array nSigmaToUse = (candidate.pt() > cfgPtMaxforTPCOnlyPID && candidate.hasTOF()) ? nSigmaCombined : nSigmaTPC; @@ -158,57 +163,105 @@ struct FillPIDcolums { for (int i = 0; i < 3; ++i) { if (std::abs(nSigmaToUse[i]) < pidVector[i]) { if (i == 0) { - histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_cross_Pi"), candidate.tpcNSigmaPi(), candidate.tofNSigmaPi(), candidate.pt()); - histosQA.fill(HIST("QA/PID/histdEdxTPC_cross_Pi"), candidate.sign() * candidate.tpcInnerParam(), candidate.tpcSignal()); - histosQA.fill(HIST("QA/PID/histnSigma_cross_Pi"), candidate.tpcNSigmaPi()); - histosQA.fill(HIST("QA/PID/histnSigma_Pt_cross_Pi"), candidate.pt(), candidate.tpcNSigmaPi()); - histosQA.fill(HIST("QA/PID/histnSigma_ITS_cross_Pi"), candidate.itsNSigmaPi()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_cross_Pi"), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_cross_Pi"), candidate.p(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_cross_Pi"), candidate.tpcNSigmaPi(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histPhi_Dis_cross_Pi"), candidate.phi()); - histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_cross_Pi"), candidate.tpcNSigmaPi(), candidate.itsNSigmaPi()); + kIsPi = true; + if (cfgOpenCrossTrackQAPlots) { + histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_cross_Pi"), candidate.tpcNSigmaPi(), candidate.tofNSigmaPi(), candidate.pt()); + histosQA.fill(HIST("QA/PID/histdEdxTPC_cross_Pi"), candidate.sign() * candidate.tpcInnerParam(), candidate.tpcSignal()); + histosQA.fill(HIST("QA/PID/histnSigma_cross_Pi"), candidate.tpcNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_Pt_cross_Pi"), candidate.pt(), candidate.tpcNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_cross_Pi"), candidate.itsNSigmaPi()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_cross_Pi"), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_cross_Pi"), candidate.p(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_cross_Pi"), candidate.tpcNSigmaPi(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histPhi_Dis_cross_Pi"), candidate.phi()); + histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_cross_Pi"), candidate.tpcNSigmaPi(), candidate.itsNSigmaPi()); + } } if (i == 1) { - histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_cross_Ka"), candidate.tpcNSigmaKa(), candidate.tofNSigmaKa(), candidate.pt()); - histosQA.fill(HIST("QA/PID/histdEdxTPC_cross_Ka"), candidate.sign() * candidate.tpcInnerParam(), candidate.tpcSignal()); - histosQA.fill(HIST("QA/PID/histnSigma_cross_Ka"), candidate.tpcNSigmaKa()); - histosQA.fill(HIST("QA/PID/histnSigma_Pt_cross_Ka"), candidate.pt(), candidate.tpcNSigmaKa()); - histosQA.fill(HIST("QA/PID/histnSigma_ITS_cross_Ka"), candidate.itsNSigmaKa()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_cross_Ka"), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_cross_Ka"), candidate.p(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_cross_Ka"), candidate.tpcNSigmaKa(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histPhi_Dis_cross_Ka"), candidate.phi()); - histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_cross_Ka"), candidate.tpcNSigmaKa(), candidate.itsNSigmaKa()); + kIsKa = true; + if (cfgOpenCrossTrackQAPlots) { + histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_cross_Ka"), candidate.tpcNSigmaKa(), candidate.tofNSigmaKa(), candidate.pt()); + histosQA.fill(HIST("QA/PID/histdEdxTPC_cross_Ka"), candidate.sign() * candidate.tpcInnerParam(), candidate.tpcSignal()); + histosQA.fill(HIST("QA/PID/histnSigma_cross_Ka"), candidate.tpcNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_Pt_cross_Ka"), candidate.pt(), candidate.tpcNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_cross_Ka"), candidate.itsNSigmaKa()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_cross_Ka"), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_cross_Ka"), candidate.p(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_cross_Ka"), candidate.tpcNSigmaKa(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histPhi_Dis_cross_Ka"), candidate.phi()); + histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_cross_Ka"), candidate.tpcNSigmaKa(), candidate.itsNSigmaKa()); + } } if (i == 2) { - histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_cross_Pr"), candidate.tpcNSigmaPr(), candidate.tofNSigmaPr(), candidate.pt()); - histosQA.fill(HIST("QA/PID/histdEdxTPC_cross_Pr"), candidate.sign() * candidate.tpcInnerParam(), candidate.tpcSignal()); - histosQA.fill(HIST("QA/PID/histnSigma_cross_Pr"), candidate.tpcNSigmaPr()); - histosQA.fill(HIST("QA/PID/histnSigma_Pt_cross_Pr"), candidate.pt(), candidate.tpcNSigmaPr()); - histosQA.fill(HIST("QA/PID/histnSigma_ITS_cross_Pr"), candidate.itsNSigmaPr()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_cross_Pr"), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_cross_Pr"), candidate.p(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_cross_Pr"), candidate.tpcNSigmaKa(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histPhi_Dis_cross_Pr"), candidate.phi()); - histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_cross_Pr"), candidate.tpcNSigmaPr(), candidate.itsNSigmaPr()); + kIsPr = true; + if (cfgOpenCrossTrackQAPlots) { + histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_cross_Pr"), candidate.tpcNSigmaPr(), candidate.tofNSigmaPr(), candidate.pt()); + histosQA.fill(HIST("QA/PID/histdEdxTPC_cross_Pr"), candidate.sign() * candidate.tpcInnerParam(), candidate.tpcSignal()); + histosQA.fill(HIST("QA/PID/histnSigma_cross_Pr"), candidate.tpcNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_Pt_cross_Pr"), candidate.pt(), candidate.tpcNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_cross_Pr"), candidate.itsNSigmaPr()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_cross_Pr"), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_cross_Pr"), candidate.p(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_cross_Pr"), candidate.tpcNSigmaKa(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histPhi_Dis_cross_Pr"), candidate.phi()); + histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_cross_Pr"), candidate.tpcNSigmaPr(), candidate.itsNSigmaPr()); + } } } } - // Select particle with the lowest nsigma - for (int i = 0; i < 3; ++i) { - if (std::abs(nSigmaToUse[i]) < nsigma && std::abs(nSigmaToUse[i]) < pidVector[i]) { - pid = i; - nsigma = std::abs(nSigmaToUse[i]); + if (cfgOpenAllowCrossTrack) { + // one track can be recognized as different PID particles + int index = (kIsPr << 2) | (kIsKa << 1) | kIsPi; + const int map[] = {0, 1, 2, 7, 3, 8, 9, 10}; + return map[index]; + } else { + // Select particle with the lowest nsigma (If not allow cross track) + for (int i = 0; i < 3; ++i) { + if (std::abs(nSigmaToUse[i]) < nsigma && std::abs(nSigmaToUse[i]) < pidVector[i]) { + pid = i; + nsigma = std::abs(nSigmaToUse[i]); + } } + return pid + 1; // shift the pid by 1, 1 = pion, 2 = kaon, 3 = proton } - return pid + 1; // shift the pid by 1, 1 = pion, 2 = kaon, 3 = proton + } + + template + bool selectionITS(const T& candidate, int mode, float avgclssize) + { + switch (mode) { + case 1: // For Pion + if (!(std::abs(candidate.itsNSigmaPi()) < cfgnSigmaCutITS.value[0] && avgclssize > cfgAveClusSizeCoslMinPi && avgclssize < cfgAveClusSizeCoslMaxPi)) { + return false; + } else { + return true; + } + break; + + case 2: // For Kaon + if (!(std::abs(candidate.itsNSigmaKa()) < cfgnSigmaCutITS.value[1] && avgclssize > cfgAveClusSizeCoslMinKa && avgclssize < cfgAveClusSizeCoslMaxKa)) { + return false; + } else { + return true; + } + break; + + case 3: // For Proton + if (!(std::abs(candidate.itsNSigmaPr()) < cfgnSigmaCutITS.value[2] && avgclssize > cfgAveClusSizeCoslMinPr && avgclssize < cfgAveClusSizeCoslMaxPr)) { + return false; + } else { + return true; + } + break; + } + return false; } HistogramRegistry histosQA{"histosQAPID", {}, OutputObjHandlingPolicy::AnalysisObject}; void init(InitContext const&) { + AxisSpec axisRigidity{cfgrigidityBins, "#it{p}^{TPC}/#it{z}"}; AxisSpec axisdEdx{cfgdedxBins, "d#it{E}/d#it{x}"}; AxisSpec axisnSigmaTPC{cfgnSigmaBinsTPC, "n_{#sigma}TPC"}; @@ -356,163 +409,243 @@ struct FillPIDcolums { aod::pidits::ITSNSigmaPr>(tracks); int8_t pidFlag; for (const auto& track : tracksWithITSPid) { - float averClusSizeCosl = averageClusterSizeCosl(track.itsClusterSizes(), track.eta()); + const float averClusSizeCosl = averageClusterSizeCosl(track.itsClusterSizes(), track.eta()); if (!selTrackPid(track)) { pidFlag = -1; } else { histosQA.fill(HIST("QA/PID/histdEdxTPC_All"), track.sign() * track.tpcInnerParam(), track.tpcSignal()); pidFlag = selectionPidtpctof(track); - switch (pidFlag) { // no cross pid track QA plots - case 1: - histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_Pi"), track.tpcNSigmaPi(), track.tofNSigmaPi(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_Pi"), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_Pi"), track.p(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pi"), track.tpcNSigmaPi(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_Pi"), track.tpcNSigmaPi(), track.itsNSigmaPi()); - histosQA.fill(HIST("QA/PID/histdEdxTPC_Pi"), track.sign() * track.tpcInnerParam(), track.tpcSignal()); - histosQA.fill(HIST("QA/PID/histnSigma_Pi"), track.tpcNSigmaPi()); - histosQA.fill(HIST("QA/PID/histnSigma_Pt_Pi"), track.pt(), track.tpcNSigmaPi()); - histosQA.fill(HIST("QA/PID/histnSigma_com_Pi"), std::hypot(track.tpcNSigmaPi(), track.tofNSigmaPi())); - histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pi"), track.tofNSigmaPi()); - histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pi"), track.itsNSigmaPi()); - histosQA.fill(HIST("QA/PID/histPhi_Dis_Pi"), track.phi()); - if (cfgOpenDetailPlots) { - if (track.sign() > 0) { - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosPi_Before"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPi_Before"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); - } else if (track.sign() < 0) { - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegPi_Before"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPi_Before"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); - } + // First fill ITS uncut plots + if ((pidFlag == 1) || (pidFlag == 7) || (pidFlag == 8) || (pidFlag == 10)) { + histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_Pi"), track.tpcNSigmaPi(), track.tofNSigmaPi(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_Pi"), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_Pi"), track.p(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pi"), track.tpcNSigmaPi(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_Pi"), track.tpcNSigmaPi(), track.itsNSigmaPi()); + histosQA.fill(HIST("QA/PID/histdEdxTPC_Pi"), track.sign() * track.tpcInnerParam(), track.tpcSignal()); + histosQA.fill(HIST("QA/PID/histnSigma_Pi"), track.tpcNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_Pt_Pi"), track.pt(), track.tpcNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_com_Pi"), std::hypot(track.tpcNSigmaPi(), track.tofNSigmaPi())); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pi"), track.tofNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pi"), track.itsNSigmaPi()); + histosQA.fill(HIST("QA/PID/histPhi_Dis_Pi"), track.phi()); + if (cfgOpenDetailPlots) { + if (track.sign() > 0) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosPi_Before"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPi_Before"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); + } else if (track.sign() < 0) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegPi_Before"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPi_Before"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); } - break; - case 2: - histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_Ka"), track.tpcNSigmaKa(), track.tofNSigmaKa(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_Ka"), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_Ka"), track.p(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Ka"), track.tpcNSigmaKa(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_Ka"), track.tpcNSigmaKa(), track.itsNSigmaKa()); - histosQA.fill(HIST("QA/PID/histdEdxTPC_Ka"), track.sign() * track.tpcInnerParam(), track.tpcSignal()); - histosQA.fill(HIST("QA/PID/histnSigma_Ka"), track.tpcNSigmaKa()); - histosQA.fill(HIST("QA/PID/histnSigma_Pt_Ka"), track.pt(), track.tpcNSigmaKa()); - histosQA.fill(HIST("QA/PID/histnSigma_com_Ka"), std::hypot(track.tpcNSigmaKa(), track.tofNSigmaKa())); - histosQA.fill(HIST("QA/PID/histnSigma_TOF_Ka"), track.tofNSigmaKa()); - histosQA.fill(HIST("QA/PID/histnSigma_ITS_Ka"), track.itsNSigmaKa()); - histosQA.fill(HIST("QA/PID/histPhi_Dis_Ka"), track.phi()); - if (cfgOpenDetailPlots) { - if (track.sign() > 0) { - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosKa_Before"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosKa_Before"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); - } else if (track.sign() < 0) { - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegKa_Before"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegKa_Before"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); - } + } + } + if ((pidFlag == 2) || (pidFlag == 7) || (pidFlag == 9) || (pidFlag == 10)) { + histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_Ka"), track.tpcNSigmaKa(), track.tofNSigmaKa(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_Ka"), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_Ka"), track.p(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Ka"), track.tpcNSigmaKa(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_Ka"), track.tpcNSigmaKa(), track.itsNSigmaKa()); + histosQA.fill(HIST("QA/PID/histdEdxTPC_Ka"), track.sign() * track.tpcInnerParam(), track.tpcSignal()); + histosQA.fill(HIST("QA/PID/histnSigma_Ka"), track.tpcNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_Pt_Ka"), track.pt(), track.tpcNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_com_Ka"), std::hypot(track.tpcNSigmaKa(), track.tofNSigmaKa())); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_Ka"), track.tofNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_Ka"), track.itsNSigmaKa()); + histosQA.fill(HIST("QA/PID/histPhi_Dis_Ka"), track.phi()); + if (cfgOpenDetailPlots) { + if (track.sign() > 0) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosKa_Before"), track.tpcNSigmaKa(), track.itsNSigmaKa(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosKa_Before"), track.tpcNSigmaKa(), averClusSizeCosl, track.pt()); + } else if (track.sign() < 0) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegKa_Before"), track.tpcNSigmaKa(), track.itsNSigmaKa(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegKa_Before"), track.tpcNSigmaKa(), averClusSizeCosl, track.pt()); } - break; - case 3: - histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_Pr"), track.tpcNSigmaPr(), track.tofNSigmaPr(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_Pr"), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_Pr"), track.p(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pr"), track.tpcNSigmaPr(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_Pr"), track.tpcNSigmaPr(), track.itsNSigmaPr()); - histosQA.fill(HIST("QA/PID/histdEdxTPC_Pr"), track.sign() * track.tpcInnerParam(), track.tpcSignal()); - histosQA.fill(HIST("QA/PID/histnSigma_Pr"), track.tpcNSigmaPr()); - histosQA.fill(HIST("QA/PID/histnSigma_Pt_Pr"), track.pt(), track.tpcNSigmaPr()); - histosQA.fill(HIST("QA/PID/histnSigma_com_Pr"), std::hypot(track.tpcNSigmaPr(), track.tofNSigmaPr())); - histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pr"), track.tofNSigmaPr()); - histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pr"), track.itsNSigmaPr()); - histosQA.fill(HIST("QA/PID/histPhi_Dis_Pr"), track.phi()); - if (cfgOpenDetailPlots) { - if (track.sign() > 0) { - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosPr_Before"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPr_Before"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); - } else if (track.sign() < 0) { - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegPr_Before"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPr_Before"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); - } + } + } + if ((pidFlag == 3) || (pidFlag == 8) || (pidFlag == 9) || (pidFlag == 10)) { + histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_Pr"), track.tpcNSigmaPr(), track.tofNSigmaPr(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_Pr"), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_Pr"), track.p(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pr"), track.tpcNSigmaPr(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_Pr"), track.tpcNSigmaPr(), track.itsNSigmaPr()); + histosQA.fill(HIST("QA/PID/histdEdxTPC_Pr"), track.sign() * track.tpcInnerParam(), track.tpcSignal()); + histosQA.fill(HIST("QA/PID/histnSigma_Pr"), track.tpcNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_Pt_Pr"), track.pt(), track.tpcNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_com_Pr"), std::hypot(track.tpcNSigmaPr(), track.tofNSigmaPr())); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pr"), track.tofNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pr"), track.itsNSigmaPr()); + histosQA.fill(HIST("QA/PID/histPhi_Dis_Pr"), track.phi()); + if (cfgOpenDetailPlots) { + if (track.sign() > 0) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosPr_Before"), track.tpcNSigmaPr(), track.itsNSigmaPr(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPr_Before"), track.tpcNSigmaPr(), averClusSizeCosl, track.pt()); + } else if (track.sign() < 0) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegPr_Before"), track.tpcNSigmaPr(), track.itsNSigmaPr(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPr_Before"), track.tpcNSigmaPr(), averClusSizeCosl, track.pt()); } - break; + } } + // Second proform ITS cut if (cfgOpenITSCut) { + int idx = -1; switch (pidFlag) { case 1: - if (!(std::abs(track.itsNSigmaPi()) < cfgnSigmaCutITS.value[0] && averClusSizeCosl > cfgAveClusSizeCoslMinPi && averClusSizeCosl < cfgAveClusSizeCoslMaxPi)) { + if (!selectionITS(track, 1, averClusSizeCosl)) { pidFlag = 4; } break; case 2: - if (!(std::abs(track.itsNSigmaKa()) < cfgnSigmaCutITS.value[1] && averClusSizeCosl > cfgAveClusSizeCoslMinKa && averClusSizeCosl < cfgAveClusSizeCoslMaxKa)) { + if (!selectionITS(track, 2, averClusSizeCosl)) { pidFlag = 5; } break; case 3: - if (!(std::abs(track.itsNSigmaPr()) < cfgnSigmaCutITS.value[2] && averClusSizeCosl > cfgAveClusSizeCoslMinPr && averClusSizeCosl < cfgAveClusSizeCoslMaxPr)) { + if (!selectionITS(track, 3, averClusSizeCosl)) { pidFlag = 6; } break; + case 7: + idx = (selectionITS(track, 1, averClusSizeCosl) << 1) | selectionITS(track, 2, averClusSizeCosl); + switch (idx) { + case 0: + pidFlag = 11; + break; + + case 1: + pidFlag = 2; + break; + + case 2: + pidFlag = 1; + break; + } + break; + case 8: + idx = (selectionITS(track, 1, averClusSizeCosl) << 1) | selectionITS(track, 3, averClusSizeCosl); + switch (idx) { + case 0: + pidFlag = 12; + break; + + case 1: + pidFlag = 3; + break; + + case 2: + pidFlag = 1; + break; + } + break; + case 9: + idx = (selectionITS(track, 2, averClusSizeCosl) << 1) | selectionITS(track, 3, averClusSizeCosl); + switch (idx) { + case 0: + pidFlag = 13; + break; + + case 1: + pidFlag = 3; + break; + + case 2: + pidFlag = 2; + break; + } + break; + case 10: + idx = (selectionITS(track, 1, averClusSizeCosl) << 2) | (selectionITS(track, 2, averClusSizeCosl) << 1) | selectionITS(track, 3, averClusSizeCosl); + switch (idx) { + case 0: + pidFlag = 14; + break; + + case 1: + pidFlag = 3; + break; + + case 2: + pidFlag = 2; + break; + + case 3: + pidFlag = 9; + break; + + case 4: + pidFlag = 1; + break; + + case 5: + pidFlag = 8; + break; + + case 6: + pidFlag = 7; + break; + } + break; } } - switch (pidFlag) { // after ITScut QA plots - case 1: - histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_AfterITS_Pi"), track.tpcNSigmaPi(), track.tofNSigmaPi(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_AfterITS_Pi"), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_AfterITS_Pi"), track.p(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Pi"), track.tpcNSigmaPi(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Pi"), track.tpcNSigmaPi(), track.itsNSigmaPi()); - histosQA.fill(HIST("QA/PID/histnSigma_ITS_AfterITS_Pi"), track.itsNSigmaPi()); - histosQA.fill(HIST("QA/PID/histPhi_Dis_AfterITS_Pi"), track.phi()); - if (cfgOpenDetailPlots) { - if (track.sign() > 0) { - histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_PosPi"), track.phi(), track.pt(), track.eta()); - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosPi_After"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPi_After"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); - } else if (track.sign() < 0) { - histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_NegPi"), track.phi(), track.pt(), track.eta()); - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegPi_After"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPi_After"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); - } + // Third Fill ITS cut plots + if ((pidFlag == 1) || (pidFlag == 7) || (pidFlag == 8) || (pidFlag == 10)) { + histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_AfterITS_Pi"), track.tpcNSigmaPi(), track.tofNSigmaPi(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_AfterITS_Pi"), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_AfterITS_Pi"), track.p(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Pi"), track.tpcNSigmaPi(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Pi"), track.tpcNSigmaPi(), track.itsNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_AfterITS_Pi"), track.itsNSigmaPi()); + histosQA.fill(HIST("QA/PID/histPhi_Dis_AfterITS_Pi"), track.phi()); + if (cfgOpenDetailPlots) { + if (track.sign() > 0) { + histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_PosPi"), track.phi(), track.pt(), track.eta()); + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosPi_After"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPi_After"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); + } else if (track.sign() < 0) { + histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_NegPi"), track.phi(), track.pt(), track.eta()); + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegPi_After"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPi_After"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); } - break; - case 2: - histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_AfterITS_Ka"), track.tpcNSigmaKa(), track.tofNSigmaKa(), track.pt()); - histosQA.fill(HIST("QA/PID/histnSigma_ITS_AfterITS_Ka"), track.itsNSigmaKa()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_AfterITS_Ka"), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_AfterITS_Ka"), track.p(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Ka"), track.tpcNSigmaKa(), track.itsNSigmaKa()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Ka"), track.tpcNSigmaKa(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histPhi_Dis_AfterITS_Ka"), track.phi()); - if (cfgOpenDetailPlots) { - if (track.sign() > 0) { - histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_PosKa"), track.phi(), track.pt(), track.eta()); - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosKa_After"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosKa_After"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); - } else if (track.sign() < 0) { - histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_NegKa"), track.phi(), track.pt(), track.eta()); - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegKa_After"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegKa_After"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); - } + } + } + if ((pidFlag == 2) || (pidFlag == 7) || (pidFlag == 9) || (pidFlag == 10)) { + histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_AfterITS_Ka"), track.tpcNSigmaKa(), track.tofNSigmaKa(), track.pt()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_AfterITS_Ka"), track.itsNSigmaKa()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_AfterITS_Ka"), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_AfterITS_Ka"), track.p(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Ka"), track.tpcNSigmaKa(), track.itsNSigmaKa()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Ka"), track.tpcNSigmaKa(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histPhi_Dis_AfterITS_Ka"), track.phi()); + if (cfgOpenDetailPlots) { + if (track.sign() > 0) { + histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_PosKa"), track.phi(), track.pt(), track.eta()); + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosKa_After"), track.tpcNSigmaKa(), track.itsNSigmaKa(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosKa_After"), track.tpcNSigmaKa(), averClusSizeCosl, track.pt()); + } else if (track.sign() < 0) { + histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_NegKa"), track.phi(), track.pt(), track.eta()); + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegKa_After"), track.tpcNSigmaKa(), track.itsNSigmaKa(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegKa_After"), track.tpcNSigmaKa(), averClusSizeCosl, track.pt()); } - break; - case 3: - histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_AfterITS_Pr"), track.tpcNSigmaPr(), track.tofNSigmaPr(), track.pt()); - histosQA.fill(HIST("QA/PID/histnSigma_ITS_AfterITS_Pr"), track.itsNSigmaPr()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_AfterITS_Pr"), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_AfterITS_Pr"), track.p(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Pr"), track.tpcNSigmaPr(), track.itsNSigmaPr()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Pr"), track.tpcNSigmaPr(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histPhi_Dis_AfterITS_Pr"), track.phi()); - if (cfgOpenDetailPlots) { - if (track.sign() > 0) { - histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_PosPr"), track.phi(), track.pt(), track.eta()); - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosPr_After"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPr_After"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); - } else if (track.sign() < 0) { - histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_NegPr"), track.phi(), track.pt(), track.eta()); - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegPr_After"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPr_After"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); - } + } + } + if ((pidFlag == 3) || (pidFlag == 8) || (pidFlag == 9) || (pidFlag == 10)) { + histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_AfterITS_Pr"), track.tpcNSigmaPr(), track.tofNSigmaPr(), track.pt()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_AfterITS_Pr"), track.itsNSigmaPr()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_AfterITS_Pr"), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_AfterITS_Pr"), track.p(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Pr"), track.tpcNSigmaPr(), track.itsNSigmaPr()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Pr"), track.tpcNSigmaPr(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histPhi_Dis_AfterITS_Pr"), track.phi()); + if (cfgOpenDetailPlots) { + if (track.sign() > 0) { + histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_PosPr"), track.phi(), track.pt(), track.eta()); + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosPr_After"), track.tpcNSigmaPr(), track.itsNSigmaPr(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPr_After"), track.tpcNSigmaPr(), averClusSizeCosl, track.pt()); + } else if (track.sign() < 0) { + histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_NegPr"), track.phi(), track.pt(), track.eta()); + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegPr_After"), track.tpcNSigmaPr(), track.itsNSigmaPr(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPr_After"), track.tpcNSigmaPr(), averClusSizeCosl, track.pt()); } - break; + } } } pidCmeTable(pidFlag, averClusSizeCosl, track.itsNSigmaPi(), track.itsNSigmaKa(), track.itsNSigmaPr(), track.tpcNSigmaPi(), track.tpcNSigmaKa(), track.tpcNSigmaPr()); @@ -673,152 +806,129 @@ struct QAProcessCent { } if (currentBin >= 0) { for (const auto& trk : tracks) { - int8_t pididx = trk.nPidFlag(); - switch (pididx) { - case 1: - if (cfgOpenPi) { - if (trk.sign() > 0) { - if (cfgOpenPtEtaPhi) { + int8_t pidFlag = trk.nPidFlag(); + if (cfgOpenPi) { + if ((pidFlag == 1) || (pidFlag == 4) || (pidFlag == 7) || (pidFlag == 8) || (pidFlag == 10) || (pidFlag == 11) || (pidFlag == 12) || (pidFlag == 14)) { + if (trk.sign() > 0) { + if (cfgOpenPtEtaPhi) { + if (!((pidFlag == 4) || (pidFlag == 11) || (pidFlag == 12) || (pidFlag == 14))) { vhistPhiPtEtaPosPiCen[currentBin]->Fill(trk.phi(), trk.pt(), trk.eta()); } - if (cfgOpenITSTPCnSigma) { - vhistnSigmaITSTPCPtPosPiBeforeCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.nSigmaPiITS(), trk.pt()); + } + if (cfgOpenITSTPCnSigma) { + if (!((pidFlag == 4) || (pidFlag == 11) || (pidFlag == 12) || (pidFlag == 14))) { vhistnSigmaITSTPCPtPosPiAfterCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.nSigmaPiITS(), trk.pt()); } - if (cfgOpenClusSizenSigmaTPC) { - vhistAverClusterSizeCoslnSigmaTPCPtPosPiBeforeCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.averClusterSizeCosl(), trk.pt()); + vhistnSigmaITSTPCPtPosPiBeforeCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.nSigmaPiITS(), trk.pt()); + } + if (cfgOpenClusSizenSigmaTPC) { + if (!((pidFlag == 4) || (pidFlag == 11) || (pidFlag == 12) || (pidFlag == 14))) { vhistAverClusterSizeCoslnSigmaTPCPtPosPiAfterCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.averClusterSizeCosl(), trk.pt()); } - } else if (trk.sign() < 0) { - if (cfgOpenPtEtaPhi) { + vhistAverClusterSizeCoslnSigmaTPCPtPosPiBeforeCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.averClusterSizeCosl(), trk.pt()); + } + } else if (trk.sign() < 0) { + if (cfgOpenPtEtaPhi) { + if (!((pidFlag == 4) || (pidFlag == 11) || (pidFlag == 12) || (pidFlag == 14))) { vhistPhiPtEtaNegPiCen[currentBin]->Fill(trk.phi(), trk.pt(), trk.eta()); } - if (cfgOpenITSTPCnSigma) { - vhistnSigmaITSTPCPtNegPiBeforeCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.nSigmaPiITS(), trk.pt()); + } + if (cfgOpenITSTPCnSigma) { + if (!((pidFlag == 4) || (pidFlag == 11) || (pidFlag == 12) || (pidFlag == 14))) { vhistnSigmaITSTPCPtNegPiAfterCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.nSigmaPiITS(), trk.pt()); } - if (cfgOpenClusSizenSigmaTPC) { - vhistAverClusterSizeCoslnSigmaTPCPtNegPiBeforeCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.averClusterSizeCosl(), trk.pt()); + vhistnSigmaITSTPCPtNegPiBeforeCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.nSigmaPiITS(), trk.pt()); + } + if (cfgOpenClusSizenSigmaTPC) { + if (!((pidFlag == 4) || (pidFlag == 11) || (pidFlag == 12) || (pidFlag == 14))) { vhistAverClusterSizeCoslnSigmaTPCPtNegPiAfterCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.averClusterSizeCosl(), trk.pt()); } + vhistAverClusterSizeCoslnSigmaTPCPtNegPiBeforeCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.averClusterSizeCosl(), trk.pt()); } } - break; - case 2: - if (cfgOpenKa) { - if (trk.sign() > 0) { - if (cfgOpenPtEtaPhi) { + } + } + if (cfgOpenKa) { + if ((pidFlag == 2) || (pidFlag == 5) || (pidFlag == 7) || (pidFlag == 9) || (pidFlag == 10) || (pidFlag == 11) || (pidFlag == 13) || (pidFlag == 14)) { + if (trk.sign() > 0) { + if (cfgOpenPtEtaPhi) { + if (!((pidFlag == 5) || (pidFlag == 11) || (pidFlag == 13) || (pidFlag == 14))) { vhistPhiPtEtaPosKaCen[currentBin]->Fill(trk.phi(), trk.pt(), trk.eta()); } - if (cfgOpenITSTPCnSigma) { - vhistnSigmaITSTPCPtPosKaBeforeCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.nSigmaKaITS(), trk.pt()); + } + if (cfgOpenITSTPCnSigma) { + if (!((pidFlag == 5) || (pidFlag == 11) || (pidFlag == 13) || (pidFlag == 14))) { vhistnSigmaITSTPCPtPosKaAfterCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.nSigmaKaITS(), trk.pt()); } - if (cfgOpenClusSizenSigmaTPC) { - vhistAverClusterSizeCoslnSigmaTPCPtPosKaBeforeCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.averClusterSizeCosl(), trk.pt()); + vhistnSigmaITSTPCPtPosKaBeforeCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.nSigmaKaITS(), trk.pt()); + } + if (cfgOpenClusSizenSigmaTPC) { + if (!((pidFlag == 5) || (pidFlag == 11) || (pidFlag == 13) || (pidFlag == 14))) { vhistAverClusterSizeCoslnSigmaTPCPtPosKaAfterCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.averClusterSizeCosl(), trk.pt()); } - } else if (trk.sign() < 0) { - if (cfgOpenPtEtaPhi) { + vhistAverClusterSizeCoslnSigmaTPCPtPosKaBeforeCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.averClusterSizeCosl(), trk.pt()); + } + } else if (trk.sign() < 0) { + if (cfgOpenPtEtaPhi) { + if (!((pidFlag == 5) || (pidFlag == 11) || (pidFlag == 13) || (pidFlag == 14))) { vhistPhiPtEtaNegKaCen[currentBin]->Fill(trk.phi(), trk.pt(), trk.eta()); } - if (cfgOpenITSTPCnSigma) { - vhistnSigmaITSTPCPtNegKaBeforeCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.nSigmaKaITS(), trk.pt()); + } + if (cfgOpenITSTPCnSigma) { + if (!((pidFlag == 5) || (pidFlag == 11) || (pidFlag == 13) || (pidFlag == 14))) { vhistnSigmaITSTPCPtNegKaAfterCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.nSigmaKaITS(), trk.pt()); } - if (cfgOpenClusSizenSigmaTPC) { - vhistAverClusterSizeCoslnSigmaTPCPtNegKaBeforeCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.averClusterSizeCosl(), trk.pt()); + vhistnSigmaITSTPCPtNegKaBeforeCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.nSigmaKaITS(), trk.pt()); + } + if (cfgOpenClusSizenSigmaTPC) { + if (!((pidFlag == 5) || (pidFlag == 11) || (pidFlag == 13) || (pidFlag == 14))) { vhistAverClusterSizeCoslnSigmaTPCPtNegKaAfterCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.averClusterSizeCosl(), trk.pt()); } + vhistAverClusterSizeCoslnSigmaTPCPtNegKaBeforeCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.averClusterSizeCosl(), trk.pt()); } } - break; - case 3: - if (cfgOpenPr) { - if (trk.sign() > 0) { - if (cfgOpenPtEtaPhi) { + } + } + if (cfgOpenPr) { + if ((pidFlag == 3) || (pidFlag == 6) || (pidFlag == 8) || (pidFlag == 9) || (pidFlag == 10) || (pidFlag == 12) || (pidFlag == 13) || (pidFlag == 14)) { + if (trk.sign() > 0) { + if (cfgOpenPtEtaPhi) { + if (!((pidFlag == 6) || (pidFlag == 12) || (pidFlag == 13) || (pidFlag == 14))) { vhistPhiPtEtaPosPrCen[currentBin]->Fill(trk.phi(), trk.pt(), trk.eta()); } - if (cfgOpenITSTPCnSigma) { - vhistnSigmaITSTPCPtPosPrBeforeCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.nSigmaPrITS(), trk.pt()); + } + if (cfgOpenITSTPCnSigma) { + if (!((pidFlag == 6) || (pidFlag == 12) || (pidFlag == 13) || (pidFlag == 14))) { vhistnSigmaITSTPCPtPosPrAfterCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.nSigmaPrITS(), trk.pt()); } - if (cfgOpenClusSizenSigmaTPC) { - vhistAverClusterSizeCoslnSigmaTPCPtPosPrBeforeCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.averClusterSizeCosl(), trk.pt()); + vhistnSigmaITSTPCPtPosPrBeforeCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.nSigmaPrITS(), trk.pt()); + } + if (cfgOpenClusSizenSigmaTPC) { + if (!((pidFlag == 6) || (pidFlag == 12) || (pidFlag == 13) || (pidFlag == 14))) { vhistAverClusterSizeCoslnSigmaTPCPtPosPrAfterCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.averClusterSizeCosl(), trk.pt()); } - } else if (trk.sign() < 0) { - if (cfgOpenPtEtaPhi) { - vhistPhiPtEtaNegPrCen[currentBin]->Fill(trk.phi(), trk.pt(), trk.eta()); - } - if (cfgOpenITSTPCnSigma) { - vhistnSigmaITSTPCPtNegPrBeforeCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.nSigmaPrITS(), trk.pt()); - vhistnSigmaITSTPCPtNegPrAfterCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.nSigmaPrITS(), trk.pt()); - } - if (cfgOpenClusSizenSigmaTPC) { - vhistAverClusterSizeCoslnSigmaTPCPtNegPrBeforeCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.averClusterSizeCosl(), trk.pt()); - vhistAverClusterSizeCoslnSigmaTPCPtNegPrAfterCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.averClusterSizeCosl(), trk.pt()); - } + vhistAverClusterSizeCoslnSigmaTPCPtPosPrBeforeCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.averClusterSizeCosl(), trk.pt()); } - } - break; - case 4: - if (cfgOpenPi) { - if (trk.sign() > 0) { - if (cfgOpenITSTPCnSigma) { - vhistnSigmaITSTPCPtPosPiBeforeCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.nSigmaPiITS(), trk.pt()); - } - if (cfgOpenClusSizenSigmaTPC) { - vhistAverClusterSizeCoslnSigmaTPCPtPosPiBeforeCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.averClusterSizeCosl(), trk.pt()); - } - } else if (trk.sign() < 0) { - if (cfgOpenITSTPCnSigma) { - vhistnSigmaITSTPCPtNegPiBeforeCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.nSigmaPiITS(), trk.pt()); - } - if (cfgOpenClusSizenSigmaTPC) { - vhistAverClusterSizeCoslnSigmaTPCPtNegPiBeforeCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.averClusterSizeCosl(), trk.pt()); + } else if (trk.sign() < 0) { + if (cfgOpenPtEtaPhi) { + if (!((pidFlag == 6) || (pidFlag == 12) || (pidFlag == 13) || (pidFlag == 14))) { + vhistPhiPtEtaNegPrCen[currentBin]->Fill(trk.phi(), trk.pt(), trk.eta()); } } - } - break; - case 5: - if (cfgOpenKa) { - if (trk.sign() > 0) { - if (cfgOpenITSTPCnSigma) { - vhistnSigmaITSTPCPtPosKaBeforeCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.nSigmaKaITS(), trk.pt()); - } - if (cfgOpenClusSizenSigmaTPC) { - vhistAverClusterSizeCoslnSigmaTPCPtPosKaBeforeCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.averClusterSizeCosl(), trk.pt()); - } - } else if (trk.sign() < 0) { - if (cfgOpenITSTPCnSigma) { - vhistnSigmaITSTPCPtNegKaBeforeCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.nSigmaKaITS(), trk.pt()); - } - if (cfgOpenClusSizenSigmaTPC) { - vhistAverClusterSizeCoslnSigmaTPCPtNegKaBeforeCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.averClusterSizeCosl(), trk.pt()); + if (cfgOpenITSTPCnSigma) { + if (!((pidFlag == 6) || (pidFlag == 12) || (pidFlag == 13) || (pidFlag == 14))) { + vhistnSigmaITSTPCPtNegPrAfterCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.nSigmaPrITS(), trk.pt()); } + vhistnSigmaITSTPCPtNegPrBeforeCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.nSigmaPrITS(), trk.pt()); } - } - break; - case 6: - if (cfgOpenPr) { - if (trk.sign() > 0) { - if (cfgOpenITSTPCnSigma) { - vhistnSigmaITSTPCPtPosPrBeforeCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.nSigmaPrITS(), trk.pt()); - } - if (cfgOpenClusSizenSigmaTPC) { - vhistAverClusterSizeCoslnSigmaTPCPtPosPrBeforeCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.averClusterSizeCosl(), trk.pt()); - } - } else if (trk.sign() < 0) { - if (cfgOpenITSTPCnSigma) { - vhistnSigmaITSTPCPtNegPrBeforeCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.nSigmaPrITS(), trk.pt()); - } - if (cfgOpenClusSizenSigmaTPC) { - vhistAverClusterSizeCoslnSigmaTPCPtNegPrBeforeCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.averClusterSizeCosl(), trk.pt()); + if (cfgOpenClusSizenSigmaTPC) { + if (!((pidFlag == 6) || (pidFlag == 12) || (pidFlag == 13) || (pidFlag == 14))) { + vhistAverClusterSizeCoslnSigmaTPCPtNegPrAfterCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.averClusterSizeCosl(), trk.pt()); } + vhistAverClusterSizeCoslnSigmaTPCPtNegPrBeforeCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.averClusterSizeCosl(), trk.pt()); } } - break; + } } } } @@ -858,6 +968,9 @@ struct pidcme { // o2-linter: disable=name/struct ConfigurableAxis cfgaxisT0C{"cfgaxisT0C", {70, 0, 70000}, "N_{ch} (T0C)"}; ConfigurableAxis cfgaxisT0A{"cfgaxisT0A", {200, 0, 200000}, "N_{ch} (T0A)"}; ConfigurableAxis cfgaxisNchPV{"cfgaxisNchPV", {4000, 0, 4000}, "N_{ch} (PV)"}; + ConfigurableAxis cfgaxisptPIDcme{"cfgaxisptPIDcme", {120, 0, 12}, "Binning for P_{t} PID"}; + ConfigurableAxis cfgnSigmaBinsTPCcme{"cfgnSigmaBinsTPCcme", {200, -5.f, 5.f}, "Binning for n sigma TPC"}; + ConfigurableAxis cfgnSigmaBinsITScme{"cfgnSigmaBinsITScme", {200, -5.f, 5.f}, "Binning for n sigma TPC"}; ConfigurableAxis cfgaxissumpt{"cfgaxissumpt", {7, 1, 8}, "Binning for #gamma and #delta pt(particle1 + particle2)"}; ConfigurableAxis cfgaxisdeltaeta{"cfgaxisdeltaeta", {5, 0, 1}, "Binning for #gamma and #delta |#eta(particle1 - particle2)|"}; @@ -882,7 +995,17 @@ struct pidcme { // o2-linter: disable=name/struct Configurable cfgkOpenKaPr{"cfgkOpenKaPr", true, "open Ka-Pr"}; Configurable cfgkOpenHaHa{"cfgkOpenHaHa", false, "open Ha-Ha"}; Configurable cfgkOpenSsOsCrossCheck{"cfgkOpenSsOsCrossCheck", false, "open check for matter an antimatter #gamma#delta"}; + Configurable cfgkOpenTPCITSPurityCut{"cfgkOpenTPCITSPurityCut", true, "open ITS-TPC purity cut"}; + Configurable cfgkOpenTPCITSPurityCutQA{"cfgkOpenTPCITSPurityCutQA", true, "open ITS-TPC purity cut QA plots"}; + Configurable cfgkOpenDebugPIDCME{"cfgkOpenDebugPIDCME", false, "open pidcme workflow debug mode"}; + Configurable> cfgITSPurityCen{"cfgITSPurityCen", {20, 30}, "ITS purity cut centrality"}; + Configurable> cfgPtPrCut{"cfgPtPrCut", {0.5, 0.6, 0.7, 0.8, 0.9}, "pt binings for proton ITS purity cut"}; + Configurable cfgCCDBPurityPath{"cfgCCDBPurityPath", "Users/z/zhengqiw/PurityCut", "CCDB path for nsigmaITS - nSigmaTPC purity cut"}; + Configurable ccdbNoLaterThan{"ccdbNoLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + + Service ccdb; EventPlaneHelper helperEP; SliceCache cache; @@ -898,6 +1021,9 @@ struct pidcme { // o2-linter: disable=name/struct TF1* fMultMultPVCut = nullptr; TF1* fT0AV0AMean = nullptr; TF1* fT0AV0ASigma = nullptr; + // vectors for ITS-TPC contanmination cut + std::vector>> hPosPrCut; + std::vector>> hNegPrCut; template int getDetId(const T& name) @@ -927,17 +1053,20 @@ struct pidcme { // o2-linter: disable=name/struct Filter collisionFilter = (nabs(aod::collision::posZ) < cfgVtzCut) && (aod::cent::centFT0C > cfgCentMin) && (aod::cent::centFT0C < cfgCentMax); Filter ptfilter = aod::track::pt > cfgMinPt; Filter etafilter = aod::track::eta < cfgMaxEta; - Filter properPIDfilter = aod::cme_track_pid_columns::nPidFlag > (int8_t)0; - - Partition>> tracksSet1 = aod::cme_track_pid_columns::nPidFlag == 1; - Partition>> tracksSet2 = aod::cme_track_pid_columns::nPidFlag == 2; - Partition>> tracksSet3 = aod::cme_track_pid_columns::nPidFlag == 3; - // Partition>> tracksSet4 = aod::cme_track_pid_columns::nPidFlag == 4; - // Partition>> tracksSet5 = aod::cme_track_pid_columns::nPidFlag == 5; - // Partition>> tracksSet6 = aod::cme_track_pid_columns::nPidFlag == 6; + Filter properPIDfilter = aod::cme_track_pid_columns::nPidFlag >= (int8_t)0; + + Partition>> tracksSet1 = ((aod::cme_track_pid_columns::nPidFlag == 1) || (aod::cme_track_pid_columns::nPidFlag == 7) || (aod::cme_track_pid_columns::nPidFlag == 8) || (aod::cme_track_pid_columns::nPidFlag == 10)); + Partition>> tracksSet2 = ((aod::cme_track_pid_columns::nPidFlag == 2) || (aod::cme_track_pid_columns::nPidFlag == 7) || (aod::cme_track_pid_columns::nPidFlag == 9) || (aod::cme_track_pid_columns::nPidFlag == 10)); + Partition>> tracksSet3 = ((aod::cme_track_pid_columns::nPidFlag == 3) || (aod::cme_track_pid_columns::nPidFlag == 8) || (aod::cme_track_pid_columns::nPidFlag == 9) || (aod::cme_track_pid_columns::nPidFlag == 10)); void init(InitContext const&) { + ccdb->setURL(ccdbUrl.value); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setCreatedNotAfter(ccdbNoLaterThan.value); + ccdb->setFatalWhenNull(false); + detId = getDetId(cfgDetName); refAId = getDetId(cfgRefAName); refBId = getDetId(cfgRefBName); @@ -1036,6 +1165,11 @@ struct pidcme { // o2-linter: disable=name/struct histosQA.add(Form("V2/PID/histCosDetV2_Ka_Neg"), "", {HistType::kTH3F, {axisCentMerged, axisPt, axisCos}}); histosQA.add(Form("V2/PID/histCosDetV2_Pr_Neg"), "", {HistType::kTH3F, {axisCentMerged, axisPt, axisCos}}); + if (cfgkOpenTPCITSPurityCut && cfgkOpenTPCITSPurityCutQA) { + histosQA.add(Form("QA/histITSPuritycheck_Pr_Pos_Cen_20_30"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgnSigmaBinsITScme, cfgaxisptPIDcme}}); + histosQA.add(Form("QA/histITSPuritycheck_Pr_Neg_Cen_20_30"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgnSigmaBinsITScme, cfgaxisptPIDcme}}); + } + if (cfgkOpenCME) { if (cfgkOpenPiPi) { histosQA.add(Form("PIDCME/histgamama_PiPi_ss"), "", {HistType::kTProfile, {axisCentMerged}}); @@ -1180,6 +1314,38 @@ struct pidcme { // o2-linter: disable=name/struct } } + void initCCDB(aod::BCsWithTimestamps::iterator const& bc) + { + std::string fullPath; + auto timestamp = bc.timestamp(); + // hPosPrCut.clear(); + // hNegPrCut.clear(); + for (auto i = 0; i < static_cast(cfgITSPurityCen->size()) - 1; i++) { + std::vector> hPosPrCutCen; + std::vector> hNegPrCutCen; + for (auto j = 0; j < static_cast(cfgPtPrCut->size()) - 1; j++) { + fullPath = cfgCCDBPurityPath; + fullPath += Form("/ProtonPos/Cen_%d_%d/Pt_%d_%d", cfgITSPurityCen->at(i), cfgITSPurityCen->at(i + 1), static_cast(std::round(1e3 * cfgPtPrCut->at(j))), static_cast(std::round(1e3 * cfgPtPrCut->at(j + 1)))); + auto posPrHist = ccdb->getForTimeStamp(fullPath, timestamp); + fullPath = cfgCCDBPurityPath; + fullPath += Form("/ProtonNeg/Cen_%d_%d/Pt_%d_%d", cfgITSPurityCen->at(i), cfgITSPurityCen->at(i + 1), static_cast(std::round(1e3 * cfgPtPrCut->at(j))), static_cast(std::round(1e3 * cfgPtPrCut->at(j + 1)))); + auto negPrHist = ccdb->getForTimeStamp(fullPath, timestamp); + if (!posPrHist) { + LOGF(fatal, Form("could not load Pos Proton ITS TPC purity hist for Cent_%d_%d Pt_%d_%d(MeV)", cfgITSPurityCen->at(i), cfgITSPurityCen->at(i + 1), static_cast(std::round(1e3 * cfgPtPrCut->at(j))), static_cast(std::round(1e3 * cfgPtPrCut->at(j + 1))))); + } + if (!negPrHist) { + LOGF(fatal, Form("could not load Neg Proton ITS TPC purity hist for Cent_%d_%d Pt_%d_%d(MeV)", cfgITSPurityCen->at(i), cfgITSPurityCen->at(i + 1), static_cast(std::round(1e3 * cfgPtPrCut->at(j))), static_cast(std::round(1e3 * cfgPtPrCut->at(j + 1))))); + } + std::shared_ptr sharedPosPrHist(posPrHist); + std::shared_ptr sharedNegPrHist(negPrHist); + hPosPrCutCen.push_back(std::move(sharedPosPrHist)); + hNegPrCutCen.push_back(std::move(sharedNegPrHist)); + } + hPosPrCut.push_back(std::move(hPosPrCutCen)); + hNegPrCut.push_back(std::move(hNegPrCutCen)); + } + } + template bool selEvent(const CollType& collision, const int multTrk, const float centrality) { @@ -1251,8 +1417,11 @@ struct pidcme { // o2-linter: disable=name/struct } template - bool selTrack(const TrackType track) + bool selTrack(const TrackType track, float centrality) { + if (cfgkOpenDebugPIDCME) { + LOGF(info, "====================Entering track selection============================="); + } if (!track.passedITSNCls()) return false; if (!track.passedITSChi2NDF()) @@ -1267,6 +1436,51 @@ struct pidcme { // o2-linter: disable=name/struct return false; if (!track.passedDCAz()) return false; + if (cfgkOpenTPCITSPurityCut) { + int cenBin = -1; + int ptBin = -1; + for (int i = 0; i < static_cast(cfgITSPurityCen.value.size()) - 1; ++i) { + if (centrality >= cfgITSPurityCen.value[i] && centrality < cfgITSPurityCen.value[i + 1]) { + cenBin = i; + break; + } + } + for (int i = 0; i < static_cast(cfgPtPrCut.value.size()) - 1; ++i) { + if (track.pt() >= cfgPtPrCut.value[i] && track.pt() < cfgPtPrCut.value[i + 1]) { + ptBin = i; + break; + } + } + if ((cenBin >= 0) && (ptBin >= 0)) { + if ((track.nPidFlag() == 3) || (track.nPidFlag() == 8) || (track.nPidFlag() == 9) || (track.nPidFlag() == 10)) { + if (cfgkOpenDebugPIDCME) { + LOGF(info, Form("=========cen_bin: %d pt_bin: %d=========", cenBin, ptBin)); + } + float nSigmaITSPr = track.nSigmaPrITS(); + int xBin = hPosPrCut[cenBin][ptBin]->GetXaxis()->FindBin(nSigmaITSPr); + float binContentPosPr = hPosPrCut[cenBin][ptBin]->GetBinContent(xBin); + float binContentNegPr = hNegPrCut[cenBin][ptBin]->GetBinContent(xBin); + if (track.sign() > 0) { + if ((binContentPosPr != 0) && (track.nSigmaPrTPC() < binContentPosPr)) { + if (cfgkOpenDebugPIDCME) { + LOGF(info, "====================Track selection Finished with cut============================="); + } + return false; + } + } else { + if ((binContentNegPr != 0) && (track.nSigmaPrTPC() < binContentNegPr)) { + if (cfgkOpenDebugPIDCME) { + LOGF(info, "====================Track selection Finished with cut============================="); + } + return false; + } + } + } + } + } + if (cfgkOpenDebugPIDCME) { + LOGF(info, "====================Track selection Finished without cut============================="); + } return true; } @@ -1301,43 +1515,44 @@ struct pidcme { // o2-linter: disable=name/struct if (collision.qvecAmp()[detId] < 1e-8) { return; } + auto cent = collision.centFT0C(); int detInd = detId * 4 + cfgnTotalSystem * 4 * (nmode - 2); float psiN = helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode); for (const auto& trk : track1) { - if (!selTrack(trk)) + if (!selTrack(trk, cent)) continue; if (nmode == 2) { if (trk.sign() > 0) { - histosQA.fill(HIST("V2/PID/histCosDetV2_Pi"), collision.centFT0C(), trk.pt(), + histosQA.fill(HIST("V2/PID/histCosDetV2_Pi"), cent, trk.pt(), std::cos(static_cast(nmode) * (trk.phi() - psiN))); } else if (trk.sign() < 0) { - histosQA.fill(HIST("V2/PID/histCosDetV2_Pi_Neg"), collision.centFT0C(), trk.pt(), + histosQA.fill(HIST("V2/PID/histCosDetV2_Pi_Neg"), cent, trk.pt(), std::cos(static_cast(nmode) * (trk.phi() - psiN))); } } } for (const auto& trk : track2) { - if (!selTrack(trk)) + if (!selTrack(trk, cent)) continue; if (nmode == 2) { if (trk.sign() > 0) { - histosQA.fill(HIST("V2/PID/histCosDetV2_Ka"), collision.centFT0C(), trk.pt(), + histosQA.fill(HIST("V2/PID/histCosDetV2_Ka"), cent, trk.pt(), std::cos(static_cast(nmode) * (trk.phi() - psiN))); } else if (trk.sign() < 0) { - histosQA.fill(HIST("V2/PID/histCosDetV2_Ka_Neg"), collision.centFT0C(), trk.pt(), + histosQA.fill(HIST("V2/PID/histCosDetV2_Ka_Neg"), cent, trk.pt(), std::cos(static_cast(nmode) * (trk.phi() - psiN))); } } } for (const auto& trk : track3) { - if (!selTrack(trk)) + if (!selTrack(trk, cent)) continue; if (nmode == 2) { if (trk.sign() > 0) { - histosQA.fill(HIST("V2/PID/histCosDetV2_Pr"), collision.centFT0C(), trk.pt(), + histosQA.fill(HIST("V2/PID/histCosDetV2_Pr"), cent, trk.pt(), std::cos(static_cast(nmode) * (trk.phi() - psiN))); } else if (trk.sign() < 0) { - histosQA.fill(HIST("V2/PID/histCosDetV2_Pr_Neg"), collision.centFT0C(), trk.pt(), + histosQA.fill(HIST("V2/PID/histCosDetV2_Pr_Neg"), cent, trk.pt(), std::cos(static_cast(nmode) * (trk.phi() - psiN))); } } @@ -1345,40 +1560,44 @@ struct pidcme { // o2-linter: disable=name/struct if (cfgkOpenCME) { if (cfgkOpenPiPi) { for (const auto& trk1 : track1) { + if (!selTrack(trk1, cent)) + continue; for (const auto& trk2 : track1) { if (trk1.globalIndex() == trk2.globalIndex()) continue; + if (!selTrack(trk2, cent)) + continue; if (nmode == 2) { if (trk1.sign() == trk2.sign()) { - histosQA.fill(HIST("PIDCME/histgamama_PiPi_ss"), collision.centFT0C(), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_PiPi_ss"), collision.centFT0C(), std::cos((trk1.phi() - trk2.phi()))); - histosQA.fill(HIST("PIDCME/Differential/histgamama_PiPi_ss_Dif"), collision.centFT0C(), trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), + histosQA.fill(HIST("PIDCME/histgamama_PiPi_ss"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_PiPi_ss"), cent, std::cos((trk1.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/Differential/histgamama_PiPi_ss_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_PiPi_ss_Dif"), collision.centFT0C(), trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), + histosQA.fill(HIST("PIDCME/Differential/histdelta_PiPi_ss_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), std::cos((trk1.phi() - trk2.phi()))); if (cfgkOpenSsOsCrossCheck) { if (trk1.sign() > 0 && trk2.sign() > 0) { - histosQA.fill(HIST("PIDCME/histgamama_PiPi_PP"), collision.centFT0C(), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_PiPi_PP"), collision.centFT0C(), std::cos((trk1.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/histgamama_PiPi_PP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_PiPi_PP"), cent, std::cos((trk1.phi() - trk2.phi()))); } else { - histosQA.fill(HIST("PIDCME/histgamama_PiPi_NN"), collision.centFT0C(), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_PiPi_NN"), collision.centFT0C(), std::cos((trk1.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/histgamama_PiPi_NN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_PiPi_NN"), cent, std::cos((trk1.phi() - trk2.phi()))); } } } else { - histosQA.fill(HIST("PIDCME/histgamama_PiPi_os"), collision.centFT0C(), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_PiPi_os"), collision.centFT0C(), std::cos((trk1.phi() - trk2.phi()))); - histosQA.fill(HIST("PIDCME/Differential/histgamama_PiPi_os_Dif"), collision.centFT0C(), trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), + histosQA.fill(HIST("PIDCME/histgamama_PiPi_os"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_PiPi_os"), cent, std::cos((trk1.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/Differential/histgamama_PiPi_os_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_PiPi_os_Dif"), collision.centFT0C(), trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), + histosQA.fill(HIST("PIDCME/Differential/histdelta_PiPi_os_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), std::cos((trk1.phi() - trk2.phi()))); if (cfgkOpenSsOsCrossCheck) { if (trk1.sign() > 0 && trk2.sign() < 0) { - histosQA.fill(HIST("PIDCME/histgamama_PiPi_PN"), collision.centFT0C(), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_PiPi_PN"), collision.centFT0C(), std::cos((trk1.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/histgamama_PiPi_PN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_PiPi_PN"), cent, std::cos((trk1.phi() - trk2.phi()))); } else { - histosQA.fill(HIST("PIDCME/histgamama_PiPi_NP"), collision.centFT0C(), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_PiPi_NP"), collision.centFT0C(), std::cos((trk1.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/histgamama_PiPi_NP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_PiPi_NP"), cent, std::cos((trk1.phi() - trk2.phi()))); } } } @@ -1388,40 +1607,44 @@ struct pidcme { // o2-linter: disable=name/struct } if (cfgkOpenKaKa) { for (const auto& trk1 : track2) { + if (!selTrack(trk1, cent)) + continue; for (const auto& trk2 : track2) { if (trk1.globalIndex() == trk2.globalIndex()) continue; + if (!selTrack(trk2, cent)) + continue; if (nmode == 2) { if (trk1.sign() == trk2.sign()) { - histosQA.fill(HIST("PIDCME/histgamama_KaKa_ss"), collision.centFT0C(), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_KaKa_ss"), collision.centFT0C(), std::cos((trk1.phi() - trk2.phi()))); - histosQA.fill(HIST("PIDCME/Differential/histgamama_KaKa_ss_Dif"), collision.centFT0C(), trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), + histosQA.fill(HIST("PIDCME/histgamama_KaKa_ss"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_KaKa_ss"), cent, std::cos((trk1.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/Differential/histgamama_KaKa_ss_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_KaKa_ss_Dif"), collision.centFT0C(), trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), + histosQA.fill(HIST("PIDCME/Differential/histdelta_KaKa_ss_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), std::cos((trk1.phi() - trk2.phi()))); if (cfgkOpenSsOsCrossCheck) { if (trk1.sign() > 0 && trk2.sign() > 0) { - histosQA.fill(HIST("PIDCME/histgamama_KaKa_PP"), collision.centFT0C(), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_KaKa_PP"), collision.centFT0C(), std::cos((trk1.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/histgamama_KaKa_PP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_KaKa_PP"), cent, std::cos((trk1.phi() - trk2.phi()))); } else { - histosQA.fill(HIST("PIDCME/histgamama_KaKa_NN"), collision.centFT0C(), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_KaKa_NN"), collision.centFT0C(), std::cos((trk1.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/histgamama_KaKa_NN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_KaKa_NN"), cent, std::cos((trk1.phi() - trk2.phi()))); } } } else { - histosQA.fill(HIST("PIDCME/histgamama_KaKa_os"), collision.centFT0C(), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_KaKa_os"), collision.centFT0C(), std::cos((trk1.phi() - trk2.phi()))); - histosQA.fill(HIST("PIDCME/Differential/histgamama_KaKa_os_Dif"), collision.centFT0C(), trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), + histosQA.fill(HIST("PIDCME/histgamama_KaKa_os"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_KaKa_os"), cent, std::cos((trk1.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/Differential/histgamama_KaKa_os_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_KaKa_os_Dif"), collision.centFT0C(), trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), + histosQA.fill(HIST("PIDCME/Differential/histdelta_KaKa_os_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), std::cos((trk1.phi() - trk2.phi()))); if (cfgkOpenSsOsCrossCheck) { if (trk1.sign() > 0 && trk2.sign() < 0) { - histosQA.fill(HIST("PIDCME/histgamama_KaKa_PN"), collision.centFT0C(), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_KaKa_PN"), collision.centFT0C(), std::cos((trk1.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/histgamama_KaKa_PN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_KaKa_PN"), cent, std::cos((trk1.phi() - trk2.phi()))); } else { - histosQA.fill(HIST("PIDCME/histgamama_KaKa_NP"), collision.centFT0C(), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_KaKa_NP"), collision.centFT0C(), std::cos((trk1.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/histgamama_KaKa_NP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_KaKa_NP"), cent, std::cos((trk1.phi() - trk2.phi()))); } } } @@ -1431,40 +1654,44 @@ struct pidcme { // o2-linter: disable=name/struct } if (cfgkOpenPrPr) { for (const auto& trk1 : track3) { + if (!selTrack(trk1, cent)) + continue; for (const auto& trk2 : track3) { if (trk1.globalIndex() == trk2.globalIndex()) continue; + if (!selTrack(trk2, cent)) + continue; if (nmode == 2) { if (trk1.sign() == trk2.sign()) { - histosQA.fill(HIST("PIDCME/histgamama_PrPr_ss"), collision.centFT0C(), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_PrPr_ss"), collision.centFT0C(), std::cos((trk1.phi() - trk2.phi()))); - histosQA.fill(HIST("PIDCME/Differential/histgamama_PrPr_ss_Dif"), collision.centFT0C(), trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), + histosQA.fill(HIST("PIDCME/histgamama_PrPr_ss"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_PrPr_ss"), cent, std::cos((trk1.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/Differential/histgamama_PrPr_ss_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_PrPr_ss_Dif"), collision.centFT0C(), trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), + histosQA.fill(HIST("PIDCME/Differential/histdelta_PrPr_ss_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), std::cos((trk1.phi() - trk2.phi()))); if (cfgkOpenSsOsCrossCheck) { if (trk1.sign() > 0 && trk2.sign() > 0) { - histosQA.fill(HIST("PIDCME/histgamama_PrPr_PP"), collision.centFT0C(), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_PrPr_PP"), collision.centFT0C(), std::cos((trk1.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/histgamama_PrPr_PP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_PrPr_PP"), cent, std::cos((trk1.phi() - trk2.phi()))); } else { - histosQA.fill(HIST("PIDCME/histgamama_PrPr_NN"), collision.centFT0C(), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_PrPr_NN"), collision.centFT0C(), std::cos((trk1.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/histgamama_PrPr_NN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_PrPr_NN"), cent, std::cos((trk1.phi() - trk2.phi()))); } } } else { - histosQA.fill(HIST("PIDCME/histgamama_PrPr_os"), collision.centFT0C(), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_PrPr_os"), collision.centFT0C(), std::cos((trk1.phi() - trk2.phi()))); - histosQA.fill(HIST("PIDCME/Differential/histgamama_PrPr_os_Dif"), collision.centFT0C(), trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), + histosQA.fill(HIST("PIDCME/histgamama_PrPr_os"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_PrPr_os"), cent, std::cos((trk1.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/Differential/histgamama_PrPr_os_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_PrPr_os_Dif"), collision.centFT0C(), trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), + histosQA.fill(HIST("PIDCME/Differential/histdelta_PrPr_os_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), std::cos((trk1.phi() - trk2.phi()))); if (cfgkOpenSsOsCrossCheck) { if (trk1.sign() > 0 && trk2.sign() < 0) { - histosQA.fill(HIST("PIDCME/histgamama_PrPr_PN"), collision.centFT0C(), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_PrPr_PN"), collision.centFT0C(), std::cos((trk1.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/histgamama_PrPr_PN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_PrPr_PN"), cent, std::cos((trk1.phi() - trk2.phi()))); } else { - histosQA.fill(HIST("PIDCME/histgamama_PrPr_NP"), collision.centFT0C(), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_PrPr_NP"), collision.centFT0C(), std::cos((trk1.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/histgamama_PrPr_NP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_PrPr_NP"), cent, std::cos((trk1.phi() - trk2.phi()))); } } } @@ -1474,40 +1701,44 @@ struct pidcme { // o2-linter: disable=name/struct } if (cfgkOpenPiKa) { for (const auto& trk1 : track1) { + if (!selTrack(trk1, cent)) + continue; for (const auto& trk2 : track2) { if (trk1.globalIndex() == trk2.globalIndex()) continue; + if (!selTrack(trk2, cent)) + continue; if (nmode == 2) { if (trk1.sign() == trk2.sign()) { - histosQA.fill(HIST("PIDCME/histgamama_PiKa_ss"), collision.centFT0C(), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_PiKa_ss"), collision.centFT0C(), std::cos((trk1.phi() - trk2.phi()))); - histosQA.fill(HIST("PIDCME/Differential/histgamama_PiKa_ss_Dif"), collision.centFT0C(), trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), + histosQA.fill(HIST("PIDCME/histgamama_PiKa_ss"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_PiKa_ss"), cent, std::cos((trk1.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/Differential/histgamama_PiKa_ss_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_PiKa_ss_Dif"), collision.centFT0C(), trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), + histosQA.fill(HIST("PIDCME/Differential/histdelta_PiKa_ss_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), std::cos((trk1.phi() - trk2.phi()))); if (cfgkOpenSsOsCrossCheck) { if (trk1.sign() > 0 && trk2.sign() > 0) { - histosQA.fill(HIST("PIDCME/histgamama_PiKa_PP"), collision.centFT0C(), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_PiKa_PP"), collision.centFT0C(), std::cos((trk1.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/histgamama_PiKa_PP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_PiKa_PP"), cent, std::cos((trk1.phi() - trk2.phi()))); } else { - histosQA.fill(HIST("PIDCME/histgamama_PiKa_NN"), collision.centFT0C(), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_PiKa_NN"), collision.centFT0C(), std::cos((trk1.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/histgamama_PiKa_NN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_PiKa_NN"), cent, std::cos((trk1.phi() - trk2.phi()))); } } } else { - histosQA.fill(HIST("PIDCME/histgamama_PiKa_os"), collision.centFT0C(), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_PiKa_os"), collision.centFT0C(), std::cos((trk1.phi() - trk2.phi()))); - histosQA.fill(HIST("PIDCME/Differential/histgamama_PiKa_os_Dif"), collision.centFT0C(), trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), + histosQA.fill(HIST("PIDCME/histgamama_PiKa_os"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_PiKa_os"), cent, std::cos((trk1.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/Differential/histgamama_PiKa_os_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_PiKa_os_Dif"), collision.centFT0C(), trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), + histosQA.fill(HIST("PIDCME/Differential/histdelta_PiKa_os_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), std::cos((trk1.phi() - trk2.phi()))); if (cfgkOpenSsOsCrossCheck) { if (trk1.sign() > 0 && trk2.sign() < 0) { - histosQA.fill(HIST("PIDCME/histgamama_PiKa_PN"), collision.centFT0C(), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_PiKa_PN"), collision.centFT0C(), std::cos((trk1.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/histgamama_PiKa_PN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_PiKa_PN"), cent, std::cos((trk1.phi() - trk2.phi()))); } else { - histosQA.fill(HIST("PIDCME/histgamama_PiKa_NP"), collision.centFT0C(), std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_PiKa_NP"), collision.centFT0C(), std::cos((trk1.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/histgamama_PiKa_NP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_PiKa_NP"), cent, std::cos((trk1.phi() - trk2.phi()))); } } } @@ -1517,40 +1748,44 @@ struct pidcme { // o2-linter: disable=name/struct } if (cfgkOpenPiPr) { for (const auto& trk1 : track1) { + if (!selTrack(trk1, cent)) + continue; for (const auto& trk3 : track3) { if (trk1.globalIndex() == trk3.globalIndex()) continue; + if (!selTrack(trk3, cent)) + continue; if (nmode == 2) { if (trk1.sign() == trk3.sign()) { - histosQA.fill(HIST("PIDCME/histgamama_PiPr_ss"), collision.centFT0C(), std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_PiPr_ss"), collision.centFT0C(), std::cos((trk1.phi() - trk3.phi()))); - histosQA.fill(HIST("PIDCME/Differential/histgamama_PiPr_ss_Dif"), collision.centFT0C(), trk1.pt() + trk3.pt(), std::abs(trk1.eta() - trk3.eta()), + histosQA.fill(HIST("PIDCME/histgamama_PiPr_ss"), cent, std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_PiPr_ss"), cent, std::cos((trk1.phi() - trk3.phi()))); + histosQA.fill(HIST("PIDCME/Differential/histgamama_PiPr_ss_Dif"), cent, trk1.pt() + trk3.pt(), std::abs(trk1.eta() - trk3.eta()), std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_PiPr_ss_Dif"), collision.centFT0C(), trk1.pt() + trk3.pt(), std::abs(trk1.eta() - trk3.eta()), + histosQA.fill(HIST("PIDCME/Differential/histdelta_PiPr_ss_Dif"), cent, trk1.pt() + trk3.pt(), std::abs(trk1.eta() - trk3.eta()), std::cos((trk1.phi() - trk3.phi()))); if (cfgkOpenSsOsCrossCheck) { if (trk1.sign() > 0 && trk3.sign() > 0) { - histosQA.fill(HIST("PIDCME/histgamama_PiPr_PP"), collision.centFT0C(), std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_PiPr_PP"), collision.centFT0C(), std::cos((trk1.phi() - trk3.phi()))); + histosQA.fill(HIST("PIDCME/histgamama_PiPr_PP"), cent, std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_PiPr_PP"), cent, std::cos((trk1.phi() - trk3.phi()))); } else { - histosQA.fill(HIST("PIDCME/histgamama_PiPr_NN"), collision.centFT0C(), std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_PiPr_NN"), collision.centFT0C(), std::cos((trk1.phi() - trk3.phi()))); + histosQA.fill(HIST("PIDCME/histgamama_PiPr_NN"), cent, std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_PiPr_NN"), cent, std::cos((trk1.phi() - trk3.phi()))); } } } else { - histosQA.fill(HIST("PIDCME/histgamama_PiPr_os"), collision.centFT0C(), std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_PiPr_os"), collision.centFT0C(), std::cos((trk1.phi() - trk3.phi()))); - histosQA.fill(HIST("PIDCME/Differential/histgamama_PiPr_os_Dif"), collision.centFT0C(), trk1.pt() + trk3.pt(), std::abs(trk1.eta() - trk3.eta()), + histosQA.fill(HIST("PIDCME/histgamama_PiPr_os"), cent, std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_PiPr_os"), cent, std::cos((trk1.phi() - trk3.phi()))); + histosQA.fill(HIST("PIDCME/Differential/histgamama_PiPr_os_Dif"), cent, trk1.pt() + trk3.pt(), std::abs(trk1.eta() - trk3.eta()), std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_PiPr_os_Dif"), collision.centFT0C(), trk1.pt() + trk3.pt(), std::abs(trk1.eta() - trk3.eta()), + histosQA.fill(HIST("PIDCME/Differential/histdelta_PiPr_os_Dif"), cent, trk1.pt() + trk3.pt(), std::abs(trk1.eta() - trk3.eta()), std::cos((trk1.phi() - trk3.phi()))); if (cfgkOpenSsOsCrossCheck) { if (trk1.sign() > 0 && trk3.sign() < 0) { - histosQA.fill(HIST("PIDCME/histgamama_PiPr_PN"), collision.centFT0C(), std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_PiPr_PN"), collision.centFT0C(), std::cos((trk1.phi() - trk3.phi()))); + histosQA.fill(HIST("PIDCME/histgamama_PiPr_PN"), cent, std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_PiPr_PN"), cent, std::cos((trk1.phi() - trk3.phi()))); } else { - histosQA.fill(HIST("PIDCME/histgamama_PiPr_NP"), collision.centFT0C(), std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_PiPr_NP"), collision.centFT0C(), std::cos((trk1.phi() - trk3.phi()))); + histosQA.fill(HIST("PIDCME/histgamama_PiPr_NP"), cent, std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_PiPr_NP"), cent, std::cos((trk1.phi() - trk3.phi()))); } } } @@ -1560,40 +1795,44 @@ struct pidcme { // o2-linter: disable=name/struct } if (cfgkOpenKaPr) { for (const auto& trk2 : track2) { + if (!selTrack(trk2, cent)) + continue; for (const auto& trk3 : track3) { if (trk2.globalIndex() == trk3.globalIndex()) continue; + if (!selTrack(trk3, cent)) + continue; if (nmode == 2) { if (trk2.sign() == trk3.sign()) { - histosQA.fill(HIST("PIDCME/histgamama_KaPr_ss"), collision.centFT0C(), std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_KaPr_ss"), collision.centFT0C(), std::cos((trk2.phi() - trk3.phi()))); - histosQA.fill(HIST("PIDCME/Differential/histgamama_KaPr_ss_Dif"), collision.centFT0C(), trk2.pt() + trk3.pt(), std::abs(trk2.eta() - trk3.eta()), + histosQA.fill(HIST("PIDCME/histgamama_KaPr_ss"), cent, std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_KaPr_ss"), cent, std::cos((trk2.phi() - trk3.phi()))); + histosQA.fill(HIST("PIDCME/Differential/histgamama_KaPr_ss_Dif"), cent, trk2.pt() + trk3.pt(), std::abs(trk2.eta() - trk3.eta()), std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_KaPr_ss_Dif"), collision.centFT0C(), trk2.pt() + trk3.pt(), std::abs(trk2.eta() - trk3.eta()), + histosQA.fill(HIST("PIDCME/Differential/histdelta_KaPr_ss_Dif"), cent, trk2.pt() + trk3.pt(), std::abs(trk2.eta() - trk3.eta()), std::cos((trk2.phi() - trk3.phi()))); if (cfgkOpenSsOsCrossCheck) { if (trk2.sign() > 0 && trk3.sign() > 0) { - histosQA.fill(HIST("PIDCME/histgamama_KaPr_PP"), collision.centFT0C(), std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_KaPr_PP"), collision.centFT0C(), std::cos((trk2.phi() - trk3.phi()))); + histosQA.fill(HIST("PIDCME/histgamama_KaPr_PP"), cent, std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_KaPr_PP"), cent, std::cos((trk2.phi() - trk3.phi()))); } else { - histosQA.fill(HIST("PIDCME/histgamama_KaPr_NN"), collision.centFT0C(), std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_KaPr_NN"), collision.centFT0C(), std::cos((trk2.phi() - trk3.phi()))); + histosQA.fill(HIST("PIDCME/histgamama_KaPr_NN"), cent, std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_KaPr_NN"), cent, std::cos((trk2.phi() - trk3.phi()))); } } } else { - histosQA.fill(HIST("PIDCME/histgamama_KaPr_os"), collision.centFT0C(), std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_KaPr_os"), collision.centFT0C(), std::cos((trk2.phi() - trk3.phi()))); - histosQA.fill(HIST("PIDCME/Differential/histgamama_KaPr_os_Dif"), collision.centFT0C(), trk2.pt() + trk3.pt(), std::abs(trk2.eta() - trk3.eta()), + histosQA.fill(HIST("PIDCME/histgamama_KaPr_os"), cent, std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_KaPr_os"), cent, std::cos((trk2.phi() - trk3.phi()))); + histosQA.fill(HIST("PIDCME/Differential/histgamama_KaPr_os_Dif"), cent, trk2.pt() + trk3.pt(), std::abs(trk2.eta() - trk3.eta()), std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_KaPr_os_Dif"), collision.centFT0C(), trk2.pt() + trk3.pt(), std::abs(trk2.eta() - trk3.eta()), + histosQA.fill(HIST("PIDCME/Differential/histdelta_KaPr_os_Dif"), cent, trk2.pt() + trk3.pt(), std::abs(trk2.eta() - trk3.eta()), std::cos((trk2.phi() - trk3.phi()))); if (cfgkOpenSsOsCrossCheck) { if (trk2.sign() > 0 && trk3.sign() < 0) { - histosQA.fill(HIST("PIDCME/histgamama_KaPr_PN"), collision.centFT0C(), std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_KaPr_PN"), collision.centFT0C(), std::cos((trk2.phi() - trk3.phi()))); + histosQA.fill(HIST("PIDCME/histgamama_KaPr_PN"), cent, std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_KaPr_PN"), cent, std::cos((trk2.phi() - trk3.phi()))); } else { - histosQA.fill(HIST("PIDCME/histgamama_KaPr_NP"), collision.centFT0C(), std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/histdelta_KaPr_NP"), collision.centFT0C(), std::cos((trk2.phi() - trk3.phi()))); + histosQA.fill(HIST("PIDCME/histgamama_KaPr_NP"), cent, std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histdelta_KaPr_NP"), cent, std::cos((trk2.phi() - trk3.phi()))); } } } @@ -1604,8 +1843,16 @@ struct pidcme { // o2-linter: disable=name/struct } } - void process(soa::Filtered>::iterator const& collision, soa::Filtered> const& tracks) + void process(soa::Filtered>::iterator const& collision, aod::BCsWithTimestamps const&, soa::Filtered> const& tracks) { + auto bc = collision.bc_as(); + if ((hPosPrCut.empty()) || (hNegPrCut.empty())) { + initCCDB(bc); + LOGF(info, "==================CCDB file successfuly applied===================="); + LOGF(info, Form("size of hPosPrCut is %lu x %lu", hPosPrCut.size(), hPosPrCut[0].size())); + LOGF(info, Form("size of hNegPrCut is %lu x %lu", hNegPrCut.size(), hNegPrCut[0].size())); + LOGF(info, "==================================================================="); + } const auto cent = collision.centFT0C(); histosQA.fill(HIST("QA/histEventCount"), 0.5); if (!collision.sel8()) @@ -1637,6 +1884,9 @@ struct pidcme { // o2-linter: disable=name/struct histosQA.fill(HIST("QA/hist_multV0A_multT0A_after"), collision.multFT0A(), collision.multFV0A()); histosQA.fill(HIST("QA/hist_multT0C_centT0C_after"), cent, collision.multFT0C()); } + if (cfgkOpenDebugPIDCME) { + LOGF(info, "==================Event Cut Finished===================="); + } auto tracks1 = tracksSet1->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); auto tracks2 = tracksSet2->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); auto tracks3 = tracksSet3->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); @@ -1649,8 +1899,19 @@ struct pidcme { // o2-linter: disable=name/struct int detIndGlobal = detId * 4 + cfgnTotalSystem * 4 * (cfgnMods->at(i) - 2); float psiNGlobal = helperEP.GetEventPlane(collision.qvecRe()[detIndGlobal + 3], collision.qvecIm()[detIndGlobal + 3], cfgnMods->at(i)); for (const auto& trk : tracks) { - if (!selTrack(trk)) + if (!selTrack(trk, cent)) continue; + if (cfgkOpenTPCITSPurityCut && cfgkOpenTPCITSPurityCutQA) { + if (cent >= 20 && cent < 30) { + if ((trk.nPidFlag() == 3) || (trk.nPidFlag() == 8) || (trk.nPidFlag() == 9) || (trk.nPidFlag() == 10)) { + if (trk.sign() > 0) { + histosQA.fill(HIST("QA/histITSPuritycheck_Pr_Pos_Cen_20_30"), trk.nSigmaPrTPC(), trk.nSigmaPrITS(), trk.pt()); + } else { + histosQA.fill(HIST("QA/histITSPuritycheck_Pr_Neg_Cen_20_30"), trk.nSigmaPrTPC(), trk.nSigmaPrITS(), trk.pt()); + } + } + } + } histosQA.fill(HIST("V2/histSinDetV2"), cent, trk.pt(), std::sin(static_cast(cfgnMods->at(i)) * (trk.phi() - psiNGlobal))); histosQA.fill(HIST("V2/histCosDetV2"), cent, trk.pt(), @@ -1658,9 +1919,13 @@ struct pidcme { // o2-linter: disable=name/struct } if (cfgkOpenCME && cfgkOpenHaHa && cfgnMods->at(i) == 2) { for (const auto& trk1 : tracks) { + if (!selTrack(trk1, cent)) + continue; for (const auto& trk2 : tracks) { if (trk1.globalIndex() == trk2.globalIndex()) continue; + if (!selTrack(trk2, cent)) + continue; if (trk1.sign() == trk2.sign()) { histosQA.fill(HIST("PIDCME/histgamama_HaHa_ss"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); histosQA.fill(HIST("PIDCME/histdelta_HaHa_ss"), cent, std::cos((trk1.phi() - trk2.phi()))); From 1ef31089f982d2617fc11a4d0117c8632c10a32e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Tue, 18 Feb 2025 21:16:46 +0100 Subject: [PATCH 0298/1650] [DPG] Update qaEfficiency.cxx (#10057) --- DPG/Tasks/AOTTrack/qaEfficiency.cxx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/DPG/Tasks/AOTTrack/qaEfficiency.cxx b/DPG/Tasks/AOTTrack/qaEfficiency.cxx index 8680c839724..f308ccb8568 100644 --- a/DPG/Tasks/AOTTrack/qaEfficiency.cxx +++ b/DPG/Tasks/AOTTrack/qaEfficiency.cxx @@ -71,8 +71,12 @@ static constexpr int trkCutIdxN = 23; static constexpr int nSpecies = o2::track::PID::NIDs; // One per PDG static constexpr int nCharges = 2; static constexpr int nParticles = nSpecies * nCharges; -static constexpr const char* particleTitle[nParticles] = {"e", "#mu", "#pi", "K", "p", "d", "t", "^{3}He", "#alpha", - "e", "#mu", "#pi", "K", "p", "d", "t", "^{3}He", "#alpha"}; +static constexpr const char* particleTitle[nParticles] = {"e^{-}", "#mu^{-}", "#pi^{+}", + "K^{+}", "p", "d", + "t", "^{3}He", "#alpha", + "e^{+}", "#mu^{+}", "#pi^{-}", + "K^{-}", "#bar{p}", "#bar{d}", + "#bar{t}", "^{3}#bar{He}", "#bar{#alpha}"}; static constexpr int PDGs[nParticles] = {11, 13, 211, 321, 2212, 1000010020, 1000010030, 1000020030, 1000020040, -11, -13, -211, -321, -2212, -1000010020, -1000010030, -1000020030, -1000020040}; From 6a2170b9abc854a2ac7f04ba6747958006a5d814 Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Wed, 19 Feb 2025 04:24:49 +0800 Subject: [PATCH 0299/1650] [PWGCF] flowPtEfficiency: add pT-Nch; flowTask: remove group NUA (#10044) --- PWGCF/Flow/Tasks/flowPtEfficiency.cxx | 30 ++++++++---- PWGCF/Flow/Tasks/flowTask.cxx | 68 ++------------------------- 2 files changed, 25 insertions(+), 73 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowPtEfficiency.cxx b/PWGCF/Flow/Tasks/flowPtEfficiency.cxx index 92256cb3517..ad5980c1746 100644 --- a/PWGCF/Flow/Tasks/flowPtEfficiency.cxx +++ b/PWGCF/Flow/Tasks/flowPtEfficiency.cxx @@ -76,6 +76,7 @@ struct FlowPtEfficiency { ConfigurableAxis axisCentrality{"axisCentrality", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90}, "X axis for histograms"}; ConfigurableAxis axisPhi{"axisPhi", {100, 0.0f, constants::math::TwoPI}, ""}; ConfigurableAxis axisB{"axisB", {100, 0.0f, 20.0f}, "b (fm)"}; + ConfigurableAxis axisNch{"axisNch", {6000, 0, 6000}, "N_{ch}"}; // Filter the tracks Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls); @@ -93,6 +94,8 @@ struct FlowPtEfficiency { Filter mccollisionFilter = nabs(aod::mccollision::posZ) < cfgCutVertex; using MyMcCollisions = soa::Filtered; + Preslice perCollision = aod::track::collisionId; + // Additional filters for tracks TrackSelection myTrackSel; @@ -145,11 +148,12 @@ struct FlowPtEfficiency { // create histograms registry.add("eventCounter", "eventCounter", kTH1F, {axisCounter}); registry.add("hPtMCRec", "Monte Carlo Reco", {HistType::kTH1D, {axisPt}}); - registry.add("hPtCentMCRec", "Reco production; pT (GeV/c); centrality (%)", {HistType::kTH2D, {axisPt, axisCentrality}}); + registry.add("hPtNchMCRec", "Reco production; pT (GeV/c); multiplicity", {HistType::kTH2D, {axisPt, axisNch}}); registry.add("mcEventCounter", "Monte Carlo Truth EventCounter", kTH1F, {axisCounter}); registry.add("hPtMCGen", "Monte Carlo Truth", {HistType::kTH1D, {axisPt}}); - registry.add("hPtCentMCGen", "Truth production; pT (GeV/c); centrality (%)", {HistType::kTH2D, {axisPt, axisCentrality}}); + registry.add("hPtNchMCGen", "Truth production; pT (GeV/c); multiplicity", {HistType::kTH2D, {axisPt, axisNch}}); + registry.add("numberOfRecoCollisions", "numberOfRecoCollisions", kTH1F, {{10, -0.5f, 9.5f}}); if (cfgFlowEnabled) { registry.add("hImpactParameterReco", "hImpactParameterReco", {HistType::kTH1D, {axisB}}); @@ -393,7 +397,7 @@ struct FlowPtEfficiency { } if (isStable(mcParticle.pdgCode())) { registry.fill(HIST("hPtMCRec"), track.pt()); - registry.fill(HIST("hPtCentMCRec"), track.pt(), centrality); + registry.fill(HIST("hPtNchMCRec"), track.pt(), tracks.size()); if (cfgFlowEnabled) { bool withinPtPOI = (cfgFlowCutPtPOIMin < track.pt()) && (track.pt() < cfgFlowCutPtPOIMax); // within POI pT range @@ -425,20 +429,20 @@ struct FlowPtEfficiency { } PROCESS_SWITCH(FlowPtEfficiency, processReco, "process reconstructed information", true); - void processSim(MyMcCollisions::iterator const& collision, aod::BCsWithTimestamps const&, soa::SmallGroups> const& collisions, MyMcParticles const& mcParticles) + void processSim(MyMcCollisions::iterator const& mcCollision, aod::BCsWithTimestamps const&, soa::SmallGroups> const& collisions, MyMcParticles const& mcParticles, MyTracks const& tracks) { if (cfgSelRunNumberEnabled) { - auto bc = collision.bc_as(); + auto bc = mcCollision.bc_as(); int runNumber = bc.runNumber(); if (!std::count(cfgRunNumberList.value.begin(), cfgRunNumberList.value.end(), runNumber)) return; } - float imp = collision.impactParameter(); + float imp = mcCollision.impactParameter(); float centrality = 0.; if (cfgFlowEnabled) { registry.fill(HIST("hImpactParameterTruth"), imp); - auto bc = collision.bc_as(); + auto bc = mcCollision.bc_as(); loadCentVsIPTruth(bc.timestamp()); centrality = mCentVsIPTruth->GetBinContent(mCentVsIPTruth->GetXaxis()->FindBin(imp)); } @@ -448,10 +452,20 @@ struct FlowPtEfficiency { if (collisions.size() > -1) { registry.fill(HIST("mcEventCounter"), 0.5); + + registry.fill(HIST("numberOfRecoCollisions"), collisions.size()); // number of times coll was reco-ed + + std::vector numberOfTracks; + for (auto const& collision : collisions) { + auto groupedTracks = tracks.sliceBy(perCollision, collision.globalIndex()); + numberOfTracks.emplace_back(groupedTracks.size()); + } + for (const auto& mcParticle : mcParticles) { if (mcParticle.isPhysicalPrimary() && isStable(mcParticle.pdgCode())) { registry.fill(HIST("hPtMCGen"), mcParticle.pt()); - registry.fill(HIST("hPtCentMCGen"), mcParticle.pt(), centrality); + if (collisions.size() > 0) + registry.fill(HIST("hPtNchMCGen"), mcParticle.pt(), numberOfTracks[0]); if (cfgFlowEnabled) { bool withinPtPOI = (cfgFlowCutPtPOIMin < mcParticle.pt()) && (mcParticle.pt() < cfgFlowCutPtPOIMax); // within POI pT range diff --git a/PWGCF/Flow/Tasks/flowTask.cxx b/PWGCF/Flow/Tasks/flowTask.cxx index c652b8245c1..57eda5f982c 100644 --- a/PWGCF/Flow/Tasks/flowTask.cxx +++ b/PWGCF/Flow/Tasks/flowTask.cxx @@ -89,11 +89,8 @@ struct FlowTask { O2_DEFINE_CONFIGURABLE(cfgNbootstrap, int, 30, "Number of subsamples") O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeights, bool, false, "Fill and output NUA weights") O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeightsRefPt, bool, false, "NUA weights are filled in ref pt bins") - O2_DEFINE_CONFIGURABLE(cfgOutputGroupNUAWeights, bool, false, "Fill and output group NUA weights") O2_DEFINE_CONFIGURABLE(cfgEfficiency, std::string, "", "CCDB path to efficiency object") O2_DEFINE_CONFIGURABLE(cfgAcceptance, std::string, "", "CCDB path to acceptance object") - O2_DEFINE_CONFIGURABLE(cfgAcceptanceGroup, std::string, "", "CCDB path to group acceptance object") - O2_DEFINE_CONFIGURABLE(cfgAcceptanceGroupUse, bool, false, "Apply group acceptance, this option overrides cfgAcceptance") O2_DEFINE_CONFIGURABLE(cfgEvSelOccupancy, bool, true, "Occupancy cut") O2_DEFINE_CONFIGURABLE(cfgCutOccupancyHigh, int, 500, "High cut on TPC occupancy") O2_DEFINE_CONFIGURABLE(cfgCutOccupancyLow, int, 0, "Low cut on TPC occupancy") @@ -101,7 +98,6 @@ struct FlowTask { Configurable> cfgUserDefineGFWCorr{"cfgUserDefineGFWCorr", std::vector{"refN02 {2} refP02 {-2}", "refN12 {2} refP12 {-2}"}, "User defined GFW CorrelatorConfig"}; Configurable> cfgUserDefineGFWName{"cfgUserDefineGFWName", std::vector{"Ch02Gap22", "Ch12Gap22"}, "User defined GFW Name"}; Configurable> cfgRunRemoveList{"cfgRunRemoveList", std::vector{-1}, "excluded run numbers"}; - Configurable> cfgGroupSplitRunNumber{"cfgGroupSplitRunNumber", std::vector{544510, 544653}, "runnumbers for group splitting (suppose run numbers are increasing monotonically) "}; ConfigurableAxis axisVertex{"axisVertex", {40, -20, 20}, "vertex axis for histograms"}; ConfigurableAxis axisPhi{"axisPhi", {60, 0.0, constants::math::TwoPI}, "phi axis for histograms"}; @@ -123,7 +119,6 @@ struct FlowTask { // Corrections TH1D* mEfficiency = nullptr; GFWWeights* mAcceptance = nullptr; - TList* mGroupAcceptanceList = nullptr; bool correctionsLoaded = false; // Connect to ccdb @@ -135,7 +130,6 @@ struct FlowTask { OutputObj fFC{FlowContainer("FlowContainer")}; OutputObj fWeights{GFWWeights("weights")}; HistogramRegistry registry{"registry"}; - OutputObj fGroupNUAList{"GroupNUAList", OutputObjHandlingPolicy::AnalysisObject, OutputObjSourceType::OutputObjSource}; // define global variables GFW* fGFW = new GFW(); @@ -156,7 +150,6 @@ struct FlowTask { std::unordered_map gHadronicRate; ctpRateFetcher mRateFetcher; TH2* gCurrentHadronicRate; - std::vector> groupNUAWeightPtr; using AodCollisions = soa::Filtered>; using AodTracks = soa::Filtered>; @@ -261,27 +254,6 @@ struct FlowTask { fWeights->init(true, false); } - TList* groupNUAWeightlist = new TList(); - groupNUAWeightlist->SetOwner(true); - fGroupNUAList.setObject(groupNUAWeightlist); - - if (cfgOutputGroupNUAWeights) { - groupNUAWeightPtr.resize(cfgGroupSplitRunNumber.value.size() + 1); - for (uint i = 0; i < cfgGroupSplitRunNumber.value.size() + 1; i++) { - GFWWeights* groupweight = nullptr; - if (i < cfgGroupSplitRunNumber.value.size()) - groupweight = new GFWWeights(Form("groupweight_%d", cfgGroupSplitRunNumber.value[i])); - else - groupweight = new GFWWeights(Form("groupweight_last")); - - groupweight->setPtBins(nPtBins, ptBins); - groupweight->init(true, false); - groupNUAWeightlist->Add(groupweight); - std::shared_ptr sharePtrGroupWeight(groupweight); - groupNUAWeightPtr[i] = sharePtrGroupWeight; - } - } - // add in FlowContainer to Get boostrap sample automatically TObjArray* oba = new TObjArray(); oba->Add(new TNamed("ChGap22", "ChGap22")); @@ -505,13 +477,6 @@ struct FlowTask { else LOGF(warning, "Could not load acceptance weights from %s (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance); } - if (cfgAcceptanceGroup.value.empty() == false) { - mGroupAcceptanceList = ccdb->getForTimeStamp(cfgAcceptance, timestamp); - if (mGroupAcceptanceList == nullptr) { - LOGF(fatal, "Could not load grouped acceptance weights from %s", cfgAcceptanceGroup.value.c_str()); - } - LOGF(info, "Loaded grouped acceptance weights from %s (%p)", cfgAcceptanceGroup.value.c_str(), (void*)mGroupAcceptanceList); - } if (cfgEfficiency.value.empty() == false) { mEfficiency = ccdb->getForTimeStamp(cfgEfficiency, timestamp); if (mEfficiency == nullptr) { @@ -522,7 +487,7 @@ struct FlowTask { correctionsLoaded = true; } - bool setCurrentParticleWeights(float& weight_nue, float& weight_nua, float phi, float eta, float pt, float vtxz, int groupNUAIndex = 0) + bool setCurrentParticleWeights(float& weight_nue, float& weight_nua, float phi, float eta, float pt, float vtxz) { float eff = 1.; if (mEfficiency) @@ -532,14 +497,7 @@ struct FlowTask { if (eff == 0) return false; weight_nue = 1. / eff; - if (cfgAcceptanceGroupUse) { - if (mGroupAcceptanceList && mGroupAcceptanceList->At(groupNUAIndex)) { - weight_nua = reinterpret_cast(mGroupAcceptanceList->At(groupNUAIndex))->getNUA(phi, eta, vtxz); - } else { - weight_nua = 1; - } - return true; - } + if (mAcceptance) weight_nua = mAcceptance->getNUA(phi, eta, vtxz); else @@ -764,17 +722,6 @@ struct FlowTask { if (cfgUseNch) independent = static_cast(tracks.size()); - int groupNUAIndex = 0; - if (cfgOutputGroupNUAWeights || cfgAcceptanceGroupUse) { - for (uint i = 0; i < cfgGroupSplitRunNumber.value.size(); i++) { - if (currentRunNumber < cfgGroupSplitRunNumber.value.at(i)) { - break; - } else { - groupNUAIndex++; - } - } - } - for (const auto& track : tracks) { if (!trackSelected(track)) continue; @@ -788,16 +735,7 @@ struct FlowTask { fWeights->fill(track.phi(), track.eta(), vtxz, track.pt(), cent, 0); } } - if (cfgOutputGroupNUAWeights) { - if (cfgOutputNUAWeightsRefPt) { - if (withinPtRef) { - groupNUAWeightPtr[groupNUAIndex]->fill(track.phi(), track.eta(), vtxz, track.pt(), cent, 0); - } - } else { - groupNUAWeightPtr[groupNUAIndex]->fill(track.phi(), track.eta(), vtxz, track.pt(), cent, 0); - } - } - if (!setCurrentParticleWeights(weff, wacc, track.phi(), track.eta(), track.pt(), vtxz, groupNUAIndex)) + if (!setCurrentParticleWeights(weff, wacc, track.phi(), track.eta(), track.pt(), vtxz)) continue; registry.fill(HIST("hPt"), track.pt()); if (withinPtRef) { From 395e059284749ffc72e6ba96f02d0f7d027d26d2 Mon Sep 17 00:00:00 2001 From: Himanshu Sharma Date: Tue, 18 Feb 2025 21:48:26 +0100 Subject: [PATCH 0300/1650] [PWGHF] Add candidateSwapped info and fix PID getters in XicTree (#10037) Co-authored-by: Himanshu Sharma --- PWGHF/TableProducer/treeCreatorXicToPKPi.cxx | 24 +++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/PWGHF/TableProducer/treeCreatorXicToPKPi.cxx b/PWGHF/TableProducer/treeCreatorXicToPKPi.cxx index e791b53668c..2e1f8f45775 100644 --- a/PWGHF/TableProducer/treeCreatorXicToPKPi.cxx +++ b/PWGHF/TableProducer/treeCreatorXicToPKPi.cxx @@ -60,11 +60,11 @@ DECLARE_SOA_COLUMN(NSigTpcPi2, nSigTpcPi2, float); DECLARE_SOA_COLUMN(NSigTpcPr2, nSigTpcPr2, float); DECLARE_SOA_COLUMN(NSigTofPi2, nSigTofPi2, float); DECLARE_SOA_COLUMN(NSigTofPr2, nSigTofPr2, float); -DECLARE_SOA_COLUMN(NSigTpcTofPr0, nSigTpcTofPi0, float); -DECLARE_SOA_COLUMN(NSigTpcTofPi0, nSigTpcTofPr0, float); +DECLARE_SOA_COLUMN(NSigTpcTofPr0, nSigTpcTofPr0, float); +DECLARE_SOA_COLUMN(NSigTpcTofPi0, nSigTpcTofPi0, float); DECLARE_SOA_COLUMN(NSigTpcTofKa1, nSigTpcTofKa1, float); -DECLARE_SOA_COLUMN(NSigTpcTofPr2, nSigTpcTofPi2, float); -DECLARE_SOA_COLUMN(NSigTpcTofPi2, nSigTpcTofPr2, float); +DECLARE_SOA_COLUMN(NSigTpcTofPr2, nSigTpcTofPr2, float); +DECLARE_SOA_COLUMN(NSigTpcTofPi2, nSigTpcTofPi2, float); DECLARE_SOA_COLUMN(DecayLength, decayLength, float); DECLARE_SOA_COLUMN(DecayLengthXY, decayLengthXY, float); DECLARE_SOA_COLUMN(DecayLengthNormalised, decayLengthNormalised, float); @@ -75,6 +75,8 @@ DECLARE_SOA_COLUMN(Ct, ct, float); DECLARE_SOA_COLUMN(FlagMc, flagMc, int8_t); DECLARE_SOA_COLUMN(OriginMcRec, originMcRec, int8_t); DECLARE_SOA_COLUMN(OriginMcGen, originMcGen, int8_t); +DECLARE_SOA_COLUMN(IsCandidateSwapped, isCandidateSwapped, int8_t); + // Events DECLARE_SOA_COLUMN(IsEventReject, isEventReject, int); DECLARE_SOA_COLUMN(RunNumber, runNumber, int); @@ -116,7 +118,8 @@ DECLARE_SOA_TABLE(HfCandXicLites, "AOD", "HFCANDXICLITE", full::Eta, full::Phi, full::FlagMc, - full::OriginMcRec) + full::OriginMcRec, + full::IsCandidateSwapped) DECLARE_SOA_TABLE(HfCandXicFulls, "AOD", "HFCANDXICFULL", collision::PosX, @@ -185,7 +188,8 @@ DECLARE_SOA_TABLE(HfCandXicFulls, "AOD", "HFCANDXICFULL", full::Y, full::E, full::FlagMc, - full::OriginMcRec); + full::OriginMcRec, + full::IsCandidateSwapped); DECLARE_SOA_TABLE(HfCandXicFullEvs, "AOD", "HFCANDXICFULLEV", collision::NumContrib, @@ -261,9 +265,11 @@ struct HfTreeCreatorXicToPKPi { { int8_t flagMc = 0; int8_t originMc = 0; + int8_t candSwapped = -1; if constexpr (doMc) { flagMc = candidate.flagMcMatchRec(); originMc = candidate.originMcRec(); + candSwapped = candidate.isCandidateSwapped(); } float invMassXic = 0; @@ -314,7 +320,8 @@ struct HfTreeCreatorXicToPKPi { candidate.eta(), candidate.phi(), flagMc, - originMc); + originMc, + candSwapped); } else { rowCandidateFull( @@ -384,7 +391,8 @@ struct HfTreeCreatorXicToPKPi { hfHelper.yXic(candidate), hfHelper.eXic(candidate), flagMc, - originMc); + originMc, + candSwapped); } } From 51d0309cd0f5e9d85b5953bc616fcc73440507cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrea=20Tavira=20Garc=C3=ADa?= <118979672+atavirag@users.noreply.github.com> Date: Tue, 18 Feb 2025 23:04:26 +0100 Subject: [PATCH 0301/1650] [PWGHF] Increment PV Contrib range (#10048) --- PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx b/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx index b7bbb0bc723..6886abf4c73 100644 --- a/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx @@ -110,7 +110,7 @@ struct HfCorrelatorDMesonPairs { HistogramConfigSpec hTH1Pt{HistType::kTH1F, {{180, 0., 36.}}}; HistogramConfigSpec hTH1Y{HistType::kTH1F, {{100, -5., 5.}}}; - HistogramConfigSpec hTH1NContrib{HistType::kTH1F, {{120, -0.5, 119.5}}}; + HistogramConfigSpec hTH1NContrib{HistType::kTH1F, {{200, -0.5, 199.5}}}; HistogramConfigSpec hTH1Phi{HistType::kTH1F, {{32, 0., o2::constants::math::TwoPI}}}; HistogramConfigSpec hTH2Pid{HistType::kTH2F, {{500, 0., 10.}, {400, -20., 20.}}}; HistogramConfigSpec hTH3PtVsYVsNContrib{HistType::kTH3F, {{360, 0., 36.}, {20, -1., 1.}, {120, -0.5, 119.5}}}; From 5395061aa5306e8d6152c85f77ff0e9f45585cee Mon Sep 17 00:00:00 2001 From: Himanshu Sharma Date: Tue, 18 Feb 2025 23:32:45 +0100 Subject: [PATCH 0302/1650] [PWGHF] fixing tpc-tof pid column names and getters mismatch (#10059) --- PWGHF/TableProducer/treeCreatorLcToPKPi.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx b/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx index 8dfd9f517ee..5b2c5225ba0 100644 --- a/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx +++ b/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx @@ -66,11 +66,11 @@ DECLARE_SOA_COLUMN(NSigTpcPi2, nSigTpcPi2, float); DECLARE_SOA_COLUMN(NSigTpcPr2, nSigTpcPr2, float); DECLARE_SOA_COLUMN(NSigTofPi2, nSigTofPi2, float); DECLARE_SOA_COLUMN(NSigTofPr2, nSigTofPr2, float); -DECLARE_SOA_COLUMN(NSigTpcTofPr0, nSigTpcTofPi0, float); -DECLARE_SOA_COLUMN(NSigTpcTofPi0, nSigTpcTofPr0, float); +DECLARE_SOA_COLUMN(NSigTpcTofPr0, nSigTpcTofPr0, float); +DECLARE_SOA_COLUMN(NSigTpcTofPi0, nSigTpcTofPi0, float); DECLARE_SOA_COLUMN(NSigTpcTofKa1, nSigTpcTofKa1, float); -DECLARE_SOA_COLUMN(NSigTpcTofPr2, nSigTpcTofPi2, float); -DECLARE_SOA_COLUMN(NSigTpcTofPi2, nSigTpcTofPr2, float); +DECLARE_SOA_COLUMN(NSigTpcTofPr2, nSigTpcTofPr2, float); +DECLARE_SOA_COLUMN(NSigTpcTofPi2, nSigTpcTofPi2, float); DECLARE_SOA_COLUMN(DecayLength, decayLength, float); DECLARE_SOA_COLUMN(DecayLengthXY, decayLengthXY, float); DECLARE_SOA_COLUMN(DecayLengthNormalised, decayLengthNormalised, float); From 732fffe619e5f15f8c84afc975838f5879e26090 Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Wed, 19 Feb 2025 00:17:49 +0100 Subject: [PATCH 0303/1650] [PWGLF] Fix strangeness builder indexing (#10038) Co-authored-by: ALICE Builder --- .../Strangeness/strangenessbuilder.cxx | 83 +++++++----- .../strangenessbuilderfindable.cxx | 126 +++++++++++------- PWGLF/Utils/strangenessBuilderHelper.h | 4 + 3 files changed, 128 insertions(+), 85 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx index 03d2fe03657..79a5ba0b98e 100644 --- a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx @@ -22,6 +22,9 @@ // -- processMonteCarlo[Run2] .......: use this OR processRealData but NOT both // +#include +#include + #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" @@ -414,10 +417,22 @@ struct StrangenessBuilder { } } - // list enabled tables LOGF(info, "*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*"); - LOGF(info, " Strangeness builder: enabled table listing"); + LOGF(info, " Strangeness builder: basic configuration listing"); LOGF(info, "*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*"); + + if (doprocessRealData) { + LOGF(info, " ===> process function enabled: processRealData"); + } + if (doprocessRealDataRun2) { + LOGF(info, " ===> process function enabled: processRealDataRun2"); + } + if (doprocessMonteCarlo) { + LOGF(info, " ===> process function enabled: processMonteCarlo"); + } + if (doprocessMonteCarloRun2) { + LOGF(info, " ===> process function enabled: processMonteCarloRun2"); + } for (int i = 0; i < nTables; i++) { // printout to be improved in the future if (mEnabledTables[i]) { @@ -531,25 +546,25 @@ struct StrangenessBuilder { void populateCascadeInterlinks() { if (mEnabledTables[kCascToKFRefs]) { - for (auto& cascCore : interlinks.cascCoreToCascades) { + for (const auto& cascCore : interlinks.cascCoreToCascades) { cascToKFRefs(interlinks.cascadeToKFCascCores[cascCore]); histos.fill(HIST("hTableBuildingStatistics"), kCascToKFRefs); } } if (mEnabledTables[kCascToTraRefs]) { - for (auto& cascCore : interlinks.cascCoreToCascades) { + for (const auto& cascCore : interlinks.cascCoreToCascades) { cascToTraRefs(interlinks.cascadeToTraCascCores[cascCore]); histos.fill(HIST("hTableBuildingStatistics"), kCascToTraRefs); } } if (mEnabledTables[kKFToCascRefs]) { - for (auto& kfCascCore : interlinks.kfCascCoreToCascades) { + for (const auto& kfCascCore : interlinks.kfCascCoreToCascades) { kfToCascRefs(interlinks.cascadeToCascCores[kfCascCore]); histos.fill(HIST("hTableBuildingStatistics"), kKFToCascRefs); } } if (mEnabledTables[kTraToCascRefs]) { - for (auto& traCascCore : interlinks.traCascCoreToCascades) { + for (const auto& traCascCore : interlinks.traCascCoreToCascades) { traToCascRefs(interlinks.cascadeToCascCores[traCascCore]); histos.fill(HIST("hTableBuildingStatistics"), kTraToCascRefs); } @@ -565,7 +580,7 @@ struct StrangenessBuilder { v0Map.clear(); v0Map.resize(v0s.size(), -2); // marks not used if (mEnabledTables[kStoredCascCores]) { - for (auto& cascade : cascades) { + for (const auto& cascade : cascades) { if (v0Map[cascade.v0Id()] == -2) { v0sUsedInCascades++; } @@ -576,7 +591,7 @@ struct StrangenessBuilder { if constexpr (soa::is_table) { if (mEnabledTables[kStoredTraCascCores]) { trackedCascadeCount = trackedCascades.size(); - for (auto& trackedCascade : trackedCascades) { + for (const auto& trackedCascade : trackedCascades) { auto const& cascade = trackedCascade.cascade(); if (v0Map[cascade.v0Id()] == -2) { v0sUsedInCascades++; @@ -604,7 +619,7 @@ struct StrangenessBuilder { int nV0s = 0; // Loops over all V0s in the time frame histos.fill(HIST("hInputStatistics"), kV0CoresBase, v0s.size()); - for (auto& v0 : v0s) { + for (const auto& v0 : v0s) { if (!mEnabledTables[kV0CoresBase] && v0Map[v0.globalIndex()] == -2) { // this v0 hasn't been used by cascades and we're not generating V0s, so skip it v0dataLink(-1, -1); @@ -736,7 +751,7 @@ struct StrangenessBuilder { thisInfo.momentum[2] = originatingV0.pz(); if (originatingV0.has_mothers()) { - for (auto& lV0Mother : originatingV0.template mothers_as()) { + for (const auto& lV0Mother : originatingV0.template mothers_as()) { thisInfo.pdgCodeMother = lV0Mother.pdgCode(); thisInfo.motherLabel = lV0Mother.globalIndex(); } @@ -816,7 +831,7 @@ struct StrangenessBuilder { if constexpr (soa::is_table) { if (v0BuilderOpts.mc_populateV0MCCoresAsymmetric && (mEnabledTables[kV0MCCores] || mEnabledTables[kV0MCCollRefs])) { // first step: add any un-recoed v0mmcores that were requested - for (auto& mcParticle : mcParticles) { + for (const auto& mcParticle : mcParticles) { thisInfo.label = -1; thisInfo.motherLabel = -1; thisInfo.pdgCode = 0; @@ -832,7 +847,7 @@ struct StrangenessBuilder { if (mcParticleIsReco[mcParticle.globalIndex()] == true) continue; // skip if already created in list - if (TMath::Abs(mcParticle.y()) > v0BuilderOpts.mc_rapidityWindow) + if (std::fabs(mcParticle.y()) > v0BuilderOpts.mc_rapidityWindow) continue; // skip outside midrapidity if ( @@ -861,7 +876,7 @@ struct StrangenessBuilder { if (mcParticle.has_daughters()) { auto const& daughters = mcParticle.template daughters_as(); - for (auto& dau : daughters) { + for (const auto& dau : daughters) { if (dau.getProcess() != 4) continue; @@ -890,7 +905,7 @@ struct StrangenessBuilder { } } - for (auto info : mcV0infos) { + for (const auto& info : mcV0infos) { if (mEnabledTables[kV0MCCores]) { v0mccores( info.label, info.pdgCode, @@ -978,7 +993,7 @@ struct StrangenessBuilder { thisCascInfo.pdgCodeV0 = originatingV0.pdgCode(); if (originatingV0.has_mothers()) { - for (auto& lV0Mother : originatingV0.template mothers_as()) { + for (const auto& lV0Mother : originatingV0.template mothers_as()) { if (lV0Mother.globalIndex() == bachOriginating) { // found mother particle thisCascInfo.label = lV0Mother.globalIndex(); @@ -995,7 +1010,7 @@ struct StrangenessBuilder { thisCascInfo.momentum[1] = lV0Mother.py(); thisCascInfo.momentum[2] = lV0Mother.pz(); if (lV0Mother.has_mothers()) { - for (auto& lV0GrandMother : lV0Mother.template mothers_as()) { + for (const auto& lV0GrandMother : lV0Mother.template mothers_as()) { thisCascInfo.pdgCodeMother = lV0GrandMother.pdgCode(); thisCascInfo.motherLabel = lV0GrandMother.globalIndex(); } @@ -1026,7 +1041,7 @@ struct StrangenessBuilder { int nCascades = 0; // Loops over all cascades in the time frame histos.fill(HIST("hInputStatistics"), kStoredCascCores, cascades.size()); - for (auto& cascade : cascades) { + for (const auto& cascade : cascades) { // Get tracks and generate candidate auto const& collision = cascade.collision(); auto const& v0 = cascade.v0(); @@ -1162,8 +1177,8 @@ struct StrangenessBuilder { if (negTrack.has_mcParticle()) { auto baryonParticle = negTrack.template mcParticle_as(); if (baryonParticle.has_mothers() && bachelorParticle.has_mothers() && baryonParticle.pdgCode() == -2212) { - for (auto& baryonMother : baryonParticle.template mothers_as()) { - for (auto& pionMother : bachelorParticle.template mothers_as()) { + for (const auto& baryonMother : baryonParticle.template mothers_as()) { + for (const auto& pionMother : bachelorParticle.template mothers_as()) { if (baryonMother.globalIndex() == pionMother.globalIndex() && baryonMother.pdgCode() == -3122) { bbTag = true; } @@ -1176,8 +1191,8 @@ struct StrangenessBuilder { if (posTrack.has_mcParticle()) { auto baryonParticle = posTrack.template mcParticle_as(); if (baryonParticle.has_mothers() && bachelorParticle.has_mothers() && baryonParticle.pdgCode() == 2212) { - for (auto& baryonMother : baryonParticle.template mothers_as()) { - for (auto& pionMother : bachelorParticle.template mothers_as()) { + for (const auto& baryonMother : baryonParticle.template mothers_as()) { + for (const auto& pionMother : bachelorParticle.template mothers_as()) { if (baryonMother.globalIndex() == pionMother.globalIndex() && baryonMother.pdgCode() == 3122) { bbTag = true; } @@ -1202,7 +1217,7 @@ struct StrangenessBuilder { // now populate V0MCCores if in asymmetric mode if (cascadeBuilderOpts.mc_populateCascMCCoresAsymmetric) { // first step: add any un-recoed v0mmcores that were requested - for (auto& mcParticle : mcParticles) { + for (const auto& mcParticle : mcParticles) { thisCascInfo.pdgCode = -1, thisCascInfo.pdgCodeMother = -1; thisCascInfo.pdgCodePositive = -1, thisCascInfo.pdgCodeNegative = -1; thisCascInfo.pdgCodeBachelor = -1, thisCascInfo.pdgCodeV0 = -1; @@ -1221,7 +1236,7 @@ struct StrangenessBuilder { if (mcParticleIsReco[mcParticle.globalIndex()] == true) continue; // skip if already created in list - if (TMath::Abs(mcParticle.y()) > cascadeBuilderOpts.mc_rapidityWindow) + if (std::fabs(mcParticle.y()) > cascadeBuilderOpts.mc_rapidityWindow) continue; // skip outside midrapidity if ( @@ -1242,11 +1257,11 @@ struct StrangenessBuilder { if (mcParticle.has_daughters()) { auto const& daughters = mcParticle.template daughters_as(); - for (auto& dau : daughters) { + for (const auto& dau : daughters) { if (dau.getProcess() != 4) // check whether the daughter comes from a decay continue; - if (TMath::Abs(dau.pdgCode()) == 211 || TMath::Abs(dau.pdgCode()) == 321) { + if (std::abs(dau.pdgCode()) == 211 || std::abs(dau.pdgCode()) == 321) { thisCascInfo.pdgCodeBachelor = dau.pdgCode(); thisCascInfo.bachP[0] = dau.px(); thisCascInfo.bachP[1] = dau.py(); @@ -1256,10 +1271,10 @@ struct StrangenessBuilder { thisCascInfo.xyz[2] = dau.vz(); thisCascInfo.mcParticleBachelor = dau.globalIndex(); } - if (TMath::Abs(dau.pdgCode()) == 2212) { + if (std::abs(dau.pdgCode()) == 2212) { thisCascInfo.pdgCodeV0 = dau.pdgCode(); - for (auto& v0Dau : dau.template daughters_as()) { + for (const auto& v0Dau : dau.template daughters_as()) { if (v0Dau.getProcess() != 4) continue; @@ -1292,7 +1307,7 @@ struct StrangenessBuilder { } } - for (auto thisInfoToFill : mcCascinfos) { + for (const auto& thisInfoToFill : mcCascinfos) { if (mEnabledTables[kCascMCCores]) { cascmccores( // a lot of the info below will be compressed in case of not-recoed MC (good!) thisInfoToFill.pdgCode, thisInfoToFill.pdgCodeMother, thisInfoToFill.pdgCodeV0, thisInfoToFill.isPhysicalPrimary, @@ -1327,7 +1342,7 @@ struct StrangenessBuilder { int nCascades = 0; // Loops over all cascades in the time frame histos.fill(HIST("hInputStatistics"), kStoredKFCascCores, cascades.size()); - for (auto& cascade : cascades) { + for (const auto& cascade : cascades) { // Get tracks and generate candidate auto const& collision = cascade.collision(); auto const& v0 = cascade.v0(); @@ -1412,7 +1427,7 @@ struct StrangenessBuilder { int nCascades = 0; // Loops over all V0s in the time frame histos.fill(HIST("hInputStatistics"), kStoredTraCascCores, cascadeTracks.size()); - for (auto& cascadeTrack : cascadeTracks) { + for (const auto& cascadeTrack : cascadeTracks) { // Get tracks and generate candidate if (!cascadeTrack.has_track()) continue; // safety (should be fine but depends on future stratrack dev) @@ -1564,12 +1579,12 @@ struct StrangenessBuilder { void processRealData(aod::Collisions const& collisions, aod::V0s const& v0s, aod::Cascades const& cascades, aod::TrackedCascades const& trackedCascades, FullTracksExtIU const& tracks, aod::BCsWithTimestamps const& bcs) { - dataProcess(collisions, v0s, cascades, trackedCascades, tracks, bcs, (TObject*)nullptr); + dataProcess(collisions, v0s, cascades, trackedCascades, tracks, bcs, static_cast(nullptr)); } void processRealDataRun2(aod::Collisions const& collisions, aod::V0s const& v0s, aod::Cascades const& cascades, FullTracksExt const& tracks, aod::BCsWithTimestamps const& bcs) { - dataProcess(collisions, v0s, cascades, (TObject*)nullptr, tracks, bcs, (TObject*)nullptr); + dataProcess(collisions, v0s, cascades, static_cast(nullptr), tracks, bcs, static_cast(nullptr)); } void processMonteCarlo(aod::Collisions const& collisions, aod::V0s const& v0s, aod::Cascades const& cascades, aod::TrackedCascades const& trackedCascades, FullTracksExtLabeledIU const& tracks, aod::BCsWithTimestamps const& bcs, aod::McParticles const& mcParticles) @@ -1579,12 +1594,12 @@ struct StrangenessBuilder { void processMonteCarloRun2(aod::Collisions const& collisions, aod::V0s const& v0s, aod::Cascades const& cascades, FullTracksExtLabeled const& tracks, aod::BCsWithTimestamps const& bcs, aod::McParticles const& mcParticles) { - dataProcess(collisions, v0s, cascades, (TObject*)nullptr, tracks, bcs, mcParticles); + dataProcess(collisions, v0s, cascades, static_cast(nullptr), tracks, bcs, mcParticles); } void processSimulationFindable(aod::Collisions const& collisions, aod::FindableV0s const& v0s, aod::Cascades const& cascades, FullTracksExtIU const& tracks, aod::BCsWithTimestamps const& bcs) { - dataProcess(collisions, v0s, cascades, (TObject*)nullptr, tracks, bcs, (TObject*)nullptr); + dataProcess(collisions, v0s, cascades, static_cast(nullptr), tracks, bcs, static_cast(nullptr)); } PROCESS_SWITCH(StrangenessBuilder, processRealData, "process real data", true); diff --git a/PWGLF/TableProducer/Strangeness/strangenessbuilderfindable.cxx b/PWGLF/TableProducer/Strangeness/strangenessbuilderfindable.cxx index 38b0f938eda..2166f8e8ed8 100644 --- a/PWGLF/TableProducer/Strangeness/strangenessbuilderfindable.cxx +++ b/PWGLF/TableProducer/Strangeness/strangenessbuilderfindable.cxx @@ -22,6 +22,9 @@ // -- processMonteCarlo[Run2] .......: use this OR processRealData but NOT both // +#include +#include + #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" @@ -455,10 +458,25 @@ struct StrangenessBuilder { } } - // list enabled tables LOGF(info, "*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*"); - LOGF(info, " Strangeness builder: enabled table listing"); + LOGF(info, " Strangeness builder: basic configuration listing"); LOGF(info, "*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*"); + + if (doprocessRealData) { + LOGF(info, " ===> process function enabled: processRealData"); + } + if (doprocessRealDataRun2) { + LOGF(info, " ===> process function enabled: processRealDataRun2"); + } + if (doprocessMonteCarlo) { + LOGF(info, " ===> process function enabled: processMonteCarlo"); + } + if (doprocessMonteCarloRun2) { + LOGF(info, " ===> process function enabled: processMonteCarloRun2"); + } + + // list enabled tables + for (int i = 0; i < nTables; i++) { // printout to be improved in the future if (mEnabledTables[i]) { @@ -511,12 +529,15 @@ struct StrangenessBuilder { // for sorting template - std::vector sort_indices(const std::vector& v) + std::vector sort_indices(const std::vector& v, bool doSorting = false) { std::vector idx(v.size()); std::iota(idx.begin(), idx.end(), 0); - std::stable_sort(idx.begin(), idx.end(), - [&v](std::size_t i1, std::size_t i2) { return v[i1].collisionId < v[i2].collisionId; }); + if (doSorting) { + // do sorting only if requested (not always necessary) + std::stable_sort(idx.begin(), idx.end(), + [&v](std::size_t i1, std::size_t i2) { return v[i1].collisionId < v[i2].collisionId; }); + } return idx; } @@ -584,25 +605,25 @@ struct StrangenessBuilder { void populateCascadeInterlinks() { // if (mEnabledTables[kCascToKFRefs]) { - // for (auto& cascCore : interlinks.cascCoreToCascades) { + // for (const auto& cascCore : interlinks.cascCoreToCascades) { // cascToKFRefs(interlinks.cascadeToKFCascCores[cascCore]); // histos.fill(HIST("hTableBuildingStatistics"), kCascToKFRefs); // } // } // if (mEnabledTables[kCascToTraRefs]) { - // for (auto& cascCore : interlinks.cascCoreToCascades) { + // for (const auto& cascCore : interlinks.cascCoreToCascades) { // cascToTraRefs(interlinks.cascadeToTraCascCores[cascCore]); // histos.fill(HIST("hTableBuildingStatistics"), kCascToTraRefs); // } // } // if (mEnabledTables[kKFToCascRefs]) { - // for (auto& kfCascCore : interlinks.kfCascCoreToCascades) { + // for (const auto& kfCascCore : interlinks.kfCascCoreToCascades) { // kfToCascRefs(interlinks.cascadeToCascCores[kfCascCore]); // histos.fill(HIST("hTableBuildingStatistics"), kKFToCascRefs); // } // } // if (mEnabledTables[kTraToCascRefs]) { - // for (auto& traCascCore : interlinks.traCascCoreToCascades) { + // for (const auto& traCascCore : interlinks.traCascCoreToCascades) { // traToCascRefs(interlinks.cascadeToCascCores[traCascCore]); // histos.fill(HIST("hTableBuildingStatistics"), kTraToCascRefs); // } @@ -650,7 +671,7 @@ struct StrangenessBuilder { bestCollisionNContribsArray.resize(mcCollisions.size(), -1); // marks not reconstructed // single loop over double loop at a small cost in memory for extra array - for (auto& collision : collisions) { + for (const auto& collision : collisions) { if (collision.has_mcCollision()) { if (collision.numContrib() > bestCollisionNContribsArray[collision.mcCollisionId()]) { bestCollisionArray[collision.mcCollisionId()] = collision.globalIndex(); @@ -663,7 +684,7 @@ struct StrangenessBuilder { if (mc_findableMode.value < 2) { // simple passthrough: copy existing v0s to build list - for (auto& v0 : v0s) { + for (const auto& v0 : v0s) { currentV0Entry.globalId = v0.globalIndex(); currentV0Entry.collisionId = v0.collisionId(); currentV0Entry.posTrackId = v0.posTrackId(); @@ -686,7 +707,7 @@ struct StrangenessBuilder { std::vector negativeTrackArray; // vector elements: track index, origin index [, mc collision id, pdg code] int dummy = -1; // unnecessary in this path - for (auto& track : tracks) { + for (const auto& track : tracks) { if (!track.has_mcParticle()) { continue; // skip this, it's trouble } @@ -723,8 +744,8 @@ struct StrangenessBuilder { } // Nested loop only with valuable tracks - for (auto& positiveTrackIndex : positiveTrackArray) { - for (auto& negativeTrackIndex : negativeTrackArray) { + for (const auto& positiveTrackIndex : positiveTrackArray) { + for (const auto& negativeTrackIndex : negativeTrackArray) { if (positiveTrackIndex.originId != negativeTrackIndex.originId) { continue; // not the same originating particle } @@ -767,7 +788,7 @@ struct StrangenessBuilder { currentV0Entry.pdgCode = positiveTrackIndex.pdgCode; currentV0Entry.particleId = positiveTrackIndex.originId; currentV0Entry.isCollinearV0 = false; - for (auto& v0 : v0s) { + for (const auto& v0 : v0s) { if (v0.posTrackId() == positiveTrackIndex.globalId && v0.negTrackId() == negativeTrackIndex.globalId) { // this will override type, but not collision index @@ -789,16 +810,16 @@ struct StrangenessBuilder { // determine properly collision-id-sorted index array for later use // N.B.: necessary also before cascade part sorted_v0.clear(); - sorted_v0 = sort_indices(v0List); + sorted_v0 = sort_indices(v0List, (mc_findableMode.value > 0)); // Cascade part if (mc_findableMode.value < 2) { // simple passthrough: copy existing cascades to build list - for (auto& cascade : cascades) { + for (const auto& cascade : cascades) { auto const& v0 = cascade.v0(); currentCascadeEntry.globalId = cascade.globalIndex(); currentCascadeEntry.collisionId = cascade.collisionId(); - currentCascadeEntry.v0Id = -1; // fill this in one go later + currentCascadeEntry.v0Id = v0.globalIndex(); currentCascadeEntry.posTrackId = v0.posTrackId(); currentCascadeEntry.negTrackId = v0.negTrackId(); currentCascadeEntry.bachTrackId = cascade.bachelorId(); @@ -817,7 +838,7 @@ struct StrangenessBuilder { std::vector bachelorTrackArray; // vector elements: track index, origin index, mc collision id, pdg code] int dummy = -1; // unnecessary in this path - for (auto& track : tracks) { + for (const auto& track : tracks) { if (!track.has_mcParticle()) { continue; // skip this, it's trouble } @@ -922,7 +943,7 @@ struct StrangenessBuilder { currentCascadeEntry.negTrackId = v0.negTrackId; currentCascadeEntry.bachTrackId = bachelorTrackIndex.globalId; currentCascadeEntry.cascadeType = 1; // findable (but not found) - for (auto& cascade : cascades) { + for (const auto& cascade : cascades) { auto const& v0fromAOD = cascade.v0(); if (v0fromAOD.posTrackId() == v0.posTrackId && v0fromAOD.negTrackId() == v0.negTrackId && @@ -930,7 +951,7 @@ struct StrangenessBuilder { // this will override type, but not collision index // N.B.: collision index checks still desirable! currentCascadeEntry.cascadeType = 0; - currentCascadeEntry.globalId = v0fromAOD.globalIndex(); + currentCascadeEntry.globalId = cascade.globalIndex(); } } if (cascadeBuilderOpts.mc_findableDetachedCascade.value || currentV0Entry.collisionId >= 0) { @@ -955,14 +976,13 @@ struct StrangenessBuilder { } } } - - // we need to allow for sorted use of cascadeList - sorted_cascade.clear(); - sorted_cascade = sort_indices(cascadeList); - // we should now be done! } // end findable mode check } // end soa::is_table + + // we need to allow for sorted use of cascadeList + sorted_cascade.clear(); + sorted_cascade = sort_indices(cascadeList, (mc_findableMode.value > 0)); } //__________________________________________________ @@ -974,7 +994,7 @@ struct StrangenessBuilder { v0Map.clear(); v0Map.resize(v0List.size(), -2); // marks not used if (mEnabledTables[kStoredCascCores]) { - for (auto& cascade : cascadeList) { + for (const auto& cascade : cascadeList) { if (v0Map[cascade.v0Id] == -2) { v0sUsedInCascades++; } @@ -986,7 +1006,7 @@ struct StrangenessBuilder { // tracked only created outside of findable mode if (mEnabledTables[kStoredTraCascCores] && mc_findableMode.value == 0) { trackedCascadeCount = trackedCascades.size(); - for (auto& trackedCascade : trackedCascades) { + for (const auto& trackedCascade : trackedCascades) { auto const& cascade = trackedCascade.cascade(); if (v0Map[cascade.v0Id()] == -2) { v0sUsedInCascades++; @@ -1014,7 +1034,9 @@ struct StrangenessBuilder { int nV0s = 0; // Loops over all V0s in the time frame histos.fill(HIST("hInputStatistics"), kV0CoresBase, v0s.size()); - for (auto& v0 : v0s) { + for (size_t iv0 = 0; iv0 < v0List.size(); iv0++) { + const auto& v0 = v0List[sorted_v0[iv0]]; + if (!mEnabledTables[kV0CoresBase] && v0Map[v0.globalId] == -2) { // this v0 hasn't been used by cascades and we're not generating V0s, so skip it v0dataLink(-1, -1); @@ -1146,7 +1168,7 @@ struct StrangenessBuilder { thisInfo.momentum[2] = originatingV0.pz(); if (originatingV0.has_mothers()) { - for (auto& lV0Mother : originatingV0.template mothers_as()) { + for (const auto& lV0Mother : originatingV0.template mothers_as()) { thisInfo.pdgCodeMother = lV0Mother.pdgCode(); thisInfo.motherLabel = lV0Mother.globalIndex(); } @@ -1226,7 +1248,7 @@ struct StrangenessBuilder { if constexpr (soa::is_table) { if (v0BuilderOpts.mc_populateV0MCCoresAsymmetric && (mEnabledTables[kV0MCCores] || mEnabledTables[kV0MCCollRefs])) { // first step: add any un-recoed v0mmcores that were requested - for (auto& mcParticle : mcParticles) { + for (const auto& mcParticle : mcParticles) { thisInfo.label = -1; thisInfo.motherLabel = -1; thisInfo.pdgCode = 0; @@ -1242,7 +1264,7 @@ struct StrangenessBuilder { if (mcParticleIsReco[mcParticle.globalIndex()] == true) continue; // skip if already created in list - if (TMath::Abs(mcParticle.y()) > v0BuilderOpts.mc_rapidityWindow) + if (std::fabs(mcParticle.y()) > v0BuilderOpts.mc_rapidityWindow) continue; // skip outside midrapidity if ( @@ -1271,7 +1293,7 @@ struct StrangenessBuilder { if (mcParticle.has_daughters()) { auto const& daughters = mcParticle.template daughters_as(); - for (auto& dau : daughters) { + for (const auto& dau : daughters) { if (dau.getProcess() != 4) continue; @@ -1300,7 +1322,7 @@ struct StrangenessBuilder { } } - for (auto info : mcV0infos) { + for (const auto& info : mcV0infos) { if (mEnabledTables[kV0MCCores]) { v0mccores( info.label, info.pdgCode, @@ -1388,7 +1410,7 @@ struct StrangenessBuilder { thisCascInfo.pdgCodeV0 = originatingV0.pdgCode(); if (originatingV0.has_mothers()) { - for (auto& lV0Mother : originatingV0.template mothers_as()) { + for (const auto& lV0Mother : originatingV0.template mothers_as()) { if (lV0Mother.globalIndex() == bachOriginating) { // found mother particle thisCascInfo.label = lV0Mother.globalIndex(); @@ -1436,8 +1458,9 @@ struct StrangenessBuilder { int nCascades = 0; // Loops over all cascades in the time frame histos.fill(HIST("hInputStatistics"), kStoredCascCores, cascades.size()); - for (auto& cascade : cascades) { + for (size_t icascade = 0; icascade < cascades.size(); icascade++) { // Get tracks and generate candidate + auto const& cascade = cascades[sorted_cascade[icascade]]; auto const& collision = collisions.rawIteratorAt(cascade.collisionId); auto const& posTrack = tracks.rawIteratorAt(cascade.posTrackId); auto const& negTrack = tracks.rawIteratorAt(cascade.negTrackId); @@ -1571,8 +1594,8 @@ struct StrangenessBuilder { if (negTrack.has_mcParticle()) { auto baryonParticle = negTrack.template mcParticle_as(); if (baryonParticle.has_mothers() && bachelorParticle.has_mothers() && baryonParticle.pdgCode() == -2212) { - for (auto& baryonMother : baryonParticle.template mothers_as()) { - for (auto& pionMother : bachelorParticle.template mothers_as()) { + for (const auto& baryonMother : baryonParticle.template mothers_as()) { + for (const auto& pionMother : bachelorParticle.template mothers_as()) { if (baryonMother.globalIndex() == pionMother.globalIndex() && baryonMother.pdgCode() == -3122) { bbTag = true; } @@ -1585,8 +1608,8 @@ struct StrangenessBuilder { if (posTrack.has_mcParticle()) { auto baryonParticle = posTrack.template mcParticle_as(); if (baryonParticle.has_mothers() && bachelorParticle.has_mothers() && baryonParticle.pdgCode() == 2212) { - for (auto& baryonMother : baryonParticle.template mothers_as()) { - for (auto& pionMother : bachelorParticle.template mothers_as()) { + for (const auto& baryonMother : baryonParticle.template mothers_as()) { + for (const auto& pionMother : bachelorParticle.template mothers_as()) { if (baryonMother.globalIndex() == pionMother.globalIndex() && baryonMother.pdgCode() == 3122) { bbTag = true; } @@ -1630,7 +1653,7 @@ struct StrangenessBuilder { if (mcParticleIsReco[mcParticle.globalIndex()] == true) continue; // skip if already created in list - if (TMath::Abs(mcParticle.y()) > cascadeBuilderOpts.mc_rapidityWindow) + if (std::fabs(mcParticle.y()) > cascadeBuilderOpts.mc_rapidityWindow) continue; // skip outside midrapidity if ( @@ -1651,11 +1674,11 @@ struct StrangenessBuilder { if (mcParticle.has_daughters()) { auto const& daughters = mcParticle.template daughters_as(); - for (auto& dau : daughters) { + for (const auto& dau : daughters) { if (dau.getProcess() != 4) // check whether the daughter comes from a decay continue; - if (TMath::Abs(dau.pdgCode()) == 211 || TMath::Abs(dau.pdgCode()) == 321) { + if (std::abs(dau.pdgCode()) == 211 || std::abs(dau.pdgCode()) == 321) { thisCascInfo.pdgCodeBachelor = dau.pdgCode(); thisCascInfo.bachP[0] = dau.px(); thisCascInfo.bachP[1] = dau.py(); @@ -1665,10 +1688,10 @@ struct StrangenessBuilder { thisCascInfo.xyz[2] = dau.vz(); thisCascInfo.mcParticleBachelor = dau.globalIndex(); } - if (TMath::Abs(dau.pdgCode()) == 2212) { + if (std::abs(dau.pdgCode()) == 2212) { thisCascInfo.pdgCodeV0 = dau.pdgCode(); - for (auto& v0Dau : dau.template daughters_as()) { + for (const auto& v0Dau : dau.template daughters_as()) { if (v0Dau.getProcess() != 4) continue; @@ -1701,7 +1724,7 @@ struct StrangenessBuilder { } } - for (auto thisInfoToFill : mcCascinfos) { + for (const auto& thisInfoToFill : mcCascinfos) { if (mEnabledTables[kCascMCCores]) { cascmccores( // a lot of the info below will be compressed in case of not-recoed MC (good!) thisInfoToFill.pdgCode, thisInfoToFill.pdgCodeMother, thisInfoToFill.pdgCodeV0, thisInfoToFill.isPhysicalPrimary, @@ -1736,8 +1759,9 @@ struct StrangenessBuilder { int nCascades = 0; // Loops over all cascades in the time frame histos.fill(HIST("hInputStatistics"), kStoredKFCascCores, cascades.size()); - for (auto& cascade : cascades) { + for (size_t icascade = 0; icascade < cascades.size(); icascade++) { // Get tracks and generate candidate + auto const& cascade = cascades[sorted_cascade[icascade]]; auto const& collision = collisions.rawIteratorAt(cascade.collisionId); auto const& posTrack = tracks.rawIteratorAt(cascade.posTrackId); auto const& negTrack = tracks.rawIteratorAt(cascade.negTrackId); @@ -1820,7 +1844,7 @@ struct StrangenessBuilder { int nCascades = 0; // Loops over all V0s in the time frame histos.fill(HIST("hInputStatistics"), kStoredTraCascCores, cascadeTracks.size()); - for (auto& cascadeTrack : cascadeTracks) { + for (const auto& cascadeTrack : cascadeTracks) { // Get tracks and generate candidate if (!cascadeTrack.has_track()) continue; // safety (should be fine but depends on future stratrack dev) @@ -1975,12 +1999,12 @@ struct StrangenessBuilder { void processRealData(aod::Collisions const& collisions, aod::V0s const& v0s, aod::Cascades const& cascades, aod::TrackedCascades const& trackedCascades, FullTracksExtIU const& tracks, aod::BCsWithTimestamps const& bcs) { - dataProcess(collisions, (TObject*)nullptr, v0s, cascades, trackedCascades, tracks, bcs, (TObject*)nullptr); + dataProcess(collisions, static_cast(nullptr), v0s, cascades, trackedCascades, tracks, bcs, static_cast(nullptr)); } void processRealDataRun2(aod::Collisions const& collisions, aod::V0s const& v0s, aod::Cascades const& cascades, FullTracksExt const& tracks, aod::BCsWithTimestamps const& bcs) { - dataProcess(collisions, (TObject*)nullptr, v0s, cascades, (TObject*)nullptr, tracks, bcs, (TObject*)nullptr); + dataProcess(collisions, static_cast(nullptr), v0s, cascades, static_cast(nullptr), tracks, bcs, static_cast(nullptr)); } void processMonteCarlo(soa::Join const& collisions, aod::McCollisions const& mccollisions, aod::V0s const& v0s, aod::Cascades const& cascades, aod::TrackedCascades const& trackedCascades, FullTracksExtLabeledIU const& tracks, aod::BCsWithTimestamps const& bcs, aod::McParticles const& mcParticles) @@ -1990,7 +2014,7 @@ struct StrangenessBuilder { void processMonteCarloRun2(soa::Join const& collisions, aod::McCollisions const& mccollisions, aod::V0s const& v0s, aod::Cascades const& cascades, FullTracksExtLabeled const& tracks, aod::BCsWithTimestamps const& bcs, aod::McParticles const& mcParticles) { - dataProcess(collisions, mccollisions, v0s, cascades, (TObject*)nullptr, tracks, bcs, mcParticles); + dataProcess(collisions, mccollisions, v0s, cascades, static_cast(nullptr), tracks, bcs, mcParticles); } PROCESS_SWITCH(StrangenessBuilder, processRealData, "process real data", true); diff --git a/PWGLF/Utils/strangenessBuilderHelper.h b/PWGLF/Utils/strangenessBuilderHelper.h index a2582daa9fa..bed7cc74955 100644 --- a/PWGLF/Utils/strangenessBuilderHelper.h +++ b/PWGLF/Utils/strangenessBuilderHelper.h @@ -299,6 +299,9 @@ class strangenessBuilderHelper } } + // set collision Id correctly + v0.collisionId = collision.globalIndex(); + // information validated, V0 built successfully. Signal OK return true; } @@ -469,6 +472,7 @@ class strangenessBuilderHelper // Populate information // cascadecandidate.v0Id = v0index.globalIndex(); + cascade.collisionId = collision.globalIndex(); cascade.positiveTrack = positiveTrack.globalIndex(); cascade.negativeTrack = negativeTrack.globalIndex(); cascade.bachelorTrack = bachelorTrack.globalIndex(); From 03ca30c3d262b321ac38ee4e781745138d484978 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Wed, 19 Feb 2025 01:34:06 +0100 Subject: [PATCH 0304/1650] [PWGLF] Change histogram binning (#10049) --- PWGLF/Tasks/Resonances/highmasslambda.cxx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/PWGLF/Tasks/Resonances/highmasslambda.cxx b/PWGLF/Tasks/Resonances/highmasslambda.cxx index 49f6c0d8218..300dea34f90 100644 --- a/PWGLF/Tasks/Resonances/highmasslambda.cxx +++ b/PWGLF/Tasks/Resonances/highmasslambda.cxx @@ -180,7 +180,7 @@ struct highmasslambda { std::vector cpaV0Binning = {0.995, 0.996, 0.997, 0.998, 0.999, 0.9995, 0.9997, 0.9999, 1.005}; std::vector ptV0Binning = {0.0, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1.0, 1.5, 100.0}; std::vector dcaBetweenV0 = {0.0, 0.05, 0.1, 0.15, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1.0}; - std::vector dcaBetweenProtonV0 = {-0.05, -0.04, -0.03, -0.025, -0.02, -0.01, -0.005, -0.004, -0.003, -0.003, -0.002, -0.001, 0.0, 0.001, 0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.01, 0.012, 0.014, 0.016, 0.018, 0.02, 0.025, 0.03, 0.04, 0.05, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2, 0.3, 0.4, 0.5, 1.0}; + std::vector dcaBetweenProtonV0 = {-2.0, -1.0, -0.5, -0.4, -0.3, -0.2, -0.18, -0.16, -0.14, -0.12, -0.1, -0.08, -0.06, -0.05, -0.04, -0.03, -0.025, -0.02, -0.01, -0.005, -0.004, -0.003, -0.003, -0.002, -0.001, 0.0, 0.001, 0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.01, 0.012, 0.014, 0.016, 0.018, 0.02, 0.025, 0.03, 0.04, 0.05, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2, 0.3, 0.4, 0.5, 1.0, 2.0}; AxisSpec resAxis = {1600, -30, 30, "Res"}; AxisSpec phiAxis = {500, -6.28, 6.28, "phi"}; @@ -237,8 +237,8 @@ struct highmasslambda { histos.add("hSparseV2SAMixedEvent_V2", "hSparseV2SAMixedEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, dcaV0toPVBinning, cpaV0Binning, ptV0Binning, dcaBetweenV0, dcaBetweenProtonV0}); } if (useKshortOpti == 2) { - histos.add("hSparseV2SASameEvent_V2", "hSparseV2SASameEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2}); - histos.add("hSparseV2SAMixedEvent_V2", "hSparseV2SAMixedEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2}); + histos.add("hSparseV2SASameEvent_V2", "hSparseV2SASameEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, dcaBetweenProtonV0}); + histos.add("hSparseV2SAMixedEvent_V2", "hSparseV2SAMixedEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, dcaBetweenProtonV0}); } // histogram for resolution histos.add("ResFT0CTPC", "ResFT0CTPC", kTH2F, {centAxis, resAxis}); @@ -717,7 +717,7 @@ struct highmasslambda { histos.fill(HIST("hSparseV2SASameEvent_V2"), Lambdac.M(), Lambdac.Pt(), dcaV0toPV, cpaV0, ptV0, dcaV0Daughters, dcaProtonV0); } if (useKshortOpti == 2) { - histos.fill(HIST("hSparseV2SASameEvent_V2"), Lambdac.M(), Lambdac.Pt(), v2); + histos.fill(HIST("hSparseV2SASameEvent_V2"), Lambdac.M(), Lambdac.Pt(), v2, dcaProtonV0); } } if (fillRotation) { @@ -850,7 +850,7 @@ struct highmasslambda { histos.fill(HIST("hSparseV2SAMixedEvent_V2"), Lambdac.M(), Lambdac.Pt(), dcaV0toPV, cpaV0, ptV0, dcaV0Daughters, dcaProtonV0); } if (useKshortOpti == 2) { - histos.fill(HIST("hSparseV2SAMixedEvent_V2"), Lambdac.M(), Lambdac.Pt(), v2); + histos.fill(HIST("hSparseV2SAMixedEvent_V2"), Lambdac.M(), Lambdac.Pt(), v2, dcaProtonV0); } } } From ce4c13222e4d9c268a39d2517073359266d1aba7 Mon Sep 17 00:00:00 2001 From: Luca Aglietta <75362880+Luca610@users.noreply.github.com> Date: Wed, 19 Feb 2025 02:49:11 +0100 Subject: [PATCH 0305/1650] [PWGHF] Fixed bug on resonance data creator (#10052) --- PWGHF/D2H/TableProducer/dataCreatorCharmResoReduced.cxx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PWGHF/D2H/TableProducer/dataCreatorCharmResoReduced.cxx b/PWGHF/D2H/TableProducer/dataCreatorCharmResoReduced.cxx index 9a4a3979464..20188be07b8 100644 --- a/PWGHF/D2H/TableProducer/dataCreatorCharmResoReduced.cxx +++ b/PWGHF/D2H/TableProducer/dataCreatorCharmResoReduced.cxx @@ -810,8 +810,9 @@ struct HfDataCreatorCharmResoReduced { charmHadDauTracks.push_back(candD.template prong1_as
()); charmHadDauTracks.push_back(candD.template prong2_as
()); if constexpr (withMl) { - registry.fill(HIST("hMassVsPtDplusAll"), candD.pt(), varUtils.invMassD); + std::copy(candD.mlProbDplusToPiKPi().begin(), candD.mlProbDplusToPiKPi().end(), bdtScores.begin()); } + registry.fill(HIST("hMassVsPtDplusAll"), candD.pt(), varUtils.invMassD); } // else if // Get single track variables From 77aba54e95f68cbeb42b1c08261d8ac1fab1b6f7 Mon Sep 17 00:00:00 2001 From: Stefano Cannito <143754257+scannito@users.noreply.github.com> Date: Wed, 19 Feb 2025 05:49:21 +0100 Subject: [PATCH 0306/1650] [PWGLF] New filling method for phi-k0short analysis (#10054) --- .../Tasks/Strangeness/phik0shortanalysis.cxx | 316 ++++++++++++++---- 1 file changed, 249 insertions(+), 67 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx index efe2ce5652e..876f8a2636a 100644 --- a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx @@ -13,22 +13,24 @@ /// \brief Analysis task for the Phi and K0S rapidity correlations analysis /// \author Stefano Cannito (stefano.cannito@cern.ch) +#include +#include +#include +#include +#include + #include +#include +#include #include #include -#include -#include #include #include #include -#include -#include +#include +#include #include #include -#include -#include -#include -#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -48,6 +50,7 @@ #include "Framework/O2DatabasePDGPlugin.h" #include "PWGLF/Utils/inelGt.h" #include "PWGLF/DataModel/mcCentrality.h" +#include "CCDB/BasicCCDBManager.h" using namespace o2; using namespace o2::framework; @@ -147,11 +150,20 @@ struct Phik0shortanalysis { // Configurable for RecMC Configurable cfgiskNoITSROFrameBorder{"cfgiskNoITSROFrameBorder", false, "kNoITSROFrameBorder request on RecMC collisions"}; - // Configurable for MC closure + // Configurables for MC closure Configurable cfgisRecMCWPDGForClosure1{"cfgisRecMCWPDGForClosure1", false, "RecoMC with PDG Codes for Closure only for Associated particles"}; Configurable cfgisRecMCWPDGForClosure2{"cfgisRecMCWPDGForClosure2", false, "RecoMC with PDG Codes for Closure"}; Configurable cfgisGenMCForClosure{"cfgisGenMCForClosure", false, "GenMC for Closure"}; + // Configurables to choose the filling method + Configurable doLoadPurities{"doLoadPurities", false, "Load purities"}; + Configurable fillMethodMultipleWeights{"fillMethodMultipleWeights", true, "Fill method Multiple Weights"}; + Configurable fillMethodSingleWeight{"fillMethodSingleWeight", false, "Fill method Single Weight"}; + + // Configurable for CCDB + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository to use"}; + Configurable ccdbPurityPath{"ccdbPurityPath", "", "Correction path to file"}; + // Constants double massKa = o2::constants::physics::MassKPlus; double massPi = o2::constants::physics::MassPiPlus; @@ -196,6 +208,12 @@ struct Phik0shortanalysis { // Necessary to flag INEL>0 events in GenMC Service pdgDB; + // Necessary to get the CCDB for phi purities + Service ccdb; + + // Set of functions for phi purity + std::vector> phiPurityFunctions; + void init(InitContext&) { // Axes @@ -298,11 +316,16 @@ struct Phik0shortanalysis { dataK0SHist.add("hNSigmaPosPionFromK0S", "hNSigmaPosPionFromK0Short", kTH2F, {{100, 0.0, 5.0, "#it{p} (GeV/#it{c})"}, {100, -10.0f, 10.0f}}); dataK0SHist.add("hNSigmaNegPionFromK0S", "hNSigmaNegPionFromK0Short", kTH2F, {{100, 0.0, 5.0, "#it{p} (GeV/#it{c})"}, {100, -10.0f, 10.0f}}); - // 2D mass for Phi and K0S for Data + // 2D mass of Phi and K0S for Data dataPhiK0SHist.add("h4PhiK0SSEInc", "2D Invariant mass of Phi and K0Short for Same Event Inclusive", kTHnSparseF, {binnedmultAxis, binnedptK0SAxis, massK0SAxis, sigmassPhiAxis}); dataPhiK0SHist.add("h4PhiK0SSEFCut", "2D Invariant mass of Phi and K0Short for Same Event Deltay < FirstCut", kTHnSparseF, {binnedmultAxis, binnedptK0SAxis, massK0SAxis, sigmassPhiAxis}); dataPhiK0SHist.add("h4PhiK0SSESCut", "2D Invariant mass of Phi and K0Short for Same Event Deltay < SecondCut", kTHnSparseF, {binnedmultAxis, binnedptK0SAxis, massK0SAxis, sigmassPhiAxis}); + // 1D mass of K0S for Data + dataPhiK0SHist.add("h3PhiK0SSEIncNew", "Invariant mass of K0Short for Same Event Inclusive", kTH3F, {binnedmultAxis, binnedptK0SAxis, massK0SAxis}); + dataPhiK0SHist.add("h3PhiK0SSEFCutNew", "Invariant mass of K0Short for Same Event Deltay < FirstCut", kTH3F, {binnedmultAxis, binnedptK0SAxis, massK0SAxis}); + dataPhiK0SHist.add("h3PhiK0SSESCutNew", "Invariant mass of K0Short for Same Event Deltay < SecondCut", kTH3F, {binnedmultAxis, binnedptK0SAxis, massK0SAxis}); + // K0S rapidity in Data dataK0SHist.add("h3K0SRapidityData", "K0Short rapidity for Data", kTH3F, {binnedmultAxis, binnedptK0SAxis, yAxis}); @@ -320,16 +343,26 @@ struct Phik0shortanalysis { mcPhiK0SHist.add("h2PhiK0SGenMCFCutAssocReco", "K0Short coupled to Phi for GenMC Deltay < FirstCut Associated Reco Collision", kTH2F, {binnedmultAxis, binnedptK0SAxis}); mcPhiK0SHist.add("h2PhiK0SGenMCSCutAssocReco", "K0Short coupled to Phi for GenMC Deltay < SecondCut Associated Reco Collision", kTH2F, {binnedmultAxis, binnedptK0SAxis}); - // 2D mass for Phi and K0S for Closure Test - closureMCPhiK0SHist.add("h4ClosureMCPhiK0SSEInc", "2D Invariant mass of Phi and K0Short for Same Event Inclusive for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptK0SAxis, massK0SAxis, sigmassPhiAxis}); - closureMCPhiK0SHist.add("h4ClosureMCPhiK0SSEFCut", "2D Invariant mass of Phi and K0Short for Same Event Deltay < FirstCut for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptK0SAxis, massK0SAxis, sigmassPhiAxis}); - closureMCPhiK0SHist.add("h4ClosureMCPhiK0SSESCut", "2D Invariant mass of Phi and K0Short for Same Event Deltay < SecondCut for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptK0SAxis, massK0SAxis, sigmassPhiAxis}); + // 2D mass of Phi and K0S for Closure Test + closureMCPhiK0SHist.add("h4ClosureMCPhiK0SSEInc", "2D Invariant mass of Phi and K0Short for Inclusive for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptK0SAxis, massK0SAxis, sigmassPhiAxis}); + closureMCPhiK0SHist.add("h4ClosureMCPhiK0SSEFCut", "2D Invariant mass of Phi and K0Short for Deltay < FirstCut for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptK0SAxis, massK0SAxis, sigmassPhiAxis}); + closureMCPhiK0SHist.add("h4ClosureMCPhiK0SSESCut", "2D Invariant mass of Phi and K0Short for Deltay < SecondCut for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptK0SAxis, massK0SAxis, sigmassPhiAxis}); + + // 1D mass of K0S for Closure Test + closureMCPhiK0SHist.add("h3ClosureMCPhiK0SSEIncNew", "Invariant mass of K0Short for Inclusive for Closure Test", kTH3F, {binnedmultAxis, binnedptK0SAxis, massK0SAxis}); + closureMCPhiK0SHist.add("h3ClosureMCPhiK0SSEFCutNew", "Invariant mass of K0Short for Deltay < FirstCut for Closure Test", kTH3F, {binnedmultAxis, binnedptK0SAxis, massK0SAxis}); + closureMCPhiK0SHist.add("h3ClosureMCPhiK0SSESCutNew", "Invariant mass of K0Short for Deltay < SecondCut for Closure Test", kTH3F, {binnedmultAxis, binnedptK0SAxis, massK0SAxis}); // Phi mass vs Pion NSigma dE/dx for Data dataPhiPionHist.add("h5PhiPiSEInc", "Phi Invariant mass vs Pion nSigma TPC/TOF for Same Event Inclusive", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); dataPhiPionHist.add("h5PhiPiSEFCut", "Phi Invariant mass vs Pion nSigma TPC/TOF for Same Event Deltay < FirstCut", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); dataPhiPionHist.add("h5PhiPiSESCut", "Phi Invariant mass vs Pion nSigma TPC/TOF for Same Event Deltay < SecondCut", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); + // Pion NSigma dE/dx for Data + dataPhiPionHist.add("h4PhiPiSEIncNew", "Pion nSigma TPC/TOF for Same Event Inclusive", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}}); + dataPhiPionHist.add("h4PhiPiSEFCutNew", "Pion nSigma TPC/TOF for Same Event Deltay < FirstCut", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}}); + dataPhiPionHist.add("h4PhiPiSESCutNew", "Pion nSigma TPC/TOF for Same Event Deltay < SecondCut", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}}); + // Pion rapidity in Data dataPionHist.add("h3PiRapidityData", "Pion rapidity for Data", kTH3F, {binnedmultAxis, binnedptPiAxis, yAxis}); @@ -365,9 +398,14 @@ struct Phik0shortanalysis { mcPhiPionHist.add("h2PhiPiGenMCSCutAssocReco", "Pion coupled to Phi for GenMC Deltay < SecondCut Associated Reco Collision", kTH2F, {binnedmultAxis, binnedptPiAxis}); // Phi mass vs Pion NSigma dE/dx for Closure Test - closureMCPhiPionHist.add("h5ClosureMCPhiPiSEInc", "Phi Invariant mass vs Pion nSigma TPC/TOF for Same Event Inclusive for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); - closureMCPhiPionHist.add("h5ClosureMCPhiPiSEFCut", "Phi Invariant mass vs Pion nSigma TPC/TOF for Same Event Deltay < FirstCut for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); - closureMCPhiPionHist.add("h5ClosureMCPhiPiSESCut", "Phi Invariant mass vs Pion nSigma TPC/TOF for Same Event Deltay < SecondCut for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); + closureMCPhiPionHist.add("h5ClosureMCPhiPiSEInc", "Phi Invariant mass vs Pion nSigma TPC/TOF for Inclusive for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); + closureMCPhiPionHist.add("h5ClosureMCPhiPiSEFCut", "Phi Invariant mass vs Pion nSigma TPC/TOF for Deltay < FirstCut for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); + closureMCPhiPionHist.add("h5ClosureMCPhiPiSESCut", "Phi Invariant mass vs Pion nSigma TPC/TOF for Deltay < SecondCut for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); + + // Phi mass vs Pion NSigma dE/dx for Closure Test + closureMCPhiPionHist.add("h4ClosureMCPhiPiSEIncNew", "Pion nSigma TPC/TOF for Inclusive for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); + closureMCPhiPionHist.add("h4ClosureMCPhiPiSEFCutNew", "Pion nSigma TPC/TOF for Deltay < FirstCut for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); + closureMCPhiPionHist.add("h4ClosureMCPhiPiSESCutNew", "Pion nSigma TPC/TOF for Deltay < SecondCut for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); // MCPhi invariant mass for computing efficiencies and MCnormalisation mcPhiHist.add("h2PhieffInvMass", "Invariant mass of Phi for Efficiency (no K0S/Pi)", kTH2F, {binnedmultAxis, massPhiAxis}); @@ -425,6 +463,16 @@ struct Phik0shortanalysis { mcPionHist.add("h4PiRapiditySmearing", "Rapidity Smearing Matrix for Pion", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, yAxis, yAxis}); mcPionHist.add("h3PiRapidityGenMC", "Rapidity for Pion for GenMC", kTH3F, {binnedmultAxis, binnedptPiAxis, yAxis}); + + // Initialize CCDB only if purity is requested in the task + if (doLoadPurities) { + ccdb->setURL(ccdbUrl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setFatalWhenNull(false); + + getPhiPurityFunctionsFromCCDB(); + } } // Event selection and QA filling @@ -599,13 +647,11 @@ struct Phik0shortanalysis { // Reconstruct the Phi template - TLorentzVector recMother(const T1& track1, const T2& track2, float masscand1, float masscand2) + ROOT::Math::PxPyPzMVector recMother(const T1& track1, const T2& track2, float masscand1, float masscand2) { - TLorentzVector daughter1, daughter2, mother; - - daughter1.SetXYZM(track1.px(), track1.py(), track1.pz(), masscand1); // set the daughter1 4-momentum - daughter2.SetXYZM(track2.px(), track2.py(), track2.pz(), masscand2); // set the daughter2 4-momentum - mother = daughter1 + daughter2; // calculate the mother 4-momentum + ROOT::Math::PxPyPzMVector daughter1(track1.px(), track1.py(), track1.pz(), masscand1); // set the daughter1 4-momentum + ROOT::Math::PxPyPzMVector daughter2(track2.px(), track2.py(), track2.pz(), masscand2); // set the daughter2 4-momentum + ROOT::Math::PxPyPzMVector mother = daughter1 + daughter2; // calculate the mother 4-momentum return mother; } @@ -665,9 +711,40 @@ struct Phik0shortanalysis { return true; } + // Get phi-meson purity functions from CCDB + void getPhiPurityFunctionsFromCCDB() + { + TList* listPhiPurityFunctions = ccdb->get(ccdbPurityPath); + if (!listPhiPurityFunctions) + LOG(fatal) << "Problem getting TList object with phi purity functions!"; + + for (size_t multIdx = 0; multIdx < binsMult->size() - 1; multIdx++) { + for (size_t ptIdx = 0; ptIdx < binspTPhi->size() - 1; ptIdx++) { + phiPurityFunctions[multIdx][ptIdx] = static_cast(listPhiPurityFunctions->FindObject(Form("funcFitPhiPur_%zu_%zu", multIdx, ptIdx))); + } + } + } + + // Get the phi purity choosing the correct purity function according to the multiplicity and pt of the phi + double getPhiPurity(float multiplicity, const ROOT::Math::PxPyPzMVector& Phi) + { + // Find multiplicity bin using lower_bound + auto multIt = std::lower_bound(binsMult->begin(), binsMult->end(), multiplicity); + auto multIdx = multIt != binsMult->end() ? std::distance(binsMult->begin(), multIt) - 1 : -1; + + // Find phi-pT bin using lower_bound + auto pTIt = std::lower_bound(binspTPhi->begin(), binspTPhi->end(), Phi.Pt()); + auto pTIdx = pTIt != binspTPhi->end() ? std::distance(binspTPhi->begin(), pTIt) - 1 : -1; + + if (multIdx == -1 || pTIdx == -1) + LOG(fatal) << "Problem computing phi purity!"; + + return phiPurityFunctions[multIdx][pTIdx]->Eval(Phi.M()); + } + // Fill 2D invariant mass histogram for V0 and Phi template - void fillInvMass2D(const T& V0, const std::vector& listPhi, float multiplicity, const std::array weights) + void fillInvMass2D(const T& V0, const std::vector& listPhi, float multiplicity, const std::array& weights) { for (const auto& Phi : listPhi) { if constexpr (!isMC) { // same event @@ -690,9 +767,9 @@ struct Phik0shortanalysis { } } - // Fill Phi invariant mass vs Pion nSigmadE/dx histogram + // Fill Phi invariant mass vs Pion nSigmaTPC/TOF histogram template - void fillInvMassNSigma(const T& Pi, const std::vector& listPhi, float multiplicity, const std::array weights) + void fillInvMassNSigma(const T& Pi, const std::vector& listPhi, float multiplicity, const std::array& weights) { float nSigmaTOFPi = (Pi.hasTOF() ? Pi.tofNSigmaPi() : -999); @@ -717,6 +794,38 @@ struct Phik0shortanalysis { } } + // Fill invariant mass histogram for V0 + template + void fillInvMass(const T& V0, float multiplicity, const std::array& weights) + { + if constexpr (!isMC) { // same event + dataPhiK0SHist.fill(HIST("h3PhiK0SSEIncNew"), multiplicity, V0.pt(), V0.mK0Short(), weights.at(0)); + dataPhiK0SHist.fill(HIST("h3PhiK0SSEFCutNew"), multiplicity, V0.pt(), V0.mK0Short(), weights.at(1)); + dataPhiK0SHist.fill(HIST("h3PhiK0SSESCutNew"), multiplicity, V0.pt(), V0.mK0Short(), weights.at(2)); + } else { // MC event + closureMCPhiK0SHist.fill(HIST("h3ClosureMCPhiK0SSEIncNew"), multiplicity, V0.pt(), V0.mK0Short(), weights.at(0)); + closureMCPhiK0SHist.fill(HIST("h3ClosureMCPhiK0SSEFCutNew"), multiplicity, V0.pt(), V0.mK0Short(), weights.at(1)); + closureMCPhiK0SHist.fill(HIST("h3ClosureMCPhiK0SSESCutNew"), multiplicity, V0.pt(), V0.mK0Short(), weights.at(2)); + } + } + + // Fill nSigmaTPC/TOF histogram for Pion + template + void fillNSigma(const T& Pi, float multiplicity, const std::array& weights) + { + float nSigmaTOFPi = (Pi.hasTOF() ? Pi.tofNSigmaPi() : -999); + + if constexpr (!isMC) { // same event + dataPhiPionHist.fill(HIST("h4PhiPiSEIncNew"), multiplicity, Pi.pt(), Pi.tpcNSigmaPi(), nSigmaTOFPi, weights.at(0)); + dataPhiPionHist.fill(HIST("h4PhiPiSEFCutNew"), multiplicity, Pi.pt(), Pi.tpcNSigmaPi(), nSigmaTOFPi, weights.at(1)); + dataPhiPionHist.fill(HIST("h4PhiPiSESCutNew"), multiplicity, Pi.pt(), Pi.tpcNSigmaPi(), nSigmaTOFPi, weights.at(2)); + } else { // MC event + closureMCPhiPionHist.fill(HIST("h4ClosureMCPhiPiSEIncNew"), multiplicity, Pi.pt(), Pi.tpcNSigmaPi(), nSigmaTOFPi, weights.at(0)); + closureMCPhiPionHist.fill(HIST("h4ClosureMCPhiPiSEFCutNew"), multiplicity, Pi.pt(), Pi.tpcNSigmaPi(), nSigmaTOFPi, weights.at(1)); + closureMCPhiPionHist.fill(HIST("h4ClosureMCPhiPiSESCutNew"), multiplicity, Pi.pt(), Pi.tpcNSigmaPi(), nSigmaTOFPi, weights.at(2)); + } + } + void processQAPurity(SelCollisions::iterator const& collision, FullTracks const& fullTracks, FullV0s const& V0s, V0DauTracks const&) { // Check if the event selection is passed @@ -753,7 +862,7 @@ struct Phik0shortanalysis { if (track2ID == track1ID) continue; // condition to avoid double counting of pair - TLorentzVector recPhi = recMother(track1, track2, massKa, massKa); + ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa); if (std::abs(recPhi.Rapidity()) > cfgYAcceptance) continue; @@ -871,8 +980,9 @@ struct Phik0shortanalysis { if (std::abs(v0.yK0Short()) > cfgYAcceptance) continue; - std::vector listrecPhi; + std::vector listrecPhi; std::array counts{}; + std::array weights{1, 1, 1}; // Phi reconstruction // Loop over positive tracks @@ -891,30 +1001,45 @@ struct Phik0shortanalysis { if (track2ID == track1ID) continue; // condition to avoid double counting of pair - TLorentzVector recPhi = recMother(track1, track2, massKa, massKa); + ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa); if (recPhi.M() < lowMPhi || recPhi.M() > upMPhi) continue; if (std::abs(recPhi.Rapidity()) > cfgYAcceptance) continue; - listrecPhi.push_back(recPhi); + + double phiPurity{}; + if (fillMethodSingleWeight) + phiPurity = getPhiPurity(multiplicity, recPhi); + + if (fillMethodMultipleWeights) + listrecPhi.push_back(std::move(recPhi)); + counts.at(0)++; + weights.at(0) *= (1 - phiPurity); if (std::abs(v0.yK0Short() - recPhi.Rapidity()) > cfgFCutOnDeltaY) continue; counts.at(1)++; + weights.at(1) *= (1 - phiPurity); if (std::abs(v0.yK0Short() - recPhi.Rapidity()) > cfgSCutOnDeltaY) continue; counts.at(2)++; + weights.at(2) *= (1 - phiPurity); } } - std::array weights{}; - for (unsigned int i = 0; i < counts.size(); i++) { - weights.at(i) = (counts.at(i) > 0 ? 1. / static_cast(counts.at(i)) : 0); + if (fillMethodMultipleWeights) { + for (unsigned int i = 0; i < counts.size(); i++) { + weights.at(i) = (counts.at(i) > 0 ? 1. / static_cast(counts.at(i)) : 0); + } + fillInvMass2D(v0, listrecPhi, multiplicity, weights); + } else if (fillMethodSingleWeight) { + for (unsigned int i = 0; i < counts.size(); i++) { + weights.at(i) = (counts.at(i) > 0 ? 1 - weights.at(i) : 0); + } + fillInvMass(v0, multiplicity, weights); } - - fillInvMass2D(v0, listrecPhi, multiplicity, weights); } } @@ -944,8 +1069,9 @@ struct Phik0shortanalysis { if (std::abs(track.rapidity(massPi)) > cfgYAcceptance) continue; - std::vector listrecPhi; + std::vector listrecPhi; std::array counts{}; + std::array weights{1, 1, 1}; // Phi reconstruction // Loop over positive tracks @@ -964,30 +1090,45 @@ struct Phik0shortanalysis { if (track2ID == track1ID) continue; // condition to avoid double counting of pair - TLorentzVector recPhi = recMother(track1, track2, massKa, massKa); + ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa); if (recPhi.M() < lowMPhi || recPhi.M() > upMPhi) continue; if (std::abs(recPhi.Rapidity()) > cfgYAcceptance) continue; - listrecPhi.push_back(recPhi); + + double phiPurity{}; + if (fillMethodSingleWeight) + phiPurity = getPhiPurity(multiplicity, recPhi); + + if (fillMethodMultipleWeights) + listrecPhi.push_back(std::move(recPhi)); + counts.at(0)++; + weights.at(0) *= (1 - phiPurity); if (std::abs(track.rapidity(massPi) - recPhi.Rapidity()) > cfgFCutOnDeltaY) continue; counts.at(1)++; + weights.at(1) *= (1 - phiPurity); if (std::abs(track.rapidity(massPi) - recPhi.Rapidity()) > cfgSCutOnDeltaY) continue; counts.at(2)++; + weights.at(2) *= (1 - phiPurity); } } - std::array weights{}; - for (unsigned int i = 0; i < counts.size(); i++) { - weights.at(i) = (counts.at(i) > 0 ? 1. / static_cast(counts.at(i)) : 0); + if (fillMethodMultipleWeights) { + for (unsigned int i = 0; i < counts.size(); i++) { + weights.at(i) = (counts.at(i) > 0 ? 1. / static_cast(counts.at(i)) : 0); + } + fillInvMassNSigma(track, listrecPhi, multiplicity, weights); + } else if (fillMethodSingleWeight) { + for (unsigned int i = 0; i < counts.size(); i++) { + weights.at(i) = (counts.at(i) > 0 ? 1 - weights.at(i) : 0); + } + fillNSigma(track, multiplicity, weights); } - - fillInvMassNSigma(track, listrecPhi, multiplicity, weights); } } @@ -1057,7 +1198,7 @@ struct Phik0shortanalysis { if (!isMCMotherPhi) continue; - TLorentzVector recPhi = recMother(track1, track2, massKa, massKa); + ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa); mcPhiHist.fill(HIST("h3PhiRapiditySmearing"), genmultiplicity, recPhi.Rapidity(), mcMotherPhi.y()); @@ -1244,21 +1385,30 @@ struct Phik0shortanalysis { // Loop over all primary pion candidates for (const auto& track : mcTracksThisColl) { + // Pion selection + if (!selectionPion(track, false)) + continue; + if (!track.has_mcParticle()) continue; auto mcTrack = track.mcParticle_as(); - if (std::abs(mcTrack.pdgCode()) != 211 || !mcTrack.isPhysicalPrimary()) + if (std::abs(mcTrack.pdgCode()) != 211) continue; - // Pion selection - if (!selectionPion(track, false)) + if (std::abs(mcTrack.y()) > cfgYAcceptance) continue; - mcPionHist.fill(HIST("h4PiRapiditySmearing"), genmultiplicity, track.pt(), track.rapidity(massPi), mcTrack.y()); - - if (std::abs(mcTrack.y()) > cfgYAcceptance) + // Primary pion selection + if (mcTrack.isPhysicalPrimary()) { + } else { + if (mcTrack.getProcess() == 4) { // Selection of secondary pions from weak decay + } else { // Selection of secondary pions from material interactions + } continue; + } + + mcPionHist.fill(HIST("h4PiRapiditySmearing"), genmultiplicity, track.pt(), track.rapidity(massPi), mcTrack.y()); mcPionHist.fill(HIST("h3RecMCPiTPC"), genmultiplicity, track.pt(), track.tpcNSigmaPi()); @@ -1359,7 +1509,7 @@ struct Phik0shortanalysis { if (track2ID == track1ID) continue; // condition to avoid double counting of pair - TLorentzVector recPhi = recMother(track1, track2, massKa, massKa); + ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa); if (std::abs(recPhi.Rapidity()) > cfgYAcceptance) continue; @@ -1489,8 +1639,9 @@ struct Phik0shortanalysis { if (std::abs(v0.yK0Short()) > cfgYAcceptance) continue; - std::vector listrecPhi; + std::vector listrecPhi; std::array counts{}; + std::array weights{1, 1, 1}; // Phi reconstruction for (const auto& track1 : posThisColl) { // loop over all selected tracks @@ -1536,30 +1687,45 @@ struct Phik0shortanalysis { continue; } - TLorentzVector recPhi = recMother(track1, track2, massKa, massKa); + ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa); if (recPhi.M() < lowMPhi || recPhi.M() > upMPhi) continue; if (std::abs(recPhi.Rapidity()) > cfgYAcceptance) continue; - listrecPhi.push_back(recPhi); + + double phiPurity{}; + if (fillMethodSingleWeight) + phiPurity = getPhiPurity(genmultiplicity, recPhi); + + if (fillMethodMultipleWeights) + listrecPhi.push_back(std::move(recPhi)); + counts.at(0)++; + weights.at(0) *= (1 - phiPurity); if (std::abs(v0.yK0Short() - recPhi.Rapidity()) > cfgFCutOnDeltaY) continue; counts.at(1)++; + weights.at(1) *= (1 - phiPurity); if (std::abs(v0.yK0Short() - recPhi.Rapidity()) > cfgSCutOnDeltaY) continue; counts.at(2)++; + weights.at(2) *= (1 - phiPurity); } } - std::array weights{}; - for (unsigned int i = 0; i < counts.size(); i++) { - weights.at(i) = (counts.at(i) > 0 ? 1. / static_cast(counts.at(i)) : 0); + if (fillMethodMultipleWeights) { + for (unsigned int i = 0; i < counts.size(); i++) { + weights.at(i) = (counts.at(i) > 0 ? 1. / static_cast(counts.at(i)) : 0); + } + fillInvMass2D(v0, listrecPhi, genmultiplicity, weights); + } else if (fillMethodSingleWeight) { + for (unsigned int i = 0; i < counts.size(); i++) { + weights.at(i) = (counts.at(i) > 0 ? 1 - weights.at(i) : 0); + } + fillInvMass(v0, genmultiplicity, weights); } - - fillInvMass2D(v0, listrecPhi, genmultiplicity, weights); } } @@ -1597,8 +1763,9 @@ struct Phik0shortanalysis { if (std::abs(track.rapidity(massPi)) > cfgYAcceptance) continue; - std::vector listrecPhi; + std::vector listrecPhi; std::array counts{}; + std::array weights{1, 1, 1}; // Phi reconstruction for (const auto& track1 : posThisColl) { // loop over all selected tracks @@ -1644,30 +1811,45 @@ struct Phik0shortanalysis { continue; } - TLorentzVector recPhi = recMother(track1, track2, massKa, massKa); + ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa); if (recPhi.M() < lowMPhi || recPhi.M() > upMPhi) continue; if (std::abs(recPhi.Rapidity()) > cfgYAcceptance) continue; - listrecPhi.push_back(recPhi); + + double phiPurity{}; + if (fillMethodSingleWeight) + phiPurity = getPhiPurity(genmultiplicity, recPhi); + + if (fillMethodMultipleWeights) + listrecPhi.push_back(std::move(recPhi)); + counts.at(0)++; + weights.at(0) *= (1 - phiPurity); if (std::abs(track.rapidity(massPi) - recPhi.Rapidity()) > cfgFCutOnDeltaY) continue; counts.at(1)++; + weights.at(1) *= (1 - phiPurity); if (std::abs(track.rapidity(massPi) - recPhi.Rapidity()) > cfgSCutOnDeltaY) continue; counts.at(2)++; + weights.at(2) *= (1 - phiPurity); } } - std::array weights{}; - for (unsigned int i = 0; i < counts.size(); i++) { - weights.at(i) = (counts.at(i) > 0 ? 1. / static_cast(counts.at(i)) : 0); + if (fillMethodMultipleWeights) { + for (unsigned int i = 0; i < counts.size(); i++) { + weights.at(i) = (counts.at(i) > 0 ? 1. / static_cast(counts.at(i)) : 0); + } + fillInvMassNSigma(track, listrecPhi, genmultiplicity, weights); + } else if (fillMethodSingleWeight) { + for (unsigned int i = 0; i < counts.size(); i++) { + weights.at(i) = (counts.at(i) > 0 ? 1 - weights.at(i) : 0); + } + fillNSigma(track, genmultiplicity, weights); } - - fillInvMassNSigma(track, listrecPhi, genmultiplicity, weights); } } From af968f39678d7085cb45481b639c8a3fc99271ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Wed, 19 Feb 2025 08:13:44 +0100 Subject: [PATCH 0307/1650] [PWGHF] Fix and improve D+ selection in derived-data creator (#10055) --- .../TableProducer/derivedDataCreatorDplusToPiKPi.cxx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx b/PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx index c8162a5fc6a..722700cd0ef 100644 --- a/PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx +++ b/PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx @@ -86,7 +86,7 @@ struct HfDerivedDataCreatorDplusToPiKPi { using MatchedGenCandidatesMc = soa::Filtered>; using TypeMcCollisions = soa::Join; - Filter filterSelectCandidates = aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= 1; + Filter filterSelectCandidates = (aod::hf_sel_candidate_dplus::isSelDplusToPiKPi & static_cast(BIT(aod::SelectionStep::RecoMl - 1))) != 0; // select candidates which passed all cuts at least up to RecoMl - 1 Filter filterMcGenMatching = nabs(aod::hf_cand_3prong::flagMcMatchGen) == static_cast(BIT(aod::hf_cand_3prong::DecayType::DplusToPiKPi)); Preslice candidatesPerCollision = aod::hf_cand::collisionId; @@ -241,6 +241,11 @@ struct HfDerivedDataCreatorDplusToPiKPi { } int8_t flagMcRec = 0, origin = 0, swapping = 0; for (const auto& candidate : candidatesThisColl) { + if constexpr (isMl) { + if (!TESTBIT(candidate.isSelDplusToPiKPi(), aod::SelectionStep::RecoMl)) { + continue; + } + } if constexpr (isMc) { flagMcRec = candidate.flagMcMatchRec(); origin = candidate.originMcRec(); @@ -272,9 +277,7 @@ struct HfDerivedDataCreatorDplusToPiKPi { if constexpr (isMl) { std::copy(candidate.mlProbDplusToPiKPi().begin(), candidate.mlProbDplusToPiKPi().end(), std::back_inserter(mlScoresDplusToPiKPi)); } - if (candidate.isSelDplusToPiKPi()) { - fillTablesCandidate(candidate, prong0, prong1, prong2, 0, massDplusToPiKPi, ct, y, flagMcRec, origin, swapping, mlScoresDplusToPiKPi); - } + fillTablesCandidate(candidate, prong0, prong1, prong2, 0, massDplusToPiKPi, ct, y, flagMcRec, origin, swapping, mlScoresDplusToPiKPi); } } } From c020a877ce91cf485c73f14c7f7fc21a2ca2d02a Mon Sep 17 00:00:00 2001 From: Evgeny Kryshen Date: Wed, 19 Feb 2025 11:11:42 +0300 Subject: [PATCH 0308/1650] [Common] Fill RCT once per TF + protection for unanchored runs (#10032) --- Common/TableProducer/eventSelection.cxx | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/Common/TableProducer/eventSelection.cxx b/Common/TableProducer/eventSelection.cxx index d25c0f8156c..f37c0576a9d 100644 --- a/Common/TableProducer/eventSelection.cxx +++ b/Common/TableProducer/eventSelection.cxx @@ -68,6 +68,8 @@ struct BcSelectionTask { Configurable> maxInactiveChipsPerLayer{"maxInactiveChipsPerLayer", {8, 8, 8, 111, 111, 195, 195}, "Maximum allowed number of inactive ITS chips per layer"}; int lastRun = -1; + int64_t lastTF = -1; + uint32_t lastRCT = 0; uint64_t sorTimestamp = 0; // default SOR timestamp uint64_t eorTimestamp = 1; // default EOR timestamp int64_t bcSOR = -1; // global bc of the start of run @@ -341,11 +343,17 @@ struct BcSelectionTask { // bc loop for (auto bc : bcs) { // o2-linter: disable=const-ref-in-for-loop // store rct flags - auto itrct = mapRCT->upper_bound(bc.timestamp()); - if (itrct != mapRCT->begin()) - itrct--; - uint32_t rct = itrct->second; - LOGP(debug, "sor={} eor={} ts={} rct={}", sorTimestamp, eorTimestamp, bc.timestamp(), rct); + uint32_t rct = lastRCT; + int64_t thisTF = (bc.globalBC() - bcSOR) / nBCsPerTF; + if (mapRCT != nullptr && thisTF != lastTF) { // skip for unanchored runs; do it once per TF + auto itrct = mapRCT->upper_bound(bc.timestamp()); + if (itrct != mapRCT->begin()) + itrct--; + rct = itrct->second; + LOGP(debug, "sor={} eor={} ts={} rct={}", sorTimestamp, eorTimestamp, bc.timestamp(), rct); + lastRCT = rct; + lastTF = thisTF; + } uint32_t alias{0}; // workaround for pp2022 (trigger info is shifted by -294 bcs) From a2f4668d07f8e833a176d45956c0138f85e06aa1 Mon Sep 17 00:00:00 2001 From: Andreas Molander Date: Wed, 19 Feb 2025 10:26:11 +0200 Subject: [PATCH 0309/1650] [Infrastructure] Update CODEOWNERS for FIT (#10039) --- CODEOWNERS | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index 3946f9c6dd8..eba5b5d7c70 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -19,7 +19,9 @@ /DPG/Tasks/AOTEvent @alibuild @ekryshen @strogolo @altsybee /DPG/Tasks/AOTTrack @alibuild @mfaggin @iouribelikov @njacazio @lbariogl @f3sch /DPG/Tasks/TOF @alibuild @noferini @njacazio -/DPG/Tasks/FT0 @alibuild @afurs +/DPG/Tasks/FT0 @alibuild @jotwinow @sahilupadhyaya92 @andreasmolander @afurs +/DPG/Tasks/FV0 @alibuild @jotwinow @sahilupadhyaya92 @andreasmolander @afurs +/DPG/Tasks/FDD @alibuild @jotwinow @sahilupadhyaya92 @andreasmolander @afurs /EventFiltering @alibuild @mpuccio @lietava /EventFiltering/PWGHF @alibuild @fgrosa @zhangbiao-phy @mpuccio @lietava /EventFiltering/PWGUD @alibuild @pbuehler @mpuccio @lietava From 55d75605072013b27284de3a41a10404c09bcf17 Mon Sep 17 00:00:00 2001 From: Ida Storehaug <38440296+torkjellsdatter@users.noreply.github.com> Date: Wed, 19 Feb 2025 09:53:04 +0100 Subject: [PATCH 0310/1650] [PWGDQ] MCsignals for B->Jpsi + K analysis (dilepton-track process function) (#10046) Co-authored-by: Ida Torkjellsdatter Storehaug Co-authored-by: ALICE Action Bot --- PWGDQ/Core/MCSignalLibrary.cxx | 64 +++++++++++++++++++++++++++++----- 1 file changed, 55 insertions(+), 9 deletions(-) diff --git a/PWGDQ/Core/MCSignalLibrary.cxx b/PWGDQ/Core/MCSignalLibrary.cxx index 28436e3abca..665fc7f4dee 100644 --- a/PWGDQ/Core/MCSignalLibrary.cxx +++ b/PWGDQ/Core/MCSignalLibrary.cxx @@ -1176,24 +1176,70 @@ MCSignal* o2::aod::dqmcsignals::GetMCSignal(const char* name) return signal; } - if (!nameStr.compare("eeKaonFromBplusViaKstar")) { // specific K exited state decays + if (!nameStr.compare("eeKaonFromB0")) { + MCProng pronge(3, {11, 443, 511}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}); + MCProng prongKaon(2, {321, 511}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); + signal = new MCSignal(name, "Kaon and electron pair from B0", {pronge, pronge, prongKaon}, {2, 2, 1}); + return signal; + } + + if (!nameStr.compare("eePionFromB0ViaEverything")) { // catching feed-down for B0 + MCProng pronge(3, {11, 443, 511}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}); + MCProng prongPion(3, {211, 0, 511}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}); + signal = new MCSignal(name, "Pion and electron pair from B0", {pronge, pronge, prongPion}, {2, 2, 1}); + return signal; + } + + if (!nameStr.compare("eeKaonFromOpenBeautyMesons")) { + MCProng pronge(3, {11, 443, 501}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}); + MCProng prongKaon(2, {321, 501}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); + signal = new MCSignal(name, "Excited kaon and electron pair from B0", {pronge, pronge, prongKaon}, {2, 2, 2}); + return signal; + } + + if (!nameStr.compare("eeKaonFromOpenBeautyHadrons")) { + MCProng pronge(3, {11, 443, 502}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}); + MCProng prongKaon(2, {321, 502}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); + signal = new MCSignal(name, "Kaon and electron pair from open beauty hadrons", {pronge, pronge, prongKaon}, {2, 2, 1}); + return signal; + } + + if (!nameStr.compare("eeKaonFromLambdaB")) { + MCProng pronge(3, {11, 443, 5122}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}); + MCProng prongKaon(2, {321, 5122}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); + signal = new MCSignal(name, "Kaon and electron pair from lambda B", {pronge, pronge, prongKaon}, {2, 2, 1}); + return signal; + } + + if (!nameStr.compare("eeKaonPion0FromBplus")) { + MCProng pronge(3, {11, 443, 521}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}); + MCProng prongKaon(2, {321, 521}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); + MCProng prongPion(2, {111, 521}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); + signal = new MCSignal(name, "Kaon, pi0 and electron pair from B+", {pronge, pronge, prongKaon, prongPion}, {2, 2, 1, 1}); + return signal; + } + + if (!nameStr.compare("eeKaonEtaFromBplus")) { MCProng pronge(3, {11, 443, 521}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}); - MCProng prongKaon(3, {321, 323, 521}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}); - signal = new MCSignal(name, "Kaon and electron pair from B+ via Kstar", {pronge, pronge, prongKaon}, {2, 2, 2}); + MCProng prongKaon(2, {321, 521}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); + MCProng prongEta(2, {221, 521}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); + signal = new MCSignal(name, "Kaon, eta and electron pair from B+", {pronge, pronge, prongKaon, prongEta}, {2, 2, 1, 1}); return signal; } - if (!nameStr.compare("eeKaonFromBplusViaK1270")) { // specific K exited state decays + if (!nameStr.compare("eeKaonOmegaFromBplus")) { MCProng pronge(3, {11, 443, 521}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}); - MCProng prongKaon(3, {321, 10323, 521}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}); - signal = new MCSignal(name, "Kaon and electron pair from B+ via K1270", {pronge, pronge, prongKaon}, {2, 2, 2}); + MCProng prongKaon(2, {321, 521}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); + MCProng prongOmega(2, {223, 521}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); + signal = new MCSignal(name, "Kaon, omega and electron pair from B+", {pronge, pronge, prongKaon, prongOmega}, {2, 2, 1, 1}); return signal; } - if (!nameStr.compare("eeKaonFromBplusViaK1400")) { // specific K exited state decays + if (!nameStr.compare("eeKaonPionFromBplus")) { MCProng pronge(3, {11, 443, 521}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}); - MCProng prongKaon(3, {321, 20323, 521}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}); - signal = new MCSignal(name, "Kaon and electron pair from B+ via K1400", {pronge, pronge, prongKaon}, {2, 2, 2}); + MCProng prongKaon(2, {321, 521}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); + MCProng prongPion(2, {211, 521}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); + signal = new MCSignal(name, "Kaon, pion and electron pair from B+", {pronge, pronge, prongKaon, prongPion}, {2, 2, 1, 1}); return signal; } From 1dabfcc0785fee6372920e3aeb364bed91d11bcc Mon Sep 17 00:00:00 2001 From: Yunfan Liu Date: Wed, 19 Feb 2025 10:46:29 +0100 Subject: [PATCH 0311/1650] [PWGHF] Add and update ML and efficiency calculations tasks for OmegacToOmegaPi (#9944) Co-authored-by: root Co-authored-by: ALICE Action Bot Co-authored-by: Fabrizio --- PWGHF/Core/HfMlResponseOmegacToOmegaPi.h | 152 +++++++++++ PWGHF/Core/SelectorCuts.h | 34 +++ PWGHF/D2H/Tasks/CMakeLists.txt | 5 + PWGHF/D2H/Tasks/taskOmegac0ToOmegapi.cxx | 244 ++++++++++++++++++ .../DataModel/CandidateReconstructionTables.h | 2 +- PWGHF/DataModel/CandidateSelectionTables.h | 2 +- PWGHF/TableProducer/CMakeLists.txt | 2 +- .../candidateCreatorXic0Omegac0.cxx | 4 +- .../candidateSelectorOmegac0ToOmegaPi.cxx | 213 +++++++++++---- .../treeCreatorOmegacToOmegaPi.cxx | 90 +++++++ 10 files changed, 692 insertions(+), 56 deletions(-) create mode 100644 PWGHF/Core/HfMlResponseOmegacToOmegaPi.h create mode 100644 PWGHF/D2H/Tasks/taskOmegac0ToOmegapi.cxx diff --git a/PWGHF/Core/HfMlResponseOmegacToOmegaPi.h b/PWGHF/Core/HfMlResponseOmegacToOmegaPi.h new file mode 100644 index 00000000000..be2b5ac62ce --- /dev/null +++ b/PWGHF/Core/HfMlResponseOmegacToOmegaPi.h @@ -0,0 +1,152 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file HfMlResponseOmegacToOmegaPi.h +/// \brief Class to compute the ML response for Ωc± → Ω∓ π± analysis selections +/// \author Yunfan Liu , China University of Geosciences + +#ifndef PWGHF_CORE_HFMLRESPONSEOMEGACTOOMEGAPI_H_ +#define PWGHF_CORE_HFMLRESPONSEOMEGACTOOMEGAPI_H_ + +#include +#include +#include + +#include "CommonConstants/PhysicsConstants.h" + +#include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/HfMlResponse.h" + +// Fill the map of available input features +// the key is the feature's name (std::string) +// the value is the corresponding value in EnumInputFeatures +#define FILL_MAP_OMEGAC0(FEATURE) \ + { \ + #FEATURE, static_cast(InputFeaturesOmegacToOmegaPi::FEATURE) \ + } + +// Check if the index of mCachedIndices (index associated to a FEATURE) +// matches the entry in EnumInputFeatures associated to this FEATURE +// if so, the inputFeatures vector is filled with the FEATURE's value +// by calling the corresponding GETTER from OBJECT +#define CHECK_AND_FILL_VEC_OMEGAC0_FULL(OBJECT, FEATURE, GETTER) \ + case static_cast(InputFeaturesOmegacToOmegaPi::FEATURE): { \ + inputFeatures.emplace_back(OBJECT.GETTER()); \ + break; \ + } + +// Specific case of CHECK_AND_FILL_VEC_OMEGAC0_FULL(OBJECT, FEATURE, GETTER) +// where OBJECT is named candidate and FEATURE = GETTER +#define CHECK_AND_FILL_VEC_OMEGAC0(GETTER) \ + case static_cast(InputFeaturesOmegacToOmegaPi::GETTER): { \ + inputFeatures.emplace_back(candidate.GETTER()); \ + break; \ + } + +// Variation of CHECK_AND_FILL_VEC_OMEGAC0_FULL(OBJECT, FEATURE, GETTER) +// where GETTER is a method of hfHelper +#define CHECK_AND_FILL_VEC_OMEGAC0_HFHELPER(OBJECT, FEATURE, GETTER) \ + case static_cast(InputFeaturesOmegacToOmegaPi::FEATURE): { \ + inputFeatures.emplace_back(hfHelper.GETTER(OBJECT)); \ + break; \ + } +namespace o2::analysis +{ +enum class InputFeaturesOmegacToOmegaPi : uint8_t { + + cosPaOmegacToPv = 0, + kfDcaXYPiFromOmegac, + cosThetaStarPiFromOmegac, + chi2TopoPiFromOmegacToPv, + dcaCharmBaryonDau, + invMassCascade, + massCascChi2OverNdf, + cosPaCascToPv, + kfDcaXYCascToPv, + nSigmaTPCPiFromV0, + nSigmaTPCPiFromOmegac, + nSigmaTPCKaFromCasc + +}; + +template +class HfMlResponseOmegacToOmegaPi : public HfMlResponse +{ + public: + /// Default constructor + HfMlResponseOmegacToOmegaPi() = default; + /// Default destructor + virtual ~HfMlResponseOmegacToOmegaPi() = default; + + HfHelper hfHelper; + + /// Method to get the input features vector needed for ML inference + /// \param candidate is the OMEGAC0 candidate + /// \param lamProngPi is the candidate's lamProngPi + /// \return inputFeatures vector + template + std::vector getInputFeatures(T1 const& candidate, T2 const& lamProngPi, T2 const& cascProng, T3 const& charmBaryonProng) + { + std::vector inputFeatures; + + for (const auto& idx : MlResponse::mCachedIndices) { + switch (idx) { + + CHECK_AND_FILL_VEC_OMEGAC0(kfDcaXYPiFromOmegac); + CHECK_AND_FILL_VEC_OMEGAC0(cosThetaStarPiFromOmegac); + CHECK_AND_FILL_VEC_OMEGAC0(chi2TopoPiFromOmegacToPv); + CHECK_AND_FILL_VEC_OMEGAC0(dcaCharmBaryonDau); + CHECK_AND_FILL_VEC_OMEGAC0(invMassCascade); + CHECK_AND_FILL_VEC_OMEGAC0(massCascChi2OverNdf); + CHECK_AND_FILL_VEC_OMEGAC0(kfDcaXYCascToPv); + CHECK_AND_FILL_VEC_OMEGAC0_FULL(candidate, cosPaOmegacToPv, cosPACharmBaryon); + CHECK_AND_FILL_VEC_OMEGAC0_FULL(candidate, cosPaCascToPv, cosPACasc); + // TPC PID variables + CHECK_AND_FILL_VEC_OMEGAC0_FULL(lamProngPi, nSigmaTPCPiFromV0, tpcNSigmaPi); + CHECK_AND_FILL_VEC_OMEGAC0_FULL(cascProng, nSigmaTPCKaFromCasc, tpcNSigmaKa); + CHECK_AND_FILL_VEC_OMEGAC0_FULL(charmBaryonProng, nSigmaTPCPiFromOmegac, tpcNSigmaPi); + } + } + + return inputFeatures; + } + + protected: + /// Method to fill the map of available input features + void setAvailableInputFeatures() + { + MlResponse::mAvailableInputFeatures = { + + FILL_MAP_OMEGAC0(invMassCascade), + FILL_MAP_OMEGAC0(cosPaOmegacToPv), + FILL_MAP_OMEGAC0(dcaCharmBaryonDau), + FILL_MAP_OMEGAC0(kfDcaXYPiFromOmegac), + FILL_MAP_OMEGAC0(cosThetaStarPiFromOmegac), + FILL_MAP_OMEGAC0(chi2TopoPiFromOmegacToPv), + FILL_MAP_OMEGAC0(massCascChi2OverNdf), + FILL_MAP_OMEGAC0(cosPaCascToPv), + FILL_MAP_OMEGAC0(kfDcaXYCascToPv), + // TPC PID variables + FILL_MAP_OMEGAC0(nSigmaTPCPiFromV0), + FILL_MAP_OMEGAC0(nSigmaTPCKaFromCasc), + FILL_MAP_OMEGAC0(nSigmaTPCPiFromOmegac), + + }; + } +}; + +} // namespace o2::analysis + +#undef FILL_MAP_OMEGAC0 +#undef CHECK_AND_FILL_VEC_OMEGAC0_FULL +#undef CHECK_AND_FILL_VEC_OMEGAC0 +#undef CHECK_AND_FILL_VEC_OMEGAC0_HFHELPER +#endif // PWGHF_CORE_HFMLRESPONSEOMEGACTOOMEGAPI_H_ diff --git a/PWGHF/Core/SelectorCuts.h b/PWGHF/Core/SelectorCuts.h index 014547d927d..ea5248ec9b0 100644 --- a/PWGHF/Core/SelectorCuts.h +++ b/PWGHF/Core/SelectorCuts.h @@ -651,6 +651,40 @@ static const std::vector labelsPt = { static const std::vector labelsCutVar = {"deltaM", "pT Pi", "pT K", "decay length", "normalized decay length XY", "cos pointing angle", "cos pointing angle XY", "impact parameter XY", "deltaM Phi", "cos^3 theta_PiK", "chi2PCA"}; } // namespace hf_cuts_ds_to_k_k_pi +namespace hf_cuts_omegac_to_omega_pi +{ +static constexpr int nBinsPt = 4; +static constexpr int nCutVars = 1; +// default values for the pT bin edges (can be used to configure histogram axis) +// offset by 1 from the bin numbers in cuts array +constexpr double binsPt[nBinsPt + 1] = { + + 1.0, + 2.0, + 4.0, + 6.0, + 12.0}; + +auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; + +// default values for the cuts +// pi_pT +constexpr double cuts[nBinsPt][nCutVars] = {{0.2}, /* 1 < pt < 2 */ + {0.2}, /* 2 < pt < 4 */ + {0.6}, /* 4 < pt < 6 */ + {0.8}}; /* 6 < pt < 12 */ + +// row labels +static const std::vector labelsPt = { + "pT bin 0", + "pT bin 1", + "pT bin 2", + "pT bin 3"}; + +// column labels +static const std::vector labelsCutVar = {"pT pi from Omegac"}; +} // namespace hf_cuts_omegac_to_omega_pi + namespace hf_cuts_xic_to_p_k_pi { static const int nBinsPt = 10; diff --git a/PWGHF/D2H/Tasks/CMakeLists.txt b/PWGHF/D2H/Tasks/CMakeLists.txt index b2f78f68334..89f660b85ba 100644 --- a/PWGHF/D2H/Tasks/CMakeLists.txt +++ b/PWGHF/D2H/Tasks/CMakeLists.txt @@ -94,6 +94,11 @@ o2physics_add_dpl_workflow(task-lc-to-k0s-p PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(task-omegac0-to-omega-pi + SOURCES taskOmegac0ToOmegapi.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(task-sigmac SOURCES taskSigmac.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore diff --git a/PWGHF/D2H/Tasks/taskOmegac0ToOmegapi.cxx b/PWGHF/D2H/Tasks/taskOmegac0ToOmegapi.cxx new file mode 100644 index 00000000000..0b98a32593b --- /dev/null +++ b/PWGHF/D2H/Tasks/taskOmegac0ToOmegapi.cxx @@ -0,0 +1,244 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file taskOmegac0ToOmegapi.cxx +/// \brief OmegaC0 analysis task +/// \author Yunfan Liu , China University of Geosciences + +#include + +#include "CommonConstants/PhysicsConstants.h" +#include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/runDataProcessing.h" + +#include "PWGHF/Core/CentralityEstimation.h" +#include "PWGHF/Core/HfHelper.h" +#include "PWGHF/DataModel/CandidateReconstructionTables.h" +#include "PWGHF/DataModel/CandidateSelectionTables.h" +#include "PWGHF/Utils/utilsEvSelHf.h" + +using namespace o2; +using namespace o2::analysis; +using namespace o2::framework; +using namespace o2::framework::expressions; + +/// Omegac0 analysis task + +struct HfTaskOmegac0 { + Configurable yCandGenMax{"yCandGenMax", 0.5, "max. gen particle rapidity"}; + Configurable yCandRecoMax{"yCandRecoMax", 0.8, "max. cand. rapidity"}; + Configurable selectionFlagOmegac0{"selectionFlagOmegac0", 1, "Selection Flag for Omegac0 candidates"}; + + // ML inference + Configurable applyMl{"applyMl", false, "Flag to apply ML selections"}; + + // ThnSparse for ML outputScores and Vars + ConfigurableAxis thnConfigAxisPromptScore{"thnConfigAxisPromptScore", {50, 0, 1}, "Prompt score bins"}; + ConfigurableAxis thnConfigAxisMass{"thnConfigAxisMass", {120, 2.4, 3.1}, "Cand. inv-mass bins"}; + ConfigurableAxis thnConfigAxisPtB{"thnConfigAxisPtB", {1000, 0, 100}, "Cand. beauty mother pTB bins"}; + ConfigurableAxis thnConfigAxisPt{"thnConfigAxisPt", {100, 0, 20}, "Cand. pT bins"}; + ConfigurableAxis thnConfigAxisY{"thnConfigAxisY", {20, -1, 1}, "Cand. rapidity bins"}; + ConfigurableAxis thnConfigAxisOrigin{"thnConfigAxisOrigin", {3, -0.5, 2.5}, "Cand. origin type"}; + ConfigurableAxis thnConfigAxisCandType{"thnConfigAxisCandType", {6, -0.5, 5.5}, "Omegac0 type"}; + ConfigurableAxis thnConfigAxisGenPtD{"thnConfigAxisGenPtD", {500, 0, 50}, "Gen Pt D"}; + ConfigurableAxis thnConfigAxisGenPtB{"thnConfigAxisGenPtB", {1000, 0, 100}, "Gen Pt B"}; + ConfigurableAxis thnConfigAxisNumPvContr{"thnConfigAxisNumPvContr", {200, -0.5, 199.5}, "Number of PV contributors"}; + + HfHelper hfHelper; + using MyTracksWMc = soa::Join; + + using Omegac0Candidates = soa::Join; + using Omegac0CandidatesKF = soa::Join; + using OmegaC0CandidatesMcKF = soa::Join; + + using Omegac0CandidatesMl = soa::Join; + using Omegac0CandidatesMlKF = soa::Join; + using Omegac0CandidatesMlMcKF = soa::Join; + + using Collisions = soa::Join; + using CollisionsWithMcLabels = soa::Join; + PresliceUnsorted colPerMcCollision = aod::mccollisionlabel::mcCollisionId; + SliceCache cache; + + Partition selectedOmegac0CandidatesKF = aod::hf_sel_toomegapi::resultSelections >= selectionFlagOmegac0; + Partition selectedOmegac0CandidatesMlKF = aod::hf_sel_toomegapi::resultSelections >= selectionFlagOmegac0; + + HistogramRegistry registry{ + "registry", + {}}; + + void init(InitContext&) + { + std::array doprocess{doprocessDataWithKFParticle, doprocessMcWithKFParticle, doprocessDataWithKFParticleMl, doprocessMcWithKFParticleMl}; + if ((std::accumulate(doprocess.begin(), doprocess.end(), 0)) != 1) { + LOGP(fatal, "One and only one process function should be enabled at a time."); + } + + const AxisSpec thnAxisMass{thnConfigAxisMass, "inv. mass (#Omega #pi) (GeV/#it{c}^{2})"}; + const AxisSpec thnAxisPt{thnConfigAxisPt, "#it{p}_{T} (GeV/#it{c})"}; + const AxisSpec thnAxisPtB{thnConfigAxisPtB, "#it{p}_{T}^{B} (GeV/#it{c})"}; + const AxisSpec thnAxisY{thnConfigAxisY, "y"}; + const AxisSpec thnAxisOrigin{thnConfigAxisOrigin, "Origin"}; + const AxisSpec thnAxisGenPtD{thnConfigAxisGenPtD, "#it{p}_{T} (GeV/#it{c})"}; + const AxisSpec thnAxisGenPtB{thnConfigAxisGenPtB, "#it{p}_{T}^{B} (GeV/#it{c})"}; + const AxisSpec thnAxisNumPvContr{thnConfigAxisNumPvContr, "Number of PV contributors"}; + + if (doprocessMcWithKFParticle || doprocessMcWithKFParticleMl) { + std::vector axesAcc = {thnAxisGenPtD, thnAxisGenPtB, thnAxisY, thnAxisOrigin, thnAxisNumPvContr}; + registry.add("hSparseAcc", "Thn for generated Omega0 from charm and beauty", HistType::kTHnSparseD, axesAcc); + registry.get(HIST("hSparseAcc"))->Sumw2(); + } + + std::vector axes = { + thnAxisMass, + thnAxisPt, + thnAxisY, + }; + if (doprocessMcWithKFParticle || doprocessMcWithKFParticleMl) { + axes.push_back(thnAxisPtB); + axes.push_back(thnAxisOrigin); + axes.push_back(thnAxisNumPvContr); + } + if (applyMl) { + const AxisSpec thnAxisPromptScore{thnConfigAxisPromptScore, "BDT score prompt."}; + + axes.insert(axes.begin(), thnAxisPromptScore); + + registry.add("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsOmegac0Type", "Thn for Omegac0 candidates", HistType::kTHnSparseD, axes); + registry.get(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsOmegac0Type"))->Sumw2(); + } else { + registry.add("hMassVsPtVsPtBVsYVsOriginVsOmegac0Type", "Thn for Omegac0 candidates", HistType::kTHnSparseF, axes); + registry.get(HIST("hMassVsPtVsPtBVsYVsOriginVsOmegac0Type"))->Sumw2(); + } + } + + template + void processData(const CandType& candidates, CollType const&) + { + for (const auto& candidate : candidates) { + if (!(candidate.hfflag() & 1 << aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaPi)) { + continue; + } + if (yCandRecoMax >= 0. && std::abs(candidate.kfRapOmegac()) > yCandRecoMax) { + continue; + } + float massOmegac0; + massOmegac0 = candidate.invMassCharmBaryon(); + auto rapidityCandidate = candidate.kfRapOmegac(); + auto ptCandidate = candidate.ptCharmBaryon(); + if constexpr (applyMl) { + registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsOmegac0Type"), candidate.mlProbOmegac()[0], massOmegac0, ptCandidate, rapidityCandidate); + } else { + registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsOmegac0Type"), massOmegac0, ptCandidate, rapidityCandidate); + } + } + } + + void processDataWithKFParticle(Omegac0CandidatesKF const&, Collisions const& collisions) + { + processData(selectedOmegac0CandidatesKF, collisions); + } + PROCESS_SWITCH(HfTaskOmegac0, processDataWithKFParticle, "process taskOmegac0 with KFParticle", false); + // TODO: add processKFParticleCent + + void processDataWithKFParticleMl(Omegac0CandidatesMlKF const&, Collisions const& collisions) + { + processData(selectedOmegac0CandidatesMlKF, collisions); + } + PROCESS_SWITCH(HfTaskOmegac0, processDataWithKFParticleMl, "process taskOmegac0 with KFParticle and ML selections", false); + // TODO: add processKFParticleMlCent + + template + void processMc(const CandType& candidates, + soa::Join const& mcParticles, + MyTracksWMc const&, + CollType const& collisions, + aod::McCollisions const&) + { + // MC rec. + for (const auto& candidate : candidates) { + if (!(candidate.hfflag() & 1 << aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaPi)) { + continue; + } + if (yCandRecoMax >= 0. && std::abs(candidate.kfRapOmegac()) > yCandRecoMax) { + continue; + } + auto collision = candidate.template collision_as(); + auto numPvContributors = collision.numContrib(); + float massOmegac0; + massOmegac0 = candidate.invMassCharmBaryon(); + auto ptCandidate = candidate.ptCharmBaryon(); + auto rapidityCandidate = candidate.kfRapOmegac(); + if (candidate.resultSelections() >= selectionFlagOmegac0) + if (candidate.flagMcMatchRec() == (1 << aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi)) { + if constexpr (applyMl) { + registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsOmegac0Type"), candidate.mlProbOmegac()[0], massOmegac0, ptCandidate, rapidityCandidate, candidate.ptBhadMotherPart(), candidate.originRec(), numPvContributors); + + } else { + registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsOmegac0Type"), massOmegac0, ptCandidate, rapidityCandidate, candidate.ptBhadMotherPart(), candidate.originRec(), numPvContributors); + } + } + } + // MC gen. + for (const auto& particle : mcParticles) { + if (std::abs(particle.flagMcMatchGen()) == 1 << aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi) { + if (yCandGenMax >= 0. && std::abs(particle.rapidityCharmBaryonGen()) > yCandGenMax) { + continue; + } + float ptGenB = -1; + auto ptGen = particle.pt(); + auto yGen = particle.rapidityCharmBaryonGen(); + + unsigned maxNumContrib = 0; + const auto& recoCollsPerMcColl = collisions.sliceBy(colPerMcCollision, particle.mcCollision().globalIndex()); + for (const auto& recCol : recoCollsPerMcColl) { + maxNumContrib = recCol.numContrib() > maxNumContrib ? recCol.numContrib() : maxNumContrib; + } + + if (particle.originGen() == RecoDecay::OriginType::Prompt) { + registry.fill(HIST("hSparseAcc"), ptGen, ptGenB, yGen, 1, maxNumContrib); + + } else { + ptGenB = mcParticles.rawIteratorAt(particle.idxBhadMotherPart()).pt(); + registry.fill(HIST("hSparseAcc"), ptGen, ptGenB, yGen, 2, maxNumContrib); + } + } + } + } + + void processMcWithKFParticle(OmegaC0CandidatesMcKF const& omegaC0CandidatesMcKF, + soa::Join const& mcParticles, + MyTracksWMc const& tracks, + CollisionsWithMcLabels const& collisions, + aod::McCollisions const& mcCollisions) + { + processMc(omegaC0CandidatesMcKF, mcParticles, tracks, collisions, mcCollisions); + } + PROCESS_SWITCH(HfTaskOmegac0, processMcWithKFParticle, "Process MC with KFParticle", false); + // TODO: add the processMcWithKFParticleCent + + void processMcWithKFParticleMl(Omegac0CandidatesMlMcKF const& omegac0CandidatesMlMcKF, + soa::Join const& mcParticles, + MyTracksWMc const& tracks, + CollisionsWithMcLabels const& collisions, + aod::McCollisions const& mcCollisions) + { + processMc(omegac0CandidatesMlMcKF, mcParticles, tracks, collisions, mcCollisions); + } + PROCESS_SWITCH(HfTaskOmegac0, processMcWithKFParticleMl, "Process MC with KFParticle and ML selections", false); + // TODO: add the processMcWithKFParticleMlCent +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} diff --git a/PWGHF/DataModel/CandidateReconstructionTables.h b/PWGHF/DataModel/CandidateReconstructionTables.h index 721d813748d..7da70658ff0 100644 --- a/PWGHF/DataModel/CandidateReconstructionTables.h +++ b/PWGHF/DataModel/CandidateReconstructionTables.h @@ -1460,7 +1460,7 @@ DECLARE_SOA_TABLE(HfCandToOmegaPi, "AOD", "HFCANDTOOMEGAPI", hf_cand_xic0_omegac0::DcaXYToPvV0Dau0, hf_cand_xic0_omegac0::DcaXYToPvV0Dau1, hf_cand_xic0_omegac0::DcaXYToPvCascDau, hf_cand_xic0_omegac0::DcaZToPvV0Dau0, hf_cand_xic0_omegac0::DcaZToPvV0Dau1, hf_cand_xic0_omegac0::DcaZToPvCascDau, hf_cand_xic0_omegac0::DcaCascDau, hf_cand_xic0_omegac0::DcaV0Dau, hf_cand_xic0_omegac0::DcaCharmBaryonDau, - hf_cand_xic0_omegac0::DecLenCharmBaryon, hf_cand_xic0_omegac0::DecLenCascade, hf_cand_xic0_omegac0::DecLenV0, hf_cand_xic0_omegac0::ErrorDecayLengthCharmBaryon, hf_cand_xic0_omegac0::ErrorDecayLengthXYCharmBaryon, + hf_cand_xic0_omegac0::DecLenCharmBaryon, hf_cand_xic0_omegac0::DecLenCascade, hf_cand_xic0_omegac0::DecLenV0, hf_cand_xic0_omegac0::ErrorDecayLengthCharmBaryon, hf_cand_xic0_omegac0::ErrorDecayLengthXYCharmBaryon, hf_track_index::HFflag, o2::soa::Marker<1>); DECLARE_SOA_TABLE(HfCandToOmegaK, "AOD", "HFCANDTOOMEGAK", diff --git a/PWGHF/DataModel/CandidateSelectionTables.h b/PWGHF/DataModel/CandidateSelectionTables.h index 60ba4850953..344572adc39 100644 --- a/PWGHF/DataModel/CandidateSelectionTables.h +++ b/PWGHF/DataModel/CandidateSelectionTables.h @@ -398,7 +398,7 @@ DECLARE_SOA_TABLE(HfSelToOmegaPi, "AOD", "HFSELTOOMEPI", hf_sel_toomegapi::TofNSigmaPiFromCharmBaryon, hf_sel_toomegapi::TofNSigmaKaFromCasc, hf_sel_toomegapi::TofNSigmaPiFromLambda, hf_sel_toomegapi::TofNSigmaPrFromLambda); DECLARE_SOA_TABLE(HfMlSelOmegacToOmegaPi, "AOD", "HFMLOMEGAC", //! - hf_sel_toomegapi::MlProbOmegac, hf_sel_toomegapi::MlProbOmegacBar); + hf_sel_toomegapi::MlProbOmegac); namespace hf_sel_toomegaka { DECLARE_SOA_COLUMN(StatusPidLambda, statusPidLambda, bool); diff --git a/PWGHF/TableProducer/CMakeLists.txt b/PWGHF/TableProducer/CMakeLists.txt index 9bda43b8229..22895a583ce 100644 --- a/PWGHF/TableProducer/CMakeLists.txt +++ b/PWGHF/TableProducer/CMakeLists.txt @@ -169,7 +169,7 @@ o2physics_add_dpl_workflow(candidate-selector-omegac0-to-omega-ka o2physics_add_dpl_workflow(candidate-selector-omegac0-to-omega-pi SOURCES candidateSelectorOmegac0ToOmegaPi.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::MLCore COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(candidate-selector-xic0-to-xi-pi-kf diff --git a/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx b/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx index 5f964eed708..385bd90586d 100644 --- a/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx +++ b/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx @@ -666,7 +666,7 @@ struct HfCandidateCreatorXic0Omegac0 { dcaxyV0Dau0, dcaxyV0Dau1, dcaxyCascBachelor, dcazV0Dau0, dcazV0Dau1, dcazCascBachelor, dcaCascDau, dcaV0Dau, dcaCharmBaryonDau, - decLenCharmBaryon, decLenCascade, decLenV0, errorDecayLengthCharmBaryon, errorDecayLengthXYCharmBaryon); + decLenCharmBaryon, decLenCascade, decLenV0, errorDecayLengthCharmBaryon, errorDecayLengthXYCharmBaryon, cand.hfflag()); } else { rowCandToOmegaK( @@ -1156,7 +1156,7 @@ struct HfCandidateCreatorXic0Omegac0 { dcaxyV0Dau0, dcaxyV0Dau1, dcaxyCascBachelor, dcazV0Dau0, dcazV0Dau1, dcazCascBachelor, kfOmegac0Candidate.kfDcaCascDau, kfOmegac0Candidate.kfDcaV0Dau, kfOmegac0Candidate.kfDcaOmegacDau, - decLenCharmBaryon, decLenCascade, decLenV0, errorDecayLengthCharmBaryon, errorDecayLengthXYCharmBaryon); + decLenCharmBaryon, decLenCascade, decLenV0, errorDecayLengthCharmBaryon, errorDecayLengthXYCharmBaryon, cand.hfflag()); // fill kf table kfCandidateData(kfOmegac0Candidate.kfDcaXYPiFromOmegac, kfOmegac0Candidate.kfDcaXYCascToPv, kfOmegac0Candidate.chi2GeoV0, kfOmegac0Candidate.chi2GeoCasc, kfOmegac0Candidate.chi2GeoOmegac, kfOmegac0Candidate.chi2MassV0, kfOmegac0Candidate.chi2MassCasc, diff --git a/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx b/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx index 117dee5430c..d5937319f77 100644 --- a/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx @@ -13,6 +13,10 @@ /// \brief Omegac0 → Omega Pi selection task /// \author Federica Zanone , Heidelberg University /// \author Ruiqi Yin , Fudan University +/// \author Yunfan Liu , China University of Geosciences + +#include +#include #include "CommonConstants/PhysicsConstants.h" #include "Framework/AnalysisTask.h" @@ -21,6 +25,9 @@ #include "Common/Core/TrackSelection.h" #include "Common/Core/TrackSelectorPID.h" +#include "PWGHF/Core/HfMlResponse.h" +#include "PWGHF/Core/HfMlResponseOmegacToOmegaPi.h" + #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/Utils/utilsAnalysis.h" @@ -40,6 +47,7 @@ enum pidInfoStored { /// Struct for applying Omegac0 -> Omega pi selection cuts struct HfCandidateSelectorToOmegaPi { Produces hfSelToOmegaPi; + Produces hfMlSelToOmegaPi; // LF analysis selections Configurable radiusCascMin{"radiusCascMin", 0.5, "Min cascade radius"}; @@ -69,7 +77,7 @@ struct HfCandidateSelectorToOmegaPi { Configurable impactParameterXYPiFromCharmBaryonMax{"impactParameterXYPiFromCharmBaryonMax", 10., "Max dcaxy pi from charm baryon track to PV"}; Configurable impactParameterZPiFromCharmBaryonMin{"impactParameterZPiFromCharmBaryonMin", 0., "Min dcaz pi from charm baryon track to PV"}; Configurable impactParameterZPiFromCharmBaryonMax{"impactParameterZPiFromCharmBaryonMax", 10., "Max dcaz pi from charm baryon track to PV"}; - + Configurable ptPionMin{"ptPionMin", 0., "Lower bound of Pion from Charmbaryon pT"}; Configurable impactParameterXYCascMin{"impactParameterXYCascMin", 0., "Min dcaxy cascade track to PV"}; Configurable impactParameterXYCascMax{"impactParameterXYCascMax", 10., "Max dcaxy cascade track to PV"}; Configurable impactParameterZCascMin{"impactParameterZCascMin", 0., "Min dcaz cascade track to PV"}; @@ -124,27 +132,49 @@ struct HfCandidateSelectorToOmegaPi { Configurable nClustersItsMin{"nClustersItsMin", 3, "Minimum number of ITS clusters requirement for pi <- charm baryon"}; Configurable nClustersItsInnBarrMin{"nClustersItsInnBarrMin", 1, "Minimum number of ITS clusters in inner barrel requirement for pi <- charm baryon"}; Configurable itsChi2PerClusterMax{"itsChi2PerClusterMax", 36, "Maximum value of chi2 fit over ITS clusters for pi <- charm baryon"}; - - // KF selection - Configurable applyKFpreselections{"applyKFpreselections", false, "Apply KFParticle related rejection"}; - Configurable applyCompetingCascRejection{"applyCompetingCascRejection", false, "Apply competing Xi(for Omegac0) rejection"}; - Configurable cascadeRejMassWindow{"cascadeRejMassWindow", 0.01, "competing Xi(for Omegac0) rejection mass window"}; - Configurable v0LdlMin{"v0LdlMin", 3., "Minimum value of l/dl of V0"}; // l/dl and Chi2 are to be determined - Configurable cascLdlMin{"cascLdlMin", 1., "Minimum value of l/dl of casc"}; - Configurable omegacLdlMax{"omegacLdlMax", 5., "Maximum value of l/dl of Omegac"}; - Configurable cTauOmegacMax{"cTauOmegacMax", 0.4, "lifetime τ of Omegac"}; - Configurable v0Chi2OverNdfMax{"v0Chi2OverNdfMax", 100., "Maximum chi2Geo/NDF of V0"}; - Configurable cascChi2OverNdfMax{"cascChi2OverNdfMax", 100., "Maximum chi2Geo/NDF of casc"}; - Configurable omegacChi2OverNdfMax{"omegacChi2OverNdfMax", 100., "Maximum chi2Geo/NDF of Omegac"}; - Configurable chi2TopoV0ToCascMax{"chi2TopoV0ToCascMax", 100., "Maximum chi2Topo/NDF of V0ToCas"}; - Configurable chi2TopoOmegacToPvMax{"chi2TopoOmegacToPvMax", 100., "Maximum chi2Topo/NDF of OmegacToPv"}; - Configurable chi2TopoCascToOmegacMax{"chi2TopoCascToOmegacMax", 100., "Maximum chi2Topo/NDF of CascToOmegac"}; - Configurable chi2TopoCascToPvMax{"chi2TopoCascToPvMax", 100., "Maximum chi2Topo/NDF of CascToPv"}; - Configurable decayLenXYOmegacMax{"decayLenXYOmegacMax", 1.5, "Maximum decay lengthXY of Omegac"}; - Configurable decayLenXYCascMin{"decayLenXYCascMin", 1., "Minimum decay lengthXY of Cascade"}; - Configurable decayLenXYLambdaMin{"decayLenXYLambdaMin", 0., "Minimum decay lengthXY of V0"}; - Configurable cosPaCascToOmegacMin{"cosPaCascToOmegacMin", 0.995, "Minimum cosPA of cascade<-Omegac"}; - Configurable cosPaV0ToCascMin{"cosPaV0ToCascMin", 0.99, "Minimum cosPA of V0<-cascade"}; + struct : ConfigurableGroup { + //// KF selection + std::string prefix = "kfSel"; + Configurable applyKFpreselections{"applyKFpreselections", false, "Apply KFParticle related rejection"}; + Configurable applyCompetingCascRejection{"applyCompetingCascRejection", false, "Apply competing Xi(for Omegac0) rejection"}; + Configurable cascadeRejMassWindow{"cascadeRejMassWindow", 0.01, "competing Xi(for Omegac0) rejection mass window"}; + Configurable v0LdlMin{"v0LdlMin", 3., "Minimum value of l/dl of V0"}; // l/dl and Chi2 are to be determined + Configurable cascLdlMin{"cascLdlMin", 1., "Minimum value of l/dl of casc"}; + Configurable omegacLdlMax{"omegacLdlMax", 5., "Maximum value of l/dl of Omegac"}; + Configurable cTauOmegacMax{"cTauOmegacMax", 0.4, "lifetime τ of Omegac"}; + Configurable v0Chi2OverNdfMax{"v0Chi2OverNdfMax", 100., "Maximum chi2Geo/NDF of V0"}; + Configurable cascChi2OverNdfMax{"cascChi2OverNdfMax", 100., "Maximum chi2Geo/NDF of casc"}; + Configurable omegacChi2OverNdfMax{"omegacChi2OverNdfMax", 100., "Maximum chi2Geo/NDF of Omegac"}; + Configurable chi2TopoV0ToCascMax{"chi2TopoV0ToCascMax", 100., "Maximum chi2Topo/NDF of V0ToCas"}; + Configurable chi2TopoOmegacToPvMax{"chi2TopoOmegacToPvMax", 100., "Maximum chi2Topo/NDF of OmegacToPv"}; + Configurable chi2TopoCascToOmegacMax{"chi2TopoCascToOmegacMax", 100., "Maximum chi2Topo/NDF of CascToOmegac"}; + Configurable chi2TopoCascToPvMax{"chi2TopoCascToPvMax", 100., "Maximum chi2Topo/NDF of CascToPv"}; + Configurable decayLenXYOmegacMax{"decayLenXYOmegacMax", 1.5, "Maximum decay lengthXY of Omegac"}; + Configurable decayLenXYCascMin{"decayLenXYCascMin", 1., "Minimum decay lengthXY of Cascade"}; + Configurable decayLenXYLambdaMin{"decayLenXYLambdaMin", 0., "Minimum decay lengthXY of V0"}; + Configurable cosPaCascToOmegacMin{"cosPaCascToOmegacMin", 0.995, "Minimum cosPA of cascade<-Omegac"}; + Configurable cosPaV0ToCascMin{"cosPaV0ToCascMin", 0.99, "Minimum cosPA of V0<-cascade"}; + } KfconfigurableGroup; + // topological cuts + Configurable> binsPt{"binsPt", std::vector{hf_cuts_omegac_to_omega_pi::vecBinsPt}, "pT bin limits"}; + Configurable> cuts{"cuts", {hf_cuts_omegac_to_omega_pi::cuts[0], hf_cuts_omegac_to_omega_pi::nBinsPt, hf_cuts_omegac_to_omega_pi::nCutVars, hf_cuts_omegac_to_omega_pi::labelsPt, hf_cuts_omegac_to_omega_pi::labelsCutVar}, "OmegaC0 candidate selection per pT bin"}; + // ML inference + Configurable applyMl{"applyMl", false, "Flag to apply ML selections"}; + Configurable> binsPtMl{"binsPtMl", std::vector{hf_cuts_ml::vecBinsPt}, "pT bin limits for ML application"}; + Configurable> cutDirMl{"cutDirMl", std::vector{hf_cuts_ml::vecCutDir}, "Whether to reject score values greater or smaller than the threshold"}; + Configurable> cutsMl{"cutsMl", {hf_cuts_ml::cuts[0], hf_cuts_ml::nBinsPt, hf_cuts_ml::nCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; + Configurable nClassesMl{"nClassesMl", (int8_t)hf_cuts_ml::nCutScores, "Number of classes in ML model"}; + Configurable> namesInputFeatures{"namesInputFeaturesW", std::vector{"feature1", "feature2"}, "Names of ML model input features"}; + // CCDB configuration + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable> modelPathsCCDB{"modelPathsCCDB", std::vector{"EventFiltering/PWGHF/BDTOmegac0"}, "Paths of models on CCDB"}; + Configurable> onnxFileNames{"onnxFileNames", std::vector{"ModelHandler_onnx_Omegac0ToOmegaPi.onnx"}, "ONNX file names for each pT bin (if not from CCDB full path)"}; + Configurable timestampCCDB{"timestampCCDB", -1, "timestamp of the ONNX file for ML model used to query in CCDB"}; + Configurable loadModelsFromCCDB{"loadModelsFromCCDB", false, "Flag to enable or disable the loading of models from CCDB"}; + + o2::analysis::HfMlResponseOmegacToOmegaPi hfMlResponse; + std::vector outputMlOmegac = {}; + o2::ccdb::CcdbApi ccdbApi; TrackSelectorPi selectorPion; TrackSelectorPr selectorProton; @@ -222,16 +252,59 @@ struct HfCandidateSelectorToOmegaPi { registry.add("hSelMassCharmBaryon", "hSelMassCharmBaryon;status;entries", {HistType::kTH1D, {axisSel}}); registry.add("hSelDcaXYToPvV0Daughters", "hSelDcaXYToPvV0Daughters;status;entries", {HistType::kTH1D, {axisSel}}); registry.add("hSelDcaXYToPvKaFromCasc", "hSelDcaXYToPvKaFromCasc;status;entries", {HistType::kTH1D, {axisSel}}); - registry.add("hSelCompetingCasc", "hSelCompetingCasc;status;entries", {HistType::kTH1D, {axisSel}}); - registry.add("hSelKFstatus", "hSelKFstatus;status;entries", {HistType::kTH1D, {axisSel}}); - registry.add("hSelV0_Casc_Omegacldl", "hSelV0_Casc_Omegacldl;status;entries", {HistType::kTH1D, {axisSel}}); - registry.add("hSelctauOmegac", "hSelctauOmegac;status;entries", {HistType::kTH1D, {axisSel}}); - registry.add("hSelChi2GeooverNDFV0_Casc_Omegac", "hSelChi2GeooverNDFV0_Casc_Omegac;status;entries", {HistType::kTH1D, {axisSel}}); - registry.add("hSelChi2TopooverNDFV0_Casc_Omegac", "hSelChi2TopooverNDFV0_Casc_Omegac;status;entries", {HistType::kTH1D, {axisSel}}); - registry.add("hSeldecayLenXYOmegac_Casc_V0", "hSeldecayLenXYOmegac_Casc_V0;status;entries", {HistType::kTH1D, {axisSel}}); - registry.add("hSelcosPaCascToOmegac_V0ToCasc", "hSelcosPaCascToOmegac_V0ToCasc;status;entries", {HistType::kTH1D, {axisSel}}); - registry.add("hInvMassXiMinus_rej_cut", "hInvMassXiMinus_rej_cut", kTH1D, {{1000, 1.25f, 1.65f}}); + + if (KfconfigurableGroup.applyKFpreselections) { + registry.add("hSelCompetingCasc", "hSelCompetingCasc;status;entries", {HistType::kTH1D, {axisSel}}); + registry.add("hSelKFstatus", "hSelKFstatus;status;entries", {HistType::kTH1D, {axisSel}}); + registry.add("hSelV0_Casc_Omegacldl", "hSelV0_Casc_Omegacldl;status;entries", {HistType::kTH1D, {axisSel}}); + registry.add("hSelctauOmegac", "hSelctauOmegac;status;entries", {HistType::kTH1D, {axisSel}}); + registry.add("hSelChi2GeooverNDFV0_Casc_Omegac", "hSelChi2GeooverNDFV0_Casc_Omegac;status;entries", {HistType::kTH1D, {axisSel}}); + registry.add("hSelChi2TopooverNDFV0_Casc_Omegac", "hSelChi2TopooverNDFV0_Casc_Omegac;status;entries", {HistType::kTH1D, {axisSel}}); + registry.add("hSeldecayLenXYOmegac_Casc_V0", "hSeldecayLenXYOmegac_Casc_V0;status;entries", {HistType::kTH1D, {axisSel}}); + registry.add("hSelcosPaCascToOmegac_V0ToCasc", "hSelcosPaCascToOmegac_V0ToCasc;status;entries", {HistType::kTH1D, {axisSel}}); + registry.add("hInvMassXiMinus_rej_cut", "hInvMassXiMinus_rej_cut", kTH1D, {{1000, 1.25f, 1.65f}}); + } + if (applyMl) { + registry.add("hBDTScoreTest1", "hBDTScoreTest1", {HistType::kTH1D, {{100, 0.0f, 1.0f, "score"}}}); + hfMlResponse.configure(binsPtMl, cutsMl, cutDirMl, nClassesMl); + if (loadModelsFromCCDB) { + ccdbApi.init(ccdbUrl); + hfMlResponse.setModelPathsCCDB(onnxFileNames, ccdbApi, modelPathsCCDB, timestampCCDB); + } else { + hfMlResponse.setModelPathsLocal(onnxFileNames); + } + hfMlResponse.cacheInputFeaturesIndices(namesInputFeatures); + hfMlResponse.init(); + } } + // for pT-dependent cuts (other selections will move into this in futrue) + // \param hfCandOmegac is candidate + // return true if candidate passes all cuts + template + bool selectionTopol(const T1& hfCandOmegac) + { + auto candpT = hfCandOmegac.ptCharmBaryon(); + auto pionPtFromOmegac = hfCandOmegac.ptPiFromCharmBaryon(); + int pTBin = findBin(binsPt, candpT); + if (pTBin == -1) { + return false; + } + + // check that the candidate pT is within the analysis range + if (candpT <= ptCandMin || candpT >= ptCandMax) { + return false; + } + + // check that the candidate pT is within the analysis range + if (pionPtFromOmegac < cuts->get(pTBin, "pT pi from Omegac")) { + registry.fill(HIST("hSelPtPiFromCharm"), 0); + return false; + } else { + registry.fill(HIST("hSelPtPiFromCharm"), 1); + } + + return true; + } // end template template void runOmegac0Selector(const Candidates& candidates, @@ -240,9 +313,20 @@ struct HfCandidateSelectorToOmegaPi { { // looping over charm baryon candidates for (const auto& candidate : candidates) { + // initializing selection flags + bool statusPidLambda = false; + bool statusPidCascade = false; + bool statusPidCharmBaryon = false; + + bool statusInvMassLambda = false; + bool statusInvMassCascade = false; + bool statusInvMassCharmBaryon = false; bool resultSelections = true; // True if the candidate passes all the selections, False otherwise + int infoTpcStored = 0; + int infoTofStored = 0; + auto trackV0PosDauId = candidate.posTrackId(); // positive V0 daughter auto trackV0NegDauId = candidate.negTrackId(); // negative V0 daughter auto trackKaFromCascId = candidate.bachelorId(); // kaon <- cascade @@ -255,6 +339,8 @@ struct HfCandidateSelectorToOmegaPi { auto trackPiFromLam = trackV0NegDau; auto trackPrFromLam = trackV0PosDau; + auto ptCand = candidate.ptCharmBaryon(); + int8_t signDecay = candidate.signDecay(); // sign of pi <- cascade if (signDecay > 0) { @@ -265,6 +351,20 @@ struct HfCandidateSelectorToOmegaPi { registry.fill(HIST("hSelSignDec"), 0); // particle decay } + // pt-dependent selection + if (!selectionTopol(candidate)) { + resultSelections = false; + hfSelToOmegaPi(statusPidLambda, statusPidCascade, statusPidCharmBaryon, statusInvMassLambda, statusInvMassCascade, statusInvMassCharmBaryon, resultSelections, infoTpcStored, infoTofStored, + trackPiFromCharm.tpcNSigmaPi(), trackKaFromCasc.tpcNSigmaKa(), trackPiFromLam.tpcNSigmaPi(), trackPrFromLam.tpcNSigmaPr(), + trackPiFromCharm.tofNSigmaPi(), trackKaFromCasc.tofNSigmaKa(), trackPiFromLam.tofNSigmaPi(), trackPrFromLam.tofNSigmaPr()); + if constexpr (ConstructMethod == hf_cand_casc_lf::ConstructMethod::KfParticle) { + if (applyMl) { + hfMlSelToOmegaPi(outputMlOmegac); + } + } + continue; + } + // eta selection double etaV0PosDau = candidate.etaV0PosDau(); double etaV0NegDau = candidate.etaV0NegDau(); @@ -407,8 +507,9 @@ struct HfCandidateSelectorToOmegaPi { } if constexpr (ConstructMethod == hf_cand_casc_lf::ConstructMethod::KfParticle) { + ; // KFParticle Preselections(kfsel) - if (applyKFpreselections) { + if (KfconfigurableGroup.applyKFpreselections) { bool inputKF = false; if (resultSelections) { @@ -417,8 +518,8 @@ struct HfCandidateSelectorToOmegaPi { } // Competing Ξ rejection(KF) Try to reject cases in which the candidate has a an inv. mass compatibler to Xi (bachelor pion) instead of Omega (bachelor kaon) - if (applyCompetingCascRejection) { - if (std::abs(candidate.cascRejectInvmass() - o2::constants::physics::MassXiMinus) < cascadeRejMassWindow) { + if (KfconfigurableGroup.applyCompetingCascRejection) { + if (std::abs(candidate.cascRejectInvmass() - o2::constants::physics::MassXiMinus) < KfconfigurableGroup.cascadeRejMassWindow) { resultSelections = false; registry.fill(HIST("hSelCompetingCasc"), 0); } else { @@ -437,7 +538,7 @@ struct HfCandidateSelectorToOmegaPi { } // v0&Casc&Omegac ldl selection - if ((candidate.v0ldl() < v0LdlMin) || (candidate.cascldl() < cascLdlMin) || (candidate.omegacldl() > omegacLdlMax)) { + if ((candidate.v0ldl() < KfconfigurableGroup.v0LdlMin) || (candidate.cascldl() < KfconfigurableGroup.cascLdlMin) || (candidate.omegacldl() > KfconfigurableGroup.omegacLdlMax)) { resultSelections = false; registry.fill(HIST("hSelV0_Casc_Omegacldl"), 0); } else { @@ -445,7 +546,7 @@ struct HfCandidateSelectorToOmegaPi { } // Omegac ctau selsection - if (candidate.ctauOmegac() > cTauOmegacMax) { + if (candidate.ctauOmegac() > KfconfigurableGroup.cTauOmegacMax) { resultSelections = false; registry.fill(HIST("hSelctauOmegac"), 0); } else { @@ -453,7 +554,7 @@ struct HfCandidateSelectorToOmegaPi { } // Chi2Geo/NDF V0&Casc&Omegac selection - if ((candidate.v0Chi2OverNdf() > v0Chi2OverNdfMax) || (candidate.cascChi2OverNdf() > cascChi2OverNdfMax) || (candidate.omegacChi2OverNdf() > omegacChi2OverNdfMax)) { + if ((candidate.v0Chi2OverNdf() > KfconfigurableGroup.v0Chi2OverNdfMax) || (candidate.cascChi2OverNdf() > KfconfigurableGroup.cascChi2OverNdfMax) || (candidate.omegacChi2OverNdf() > KfconfigurableGroup.omegacChi2OverNdfMax)) { resultSelections = false; registry.fill(HIST("hSelChi2GeooverNDFV0_Casc_Omegac"), 0); } else { @@ -461,7 +562,7 @@ struct HfCandidateSelectorToOmegaPi { } // Chi2Topo/NDF (chi2TopoV0ToCasc chi2TopoOmegacToPv chi2TopoCascToOmegac chi2TopoCascToPv) selection (???????????/NDF of which particle????????) - if ((candidate.chi2TopoV0ToCasc() > chi2TopoV0ToCascMax) || (candidate.chi2TopoOmegacToPv() > chi2TopoOmegacToPvMax) || (candidate.chi2TopoCascToOmegac() > chi2TopoCascToOmegacMax) || (candidate.chi2TopoCascToPv() > chi2TopoCascToPvMax)) { + if ((candidate.chi2TopoV0ToCasc() > KfconfigurableGroup.chi2TopoV0ToCascMax) || (candidate.chi2TopoOmegacToPv() > KfconfigurableGroup.chi2TopoOmegacToPvMax) || (candidate.chi2TopoCascToOmegac() > KfconfigurableGroup.chi2TopoCascToOmegacMax) || (candidate.chi2TopoCascToPv() > KfconfigurableGroup.chi2TopoCascToPvMax)) { resultSelections = false; registry.fill(HIST("hSelChi2TopooverNDFV0_Casc_Omegac"), 0); } else { @@ -469,7 +570,7 @@ struct HfCandidateSelectorToOmegaPi { } // DecaylengthXY of Omegac&Casc&V0 selection - if ((std::abs(candidate.decayLenXYOmegac()) > decayLenXYOmegacMax) || (std::abs(candidate.decayLenXYCasc()) < decayLenXYCascMin) || (std::abs(candidate.decayLenXYLambda()) < decayLenXYLambdaMin)) { + if ((std::abs(candidate.decayLenXYOmegac()) > KfconfigurableGroup.decayLenXYOmegacMax) || (std::abs(candidate.decayLenXYCasc()) < KfconfigurableGroup.decayLenXYCascMin) || (std::abs(candidate.decayLenXYLambda()) < KfconfigurableGroup.decayLenXYLambdaMin)) { resultSelections = false; registry.fill(HIST("hSeldecayLenXYOmegac_Casc_V0"), 0); } else { @@ -477,7 +578,7 @@ struct HfCandidateSelectorToOmegaPi { } // KFPA cut cosPaCascToOmegac cosPaV0ToCasc - if ((candidate.cosPaCascToOmegac() < cosPaCascToOmegacMin) || (candidate.cosPaV0ToCasc() < cosPaV0ToCascMin)) { + if ((candidate.cosPaCascToOmegac() < KfconfigurableGroup.cosPaCascToOmegacMin) || (candidate.cosPaV0ToCasc() < KfconfigurableGroup.cosPaV0ToCascMin)) { resultSelections = false; registry.fill(HIST("hSelcosPaCascToOmegac_V0ToCasc"), 0); } else { @@ -534,13 +635,6 @@ struct HfCandidateSelectorToOmegaPi { int statusPidKaFromCasc = -999; int statusPidPiFromCharmBaryon = -999; - bool statusPidLambda = false; - bool statusPidCascade = false; - bool statusPidCharmBaryon = false; - - int infoTpcStored = 0; - int infoTofStored = 0; - if (usePidTpcOnly == usePidTpcTofCombined) { LOGF(fatal, "Check the PID configurables, usePidTpcOnly and usePidTpcTofCombined can't have the same value"); } @@ -587,6 +681,8 @@ struct HfCandidateSelectorToOmegaPi { if (resultSelections) { registry.fill(HIST("hStatusCheck"), 0.5); } + } else { + resultSelections = false; } if (statusPidPrFromLam == TrackSelectorPID::Accepted && statusPidPiFromLam == TrackSelectorPID::Accepted && statusPidKaFromCasc == TrackSelectorPID::Accepted) { @@ -594,6 +690,8 @@ struct HfCandidateSelectorToOmegaPi { if (resultSelections) { registry.fill(HIST("hStatusCheck"), 1.5); } + } else { + resultSelections = false; } if (statusPidPrFromLam == TrackSelectorPID::Accepted && statusPidPiFromLam == TrackSelectorPID::Accepted && statusPidKaFromCasc == TrackSelectorPID::Accepted && statusPidPiFromCharmBaryon == TrackSelectorPID::Accepted) { @@ -601,13 +699,11 @@ struct HfCandidateSelectorToOmegaPi { if (resultSelections) { registry.fill(HIST("hStatusCheck"), 2.5); } + } else { + resultSelections = false; } // invariant mass cuts - bool statusInvMassLambda = false; - bool statusInvMassCascade = false; - bool statusInvMassCharmBaryon = false; - double invMassLambda = candidate.invMassLambda(); double invMassCascade = candidate.invMassCascade(); double invMassCharmBaryon = candidate.invMassCharmBaryon(); @@ -620,6 +716,7 @@ struct HfCandidateSelectorToOmegaPi { } } else { registry.fill(HIST("hSelMassLam"), 0); + resultSelections = false; } if (std::abs(invMassCascade - o2::constants::physics::MassOmegaMinus) < cascadeMassWindow) { @@ -630,6 +727,7 @@ struct HfCandidateSelectorToOmegaPi { } } else { registry.fill(HIST("hSelMassCasc"), 0); + resultSelections = false; } if ((invMassCharmBaryon >= invMassCharmBaryonMin) && (invMassCharmBaryon <= invMassCharmBaryonMax)) { @@ -640,6 +738,19 @@ struct HfCandidateSelectorToOmegaPi { } } else { registry.fill(HIST("hSelMassCharmBaryon"), 0); + resultSelections = false; + } + // ML selections + if constexpr (ConstructMethod == hf_cand_casc_lf::ConstructMethod::KfParticle) { + if (applyMl) { + bool isSelectedMlOmegac = false; + std::vector inputFeaturesOmegaC = hfMlResponse.getInputFeatures(candidate, trackPiFromLam, trackKaFromCasc, trackPiFromCharm); + isSelectedMlOmegac = hfMlResponse.isSelectedMl(inputFeaturesOmegaC, ptCand, outputMlOmegac); + if (isSelectedMlOmegac) { + registry.fill(HIST("hBDTScoreTest1"), outputMlOmegac[0]); + } + hfMlSelToOmegaPi(outputMlOmegac); + } } hfSelToOmegaPi(statusPidLambda, statusPidCascade, statusPidCharmBaryon, statusInvMassLambda, statusInvMassCascade, statusInvMassCharmBaryon, resultSelections, infoTpcStored, infoTofStored, diff --git a/PWGHF/TableProducer/treeCreatorOmegacToOmegaPi.cxx b/PWGHF/TableProducer/treeCreatorOmegacToOmegaPi.cxx index 0b0c3a2a4e4..727c412a6a4 100644 --- a/PWGHF/TableProducer/treeCreatorOmegacToOmegaPi.cxx +++ b/PWGHF/TableProducer/treeCreatorOmegacToOmegaPi.cxx @@ -197,6 +197,20 @@ DECLARE_SOA_TABLE(HfKfOmegacFulls, "AOD", "HFKFOMEGACFULL", full::V0Chi2OverNdf, full::CascChi2OverNdf, full::OmegacChi2OverNdf, full::MassV0Chi2OverNdf, full::MassCascChi2OverNdf, full::CascRejectInvmass, full::FlagMcMatchRec, full::OriginRec, full::CollisionMatched); + +DECLARE_SOA_TABLE(HfKfOmegacLites, "AOD", "HFKFOMEGACLITE", + full::NSigmaTPCPiFromOmegac, full::NSigmaTOFPiFromOmegac, full::NSigmaTPCKaFromCasc, full::NSigmaTOFKaFromCasc, + full::NSigmaTPCPiFromV0, full::NSigmaTPCPrFromV0, + full::KfDcaXYPiFromOmegac, full::DcaCharmBaryonDau, full::KfDcaXYCascToPv, + full::V0ldl, full::Cascldl, full::Omegacldl, full::Chi2TopoPiFromOmegacToPv, + full::DecayLenXYOmegac, + full::CosPaCascToPv, full::CosPaOmegacToPv, + full::InvMassCascade, full::InvMassCharmBaryon, + full::KfptPiFromOmegac, full::KfptOmegac, + full::CosThetaStarPiFromOmegac, full::CtOmegac, full::EtaOmegac, + full::V0Chi2OverNdf, full::CascChi2OverNdf, full::OmegacChi2OverNdf, + full::MassV0Chi2OverNdf, full::MassCascChi2OverNdf, full::CascRejectInvmass, + full::FlagMcMatchRec, full::OriginRec, full::CollisionMatched); } // namespace o2::aod /// Writes the full information in an output TTree @@ -204,6 +218,7 @@ struct HfTreeCreatorOmegac0ToOmegaPi { Produces rowCandidateLite; Produces rowKfCandidateFull; + Produces rowKfCandidateLite; Produces rowEv; Configurable zPvCut{"zPvCut", 10., "Cut on absolute value of primary vertex z coordinate"}; @@ -363,6 +378,47 @@ struct HfTreeCreatorOmegac0ToOmegaPi { } } + template + void fillKfCandidateLite(const T& candidate, int8_t flagMc, int8_t originMc, bool collisionMatched) + { + if (candidate.resultSelections() && candidate.statusPidCharmBaryon() && candidate.statusInvMassLambda() && candidate.statusInvMassCascade() && candidate.statusInvMassCharmBaryon()) { + + rowKfCandidateLite( + candidate.tpcNSigmaPiFromCharmBaryon(), + candidate.tofNSigmaPiFromCharmBaryon(), + candidate.tpcNSigmaKaFromCasc(), + candidate.tofNSigmaKaFromCasc(), + candidate.tpcNSigmaPiFromLambda(), + candidate.tpcNSigmaPrFromLambda(), + candidate.kfDcaXYPiFromOmegac(), + candidate.dcaCharmBaryonDau(), + candidate.kfDcaXYCascToPv(), + candidate.v0ldl(), + candidate.cascldl(), + candidate.omegacldl(), + candidate.chi2TopoPiFromOmegacToPv(), + candidate.decayLenXYOmegac(), + candidate.cosPACasc(), + candidate.cosPACharmBaryon(), + candidate.invMassCascade(), + candidate.invMassCharmBaryon(), + candidate.kfptPiFromOmegac(), + candidate.kfptOmegac(), + candidate.cosThetaStarPiFromOmegac(), + candidate.ctauOmegac(), + candidate.etaCharmBaryon(), + candidate.v0Chi2OverNdf(), + candidate.cascChi2OverNdf(), + candidate.omegacChi2OverNdf(), + candidate.massV0Chi2OverNdf(), + candidate.massCascChi2OverNdf(), + candidate.cascRejectInvmass(), + flagMc, + originMc, + collisionMatched); + } + } // fillKfCandidateLite end + void processDataLite(MyEventTable const& collisions, MyTrackTable const&, soa::Join const& candidates) { @@ -397,6 +453,23 @@ struct HfTreeCreatorOmegac0ToOmegaPi { } PROCESS_SWITCH(HfTreeCreatorOmegac0ToOmegaPi, processKfDataFull, "Process KF data", false); + void processKfDataLite(MyEventTable const& collisions, MyTrackTable const&, + soa::Join const& candidates) + { + // Filling event properties + rowEv.reserve(collisions.size()); + for (const auto& collision : collisions) { + fillEvent(collision, zPvCut); + } + + // Filling candidate properties + rowKfCandidateFull.reserve(candidates.size()); + for (const auto& candidate : candidates) { + fillKfCandidateLite(candidate, -7, RecoDecay::OriginType::None, false); + } + } + PROCESS_SWITCH(HfTreeCreatorOmegac0ToOmegaPi, processKfDataLite, "Process KF data Lite", false); + void processMcLite(MyEventTable const& collisions, MyTrackTable const&, soa::Join const& candidates) { @@ -437,6 +510,23 @@ struct HfTreeCreatorOmegac0ToOmegaPi { } PROCESS_SWITCH(HfTreeCreatorOmegac0ToOmegaPi, processKFMcFull, "Process KF MC", false); + void processKFMcLite(MyEventTable const& collisions, MyTrackTable const&, + soa::Join const& candidates) + { + // Filling event properties + rowEv.reserve(collisions.size()); + for (const auto& collision : collisions) { + fillEvent(collision, zPvCut); + } + + // Filling candidate properties + rowCandidateLite.reserve(candidates.size()); + for (const auto& candidate : candidates) { + fillKfCandidateLite(candidate, candidate.flagMcMatchRec(), candidate.originRec(), candidate.collisionMatched()); + } + } + PROCESS_SWITCH(HfTreeCreatorOmegac0ToOmegaPi, processKFMcLite, "Process KF MC Lite", false); + }; // end of struct WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From c8516573bb02aa0b4dd0365bb99960ae1dbd37e4 Mon Sep 17 00:00:00 2001 From: Francesco Mazzaschi <43742195+fmazzasc@users.noreply.github.com> Date: Wed, 19 Feb 2025 11:04:34 +0100 Subject: [PATCH 0312/1650] [PWGLF] Fix 3body data-linking + improve MC matching (#10041) Co-authored-by: Francesco Mazzaschi --- .../Nuspex/decay3bodybuilder.cxx | 57 +----- .../TableProducer/Nuspex/threebodyKFTask.cxx | 162 ++++++++++-------- 2 files changed, 95 insertions(+), 124 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx b/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx index 09f2b7ba530..70aa8b61195 100644 --- a/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx +++ b/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx @@ -1983,7 +1983,7 @@ struct kfdecay3bodyDataLinkBuilder { { buildDataLink(decay3bodytable, vtxdatatable); // build ReducedDecay3Body -> KFDecay3BodyData link table } - PROCESS_SWITCH(kfdecay3bodyDataLinkBuilder, processReduced, "Build data link table for reduced data.", true); + PROCESS_SWITCH(kfdecay3bodyDataLinkBuilder, processReduced, "Build data link table for reduced data.", false); }; struct decay3bodyLabelBuilder { @@ -2106,60 +2106,6 @@ struct decay3bodyLabelBuilder { } } PROCESS_SWITCH(decay3bodyLabelBuilder, processBuildLabels, "Produce MC label tables", false); - - void processBuildKFLabels(aod::KFDecay3BodysLinked const& decay3bodys, aod::KFVtx3BodyDatas const& vtx3bodydatas, MCLabeledTracksIU const&, aod::McParticles const&) - { - std::vector lIndices; - lIndices.reserve(vtx3bodydatas.size()); - for (int ii = 0; ii < vtx3bodydatas.size(); ii++) { - lIndices[ii] = -1; - } - - for (auto& decay3body : decay3bodys) { - - int lLabel = -1; - - auto lTrack0 = decay3body.track0_as(); - auto lTrack1 = decay3body.track1_as(); - auto lTrack2 = decay3body.track2_as(); - - // counter total - registry.fill(HIST("hLabelCounter"), 0.5); - - // Association check - if (lTrack0.has_mcParticle() && lTrack1.has_mcParticle() && lTrack2.has_mcParticle()) { - auto lMCTrack0 = lTrack0.mcParticle_as(); - auto lMCTrack1 = lTrack1.mcParticle_as(); - auto lMCTrack2 = lTrack2.mcParticle_as(); - // check if mother is the same - if (lMCTrack0.has_mothers() && lMCTrack1.has_mothers() && lMCTrack2.has_mothers()) { - for (auto& lMother0 : lMCTrack0.mothers_as()) { - for (auto& lMother1 : lMCTrack1.mothers_as()) { - for (auto& lMother2 : lMCTrack2.mothers_as()) { - if (lMother0.globalIndex() == lMother1.globalIndex() && lMother0.globalIndex() == lMother2.globalIndex()) { - lLabel = lMother1.globalIndex(); - // fill counter same mother - registry.fill(HIST("hLabelCounter"), 1.5); - } // end same mother conditional - } - } - } // end loop over daughters - } // end conditional of mothers existing - } // end association check - - // Construct label table, only vtx which corresponds to true mother and true daughters with a specified order is labeled - // for matter: track0->p, track1->pi, track2->bachelor - // for antimatter: track0->pi, track1->p, track2->bachelor - kfvtxfulllabels(lLabel); - if (decay3body.kfvtx3BodyDataId() != -1) { - lIndices[decay3body.kfvtx3BodyDataId()] = lLabel; - } - } - for (int ii = 0; ii < vtx3bodydatas.size(); ii++) { - kfvtxlabels(lIndices[ii]); - } - } - PROCESS_SWITCH(decay3bodyLabelBuilder, processBuildKFLabels, "Produce MC KF label tables", false); }; struct decay3bodyInitializer { @@ -2173,7 +2119,6 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) adaptAnalysisTask(cfgc), adaptAnalysisTask(cfgc), adaptAnalysisTask(cfgc), - adaptAnalysisTask(cfgc), adaptAnalysisTask(cfgc), }; } diff --git a/PWGLF/TableProducer/Nuspex/threebodyKFTask.cxx b/PWGLF/TableProducer/Nuspex/threebodyKFTask.cxx index d85a0e11b53..20bb51fa46e 100644 --- a/PWGLF/TableProducer/Nuspex/threebodyKFTask.cxx +++ b/PWGLF/TableProducer/Nuspex/threebodyKFTask.cxx @@ -55,7 +55,7 @@ struct threebodyKFTask { // collision filter and preslice Filter collisionFilter = (aod::evsel::sel8 == true && nabs(aod::collision::posZ) < 10.f); - Preslice> perCollisionVtx3BodyDatas = o2::aod::vtx3body::collisionId; + Preslice perCollisionVtx3BodyDatas = o2::aod::vtx3body::collisionId; HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -69,7 +69,6 @@ struct threebodyKFTask { // mass spectrum of reco candidates registry.add("hMassHypertriton", "Mass hypertriton", HistType::kTH1F, {{80, 2.96f, 3.04f, "#it{m}(p,#pi^{-},d) (GeV/#it{c}^{2})"}}); registry.add("hMassAntiHypertriton", "Mass anti-hypertriton", HistType::kTH1F, {{80, 2.96f, 3.04f, "#it{m}(#bar{p},#pi^{+},#bar{d}) (GeV/#it{c}^{2})"}}); - // Dalitz diagrams of reco candidates registry.add("hDalitzHypertriton", "Dalitz diagram", HistType::kTH2F, {axisM2PrPi, axisM2PiDe})->GetYaxis()->SetTitle("#it{m}^{2}(#pi^{-},d) ((GeV/#it{c}^{2})^{2})"); registry.add("hDalitzAntiHypertriton", "Dalitz diagram", HistType::kTH2F, {axisM2PrPi, axisM2PiDe})->GetXaxis()->SetTitle("#it{m}^{2}(#bar{p},#pi^{+}) ((GeV/#it{c}^{2})^{2})"); @@ -84,22 +83,65 @@ struct threebodyKFTask { LabelHist->GetXaxis()->SetBinLabel(1, "Total"); LabelHist->GetXaxis()->SetBinLabel(2, "Have Same MotherTrack"); LabelHist->GetXaxis()->SetBinLabel(3, "True H3L/Anti-H3L"); - registry.add("hTrueHypertritonMCPt", "pT gen. of reco. H3L", HistType::kTH1F, {{100, 0.0f, 10.0f, "#it{p}_{T} (GeV/#it{c})"}}); - registry.add("hTrueAntiHypertritonMCPt", "pT gen. of reco. Anti-H3L", HistType::kTH1F, {{100, 0.0f, 10.0f, "#it{p}_{T} (GeV/#it{c})"}}); + registry.add("hTrueHypertritonMCPt", "pT gen. of reco. H3L", HistType::kTH1F, {{100, -10.0f, 10.0f, "#it{p}_{T} (GeV/#it{c})"}}); registry.add("hTrueHypertritonMCMass", "mass gen. of reco. H3L", HistType::kTH1F, {{40, 2.96f, 3.04f, "#it{m}(p,#pi^{-},d) (GeV/#it{c}^{2})"}}); - registry.add("hTrueAntiHypertritonMCMass", "mass gen. of reco. Anti-H3L", HistType::kTH1F, {{40, 2.96f, 3.04f, "#it{m}(#bar{p},#pi^{+},#bar{d}) (GeV/#it{c}^{2})"}}); + registry.add("hTrueHypMassWithMuReco", "mass gen. of reco. H3L", HistType::kTH1F, {{40, 2.96f, 3.04f, "#it{m}(p,#pi^{-},d) (GeV/#it{c}^{2})"}}); registry.add("hTrueHypertritonMCCTau", "#it{c}#tau gen. of reco. H3L", HistType::kTH1F, {{50, 0.0f, 50.0f, "#it{c}#tau(cm)"}}); - registry.add("hTrueAntiHypertritonMCCTau", "#it{c}#tau gen. of reco. Anti-H3L", HistType::kTH1F, {{50, 0.0f, 50.0f, "#it{c}#tau(cm)"}}); registry.add("hTrueHypertritonMCMassPrPi", "inv. mass gen. of reco. V0 pair (H3L)", HistType::kTH1F, {{100, 0.0f, 6.0f, "#it{m}(p,#pi^{-}) (GeV/#it{c}^{2})"}}); - registry.add("hTrueAntiHypertritonMCMassPrPi", "inv. mass gen. of reco. V0 pair (Anti-H3L)", HistType::kTH1F, {{100, 0.0f, 6.0f, "#it{m}(#bar{p},#pi^{+}) (GeV/#it{c}^{2})"}}); // for gen information of non reco candidates registry.add("hTrueHypertritonMCMassPrPi_nonReco", "inv. mass gen. of non-reco. V0 pair (H3L)", HistType::kTH1F, {{100, 0.0f, 6.0f, "#it{m}(p,#pi^{-}) (GeV/#it{c}^{2})"}}); - registry.add("hTrueAntiHypertritonMCMassPrPi_nonReco", "inv. mass gen. of non-reco. V0 pair (Anti-H3L)", HistType::kTH1F, {{100, 0.0f, 6.0f, "#it{m}(#bar{p},#pi^{+}) (GeV/#it{c}^{2})"}}); - registry.add("hTrueHypertritonMCPtProton_nonReco", "Proton #it{p}_{T} gen. of non-reco. H3L", HistType::kTH1F, {{100, 0.0f, 6.0f, "#it{p}_{T}(p) (GeV/#it{c})"}}); registry.add("hTrueHypertritonMCPtPion_nonReco", "Pion #it{p}_{T} gen. of non-reco. H3L", HistType::kTH1F, {{100, 0.0f, 6.0f, "#it{p}_{T}(#pi) (GeV/#it{c})"}}); - registry.add("hTrueAntiHypertritonMCPtProton_nonReco", "Proton #it{p}_{T} gen. of non-reco. Anti-H3L", HistType::kTH1F, {{100, 0.0f, 6.0f, "#it{p}_{T}(p) (GeV/#it{c})"}}); - registry.add("hTrueAntiHypertritonMCPtPion_nonReco", "Pion #it{p}_{T} gen. of non-reco. Anti- H3L", HistType::kTH1F, {{100, 0.0f, 6.0f, "#it{p}_{T}(#pi) (GeV/#it{c})"}}); + registry.add("hTrueHypertritonMCPtProton_nonReco", "Proton #it{p}_{T} gen. of non-reco. H3L", HistType::kTH1F, {{100, 0.0f, 6.0f, "#it{p}_{T}(p) (GeV/#it{c})"}}); + } + + // helper function to check if a mother track is a true H3L/Anti-H3L + template + int checkH3LTruth(MCTrack3B const& trackPr, MCTrack3B const& trackPi, MCTrack3B const& trackDe, bool& isMuonReco) + { + if (!trackPi.has_mcParticle() || !trackPr.has_mcParticle() || !trackDe.has_mcParticle()) { + return -1; + } + auto mcParticlePr = trackPr.template mcParticle_as(); + auto mcParticlePi = trackPi.template mcParticle_as(); + auto mcParticleDe = trackDe.template mcParticle_as(); + + if (abs(mcParticlePr.pdgCode()) != 2212 || abs(mcParticleDe.pdgCode()) != 1000010020) { + return -1; + } + // check proton and deuteron mother + int prDeMomID = -1; + for (const auto& motherPr : mcParticlePr.template mothers_as()) { + for (const auto& motherDe : mcParticleDe.template mothers_as()) { + if (motherPr.globalIndex() == motherDe.globalIndex() && std::abs(motherPr.pdgCode()) == 1010010030) { + prDeMomID = motherPr.globalIndex(); + break; + } + } + } + if (prDeMomID == -1) { + return -1; + } + if (std::abs(mcParticlePi.pdgCode()) != 211 && std::abs(mcParticlePi.pdgCode()) != 13) { + return -1; + } + // check if the pion track is a muon coming from a pi -> mu + vu decay, if yes, take the mother pi + if (std::abs(mcParticlePi.pdgCode()) == 13) { + for (const auto& motherPi : mcParticlePi.template mothers_as()) { + if (std::abs(motherPi.pdgCode()) == 211) { + mcParticlePi = motherPi; + isMuonReco = true; + break; + } + } + } + // now loop over the pion mother + for (const auto& motherPi : mcParticlePi.template mothers_as()) { + if (motherPi.globalIndex() == prDeMomID) { + return motherPi.globalIndex(); + } + } + return -1; } template @@ -146,7 +188,7 @@ struct threebodyKFTask { //------------------------------------------------------------------ // process mc analysis void processMC(soa::Join const& collisions, - soa::Join const& vtx3bodydatas, + aod::KFVtx3BodyDatas const& vtx3bodydatas, aod::McParticles const& particlesMC, MCLabeledTracksIU const&, aod::McCollisions const& mcCollisions) @@ -197,59 +239,43 @@ struct threebodyKFTask { auto track0 = vtx3bodydata.track0_as(); auto track1 = vtx3bodydata.track1_as(); auto track2 = vtx3bodydata.track2_as(); - - if (vtx3bodydata.has_mcParticle() && vtx3bodydata.mcParticleId() > -1 && vtx3bodydata.mcParticleId() <= particlesMC.size()) { // mother to daughter association already checked in decay3bodybuilder - auto MCvtx3body = vtx3bodydata.mcParticle(); - vtx3bodyPDGcode = MCvtx3body.pdgCode(); - registry.fill(HIST("hLabelCounter"), 1.5); - if (MCvtx3body.has_daughters()) { - auto lMCTrack0 = track0.mcParticle_as(); - auto lMCTrack1 = track1.mcParticle_as(); - auto lMCTrack2 = track2.mcParticle_as(); - daughter0PDGcode = lMCTrack0.pdgCode(); - daughter1PDGcode = lMCTrack1.pdgCode(); - daughter2PDGcode = lMCTrack2.pdgCode(); - // check PDG codes - if ((MCvtx3body.pdgCode() == motherPdgCode && lMCTrack0.pdgCode() == 2212 && lMCTrack1.pdgCode() == -211 && lMCTrack2.pdgCode() == bachelorPdgCode) || - (MCvtx3body.pdgCode() == -motherPdgCode && lMCTrack0.pdgCode() == 211 && lMCTrack1.pdgCode() == -2212 && lMCTrack2.pdgCode() == -bachelorPdgCode)) { - genDecVtx = {lMCTrack0.vx(), lMCTrack0.vy(), lMCTrack0.vz()}; - MClifetime = RecoDecay::sqrtSumOfSquares(lMCTrack2.vx() - MCvtx3body.vx(), lMCTrack2.vy() - MCvtx3body.vy(), lMCTrack2.vz() - MCvtx3body.vz()) * o2::constants::physics::MassHyperTriton / MCvtx3body.p(); - genPhi = MCvtx3body.phi(); - genEta = MCvtx3body.eta(); - genRap = MCvtx3body.y(); - genP = MCvtx3body.p(); - genPt = MCvtx3body.pt(); - genPosP = lMCTrack0.p(); - genPosPt = lMCTrack0.pt(); - genNegP = lMCTrack1.p(); - genNegPt = lMCTrack1.pt(); - genBachP = lMCTrack2.p(); - genBachPt = lMCTrack2.pt(); - filledMothers.push_back(MCvtx3body.globalIndex()); - } // end is H3L or Anti-H3L - if (MCvtx3body.pdgCode() == motherPdgCode && lMCTrack0.pdgCode() == 2212 && lMCTrack1.pdgCode() == -211 && lMCTrack2.pdgCode() == bachelorPdgCode) { - isTrueH3L = true; - double hypertritonMCMass = RecoDecay::m(array{array{lMCTrack0.px(), lMCTrack0.py(), lMCTrack0.pz()}, array{lMCTrack1.px(), lMCTrack1.py(), lMCTrack1.pz()}, array{lMCTrack2.px(), lMCTrack2.py(), lMCTrack2.pz()}}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged, o2::constants::physics::MassDeuteron}); - MCmassPrPi = RecoDecay::m(array{array{lMCTrack0.px(), lMCTrack0.py(), lMCTrack0.pz()}, array{lMCTrack1.px(), lMCTrack1.py(), lMCTrack1.pz()}}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged}); - registry.fill(HIST("hLabelCounter"), 2.5); - registry.fill(HIST("hTrueHypertritonMCPt"), MCvtx3body.pt()); - registry.fill(HIST("hTrueHypertritonMCCTau"), MClifetime); - registry.fill(HIST("hTrueHypertritonMCMass"), hypertritonMCMass); - registry.fill(HIST("hTrueHypertritonMCMassPrPi"), MCmassPrPi); - } // end is H3L - if (MCvtx3body.pdgCode() == -motherPdgCode && lMCTrack0.pdgCode() == 211 && lMCTrack1.pdgCode() == -2212 && lMCTrack2.pdgCode() == -bachelorPdgCode) { - isTrueAntiH3L = true; - double antiHypertritonMCMass = RecoDecay::m(array{array{lMCTrack0.px(), lMCTrack0.py(), lMCTrack0.pz()}, array{lMCTrack1.px(), lMCTrack1.py(), lMCTrack1.pz()}, array{lMCTrack2.px(), lMCTrack2.py(), lMCTrack2.pz()}}, array{o2::constants::physics::MassPionCharged, o2::constants::physics::MassProton, o2::constants::physics::MassDeuteron}); - MCmassPrPi = RecoDecay::m(array{array{lMCTrack0.px(), lMCTrack0.py(), lMCTrack0.pz()}, array{lMCTrack1.px(), lMCTrack1.py(), lMCTrack1.pz()}}, array{o2::constants::physics::MassPionCharged, o2::constants::physics::MassProton}); - registry.fill(HIST("hLabelCounter"), 2.5); - registry.fill(HIST("hTrueAntiHypertritonMCPt"), MCvtx3body.pt()); - registry.fill(HIST("hTrueAntiHypertritonMCCTau"), MClifetime); - registry.fill(HIST("hTrueAntiHypertritonMCMass"), antiHypertritonMCMass); - registry.fill(HIST("hTrueAntiHypertritonMCMassPrPi"), MCmassPrPi); - } // end is Anti-H3L - } // end has daughters - } // end has matched MC particle - + auto& trackPr = vtx3bodydata.track2sign() > 0 ? track0 : track1; + auto& trackPi = vtx3bodydata.track2sign() > 0 ? track1 : track0; + auto& trackDe = track2; + + bool isMuonReco = false; + int motherID = checkH3LTruth(trackPr, trackPi, trackDe, isMuonReco); + if (motherID > 0) { + int chargeFactor = vtx3bodydata.track2sign() > 0 ? 1 : -1; + auto mcTrackHyp = particlesMC.rawIteratorAt(motherID); + auto mcTrackPr = trackPr.mcParticle_as(); + auto mcTrackPi = trackPi.mcParticle_as(); + auto mcTrackDe = trackDe.mcParticle_as(); + genPosPt = chargeFactor > 0 ? mcTrackPr.pt() : mcTrackPi.pt(); + genPosP = chargeFactor > 0 ? mcTrackPr.p() : mcTrackPi.p(); + genNegPt = chargeFactor < 0 ? mcTrackPr.pt() : mcTrackPi.pt(); + genNegP = chargeFactor < 0 ? mcTrackPr.p() : mcTrackPi.p(); + genBachPt = mcTrackDe.pt(); + genBachP = mcTrackDe.p(); + + genPhi = mcTrackHyp.phi(); + genEta = mcTrackHyp.eta(); + genPt = mcTrackHyp.pt(); + isTrueH3L = chargeFactor > 0; + isTrueAntiH3L = chargeFactor < 0; + MClifetime = RecoDecay::sqrtSumOfSquares(mcTrackPr.vx() - mcTrackHyp.vx(), mcTrackPr.vy() - mcTrackHyp.vy(), mcTrackPr.vz() - mcTrackHyp.vz()) * o2::constants::physics::MassHyperTriton / mcTrackHyp.p(); + double MCMass = RecoDecay::m(array{array{mcTrackPr.px(), mcTrackPr.py(), mcTrackPr.pz()}, array{mcTrackPi.px(), mcTrackPi.py(), mcTrackPi.pz()}, array{mcTrackDe.px(), mcTrackDe.py(), mcTrackDe.pz()}}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged, o2::constants::physics::MassDeuteron}); + MCmassPrPi = RecoDecay::m(array{array{mcTrackPr.px(), mcTrackPr.py(), mcTrackPr.pz()}, array{mcTrackPi.px(), mcTrackPi.py(), mcTrackPi.pz()}}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged}); + registry.fill(HIST("hLabelCounter"), 2.5); + registry.fill(HIST("hTrueHypertritonMCPt"), mcTrackHyp.pt() * chargeFactor); + registry.fill(HIST("hTrueHypertritonMCCTau"), MClifetime); + registry.fill(HIST("hTrueHypertritonMCMass"), MCMass); + registry.fill(HIST("hTrueHypertritonMCMassPrPi"), MCmassPrPi); + if (isMuonReco) { + registry.fill(HIST("hTrueHypMassWithMuReco"), MCMass); + } + filledMothers.push_back(mcTrackHyp.globalIndex()); + } outputMCTable( // filled for each reconstructed candidate (in KFVtx3BodyDatas) vtx3bodydata.mass(), vtx3bodydata.x(), vtx3bodydata.y(), vtx3bodydata.z(), @@ -390,9 +416,9 @@ struct threebodyKFTask { } } genMCmassPrPi = RecoDecay::m(array{antiProtonMom, piPlusMom}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged}); - registry.fill(HIST("hTrueAntiHypertritonMCMassPrPi_nonReco"), genMCmassPrPi); - registry.fill(HIST("hTrueAntiHypertritonMCPtProton_nonReco"), RecoDecay::sqrtSumOfSquares(antiProtonMom[0], antiProtonMom[1])); - registry.fill(HIST("hTrueAntiHypertritonMCPtPion_nonReco"), RecoDecay::sqrtSumOfSquares(piPlusMom[0], piPlusMom[1])); + registry.fill(HIST("hTrueHypertritonMCMassPrPi_nonReco"), genMCmassPrPi); + registry.fill(HIST("hTrueHypertritonMCPtProton_nonReco"), RecoDecay::sqrtSumOfSquares(antiProtonMom[0], antiProtonMom[1])); + registry.fill(HIST("hTrueHypertritonMCPtPion_nonReco"), RecoDecay::sqrtSumOfSquares(piPlusMom[0], piPlusMom[1])); } else { continue; // stop if particle is no true H3L or Anti-H3L } From 5b54a7cd6e05c1e076afe6261d4d5e802497d779 Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Wed, 19 Feb 2025 11:24:03 +0100 Subject: [PATCH 0313/1650] [PWGLF] Further fixes to findable mode indexing (#10061) Co-authored-by: ALICE Builder --- .../strangenessbuilderfindable.cxx | 372 ++++++++++-------- 1 file changed, 208 insertions(+), 164 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/strangenessbuilderfindable.cxx b/PWGLF/TableProducer/Strangeness/strangenessbuilderfindable.cxx index 2166f8e8ed8..6492b42d52e 100644 --- a/PWGLF/TableProducer/Strangeness/strangenessbuilderfindable.cxx +++ b/PWGLF/TableProducer/Strangeness/strangenessbuilderfindable.cxx @@ -270,11 +270,11 @@ struct StrangenessBuilder { Configurable mc_populateV0MCCoresAsymmetric{"mc_populateV0MCCoresAsymmetric", true, "populate V0MCCores table for derived data analysis, create V0Cores -> V0MCCores interlink. Saves only labeled V0s."}; Configurable mc_treatPiToMuDecays{"mc_treatPiToMuDecays", true, "if true, will correctly capture pi -> mu and V0 label will still point to originating V0 decay in those cases. Nota bene: prong info will still be for the muon!"}; Configurable mc_rapidityWindow{"mc_rapidityWindow", 0.5, "rapidity window to save non-recoed candidates"}; - Configurable mc_addGeneratedK0Short{"mc_addGeneratedK0Short", false, "add V0MCCore entry for generated, not-recoed K0Short"}; - Configurable mc_addGeneratedLambda{"mc_addGeneratedLambda", false, "add V0MCCore entry for generated, not-recoed Lambda"}; - Configurable mc_addGeneratedAntiLambda{"mc_addGeneratedAntiLambda", false, "add V0MCCore entry for generated, not-recoed AntiLambda"}; + Configurable mc_addGeneratedK0Short{"mc_addGeneratedK0Short", true, "add V0MCCore entry for generated, not-recoed K0Short"}; + Configurable mc_addGeneratedLambda{"mc_addGeneratedLambda", true, "add V0MCCore entry for generated, not-recoed Lambda"}; + Configurable mc_addGeneratedAntiLambda{"mc_addGeneratedAntiLambda", true, "add V0MCCore entry for generated, not-recoed AntiLambda"}; Configurable mc_addGeneratedGamma{"mc_addGeneratedGamma", false, "add V0MCCore entry for generated, not-recoed Gamma"}; - Configurable mc_findableDetachedV0{"mc_findableDetachedV0", true, "if true, generate findable V0s that have collisionId -1. Caution advised."}; + Configurable mc_findableDetachedV0{"mc_findableDetachedV0", false, "if true, generate findable V0s that have collisionId -1. Caution advised."}; } v0BuilderOpts; // cascade building options @@ -302,13 +302,13 @@ struct StrangenessBuilder { // MC builder options Configurable mc_populateCascMCCoresSymmetric{"mc_populateCascMCCoresSymmetric", false, "populate CascMCCores table for derived data analysis, keep CascMCCores joinable with CascCores"}; Configurable mc_populateCascMCCoresAsymmetric{"mc_populateCascMCCoresAsymmetric", true, "populate CascMCCores table for derived data analysis, create CascCores -> CascMCCores interlink. Saves only labeled Cascades."}; - Configurable mc_addGeneratedXiMinus{"mc_addGeneratedXiMinus", false, "add CascMCCore entry for generated, not-recoed XiMinus"}; - Configurable mc_addGeneratedXiPlus{"mc_addGeneratedXiPlus", false, "add CascMCCore entry for generated, not-recoed XiPlus"}; - Configurable mc_addGeneratedOmegaMinus{"mc_addGeneratedOmegaMinus", false, "add CascMCCore entry for generated, not-recoed OmegaMinus"}; - Configurable mc_addGeneratedOmegaPlus{"mc_addGeneratedOmegaPlus", false, "add CascMCCore entry for generated, not-recoed OmegaPlus"}; + Configurable mc_addGeneratedXiMinus{"mc_addGeneratedXiMinus", true, "add CascMCCore entry for generated, not-recoed XiMinus"}; + Configurable mc_addGeneratedXiPlus{"mc_addGeneratedXiPlus", true, "add CascMCCore entry for generated, not-recoed XiPlus"}; + Configurable mc_addGeneratedOmegaMinus{"mc_addGeneratedOmegaMinus", true, "add CascMCCore entry for generated, not-recoed OmegaMinus"}; + Configurable mc_addGeneratedOmegaPlus{"mc_addGeneratedOmegaPlus", true, "add CascMCCore entry for generated, not-recoed OmegaPlus"}; Configurable mc_treatPiToMuDecays{"mc_treatPiToMuDecays", true, "if true, will correctly capture pi -> mu and V0 label will still point to originating V0 decay in those cases. Nota bene: prong info will still be for the muon!"}; Configurable mc_rapidityWindow{"mc_rapidityWindow", 0.5, "rapidity window to save non-recoed candidates"}; - Configurable mc_findableDetachedCascade{"mc_findableDetachedCascade", true, "if true, generate findable cascades that have collisionId -1. Caution advised."}; + Configurable mc_findableDetachedCascade{"mc_findableDetachedCascade", false, "if true, generate findable cascades that have collisionId -1. Caution advised."}; } cascadeBuilderOpts; o2::ccdb::CcdbApi ccdbApi; @@ -422,7 +422,14 @@ struct StrangenessBuilder { if (mc_findableMode.value > 0) { // save statistics of findable candidate processing - auto hFindable = histos.add("hFindableStatistics", "hFindableStatistics", kTH1D, {{10, -0.5f, 9.5f}}); + auto hFindable = histos.add("hFindableStatistics", "hFindableStatistics", kTH1D, {{6, -0.5f, 5.5f}}); + hFindable->SetTitle(Form("Findable mode: %i", static_cast(mc_findableMode.value))); + hFindable->GetXaxis()->SetBinLabel(1, "AO2D V0s"); + hFindable->GetXaxis()->SetBinLabel(2, "V0s to be built"); + hFindable->GetXaxis()->SetBinLabel(3, "V0s with collId -1"); + hFindable->GetXaxis()->SetBinLabel(4, "AO2D Cascades"); + hFindable->GetXaxis()->SetBinLabel(5, "Cascades to be built"); + hFindable->GetXaxis()->SetBinLabel(6, "Cascades with collId -1"); } mRunNumber = 0; @@ -474,6 +481,12 @@ struct StrangenessBuilder { if (doprocessMonteCarloRun2) { LOGF(info, " ===> process function enabled: processMonteCarloRun2"); } + if (mc_findableMode.value == 1) { + LOGF(info, " ===> findable mode 1 is enabled: complement reco-ed with non-found findable"); + } + if (mc_findableMode.value == 2) { + LOGF(info, " ===> findable mode 2 is enabled: re-generate all findable from scratch"); + } // list enabled tables @@ -662,6 +675,9 @@ struct StrangenessBuilder { std::vector bestCollisionArray; // stores McCollision -> Collision map std::vector bestCollisionNContribsArray; // stores Ncontribs for biggest coll assoc to mccoll + int collisionLessV0s = 0; + int collisionLessCascades = 0; + if (mc_findableMode.value > 0) { if constexpr (soa::is_table) { // if mcCollisions exist, assemble mcColl -> bestRecoColl map here @@ -759,6 +775,7 @@ struct StrangenessBuilder { detected = true; // override pdg code with something useful for cascade findable math v0List[ii].pdgCode = positiveTrackIndex.pdgCode; + break; } } if (detected == false) { @@ -768,10 +785,13 @@ struct StrangenessBuilder { currentV0Entry.collisionId = bestCollisionArray[positiveTrackIndex.mcCollisionId]; currentV0Entry.posTrackId = positiveTrackIndex.globalId; currentV0Entry.negTrackId = negativeTrackIndex.globalId; - currentV0Entry.v0Type = 8; // mark with bit 3 + currentV0Entry.v0Type = 1; // mark with bit 3 currentV0Entry.pdgCode = positiveTrackIndex.pdgCode; currentV0Entry.particleId = positiveTrackIndex.originId; currentV0Entry.isCollinearV0 = false; + if (bestCollisionArray[positiveTrackIndex.mcCollisionId] < 0) { + collisionLessV0s++; + } if (v0BuilderOpts.mc_findableDetachedV0.value || currentV0Entry.collisionId >= 0) { v0List.push_back(currentV0Entry); } @@ -784,7 +804,7 @@ struct StrangenessBuilder { currentV0Entry.collisionId = bestCollisionArray[positiveTrackIndex.mcCollisionId]; currentV0Entry.posTrackId = positiveTrackIndex.globalId; currentV0Entry.negTrackId = negativeTrackIndex.globalId; - currentV0Entry.v0Type = 8; + currentV0Entry.v0Type = 1; currentV0Entry.pdgCode = positiveTrackIndex.pdgCode; currentV0Entry.particleId = positiveTrackIndex.originId; currentV0Entry.isCollinearV0 = false; @@ -796,6 +816,7 @@ struct StrangenessBuilder { currentV0Entry.globalId = v0.globalIndex(); currentV0Entry.v0Type = v0.v0Type(); currentV0Entry.isCollinearV0 = v0.isCollinearV0(); + break; } } if (v0BuilderOpts.mc_findableDetachedV0.value || currentV0Entry.collisionId >= 0) { @@ -804,6 +825,12 @@ struct StrangenessBuilder { } } } // end positive / negative track loops + + // fill findable statistics table + histos.fill(HIST("hFindableStatistics"), 0.0, v0s.size()); + histos.fill(HIST("hFindableStatistics"), 1.0, v0List.size()); + histos.fill(HIST("hFindableStatistics"), 2.0, collisionLessV0s); + } // end findableMode > 0 check } // end soa::is_table @@ -812,177 +839,194 @@ struct StrangenessBuilder { sorted_v0.clear(); sorted_v0 = sort_indices(v0List, (mc_findableMode.value > 0)); - // Cascade part - if (mc_findableMode.value < 2) { - // simple passthrough: copy existing cascades to build list - for (const auto& cascade : cascades) { - auto const& v0 = cascade.v0(); - currentCascadeEntry.globalId = cascade.globalIndex(); - currentCascadeEntry.collisionId = cascade.collisionId(); - currentCascadeEntry.v0Id = v0.globalIndex(); - currentCascadeEntry.posTrackId = v0.posTrackId(); - currentCascadeEntry.negTrackId = v0.negTrackId(); - currentCascadeEntry.bachTrackId = cascade.bachelorId(); - currentCascadeEntry.cascadeType = 0; // found - cascadeList.push_back(currentCascadeEntry); + // Cascade part if cores are requested, skip otherwise + if (mEnabledTables[kStoredCascCores] || mEnabledTables[kStoredKFCascCores]) { + if (mc_findableMode.value < 2) { + // simple passthrough: copy existing cascades to build list + for (const auto& cascade : cascades) { + auto const& v0 = cascade.v0(); + currentCascadeEntry.globalId = cascade.globalIndex(); + currentCascadeEntry.collisionId = cascade.collisionId(); + currentCascadeEntry.v0Id = v0.globalIndex(); + currentCascadeEntry.posTrackId = v0.posTrackId(); + currentCascadeEntry.negTrackId = v0.negTrackId(); + currentCascadeEntry.bachTrackId = cascade.bachelorId(); + currentCascadeEntry.cascadeType = 0; // found + cascadeList.push_back(currentCascadeEntry); + } } - } - - // any mode other than 0 will require mcParticles - if constexpr (soa::is_table) { - if (mc_findableMode.value > 0) { - // for search if existing or not - size_t cascadeListReconstructedSize = cascadeList.size(); - // determine which tracks are of interest - std::vector bachelorTrackArray; - // vector elements: track index, origin index, mc collision id, pdg code] - int dummy = -1; // unnecessary in this path - for (const auto& track : tracks) { - if (!track.has_mcParticle()) { - continue; // skip this, it's trouble - } - auto particle = track.template mcParticle_as(); - int originParticleIndex = getOriginatingParticle(particle, dummy, v0BuilderOpts.mc_treatPiToMuDecays); - if (originParticleIndex < 0) { - continue; // skip this, it's trouble (2) - } - auto originParticle = mcParticles.rawIteratorAt(originParticleIndex); + // any mode other than 0 will require mcParticles + if constexpr (soa::is_table) { + if (mc_findableMode.value > 0) { + // for search if existing or not + size_t cascadeListReconstructedSize = cascadeList.size(); + + // determine which tracks are of interest + std::vector bachelorTrackArray; + // vector elements: track index, origin index, mc collision id, pdg code] + int dummy = -1; // unnecessary in this path + for (const auto& track : tracks) { + if (!track.has_mcParticle()) { + continue; // skip this, it's trouble + } + auto particle = track.template mcParticle_as(); + int originParticleIndex = getOriginatingParticle(particle, dummy, cascadeBuilderOpts.mc_treatPiToMuDecays); + if (originParticleIndex < 0) { + continue; // skip this, it's trouble (2) + } + auto originParticle = mcParticles.rawIteratorAt(originParticleIndex); - bool trackIsInteresting = false; - if ( - (originParticle.pdgCode() == 3312 && cascadeBuilderOpts.mc_addGeneratedXiMinus.value > 0) || - (originParticle.pdgCode() == -3312 && cascadeBuilderOpts.mc_addGeneratedXiPlus.value > 0) || - (originParticle.pdgCode() == 3334 && cascadeBuilderOpts.mc_addGeneratedOmegaMinus.value > 0) || - (originParticle.pdgCode() == -3334 && cascadeBuilderOpts.mc_addGeneratedOmegaPlus.value > 0)) { - trackIsInteresting = true; - } - if (!trackIsInteresting) { - continue; // skip this, it's uninteresting - } + bool trackIsInteresting = false; + if ( + (originParticle.pdgCode() == 3312 && cascadeBuilderOpts.mc_addGeneratedXiMinus.value > 0) || + (originParticle.pdgCode() == -3312 && cascadeBuilderOpts.mc_addGeneratedXiPlus.value > 0) || + (originParticle.pdgCode() == 3334 && cascadeBuilderOpts.mc_addGeneratedOmegaMinus.value > 0) || + (originParticle.pdgCode() == -3334 && cascadeBuilderOpts.mc_addGeneratedOmegaPlus.value > 0)) { + trackIsInteresting = true; + } + if (!trackIsInteresting) { + continue; // skip this, it's uninteresting + } - currentTrackEntry.globalId = static_cast(track.globalIndex()); - currentTrackEntry.originId = originParticleIndex; - currentTrackEntry.mcCollisionId = originParticle.mcCollisionId(); - currentTrackEntry.pdgCode = originParticle.pdgCode(); + currentTrackEntry.globalId = static_cast(track.globalIndex()); + currentTrackEntry.originId = originParticleIndex; + currentTrackEntry.mcCollisionId = originParticle.mcCollisionId(); + currentTrackEntry.pdgCode = originParticle.pdgCode(); - // populate list of bachelor tracks to pair - bachelorTrackArray.push_back(currentTrackEntry); - } + // populate list of bachelor tracks to pair + bachelorTrackArray.push_back(currentTrackEntry); + } - // determine which V0s are of interest to pair and do pairing - for (size_t v0i = 0; v0i < v0List.size(); v0i++) { - auto v0 = v0List[sorted_v0[v0i]]; + // determine which V0s are of interest to pair and do pairing + for (size_t v0i = 0; v0i < v0List.size(); v0i++) { + auto v0 = v0List[sorted_v0[v0i]]; - if (std::abs(v0.pdgCode) != 3122) { - continue; // this V0 isn't a lambda, can't come from a cascade: skip - } - if (v0.particleId < 0) { - continue; // no de-referencing possible (e.g. background, ...) - } - auto v0Particle = mcParticles.rawIteratorAt(v0.particleId); - - int v0OriginParticleIndex = -1; - if (v0Particle.has_mothers()) { - auto const& motherList = v0Particle.template mothers_as(); - if (motherList.size() == 1) { - for (const auto& mother : motherList) { - v0OriginParticleIndex = mother.globalIndex(); + if (std::abs(v0.pdgCode) != 3122) { + continue; // this V0 isn't a lambda, can't come from a cascade: skip + } + if (v0.particleId < 0) { + continue; // no de-referencing possible (e.g. background, ...) + } + auto v0Particle = mcParticles.rawIteratorAt(v0.particleId); + + int v0OriginParticleIndex = -1; + if (v0Particle.has_mothers()) { + auto const& motherList = v0Particle.template mothers_as(); + if (motherList.size() == 1) { + for (const auto& mother : motherList) { + v0OriginParticleIndex = mother.globalIndex(); + } } } - } - if (v0OriginParticleIndex < 0) { - continue; - } - auto v0OriginParticle = mcParticles.rawIteratorAt(v0OriginParticleIndex); - - if (std::abs(v0OriginParticle.pdgCode()) != 3312 && std::abs(v0OriginParticle.pdgCode()) != 3334) { - continue; // this V0 does not come from any particle of interest, don't try - } - for (auto& bachelorTrackIndex : bachelorTrackArray) { - if (bachelorTrackIndex.originId != v0OriginParticle.pdgCode()) { + if (v0OriginParticleIndex < 0) { continue; } - // if we are here: v0 origin is 3312 or 3334, bachelor origin matches V0 origin - // findable mode 1: add non-reconstructed as cascadeType 1 - if (mc_findableMode.value == 1) { - bool detected = false; - for (size_t ii = 0; ii < cascadeListReconstructedSize; ii++) { - // check if this particular combination already exists in cascadeList - // caution: use track indices (immutable) but not V0 indices (re-indexing) - if (cascadeList[ii].posTrackId == v0.posTrackId && - cascadeList[ii].negTrackId == v0.negTrackId && - cascadeList[ii].bachTrackId == bachelorTrackIndex.globalId) { - detected = true; + auto v0OriginParticle = mcParticles.rawIteratorAt(v0OriginParticleIndex); + + if (std::abs(v0OriginParticle.pdgCode()) != 3312 && std::abs(v0OriginParticle.pdgCode()) != 3334) { + continue; // this V0 does not come from any particle of interest, don't try + } + for (const auto& bachelorTrackIndex : bachelorTrackArray) { + if (bachelorTrackIndex.originId != v0OriginParticle.globalIndex()) { + continue; + } + // if we are here: v0 origin is 3312 or 3334, bachelor origin matches V0 origin + // findable mode 1: add non-reconstructed as cascadeType 1 + if (mc_findableMode.value == 1) { + bool detected = false; + for (size_t ii = 0; ii < cascadeListReconstructedSize; ii++) { + // check if this particular combination already exists in cascadeList + // caution: use track indices (immutable) but not V0 indices (re-indexing) + if (cascadeList[ii].posTrackId == v0.posTrackId && + cascadeList[ii].negTrackId == v0.negTrackId && + cascadeList[ii].bachTrackId == bachelorTrackIndex.globalId) { + detected = true; + break; + } + } + if (detected == false) { + // collision index: from best-version-of-this-mcCollision + // nota bene: this could be negative, caution advised + currentCascadeEntry.globalId = -1; + currentCascadeEntry.collisionId = bestCollisionArray[bachelorTrackIndex.mcCollisionId]; + currentCascadeEntry.v0Id = v0i; // correct information here + currentCascadeEntry.posTrackId = v0.posTrackId; + currentCascadeEntry.negTrackId = v0.negTrackId; + currentCascadeEntry.bachTrackId = bachelorTrackIndex.globalId; + currentCascadeEntry.cascadeType = 1; // findable (but not found) + cascadeList.push_back(currentCascadeEntry); + if (bestCollisionArray[bachelorTrackIndex.mcCollisionId] < 0) { + collisionLessCascades++; + } + if (cascadeBuilderOpts.mc_findableDetachedCascade.value || currentCascadeEntry.collisionId >= 0) { + cascadeList.push_back(currentCascadeEntry); + } } } - if (detected == false) { - // collision index: from best-version-of-this-mcCollision - // nota bene: this could be negative, caution advised + + // findable mode 2: determine type based on cascade table, + // with type 1 being reserved to findable-but-not-found + if (mc_findableMode.value == 2) { currentCascadeEntry.globalId = -1; currentCascadeEntry.collisionId = bestCollisionArray[bachelorTrackIndex.mcCollisionId]; - currentCascadeEntry.v0Id = v0i; // correct information here + currentCascadeEntry.v0Id = v0i; // fill this in one go later currentCascadeEntry.posTrackId = v0.posTrackId; currentCascadeEntry.negTrackId = v0.negTrackId; currentCascadeEntry.bachTrackId = bachelorTrackIndex.globalId; currentCascadeEntry.cascadeType = 1; // findable (but not found) - cascadeList.push_back(currentCascadeEntry); - if (cascadeBuilderOpts.mc_findableDetachedCascade.value || currentV0Entry.collisionId >= 0) { - v0List.push_back(currentV0Entry); + if (bestCollisionArray[bachelorTrackIndex.mcCollisionId] < 0) { + collisionLessCascades++; } - } - } - - // findable mode 2: determine type based on cascade table, - // with type 1 being reserved to findable-but-not-found - if (mc_findableMode.value == 2) { - currentCascadeEntry.globalId = -1; - currentCascadeEntry.collisionId = bestCollisionArray[bachelorTrackIndex.mcCollisionId]; - currentCascadeEntry.v0Id = v0i; // fill this in one go later - currentCascadeEntry.posTrackId = v0.posTrackId; - currentCascadeEntry.negTrackId = v0.negTrackId; - currentCascadeEntry.bachTrackId = bachelorTrackIndex.globalId; - currentCascadeEntry.cascadeType = 1; // findable (but not found) - for (const auto& cascade : cascades) { - auto const& v0fromAOD = cascade.v0(); - if (v0fromAOD.posTrackId() == v0.posTrackId && - v0fromAOD.negTrackId() == v0.negTrackId && - cascade.bachelorId() == bachelorTrackIndex.globalId) { - // this will override type, but not collision index - // N.B.: collision index checks still desirable! - currentCascadeEntry.cascadeType = 0; - currentCascadeEntry.globalId = cascade.globalIndex(); + for (const auto& cascade : cascades) { + auto const& v0fromAOD = cascade.v0(); + if (v0fromAOD.posTrackId() == v0.posTrackId && + v0fromAOD.negTrackId() == v0.negTrackId && + cascade.bachelorId() == bachelorTrackIndex.globalId) { + // this will override type, but not collision index + // N.B.: collision index checks still desirable! + currentCascadeEntry.cascadeType = 0; + currentCascadeEntry.globalId = cascade.globalIndex(); + break; + } + } + if (cascadeBuilderOpts.mc_findableDetachedCascade.value || currentCascadeEntry.collisionId >= 0) { + cascadeList.push_back(currentCascadeEntry); } } - if (cascadeBuilderOpts.mc_findableDetachedCascade.value || currentV0Entry.collisionId >= 0) { - cascadeList.push_back(currentCascadeEntry); - } - } - } // end bachelorTrackArray loop - } // end v0List loop - - // at this stage, cascadeList is alright, but the v0 indices are still not - // correct. We'll have to loop over all V0s and find the appropriate matches - // ---> but only in mode 1, and only for AO2D-native V0s - if (mc_findableMode.value == 1) { - for (size_t casci = 0; casci < cascadeListReconstructedSize; casci++) { - // loop over v0List to find corresponding v0 index, but do it in sorted way - for (size_t v0i = 0; v0i < v0List.size(); v0i++) { - auto v0 = v0List[sorted_v0[v0i]]; - if (cascadeList[casci].posTrackId == v0.posTrackId && - cascadeList[casci].negTrackId == v0.negTrackId) { - cascadeList[casci].v0Id = v0i; // fix, point to correct V0 index + } // end bachelorTrackArray loop + } // end v0List loop + + // at this stage, cascadeList is alright, but the v0 indices are still not + // correct. We'll have to loop over all V0s and find the appropriate matches + // ---> but only in mode 1, and only for AO2D-native V0s + if (mc_findableMode.value == 1) { + for (size_t casci = 0; casci < cascadeListReconstructedSize; casci++) { + // loop over v0List to find corresponding v0 index, but do it in sorted way + for (size_t v0i = 0; v0i < v0List.size(); v0i++) { + auto v0 = v0List[sorted_v0[v0i]]; + if (cascadeList[casci].posTrackId == v0.posTrackId && + cascadeList[casci].negTrackId == v0.negTrackId) { + cascadeList[casci].v0Id = v0i; // fix, point to correct V0 index + break; + } } } } - } - // we should now be done! - } // end findable mode check - } // end soa::is_table + // we should now be done! collect statistics + histos.fill(HIST("hFindableStatistics"), 3.0, cascades.size()); + histos.fill(HIST("hFindableStatistics"), 4.0, cascadeList.size()); + histos.fill(HIST("hFindableStatistics"), 5.0, collisionLessCascades); - // we need to allow for sorted use of cascadeList - sorted_cascade.clear(); - sorted_cascade = sort_indices(cascadeList, (mc_findableMode.value > 0)); + } // end findable mode check + } // end soa::is_table + + // we need to allow for sorted use of cascadeList + sorted_cascade.clear(); + sorted_cascade = sort_indices(cascadeList, (mc_findableMode.value > 0)); + } + + LOGF(info, "AO2D input: %i V0s, %i cascades. Building list sizes: %i V0s, %i cascades", v0s.size(), cascades.size(), v0List.size(), cascadeList.size()); } //__________________________________________________ @@ -1037,7 +1081,7 @@ struct StrangenessBuilder { for (size_t iv0 = 0; iv0 < v0List.size(); iv0++) { const auto& v0 = v0List[sorted_v0[iv0]]; - if (!mEnabledTables[kV0CoresBase] && v0Map[v0.globalId] == -2) { + if (!mEnabledTables[kV0CoresBase] && v0Map[iv0] == -2) { // this v0 hasn't been used by cascades and we're not generating V0s, so skip it v0dataLink(-1, -1); continue; @@ -1051,8 +1095,8 @@ struct StrangenessBuilder { v0dataLink(-1, -1); continue; } - if (v0Map[v0.globalId] == -1) { - v0Map[v0.globalId] = v0sFromCascades.size(); // provide actual valid index in buffer + if (v0Map[iv0] == -1) { + v0Map[iv0] = v0sFromCascades.size(); // provide actual valid index in buffer v0sFromCascades.push_back(straHelper.v0); } // fill requested cursors only if type is not 0 @@ -1061,7 +1105,7 @@ struct StrangenessBuilder { if (mEnabledTables[kV0Indices]) { // for referencing (especially - but not only - when using derived data) v0indices(v0.posTrackId, v0.negTrackId, - v0.collisionId, v0.globalId); + v0.collisionId, iv0); histos.fill(HIST("hTableBuildingStatistics"), kV0Indices); } if (mEnabledTables[kV0TrackXs]) { @@ -1211,7 +1255,7 @@ struct StrangenessBuilder { // code that is agnostic with respect to the joinability of // V0Cores and V0MCCores (always dereference -> safe) if (mEnabledTables[kV0CoreMCLabels]) { - v0CoreMCLabels(v0.globalId); // interlink index + v0CoreMCLabels(iv0); // interlink index histos.fill(HIST("hTableBuildingStatistics"), kV0CoreMCLabels); } } @@ -1427,7 +1471,7 @@ struct StrangenessBuilder { thisCascInfo.momentum[1] = lV0Mother.py(); thisCascInfo.momentum[2] = lV0Mother.pz(); if (lV0Mother.has_mothers()) { - for (auto& lV0GrandMother : lV0Mother.template mothers_as()) { + for (const auto& lV0GrandMother : lV0Mother.template mothers_as()) { thisCascInfo.pdgCodeMother = lV0GrandMother.pdgCode(); thisCascInfo.motherLabel = lV0GrandMother.globalIndex(); } @@ -1634,7 +1678,7 @@ struct StrangenessBuilder { // now populate V0MCCores if in asymmetric mode if (cascadeBuilderOpts.mc_populateCascMCCoresAsymmetric) { // first step: add any un-recoed v0mmcores that were requested - for (auto& mcParticle : mcParticles) { + for (const auto& mcParticle : mcParticles) { thisCascInfo.pdgCode = -1, thisCascInfo.pdgCodeMother = -1; thisCascInfo.pdgCodePositive = -1, thisCascInfo.pdgCodeNegative = -1; thisCascInfo.pdgCodeBachelor = -1, thisCascInfo.pdgCodeV0 = -1; From 80f7ed3dbdbc2e8638316562bd74491d615cf634 Mon Sep 17 00:00:00 2001 From: Samuele Cattaruzzi <124249902+scattaru@users.noreply.github.com> Date: Wed, 19 Feb 2025 12:53:11 +0100 Subject: [PATCH 0314/1650] [PWGHF] Ds-h correlation, adding derived data for SE analysis (#10045) --- .../DataModel/DerivedDataCorrelationTables.h | 44 ++++++++++++---- .../HFC/TableProducer/correlatorDsHadrons.cxx | 52 ++++++------------- PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx | 46 ++++++++-------- 3 files changed, 73 insertions(+), 69 deletions(-) diff --git a/PWGHF/HFC/DataModel/DerivedDataCorrelationTables.h b/PWGHF/HFC/DataModel/DerivedDataCorrelationTables.h index 8bd3815df00..c43bb12a2a2 100644 --- a/PWGHF/HFC/DataModel/DerivedDataCorrelationTables.h +++ b/PWGHF/HFC/DataModel/DerivedDataCorrelationTables.h @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file DerivedDataCorrelations.h +/// \file DerivedDataCorrelationTables.h /// \brief Tables for producing derived data for correlation analysis /// \author Samuele Cattaruzzi @@ -40,12 +40,14 @@ using HfcRedCollision = HfcRedCollisions::iterator; namespace hf_candidate_reduced { DECLARE_SOA_INDEX_COLUMN(HfcRedCollision, hfcRedCollision); //! ReducedCollision index -DECLARE_SOA_COLUMN(PhiCand, phiCand, float); //! Phi of the candidate -DECLARE_SOA_COLUMN(EtaCand, etaCand, float); //! Eta of the candidate -DECLARE_SOA_COLUMN(PtCand, ptCand, float); //! Pt of the candidate -DECLARE_SOA_COLUMN(InvMassDs, invMassDs, float); //! Invariant mass of Ds candidate +DECLARE_SOA_COLUMN(PhiCand, phiCand, float); //! Phi of the candidate +DECLARE_SOA_COLUMN(EtaCand, etaCand, float); //! Eta of the candidate +DECLARE_SOA_COLUMN(PtCand, ptCand, float); //! Pt of the candidate +DECLARE_SOA_COLUMN(InvMassDs, invMassDs, float); //! Invariant mass of Ds candidate +DECLARE_SOA_COLUMN(BdtScorePrompt, bdtScorePrompt, float); //! BDT output score for prompt hypothesis +DECLARE_SOA_COLUMN(BdtScoreBkg, bdtScoreBkg, float); //! BDT output score for backgronud hypothesis } // namespace hf_candidate_reduced -DECLARE_SOA_TABLE(DsCandReduceds, "AOD", "DSCANDREDUCED", //! Table with Ds candidate info (rectangular selection) +DECLARE_SOA_TABLE(DsCandReduceds, "AOD", "DSCANDREDUCED", //! Table with Ds candidate info soa::Index<>, aod::hf_candidate_reduced::HfcRedCollisionId, aod::hf_candidate_reduced::PhiCand, @@ -53,19 +55,39 @@ DECLARE_SOA_TABLE(DsCandReduceds, "AOD", "DSCANDREDUCED", //! Table with Ds cand aod::hf_candidate_reduced::PtCand, aod::hf_candidate_reduced::InvMassDs); +DECLARE_SOA_TABLE(DsCandSelInfos, "AOD", "DSCANDSELINFO", //! Table with Ds candidate selection info + soa::Index<>, + aod::hf_candidate_reduced::HfcRedCollisionId, + aod::hf_candidate_reduced::BdtScorePrompt, + aod::hf_candidate_reduced::BdtScoreBkg); + namespace hf_assoc_track_reduced { -DECLARE_SOA_COLUMN(TrackId, trackId, int); //! Original track index -DECLARE_SOA_COLUMN(EtaAssocTrack, etaAssocTrack, float); //! Eta of the track -DECLARE_SOA_COLUMN(PhiAssocTrack, phiAssocTrack, float); //! Phi of the track -DECLARE_SOA_COLUMN(PtAssocTrack, ptAssocTrack, float); //! Pt of the track +DECLARE_SOA_COLUMN(TrackId, trackId, int); //! Original track index +DECLARE_SOA_COLUMN(NTpcCrossedRows, nTpcCrossedRows, int); //! Number of crossed TPC Rows +DECLARE_SOA_COLUMN(ItsClusterMap, itsClusterMap, int); //! ITS cluster map, one bit per a layer, starting from the innermost +DECLARE_SOA_COLUMN(ItsNCls, itsNCls, int); //! Number of ITS clusters +DECLARE_SOA_COLUMN(EtaAssocTrack, etaAssocTrack, float); //! Eta of the track +DECLARE_SOA_COLUMN(PhiAssocTrack, phiAssocTrack, float); //! Phi of the track +DECLARE_SOA_COLUMN(PtAssocTrack, ptAssocTrack, float); //! Pt of the track +DECLARE_SOA_COLUMN(DcaXY, dcaXY, float); //! Impact parameter in XY of the track to the primary vertex +DECLARE_SOA_COLUMN(DcaZ, dcaZ, float); //! Impact parameter in Z of the track to the primary vertex } // namespace hf_assoc_track_reduced DECLARE_SOA_TABLE(AssocTrackReds, "AOD", "ASSOCTRACKRED", //! Table with associated track info soa::Index<>, aod::hf_candidate_reduced::HfcRedCollisionId, aod::hf_assoc_track_reduced::PhiAssocTrack, aod::hf_assoc_track_reduced::EtaAssocTrack, - aod::hf_assoc_track_reduced::PtAssocTrack) + aod::hf_assoc_track_reduced::PtAssocTrack); + +DECLARE_SOA_TABLE(AssocTrackSelInfos, "AOD", "ASSOCTRACKSELINFO", //! Table with associated track info + soa::Index<>, + aod::hf_candidate_reduced::HfcRedCollisionId, + aod::hf_assoc_track_reduced::NTpcCrossedRows, + aod::hf_assoc_track_reduced::ItsClusterMap, + aod::hf_assoc_track_reduced::ItsNCls, + aod::hf_assoc_track_reduced::DcaXY, + aod::hf_assoc_track_reduced::DcaZ) } // namespace o2::aod #endif // PWGHF_HFC_DATAMODEL_DERIVEDDATACORRELATIONTABLES_H_ diff --git a/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx b/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx index 45ae67cd762..bff26133d96 100644 --- a/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx @@ -143,7 +143,9 @@ struct HfCorrelatorDsHadrons { Produces entryTrackRecoInfo; Produces collReduced; Produces candReduced; + Produces candSelInfo; Produces assocTrackReduced; + Produces assocTrackSelInfo; Configurable fillHistoData{"fillHistoData", true, "Flag for filling histograms in data processes"}; Configurable fillHistoMcRec{"fillHistoMcRec", true, "Flag for filling histograms in MC Rec processes"}; @@ -432,7 +434,7 @@ struct HfCorrelatorDsHadrons { entryTrackRecoInfo(track.dcaXY(), track.dcaZ(), track.tpcNClsCrossedRows()); } } // end track loop - } // end candidate loop + } // end candidate loop } PROCESS_SWITCH(HfCorrelatorDsHadrons, processData, "Process data", true); @@ -691,7 +693,7 @@ struct HfCorrelatorDsHadrons { } // end loop generated particles } // end loop generated Ds } // end loop reconstructed collision - } // end loop generated collision + } // end loop generated collision } PROCESS_SWITCH(HfCorrelatorDsHadrons, processMcGen, "Process MC Gen mode", false); @@ -700,40 +702,6 @@ struct HfCorrelatorDsHadrons { MyTracksData const& tracks) { - for (const auto& collision : collisions) { - auto thisCollId = collision.globalIndex(); - auto candsDsThisColl = candidates.sliceBy(candsDsPerCollision, thisCollId); - auto tracksThisColl = tracks.sliceBy(trackIndicesPerCollision, thisCollId); - - // Ds fill histograms and Ds candidates information stored - for (const auto& candidate : candsDsThisColl) { - // candidate selected - if (candidate.isSelDsToKKPi() >= selectionFlagDs) { - candReduced(hfcReducedCollisionIndex, candidate.phi(), candidate.eta(), candidate.pt(), hfHelper.invMassDsToKKPi(candidate)); - } else if (candidate.isSelDsToPiKK() >= selectionFlagDs) { - candReduced(hfcReducedCollisionIndex, candidate.phi(), candidate.eta(), candidate.pt(), hfHelper.invMassDsToPiKK(candidate)); - } - } - - // tracks information - for (const auto& track : tracksThisColl) { - if (!track.isGlobalTrackWoDCA()) { - continue; - } - assocTrackReduced(hfcReducedCollisionIndex, track.phi(), track.eta(), track.pt()); - } - - collReduced(collision.multFT0M(), collision.posZ()); - hfcReducedCollisionIndex++; - } - } - PROCESS_SWITCH(HfCorrelatorDsHadrons, processDerivedDataDs, "Process derived data Ds", false); - - void processDerivedDataDsLastIndex(SelCollisionsWithDs const& collisions, - CandDsData const& candidates, - MyTracksData const& tracks) - { - for (const auto& collision : collisions) { auto thisCollId = collision.globalIndex(); auto candsDsThisColl = candidates.sliceBy(candsDsPerCollision, thisCollId); @@ -743,11 +711,20 @@ struct HfCorrelatorDsHadrons { // Ds fill histograms and Ds candidates information stored for (const auto& candidate : candsDsThisColl) { + std::vector outputMl = {-1., -1., -1.}; // candidate selected if (candidate.isSelDsToKKPi() >= selectionFlagDs) { + for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { + outputMl[iclass] = candidate.mlProbDsToKKPi()[classMl->at(iclass)]; + } candReduced(indexHfcReducedCollision, candidate.phi(), candidate.eta(), candidate.pt(), hfHelper.invMassDsToKKPi(candidate)); + candSelInfo(indexHfcReducedCollision, outputMl[0], outputMl[2]); } else if (candidate.isSelDsToPiKK() >= selectionFlagDs) { + for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { + outputMl[iclass] = candidate.mlProbDsToPiKK()[classMl->at(iclass)]; + } candReduced(indexHfcReducedCollision, candidate.phi(), candidate.eta(), candidate.pt(), hfHelper.invMassDsToPiKK(candidate)); + candSelInfo(indexHfcReducedCollision, outputMl[0], outputMl[2]); } } @@ -757,12 +734,13 @@ struct HfCorrelatorDsHadrons { continue; } assocTrackReduced(indexHfcReducedCollision, track.phi(), track.eta(), track.pt()); + assocTrackSelInfo(indexHfcReducedCollision, track.tpcNClsCrossedRows(), track.itsClusterMap(), track.itsNCls(), track.dcaXY(), track.dcaZ()); } collReduced(collision.multFT0M(), collision.posZ()); } } - PROCESS_SWITCH(HfCorrelatorDsHadrons, processDerivedDataDsLastIndex, "Process derived data Ds w lastIndex", false); + PROCESS_SWITCH(HfCorrelatorDsHadrons, processDerivedDataDs, "Process derived data Ds", false); // Event Mixing void processDataME(SelCollisionsWithDs const& collisions, diff --git a/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx b/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx index e001913be81..f8bf2fff6d6 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx @@ -46,6 +46,7 @@ struct HfTaskCorrelationDsHadrons { Configurable selNoSameBunchPileUpColl{"selNoSameBunchPileUpColl", true, "Flag for rejecting the collisions associated with the same bunch crossing"}; Configurable removeCollWSplitVtx{"removeCollWSplitVtx", false, "Flag for rejecting the splitted collisions"}; Configurable loadAccXEffFromCCDB{"loadAccXEffFromCCDB", false, "Flag for loading efficiency distributions from CCDB"}; + Configurable separateTrackOrigins{"separateTrackOrigins", false, "Flag to enable separation of track origins (from c or b)"}; // Configurable doMcCollisionCheck{"doMcCollisionCheck", false, "Flag for applying the collision check and selection based on MC collision info"}; Configurable selectionFlagDs{"selectionFlagDs", 7, "Selection Flag for Ds (avoid the case of flag = 0, no outputMlScore)"}; Configurable nTpcCrossedRaws{"nTpcCrossedRaws", 70, "Number of crossed TPC Rows"}; @@ -55,13 +56,13 @@ struct HfTaskCorrelationDsHadrons { Configurable dcaXYTrackMax{"dcaXYTrackMax", 1., "max. DCA_xy of tracks"}; Configurable dcaZTrackMax{"dcaZTrackMax", 1., "max. DCA_z of tracks"}; Configurable etaTrackMax{"etaTrackMax", 0.8, "max. eta of tracks"}; - Configurable ptCandMin{"ptCandMin", 1., "min. cand. pT"}; - Configurable ptCandMax{"ptCandMax", 50., "max. cand pT"}; - Configurable ptTrackMin{"ptTrackMin", 0.3, "min. track pT"}; - Configurable ptTrackMax{"ptTrackMax", 50., "max. track pT"}; - Configurable yCandMax{"yCandMax", 0.8, "max. cand. rapidity"}; - Configurable yCandGenMax{"yCandGenMax", 0.5, "max. gen. cand. rapidity"}; - Configurable ptDaughterMin{"ptDaughterMin", 0.1, "min. daughter pT"}; + Configurable ptCandMin{"ptCandMin", 1., "min. cand. pT (used in eff. process only)"}; + Configurable ptCandMax{"ptCandMax", 50., "max. cand pT (used in eff. process only)"}; + Configurable ptTrackMin{"ptTrackMin", 0.3, "min. track pT (used in eff. process only)"}; + Configurable ptTrackMax{"ptTrackMax", 50., "max. track pT (used in eff. process only)"}; + Configurable yCandMax{"yCandMax", 0.8, "max. cand. rapidity (used in eff. process only)"}; + Configurable yCandGenMax{"yCandGenMax", 0.5, "max. gen. cand. rapidity (used in eff. process only)"}; + Configurable ptDaughterMin{"ptDaughterMin", 0.1, "min. daughter pT (used in eff. process only)"}; Configurable> classMl{"classMl", {0, 1, 2}, "Indexes of ML scores to be stored. Three indexes max."}; Configurable> binsPtD{"binsPtD", std::vector{o2::analysis::hf_cuts_ds_to_k_k_pi::vecBinsPt}, "pT bin limits for candidate mass plots and efficiency"}; Configurable> binsPtHadron{"binsPtHadron", std::vector{0.3, 2., 4., 8., 12., 50.}, "pT bin limits for assoc particle efficiency"}; @@ -83,7 +84,6 @@ struct HfTaskCorrelationDsHadrons { Configurable promptEffCcdbPath{"promptEffCcdbPath", "", "CCDB path for trigger efficiency"}; Configurable fdEffCcdbPath{"fdEffCcdbPath", "", "CCDB path for trigger efficiency"}; Configurable timestampCcdb{"timestampCcdb", -1, "timestamp of the efficiency files used to query in CCDB"}; - Configurable ccdbNoLaterThan{"ccdbNoLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; std::shared_ptr mEfficiencyD = nullptr; std::shared_ptr mEfficiencyAssociated = nullptr; @@ -250,7 +250,7 @@ struct HfTaskCorrelationDsHadrons { ccdb->setURL(ccdbUrl); ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); - ccdb->setCreatedNotAfter(ccdbNoLaterThan.value); + ccdb->setCreatedNotAfter(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); mEfficiencyD = std::shared_ptr(ccdb->getForTimeStamp(promptEffCcdbPath, timestampCcdb)); if (mEfficiencyD == nullptr) { @@ -743,7 +743,7 @@ struct HfTaskCorrelationDsHadrons { } } // end loop reconstructed collision - } // end loop generated collisions + } // end loop generated collisions } PROCESS_SWITCH(HfTaskCorrelationDsHadrons, processMcCandEfficiency, "Process MC for calculating candidate reconstruction efficiency", false); @@ -895,11 +895,13 @@ struct HfTaskCorrelationDsHadrons { } else if (std::abs(mcParticle.pdgCode()) == kMuonMinus) { registry.fill(HIST("hPtPrmMuonMcGen"), mcParticle.pt()); } - int trackOrigin = RecoDecay::getCharmHadronOrigin(mcParticles, mcParticle, true); - if (trackOrigin == 1) { // charm orgin - registry.fill(HIST("hPtPrmPromptPartMcGen"), mcParticle.pt()); - } else if (trackOrigin == 2) { // beauty origin - registry.fill(HIST("hPtPrmNonPromptPartMcGen"), mcParticle.pt()); + if (separateTrackOrigins) { + int trackOrigin = RecoDecay::getCharmHadronOrigin(mcParticles, mcParticle, true); + if (trackOrigin == 1) { // charm orgin + registry.fill(HIST("hPtPrmPromptPartMcGen"), mcParticle.pt()); + } else if (trackOrigin == 2) { // beauty origin + registry.fill(HIST("hPtPrmNonPromptPartMcGen"), mcParticle.pt()); + } } } } @@ -934,11 +936,13 @@ struct HfTaskCorrelationDsHadrons { registry.fill(HIST("hPtPrmMuonMcRec"), track.pt()); } // check track origin - int trackOrigin = RecoDecay::getCharmHadronOrigin(mcParticles, mcParticle, true); - if (trackOrigin == 1) { // charm orgin - registry.fill(HIST("hPtPrmPromptPartMcRec"), track.pt()); - } else if (trackOrigin == 2) { // beauty origin - registry.fill(HIST("hPtPrmNonPromptPartMcRec"), track.pt()); + if (separateTrackOrigins) { + int trackOrigin = RecoDecay::getCharmHadronOrigin(mcParticles, mcParticle, true); + if (trackOrigin == 1) { // charm orgin + registry.fill(HIST("hPtPrmPromptPartMcRec"), track.pt()); + } else if (trackOrigin == 2) { // beauty origin + registry.fill(HIST("hPtPrmNonPromptPartMcRec"), track.pt()); + } } } } @@ -949,7 +953,7 @@ struct HfTaskCorrelationDsHadrons { } } // end loop reconstructed collision - } // end loop generated collisions + } // end loop generated collisions } PROCESS_SWITCH(HfTaskCorrelationDsHadrons, processMcTrackEfficiency, "Process MC for calculating associated particle tracking efficiency", false); }; From b979d9ca18b6a356842008028c15560680f38c90 Mon Sep 17 00:00:00 2001 From: Junlee Kim Date: Wed, 19 Feb 2025 13:56:00 +0100 Subject: [PATCH 0315/1650] [PWGLF] adding TOF hits (#10068) --- PWGLF/DataModel/ReducedHeptaQuarkTables.h | 12 ++- .../Resonances/HeptaQuarktable.cxx | 74 ++++++++++++++++--- 2 files changed, 75 insertions(+), 11 deletions(-) diff --git a/PWGLF/DataModel/ReducedHeptaQuarkTables.h b/PWGLF/DataModel/ReducedHeptaQuarkTables.h index 54ad99884da..a8dd487fe9c 100644 --- a/PWGLF/DataModel/ReducedHeptaQuarkTables.h +++ b/PWGLF/DataModel/ReducedHeptaQuarkTables.h @@ -31,6 +31,7 @@ namespace redhqevent { DECLARE_SOA_COLUMN(NumPhi, numPhi, int); //! Number of negative K DECLARE_SOA_COLUMN(NumLambda, numLambda, int); //! Number of lambda +DECLARE_SOA_COLUMN(Centrality, centrality, float); //! } // namespace redhqevent DECLARE_SOA_TABLE(RedHQEvents, "AOD", "REDHQEVENT", o2::soa::Index<>, @@ -39,6 +40,7 @@ DECLARE_SOA_TABLE(RedHQEvents, "AOD", "REDHQEVENT", timestamp::Timestamp, collision::PosZ, collision::NumContrib, + redhqevent::Centrality, redhqevent::NumPhi, redhqevent::NumLambda); using RedHQEvent = RedHQEvents::iterator; @@ -63,6 +65,10 @@ DECLARE_SOA_COLUMN(HQd1Charge, hqd1Charge, float); //! HQ d1 charge DECLARE_SOA_COLUMN(HQd2Charge, hqd2Charge, float); //! HQ d1 charge DECLARE_SOA_COLUMN(HQd1TPC, hqd1TPC, float); //! TPC nsigma d1 DECLARE_SOA_COLUMN(HQd2TPC, hqd2TPC, float); //! TPC nsigma d2 +DECLARE_SOA_COLUMN(HQd1TOFHit, hqd1TOFHit, int); //! TOF hit d1 +DECLARE_SOA_COLUMN(HQd2TOFHit, hqd2TOFHit, int); //! TOF hit d2 +DECLARE_SOA_COLUMN(HQd1TOF, hqd1TOF, float); //! TOF nsigma d1 +DECLARE_SOA_COLUMN(HQd2TOF, hqd2TOF, float); //! TOF nsigma d2 } // namespace hqtrack DECLARE_SOA_TABLE(HQTracks, "AOD", "HQTRACK", @@ -84,7 +90,11 @@ DECLARE_SOA_TABLE(HQTracks, "AOD", "HQTRACK", hqtrack::HQd1Charge, hqtrack::HQd2Charge, hqtrack::HQd1TPC, - hqtrack::HQd2TPC); + hqtrack::HQd2TPC, + hqtrack::HQd1TOFHit, + hqtrack::HQd2TOFHit, + hqtrack::HQd1TOF, + hqtrack::HQd2TOF); using HQTrack = HQTracks::iterator; } // namespace o2::aod diff --git a/PWGLF/TableProducer/Resonances/HeptaQuarktable.cxx b/PWGLF/TableProducer/Resonances/HeptaQuarktable.cxx index 91d5fce5081..ccb0c61465f 100644 --- a/PWGLF/TableProducer/Resonances/HeptaQuarktable.cxx +++ b/PWGLF/TableProducer/Resonances/HeptaQuarktable.cxx @@ -107,8 +107,8 @@ struct heptaquarktable { Filter acceptanceFilter = (nabs(aod::track::eta) < cfgCutEta && nabs(aod::track::pt) > cfgCutPt); Filter DCAcutFilter = (nabs(aod::track::dcaXY) < cfgCutDCAxy) && (nabs(aod::track::dcaZ) < cfgCutDCAz); - using EventCandidates = soa::Filtered>; - using TrackCandidates = soa::Filtered>; + using EventCandidates = soa::Filtered>; + using TrackCandidates = soa::Filtered>; HistogramRegistry histos{ "histos", @@ -124,9 +124,11 @@ struct heptaquarktable { double massPi = o2::constants::physics::MassPionCharged; double massKa = o2::constants::physics::MassKPlus; + float centrality; + void init(o2::framework::InitContext&) { - histos.add("hEventstat", "", {HistType::kTH1F, {{2, 0, 2}}}); + histos.add("hEventstat", "", {HistType::kTH1F, {{3, 0, 3}}}); } template @@ -230,6 +232,7 @@ struct heptaquarktable { int numberLambda = 0; auto currentRunNumber = collision.bc_as().runNumber(); auto bc = collision.bc_as(); + centrality = collision.centFT0M(); std::vector HQId = {}; @@ -242,10 +245,18 @@ struct heptaquarktable { std::vector HQd1TPC = {}; std::vector HQd2TPC = {}; + std::vector HQd1TOFHit = {}; + std::vector HQd2TOFHit = {}; + + std::vector HQd1TOF = {}; + std::vector HQd2TOF = {}; + std::vector hqresonance, hqresonanced1, hqresonanced2; + histos.fill(HIST("hEventstat"), 0.5); if (!(collision.sel8() && collision.selection_bit(aod::evsel::kNoTimeFrameBorder) && collision.selection_bit(aod::evsel::kNoITSROFrameBorder) && collision.selection_bit(aod::evsel::kNoSameBunchPileup) && collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) return; + histos.fill(HIST("hEventstat"), 1.5); auto posThisColl = posTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); auto negThisColl = negTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); @@ -308,6 +319,26 @@ struct heptaquarktable { HQd1TPC.push_back(track1.tpcNSigmaKa()); HQd2TPC.push_back(track2.tpcNSigmaKa()); + + auto d1TOFHit = -1; + auto d2TOFHit = -1; + auto d1TOF = -999.0; + auto d2TOF = -999.0; + + if (track1.hasTOF()) { + d1TOFHit = 1; + d1TOF = track1.tofNSigmaKa(); + } + if (track2.hasTOF()) { + d2TOFHit = 1; + d2TOF = track2.tofNSigmaKa(); + } + + HQd1TOFHit.push_back(d1TOFHit); + HQd2TOFHit.push_back(d2TOFHit); + + HQd1TOF.push_back(d1TOF); + HQd2TOF.push_back(d2TOF); } } for (auto& v0 : V0s) { @@ -363,19 +394,42 @@ struct heptaquarktable { HQd1Charge.push_back(postrack_v0.sign()); HQd2Charge.push_back(negtrack_v0.sign()); - HQd1TPC.push_back(postrack_v0.tpcNSigmaKa()); - HQd2TPC.push_back(negtrack_v0.tpcNSigmaKa()); + if (LambdaTag) { + HQd1TPC.push_back(postrack_v0.tpcNSigmaPr()); + HQd2TPC.push_back(negtrack_v0.tpcNSigmaPi()); + } else if (aLambdaTag) { + HQd1TPC.push_back(postrack_v0.tpcNSigmaPi()); + HQd2TPC.push_back(negtrack_v0.tpcNSigmaPr()); + } + + auto d1TOFHit = -1; + auto d2TOFHit = -1; + auto d1TOF = -999.0; + auto d2TOF = -999.0; + + if (postrack_v0.hasTOF()) { + d1TOFHit = 1; + d1TOF = postrack_v0.tofNSigmaPr(); + } + if (negtrack_v0.hasTOF()) { + d2TOFHit = 1; + d2TOF = negtrack_v0.tofNSigmaPr(); + } ////// TOF with PV assumption to be corrected + HQd1TOFHit.push_back(d1TOFHit); + HQd2TOFHit.push_back(d2TOFHit); + + HQd1TOF.push_back(d1TOF); + HQd2TOF.push_back(d2TOF); } // select collision if (numberPhi < 2 || numberLambda < 1) return; keepEventDoubleHQ = true; - histos.fill(HIST("hEventstat"), 0.5); if (keepEventDoubleHQ && numberPhi > 1 && numberLambda > 0 && (hqresonance.size() == hqresonanced1.size()) && (hqresonance.size() == hqresonanced2.size())) { - histos.fill(HIST("hEventstat"), 1.5); + histos.fill(HIST("hEventstat"), 2.5); /////////// Fill collision table/////////////// - redHQEvents(bc.globalBC(), currentRunNumber, bc.timestamp(), collision.posZ(), collision.numContrib(), numberPhi, numberLambda); + redHQEvents(bc.globalBC(), currentRunNumber, bc.timestamp(), collision.posZ(), collision.numContrib(), centrality, numberPhi, numberLambda); auto indexEvent = redHQEvents.lastIndex(); //// Fill track table for HQ////////////////// for (auto if1 = hqresonance.begin(); if1 != hqresonance.end(); ++if1) { @@ -387,8 +441,8 @@ struct heptaquarktable { HQd1dummy.Px(), HQd1dummy.Py(), HQd1dummy.Pz(), HQd2dummy.Px(), HQd2dummy.Py(), HQd2dummy.Pz(), HQVectorDummy.M(), HQd1Index.at(i5), HQd2Index.at(i5), - HQd1Charge.at(i5), HQd2Charge.at(i5), - HQd1TPC.at(i5), HQd2TPC.at(i5)); + HQd1Charge.at(i5), HQd2Charge.at(i5), HQd1TPC.at(i5), HQd2TPC.at(i5), + HQd1TOFHit.at(i5), HQd2TOFHit.at(i5), HQd1TOF.at(i5), HQd2TOF.at(i5)); } } } // process From 873ec5cf7196f296f2588ac73648a632c938d9a3 Mon Sep 17 00:00:00 2001 From: Lucia Anna Tarasovicova Date: Wed, 19 Feb 2025 14:49:11 +0100 Subject: [PATCH 0316/1650] [PWGLF] change in derivedcascadeanalysis.cxx (#10076) Co-authored-by: Lucia Anna Tarasovicova --- PWGLF/Tasks/Strangeness/CMakeLists.txt | 2 +- .../Strangeness/derivedcascadeanalysis.cxx | 213 ++++++++++++++++-- 2 files changed, 198 insertions(+), 17 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/CMakeLists.txt b/PWGLF/Tasks/Strangeness/CMakeLists.txt index cb9eab4fb0f..0201ee95be2 100644 --- a/PWGLF/Tasks/Strangeness/CMakeLists.txt +++ b/PWGLF/Tasks/Strangeness/CMakeLists.txt @@ -66,7 +66,7 @@ o2physics_add_dpl_workflow(vzero-cascade-absorption o2physics_add_dpl_workflow(derivedcascadeanalysis SOURCES derivedcascadeanalysis.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::MLCore O2Physics::AnalysisCCDB COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(cascpostprocessing diff --git a/PWGLF/Tasks/Strangeness/derivedcascadeanalysis.cxx b/PWGLF/Tasks/Strangeness/derivedcascadeanalysis.cxx index 71657889da5..951a0ea525e 100644 --- a/PWGLF/Tasks/Strangeness/derivedcascadeanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/derivedcascadeanalysis.cxx @@ -23,6 +23,7 @@ #include "ReconstructionDataFormats/Track.h" #include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" +#include "Common/CCDB/ctpRateFetcher.h" #include "PWGLF/DataModel/LFStrangenessTables.h" #include "PWGLF/DataModel/LFStrangenessPIDTables.h" #include "Common/Core/TrackSelection.h" @@ -72,21 +73,18 @@ struct Derivedcascadeanalysis { ConfigurableAxis axisNch{"axisNch", {500, 0.0f, +5000.0f}, "Number of charged particles in |y| < 0.5"}; ConfigurableAxis vertexZ{"vertexZ", {30, -15.0f, 15.0f}, ""}; ConfigurableAxis axisMass{"axisMass", {200, 1.222f, 1.422f}, "range of invariant mass, in case of omega take 1.572f, 1.772f"}; + ConfigurableAxis axisIR{"axisIR", {510, -1, 50}, "Binning for the interaction rate (kHz)"}; Configurable isXi{"isXi", 1, "Apply cuts for Xi identification"}; Configurable useCentralityFT0M{"useCentralityFT0M", 0, "If true, use centFT0M"}; Configurable useCentralityFT0A{"useCentralityFT0A", 0, "If true, use centFT0A"}; Configurable useCentralityFT0Cvar1{"useCentralityFT0Cvar1", 0, "If true, use centFT0FT0Cvar1"}; - Configurable minOccupancy{"minOccupancy", -1, "Minimal occupancy"}; - Configurable maxOccupancy{"maxOccupancy", -1, "Maximal occupancy"}; - Configurable minOccupancyFT0{"minOccupancyFT0", -1, "Minimal occupancy"}; - Configurable maxOccupancyFT0{"maxOccupancyFT0", -1, "Maximal occupancy"}; Configurable useTrackOccupancyDef{"useTrackOccupancyDef", true, "Use occupancy definition based on the tracks"}; Configurable useFT0OccupancyDef{"useFT0OccupancyDef", false, "se occupancy definition based on the FT0 signals"}; - Configurable centMin{"centMin", 0, "Minimal accepted centrality"}; - Configurable centMax{"centMax", 100, "Maximal accepted centrality"}; Configurable minPt{"minPt", 0.0f, "minPt"}; Configurable nPtBinsForNsigmaTPC{"nPtBinsForNsigmaTPC", 100, ""}; + Configurable irSource{"irSource", "T0VTX", "Estimator of the interaction rate (Recommended: pp --> T0VTX, Pb-Pb --> ZNC hadronic)"}; + Configurable ccdburl{"ccdburl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; struct : ConfigurableGroup { std::string prefix = "qa"; @@ -98,6 +96,8 @@ struct Derivedcascadeanalysis { Configurable doPtDepCutStudy{"doPtDepCutStudy", false, "Fill histogram with a cutting paramer"}; Configurable doBefSelEventMultCorr{"doBefSelEventMultCorr", false, "Enable histogram of multiplicity correlation before cuts"}; Configurable doOccupancyCheck{"doOccupancyCheck", true, ""}; + Configurable doIRCheck{"doIRCheck", true, ""}; + Configurable doITSTPCmatchingCheck{"doITSTPCmatchingCheck", true, "fill histogram for ITS-TPC matching check"}; } qaFlags; struct : ConfigurableGroup { @@ -121,6 +121,12 @@ struct Derivedcascadeanalysis { Configurable doInel0MCGen{"doInel0MCGen", true, "Enable INEL > 0 selection for MC gen events"}; Configurable applyZVtxSelOnMCPV{"applyZVtxSelOnMCPV", false, "Enable z vertex cut selection on generated events"}; Configurable zVertexCut{"zVertexCut", 10, "Cut on PV position"}; + Configurable centMin{"centMin", 0, "Minimal accepted centrality"}; + Configurable centMax{"centMax", 100, "Maximal accepted centrality"}; + Configurable minOccupancy{"minOccupancy", -1, "Minimal occupancy"}; + Configurable maxOccupancy{"maxOccupancy", -1, "Maximal occupancy"}; + Configurable minOccupancyFT0{"minOccupancyFT0", -1, "Minimal occupancy"}; + Configurable maxOccupancyFT0{"maxOccupancyFT0", -1, "Maximal occupancy"}; } eventSelectionFlags; struct : ConfigurableGroup { @@ -145,6 +151,9 @@ struct Derivedcascadeanalysis { Configurable doNTOFSigmaV0PionCut{"doNTOFSigmaV0PionCut", false, "Enable n sigma TOF PID cut for pion from V0"}; Configurable doNTOFSigmaBachelorCut{"doNTOFSigmaBachelorCut", false, "Enable n sigma TOF PID cut for bachelor track"}; Configurable dooobrej{"dooobrej", 0, "OOB rejection: 0 no selection, 1 = ITS||TOF, 2 = TOF only for pT > ptthrtof"}; + Configurable doAtLeastOneTrackAB{"doAtLeastOneTrackAB", false, "require that at least one of the daughter tracks is from Afterburner"}; + Configurable doBachelorITSTracking{"doBachelorITSTracking", false, "require that the bachelor track is from the ITS tracking"}; + Configurable doAllTracksMinITSClusters{"doAllTracksMinITSClusters", false, "require that all daughter tracks have minimal ITS hits"}; } candidateSelectionFlags; struct : ConfigurableGroup { @@ -187,8 +196,13 @@ struct Derivedcascadeanalysis { Configurable masswin{"masswin", 0.05, "Mass window limit"}; Configurable rapCut{"rapCut", 0.5, "Rapidity acceptance"}; Configurable etaDauCut{"etaDauCut", 0.8, "Pseudorapidity acceptance of the cascade daughters"}; + Configurable minITSclusters{"minITSclusters", 3, "minimal number of ITS hits for the daughter tracks"}; } candidateSelectionValues; + o2::ccdb::CcdbApi ccdbApi; + Service ccdb; + ctpRateFetcher rateFetcher; + Service pdgDB; static constexpr std::string_view Index[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"}; @@ -202,6 +216,11 @@ struct Derivedcascadeanalysis { void init(InitContext const&) { + // setting CCDB service + ccdb->setURL(ccdburl); + ccdb->setCaching(true); + ccdb->setFatalWhenNull(false); + histos.add("hEventVertexZ", "hEventVertexZ", kTH1F, {vertexZ}); histos.add("hEventMultFt0C", "", kTH1F, {{500, 0, 5000}}); histos.add("hEventCentrality", "hEventCentrality", kTH1F, {{101, 0, 101}}); @@ -266,6 +285,26 @@ struct Derivedcascadeanalysis { histos.add("InvMassAfterSelCent1/hNegativeCascadeMCTruth", "hNegativeCascadeMCTruth", HistType::kTH3F, {axisPt, axisMass, axisOccupancy}); histos.add("InvMassAfterSelCent1/hPositiveCascadeMCTruth", "hPositiveCascadeMCTruth", HistType::kTH3F, {axisPt, axisMass, axisOccupancy}); } + if (!qaFlags.doIRCheck) { + histos.addClone("InvMassAfterSelCent1/", "InvMassAfterSelCent2/"); + histos.addClone("InvMassAfterSelCent1/", "InvMassAfterSelCent3/"); + histos.addClone("InvMassAfterSelCent1/", "InvMassAfterSelCent4/"); + histos.addClone("InvMassAfterSelCent1/", "InvMassAfterSelCent5/"); + histos.addClone("InvMassAfterSelCent1/", "InvMassAfterSelCent6/"); + histos.addClone("InvMassAfterSelCent1/", "InvMassAfterSelCent7/"); + histos.addClone("InvMassAfterSelCent1/", "InvMassAfterSelCent8/"); + histos.addClone("InvMassAfterSelCent1/", "InvMassAfterSelCent9/"); + histos.addClone("InvMassAfterSelCent1/", "InvMassAfterSelCent10/"); + } + } + + if (qaFlags.doIRCheck) { + histos.add("InvMassAfterSelCent1/hNegativeCascadeIR", "hNegativeCascadeIR", HistType::kTH3F, {axisPt, axisMass, axisIR}); + histos.add("InvMassAfterSelCent1/hPositiveCascadeIR", "hPositiveCascadeIR", HistType::kTH3F, {axisPt, axisMass, axisIR}); + if (doprocessCascadesMCrec) { + histos.add("InvMassAfterSelCent1/hNegativeCascadeMCTruthIR", "hNegativeCascadeMCTruthIR", HistType::kTH3F, {axisPt, axisMass, axisIR}); + histos.add("InvMassAfterSelCent1/hPositiveCascadeMCTruthIR", "hPositiveCascadeMCTruthIR", HistType::kTH3F, {axisPt, axisMass, axisIR}); + } histos.addClone("InvMassAfterSelCent1/", "InvMassAfterSelCent2/"); histos.addClone("InvMassAfterSelCent1/", "InvMassAfterSelCent3/"); histos.addClone("InvMassAfterSelCent1/", "InvMassAfterSelCent4/"); @@ -277,6 +316,9 @@ struct Derivedcascadeanalysis { histos.addClone("InvMassAfterSelCent1/", "InvMassAfterSelCent10/"); } + histos.add("hInteractionRate", "hInteractionRate", kTH1F, {axisIR}); + histos.add("hCentralityVsInteractionRate", "hCentralityVsInteractionRate", kTH2F, {{101, 0.0f, 101.0f}, axisIR}); + if (qaFlags.doBefSelCheck) histos.addClone("InvMassAfterSel/", "InvMassBefSel/"); @@ -331,6 +373,11 @@ struct Derivedcascadeanalysis { histos.add("PtDepCutStudy/hNegativeCascPA", "hNegativeCascPA", HistType::kTH3F, {axisPt, axisMass, {40, 0, 0.4}}); histos.add("PtDepCutStudy/hPositiveCascPA", "hPositiveCascPA", {HistType::kTH3F, {axisPt, axisMass, {40, 0, 0.4}}}); } + if (qaFlags.doITSTPCmatchingCheck) { + histos.add("histITSTPCmatchPosTrack", "", HistType::kTH3F, {axisPt, {101, 0, 101}, {3, 0, 3}}); + histos.add("histITSTPCmatchNegTrack", "", HistType::kTH3F, {axisPt, {101, 0, 101}, {3, 0, 3}}); + histos.add("histITSTPCmatchBachTrack", "", HistType::kTH3F, {axisPt, {101, 0, 101}, {3, 0, 3}}); + } if (doprocessCascadesMCrec) { histos.addClone("PtDepCutStudy/", "PtDepCutStudyMCTruth/"); @@ -350,6 +397,8 @@ struct Derivedcascadeanalysis { histos.add("hRecMultVsMultMC", "", kTH2F, {axisNch, axisNch}); histos.add("hGenMultMCFT0C", "", kTH1F, {{500, 0, 5000}}); histos.add("hGenMCNParticlesEta10", "", kTH1F, {{500, 0, 5000}}); + histos.add("hCentralityVsIRGen", "", kTH2F, {{101, 0.0f, 101.0f}, axisIR}); + histos.add("hMultMCVsCentralityVsIRGen", "", kTH3F, {axisNch, {101, 0.0f, 101.0f}, axisIR}); histos.add("hCentralityVsNcoll_beforeEvSel", "", kTH2F, {{101, 0.0f, 101.0f}, {50, 0.f, 50.f}}); histos.add("hCentralityVsNcoll_afterEvSel", "", kTH2F, {{101, 0.0f, 101.0f}, {50, 0.f, 50.f}}); @@ -388,6 +437,16 @@ struct Derivedcascadeanalysis { histos.add("h2dGenXiPlusVsMultMCVsCentrality", "h2dGenXiPlusVsMultMCVsCentrality", kTH3D, {axisNch, {101, 0.0f, 101.0f}, axisPt}); histos.add("h2dGenOmegaMinusVsMultMCVsCentrality", "h2dGenOmegaMinusVsMultMCVsCentrality", kTH3D, {axisNch, {101, 0.0f, 101.0f}, axisPt}); histos.add("h2dGenOmegaPlusVsMultMCVsCentrality", "h2dGenOmegaPlusVsMultMCVsCentrality", kTH3D, {axisNch, {101, 0.0f, 101.0f}, axisPt}); + + histos.add("h2dGenXiMinusVsCentIR", "h2dGenXiMinusVsCentIR", kTH3D, {axisPt, {101, 0.0f, 101.0f}, axisIR}); + histos.add("h2dGenXiPlusVsCentIR", "h2dGenXiPlusVsCentIR", kTH3D, {axisPt, {101, 0.0f, 101.0f}, axisIR}); + histos.add("h2dGenOmegaMinusVsCentIR", "h2dGenOmegaMinusVsCentIR", kTH3D, {axisPt, {101, 0.0f, 101.0f}, axisIR}); + histos.add("h2dGenOmegaPlusVsCentIR", "h2dGenOmegaPlusVsCentIR", kTH3D, {axisPt, {101, 0.0f, 101.0f}, axisIR}); + + histos.add("h2dGenXiMinusVsMultMCVsIR", "h2dGenXiMinusVsMultMCVsIR", kTH3D, {axisNch, axisIR, axisPt}); + histos.add("h2dGenXiPlusVsMultMCVsIR", "h2dGenXiPlusVsMultMCVsIR", kTH3D, {axisNch, axisIR, axisPt}); + histos.add("h2dGenOmegaMinusVsMultMCVsIR", "h2dGenOmegaMinusVsMultMCVsIR", kTH3D, {axisNch, axisIR, axisPt}); + histos.add("h2dGenOmegaPlusVsMultMCVsIR", "h2dGenOmegaPlusVsMultMCVsIR", kTH3D, {axisNch, axisIR, axisPt}); } } template @@ -466,7 +525,7 @@ struct Derivedcascadeanalysis { if (fillHists) histos.fill(HIST("hEventSelection"), 3.5 /* collisions after sel pvz sel*/); - if (centrality > centMax || centrality < centMin) { + if (centrality > eventSelectionFlags.centMax || centrality < eventSelectionFlags.centMin) { return false; } if (fillHists) @@ -536,12 +595,12 @@ struct Derivedcascadeanalysis { histos.fill(HIST("hEventSelection"), 14.5 /* No other collision within +/- 2 μs, or mult above some threshold in -4..-2 μs */); int occupancy = coll.trackOccupancyInTimeRange(); - if (minOccupancy > 0 && occupancy < minOccupancy) { + if (eventSelectionFlags.minOccupancy > 0 && occupancy < eventSelectionFlags.minOccupancy) { return false; } if (fillHists) histos.fill(HIST("hEventSelection"), 15.5 /* Below min occupancy */); - if (maxOccupancy > 0 && occupancy > maxOccupancy) { + if (eventSelectionFlags.maxOccupancy > 0 && occupancy > eventSelectionFlags.maxOccupancy) { return false; } if (fillHists) @@ -566,10 +625,10 @@ struct Derivedcascadeanalysis { histos.fill(HIST("hEventSelection"), 19.5 /*rejects collisions if ITS was in rebooting stage*/); float occupancyFT0 = coll.ft0cOccupancyInTimeRange(); - if (minOccupancyFT0 > 0 && occupancyFT0 < minOccupancyFT0) { + if (eventSelectionFlags.minOccupancyFT0 > 0 && occupancyFT0 < eventSelectionFlags.minOccupancyFT0) { return false; } - if (maxOccupancyFT0 > 0 && occupancyFT0 > maxOccupancyFT0) { + if (eventSelectionFlags.maxOccupancyFT0 > 0 && occupancyFT0 > eventSelectionFlags.maxOccupancyFT0) { return false; } if (fillHists) @@ -581,7 +640,11 @@ struct Derivedcascadeanalysis { if (fillHists) histos.fill(HIST("hEventSelection"), 21.5 /* INEL > 0 selection */); + double interactionRate = rateFetcher.fetch(ccdb.service, coll.timestamp(), coll.runNumber(), irSource) * 1.e-3; + if (fillHists) { + histos.fill(HIST("hInteractionRate"), interactionRate); + histos.fill(HIST("hCentralityVsInteractionRate"), centrality, interactionRate); histos.fill(HIST("hOccupancyVsOccupFt0VsCentrality"), occupancy, occupancyFT0, centrality); histos.fill(HIST("hEventCentrality"), centrality); histos.fill(HIST("hEventVertexZ"), coll.posZ()); @@ -749,7 +812,7 @@ struct Derivedcascadeanalysis { return true; } - void processCascades(soa::Join::iterator const& coll, soa::Join const& Cascades, soa::Join const&) + void processCascades(soa::Join::iterator const& coll, soa::Join const& Cascades, soa::Join const&) { if (!isEventAccepted(coll, true)) @@ -927,6 +990,19 @@ struct Derivedcascadeanalysis { } } + if (candidateSelectionFlags.doAtLeastOneTrackAB) { + if (bachExtra.hasITSTracker() && negExtra.hasITSTracker() && posExtra.hasITSTracker()) + continue; + } + if (candidateSelectionFlags.doBachelorITSTracking) { + if (!bachExtra.hasITSTracker()) + continue; + } + if (candidateSelectionFlags.doAllTracksMinITSClusters) { + if (bachExtra.itsNCls() < candidateSelectionValues.minITSclusters || posExtra.itsNCls() < candidateSelectionValues.minITSclusters || negExtra.itsNCls() < candidateSelectionValues.minITSclusters) + continue; + } + if (isXi) { if (candidateSelectionFlags.doNTPCSigmaCut) { @@ -975,6 +1051,28 @@ struct Derivedcascadeanalysis { ++counter; } } + if (qaFlags.doITSTPCmatchingCheck) { + auto ptPosDaugh = std::sqrt(std::pow(casc.pxpos(), 2) + std::pow(casc.pypos(), 2)); + auto ptNegDaugh = std::sqrt(std::pow(casc.pxneg(), 2) + std::pow(casc.pyneg(), 2)); + auto ptBachelor = std::sqrt(std::pow(casc.pxbach(), 2) + std::pow(casc.pybach(), 2)); + + histos.fill(HIST("histITSTPCmatchPosTrack"), ptPosDaugh, centrality, 0.5); + histos.fill(HIST("histITSTPCmatchNegTrack"), ptNegDaugh, centrality, 0.5); + histos.fill(HIST("histITSTPCmatchBachTrack"), ptBachelor, centrality, 0.5); + if (posExtra.hasITS()) + histos.fill(HIST("histITSTPCmatchPosTrack"), ptPosDaugh, centrality, 1.5); + if (negExtra.hasITS()) + histos.fill(HIST("histITSTPCmatchNegTrack"), ptNegDaugh, centrality, 1.5); + if (bachExtra.hasITS()) + histos.fill(HIST("histITSTPCmatchBachTrack"), ptBachelor, centrality, 1.5); + if (posExtra.hasITS() && posExtra.hasTPC()) + histos.fill(HIST("histITSTPCmatchPosTrack"), ptPosDaugh, centrality, 2.5); + if (negExtra.hasITS() && negExtra.hasTPC()) + histos.fill(HIST("histITSTPCmatchNegTrack"), ptNegDaugh, centrality, 2.5); + if (bachExtra.hasITS() && bachExtra.hasTPC()) + histos.fill(HIST("histITSTPCmatchBachTrack"), ptBachelor, centrality, 2.5); + } + if (isPositive) histos.fill(HIST("InvMassAfterSel/h") + HIST(kCharge[0]) + HIST("Cascade"), casc.pt(), invmass, centrality); if (isNegative) @@ -997,6 +1095,19 @@ struct Derivedcascadeanalysis { }); } + if (qaFlags.doIRCheck) { + double interactionRate = rateFetcher.fetch(ccdb.service, coll.timestamp(), coll.runNumber(), irSource) * 1.e-3; + static_for<0, 9>([&](auto i) { + constexpr int In = i.value; + if (centrality < kCentralityIntervals[In + 1] && centrality > kCentralityIntervals[In]) { + if (isPositive) + histos.fill(HIST("InvMassAfterSelCent") + HIST(Index[In]) + HIST("/h") + HIST(kCharge[0]) + HIST("CascadeIR"), casc.pt(), invmass, interactionRate); + if (isNegative) + histos.fill(HIST("InvMassAfterSelCent") + HIST(Index[In]) + HIST("/h") + HIST(kCharge[1]) + HIST("CascadeIR"), casc.pt(), invmass, interactionRate); + } + }); + } + float dcaMesonToPV = -10; float dcaBaryonToPV = -10; if (isPositive) { @@ -1044,8 +1155,8 @@ struct Derivedcascadeanalysis { } } } - void processCascadesMCrec(soa::Join::iterator const& coll, CascMCCandidates const& Cascades, DauTracks const&, soa::Join const&) //, , , soa::Join const& /*mccollisions*/, soa::Join const&) - // soa::Join const& Cascades, soa::Join const&) + void processCascadesMCrec(soa::Join::iterator const& coll, CascMCCandidates const& Cascades, DauTracks const&, soa::Join const&) //, , , soa::Join const& /*mccollisions*/, soa::Join const&) + // soa::Join const& Cascades, soa::Join const&) { if (!isEventAccepted(coll, true)) return; @@ -1231,6 +1342,19 @@ struct Derivedcascadeanalysis { } } + if (candidateSelectionFlags.doAtLeastOneTrackAB) { + if (bachExtra.hasITSTracker() && negExtra.hasITSTracker() && posExtra.hasITSTracker()) + continue; + } + if (candidateSelectionFlags.doBachelorITSTracking) { + if (!bachExtra.hasITSTracker()) + continue; + } + if (candidateSelectionFlags.doAllTracksMinITSClusters) { + if (bachExtra.itsNCls() < candidateSelectionValues.minITSclusters || posExtra.itsNCls() < candidateSelectionValues.minITSclusters || negExtra.itsNCls() < candidateSelectionValues.minITSclusters) + continue; + } + if (isXi) { if (candidateSelectionFlags.doNTPCSigmaCut) { if (std::abs(bachExtra.tpcNSigmaPi()) > candidateSelectionValues.nsigmatpcPi) @@ -1273,6 +1397,28 @@ struct Derivedcascadeanalysis { ++counter; } + if (qaFlags.doITSTPCmatchingCheck) { + auto ptPosDaugh = std::sqrt(std::pow(casc.pxpos(), 2) + std::pow(casc.pypos(), 2)); + auto ptNegDaugh = std::sqrt(std::pow(casc.pxneg(), 2) + std::pow(casc.pyneg(), 2)); + auto ptBachelor = std::sqrt(std::pow(casc.pxbach(), 2) + std::pow(casc.pybach(), 2)); + + histos.fill(HIST("histITSTPCmatchPosTrack"), ptPosDaugh, centrality, 0.5); + histos.fill(HIST("histITSTPCmatchNegTrack"), ptNegDaugh, centrality, 0.5); + histos.fill(HIST("histITSTPCmatchBachTrack"), ptBachelor, centrality, 0.5); + if (posExtra.hasITS()) + histos.fill(HIST("histITSTPCmatchPosTrack"), ptPosDaugh, centrality, 1.5); + if (negExtra.hasITS()) + histos.fill(HIST("histITSTPCmatchNegTrack"), ptNegDaugh, centrality, 1.5); + if (bachExtra.hasITS()) + histos.fill(HIST("histITSTPCmatchBachTrack"), ptBachelor, centrality, 1.5); + if (posExtra.hasITS() && posExtra.hasTPC()) + histos.fill(HIST("histITSTPCmatchPosTrack"), ptPosDaugh, centrality, 2.5); + if (negExtra.hasITS() && negExtra.hasTPC()) + histos.fill(HIST("histITSTPCmatchNegTrack"), ptNegDaugh, centrality, 2.5); + if (bachExtra.hasITS() && bachExtra.hasTPC()) + histos.fill(HIST("histITSTPCmatchBachTrack"), ptBachelor, centrality, 2.5); + } + if (isPositive) { histos.fill(HIST("InvMassAfterSel/h") + HIST(kCharge[0]) + HIST("Cascade"), casc.pt(), mass, centrality); if (isTrueMCCascadeDecay) { @@ -1315,6 +1461,26 @@ struct Derivedcascadeanalysis { } }); } + + if (qaFlags.doIRCheck) { + double interactionRate = rateFetcher.fetch(ccdb.service, coll.timestamp(), coll.runNumber(), irSource) * 1.e-3; + static_for<0, 9>([&](auto i) { + constexpr int In = i.value; + if (centrality < kCentralityIntervals[In + 1] && centrality > kCentralityIntervals[In]) { + if (isPositive) { + histos.fill(HIST("InvMassAfterSelCent") + HIST(Index[In]) + HIST("/h") + HIST(kCharge[0]) + HIST("CascadeIR"), casc.pt(), mass, interactionRate); + if (isTrueMCCascadeDecay) + histos.fill(HIST("InvMassAfterSelCent") + HIST(Index[In]) + HIST("/h") + HIST(kCharge[0]) + HIST("CascadeMCTruthIR"), casc.pt(), mass, interactionRate); + } + if (isNegative) { + histos.fill(HIST("InvMassAfterSelCent") + HIST(Index[In]) + HIST("/h") + HIST(kCharge[1]) + HIST("CascadeIR"), casc.pt(), mass, interactionRate); + if (isTrueMCCascadeDecay) + histos.fill(HIST("InvMassAfterSelCent") + HIST(Index[In]) + HIST("/h") + HIST(kCharge[1]) + HIST("CascadeMCTruthIR"), casc.pt(), mass, interactionRate); + } + } + }); + } + float dcaMesonToPV = -10; float dcaBaryonToPV = -10; if (isPositive) { @@ -1368,7 +1534,7 @@ struct Derivedcascadeanalysis { } } } - void processCascadesMCforEff(soa::Join const& mcCollisions, soa::Join const& Cascades, soa::Join const& collisions) + void processCascadesMCforEff(soa::Join const& mcCollisions, soa::Join const& Cascades, soa::Join const& collisions) { std::vector listBestCollisionIdx = fillGenEventHist(mcCollisions, collisions); @@ -1402,9 +1568,11 @@ struct Derivedcascadeanalysis { float centrality = 100.5f; float occupancy = 49000; float nChEta05 = -1; + double intRate = -1; if (listBestCollisionIdx[mcCollision.globalIndex()] > -1) { auto collision = collisions.iteratorAt(listBestCollisionIdx[mcCollision.globalIndex()]); centrality = collision.centFT0C(); + intRate = rateFetcher.fetch(ccdb.service, collision.timestamp(), collision.runNumber(), irSource) * 1.e-3; if (useCentralityFT0M) centrality = collision.centFT0M(); if (useCentralityFT0A) @@ -1426,15 +1594,19 @@ struct Derivedcascadeanalysis { histos.fill(HIST("h2dGenXiMinusEtaNegDaughter"), RecoDecay::eta(std::array{cascMC.pxNegMC(), cascMC.pyNegMC(), cascMC.pzNegMC()})); histos.fill(HIST("h2dGenXiMinusEtaBach"), RecoDecay::eta(std::array{cascMC.pxBachMC(), cascMC.pyBachMC(), cascMC.pzBachMC()})); histos.fill(HIST("h2dGenXiMinusVsMultMCVsCentrality"), mcCollision.multMCNParticlesEta05(), centrality, ptmc); + histos.fill(HIST("h2dGenXiMinusVsMultMCVsIR"), mcCollision.multMCNParticlesEta05(), intRate, ptmc); histos.fill(HIST("h2dGenXiMinusVsCentOccupancy"), ptmc, centrality, occupancy); + histos.fill(HIST("h2dGenXiMinusVsCentIR"), ptmc, centrality, intRate); histos.fill(HIST("h2dGenXiMinusVsNchVsOccupancy"), ptmc, nChEta05, occupancy); } if (cascMC.pdgCode() == -3312) { histos.fill(HIST("h2dGenXiPlus"), centrality, ptmc); histos.fill(HIST("h2dGenXiPlusVsNch"), nChEta05, ptmc); histos.fill(HIST("h2dGenXiPlusVsMultMCVsCentrality"), mcCollision.multMCNParticlesEta05(), centrality, ptmc); + histos.fill(HIST("h2dGenXiPlusVsMultMCVsIR"), mcCollision.multMCNParticlesEta05(), intRate, ptmc); histos.fill(HIST("h2dGenXiPlusVsCentOccupancy"), ptmc, centrality, occupancy); histos.fill(HIST("h2dGenXiPlusVsNchVsOccupancy"), ptmc, nChEta05, occupancy); + histos.fill(HIST("h2dGenXiPlusVsCentIR"), ptmc, centrality, intRate); } if (cascMC.pdgCode() == 3334) { histos.fill(HIST("h2dGenOmegaMinus"), centrality, ptmc); @@ -1444,22 +1616,26 @@ struct Derivedcascadeanalysis { histos.fill(HIST("h2dGenOmegaMinusEtaNegDaughter"), RecoDecay::eta(std::array{cascMC.pxNegMC(), cascMC.pyNegMC(), cascMC.pzNegMC()})); histos.fill(HIST("h2dGenOmegaMinusEtaBach"), RecoDecay::eta(std::array{cascMC.pxBachMC(), cascMC.pyBachMC(), cascMC.pzBachMC()})); histos.fill(HIST("h2dGenOmegaMinusVsMultMCVsCentrality"), mcCollision.multMCNParticlesEta05(), centrality, ptmc); + histos.fill(HIST("h2dGenOmegaMinusVsMultMCVsIR"), mcCollision.multMCNParticlesEta05(), intRate, ptmc); histos.fill(HIST("h2dGenOmegaMinusVsCentOccupancy"), ptmc, centrality, occupancy); histos.fill(HIST("h2dGenOmegaMinusVsNchVsOccupancy"), ptmc, nChEta05, occupancy); + histos.fill(HIST("h2dGenOmegaMinusVsCentIR"), ptmc, centrality, intRate); } if (cascMC.pdgCode() == -3334) { histos.fill(HIST("h2dGenOmegaPlus"), centrality, ptmc); histos.fill(HIST("h2dGenOmegaPlusVsNch"), nChEta05, ptmc); histos.fill(HIST("h2dGenOmegaPlusVsMultMCVsCentrality"), mcCollision.multMCNParticlesEta05(), centrality, ptmc); + histos.fill(HIST("h2dGenOmegaPlusVsMultMCVsIR"), mcCollision.multMCNParticlesEta05(), intRate, ptmc); histos.fill(HIST("h2dGenOmegaPlusVsCentOccupancy"), ptmc, centrality, occupancy); histos.fill(HIST("h2dGenOmegaPlusVsNchVsOccupancy"), ptmc, nChEta05, occupancy); + histos.fill(HIST("h2dGenOmegaPlusVsCentIR"), ptmc, centrality, intRate); } } } // ______________________________________________________ // Simulated processing // Fill event information (for event loss estimation) and return the index to the recoed collision associated to a given MC collision. - std::vector fillGenEventHist(soa::Join const& mcCollisions, soa::Join const& collisions) + std::vector fillGenEventHist(soa::Join const& mcCollisions, soa::Join const& collisions) { std::vector listBestCollisionIdx(mcCollisions.size()); for (auto const& mcCollision : mcCollisions) { @@ -1484,6 +1660,7 @@ struct Derivedcascadeanalysis { float centrality = 100.5f; int nCollisions = 0; float nChEta05 = -1; + double intRate = -1; for (auto const& collision : groupedCollisions) { if (!isEventAccepted(collision, false)) { continue; @@ -1493,6 +1670,7 @@ struct Derivedcascadeanalysis { biggestNContribs = collision.multPVTotalContributors(); bestCollisionIndex = collision.globalIndex(); centrality = collision.centFT0C(); + intRate = rateFetcher.fetch(ccdb.service, collision.timestamp(), collision.runNumber(), irSource) * 1.e-3; if (useCentralityFT0M) centrality = collision.centFT0M(); if (useCentralityFT0A) @@ -1509,6 +1687,9 @@ struct Derivedcascadeanalysis { histos.fill(HIST("hCentralityVsNcoll_beforeEvSel"), centrality, groupedCollisions.size() + 0.5); histos.fill(HIST("hCentralityVsNcoll_afterEvSel"), centrality, nCollisions + 0.5); + histos.fill(HIST("hCentralityVsIRGen"), centrality, intRate); + histos.fill(HIST("hMultMCVsCentralityVsIRGen"), mcCollision.multMCNParticlesEta05(), centrality, intRate); + histos.fill(HIST("hCentralityVsMultMC"), centrality, mcCollision.multMCNParticlesEta05()); histos.fill(HIST("hRecMultVsMultMC"), nChEta05, mcCollision.multMCNParticlesEta05()); From 1df9b38f4501812b692e2b78806bd2c11585cc14 Mon Sep 17 00:00:00 2001 From: rolavick Date: Wed, 19 Feb 2025 15:07:22 +0100 Subject: [PATCH 0317/1650] [PWGUD] Study of nContribs per ITSROFs vs nCollisions per ITSROF (#10065) Co-authored-by: ALICE Action Bot --- PWGUD/Tasks/upcEventITSROFcounter.cxx | 59 ++++++++++++++++++++++----- 1 file changed, 49 insertions(+), 10 deletions(-) diff --git a/PWGUD/Tasks/upcEventITSROFcounter.cxx b/PWGUD/Tasks/upcEventITSROFcounter.cxx index 1da6fbfd26c..51241be5d69 100644 --- a/PWGUD/Tasks/upcEventITSROFcounter.cxx +++ b/PWGUD/Tasks/upcEventITSROFcounter.cxx @@ -9,12 +9,23 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +/// \file upcEventITSROFcounter.cxx +/// \brief Personal task to analyze tau events from UPC collisions +/// +/// \author Roman Lavicka , Austrian Academy of Sciences & SMI +/// \since 09.08.2024 + +#include +#include + #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "ITSMFTBase/DPLAlpideParam.h" #include "CCDB/BasicCCDBManager.h" +#include "ReconstructionDataFormats/Vertex.h" +#include "Common/CCDB/EventSelectionParams.h" #include "Common/DataModel/EventSelection.h" #include "PWGUD/DataModel/UDTables.h" @@ -25,6 +36,7 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; +using namespace o2::dataformats; using BCsWithRun3Matchings = soa::Join; using CCs = soa::Join; @@ -39,10 +51,10 @@ struct UpcEventITSROFcounter { Configurable nTracksForUPCevent{"nTracksForUPCevent", 16, {"Maximum of tracks defining a UPC collision"}}; Configurable useTrueGap{"useTrueGap", true, {"Calculate gapSide for a given FV0/FT0/ZDC thresholds"}}; - Configurable cutMyGapSideFV0{"FV0", -1, "FV0A threshold for SG selector"}; - Configurable cutMyGapSideFT0A{"FT0A", 150., "FT0A threshold for SG selector"}; - Configurable cutMyGapSideFT0C{"FT0C", 50., "FT0C threshold for SG selector"}; - Configurable cutMyGapSideZDC{"ZDC", 10., "ZDC threshold for SG selector"}; + Configurable cutMyGapSideFV0{"cutMyGapSideFV0", -1, "FV0A threshold for SG selector"}; + Configurable cutMyGapSideFT0A{"cutMyGapSideFT0A", 150., "FT0A threshold for SG selector"}; + Configurable cutMyGapSideFT0C{"cutMyGapSideFT0C", 50., "FT0C threshold for SG selector"}; + Configurable cutMyGapSideZDC{"cutMyGapSideZDC", 10., "ZDC threshold for SG selector"}; ConfigurableAxis axisRunNumbers{"axisRunNumbers", {1400, 544000.5, 545400.5}, "Range of run numbers"}; void init(InitContext&) @@ -53,6 +65,9 @@ struct UpcEventITSROFcounter { histos.add("Events/hCountCollisionsInROFborderMatching", ";;Number of collision (-)", HistType::kTH1D, {{11, -0.5, 10.5}}); histos.add("Events/hCountUPCcollisionsInROFborderMatching", ";;Number of UPC (mult < 17) collision (-)", HistType::kTH1D, {{11, -0.5, 10.5}}); + histos.add("Events/hPVcontribsVsCollisionsPerITSROFstd", "Collisions reconstructed with standard mode;Number of vertex contributors (-); Number of collisions in one ITSROF (-)", HistType::kTH2D, {{101, -0.5, 100.5}, {11, -0.5, 10.5}}); + histos.add("Events/hPVcontribsVsCollisionsPerITSROFupc", "Collisions reconstructed with upc mode;Number of vertex contributors (-); Number of collisions in one ITSROF (-)", HistType::kTH2D, {{101, -0.5, 100.5}, {11, -0.5, 10.5}}); + histos.add("Runs/hStdModeCollDG", ";Run number;Number of events (-)", HistType::kTH1D, {axisRunNumbers}); histos.add("Runs/hUpcModeCollDG", ";Run number;Number of events (-)", HistType::kTH1D, {axisRunNumbers}); histos.add("Runs/hStdModeCollSG1", ";Run number;Number of events (-)", HistType::kTH1D, {axisRunNumbers}); @@ -78,7 +93,7 @@ struct UpcEventITSROFcounter { int64_t ts = bcs.iteratorAt(0).timestamp(); auto alppar = ccdb->getForTimeStamp>("ITS/Config/AlpideParam", ts); - for (auto bc : bcs) { + for (const auto& bc : bcs) { uint64_t globalBC = bc.globalBC(); uint64_t globalIndex = bc.globalIndex(); if (isFirst) { @@ -98,7 +113,7 @@ struct UpcEventITSROFcounter { previousBCinITSROF = bcInITSROF; previousBCglobalIndex = globalIndex; // next is based on exact matching of bc and collision - for (auto& collision : collisions) { + for (const auto& collision : collisions) { if (collision.has_foundBC()) { if (collision.foundBCId() == bc.globalIndex()) { nAllColls++; @@ -113,16 +128,16 @@ struct UpcEventITSROFcounter { } } } // end loop over collisions - } // end loop over bcs + } // end loop over bcs int arrAllColls[1000] = {0}; int arrUPCcolls[1000] = {0}; // next is based on matching of collision bc within ITSROF range in bcs - for (auto& itsrofBorder : vecITSROFborders) { + for (const auto& itsrofBorder : vecITSROFborders) { int nAllCollsInROF = 0; int nUpcCollsInROF = 0; - for (auto& collision : collisions) { + for (const auto& collision : collisions) { if ((itsrofBorder.first < collision.bcId()) && (collision.bcId() < itsrofBorder.second)) { nAllCollsInROF++; if (collision.numContrib() < nTracksForUPCevent + 1) { @@ -138,6 +153,30 @@ struct UpcEventITSROFcounter { histos.get(HIST("Events/hCountCollisionsInROFborderMatching"))->Fill(ncol, arrAllColls[ncol]); histos.get(HIST("Events/hCountUPCcollisionsInROFborderMatching"))->Fill(ncol, arrUPCcolls[ncol]); } + + // TEST vertex contributors per reconstruction flag (std vs upc) + // matching of collision bc within ITSROF range in bcs + for (const auto& itsrofBorder : vecITSROFborders) { + std::vector vecNumContribsStd; + std::vector vecNumContribsUpc; + for (const auto& collision : collisions) { + if ((itsrofBorder.first < collision.bcId()) && (collision.bcId() < itsrofBorder.second)) { + if (collision.flags() & dataformats::Vertex>::Flags::UPCMode) { + vecNumContribsUpc.push_back(collision.numContrib()); + } else { + vecNumContribsStd.push_back(collision.numContrib()); + } + } + } // end loop over collisions + + for (const auto& numContribs : vecNumContribsStd) { + histos.get(HIST("Events/hPVcontribsVsCollisionsPerITSROFstd"))->Fill(numContribs, vecNumContribsStd.size()); + } + for (const auto& numContribs : vecNumContribsUpc) { + histos.get(HIST("Events/hPVcontribsVsCollisionsPerITSROFupc"))->Fill(numContribs, vecNumContribsUpc.size()); + } + + } // end loop over ITSROFs } void processCounterPerRun(FullSGUDCollision const& coll) @@ -179,5 +218,5 @@ struct UpcEventITSROFcounter { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"upc-event-itsrof-counter"})}; + adaptAnalysisTask(cfgc)}; } From 4eb082c37b2519ca59183ee9489fd63c18d0fa7b Mon Sep 17 00:00:00 2001 From: victorvalenciatorres <118812999+victorvalenciatorres@users.noreply.github.com> Date: Wed, 19 Feb 2025 15:17:59 +0100 Subject: [PATCH 0318/1650] [PWGDQ] [PWGD] Adding V22ME and V24ME (#10072) --- PWGDQ/Core/HistogramsLibrary.cxx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index d30687516f0..83b2e2a97d6 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -1097,6 +1097,8 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr4REFME", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 9, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR4REFbydimuonsME, VarManager::kM1111REFoverMpME); hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2POIME", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 9, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR2POIME, VarManager::kM01POIoverMpME); hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr4POIME", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 9, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR4POIME, VarManager::kM0111POIoverMpME); + hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V22ME", "Mass_Pt_CentFT0C_V22ME", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV22ME, VarManager::kWV22ME); + hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V24ME", "Mass_Pt_CentFT0C_V24ME", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV24ME, VarManager::kWV24ME); } if (subGroupStr.Contains("dimuon-polarization-he")) { int varspTHE[4] = {VarManager::kMass, VarManager::kPt, VarManager::kCosThetaHE, VarManager::kPhiHE}; From b5ebd2cf96b5b228ed6e165f0166f7d4ffcc8cac Mon Sep 17 00:00:00 2001 From: Stefano Cannito <143754257+scannito@users.noreply.github.com> Date: Wed, 19 Feb 2025 17:37:00 +0100 Subject: [PATCH 0319/1650] [PWGLF] Study of DCAxy for primary and secondary pions in phik0shortanalysis.cxx (#10071) --- PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx index 876f8a2636a..7da8677cb6e 100644 --- a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx @@ -13,11 +13,13 @@ /// \brief Analysis task for the Phi and K0S rapidity correlations analysis /// \author Stefano Cannito (stefano.cannito@cern.ch) +#include +#include #include #include #include -#include -#include +#include +#include #include #include @@ -162,7 +164,7 @@ struct Phik0shortanalysis { // Configurable for CCDB Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository to use"}; - Configurable ccdbPurityPath{"ccdbPurityPath", "", "Correction path to file"}; + Configurable ccdbPurityPath{"ccdbPurityPath", "Users/s/scannito/PhiPuritiesData", "Correction path to file"}; // Constants double massKa = o2::constants::physics::MassKPlus; @@ -378,6 +380,11 @@ struct Phik0shortanalysis { mcPionHist.add("h2TracksPiDCAxyPostCutMCReco", "Dcaxy distribution vs pt after DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); mcPionHist.add("h2TracksPiDCAzPostCutMCReco", "Dcaz distribution vs pt after DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{z} (cm)"}}); + // DCA plots for pions in MCReco distinguishing Primaries, Secondaries from Weak Decay and Secondaries from Material + mcPionHist.add("h3RecMCDCAxyPrimPi", "Dcaxy distribution vs pt for Primary Pions", kTH2F, {binnedptPiAxis, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); + mcPionHist.add("h3RecMCDCAxySecWeakDecayPi", "Dcaz distribution vs pt for Secondary Pions from Weak Decay", kTH2F, {binnedptPiAxis, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); + mcPionHist.add("h3RecMCDCAxySecMaterialPi", "Dcaxy distribution vs pt for Secondary Pions from Material", kTH2F, {binnedptPiAxis, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); + // RecMC Pion coupled to Phi with TPC mcPhiPionHist.add("h3RecMCPhiPiTPCInc", "RecoMC Pion coupled to Phi with TPC Inclusive", kTH3F, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}}); mcPhiPionHist.add("h3RecMCPhiPiTPCFCut", "RecoMC Pion coupled to Phi with TPC Deltay < FirstCut", kTH3F, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}}); @@ -1401,9 +1408,12 @@ struct Phik0shortanalysis { // Primary pion selection if (mcTrack.isPhysicalPrimary()) { + mcPionHist.fill(HIST("h3RecMCDCAxyPrimPi"), track.pt(), track.dcaXY()); } else { if (mcTrack.getProcess() == 4) { // Selection of secondary pions from weak decay - } else { // Selection of secondary pions from material interactions + mcPionHist.fill(HIST("h3RecMCDCAxySecWeakDecayPi"), track.pt(), track.dcaXY()); + } else { // Selection of secondary pions from material interactions + mcPionHist.fill(HIST("h3RecMCDCAxySecMaterialPi"), track.pt(), track.dcaXY()); } continue; } From 103f50ea89627c7b9da2186e1320faa6cdcc5b3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Wed, 19 Feb 2025 19:23:10 +0100 Subject: [PATCH 0320/1650] [PWGLF] Update v0qaanalysis.cxx fix as< (#10073) --- PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx b/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx index 93150345966..7dcdb2758c9 100644 --- a/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx +++ b/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx @@ -315,7 +315,7 @@ struct LfV0qaanalysis { continue; } - if (NotITSAfterburner && (v0.negTrack_as().isITSAfterburner() || v0.posTrack_as().isITSAfterburner())) { + if (NotITSAfterburner && (v0.negTrack_as().isITSAfterburner() || v0.posTrack_as().isITSAfterburner())) { continue; } From 7e8f7682146c3ee76b6009f2ebaca5bbd2537053 Mon Sep 17 00:00:00 2001 From: rolavick Date: Wed, 19 Feb 2025 20:01:54 +0100 Subject: [PATCH 0321/1650] [PWGUD] Personal task modification (#10083) Co-authored-by: ALICE Action Bot --- PWGUD/Tasks/upcTauCentralBarrelRL.cxx | 71 ++++++++++++++++++--------- 1 file changed, 47 insertions(+), 24 deletions(-) diff --git a/PWGUD/Tasks/upcTauCentralBarrelRL.cxx b/PWGUD/Tasks/upcTauCentralBarrelRL.cxx index bbcfbb4e63c..9551270f3fa 100644 --- a/PWGUD/Tasks/upcTauCentralBarrelRL.cxx +++ b/PWGUD/Tasks/upcTauCentralBarrelRL.cxx @@ -78,6 +78,10 @@ struct UpcTauRl { Configurable cutTrueGapSideFT0C{"cutTrueGapSideFT0C", 50., "FT0C threshold for SG selector"}; Configurable cutTrueGapSideZDC{"cutTrueGapSideZDC", 0., "ZDC threshold for SG selector. 0 is <1n, 4.2 is <2n, 6.7 is <3n, 9.5 is <4n, 12.5 is <5n"}; Configurable cutFITtime{"cutFITtime", 40., "Maximum FIT time allowed. Default is 40ns"}; + Configurable cutEvOccupancy{"cutEvOccupancy", 100000., "Maximum allowed occupancy"}; + Configurable cutEvTrs{"cutEvTrs", true, {"Event selection bit kNoCollInTimeRangeStandard"}}; + Configurable cutEvTrofs{"cutEvTrofs", true, {"Event selection bit kNoCollInRofStandard"}}; + Configurable cutEvHmpr{"cutEvHmpr", true, {"Event selection bit kNoHighMultCollInPrevRof"}}; Configurable applyAcceptanceSelection{"applyAcceptanceSelection", false, {"Select events in ALICE CB acceptance set with cutTrackEta"}}; Configurable cutTrackEta{"cutTrackEta", 0.9, "Cut on central barrel track eta in absolute values."}; } cutSample; @@ -108,8 +112,9 @@ struct UpcTauRl { Configurable useThresholdsPID{"useThresholdsPID", false, {"Switch off smaller-sigma-wins pidZ."}}; Configurable applyTauEventSelection{"applyTauEventSelection", true, {"Select tau event."}}; Configurable cutOppositeCharge{"cutOppositeCharge", true, {"Tracks have opposite charge."}}; + Configurable cutSameCharge{"cutSameCharge", false, {"Tracks have same charge."}}; Configurable cutMaxAcoplanarity{"cutMaxAcoplanarity", 4 * o2::constants::math::PI / 5, {"Opening angle of the tracks. What is more goes away."}}; - Configurable cutMinAcoplanarity{"cutMinAcoplanarity", 2 * o2::constants::math::PI / 5, {"Opening angle of the tracks. What is less goes away."}}; + Configurable cutMinAcoplanarity{"cutMinAcoplanarity", 0 * o2::constants::math::PI / 5, {"Opening angle of the tracks. What is less goes away."}}; Configurable cutElectronHasTOF{"cutElectronHasTOF", true, {"Electron is required to hit TOF."}}; Configurable cutGoodElectron{"cutGoodElectron", true, {"Select good electron."}}; Configurable cutOutRho{"cutOutRho", false, {"Cut out rho mass under two tracks are pions hypothesis"}}; @@ -181,11 +186,11 @@ struct UpcTauRl { } confAxis; using FullUDTracks = soa::Join; - using FullUDCollision = soa::Join::iterator; - using FullSGUDCollision = soa::Join::iterator; + using FullUDCollision = soa::Join::iterator; + using FullSGUDCollision = soa::Join::iterator; using FullMCUDTracks = soa::Join; - using FullMCUDCollision = soa::Join::iterator; - using FullMCSGUDCollision = soa::Join::iterator; + using FullMCUDCollision = soa::Join::iterator; + using FullMCSGUDCollision = soa::Join::iterator; // init void init(InitContext&) @@ -938,6 +943,29 @@ struct UpcTauRl { return true; } + template + bool isGoodROFtime(C const& coll) + { + + // Occupancy + if (coll.occupancyInTime() > cutSample.cutEvOccupancy) + return false; + + // kNoCollInTimeRangeStandard + if (cutSample.cutEvTrs && !coll.trs()) + return false; + + // kNoCollInRofStandard + if (cutSample.cutEvTrofs && !coll.trofs()) + return false; + + // kNoHighMultCollInPrevRof + if (cutSample.cutEvHmpr && !coll.hmpr()) + return false; + + return true; + } + template bool isElectronCandidate(T const& electronCandidate) // Loose criterium to find electron-like particle @@ -1030,6 +1058,8 @@ struct UpcTauRl { int enumTrk1 = (cutTauEvent.useThresholdsPID ? (isElectronCandidate(trkDaug1) ? P_ELECTRON : P_PION) : enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC))); if (cutTauEvent.cutOppositeCharge && (trkDaug1.sign() * trkDaug2.sign() > 0)) return false; + if (cutTauEvent.cutSameCharge && (trkDaug1.sign() * trkDaug2.sign() < 0)) + return false; if (calculateAcoplanarity(daug[0].Phi(), daug[1].Phi()) > cutTauEvent.cutMaxAcoplanarity) return false; if (calculateAcoplanarity(daug[0].Phi(), daug[1].Phi()) < cutTauEvent.cutMinAcoplanarity) @@ -2487,6 +2517,9 @@ struct UpcTauRl { FullUDTracks const& reconstructedBarrelTracks) { + if (!isGoodROFtime(reconstructedCollision)) + return; + if (!isGoodFITtime(reconstructedCollision, cutSample.cutFITtime)) return; @@ -2510,6 +2543,9 @@ struct UpcTauRl { if (cutSample.useTrueGap) gapSide = trueGapSide; + if (!isGoodROFtime(reconstructedCollision)) + return; + if (gapSide != cutSample.whichGapSide) return; @@ -2531,6 +2567,9 @@ struct UpcTauRl { { isMC = true; + if (!isGoodROFtime(reconstructedCollision)) + return; + if (!isGoodFITtime(reconstructedCollision, cutSample.cutFITtime)) return; @@ -2567,6 +2606,9 @@ struct UpcTauRl { if (gapSide != cutSample.whichGapSide) return; + if (!isGoodROFtime(reconstructedCollision)) + return; + if (!isGoodFITtime(reconstructedCollision, cutSample.cutFITtime)) return; @@ -2612,30 +2654,11 @@ struct UpcTauRl { } // end processMCgenDG - void processTestMC(FullMCUDCollision const& /*reconstructedCollision*/, - FullMCUDTracks const& /*reconstructedBarrelTracks*/, - aod::UDMcCollisions const&, - aod::UDMcParticles const&) - { - // if (reconstructedCollision.has_udMcCollision()) { - // const auto& generatedCollision = reconstructedCollision.udMcCollision(); - // printDebugMessage(Form("%lli udMcCollision found", generatedCollision.size())); // FIXME: Type of size() is not invariant. - // } - - // const auto& track = reconstructedBarrelTracks.iteratorAt(0); - // if (track.size() && track.has_udMcParticle()) { - // const auto& particle = track.udMcParticle(); - // printDebugMessage(Form("%lli udMcParticle found", particle.size())); // FIXME: Type of size() is not invariant. - // } - - } // end processTestMC - PROCESS_SWITCH(UpcTauRl, processDataDG, "Iterate UD tables with measured data created by DG-Candidate-Producer.", false); PROCESS_SWITCH(UpcTauRl, processDataSG, "Iterate UD tables with measured data created by SG-Candidate-Producer.", false); PROCESS_SWITCH(UpcTauRl, processMCrecDG, "Iterate Monte Carlo UD tables with reconstructed data created by DG-Candidate-Producer. Similar to processDataDG but uses association to truth level.", false); PROCESS_SWITCH(UpcTauRl, processMCrecSG, "Iterate Monte Carlo UD tables with reconstructed data created by SG-Candidate-Producer. Similar to processDataSG but uses association to truth level and trueGap is not available.", false); PROCESS_SWITCH(UpcTauRl, processMCgen, "Iterate Monte Carlo UD tables with truth data.", false); - PROCESS_SWITCH(UpcTauRl, processTestMC, "Simple test of indices in MC sample.", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 2f50c2190c74f727faf0cc878f08287dadf026bb Mon Sep 17 00:00:00 2001 From: Paola Vargas Torres <88360333+PaolaVT@users.noreply.github.com> Date: Wed, 19 Feb 2025 13:20:26 -0600 Subject: [PATCH 0322/1650] [PWGLF] A vector was added to allow for the calibration factors to be modified (#10058) --- PWGMM/UE/Tasks/dedxAnalysis.cxx | 36 ++++++++++++++++----------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/PWGMM/UE/Tasks/dedxAnalysis.cxx b/PWGMM/UE/Tasks/dedxAnalysis.cxx index c1ec8ba696c..8194ce386bc 100644 --- a/PWGMM/UE/Tasks/dedxAnalysis.cxx +++ b/PWGMM/UE/Tasks/dedxAnalysis.cxx @@ -87,7 +87,7 @@ struct DedxAnalysis { static constexpr std::string_view kDedxvsMomentumPos[4] = {"dEdx_vs_Momentum_all_Pos", "dEdx_vs_Momentum_Pi_v0_Pos", "dEdx_vs_Momentum_Pr_v0_Pos", "dEdx_vs_Momentum_El_v0_Pos"}; static constexpr std::string_view kDedxvsMomentumNeg[4] = {"dEdx_vs_Momentum_all_Neg", "dEdx_vs_Momentum_Pi_v0_Neg", "dEdx_vs_Momentum_Pr_v0_Neg", "dEdx_vs_Momentum_El_v0_Neg"}; static constexpr double EtaCut[9] = {-0.8, -0.6, -0.4, -0.2, 0.0, 0.2, 0.4, 0.6, 0.8}; - static constexpr double Correction[8] = {54.5281, 54.6548, 54.6513, 54.6781, 54.6167, 54.7384, 55.0047, 54.9592}; + Configurable> calibrationFactor{"calibrationFactor", {50.8263, 51.0122, 50.7456, 50.0372, 49.699, 50.2222, 50.7263, 50.8073}, "calibration factors"}; ConfigurableAxis binP{"binP", {VARIABLE_WIDTH, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 18.0, 20.0}, ""}; void init(InitContext const&) @@ -96,27 +96,27 @@ struct DedxAnalysis { // MIP for pions registryDeDx.add( "hdEdxMIP_vs_eta", "dE/dx", HistType::kTH2F, - {{8, -0.8, 0.8, "#eta"}, {100, 0.0, 600.0, "dE/dx MIP (a. u.)"}}); + {{8, -0.8, 0.8, "#eta"}, {100, 0.0, 100.0, "dE/dx MIP (a. u.)"}}); registryDeDx.add( "hdEdxMIP_vs_phi", "dE/dx", HistType::kTH2F, - {{100, 0.0, 6.4, "#phi"}, {100, 0.0, 600.0, "dE/dx MIP (a. u.)"}}); + {{100, 0.0, 6.4, "#phi"}, {100, 0.0, 100.0, "dE/dx MIP (a. u.)"}}); } else { AxisSpec pAxis = {binP, "#it{p}/Z (GeV/c)"}; registryDeDx.add( "hdEdxMIP_vs_eta_calibrated", "dE/dx", HistType::kTH2F, - {{8, -0.8, 0.8, "#eta"}, {10, 30.0, 70.0, "dE/dx MIP (a. u.)"}}); + {{8, -0.8, 0.8, "#eta"}, {100, 0.0, 100.0, "dE/dx MIP (a. u.)"}}); registryDeDx.add( "hdEdxMIP_vs_phi", "dE/dx", HistType::kTH2F, - {{100, 0.0, 6.4, "#phi"}, {10, 30.0, 70.0, "dE/dx MIP (a. u.)"}}); + {{100, 0.0, 6.4, "#phi"}, {100, 0.0, 100.0, "dE/dx MIP (a. u.)"}}); // De/Dx for ch and v0 particles for (int i = 0; i < 4; ++i) { registryDeDx.add(kDedxvsMomentumPos[i].data(), "dE/dx", HistType::kTH3F, - {{pAxis}, {100, 0.0, 600.0, "dE/dx (a. u.)"}, {8, -0.8, 0.8, "#eta"}}); + {{pAxis}, {100, 0.0, 100.0, "dE/dx (a. u.)"}, {8, -0.8, 0.8, "#eta"}}); registryDeDx.add(kDedxvsMomentumNeg[i].data(), "dE/dx", HistType::kTH3F, - {{pAxis}, {100, 0.0, 600.0, "dE/dx (a. u.)"}, {8, -0.8, 0.8, "#eta"}}); + {{pAxis}, {100, 0.0, 100.0, "dE/dx (a. u.)"}, {8, -0.8, 0.8, "#eta"}}); } } // Event Counter @@ -317,7 +317,7 @@ struct DedxAnalysis { registryDeDx.fill(HIST("hdEdxMIP_vs_phi"), trk.phi(), trk.tpcSignal()); for (int i = 0; i < 8; ++i) { if (trk.eta() > EtaCut[i] && trk.eta() < EtaCut[i + 1]) { - registryDeDx.fill(HIST("hdEdxMIP_vs_eta_calibrated"), trk.eta(), trk.tpcSignal() * 50 / Correction[i]); + registryDeDx.fill(HIST("hdEdxMIP_vs_eta_calibrated"), trk.eta(), trk.tpcSignal() * 50 / calibrationFactor->at(i)); } } } @@ -327,9 +327,9 @@ struct DedxAnalysis { for (int i = 0; i < 8; ++i) { if (trk.eta() > EtaCut[i] && trk.eta() < EtaCut[i + 1]) { if (signedP > 0) { - registryDeDx.fill(HIST(kDedxvsMomentumPos[0]), signedP, trk.tpcSignal() * 50 / Correction[i], trk.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumPos[0]), signedP, trk.tpcSignal() * 50 / calibrationFactor->at(i), trk.eta()); } else { - registryDeDx.fill(HIST(kDedxvsMomentumNeg[0]), std::abs(signedP), trk.tpcSignal() * 50 / Correction[i], trk.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumNeg[0]), std::abs(signedP), trk.tpcSignal() * 50 / calibrationFactor->at(i), trk.eta()); } } } @@ -385,11 +385,11 @@ struct DedxAnalysis { for (int i = 0; i < 8; ++i) { if (negTrack.eta() > EtaCut[i] && negTrack.eta() < EtaCut[i + 1]) { - registryDeDx.fill(HIST(kDedxvsMomentumNeg[1]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / Correction[i], negTrack.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumNeg[1]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactor->at(i), negTrack.eta()); } if (posTrack.eta() > EtaCut[i] && posTrack.eta() < EtaCut[i + 1]) { - registryDeDx.fill(HIST(kDedxvsMomentumPos[1]), signedPpos, posTrack.tpcSignal() * 50 / Correction[i], posTrack.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumPos[1]), signedPpos, posTrack.tpcSignal() * 50 / calibrationFactor->at(i), posTrack.eta()); } } } @@ -409,11 +409,11 @@ struct DedxAnalysis { for (int i = 0; i < 8; ++i) { if (negTrack.eta() > EtaCut[i] && negTrack.eta() < EtaCut[i + 1]) { - registryDeDx.fill(HIST(kDedxvsMomentumNeg[1]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / Correction[i], negTrack.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumNeg[1]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactor->at(i), negTrack.eta()); } if (posTrack.eta() > EtaCut[i] && posTrack.eta() < EtaCut[i + 1]) { - registryDeDx.fill(HIST(kDedxvsMomentumPos[2]), signedPpos, posTrack.tpcSignal() * 50 / Correction[i], posTrack.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumPos[2]), signedPpos, posTrack.tpcSignal() * 50 / calibrationFactor->at(i), posTrack.eta()); } } } @@ -433,11 +433,11 @@ struct DedxAnalysis { for (int i = 0; i < 8; ++i) { if (negTrack.eta() > EtaCut[i] && negTrack.eta() < EtaCut[i + 1]) { - registryDeDx.fill(HIST(kDedxvsMomentumNeg[2]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / Correction[i], negTrack.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumNeg[2]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactor->at(i), negTrack.eta()); } if (posTrack.eta() > EtaCut[i] && posTrack.eta() < EtaCut[i + 1]) { - registryDeDx.fill(HIST(kDedxvsMomentumPos[1]), signedPpos, posTrack.tpcSignal() * 50 / Correction[i], posTrack.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumPos[1]), signedPpos, posTrack.tpcSignal() * 50 / calibrationFactor->at(i), posTrack.eta()); } } } @@ -457,11 +457,11 @@ struct DedxAnalysis { for (int i = 0; i < 8; ++i) { if (negTrack.eta() > EtaCut[i] && negTrack.eta() < EtaCut[i + 1]) { - registryDeDx.fill(HIST(kDedxvsMomentumNeg[3]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / Correction[i], negTrack.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumNeg[3]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactor->at(i), negTrack.eta()); } if (posTrack.eta() > EtaCut[i] && posTrack.eta() < EtaCut[i + 1]) { - registryDeDx.fill(HIST(kDedxvsMomentumPos[3]), signedPpos, posTrack.tpcSignal() * 50 / Correction[i], posTrack.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumPos[3]), signedPpos, posTrack.tpcSignal() * 50 / calibrationFactor->at(i), posTrack.eta()); } } } From 7548baa8aded10d2262fcfa61f9fd4292295ffc3 Mon Sep 17 00:00:00 2001 From: omassen <55696099+omassen@users.noreply.github.com> Date: Wed, 19 Feb 2025 20:36:27 +0100 Subject: [PATCH 0323/1650] [PWGCF] Adding A/C side asymmetry histograms (#10067) Co-authored-by: ALICE Action Bot --- .../TwoParticleCorrelations/Tasks/neutronProtonCorrZdc.cxx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/neutronProtonCorrZdc.cxx b/PWGCF/TwoParticleCorrelations/Tasks/neutronProtonCorrZdc.cxx index aaff25b6b95..b23be4f956c 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/neutronProtonCorrZdc.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/neutronProtonCorrZdc.cxx @@ -112,6 +112,8 @@ struct NeutronProtonCorrZdc { histos.add("CentvsZPSignalSum", "CentvsZPSignalSum", kTH2F, {cfgAxisCent, axisZPSignal}); histos.add("CentvsAlphaZN", "CentvsAlphaZN", kTH2F, {cfgAxisCent, axisAlphaZ}); histos.add("CentvsAlphaZP", "CentvsAlphaZP", kTH2F, {cfgAxisCent, axisAlphaZ}); + histos.add("CentvsAlphaZNcommon", "CentvsAlphaZNcommon", kTH2F, {cfgAxisCent, axisAlphaZ}); + histos.add("CentvsAlphaZPcommon", "CentvsAlphaZPcommon", kTH2F, {cfgAxisCent, axisAlphaZ}); histos.add("CentvsDiffZNSignal", "CentvsDiffZNSignal", defaultZDCDiffHist); histos.add("CentvsDiffZPSignal", "CentvsDiffZPSignal", defaultZDCDiffHist); histos.add("CentvsZNAvsZNC", "CentvsZNAvsZNC", kTH3F, {cfgAxisCent, axisZNASignal, axisZNCSignal}); @@ -242,6 +244,8 @@ struct NeutronProtonCorrZdc { histos.fill(HIST("CentvsZPSignalCommon"), cent, (zdcread.energyCommonZPA() + zdcread.energyCommonZPC())); histos.fill(HIST("CentvsAlphaZN"), cent, alphaZN); histos.fill(HIST("CentvsAlphaZP"), cent, alphaZP); + histos.fill(HIST("CentvsAlphaZNcommon"), cent, (zdcread.energyCommonZNA() - zdcread.energyCommonZNC()) / (zdcread.energyCommonZNA() + zdcread.energyCommonZNC())); + histos.fill(HIST("CentvsAlphaZPcommon"), cent, (zdcread.energyCommonZPA() - zdcread.energyCommonZPC()) / (zdcread.energyCommonZPA() + zdcread.energyCommonZPC())); histos.fill(HIST("CentvsZNAvsZNC"), cent, sumZNA, sumZNC); histos.fill(HIST("CentvsZNAvsZPA"), cent, sumZNA, sumZPA); @@ -296,6 +300,8 @@ struct NeutronProtonCorrZdc { histos.fill(HIST("CentvsZPSignalCommon"), cent, (zdcread.energyCommonZPA() + zdcread.energyCommonZPC())); histos.fill(HIST("CentvsAlphaZN"), cent, alphaZN); histos.fill(HIST("CentvsAlphaZP"), cent, alphaZP); + histos.fill(HIST("CentvsAlphaZNcommon"), cent, (zdcread.energyCommonZNA() - zdcread.energyCommonZNC()) / (zdcread.energyCommonZNA() + zdcread.energyCommonZNC())); + histos.fill(HIST("CentvsAlphaZPcommon"), cent, (zdcread.energyCommonZPA() - zdcread.energyCommonZPC()) / (zdcread.energyCommonZPA() + zdcread.energyCommonZPC())); histos.fill(HIST("CentvsZNAvsZNC"), cent, sumZNA, sumZNC); histos.fill(HIST("CentvsZNAvsZPA"), cent, sumZNA, sumZPA); From c6ae16c24a6e1b0bb352ecdb9c14beb552703624 Mon Sep 17 00:00:00 2001 From: wefeng1110 <147308878+wefeng1110@users.noreply.github.com> Date: Thu, 20 Feb 2025 04:48:57 +0800 Subject: [PATCH 0324/1650] [PWGJE] Add centrality selection for MCP jets (#10074) --- PWGJE/Tasks/jetSpectraCharged.cxx | 464 ++++++++++++++++++++++-------- 1 file changed, 342 insertions(+), 122 deletions(-) diff --git a/PWGJE/Tasks/jetSpectraCharged.cxx b/PWGJE/Tasks/jetSpectraCharged.cxx index d4e3be818c0..56639d7dc0f 100644 --- a/PWGJE/Tasks/jetSpectraCharged.cxx +++ b/PWGJE/Tasks/jetSpectraCharged.cxx @@ -81,7 +81,7 @@ struct JetSpectraCharged { Configurable checkGeoMatched{"checkGeoMatched", true, "0: turn off geometry matching, 1: do geometry matching "}; Configurable checkPtMatched{"checkPtMatched", false, "0: turn off pT matching, 1: do pT matching"}; Configurable checkGeoPtMatched{"checkGeoPtMatched", false, "0: turn off geometry and pT matching, 1: do geometry and pT matching"}; - Configurable doMCPJetSubtraction{"doMCPJetSubtraction", false, "0: turn off subtraction for MCP jets, 1: do subtraction for MCP jets"}; + Configurable acceptSplitCollisions{"acceptSplitCollisions", 0, "0: only look at mcCollisions that are not split; 1: accept split mcCollisions, 2: accept split mcCollisions but only look at the first reco collision associated with it"}; std::vector eventSelectionBits; int trackSelection = -1; @@ -103,7 +103,7 @@ struct JetSpectraCharged { registry.add("h_collisions", "event status;event status;entries", {HistType::kTH1F, {{4, 0.0, 4.0}}}); registry.add("h2_centrality_occupancy", "centrality vs occupancy; centrality; occupancy", {HistType::kTH2F, {centralityAxis, {60, 0, 30000}}}); registry.add("h_collisions_Zvertex", "position of collision ;#it{Z} (cm)", {HistType::kTH1F, {{300, -15.0, 15.0}}}); - registry.add("h_track_pt", "track pT ; #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH1F, {trackPtAxis}}); + registry.add("h_track_pt", "track #it{p}_{T} ; #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH1F, {trackPtAxis}}); registry.add("h2_track_eta_track_phi", "track eta vs. track phi; #eta; #phi; counts", {HistType::kTH2F, {trackEtaAxis, phiAxis}}); if (doprocessQCWeighted) { registry.add("h_collisions_weighted", "event status;event status;entries", {HistType::kTH1F, {{4, 0.0, 4.0}}}); @@ -111,6 +111,23 @@ struct JetSpectraCharged { } if (doprocessSpectraData || doprocessSpectraMCD || doprocessSpectraMCDWeighted) { + registry.add("h_jet_pt", "jet pT;#it{p}_{T,jet} (GeV/#it{c}); counts", {HistType::kTH1F, {jetPtAxis}}); + registry.add("h_jet_eta", "jet eta;#eta; counts", {HistType::kTH1F, {jetEtaAxis}}); + registry.add("h_jet_phi", "jet phi;#phi; counts", {HistType::kTH1F, {phiAxis}}); + registry.add("h2_centrality_jet_pt", "centrality vs. jet pT;centrality; #it{p}_{T,jet} (GeV/#it{c}); counts", {HistType::kTH2F, {centralityAxis, jetPtAxis}}); + registry.add("h2_centrality_jet_eta", "centrality vs. jet eta;centrality; #eta; counts", {HistType::kTH2F, {centralityAxis, jetEtaAxis}}); + registry.add("h2_centrality_jet_phi", "centrality vs. jet phi;centrality; #varphi; counts", {HistType::kTH2F, {centralityAxis, phiAxis}}); + registry.add("h2_jet_pt_jet_area", "jet #it{p}_{T,jet} vs. Area_{jet}; #it{p}_{T,jet} (GeV/#it{c}); Area_{jet}", {HistType::kTH2F, {jetPtAxis, {150, 0., 1.5}}}); + registry.add("h2_jet_pt_jet_ntracks", "jet #it{p}_{T,jet} vs. N_{jet tracks}; #it{p}_{T,jet} (GeV/#it{c}); N_{jet, tracks}", {HistType::kTH2F, {jetPtAxis, {200, -0.5, 199.5}}}); + registry.add("h2_jet_pt_track_pt", "jet #it{p}_{T,jet} vs. #it{p}_{T,track}; #it{p}_{T,jet} (GeV/#it{c}); #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, trackPtAxis}}); + registry.add("h3_jet_pt_eta_phi", "jet pt vs. eta vs. phi", {HistType::kTH3F, {jetPtAxis, jetEtaAxis, phiAxis}}); + if (doprocessSpectraMCDWeighted) { + registry.add("h_jet_phat", "jet #hat{p};#hat{p} (GeV/#it{c});entries", {HistType::kTH1F, {{1000, 0, 1000}}}); + registry.add("h_jet_phat_weighted", "jet #hat{p};#hat{p} (GeV/#it{c});entries", {HistType::kTH1F, {{1000, 0, 1000}}}); + } + } + + if (doprocessSpectraAreaSubData || doprocessSpectraAreaSubMCD) { registry.add("h_jet_pt_rhoareasubtracted", "jet pT;#it{p}_{T,jet} (GeV/#it{c}); counts", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); registry.add("h_jet_eta_rhoareasubtracted", "jet eta;#eta; counts", {HistType::kTH1F, {jetEtaAxis}}); registry.add("h_jet_phi_rhoareasubtracted", "jet phi;#phi; counts", {HistType::kTH1F, {phiAxis}}); @@ -122,34 +139,50 @@ struct JetSpectraCharged { registry.add("h2_jet_pt_jet_corr_pt_rhoareasubtracted", "jet #it{p}_{T,jet} vs. #it{p}_{T,corr}; #it{p}_{T,jet} (GeV/#it{c}); #it{p}_{T,corr} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, jetPtAxisRhoAreaSub}}); registry.add("h2_jet_pt_track_pt_rhoareasubtracted", "jet #it{p}_{T,jet} vs. #it{p}_{T,track}; #it{p}_{T,jet} (GeV/#it{c}); #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxisRhoAreaSub, trackPtAxis}}); registry.add("h3_jet_pt_eta_phi_rhoareasubtracted", "jet_pt_eta_phi_rhoareasubtracted", {HistType::kTH3F, {jetPtAxisRhoAreaSub, jetEtaAxis, phiAxis}}); - if (doprocessSpectraMCDWeighted) { - registry.add("h_jet_phat", "jet #hat{p};#hat{p} (GeV/#it{c});entries", {HistType::kTH1F, {{1000, 0, 1000}}}); - registry.add("h_jet_phat_weighted", "jet #hat{p};#hat{p} (GeV/#it{c});entries", {HistType::kTH1F, {{1000, 0, 1000}}}); - } } if (doprocessSpectraMCP || doprocessSpectraMCPWeighted) { + registry.add("h_mcColl_counts", " number of mc events; event status; entries", {HistType::kTH1F, {{10, 0, 10}}}); + registry.get(HIST("h_mcColl_counts"))->GetXaxis()->SetBinLabel(1, "allMcColl"); + registry.get(HIST("h_mcColl_counts"))->GetXaxis()->SetBinLabel(2, "vertexZ"); + registry.get(HIST("h_mcColl_counts"))->GetXaxis()->SetBinLabel(3, "noRecoColl"); + registry.get(HIST("h_mcColl_counts"))->GetXaxis()->SetBinLabel(4, "recoEvtSel"); + registry.get(HIST("h_mcColl_counts"))->GetXaxis()->SetBinLabel(5, "centralitycut"); + registry.get(HIST("h_mcColl_counts"))->GetXaxis()->SetBinLabel(6, "occupancycut"); + registry.add("h_mc_zvertex", "position of collision ;#it{Z} (cm)", {HistType::kTH1F, {{300, -15.0, 15.0}}}); - registry.add("h_mcp_jet_pt", "jet pT;#it{p}_{T,jet} (GeV/#it{c}); counts", {HistType::kTH1F, {jetPtAxis}}); - registry.add("h_mcp_jet_eta", "jet eta;#eta; counts", {HistType::kTH1F, {jetEtaAxis}}); - registry.add("h_mcp_jet_phi", "jet phi;#phi; counts", {HistType::kTH1F, {phiAxis}}); - registry.add("h2_mcp_jet_pt_jet_area", "jet #it{p}_{T,jet} vs. Area_{jet}; #it{p}_{T,jet} (GeV/#it{c}); Area_{jet}", {HistType::kTH2F, {jetPtAxis, {150, 0., 1.5}}}); - registry.add("h2_mcp_jet_pt_jet_ntracks", "jet #it{p}_{T,jet} vs. N_{jet tracks}; #it{p}_{T,jet} (GeV/#it{c}); N_{jet, tracks}", {HistType::kTH2F, {jetPtAxis, {200, -0.5, 199.5}}}); - registry.add("h2_mcp_jet_pt_track_pt", "jet #it{p}_{T,jet} vs. #it{p}_{T,track}; #it{p}_{T,jet} (GeV/#it{c}); #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxisRhoAreaSub, trackPtAxis}}); - registry.add("hsparse_mcp_jet_pt_eta_phi", "mcp jet_pt_eta_phi", HistType::kTHnSparseF, {jetPtAxis, jetEtaAxis, phiAxis}); - if (doMCPJetSubtraction) { - registry.add("h_mcp_rho", "mc collision rho;#rho (GeV/#it{c}); counts", {HistType::kTH1F, {{500, 0.0, 500.0}}}); - registry.add("h_mcp_jet_corr_pt", "mcp jet corr pT;#it{p}_{T,jet} (GeV/#it{c}); counts", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); - registry.add("h2_mcp_jet_corr_pt_jet_area", "mcp jet #it{p}_{T,jet} vs. Area_{jet}; #it{p}_{T,jet} (GeV/#it{c}); Area_{jet}", {HistType::kTH2F, {jetPtAxisRhoAreaSub, {150, 0., 1.5}}}); - registry.add("h2_mcp_jet_corr_pt_jet_ntracks", "mcp jet #it{p}_{T,jet} vs. N_{jet tracks}; #it{p}_{T,jet} (GeV/#it{c}); N_{jet, tracks}", {HistType::kTH2F, {jetPtAxisRhoAreaSub, {200, -0.5, 199.5}}}); - registry.add("hsparse_mcp_jet_corr_pt_eta_phi", "mcp jet_corr_pt_eta_phi", HistType::kTHnSparseF, {jetPtAxisRhoAreaSub, jetEtaAxis, phiAxis}); - } + registry.add("h_jet_pt_part", "partvjet pT;#it{p}_{T,jet}^{part} (GeV/#it{c}); counts", {HistType::kTH1F, {jetPtAxis}}); + registry.add("h_jet_eta_part", "part jet #eta;#eta^{part}; counts", {HistType::kTH1F, {jetEtaAxis}}); + registry.add("h_jet_phi_part", "part jet #varphi;#phi^{part}; counts", {HistType::kTH1F, {phiAxis}}); + registry.add("h2_jet_pt_part_jet_area_part", "part jet #it{p}_{T,jet} vs. Area_{jet}; #it{p}_{T,jet}^{part} (GeV/#it{c}); Area_{jet}^{part}", {HistType::kTH2F, {jetPtAxis, {150, 0., 1.5}}}); + registry.add("h2_jet_pt_part_jet_ntracks_part", "part jet #it{p}_{T,jet} vs. N_{jet tracks}; #it{p}_{T,jet}^{part} (GeV/#it{c}); N_{jet, tracks}^{part}", {HistType::kTH2F, {jetPtAxis, {200, -0.5, 199.5}}}); + registry.add("h2_jet_pt_part_track_pt_part", "part jet #it{p}_{T,jet} vs. #it{p}_{T,track}; #it{p}_{T,jet}^{part} (GeV/#it{c}); #it{p}_{T,track}^{part} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxisRhoAreaSub, trackPtAxis}}); + registry.add("h3_jet_pt_eta_phi_part", "part jet pt vs. eta vs. phi", {HistType::kTH3F, {jetPtAxis, jetEtaAxis, phiAxis}}); if (doprocessSpectraMCPWeighted) { - registry.add("h2_mcp_jet_ptcut_part", "p_{T} cut;p_{T,jet}^{part} (GeV/#it{c});N;entries", {HistType::kTH2F, {{300, 0, 300}, {20, 0, 5}}}); - registry.add("h_mcp_jet_phat_weighted", "jet #hat{p};#hat{p} (GeV/#it{c});entries", {HistType::kTH1F, {{1000, 0, 1000}}}); + registry.add("h2_jet_ptcut_part", "p_{T} cut;p_{T,jet}^{part} (GeV/#it{c});N;entries", {HistType::kTH2F, {{300, 0, 300}, {20, 0, 5}}}); + registry.add("h_jet_phat_part_weighted", "jet #hat{p};#hat{p} (GeV/#it{c});entries", {HistType::kTH1F, {{1000, 0, 1000}}}); } } + if (doprocessSpectraAreaSubMCP) { + registry.add("h_mcColl_counts_areasub", " number of mc events; event status; entries", {HistType::kTH1F, {{10, 0, 10}}}); + registry.get(HIST("h_mcColl_counts_areasub"))->GetXaxis()->SetBinLabel(1, "allMcColl"); + registry.get(HIST("h_mcColl_counts_areasub"))->GetXaxis()->SetBinLabel(2, "vertexZ"); + registry.get(HIST("h_mcColl_counts_areasub"))->GetXaxis()->SetBinLabel(3, "noRecoColl"); + registry.get(HIST("h_mcColl_counts_areasub"))->GetXaxis()->SetBinLabel(4, "splitColl"); + registry.get(HIST("h_mcColl_counts_areasub"))->GetXaxis()->SetBinLabel(5, "recoEvtSel"); + registry.get(HIST("h_mcColl_counts_areasub"))->GetXaxis()->SetBinLabel(6, "centralitycut"); + registry.get(HIST("h_mcColl_counts_areasub"))->GetXaxis()->SetBinLabel(7, "occupancycut"); + + registry.add("h_mcColl_rho", "mc collision rho;#rho (GeV/#it{c}); counts", {HistType::kTH1F, {{500, 0.0, 500.0}}}); + registry.add("h_jet_pt_part_rhoareasubtracted", "part jet corr pT;#it{p}_{T,jet}^{part} (GeV/#it{c}); counts", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); + registry.add("h_jet_eta_part_rhoareasubtracted", "part jet #eta;#eta^{part}; counts", {HistType::kTH1F, {jetEtaAxis}}); + registry.add("h_jet_phi_part_rhoareasubtracted", "part jet #varphi;#varphi^{part}; counts", {HistType::kTH1F, {phiAxis}}); + registry.add("h2_jet_pt_part_jet_area_part_rhoareasubtracted", "part jet #it{p}_{T,jet} vs. Area_{jet}; #it{p}_{T,jet}^{part} (GeV/#it{c}); Area_{jet}^{part}", {HistType::kTH2F, {jetPtAxisRhoAreaSub, {150, 0., 1.5}}}); + registry.add("h2_jet_pt_part_jet_ntracks_part_rhoareasubtracted", "part jet #it{p}_{T,jet} vs. N_{jet tracks}; #it{p}_{T,jet}^{part} (GeV/#it{c}); N_{jet, tracks}{part}", {HistType::kTH2F, {jetPtAxisRhoAreaSub, {200, -0.5, 199.5}}}); + registry.add("h3_jet_pt_eta_phi_part_rhoareasubtracted", "part jet pt vs. eta vs.phi", {HistType::kTH3F, {jetPtAxisRhoAreaSub, jetEtaAxis, phiAxis}}); + } + if (doprocessEvtWiseConstSubJetsData || doprocessEvtWiseConstSubJetsMCD) { registry.add("h2_centrality_jet_pt_eventwiseconstituentsubtracted", "centrality vs. jet pT;centrality;#it{p}_{T,jet} (GeV/#it{c});entries", {HistType::kTH2F, {centralityAxis, jetPtAxis}}); registry.add("jet_observables_eventwiseconstituentsubtracted", "jet_observables_eventwiseconstituentsubtracted", HistType::kTHnSparseF, {jetPtAxis, jetEtaAxis, phiAxis}); @@ -157,31 +190,31 @@ struct JetSpectraCharged { if (doprocessJetsMatched || doprocessJetsMatchedWeighted) { if (checkGeoMatched) { - registry.add("h2_jet_pt_reco_jet_pt_gen_matchedgeo", "pT reco vs. pT gen;#it{p}_{T,jet}^{reco} (GeV/#it{c});#it{p}_{T,jet}^{gen} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, jetPtAxis}}); - registry.add("h2_jet_eta_reco_jet_eta_gen_matchedgeo", "Eta reco vs. Eta gen;#eta_{jet}^{reco};#eta_{jet}^{gen}", {HistType::kTH2F, {jetEtaAxis, jetEtaAxis}}); - registry.add("h2_jet_phi_reco_jet_phi_gen_matchedgeo", "Phi reco vs. Phi gen;#varphi_{jet}^{reco};#varphi_{jet}^{gen}", {HistType::kTH2F, {phiAxis, phiAxis}}); - registry.add("h2_jet_ntracks_reco_jet_ntracks_gen_matchedgeo", "Ntracks reco vs. Ntracks gen;N_{jet tracks}^{reco};N_{jet tracks}^{gen}", {HistType::kTH2F, {{200, -0.5, 199.5}, {200, -0.5, 199.5}}}); - registry.add("h2_jet_pt_gen_jet_pt_diff_matchedgeo", "jet gen pT vs. delta pT / jet gen pt;#it{p}_{T,jet}^{gen} (GeV/#it{c}); (#it{p}_{T,jet}^{gen} (GeV/#it{c}) - #it{p}_{T,jet}^{reco} (GeV/#it{c})) / #it{p}_{T,jet}^{gen} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, {1000, -5.0, 2.0}}}); - registry.add("h2_jet_pt_reco_jet_pt_diff_matchedgeo", "jet reco pT vs. delta pT / jet reco pt;#it{p}_{T,jet}^{reco} (GeV/#it{c}); (#it{p}_{T,jet}^{reco} (GeV/#it{c}) - #it{p}_{T,jet}^{gen} (GeV/#it{c})) / #it{p}_{T,jet}^{reco} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, {1000, -5.0, 2.0}}}); - registry.add("h2_jet_pt_gen_jet_pt_ratio_matchedgeo", "jet gen pT vs. jet reco pT / jet gen pt;#it{p}_{T,jet}^{gen} (GeV/#it{c}); #it{p}_{T,jet}^{reco} (GeV/#it{c}) / #it{p}_{T,jet}^{gen} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, {1000, -5.0, 5.0}}}); + registry.add("h2_jet_pt_mcd_jet_pt_mcp_matchedgeo", "pT mcd vs. pT mcp;#it{p}_{T,jet}^{mcd} (GeV/#it{c});#it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, jetPtAxis}}); + registry.add("h2_jet_eta_mcd_jet_eta_mcp_matchedgeo", "Eta mcd vs. Eta mcp;#eta_{jet}^{mcd};#eta_{jet}^{mcp}", {HistType::kTH2F, {jetEtaAxis, jetEtaAxis}}); + registry.add("h2_jet_phi_mcd_jet_phi_mcp_matchedgeo", "Phi mcd vs. Phi mcp;#varphi_{jet}^{mcd};#varphi_{jet}^{mcp}", {HistType::kTH2F, {phiAxis, phiAxis}}); + registry.add("h2_jet_ntracks_mcd_jet_ntracks_mcp_matchedgeo", "Ntracks mcd vs. Ntracks mcp;N_{jet tracks}^{mcd};N_{jet tracks}^{mcp}", {HistType::kTH2F, {{200, -0.5, 199.5}, {200, -0.5, 199.5}}}); + registry.add("h2_jet_pt_mcp_jet_pt_diff_matchedgeo", "jet mcp pT vs. delta pT / jet mcp pt;#it{p}_{T,jet}^{mcp} (GeV/#it{c}); (#it{p}_{T,jet}^{mcp} (GeV/#it{c}) - #it{p}_{T,jet}^{mcd} (GeV/#it{c})) / #it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, {1000, -5.0, 2.0}}}); + registry.add("h2_jet_pt_mcd_jet_pt_diff_matchedgeo", "jet mcd pT vs. delta pT / jet mcd pt;#it{p}_{T,jet}^{mcd} (GeV/#it{c}); (#it{p}_{T,jet}^{mcd} (GeV/#it{c}) - #it{p}_{T,jet}^{mcp} (GeV/#it{c})) / #it{p}_{T,jet}^{mcd} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, {1000, -5.0, 2.0}}}); + registry.add("h2_jet_pt_mcp_jet_pt_ratio_matchedgeo", "jet mcp pT vs. jet mcd pT / jet mcp pt;#it{p}_{T,jet}^{mcp} (GeV/#it{c}); #it{p}_{T,jet}^{mcd} (GeV/#it{c}) / #it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, {1000, -5.0, 5.0}}}); } if (checkPtMatched) { - registry.add("h2_jet_pt_reco_jet_pt_gen_matchedpt", "pT reco vs. pT gen;#it{p}_{T,jet}^{reco} (GeV/#it{c});#it{p}_{T,jet}^{gen} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, jetPtAxis}}); - registry.add("h2_jet_eta_reco_jet_eta_gen_matchedpt", "Eta reco vs. Eta gen;#eta_{jet}^{reco};#eta_{jet}^{gen}", {HistType::kTH2F, {jetEtaAxis, jetEtaAxis}}); - registry.add("h2_jet_phi_reco_jet_phi_gen_matchedgpt", "Phi reco vs. Phi gen;#varphi_{jet}^{reco};#varphi_{jet}^{gen}", {HistType::kTH2F, {phiAxis, phiAxis}}); - registry.add("h2_jet_ntracks_reco_jet_ntracks_gen_matchedpt", "Ntracks reco vs. Ntracks gen;N_{jet tracks}^{reco};N_{jet tracks}^{gen}", {HistType::kTH2F, {{200, -0.5, 199.5}, {200, -0.5, 199.5}}}); - registry.add("h2_jet_pt_gen_jet_pt_diff_matchedpt", "jet gen pT vs. delta pT / jet gen pt;#it{p}_{T,jet}^{gen} (GeV/#it{c}); (#it{p}_{T,jet}^{gen} (GeV/#it{c}) - #it{p}_{T,jet}^{reco} (GeV/#it{c})) / #it{p}_{T,jet}^{gen} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, {1000, -5.0, 2.0}}}); - registry.add("h2_jet_pt_reco_jet_pt_diff_matchedpt", "jet reco pT vs. delta pT / jet reco pt;#it{p}_{T,jet}^{reco} (GeV/#it{c}); (#it{p}_{T,jet}^{reco} (GeV/#it{c}) - #it{p}_{T,jet}^{gen} (GeV/#it{c})) / #it{p}_{T,jet}^{reco} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, {1000, -5.0, 2.0}}}); - registry.add("h2_jet_pt_gen_jet_pt_ratio_matchedpt", "jet gen pT vs. jet reco pT / jet gen pt;#it{p}_{T,jet}^{gen} (GeV/#it{c}); #it{p}_{T,jet}^{reco} (GeV/#it{c}) / #it{p}_{T,jet}^{gen} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, {1000, -5.0, 5.0}}}); + registry.add("h2_jet_pt_mcd_jet_pt_mcp_matchedpt", "pT mcd vs. pT mcp;#it{p}_{T,jet}^{mcd} (GeV/#it{c});#it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, jetPtAxis}}); + registry.add("h2_jet_eta_mcd_jet_eta_mcp_matchedpt", "Eta mcd vs. Eta mcp;#eta_{jet}^{mcd};#eta_{jet}^{mcp}", {HistType::kTH2F, {jetEtaAxis, jetEtaAxis}}); + registry.add("h2_jet_phi_mcd_jet_phi_mcp_matchedgpt", "Phi mcd vs. Phi mcp;#varphi_{jet}^{mcd};#varphi_{jet}^{mcp}", {HistType::kTH2F, {phiAxis, phiAxis}}); + registry.add("h2_jet_ntracks_mcd_jet_ntracks_mcp_matchedpt", "Ntracks mcd vs. Ntracks mcp;N_{jet tracks}^{mcd};N_{jet tracks}^{mcp}", {HistType::kTH2F, {{200, -0.5, 199.5}, {200, -0.5, 199.5}}}); + registry.add("h2_jet_pt_mcp_jet_pt_diff_matchedpt", "jet mcp pT vs. delta pT / jet mcp pt;#it{p}_{T,jet}^{mcp} (GeV/#it{c}); (#it{p}_{T,jet}^{mcp} (GeV/#it{c}) - #it{p}_{T,jet}^{mcd} (GeV/#it{c})) / #it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, {1000, -5.0, 2.0}}}); + registry.add("h2_jet_pt_mcd_jet_pt_diff_matchedpt", "jet mcd pT vs. delta pT / jet mcd pt;#it{p}_{T,jet}^{mcd} (GeV/#it{c}); (#it{p}_{T,jet}^{mcd} (GeV/#it{c}) - #it{p}_{T,jet}^{mcp} (GeV/#it{c})) / #it{p}_{T,jet}^{mcd} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, {1000, -5.0, 2.0}}}); + registry.add("h2_jet_pt_mcp_jet_pt_ratio_matchedpt", "jet mcp pT vs. jet mcd pT / jet mcp pt;#it{p}_{T,jet}^{mcp} (GeV/#it{c}); #it{p}_{T,jet}^{mcd} (GeV/#it{c}) / #it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, {1000, -5.0, 5.0}}}); } if (checkGeoPtMatched) { - registry.add("h2_jet_pt_reco_jet_pt_gen_matchedgeopt", "pT reco vs. pT gen;#it{p}_{T,jet}^{reco} (GeV/#it{c});#it{p}_{T,jet}^{gen} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, jetPtAxis}}); - registry.add("h2_jet_eta_reco_jet_eta_gen_matchedgeopt", "Eta reco vs. Eta gen;#eta_{jet}^{reco};#eta_{jet}^{gen}", {HistType::kTH2F, {jetEtaAxis, jetEtaAxis}}); - registry.add("h2_jet_phi_reco_jet_phi_gen_matchedgeopt", "Phi reco vs. Phi gen;#varphi_{jet}^{reco};#varphi_{jet}^{gen}", {HistType::kTH2F, {phiAxis, phiAxis}}); - registry.add("h2_jet_ntracks_reco_jet_ntracks_gen_matchedgeopt", "Ntracks reco vs. Ntracks gen;N_{jet tracks}^{reco};N_{jet tracks}^{gen}", {HistType::kTH2F, {{200, -0.5, 199.5}, {200, -0.5, 199.5}}}); - registry.add("h2_jet_pt_gen_jet_pt_diff_matchedgeopt", "jet gen pT vs. delta pT / jet gen pt;#it{p}_{T,jet}^{gen} (GeV/#it{c}); (#it{p}_{T,jet}^{gen} (GeV/#it{c}) - #it{p}_{T,jet}^{reco} (GeV/#it{c})) / #it{p}_{T,jet}^{gen} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, {1000, -5.0, 2.0}}}); - registry.add("h2_jet_pt_reco_jet_pt_diff_matchedgeopt", "jet reco pT vs. delta pT / jet reco pt;#it{p}_{T,jet}^{reco} (GeV/#it{c}); (#it{p}_{T,jet}^{reco} (GeV/#it{c}) - #it{p}_{T,jet}^{gen} (GeV/#it{c})) / #it{p}_{T,jet}^{reco} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, {1000, -5.0, 2.0}}}); - registry.add("h2_jet_pt_gen_jet_pt_ratio_matchedgeopt", "jet gen pT vs. jet reco pT / jet gen pt;#it{p}_{T,jet}^{gen} (GeV/#it{c}); #it{p}_{T,jet}^{reco} (GeV/#it{c}) / #it{p}_{T,jet}^{gen} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, {1000, -5.0, 5.0}}}); + registry.add("h2_jet_pt_mcd_jet_pt_mcp_matchedgeopt", "pT mcd vs. pT mcp;#it{p}_{T,jet}^{mcd} (GeV/#it{c});#it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, jetPtAxis}}); + registry.add("h2_jet_eta_mcd_jet_eta_mcp_matchedgeopt", "Eta mcd vs. Eta mcp;#eta_{jet}^{mcd};#eta_{jet}^{mcp}", {HistType::kTH2F, {jetEtaAxis, jetEtaAxis}}); + registry.add("h2_jet_phi_mcd_jet_phi_mcp_matchedgeopt", "Phi mcd vs. Phi mcp;#varphi_{jet}^{mcd};#varphi_{jet}^{mcp}", {HistType::kTH2F, {phiAxis, phiAxis}}); + registry.add("h2_jet_ntracks_mcd_jet_ntracks_mcp_matchedgeopt", "Ntracks mcd vs. Ntracks mcp;N_{jet tracks}^{mcd};N_{jet tracks}^{mcp}", {HistType::kTH2F, {{200, -0.5, 199.5}, {200, -0.5, 199.5}}}); + registry.add("h2_jet_pt_mcp_jet_pt_diff_matchedgeopt", "jet mcp pT vs. delta pT / jet mcp pt;#it{p}_{T,jet}^{mcp} (GeV/#it{c}); (#it{p}_{T,jet}^{mcp} (GeV/#it{c}) - #it{p}_{T,jet}^{mcd} (GeV/#it{c})) / #it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, {1000, -5.0, 2.0}}}); + registry.add("h2_jet_pt_mcd_jet_pt_diff_matchedgeopt", "jet mcd pT vs. delta pT / jet mcd pt;#it{p}_{T,jet}^{mcd} (GeV/#it{c}); (#it{p}_{T,jet}^{mcd} (GeV/#it{c}) - #it{p}_{T,jet}^{mcp} (GeV/#it{c})) / #it{p}_{T,jet}^{mcd} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, {1000, -5.0, 2.0}}}); + registry.add("h2_jet_pt_mcp_jet_pt_ratio_matchedgeopt", "jet mcp pT vs. jet mcd pT / jet mcp pt;#it{p}_{T,jet}^{mcp} (GeV/#it{c}); #it{p}_{T,jet}^{mcd} (GeV/#it{c}) / #it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, {1000, -5.0, 5.0}}}); } } @@ -189,10 +222,10 @@ struct JetSpectraCharged { registry.add("h_mc_collisions_matched", "mc collisions status;event status;entries", {HistType::kTH1F, {{5, 0.0, 5.0}}}); registry.add("h_mcd_events_matched", "mcd event status;event status;entries", {HistType::kTH1F, {{5, 0.0, 5.0}}}); registry.add("h_mc_rho_matched", "mc collision rho;#rho (GeV/#it{c}); counts", {HistType::kTH1F, {{500, -100.0, 500.0}}}); - registry.add("h2_reco_jet_corr_pt_gen_jet_corr_pt_matchedgeo", "corr pT reco vs. corr cpT gen;#it{p}_{T,jet}^{reco} (GeV/#it{c});#it{p}_{T,jet}^{gen} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxisRhoAreaSub, jetPtAxisRhoAreaSub}}); - registry.add("h2_gen_jet_corr_pt_jet_pt_diff_corr_matchedgeo", "jet gen corr pT vs. corr delta pT / jet gen corr pt;#it{p}_{T,jet}^{gen} (GeV/#it{c}); (#it{p}_{T,jet}^{gen} (GeV/#it{c}) - #it{p}_{T,jet}^{reco} (GeV/#it{c})) / #it{p}_{T,jet}^{gen} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxisRhoAreaSub, {1000, -5.0, 5.0}}}); - registry.add("h2_reco_jet_corr_pt_jet_pt_diff_corr_matchedgeo", "jet reco corr pT vs. corr delta pT / jet reco corr pt;#it{p}_{T,jet}^{reco} (GeV/#it{c}); (#it{p}_{T,jet}^{reco} (GeV/#it{c}) - #it{p}_{T,jet}^{gen} (GeV/#it{c})) / #it{p}_{T,jet}^{reco} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxisRhoAreaSub, {1000, -5.0, 5.0}}}); - registry.add("h2_gen_jet_corr_pt_jet_corr_pt_ratio_matchedgeo", "jet gen corr pT vs. jet reco corr pT / jet gen corr pt;#it{p}_{T,jet}^{gen} (GeV/#it{c}); #it{p}_{T,jet}^{reco} (GeV/#it{c}) / #it{p}_{T,jet}^{gen} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxisRhoAreaSub, {1000, -5.0, 5.0}}}); + registry.add("h2_mcd_jet_pt_mcp_jet_pt_matchedgeo_rhoareasubtracted", "corr pT mcd vs. corr cpT mcp;#it{p}_{T,jet}^{mcd} (GeV/#it{c});#it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxisRhoAreaSub, jetPtAxisRhoAreaSub}}); + registry.add("h2_mcp_jet_pt_jet_pt_diff_matchedgeo_rhoareasubtracted", "jet mcp corr pT vs. corr delta pT / jet mcp corr pt;#it{p}_{T,jet}^{mcp} (GeV/#it{c}); (#it{p}_{T,jet}^{mcp} (GeV/#it{c}) - #it{p}_{T,jet}^{mcd} (GeV/#it{c})) / #it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxisRhoAreaSub, {1000, -5.0, 5.0}}}); + registry.add("h2_mcd_jet_pt_jet_pt_diff_matchedgeo_rhoareasubtracted", "jet mcd corr pT vs. corr delta pT / jet mcd corr pt;#it{p}_{T,jet}^{mcd} (GeV/#it{c}); (#it{p}_{T,jet}^{mcd} (GeV/#it{c}) - #it{p}_{T,jet}^{mcp} (GeV/#it{c})) / #it{p}_{T,jet}^{mcd} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxisRhoAreaSub, {1000, -5.0, 5.0}}}); + registry.add("h2_mcp_jet_pt_jet_pt_ratio_matchedgeo_rhoareasubtracted", "jet mcp corr pT vs. jet mcd corr pT / jet mcp corr pt;#it{p}_{T,jet}^{mcp} (GeV/#it{c}); #it{p}_{T,jet}^{mcd} (GeV/#it{c}) / #it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxisRhoAreaSub, {1000, -5.0, 5.0}}}); } } @@ -236,54 +269,82 @@ struct JetSpectraCharged { } template - void fillJetHistograms(TJets const& jet, float centrality, float rho, float weight = 1.0) + void fillJetHistograms(TJets const& jet, float centrality, float weight = 1.0) { if (jet.r() == round(selectedJetsRadius * 100.0f)) { - double jetcorrpt = jet.pt() - (rho * jet.area()); + registry.fill(HIST("h_jet_pt"), jet.pt(), weight); + registry.fill(HIST("h_jet_eta"), jet.eta(), weight); + registry.fill(HIST("h_jet_phi"), jet.phi(), weight); + registry.fill(HIST("h2_centrality_jet_pt"), centrality, jet.pt(), weight); + registry.fill(HIST("h2_centrality_jet_eta"), centrality, jet.eta(), weight); + registry.fill(HIST("h2_centrality_jet_phi"), centrality, jet.phi(), weight); + registry.fill(HIST("h2_jet_pt_jet_area"), jet.pt(), jet.area(), weight); + registry.fill(HIST("h2_jet_pt_jet_ntracks"), jet.pt(), jet.tracksIds().size(), weight); + registry.fill(HIST("h3_jet_pt_eta_phi"), jet.pt(), jet.eta(), jet.phi(), weight); + } + + for (const auto& constituent : jet.template tracks_as()) { + registry.fill(HIST("h2_jet_pt_track_pt"), jet.pt(), constituent.pt(), weight); + } + } + + template + void fillJetAreaSubHistograms(TJets const& jet, float centrality, float rho, float weight = 1.0) + { + double jetcorrpt = jet.pt() - (rho * jet.area()); + if (jet.r() == round(selectedJetsRadius * 100.0f)) { // fill jet histograms after area-based subtraction registry.fill(HIST("h_jet_pt_rhoareasubtracted"), jetcorrpt, weight); - registry.fill(HIST("h_jet_eta_rhoareasubtracted"), jet.eta(), weight); - registry.fill(HIST("h_jet_phi_rhoareasubtracted"), jet.phi(), weight); registry.fill(HIST("h2_centrality_jet_pt_rhoareasubtracted"), centrality, jetcorrpt, weight); - registry.fill(HIST("h2_centrality_jet_eta_rhoareasubtracted"), centrality, jet.eta(), weight); - registry.fill(HIST("h2_centrality_jet_phi_rhoareasubtracted"), centrality, jet.phi(), weight); registry.fill(HIST("h2_jet_pt_jet_corr_pt_rhoareasubtracted"), jet.pt(), jetcorrpt, weight); registry.fill(HIST("h3_jet_pt_eta_phi_rhoareasubtracted"), jetcorrpt, jet.eta(), jet.phi(), weight); if (jetcorrpt > 0) { + registry.fill(HIST("h_jet_eta_rhoareasubtracted"), jet.eta(), weight); + registry.fill(HIST("h_jet_phi_rhoareasubtracted"), jet.phi(), weight); + registry.fill(HIST("h2_centrality_jet_eta_rhoareasubtracted"), centrality, jet.eta(), weight); + registry.fill(HIST("h2_centrality_jet_phi_rhoareasubtracted"), centrality, jet.phi(), weight); registry.fill(HIST("h2_jet_pt_jet_area_rhoareasubtracted"), jetcorrpt, jet.area(), weight); registry.fill(HIST("h2_jet_pt_jet_ntracks_rhoareasubtracted"), jetcorrpt, jet.tracksIds().size(), weight); } } for (const auto& constituent : jet.template tracks_as()) { - registry.fill(HIST("h2_jet_pt_track_pt_rhoareasubtracted"), jet.pt(), constituent.pt(), weight); + registry.fill(HIST("h2_jet_pt_track_pt_rhoareasubtracted"), jetcorrpt, constituent.pt(), weight); } } template - void fillMCPHistograms(TJets const& jet, float rho = 0.0, float weight = 1.0) + void fillMCPHistograms(TJets const& jet, float weight = 1.0) { if (jet.r() == round(selectedJetsRadius * 100.0f)) { // fill mcp jet histograms - registry.fill(HIST("h_mcp_jet_pt"), jet.pt(), weight); - registry.fill(HIST("h_mcp_jet_eta"), jet.eta(), weight); - registry.fill(HIST("h_mcp_jet_phi"), jet.phi(), weight); - registry.fill(HIST("hsparse_mcp_jet_pt_eta_phi"), jet.pt(), jet.eta(), jet.phi(), weight); - registry.fill(HIST("h2_mcp_jet_pt_jet_area"), jet.pt(), jet.area(), weight); - registry.fill(HIST("h2_mcp_jet_pt_jet_ntracks"), jet.pt(), jet.tracksIds().size(), weight); - if (doMCPJetSubtraction) { - double jetcorrpt = jet.pt() - (rho * jet.area()); - registry.fill(HIST("h_mcp_jet_corr_pt"), jetcorrpt, weight); - registry.fill(HIST("hsparse_mcp_jet_corr_pt_eta_phi"), jet.pt(), jet.eta(), jet.phi(), weight); - if (jetcorrpt > 0) { - registry.fill(HIST("h2_mcp_jet_corr_pt_jet_area"), jetcorrpt, jet.area(), weight); - registry.fill(HIST("h2_mcp_jet_corr_pt_jet_ntracks"), jetcorrpt, jet.tracksIds().size(), weight); - } - } + registry.fill(HIST("h_jet_pt_part"), jet.pt(), weight); + registry.fill(HIST("h_jet_eta_part"), jet.eta(), weight); + registry.fill(HIST("h_jet_phi_part"), jet.phi(), weight); + registry.fill(HIST("h3_jet_pt_eta_phi_part"), jet.pt(), jet.eta(), jet.phi(), weight); + registry.fill(HIST("h2_jet_pt_part_jet_area_part"), jet.pt(), jet.area(), weight); + registry.fill(HIST("h2_jet_pt_part_jet_ntracks_part"), jet.pt(), jet.tracksIds().size(), weight); } for (const auto& constituent : jet.template tracks_as()) { - registry.fill(HIST("h2_mcp_jet_pt_track_pt"), jet.pt(), constituent.pt(), weight); + registry.fill(HIST("h2_jet_pt_part_track_pt_part"), jet.pt(), constituent.pt(), weight); + } + } + + template + void fillMCPAreaSubHistograms(TJets const& jet, float rho = 0.0, float weight = 1.0) + { + if (jet.r() == round(selectedJetsRadius * 100.0f)) { + // fill mcp jet histograms + double jetcorrpt = jet.pt() - (rho * jet.area()); + registry.fill(HIST("h_jet_pt_part_rhoareasubtracted"), jetcorrpt, weight); + registry.fill(HIST("h3_jet_pt_eta_phi_part_rhoareasubtracted"), jetcorrpt, jet.eta(), jet.phi(), weight); + if (jetcorrpt > 0) { + registry.fill(HIST("h_jet_eta_part_rhoareasubtracted"), jet.eta(), weight); + registry.fill(HIST("h_jet_phi_part_rhoareasubtracted"), jet.phi(), weight); + registry.fill(HIST("h2_jet_pt_part_jet_area_part_rhoareasubtracted"), jetcorrpt, jet.area(), weight); + registry.fill(HIST("h2_jet_pt_part_jet_ntracks_part_rhoareasubtracted"), jetcorrpt, jet.tracksIds().size(), weight); + } } } @@ -319,13 +380,13 @@ struct JetSpectraCharged { } if (jetBase.r() == round(selectedJetsRadius * 100.0f)) { double dpt = jetTag.pt() - jetBase.pt(); - registry.fill(HIST("h2_jet_pt_reco_jet_pt_gen_matchedgeo"), jetBase.pt(), jetTag.pt(), weight); - registry.fill(HIST("h2_jet_eta_reco_jet_eta_gen_matchedgeo"), jetBase.eta(), jetTag.eta(), weight); - registry.fill(HIST("h2_jet_phi_reco_jet_phi_gen_matchedgeo"), jetBase.phi(), jetTag.phi(), weight); - registry.fill(HIST("h2_jet_ntracks_reco_jet_ntracks_gen_matchedgeo"), jetBase.tracksIds().size(), jetTag.tracksIds().size(), weight); - registry.fill(HIST("h2_jet_pt_gen_jet_pt_diff_matchedgeo"), jetTag.pt(), dpt / jetTag.pt(), weight); - registry.fill(HIST("h2_jet_pt_reco_jet_pt_diff_matchedgeo"), jetBase.pt(), dpt / jetBase.pt(), weight); - registry.fill(HIST("h2_jet_pt_gen_jet_pt_ratio_matchedgeo"), jetTag.pt(), jetBase.pt() / jetTag.pt(), weight); + registry.fill(HIST("h2_jet_pt_mcd_jet_pt_mcp_matchedgeo"), jetBase.pt(), jetTag.pt(), weight); + registry.fill(HIST("h2_jet_eta_mcd_jet_eta_mcp_matchedgeo"), jetBase.eta(), jetTag.eta(), weight); + registry.fill(HIST("h2_jet_phi_mcd_jet_phi_mcp_matchedgeo"), jetBase.phi(), jetTag.phi(), weight); + registry.fill(HIST("h2_jet_ntracks_mcd_jet_ntracks_mcp_matchedgeo"), jetBase.tracksIds().size(), jetTag.tracksIds().size(), weight); + registry.fill(HIST("h2_jet_pt_mcp_jet_pt_diff_matchedgeo"), jetTag.pt(), dpt / jetTag.pt(), weight); + registry.fill(HIST("h2_jet_pt_mcd_jet_pt_diff_matchedgeo"), jetBase.pt(), dpt / jetBase.pt(), weight); + registry.fill(HIST("h2_jet_pt_mcp_jet_pt_ratio_matchedgeo"), jetTag.pt(), jetBase.pt() / jetTag.pt(), weight); } } } @@ -339,13 +400,13 @@ struct JetSpectraCharged { } if (jetBase.r() == round(selectedJetsRadius * 100.0f)) { double dpt = jetTag.pt() - jetBase.pt(); - registry.fill(HIST("h2_jet_pt_reco_jet_pt_gen_matchedpt"), jetBase.pt(), jetTag.pt(), weight); - registry.fill(HIST("h2_jet_eta_reco_jet_eta_gen_matchedpt"), jetBase.eta(), jetTag.eta(), weight); - registry.fill(HIST("h2_jet_phi_reco_jet_phi_gen_matchedpt"), jetBase.phi(), jetTag.phi(), weight); - registry.fill(HIST("h2_jet_ntracks_reco_jet_ntracks_gen_matchedpt"), jetBase.tracksIds().size(), jetTag.tracksIds().size(), weight); - registry.fill(HIST("h2_jet_pt_gen_jet_pt_diff_matchedpt"), jetTag.pt(), dpt / jetTag.pt(), weight); - registry.fill(HIST("h2_jet_pt_reco_jet_pt_diff_matchedpt"), jetBase.pt(), dpt / jetBase.pt(), weight); - registry.fill(HIST("h2_jet_pt_gen_jet_pt_ratio_matchedpt"), jetTag.pt(), jetBase.pt() / jetTag.pt(), weight); + registry.fill(HIST("h2_jet_pt_mcd_jet_pt_mcp_matchedpt"), jetBase.pt(), jetTag.pt(), weight); + registry.fill(HIST("h2_jet_eta_mcd_jet_eta_mcp_matchedpt"), jetBase.eta(), jetTag.eta(), weight); + registry.fill(HIST("h2_jet_phi_mcd_jet_phi_mcp_matchedpt"), jetBase.phi(), jetTag.phi(), weight); + registry.fill(HIST("h2_jet_ntracks_mcd_jet_ntracks_mcp_matchedpt"), jetBase.tracksIds().size(), jetTag.tracksIds().size(), weight); + registry.fill(HIST("h2_jet_pt_mcp_jet_pt_diff_matchedpt"), jetTag.pt(), dpt / jetTag.pt(), weight); + registry.fill(HIST("h2_jet_pt_mcd_jet_pt_diff_matchedpt"), jetBase.pt(), dpt / jetBase.pt(), weight); + registry.fill(HIST("h2_jet_pt_mcp_jet_pt_ratio_matchedpt"), jetTag.pt(), jetBase.pt() / jetTag.pt(), weight); } } } @@ -359,13 +420,13 @@ struct JetSpectraCharged { } if (jetBase.template matchedJetGeo_first_as>().globalIndex() == jetBase.template matchedJetPt_first_as>().globalIndex()) { // not a good way to do this double dpt = jetTag.pt() - jetBase.pt(); - registry.fill(HIST("h2_jet_pt_reco_jet_pt_gen_matchedgeopt"), jetBase.pt(), jetTag.pt(), weight); - registry.fill(HIST("h2_jet_eta_reco_jet_eta_gen_matchedgeopt"), jetBase.eta(), jetTag.eta(), weight); - registry.fill(HIST("h2_jet_phi_reco_jet_phi_gen_matchedgeopt"), jetBase.phi(), jetTag.phi(), weight); - registry.fill(HIST("h2_jet_ntracks_reco_jet_ntracks_gen_matchedgeopt"), jetBase.tracksIds().size(), jetTag.tracksIds().size(), weight); - registry.fill(HIST("h2_jet_pt_gen_jet_pt_diff_matchedgeopt"), jetTag.pt(), dpt / jetTag.pt(), weight); - registry.fill(HIST("h2_jet_pt_reco_jet_pt_diff_matchedgeopt"), jetBase.pt(), dpt / jetBase.pt(), weight); - registry.fill(HIST("h2_jet_pt_gen_jet_pt_ratio_matchedgeopt"), jetTag.pt(), jetBase.pt() / jetTag.pt(), weight); + registry.fill(HIST("h2_jet_pt_mcd_jet_pt_mcp_matchedgeopt"), jetBase.pt(), jetTag.pt(), weight); + registry.fill(HIST("h2_jet_eta_mcd_jet_eta_mcp_matchedgeopt"), jetBase.eta(), jetTag.eta(), weight); + registry.fill(HIST("h2_jet_phi_mcd_jet_phi_mcp_matchedgeopt"), jetBase.phi(), jetTag.phi(), weight); + registry.fill(HIST("h2_jet_ntracks_mcd_jet_ntracks_mcp_matchedgeopt"), jetBase.tracksIds().size(), jetTag.tracksIds().size(), weight); + registry.fill(HIST("h2_jet_pt_mcp_jet_pt_diff_matchedgeopt"), jetTag.pt(), dpt / jetTag.pt(), weight); + registry.fill(HIST("h2_jet_pt_mcd_jet_pt_diff_matchedgeopt"), jetBase.pt(), dpt / jetBase.pt(), weight); + registry.fill(HIST("h2_jet_pt_mcp_jet_pt_ratio_matchedgeopt"), jetTag.pt(), jetBase.pt() / jetTag.pt(), weight); } } } @@ -388,10 +449,10 @@ struct JetSpectraCharged { double corrTagjetpt = jetTag.pt() - (mcrho * jetTag.area()); double corrBasejetpt = jetBase.pt() - (rho * jetBase.area()); double dcorrpt = corrTagjetpt - corrBasejetpt; - registry.fill(HIST("h2_reco_jet_corr_pt_gen_jet_corr_pt_matchedgeo"), corrBasejetpt, corrTagjetpt, weight); - registry.fill(HIST("h2_gen_jet_corr_pt_jet_pt_diff_corr_matchedgeo"), corrTagjetpt, dcorrpt / corrTagjetpt, weight); - registry.fill(HIST("h2_reco_jet_corr_pt_jet_pt_diff_corr_matchedgeo"), corrBasejetpt, dcorrpt / corrBasejetpt, weight); - registry.fill(HIST("h2_gen_jet_corr_pt_jet_corr_pt_ratio_matchedgeo"), corrTagjetpt, corrBasejetpt / corrTagjetpt, weight); + registry.fill(HIST("h2_mcd_jet_pt_mcp_jet_pt_matchedgeo_rhoareasubtracted"), corrBasejetpt, corrTagjetpt, weight); + registry.fill(HIST("h2_mcp_jet_pt_jet_pt_diff_matchedgeo_rhoareasubtracted"), corrTagjetpt, dcorrpt / corrTagjetpt, weight); + registry.fill(HIST("h2_mcd_jet_pt_jet_pt_diff_matchedgeo_rhoareasubtracted"), corrBasejetpt, dcorrpt / corrBasejetpt, weight); + registry.fill(HIST("h2_mcp_jet_pt_jet_pt_ratio_matchedgeo_rhoareasubtracted"), corrTagjetpt, corrBasejetpt / corrTagjetpt, weight); } } } @@ -449,7 +510,7 @@ struct JetSpectraCharged { } PROCESS_SWITCH(JetSpectraCharged, processQCWeighted, "weighted collsions and tracks QC for MC", false); - void processSpectraData(soa::Filtered>::iterator const& collision, + void processSpectraData(soa::Filtered::iterator const& collision, soa::Join const& jets, aod::JetTracks const&) { @@ -466,12 +527,12 @@ struct JetSpectraCharged { if (!isAcceptedJet(jet)) { continue; } - fillJetHistograms(jet, collision.centrality(), collision.rho()); + fillJetHistograms(jet, collision.centrality()); } } PROCESS_SWITCH(JetSpectraCharged, processSpectraData, "jet spectra for Data", false); - void processSpectraMCD(soa::Filtered>::iterator const& collision, + void processSpectraMCD(soa::Filtered::iterator const& collision, soa::Join const& jets, aod::JetTracks const&) { @@ -488,12 +549,56 @@ struct JetSpectraCharged { if (!isAcceptedJet(jet)) { continue; } - fillJetHistograms(jet, collision.centrality(), collision.rho()); + fillJetHistograms(jet, collision.centrality()); + } + } + PROCESS_SWITCH(JetSpectraCharged, processSpectraMCD, "jet spectra for MCD", false); + + void processSpectraAreaSubData(soa::Filtered>::iterator const& collision, + soa::Join const& jets, + aod::JetTracks const&) + { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + return; + } + if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { + return; + } + for (auto const& jet : jets) { + if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + if (!isAcceptedJet(jet)) { + continue; + } + fillJetAreaSubHistograms(jet, collision.centrality(), collision.rho()); + } + } + PROCESS_SWITCH(JetSpectraCharged, processSpectraAreaSubData, "jet spectra with rho-area subtraction for Data", false); + + void processSpectraAreaSubMCD(soa::Filtered>::iterator const& collision, + soa::Join const& jets, + aod::JetTracks const&) + { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + return; + } + if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { + return; + } + for (auto const& jet : jets) { + if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + if (!isAcceptedJet(jet)) { + continue; + } + fillJetAreaSubHistograms(jet, collision.centrality(), collision.rho()); } } - PROCESS_SWITCH(JetSpectraCharged, processSpectraMCD, "jet spectra for Data", false); + PROCESS_SWITCH(JetSpectraCharged, processSpectraAreaSubMCD, "jet spectra with rho-area subtraction for MCD", false); - void processSpectraMCDWeighted(soa::Filtered>::iterator const& collision, + void processSpectraMCDWeighted(soa::Filtered::iterator const& collision, soa::Join const& jets, aod::JetTracks const&) { @@ -517,22 +622,126 @@ struct JetSpectraCharged { } registry.fill(HIST("h_jet_phat"), pTHat); registry.fill(HIST("h_jet_phat_weighted"), pTHat, jetweight); - fillJetHistograms(jet, collision.centrality(), collision.rho(), jetweight); + fillJetHistograms(jet, collision.centrality(), jetweight); } } PROCESS_SWITCH(JetSpectraCharged, processSpectraMCDWeighted, "jet finder QA mcd with weighted events", false); - void processSpectraMCP(McParticleCollision::iterator const& mccollision, + void processSpectraAreaSubMCP(McParticleCollision::iterator const& mccollision, + soa::SmallGroups const& collisions, + soa::Join const& jets, + aod::JetParticles const&) + { + registry.fill(HIST("h_mcColl_counts_areasub"), 0.5); + if (std::abs(mccollision.posZ()) > vertexZCut) { + return; + } + registry.fill(HIST("h_mcColl_counts_areasub"), 1.5); + if (collisions.size() < 1) { + return; + } + registry.fill(HIST("h_mcColl_counts_areasub"), 2.5); + if (acceptSplitCollisions == 0 && collisions.size() > 1) { + return; + } + registry.fill(HIST("h_mcColl_counts_areasub"), 3.5); + + bool hasSel8Coll = false; + bool centralityIsGood = false; + bool occupancyIsGood = false; + if (acceptSplitCollisions == 2) { + if (jetderiveddatautilities::selectCollision(collisions.begin(), eventSelectionBits)) { + hasSel8Coll = true; + } + if ((centralityMin < collisions.begin().centrality()) && (collisions.begin().centrality() < centralityMax)) { + centralityIsGood = true; + } + if ((trackOccupancyInTimeRangeMin < collisions.begin().trackOccupancyInTimeRange()) && (collisions.begin().trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMax)) { + occupancyIsGood = true; + } + } else { + for (auto& collision : collisions) { + if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + hasSel8Coll = true; + } + if ((centralityMin < collision.centrality()) && (collision.centrality() < centralityMax)) { + centralityIsGood = true; + } + if ((trackOccupancyInTimeRangeMin < collision.trackOccupancyInTimeRange()) && (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMax)) { + occupancyIsGood = true; + } + } + } + if (!hasSel8Coll) { + return; + } + registry.fill(HIST("h_mcColl_counts_areasub"), 4.5); + + if (!centralityIsGood) { + return; + } + registry.fill(HIST("h_mcColl_counts_areasub"), 5.5); + + if (!occupancyIsGood) { + return; + } + registry.fill(HIST("h_mcColl_counts_areasub"), 6.5); + registry.fill(HIST("h_mcColl_rho"), mccollision.rho()); + for (auto const& jet : jets) { + if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + if (!isAcceptedJet(jet)) { + continue; + } + fillMCPAreaSubHistograms(jet, mccollision.rho()); + } + } + PROCESS_SWITCH(JetSpectraCharged, processSpectraAreaSubMCP, "jet spectra with area-based subtraction for MC particle level", false); + + void processSpectraMCP(aod::JetMcCollision const& mccollision, + soa::SmallGroups const& collisions, soa::Join const& jets, aod::JetParticles const&) { + registry.fill(HIST("h_mcColl_counts"), 0.5); if (std::abs(mccollision.posZ()) > vertexZCut) { return; } - registry.fill(HIST("h_mc_zvertex"), mccollision.posZ()); - if (doMCPJetSubtraction) { - registry.fill(HIST("h_mcp_rho"), mccollision.rho()); + registry.fill(HIST("h_mcColl_counts"), 1.5); + if (collisions.size() < 1) { + return; + } + registry.fill(HIST("h_mcColl_counts"), 2.5); + + bool hasSel8Coll = false; + bool centralityIsGood = false; + bool occupancyIsGood = false; + for (auto& collision : collisions) { + if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + hasSel8Coll = true; + } + if ((centralityMin < collision.centrality()) && (collision.centrality() < centralityMax)) { + centralityIsGood = true; + } + if ((trackOccupancyInTimeRangeMin < collision.trackOccupancyInTimeRange()) && (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMax)) { + occupancyIsGood = true; + } + } + if (!hasSel8Coll) { + return; + } + registry.fill(HIST("h_mcColl_counts"), 3.5); + if (!centralityIsGood) { + return; } + registry.fill(HIST("h_mcColl_counts"), 4.5); + if (!occupancyIsGood) { + return; + } + registry.fill(HIST("h_mcColl_counts"), 5.5); + registry.fill(HIST("h_mc_zvertex"), mccollision.posZ()); + for (auto const& jet : jets) { if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { continue; @@ -540,23 +749,38 @@ struct JetSpectraCharged { if (!isAcceptedJet(jet)) { continue; } - if (doMCPJetSubtraction) { - fillMCPHistograms(jet, mccollision.rho()); - } else { - fillMCPHistograms(jet); - } + fillMCPHistograms(jet); } } PROCESS_SWITCH(JetSpectraCharged, processSpectraMCP, "jet spectra for MC particle level", false); - void processSpectraMCPWeighted(aod::JetMcCollisions::iterator const& mccollision, + void processSpectraMCPWeighted(aod::JetMcCollision const& mccollision, + soa::SmallGroups const& collisions, soa::Join const& jets, aod::JetParticles const&) { - if (!(std::abs(mccollision.posZ()) < vertexZCut)) { + registry.fill(HIST("h_mcColl_counts"), 0.5); + if (std::abs(mccollision.posZ()) > vertexZCut) { + return; + } + registry.fill(HIST("h_mcColl_counts"), 1.5); + if (collisions.size() < 1) { + return; + } + registry.fill(HIST("h_mcColl_counts"), 2.5); + + bool hasSel8Coll = false; + for (auto& collision : collisions) { + if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + hasSel8Coll = true; + } + } + if (!hasSel8Coll) { return; } + registry.fill(HIST("h_mcColl_counts"), 3.5); registry.fill(HIST("h_mc_zvertex"), mccollision.posZ()); + for (auto const& jet : jets) { if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { continue; @@ -568,11 +792,11 @@ struct JetSpectraCharged { double pTHat = 10. / (std::pow(jetweight, 1.0 / pTHatExponent)); for (int N = 1; N < 21; N++) { if (jet.pt() < N * 0.25 * pTHat && jet.r() == round(selectedJetsRadius * 100.0f)) { - registry.fill(HIST("h2_mcp_jet_ptcut_part"), jet.pt(), N * 0.25, jetweight); + registry.fill(HIST("h2_jet_ptcut_part"), jet.pt(), N * 0.25, jetweight); } } - registry.fill(HIST("h_mcp_jet_phat_weighted"), pTHat, jetweight); - fillMCPHistograms(jet, 0.0, jetweight); + registry.fill(HIST("h_jet_phat_part_weighted"), pTHat, jetweight); + fillMCPHistograms(jet, jetweight); } } PROCESS_SWITCH(JetSpectraCharged, processSpectraMCPWeighted, "jet spectra for MC particle level weighted", false); @@ -708,11 +932,7 @@ struct JetSpectraCharged { if (!isAcceptedJet(mcdjet)) { continue; } - if (doMCPJetSubtraction) { - fillGeoMatchedCorrHistograms(mcdjet, collision.rho(), mcrho); - } else { - fillGeoMatchedCorrHistograms(mcdjet, collision.rho()); - } + fillGeoMatchedCorrHistograms(mcdjet, collision.rho()); } } } From 2bf5ef6df62193d6a0e6795afc685745ec361aaf Mon Sep 17 00:00:00 2001 From: Pritam Chakraborty <47203359+prchakra@users.noreply.github.com> Date: Wed, 19 Feb 2025 22:02:14 +0100 Subject: [PATCH 0325/1650] [PWGCF] FemtoUnivserse: Adding function for PID misidentification (#10094) Co-authored-by: ALICE Action Bot --- .../Core/FemtoUniverseParticleHisto.h | 68 ++++++++++++++++++- ...ersePairTaskTrackTrack3DMultKtExtended.cxx | 5 +- 2 files changed, 70 insertions(+), 3 deletions(-) diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h index 9061eff1648..d54876cee27 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h @@ -138,7 +138,7 @@ class FemtoUniverseParticleHisto if constexpr (mParticleType == o2::aod::femtouniverseparticle::ParticleType::kTrack || mParticleType == o2::aod::femtouniverseparticle::ParticleType::kV0Child || mParticleType == o2::aod::femtouniverseparticle::ParticleType::kCascadeBachelor || mParticleType == o2::aod::femtouniverseparticle::ParticleType::kMCTruthTrack) { /// Track histograms mHistogramRegistry->add((folderName + folderSuffix + "/hPDG").c_str(), "; PDG; Entries", kTH1I, {{6001, -3000, 3000}}); - mHistogramRegistry->add((folderName + folderSuffix + "/hOrigin_MC").c_str(), "; Origin; Entries", kTH1I, {{7, 0, 7}}); + mHistogramRegistry->add((folderName + folderSuffix + "/hOrigin_MC").c_str(), "; Origin; Entries", kTH1I, {{100, 0, 100}}); mHistogramRegistry->add((folderName + folderSuffix + "/hNoMCtruthCounter").c_str(), "; Counter; Entries", kTH1I, {{1, 0, 1}}); // DCA plots mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_Material").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); @@ -147,6 +147,8 @@ class FemtoUniverseParticleHisto mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_DaughterSigmaplus").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_Primary").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_Daughter").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); + mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_NoMCTruthOrigin").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); + mHistogramRegistry->add((folderName + folderSuffix + "/hMisidentification").c_str(), "; #it{p}_{T} (GeV/#it{c}); Particle; Particle", kTH3F, {{4, 0, 4}, {4, 0, 4}, tempFitVarpTAxis}); } else if constexpr (mParticleType == o2::aod::femtouniverseparticle::ParticleType::kV0) { /// V0 histograms /// to be implemented @@ -338,6 +340,10 @@ class FemtoUniverseParticleHisto mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_DaughterSigmaplus"), part.pt(), part.tempFitVar()); break; + case (99): + mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_NoMCTruthOrigin"), + part.pt(), part.tempFitVar()); + break; default: LOG(fatal) << "femtouniverseparticleMC: not known value for ParticleOriginMCTruth - please check. Quitting!"; } @@ -355,6 +361,39 @@ class FemtoUniverseParticleHisto } } + template + void fillQA_MC_MisIden(T const& part, int pdgcode, int confPDG, H const& histFolder) // o2-linter: disable=name/function-variable + { + if (mHistogramRegistry) { + if constexpr (mParticleType == o2::aod::femtouniverseparticle::ParticleType::kTrack) { + if (confPDG == mConfPDGCodePart[0]) { + PDGbin = 0; + } else if (confPDG == mConfPDGCodePart[1]) { + PDGbin = 1; + } else if (confPDG == mConfPDGCodePart[2]) { + PDGbin = 2; + } else { + PDGbin = 3; + } + if (std::abs(pdgcode) == 211) { + mHistogramRegistry->fill(histFolder + HIST("_MC/hMisidentification"), + PDGbin, 0, part.pt()); + } else if (std::abs(pdgcode) == 321) { + mHistogramRegistry->fill(histFolder + HIST("_MC/hMisidentification"), + PDGbin, 1, part.pt()); + } else if (std::abs(pdgcode) == 2212) { + mHistogramRegistry->fill(histFolder + HIST("_MC/hMisidentification"), + PDGbin, 2, part.pt()); + } else { + mHistogramRegistry->fill(histFolder + HIST("_MC/hMisidentification"), + PDGbin, 3, part.pt()); + } + } + } else { + LOG(fatal) << "FemtoUniverseParticleHisto: Histogramming for requested object not defined - quitting!"; + } + } + /// Templated function to fill particle histograms for data/ Monte Carlo reconstructed and Monte Carlo truth /// Always calls fillQA_base fill histogramms with data/ Monte Carlo reconstructed /// In case of Monte Carlo, calls fillQA_base with Monte Carlo truth info and specialized function fillQA_MC for additional histogramms @@ -387,12 +426,39 @@ class FemtoUniverseParticleHisto } } + /// Templated function to fill particle histograms for data/ Monte Carlo reconstructed and Monte Carlo truth + /// Always calls fillQA_base fill histogramms with data/ Monte Carlo reconstructed + /// In case of Monte Carlo, calls fillQA_base with Monte Carlo truth info and specialized function fillQA_MC for additional histogramms + /// \tparam T particle type + /// \tparam isMC fills the additional histograms for Monte Carlo truth + /// \param part particle for which the histograms should be filled + template + void fillQAMisIden(T const& part, int confPDG) + { + fillQABaseMisiden(part, HIST(o2::aod::femtouniverseparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]), confPDG); + } + + template + void fillQABaseMisiden(T const& part, H const& histFolder, int confPDG) + { + std::string tempFitVarName; + if (mHistogramRegistry) { + if constexpr (isMC) { + if (part.has_fdMCParticle()) { + fillQA_MC_MisIden(part, (part.fdMCParticle()).pdgMCTruth(), confPDG, histFolder); + } + } + } + } + private: HistogramRegistry* mHistogramRegistry; ///< For QA output static constexpr o2::aod::femtouniverseparticle::ParticleType mParticleType = particleType; ///< Type of the particle under analysis // o2-linter: disable=name/constexpr-constant static constexpr int mFolderSuffixType = suffixType; ///< Counter for the folder suffix specified below // o2-linter: disable=name/constexpr-constant static constexpr std::string_view mFolderSuffix[5] = {"", "_one", "_two", "_pos", "_neg"}; ///< Suffix for the folder name in case of analyses of pairs of the same kind (T-T, V-V, C-C) // o2-linter: disable=name/constexpr-constant + int mConfPDGCodePart[4] = {211, 321, 2212, 9999}; ///< PDG code as per analysis int mPDG = 0; ///< PDG code of the selected particle + int PDGbin = 0; }; } // namespace o2::analysis::femto_universe diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack3DMultKtExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack3DMultKtExtended.cxx index 5a3c67cf461..066469bd0e9 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack3DMultKtExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack3DMultKtExtended.cxx @@ -462,6 +462,7 @@ struct femtoUniversePairTaskTrackTrack3DMultKtExtended { continue; } trackHistoPartOne.fillQA(part); + trackHistoPartOne.fillQAMisIden(part, trackonefilter.ConfPDGCodePartOne); } } @@ -667,7 +668,7 @@ struct femtoUniversePairTaskTrackTrack3DMultKtExtended { doSameEvent(thegroupPartsOne, thegroupPartsTwo, parts, col.magField(), col.multV0M(), 1, fillQA); } if (cfgProcessPP) { - doSameEvent(thegroupPartsOne, thegroupPartsOne, parts, col.magField(), col.multV0M(), 2, fillQA, mcparts); + doSameEvent(thegroupPartsOne, thegroupPartsOne, parts, col.magField(), col.multV0M(), 2, fillQA, mcparts); } if (cfgProcessMM) { doSameEvent(thegroupPartsTwo, thegroupPartsTwo, parts, col.magField(), col.multV0M(), 3, fillQA); @@ -677,7 +678,7 @@ struct femtoUniversePairTaskTrackTrack3DMultKtExtended { doSameEvent(thegroupPartsOne, thegroupPartsTwo, parts, col.magField(), col.multNtr(), 1, fillQA); } if (cfgProcessPP) { - doSameEvent(thegroupPartsOne, thegroupPartsOne, parts, col.magField(), col.multNtr(), 2, fillQA, mcparts); + doSameEvent(thegroupPartsOne, thegroupPartsOne, parts, col.magField(), col.multNtr(), 2, fillQA, mcparts); } if (cfgProcessMM) { doSameEvent(thegroupPartsTwo, thegroupPartsTwo, parts, col.magField(), col.multNtr(), 3, fillQA); From ba3eb59baa47678eca591b6a7d70529b7fbe32e3 Mon Sep 17 00:00:00 2001 From: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> Date: Wed, 19 Feb 2025 22:13:24 +0100 Subject: [PATCH 0326/1650] [PWGLF] Allows derived data production of Run 2 converted data (#10089) --- PWGLF/DataModel/LFStrangenessTables.h | 21 +- .../Strangeness/strangederivedbuilder.cxx | 171 +++-- .../derivedlambdakzeroanalysis.cxx | 685 ++++++++++++------ 3 files changed, 580 insertions(+), 297 deletions(-) diff --git a/PWGLF/DataModel/LFStrangenessTables.h b/PWGLF/DataModel/LFStrangenessTables.h index 01e5767a67a..8197a9899f2 100644 --- a/PWGLF/DataModel/LFStrangenessTables.h +++ b/PWGLF/DataModel/LFStrangenessTables.h @@ -66,11 +66,16 @@ DECLARE_SOA_TABLE(StraCollisions, "AOD", "STRACOLLISION", //! basic collision pr DECLARE_SOA_TABLE(StraCents_000, "AOD", "STRACENTS", //! centrality percentiles cent::CentFT0M, cent::CentFT0A, cent::CentFT0C, cent::CentFV0A); -DECLARE_SOA_TABLE_VERSIONED(StraCents_001, "AOD", "STRACENTS", 1, //! centrality percentiles +DECLARE_SOA_TABLE_VERSIONED(StraCents_001, "AOD", "STRACENTS", 1, //! centrality percentiles in Run 3 cent::CentFT0M, cent::CentFT0A, cent::CentFT0C, cent::CentFV0A, cent::CentFT0CVariant1, cent::CentMFT, cent::CentNGlobal); + +DECLARE_SOA_TABLE(StraCentsRun2, "AOD", "STRACENTSRUN2", //! centrality percentiles in Run 2 + cent::CentRun2V0M, cent::CentRun2V0A, + cent::CentRun2SPDTracklets, cent::CentRun2SPDClusters); + // !!! DEPRECATED TABLE: StraRawCents_000 !!! All info in StraEvSels_001, in order to group all event characteristics in a unique table. Please use StraEvSels_001 DECLARE_SOA_TABLE(StraRawCents_000, "AOD", "STRARAWCENTS", //! debug information mult::MultFT0A, mult::MultFT0C, mult::MultFV0A, mult::MultNTracksPVeta1); @@ -221,6 +226,20 @@ DECLARE_SOA_TABLE_VERSIONED(StraEvSels_004, "AOD", "STRAEVSELS", 4, //! // stracollision::EnergyCommonZNC, stracollision::IsUPC); +DECLARE_SOA_TABLE(StraEvSelsRun2, "AOD", "STRAEVSELSRUN2", //! debug information + evsel::Sel8, evsel::Sel7, evsel::Selection, //! event selection: sel8 + mult::MultFT0A, mult::MultFT0C, mult::MultFV0A, // FIT detectors + mult::MultFDDA, mult::MultFDDC, + mult::MultNTracksPVeta1, // track multiplicities with eta cut for INEL>0 + mult::MultPVTotalContributors, // number of PV contribs total + mult::MultNTracksGlobal, // global track multiplicities + mult::MultNTracksITSTPC, // track multiplicities, PV contribs, no eta cut + mult::MultAllTracksTPCOnly, // TPConly track multiplicities, all, no eta cut + mult::MultAllTracksITSTPC, // ITSTPC track multiplicities, all, no eta cut + mult::MultZNA, mult::MultZNC, mult::MultZEM1, // ZDC signals + mult::MultZEM2, mult::MultZPA, mult::MultZPC, + evsel::Alias); // trigger aliases (e.g. kTVXinTRD for v2) + DECLARE_SOA_TABLE(StraFT0AQVs, "AOD", "STRAFT0AQVS", //! t0a Qvec qvec::QvecFT0ARe, qvec::QvecFT0AIm, qvec::SumAmplFT0A); DECLARE_SOA_TABLE(StraFT0CQVs, "AOD", "STRAFT0CQVS", //! t0c Qvec diff --git a/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx index 21c4408388e..93bd842c5ac 100644 --- a/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx @@ -76,8 +76,10 @@ struct strangederivedbuilder { Produces strangeCollLabels; // characterises collisions Produces strangeMCColl; // characterises collisions / MC Produces strangeMCMults; // characterises collisions / MC mults - Produces strangeCents; // characterises collisions / centrality - Produces strangeEvSels; // characterises collisions / centrality / sel8 selection + Produces strangeCents; // characterises collisions / centrality in Run 3 + Produces strangeCentsRun2; // characterises collisions / centrality in Run 2 + Produces strangeEvSels; // characterises collisions / centrality / sel8 selection in Run 3 + Produces strangeEvSelsRun2; // characterises collisions / centrality / sel8 selection in Run 2 Produces strangeStamps; // provides timestamps, run numbers Produces v0collref; // references collisions from V0s Produces casccollref; // references collisions from cascades @@ -225,10 +227,12 @@ struct strangederivedbuilder { void init(InitContext&) { LOGF(info, "Initializing now: cross-checking correctness..."); - if (doprocessCollisions + - doprocessCollisionsWithUD + - doprocessCollisionsWithMC + - doprocessCollisionsWithUDWithMC > + if (doprocessCollisionsRun3 + + doprocessCollisionsRun3WithUD + + doprocessCollisionsRun3WithMC + + doprocessCollisionsRun3WithUDWithMC + + doprocessCollisionsRun2 + + doprocessCollisionsRun2WithMC > 1) { LOGF(fatal, "You have enabled more than one process function associated to collisions. Please check your configuration! Aborting now."); } @@ -248,17 +252,23 @@ struct strangederivedbuilder { } // collision processing printout - if (doprocessCollisions) { - LOGF(info, "Collision processing type.........: no UD, no MC"); + if (doprocessCollisionsRun3) { + LOGF(info, "Collision processing type.........: Run 3, no UD, no MC"); } - if (doprocessCollisionsWithUD) { - LOGF(info, "Collision processing type.........: with UD, no MC"); + if (doprocessCollisionsRun3WithUD) { + LOGF(info, "Collision processing type.........: Run 3, with UD, no MC"); } - if (doprocessCollisionsWithMC) { - LOGF(info, "Collision processing type.........: with MC, no UD"); + if (doprocessCollisionsRun3WithMC) { + LOGF(info, "Collision processing type.........: Run 3, with MC, no UD"); } - if (doprocessCollisionsWithUDWithMC) { - LOGF(info, "Collision processing type.........: with MC, with UD"); + if (doprocessCollisionsRun3WithUDWithMC) { + LOGF(info, "Collision processing type.........: Run 3, with MC, with UD"); + } + if (doprocessCollisionsRun2) { + LOGF(info, "Collision processing type.........: Run 2, no UD, no MC"); + } + if (doprocessCollisionsRun2WithMC) { + LOGF(info, "Collision processing type.........: Run 2, with MC, no UD"); } LOGF(info, "====] event characterization processing [========================="); @@ -433,12 +443,6 @@ struct strangederivedbuilder { for (const auto& collision : collisions) { const uint64_t collIdx = collision.globalIndex(); - float centrality = collision.centFT0C(); - if (qaCentrality) { - auto hRawCentrality = histos.get(HIST("hRawCentrality")); - centrality = hRawCentrality->GetBinContent(hRawCentrality->FindBin(collision.multFT0C())); - } - auto V0Table_thisColl = V0s.sliceBy(V0perCollision, collIdx); auto CascTable_thisColl = Cascades.sliceBy(CascperCollision, collIdx); auto KFCascTable_thisColl = KFCascades.sliceBy(KFCascperCollision, collIdx); @@ -489,42 +493,73 @@ struct strangederivedbuilder { // +-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+-<*>-+ // fill collision tables if (strange || fillEmptyCollisions) { + strangeStamps(bc.runNumber(), bc.timestamp(), bc.globalBC()); strangeColl(collision.posX(), collision.posY(), collision.posZ()); if constexpr (requires { collision.mcCollisionId(); }) { // check if MC information is available and if so fill labels strangeCollLabels(collision.mcCollisionId()); } - strangeCents(collision.centFT0M(), collision.centFT0A(), - centrality, collision.centFV0A(), collision.centFT0CVariant1(), - collision.centMFT(), collision.centNGlobal()); - strangeEvSels(collision.sel8(), collision.selection_raw(), - collision.multFT0A() * static_cast(fillTruncationOptions.fillRawFT0A), - collision.multFT0C() * static_cast(fillTruncationOptions.fillRawFT0C), - collision.multFV0A() * static_cast(fillTruncationOptions.fillRawFV0A), - collision.multFDDA() * static_cast(fillTruncationOptions.fillRawFDDA), - collision.multFDDC() * static_cast(fillTruncationOptions.fillRawFDDC), - collision.multNTracksPVeta1() * static_cast(fillTruncationOptions.fillRawNTracksEta1), - collision.multPVTotalContributors() * static_cast(fillTruncationOptions.fillRawNTracksForCorrelation), - collision.multNTracksGlobal() * static_cast(fillTruncationOptions.fillRawNTracksForCorrelation), - collision.multNTracksITSTPC() * static_cast(fillTruncationOptions.fillRawNTracksForCorrelation), - collision.multAllTracksTPCOnly() * static_cast(fillTruncationOptions.fillRawNTracksForCorrelation), - collision.multAllTracksITSTPC() * static_cast(fillTruncationOptions.fillRawNTracksForCorrelation), - collision.multZNA() * static_cast(fillTruncationOptions.fillRawZDC), - collision.multZNC() * static_cast(fillTruncationOptions.fillRawZDC), - collision.multZEM1() * static_cast(fillTruncationOptions.fillRawZDC), - collision.multZEM2() * static_cast(fillTruncationOptions.fillRawZDC), - collision.multZPA() * static_cast(fillTruncationOptions.fillRawZDC), - collision.multZPC() * static_cast(fillTruncationOptions.fillRawZDC), - collision.trackOccupancyInTimeRange(), - collision.ft0cOccupancyInTimeRange(), - // UPC info - gapSide, - totalFT0AmplitudeA, totalFT0AmplitudeC, totalFV0AmplitudeA, - totalFDDAmplitudeA, totalFDDAmplitudeC, - energyCommonZNA, energyCommonZNC, - // Collision flags - collision.flags(), - collision.alias_raw()); - strangeStamps(bc.runNumber(), bc.timestamp(), bc.globalBC()); + + if constexpr (requires { collision.centFT0C(); }) { // check if we are in Run 3 + float centrality = collision.centFT0C(); + if (qaCentrality) { + auto hRawCentrality = histos.get(HIST("hRawCentrality")); + centrality = hRawCentrality->GetBinContent(hRawCentrality->FindBin(collision.multFT0C())); + } + + strangeCents(collision.centFT0M(), collision.centFT0A(), + centrality, collision.centFV0A(), collision.centFT0CVariant1(), + collision.centMFT(), collision.centNGlobal()); + strangeEvSels(collision.sel8(), collision.selection_raw(), + collision.multFT0A() * static_cast(fillTruncationOptions.fillRawFT0A), + collision.multFT0C() * static_cast(fillTruncationOptions.fillRawFT0C), + collision.multFV0A() * static_cast(fillTruncationOptions.fillRawFV0A), + collision.multFDDA() * static_cast(fillTruncationOptions.fillRawFDDA), + collision.multFDDC() * static_cast(fillTruncationOptions.fillRawFDDC), + collision.multNTracksPVeta1() * static_cast(fillTruncationOptions.fillRawNTracksEta1), + collision.multPVTotalContributors() * static_cast(fillTruncationOptions.fillRawNTracksForCorrelation), + collision.multNTracksGlobal() * static_cast(fillTruncationOptions.fillRawNTracksForCorrelation), + collision.multNTracksITSTPC() * static_cast(fillTruncationOptions.fillRawNTracksForCorrelation), + collision.multAllTracksTPCOnly() * static_cast(fillTruncationOptions.fillRawNTracksForCorrelation), + collision.multAllTracksITSTPC() * static_cast(fillTruncationOptions.fillRawNTracksForCorrelation), + collision.multZNA() * static_cast(fillTruncationOptions.fillRawZDC), + collision.multZNC() * static_cast(fillTruncationOptions.fillRawZDC), + collision.multZEM1() * static_cast(fillTruncationOptions.fillRawZDC), + collision.multZEM2() * static_cast(fillTruncationOptions.fillRawZDC), + collision.multZPA() * static_cast(fillTruncationOptions.fillRawZDC), + collision.multZPC() * static_cast(fillTruncationOptions.fillRawZDC), + collision.trackOccupancyInTimeRange(), + collision.ft0cOccupancyInTimeRange(), + // UPC info + gapSide, + totalFT0AmplitudeA, totalFT0AmplitudeC, totalFV0AmplitudeA, + totalFDDAmplitudeA, totalFDDAmplitudeC, + energyCommonZNA, energyCommonZNC, + // Collision flags + collision.flags(), + collision.alias_raw()); + } else { // We are in Run 2 + strangeCentsRun2(collision.centRun2V0M(), collision.centRun2V0A(), + collision.centRun2SPDTracklets(), collision.centRun2SPDClusters()); + strangeEvSelsRun2(collision.sel8(), collision.sel7(), collision.selection_raw(), + collision.multFT0A() * static_cast(fillTruncationOptions.fillRawFT0A), + collision.multFT0C() * static_cast(fillTruncationOptions.fillRawFT0C), + collision.multFV0A() * static_cast(fillTruncationOptions.fillRawFV0A), + collision.multFDDA() * static_cast(fillTruncationOptions.fillRawFDDA), + collision.multFDDC() * static_cast(fillTruncationOptions.fillRawFDDC), + collision.multNTracksPVeta1() * static_cast(fillTruncationOptions.fillRawNTracksEta1), + -1, /* dummy number of PV contribs total while waiting for the multiplicity task to produce it */ + -1, /* dummy global track multiplicities while waiting for the multiplicity task to produce it */ + -1, /* dummy track multiplicities, PV contribs, no eta cut while waiting for the multiplicity task to produce it */ + -1, /* dummy TPConly track multiplicities, all, no eta cut while waiting for the multiplicity task to produce it */ + -1, /* dummy ITSTPC track multiplicities, all, no eta cut waiting for the multiplicity task to produce it */ + collision.multZNA() * static_cast(fillTruncationOptions.fillRawZDC), + collision.multZNC() * static_cast(fillTruncationOptions.fillRawZDC), + collision.multZEM1() * static_cast(fillTruncationOptions.fillRawZDC), + collision.multZEM2() * static_cast(fillTruncationOptions.fillRawZDC), + collision.multZPA() * static_cast(fillTruncationOptions.fillRawZDC), + collision.multZPC() * static_cast(fillTruncationOptions.fillRawZDC), + collision.alias_raw()); + } } for (const auto& v0 : V0Table_thisColl) V0CollIndices[v0.globalIndex()] = strangeColl.lastIndex(); @@ -592,28 +627,39 @@ struct strangederivedbuilder { } } - void processCollisions(soa::Join const& collisions, aod::V0Datas const& V0s, aod::CascDatas const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, aod::BCsWithTimestamps const& /*bcs*/) + void processCollisionsRun3(soa::Join const& collisions, aod::V0Datas const& V0s, aod::CascDatas const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, aod::BCsWithTimestamps const& /*bcs*/) { populateCollisionTables(collisions, collisions, V0s, Cascades, KFCascades, TraCascades); } - void processCollisionsWithUD(soa::Join const& collisions, aod::V0Datas const& V0s, aod::CascDatas const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, aod::BCsWithTimestamps const& /*bcs*/, UDCollisionsFull const& udCollisions) + void processCollisionsRun3WithUD(soa::Join const& collisions, aod::V0Datas const& V0s, aod::CascDatas const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, aod::BCsWithTimestamps const& /*bcs*/, UDCollisionsFull const& udCollisions) { populateCollisionTables(collisions, udCollisions, V0s, Cascades, KFCascades, TraCascades); } - void processCollisionsWithMC(soa::Join const& collisions, soa::Join const& V0s, soa::Join const& /*V0MCCores*/, soa::Join const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, aod::BCsWithTimestamps const& /*bcs*/, soa::Join const& mcCollisions, aod::McParticles const& mcParticles) + void processCollisionsRun3WithMC(soa::Join const& collisions, soa::Join const& V0s, soa::Join const& /*V0MCCores*/, soa::Join const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, aod::BCsWithTimestamps const& /*bcs*/, soa::Join const& mcCollisions, aod::McParticles const& mcParticles) { populateMCCollisionTable(mcCollisions, mcParticles); populateCollisionTables(collisions, collisions, V0s, Cascades, KFCascades, TraCascades); } - void processCollisionsWithUDWithMC(soa::Join const& collisions, soa::Join const& V0s, soa::Join const& /*V0MCCores*/, soa::Join const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, aod::BCsWithTimestamps const& /*bcs*/, UDCollisionsFull const& udCollisions, soa::Join const& mcCollisions, aod::McParticles const& mcParticles) + void processCollisionsRun3WithUDWithMC(soa::Join const& collisions, soa::Join const& V0s, soa::Join const& /*V0MCCores*/, soa::Join const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, aod::BCsWithTimestamps const& /*bcs*/, UDCollisionsFull const& udCollisions, soa::Join const& mcCollisions, aod::McParticles const& mcParticles) { populateMCCollisionTable(mcCollisions, mcParticles); populateCollisionTables(collisions, udCollisions, V0s, Cascades, KFCascades, TraCascades); } + void processCollisionsRun2(soa::Join const& collisions, aod::V0Datas const& V0s, aod::CascDatas const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, aod::BCsWithTimestamps const& /*bcs*/) + { + populateCollisionTables(collisions, collisions, V0s, Cascades, KFCascades, TraCascades); + } + + void processCollisionsRun2WithMC(soa::Join const& collisions, soa::Join const& V0s, soa::Join const& /*V0MCCores*/, soa::Join const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, aod::BCsWithTimestamps const& /*bcs*/, soa::Join const& mcCollisions, aod::McParticles const& mcParticles) + { + populateMCCollisionTable(mcCollisions, mcParticles); + populateCollisionTables(collisions, collisions, V0s, Cascades, KFCascades, TraCascades); + } + void processTrackExtrasV0sOnly(aod::V0Datas const& V0s, TracksWithExtra const& tracksExtra) { std::vector trackMap(tracksExtra.size(), -1); // index -1: not used @@ -1070,11 +1116,14 @@ struct strangederivedbuilder { // debug processing PROCESS_SWITCH(strangederivedbuilder, processDataframeIDs, "Produce data frame ID tags", false); - // collision processing - PROCESS_SWITCH(strangederivedbuilder, processCollisions, "Produce collisions", true); - PROCESS_SWITCH(strangederivedbuilder, processCollisionsWithUD, "Produce collisions with UD info", true); - PROCESS_SWITCH(strangederivedbuilder, processCollisionsWithMC, "Produce collisions with MC info", true); - PROCESS_SWITCH(strangederivedbuilder, processCollisionsWithUDWithMC, "Produce collisions with UD + MC info", true); + // Run 3: collision processing + PROCESS_SWITCH(strangederivedbuilder, processCollisionsRun3, "Produce collisions (Run 3)", true); + PROCESS_SWITCH(strangederivedbuilder, processCollisionsRun3WithUD, "Produce collisions (Run 3) with UD info", true); + PROCESS_SWITCH(strangederivedbuilder, processCollisionsRun3WithMC, "Produce collisions (Run 3) with MC info", true); + PROCESS_SWITCH(strangederivedbuilder, processCollisionsRun3WithUDWithMC, "Produce collisions (Run 3) with UD + MC info", true); + // Run 2: collision processing + PROCESS_SWITCH(strangederivedbuilder, processCollisionsRun2, "Produce collisions (Run2)", false); + PROCESS_SWITCH(strangederivedbuilder, processCollisionsRun2WithMC, "Produce collisions (Run 2) with MC info", false); // detailed information processing PROCESS_SWITCH(strangederivedbuilder, processTrackExtrasV0sOnly, "Produce track extra information (V0s only)", true); diff --git a/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx b/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx index 437bae703e5..8062f74ef9e 100644 --- a/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx @@ -74,6 +74,8 @@ using v0MCCandidates = soa::Join analyseK0Short{"analyseK0Short", true, "process K0Short-like candidates"}; Configurable analyseLambda{"analyseLambda", true, "process Lambda-like candidates"}; @@ -86,19 +88,18 @@ struct derivedlambdakzeroanalysis { struct : ConfigurableGroup { Configurable requireSel8{"requireSel8", true, "require sel8 event selection"}; Configurable requireTriggerTVX{"requireTriggerTVX", true, "require FT0 vertex (acceptable FT0C-FT0A time difference) at trigger level"}; - Configurable rejectITSROFBorder{"rejectITSROFBorder", true, "reject events at ITS ROF border"}; - Configurable rejectTFBorder{"rejectTFBorder", true, "reject events at TF border"}; - Configurable requireIsVertexITSTPC{"requireIsVertexITSTPC", false, "require events with at least one ITS-TPC track"}; - Configurable requireIsGoodZvtxFT0VsPV{"requireIsGoodZvtxFT0VsPV", true, "require events with PV position along z consistent (within 1 cm) between PV reconstructed using tracks and PV using FT0 A-C time difference"}; - Configurable requireIsVertexTOFmatched{"requireIsVertexTOFmatched", false, "require events with at least one of vertex contributors matched to TOF"}; - Configurable requireIsVertexTRDmatched{"requireIsVertexTRDmatched", false, "require events with at least one of vertex contributors matched to TRD"}; - Configurable rejectSameBunchPileup{"rejectSameBunchPileup", true, "reject collisions in case of pileup with another collision in the same foundBC"}; - Configurable requireNoCollInTimeRangeStd{"requireNoCollInTimeRangeStd", false, "reject collisions corrupted by the cannibalism, with other collisions within +/- 2 microseconds or mult above a certain threshold in -4 - -2 microseconds"}; - Configurable requireNoCollInTimeRangeStrict{"requireNoCollInTimeRangeStrict", false, "reject collisions corrupted by the cannibalism, with other collisions within +/- 10 microseconds"}; - Configurable requireNoCollInTimeRangeNarrow{"requireNoCollInTimeRangeNarrow", false, "reject collisions corrupted by the cannibalism, with other collisions within +/- 2 microseconds"}; - Configurable requireNoCollInTimeRangeVzDep{"requireNoCollInTimeRangeVzDep", false, "reject collisions corrupted by the cannibalism, with other collisions with pvZ of drifting TPC tracks from past/future collisions within 2.5 cm the current pvZ"}; - Configurable requireNoCollInROFStd{"requireNoCollInROFStd", false, "reject collisions corrupted by the cannibalism, with other collisions within the same ITS ROF with mult. above a certain threshold"}; - Configurable requireNoCollInROFStrict{"requireNoCollInROFStrict", false, "reject collisions corrupted by the cannibalism, with other collisions within the same ITS ROF"}; + Configurable rejectITSROFBorder{"rejectITSROFBorder", true, "reject events at ITS ROF border (Run 3 only)"}; + Configurable rejectTFBorder{"rejectTFBorder", true, "reject events at TF border (Run 3 only)"}; + Configurable requireIsVertexITSTPC{"requireIsVertexITSTPC", false, "require events with at least one ITS-TPC track (Run 3 only)"}; + Configurable requireIsGoodZvtxFT0VsPV{"requireIsGoodZvtxFT0VsPV", true, "require events with PV position along z consistent (within 1 cm) between PV reconstructed using tracks and PV using FT0 A-C time difference (Run 3 only)"}; + Configurable requireIsVertexTOFmatched{"requireIsVertexTOFmatched", false, "require events with at least one of vertex contributors matched to TOF (Run 3 only)"}; + Configurable requireIsVertexTRDmatched{"requireIsVertexTRDmatched", false, "require events with at least one of vertex contributors matched to TRD (Run 3 only)"}; + Configurable rejectSameBunchPileup{"rejectSameBunchPileup", true, "reject collisions in case of pileup with another collision in the same foundBC (Run 3 only)"}; + Configurable requireNoCollInTimeRangeStd{"requireNoCollInTimeRangeStd", false, "reject collisions corrupted by the cannibalism, with other collisions within +/- 2 microseconds or mult above a certain threshold in -4 - -2 microseconds (Run 3 only)"}; + Configurable requireNoCollInTimeRangeStrict{"requireNoCollInTimeRangeStrict", false, "reject collisions corrupted by the cannibalism, with other collisions within +/- 10 microseconds (Run 3 only)"}; + Configurable requireNoCollInTimeRangeNarrow{"requireNoCollInTimeRangeNarrow", false, "reject collisions corrupted by the cannibalism, with other collisions within +/- 2 microseconds (Run 3 only)"}; + Configurable requireNoCollInROFStd{"requireNoCollInROFStd", false, "reject collisions corrupted by the cannibalism, with other collisions within the same ITS ROF with mult. above a certain threshold (Run 3 only)"}; + Configurable requireNoCollInROFStrict{"requireNoCollInROFStrict", false, "reject collisions corrupted by the cannibalism, with other collisions within the same ITS ROF (Run 3 only)"}; Configurable requireINEL0{"requireINEL0", true, "require INEL>0 event selection"}; Configurable requireINEL1{"requireINEL1", false, "require INEL>1 event selection"}; @@ -113,6 +114,22 @@ struct derivedlambdakzeroanalysis { // fast check on interaction rate Configurable minIR{"minIR", -1, "minimum IR collisions"}; Configurable maxIR{"maxIR", -1, "maximum IR collisions"}; + + // Run 2 specific event selections + Configurable requireSel7{"requireSel7", true, "require sel7 event selection (Run 2 only: event selection decision based on V0A & V0C)"}; + Configurable requireINT7{"requireINT7", true, "require INT7 trigger selection (Run 2 only)"}; + Configurable rejectIncompleteDAQ{"rejectIncompleteDAQ", true, "reject events with incomplete DAQ (Run 2 only)"}; + Configurable requireConsistentSPDAndTrackVtx{"requireConsistentSPDAndTrackVtx", true, "reject events with inconsistent in SPD and Track vertices (Run 2 only)"}; + Configurable rejectPileupFromSPD{"rejectPileupFromSPD", true, "reject events with pileup according to SPD vertexer (Run 2 only)"}; + Configurable rejectV0PFPileup{"rejectV0PFPileup", false, "reject events tagged as OOB pileup according to V0 past-future info (Run 2 only)"}; + Configurable rejectPileupInMultBins{"rejectPileupInMultBins", true, "reject events tagged as pileup according to multiplicity-differential pileup checks (Run 2 only)"}; + Configurable rejectPileupMV{"rejectPileupMV", true, "reject events tagged as pileup according to according to multi-vertexer (Run 2 only)"}; + Configurable rejectTPCPileup{"rejectTPCPileup", false, "reject events tagged as pileup according to pileup in TPC (Run 2 only)"}; + Configurable requireNoV0MOnVsOffPileup{"requireNoV0MOnVsOffPileup", false, "reject events tagged as OOB pileup according to online-vs-offline VOM correlation (Run 2 only)"}; + Configurable requireNoSPDOnVsOffPileup{"requireNoSPDOnVsOffPileup", false, "reject events tagged as pileup according to online-vs-offline SPD correlation (Run 2 only)"}; + Configurable requireNoSPDClsVsTklBG{"requireNoSPDClsVsTklBG", true, "reject events tagged as beam-gas and pileup according to cluster-vs-tracklet correlation (Run 2 only)"}; + + Configurable useSPDTrackletsCent{"useSPDTrackletsCent", false, "Use SPD tracklets for estimating centrality? If not, use V0M-based centrality (Run 2 only)"}; } eventSelections; struct : ConfigurableGroup { @@ -277,6 +294,7 @@ struct derivedlambdakzeroanalysis { // For manual sliceBy // Preslice> perMcCollision = aod::v0data::straMCCollisionId; PresliceUnsorted> perMcCollision = aod::v0data::straMCCollisionId; + PresliceUnsorted> perMcCollisionRun2 = aod::v0data::straMCCollisionId; enum selection : uint64_t { selCosPA = 0, selRadius, @@ -342,6 +360,15 @@ struct derivedlambdakzeroanalysis { void init(InitContext const&) { + // Determine if we are dealing with Run3 or Run2 processing + if ((doprocessRealDataRun3 || doprocessMonteCarloRun3 || doprocessGeneratedRun3) && (doprocessRealDataRun2 || doprocessMonteCarloRun2 || doprocessGeneratedRun2)) { + LOGF(fatal, "Cannot enable Run2 and Run3 processes at the same time. Please choose one."); + } + if (doprocessRealDataRun3 || doprocessMonteCarloRun3 || doprocessGeneratedRun3) { + isRun3 = true; + } else { + isRun3 = false; + } // setting CCDB service ccdb->setURL(ccdbConfigurations.ccdburl); ccdb->setCaching(true); @@ -415,38 +442,61 @@ struct derivedlambdakzeroanalysis { // Event Counters histos.add("hEventSelection", "hEventSelection", kTH1F, {{20, -0.5f, +19.5f}}); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(1, "All collisions"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(2, "sel8 cut"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(3, "kIsTriggerTVX"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(4, "kNoITSROFrameBorder"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(5, "kNoTimeFrameBorder"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(6, "posZ cut"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(7, "kIsVertexITSTPC"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(8, "kIsGoodZvtxFT0vsPV"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(9, "kIsVertexTOFmatched"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(10, "kIsVertexTRDmatched"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(11, "kNoSameBunchPileup"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(12, "kNoCollInTimeRangeStd"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(13, "kNoCollInTimeRangeStrict"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(14, "kNoCollInTimeRangeNarrow"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(15, "kNoCollInRofStd"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(16, "kNoCollInRofStrict"); - if (doPPAnalysis) { - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(17, "INEL>0"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(18, "INEL>1"); + if (isRun3) { + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(1, "All collisions"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(2, "sel8 cut"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(3, "kIsTriggerTVX"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(4, "kNoITSROFrameBorder"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(5, "kNoTimeFrameBorder"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(6, "posZ cut"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(7, "kIsVertexITSTPC"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(8, "kIsGoodZvtxFT0vsPV"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(9, "kIsVertexTOFmatched"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(10, "kIsVertexTRDmatched"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(11, "kNoSameBunchPileup"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(12, "kNoCollInTimeRangeStd"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(13, "kNoCollInTimeRangeStrict"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(14, "kNoCollInTimeRangeNarrow"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(15, "kNoCollInRofStd"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(16, "kNoCollInRofStrict"); + if (doPPAnalysis) { + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(17, "INEL>0"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(18, "INEL>1"); + } else { + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(17, "Below min occup."); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(18, "Above max occup."); + } + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(19, "Below min IR"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(20, "Above max IR"); } else { - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(17, "Below min occup."); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(18, "Above max occup."); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(1, "All collisions"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(2, "sel8 cut"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(3, "sel7 cut"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(4, "kINT7"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(5, "kIsTriggerTVX"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(6, "kNoIncompleteDAQ"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(7, "posZ cut"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(8, "kNoInconsistentVtx"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(9, "kNoPileupFromSPD"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(10, "kNoV0PFPileup"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(11, "kNoPileupInMultBins"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(12, "kNoPileupMV"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(13, "kNoPileupTPC"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(14, "kNoV0MOnVsOfPileup"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(15, "kNoSPDOnVsOfPileup"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(16, "kNoSPDClsVsTklBG"); + if (doPPAnalysis) { + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(17, "INEL>0"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(18, "INEL>1"); + } } - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(19, "Below min IR"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(20, "Above max IR"); histos.add("hEventCentrality", "hEventCentrality", kTH1F, {{101, 0.0f, 101.0f}}); histos.add("hCentralityVsNch", "hCentralityVsNch", kTH2F, {{101, 0.0f, 101.0f}, axisNch}); histos.add("hEventPVz", "hEventPVz", kTH1F, {{100, -20.0f, +20.0f}}); histos.add("hCentralityVsPVz", "hCentralityVsPVz", kTH2F, {{101, 0.0f, 101.0f}, {100, -20.0f, +20.0f}}); - if (doprocessGenerated) { + if (doprocessGeneratedRun3 || doprocessGeneratedRun2) { histos.add("hEventPVzMC", "hEventPVzMC", kTH1F, {{100, -20.0f, +20.0f}}); histos.add("hCentralityVsPVzMC", "hCentralityVsPVzMC", kTH2F, {{101, 0.0f, 101.0f}, {100, -20.0f, +20.0f}}); } @@ -647,9 +697,9 @@ struct derivedlambdakzeroanalysis { } } - if (analyseLambda && calculateFeeddownMatrix && doprocessMonteCarlo) + if (analyseLambda && calculateFeeddownMatrix && (doprocessMonteCarloRun3 || doprocessMonteCarloRun2)) histos.add("h3dLambdaFeeddown", "h3dLambdaFeeddown", kTH3F, {axisCentrality, axisPt, axisPtXi}); - if (analyseAntiLambda && calculateFeeddownMatrix && doprocessMonteCarlo) + if (analyseAntiLambda && calculateFeeddownMatrix && (doprocessMonteCarloRun3 || doprocessMonteCarloRun2)) histos.add("h3dAntiLambdaFeeddown", "h3dAntiLambdaFeeddown", kTH3F, {axisCentrality, axisPt, axisPtXi}); // demo // fast @@ -727,7 +777,7 @@ struct derivedlambdakzeroanalysis { histos.add("GeneralQA/h2dArmenterosSelected", "h2dArmenterosSelected", kTH2F, {axisAPAlpha, axisAPQt}); // Creation of histograms: MC generated - if (doprocessGenerated) { + if ((doprocessGeneratedRun3 || doprocessGeneratedRun2)) { histos.add("hGenEvents", "hGenEvents", kTH2F, {{axisNch}, {2, -0.5f, +1.5f}}); histos.get(HIST("hGenEvents"))->GetYaxis()->SetBinLabel(1, "All gen. events"); histos.get(HIST("hGenEvents"))->GetYaxis()->SetBinLabel(2, "Gen. with at least 1 rec. events"); @@ -776,6 +826,18 @@ struct derivedlambdakzeroanalysis { histos.print(); } + // ______________________________________________________ + // Return slicing output + template + auto getGroupedCollisions(TCollisions const& collisions, int globalIndex) + { + if constexpr (run3) { // check if we are in Run 3 + return collisions.sliceBy(perMcCollision, globalIndex); + } else { // we are in Run2 + return collisions.sliceBy(perMcCollisionRun2, globalIndex); + } + } + template void initCCDB(TCollision collision) { @@ -1477,137 +1539,244 @@ struct derivedlambdakzeroanalysis { if (fillHists) histos.fill(HIST("hEventSelection"), 0. /* all collisions */); - if (eventSelections.requireSel8 && !collision.sel8()) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 1 /* sel8 collisions */); + if constexpr (requires { collision.centFT0C(); }) { // check if we are in Run 3 + if (eventSelections.requireSel8 && !collision.sel8()) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 1 /* sel8 collisions */); - if (eventSelections.requireTriggerTVX && !collision.selection_bit(aod::evsel::kIsTriggerTVX)) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 2 /* FT0 vertex (acceptable FT0C-FT0A time difference) collisions */); + if (eventSelections.requireTriggerTVX && !collision.selection_bit(aod::evsel::kIsTriggerTVX)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 2 /* FT0 vertex (acceptable FT0C-FT0A time difference) collisions */); - if (eventSelections.rejectITSROFBorder && !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 3 /* Not at ITS ROF border */); + if (eventSelections.rejectITSROFBorder && !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 3 /* Not at ITS ROF border */); - if (eventSelections.rejectTFBorder && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 4 /* Not at TF border */); + if (eventSelections.rejectTFBorder && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 4 /* Not at TF border */); - if (std::abs(collision.posZ()) > eventSelections.maxZVtxPosition) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 5 /* vertex-Z selected */); + if (std::abs(collision.posZ()) > eventSelections.maxZVtxPosition) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 5 /* vertex-Z selected */); - if (eventSelections.requireIsVertexITSTPC && !collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 6 /* Contains at least one ITS-TPC track */); + if (eventSelections.requireIsVertexITSTPC && !collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 6 /* Contains at least one ITS-TPC track */); - if (eventSelections.requireIsGoodZvtxFT0VsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 7 /* PV position consistency check */); + if (eventSelections.requireIsGoodZvtxFT0VsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 7 /* PV position consistency check */); - if (eventSelections.requireIsVertexTOFmatched && !collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 8 /* PV with at least one contributor matched with TOF */); + if (eventSelections.requireIsVertexTOFmatched && !collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 8 /* PV with at least one contributor matched with TOF */); - if (eventSelections.requireIsVertexTRDmatched && !collision.selection_bit(o2::aod::evsel::kIsVertexTRDmatched)) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 9 /* PV with at least one contributor matched with TRD */); + if (eventSelections.requireIsVertexTRDmatched && !collision.selection_bit(o2::aod::evsel::kIsVertexTRDmatched)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 9 /* PV with at least one contributor matched with TRD */); - if (eventSelections.rejectSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 10 /* Not at same bunch pile-up */); + if (eventSelections.rejectSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 10 /* Not at same bunch pile-up */); - if (eventSelections.requireNoCollInTimeRangeStd && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 11 /* No other collision within +/- 2 microseconds or mult above a certain threshold in -4 - -2 microseconds*/); + if (eventSelections.requireNoCollInTimeRangeStd && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 11 /* No other collision within +/- 2 microseconds or mult above a certain threshold in -4 - -2 microseconds*/); - if (eventSelections.requireNoCollInTimeRangeStrict && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStrict)) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 12 /* No other collision within +/- 10 microseconds */); + if (eventSelections.requireNoCollInTimeRangeStrict && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStrict)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 12 /* No other collision within +/- 10 microseconds */); - if (eventSelections.requireNoCollInTimeRangeNarrow && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeNarrow)) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 13 /* No other collision within +/- 2 microseconds */); + if (eventSelections.requireNoCollInTimeRangeNarrow && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeNarrow)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 13 /* No other collision within +/- 2 microseconds */); - if (eventSelections.requireNoCollInROFStd && !collision.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 14 /* No other collision within the same ITS ROF with mult. above a certain threshold */); + if (eventSelections.requireNoCollInROFStd && !collision.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 14 /* No other collision within the same ITS ROF with mult. above a certain threshold */); - if (eventSelections.requireNoCollInROFStrict && !collision.selection_bit(o2::aod::evsel::kNoCollInRofStrict)) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 15 /* No other collision within the same ITS ROF */); + if (eventSelections.requireNoCollInROFStrict && !collision.selection_bit(o2::aod::evsel::kNoCollInRofStrict)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 15 /* No other collision within the same ITS ROF */); + + if (doPPAnalysis) { // we are in pp + if (eventSelections.requireINEL0 && collision.multNTracksPVeta1() < 1) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 16 /* INEL > 0 */); + + if (eventSelections.requireINEL1 && collision.multNTracksPVeta1() < 2) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 17 /* INEL > 1 */); + + } else { // we are in Pb-Pb + float collisionOccupancy = eventSelections.useFT0CbasedOccupancy ? collision.ft0cOccupancyInTimeRange() : collision.trackOccupancyInTimeRange(); + if (eventSelections.minOccupancy >= 0 && collisionOccupancy < eventSelections.minOccupancy) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 16 /* Below min occupancy */); + + if (eventSelections.maxOccupancy >= 0 && collisionOccupancy > eventSelections.maxOccupancy) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 17 /* Above max occupancy */); + } - if (doPPAnalysis) { // we are in pp - if (eventSelections.requireINEL0 && collision.multNTracksPVeta1() < 1) { + // Fetch interaction rate only if required (in order to limit ccdb calls) + double interactionRate = (eventSelections.minIR >= 0 || eventSelections.maxIR >= 0) ? rateFetcher.fetch(ccdb.service, collision.timestamp(), collision.runNumber(), irSource) * 1.e-3 : -1; + if (eventSelections.minIR >= 0 && interactionRate < eventSelections.minIR) { return false; } if (fillHists) - histos.fill(HIST("hEventSelection"), 16 /* INEL > 0 */); + histos.fill(HIST("hEventSelection"), 18 /* Below min IR */); - if (eventSelections.requireINEL1 && collision.multNTracksPVeta1() < 2) { + if (eventSelections.maxIR >= 0 && interactionRate > eventSelections.maxIR) { return false; } if (fillHists) - histos.fill(HIST("hEventSelection"), 17 /* INEL > 1 */); + histos.fill(HIST("hEventSelection"), 19 /* Above max IR */); - } else { // we are in Pb-Pb - float collisionOccupancy = eventSelections.useFT0CbasedOccupancy ? collision.ft0cOccupancyInTimeRange() : collision.trackOccupancyInTimeRange(); - if (eventSelections.minOccupancy >= 0 && collisionOccupancy < eventSelections.minOccupancy) { + } else { // we are in Run 2 + if (eventSelections.requireSel8 && !collision.sel8()) { return false; } if (fillHists) - histos.fill(HIST("hEventSelection"), 16 /* Below min occupancy */); + histos.fill(HIST("hEventSelection"), 1 /* sel8 collisions */); - if (eventSelections.maxOccupancy >= 0 && collisionOccupancy > eventSelections.maxOccupancy) { + if (eventSelections.requireSel7 && !collision.sel7()) { return false; } if (fillHists) - histos.fill(HIST("hEventSelection"), 17 /* Above max occupancy */); - } + histos.fill(HIST("hEventSelection"), 2 /* sel7 collisions */); - // Fetch interaction rate only if required (in order to limit ccdb calls) - double interactionRate = (eventSelections.minIR >= 0 || eventSelections.maxIR >= 0) ? rateFetcher.fetch(ccdb.service, collision.timestamp(), collision.runNumber(), irSource) * 1.e-3 : -1; - if (eventSelections.minIR >= 0 && interactionRate < eventSelections.minIR) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 18 /* Below min IR */); + if (eventSelections.requireINT7 && !collision.alias_bit(kINT7)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 3 /* INT7-triggered collisions */); + + if (eventSelections.requireTriggerTVX && !collision.selection_bit(o2::aod::evsel::kIsTriggerTVX)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 4 /* FT0 vertex (acceptable FT0C-FT0A time difference) at trigger level */); + + if (eventSelections.rejectIncompleteDAQ && !collision.selection_bit(o2::aod::evsel::kNoIncompleteDAQ)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 5 /* Complete events according to DAQ flags */); + + if (std::abs(collision.posZ()) > eventSelections.maxZVtxPosition) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 6 /* vertex-Z selected */); + + if (eventSelections.requireConsistentSPDAndTrackVtx && !collision.selection_bit(o2::aod::evsel::kNoInconsistentVtx)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 7 /* No inconsistency in SPD and Track vertices */); + + if (eventSelections.rejectPileupFromSPD && !collision.selection_bit(o2::aod::evsel::kNoPileupFromSPD)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 8 /* No pileup according to SPD vertexer */); + + if (eventSelections.rejectV0PFPileup && !collision.selection_bit(o2::aod::evsel::kNoV0PFPileup)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 9 /* No out-of-bunch pileup according to V0 past-future info */); + + if (eventSelections.rejectPileupInMultBins && !collision.selection_bit(o2::aod::evsel::kNoPileupInMultBins)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 10 /* No pileup according to multiplicity-differential pileup checks */); + + if (eventSelections.rejectPileupMV && !collision.selection_bit(o2::aod::evsel::kNoPileupMV)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 11 /* No pileup according to multi-vertexer */); + + if (eventSelections.rejectTPCPileup && !collision.selection_bit(o2::aod::evsel::kNoPileupTPC)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 12 /* No pileup in TPC */); + + if (eventSelections.requireNoV0MOnVsOffPileup && !collision.selection_bit(o2::aod::evsel::kNoV0MOnVsOfPileup)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 13 /* No out-of-bunch pileup according to online-vs-offline VOM correlation */); + + if (eventSelections.requireNoSPDOnVsOffPileup && !collision.selection_bit(o2::aod::evsel::kNoSPDOnVsOfPileup)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 14 /* No out-of-bunch pileup according to online-vs-offline SPD correlation */); - if (eventSelections.maxIR >= 0 && interactionRate > eventSelections.maxIR) { - return false; + if (eventSelections.requireNoSPDClsVsTklBG && !collision.selection_bit(o2::aod::evsel::kNoSPDClsVsTklBG)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 15 /* No beam-gas according to cluster-vs-tracklet correlation */); + + if (doPPAnalysis) { // we are in pp + if (eventSelections.requireINEL0 && collision.multNTracksPVeta1() < 1) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 16 /* INEL > 0 */); + + if (eventSelections.requireINEL1 && collision.multNTracksPVeta1() < 2) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 17 /* INEL > 1 */); + } } - if (fillHists) - histos.fill(HIST("hEventSelection"), 19 /* Above max IR */); return true; } @@ -1615,11 +1784,12 @@ struct derivedlambdakzeroanalysis { // ______________________________________________________ // Simulated processing // Return the list of indices to the recoed collision associated to a given MC collision. - std::vector getListOfRecoCollIndices(soa::Join const& mcCollisions, soa::Join const& collisions) + template + std::vector getListOfRecoCollIndices(TMCollisions const& mcCollisions, TCollisions const& collisions) { std::vector listBestCollisionIdx(mcCollisions.size()); for (auto const& mcCollision : mcCollisions) { - auto groupedCollisions = collisions.sliceBy(perMcCollision, mcCollision.globalIndex()); + auto groupedCollisions = getGroupedCollisions(collisions, mcCollision.globalIndex()); // Find the collision with the biggest nbr of PV contributors // Follows what was done here: https://github.com/AliceO2Group/O2Physics/blob/master/Common/TableProducer/mcCollsExtra.cxx#L93 int biggestNContribs = -1; @@ -1642,10 +1812,61 @@ struct derivedlambdakzeroanalysis { return listBestCollisionIdx; } + // ______________________________________________________ + // Reconstructed data processing + // Fill reconstructed event information + // Return centrality, occupancy, interaction rate, gap side and selGapside via reference-passing in arguments + template + void fillReconstructedEventProperties(TCollision const& collision, float& centrality, float& collisionOccupancy, double& interactionRate, int& gapSide, int& selGapSide) + { + if constexpr (requires { collision.centFT0C(); }) { // check if we are in Run 3 + centrality = doPPAnalysis ? collision.centFT0M() : collision.centFT0C(); + collisionOccupancy = eventSelections.useFT0CbasedOccupancy ? collision.ft0cOccupancyInTimeRange() : collision.trackOccupancyInTimeRange(); + // Fetch interaction rate only if required (in order to limit ccdb calls) + interactionRate = !irSource.value.empty() ? rateFetcher.fetch(ccdb.service, collision.timestamp(), collision.runNumber(), irSource) * 1.e-3 : -1; + + if (qaCentrality) { + auto hRawCentrality = histos.get(HIST("hRawCentrality")); + centrality = hRawCentrality->GetBinContent(hRawCentrality->FindBin(doPPAnalysis ? collision.multFT0A() + collision.multFT0C() : collision.multFT0C())); + } + + // gap side + gapSide = collision.gapSide(); + // -1 --> Hadronic + // 0 --> Single Gap - A side + // 1 --> Single Gap - C side + // 2 --> Double Gap - both A & C sides + selGapSide = sgSelector.trueGap(collision, upcCuts.FV0cut, upcCuts.FT0Acut, upcCuts.FT0Ccut, upcCuts.ZDCcut); + } else { // no, we are in Run 2 + centrality = eventSelections.useSPDTrackletsCent ? collision.centRun2SPDTracklets() : collision.centRun2V0M(); + } + + histos.fill(HIST("hGapSide"), gapSide); + histos.fill(HIST("hSelGapSide"), selGapSide); + histos.fill(HIST("hEventCentralityVsSelGapSide"), centrality, selGapSide <= 2 ? selGapSide : -1); + + histos.fill(HIST("hEventCentrality"), centrality); + + histos.fill(HIST("hCentralityVsNch"), centrality, collision.multNTracksPVeta1()); + + histos.fill(HIST("hCentralityVsPVz"), centrality, collision.posZ()); + histos.fill(HIST("hEventPVz"), collision.posZ()); + + histos.fill(HIST("hEventOccupancy"), collisionOccupancy); + histos.fill(HIST("hCentralityVsOccupancy"), centrality, collisionOccupancy); + + histos.fill(HIST("hInteractionRate"), interactionRate); + histos.fill(HIST("hCentralityVsInteractionRate"), centrality, interactionRate); + + histos.fill(HIST("hInteractionRateVsOccupancy"), interactionRate, collisionOccupancy); + return; + } + // ______________________________________________________ // Simulated processing // Fill generated event information (for event loss/splitting estimation) - void fillGeneratedEventProperties(soa::Join const& mcCollisions, soa::Join const& collisions) + template + void fillGeneratedEventProperties(TMCCollisions const& mcCollisions, TCollisions const& collisions) { std::vector listBestCollisionIdx(mcCollisions.size()); for (auto const& mcCollision : mcCollisions) { @@ -1665,7 +1886,7 @@ struct derivedlambdakzeroanalysis { histos.fill(HIST("hGenEvents"), mcCollision.multMCNParticlesEta05(), 0 /* all gen. events*/); - auto groupedCollisions = collisions.sliceBy(perMcCollision, mcCollision.globalIndex()); + auto groupedCollisions = getGroupedCollisions(collisions, mcCollision.globalIndex()); // Check if there is at least one of the reconstructed collisions associated to this MC collision // If so, we consider it bool atLeastOne = false; @@ -1680,7 +1901,11 @@ struct derivedlambdakzeroanalysis { if (biggestNContribs < collision.multPVTotalContributors()) { biggestNContribs = collision.multPVTotalContributors(); - centrality = doPPAnalysis ? collision.centFT0M() : collision.centFT0C(); + if constexpr (requires { collision.centFT0C(); }) { // check if we are in Run 3 + centrality = doPPAnalysis ? collision.centFT0M() : collision.centFT0C(); + } else { // we are in Run 2 + centrality = eventSelections.useSPDTrackletsCent ? collision.centRun2SPDTracklets() : collision.centRun2V0M(); + } } nCollisions++; @@ -1705,7 +1930,8 @@ struct derivedlambdakzeroanalysis { // ______________________________________________________ // Real data processing - no MC subscription - void processRealData(soa::Join::iterator const& collision, v0Candidates const& fullV0s, dauTracks const&) + template + void analyzeRecoedV0sInRealData(TCollision const& collision, TV0s const& fullV0s) { // Fire up CCDB if ((mlConfigurations.useK0ShortScores && mlConfigurations.calculateK0ShortScores) || @@ -1718,39 +1944,14 @@ struct derivedlambdakzeroanalysis { return; } - float centrality = doPPAnalysis ? collision.centFT0M() : collision.centFT0C(); - if (qaCentrality) { - auto hRawCentrality = histos.get(HIST("hRawCentrality")); - centrality = hRawCentrality->GetBinContent(hRawCentrality->FindBin(doPPAnalysis ? collision.multFT0A() + collision.multFT0C() : collision.multFT0C())); - } - float collisionOccupancy = eventSelections.useFT0CbasedOccupancy ? collision.ft0cOccupancyInTimeRange() : collision.trackOccupancyInTimeRange(); - // Fetch interaction rate only if required (in order to limit ccdb calls) - double interactionRate = !irSource.value.empty() ? rateFetcher.fetch(ccdb.service, collision.timestamp(), collision.runNumber(), irSource) * 1.e-3 : -1; - + float centrality = -1; + float collisionOccupancy = -2; // -1 already taken for the case where occupancy cannot be evaluated + double interactionRate = -1; // gap side - int gapSide = collision.gapSide(); - int selGapSide = -1; - // -1 --> Hadronic - // 0 --> Single Gap - A side - // 1 --> Single Gap - C side - // 2 --> Double Gap - both A & C sides - selGapSide = sgSelector.trueGap(collision, upcCuts.FV0cut, upcCuts.FT0Acut, upcCuts.FT0Ccut, upcCuts.ZDCcut); - histos.fill(HIST("hGapSide"), gapSide); - histos.fill(HIST("hSelGapSide"), selGapSide); - histos.fill(HIST("hEventCentralityVsSelGapSide"), centrality, selGapSide <= 2 ? selGapSide : -1); - - histos.fill(HIST("hEventCentrality"), centrality); - - histos.fill(HIST("hCentralityVsNch"), centrality, collision.multNTracksPVeta1()); - - histos.fill(HIST("hCentralityVsPVz"), centrality, collision.posZ()); - histos.fill(HIST("hEventPVz"), collision.posZ()); - - histos.fill(HIST("hEventOccupancy"), collisionOccupancy); - histos.fill(HIST("hCentralityVsOccupancy"), centrality, collisionOccupancy); - - histos.fill(HIST("hInteractionRate"), interactionRate); - histos.fill(HIST("hCentralityVsInteractionRate"), centrality, interactionRate); + int gapSide = -1; + int selGapSide = -1; // -1 --> Hadronic ; 0 --> Single Gap - A side ; 1 --> Single Gap - C side ; 2 --> Double Gap - both A & C sides + // Fill recoed event properties + fillReconstructedEventProperties(collision, centrality, collisionOccupancy, interactionRate, gapSide, selGapSide); histos.fill(HIST("hInteractionRateVsOccupancy"), interactionRate, collisionOccupancy); @@ -1792,7 +1993,8 @@ struct derivedlambdakzeroanalysis { // ______________________________________________________ // Simulated processing (subscribes to MC information too) - void processMonteCarlo(soa::Join::iterator const& collision, v0MCCandidates const& fullV0s, dauTracks const&, aod::MotherMCParts const&, soa::Join const& /*mccollisions*/, soa::Join const&) + template + void analyzeRecoedV0sInMonteCarlo(TCollision const& collision, TV0s const& fullV0s) { // Fire up CCDB if ((mlConfigurations.useK0ShortScores && mlConfigurations.calculateK0ShortScores) || @@ -1805,39 +2007,14 @@ struct derivedlambdakzeroanalysis { return; } - float centrality = doPPAnalysis ? collision.centFT0M() : collision.centFT0C(); - if (qaCentrality) { - auto hRawCentrality = histos.get(HIST("hRawCentrality")); - centrality = hRawCentrality->GetBinContent(hRawCentrality->FindBin(doPPAnalysis ? collision.multFT0A() + collision.multFT0C() : collision.multFT0C())); - } - float collisionOccupancy = eventSelections.useFT0CbasedOccupancy ? collision.ft0cOccupancyInTimeRange() : collision.trackOccupancyInTimeRange(); - // Fetch interaction rate only if required (in order to limit ccdb calls) - double interactionRate = !irSource.value.empty() ? rateFetcher.fetch(ccdb.service, collision.timestamp(), collision.runNumber(), irSource) * 1.e-3 : -1; - + float centrality = -1; + float collisionOccupancy = -2; // -1 already taken for the case where occupancy cannot be evaluated + double interactionRate = -1; // gap side - int gapSide = collision.gapSide(); - int selGapSide = -1; - // -1 --> Hadronic - // 0 --> Single Gap - A side - // 1 --> Single Gap - C side - // 2 --> Double Gap - both A & C sides - selGapSide = sgSelector.trueGap(collision, upcCuts.FV0cut, upcCuts.FT0Acut, upcCuts.FT0Ccut, upcCuts.ZDCcut); - histos.fill(HIST("hGapSide"), gapSide); - histos.fill(HIST("hSelGapSide"), selGapSide); - histos.fill(HIST("hEventCentralityVsSelGapSide"), centrality, selGapSide <= 2 ? selGapSide : -1); - - histos.fill(HIST("hEventCentrality"), centrality); - - histos.fill(HIST("hCentralityVsNch"), centrality, collision.multNTracksPVeta1()); - - histos.fill(HIST("hCentralityVsPVz"), centrality, collision.posZ()); - histos.fill(HIST("hEventPVz"), collision.posZ()); - - histos.fill(HIST("hEventOccupancy"), collisionOccupancy); - histos.fill(HIST("hCentralityVsOccupancy"), centrality, collisionOccupancy); - - histos.fill(HIST("hInteractionRate"), interactionRate); - histos.fill(HIST("hCentralityVsInteractionRate"), centrality, interactionRate); + int gapSide = -1; + int selGapSide = -1; // -1 --> Hadronic ; 0 --> Single Gap - A side ; 1 --> Single Gap - C side ; 2 --> Double Gap - both A & C sides + // Fill recoed event properties + fillReconstructedEventProperties(collision, centrality, collisionOccupancy, interactionRate, gapSide, selGapSide); histos.fill(HIST("hInteractionRateVsOccupancy"), interactionRate, collisionOccupancy); @@ -1856,7 +2033,7 @@ struct derivedlambdakzeroanalysis { if (!v0.has_v0MCCore()) continue; - auto v0MC = v0.v0MCCore_as>(); + auto v0MC = v0.template v0MCCore_as>(); // fill AP plot for all V0s histos.fill(HIST("GeneralQA/h2dArmenterosAll"), v0.alpha(), v0.qtarm()); @@ -1888,7 +2065,7 @@ struct derivedlambdakzeroanalysis { bool correctCollision = false; int mcNch = -1; if (collision.has_straMCCollision()) { - auto mcCollision = collision.straMCCollision_as>(); + auto mcCollision = collision.template straMCCollision_as>(); mcNch = mcCollision.multMCNParticlesEta05(); correctCollision = (v0MC.straMCCollisionId() == mcCollision.globalIndex()); } @@ -1911,10 +2088,11 @@ struct derivedlambdakzeroanalysis { // ______________________________________________________ // Simulated processing (subscribes to MC information too) - void processGenerated(soa::Join const& mcCollisions, soa::Join const& V0MCCores, soa::Join const& CascMCCores, soa::Join const& collisions) + template + void analyzeGeneratedV0s(TMCCollisions const& mcCollisions, TV0MCs const& V0MCCores, TCascMCs const& CascMCCores, TCollisions const& collisions) { - fillGeneratedEventProperties(mcCollisions, collisions); - std::vector listBestCollisionIdx = getListOfRecoCollIndices(mcCollisions, collisions); + fillGeneratedEventProperties(mcCollisions, collisions); + std::vector listBestCollisionIdx = getListOfRecoCollIndices(mcCollisions, collisions); for (auto const& v0MC : V0MCCores) { if (!v0MC.has_straMCCollision()) continue; @@ -1932,7 +2110,7 @@ struct derivedlambdakzeroanalysis { if (TMath::Abs(ymc) > v0Selections.rapidityCut) continue; - auto mcCollision = v0MC.straMCCollision_as>(); + auto mcCollision = v0MC.template straMCCollision_as>(); if (eventSelections.applyZVtxSelOnMCPV && std::abs(mcCollision.posZ()) > eventSelections.maxZVtxPosition) { continue; } @@ -1949,14 +2127,10 @@ struct derivedlambdakzeroanalysis { float centrality = 100.5f; if (listBestCollisionIdx[mcCollision.globalIndex()] > -1) { auto collision = collisions.iteratorAt(listBestCollisionIdx[mcCollision.globalIndex()]); - centrality = doPPAnalysis ? collision.centFT0M() : collision.centFT0C(); - float collisionOccupancy = eventSelections.useFT0CbasedOccupancy ? collision.ft0cOccupancyInTimeRange() : collision.trackOccupancyInTimeRange(); - - if (eventSelections.minOccupancy >= 0 && collisionOccupancy < eventSelections.minOccupancy) { - continue; - } - if (eventSelections.maxOccupancy >= 0 && collisionOccupancy > eventSelections.maxOccupancy) { - continue; + if constexpr (requires { collision.centFT0C(); }) { // check if we are in Run 3 + centrality = doPPAnalysis ? collision.centFT0M() : collision.centFT0C(); + } else { // no, we are in Run 2 + centrality = eventSelections.useSPDTrackletsCent ? collision.centRun2SPDTracklets() : collision.centRun2V0M(); } if (v0MC.pdgCode() == 310) { @@ -2001,7 +2175,7 @@ struct derivedlambdakzeroanalysis { if (TMath::Abs(ymc) > v0Selections.rapidityCut) continue; - auto mcCollision = cascMC.straMCCollision_as>(); + auto mcCollision = cascMC.template straMCCollision_as>(); if (eventSelections.applyZVtxSelOnMCPV && std::abs(mcCollision.posZ()) > eventSelections.maxZVtxPosition) { continue; } @@ -2018,14 +2192,10 @@ struct derivedlambdakzeroanalysis { float centrality = 100.5f; if (listBestCollisionIdx[mcCollision.globalIndex()] > -1) { auto collision = collisions.iteratorAt(listBestCollisionIdx[mcCollision.globalIndex()]); - centrality = doPPAnalysis ? collision.centFT0M() : collision.centFT0C(); - float collisionOccupancy = eventSelections.useFT0CbasedOccupancy ? collision.ft0cOccupancyInTimeRange() : collision.trackOccupancyInTimeRange(); - - if (eventSelections.minOccupancy >= 0 && collisionOccupancy < eventSelections.minOccupancy) { - continue; - } - if (eventSelections.maxOccupancy >= 0 && collisionOccupancy > eventSelections.maxOccupancy) { - continue; + if constexpr (requires { collision.centFT0C(); }) { // check if we are in Run 3 + centrality = doPPAnalysis ? collision.centFT0M() : collision.centFT0C(); + } else { // no, we are in Run 2 + centrality = eventSelections.useSPDTrackletsCent ? collision.centRun2SPDTracklets() : collision.centRun2V0M(); } if (cascMC.pdgCode() == 3312) { @@ -2061,6 +2231,48 @@ struct derivedlambdakzeroanalysis { } } + // ______________________________________________________ + // Real data processing in Run 3 - no MC subscription + void processRealDataRun3(soa::Join::iterator const& collision, v0Candidates const& fullV0s, dauTracks const&) + { + analyzeRecoedV0sInRealData(collision, fullV0s); + } + + // ______________________________________________________ + // Real data processing in Run 2 - no MC subscription + void processRealDataRun2(soa::Join::iterator const& collision, v0Candidates const& fullV0s, dauTracks const&) + { + analyzeRecoedV0sInRealData(collision, fullV0s); + } + + // ______________________________________________________ + // Simulated processing in Run 3 (subscribes to MC information too) + void processMonteCarloRun3(soa::Join::iterator const& collision, v0MCCandidates const& fullV0s, dauTracks const&, aod::MotherMCParts const&, soa::Join const& /*mccollisions*/, soa::Join const&) + { + analyzeRecoedV0sInMonteCarlo(collision, fullV0s); + } + + // ______________________________________________________ + // Simulated processing in Run 2 (subscribes to MC information too) + void processMonteCarloRun2(soa::Join::iterator const& collision, v0MCCandidates const& fullV0s, dauTracks const&, aod::MotherMCParts const&, soa::Join const& /*mccollisions*/, soa::Join const&) + { + analyzeRecoedV0sInMonteCarlo(collision, fullV0s); + } + + // ______________________________________________________ + // Simulated processing in Run 3 (subscribes to MC information too) + void processGeneratedRun3(soa::Join const& mcCollisions, soa::Join const& V0MCCores, soa::Join const& CascMCCores, soa::Join const& collisions) + { + analyzeGeneratedV0s(mcCollisions, V0MCCores, CascMCCores, collisions); + } + + // ______________________________________________________ + // Simulated processing in Run 2 (subscribes to MC information too) + void processGeneratedRun2(soa::Join const& mcCollisions, soa::Join const& V0MCCores, soa::Join const& CascMCCores, soa::Join const& collisions) + { + analyzeGeneratedV0s(mcCollisions, V0MCCores, CascMCCores, collisions); + } + // ______________________________________________________ // Simulated processing (subscribes to MC information too) void processBinnedGenerated( @@ -2126,10 +2338,13 @@ struct derivedlambdakzeroanalysis { } } - PROCESS_SWITCH(derivedlambdakzeroanalysis, processRealData, "process as if real data", true); - PROCESS_SWITCH(derivedlambdakzeroanalysis, processMonteCarlo, "process as if MC", false); + PROCESS_SWITCH(derivedlambdakzeroanalysis, processRealDataRun3, "process as if real data in Run 3", true); + PROCESS_SWITCH(derivedlambdakzeroanalysis, processRealDataRun2, "process as if real data in Run 2", true); + PROCESS_SWITCH(derivedlambdakzeroanalysis, processMonteCarloRun3, "process as if MC in Run 3", false); + PROCESS_SWITCH(derivedlambdakzeroanalysis, processMonteCarloRun2, "process as if MC in Run 2", false); PROCESS_SWITCH(derivedlambdakzeroanalysis, processBinnedGenerated, "process MC generated", false); - PROCESS_SWITCH(derivedlambdakzeroanalysis, processGenerated, "process MC generated", false); + PROCESS_SWITCH(derivedlambdakzeroanalysis, processGeneratedRun3, "process MC generated Run 3", false); + PROCESS_SWITCH(derivedlambdakzeroanalysis, processGeneratedRun2, "process MC generated Run 2", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 7d3a721c719e75249e3e5978c02cb4d5de5dc661 Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Wed, 19 Feb 2025 22:36:45 +0100 Subject: [PATCH 0327/1650] [PWGLF] chK892Flow - refactor with configuration group (#10096) --- PWGLF/Tasks/Resonances/chk892Flow.cxx | 493 +++++++++++++++----------- 1 file changed, 289 insertions(+), 204 deletions(-) diff --git a/PWGLF/Tasks/Resonances/chk892Flow.cxx b/PWGLF/Tasks/Resonances/chk892Flow.cxx index 79414bae1a5..1e764a0c9f2 100644 --- a/PWGLF/Tasks/Resonances/chk892Flow.cxx +++ b/PWGLF/Tasks/Resonances/chk892Flow.cxx @@ -106,114 +106,129 @@ struct Chk892Flow { Service ccdb; o2::ccdb::CcdbApi ccdbApi; - Configurable cfgURL{"cfgURL", "http://alice-ccdb.cern.ch", "Address of the CCDB to browse"}; + struct : ConfigurableGroup { + Configurable cfgURL{"cfgURL", "http://alice-ccdb.cern.ch", "Address of the CCDB to browse"}; + } CCDBConfig; // Configurable nolaterthan{"ccdb-no-later-than", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "Latest acceptable timestamp of creation for the object"}; // Configurables - ConfigurableAxis cfgBinsPt{"cfgBinsPt", {VARIABLE_WIDTH, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5.0, 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 6.0, 6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 6.7, 6.8, 6.9, 7.0, 7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 7.7, 7.8, 7.9, 8.0, 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9, 9.0, 9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7, 9.8, 9.9, 10.0, 10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8, 10.9, 11.0, 11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7, 11.8, 11.9, 12.0, 12.1, 12.2, 12.3, 12.4, 12.5, 12.6, 12.7, 12.8, 12.9, 13.0, 13.1, 13.2, 13.3, 13.4, 13.5, 13.6, 13.7, 13.8, 13.9, 14.0, 14.1, 14.2, 14.3, 14.4, 14.5, 14.6, 14.7, 14.8, 14.9, 15.0}, "Binning of the pT axis"}; - ConfigurableAxis cfgBinsPtQA{"cfgBinsPtQA", {VARIABLE_WIDTH, 0.0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8, 5.0, 5.2, 5.4, 5.6, 5.8, 6.0, 6.2, 6.4, 6.6, 6.8, 7.0, 7.2, 7.4, 7.6, 7.8, 8.0, 8.2, 8.4, 8.6, 8.8, 9.0, 9.2, 9.4, 9.6, 9.8, 10.0}, "Binning of the pT axis"}; - ConfigurableAxis cfgBinsCent{"cfgBinsCent", {VARIABLE_WIDTH, 0.0, 1.0, 5.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0, 110.0}, "Binning of the centrality axis"}; - ConfigurableAxis cfgBinsVtxZ{"cfgBinsVtxZ", {VARIABLE_WIDTH, -10.0, -9.0, -8.0, -7.0, -6.0, -5.0, -4.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0}, "Binning of the z-vertex axis"}; - Configurable cNbinsDiv{"cNbinsDiv", 1, "Integer to divide the number of bins"}; - Configurable cNbinsDivQA{"cNbinsDivQA", 1, "Integer to divide the number of bins for QA"}; - ConfigurableAxis cfgAxisV2{"cfgAxisV2", {200, -1, 1}, "Binning of the v2 axis (+-1 for EP method)"}; - Configurable cfgFillAdditionalAxis{"cfgFillAdditionalAxis", false, "Fill additional axis"}; - ConfigurableAxis cfgAxisPhi{"cfgAxisPhi", {8, 0, constants::math::PI}, "Binning of the #phi axis"}; - Configurable cfgUseScalProduct{"cfgUseScalProduct", false, "Use scalar product method"}; - Configurable cfgFillQAPlots{"cfgFillQAPlots", true, "Fill QA plots"}; + struct : ConfigurableGroup { + ConfigurableAxis cfgBinsPt{"cfgBinsPt", {VARIABLE_WIDTH, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5.0, 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 6.0, 6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 6.7, 6.8, 6.9, 7.0, 7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 7.7, 7.8, 7.9, 8.0, 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9, 9.0, 9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7, 9.8, 9.9, 10.0, 10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8, 10.9, 11.0, 11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7, 11.8, 11.9, 12.0, 12.1, 12.2, 12.3, 12.4, 12.5, 12.6, 12.7, 12.8, 12.9, 13.0, 13.1, 13.2, 13.3, 13.4, 13.5, 13.6, 13.7, 13.8, 13.9, 14.0, 14.1, 14.2, 14.3, 14.4, 14.5, 14.6, 14.7, 14.8, 14.9, 15.0}, "Binning of the pT axis"}; + ConfigurableAxis cfgBinsPtQA{"cfgBinsPtQA", {VARIABLE_WIDTH, 0.0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8, 5.0, 5.2, 5.4, 5.6, 5.8, 6.0, 6.2, 6.4, 6.6, 6.8, 7.0, 7.2, 7.4, 7.6, 7.8, 8.0, 8.2, 8.4, 8.6, 8.8, 9.0, 9.2, 9.4, 9.6, 9.8, 10.0}, "Binning of the pT axis"}; + ConfigurableAxis cfgBinsCent{"cfgBinsCent", {VARIABLE_WIDTH, 0.0, 1.0, 5.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0, 110.0}, "Binning of the centrality axis"}; + ConfigurableAxis cfgBinsVtxZ{"cfgBinsVtxZ", {VARIABLE_WIDTH, -10.0, -9.0, -8.0, -7.0, -6.0, -5.0, -4.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0}, "Binning of the z-vertex axis"}; + Configurable cNbinsDiv{"cNbinsDiv", 1, "Integer to divide the number of bins"}; + Configurable cNbinsDivQA{"cNbinsDivQA", 1, "Integer to divide the number of bins for QA"}; + ConfigurableAxis cfgAxisV2{"cfgAxisV2", {200, -1, 1}, "Binning of the v2 axis (+-1 for EP method)"}; + ConfigurableAxis cfgAxisPhi{"cfgAxisPhi", {8, 0, constants::math::PI}, "Binning of the #phi axis"}; + } AxisConfig; + + struct : ConfigurableGroup { + Configurable cfgFillQAPlots{"cfgFillQAPlots", true, "Fill QA plots"}; + Configurable cfgQvecSel{"cfgQvecSel", true, "Reject events when no QVector"}; + Configurable cfgCentEst{"cfgCentEst", 1, "Centrality estimator, 1: FT0C, 2: FT0M"}; + Configurable cfgFillAdditionalAxis{"cfgFillAdditionalAxis", false, "Fill additional axis"}; + Configurable cfgUseScalProduct{"cfgUseScalProduct", false, "Use scalar product method"}; + } AnalysisConfig; // Event cuts o2::analysis::CollisonCuts colCuts; - Configurable cfgEvtZvtx{"cfgEvtZvtx", 10.f, "Evt sel: Max. z-Vertex (cm)"}; - Configurable cfgEvtOccupancyInTimeRangeMax{"cfgEvtOccupancyInTimeRangeMax", -1, "Evt sel: maximum track occupancy"}; - Configurable cfgEvtOccupancyInTimeRangeMin{"cfgEvtOccupancyInTimeRangeMin", -1, "Evt sel: minimum track occupancy"}; - Configurable cfgEvtTriggerCheck{"cfgEvtTriggerCheck", false, "Evt sel: check for trigger"}; - Configurable cfgEvtOfflineCheck{"cfgEvtOfflineCheck", true, "Evt sel: check for offline selection"}; - Configurable cfgEvtTriggerTVXSel{"cfgEvtTriggerTVXSel", false, "Evt sel: triggerTVX selection (MB)"}; - Configurable cfgEvtTFBorderCut{"cfgEvtTFBorderCut", false, "Evt sel: apply TF border cut"}; - Configurable cfgEvtUseITSTPCvertex{"cfgEvtUseITSTPCvertex", false, "Evt sel: use at lease on ITS-TPC track for vertexing"}; - Configurable cfgEvtZvertexTimedifference{"cfgEvtZvertexTimedifference", true, "Evt sel: apply Z-vertex time difference"}; - Configurable cfgEvtPileupRejection{"cfgEvtPileupRejection", true, "Evt sel: apply pileup rejection"}; - Configurable cfgEvtNoITSROBorderCut{"cfgEvtNoITSROBorderCut", false, "Evt sel: apply NoITSRO border cut"}; - Configurable cfgEvtCollInTimeRangeStandard{"cfgEvtCollInTimeRangeStandard", true, "Evt sel: apply NoCollInTimeRangeStandard"}; - - /// Track selections - Configurable cMinPtcut{"cMinPtcut", 0.15, "Track minium pt cut"}; - Configurable cMaxEtacut{"cMaxEtacut", 0.8, "Track maximum eta cut"}; - - // Cuts from polarization analysis - Configurable cfgQvecSel{"cfgQvecSel", true, "Reject events when no QVector"}; - Configurable cfgCentEst{"cfgCentEst", 1, "Centrality estimator, 1: FT0C, 2: FT0M"}; - - // DCAr to PV - Configurable cMaxbDCArToPVcut{"cMaxbDCArToPVcut", 0.1, "Track DCAr cut to PV Maximum"}; - // DCAz to PV - Configurable cMaxbDCAzToPVcut{"cMaxbDCAzToPVcut", 0.1, "Track DCAz cut to PV Maximum"}; + struct : ConfigurableGroup { + Configurable cfgEvtZvtx{"cfgEvtZvtx", 10.f, "Evt sel: Max. z-Vertex (cm)"}; + Configurable cfgEvtOccupancyInTimeRangeMax{"cfgEvtOccupancyInTimeRangeMax", -1, "Evt sel: maximum track occupancy"}; + Configurable cfgEvtOccupancyInTimeRangeMin{"cfgEvtOccupancyInTimeRangeMin", -1, "Evt sel: minimum track occupancy"}; + Configurable cfgEvtTriggerCheck{"cfgEvtTriggerCheck", false, "Evt sel: check for trigger"}; + Configurable cfgEvtOfflineCheck{"cfgEvtOfflineCheck", true, "Evt sel: check for offline selection"}; + Configurable cfgEvtTriggerTVXSel{"cfgEvtTriggerTVXSel", false, "Evt sel: triggerTVX selection (MB)"}; + Configurable cfgEvtTFBorderCut{"cfgEvtTFBorderCut", false, "Evt sel: apply TF border cut"}; + Configurable cfgEvtUseITSTPCvertex{"cfgEvtUseITSTPCvertex", false, "Evt sel: use at lease on ITS-TPC track for vertexing"}; + Configurable cfgEvtZvertexTimedifference{"cfgEvtZvertexTimedifference", true, "Evt sel: apply Z-vertex time difference"}; + Configurable cfgEvtPileupRejection{"cfgEvtPileupRejection", true, "Evt sel: apply pileup rejection"}; + Configurable cfgEvtNoITSROBorderCut{"cfgEvtNoITSROBorderCut", false, "Evt sel: apply NoITSRO border cut"}; + Configurable cfgEvtCollInTimeRangeStandard{"cfgEvtCollInTimeRangeStandard", true, "Evt sel: apply NoCollInTimeRangeStandard"}; + } EventCuts; /// PID Selections, pion - Configurable cTPConly{"cTPConly", false, "Use only TPC for PID"}; // bool - Configurable cMaxTPCnSigmaPion{"cMaxTPCnSigmaPion", 3.0, "TPC nSigma cut for Pion"}; // TPC - Configurable cMaxTOFnSigmaPion{"cMaxTOFnSigmaPion", 3.0, "TOF nSigma cut for Pion"}; // TOF - Configurable nsigmaCutCombinedPion{"nsigmaCutCombinedPion", -999, "Combined nSigma cut for Pion"}; // Combined - Configurable cTOFVeto{"cTOFVeto", true, "TOF Veto, if false, TOF is nessessary for PID selection"}; // TOF Veto + struct : ConfigurableGroup { + Configurable cfgTPConly{"cfgTPConly", false, "Use only TPC for PID"}; // bool + Configurable cfgMaxTPCnSigmaPion{"cfgMaxTPCnSigmaPion", 3.0, "TPC nSigma cut for Pion"}; // TPC + Configurable cfgMaxTOFnSigmaPion{"cfgMaxTOFnSigmaPion", 3.0, "TOF nSigma cut for Pion"}; // TOF + Configurable cfgNsigmaCutCombinedPion{"cfgNsigmaCutCombinedPion", -999, "Combined nSigma cut for Pion"}; // Combined + Configurable cfgTOFVeto{"cfgTOFVeto", true, "TOF Veto, if false, TOF is nessessary for PID selection"}; // TOF Veto + } PIDCuts; // Track selections - Configurable cfgPrimaryTrack{"cfgPrimaryTrack", true, "Primary track selection"}; // kGoldenChi2 | kDCAxy | kDCAz - Configurable cfgGlobalWoDCATrack{"cfgGlobalWoDCATrack", true, "Global track selection without DCA"}; // kQualityTracks (kTrackType | kTPCNCls | kTPCCrossedRows | kTPCCrossedRowsOverNCls | kTPCChi2NDF | kTPCRefit | kITSNCls | kITSChi2NDF | kITSRefit | kITSHits) | kInAcceptanceTracks (kPtRange | kEtaRange) - Configurable cfgGlobalTrack{"cfgGlobalTrack", false, "Global track selection"}; // kGoldenChi2 | kDCAxy | kDCAz - Configurable cfgPVContributor{"cfgPVContributor", false, "PV contributor track selection"}; // PV Contriuibutor - - Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; - Configurable cfgTPCcluster{"cfgTPCcluster", 0, "Number of TPC cluster"}; - Configurable cfgRatioTPCRowsOverFindableCls{"cfgRatioTPCRowsOverFindableCls", 0.0f, "TPC Crossed Rows to Findable Clusters"}; - Configurable cfgITSChi2NCl{"cfgITSChi2NCl", 999.0, "ITS Chi2/NCl"}; - Configurable cfgTPCChi2NCl{"cfgTPCChi2NCl", 999.0, "TPC Chi2/NCl"}; - Configurable cfgUseTPCRefit{"cfgUseTPCRefit", false, "Require TPC Refit"}; - Configurable cfgUseITSRefit{"cfgUseITSRefit", false, "Require ITS Refit"}; - Configurable cfgHasITS{"cfgHasITS", false, "Require ITS"}; - Configurable cfgHasTPC{"cfgHasTPC", false, "Require TPC"}; - Configurable cfgHasTOF{"cfgHasTOF", false, "Require TOF"}; + struct : ConfigurableGroup { + Configurable cfgMinPtcut{"cfgMinPtcut", 0.15, "Track minium pt cut"}; + Configurable cfgMaxEtacut{"cfgMaxEtacut", 0.8, "Track maximum eta cut"}; + Configurable cfgPrimaryTrack{"cfgPrimaryTrack", true, "Primary track selection"}; // kGoldenChi2 | kDCAxy | kDCAz + Configurable cfgGlobalWoDCATrack{"cfgGlobalWoDCATrack", true, "Global track selection without DCA"}; // kQualityTracks (kTrackType | kTPCNCls | kTPCCrossedRows | kTPCCrossedRowsOverNCls | kTPCChi2NDF | kTPCRefit | kITSNCls | kITSChi2NDF | kITSRefit | kITSHits) | kInAcceptanceTracks (kPtRange | kEtaRange) + Configurable cfgGlobalTrack{"cfgGlobalTrack", false, "Global track selection"}; // kGoldenChi2 | kDCAxy | kDCAz + Configurable cfgPVContributor{"cfgPVContributor", false, "PV contributor track selection"}; // PV Contriuibutor + Configurable cfgpTdepDCAxyCut{"cfgpTdepDCAxyCut", false, "pT-dependent DCAxy cut"}; + Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; + Configurable cfgTPCcluster{"cfgTPCcluster", 0, "Number of TPC cluster"}; + Configurable cfgRatioTPCRowsOverFindableCls{"cfgRatioTPCRowsOverFindableCls", 0.0f, "TPC Crossed Rows to Findable Clusters"}; + Configurable cfgITSChi2NCl{"cfgITSChi2NCl", 999.0, "ITS Chi2/NCl"}; + Configurable cfgTPCChi2NCl{"cfgTPCChi2NCl", 999.0, "TPC Chi2/NCl"}; + Configurable cfgUseTPCRefit{"cfgUseTPCRefit", false, "Require TPC Refit"}; + Configurable cfgUseITSRefit{"cfgUseITSRefit", false, "Require ITS Refit"}; + Configurable cfgHasITS{"cfgHasITS", false, "Require ITS"}; + Configurable cfgHasTPC{"cfgHasTPC", false, "Require TPC"}; + Configurable cfgHasTOF{"cfgHasTOF", false, "Require TOF"}; + // DCA to PV + Configurable cfgMaxbDCArToPVcut{"cfgMaxbDCArToPVcut", 0.1, "Track DCAr cut to PV Maximum"}; + Configurable cfgMaxbDCAzToPVcut{"cfgMaxbDCAzToPVcut", 0.1, "Track DCAz cut to PV Maximum"}; + } TrackCuts; // Secondary Selection - Configurable cfgReturnFlag{"cfgReturnFlag", false, "Return Flag for debugging"}; - Configurable cSecondaryRequire{"cSecondaryRequire", true, "Secondary cuts on/off"}; - Configurable cSecondaryArmenterosCut{"cSecondaryArmenterosCut", true, "cut on Armenteros-Podolanski graph"}; - Configurable cSecondaryCrossMassHypothesisCut{"cSecondaryCrossMassHypothesisCut", false, "Apply cut based on the lambda mass hypothesis"}; - - Configurable cfgByPassDauPIDSelection{"cfgByPassDauPIDSelection", true, "Bypass Daughters PID selection"}; - Configurable cSecondaryDauDCAMax{"cSecondaryDauDCAMax", 0.2, "Maximum DCA Secondary daughters to PV"}; - Configurable cSecondaryDauPosDCAtoPVMin{"cSecondaryDauPosDCAtoPVMin", 0.0, "Minimum DCA Secondary positive daughters to PV"}; - Configurable cSecondaryDauNegDCAtoPVMin{"cSecondaryDauNegDCAtoPVMin", 0.0, "Minimum DCA Secondary negative daughters to PV"}; - - Configurable cSecondaryPtMin{"cSecondaryPtMin", 0.f, "Minimum transverse momentum of Secondary"}; - Configurable cSecondaryRapidityMax{"cSecondaryRapidityMax", 0.5, "Maximum rapidity of Secondary"}; - Configurable cSecondaryRadiusMin{"cSecondaryRadiusMin", 0.0, "Minimum transverse radius of Secondary"}; - Configurable cSecondaryRadiusMax{"cSecondaryRadiusMax", 999.9, "Maximum transverse radius of Secondary"}; - Configurable cSecondaryCosPAMin{"cSecondaryCosPAMin", 0.998, "Mininum cosine pointing angle of Secondary"}; - Configurable cSecondaryDCAtoPVMax{"cSecondaryDCAtoPVMax", 0.4, "Maximum DCA Secondary to PV"}; - Configurable cSecondaryProperLifetimeMax{"cSecondaryProperLifetimeMax", 20., "Maximum Secondary Lifetime"}; - Configurable cSecondaryparamArmenterosCut{"cSecondaryparamArmenterosCut", 0.2, "parameter for Armenteros Cut"}; - Configurable cSecondaryMassWindow{"cSecondaryMassWindow", 0.03, "Secondary inv mass selection window"}; - Configurable cSecondaryCrossMassCutWindow{"cSecondaryCrossMassCutWindow", 0.05, "Secondary inv mass selection window with (anti)lambda hypothesis"}; + struct : ConfigurableGroup { + Configurable cfgReturnFlag{"cfgReturnFlag", false, "Return Flag for debugging"}; + Configurable cfgSecondaryRequire{"cfgSecondaryRequire", true, "Secondary cuts on/off"}; + Configurable cfgSecondaryArmenterosCut{"cfgSecondaryArmenterosCut", true, "cut on Armenteros-Podolanski graph"}; + Configurable cfgSecondaryCrossMassHypothesisCut{"cfgSecondaryCrossMassHypothesisCut", false, "Apply cut based on the lambda mass hypothesis"}; + + Configurable cfgByPassDauPIDSelection{"cfgByPassDauPIDSelection", true, "Bypass Daughters PID selection"}; + Configurable cfgSecondaryDauDCAMax{"cfgSecondaryDauDCAMax", 0.2, "Maximum DCA Secondary daughters to PV"}; + Configurable cfgSecondaryDauPosDCAtoPVMin{"cfgSecondaryDauPosDCAtoPVMin", 0.0, "Minimum DCA Secondary positive daughters to PV"}; + Configurable cfgSecondaryDauNegDCAtoPVMin{"cfgSecondaryDauNegDCAtoPVMin", 0.0, "Minimum DCA Secondary negative daughters to PV"}; + + Configurable cfgSecondaryPtMin{"cfgSecondaryPtMin", 0.f, "Minimum transverse momentum of Secondary"}; + Configurable cfgSecondaryRapidityMax{"cfgSecondaryRapidityMax", 0.5, "Maximum rapidity of Secondary"}; + Configurable cfgSecondaryRadiusMin{"cfgSecondaryRadiusMin", 0.0, "Minimum transverse radius of Secondary"}; + Configurable cfgSecondaryRadiusMax{"cfgSecondaryRadiusMax", 999.9, "Maximum transverse radius of Secondary"}; + Configurable cfgSecondaryCosPAMin{"cfgSecondaryCosPAMin", 0.998, "Mininum cosine pointing angle of Secondary"}; + Configurable cfgSecondaryDCAtoPVMax{"cfgSecondaryDCAtoPVMax", 0.4, "Maximum DCA Secondary to PV"}; + Configurable cfgSecondaryProperLifetimeMax{"cfgSecondaryProperLifetimeMax", 20., "Maximum Secondary Lifetime"}; + Configurable cfgSecondaryparamArmenterosCut{"cfgSecondaryparamArmenterosCut", 0.2, "parameter for Armenteros Cut"}; + Configurable cfgSecondaryMassWindow{"cfgSecondaryMassWindow", 0.03, "Secondary inv mass selection window"}; + Configurable cfgSecondaryCrossMassCutWindow{"cfgSecondaryCrossMassCutWindow", 0.05, "Secondary inv mass selection window with (anti)lambda hypothesis"}; + } SecondaryCuts; // K* selection - Configurable cKstarMaxRap{"cKstarMaxRap", 0.5, "Kstar maximum rapidity"}; - Configurable cKstarMinRap{"cKstarMinRap", -0.5, "Kstar minimum rapidity"}; + struct : ConfigurableGroup { + Configurable cfgKstarMaxRap{"cfgKstarMaxRap", 0.5, "Kstar maximum rapidity"}; + Configurable cfgKstarMinRap{"cfgKstarMinRap", -0.5, "Kstar minimum rapidity"}; + } KstarCuts; // Confs from flow analysis - Configurable cfgnMods{"cfgnMods", 1, "The number of modulations of interest starting from 2"}; - Configurable cfgNQvec{"cfgNQvec", 7, "The number of total Qvectors for looping over the task"}; + struct : ConfigurableGroup { + Configurable cfgnMods{"cfgnMods", 2, "The number of modulations of interest starting from 2"}; + Configurable cfgNQvec{"cfgNQvec", 7, "The number of total Qvectors for looping over the task"}; - Configurable cfgQvecDetName{"cfgQvecDetName", "FT0C", "The name of detector to be analyzed"}; - Configurable cfgQvecRefAName{"cfgQvecRefAName", "TPCpos", "The name of detector for reference A"}; - Configurable cfgQvecRefBName{"cfgQvecRefBName", "TPCneg", "The name of detector for reference B"}; + Configurable cfgQvecDetName{"cfgQvecDetName", "FT0C", "The name of detector to be analyzed"}; + Configurable cfgQvecRefAName{"cfgQvecRefAName", "TPCpos", "The name of detector for reference A"}; + Configurable cfgQvecRefBName{"cfgQvecRefBName", "TPCneg", "The name of detector for reference B"}; + } EventPlaneConfig; // Bkg estimation - Configurable cfgFillRotBkg{"cfgFillRotBkg", true, "Fill rotated background"}; - Configurable cfgMinRot{"cfgMinRot", 5.0 * constants::math::PI / 6.0, "Minimum of rotation"}; - Configurable cfgMaxRot{"cfgMaxRot", 7.0 * constants::math::PI / 6.0, "Maximum of rotation"}; - Configurable cfgRotPion{"cfgRotPion", true, "Rotate pion"}; - Configurable cfgNrotBkg{"cfgNrotBkg", 9, "Number of rotated copies (background) per each original candidate"}; + struct : ConfigurableGroup { + Configurable cfgFillRotBkg{"cfgFillRotBkg", true, "Fill rotated background"}; + Configurable cfgMinRot{"cfgMinRot", 5.0 * constants::math::PI / 6.0, "Minimum of rotation"}; + Configurable cfgMaxRot{"cfgMaxRot", 7.0 * constants::math::PI / 6.0, "Maximum of rotation"}; + Configurable cfgRotPion{"cfgRotPion", true, "Rotate pion"}; + Configurable cfgNrotBkg{"cfgNrotBkg", 9, "Number of rotated copies (background) per each original candidate"}; + } BkgEstimationConfig; int lDetId; int lRefAId; @@ -234,23 +249,24 @@ struct Chk892Flow { { lCentrality = -999; - colCuts.setCuts(cfgEvtZvtx, cfgEvtTriggerCheck, cfgEvtOfflineCheck, /*checkRun3*/ true, /*triggerTVXsel*/ false, cfgEvtOccupancyInTimeRangeMax, cfgEvtOccupancyInTimeRangeMin); + colCuts.setCuts(EventCuts.cfgEvtZvtx, EventCuts.cfgEvtTriggerCheck, EventCuts.cfgEvtOfflineCheck, /*checkRun3*/ true, /*triggerTVXsel*/ false, EventCuts.cfgEvtOccupancyInTimeRangeMax, EventCuts.cfgEvtOccupancyInTimeRangeMin); colCuts.init(&histos); - colCuts.setTriggerTVX(cfgEvtTriggerTVXSel); - colCuts.setApplyTFBorderCut(cfgEvtTFBorderCut); - colCuts.setApplyITSTPCvertex(cfgEvtUseITSTPCvertex); - colCuts.setApplyZvertexTimedifference(cfgEvtZvertexTimedifference); - colCuts.setApplyPileupRejection(cfgEvtPileupRejection); - colCuts.setApplyNoITSROBorderCut(cfgEvtNoITSROBorderCut); - colCuts.setApplyCollInTimeRangeStandard(cfgEvtCollInTimeRangeStandard); - - AxisSpec centAxis = {cfgBinsCent, "T0M (%)"}; - AxisSpec vtxzAxis = {cfgBinsVtxZ, "Z Vertex (cm)"}; + colCuts.setTriggerTVX(EventCuts.cfgEvtTriggerTVXSel); + colCuts.setApplyTFBorderCut(EventCuts.cfgEvtTFBorderCut); + colCuts.setApplyITSTPCvertex(EventCuts.cfgEvtUseITSTPCvertex); + colCuts.setApplyZvertexTimedifference(EventCuts.cfgEvtZvertexTimedifference); + colCuts.setApplyPileupRejection(EventCuts.cfgEvtPileupRejection); + colCuts.setApplyNoITSROBorderCut(EventCuts.cfgEvtNoITSROBorderCut); + colCuts.setApplyCollInTimeRangeStandard(EventCuts.cfgEvtCollInTimeRangeStandard); + colCuts.printCuts(); + + AxisSpec centAxis = {AxisConfig.cfgBinsCent, "T0M (%)"}; + AxisSpec vtxzAxis = {AxisConfig.cfgBinsVtxZ, "Z Vertex (cm)"}; AxisSpec epAxis = {100, -1.0 * constants::math::PI, constants::math::PI}; - AxisSpec ptAxis = {cfgBinsPt, "#it{p}_{T} (GeV/#it{c})"}; - AxisSpec ptAxisQA = {cfgBinsPtQA, "#it{p}_{T} (GeV/#it{c})"}; - AxisSpec v2Axis = {cfgAxisV2, "#v_{2}"}; - AxisSpec phiAxis = {cfgAxisPhi, "2(#phi-#Psi_{2})"}; + AxisSpec ptAxis = {AxisConfig.cfgBinsPt, "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec ptAxisQA = {AxisConfig.cfgBinsPtQA, "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec v2Axis = {AxisConfig.cfgAxisV2, "#v_{2}"}; + AxisSpec phiAxis = {AxisConfig.cfgAxisPhi, "2(#phi-#Psi_{2})"}; AxisSpec radiusAxis = {50, 0, 5, "Radius (cm)"}; AxisSpec cpaAxis = {30, 0.97, 1.0, "CPA"}; AxisSpec tauAxis = {250, 0, 25, "Lifetime (cm)"}; @@ -258,15 +274,15 @@ struct Chk892Flow { AxisSpec dcaxyAxis = {100, 0, 1, "DCA_{#it{xy}} (cm)"}; AxisSpec dcazAxis = {200, 0, 2, "DCA_{#it{z}} (cm)"}; AxisSpec yAxis = {50, -1, 1, "Rapidity"}; - AxisSpec invMassAxisK0s = {400 / cNbinsDiv, 0.3, 0.7, "Invariant Mass (GeV/#it{c}^2)"}; // K0s ~497.611 - AxisSpec invMassAxisReso = {900 / cNbinsDiv, 0.5f, 1.4f, "Invariant Mass (GeV/#it{c}^2)"}; // chK(892) ~892 - AxisSpec pidQAAxis = {130 / cNbinsDivQA, -6.5, 6.5}; + AxisSpec invMassAxisK0s = {400 / AxisConfig.cNbinsDiv, 0.3, 0.7, "Invariant Mass (GeV/#it{c}^2)"}; // K0s ~497.611 + AxisSpec invMassAxisReso = {900 / AxisConfig.cNbinsDiv, 0.5f, 1.4f, "Invariant Mass (GeV/#it{c}^2)"}; // chK(892) ~892 + AxisSpec pidQAAxis = {130 / AxisConfig.cNbinsDivQA, -6.5, 6.5}; // THnSparse AxisSpec axisType = {BinType::kTYEnd, 0, BinType::kTYEnd, "Type of bin with charge and mix"}; AxisSpec mcLabelAxis = {5, -0.5, 4.5, "MC Label"}; - if (cfgReturnFlag) { + if (SecondaryCuts.cfgReturnFlag) { histos.add("QA/K0sCutCheck", "Check K0s cut", HistType::kTH1D, {AxisSpec{13, -0.5, 12.5, "Check"}}); } histos.add("QA/before/CentDist", "Centrality distribution", {HistType::kTH1D, {centAxis}}); @@ -280,15 +296,15 @@ struct Chk892Flow { histos.add("QA/EP/hEPResAC", "cos(n(A-C))", {HistType::kTH2D, {centAxis, epAxis}}); histos.add("QA/EP/hEPResBC", "cos(n(B-C))", {HistType::kTH2D, {centAxis, epAxis}}); - if (cfgUseScalProduct) { + if (AnalysisConfig.cfgUseScalProduct) { histos.add("QA/EP/hEPSPResAB", "cos(n(A-B))", {HistType::kTH2D, {centAxis, epAxis}}); histos.add("QA/EP/hEPSPResAC", "cos(n(A-C))", {HistType::kTH2D, {centAxis, epAxis}}); histos.add("QA/EP/hEPSPResBC", "cos(n(B-C))", {HistType::kTH2D, {centAxis, epAxis}}); } - if (cfgFillQAPlots) { + if (AnalysisConfig.cfgFillQAPlots) { // Rotated background - if (cfgFillRotBkg) { + if (BkgEstimationConfig.cfgFillRotBkg) { histos.add("QA/RotBkg/hRotBkg", "Rotated angle of rotated background", HistType::kTH1F, {{360, 0.0, o2::constants::math::TwoPI}}); } @@ -416,7 +432,7 @@ struct Chk892Flow { } // Invariant mass nSparse - if (cfgFillAdditionalAxis) { + if (AnalysisConfig.cfgFillAdditionalAxis) { histos.add("hInvmass_Kstar", "Invariant mass of unlike-sign chK(892)", HistType::kTHnSparseD, {axisType, centAxis, ptAxis, invMassAxisReso, v2Axis, phiAxis}); histos.add("hInvmass_K0s", "Invariant mass of unlike-sign K0s", HistType::kTHnSparseD, {centAxis, ptAxis, invMassAxisK0s, v2Axis, phiAxis}); if (doprocessMC) { @@ -430,19 +446,77 @@ struct Chk892Flow { } } - lDetId = getlDetId(cfgQvecDetName); - lRefAId = getlDetId(cfgQvecRefAName); - lRefBId = getlDetId(cfgQvecRefBName); + lDetId = getlDetId(EventPlaneConfig.cfgQvecDetName); + lRefAId = getlDetId(EventPlaneConfig.cfgQvecRefAName); + lRefBId = getlDetId(EventPlaneConfig.cfgQvecRefBName); if (lDetId == lRefAId || lDetId == lRefBId || lRefAId == lRefBId) { LOGF(info, "Wrong detector configuration \n The FT0C will be used to get Q-Vector \n The TPCpos and TPCneg will be used as reference systems"); - // LOGF(info) << "Wrong detector configuration \n The FT0C will be used to get Q-Vector \n The TPCpos and TPCneg will be used as reference systems"; lDetId = 0; lRefAId = 4; lRefBId = 5; } + if (EventPlaneConfig.cfgNQvec < 2) { + LOG(fatal) << "nMode must be larger than 1, current input (cfgNQvec): " << EventPlaneConfig.cfgNQvec; + } + LOGF(info, "lDetId: %d, lRefAId: %d, lRefBId: %d", lDetId, lRefAId, lRefBId); + + // MC + if (doprocessMC) { + // Bachelor pion + histos.add("QAMC/trkbpionDCAxy", "DCAxy distribution of bachelor pion candidates", HistType::kTH1D, {dcaxyAxis}); + histos.add("QAMC/trkbpionDCAz", "DCAz distribution of bachelor pion candidates", HistType::kTH1D, {dcazAxis}); + histos.add("QAMC/trkbpionpT", "pT distribution of bachelor pion candidates", HistType::kTH1D, {ptAxis}); + histos.add("QAMC/trkbpionTPCPID", "TPC PID of bachelor pion candidates", HistType::kTH2D, {ptAxis, pidQAAxis}); + histos.add("QAMC/trkbpionTOFPID", "TOF PID of bachelor pion candidates", HistType::kTH2D, {ptAxis, pidQAAxis}); + histos.add("QAMC/trkbpionTPCTOFPID", "TPC-TOF PID map of bachelor pion candidates", HistType::kTH2D, {pidQAAxis, pidQAAxis}); + + // Secondary pion 1 + histos.add("QAMC/trkppionDCAxy", "DCAxy distribution of secondary pion 1 (positive) candidates", HistType::kTH1D, {dcaxyAxis}); + histos.add("QAMC/trkppionDCAz", "DCAz distribution of secondary pion 1 (positive) candidates", HistType::kTH1D, {dcazAxis}); + histos.add("QAMC/trkppionpT", "pT distribution of secondary pion 1 (positive) candidates", HistType::kTH1D, {ptAxis}); + histos.add("QAMC/trkppionTPCPID", "TPC PID of secondary pion 1 (positive) candidates", HistType::kTH2D, {ptAxis, pidQAAxis}); + histos.add("QAMC/trkppionTOFPID", "TOF PID of secondary pion 1 (positive) candidates", HistType::kTH2D, {ptAxis, pidQAAxis}); + histos.add("QAMC/trkppionTPCTOFPID", "TPC-TOF PID map of secondary pion 1 (positive) candidates", HistType::kTH2D, {pidQAAxis, pidQAAxis}); + + // Secondary pion 2 + histos.add("QAMC/trknpionTPCPID", "TPC PID of secondary pion 2 (negative) candidates", HistType::kTH2D, {ptAxis, pidQAAxis}); + histos.add("QAMC/trknpionTOFPID", "TOF PID of secondary pion 2 (negative) candidates", HistType::kTH2D, {ptAxis, pidQAAxis}); + histos.add("QAMC/trknpionTPCTOFPID", "TPC-TOF PID map of secondary pion 2 (negative) candidates", HistType::kTH2D, {pidQAAxis, pidQAAxis}); + histos.add("QAMC/trknpionpT", "pT distribution of secondary pion 2 (negative) candidates", HistType::kTH1D, {ptAxis}); + histos.add("QAMC/trknpionDCAxy", "DCAxy distribution of secondary pion 2 (negative) candidates", HistType::kTH1D, {dcaxyAxis}); + histos.add("QAMC/trknpionDCAz", "DCAz distribution of secondary pion 2 (negative) candidates", HistType::kTH1D, {dcazAxis}); + + // Secondary Resonance (K0s candidates) + histos.add("QAMC/hDauDCASecondary", "DCA of daughters of secondary resonance", HistType::kTH1D, {dcaAxis}); + histos.add("QAMC/hDauPosDCAtoPVSecondary", "Pos DCA to PV of daughters secondary resonance", HistType::kTH1D, {dcaAxis}); + histos.add("QAMC/hDauNegDCAtoPVSecondary", "Neg DCA to PV of daughters secondary resonance", HistType::kTH1D, {dcaAxis}); + + histos.add("QAMC/hy_Secondary", "Rapidity distribution of secondary resonance", HistType::kTH1D, {yAxis}); + histos.add("QAMC/hCPASecondary", "Cosine pointing angle distribution of secondary resonance", HistType::kTH1D, {cpaAxis}); + histos.add("QAMC/hDCAtoPVSecondary", "DCA to PV distribution of secondary resonance", HistType::kTH1D, {dcaAxis}); + histos.add("QAMC/hPropTauSecondary", "Proper Lifetime distribution of secondary resonance", HistType::kTH1D, {tauAxis}); + histos.add("QAMC/hInvmassSecondary", "Invariant mass of unlike-sign secondary resonance", HistType::kTH1D, {invMassAxisK0s}); + + // K892 + histos.add("QAMC/KstarOA", "Opening angle of chK(892)", HistType::kTH1D, {AxisSpec{100, 0, 3.14, "Opening angle"}}); + histos.add("QAMC/KstarPairAsym", "Pair asymmetry of chK(892)", HistType::kTH1D, {AxisSpec{100, -1, 1, "Pair asymmetry"}}); + histos.add("QAMC/KstarRapidity", "Rapidity distribution of chK(892)", HistType::kTH1D, {yAxis}); + + histos.add("QAMC/kstarinvmass", "Invariant mass of unlike-sign chK(892)", HistType::kTH1D, {invMassAxisReso}); + histos.add("QAMC/k0sv2vsinvmass", "Invariant mass vs v2 of unlike-sign K0s", HistType::kTH2D, {invMassAxisK0s, v2Axis}); + histos.add("QAMC/kstarv2vsinvmass", "Invariant mass vs v2 of unlike-sign chK(892)", HistType::kTH2D, {invMassAxisReso, v2Axis}); + histos.add("QAMC/kstarinvmass_noKstar", "Invariant mass of unlike-sign no chK(892)", HistType::kTH1D, {invMassAxisReso}); + histos.add("QAMC/kstarv2vsinvmass_noKstar", "Invariant mass vs v2 of unlike-sign no chK(892)", HistType::kTH2D, {invMassAxisReso, v2Axis}); + + if (AnalysisConfig.cfgFillAdditionalAxis) { + histos.add("hInvmass_Kstar_MC", "Invariant mass of unlike chK(892)", HistType::kTHnSparseD, {axisType, centAxis, ptAxis, invMassAxisReso, v2Axis, phiAxis}); + } else { + histos.add("hInvmass_Kstar_MC", "Invariant mass of unlike chK(892)", HistType::kTHnSparseD, {axisType, centAxis, ptAxis, invMassAxisReso, v2Axis}); + } + } - ccdb->setURL(cfgURL); + ccdb->setURL(CCDBConfig.cfgURL); ccdbApi.init("http://alice-ccdb.cern.ch"); ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); @@ -456,9 +530,9 @@ struct Chk892Flow { template float getCentrality(CollisionType const& collision) { - if (cfgCentEst == 1) { + if (AnalysisConfig.cfgCentEst == 1) { return collision.centFT0C(); - } else if (cfgCentEst == 2) { + } else if (AnalysisConfig.cfgCentEst == 2) { return collision.centFT0M(); } else { return -999; @@ -491,41 +565,47 @@ struct Chk892Flow { bool trackCut(TrackType const& track) { // basic track cuts - if (std::abs(track.pt()) < cMinPtcut) - return false; - if (std::abs(track.eta()) > cMaxEtacut) + if (std::abs(track.pt()) < TrackCuts.cfgMinPtcut) return false; - if (track.itsNCls() < cfgITScluster) + if (std::abs(track.eta()) > TrackCuts.cfgMaxEtacut) return false; - if (track.tpcNClsFound() < cfgTPCcluster) + if (track.itsNCls() < TrackCuts.cfgITScluster) return false; - if (track.tpcCrossedRowsOverFindableCls() < cfgRatioTPCRowsOverFindableCls) + if (track.tpcNClsFound() < TrackCuts.cfgTPCcluster) return false; - if (track.itsChi2NCl() >= cfgITSChi2NCl) + if (track.tpcCrossedRowsOverFindableCls() < TrackCuts.cfgRatioTPCRowsOverFindableCls) return false; - if (track.tpcChi2NCl() >= cfgTPCChi2NCl) + if (track.itsChi2NCl() >= TrackCuts.cfgITSChi2NCl) return false; - if (cfgHasITS && !track.hasITS()) + if (track.tpcChi2NCl() >= TrackCuts.cfgTPCChi2NCl) return false; - if (cfgHasTPC && !track.hasTPC()) + if (TrackCuts.cfgHasITS && !track.hasITS()) return false; - if (cfgHasTOF && !track.hasTOF()) + if (TrackCuts.cfgHasTPC && !track.hasTPC()) return false; - if (cfgUseITSRefit && !track.passedITSRefit()) + if (TrackCuts.cfgHasTOF && !track.hasTOF()) return false; - if (cfgUseTPCRefit && !track.passedTPCRefit()) + if (TrackCuts.cfgUseITSRefit && !track.passedITSRefit()) return false; - if (cfgPVContributor && !track.isPVContributor()) + if (TrackCuts.cfgUseTPCRefit && !track.passedTPCRefit()) return false; - if (cfgGlobalWoDCATrack && !track.isGlobalTrackWoDCA()) + if (TrackCuts.cfgPVContributor && !track.isPVContributor()) return false; - if (cfgGlobalTrack && !track.isGlobalTrack()) + if (TrackCuts.cfgGlobalWoDCATrack && !track.isGlobalTrackWoDCA()) return false; - if (cfgPrimaryTrack && !track.isPrimaryTrack()) + if (TrackCuts.cfgGlobalTrack && !track.isGlobalTrack()) return false; - if (std::abs(track.dcaXY()) > cMaxbDCArToPVcut) + if (TrackCuts.cfgPrimaryTrack && !track.isPrimaryTrack()) return false; - if (std::abs(track.dcaZ()) > cMaxbDCAzToPVcut) + if (TrackCuts.cfgpTdepDCAxyCut) { + // Tuned on the LHC22f anchored MC LHC23d1d on primary pions. 7 Sigmas of the resolution + if (std::abs(track.dcaXY()) > (0.004 + (0.013 / track.pt()))) + return false; + } else { + if (std::abs(track.dcaXY()) > TrackCuts.cfgMaxbDCArToPVcut) + return false; + } + if (std::abs(track.dcaZ()) > TrackCuts.cfgMaxbDCAzToPVcut) return false; return true; } @@ -534,21 +614,21 @@ struct Chk892Flow { template bool selectionPIDPion(TrackType const& candidate) { - bool tpcPIDPassed = std::abs(candidate.tpcNSigmaPi()) < cMaxTPCnSigmaPion; + bool tpcPIDPassed = std::abs(candidate.tpcNSigmaPi()) < PIDCuts.cfgMaxTPCnSigmaPion; bool tofPIDPassed = false; - if (cTPConly) { + if (PIDCuts.cfgTPConly) { return tpcPIDPassed; } if (candidate.hasTOF()) { - tofPIDPassed = std::abs(candidate.tofNSigmaPi()) < cMaxTOFnSigmaPion || - (nsigmaCutCombinedPion > 0 && + tofPIDPassed = std::abs(candidate.tofNSigmaPi()) < PIDCuts.cfgMaxTOFnSigmaPion || + (PIDCuts.cfgNsigmaCutCombinedPion > 0 && candidate.tpcNSigmaPi() * candidate.tpcNSigmaPi() + candidate.tofNSigmaPi() * candidate.tofNSigmaPi() < - nsigmaCutCombinedPion * nsigmaCutCombinedPion); + PIDCuts.cfgNsigmaCutCombinedPion * PIDCuts.cfgNsigmaCutCombinedPion); } else { - tofPIDPassed = cTOFVeto; + tofPIDPassed = PIDCuts.cfgTOFVeto; } return tpcPIDPassed && tofPIDPassed; @@ -571,92 +651,92 @@ struct Chk892Flow { auto lMALambda = candidate.mAntiLambda(); auto checkCommonCuts = [&]() { - if (lDauDCA > cSecondaryDauDCAMax) + if (lDauDCA > SecondaryCuts.cfgSecondaryDauDCAMax) return false; - if (lDauPosDCAtoPV < cSecondaryDauPosDCAtoPVMin) + if (lDauPosDCAtoPV < SecondaryCuts.cfgSecondaryDauPosDCAtoPVMin) return false; - if (lDauNegDCAtoPV < cSecondaryDauNegDCAtoPVMin) + if (lDauNegDCAtoPV < SecondaryCuts.cfgSecondaryDauNegDCAtoPVMin) return false; - if (lPt < cSecondaryPtMin) + if (lPt < SecondaryCuts.cfgSecondaryPtMin) return false; - if (std::fabs(lRapidity) > cSecondaryRapidityMax) + if (std::fabs(lRapidity) > SecondaryCuts.cfgSecondaryRapidityMax) return false; - if (lRadius < cSecondaryRadiusMin || lRadius > cSecondaryRadiusMax) + if (lRadius < SecondaryCuts.cfgSecondaryRadiusMin || lRadius > SecondaryCuts.cfgSecondaryRadiusMax) return false; - if (lDCAtoPV > cSecondaryDCAtoPVMax) + if (lDCAtoPV > SecondaryCuts.cfgSecondaryDCAtoPVMax) return false; - if (lCPA < cSecondaryCosPAMin) + if (lCPA < SecondaryCuts.cfgSecondaryCosPAMin) return false; - if (lPropTauK0s > cSecondaryProperLifetimeMax) + if (lPropTauK0s > SecondaryCuts.cfgSecondaryProperLifetimeMax) return false; - if (candidate.qtarm() < cSecondaryparamArmenterosCut * std::abs(candidate.alpha())) + if (candidate.qtarm() < SecondaryCuts.cfgSecondaryparamArmenterosCut * std::abs(candidate.alpha())) return false; - if (std::fabs(lMk0s - MassK0Short) > cSecondaryMassWindow) + if (std::fabs(lMk0s - MassK0Short) > SecondaryCuts.cfgSecondaryMassWindow) return false; - if (cSecondaryCrossMassHypothesisCut && - ((std::fabs(lMLambda - MassLambda0) < cSecondaryCrossMassCutWindow) || (std::fabs(lMALambda - MassLambda0Bar) < cSecondaryCrossMassCutWindow))) + if (SecondaryCuts.cfgSecondaryCrossMassHypothesisCut && + ((std::fabs(lMLambda - MassLambda0) < SecondaryCuts.cfgSecondaryCrossMassCutWindow) || (std::fabs(lMALambda - MassLambda0Bar) < SecondaryCuts.cfgSecondaryCrossMassCutWindow))) return false; return true; }; - if (cfgReturnFlag) { // For cut study + if (SecondaryCuts.cfgReturnFlag) { // For cut study bool returnFlag = true; histos.fill(HIST("QA/K0sCutCheck"), 0); - if (lDauDCA > cSecondaryDauDCAMax) { + if (lDauDCA > SecondaryCuts.cfgSecondaryDauDCAMax) { histos.fill(HIST("QA/K0sCutCheck"), 1); returnFlag = false; } - if (lDauPosDCAtoPV < cSecondaryDauPosDCAtoPVMin) { + if (lDauPosDCAtoPV < SecondaryCuts.cfgSecondaryDauPosDCAtoPVMin) { histos.fill(HIST("QA/K0sCutCheck"), 2); returnFlag = false; } - if (lDauNegDCAtoPV < cSecondaryDauNegDCAtoPVMin) { + if (lDauNegDCAtoPV < SecondaryCuts.cfgSecondaryDauNegDCAtoPVMin) { histos.fill(HIST("QA/K0sCutCheck"), 3); returnFlag = false; } - if (lPt < cSecondaryPtMin) { + if (lPt < SecondaryCuts.cfgSecondaryPtMin) { histos.fill(HIST("QA/K0sCutCheck"), 4); returnFlag = false; } - if (std::fabs(lRapidity) > cSecondaryRapidityMax) { + if (std::fabs(lRapidity) > SecondaryCuts.cfgSecondaryRapidityMax) { histos.fill(HIST("QA/K0sCutCheck"), 5); returnFlag = false; } - if (lRadius < cSecondaryRadiusMin || lRadius > cSecondaryRadiusMax) { + if (lRadius < SecondaryCuts.cfgSecondaryRadiusMin || lRadius > SecondaryCuts.cfgSecondaryRadiusMax) { histos.fill(HIST("QA/K0sCutCheck"), 6); returnFlag = false; } - if (lDCAtoPV > cSecondaryDCAtoPVMax) { + if (lDCAtoPV > SecondaryCuts.cfgSecondaryDCAtoPVMax) { histos.fill(HIST("QA/K0sCutCheck"), 7); returnFlag = false; } - if (lCPA < cSecondaryCosPAMin) { + if (lCPA < SecondaryCuts.cfgSecondaryCosPAMin) { histos.fill(HIST("QA/K0sCutCheck"), 8); returnFlag = false; } - if (lPropTauK0s > cSecondaryProperLifetimeMax) { + if (lPropTauK0s > SecondaryCuts.cfgSecondaryProperLifetimeMax) { histos.fill(HIST("QA/K0sCutCheck"), 9); returnFlag = false; } - if (candidate.qtarm() < cSecondaryparamArmenterosCut * std::abs(candidate.alpha())) { + if (candidate.qtarm() < SecondaryCuts.cfgSecondaryparamArmenterosCut * std::abs(candidate.alpha())) { histos.fill(HIST("QA/K0sCutCheck"), 10); returnFlag = false; } - if (std::fabs(lMk0s - MassK0Short) > cSecondaryMassWindow) { + if (std::fabs(lMk0s - MassK0Short) > SecondaryCuts.cfgSecondaryMassWindow) { histos.fill(HIST("QA/K0sCutCheck"), 11); returnFlag = false; } - if (cSecondaryCrossMassHypothesisCut && - ((std::fabs(lMLambda - MassLambda0) < cSecondaryCrossMassCutWindow) || (std::fabs(lMALambda - MassLambda0Bar) < cSecondaryCrossMassCutWindow))) { + if (SecondaryCuts.cfgSecondaryCrossMassHypothesisCut && + ((std::fabs(lMLambda - MassLambda0) < SecondaryCuts.cfgSecondaryCrossMassCutWindow) || (std::fabs(lMALambda - MassLambda0Bar) < SecondaryCuts.cfgSecondaryCrossMassCutWindow))) { histos.fill(HIST("QA/K0sCutCheck"), 12); returnFlag = false; } return returnFlag; } else { // normal usage - if (cSecondaryRequire) { + if (SecondaryCuts.cfgSecondaryRequire) { return checkCommonCuts(); } else { - return std::fabs(lMk0s - MassK0Short) <= cSecondaryMassWindow; // always apply mass window cut + return std::fabs(lMk0s - MassK0Short) <= SecondaryCuts.cfgSecondaryMassWindow; // always apply mass window cut } } } // selectionK0s @@ -702,9 +782,9 @@ struct Chk892Flow { { histos.fill(HIST("QA/before/CentDist"), lCentrality); - lQvecDetInd = lDetId * 4 + 3 + (nmode - 2) * cfgNQvec * 4; - lQvecRefAInd = lRefAId * 4 + 3 + (nmode - 2) * cfgNQvec * 4; - lQvecRefBInd = lRefBId * 4 + 3 + (nmode - 2) * cfgNQvec * 4; + lQvecDetInd = lDetId * 4 + 3 + (nmode - 2) * EventPlaneConfig.cfgNQvec * 4; + lQvecRefAInd = lRefAId * 4 + 3 + (nmode - 2) * EventPlaneConfig.cfgNQvec * 4; + lQvecRefBInd = lRefBId * 4 + 3 + (nmode - 2) * EventPlaneConfig.cfgNQvec * 4; double lEPDet = std::atan2(collision.qvecIm()[lQvecDetInd], collision.qvecRe()[lQvecDetInd]) / static_cast(nmode); double lEPRefB = std::atan2(collision.qvecIm()[lQvecRefAInd], collision.qvecRe()[lQvecRefAInd]) / static_cast(nmode); @@ -722,7 +802,7 @@ struct Chk892Flow { histos.fill(HIST("QA/EP/hEPResAC"), lCentrality, lEPResAC); histos.fill(HIST("QA/EP/hEPResBC"), lCentrality, lEPResBC); // Scalar product method - if (cfgUseScalProduct) { + if (AnalysisConfig.cfgUseScalProduct) { double lEPSPResAB = (collision.qvecRe()[lQvecDetInd] * collision.qvecRe()[lQvecRefAInd] + collision.qvecIm()[lQvecDetInd] * collision.qvecIm()[lQvecRefAInd]) * lEPResAB; double lEPSPResAC = (collision.qvecRe()[lQvecDetInd] * collision.qvecRe()[lQvecRefBInd] + collision.qvecIm()[lQvecDetInd] * collision.qvecIm()[lQvecRefBInd]) * lEPResAC; double lEPSPResBC = (collision.qvecRe()[lQvecRefAInd] * collision.qvecRe()[lQvecRefBInd] + collision.qvecIm()[lQvecRefAInd] * collision.qvecIm()[lQvecRefBInd]) * lEPResBC; @@ -743,7 +823,7 @@ struct Chk892Flow { auto trkbNSigmaPiTOF = (istrkbhasTOF) ? bTrack.tofNSigmaPi() : -999.; if constexpr (!IsMix) { - if (cfgFillQAPlots) { + if (AnalysisConfig.cfgFillQAPlots) { // Bachelor pion QA plots histos.fill(HIST("QA/before/trkbpionTPCPID"), trkbpt, trkbNSigmaPiTPC); if (istrkbhasTOF) { @@ -762,7 +842,7 @@ struct Chk892Flow { continue; if constexpr (!IsMix) { - if (cfgFillQAPlots) { + if (AnalysisConfig.cfgFillQAPlots) { // Bachelor pion QA plots after applying cuts histos.fill(HIST("QA/after/trkbpionTPCPID"), trkbpt, trkbNSigmaPiTPC); if (istrkbhasTOF) { @@ -805,7 +885,7 @@ struct Chk892Flow { auto lPhiMinusPsiK0s = RecoDecay::constrainAngle(lResoSecondary.Phi() - lEPDet, 0.0, 2); // constrain angle to range 0, Pi auto v2K0s = std::cos(static_cast(nmode) * lPhiMinusPsiK0s); if constexpr (!IsMix) { - if (cfgFillQAPlots) { + if (AnalysisConfig.cfgFillQAPlots) { // Seconddary QA plots histos.fill(HIST("QA/before/trkppionTPCPID"), trkppt, trkpNSigmaPiTPC); if (istrkphasTOF) { @@ -835,15 +915,15 @@ struct Chk892Flow { } } - if (!cfgByPassDauPIDSelection && !selectionPIDPion(posDauTrack)) + if (!SecondaryCuts.cfgByPassDauPIDSelection && !selectionPIDPion(posDauTrack)) continue; - if (!cfgByPassDauPIDSelection && !selectionPIDPion(negDauTrack)) + if (!SecondaryCuts.cfgByPassDauPIDSelection && !selectionPIDPion(negDauTrack)) continue; if (!selectionK0s(collision, k0sCand)) continue; if constexpr (!IsMix) { - if (cfgFillQAPlots) { + if (AnalysisConfig.cfgFillQAPlots) { // Seconddary QA plots after applying cuts histos.fill(HIST("QA/after/trkppionTPCPID"), trkppt, trkpNSigmaPiTPC); if (istrkphasTOF) { @@ -871,14 +951,19 @@ struct Chk892Flow { histos.fill(HIST("QA/after/hInvmassSecondary"), trkkMass); histos.fill(HIST("QA/after/k0sv2vsinvmass"), lResoSecondary.M(), v2K0s); + if (AnalysisConfig.cfgFillAdditionalAxis) { + histos.fill(HIST("hInvmass_K0s"), lCentrality, lResoSecondary.Pt(), lResoSecondary.M(), v2K0s, static_cast(nmode) * lPhiMinusPsiK0s); + } else { + histos.fill(HIST("hInvmass_K0s"), lCentrality, lResoSecondary.Pt(), lResoSecondary.M(), v2K0s); + } } + if (AnalysisConfig.cfgFillAdditionalAxis) { + histos.fill(HIST("hInvmass_K0s"), lCentrality, lResoSecondary.Pt(), lResoSecondary.M(), v2K0s, static_cast(nmode) * lPhiMinusPsiK0s); + } else { + histos.fill(HIST("hInvmass_K0s"), lCentrality, lResoSecondary.Pt(), lResoSecondary.M(), v2K0s); + } + k0sIndicies.push_back(k0sCand.index()); } - if (cfgFillAdditionalAxis) { - histos.fill(HIST("hInvmass_K0s"), lCentrality, lResoSecondary.Pt(), lResoSecondary.M(), v2K0s, static_cast(nmode) * lPhiMinusPsiK0s); - } else { - histos.fill(HIST("hInvmass_K0s"), lCentrality, lResoSecondary.Pt(), lResoSecondary.M(), v2K0s); - } - k0sIndicies.push_back(k0sCand.index()); } for (const auto& trackIndex : trackIndicies) { @@ -894,7 +979,7 @@ struct Chk892Flow { auto lPhiMinusPsiKstar = RecoDecay::constrainAngle(resoPhi - lEPDet, 0.0, 2); // constrain angle to range 0, Pi auto resoFlowValue = std::cos(static_cast(nmode) * lPhiMinusPsiKstar); // Scalar product method - if (cfgUseScalProduct) { + if (AnalysisConfig.cfgUseScalProduct) { float cosNPhi = std::cos(static_cast(nmode) * resoPhi); float sinNPhi = std::sin(static_cast(nmode) * resoPhi); resoFlowValue = cosNPhi * collision.qvecRe()[lQvecDetInd] + sinNPhi * collision.qvecIm()[lQvecDetInd]; @@ -902,37 +987,37 @@ struct Chk892Flow { // QA plots if constexpr (!IsMix) { - if (cfgFillQAPlots) { + if (AnalysisConfig.cfgFillQAPlots) { histos.fill(HIST("QA/before/KstarRapidity"), lResoKstar.Rapidity()); histos.fill(HIST("QA/before/kstarinvmass"), lResoKstar.M()); histos.fill(HIST("QA/before/kstarv2vsinvmass"), lResoKstar.M(), resoFlowValue); } } - if (lResoKstar.Rapidity() > cKstarMaxRap || lResoKstar.Rapidity() < cKstarMinRap) + if (lResoKstar.Rapidity() > KstarCuts.cfgKstarMaxRap || lResoKstar.Rapidity() < KstarCuts.cfgKstarMinRap) continue; if constexpr (!IsMix) { unsigned int typeKstar = bTrack.sign() > 0 ? BinType::kKstarP : BinType::kKstarN; - if (cfgFillQAPlots) { + if (AnalysisConfig.cfgFillQAPlots) { histos.fill(HIST("QA/after/KstarRapidity"), lResoKstar.Rapidity()); histos.fill(HIST("QA/after/kstarinvmass"), lResoKstar.M()); histos.fill(HIST("QA/after/kstarv2vsinvmass"), lResoKstar.M(), resoFlowValue); } - if (cfgFillAdditionalAxis) { + if (AnalysisConfig.cfgFillAdditionalAxis) { histos.fill(HIST("hInvmass_Kstar"), typeKstar, lCentrality, lResoKstar.Pt(), lResoKstar.M(), resoFlowValue, static_cast(nmode) * lPhiMinusPsiKstar); } else { histos.fill(HIST("hInvmass_Kstar"), typeKstar, lCentrality, lResoKstar.Pt(), lResoKstar.M(), resoFlowValue); } - if (cfgFillRotBkg) { - for (int i = 0; i < cfgNrotBkg; i++) { - auto lRotAngle = cfgMinRot + i * (cfgMaxRot - cfgMinRot) / (1.0 * (cfgNrotBkg - 1)); - if (cfgFillQAPlots) { + if (BkgEstimationConfig.cfgFillRotBkg) { + for (int i = 0; i < BkgEstimationConfig.cfgNrotBkg; i++) { + auto lRotAngle = BkgEstimationConfig.cfgMinRot + i * ((BkgEstimationConfig.cfgMaxRot - BkgEstimationConfig.cfgMinRot) / (BkgEstimationConfig.cfgNrotBkg - 1)); + if (AnalysisConfig.cfgFillQAPlots) { histos.fill(HIST("QA/RotBkg/hRotBkg"), lRotAngle); } - if (cfgRotPion) { + if (BkgEstimationConfig.cfgRotPion) { lDaughterRot = lDecayDaughter_bach; lDaughterRot.RotateZ(lRotAngle); lResonanceRot = lDaughterRot + lResoSecondary; @@ -944,13 +1029,13 @@ struct Chk892Flow { resoPhi = lResonanceRot.Phi(); auto lPhiMinusPsiKstar = RecoDecay::constrainAngle(resoPhi - lEPDet, 0.0, 2); // constrain angle to range 0, Pi auto resoFlowValue = std::cos(static_cast(nmode) * lPhiMinusPsiKstar); - if (cfgUseScalProduct) { + if (AnalysisConfig.cfgUseScalProduct) { float cosNPhi = std::cos(static_cast(nmode) * resoPhi); float sinNPhi = std::sin(static_cast(nmode) * resoPhi); resoFlowValue = cosNPhi * collision.qvecRe()[lQvecDetInd] + sinNPhi * collision.qvecIm()[lQvecDetInd]; } typeKstar = bTrack.sign() > 0 ? BinType::kKstarP_Rot : BinType::kKstarN_Rot; - if (cfgFillAdditionalAxis) { + if (AnalysisConfig.cfgFillAdditionalAxis) { histos.fill(HIST("hInvmass_Kstar"), typeKstar, lCentrality, lResonanceRot.Pt(), lResonanceRot.M(), resoFlowValue, static_cast(nmode) * lPhiMinusPsiKstar); } else { histos.fill(HIST("hInvmass_Kstar"), typeKstar, lCentrality, lResonanceRot.Pt(), lResonanceRot.M(), resoFlowValue); @@ -979,12 +1064,12 @@ struct Chk892Flow { { if (!colCuts.isSelected(collision)) // Default event selection return; - if (cfgQvecSel && (collision.qvecAmp()[lDetId] < 1e-4 || collision.qvecAmp()[lRefAId] < 1e-4 || collision.qvecAmp()[lRefBId] < 1e-4)) + if (AnalysisConfig.cfgQvecSel && (collision.qvecAmp()[lDetId] < 1e-4 || collision.qvecAmp()[lRefAId] < 1e-4 || collision.qvecAmp()[lRefBId] < 1e-4)) return; // If we don't have a Q-vector colCuts.fillQA(collision); lCentrality = getCentrality(collision); - fillHistograms(collision, tracks, v0s, 2); // second order + fillHistograms(collision, tracks, v0s, EventPlaneConfig.cfgnMods); // second order } PROCESS_SWITCH(Chk892Flow, processData, "Process Event for data without Partitioning", false); @@ -993,7 +1078,7 @@ struct Chk892Flow { MCTrackCandidates const& tracks, MCV0Candidates const& v0s) { - fillHistograms(collision, tracks, v0s, 2); + fillHistograms(collision, tracks, v0s, EventPlaneConfig.cfgnMods); } PROCESS_SWITCH(Chk892Flow, processMC, "Process Event for MC", false); }; From f0fc591882529c4b543b7f8c519b10262c6649aa Mon Sep 17 00:00:00 2001 From: yuanzhe <90246048+wang-yuanzhe@users.noreply.github.com> Date: Wed, 19 Feb 2025 22:37:51 +0100 Subject: [PATCH 0328/1650] [PWGLF] Update analysis for reduced 3body table and EM (#10081) --- PWGLF/DataModel/Reduced3BodyTables.h | 2 + .../Nuspex/decay3bodybuilder.cxx | 177 +++++---------- .../Nuspex/threebodyRecoTask.cxx | 212 +++++++++++------- 3 files changed, 180 insertions(+), 211 deletions(-) diff --git a/PWGLF/DataModel/Reduced3BodyTables.h b/PWGLF/DataModel/Reduced3BodyTables.h index 9f963951cf0..2c3b8a47cde 100644 --- a/PWGLF/DataModel/Reduced3BodyTables.h +++ b/PWGLF/DataModel/Reduced3BodyTables.h @@ -16,6 +16,8 @@ #include "Framework/AnalysisDataModel.h" #include "Common/Core/RecoDecay.h" #include "CommonConstants/PhysicsConstants.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/Centrality.h" #include "PWGLF/DataModel/Vtx3BodyTables.h" namespace o2::aod diff --git a/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx b/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx index 70aa8b61195..ca363ef30b1 100644 --- a/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx +++ b/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx @@ -215,9 +215,8 @@ struct decay3bodyBuilder { HistogramRegistry registry{"registry", {}}; // hypothesis - Configurable motherhyp{"motherhyp", 0, "hypothesis of the 3body decayed particle"}; // corresponds to hyp3body - int bachelorcharge = 1; // to be updated in Init base on the hypothesis - // o2::aod::pidtofgeneric::TofPidNewCollision bachelorTOFPID; // to be updated in Init base on the hypothesis + Configurable motherhyp{"motherhyp", 0, "hypothesis of the 3body decayed particle"}; // corresponds to hyp3body + int bachelorcharge = 1; // to be updated in Init base on the hypothesis o2::aod::pidtofgeneric::TofPidNewCollision bachelorTOFPID; // to be updated in Init base on the hypothesis // Selection criteria @@ -316,7 +315,6 @@ struct decay3bodyBuilder { Configurable emTpcPidNsigmaCut{"emTpcPidNsigmaCut", 5, "emTpcPidNsigmaCut"}; } EMTrackSel; - Preslice tracksperCol = aod::track::collisionId; SliceCache cache; ConfigurableAxis axisPosZ{"axisPosZ", {40, -10, 10}, "Mixing bins - posZ"}; ConfigurableAxis axisCentrality{"axisCentrality", {10, 0, 100}, "Mixing bins - centrality"}; @@ -403,7 +401,7 @@ struct decay3bodyBuilder { fitter3body.setMatCorrType(matCorr); // Add histograms separately for different process functions - if (doprocessRun3 == true || doprocessRun3Reduced || doprocessRun3EM == true || doprocessRun3EMLikeSign == true) { + if (doprocessRun3 == true || doprocessRun3Reduced || doprocessRun3ReducedEM == true) { registry.add("hEventCounter", "hEventCounter", HistType::kTH1F, {{1, 0.0f, 1.0f}}); auto hVtx3BodyCounter = registry.add("hVtx3BodyCounter", "hVtx3BodyCounter", HistType::kTH1F, {{6, 0.0f, 6.0f}}); hVtx3BodyCounter->GetXaxis()->SetBinLabel(1, "Total"); @@ -1478,30 +1476,28 @@ struct decay3bodyBuilder { } // end buildVtx3BodyDataTableKFParticle //------------------------------------------------------------------ - void processRun3(ColwithEvTimes const& collisions, TrackExtPIDIUwithEvTimes const& /*tracksIU*/, aod::Decay3Bodys const& decay3bodys, aod::BCsWithTimestamps const&) + void processRun3(ColwithEvTimes const& collisions, aod::Decay3Bodys const& decay3bodys, TrackExtPIDIUwithEvTimes const&, aod::BCsWithTimestamps const&) { vtxCandidates.clear(); - for (const auto& collision : collisions) { + registry.fill(HIST("hEventCounter"), 0.5, collisions.size()); + + for (const auto& d3body : decay3bodys) { + auto t0 = d3body.track0_as(); + auto t1 = d3body.track1_as(); + auto t2 = d3body.track2_as(); + auto collision = d3body.collision_as(); auto bc = collision.bc_as(); initCCDB(bc); - registry.fill(HIST("hEventCounter"), 0.5); - - const auto& d3bodys_thisCollision = decay3bodys.sliceBy(perCollision, collision.globalIndex()); - for (const auto& d3body : d3bodys_thisCollision) { - auto t0 = d3body.template track0_as(); - auto t1 = d3body.template track1_as(); - auto t2 = d3body.template track2_as(); - - // Recalculate the TOF PID - double tofNSigmaBach = -999; - if (t2.has_collision() && t2.hasTOF()) { - auto originalcol = t2.template collision_as(); - tofNSigmaBach = bachelorTOFPID.GetTOFNSigma(t2, originalcol, collision); - } - fillVtxCand(collision, t0, t1, t2, d3body.globalIndex(), bachelorcharge, tofNSigmaBach); + // Recalculate the TOF PID + double tofNSigmaBach = -999; + if (t2.has_collision() && t2.hasTOF()) { + auto originalcol = t2.template collision_as(); + tofNSigmaBach = bachelorTOFPID.GetTOFNSigma(t2, originalcol, collision); } + + fillVtxCand(collision, t0, t1, t2, d3body.globalIndex(), bachelorcharge, tofNSigmaBach); } for (const auto& candVtx : vtxCandidates) { @@ -1511,7 +1507,7 @@ struct decay3bodyBuilder { PROCESS_SWITCH(decay3bodyBuilder, processRun3, "Produce DCA fitter decay3body tables", true); //------------------------------------------------------------------ - void processRun3Reduced(aod::ReducedCollisions const& collisions, aod::ReducedTracksIU const&, aod::ReducedDecay3Bodys const& decay3bodys, aod::BCsWithTimestamps const&) + void processRun3Reduced(aod::ReducedCollisions const& collisions, aod::ReducedDecay3Bodys const& decay3bodys, aod::ReducedTracksIU const&) { vtxCandidates.clear(); @@ -1520,13 +1516,10 @@ struct decay3bodyBuilder { int lastRunNumber = -1; for (const auto& d3body : decay3bodys) { - auto t0 = d3body.template track0_as(); - auto t1 = d3body.template track1_as(); - auto t2 = d3body.template track2_as(); - auto collision = d3body.template collision_as(); - // auto bc = collision.bc_as(); - // initCCDB(bc); - // set magnetic field only when run number changes + auto t0 = d3body.track0_as(); + auto t1 = d3body.track1_as(); + auto t2 = d3body.track2_as(); + auto collision = d3body.collision_as(); if (collision.runNumber() != lastRunNumber) { initCCDBReduced(collision.runNumber()); lastRunNumber = collision.runNumber(); // Update the last run number @@ -1543,106 +1536,37 @@ struct decay3bodyBuilder { //------------------------------------------------------------------ // Event-mixing background - void processRun3EM(FullCols const& collisions, TrackExtPIDIUwithEvTimes const& tracksIU, aod::BCsWithTimestamps const&) + void processRun3ReducedEM(ReducedCollisionsMultsCents const&, aod::ReducedDecay3Bodys const&, aod::ReducedTracksIU const&) { - vtxCandidates.clear(); - auto tracksTuple = std::make_tuple(tracksIU); BinningType binningEvent{{axisPosZ, axisCentrality}, true}; - SameKindPair pair{binningEvent, EMTrackSel.nUseMixedEvent, -1, collisions, tracksTuple, &cache}; - - Partition candProtons = aod::track::signed1Pt > 0.f && nabs(aod::track::eta) <= EMTrackSel.etacut && aod::track::pt >= EMTrackSel.minProtonPt && aod::track::pt <= EMTrackSel.maxProtonPt && aod::track::tpcNClsFindable >= (uint8_t)EMTrackSel.mintpcNClsproton && nabs(aod::pidtpc::tpcNSigmaPr) <= EMTrackSel.emTpcPidNsigmaCut; - Partition candAntiProtons = aod::track::signed1Pt < 0.f && nabs(aod::track::eta) <= EMTrackSel.etacut && aod::track::pt >= EMTrackSel.minProtonPt && aod::track::pt <= EMTrackSel.maxProtonPt && aod::track::tpcNClsFindable >= (uint8_t)EMTrackSel.mintpcNClsproton && nabs(aod::pidtpc::tpcNSigmaPr) <= EMTrackSel.emTpcPidNsigmaCut; - Partition candPionPlus = aod::track::signed1Pt > 0.f && nabs(aod::track::eta) <= EMTrackSel.etacut && aod::track::pt >= EMTrackSel.minPionPt && aod::track::pt <= EMTrackSel.maxPionPt && aod::track::tpcNClsFindable >= (uint8_t)EMTrackSel.mintpcNClspion && nabs(aod::pidtpc::tpcNSigmaPi) <= EMTrackSel.emTpcPidNsigmaCut; - Partition candPionMinus = aod::track::signed1Pt < 0.f && nabs(aod::track::eta) <= EMTrackSel.etacut && aod::track::pt >= EMTrackSel.minPionPt && aod::track::pt <= EMTrackSel.maxPionPt && aod::track::tpcNClsFindable >= (uint8_t)EMTrackSel.mintpcNClspion && nabs(aod::pidtpc::tpcNSigmaPi) <= EMTrackSel.emTpcPidNsigmaCut; - Partition candBachelors = aod::track::signed1Pt > 0.f && nabs(aod::track::eta) <= EMTrackSel.etacut && aod::track::pt >= EMTrackSel.minDeuteronPt && aod::track::pt <= EMTrackSel.maxDeuteronPt && aod::track::tpcNClsFindable >= (uint8_t)EMTrackSel.mintpcNClsbachelor && nabs(aod::pidtpc::tpcNSigmaDe) <= EMTrackSel.emTpcPidNsigmaCut; - Partition candAntiBachelors = aod::track::signed1Pt < 0.f && nabs(aod::track::eta) <= EMTrackSel.etacut && aod::track::pt >= EMTrackSel.minDeuteronPt && aod::track::pt <= EMTrackSel.maxDeuteronPt && aod::track::tpcNClsFindable >= (uint8_t)EMTrackSel.mintpcNClsbachelor && nabs(aod::pidtpc::tpcNSigmaDe) <= EMTrackSel.emTpcPidNsigmaCut; - candProtons.bindTable(tracksIU); - candPionPlus.bindTable(tracksIU); - candAntiProtons.bindTable(tracksIU); - candPionMinus.bindTable(tracksIU); - candBachelors.bindTable(tracksIU); - candAntiBachelors.bindTable(tracksIU); - - for (const auto& [c1, tracks1, c2, tracks2] : pair) { - if (EMTrackSel.em_event_sel8_selection && (!c1.sel8() || !c2.sel8())) { - continue; - } - auto bc = c1.bc_as(); - initCCDB(bc); - auto protons = candProtons->sliceByCached(aod::track::collisionId, c1.globalIndex(), cache); - auto pionsplus = candPionPlus->sliceByCached(aod::track::collisionId, c1.globalIndex(), cache); - auto antiprotons = candAntiProtons->sliceByCached(aod::track::collisionId, c1.globalIndex(), cache); - auto pionsminus = candPionMinus->sliceByCached(aod::track::collisionId, c1.globalIndex(), cache); - auto bachelors = candBachelors->sliceByCached(aod::track::collisionId, c2.globalIndex(), cache); - auto antibachelors = candAntiBachelors->sliceByCached(aod::track::collisionId, c2.globalIndex(), cache); - - for (auto const& [tpos, tneg, tbach] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(protons, pionsminus, bachelors))) { - double tofNSigmaBach = bachelorTOFPID.GetTOFNSigma(tbach); // Recalculate the TOF PID - fillVtxCand(c1, tpos, tneg, tbach, -1, bachelorcharge, tofNSigmaBach); - } - for (auto const& [tpos, tneg, tbach] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(pionsplus, antiprotons, antibachelors))) { - double tofNSigmaBach = bachelorTOFPID.GetTOFNSigma(tbach); // Recalculate the TOF PID - fillVtxCand(c1, tpos, tneg, tbach, -1, bachelorcharge, tofNSigmaBach); - } - } - - // Aviod break of preslice in following workflow - std::sort(vtxCandidates.begin(), vtxCandidates.end(), [](const vtxCandidate a, const vtxCandidate b) { - return a.collisionId < b.collisionId; - }); + SameKindPair pair{binningEvent, EMTrackSel.nUseMixedEvent, -1, &cache}; - for (const auto& candVtx : vtxCandidates) { - fillVtx3BodyTable(candVtx); - } - } - PROCESS_SWITCH(decay3bodyBuilder, processRun3EM, "Produce event-mix background", false); - - //------------------------------------------------------------------ - // Event-mixing background + like-sign (to aviod deuteron with wrong collisionId) - void processRun3EMLikeSign(FullCols const& collisions, TrackExtPIDIUwithEvTimes const& tracksIU, aod::BCsWithTimestamps const&) - { + int lastRunNumber = -1; - vtxCandidates.clear(); + for (const auto& [c0, decay3bodys0, c1, decay3bodys1] : pair) { + for (auto& [d3body0, d3body1] : combinations(soa::CombinationsFullIndexPolicy(decay3bodys0, decay3bodys1))) { + auto tpos0 = d3body0.track0_as(); + auto tneg0 = d3body0.track1_as(); + auto tbach0 = d3body0.track2_as(); + auto tpos1 = d3body1.track0_as(); + auto tneg1 = d3body1.track1_as(); + auto tbach1 = d3body1.track2_as(); + + if (c0.runNumber() != lastRunNumber) { + initCCDBReduced(c0.runNumber()); + lastRunNumber = c0.runNumber(); // Update the last run number + LOG(debug) << "CCDB initialized for run " << lastRunNumber; + } + fillVtxCand(c0, tpos0, tneg0, tbach1, -1, bachelorcharge, tbach1.tofNSigmaDe()); - auto tracksTuple = std::make_tuple(tracksIU); - BinningType binningEvent{{axisPosZ, axisCentrality}, true}; - SameKindPair pair{binningEvent, 5, -1, collisions, tracksTuple, &cache}; - - Partition candProtons = aod::track::signed1Pt > 0.f && nabs(aod::track::eta) <= EMTrackSel.etacut && aod::track::pt >= EMTrackSel.minProtonPt && aod::track::pt <= EMTrackSel.maxProtonPt && aod::track::tpcNClsFindable >= (uint8_t)EMTrackSel.mintpcNClsproton && nabs(aod::pidtpc::tpcNSigmaPr) <= EMTrackSel.emTpcPidNsigmaCut; - Partition candPionPlus = aod::track::signed1Pt > 0.f && nabs(aod::track::eta) <= EMTrackSel.etacut && aod::track::pt >= EMTrackSel.minPionPt && aod::track::pt <= EMTrackSel.maxPionPt && aod::track::tpcNClsFindable >= (uint8_t)EMTrackSel.mintpcNClspion && nabs(aod::pidtpc::tpcNSigmaPi) <= EMTrackSel.emTpcPidNsigmaCut; - Partition candAntiProtons = aod::track::signed1Pt < 0.f && nabs(aod::track::eta) <= EMTrackSel.etacut && aod::track::pt >= EMTrackSel.minProtonPt && aod::track::pt <= EMTrackSel.maxProtonPt && aod::track::tpcNClsFindable >= (uint8_t)EMTrackSel.mintpcNClsproton && nabs(aod::pidtpc::tpcNSigmaPr) <= EMTrackSel.emTpcPidNsigmaCut; - Partition candPionMinus = aod::track::signed1Pt < 0.f && nabs(aod::track::eta) <= EMTrackSel.etacut && aod::track::pt >= EMTrackSel.minPionPt && aod::track::pt <= EMTrackSel.maxPionPt && aod::track::tpcNClsFindable >= (uint8_t)EMTrackSel.mintpcNClspion && nabs(aod::pidtpc::tpcNSigmaPi) <= EMTrackSel.emTpcPidNsigmaCut; - Partition candBachelors = aod::track::signed1Pt > 0.f && nabs(aod::track::eta) <= EMTrackSel.etacut && aod::track::pt >= EMTrackSel.minDeuteronPt && aod::track::pt <= EMTrackSel.maxDeuteronPt && aod::track::tpcNClsFindable >= (uint8_t)EMTrackSel.mintpcNClsbachelor && nabs(aod::pidtpc::tpcNSigmaDe) <= EMTrackSel.emTpcPidNsigmaCut; - Partition candAntiBachelors = aod::track::signed1Pt < 0.f && nabs(aod::track::eta) <= EMTrackSel.etacut && aod::track::pt >= EMTrackSel.minDeuteronPt && aod::track::pt <= EMTrackSel.maxDeuteronPt && aod::track::tpcNClsFindable >= (uint8_t)EMTrackSel.mintpcNClsbachelor && nabs(aod::pidtpc::tpcNSigmaDe) <= EMTrackSel.emTpcPidNsigmaCut; - candProtons.bindTable(tracksIU); - candPionPlus.bindTable(tracksIU); - candAntiProtons.bindTable(tracksIU); - candPionMinus.bindTable(tracksIU); - candBachelors.bindTable(tracksIU); - candAntiBachelors.bindTable(tracksIU); - - for (const auto& [c1, tracks1, c2, tracks2] : pair) { - if (EMTrackSel.em_event_sel8_selection && (!c1.sel8() || !c2.sel8())) { - continue; - } - auto bc = c1.bc_as(); - initCCDB(bc); - auto protons = candProtons->sliceByCached(aod::track::collisionId, c1.globalIndex(), cache); - auto pionsplus = candPionPlus->sliceByCached(aod::track::collisionId, c1.globalIndex(), cache); - auto antiprotons = candAntiProtons->sliceByCached(aod::track::collisionId, c1.globalIndex(), cache); - auto pionsminus = candPionMinus->sliceByCached(aod::track::collisionId, c1.globalIndex(), cache); - auto bachelors = candBachelors->sliceByCached(aod::track::collisionId, c2.globalIndex(), cache); - auto antibachelors = candAntiBachelors->sliceByCached(aod::track::collisionId, c2.globalIndex(), cache); - - for (auto const& [tpos, tneg, tbach] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(protons, pionsminus, antibachelors))) { - double tofNSigmaBach = bachelorTOFPID.GetTOFNSigma(tbach); // Recalculate the TOF PID - fillVtxCand(c1, tpos, tneg, tbach, -1, bachelorcharge, tofNSigmaBach); - } - for (auto const& [tpos, tneg, tbach] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(pionsplus, antiprotons, bachelors))) { - double tofNSigmaBach = bachelorTOFPID.GetTOFNSigma(tbach); // Recalculate the TOF PID - fillVtxCand(c1, tpos, tneg, tbach, -1, bachelorcharge, tofNSigmaBach); + if (c1.runNumber() != lastRunNumber) { + initCCDBReduced(c1.runNumber()); + lastRunNumber = c1.runNumber(); // Update the last run number + LOG(debug) << "CCDB initialized for run " << lastRunNumber; + } + fillVtxCand(c1, tpos1, tneg1, tbach0, -1, bachelorcharge, tbach0.tofNSigmaDe()); } } @@ -1655,7 +1579,8 @@ struct decay3bodyBuilder { fillVtx3BodyTable(candVtx); } } - PROCESS_SWITCH(decay3bodyBuilder, processRun3EMLikeSign, "Produce event-mix background with like-sign method", false); + PROCESS_SWITCH(decay3bodyBuilder, processRun3ReducedEM, "Produce event-mix background", false); + //------------------------------------------------------------------ void processRun3withKFParticle(ColwithEvTimes const& collisions, TrackExtPIDIUwithEvTimes const&, aod::Decay3Bodys const& decay3bodys, aod::BCsWithTimestamps const&) @@ -2014,10 +1939,10 @@ struct decay3bodyLabelBuilder { Configurable TpcPidNsigmaCut{"TpcPidNsigmaCut", 5, "TpcPidNsigmaCut"}; - void processDoNotBuildLabels(aod::Collisions::iterator const&) + void processDoNotBuildLabels(aod::Decay3BodyDataLink const&) // is it possible to have none parameter? { // dummy process function - should not be required in the future - } + }; PROCESS_SWITCH(decay3bodyLabelBuilder, processDoNotBuildLabels, "Do not produce MC label tables", true); void processBuildLabels(aod::Decay3BodysLinked const& decay3bodys, aod::Vtx3BodyDatas const& vtx3bodydatas, MCLabeledTracksIU const&, aod::McParticles const&) diff --git a/PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx b/PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx index 624ab1efa1b..8ec606b064b 100644 --- a/PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx +++ b/PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx @@ -28,10 +28,8 @@ #include "ReconstructionDataFormats/Track.h" #include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" -#include "PWGLF/DataModel/LFStrangenessTables.h" #include "PWGLF/DataModel/Vtx3BodyTables.h" -#include "Common/Core/TrackSelection.h" -#include "Common/DataModel/TrackSelectionTables.h" +#include "PWGLF/DataModel/Reduced3BodyTables.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Centrality.h" #include "Common/DataModel/PIDResponse.h" @@ -45,7 +43,8 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; -using FullTracksExtIU = soa::Join; +using ReducedCols = soa::Join; +using FullTracksExtIU = soa::Join; using MCLabeledTracksIU = soa::Join; struct Candidate3body { @@ -54,6 +53,8 @@ struct Candidate3body { int track0Id; int track1Id; int track2Id; + // Collision + float colCentFT0C; // sv and candidate bool isMatter; float invmass; @@ -99,6 +100,8 @@ struct ThreebodyRecoTask { //------------------------------------------------------------------ Preslice perCollisionVtx3BodyDatas = o2::aod::vtx3body::collisionId; + // Configuration to enable like-sign analysis + Configurable cfgLikeSignAnalysis{"cfgLikeSignAnalysis", false, "Enable like-sign analysis"}; // Selection criteria Configurable vtxcospa{"vtxcospa", 0.99, "Vtx CosPA"}; // double -> N.B. dcos(x)/dx = 0 at x=0) Configurable dcavtxdau{"dcavtxdau", 1.0, "DCA Vtx Daughters"}; // loose cut @@ -217,7 +220,6 @@ struct ThreebodyRecoTask { void init(InitContext const&) { - zorroSummary.setObject(zorro.getZorroSummary()); mRunNumber = 0; @@ -238,8 +240,8 @@ struct ThreebodyRecoTask { registry.add("hDiffRVtxDeuteron", "hDiffRVtxDeuteron", HistType::kTH1F, {{100, -10, 10}}); // difference between the radius of decay vertex and minR of deuteron registry.add("hDiffDaughterR", "hDiffDaughterR", HistType::kTH1F, {{10000, -100, 100}}); // difference between minR of pion&proton and R of deuteron(bachelor) - if (doprocessDataLikeSign == true) { - registry.add("hCorrectMassHypertriton", "hCorrectMassHypertriton", HistType::kTH1F, {{80, 2.96f, 3.04f}}); // check if there are contamination of possible signals which are caused by unexpected PID + if (cfgLikeSignAnalysis) { + registry.add("hInvMassCorrectSign", "hInvMassCorrectSign", HistType::kTH1F, {{80, 2.96f, 3.04f}}); // check if there are contamination of possible signals which are caused by unexpected PID } if (doprocessMC == true) { @@ -312,12 +314,40 @@ struct ThreebodyRecoTask { return false; } + //------------------------------------------------------------------ + // Event Selection + template + bool eventSelection(TCollision const& collision) + { + auto bc = collision.template bc_as(); + initCCDB(bc); + registry.fill(HIST("hEventCounter"), 0.5); + + if (event_sel8_selection && !collision.sel8()) { + return false; + } + registry.fill(HIST("hEventCounter"), 1.5); + if (event_posZ_selection && std::abs(collision.posZ()) > 10.f) { // 10cm + return false; + } + registry.fill(HIST("hEventCounter"), 2.5); + registry.fill(HIST("hCentFT0C"), collision.centFT0C()); + + if (cfgSkimmedProcessing) { + bool zorroSelected = zorro.isSelected(bc.globalBC()); /// Just let Zorro do the accounting + if (zorroSelected) { + registry.fill(HIST("hEventCounter"), 3.5); + } + } + + return true; + } + //------------------------------------------------------------------ // Fill candidate table template void fillCand(TCollisionTable const& collision, TCandTable const& candData, TTrackTable const& trackProton, TTrackTable const& trackPion, TTrackTable const& trackDeuteron, bool isMatter, bool isTrueCand = false, int lLabel = -1, TLorentzVector lmother = {0, 0, 0, 0}, double MClifetime = -1) { - double cospa = candData.vtxcosPA(collision.posX(), collision.posY(), collision.posZ()); double ct = candData.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassHyperTriton; @@ -335,6 +365,7 @@ struct ThreebodyRecoTask { cand3body.track0Id = candData.track0Id(); cand3body.track1Id = candData.track1Id(); cand3body.track2Id = candData.track2Id(); + cand3body.colCentFT0C = collision.centFT0C(); cand3body.invmass = cand3body.isMatter ? candData.mHypertriton() : candData.mAntiHypertriton(); cand3body.lcand.SetXYZM(candData.px(), candData.py(), candData.pz(), o2::constants::physics::MassHyperTriton); cand3body.ct = ct; @@ -482,7 +513,6 @@ struct ThreebodyRecoTask { template void candidateAnalysis(TCollisionTable const& collision, TCandTable const& candData, bool& if_hasvtx, bool isTrueCand = false, int lLabel = -1, TLorentzVector lmother = {0, 0, 0, 0}, double MClifetime = -1) { - auto track0 = candData.template track0_as(); auto track1 = candData.template track1_as(); auto track2 = candData.template track2_as(); @@ -500,11 +530,10 @@ struct ThreebodyRecoTask { } //------------------------------------------------------------------ - // Analysis process for like-sign background : (p pi- anti-d) or (anti-p pi+ d) + // Analysis process for like-sign candidates : (p pi- anti-d) or (anti-p pi+ d) template void likeSignAnalysis(TCollisionTable const& collision, TCandTable const& candData, bool& if_hasvtx, bool isTrueCand = false, int lLabel = -1, TLorentzVector lmother = {0, 0, 0, 0}, double MClifetime = -1) { - auto track0 = candData.template track0_as(); auto track1 = candData.template track1_as(); auto track2 = candData.template track2_as(); @@ -521,13 +550,76 @@ struct ThreebodyRecoTask { fillCand(collision, candData, trackProton, trackPion, trackDeuteron, isMatter, isTrueCand, lLabel, lmother, MClifetime); // QA for if signals have the possibility to be reconginzed as a like-sign background if (isMatter) { - registry.fill(HIST("hCorrectMassHypertriton"), candData.mHypertriton()); + registry.fill(HIST("hInvMassCorrectSign"), candData.mHypertriton()); } else { - registry.fill(HIST("hCorrectMassHypertriton"), candData.mAntiHypertriton()); + registry.fill(HIST("hInvMassCorrectSign"), candData.mAntiHypertriton()); } } } + //------------------------------------------------------------------ + // Analysis process for reduced data + template + void reducedAnalysis(TCollisionTable const& collision, TCandTable const& candData, TTracks tracks, bool isTrueCand = false, int lLabel = -1, TLorentzVector lmother = {0, 0, 0, 0}, double MClifetime = -1) + { + auto track0 = tracks.iteratorAt(candData.track0Id()); + auto track1 = tracks.iteratorAt(candData.track1Id()); + auto track2 = tracks.iteratorAt(candData.track2Id()); + + bool isMatter = track2.sign() > 0; // true if the candidate is hypertriton (p pi- d) + + auto& trackProton = isMatter ? track0 : track1; + auto& trackPion = isMatter ? track1 : track0; + auto& trackDeuteron = track2; + + if (selectCand(collision, candData, trackProton, trackPion, trackDeuteron, isMatter, isTrueCand)) { + fillCand(collision, candData, trackProton, trackPion, trackDeuteron, isMatter, isTrueCand, lLabel, lmother, MClifetime); + } + } + + //------------------------------------------------------------------ + // Analysis process for reduced data with like-sign candidates + template + void reducedLikeSignAnalysis(TCollisionTable const& collision, TCandTable const& candData, TTracks tracks, bool isTrueCand = false, int lLabel = -1, TLorentzVector lmother = {0, 0, 0, 0}, double MClifetime = -1) + { + auto track0 = tracks.iteratorAt(candData.track0Id()); + auto track1 = tracks.iteratorAt(candData.track1Id()); + auto track2 = tracks.iteratorAt(candData.track2Id()); + + bool isMatter = track2.sign() < 0; // true if seach for background consists of (p pi- anti-d) + + // Assume proton has an oppisite charge with deuteron + auto& trackProton = isMatter ? track0 : track1; + auto& trackPion = isMatter ? track1 : track0; + auto& trackDeuteron = track2; + + if (selectCand(collision, candData, trackProton, trackPion, trackDeuteron, isMatter, isTrueCand)) { + fillCand(collision, candData, trackProton, trackPion, trackDeuteron, isMatter, isTrueCand, lLabel, lmother, MClifetime); + // QA for if signals have the possibility to be reconginzed as a like-sign background + if (isMatter) { + registry.fill(HIST("hInvMassCorrectSign"), candData.mHypertriton()); + } else { + registry.fill(HIST("hInvMassCorrectSign"), candData.mAntiHypertriton()); + } + } + } + + //------------------------------------------------------------------ + void fillOutputDataTable(Candidate3body const& cand3body) + { + outputDataTable(cand3body.colCentFT0C, + cand3body.isMatter, cand3body.invmass, cand3body.lcand.P(), cand3body.lcand.Pt(), cand3body.ct, + cand3body.cosPA, cand3body.dcadaughters, cand3body.dcacandtopv, cand3body.vtxradius, + cand3body.lproton.Pt(), cand3body.lproton.Eta(), cand3body.lproton.Phi(), cand3body.dauinnermostR[0], + cand3body.lpion.Pt(), cand3body.lpion.Eta(), cand3body.lpion.Phi(), cand3body.dauinnermostR[1], + cand3body.lbachelor.Pt(), cand3body.lbachelor.Eta(), cand3body.lbachelor.Phi(), cand3body.dauinnermostR[2], + cand3body.dautpcNclusters[0], cand3body.dautpcNclusters[1], cand3body.dautpcNclusters[2], + cand3body.dauitsclussize[0], cand3body.dauitsclussize[1], cand3body.dauitsclussize[2], + cand3body.dautpcNsigma[0], cand3body.dautpcNsigma[1], cand3body.dautpcNsigma[2], cand3body.bachelortofNsigma, + cand3body.daudcaxytopv[0], cand3body.daudcaxytopv[1], cand3body.daudcaxytopv[2], + cand3body.daudcatopv[0], cand3body.daudcatopv[1], cand3body.daudcatopv[2]); + } + //------------------------------------------------------------------ // collect information for generated hypertriton (should be called after event selection) void getGeneratedH3LInfo(aod::McParticles const& particlesMC) @@ -582,30 +674,18 @@ struct ThreebodyRecoTask { for (const auto& collision : collisions) { candidates3body.clear(); - auto bc = collision.bc_as(); - initCCDB(bc); - registry.fill(HIST("hEventCounter"), 0.5); - if (event_sel8_selection && !collision.sel8()) { + if (!eventSelection(collision)) { continue; } - registry.fill(HIST("hEventCounter"), 1.5); - if (event_posZ_selection && std::abs(collision.posZ()) > 10.f) { // 10cm - continue; - } - registry.fill(HIST("hEventCounter"), 2.5); - registry.fill(HIST("hCentFT0C"), collision.centFT0C()); - - if (cfgSkimmedProcessing) { - bool zorroSelected = zorro.isSelected(collision.bc_as().globalBC()); /// Just let Zorro do the accounting - if (zorroSelected) { - registry.fill(HIST("hEventCounter"), 3.5); - } - } bool if_hasvtx = false; auto d3bodyCands = vtx3bodydatas.sliceBy(perCollisionVtx3BodyDatas, collision.globalIndex()); for (const auto& vtx : d3bodyCands) { - candidateAnalysis(collision, vtx, if_hasvtx); + if (cfgLikeSignAnalysis) { + likeSignAnalysis(collision, vtx, if_hasvtx); + } else { + candidateAnalysis(collision, vtx, if_hasvtx); + } } if (if_hasvtx) registry.fill(HIST("hEventCounter"), 4.5); @@ -613,72 +693,34 @@ struct ThreebodyRecoTask { resetHistos(); for (const auto& cand3body : candidates3body) { - outputDataTable(collision.centFT0C(), - cand3body.isMatter, cand3body.invmass, cand3body.lcand.P(), cand3body.lcand.Pt(), cand3body.ct, - cand3body.cosPA, cand3body.dcadaughters, cand3body.dcacandtopv, cand3body.vtxradius, - cand3body.lproton.Pt(), cand3body.lproton.Eta(), cand3body.lproton.Phi(), cand3body.dauinnermostR[0], - cand3body.lpion.Pt(), cand3body.lpion.Eta(), cand3body.lpion.Phi(), cand3body.dauinnermostR[1], - cand3body.lbachelor.Pt(), cand3body.lbachelor.Eta(), cand3body.lbachelor.Phi(), cand3body.dauinnermostR[2], - cand3body.dautpcNclusters[0], cand3body.dautpcNclusters[1], cand3body.dautpcNclusters[2], - cand3body.dauitsclussize[0], cand3body.dauitsclussize[1], cand3body.dauitsclussize[2], - cand3body.dautpcNsigma[0], cand3body.dautpcNsigma[1], cand3body.dautpcNsigma[2], cand3body.bachelortofNsigma, - cand3body.daudcaxytopv[0], cand3body.daudcaxytopv[1], cand3body.daudcaxytopv[2], - cand3body.daudcatopv[0], cand3body.daudcatopv[1], cand3body.daudcatopv[2]); + fillOutputDataTable(cand3body); } } } PROCESS_SWITCH(ThreebodyRecoTask, processData, "Real data reconstruction", true); //------------------------------------------------------------------ - // process like-sign signal - void processDataLikeSign(soa::Join const& collisions, aod::Vtx3BodyDatas const& vtx3bodydatas, FullTracksExtIU const& /*tracks*/) + // process reduced data analysis + void processReducedData(ReducedCols const& collisions, aod::Vtx3BodyDatas const& vtx3bodydatas, aod::ReducedTracksIU const& tracks) { - for (const auto& collision : collisions) { - candidates3body.clear(); - registry.fill(HIST("hEventCounter"), 0.5); - if (event_sel8_selection && !collision.sel8()) { - continue; - } - registry.fill(HIST("hEventCounter"), 1.5); - if (event_posZ_selection && std::abs(collision.posZ()) > 10.f) { // 10cm - continue; - } - registry.fill(HIST("hEventCounter"), 2.5); - registry.fill(HIST("hCentFT0C"), collision.centFT0C()); - - if (cfgSkimmedProcessing) { - bool zorroSelected = zorro.isSelected(collision.bc_as().globalBC()); /// Just let Zorro do the accounting - if (zorroSelected) { - registry.fill(HIST("hEventCounter"), 3.5); - } - } + candidates3body.clear(); - bool if_hasvtx = false; - auto d3bodyCands = vtx3bodydatas.sliceBy(perCollisionVtx3BodyDatas, collision.globalIndex()); - for (const auto& vtx : d3bodyCands) { - likeSignAnalysis(collision, vtx, if_hasvtx); + for (const auto& vtx : vtx3bodydatas) { + const auto& collision = collisions.iteratorAt(vtx.collisionId()); + if (cfgLikeSignAnalysis) { + reducedLikeSignAnalysis(collision, vtx, tracks); + } else { + reducedAnalysis(collision, vtx, tracks); } - if (if_hasvtx) - registry.fill(HIST("hEventCounter"), 4.5); - fillHistos(); - resetHistos(); - for (const auto& cand3body : candidates3body) { - outputDataTable(collision.centFT0C(), - cand3body.isMatter, cand3body.invmass, cand3body.lcand.P(), cand3body.lcand.Pt(), cand3body.ct, - cand3body.cosPA, cand3body.dcadaughters, cand3body.dcacandtopv, cand3body.vtxradius, - cand3body.lproton.Pt(), cand3body.lproton.Eta(), cand3body.lproton.Phi(), cand3body.dauinnermostR[0], - cand3body.lpion.Pt(), cand3body.lpion.Eta(), cand3body.lpion.Phi(), cand3body.dauinnermostR[1], - cand3body.lbachelor.Pt(), cand3body.lbachelor.Eta(), cand3body.lbachelor.Phi(), cand3body.dauinnermostR[2], - cand3body.dautpcNclusters[0], cand3body.dautpcNclusters[1], cand3body.dautpcNclusters[2], - cand3body.dauitsclussize[0], cand3body.dauitsclussize[1], cand3body.dauitsclussize[2], - cand3body.dautpcNsigma[0], cand3body.dautpcNsigma[1], cand3body.dautpcNsigma[2], cand3body.bachelortofNsigma, - cand3body.daudcaxytopv[0], cand3body.daudcaxytopv[1], cand3body.daudcaxytopv[2], - cand3body.daudcatopv[0], cand3body.daudcatopv[1], cand3body.daudcatopv[2]); + fillOutputDataTable(cand3body); } + candidates3body.clear(); } + fillHistos(); + resetHistos(); } - PROCESS_SWITCH(ThreebodyRecoTask, processDataLikeSign, "Like-sign signal reconstruction", false); + PROCESS_SWITCH(ThreebodyRecoTask, processReducedData, "Reduced data reconstruction", false); //------------------------------------------------------------------ // process mc analysis @@ -750,7 +792,7 @@ struct ThreebodyRecoTask { resetHistos(); for (const auto& cand3body : candidates3body) { - outputMCTable(collision.centFT0C(), + outputMCTable(cand3body.colCentFT0C, cand3body.isMatter, cand3body.invmass, cand3body.lcand.P(), cand3body.lcand.Pt(), cand3body.ct, cand3body.cosPA, cand3body.dcadaughters, cand3body.dcacandtopv, cand3body.vtxradius, cand3body.lproton.Pt(), cand3body.lproton.Eta(), cand3body.lproton.Phi(), cand3body.dauinnermostR[0], From b0a1486f9db50e68ca841d1891af6d01090c30e2 Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Thu, 20 Feb 2025 07:27:27 +0800 Subject: [PATCH 0329/1650] [PWGCF] flowtask: reduce configurables; read weight list; (#10075) --- PWGCF/Flow/Tasks/flowTask.cxx | 52 +++++++++++++--------- PWGCF/GenericFramework/Core/GFWWeights.cxx | 14 ++++++ PWGCF/GenericFramework/Core/GFWWeights.h | 1 + 3 files changed, 47 insertions(+), 20 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowTask.cxx b/PWGCF/Flow/Tasks/flowTask.cxx index 57eda5f982c..63f2d0037e6 100644 --- a/PWGCF/Flow/Tasks/flowTask.cxx +++ b/PWGCF/Flow/Tasks/flowTask.cxx @@ -42,6 +42,7 @@ #include "TList.h" #include #include +#include #include using namespace o2; @@ -70,7 +71,6 @@ struct FlowTask { O2_DEFINE_CONFIGURABLE(cfgCutDCAxyppPass3Enabled, bool, false, "switch of ppPass3 DCAxy pt dependent cut") O2_DEFINE_CONFIGURABLE(cfgCutDCAzPtDepEnabled, bool, false, "switch of DCAz pt dependent cut") O2_DEFINE_CONFIGURABLE(cfgTrkSelSwitch, bool, false, "switch for self-defined track selection") - O2_DEFINE_CONFIGURABLE(cfgTrkSelRun3ITSMatch, bool, false, "GlobalTrackRun3ITSMatching::Run3ITSall7Layers selection") O2_DEFINE_CONFIGURABLE(cfgUseAdditionalEventCut, bool, false, "Use additional event cut on mult correlations") O2_DEFINE_CONFIGURABLE(cfgUseTentativeEventCounter, bool, false, "After sel8(), count events regardless of real event selection") O2_DEFINE_CONFIGURABLE(cfgEvSelkNoSameBunchPileup, bool, false, "rejects collisions which are associated with the same found-by-T0 bunch crossing") @@ -91,6 +91,8 @@ struct FlowTask { O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeightsRefPt, bool, false, "NUA weights are filled in ref pt bins") O2_DEFINE_CONFIGURABLE(cfgEfficiency, std::string, "", "CCDB path to efficiency object") O2_DEFINE_CONFIGURABLE(cfgAcceptance, std::string, "", "CCDB path to acceptance object") + O2_DEFINE_CONFIGURABLE(cfgAcceptanceList, std::string, "", "CCDB path to acceptance lsit object") + O2_DEFINE_CONFIGURABLE(cfgAcceptanceListEnabled, bool, false, "switch of acceptance list") O2_DEFINE_CONFIGURABLE(cfgEvSelOccupancy, bool, true, "Occupancy cut") O2_DEFINE_CONFIGURABLE(cfgCutOccupancyHigh, int, 500, "High cut on TPC occupancy") O2_DEFINE_CONFIGURABLE(cfgCutOccupancyLow, int, 0, "Low cut on TPC occupancy") @@ -99,17 +101,10 @@ struct FlowTask { Configurable> cfgUserDefineGFWName{"cfgUserDefineGFWName", std::vector{"Ch02Gap22", "Ch12Gap22"}, "User defined GFW Name"}; Configurable> cfgRunRemoveList{"cfgRunRemoveList", std::vector{-1}, "excluded run numbers"}; - ConfigurableAxis axisVertex{"axisVertex", {40, -20, 20}, "vertex axis for histograms"}; - ConfigurableAxis axisPhi{"axisPhi", {60, 0.0, constants::math::TwoPI}, "phi axis for histograms"}; - ConfigurableAxis axisEta{"axisEta", {40, -1., 1.}, "eta axis for histograms"}; ConfigurableAxis axisPtHist{"axisPtHist", {100, 0., 10.}, "pt axis for histograms"}; ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.2, 2.4, 2.6, 2.8, 3, 3.5, 4, 5, 6, 8, 10}, "pt axis for histograms"}; ConfigurableAxis axisIndependent{"axisIndependent", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90}, "X axis for histograms"}; - ConfigurableAxis axisCentForQA{"axisCentForQA", {100, 0, 100}, "centrality for QA"}; ConfigurableAxis axisNch{"axisNch", {4000, 0, 4000}, "N_{ch}"}; - ConfigurableAxis axisT0C{"axisT0C", {70, 0, 70000}, "N_{ch} (T0C)"}; - ConfigurableAxis axisT0A{"axisT0A", {200, 0, 200000}, "N_{ch} (T0A)"}; - ConfigurableAxis axisNchPV{"axisNchPV", {4000, 0, 4000}, "N_{ch} (PV)"}; ConfigurableAxis axisDCAz{"axisDCAz", {200, -2, 2}, "DCA_{z} (cm)"}; ConfigurableAxis axisDCAxy{"axisDCAxy", {200, -1, 1}, "DCA_{xy} (cm)"}; @@ -119,6 +114,7 @@ struct FlowTask { // Corrections TH1D* mEfficiency = nullptr; GFWWeights* mAcceptance = nullptr; + TObjArray* mAcceptanceList = nullptr; bool correctionsLoaded = false; // Connect to ccdb @@ -169,6 +165,13 @@ struct FlowTask { void init(InitContext const&) { + const AxisSpec axisVertex{40, -20, 20, "Vtxz (cm)"}; + const AxisSpec axisPhi{60, 0.0, constants::math::TwoPI, "#varphi"}; + const AxisSpec axisEta{40, -1., 1., "#eta"}; + const AxisSpec axisCentForQA{100, 0, 100, "centrality (%)"}; + const AxisSpec axisT0C{70, 0, 70000, "N_{ch} (T0C)"}; + const AxisSpec axisT0A{200, 0, 200000, "N_{ch} (T0A)"}; + ccdb->setURL(ccdbUrl.value); ccdb->setCaching(true); ccdb->setCreatedNotAfter(ccdbNoLaterThan.value); @@ -212,15 +215,15 @@ struct FlowTask { if (!cfgUseSmallMemory) { registry.add("BeforeSel8_globalTracks_centT0C", "before sel8;Centrality T0C;mulplicity global tracks", {HistType::kTH2D, {axisCentForQA, axisNch}}); registry.add("BeforeCut_globalTracks_centT0C", "before cut;Centrality T0C;mulplicity global tracks", {HistType::kTH2D, {axisCentForQA, axisNch}}); - registry.add("BeforeCut_PVTracks_centT0C", "before cut;Centrality T0C;mulplicity PV tracks", {HistType::kTH2D, {axisCentForQA, axisNchPV}}); - registry.add("BeforeCut_globalTracks_PVTracks", "before cut;mulplicity PV tracks;mulplicity global tracks", {HistType::kTH2D, {axisNchPV, axisNch}}); + registry.add("BeforeCut_PVTracks_centT0C", "before cut;Centrality T0C;mulplicity PV tracks", {HistType::kTH2D, {axisCentForQA, axisNch}}); + registry.add("BeforeCut_globalTracks_PVTracks", "before cut;mulplicity PV tracks;mulplicity global tracks", {HistType::kTH2D, {axisNch, axisNch}}); registry.add("BeforeCut_globalTracks_multT0A", "before cut;mulplicity T0A;mulplicity global tracks", {HistType::kTH2D, {axisT0A, axisNch}}); registry.add("BeforeCut_globalTracks_multV0A", "before cut;mulplicity V0A;mulplicity global tracks", {HistType::kTH2D, {axisT0A, axisNch}}); registry.add("BeforeCut_multV0A_multT0A", "before cut;mulplicity T0A;mulplicity V0A", {HistType::kTH2D, {axisT0A, axisT0A}}); registry.add("BeforeCut_multT0C_centT0C", "before cut;Centrality T0C;mulplicity T0C", {HistType::kTH2D, {axisCentForQA, axisT0C}}); registry.add("globalTracks_centT0C", "after cut;Centrality T0C;mulplicity global tracks", {HistType::kTH2D, {axisCentForQA, axisNch}}); - registry.add("PVTracks_centT0C", "after cut;Centrality T0C;mulplicity PV tracks", {HistType::kTH2D, {axisCentForQA, axisNchPV}}); - registry.add("globalTracks_PVTracks", "after cut;mulplicity PV tracks;mulplicity global tracks", {HistType::kTH2D, {axisNchPV, axisNch}}); + registry.add("PVTracks_centT0C", "after cut;Centrality T0C;mulplicity PV tracks", {HistType::kTH2D, {axisCentForQA, axisNch}}); + registry.add("globalTracks_PVTracks", "after cut;mulplicity PV tracks;mulplicity global tracks", {HistType::kTH2D, {axisNch, axisNch}}); registry.add("globalTracks_multT0A", "after cut;mulplicity T0A;mulplicity global tracks", {HistType::kTH2D, {axisT0A, axisNch}}); registry.add("globalTracks_multV0A", "after cut;mulplicity V0A;mulplicity global tracks", {HistType::kTH2D, {axisT0A, axisNch}}); registry.add("multV0A_multT0A", "after cut;mulplicity T0A;mulplicity V0A", {HistType::kTH2D, {axisT0A, axisT0A}}); @@ -416,11 +419,7 @@ struct FlowTask { fT0AV0ASigma->SetParameters(463.4144, 6.796509e-02, -9.097136e-07, 7.971088e-12, -2.600581e-17); } - if (cfgTrkSelRun3ITSMatch) { - myTrackSel = getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSall7Layers, TrackSelection::GlobalTrackRun3DCAxyCut::Default); - } else { - myTrackSel = getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibAny, TrackSelection::GlobalTrackRun3DCAxyCut::Default); - } + myTrackSel = getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibAny, TrackSelection::GlobalTrackRun3DCAxyCut::Default); myTrackSel.SetMinNClustersTPC(cfgCutTPCclu); myTrackSel.SetMinNClustersITS(cfgCutITSclu); if (cfgCutDCAxyppPass3Enabled) @@ -466,17 +465,30 @@ struct FlowTask { return; } - void loadCorrections(uint64_t timestamp) + void loadCorrections(uint64_t timestamp, int runNumber) { if (correctionsLoaded) return; - if (cfgAcceptance.value.empty() == false) { + if (!cfgAcceptanceListEnabled && cfgAcceptance.value.empty() == false) { mAcceptance = ccdb->getForTimeStamp(cfgAcceptance, timestamp); if (mAcceptance) LOGF(info, "Loaded acceptance weights from %s (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance); else LOGF(warning, "Could not load acceptance weights from %s (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance); } + if (cfgAcceptanceListEnabled && cfgAcceptanceList.value.empty() == false) { + mAcceptanceList = ccdb->getForTimeStamp(cfgAcceptanceList, timestamp); + if (mAcceptanceList == nullptr) { + LOGF(fatal, "Could not load acceptance weights list from %s", cfgAcceptanceList.value.c_str()); + } + LOGF(info, "Loaded acceptance weights list from %s (%p)", cfgAcceptanceList.value.c_str(), (void*)mAcceptanceList); + + mAcceptance = static_cast(mAcceptanceList->FindObject(Form("%d", runNumber))); + if (mAcceptance == nullptr) { + LOGF(fatal, "Could not find acceptance weights for run %d in acceptance list", runNumber); + } + LOGF(info, "Loaded acceptance weights (%p) for run %d from list (%p)", (void*)mAcceptance, runNumber, (void*)mAcceptanceList); + } if (cfgEfficiency.value.empty() == false) { mEfficiency = ccdb->getForTimeStamp(cfgEfficiency, timestamp); if (mEfficiency == nullptr) { @@ -698,7 +710,7 @@ struct FlowTask { return; gCurrentHadronicRate->Fill(seconds, hadronicRate); } - loadCorrections(bc.timestamp()); + loadCorrections(bc.timestamp(), currentRunNumber); registry.fill(HIST("hEventCount"), 4.5); // fill event QA diff --git a/PWGCF/GenericFramework/Core/GFWWeights.cxx b/PWGCF/GenericFramework/Core/GFWWeights.cxx index 2c6419c0c5c..4d2d41cd85d 100644 --- a/PWGCF/GenericFramework/Core/GFWWeights.cxx +++ b/PWGCF/GenericFramework/Core/GFWWeights.cxx @@ -482,3 +482,17 @@ void GFWWeights::mergeWeights(GFWWeights* other) addArray(fW_data, other->getDataArray()); return; } +void GFWWeights::setTH3D(TH3D* th3d) +{ + if (!fW_data) { + fW_data = new TObjArray(); + fW_data->SetName("GFWWeights_Data"); + fW_data->SetOwner(kTRUE); + fW_data->Add(th3d); + return; + } + TString ts(fW_data->At(0)->GetName()); + TH3D* trash = reinterpret_cast(fW_data->RemoveAt(0)); + delete trash; + fW_data->Add(reinterpret_cast(th3d->Clone(ts.Data()))); +} diff --git a/PWGCF/GenericFramework/Core/GFWWeights.h b/PWGCF/GenericFramework/Core/GFWWeights.h index 913194d266c..f60783ccec8 100644 --- a/PWGCF/GenericFramework/Core/GFWWeights.h +++ b/PWGCF/GenericFramework/Core/GFWWeights.h @@ -60,6 +60,7 @@ class GFWWeights : public TNamed TH1D* getdNdPhi(); TH1D* getEfficiency(double etamin, double etamax, double vzmin, double vzmax); void mergeWeights(GFWWeights* other); + void setTH3D(TH3D* th3d); private: bool fDataFilled; From 31c6a22b287fc5f094db899ccbd5718d09accb5f Mon Sep 17 00:00:00 2001 From: Katarzyna <116073883+kgwizdzi@users.noreply.github.com> Date: Thu, 20 Feb 2025 01:43:11 +0100 Subject: [PATCH 0330/1650] [PWGCF] Update in D0 analysis (MC,ML, SB) (#10031) --- .../Core/FemtoUniverseSoftPionRemoval.h | 120 ++++ PWGCF/FemtoUniverse/DataModel/FemtoDerived.h | 14 +- .../femtoUniverseProducerTask.cxx | 294 ++++++++-- .../Tasks/femtoUniversePairTaskTrackD0.cxx | 554 +++++++++++------- 4 files changed, 730 insertions(+), 252 deletions(-) create mode 100644 PWGCF/FemtoUniverse/Core/FemtoUniverseSoftPionRemoval.h diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseSoftPionRemoval.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseSoftPionRemoval.h new file mode 100644 index 00000000000..ac374c05074 --- /dev/null +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseSoftPionRemoval.h @@ -0,0 +1,120 @@ +// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file FemtoUniverseSoftPionRemoval.h +/// \brief FemtoUniverseSoftPionRemoval - Checking the soft pions from D* decay and removing them +/// \author Katarzyna Gwiździel, WUT, katarzyna.gwizdziel@cern.ch + +#ifndef PWGCF_FEMTOUNIVERSE_CORE_FEMTOUNIVERSESOFTPIONREMOVAL_H_ +#define PWGCF_FEMTOUNIVERSE_CORE_FEMTOUNIVERSESOFTPIONREMOVAL_H_ + +#include + +#include "PWGCF/FemtoUniverse/DataModel/FemtoDerived.h" +#include "Framework/HistogramRegistry.h" + +namespace o2::analysis::femto_universe +{ + +/// \class FemtoUniverseSoftPionRemoval +/// \brief Class taking care of removing soft pions from D* decays +/// \tparam partOne Type of particle 1 (Track/D0/...) +/// \tparam partTwo Type of particle 2 (Track/D0/...) +template +class FemtoUniverseSoftPionRemoval +{ + public: + /// Destructor + virtual ~FemtoUniverseSoftPionRemoval() = default; + + /// Initialization of the QA histograms + /// \param registry HistogramRegistry + void init(HistogramRegistry* registry) + { + if (registry) { + mHistogramRegistry = registry; + mHistogramRegistry->add("SoftPion/softPionMassVsPt", "; M(K#pi#pi-K#pi); p_{T}", kTH2F, {{200, 0.0, 0.2}, {36, 0., 36.}}); + } + } + + /// Check whether a track is a soft pion from D* decay + /// \tparam Part Data type of the particle + /// \tparam Parts Data type of the collection of all particles + /// \param part1 Particle 1 + /// \param part2 Particle 2 + /// \param particles Collection of all particles passed to the task + /// \return Whether the track is a soft pion + template + bool isSoftPion(Part const& part1, Part const& part2, Parts const& particles, bool isD0Cand, bool isD0barCand, double sigma) + { + if constexpr (kPartOneType == o2::aod::femtouniverseparticle::ParticleType::kTrack && kPartTwoType == o2::aod::femtouniverseparticle::ParticleType::kD0) { + /// Track-D0 combination part1 is hadron and part2 is D0 + if (part2.partType() != o2::aod::femtouniverseparticle::ParticleType::kD0) { + LOG(fatal) << "FemtoUniverseSoftPionRemoval: passed arguments don't agree with FemtoUniverseSoftPionRemoval instantiation! Please provide second argument kD0 candidate."; + return false; + } + // Getting D0 (part2) children + const auto& posChild = particles.iteratorAt(part2.index() - 2); + const auto& negChild = particles.iteratorAt(part2.index() - 1); + // Pion and kaon mass + double massPion = o2::constants::physics::MassPiPlus; + double massKaon = o2::constants::physics::MassKPlus; + // D* reconstruction + double pSum2 = std::pow(posChild.px() + negChild.px() + part1.px(), 2.0) + std::pow(posChild.py() + negChild.py() + part1.py(), 2.0) + std::pow(posChild.pz() + negChild.pz() + part1.pz(), 2.0); + // Energies of the daughters -> D0->K-pi+ + double e1Pi = std::sqrt(std::pow(massPion, 2.0) + std::pow(posChild.px(), 2.0) + std::pow(posChild.py(), 2.0) + std::pow(posChild.pz(), 2.0)); + double e1K = std::sqrt(std::pow(massKaon, 2.0) + std::pow(negChild.px(), 2.0) + std::pow(negChild.py(), 2.0) + std::pow(negChild.pz(), 2.0)); + // Energies of the daughters -> D0bar->K+pi- + double e2Pi = std::sqrt(std::pow(massPion, 2.0) + std::pow(negChild.px(), 2.0) + std::pow(negChild.py(), 2.0) + std::pow(negChild.pz(), 2.0)); + double e2K = std::sqrt(std::pow(massKaon, 2.0) + std::pow(posChild.px(), 2.0) + std::pow(posChild.py(), 2.0) + std::pow(posChild.pz(), 2.0)); + // Soft pion energy + auto ePion = RecoDecay::e(massPion, part1.p()); + // D* masses + double mDstar1 = std::sqrt(std::pow(e1Pi + e1K + ePion, 2.0) - pSum2); + double mDstar2 = std::sqrt(std::pow(e2Pi + e2K + ePion, 2.0) - pSum2); + + bool isSoftPion = false; + double softPiMass = 0.14542; // pion mass in D*->D0pi decay + double lowMassLimitSoftPion = softPiMass - 3.0 * sigma; + double highMassLimitSoftPion = softPiMass + 3.0 * sigma; + + if (isD0Cand) { + if (mDstar1 - part2.mLambda() > 0.) { + mHistogramRegistry->fill(HIST("SoftPion/softPionMassVsPt"), mDstar1 - part2.mLambda(), part2.pt()); + } + if ((std::abs(mDstar1 - part2.mLambda()) > lowMassLimitSoftPion) && (std::abs(mDstar1 - part2.mLambda()) < highMassLimitSoftPion)) { + isSoftPion = true; + } + } + + if (isD0barCand) { + if (mDstar2 - part2.mAntiLambda() > 0.) { + mHistogramRegistry->fill(HIST("SoftPion/softPionMassVsPt"), mDstar2 - part2.mAntiLambda(), part2.pt()); + } + if ((std::abs(mDstar2 - part2.mAntiLambda()) > lowMassLimitSoftPion) && (std::abs(mDstar2 - part2.mAntiLambda()) < highMassLimitSoftPion)) { + isSoftPion = true; + } + } + return isSoftPion; + } else { + LOG(fatal) << "FemtoUniverseSoftPionRemoval: Combination of objects not defined - quitting!"; + return false; + } + } + + private: + HistogramRegistry* mHistogramRegistry; ///< For QA output + static constexpr o2::aod::femtouniverseparticle::ParticleType kPartOneType = partOne; ///< Type of particle 1 + static constexpr o2::aod::femtouniverseparticle::ParticleType kPartTwoType = partTwo; ///< Type of particle 2 +}; +} // namespace o2::analysis::femto_universe + +#endif // PWGCF_FEMTOUNIVERSE_CORE_FEMTOUNIVERSESOFTPIONREMOVAL_H_ diff --git a/PWGCF/FemtoUniverse/DataModel/FemtoDerived.h b/PWGCF/FemtoUniverse/DataModel/FemtoDerived.h index b5ceb44e2c8..eaebb852b97 100644 --- a/PWGCF/FemtoUniverse/DataModel/FemtoDerived.h +++ b/PWGCF/FemtoUniverse/DataModel/FemtoDerived.h @@ -105,11 +105,11 @@ DECLARE_SOA_DYNAMIC_COLUMN(Theta, theta, //! Compute the theta of the track }); DECLARE_SOA_DYNAMIC_COLUMN(Px, px, //! Compute the momentum in x in GeV/c [](float pt, float phi) -> float { - return pt * std::sin(phi); + return pt * std::cos(phi); }); DECLARE_SOA_DYNAMIC_COLUMN(Py, py, //! Compute the momentum in y in GeV/c [](float pt, float phi) -> float { - return pt * std::cos(phi); + return pt * std::sin(phi); }); DECLARE_SOA_DYNAMIC_COLUMN(Pz, pz, //! Compute the momentum in z in GeV/c [](float pt, float eta) -> float { @@ -123,7 +123,7 @@ DECLARE_SOA_DYNAMIC_COLUMN(P, p, //! Compute the overall momentum in GeV/c DECLARE_SOA_COLUMN(Sign, sign, int8_t); //! Sign of the track charge DECLARE_SOA_COLUMN(TpcNClsFound, tpcNClsFound, uint8_t); //! Number of TPC clusters DECLARE_SOA_COLUMN(TpcNClsCrossedRows, tpcNClsCrossedRows, uint8_t); //! Number of TPC crossed rows -DECLARE_SOA_COLUMN(TPCFractionSharedCls, tpcFractionSharedCls, float); //! Number of TPC crossed rows +DECLARE_SOA_COLUMN(TpcFractionSharedCls, tpcFractionSharedCls, float); //! Number of TPC crossed rows DECLARE_SOA_COLUMN(ItsNCls, itsNCls, uint8_t); //! Number of ITS clusters DECLARE_SOA_COLUMN(ItsNClsInnerBarrel, itsNClsInnerBarrel, uint8_t); //! Number of ITS clusters in the inner barrel //! TPC signal DECLARE_SOA_DYNAMIC_COLUMN(TpcCrossedRowsOverFindableCls, tpcCrossedRowsOverFindableCls, //! Compute the number of crossed rows over findable TPC clusters @@ -182,7 +182,7 @@ DECLARE_SOA_TABLE(FDExtParticles, "AOD", "FDEXTPARTICLE", track::TPCNClsFindable, femtouniverseparticle::TpcNClsCrossedRows, track::TPCNClsShared, - femtouniverseparticle::TPCFractionSharedCls, + femtouniverseparticle::TpcFractionSharedCls, track::TPCInnerParam, femtouniverseparticle::ItsNCls, femtouniverseparticle::ItsNClsInnerBarrel, @@ -260,6 +260,8 @@ enum ParticleOriginMCTruth { kFake, //! particle, that has NOT the PDG code of the current analysed particle kDaughterLambda, //! Daughter from a Lambda decay kDaughterSigmaplus, //! Daughter from a Sigma^plus decay + kPrompt, //! Orgin for D0/D0bar mesons + kNonPrompt, //! Orgin for D0/D0bar mesons kNOriginMCTruthTypes }; @@ -271,7 +273,9 @@ static constexpr std::string_view ParticleOriginMCTruthName[kNOriginMCTruthTypes "_NotPrimary", "_Fake", "_DaughterLambda", - "DaughterSigmaPlus"}; + "DaughterSigmaPlus", + "_Prompt", + "_NonPrompt"}; /// Distinguished between reconstructed and truth enum MCType { diff --git a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx index 6f74943d1e9..2f1a915cec4 100644 --- a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx +++ b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx @@ -144,6 +144,7 @@ struct FemtoUniverseProducerTask { Configurable confIsActivateCascade{"confIsActivateCascade", false, "Activate filling of Cascade into femtouniverse tables"}; Configurable confIsSelectCascOmega{"confIsSelectCascOmega", false, "Select Omegas for cascade analysis"}; Configurable confIsActivatePhi{"confIsActivatePhi", false, "Activate filling of Phi into femtouniverse tables"}; + Configurable confIsActiveD0{"confIsActiveD0", false, "Activate filling FU tables for D0/D0bar mesons"}; Configurable confMCTruthAnalysisWithPID{"confMCTruthAnalysisWithPID", true, "1: take only particles with specified PDG, 0: all particles (for MC Truth)"}; Configurable> confMCTruthPDGCodes{"confMCTruthPDGCodes", std::vector{211, -211, 2212, -2212, 333}, "PDG of particles to be stored"}; Configurable confCentFT0Min{"confCentFT0Min", 0.f, "Min CentFT0 value for centrality selection"}; @@ -307,8 +308,9 @@ struct FemtoUniverseProducerTask { struct : o2::framework::ConfigurableGroup { Configurable confD0D0barCandMaxY{"confD0D0barCandMaxY", -1., "max. cand. rapidity"}; Configurable confD0D0barCandEtaCut{"confD0D0barCandEtaCut", 0.8, "max. cand. pseudorapidity"}; + Configurable yD0D0barCandRecoMax{"yD0D0barCandRecoMax", 0.8, "MC Reco, max. rapidity of D0/D0bar cand."}; + Configurable yD0D0barCandGenMax{"yD0D0barCandGenMax", 0.8, "MC Truth, max. rapidity of D0/D0bar cand."}; Configurable storeD0D0barDoubleMassHypo{"storeD0D0barDoubleMassHypo", false, "Store D0/D0bar cand. which pass selection criteria for both, D0 and D0bar"}; - Configurable applyMLSelD0D0bar{"applyMLSelD0D0bar", false, "Use ML D0/D0bar selection"}; Configurable> classMlD0D0bar{"classMlD0D0bar", {0, 1, 2}, "Indexes of ML scores to be stored. Three indexes max."}; } ConfD0Selection; @@ -469,10 +471,10 @@ struct FemtoUniverseProducerTask { void init(InitContext&) { - if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackCascadeData || doprocessTrackD0mesonData || doprocessTrackD0DataML || doprocessTrackCentRun2Data || doprocessTrackV0CentRun2Data || doprocessTrackCentRun3Data || doprocessV0CentRun3Data || doprocessCascadeCentRun3Data || doprocessTrackDataCentPP) == false && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth || doprocessTrackMCGen || doprocessTruthAndFullMCV0 || doprocessTruthAndFullMCCasc || doprocessFullMCCent || doprocessTrackCentRun3DataMC || doprocessTruthAndFullMCCentRun3) == false) { + if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackCascadeData || doprocessTrackD0mesonData || doprocessTrackD0DataML || doprocessTrackCentRun2Data || doprocessTrackV0CentRun2Data || doprocessTrackCentRun3Data || doprocessV0CentRun3Data || doprocessCascadeCentRun3Data || doprocessTrackDataCentPP) == false && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth || doprocessTrackMCGen || doprocessTruthAndFullMCV0 || doprocessTrackD0MC || doprocessTruthAndFullMCCasc || doprocessFullMCCent || doprocessTrackCentRun3DataMC || doprocessTruthAndFullMCCentRun3) == false) { LOGF(fatal, "Neither processFullData nor processFullMC enabled. Please choose one."); } - if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackCascadeData || doprocessTrackD0mesonData || doprocessTrackD0DataML || doprocessTrackCentRun2Data || doprocessTrackV0CentRun2Data || doprocessTrackCentRun3Data || doprocessV0CentRun3Data || doprocessCascadeCentRun3Data || doprocessTrackDataCentPP) == true && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth || doprocessTrackMCGen || doprocessTruthAndFullMCV0 || doprocessTruthAndFullMCCasc || doprocessFullMCCent || doprocessTrackCentRun3DataMC || doprocessTruthAndFullMCCentRun3) == true) { + if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackCascadeData || doprocessTrackD0mesonData || doprocessTrackD0DataML || doprocessTrackCentRun2Data || doprocessTrackV0CentRun2Data || doprocessTrackCentRun3Data || doprocessV0CentRun3Data || doprocessCascadeCentRun3Data || doprocessTrackDataCentPP) == true && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth || doprocessTrackMCGen || doprocessTruthAndFullMCV0 || doprocessTrackD0MC || doprocessTruthAndFullMCCasc || doprocessFullMCCent || doprocessTrackCentRun3DataMC || doprocessTruthAndFullMCCentRun3) == true) { LOGF(fatal, "Cannot enable process Data and process MC at the same time. " "Please choose one."); @@ -673,7 +675,7 @@ struct FemtoUniverseProducerTask { -999., -999., -999., -999., -999., -999., -999., -999., -999., -999., - -999.); // QA for phi or D0/D0bar + -999.); // QA for phi or D0/D0bar children } else if constexpr (isXi) { outputDebugParts(-999., -999., -999., -999., -999., -999., -999., -999., -999., -999., -999., -999., -999., -999., -999., -999., -999., @@ -692,6 +694,35 @@ struct FemtoUniverseProducerTask { } } + template + void fillDebugD0D0barML(ParticleType const& particle) + { + if constexpr (isD0ML) { + outputDebugParts(-999., -999., -999., -999., -999., -999., -999., -999., -999., + -999., -999., -999., -999., -999., -999., -999., -999., + -999., -999., -999., -999., -999., + -999., -999., + particle.mlProbD0()[0], // getter decayVtxX + particle.mlProbD0()[1], // getter decayVtxY + particle.mlProbD0()[2], // getter decayVtxZ + -999.); // Additional info for D0/D0bar + } else if constexpr (isD0barML) { + outputDebugParts(-999., -999., -999., -999., -999., -999., -999., -999., -999., + -999., -999., -999., -999., -999., -999., -999., -999., + -999., -999., -999., -999., -999., + -999., -999., + particle.mlProbD0bar()[0], // getter decayVtxX + particle.mlProbD0bar()[1], // getter decayVtxY + particle.mlProbD0bar()[2], // getter decayVtxZ + -999.); // Additional info for D0/D0bar + } else { + outputDebugParts(-999., -999., -999., -999., -999., -999., -999., -999., -999., + -999., -999., -999., -999., -999., -999., -999., -999., + -999., -999., -999., -999., -999., + -999., -999., -999., -999., -999., -999.); + } + } + template void fillMCParticle(ParticleType const& particle, o2::aod::femtouniverseparticle::ParticleType fdparttype) { @@ -778,6 +809,44 @@ struct FemtoUniverseProducerTask { } } + template + void fillMCParticleD0(ParticleType const& hfCand) + { + if (std::abs(hfCand.flagMcMatchRec()) == 1 << aod::hf_cand_2prong::DecayType::D0ToPiK) { + // get corresponding MC particle and its info + int pdgCode = 0; + int hfCandOrigin = 99; + + if (hfCand.originMcRec() == RecoDecay::OriginType::Prompt) { + if (hfCand.isSelD0() == 1 && hfCand.isSelD0bar() == 0) { + hfCandOrigin = aod::femtouniverse_mc_particle::ParticleOriginMCTruth::kPrompt; + pdgCode = static_cast(Pdg::kD0); + } else if (hfCand.isSelD0() == 0 && hfCand.isSelD0bar() == 1) { + hfCandOrigin = aod::femtouniverse_mc_particle::ParticleOriginMCTruth::kPrompt; + pdgCode = static_cast(Pdg::kD0Bar); + } else { + hfCandOrigin = aod::femtouniverse_mc_particle::ParticleOriginMCTruth::kFake; + pdgCode = 0; + } + } else { + if (hfCand.isSelD0() == 1 && hfCand.isSelD0bar() == 0) { + hfCandOrigin = aod::femtouniverse_mc_particle::ParticleOriginMCTruth::kNonPrompt; + pdgCode = static_cast(Pdg::kD0); + } else if (hfCand.isSelD0() == 0 && hfCand.isSelD0bar() == 1) { + hfCandOrigin = aod::femtouniverse_mc_particle::ParticleOriginMCTruth::kNonPrompt; + pdgCode = static_cast(Pdg::kD0Bar); + } else { + hfCandOrigin = aod::femtouniverse_mc_particle::ParticleOriginMCTruth::kFake; + pdgCode = 0; + } + } + outputPartsMC(hfCandOrigin, pdgCode, hfCand.pt(), hfHelper.yD0(hfCand), hfCand.phi()); + outputPartsMCLabels(outputPartsMC.lastIndex()); + } else { + outputPartsMCLabels(-1); + } + } + template bool fillCollisions(CollisionType const& col, TrackType const& tracks) { @@ -1370,8 +1439,8 @@ struct FemtoUniverseProducerTask { double invMassD0 = 0.0; double invMassD0bar = 0.0; bool isD0D0bar = false; - std::vector outputMlD0D0bar = {-1., -1., -1.}; // this vector keeps the probabilities from the ML model for D0/D0bar - uint8_t daughFlag = 0; // flag = 0 (daugh of D0 or D0bar), 1 (daug of D0), -1 (daugh of D0bar) + double mlProbD0D0barBg = 0.0; + uint8_t daughFlag = 0; // flag = 0 (daugh of D0 or D0bar), 1 (daug of D0), -1 (daugh of D0bar) for (const auto& hfCand : hfCands) { @@ -1399,21 +1468,13 @@ struct FemtoUniverseProducerTask { if (hfCand.isSelD0() == 1 && hfCand.isSelD0bar() == 0) { invMassD0 = hfHelper.invMassD0ToPiK(hfCand); invMassD0bar = -hfHelper.invMassD0barToKPi(hfCand); - if (ConfD0Selection.applyMLSelD0D0bar) { - for (unsigned int iClass = 0; iClass < ConfD0Selection.classMlD0D0bar->size(); iClass++) { - outputMlD0D0bar[iClass] = hfCand.mlProbD0()[ConfD0Selection.classMlD0D0bar->at(iClass)]; - } - } + mlProbD0D0barBg = hfCand.mlProbD0()[0]; isD0D0bar = true; daughFlag = 1; } else if (hfCand.isSelD0() == 0 && hfCand.isSelD0bar() == 1) { invMassD0 = -hfHelper.invMassD0ToPiK(hfCand); invMassD0bar = hfHelper.invMassD0barToKPi(hfCand); - if (ConfD0Selection.applyMLSelD0D0bar) { - for (unsigned int iClass = 0; iClass < ConfD0Selection.classMlD0D0bar->size(); iClass++) { - outputMlD0D0bar[iClass] = hfCand.mlProbD0bar()[ConfD0Selection.classMlD0D0bar->at(iClass)]; - } - } + mlProbD0D0barBg = hfCand.mlProbD0bar()[0]; isD0D0bar = true; daughFlag = -1; } else if (hfCand.isSelD0() == 1 && hfCand.isSelD0bar() == 1) { @@ -1477,9 +1538,9 @@ struct FemtoUniverseProducerTask { hfCand.eta(), hfCand.phi(), aod::femtouniverseparticle::ParticleType::kD0, - -999, // cut, CutContainerType - -999, // PID, CutContainerType - outputMlD0D0bar[0], // saving only the probaility for store class 1 - background + -999, // cut, CutContainerType + -999, // PID, CutContainerType + mlProbD0D0barBg, // saving the probability for ML score class 1 indexChildID, invMassD0, // D0 mass (mLambda) invMassD0bar); // D0bar mass (mAntiLambda) @@ -1487,10 +1548,16 @@ struct FemtoUniverseProducerTask { if (confIsDebug) { fillDebugParticle(postrack); // QA for positive daughter fillDebugParticle(negtrack); // QA for negative daughter - fillDebugParticle(hfCand); // QA for D0/D0bar + if (hfCand.isSelD0() == 1 && hfCand.isSelD0bar() == 0) { + fillDebugD0D0barML(hfCand); // QA for D0/D0bar + } else if (hfCand.isSelD0() == 0 && hfCand.isSelD0bar() == 1) { + fillDebugD0D0barML(hfCand); + } else { + fillDebugD0D0barML(hfCand); + } } if constexpr (isMC) { - fillMCParticle(hfCand, o2::aod::femtouniverseparticle::ParticleType::kD0); + fillMCParticleD0(hfCand); } } } @@ -1775,6 +1842,135 @@ struct FemtoUniverseProducerTask { } } + template + void fillMCTruthParticlesD0(TrackType const& tracks, std::optional>> recoMcIds = std::nullopt) + { + std::vector childIDs = {0, 0}; // these IDs are necessary to keep track of the children + std::vector tmpIDtrack; + + for (const auto& particle : tracks) { + /// if the most open selection criteria are not fulfilled there is no + /// point looking further at the track + + if (particle.eta() < -ConfFilterCuts.confEtaFilterCut || particle.eta() > ConfFilterCuts.confEtaFilterCut) + continue; + if (particle.pt() < ConfFilterCuts.confPtLowFilterCut || particle.pt() > ConfFilterCuts.confPtHighFilterCut) + continue; + + uint32_t pdgCode = static_cast(particle.pdgCode()); + + if (confMCTruthAnalysisWithPID) { + bool pass = false; + std::vector tmpPDGCodes = confMCTruthPDGCodes; // necessary due to some features of the Configurable + for (auto const& pdg : tmpPDGCodes) { + if (static_cast(pdg) == static_cast(pdgCode)) { + if (pdgCode == 333) { // && (recoMcIds && recoMcIds->get().contains(particle.globalIndex()))) { // ATTENTION: all Phi mesons are NOT primary particles + pass = true; + } else if (pdgCode == 421) { + pass = true; + } else { + if (particle.isPhysicalPrimary() || (confActivateSecondaries && recoMcIds && recoMcIds->get().contains(particle.globalIndex()))) + pass = true; + } + } + } + if (!pass) + continue; + } + + // now the table is filled + if constexpr (resolveDaughs) { + tmpIDtrack.push_back(particle.globalIndex()); + continue; + } + if (confIsActiveD0) { + + auto mcD0origin = aod::femtouniverseparticle::ParticleType::kMCTruthTrack; + float ptGenB = -1; + if (std::abs(particle.flagMcMatchGen()) == 1 << aod::hf_cand_2prong::DecayType::D0ToPiK) { + if (ConfD0Selection.yD0D0barCandGenMax >= 0. && std::abs(RecoDecay::y(particle.pVector(), o2::constants::physics::MassD0)) > ConfD0Selection.yD0D0barCandGenMax) { + continue; + } + mcD0origin = aod::femtouniverseparticle::ParticleType::kMCTruthTrack; + // WORK IN PROGRESS: If needed changed it to prompt and non-prompt + /*if (particle.originMcGen() == RecoDecay::OriginType::Prompt) { + mcD0origin = aod::femtouniverse_mc_particle::ParticleOriginMCTruth::kPrompt; + ptGenB = -1; + } else { + mcD0origin = aod::femtouniverse_mc_particle::ParticleOriginMCTruth::kNonPrompt; + ptGenB = particle.idxBhadMotherPart().pt(); + }*/ + outputParts(outputCollision.lastIndex(), + particle.pt(), + particle.eta(), + particle.phi(), + mcD0origin, + 0, + pdgCode, + pdgCode, + childIDs, + RecoDecay::y(particle.pVector(), o2::constants::physics::MassD0), + ptGenB); // pT of the B hadron (mother particle, only when non-prompt D0) + } + } else { + outputCascParts(outputCollision.lastIndex(), + particle.pt(), + particle.eta(), + particle.phi(), + aod::femtouniverseparticle::ParticleType::kMCTruthTrack, + 0, + pdgCode, + pdgCode, + childIDs, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + } + if (confIsDebug) { + fillDebugParticle(particle); + } + + // Workaround to keep the FDParticles and MC label tables + // aligned, so that they can be joined in the task. + if constexpr (transientLabels) { + outputPartsMCLabels(-1); + } + } + if constexpr (resolveDaughs) { + childIDs[0] = 0; + childIDs[1] = 0; + for (std::size_t i = 0; i < tmpIDtrack.size(); i++) { + const auto& particle = tracks.iteratorAt(tmpIDtrack[i] - tracks.begin().globalIndex()); + for (int daughIndex = 0, n = std::min(2ul, particle.daughtersIds().size()); daughIndex < n; daughIndex++) { + // loop to find the corresponding index of the daughters + for (std::size_t j = 0; j < tmpIDtrack.size(); j++) { + if (tmpIDtrack[j] == particle.daughtersIds()[daughIndex]) { + childIDs[daughIndex] = i - j; + break; + } + } + } + outputParts(outputCollision.lastIndex(), + particle.pt(), + particle.eta(), + particle.phi(), + aod::femtouniverseparticle::ParticleType::kMCTruthTrack, + 0, + static_cast(particle.pdgCode()), + particle.pdgCode(), + childIDs, + 0, + 0); + if (confIsDebug) { + fillDebugParticle(particle); + } + + // Workaround to keep the FDParticles and MC label tables + // aligned, so that they can be joined in the task. + if constexpr (transientLabels) { + outputPartsMCLabels(-1); + } + } + } + } + template void fillCollisionsAndTracksAndV0AndPhi(CollisionType const& col, TrackType const& tracks, V0Type const& fullV0s) @@ -1895,23 +2091,6 @@ struct FemtoUniverseProducerTask { } PROCESS_SWITCH(FemtoUniverseProducerTask, processTrackPhiMC, "Provide MC data for track Phi analysis", false); - void processTrackD0MC(aod::FemtoFullCollisionMC const& col, - aod::BCsWithTimestamps const&, - soa::Join const& tracks, - aod::McCollisions const&, - aod::McParticles const&) - { - // get magnetic field for run - getMagneticFieldTesla(col.bc_as()); - // fill the tables - const auto colcheck = fillCollisions(col, tracks); - if (colcheck) { - fillTracks(tracks); - // fillD0mesons(col, tracks, candidates); - } - } - PROCESS_SWITCH(FemtoUniverseProducerTask, processTrackD0MC, "Provide MC data for track D0 analysis", false); - void processTrackData(aod::FemtoFullCollision const& col, aod::BCsWithTimestamps const&, aod::FemtoFullTracks const& tracks) @@ -2028,7 +2207,9 @@ struct FemtoUniverseProducerTask { PresliceUnsorted> recoCollsPerMCColl = aod::mcparticle::mcCollisionId; PresliceUnsorted> recoCollsPerMCCollCentPbPb = aod::mcparticle::mcCollisionId; Preslice> perCollisionTracks = aod::track::collisionId; + template + void processTruthAndFullMC( aod::McCollisions const& mccols, aod::McParticles const& mcParticles, @@ -2135,6 +2316,43 @@ struct FemtoUniverseProducerTask { } PROCESS_SWITCH(FemtoUniverseProducerTask, processTruthAndFullMCCasc, "Provide both MC truth and reco for tracks and Cascades", false); + Preslice> perCollisionD0s = aod::track::collisionId; + void processTrackD0MC(aod::McCollisions const& mccols, + aod::TracksWMc const&, + soa::Join const& collisions, + soa::Filtered> const& tracks, + soa::Join const& hfMcGenCands, + soa::Join const& hfMcRecoCands, + aod::BCsWithTimestamps const&) + { + // MC Reco + std::set recoMcIds; + for (const auto& col : collisions) { + auto groupedTracks = tracks.sliceBy(perCollisionTracks, col.globalIndex()); + auto groupedD0s = hfMcRecoCands.sliceBy(perCollisionD0s, col.globalIndex()); + // get magnetic field for run + getMagneticFieldTesla(col.bc_as()); + // fill the tables + const auto colcheck = fillCollisions(col, tracks); + if (colcheck) { + fillTracks(tracks); + fillD0D0barUsingML(col, groupedTracks, groupedD0s); + for (const auto& track : groupedTracks) { + if (trackCuts.isSelectedMinimal(track)) + recoMcIds.insert(track.mcParticleId()); + } + } + } + // MC Truth + for (const auto& mccol : mccols) { + auto groupedMCParticles = hfMcGenCands.sliceBy(perMCCollision, mccol.globalIndex()); + auto groupedCollisions = collisions.sliceBy(recoCollsPerMCColl, mccol.globalIndex()); + fillMCTruthCollisions(groupedCollisions, groupedMCParticles); // fills the reco collisions for mc collision + fillMCTruthParticlesD0(groupedMCParticles, recoMcIds); // fills mc particles + } + } + PROCESS_SWITCH(FemtoUniverseProducerTask, processTrackD0MC, "Provide MC data for track D0 analysis", false); + void processFullMCCent(aod::FemtoFullCollisionCentRun3 const& col, aod::BCsWithTimestamps const&, soa::Join const& tracks, diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx index 2eb3cd6eb74..234f2352971 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx @@ -39,6 +39,8 @@ #include "PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h" #include "PWGCF/FemtoUniverse/Core/femtoUtils.h" #include "PWGCF/FemtoUniverse/Core/FemtoUniverseTrackSelection.h" +#include "PWGCF/FemtoUniverse/Core/FemtoUniverseSoftPionRemoval.h" +#include "PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCalculator.h" #include "PWGHF/Core/HfHelper.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" @@ -47,19 +49,11 @@ using namespace o2; using namespace o2::analysis; using namespace o2::analysis::femto_universe; +using namespace o2::analysis::femto_universe::efficiency; using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::soa; -namespace -{ -static constexpr int kNPart = 2; -static constexpr int kNCuts = 5; -static const std::vector partNames{"D0", "Track"}; -static const std::vector cutNames{"MaxPt", "PIDthr", "nSigmaTPC", "nSigmaTPCTOF", "MaxP"}; -static const float cutsTable[kNPart][kNCuts]{{4.05f, 1.f, 3.f, 3.f, 100.f}, {4.05f, 1.f, 3.f, 3.f, 100.f}}; -} // namespace - /// Returns deltaPhi value within the range [-pi/2, 3/2*pi] /// double getDeltaPhi(double phiD, double phiDbar) @@ -81,10 +75,15 @@ double wrapDeltaPhi0PI(double phiD, double phiDbar) struct FemtoUniversePairTaskTrackD0 { + Service pdgMC; + using FemtoFullParticles = soa::Join; SliceCache cache; Preslice perCol = aod::femtouniverseparticle::fdCollisionId; + using FemtoMCParticles = soa::Join; + Preslice perColMC = aod::femtouniverseparticle::fdCollisionId; + /// Table for both particles struct : o2::framework::ConfigurableGroup { Configurable confNsigmaCombinedProton{"confNsigmaCombinedProton", 3.0, "TPC and TOF Proton Sigma (combined) for momentum > 0.5"}; @@ -92,8 +91,6 @@ struct FemtoUniversePairTaskTrackD0 { Configurable confNsigmaCombinedPion{"confNsigmaCombinedPion", 3.0, "TPC and TOF Pion Sigma (combined) for momentum > 0.5"}; Configurable confNsigmaTPCPion{"confNsigmaTPCPion", 3.0, "TPC Pion Sigma for momentum < 0.5"}; - Configurable> confCutTable{"confCutTable", {cutsTable[0], kNPart, kNCuts, partNames, cutNames}, "Particle selections"}; - Configurable confNspecies{"confNspecies", 2, "Number of particle spieces with PID info"}; Configurable confIsMC{"confIsMC", false, "Enable additional Histogramms in the case of a MonteCarlo Run"}; Configurable> confTrkPIDnSigmaMax{"confTrkPIDnSigmaMax", std::vector{4.f, 3.f, 2.f}, "This configurable needs to be the same as the one used in the producer task"}; Configurable confUse3D{"confUse3D", false, "Enable three dimensional histogramms (to be used only for analysis with high statistics): k* vs mT vs multiplicity"}; @@ -110,6 +107,8 @@ struct FemtoUniversePairTaskTrackD0 { Configurable confIsTrackIdentified{"confIsTrackIdentified", true, "Enable PID for the track"}; Configurable confTrackLowPtCut{"confTrackLowPtCut", 0.5, "Low pT cut of the track"}; Configurable confTrackHighPtCut{"confTrackHighPtCut", 2.5, "High pT cut of the track"}; + Configurable protonMinPtPidTpcTof{"protonMinPtPidTpcTof", 0.5, "Momentum threshold for change of the PID method (from using TPC to TPC and TOF)."}; + Configurable pionMinPtPidTpcTof{"pionMinPtPidTpcTof", 0.5, "Momentum threshold for change of the PID method (from using TPC to TPC and TOF)."}; } ConfTrack; /// Particle 2 --- D0/D0bar meson @@ -118,39 +117,57 @@ struct FemtoUniversePairTaskTrackD0 { Configurable confPDGCodeD0bar{"confPDGCodeD0bar", -421, "D0bar meson - PDG code"}; Configurable confMinPtD0D0bar{"confMinPtD0D0bar", 1.0, "D0/D0bar sel. - min. pT"}; Configurable confMaxPtD0D0bar{"confMaxPtD0D0bar", 3.0, "D0/D0bar sel. - max. pT"}; - Configurable confMinInvMassD0D0bar{"confMinInvMassD0D0bar", 1.65, "D0/D0bar sel. - min. invMass"}; - Configurable confMaxInvMassD0D0bar{"confMaxInvMassD0D0bar", 2.05, "D0/D0bar sel. - max. invMass"}; - Configurable confMaxProbMlClass1Bg{"confMaxProbMlClass1Bg", 0.4, "ML: max prob. that D0/D0bar cand. is from the backgound"}; + Configurable minInvMassD0D0barSignal{"minInvMassD0D0barSignal", 1.81, "Min. inv. mass of D0/D0bar for signal region"}; + Configurable maxInvMassD0D0barSignal{"maxInvMassD0D0barSignal", 1.922, "Max. inv. mass of D0/D0bar for signal region"}; + Configurable minInvMassD0D0barLeftSB{"minInvMassD0D0barLeftSB", 1.65, "Min. inv. mass of D0/D0bar for left SB region"}; + Configurable maxInvMassD0D0barLeftSB{"maxInvMassD0D0barLeftSB", 1.754, "Max. inv. mass of D0/D0bar for left SB region"}; + Configurable minInvMassD0D0barRightSB{"minInvMassD0D0barRightSB", 1.978, "Min. inv. mass of D0/D0bar for right SB region"}; + Configurable maxInvMassD0D0barRightSB{"maxInvMassD0D0barRightSB", 2.09, "Max. inv. mass of D0/D0bar for right SB region"}; } ConfDmesons; struct : o2::framework::ConfigurableGroup { - Configurable confSignalRegionMin{"confSignalRegionMin", 1.810, "Min. inv. mass for D0/D0bar in the signal region"}; - Configurable confSignalRegionMax{"confSignalRegionMax", 1.922, "Max. inv. mass for D0/D0bar in the signal region"}; - Configurable confMinInvMassLeftSB{"confMinInvMassLeftSB", 1.642, "Min. inv. mass for D0/D0bar in the left sideband region"}; - Configurable confMaxInvMassLeftSB{"confMaxInvMassLeftSB", 1.754, "Max. inv. mass for D0/D0bar in the left sideband region"}; - Configurable confMinInvMassRightSB{"confMinInvMassRightSB", 1.978, "Min. inv. mass for D0/D0bar in the right sideband region"}; - Configurable confMaxInvMassRightSB{"confMaxInvMassRightSB", 2.090, "Max. inv. mass for D0/D0bar in the right sideband region"}; - } ConfD0D0barSideBand; + Configurable confMaxProbMlClass1Bg{"confMaxProbMlClass1Bg", 0.4, "ML: max prob. that D0/D0bar cand. is from the backgound"}; + Configurable confMinProbMlClass2Prompt{"confMinProbMlClass2Prompt", 0.05, "ML: min prob. that D0/D0bar cand. is prompt"}; + Configurable confMaxProbMlClass3NonPrompt{"confMaxProbMlClass3NonPrompt", 1.0, "ML: max prob. that D0/D0bar cand. is non-prompt"}; + Configurable confClass1BgProbStep{"confClass1BgProbStep", 0.05, "ML: prob. step for score class 1"}; + Configurable confClass1BgProbStart{"confClass1BgProbStart", 0.05, "ML: starting prob. value in optimization for score class 1"}; + Configurable confClass2PromptProbStep{"confClass2PromptProbStep", 0.05, "ML: prob. step for score class 2 - prompt"}; + Configurable confClass2PromptProbStart{"confClass2PromptProbStart", 0.1, "ML: starting prob. value in optimization for score class 2"}; + Configurable confClass3NonPromptProbStep{"confClass3NonPromptProbStep", 0.05, "ML: prob. step for score class 2 - non-prompt"}; + Configurable confClass3NonPromptProbStart{"confClass3NonPromptProbStart", 0.05, "ML: starting prob. value in optimization for score class 3"}; + } ConfMlOpt; Configurable> binsPt{"binsPt", std::vector{hf_cuts_d0_to_pi_k::vecBinsPt}, "pT bin limits"}; - Configurable confChooseD0trackCorr{"confChooseD0trackCorr", 2, "If 0 - only D0s, 1 - only D0bars, 2 - D0/D0bar (one mass hypo.)"}; + Configurable confChooseD0trackCorr{"confChooseD0trackCorr", 0, "If 0 correlations with D0s, if 1 with D0bars"}; + + // Efficiency + struct : o2::framework::ConfigurableGroup { + Configurable confEfficiencyTrackPath{"confEfficiencyTrackPath", "", "Local path to hadron efficiency TH2F file"}; + Configurable confEfficiencyD0Path{"confEfficiencyD0Path", "", "Local path to D0 efficiency TH2F file"}; + Configurable confEfficiencyTrackTimestamp{"confEfficiencyTrackTimestamp", 0, "(int64_t) Timestamp for hadron"}; + Configurable confEfficiencyD0Timestamp{"confEfficiencyD0Timestamp", 0, "(int64_t) Timestamp for D0"}; + Configurable doEfficiencyCorr{"doEfficiencyCorr", false, "Apply efficiency corrections"}; + } ConfEff; /// Partitions for particle 1 Partition partsTrack = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kTrack)) && (aod::femtouniverseparticle::sign == int8_t(ConfTrack.confTrackSign)) && (aod::femtouniverseparticle::pt > ConfTrack.confTrackLowPtCut) && (aod::femtouniverseparticle::pt < ConfTrack.confTrackHighPtCut); - Partition> partsTrackMC = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kTrack)); + Partition partsTrackMCReco = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kTrack)) && (aod::femtouniverseparticle::sign == int8_t(ConfTrack.confTrackSign)) && (aod::femtouniverseparticle::pt > ConfTrack.confTrackLowPtCut) && (aod::femtouniverseparticle::pt < ConfTrack.confTrackHighPtCut); + Partition partsTrackMCTruth = (aod::femtouniverseparticle::partType == static_cast(aod::femtouniverseparticle::ParticleType::kMCTruthTrack)) && (aod::femtouniverseparticle::pidCut == static_cast(ConfTrack.confPDGCodeTrack)) && (aod::femtouniverseparticle::pt > ConfTrack.confTrackLowPtCut) && (aod::femtouniverseparticle::pt < ConfTrack.confTrackHighPtCut); /// Partitions for particle 2 /// Partition with all D0/D0bar mesons (which pass double mass hypothesis) // Partition partsAllDmesons = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kD0)) && (aod::femtouniverseparticle::mLambda > 0.0f) && (aod::femtouniverseparticle::mAntiLambda > 0.0f); /// Partition with D0/D0bar candidates, which pass only one mass hypothesis - Partition partsOnlyD0D0bar = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kD0)) && (aod::femtouniverseparticle::mLambda < 0.0f || aod::femtouniverseparticle::mAntiLambda < 0.0f) && (aod::femtouniverseparticle::tempFitVar < ConfDmesons.confMaxProbMlClass1Bg); + Partition partsOnlyD0D0bar = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kD0)) && (aod::femtouniverseparticle::mLambda < 0.0f || aod::femtouniverseparticle::mAntiLambda < 0.0f) && (aod::femtouniverseparticle::tempFitVar < ConfMlOpt.confMaxProbMlClass1Bg) && (aod::femtouniverseparticle::decayVtxY > ConfMlOpt.confMinProbMlClass2Prompt); /// Partition with D0 mesons only (one mass hypothesis) - Partition partsD0s = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kD0)) && (aod::femtouniverseparticle::mLambda > ConfDmesons.confMinInvMassD0D0bar) && (aod::femtouniverseparticle::mLambda < ConfDmesons.confMaxInvMassD0D0bar) && (aod::femtouniverseparticle::mAntiLambda < 0.0f) && (aod::femtouniverseparticle::pt > ConfDmesons.confMinPtD0D0bar) && (aod::femtouniverseparticle::pt < ConfDmesons.confMaxPtD0D0bar) && (aod::femtouniverseparticle::tempFitVar < ConfDmesons.confMaxProbMlClass1Bg); + Partition partsD0s = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kD0)) && (aod::femtouniverseparticle::mLambda > ConfDmesons.minInvMassD0D0barSignal) && (aod::femtouniverseparticle::mLambda < ConfDmesons.maxInvMassD0D0barSignal) && (aod::femtouniverseparticle::mAntiLambda < 0.0f) && (aod::femtouniverseparticle::pt > ConfDmesons.confMinPtD0D0bar) && (aod::femtouniverseparticle::pt < ConfDmesons.confMaxPtD0D0bar) && (aod::femtouniverseparticle::tempFitVar < ConfMlOpt.confMaxProbMlClass1Bg) && (aod::femtouniverseparticle::decayVtxY > ConfMlOpt.confMinProbMlClass2Prompt); + /// Partition with D0s selected from the side-band (SB) regions + Partition partsD0sFromSB = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kD0)) && ((aod::femtouniverseparticle::mLambda > ConfDmesons.minInvMassD0D0barLeftSB && aod::femtouniverseparticle::mLambda < ConfDmesons.maxInvMassD0D0barLeftSB) || (aod::femtouniverseparticle::mLambda > ConfDmesons.minInvMassD0D0barRightSB && aod::femtouniverseparticle::mLambda < ConfDmesons.maxInvMassD0D0barRightSB)) && (aod::femtouniverseparticle::mAntiLambda < 0.0f) && (aod::femtouniverseparticle::pt > ConfDmesons.confMinPtD0D0bar) && (aod::femtouniverseparticle::pt < ConfDmesons.confMaxPtD0D0bar) && (aod::femtouniverseparticle::tempFitVar < ConfMlOpt.confMaxProbMlClass1Bg) && (aod::femtouniverseparticle::decayVtxY > ConfMlOpt.confMinProbMlClass2Prompt); /// Partition with D0bar mesons only (one mass hypothesis) - Partition partsD0bars = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kD0)) && (aod::femtouniverseparticle::mLambda < 0.0f) && (aod::femtouniverseparticle::mAntiLambda > ConfDmesons.confMinInvMassD0D0bar) && (aod::femtouniverseparticle::mAntiLambda < ConfDmesons.confMaxInvMassD0D0bar) && (aod::femtouniverseparticle::pt > ConfDmesons.confMinPtD0D0bar) && (aod::femtouniverseparticle::pt < ConfDmesons.confMaxPtD0D0bar) && (aod::femtouniverseparticle::tempFitVar < ConfDmesons.confMaxProbMlClass1Bg); + Partition partsD0bars = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kD0)) && (aod::femtouniverseparticle::mLambda < 0.0f) && (aod::femtouniverseparticle::mAntiLambda > ConfDmesons.minInvMassD0D0barSignal) && (aod::femtouniverseparticle::mAntiLambda < ConfDmesons.maxInvMassD0D0barSignal) && (aod::femtouniverseparticle::pt > ConfDmesons.confMinPtD0D0bar) && (aod::femtouniverseparticle::pt < ConfDmesons.confMaxPtD0D0bar) && (aod::femtouniverseparticle::tempFitVar < ConfMlOpt.confMaxProbMlClass1Bg) && (aod::femtouniverseparticle::decayVtxY > ConfMlOpt.confMinProbMlClass2Prompt); /// Partition for D0/D0bar mesons from MC - Partition> partsD0D0barMC = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kD0)); - + Partition partsD0D0barMCReco = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kD0)) && (aod::femtouniverseparticle::mLambda < 0.0f || aod::femtouniverseparticle::mAntiLambda < 0.0f) && (aod::femtouniverseparticle::pt > ConfDmesons.confMinPtD0D0bar) && (aod::femtouniverseparticle::pt < ConfDmesons.confMaxPtD0D0bar) && (aod::femtouniverseparticle::tempFitVar < ConfMlOpt.confMaxProbMlClass1Bg) && (aod::femtouniverseparticle::decayVtxY > ConfMlOpt.confMinProbMlClass2Prompt); + Partition partsD0D0barMCTruth = (aod::femtouniverseparticle::partType == static_cast(aod::femtouniverseparticle::ParticleType::kMCTruthTrack)) && (aod::femtouniverseparticle::pidCut == static_cast(ConfDmesons.confPDGCodeD0) || aod::femtouniverseparticle::pidCut == static_cast(ConfDmesons.confPDGCodeD0bar)) && (aod::femtouniverseparticle::pt > ConfDmesons.confMinPtD0D0bar) && (aod::femtouniverseparticle::pt < ConfDmesons.confMaxPtD0D0bar); /// Partition for D0/D0bar daughters Partition partsDmesonsChildren = aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kD0Child); @@ -186,7 +203,6 @@ struct FemtoUniversePairTaskTrackD0 { ConfigurableAxis confmTBins{"confmTBins", {225, 0., 7.5}, "binning mT"}; ConfigurableAxis confPtBins{"confPtBins", {360, 0., 36.}, "binning pT"}; ConfigurableAxis confInvMassBins{"confInvMassBins", {500, 0., 5.0}, "binning inv. mass"}; - ConfigurableAxis confInvMassFinerBins{"confInvMassFinerBins", {120, 1.5848, 2.1848}, "finer binning of inv. mass"}; Configurable confIsCPR{"confIsCPR", true, "Close Pair Rejection"}; Configurable confCPRPlotPerRadii{"confCPRPlotPerRadii", false, "Plot CPR per radii"}; @@ -197,19 +213,34 @@ struct FemtoUniversePairTaskTrackD0 { Configurable confCPRChosenRadii{"confCPRChosenRadii", 0.80, "Delta Eta cut for Close Pair Rejection"}; Configurable applyMLOpt{"applyMLOpt", false, "Enable for ML selection optimization"}; + Configurable confRemoveSoftPions{"confRemoveSoftPions", false, "Enable to remove soft pions from D* decays"}; + Configurable confSoftPionD0Flag{"confSoftPionD0Flag", false, "Enable soft pion check for D0s"}; + Configurable confSoftPionD0barFlag{"confSoftPionD0barFlag", false, "Enable soft pion check for D0bars"}; + Configurable sigmaSoftPiInvMass{"sigmaSoftPiInvMass", 0.1, "Sigma value from the inv. mass fit for soft pions"}; + // Event mixing configurables + Configurable confNEventsMix{"confNEventsMix", 5, "Number of events for mixing"}; - FemtoUniverseFemtoContainer sameEventFemtoCont; - FemtoUniverseFemtoContainer mixedEventFemtoCont; FemtoUniverseAngularContainer sameEventAngularCont; FemtoUniverseAngularContainer mixedEventAngularCont; FemtoUniversePairCleaner pairCleaner; FemtoUniverseDetaDphiStar pairCloseRejection; + FemtoUniverseSoftPionRemoval softPionRemoval; FemtoUniverseTrackSelection trackCuts; + // Axes for BDT score classes' histograms + AxisSpec axisBdtScore{100, 0.f, 1.f}; + AxisSpec axisSelStatus{2, -0.5f, 1.5f}; /// Histogram output HistogramRegistry qaRegistry{"TrackQA", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry resultRegistry{"Correlations", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry mixQaRegistry{"mixQaRegistry", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry mcRecoRegistry{"mcRecoRegistry", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; + HistogramRegistry mcTruthRegistry{"mcTruthRegistry", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; + + // Efficiency + EfficiencyConfigurableGroup effConfGroup; + EfficiencyCalculator efficiencyCalculator{&effConfGroup}; + float weight = 1.0; HistogramRegistry registry{"registry", {{"hInvMassD0", ";#it{M}(K^{-}#pi^{+}) (GeV/#it{c}^{2});counts", {HistType::kTH1F, {confInvMassBins}}}, @@ -228,21 +259,19 @@ struct FemtoUniversePairTaskTrackD0 { {"hDecayLengthD0bar", ";decay length (cm);counts", {HistType::kTH1F, {{800, 0., 4.}}}}, {"hPtDaughters", ";#it{p}_{T} (GeV/#it{c});counts", {HistType::kTH1F, {{300, 0., 12.}}}}, {"hSignDaughters", ";sign ;counts", {HistType::kTH1F, {{10, -2.5, 2.5}}}}, - {"hbetaDaughters", "; p (GeV/#it{c}); TOF #beta", {HistType::kTH2F, {{300, 0., 15.}, {200, 0., 2.}}}}, - {"hdEdxDaughters", "; p (GeV/#it{c}); TPC dE/dx (KeV/cm)", {HistType::kTH2F, {{300, 0., 15.}, {500, 0., 500.}}}}, {"hDCAxyDaughters", "; #it{DCA}_{xy} (cm); counts", {HistType::kTH1F, {{140, 0., 0.14}}}}, {"hDCAzDaughters", "; #it{DCA}_{z} (cm); counts", {HistType::kTH1F, {{140, 0., 0.14}}}}}}; // PID for protons bool isProtonNSigma(float mom, float nsigmaTPCPr, float nsigmaTOFPr) // previous version from: https://github.com/alisw/AliPhysics/blob/master/PWGCF/FEMTOSCOPY/AliFemtoUser/AliFemtoMJTrackCut.cxx { - if (mom < 0.5) { + if (mom < ConfTrack.protonMinPtPidTpcTof) { if (std::abs(nsigmaTPCPr) < ConfBothTracks.confNsigmaTPCProton) { return true; } else { return false; } - } else if (mom > 0.4) { + } else if (mom > ConfTrack.protonMinPtPidTpcTof) { if (std::hypot(nsigmaTOFPr, nsigmaTPCPr) < ConfBothTracks.confNsigmaCombinedProton) { return true; } else { @@ -293,20 +322,17 @@ struct FemtoUniversePairTaskTrackD0 { bool isPionNSigma(float mom, float nsigmaTPCPi, float nsigmaTOFPi) { - //|nsigma_TPC| < 3 for p < 0.5 GeV/c - //|nsigma_combined| < 3 for p > 0.5 - // using configurables: - // confNsigmaTPCPion -> TPC Kaon Sigma for momentum < 0.5 - // confNsigmaCombinedPion -> TPC and TOF Pion Sigma (combined) for momentum > 0.5 + // confNsigmaTPCPion -> TPC Pion Sigma for momentum < 0.5 GeV/c + // confNsigmaCombinedPion -> TPC and TOF Pion Sigma (combined) for momentum > 0.5 GeV/c if (true) { - if (mom < 0.5) { + if (mom < ConfTrack.pionMinPtPidTpcTof) { if (std::abs(nsigmaTPCPi) < ConfBothTracks.confNsigmaTPCPion) { return true; } else { return false; } - } else if (mom > 0.5) { + } else if (mom > ConfTrack.pionMinPtPidTpcTof) { if (std::hypot(nsigmaTOFPi, nsigmaTPCPi) < ConfBothTracks.confNsigmaCombinedPion) { return true; } else { @@ -339,11 +365,21 @@ struct FemtoUniversePairTaskTrackD0 { void init(InitContext&) { + if (effConfGroup.confEfficiencyDoMCTruth) { + // WORK IN PROGRESS + // hMCTruth1.init(&qaRegistry, confBinsTempFitVarpT, confBinsTempFitVarPDG, false, ConfTrack.confTrackPDGCode, false); + // hMCTruth2.init(&qaRegistry, confBinsTempFitVarpT, confBinsTempFitVarPDG, false, 333, false); + } + efficiencyCalculator.init(); + eventHisto.init(&qaRegistry); qaRegistry.add("QA_D0D0barSelection/hInvMassD0", ";#it{M}(K^{-}#pi^{+}) (GeV/#it{c}^{2});counts", kTH1F, {confInvMassBins}); qaRegistry.add("QA_D0D0barSelection/hPtD0", "D^{0} cand.;#it{p}_{T} (GeV/#it{c});counts", kTH1F, {confPtBins}); qaRegistry.add("QA_D0D0barSelection/hInvMassD0bar", ";#it{M}(K^{-}#pi^{+}) (GeV/#it{c}^{2});counts", kTH1F, {confInvMassBins}); qaRegistry.add("QA_D0D0barSelection/hPtD0bar", "#bar{D^{0}} cand.;#it{p}_{T} (GeV/#it{c});counts", kTH1F, {confPtBins}); + qaRegistry.add("QA_D0D0barSelection_SB/hInvMassD0", ";#it{M}(K^{-}#pi^{+}) (GeV/#it{c}^{2});counts", kTH1F, {confInvMassBins}); + qaRegistry.add("QA_D0D0barSelection_SB/hPtD0", "D^{0} cand.;#it{p}_{T} (GeV/#it{c});counts", kTH1F, {confPtBins}); + qaRegistry.add("D0_pos_daugh/nSigmaTPC", "; #it{p} (GeV/#it{c}); n#sigma_{TPC}", kTH2F, {{100, 0, 10}, {200, -4.975, 5.025}}); qaRegistry.add("D0_pos_daugh/nSigmaTOF", "; #it{p} (GeV/#it{c}); n#sigma_{TOF}", kTH2F, {{100, 0, 10}, {200, -4.975, 5.025}}); qaRegistry.add("D0_pos_daugh/pt", "; #it{p_T} (GeV/#it{c}); Counts", kTH1F, {{100, 0, 10}}); @@ -379,6 +415,17 @@ struct FemtoUniversePairTaskTrackD0 { qaRegistry.add("Hadron/nSigmaTPCKa", "; #it{p} (GeV/#it{c}); n#sigma_{TPCKa}", kTH2F, {{100, 0, 10}, {200, -4.975, 5.025}}); qaRegistry.add("Hadron/nSigmaTOFKa", "; #it{p} (GeV/#it{c}); n#sigma_{TOFKa}", kTH2F, {{100, 0, 10}, {200, -4.975, 5.025}}); + // MC truth + mcTruthRegistry.add("MCTruthD0D0bar", "MC Truth D0/D0bar;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{360, 0, 36}, {400, -1.0, 1.0}}}); + mcTruthRegistry.add("MCTruthAllPositivePt", "MC Truth all positive;#it{p}_{T} (GeV/c); counts", {HistType::kTH1F, {{360, 0, 36}}}); + mcTruthRegistry.add("MCTruthAllNegativePt", "MC Truth all negative;#it{p}_{T} (GeV/c); counts", {HistType::kTH1F, {{360, 0, 36}}}); + mcTruthRegistry.add("MCTruthKp", "MC Truth K+;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + mcTruthRegistry.add("MCTruthKm", "MC Truth K-;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + mcTruthRegistry.add("MCTruthPip", "MC Truth #pi+;#it{p}_{T} (GeV/c)", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + mcTruthRegistry.add("MCTruthPim", "MC Truth #pi-;#it{p}_{T} (GeV/c)", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + mcTruthRegistry.add("MCTruthProton", "MC Truth proton;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + mcTruthRegistry.add("MCTruthAntiproton", "MC Truth antiproton;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + trackHistoPartD0D0bar.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarInvMassBins, ConfBothTracks.confIsMC, ConfDmesons.confPDGCodeD0); if (!ConfTrack.confIsSame) { trackHistoPartTrack.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarBins, ConfBothTracks.confIsMC, ConfTrack.confPDGCodeTrack); @@ -387,16 +434,13 @@ struct FemtoUniversePairTaskTrackD0 { mixQaRegistry.add("MixingQA/hSECollisionBins", ";bin;Entries", kTH1F, {{120, -0.5, 119.5}}); mixQaRegistry.add("MixingQA/hMECollisionBins", ";bin;Entries", kTH1F, {{120, -0.5, 119.5}}); - sameEventFemtoCont.init(&resultRegistry, confkstarBins, confMultBins, confkTBins, confmTBins, confmultBins3D, confmTBins3D, ConfBothTracks.confIsMC, ConfBothTracks.confUse3D); - mixedEventFemtoCont.init(&resultRegistry, confkstarBins, confMultBins, confkTBins, confmTBins, confmultBins3D, confmTBins3D, ConfBothTracks.confIsMC, ConfBothTracks.confUse3D); sameEventAngularCont.init(&resultRegistry, confkstarBins, confMultBins, confkTBins, confmTBins, confmultBins3D, confmTBins3D, ConfBothTracks.confEtaBins, ConfBothTracks.confPhiBins, ConfBothTracks.confIsMC, ConfBothTracks.confUse3D); mixedEventAngularCont.init(&resultRegistry, confkstarBins, confMultBins, confkTBins, confmTBins, confmultBins3D, confmTBins3D, ConfBothTracks.confEtaBins, ConfBothTracks.confPhiBins, ConfBothTracks.confIsMC, ConfBothTracks.confUse3D); - sameEventFemtoCont.setPDGCodes(ConfDmesons.confPDGCodeD0, ConfTrack.confPDGCodeTrack); - mixedEventFemtoCont.setPDGCodes(ConfDmesons.confPDGCodeD0, ConfTrack.confPDGCodeTrack); sameEventAngularCont.setPDGCodes(ConfDmesons.confPDGCodeD0, ConfTrack.confPDGCodeTrack); mixedEventAngularCont.setPDGCodes(ConfDmesons.confPDGCodeD0, ConfTrack.confPDGCodeTrack); + softPionRemoval.init(&qaRegistry); pairCleaner.init(&qaRegistry); if (confIsCPR.value) { pairCloseRejection.init(&resultRegistry, &qaRegistry, confCPRdeltaPhiCutMin.value, confCPRdeltaPhiCutMax.value, confCPRdeltaEtaCutMin.value, confCPRdeltaEtaCutMax.value, confCPRChosenRadii.value, confCPRPlotPerRadii.value); @@ -408,30 +452,26 @@ struct FemtoUniversePairTaskTrackD0 { // D0/D0bar histograms auto vbins = (std::vector)binsPt; registry.add("D0D0bar_oneMassHypo/hMassVsPt", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("D0D0bar_oneMassHypo/hMassVsPtFinerBinning", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassFinerBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("hDeltaPhiSigSig", "SxS correlation;#Delta#varphi (rad);counts", {HistType::kTH1F, {{10, 0.0, o2::constants::math::PI}}}); - registry.add("hDeltaPhiD0BgD0barSig", "B(D0)x S(D0bar) correlation;#Delta#varphi (rad);counts", {HistType::kTH1F, {{10, 0.0, o2::constants::math::PI}}}); - registry.add("hDeltaPhiD0SigD0barBg", "S(D0)x B(D0bar) correlation;#Delta#varphi (rad);counts", {HistType::kTH1F, {{10, 0.0, o2::constants::math::PI}}}); - registry.add("hDeltaPhiBgBg", "BxB correlation;#Delta#varphi (rad);counts", {HistType::kTH1F, {{10, 0.0, o2::constants::math::PI}}}); - registry.add("hPtCand1VsPtCand2", "2-prong candidates;#it{p}_{T} (GeV/#it{c});#it{p}_{T} (GeV/#it{c})", {HistType::kTH2F, {{vbins, "#it{p}_{T} (GeV/#it{c})"}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("hDeltaEtaDeltaPhi", "2-prong candidates;#Delta #eta;#Delta #varphi (rad)", {HistType::kTH2F, {{29, -2., 2.}, {29, 0.0, o2::constants::math::PI}}}); + registry.add("D0D0bar_oneMassHypo/hMassVsPtReflected", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("D0D0bar_oneMassHypo/hMassVsPtD0", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("D0D0bar_oneMassHypo/hMassVsPtD0bar", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("D0D0bar_oneMassHypo/hMassVsPtD0Reflected", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("D0D0bar_oneMassHypo/hMassVsPtD0barReflected", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + // Histograms for BDT score classes' check + registry.add("DebugBdt/hBdtScore1VsStatus", ";BDT score;status", {HistType::kTH2F, {axisBdtScore, axisSelStatus}}); + registry.add("DebugBdt/hBdtScore2VsStatus", ";BDT score;status", {HistType::kTH2F, {axisBdtScore, axisSelStatus}}); + registry.add("DebugBdt/hBdtScore3VsStatus", ";BDT score;status", {HistType::kTH2F, {axisBdtScore, axisSelStatus}}); if (applyMLOpt) { - registry.add("D0D0bar_MLSel/hMassVsPt001", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("D0D0bar_MLSel/hMassVsPt0015", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("D0D0bar_MLSel/hMassVsPt002", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("D0D0bar_MLSel/hMassVsPt0025", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("D0D0bar_MLSel/hMassVsPt003", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("D0D0bar_MLSel/hMassVsPt004", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("D0D0bar_MLSel/hMassVsPt005", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("D0D0bar_MLSel/hMassVsPt006", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("D0D0bar_MLSel/hMassVsPt007", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("D0D0bar_MLSel/hMassVsPt008", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("D0D0bar_MLSel/hMassVsPt009", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("D0D0bar_MLSel/hMassVsPt01", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("D0D0bar_MLSel/hMassVsPt015", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("D0D0bar_MLSel/hMassVsPt02", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("D0D0bar_MLSel/hMassVsPt025", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("D0D0bar_MLSel/hMassVsPt03", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("D0D0bar_MLSel/hMassVsPt1", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("D0D0bar_MLSel/hMassVsPt2", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("D0D0bar_MLSel/hMassVsPt3", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("D0D0bar_MLSel/hMassVsPt4", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("D0D0bar_MLSel/hMassVsPt5", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("D0D0bar_MLSel/hMassVsPt6", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("D0D0bar_MLSel/hMassVsPt7", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("D0D0bar_MLSel/hMassVsPt8", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("D0D0bar_MLSel/hMassVsPt9", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("D0D0bar_MLSel/hMassVsPt10", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); } } @@ -442,7 +482,7 @@ struct FemtoUniversePairTaskTrackD0 { eventHisto.fillQA(col); } - void processD0MLOpt(o2::aod::FdCollision const& col, FemtoFullParticles const&) + void processD0MLOptBg(o2::aod::FdCollision const& col, FemtoFullParticles const&) { auto groupD0D0barCands = partsOnlyD0D0bar->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); @@ -450,82 +490,117 @@ struct FemtoUniversePairTaskTrackD0 { for (auto const& charmCand : groupD0D0barCands) { // D0 candidates if (charmCand.mLambda() > 0.0f && charmCand.mAntiLambda() < 0.0f) { - if (charmCand.tempFitVar() < 0.01) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt001"), charmCand.mLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.015) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt0015"), charmCand.mLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.02) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt002"), charmCand.mLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.025) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt0025"), charmCand.mLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.03) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt003"), charmCand.mLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.04) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt004"), charmCand.mLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.05) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt005"), charmCand.mLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.06) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt006"), charmCand.mLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.07) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt007"), charmCand.mLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.08) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt008"), charmCand.mLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.09) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt009"), charmCand.mLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.1) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt01"), charmCand.mLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.15) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt015"), charmCand.mLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.2) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt02"), charmCand.mLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.25) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt025"), charmCand.mLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.3) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt03"), charmCand.mLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt1"), charmCand.mLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt2"), charmCand.mLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 2.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt3"), charmCand.mLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 3.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt4"), charmCand.mLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 4.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt5"), charmCand.mLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 5.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt6"), charmCand.mLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 6.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt7"), charmCand.mLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 7.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt8"), charmCand.mLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 8.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt9"), charmCand.mLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 9.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt10"), charmCand.mLambda(), charmCand.pt()); } // DObar candidates if (charmCand.mLambda() < 0.0f && charmCand.mAntiLambda() > 0.0f) { - if (charmCand.tempFitVar() < 0.01) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt001"), charmCand.mAntiLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.015) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt0015"), charmCand.mAntiLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.02) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt002"), charmCand.mAntiLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.025) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt0025"), charmCand.mAntiLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.03) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt003"), charmCand.mAntiLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.04) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt004"), charmCand.mAntiLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.05) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt005"), charmCand.mAntiLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.06) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt006"), charmCand.mAntiLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.07) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt007"), charmCand.mAntiLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.08) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt008"), charmCand.mAntiLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.09) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt009"), charmCand.mAntiLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.1) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt01"), charmCand.mAntiLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.15) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt015"), charmCand.mAntiLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.2) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt02"), charmCand.mAntiLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.25) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt025"), charmCand.mAntiLambda(), charmCand.pt()); - if (charmCand.tempFitVar() < 0.3) - registry.fill(HIST("D0D0bar_MLSel/hMassVsPt03"), charmCand.mAntiLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt1"), charmCand.mAntiLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt2"), charmCand.mAntiLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 2.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt3"), charmCand.mAntiLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 3.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt4"), charmCand.mAntiLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 4.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt5"), charmCand.mAntiLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 5.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt6"), charmCand.mAntiLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 6.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt7"), charmCand.mAntiLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 7.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt8"), charmCand.mAntiLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 8.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt9"), charmCand.mAntiLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 9.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt10"), charmCand.mAntiLambda(), charmCand.pt()); + } + } + } + PROCESS_SWITCH(FemtoUniversePairTaskTrackD0, processD0MLOptBg, "Enable filling QA plots for ML Bg D0/D0bar selection optimization", false); + + void processD0MLOptBgAndPrompt(o2::aod::FdCollision const& col, FemtoFullParticles const&) + { + auto groupD0D0barCands = partsOnlyD0D0bar->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + + // loop over selected D0/D0bar candidates + for (auto const& charmCand : groupD0D0barCands) { + // D0 candidates + if (charmCand.decayVtxY() > ConfMlOpt.confClass2PromptProbStart) { + if (charmCand.mLambda() > 0.0f && charmCand.mAntiLambda() < 0.0f) { + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt1"), charmCand.mLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt2"), charmCand.mLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 2.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt3"), charmCand.mLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 3.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt4"), charmCand.mLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 4.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt5"), charmCand.mLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 5.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt6"), charmCand.mLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 6.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt7"), charmCand.mLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 7.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt8"), charmCand.mLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 8.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt9"), charmCand.mLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 9.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt10"), charmCand.mLambda(), charmCand.pt()); + } + // DObar candidates + if (charmCand.mLambda() < 0.0f && charmCand.mAntiLambda() > 0.0f) { + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt1"), charmCand.mAntiLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt2"), charmCand.mAntiLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 2.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt3"), charmCand.mAntiLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 3.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt4"), charmCand.mAntiLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 4.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt5"), charmCand.mAntiLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 5.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt6"), charmCand.mAntiLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 6.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt7"), charmCand.mAntiLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 7.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt8"), charmCand.mAntiLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 8.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt9"), charmCand.mAntiLambda(), charmCand.pt()); + if (charmCand.tempFitVar() < ConfMlOpt.confClass1BgProbStart + 9.0 * ConfMlOpt.confClass1BgProbStep) + registry.fill(HIST("D0D0bar_MLSel/hMassVsPt10"), charmCand.mAntiLambda(), charmCand.pt()); + } } } } - PROCESS_SWITCH(FemtoUniversePairTaskTrackD0, processD0MLOpt, "Enable filling QA plots for ML D0/D0bar selection optimization", false); + PROCESS_SWITCH(FemtoUniversePairTaskTrackD0, processD0MLOptBgAndPrompt, "Enable filling QA plots for ML Bg and Prompt D0/D0bar selection optimization", false); void processQAD0D0barSel(o2::aod::FdCollision const& col, FemtoFullParticles const&) { auto groupPartsD0s = partsD0s->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); auto groupPartsD0bars = partsD0bars->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + auto groupPartsD0sFromSB = partsD0sFromSB->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); // loop over selected D0 candidates for (auto const& d0cand : groupPartsD0s) { @@ -539,6 +614,13 @@ struct FemtoUniversePairTaskTrackD0 { qaRegistry.fill(HIST("QA_D0D0barSelection/hInvMassD0bar"), d0barcand.mAntiLambda()); qaRegistry.fill(HIST("QA_D0D0barSelection/hPtD0bar"), d0barcand.pt()); } + + // loop over selected D0 candidates from SB regions + for (auto const& d0SB : groupPartsD0sFromSB) { + + qaRegistry.fill(HIST("QA_D0D0barSelection_SB/hInvMassD0"), d0SB.mLambda()); + qaRegistry.fill(HIST("QA_D0D0barSelection_SB/hPtD0"), d0SB.pt()); + } } PROCESS_SWITCH(FemtoUniversePairTaskTrackD0, processQAD0D0barSel, "Enable filling QA plots for selected D0/D0bar cand.", true); @@ -551,9 +633,16 @@ struct FemtoUniversePairTaskTrackD0 { for (auto const& d0d0bar : groupPartsOnlyD0D0bar) { registry.fill(HIST("hPtD0D0bar"), d0d0bar.pt()); + // BDT score classes + registry.fill(HIST("DebugBdt/hBdtScore1VsStatus"), d0d0bar.decayVtxX(), 1); + registry.fill(HIST("DebugBdt/hBdtScore2VsStatus"), d0d0bar.decayVtxY(), 1); + registry.fill(HIST("DebugBdt/hBdtScore3VsStatus"), d0d0bar.decayVtxZ(), 1); if (d0d0bar.mLambda() > 0.0f && d0d0bar.mAntiLambda() < 0.0f) { registry.fill(HIST("D0D0bar_oneMassHypo/hMassVsPt"), d0d0bar.mLambda(), d0d0bar.pt()); + registry.fill(HIST("D0D0bar_oneMassHypo/hMassVsPtD0"), d0d0bar.mLambda(), d0d0bar.pt()); + registry.fill(HIST("D0D0bar_oneMassHypo/hMassVsPtReflected"), std::abs(d0d0bar.mAntiLambda()), d0d0bar.pt()); + registry.fill(HIST("D0D0bar_oneMassHypo/hMassVsPtD0Reflected"), std::abs(d0d0bar.mAntiLambda()), d0d0bar.pt()); registry.fill(HIST("hInvMassD0"), d0d0bar.mLambda()); registry.fill(HIST("hPtD0"), d0d0bar.pt()); registry.fill(HIST("hPhiD0"), d0d0bar.phi()); @@ -561,6 +650,9 @@ struct FemtoUniversePairTaskTrackD0 { } if (d0d0bar.mLambda() < 0.0f && d0d0bar.mAntiLambda() > 0.0f) { registry.fill(HIST("D0D0bar_oneMassHypo/hMassVsPt"), d0d0bar.mAntiLambda(), d0d0bar.pt()); + registry.fill(HIST("D0D0bar_oneMassHypo/hMassVsPtD0bar"), d0d0bar.mAntiLambda(), d0d0bar.pt()); + registry.fill(HIST("D0D0bar_oneMassHypo/hMassVsPtReflected"), std::abs(d0d0bar.mLambda()), d0d0bar.pt()); + registry.fill(HIST("D0D0bar_oneMassHypo/hMassVsPtD0barReflected"), std::abs(d0d0bar.mLambda()), d0d0bar.pt()); registry.fill(HIST("hInvMassD0bar"), d0d0bar.mAntiLambda()); registry.fill(HIST("hPtD0bar"), d0d0bar.pt()); registry.fill(HIST("hPhiD0bar"), d0d0bar.phi()); @@ -600,63 +692,6 @@ struct FemtoUniversePairTaskTrackD0 { } PROCESS_SWITCH(FemtoUniversePairTaskTrackD0, processD0mesons, "Enable processing D0 mesons", true); - // D0-D0bar pair correlations (side-band methode) - void processSideBand(o2::aod::FdCollision const& col, FemtoFullParticles const&) - { - auto groupPartsOnlyD0D0bar = partsOnlyD0D0bar->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - - double deltaPhi = 0.0; - double deltaEta = 0.0; - - // loop over D0/D0bar candidates (ONLY) - for (auto const& cand1 : groupPartsOnlyD0D0bar) { - // Check if the first candidate is D0 meson - if (cand1.mLambda() < 0.0f && cand1.mAntiLambda() > 0.0f) { - continue; - } - - for (auto const& cand2 : groupPartsOnlyD0D0bar) { - // Check if the second candidate is D0bar meson - if (cand2.mLambda() > 0.0f && cand2.mAntiLambda() < 0.0f) { - continue; - } - // deltaPhi = getDeltaPhi(cand1.phi(), cand2.phi()); - deltaPhi = wrapDeltaPhi0PI(cand1.phi(), cand2.phi()); - deltaEta = cand2.eta() - cand1.eta(); - - // General histograms - registry.fill(HIST("hPtCand1VsPtCand2"), cand1.pt(), cand2.pt()); - registry.fill(HIST("hDeltaEtaDeltaPhi"), deltaEta, deltaPhi); - - // ----------------------------------- Creating D0-D0bar pairs correlations ------------------------------------------------ - if (cand1.mLambda() > ConfD0D0barSideBand.confSignalRegionMin.value && cand1.mLambda() < ConfD0D0barSideBand.confSignalRegionMax.value) { - // S(D0) x S(D0bar) correlation - if (cand2.mAntiLambda() > ConfD0D0barSideBand.confSignalRegionMin.value && cand2.mAntiLambda() < ConfD0D0barSideBand.confSignalRegionMax.value) { - registry.fill(HIST("hDeltaPhiSigSig"), deltaPhi); - } - // S(D0) x B(D0bar) correlation - if ((cand2.mAntiLambda() > ConfD0D0barSideBand.confMinInvMassLeftSB.value && cand2.mAntiLambda() < ConfD0D0barSideBand.confMaxInvMassLeftSB.value) || - (cand2.mAntiLambda() > ConfD0D0barSideBand.confMinInvMassRightSB.value && cand2.mAntiLambda() < ConfD0D0barSideBand.confMaxInvMassRightSB.value)) { - registry.fill(HIST("hDeltaPhiD0SigD0barBg"), deltaPhi); - } - } - if ((cand1.mLambda() > ConfD0D0barSideBand.confMinInvMassLeftSB.value && cand1.mLambda() < ConfD0D0barSideBand.confMaxInvMassLeftSB.value) || - (cand1.mLambda() > ConfD0D0barSideBand.confMinInvMassRightSB.value && cand1.mLambda() < ConfD0D0barSideBand.confMaxInvMassRightSB.value)) { - // B(D0) x S (D0bar) correlation - if (cand2.mAntiLambda() > ConfD0D0barSideBand.confSignalRegionMin.value && cand2.mAntiLambda() < ConfD0D0barSideBand.confSignalRegionMax.value) { - registry.fill(HIST("hDeltaPhiD0BgD0barSig"), deltaPhi); - } - // B(D0) x B(D0bar) correlation - if ((cand2.mAntiLambda() > ConfD0D0barSideBand.confMinInvMassLeftSB.value && cand2.mAntiLambda() < ConfD0D0barSideBand.confMaxInvMassLeftSB.value) || - (cand2.mAntiLambda() > ConfD0D0barSideBand.confMinInvMassRightSB.value && cand2.mAntiLambda() < ConfD0D0barSideBand.confMaxInvMassRightSB.value)) { - registry.fill(HIST("hDeltaPhiBgBg"), deltaPhi); - } - } - } // It is the end of the for loop over D0bar mesons - } // It is the end of the for loop over all candidates - } - PROCESS_SWITCH(FemtoUniversePairTaskTrackD0, processSideBand, "Enable processing side-band methode", false); - /// This function processes the same event and takes care of all the histogramming /// \todo the trivial loops over the tracks should be factored out since they will be common to all combinations of T-T, T-V0, V0-V0, ... /// @tparam PartitionType @@ -709,18 +744,27 @@ struct FemtoUniversePairTaskTrackD0 { continue; } } + // Soft Pion Removal + if (confRemoveSoftPions) { + if (softPionRemoval.isSoftPion(track, d0candidate, parts, confSoftPionD0Flag, confSoftPionD0barFlag, sigmaSoftPiInvMass)) { + continue; + } + } // // Close Pair Rejection if (confIsCPR.value) { if (pairCloseRejection.isClosePair(track, d0candidate, parts, magFieldTesla, femto_universe_container::EventType::same)) { continue; } } - // Track Cleaning if (!pairCleaner.isCleanPair(track, d0candidate, parts)) { continue; } - sameEventFemtoCont.setPair(track, d0candidate, multCol, ConfBothTracks.confUse3D); + // Efficiency + weight = 1.0f; + if (ConfEff.doEfficiencyCorr) { + weight = efficiencyCalculator.getWeight(ParticleNo::ONE, track) * efficiencyCalculator.getWeight(ParticleNo::TWO, d0candidate); + } sameEventAngularCont.setPair(track, d0candidate, multCol, ConfBothTracks.confUse3D); } } @@ -734,7 +778,6 @@ struct FemtoUniversePairTaskTrackD0 { fillCollision(col); auto thegroupPartsTrack = partsTrack->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - auto thegroupPartsOnlyD0D0bar = partsOnlyD0D0bar->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); auto theGroupPartsD0s = partsD0s->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); auto theGroupPartsD0bars = partsD0bars->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); @@ -745,15 +788,23 @@ struct FemtoUniversePairTaskTrackD0 { case 1: doSameEvent(thegroupPartsTrack, theGroupPartsD0bars, parts, col.magField(), col.multNtr()); break; - case 2: - doSameEvent(thegroupPartsTrack, thegroupPartsOnlyD0D0bar, parts, col.magField(), col.multNtr()); - break; default: break; } } PROCESS_SWITCH(FemtoUniversePairTaskTrackD0, processSameEvent, "Enable processing same event", true); + void processSameEventSB(o2::aod::FdCollision const& col, FemtoFullParticles const& parts) + { + fillCollision(col); + + auto groupPartsTrack = partsTrack->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + auto groupPartsD0sFromSB = partsD0sFromSB->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + + doSameEvent(groupPartsTrack, groupPartsD0sFromSB, parts, col.magField(), col.multNtr()); + } + PROCESS_SWITCH(FemtoUniversePairTaskTrackD0, processSameEventSB, "Enable processing same event", true); + /// process function for to call doSameEvent with Monte Carlo /// \param col subscribe to the collision table (Monte Carlo Reconstructed reconstructed) /// \param parts subscribe to joined table FemtoUniverseParticles and FemtoUniverseMCLables to access Monte Carlo truth @@ -764,8 +815,8 @@ struct FemtoUniversePairTaskTrackD0 { { fillCollision(col); - auto thegroupPartsD0 = partsD0D0barMC->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - auto thegroupPartsTrack = partsTrackMC->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + auto thegroupPartsD0 = partsD0D0barMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + auto thegroupPartsTrack = partsTrackMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); doSameEvent(thegroupPartsTrack, thegroupPartsD0, parts, col.magField(), col.multNtr()); } @@ -791,14 +842,28 @@ struct FemtoUniversePairTaskTrackD0 { continue; } } + // // Soft Pion Removal + if (confRemoveSoftPions) { + if (softPionRemoval.isSoftPion(track, d0candidate, parts, confSoftPionD0Flag, confSoftPionD0barFlag, sigmaSoftPiInvMass)) { + continue; + } + } // // Close Pair Rejection if (confIsCPR.value) { if (pairCloseRejection.isClosePair(track, d0candidate, parts, magFieldTesla, femto_universe_container::EventType::mixed)) { continue; } } + // // Track Cleaning + if (!pairCleaner.isCleanPair(track, d0candidate, parts)) { + continue; + } + // Efficiency + weight = 1.0f; + if (ConfEff.doEfficiencyCorr) { + weight = efficiencyCalculator.getWeight(ParticleNo::ONE, track) * efficiencyCalculator.getWeight(ParticleNo::TWO, d0candidate); + } - mixedEventFemtoCont.setPair(track, d0candidate, multCol, ConfBothTracks.confUse3D); mixedEventAngularCont.setPair(track, d0candidate, multCol, ConfBothTracks.confUse3D); } } @@ -809,13 +874,12 @@ struct FemtoUniversePairTaskTrackD0 { void processMixedEvent(o2::aod::FdCollisions const& cols, FemtoFullParticles const& parts) { - for (auto const& [collision1, collision2] : soa::selfCombinations(colBinning, 5, -1, cols, cols)) { + for (auto const& [collision1, collision2] : soa::selfCombinations(colBinning, confNEventsMix, -1, cols, cols)) { const int multiplicityCol = collision1.multNtr(); mixQaRegistry.fill(HIST("MixingQA/hMECollisionBins"), colBinning.getBin({collision1.posZ(), multiplicityCol})); auto groupPartsTrack = partsTrack->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision2.globalIndex(), cache); - auto groupPartsOnlyD0D0bar = partsOnlyD0D0bar->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex(), cache); auto theGroupPartsD0s = partsD0s->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex(), cache); auto theGroupPartsD0bars = partsD0bars->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex(), cache); @@ -835,9 +899,6 @@ struct FemtoUniversePairTaskTrackD0 { case 1: doMixedEvent(groupPartsTrack, theGroupPartsD0bars, parts, magFieldTesla1, multiplicityCol); break; - case 2: - doMixedEvent(groupPartsTrack, groupPartsOnlyD0D0bar, parts, magFieldTesla1, multiplicityCol); - break; default: break; } @@ -845,6 +906,33 @@ struct FemtoUniversePairTaskTrackD0 { } PROCESS_SWITCH(FemtoUniversePairTaskTrackD0, processMixedEvent, "Enable processing mixed events", true); + /// process function for to call doMixedEvent with Data + /// @param cols subscribe to the collisions table (Data) + /// @param parts subscribe to the femtoUniverseParticleTable + void processMixedEventSB(o2::aod::FdCollisions const& cols, FemtoFullParticles const& parts) + { + for (auto const& [collision1, collision2] : soa::selfCombinations(colBinning, confNEventsMix, -1, cols, cols)) { + + const int multiplicityCol = collision1.multNtr(); + mixQaRegistry.fill(HIST("MixingQA/hMECollisionBins"), colBinning.getBin({collision1.posZ(), multiplicityCol})); + + auto groupPartsTrack = partsTrack->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision2.globalIndex(), cache); + auto groupPartsD0sFromSB = partsD0sFromSB->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex(), cache); + + const auto& magFieldTesla1 = collision1.magField(); + const auto& magFieldTesla2 = collision2.magField(); + + if (magFieldTesla1 != magFieldTesla2) { + continue; + } + /// \todo before mixing we should check whether both collisions contain a pair of particles! + // if (partsD0.size() == 0 || kNPart2Evt1 == 0 || kNPart1Evt2 == 0 || partsTrack.size() == 0 ) continue; + + doMixedEvent(groupPartsTrack, groupPartsD0sFromSB, parts, magFieldTesla1, multiplicityCol); + } + } + PROCESS_SWITCH(FemtoUniversePairTaskTrackD0, processMixedEventSB, "Enable processing mixed events", false); + /// brief process function for to call doMixedEvent with Monte Carlo /// @param cols subscribe to the collisions table (Monte Carlo Reconstructed reconstructed) /// @param parts subscribe to joined table FemtoUniverseParticles and FemtoUniverseMCLables to access Monte Carlo truth @@ -853,13 +941,13 @@ struct FemtoUniversePairTaskTrackD0 { soa::Join const& parts, o2::aod::FdMCParticles const&) { - for (auto const& [collision1, collision2] : soa::selfCombinations(colBinning, 5, -1, cols, cols)) { + for (auto const& [collision1, collision2] : soa::selfCombinations(colBinning, confNEventsMix, -1, cols, cols)) { const int multiplicityCol = collision1.multNtr(); mixQaRegistry.fill(HIST("MixingQA/hMECollisionBins"), colBinning.getBin({collision1.posZ(), multiplicityCol})); - auto groupPartsTrack = partsTrackMC->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision2.globalIndex(), cache); - auto groupPartsD0 = partsD0D0barMC->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex(), cache); + auto groupPartsTrack = partsTrackMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision2.globalIndex(), cache); + auto groupPartsD0 = partsD0D0barMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex(), cache); const auto& magFieldTesla1 = collision1.magField(); const auto& magFieldTesla2 = collision2.magField(); @@ -874,6 +962,54 @@ struct FemtoUniversePairTaskTrackD0 { } } PROCESS_SWITCH(FemtoUniversePairTaskTrackD0, processMixedEventMC, "Enable processing mixed events MC", false); + + void processMCReco(FemtoMCParticles const&, aod::FdMCParticles const&) + { + // WORK IN PROGRESS + // for (auto const& part : parts) {} + } + PROCESS_SWITCH(FemtoUniversePairTaskTrackD0, processMCReco, "Process MC reco data", false); + + void processMCTruth(aod::FDParticles const& parts) // WORK IN PROGRESS + { + for (auto const& part : parts) { + if (part.partType() != uint8_t(aod::femtouniverseparticle::ParticleType::kMCTruthTrack)) + continue; + + int pdgCode = static_cast(part.pidCut()); + const auto& pdgParticle = pdgMC->GetParticle(pdgCode); + if (!pdgParticle) { + continue; + } + + if (pdgParticle->Charge() > 0.0) { + mcTruthRegistry.fill(HIST("MCTruthAllPositivePt"), part.pt()); + } + if (pdgCode == 321) { + // mcTruthRegistry.fill(HIST("MCtruthKp"), part.pt(), part.eta()); + // mcTruthRegistry.fill(HIST("MCtruthKpPt"), part.pt()); + } + if (pdgCode == 333) { + // mcTruthRegistry.fill(HIST("MCtruthPhi"), part.pt(), part.eta()); + // continue; + } + if (pdgCode == 2212) { + // mcTruthRegistry.fill(HIST("MCtruthPpos"), part.pt(), part.eta()); + } + + if (pdgParticle->Charge() < 0.0) { + mcTruthRegistry.fill(HIST("MCTruthAllNegativePt"), part.pt()); + } + if (pdgCode == -321) { + // mcTruthRegistry.fill(HIST("MCtruthKm"), part.pt(), part.eta()); + // mcTruthRegistry.fill(HIST("MCtruthKmPt"), part.pt()); + } + if (pdgCode == -2212) { + // mcTruthRegistry.fill(HIST("MCtruthPneg"), part.pt(), part.eta()); + } + } + } + PROCESS_SWITCH(FemtoUniversePairTaskTrackD0, processMCTruth, "Process MC truth data", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 831f0c173627135f1b36792872ed0a4343c361b2 Mon Sep 17 00:00:00 2001 From: YubiaoWang Date: Thu, 20 Feb 2025 09:56:54 +0800 Subject: [PATCH 0331/1650] [PWGJE] Update event selection and leadingConstituentPt, fix Nbin error in fit (#10079) --- PWGJE/Tasks/jetChargedV2.cxx | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/PWGJE/Tasks/jetChargedV2.cxx b/PWGJE/Tasks/jetChargedV2.cxx index d4e319765af..61b1f1e1dbd 100644 --- a/PWGJE/Tasks/jetChargedV2.cxx +++ b/PWGJE/Tasks/jetChargedV2.cxx @@ -89,6 +89,7 @@ struct JetChargedV2 { Configurable jetAreaFractionMin{"jetAreaFractionMin", -99.0, "used to make a cut on the jet areas"}; Configurable leadingConstituentPtMin{"leadingConstituentPtMin", -99.0, "minimum pT selection on jet constituent"}; + Configurable leadingConstituentPtMax{"leadingConstituentPtMax", 9999.0, "maximum pT selection on jet constituent"}; Configurable jetPtMin{"jetPtMin", 0.15, "minimum pT acceptance for jets"}; Configurable jetPtMax{"jetPtMax", 200.0, "maximum pT acceptance for jets"}; Configurable jetEtaMin{"jetEtaMin", -0.9, "minimum eta acceptance for jets"}; @@ -221,6 +222,7 @@ struct JetChargedV2 { registry.add("h2_Chi2Cent_CombinFit", "Chi2 vs centrality; centrality; #tilde{#chi^{2}}", {HistType::kTH2F, {{100, 0, 100}, {100, 0, 5}}}); registry.add("h2_PChi2_CombinFit", "p-value vs #tilde{#chi^{2}}; p-value; #tilde{#chi^{2}}", {HistType::kTH2F, {{100, 0, 1}, {100, 0, 5}}}); + registry.add("Thn_PChi2_CombinFitCent", "p-value vs #tilde{#chi^{2}}; p-value; #tilde{#chi^{2}}", {HistType::kTHnSparseF, {{100, 0.0, 100.0}, {100, 0, 1}, {100, 0, 5}}}); registry.add("h2_PChi2_CombinFitA", "p-value vs #tilde{#chi^{2}}; p-value; #tilde{#chi^{2}}", {HistType::kTH2F, {{100, 0, 1}, {100, 0, 5}}}); registry.add("h2_PChi2_CombinFitB", "p-value vs #tilde{#chi^{2}}; p-value; #tilde{#chi^{2}}", {HistType::kTH2F, {{100, 0, 1}, {100, 0, 5}}}); @@ -321,17 +323,27 @@ struct JetChargedV2 { return false; } } - if (leadingConstituentPtMin > -98.0) { - bool isMinleadingConstituent = false; + bool checkConstituentPt = true; + bool checkConstituentMinPt = (leadingConstituentPtMin > -98.0); + bool checkConstituentMaxPt = (leadingConstituentPtMax < 9998.0); + if (!checkConstituentMinPt && !checkConstituentMaxPt) { + checkConstituentPt = false; + } + if (checkConstituentPt) { + bool isMinLeadingConstituent = !checkConstituentMinPt; + bool isMaxLeadingConstituent = true; + for (const auto& constituent : jet.template tracks_as()) { - if (constituent.pt() >= leadingConstituentPtMin) { - isMinleadingConstituent = true; - break; + double pt = constituent.pt(); + + if (checkConstituentMinPt && pt >= leadingConstituentPtMin) { + isMinLeadingConstituent = true; + } + if (checkConstituentMaxPt && pt > leadingConstituentPtMax) { + isMaxLeadingConstituent = false; } } - if (!isMinleadingConstituent) { - return false; - } + return isMinLeadingConstituent && isMaxLeadingConstituent; } return true; } @@ -472,6 +484,10 @@ struct JetChargedV2 { registry.fill(HIST("h_evtnum_NTrk"), evtnum, nTrk); } + if (nTrk <= 0) { + return; + } + hPtsumSumptFit = new TH1F("h_ptsum_sumpt_fit", "h_ptsum_sumpt fit use", TMath::CeilNint(std::sqrt(nTrk)), 0., o2::constants::math::TwoPI); if (jets.size() > 0) { @@ -592,6 +608,7 @@ struct JetChargedV2 { registry.fill(HIST("h2_PvalueCDFCent_CombinFit"), collision.centrality(), cDF); registry.fill(HIST("h2_Chi2Cent_CombinFit"), collision.centrality(), chiSqr / (static_cast(nDF))); registry.fill(HIST("h2_PChi2_CombinFit"), cDF, chiSqr / (static_cast(nDF))); + registry.fill(HIST("Thn_PChi2_CombinFitCent"), collision.centrality(), cDF, chiSqr / (static_cast(nDF))); double evtcent = collision.centrality(); if (evtcent >= 0 && evtcent <= 5) { registry.fill(HIST("h2_PChi2_CombinFitA"), cDF, chiSqr / (static_cast(nDF))); @@ -723,7 +740,7 @@ struct JetChargedV2 { } registry.fill(HIST("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithoutleadingjet"), collision.centrality(), randomConePt - o2::constants::math::PI * randomConeR * randomConeR * rholocal, rcPhiPsi2, 1.0); } - hPtsumSumptFit->Reset(); + delete hPtsumSumptFit; evtnum += 1; } PROCESS_SWITCH(JetChargedV2, processSigmaPt, "Sigma pT and bkg as fcn of phi", true); From d813a2235d130d734ca8b03fd374338513f9c57c Mon Sep 17 00:00:00 2001 From: Stefano Cannito <143754257+scannito@users.noreply.github.com> Date: Thu, 20 Feb 2025 08:01:13 +0100 Subject: [PATCH 0332/1650] [PWGLF] Usi Gen pT for efficiencies (#10086) --- .../Tasks/Strangeness/phik0shortanalysis.cxx | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx index 7da8677cb6e..949a178e6ef 100644 --- a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx @@ -13,8 +13,9 @@ /// \brief Analysis task for the Phi and K0S rapidity correlations analysis /// \author Stefano Cannito (stefano.cannito@cern.ch) -#include #include + +#include #include #include #include @@ -1071,7 +1072,7 @@ struct Phik0shortanalysis { if (!selectionPion(track, true)) continue; - dataPhiPionHist.fill(HIST("h3PiRapidityData"), multiplicity, track.pt(), track.rapidity(massPi)); + dataPionHist.fill(HIST("h3PiRapidityData"), multiplicity, track.pt(), track.rapidity(massPi)); if (std::abs(track.rapidity(massPi)) > cfgYAcceptance) continue; @@ -1339,7 +1340,7 @@ struct Phik0shortanalysis { if (std::abs(v0mcparticle.y()) > cfgYAcceptance) continue; - mcK0SHist.fill(HIST("h3RecMCK0S"), genmultiplicity, v0.pt(), v0.mK0Short()); + mcK0SHist.fill(HIST("h3RecMCK0S"), genmultiplicity, v0mcparticle.pt(), v0.mK0Short()); std::array isCountedMCPhi{false, false, false}; @@ -1350,19 +1351,19 @@ struct Phik0shortanalysis { continue; if (!isCountedMCPhi.at(0)) { - mcPhiK0SHist.fill(HIST("h3RecMCPhiK0SInc"), genmultiplicity, v0.pt(), v0.mK0Short()); + mcPhiK0SHist.fill(HIST("h3RecMCPhiK0SInc"), genmultiplicity, v0mcparticle.pt(), v0.mK0Short()); isCountedMCPhi.at(0) = true; } if (std::abs(v0mcparticle.y() - mcParticle.y()) > cfgFCutOnDeltaY) continue; if (!isCountedMCPhi.at(1)) { - mcPhiK0SHist.fill(HIST("h3RecMCPhiK0SFCut"), genmultiplicity, v0.pt(), v0.mK0Short()); + mcPhiK0SHist.fill(HIST("h3RecMCPhiK0SFCut"), genmultiplicity, v0mcparticle.pt(), v0.mK0Short()); isCountedMCPhi.at(1) = true; } if (std::abs(v0mcparticle.y() - mcParticle.y()) > cfgSCutOnDeltaY) continue; if (!isCountedMCPhi.at(2)) { - mcPhiK0SHist.fill(HIST("h3RecMCPhiK0SSCut"), genmultiplicity, v0.pt(), v0.mK0Short()); + mcPhiK0SHist.fill(HIST("h3RecMCPhiK0SSCut"), genmultiplicity, v0mcparticle.pt(), v0.mK0Short()); isCountedMCPhi.at(2) = true; } } @@ -1420,7 +1421,7 @@ struct Phik0shortanalysis { mcPionHist.fill(HIST("h4PiRapiditySmearing"), genmultiplicity, track.pt(), track.rapidity(massPi), mcTrack.y()); - mcPionHist.fill(HIST("h3RecMCPiTPC"), genmultiplicity, track.pt(), track.tpcNSigmaPi()); + mcPionHist.fill(HIST("h3RecMCPiTPC"), genmultiplicity, mcTrack.pt(), track.tpcNSigmaPi()); std::array isCountedMCPhi{false, false, false}; @@ -1431,19 +1432,19 @@ struct Phik0shortanalysis { continue; if (!isCountedMCPhi.at(0)) { - mcPhiPionHist.fill(HIST("h3RecMCPhiPiTPCInc"), genmultiplicity, track.pt(), track.tpcNSigmaPi()); + mcPhiPionHist.fill(HIST("h3RecMCPhiPiTPCInc"), genmultiplicity, mcTrack.pt(), track.tpcNSigmaPi()); isCountedMCPhi.at(0) = true; } if (std::abs(mcTrack.y() - mcParticle.y()) > cfgFCutOnDeltaY) continue; if (!isCountedMCPhi.at(1)) { - mcPhiPionHist.fill(HIST("h3RecMCPhiPiTPCFCut"), genmultiplicity, track.pt(), track.tpcNSigmaPi()); + mcPhiPionHist.fill(HIST("h3RecMCPhiPiTPCFCut"), genmultiplicity, mcTrack.pt(), track.tpcNSigmaPi()); isCountedMCPhi.at(1) = true; } if (std::abs(mcTrack.y() - mcParticle.y()) > cfgSCutOnDeltaY) continue; if (!isCountedMCPhi.at(2)) { - mcPhiPionHist.fill(HIST("h3RecMCPhiPiTPCSCut"), genmultiplicity, track.pt(), track.tpcNSigmaPi()); + mcPhiPionHist.fill(HIST("h3RecMCPhiPiTPCSCut"), genmultiplicity, mcTrack.pt(), track.tpcNSigmaPi()); isCountedMCPhi.at(2) = true; } } @@ -1451,7 +1452,7 @@ struct Phik0shortanalysis { if (track.pt() >= 0.5 && !track.hasTOF()) continue; - mcPionHist.fill(HIST("h4RecMCPiTPCTOF"), genmultiplicity, track.pt(), track.tpcNSigmaPi(), track.tofNSigmaPi()); + mcPionHist.fill(HIST("h4RecMCPiTPCTOF"), genmultiplicity, mcTrack.pt(), track.tpcNSigmaPi(), track.tofNSigmaPi()); isCountedMCPhi = {false, false, false}; @@ -1462,19 +1463,19 @@ struct Phik0shortanalysis { continue; if (!isCountedMCPhi.at(0)) { - mcPhiPionHist.fill(HIST("h4RecMCPhiPiTPCTOFInc"), genmultiplicity, track.pt(), track.tpcNSigmaPi(), track.tofNSigmaPi()); + mcPhiPionHist.fill(HIST("h4RecMCPhiPiTPCTOFInc"), genmultiplicity, mcTrack.pt(), track.tpcNSigmaPi(), track.tofNSigmaPi()); isCountedMCPhi.at(0) = true; } if (std::abs(mcTrack.y() - mcParticle.y()) > cfgFCutOnDeltaY) continue; if (!isCountedMCPhi.at(1)) { - mcPhiPionHist.fill(HIST("h4RecMCPhiPiTPCTOFFCut"), genmultiplicity, track.pt(), track.tpcNSigmaPi(), track.tofNSigmaPi()); + mcPhiPionHist.fill(HIST("h4RecMCPhiPiTPCTOFFCut"), genmultiplicity, mcTrack.pt(), track.tpcNSigmaPi(), track.tofNSigmaPi()); isCountedMCPhi.at(1) = true; } if (std::abs(mcTrack.y() - mcParticle.y()) > cfgSCutOnDeltaY) continue; if (!isCountedMCPhi.at(2)) { - mcPhiPionHist.fill(HIST("h4RecMCPhiPiTPCTOFSCut"), genmultiplicity, track.pt(), track.tpcNSigmaPi(), track.tofNSigmaPi()); + mcPhiPionHist.fill(HIST("h4RecMCPhiPiTPCTOFSCut"), genmultiplicity, mcTrack.pt(), track.tpcNSigmaPi(), track.tofNSigmaPi()); isCountedMCPhi.at(2) = true; } } From 8c3707a9155c13db3cd14b0be7f3adf606d5500f Mon Sep 17 00:00:00 2001 From: altsybee Date: Thu, 20 Feb 2025 08:14:09 +0100 Subject: [PATCH 0333/1650] [Common,DPG] Cleanup: removal of kNoCollInTimeRangeVzDependent bit and bcInTF column (#10060) --- Common/CCDB/EventSelectionParams.cxx | 1 - Common/CCDB/EventSelectionParams.h | 103 +++++++++--------- Common/DataModel/EventSelection.h | 2 - Common/TableProducer/eventSelection.cxx | 51 +++------ DPG/Tasks/AOTEvent/rofOccupancyQa.cxx | 135 ++++++++++++------------ 5 files changed, 130 insertions(+), 162 deletions(-) diff --git a/Common/CCDB/EventSelectionParams.cxx b/Common/CCDB/EventSelectionParams.cxx index 2259c916787..74587314240 100644 --- a/Common/CCDB/EventSelectionParams.cxx +++ b/Common/CCDB/EventSelectionParams.cxx @@ -65,7 +65,6 @@ const char* selectionLabels[kNsel] = { "kNoCollInTimeRangeNarrow", "kNoCollInTimeRangeStrict", "kNoCollInTimeRangeStandard", - "kNoCollInTimeRangeVzDependent", "kNoCollInRofStrict", "kNoCollInRofStandard", "kNoHighMultCollInPrevRof", diff --git a/Common/CCDB/EventSelectionParams.h b/Common/CCDB/EventSelectionParams.h index afd8dcbf081..4633ff7aa73 100644 --- a/Common/CCDB/EventSelectionParams.h +++ b/Common/CCDB/EventSelectionParams.h @@ -24,58 +24,57 @@ namespace o2::aod::evsel { // Event selection criteria enum EventSelectionFlags { - kIsBBV0A = 0, // cell-averaged time in V0A in beam-beam window - kIsBBV0C, // cell-averaged time in V0C in beam-beam window (for Run 2 only) - kIsBBFDA, // cell-averaged time in FDA (or AD in Run2) in beam-beam window - kIsBBFDC, // cell-averaged time in FDC (or AD in Run2) in beam-beam window - kIsBBT0A, // cell-averaged time in T0A in beam-beam window - kIsBBT0C, // cell-averaged time in T0C in beam-beam window - kNoBGV0A, // cell-averaged time in V0A in beam-gas window - kNoBGV0C, // cell-averaged time in V0C in beam-gas window (for Run 2 only) - kNoBGFDA, // cell-averaged time in FDA (AD in Run2) in beam-gas window - kNoBGFDC, // cell-averaged time in FDC (AD in Run2) in beam-gas window - kNoBGT0A, // cell-averaged time in T0A in beam-gas window - kNoBGT0C, // cell-averaged time in T0C in beam-gas window - kIsBBZNA, // time in common ZNA channel in beam-beam window - kIsBBZNC, // time in common ZNC channel in beam-beam window - kIsBBZAC, // time in ZNA and ZNC in beam-beam window - circular cut in ZNA-ZNC plane - kNoBGZNA, // time in common ZNA channel is outside of beam-gas window - kNoBGZNC, // time in common ZNC channel is outside of beam-gas window - kNoV0MOnVsOfPileup, // no out-of-bunch pileup according to online-vs-offline VOM correlation - kNoSPDOnVsOfPileup, // no out-of-bunch pileup according to online-vs-offline SPD correlation - kNoV0Casymmetry, // no beam-gas according to correlation of V0C multiplicities in V0C3 and V0C012 - kIsGoodTimeRange, // good time range - kNoIncompleteDAQ, // complete event according to DAQ flags - kNoTPCLaserWarmUp, // no TPC laser warm-up event (used in Run 1) - kNoTPCHVdip, // no TPC HV dip - kNoPileupFromSPD, // no pileup according to SPD vertexer - kNoV0PFPileup, // no out-of-bunch pileup according to V0 past-future info - kNoSPDClsVsTklBG, // no beam-gas according to cluster-vs-tracklet correlation - kNoV0C012vsTklBG, // no beam-gas according to V0C012-vs-tracklet correlation - kNoInconsistentVtx, // no inconsistency in SPD and Track vertices - kNoPileupInMultBins, // no pileup according to multiplicity-differential pileup checks - kNoPileupMV, // no pileup according to multi-vertexer - kNoPileupTPC, // no pileup in TPC - kIsTriggerTVX, // FT0 vertex (acceptable FT0C-FT0A time difference) at trigger level - kIsINT1, // SPDGFO >= 1 || V0A || V0C - kNoITSROFrameBorder, // bunch crossing is far from ITS RO Frame border - kNoTimeFrameBorder, // bunch crossing is far from Time Frame borders - kNoSameBunchPileup, // reject collisions in case of pileup with another collision in the same foundBC - kIsGoodZvtxFT0vsPV, // small difference between z-vertex from PV and from FT0 - kIsVertexITSTPC, // at least one ITS-TPC track (reject vertices built from ITS-only tracks) - kIsVertexTOFmatched, // at least one of vertex contributors is matched to TOF - kIsVertexTRDmatched, // at least one of vertex contributors is matched to TRD - kNoCollInTimeRangeNarrow, // no other collisions in specified time range (narrower than Strict) - kNoCollInTimeRangeStrict, // no other collisions in specified time range - kNoCollInTimeRangeStandard, // no other collisions in specified time range with per-collision multiplicity above threshold - kNoCollInTimeRangeVzDependent, // no other collisions in vZ-dependent time range near a given collision - kNoCollInRofStrict, // no other collisions in this Readout Frame - kNoCollInRofStandard, // no other collisions in this Readout Frame with per-collision multiplicity above threshold - kNoHighMultCollInPrevRof, // veto an event if FT0C amplitude in previous ITS ROF is above threshold - kIsGoodITSLayer3, // number of inactive chips on ITS layer 3 is below maximum allowed value - kIsGoodITSLayer0123, // numbers of inactive chips on ITS layers 0-3 are below maximum allowed values - kIsGoodITSLayersAll, // numbers of inactive chips on all ITS layers are below maximum allowed values - kNsel // counter + kIsBBV0A = 0, // cell-averaged time in V0A in beam-beam window + kIsBBV0C, // cell-averaged time in V0C in beam-beam window (for Run 2 only) + kIsBBFDA, // cell-averaged time in FDA (or AD in Run2) in beam-beam window + kIsBBFDC, // cell-averaged time in FDC (or AD in Run2) in beam-beam window + kIsBBT0A, // cell-averaged time in T0A in beam-beam window + kIsBBT0C, // cell-averaged time in T0C in beam-beam window + kNoBGV0A, // cell-averaged time in V0A in beam-gas window + kNoBGV0C, // cell-averaged time in V0C in beam-gas window (for Run 2 only) + kNoBGFDA, // cell-averaged time in FDA (AD in Run2) in beam-gas window + kNoBGFDC, // cell-averaged time in FDC (AD in Run2) in beam-gas window + kNoBGT0A, // cell-averaged time in T0A in beam-gas window + kNoBGT0C, // cell-averaged time in T0C in beam-gas window + kIsBBZNA, // time in common ZNA channel in beam-beam window + kIsBBZNC, // time in common ZNC channel in beam-beam window + kIsBBZAC, // time in ZNA and ZNC in beam-beam window - circular cut in ZNA-ZNC plane + kNoBGZNA, // time in common ZNA channel is outside of beam-gas window + kNoBGZNC, // time in common ZNC channel is outside of beam-gas window + kNoV0MOnVsOfPileup, // no out-of-bunch pileup according to online-vs-offline VOM correlation + kNoSPDOnVsOfPileup, // no out-of-bunch pileup according to online-vs-offline SPD correlation + kNoV0Casymmetry, // no beam-gas according to correlation of V0C multiplicities in V0C3 and V0C012 + kIsGoodTimeRange, // good time range + kNoIncompleteDAQ, // complete event according to DAQ flags + kNoTPCLaserWarmUp, // no TPC laser warm-up event (used in Run 1) + kNoTPCHVdip, // no TPC HV dip + kNoPileupFromSPD, // no pileup according to SPD vertexer + kNoV0PFPileup, // no out-of-bunch pileup according to V0 past-future info + kNoSPDClsVsTklBG, // no beam-gas according to cluster-vs-tracklet correlation + kNoV0C012vsTklBG, // no beam-gas according to V0C012-vs-tracklet correlation + kNoInconsistentVtx, // no inconsistency in SPD and Track vertices + kNoPileupInMultBins, // no pileup according to multiplicity-differential pileup checks + kNoPileupMV, // no pileup according to multi-vertexer + kNoPileupTPC, // no pileup in TPC + kIsTriggerTVX, // FT0 vertex (acceptable FT0C-FT0A time difference) at trigger level + kIsINT1, // SPDGFO >= 1 || V0A || V0C + kNoITSROFrameBorder, // bunch crossing is far from ITS RO Frame border + kNoTimeFrameBorder, // bunch crossing is far from Time Frame borders + kNoSameBunchPileup, // reject collisions in case of pileup with another collision in the same foundBC + kIsGoodZvtxFT0vsPV, // small difference between z-vertex from PV and from FT0 + kIsVertexITSTPC, // at least one ITS-TPC track (reject vertices built from ITS-only tracks) + kIsVertexTOFmatched, // at least one of vertex contributors is matched to TOF + kIsVertexTRDmatched, // at least one of vertex contributors is matched to TRD + kNoCollInTimeRangeNarrow, // no other collisions in specified time range (narrower than Strict) + kNoCollInTimeRangeStrict, // no other collisions in specified time range + kNoCollInTimeRangeStandard, // no other collisions in specified time range with per-collision multiplicity above threshold + kNoCollInRofStrict, // no other collisions in this Readout Frame + kNoCollInRofStandard, // no other collisions in this Readout Frame with per-collision multiplicity above threshold + kNoHighMultCollInPrevRof, // veto an event if FT0C amplitude in previous ITS ROF is above threshold + kIsGoodITSLayer3, // number of inactive chips on ITS layer 3 is below maximum allowed value + kIsGoodITSLayer0123, // numbers of inactive chips on ITS layers 0-3 are below maximum allowed values + kIsGoodITSLayersAll, // numbers of inactive chips on all ITS layers are below maximum allowed values + kNsel // counter }; extern const char* selectionLabels[kNsel]; diff --git a/Common/DataModel/EventSelection.h b/Common/DataModel/EventSelection.h index b8ac26fd3e6..851febde327 100644 --- a/Common/DataModel/EventSelection.h +++ b/Common/DataModel/EventSelection.h @@ -61,7 +61,6 @@ DECLARE_SOA_INDEX_COLUMN_FULL(FoundFT0, foundFT0, int, FT0s, "_foundFT0"); //! DECLARE_SOA_INDEX_COLUMN_FULL(FoundFV0, foundFV0, int, FV0As, "_foundFV0"); //! FV0 entry index in FV0As table (-1 if doesn't exist) DECLARE_SOA_INDEX_COLUMN_FULL(FoundFDD, foundFDD, int, FDDs, "_foundFDD"); //! FDD entry index in FDDs table (-1 if doesn't exist) DECLARE_SOA_INDEX_COLUMN_FULL(FoundZDC, foundZDC, int, Zdcs, "_foundZDC"); //! ZDC entry index in ZDCs table (-1 if doesn't exist) -DECLARE_SOA_COLUMN(BcInTF, bcInTF, int); //! Position of a (found) bunch crossing inside a given timeframe DECLARE_SOA_COLUMN(NumTracksInTimeRange, trackOccupancyInTimeRange, int); //! Occupancy in specified time interval by a number of tracks from nearby collisions // o2-linter: disable=name/o2-column DECLARE_SOA_COLUMN(SumAmpFT0CInTimeRange, ft0cOccupancyInTimeRange, float); //! Occupancy in specified time interval by a sum of FT0C amplitudes from nearby collisions // o2-linter: disable=name/o2-column } // namespace evsel @@ -83,7 +82,6 @@ DECLARE_SOA_TABLE(EvSels, "AOD", "EVSEL", //! evsel::FoundFV0Id, evsel::FoundFDDId, evsel::FoundZDCId, - evsel::BcInTF, evsel::NumTracksInTimeRange, evsel::SumAmpFT0CInTimeRange); using EvSel = EvSels::iterator; diff --git a/Common/TableProducer/eventSelection.cxx b/Common/TableProducer/eventSelection.cxx index f37c0576a9d..49cb49475cc 100644 --- a/Common/TableProducer/eventSelection.cxx +++ b/Common/TableProducer/eventSelection.cxx @@ -550,15 +550,14 @@ struct EventSelectionTask { Configurable confSigmaBCforHighPtTracks{"confSigmaBCforHighPtTracks", 4, "Custom sigma (in bcs) for collisions with high-pt tracks"}; // configurables for occupancy-based event selection - Configurable confTimeIntervalForOccupancyCalculationMin{"TimeIntervalForOccupancyCalculationMin", -40, "Min time diff window for TPC occupancy calculation, us"}; // o2-linter: disable=name/configurable - Configurable confTimeIntervalForOccupancyCalculationMax{"TimeIntervalForOccupancyCalculationMax", 100, "Max time diff window for TPC occupancy calculation, us"}; // o2-linter: disable=name/configurable - Configurable confTimeRangeVetoOnCollStandard{"TimeRangeVetoOnCollStandard", 10.0, "Exclusion of a collision if there are other collisions nearby, +/- us"}; // o2-linter: disable=name/configurable - Configurable confTimeRangeVetoOnCollNarrow{"TimeRangeVetoOnCollNarrow", 2.0, "Exclusion of a collision if there are other collisions nearby, +/- us"}; // o2-linter: disable=name/configurable - Configurable confFT0CamplCutVetoOnCollInTimeRange{"FT0CamplPerCollCutVetoOnCollInTimeRange", 8000, "Max allowed FT0C amplitude for each nearby collision in +/- time range"}; // o2-linter: disable=name/configurable - Configurable confEpsilonDistanceForVzDependentVetoTPC{"EpsilonDistanceForVzDependentVetoTPC", 2.5, "Epsilon for vZ-dependent veto on drifting TPC tracks from nearby collisions, cm"}; // o2-linter: disable=name/configurable - Configurable confFT0CamplCutVetoOnCollInROF{"FT0CamplPerCollCutVetoOnCollInROF", 5000, "Max allowed FT0C amplitude for each nearby collision inside this ITS ROF"}; // o2-linter: disable=name/configurable - Configurable confEpsilonVzDiffVetoInROF{"EpsilonVzDiffVetoInROF", 0.3, "Minumum distance to nearby collisions along z inside this ITS ROF, cm"}; // o2-linter: disable=name/configurable - Configurable confUseWeightsForOccupancyVariable{"UseWeightsForOccupancyEstimator", 1, "Use or not the delta-time weights for the occupancy estimator"}; // o2-linter: disable=name/configurable + Configurable confTimeIntervalForOccupancyCalculationMin{"TimeIntervalForOccupancyCalculationMin", -40, "Min time diff window for TPC occupancy calculation, us"}; // o2-linter: disable=name/configurable + Configurable confTimeIntervalForOccupancyCalculationMax{"TimeIntervalForOccupancyCalculationMax", 100, "Max time diff window for TPC occupancy calculation, us"}; // o2-linter: disable=name/configurable + Configurable confTimeRangeVetoOnCollStandard{"TimeRangeVetoOnCollStandard", 10.0, "Exclusion of a collision if there are other collisions nearby, +/- us"}; // o2-linter: disable=name/configurable + Configurable confTimeRangeVetoOnCollNarrow{"TimeRangeVetoOnCollNarrow", 2.0, "Exclusion of a collision if there are other collisions nearby, +/- us"}; // o2-linter: disable=name/configurable + Configurable confFT0CamplCutVetoOnCollInTimeRange{"FT0CamplPerCollCutVetoOnCollInTimeRange", 8000, "Max allowed FT0C amplitude for each nearby collision in +/- time range"}; // o2-linter: disable=name/configurable + Configurable confFT0CamplCutVetoOnCollInROF{"FT0CamplPerCollCutVetoOnCollInROF", 5000, "Max allowed FT0C amplitude for each nearby collision inside this ITS ROF"}; // o2-linter: disable=name/configurable + Configurable confEpsilonVzDiffVetoInROF{"EpsilonVzDiffVetoInROF", 0.3, "Minumum distance to nearby collisions along z inside this ITS ROF, cm"}; // o2-linter: disable=name/configurable + Configurable confUseWeightsForOccupancyVariable{"UseWeightsForOccupancyEstimator", 1, "Use or not the delta-time weights for the occupancy estimator"}; // o2-linter: disable=name/configurable Partition tracklets = (aod::track::trackType == static_cast(o2::aod::track::TrackTypeEnum::Run2Tracklet)); @@ -734,7 +733,7 @@ struct EventSelectionTask { } } - evsel(alias, selection, rct, sel7, sel8, foundBC, foundFT0, foundFV0, foundFDD, foundZDC, 0, 0, 0); + evsel(alias, selection, rct, sel7, sel8, foundBC, foundFT0, foundFV0, foundFDD, foundZDC, 0, 0); } PROCESS_SWITCH(EventSelectionTask, processRun2, "Process Run2 event selection", true); @@ -788,9 +787,8 @@ struct EventSelectionTask { int32_t foundFV0 = bc.foundFV0Id(); int32_t foundFDD = bc.foundFDDId(); int32_t foundZDC = bc.foundZDCId(); - int bcInTF = (bc.globalBC() - bcSOR) % nBCsPerTF; uint32_t rct = 0; - evsel(bc.alias_raw(), bc.selection_raw(), rct, kFALSE, kFALSE, foundBC, foundFT0, foundFV0, foundFDD, foundZDC, bcInTF, -1, -1); + evsel(bc.alias_raw(), bc.selection_raw(), rct, kFALSE, kFALSE, foundBC, foundFT0, foundFV0, foundFDD, foundZDC, -1, -1); } return; } @@ -1049,10 +1047,9 @@ struct EventSelectionTask { std::vector vNumTracksITS567inFullTimeWin(cols.size(), 0); // counter of tracks in full time window for occupancy studies (excluding given event) std::vector vSumAmpFT0CinFullTimeWin(cols.size(), 0); // sum of FT0C of tracks in full time window for occupancy studies (excluding given event) - std::vector vNoCollInTimeRangeStrict(cols.size(), 0); // no collisions in a specified time range - std::vector vNoCollInTimeRangeNarrow(cols.size(), 0); // no collisions in a specified time range (narrow) - std::vector vNoHighMultCollInTimeRange(cols.size(), 0); // no high-mult collisions in a specified time range - std::vector vNoCollInVzDependentTimeRange(cols.size(), 0); // no collisions in a vZ-dependent time range + std::vector vNoCollInTimeRangeStrict(cols.size(), 0); // no collisions in a specified time range + std::vector vNoCollInTimeRangeNarrow(cols.size(), 0); // no collisions in a specified time range (narrow) + std::vector vNoHighMultCollInTimeRange(cols.size(), 0); // no high-mult collisions in a specified time range std::vector vNoCollInSameRofStrict(cols.size(), 0); // to veto events with other collisions in the same ITS ROF std::vector vNoCollInSameRofStandard(cols.size(), 0); // to veto events with other collisions in the same ITS ROF, with per-collision multiplicity above threshold @@ -1105,7 +1102,6 @@ struct EventSelectionTask { int nITS567tracksForVetoNarrow = 0; // to veto events with nearby collisions (narrower range) int nITS567tracksForVetoStrict = 0; // to veto events with nearby collisions int nCollsWithFT0CAboveVetoStandard = 0; // to veto events with per-collision multiplicity above threshold - int nITS567tracksForVetoVzDependent = 0; // to veto events with nearby collisions, vZ-dependent time cut for (uint32_t iCol = 0; iCol < vAssocToThisCol.size(); iCol++) { int thisColIndex = vAssocToThisCol[iCol]; float dt = vCollsTimeDeltaWrtGivenColl[iCol] / 1e3; // ns -> us @@ -1145,21 +1141,6 @@ struct EventSelectionTask { if (vAmpFT0CperColl[thisColIndex] > confFT0CamplCutVetoOnCollInTimeRange) nCollsWithFT0CAboveVetoStandard++; } - - // vZ-dependent time cut to avoid collinear tracks from other collisions (experimental) - if (std::fabs(dt) < 8 + std::fabs(vZ) / driftV) { - if (dt < 0) { - // check distance between given vZ and (moving in two directions) vZ of drifting tracks from past collisions - if ((std::fabs(vCollVz[thisColIndex] - std::fabs(dt) * driftV - vZ) < confEpsilonDistanceForVzDependentVetoTPC) || - (std::fabs(vCollVz[thisColIndex] + std::fabs(dt) * driftV - vZ) < confEpsilonDistanceForVzDependentVetoTPC)) - nITS567tracksForVetoVzDependent += vTracksITS567perColl[thisColIndex]; - } else { // dt>0 - // check distance between drifted vZ of given collision (in two directions) and vZ of future collisions - if ((std::fabs(vZ - dt * driftV - vCollVz[thisColIndex]) < confEpsilonDistanceForVzDependentVetoTPC) || - (std::fabs(vZ + dt * driftV - vCollVz[thisColIndex]) < confEpsilonDistanceForVzDependentVetoTPC)) - nITS567tracksForVetoVzDependent += vTracksITS567perColl[thisColIndex]; - } - } } vNumTracksITS567inFullTimeWin[colIndex] = nITS567tracksInFullTimeWindow; // occupancy by a sum of number of ITS tracks (without a current collision) vSumAmpFT0CinFullTimeWin[colIndex] = sumAmpFT0CInFullTimeWindow; // occupancy by a sum of FT0C amplitudes (without a current collision) @@ -1167,7 +1148,6 @@ struct EventSelectionTask { vNoCollInTimeRangeNarrow[colIndex] = (nITS567tracksForVetoNarrow == 0); vNoCollInTimeRangeStrict[colIndex] = (nITS567tracksForVetoStrict == 0); vNoHighMultCollInTimeRange[colIndex] = (nCollsWithFT0CAboveVetoStandard == 0); - vNoCollInVzDependentTimeRange[colIndex] = (nITS567tracksForVetoVzDependent == 0); // experimental } for (const auto& col : cols) { @@ -1197,7 +1177,6 @@ struct EventSelectionTask { selection |= vNoCollInTimeRangeNarrow[colIndex] ? BIT(kNoCollInTimeRangeNarrow) : 0; selection |= vNoCollInTimeRangeStrict[colIndex] ? BIT(kNoCollInTimeRangeStrict) : 0; selection |= vNoHighMultCollInTimeRange[colIndex] ? BIT(kNoCollInTimeRangeStandard) : 0; - selection |= vNoCollInVzDependentTimeRange[colIndex] ? BIT(kNoCollInTimeRangeVzDependent) : 0; // selection bits based on ITS in-ROF occupancy selection |= vNoCollInSameRofStrict[colIndex] ? BIT(kNoCollInRofStrict) : 0; @@ -1224,9 +1203,7 @@ struct EventSelectionTask { histos.get(HIST("hColCounterAcc"))->Fill(Form("%d", bc.runNumber()), 1); } - int bcInTF = (bc.globalBC() - bcSOR) % nBCsPerTF; - - evsel(alias, selection, rct, sel7, sel8, foundBC, foundFT0, foundFV0, foundFDD, foundZDC, bcInTF, + evsel(alias, selection, rct, sel7, sel8, foundBC, foundFT0, foundFV0, foundFDD, foundZDC, vNumTracksITS567inFullTimeWin[colIndex], vSumAmpFT0CinFullTimeWin[colIndex]); } } diff --git a/DPG/Tasks/AOTEvent/rofOccupancyQa.cxx b/DPG/Tasks/AOTEvent/rofOccupancyQa.cxx index 76bf7e87741..cbc8d7d56d1 100644 --- a/DPG/Tasks/AOTEvent/rofOccupancyQa.cxx +++ b/DPG/Tasks/AOTEvent/rofOccupancyQa.cxx @@ -8,6 +8,12 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. + +/// \file rofOccupancyQa.cxx +/// \brief ROF occupancy QA task +/// +/// \author Igor Altsybeev + #include #include "Framework/ConfigParamSpec.h" @@ -33,18 +39,16 @@ const double bcNS = o2::constants::lhc::LHCBunchSpacingNS; struct RofOccupancyQaTask { // configurables for occupancy-based event selection - Configurable confTimeIntervalForOccupancyCalculationMin{"TimeIntervalForOccupancyCalculationMin", -40, "Min time diff window for TPC occupancy calculation, us"}; - Configurable confTimeIntervalForOccupancyCalculationMax{"TimeIntervalForOccupancyCalculationMax", 100, "Max time diff window for TPC occupancy calculation, us"}; - Configurable confTimeRangeVetoOnCollStandard{"TimeRangeVetoOnCollStandard", 10.0, "Exclusion of a collision if there are other collisions nearby, +/- us"}; - Configurable confTimeRangeVetoOnCollNarrow{"TimeRangeVetoOnCollNarrow", 2.0, "Exclusion of a collision if there are other collisions nearby, +/- us"}; - Configurable confNtracksCutVetoOnCollInTimeRange{"NtracksCutVetoOnCollInTimeRange", 800, "Max allowed N tracks (PV contributors) for each nearby collision in +/- time range"}; - Configurable confEpsilonDistanceForVzDependentVetoTPC{"EpsilonDistanceForVzDependentVetoTPC", 2.5, "Epsilon for vZ-dependent veto on drifting TPC tracks from nearby collisions, cm"}; - // Configurable confNtracksCutVetoOnCollInROF{"NtracksCutVetoOnCollInROF", 500, "Max allowed N tracks (PV contributors) for each nearby collision inside this ITS ROF"}; - Configurable confFT0CamplCutVetoOnCollInROF{"FT0CamplPerCollCutVetoOnCollInROF", 5000, "Max allowed FT0C amplitude for each nearby collision inside this ITS ROF"}; - Configurable confEpsilonVzDiffVetoInROF{"EpsilonVzDiffVetoInROF", 0.3, "Minumum distance to nearby collisions along z inside this ITS ROF, cm"}; - Configurable confUseWeightsForOccupancyVariable{"UseWeightsForOccupancyEstimator", 1, "Use or not the delta-time weights for the occupancy estimator"}; - - Configurable confFactorForHistRange{"kFactorForHistRange", 1.0, "To change axes b/n pp and Pb-Pb"}; + Configurable confTimeIntervalForOccupancyCalculationMin{"TimeIntervalForOccupancyCalculationMin", -40, "Min time diff window for TPC occupancy calculation, us"}; // o2-linter: disable=name/configurable + Configurable confTimeIntervalForOccupancyCalculationMax{"TimeIntervalForOccupancyCalculationMax", 100, "Max time diff window for TPC occupancy calculation, us"}; // o2-linter: disable=name/configurable + Configurable confTimeRangeVetoOnCollStandard{"TimeRangeVetoOnCollStandard", 10.0, "Exclusion of a collision if there are other collisions nearby, +/- us"}; // o2-linter: disable=name/configurable + Configurable confTimeRangeVetoOnCollNarrow{"TimeRangeVetoOnCollNarrow", 2.0, "Exclusion of a collision if there are other collisions nearby, +/- us"}; // o2-linter: disable=name/configurable + Configurable confNtracksCutVetoOnCollInTimeRange{"NtracksCutVetoOnCollInTimeRange", 800, "Max allowed N tracks (PV contributors) for each nearby collision in +/- time range"}; // o2-linter: disable=name/configurable + Configurable confEpsilonDistanceForVzDependentVetoTPC{"EpsilonDistanceForVzDependentVetoTPC", 2.5, "Epsilon for vZ-dependent veto on drifting TPC tracks from nearby collisions, cm"}; // o2-linter: disable=name/configurable + Configurable confFT0CamplCutVetoOnCollInROF{"FT0CamplPerCollCutVetoOnCollInROF", 5000, "Max allowed FT0C amplitude for each nearby collision inside this ITS ROF"}; // o2-linter: disable=name/configurable + Configurable confEpsilonVzDiffVetoInROF{"EpsilonVzDiffVetoInROF", 0.3, "Minumum distance to nearby collisions along z inside this ITS ROF, cm"}; // o2-linter: disable=name/configurable + Configurable confUseWeightsForOccupancyVariable{"UseWeightsForOccupancyEstimator", 1, "Use or not the delta-time weights for the occupancy estimator"}; // o2-linter: disable=name/configurable + Configurable confFactorForHistRange{"kFactorForHistRange", 1.0, "To change axes b/n pp and Pb-Pb"}; // o2-linter: disable=name/configurable Service ccdb; HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -108,7 +112,6 @@ struct RofOccupancyQaTask { histos.add("hThisEvITSTr_vs_ThisEvFT0C/CROSSCHECK_afterNarrowDeltaTimeCut", "", kTH2D, {{250, 0., 1e5 * k}, {250, 0., 10000 * k}}); histos.add("hThisEvITSTr_vs_ThisEvFT0C/CROSSCHECK_afterStrictDeltaTimeCut", "", kTH2D, {{250, 0., 1e5 * k}, {250, 0., 10000 * k}}); histos.add("hThisEvITSTr_vs_ThisEvFT0C/CROSSCHECK_afterStandardDeltaTimeCut", "", kTH2D, {{250, 0., 1e5 * k}, {250, 0., 10000 * k}}); - histos.add("hThisEvITSTr_vs_ThisEvFT0C/CROSSCHECK_afterVzDependentDeltaTimeCut", "", kTH2D, {{250, 0., 1e5 * k}, {250, 0., 10000 * k}}); histos.add("hThisEvITSTr_vs_ThisEvFT0C/CROSSCHECK_kNoCollInRofStrict", "", kTH2D, {{250, 0., 1e5 * k}, {250, 0., 10000 * k}}); histos.add("hThisEvITSTr_vs_ThisEvFT0C/CROSSCHECK_kNoCollInRofStandard", "", kTH2D, {{250, 0., 1e5 * k}, {250, 0., 10000 * k}}); @@ -346,7 +349,6 @@ struct RofOccupancyQaTask { histos.add("nPV_vs_occupancyByTracks/NoCollInTimeRangeNarrow", "", kTH2D, {{125, 0., 8000 * k}, {100, 0., 25000 * k}}); histos.add("nPV_vs_occupancyByTracks/NoCollInTimeRangeStrict", "", kTH2D, {{125, 0., 8000 * k}, {100, 0., 25000 * k}}); histos.add("nPV_vs_occupancyByTracks/NoCollInTimeRangeStandard", "", kTH2D, {{125, 0., 8000 * k}, {100, 0., 25000 * k}}); - histos.add("nPV_vs_occupancyByTracks/NoCollInTimeRangeVzDependent", "", kTH2D, {{125, 0., 8000 * k}, {100, 0., 25000 * k}}); histos.add("nPV_vs_occupancyByTracks/NoCollInRofStrict", "", kTH2D, {{125, 0., 8000 * k}, {100, 0., 25000 * k}}); histos.add("nPV_vs_occupancyByTracks/NoCollInRofStandard", "", kTH2D, {{125, 0., 8000 * k}, {100, 0., 25000 * k}}); histos.add("nPV_vs_occupancyByTracks/NoCollInTimeAndRofStandard", "", kTH2D, {{125, 0., 8000 * k}, {100, 0., 25000 * k}}); @@ -359,7 +361,6 @@ struct RofOccupancyQaTask { histos.add("nPV_vs_occupancyByFT0C/NoCollInTimeRangeNarrow", "", kTH2D, {{125, 0., 8000 * k}, {100, 0., 2.5e5 * k}}); histos.add("nPV_vs_occupancyByFT0C/NoCollInTimeRangeStrict", "", kTH2D, {{125, 0., 8000 * k}, {100, 0., 2.5e5 * k}}); histos.add("nPV_vs_occupancyByFT0C/NoCollInTimeRangeStandard", "", kTH2D, {{125, 0., 8000 * k}, {100, 0., 2.5e5 * k}}); - histos.add("nPV_vs_occupancyByFT0C/NoCollInTimeRangeVzDependent", "", kTH2D, {{125, 0., 8000 * k}, {100, 0., 2.5e5 * k}}); histos.add("nPV_vs_occupancyByFT0C/NoCollInRofStrict", "", kTH2D, {{125, 0., 8000 * k}, {100, 0., 2.5e5 * k}}); histos.add("nPV_vs_occupancyByFT0C/NoCollInRofStandard", "", kTH2D, {{125, 0., 8000 * k}, {100, 0., 2.5e5 * k}}); histos.add("nPV_vs_occupancyByFT0C/NoCollInTimeAndRofStandard", "", kTH2D, {{125, 0., 8000 * k}, {100, 0., 2.5e5 * k}}); @@ -419,7 +420,7 @@ struct RofOccupancyQaTask { std::vector vCollRofSubIdPerOrbit(cols.size(), 0); // rof sub-Id for each collision, per orbit // first loop over collisions - collecting info - for (auto& col : cols) { + for (const auto& col : cols) { int32_t colIndex = col.globalIndex(); // auto bc = col.bc_as(); const auto& bc = col.foundBC_as(); @@ -434,9 +435,9 @@ struct RofOccupancyQaTask { vCollVz[colIndex] = col.posZ(); vIsSel8[colIndex] = col.sel8(); - vCombCond[colIndex] = vIsSel8[colIndex] && (fabs(vCollVz[colIndex]) < 8) && (vAmpFT0CperColl[colIndex] > 500 /* a.u.*/); + vCombCond[colIndex] = vIsSel8[colIndex] && (std::fabs(vCollVz[colIndex]) < 8) && (vAmpFT0CperColl[colIndex] > 500 /* a.u.*/); - int bcInTF = col.bcInTF(); //(bc.globalBC() - bcSOR) % nBCsPerTF; + int bcInTF = (bc.globalBC() - bcSOR) % nBCsPerTF; vIsFullInfoForOccupancy[colIndex] = ((bcInTF - 300) * bcNS > -timeWinOccupancyCalcMinNS) && ((nBCsPerTF - 4000 - bcInTF) * bcNS > timeWinOccupancyCalcMaxNS) ? true : false; // int64_t rofId = (globalBC + 3564 - rofOffset) / rofLength; @@ -454,14 +455,14 @@ struct RofOccupancyQaTask { auto colPvTracks = pvTracks.sliceBy(perCollision, col.globalIndex()); - for (auto& track : colPvTracks) { + for (const auto& track : colPvTracks) { if (track.itsNCls() >= 5) { vTracksITS567perColl[colIndex]++; - if (fabs(track.eta()) < 0.8) + if (std::fabs(track.eta()) < 0.8) vTracksITS567eta08perColl[colIndex]++; if (track.tpcNClsFound() > 70) vTracksITSTPCperColl[colIndex]++; - if (fabs(col.posZ()) < 1) + if (std::fabs(col.posZ()) < 1) histos.fill(HIST("hEtaVz02"), track.eta()); else if (col.posZ() > 9.5 && col.posZ() < 10.5) histos.fill(HIST("hEtaVzPlus10"), track.eta()); @@ -491,7 +492,7 @@ struct RofOccupancyQaTask { // ROF-by-ROF study: int nColls = vCombCond.size(); - for (auto& col : cols) { + for (const auto& col : cols) { int32_t k = col.globalIndex(); if (k - 2 < 0 || k + 2 > nColls - 1) @@ -619,13 +620,13 @@ struct RofOccupancyQaTask { std::vector> vCollsInTimeWin; std::vector> vCollsInSameITSROF; std::vector> vTimeDeltaForColls; // delta time wrt a given collision - for (auto& col : cols) { + for (const auto& col : cols) { int32_t colIndex = col.globalIndex(); int64_t foundGlobalBC = vFoundGlobalBC[colIndex]; // int bcInTF = (foundGlobalBC - bcSOR) % nBCsPerTF; // int bcInITSROF = (foundGlobalBC + 3564 - rofOffset) % rofLength; - int64_t TFid = (foundGlobalBC - bcSOR) / nBCsPerTF; + int64_t tfId = (foundGlobalBC - bcSOR) / nBCsPerTF; int64_t rofId = (foundGlobalBC + 3564 - rofOffset) / rofLength; // int rofIdInTF = (bcInTF - rofOffset) / rofLength; @@ -637,7 +638,7 @@ struct RofOccupancyQaTask { int64_t thisBC = vFoundGlobalBC[minColIndex]; // check if this is still the same TF int64_t thisTFid = (thisBC - bcSOR) / nBCsPerTF; - if (thisTFid != TFid) + if (thisTFid != tfId) break; // int thisRofIdInTF = (thisBC - rofOffset) / rofLength; int64_t thisRofId = (thisBC + 3564 - rofOffset) / rofLength; @@ -653,7 +654,7 @@ struct RofOccupancyQaTask { while (maxColIndex < cols.size()) { int64_t thisBC = vFoundGlobalBC[maxColIndex]; int64_t thisTFid = (thisBC - bcSOR) / nBCsPerTF; - if (thisTFid != TFid) + if (thisTFid != tfId) break; // int thisRofIdInTF = (thisBC - rofOffset) / rofLength; int64_t thisRofId = (thisBC + 3564 - rofOffset) / rofLength; @@ -679,7 +680,7 @@ struct RofOccupancyQaTask { int64_t thisBC = vFoundGlobalBC[minColIndex]; // check if this is still the same TF int64_t thisTFid = (thisBC - bcSOR) / nBCsPerTF; - if (thisTFid != TFid) + if (thisTFid != tfId) break; float dt = (thisBC - foundGlobalBC) * bcNS; // ns // check if we are within the chosen time range @@ -694,7 +695,7 @@ struct RofOccupancyQaTask { while (maxColIndex < cols.size()) { int64_t thisBC = vFoundGlobalBC[maxColIndex]; int64_t thisTFid = (thisBC - bcSOR) / nBCsPerTF; - if (thisTFid != TFid) + if (thisTFid != tfId) break; float dt = (thisBC - foundGlobalBC) * bcNS; // ns if (dt > timeWinOccupancyCalcMaxNS) @@ -727,7 +728,7 @@ struct RofOccupancyQaTask { std::vector vNoCollInSameRofWithCloseVz(cols.size(), 0); // to veto events with nearby collisions with close vZ std::vector> vArrNoCollInSameRofWithCloseVz; //(cols.size(), 0); // to veto events with nearby collisions with close vZ - for (auto& col : cols) { + for (const auto& col : cols) { int32_t colIndex = col.globalIndex(); float vZ = col.posZ(); @@ -757,7 +758,7 @@ struct RofOccupancyQaTask { vInROFcollIndex[colIndex] = 0; vROFidThisColl[colIndex] = rofIdInTF; - if (fabs(vZ) < 10) + if (std::fabs(vZ) < 10) vNumCollinROFinVz10[colIndex] = 1; for (uint32_t iCol = 0; iCol < vAssocToSameROF.size(); iCol++) { int thisColIndex = vAssocToSameROF[iCol]; @@ -769,11 +770,11 @@ struct RofOccupancyQaTask { // LOGP(info, ">> assoc: bc={} bcInTF={} bcInITSROF={} rofId={} noROFborder={}", vFoundGlobalBC[thisColIndex], thisBcInTF, thisBcInITSROF, thisRofId, bcAssoc.selection_bit(kNoITSROFrameBorder)); // LOGP(info, ">> assoc: bcInTF={} bcInITSROF={} rofIdInTF={} noROFborder={} vZ={} mult={}", thisBcInTF, thisBcInITSROF, thisRofIdInTF, bcAssoc.selection_bit(kNoITSROFrameBorder), vCollVz[thisColIndex], vTracksITS567perColl[thisColIndex]); - // if (fabs(vTracksITS567perColl[thisColIndex]) > confNtracksCutVetoOnCollInROF) + // if (std::fabs(vTracksITS567perColl[thisColIndex]) > confNtracksCutVetoOnCollInROF) nITS567tracksForRofVetoStrict += vTracksITS567perColl[thisColIndex]; nSumAmplFT0CforRofVetoStrict += vAmpFT0CperColl[thisColIndex]; vNumCollinROF[colIndex]++; - if (fabs(vCollVz[thisColIndex]) < 10) + if (std::fabs(vCollVz[thisColIndex]) < 10) vNumCollinROFinVz10[colIndex]++; vInROFcollIndex[colIndex] = thisBcInITSROF > bcInITSROF ? 0 : 1; // if colIndex is for the first coll in ROF => inROFindex=0, otherwise =1 @@ -783,18 +784,18 @@ struct RofOccupancyQaTask { if (vAmpFT0CperColl[thisColIndex] > confFT0CamplCutVetoOnCollInROF) nCollsInRofWithFT0CAboveVetoStandard++; - if (fabs(vCollVz[thisColIndex] - vZ) < confEpsilonVzDiffVetoInROF) + if (std::fabs(vCollVz[thisColIndex] - vZ) < confEpsilonVzDiffVetoInROF) nITS567tracksForRofVetoOnCloseVz += vTracksITS567perColl[thisColIndex]; for (int i = 0; i < 200; i++) { - // if (fabs(vCollVz[thisColIndex] - vZ) < 0.05 * i && vTracksITS567perColl[thisColIndex] > 50) + // if (std::fabs(vCollVz[thisColIndex] - vZ) < 0.05 * i && vTracksITS567perColl[thisColIndex] > 50) // if (vTracksITS567perColl[colIndex]>100 && vTracksITS567perColl[colIndex]<1000 && if (vAmpFT0CperColl[colIndex] > 4000 && vAmpFT0CperColl[colIndex] < 15000 && - (vCollVz[thisColIndex] - vZ) > 0.05 * i && fabs(vCollVz[thisColIndex] - vZ) < (0.1 + 0.05) * i && vTracksITS567perColl[thisColIndex] > 20) // 0.05 * (i + 1)) - // fabs(vCollVz[thisColIndex] - vZ) < 0.05 * i && vTracksITS567perColl[thisColIndex] > 30) // 0.05 * (i + 1)) + (vCollVz[thisColIndex] - vZ) > 0.05 * i && std::fabs(vCollVz[thisColIndex] - vZ) < (0.1 + 0.05) * i && vTracksITS567perColl[thisColIndex] > 20) // 0.05 * (i + 1)) + // std::fabs(vCollVz[thisColIndex] - vZ) < 0.05 * i && vTracksITS567perColl[thisColIndex] > 30) // 0.05 * (i + 1)) nArrITS567tracksForRofVetoOnCloseVz[i]++; } - if (fabs(vZ) < 10) { + if (std::fabs(vZ) < 10) { histos.fill(HIST("hDeltaVz"), vCollVz[thisColIndex] - vZ); if (vTracksITS567perColl[colIndex] >= 100 && vTracksITS567perColl[thisColIndex] < 100) histos.fill(HIST("hDeltaVzGivenCollAbove100NearbyBelow100"), vCollVz[thisColIndex] - vZ); @@ -843,13 +844,13 @@ struct RofOccupancyQaTask { if (vTracksITS567perColl[colIndex] > 50 && vTracksITS567perColl[thisColIndex] > 50) histos.fill(HIST("hDeltaTimeAboveNtracksCut"), dt); - if (fabs(vCollVz[colIndex]) < 10 && fabs(vCollVz[thisColIndex]) < 10) + if (std::fabs(vCollVz[colIndex]) < 10 && std::fabs(vCollVz[thisColIndex]) < 10) histos.fill(HIST("hDeltaTime_vZ10cm"), dt); if (vIsSel8[colIndex] && vIsSel8[thisColIndex]) histos.fill(HIST("hDeltaTime_sel8"), dt); - if (fabs(vCollVz[colIndex]) < 10 && vIsSel8[colIndex] && fabs(vCollVz[thisColIndex]) < 10 && vIsSel8[thisColIndex]) { + if (std::fabs(vCollVz[colIndex]) < 10 && vIsSel8[colIndex] && std::fabs(vCollVz[thisColIndex]) < 10 && vIsSel8[thisColIndex]) { histos.fill(HIST("hDeltaTime_sel8_vZ10cm"), dt); if (vTracksITS567perColl[colIndex] > 50 && vTracksITS567perColl[thisColIndex] > 50) histos.fill(HIST("hDeltaTimeAboveNtracksCut_sel8_vZ10cm"), dt); @@ -876,48 +877,48 @@ struct RofOccupancyQaTask { sumAmpFT0CInFullTimeWindow += wOccup * vAmpFT0CperColl[thisColIndex]; // counting tracks from other collisions in fixed time windows - if (fabs(dt) < confTimeRangeVetoOnCollNarrow) + if (std::fabs(dt) < confTimeRangeVetoOnCollNarrow) nITS567tracksForVetoNarrow += vTracksITS567perColl[thisColIndex]; - if (fabs(dt) < confTimeRangeVetoOnCollStandard) + if (std::fabs(dt) < confTimeRangeVetoOnCollStandard) nITS567tracksForVetoStrict += vTracksITS567perColl[thisColIndex]; - // if (fabs(dt) < confTimeRangeVetoOnCollStandard + 0.5) { // add 0.5 us safety margin + // if (std::fabs(dt) < confTimeRangeVetoOnCollStandard + 0.5) { // add 0.5 us safety margin // standard cut on other collisions vs delta-times - const float driftV = 2.5; // drift velocity in cm/us, TPC drift_length / drift_time = 250 cm / 100 us - if (fabs(dt) < 2.0) { // us, complete veto on other collisions + const float driftV = 2.5; // drift velocity in cm/us, TPC drift_length / drift_time = 250 cm / 100 us + if (std::fabs(dt) < 2.0) { // us, complete veto on other collisions nITS567tracksForVetoStandard += vTracksITS567perColl[thisColIndex]; } else if (dt > -4.0 && dt <= -2.0) { // us, strict veto to suppress fake ITS-TPC matches more if (vTracksITS567perColl[thisColIndex] > confNtracksCutVetoOnCollInTimeRange / 5) nITS567tracksForVetoStandard += vTracksITS567perColl[thisColIndex]; - } else if (fabs(dt) < 8 + fabs(vZ) / driftV) { // loose veto, 8 us corresponds to maximum possible |vZ|, which is ~20 cm + } else if (std::fabs(dt) < 8 + std::fabs(vZ) / driftV) { // loose veto, 8 us corresponds to maximum possible |vZ|, which is ~20 cm // counting number of other collisions with mult above threshold if (vTracksITS567perColl[thisColIndex] > confNtracksCutVetoOnCollInTimeRange) nITS567tracksForVetoStandard += vTracksITS567perColl[thisColIndex]; } // vZ-dependent time cut to avoid collinear tracks from other collisions (experimental) - if (fabs(dt) < 8 + fabs(vZ) / driftV) { + if (std::fabs(dt) < 8 + std::fabs(vZ) / driftV) { if (dt < 0) { // check distance between given vZ and (moving in two directions) vZ of drifting tracks from past collisions - if ((fabs(vCollVz[thisColIndex] - fabs(dt) * driftV - vZ) < confEpsilonDistanceForVzDependentVetoTPC) || - (fabs(vCollVz[thisColIndex] + fabs(dt) * driftV - vZ) < confEpsilonDistanceForVzDependentVetoTPC)) + if ((std::fabs(vCollVz[thisColIndex] - std::fabs(dt) * driftV - vZ) < confEpsilonDistanceForVzDependentVetoTPC) || + (std::fabs(vCollVz[thisColIndex] + std::fabs(dt) * driftV - vZ) < confEpsilonDistanceForVzDependentVetoTPC)) nITS567tracksForVetoVzDependent += vTracksITS567perColl[thisColIndex]; // FOR QA: - if (fabs(vCollVz[thisColIndex] - fabs(dt) * driftV - vZ) < confEpsilonDistanceForVzDependentVetoTPC) - histos.fill(HIST("hDeltaVzVsDeltaTime1"), vCollVz[thisColIndex] - fabs(dt) * driftV - vZ, dt); - if (fabs(vCollVz[thisColIndex] + fabs(dt) * driftV - vZ) < confEpsilonDistanceForVzDependentVetoTPC) - histos.fill(HIST("hDeltaVzVsDeltaTime2"), vCollVz[thisColIndex] + fabs(dt) * driftV - vZ, dt); + if (std::fabs(vCollVz[thisColIndex] - std::fabs(dt) * driftV - vZ) < confEpsilonDistanceForVzDependentVetoTPC) + histos.fill(HIST("hDeltaVzVsDeltaTime1"), vCollVz[thisColIndex] - std::fabs(dt) * driftV - vZ, dt); + if (std::fabs(vCollVz[thisColIndex] + std::fabs(dt) * driftV - vZ) < confEpsilonDistanceForVzDependentVetoTPC) + histos.fill(HIST("hDeltaVzVsDeltaTime2"), vCollVz[thisColIndex] + std::fabs(dt) * driftV - vZ, dt); } else { // dt>0 // check distance between drifted vZ of given collision (in two directions) and vZ of future collisions - if ((fabs(vZ - dt * driftV - vCollVz[thisColIndex]) < confEpsilonDistanceForVzDependentVetoTPC) || - (fabs(vZ + dt * driftV - vCollVz[thisColIndex]) < confEpsilonDistanceForVzDependentVetoTPC)) + if ((std::fabs(vZ - dt * driftV - vCollVz[thisColIndex]) < confEpsilonDistanceForVzDependentVetoTPC) || + (std::fabs(vZ + dt * driftV - vCollVz[thisColIndex]) < confEpsilonDistanceForVzDependentVetoTPC)) nITS567tracksForVetoVzDependent += vTracksITS567perColl[thisColIndex]; // FOR QA: - if (fabs(vZ - dt * driftV - vCollVz[thisColIndex]) < confEpsilonDistanceForVzDependentVetoTPC) + if (std::fabs(vZ - dt * driftV - vCollVz[thisColIndex]) < confEpsilonDistanceForVzDependentVetoTPC) histos.fill(HIST("hDeltaVzVsDeltaTime3"), vZ - dt * driftV - vCollVz[thisColIndex], dt); - if (fabs(vZ + dt * driftV - vCollVz[thisColIndex]) < confEpsilonDistanceForVzDependentVetoTPC) + if (std::fabs(vZ + dt * driftV - vCollVz[thisColIndex]) < confEpsilonDistanceForVzDependentVetoTPC) histos.fill(HIST("hDeltaVzVsDeltaTime4"), vZ + dt * driftV - vCollVz[thisColIndex], dt); } } @@ -935,7 +936,7 @@ struct RofOccupancyQaTask { vArrNoCollInSameRofWithCloseVz.push_back(vVzCutThisColl); } - for (auto& col : cols) { + for (const auto& col : cols) { int32_t colIndex = col.globalIndex(); bool sel8 = col.sel8(); // bc.selection_bit(kIsTriggerTVX) && bc.selection_bit(kNoTimeFrameBorder) && bc.selection_bit(kNoITSROFrameBorder); @@ -954,7 +955,7 @@ struct RofOccupancyQaTask { float ft0C = vAmpFT0CperColl[colIndex]; // ROF-by-ROF - if (fabs(vZ) < 8) { + if (std::fabs(vZ) < 8) { histos.fill(HIST("ROFbyROF/nPV_vs_ROFid"), nPV, vCollRofIdPerOrbit[colIndex]); histos.fill(HIST("ROFbyROF/nPV_vs_subROFid"), nPV, vCollRofSubIdPerOrbit[colIndex]); @@ -962,7 +963,7 @@ struct RofOccupancyQaTask { histos.fill(HIST("ROFbyROF/FT0C_vs_subROFid"), ft0C, vCollRofSubIdPerOrbit[colIndex]); } // vs occupancy - if (occTracks >= 0 && fabs(vZ) < 8) { + if (occTracks >= 0 && std::fabs(vZ) < 8) { histos.fill(HIST("nPV_vs_occupancyByTracks/sel8"), nPV, occTracks); if (col.selection_bit(kNoCollInTimeRangeNarrow)) histos.fill(HIST("nPV_vs_occupancyByTracks/NoCollInTimeRangeNarrow"), nPV, occTracks); @@ -970,8 +971,6 @@ struct RofOccupancyQaTask { histos.fill(HIST("nPV_vs_occupancyByTracks/NoCollInTimeRangeStrict"), nPV, occTracks); if (col.selection_bit(kNoCollInTimeRangeStandard)) histos.fill(HIST("nPV_vs_occupancyByTracks/NoCollInTimeRangeStandard"), nPV, occTracks); - if (col.selection_bit(kNoCollInTimeRangeVzDependent)) - histos.fill(HIST("nPV_vs_occupancyByTracks/NoCollInTimeRangeVzDependent"), nPV, occTracks); if (col.selection_bit(kNoCollInRofStrict)) histos.fill(HIST("nPV_vs_occupancyByTracks/NoCollInRofStrict"), nPV, occTracks); if (col.selection_bit(kNoCollInRofStandard)) @@ -980,14 +979,14 @@ struct RofOccupancyQaTask { histos.fill(HIST("nPV_vs_occupancyByTracks/NoCollInTimeAndRofStandard"), nPV, occTracks); if (col.selection_bit(kNoCollInTimeRangeStrict) && col.selection_bit(kNoCollInRofStrict)) histos.fill(HIST("nPV_vs_occupancyByTracks/NoCollInTimeAndRofStrict"), nPV, occTracks); - if (col.selection_bit(kNoCollInTimeRangeStrict) && col.selection_bit(kNoCollInRofStrict) && fabs(vZ) < 5) + if (col.selection_bit(kNoCollInTimeRangeStrict) && col.selection_bit(kNoCollInRofStrict) && std::fabs(vZ) < 5) histos.fill(HIST("nPV_vs_occupancyByTracks/NoCollInTimeAndRofStrict_vZ_5cm"), nPV, occTracks); if (col.selection_bit(kNoHighMultCollInPrevRof)) histos.fill(HIST("nPV_vs_occupancyByTracks/kNoHighMultCollInPrevRof"), nPV, occTracks); if (col.selection_bit(kNoHighMultCollInPrevRof) && col.selection_bit(kNoCollInRofStrict)) histos.fill(HIST("nPV_vs_occupancyByTracks/kNoHighMultCollInPrevRofAndRofStrict"), nPV, occTracks); } - if (occFT0C >= 0 && fabs(vZ) < 8) { + if (occFT0C >= 0 && std::fabs(vZ) < 8) { histos.fill(HIST("nPV_vs_occupancyByFT0C/sel8"), nPV, occFT0C); if (col.selection_bit(kNoCollInTimeRangeNarrow)) histos.fill(HIST("nPV_vs_occupancyByFT0C/NoCollInTimeRangeNarrow"), nPV, occFT0C); @@ -995,8 +994,6 @@ struct RofOccupancyQaTask { histos.fill(HIST("nPV_vs_occupancyByFT0C/NoCollInTimeRangeStrict"), nPV, occFT0C); if (col.selection_bit(kNoCollInTimeRangeStandard)) histos.fill(HIST("nPV_vs_occupancyByFT0C/NoCollInTimeRangeStandard"), nPV, occFT0C); - if (col.selection_bit(kNoCollInTimeRangeVzDependent)) - histos.fill(HIST("nPV_vs_occupancyByFT0C/NoCollInTimeRangeVzDependent"), nPV, occFT0C); if (col.selection_bit(kNoCollInRofStrict)) histos.fill(HIST("nPV_vs_occupancyByFT0C/NoCollInRofStrict"), nPV, occFT0C); if (col.selection_bit(kNoCollInRofStandard)) @@ -1005,7 +1002,7 @@ struct RofOccupancyQaTask { histos.fill(HIST("nPV_vs_occupancyByFT0C/NoCollInTimeAndRofStandard"), nPV, occFT0C); if (col.selection_bit(kNoCollInTimeRangeStrict) && col.selection_bit(kNoCollInRofStrict)) histos.fill(HIST("nPV_vs_occupancyByFT0C/NoCollInTimeAndRofStrict"), nPV, occFT0C); - if (col.selection_bit(kNoCollInTimeRangeStrict) && col.selection_bit(kNoCollInRofStrict) && fabs(vZ) < 5) + if (col.selection_bit(kNoCollInTimeRangeStrict) && col.selection_bit(kNoCollInRofStrict) && std::fabs(vZ) < 5) histos.fill(HIST("nPV_vs_occupancyByFT0C/NoCollInTimeAndRofStrict_vZ_5cm"), nPV, occFT0C); if (col.selection_bit(kNoHighMultCollInPrevRof)) histos.fill(HIST("nPV_vs_occupancyByFT0C/kNoHighMultCollInPrevRof"), nPV, occFT0C); @@ -1028,7 +1025,7 @@ struct RofOccupancyQaTask { histos.fill(HIST("hThisEvITSTr_vs_ThisEvFT0C/all"), vAmpFT0CperColl[colIndex], vTracksITS567perColl[colIndex]); histos.fill(HIST("hThisEvITSTPCTr_vs_ThisEvITStr/all"), vTracksITS567perColl[colIndex], vTracksITSTPCperColl[colIndex]); - if (sel8 && fabs(col.posZ()) < 8) { + if (sel8 && std::fabs(col.posZ()) < 8) { histos.fill(HIST("hOccupancyByFT0C_vs_ByTracks_vZ_TF_ROF_border_cuts"), vNumTracksITS567inFullTimeWin[colIndex], vSumAmpFT0CinFullTimeWin[colIndex]); // if (vAmpFT0CperColl[colIndex] > 5000 && vAmpFT0CperColl[colIndex] < 10000) { @@ -1157,8 +1154,6 @@ struct RofOccupancyQaTask { histos.fill(HIST("hThisEvITSTr_vs_ThisEvFT0C/CROSSCHECK_afterStrictDeltaTimeCut"), vAmpFT0CperColl[colIndex], vTracksITS567perColl[colIndex]); if (col.selection_bit(kNoCollInTimeRangeStandard)) histos.fill(HIST("hThisEvITSTr_vs_ThisEvFT0C/CROSSCHECK_afterStandardDeltaTimeCut"), vAmpFT0CperColl[colIndex], vTracksITS567perColl[colIndex]); - if (col.selection_bit(kNoCollInTimeRangeVzDependent)) - histos.fill(HIST("hThisEvITSTr_vs_ThisEvFT0C/CROSSCHECK_afterVzDependentDeltaTimeCut"), vAmpFT0CperColl[colIndex], vTracksITS567perColl[colIndex]); if (col.selection_bit(kNoCollInRofStrict)) histos.fill(HIST("hThisEvITSTr_vs_ThisEvFT0C/CROSSCHECK_kNoCollInRofStrict"), vAmpFT0CperColl[colIndex], vTracksITS567perColl[colIndex]); @@ -1216,7 +1211,7 @@ struct RofOccupancyQaTask { if (vNoCollInTimeRangeNarrow[colIndex]) { for (int i = 0; i < 200; i++) { - if (fabs(col.posZ()) < 8 && !vArrNoCollInSameRofWithCloseVz[colIndex][i]) { + if (std::fabs(col.posZ()) < 8 && !vArrNoCollInSameRofWithCloseVz[colIndex][i]) { histos.fill(HIST("hThisEvITStr_vs_vZcut"), 0.025 + 0.05 * i, vTracksITS567perColl[colIndex]); histos.fill(HIST("hThisEvITSTPCtr_vs_vZcut"), 0.025 + 0.05 * i, vTracksITSTPCperColl[colIndex]); } From 84d08f3103d03503f2ec0d36eac60b62d53c9ff1 Mon Sep 17 00:00:00 2001 From: GijsvWeelden <55794847+GijsvWeelden@users.noreply.github.com> Date: Thu, 20 Feb 2025 11:18:52 +0100 Subject: [PATCH 0334/1650] [PWGJE] V0 QA & Jet Fragmentation (#10069) --- PWGJE/Tasks/jetFragmentation.cxx | 1402 ++++++++++++++---------------- PWGJE/Tasks/v0QA.cxx | 116 +-- 2 files changed, 700 insertions(+), 818 deletions(-) diff --git a/PWGJE/Tasks/jetFragmentation.cxx b/PWGJE/Tasks/jetFragmentation.cxx index c1ff81fcf88..f449a0b26de 100644 --- a/PWGJE/Tasks/jetFragmentation.cxx +++ b/PWGJE/Tasks/jetFragmentation.cxx @@ -9,11 +9,12 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +/// \file jetFragmentation.cxx /// \brief Task for jet fragmentation into V0s -// +/// /// \author Gijs van Weelden -// +#include #include #include "TH1F.h" #include "TTree.h" @@ -33,6 +34,7 @@ #include "PWGJE/Core/JetFinder.h" #include "PWGJE/Core/JetUtilities.h" #include "PWGJE/Core/JetFindingUtilities.h" +#include "PWGLF/DataModel/V0SelectorTables.h" using namespace o2; using namespace o2::framework; @@ -58,6 +60,9 @@ using MCDV0JetsWithConstituents = soa::Join; using MatchedMCDV0JetsWithConstituents = soa::Join; +using CandidatesV0DataWithFlags = soa::Join; +using CandidatesV0MCDWithLabels = soa::Join; + using MCPV0Jets = aod::V0ChargedMCParticleLevelJets; using MCPV0JetsWithConstituents = soa::Join; using MatchedMCPV0Jets = soa::Join; @@ -91,7 +96,7 @@ struct JetFragmentation { // Binning ConfigurableAxis binJetPt{"binJetPt", {40, 0.f, 200.f}, ""}; ConfigurableAxis binEta{"binEta", {20, -1.f, 1.f}, ""}; - ConfigurableAxis binPhi{"binPhi", {18 * 8, 0.f, 2. * TMath::Pi()}, ""}; + ConfigurableAxis binPhi{"binPhi", {18 * 8, 0.f, constants::math::TwoPI}, ""}; ConfigurableAxis binZ{"binZ", {40, 0.0001f, 1.0001f}, ""}; ConfigurableAxis binXi{"binXi", {50, 0.f, 10.f}, ""}; ConfigurableAxis binTheta{"binTheta", {40, -0.05f, 0.395f}, ""}; @@ -120,7 +125,7 @@ struct JetFragmentation { ConfigurableAxis binV0Pt{"binV0Pt", {120, 0.0f, 60.0f}, ""}; ConfigurableAxis binV0Eta{"binV0Eta", {20, -1.f, 1.f}, ""}; - ConfigurableAxis binV0Phi{"binV0Phi", {18 * 8, 0.f, 2. * TMath::Pi()}, ""}; + ConfigurableAxis binV0Phi{"binV0Phi", {18 * 8, 0.f, constants::math::TwoPI}, ""}; ConfigurableAxis binV0Ctau{"binV0Ctau", {200, 0.0f, 40.0f}, ""}; ConfigurableAxis binV0Radius{"binV0Radius", {100, 0.0f, 100.0f}, ""}; ConfigurableAxis binV0CosPA{"binV0CosPA", {100, 0.95f, 1.0f}, ""}; @@ -154,12 +159,12 @@ struct JetFragmentation { Partition detJetEtaPartition = (aod::jet::eta > matchedDetJetEtaMin) && (aod::jet::eta < matchedDetJetEtaMax); Partition detJetEtaV0Partition = (aod::jet::eta > v0EtaMin + aod::jet::r * 0.01f) && (aod::jet::eta < v0EtaMax - aod::jet::r * 0.01f); - Preslice TracksPerCollision = aod::track::collisionId; - Preslice V0sPerCollision = aod::v0data::collisionId; - Preslice> McV0sPerCollision = aod::v0data::collisionId; - Preslice PartJetsPerCollision = aod::jet::mcCollisionId; - Preslice JetParticlesPerCollision = aod::jmcparticle::mcCollisionId; - Preslice ParticlesPerCollision = aod::mcparticle::mcCollisionId; + Preslice tracksPerCollision = aod::track::collisionId; + Preslice> v0sPerCollision = aod::v0data::collisionId; + Preslice> mcV0sPerCollision = aod::v0data::collisionId; + Preslice partJetsPerCollision = aod::jet::mcCollisionId; + Preslice jetParticlesPerCollision = aod::jmcparticle::mcCollisionId; + Preslice particlesPerCollision = aod::mcparticle::mcCollisionId; std::vector eventSelectionBits; @@ -205,38 +210,38 @@ struct JetFragmentation { AxisSpec ptTrackRelDiffAxis = {binPtRelDiff, "(#it{p}_{T}^{track, det} - #it{p}_{T}^{track, part})/#it{p}_{T, track}^{part}"}; AxisSpec zRelDiffAxis = {binZRelDiff, "(#it{p}_{T}^{jet, det} - #it{p}_{T}^{jet, part})/#it{p}_{T, jet}^{part}"}; - AxisSpec V0PtAxis = {binV0Pt, "#it{p}_{T}^{V0}"}; - AxisSpec V0PtRatioAxis = {binPtRatio, "#it{p}_{T}^{V0, det}/#it{p}_{T, V0}^{part}"}; - AxisSpec V0PtRelDiffAxis = {binPtRelDiff, "(#it{p}_{T}^{V0, det} - #it{p}_{T}^{V0, part})/#it{p}_{T, V0}^{part}"}; - AxisSpec V0EtaAxis = {binV0Eta, "#eta^{V0}"}; - AxisSpec V0PhiAxis = {binV0Phi, "#varphi^{V0}"}; - AxisSpec V0detPtAxis = {binV0Pt, "#it{p}_{T}^{V0, det}"}; - AxisSpec V0partPtAxis = {binV0Pt, "#it{p}_{T}^{V0, part}"}; - AxisSpec V0CtauAxis = {binV0Ctau, "c#tau (cm)"}; - AxisSpec V0RadiusAxis = {binV0Radius, "R (cm)"}; - AxisSpec V0CosPAAxis = {binV0CosPA, "cos(PA)"}; - AxisSpec V0DCApAxis = {binV0DCAp, "DCA pos (cm)"}; - AxisSpec V0DCAnAxis = {binV0DCAn, "DCA neg (cm)"}; - AxisSpec V0DCAdAxis = {binV0DCAd, "DCA daughters (cm^{2})"}; - - AxisSpec K0SMassAxis = {binK0SMass, "Inv. mass (GeV/#it{c}^{2})"}; - AxisSpec K0SWideAxis = {binK0SMassWide, "Inv. mass (GeV/#it{c}^{2})"}; - AxisSpec LambdaMassAxis = {binLambdaMass, "Inv. mass (GeV/#it{c}^{2})"}; - AxisSpec LambdaMassDiffAxis = {binLambdaMassDiff, "M(#Lambda) - M(#bar{#Lambda})"}; - AxisSpec LambdaMassRatioAxis = {binLambdaMassRatio, "M(#bar{#Lambda}) / M(#Lambda)"}; - AxisSpec LambdaMassRelDiffAxis = {binLambdaMassRelDiff, "(M(#Lambda) - M(#bar{#Lambda})) / M(#Lambda)"}; + AxisSpec v0PtAxis = {binV0Pt, "#it{p}_{T}^{V0}"}; + AxisSpec v0PtRatioAxis = {binPtRatio, "#it{p}_{T}^{V0, det}/#it{p}_{T, V0}^{part}"}; + AxisSpec v0PtRelDiffAxis = {binPtRelDiff, "(#it{p}_{T}^{V0, det} - #it{p}_{T}^{V0, part})/#it{p}_{T, V0}^{part}"}; + AxisSpec v0EtaAxis = {binV0Eta, "#eta^{V0}"}; + AxisSpec v0PhiAxis = {binV0Phi, "#varphi^{V0}"}; + AxisSpec v0detPtAxis = {binV0Pt, "#it{p}_{T}^{V0, det}"}; + AxisSpec v0partPtAxis = {binV0Pt, "#it{p}_{T}^{V0, part}"}; + AxisSpec v0CtauAxis = {binV0Ctau, "c#tau (cm)"}; + AxisSpec v0RadiusAxis = {binV0Radius, "R (cm)"}; + AxisSpec v0CosPAAxis = {binV0CosPA, "cos(PA)"}; + AxisSpec v0DCApAxis = {binV0DCAp, "DCA pos (cm)"}; + AxisSpec v0DCAnAxis = {binV0DCAn, "DCA neg (cm)"}; + AxisSpec v0DCAdAxis = {binV0DCAd, "DCA daughters (cm^{2})"}; + + AxisSpec k0SMassAxis = {binK0SMass, "Inv. mass (GeV/#it{c}^{2})"}; + AxisSpec k0SWideAxis = {binK0SMassWide, "Inv. mass (GeV/#it{c}^{2})"}; + AxisSpec lambdaMassAxis = {binLambdaMass, "Inv. mass (GeV/#it{c}^{2})"}; + AxisSpec lambdaMassDiffAxis = {binLambdaMassDiff, "M(#Lambda) - M(#bar{#Lambda})"}; + AxisSpec lambdaMassRatioAxis = {binLambdaMassRatio, "M(#bar{#Lambda}) / M(#Lambda)"}; + AxisSpec lambdaMassRelDiffAxis = {binLambdaMassRelDiff, "(M(#Lambda) - M(#bar{#Lambda})) / M(#Lambda)"}; // Cut variation study - AxisSpec RcutAxis = {binV0RadiusCut, "R"}; + AxisSpec rCutAxis = {binV0RadiusCut, "R"}; AxisSpec ctauCutAxis = {binV0CtauCut, "c#tau (K0S)"}; AxisSpec cosPACutAxis = {binV0CosPACut, "cosPA"}; - AxisSpec DCApCutAxis = {binV0DCApCut, "DCA pos (cm)"}; - AxisSpec DCAnCutAxis = {binV0DCAnCut, "DCA neg (cm)"}; - AxisSpec DCAdCutAxis = {binV0DCAdCut, "DCA daughters (cm^{2})"}; - AxisSpec PtCutAxis = {binV0PtCut, "p_{T, V0}"}; - AxisSpec K0SMassCutAxis = {binK0SMassCut, "Inv. mass (GeV/#it{c}^{2})"}; - AxisSpec LambdaMassCutAxis = {binLambda0MassCut, "Inv. mass (GeV/#it{c}^{2})"}; - AxisSpec AntiLambdaMassCutAxis = {binAntiLambda0MassCut, "Inv. mass (GeV/#it{c}^{2})"}; + AxisSpec dcapCutAxis = {binV0DCApCut, "DCA pos (cm)"}; + AxisSpec dcanCutAxis = {binV0DCAnCut, "DCA neg (cm)"}; + AxisSpec dcadCutAxis = {binV0DCAdCut, "DCA daughters (cm^{2})"}; + AxisSpec ptCutAxis = {binV0PtCut, "p_{T, V0}"}; + AxisSpec k0SMassCutAxis = {binK0SMassCut, "Inv. mass (GeV/#it{c}^{2})"}; + AxisSpec lambdaMassCutAxis = {binLambda0MassCut, "Inv. mass (GeV/#it{c}^{2})"}; + AxisSpec antiLambdaMassCutAxis = {binAntiLambda0MassCut, "Inv. mass (GeV/#it{c}^{2})"}; if (doprocessDataRun3) { registry.add("data/nJetsnTracks", "nJetsnTracks; nJets; nTracks", HistType::kTH2D, {jetCount, trackCount}); @@ -264,37 +269,37 @@ struct JetFragmentation { registry.get(HIST("data/V0/nV0sEventWeighted"))->Sumw2(); // Unidentified - registry.add("data/V0/V0PtEtaPhi", "V0PtEtaPhi", HistType::kTH3D, {V0PtAxis, V0EtaAxis, V0PhiAxis}); - registry.add("data/V0/V0PtCtau", "V0PtCtau", HistType::kTHnSparseD, {V0PtAxis, V0CtauAxis, V0CtauAxis, V0CtauAxis}); - registry.add("data/V0/V0PtMass", "V0PtMass", HistType::kTHnSparseD, {V0PtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("data/V0/V0PtMassWide", "V0PtMassWide", HistType::kTHnSparseD, {V0PtAxis, K0SWideAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("data/V0/V0PtLambdaMasses", "V0PtLambdaMasses", HistType::kTHnSparseD, {V0PtAxis, LambdaMassDiffAxis, LambdaMassRatioAxis, LambdaMassRelDiffAxis}); - registry.add("data/V0/V0PtRadiusCosPA", "V0PtRadiusCosPA", HistType::kTH3D, {V0PtAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("data/V0/V0PtDCAposneg", "V0PtDCAposneg", HistType::kTH3D, {V0PtAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("data/V0/V0PtDCAd", "V0PtDCAd", HistType::kTH2D, {V0PtAxis, V0DCAdAxis}); + registry.add("data/V0/V0PtEtaPhi", "V0PtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); + registry.add("data/V0/V0PtCtau", "V0PtCtau", HistType::kTHnSparseD, {v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); + registry.add("data/V0/V0PtMass", "V0PtMass", HistType::kTHnSparseD, {v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("data/V0/V0PtMassWide", "V0PtMassWide", HistType::kTHnSparseD, {v0PtAxis, k0SWideAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("data/V0/V0PtLambdaMasses", "V0PtLambdaMasses", HistType::kTHnSparseD, {v0PtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); + registry.add("data/V0/V0PtRadiusCosPA", "V0PtRadiusCosPA", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("data/V0/V0PtDCAposneg", "V0PtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("data/V0/V0PtDCAd", "V0PtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}); // Identified - registry.add("data/V0/K0SPtEtaPhi", "K0SPtEtaPhi", HistType::kTH3D, {V0PtAxis, V0EtaAxis, V0PhiAxis}); - registry.add("data/V0/K0SPtCtauMass", "K0SPtCtauMass", HistType::kTH3D, {V0partPtAxis, V0CtauAxis, K0SMassAxis}); - registry.add("data/V0/K0SPtRadiusCosPA", "K0SPtRadiusCosPA", HistType::kTH3D, {V0partPtAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("data/V0/K0SPtDCAposneg", "K0SPtDCAposneg", HistType::kTH3D, {V0partPtAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("data/V0/K0SPtDCAd", "K0SPtDCAd", HistType::kTH2D, {V0partPtAxis, V0DCAdAxis}); - - registry.add("data/V0/LambdaPtEtaPhi", "LambdaPtEtaPhi", HistType::kTH3D, {V0PtAxis, V0EtaAxis, V0PhiAxis}); - registry.add("data/V0/LambdaPtCtauMass", "LambdaPtCtauMass", HistType::kTH3D, {V0partPtAxis, V0CtauAxis, LambdaMassAxis}); - registry.add("data/V0/LambdaPtLambdaMasses", "LambdaPtLambdaMasses", HistType::kTHnSparseD, {V0PtAxis, LambdaMassDiffAxis, LambdaMassRatioAxis, LambdaMassRelDiffAxis}); - registry.add("data/V0/LambdaPtRadiusCosPA", "LambdaPtRadiusCosPA", HistType::kTH3D, {V0partPtAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("data/V0/LambdaPtDCAposneg", "LambdaPtDCAposneg", HistType::kTH3D, {V0partPtAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("data/V0/LambdaPtDCAd", "LambdaPtDCAd", HistType::kTH2D, {V0partPtAxis, V0DCAdAxis}); - - registry.add("data/V0/antiLambdaPtEtaPhi", "antiLambdaPtEtaPhi", HistType::kTH3D, {V0PtAxis, V0EtaAxis, V0PhiAxis}); - registry.add("data/V0/antiLambdaPtCtauMass", "antiLambdaPtCtauMass", HistType::kTH3D, {V0partPtAxis, V0CtauAxis, LambdaMassAxis}); - registry.add("data/V0/antiLambdaPtLambdaMasses", "antiLambdaPtLambdaMasses", HistType::kTHnSparseD, {V0PtAxis, LambdaMassDiffAxis, LambdaMassRatioAxis, LambdaMassRelDiffAxis}); - registry.add("data/V0/antiLambdaPtRadiusCosPA", "antiLambdaPtRadiusCosPA", HistType::kTH3D, {V0partPtAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("data/V0/antiLambdaPtDCAposneg", "antiLambdaPtDCAposneg", HistType::kTH3D, {V0partPtAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("data/V0/antiLambdaPtDCAd", "antiLambdaPtDCAd", HistType::kTH2D, {V0partPtAxis, V0DCAdAxis}); - - registry.add("data/V0/V0CutVariation", "V0CutVariation", HistType::kTHnSparseD, {PtCutAxis, K0SMassCutAxis, LambdaMassCutAxis, AntiLambdaMassCutAxis, RcutAxis, ctauCutAxis, cosPACutAxis, DCApCutAxis, DCAnCutAxis, DCAdCutAxis}); + registry.add("data/V0/K0SPtEtaPhi", "K0SPtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); + registry.add("data/V0/K0SPtCtauMass", "K0SPtCtauMass", HistType::kTH3D, {v0partPtAxis, v0CtauAxis, k0SMassAxis}); + registry.add("data/V0/K0SPtRadiusCosPA", "K0SPtRadiusCosPA", HistType::kTH3D, {v0partPtAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("data/V0/K0SPtDCAposneg", "K0SPtDCAposneg", HistType::kTH3D, {v0partPtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("data/V0/K0SPtDCAd", "K0SPtDCAd", HistType::kTH2D, {v0partPtAxis, v0DCAdAxis}); + + registry.add("data/V0/LambdaPtEtaPhi", "LambdaPtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); + registry.add("data/V0/LambdaPtCtauMass", "LambdaPtCtauMass", HistType::kTH3D, {v0partPtAxis, v0CtauAxis, lambdaMassAxis}); + registry.add("data/V0/LambdaPtLambdaMasses", "LambdaPtLambdaMasses", HistType::kTHnSparseD, {v0PtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); + registry.add("data/V0/LambdaPtRadiusCosPA", "LambdaPtRadiusCosPA", HistType::kTH3D, {v0partPtAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("data/V0/LambdaPtDCAposneg", "LambdaPtDCAposneg", HistType::kTH3D, {v0partPtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("data/V0/LambdaPtDCAd", "LambdaPtDCAd", HistType::kTH2D, {v0partPtAxis, v0DCAdAxis}); + + registry.add("data/V0/antiLambdaPtEtaPhi", "antiLambdaPtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); + registry.add("data/V0/antiLambdaPtCtauMass", "antiLambdaPtCtauMass", HistType::kTH3D, {v0partPtAxis, v0CtauAxis, lambdaMassAxis}); + registry.add("data/V0/antiLambdaPtLambdaMasses", "antiLambdaPtLambdaMasses", HistType::kTHnSparseD, {v0PtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); + registry.add("data/V0/antiLambdaPtRadiusCosPA", "antiLambdaPtRadiusCosPA", HistType::kTH3D, {v0partPtAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("data/V0/antiLambdaPtDCAposneg", "antiLambdaPtDCAposneg", HistType::kTH3D, {v0partPtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("data/V0/antiLambdaPtDCAd", "antiLambdaPtDCAd", HistType::kTH2D, {v0partPtAxis, v0DCAdAxis}); + + registry.add("data/V0/V0CutVariation", "V0CutVariation", HistType::kTHnSparseD, {ptCutAxis, k0SMassCutAxis, lambdaMassCutAxis, antiLambdaMassCutAxis, rCutAxis, ctauCutAxis, cosPACutAxis, dcapCutAxis, dcanCutAxis, dcadCutAxis}); } // doprocessDataV0 || doprocessDataV0Frag || doprocessDataV0JetsFrag if (doprocessDataV0Frag) { @@ -307,78 +312,78 @@ struct JetFragmentation { registry.add("data/jets/V0/jetPtV0TrackProj", "jetPtV0TrackProj", HistType::kTH2D, {jetPtAxis, zAxis}); registry.add("data/jets/V0/jetPtnV0nK0SnLambdanAntiLambda", "jetPtnV0nK0SnLambdanAntiLambda", HistType::kTHnSparseD, {jetPtAxis, v0Count, v0Count, v0Count, v0Count}); - registry.add("data/jets/V0/jetPtV0PtEtaPhi", "jetPtV0PtEtaPhi", HistType::kTHnSparseD, {jetPtAxis, V0PtAxis, V0EtaAxis, V0PhiAxis}); - registry.add("data/jets/V0/jetPtV0PtCtau", "jetPtV0PtCtau", HistType::kTHnSparseD, {jetPtAxis, V0PtAxis, V0CtauAxis, V0CtauAxis, V0CtauAxis}); - registry.add("data/jets/V0/jetPtV0PtMass", "jetPtV0PtMass", HistType::kTHnSparseD, {jetPtAxis, V0PtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("data/jets/V0/jetPtV0PtMassWide", "jetPtV0PtMassWide", HistType::kTHnSparseD, {jetPtAxis, V0PtAxis, K0SWideAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("data/jets/V0/jetPtV0PtLambdaMasses", "jetPtV0PtLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, V0PtAxis, LambdaMassDiffAxis, LambdaMassRatioAxis, LambdaMassRelDiffAxis}); - registry.add("data/jets/V0/jetPtV0PtRadiusCosPA", "jetPtV0PtRadiusCosPA", HistType::kTHnSparseD, {jetPtAxis, V0PtAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("data/jets/V0/jetPtV0PtDCAposneg", "jetPtV0PtDCAposneg", HistType::kTHnSparseD, {jetPtAxis, V0PtAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("data/jets/V0/jetPtV0PtDCAd", "jetPtV0PtDCAd", HistType::kTH3D, {jetPtAxis, V0PtAxis, V0DCAdAxis}); - - registry.add("data/jets/V0/jetPtV0TrackProjCtau", "jetPtV0TrackProjCtau", HistType::kTHnSparseD, {jetPtAxis, zAxis, V0CtauAxis, V0CtauAxis, V0CtauAxis}); - registry.add("data/jets/V0/jetPtV0TrackProjMass", "jetPtV0TrackProjMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("data/jets/V0/jetPtV0TrackProjMassWide", "jetPtV0TrackProjMassWide", HistType::kTHnSparseD, {jetPtAxis, zAxis, K0SWideAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("data/jets/V0/jetPtV0TrackProjLambdaMasses", "jetPtV0TrackProjLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, LambdaMassDiffAxis, LambdaMassRatioAxis, LambdaMassRelDiffAxis}); - registry.add("data/jets/V0/jetPtV0TrackProjRadiusCosPA", "jetPtV0TrackProjRadiusCosPA", HistType::kTHnSparseD, {jetPtAxis, zAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("data/jets/V0/jetPtV0TrackProjDCAposneg", "jetPtV0TrackProjDCAposneg", HistType::kTHnSparseD, {jetPtAxis, zAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("data/jets/V0/jetPtV0TrackProjDCAd", "jetPtV0TrackProjDCAd", HistType::kTH3D, {jetPtAxis, zAxis, V0DCAdAxis}); + registry.add("data/jets/V0/jetPtV0PtEtaPhi", "jetPtV0PtEtaPhi", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0EtaAxis, v0PhiAxis}); + registry.add("data/jets/V0/jetPtV0PtCtau", "jetPtV0PtCtau", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); + registry.add("data/jets/V0/jetPtV0PtMass", "jetPtV0PtMass", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtV0PtMassWide", "jetPtV0PtMassWide", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, k0SWideAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtV0PtLambdaMasses", "jetPtV0PtLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); + registry.add("data/jets/V0/jetPtV0PtRadiusCosPA", "jetPtV0PtRadiusCosPA", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("data/jets/V0/jetPtV0PtDCAposneg", "jetPtV0PtDCAposneg", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("data/jets/V0/jetPtV0PtDCAd", "jetPtV0PtDCAd", HistType::kTH3D, {jetPtAxis, v0PtAxis, v0DCAdAxis}); + + registry.add("data/jets/V0/jetPtV0TrackProjCtau", "jetPtV0TrackProjCtau", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); + registry.add("data/jets/V0/jetPtV0TrackProjMass", "jetPtV0TrackProjMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtV0TrackProjMassWide", "jetPtV0TrackProjMassWide", HistType::kTHnSparseD, {jetPtAxis, zAxis, k0SWideAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtV0TrackProjLambdaMasses", "jetPtV0TrackProjLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); + registry.add("data/jets/V0/jetPtV0TrackProjRadiusCosPA", "jetPtV0TrackProjRadiusCosPA", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("data/jets/V0/jetPtV0TrackProjDCAposneg", "jetPtV0TrackProjDCAposneg", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("data/jets/V0/jetPtV0TrackProjDCAd", "jetPtV0TrackProjDCAd", HistType::kTH3D, {jetPtAxis, zAxis, v0DCAdAxis}); // Identified registry.add("data/jets/V0/jetPtnLambda", "jetPtnLambda", HistType::kTH2D, {jetPtAxis, trackCount}); - registry.add("data/jets/V0/jetPtLambdaPtCtau", "Jet #it{p}_{T}, #it{p}_{T, #Lambda^{0}}, c#tau", HistType::kTH3D, {jetPtAxis, V0PtAxis, V0CtauAxis}); - registry.add("data/jets/V0/jetPtLambdaPtMass", "Jet #it{p}_{T}, #it{p}_{T, #Lambda^{0}}, mass", HistType::kTH3D, {jetPtAxis, V0PtAxis, LambdaMassAxis}); - registry.add("data/jets/V0/jetPtLambdaPtAllMasses", "jetPtLambdaPtAllMasses", HistType::kTHnSparseD, {jetPtAxis, V0PtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("data/jets/V0/jetPtLambdaPtLambdaMasses", "jetPtLambdaPtLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, V0PtAxis, LambdaMassDiffAxis, LambdaMassRatioAxis, LambdaMassRelDiffAxis}); - registry.add("data/jets/V0/jetPtLambdaPtRadius", "Jet #it{p}_{T}, #it{p}_{T, #Lambda^{0}}, radius", HistType::kTH3D, {jetPtAxis, V0PtAxis, V0RadiusAxis}); - registry.add("data/jets/V0/jetPtLambdaPtCosPA", "Jet #it{p}_{T}, #it{p}_{T, #Lambda^{0}}, cosPA", HistType::kTH3D, {jetPtAxis, V0PtAxis, V0CosPAAxis}); - registry.add("data/jets/V0/jetPtLambdaPtDCAd", "Jet #it{p}_{T}, #it{p}_{T, #Lambda^{0}}, DCA daughters", HistType::kTH3D, {jetPtAxis, V0PtAxis, V0DCAdAxis}); - registry.add("data/jets/V0/jetPtLambdaPtDCAposneg", "Jet #it{p}_{T}, #it{p}_{T, #Lambda^{0}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, V0PtAxis, V0DCApAxis, V0DCAnAxis}); - - registry.add("data/jets/V0/jetPtLambdaTrackProjCtau", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, c#tau", HistType::kTH3D, {jetPtAxis, zAxis, V0CtauAxis}); - registry.add("data/jets/V0/jetPtLambdaTrackProjMass", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, mass", HistType::kTH3D, {jetPtAxis, zAxis, LambdaMassAxis}); - registry.add("data/jets/V0/jetPtLambdaTrackProjAllMasses", "jetPtLambdaTrackProjAllMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("data/jets/V0/jetPtLambdaTrackProjLambdaMasses", "jetPtLambdaTrackProjLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, LambdaMassDiffAxis, LambdaMassRatioAxis, LambdaMassRelDiffAxis}); - registry.add("data/jets/V0/jetPtLambdaTrackProjRadius", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, radius", HistType::kTH3D, {jetPtAxis, zAxis, V0RadiusAxis}); - registry.add("data/jets/V0/jetPtLambdaTrackProjCosPA", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, cosPA", HistType::kTH3D, {jetPtAxis, zAxis, V0CosPAAxis}); - registry.add("data/jets/V0/jetPtLambdaTrackProjDCAd", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, DCA daughters", HistType::kTH3D, {jetPtAxis, zAxis, V0DCAdAxis}); - registry.add("data/jets/V0/jetPtLambdaTrackProjDCAposneg", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, zAxis, V0DCApAxis, V0DCAnAxis}); + registry.add("data/jets/V0/jetPtLambdaPtCtau", "Jet #it{p}_{T}, #it{p}_{T, #Lambda^{0}}, c#tau", HistType::kTH3D, {jetPtAxis, v0PtAxis, v0CtauAxis}); + registry.add("data/jets/V0/jetPtLambdaPtMass", "Jet #it{p}_{T}, #it{p}_{T, #Lambda^{0}}, mass", HistType::kTH3D, {jetPtAxis, v0PtAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtLambdaPtAllMasses", "jetPtLambdaPtAllMasses", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtLambdaPtLambdaMasses", "jetPtLambdaPtLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); + registry.add("data/jets/V0/jetPtLambdaPtRadius", "Jet #it{p}_{T}, #it{p}_{T, #Lambda^{0}}, radius", HistType::kTH3D, {jetPtAxis, v0PtAxis, v0RadiusAxis}); + registry.add("data/jets/V0/jetPtLambdaPtCosPA", "Jet #it{p}_{T}, #it{p}_{T, #Lambda^{0}}, cosPA", HistType::kTH3D, {jetPtAxis, v0PtAxis, v0CosPAAxis}); + registry.add("data/jets/V0/jetPtLambdaPtDCAd", "Jet #it{p}_{T}, #it{p}_{T, #Lambda^{0}}, DCA daughters", HistType::kTH3D, {jetPtAxis, v0PtAxis, v0DCAdAxis}); + registry.add("data/jets/V0/jetPtLambdaPtDCAposneg", "Jet #it{p}_{T}, #it{p}_{T, #Lambda^{0}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}); + + registry.add("data/jets/V0/jetPtLambdaTrackProjCtau", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, c#tau", HistType::kTH3D, {jetPtAxis, zAxis, v0CtauAxis}); + registry.add("data/jets/V0/jetPtLambdaTrackProjMass", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, mass", HistType::kTH3D, {jetPtAxis, zAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtLambdaTrackProjAllMasses", "jetPtLambdaTrackProjAllMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtLambdaTrackProjLambdaMasses", "jetPtLambdaTrackProjLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); + registry.add("data/jets/V0/jetPtLambdaTrackProjRadius", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, radius", HistType::kTH3D, {jetPtAxis, zAxis, v0RadiusAxis}); + registry.add("data/jets/V0/jetPtLambdaTrackProjCosPA", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, cosPA", HistType::kTH3D, {jetPtAxis, zAxis, v0CosPAAxis}); + registry.add("data/jets/V0/jetPtLambdaTrackProjDCAd", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, DCA daughters", HistType::kTH3D, {jetPtAxis, zAxis, v0DCAdAxis}); + registry.add("data/jets/V0/jetPtLambdaTrackProjDCAposneg", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, v0DCAnAxis}); registry.add("data/jets/V0/jetPtnAntiLambda", "jetPtnAntiLambda", HistType::kTH2D, {jetPtAxis, trackCount}); - registry.add("data/jets/V0/jetPtAntiLambdaPtCtau", "Jet #it{p}_{T}, #it{p}_{T, #bar{#Lambda}^{0}}, c#tau", HistType::kTH3D, {jetPtAxis, V0PtAxis, V0CtauAxis}); - registry.add("data/jets/V0/jetPtAntiLambdaPtMass", "Jet #it{p}_{T}, #it{p}_{T, #bar{#Lambda}^{0}}, mass", HistType::kTH3D, {jetPtAxis, V0PtAxis, LambdaMassAxis}); - registry.add("data/jets/V0/jetPtAntiLambdaPtAllMasses", "jetPtAntiLambdaPtAllMasses", HistType::kTHnSparseD, {jetPtAxis, V0PtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("data/jets/V0/jetPtAntiLambdaPtLambdaMasses", "jetPtAntiLambdaPtLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, V0PtAxis, LambdaMassDiffAxis, LambdaMassRatioAxis, LambdaMassRelDiffAxis}); - registry.add("data/jets/V0/jetPtAntiLambdaPtRadius", "Jet #it{p}_{T}, #it{p}_{T, #bar{#Lambda}^{0}}, radius", HistType::kTH3D, {jetPtAxis, V0PtAxis, V0RadiusAxis}); - registry.add("data/jets/V0/jetPtAntiLambdaPtCosPA", "Jet #it{p}_{T}, #it{p}_{T, #bar{#Lambda}^{0}}, cosPA", HistType::kTH3D, {jetPtAxis, V0PtAxis, V0CosPAAxis}); - registry.add("data/jets/V0/jetPtAntiLambdaPtDCAd", "Jet #it{p}_{T}, #it{p}_{T, #bar{#Lambda}^{0}}, DCA daughters", HistType::kTH3D, {jetPtAxis, V0PtAxis, V0DCAdAxis}); - registry.add("data/jets/V0/jetPtAntiLambdaPtDCAposneg", "Jet #it{p}_{T}, #it{p}_{T, #bar{#Lambda}^{0}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, V0PtAxis, V0DCApAxis, V0DCAnAxis}); - - registry.add("data/jets/V0/jetPtAntiLambdaTrackProjCtau", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, c#tau", HistType::kTH3D, {jetPtAxis, zAxis, V0CtauAxis}); - registry.add("data/jets/V0/jetPtAntiLambdaTrackProjMass", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, mass", HistType::kTH3D, {jetPtAxis, zAxis, LambdaMassAxis}); - registry.add("data/jets/V0/jetPtAntiLambdaTrackProjAllMasses", "jetPtAntiLambdaTrackProjAllMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("data/jets/V0/jetPtAntiLambdaTrackProjLambdaMasses", "jetPtAntiLambdaTrackProjLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, LambdaMassDiffAxis, LambdaMassRatioAxis, LambdaMassRelDiffAxis}); - registry.add("data/jets/V0/jetPtAntiLambdaTrackProjRadius", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, radius", HistType::kTH3D, {jetPtAxis, zAxis, V0RadiusAxis}); - registry.add("data/jets/V0/jetPtAntiLambdaTrackProjCosPA", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, cosPA", HistType::kTH3D, {jetPtAxis, zAxis, V0CosPAAxis}); - registry.add("data/jets/V0/jetPtAntiLambdaTrackProjDCAd", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, DCA daughters", HistType::kTH3D, {jetPtAxis, zAxis, V0DCAdAxis}); - registry.add("data/jets/V0/jetPtAntiLambdaTrackProjDCAposneg", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, zAxis, V0DCApAxis, V0DCAnAxis}); + registry.add("data/jets/V0/jetPtAntiLambdaPtCtau", "Jet #it{p}_{T}, #it{p}_{T, #bar{#Lambda}^{0}}, c#tau", HistType::kTH3D, {jetPtAxis, v0PtAxis, v0CtauAxis}); + registry.add("data/jets/V0/jetPtAntiLambdaPtMass", "Jet #it{p}_{T}, #it{p}_{T, #bar{#Lambda}^{0}}, mass", HistType::kTH3D, {jetPtAxis, v0PtAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtAntiLambdaPtAllMasses", "jetPtAntiLambdaPtAllMasses", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtAntiLambdaPtLambdaMasses", "jetPtAntiLambdaPtLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); + registry.add("data/jets/V0/jetPtAntiLambdaPtRadius", "Jet #it{p}_{T}, #it{p}_{T, #bar{#Lambda}^{0}}, radius", HistType::kTH3D, {jetPtAxis, v0PtAxis, v0RadiusAxis}); + registry.add("data/jets/V0/jetPtAntiLambdaPtCosPA", "Jet #it{p}_{T}, #it{p}_{T, #bar{#Lambda}^{0}}, cosPA", HistType::kTH3D, {jetPtAxis, v0PtAxis, v0CosPAAxis}); + registry.add("data/jets/V0/jetPtAntiLambdaPtDCAd", "Jet #it{p}_{T}, #it{p}_{T, #bar{#Lambda}^{0}}, DCA daughters", HistType::kTH3D, {jetPtAxis, v0PtAxis, v0DCAdAxis}); + registry.add("data/jets/V0/jetPtAntiLambdaPtDCAposneg", "Jet #it{p}_{T}, #it{p}_{T, #bar{#Lambda}^{0}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}); + + registry.add("data/jets/V0/jetPtAntiLambdaTrackProjCtau", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, c#tau", HistType::kTH3D, {jetPtAxis, zAxis, v0CtauAxis}); + registry.add("data/jets/V0/jetPtAntiLambdaTrackProjMass", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, mass", HistType::kTH3D, {jetPtAxis, zAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtAntiLambdaTrackProjAllMasses", "jetPtAntiLambdaTrackProjAllMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtAntiLambdaTrackProjLambdaMasses", "jetPtAntiLambdaTrackProjLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); + registry.add("data/jets/V0/jetPtAntiLambdaTrackProjRadius", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, radius", HistType::kTH3D, {jetPtAxis, zAxis, v0RadiusAxis}); + registry.add("data/jets/V0/jetPtAntiLambdaTrackProjCosPA", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, cosPA", HistType::kTH3D, {jetPtAxis, zAxis, v0CosPAAxis}); + registry.add("data/jets/V0/jetPtAntiLambdaTrackProjDCAd", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, DCA daughters", HistType::kTH3D, {jetPtAxis, zAxis, v0DCAdAxis}); + registry.add("data/jets/V0/jetPtAntiLambdaTrackProjDCAposneg", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, v0DCAnAxis}); registry.add("data/jets/V0/jetPtnK0S", "jetPtnK0S", HistType::kTH2D, {jetPtAxis, trackCount}); - registry.add("data/jets/V0/jetPtK0SPtCtau", "Jet #it{p}_{T}, #it{p}_{T, K^{0}_{S}}, c#tau", HistType::kTH3D, {jetPtAxis, V0PtAxis, V0CtauAxis}); - registry.add("data/jets/V0/jetPtK0SPtMass", "Jet #it{p}_{T}, #it{p}_{T, K^{0}_{S}}, mass", HistType::kTH3D, {jetPtAxis, V0PtAxis, K0SMassAxis}); - registry.add("data/jets/V0/jetPtK0SPtAllMasses", "jetPtK0SPtAllMasses", HistType::kTHnSparseD, {jetPtAxis, V0PtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("data/jets/V0/jetPtK0SPtRadius", "Jet #it{p}_{T}, #it{p}_{T, K^{0}_{S}}, radius", HistType::kTH3D, {jetPtAxis, V0PtAxis, V0RadiusAxis}); - registry.add("data/jets/V0/jetPtK0SPtCosPA", "Jet #it{p}_{T}, #it{p}_{T, K^{0}_{S}}, cosPA", HistType::kTH3D, {jetPtAxis, V0PtAxis, V0CosPAAxis}); - registry.add("data/jets/V0/jetPtK0SPtDCAd", "Jet #it{p}_{T}, #it{p}_{T, K^{0}_{S}}, DCA daughters", HistType::kTH3D, {jetPtAxis, V0PtAxis, V0DCAdAxis}); - registry.add("data/jets/V0/jetPtK0SPtDCAposneg", "Jet #it{p}_{T}, #it{p}_{T, K^{0}_{S}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, V0PtAxis, V0DCApAxis, V0DCAnAxis}); - - registry.add("data/jets/V0/jetPtK0STrackProjCtau", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, c#tau", HistType::kTH3D, {jetPtAxis, zAxis, V0CtauAxis}); - registry.add("data/jets/V0/jetPtK0STrackProjMass", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, mass", HistType::kTH3D, {jetPtAxis, zAxis, K0SMassAxis}); - registry.add("data/jets/V0/jetPtK0STrackProjAllMasses", "jetPtK0STrackProjAllMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("data/jets/V0/jetPtK0STrackProjRadius", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, radius", HistType::kTH3D, {jetPtAxis, zAxis, V0RadiusAxis}); - registry.add("data/jets/V0/jetPtK0STrackProjCosPA", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, cosPA", HistType::kTH3D, {jetPtAxis, zAxis, V0CosPAAxis}); - registry.add("data/jets/V0/jetPtK0STrackProjDCAd", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, DCA daughters", HistType::kTH3D, {jetPtAxis, zAxis, V0DCAdAxis}); - registry.add("data/jets/V0/jetPtK0STrackProjDCAposneg", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, zAxis, V0DCApAxis, V0DCAnAxis}); + registry.add("data/jets/V0/jetPtK0SPtCtau", "Jet #it{p}_{T}, #it{p}_{T, K^{0}_{S}}, c#tau", HistType::kTH3D, {jetPtAxis, v0PtAxis, v0CtauAxis}); + registry.add("data/jets/V0/jetPtK0SPtMass", "Jet #it{p}_{T}, #it{p}_{T, K^{0}_{S}}, mass", HistType::kTH3D, {jetPtAxis, v0PtAxis, k0SMassAxis}); + registry.add("data/jets/V0/jetPtK0SPtAllMasses", "jetPtK0SPtAllMasses", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtK0SPtRadius", "Jet #it{p}_{T}, #it{p}_{T, K^{0}_{S}}, radius", HistType::kTH3D, {jetPtAxis, v0PtAxis, v0RadiusAxis}); + registry.add("data/jets/V0/jetPtK0SPtCosPA", "Jet #it{p}_{T}, #it{p}_{T, K^{0}_{S}}, cosPA", HistType::kTH3D, {jetPtAxis, v0PtAxis, v0CosPAAxis}); + registry.add("data/jets/V0/jetPtK0SPtDCAd", "Jet #it{p}_{T}, #it{p}_{T, K^{0}_{S}}, DCA daughters", HistType::kTH3D, {jetPtAxis, v0PtAxis, v0DCAdAxis}); + registry.add("data/jets/V0/jetPtK0SPtDCAposneg", "Jet #it{p}_{T}, #it{p}_{T, K^{0}_{S}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}); + + registry.add("data/jets/V0/jetPtK0STrackProjCtau", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, c#tau", HistType::kTH3D, {jetPtAxis, zAxis, v0CtauAxis}); + registry.add("data/jets/V0/jetPtK0STrackProjMass", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, mass", HistType::kTH3D, {jetPtAxis, zAxis, k0SMassAxis}); + registry.add("data/jets/V0/jetPtK0STrackProjAllMasses", "jetPtK0STrackProjAllMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtK0STrackProjRadius", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, radius", HistType::kTH3D, {jetPtAxis, zAxis, v0RadiusAxis}); + registry.add("data/jets/V0/jetPtK0STrackProjCosPA", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, cosPA", HistType::kTH3D, {jetPtAxis, zAxis, v0CosPAAxis}); + registry.add("data/jets/V0/jetPtK0STrackProjDCAd", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, DCA daughters", HistType::kTH3D, {jetPtAxis, zAxis, v0DCAdAxis}); + registry.add("data/jets/V0/jetPtK0STrackProjDCAposneg", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, v0DCAnAxis}); } // doprocessDataV0Frag || doprocessDataV0JetsFrag if (doprocessDataV0JetsFragWithWeights) { @@ -386,46 +391,46 @@ struct JetFragmentation { registry.add("data/jets/weighted/jetPtEtaPhi", "Jet #it{p}_{T}, #eta, #phi", HistType::kTH3D, {jetPtAxis, etaAxis, phiAxis}); registry.add("data/jets/weighted/V0/jetPtnV0nK0SnLambdanAntiLambda", "jetPtnV0nK0SnLambdanAntiLambda", HistType::kTHnSparseD, {jetPtAxis, v0Weight, v0Weight, v0Weight, v0Weight}); - registry.add("data/jets/weighted/V0/jetPtV0TrackProjCtau", "jetPtV0TrackProjCtau", HistType::kTHnSparseD, {jetPtAxis, zAxis, V0CtauAxis, V0CtauAxis, V0CtauAxis}); - registry.add("data/jets/weighted/V0/jetPtV0TrackProjMass", "jetPtV0TrackProjMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("data/jets/weighted/V0/jetPtV0TrackProjMassWide", "jetPtV0TrackProjMassWide", HistType::kTHnSparseD, {jetPtAxis, zAxis, K0SWideAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("data/jets/weighted/V0/jetPtV0TrackProjLambdaMasses", "jetPtV0TrackProjLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, LambdaMassDiffAxis, LambdaMassRatioAxis, LambdaMassRelDiffAxis}); - registry.add("data/jets/weighted/V0/jetPtV0TrackProjRadiusCosPA", "jetPtV0TrackProjRadiusCosPA", HistType::kTHnSparseD, {jetPtAxis, zAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("data/jets/weighted/V0/jetPtV0TrackProjDCAposneg", "jetPtV0TrackProjDCAposneg", HistType::kTHnSparseD, {jetPtAxis, zAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("data/jets/weighted/V0/jetPtV0TrackProjDCAd", "jetPtV0TrackProjDCAd", HistType::kTH3D, {jetPtAxis, zAxis, V0DCAdAxis}); + registry.add("data/jets/weighted/V0/jetPtV0TrackProjCtau", "jetPtV0TrackProjCtau", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); + registry.add("data/jets/weighted/V0/jetPtV0TrackProjMass", "jetPtV0TrackProjMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("data/jets/weighted/V0/jetPtV0TrackProjMassWide", "jetPtV0TrackProjMassWide", HistType::kTHnSparseD, {jetPtAxis, zAxis, k0SWideAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("data/jets/weighted/V0/jetPtV0TrackProjLambdaMasses", "jetPtV0TrackProjLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); + registry.add("data/jets/weighted/V0/jetPtV0TrackProjRadiusCosPA", "jetPtV0TrackProjRadiusCosPA", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("data/jets/weighted/V0/jetPtV0TrackProjDCAposneg", "jetPtV0TrackProjDCAposneg", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("data/jets/weighted/V0/jetPtV0TrackProjDCAd", "jetPtV0TrackProjDCAd", HistType::kTH3D, {jetPtAxis, zAxis, v0DCAdAxis}); // K0S - registry.add("data/jets/weighted/V0/jetPtK0STrackProjCtau", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, c#tau", HistType::kTH3D, {jetPtAxis, zAxis, V0CtauAxis}); - registry.add("data/jets/weighted/V0/jetPtK0STrackProjMass", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, mass", HistType::kTH3D, {jetPtAxis, zAxis, K0SMassAxis}); - registry.add("data/jets/weighted/V0/jetPtK0STrackProjAllMasses", "jetPtK0STrackProjAllMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("data/jets/weighted/V0/jetPtK0STrackProjRadius", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, radius", HistType::kTH3D, {jetPtAxis, zAxis, V0RadiusAxis}); - registry.add("data/jets/weighted/V0/jetPtK0STrackProjCosPA", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, cosPA", HistType::kTH3D, {jetPtAxis, zAxis, V0CosPAAxis}); - registry.add("data/jets/weighted/V0/jetPtK0STrackProjDCAd", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, DCA daughters", HistType::kTH3D, {jetPtAxis, zAxis, V0DCAdAxis}); - registry.add("data/jets/weighted/V0/jetPtK0STrackProjDCAposneg", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, zAxis, V0DCApAxis, V0DCAnAxis}); + registry.add("data/jets/weighted/V0/jetPtK0STrackProjCtau", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, c#tau", HistType::kTH3D, {jetPtAxis, zAxis, v0CtauAxis}); + registry.add("data/jets/weighted/V0/jetPtK0STrackProjMass", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, mass", HistType::kTH3D, {jetPtAxis, zAxis, k0SMassAxis}); + registry.add("data/jets/weighted/V0/jetPtK0STrackProjAllMasses", "jetPtK0STrackProjAllMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("data/jets/weighted/V0/jetPtK0STrackProjRadius", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, radius", HistType::kTH3D, {jetPtAxis, zAxis, v0RadiusAxis}); + registry.add("data/jets/weighted/V0/jetPtK0STrackProjCosPA", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, cosPA", HistType::kTH3D, {jetPtAxis, zAxis, v0CosPAAxis}); + registry.add("data/jets/weighted/V0/jetPtK0STrackProjDCAd", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, DCA daughters", HistType::kTH3D, {jetPtAxis, zAxis, v0DCAdAxis}); + registry.add("data/jets/weighted/V0/jetPtK0STrackProjDCAposneg", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, v0DCAnAxis}); // Lambda - registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjCtau", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, c#tau", HistType::kTH3D, {jetPtAxis, zAxis, V0CtauAxis}); - registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjMass", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, mass", HistType::kTH3D, {jetPtAxis, zAxis, LambdaMassAxis}); - registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjAllMasses", "jetPtLambdaTrackProjAllMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjLambdaMasses", "jetPtLambdaTrackProjLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, LambdaMassDiffAxis, LambdaMassRatioAxis, LambdaMassRelDiffAxis}); - registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjRadius", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, radius", HistType::kTH3D, {jetPtAxis, zAxis, V0RadiusAxis}); - registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjCosPA", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, cosPA", HistType::kTH3D, {jetPtAxis, zAxis, V0CosPAAxis}); - registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjDCAd", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, DCA daughters", HistType::kTH3D, {jetPtAxis, zAxis, V0DCAdAxis}); - registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjDCAposneg", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, zAxis, V0DCApAxis, V0DCAnAxis}); + registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjCtau", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, c#tau", HistType::kTH3D, {jetPtAxis, zAxis, v0CtauAxis}); + registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjMass", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, mass", HistType::kTH3D, {jetPtAxis, zAxis, lambdaMassAxis}); + registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjAllMasses", "jetPtLambdaTrackProjAllMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjLambdaMasses", "jetPtLambdaTrackProjLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); + registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjRadius", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, radius", HistType::kTH3D, {jetPtAxis, zAxis, v0RadiusAxis}); + registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjCosPA", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, cosPA", HistType::kTH3D, {jetPtAxis, zAxis, v0CosPAAxis}); + registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjDCAd", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, DCA daughters", HistType::kTH3D, {jetPtAxis, zAxis, v0DCAdAxis}); + registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjDCAposneg", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, v0DCAnAxis}); // AntiLambda - registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjCtau", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, c#tau", HistType::kTH3D, {jetPtAxis, zAxis, V0CtauAxis}); - registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjMass", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, mass", HistType::kTH3D, {jetPtAxis, zAxis, LambdaMassAxis}); - registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjAllMasses", "jetPtAntiLambdaTrackProjAllMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjLambdaMasses", "jetPtAntiLambdaTrackProjLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, LambdaMassDiffAxis, LambdaMassRatioAxis, LambdaMassRelDiffAxis}); - registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjRadius", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, radius", HistType::kTH3D, {jetPtAxis, zAxis, V0RadiusAxis}); - registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjCosPA", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, cosPA", HistType::kTH3D, {jetPtAxis, zAxis, V0CosPAAxis}); - registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjDCAd", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, DCA daughters", HistType::kTH3D, {jetPtAxis, zAxis, V0DCAdAxis}); - registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjDCAposneg", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, zAxis, V0DCApAxis, V0DCAnAxis}); + registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjCtau", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, c#tau", HistType::kTH3D, {jetPtAxis, zAxis, v0CtauAxis}); + registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjMass", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, mass", HistType::kTH3D, {jetPtAxis, zAxis, lambdaMassAxis}); + registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjAllMasses", "jetPtAntiLambdaTrackProjAllMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjLambdaMasses", "jetPtAntiLambdaTrackProjLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); + registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjRadius", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, radius", HistType::kTH3D, {jetPtAxis, zAxis, v0RadiusAxis}); + registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjCosPA", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, cosPA", HistType::kTH3D, {jetPtAxis, zAxis, v0CosPAAxis}); + registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjDCAd", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, DCA daughters", HistType::kTH3D, {jetPtAxis, zAxis, v0DCAdAxis}); + registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjDCAposneg", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, v0DCAnAxis}); // Background - registry.add("data/jets/weighted/V0/jetPtBkgTrackProjCtau", "jetPtBkgTrackProjCtau", HistType::kTHnSparseD, {jetPtAxis, zAxis, V0CtauAxis, V0CtauAxis, V0CtauAxis}); - registry.add("data/jets/weighted/V0/jetPtBkgTrackProjMass", "jetPtBkgTrackProjMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("data/jets/weighted/V0/jetPtBkgTrackProjLambdaMasses", "jetPtBkgTrackProjLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, LambdaMassDiffAxis, LambdaMassRatioAxis, LambdaMassRelDiffAxis}); - registry.add("data/jets/weighted/V0/jetPtBkgTrackProjRadiusCosPA", "jetPtBkgTrackProjRadiusCosPA", HistType::kTHnSparseD, {jetPtAxis, zAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("data/jets/weighted/V0/jetPtBkgTrackProjDCAposneg", "jetPtBkgTrackProjDCAposneg", HistType::kTHnSparseD, {jetPtAxis, zAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("data/jets/weighted/V0/jetPtBkgTrackProjDCAd", "jetPtBkgTrackProjDCAd", HistType::kTH3D, {jetPtAxis, zAxis, V0DCAdAxis}); + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjCtau", "jetPtBkgTrackProjCtau", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjMass", "jetPtBkgTrackProjMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjLambdaMasses", "jetPtBkgTrackProjLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjRadiusCosPA", "jetPtBkgTrackProjRadiusCosPA", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjDCAposneg", "jetPtBkgTrackProjDCAposneg", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjDCAd", "jetPtBkgTrackProjDCAd", HistType::kTH3D, {jetPtAxis, zAxis, v0DCAdAxis}); } if (doprocessMcP || doprocessMcMatchedV0JetsFrag) { @@ -550,33 +555,33 @@ struct JetFragmentation { } // doprocessMcMatchedV0 || doprocessMcMatchedV0Frag if (doprocessMcMatchedV0 || doprocessMcMatchedV0JetsFrag) { - registry.add("matching/V0/V0PartPtDetPt", "V0PartPtDetPt", HistType::kTH2D, {V0partPtAxis, V0detPtAxis}); - registry.add("matching/V0/V0PartPtRatioPtRelDiffPt", "V0PartPtRatioRelDiffPt", HistType::kTH3D, {V0partPtAxis, V0PtRatioAxis, V0PtRelDiffAxis}); - - registry.add("matching/V0/K0SPtEtaPhi", "K0SPtEtaPhi", HistType::kTHnSparseD, {V0partPtAxis, V0detPtAxis, V0EtaAxis, V0PhiAxis}); - registry.add("matching/V0/K0SPtCtauMass", "K0SPtCtauMass", HistType::kTHnSparseD, {V0partPtAxis, V0partPtAxis, V0CtauAxis, K0SMassAxis}); - registry.add("matching/V0/K0SPtRadiusCosPA", "K0SPtRadiusCosPA", HistType::kTHnSparseD, {V0partPtAxis, V0partPtAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("matching/V0/K0SPtDCAposneg", "K0SPtDCAposneg", HistType::kTHnSparseD, {V0partPtAxis, V0partPtAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("matching/V0/K0SPtDCAd", "K0SPtDCAd", HistType::kTH3D, {V0partPtAxis, V0detPtAxis, V0DCAdAxis}); - registry.add("matching/V0/K0SPtMass", "K0SPtMass", HistType::kTHnSparseD, {V0partPtAxis, V0detPtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - - registry.add("matching/V0/LambdaPtEtaPhi", "LambdaPtEtaPhi", HistType::kTHnSparseD, {V0partPtAxis, V0detPtAxis, V0EtaAxis, V0PhiAxis}); - registry.add("matching/V0/LambdaPtCtauMass", "LambdaPtCtauMass", HistType::kTHnSparseD, {V0partPtAxis, V0partPtAxis, V0CtauAxis, LambdaMassAxis}); - registry.add("matching/V0/LambdaPtRadiusCosPA", "LambdaPtRadiusCosPA", HistType::kTHnSparseD, {V0partPtAxis, V0partPtAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("matching/V0/LambdaPtDCAposneg", "LambdaPtDCAposneg", HistType::kTHnSparseD, {V0partPtAxis, V0partPtAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("matching/V0/LambdaPtDCAd", "LambdaPtDCAd", HistType::kTH3D, {V0partPtAxis, V0detPtAxis, V0DCAdAxis}); - registry.add("matching/V0/LambdaPtMass", "LambdaPtMass", HistType::kTHnSparseD, {V0partPtAxis, V0detPtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - - registry.add("matching/V0/antiLambdaPtEtaPhi", "antiLambdaPtEtaPhi", HistType::kTHnSparseD, {V0partPtAxis, V0detPtAxis, V0EtaAxis, V0PhiAxis}); - registry.add("matching/V0/antiLambdaPtCtauMass", "antiLambdaPtCtauMass", HistType::kTHnSparseD, {V0partPtAxis, V0partPtAxis, V0CtauAxis, LambdaMassAxis}); - registry.add("matching/V0/antiLambdaPtRadiusCosPA", "antiLambdaPtRadiusCosPA", HistType::kTHnSparseD, {V0partPtAxis, V0partPtAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("matching/V0/antiLambdaPtDCAposneg", "antiLambdaPtDCAposneg", HistType::kTHnSparseD, {V0partPtAxis, V0partPtAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("matching/V0/antiLambdaPtDCAd", "antiLambdaPtDCAd", HistType::kTH3D, {V0partPtAxis, V0detPtAxis, V0DCAdAxis}); - registry.add("matching/V0/antiLambdaPtMass", "antiLambdaPtMass", HistType::kTHnSparseD, {V0partPtAxis, V0detPtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); + registry.add("matching/V0/V0PartPtDetPt", "V0PartPtDetPt", HistType::kTH2D, {v0partPtAxis, v0detPtAxis}); + registry.add("matching/V0/V0PartPtRatioPtRelDiffPt", "V0PartPtRatioRelDiffPt", HistType::kTH3D, {v0partPtAxis, v0PtRatioAxis, v0PtRelDiffAxis}); + + registry.add("matching/V0/K0SPtEtaPhi", "K0SPtEtaPhi", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, v0EtaAxis, v0PhiAxis}); + registry.add("matching/V0/K0SPtCtauMass", "K0SPtCtauMass", HistType::kTHnSparseD, {v0partPtAxis, v0partPtAxis, v0CtauAxis, k0SMassAxis}); + registry.add("matching/V0/K0SPtRadiusCosPA", "K0SPtRadiusCosPA", HistType::kTHnSparseD, {v0partPtAxis, v0partPtAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("matching/V0/K0SPtDCAposneg", "K0SPtDCAposneg", HistType::kTHnSparseD, {v0partPtAxis, v0partPtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("matching/V0/K0SPtDCAd", "K0SPtDCAd", HistType::kTH3D, {v0partPtAxis, v0detPtAxis, v0DCAdAxis}); + registry.add("matching/V0/K0SPtMass", "K0SPtMass", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + + registry.add("matching/V0/LambdaPtEtaPhi", "LambdaPtEtaPhi", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, v0EtaAxis, v0PhiAxis}); + registry.add("matching/V0/LambdaPtCtauMass", "LambdaPtCtauMass", HistType::kTHnSparseD, {v0partPtAxis, v0partPtAxis, v0CtauAxis, lambdaMassAxis}); + registry.add("matching/V0/LambdaPtRadiusCosPA", "LambdaPtRadiusCosPA", HistType::kTHnSparseD, {v0partPtAxis, v0partPtAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("matching/V0/LambdaPtDCAposneg", "LambdaPtDCAposneg", HistType::kTHnSparseD, {v0partPtAxis, v0partPtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("matching/V0/LambdaPtDCAd", "LambdaPtDCAd", HistType::kTH3D, {v0partPtAxis, v0detPtAxis, v0DCAdAxis}); + registry.add("matching/V0/LambdaPtMass", "LambdaPtMass", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + + registry.add("matching/V0/antiLambdaPtEtaPhi", "antiLambdaPtEtaPhi", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, v0EtaAxis, v0PhiAxis}); + registry.add("matching/V0/antiLambdaPtCtauMass", "antiLambdaPtCtauMass", HistType::kTHnSparseD, {v0partPtAxis, v0partPtAxis, v0CtauAxis, lambdaMassAxis}); + registry.add("matching/V0/antiLambdaPtRadiusCosPA", "antiLambdaPtRadiusCosPA", HistType::kTHnSparseD, {v0partPtAxis, v0partPtAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("matching/V0/antiLambdaPtDCAposneg", "antiLambdaPtDCAposneg", HistType::kTHnSparseD, {v0partPtAxis, v0partPtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("matching/V0/antiLambdaPtDCAd", "antiLambdaPtDCAd", HistType::kTH3D, {v0partPtAxis, v0detPtAxis, v0DCAdAxis}); + registry.add("matching/V0/antiLambdaPtMass", "antiLambdaPtMass", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); // Reflections - registry.add("matching/V0/Lambda0Reflection", "pt, pt, mK, mL, maL, Lambda0Reflection", HistType::kTHnSparseD, {V0partPtAxis, V0detPtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/V0/antiLambda0Reflection", "pt, pt, mK, mL, maL, antiLambda0Reflection", HistType::kTHnSparseD, {V0partPtAxis, V0detPtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis, LambdaMassAxis}); + registry.add("matching/V0/Lambda0Reflection", "pt, pt, mK, mL, maL, Lambda0Reflection", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/V0/antiLambda0Reflection", "pt, pt, mK, mL, maL, antiLambda0Reflection", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis, lambdaMassAxis}); } // doprocessMcMatchedV0 if (doprocessMcMatchedV0Frag) { @@ -584,217 +589,217 @@ struct JetFragmentation { } if (doprocessMcMatchedV0Frag || doprocessMcMatchedV0JetsFrag) { registry.add("matching/jets/V0/jetPtnV0MatchednK0SnLambdanAntiLambda", "jet Pt, nV0 matched, nK0S nLambdan AntiLambda", HistType::kTHnSparseD, {detJetPtAxis, v0Count, v0Count, v0Count, v0Count}); - registry.add("matching/jets/V0/partJetPtV0PtDetPt", "V0PartPtDetPt", HistType::kTH3D, {partJetPtAxis, V0partPtAxis, V0detPtAxis}); - registry.add("matching/jets/V0/partJetPtDetJetPtPartV0PtRatioPtRelDiffPt", "V0PartPtRatioRelDiffPt", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, V0partPtAxis, V0PtRatioAxis, V0PtRelDiffAxis}); + registry.add("matching/jets/V0/partJetPtV0PtDetPt", "V0PartPtDetPt", HistType::kTH3D, {partJetPtAxis, v0partPtAxis, v0detPtAxis}); + registry.add("matching/jets/V0/partJetPtDetJetPtPartV0PtRatioPtRelDiffPt", "V0PartPtRatioRelDiffPt", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0partPtAxis, v0PtRatioAxis, v0PtRelDiffAxis}); // ----------------------------- // Unidentified V0s // ----------------------------- registry.add("matching/jets/V0/matchDetJetPtV0TrackProjPartJetPtV0TrackProj", "Matched", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, partJetPtAxis, partZAxis}); - registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0Pt", "matched jet Pt, V0 Pt", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis}); + registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0Pt", "matched jet Pt, V0 Pt", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis}); // Matched V0: pt - registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtCtauLambda0", "matched jet Pt, V0 Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0CtauAxis}); - registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtCtauAntiLambda0", "matched jet Pt, V0 Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0CtauAxis}); - registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtCtauK0S", "matched jet Pt, V0 Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0CtauAxis}); - registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtMassLambda0", "matched jet Pt, V0 Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtMassAntiLambda0", "matched jet Pt, V0 Pt, Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtMassK0S", "matched jet Pt, V0 Pt, MassK0S", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, K0SMassAxis}); - registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtRadius", "matched jet Pt, V0 Pt, Radius", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0RadiusAxis}); - registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtCosPA", "matched jet Pt, V0 Pt, CosPA", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0CosPAAxis}); - registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtDCAposneg", "matched jet Pt, V0 Pt, DCAposneg", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtDCAd", "matched jet Pt, V0 Pt, DCAd", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0DCAdAxis}); + registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtCtauLambda0", "matched jet Pt, V0 Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}); + registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtCtauAntiLambda0", "matched jet Pt, V0 Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}); + registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtCtauK0S", "matched jet Pt, V0 Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}); + registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtMassLambda0", "matched jet Pt, V0 Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtMassAntiLambda0", "matched jet Pt, V0 Pt, Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtMassK0S", "matched jet Pt, V0 Pt, MassK0S", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis}); + registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtRadius", "matched jet Pt, V0 Pt, Radius", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0RadiusAxis}); + registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtCosPA", "matched jet Pt, V0 Pt, CosPA", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CosPAAxis}); + registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtDCAposneg", "matched jet Pt, V0 Pt, DCAposneg", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtDCAd", "matched jet Pt, V0 Pt, DCAd", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0DCAdAxis}); // Matched Lambda0: z - registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjCtauLambda0", "matched jet Pt, V0 z, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0CtauAxis}); - registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjCtauAntiLambda0", "matched jet Pt, V0 z, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0CtauAxis}); - registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjCtauK0S", "matched jet Pt, V0 z, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0CtauAxis}); - registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjMassLambda0", "matched jet Pt, V0 z, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjMassAntiLambda0", "matched jet Pt, V0 z, Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjMassK0S", "matched jet Pt, V0 z, MassK0S", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, K0SMassAxis}); - registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjRadius", "matched jet Pt, V0 z, Radius", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0RadiusAxis}); - registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjCosPA", "matched jet Pt, V0 z, CosPA", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0CosPAAxis}); - registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjDCAposneg", "matched jet Pt, V0 z, DCAposneg", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjDCAd", "matched jet Pt, V0 z, DCAd", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0DCAdAxis}); + registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjCtauLambda0", "matched jet Pt, V0 z, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}); + registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjCtauAntiLambda0", "matched jet Pt, V0 z, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}); + registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjCtauK0S", "matched jet Pt, V0 z, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}); + registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjMassLambda0", "matched jet Pt, V0 z, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjMassAntiLambda0", "matched jet Pt, V0 z, Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjMassK0S", "matched jet Pt, V0 z, MassK0S", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, k0SMassAxis}); + registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjRadius", "matched jet Pt, V0 z, Radius", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0RadiusAxis}); + registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjCosPA", "matched jet Pt, V0 z, CosPA", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CosPAAxis}); + registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjDCAposneg", "matched jet Pt, V0 z, DCAposneg", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjDCAd", "matched jet Pt, V0 z, DCAd", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0DCAdAxis}); // Fakes registry.add("matching/jets/V0/fakeJetPtV0TrackProj", "Fakes", HistType::kTH2D, {detJetPtAxis, detZAxis}); - registry.add("matching/jets/V0/fakeJetPtV0PtEtaPhi", "fake jet Pt, V0 PtEtaPhi", HistType::kTHnSparseD, {detJetPtAxis, V0PtAxis, V0EtaAxis, V0PhiAxis}); - registry.add("matching/jets/V0/fakeJetPtV0PtCtau", "fake jet Pt, V0 PtCtau", HistType::kTHnSparseD, {detJetPtAxis, V0PtAxis, V0CtauAxis, V0CtauAxis, V0CtauAxis}); - registry.add("matching/jets/V0/fakeJetPtV0PtMass", "fake jet Pt, V0 PtMass", HistType::kTHnSparseD, {detJetPtAxis, V0PtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/fakeJetPtV0PtLambdaMasses", "fake jet Pt, V0 PtLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, V0PtAxis, LambdaMassDiffAxis, LambdaMassRatioAxis, LambdaMassRelDiffAxis}); - registry.add("matching/jets/V0/fakeJetPtV0PtRadiusCosPA", "fake jet Pt, V0 PtRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, V0PtAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("matching/jets/V0/fakeJetPtV0PtDCAposneg", "fake jet Pt, V0 PtDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, V0PtAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("matching/jets/V0/fakeJetPtV0PtDCAd", "fake jet Pt, V0 PtDCAd", HistType::kTH3D, {detJetPtAxis, V0PtAxis, V0DCAdAxis}); - registry.add("matching/jets/V0/fakeJetPtV0TrackProjCtau", "fake jet Pt, V0 zCtau", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, V0CtauAxis, V0CtauAxis, V0CtauAxis}); - registry.add("matching/jets/V0/fakeJetPtV0TrackProjMass", "fake jet Pt, V0 zMass", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/fakeJetPtV0TrackProjLambdaMasses", "fake jet Pt, V0 zLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, LambdaMassDiffAxis, LambdaMassRatioAxis, LambdaMassRelDiffAxis}); - registry.add("matching/jets/V0/fakeJetPtV0TrackProjRadiusCosPA", "fake jet Pt, V0 zRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("matching/jets/V0/fakeJetPtV0TrackProjDCAposneg", "fake jet Pt, V0 zDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("matching/jets/V0/fakeJetPtV0TrackProjDCAd", "fake jet Pt, V0 zDCAd", HistType::kTH3D, {detJetPtAxis, detZAxis, V0DCAdAxis}); + registry.add("matching/jets/V0/fakeJetPtV0PtEtaPhi", "fake jet Pt, V0 PtEtaPhi", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0EtaAxis, v0PhiAxis}); + registry.add("matching/jets/V0/fakeJetPtV0PtCtau", "fake jet Pt, V0 PtCtau", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); + registry.add("matching/jets/V0/fakeJetPtV0PtMass", "fake jet Pt, V0 PtMass", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/fakeJetPtV0PtLambdaMasses", "fake jet Pt, V0 PtLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); + registry.add("matching/jets/V0/fakeJetPtV0PtRadiusCosPA", "fake jet Pt, V0 PtRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("matching/jets/V0/fakeJetPtV0PtDCAposneg", "fake jet Pt, V0 PtDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("matching/jets/V0/fakeJetPtV0PtDCAd", "fake jet Pt, V0 PtDCAd", HistType::kTH3D, {detJetPtAxis, v0PtAxis, v0DCAdAxis}); + registry.add("matching/jets/V0/fakeJetPtV0TrackProjCtau", "fake jet Pt, V0 zCtau", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); + registry.add("matching/jets/V0/fakeJetPtV0TrackProjMass", "fake jet Pt, V0 zMass", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/fakeJetPtV0TrackProjLambdaMasses", "fake jet Pt, V0 zLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); + registry.add("matching/jets/V0/fakeJetPtV0TrackProjRadiusCosPA", "fake jet Pt, V0 zRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("matching/jets/V0/fakeJetPtV0TrackProjDCAposneg", "fake jet Pt, V0 zDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("matching/jets/V0/fakeJetPtV0TrackProjDCAd", "fake jet Pt, V0 zDCAd", HistType::kTH3D, {detJetPtAxis, detZAxis, v0DCAdAxis}); // Misses - registry.add("matching/jets/V0/missJetPtV0PtEtaPhi", "miss jet Pt, V0 PtEtaPhi", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, V0EtaAxis, V0PhiAxis}); + registry.add("matching/jets/V0/missJetPtV0PtEtaPhi", "miss jet Pt, V0 PtEtaPhi", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, v0EtaAxis, v0PhiAxis}); registry.add("matching/jets/V0/missJetPtV0TrackProj", "Misses", HistType::kTH2D, {partJetPtAxis, partZAxis}); // ----------------------------- // Lambda0 // ----------------------------- registry.add("matching/jets/V0/matchDetJetPtLambda0TrackProjPartJetPtLambda0TrackProj", "Matched", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, partJetPtAxis, partZAxis}); - registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0Pt", "matched jet Pt, #Lambda^{0} Pt", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis}); + registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0Pt", "matched jet Pt, #Lambda^{0} Pt", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis}); // Matched Lambda0: pt - registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtCtauLambda0", "matched jet Pt, #Lambda^{0} Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0CtauAxis}); - registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtCtauAntiLambda0", "matched jet Pt, #Lambda^{0} Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0CtauAxis}); - registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtCtauK0S", "matched jet Pt, #{K}^{0}_{S} Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0CtauAxis}); - registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtMassLambda0", "matched jet Pt, #Lambda^{0} Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtMassAntiLambda0", "matched jet Pt, #Lambda^{0} Pt Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtMassK0S", "matched jet Pt, #Lambda^{0} PtMassK0S", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, K0SMassAxis}); - registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtAllMasses", "matched jet Pt, #Lambda^{0} Pt, Masses", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtRadius", "matched jet Pt, #Lambda^{0} Pt Radius", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0RadiusAxis}); - registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtCosPA", "matched jet Pt, #Lambda^{0} Pt CosPA", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0CosPAAxis}); - registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtDCAposneg", "matched jet Pt, #Lambda^{0} PtDCAposneg", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtDCAd", "matched jet Pt, #Lambda^{0} PtDCAd", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0DCAdAxis}); + registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtCtauLambda0", "matched jet Pt, #Lambda^{0} Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}); + registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtCtauAntiLambda0", "matched jet Pt, #Lambda^{0} Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}); + registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtCtauK0S", "matched jet Pt, #{K}^{0}_{S} Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}); + registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtMassLambda0", "matched jet Pt, #Lambda^{0} Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtMassAntiLambda0", "matched jet Pt, #Lambda^{0} Pt Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtMassK0S", "matched jet Pt, #Lambda^{0} PtMassK0S", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis}); + registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtAllMasses", "matched jet Pt, #Lambda^{0} Pt, Masses", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtRadius", "matched jet Pt, #Lambda^{0} Pt Radius", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0RadiusAxis}); + registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtCosPA", "matched jet Pt, #Lambda^{0} Pt CosPA", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CosPAAxis}); + registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtDCAposneg", "matched jet Pt, #Lambda^{0} PtDCAposneg", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtDCAd", "matched jet Pt, #Lambda^{0} PtDCAd", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0DCAdAxis}); // Matched Lambda0: z - registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjCtauLambda0", "matched jet Pt, #Lambda^{0} Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0CtauAxis}); - registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjCtauAntiLambda0", "matched jet Pt, #Lambda^{0} Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0CtauAxis}); - registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjCtauK0S", "matched jet Pt, #{K}^{0}_{S} Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0CtauAxis}); - registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjMassLambda0", "matched jet Pt, #Lambda^{0} Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjMassAntiLambda0", "matched jet Pt, #Lambda^{0} Pt Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjMassK0S", "matched jet Pt, #Lambda^{0} PtMassK0S", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, K0SMassAxis}); - registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjAllMasses", "matched jet Pt, #Lambda^{0} Pt, Masses", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjRadius", "matched jet Pt, #Lambda^{0} Pt Radius", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0RadiusAxis}); - registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjCosPA", "matched jet Pt, #Lambda^{0} Pt CosPA", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0CosPAAxis}); - registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjDCAposneg", "matched jet Pt, #Lambda^{0} PtDCAposneg", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjDCAd", "matched jet Pt, #Lambda^{0} PtDCAd", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0DCAdAxis}); + registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjCtauLambda0", "matched jet Pt, #Lambda^{0} Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}); + registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjCtauAntiLambda0", "matched jet Pt, #Lambda^{0} Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}); + registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjCtauK0S", "matched jet Pt, #{K}^{0}_{S} Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}); + registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjMassLambda0", "matched jet Pt, #Lambda^{0} Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjMassAntiLambda0", "matched jet Pt, #Lambda^{0} Pt Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjMassK0S", "matched jet Pt, #Lambda^{0} PtMassK0S", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, k0SMassAxis}); + registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjAllMasses", "matched jet Pt, #Lambda^{0} Pt, Masses", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjRadius", "matched jet Pt, #Lambda^{0} Pt Radius", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0RadiusAxis}); + registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjCosPA", "matched jet Pt, #Lambda^{0} Pt CosPA", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CosPAAxis}); + registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjDCAposneg", "matched jet Pt, #Lambda^{0} PtDCAposneg", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjDCAd", "matched jet Pt, #Lambda^{0} PtDCAd", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0DCAdAxis}); // Fake Lambda0 registry.add("matching/jets/V0/fakeJetPtLambda0TrackProj", "Fakes", HistType::kTH2D, {detJetPtAxis, detZAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0PtEtaPhi", "fake jet Pt, #Lambda^{0} PtEtaPhi", HistType::kTHnSparseD, {detJetPtAxis, V0PtAxis, V0EtaAxis, V0PhiAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0PtCtau", "fake jet Pt, #Lambda^{0} PtCtau", HistType::kTHnSparseD, {detJetPtAxis, V0PtAxis, V0CtauAxis, V0CtauAxis, V0CtauAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0PtMass", "fake jet Pt, #Lambda^{0} PtMass", HistType::kTHnSparseD, {detJetPtAxis, V0PtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0PtLambdaMasses", "fake jet Pt, #Lambda^{0} PtLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, V0PtAxis, LambdaMassDiffAxis, LambdaMassRatioAxis, LambdaMassRelDiffAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0PtRadiusCosPA", "fake jet Pt, #Lambda^{0} PtRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, V0PtAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0PtDCAposneg", "fake jet Pt, #Lambda^{0} PtDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, V0PtAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0PtDCAd", "fake jet Pt, #Lambda^{0} PtDCAd", HistType::kTH3D, {detJetPtAxis, V0PtAxis, V0DCAdAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0TrackProjEtaPhi", "fake jet Pt, #Lambda^{0} zEtaPhi", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, V0EtaAxis, V0PhiAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0TrackProjCtau", "fake jet Pt, #Lambda^{0} zCtau", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, V0CtauAxis, V0CtauAxis, V0CtauAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0TrackProjMass", "fake jet Pt, #Lambda^{0} zMass", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0TrackProjLambdaMasses", "fake jet Pt, #Lambda^{0} zLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, LambdaMassDiffAxis, LambdaMassRatioAxis, LambdaMassRelDiffAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0TrackProjRadiusCosPA", "fake jet Pt, #Lambda^{0} zRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0TrackProjDCAposneg", "fake jet Pt, #Lambda^{0} zDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0TrackProjDCAd", "fake jet Pt, #Lambda^{0} zDCAd", HistType::kTH3D, {detJetPtAxis, detZAxis, V0DCAdAxis}); + registry.add("matching/jets/V0/fakeJetPtLambda0PtEtaPhi", "fake jet Pt, #Lambda^{0} PtEtaPhi", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0EtaAxis, v0PhiAxis}); + registry.add("matching/jets/V0/fakeJetPtLambda0PtCtau", "fake jet Pt, #Lambda^{0} PtCtau", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); + registry.add("matching/jets/V0/fakeJetPtLambda0PtMass", "fake jet Pt, #Lambda^{0} PtMass", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/fakeJetPtLambda0PtLambdaMasses", "fake jet Pt, #Lambda^{0} PtLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); + registry.add("matching/jets/V0/fakeJetPtLambda0PtRadiusCosPA", "fake jet Pt, #Lambda^{0} PtRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("matching/jets/V0/fakeJetPtLambda0PtDCAposneg", "fake jet Pt, #Lambda^{0} PtDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("matching/jets/V0/fakeJetPtLambda0PtDCAd", "fake jet Pt, #Lambda^{0} PtDCAd", HistType::kTH3D, {detJetPtAxis, v0PtAxis, v0DCAdAxis}); + registry.add("matching/jets/V0/fakeJetPtLambda0TrackProjEtaPhi", "fake jet Pt, #Lambda^{0} zEtaPhi", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0EtaAxis, v0PhiAxis}); + registry.add("matching/jets/V0/fakeJetPtLambda0TrackProjCtau", "fake jet Pt, #Lambda^{0} zCtau", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); + registry.add("matching/jets/V0/fakeJetPtLambda0TrackProjMass", "fake jet Pt, #Lambda^{0} zMass", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/fakeJetPtLambda0TrackProjLambdaMasses", "fake jet Pt, #Lambda^{0} zLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); + registry.add("matching/jets/V0/fakeJetPtLambda0TrackProjRadiusCosPA", "fake jet Pt, #Lambda^{0} zRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("matching/jets/V0/fakeJetPtLambda0TrackProjDCAposneg", "fake jet Pt, #Lambda^{0} zDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("matching/jets/V0/fakeJetPtLambda0TrackProjDCAd", "fake jet Pt, #Lambda^{0} zDCAd", HistType::kTH3D, {detJetPtAxis, detZAxis, v0DCAdAxis}); // Missed Lambda0 registry.add("matching/jets/V0/missJetPtLambda0TrackProj", "Misses", HistType::kTH2D, {partJetPtAxis, partZAxis}); - registry.add("matching/jets/V0/missJetPtLambda0PtEtaPhi", "miss jet Pt, #Lambda^{0} PtEtaPhi", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, V0EtaAxis, V0PhiAxis}); + registry.add("matching/jets/V0/missJetPtLambda0PtEtaPhi", "miss jet Pt, #Lambda^{0} PtEtaPhi", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, v0EtaAxis, v0PhiAxis}); // ----------------------------- // AntiLambda0 // ----------------------------- registry.add("matching/jets/V0/matchDetJetPtAntiLambda0TrackProjPartJetPtAntiLambda0TrackProj", "Matched", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, partJetPtAxis, partZAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0Pt", "matched jet Pt, #bar{#Lambda}^{0} Pt", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis}); + registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0Pt", "matched jet Pt, #bar{#Lambda}^{0} Pt", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis}); // Matched AntiLambda0: pt - registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtCtauLambda0", "matched jet Pt, #bar{#Lambda}^{0} Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0CtauAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtCtauAntiLambda0", "matched jet Pt, #bar{#Lambda}^{0} Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0CtauAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtCtauK0S", "matched jet Pt, #{K}^{0}_{S} Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0CtauAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtMassLambda0", "matched jet Pt, #bar{#Lambda}^{0} Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtMassAntiLambda0", "matched jet Pt, #bar{#Lambda}^{0} Pt Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtMassK0S", "matched jet Pt, #bar{#Lambda}^{0} PtMassK0S", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, K0SMassAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtAllMasses", "matched jet Pt, #bar{#Lambda}^{0} Pt, Masses", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtRadius", "matched jet Pt, #bar{#Lambda}^{0} Pt Radius", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0RadiusAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtCosPA", "matched jet Pt, #bar{#Lambda}^{0} Pt CosPA", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0CosPAAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtDCAposneg", "matched jet Pt, #bar{#Lambda}^{0} PtDCAposneg", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtDCAd", "matched jet Pt, #bar{#Lambda}^{0} PtDCAd", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0DCAdAxis}); + registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtCtauLambda0", "matched jet Pt, #bar{#Lambda}^{0} Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}); + registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtCtauAntiLambda0", "matched jet Pt, #bar{#Lambda}^{0} Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}); + registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtCtauK0S", "matched jet Pt, #{K}^{0}_{S} Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}); + registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtMassLambda0", "matched jet Pt, #bar{#Lambda}^{0} Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtMassAntiLambda0", "matched jet Pt, #bar{#Lambda}^{0} Pt Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtMassK0S", "matched jet Pt, #bar{#Lambda}^{0} PtMassK0S", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis}); + registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtAllMasses", "matched jet Pt, #bar{#Lambda}^{0} Pt, Masses", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtRadius", "matched jet Pt, #bar{#Lambda}^{0} Pt Radius", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0RadiusAxis}); + registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtCosPA", "matched jet Pt, #bar{#Lambda}^{0} Pt CosPA", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CosPAAxis}); + registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtDCAposneg", "matched jet Pt, #bar{#Lambda}^{0} PtDCAposneg", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtDCAd", "matched jet Pt, #bar{#Lambda}^{0} PtDCAd", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0DCAdAxis}); // Matched AntiLambda0: z - registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjCtauLambda0", "matched jet Pt, #bar{#Lambda}^{0} Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0CtauAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjCtauAntiLambda0", "matched jet Pt, #bar{#Lambda}^{0} Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0CtauAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjCtauK0S", "matched jet Pt, #{K}^{0}_{S} Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0CtauAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjMassLambda0", "matched jet Pt, #bar{#Lambda}^{0} Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjMassAntiLambda0", "matched jet Pt, #bar{#Lambda}^{0} Pt Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjMassK0S", "matched jet Pt, #bar{#Lambda}^{0} PtMassK0S", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, K0SMassAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjAllMasses", "matched jet Pt, #bar{#Lambda}^{0} Pt, Masses", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjRadius", "matched jet Pt, #bar{#Lambda}^{0} Pt Radius", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0RadiusAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjCosPA", "matched jet Pt, #bar{#Lambda}^{0} Pt CosPA", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0CosPAAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjDCAposneg", "matched jet Pt, #bar{#Lambda}^{0} PtDCAposneg", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjDCAd", "matched jet Pt, #bar{#Lambda}^{0} PtDCAd", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0DCAdAxis}); + registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjCtauLambda0", "matched jet Pt, #bar{#Lambda}^{0} Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}); + registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjCtauAntiLambda0", "matched jet Pt, #bar{#Lambda}^{0} Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}); + registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjCtauK0S", "matched jet Pt, #{K}^{0}_{S} Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}); + registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjMassLambda0", "matched jet Pt, #bar{#Lambda}^{0} Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjMassAntiLambda0", "matched jet Pt, #bar{#Lambda}^{0} Pt Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjMassK0S", "matched jet Pt, #bar{#Lambda}^{0} PtMassK0S", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, k0SMassAxis}); + registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjAllMasses", "matched jet Pt, #bar{#Lambda}^{0} Pt, Masses", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjRadius", "matched jet Pt, #bar{#Lambda}^{0} Pt Radius", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0RadiusAxis}); + registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjCosPA", "matched jet Pt, #bar{#Lambda}^{0} Pt CosPA", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CosPAAxis}); + registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjDCAposneg", "matched jet Pt, #bar{#Lambda}^{0} PtDCAposneg", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjDCAd", "matched jet Pt, #bar{#Lambda}^{0} PtDCAd", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0DCAdAxis}); // Fake AntiLambda0 registry.add("matching/jets/V0/fakeJetPtAntiLambda0TrackProj", "Fakes", HistType::kTH2D, {detJetPtAxis, detZAxis}); - registry.add("matching/jets/V0/fakeJetPtAntiLambda0PtEtaPhi", "fake jet Pt, #bar{#Lambda}^{0} PtEtaPhi", HistType::kTHnSparseD, {detJetPtAxis, V0PtAxis, V0EtaAxis, V0PhiAxis}); - registry.add("matching/jets/V0/fakeJetPtAntiLambda0PtCtau", "fake jet Pt, #bar{#Lambda}^{0} PtCtau", HistType::kTHnSparseD, {detJetPtAxis, V0PtAxis, V0CtauAxis, V0CtauAxis, V0CtauAxis}); - registry.add("matching/jets/V0/fakeJetPtAntiLambda0PtMass", "fake jet Pt, #bar{#Lambda}^{0} PtMass", HistType::kTHnSparseD, {detJetPtAxis, V0PtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/fakeJetPtAntiLambda0PtLambdaMasses", "fake jet Pt, #bar{#Lambda}^{0} PtLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, V0PtAxis, LambdaMassDiffAxis, LambdaMassRatioAxis, LambdaMassRelDiffAxis}); - registry.add("matching/jets/V0/fakeJetPtAntiLambda0PtRadiusCosPA", "fake jet Pt, #bar{#Lambda}^{0} PtRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, V0PtAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("matching/jets/V0/fakeJetPtAntiLambda0PtDCAposneg", "fake jet Pt, #bar{#Lambda}^{0} PtDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, V0PtAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("matching/jets/V0/fakeJetPtAntiLambda0PtDCAd", "fake jet Pt, #bar{#Lambda}^{0} PtDCAd", HistType::kTH3D, {detJetPtAxis, V0PtAxis, V0DCAdAxis}); - - registry.add("matching/jets/V0/fakeJetPtAntiLambda0TrackProjCtau", "fake jet Pt, #bar{#Lambda}^{0} zCtau", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, V0CtauAxis, V0CtauAxis, V0CtauAxis}); - registry.add("matching/jets/V0/fakeJetPtAntiLambda0TrackProjMass", "fake jet Pt, #bar{#Lambda}^{0} zMass", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/fakeJetPtAntiLambda0TrackProjLambdaMasses", "fake jet Pt, #bar{#Lambda}^{0} zLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, LambdaMassDiffAxis, LambdaMassRatioAxis, LambdaMassRelDiffAxis}); - registry.add("matching/jets/V0/fakeJetPtAntiLambda0TrackProjRadiusCosPA", "fake jet Pt, #bar{#Lambda}^{0} zRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("matching/jets/V0/fakeJetPtAntiLambda0TrackProjDCAposneg", "fake jet Pt, #bar{#Lambda}^{0} zDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("matching/jets/V0/fakeJetPtAntiLambda0TrackProjDCAd", "fake jet Pt, #bar{#Lambda}^{0} zDCAd", HistType::kTH3D, {detJetPtAxis, detZAxis, V0DCAdAxis}); + registry.add("matching/jets/V0/fakeJetPtAntiLambda0PtEtaPhi", "fake jet Pt, #bar{#Lambda}^{0} PtEtaPhi", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0EtaAxis, v0PhiAxis}); + registry.add("matching/jets/V0/fakeJetPtAntiLambda0PtCtau", "fake jet Pt, #bar{#Lambda}^{0} PtCtau", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); + registry.add("matching/jets/V0/fakeJetPtAntiLambda0PtMass", "fake jet Pt, #bar{#Lambda}^{0} PtMass", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/fakeJetPtAntiLambda0PtLambdaMasses", "fake jet Pt, #bar{#Lambda}^{0} PtLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); + registry.add("matching/jets/V0/fakeJetPtAntiLambda0PtRadiusCosPA", "fake jet Pt, #bar{#Lambda}^{0} PtRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("matching/jets/V0/fakeJetPtAntiLambda0PtDCAposneg", "fake jet Pt, #bar{#Lambda}^{0} PtDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("matching/jets/V0/fakeJetPtAntiLambda0PtDCAd", "fake jet Pt, #bar{#Lambda}^{0} PtDCAd", HistType::kTH3D, {detJetPtAxis, v0PtAxis, v0DCAdAxis}); + + registry.add("matching/jets/V0/fakeJetPtAntiLambda0TrackProjCtau", "fake jet Pt, #bar{#Lambda}^{0} zCtau", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); + registry.add("matching/jets/V0/fakeJetPtAntiLambda0TrackProjMass", "fake jet Pt, #bar{#Lambda}^{0} zMass", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/fakeJetPtAntiLambda0TrackProjLambdaMasses", "fake jet Pt, #bar{#Lambda}^{0} zLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); + registry.add("matching/jets/V0/fakeJetPtAntiLambda0TrackProjRadiusCosPA", "fake jet Pt, #bar{#Lambda}^{0} zRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("matching/jets/V0/fakeJetPtAntiLambda0TrackProjDCAposneg", "fake jet Pt, #bar{#Lambda}^{0} zDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("matching/jets/V0/fakeJetPtAntiLambda0TrackProjDCAd", "fake jet Pt, #bar{#Lambda}^{0} zDCAd", HistType::kTH3D, {detJetPtAxis, detZAxis, v0DCAdAxis}); // Missed AntiLambda0 registry.add("matching/jets/V0/missJetPtAntiLambda0TrackProj", "Misses", HistType::kTH2D, {partJetPtAxis, partZAxis}); - registry.add("matching/jets/V0/missJetPtAntiLambda0PtEtaPhi", "miss jet Pt, #bar{#Lambda}^{0} PtEtaPhi", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, V0EtaAxis, V0PhiAxis}); + registry.add("matching/jets/V0/missJetPtAntiLambda0PtEtaPhi", "miss jet Pt, #bar{#Lambda}^{0} PtEtaPhi", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, v0EtaAxis, v0PhiAxis}); // ----------------------------- // K0S // ----------------------------- registry.add("matching/jets/V0/matchDetJetPtK0STrackProjPartJetPtK0STrackProj", "Matched", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, partJetPtAxis, partZAxis}); - registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPt", "matched jet Pt, K_{S}^{0} Pt", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis}); + registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPt", "matched jet Pt, K_{S}^{0} Pt", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis}); // Matched K0S: pt - registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtCtauLambda0", "matched jet Pt, K^{0}_{S} Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0CtauAxis}); - registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtCtauAntiLambda0", "matched jet Pt, K^{0}_{S} Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0CtauAxis}); - registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtCtauK0S", "matched jet Pt, #{K}^{0}_{S} Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0CtauAxis}); - registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtMassLambda0", "matched jet Pt, K^{0}_{S} Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtMassAntiLambda0", "matched jet Pt, K^{0}_{S} Pt Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtMassK0S", "matched jet Pt, K^{0}_{S} PtMassK0S", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, K0SMassAxis}); - registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtAllMasses", "matched jet Pt, K^{0}_{S} Pt, Masses", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtRadius", "matched jet Pt, K^{0}_{S} Pt Radius", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0RadiusAxis}); - registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtCosPA", "matched jet Pt, K^{0}_{S} Pt CosPA", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0CosPAAxis}); - registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtDCAposneg", "matched jet Pt, K^{0}_{S} PtDCAposneg", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtDCAd", "matched jet Pt, K^{0}_{S} PtDCAd", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, detJetPtAxis, V0PtAxis, V0DCAdAxis}); + registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtCtauLambda0", "matched jet Pt, K^{0}_{S} Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}); + registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtCtauAntiLambda0", "matched jet Pt, K^{0}_{S} Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}); + registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtCtauK0S", "matched jet Pt, #{K}^{0}_{S} Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}); + registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtMassLambda0", "matched jet Pt, K^{0}_{S} Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtMassAntiLambda0", "matched jet Pt, K^{0}_{S} Pt Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtMassK0S", "matched jet Pt, K^{0}_{S} PtMassK0S", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis}); + registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtAllMasses", "matched jet Pt, K^{0}_{S} Pt, Masses", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtRadius", "matched jet Pt, K^{0}_{S} Pt Radius", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0RadiusAxis}); + registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtCosPA", "matched jet Pt, K^{0}_{S} Pt CosPA", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CosPAAxis}); + registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtDCAposneg", "matched jet Pt, K^{0}_{S} PtDCAposneg", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtDCAd", "matched jet Pt, K^{0}_{S} PtDCAd", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0DCAdAxis}); // Matched K0S: z - registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjCtauLambda0", "matched jet Pt, K^{0}_{S} Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0CtauAxis}); - registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjCtauAntiLambda0", "matched jet Pt, K^{0}_{S} Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0CtauAxis}); - registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjCtauK0S", "matched jet Pt, #{K}^{0}_{S} Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0CtauAxis}); - registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjMassLambda0", "matched jet Pt, K^{0}_{S} Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjMassAntiLambda0", "matched jet Pt, K^{0}_{S} Pt Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjMassK0S", "matched jet Pt, K^{0}_{S} PtMassK0S", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, K0SMassAxis}); - registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjAllMasses", "matched jet Pt, K^{0}_{S} Pt, Masses", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjRadius", "matched jet Pt, K^{0}_{S} Pt Radius", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0RadiusAxis}); - registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjCosPA", "matched jet Pt, K^{0}_{S} Pt CosPA", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0CosPAAxis}); - registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjDCAposneg", "matched jet Pt, K^{0}_{S} PtDCAposneg", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjDCAd", "matched jet Pt, K^{0}_{S} PtDCAd", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, V0DCAdAxis}); + registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjCtauLambda0", "matched jet Pt, K^{0}_{S} Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}); + registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjCtauAntiLambda0", "matched jet Pt, K^{0}_{S} Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}); + registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjCtauK0S", "matched jet Pt, #{K}^{0}_{S} Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}); + registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjMassLambda0", "matched jet Pt, K^{0}_{S} Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjMassAntiLambda0", "matched jet Pt, K^{0}_{S} Pt Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjMassK0S", "matched jet Pt, K^{0}_{S} PtMassK0S", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, k0SMassAxis}); + registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjAllMasses", "matched jet Pt, K^{0}_{S} Pt, Masses", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjRadius", "matched jet Pt, K^{0}_{S} Pt Radius", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0RadiusAxis}); + registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjCosPA", "matched jet Pt, K^{0}_{S} Pt CosPA", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CosPAAxis}); + registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjDCAposneg", "matched jet Pt, K^{0}_{S} PtDCAposneg", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjDCAd", "matched jet Pt, K^{0}_{S} PtDCAd", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0DCAdAxis}); // Fake K0S registry.add("matching/jets/V0/fakeJetPtK0STrackProj", "Fakes", HistType::kTH2D, {detJetPtAxis, detZAxis}); - registry.add("matching/jets/V0/fakeJetPtK0SPtEtaPhi", "fake jet Pt, K^{0}_{S} PtEtaPhi", HistType::kTHnSparseD, {detJetPtAxis, V0PtAxis, V0EtaAxis, V0PhiAxis}); - registry.add("matching/jets/V0/fakeJetPtK0SPtCtau", "fake jet Pt, K^{0}_{S} PtCtau", HistType::kTHnSparseD, {detJetPtAxis, V0PtAxis, V0CtauAxis, V0CtauAxis, V0CtauAxis}); - registry.add("matching/jets/V0/fakeJetPtK0SPtMass", "fake jet Pt, K^{0}_{S} PtMass", HistType::kTHnSparseD, {detJetPtAxis, V0PtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/fakeJetPtK0SPtLambdaMasses", "fake jet Pt, K^{0}_{S} PtLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, V0PtAxis, LambdaMassDiffAxis, LambdaMassRatioAxis, LambdaMassRelDiffAxis}); - registry.add("matching/jets/V0/fakeJetPtK0SPtRadiusCosPA", "fake jet Pt, K^{0}_{S} PtRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, V0PtAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("matching/jets/V0/fakeJetPtK0SPtDCAposneg", "fake jet Pt, K^{0}_{S} PtDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, V0PtAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("matching/jets/V0/fakeJetPtK0SPtDCAd", "fake jet Pt, K^{0}_{S} PtDCAd", HistType::kTH3D, {detJetPtAxis, V0PtAxis, V0DCAdAxis}); - - registry.add("matching/jets/V0/fakeJetPtK0STrackProjCtau", "fake jet Pt, K^{0}_{S} zCtau", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, V0CtauAxis, V0CtauAxis, V0CtauAxis}); - registry.add("matching/jets/V0/fakeJetPtK0STrackProjMass", "fake jet Pt, K^{0}_{S} zMass", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/fakeJetPtK0STrackProjLambdaMasses", "fake jet Pt, K^{0}_{S} zLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, LambdaMassDiffAxis, LambdaMassRatioAxis, LambdaMassRelDiffAxis}); - registry.add("matching/jets/V0/fakeJetPtK0STrackProjRadiusCosPA", "fake jet Pt, K^{0}_{S} zRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("matching/jets/V0/fakeJetPtK0STrackProjDCAposneg", "fake jet Pt, K^{0}_{S} zDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("matching/jets/V0/fakeJetPtK0STrackProjDCAd", "fake jet Pt, K^{0}_{S} zDCAd", HistType::kTH3D, {detJetPtAxis, detZAxis, V0DCAdAxis}); + registry.add("matching/jets/V0/fakeJetPtK0SPtEtaPhi", "fake jet Pt, K^{0}_{S} PtEtaPhi", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0EtaAxis, v0PhiAxis}); + registry.add("matching/jets/V0/fakeJetPtK0SPtCtau", "fake jet Pt, K^{0}_{S} PtCtau", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); + registry.add("matching/jets/V0/fakeJetPtK0SPtMass", "fake jet Pt, K^{0}_{S} PtMass", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/fakeJetPtK0SPtLambdaMasses", "fake jet Pt, K^{0}_{S} PtLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); + registry.add("matching/jets/V0/fakeJetPtK0SPtRadiusCosPA", "fake jet Pt, K^{0}_{S} PtRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("matching/jets/V0/fakeJetPtK0SPtDCAposneg", "fake jet Pt, K^{0}_{S} PtDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("matching/jets/V0/fakeJetPtK0SPtDCAd", "fake jet Pt, K^{0}_{S} PtDCAd", HistType::kTH3D, {detJetPtAxis, v0PtAxis, v0DCAdAxis}); + + registry.add("matching/jets/V0/fakeJetPtK0STrackProjCtau", "fake jet Pt, K^{0}_{S} zCtau", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); + registry.add("matching/jets/V0/fakeJetPtK0STrackProjMass", "fake jet Pt, K^{0}_{S} zMass", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/fakeJetPtK0STrackProjLambdaMasses", "fake jet Pt, K^{0}_{S} zLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); + registry.add("matching/jets/V0/fakeJetPtK0STrackProjRadiusCosPA", "fake jet Pt, K^{0}_{S} zRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("matching/jets/V0/fakeJetPtK0STrackProjDCAposneg", "fake jet Pt, K^{0}_{S} zDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("matching/jets/V0/fakeJetPtK0STrackProjDCAd", "fake jet Pt, K^{0}_{S} zDCAd", HistType::kTH3D, {detJetPtAxis, detZAxis, v0DCAdAxis}); // Missed K0S registry.add("matching/jets/V0/missJetPtK0STrackProj", "Misses", HistType::kTH2D, {partJetPtAxis, partZAxis}); - registry.add("matching/jets/V0/missJetPtK0SPtEtaPhi", "miss jet Pt, K^{0}_{S} PtEtaPhi", HistType::kTHnSparseD, {partJetPtAxis, V0PtAxis, V0EtaAxis, V0PhiAxis}); + registry.add("matching/jets/V0/missJetPtK0SPtEtaPhi", "miss jet Pt, K^{0}_{S} PtEtaPhi", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, v0EtaAxis, v0PhiAxis}); // Reflections - registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtLambda0Reflection", "Lambda0 Reflection", HistType::kTHnSparseD, {partJetPtAxis, V0partPtAxis, detJetPtAxis, V0detPtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjLambda0Reflection", "Lambda0 Reflection", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtAntiLambda0Reflection", "antiLambda0 Reflection", HistType::kTHnSparseD, {partJetPtAxis, V0partPtAxis, detJetPtAxis, V0detPtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjAntiLambda0Reflection", "antiLambda0 Reflection", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis, LambdaMassAxis}); + registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtLambda0Reflection", "Lambda0 Reflection", HistType::kTHnSparseD, {partJetPtAxis, v0partPtAxis, detJetPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjLambda0Reflection", "Lambda0 Reflection", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtAntiLambda0Reflection", "antiLambda0 Reflection", HistType::kTHnSparseD, {partJetPtAxis, v0partPtAxis, detJetPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjAntiLambda0Reflection", "antiLambda0 Reflection", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis, lambdaMassAxis}); } // doprocessMcMatchedV0Frag if (doprocessMcMatchedV0JetsFrag) { - registry.add("matching/V0/fakeV0PtEtaPhi", "fakeV0PtEtaPhi", HistType::kTH3D, {V0PtAxis, V0EtaAxis, V0PhiAxis}); - registry.add("matching/V0/fakeV0PtCtau", "fakeV0PtCtau", HistType::kTHnSparseD, {V0PtAxis, V0CtauAxis, V0CtauAxis, V0CtauAxis}); - registry.add("matching/V0/fakeV0PtMass", "fakeV0PtMass", HistType::kTHnSparseD, {V0PtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/V0/fakeV0PtLambdaMasses", "fakeV0PtLambdaMasses", HistType::kTHnSparseD, {V0PtAxis, LambdaMassDiffAxis, LambdaMassRatioAxis, LambdaMassRelDiffAxis}); - registry.add("matching/V0/fakeV0PtRadiusCosPA", "fakeV0PtRadiusCosPA", HistType::kTH3D, {V0PtAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("matching/V0/fakeV0PtDCAposneg", "fakeV0PtDCAposneg", HistType::kTH3D, {V0PtAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("matching/V0/fakeV0PtDCAd", "fakeV0PtDCAd", HistType::kTH2D, {V0PtAxis, V0DCAdAxis}); + registry.add("matching/V0/fakeV0PtEtaPhi", "fakeV0PtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); + registry.add("matching/V0/fakeV0PtCtau", "fakeV0PtCtau", HistType::kTHnSparseD, {v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); + registry.add("matching/V0/fakeV0PtMass", "fakeV0PtMass", HistType::kTHnSparseD, {v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/V0/fakeV0PtLambdaMasses", "fakeV0PtLambdaMasses", HistType::kTHnSparseD, {v0PtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); + registry.add("matching/V0/fakeV0PtRadiusCosPA", "fakeV0PtRadiusCosPA", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("matching/V0/fakeV0PtDCAposneg", "fakeV0PtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("matching/V0/fakeV0PtDCAd", "fakeV0PtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}); registry.add("matching/V0/fakeV0PosTrackPtEtaPhi", "fakeV0PosTrackPtEtaPhi", HistType::kTH3D, {trackPtAxis, etaAxis, phiAxis}); registry.add("matching/V0/fakeV0NegTrackPtEtaPhi", "fakeV0NegTrackPtEtaPhi", HistType::kTH3D, {trackPtAxis, etaAxis, phiAxis}); @@ -802,63 +807,63 @@ struct JetFragmentation { registry.add("matching/V0/V0PosPartPtRatioPtRelDiffPt", "V0PosPartPtRatioRelDiffPt", HistType::kTH3D, {trackPtAxis, ptRatioAxis, ptTrackRelDiffAxis}); registry.add("matching/V0/V0NegPartPtRatioPtRelDiffPt", "V0NegPartPtRatioRelDiffPt", HistType::kTH3D, {trackPtAxis, ptRatioAxis, ptTrackRelDiffAxis}); - registry.add("matching/jets/V0/partJetPtDetJetPtPartV0PtPosPtRatioPtRelDiffPt", "V0PtPosPartPtRatioRelDiffPt", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, V0PtAxis, trackPtAxis, ptRatioAxis, ptTrackRelDiffAxis}); - registry.add("matching/jets/V0/partJetPtDetJetPtPartV0PtNegPtRatioPtRelDiffPt", "V0PtNegPartPtRatioRelDiffPt", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, V0PtAxis, trackPtAxis, ptRatioAxis, ptTrackRelDiffAxis}); - - registry.add("matching/V0/nonedecayedFakeV0PtMass", "nonedecayedFakeV0PtMass", HistType::kTHnSparseD, {V0PtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/V0/doubledecayedFakeV0PtMass", "doubledecayedFakeV0PtMass", HistType::kTHnSparseD, {V0PtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/V0/decayedK0SV0PtMass", "decayedK0SV0PtMass", HistType::kTHnSparseD, {V0partPtAxis, V0detPtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/V0/decayedLambdaV0PtMass", "decayedLambdaV0PtMass", HistType::kTHnSparseD, {V0partPtAxis, V0detPtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/V0/decayedAntiLambdaV0PtMass", "decayedAntiLambdaV0PtMass", HistType::kTHnSparseD, {V0partPtAxis, V0detPtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/V0/decayedOtherPtV0PtMass", "decayedOtherPtV0PtMass", HistType::kTHnSparseD, {V0partPtAxis, V0detPtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - - registry.add("matching/jets/V0/nonedecayedFakeV0PtMass", "nonedecayedFakeV0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, V0PtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/nonedecayedFakeV0TrackProjMass", "nonedecayedFakeV0TrackProjMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, zAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/doubledecayedFakeV0PtMass", "doubledecayedFakeV0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, V0PtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/doubledecayedFakeV0TrackProjMass", "doubledecayedFakeV0TrackProjMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, zAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/decayedK0SV0PtMass", "decayedK0SV0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, V0partPtAxis, V0detPtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/decayedK0SV0TrackProjMass", "decayedK0SV0TrackProjMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, partZAxis, detZAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/decayedLambdaV0PtMass", "decayedLambdaV0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, V0partPtAxis, V0detPtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/decayedLambdaV0TrackProjMass", "decayedLambdaV0TrackProjMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, partZAxis, detZAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/decayedAntiLambdaV0PtMass", "decayedAntiLambdaV0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, V0partPtAxis, V0detPtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/decayedAntiLambdaV0TrackProjMass", "decayedAntiLambdaV0TrackProjMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, partZAxis, detZAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/decayedOtherPtV0PtMass", "decayedOtherPtV0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, V0partPtAxis, V0detPtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/jets/V0/decayedOtherPtV0TrackProjMass", "decayedOtherPtV0TrackProjMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, partZAxis, detZAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); + registry.add("matching/jets/V0/partJetPtDetJetPtPartV0PtPosPtRatioPtRelDiffPt", "V0PtPosPartPtRatioRelDiffPt", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0PtAxis, trackPtAxis, ptRatioAxis, ptTrackRelDiffAxis}); + registry.add("matching/jets/V0/partJetPtDetJetPtPartV0PtNegPtRatioPtRelDiffPt", "V0PtNegPartPtRatioRelDiffPt", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0PtAxis, trackPtAxis, ptRatioAxis, ptTrackRelDiffAxis}); + + registry.add("matching/V0/nonedecayedFakeV0PtMass", "nonedecayedFakeV0PtMass", HistType::kTHnSparseD, {v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/V0/doubledecayedFakeV0PtMass", "doubledecayedFakeV0PtMass", HistType::kTHnSparseD, {v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/V0/decayedK0SV0PtMass", "decayedK0SV0PtMass", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/V0/decayedLambdaV0PtMass", "decayedLambdaV0PtMass", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/V0/decayedAntiLambdaV0PtMass", "decayedAntiLambdaV0PtMass", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/V0/decayedOtherPtV0PtMass", "decayedOtherPtV0PtMass", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + + registry.add("matching/jets/V0/nonedecayedFakeV0PtMass", "nonedecayedFakeV0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/nonedecayedFakeV0TrackProjMass", "nonedecayedFakeV0TrackProjMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, zAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/doubledecayedFakeV0PtMass", "doubledecayedFakeV0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/doubledecayedFakeV0TrackProjMass", "doubledecayedFakeV0TrackProjMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, zAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/decayedK0SV0PtMass", "decayedK0SV0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/decayedK0SV0TrackProjMass", "decayedK0SV0TrackProjMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, partZAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/decayedLambdaV0PtMass", "decayedLambdaV0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/decayedLambdaV0TrackProjMass", "decayedLambdaV0TrackProjMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, partZAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/decayedAntiLambdaV0PtMass", "decayedAntiLambdaV0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/decayedAntiLambdaV0TrackProjMass", "decayedAntiLambdaV0TrackProjMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, partZAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/decayedOtherPtV0PtMass", "decayedOtherPtV0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/jets/V0/decayedOtherPtV0TrackProjMass", "decayedOtherPtV0TrackProjMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, partZAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); } // doprocessMcMatchedV0JetsFrag if (doprocessDataV0PerpCone) { - registry.add("data/PC/JetPtEtaV0Pt", "JetPtEtaV0Pt", HistType::kTH3D, {jetPtAxis, etaAxis, V0PtAxis}); - registry.add("data/PC/V0PtEtaPhi", "V0 #it{p}_{T}, #eta, #phi", HistType::kTH3D, {V0PtAxis, V0EtaAxis, V0PhiAxis}); - registry.add("data/PC/V0PtCtau", "V0PtCtau", HistType::kTHnSparseD, {V0PtAxis, V0CtauAxis, V0CtauAxis, V0CtauAxis}); - registry.add("data/PC/V0PtMass", "V0PtMass", HistType::kTHnSparseD, {V0PtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("data/PC/V0PtMassWide", "V0PtMassWide", HistType::kTHnSparseD, {V0PtAxis, K0SWideAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("data/PC/V0PtRadiusCosPA", "V0PtRadiusCosPA", HistType::kTH3D, {V0PtAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("data/PC/V0PtDCAposneg", "V0PtDCAposneg", HistType::kTH3D, {V0PtAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("data/PC/V0PtDCAd", "V0PtDCAd", HistType::kTH2D, {V0PtAxis, V0DCAdAxis}); - - registry.add("data/PC/JetPtEtaLambda0Pt", "JetPtEtaLambda0Pt", HistType::kTH3D, {jetPtAxis, etaAxis, V0PtAxis}); - registry.add("data/PC/JetPtLambda0PtMass", "JetPtLambda0PtMass", HistType::kTH3D, {jetPtAxis, V0PtAxis, LambdaMassAxis}); - registry.add("data/PC/LambdaPtEtaPhi", "LambdaPtEtaPhi", HistType::kTH3D, {V0PtAxis, V0EtaAxis, V0PhiAxis}); - registry.add("data/PC/LambdaPtCtauMass", "LambdaPtCtauMass", HistType::kTH3D, {V0PtAxis, V0CtauAxis, LambdaMassAxis}); - registry.add("data/PC/LambdaPtRadiusCosPA", "LambdaPtRadiusCosPA", HistType::kTH3D, {V0PtAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("data/PC/LambdaPtDCAposneg", "LambdaPtDCAposneg", HistType::kTH3D, {V0PtAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("data/PC/LambdaPtDCAd", "LambdaPtDCAd", HistType::kTH2D, {V0PtAxis, V0DCAdAxis}); - - registry.add("data/PC/JetPtEtaAntiLambda0Pt", "JetPtEtaAntiLambda0Pt", HistType::kTH3D, {jetPtAxis, etaAxis, V0PtAxis}); - registry.add("data/PC/JetPtAntiLambda0PtMass", "JetPtAntiLambda0PtMass", HistType::kTH3D, {jetPtAxis, V0PtAxis, LambdaMassAxis}); - registry.add("data/PC/antiLambdaPtEtaPhi", "antiLambdaPtEtaPhi", HistType::kTH3D, {V0PtAxis, V0EtaAxis, V0PhiAxis}); - registry.add("data/PC/antiLambdaPtCtauMass", "antiLambdaPtCtauMass", HistType::kTH3D, {V0PtAxis, V0CtauAxis, LambdaMassAxis}); - registry.add("data/PC/antiLambdaPtRadiusCosPA", "antiLambdaPtRadiusCosPA", HistType::kTH3D, {V0PtAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("data/PC/antiLambdaPtDCAposneg", "antiLambdaPtDCAposneg", HistType::kTH3D, {V0PtAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("data/PC/antiLambdaPtDCAd", "antiLambdaPtDCAd", HistType::kTH2D, {V0PtAxis, V0DCAdAxis}); - - registry.add("data/PC/JetPtEtaK0SPt", "JetPtEtaK0SPt", HistType::kTH3D, {jetPtAxis, etaAxis, V0PtAxis}); - registry.add("data/PC/JetPtK0SPtMass", "JetPtK0SPtMass", HistType::kTH3D, {jetPtAxis, V0PtAxis, K0SMassAxis}); - registry.add("data/PC/K0SPtEtaPhi", "K0SPtEtaPhi", HistType::kTH3D, {V0PtAxis, V0EtaAxis, V0PhiAxis}); - registry.add("data/PC/K0SPtCtauMass", "K0SPtCtauMass", HistType::kTH3D, {V0PtAxis, V0CtauAxis, K0SMassAxis}); - registry.add("data/PC/K0SPtRadiusCosPA", "K0SPtRadiusCosPA", HistType::kTH3D, {V0PtAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("data/PC/K0SPtDCAposneg", "K0SPtDCAposneg", HistType::kTH3D, {V0PtAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("data/PC/K0SPtDCAd", "K0SPtDCAd", HistType::kTH2D, {V0PtAxis, V0DCAdAxis}); + registry.add("data/PC/JetPtEtaV0Pt", "JetPtEtaV0Pt", HistType::kTH3D, {jetPtAxis, etaAxis, v0PtAxis}); + registry.add("data/PC/V0PtEtaPhi", "V0 #it{p}_{T}, #eta, #phi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); + registry.add("data/PC/V0PtCtau", "V0PtCtau", HistType::kTHnSparseD, {v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); + registry.add("data/PC/V0PtMass", "V0PtMass", HistType::kTHnSparseD, {v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("data/PC/V0PtMassWide", "V0PtMassWide", HistType::kTHnSparseD, {v0PtAxis, k0SWideAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("data/PC/V0PtRadiusCosPA", "V0PtRadiusCosPA", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("data/PC/V0PtDCAposneg", "V0PtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("data/PC/V0PtDCAd", "V0PtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}); + + registry.add("data/PC/JetPtEtaLambda0Pt", "JetPtEtaLambda0Pt", HistType::kTH3D, {jetPtAxis, etaAxis, v0PtAxis}); + registry.add("data/PC/JetPtLambda0PtMass", "JetPtLambda0PtMass", HistType::kTH3D, {jetPtAxis, v0PtAxis, lambdaMassAxis}); + registry.add("data/PC/LambdaPtEtaPhi", "LambdaPtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); + registry.add("data/PC/LambdaPtCtauMass", "LambdaPtCtauMass", HistType::kTH3D, {v0PtAxis, v0CtauAxis, lambdaMassAxis}); + registry.add("data/PC/LambdaPtRadiusCosPA", "LambdaPtRadiusCosPA", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("data/PC/LambdaPtDCAposneg", "LambdaPtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("data/PC/LambdaPtDCAd", "LambdaPtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}); + + registry.add("data/PC/JetPtEtaAntiLambda0Pt", "JetPtEtaAntiLambda0Pt", HistType::kTH3D, {jetPtAxis, etaAxis, v0PtAxis}); + registry.add("data/PC/JetPtAntiLambda0PtMass", "JetPtAntiLambda0PtMass", HistType::kTH3D, {jetPtAxis, v0PtAxis, lambdaMassAxis}); + registry.add("data/PC/antiLambdaPtEtaPhi", "antiLambdaPtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); + registry.add("data/PC/antiLambdaPtCtauMass", "antiLambdaPtCtauMass", HistType::kTH3D, {v0PtAxis, v0CtauAxis, lambdaMassAxis}); + registry.add("data/PC/antiLambdaPtRadiusCosPA", "antiLambdaPtRadiusCosPA", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("data/PC/antiLambdaPtDCAposneg", "antiLambdaPtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("data/PC/antiLambdaPtDCAd", "antiLambdaPtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}); + + registry.add("data/PC/JetPtEtaK0SPt", "JetPtEtaK0SPt", HistType::kTH3D, {jetPtAxis, etaAxis, v0PtAxis}); + registry.add("data/PC/JetPtK0SPtMass", "JetPtK0SPtMass", HistType::kTH3D, {jetPtAxis, v0PtAxis, k0SMassAxis}); + registry.add("data/PC/K0SPtEtaPhi", "K0SPtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); + registry.add("data/PC/K0SPtCtauMass", "K0SPtCtauMass", HistType::kTH3D, {v0PtAxis, v0CtauAxis, k0SMassAxis}); + registry.add("data/PC/K0SPtRadiusCosPA", "K0SPtRadiusCosPA", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("data/PC/K0SPtDCAposneg", "K0SPtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("data/PC/K0SPtDCAd", "K0SPtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}); registry.add("data/PC/nV0sConePtEta", "nV0sConePtEta", HistType::kTH3D, {v0Count, jetPtAxis, etaAxis}); registry.add("data/PC/ConePtEtaPhi", "ConePtEtaPhi", HistType::kTH3D, {jetPtAxis, etaAxis, phiAxis}); @@ -866,25 +871,28 @@ struct JetFragmentation { } // doprocessDataV0PerpCone if (doprocessMcV0PerpCone) { - registry.add("mcd/PC/jetPtEtaFakeV0Pt", "JetPtEtaFakeV0Pt", HistType::kTH3D, {detJetPtAxis, etaAxis, V0PtAxis}); - registry.add("mcd/PC/fakeV0PtEtaPhi", "fakeV0PtEtaPhi", HistType::kTH3D, {V0PtAxis, V0EtaAxis, V0PhiAxis}); - registry.add("mcd/PC/fakeV0PtCtau", "fakeV0PtCtau", HistType::kTHnSparseD, {V0PtAxis, V0CtauAxis, V0CtauAxis, V0CtauAxis}); - registry.add("mcd/PC/fakeV0PtMass", "fakeV0PtMass", HistType::kTHnSparseD, {V0PtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("mcd/PC/fakeV0PtRadiusCosPA", "fakeV0PtRadiusCosPA", HistType::kTH3D, {V0PtAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("mcd/PC/fakeV0PtDCAposneg", "fakeV0PtDCAposneg", HistType::kTH3D, {V0PtAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("mcd/PC/fakeV0PtDCAd", "fakeV0PtDCAd", HistType::kTH2D, {V0PtAxis, V0DCAdAxis}); - registry.add("mcd/PC/jetPtEtaMatchedV0Pt", "JetPtEtaMatchedV0Pt", HistType::kTH3D, {detJetPtAxis, etaAxis, V0PtAxis}); - - registry.add("mcd/PC/matchedV0PtEtaPhi", "matchedV0PtEtaPhi", HistType::kTH3D, {V0PtAxis, V0EtaAxis, V0PhiAxis}); - registry.add("mcd/PC/matchedV0PtCtau", "matchedV0PtCtau", HistType::kTHnSparseD, {V0PtAxis, V0CtauAxis, V0CtauAxis, V0CtauAxis}); - registry.add("mcd/PC/matchedV0PtMass", "matchedV0PtMass", HistType::kTHnSparseD, {V0PtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("mcd/PC/matchedV0PtRadiusCosPA", "matchedV0PtRadiusCosPA", HistType::kTH3D, {V0PtAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("mcd/PC/matchedV0PtDCAposneg", "matchedV0PtDCAposneg", HistType::kTH3D, {V0PtAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("mcd/PC/matchedV0PtDCAd", "matchedV0PtDCAd", HistType::kTH2D, {V0PtAxis, V0DCAdAxis}); - - registry.add("mcd/PC/matchedJetPtK0SPtMass", "matchedJetPtK0SPtMass", HistType::kTH3D, {detJetPtAxis, V0PtAxis, K0SMassAxis}); - registry.add("mcd/PC/matchedJetPtLambda0PtMass", "matchedJetPtLambda0PtMass", HistType::kTH3D, {detJetPtAxis, V0PtAxis, LambdaMassAxis}); - registry.add("mcd/PC/matchedJetPtAntiLambda0PtMass", "matchedJetPtAntiLambda0PtMass", HistType::kTH3D, {detJetPtAxis, V0PtAxis, LambdaMassAxis}); + registry.add("mcd/V0/nV0sEvent", "NV0s in event", HistType::kTH1D, {v0Count}); + registry.add("mcd/V0/nV0sEventWeighted", "NV0s in event weighted", HistType::kTH1D, {v0Count}); + + registry.add("mcd/PC/jetPtEtaFakeV0Pt", "JetPtEtaFakeV0Pt", HistType::kTH3D, {detJetPtAxis, etaAxis, v0PtAxis}); + registry.add("mcd/PC/fakeV0PtEtaPhi", "fakeV0PtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); + registry.add("mcd/PC/fakeV0PtCtau", "fakeV0PtCtau", HistType::kTHnSparseD, {v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); + registry.add("mcd/PC/fakeV0PtMass", "fakeV0PtMass", HistType::kTHnSparseD, {v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("mcd/PC/fakeV0PtRadiusCosPA", "fakeV0PtRadiusCosPA", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("mcd/PC/fakeV0PtDCAposneg", "fakeV0PtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("mcd/PC/fakeV0PtDCAd", "fakeV0PtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}); + registry.add("mcd/PC/jetPtEtaMatchedV0Pt", "JetPtEtaMatchedV0Pt", HistType::kTH3D, {detJetPtAxis, etaAxis, v0PtAxis}); + + registry.add("mcd/PC/matchedV0PtEtaPhi", "matchedV0PtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); + registry.add("mcd/PC/matchedV0PtCtau", "matchedV0PtCtau", HistType::kTHnSparseD, {v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); + registry.add("mcd/PC/matchedV0PtMass", "matchedV0PtMass", HistType::kTHnSparseD, {v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("mcd/PC/matchedV0PtRadiusCosPA", "matchedV0PtRadiusCosPA", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("mcd/PC/matchedV0PtDCAposneg", "matchedV0PtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("mcd/PC/matchedV0PtDCAd", "matchedV0PtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}); + + registry.add("mcd/PC/matchedJetPtK0SPtMass", "matchedJetPtK0SPtMass", HistType::kTH3D, {detJetPtAxis, v0PtAxis, k0SMassAxis}); + registry.add("mcd/PC/matchedJetPtLambda0PtMass", "matchedJetPtLambda0PtMass", HistType::kTH3D, {detJetPtAxis, v0PtAxis, lambdaMassAxis}); + registry.add("mcd/PC/matchedJetPtAntiLambda0PtMass", "matchedJetPtAntiLambda0PtMass", HistType::kTH3D, {detJetPtAxis, v0PtAxis, lambdaMassAxis}); registry.add("mcd/PC/matchednV0sConePtEta", "matchednV0sConePtEta", HistType::kTH3D, {v0Count, detJetPtAxis, etaAxis}); registry.add("mcd/PC/matchedConePtEtaPhi", "matchedConePtEtaPhi", HistType::kTH3D, {detJetPtAxis, etaAxis, phiAxis}); registry.add("mcd/PC/matchedJetPtEtaConePt", "matchedJetPtEtaConePt", HistType::kTH3D, {detJetPtAxis, etaAxis, detJetPtAxis}); @@ -895,30 +903,30 @@ struct JetFragmentation { } // doprocessMcV0PerpCone if (doprocessMcV0MatchedPerpCone) { - registry.add("matching/PC/jetPtEtaFakeV0Pt", "JetPtEtaFakeV0Pt", HistType::kTH3D, {detJetPtAxis, etaAxis, V0PtAxis}); - registry.add("matching/PC/jetsPtFakeV0Pt", "jetsPtFakeV0Pt", HistType::kTH3D, {partJetPtAxis, detJetPtAxis, V0PtAxis}); - registry.add("matching/PC/fakeV0PtEtaPhi", "fakeV0PtEtaPhi", HistType::kTH3D, {V0PtAxis, V0EtaAxis, V0PhiAxis}); - registry.add("matching/PC/fakeV0PtCtau", "fakeV0PtCtau", HistType::kTHnSparseD, {V0PtAxis, V0CtauAxis, V0CtauAxis, V0CtauAxis}); - registry.add("matching/PC/fakeV0PtMass", "fakeV0PtMass", HistType::kTHnSparseD, {V0PtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/PC/fakeV0PtRadiusCosPA", "fakeV0PtRadiusCosPA", HistType::kTH3D, {V0PtAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("matching/PC/fakeV0PtDCAposneg", "fakeV0PtDCAposneg", HistType::kTH3D, {V0PtAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("matching/PC/fakeV0PtDCAd", "fakeV0PtDCAd", HistType::kTH2D, {V0PtAxis, V0DCAdAxis}); - - registry.add("matching/PC/jetPtEtaMatchedV0Pt", "jetPtEtaMatchedV0Pt", HistType::kTH3D, {detJetPtAxis, etaAxis, V0PtAxis}); - registry.add("matching/PC/jetsPtMatchedV0Pt", "jetsPtMatchedV0Pt", HistType::kTH3D, {partJetPtAxis, detJetPtAxis, V0PtAxis}); - registry.add("matching/PC/matchedV0PtEtaPhi", "matchedV0PtEtaPhi", HistType::kTH3D, {V0PtAxis, V0EtaAxis, V0PhiAxis}); - registry.add("matching/PC/matchedV0PtCtau", "matchedV0PtCtau", HistType::kTHnSparseD, {V0PtAxis, V0CtauAxis, V0CtauAxis, V0CtauAxis}); - registry.add("matching/PC/matchedV0PtMass", "matchedV0PtMass", HistType::kTHnSparseD, {V0PtAxis, K0SMassAxis, LambdaMassAxis, LambdaMassAxis}); - registry.add("matching/PC/matchedV0PtRadiusCosPA", "matchedV0PtRadiusCosPA", HistType::kTH3D, {V0PtAxis, V0RadiusAxis, V0CosPAAxis}); - registry.add("matching/PC/matchedV0PtDCAposneg", "matchedV0PtDCAposneg", HistType::kTH3D, {V0PtAxis, V0DCApAxis, V0DCAnAxis}); - registry.add("matching/PC/matchedV0PtDCAd", "matchedV0PtDCAd", HistType::kTH2D, {V0PtAxis, V0DCAdAxis}); - - registry.add("matching/PC/matchedJetPtK0SPtMass", "matchedJetPtK0SPtMass", HistType::kTH3D, {detJetPtAxis, V0PtAxis, K0SMassAxis}); - registry.add("matching/PC/matchedJetsPtK0SPtMass", "matchedJetsPtK0SPtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, V0PtAxis, K0SMassAxis}); - registry.add("matching/PC/matchedJetPtLambda0PtMass", "matchedJetPtLambda0PtMass", HistType::kTH3D, {detJetPtAxis, V0PtAxis, LambdaMassAxis}); - registry.add("matching/PC/matchedJetsPtLambda0PtMass", "matchedJetsPtLambda0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, V0PtAxis, LambdaMassAxis}); - registry.add("matching/PC/matchedJetPtAntiLambda0PtMass", "matchedJetPtAntiLambda0PtMass", HistType::kTH3D, {detJetPtAxis, V0PtAxis, LambdaMassAxis}); - registry.add("matching/PC/matchedJetsPtAntiLambda0PtMass", "matchedJetsPtAntiLambda0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, V0PtAxis, LambdaMassAxis}); + registry.add("matching/PC/jetPtEtaFakeV0Pt", "JetPtEtaFakeV0Pt", HistType::kTH3D, {detJetPtAxis, etaAxis, v0PtAxis}); + registry.add("matching/PC/jetsPtFakeV0Pt", "jetsPtFakeV0Pt", HistType::kTH3D, {partJetPtAxis, detJetPtAxis, v0PtAxis}); + registry.add("matching/PC/fakeV0PtEtaPhi", "fakeV0PtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); + registry.add("matching/PC/fakeV0PtCtau", "fakeV0PtCtau", HistType::kTHnSparseD, {v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); + registry.add("matching/PC/fakeV0PtMass", "fakeV0PtMass", HistType::kTHnSparseD, {v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/PC/fakeV0PtRadiusCosPA", "fakeV0PtRadiusCosPA", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("matching/PC/fakeV0PtDCAposneg", "fakeV0PtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("matching/PC/fakeV0PtDCAd", "fakeV0PtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}); + + registry.add("matching/PC/jetPtEtaMatchedV0Pt", "jetPtEtaMatchedV0Pt", HistType::kTH3D, {detJetPtAxis, etaAxis, v0PtAxis}); + registry.add("matching/PC/jetsPtMatchedV0Pt", "jetsPtMatchedV0Pt", HistType::kTH3D, {partJetPtAxis, detJetPtAxis, v0PtAxis}); + registry.add("matching/PC/matchedV0PtEtaPhi", "matchedV0PtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); + registry.add("matching/PC/matchedV0PtCtau", "matchedV0PtCtau", HistType::kTHnSparseD, {v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); + registry.add("matching/PC/matchedV0PtMass", "matchedV0PtMass", HistType::kTHnSparseD, {v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/PC/matchedV0PtRadiusCosPA", "matchedV0PtRadiusCosPA", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("matching/PC/matchedV0PtDCAposneg", "matchedV0PtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("matching/PC/matchedV0PtDCAd", "matchedV0PtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}); + + registry.add("matching/PC/matchedJetPtK0SPtMass", "matchedJetPtK0SPtMass", HistType::kTH3D, {detJetPtAxis, v0PtAxis, k0SMassAxis}); + registry.add("matching/PC/matchedJetsPtK0SPtMass", "matchedJetsPtK0SPtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis}); + registry.add("matching/PC/matchedJetPtLambda0PtMass", "matchedJetPtLambda0PtMass", HistType::kTH3D, {detJetPtAxis, v0PtAxis, lambdaMassAxis}); + registry.add("matching/PC/matchedJetsPtLambda0PtMass", "matchedJetsPtLambda0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}); + registry.add("matching/PC/matchedJetPtAntiLambda0PtMass", "matchedJetPtAntiLambda0PtMass", HistType::kTH3D, {detJetPtAxis, v0PtAxis, lambdaMassAxis}); + registry.add("matching/PC/matchedJetsPtAntiLambda0PtMass", "matchedJetsPtAntiLambda0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}); registry.add("matching/PC/matchednV0sConePtEta", "matchednV0sConePtEta", HistType::kTH3D, {v0Count, detJetPtAxis, etaAxis}); registry.add("matching/PC/matchedConePtEtaPhi", "matchedConePtEtaPhi", HistType::kTH3D, {detJetPtAxis, etaAxis, phiAxis}); @@ -932,49 +940,46 @@ struct JetFragmentation { } // doprocessMcV0MatchedPerpCone } // init - // TODO: This should contain a lookup table or function containing the various V0 weights + // TODO: This is filled with dummy values for now + // Should be made to return purity for a V0 based on species and pt + template + float getV0Purity(V const& v0) + { + if (v0.isK0SCandidate()) { + return 0.5; + } + if (v0.isLambdaCandidate()) { + return 0.5; + } + if (v0.isAntiLambdaCandidate()) { + return 0.5; + } + return 0.; // Background + } // Returns a std::vector of weights for a particle - template - std::vector getV0SignalWeight(C const& coll, V const& v0) + template + std::vector getV0SignalWeight(V const& v0) { // 0: bkg, 1: K0S, 2: Lambda, 3: AntiLambda - std::vector w(4, 0.); - double purity = 0.8; // TODO: need getter to set this - - bool isK = IsK0SCandidate(coll, v0); - bool isL = IsLambdaCandidate(coll, v0); - bool isAL = IsAntiLambdaCandidate(coll, v0); - - // FIXME: Competing Mass Cut will change this approach. Only one signal type per particle - // Candidate for a single particle - switch (isK + isL + isAL) { - case 0: - break; - case 1: - w[1] = static_cast(isK) * purity; - w[2] = static_cast(isL) * purity; - w[3] = static_cast(isAL) * purity; - break; - case 2: - w[1] = static_cast(isK) * (2. / 3.) * purity; - w[2] = (isK ? 2. / 3. : 0.5) * purity; - w[3] = (isK ? 2. / 3. : 0.5) * purity; - break; - case 3: - w[1] = 0.5 * purity; - w[2] = 0.25 * purity; - w[3] = 0.25 * purity; - break; - } - w[0] = 1. - (w[1] + w[2] + w[3]); - return w; + if (v0.isRejectedCandidate()) + return {1., 0., 0., 0.}; + + double purity = getV0Purity(v0); + if (v0.isK0SCandidate()) + return {1. - purity, purity, 0., 0.}; + if (v0.isLambdaCandidate()) + return {1. - purity, 0., purity, 0.}; + if (v0.isAntiLambdaCandidate()) + return {1. - purity, 0., 0., purity}; + + return {1., 0., 0., 0.}; } // getV0SignalWeight // Converts state from uint32_t to std::vector containing the particle classes for that weight std::vector convertState(uint32_t state, int nParticles, int nClasses = 4) { std::vector v(nParticles, nClasses); - int nStates = pow(nClasses, nParticles); - int nBitsPerParticle = round(log2(nClasses)); + int nStates = std::pow(nClasses, nParticles); + int nBitsPerParticle = std::round(std::log2(nClasses)); int nBitsPerInt = sizeof(uint32_t) * 8; // Check if the input configuration is parseable @@ -991,7 +996,7 @@ struct JetFragmentation { LOGF(warning, "Number of bits required to parse the state (%d * %d = %d) is too large for %d bits per int!", nParticles, nBitsPerParticle, nParticles * nBitsPerParticle, nBitsPerInt); return v; } - if (state >= (uint32_t)nStates) { + if (state >= static_cast(nStates)) { LOGF(warning, "Illegal state! State %d >= %d", state, nStates); return v; } @@ -1002,7 +1007,7 @@ struct JetFragmentation { for (int ib = 0; ib < nBitsPerParticle; ib++) { int bit = startBit + ib; int bitVal = ((state & (1 << bit)) > 0); - value += bitVal * TMath::Power(2, ib); + value += bitVal * std::pow(2, ib); } v[ip] = value; } @@ -1016,7 +1021,7 @@ struct JetFragmentation { double r = 0; int nParticles = state.size(); - if (values.size() != (uint32_t)(nParticles + 1)) { + if (values.size() != static_cast(nParticles + 1)) { LOGF(warning, "Number of values (%d) must be equal to the number of particles (%d) + 1!", values.size(), nParticles); return v; } @@ -1036,22 +1041,20 @@ struct JetFragmentation { double stateWeight(std::vector state, std::vector> weights) { double w = 1.; - for (int ip = 0; (uint32_t)ip < state.size(); ip++) { + for (int ip = 0; static_cast(ip) < state.size(); ip++) { w *= weights[ip][state[ip]]; } return w; } template - bool JetContainsV0s(JetType const& jet) + bool jetContainsV0s(JetType const& jet) { return (jet.candidatesIds().size() > 0); } template - bool V0sAreMatched(T const& v0, U const& particle, V const& /*tracks*/) + bool v0sAreMatched(T const& v0, U const& particle, V const& /*tracks*/) { - // FIXME: Can we use matchedV0Particle instead? - // https://github.com/AliceO2Group/O2Physics/blob/31ba54647675645b4669001e3ae9a99614f26d36/PWGJE/Core/JetV0Utilities.h#L131 auto negId = v0.template negTrack_as().mcParticleId(); auto posId = v0.template posTrack_as().mcParticleId(); auto daughters = particle.daughtersIds(); @@ -1059,113 +1062,38 @@ struct JetFragmentation { } template - bool IsV0Candidate(V0Type const& v0) - { - if (v0.eta() < v0EtaMin || v0.eta() > v0EtaMax) { // TODO: Should be rapidity, mass matters! - return false; - } - if (v0.dcaV0daughters() > dcav0dauMax) { - return false; - } - if (v0.v0radius() < v0radiusMin) { - return false; - } - if (v0.v0cosPA() < v0cospaMin) { - return false; - } - return true; - } - template - bool IsK0SCandidate(CollisionType const& collision, V0Type const& v0) - { - if (!IsV0Candidate(v0)) { - return false; - } - if (v0.dcanegtopv() < dcapiMin || v0.dcapostopv() < dcapiMin) { - return false; - } - double ctauK0s = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short; - if (ctauK0s > lifetimeK0SMax) { - return false; - } - bool k0sMassCondition = (TMath::Abs(v0.mK0Short() - o2::constants::physics::MassK0Short) < k0sMassAccWindow); - if (!k0sMassCondition) { - return false; - } - return true; - } - template - bool IsLambdaCandidate(CollisionType const& collision, V0Type const& v0) - { - if (!IsV0Candidate(v0)) { - return false; - } - if (v0.dcanegtopv() < dcapiMin || v0.dcapostopv() < dcaprMin) { - return false; - } - double ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0; - if (ctauLambda > lifetimeLambdaMax) { - return false; - } - bool lambdaMassCondition = (TMath::Abs(v0.mLambda() - o2::constants::physics::MassLambda0) < lambdaMassAccWindow); - if (!lambdaMassCondition) { - return false; - } - return true; - } - template - bool IsAntiLambdaCandidate(CollisionType const& collision, V0Type const& v0) - { - if (!IsV0Candidate(v0)) { - return false; - } - if (v0.dcanegtopv() < dcaprMin || v0.dcapostopv() < dcapiMin) { - return false; - } - double ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0Bar; - if (ctauAntiLambda > lifetimeLambdaMax) { - return false; - } - bool antilambdaMassCondition = (TMath::Abs(v0.mAntiLambda() - o2::constants::physics::MassLambda0Bar) < antilambdaMassAccWindow); - if (!antilambdaMassCondition) { - return false; - } - return true; - } - - template - double ReflectedMass(V0Type const& v0, bool isLambda) + double getReflectedMass(V0Type const& v0, bool isLambda) { // If V0 is Lambda, posTrack = proton, negTrack = pion // In that case, we assign pion mass to posTrack and proton mass to negTrack to calculate the reflection // Vice versa for AntiLambda - double negM = (isLambda ? o2::constants::physics::MassProton : o2::constants::physics::MassPionCharged); - double posM = (isLambda ? o2::constants::physics::MassPionCharged : o2::constants::physics::MassProton); + double negM = (isLambda ? constants::physics::MassProton : constants::physics::MassPionCharged); + double posM = (isLambda ? constants::physics::MassPionCharged : constants::physics::MassProton); double negPsq = v0.pxneg() * v0.pxneg() + v0.pyneg() * v0.pyneg() + v0.pzneg() * v0.pzneg(); double posPsq = v0.pxpos() * v0.pxpos() + v0.pypos() * v0.pypos() + v0.pzpos() * v0.pzpos(); - double negE = TMath::Sqrt(negM * negM + negPsq); - double posE = TMath::Sqrt(posM * posM + posPsq); + double negE = std::sqrt(negM * negM + negPsq); + double posE = std::sqrt(posM * posM + posPsq); double Esquared = (negE + posE) * (negE + posE); double psquared = v0.p() * v0.p(); - return TMath::Sqrt(Esquared - psquared); + return std::sqrt(Esquared - psquared); } template - double ChargeFrag(Jet const& jet, Constituent const& constituent) + double getFrag(Jet const& jet, Constituent const& constituent) { double chargeFrag = -1.; chargeFrag = constituent.pt() / jet.pt(); return chargeFrag; } template - double Theta(Jet const& jet, Constituent const& constituent) + double getTheta(Jet const& jet, Constituent const& constituent) { double theta = -1.; theta = jetutilities::deltaR(jet, constituent); return theta; } template - double TrackProj(Jet const& jet, Constituent const& constituent) + double getMomProj(Jet const& jet, Constituent const& constituent) { double trackProj = -1.; trackProj = constituent.px() * jet.px() + constituent.py() * jet.py() + constituent.pz() * jet.pz(); @@ -1173,12 +1101,12 @@ struct JetFragmentation { return trackProj; } template - double Xi(Jet const& jet, Constituent const& constituent) + double getXi(Jet const& jet, Constituent const& constituent) { double xi = -1., trackProj = -1.; - trackProj = TrackProj(jet, constituent); + trackProj = getMomProj(jet, constituent); if (trackProj > 0) { - xi = TMath::Log(1. / trackProj); + xi = std::log(1. / trackProj); } return xi; } @@ -1197,19 +1125,19 @@ struct JetFragmentation { if (!mcNegTrack.has_mothers() || !mcPosTrack.has_mothers()) { return; } - double ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0; - double ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0Bar; - double ctauK0s = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short; + double ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0; + double ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0Bar; + double ctauK0s = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassK0Short; // Can tracks have multiple mothers? - for (auto& particleMotherOfNeg : mcNegTrack.template mothers_as()) { - for (auto& particleMotherOfPos : mcPosTrack.template mothers_as()) { + for (const auto& particleMotherOfNeg : mcNegTrack.template mothers_as()) { + for (const auto& particleMotherOfPos : mcPosTrack.template mothers_as()) { if (particleMotherOfNeg.isPhysicalPrimary() && particleMotherOfNeg == particleMotherOfPos) { double ptPartV0 = particleMotherOfNeg.pt(); int pdg = particleMotherOfNeg.pdgCode(); registry.fill(HIST("matching/V0/V0PartPtDetPt"), ptPartV0, v0.pt(), weight); registry.fill(HIST("matching/V0/V0PartPtRatioPtRelDiffPt"), ptPartV0, v0.pt() / ptPartV0, (v0.pt() - ptPartV0) / ptPartV0, weight); - if (TMath::Abs(pdg) == 310) { // K0S + if (std::abs(pdg) == 310) { // K0S registry.fill(HIST("matching/V0/K0SPtEtaPhi"), ptPartV0, v0.pt(), v0.eta(), v0.phi(), weight); registry.fill(HIST("matching/V0/K0SPtCtauMass"), ptPartV0, v0.pt(), ctauK0s, v0.mK0Short(), weight); registry.fill(HIST("matching/V0/K0SPtRadiusCosPA"), ptPartV0, v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); @@ -1225,7 +1153,7 @@ struct JetFragmentation { registry.fill(HIST("matching/V0/LambdaPtMass"), ptPartV0, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); // Reflection - double reflectedMass = ReflectedMass(v0, true); + double reflectedMass = getReflectedMass(v0, true); registry.fill(HIST("matching/V0/Lambda0Reflection"), ptPartV0, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), reflectedMass, weight); } else if (pdg == -3122) { // AntiLambda registry.fill(HIST("matching/V0/antiLambdaPtEtaPhi"), ptPartV0, v0.pt(), v0.eta(), v0.phi(), weight); @@ -1236,7 +1164,7 @@ struct JetFragmentation { registry.fill(HIST("matching/V0/antiLambdaPtMass"), ptPartV0, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); // Reflection - double reflectedMass = ReflectedMass(v0, false); + double reflectedMass = getReflectedMass(v0, false); registry.fill(HIST("matching/V0/antiLambda0Reflection"), ptPartV0, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), reflectedMass, weight); } } // if mothers match @@ -1258,10 +1186,10 @@ struct JetFragmentation { { for (const auto& track : jet.template tracks_as()) { double chargeFrag = -1., trackProj = -1., xi = -1., theta = -1.; - chargeFrag = ChargeFrag(jet, track); - trackProj = TrackProj(jet, track); - theta = Theta(jet, track); - xi = Xi(jet, track); + chargeFrag = getFrag(jet, track); + trackProj = getMomProj(jet, track); + theta = getTheta(jet, track); + xi = getXi(jet, track); registry.fill(HIST("data/jets/jetPtTrackPt"), jet.pt(), track.pt(), weight); registry.fill(HIST("data/jets/jetTrackPtEtaPhi"), track.pt(), track.eta(), track.phi(), weight); @@ -1278,9 +1206,9 @@ struct JetFragmentation { void fillDataV0Histograms(CollisionType const& collision, V0Type const& V0s, double weight = 1.) { for (const auto& v0 : V0s) { - double ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0; - double ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0Bar; - double ctauK0s = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short; + double ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0; + double ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0Bar; + double ctauK0s = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassK0Short; double massDiff = v0.mLambda() - v0.mAntiLambda(); double massRatio = v0.mAntiLambda() / v0.mLambda(); @@ -1295,9 +1223,9 @@ struct JetFragmentation { registry.fill(HIST("data/V0/V0PtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); registry.fill(HIST("data/V0/V0PtDCAd"), v0.pt(), v0.dcaV0daughters(), weight); - registry.fill(HIST("data/V0/V0CutVariation"), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), v0.v0radius(), ctauK0s, v0.v0cosPA(), TMath::Abs(v0.dcapostopv()), TMath::Abs(v0.dcanegtopv()), v0.dcaV0daughters(), weight); + registry.fill(HIST("data/V0/V0CutVariation"), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), v0.v0radius(), ctauK0s, v0.v0cosPA(), std::abs(v0.dcapostopv()), std::abs(v0.dcanegtopv()), v0.dcaV0daughters(), weight); - if (IsLambdaCandidate(collision, v0)) { + if (v0.isLambdaCandidate()) { registry.fill(HIST("data/V0/LambdaPtEtaPhi"), v0.pt(), v0.eta(), v0.phi(), weight); registry.fill(HIST("data/V0/LambdaPtCtauMass"), v0.pt(), ctauLambda, v0.mLambda(), weight); registry.fill(HIST("data/V0/LambdaPtLambdaMasses"), v0.pt(), massDiff, massRatio, massRelDiff, weight); @@ -1305,7 +1233,7 @@ struct JetFragmentation { registry.fill(HIST("data/V0/LambdaPtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); registry.fill(HIST("data/V0/LambdaPtDCAd"), v0.pt(), v0.dcaV0daughters(), weight); } - if (IsAntiLambdaCandidate(collision, v0)) { + if (v0.isAntiLambdaCandidate()) { registry.fill(HIST("data/V0/antiLambdaPtEtaPhi"), v0.pt(), v0.eta(), v0.phi(), weight); registry.fill(HIST("data/V0/antiLambdaPtCtauMass"), v0.pt(), ctauAntiLambda, v0.mAntiLambda(), weight); registry.fill(HIST("data/V0/antiLambdaPtLambdaMasses"), v0.pt(), massDiff, massRatio, massRelDiff, weight); @@ -1313,7 +1241,7 @@ struct JetFragmentation { registry.fill(HIST("data/V0/antiLambdaPtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); registry.fill(HIST("data/V0/antiLambdaPtDCAd"), v0.pt(), v0.dcaV0daughters(), weight); } - if (IsK0SCandidate(collision, v0)) { + if (v0.isK0SCandidate()) { registry.fill(HIST("data/V0/K0SPtEtaPhi"), v0.pt(), v0.eta(), v0.phi(), weight); registry.fill(HIST("data/V0/K0SPtCtauMass"), v0.pt(), ctauK0s, v0.mK0Short(), weight); registry.fill(HIST("data/V0/K0SPtRadiusCosPA"), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); @@ -1326,10 +1254,10 @@ struct JetFragmentation { template void fillDataV0FragHistograms(CollisionType const& collision, JetType const& jet, V0Type const& v0, double weight = 1.) { - double trackProj = TrackProj(jet, v0); - double ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0; - double ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0Bar; - double ctauK0s = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short; + double trackProj = getMomProj(jet, v0); + double ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0; + double ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0Bar; + double ctauK0s = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassK0Short; double massDiff = v0.mLambda() - v0.mAntiLambda(); double massRatio = v0.mAntiLambda() / v0.mLambda(); @@ -1353,7 +1281,7 @@ struct JetFragmentation { registry.fill(HIST("data/jets/V0/jetPtV0TrackProjDCAposneg"), jet.pt(), trackProj, v0.dcapostopv(), v0.dcanegtopv(), weight); registry.fill(HIST("data/jets/V0/jetPtV0TrackProjDCAd"), jet.pt(), trackProj, v0.dcaV0daughters(), weight); - if (IsK0SCandidate(collision, v0)) { + if (v0.isK0SCandidate()) { registry.fill(HIST("data/jets/V0/jetPtK0SPtCtau"), jet.pt(), v0.pt(), ctauK0s, weight); registry.fill(HIST("data/jets/V0/jetPtK0SPtMass"), jet.pt(), v0.pt(), v0.mK0Short(), weight); registry.fill(HIST("data/jets/V0/jetPtK0SPtAllMasses"), jet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); @@ -1370,7 +1298,7 @@ struct JetFragmentation { registry.fill(HIST("data/jets/V0/jetPtK0STrackProjDCAd"), jet.pt(), trackProj, v0.dcaV0daughters(), weight); registry.fill(HIST("data/jets/V0/jetPtK0STrackProjDCAposneg"), jet.pt(), trackProj, v0.dcapostopv(), v0.dcanegtopv(), weight); } - if (IsLambdaCandidate(collision, v0)) { + if (v0.isLambdaCandidate()) { registry.fill(HIST("data/jets/V0/jetPtLambdaPtCtau"), jet.pt(), v0.pt(), ctauLambda, weight); registry.fill(HIST("data/jets/V0/jetPtLambdaPtMass"), jet.pt(), v0.pt(), v0.mLambda(), weight); registry.fill(HIST("data/jets/V0/jetPtLambdaPtAllMasses"), jet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); @@ -1389,7 +1317,7 @@ struct JetFragmentation { registry.fill(HIST("data/jets/V0/jetPtLambdaTrackProjDCAd"), jet.pt(), trackProj, v0.dcaV0daughters(), weight); registry.fill(HIST("data/jets/V0/jetPtLambdaTrackProjDCAposneg"), jet.pt(), trackProj, v0.dcapostopv(), v0.dcanegtopv(), weight); } - if (IsAntiLambdaCandidate(collision, v0)) { + if (v0.isAntiLambdaCandidate()) { registry.fill(HIST("data/jets/V0/jetPtAntiLambdaPtCtau"), jet.pt(), v0.pt(), ctauAntiLambda, weight); registry.fill(HIST("data/jets/V0/jetPtAntiLambdaPtMass"), jet.pt(), v0.pt(), v0.mAntiLambda(), weight); registry.fill(HIST("data/jets/V0/jetPtAntiLambdaPtAllMasses"), jet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); @@ -1419,9 +1347,9 @@ struct JetFragmentation { double z = values[ip]; ip++; - double ctauK0s = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short; - double ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0; - double ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0Bar; + double ctauK0s = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassK0Short; + double ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0; + double ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0Bar; switch (state[ip]) { case 0: // Background @@ -1469,7 +1397,7 @@ struct JetFragmentation { void fillMatchingHistogramsJet(DetJet const& detJet, PartJet const& partJet, double weight = 1.) { double deltaEta = detJet.eta() - partJet.eta(); - double deltaPhi = RecoDecay::constrainAngle(detJet.phi() - partJet.phi(), -M_PI); + double deltaPhi = RecoDecay::constrainAngle(detJet.phi() - partJet.phi(), -constants::math::PI); double dR = jetutilities::deltaR(detJet, partJet); registry.fill(HIST("matching/jets/matchDetJetPtEtaPhi"), detJet.pt(), detJet.eta(), detJet.phi(), weight); @@ -1491,15 +1419,15 @@ struct JetFragmentation { double detChargeFrag = -1., detTrackProj = -1., detTheta = -1., detXi = -1.; double partChargeFrag = -1., partTrackProj = -1., partTheta = -1., partXi = -1.; - detChargeFrag = ChargeFrag(detJet, track); - detTrackProj = TrackProj(detJet, track); - detTheta = Theta(detJet, track); - detXi = Xi(detJet, track); + detChargeFrag = getFrag(detJet, track); + detTrackProj = getMomProj(detJet, track); + detTheta = getTheta(detJet, track); + detXi = getXi(detJet, track); - partChargeFrag = ChargeFrag(partJet, particle); - partTrackProj = TrackProj(partJet, particle); - partTheta = Theta(partJet, particle); - partXi = Xi(partJet, particle); + partChargeFrag = getFrag(partJet, particle); + partTrackProj = getMomProj(partJet, particle); + partTheta = getTheta(partJet, particle); + partXi = getXi(partJet, particle); // Detector level registry.fill(HIST("matching/jets/matchDetJetTrackPtEtaPhi"), track.pt(), track.eta(), track.phi(), weight); @@ -1547,10 +1475,10 @@ struct JetFragmentation { void fillMatchingFakeOrMiss(Jet const& jet, Constituent const& constituent, bool isFake, double weight = 1.) { double chargeFrag = -1., trackProj = -1., theta = -1., xi = -1.; - chargeFrag = ChargeFrag(jet, constituent); - trackProj = TrackProj(jet, constituent); - theta = Theta(jet, constituent); - xi = Xi(jet, constituent); + chargeFrag = getFrag(jet, constituent); + trackProj = getMomProj(jet, constituent); + theta = getTheta(jet, constituent); + xi = getXi(jet, constituent); if (isFake) { registry.fill(HIST("matching/jets/fakeDetJetPtFrag"), jet.pt(), chargeFrag, weight); @@ -1572,11 +1500,11 @@ struct JetFragmentation { template void fillMatchingV0Miss(JetType const& jet, V0Type const& v0, double weight = 1.) { - double trackProj = TrackProj(jet, v0); + double trackProj = getMomProj(jet, v0); registry.fill(HIST("matching/jets/V0/missJetPtV0TrackProj"), jet.pt(), trackProj, weight); registry.fill(HIST("matching/jets/V0/missJetPtV0PtEtaPhi"), jet.pt(), v0.pt(), v0.eta(), v0.phi(), weight); - if (TMath::Abs(v0.pdgCode()) == 310) { // K0S + if (std::abs(v0.pdgCode()) == 310) { // K0S registry.fill(HIST("matching/jets/V0/missJetPtK0SPtEtaPhi"), jet.pt(), v0.pt(), v0.eta(), v0.phi(), weight); registry.fill(HIST("matching/jets/V0/missJetPtK0STrackProj"), jet.pt(), trackProj, weight); } else if (v0.pdgCode() == 3122) { // Lambda @@ -1591,10 +1519,10 @@ struct JetFragmentation { template void fillMatchingV0Fake(CollisionType const& collision, JetType const& jet, V0Type const& v0, double weight = 1.) { - double trackProj = TrackProj(jet, v0); - double ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0; - double ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0Bar; - double ctauK0s = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short; + double trackProj = getMomProj(jet, v0); + double ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0; + double ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0Bar; + double ctauK0s = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassK0Short; double massDiff = v0.mLambda() - v0.mAntiLambda(); double massRatio = v0.mAntiLambda() / v0.mLambda(); double massRelDiff = (v0.mLambda() - v0.mAntiLambda()) / v0.mLambda(); @@ -1616,7 +1544,7 @@ struct JetFragmentation { registry.fill(HIST("matching/jets/V0/fakeJetPtV0TrackProjDCAposneg"), jet.pt(), trackProj, v0.dcapostopv(), v0.dcanegtopv(), weight); registry.fill(HIST("matching/jets/V0/fakeJetPtV0TrackProjDCAd"), jet.pt(), trackProj, v0.dcaV0daughters(), weight); - if (IsLambdaCandidate(collision, v0)) { + if (v0.isLambdaCandidate()) { registry.fill(HIST("matching/jets/V0/fakeJetPtLambda0PtEtaPhi"), jet.pt(), v0.pt(), v0.eta(), v0.phi(), weight); registry.fill(HIST("matching/jets/V0/fakeJetPtLambda0TrackProj"), jet.pt(), trackProj, weight); @@ -1634,7 +1562,7 @@ struct JetFragmentation { registry.fill(HIST("matching/jets/V0/fakeJetPtLambda0TrackProjDCAposneg"), jet.pt(), trackProj, v0.dcapostopv(), v0.dcanegtopv(), weight); registry.fill(HIST("matching/jets/V0/fakeJetPtLambda0TrackProjDCAd"), jet.pt(), trackProj, v0.dcaV0daughters(), weight); } - if (IsAntiLambdaCandidate(collision, v0)) { + if (v0.isAntiLambdaCandidate()) { registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambda0PtEtaPhi"), jet.pt(), v0.pt(), v0.eta(), v0.phi(), weight); registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambda0TrackProj"), jet.pt(), trackProj, weight); @@ -1652,7 +1580,7 @@ struct JetFragmentation { registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambda0TrackProjDCAposneg"), jet.pt(), trackProj, v0.dcapostopv(), v0.dcanegtopv(), weight); registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambda0TrackProjDCAd"), jet.pt(), trackProj, v0.dcaV0daughters(), weight); } - if (IsK0SCandidate(collision, v0)) { + if (v0.isK0SCandidate()) { registry.fill(HIST("matching/jets/V0/fakeJetPtK0SPtEtaPhi"), jet.pt(), v0.pt(), v0.eta(), v0.phi(), weight); registry.fill(HIST("matching/jets/V0/fakeJetPtK0STrackProj"), jet.pt(), trackProj, weight); @@ -1676,9 +1604,9 @@ struct JetFragmentation { template void fillMatchingV0FakeHistograms(T const& coll, U const& v0, double weight = 1.) { - double ctauLambda = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * o2::constants::physics::MassLambda0; - double ctauAntiLambda = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * o2::constants::physics::MassLambda0Bar; - double ctauK0s = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * o2::constants::physics::MassK0Short; + double ctauLambda = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * constants::physics::MassLambda0; + double ctauAntiLambda = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * constants::physics::MassLambda0Bar; + double ctauK0s = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * constants::physics::MassK0Short; registry.fill(HIST("matching/V0/fakeV0PtEtaPhi"), v0.pt(), v0.eta(), v0.phi(), weight); registry.fill(HIST("matching/V0/fakeV0PtCtau"), v0.pt(), ctauK0s, ctauLambda, ctauAntiLambda, weight); @@ -1733,7 +1661,7 @@ struct JetFragmentation { double pt = posDecayed ? negMom.pt() : posMom.pt(); int pdg = posDecayed ? negMom.pdgCode() : posMom.pdgCode(); - if (TMath::Abs(pdg) == 310) { + if (std::abs(pdg) == 310) { registry.fill(HIST("matching/V0/decayedK0SV0PtMass"), pt, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); } else if (pdg == 3122) { registry.fill(HIST("matching/V0/decayedLambdaV0PtMass"), pt, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); @@ -1761,7 +1689,7 @@ struct JetFragmentation { bool posDecayed = false; bool negDecayed = false; - double zv0 = TrackProj(detJet, v0); + double zv0 = getMomProj(detJet, v0); // This should not happen. They should have been matched if (posMom == negMom) { @@ -1795,20 +1723,20 @@ struct JetFragmentation { double z = 0.; bool partIsInJet = false; - for (auto const& part : partJet.template candidates_as
()) { + for (auto const& part : partJet.template tracks_as()) { if (posDecayed && (part == negMom)) { partIsInJet = true; - z = TrackProj(partJet, part); + z = getMomProj(partJet, part); break; } if (negDecayed && (part == posMom)) { partIsInJet = true; - z = TrackProj(partJet, part); + z = getMomProj(partJet, part); break; } } - if (TMath::Abs(pdg) == 310) { + if (std::abs(pdg) == 310) { registry.fill(HIST("matching/jets/V0/decayedK0SV0PtMass"), partJet.pt(), detJet.pt(), pt, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); if (partIsInJet) { registry.fill(HIST("matching/jets/V0/decayedK0SV0TrackProjMass"), partJet.pt(), detJet.pt(), z, zv0, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); @@ -1843,14 +1771,14 @@ struct JetFragmentation { template void fillMatchingV0Histograms(CollisionType const& collision, V0Type const& v0, particleType const& particle, double weight = 1.) { - double ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0; - double ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0Bar; - double ctauK0s = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short; + double ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0; + double ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0Bar; + double ctauK0s = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassK0Short; registry.fill(HIST("matching/V0/V0PartPtDetPt"), particle.pt(), v0.pt(), weight); registry.fill(HIST("matching/V0/V0PartPtRatioPtRelDiffPt"), particle.pt(), v0.pt() / particle.pt(), (v0.pt() - particle.pt()) / particle.pt(), weight); - if (TMath::Abs(particle.pdgCode()) == 310) { // K0S + if (std::abs(particle.pdgCode()) == 310) { // K0S registry.fill(HIST("matching/V0/K0SPtEtaPhi"), particle.pt(), v0.pt(), v0.eta(), v0.phi(), weight); registry.fill(HIST("matching/V0/K0SPtCtauMass"), particle.pt(), v0.pt(), ctauK0s, v0.mK0Short(), weight); registry.fill(HIST("matching/V0/K0SPtRadiusCosPA"), particle.pt(), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); @@ -1866,7 +1794,7 @@ struct JetFragmentation { registry.fill(HIST("matching/V0/LambdaPtMass"), particle.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); // Reflection - double reflectedMass = ReflectedMass(v0, true); + double reflectedMass = getReflectedMass(v0, true); registry.fill(HIST("matching/V0/Lambda0Reflection"), particle.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), reflectedMass, weight); } else if (particle.pdgCode() == -3122) { // AntiLambda registry.fill(HIST("matching/V0/antiLambdaPtEtaPhi"), particle.pt(), v0.pt(), v0.eta(), v0.phi(), weight); @@ -1877,7 +1805,7 @@ struct JetFragmentation { registry.fill(HIST("matching/V0/antiLambdaPtMass"), particle.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); // Reflection - double reflectedMass = ReflectedMass(v0, false); + double reflectedMass = getReflectedMass(v0, false); registry.fill(HIST("matching/V0/antiLambda0Reflection"), particle.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), reflectedMass, weight); } } @@ -1907,12 +1835,12 @@ struct JetFragmentation { template void fillMatchingV0FragHistograms(CollisionType const& collision, DetJetType const& detJet, PartJetType const& partJet, V0Type const& v0, ParticleType const& particle, double weight = 1.) { - double detTrackProj = TrackProj(detJet, v0); - double partTrackProj = TrackProj(partJet, particle); + double detTrackProj = getMomProj(detJet, v0); + double partTrackProj = getMomProj(partJet, particle); - double ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0; - double ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0Bar; - double ctauK0s = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short; + double ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0; + double ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0Bar; + double ctauK0s = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassK0Short; registry.fill(HIST("matching/jets/V0/matchDetJetPtV0TrackProjPartJetPtV0TrackProj"), detJet.pt(), detTrackProj, partJet.pt(), partTrackProj, weight); registry.fill(HIST("matching/jets/V0/partJetPtV0PtDetJetPtV0Pt"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), weight); @@ -1941,7 +1869,7 @@ struct JetFragmentation { registry.fill(HIST("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjDCAposneg"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.dcapostopv(), v0.dcanegtopv(), weight); registry.fill(HIST("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjDCAd"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.dcaV0daughters(), weight); - if (TMath::Abs(particle.pdgCode()) == 310) { // K0S + if (std::abs(particle.pdgCode()) == 310) { // K0S registry.fill(HIST("matching/jets/V0/matchDetJetPtK0STrackProjPartJetPtK0STrackProj"), detJet.pt(), detTrackProj, partJet.pt(), partTrackProj, weight); registry.fill(HIST("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPt"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), weight); @@ -1997,7 +1925,7 @@ struct JetFragmentation { registry.fill(HIST("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjDCAd"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.dcaV0daughters(), weight); // Reflection - double reflectedMass = ReflectedMass(v0, true); + double reflectedMass = getReflectedMass(v0, true); registry.fill(HIST("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtLambda0Reflection"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), reflectedMass, weight); registry.fill(HIST("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjLambda0Reflection"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), reflectedMass, weight); } else if (particle.pdgCode() == -3122) { // AntiLambda @@ -2029,7 +1957,7 @@ struct JetFragmentation { registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjDCAd"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.dcaV0daughters(), weight); // Reflection - double reflectedMass = ReflectedMass(v0, false); + double reflectedMass = getReflectedMass(v0, false); registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtAntiLambda0Reflection"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), reflectedMass, weight); registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjAntiLambda0Reflection"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), reflectedMass, weight); } // AntiLambda @@ -2045,10 +1973,10 @@ struct JetFragmentation { { for (const auto& track : jet.template tracks_as()) { double chargeFrag = -1., trackProj = -1., theta = -1., xi = -1.; - chargeFrag = ChargeFrag(jet, track); - trackProj = TrackProj(jet, track); - theta = Theta(jet, track); - xi = Xi(jet, track); + chargeFrag = getFrag(jet, track); + trackProj = getMomProj(jet, track); + theta = getTheta(jet, track); + xi = getXi(jet, track); registry.fill(HIST("detector-level/jets/detJetPtTrackPt"), jet.pt(), track.pt(), weight); registry.fill(HIST("detector-level/jets/detJetTrackPtEtaPhi"), track.pt(), track.eta(), track.phi(), weight); @@ -2071,10 +1999,10 @@ struct JetFragmentation { { for (const auto& track : jet.template tracks_as()) { double chargeFrag = -1., trackProj = -1., theta = -1., xi = -1.; - chargeFrag = ChargeFrag(jet, track); - trackProj = TrackProj(jet, track); - theta = Theta(jet, track); - xi = Xi(jet, track); + chargeFrag = getFrag(jet, track); + trackProj = getMomProj(jet, track); + theta = getTheta(jet, track); + xi = getXi(jet, track); registry.fill(HIST("particle-level/jets/partJetPtTrackPt"), jet.pt(), track.pt(), weight); registry.fill(HIST("particle-level/jets/partJetTrackPtEtaPhi"), track.pt(), track.eta(), track.phi(), weight); @@ -2091,18 +2019,18 @@ struct JetFragmentation { void fillDataPerpConeHists(T const& coll, U const& jet, V const& v0s, double weight = 1.) { double perpConeR = jet.r() * 1e-2; - double conePhi[2] = {RecoDecay::constrainAngle(jet.phi() - M_PI / 2, -M_PI), - RecoDecay::constrainAngle(jet.phi() + M_PI / 2, -M_PI)}; + double conePhi[2] = {RecoDecay::constrainAngle(jet.phi() - constants::math::PIHalf, -constants::math::PI), + RecoDecay::constrainAngle(jet.phi() + constants::math::PIHalf, -constants::math::PI)}; double conePt[2] = {0., 0.}; int nV0sinCone[2] = {0, 0}; for (const auto& v0 : v0s) { // Need to check if v0 passed jet finder selection/preselector cuts bool v0InCones = false; double dEta = v0.eta() - jet.eta(); - double dPhi[2] = {RecoDecay::constrainAngle(v0.phi() - conePhi[0], -M_PI), - RecoDecay::constrainAngle(v0.phi() - conePhi[1], -M_PI)}; + double dPhi[2] = {RecoDecay::constrainAngle(v0.phi() - conePhi[0], -constants::math::PI), + RecoDecay::constrainAngle(v0.phi() - conePhi[1], -constants::math::PI)}; for (int i = 0; i < 2; i++) { - if (TMath::Sqrt(dEta * dEta + dPhi[i] * dPhi[i]) < perpConeR) { + if (std::sqrt(dEta * dEta + dPhi[i] * dPhi[i]) < perpConeR) { conePt[i] += v0.pt(); nV0sinCone[i]++; v0InCones = true; @@ -2112,9 +2040,9 @@ struct JetFragmentation { continue; } - double ctauLambda = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * o2::constants::physics::MassLambda0; - double ctauAntiLambda = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * o2::constants::physics::MassLambda0Bar; - double ctauK0s = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * o2::constants::physics::MassK0Short; + double ctauLambda = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * constants::physics::MassLambda0; + double ctauAntiLambda = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * constants::physics::MassLambda0Bar; + double ctauK0s = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * constants::physics::MassK0Short; registry.fill(HIST("data/PC/JetPtEtaV0Pt"), jet.pt(), jet.eta(), v0.pt(), weight); registry.fill(HIST("data/PC/V0PtEtaPhi"), v0.pt(), v0.eta(), v0.phi(), weight); @@ -2125,7 +2053,7 @@ struct JetFragmentation { registry.fill(HIST("data/PC/V0PtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); registry.fill(HIST("data/PC/V0PtDCAd"), v0.pt(), v0.dcaV0daughters(), weight); - if (IsLambdaCandidate(coll, v0)) { + if (v0.isLambdaCandidate()) { registry.fill(HIST("data/PC/JetPtLambda0PtMass"), jet.pt(), v0.pt(), v0.mLambda(), weight); registry.fill(HIST("data/PC/JetPtEtaLambda0Pt"), jet.pt(), jet.eta(), v0.pt(), weight); @@ -2135,7 +2063,7 @@ struct JetFragmentation { registry.fill(HIST("data/PC/LambdaPtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); registry.fill(HIST("data/PC/LambdaPtDCAd"), v0.pt(), v0.dcaV0daughters(), weight); } - if (IsAntiLambdaCandidate(coll, v0)) { + if (v0.isAntiLambdaCandidate()) { registry.fill(HIST("data/PC/JetPtAntiLambda0PtMass"), jet.pt(), v0.pt(), v0.mAntiLambda(), weight); registry.fill(HIST("data/PC/JetPtEtaAntiLambda0Pt"), jet.pt(), jet.eta(), v0.pt(), weight); @@ -2145,7 +2073,7 @@ struct JetFragmentation { registry.fill(HIST("data/PC/antiLambdaPtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); registry.fill(HIST("data/PC/antiLambdaPtDCAd"), v0.pt(), v0.dcaV0daughters(), weight); } - if (IsK0SCandidate(coll, v0)) { + if (v0.isK0SCandidate()) { registry.fill(HIST("data/PC/JetPtK0SPtMass"), jet.pt(), v0.pt(), v0.mK0Short(), weight); registry.fill(HIST("data/PC/JetPtEtaK0SPt"), jet.pt(), jet.eta(), v0.pt(), weight); @@ -2169,8 +2097,8 @@ struct JetFragmentation { void fillMcPerpConeHists(T const& coll, U const& mcdjet, V const& v0s, W const& /* V0 particles */, double weight = 1.) { double perpConeR = mcdjet.r() * 1e-2; - double conePhi[2] = {RecoDecay::constrainAngle(mcdjet.phi() - M_PI / 2, -M_PI), - RecoDecay::constrainAngle(mcdjet.phi() + M_PI / 2, -M_PI)}; + double conePhi[2] = {RecoDecay::constrainAngle(mcdjet.phi() - constants::math::PIHalf, -constants::math::PI), + RecoDecay::constrainAngle(mcdjet.phi() + constants::math::PIHalf, -constants::math::PI)}; double coneMatchedPt[2] = {0., 0.}; double coneFakePt[2] = {0., 0.}; int nMatchedV0sinCone[2] = {0, 0}; @@ -2178,16 +2106,16 @@ struct JetFragmentation { for (const auto& v0 : v0s) { double dEta = v0.eta() - mcdjet.eta(); - double dPhi[2] = {RecoDecay::constrainAngle(v0.phi() - conePhi[0], -M_PI), - RecoDecay::constrainAngle(v0.phi() - conePhi[1], -M_PI)}; + double dPhi[2] = {RecoDecay::constrainAngle(v0.phi() - conePhi[0], -constants::math::PI), + RecoDecay::constrainAngle(v0.phi() - conePhi[1], -constants::math::PI)}; for (int i = 0; i < 2; i++) { - if (TMath::Sqrt(dEta * dEta + dPhi[i] * dPhi[i]) > perpConeR) { + if (std::sqrt(dEta * dEta + dPhi[i] * dPhi[i]) > perpConeR) { continue; } - double ctauLambda = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * o2::constants::physics::MassLambda0; - double ctauAntiLambda = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * o2::constants::physics::MassLambda0Bar; - double ctauK0s = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * o2::constants::physics::MassK0Short; + double ctauLambda = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * constants::physics::MassLambda0; + double ctauAntiLambda = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * constants::physics::MassLambda0Bar; + double ctauK0s = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * constants::physics::MassK0Short; if (!v0.has_mcParticle()) { // The V0 is combinatorial background coneFakePt[i] += v0.pt(); @@ -2213,7 +2141,7 @@ struct JetFragmentation { registry.fill(HIST("mcd/PC/matchedV0PtDCAd"), v0.pt(), v0.dcaV0daughters(), weight); auto particle = v0.template mcParticle_as(); - if (TMath::Abs(particle.pdgCode()) == 310) { // K0S + if (std::abs(particle.pdgCode()) == 310) { // K0S registry.fill(HIST("mcd/PC/matchedJetPtK0SPtMass"), mcdjet.pt(), v0.pt(), v0.mK0Short(), weight); } else if (particle.pdgCode() == 3122) { // Lambda registry.fill(HIST("mcd/PC/matchedJetPtLambda0PtMass"), mcdjet.pt(), v0.pt(), v0.mLambda(), weight); @@ -2238,8 +2166,8 @@ struct JetFragmentation { void fillMcPerpConeHists(T const& coll, U const& mcdjet, V const& mcpjet, W const& v0s, X const& /* V0 particles */, double weight = 1.) { double perpConeR = mcdjet.r() * 1e-2; - double conePhi[2] = {RecoDecay::constrainAngle(mcdjet.phi() - M_PI / 2, -M_PI), - RecoDecay::constrainAngle(mcdjet.phi() + M_PI / 2, -M_PI)}; + double conePhi[2] = {RecoDecay::constrainAngle(mcdjet.phi() - constants::math::PIHalf, -constants::math::PI), + RecoDecay::constrainAngle(mcdjet.phi() + constants::math::PIHalf, -constants::math::PI)}; double coneMatchedPt[2] = {0., 0.}; double coneFakePt[2] = {0., 0.}; int nMatchedV0sinCone[2] = {0, 0}; @@ -2247,16 +2175,16 @@ struct JetFragmentation { for (const auto& v0 : v0s) { double dEta = v0.eta() - mcdjet.eta(); - double dPhi[2] = {RecoDecay::constrainAngle(v0.phi() - conePhi[0], -M_PI), - RecoDecay::constrainAngle(v0.phi() - conePhi[1], -M_PI)}; + double dPhi[2] = {RecoDecay::constrainAngle(v0.phi() - conePhi[0], -constants::math::PI), + RecoDecay::constrainAngle(v0.phi() - conePhi[1], -constants::math::PI)}; for (int i = 0; i < 2; i++) { - if (TMath::Sqrt(dEta * dEta + dPhi[i] * dPhi[i]) > perpConeR) { + if (std::sqrt(dEta * dEta + dPhi[i] * dPhi[i]) > perpConeR) { continue; } - double ctauLambda = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * o2::constants::physics::MassLambda0; - double ctauAntiLambda = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * o2::constants::physics::MassLambda0Bar; - double ctauK0s = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * o2::constants::physics::MassK0Short; + double ctauLambda = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * constants::physics::MassLambda0; + double ctauAntiLambda = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * constants::physics::MassLambda0Bar; + double ctauK0s = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * constants::physics::MassK0Short; if (!v0.has_mcParticle()) { // The V0 is combinatorial background coneFakePt[i] += v0.pt(); @@ -2284,7 +2212,7 @@ struct JetFragmentation { registry.fill(HIST("matching/PC/matchedV0PtDCAd"), v0.pt(), v0.dcaV0daughters(), weight); auto particle = v0.template mcParticle_as(); - if (TMath::Abs(particle.pdgCode()) == 310) { // K0S + if (std::abs(particle.pdgCode()) == 310) { // K0S registry.fill(HIST("matching/PC/matchedJetPtK0SPtMass"), mcdjet.pt(), v0.pt(), v0.mK0Short(), weight); registry.fill(HIST("matching/PC/matchedJetsPtK0SPtMass"), mcpjet.pt(), mcdjet.pt(), v0.pt(), v0.mK0Short(), weight); } else if (particle.pdgCode() == 3122) { // Lambda @@ -2403,10 +2331,10 @@ struct JetFragmentation { return; } double weight = collision.mcCollision().weight(); - const auto& mcPartJets = allMcPartJets.sliceBy(PartJetsPerCollision, collision.mcCollision().globalIndex()); // Only jets from the same collision + const auto& mcPartJets = allMcPartJets.sliceBy(partJetsPerCollision, collision.mcCollision().globalIndex()); // Only jets from the same collision bool isFake = false; for (const auto& detJet : detJetEtaPartition) { - for (auto& partJet : detJet.template matchedJetGeo_as()) { + for (const auto& partJet : detJet.template matchedJetGeo_as()) { fillMatchingHistogramsJet(detJet, partJet, weight); for (const auto& track : detJet.tracks_as()) { @@ -2502,7 +2430,7 @@ struct JetFragmentation { void processMcMatchedV0Frag(soa::Filtered>::iterator const& jcoll, MatchedMCDJetsWithConstituents const&, aod::JetTracksMCD const&, - soa::Join const& allV0s, + soa::Join const& allV0s, aod::JetMcCollisions const&, MatchedMCPJetsWithConstituents const& allMcPartJets, aod::JetParticles const&, @@ -2519,9 +2447,9 @@ struct JetFragmentation { double weight = jcoll.mcCollision().weight(); // This is necessary, because jets are linked to aod::JetCollisions, but V0s are linked to Collisions const auto& collision = jcoll.collision_as(); - const auto& v0s = allV0s.sliceBy(V0sPerCollision, collision.globalIndex()); - const auto& mcPartJets = allMcPartJets.sliceBy(PartJetsPerCollision, jcoll.mcCollision().globalIndex()); - const auto& mcParticles = allMcParticles.sliceBy(ParticlesPerCollision, jcoll.mcCollision().globalIndex()); + const auto& v0s = allV0s.sliceBy(v0sPerCollision, collision.globalIndex()); + const auto& mcPartJets = allMcPartJets.sliceBy(partJetsPerCollision, jcoll.mcCollision().globalIndex()); + const auto& mcParticles = allMcParticles.sliceBy(particlesPerCollision, jcoll.mcCollision().globalIndex()); int kNV0s = v0s.size(); bool isV0Used[kNV0s]; @@ -2541,7 +2469,7 @@ struct JetFragmentation { int iv0 = -1; int nV0inJet = 0, nLambdainJet = 0, nAntiLambdainJet = 0, nK0SinJet = 0; - for (auto& partJet : detJet.template matchedJetGeo_as()) { + for (const auto& partJet : detJet.template matchedJetGeo_as()) { fillMatchingHistogramsJet(detJet, partJet, weight); // Jets are pt-sorted, so we prioritise matching V0s with high pt jets for (const auto& v0 : v0s) { @@ -2559,14 +2487,14 @@ struct JetFragmentation { continue; } const auto& particle = v0.template mcParticle_as(); - if (!((TMath::Abs(particle.pdgCode()) == 310) || (TMath::Abs(particle.pdgCode()) == 3122))) { + if (!((std::abs(particle.pdgCode()) == 310) || (std::abs(particle.pdgCode()) == 3122))) { fillMatchingV0Fake(collision, detJet, v0, weight); continue; } // Found a matched V0 in the jet nV0inJet++; fillMatchingV0FragHistograms(collision, detJet, partJet, v0, particle, weight); - if (TMath::Abs(particle.pdgCode()) == 310) { + if (std::abs(particle.pdgCode()) == 310) { nK0SinJet++; } else if (particle.pdgCode() == 3122) { nLambdainJet++; @@ -2606,7 +2534,7 @@ struct JetFragmentation { isParticleUsed[iparticle] = true; continue; } - if (!((TMath::Abs(particle.pdgCode()) == 310) || TMath::Abs((particle.pdgCode()) == 3122))) { + if (!((std::abs(particle.pdgCode()) == 310) || (std::abs(particle.pdgCode()) == 3122))) { isParticleUsed[iparticle] = true; continue; } @@ -2650,7 +2578,7 @@ struct JetFragmentation { PROCESS_SWITCH(JetFragmentation, processMcMatchedV0Frag, "Monte Carlo V0 fragmentation", false); void processDataV0(soa::Filtered>::iterator const& collision, - aod::V0Datas const& V0s) + soa::Join const& V0s) { if (!collision.sel8()) { return; @@ -2664,14 +2592,14 @@ struct JetFragmentation { ChargedJetsWithConstituents const& jets, aod::JetTracks const&, aod::Collisions const&, - aod::V0Datas const& allV0s) + soa::Join const& allV0s) { if (!jetderiveddatautilities::selectCollision(jcoll, eventSelectionBits)) { return; } // This is necessary, because jets are linked to aod::JetCollisions, but V0s are linked to Collisions const auto& collision = jcoll.collision_as(); - const auto& v0s = allV0s.sliceBy(V0sPerCollision, collision.globalIndex()); + const auto& v0s = allV0s.sliceBy(v0sPerCollision, collision.globalIndex()); int kNV0s = v0s.size(); bool isV0Used[kNV0s]; @@ -2716,16 +2644,16 @@ struct JetFragmentation { isV0Used[iv0] = true; nV0inJet++; fillDataV0FragHistograms(collision, jet, v0); - if (IsK0SCandidate(collision, v0)) { + if (v0.isK0SCandidate()) { nK0SinJet++; } - if (IsLambdaCandidate(collision, v0)) { + if (v0.isLambdaCandidate()) { nLambdainJet++; } - if (IsAntiLambdaCandidate(collision, v0)) { + if (v0.isAntiLambdaCandidate()) { nAntiLambdainJet++; } - // double newTrackProj = TrackProj(newjet, v0); // TODO: Does this work? + // double newTrackProj = getMomProj(newjet, v0); // TODO: Does this work? // registry.fill(HIST("data/jets/V0/jetCorrectedPtV0TrackProj"), newjet.pt(), newTrackProj); } } // v0 loop @@ -2743,7 +2671,7 @@ struct JetFragmentation { // // // ---------------- V0 jets ---------------- - void processDataV0JetsFrag(soa::Filtered::iterator const& jcoll, soa::Join const& v0jets, aod::CandidatesV0Data const& v0s) + void processDataV0JetsFrag(soa::Filtered::iterator const& jcoll, soa::Join const& v0jets, CandidatesV0DataWithFlags const& v0s) { if (!jetderiveddatautilities::selectCollision(jcoll, eventSelectionBits)) { return; @@ -2756,22 +2684,22 @@ struct JetFragmentation { continue; } // Double check if the jet contains V0s - if (!JetContainsV0s(jet)) { + if (!jetContainsV0s(jet)) { continue; } fillDataJetHistograms(jet); int nV0inJet = 0, nLambdainJet = 0, nAntiLambdainJet = 0, nK0SinJet = 0; - for (const auto& v0 : jet.candidates_as()) { + for (const auto& v0 : jet.candidates_as()) { nV0inJet++; fillDataV0FragHistograms(jcoll, jet, v0); - if (IsK0SCandidate(jcoll, v0)) { + if (v0.isK0SCandidate()) { nK0SinJet++; } - if (IsLambdaCandidate(jcoll, v0)) { + if (v0.isLambdaCandidate()) { nLambdainJet++; } - if (IsAntiLambdaCandidate(jcoll, v0)) { + if (v0.isAntiLambdaCandidate()) { nAntiLambdainJet++; } } @@ -2780,7 +2708,7 @@ struct JetFragmentation { } PROCESS_SWITCH(JetFragmentation, processDataV0JetsFrag, "Data V0 jets fragmentation", false); - void processDataV0JetsFragWithWeights(soa::Filtered::iterator const& jcoll, soa::Join const& v0jets, aod::CandidatesV0Data const& v0s) + void processDataV0JetsFragWithWeights(soa::Filtered::iterator const& jcoll, soa::Join const& v0jets, CandidatesV0DataWithFlags const& v0s) { if (!jetderiveddatautilities::selectCollision(jcoll, eventSelectionBits)) { return; @@ -2793,7 +2721,7 @@ struct JetFragmentation { continue; } // Double check if the jet contains V0s - if (!JetContainsV0s(jet)) { + if (!jetContainsV0s(jet)) { continue; } fillDataJetHistograms(jet); @@ -2802,17 +2730,17 @@ struct JetFragmentation { std::vector> weights; int nParticles = 0; int nClasses = 4; // Should be set globally? Maybe just a global constant? - for (const auto& v0 : jet.candidates_as()) { + for (const auto& v0 : jet.candidates_as()) { nParticles++; fillDataV0FragHistograms(jcoll, jet, v0); - double z = TrackProj(jet, v0); - std::vector w = getV0SignalWeight(jcoll, v0); + double z = getMomProj(jet, v0); + std::vector w = getV0SignalWeight(v0); values.push_back(z); weights.push_back(w); } values.push_back(jet.pt()); - int nStates = TMath::Power(nClasses, nParticles); + int nStates = std::pow(nClasses, nParticles); for (int M = 0; M < nStates; M++) { std::vector state = convertState(M, nParticles, nClasses); std::vector corrected = correctedValues(state, values); @@ -2827,7 +2755,7 @@ struct JetFragmentation { } PROCESS_SWITCH(JetFragmentation, processDataV0JetsFragWithWeights, "Data V0 jets fragmentation with weights", false); - void processDataV0PerpCone(soa::Filtered::iterator const& jcoll, aod::V0ChargedJets const& v0jets, aod::CandidatesV0Data const& v0s) + void processDataV0PerpCone(soa::Filtered::iterator const& jcoll, aod::V0ChargedJets const& v0jets, CandidatesV0DataWithFlags const& v0s) { if (!jetderiveddatautilities::selectCollision(jcoll, eventSelectionBits)) { return; @@ -2847,7 +2775,7 @@ struct JetFragmentation { } PROCESS_SWITCH(JetFragmentation, processDataV0PerpCone, "Perpendicular cone V0s in data", false); - void processMcMatchedV0JetsFrag(soa::Filtered::iterator const& jcoll, aod::JetMcCollisions const&, MatchedMCDV0JetsWithConstituents const& v0jetsMCD, MatchedMCPV0JetsWithConstituents const& v0jetsMCP, soa::Join const& v0s, aod::CandidatesV0MCP const& pv0s, aod::JetTracksMCD const& jTracks, aod::JetParticles const&) + void processMcMatchedV0JetsFrag(soa::Filtered::iterator const& jcoll, aod::JetMcCollisions const&, MatchedMCDV0JetsWithConstituents const& v0jetsMCD, MatchedMCPV0JetsWithConstituents const& v0jetsMCP, CandidatesV0MCDWithLabels const& v0s, aod::CandidatesV0MCP const& pv0s, aod::JetTracksMCD const& jTracks, aod::JetParticles const&) { if (!jcoll.has_mcCollision()) { return; @@ -2867,7 +2795,7 @@ struct JetFragmentation { continue; } for (const auto& pv0 : pv0s) { - if (V0sAreMatched(v0, pv0, jTracks)) { + if (v0sAreMatched(v0, pv0, jTracks)) { fillMatchingV0Histograms(jcoll, v0, pv0, weight); fillMatchingV0DauHistograms(v0, pv0, weight); } @@ -2879,14 +2807,14 @@ struct JetFragmentation { continue; } // Double check if the jet contains V0s - if (!JetContainsV0s(detJet)) { + if (!jetContainsV0s(detJet)) { continue; } fillMCDJetHistograms(detJet, weight); int nV0inJet = 0, nLambdainJet = 0, nAntiLambdainJet = 0, nK0SinJet = 0; if (!detJet.has_matchedJetGeo()) { - for (const auto& detV0 : detJet.candidates_as>()) { + for (const auto& detV0 : detJet.candidates_as()) { fillMatchingV0Fake(jcoll, detJet, detV0, weight); } continue; @@ -2894,7 +2822,7 @@ struct JetFragmentation { for (const auto& partJet : detJet.template matchedJetGeo_as()) { fillMatchingHistogramsJet(detJet, partJet, weight); - for (const auto& detV0 : detJet.candidates_as>()) { + for (const auto& detV0 : detJet.candidates_as()) { if (!detV0.has_mcParticle()) { fillMatchingV0Fake(jcoll, detJet, detV0, weight); fillMatchingV0DecayedHistograms(partJet, detJet, detV0, weight); @@ -2902,13 +2830,13 @@ struct JetFragmentation { } bool isV0Matched = false; for (const auto& partV0 : partJet.template candidates_as()) { - if (V0sAreMatched(detV0, partV0, jTracks)) { + if (v0sAreMatched(detV0, partV0, jTracks)) { isV0Matched = true; nV0inJet++; fillMatchingV0FragHistograms(jcoll, detJet, partJet, detV0, partV0, weight); fillMatchingV0DauJetHistograms(detJet, partJet, detV0, partV0, weight); - if (TMath::Abs(partV0.pdgCode()) == 310) { + if (std::abs(partV0.pdgCode()) == 310) { nK0SinJet++; } else if (partV0.pdgCode() == 3122) { nLambdainJet++; @@ -2928,7 +2856,7 @@ struct JetFragmentation { } // detJet loop for (const auto& partJet : v0jetsMCP) { - if (!JetContainsV0s(partJet)) { + if (!jetContainsV0s(partJet)) { continue; } fillMCPJetHistograms(partJet, weight); @@ -2948,8 +2876,8 @@ struct JetFragmentation { isJetMatched = true; for (const auto& partV0 : partJet.candidates_as()) { bool isV0Matched = false; - for (const auto& detV0 : detJet.candidates_as>()) { - if (V0sAreMatched(detV0, partV0, jTracks)) { + for (const auto& detV0 : detJet.candidates_as()) { + if (v0sAreMatched(detV0, partV0, jTracks)) { isV0Matched = true; break; } @@ -2970,7 +2898,7 @@ struct JetFragmentation { } PROCESS_SWITCH(JetFragmentation, processMcMatchedV0JetsFrag, "Matched V0 jets fragmentation", false); - void processMcV0PerpCone(soa::Filtered::iterator const& jcoll, aod::JetMcCollisions const&, MatchedMCDV0Jets const& v0jets, soa::Join const& v0s, aod::McParticles const& particles) + void processMcV0PerpCone(soa::Filtered::iterator const& jcoll, aod::JetMcCollisions const&, MatchedMCDV0Jets const& v0jets, CandidatesV0MCDWithLabels const& v0s, aod::McParticles const& particles) { if (!jetderiveddatautilities::selectCollision(jcoll, eventSelectionBits)) { return; @@ -2991,7 +2919,7 @@ struct JetFragmentation { } PROCESS_SWITCH(JetFragmentation, processMcV0PerpCone, "Perpendicular cone V0s in MC", false); - void processMcV0MatchedPerpCone(soa::Filtered::iterator const& jcoll, aod::JetMcCollisions const&, MatchedMCDV0Jets const& v0jets, MatchedMCPV0Jets const&, soa::Join const& v0s, aod::McParticles const& particles) + void processMcV0MatchedPerpCone(soa::Filtered::iterator const& jcoll, aod::JetMcCollisions const&, MatchedMCDV0Jets const& v0jets, MatchedMCPV0Jets const&, CandidatesV0MCDWithLabels const& v0s, aod::McParticles const& particles) { if (!jetderiveddatautilities::selectCollision(jcoll, eventSelectionBits)) { return; @@ -3007,7 +2935,7 @@ struct JetFragmentation { if (!jetfindingutilities::isInEtaAcceptance(mcdjet, -99., -99., v0EtaMin, v0EtaMax)) { continue; } - for (const auto& mcpjet : mcdjet.template matchedJetGeo_as()) { + for (const auto& mcpjet : mcdjet.template matchedJetGeo_as()) { fillMcPerpConeHists(jcoll, mcdjet, mcpjet, v0s, particles, weight); break; // Make sure we only do this once } @@ -3019,5 +2947,5 @@ struct JetFragmentation { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"jet-fragmentation"})}; + adaptAnalysisTask(cfgc)}; } diff --git a/PWGJE/Tasks/v0QA.cxx b/PWGJE/Tasks/v0QA.cxx index 852794c5a21..0dea51f55db 100644 --- a/PWGJE/Tasks/v0QA.cxx +++ b/PWGJE/Tasks/v0QA.cxx @@ -9,10 +9,10 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +/// \file v0QA.cxx /// \brief QA task for V0s in the jets framework, based on the LF v0cascadesqa task -// +/// /// \author Gijs van Weelden -// #include #include @@ -47,6 +47,8 @@ using MCDV0JetsWithConstituents = soa::Join; using MatchedMCDV0JetsWithConstituents = soa::Join; +using CandidatesV0MCDWithFlags = soa::Join; + using MCPV0Jets = aod::V0ChargedMCParticleLevelJets; using MCPV0JetsWithConstituents = soa::Join; using MatchedMCPV0Jets = soa::Join; @@ -73,7 +75,7 @@ struct V0QA { ConfigurableAxis binPtJet{"ptJet", {100., 0.0f, 50.0f}, ""}; ConfigurableAxis binPtV0{"ptV0", {100., 0.0f, 50.0f}, ""}; ConfigurableAxis binEta{"binEta", {100, -1.0f, 1.0f}, ""}; - ConfigurableAxis binPhi{"binPhi", {static_cast(TMath::Pi()) * 10 / 2, 0.0f, 2. * static_cast(TMath::Pi())}, ""}; + ConfigurableAxis binPhi{"binPhi", {constants::math::PI * 10 / 2, 0.0f, constants::math::TwoPI}, ""}; ConfigurableAxis binInvMassK0S{"binInvMassK0S", {200, 0.4f, 0.6f}, ""}; ConfigurableAxis binInvMassLambda{"binInvMassLambda", {200, 1.07f, 1.17f}, ""}; @@ -83,6 +85,7 @@ struct V0QA { ConfigurableAxis binsDcaXY{"binsDcaXY", {100, -0.5f, 0.5f}, ""}; ConfigurableAxis binsDcaZ{"binsDcaZ", {100, -5.f, 5.f}, ""}; ConfigurableAxis binPtDiff{"ptdiff", {200., -49.5f, 50.5f}, ""}; + ConfigurableAxis binPtRelDiff{"ptreldiff", {100., -1.0f, 1.0f}, ""}; ConfigurableAxis binITSNCl{"ITSNCl", {8, -0.5, 7.5}, ""}; ConfigurableAxis binITSChi2NCl{"ITSChi2NCl", {100, 0, 40}, ""}; @@ -108,6 +111,7 @@ struct V0QA { const AxisSpec axisAntiLambdaM{binInvMassLambda, "M(#bar{p} #pi^{+}) (GeV/c^{2})"}; const AxisSpec axisPtDiff{binPtDiff, "Pt difference (GeV/c)"}; + const AxisSpec axisPtRelDiff{binPtRelDiff, "Pt relative difference"}; const AxisSpec axisDcaXY{binsDcaXY, "DCA_{xy} (cm)"}; const AxisSpec axisDcaZ{binsDcaZ, "DCA_{z} (cm)"}; const AxisSpec axisITSNCl{binITSNCl, "# clusters ITS"}; @@ -223,7 +227,7 @@ struct V0QA { if (doprocessV0TrackQA) { registry.add("tracks/Pos", "pos", HistType::kTHnSparseD, {axisV0Pt, axisV0Pt, axisEta, axisPhi}); registry.add("tracks/Neg", "neg", HistType::kTHnSparseD, {axisV0Pt, axisV0Pt, axisEta, axisPhi}); - registry.add("tracks/Pt", "pt", HistType::kTHnSparseD, {axisV0Pt, axisV0Pt, axisV0Pt, axisPtDiff}); + registry.add("tracks/Pt", "pt", HistType::kTHnSparseD, {axisV0Pt, axisV0Pt, axisV0Pt, axisPtDiff, axisPtRelDiff}); registry.add("tracks/PtMass", "pt mass", HistType::kTHnSparseD, {axisV0Pt, axisV0Pt, axisV0Pt, axisK0SM, axisLambdaM, axisAntiLambdaM}); registry.add("tracks/PtDiffMass", "ptdiff mass", HistType::kTHnSparseD, {axisV0Pt, axisPtDiff, axisK0SM, axisLambdaM, axisAntiLambdaM}); @@ -407,7 +411,7 @@ struct V0QA { return true; } template - bool V0sAreMatched(T const& v0, U const& particle, V const& /*tracks*/) + bool v0sAreMatched(T const& v0, U const& particle, V const& /*tracks*/) { // This is necessary, because the V0Labels table points to aod::McParticles, not to aod::CandidatesV0MCP auto negId = v0.template negTrack_as().mcParticleId(); @@ -415,54 +419,6 @@ struct V0QA { auto daughters = particle.daughtersIds(); return ((negId == daughters[0] && posId == daughters[1]) || (posId == daughters[0] && negId == daughters[1])); } - template - bool isV0Reconstructed(T collision, U const& v0, int pdg) - { - // TODO: This should use the JE V0 selector once it it ready! - if (v0.v0cosPA() < v0cospaMin) - return false; - if (v0.v0radius() < v0radiusMin) - return false; - if (v0.dcaV0daughters() > dcav0dauMax) - return false; - - // K0S - if (TMath::Abs(pdg) == 310) { - if (TMath::Abs(v0.dcapostopv()) < dcapiMin) - return false; - if (TMath::Abs(v0.dcanegtopv()) < dcapiMin) - return false; - if (TMath::Abs(v0.yK0Short()) > yK0SMax) - return false; - float ctauK0S = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short; - if (ctauK0S > lifetimeK0SMax) - return false; - } - // Lambda - if (pdg == 3122) { - if (TMath::Abs(v0.dcapostopv()) < dcaprMin) - return false; - if (TMath::Abs(v0.dcanegtopv()) < dcapiMin) - return false; - if (TMath::Abs(v0.yLambda()) > yLambdaMax) - return false; - float ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0; - if (ctauLambda > lifetimeLambdaMax) - return false; - } - if (pdg == -3122) { - if (TMath::Abs(v0.dcapostopv()) < dcapiMin) - return false; - if (TMath::Abs(v0.dcanegtopv()) < dcaprMin) - return false; - if (TMath::Abs(v0.yLambda()) > yLambdaMax) - return false; - float ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0Bar; - if (ctauAntiLambda > lifetimeLambdaMax) - return false; - } - return true; - } template bool hasITSHit(T const& track, int layer) @@ -488,7 +444,7 @@ struct V0QA { registry.fill(HIST("tracks/Pos"), vPt, pPt, posTrack.eta(), posTrack.phi()); registry.fill(HIST("tracks/Neg"), vPt, nPt, negTrack.eta(), negTrack.phi()); - registry.fill(HIST("tracks/Pt"), vPt, pPt, nPt, dPt); + registry.fill(HIST("tracks/Pt"), vPt, pPt, nPt, dPt, dPt / vPt); registry.fill(HIST("tracks/PtMass"), vPt, pPt, nPt, mK, mL, mAL); registry.fill(HIST("tracks/PtDiffMass"), vPt, dPt, mK, mL, mAL); @@ -685,8 +641,6 @@ struct V0QA { registry.fill(HIST("tracks/TPC/negNClsCrossedRowsOverFindableCls"), vPt, pPt, nPt, negTrack.tpcCrossedRowsOverFindableCls()); } - using CandidatesV0MCDWithFlags = soa::Join; - void processDummy(aod::CandidatesV0MCD const&) {} PROCESS_SWITCH(V0QA, processDummy, "Dummy process function turned on by default", true); @@ -739,7 +693,7 @@ struct V0QA { continue; // K0S - if (TMath::Abs(pdg) == 310) { + if (std::abs(pdg) == 310) { registry.fill(HIST("inclusive/K0SPtEtaMass"), v0.pt(), v0.eta(), v0.mK0Short(), weight); registry.fill(HIST("inclusive/InvMassK0STrue"), v0.pt(), v0.v0radius(), v0.mK0Short(), weight); } @@ -761,7 +715,7 @@ struct V0QA { registry.fill(HIST("inclusive/hMcEvents"), 0.5); bool isReconstructed = false; - for (auto collision : collisions) { + for (const auto& collision : collisions) { if (!isCollisionReconstructed(collision, eventSelectionBits)) { continue; } @@ -778,25 +732,25 @@ struct V0QA { registry.fill(HIST("inclusive/hMcEvents"), 1.5); double weight = mccoll.weight(); - for (auto& pv0 : pv0s) { + for (const auto& pv0 : pv0s) { if (!pv0.has_daughters()) continue; if (!pv0.isPhysicalPrimary()) continue; - if (TMath::Abs(pv0.y() > yPartMax)) + if (std::abs(pv0.y()) > yPartMax) continue; // Can calculate this from aod::CandidatesV0MCD (contains decay vertex) - double R_Decay = 1.0; + double r_Decay = 1.0; if (pv0.pdgCode() == 310) { - registry.fill(HIST("inclusive/GeneratedK0S"), pv0.pt(), pv0.eta(), R_Decay, weight); + registry.fill(HIST("inclusive/GeneratedK0S"), pv0.pt(), pv0.eta(), r_Decay, weight); } if (pv0.pdgCode() == 3122) { - registry.fill(HIST("inclusive/GeneratedLambda"), pv0.pt(), pv0.eta(), R_Decay, weight); + registry.fill(HIST("inclusive/GeneratedLambda"), pv0.pt(), pv0.eta(), r_Decay, weight); } if (pv0.pdgCode() == -3122) { - registry.fill(HIST("inclusive/GeneratedAntiLambda"), pv0.pt(), pv0.eta(), R_Decay, weight); + registry.fill(HIST("inclusive/GeneratedAntiLambda"), pv0.pt(), pv0.eta(), r_Decay, weight); } } } @@ -824,7 +778,7 @@ struct V0QA { continue; // K0S - if (TMath::Abs(pdg) == 310) { + if (std::abs(pdg) == 310) { registry.fill(HIST("jets/JetPtEtaK0SPt"), mcdjet.pt(), mcdjet.eta(), v0.pt(), weight); registry.fill(HIST("jets/InvMassJetK0STrue"), mcdjet.pt(), v0.pt(), v0.mK0Short(), weight); } @@ -859,7 +813,7 @@ struct V0QA { continue; for (const auto& pv0 : mcpjet.template candidates_as()) { - if (!V0sAreMatched(v0, pv0, jTracks)) + if (!v0sAreMatched(v0, pv0, jTracks)) continue; int pdg = pv0.pdgCode(); @@ -868,7 +822,7 @@ struct V0QA { continue; // K0S - if (TMath::Abs(pdg) == 310) { + if (std::abs(pdg) == 310) { registry.fill(HIST("jets/JetsPtEtaK0SPt"), mcpjet.pt(), mcdjet.pt(), mcdjet.eta(), v0.pt(), weight); registry.fill(HIST("jets/InvMassJetsK0STrue"), mcpjet.pt(), mcdjet.pt(), v0.pt(), v0.mK0Short(), weight); } @@ -893,7 +847,7 @@ struct V0QA { registry.fill(HIST("jets/hMcJetEvents"), 0.5); bool isReconstructed = false; - for (auto collision : collisions) { + for (const auto& collision : collisions) { if (!isCollisionReconstructed(collision, eventSelectionBits)) { continue; } @@ -910,14 +864,14 @@ struct V0QA { registry.fill(HIST("jets/hMcJetEvents"), 1.5); double weight = mccoll.weight(); - for (auto& jet : jets) { + for (const auto& jet : jets) { // if (!jetfindingutilities::isInEtaAcceptance(jet, -99., -99., v0EtaMin, v0EtaMax)) for (const auto& pv0 : jet.template candidates_as()) { if (!pv0.has_daughters()) continue; if (!pv0.isPhysicalPrimary()) continue; - if (TMath::Abs(pv0.y() > yPartMax)) + if (std::abs(pv0.y()) > yPartMax) continue; // TODO: Should actually check the jets if (pv0.pdgCode() == 310) { @@ -960,7 +914,7 @@ struct V0QA { if (!correctCollision) { registry.fill(HIST("collisions/V0PtEtaWrongColl"), pv0.pt(), pv0.eta(), weight); } - if (TMath::Abs(pdg) == 310) { + if (std::abs(pdg) == 310) { registry.fill(HIST("collisions/K0SPtEtaMass"), pv0.pt(), pv0.eta(), v0.mK0Short(), weight); if (!correctCollision) { registry.fill(HIST("collisions/K0SPtEtaMassWrongColl"), pv0.pt(), pv0.eta(), v0.mK0Short(), weight); @@ -1002,7 +956,7 @@ struct V0QA { } PROCESS_SWITCH(V0QA, processCollisionAssociation, "V0 collision association", false); - void processCollisionAssociationJets(soa::Filtered::iterator const& jcoll, MCDV0JetsWithConstituents const& mcdjets, soa::Join const&, soa::Join const&, aod::McCollisions const&, aod::McParticles const&) + void processCollisionAssociationJets(soa::Filtered::iterator const& jcoll, MCDV0JetsWithConstituents const& mcdjets, CandidatesV0MCDWithFlags const&, soa::Join const&, aod::McCollisions const&, aod::McParticles const&) { if (!jcoll.has_mcCollision()) { return; @@ -1012,7 +966,7 @@ struct V0QA { for (const auto& mcdjet : mcdjets) { // Eta cut? - for (const auto& v0 : mcdjet.template candidates_as>()) { + for (const auto& v0 : mcdjet.template candidates_as()) { if (!v0.has_mcParticle()) { continue; } @@ -1022,14 +976,14 @@ struct V0QA { int pdg = pv0.pdgCode(); // Check V0 decay kinematics - if (!isV0Reconstructed(jcoll, v0, pdg)) + if (v0.isRejectedCandidate()) continue; registry.fill(HIST("collisions/JetPtEtaV0Pt"), mcdjet.pt(), mcdjet.eta(), pv0.pt(), weight); if (!correctCollision) { registry.fill(HIST("collisions/JetPtEtaV0PtWrongColl"), mcdjet.pt(), mcdjet.eta(), pv0.pt(), weight); } - if (TMath::Abs(pdg) == 310) { + if (std::abs(pdg) == 310) { registry.fill(HIST("collisions/JetPtEtaK0SPtMass"), mcdjet.pt(), mcdjet.eta(), pv0.pt(), v0.mK0Short(), weight); if (!correctCollision) { registry.fill(HIST("collisions/JetPtEtaK0SPtMassWrongColl"), mcdjet.pt(), mcdjet.eta(), pv0.pt(), v0.mK0Short(), weight); @@ -1071,7 +1025,7 @@ struct V0QA { } PROCESS_SWITCH(V0QA, processCollisionAssociationJets, "V0 in jets collision association", false); - void processCollisionAssociationMatchedJets(soa::Filtered::iterator const& jcoll, MatchedMCDV0JetsWithConstituents const& mcdjets, MatchedMCPV0JetsWithConstituents const&, soa::Join const&, soa::Join const&, aod::McCollisions const&, aod::McParticles const&, aod::JetTracksMCD const& jTracks) + void processCollisionAssociationMatchedJets(soa::Filtered::iterator const& jcoll, MatchedMCDV0JetsWithConstituents const& mcdjets, MatchedMCPV0JetsWithConstituents const&, CandidatesV0MCDWithFlags const&, aod::CandidatesV0MCP const&, soa::Join const&, aod::McCollisions const&, aod::McParticles const&, aod::JetTracksMCD const& jTracks) { if (!jcoll.has_mcCollision()) { return; @@ -1081,25 +1035,25 @@ struct V0QA { for (const auto& mcdjet : mcdjets) { for (const auto& mcpjet : mcdjet.template matchedJetGeo_as()) { - for (const auto& v0 : mcdjet.template candidates_as>()) { + for (const auto& v0 : mcdjet.template candidates_as()) { if (!v0.has_mcParticle()) continue; for (const auto& pv0 : mcpjet.template candidates_as()) { - if (!V0sAreMatched(v0, pv0, jTracks)) + if (!v0sAreMatched(v0, pv0, jTracks)) continue; int pdg = pv0.pdgCode(); bool correctCollision = (mcColl.mcCollisionId() == pv0.mcCollisionId()); // Check V0 decay kinematics - if (!isV0Reconstructed(jcoll, v0, pdg)) + if (v0.isRejectedCandidate()) continue; registry.fill(HIST("collisions/JetsPtEtaV0Pt"), mcpjet.pt(), mcdjet.pt(), mcdjet.eta(), pv0.pt(), weight); if (!correctCollision) { registry.fill(HIST("collisions/JetsPtEtaV0PtWrongColl"), mcpjet.pt(), mcdjet.pt(), mcdjet.eta(), pv0.pt(), weight); } - if (TMath::Abs(pdg) == 310) { + if (std::abs(pdg) == 310) { registry.fill(HIST("collisions/JetsPtEtaK0SPtMass"), mcpjet.pt(), mcdjet.pt(), mcdjet.eta(), pv0.pt(), v0.mK0Short(), weight); if (!correctCollision) { registry.fill(HIST("collisions/JetsPtEtaK0SPtMassWrongColl"), mcpjet.pt(), mcdjet.pt(), mcdjet.eta(), pv0.pt(), v0.mK0Short(), weight); @@ -1235,7 +1189,7 @@ struct V0QA { continue; for (const auto& pv0 : mcpjet.template candidates_as()) { - if (!V0sAreMatched(v0, pv0, jTracks)) + if (!v0sAreMatched(v0, pv0, jTracks)) continue; int pdg = v0.mcParticle().pdgCode(); From e577cad1488e9880c4ef4b27c4eb8a9b0a88ea49 Mon Sep 17 00:00:00 2001 From: alcaliva <32872606+alcaliva@users.noreply.github.com> Date: Thu, 20 Feb 2025 11:26:23 +0100 Subject: [PATCH 0335/1650] [PWGLF] added functions to process mc gen and rec using jet finder (#10101) --- PWGLF/Tasks/Nuspex/antinucleiInJets.cxx | 537 +++++++++++++++++++++--- 1 file changed, 482 insertions(+), 55 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx index eb33686a64d..8f8a11f899b 100644 --- a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx +++ b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx @@ -143,7 +143,12 @@ struct AntinucleiInJets { twoDweightsAntipUe = nullptr; } - // QC Histograms + // binning + double min = 0.0; + double max = 6.0; + int nbins = 120; + + // QC histograms if (doprocessQC) { registryQC.add("deltaEta_deltaPhi_jet", "deltaEta_deltaPhi_jet", HistType::kTH2F, {{200, -0.5, 0.5, "#Delta#eta"}, {200, 0, PIHalf, "#Delta#phi"}}); registryQC.add("deltaEta_deltaPhi_ue", "deltaEta_deltaPhi_ue", HistType::kTH2F, {{200, -0.5, 0.5, "#Delta#eta"}, {200, 0, PIHalf, "#Delta#phi"}}); @@ -160,15 +165,7 @@ struct AntinucleiInJets { registryQC.add("jetPtDifference", "jetPtDifference", HistType::kTH1F, {{200, -1, 1, "#Deltap_{T}^{jet}"}}); } - // event counter MC - registryMC.add("number_of_events_mc", "number of events in mc", HistType::kTH1F, {{10, 0, 10, "counter"}}); - - // Binning - double min = 0.0; - double max = 6.0; - int nbins = 120; - - // data + // data histograms if (doprocessData) { // event counter data @@ -201,43 +198,59 @@ struct AntinucleiInJets { registryData.add("helium3_ue_tpc", "helium3_ue_tpc", HistType::kTH2F, {{nbins, min * 3, max * 3, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}}); } - // Generated - registryMC.add("antiproton_jet_gen", "antiproton_jet_gen", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antideuteron_jet_gen", "antideuteron_jet_gen", HistType::kTH1F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antihelium3_jet_gen", "antihelium3_jet_gen", HistType::kTH1F, {{nbins, min * 3, max * 3, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antiproton_ue_gen", "antiproton_ue_gen", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antideuteron_ue_gen", "antideuteron_ue_gen", HistType::kTH1F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antihelium3_ue_gen", "antihelium3_ue_gen", HistType::kTH1F, {{nbins, min * 3, max * 3, "#it{p}_{T} (GeV/#it{c})"}}); - - // Reconstructed TPC - registryMC.add("antiproton_jet_rec_tpc", "antiproton_jet_rec_tpc", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antideuteron_jet_rec_tpc", "antideuteron_jet_rec_tpc", HistType::kTH1F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antihelium3_jet_rec_tpc", "antihelium3_jet_rec_tpc", HistType::kTH1F, {{nbins, min * 3, max * 3, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antiproton_ue_rec_tpc", "antiproton_ue_rec_tpc", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antideuteron_ue_rec_tpc", "antideuteron_ue_rec_tpc", HistType::kTH1F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antihelium3_ue_rec_tpc", "antihelium3_ue_rec_tpc", HistType::kTH1F, {{nbins, min * 3, max * 3, "#it{p}_{T} (GeV/#it{c})"}}); - - // Reconstructed TOF - registryMC.add("antiproton_jet_rec_tof", "antiproton_jet_rec_tof", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antideuteron_jet_rec_tof", "antideuteron_jet_rec_tof", HistType::kTH1F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antiproton_ue_rec_tof", "antiproton_ue_rec_tof", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antideuteron_ue_rec_tof", "antideuteron_ue_rec_tof", HistType::kTH1F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}}); - - // Fraction of Primary Antiprotons from MC - registryMC.add("antiproton_prim", "antiproton_prim", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antiproton_all", "antiproton_all", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antiproton_prim_jet", "antiproton_prim_jet", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antiproton_all_jet", "antiproton_all_jet", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antiproton_prim_ue", "antiproton_prim_ue", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antiproton_all_ue", "antiproton_all_ue", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); - - // Antiproton Reweighting - registryMC.add("antiproton_eta_pt_pythia", "antiproton_eta_pt_pythia", HistType::kTH2F, {{200, 0.0, 10.0, "#it{p}_{T} (GeV/#it{c})"}, {20, -1.0, 1.0, "#it{#eta}"}}); - registryMC.add("antiproton_eta_pt_jet", "antiproton_eta_pt_jet", HistType::kTH2F, {{200, 0.0, 10.0, "#it{p}_{T} (GeV/#it{c})"}, {20, -1.0, 1.0, "#it{#eta}"}}); - registryMC.add("antiproton_eta_pt_ue", "antiproton_eta_pt_ue", HistType::kTH2F, {{200, 0.0, 10.0, "#it{p}_{T} (GeV/#it{c})"}, {20, -1.0, 1.0, "#it{#eta}"}}); - - // Detector Response Matrix - registryMC.add("detectorResponseMatrix", "detectorResponseMatrix", HistType::kTH2F, {{5000, 0.0, 50.0, "#it{p}_{T}^{gen} (GeV/#it{c})"}, {5000, 0.0, 50.0, "#it{p}_{T}^{rec} (GeV/#it{c})"}}); + // monte carlo histograms + if (doprocessEfficiency) { + + // event counter MC + registryMC.add("number_of_events_mc", "number of events in mc", HistType::kTH1F, {{10, 0, 10, "counter"}}); + + // generated spectra + registryMC.add("antiproton_incl_gen", "antiproton_incl_gen", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("deuteron_incl_gen", "deuteron_incl_gen", HistType::kTH1F, {{nbins, 2 * min, 2 * max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antideuteron_incl_gen", "antideuteron_incl_gen", HistType::kTH1F, {{nbins, 2 * min, 2 * max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("helium3_incl_gen", "helium3_incl_gen", HistType::kTH1F, {{nbins, 3 * min, 3 * max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antihelium3_incl_gen", "antihelium3_incl_gen", HistType::kTH1F, {{nbins, 3 * min, 3 * max, "#it{p}_{T} (GeV/#it{c})"}}); + + // reconstructed TPC + registryMC.add("antiproton_incl_rec_tpc", "antiproton_incl_rec_tpc", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antideuteron_incl_rec_tpc", "antideuteron_incl_rec_tpc", HistType::kTH1F, {{nbins, 2 * min, 2 * max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("deuteron_incl_rec_tpc", "deuteron_incl_rec_tpc", HistType::kTH1F, {{nbins, 2 * min, 2 * max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antihelium3_incl_rec_tpc", "antihelium3_incl_rec_tpc", HistType::kTH1F, {{nbins, 3 * min, 3 * max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("helium3_incl_rec_tpc", "helium3_incl_rec_tpc", HistType::kTH1F, {{nbins, 3 * min, 3 * max, "#it{p}_{T} (GeV/#it{c})"}}); + + // reconstructed TOF + registryMC.add("antiproton_incl_rec_tof", "antiproton_incl_rec_tof", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antideuteron_incl_rec_tof", "antideuteron_incl_rec_tof", HistType::kTH1F, {{nbins, 2 * min, 2 * max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("deuteron_incl_rec_tof", "deuteron_incl_rec_tof", HistType::kTH1F, {{nbins, 2 * min, 2 * max, "#it{p}_{T} (GeV/#it{c})"}}); + + // fraction of primary antiprotons from MC + registryMC.add("antiproton_incl_prim", "antiproton_incl_prim", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antiproton_incl_all", "antiproton_incl_all", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + + // antiproton reweighting + registryMC.add("antiproton_eta_pt_pythia", "antiproton_eta_pt_pythia", HistType::kTH2F, {{200, 0.0, 10.0, "#it{p}_{T} (GeV/#it{c})"}, {20, -1.0, 1.0, "#it{#eta}"}}); + } + + if (doprocessJetsMCgen) { + registryMC.add("antiproton_jet_gen", "antiproton_jet_gen", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antiproton_ue_gen", "antiproton_ue_gen", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antiproton_eta_pt_jet", "antiproton_eta_pt_jet", HistType::kTH2F, {{200, 0.0, 10.0, "#it{p}_{T} (GeV/#it{c})"}, {20, -1.0, 1.0, "#it{#eta}"}}); + registryMC.add("antiproton_eta_pt_ue", "antiproton_eta_pt_ue", HistType::kTH2F, {{200, 0.0, 10.0, "#it{p}_{T} (GeV/#it{c})"}, {20, -1.0, 1.0, "#it{#eta}"}}); + } + + if (doprocessJetsMCrec) { + registryMC.add("antiproton_jet_prim", "antiproton_jet_prim", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antiproton_jet_all", "antiproton_jet_all", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antiproton_ue_prim", "antiproton_ue_prim", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antiproton_ue_all", "antiproton_all_ue", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antiproton_jet_rec_tpc", "antiproton_jet_rec_tpc", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antiproton_ue_rec_tpc", "antiproton_ue_rec_tpc", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antiproton_jet_rec_tof", "antiproton_jet_rec_tof", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antiproton_ue_rec_tof", "antiproton_ue_rec_tof", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + + // detector response matrix + registryMC.add("detectorResponseMatrix", "detectorResponseMatrix", HistType::kTH2F, {{1000, 0.0, 100.0, "#it{p}_{T}^{gen} (GeV/#it{c})"}, {2000, -20.0, 20.0, "#it{p}_{T}^{gen} - #it{p}_{T}^{rec} (GeV/#it{c})"}}); + } } void getPerpendicularAxis(TVector3 p, TVector3& u, double sign) @@ -330,9 +343,9 @@ struct AntinucleiInJets { return false; if (track.eta() < -0.8 || track.eta() > 0.8) return false; - if (track.pt() < 0.15) + if (track.pt() < 0.1) return false; - if (std::fabs(track.dcaXY()) > 0.25) + if (std::fabs(track.dcaXY()) > (0.0105 + 0.035 / std::pow(track.pt(), 1.1))) return false; if (std::fabs(track.dcaZ()) > 2.0) return false; @@ -425,7 +438,7 @@ struct AntinucleiInJets { // loop over reconstructed tracks int id(-1); std::vector fjParticles; - for (auto track : tracks) { // o2-linter: disable=[const-ref-in-for-loop] + for (auto const& track : tracks) { id++; if (!passedTrackSelectionForJetReconstruction(track)) continue; @@ -475,7 +488,7 @@ struct AntinucleiInJets { o2::aod::ITSResponse itsResponse; // loop over jet constituents - for (const auto& particle : jetConstituents) { // o2-linter: disable=[const-ref-in-for-loop] + for (const auto& particle : jetConstituents) { // get corresponding track and apply track selection criteria auto const& track = tracks.iteratorAt(particle.user_index()); @@ -552,7 +565,7 @@ struct AntinucleiInJets { } // underlying event - for (auto track : tracks) { // o2-linter: disable=[const-ref-in-for-loop] + for (auto const& track : tracks) { // get corresponding track and apply track selection criteria if (!passedTrackSelection(track)) @@ -652,7 +665,7 @@ struct AntinucleiInJets { // loop over reconstructed tracks std::vector fjParticles; - for (auto track : tracks) { // o2-linter: disable=[const-ref-in-for-loop] + for (auto const& track : tracks) { if (!passedTrackSelectionForJetReconstruction(track)) continue; @@ -707,7 +720,7 @@ struct AntinucleiInJets { registryQC.fill(HIST("NchJetCone"), static_cast(jetConstituents.size())); // loop over jet constituents - for (const auto& particle : jetConstituents) { // o2-linter: disable=[const-ref-in-for-loop] + for (const auto& particle : jetConstituents) { double deltaEta = particle.eta() - jetAxis.Eta(); double deltaPhi = getDeltaPhi(particle.phi(), jetAxis.Phi()); @@ -717,7 +730,7 @@ struct AntinucleiInJets { // loop over particles in perpendicular cones double nParticlesPerp(0); double ptPerp(0); - for (auto track : tracks) { // o2-linter: disable=[const-ref-in-for-loop] + for (auto const& track : tracks) { if (!passedTrackSelectionForJetReconstruction(track)) continue; @@ -745,6 +758,420 @@ struct AntinucleiInJets { registryQC.fill(HIST("nJetsSelectedHighPt"), njetsHighPt); } PROCESS_SWITCH(AntinucleiInJets, processQC, "Process QC", false); + + void processEfficiency(SimCollisions const& collisions, MCTracks const& mcTracks, aod::McParticles const& mcParticles) + { + for (const auto& collision : collisions) { + + // event counter before event selection + registryMC.fill(HIST("number_of_events_mc"), 0.5); + + // event selection + if (!collision.sel8() || std::fabs(collision.posZ()) > zVtx) + continue; + + // event counter after event selection + registryMC.fill(HIST("number_of_events_mc"), 1.5); + + // generated + for (const auto& particle : mcParticles) { + + if (!particle.isPhysicalPrimary()) + continue; + + if (particle.pdgCode() == -2212) { + registryMC.fill(HIST("antiproton_eta_pt_pythia"), particle.pt(), particle.eta()); + } + + if (particle.eta() < minEta || particle.eta() > maxEta) + continue; + + switch (particle.pdgCode()) { + case -2212: + registryMC.fill(HIST("antiproton_incl_gen"), particle.pt()); + break; + case 1000010020: + registryMC.fill(HIST("deuteron_incl_gen"), particle.pt()); + break; + case -1000010020: + registryMC.fill(HIST("antideuteron_incl_gen"), particle.pt()); + break; + case 1000020030: + registryMC.fill(HIST("helium3_incl_gen"), particle.pt()); + break; + case -1000020030: + registryMC.fill(HIST("antihelium3_incl_gen"), particle.pt()); + break; + } + } + + // ITS pid using cluster size + o2::aod::ITSResponse itsResponse; + + // Reconstructed Tracks + for (auto const& track : mcTracks) { + + // Track Selection + if (!passedTrackSelection(track)) + continue; + if (std::fabs(track.dcaXY()) > maxDcaxy) + continue; + if (std::fabs(track.dcaZ()) > maxDcaz) + continue; + + // Get MC Particle + if (!track.has_mcParticle()) + continue; + const auto particle = track.mcParticle(); + + // Variables + double nsigmaTPCPr = track.tpcNSigmaPr(); + double nsigmaTOFPr = track.tofNSigmaPr(); + double nsigmaTPCDe = track.tpcNSigmaDe(); + double nsigmaTOFDe = track.tofNSigmaDe(); + double nsigmaTPCHe = track.tpcNSigmaHe(); + + // particle identification using the ITS cluster size + bool passedItsPidProt(false), passedItsPidDeut(false), passedItsPidHel(false); + if (itsResponse.nSigmaITS(track) > nSigmaItsMin && itsResponse.nSigmaITS(track) < nSigmaItsMax) { + passedItsPidProt = true; + } + if (itsResponse.nSigmaITS(track) > nSigmaItsMin && itsResponse.nSigmaITS(track) < nSigmaItsMax) { + passedItsPidDeut = true; + } + if (itsResponse.nSigmaITS(track) > nSigmaItsMin && itsResponse.nSigmaITS(track) < nSigmaItsMax) { + passedItsPidHel = true; + } + if (!applyItsPid) { + passedItsPidProt = true; + passedItsPidDeut = true; + passedItsPidHel = true; + } + if (track.pt() > ptMaxItsPidProt) + passedItsPidProt = true; + if (track.pt() > ptMaxItsPidDeut) + passedItsPidDeut = true; + if ((2.0 * track.pt()) > ptMaxItsPidHel) + passedItsPidHel = true; + + if (particle.pdgCode() == -2212) + registryMC.fill(HIST("antiproton_incl_all"), track.pt()); + + if (!particle.isPhysicalPrimary()) + continue; + + if (particle.pdgCode() == -2212) + registryMC.fill(HIST("antiproton_incl_prim"), track.pt()); + + // antiprotons + if (particle.pdgCode() == -2212 && passedItsPidProt) { + if (nsigmaTPCPr > minNsigmaTpc && nsigmaTPCPr < maxNsigmaTpc) { + registryMC.fill(HIST("antiproton_incl_rec_tpc"), track.pt()); + if (track.hasTOF() && nsigmaTOFPr > minNsigmaTof && nsigmaTOFPr < maxNsigmaTof) + registryMC.fill(HIST("antiproton_incl_rec_tof"), track.pt()); + } + } + + // antideuterons + if (particle.pdgCode() == -1000010020 && passedItsPidDeut) { + if (nsigmaTPCDe > minNsigmaTpc && nsigmaTPCDe < maxNsigmaTpc) { + registryMC.fill(HIST("antideuteron_incl_rec_tpc"), track.pt()); + if (track.hasTOF() && nsigmaTOFDe > minNsigmaTof && nsigmaTOFDe < maxNsigmaTof) + registryMC.fill(HIST("antideuteron_incl_rec_tof"), track.pt()); + } + } + + // deuterons + if (particle.pdgCode() == 1000010020 && passedItsPidDeut) { + if (nsigmaTPCDe > minNsigmaTpc && nsigmaTPCDe < maxNsigmaTpc) { + registryMC.fill(HIST("deuteron_incl_rec_tpc"), track.pt()); + if (track.hasTOF() && nsigmaTOFDe > minNsigmaTof && nsigmaTOFDe < maxNsigmaTof) + registryMC.fill(HIST("deuteron_incl_rec_tof"), track.pt()); + } + } + + // antihelium3 + if (particle.pdgCode() == -1000020030 && passedItsPidHel) { + if (nsigmaTPCHe > minNsigmaTpc && nsigmaTPCHe < maxNsigmaTpc) { + registryMC.fill(HIST("antihelium3_incl_rec_tpc"), 2.0 * track.pt()); + } + } + + // helium3 + if (particle.pdgCode() == 1000020030 && passedItsPidHel) { + if (nsigmaTPCHe > minNsigmaTpc && nsigmaTPCHe < maxNsigmaTpc) { + registryMC.fill(HIST("helium3_incl_rec_tpc"), 2.0 * track.pt()); + } + } + } + } + } + PROCESS_SWITCH(AntinucleiInJets, processEfficiency, "process efficiency", false); + + void processJetsMCgen(SimCollisions const& collisions, aod::McParticles const& mcParticles) + { + for (const auto& collision : collisions) { + + // event selection + if (!collision.sel8() || std::fabs(collision.posZ()) > zVtx) + continue; + + std::vector fjParticles; + for (const auto& particle : mcParticles) { + + if (!particle.isPhysicalPrimary()) + continue; + if (particle.eta() < -0.8 || particle.eta() > 0.8 || particle.pt() < 0.1) + continue; + + double energy = std::sqrt(particle.p() * particle.p() + MassPionCharged * MassPionCharged); + fastjet::PseudoJet fourMomentum(particle.px(), particle.py(), particle.pz(), energy); + fourMomentum.set_user_index(particle.pdgCode()); + fjParticles.emplace_back(fourMomentum); + } + // reject empty events + if (fjParticles.size() < 1) + continue; + + // cluster particles using the anti-kt algorithm + fastjet::JetDefinition jetDef(fastjet::antikt_algorithm, rJet); + fastjet::AreaDefinition areaDef(fastjet::active_area, fastjet::GhostedAreaSpec(1.0)); // active_area_explicit_ghosts + fastjet::ClusterSequenceArea cs(fjParticles, jetDef, areaDef); + std::vector jets = fastjet::sorted_by_pt(cs.inclusive_jets()); + auto [rhoPerp, rhoMPerp] = backgroundSub.estimateRhoPerpCone(fjParticles, jets); + + // loop over jets + for (auto& jet : jets) { // o2-linter: disable=[const-ref-in-for-loop] + + // jet must be fully contained in the acceptance + if ((std::fabs(jet.eta()) + rJet) > (maxEta - deltaEtaEdge)) + continue; + + // jet pt must be larger than threshold + fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jet, rhoPerp, rhoMPerp); + if (jetMinusBkg.pt() < minJetPt) + continue; + + // jet properties and perpendicular cone + std::vector jetConstituents = jet.constituents(); + TVector3 jetAxis(jet.px(), jet.py(), jet.pz()); + double coneRadius = std::sqrt(jet.area() / PI); + TVector3 ueAxis1(0, 0, 0); + TVector3 ueAxis2(0, 0, 0); + getPerpendicularAxis(jetAxis, ueAxis1, +1); + getPerpendicularAxis(jetAxis, ueAxis2, -1); + + // loop over jet constituents + for (const auto& particle : jetConstituents) { + + if (particle.user_index() != -2212) + continue; + registryMC.fill(HIST("antiproton_jet_gen"), particle.pt()); + registryMC.fill(HIST("antiproton_eta_pt_jet"), particle.pt(), particle.eta()); + } + + // loop over underlying-event + for (const auto& particle : mcParticles) { + + if (!particle.isPhysicalPrimary()) + continue; + if (particle.eta() < -0.8 || particle.eta() > 0.8 || particle.pt() < 0.1) + continue; + + double deltaEtaUe1 = particle.eta() - ueAxis1.Eta(); + double deltaPhiUe1 = getDeltaPhi(particle.phi(), ueAxis1.Phi()); + double deltaRUe1 = std::sqrt(deltaEtaUe1 * deltaEtaUe1 + deltaPhiUe1 * deltaPhiUe1); + double deltaEtaUe2 = particle.eta() - ueAxis2.Eta(); + double deltaPhiUe2 = getDeltaPhi(particle.phi(), ueAxis2.Phi()); + double deltaRUe2 = std::sqrt(deltaEtaUe2 * deltaEtaUe2 + deltaPhiUe2 * deltaPhiUe2); + if (deltaRUe1 > coneRadius && deltaRUe2 > coneRadius) + continue; + + if (particle.pdgCode() != -2212) + continue; + + registryMC.fill(HIST("antiproton_ue_gen"), particle.pt()); + registryMC.fill(HIST("antiproton_eta_pt_ue"), particle.pt(), particle.eta()); + } + } + } + } + PROCESS_SWITCH(AntinucleiInJets, processJetsMCgen, "process jets mc gen", false); + + void processJetsMCrec(SimCollisions const& collisions, MCTracks const& mcTracks) + { + for (const auto& collision : collisions) { + + // event selection + if (!collision.sel8() || std::fabs(collision.posZ()) > zVtx) + return; + + // loop over reconstructed tracks + int id(-1); + std::vector fjParticles; + for (auto const& track : mcTracks) { + id++; + if (!passedTrackSelectionForJetReconstruction(track)) + continue; + + // 4-momentum representations of a particle + fastjet::PseudoJet fourMomentum(track.px(), track.py(), track.pz(), track.energy(MassPionCharged)); + fourMomentum.set_user_index(id); + fjParticles.emplace_back(fourMomentum); + } + // reject empty events + if (fjParticles.size() < 1) + continue; + + // cluster particles using the anti-kt algorithm + fastjet::JetDefinition jetDef(fastjet::antikt_algorithm, rJet); + fastjet::AreaDefinition areaDef(fastjet::active_area, fastjet::GhostedAreaSpec(1.0)); + fastjet::ClusterSequenceArea cs(fjParticles, jetDef, areaDef); + std::vector jets = fastjet::sorted_by_pt(cs.inclusive_jets()); + auto [rhoPerp, rhoMPerp] = backgroundSub.estimateRhoPerpCone(fjParticles, jets); + + // loop over reconstructed jets + for (auto& jet : jets) { // o2-linter: disable=[const-ref-in-for-loop] + + // get jet constituents + std::vector jetConstituents = jet.constituents(); + + // calculate generated jet pt + double jetPtGen(0); + for (const auto& particle : jetConstituents) { + + // get corresponding track + auto const& track = mcTracks.iteratorAt(particle.user_index()); + if (!track.has_mcParticle()) + continue; + const auto mcparticle = track.mcParticle(); + jetPtGen = jetPtGen + mcparticle.pt(); + } + + // jet must be fully contained in the acceptance + if ((std::fabs(jet.eta()) + rJet) > (maxEta - deltaEtaEdge)) + continue; + + // fill detector response matrix + registryMC.fill(HIST("detectorResponseMatrix"), jetPtGen, jetPtGen - jet.pt()); // maybe it should be filled after bkg sub + + // jet pt must be larger than threshold + fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jet, rhoPerp, rhoMPerp); + if (getCorrectedPt(jetMinusBkg.pt()) < minJetPt) + continue; + + // perpendicular cone + double coneRadius = std::sqrt(jet.area() / PI); + TVector3 jetAxis(jet.px(), jet.py(), jet.pz()); + TVector3 ueAxis1(0, 0, 0); + TVector3 ueAxis2(0, 0, 0); + getPerpendicularAxis(jetAxis, ueAxis1, +1); + getPerpendicularAxis(jetAxis, ueAxis2, -1); + + o2::aod::ITSResponse itsResponse; // to be implemented + + // loop over jet constituents + for (const auto& particle : jetConstituents) { + + // get corresponding track and apply track selection criteria + auto const& track = mcTracks.iteratorAt(particle.user_index()); + if (!passedTrackSelection(track)) + continue; + if (std::fabs(track.dcaXY()) > maxDcaxy || std::fabs(track.dcaZ()) > maxDcaz) + continue; + if (track.sign() > 0) + continue; + if (!track.has_mcParticle()) + continue; + const auto mcparticle = track.mcParticle(); + if (mcparticle.pdgCode() != -2212) + continue; + + // variables + double nsigmaTPCPr = track.tpcNSigmaPr(); + double nsigmaTOFPr = track.tofNSigmaPr(); + + registryMC.fill(HIST("antiproton_jet_all"), track.pt()); + + if (!mcparticle.isPhysicalPrimary()) + continue; + + registryMC.fill(HIST("antiproton_jet_prim"), track.pt()); + + // particle identification using the ITS cluster size + bool passedItsPidProt(false); + if (itsResponse.nSigmaITS(track) > nSigmaItsMin && itsResponse.nSigmaITS(track) < nSigmaItsMax) { + passedItsPidProt = true; + } + if (!applyItsPid) + passedItsPidProt = true; + if (track.pt() > ptMaxItsPidProt) + passedItsPidProt = true; + + if (passedItsPidProt) { + registryMC.fill(HIST("antiproton_jet_rec_tpc"), track.pt(), nsigmaTPCPr); + if (nsigmaTPCPr > minNsigmaTpc && nsigmaTPCPr < maxNsigmaTpc && track.hasTOF()) + registryMC.fill(HIST("antiproton_jet_rec_tof"), track.pt(), nsigmaTOFPr); + } + } + + // underlying event + for (auto const& track : mcTracks) { + + // get corresponding track and apply track selection criteria + if (!passedTrackSelection(track)) + continue; + if (std::fabs(track.dcaXY()) > maxDcaxy || std::fabs(track.dcaZ()) > maxDcaz) + continue; + if (track.sign() > 0) + continue; + + if (!track.has_mcParticle()) + continue; + const auto mcparticle = track.mcParticle(); + if (mcparticle.pdgCode() != -2212) + continue; + + double deltaEtaUe1 = track.eta() - ueAxis1.Eta(); + double deltaPhiUe1 = getDeltaPhi(track.phi(), ueAxis1.Phi()); + double deltaRUe1 = std::sqrt(deltaEtaUe1 * deltaEtaUe1 + deltaPhiUe1 * deltaPhiUe1); + double deltaEtaUe2 = track.eta() - ueAxis2.Eta(); + double deltaPhiUe2 = getDeltaPhi(track.phi(), ueAxis2.Phi()); + double deltaRUe2 = std::sqrt(deltaEtaUe2 * deltaEtaUe2 + deltaPhiUe2 * deltaPhiUe2); + if (deltaRUe1 > coneRadius && deltaRUe2 > coneRadius) + continue; + + // variables + double nsigmaTPCPr = track.tpcNSigmaPr(); + double nsigmaTOFPr = track.tofNSigmaPr(); + + registryMC.fill(HIST("antiproton_ue_all"), track.pt()); + if (!mcparticle.isPhysicalPrimary()) + continue; + registryMC.fill(HIST("antiproton_ue_prim"), track.pt()); + + // particle identification using the ITS cluster size + bool passedItsPidProt(false); + if (itsResponse.nSigmaITS(track) > nSigmaItsMin && itsResponse.nSigmaITS(track) < nSigmaItsMax) { + passedItsPidProt = true; + } + if (!applyItsPid) + passedItsPidProt = true; + if (track.pt() > ptMaxItsPidProt) + passedItsPidProt = true; + + if (passedItsPidProt) { + if (nsigmaTPCPr > minNsigmaTpc && nsigmaTPCPr < maxNsigmaTpc) { + registryMC.fill(HIST("antiproton_ue_rec_tpc"), track.pt()); + if (track.hasTOF() && nsigmaTOFPr > minNsigmaTof && nsigmaTOFPr < maxNsigmaTof) + registryMC.fill(HIST("antiproton_ue_rec_tof"), track.pt()); + } + } + } + } + } + } + PROCESS_SWITCH(AntinucleiInJets, processJetsMCrec, "process jets MC rec", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From b0a2d7d01517225c5390b58c5dd82c790eff448d Mon Sep 17 00:00:00 2001 From: sarjeetagami <162087855+sarjeetagami@users.noreply.github.com> Date: Thu, 20 Feb 2025 16:30:47 +0530 Subject: [PATCH 0336/1650] [PWGLF] added MC process for closure test (#10091) Co-authored-by: sarjeeta gami --- .../Tasks/Resonances/phianalysisrun3_PbPb.cxx | 133 ++++++++++++++---- 1 file changed, 103 insertions(+), 30 deletions(-) diff --git a/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx b/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx index f079e7e8a28..b5145275178 100644 --- a/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx +++ b/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx @@ -121,10 +121,14 @@ struct phianalysisrun3_PbPb { histos.add("Centgen", "MC Centrality", kTH1F, {{200, 0.0, 200.0}}); histos.add("h2PhiRec2", "Phi meson Rec", kTH2F, {{200, 0.0f, 20.0f}, {200, 0.0, 200.0}}); histos.add("h3PhiRec3", "Phi meson Rec", kTH3F, {{200, 0.0f, 20.0f}, {200, 0.0, 200.0}, {200, 0.9, 1.1}}); + histos.add("h3Phi1Rec3", "Phi meson Rec", kTH3F, {{200, 0.0f, 20.0f}, {200, 0.0, 200.0}, {200, 0.9, 1.1}}); + histos.add("h3PhiGen3", "Phi meson Gen", kTH3F, {{200, 0.0f, 20.0f}, {200, 0.0, 200.0}, {200, 0.9, 1.1}}); + histos.add("h3PhiInvMassMixedMC", "Invariant mass of Phi meson Mixed", kTH3F, {{200, 0.0, 200.0}, {200, 0.0f, 20.0f}, {200, 0.9, 1.1}}); histos.add("h2PhiGen2", "Phi meson gen", kTH2F, {{200, 0.0f, 20.0f}, {200, 0.0, 200.0}}); histos.add("h1PhiRec1", "Phi meson Rec", kTH1F, {{200, 0.0f, 20.0f}}); histos.add("h1Phimassgen", "Phi meson gen", kTH1F, {{200, 0.9, 1.1}}); histos.add("h1Phimassrec", "Phi meson Rec", kTH1F, {{200, 0.9, 1.1}}); + histos.add("h1Phi1massrec", "Phi meson Rec", kTH1F, {{200, 0.9, 1.1}}); histos.add("h1Phipt", "Phi meson Rec", kTH1F, {{200, 0.0f, 20.0f}}); histos.add("hOccupancy1", "Occupancy distribution", kTH1F, {{500, 0, 50000}}); histos.add("TOF_Nsigma_MC", "TOF NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Kaon};", {HistType::kTH2D, {{200, -12, 12}, {200, 0.0, 200.0}}}); @@ -149,6 +153,7 @@ struct phianalysisrun3_PbPb { double massKa = o2::constants::physics::MassKPlus; double rapidity; double genMass, recMass, resolution; + ROOT::Math::PxPyPzMVector phiMother, daughter1, daughter2; double mass{0.}; double massrotation{0.}; double pT{0.}; @@ -353,10 +358,10 @@ struct phianalysisrun3_PbPb { int occupancy1 = c1.trackOccupancyInTimeRange(); int occupancy2 = c2.trackOccupancyInTimeRange(); if (fillOccupancy && !(occupancy1 > cfgOccupancyCut1 && occupancy1 < cfgOccupancyCut2)) { - return; + continue; } if (fillOccupancy && !(occupancy2 > cfgOccupancyCut1 && occupancy2 < cfgOccupancyCut2)) { - return; + continue; } float multiplicity; if (cfgMultFT0) @@ -649,17 +654,6 @@ struct phianalysisrun3_PbPb { if (std::abs(mcCollision.posZ()) < cfgCutVertex) { histos.fill(HIST("hMC"), 1.5); } - int Nchinel = 0; - for (auto& mcParticle : mcParticles) { - auto pdgcode = std::abs(mcParticle.pdgCode()); - if (mcParticle.isPhysicalPrimary() && (pdgcode == 211 || pdgcode == 321 || pdgcode == 2212 || pdgcode == 11 || pdgcode == 13)) { - if (std::abs(mcParticle.eta()) < 1.0) { - Nchinel = Nchinel + 1; - } - } - } - if (Nchinel > 0 && std::abs(mcCollision.posZ()) < cfgCutVertex) - histos.fill(HIST("hMC"), 2.5); std::vector SelectedEvents(collisions.size()); int nevts = 0; auto multiplicity = 0; @@ -702,13 +696,18 @@ struct phianalysisrun3_PbPb { } if (kCurrentDaughter.pdgCode() == +321) { daughtp = true; + KaonPlus = ROOT::Math::PxPyPzMVector(kCurrentDaughter.px(), kCurrentDaughter.py(), kCurrentDaughter.pz(), massKa); } else if (kCurrentDaughter.pdgCode() == -321) { daughtm = true; + KaonMinus = ROOT::Math::PxPyPzMVector(kCurrentDaughter.px(), kCurrentDaughter.py(), kCurrentDaughter.pz(), massKa); } } if (daughtp && daughtm) { - histos.fill(HIST("h1PhiGen"), mcParticle.pt()); - histos.fill(HIST("h2PhiGen2"), mcParticle.pt(), multiplicity); + PhiMesonMother = KaonPlus + KaonMinus; + histos.fill(HIST("h1PhiGen"), PhiMesonMother.pt()); + histos.fill(HIST("h2PhiGen2"), PhiMesonMother.pt(), multiplicity); + histos.fill(HIST("h1Phimassgen"), PhiMesonMother.M()); + histos.fill(HIST("h3PhiGen3"), PhiMesonMother.pt(), multiplicity, PhiMesonMother.M()); } } } @@ -767,6 +766,12 @@ struct phianalysisrun3_PbPb { if (!(track1PDG == 321 && track2PDG == 321)) { continue; } + daughter1 = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); + daughter2 = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massKa); + + phiMother = daughter1 + daughter2; + histos.fill(HIST("h1Phi1massrec"), phiMother.M()); + histos.fill(HIST("h3Phi1Rec3"), phiMother.pt(), multiplicity, phiMother.M()); for (auto& mothertrack1 : mctrack1.mothers_as()) { for (auto& mothertrack2 : mctrack2.mothers_as()) { if (mothertrack1.pdgCode() != mothertrack2.pdgCode()) { @@ -790,26 +795,27 @@ struct phianalysisrun3_PbPb { if (ispTdepPID && (!selectionPIDpTdependent(track1) || !selectionPIDpTdependent(track2))) { continue; } + + histos.fill(HIST("TPC_Nsigma_MC"), track1.tpcNSigmaKa(), multiplicity); + histos.fill(HIST("TOF_Nsigma_MC"), track1.tofNSigmaKa(), multiplicity); if (avoidsplitrackMC && oldindex == mothertrack1.globalIndex()) { histos.fill(HIST("h1PhiRecsplit"), mothertrack1.pt()); continue; } - histos.fill(HIST("TPC_Nsigma_MC"), track1.tpcNSigmaKa(), multiplicity); - histos.fill(HIST("TOF_Nsigma_MC"), track1.tofNSigmaKa(), multiplicity); oldindex = mothertrack1.globalIndex(); - pvec0 = array{track1.px(), track1.py(), track1.pz()}; - pvec1 = array{track2.px(), track2.py(), track2.pz()}; - auto arrMomrec = array{pvec0, pvec1}; - auto motherP = mothertrack1.p(); - auto motherE = mothertrack1.e(); - genMass = std::sqrt(motherE * motherE - motherP * motherP); - recMass = RecoDecay::m(arrMomrec, array{massKa, massKa}); - auto recpt = TMath::Sqrt((track1.px() + track2.px()) * (track1.px() + track2.px()) + (track1.py() + track2.py()) * (track1.py() + track2.py())); - histos.fill(HIST("h1PhiRec1"), mothertrack1.pt()); - histos.fill(HIST("h2PhiRec2"), mothertrack1.pt(), multiplicity); - histos.fill(HIST("h1Phimassgen"), genMass); - histos.fill(HIST("h1Phimassrec"), recMass); - histos.fill(HIST("h1Phipt"), recpt); + if (track1.sign() * track2.sign() < 0) { + KaonPlus = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); + KaonMinus = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massKa); + } + PhiMesonMother = KaonPlus + KaonMinus; + + if (TMath::Abs(PhiMesonMother.Rapidity()) > confRapidity) { + continue; + } + histos.fill(HIST("h1PhiRec1"), PhiMesonMother.pt()); + histos.fill(HIST("h2PhiRec2"), PhiMesonMother.pt(), multiplicity); + histos.fill(HIST("h1Phimassrec"), PhiMesonMother.M()); + histos.fill(HIST("h3PhiRec3"), PhiMesonMother.pt(), multiplicity, PhiMesonMother.M()); } } } @@ -817,6 +823,73 @@ struct phianalysisrun3_PbPb { } PROCESS_SWITCH(phianalysisrun3_PbPb, processRec, "Process Reconstructed", false); + void processMixedEventMC(EventCandidatesMC const& recCollisions, TrackCandidatesMC const& RecTracks, aod::McParticles const&) + { + + auto tracksTuple = std::make_tuple(RecTracks); + BinningTypeVertexContributor binningOnPositions{{axisVertex, axisMultiplicity}, true}; + SameKindPair pairs{binningOnPositions, cfgNoMixedEvents, -1, recCollisions, tracksTuple, &cache}; + + for (auto& [c1, tracks1, c2, tracks2] : pairs) { + if (!c1.sel8()) { + continue; + } + if (!c2.sel8()) { + continue; + } + if (additionalEvSel2 && (!c1.selection_bit(aod::evsel::kNoSameBunchPileup) || !c1.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { + continue; + } + if (additionalEvSel2 && (!c2.selection_bit(aod::evsel::kNoSameBunchPileup) || !c2.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { + continue; + } + if (additionalEvSel3 && (!c1.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard))) { + continue; + } + if (additionalEvSel3 && (!c2.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard))) { + continue; + } + int occupancy1 = c1.trackOccupancyInTimeRange(); + int occupancy2 = c2.trackOccupancyInTimeRange(); + if (fillOccupancy && !(occupancy1 > cfgOccupancyCut1 && occupancy1 < cfgOccupancyCut2)) { + continue; + } + if (fillOccupancy && !(occupancy2 > cfgOccupancyCut1 && occupancy2 < cfgOccupancyCut2)) { + continue; + } + auto multiplicity = c1.centFT0C(); + for (auto& [t1, t2] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { + histos.fill(HIST("hMC"), 6.5); + if (!selectionTrack(t1)) { + continue; + } + if (!selectionTrack(t2)) { + continue; + } + if (!selectionPair(t1, t2)) { + continue; + } + if (!ispTdepPID && (!selectionPID(t1) || !selectionPID(t2))) { + continue; + } + if (ispTdepPID && (!selectionPIDpTdependent(t1) || !selectionPIDpTdependent(t2))) { + continue; + } + histos.fill(HIST("hMC"), 7.5); + if (t1.sign() * t2.sign() < 0) { + KaonPlus = ROOT::Math::PxPyPzMVector(t1.px(), t1.py(), t1.pz(), massKa); + KaonMinus = ROOT::Math::PxPyPzMVector(t2.px(), t2.py(), t2.pz(), massKa); + } + PhiMesonMother = KaonPlus + KaonMinus; + if (TMath::Abs(PhiMesonMother.Rapidity()) > confRapidity) { + continue; + } + histos.fill(HIST("hMC"), 8.5); + histos.fill(HIST("h3PhiInvMassMixedMC"), multiplicity, PhiMesonMother.pt(), PhiMesonMother.M()); + } + } + } + PROCESS_SWITCH(phianalysisrun3_PbPb, processMixedEventMC, "Process Mixed event MC", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { From 8ec352ee827ddfb8410970c7e0c74e5ffc582337 Mon Sep 17 00:00:00 2001 From: dajones2 <140733426+dajones2@users.noreply.github.com> Date: Thu, 20 Feb 2025 12:11:59 +0000 Subject: [PATCH 0337/1650] [PWGJE] Rho spectra in signal and reference events (#10090) --- PWGJE/Tasks/jetHadronRecoil.cxx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/PWGJE/Tasks/jetHadronRecoil.cxx b/PWGJE/Tasks/jetHadronRecoil.cxx index 16adb000489..fa9bdb7af4b 100644 --- a/PWGJE/Tasks/jetHadronRecoil.cxx +++ b/PWGJE/Tasks/jetHadronRecoil.cxx @@ -117,6 +117,8 @@ struct JetHadronRecoil { {"hDeltaRPart", "Particle #DeltaR;#DeltaR;#frac{1}{N_{jets}}#frac{dN_{jets}}{d#DeltaR}", {HistType::kTH1F, {{80, 0.0, 0.24}}}}, {"hDeltaRpT", "jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{300, -100, 200}, {80, 0.0, 0.24}}}}, {"hDeltaRpTPart", "Particle jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{200, 0, 200}, {80, 0.0, 0.24}}}}, + {"hRhoSignal", "Signal Rho bkg;#rho;entries", {HistType::kTH1F, {{220, 0, 220}}}}, + {"hRhoReference", "Reference Rho bkg;#rho;entries", {HistType::kTH1F, {{220, 0, 220}}}}, {"hDeltaRSignal", "#DeltaR;#DeltaR;#frac{dN_{jets}}{d#DeltaR}", {HistType::kTH1F, {{80, 0.0, 0.24}}}}, {"hDeltaRSignalPart", "Particle #DeltaR;#DeltaR;#frac{1}{N_{jets}}#frac{dN_{jets}}{d#DeltaR}", {HistType::kTH1F, {{80, 0.0, 0.24}}}}, {"hDeltaRpTSignal", "jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{300, -100, 200}, {80, 0.0, 0.24}}}}, @@ -197,10 +199,12 @@ struct JetHadronRecoil { if (isSigCol) { registry.fill(HIST("hNtrig"), 1.5, weight); registry.fill(HIST("hSigEventTriggers"), nTT, weight); + registry.fill(HIST("hRhoSignal"), rho, weight); } if (!isSigCol) { registry.fill(HIST("hNtrig"), 0.5, weight); registry.fill(HIST("hRefEventTriggers"), nTT, weight); + registry.fill(HIST("hRhoReference"), rho, weight); } } From e4e1934053eee6ceff9013dbc40b0fcaf3ccb09e Mon Sep 17 00:00:00 2001 From: YubiaoWang Date: Thu, 20 Feb 2025 20:19:15 +0800 Subject: [PATCH 0338/1650] [PWGJE] Fix leading track cut, test different method to get delta pt (#10104) --- PWGJE/Tasks/jetChargedV2.cxx | 38 +++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/PWGJE/Tasks/jetChargedV2.cxx b/PWGJE/Tasks/jetChargedV2.cxx index 61b1f1e1dbd..339941e001c 100644 --- a/PWGJE/Tasks/jetChargedV2.cxx +++ b/PWGJE/Tasks/jetChargedV2.cxx @@ -262,6 +262,8 @@ struct JetChargedV2 { //< RC test plots >// registry.add("h3_centrality_deltapT_RandomCornPhi_rhorandomconewithoutleadingjet", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}; #Delta#varphi_{jet}", {HistType::kTH3F, {{120, -10.0, 110.0}, {800, -400.0, 400.0}, {160, 0., o2::constants::math::TwoPI}}}); registry.add("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithoutleadingjet", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}(#varphi); #Delta#varphi_{jet}", {HistType::kTH3F, {{120, -10.0, 110.0}, {800, -400.0, 400.0}, {160, 0., o2::constants::math::TwoPI}}}); + registry.add("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithoutoneleadingjet", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}(#varphi); #Delta#varphi_{jet}", {HistType::kTH3F, {{120, -10.0, 110.0}, {800, -400.0, 400.0}, {160, 0., o2::constants::math::TwoPI}}}); + registry.add("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithouttwoleadingjet", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}(#varphi); #Delta#varphi_{jet}", {HistType::kTH3F, {{120, -10.0, 110.0}, {800, -400.0, 400.0}, {160, 0., o2::constants::math::TwoPI}}}); //< bkg sub plot | end >// //< median rho >// registry.add("h_jet_pt_in_out_plane_v2", "jet pT;#it{p}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); @@ -329,6 +331,7 @@ struct JetChargedV2 { if (!checkConstituentMinPt && !checkConstituentMaxPt) { checkConstituentPt = false; } + if (checkConstituentPt) { bool isMinLeadingConstituent = !checkConstituentMinPt; bool isMaxLeadingConstituent = true; @@ -345,9 +348,21 @@ struct JetChargedV2 { } return isMinLeadingConstituent && isMaxLeadingConstituent; } + return true; } + template + bool trackIsInJet(T const& track, U const& jet) + { + for (auto const& constituentId : jet.tracksIds()) { + if (constituentId == track.globalIndex()) { + return true; + } + } + return false; + } + void fillLeadingJetQA(double leadingJetPt, double leadingJetPhi, double leadingJetEta) { registry.fill(HIST("leadJetPt"), leadingJetPt); @@ -361,7 +376,8 @@ struct JetChargedV2 { } void processInOutJetV2(soa::Filtered>::iterator const& collision, - soa::Join const& jets) + soa::Join const& jets, + aod::JetTracks const&) { if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { return; @@ -739,6 +755,26 @@ struct JetChargedV2 { break; } registry.fill(HIST("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithoutleadingjet"), collision.centrality(), randomConePt - o2::constants::math::PI * randomConeR * randomConeR * rholocal, rcPhiPsi2, 1.0); + + // randomised eta,phi for tracks, to assess part of fluctuations coming from statistically independently emitted particles, removing tracks from 2 leading jets + double randomConePtWithoutOneLeadJet = 0; + double randomConePtWithoutTwoLeadJet = 0; + for (auto const& track : tracks) { + if (jetderiveddatautilities::selectTrack(track, trackSelection)) { + float dPhi = RecoDecay::constrainAngle(randomNumber.Uniform(0.0, o2::constants::math::TwoPI) - randomConePhi, static_cast(-o2::constants::math::PI)); + float dEta = randomNumber.Uniform(trackEtaMin, trackEtaMax) - randomConeEta; + if (std::sqrt(dEta * dEta + dPhi * dPhi) < randomConeR) { + if (!trackIsInJet(track, jets.iteratorAt(0))) { + randomConePtWithoutOneLeadJet += track.pt(); + if (!trackIsInJet(track, jets.iteratorAt(1))) { + randomConePtWithoutTwoLeadJet += track.pt(); + } + } + } + } + } + registry.fill(HIST("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithoutoneleadingjet"), collision.centrality(), randomConePtWithoutOneLeadJet - o2::constants::math::PI * randomConeR * randomConeR * rholocal, rcPhiPsi2, 1.0); + registry.fill(HIST("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithouttwoleadingjet"), collision.centrality(), randomConePtWithoutTwoLeadJet - o2::constants::math::PI * randomConeR * randomConeR * rholocal, rcPhiPsi2, 1.0); } delete hPtsumSumptFit; evtnum += 1; From ff37810f93b25ec424996d7834113c741a3f9658 Mon Sep 17 00:00:00 2001 From: jaelpark Date: Thu, 20 Feb 2025 20:19:39 +0800 Subject: [PATCH 0339/1650] [PWGCF] Local efficiency loader for JCorran (#10092) --- PWGCF/JCorran/Tasks/jflucWeightsLoader.cxx | 75 ++++++++++++++++------ 1 file changed, 55 insertions(+), 20 deletions(-) diff --git a/PWGCF/JCorran/Tasks/jflucWeightsLoader.cxx b/PWGCF/JCorran/Tasks/jflucWeightsLoader.cxx index bf874c32a4a..0abacd31dca 100644 --- a/PWGCF/JCorran/Tasks/jflucWeightsLoader.cxx +++ b/PWGCF/JCorran/Tasks/jflucWeightsLoader.cxx @@ -44,11 +44,14 @@ using namespace o2::framework::expressions; // This workflow creates a table of weights that can be joined with track tables. struct JflucWeightsLoader { O2_DEFINE_CONFIGURABLE(cfgPathPhiWeights, std::string, "http://alice-ccdb.cern.ch", "Local (local://) or CCDB path for the phi acceptance correction histogram"); + O2_DEFINE_CONFIGURABLE(cfgPathEffWeights, std::string, "", "Local (local://) or CCDB path for the efficiency correction histogram"); O2_DEFINE_CONFIGURABLE(cfgForRunNumber, bool, false, "Get CCDB object by run"); O2_DEFINE_CONFIGURABLE(cfgCCDBPath, std::string, "Users/m/mavirta/corrections/NUA/LHC23zzh", "Internal path in CCDB"); THnF* ph = 0; TFile* pf = 0; + THnF* pheff = 0; + TFile* pfeff = 0; int runNumber = 0; int timestamp = 0; bool useCCDB = false; @@ -62,6 +65,12 @@ struct JflucWeightsLoader { pf->Close(); delete pf; } + if (pheff) + delete pheff; + if (pfeff) { + pfeff->Close(); + delete pfeff; + } } void initCCDB(int runNum, int ts) @@ -89,7 +98,7 @@ struct JflucWeightsLoader { ccdb->setLocalObjectValidityChecking(); ccdb->setFatalWhenNull(false); } else if (cfgPathPhiWeights.value.substr(0, 8) == "local://") { - LOGF(info, "Using corrections from: %s", cfgPathPhiWeights.value.substr(8).c_str()); + LOGF(info, "Using non-uniform acceptance corrections from: %s", cfgPathPhiWeights.value.substr(8).c_str()); pf = new TFile(cfgPathPhiWeights.value.substr(8).c_str(), "read"); if (!pf->IsOpen()) { delete pf; @@ -98,7 +107,26 @@ struct JflucWeightsLoader { } useCCDB = false; } else { - LOGF(info, "Didn't find \"local://\" or \"ccdb\""); + LOGF(info, "Didn't find \"local://\" or \"ccdb\" for non-uniform acceptance corrections."); + return; + } + + if (cfgPathEffWeights.value.substr(0, 8) == "local://") { + LOGF(info, "Using efficiency corrections from: %s", cfgPathEffWeights.value.substr(8).c_str()); + pfeff = new TFile(cfgPathEffWeights.value.substr(8).c_str(), "read"); + if (!pfeff->IsOpen()) { + delete pfeff; + pfeff = 0; + LOGF(fatal, "Efficiency correction weights file not found: %s", cfgPathEffWeights.value.substr(8).c_str()); + } + // + if (!(pheff = pfeff->Get("ccdb_object"))) { + LOGF(warning, "Efficiency correction histogram not found."); + } else { + LOGF(info, "Loaded efficiency correction histogram locally."); + } + } else { + LOGF(info, "Didn't find \"local://\" or \"ccdb\" for efficiency corrections."); return; } } @@ -109,23 +137,21 @@ struct JflucWeightsLoader { template void loadWeights(Produces& outputT, CollisionT const& collision, TrackT const& tracks) { - - if (!pf && !useCCDB) - LOGF(fatal, "NUA correction weights file has not been opened."); - if (collision.runNumber() != runNumber) { - if (ph) - delete ph; - // Check if NUA correction can be found from a local file and load it - if (!useCCDB && !(ph = static_cast(pf->Get(Form("NUAWeights_%d", collision.runNumber()))))) { - LOGF(warning, "NUA correction histogram not found for run %d.", collision.runNumber()); - } else if (useCCDB) { // Check if ccdb file is used and load it - LOGF(info, "Loaded NUA correction histogram from CCDB for run %d.", collision.runNumber()); - } else { - LOGF(info, "Loaded NUA correction histogram locally for run %d.", collision.runNumber()); - } - runNumber = collision.runNumber(); - if (useCCDB) { - initCCDB(runNumber, timestamp); + if (pf || useCCDB) { + if (collision.runNumber() != runNumber) { + if (ph) + delete ph; + if (!useCCDB) { + // Check if NUA correction can be found from a local file and load it + if (!(ph = pf->Get(Form("NUAWeights_%d", collision.runNumber())))) + LOGF(warning, "NUA correction histogram not found for run %d.", collision.runNumber()); + else + LOGF(info, "Loaded NUA correction histogram locally for run %d.", collision.runNumber()); + } else { + initCCDB(collision.runNumber(), timestamp); + LOGF(info, "Loaded NUA correction histogram from CCDB for run %d.", collision.runNumber()); + } + runNumber = collision.runNumber(); } } for (const auto& track : tracks) { @@ -149,7 +175,16 @@ struct JflucWeightsLoader { phiWeight = 1.0f; } - effWeight = 1.0f; //<--- todo + if (pheff) { + const int effVars[] = { + pheff->GetAxis(0)->FindBin(track.eta()), + pheff->GetAxis(1)->FindBin(track.pt()), + pheff->GetAxis(2)->FindBin(collision.multiplicity()), + pheff->GetAxis(3)->FindBin(collision.posZ())}; + effWeight = pheff->GetBinContent(effVars); + } else { + effWeight = 1.0f; + } outputT(phiWeight, effWeight); } From 507946e7a40ca2e96757c5b542e51d233b82a915 Mon Sep 17 00:00:00 2001 From: prottayCMT <61418725+prottayCMT@users.noreply.github.com> Date: Thu, 20 Feb 2025 13:33:08 +0100 Subject: [PATCH 0340/1650] [PWGLF] added additional correction histograms for v2 (#9994) Co-authored-by: Prottay Das --- PWGLF/Tasks/Strangeness/lambdapolsp.cxx | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/PWGLF/Tasks/Strangeness/lambdapolsp.cxx b/PWGLF/Tasks/Strangeness/lambdapolsp.cxx index d8e9782cd2f..2a3e6f06975 100644 --- a/PWGLF/Tasks/Strangeness/lambdapolsp.cxx +++ b/PWGLF/Tasks/Strangeness/lambdapolsp.cxx @@ -189,6 +189,10 @@ struct lambdapolsp { histos.add("hpy2Ty1Ax1Cvscentpteta", "hpy2Ty1Ax1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); histos.add("hpx1Ax1Cvscentpteta", "hpx1Ax1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); histos.add("hpy1Ay1Cvscentpteta", "hpy1Ay1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpx1Avscentpteta", "hpx1Avscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpx1Cvscentpteta", "hpx1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpy1Avscentpteta", "hpy1Avscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpy1Cvscentpteta", "hpy1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); histos.add("hpx2Tx1Avscentpteta", "hpx2Tx1Avscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); histos.add("hpx2Tx1Cvscentpteta", "hpx2Tx1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); @@ -727,6 +731,10 @@ struct lambdapolsp { auto x1Cy1A = modqxZDCC * modqyZDCA; // detector acceptance corrections to match v2{ZDC} + auto x1A = modqxZDCA; + auto x1C = modqxZDCC; + auto y1A = modqyZDCA; + auto y1C = modqyZDCC; auto x2T = TMath::Cos(2 * GetPhiInRange(track.phi())); auto y2T = TMath::Sin(2 * GetPhiInRange(track.phi())); auto x2Tx1A = TMath::Cos(2 * GetPhiInRange(track.phi())) * modqxZDCA; @@ -775,6 +783,10 @@ struct lambdapolsp { histos.fill(HIST("hpy1Ay1Cvscentpteta"), centrality, track.pt(), track.eta(), y1Ay1C); histos.fill(HIST("hpx1Ay1Cvscentpteta"), centrality, track.pt(), track.eta(), x1Ay1C); histos.fill(HIST("hpy1Ax1Cvscentpteta"), centrality, track.pt(), track.eta(), x1Cy1A); + histos.fill(HIST("hpx1Avscentpteta"), centrality, track.pt(), track.eta(), x1A); + histos.fill(HIST("hpx1Cvscentpteta"), centrality, track.pt(), track.eta(), x1C); + histos.fill(HIST("hpy1Avscentpteta"), centrality, track.pt(), track.eta(), y1A); + histos.fill(HIST("hpy1Cvscentpteta"), centrality, track.pt(), track.eta(), y1C); /*} else { histos.fill(HIST("hpuxQxpvscentptetaneg"), centrality, track.pt(), track.eta(), uxQxp); From 1ee675176a71ff196606f01250f58ed234f8f6e1 Mon Sep 17 00:00:00 2001 From: hernasab Date: Thu, 20 Feb 2025 07:39:19 -0600 Subject: [PATCH 0341/1650] [PWGCF] adjusted histogram axis (#10093) Co-authored-by: Sabrina Hernandez --- PWGCF/Flow/Tasks/flowZdcTask.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowZdcTask.cxx b/PWGCF/Flow/Tasks/flowZdcTask.cxx index 2af09504c4f..7afe0fab2ec 100644 --- a/PWGCF/Flow/Tasks/flowZdcTask.cxx +++ b/PWGCF/Flow/Tasks/flowZdcTask.cxx @@ -207,12 +207,12 @@ struct FlowZdcTask { histos.add("hZNvsFT0Ccent", "ZN Energy vs FT0C Centrality", kTH2F, - {AxisSpec{100, 0, 100, "Centrality [%]"}, AxisSpec{100, 0, 500, "ZN Energy"}}); + {axisCent, axisZN}); histos.add("hZPvsFT0Ccent", "ZP Energy vs FT0C Centrality;Centrality [%];ZP Energy", kTH2F, - {AxisSpec{100, 0, 100, "Centrality [%]"}, AxisSpec{100, 0, 500, "ZP Energy"}}); + {axisCent, axisZP}); histos.add("revsimag", "revsimag", kTH2F, {axisREQ, axisIMQ}); // for q vector recentering histos.add("hYield", "Nch vs pT", kTH2F, {axisMultiplicity, axisPt}); histos.add("hGlobalTracks", "hGlobalTracks", kTH1F, {axisMultiplicity}); From 07a5c26b1db5523bad9abea86061a6586bd686ac Mon Sep 17 00:00:00 2001 From: Youssef El Mard <143704238+yelmardb@users.noreply.github.com> Date: Thu, 20 Feb 2025 14:40:46 +0100 Subject: [PATCH 0342/1650] [PWGEM] Change type of histogram hDCAz_Pt_collType (#10084) Co-authored-by: Youssef El Mard Bouziani Co-authored-by: ALICE Action Bot --- PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx index 1cd44c89301..73b84fbabf6 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx @@ -206,7 +206,8 @@ struct PCMQCMC { fRegistry.add("V0/primary/hPtGen_DeltaPhi", "photon #varphi resolution;p_{T}^{gen} (GeV/c);#varphi^{rec} - #varphi^{gen} (rad.)", kTH2F, {{1000, 0, 10}, {400, -1.0f, 1.0f}}, true); fRegistry.add("V0/primary/hXY_Photon_MC", "X vs. Y of true photon conversion point.;X (cm);Y (cm)", kTH2F, {{400, -100.0f, +100}, {400, -100, +100}}, true); fRegistry.add("V0/primary/hRZ_Photon_MC", "R vs. Z of true photon conversion point;Z (cm);R_{xy} (cm)", kTH2F, {{200, -100.0f, +100}, {200, 0, 100}}, true); - fRegistry.add("V0/primary/hDCAz_Pt", "DCA to PV vs. p_{T} (GeV/c);DCA_{z} (cm);p_{T} (GeV/c)", kTH2F, {{200, -5.f, +5.f}, {1000, 0.0f, 20}}, true); + fRegistry.add("V0/primary/hDCAz_Pt_collType", "DCA to PV vs. p_{T} (GeV/c) vs. validated collision;DCA_{z} (cm);p_{T} (GeV/c)", kTHnSparseF, {{200, -5.f, +5.f}, {1000, 0.0f, 20}, {2, -0.5f, 1.5f}}, false); + fRegistry.add("V0/primary/hPt_DeltaColID", "V0 pT vs. delta collision Id; p_{T,#gamma} (GeV/c); v0CollId - mcGammaCollId ", kTH2F, {{200, 0.0f, 20}, {101, -50.5f, 50.5f}}, false); fRegistry.addClone("V0/primary/", "V0/fromWD/"); // from weak decay fRegistry.addClone("V0/primary/", "V0/fromHS/"); // from hadronic shower in detector materials @@ -334,9 +335,10 @@ struct PCMQCMC { if (collision.sel8()) { fRegistry.fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hCollisionCounter"), 8.0); } - if (abs(collision.posZ()) < 10.0) { + if (std::abs(collision.posZ()) < 10.0) { fRegistry.fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hCollisionCounter"), 9.0); } + fRegistry.fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hZvtx"), collision.posZ()); fRegistry.fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hMultNTracksPV"), collision.multNTracksPV()); @@ -382,7 +384,6 @@ struct PCMQCMC { fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hConvPoint_diffZ"), mcleg.vz(), v0.vz() - mcleg.vz()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hXY_Photon_MC"), mcleg.vx(), mcleg.vy()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hRZ_Photon_MC"), mcleg.vz(), std::sqrt(std::pow(mcleg.vx(), 2) + std::pow(mcleg.vy(), 2))); - fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hDCAz_Pt"), v0.dcaZtopv(), v0.pt()); } template @@ -459,6 +460,8 @@ struct PCMQCMC { if (mcphoton.isPhysicalPrimary() || mcphoton.producedByGenerator()) { fillV0Info<0>(v0, mcphoton, elemc); + fRegistry.fill(HIST("V0/primary/hPt_DeltaColID"), v0.pt(), collision.emmceventId() - mcphoton.emmceventId()); + fRegistry.fill(HIST("V0/primary/hDCAz_Pt_collType"), v0.dcaZtopv(), v0.pt(), collision.emmceventId() == mcphoton.emmceventId()); for (auto& leg : {pos, ele}) { fillV0LegInfo<0>(leg); } @@ -531,11 +534,11 @@ struct PCMQCMC { auto mctracks_coll = mcparticles.sliceBy(perMcCollision, mccollision.globalIndex()); for (auto& mctrack : mctracks_coll) { - if (abs(mctrack.y()) > pcmcuts.cfg_max_eta_v0) { + if (std::abs(mctrack.y()) > pcmcuts.cfg_max_eta_v0) { continue; } - if (abs(mctrack.pdgCode()) == 22 && (mctrack.isPhysicalPrimary() || mctrack.producedByGenerator())) { + if (std::abs(mctrack.pdgCode()) == 22 && (mctrack.isPhysicalPrimary() || mctrack.producedByGenerator())) { fRegistry.fill(HIST("Generated/hPt_ConvertedPhoton"), mctrack.pt()); fRegistry.fill(HIST("Generated/hY_ConvertedPhoton"), mctrack.y()); fRegistry.fill(HIST("Generated/hPhi_ConvertedPhoton"), mctrack.phi()); From 8834129abae8fd0b0dafe24fd651d7b3bff824f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrea=20Tavira=20Garc=C3=ADa?= <118979672+atavirag@users.noreply.github.com> Date: Thu, 20 Feb 2025 15:52:45 +0100 Subject: [PATCH 0343/1650] [PWGHF] Add BDT variables to D0 MlResponse (#10082) Co-authored-by: ALICE Action Bot --- PWGHF/Core/HfMlResponseD0ToKPi.h | 42 +++++++++++++------ .../TableProducer/correlatorDMesonPairs.cxx | 24 +++++------ 2 files changed, 41 insertions(+), 25 deletions(-) diff --git a/PWGHF/Core/HfMlResponseD0ToKPi.h b/PWGHF/Core/HfMlResponseD0ToKPi.h index 71ed542b269..fbca4f8319e 100644 --- a/PWGHF/Core/HfMlResponseD0ToKPi.h +++ b/PWGHF/Core/HfMlResponseD0ToKPi.h @@ -99,6 +99,22 @@ break; \ } +// Variation of CHECK_AND_FILL_VEC_D0_SIGNED(OBJECT, FEATURE, GETTER1, GETTER2) +// where GETTER1 and GETTER2 are methods of the OBJECT, the variable +// is filled depending on whether it is a D0 or a D0bar +// and INDEX is the index of the vector +#define CHECK_AND_FILL_VEC_D0_ML(OBJECT, FEATURE, GETTER1, GETTER2, INDEX) \ + case static_cast(InputFeaturesD0ToKPi::FEATURE): { \ + if constexpr (usingMl) { \ + if (pdgCode == o2::constants::physics::kD0) { \ + inputFeatures.emplace_back(OBJECT.GETTER1()[INDEX]); \ + } else { \ + inputFeatures.emplace_back(OBJECT.GETTER2()[INDEX]); \ + } \ + } \ + break; \ + } + namespace o2::analysis { enum class InputFeaturesD0ToKPi : uint8_t { @@ -140,6 +156,9 @@ enum class InputFeaturesD0ToKPi : uint8_t { nSigTpcTofKaExpKa, maxNormalisedDeltaIP, impactParameterProduct, + bdtOutputBkg, + bdtOutputNonPrompt, + bdtOutputPrompt, cosThetaStar, cpa, cpaXY, @@ -160,7 +179,7 @@ class HfMlResponseD0ToKPi : public HfMlResponse /// Method to get the input features vector needed for ML inference /// \param candidate is the D0 candidate /// \return inputFeatures vector - template + template std::vector getInputFeatures(T1 const& candidate, int const& pdgCode) { std::vector inputFeatures; @@ -183,10 +202,6 @@ class HfMlResponseD0ToKPi : public HfMlResponse CHECK_AND_FILL_VEC_D0_FULL(candidate, nSigTpcKa0, /*getter*/ nSigTpcKa0); CHECK_AND_FILL_VEC_D0_FULL(candidate, nSigTpcPi1, /*getter*/ nSigTpcPi1); CHECK_AND_FILL_VEC_D0_FULL(candidate, nSigTpcKa1, /*getter*/ nSigTpcKa1); - // CHECK_AND_FILL_VEC_D0_OBJECT_HFHELPER_SIGNED(prong0, prong1, nSigTpcPiExpPi, tpcNSigmaPi); - // CHECK_AND_FILL_VEC_D0_OBJECT_HFHELPER_SIGNED(prong0, prong1, nSigTpcKaExpPi, tpcNSigmaKa); - // CHECK_AND_FILL_VEC_D0_OBJECT_HFHELPER_SIGNED(prong1, prong0, nSigTpcPiExpKa, tpcNSigmaPi); - // CHECK_AND_FILL_VEC_D0_OBJECT_HFHELPER_SIGNED(prong1, prong0, nSigTpcKaExpKa, tpcNSigmaKa); CHECK_AND_FILL_VEC_D0_SIGNED(candidate, nSigTpcPiExpPi, nSigTpcPi0, nSigTpcPi1); CHECK_AND_FILL_VEC_D0_SIGNED(candidate, nSigTpcKaExpPi, nSigTpcKa0, nSigTpcKa1); CHECK_AND_FILL_VEC_D0_SIGNED(candidate, nSigTpcPiExpKa, nSigTpcPi1, nSigTpcPi0); @@ -196,10 +211,6 @@ class HfMlResponseD0ToKPi : public HfMlResponse CHECK_AND_FILL_VEC_D0_FULL(candidate, nSigTofKa0, /*getter*/ nSigTofKa0); CHECK_AND_FILL_VEC_D0_FULL(candidate, nSigTofPi1, /*getter*/ nSigTofPi1); CHECK_AND_FILL_VEC_D0_FULL(candidate, nSigTofKa1, /*getter*/ nSigTofKa1); - // CHECK_AND_FILL_VEC_D0_OBJECT_HFHELPER_SIGNED(prong0, prong1, nSigTofPiExpPi, tofNSigmaPi); - // CHECK_AND_FILL_VEC_D0_OBJECT_HFHELPER_SIGNED(prong0, prong1, nSigTofKaExpPi, tofNSigmaKa); - // CHECK_AND_FILL_VEC_D0_OBJECT_HFHELPER_SIGNED(prong1, prong0, nSigTofPiExpKa, tofNSigmaPi); - // CHECK_AND_FILL_VEC_D0_OBJECT_HFHELPER_SIGNED(prong1, prong0, nSigTofKaExpKa, tofNSigmaKa); CHECK_AND_FILL_VEC_D0_SIGNED(candidate, nSigTofPiExpPi, nSigTofPi0, nSigTofPi1); CHECK_AND_FILL_VEC_D0_SIGNED(candidate, nSigTofKaExpPi, nSigTofKa0, nSigTofKa1); CHECK_AND_FILL_VEC_D0_SIGNED(candidate, nSigTofPiExpKa, nSigTofPi1, nSigTofPi0); @@ -209,15 +220,15 @@ class HfMlResponseD0ToKPi : public HfMlResponse CHECK_AND_FILL_VEC_D0_FULL(candidate, nSigTpcTofKa0, tpcTofNSigmaKa0); CHECK_AND_FILL_VEC_D0_FULL(candidate, nSigTpcTofPi1, tpcTofNSigmaPi1); CHECK_AND_FILL_VEC_D0_FULL(candidate, nSigTpcTofKa1, tpcTofNSigmaKa1); - // CHECK_AND_FILL_VEC_D0_OBJECT_HFHELPER_SIGNED(prong0, prong1, nSigTpcTofPiExpPi, tpcTofNSigmaPi); - // CHECK_AND_FILL_VEC_D0_OBJECT_HFHELPER_SIGNED(prong0, prong1, nSigTpcTofKaExpPi, tpcTofNSigmaKa); - // CHECK_AND_FILL_VEC_D0_OBJECT_HFHELPER_SIGNED(prong1, prong0, nSigTpcTofPiExpKa, tpcTofNSigmaPi); - // CHECK_AND_FILL_VEC_D0_OBJECT_HFHELPER_SIGNED(prong1, prong0, nSigTpcTofKaExpKa, tpcTofNSigmaKa); CHECK_AND_FILL_VEC_D0_SIGNED(candidate, nSigTpcTofPiExpPi, tpcTofNSigmaPi0, tpcTofNSigmaPi1); CHECK_AND_FILL_VEC_D0_SIGNED(candidate, nSigTpcTofKaExpPi, tpcTofNSigmaKa0, tpcTofNSigmaKa1); CHECK_AND_FILL_VEC_D0_SIGNED(candidate, nSigTpcTofPiExpKa, tpcTofNSigmaPi1, tpcTofNSigmaPi0); CHECK_AND_FILL_VEC_D0_SIGNED(candidate, nSigTpcTofKaExpKa, tpcTofNSigmaKa1, tpcTofNSigmaKa0); + CHECK_AND_FILL_VEC_D0_ML(candidate, bdtOutputBkg, mlProbD0, mlProbD0bar, 0); + CHECK_AND_FILL_VEC_D0_ML(candidate, bdtOutputNonPrompt, mlProbD0, mlProbD0bar, 1); + CHECK_AND_FILL_VEC_D0_ML(candidate, bdtOutputPrompt, mlProbD0, mlProbD0bar, 2); + CHECK_AND_FILL_VEC_D0(maxNormalisedDeltaIP); CHECK_AND_FILL_VEC_D0_FULL(candidate, impactParameterProduct, impactParameterProduct); CHECK_AND_FILL_VEC_D0_HFHELPER_SIGNED(candidate, cosThetaStar, cosThetaStarD0, cosThetaStarD0bar); @@ -273,6 +284,10 @@ class HfMlResponseD0ToKPi : public HfMlResponse FILL_MAP_D0(nSigTpcTofKaExpPi), FILL_MAP_D0(nSigTpcTofPiExpKa), FILL_MAP_D0(nSigTpcTofKaExpKa), + // ML variables + FILL_MAP_D0(bdtOutputBkg), + FILL_MAP_D0(bdtOutputNonPrompt), + FILL_MAP_D0(bdtOutputPrompt), FILL_MAP_D0(maxNormalisedDeltaIP), FILL_MAP_D0(impactParameterProduct), @@ -291,5 +306,6 @@ class HfMlResponseD0ToKPi : public HfMlResponse #undef CHECK_AND_FILL_VEC_D0_HFHELPER #undef CHECK_AND_FILL_VEC_D0_HFHELPER_SIGNED #undef CHECK_AND_FILL_VEC_D0_OBJECT_HFHELPER_SIGNED +#undef CHECK_AND_FILL_VEC_D0_ML #endif // PWGHF_CORE_HFMLRESPONSED0TOKPI_H_ diff --git a/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx b/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx index 6886abf4c73..aed74e9ad7a 100644 --- a/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx @@ -105,8 +105,8 @@ struct HfCorrelatorDMesonPairs { // using TracksWPid = soa::Join; - Partition> selectedD0Candidates = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlagD0 || aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlagD0bar; - Partition> selectedD0CandidatesMc = aod::hf_sel_candidate_d0::isRecoHfFlag >= selectionFlagHf; + Partition> selectedD0Candidates = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlagD0 || aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlagD0bar; + Partition> selectedD0CandidatesMc = aod::hf_sel_candidate_d0::isRecoHfFlag >= selectionFlagHf; HistogramConfigSpec hTH1Pt{HistType::kTH1F, {{180, 0., 36.}}}; HistogramConfigSpec hTH1Y{HistType::kTH1F, {{100, -5., 5.}}}; @@ -524,7 +524,7 @@ struct HfCorrelatorDMesonPairs { /// D0(bar)-D0(bar) correlation pair builder - for real data and data-like analysis (i.e. reco-level w/o matching request via MC truth) void processData(aod::Collision const& collision, - soa::Join const& candidates, aod::Tracks const&) + soa::Join const& candidates, aod::Tracks const&) { for (const auto& candidate : candidates) { analysePid(candidate); @@ -564,11 +564,11 @@ struct HfCorrelatorDMesonPairs { if (applyMl) { if (isDCand1) { - std::vector inputFeaturesD0 = hfMlResponse.getInputFeatures(candidate1, o2::constants::physics::kD0); + std::vector inputFeaturesD0 = hfMlResponse.getInputFeatures(candidate1, o2::constants::physics::kD0); isSelectedMlD0Cand1 = hfMlResponse.isSelectedMl(inputFeaturesD0, candidate1.pt(), outputMlD0Cand1); } if (isDbarCand1) { - std::vector inputFeaturesD0bar = hfMlResponse.getInputFeatures(candidate1, o2::constants::physics::kD0Bar); + std::vector inputFeaturesD0bar = hfMlResponse.getInputFeatures(candidate1, o2::constants::physics::kD0Bar); isSelectedMlD0barCand1 = hfMlResponse.isSelectedMl(inputFeaturesD0bar, candidate1.pt(), outputMlD0barCand1); } @@ -630,11 +630,11 @@ struct HfCorrelatorDMesonPairs { if (applyMl) { if (isDCand2) { - std::vector inputFeaturesD0 = hfMlResponse.getInputFeatures(candidate2, o2::constants::physics::kD0); + std::vector inputFeaturesD0 = hfMlResponse.getInputFeatures(candidate2, o2::constants::physics::kD0); isSelectedMlD0Cand2 = hfMlResponse.isSelectedMl(inputFeaturesD0, candidate2.pt(), outputMlD0Cand2); } if (isDbarCand2) { - std::vector inputFeaturesD0bar = hfMlResponse.getInputFeatures(candidate2, o2::constants::physics::kD0Bar); + std::vector inputFeaturesD0bar = hfMlResponse.getInputFeatures(candidate2, o2::constants::physics::kD0Bar); isSelectedMlD0barCand2 = hfMlResponse.isSelectedMl(inputFeaturesD0bar, candidate2.pt(), outputMlD0barCand2); } @@ -665,7 +665,7 @@ struct HfCorrelatorDMesonPairs { PROCESS_SWITCH(HfCorrelatorDMesonPairs, processData, "Process data mode", true); - void processMcRec(aod::Collision const& collision, soa::Join const& candidates, aod::Tracks const&) + void processMcRec(aod::Collision const& collision, soa::Join const& candidates, aod::Tracks const&) { for (const auto& candidate : candidates) { analysePid(candidate); @@ -719,11 +719,11 @@ struct HfCorrelatorDMesonPairs { if (applyMl) { if (isDCand1) { - std::vector inputFeaturesD0 = hfMlResponse.getInputFeatures(candidate1, o2::constants::physics::kD0); + std::vector inputFeaturesD0 = hfMlResponse.getInputFeatures(candidate1, o2::constants::physics::kD0); isSelectedMlD0Cand1 = hfMlResponse.isSelectedMl(inputFeaturesD0, candidate1.pt(), outputMlD0Cand1); } if (isDbarCand1) { - std::vector inputFeaturesD0bar = hfMlResponse.getInputFeatures(candidate1, o2::constants::physics::kD0Bar); + std::vector inputFeaturesD0bar = hfMlResponse.getInputFeatures(candidate1, o2::constants::physics::kD0Bar); isSelectedMlD0barCand1 = hfMlResponse.isSelectedMl(inputFeaturesD0bar, candidate1.pt(), outputMlD0barCand1); } // Remove non-ML selected D0 candidates @@ -826,11 +826,11 @@ struct HfCorrelatorDMesonPairs { if (applyMl) { if (isDCand2) { - std::vector inputFeaturesD0 = hfMlResponse.getInputFeatures(candidate2, o2::constants::physics::kD0); + std::vector inputFeaturesD0 = hfMlResponse.getInputFeatures(candidate2, o2::constants::physics::kD0); isSelectedMlD0Cand2 = hfMlResponse.isSelectedMl(inputFeaturesD0, candidate2.pt(), outputMlD0Cand2); } if (isDbarCand2) { - std::vector inputFeaturesD0bar = hfMlResponse.getInputFeatures(candidate2, o2::constants::physics::kD0Bar); + std::vector inputFeaturesD0bar = hfMlResponse.getInputFeatures(candidate2, o2::constants::physics::kD0Bar); isSelectedMlD0barCand2 = hfMlResponse.isSelectedMl(inputFeaturesD0bar, candidate2.pt(), outputMlD0barCand2); } From 3a17478ea4d9c71d2295912de45b0d5b7b1d9ae0 Mon Sep 17 00:00:00 2001 From: lauraser <45659867+lauraser@users.noreply.github.com> Date: Thu, 20 Feb 2025 15:56:49 +0100 Subject: [PATCH 0344/1650] Fix bug in Data Model for FemtoDream (#10095) Co-authored-by: Laura Serksnyte --- PWGCF/DataModel/FemtoDerived.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGCF/DataModel/FemtoDerived.h b/PWGCF/DataModel/FemtoDerived.h index 041c273a643..c825c5a7a24 100644 --- a/PWGCF/DataModel/FemtoDerived.h +++ b/PWGCF/DataModel/FemtoDerived.h @@ -140,11 +140,11 @@ DECLARE_SOA_DYNAMIC_COLUMN(Theta, theta, //! Compute the theta of the track }); DECLARE_SOA_DYNAMIC_COLUMN(Px, px, //! Compute the momentum in x in GeV/c [](float pt, float phi) -> float { - return pt * std::sin(phi); + return pt * std::cos(phi); }); DECLARE_SOA_DYNAMIC_COLUMN(Py, py, //! Compute the momentum in y in GeV/c [](float pt, float phi) -> float { - return pt * std::cos(phi); + return pt * std::sin(phi); }); DECLARE_SOA_DYNAMIC_COLUMN(Pz, pz, //! Compute the momentum in z in GeV/c [](float pt, float eta) -> float { From 7bc5e1c98220ddda5c39908f3105edc3bb3e92f0 Mon Sep 17 00:00:00 2001 From: Pritam Chakraborty <47203359+prchakra@users.noreply.github.com> Date: Thu, 20 Feb 2025 15:57:34 +0100 Subject: [PATCH 0345/1650] [PWGCF] FemtoUniverse: Quick fix for MCTruthOrigin (#10077) From f3415cfa7b9202eac7d43b47a0e3efde143f9ee1 Mon Sep 17 00:00:00 2001 From: Junlee Kim Date: Thu, 20 Feb 2025 16:17:20 +0100 Subject: [PATCH 0346/1650] [PWGLF] add acceptance correction on the fly (#10085) Co-authored-by: ALICE Action Bot From 8af6d697d56026cc979caf97279645a5462ded9a Mon Sep 17 00:00:00 2001 From: Junlee Kim Date: Thu, 20 Feb 2025 16:17:32 +0100 Subject: [PATCH 0347/1650] [PWGLF] adding qa for event reduction (#10088) --- PWGLF/Tasks/Strangeness/lambdalambda.cxx | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/PWGLF/Tasks/Strangeness/lambdalambda.cxx b/PWGLF/Tasks/Strangeness/lambdalambda.cxx index e71dad7d417..516fed02e9b 100644 --- a/PWGLF/Tasks/Strangeness/lambdalambda.cxx +++ b/PWGLF/Tasks/Strangeness/lambdalambda.cxx @@ -147,12 +147,17 @@ struct lambdalambda { TRandom* rn = new TRandom(); + bool IsTriggered; + bool IsSelected; + void init(o2::framework::InitContext&) { AxisSpec centQaAxis = {80, 0.0, 80.0}; AxisSpec PVzQaAxis = {300, -15.0, 15.0}; AxisSpec combAxis = {3, -0.5, 2.5}; + histos.add("hEventstat", "", {HistType::kTH1F, {{4, 0, 4}}}); + histos.add("Radius_V0V0_full", "", {HistType::kTHnSparseF, {massAxis, ptAxis, RadiusAxis, combAxis}}); histos.add("CPA_V0V0_full", "", {HistType::kTHnSparseF, {massAxis, ptAxis, CPAAxis, combAxis}}); histos.add("Distance_V0V0_full", "", {HistType::kTHnSparseF, {massAxis, ptAxis, DistanceAxis, combAxis}}); @@ -349,6 +354,9 @@ struct lambdalambda { template void FillHistograms(C1 const& c1, C2 const& c2, V01 const& V01s, V02 const& V02s) { + IsTriggered = false; + IsSelected = false; + for (auto& v01 : V01s) { auto postrack_v01 = v01.template posTrack_as(); auto negtrack_v01 = v01.template negTrack_as(); @@ -426,6 +434,7 @@ struct lambdalambda { if (std::abs(RecoV0V0.Rapidity()) > cfgV0V0RapMax) continue; + IsTriggered = true; histos.fill(HIST("Radius_V0V0_full"), RecoV0V0.M(), RecoV0V0.Pt(), getRadius(v01, v02), V01Tag + V02Tag); histos.fill(HIST("CPA_V0V0_full"), RecoV0V0.M(), RecoV0V0.Pt(), getCPA(v01, v02), V01Tag + V02Tag); @@ -437,6 +446,7 @@ struct lambdalambda { histos.fill(HIST("CPA_V0V0_sel"), RecoV0V0.M(), RecoV0V0.Pt(), getCPA(v01, v02), V01Tag + V02Tag); histos.fill(HIST("Distance_V0V0_sel"), RecoV0V0.M(), RecoV0V0.Pt(), getDistance(v01, v02), V01Tag + V02Tag); histos.fill(HIST("DCA_V0V0_sel"), RecoV0V0.M(), RecoV0V0.Pt(), getDCAofV0V0(v01, v02), V01Tag + V02Tag); + IsSelected = true; } if (doprocessDataSame) { @@ -476,9 +486,11 @@ struct lambdalambda { } else if (cfgCentEst == 2) { centrality = collision.centFT0M(); } + histos.fill(HIST("hEventstat"), 0.5); if (!eventSelected(collision)) { return; } + histos.fill(HIST("hEventstat"), 1.5); histos.fill(HIST("QA/CentDist"), centrality, 1.0); histos.fill(HIST("QA/PVzDist"), collision.posZ(), 1.0); @@ -488,6 +500,11 @@ struct lambdalambda { EffMap = ccdb->getForTimeStamp(cfgEffCorPath.value, bc.timestamp()); } FillHistograms(collision, collision, V0s, V0s); + + if (IsTriggered) + histos.fill(HIST("hEventstat"), 2.5); + if (IsSelected) + histos.fill(HIST("hEventstat"), 3.5); } PROCESS_SWITCH(lambdalambda, processDataSame, "Process Event for same data", true); From 7d935d7cf1137000bb19b8826c94719c972fa9a2 Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Thu, 20 Feb 2025 16:58:54 +0100 Subject: [PATCH 0348/1650] [PWGLF] Found tags populated if requested (#10107) Co-authored-by: ALICE Builder --- .../strangenessbuilderfindable.cxx | 49 ++++++++++++++++--- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/strangenessbuilderfindable.cxx b/PWGLF/TableProducer/Strangeness/strangenessbuilderfindable.cxx index 6492b42d52e..381d22721bd 100644 --- a/PWGLF/TableProducer/Strangeness/strangenessbuilderfindable.cxx +++ b/PWGLF/TableProducer/Strangeness/strangenessbuilderfindable.cxx @@ -76,10 +76,12 @@ static const std::vector tableNames{ "CascToTraRefs", //.31 (interlink CascCores -> TraCascCores) "CascToKFRefs", //.32 (interlink CascCores -> KFCascCores) "TraToCascRefs", //.33 (interlink TraCascCores -> CascCores) - "KFToCascRefs" //.34 (interlink KFCascCores -> CascCores) + "KFToCascRefs", //.34 (interlink KFCascCores -> CascCores) + "V0FoundTags", //.35 (tags found vs findable V0s in findable mode) + "CascFoundTags" //.36 (tags found vs findable Cascades in findable mode) }; -static constexpr int nTablesConst = 35; +static constexpr int nTablesConst = 37; static const std::vector parameterNames{"enable"}; static const int defaultParameters[nTablesConst][nParameters]{ @@ -117,6 +119,8 @@ static const int defaultParameters[nTablesConst][nParameters]{ {-1}, {-1}, {-1}, + {-1}, + {-1}, {-1}}; // use parameters + cov mat non-propagated, aux info + (extension propagated) @@ -169,6 +173,8 @@ struct StrangenessBuilder { kCascToKFRefs, kTraToCascRefs, kKFToCascRefs, + kV0FoundTags, + kCascFoundTags, nTables }; //__________________________________________________ @@ -234,6 +240,11 @@ struct StrangenessBuilder { // Produces traToCascRefs; // tracked -> cascades // Produces kfToCascRefs; // KF -> cascades + //__________________________________________________ + // Findable tags + Produces v0FoundTag; + Produces cascFoundTag; + Configurable> enabledTables{"enabledTables", {defaultParameters[0], nTables, nParameters, tableNames, parameterNames}, "Produce this table: -1 for autodetect; otherwise, 0/1 is false/true"}; @@ -274,6 +285,7 @@ struct StrangenessBuilder { Configurable mc_addGeneratedLambda{"mc_addGeneratedLambda", true, "add V0MCCore entry for generated, not-recoed Lambda"}; Configurable mc_addGeneratedAntiLambda{"mc_addGeneratedAntiLambda", true, "add V0MCCore entry for generated, not-recoed AntiLambda"}; Configurable mc_addGeneratedGamma{"mc_addGeneratedGamma", false, "add V0MCCore entry for generated, not-recoed Gamma"}; + Configurable mc_addGeneratedGammaMakeCollinear{"mc_addGeneratedGammaMakeCollinear", true, "when adding findable gammas, mark them as collinear"}; Configurable mc_findableDetachedV0{"mc_findableDetachedV0", false, "if true, generate findable V0s that have collisionId -1. Caution advised."}; } v0BuilderOpts; @@ -349,6 +361,7 @@ struct StrangenessBuilder { int pdgCode = 0; // undefined if not MC - useful for faster finding int particleId = -1; // de-reference the V0 particle if necessary bool isCollinearV0 = false; + bool found = false; }; struct cascadeEntry { int globalId = -1; @@ -357,7 +370,7 @@ struct StrangenessBuilder { int posTrackId = -1; int negTrackId = -1; int bachTrackId = -1; - int cascadeType = 0; // extra addition (0: standard, 1: findable but not found) + bool found = false; }; std::vector v0List; std::vector cascadeList; @@ -709,6 +722,7 @@ struct StrangenessBuilder { currentV0Entry.pdgCode = 0; currentV0Entry.particleId = -1; currentV0Entry.isCollinearV0 = v0.isCollinearV0(); + currentV0Entry.found = true; v0List.push_back(currentV0Entry); } } @@ -789,6 +803,10 @@ struct StrangenessBuilder { currentV0Entry.pdgCode = positiveTrackIndex.pdgCode; currentV0Entry.particleId = positiveTrackIndex.originId; currentV0Entry.isCollinearV0 = false; + if (v0BuilderOpts.mc_addGeneratedGammaMakeCollinear.value && currentV0Entry.pdgCode == 22) { + currentV0Entry.isCollinearV0 = true; + } + currentV0Entry.found = false; if (bestCollisionArray[positiveTrackIndex.mcCollisionId] < 0) { collisionLessV0s++; } @@ -808,6 +826,10 @@ struct StrangenessBuilder { currentV0Entry.pdgCode = positiveTrackIndex.pdgCode; currentV0Entry.particleId = positiveTrackIndex.originId; currentV0Entry.isCollinearV0 = false; + if (v0BuilderOpts.mc_addGeneratedGammaMakeCollinear.value && currentV0Entry.pdgCode == 22) { + currentV0Entry.isCollinearV0 = true; + } + currentV0Entry.found = false; for (const auto& v0 : v0s) { if (v0.posTrackId() == positiveTrackIndex.globalId && v0.negTrackId() == negativeTrackIndex.globalId) { @@ -816,6 +838,7 @@ struct StrangenessBuilder { currentV0Entry.globalId = v0.globalIndex(); currentV0Entry.v0Type = v0.v0Type(); currentV0Entry.isCollinearV0 = v0.isCollinearV0(); + currentV0Entry.found = true; break; } } @@ -851,7 +874,7 @@ struct StrangenessBuilder { currentCascadeEntry.posTrackId = v0.posTrackId(); currentCascadeEntry.negTrackId = v0.negTrackId(); currentCascadeEntry.bachTrackId = cascade.bachelorId(); - currentCascadeEntry.cascadeType = 0; // found + currentCascadeEntry.found = true; cascadeList.push_back(currentCascadeEntry); } } @@ -954,7 +977,7 @@ struct StrangenessBuilder { currentCascadeEntry.posTrackId = v0.posTrackId; currentCascadeEntry.negTrackId = v0.negTrackId; currentCascadeEntry.bachTrackId = bachelorTrackIndex.globalId; - currentCascadeEntry.cascadeType = 1; // findable (but not found) + currentCascadeEntry.found = false; cascadeList.push_back(currentCascadeEntry); if (bestCollisionArray[bachelorTrackIndex.mcCollisionId] < 0) { collisionLessCascades++; @@ -974,7 +997,7 @@ struct StrangenessBuilder { currentCascadeEntry.posTrackId = v0.posTrackId; currentCascadeEntry.negTrackId = v0.negTrackId; currentCascadeEntry.bachTrackId = bachelorTrackIndex.globalId; - currentCascadeEntry.cascadeType = 1; // findable (but not found) + currentCascadeEntry.found = false; if (bestCollisionArray[bachelorTrackIndex.mcCollisionId] < 0) { collisionLessCascades++; } @@ -985,7 +1008,7 @@ struct StrangenessBuilder { cascade.bachelorId() == bachelorTrackIndex.globalId) { // this will override type, but not collision index // N.B.: collision index checks still desirable! - currentCascadeEntry.cascadeType = 0; + currentCascadeEntry.found = true; currentCascadeEntry.globalId = cascade.globalIndex(); break; } @@ -1226,6 +1249,12 @@ struct StrangenessBuilder { histos.fill(HIST("hTableBuildingStatistics"), kMcV0Labels); } + // Construct found tag + if (mEnabledTables[kV0FoundTags]) { + v0FoundTag(v0.found); + histos.fill(HIST("hTableBuildingStatistics"), kV0FoundTags); + } + // Mark mcParticle as recoed (no searching necessary afterwards) if (thisInfo.label > -1) { mcParticleIsReco[thisInfo.label] = true; @@ -1582,6 +1611,12 @@ struct StrangenessBuilder { histos.fill(HIST("hTableBuildingStatistics"), kMcCascLabels); } + // Construct found tag + if (mEnabledTables[kCascFoundTags]) { + cascFoundTag(cascade.found); + histos.fill(HIST("hTableBuildingStatistics"), kCascFoundTags); + } + // Mark mcParticle as recoed (no searching necessary afterwards) if (thisCascInfo.label > -1) { mcParticleIsReco[thisCascInfo.label] = true; From 81885626520a2286920dc5539f9bcb26ce89bd61 Mon Sep 17 00:00:00 2001 From: Lucia Anna Tarasovicova Date: Thu, 20 Feb 2025 17:14:14 +0100 Subject: [PATCH 0349/1650] [PWGLF] change in hStrangeCorrelation.cxx (#10110) Co-authored-by: Lucia Anna Tarasovicova --- .../Tasks/Strangeness/hStrangeCorrelation.cxx | 443 +++++++++--------- 1 file changed, 229 insertions(+), 214 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx index db7754c5333..60a0b850830 100644 --- a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx +++ b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx @@ -8,7 +8,8 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// +// +/// \file hStrangeCorrelation.cxx /// \brief This task serves to do hadron-(strange hadron) correlation studies. /// The yield will be calculated using the two-particle correlation method. /// Trigger particle : Hadrons @@ -45,13 +46,13 @@ using namespace o2::framework; using namespace o2::framework::expressions; // simple checkers -#define bitset(var, nbit) ((var) |= (1 << (nbit))) -#define bitcheck(var, nbit) ((var) & (1 << (nbit))) +#define BIT_SET(var, nbit) ((var) |= (1 << (nbit))) +#define BIT_CHECK(var, nbit) ((var) & (1 << (nbit))) using TracksComplete = soa::Join; using V0DatasWithoutTrackX = soa::Join; -struct correlateStrangeness { +struct HStrangeCorrelation { // for efficiency corrections if requested Service ccdb; @@ -91,7 +92,7 @@ struct correlateStrangeness { // Axes - configurable for smaller sizes ConfigurableAxis axisMult{"axisMult", {VARIABLE_WIDTH, 0.0f, 0.01f, 1.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 70.0f, 100.0f}, "Mixing bins - multiplicity"}; ConfigurableAxis axisVtxZ{"axisVtxZ", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; - ConfigurableAxis axisPhi{"axisPhi", {72, 0, 2 * M_PI}, "#phi"}; + ConfigurableAxis axisPhi{"axisPhi", {72, 0, TwoPI}, "#phi"}; ConfigurableAxis axisEta{"axisEta", {80, -0.8, +0.8}, "#eta"}; ConfigurableAxis axisDeltaPhi{"axisDeltaPhi", {72, -PIHalf, PIHalf * 3}, "delta #varphi axis for histograms"}; ConfigurableAxis axisDeltaEta{"axisDeltaEta", {50, -1.6, 1.6}, "delta eta axis for histograms"}; @@ -111,7 +112,7 @@ struct correlateStrangeness { // Implementation of on-the-spot efficiency correction Configurable applyEfficiencyCorrection{"applyEfficiencyCorrection", false, "apply efficiency correction"}; Configurable applyEfficiencyForTrigger{"applyEfficiencyForTrigger", false, "apply efficiency correction for the trigger particle"}; - Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository to use"}; + Configurable ccdburl{"ccdburl", "http://alice-ccdb.cern.ch", "url of the ccdb repository to use"}; Configurable efficiencyCCDBPath{"efficiencyCCDBPath", "GLO/Config/GeometryAligned", "Path of the efficiency corrections"}; // Configurables for doing subwagon systematics @@ -131,22 +132,22 @@ struct correlateStrangeness { // --- Associated: topological variable variation (OK to vary all-at-once, at least for first study) Configurable v0cospa{"v0cospa", 0.97, "V0 CosPA"}; // double -> N.B. dcos(x)/dx = 0 at x=0) - Configurable dcaV0dau{"dcav0dau", 1.0, "DCA V0 Daughters"}; + Configurable dcaV0dau{"dcaV0dau", 1.0, "DCA V0 Daughters"}; Configurable dcanegtopv{"dcanegtopv", 0.06, "DCA Neg To PV"}; Configurable dcapostopv{"dcapostopv", 0.06, "DCA Pos To PV"}; - Configurable v0RadiusMin{"v0radiusmin", 0.5, "v0radius"}; - Configurable v0RadiusMax{"v0radiusmax", 200, "v0radius"}; + Configurable v0RadiusMin{"v0RadiusMin", 0.5, "v0radius"}; + Configurable v0RadiusMax{"v0RadiusMax", 200, "v0radius"}; // cascade selections - Configurable casc_cospa{"casc_cospa", 0.95, "casc_cospa"}; - Configurable casc_dcacascdau{"casc_dcacascdau", 1.0, "casc_dcacascdau"}; - Configurable casc_dcabachtopv{"casc_dcabachtopv", 0.1, "casc_dcabachtopv"}; - Configurable casc_cascradius{"casc_cascradius", 0.5, "casc_cascradius"}; - Configurable casc_v0masswindow{"casc_v0masswindow", 0.01, "casc_v0masswindow"}; - Configurable casc_mindcav0topv{"casc_mindcav0topv", 0.01, "casc_mindcav0topv"}; + Configurable cascCospa{"cascCospa", 0.95, "cascCospa"}; + Configurable cascDcacascdau{"cascDcacascdau", 1.0, "cascDcacascdau"}; + Configurable cascDcabachtopv{"cascDcabachtopv", 0.1, "cascDcabachtopv"}; + Configurable cascRadius{"cascRadius", 0.5, "cascRadius"}; + Configurable cascV0masswindow{"cascV0masswindow", 0.01, "cascV0masswindow"}; + Configurable cascMindcav0topv{"cascMindcav0topv", 0.01, "cascMindcav0topv"}; // dE/dx for associated daughters - Configurable dEdxCompatibility{"dEdxCompatibility", 1, "0: loose, 1: normal, 2: tight. Defined in hStrangeCorrelationFilter"}; + Configurable dEdxCompatibility{"dEdxCompatibility", 1, "0: loose, 1: normal, 2: tight. Defined in HStrangeCorrelationFilter"}; // (N.B.: sources that can be investigated in post are not listed!) } systCuts; @@ -161,7 +162,6 @@ struct correlateStrangeness { TH2F* hEfficiencyXiPlus; TH2F* hEfficiencyOmegaMinus; TH2F* hEfficiencyOmegaPlus; - TH2F* hEfficiencyHadron; using BinningType = ColumnBinningPolicy; @@ -175,10 +175,10 @@ struct correlateStrangeness { Preslice collisionSliceHadrons = aod::assocHadrons::collisionId; Preslice perCollision = aod::mcparticle::mcCollisionId; - static constexpr std::string_view v0names[] = {"K0Short", "Lambda", "AntiLambda"}; - static constexpr std::string_view cascadenames[] = {"XiMinus", "XiPlus", "OmegaMinus", "OmegaPlus"}; - static constexpr std::string_view particlenames[] = {"K0Short", "Lambda", "AntiLambda", "XiMinus", "XiPlus", "OmegaMinus", "OmegaPlus", "Pion", "Hadron"}; - static constexpr int pdgCodes[] = {310, 3122, -3122, 3312, -3312, 3334, -3334, 211}; + static constexpr std::string_view kV0names[] = {"K0Short", "Lambda", "AntiLambda"}; + static constexpr std::string_view kCascadenames[] = {"XiMinus", "XiPlus", "OmegaMinus", "OmegaPlus"}; + static constexpr std::string_view kParticlenames[] = {"K0Short", "Lambda", "AntiLambda", "XiMinus", "XiPlus", "OmegaMinus", "OmegaPlus", "Pion", "Hadron"}; + static constexpr int kPdgCodes[] = {310, 3122, -3122, 3312, -3312, 3334, -3334, 211}; uint16_t doCorrelation; int mRunNumber; @@ -189,16 +189,11 @@ struct correlateStrangeness { /// Function to aid in calculating delta-phi /// \param phi1 first phi value /// \param phi2 second phi value - Double_t ComputeDeltaPhi(Double_t phi1, Double_t phi2) + double computeDeltaPhi(double phi1, double phi2) { - Double_t deltaPhi = phi1 - phi2; - if (deltaPhi < -TMath::Pi() / 2.) { - deltaPhi += 2. * TMath::Pi(); - } - if (deltaPhi > 3 * TMath::Pi() / 2.) { - deltaPhi -= 2. * TMath::Pi(); - } - return deltaPhi; + double deltaPhi = phi1 - phi2; + double shiftedDeltaPhi = RecoDecay::constrainAngle(deltaPhi, -PIHalf); + return shiftedDeltaPhi; } /// Function to load zorro @@ -240,6 +235,8 @@ struct correlateStrangeness { hEfficiencyXiPlus = static_cast(listEfficiencies->FindObject("hEfficiencyXiPlus")); hEfficiencyOmegaMinus = static_cast(listEfficiencies->FindObject("hEfficiencyOmegaMinus")); hEfficiencyOmegaPlus = static_cast(listEfficiencies->FindObject("hEfficiencyOmegaPlus")); + hEfficiencyHadron = static_cast(listEfficiencies->FindObject("hEfficiencyHadron")); + hEfficiencyPion = static_cast(listEfficiencies->FindObject("hEfficiencyPion")); LOG(info) << "Efficiencies now loaded for " << mRunNumber; } template @@ -254,7 +251,7 @@ struct correlateStrangeness { if (track.tpcNClsShared() > systCuts.triggerMaxTPCSharedClusters) { return false; // skip, has shared clusters } - if (!(bitcheck(track.itsClusterMap(), 0)) && systCuts.triggerRequireL0) { + if (!(BIT_CHECK(track.itsClusterMap(), 0)) && systCuts.triggerRequireL0) { return false; // skip, doesn't have cluster in ITS L0 } // systematic variations: trigger DCAxy @@ -274,7 +271,7 @@ struct correlateStrangeness { } void fillCorrelationsV0(aod::TriggerTracks const& triggers, aod::AssocV0s const& assocs, bool mixing, float pvz, float mult) { - for (auto& triggerTrack : triggers) { + for (auto const& triggerTrack : triggers) { if (doTriggPhysicalPrimary && !triggerTrack.mcPhysicalPrimary()) continue; auto trigg = triggerTrack.track_as(); @@ -290,7 +287,7 @@ struct correlateStrangeness { histos.fill(HIST("sameEvent/TriggerParticlesV0"), trigg.pt(), mult, weight); } - for (auto& assocCandidate : assocs) { + for (auto const& assocCandidate : assocs) { auto assoc = assocCandidate.v0Core_as(); //---] syst cuts [--- @@ -317,7 +314,7 @@ struct correlateStrangeness { if (postrack.tpcNClsCrossedRows() < systCuts.minTPCNCrossedRowsAssociated || negtrack.tpcNClsCrossedRows() < systCuts.minTPCNCrossedRowsAssociated) continue; - float deltaphi = ComputeDeltaPhi(trigg.phi(), assoc.phi()); + float deltaphi = computeDeltaPhi(trigg.phi(), assoc.phi()); float deltaeta = trigg.eta() - assoc.eta(); float ptassoc = assoc.pt(); float pttrigger = trigg.pt(); @@ -335,38 +332,38 @@ struct correlateStrangeness { hEfficiencyV0[1] = hEfficiencyLambda; hEfficiencyV0[2] = hEfficiencyAntiLambda; static_for<0, 2>([&](auto i) { - constexpr int index = i.value; + constexpr int Index = i.value; float efficiency = 1.0f; if (applyEfficiencyCorrection) { - efficiency = hEfficiencyV0[index]->Interpolate(ptassoc, assoc.eta()); + efficiency = hEfficiencyV0[Index]->Interpolate(ptassoc, assoc.eta()); } if (applyEfficiencyForTrigger) { efficiency = efficiency * hEfficiencyTrigger->Interpolate(pttrigger, trigg.eta()); } float weight = (applyEfficiencyCorrection || applyEfficiencyForTrigger) ? 1. / efficiency : 1.0f; - if (bitcheck(doCorrelation, index) && (!applyEfficiencyCorrection || efficiency != 0)) { - if (assocCandidate.compatible(index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && !mixing && -massWindowConfigurations.maxBgNSigma < assocCandidate.invMassNSigma(index) && assocCandidate.invMassNSigma(index) < -massWindowConfigurations.minBgNSigma) - histos.fill(HIST("sameEvent/LeftBg/") + HIST(v0names[index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); - if (assocCandidate.compatible(index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && !mixing && -massWindowConfigurations.maxPeakNSigma < assocCandidate.invMassNSigma(index) && assocCandidate.invMassNSigma(index) < +massWindowConfigurations.maxPeakNSigma) { - histos.fill(HIST("sameEvent/Signal/") + HIST(v0names[index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); + if (BIT_CHECK(doCorrelation, Index) && (!applyEfficiencyCorrection || efficiency != 0)) { + if (assocCandidate.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(Index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && !mixing && -massWindowConfigurations.maxBgNSigma < assocCandidate.invMassNSigma(Index) && assocCandidate.invMassNSigma(Index) < -massWindowConfigurations.minBgNSigma) + histos.fill(HIST("sameEvent/LeftBg/") + HIST(kV0names[Index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); + if (assocCandidate.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(Index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && !mixing && -massWindowConfigurations.maxPeakNSigma < assocCandidate.invMassNSigma(Index) && assocCandidate.invMassNSigma(Index) < +massWindowConfigurations.maxPeakNSigma) { + histos.fill(HIST("sameEvent/Signal/") + HIST(kV0names[Index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); if (std::abs(deltaphi) < 0.8) { - histos.fill(HIST("hITSClusters") + HIST(v0names[index]) + HIST("NegativeDaughterToward"), ptassoc, negtrack.itsNCls(), assoc.v0radius()); - histos.fill(HIST("hITSClusters") + HIST(v0names[index]) + HIST("PositiveDaughterToward"), ptassoc, postrack.itsNCls(), assoc.v0radius()); + histos.fill(HIST("hITSClusters") + HIST(kV0names[Index]) + HIST("NegativeDaughterToward"), ptassoc, negtrack.itsNCls(), assoc.v0radius()); + histos.fill(HIST("hITSClusters") + HIST(kV0names[Index]) + HIST("PositiveDaughterToward"), ptassoc, postrack.itsNCls(), assoc.v0radius()); } if (std::abs(deltaphi) > 1 && std::abs(deltaphi) < 2) { - histos.fill(HIST("hITSClusters") + HIST(v0names[index]) + HIST("NegativeDaughterTransverse"), ptassoc, negtrack.itsNCls(), assoc.v0radius()); - histos.fill(HIST("hITSClusters") + HIST(v0names[index]) + HIST("PositiveDaughterTransverse"), ptassoc, postrack.itsNCls(), assoc.v0radius()); + histos.fill(HIST("hITSClusters") + HIST(kV0names[Index]) + HIST("NegativeDaughterTransverse"), ptassoc, negtrack.itsNCls(), assoc.v0radius()); + histos.fill(HIST("hITSClusters") + HIST(kV0names[Index]) + HIST("PositiveDaughterTransverse"), ptassoc, postrack.itsNCls(), assoc.v0radius()); } } - if (assocCandidate.compatible(index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && !mixing && +massWindowConfigurations.minBgNSigma < assocCandidate.invMassNSigma(index) && assocCandidate.invMassNSigma(index) < +massWindowConfigurations.maxBgNSigma) - histos.fill(HIST("sameEvent/RightBg/") + HIST(v0names[index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); - if (assocCandidate.compatible(index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && mixing && -massWindowConfigurations.maxBgNSigma < assocCandidate.invMassNSigma(index) && assocCandidate.invMassNSigma(index) < -massWindowConfigurations.minBgNSigma) - histos.fill(HIST("mixedEvent/LeftBg/") + HIST(v0names[index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); - if (assocCandidate.compatible(index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && mixing && -massWindowConfigurations.maxPeakNSigma < assocCandidate.invMassNSigma(index) && assocCandidate.invMassNSigma(index) < +massWindowConfigurations.maxPeakNSigma) - histos.fill(HIST("mixedEvent/Signal/") + HIST(v0names[index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); - if (assocCandidate.compatible(index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && mixing && +massWindowConfigurations.minBgNSigma < assocCandidate.invMassNSigma(index) && assocCandidate.invMassNSigma(index) < +massWindowConfigurations.maxBgNSigma) - histos.fill(HIST("mixedEvent/RightBg/") + HIST(v0names[index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); + if (assocCandidate.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(Index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && !mixing && +massWindowConfigurations.minBgNSigma < assocCandidate.invMassNSigma(Index) && assocCandidate.invMassNSigma(Index) < +massWindowConfigurations.maxBgNSigma) + histos.fill(HIST("sameEvent/RightBg/") + HIST(kV0names[Index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); + if (assocCandidate.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(Index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && mixing && -massWindowConfigurations.maxBgNSigma < assocCandidate.invMassNSigma(Index) && assocCandidate.invMassNSigma(Index) < -massWindowConfigurations.minBgNSigma) + histos.fill(HIST("mixedEvent/LeftBg/") + HIST(kV0names[Index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); + if (assocCandidate.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(Index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && mixing && -massWindowConfigurations.maxPeakNSigma < assocCandidate.invMassNSigma(Index) && assocCandidate.invMassNSigma(Index) < +massWindowConfigurations.maxPeakNSigma) + histos.fill(HIST("mixedEvent/Signal/") + HIST(kV0names[Index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); + if (assocCandidate.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(Index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && mixing && +massWindowConfigurations.minBgNSigma < assocCandidate.invMassNSigma(Index) && assocCandidate.invMassNSigma(Index) < +massWindowConfigurations.maxBgNSigma) + histos.fill(HIST("mixedEvent/RightBg/") + HIST(kV0names[Index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); } }); } @@ -375,7 +372,7 @@ struct correlateStrangeness { void fillCorrelationsCascade(aod::TriggerTracks const& triggers, aod::AssocCascades const& assocs, bool mixing, float pvx, float pvy, float pvz, float mult) { - for (auto& triggerTrack : triggers) { + for (auto const& triggerTrack : triggers) { if (doTriggPhysicalPrimary && !triggerTrack.mcPhysicalPrimary()) continue; auto trigg = triggerTrack.track_as(); @@ -390,20 +387,20 @@ struct correlateStrangeness { float weight = (applyEfficiencyForTrigger) ? 1. / efficiency : 1.0f; histos.fill(HIST("sameEvent/TriggerParticlesCascade"), trigg.pt(), mult, weight); } - for (auto& assocCandidate : assocs) { + for (auto const& assocCandidate : assocs) { auto assoc = assocCandidate.cascData(); //---] syst cuts [--- if (std::abs(assoc.dcapostopv()) < systCuts.dcapostopv || std::abs(assoc.dcanegtopv()) < systCuts.dcanegtopv || - assoc.dcabachtopv() < systCuts.casc_dcabachtopv || + assoc.dcabachtopv() < systCuts.cascDcabachtopv || assoc.dcaV0daughters() > systCuts.dcaV0dau || - assoc.dcacascdaughters() > systCuts.casc_dcacascdau || + assoc.dcacascdaughters() > systCuts.cascDcacascdau || assoc.v0cosPA(pvx, pvy, pvz) < systCuts.v0cospa || - assoc.casccosPA(pvx, pvy, pvz) < systCuts.casc_cospa || - assoc.cascradius() < systCuts.casc_cascradius || - std::abs(assoc.dcav0topv(pvx, pvy, pvz)) < systCuts.casc_mindcav0topv || - std::abs(assoc.mLambda() - pdgDB->Mass(3122)) > systCuts.casc_v0masswindow) + assoc.casccosPA(pvx, pvy, pvz) < systCuts.cascCospa || + assoc.cascradius() < systCuts.cascRadius || + std::abs(assoc.dcav0topv(pvx, pvy, pvz)) < systCuts.cascMindcav0topv || + std::abs(assoc.mLambda() - o2::constants::physics::MassLambda0) > systCuts.cascV0masswindow) continue; //---] removing autocorrelations [--- @@ -429,7 +426,7 @@ struct correlateStrangeness { if (postrack.tpcNClsCrossedRows() < systCuts.minTPCNCrossedRowsAssociated || negtrack.tpcNClsCrossedRows() < systCuts.minTPCNCrossedRowsAssociated || bachtrack.tpcNClsCrossedRows() < systCuts.minTPCNCrossedRowsAssociated) continue; - float deltaphi = ComputeDeltaPhi(trigg.phi(), assoc.phi()); + float deltaphi = computeDeltaPhi(trigg.phi(), assoc.phi()); float deltaeta = trigg.eta() - assoc.eta(); float ptassoc = assoc.pt(); float pttrigger = trigg.pt(); @@ -449,28 +446,28 @@ struct correlateStrangeness { hEfficiencyCascade[3] = hEfficiencyOmegaPlus; static_for<0, 3>([&](auto i) { - constexpr int index = i.value; + constexpr int Index = i.value; float efficiency = 1.0f; if (applyEfficiencyCorrection) { - efficiency = hEfficiencyCascade[index]->Interpolate(ptassoc, assoc.eta()); + efficiency = hEfficiencyCascade[Index]->Interpolate(ptassoc, assoc.eta()); } if (applyEfficiencyForTrigger) { efficiency = efficiency * hEfficiencyTrigger->Interpolate(pttrigger, trigg.eta()); } float weight = (applyEfficiencyCorrection || applyEfficiencyForTrigger) ? 1. / efficiency : 1.0f; - if (bitcheck(doCorrelation, index + 3) && (!applyEfficiencyCorrection || efficiency != 0)) { - if (assocCandidate.compatible(index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && !mixing && -massWindowConfigurations.maxBgNSigma < assocCandidate.invMassNSigma(index) && assocCandidate.invMassNSigma(index) < -massWindowConfigurations.minBgNSigma) - histos.fill(HIST("sameEvent/LeftBg/") + HIST(cascadenames[index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); - if (assocCandidate.compatible(index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && !mixing && -massWindowConfigurations.maxPeakNSigma < assocCandidate.invMassNSigma(index) && assocCandidate.invMassNSigma(index) < +massWindowConfigurations.maxPeakNSigma) - histos.fill(HIST("sameEvent/Signal/") + HIST(cascadenames[index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); - if (assocCandidate.compatible(index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && !mixing && +massWindowConfigurations.minBgNSigma < assocCandidate.invMassNSigma(index) && assocCandidate.invMassNSigma(index) < +massWindowConfigurations.maxBgNSigma) - histos.fill(HIST("sameEvent/RightBg/") + HIST(cascadenames[index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); - if (assocCandidate.compatible(index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && mixing && -massWindowConfigurations.maxBgNSigma < assocCandidate.invMassNSigma(index) && assocCandidate.invMassNSigma(index) < -massWindowConfigurations.minBgNSigma) - histos.fill(HIST("mixedEvent/LeftBg/") + HIST(cascadenames[index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); - if (assocCandidate.compatible(index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && mixing && -massWindowConfigurations.maxPeakNSigma < assocCandidate.invMassNSigma(index) && assocCandidate.invMassNSigma(index) < +massWindowConfigurations.maxPeakNSigma) - histos.fill(HIST("mixedEvent/Signal/") + HIST(cascadenames[index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); - if (assocCandidate.compatible(index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && mixing && +massWindowConfigurations.minBgNSigma < assocCandidate.invMassNSigma(index) && assocCandidate.invMassNSigma(index) < +massWindowConfigurations.maxBgNSigma) - histos.fill(HIST("mixedEvent/RightBg/") + HIST(cascadenames[index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); + if (BIT_CHECK(doCorrelation, Index + 3) && (!applyEfficiencyCorrection || efficiency != 0)) { + if (assocCandidate.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(Index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && !mixing && -massWindowConfigurations.maxBgNSigma < assocCandidate.invMassNSigma(Index) && assocCandidate.invMassNSigma(Index) < -massWindowConfigurations.minBgNSigma) + histos.fill(HIST("sameEvent/LeftBg/") + HIST(kCascadenames[Index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); + if (assocCandidate.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(Index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && !mixing && -massWindowConfigurations.maxPeakNSigma < assocCandidate.invMassNSigma(Index) && assocCandidate.invMassNSigma(Index) < +massWindowConfigurations.maxPeakNSigma) + histos.fill(HIST("sameEvent/Signal/") + HIST(kCascadenames[Index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); + if (assocCandidate.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(Index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && !mixing && +massWindowConfigurations.minBgNSigma < assocCandidate.invMassNSigma(Index) && assocCandidate.invMassNSigma(Index) < +massWindowConfigurations.maxBgNSigma) + histos.fill(HIST("sameEvent/RightBg/") + HIST(kCascadenames[Index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); + if (assocCandidate.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(Index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && mixing && -massWindowConfigurations.maxBgNSigma < assocCandidate.invMassNSigma(Index) && assocCandidate.invMassNSigma(Index) < -massWindowConfigurations.minBgNSigma) + histos.fill(HIST("mixedEvent/LeftBg/") + HIST(kCascadenames[Index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); + if (assocCandidate.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(Index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && mixing && -massWindowConfigurations.maxPeakNSigma < assocCandidate.invMassNSigma(Index) && assocCandidate.invMassNSigma(Index) < +massWindowConfigurations.maxPeakNSigma) + histos.fill(HIST("mixedEvent/Signal/") + HIST(kCascadenames[Index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); + if (assocCandidate.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(Index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && mixing && +massWindowConfigurations.minBgNSigma < assocCandidate.invMassNSigma(Index) && assocCandidate.invMassNSigma(Index) < +massWindowConfigurations.maxBgNSigma) + histos.fill(HIST("mixedEvent/RightBg/") + HIST(kCascadenames[Index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); } }); } @@ -480,7 +477,7 @@ struct correlateStrangeness { void fillCorrelationsHadron(TTriggers const& triggers, THadrons const& assocs, bool mixing, float pvz, float mult) { - for (auto& triggerTrack : triggers) { + for (auto const& triggerTrack : triggers) { if (doTriggPhysicalPrimary && !triggerTrack.mcPhysicalPrimary()) continue; auto trigg = triggerTrack.template track_as(); @@ -488,12 +485,17 @@ struct correlateStrangeness { continue; if (!mixing) { + float efficiency = 1.0f; + if (applyEfficiencyForTrigger) { + efficiency = hEfficiencyTrigger->Interpolate(trigg.pt(), trigg.eta()); + } + float weight = (applyEfficiencyForTrigger) ? 1. / efficiency : 1.0f; if constexpr (requires { triggerTrack.extra(); }) - histos.fill(HIST("sameEvent/TriggerParticlesPion"), trigg.pt(), mult); + histos.fill(HIST("sameEvent/TriggerParticlesPion"), trigg.pt(), mult, weight); else - histos.fill(HIST("sameEvent/TriggerParticlesHadron"), trigg.pt(), mult); + histos.fill(HIST("sameEvent/TriggerParticlesHadron"), trigg.pt(), mult, weight); } - for (auto& assocTrack : assocs) { + for (auto const& assocTrack : assocs) { auto assoc = assocTrack.template track_as(); //---] removing autocorrelations [--- @@ -511,7 +513,7 @@ struct correlateStrangeness { if (assoc.tpcNClsCrossedRows() < systCuts.minTPCNCrossedRowsAssociated) continue; - float deltaphi = ComputeDeltaPhi(trigg.phi(), assoc.phi()); + float deltaphi = computeDeltaPhi(trigg.phi(), assoc.phi()); float deltaeta = trigg.eta() - assoc.eta(); float ptassoc = assoc.pt(); float pttrigger = trigg.pt(); @@ -524,17 +526,30 @@ struct correlateStrangeness { if (ptassoc < axisRanges[2][0] || ptassoc > axisRanges[2][1]) continue; + float efficiency = 1; + if (applyEfficiencyCorrection) { + if constexpr (requires { assocTrack.nSigmaTPCPi(); }) { + efficiency = hEfficiencyPion->Interpolate(ptassoc, assoc.eta()); + } else { + efficiency = hEfficiencyHadron->Interpolate(ptassoc, assoc.eta()); + } + } + if (applyEfficiencyForTrigger) { + efficiency = efficiency * hEfficiencyTrigger->Interpolate(pttrigger, trigg.eta()); + } + float weight = (applyEfficiencyCorrection || applyEfficiencyForTrigger) ? 1. / efficiency : 1.0f; + if (!mixing) { if constexpr (requires { assocTrack.nSigmaTPCPi(); }) { - histos.fill(HIST("sameEvent/Signal/Pion"), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult); + histos.fill(HIST("sameEvent/Signal/Pion"), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); } else { - histos.fill(HIST("sameEvent/Signal/Hadron"), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult); + histos.fill(HIST("sameEvent/Signal/Hadron"), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); } } else { if constexpr (requires { assocTrack.nSigmaTPCPi(); }) { - histos.fill(HIST("mixedEvent/Signal/Pion"), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult); + histos.fill(HIST("mixedEvent/Signal/Pion"), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); } else { - histos.fill(HIST("mixedEvent/Signal/Hadron"), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult); + histos.fill(HIST("mixedEvent/Signal/Hadron"), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); } } } @@ -560,23 +575,23 @@ struct correlateStrangeness { // set bitmap for convenience doCorrelation = 0; if (doCorrelationK0Short) - bitset(doCorrelation, 0); + BIT_SET(doCorrelation, 0); if (doCorrelationLambda) - bitset(doCorrelation, 1); + BIT_SET(doCorrelation, 1); if (doCorrelationAntiLambda) - bitset(doCorrelation, 2); + BIT_SET(doCorrelation, 2); if (doCorrelationXiMinus) - bitset(doCorrelation, 3); + BIT_SET(doCorrelation, 3); if (doCorrelationXiPlus) - bitset(doCorrelation, 4); + BIT_SET(doCorrelation, 4); if (doCorrelationOmegaMinus) - bitset(doCorrelation, 5); + BIT_SET(doCorrelation, 5); if (doCorrelationOmegaPlus) - bitset(doCorrelation, 6); + BIT_SET(doCorrelation, 6); if (doCorrelationPion) - bitset(doCorrelation, 7); + BIT_SET(doCorrelation, 7); if (doCorrelationHadron) - bitset(doCorrelation, 8); + BIT_SET(doCorrelation, 8); // Store axis ranges to prevent spurious filling // axis status: @@ -763,18 +778,18 @@ struct correlateStrangeness { bool hStrange = false; for (int i = 0; i < 9; i++) { - if (bitcheck(doCorrelation, i)) { - histos.add(fmt::format("h{}EtaVsPtVsPhi", particlenames[i]).c_str(), "", kTH3F, {axisPtQA, axisEta, axisPhi}); - histos.add(fmt::format("h3d{}Spectrum", particlenames[i]).c_str(), fmt::format("h3d{}Spectrum", particlenames[i]).c_str(), kTH3F, {axisPtQA, axisMult, axisMassNSigma}); - histos.add(fmt::format("h3d{}SpectrumY", particlenames[i]).c_str(), fmt::format("h3d{}SpectrumY", particlenames[i]).c_str(), kTH3F, {axisPtQA, axisMult, axisMassNSigma}); - histos.add(fmt::format("sameEvent/Signal/{}", particlenames[i]).c_str(), "", kTHnF, {axisDeltaPhiNDim, axisDeltaEtaNDim, axisPtAssocNDim, axisPtTriggerNDim, axisVtxZNDim, axisMultNDim}); + if (BIT_CHECK(doCorrelation, i)) { + histos.add(fmt::format("h{}EtaVsPtVsPhi", kParticlenames[i]).c_str(), "", kTH3F, {axisPtQA, axisEta, axisPhi}); + histos.add(fmt::format("h3d{}Spectrum", kParticlenames[i]).c_str(), fmt::format("h3d{}Spectrum", kParticlenames[i]).c_str(), kTH3F, {axisPtQA, axisMult, axisMassNSigma}); + histos.add(fmt::format("h3d{}SpectrumY", kParticlenames[i]).c_str(), fmt::format("h3d{}SpectrumY", kParticlenames[i]).c_str(), kTH3F, {axisPtQA, axisMult, axisMassNSigma}); + histos.add(fmt::format("sameEvent/Signal/{}", kParticlenames[i]).c_str(), "", kTHnF, {axisDeltaPhiNDim, axisDeltaEtaNDim, axisPtAssocNDim, axisPtTriggerNDim, axisVtxZNDim, axisMultNDim}); if (i < 7) { hStrange = true; - histos.add(fmt::format("h{}EtaVsPtVsPhiBg", particlenames[i]).c_str(), "", kTH3F, {axisPtQA, axisEta, axisPhi}); - histos.add(fmt::format("hITSClusters{}NegativeDaughterToward", particlenames[i]).c_str(), "", kTH3F, {axisPtAssoc, {8, -0.5, 7.5}, {20, 0, 10}}); - histos.add(fmt::format("hITSClusters{}PositiveDaughterToward", particlenames[i]).c_str(), "", kTH3F, {axisPtAssoc, {8, -0.5, 7.5}, {20, 0, 10}}); - histos.add(fmt::format("hITSClusters{}NegativeDaughterTransverse", particlenames[i]).c_str(), "", kTH3F, {axisPtAssoc, {8, -0.5, 7.5}, {20, 0, 10}}); - histos.add(fmt::format("hITSClusters{}PositiveDaughterTransverse", particlenames[i]).c_str(), "", kTH3F, {axisPtAssoc, {8, -0.5, 7.5}, {20, 0, 10}}); + histos.add(fmt::format("h{}EtaVsPtVsPhiBg", kParticlenames[i]).c_str(), "", kTH3F, {axisPtQA, axisEta, axisPhi}); + histos.add(fmt::format("hITSClusters{}NegativeDaughterToward", kParticlenames[i]).c_str(), "", kTH3F, {axisPtAssoc, {8, -0.5, 7.5}, {20, 0, 10}}); + histos.add(fmt::format("hITSClusters{}PositiveDaughterToward", kParticlenames[i]).c_str(), "", kTH3F, {axisPtAssoc, {8, -0.5, 7.5}, {20, 0, 10}}); + histos.add(fmt::format("hITSClusters{}NegativeDaughterTransverse", kParticlenames[i]).c_str(), "", kTH3F, {axisPtAssoc, {8, -0.5, 7.5}, {20, 0, 10}}); + histos.add(fmt::format("hITSClusters{}PositiveDaughterTransverse", kParticlenames[i]).c_str(), "", kTH3F, {axisPtAssoc, {8, -0.5, 7.5}, {20, 0, 10}}); } } } @@ -801,22 +816,22 @@ struct correlateStrangeness { if (doprocessMCGenerated) { histos.add("Generated/hTrigger", "", kTH2F, {axisPtQA, axisEta}); for (int i = 0; i < 8; i++) { - histos.add(fmt::format("Generated/h{}", particlenames[i]).c_str(), "", kTH2F, {axisPtQA, axisEta}); + histos.add(fmt::format("Generated/h{}", kParticlenames[i]).c_str(), "", kTH2F, {axisPtQA, axisEta}); } histos.addClone("Generated/", "GeneratedWithPV/"); // histograms within |y|<0.5, vs multiplicity for (int i = 0; i < 8; i++) { - histos.add(fmt::format("GeneratedWithPV/h{}_MidYVsMult", particlenames[i]).c_str(), "", kTH2F, {axisPtQA, axisMult}); - histos.add(fmt::format("GeneratedWithPV/h{}_MidYVsMult_TwoPVsOrMore", particlenames[i]).c_str(), "", kTH2F, {axisPtQA, axisMult}); + histos.add(fmt::format("GeneratedWithPV/h{}_MidYVsMult", kParticlenames[i]).c_str(), "", kTH2F, {axisPtQA, axisMult}); + histos.add(fmt::format("GeneratedWithPV/h{}_MidYVsMult_TwoPVsOrMore", kParticlenames[i]).c_str(), "", kTH2F, {axisPtQA, axisMult}); } } if (doprocessClosureTest) { for (int i = 0; i < 8; i++) { - if (bitcheck(doCorrelation, i)) - histos.add(fmt::format("ClosureTest/sameEvent/{}", particlenames[i]).c_str(), "", kTHnF, {axisDeltaPhiNDim, axisDeltaEtaNDim, axisPtAssocNDim, axisPtTriggerNDim, axisVtxZNDim, axisMultNDim}); - if (bitcheck(doCorrelation, i)) - histos.add(fmt::format("ClosureTest/h{}", particlenames[i]).c_str(), "", kTH3F, {axisPtQA, axisEta, axisPhi}); + if (BIT_CHECK(doCorrelation, i)) + histos.add(fmt::format("ClosureTest/sameEvent/{}", kParticlenames[i]).c_str(), "", kTHnF, {axisDeltaPhiNDim, axisDeltaEtaNDim, axisPtAssocNDim, axisPtTriggerNDim, axisVtxZNDim, axisMultNDim}); + if (BIT_CHECK(doCorrelation, i)) + histos.add(fmt::format("ClosureTest/h{}", kParticlenames[i]).c_str(), "", kTH3F, {axisPtQA, axisEta, axisPhi}); } histos.add("ClosureTest/hTrigger", "Trigger Tracks", kTH3F, {axisPtQA, axisEta, axisMult}); } @@ -843,7 +858,7 @@ struct correlateStrangeness { if (!collision.sel8()) { return false; } - if (TMath::Abs(collision.posZ()) > zVertexCut) { + if (std::abs(collision.posZ()) > zVertexCut) { return false; } if (collision.centFT0M() > axisRanges[5][1] || collision.centFT0M() < axisRanges[5][0]) { @@ -893,7 +908,7 @@ struct correlateStrangeness { continue; } auto binNumber = histos.get(HIST("axes/hPtTriggerAxis"))->FindFixBin(track.pt()) - 1; - bitset(triggerPresenceMap[collision.globalIndex()], binNumber); + BIT_SET(triggerPresenceMap[collision.globalIndex()], binNumber); } } } @@ -904,7 +919,7 @@ struct correlateStrangeness { { // ________________________________________________ // skip if desired trigger not found - if (triggerPresenceMap.size() > 0 && !bitcheck(triggerPresenceMap[collision.globalIndex()], triggerBinToSelect)) { + if (triggerPresenceMap.size() > 0 && !BIT_CHECK(triggerPresenceMap[collision.globalIndex()], triggerBinToSelect)) { return; } @@ -950,7 +965,7 @@ struct correlateStrangeness { { // ________________________________________________ // skip if desired trigger not found - if (triggerPresenceMap.size() > 0 && !bitcheck(triggerPresenceMap[collision.globalIndex()], triggerBinToSelect)) { + if (triggerPresenceMap.size() > 0 && !BIT_CHECK(triggerPresenceMap[collision.globalIndex()], triggerBinToSelect)) { return; } @@ -993,23 +1008,23 @@ struct correlateStrangeness { continue; static_for<0, 2>([&](auto i) { - constexpr int index = i.value; + constexpr int Index = i.value; float efficiency = 1.0f; if (applyEfficiencyCorrection) { - efficiency = hEfficiencyV0[index]->Interpolate(v0Data.pt(), v0Data.eta()); + efficiency = hEfficiencyV0[Index]->Interpolate(v0Data.pt(), v0Data.eta()); } float weight = applyEfficiencyCorrection ? 1. / efficiency : 1.0f; - if (v0.compatible(index, systCuts.dEdxCompatibility) && (!doMCassociation || v0.mcTrue(index)) && (!doAssocPhysicalPrimary || v0.mcPhysicalPrimary()) && (!applyEfficiencyCorrection || efficiency != 0)) { - if (bitcheck(doCorrelation, index)) { - histos.fill(HIST("h3d") + HIST(v0names[index]) + HIST("Spectrum"), v0Data.pt(), collision.centFT0M(), v0.invMassNSigma(index), weight); - if (std::abs(v0Data.rapidity(index)) < 0.5) { - histos.fill(HIST("h3d") + HIST(v0names[index]) + HIST("SpectrumY"), v0Data.pt(), collision.centFT0M(), v0.invMassNSigma(index), weight); + if (v0.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || v0.mcTrue(Index)) && (!doAssocPhysicalPrimary || v0.mcPhysicalPrimary()) && (!applyEfficiencyCorrection || efficiency != 0)) { + if (BIT_CHECK(doCorrelation, Index)) { + histos.fill(HIST("h3d") + HIST(kV0names[Index]) + HIST("Spectrum"), v0Data.pt(), collision.centFT0M(), v0.invMassNSigma(Index), weight); + if (std::abs(v0Data.rapidity(Index)) < 0.5) { + histos.fill(HIST("h3d") + HIST(kV0names[Index]) + HIST("SpectrumY"), v0Data.pt(), collision.centFT0M(), v0.invMassNSigma(Index), weight); } - if ((-massWindowConfigurations.maxBgNSigma < v0.invMassNSigma(index) && v0.invMassNSigma(index) < -massWindowConfigurations.minBgNSigma) || (+massWindowConfigurations.minBgNSigma < v0.invMassNSigma(index) && v0.invMassNSigma(index) < +massWindowConfigurations.maxBgNSigma)) { - histos.fill(HIST("h") + HIST(v0names[index]) + HIST("EtaVsPtVsPhiBg"), v0Data.pt(), v0Data.eta(), v0Data.phi(), weight); + if ((-massWindowConfigurations.maxBgNSigma < v0.invMassNSigma(Index) && v0.invMassNSigma(Index) < -massWindowConfigurations.minBgNSigma) || (+massWindowConfigurations.minBgNSigma < v0.invMassNSigma(Index) && v0.invMassNSigma(Index) < +massWindowConfigurations.maxBgNSigma)) { + histos.fill(HIST("h") + HIST(kV0names[Index]) + HIST("EtaVsPtVsPhiBg"), v0Data.pt(), v0Data.eta(), v0Data.phi(), weight); } - if (-massWindowConfigurations.maxPeakNSigma < v0.invMassNSigma(index) && v0.invMassNSigma(index) < +massWindowConfigurations.maxPeakNSigma) { - histos.fill(HIST("h") + HIST(v0names[index]) + HIST("EtaVsPtVsPhi"), v0Data.pt(), v0Data.eta(), v0Data.phi(), weight); + if (-massWindowConfigurations.maxPeakNSigma < v0.invMassNSigma(Index) && v0.invMassNSigma(Index) < +massWindowConfigurations.maxPeakNSigma) { + histos.fill(HIST("h") + HIST(kV0names[Index]) + HIST("EtaVsPtVsPhi"), v0Data.pt(), v0Data.eta(), v0Data.phi(), weight); } } } @@ -1040,7 +1055,7 @@ struct correlateStrangeness { { // ________________________________________________ // skip if desired trigger not found - if (triggerPresenceMap.size() > 0 && !bitcheck(triggerPresenceMap[collision.globalIndex()], triggerBinToSelect)) { + if (triggerPresenceMap.size() > 0 && !BIT_CHECK(triggerPresenceMap[collision.globalIndex()], triggerBinToSelect)) { return; } @@ -1070,14 +1085,14 @@ struct correlateStrangeness { //---] syst cuts [--- if (std::abs(cascData.dcapostopv()) < systCuts.dcapostopv || std::abs(cascData.dcanegtopv()) < systCuts.dcanegtopv || - cascData.dcabachtopv() < systCuts.casc_dcabachtopv || + cascData.dcabachtopv() < systCuts.cascDcabachtopv || cascData.dcaV0daughters() > systCuts.dcaV0dau || - cascData.dcacascdaughters() > systCuts.casc_dcacascdau || + cascData.dcacascdaughters() > systCuts.cascDcacascdau || cascData.v0cosPA(collision.posX(), collision.posY(), collision.posZ()) < systCuts.v0cospa || - cascData.casccosPA(collision.posX(), collision.posY(), collision.posZ()) < systCuts.casc_cospa || - cascData.cascradius() < systCuts.casc_cascradius || - std::abs(cascData.dcav0topv(collision.posX(), collision.posY(), collision.posZ())) < systCuts.casc_mindcav0topv || - std::abs(cascData.mLambda() - pdgDB->Mass(3122)) > systCuts.casc_v0masswindow) + cascData.casccosPA(collision.posX(), collision.posY(), collision.posZ()) < systCuts.cascCospa || + cascData.cascradius() < systCuts.cascRadius || + std::abs(cascData.dcav0topv(collision.posX(), collision.posY(), collision.posZ())) < systCuts.cascMindcav0topv || + std::abs(cascData.mLambda() - o2::constants::physics::MassLambda0) > systCuts.cascV0masswindow) continue; //---] track quality check [--- @@ -1088,23 +1103,23 @@ struct correlateStrangeness { continue; static_for<0, 3>([&](auto i) { - constexpr int index = i.value; + constexpr int Index = i.value; float efficiency = 1.0f; if (applyEfficiencyCorrection) { - efficiency = hEfficiencyCascade[index]->Interpolate(cascData.pt(), cascData.eta()); + efficiency = hEfficiencyCascade[Index]->Interpolate(cascData.pt(), cascData.eta()); } float weight = applyEfficiencyCorrection ? 1. / efficiency : 1.0f; - if (casc.compatible(index, systCuts.dEdxCompatibility) && (!doMCassociation || casc.mcTrue(index)) && (!doAssocPhysicalPrimary || casc.mcPhysicalPrimary()) && (!applyEfficiencyCorrection || efficiency != 0)) { - if (bitcheck(doCorrelation, index + 3)) { - histos.fill(HIST("h3d") + HIST(cascadenames[index]) + HIST("Spectrum"), cascData.pt(), collision.centFT0M(), casc.invMassNSigma(index), weight); - if (std::abs(cascData.rapidity(index)) < 0.5) { - histos.fill(HIST("h3d") + HIST(cascadenames[index]) + HIST("SpectrumY"), cascData.pt(), collision.centFT0M(), casc.invMassNSigma(index), weight); + if (casc.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || casc.mcTrue(Index)) && (!doAssocPhysicalPrimary || casc.mcPhysicalPrimary()) && (!applyEfficiencyCorrection || efficiency != 0)) { + if (BIT_CHECK(doCorrelation, Index + 3)) { + histos.fill(HIST("h3d") + HIST(kCascadenames[Index]) + HIST("Spectrum"), cascData.pt(), collision.centFT0M(), casc.invMassNSigma(Index), weight); + if (std::abs(cascData.rapidity(Index)) < 0.5) { + histos.fill(HIST("h3d") + HIST(kCascadenames[Index]) + HIST("SpectrumY"), cascData.pt(), collision.centFT0M(), casc.invMassNSigma(Index), weight); } - if (-massWindowConfigurations.maxPeakNSigma < casc.invMassNSigma(index) && casc.invMassNSigma(index) < +massWindowConfigurations.maxPeakNSigma) { - histos.fill(HIST("h") + HIST(cascadenames[index]) + HIST("EtaVsPtVsPhi"), cascData.pt(), cascData.eta(), cascData.phi(), weight); + if (-massWindowConfigurations.maxPeakNSigma < casc.invMassNSigma(Index) && casc.invMassNSigma(Index) < +massWindowConfigurations.maxPeakNSigma) { + histos.fill(HIST("h") + HIST(kCascadenames[Index]) + HIST("EtaVsPtVsPhi"), cascData.pt(), cascData.eta(), cascData.phi(), weight); } - if ((-massWindowConfigurations.maxBgNSigma < casc.invMassNSigma(index) && casc.invMassNSigma(index) < -massWindowConfigurations.minBgNSigma) || (+massWindowConfigurations.minBgNSigma < casc.invMassNSigma(index) && casc.invMassNSigma(index) < +massWindowConfigurations.maxBgNSigma)) { - histos.fill(HIST("h") + HIST(cascadenames[index]) + HIST("EtaVsPtVsPhiBg"), cascData.pt(), cascData.eta(), cascData.phi(), weight); + if ((-massWindowConfigurations.maxBgNSigma < casc.invMassNSigma(Index) && casc.invMassNSigma(Index) < -massWindowConfigurations.minBgNSigma) || (+massWindowConfigurations.minBgNSigma < casc.invMassNSigma(Index) && casc.invMassNSigma(Index) < +massWindowConfigurations.maxBgNSigma)) { + histos.fill(HIST("h") + HIST(kCascadenames[Index]) + HIST("EtaVsPtVsPhiBg"), cascData.pt(), cascData.eta(), cascData.phi(), weight); } } } @@ -1132,7 +1147,7 @@ struct correlateStrangeness { { // ________________________________________________ // skip if desired trigger not found - if (triggerPresenceMap.size() > 0 && !bitcheck(triggerPresenceMap[collision.globalIndex()], triggerBinToSelect)) { + if (triggerPresenceMap.size() > 0 && !BIT_CHECK(triggerPresenceMap[collision.globalIndex()], triggerBinToSelect)) { return; } @@ -1175,11 +1190,11 @@ struct correlateStrangeness { aod::AssocHadrons const& assocHadrons, aod::TriggerTracks const& triggerTracks, TracksComplete const&) { - for (auto& [collision1, collision2] : soa::selfCombinations(colBinning, mixingParameter, -1, collisions, collisions)) { + for (auto const& [collision1, collision2] : soa::selfCombinations(colBinning, mixingParameter, -1, collisions, collisions)) { // ________________________________________________ // skip if desired trigger not found - if (triggerPresenceMap.size() > 0 && (!bitcheck(triggerPresenceMap[collision1.globalIndex()], triggerBinToSelect) || !bitcheck(triggerPresenceMap[collision2.globalIndex()], triggerBinToSelect))) { + if (triggerPresenceMap.size() > 0 && (!BIT_CHECK(triggerPresenceMap[collision1.globalIndex()], triggerBinToSelect) || !BIT_CHECK(triggerPresenceMap[collision2.globalIndex()], triggerBinToSelect))) { return; } @@ -1214,7 +1229,7 @@ struct correlateStrangeness { aod::AssocV0s const& associatedV0s, aod::TriggerTracks const& triggerTracks, V0DatasWithoutTrackX const&, aod::V0sLinked const&, TracksComplete const&, aod::BCsWithTimestamps const&) { - for (auto& [collision1, collision2] : soa::selfCombinations(colBinning, mixingParameter, -1, collisions, collisions)) { + for (auto const& [collision1, collision2] : soa::selfCombinations(colBinning, mixingParameter, -1, collisions, collisions)) { // ________________________________________________ if (applyEfficiencyCorrection) { auto bc = collision1.bc_as(); @@ -1222,7 +1237,7 @@ struct correlateStrangeness { } // ________________________________________________ // skip if desired trigger not found - if (triggerPresenceMap.size() > 0 && (!bitcheck(triggerPresenceMap[collision1.globalIndex()], triggerBinToSelect) || !bitcheck(triggerPresenceMap[collision2.globalIndex()], triggerBinToSelect))) { + if (triggerPresenceMap.size() > 0 && (!BIT_CHECK(triggerPresenceMap[collision1.globalIndex()], triggerBinToSelect) || !BIT_CHECK(triggerPresenceMap[collision2.globalIndex()], triggerBinToSelect))) { continue; } @@ -1256,7 +1271,7 @@ struct correlateStrangeness { aod::AssocV0s const&, aod::AssocCascades const& associatedCascades, aod::TriggerTracks const& triggerTracks, V0DatasWithoutTrackX const&, aod::V0sLinked const&, aod::CascDatas const&, TracksComplete const&, aod::BCsWithTimestamps const&) { - for (auto& [collision1, collision2] : soa::selfCombinations(colBinning, mixingParameter, -1, collisions, collisions)) { + for (auto const& [collision1, collision2] : soa::selfCombinations(colBinning, mixingParameter, -1, collisions, collisions)) { // ________________________________________________ if (applyEfficiencyCorrection) { auto bc = collision1.bc_as(); @@ -1264,7 +1279,7 @@ struct correlateStrangeness { } // ________________________________________________ // skip if desired trigger not found - if (triggerPresenceMap.size() > 0 && (!bitcheck(triggerPresenceMap[collision1.globalIndex()], triggerBinToSelect) || !bitcheck(triggerPresenceMap[collision2.globalIndex()], triggerBinToSelect))) { + if (triggerPresenceMap.size() > 0 && (!BIT_CHECK(triggerPresenceMap[collision1.globalIndex()], triggerBinToSelect) || !BIT_CHECK(triggerPresenceMap[collision2.globalIndex()], triggerBinToSelect))) { continue; } @@ -1297,11 +1312,11 @@ struct correlateStrangeness { soa::Join const& assocPions, soa::Join const& triggerTracks, TracksComplete const&) { - for (auto& [collision1, collision2] : soa::selfCombinations(colBinning, mixingParameter, -1, collisions, collisions)) { + for (auto const& [collision1, collision2] : soa::selfCombinations(colBinning, mixingParameter, -1, collisions, collisions)) { // ________________________________________________ // skip if desired trigger not found - if (triggerPresenceMap.size() > 0 && (!bitcheck(triggerPresenceMap[collision1.globalIndex()], triggerBinToSelect) || !bitcheck(triggerPresenceMap[collision2.globalIndex()], triggerBinToSelect))) { + if (triggerPresenceMap.size() > 0 && (!BIT_CHECK(triggerPresenceMap[collision1.globalIndex()], triggerBinToSelect) || !BIT_CHECK(triggerPresenceMap[collision2.globalIndex()], triggerBinToSelect))) { continue; } @@ -1337,11 +1352,11 @@ struct correlateStrangeness { histos.fill(HIST("hClosureTestEventCounter"), 2.5f); for (auto const& mcParticle : mcParticles) { - Double_t geta = mcParticle.eta(); + double geta = mcParticle.eta(); if (std::abs(geta) > 0.8f) { continue; } - Double_t gpt = mcParticle.pt(); + double gpt = mcParticle.pt(); if (std::abs(mcParticle.pdgCode()) == 211 || std::abs(mcParticle.pdgCode()) == 321 || std::abs(mcParticle.pdgCode()) == 2212 || std::abs(mcParticle.pdgCode()) == 11 || std::abs(mcParticle.pdgCode()) == 13) { if (!doTriggPhysicalPrimary || mcParticle.isPhysicalPrimary()) { histos.fill(HIST("hGeneratedQAPtTrigger"), gpt, 0.0f); // step 1: before all selections @@ -1359,13 +1374,13 @@ struct correlateStrangeness { if (!mcParticle.isPhysicalPrimary()) continue; static_for<0, 7>([&](auto i) { - constexpr int index = i.value; + constexpr int Index = i.value; if (i == 0 || i == 7) { - if (std::abs(mcParticle.pdgCode()) == pdgCodes[i]) - histos.fill(HIST("Generated/h") + HIST(particlenames[index]), mcParticle.pt(), mcParticle.eta()); + if (std::abs(mcParticle.pdgCode()) == kPdgCodes[i]) + histos.fill(HIST("Generated/h") + HIST(kParticlenames[Index]), mcParticle.pt(), mcParticle.eta()); } else { - if (mcParticle.pdgCode() == pdgCodes[i]) - histos.fill(HIST("Generated/h") + HIST(particlenames[index]), mcParticle.pt(), mcParticle.eta()); + if (mcParticle.pdgCode() == kPdgCodes[i]) + histos.fill(HIST("Generated/h") + HIST(kParticlenames[Index]), mcParticle.pt(), mcParticle.eta()); } }); } @@ -1380,7 +1395,7 @@ struct correlateStrangeness { bool bestCollisionINELgtZERO = false; uint32_t bestCollisionTriggerPresenceMap = 0; - for (auto& collision : collisions) { + for (auto const& collision : collisions) { if (biggestNContribs < collision.numContrib()) { biggestNContribs = collision.numContrib(); bestCollisionFT0Mpercentile = collision.centFT0M(); @@ -1399,13 +1414,13 @@ struct correlateStrangeness { if (std::abs(mcParticle.y()) > 0.5) continue; static_for<0, 7>([&](auto i) { - constexpr int index = i.value; + constexpr int Index = i.value; if (i == 0 || i == 7) { - if (std::abs(mcParticle.pdgCode()) == pdgCodes[i]) - histos.fill(HIST("GeneratedWithPV/h") + HIST(particlenames[index]) + HIST("_MidYVsMult_TwoPVsOrMore"), mcParticle.pt(), bestCollisionFT0Mpercentile); + if (std::abs(mcParticle.pdgCode()) == kPdgCodes[i]) + histos.fill(HIST("GeneratedWithPV/h") + HIST(kParticlenames[Index]) + HIST("_MidYVsMult_TwoPVsOrMore"), mcParticle.pt(), bestCollisionFT0Mpercentile); } else { - if (mcParticle.pdgCode() == pdgCodes[i]) - histos.fill(HIST("GeneratedWithPV/h") + HIST(particlenames[index]) + HIST("_MidYVsMult_TwoPVsOrMore"), mcParticle.pt(), bestCollisionFT0Mpercentile); + if (mcParticle.pdgCode() == kPdgCodes[i]) + histos.fill(HIST("GeneratedWithPV/h") + HIST(kParticlenames[Index]) + HIST("_MidYVsMult_TwoPVsOrMore"), mcParticle.pt(), bestCollisionFT0Mpercentile); } }); } @@ -1417,7 +1432,7 @@ struct correlateStrangeness { // ________________________________________________ // skip if desired trigger not found - if (triggerPresenceMap.size() > 0 && !bitcheck(bestCollisionTriggerPresenceMap, triggerBinToSelect)) { + if (triggerPresenceMap.size() > 0 && !BIT_CHECK(bestCollisionTriggerPresenceMap, triggerBinToSelect)) { return; } if (!bestCollisionSel8) @@ -1430,11 +1445,11 @@ struct correlateStrangeness { histos.fill(HIST("hClosureTestEventCounter"), 3.5f); for (auto const& mcParticle : mcParticles) { - Double_t geta = mcParticle.eta(); + double geta = mcParticle.eta(); if (std::abs(geta) > 0.8f) { continue; } - Double_t gpt = mcParticle.pt(); + double gpt = mcParticle.pt(); if (std::abs(mcParticle.pdgCode()) == 211 || std::abs(mcParticle.pdgCode()) == 321 || std::abs(mcParticle.pdgCode()) == 2212 || std::abs(mcParticle.pdgCode()) == 11 || std::abs(mcParticle.pdgCode()) == 13) { if (!doTriggPhysicalPrimary || mcParticle.isPhysicalPrimary()) { histos.fill(HIST("hGeneratedQAPtTrigger"), gpt, 1.0f); // step 2: after event selection @@ -1452,24 +1467,24 @@ struct correlateStrangeness { if (!mcParticle.isPhysicalPrimary()) { continue; } - Double_t geta = mcParticle.eta(); - Double_t gpt = mcParticle.pt(); + double geta = mcParticle.eta(); + double gpt = mcParticle.pt(); if (std::abs(mcParticle.pdgCode()) == 211 || std::abs(mcParticle.pdgCode()) == 321 || std::abs(mcParticle.pdgCode()) == 2212 || std::abs(mcParticle.pdgCode()) == 11 || std::abs(mcParticle.pdgCode()) == 13) histos.fill(HIST("GeneratedWithPV/hTrigger"), gpt, geta); static_for<0, 7>([&](auto i) { - constexpr int index = i.value; + constexpr int Index = i.value; if (i == 0 || i == 7) { - if (std::abs(mcParticle.pdgCode()) == pdgCodes[i]) { - histos.fill(HIST("GeneratedWithPV/h") + HIST(particlenames[index]), gpt, geta); + if (std::abs(mcParticle.pdgCode()) == kPdgCodes[i]) { + histos.fill(HIST("GeneratedWithPV/h") + HIST(kParticlenames[Index]), gpt, geta); if (std::abs(mcParticle.y()) < 0.5) - histos.fill(HIST("GeneratedWithPV/h") + HIST(particlenames[index]) + HIST("_MidYVsMult"), gpt, bestCollisionFT0Mpercentile); + histos.fill(HIST("GeneratedWithPV/h") + HIST(kParticlenames[Index]) + HIST("_MidYVsMult"), gpt, bestCollisionFT0Mpercentile); } } else { - if (mcParticle.pdgCode() == pdgCodes[i]) { - histos.fill(HIST("GeneratedWithPV/h") + HIST(particlenames[index]), gpt, geta); + if (mcParticle.pdgCode() == kPdgCodes[i]) { + histos.fill(HIST("GeneratedWithPV/h") + HIST(kParticlenames[Index]), gpt, geta); if (std::abs(mcParticle.y()) < 0.5) - histos.fill(HIST("GeneratedWithPV/h") + HIST(particlenames[index]) + HIST("_MidYVsMult"), gpt, bestCollisionFT0Mpercentile); + histos.fill(HIST("GeneratedWithPV/h") + HIST(kParticlenames[Index]) + HIST("_MidYVsMult"), gpt, bestCollisionFT0Mpercentile); } } }); @@ -1490,11 +1505,11 @@ struct correlateStrangeness { std::vector omegaPlusIndices; for (auto const& mcParticle : mcParticles) { - Double_t geta = mcParticle.eta(); + double geta = mcParticle.eta(); if (std::abs(geta) > 0.8f) { continue; } - Double_t gpt = mcParticle.pt(); + double gpt = mcParticle.pt(); if (std::abs(mcParticle.pdgCode()) == 211 || std::abs(mcParticle.pdgCode()) == 321 || std::abs(mcParticle.pdgCode()) == 2212 || std::abs(mcParticle.pdgCode()) == 11 || std::abs(mcParticle.pdgCode()) == 13) { if (!doTriggPhysicalPrimary || mcParticle.isPhysicalPrimary()) { histos.fill(HIST("hClosureQAPtTrigger"), gpt, 0.0f); // step 1: no event selection whatsoever @@ -1517,7 +1532,7 @@ struct correlateStrangeness { int biggestNContribs = -1; uint32_t bestCollisionTriggerPresenceMap = 0; - for (auto& recCollision : recCollisions) { + for (auto const& recCollision : recCollisions) { if (biggestNContribs < recCollision.numContrib()) { biggestNContribs = recCollision.numContrib(); bestCollisionFT0Mpercentile = recCollision.centFT0M(); @@ -1530,7 +1545,7 @@ struct correlateStrangeness { } // ________________________________________________ // skip if desired trigger not found - if (triggerPresenceMap.size() > 0 && !bitcheck(bestCollisionTriggerPresenceMap, triggerBinToSelect)) { + if (triggerPresenceMap.size() > 0 && !BIT_CHECK(bestCollisionTriggerPresenceMap, triggerBinToSelect)) { return; } @@ -1549,11 +1564,11 @@ struct correlateStrangeness { histos.fill(HIST("hClosureTestEventCounter"), 1.5f); for (auto const& mcParticle : mcParticles) { - Double_t geta = mcParticle.eta(); + double geta = mcParticle.eta(); if (std::abs(geta) > 0.8f) { continue; } - Double_t gpt = mcParticle.pt(); + double gpt = mcParticle.pt(); if (std::abs(mcParticle.pdgCode()) == 211 || std::abs(mcParticle.pdgCode()) == 321 || std::abs(mcParticle.pdgCode()) == 2212 || std::abs(mcParticle.pdgCode()) == 11 || std::abs(mcParticle.pdgCode()) == 13) { if (!doTriggPhysicalPrimary || mcParticle.isPhysicalPrimary()) { histos.fill(HIST("hClosureQAPtTrigger"), gpt, 1.0f); // step 2: after event selection @@ -1570,9 +1585,9 @@ struct correlateStrangeness { int iteratorNum = -1; for (auto const& mcParticle : mcParticles) { iteratorNum = iteratorNum + 1; - Double_t geta = mcParticle.eta(); - Double_t gpt = mcParticle.pt(); - Double_t gphi = mcParticle.phi(); + double geta = mcParticle.eta(); + double gpt = mcParticle.pt(); + double gphi = mcParticle.phi(); if (std::abs(geta) > 0.8f) { continue; } @@ -1633,21 +1648,21 @@ struct correlateStrangeness { if (triggerParticle.pt() > axisRanges[3][1] || triggerParticle.pt() < axisRanges[3][0]) { continue; } - Double_t getatrigger = triggerParticle.eta(); - Double_t gphitrigger = triggerParticle.phi(); - Double_t pttrigger = triggerParticle.pt(); + double getatrigger = triggerParticle.eta(); + double gphitrigger = triggerParticle.phi(); + double pttrigger = triggerParticle.pt(); auto const& mother = triggerParticle.mothers_first_as(); auto globalIndex = mother.globalIndex(); static_for<0, 7>([&](auto i) { // associated loop - constexpr int index = i.value; - for (std::size_t iassoc = 0; iassoc < associatedIndices[index].size(); iassoc++) { - auto assocParticle = mcParticles.iteratorAt(associatedIndices[index][iassoc]); - if (triggerIndices[iTrigger] != associatedIndices[index][iassoc] && globalIndex != assocParticle.globalIndex()) { // avoid self - Double_t getaassoc = assocParticle.eta(); - Double_t gphiassoc = assocParticle.phi(); - Double_t ptassoc = assocParticle.pt(); - Double_t deltaphi = ComputeDeltaPhi(gphitrigger, gphiassoc); - Double_t deltaeta = getatrigger - getaassoc; + constexpr int Index = i.value; + for (std::size_t iassoc = 0; iassoc < associatedIndices[Index].size(); iassoc++) { + auto assocParticle = mcParticles.iteratorAt(associatedIndices[Index][iassoc]); + if (triggerIndices[iTrigger] != associatedIndices[Index][iassoc] && globalIndex != assocParticle.globalIndex()) { // avoid self + double getaassoc = assocParticle.eta(); + double gphiassoc = assocParticle.phi(); + double ptassoc = assocParticle.pt(); + double deltaphi = computeDeltaPhi(gphitrigger, gphiassoc); + double deltaeta = getatrigger - getaassoc; // skip if basic ranges not met if (deltaphi < axisRanges[0][0] || deltaphi > axisRanges[0][1]) @@ -1656,31 +1671,31 @@ struct correlateStrangeness { continue; if (ptassoc < axisRanges[2][0] || ptassoc > axisRanges[2][1]) continue; - if (bitcheck(doCorrelation, i)) - histos.fill(HIST("ClosureTest/sameEvent/") + HIST(particlenames[index]), ComputeDeltaPhi(gphitrigger, gphiassoc), deltaeta, ptassoc, pttrigger, bestCollisionVtxZ, bestCollisionFT0Mpercentile); + if (BIT_CHECK(doCorrelation, i)) + histos.fill(HIST("ClosureTest/sameEvent/") + HIST(kParticlenames[Index]), computeDeltaPhi(gphitrigger, gphiassoc), deltaeta, ptassoc, pttrigger, bestCollisionVtxZ, bestCollisionFT0Mpercentile); } } }); } } - PROCESS_SWITCH(correlateStrangeness, processSelectEventWithTrigger, "Select events with trigger only", true); - PROCESS_SWITCH(correlateStrangeness, processSameEventHV0s, "Process same events, h-V0s", true); - PROCESS_SWITCH(correlateStrangeness, processSameEventHCascades, "Process same events, h-Cascades", true); - PROCESS_SWITCH(correlateStrangeness, processSameEventHPions, "Process same events, h-Pion", true); - PROCESS_SWITCH(correlateStrangeness, processSameEventHHadrons, "Process same events, h-h", true); + PROCESS_SWITCH(HStrangeCorrelation, processSelectEventWithTrigger, "Select events with trigger only", true); + PROCESS_SWITCH(HStrangeCorrelation, processSameEventHV0s, "Process same events, h-V0s", true); + PROCESS_SWITCH(HStrangeCorrelation, processSameEventHCascades, "Process same events, h-Cascades", true); + PROCESS_SWITCH(HStrangeCorrelation, processSameEventHPions, "Process same events, h-Pion", true); + PROCESS_SWITCH(HStrangeCorrelation, processSameEventHHadrons, "Process same events, h-h", true); - PROCESS_SWITCH(correlateStrangeness, processMixedEventHV0s, "Process mixed events, h-V0s", true); - PROCESS_SWITCH(correlateStrangeness, processMixedEventHCascades, "Process mixed events, h-Cascades", true); - PROCESS_SWITCH(correlateStrangeness, processMixedEventHPions, "Process mixed events, h-Pion", true); - PROCESS_SWITCH(correlateStrangeness, processMixedEventHHadrons, "Process mixed events, h-h", true); + PROCESS_SWITCH(HStrangeCorrelation, processMixedEventHV0s, "Process mixed events, h-V0s", true); + PROCESS_SWITCH(HStrangeCorrelation, processMixedEventHCascades, "Process mixed events, h-Cascades", true); + PROCESS_SWITCH(HStrangeCorrelation, processMixedEventHPions, "Process mixed events, h-Pion", true); + PROCESS_SWITCH(HStrangeCorrelation, processMixedEventHHadrons, "Process mixed events, h-h", true); - PROCESS_SWITCH(correlateStrangeness, processMCGenerated, "Process MC generated", false); - PROCESS_SWITCH(correlateStrangeness, processClosureTest, "Process Closure Test", false); + PROCESS_SWITCH(HStrangeCorrelation, processMCGenerated, "Process MC generated", false); + PROCESS_SWITCH(HStrangeCorrelation, processClosureTest, "Process Closure Test", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc)}; + adaptAnalysisTask(cfgc)}; } From 843fc1170025474914c6cb3d3c611d2a04cf9994 Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Thu, 20 Feb 2025 17:16:11 +0100 Subject: [PATCH 0350/1650] [PWGCF] Add jFlucEfficiencyTask for efficiency calculation in JCorran (#10066) --- PWGCF/JCorran/Tasks/CMakeLists.txt | 5 + PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx | 323 ++++++++++++++++++++ 2 files changed, 328 insertions(+) create mode 100644 PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx diff --git a/PWGCF/JCorran/Tasks/CMakeLists.txt b/PWGCF/JCorran/Tasks/CMakeLists.txt index 31fc41e4c6d..465083509d0 100644 --- a/PWGCF/JCorran/Tasks/CMakeLists.txt +++ b/PWGCF/JCorran/Tasks/CMakeLists.txt @@ -38,3 +38,8 @@ o2physics_add_dpl_workflow(epdzeroflow-analysis SOURCES jEPDzeroFlowAnalysis.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(j-fluc-efficiency-task + SOURCES jFlucEfficiencyTask.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::JCorran + COMPONENT_NAME Analysis) diff --git a/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx b/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx new file mode 100644 index 00000000000..6a65a5d5fd0 --- /dev/null +++ b/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx @@ -0,0 +1,323 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// +/// \file jFlucEfficiencyTask.cxx +/// \brief Task to calculate the efficiency of the cf-derived tracks/particles +/// \author DongJo Kim, Jasper Parkkila, Bong-Hwi Lim (djkim@cern.ch, jparkkil@cern.ch, bong-hwi.lim@cern.ch) +/// \since March 2024 + +#include +#include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/runDataProcessing.h" +#include "Common/Core/TrackSelection.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "PWGCF/DataModel/CorrelationsDerived.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +struct JFlucEfficiencyTask { + // Add the pT binning array as a static member + static constexpr std::array PttJacek = { + 0.0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, + 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, + 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, + 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, + 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 8.0, 9.0, 10.0, + 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 18.0, 20.0, 22.0, 24.0, + 26.0, 28.0, 30.0, 32.0, 34.0, 36.0, 40.0, 45.0, 50.0, 60.0, + 70.0, 80.0, 90.0, 100.0, 110.0, 120.0, 130.0, 140.0, 150.0, 160.0, + 170.0, 180.0, 190.0, 200.0, 210.0, 220.0, 230.0, 240.0, 250.0, 260.0, + 270.0, 280.0, 290.0, 300.0}; + + // Update the axisPt configuration with proper vector initialization + ConfigurableAxis axisPt{"axisPt", std::vector(PttJacek.begin(), PttJacek.end()), "pT axis"}; + + // Configurable for track selection + Configurable cfgPtMin{"cfgPtMin", 0.2f, "Minimum transverse momentum"}; + Configurable cfgPtMax{"cfgPtMax", 300.0f, "Maximum transverse momentum"}; + Configurable cfgEtaMin{"cfgEtaMin", -1.0f, "Minimum pseudorapidity"}; + Configurable cfgEtaMax{"cfgEtaMax", 1.0f, "Maximum pseudorapidity"}; + Configurable cfgCutVertex{"cfgCutVertex", 10.0f, "Vertex cut"}; + Configurable cfgCentMin{"cfgCentMin", 0.0f, "Min centrality"}; + Configurable cfgCentMax{"cfgCentMax", 100.0f, "Max centrality"}; + Configurable cfgTrackBitMask{"cfgTrackBitMask", 0, "BitMask for track selection systematics"}; + + // Configurable axes + ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100}, "multiplicity / centrality axis"}; + + // Filter declarations + Filter cfCollisionFilter = (nabs(aod::collision::posZ) < cfgCutVertex) && + (aod::cfcollision::multiplicity > cfgCentMin) && + (aod::cfcollision::multiplicity < cfgCentMax); + Filter cfMCCollisionFilter = (nabs(aod::mccollision::posZ) < cfgCutVertex) && + (aod::cfmccollision::multiplicity > cfgCentMin) && + (aod::cfmccollision::multiplicity < cfgCentMax); + Filter cfMCParticleFilter = (aod::cfmcparticle::pt >= cfgPtMin) && + (aod::cfmcparticle::pt <= cfgPtMax) && + (aod::cfmcparticle::eta >= cfgEtaMin) && + (aod::cfmcparticle::eta <= cfgEtaMax); + Filter cfTrackFilter = (aod::cftrack::pt >= cfgPtMin) && + (aod::cftrack::pt <= cfgPtMax) && + (aod::cftrack::eta >= cfgEtaMin) && + (aod::cftrack::eta <= cfgEtaMax) && + ((aod::track::trackType & (uint8_t)cfgTrackBitMask) == (uint8_t)cfgTrackBitMask); + + Filter trackFilter = (nabs(aod::track::eta) < cfgEtaMax) && + (aod::track::pt > cfgPtMin) && + ((requireGlobalTrackInFilter()) || + (aod::track::isGlobalTrackSDD == (uint8_t) true)); + + Configurable cfgEfficiencyFromData{"cfgEfficiencyFromData", false, "Calculate efficiency using data events as reference"}; + Configurable cfgVerbosity{"cfgVerbosity", 0, "Verbosity level"}; + + // Histogram Registry + HistogramRegistry registry{ + "registry", + {{"hEventCounterMC", "Event counter MC;Counter;Counts", {HistType::kTH1F, {{3, -0.5, 2.5}}}}, + {"hEventCounterReco", "Event counter Reco;Counter;Counts", {HistType::kTH1F, {{3, -0.5, 2.5}}}}, + {"hZVertexMC", "MC Z vertex distribution;Z vertex (cm);Centrality (%)", {HistType::kTH2F, {{200, -20, 20}, {axisMultiplicity}}}}, + {"hZVertexReco", "Reconstructed Z vertex distribution;Z vertex (cm);Centrality (%)", {HistType::kTH2F, {{200, -20, 20}, {axisMultiplicity}}}}, + {"hZVertexCorrelation", "Z vertex correlation;MC Z vertex (cm);Reco Z vertex (cm)", {HistType::kTH2F, {{200, -20, 20}, {200, -20, 20}}}}}}; + + // Configurable for debugging + Configurable debugMode{"debugMode", false, "Debug mode"}; + + void init(InitContext const&) + { + if (debugMode) { + LOGF(info, "Initializing JFlucEfficiencyTask"); + } + + if (doprocessMC) { + registry.add("hPtGen", "Generated p_{T} (all);p_{T} (GeV/c);Centrality (%);Counts", + o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); + registry.add("hEtaGen", "Generated #eta (all);#eta;Centrality (%);Counts", + o2::framework::HistType::kTH2F, {AxisSpec(100, -1, 1), AxisSpec(axisMultiplicity)}); + registry.add("hPtGenPos", "Generated p_{T} (positive);p_{T} (GeV/c);Centrality (%);Counts", + o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); + + registry.add("hPtGenNeg", "Generated p_{T} (negative);p_{T} (GeV/c);Centrality (%);Counts", + o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); + } + + if (doprocessData) { + registry.add("hPtRec", "Reconstructed p_{T} (all);p_{T} (GeV/c);Centrality (%);Counts", + o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); + + registry.add("hEtaRec", "Reconstructed #eta (all);#eta;Centrality (%);Counts", + o2::framework::HistType::kTH2F, {AxisSpec(100, -1, 1), AxisSpec(axisMultiplicity)}); + + registry.add("hPtRecPos", "Reconstructed p_{T} (positive);p_{T} (GeV/c);Centrality (%);Counts", + o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); + + registry.add("hPtRecNeg", "Reconstructed p_{T} (negative);p_{T} (GeV/c);Centrality (%);Counts", + o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); + } + + if (cfgEfficiencyFromData) { + registry.add("hPtGenData", "Generated p_{T} from data events (all);p_{T} (GeV/c);Centrality (%);Counts", + {HistType::kTH2F, {axisPt, axisMultiplicity}}); + registry.add("hEtaGenData", "Generated #eta from data events (all);#eta;Centrality (%);Counts", + {HistType::kTH2F, {AxisSpec(100, -1, 1), axisMultiplicity}}); + registry.add("hPtGenDataPos", "Generated p_{T} from data events (positive);p_{T} (GeV/c);Centrality (%);Counts", + {HistType::kTH2F, {axisPt, axisMultiplicity}}); + registry.add("hPtGenDataNeg", "Generated p_{T} from data events (negative);p_{T} (GeV/c);Centrality (%);Counts", + {HistType::kTH2F, {axisPt, axisMultiplicity}}); + registry.add("hPtRecData", "Reconstructed p_{T} (all);p_{T} (GeV/c);Centrality (%);Counts", + o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); + registry.add("hEtaRecData", "Reconstructed #eta (all);#eta;Centrality (%);Counts", + o2::framework::HistType::kTH2F, {AxisSpec(100, -1, 1), AxisSpec(axisMultiplicity)}); + registry.add("hPtRecDataPos", "Reconstructed p_{T} (positive);p_{T} (GeV/c);Centrality (%);Counts", + o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); + registry.add("hPtRecDataNeg", "Reconstructed p_{T} (negative);p_{T} (GeV/c);Centrality (%);Counts", + o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); + } + + // Initialize histogram labels + auto h1 = registry.get(HIST("hEventCounterMC")); + auto h2 = registry.get(HIST("hEventCounterReco")); + + if (h1 && h2) { + h1->GetXaxis()->SetBinLabel(1, "All MC Events"); + h1->GetXaxis()->SetBinLabel(2, "Selected MC Events"); + h1->GetXaxis()->SetBinLabel(3, "Analyzed MC Events"); + + h2->GetXaxis()->SetBinLabel(1, "All Reco Events"); + h2->GetXaxis()->SetBinLabel(2, "Selected Reco Events"); + h2->GetXaxis()->SetBinLabel(3, "Analyzed Reco Events"); + } else { + LOGF(error, "Failed to get histograms from registry"); + } + } + + void processMC(soa::Filtered::iterator const& mcCollision, soa::Filtered const& mcParticles) + { + float centrality = mcCollision.multiplicity(); + + for (const auto& particle : mcParticles) { + if (!particle.isPhysicalPrimary()) { + continue; + } + + registry.fill(HIST("hPtGen"), particle.pt(), centrality); + registry.fill(HIST("hEtaGen"), particle.eta(), centrality); + + if (particle.sign() > 0) { // Positive particles + registry.fill(HIST("hPtGenPos"), particle.pt(), centrality); + } else if (particle.sign() < 0) { // Negative particles + registry.fill(HIST("hPtGenNeg"), particle.pt(), centrality); + } + } + } + + void processData(soa::Filtered::iterator const& cfCollision, soa::Filtered const& cfTracks) + { + float centrality = cfCollision.multiplicity(); + + if (centrality < cfgCentMin || centrality > cfgCentMax) { + return; + } + + for (const auto& track : cfTracks) { + registry.fill(HIST("hPtRec"), track.pt(), centrality); + registry.fill(HIST("hEtaRec"), track.eta(), centrality); + + if (track.sign() > 0) { // Positive tracks + registry.fill(HIST("hPtRecPos"), track.pt(), centrality); + } else if (track.sign() < 0) { // Negative tracks + registry.fill(HIST("hPtRecNeg"), track.pt(), centrality); + } + } + } + + template + void fillQA(const TCollision& /*collision*/, float multiplicity, const TTracks& tracks) + { + registry.fill(HIST("multiplicity"), multiplicity); + for (const auto& track : tracks) { + registry.fill(HIST("yields"), multiplicity, track.pt(), track.eta()); + registry.fill(HIST("etaphi"), track.eta(), track.phi()); + } + } + + // NOTE SmallGroups includes soa::Filtered always + Preslice perCollision = aod::cftrack::cfCollisionId; + void processEfficiency(soa::Filtered::iterator const& mcCollision, + aod::CFMcParticles const& mcParticles, + soa::SmallGroups const& collisions, + aod::CFTracksWithLabel const& tracks) + { + try { + // Count MC events and fill MC z-vertex with centrality + registry.fill(HIST("hEventCounterMC"), 0); + registry.fill(HIST("hZVertexMC"), mcCollision.posZ(), mcCollision.multiplicity()); + + if (debugMode) { + LOGF(info, "Processing MC collision %d at z = %.3f", mcCollision.globalIndex(), mcCollision.posZ()); + } + + // Fill MC particle histograms + for (const auto& mcParticle : mcParticles) { + if (!mcParticle.isPhysicalPrimary()) + continue; + + // Fill generated particle histograms + registry.fill(HIST("hPtGen"), mcParticle.pt(), mcCollision.multiplicity()); + registry.fill(HIST("hEtaGen"), mcParticle.eta(), mcCollision.multiplicity()); + + if (mcParticle.sign() > 0) { + registry.fill(HIST("hPtGenPos"), mcParticle.pt(), mcCollision.multiplicity()); + } else if (mcParticle.sign() < 0) { + registry.fill(HIST("hPtGenNeg"), mcParticle.pt(), mcCollision.multiplicity()); + } + + if (cfgEfficiencyFromData) { + registry.fill(HIST("hPtGenData"), mcParticle.pt(), mcCollision.multiplicity()); + registry.fill(HIST("hEtaGenData"), mcParticle.eta(), mcCollision.multiplicity()); + if (mcParticle.sign() > 0) { + registry.fill(HIST("hPtGenDataPos"), mcParticle.pt(), mcCollision.multiplicity()); + } else if (mcParticle.sign() < 0) { + registry.fill(HIST("hPtGenDataNeg"), mcParticle.pt(), mcCollision.multiplicity()); + } + } + } + + registry.fill(HIST("hEventCounterMC"), 1); + + // Check reconstructed collisions + if (collisions.size() == 0) { + if (debugMode) { + LOGF(info, "No reconstructed collisions found for MC collision %d", mcCollision.globalIndex()); + } + return; + } + + // Process reconstructed events + for (const auto& collision : collisions) { + registry.fill(HIST("hEventCounterReco"), 0); + registry.fill(HIST("hZVertexReco"), collision.posZ(), collision.multiplicity()); + registry.fill(HIST("hZVertexCorrelation"), mcCollision.posZ(), collision.posZ()); + + if (debugMode) { + LOGF(info, "Processing reconstructed collision %d at z = %.3f", + collision.globalIndex(), collision.posZ()); + } + + // Fill track histograms + for (const auto& track : tracks) { + if (!track.has_cfMCParticle()) { + if (debugMode) { + LOGF(debug, "Track without MC particle found"); + } + continue; + } + + registry.fill(HIST("hPtRecData"), track.pt(), collision.multiplicity()); + registry.fill(HIST("hEtaRecData"), track.eta(), collision.multiplicity()); + + if (track.sign() > 0) { + registry.fill(HIST("hPtRecDataPos"), track.pt(), collision.multiplicity()); + } else if (track.sign() < 0) { + registry.fill(HIST("hPtRecDatfaNeg"), track.pt(), collision.multiplicity()); + } + } + + // Count selected and analyzed events + registry.fill(HIST("hEventCounterReco"), 1); + registry.fill(HIST("hEventCounterReco"), 2); + } + + registry.fill(HIST("hEventCounterMC"), 2); + + } catch (const std::exception& e) { + LOGF(error, "Exception caught in processEfficiency: %s", e.what()); + } catch (...) { + LOGF(error, "Unknown exception caught in processEfficiency"); + } + } + + PROCESS_SWITCH(JFlucEfficiencyTask, processMC, "Process MC only", false); + PROCESS_SWITCH(JFlucEfficiencyTask, processData, "Process data only", false); + PROCESS_SWITCH(JFlucEfficiencyTask, processEfficiency, "Process efficiency task", true); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc)}; +} From 146e0e89065cbc1f4d120862715943916c19c66a Mon Sep 17 00:00:00 2001 From: Stefano Cannito <143754257+scannito@users.noreply.github.com> Date: Thu, 20 Feb 2025 18:08:49 +0100 Subject: [PATCH 0351/1650] [PWGLF] Explicitly set minpt for phi and k0s (#10112) --- .../Tasks/Strangeness/phik0shortanalysis.cxx | 86 +++++++++++-------- 1 file changed, 48 insertions(+), 38 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx index 949a178e6ef..572c5fb45a8 100644 --- a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx @@ -13,15 +13,6 @@ /// \brief Analysis task for the Phi and K0S rapidity correlations analysis /// \author Stefano Cannito (stefano.cannito@cern.ch) -#include - -#include -#include -#include -#include -#include -#include - #include #include #include @@ -35,6 +26,14 @@ #include #include +#include +#include +#include +#include +#include +#include +#include + #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Common/DataModel/EventSelection.h" @@ -85,7 +84,7 @@ struct Phik0shortanalysis { // Configurables for track selection (not necessarily common for trigger and the two associated particles) struct : ConfigurableGroup { - Configurable cfgCutCharge{"cfgCutCharge", 0.0, "Cut on charge"}; + Configurable cfgCutCharge{"cfgCutCharge", 0.0f, "Cut on charge"}; Configurable cfgPrimaryTrack{"cfgPrimaryTrack", false, "Primary track selection"}; Configurable cfgGlobalWoDCATrack{"cfgGlobalWoDCATrack", true, "Global track selection without DCA"}; Configurable cfgPVContributor{"cfgPVContributor", true, "PV contributor track selection"}; @@ -97,10 +96,10 @@ struct Phik0shortanalysis { Configurable etaMax{"etaMax", 0.8f, "eta max"}; Configurable isNoTOF{"isNoTOF", false, "isNoTOF"}; - Configurable nSigmaCutTPCKa{"nSigmaCutTPCKa", 3.0, "Value of the TPC Nsigma cut for Kaons"}; - Configurable nSigmaCutCombinedKa{"nSigmaCutCombinedKa", 3.0, "Value of the TOF Nsigma cut for Kaons"}; + Configurable nSigmaCutTPCKa{"nSigmaCutTPCKa", 3.0f, "Value of the TPC Nsigma cut for Kaons"}; + Configurable nSigmaCutCombinedKa{"nSigmaCutCombinedKa", 3.0f, "Value of the TOF Nsigma cut for Kaons"}; - Configurable nSigmaCutTPCPion{"nSigmaCutTPCPion", 4.0, "Value of the TPC Nsigma cut for Pions"}; + Configurable nSigmaCutTPCPion{"nSigmaCutTPCPion", 4.0f, "Value of the TPC Nsigma cut for Pions"}; Configurable cMinPionPtcut{"cMinPionPtcut", 0.3f, "Track minimum pt cut"}; Configurable minTPCnClsFound{"minTPCnClsFound", 70, "min number of found TPC clusters"}; Configurable minNCrossedRowsTPC{"minNCrossedRowsTPC", 80, "min number of TPC crossed rows"}; @@ -111,31 +110,33 @@ struct Phik0shortanalysis { // Configurables on phi pT bins Configurable> binspTPhi{"binspTPhi", {0.4, 0.8, 1.4, 2.0, 2.8, 4.0, 6.0, 10.0}, "pT bin limits for Phi"}; + Configurable minPhiPt{"minPhiPt", 0.4f, "Minimum pT for Phi"}; // Configurables on phi mass Configurable nBinsMPhi{"nBinsMPhi", 13, "N bins in cfgmassPhiaxis"}; - Configurable lowMPhi{"lowMPhi", 1.0095, "Upper limits on Phi mass for signal extraction"}; - Configurable upMPhi{"upMPhi", 1.029, "Upper limits on Phi mass for signal extraction"}; + Configurable lowMPhi{"lowMPhi", 1.0095f, "Upper limits on Phi mass for signal extraction"}; + Configurable upMPhi{"upMPhi", 1.029f, "Upper limits on Phi mass for signal extraction"}; // Configurables for V0 selection struct : ConfigurableGroup { - Configurable v0SettingCosPA{"v0SettingCosPA", 0.98, "V0 CosPA"}; - Configurable v0SettingRadius{"v0SettingRadius", 0.5, "v0radius"}; - Configurable v0SettingDCAV0Dau{"v0SettingDCAV0Dau", 1, "DCA V0 Daughters"}; - Configurable v0SettingDCAPosToPV{"v0SettingDCAPosToPV", 0.06, "DCA Pos To PV"}; - Configurable v0SettingDCANegToPV{"v0SettingDCANegToPV", 0.06, "DCA Neg To PV"}; + Configurable v0SettingCosPA{"v0SettingCosPA", 0.98f, "V0 CosPA"}; + Configurable v0SettingRadius{"v0SettingRadius", 0.5f, "v0radius"}; + Configurable v0SettingDCAV0Dau{"v0SettingDCAV0Dau", 1.0f, "DCA V0 Daughters"}; + Configurable v0SettingDCAPosToPV{"v0SettingDCAPosToPV", 0.06f, "DCA Pos To PV"}; + Configurable v0SettingDCANegToPV{"v0SettingDCANegToPV", 0.06f, "DCA Neg To PV"}; + Configurable v0SettingMinPt{"v0SettingMinPt", 0.1f, "V0 min pt"}; Configurable cfgisV0ForData{"cfgisV0ForData", true, "isV0ForData"}; Configurable cfgFurtherV0Selection{"cfgFurtherV0Selection", false, "Further V0 selection"}; Configurable ctauK0s{"ctauK0s", 20.0f, "C tau K0s(cm)"}; - Configurable paramArmenterosCut{"paramArmenterosCut", 0.2, "parameter Armenteros Cut"}; - Configurable v0rejK0s{"v0rejK0s", 0.005, "V0 rej K0s"}; + Configurable paramArmenterosCut{"paramArmenterosCut", 0.2f, "parameter Armenteros Cut"}; + Configurable v0rejK0s{"v0rejK0s", 0.005f, "V0 rej K0s"}; } v0Configs; // Configurables on K0S mass - Configurable lowMK0S{"lowMK0S", 0.48, "Lower limit on K0Short mass"}; - Configurable upMK0S{"upMK0S", 0.52, "Upper limit on K0Short mass"}; + Configurable lowMK0S{"lowMK0S", 0.48f, "Lower limit on K0Short mass"}; + Configurable upMK0S{"upMK0S", 0.52f, "Upper limit on K0Short mass"}; // Configurable on K0S pT bins Configurable> binspTK0S{"binspTK0S", {0.1, 0.8, 1.2, 1.6, 2.0, 2.5, 3.0, 4.0, 6.0}, "pT bin limits for K0S"}; @@ -159,7 +160,6 @@ struct Phik0shortanalysis { Configurable cfgisGenMCForClosure{"cfgisGenMCForClosure", false, "GenMC for Closure"}; // Configurables to choose the filling method - Configurable doLoadPurities{"doLoadPurities", false, "Load purities"}; Configurable fillMethodMultipleWeights{"fillMethodMultipleWeights", true, "Fill method Multiple Weights"}; Configurable fillMethodSingleWeight{"fillMethodSingleWeight", false, "Fill method Single Weight"}; @@ -215,7 +215,7 @@ struct Phik0shortanalysis { Service ccdb; // Set of functions for phi purity - std::vector> phiPurityFunctions; + std::vector> phiPurityFunctions = std::vector>(10, std::vector(7, nullptr)); void init(InitContext&) { @@ -236,12 +236,13 @@ struct Phik0shortanalysis { // Histograms // Number of events per selection - dataEventHist.add("hEventSelection", "hEventSelection", kTH1F, {{5, -0.5f, 4.5f}}); + dataEventHist.add("hEventSelection", "hEventSelection", kTH1F, {{6, -0.5f, 5.5f}}); dataEventHist.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(1, "All collisions"); dataEventHist.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(2, "sel8 cut"); dataEventHist.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(3, "posZ cut"); dataEventHist.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(4, "INEL>0 cut"); dataEventHist.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(5, "With at least a #phi cand"); + dataEventHist.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(6, "With at least a #phi"); // Event information dataEventHist.add("hVertexZ", "hVertexZ", kTH1F, {vertexZAxis}); @@ -249,7 +250,7 @@ struct Phik0shortanalysis { dataEventHist.add("hMultiplicityPercentWithPhi", "Multiplicity Percentile in Events with a Phi Candidate", kTH1F, {multAxis}); // Number of MC events per selection for Rec and Gen - mcEventHist.add("hRecMCEventSelection", "hRecMCEventSelection", kTH1F, {{8, -0.5f, 7.5f}}); + mcEventHist.add("hRecMCEventSelection", "hRecMCEventSelection", kTH1F, {{9, -0.5f, 8.5f}}); mcEventHist.get(HIST("hRecMCEventSelection"))->GetXaxis()->SetBinLabel(1, "All collisions"); mcEventHist.get(HIST("hRecMCEventSelection"))->GetXaxis()->SetBinLabel(2, "kIsTriggerTVX"); mcEventHist.get(HIST("hRecMCEventSelection"))->GetXaxis()->SetBinLabel(3, "kNoTimeFrameBorder"); @@ -257,7 +258,8 @@ struct Phik0shortanalysis { mcEventHist.get(HIST("hRecMCEventSelection"))->GetXaxis()->SetBinLabel(5, "posZ cut"); mcEventHist.get(HIST("hRecMCEventSelection"))->GetXaxis()->SetBinLabel(6, "INEL>0 cut"); mcEventHist.get(HIST("hRecMCEventSelection"))->GetXaxis()->SetBinLabel(7, "With at least a gen coll"); - mcEventHist.get(HIST("hRecMCEventSelection"))->GetXaxis()->SetBinLabel(8, "With at least a #phi"); + mcEventHist.get(HIST("hRecMCEventSelection"))->GetXaxis()->SetBinLabel(8, "With at least a #phi cand"); + mcEventHist.get(HIST("hRecMCEventSelection"))->GetXaxis()->SetBinLabel(9, "With at least a #phi"); mcEventHist.add("hGenMCEventSelection", "hGenMCEventSelection", kTH1F, {{5, -0.5f, 4.5f}}); mcEventHist.get(HIST("hGenMCEventSelection"))->GetXaxis()->SetBinLabel(1, "All collisions"); @@ -473,7 +475,7 @@ struct Phik0shortanalysis { mcPionHist.add("h3PiRapidityGenMC", "Rapidity for Pion for GenMC", kTH3F, {binnedmultAxis, binnedptPiAxis, yAxis}); // Initialize CCDB only if purity is requested in the task - if (doLoadPurities) { + if (fillMethodSingleWeight) { ccdb->setURL(ccdbUrl); ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); @@ -563,6 +565,8 @@ struct Phik0shortanalysis { return false; if (v0.v0radius() < v0Configs.v0SettingRadius) return false; + if (v0.pt() < v0Configs.v0SettingMinPt) + return false; if (v0Configs.cfgisV0ForData) { if (std::abs(daughter1.tpcNSigmaPi()) > trackConfigs.nSigmaCutTPCPion) @@ -871,6 +875,8 @@ struct Phik0shortanalysis { continue; // condition to avoid double counting of pair ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa); + if (recPhi.Pt() < minPhiPt) + continue; if (std::abs(recPhi.Rapidity()) > cfgYAcceptance) continue; @@ -1010,10 +1016,10 @@ struct Phik0shortanalysis { continue; // condition to avoid double counting of pair ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa); - + if (recPhi.Pt() < minPhiPt) + continue; if (recPhi.M() < lowMPhi || recPhi.M() > upMPhi) continue; - if (std::abs(recPhi.Rapidity()) > cfgYAcceptance) continue; @@ -1099,10 +1105,10 @@ struct Phik0shortanalysis { continue; // condition to avoid double counting of pair ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa); - + if (recPhi.Pt() < minPhiPt) + continue; if (recPhi.M() < lowMPhi || recPhi.M() > upMPhi) continue; - if (std::abs(recPhi.Rapidity()) > cfgYAcceptance) continue; @@ -1207,6 +1213,8 @@ struct Phik0shortanalysis { continue; ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa); + if (recPhi.Pt() < minPhiPt) + continue; mcPhiHist.fill(HIST("h3PhiRapiditySmearing"), genmultiplicity, recPhi.Rapidity(), mcMotherPhi.y()); @@ -1521,6 +1529,8 @@ struct Phik0shortanalysis { continue; // condition to avoid double counting of pair ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa); + if (recPhi.Pt() < minPhiPt) + continue; if (std::abs(recPhi.Rapidity()) > cfgYAcceptance) continue; @@ -1699,10 +1709,10 @@ struct Phik0shortanalysis { } ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa); - + if (recPhi.Pt() < minPhiPt) + continue; if (recPhi.M() < lowMPhi || recPhi.M() > upMPhi) continue; - if (std::abs(recPhi.Rapidity()) > cfgYAcceptance) continue; @@ -1823,10 +1833,10 @@ struct Phik0shortanalysis { } ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa); - + if (recPhi.Pt() < minPhiPt) + continue; if (recPhi.M() < lowMPhi || recPhi.M() > upMPhi) continue; - if (std::abs(recPhi.Rapidity()) > cfgYAcceptance) continue; From 13ab6f57600f47bee99b03f84dab3dcadb211b93 Mon Sep 17 00:00:00 2001 From: Rafael Manhart <56776511+RafRaf11@users.noreply.github.com> Date: Thu, 20 Feb 2025 18:16:02 +0100 Subject: [PATCH 0352/1650] [PWGLF] Update NucleiHistTask.cxx (#10080) --- PWGLF/Tasks/Nuspex/NucleiHistTask.cxx | 114 ++++++++++++++++++++------ 1 file changed, 87 insertions(+), 27 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/NucleiHistTask.cxx b/PWGLF/Tasks/Nuspex/NucleiHistTask.cxx index 6365e1c6340..ecc7607c4d0 100644 --- a/PWGLF/Tasks/Nuspex/NucleiHistTask.cxx +++ b/PWGLF/Tasks/Nuspex/NucleiHistTask.cxx @@ -99,16 +99,16 @@ struct NucleiHistTask { histTrackcuts_data_particle->GetXaxis()->SetBinLabel(1, "Events read"); histTrackcuts_data_particle->GetXaxis()->SetBinLabel(2, "Ev. sel. passed"); histTrackcuts_data_particle->GetXaxis()->SetBinLabel(3, "Rap. cut passed"); - histTrackcuts_data_particle->GetXaxis()->SetBinLabel(4, "DCA cut passed"); - histTrackcuts_data_particle->GetXaxis()->SetBinLabel(5, "TPCnCls cut passed"); - histTrackcuts_data_particle->GetXaxis()->SetBinLabel(6, "TPCCrossedRowsOverFindable cut passed"); - histTrackcuts_data_particle->GetXaxis()->SetBinLabel(7, "Chi2 cut passed"); - histTrackcuts_data_particle->GetXaxis()->SetBinLabel(8, "Passed TPC refit cut"); - histTrackcuts_data_particle->GetXaxis()->SetBinLabel(9, "Passed ITS refit cut"); - histTrackcuts_data_particle->GetXaxis()->SetBinLabel(10, "ITSnCls cut passed"); - histTrackcuts_data_particle->GetXaxis()->SetBinLabel(11, "track.pt() cut passed"); - histTrackcuts_data_particle->GetXaxis()->SetBinLabel(12, "hasITS & hasTPC cut passed"); - histTrackcuts_data_particle->GetXaxis()->SetBinLabel(13, "GoldenChi2 cut passed"); + histTrackcuts_data_particle->GetXaxis()->SetBinLabel(4, "TPCnCls cut passed"); + histTrackcuts_data_particle->GetXaxis()->SetBinLabel(5, "TPCCrossedRowsOverFindable cut passed"); + histTrackcuts_data_particle->GetXaxis()->SetBinLabel(6, "Chi2 cut passed"); + histTrackcuts_data_particle->GetXaxis()->SetBinLabel(7, "Passed TPC refit cut"); + histTrackcuts_data_particle->GetXaxis()->SetBinLabel(8, "Passed ITS refit cut"); + histTrackcuts_data_particle->GetXaxis()->SetBinLabel(9, "ITSnCls cut passed"); + histTrackcuts_data_particle->GetXaxis()->SetBinLabel(10, "track.pt() cut passed"); + histTrackcuts_data_particle->GetXaxis()->SetBinLabel(11, "hasITS & hasTPC cut passed"); + histTrackcuts_data_particle->GetXaxis()->SetBinLabel(12, "GoldenChi2 cut passed"); + histTrackcuts_data_particle->GetXaxis()->SetBinLabel(13, "DCA cut passed"); // +++++++++++++++++++ reconstructed MC ++++++++++++++++++++++ histTrackcuts_MC->GetXaxis()->SetBinLabel(1, "Events read"); @@ -161,6 +161,8 @@ struct NucleiHistTask { pion_reg.add("histTofSignalData", "TOF signal (#pi^{+})", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {550, 0.0, 1.1, "#beta (TOF)"}}); pion_reg.add("histDcaVsPtData", "dcaXY vs Pt (#pi^{+})", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); pion_reg.add("histDcaZVsPtData", "dcaZ vs Pt (#pi^{+})", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); + pion_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (#pi^{+}) after cut", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + pion_reg.add("histDcaZVsPtData_after_cut", "dcaZ vs Pt (#pi^{+}) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); pion_reg.add("histTOFm2", "TOF m^2 vs Pt (#pi^{+})", HistType::kTH2F, {pAxis, {400, 0.0, 10.0, "m^2"}}); pion_reg.add("histTpcNsigmaData", "n-sigma TPC (#pi^{+})", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{#pi^{+}}"}}); pion_reg.add("histTofNsigmaData", "n-sigma TOF (#pi^{+})", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{#pi^{+}}"}}); @@ -181,6 +183,8 @@ struct NucleiHistTask { apion_reg.add("histTofSignalData", "TOF signal (#pi^{-})", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {550, 0.0, 1.1, "#beta (TOF)"}}); apion_reg.add("histDcaVsPtData", "dcaXY vs Pt (#pi^{-})", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); apion_reg.add("histDcaZVsPtData", "dcaZ vs Pt (#pi^{-})", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); + apion_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (#pi^{-}) after cut", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + apion_reg.add("histDcaZVsPtData_after_cut", "dcaZ vs Pt (#pi^{-}) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); apion_reg.add("histTOFm2", "TOF m^2 vs Pt (#pi^{-})", HistType::kTH2F, {pAxis, {400, 0.0, 10.0, "m^2"}}); apion_reg.add("histTpcNsigmaData", "n-sigma TPC (#pi^{-})", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{#pi^{+}}"}}); apion_reg.add("histTofNsigmaData", "n-sigma TOF (#pi^{-})", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{#pi^{+}}"}}); @@ -201,6 +205,8 @@ struct NucleiHistTask { proton_reg.add("histTofSignalData", "TOF signal (p)", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {550, 0.0, 1.1, "#beta (TOF)"}}); proton_reg.add("histDcaVsPtData", "dcaXY vs Pt (p)", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); proton_reg.add("histDcaZVsPtData", "dcaZ vs Pt (p)", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); + proton_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (p) after cut", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + proton_reg.add("histDcaZVsPtData_after_cut", "dcaZ vs Pt (p) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); proton_reg.add("histTOFm2", "TOF m^2 vs Pt (p)", HistType::kTH2F, {pAxis, {400, 0.0, 10.0, "m^2"}}); proton_reg.add("histTpcNsigmaData", "n-sigma TPC (p)", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{p}"}}); proton_reg.add("histTofNsigmaData", "n-sigma TOF (p)", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{p}"}}); @@ -221,6 +227,8 @@ struct NucleiHistTask { aproton_reg.add("histTofSignalData", "TOF signal (#bar{p})", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {550, 0.0, 1.1, "#beta (TOF)"}}); aproton_reg.add("histDcaVsPtData", "dcaXY vs Pt (#bar{p})", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); aproton_reg.add("histDcaZVsPtData", "dcaZ vs Pt (#bar{p})", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); + aproton_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (#bar{p}) after cut", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + aproton_reg.add("histDcaZVsPtData_after_cut", "dcaZ vs Pt (#bar{p}) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); aproton_reg.add("histTOFm2", "TOF m^2 vs Pt (#bar{p})", HistType::kTH2F, {pAxis, {400, 0.0, 10.0, "m^2"}}); aproton_reg.add("histTpcNsigmaData", "n-sigma TPC (#bar{p})", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{#bar{p}}"}}); aproton_reg.add("histTofNsigmaData", "n-sigma TOF (#bar{p})", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{#bar{p}}"}}); @@ -241,6 +249,8 @@ struct NucleiHistTask { deuteron_reg.add("histTofSignalData", "TOF signal (d)", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {550, 0.0, 1.1, "#beta (TOF)"}}); deuteron_reg.add("histDcaVsPtData", "dcaXY vs Pt (d)", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); deuteron_reg.add("histDcaZVsPtData", "dcaZ vs Pt (d)", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); + deuteron_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (d) after cut", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + deuteron_reg.add("histDcaZVsPtData_after_cut", "dcaZ vs Pt (d) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); deuteron_reg.add("histTOFm2", "TOF m^2 vs Pt (d)", HistType::kTH2F, {pAxis, {400, 0.0, 10.0, "m^2"}}); deuteron_reg.add("histTpcNsigmaData", "n-sigma TPC (d)", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{d}"}}); deuteron_reg.add("histTofNsigmaData", "n-sigma TOF (d)", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{d}"}}); @@ -261,6 +271,8 @@ struct NucleiHistTask { adeuteron_reg.add("histTofSignalData", "TOF signal (#bar{d})", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {550, 0.0, 1.1, "#beta (TOF)"}}); adeuteron_reg.add("histDcaVsPtData", "dcaXY vs Pt (#bar{d})", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); adeuteron_reg.add("histDcaZVsPtData", "dcaZ vs Pt (#bar{d})", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); + adeuteron_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (#bar{d}) after cut", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + adeuteron_reg.add("histDcaZVsPtData_after_cut", "dcaZ vs Pt (#bar{d}) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); adeuteron_reg.add("histTOFm2", "TOF m^2 vs Pt (#bar{d})", HistType::kTH2F, {pAxis, {400, 0.0, 10.0, "m^2"}}); adeuteron_reg.add("histTpcNsigmaData", "n-sigma TPC (#bar{d})", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{#bar{d}}"}}); adeuteron_reg.add("histTofNsigmaData", "n-sigma TOF (#bar{d})", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{#bar{d}}"}}); @@ -281,6 +293,8 @@ struct NucleiHistTask { triton_reg.add("histTofSignalData", "TOF signal (t)", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {550, 0.0, 1.1, "#beta (TOF)"}}); triton_reg.add("histDcaVsPtData", "dcaXY vs Pt (t)", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); triton_reg.add("histDcaZVsPtData", "dcaZ vs Pt (t)", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); + triton_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (t) after cut", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + triton_reg.add("histDcaZVsPtData_after_cut", "dcaZ vs Pt (t) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); triton_reg.add("histTOFm2", "TOF m^2 vs Pt (t)", HistType::kTH2F, {pAxis, {400, 0.0, 10.0, "m^2"}}); triton_reg.add("histTpcNsigmaData", "n-sigma TPC (t)", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{t}"}}); triton_reg.add("histTofNsigmaData", "n-sigma TOF (t)", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{t}"}}); @@ -301,6 +315,8 @@ struct NucleiHistTask { atriton_reg.add("histTofSignalData", "TOF signal (#bar{t})", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {550, 0.0, 1.1, "#beta (TOF)"}}); atriton_reg.add("histDcaVsPtData", "dcaXY vs Pt (#bar{t})", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); atriton_reg.add("histDcaZVsPtData", "dcaZ vs Pt (#bar{t})", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); + atriton_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (#bar{t}) after cut", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + atriton_reg.add("histDcaZVsPtData_after_cut", "dcaZ vs Pt (#bar{t}) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); atriton_reg.add("histTOFm2", "TOF m^2 vs Pt (#bar{t})", HistType::kTH2F, {pAxis, {400, 0.0, 10.0, "m^2"}}); atriton_reg.add("histTpcNsigmaData", "n-sigma TPC (#bar{t})", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{#bar{t}}"}}); atriton_reg.add("histTofNsigmaData", "n-sigma TOF (#bar{t})", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{#bar{t}}"}}); @@ -321,6 +337,8 @@ struct NucleiHistTask { Helium3_reg.add("histTofSignalData", "TOF signal (^{3}He)", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {550, 0.0, 1.1, "#beta (TOF)"}}); Helium3_reg.add("histDcaVsPtData", "dcaXY vs Pt (^{3}He)", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); Helium3_reg.add("histDcaZVsPtData", "dcaZ vs Pt (^{3}He)", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); + Helium3_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (^{3}He) after cut", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + Helium3_reg.add("histDcaZVsPtData_after_cut", "dcaZ vs Pt (^{3}He) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); Helium3_reg.add("histTOFm2", "TOF m^2 vs Pt (^{3}He)", HistType::kTH2F, {pAxis, {400, 0.0, 10.0, "m^2"}}); Helium3_reg.add("histTpcNsigmaData", "n-sigma TPC (^{3}He)", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{^{3}He}"}}); Helium3_reg.add("histTofNsigmaData", "n-sigma TOF (^{3}He)", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{^{3}He}"}}); @@ -341,6 +359,8 @@ struct NucleiHistTask { aHelium3_reg.add("histTofSignalData", "TOF signal (^{3}#bar{He})", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {550, 0.0, 1.1, "#beta (TOF)"}}); aHelium3_reg.add("histDcaVsPtData", "dcaXY vs Pt (^{3}#bar{He})", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); aHelium3_reg.add("histDcaZVsPtData", "dcaZ vs Pt (^{3}#bar{He})", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); + aHelium3_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (^{3}#bar{He}) after cut", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + aHelium3_reg.add("histDcaZVsPtData_after_cut", "dcaZ vs Pt (^{3}#bar{He}) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); aHelium3_reg.add("histTOFm2", "TOF m^2 vs Pt (^{3}#bar{He})", HistType::kTH2F, {pAxis, {400, 0.0, 10.0, "m^2"}}); aHelium3_reg.add("histTpcNsigmaData", "n-sigma TPC (^{3}#bar{He})", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{^{3}He}"}}); aHelium3_reg.add("histTofNsigmaData", "n-sigma TOF (^{3}#bar{He})", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{^{3}He}"}}); @@ -361,6 +381,8 @@ struct NucleiHistTask { Helium4_reg.add("histTofSignalData", "TOF signal (^{4}He)", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {550, 0.0, 1.1, "#beta (TOF)"}}); Helium4_reg.add("histDcaVsPtData", "dcaXY vs Pt (^{4}He)", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); Helium4_reg.add("histDcaZVsPtData", "dcaZ vs Pt (^{4}He)", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); + Helium4_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (^{4}He) after cut", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + Helium4_reg.add("histDcaZVsPtData_after_cut", "dcaZ vs Pt (^{4}He) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); Helium4_reg.add("histTOFm2", "TOF m^2 vs Pt (^{4}He)", HistType::kTH2F, {pAxis, {400, 0.0, 10.0, "m^2"}}); Helium4_reg.add("histTpcNsigmaData", "n-sigma TPC (^{4}He)", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{^{4}He}"}}); Helium4_reg.add("histTofNsigmaData", "n-sigma TOF (^{4}He)", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{^{4}He}"}}); @@ -381,6 +403,8 @@ struct NucleiHistTask { aHelium4_reg.add("histTofSignalData", "TOF signal (^{4}#bar{He})", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {550, 0.0, 1.1, "#beta (TOF)"}}); aHelium4_reg.add("histDcaVsPtData", "dcaXY vs Pt (^{4}#bar{He})", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); aHelium4_reg.add("histDcaZVsPtData", "dcaZ vs Pt (^{4}#bar{He})", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); + aHelium4_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (^{4}#bar{He}) after cut", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + aHelium4_reg.add("histDcaZVsPtData_after_cut", "dcaZ vs Pt (^{4}#bar{He}) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); aHelium4_reg.add("histTOFm2", "TOF m^2 vs Pt (^{4}#bar{He})", HistType::kTH2F, {pAxis, {400, 0.0, 10.0, "m^2"}}); aHelium4_reg.add("histTpcNsigmaData", "n-sigma TPC (^{4}#bar{He})", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{antiHe-4}"}}); aHelium4_reg.add("histTofNsigmaData", "n-sigma TOF (^{4}#bar{He})", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{antiHe-4}"}}); @@ -726,37 +750,49 @@ struct NucleiHistTask { if (lorentzVector_particle.Rapidity() < yMin || lorentzVector_particle.Rapidity() > yMax) continue; histTrackcuts_data_particle->AddBinContent(3); - - bool insideDCAxy = (std::abs(track.dcaXY()) <= (maxDcaXYFactor.value * (0.0105f + 0.0350f / pow(momentum, 1.1f)))); - - if (!(insideDCAxy) || TMath::Abs(track.dcaZ()) > maxDCA_Z) + if (TPCnumberClsFound < minTPCnClsFound || TPC_nCls_Crossed_Rows < minNCrossedRowsTPC) continue; histTrackcuts_data_particle->AddBinContent(4); - if (TPCnumberClsFound < minTPCnClsFound || TPC_nCls_Crossed_Rows < minNCrossedRowsTPC) + if (RatioCrossedRowsOverFindableTPC < minRatioCrossedRowsTPC || RatioCrossedRowsOverFindableTPC > maxRatioCrossedRowsTPC) continue; histTrackcuts_data_particle->AddBinContent(5); - if (RatioCrossedRowsOverFindableTPC < minRatioCrossedRowsTPC || RatioCrossedRowsOverFindableTPC > maxRatioCrossedRowsTPC) + if (Chi2perClusterTPC > maxChi2PerClusterTPC || Chi2perClusterTPC < minChi2PerClusterTPC || Chi2perClusterITS > maxChi2PerClusterITS) continue; histTrackcuts_data_particle->AddBinContent(6); - if (Chi2perClusterTPC > maxChi2PerClusterTPC || Chi2perClusterTPC < minChi2PerClusterTPC || Chi2perClusterITS > maxChi2PerClusterITS) + if (!(track.passedTPCRefit())) continue; histTrackcuts_data_particle->AddBinContent(7); - if (!(track.passedTPCRefit())) + if (!(track.passedITSRefit())) continue; histTrackcuts_data_particle->AddBinContent(8); - if (!(track.passedITSRefit())) + if ((track.itsNClsInnerBarrel()) < minReqClusterITSib || (track.itsNCls()) < minReqClusterITS) continue; histTrackcuts_data_particle->AddBinContent(9); - if ((track.itsNClsInnerBarrel()) < minReqClusterITSib || (track.itsNCls()) < minReqClusterITS) + if (momentum < p_min || momentum > p_max) continue; histTrackcuts_data_particle->AddBinContent(10); - if (momentum < p_min || momentum > p_max) + if ((requireITS && !(track.hasITS())) || (requireTPC && !(track.hasTPC()))) continue; histTrackcuts_data_particle->AddBinContent(11); - if ((requireITS && !(track.hasITS())) || (requireTPC && !(track.hasTPC()))) + if (requireGoldenChi2 && !(track.passedGoldenChi2())) continue; + histTrackcuts_data_particle->AddBinContent(12); - if (requireGoldenChi2 && !(track.passedGoldenChi2())) + + if (TPCnSigma_particle > nsigmacutLow && TPCnSigma_particle < nsigmacutHigh && TMath::Abs(track.dcaZ()) < 2.0 && TMath::Abs(track.dcaXY()) < 0.5) { + if (track.sign() > 0) { + particle_reg.fill(HIST("histDcaVsPtData"), momentum, track.dcaXY()); + particle_reg.fill(HIST("histDcaZVsPtData"), momentum, track.dcaZ()); + } + if (track.sign() < 0) { + aparticle_reg.fill(HIST("histDcaVsPtData"), momentum, track.dcaXY()); + aparticle_reg.fill(HIST("histDcaZVsPtData"), momentum, track.dcaZ()); + } + } + + bool insideDCAxy = (std::abs(track.dcaXY()) <= (maxDcaXYFactor.value * (0.0105f + 0.0350f / pow(momentum, 1.1f)))); + + if (!(insideDCAxy) || TMath::Abs(track.dcaZ()) > maxDCA_Z) continue; histTrackcuts_data_particle->AddBinContent(13); @@ -772,8 +808,8 @@ struct NucleiHistTask { if (TPCnSigma_particle > nsigmacutLow && TPCnSigma_particle < nsigmacutHigh) { if (track.sign() > 0) { - particle_reg.fill(HIST("histDcaVsPtData"), momentum, track.dcaXY()); - particle_reg.fill(HIST("histDcaZVsPtData"), momentum, track.dcaZ()); + particle_reg.fill(HIST("histDcaVsPtData_after_cut"), momentum, track.dcaXY()); + particle_reg.fill(HIST("histDcaZVsPtData_after_cut"), momentum, track.dcaZ()); particle_reg.fill(HIST("histTpcSignalData"), momentum, track.tpcSignal()); particle_reg.fill(HIST("histNClusterTPC"), momentum, track.tpcNClsFound()); particle_reg.fill(HIST("histNClusterITS"), momentum, track.itsNCls()); @@ -802,8 +838,8 @@ struct NucleiHistTask { } if (track.sign() < 0) { - aparticle_reg.fill(HIST("histDcaVsPtData"), momentum, track.dcaXY()); - aparticle_reg.fill(HIST("histDcaZVsPtData"), momentum, track.dcaZ()); + aparticle_reg.fill(HIST("histDcaVsPtData_after_cut"), momentum, track.dcaXY()); + aparticle_reg.fill(HIST("histDcaZVsPtData_after_cut"), momentum, track.dcaZ()); aparticle_reg.fill(HIST("histTpcSignalData"), momentum, track.tpcSignal()); aparticle_reg.fill(HIST("histNClusterTPC"), momentum, track.tpcNClsFound()); aparticle_reg.fill(HIST("histNClusterITS"), momentum, track.itsNCls()); @@ -1533,6 +1569,30 @@ struct NucleiHistTask { if (lorentzVector_particle_MC.Rapidity() < yMin || lorentzVector_particle_MC.Rapidity() > yMax) continue; + float TPCnumberClsFound = track.tpcNClsFound(); + float TPC_nCls_Crossed_Rows = track.tpcNClsCrossedRows(); + float RatioCrossedRowsOverFindableTPC = track.tpcCrossedRowsOverFindableCls(); + float Chi2perClusterTPC = track.tpcChi2NCl(); + float Chi2perClusterITS = track.itsChi2NCl(); + + if (TPCnumberClsFound < minTPCnClsFound || TPC_nCls_Crossed_Rows < minNCrossedRowsTPC) + continue; + if (RatioCrossedRowsOverFindableTPC < minRatioCrossedRowsTPC || RatioCrossedRowsOverFindableTPC > maxRatioCrossedRowsTPC) + continue; + if (Chi2perClusterTPC > maxChi2PerClusterTPC || Chi2perClusterTPC < minChi2PerClusterTPC || Chi2perClusterITS > maxChi2PerClusterITS) + continue; + if (!(track.passedTPCRefit())) + continue; + if (!(track.passedITSRefit())) + continue; + if ((track.itsNClsInnerBarrel()) < minReqClusterITSib || (track.itsNCls()) < minReqClusterITS) + continue; + if (track.pt() < p_min || track.pt() > p_max) + continue; + if ((requireITS && !(track.hasITS())) || (requireTPC && !(track.hasTPC()))) + continue; + if (requireGoldenChi2 && !(track.passedGoldenChi2())) + continue; MC_DCA.fill(HIST("histEta"), track.eta(), pdgbin); From 1b6534f5457f19bd88fddb576dde92701bc520ae Mon Sep 17 00:00:00 2001 From: creetz16 <79141119+creetz16@users.noreply.github.com> Date: Thu, 20 Feb 2025 18:16:27 +0100 Subject: [PATCH 0353/1650] [PWGLF] Fix for unbound indices in reduced3bodyCreator (#10105) Co-authored-by: yuanzhe --- PWGLF/DataModel/Reduced3BodyTables.h | 42 +++--- .../Nuspex/decay3bodybuilder.cxx | 125 ++++++------------ .../Nuspex/reduced3bodyCreator.cxx | 14 +- .../Nuspex/threebodyRecoTask.cxx | 20 +-- 4 files changed, 76 insertions(+), 125 deletions(-) diff --git a/PWGLF/DataModel/Reduced3BodyTables.h b/PWGLF/DataModel/Reduced3BodyTables.h index 2c3b8a47cde..52079537c75 100644 --- a/PWGLF/DataModel/Reduced3BodyTables.h +++ b/PWGLF/DataModel/Reduced3BodyTables.h @@ -23,7 +23,7 @@ namespace o2::aod { -DECLARE_SOA_TABLE(ReducedCollisions, "AOD", "REDCOLLISION", //! reduced collision table (same structure as the original collision table) +DECLARE_SOA_TABLE(RedCollisions, "AOD", "REDCOLLISION", //! reduced collision table (same structure as the original collision table) o2::soa::Index<>, collision::PosX, collision::PosY, collision::PosZ, collision::CovXX, collision::CovXY, collision::CovYY, collision::CovXZ, collision::CovYZ, collision::CovZZ, @@ -31,24 +31,24 @@ DECLARE_SOA_TABLE(ReducedCollisions, "AOD", "REDCOLLISION", //! reduced collisio collision::CollisionTime, collision::CollisionTimeRes, bc::RunNumber); -DECLARE_SOA_TABLE(ReducedPVMults, "AOD", "REDPVMULT", //! Multiplicity from the PV contributors, joinable with reducedCollisions +DECLARE_SOA_TABLE(RedPVMults, "AOD", "REDPVMULT", //! Multiplicity from the PV contributors, joinable with reducedCollisions mult::MultNTracksPV); -DECLARE_SOA_TABLE(ReducedCentFT0Cs, "AOD", "REDCENTFT0C", //! Reduced Run 3 FT0C centrality table, joinable with reducedCollisions +DECLARE_SOA_TABLE(RedCentFT0Cs, "AOD", "REDCENTFT0C", //! Reduced Run 3 FT0C centrality table, joinable with reducedCollisions cent::CentFT0C); namespace reducedtracks3body { // track parameter definition -DECLARE_SOA_INDEX_COLUMN(Collision, collision); //! Collision to which this track belongs -DECLARE_SOA_COLUMN(X, x, float); //! -DECLARE_SOA_COLUMN(Alpha, alpha, float); //! -DECLARE_SOA_COLUMN(Y, y, float); //! -DECLARE_SOA_COLUMN(Z, z, float); //! -DECLARE_SOA_COLUMN(Snp, snp, float); //! -DECLARE_SOA_COLUMN(Tgl, tgl, float); //! -DECLARE_SOA_COLUMN(Signed1Pt, signed1Pt, float); //! (sign of charge)/Pt in c/GeV. Use pt() and sign() instead -DECLARE_SOA_EXPRESSION_COLUMN(Phi, phi, float, //! Phi of the track, in radians within [0, 2pi) +DECLARE_SOA_INDEX_COLUMN_FULL(Collision, collision, int, RedCollisions, ""); //! Collision index +DECLARE_SOA_COLUMN(X, x, float); //! +DECLARE_SOA_COLUMN(Alpha, alpha, float); //! +DECLARE_SOA_COLUMN(Y, y, float); //! +DECLARE_SOA_COLUMN(Z, z, float); //! +DECLARE_SOA_COLUMN(Snp, snp, float); //! +DECLARE_SOA_COLUMN(Tgl, tgl, float); //! +DECLARE_SOA_COLUMN(Signed1Pt, signed1Pt, float); //! (sign of charge)/Pt in c/GeV. Use pt() and sign() instead +DECLARE_SOA_EXPRESSION_COLUMN(Phi, phi, float, //! Phi of the track, in radians within [0, 2pi) ifnode(nasin(aod::track::snp) + aod::track::alpha < 0.0f, nasin(aod::track::snp) + aod::track::alpha + o2::constants::math::TwoPI, ifnode(nasin(aod::track::snp) + aod::track::alpha >= o2::constants::math::TwoPI, nasin(aod::track::snp) + aod::track::alpha - o2::constants::math::TwoPI, nasin(aod::track::snp) + aod::track::alpha))); @@ -191,7 +191,7 @@ DECLARE_SOA_COLUMN(TOFNSigmaDe, tofNSigmaDe, float); //! Nsigma separation with } // namespace reducedtracks3body -DECLARE_SOA_TABLE_FULL(StoredReducedTracksIU, "ReducedTracks_IU", "AOD", "REDTRACK_IU", //! On disk version of the track parameters at inner most update (e.g. ITS) as it comes from the tracking +DECLARE_SOA_TABLE_FULL(StoredRedIUTracks, "RedIUTracks", "AOD", "REDIUTRACK", //! On disk version of the track parameters at inner most update (e.g. ITS) as it comes from the tracking o2::soa::Index<>, reducedtracks3body::CollisionId, reducedtracks3body::X, reducedtracks3body::Alpha, reducedtracks3body::Y, reducedtracks3body::Z, reducedtracks3body::Snp, reducedtracks3body::Tgl, @@ -226,7 +226,7 @@ DECLARE_SOA_TABLE_FULL(StoredReducedTracksIU, "ReducedTracks_IU", "AOD", "REDTRA reducedtracks3body::ITSClsSizeInLayer, reducedtracks3body::TPCCrossedRowsOverFindableCls); -DECLARE_SOA_EXTENDED_TABLE(ReducedTracksIU, StoredReducedTracksIU, "EXREDTRACK_IU", 0, //! Track parameters at inner most update (e.g. ITS) as it comes from the tracking +DECLARE_SOA_EXTENDED_TABLE(RedIUTracks, StoredRedIUTracks, "EXREDIUTRACK", 0, //! Track parameters at inner most update (e.g. ITS) as it comes from the tracking reducedtracks3body::Pt, reducedtracks3body::P, reducedtracks3body::Eta, @@ -250,20 +250,18 @@ DECLARE_SOA_EXTENDED_TABLE(ReducedTracksIU, StoredReducedTracksIU, "EXREDTRACK_I // tracks extra reducedtracks3body::DetectorMap); -using ReducedTrackIU = ReducedTracksIU::iterator; - namespace reduceddecay3body { -DECLARE_SOA_INDEX_COLUMN_FULL(Track0, track0, int, ReducedTracksIU, "_0"); //! Track 0 index -DECLARE_SOA_INDEX_COLUMN_FULL(Track1, track1, int, ReducedTracksIU, "_1"); //! Track 1 index -DECLARE_SOA_INDEX_COLUMN_FULL(Track2, track2, int, ReducedTracksIU, "_2"); //! Track 2 index -DECLARE_SOA_INDEX_COLUMN_FULL(Collision, collision, int, ReducedCollisions, ""); //! Collision index +DECLARE_SOA_INDEX_COLUMN_FULL(Track0, track0, int, RedIUTracks, "_0"); //! Track 0 index +DECLARE_SOA_INDEX_COLUMN_FULL(Track1, track1, int, RedIUTracks, "_1"); //! Track 1 index +DECLARE_SOA_INDEX_COLUMN_FULL(Track2, track2, int, RedIUTracks, "_2"); //! Track 2 index +DECLARE_SOA_INDEX_COLUMN_FULL(Collision, collision, int, RedCollisions, ""); //! Collision index } // namespace reduceddecay3body -DECLARE_SOA_TABLE(ReducedDecay3Bodys, "AOD", "REDDECAY3BODY", //! reduced 3-body decay table +DECLARE_SOA_TABLE(RedDecay3Bodys, "AOD", "REDDECAY3BODY", //! reduced 3-body decay table o2::soa::Index<>, reduceddecay3body::CollisionId, reduceddecay3body::Track0Id, reduceddecay3body::Track1Id, reduceddecay3body::Track2Id); -using ReducedDecay3BodysLinked = soa::Join; +using ReducedDecay3BodysLinked = soa::Join; using ReducedDecay3BodyLinked = ReducedDecay3BodysLinked::iterator; } // namespace o2::aod diff --git a/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx b/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx index ca363ef30b1..9b5d098f7f6 100644 --- a/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx +++ b/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx @@ -71,15 +71,14 @@ using FullTracksExtIU = soa::Join; using ColwithEvTimes = o2::soa::Join; -using FullCols = o2::soa::Join; using ColwithEvTimesMults = o2::soa::Join; using TrackExtIUwithEvTimes = soa::Join; using TrackExtPIDIUwithEvTimes = soa::Join; using MCLabeledTracksIU = soa::Join; -using ReducedCollisionsMults = soa::Join; -using ReducedCollisionsMultsCents = soa::Join; +using ReducedCollisionsMults = soa::Join; +using ReducedCollisionsMultsCents = soa::Join; struct vtxCandidate { int track0Id; @@ -325,7 +324,7 @@ struct decay3bodyBuilder { // Filters and slices Preslice perCollision = o2::aod::decay3body::collisionId; - Preslice perReducedCollision = o2::aod::reduceddecay3body::collisionId; + Preslice perReducedCollision = o2::aod::reduceddecay3body::collisionId; int mRunNumber; float d_bz; @@ -413,7 +412,7 @@ struct decay3bodyBuilder { registry.add("hBachelorTOFNSigmaDe", "", HistType::kTH2F, {{40, -10.0f, 10.0f, "p/z (GeV/c)"}, {40, -10.0f, 10.0f, "TOF n#sigma"}}); } - if (doprocessRun3withKFParticle == true || doprocessRun3withKFParticleEM == true || doprocessRun3withKFParticleStrangenessTracking == true || doprocessRun3withKFParticleTrackRotation == true || doprocessRun3withKFParticleReduced == true || doprocessRun3withKFParticleReducedEM == true) { + if (doprocessRun3withKFParticle == true || doprocessRun3withKFParticleStrangenessTracking == true || doprocessRun3withKFParticleTrackRotation == true || doprocessRun3withKFParticleReduced == true || doprocessRun3withKFParticleReducedEM == true) { auto hEventCounterZorro = registry.add("Counters/hEventCounterZorro", "hEventCounterZorro", HistType::kTH1D, {{2, -0.5, 1.5}}); hEventCounterZorro->GetXaxis()->SetBinLabel(1, "Zorro before evsel"); hEventCounterZorro->GetXaxis()->SetBinLabel(2, "Zorro after evsel"); @@ -481,7 +480,7 @@ struct decay3bodyBuilder { registry.add("QA/Event/hVtxCovYZ", "hVtxCovYZ", HistType::kTH1F, {{200, -0.0001f, 0.0001f, "PV cov(YZ) (cm^{2})"}}); } - if (doprocessRun3withKFParticleEM == true || doprocessRun3withKFParticleReducedEM == true) { + if (doprocessRun3withKFParticleReducedEM == true) { auto hPairCounterMixing = registry.add("QA/EM/hPairCounterMixing", "hPairCounterMixing", HistType::kTH1F, {{3, 0.0f, 3.0f}}); hPairCounterMixing->GetXaxis()->SetBinLabel(1, "total"); hPairCounterMixing->GetXaxis()->SetBinLabel(2, "sel8"); @@ -676,7 +675,7 @@ struct decay3bodyBuilder { //------------------------------------------------------------------ // 3body candidate builder - template + template void fillVtxCand(TCollisionTable const& collision, TTrackTable const& t0, TTrackTable const& t1, TTrackTable const& t2, int64_t decay3bodyId, int bachelorcharge = 1, double tofNSigmaBach = -999) { @@ -1497,7 +1496,7 @@ struct decay3bodyBuilder { tofNSigmaBach = bachelorTOFPID.GetTOFNSigma(t2, originalcol, collision); } - fillVtxCand(collision, t0, t1, t2, d3body.globalIndex(), bachelorcharge, tofNSigmaBach); + fillVtxCand(collision, t0, t1, t2, d3body.globalIndex(), bachelorcharge, tofNSigmaBach); } for (const auto& candVtx : vtxCandidates) { @@ -1507,7 +1506,7 @@ struct decay3bodyBuilder { PROCESS_SWITCH(decay3bodyBuilder, processRun3, "Produce DCA fitter decay3body tables", true); //------------------------------------------------------------------ - void processRun3Reduced(aod::ReducedCollisions const& collisions, aod::ReducedDecay3Bodys const& decay3bodys, aod::ReducedTracksIU const&) + void processRun3Reduced(aod::RedCollisions const& collisions, aod::RedDecay3Bodys const& decay3bodys, aod::RedIUTracks const&) { vtxCandidates.clear(); @@ -1516,16 +1515,17 @@ struct decay3bodyBuilder { int lastRunNumber = -1; for (const auto& d3body : decay3bodys) { - auto t0 = d3body.track0_as(); - auto t1 = d3body.track1_as(); - auto t2 = d3body.track2_as(); - auto collision = d3body.collision_as(); + auto t0 = d3body.track0_as(); + auto t1 = d3body.track1_as(); + auto t2 = d3body.track2_as(); + auto collision = d3body.collision_as(); + if (collision.runNumber() != lastRunNumber) { initCCDBReduced(collision.runNumber()); lastRunNumber = collision.runNumber(); // Update the last run number LOG(debug) << "CCDB initialized for run " << lastRunNumber; } - fillVtxCand(collision, t0, t1, t2, d3body.globalIndex(), bachelorcharge, t2.tofNSigmaDe()); + fillVtxCand(collision, t0, t1, t2, d3body.globalIndex(), bachelorcharge, t2.tofNSigmaDe()); } for (const auto& candVtx : vtxCandidates) { @@ -1536,37 +1536,37 @@ struct decay3bodyBuilder { //------------------------------------------------------------------ // Event-mixing background - void processRun3ReducedEM(ReducedCollisionsMultsCents const&, aod::ReducedDecay3Bodys const&, aod::ReducedTracksIU const&) + void processRun3ReducedEM(ReducedCollisionsMultsCents const&, aod::RedDecay3Bodys const&, aod::RedIUTracks const&) { vtxCandidates.clear(); BinningType binningEvent{{axisPosZ, axisCentrality}, true}; - SameKindPair pair{binningEvent, EMTrackSel.nUseMixedEvent, -1, &cache}; + SameKindPair pair{binningEvent, EMTrackSel.nUseMixedEvent, -1, &cache}; int lastRunNumber = -1; for (const auto& [c0, decay3bodys0, c1, decay3bodys1] : pair) { for (auto& [d3body0, d3body1] : combinations(soa::CombinationsFullIndexPolicy(decay3bodys0, decay3bodys1))) { - auto tpos0 = d3body0.track0_as(); - auto tneg0 = d3body0.track1_as(); - auto tbach0 = d3body0.track2_as(); - auto tpos1 = d3body1.track0_as(); - auto tneg1 = d3body1.track1_as(); - auto tbach1 = d3body1.track2_as(); + auto tpos0 = d3body0.track0_as(); + auto tneg0 = d3body0.track1_as(); + auto tbach0 = d3body0.track2_as(); + auto tpos1 = d3body1.track0_as(); + auto tneg1 = d3body1.track1_as(); + auto tbach1 = d3body1.track2_as(); if (c0.runNumber() != lastRunNumber) { initCCDBReduced(c0.runNumber()); lastRunNumber = c0.runNumber(); // Update the last run number LOG(debug) << "CCDB initialized for run " << lastRunNumber; } - fillVtxCand(c0, tpos0, tneg0, tbach1, -1, bachelorcharge, tbach1.tofNSigmaDe()); + fillVtxCand(c0, tpos0, tneg0, tbach1, -1, bachelorcharge, tbach1.tofNSigmaDe()); if (c1.runNumber() != lastRunNumber) { initCCDBReduced(c1.runNumber()); lastRunNumber = c1.runNumber(); // Update the last run number LOG(debug) << "CCDB initialized for run " << lastRunNumber; } - fillVtxCand(c1, tpos1, tneg1, tbach0, -1, bachelorcharge, tbach0.tofNSigmaDe()); + fillVtxCand(c1, tpos1, tneg1, tbach0, -1, bachelorcharge, tbach0.tofNSigmaDe()); } } @@ -1641,51 +1641,6 @@ struct decay3bodyBuilder { } PROCESS_SWITCH(decay3bodyBuilder, processRun3withKFParticleStrangenessTracking, "Produce KFParticle strangeness tracked decay3body tables", false); - void processRun3withKFParticleEM(ColwithEvTimesMults const& collisions, TrackExtPIDIUwithEvTimes const& tracksIU, aod::Decay3Bodys const& decay3bodys, aod::BCsWithTimestamps const&) - { - auto tuple = std::make_tuple(decay3bodys, tracksIU); - BinningTypeKF binningOnPosAndMult{{kfparticleConfigurations.binsVtxZ, kfparticleConfigurations.binsMultiplicity}, true}; - Pair pair{binningOnPosAndMult, kfparticleConfigurations.nEvtMixing, -1, collisions, tuple, &cache}; // indicates that under/overflow (-1) to be ignored - - for (auto& [c1, decays3body, c2, tracks] : pair) { - registry.fill(HIST("QA/EM/hPairCounterMixing"), 0.5); - - // event selection - if (kfparticleConfigurations.doSel8selection && (!c1.sel8() || !c2.sel8())) { - continue; - } - registry.fill(HIST("QA/EM/hPairCounterMixing"), 1.5); - if (kfparticleConfigurations.doPosZselection && (abs(c1.posZ()) > 10.f || abs(c2.posZ()) > 10.f)) { - continue; - } - registry.fill(HIST("QA/EM/hPairCounterMixing"), 2.5); - auto bc = c1.bc_as(); - initCCDB(bc); - LOG(debug) << "CCDB initialised."; - - for (auto& [decay3body, track] : soa::combinations(soa::CombinationsFullIndexPolicy(decays3body, tracks))) { - auto trackPos = decay3body.template track0_as(); - auto trackNeg = decay3body.template track1_as(); - auto trackBach = decay3body.template track2_as(); - - registry.fill(HIST("QA/EM/hCombinationCounterMixing"), 0.5); - - // selections bachelor track - if ((trackBach.sign() > 0 && !(track.sign() > 0)) || (trackBach.sign() < 0 && !(track.sign() < 0)) || trackBach.globalIndex() == track.globalIndex()) { // only combine if track has correct sign and is not same as trackBach - continue; - } - registry.fill(HIST("QA/EM/hCombinationCounterMixing"), 1.5); - if (track.pt() < 0.6) { // SVertexer selection - continue; - } - registry.fill(HIST("QA/EM/hCombinationCounterMixing"), 2.5); - buildVtx3BodyDataTableKFParticle(c1, trackPos, trackNeg, track, -1 /*vtx3bodyID*/, bachelorcharge, 1 /*nRotations*/, getTOFnSigma(c1, trackBach, true /*isEventMixing*/)); - LOG(debug) << "buildVtx3BodyDataTableKFParticle called."; - } - } - } - PROCESS_SWITCH(decay3bodyBuilder, processRun3withKFParticleEM, "Produce KFParticle decay3body mixed event tables", false); - void processRun3withKFParticleTrackRotation(ColwithEvTimes const& collisions, TrackExtPIDIUwithEvTimes const&, aod::Decay3Bodys const& decay3bodys, aod::BCsWithTimestamps const&) { // same process as processRun3withKFParticle but with nRotations set according to configurable @@ -1720,7 +1675,7 @@ struct decay3bodyBuilder { } PROCESS_SWITCH(decay3bodyBuilder, processRun3withKFParticleTrackRotation, "Produce KFParticle decay3body tables with rotated tracks", false); - void processRun3withKFParticleReduced(aod::ReducedCollisions const& collisions, aod::ReducedTracksIU const&, aod::ReducedDecay3Bodys const& decay3bodys) + void processRun3withKFParticleReduced(aod::RedCollisions const& collisions, aod::RedIUTracks const&, aod::RedDecay3Bodys const& decay3bodys) { int lastRunNumber = -1; @@ -1740,21 +1695,21 @@ struct decay3bodyBuilder { const uint64_t collIdx = collision.globalIndex(); auto Decay3BodyTable_thisCollision = decay3bodys.sliceBy(perReducedCollision, collIdx); for (auto& vtx3body : Decay3BodyTable_thisCollision) { - auto trackPos = vtx3body.template track0_as(); - auto trackNeg = vtx3body.template track1_as(); - auto trackBach = vtx3body.template track2_as(); - buildVtx3BodyDataTableKFParticle(collision, trackPos, trackNeg, trackBach, vtx3body.globalIndex(), bachelorcharge, 1 /*nRotations*/, trackBach.tofNSigmaDe()); + auto trackPos = vtx3body.template track0_as(); + auto trackNeg = vtx3body.template track1_as(); + auto trackBach = vtx3body.template track2_as(); + buildVtx3BodyDataTableKFParticle(collision, trackPos, trackNeg, trackBach, vtx3body.globalIndex(), bachelorcharge, 1 /*nRotations*/, trackBach.tofNSigmaDe()); } LOG(debug) << "End of processKFParticleDerived."; } } PROCESS_SWITCH(decay3bodyBuilder, processRun3withKFParticleReduced, "Produce KFParticle decay3body tables from derived decay3body data", false); - void processRun3withKFParticleReducedEM(ReducedCollisionsMults const& collisions, aod::ReducedTracksIU const&, aod::ReducedDecay3Bodys const& decay3bodys) + void processRun3withKFParticleReducedEM(ReducedCollisionsMults const& collisions, aod::RedIUTracks const&, aod::RedDecay3Bodys const& decay3bodys) { auto tuple = std::make_tuple(decay3bodys); BinningTypeKF binningOnPosAndMult{{kfparticleConfigurations.binsVtxZ, kfparticleConfigurations.binsMultiplicity}, true}; - SameKindPair pair{binningOnPosAndMult, kfparticleConfigurations.nEvtMixing, -1, collisions, tuple, &cache}; // indicates that under/overflow (-1) to be ignored + SameKindPair pair{binningOnPosAndMult, kfparticleConfigurations.nEvtMixing, -1, collisions, tuple, &cache}; // indicates that under/overflow (-1) to be ignored int lastRunNumber = -1; @@ -1771,12 +1726,12 @@ struct decay3bodyBuilder { } for (auto& [decay3body1, decay3body2] : soa::combinations(soa::CombinationsFullIndexPolicy(decays3body1, decays3body2))) { - auto trackPos1 = decay3body1.template track0_as(); - auto trackNeg1 = decay3body1.template track1_as(); - auto trackBach1 = decay3body1.template track2_as(); - auto trackPos2 = decay3body2.template track0_as(); - auto trackNeg2 = decay3body2.template track1_as(); - auto trackBach2 = decay3body2.template track2_as(); + auto trackPos1 = decay3body1.template track0_as(); + auto trackNeg1 = decay3body1.template track1_as(); + auto trackBach1 = decay3body1.template track2_as(); + auto trackPos2 = decay3body2.template track0_as(); + auto trackNeg2 = decay3body2.template track1_as(); + auto trackBach2 = decay3body2.template track2_as(); registry.fill(HIST("QA/EM/hCombinationCounterMixing"), 0.5); @@ -1869,7 +1824,7 @@ struct decay3bodyDataLinkBuilder { } PROCESS_SWITCH(decay3bodyDataLinkBuilder, processStandard, "Produce label from decay3body to vtx3body", true); - void processReduced(aod::ReducedDecay3Bodys const& decay3bodytable, aod::Vtx3BodyDatas const& vtxdatatable) + void processReduced(aod::RedDecay3Bodys const& decay3bodytable, aod::Vtx3BodyDatas const& vtxdatatable) { buildDecay3BodyLabel(decay3bodytable, vtxdatatable); } @@ -1904,7 +1859,7 @@ struct kfdecay3bodyDataLinkBuilder { } PROCESS_SWITCH(kfdecay3bodyDataLinkBuilder, processStandard, "Build data link table.", true); - void processReduced(aod::ReducedDecay3Bodys const& decay3bodytable, aod::KFVtx3BodyDatas const& vtxdatatable) + void processReduced(aod::RedDecay3Bodys const& decay3bodytable, aod::KFVtx3BodyDatas const& vtxdatatable) { buildDataLink(decay3bodytable, vtxdatatable); // build ReducedDecay3Body -> KFDecay3BodyData link table } @@ -1915,8 +1870,6 @@ struct decay3bodyLabelBuilder { Produces vtxlabels; Produces vtxfulllabels; - Produces kfvtxlabels; - Produces kfvtxfulllabels; HistogramRegistry registry{"registry", {}}; diff --git a/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx b/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx index 99ab175eca0..1955955520a 100644 --- a/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx +++ b/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx @@ -57,11 +57,11 @@ using TrackExtPIDIUwithEvTimes = soa::Join reducedCollisions; - Produces reducedPVMults; - Produces reducedCentFTOCs; - Produces reducedDecay3Bodys; - Produces reducedFullTracksPIDIU; + Produces reducedCollisions; + Produces reducedPVMults; + Produces reducedCentFT0Cs; + Produces reducedDecay3Bodys; + Produces reducedFullTracksPIDIU; Service ccdb; Zorro zorro; @@ -274,7 +274,7 @@ struct reduced3bodyCreator { collision.collisionTime(), collision.collisionTimeRes(), runNumber); reducedPVMults(collision.multNTracksPV()); - reducedCentFTOCs(collision.centFT0C()); + reducedCentFT0Cs(collision.centFT0C()); lastCollisionID = collision.globalIndex(); } @@ -308,7 +308,7 @@ struct reduced3bodyCreator { }; struct reduced3bodyInitializer { - Spawns reducedTracksIU; + Spawns reducedTracksIU; void init(InitContext const&) {} }; diff --git a/PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx b/PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx index 8ec606b064b..5405bbb81f4 100644 --- a/PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx +++ b/PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx @@ -43,7 +43,7 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; -using ReducedCols = soa::Join; +using ReducedCols = soa::Join; using FullTracksExtIU = soa::Join; using MCLabeledTracksIU = soa::Join; @@ -562,9 +562,9 @@ struct ThreebodyRecoTask { template void reducedAnalysis(TCollisionTable const& collision, TCandTable const& candData, TTracks tracks, bool isTrueCand = false, int lLabel = -1, TLorentzVector lmother = {0, 0, 0, 0}, double MClifetime = -1) { - auto track0 = tracks.iteratorAt(candData.track0Id()); - auto track1 = tracks.iteratorAt(candData.track1Id()); - auto track2 = tracks.iteratorAt(candData.track2Id()); + auto track0 = tracks.rawIteratorAt(candData.track0Id()); + auto track1 = tracks.rawIteratorAt(candData.track1Id()); + auto track2 = tracks.rawIteratorAt(candData.track2Id()); bool isMatter = track2.sign() > 0; // true if the candidate is hypertriton (p pi- d) @@ -582,9 +582,9 @@ struct ThreebodyRecoTask { template void reducedLikeSignAnalysis(TCollisionTable const& collision, TCandTable const& candData, TTracks tracks, bool isTrueCand = false, int lLabel = -1, TLorentzVector lmother = {0, 0, 0, 0}, double MClifetime = -1) { - auto track0 = tracks.iteratorAt(candData.track0Id()); - auto track1 = tracks.iteratorAt(candData.track1Id()); - auto track2 = tracks.iteratorAt(candData.track2Id()); + auto track0 = tracks.rawIteratorAt(candData.track0Id()); + auto track1 = tracks.rawIteratorAt(candData.track1Id()); + auto track2 = tracks.rawIteratorAt(candData.track2Id()); bool isMatter = track2.sign() < 0; // true if seach for background consists of (p pi- anti-d) @@ -701,16 +701,16 @@ struct ThreebodyRecoTask { //------------------------------------------------------------------ // process reduced data analysis - void processReducedData(ReducedCols const& collisions, aod::Vtx3BodyDatas const& vtx3bodydatas, aod::ReducedTracksIU const& tracks) + void processReducedData(ReducedCols const& collisions, aod::Vtx3BodyDatas const& vtx3bodydatas, aod::RedIUTracks const& tracks) { candidates3body.clear(); for (const auto& vtx : vtx3bodydatas) { const auto& collision = collisions.iteratorAt(vtx.collisionId()); if (cfgLikeSignAnalysis) { - reducedLikeSignAnalysis(collision, vtx, tracks); + reducedLikeSignAnalysis(collision, vtx, tracks); } else { - reducedAnalysis(collision, vtx, tracks); + reducedAnalysis(collision, vtx, tracks); } for (const auto& cand3body : candidates3body) { fillOutputDataTable(cand3body); From fe52354313ec503952f102340f7bfc2174aee27a Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Fri, 21 Feb 2025 02:36:02 +0900 Subject: [PATCH 0354/1650] [PWGEM/Dilepton] fix in treeCreatorElectronMLDDA.cxx (#10099) --- .../TableProducer/treeCreatorElectronMLDDA.cxx | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx index 16af43fc05a..870dd58ed48 100644 --- a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx +++ b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx @@ -640,26 +640,27 @@ struct TreeCreatorElectronMLDDA { continue; } - if (v0cuts.cfg_min_mass_lambda < cascade.mLambda() && cascade.mLambda() < v0cuts.cfg_max_mass_lambda) { - continue; - } - if (bachelor.sign() < 0) { // omega -> L + K- -> p + pi- + K- - if (IsProtonTight(pos) || IsPionTight(neg)) { + if (bachelor.sign() < 0) { // Omega- -> L + K- -> p + pi- + K- + if (!IsProtonTight(pos) || !IsPionTight(neg)) { continue; } - } else { // omegabar -> Lbar + K+ -> pbar + pi+ + K+ - if (IsProtonTight(neg) || IsPionTight(pos)) { + } else { // Omegabar+ -> Lbar + K+ -> pbar + pi+ + K+ + if (!IsProtonTight(neg) || !IsPionTight(pos)) { continue; } } + registry.fill(HIST("Cascade/hMassLambda"), cascade.mLambda()); + if (!(v0cuts.cfg_min_mass_lambda < cascade.mLambda() && cascade.mLambda() < v0cuts.cfg_max_mass_lambda)) { + continue; + } + if (cascade.cascradius() > cascade.v0radius()) { continue; } registry.fill(HIST("Cascade/hV0PCA"), cascade.dcaV0daughters()); registry.fill(HIST("Cascade/hV0CosPA"), cascade.v0cosPA(collision.posX(), collision.posY(), collision.posZ())); - registry.fill(HIST("Cascade/hMassLambda"), cascade.mLambda()); registry.fill(HIST("Cascade/hPCA"), cascade.dcacascdaughters()); // distance between bachelor and V0. registry.fill(HIST("Cascade/hCosPA"), cascade.casccosPA(collision.posX(), collision.posY(), collision.posZ())); From 462a831091b595dcbb06c23cc102a80ac0492677 Mon Sep 17 00:00:00 2001 From: Zuzanna Chochulska <87480906+zchochul@users.noreply.github.com> Date: Thu, 20 Feb 2025 19:01:46 +0100 Subject: [PATCH 0355/1650] [PWGCF] FemtoUniverse -- Another efficiency fix + additional plots for the hadron (#10115) Co-authored-by: Zuzanna Chochulska <01150674@pw.edu.pl> --- .../Tasks/femtoUniversePairTaskTrackPhi.cxx | 45 ++++++++++--------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx index d1154b75a25..62d54676197 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx @@ -29,7 +29,7 @@ #include "PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h" #include "PWGCF/FemtoUniverse/Core/FemtoUniverseEventHisto.h" #include "PWGCF/FemtoUniverse/Core/FemtoUniversePairCleaner.h" -#include "PWGCF/FemtoUniverse/Core/FemtoUniverseAngularContainer.h" +#include "PWGCF/FemtoUniverse/Core/FemtoUniverseContainer.h" #include "PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h" #include "PWGCF/FemtoUniverse/Core/FemtoUniverseTrackSelection.h" #include "PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCalculator.h" @@ -132,11 +132,12 @@ struct FemtoUniversePairTaskTrackPhi { Partition> partsKaonsMC = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kTrack)); /// Histogramming for particle 1 - FemtoUniverseParticleHisto trackHistoPartTrack; + FemtoUniverseParticleHisto trackHistoPartTrack; FemtoUniverseParticleHisto hMCTruth1; + FemtoUniverseParticleHisto hTrackDCA; /// Histogramming for particle 2 - FemtoUniverseParticleHisto trackHistoPartPhi; + FemtoUniverseParticleHisto trackHistoPartPhi; FemtoUniverseParticleHisto hMCTruth2; /// Histogramming for Event @@ -147,6 +148,7 @@ struct FemtoUniversePairTaskTrackPhi { ConfigurableAxis confBinsTempFitVarInvMass{"confBinsTempFitVarInvMass", {6000, 0.9, 4.0}, "binning of the TempFitVar in the pT vs. TempFitVar plot"}; ConfigurableAxis confBinsTempFitVarpT{"confBinsTempFitVarpT", {20, 0.5, 4.05}, "pT binning of the pT vs. TempFitVar plot"}; ConfigurableAxis confBinsTempFitVarPDG{"confBinsTempFitVarPDG", {6000, -2300, 2300}, "Binning of the PDG code in the pT vs. TempFitVar plot"}; + ConfigurableAxis confBinsTempFitVarDCA{"confBinsTempFitVarDCA", {300, -3.0, 3.0}, "binning of the TempFitVar in the pT vs. TempFitVar plot"}; /// Correlation part ConfigurableAxis confBinsMult{"confBinsMult", {VARIABLE_WIDTH, 0.0f, 4.0f, 8.0f, 12.0f, 16.0f, 20.0f, 24.0f, 28.0f, 32.0f, 36.0f, 40.0f, 44.0f, 48.0f, 52.0f, 56.0f, 60.0f, 64.0f, 68.0f, 72.0f, 76.0f, 80.0f, 84.0f, 88.0f, 92.0f, 96.0f, 100.0f, 200.0f, 99999.f}, "Mixing bins - multiplicity"}; // \todo to be obtained from the hash task @@ -160,8 +162,8 @@ struct FemtoUniversePairTaskTrackPhi { ConfigurableAxis confBinskT{"confBinskT", {150, 0., 9.}, "binning kT"}; ConfigurableAxis confBinsmT{"confBinsmT", {225, 0., 7.5}, "binning mT"}; - FemtoUniverseAngularContainer sameEventAngularCont; - FemtoUniverseAngularContainer mixedEventAngularCont; + FemtoUniverseContainer sameEventCont; + FemtoUniverseContainer mixedEventCont; FemtoUniversePairCleaner pairCleaner; FemtoUniverseDetaDphiStar pairCloseRejection; FemtoUniverseTrackSelection trackCuts; @@ -173,6 +175,7 @@ struct FemtoUniversePairTaskTrackPhi { HistogramRegistry registryMCtruth{"registryMCtruth", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; HistogramRegistry registryMCreco{"registryMCreco", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; HistogramRegistry registryPhiMinvBackground{"registryPhiMinvBackground", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; + HistogramRegistry registryDCA{"registryDCA", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; Configurable confDoEfficiency{"confDoEfficiency", true, "Do efficiency corrections."}; EfficiencyConfigurableGroup effConfGroup; @@ -369,6 +372,9 @@ struct FemtoUniversePairTaskTrackPhi { hMCTruth1.init(&qaRegistry, confBinsTempFitVarpT, confBinsTempFitVarPDG, false, ConfTrack.confTrackPDGCode, false); hMCTruth2.init(&qaRegistry, confBinsTempFitVarpT, confBinsTempFitVarPDG, false, 333, false); } + if (ConfBothTracks.confIsMC) { + hTrackDCA.init(®istryDCA, confBinsTempFitVarpT, confBinsTempFitVar, true, ConfTrack.confTrackPDGCode, true); + } efficiencyCalculator.init(); eventHisto.init(&qaRegistry); @@ -434,11 +440,11 @@ struct FemtoUniversePairTaskTrackPhi { mixQaRegistry.add("MixingQA/hSECollisionBins", ";bin;Entries", kTH1F, {{120, -0.5, 119.5}}); mixQaRegistry.add("MixingQA/hMECollisionBins", ";bin;Entries", kTH1F, {{120, -0.5, 119.5}}); - sameEventAngularCont.init(&resultRegistry, confBinskstar, confBinsMult, confBinskT, confBinsmT, confBins3Dmult, confBins3DmT, ConfBothTracks.confBinsEta, ConfBothTracks.confBinsPhi, ConfBothTracks.confIsMC, ConfBothTracks.confUse3D); - mixedEventAngularCont.init(&resultRegistry, confBinskstar, confBinsMult, confBinskT, confBinsmT, confBins3Dmult, confBins3DmT, ConfBothTracks.confBinsEta, ConfBothTracks.confBinsPhi, ConfBothTracks.confIsMC, ConfBothTracks.confUse3D); + sameEventCont.init(&resultRegistry, confBinskstar, confBinsMult, confBinskT, confBinsmT, confBins3Dmult, confBins3DmT, ConfBothTracks.confBinsEta, ConfBothTracks.confBinsPhi, ConfBothTracks.confIsMC, ConfBothTracks.confUse3D); + mixedEventCont.init(&resultRegistry, confBinskstar, confBinsMult, confBinskT, confBinsmT, confBins3Dmult, confBins3DmT, ConfBothTracks.confBinsEta, ConfBothTracks.confBinsPhi, ConfBothTracks.confIsMC, ConfBothTracks.confUse3D); - sameEventAngularCont.setPDGCodes(333, ConfTrack.confTrackPDGCode.value); - mixedEventAngularCont.setPDGCodes(333, ConfTrack.confTrackPDGCode.value); + sameEventCont.setPDGCodes(333, ConfTrack.confTrackPDGCode.value); + mixedEventCont.setPDGCodes(333, ConfTrack.confTrackPDGCode.value); pairCleaner.init(&qaRegistry); if (ConfCPR.confCPRIsEnabled.value) { @@ -558,14 +564,12 @@ struct FemtoUniversePairTaskTrackPhi { continue; } - weight = 1.0f; - if (confDoEfficiency.value) { - weight = efficiencyCalculator.getWeight(ParticleNo::ONE, phicandidate) * efficiencyCalculator.getWeight(ParticleNo::TWO, track); - } + weight = efficiencyCalculator.getWeight(ParticleNo::ONE, phicandidate) * efficiencyCalculator.getWeight(ParticleNo::TWO, track); + if (swpart) - sameEventAngularCont.setPair(track, phicandidate, multCol, ConfBothTracks.confUse3D.value, weight); + sameEventCont.setPair(track, phicandidate, multCol, ConfBothTracks.confUse3D.value, weight); else - sameEventAngularCont.setPair(phicandidate, track, multCol, ConfBothTracks.confUse3D.value, weight); + sameEventCont.setPair(phicandidate, track, multCol, ConfBothTracks.confUse3D.value, weight); swpart = !swpart; } @@ -650,15 +654,12 @@ struct FemtoUniversePairTaskTrackPhi { } } - weight = 1.0f; - if (confDoEfficiency.value) { - weight = efficiencyCalculator.getWeight(ParticleNo::ONE, phicandidate) * efficiencyCalculator.getWeight(ParticleNo::TWO, track); - } + weight = efficiencyCalculator.getWeight(ParticleNo::ONE, phicandidate) * efficiencyCalculator.getWeight(ParticleNo::TWO, track); if (swpart) - mixedEventAngularCont.setPair(track, phicandidate, multCol, ConfBothTracks.confUse3D.value, weight); + mixedEventCont.setPair(track, phicandidate, multCol, ConfBothTracks.confUse3D.value, weight); else - mixedEventAngularCont.setPair(phicandidate, track, multCol, ConfBothTracks.confUse3D.value, weight); + mixedEventCont.setPair(phicandidate, track, multCol, ConfBothTracks.confUse3D.value, weight); swpart = !swpart; } @@ -771,6 +772,8 @@ struct FemtoUniversePairTaskTrackPhi { registryMCreco.fill(HIST("MCrecoPnegPt"), mcpart.pt()); } } + if (isParticleNSigmaAccepted(part.p(), trackCuts.getNsigmaTPC(part, o2::track::PID::Proton), trackCuts.getNsigmaTOF(part, o2::track::PID::Proton), trackCuts.getNsigmaTPC(part, o2::track::PID::Pion), trackCuts.getNsigmaTOF(part, o2::track::PID::Pion), trackCuts.getNsigmaTPC(part, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(part, o2::track::PID::Kaon))) + hTrackDCA.fillQA(part); } // partType kTrack } } From 0d10bf911968e96b2af069ab02bb5bce71732632 Mon Sep 17 00:00:00 2001 From: aferrero2707 Date: Thu, 20 Feb 2025 19:19:08 +0100 Subject: [PATCH 0356/1650] [Common] add utilities for event selection based on data quality (#9191) --- Common/CCDB/RCTSelectionFlags.h | 211 ++++++++++++++++++++++++++++++ Common/DataModel/EventSelection.h | 1 + 2 files changed, 212 insertions(+) create mode 100644 Common/CCDB/RCTSelectionFlags.h diff --git a/Common/CCDB/RCTSelectionFlags.h b/Common/CCDB/RCTSelectionFlags.h new file mode 100644 index 00000000000..1f396751c25 --- /dev/null +++ b/Common/CCDB/RCTSelectionFlags.h @@ -0,0 +1,211 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file RCTSelectionFlags.h +/// \brief RCT selection flags +/// +/// \author Andrea Ferrero and Evgeny Kryshen + +#ifndef COMMON_CCDB_RCTSELECTIONFLAGS_H_ +#define COMMON_CCDB_RCTSELECTIONFLAGS_H_ + +#include +#include +#include + +#include +#include +#include +#include + +namespace o2::aod::rctsel +{ +/* + * Bit mapping used for populating the CCDB objects from the RCT flags + * From https://github.com/JianLIUhep/RCTutils/blob/main/CCDB/process_and_upload.C +std::map> detailedBitMapping = { + {"CPV", { {"Bad", 0}, {"Invalid", 0} }}, + {"EMC", { {"Bad", 1}, {"NoDetectorData", 1}, {"BadEMCalorimetry", 1}, {"LimitedAcceptanceMCReproducible", 2} }}, + {"FDD", { {"Bad", 3}, {"Invalid", 3}, {"NoDetectorData", 3} }}, + {"FT0", { {"Bad", 4}, {"UnknownQuality", 4}, {"Unknown", 4} }}, + {"FV0", { {"Bad", 5} }}, + {"HMP", { {"Bad", 6}, {"NoDetectorData", 6} }}, + {"ITS", { {"Bad", 7}, {"UnknownQuality", 7}, {"BadTracking", 7}, {"LimitedAcceptanceMCReproducible", 8} }}, + {"MCH", { {"Bad", 9}, {"NoDetectorData", 9}, {"Unknown", 9}, {"LimitedAcceptanceMCReproducible", 10} }}, + {"MFT", { {"Bad", 11}, {"BadTracking", 11}, {"LimitedAcceptanceMCReproducible", 12} }}, + {"MID", { {"Bad", 13}, {"BadTracking", 13}, {"LimitedAcceptanceMCReproducible", 14} }}, + {"PHS", { {"Bad", 15}, {"Invalid", 15} }}, + {"TOF", { {"Bad", 16}, {"NoDetectorData", 16}, {"BadPID", 16}, {"LimitedAcceptanceMCReproducible", 17} }}, + {"TPC", { {"Bad", 18}, {"BadTracking", 18}, {"BadPID", 19}, {"LimitedAcceptanceMCNotReproducible", 18}, {"LimitedAcceptanceMCReproducible", 20} }}, + {"TRD", { {"Bad", 21}, {"BadTracking", 21} }}, + {"ZDC", { {"Bad", 22}, {"UnknownQuality", 22}, {"Unknown", 22}, {"NoDetectorData", 22} }} +}; +*/ + +// RCT selection flags +enum RCTSelectionFlags { + kCPVBad = 0, + kEMCBad, + kEMCLimAccMCRepr, + kFDDBad, + kFT0Bad, + kFV0Bad, + kHMPBad, + kITSBad, + kITSLimAccMCRepr, + kMCHBad, + kMCHLimAccMCRepr, + kMFTBad, + kMFTLimAccMCRepr, + kMIDBad, + kMIDLimAccMCRepr, + kPHSBad, + kTOFBad, + kTOFLimAccMCRepr, + kTPCBadTracking, + kTPCBadPID, + kTPCLimAccMCRepr, + kTRDBad, + kZDCBad, + kNRCTSelectionFlags +}; + +template +concept HasRCTFlags = requires(T a, int bit) { + { a.rct_bit(bit) } -> std::convertible_to; + { a.rct_raw() } -> std::convertible_to; +}; + +class RCTFlagsChecker : public o2::utils::EnumFlags +{ + public: + RCTFlagsChecker() = default; + + // Construct the object from an initializer list, like this: + // RCTFlagsChecker qualityFlagsChecker{ kFT0Bad, kITSBad, kMFTBad, kMFTLimAccMCRepr }; + using o2::utils::EnumFlags::EnumFlags; + + // Construct the object from one of the pre-defined runlist selections. + // The label parameter can take the following values: + // - "CBT" + // - "CBT_hadronPID" + // - "CBT_electronPID" + // - "CCBT_calo" + // - "CBT_muon" + // - "CBT_muon_glo" + // The checkZDC boolean flag controls whether to iclude the ZDC quality in all the pre-defined selections (for Pb-Pb data) + // The treatLimitedAcceptanceAsBad boolean flag controls whether "LimitedAcceptanceMCReproducible" flags should be + // treated as Bad and the corresponding events excluded + explicit RCTFlagsChecker(const std::string& label, bool checkZDC = false, bool treatLimitedAcceptanceAsBad = false) + { + init(label, checkZDC, treatLimitedAcceptanceAsBad); + } + + // Initialize the object from an initializer list of RCTSelectionFlags values + void init(std::initializer_list flags) + { + reset(); + *this = RCTFlagsChecker(flags); + } + + // Initialize the object from one of the pre-defined runlist selections. + // The label parameter can take the following values: + // - "CBT" + // - "CBT_hadronPID" + // - "CBT_electronPID" + // - "CCBT_calo" + // - "CBT_muon" + // - "CBT_muon_glo" + // The checkZDC boolean flag controls whether to iclude the ZDC quality in all the pre-defined selections (for Pb-Pb data) + // The treatLimitedAcceptanceAsBad boolean flag controls whether "LimitedAcceptanceMCReproducible" flags should be + // treated as Bad and the corresponding events excluded + void init(const std::string& label, bool checkZDC = false, bool treatLimitedAcceptanceAsBad = false) + { + auto setFlags = [this](std::initializer_list flags) { + std::for_each(flags.begin(), + flags.end(), + [this](const RCTSelectionFlags f) noexcept { set(f); }); + }; + + reset(); + + if (label == "CBT") { + setFlags({kFT0Bad, kITSBad, kTPCBadTracking, kTPCBadPID}); + if (treatLimitedAcceptanceAsBad) { + setFlags({kITSLimAccMCRepr, kTPCLimAccMCRepr}); + } + } + + if (label == "CBT_hadronPID") { + setFlags({kFT0Bad, kITSBad, kTPCBadTracking, kTPCBadPID, kTOFBad}); + if (treatLimitedAcceptanceAsBad) { + setFlags({kITSLimAccMCRepr, kTPCLimAccMCRepr, kTOFLimAccMCRepr}); + } + } + + if (label == "CBT_electronPID") { + setFlags({kFT0Bad, kITSBad, kTPCBadTracking, kTPCBadPID, kTRDBad}); + if (treatLimitedAcceptanceAsBad) { + setFlags({kITSLimAccMCRepr, kTPCLimAccMCRepr}); + } + } + + if (label == "CBT_calo") { + setFlags({kFT0Bad, kITSBad, kTPCBadTracking, kTPCBadPID, kEMCBad}); + if (treatLimitedAcceptanceAsBad) { + setFlags({kITSLimAccMCRepr, kTPCLimAccMCRepr, kEMCLimAccMCRepr}); + } + } + + if (label == "CBT_muon") { + setFlags({kFT0Bad, kITSBad, kTPCBadTracking, kMCHBad, kMIDBad}); + if (treatLimitedAcceptanceAsBad) { + setFlags({kITSLimAccMCRepr, kTPCLimAccMCRepr, kMCHLimAccMCRepr, kMIDLimAccMCRepr}); + } + } + + if (label == "CBT_muon_glo") { + setFlags({kFT0Bad, kITSBad, kTPCBadTracking, kMCHBad, kMIDBad, kMFTBad}); + if (treatLimitedAcceptanceAsBad) { + setFlags({kITSLimAccMCRepr, kTPCLimAccMCRepr, kMCHLimAccMCRepr, kMIDLimAccMCRepr, kMFTLimAccMCRepr}); + } + } + + if (checkZDC) { + set(kZDCBad); + } + } + + // Check the RCT column of a given event selection table. + // The function returns true if none of the checked flags is set in the RCT column. + bool checkTable(const HasRCTFlags auto& table) + { + if (!any()) { + throw std::out_of_range("RCTFlagsCheckerAlt with empty RCTSelectionFlags bits mask"); + } + + // bitmask of the current table + uint64_t tableBits = table.rct_raw(); + // bitmask of flags to be checked + uint64_t flagsBits = value(); + + // return true if none of the checked bits is set in the table bitmask + return ((tableBits & flagsBits) == 0); + } + + bool operator()(const HasRCTFlags auto& table) + { + return checkTable(table); + } +}; + +} // namespace o2::aod::rctsel +#endif // COMMON_CCDB_RCTSELECTIONFLAGS_H_ diff --git a/Common/DataModel/EventSelection.h b/Common/DataModel/EventSelection.h index 851febde327..77849d0d7cf 100644 --- a/Common/DataModel/EventSelection.h +++ b/Common/DataModel/EventSelection.h @@ -20,6 +20,7 @@ #include "Framework/AnalysisDataModel.h" #include "Common/CCDB/TriggerAliases.h" #include "Common/CCDB/EventSelectionParams.h" +#include "Common/CCDB/RCTSelectionFlags.h" namespace o2::aod { From 0412a4acd72861b055cebd678f3db353d162e38a Mon Sep 17 00:00:00 2001 From: sawan <124118453+sawankumawat@users.noreply.github.com> Date: Fri, 21 Feb 2025 00:07:45 +0530 Subject: [PATCH 0357/1650] [PWGLF] Added decay pair angular separation cut (#10116) --- .../Tasks/Resonances/higherMassResonances.cxx | 242 ++++++++++-------- 1 file changed, 141 insertions(+), 101 deletions(-) diff --git a/PWGLF/Tasks/Resonances/higherMassResonances.cxx b/PWGLF/Tasks/Resonances/higherMassResonances.cxx index 4814eb394bc..4d042e372bd 100644 --- a/PWGLF/Tasks/Resonances/higherMassResonances.cxx +++ b/PWGLF/Tasks/Resonances/higherMassResonances.cxx @@ -69,7 +69,7 @@ struct HigherMassResonances { // PID and QA Configurable qAv0{"qAv0", false, "qAv0"}; Configurable qAPID{"qAPID", true, "qAPID"}; - Configurable qAv0Daughters{"qAv0Daughters", false, "QA of v0 daughters"}; + // Configurable qAv0Daughters{"qAv0Daughters", false, "QA of v0 daughters"}; Configurable qAevents{"qAevents", false, "QA of events"}; // Configurable invMass1D{"invMass1D", false, "1D invariant mass histograms"}; Configurable correlation2Dhist{"correlation2Dhist", true, "Lamda K0 mass correlation"}; @@ -111,6 +111,8 @@ struct HigherMassResonances { Configurable confKsrapidity{"confKsrapidity", 0.5f, "Rapidity cut on K0s"}; // Configurable lowmasscutks0{"lowmasscutks0", 0.497 - 4 * 0.005, "Low mass cut on K0s"}; // Configurable highmasscutks0{"highmasscutks0", 0.497 + 4 * 0.005, "High mass cut on K0s"}; + Configurable applyAngSepCut{"applyAngSepCut", false, "Apply angular separation cut"}; + Configurable angSepCut{"angSepCut", 0.01f, "Angular separation cut"}; // Configurable for track selection and multiplicity Configurable cfgPTcut{"cfgPTcut", 0.2f, "Track PT cut"}; @@ -133,7 +135,7 @@ struct HigherMassResonances { Configurable cRotations{"cRotations", 3, "Number of random rotations in the rotational background"}; // Other cuts on Ks and glueball - Configurable rapidityks{"rapidityks", true, "rapidity cut on K0s"}; + // Configurable rapidityks{"rapidityks", true, "rapidity cut on K0s"}; Configurable applyCompetingcut{"applyCompetingcut", false, "Competing cascade rejection cut"}; Configurable competingcascrejlambda{"competingcascrejlambda", 0.005, "rejecting competing cascade lambda"}; Configurable competingcascrejlambdaanti{"competingcascrejlambdaanti", 0.005, "rejecting competing cascade anti-lambda"}; // If one of the pions is misidentified as a proton, then instead of Ks we reconstruct lambda, therefore the competing cascade rejection cut is applied in which if the reconstrcted mass of a pion and proton (which we are assuming to be misidentified as proton) is close to lambda or anti-lambda, then the track is rejected @@ -152,9 +154,9 @@ struct HigherMassResonances { Configurable ksMassBins{"ksMassBins", 200, "Number of mass bins for K0s"}; Configurable rotationalCut{"rotationalCut", 10, "Cut value (Rotation angle pi - pi/cut and pi + pi/cut)"}; ConfigurableAxis configThnAxisPOL{"configThnAxisPOL", {20, -1.0, 1.0}, "Costheta axis"}; - ConfigurableAxis axisdEdx{"axisdEdx", {20000, 0.0f, 200.0f}, "dE/dx (a.u.)"}; - ConfigurableAxis axisPtfordEbydx{"axisPtfordEbydx", {2000, 0, 20}, "pT (GeV/c)"}; - ConfigurableAxis axisMultdist{"axisMultdist", {3500, 0, 70000}, "Multiplicity distribution"}; + // ConfigurableAxis axisdEdx{"axisdEdx", {20000, 0.0f, 200.0f}, "dE/dx (a.u.)"}; + // ConfigurableAxis axisPtfordEbydx{"axisPtfordEbydx", {2000, 0, 20}, "pT (GeV/c)"}; + // ConfigurableAxis axisMultdist{"axisMultdist", {3500, 0, 70000}, "Multiplicity distribution"}; // ConfigurableAxis occupancyBins{"occupancyBins", {VARIABLE_WIDTH, 0.0, 100, 500, 600, 1000, 1100, 1500, 1600, 2000, 2100, 2500, 2600, 3000, 3100, 3500, 3600, 4000, 4100, 4500, 4600, 5000, 5100, 9999}, "Binning: occupancy axis"}; } config; @@ -208,10 +210,10 @@ struct HigherMassResonances { if (config.qAevents) { rEventSelection.add("hVertexZRec", "hVertexZRec", {HistType::kTH1F, {vertexZAxis}}); rEventSelection.add("hmultiplicity", "multiplicity percentile distribution", {HistType::kTH1F, {{150, 0.0f, 150.0f}}}); - rEventSelection.add("multdist_FT0M", "FT0M Multiplicity distribution", kTH1F, {config.axisMultdist}); - rEventSelection.add("multdist_FT0A", "FT0A Multiplicity distribution", kTH1F, {config.axisMultdist}); - rEventSelection.add("multdist_FT0C", "FT0C Multiplicity distribution", kTH1F, {config.axisMultdist}); - rEventSelection.add("hNcontributor", "Number of primary vertex contributor", kTH1F, {{2000, 0.0f, 10000.0f}}); + // rEventSelection.add("multdist_FT0M", "FT0M Multiplicity distribution", kTH1F, {config.axisMultdist}); + // rEventSelection.add("multdist_FT0A", "FT0A Multiplicity distribution", kTH1F, {config.axisMultdist}); + // rEventSelection.add("multdist_FT0C", "FT0C Multiplicity distribution", kTH1F, {config.axisMultdist}); + // rEventSelection.add("hNcontributor", "Number of primary vertex contributor", kTH1F, {{2000, 0.0f, 10000.0f}}); } hglue.add("h3glueInvMassDS", "h3glueInvMassDS", kTHnSparseF, {multiplicityAxis, ptAxis, glueballMassAxis, thnAxisPOL}, true); @@ -224,15 +226,15 @@ struct HigherMassResonances { // K0s topological/PID cuts if (config.correlation2Dhist) { rKzeroShort.add("mass_lambda_kshort_before", "mass under lambda hypotheses and Kshort mass", kTH2F, {{100, 0.2, 0.8}, {100, 0.9, 1.5}}); - rKzeroShort.add("mass_lambda_kshort_after1", "mass under lambda hypotheses and Kshort mass", kTH2F, {{100, 0.2, 0.8}, {100, 0.9, 1.5}}); - rKzeroShort.add("mass_lambda_kshort_after2", "mass under lambda hypotheses and Kshort mass", kTH2F, {{100, 0.2, 0.8}, {100, 0.9, 1.5}}); - rKzeroShort.add("mass_lambda_kshort_after3", "mass under lambda hypotheses and Kshort mass", kTH2F, {{100, 0.2, 0.8}, {100, 0.9, 1.5}}); - rKzeroShort.add("mass_lambda_kshort_after4", "mass under lambda hypotheses and Kshort mass", kTH2F, {{100, 0.2, 0.8}, {100, 0.9, 1.5}}); - rKzeroShort.add("mass_lambda_kshort_after5", "mass under lambda hypotheses and Kshort mass", kTH2F, {{100, 0.2, 0.8}, {100, 0.9, 1.5}}); - rKzeroShort.add("mass_lambda_kshort_after6", "mass under lambda hypotheses and Kshort mass", kTH2F, {{100, 0.2, 0.8}, {100, 0.9, 1.5}}); - rKzeroShort.add("mass_lambda_kshort_after7", "mass under lambda hypotheses and Kshort mass", kTH2F, {{100, 0.2, 0.8}, {100, 0.9, 1.5}}); - rKzeroShort.add("mass_lambda_kshort_after8", "mass under lambda hypotheses and Kshort mass", kTH2F, {{100, 0.2, 0.8}, {100, 0.9, 1.5}}); - rKzeroShort.add("mass_lambda_kshort_after9", "mass under lambda hypotheses and Kshort mass", kTH2F, {{100, 0.2, 0.8}, {100, 0.9, 1.5}}); + // rKzeroShort.add("mass_lambda_kshort_after1", "mass under lambda hypotheses and Kshort mass", kTH2F, {{100, 0.2, 0.8}, {100, 0.9, 1.5}}); + // rKzeroShort.add("mass_lambda_kshort_after2", "mass under lambda hypotheses and Kshort mass", kTH2F, {{100, 0.2, 0.8}, {100, 0.9, 1.5}}); + // rKzeroShort.add("mass_lambda_kshort_after3", "mass under lambda hypotheses and Kshort mass", kTH2F, {{100, 0.2, 0.8}, {100, 0.9, 1.5}}); + // rKzeroShort.add("mass_lambda_kshort_after4", "mass under lambda hypotheses and Kshort mass", kTH2F, {{100, 0.2, 0.8}, {100, 0.9, 1.5}}); + // rKzeroShort.add("mass_lambda_kshort_after5", "mass under lambda hypotheses and Kshort mass", kTH2F, {{100, 0.2, 0.8}, {100, 0.9, 1.5}}); + // rKzeroShort.add("mass_lambda_kshort_after6", "mass under lambda hypotheses and Kshort mass", kTH2F, {{100, 0.2, 0.8}, {100, 0.9, 1.5}}); + // rKzeroShort.add("mass_lambda_kshort_after7", "mass under lambda hypotheses and Kshort mass", kTH2F, {{100, 0.2, 0.8}, {100, 0.9, 1.5}}); + // rKzeroShort.add("mass_lambda_kshort_after8", "mass under lambda hypotheses and Kshort mass", kTH2F, {{100, 0.2, 0.8}, {100, 0.9, 1.5}}); + // rKzeroShort.add("mass_lambda_kshort_after9", "mass under lambda hypotheses and Kshort mass", kTH2F, {{100, 0.2, 0.8}, {100, 0.9, 1.5}}); rKzeroShort.add("mass_lambda_kshort_after10", "mass under lambda hypotheses and Kshort mass", kTH2F, {{100, 0.2, 0.8}, {100, 0.9, 1.5}}); } if (config.qAv0) { @@ -244,20 +246,21 @@ struct HigherMassResonances { rKzeroShort.add("hDCAV0Daughters", "DCA between v0 daughters", {HistType::kTH1F, {{60, -3.0f, 3.0f}}}); rKzeroShort.add("hV0CosPA", "hV0CosPA", {HistType::kTH1F, {{100, 0.96f, 1.1f}}}); rKzeroShort.add("hLT", "hLT", {HistType::kTH1F, {{100, 0.0f, 50.0f}}}); - rKzeroShort.add("Mass_lambda", "Mass under lambda hypothesis", kTH1F, {glueballMassAxis}); - rKzeroShort.add("mass_AntiLambda", "Mass under anti-lambda hypothesis", kTH1F, {glueballMassAxis}); - rKzeroShort.add("mass_Gamma", "Mass under Gamma hypothesis", kTH1F, {glueballMassAxis}); + rKzeroShort.add("angularSeparation", "Angular separation between two K0s", {HistType::kTH1F, {{200, 0.0f, 4.0f}}}); + // rKzeroShort.add("Mass_lambda", "Mass under lambda hypothesis", kTH1F, {glueballMassAxis}); + // rKzeroShort.add("mass_AntiLambda", "Mass under anti-lambda hypothesis", kTH1F, {glueballMassAxis}); + // rKzeroShort.add("mass_Gamma", "Mass under Gamma hypothesis", kTH1F, {glueballMassAxis}); // rKzeroShort.add("mass_Hypertriton", "Mass under hypertriton hypothesis", kTH1F, {glueballMassAxis}); // rKzeroShort.add("mass_AnitHypertriton", "Mass under anti-hypertriton hypothesis", kTH1F, {glueballMassAxis}); - rKzeroShort.add("rapidity", "Rapidity distribution", kTH1F, {{100, -1.0f, 1.0f}}); - rKzeroShort.add("hv0radius", "hv0radius", kTH1F, {{100, 0.0f, 200.0f}}); - rKzeroShort.add("hDCApostopv", "DCA positive daughter to PV", kTH1F, {{1000, -10.0f, 10.0f}}); - rKzeroShort.add("hDCAnegtopv", "DCA negative daughter to PV", kTH1F, {{1000, -10.0f, 10.0f}}); - rKzeroShort.add("hcDCAv0topv", "DCA V0 to PV", kTH1F, {{60, -3.0f, 3.0f}}); - rKzeroShort.add("halpha", "Armenteros alpha", kTH1F, {{100, -5.0f, 5.0f}}); - rKzeroShort.add("hqtarmbyalpha", "qtarm/alpha", kTH1F, {{100, 0.0f, 1.0f}}); - rKzeroShort.add("hpsipair", "psi pair angle", kTH1F, {{100, -5.0f, 5.0f}}); + // rKzeroShort.add("rapidity", "Rapidity distribution", kTH1F, {{100, -1.0f, 1.0f}}); + // rKzeroShort.add("hv0radius", "hv0radius", kTH1F, {{100, 0.0f, 200.0f}}); + // rKzeroShort.add("hDCApostopv", "DCA positive daughter to PV", kTH1F, {{1000, -10.0f, 10.0f}}); + // rKzeroShort.add("hDCAnegtopv", "DCA negative daughter to PV", kTH1F, {{1000, -10.0f, 10.0f}}); + // rKzeroShort.add("hcDCAv0topv", "DCA V0 to PV", kTH1F, {{60, -3.0f, 3.0f}}); + // rKzeroShort.add("halpha", "Armenteros alpha", kTH1F, {{100, -5.0f, 5.0f}}); + // rKzeroShort.add("hqtarmbyalpha", "qtarm/alpha", kTH1F, {{100, 0.0f, 1.0f}}); + // rKzeroShort.add("hpsipair", "psi pair angle", kTH1F, {{100, -5.0f, 5.0f}}); // // Topological histograms (before the selection) // rKzeroShort.add("hDCAV0Daughters_before", "DCA between v0 daughters before the selection", {HistType::kTH1F, {{60, -3.0f, 3.0f}}}); @@ -268,19 +271,19 @@ struct HigherMassResonances { if (config.qAPID) { rKzeroShort.add("hNSigmaPosPionK0s_before", "hNSigmaPosPionK0s_before", {HistType::kTH2F, {{ptAxis}, {100, -5.f, 5.f}}}); - // rKzeroShort.add("hNSigmaPosPionK0s_after", "hNSigmaPosPionK0s_after", {HistType::kTH2F, {{ptAxis}, {100, -5.f, 5.f}}}); + rKzeroShort.add("hNSigmaPosPionK0s_after", "hNSigmaPosPionK0s_after", {HistType::kTH2F, {{ptAxis}, {100, -5.f, 5.f}}}); rKzeroShort.add("hNSigmaNegPionK0s_before", "hNSigmaNegPionK0s_before", {HistType::kTH2F, {{ptAxis}, {100, -5.f, 5.f}}}); - // rKzeroShort.add("hNSigmaNegPionK0s_after", "hNSigmaNegPionK0s_after", {HistType::kTH2F, {{ptAxis}, {100, -5.f, 5.f}}}); - rKzeroShort.add("dE_by_dx_TPC", "dE/dx signal in the TPC as a function of pT", kTH2F, {config.axisPtfordEbydx, config.axisdEdx}); - } - if (config.qAv0Daughters) { - rKzeroShort.add("negative_pt", "Negative daughter pT", kTH1F, {ptAxis}); - rKzeroShort.add("positive_pt", "Positive daughter pT", kTH1F, {ptAxis}); - rKzeroShort.add("negative_eta", "Negative daughter eta", kTH1F, {{100, -1.0f, 1.0f}}); - rKzeroShort.add("positive_eta", "Positive daughter eta", kTH1F, {{100, -1.0f, 1.0f}}); - rKzeroShort.add("negative_phi", "Negative daughter phi", kTH1F, {{70, 0.0f, 7.0f}}); - rKzeroShort.add("positive_phi", "Positive daughter phi", kTH1F, {{70, 0.0f, 7.0f}}); + rKzeroShort.add("hNSigmaNegPionK0s_after", "hNSigmaNegPionK0s_after", {HistType::kTH2F, {{ptAxis}, {100, -5.f, 5.f}}}); + // rKzeroShort.add("dE_by_dx_TPC", "dE/dx signal in the TPC as a function of pT", kTH2F, {config.axisPtfordEbydx, config.axisdEdx}); } + // if (config.qAv0Daughters) { + // rKzeroShort.add("negative_pt", "Negative daughter pT", kTH1F, {ptAxis}); + // rKzeroShort.add("positive_pt", "Positive daughter pT", kTH1F, {ptAxis}); + // rKzeroShort.add("negative_eta", "Negative daughter eta", kTH1F, {{100, -1.0f, 1.0f}}); + // rKzeroShort.add("positive_eta", "Positive daughter eta", kTH1F, {{100, -1.0f, 1.0f}}); + // rKzeroShort.add("negative_phi", "Negative daughter phi", kTH1F, {{70, 0.0f, 7.0f}}); + // rKzeroShort.add("positive_phi", "Positive daughter phi", kTH1F, {{70, 0.0f, 7.0f}}); + // } // For MC hMChists.add("events_check", "No. of events in the generated MC", kTH1I, {{20, 0, 20}}); @@ -293,14 +296,17 @@ struct HigherMassResonances { hMChists.add("Recf1710_mass", "Rec f_{0}(1710) mass", kTH1F, {glueballMassAxis}); hMChists.add("Genf1710_mass", "Gen f_{0}(1710) mass", kTH1F, {glueballMassAxis}); - hMChists.add("GenEta", "Gen Eta", kTH1F, {{100, -1.0f, 1.0f}}); + hMChists.add("GenEta", "Gen Eta", kTHnSparseF, {ptAxis, {100, -1.0f, 1.0f}}); hMChists.add("GenPhi", "Gen Phi", kTH1F, {{70, -3.5f, 3.5f}}); - hMChists.add("GenRapidity", "Gen Rapidity", kTH1F, {{100, -1.0f, 1.0f}}); + hMChists.add("GenRapidity", "Gen Rapidity", kTHnSparseF, {ptAxis, {100, -1.0f, 1.0f}}); hMChists.add("RecEta", "Rec Eta", kTH1F, {{100, -1.0f, 1.0f}}); hMChists.add("RecPhi", "Rec Phi", kTH1F, {{70, 0.0f, 7.0f}}); hMChists.add("RecRapidity", "Rec Rapidity", kTH1F, {{100, -1.0f, 1.0f}}); hMChists.add("MC_mult", "Multiplicity in MC", kTH1F, {multiplicityAxis}); hMChists.add("MC_mult_after_event_sel", "Multiplicity in MC", kTH1F, {multiplicityAxis}); + // hMChists.add("GenPx", "Gen Px", kTH1F, {{100, -10.0f, 10.0f}}); + // hMChists.add("GenPy", "Gen Py", kTH1F, {{100, -10.0f, 10.0f}}); + // hMChists.add("GenPz", "Gen Pz", kTH1F, {{100, -10.0f, 10.0f}}); } template @@ -358,19 +364,19 @@ struct HigherMassResonances { rKzeroShort.fill(HIST("hLT"), ctauK0s); rKzeroShort.fill(HIST("hDCAV0Daughters"), candidate.dcaV0daughters()); rKzeroShort.fill(HIST("hV0CosPA"), candidate.v0cosPA()); - rKzeroShort.fill(HIST("Mass_lambda"), candidate.mLambda()); - rKzeroShort.fill(HIST("mass_AntiLambda"), candidate.mAntiLambda()); - rKzeroShort.fill(HIST("mass_Gamma"), candidate.mGamma()); + // rKzeroShort.fill(HIST("Mass_lambda"), candidate.mLambda()); + // rKzeroShort.fill(HIST("mass_AntiLambda"), candidate.mAntiLambda()); + // rKzeroShort.fill(HIST("mass_Gamma"), candidate.mGamma()); // rKzeroShort.fill(HIST("mass_Hypertriton"), candidate.mHypertriton()); // rKzeroShort.fill(HIST("mass_AnitHypertriton"), candidate.mAntiHypertriton()); - rKzeroShort.fill(HIST("rapidity"), candidate.yK0Short()); - rKzeroShort.fill(HIST("hv0radius"), candidate.v0radius()); - rKzeroShort.fill(HIST("hDCApostopv"), candidate.dcapostopv()); - rKzeroShort.fill(HIST("hDCAnegtopv"), candidate.dcanegtopv()); - rKzeroShort.fill(HIST("hcDCAv0topv"), candidate.dcav0topv()); - rKzeroShort.fill(HIST("halpha"), candidate.alpha()); - rKzeroShort.fill(HIST("hqtarmbyalpha"), arm); - rKzeroShort.fill(HIST("hpsipair"), candidate.psipair()); + // rKzeroShort.fill(HIST("rapidity"), candidate.yK0Short()); + // rKzeroShort.fill(HIST("hv0radius"), candidate.v0radius()); + // rKzeroShort.fill(HIST("hDCApostopv"), candidate.dcapostopv()); + // rKzeroShort.fill(HIST("hDCAnegtopv"), candidate.dcanegtopv()); + // rKzeroShort.fill(HIST("hcDCAv0topv"), candidate.dcav0topv()); + // rKzeroShort.fill(HIST("halpha"), candidate.alpha()); + // rKzeroShort.fill(HIST("hqtarmbyalpha"), arm); + // rKzeroShort.fill(HIST("hpsipair"), candidate.psipair()); } if (config.correlation2Dhist) rKzeroShort.fill(HIST("mass_lambda_kshort_before"), candidate.mK0Short(), candidate.mLambda()); @@ -381,64 +387,67 @@ struct HigherMassResonances { return false; } hglue.fill(HIST("htrackscheck_v0"), 1.5); - if (config.correlation2Dhist) - rKzeroShort.fill(HIST("mass_lambda_kshort_after1"), candidate.mK0Short(), candidate.mLambda()); + // if (config.correlation2Dhist) + // rKzeroShort.fill(HIST("mass_lambda_kshort_after1"), candidate.mK0Short(), candidate.mLambda()); - if (config.rapidityks && std::abs(candidate.yK0Short()) >= config.confKsrapidity) { + // if (config.rapidityks && std::abs(candidate.yK0Short()) >= config.confKsrapidity) { + // return false; + // } + if (std::abs(candidate.yK0Short()) >= config.confKsrapidity) { return false; } hglue.fill(HIST("htrackscheck_v0"), 2.5); - if (config.correlation2Dhist) - rKzeroShort.fill(HIST("mass_lambda_kshort_after2"), candidate.mK0Short(), candidate.mLambda()); + // if (config.correlation2Dhist) + // rKzeroShort.fill(HIST("mass_lambda_kshort_after2"), candidate.mK0Short(), candidate.mLambda()); if (pT < config.confV0PtMin) { return false; } hglue.fill(HIST("htrackscheck_v0"), 3.5); - if (config.correlation2Dhist) - rKzeroShort.fill(HIST("mass_lambda_kshort_after3"), candidate.mK0Short(), candidate.mLambda()); + // if (config.correlation2Dhist) + // rKzeroShort.fill(HIST("mass_lambda_kshort_after3"), candidate.mK0Short(), candidate.mLambda()); if (dcaDaughv0 > config.confV0DCADaughMax) { return false; } hglue.fill(HIST("htrackscheck_v0"), 4.5); - if (config.correlation2Dhist) - rKzeroShort.fill(HIST("mass_lambda_kshort_after4"), candidate.mK0Short(), candidate.mLambda()); + // if (config.correlation2Dhist) + // rKzeroShort.fill(HIST("mass_lambda_kshort_after4"), candidate.mK0Short(), candidate.mLambda()); if (cpav0 < config.confV0CPAMin) { return false; } hglue.fill(HIST("htrackscheck_v0"), 5.5); - if (config.correlation2Dhist) - rKzeroShort.fill(HIST("mass_lambda_kshort_after5"), candidate.mK0Short(), candidate.mLambda()); + // if (config.correlation2Dhist) + // rKzeroShort.fill(HIST("mass_lambda_kshort_after5"), candidate.mK0Short(), candidate.mLambda()); if (tranRad < config.confV0TranRadV0Min) { return false; } hglue.fill(HIST("htrackscheck_v0"), 6.5); - if (config.correlation2Dhist) - rKzeroShort.fill(HIST("mass_lambda_kshort_after6"), candidate.mK0Short(), candidate.mLambda()); + // if (config.correlation2Dhist) + // rKzeroShort.fill(HIST("mass_lambda_kshort_after6"), candidate.mK0Short(), candidate.mLambda()); if (tranRad > config.confV0TranRadV0Max) { return false; } hglue.fill(HIST("htrackscheck_v0"), 7.5); - if (config.correlation2Dhist) - rKzeroShort.fill(HIST("mass_lambda_kshort_after7"), candidate.mK0Short(), candidate.mLambda()); + // if (config.correlation2Dhist) + // rKzeroShort.fill(HIST("mass_lambda_kshort_after7"), candidate.mK0Short(), candidate.mLambda()); if (std::fabs(ctauK0s) > config.cMaxV0LifeTime) { return false; } hglue.fill(HIST("htrackscheck_v0"), 8.5); - if (config.correlation2Dhist) - rKzeroShort.fill(HIST("mass_lambda_kshort_after8"), candidate.mK0Short(), candidate.mLambda()); + // if (config.correlation2Dhist) + // rKzeroShort.fill(HIST("mass_lambda_kshort_after8"), candidate.mK0Short(), candidate.mLambda()); if (config.armcut && arm < config.confarmcut) { return false; } hglue.fill(HIST("htrackscheck_v0"), 9.5); - if (config.correlation2Dhist) - rKzeroShort.fill(HIST("mass_lambda_kshort_after9"), candidate.mK0Short(), candidate.mLambda()); + // if (config.correlation2Dhist) + // rKzeroShort.fill(HIST("mass_lambda_kshort_after9"), candidate.mK0Short(), candidate.mLambda()); // if (config.applyCompetingcut && (std::abs(candidate.mLambda() - PDGdatabase->Mass(3122)) <= config.competingcascrejlambda || std::abs(candidate.mAntiLambda() - PDGdatabase->Mass(-3122)) <= config.competingcascrejlambdaanti)) if (config.applyCompetingcut && (std::abs(candidate.mLambda() - o2::constants::physics::MassLambda0) <= config.competingcascrejlambda || std::abs(candidate.mAntiLambda() - o2::constants::physics::MassLambda0) <= config.competingcascrejlambdaanti)) { @@ -465,7 +474,7 @@ struct HigherMassResonances { if (config.qAPID) { // Filling the PID of the V0 daughters in the region of the K0 peak. (charge == 1) ? rKzeroShort.fill(HIST("hNSigmaPosPionK0s_before"), track.tpcInnerParam(), track.tpcNSigmaPi()) : rKzeroShort.fill(HIST("hNSigmaNegPionK0s_before"), track.tpcInnerParam(), track.tpcNSigmaPi()); - rKzeroShort.fill(HIST("dE_by_dx_TPC"), track.p(), track.tpcSignal()); + // rKzeroShort.fill(HIST("dE_by_dx_TPC"), track.p(), track.tpcSignal()); } const auto eta = track.eta(); const auto tpcNClsF = track.tpcNClsFound(); @@ -516,6 +525,31 @@ struct HigherMassResonances { } hglue.fill(HIST("htrackscheck_v0_daughters"), 8.5); + if (config.qAPID) { + (charge == 1) ? rKzeroShort.fill(HIST("hNSigmaPosPionK0s_after"), track.tpcInnerParam(), track.tpcNSigmaPi()) : rKzeroShort.fill(HIST("hNSigmaNegPionK0s_after"), track.tpcInnerParam(), track.tpcNSigmaPi()); + } + + return true; + } + + // Angular separation cut on KsKs pairs + template + bool applyAngSep(const T1& candidate1, const T2& candidate2) + { + double p1, p2, px1, px2, py1, py2, pz1, pz2, angle; + px1 = candidate1.px(); + px2 = candidate2.px(); + py1 = candidate1.py(); + py2 = candidate2.py(); + pz1 = candidate1.pz(); + pz2 = candidate2.pz(); + p1 = candidate1.p(); + p2 = candidate2.p(); + angle = std::acos((px1 * px2 + py1 * py2 + pz1 * pz2) / (p1 * p2)); + rKzeroShort.fill(HIST("angularSeparation"), angle); + if (config.applyAngSepCut && angle < config.angSepCut) { + return false; + } return true; } @@ -630,10 +664,10 @@ struct HigherMassResonances { if (config.qAevents) { rEventSelection.fill(HIST("hVertexZRec"), collision.posZ()); rEventSelection.fill(HIST("hmultiplicity"), multiplicity); - rEventSelection.fill(HIST("multdist_FT0M"), collision.multFT0M()); - rEventSelection.fill(HIST("multdist_FT0A"), collision.multFT0A()); - rEventSelection.fill(HIST("multdist_FT0C"), collision.multFT0C()); - rEventSelection.fill(HIST("hNcontributor"), collision.numContrib()); + // rEventSelection.fill(HIST("multdist_FT0M"), collision.multFT0M()); + // rEventSelection.fill(HIST("multdist_FT0A"), collision.multFT0A()); + // rEventSelection.fill(HIST("multdist_FT0C"), collision.multFT0C()); + // rEventSelection.fill(HIST("hNcontributor"), collision.numContrib()); } std::vector v0indexes; @@ -680,14 +714,14 @@ struct HigherMassResonances { continue; } - if (config.qAv0Daughters) { - rKzeroShort.fill(HIST("negative_pt"), negtrack1.pt()); - rKzeroShort.fill(HIST("positive_pt"), postrack1.pt()); - rKzeroShort.fill(HIST("negative_eta"), negtrack1.eta()); - rKzeroShort.fill(HIST("positive_eta"), postrack1.eta()); - rKzeroShort.fill(HIST("negative_phi"), negtrack1.phi()); - rKzeroShort.fill(HIST("positive_phi"), postrack1.phi()); - } + // if (config.qAv0Daughters) { + // rKzeroShort.fill(HIST("negative_pt"), negtrack1.pt()); + // rKzeroShort.fill(HIST("positive_pt"), postrack1.pt()); + // rKzeroShort.fill(HIST("negative_eta"), negtrack1.eta()); + // rKzeroShort.fill(HIST("positive_eta"), postrack1.eta()); + // rKzeroShort.fill(HIST("negative_phi"), negtrack1.phi()); + // rKzeroShort.fill(HIST("positive_phi"), postrack1.phi()); + // } if (postrack1.globalIndex() == postrack2.globalIndex()) { continue; @@ -696,6 +730,10 @@ struct HigherMassResonances { continue; } + if (!applyAngSep(v1, v2)) { + continue; + } + allConditionsMet = 1; daughter1 = ROOT::Math::PxPyPzMVector(v1.px(), v1.py(), v1.pz(), o2::constants::physics::MassK0Short); // Kshort @@ -876,7 +914,7 @@ struct HigherMassResonances { PROCESS_SWITCH(HigherMassResonances, processME, "mixed event process", true); int counter = 0; - float multiplicity_gen = 0.0; + float multiplicityGen = 0.0; void processGen(aod::McCollision const& mcCollision, aod::McParticles const& mcParticles, const soa::SmallGroups& collisions) { TLorentzVector genvec; @@ -898,7 +936,7 @@ struct HigherMassResonances { std::vector selectedEvents(collisions.size()); int nevts = 0; - multiplicity_gen = 0.0; + multiplicityGen = 0.0; for (const auto& collision : collisions) { if (std::abs(collision.mcCollision().posZ()) > config.cutzvertex) { continue; @@ -911,7 +949,7 @@ struct HigherMassResonances { continue; } - multiplicity_gen = collision.centFT0M(); + multiplicityGen = collision.centFT0M(); selectedEvents[nevts++] = collision.mcCollision_as().globalIndex(); } @@ -924,17 +962,25 @@ struct HigherMassResonances { } hMChists.fill(HIST("events_check"), 4.5); for (const auto& mcParticle : mcParticles) { - if (std::abs(mcParticle.y()) >= 0.5) { + + if (std::abs(mcParticle.pdgCode()) != config.pdgCodes[config.selectMCparticles]) // f2(1525), f0(1710) + { continue; } hMChists.fill(HIST("events_check"), 5.5); - // if (counter < 1e4) { - // std::cout << "PDG code mother " << mcParticle.pdgCode() << std::endl; - // } + // if (counter < 1e3) + // std::cout << "px " << mcParticle.px() << " py " << mcParticle.py() << " pz " << mcParticle.pz() << " y " << mcParticle.y() << std::endl; // counter++; - if (std::abs(mcParticle.pdgCode()) != config.pdgCodes[config.selectMCparticles]) // f2(1525), f0(1710) - { + + hMChists.fill(HIST("GenRapidity"), mcParticle.pt(), mcParticle.y()); + hMChists.fill(HIST("GenPhi"), mcParticle.phi()); + hMChists.fill(HIST("GenEta"), mcParticle.pt(), mcParticle.eta()); + // hMChists.fill(HIST("GenPx"), mcParticle.px()); + // hMChists.fill(HIST("GenPy"), mcParticle.py()); + // hMChists.fill(HIST("GenPz"), mcParticle.pz()); + + if (std::abs(mcParticle.y()) >= 0.5) { continue; } hMChists.fill(HIST("events_check"), 6.5); @@ -948,9 +994,6 @@ struct HigherMassResonances { auto passKs = false; for (const auto& kCurrentDaughter : kDaughters) { // int daupdg = std::abs(kCurrentDaughter.pdgCode()); - // if (counter < 1e4) - // std::cout << "Daughter pdg code: " << daupdg << std::endl; - // counter++; if (!kCurrentDaughter.isPhysicalPrimary()) { continue; @@ -965,10 +1008,7 @@ struct HigherMassResonances { if (passKs) { genvec.SetPtEtaPhiE(mcParticle.pt(), mcParticle.eta(), mcParticle.phi(), mcParticle.e()); hMChists.fill(HIST("Genf1710_mass"), genvec.M()); - hMChists.fill(HIST("Genf1710"), multiplicity_gen, mcParticle.pt()); - hMChists.fill(HIST("GenRapidity"), genvec.Rapidity()); - hMChists.fill(HIST("GenPhi"), genvec.Phi()); - hMChists.fill(HIST("GenEta"), genvec.Eta()); + hMChists.fill(HIST("Genf1710"), multiplicityGen, mcParticle.pt()); } } } From f288b43747666c792eebb0723de7925e7006fd91 Mon Sep 17 00:00:00 2001 From: nzardosh Date: Thu, 20 Feb 2025 19:49:17 +0100 Subject: [PATCH 0358/1650] [PWGJE] fixing matching subscription for mcgen only substructure (#10100) --- PWGJE/Tasks/jetSubstructureBplusOutput.cxx | 2 +- PWGJE/Tasks/jetSubstructureD0Output.cxx | 2 +- PWGJE/Tasks/jetSubstructureDielectronOutput.cxx | 2 +- PWGJE/Tasks/jetSubstructureDplusOutput.cxx | 2 +- PWGJE/Tasks/jetSubstructureHFOutput.cxx | 6 +++--- PWGJE/Tasks/jetSubstructureLcOutput.cxx | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/PWGJE/Tasks/jetSubstructureBplusOutput.cxx b/PWGJE/Tasks/jetSubstructureBplusOutput.cxx index e81e12566fa..9647a64c1b4 100644 --- a/PWGJE/Tasks/jetSubstructureBplusOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureBplusOutput.cxx @@ -15,7 +15,7 @@ #include "PWGJE/Tasks/jetSubstructureHFOutput.cxx" -using JetSubstructureOutputBplus = JetSubstructureHFOutputTask, aod::CandidatesBplusData, aod::CandidatesBplusMCD, aod::CandidatesBplusMCP, aod::JTrackBplusSubs, soa::Join, soa::Join, aod::BplusCJetCOs, aod::BplusCJetOs, aod::BplusCJetSSOs, aod::BplusCJetMOs, soa::Join, aod::BplusCMCDJetCOs, aod::BplusCMCDJetOs, aod::BplusCMCDJetSSOs, aod::BplusCMCDJetMOs, soa::Join, aod::BplusCMCPJetCOs, aod::BplusCMCPJetOs, aod::BplusCMCPJetSSOs, aod::BplusCMCPJetMOs, soa::Join, aod::BplusCEWSJetCOs, aod::BplusCEWSJetOs, aod::BplusCEWSJetSSOs, aod::BplusCEWSJetMOs, aod::StoredHfBplusCollBase, aod::StoredHfBplusBases, aod::StoredHfBplusPars, aod::StoredHfBplusParEs, aod::StoredHfBplusParD0s, aod::StoredHfBplusSels, aod::StoredHfBplusMls, aod::StoredHfBplusMlD0s, aod::StoredHfBplusMcs, aod::StoredHfBplusMcCollBases, aod::StoredHfBplusMcRCollIds, aod::StoredHfBplusPBases>; // all the 3P tables have been made into Bplus but they might be made common +using JetSubstructureOutputBplus = JetSubstructureHFOutputTask, aod::CandidatesBplusData, aod::CandidatesBplusMCD, aod::CandidatesBplusMCP, aod::JTrackBplusSubs, soa::Join, soa::Join, aod::BplusCJetCOs, aod::BplusCJetOs, aod::BplusCJetSSOs, aod::BplusCJetMOs, soa::Join, aod::BplusCMCDJetCOs, aod::BplusCMCDJetOs, aod::BplusCMCDJetSSOs, aod::BplusCMCDJetMOs, soa::Join, soa::Join, aod::BplusCMCPJetCOs, aod::BplusCMCPJetOs, aod::BplusCMCPJetSSOs, aod::BplusCMCPJetMOs, soa::Join, aod::BplusCEWSJetCOs, aod::BplusCEWSJetOs, aod::BplusCEWSJetSSOs, aod::BplusCEWSJetMOs, aod::StoredHfBplusCollBase, aod::StoredHfBplusBases, aod::StoredHfBplusPars, aod::StoredHfBplusParEs, aod::StoredHfBplusParD0s, aod::StoredHfBplusSels, aod::StoredHfBplusMls, aod::StoredHfBplusMlD0s, aod::StoredHfBplusMcs, aod::StoredHfBplusMcCollBases, aod::StoredHfBplusMcRCollIds, aod::StoredHfBplusPBases>; // all the 3P tables have been made into Bplus but they might be made common WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGJE/Tasks/jetSubstructureD0Output.cxx b/PWGJE/Tasks/jetSubstructureD0Output.cxx index 7eb6b474eaf..5a436b70eba 100644 --- a/PWGJE/Tasks/jetSubstructureD0Output.cxx +++ b/PWGJE/Tasks/jetSubstructureD0Output.cxx @@ -15,7 +15,7 @@ #include "PWGJE/Tasks/jetSubstructureHFOutput.cxx" -using JetSubstructureOutputD0 = JetSubstructureHFOutputTask, aod::CandidatesD0Data, aod::CandidatesD0MCD, aod::CandidatesD0MCP, aod::JTrackD0Subs, soa::Join, soa::Join, aod::D0CJetCOs, aod::D0CJetOs, aod::D0CJetSSOs, aod::D0CJetMOs, soa::Join, aod::D0CMCDJetCOs, aod::D0CMCDJetOs, aod::D0CMCDJetSSOs, aod::D0CMCDJetMOs, soa::Join, aod::D0CMCPJetCOs, aod::D0CMCPJetOs, aod::D0CMCPJetSSOs, aod::D0CMCPJetMOs, soa::Join, aod::D0CEWSJetCOs, aod::D0CEWSJetOs, aod::D0CEWSJetSSOs, aod::D0CEWSJetMOs, aod::StoredHfD0CollBase, aod::StoredHfD0Bases, aod::StoredHfD0Pars, aod::StoredHfD0ParEs, aod::JDumD0ParDaus, aod::StoredHfD0Sels, aod::StoredHfD0Mls, aod::JDumD0MlDaus, aod::StoredHfD0Mcs, aod::StoredHfD0McCollBases, aod::StoredHfD0McRCollIds, aod::StoredHfD0PBases>; +using JetSubstructureOutputD0 = JetSubstructureHFOutputTask, aod::CandidatesD0Data, aod::CandidatesD0MCD, aod::CandidatesD0MCP, aod::JTrackD0Subs, soa::Join, soa::Join, aod::D0CJetCOs, aod::D0CJetOs, aod::D0CJetSSOs, aod::D0CJetMOs, soa::Join, aod::D0CMCDJetCOs, aod::D0CMCDJetOs, aod::D0CMCDJetSSOs, aod::D0CMCDJetMOs, soa::Join, soa::Join, aod::D0CMCPJetCOs, aod::D0CMCPJetOs, aod::D0CMCPJetSSOs, aod::D0CMCPJetMOs, soa::Join, aod::D0CEWSJetCOs, aod::D0CEWSJetOs, aod::D0CEWSJetSSOs, aod::D0CEWSJetMOs, aod::StoredHfD0CollBase, aod::StoredHfD0Bases, aod::StoredHfD0Pars, aod::StoredHfD0ParEs, aod::JDumD0ParDaus, aod::StoredHfD0Sels, aod::StoredHfD0Mls, aod::JDumD0MlDaus, aod::StoredHfD0Mcs, aod::StoredHfD0McCollBases, aod::StoredHfD0McRCollIds, aod::StoredHfD0PBases>; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGJE/Tasks/jetSubstructureDielectronOutput.cxx b/PWGJE/Tasks/jetSubstructureDielectronOutput.cxx index 76cdd6e7643..683fad5a292 100644 --- a/PWGJE/Tasks/jetSubstructureDielectronOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureDielectronOutput.cxx @@ -15,7 +15,7 @@ #include "PWGJE/Tasks/jetSubstructureHFOutput.cxx" -using JetSubstructureOutputDielectron = JetSubstructureHFOutputTask, soa::Join, aod::DielectronCJetCOs, aod::DielectronCJetOs, aod::DielectronCJetSSOs, aod::DielectronCJetMOs, soa::Join, aod::DielectronCMCDJetCOs, aod::DielectronCMCDJetOs, aod::DielectronCMCDJetSSOs, aod::DielectronCMCDJetMOs, soa::Join, aod::DielectronCMCPJetCOs, aod::DielectronCMCPJetOs, aod::DielectronCMCPJetSSOs, aod::DielectronCMCPJetMOs, soa::Join, aod::DielectronCEWSJetCOs, aod::DielectronCEWSJetOs, aod::DielectronCEWSJetSSOs, aod::DielectronCEWSJetMOs, aod::StoredReducedEvents, aod::StoredDielectrons, aod::JDielectron1Dummys, aod::JDielectron2Dummys, aod::JDielectron3Dummys, aod::JDielectron4Dummys, aod::JDielectron5Dummys, aod::JDielectron6Dummys, aod::JDielectron7Dummys, aod::StoredJDielectronMcCollisions, aod::JDielectron8Dummys, aod::StoredJDielectronMcs>; +using JetSubstructureOutputDielectron = JetSubstructureHFOutputTask, soa::Join, aod::DielectronCJetCOs, aod::DielectronCJetOs, aod::DielectronCJetSSOs, aod::DielectronCJetMOs, soa::Join, aod::DielectronCMCDJetCOs, aod::DielectronCMCDJetOs, aod::DielectronCMCDJetSSOs, aod::DielectronCMCDJetMOs, soa::Join, soa::Join, aod::DielectronCMCPJetCOs, aod::DielectronCMCPJetOs, aod::DielectronCMCPJetSSOs, aod::DielectronCMCPJetMOs, soa::Join, aod::DielectronCEWSJetCOs, aod::DielectronCEWSJetOs, aod::DielectronCEWSJetSSOs, aod::DielectronCEWSJetMOs, aod::StoredReducedEvents, aod::StoredDielectrons, aod::JDielectron1Dummys, aod::JDielectron2Dummys, aod::JDielectron3Dummys, aod::JDielectron4Dummys, aod::JDielectron5Dummys, aod::JDielectron6Dummys, aod::JDielectron7Dummys, aod::StoredJDielectronMcCollisions, aod::JDielectron8Dummys, aod::StoredJDielectronMcs>; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGJE/Tasks/jetSubstructureDplusOutput.cxx b/PWGJE/Tasks/jetSubstructureDplusOutput.cxx index 065c412376f..fdeb356993c 100644 --- a/PWGJE/Tasks/jetSubstructureDplusOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureDplusOutput.cxx @@ -15,7 +15,7 @@ #include "PWGJE/Tasks/jetSubstructureHFOutput.cxx" -using JetSubstructureOutputDplus = JetSubstructureHFOutputTask, aod::CandidatesDplusData, aod::CandidatesDplusMCD, aod::CandidatesDplusMCP, aod::JTrackDplusSubs, soa::Join, soa::Join, aod::DplusCJetCOs, aod::DplusCJetOs, aod::DplusCJetSSOs, aod::DplusCJetMOs, soa::Join, aod::DplusCMCDJetCOs, aod::DplusCMCDJetOs, aod::DplusCMCDJetSSOs, aod::DplusCMCDJetMOs, soa::Join, aod::DplusCMCPJetCOs, aod::DplusCMCPJetOs, aod::DplusCMCPJetSSOs, aod::DplusCMCPJetMOs, soa::Join, aod::DplusCEWSJetCOs, aod::DplusCEWSJetOs, aod::DplusCEWSJetSSOs, aod::DplusCEWSJetMOs, aod::StoredHfDplusCollBase, aod::StoredHfDplusBases, aod::StoredHfDplusPars, aod::StoredHfDplusParEs, aod::JDumDplusParDaus, aod::StoredHfDplusSels, aod::StoredHfDplusMls, aod::JDumDplusMlDaus, aod::StoredHfDplusMcs, aod::StoredHfDplusMcCollBases, aod::StoredHfDplusMcRCollIds, aod::StoredHfDplusPBases>; +using JetSubstructureOutputDplus = JetSubstructureHFOutputTask, aod::CandidatesDplusData, aod::CandidatesDplusMCD, aod::CandidatesDplusMCP, aod::JTrackDplusSubs, soa::Join, soa::Join, aod::DplusCJetCOs, aod::DplusCJetOs, aod::DplusCJetSSOs, aod::DplusCJetMOs, soa::Join, aod::DplusCMCDJetCOs, aod::DplusCMCDJetOs, aod::DplusCMCDJetSSOs, aod::DplusCMCDJetMOs, soa::Join, soa::Join, aod::DplusCMCPJetCOs, aod::DplusCMCPJetOs, aod::DplusCMCPJetSSOs, aod::DplusCMCPJetMOs, soa::Join, aod::DplusCEWSJetCOs, aod::DplusCEWSJetOs, aod::DplusCEWSJetSSOs, aod::DplusCEWSJetMOs, aod::StoredHfDplusCollBase, aod::StoredHfDplusBases, aod::StoredHfDplusPars, aod::StoredHfDplusParEs, aod::JDumDplusParDaus, aod::StoredHfDplusSels, aod::StoredHfDplusMls, aod::JDumDplusMlDaus, aod::StoredHfDplusMcs, aod::StoredHfDplusMcCollBases, aod::StoredHfDplusMcRCollIds, aod::StoredHfDplusPBases>; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGJE/Tasks/jetSubstructureHFOutput.cxx b/PWGJE/Tasks/jetSubstructureHFOutput.cxx index 266fb7aba7c..bf39e45ca95 100644 --- a/PWGJE/Tasks/jetSubstructureHFOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureHFOutput.cxx @@ -45,7 +45,7 @@ using namespace o2::framework::expressions; // NB: runDataProcessing.h must be included after customize! #include "Framework/runDataProcessing.h" -template +template struct JetSubstructureHFOutputTask { Produces collisionOutputTableData; @@ -413,7 +413,7 @@ struct JetSubstructureHFOutputTask { void processOutputCollisionsMc(soa::Join const& collisions, aod::JetMcCollisions const& mcCollisions, JetTableMCD const& jetsMCD, - JetTableMCP const& jetsMCP, + JetTableMatchedMCP const& jetsMCP, CandidateCollisionTable const& canidateCollisions, CandidateMcCollisionTable const& canidateMcCollisions, CandidateTableMCD const& candidatesMCD, @@ -507,7 +507,7 @@ struct JetSubstructureHFOutputTask { PROCESS_SWITCH(JetSubstructureHFOutputTask, processOutputJetsMCP, "hf jet substructure output MCP", false); void processOutputMatchingMC(JetTableMCD const& jetsMCD, - JetTableMCP const& jetsMCP) + JetTableMatchedMCP const& jetsMCP) { analyseMatched(jetsMCD, jetsMCP, jetMappingMCD, jetMappingMCP, jetMatchingOutputTableMCD, jetPtMinMCD); analyseMatched(jetsMCP, jetsMCD, jetMappingMCP, jetMappingMCD, jetMatchingOutputTableMCP, jetPtMinMCP); diff --git a/PWGJE/Tasks/jetSubstructureLcOutput.cxx b/PWGJE/Tasks/jetSubstructureLcOutput.cxx index dad7b2a52b5..e64e8efc286 100644 --- a/PWGJE/Tasks/jetSubstructureLcOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureLcOutput.cxx @@ -15,7 +15,7 @@ #include "PWGJE/Tasks/jetSubstructureHFOutput.cxx" -using JetSubstructureOutputLc = JetSubstructureHFOutputTask, aod::CandidatesLcData, aod::CandidatesLcMCD, aod::CandidatesLcMCP, aod::JTrackLcSubs, soa::Join, soa::Join, aod::LcCJetCOs, aod::LcCJetOs, aod::LcCJetSSOs, aod::LcCJetMOs, soa::Join, aod::LcCMCDJetCOs, aod::LcCMCDJetOs, aod::LcCMCDJetSSOs, aod::LcCMCDJetMOs, soa::Join, aod::LcCMCPJetCOs, aod::LcCMCPJetOs, aod::LcCMCPJetSSOs, aod::LcCMCPJetMOs, soa::Join, aod::LcCEWSJetCOs, aod::LcCEWSJetOs, aod::LcCEWSJetSSOs, aod::LcCEWSJetMOs, aod::StoredHfLcCollBase, aod::StoredHfLcBases, aod::StoredHfLcPars, aod::StoredHfLcParEs, aod::JDumLcParDaus, aod::StoredHfLcSels, aod::StoredHfLcMls, aod::JDumLcMlDaus, aod::StoredHfLcMcs, aod::StoredHfLcMcCollBases, aod::StoredHfLcMcRCollIds, aod::StoredHfLcPBases>; +using JetSubstructureOutputLc = JetSubstructureHFOutputTask, aod::CandidatesLcData, aod::CandidatesLcMCD, aod::CandidatesLcMCP, aod::JTrackLcSubs, soa::Join, soa::Join, aod::LcCJetCOs, aod::LcCJetOs, aod::LcCJetSSOs, aod::LcCJetMOs, soa::Join, aod::LcCMCDJetCOs, aod::LcCMCDJetOs, aod::LcCMCDJetSSOs, aod::LcCMCDJetMOs, soa::Join, soa::Join, aod::LcCMCPJetCOs, aod::LcCMCPJetOs, aod::LcCMCPJetSSOs, aod::LcCMCPJetMOs, soa::Join, aod::LcCEWSJetCOs, aod::LcCEWSJetOs, aod::LcCEWSJetSSOs, aod::LcCEWSJetMOs, aod::StoredHfLcCollBase, aod::StoredHfLcBases, aod::StoredHfLcPars, aod::StoredHfLcParEs, aod::JDumLcParDaus, aod::StoredHfLcSels, aod::StoredHfLcMls, aod::JDumLcMlDaus, aod::StoredHfLcMcs, aod::StoredHfLcMcCollBases, aod::StoredHfLcMcRCollIds, aod::StoredHfLcPBases>; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { From 73b0ff13a9d53831fd7d859177a8fac578627c53 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Fri, 21 Feb 2025 06:15:33 +0900 Subject: [PATCH 0359/1650] [PWGEM/Dilepton] update studyMCTruth.cxx (#10111) --- PWGEM/Dilepton/Tasks/associateMCcollision.cxx | 42 ++++-- PWGEM/Dilepton/Tasks/studyMCTruth.cxx | 129 ++++++++++++------ 2 files changed, 118 insertions(+), 53 deletions(-) diff --git a/PWGEM/Dilepton/Tasks/associateMCcollision.cxx b/PWGEM/Dilepton/Tasks/associateMCcollision.cxx index 5a3caf45ef1..eb0e7d3bf5c 100644 --- a/PWGEM/Dilepton/Tasks/associateMCcollision.cxx +++ b/PWGEM/Dilepton/Tasks/associateMCcollision.cxx @@ -17,7 +17,6 @@ #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/ASoAHelpers.h" - #include "PWGEM/Dilepton/DataModel/dileptonTables.h" using namespace o2; @@ -33,6 +32,9 @@ struct associateMCcollision { void init(InitContext&) { + if (doprocessNcontrib && doprocessNcontrib_Derived) { + LOGF(fatal, "Please select only 1 process function."); + } addhistograms(); } @@ -40,17 +42,15 @@ struct associateMCcollision { void addhistograms() { - fRegistry.add("hReccollsPerMCcoll", "Rec. colls per MC coll;Rec. colls per MC coll;Number of MC collisions", kTH1F, {{21, -0.5, 20.5}}, false); + fRegistry.add("hReccollsPerMCcoll", "Rec. colls per MC coll;Rec. colls per MC coll;Number of MC collisions", kTH1D, {{21, -0.5, 20.5}}, false); } - using MyCollisions = soa::Join; - using MyCollision = MyCollisions::iterator; - PresliceUnsorted recColperMcCollision = aod::emmceventlabel::emmceventId; - - void processNcontrib(aod::EMMCEvents const& mccollisions, MyCollisions const& collisions) + template + void runMC(TMCCollisions const& mcCollisions, TCollisions const& collisions, TPreslice const& perMCCollision) { - for (auto& mccollision : mccollisions) { - auto rec_colls_per_mccoll = collisions.sliceBy(recColperMcCollision, mccollision.globalIndex()); + + for (auto& mcCollision : mcCollisions) { + auto rec_colls_per_mccoll = collisions.sliceBy(perMCCollision, mcCollision.globalIndex()); fRegistry.fill(HIST("hReccollsPerMCcoll"), rec_colls_per_mccoll.size()); uint32_t maxNumContrib = 0; int rec_col_globalIndex = -999; @@ -63,8 +63,28 @@ struct associateMCcollision { // LOGF(info, "rec_col_globalIndex = %d", rec_col_globalIndex); mpemeventIds(rec_col_globalIndex); } // end of mc collision - } // end of process - PROCESS_SWITCH(associateMCcollision, processNcontrib, "produce most probable emeventId based on Ncontrib to PV", true); + + } // end of runMC + + using MyCollisions = soa::Join; + using MyCollision = MyCollisions::iterator; + PresliceUnsorted recColperMcCollision = aod::mccollisionlabel::mcCollisionId; + + using MyEMCollisions = soa::Join; + using MyEMCollision = MyEMCollisions::iterator; + PresliceUnsorted recColperMcCollision_derived = aod::emmceventlabel::emmceventId; + + void processNcontrib_Derived(aod::EMMCEvents const& mcCollisions, MyEMCollisions const& collisions) + { + runMC(mcCollisions, collisions, recColperMcCollision_derived); + } + PROCESS_SWITCH(associateMCcollision, processNcontrib_Derived, "produce most probable emeventId based on Ncontrib to PV for derived AOD", true); + + void processNcontrib(aod::McCollisions const& mcCollisions, MyCollisions const& collisions) + { + runMC(mcCollisions, collisions, recColperMcCollision); + } + PROCESS_SWITCH(associateMCcollision, processNcontrib, "produce most probable emeventId based on Ncontrib to PV for original AOD", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) diff --git a/PWGEM/Dilepton/Tasks/studyMCTruth.cxx b/PWGEM/Dilepton/Tasks/studyMCTruth.cxx index 33efc409e99..4e5fbf44ae3 100644 --- a/PWGEM/Dilepton/Tasks/studyMCTruth.cxx +++ b/PWGEM/Dilepton/Tasks/studyMCTruth.cxx @@ -25,6 +25,7 @@ #include "ReconstructionDataFormats/Track.h" #include "Common/Core/TableHelper.h" #include "Common/DataModel/EventSelection.h" +#include "PWGEM/Dilepton/DataModel/dileptonTables.h" #include "PWGEM/Dilepton/Utils/MCUtilities.h" using namespace o2; @@ -74,29 +75,39 @@ struct studyMCTruth { } static constexpr std::string_view dileptonSigns[3] = {"uls/", "lspp/", "lsmm/"}; - static constexpr std::string_view evNames[4] = {"before/", "after/"}; + static constexpr std::string_view evNames[4] = {"allMC/", "selectedMC/", "selectedMC_and_Rec/", "selectedMC_and_selectedRec/"}; void addHistograms() { const AxisSpec axis_mll{ConfMllBins, "m_{ll} (GeV/c^{2})"}; const AxisSpec axis_ptll{ConfPtllBins, "p_{T,ll} (GeV/c)"}; - fRegistry.add("Event/before/hZvtx", "MC Zvtx;Z_{vtx} (cm)", kTH1D, {{100, -50, +50}}, false); - fRegistry.add("Event/before/hImpactParameter", "impact parameter;impact parameter b (fm)", kTH1D, {{200, 0, 20}}, false); - fRegistry.addClone("Event/before/", "Event/after/"); - - fRegistry.add("Pair/before/Pi0/uls/hMvsPt", "m_{ll} vs. p_{T,ll}", kTH2D, {axis_mll, axis_ptll}, true); - fRegistry.addClone("Pair/before/Pi0/uls/", "Pair/before/Pi0/lspp/"); - fRegistry.addClone("Pair/before/Pi0/uls/", "Pair/before/Pi0/lsmm/"); - fRegistry.addClone("Pair/before/Pi0/", "Pair/before/Eta/"); - fRegistry.addClone("Pair/before/Pi0/", "Pair/before/EtaPrime/"); - fRegistry.addClone("Pair/before/Pi0/", "Pair/before/Rho/"); - fRegistry.addClone("Pair/before/Pi0/", "Pair/before/Omega/"); - fRegistry.addClone("Pair/before/Pi0/", "Pair/before/Phi/"); - fRegistry.addClone("Pair/before/Pi0/", "Pair/before/JPsi/"); - fRegistry.addClone("Pair/before/Pi0/", "Pair/before/ccbar/"); - fRegistry.addClone("Pair/before/Pi0/", "Pair/before/bbbar/"); - fRegistry.addClone("Pair/before/", "Pair/after/"); + fRegistry.add("Event/hDiffBC", "diffrence in BC;BC_{rec. coll.} - BC_{mc coll.}", kTH1D, {{101, -50.5, +50.5}}, false); + fRegistry.add("Event/allMC/hZvtx", "MC Zvtx;Z_{vtx} (cm)", kTH1D, {{100, -50, +50}}, false); + fRegistry.add("Event/allMC/hImpactParameter", "impact parameter;impact parameter b (fm)", kTH1D, {{200, 0, 20}}, false); + fRegistry.addClone("Event/allMC/", "Event/selectedMC/"); + fRegistry.addClone("Event/allMC/", "Event/selectedMC_and_Rec/"); + fRegistry.addClone("Event/allMC/", "Event/selectedMC_and_selectedRec/"); + + fRegistry.add("Pair/allMC/Pi0/uls/hMvsPt", "m_{ll} vs. p_{T,ll}", kTH2D, {axis_mll, axis_ptll}, true); + fRegistry.addClone("Pair/allMC/Pi0/uls/", "Pair/allMC/Pi0/lspp/"); + fRegistry.addClone("Pair/allMC/Pi0/uls/", "Pair/allMC/Pi0/lsmm/"); + fRegistry.addClone("Pair/allMC/Pi0/", "Pair/allMC/Eta/"); + fRegistry.addClone("Pair/allMC/Pi0/", "Pair/allMC/EtaPrime/"); + fRegistry.addClone("Pair/allMC/Pi0/", "Pair/allMC/Rho/"); + fRegistry.addClone("Pair/allMC/Pi0/", "Pair/allMC/Omega/"); + fRegistry.addClone("Pair/allMC/Pi0/", "Pair/allMC/Phi/"); + fRegistry.addClone("Pair/allMC/Pi0/", "Pair/allMC/JPsi/"); + fRegistry.addClone("Pair/allMC/Pi0/", "Pair/allMC/ccbar/"); + fRegistry.addClone("Pair/allMC/Pi0/", "Pair/allMC/bbbar/"); + fRegistry.addClone("Pair/allMC/", "Pair/selectedMC/"); + fRegistry.addClone("Pair/allMC/", "Pair/selectedMC_and_Rec/"); + fRegistry.addClone("Pair/allMC/", "Pair/selectedMC_and_selectedRec/"); + + // allMC = all mc collisions + // selectedMC = mc collisions selected by your event cuts + // selectedMC_and_Rec = mc collisions selected by your event cuts and at least 1 reconstructed collision is associated. + // selectedMC_and_selectedRec = mc collisions selected by your event cuts and at least 1 reconstructed collision is associated, and the associated rec. collision is selected by your cuts. } template @@ -131,27 +142,22 @@ struct studyMCTruth { } } - template - bool isSelectedCollision(TMCCollision const& mcCollision) + template + bool isSelectedCollision(TCollision const& collision, TBC const& bc) { - const auto& bc = mcCollision.template bc_as(); - - if (mcCollision.posZ() < eventcuts.cfgZvtxMin || eventcuts.cfgZvtxMax < mcCollision.posZ()) { + if (collision.posZ() < eventcuts.cfgZvtxMin || eventcuts.cfgZvtxMax < collision.posZ()) { return false; } if (eventcuts.cfgRequireFT0AND && !bc.selection_bit(o2::aod::evsel::kIsTriggerTVX)) { return false; } - if (eventcuts.cfgRequireNoTFB && !bc.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { return false; } - if (eventcuts.cfgRequireNoITSROFB && !bc.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { return false; } - return true; } @@ -225,41 +231,78 @@ struct studyMCTruth { } } - template - void runMC(TMCCollisions const& mcCollisions, TMCParticles const& mcParticles, TBCs const&) + template + void runMC(TMCCollisions const& mcCollisions, TMCParticles const& mcParticles, TBCs const&, TCollisions const& collisions) { for (const auto& mcCollision : mcCollisions) { - fRegistry.fill(HIST("Event/before/hZvtx"), mcCollision.posZ()); - fRegistry.fill(HIST("Event/before/hImpactParameter"), mcCollision.impactParameter()); + const auto& bc_from_mcCollision = mcCollision.template bc_as(); + bool isSelectedMC = isSelectedCollision(mcCollision, bc_from_mcCollision); + + bool isSelectedRec = false; + bool hasRecCollision = false; + if (mcCollision.mpemeventId() >= 0) { + hasRecCollision = true; + const auto& collision = collisions.rawIteratorAt(mcCollision.mpemeventId()); // most probable reconstructed collision + const auto& bc_from_collision = collision.template foundBC_as(); + isSelectedRec = isSelectedCollision(collision, bc_from_collision); + fRegistry.fill(HIST("Event/hDiffBC"), bc_from_collision.globalBC() - bc_from_mcCollision.globalBC()); + } + + fRegistry.fill(HIST("Event/allMC/hZvtx"), mcCollision.posZ()); + fRegistry.fill(HIST("Event/allMC/hImpactParameter"), mcCollision.impactParameter()); + if (isSelectedMC) { + fRegistry.fill(HIST("Event/selectedMC/hZvtx"), mcCollision.posZ()); + fRegistry.fill(HIST("Event/selectedMC/hImpactParameter"), mcCollision.impactParameter()); + if (hasRecCollision) { + fRegistry.fill(HIST("Event/selectedMC_and_Rec/hZvtx"), mcCollision.posZ()); + fRegistry.fill(HIST("Event/selectedMC_and_Rec/hImpactParameter"), mcCollision.impactParameter()); + if (isSelectedRec) { + fRegistry.fill(HIST("Event/selectedMC_and_selectedRec/hZvtx"), mcCollision.posZ()); + fRegistry.fill(HIST("Event/selectedMC_and_selectedRec/hImpactParameter"), mcCollision.impactParameter()); + } + } + } // store MC true information auto posLeptons_per_mccollision = mcPosLeptons.sliceBy(perMcCollision, mcCollision.globalIndex()); auto negLeptons_per_mccollision = mcNegLeptons.sliceBy(perMcCollision, mcCollision.globalIndex()); - bool isSelected = isSelectedCollision(mcCollision); - if (isSelected) { - fRegistry.fill(HIST("Event/after/hZvtx"), mcCollision.posZ()); - fRegistry.fill(HIST("Event/after/hImpactParameter"), mcCollision.impactParameter()); - } - for (const auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posLeptons_per_mccollision, negLeptons_per_mccollision))) { // ULS fillTrueInfo<0, 0>(pos, neg, mcParticles); - if (isSelected) { + if (isSelectedMC) { fillTrueInfo<1, 0>(pos, neg, mcParticles); + if (hasRecCollision) { + fillTrueInfo<2, 0>(pos, neg, mcParticles); + if (isSelectedRec) { + fillTrueInfo<3, 0>(pos, neg, mcParticles); + } + } } } // end of ULS pair loop for (auto& [pos1, pos2] : combinations(CombinationsStrictlyUpperIndexPolicy(posLeptons_per_mccollision, posLeptons_per_mccollision))) { // LS++ fillTrueInfo<0, 1>(pos1, pos2, mcParticles); - if (isSelected) { + if (isSelectedMC) { fillTrueInfo<1, 1>(pos1, pos2, mcParticles); + if (hasRecCollision) { + fillTrueInfo<2, 1>(pos1, pos2, mcParticles); + if (isSelectedRec) { + fillTrueInfo<3, 1>(pos1, pos2, mcParticles); + } + } } } // end of LS++ pair loop for (auto& [neg1, neg2] : combinations(CombinationsStrictlyUpperIndexPolicy(negLeptons_per_mccollision, negLeptons_per_mccollision))) { // LS-- fillTrueInfo<0, 2>(neg1, neg2, mcParticles); - if (isSelected) { + if (isSelectedMC) { fillTrueInfo<1, 2>(neg1, neg2, mcParticles); + if (hasRecCollision) { + fillTrueInfo<2, 2>(neg1, neg2, mcParticles); + if (isSelectedRec) { + fillTrueInfo<3, 2>(neg1, neg2, mcParticles); + } + } } } // end of LS-- pair loop @@ -270,19 +313,21 @@ struct studyMCTruth { SliceCache cache; Preslice perMcCollision = aod::mcparticle::mcCollisionId; + using MyMcCollisions = soa::Join; + Filter collisionFilter = eventcuts.cfgMinImpPar < o2::aod::mccollision::impactParameter && o2::aod::mccollision::impactParameter < eventcuts.cfgMaxImpPar; - using FilteredMcCollisions = soa::Filtered; + using FilteredMyMcCollisions = soa::Filtered; Partition mcPosLeptons = o2::aod::mcparticle::pdgCode == -mccuts.cfgPdgCodeLepton && (mccuts.cfgMinPtGen < o2::aod::mcparticle::pt && o2::aod::mcparticle::pt < mccuts.cfgMaxPtGen) && (mccuts.cfgMinEtaGen < o2::aod::mcparticle::eta && o2::aod::mcparticle::eta < mccuts.cfgMaxEtaGen); Partition mcNegLeptons = o2::aod::mcparticle::pdgCode == mccuts.cfgPdgCodeLepton && (mccuts.cfgMinPtGen < o2::aod::mcparticle::pt && o2::aod::mcparticle::pt < mccuts.cfgMaxPtGen) && (mccuts.cfgMinEtaGen < o2::aod::mcparticle::eta && o2::aod::mcparticle::eta < mccuts.cfgMaxEtaGen); - void processMC(FilteredMcCollisions const& mcCollisions, aod::McParticles const& mcParticles, soa::Join const& bcs) + void processMC(FilteredMyMcCollisions const& mcCollisions, aod::McParticles const& mcParticles, soa::Join const& bcs, soa::Join const& collisions) { - runMC(mcCollisions, mcParticles, bcs); + runMC(mcCollisions, mcParticles, bcs, collisions); } PROCESS_SWITCH(studyMCTruth, processMC, "process", true); - void processDummy(FilteredMcCollisions const&) {} + void processDummy(FilteredMyMcCollisions const&) {} PROCESS_SWITCH(studyMCTruth, processDummy, "process Dummy", false); }; From f2588b782e0a81bd109cc5dac8f39b2241aab831 Mon Sep 17 00:00:00 2001 From: Rafael Manhart <56776511+RafRaf11@users.noreply.github.com> Date: Thu, 20 Feb 2025 22:16:02 +0100 Subject: [PATCH 0360/1650] [PWGLF] Update NucleiEfficiencyTask.cxx (#10117) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Nuspex/NucleiEfficiencyTask.cxx | 663 ++++++++++++-------- 1 file changed, 385 insertions(+), 278 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/NucleiEfficiencyTask.cxx b/PWGLF/Tasks/Nuspex/NucleiEfficiencyTask.cxx index c83f1aef414..4ca2bd51c6f 100644 --- a/PWGLF/Tasks/Nuspex/NucleiEfficiencyTask.cxx +++ b/PWGLF/Tasks/Nuspex/NucleiEfficiencyTask.cxx @@ -52,10 +52,9 @@ using namespace o2::framework::expressions; struct NucleiEfficiencyTask { HistogramRegistry MC_gen_reg{"MC_particles_gen", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; - HistogramRegistry MC_gen_reg_cent{"MC_particles_gen_cent", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry MC_recon_reg{"MC_particles_reco", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; - HistogramRegistry MC_recon_reg_cent{"MC_particles_reco_cent", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; OutputObj histPDG_gen{TH1F("PDG_gen", "PDG;PDG code", 18, 0.0, 18)}; + OutputObj histPDG_gen_reco{TH1F("PDG_gen_reco", "PDG;PDG code", 18, 0.0, 18)}; OutputObj histPDG_reco{TH1F("PDG_reco", "PDG;PDG code", 18, 0.0, 18)}; void init(o2::framework::InitContext&) @@ -80,8 +79,14 @@ struct NucleiEfficiencyTask { MC_gen_reg.add("histPhi", "#phi", HistType::kTH2F, {{100, 0., 2. * TMath::Pi()}, PDGBINNING}); MC_gen_reg.add("histEta", "#eta", HistType::kTH2F, {{102, -2.01, 2.01}, PDGBINNING}); MC_gen_reg.add("histRapid", "#gamma", HistType::kTH2F, {{1000, -5.0, 5.0}, PDGBINNING}); - MC_gen_reg_cent.add("hist_gen_p_cent", "generated p distribution vs impact param", HistType::kTH3F, {pAxis, PDGBINNING, ImPaAxis}); - MC_gen_reg_cent.add("hist_gen_pT_cent", "generated p_{T} distribution vs impact param", HistType::kTH3F, {ptAxis, PDGBINNING, ImPaAxis}); + + // *********************** Generated reco ********************** + + MC_gen_reg.add("histGenVtxMC_reco", "MC generated (reco) vertex z position", HistType::kTH1F, {{400, -40., +40., "z position (cm)"}}); + MC_gen_reg.add("histCentrality_reco", "Centrality", HistType::kTH1F, {centralityAxis}); + MC_gen_reg.add("histEta_reco", "generated (reco) #eta", HistType::kTH2F, {{102, -2.01, 2.01}, PDGBINNING}); + MC_gen_reg.add("hist_gen_reco_p", "generated (reco) p distribution", HistType::kTH2F, {pAxis, PDGBINNING}); + MC_gen_reg.add("hist_gen_reco_pT", "generated (reco) p_{T} distribution", HistType::kTH2F, {ptAxis, PDGBINNING}); // ********************** Reconstructed ********************* MC_recon_reg.add("histRecVtxMC", "MC reconstructed vertex z position", HistType::kTH1F, {{400, -40., +40., "z position (cm)"}}); @@ -94,25 +99,17 @@ struct NucleiEfficiencyTask { MC_recon_reg.add("hist_rec_ITS_vs_pT", "ITS reconstructed p_{T} distribution", HistType::kTH2F, {ptAxis, PDGBINNING}); MC_recon_reg.add("hist_rec_ITS_TPC_vs_pT", "ITS_TPC reconstructed p_{T} distribution", HistType::kTH2F, {ptAxis, PDGBINNING}); MC_recon_reg.add("hist_rec_ITS_TPC_TOF_vs_pT", "ITS_TPC_TOF reconstructed p_{T} distribution", HistType::kTH2F, {ptAxis, PDGBINNING}); - MC_recon_reg_cent.add("hist_rec_ITS_vs_p_cent", "ITS reconstructed p distribution vs centrality", HistType::kTH3F, {pAxis, PDGBINNING, centralityAxis}); - MC_recon_reg_cent.add("hist_rec_ITS_TPC_vs_p_cent", "ITS_TPC reconstructed p distribution vs centrality", HistType::kTH3F, {pAxis, PDGBINNING, centralityAxis}); - MC_recon_reg_cent.add("hist_rec_ITS_TPC_TOF_vs_p_cent", "ITS_TPC_TOF reconstructed p distribution vs centrality", HistType::kTH3F, {pAxis, PDGBINNING, centralityAxis}); - MC_recon_reg_cent.add("hist_rec_ITS_vs_pT_cent", "ITS reconstructed p_{T} distribution vs centrality", HistType::kTH3F, {ptAxis, PDGBINNING, centralityAxis}); - MC_recon_reg_cent.add("hist_rec_ITS_TPC_vs_pT_cent", "ITS_TPC reconstructed p_{T} distribution vs centrality", HistType::kTH3F, {ptAxis, PDGBINNING, centralityAxis}); - MC_recon_reg_cent.add("hist_rec_ITS_TPC_TOF_vs_pT_cent", "ITS_TPC_TOF reconstructed p_{T} distribution vs centrality", HistType::kTH3F, {ptAxis, PDGBINNING, centralityAxis}); } // ************************ Configurables *********************** Configurable event_selection_MC_sel8{"event_selection_MC_sel8", true, "Enable sel8 event selection in MC processing"}; - Configurable y_cut_MC_gen{"y_cut_MC_gen", true, "Enable rapidity cut for generated MC"}; - Configurable yMin_gen{"yMin_gen", -0.5, "Maximum rapidity (generated)"}; - Configurable yMax_gen{"yMax_gen", 0.5, "Minimum rapidity (generated)"}; - Configurable yMin_reco{"yMin_reco", -0.5, "Maximum rapidity (reconstructed)"}; - Configurable yMax_reco{"yMax_reco", 0.5, "Minimum rapidity (reconstructed)"}; + Configurable applyPvZCutGenColl{"applyPvZCutGenColl", true, "applyPvZCutGenColl"}; + Configurable yMin{"yMin", -0.5, "Minimum rapidity"}; + Configurable yMax{"yMax", 0.5, "Maximum rapidity"}; Configurable p_min{"p_min", 0.1f, "min track.pt()"}; Configurable p_max{"p_max", 1e+10f, "max track.pt()"}; Configurable cfgCutVertex{"cfgCutVertex", 10.0f, "Accepted z-vertex range"}; - Configurable cfgCutEta{"cfgCutEta", 0.9f, "Eta range for tracks"}; + Configurable cfgCutEta{"cfgCutEta", 0.8f, "Eta range for tracks"}; Configurable minCentrality{"minCentrality", 0.0, "min Centrality used"}; Configurable maxCentrality{"maxCentrality", 80.0, "max Centrality used"}; Configurable enable_Centrality_cut{"enable_Centrality_cut", true, "enable Centrality cut"}; @@ -149,6 +146,24 @@ struct NucleiEfficiencyTask { //*********************************************************************************** + template + bool isInAcceptance(const particleType& particle) + { + if (particle.pt() < p_min || particle.pt() > p_max) + return false; + if (particle.eta() < -cfgCutEta || particle.eta() > cfgCutEta) + return false; + // if (particle.phi() < phiMin || particle.phi() > phiMax) return false; + if (particle.y() < yMin || particle.y() > yMax) + return false; + if (!particle.isPhysicalPrimary()) + return false; + + return true; + } + + //*********************************************************************************** + template bool isEventSelected(CollisionType const& collision) { @@ -162,301 +177,393 @@ struct NucleiEfficiencyTask { return false; if (removeNoTimeFrameBorder && !collision.selection_bit(aod::evsel::kNoTimeFrameBorder)) return false; + return true; } //*********************************************************************************** - template - void process_MC_gen(const McCollisionType& mcCollision, const McParticlesType& mcParticles) + template + bool isCollisionSelected(const CollType& collision) { - if (mcCollision.posZ() < -cfgCutVertex || mcCollision.posZ() > cfgCutVertex) - return; - MC_gen_reg.fill(HIST("histGenVtxMC"), mcCollision.posZ()); - MC_gen_reg.fill(HIST("histCentrality"), mcCollision.impactParameter()); + if (event_selection_MC_sel8 && !collision.sel8()) + return false; + if (collision.posZ() < -cfgCutVertex || collision.posZ() > cfgCutVertex) + return false; + if (removeITSROFrameBorder && !collision.selection_bit(aod::evsel::kNoITSROFrameBorder)) + return false; + if (removeNoSameBunchPileup && !collision.selection_bit(aod::evsel::kNoSameBunchPileup)) + return false; + if (requireIsGoodZvtxFT0vsPV && !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) + return false; + if (requireIsVertexITSTPC && !collision.selection_bit(aod::evsel::kIsVertexITSTPC)) + return false; + if (removeNoTimeFrameBorder && !collision.selection_bit(aod::evsel::kNoTimeFrameBorder)) + return false; - for (const auto& MCparticle : mcParticles) { - if (!MCparticle.isPhysicalPrimary()) - continue; - if ((MCparticle.y() > yMax_gen || MCparticle.y() < yMin_gen) && y_cut_MC_gen) - continue; - if ((TMath::Abs(MCparticle.eta()) > cfgCutEta) && eta_cut_MC_gen) - continue; + return true; + } - int pdgbin = -10; - switch (MCparticle.pdgCode()) { - case +211: - histPDG_gen->AddBinContent(1); - pdgbin = 0; - break; - case -211: - histPDG_gen->AddBinContent(2); - pdgbin = 1; - break; - case +321: - histPDG_gen->AddBinContent(3); - pdgbin = 2; - break; - case -321: - histPDG_gen->AddBinContent(4); - pdgbin = 3; - break; - case +2212: - histPDG_gen->AddBinContent(5); - pdgbin = 4; - break; - case -2212: - histPDG_gen->AddBinContent(6); - pdgbin = 5; - break; - case +1000010020: - histPDG_gen->AddBinContent(7); - pdgbin = 6; - break; - case -1000010020: - histPDG_gen->AddBinContent(8); - pdgbin = 7; - break; - case +1000010030: - histPDG_gen->AddBinContent(9); - pdgbin = 8; - break; - case -1000010030: - histPDG_gen->AddBinContent(10); - pdgbin = 9; - break; - case +1000020030: - histPDG_gen->AddBinContent(11); - pdgbin = 10; - break; - case -1000020030: - histPDG_gen->AddBinContent(12); - pdgbin = 11; - break; - case +1000020040: - histPDG_gen->AddBinContent(13); - pdgbin = 12; - break; - case -1000020040: - histPDG_gen->AddBinContent(14); - pdgbin = 13; - break; - default: - pdgbin = -10; - continue; - break; - } + //*********************************************************************************** - MC_gen_reg.fill(HIST("histPhi"), MCparticle.phi(), pdgbin); - MC_gen_reg.fill(HIST("histEta"), MCparticle.eta(), pdgbin); - MC_gen_reg.fill(HIST("histRapid"), MCparticle.y(), pdgbin); - MC_gen_reg.fill(HIST("hist_gen_p"), MCparticle.p(), pdgbin); - MC_gen_reg.fill(HIST("hist_gen_pT"), MCparticle.pt(), pdgbin); + template + bool isTrackSelected(trackType& track) + { + if (!track.has_mcParticle()) + return false; - if (calc_cent) { - MC_gen_reg_cent.fill(HIST("hist_gen_p_cent"), MCparticle.p(), pdgbin, mcCollision.impactParameter()); - MC_gen_reg_cent.fill(HIST("hist_gen_pT_cent"), MCparticle.pt(), pdgbin, mcCollision.impactParameter()); - } - } + const auto mcParticle = track.mcParticle(); + if (!isInAcceptance(mcParticle)) + return false; // pt eta phi y + if (!track.has_collision()) + return false; + + float TPCnumberClsFound = track.tpcNClsFound(); + float TPC_nCls_Crossed_Rows = track.tpcNClsCrossedRows(); + float RatioCrossedRowsOverFindableTPC = track.tpcCrossedRowsOverFindableCls(); + float Chi2perClusterTPC = track.tpcChi2NCl(); + float Chi2perClusterITS = track.itsChi2NCl(); + + bool insideDCAxy = (std::abs(track.dcaXY()) <= (maxDcaXYFactor.value * (0.0105f + 0.0350f / pow(track.pt(), 1.1f)))); + + if (!(insideDCAxy) || TMath::Abs(track.dcaZ()) > maxDCA_Z || TPCnumberClsFound < minTPCnClsFound || TPC_nCls_Crossed_Rows < minNCrossedRowsTPC || RatioCrossedRowsOverFindableTPC < minRatioCrossedRowsTPC || RatioCrossedRowsOverFindableTPC > maxRatioCrossedRowsTPC || Chi2perClusterTPC > maxChi2PerClusterTPC || Chi2perClusterTPC < minChi2PerClusterTPC || Chi2perClusterITS > maxChi2PerClusterITS || !(track.passedTPCRefit()) || !(track.passedITSRefit()) || (track.itsNClsInnerBarrel()) < minReqClusterITSib || (track.itsNCls()) < minReqClusterITS) + return false; + if ((requireITS && !(track.hasITS())) || (requireTPC && !(track.hasTPC()))) + return false; + if (requireGoldenChi2 && !(track.passedGoldenChi2())) + return false; + + return true; } //*********************************************************************************** - - template - void process_MC_reco(const CollisionType& collision, const TracksType& tracks, const mcParticlesType& /*mcParticles*/) + using CollisionCandidates = o2::soa::Join; + using CollisionCandidatesMC = o2::soa::Join; + using TrackCandidates = o2::soa::Join; + using TrackCandidatesMC = o2::soa::Join; + + SliceCache cache; + Preslice perCollision = o2::aod::track::collisionId; + Preslice perCollisionMc = o2::aod::mcparticle::mcCollisionId; + PresliceUnsorted collPerCollMc = o2::aod::mccollisionlabel::mcCollisionId; + + void processMC(o2::aod::McCollisions const& mcCollisions, + // o2::soa::SmallGroups const& collisions, + CollisionCandidatesMC const& collisions, + TrackCandidatesMC const& tracks, + o2::aod::McParticles const& mcParticles) { + /// loop over generated collisions + for (const auto& mcCollision : mcCollisions) { - if (event_selection_MC_sel8 && !collision.sel8()) - return; - MC_recon_reg.fill(HIST("histRecVtxMC"), collision.posZ()); - if (!isEventSelected(collision)) - return; - if (collision.centFT0C() < minCentrality || collision.centFT0C() > maxCentrality) - return; - MC_recon_reg.fill(HIST("histCentrality"), collision.centFT0C()); - - for (auto& track : tracks) { - const auto particle = track.mcParticle(); - if (!particle.isPhysicalPrimary()) - continue; - TLorentzVector lorentzVector_particle_MC{}; - - int pdgbin = -10; - switch (particle.pdgCode()) { - case +211: - histPDG_reco->AddBinContent(1); - lorentzVector_particle_MC.SetPtEtaPhiM(track.pt(), track.eta(), track.phi(), constants::physics::MassPiPlus); - pdgbin = 0; - break; - case -211: - histPDG_reco->AddBinContent(2); - lorentzVector_particle_MC.SetPtEtaPhiM(track.pt(), track.eta(), track.phi(), constants::physics::MassPiPlus); - pdgbin = 1; - break; - case +321: - histPDG_reco->AddBinContent(3); - lorentzVector_particle_MC.SetPtEtaPhiM(track.pt(), track.eta(), track.phi(), constants::physics::MassKPlus); - pdgbin = 2; - break; - case -321: - histPDG_reco->AddBinContent(4); - lorentzVector_particle_MC.SetPtEtaPhiM(track.pt(), track.eta(), track.phi(), constants::physics::MassKPlus); - pdgbin = 3; - break; - case +2212: - histPDG_reco->AddBinContent(5); - lorentzVector_particle_MC.SetPtEtaPhiM(track.pt(), track.eta(), track.phi(), constants::physics::MassProton); - pdgbin = 4; - break; - case -2212: - histPDG_reco->AddBinContent(6); - lorentzVector_particle_MC.SetPtEtaPhiM(track.pt(), track.eta(), track.phi(), constants::physics::MassProton); - pdgbin = 5; - break; - case +1000010020: - histPDG_reco->AddBinContent(7); - lorentzVector_particle_MC.SetPtEtaPhiM(track.pt(), track.eta(), track.phi(), constants::physics::MassDeuteron); - pdgbin = 6; - break; - case -1000010020: - histPDG_reco->AddBinContent(8); - lorentzVector_particle_MC.SetPtEtaPhiM(track.pt(), track.eta(), track.phi(), constants::physics::MassDeuteron); - pdgbin = 7; - break; - case +1000010030: - histPDG_reco->AddBinContent(9); - lorentzVector_particle_MC.SetPtEtaPhiM(track.pt(), track.eta(), track.phi(), constants::physics::MassTriton); - pdgbin = 8; - break; - case -1000010030: - histPDG_reco->AddBinContent(10); - lorentzVector_particle_MC.SetPtEtaPhiM(track.pt(), track.eta(), track.phi(), constants::physics::MassTriton); - pdgbin = 9; - break; - case +1000020030: - histPDG_reco->AddBinContent(11); - lorentzVector_particle_MC.SetPtEtaPhiM(track.pt() * 2.0, track.eta(), track.phi(), constants::physics::MassHelium3); - pdgbin = 10; - break; - case -1000020030: - histPDG_reco->AddBinContent(12); - lorentzVector_particle_MC.SetPtEtaPhiM(track.pt() * 2.0, track.eta(), track.phi(), constants::physics::MassHelium3); - pdgbin = 11; - break; - case +1000020040: - histPDG_reco->AddBinContent(13); - lorentzVector_particle_MC.SetPtEtaPhiM(track.pt() * 2.0, track.eta(), track.phi(), constants::physics::MassAlpha); - pdgbin = 12; - break; - case -1000020040: - histPDG_reco->AddBinContent(14); - lorentzVector_particle_MC.SetPtEtaPhiM(track.pt() * 2.0, track.eta(), track.phi(), constants::physics::MassAlpha); - pdgbin = 13; - break; - default: - pdgbin = -10; - continue; - break; - } + const auto groupedCollisions = collisions.sliceBy(collPerCollMc, mcCollision.globalIndex()); + const auto groupedMcParticles = mcParticles.sliceBy(perCollisionMc, mcCollision.globalIndex()); - if (lorentzVector_particle_MC.Rapidity() < yMin_reco || lorentzVector_particle_MC.Rapidity() > yMax_reco) + if (groupedCollisions.size() < 1) continue; + float centrality = -1.; - float TPCnumberClsFound = track.tpcNClsFound(); - float TPC_nCls_Crossed_Rows = track.tpcNClsCrossedRows(); - float RatioCrossedRowsOverFindableTPC = track.tpcCrossedRowsOverFindableCls(); - float Chi2perClusterTPC = track.tpcChi2NCl(); - float Chi2perClusterITS = track.itsChi2NCl(); - - bool insideDCAxy = (std::abs(track.dcaXY()) <= (maxDcaXYFactor.value * (0.0105f + 0.0350f / pow(track.pt(), 1.1f)))); + /// loop over reconstructed collisions + for (const auto& collision : groupedCollisions) { + if (!isCollisionSelected(collision)) + continue; - if (!(insideDCAxy) || TMath::Abs(track.dcaZ()) > maxDCA_Z || TPCnumberClsFound < minTPCnClsFound || TPC_nCls_Crossed_Rows < minNCrossedRowsTPC || RatioCrossedRowsOverFindableTPC < minRatioCrossedRowsTPC || RatioCrossedRowsOverFindableTPC > maxRatioCrossedRowsTPC || Chi2perClusterTPC > maxChi2PerClusterTPC || Chi2perClusterTPC < minChi2PerClusterTPC || Chi2perClusterITS > maxChi2PerClusterITS || !(track.passedTPCRefit()) || !(track.passedITSRefit()) || (track.itsNClsInnerBarrel()) < minReqClusterITSib || (track.itsNCls()) < minReqClusterITS || track.pt() < p_min || track.pt() > p_max) - continue; - if ((requireITS && !(track.hasITS())) || (requireTPC && !(track.hasTPC()))) - continue; - if (requireGoldenChi2 && !(track.passedGoldenChi2())) - continue; + centrality = collision.centFT0C(); + if (centrality < minCentrality || centrality > maxCentrality) + continue; - MC_recon_reg.fill(HIST("histPhi"), track.phi(), pdgbin); - MC_recon_reg.fill(HIST("histEta"), track.eta(), pdgbin); - - if ((particle.pdgCode() == 1000020030) || (particle.pdgCode() == -1000020030) || (particle.pdgCode() == 1000020040) || (particle.pdgCode() == -1000020040)) { - if (track.hasITS()) { - MC_recon_reg.fill(HIST("hist_rec_ITS_vs_p"), track.p() * 2, pdgbin); - MC_recon_reg.fill(HIST("hist_rec_ITS_vs_pT"), track.pt() * 2, pdgbin); - if (track.hasTPC()) { - MC_recon_reg.fill(HIST("hist_rec_ITS_TPC_vs_p"), track.p() * 2, pdgbin); - MC_recon_reg.fill(HIST("hist_rec_ITS_TPC_vs_pT"), track.pt() * 2, pdgbin); - if (track.hasTOF()) { - MC_recon_reg.fill(HIST("hist_rec_ITS_TPC_TOF_vs_p"), track.p() * 2, pdgbin); - MC_recon_reg.fill(HIST("hist_rec_ITS_TPC_TOF_vs_pT"), track.pt() * 2, pdgbin); - } + MC_recon_reg.fill(HIST("histCentrality"), centrality); + MC_recon_reg.fill(HIST("histRecVtxMC"), collision.posZ()); + + const auto groupedTracks = tracks.sliceBy(perCollision, collision.globalIndex()); + + // Track loop + for (const auto& track : groupedTracks) { + if (!isTrackSelected(track)) + continue; + + const auto& particle = track.mcParticle(); + // TLorentzVector lorentzVector_particle_MC{}; + + int pdgbin = -10; + switch (particle.pdgCode()) { + case +211: + histPDG_reco->AddBinContent(1); + pdgbin = 0; + break; + case -211: + histPDG_reco->AddBinContent(2); + pdgbin = 1; + break; + case +321: + histPDG_reco->AddBinContent(3); + pdgbin = 2; + break; + case -321: + histPDG_reco->AddBinContent(4); + pdgbin = 3; + break; + case +2212: + histPDG_reco->AddBinContent(5); + pdgbin = 4; + break; + case -2212: + histPDG_reco->AddBinContent(6); + pdgbin = 5; + break; + case +1000010020: + histPDG_reco->AddBinContent(7); + pdgbin = 6; + break; + case -1000010020: + histPDG_reco->AddBinContent(8); + pdgbin = 7; + break; + case +1000010030: + histPDG_reco->AddBinContent(9); + pdgbin = 8; + break; + case -1000010030: + histPDG_reco->AddBinContent(10); + pdgbin = 9; + break; + case +1000020030: + histPDG_reco->AddBinContent(11); + pdgbin = 10; + break; + case -1000020030: + histPDG_reco->AddBinContent(12); + pdgbin = 11; + break; + case +1000020040: + histPDG_reco->AddBinContent(13); + pdgbin = 12; + break; + case -1000020040: + histPDG_reco->AddBinContent(14); + pdgbin = 13; + break; + default: + pdgbin = -10; + continue; + break; } - } - } else { - if (track.hasITS()) { - MC_recon_reg.fill(HIST("hist_rec_ITS_vs_p"), track.p(), pdgbin); - MC_recon_reg.fill(HIST("hist_rec_ITS_vs_pT"), track.pt(), pdgbin); - if (track.hasTPC()) { - MC_recon_reg.fill(HIST("hist_rec_ITS_TPC_vs_p"), track.p(), pdgbin); - MC_recon_reg.fill(HIST("hist_rec_ITS_TPC_vs_pT"), track.pt(), pdgbin); - if (track.hasTOF()) { - MC_recon_reg.fill(HIST("hist_rec_ITS_TPC_TOF_vs_p"), track.p(), pdgbin); - MC_recon_reg.fill(HIST("hist_rec_ITS_TPC_TOF_vs_pT"), track.pt(), pdgbin); + + MC_recon_reg.fill(HIST("histPhi"), track.phi(), pdgbin); + MC_recon_reg.fill(HIST("histEta"), track.eta(), pdgbin); + + if ((particle.pdgCode() == 1000020030) || (particle.pdgCode() == -1000020030) || (particle.pdgCode() == 1000020040) || (particle.pdgCode() == -1000020040)) { + if (track.hasITS()) { + MC_recon_reg.fill(HIST("hist_rec_ITS_vs_p"), track.p() * 2, pdgbin); + MC_recon_reg.fill(HIST("hist_rec_ITS_vs_pT"), track.pt() * 2, pdgbin); + if (track.hasTPC()) { + MC_recon_reg.fill(HIST("hist_rec_ITS_TPC_vs_p"), track.p() * 2, pdgbin); + MC_recon_reg.fill(HIST("hist_rec_ITS_TPC_vs_pT"), track.pt() * 2, pdgbin); + if (track.hasTOF()) { + MC_recon_reg.fill(HIST("hist_rec_ITS_TPC_TOF_vs_p"), track.p() * 2, pdgbin); + MC_recon_reg.fill(HIST("hist_rec_ITS_TPC_TOF_vs_pT"), track.pt() * 2, pdgbin); + } + } } - } - } - } - if (calc_cent) { - if ((particle.pdgCode() == 1000020030) || (particle.pdgCode() == -1000020030) || (particle.pdgCode() == 1000020040) || (particle.pdgCode() == -1000020040)) { - if (track.hasITS()) { - MC_recon_reg_cent.fill(HIST("hist_rec_ITS_vs_p_cent"), track.p() * 2, pdgbin, collision.centFT0C()); - MC_recon_reg_cent.fill(HIST("hist_rec_ITS_vs_pT_cent"), track.pt() * 2, pdgbin, collision.centFT0C()); - if (track.hasTPC()) { - MC_recon_reg_cent.fill(HIST("hist_rec_ITS_TPC_vs_p_cent"), track.p() * 2, pdgbin, collision.centFT0C()); - MC_recon_reg_cent.fill(HIST("hist_rec_ITS_TPC_vs_pT_cent"), track.pt() * 2, pdgbin, collision.centFT0C()); - if (track.hasTOF()) { - MC_recon_reg_cent.fill(HIST("hist_rec_ITS_TPC_TOF_vs_p_cent"), track.p() * 2, pdgbin, collision.centFT0C()); - MC_recon_reg_cent.fill(HIST("hist_rec_ITS_TPC_TOF_vs_pT_cent"), track.pt() * 2, pdgbin, collision.centFT0C()); + } else { + if (track.hasITS()) { + MC_recon_reg.fill(HIST("hist_rec_ITS_vs_p"), track.p(), pdgbin); + MC_recon_reg.fill(HIST("hist_rec_ITS_vs_pT"), track.pt(), pdgbin); + if (track.hasTPC()) { + MC_recon_reg.fill(HIST("hist_rec_ITS_TPC_vs_p"), track.p(), pdgbin); + MC_recon_reg.fill(HIST("hist_rec_ITS_TPC_vs_pT"), track.pt(), pdgbin); + if (track.hasTOF()) { + MC_recon_reg.fill(HIST("hist_rec_ITS_TPC_TOF_vs_p"), track.p(), pdgbin); + MC_recon_reg.fill(HIST("hist_rec_ITS_TPC_TOF_vs_pT"), track.pt(), pdgbin); + } } } } + } + + // Skipping collisions without the generated collisions + // Actually this should never happen, since we group per MC collision + if (!collision.has_mcCollision()) { + continue; } else { - if (track.hasITS()) { - MC_recon_reg_cent.fill(HIST("hist_rec_ITS_vs_p_cent"), track.p(), pdgbin, collision.centFT0C()); - MC_recon_reg_cent.fill(HIST("hist_rec_ITS_vs_pT_cent"), track.pt(), pdgbin, collision.centFT0C()); - if (track.hasTPC()) { - MC_recon_reg_cent.fill(HIST("hist_rec_ITS_TPC_vs_p_cent"), track.p(), pdgbin, collision.centFT0C()); - MC_recon_reg_cent.fill(HIST("hist_rec_ITS_TPC_vs_pT_cent"), track.pt(), pdgbin, collision.centFT0C()); - if (track.hasTOF()) { - MC_recon_reg_cent.fill(HIST("hist_rec_ITS_TPC_TOF_vs_p_cent"), track.p(), pdgbin, collision.centFT0C()); - MC_recon_reg_cent.fill(HIST("hist_rec_ITS_TPC_TOF_vs_pT_cent"), track.pt(), pdgbin, collision.centFT0C()); - } - } + // skip generated collisions outside the allowed vtx-z range + // putting this condition here avoids the particle loop a few lines below + if (applyPvZCutGenColl) { + const float genPvZ = mcCollision.posZ(); + if (genPvZ < -cfgCutVertex || genPvZ > cfgCutVertex) + continue; } } - } - } - } - //*********************************************************************************** + MC_gen_reg.fill(HIST("histGenVtxMC_reco"), mcCollision.posZ()); + MC_gen_reg.fill(HIST("histCentrality_reco"), centrality); + + /// only to fill denominator of ITS-TPC matched primary tracks only in MC events with at least 1 reco. vtx + for (const auto& particle : groupedMcParticles) { // Particle loop + + /// require generated particle in acceptance + if (!isInAcceptance(particle)) + continue; + + int pdgbin = -10; + switch (particle.pdgCode()) { + case +211: + histPDG_gen_reco->AddBinContent(1); + pdgbin = 0; + break; + case -211: + histPDG_gen_reco->AddBinContent(2); + pdgbin = 1; + break; + case +321: + histPDG_gen_reco->AddBinContent(3); + pdgbin = 2; + break; + case -321: + histPDG_gen_reco->AddBinContent(4); + pdgbin = 3; + break; + case +2212: + histPDG_gen_reco->AddBinContent(5); + pdgbin = 4; + break; + case -2212: + histPDG_gen_reco->AddBinContent(6); + pdgbin = 5; + break; + case +1000010020: + histPDG_gen_reco->AddBinContent(7); + pdgbin = 6; + break; + case -1000010020: + histPDG_gen_reco->AddBinContent(8); + pdgbin = 7; + break; + case +1000010030: + histPDG_gen_reco->AddBinContent(9); + pdgbin = 8; + break; + case -1000010030: + histPDG_gen_reco->AddBinContent(10); + pdgbin = 9; + break; + case +1000020030: + histPDG_gen_reco->AddBinContent(11); + pdgbin = 10; + break; + case -1000020030: + histPDG_gen_reco->AddBinContent(12); + pdgbin = 11; + break; + case +1000020040: + histPDG_gen_reco->AddBinContent(13); + pdgbin = 12; + break; + case -1000020040: + histPDG_gen_reco->AddBinContent(14); + pdgbin = 13; + break; + default: + pdgbin = -10; + continue; + break; + } + MC_gen_reg.fill(HIST("histEta_reco"), particle.eta(), pdgbin); + MC_gen_reg.fill(HIST("hist_gen_reco_p"), particle.p(), pdgbin); + MC_gen_reg.fill(HIST("hist_gen_reco_pT"), particle.pt(), pdgbin); + } + } /// end loop over reconstructed collisions - void processMCgen(aod::McCollision const& mcCollision, aod::McParticles const& mcParticles) - { - process_MC_gen(mcCollision, mcParticles); - } - PROCESS_SWITCH(NucleiEfficiencyTask, processMCgen, "process generated MC", true); + // skip generated collisions outside the allowed vtx-z range + // putting this condition here avoids the particle loop a few lines below + if (applyPvZCutGenColl) { + const float genPvZ = mcCollision.posZ(); + if (genPvZ < -cfgCutVertex || genPvZ > cfgCutVertex) { + continue; + } + } - Filter collisionFilter = (nabs(aod::collision::posZ) < cfgCutVertex); - Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta && requireGlobalTrackWoDCAInFilter()); + // Loop on particles to fill the denominator + for (const auto& mcParticle : groupedMcParticles) { + if (!isInAcceptance(mcParticle)) + continue; - void processMCreco(soa::Filtered>::iterator const& collision, - soa::Filtered> const& tracks, - aod::McParticles const& mcParticles) - { - process_MC_reco(collision, tracks, mcParticles); + MC_gen_reg.fill(HIST("histGenVtxMC"), mcCollision.posZ()); + // MC_gen_reg.fill(HIST("histCentrality"), mcParticle.impactParameter()); + + int pdgbin = -10; + switch (mcParticle.pdgCode()) { + case +211: + histPDG_gen->AddBinContent(1); + pdgbin = 0; + break; + case -211: + histPDG_gen->AddBinContent(2); + pdgbin = 1; + break; + case +321: + histPDG_gen->AddBinContent(3); + pdgbin = 2; + break; + case -321: + histPDG_gen->AddBinContent(4); + pdgbin = 3; + break; + case +2212: + histPDG_gen->AddBinContent(5); + pdgbin = 4; + break; + case -2212: + histPDG_gen->AddBinContent(6); + pdgbin = 5; + break; + case +1000010020: + histPDG_gen->AddBinContent(7); + pdgbin = 6; + break; + case -1000010020: + histPDG_gen->AddBinContent(8); + pdgbin = 7; + break; + case +1000010030: + histPDG_gen->AddBinContent(9); + pdgbin = 8; + break; + case -1000010030: + histPDG_gen->AddBinContent(10); + pdgbin = 9; + break; + case +1000020030: + histPDG_gen->AddBinContent(11); + pdgbin = 10; + break; + case -1000020030: + histPDG_gen->AddBinContent(12); + pdgbin = 11; + break; + case +1000020040: + histPDG_gen->AddBinContent(13); + pdgbin = 12; + break; + case -1000020040: + histPDG_gen->AddBinContent(14); + pdgbin = 13; + break; + default: + pdgbin = -10; + continue; + break; + } + + MC_gen_reg.fill(HIST("histPhi"), mcParticle.phi(), pdgbin); + MC_gen_reg.fill(HIST("histEta"), mcParticle.eta(), pdgbin); + MC_gen_reg.fill(HIST("histRapid"), mcParticle.y(), pdgbin); + MC_gen_reg.fill(HIST("hist_gen_p"), mcParticle.p(), pdgbin); + MC_gen_reg.fill(HIST("hist_gen_pT"), mcParticle.pt(), pdgbin); + } + } /// end loop over generated collisions } - PROCESS_SWITCH(NucleiEfficiencyTask, processMCreco, "process reconstructed MC", false); + PROCESS_SWITCH(NucleiEfficiencyTask, processMC, "process generated MC", true); }; //*********************************************************************************** From 455540ad3ffe4c624270fb73fc2489e8bb25e034 Mon Sep 17 00:00:00 2001 From: ilikmeta <152337132+ilikmeta@users.noreply.github.com> Date: Thu, 20 Feb 2025 15:40:12 -0600 Subject: [PATCH 0361/1650] [PWGCF] Fix centrality decision (#10118) Co-authored-by: Iris Likmeta --- PWGCF/Flow/Tasks/flowGfwTask.cxx | 36 +++++++++++++++++--------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowGfwTask.cxx b/PWGCF/Flow/Tasks/flowGfwTask.cxx index 985352364a5..b452eec4539 100644 --- a/PWGCF/Flow/Tasks/flowGfwTask.cxx +++ b/PWGCF/Flow/Tasks/flowGfwTask.cxx @@ -259,11 +259,11 @@ struct FlowGfwTask { registry.get(HIST("hCentEstimators"))->GetXaxis()->SetBinLabel(kCentFT0M + 1, "FT0M"); registry.get(HIST("hCentEstimators"))->GetXaxis()->SetBinLabel(kCentFV0A + 1, "FV0A"); registry.get(HIST("hCentEstimators"))->GetXaxis()->SetBinLabel(kCentFT0CVariant1 + 1, "FT0CVar1"); - registry.add("hCentFT0C", "FT0C Unfiltered;Centrality FT0C ;Events", kTH1F, {axisCentrality}); - registry.add("hCentFT0A", "FT0A Unfiltered;Centrality FT0A ;Events", kTH1F, {axisCentrality}); - registry.add("hCentFT0M", "FT0M Unfiltered;Centrality FT0M ;Events", kTH1F, {axisCentrality}); - registry.add("hCentFV0A", "FV0A Unfiltered;Centrality FV0A ;Events", kTH1F, {axisCentrality}); - registry.add("hCentFT0CVariant1", "FT0CVariant1 Unfiltered;Centrality FT0CVariant1 ;Events", kTH1F, {axisCentrality}); + registry.add("hCentFT0C", "Uncorrected FT0C;Centrality FT0C ;Events", kTH1F, {axisCentrality}); + registry.add("hCentFT0A", "Uncorrected FT0A;Centrality FT0A ;Events", kTH1F, {axisCentrality}); + registry.add("hCentFT0M", "Uncorrected FT0M;Centrality FT0M ;Events", kTH1F, {axisCentrality}); + registry.add("hCentFV0A", "Uncorrected FV0A;Centrality FV0A ;Events", kTH1F, {axisCentrality}); + registry.add("hCentFT0CVariant1", "Uncorrected FT0CVariant1;Centrality FT0CVariant1 ;Events", kTH1F, {axisCentrality}); // Before cuts registry.add("BeforeCut_globalTracks_centT0C", "before cut;Centrality T0C;mulplicity global tracks", {HistType::kTH2D, {axisCentForQA, axisNch}}); @@ -721,29 +721,31 @@ struct FlowGfwTask { return; // Choose centrality estimator -- Only one can be true - float centrality = 0; + auto centrality = -1; if (cfgcentEstFt0c) { - const auto centrality = collision.centFT0C(); + centrality = collision.centFT0C(); registry.fill(HIST("hCentEstimators"), kCentFT0C); registry.fill(HIST("hCentFT0C"), centrality); - } else if (cfgcentEstFt0a) { - const auto centrality = collision.centFT0A(); + } + if (cfgcentEstFt0a) { + centrality = collision.centFT0A(); registry.fill(HIST("hCentEstimators"), kCentFT0A); registry.fill(HIST("hCentFT0A"), centrality); - } else if (cfgcentEstFt0m) { - const auto centrality = collision.centFT0M(); + } + if (cfgcentEstFt0m) { + centrality = collision.centFT0M(); registry.fill(HIST("hCentEstimators"), kCentFT0M); registry.fill(HIST("hCentFT0M"), centrality); - } else if (cfgcentEstFv0a) { - const auto centrality = collision.centFV0A(); + } + if (cfgcentEstFv0a) { + centrality = collision.centFV0A(); registry.fill(HIST("hCentEstimators"), kCentFV0A); registry.fill(HIST("hCentFV0A"), centrality); - } else if (cfgcentEstFt0cVariant1) { - const auto centrality = collision.centFT0CVariant1(); + } + if (cfgcentEstFt0cVariant1) { + centrality = collision.centFT0CVariant1(); registry.fill(HIST("hCentEstimators"), kCentFT0CVariant1); registry.fill(HIST("hCentFT0CVariant1"), centrality); - } else { - return; } // fill event QA before cuts From 15c71eee5f0983e54ca4351423d198623f6ff0d5 Mon Sep 17 00:00:00 2001 From: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> Date: Fri, 21 Feb 2025 01:16:18 +0100 Subject: [PATCH 0362/1650] [PWGLF] Add TPCchi2 and shared clusters in strangeness data model + fixes in V0 analysis task (#10113) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Nicolò Jacazio --- PWGLF/DataModel/LFStrangenessTables.h | 37 +++++++- .../Strangeness/Converters/CMakeLists.txt | 5 ++ .../stradautracksextraconverter3.cxx | 43 ++++++++++ .../Strangeness/strangederivedbuilder.cxx | 8 +- .../derivedlambdakzeroanalysis.cxx | 86 +++++++++++++++++-- 5 files changed, 167 insertions(+), 12 deletions(-) create mode 100644 PWGLF/TableProducer/Strangeness/Converters/stradautracksextraconverter3.cxx diff --git a/PWGLF/DataModel/LFStrangenessTables.h b/PWGLF/DataModel/LFStrangenessTables.h index 8197a9899f2..bc7a4883fb8 100644 --- a/PWGLF/DataModel/LFStrangenessTables.h +++ b/PWGLF/DataModel/LFStrangenessTables.h @@ -417,10 +417,45 @@ DECLARE_SOA_TABLE_VERSIONED(DauTrackExtras_002, "AOD", "DAUTRACKEXTRA", 2, //! d dautrack::HasTRD, dautrack::HasTOF); +DECLARE_SOA_TABLE_VERSIONED(DauTrackExtras_003, "AOD", "DAUTRACKEXTRA", 3, //! detector properties of decay daughters + track::ITSChi2NCl, + track::TPCChi2NCl, + dautrack::DetectorMap, // here we don´t save everything so we simplify this + track::ITSClusterSizes, + track::TPCNClsFindable, + track::TPCNClsFindableMinusFound, + track::TPCNClsFindableMinusCrossedRows, + track::TPCNClsShared, + + // Dynamics for ITS matching TracksExtra + track::v001::ITSNClsInnerBarrel, + track::v001::ITSClsSizeInLayer, + track::v001::ITSClusterMap, + track::v001::ITSNCls, + track::v001::IsITSAfterburner, + /*compatibility*/ dautrack::HasITSTracker, + /*compatibility*/ dautrack::HasITSAfterburner, + + // dynamics for TPC tracking properties matching main data model + track::TPCCrossedRowsOverFindableCls, + track::TPCFoundOverFindableCls, + track::TPCNClsFound, + track::TPCNClsCrossedRows, + track::TPCFractionSharedCls, + /*compatibility*/ dautrack::compatibility::TPCClusters, + /*compatibility*/ dautrack::compatibility::TPCCrossedRows, + /*compatibility*/ dautrack::compatibility::ITSChi2PerNcl, + + // dynamics to identify detectors + dautrack::HasITS, + dautrack::HasTPC, + dautrack::HasTRD, + dautrack::HasTOF); + DECLARE_SOA_TABLE(DauTrackMCIds, "AOD", "DAUTRACKMCID", // index table when using AO2Ds dautrack::ParticleMCId); -using DauTrackExtras = DauTrackExtras_002; +using DauTrackExtras = DauTrackExtras_003; using DauTrackExtra = DauTrackExtras::iterator; namespace motherParticle diff --git a/PWGLF/TableProducer/Strangeness/Converters/CMakeLists.txt b/PWGLF/TableProducer/Strangeness/Converters/CMakeLists.txt index c9965f51474..56325210aa1 100644 --- a/PWGLF/TableProducer/Strangeness/Converters/CMakeLists.txt +++ b/PWGLF/TableProducer/Strangeness/Converters/CMakeLists.txt @@ -19,6 +19,11 @@ o2physics_add_dpl_workflow(stradautracksextraconverter2 PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(stradautracksextraconverter3 + SOURCES stradautracksextraconverter3.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(strarawcentsconverter SOURCES strarawcentsconverter.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore diff --git a/PWGLF/TableProducer/Strangeness/Converters/stradautracksextraconverter3.cxx b/PWGLF/TableProducer/Strangeness/Converters/stradautracksextraconverter3.cxx new file mode 100644 index 00000000000..a4144c1ee9a --- /dev/null +++ b/PWGLF/TableProducer/Strangeness/Converters/stradautracksextraconverter3.cxx @@ -0,0 +1,43 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" +#include "PWGLF/DataModel/LFStrangenessPIDTables.h" + +using namespace o2; +using namespace o2::framework; + +// Converts daughter TracksExtra from 2 to 3 +struct stradautracksextraconverter3 { + Produces dauTrackExtras_003; + + void process(aod::DauTrackExtras_002 const& dauTrackExtras_002) + { + for (auto& values : dauTrackExtras_002) { + dauTrackExtras_003(values.itsChi2PerNcl(), + -1 /* dummy tpcChi2PerNcl value */, + values.detectorMap(), + values.itsClusterSizes(), + values.tpcNClsFindable(), + values.tpcNClsFindableMinusFound(), + values.tpcNClsFindableMinusCrossedRows(), + -1 /* dummy tpcNClsShared value */); + } + } +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc)}; +} diff --git a/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx index 93bd842c5ac..6c8edd1adcd 100644 --- a/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx @@ -694,11 +694,13 @@ struct strangederivedbuilder { for (auto const& tr : tracksExtra) { if (trackMap[tr.globalIndex()] >= 0) { dauTrackExtras(tr.itsChi2NCl(), + tr.tpcChi2NCl(), tr.detectorMap(), tr.itsClusterSizes(), tr.tpcNClsFindable(), tr.tpcNClsFindableMinusFound(), - tr.tpcNClsFindableMinusCrossedRows()); + tr.tpcNClsFindableMinusCrossedRows(), + tr.tpcNClsShared()); } } // done! @@ -788,11 +790,13 @@ struct strangederivedbuilder { for (auto const& tr : tracksExtra) { if (trackMap[tr.globalIndex()] >= 0) { dauTrackExtras(tr.itsChi2NCl(), + tr.tpcChi2NCl(), tr.detectorMap(), tr.itsClusterSizes(), tr.tpcNClsFindable(), tr.tpcNClsFindableMinusFound(), - tr.tpcNClsFindableMinusCrossedRows()); + tr.tpcNClsFindableMinusCrossedRows(), + tr.tpcNClsShared()); // _________________________________________ // if the table has MC info diff --git a/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx b/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx index 8062f74ef9e..c5db2865986 100644 --- a/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx @@ -154,11 +154,17 @@ struct derivedlambdakzeroanalysis { // Track quality Configurable minTPCrows{"minTPCrows", 70, "minimum TPC crossed rows"}; Configurable minITSclusters{"minITSclusters", -1, "minimum ITS clusters"}; + Configurable minTPCrowsOverFindableClusters{"minTPCrowsOverFindableClusters", -1, "minimum nbr of TPC crossed rows over findable"}; + Configurable maxFractionTPCSharedClusters{"maxFractionTPCSharedClusters", 1e+09, "maximum fraction of TPC shared clusters"}; + Configurable maxITSchi2PerNcls{"maxITSchi2PerNcls", 1e+09, "maximum ITS chi2 per clusters"}; + Configurable maxTPCchi2PerNcls{"maxTPCchi2PerNcls", 1e+09, "maximum TPC chi2 per clusters"}; Configurable skipTPConly{"skipTPConly", false, "skip V0s comprised of at least one TPC only prong"}; Configurable requirePosITSonly{"requirePosITSonly", false, "require that positive track is ITSonly (overrides TPC quality)"}; Configurable requireNegITSonly{"requireNegITSonly", false, "require that negative track is ITSonly (overrides TPC quality)"}; Configurable rejectPosITSafterburner{"rejectPosITSafterburner", false, "reject positive track formed out of afterburner ITS tracks"}; Configurable rejectNegITSafterburner{"rejectNegITSafterburner", false, "reject negative track formed out of afterburner ITS tracks"}; + Configurable requirePosITSafterburnerOnly{"requirePosITSafterburnerOnly", false, "require positive track formed out of afterburner ITS tracks"}; + Configurable requireNegITSafterburnerOnly{"requireNegITSafterburnerOnly", false, "require negative track formed out of afterburner ITS tracks"}; // PID (TPC/TOF) Configurable TpcPidNsigmaCut{"TpcPidNsigmaCut", 5, "TpcPidNsigmaCut"}; @@ -262,6 +268,8 @@ struct derivedlambdakzeroanalysis { ConfigurableAxis axisTOFdeltaT{"axisTOFdeltaT", {200, -5000.0f, 5000.0f}, "TOF Delta T (ps)"}; ConfigurableAxis axisPhi{"axisPhi", {18, 0.0f, constants::math::TwoPI}, "Azimuth angle (rad)"}; ConfigurableAxis axisEta{"axisEta", {10, -1.0f, 1.0f}, "#eta"}; + ConfigurableAxis axisITSchi2{"axisITSchi2", {100, 0.0f, 100.0f}, "#chi^{2} per ITS clusters"}; + ConfigurableAxis axisTPCchi2{"axisTPCchi2", {100, 0.0f, 100.0f}, "#chi^{2} per TPC clusters"}; // UPC axes ConfigurableAxis axisSelGap{"axisSelGap", {4, -1.5, 2.5}, "Gap side"}; @@ -574,6 +582,14 @@ struct derivedlambdakzeroanalysis { histos.add("K0Short/h5dNegDetectPropVsCentrality", "h5dNegDetectPropVsCentrality", kTHnF, {axisCentrality, axisDetMap, axisITScluMap, axisPtCoarse, axisK0Mass}); } if (doDetectPropQA == 3) { + histos.add("K0Short/h3dITSchi2", "h3dMaxITSchi2", kTH3F, {axisCentrality, axisPtCoarse, axisITSchi2}); + histos.add("K0Short/h3dTPCchi2", "h3dMaxTPCchi2", kTH3F, {axisCentrality, axisPtCoarse, axisTPCchi2}); + histos.add("K0Short/h3dTPCrowsOverFindable", "h3dTPCrowsOverFindable", kTH3F, {axisCentrality, axisPtCoarse, {100, 0.0f, 1.0f}}); + histos.add("K0Short/h3dTPCsharedCls", "h3dTPCsharedCls", kTH3F, {axisCentrality, axisPtCoarse, {100, 0.0f, 1.0f}}); + histos.add("K0Short/h3dPositiveITSchi2", "h3dPositiveITSchi2", kTH3F, {axisCentrality, axisPtCoarse, axisITSchi2}); + histos.add("K0Short/h3dNegativeITSchi2", "h3dNegativeITSchi2", kTH3F, {axisCentrality, axisPtCoarse, axisITSchi2}); + histos.add("K0Short/h3dPositiveTPCchi2", "h3dPositiveTPCchi2", kTH3F, {axisCentrality, axisPtCoarse, axisTPCchi2}); + histos.add("K0Short/h3dNegativeTPCchi2", "h3dNegativeTPCchi2", kTH3F, {axisCentrality, axisPtCoarse, axisTPCchi2}); histos.add("K0Short/h3dPositiveITSclusters", "h3dPositiveITSclusters", kTH3F, {axisCentrality, axisPtCoarse, axisITSclus}); histos.add("K0Short/h3dNegativeITSclusters", "h3dNegativeITSclusters", kTH3F, {axisCentrality, axisPtCoarse, axisITSclus}); histos.add("K0Short/h3dPositiveTPCcrossedRows", "h3dPositiveTPCcrossedRows", kTH3F, {axisCentrality, axisPtCoarse, axisTPCrows}); @@ -632,6 +648,14 @@ struct derivedlambdakzeroanalysis { histos.add("Lambda/h5dNegDetectPropVsCentrality", "h5dNegDetectPropVsCentrality", kTHnF, {axisCentrality, axisDetMap, axisITScluMap, axisPtCoarse, axisLambdaMass}); } if (doDetectPropQA == 3) { + histos.add("Lambda/h3dITSchi2", "h3dMaxITSchi2", kTH3F, {axisCentrality, axisPtCoarse, axisITSchi2}); + histos.add("Lambda/h3dTPCchi2", "h3dMaxTPCchi2", kTH3F, {axisCentrality, axisPtCoarse, axisTPCchi2}); + histos.add("Lambda/h3dTPCrowsOverFindable", "h3dTPCrowsOverFindable", kTH3F, {axisCentrality, axisPtCoarse, {100, 0.0f, 1.0f}}); + histos.add("Lambda/h3dTPCsharedCls", "h3dTPCsharedCls", kTH3F, {axisCentrality, axisPtCoarse, {100, 0.0f, 1.0f}}); + histos.add("Lambda/h3dPositiveITSchi2", "h3dPositiveITSchi2", kTH3F, {axisCentrality, axisPtCoarse, axisITSchi2}); + histos.add("Lambda/h3dNegativeITSchi2", "h3dNegativeITSchi2", kTH3F, {axisCentrality, axisPtCoarse, axisITSchi2}); + histos.add("Lambda/h3dPositiveTPCchi2", "h3dPositiveTPCchi2", kTH3F, {axisCentrality, axisPtCoarse, axisTPCchi2}); + histos.add("Lambda/h3dNegativeTPCchi2", "h3dNegativeTPCchi2", kTH3F, {axisCentrality, axisPtCoarse, axisTPCchi2}); histos.add("Lambda/h3dPositiveITSclusters", "h3dPositiveITSclusters", kTH3F, {axisCentrality, axisPtCoarse, axisITSclus}); histos.add("Lambda/h3dNegativeITSclusters", "h3dNegativeITSclusters", kTH3F, {axisCentrality, axisPtCoarse, axisITSclus}); histos.add("Lambda/h3dPositiveTPCcrossedRows", "h3dPositiveTPCcrossedRows", kTH3F, {axisCentrality, axisPtCoarse, axisTPCrows}); @@ -690,6 +714,14 @@ struct derivedlambdakzeroanalysis { histos.add("AntiLambda/h5dNegDetectPropVsCentrality", "h5dNegDetectPropVsCentrality", kTHnF, {axisCentrality, axisDetMap, axisITScluMap, axisPtCoarse, axisLambdaMass}); } if (doDetectPropQA == 3) { + histos.add("AntiLambda/h3dITSchi2", "h3dMaxITSchi2", kTH3F, {axisCentrality, axisPtCoarse, axisITSchi2}); + histos.add("AntiLambda/h3dTPCchi2", "h3dMaxTPCchi2", kTH3F, {axisCentrality, axisPtCoarse, axisTPCchi2}); + histos.add("AntiLambda/h3dTPCrowsOverFindable", "h3dTPCrowsOverFindable", kTH3F, {axisCentrality, axisPtCoarse, {100, 0.0f, 1.0f}}); + histos.add("AntiLambda/h3dTPCsharedCls", "h3dTPCsharedCls", kTH3F, {axisCentrality, axisPtCoarse, {100, 0.0f, 1.0f}}); + histos.add("AntiLambda/h3dPositiveITSchi2", "h3dPositiveITSchi2", kTH3F, {axisCentrality, axisPtCoarse, axisITSchi2}); + histos.add("AntiLambda/h3dNegativeITSchi2", "h3dNegativeITSchi2", kTH3F, {axisCentrality, axisPtCoarse, axisITSchi2}); + histos.add("AntiLambda/h3dPositiveTPCchi2", "h3dPositiveTPCchi2", kTH3F, {axisCentrality, axisPtCoarse, axisTPCchi2}); + histos.add("AntiLambda/h3dNegativeTPCchi2", "h3dNegativeTPCchi2", kTH3F, {axisCentrality, axisPtCoarse, axisTPCchi2}); histos.add("AntiLambda/h3dPositiveITSclusters", "h3dPositiveITSclusters", kTH3F, {axisCentrality, axisPtCoarse, axisITSclus}); histos.add("AntiLambda/h3dNegativeITSclusters", "h3dNegativeITSclusters", kTH3F, {axisCentrality, axisPtCoarse, axisITSclus}); histos.add("AntiLambda/h3dPositiveTPCcrossedRows", "h3dPositiveTPCcrossedRows", kTH3F, {axisCentrality, axisPtCoarse, axisTPCrows}); @@ -887,19 +919,31 @@ struct derivedlambdakzeroanalysis { auto negTrackExtra = v0.template negTrackExtra_as(); // ITS quality flags - bool posIsFromAfterburner = posTrackExtra.itsChi2PerNcl() < 0; - bool negIsFromAfterburner = negTrackExtra.itsChi2PerNcl() < 0; - - // check minimum number of ITS clusters + reject ITS afterburner tracks if requested - if (posTrackExtra.itsNCls() >= v0Selections.minITSclusters && (!v0Selections.rejectPosITSafterburner || !posIsFromAfterburner)) + bool posIsFromAfterburner = posTrackExtra.hasITSAfterburner(); + bool negIsFromAfterburner = negTrackExtra.hasITSAfterburner(); + + // check minimum number of ITS clusters + maximum ITS chi2 per clusters + reject or select ITS afterburner tracks if requested + if (posTrackExtra.itsNCls() >= v0Selections.minITSclusters && // check minium ITS clusters + posTrackExtra.itsChi2NCl() < v0Selections.maxITSchi2PerNcls && // check maximum ITS chi2 per clusters + (!v0Selections.rejectPosITSafterburner || !posIsFromAfterburner) && // reject afterburner track or not + (!v0Selections.requirePosITSafterburnerOnly || posIsFromAfterburner)) // keep afterburner track or not bitset(bitMap, selPosGoodITSTrack); - if (negTrackExtra.itsNCls() >= v0Selections.minITSclusters && (!v0Selections.rejectNegITSafterburner || !negIsFromAfterburner)) + if (negTrackExtra.itsNCls() >= v0Selections.minITSclusters && // check minium ITS clusters + negTrackExtra.itsChi2NCl() < v0Selections.maxITSchi2PerNcls && // check maximum ITS chi2 per clusters + (!v0Selections.rejectNegITSafterburner || !negIsFromAfterburner) && // reject afterburner track or not + (!v0Selections.requireNegITSafterburnerOnly || negIsFromAfterburner)) // select only afterburner track or not bitset(bitMap, selNegGoodITSTrack); // TPC quality flags - if (posTrackExtra.tpcCrossedRows() >= v0Selections.minTPCrows) + if (posTrackExtra.tpcCrossedRows() >= v0Selections.minTPCrows && // check minimum TPC crossed rows + posTrackExtra.tpcChi2NCl() < v0Selections.maxTPCchi2PerNcls && // check maximum TPC chi2 per clusters + posTrackExtra.tpcCrossedRowsOverFindableCls() >= v0Selections.minTPCrowsOverFindableClusters && // check minimum fraction of TPC rows over findable + posTrackExtra.tpcFractionSharedCls() < v0Selections.maxFractionTPCSharedClusters) // check the maximum fraction of allowed shared TPC clusters bitset(bitMap, selPosGoodTPCTrack); - if (negTrackExtra.tpcCrossedRows() >= v0Selections.minTPCrows) + if (negTrackExtra.tpcCrossedRows() >= v0Selections.minTPCrows && // check minimum TPC crossed rows + negTrackExtra.tpcChi2NCl() < v0Selections.maxTPCchi2PerNcls && // check maximum TPC chi2 per clusters + negTrackExtra.tpcCrossedRowsOverFindableCls() >= v0Selections.minTPCrowsOverFindableClusters && // check minimum fraction of TPC rows over findable + negTrackExtra.tpcFractionSharedCls() < v0Selections.maxFractionTPCSharedClusters) // check the maximum fraction of allowed shared TPC clusters bitset(bitMap, selNegGoodTPCTrack); // TPC PID @@ -1267,6 +1311,14 @@ struct derivedlambdakzeroanalysis { histos.fill(HIST("K0Short/h5dNegDetectPropVsCentrality"), centrality, negTrackExtra.detectorMap(), negTrackExtra.itsClusterMap(), pt, v0.mK0Short()); } if (doDetectPropQA == 3) { + histos.fill(HIST("K0Short/h3dITSchi2"), centrality, pt, std::max(posTrackExtra.itsChi2NCl(), negTrackExtra.itsChi2NCl())); + histos.fill(HIST("K0Short/h3dTPCchi2"), centrality, pt, std::max(posTrackExtra.tpcChi2NCl(), negTrackExtra.tpcChi2NCl())); + histos.fill(HIST("K0Short/h3dTPCrowsOverFindable"), centrality, pt, std::min(posTrackExtra.tpcCrossedRowsOverFindableCls(), negTrackExtra.tpcCrossedRowsOverFindableCls())); + histos.fill(HIST("K0Short/h3dTPCsharedCls"), centrality, pt, std::max(posTrackExtra.tpcFractionSharedCls(), negTrackExtra.tpcFractionSharedCls())); + histos.fill(HIST("K0Short/h3dPositiveITSchi2"), centrality, pt, posTrackExtra.itsChi2NCl()); + histos.fill(HIST("K0Short/h3dNegativeITSchi2"), centrality, pt, negTrackExtra.itsChi2NCl()); + histos.fill(HIST("K0Short/h3dPositiveTPCchi2"), centrality, pt, posTrackExtra.tpcChi2NCl()); + histos.fill(HIST("K0Short/h3dNegativeTPCchi2"), centrality, pt, negTrackExtra.tpcChi2NCl()); histos.fill(HIST("K0Short/h3dPositiveITSclusters"), centrality, pt, posTrackExtra.itsNCls()); histos.fill(HIST("K0Short/h3dNegativeITSclusters"), centrality, pt, negTrackExtra.itsNCls()); histos.fill(HIST("K0Short/h3dPositiveTPCcrossedRows"), centrality, pt, posTrackExtra.tpcCrossedRows()); @@ -1332,6 +1384,14 @@ struct derivedlambdakzeroanalysis { histos.fill(HIST("Lambda/h5dNegDetectPropVsCentrality"), centrality, negTrackExtra.detectorMap(), negTrackExtra.itsClusterMap(), pt, v0.mLambda()); } if (doDetectPropQA == 3) { + histos.fill(HIST("Lambda/h3dITSchi2"), centrality, pt, std::max(posTrackExtra.itsChi2NCl(), negTrackExtra.itsChi2NCl())); + histos.fill(HIST("Lambda/h3dTPCchi2"), centrality, pt, std::max(posTrackExtra.tpcChi2NCl(), negTrackExtra.tpcChi2NCl())); + histos.fill(HIST("Lambda/h3dTPCrowsOverFindable"), centrality, pt, std::min(posTrackExtra.tpcCrossedRowsOverFindableCls(), negTrackExtra.tpcCrossedRowsOverFindableCls())); + histos.fill(HIST("Lambda/h3dTPCsharedCls"), centrality, pt, std::max(posTrackExtra.tpcFractionSharedCls(), negTrackExtra.tpcFractionSharedCls())); + histos.fill(HIST("Lambda/h3dPositiveITSchi2"), centrality, pt, posTrackExtra.itsChi2NCl()); + histos.fill(HIST("Lambda/h3dNegativeITSchi2"), centrality, pt, negTrackExtra.itsChi2NCl()); + histos.fill(HIST("Lambda/h3dPositiveTPCchi2"), centrality, pt, posTrackExtra.tpcChi2NCl()); + histos.fill(HIST("Lambda/h3dNegativeTPCchi2"), centrality, pt, negTrackExtra.tpcChi2NCl()); histos.fill(HIST("Lambda/h3dPositiveITSclusters"), centrality, pt, posTrackExtra.itsNCls()); histos.fill(HIST("Lambda/h3dNegativeITSclusters"), centrality, pt, negTrackExtra.itsNCls()); histos.fill(HIST("Lambda/h3dPositiveTPCcrossedRows"), centrality, pt, posTrackExtra.tpcCrossedRows()); @@ -1397,6 +1457,14 @@ struct derivedlambdakzeroanalysis { histos.fill(HIST("AntiLambda/h5dNegDetectPropVsCentrality"), centrality, negTrackExtra.detectorMap(), negTrackExtra.itsClusterMap(), pt, v0.mAntiLambda()); } if (doDetectPropQA == 3) { + histos.fill(HIST("AntiLambda/h3dITSchi2"), centrality, pt, std::max(posTrackExtra.itsChi2NCl(), negTrackExtra.itsChi2NCl())); + histos.fill(HIST("AntiLambda/h3dTPCchi2"), centrality, pt, std::max(posTrackExtra.tpcChi2NCl(), negTrackExtra.tpcChi2NCl())); + histos.fill(HIST("AntiLambda/h3dTPCrowsOverFindable"), centrality, pt, std::min(posTrackExtra.tpcCrossedRowsOverFindableCls(), negTrackExtra.tpcCrossedRowsOverFindableCls())); + histos.fill(HIST("AntiLambda/h3dTPCsharedCls"), centrality, pt, std::max(posTrackExtra.tpcFractionSharedCls(), negTrackExtra.tpcFractionSharedCls())); + histos.fill(HIST("AntiLambda/h3dPositiveITSchi2"), centrality, pt, posTrackExtra.itsChi2NCl()); + histos.fill(HIST("AntiLambda/h3dNegativeITSchi2"), centrality, pt, negTrackExtra.itsChi2NCl()); + histos.fill(HIST("AntiLambda/h3dPositiveTPCchi2"), centrality, pt, posTrackExtra.tpcChi2NCl()); + histos.fill(HIST("AntiLambda/h3dNegativeTPCchi2"), centrality, pt, negTrackExtra.tpcChi2NCl()); histos.fill(HIST("AntiLambda/h3dPositiveITSclusters"), centrality, pt, posTrackExtra.itsNCls()); histos.fill(HIST("AntiLambda/h3dNegativeITSclusters"), centrality, pt, negTrackExtra.itsNCls()); histos.fill(HIST("AntiLambda/h3dPositiveTPCcrossedRows"), centrality, pt, posTrackExtra.tpcCrossedRows()); @@ -1645,7 +1713,7 @@ struct derivedlambdakzeroanalysis { } else { // we are in Pb-Pb float collisionOccupancy = eventSelections.useFT0CbasedOccupancy ? collision.ft0cOccupancyInTimeRange() : collision.trackOccupancyInTimeRange(); - if (eventSelections.minOccupancy >= 0 && collisionOccupancy < eventSelections.minOccupancy) { + if (eventSelections.minOccupancy >= 0 && collisionOccupancy <= eventSelections.minOccupancy) { return false; } if (fillHists) From 47f225b423a6390d8a24339ea9b90b2bf26a0d94 Mon Sep 17 00:00:00 2001 From: yhambard <127940767+yhambard@users.noreply.github.com> Date: Fri, 21 Feb 2025 14:48:31 +0400 Subject: [PATCH 0363/1650] [PWGEM] phosElId.cxx centrality update (#10120) --- PWGEM/Tasks/phosElId.cxx | 504 +++++++++++++++++++++++---------------- 1 file changed, 293 insertions(+), 211 deletions(-) diff --git a/PWGEM/Tasks/phosElId.cxx b/PWGEM/Tasks/phosElId.cxx index 6b37c04d3c2..a2e43d23b01 100644 --- a/PWGEM/Tasks/phosElId.cxx +++ b/PWGEM/Tasks/phosElId.cxx @@ -26,6 +26,8 @@ #include "Common/Core/TrackSelectionDefaults.h" #include "Common/DataModel/CaloClusters.h" #include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/FT0Corrected.h" +#include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/Centrality.h" #include "Common/DataModel/PIDResponse.h" #include "Common/DataModel/TrackSelectionTables.h" @@ -72,16 +74,27 @@ DECLARE_SOA_TABLE(PHOSMatchindexTable, "AOD", "PHSMTCH", } // namespace o2::aod +// globalized estimator names for centrality +enum CentEstimators { FV0A, + FT0M, + FT0A, + FT0C, + FDDM, + NTPV }; + struct PhosElId { - Produces hosMatch; + Produces phosMatch; using SelCollisions = soa::Join; - using MyTracks = soa::Join; - + using MyTracks = soa::Join; Configurable mMinCluE{"mMinCluE", 0.3, "Minimum cluster energy for analysis"}, mMinCluTime{"minCluTime", -25.e-9, "Min. cluster time"}, mMaxCluTime{"mMaxCluTime", 25.e-9, "Max. cluster time"}, + mCluTimeAxisMin{"mCluTimeAxisMin", -100, "lower axis limit for cluster time in nanoseconds"}, + mCluTimeAxisMax{"mCluTimeAxisMax", 100, "upper axis limit for cluster time in nanoseconds"}, mDeltaXmin{"mDeltaXmin", -100., "Min for track and cluster coordinate delta"}, mDeltaXmax{"mDeltaXmax", 100., "Max for track and cluster coordinate delta"}, mDeltaZmin{"mDeltaZmin", -100., "Min for track and cluster coordinate delta"}, @@ -201,7 +214,7 @@ struct PhosElId { axisdX{nBinsDeltaX, mDeltaXmin, mDeltaXmax, "x_{tr}-x_{clu} (cm)", "x_{tr}-x_{clu} (cm)"}, axisdZ{nBinsDeltaZ, mDeltaZmin, mDeltaZmax, "z_{tr}-z_{clu} (cm)", "z_{tr}-z_{clu} (cm)"}, axisCells{20, 0., 20., "number of cells", "number of cells"}, - axisTime{100, 2e9 * mMinCluTime, 2e9 * mMaxCluTime, "time (ns)", "time (nanoseconds)"}, + axisTime{200, mCluTimeAxisMin, mCluTimeAxisMax, "time (ns)", "time (nanoseconds)"}, axisModes{4, 1., 5., "module", "module"}, axisX{150, -75., 75., "x (cm)", "x (cm)"}, axisZ{150, -75., 75., "z (cm)", "z (cm)"}, @@ -295,7 +308,7 @@ struct PhosElId { fMeandXNegMod3->SetParameters(meandXNegMod3.at(0), meandXNegMod3.at(1), meandXNegMod3.at(2)); fMeandXNegMod4->SetParameters(meandXNegMod4.at(0), meandXNegMod4.at(1), meandXNegMod4.at(2)); } - void process(soa::Join::iterator const& collision, + void process(SelCollisions::iterator const& collision, aod::CaloClusters const& clusters, soa::Filtered const& tracks, aod::BCsWithTimestamps const&) @@ -379,7 +392,6 @@ struct PhosElId { if (module != clu.mod()) continue; double cluE = clu.e(); - mHistManager.fill(HIST("hCluE_ncells_mod"), cluE, clu.ncell(), module); if (cluE < mMinCluE || clu.ncell() < mMinCluNcell || @@ -387,11 +399,8 @@ struct PhosElId { continue; bool isDispOK = testLambda(cluE, clu.m02(), clu.m20()); - float posX = clu.x(), posZ = clu.z(), dX = trackX - posX, dZ = trackZ - posZ, Ep = cluE / trackMom; - mHistManager.fill(HIST("hCluXZ_mod"), posX, posZ, module); - mHistManager.fill(HIST("hdZpmod"), dZ, trackPT, module); mHistManager.fill(HIST("hdXpmod"), dX, trackPT, module); if (posTrack) { @@ -431,7 +440,7 @@ struct PhosElId { mHistManager.fill(HIST("hEp_v_pt_Nsigma_disp_TPC"), Ep, trackPT, module); mHistManager.fill(HIST("hEp_v_E_Nsigma_disp_TPC"), Ep, cluE, module); } - hosMatch(collision.index(), clu.index(), track.index()); + phosMatch(collision.index(), clu.index(), track.index()); } } @@ -451,6 +460,8 @@ struct PhosElId { mHistManager.fill(HIST("hCluE_mod_time_cut"), cluE, mod); if (clu.ncell() >= mMinCluNcell) { mHistManager.fill(HIST("hCluE_mod_cell_cut"), cluE, mod); + mHistManager.fill(HIST("hCluXZ_mod"), clu.x(), clu.z(), mod); + mHistManager.fill(HIST("hCluE_ncells_mod"), cluE, clu.ncell(), mod); if (testLambda(cluE, clu.m02(), clu.m20())) mHistManager.fill(HIST("hCluE_mod_disp"), cluE, mod); } @@ -565,14 +576,25 @@ struct PhosElId { struct MassSpectra { - using SelCollisions = soa::Join; - using MyTracks = soa::Join; - - Configurable mEvSelTrig{"mEvSelTrig", kTVXinPHOS, "Select events with this trigger"}; + using SelCollisions = soa::Join; + using MyTracks = soa::Join; + Configurable mEvSelTrig{"mEvSelTrig", kTVXinPHOS, "Select events with this trigger"}, + cfgMassBinning{"cfgMassBinning", 1000, "Binning for mass"}, + cfgEnergyBinning{"cfgEnergyBinning", 100, "Binning for energy"}, + cfgEpRatioBinning{"cfgEpRatioBinning", 200, "Binning for energy to momentum ratio"}, + cfgCentBinning{"cfgCentBinning", 10, "Binning for centrality"}, + cfgCentEst{"cfgCentEst", 1, "Centrality estimator, 0: FV0A, 1: FT0M, 2: FT0A, 3: FT0C, 4: FDDM, 5: NTPV"}; Configurable cfgEtaMax{"cfgEtaMax", {0.8f}, "eta ranges"}, cfgPtMin{"cfgPtMin", {0.2f}, "pt min"}, cfgPtMax{"cfgPtMax", {20.f}, "pt max"}, + cfgMassSpectraMin{"cfgMassSpectraMin", {2.5f}, "mass spectra min for e+e-"}, + cfgMassSpectraMax{"cfgMassSpectraMax", {3.5f}, "mass spcetra max for e+e-"}, cfgDCAxyMax{"cfgDCAxyMax", {3.f}, "dcaxy max"}, cfgDCAzMax{"cfgDCAzMax", {3.f}, "dcaz max"}, cfgITSchi2Max{"cfgITSchi2Max", {5.f}, "its chi2 max"}, @@ -614,31 +636,32 @@ struct MassSpectra { 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 10.}; const AxisSpec axisCounter{1, 0, +1, ""}, + axisCent{cfgCentBinning, 0, 100, "centrality percentage"}, axisPt{momentumBinning, "p_{T} (GeV/c)"}, - axisEp{200, 0., 2., "E/p", "E_{cluster}/p_{track}"}, - axisE{200, 0, 10, "E (GeV)", "E (GeV)"}, - axisMassSpectrum{4000, 0, 4, "M (GeV/c^{2})", "Mass e^{+}e^{-} (GeV/c^{2})"}; + axisEp{cfgEpRatioBinning, 0., 2., "E/p", "E_{cluster}/p_{track}"}, + axisE{cfgEnergyBinning, 0, 10, "E (GeV)", "E (GeV)"}, + axisMassSpectrum{cfgMassBinning, cfgMassSpectraMin, cfgMassSpectraMax, "M (GeV/c^{2})", "Mass e^{+}e^{-} (GeV/c^{2})"}; mHistManager.add("eventCounter", "eventCounter", kTH1F, {axisCounter}); mHistManager.add("TVXinPHOSCounter", "TVXinPHOSCounter", kTH1F, {axisCounter}); - mHistManager.add("h_eh_pp_mass_spectra_v_Pt", "Mass e^{+}h^{+} vs momentum e^{+}h^{+}", HistType::kTH2F, {axisMassSpectrum, axisPt}); - mHistManager.add("h_ee_pp_mass_spectra_v_Pt", "Mass e^{+}e^{+} vs momentum e^{+}e^{+}", HistType::kTH2F, {axisMassSpectrum, axisPt}); - mHistManager.add("h_eh_mm_mass_spectra_v_Pt", "Mass e^{-}h^{-} vs momentum e^{-}h^{-}", HistType::kTH2F, {axisMassSpectrum, axisPt}); - mHistManager.add("h_ee_mm_mass_spectra_v_Pt", "Mass e^{-}e^{-} vs momentum e^{-}e^{-}", HistType::kTH2F, {axisMassSpectrum, axisPt}); + mHistManager.add("h_eh_pp_mass_spectra_v_pt_v_cent", "Mass e^{+}h^{+} vs momentum e^{+}h^{+}", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); + mHistManager.add("h_ee_pp_mass_spectra_v_pt_v_cent", "Mass e^{+}e^{+} vs momentum e^{+}e^{+}", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); + mHistManager.add("h_eh_mm_mass_spectra_v_pt_v_cent", "Mass e^{-}h^{-} vs momentum e^{-}h^{-}", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); + mHistManager.add("h_ee_mm_mass_spectra_v_pt_v_cent", "Mass e^{-}e^{-} vs momentum e^{-}e^{-}", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); - mHistManager.add("h_eh_pp_mass_spectra_v_E", "Mass e^{+}h^{+} vs cluster E e^{+}h^{+}", HistType::kTH2F, {axisMassSpectrum, axisE}); - mHistManager.add("h_ee_pp_mass_spectra_v_E", "Mass e^{+}e^{+} vs cluster E e^{+}e^{+}", HistType::kTH2F, {axisMassSpectrum, axisE}); - mHistManager.add("h_eh_mm_mass_spectra_v_E", "Mass e^{-}h^{-} vs cluster E e^{-}h^{-}", HistType::kTH2F, {axisMassSpectrum, axisE}); - mHistManager.add("h_ee_mm_mass_spectra_v_E", "Mass e^{-}e^{-} vs cluster E e^{-}e^{-}", HistType::kTH2F, {axisMassSpectrum, axisE}); + mHistManager.add("h_eh_pp_mass_spectra_v_E_v_cent", "Mass e^{+}h^{+} vs cluster E e^{+}h^{+}", HistType::kTH3F, {axisMassSpectrum, axisE, axisCent}); + mHistManager.add("h_ee_pp_mass_spectra_v_E_v_cent", "Mass e^{+}e^{+} vs cluster E e^{+}e^{+}", HistType::kTH3F, {axisMassSpectrum, axisE, axisCent}); + mHistManager.add("h_eh_mm_mass_spectra_v_E_v_cent", "Mass e^{-}h^{-} vs cluster E e^{-}h^{-}", HistType::kTH3F, {axisMassSpectrum, axisE, axisCent}); + mHistManager.add("h_ee_mm_mass_spectra_v_E_v_cent", "Mass e^{-}e^{-} vs cluster E e^{-}e^{-}", HistType::kTH3F, {axisMassSpectrum, axisE, axisCent}); - mHistManager.add("h_eh_mp_mass_spectra_v_Pt", "Mass e^{#pm}h^{#mp} vs momentum e^{#pm}h^{#mp}", HistType::kTH2F, {axisMassSpectrum, axisPt}); - mHistManager.add("h_ee_mp_mass_spectra_v_Pt", "Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}", HistType::kTH2F, {axisMassSpectrum, axisPt}); - mHistManager.add("h_eh_mp_mass_spectra_v_E", "Mass e^{#pm}h^{#mp} vs cluster E e^{#pm}h^{#mp}", HistType::kTH2F, {axisMassSpectrum, axisE}); - mHistManager.add("h_ee_mp_mass_spectra_v_E", "Mass e^{#pm}e^{#mp} vs cluster E e^{#pm}e^{#mp}", HistType::kTH2F, {axisMassSpectrum, axisE}); + mHistManager.add("h_eh_mp_mass_spectra_v_pt_v_cent", "Mass e^{#pm}h^{#mp} vs momentum e^{#pm}h^{#mp}", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); + mHistManager.add("h_ee_mp_mass_spectra_v_pt_v_cent", "Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); + mHistManager.add("h_eh_mp_mass_spectra_v_E_v_cent", "Mass e^{#pm}h^{#mp} vs cluster E e^{#pm}h^{#mp}", HistType::kTH3F, {axisMassSpectrum, axisE, axisCent}); + mHistManager.add("h_ee_mp_mass_spectra_v_E_v_cent", "Mass e^{#pm}e^{#mp} vs cluster E e^{#pm}e^{#mp}", HistType::kTH3F, {axisMassSpectrum, axisE, axisCent}); - mHistManager.add("hEp_v_E", "E/p ratio vs cluster E", HistType::kTH2F, {axisEp, axisE}); - mHistManager.add("hEp_v_E_cutEp", "E/p ratio vs cluster E within nSigma corridor", HistType::kTH2F, {axisEp, axisE}); + mHistManager.add("hEp_v_E_v_cent", "E/p ratio vs cluster E", HistType::kTH3F, {axisEp, axisE, axisCent}); + mHistManager.add("hEp_v_E_v_cent_cutEp", "E/p ratio vs cluster E within nSigma corridor", HistType::kTH3F, {axisEp, axisE, axisCent}); geomPHOS = std::make_unique("PHOS"); @@ -647,7 +670,7 @@ struct MassSpectra { fEpSigmaPhos->SetParameters(epSigmaPars.at(0), epSigmaPars.at(1), epSigmaPars.at(2), epSigmaPars.at(3)); } - void process(soa::Join::iterator const& collision, + void process(SelCollisions::iterator const& collision, aod::CaloClusters const& clusters, MyTracks const& tracks, o2::aod::PHOSMatchindexTable const& matches, @@ -675,6 +698,28 @@ struct MassSpectra { if (clusters.size() == 0) return; // Nothing to process + float cent = -1.; + switch (cfgCentEst) { + case FV0A: + cent = collision.centFV0A(); + break; + case FT0M: + cent = collision.centFT0M(); + break; + case FT0A: + cent = collision.centFT0A(); + break; + case FT0C: + cent = collision.centFT0C(); + break; + case FDDM: + cent = collision.centFDDM(); + break; + case NTPV: + cent = collision.centNTPV(); + break; + } + for (auto const& TPCel : tracks) { if (!TPCel.has_collision() || std::fabs(TPCel.dcaXY()) > cfgDCAxyMax || std::fabs(TPCel.dcaZ()) > cfgDCAzMax || !TPCel.hasTPC() || std::fabs(TPCel.eta()) > 0.15) @@ -730,26 +775,26 @@ struct MassSpectra { if (TPCel.sign() == track2.sign()) { if (posTrack) { - mHistManager.fill(HIST("h_eh_pp_mass_spectra_v_Pt"), mass2Tracks, mom2Tracks); - mHistManager.fill(HIST("h_eh_pp_mass_spectra_v_E"), mass2Tracks, cluE); + mHistManager.fill(HIST("h_eh_pp_mass_spectra_v_pt_v_cent"), mass2Tracks, mom2Tracks, cent); + mHistManager.fill(HIST("h_eh_pp_mass_spectra_v_E_v_cent"), mass2Tracks, cluE, cent); if (elCandidate) { - mHistManager.fill(HIST("h_ee_pp_mass_spectra_v_Pt"), mass2Tracks, mom2Tracks); - mHistManager.fill(HIST("h_ee_pp_mass_spectra_v_E"), mass2Tracks, cluE); + mHistManager.fill(HIST("h_ee_pp_mass_spectra_v_pt_v_cent"), mass2Tracks, mom2Tracks, cent); + mHistManager.fill(HIST("h_ee_pp_mass_spectra_v_E_v_cent"), mass2Tracks, cluE, cent); } } else { - mHistManager.fill(HIST("h_eh_mm_mass_spectra_v_Pt"), mass2Tracks, mom2Tracks); - mHistManager.fill(HIST("h_eh_mm_mass_spectra_v_E"), mass2Tracks, cluE); + mHistManager.fill(HIST("h_eh_mm_mass_spectra_v_pt_v_cent"), mass2Tracks, mom2Tracks, cent); + mHistManager.fill(HIST("h_eh_mm_mass_spectra_v_E_v_cent"), mass2Tracks, cluE, cent); if (elCandidate) { - mHistManager.fill(HIST("h_ee_mm_mass_spectra_v_Pt"), mass2Tracks, mom2Tracks); - mHistManager.fill(HIST("h_ee_mm_mass_spectra_v_E"), mass2Tracks, cluE); + mHistManager.fill(HIST("h_ee_mm_mass_spectra_v_pt_v_cent"), mass2Tracks, mom2Tracks, cent); + mHistManager.fill(HIST("h_ee_mm_mass_spectra_v_E_v_cent"), mass2Tracks, cluE, cent); } } } else { - mHistManager.fill(HIST("h_eh_mp_mass_spectra_v_Pt"), mass2Tracks, mom2Tracks); - mHistManager.fill(HIST("h_eh_mp_mass_spectra_v_E"), mass2Tracks, cluE); + mHistManager.fill(HIST("h_eh_mp_mass_spectra_v_pt_v_cent"), mass2Tracks, mom2Tracks, cent); + mHistManager.fill(HIST("h_eh_mp_mass_spectra_v_E_v_cent"), mass2Tracks, cluE, cent); if (elCandidate) { - mHistManager.fill(HIST("h_ee_mp_mass_spectra_v_Pt"), mass2Tracks, mom2Tracks); - mHistManager.fill(HIST("h_ee_mp_mass_spectra_v_E"), mass2Tracks, cluE); + mHistManager.fill(HIST("h_ee_mp_mass_spectra_v_pt_v_cent"), mass2Tracks, mom2Tracks, cent); + mHistManager.fill(HIST("h_ee_mp_mass_spectra_v_E_v_cent"), mass2Tracks, cluE, cent); } } } @@ -760,19 +805,23 @@ struct MassSpectra { auto track = tracks.iteratorAt(match.trackId()); float cluE = clust.e(); float epRatio = cluE / track.p(); - mHistManager.fill(HIST("hEp_v_E"), epRatio, cluE); + mHistManager.fill(HIST("hEp_v_E_v_cent"), epRatio, cluE, cent); bool elCandidate = (std::fabs(epRatio - cfgShiftEp - 1) < cfgNsigmaEp * fEpSigmaPhos->Eval(cluE)); if (elCandidate) - mHistManager.fill(HIST("hEp_v_E_cutEp"), epRatio, cluE); + mHistManager.fill(HIST("hEp_v_E_v_cent_cutEp"), epRatio, cluE, cent); } } }; struct TpcElIdMassSpectrum { - using SelCollisions = soa::Join; - using MyTracks = soa::Join; - + using SelCollisions = soa::Join; + using MyTracks = soa::Join; Configurable mMinCluE{"mMinCluE", 0.1, "Minimum cluster energy for photons in the analysis"}, mCutMIPCluE{"mCutMIPCluE", 0.3, "Min cluster energy to reject MIPs in the analysis"}, mMaxCluE{"mMaxCluE", 1., "Maximum cluster energy for photons in the analysis"}, @@ -781,6 +830,10 @@ struct TpcElIdMassSpectrum { cfgEtaMax{"cfgEtaMax", {0.8f}, "eta ranges"}, cfgPtMin{"cfgPtMin", {0.2f}, "pt min"}, cfgPtMax{"cfgPtMax", {20.f}, "pt max"}, + cfgMassSpectraJpsiMin{"cfgMassSpectraJpsiMin", {2.5f}, "mass spectra min for Jpsi region"}, + cfgMassSpectraJpsiMax{"cfgMassSpectraJpsiMax", {3.5f}, "mass spcetra max for Jpsi region"}, + cfgMassSpectraChicMin{"cfgMassSpectraChicMin", {3.f}, "mass spectra min Chic region"}, + cfgMassSpectraChicMax{"cfgMassSpectraChicMax", {4.f}, "mass spcetra max Chic region"}, cfgDCAxyMax{"cfgDCAxyMax", {3.f}, "dcaxy max"}, cfgDCAzMax{"cfgDCAzMax", {3.f}, "dcaz max"}, cfgITSchi2Max{"cfgITSchi2Max", {5.f}, "its chi2 max"}, @@ -809,6 +862,10 @@ struct TpcElIdMassSpectrum { cfgJpsiMass{"cfgJpsiMass", {3.097f}, "J/psi Mass constant"}; Configurable mEvSelTrig{"mEvSelTrig", kTVXinPHOS, "Select events with this trigger"}, + cfgCentBinning{"cfgCentBinning", 10, "Binning for centrality"}, + cfgCentEst{"cfgCentEst", 1, "Centrality estimator, 0: FV0A, 1: FT0M, 2: FT0A, 3: FT0C, 4: FDDM, 5: NTPV"}, + cfgMassBinning{"cfgMassBinning", 1000, "Binning for mass"}, + cfgEnergyBinning{"cfgEnergyBinning", 100, "Binning for energy"}, mMinCluNcell{"minCluNcell", 3, "min cells in cluster"}; Filter ptFilter = (aod::track::pt > cfgPtMin) && (aod::track::pt < cfgPtMax), @@ -816,7 +873,8 @@ struct TpcElIdMassSpectrum { dcaxyFilter = nabs(aod::track::dcaXY) < cfgDCAxyMax, dcazFilter = nabs(aod::track::dcaZ) < cfgDCAzMax; - Filter tpcEl = ((aod::pidtpc::tpcNSigmaEl > cfgTPCNSigmaElMin) && (aod::pidtpc::tpcNSigmaEl < cfgTPCNSigmaElMax)) || ((aod::pidtof::tofNSigmaEl > cfgTOFNSigmaElMin) && (aod::pidtof::tofNSigmaEl < cfgTOFNSigmaElMax)), + Filter tpctofEl = ((aod::pidtpc::tpcNSigmaEl > cfgTPCNSigmaElMin) && (aod::pidtpc::tpcNSigmaEl < cfgTPCNSigmaElMax)) || + ((aod::pidtof::tofNSigmaEl > cfgTOFNSigmaElMin) && (aod::pidtof::tofNSigmaEl < cfgTOFNSigmaElMax)), tpcPiRej = (aod::pidtpc::tpcNSigmaPi < cfgTPCNSigmaPiMin) || (aod::pidtpc::tpcNSigmaPi > cfgTPCNSigmaPiMax), tpcKaRej = (aod::pidtpc::tpcNSigmaKa < cfgTPCNSigmaKaMin) || (aod::pidtpc::tpcNSigmaKa > cfgTPCNSigmaPrMax), tpcPrRej = (aod::pidtpc::tpcNSigmaPr < cfgTPCNSigmaPrMin) || (aod::pidtpc::tpcNSigmaPr > cfgTPCNSigmaPrMax); @@ -835,92 +893,94 @@ struct TpcElIdMassSpectrum { 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 10.}; const AxisSpec axisCounter{1, 0, +1, ""}, + axisCent{cfgCentBinning, 0, 100, "centrality percentage"}, axisVTrackX{400, -5., 5., "track vertex x (cm)", "track vertex x (cm)"}, axisVTrackY{400, -5., 5., "track vertex y (cm)", "track vertex y (cm)"}, axisVTrackZ{400, -20., 20., "track vertex z (cm)", "track vertex z (cm)"}, - axisE{200, 0, 10, "E (GeV)", "E (GeV)"}, - axisMassSpectrum{1000, 0, 4, "M (GeV/c^{2})", "Mass e^{+}e^{-} (GeV/c^{2})"}, - axisMassSpectrumChiC{1000, 0, 4, "M (GeV/c^{2})", "Mass e^{+}e^{-}#gamma (GeV/c^{2})"}, - axisMassSpectrumChiCNoJpsiErrors{250, 3, 4, "M (GeV/c^{2})", "Mass e^{+}e^{-}#gamma - Mass e^{+}e^{-} + Mass J/#psi (GeV/c^{2})"}, + axisE{cfgEnergyBinning, 0, 10, "E (GeV)", "E (GeV)"}, + axisMassSpectrum{cfgMassBinning, cfgMassSpectraJpsiMin, cfgMassSpectraJpsiMax, "M (GeV/c^{2})", "Mass e^{+}e^{-} (GeV/c^{2})"}, + axisMassSpectrumChiC{cfgMassBinning, cfgMassSpectraChicMin, cfgMassSpectraChicMax, "M (GeV/c^{2})", "Mass e^{+}e^{-}#gamma (GeV/c^{2})"}, + axisMassSpectrumChiCNoJpsiErrors{cfgMassBinning, cfgMassSpectraChicMin, cfgMassSpectraChicMax, "M (GeV/c^{2})", "Mass e^{+}e^{-}#gamma - Mass e^{+}e^{-} + Mass J/#psi (GeV/c^{2})"}, axisTPC{1000, 0, 200, "TPC signal (dE/dx)"}, axisPt{momentumBinning, "p_{T} (GeV/c)"}, axisPtBig{2000, 0, 20, "p_{T} (GeV/c)"}, axisEta{600, -3., 3., "#eta"}; mHistManager.add("eventCounter", "eventCounter", kTH1F, {axisCounter}); + mHistManager.add("hTPCspectra", "TPC dE/dx spectra", HistType::kTH2F, {axisPt, axisTPC}); mHistManager.add("hTPCspectra_isElectronRej", "isElectron with rejection | TPC dE/dx spectra", HistType::kTH2F, {axisPt, axisTPC}); - mHistManager.add("h_TPCee_MS_mp_v_pt", "Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp} (from TPC candidates)", HistType::kTH2F, {axisMassSpectrum, axisPt}); - mHistManager.add("h_TPCee_MS_mm_v_pt", "Mass e^{-}e^{-} vs momentum e^{-}e^{-} (from TPC candidates)", HistType::kTH2F, {axisMassSpectrum, axisPt}); - mHistManager.add("h_TPCee_MS_pp_v_pt", "Mass e^{+}e^{+} vs momentum e^{+}e^{+} (from TPC candidates)", HistType::kTH2F, {axisMassSpectrum, axisPt}); - - mHistManager.add("h_TPCee_MS_mp_phosRange_v_pt", "Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp} (from TPC candidates) with one e in phos acceptance range", HistType::kTH2F, {axisMassSpectrum, axisPt}); - mHistManager.add("h_TPCee_MS_mm_phosRange_v_pt", "Mass e^{-}e^{-} vs momentum e^{-}e^{-} (from TPC candidates) with one e in phos acceptance range", HistType::kTH2F, {axisMassSpectrum, axisPt}); - mHistManager.add("h_TPCee_MS_pp_phosRange_v_pt", "Mass e^{+}e^{+} vs momentum e^{+}e^{+} (from TPC candidates) with one e in phos acceptance range", HistType::kTH2F, {axisMassSpectrum, axisPt}); - - mHistManager.add("h_TPCee_MS_mp_phosRange_kTVXinPHOS_v_pt", "Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp} (from TPC candidates) with one e in phos acceptance range", HistType::kTH2F, {axisMassSpectrum, axisPt}); - mHistManager.add("h_TPCee_MS_mm_phosRange_kTVXinPHOS_v_pt", "Mass e^{-}e^{-} vs momentum e^{-}e^{-} (from TPC candidates) with one e in phos acceptance range", HistType::kTH2F, {axisMassSpectrum, axisPt}); - mHistManager.add("h_TPCee_MS_pp_phosRange_kTVXinPHOS_v_pt", "Mass e^{+}e^{+} vs momentum e^{+}e^{+} (from TPC candidates) with one e in phos acceptance range", HistType::kTH2F, {axisMassSpectrum, axisPt}); - - mHistManager.add("h_TPCeePhosGamma_MS_withMatches_v_3pt", "Mass e^{#pm}e^{#mp}Track vs momentum e^{#pm}e^{#mp}Track", HistType::kTH2F, {axisMassSpectrumChiC, axisPt}); - mHistManager.add("h_TPCeePhosGamma_MS_noMatches_v_3pt", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH2F, {axisMassSpectrumChiC, axisPt}); - mHistManager.add("h_TPCeePhosGamma_MS_noMatches_aroundJpsi_v_3pt", "Mass e^{#pm}e^{#mp}#gamma (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH2F, {axisMassSpectrumChiC, axisPt}); - mHistManager.add("h_TPCeePhosGamma_MS_noMatches_aroundJpsi_DispOK_v_3pt", "Mass e^{#pm}e^{#mp}#gamma (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | DispOK", HistType::kTH2F, {axisMassSpectrumChiC, axisPt}); - mHistManager.add("h_TPCeePhosGamma_MS_noMatches_aroundJpsi_DispNotOK_v_3pt", "Mass e^{#pm}e^{#mp}#gamma (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK", HistType::kTH2F, {axisMassSpectrumChiC, axisPt}); - mHistManager.add("h_TPCeePhosGamma_MS_noMatches_notAroundJpsi_v_3pt", "Mass e^{#pm}e^{#mp}#gamma (not around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH2F, {axisMassSpectrumChiC, axisPt}); - mHistManager.add("h_TPCeePhosGamma_MS_noMatches_DispOK_v_3pt", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | DispOK", HistType::kTH2F, {axisMassSpectrumChiC, axisPt}); - mHistManager.add("h_TPCeePhosGamma_MS_noMatches_DispNotOK_v_3pt", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK", HistType::kTH2F, {axisMassSpectrumChiC, axisPt}); - mHistManager.add("h_TPCeePhosGamma_MS_aroundJpsi_v_3pt", "Mass e^{#pm}e^{#mp}#gamma (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH2F, {axisMassSpectrumChiC, axisPt}); - mHistManager.add("h_TPCeePhosGamma_MS_notAroundJpsi_v_3pt", "Mass e^{#pm}e^{#mp}#gamma (not around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH2F, {axisMassSpectrumChiC, axisPt}); - mHistManager.add("h_TPCeePhosGamma_MS_DispOK_v_3pt", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | DispOK", HistType::kTH2F, {axisMassSpectrumChiC, axisPt}); - mHistManager.add("h_TPCeePhosGamma_MS_DispNotOK_v_3pt", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK", HistType::kTH2F, {axisMassSpectrumChiC, axisPt}); - mHistManager.add("h_TPCeePhosGamma_notMIP_MS_v_3pt", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiC, axisPt}); - mHistManager.add("h_TPCeePhosGamma_notMIP_MS_withMatches_v_3pt", "Mass e^{#pm}e^{#mp}Track vs momentum e^{#pm}e^{#mp}Track | cluE > E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiC, axisPt}); - mHistManager.add("h_TPCeePhosGamma_notMIP_MS_noMatches_v_3pt", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiC, axisPt}); - mHistManager.add("h_TPCeePhosGamma_notMIP_MS_noMatches_aroundJpsi_v_3pt", "Mass e^{#pm}e^{#mp}#gamma (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiC, axisPt}); - mHistManager.add("h_TPCeePhosGamma_notMIP_MS_noMatches_aroundJpsi_DispOK_v_3pt", "Mass e^{#pm}e^{#mp}#gamma (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | DispOK | cluE > E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiC, axisPt}); - mHistManager.add("h_TPCeePhosGamma_notMIP_MS_noMatches_aroundJpsi_DispNotOK_v_3pt", "Mass e^{#pm}e^{#mp}#gamma (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK | cluE > E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiC, axisPt}); - mHistManager.add("h_TPCeePhosGamma_notMIP_MS_noMatches_notAroundJpsi_v_3pt", "Mass e^{#pm}e^{#mp}#gamma (not around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiC, axisPt}); - mHistManager.add("h_TPCeePhosGamma_notMIP_MS_noMatches_DispOK_v_3pt", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | DispOK | cluE > E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiC, axisPt}); - mHistManager.add("h_TPCeePhosGamma_notMIP_MS_noMatches_DispNotOK_v_3pt", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK | cluE > E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiC, axisPt}); - mHistManager.add("h_TPCeePhosGamma_notMIP_MS_aroundJpsi_v_3pt", "Mass e^{#pm}e^{#mp}#gamma (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiC, axisPt}); - mHistManager.add("h_TPCeePhosGamma_notMIP_MS_notAroundJpsi_v_3pt", "Mass e^{#pm}e^{#mp}#gamma (not around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiC, axisPt}); - mHistManager.add("h_TPCeePhosGamma_notMIP_MS_DispOK_v_3pt", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | DispOK | cluE > E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiC, axisPt}); - mHistManager.add("h_TPCeePhosGamma_notMIP_MS_DispNotOK_v_3pt", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK | cluE > E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiC, axisPt}); - mHistManager.add("h_TPCeePhosGamma_isMIP_MS_v_3pt", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | cluE < E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiC, axisPt}); - - mHistManager.add("h_TPCeePhosGamma_MS_v_3pt", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma (TPC candidates + Phos cluster)", HistType::kTH2F, {axisMassSpectrumChiC, axisPt}); - mHistManager.add("h_TPCeePhosGamma_MS_v_cluE", "Mass e^{#pm}e^{#mp}#gamma vs cluster Energy left by the photon", HistType::kTH2F, {axisMassSpectrumChiC, axisE}); - - mHistManager.add("h_TPCeePhosGamma_minusee_MS_withMatches_v_3pt", "Mass e^{#pm}e^{#mp}Track - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}Track", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisPt}); - mHistManager.add("h_TPCeePhosGamma_minusee_MS_noMatches_v_3pt", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisPt}); - mHistManager.add("h_TPCeePhosGamma_minusee_MS_noMatches_aroundJpsi_v_3pt", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisPt}); - mHistManager.add("h_TPCeePhosGamma_minusee_MS_noMatches_aroundJpsi_DispOK_v_3pt", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | DispOK", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisPt}); - mHistManager.add("h_TPCeePhosGamma_minusee_MS_noMatches_aroundJpsi_DispNotOK_v_3pt", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisPt}); - mHistManager.add("h_TPCeePhosGamma_minusee_MS_noMatches_notAroundJpsi_v_3pt", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (not around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisPt}); - mHistManager.add("h_TPCeePhosGamma_minusee_MS_noMatches_DispOK_v_3pt", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | DispOK", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisPt}); - mHistManager.add("h_TPCeePhosGamma_minusee_MS_noMatches_DispNotOK_v_3pt", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisPt}); - mHistManager.add("h_TPCeePhosGamma_minusee_MS_aroundJpsi_v_3pt", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisPt}); - mHistManager.add("h_TPCeePhosGamma_minusee_MS_notAroundJpsi_v_3pt", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (not around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisPt}); - mHistManager.add("h_TPCeePhosGamma_minusee_MS_DispOK_v_3pt", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | DispOK", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisPt}); - mHistManager.add("h_TPCeePhosGamma_minusee_MS_DispNotOK_v_3pt", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisPt}); - mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_v_3pt", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisPt}); - mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_withMatches_v_3pt", "Mass e^{#pm}e^{#mp}Track - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}Track | cluE > E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisPt}); - mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_v_3pt", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisPt}); - mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_aroundJpsi_v_3pt", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisPt}); - mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_aroundJpsi_DispOK_v_3pt", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | DispOK | cluE > E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisPt}); - mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_aroundJpsi_DispNotOK_v_3pt", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK | cluE > E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisPt}); - mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_notAroundJpsi_v_3pt", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (not around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisPt}); - mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_DispOK_v_3pt", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | DispOK | cluE > E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisPt}); - mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_DispNotOK_v_3pt", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK | cluE > E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisPt}); - mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_aroundJpsi_v_3pt", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisPt}); - mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_notAroundJpsi_v_3pt", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (not around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisPt}); - mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_DispOK_v_3pt", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | DispOK | cluE > E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisPt}); - mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_DispNotOK_v_3pt", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK | cluE > E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisPt}); - mHistManager.add("h_TPCeePhosGamma_isMIP_minusee_MS_v_3pt", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | cluE < E_{MIP}", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisPt}); - - mHistManager.add("h_TPCeePhosGamma_minusee_MS_v_3pt", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} - Mass e^{#pm}e^{#mp} + Mass J/#psi vs momentum e^{#pm}e^{#mp}#gamma (TPC candidates + Phos cluster)", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisPt}); - mHistManager.add("h_TPCeePhosGamma_minusee_MS_v_cluE", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} - Mass e^{#pm}e^{#mp} + Mass J/#psi vs cluster Energy left by the photon", HistType::kTH2F, {axisMassSpectrumChiCNoJpsiErrors, axisE}); + mHistManager.add("h_TPCee_MS_mp_v_pt_v_cent", "Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp} (from TPC candidates)", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); + mHistManager.add("h_TPCee_MS_mm_v_pt_v_cent", "Mass e^{-}e^{-} vs momentum e^{-}e^{-} (from TPC candidates)", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); + mHistManager.add("h_TPCee_MS_pp_v_pt_v_cent", "Mass e^{+}e^{+} vs momentum e^{+}e^{+} (from TPC candidates)", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); + + mHistManager.add("h_TPCee_MS_mp_phosRange_v_pt_v_cent", "Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp} (from TPC candidates) with one e in phos acceptance range", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); + mHistManager.add("h_TPCee_MS_mm_phosRange_v_pt_v_cent", "Mass e^{-}e^{-} vs momentum e^{-}e^{-} (from TPC candidates) with one e in phos acceptance range", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); + mHistManager.add("h_TPCee_MS_pp_phosRange_v_pt_v_cent", "Mass e^{+}e^{+} vs momentum e^{+}e^{+} (from TPC candidates) with one e in phos acceptance range", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); + + mHistManager.add("h_TPCee_MS_mp_phosRange_kTVXinPHOS_v_pt_v_cent", "Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp} (from TPC candidates) with one e in phos acceptance range", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); + mHistManager.add("h_TPCee_MS_mm_phosRange_kTVXinPHOS_v_pt_v_cent", "Mass e^{-}e^{-} vs momentum e^{-}e^{-} (from TPC candidates) with one e in phos acceptance range", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); + mHistManager.add("h_TPCee_MS_pp_phosRange_kTVXinPHOS_v_pt_v_cent", "Mass e^{+}e^{+} vs momentum e^{+}e^{+} (from TPC candidates) with one e in phos acceptance range", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); + + mHistManager.add("h_TPCeePhosGamma_MS_withMatches_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}Track vs momentum e^{#pm}e^{#mp}Track", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_MS_noMatches_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_MS_noMatches_aroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_MS_noMatches_aroundJpsi_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | DispOK", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_MS_noMatches_aroundJpsi_DispNotOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_MS_noMatches_notAroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma (not around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_MS_noMatches_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | DispOK", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_MS_noMatches_DispNotOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_MS_aroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_MS_notAroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma (not around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_MS_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | DispOK", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_MS_DispNotOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_notMIP_MS_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_notMIP_MS_withMatches_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}Track vs momentum e^{#pm}e^{#mp}Track | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_notMIP_MS_noMatches_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_notMIP_MS_noMatches_aroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_notMIP_MS_noMatches_aroundJpsi_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | DispOK | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_notMIP_MS_noMatches_aroundJpsi_DispNotOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_notMIP_MS_noMatches_notAroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma (not around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_notMIP_MS_noMatches_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | DispOK | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_notMIP_MS_noMatches_DispNotOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_notMIP_MS_aroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_notMIP_MS_notAroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma (not around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_notMIP_MS_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | DispOK | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_notMIP_MS_DispNotOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_isMIP_MS_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | cluE < E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + + mHistManager.add("h_TPCeePhosGamma_MS_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma (TPC candidates + Phos cluster)", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_MS_v_cluE", "Mass e^{#pm}e^{#mp}#gamma vs cluster Energy left by the photon", HistType::kTH3F, {axisMassSpectrumChiC, axisE, axisCent}); + + mHistManager.add("h_TPCeePhosGamma_minusee_MS_withMatches_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}Track - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}Track", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_minusee_MS_noMatches_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_minusee_MS_noMatches_aroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_minusee_MS_noMatches_aroundJpsi_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | DispOK", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_minusee_MS_noMatches_aroundJpsi_DispNotOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_minusee_MS_noMatches_notAroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (not around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_minusee_MS_noMatches_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | DispOK", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_minusee_MS_noMatches_DispNotOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_minusee_MS_aroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_minusee_MS_notAroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (not around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_minusee_MS_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | DispOK", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_minusee_MS_DispNotOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_withMatches_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}Track - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}Track | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_aroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_aroundJpsi_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | DispOK | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_aroundJpsi_DispNotOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_notAroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (not around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | DispOK | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_DispNotOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_aroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_notAroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (not around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | DispOK | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_DispNotOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_isMIP_minusee_MS_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | cluE < E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + + mHistManager.add("h_TPCeePhosGamma_minusee_MS_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} - Mass e^{#pm}e^{#mp} + Mass J/#psi vs momentum e^{#pm}e^{#mp}#gamma (TPC candidates + Phos cluster)", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("h_TPCeePhosGamma_minusee_MS_v_cluE", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} - Mass e^{#pm}e^{#mp} + Mass J/#psi vs cluster Energy left by the photon", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisE, axisCent}); mHistManager.add("hTrackVX", "Track vertex coordinate X", HistType::kTH1F, {axisVTrackX}); mHistManager.add("hTrackVY", "Track vertex coordinate Y", HistType::kTH1F, {axisVTrackY}); @@ -934,7 +994,7 @@ struct TpcElIdMassSpectrum { mHistManager.add("hTrackEta", "Track eta", HistType::kTH1F, {axisEta}); mHistManager.add("hTrackEta_Cut", "Track eta after cut", HistType::kTH1F, {axisEta}); } - void process(soa::Join::iterator const& collision, + void process(SelCollisions::iterator const& collision, aod::CaloClusters const& clusters, MyTracks const& tracks, soa::Filtered const& filteredTracks, @@ -957,6 +1017,28 @@ struct TpcElIdMassSpectrum { if (std::fabs(collision.posZ()) > 10.f) return; + float cent = -1.; + switch (cfgCentEst) { + case FV0A: + cent = collision.centFV0A(); + break; + case FT0M: + cent = collision.centFT0M(); + break; + case FT0A: + cent = collision.centFT0A(); + break; + case FT0C: + cent = collision.centFT0C(); + break; + case FDDM: + cent = collision.centFDDM(); + break; + case NTPV: + cent = collision.centNTPV(); + break; + } + for (auto const& [track1, track2] : combinations(CombinationsStrictlyUpperIndexPolicy(filteredTracks, filteredTracks))) { if (!track1.has_collision() || !track1.hasTPC()) continue; @@ -998,26 +1080,26 @@ struct TpcElIdMassSpectrum { if (track1.sign() == track2.sign()) { if (posTrack) { - mHistManager.fill(HIST("h_TPCee_MS_pp_v_pt"), pairMass, pairPt); + mHistManager.fill(HIST("h_TPCee_MS_pp_v_pt_v_cent"), pairMass, pairPt, cent); if (inPhosRange) { - mHistManager.fill(HIST("h_TPCee_MS_pp_phosRange_v_pt"), pairMass, pairPt); + mHistManager.fill(HIST("h_TPCee_MS_pp_phosRange_v_pt_v_cent"), pairMass, pairPt, cent); if (collision.alias_bit(mEvSelTrig)) - mHistManager.fill(HIST("h_TPCee_MS_pp_phosRange_kTVXinPHOS_v_pt"), pairMass, pairPt); + mHistManager.fill(HIST("h_TPCee_MS_pp_phosRange_kTVXinPHOS_v_pt_v_cent"), pairMass, pairPt, cent); } } else { - mHistManager.fill(HIST("h_TPCee_MS_mm_v_pt"), pairMass, pairPt); + mHistManager.fill(HIST("h_TPCee_MS_mm_v_pt_v_cent"), pairMass, pairPt, cent); if (inPhosRange) { - mHistManager.fill(HIST("h_TPCee_MS_mm_phosRange_v_pt"), pairMass, pairPt); + mHistManager.fill(HIST("h_TPCee_MS_mm_phosRange_v_pt_v_cent"), pairMass, pairPt, cent); if (collision.alias_bit(mEvSelTrig)) - mHistManager.fill(HIST("h_TPCee_MS_mm_phosRange_kTVXinPHOS_v_pt"), pairMass, pairPt); + mHistManager.fill(HIST("h_TPCee_MS_mm_phosRange_kTVXinPHOS_v_pt_v_cent"), pairMass, pairPt, cent); } } } else { - mHistManager.fill(HIST("h_TPCee_MS_mp_v_pt"), pairMass, pairPt); + mHistManager.fill(HIST("h_TPCee_MS_mp_v_pt_v_cent"), pairMass, pairPt, cent); if (inPhosRange) { - mHistManager.fill(HIST("h_TPCee_MS_mp_phosRange_v_pt"), pairMass, pairPt); + mHistManager.fill(HIST("h_TPCee_MS_mp_phosRange_v_pt_v_cent"), pairMass, pairPt, cent); if (collision.alias_bit(mEvSelTrig)) - mHistManager.fill(HIST("h_TPCee_MS_mp_phosRange_kTVXinPHOS_v_pt"), pairMass, pairPt); + mHistManager.fill(HIST("h_TPCee_MS_mp_phosRange_kTVXinPHOS_v_pt_v_cent"), pairMass, pairPt, cent); } if (collision.alias_bit(mEvSelTrig) && clusters.size() != 0) { @@ -1048,138 +1130,138 @@ struct TpcElIdMassSpectrum { fourVectorP3.SetPxPyPzE(gamma.px(), gamma.py(), gamma.pz(), cluE); double tripletMass = (fourVectorP1 + fourVectorP2 + fourVectorP3).M(), tripletPt = (fourVectorP1 + fourVectorP2 + fourVectorP3).Pt(); - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_v_3pt"), tripletMass, tripletPt); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_v_3pt"), tripletMass - pairMass + cfgJpsiMass, tripletPt); + mHistManager.fill(HIST("h_TPCeePhosGamma_MS_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_v_cluE"), tripletMass, cluE); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_v_cluE"), tripletMass - pairMass + cfgJpsiMass, cluE); + mHistManager.fill(HIST("h_TPCeePhosGamma_MS_v_cluE"), tripletMass, cluE, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_v_cluE"), tripletMass - pairMass + cfgJpsiMass, cluE, cent); if (matchFlag) { - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_withMatches_v_3pt"), tripletMass, tripletPt); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_withMatches_v_3pt"), tripletMass - pairMass + cfgJpsiMass, tripletPt); + mHistManager.fill(HIST("h_TPCeePhosGamma_MS_withMatches_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_withMatches_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); } else { - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_noMatches_v_3pt"), tripletMass, tripletPt); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_noMatches_v_3pt"), tripletMass - pairMass + cfgJpsiMass, tripletPt); + mHistManager.fill(HIST("h_TPCeePhosGamma_MS_noMatches_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_noMatches_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); if (isJpsi) { - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_noMatches_aroundJpsi_v_3pt"), tripletMass, tripletPt); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_noMatches_aroundJpsi_v_3pt"), tripletMass - pairMass + cfgJpsiMass, tripletPt); + mHistManager.fill(HIST("h_TPCeePhosGamma_MS_noMatches_aroundJpsi_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_noMatches_aroundJpsi_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); if (isDispOK) { - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_noMatches_aroundJpsi_DispOK_v_3pt"), tripletMass, tripletPt); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_noMatches_aroundJpsi_DispOK_v_3pt"), tripletMass - pairMass + cfgJpsiMass, tripletPt); + mHistManager.fill(HIST("h_TPCeePhosGamma_MS_noMatches_aroundJpsi_DispOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_noMatches_aroundJpsi_DispOK_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); } else { - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_noMatches_aroundJpsi_DispNotOK_v_3pt"), tripletMass, tripletPt); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_noMatches_aroundJpsi_DispNotOK_v_3pt"), tripletMass - pairMass + cfgJpsiMass, tripletPt); + mHistManager.fill(HIST("h_TPCeePhosGamma_MS_noMatches_aroundJpsi_DispNotOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_noMatches_aroundJpsi_DispNotOK_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); } } else { - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_noMatches_notAroundJpsi_v_3pt"), tripletMass, tripletPt); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_noMatches_notAroundJpsi_v_3pt"), tripletMass - pairMass + cfgJpsiMass, tripletPt); + mHistManager.fill(HIST("h_TPCeePhosGamma_MS_noMatches_notAroundJpsi_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_noMatches_notAroundJpsi_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); } if (isDispOK) { - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_noMatches_DispOK_v_3pt"), tripletMass, tripletPt); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_noMatches_DispOK_v_3pt"), tripletMass - pairMass + cfgJpsiMass, tripletPt); + mHistManager.fill(HIST("h_TPCeePhosGamma_MS_noMatches_DispOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_noMatches_DispOK_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); } else { - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_noMatches_DispNotOK_v_3pt"), tripletMass, tripletPt); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_noMatches_DispNotOK_v_3pt"), tripletMass - pairMass + cfgJpsiMass, tripletPt); + mHistManager.fill(HIST("h_TPCeePhosGamma_MS_noMatches_DispNotOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_noMatches_DispNotOK_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); } } if (isJpsi) { - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_aroundJpsi_v_3pt"), tripletMass, tripletPt); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_aroundJpsi_v_3pt"), tripletMass - pairMass + cfgJpsiMass, tripletPt); + mHistManager.fill(HIST("h_TPCeePhosGamma_MS_aroundJpsi_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_aroundJpsi_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); } else { - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_notAroundJpsi_v_3pt"), tripletMass, tripletPt); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_notAroundJpsi_v_3pt"), tripletMass - pairMass + cfgJpsiMass, tripletPt); + mHistManager.fill(HIST("h_TPCeePhosGamma_MS_notAroundJpsi_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_notAroundJpsi_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); } if (isDispOK) { - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_DispOK_v_3pt"), tripletMass, tripletPt); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_DispOK_v_3pt"), tripletMass - pairMass + cfgJpsiMass, tripletPt); + mHistManager.fill(HIST("h_TPCeePhosGamma_MS_DispOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_DispOK_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); } else { - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_DispNotOK_v_3pt"), tripletMass, tripletPt); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_DispNotOK_v_3pt"), tripletMass - pairMass + cfgJpsiMass, tripletPt); + mHistManager.fill(HIST("h_TPCeePhosGamma_MS_DispNotOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_DispNotOK_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); } if (isNotMIP) { - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_v_3pt"), tripletMass, tripletPt); - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_v_3pt"), tripletMass - pairMass + cfgJpsiMass, tripletPt); + mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); if (matchFlag) { - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_withMatches_v_3pt"), tripletMass, tripletPt); - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_withMatches_v_3pt"), tripletMass - pairMass + cfgJpsiMass, tripletPt); + mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_withMatches_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_withMatches_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); } else { - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_noMatches_v_3pt"), tripletMass, tripletPt); - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_v_3pt"), tripletMass - pairMass + cfgJpsiMass, tripletPt); + mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_noMatches_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); if (isJpsi) { - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_noMatches_aroundJpsi_v_3pt"), tripletMass, tripletPt); - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_aroundJpsi_v_3pt"), tripletMass - pairMass + cfgJpsiMass, tripletPt); + mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_noMatches_aroundJpsi_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_aroundJpsi_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); if (isDispOK) { - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_noMatches_aroundJpsi_DispOK_v_3pt"), tripletMass, tripletPt); - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_aroundJpsi_DispOK_v_3pt"), tripletMass - pairMass + cfgJpsiMass, tripletPt); + mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_noMatches_aroundJpsi_DispOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_aroundJpsi_DispOK_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); } else { - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_noMatches_aroundJpsi_DispNotOK_v_3pt"), tripletMass, tripletPt); - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_aroundJpsi_DispNotOK_v_3pt"), tripletMass - pairMass + cfgJpsiMass, tripletPt); + mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_noMatches_aroundJpsi_DispNotOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_aroundJpsi_DispNotOK_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); } } else { - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_noMatches_notAroundJpsi_v_3pt"), tripletMass, tripletPt); - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_notAroundJpsi_v_3pt"), tripletMass - pairMass + cfgJpsiMass, tripletPt); + mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_noMatches_notAroundJpsi_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_notAroundJpsi_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); } if (isDispOK) { - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_noMatches_DispOK_v_3pt"), tripletMass, tripletPt); - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_DispOK_v_3pt"), tripletMass - pairMass + cfgJpsiMass, tripletPt); + mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_noMatches_DispOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_DispOK_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); } else { - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_noMatches_DispNotOK_v_3pt"), tripletMass, tripletPt); - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_DispNotOK_v_3pt"), tripletMass - pairMass + cfgJpsiMass, tripletPt); + mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_noMatches_DispNotOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_DispNotOK_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); } } if (isJpsi) { - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_aroundJpsi_v_3pt"), tripletMass, tripletPt); - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_aroundJpsi_v_3pt"), tripletMass - pairMass + cfgJpsiMass, tripletPt); + mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_aroundJpsi_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_aroundJpsi_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); } else { - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_notAroundJpsi_v_3pt"), tripletMass, tripletPt); - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_notAroundJpsi_v_3pt"), tripletMass - pairMass + cfgJpsiMass, tripletPt); + mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_notAroundJpsi_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_notAroundJpsi_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); } if (isDispOK) { - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_DispOK_v_3pt"), tripletMass, tripletPt); - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_DispOK_v_3pt"), tripletMass - pairMass + cfgJpsiMass, tripletPt); + mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_DispOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_DispOK_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); } else { - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_DispNotOK_v_3pt"), tripletMass, tripletPt); - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_DispNotOK_v_3pt"), tripletMass - pairMass + cfgJpsiMass, tripletPt); + mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_DispNotOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_DispNotOK_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); } } else { - mHistManager.fill(HIST("h_TPCeePhosGamma_isMIP_MS_v_3pt"), tripletMass, tripletPt); - mHistManager.fill(HIST("h_TPCeePhosGamma_isMIP_minusee_MS_v_3pt"), tripletMass - pairMass + cfgJpsiMass, tripletPt); + mHistManager.fill(HIST("h_TPCeePhosGamma_isMIP_MS_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("h_TPCeePhosGamma_isMIP_minusee_MS_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); } } } } } - for (auto const& track1 : tracks) { - mHistManager.fill(HIST("hTrackPt"), track1.pt()); - mHistManager.fill(HIST("hTrackEta"), track1.eta()); - mHistManager.fill(HIST("hTrackVX"), track1.x()); - mHistManager.fill(HIST("hTrackVY"), track1.y()); - mHistManager.fill(HIST("hTrackVZ"), track1.z()); - - if (!track1.has_collision() || !track1.hasTPC()) + for (auto const& track : tracks) { + mHistManager.fill(HIST("hTrackPt"), track.pt()); + mHistManager.fill(HIST("hTrackEta"), track.eta()); + mHistManager.fill(HIST("hTrackVX"), track.x()); + mHistManager.fill(HIST("hTrackVY"), track.y()); + mHistManager.fill(HIST("hTrackVZ"), track.z()); + mHistManager.fill(HIST("hTPCspectra"), track.pt(), track.tpcSignal()); + } + for (auto const& track : filteredTracks) { + if (!track.has_collision() || !track.hasTPC()) continue; - if (track1.itsChi2NCl() > cfgITSchi2Max || track1.tpcChi2NCl() > cfgTPCchi2Max) + if (track.itsChi2NCl() > cfgITSchi2Max || track.tpcChi2NCl() > cfgTPCchi2Max) continue; - if (track1.itsNCls() < cfgITSnclsMin || track1.itsNCls() > cfgITSnclsMax || !((track1.itsClusterMap() & uint8_t(1)) > 0)) + if (track.itsNCls() < cfgITSnclsMin || track.itsNCls() > cfgITSnclsMax || !((track.itsClusterMap() & uint8_t(1)) > 0)) continue; - if (track1.tpcNClsFound() < cfgTPCnclsMin || track1.tpcNClsFound() > cfgTPCnclsMax) + if (track.tpcNClsFound() < cfgTPCnclsMin || track.tpcNClsFound() > cfgTPCnclsMax) continue; - if (track1.tpcNClsCrossedRows() < cfgTPCnclsCRMin || track1.tpcNClsCrossedRows() > cfgTPCnclsCRMax) + if (track.tpcNClsCrossedRows() < cfgTPCnclsCRMin || track.tpcNClsCrossedRows() > cfgTPCnclsCRMax) continue; - - mHistManager.fill(HIST("hTPCspectra_isElectronRej"), track1.pt(), track1.tpcSignal()); - - mHistManager.fill(HIST("hTrackPt_Cut"), track1.pt()); - mHistManager.fill(HIST("hTrackEta_Cut"), track1.eta()); - mHistManager.fill(HIST("hTrackVX_Cut"), track1.x()); - mHistManager.fill(HIST("hTrackVY_Cut"), track1.y()); - mHistManager.fill(HIST("hTrackVZ_Cut"), track1.z()); + mHistManager.fill(HIST("hTPCspectra_isElectronRej"), track.pt(), track.tpcSignal()); + mHistManager.fill(HIST("hTrackPt_Cut"), track.pt()); + mHistManager.fill(HIST("hTrackEta_Cut"), track.eta()); + mHistManager.fill(HIST("hTrackVX_Cut"), track.x()); + mHistManager.fill(HIST("hTrackVY_Cut"), track.y()); + mHistManager.fill(HIST("hTrackVZ_Cut"), track.z()); } } //_____________________________________________________________________________ From a48562faedd635134b84590522116920287cfedf Mon Sep 17 00:00:00 2001 From: Francesca Ercolessi Date: Fri, 21 Feb 2025 12:00:07 +0100 Subject: [PATCH 0364/1650] [PWGLF] nuclei-proton correlation analysis: fix rejection of final state protons (#10121) --- .../Tasks/Nuspex/hadronnucleicorrelation.cxx | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx b/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx index 4bfb99b0e3d..60b64d1a650 100644 --- a/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx +++ b/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx @@ -1306,11 +1306,35 @@ struct hadronnucleicorrelation { if (particle.pdgCode() == pdgProton) { if (!particle.has_daughters()) { selectedparticlesMC_p[particle.mcCollisionId()].push_back(std::make_shared(particle)); + } else { + bool isp = false; + + for (auto& dau : particle.daughters_as()) { + if (dau.pdgCode() == pdgProton) { + isp = true; + } + } + + if (isp) { + selectedparticlesMC_p[particle.mcCollisionId()].push_back(std::make_shared(particle)); + } } } if (particle.pdgCode() == -pdgProton) { if (!particle.has_daughters()) { selectedparticlesMC_antip[particle.mcCollisionId()].push_back(std::make_shared(particle)); + } else { + bool isantip = false; + + for (auto& dau : particle.daughters_as()) { + if (dau.pdgCode() == -pdgProton) { + isantip = true; + } + } + + if (isantip) { + selectedparticlesMC_antip[particle.mcCollisionId()].push_back(std::make_shared(particle)); + } } } } From aaf51322a4b2580c66ef539a28dccd3b8394775d Mon Sep 17 00:00:00 2001 From: yuanzhe <90246048+wang-yuanzhe@users.noreply.github.com> Date: Fri, 21 Feb 2025 13:02:05 +0100 Subject: [PATCH 0365/1650] [PWGLF] Fix EM of hypertriton 3body DCAFitter analysis (#10122) --- PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx b/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx index 9b5d098f7f6..35fbdeac975 100644 --- a/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx +++ b/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx @@ -315,7 +315,7 @@ struct decay3bodyBuilder { } EMTrackSel; SliceCache cache; - ConfigurableAxis axisPosZ{"axisPosZ", {40, -10, 10}, "Mixing bins - posZ"}; + ConfigurableAxis axisPosZ{"axisPosZ", {10, -10, 10}, "Mixing bins - posZ"}; ConfigurableAxis axisCentrality{"axisCentrality", {10, 0, 100}, "Mixing bins - centrality"}; using BinningType = ColumnBinningPolicy; @@ -1536,12 +1536,13 @@ struct decay3bodyBuilder { //------------------------------------------------------------------ // Event-mixing background - void processRun3ReducedEM(ReducedCollisionsMultsCents const&, aod::RedDecay3Bodys const&, aod::RedIUTracks const&) + void processRun3ReducedEM(ReducedCollisionsMultsCents const& collisions, aod::RedDecay3Bodys const& decay3bodys, aod::RedIUTracks const&) { vtxCandidates.clear(); + auto tuple = std::make_tuple(decay3bodys); BinningType binningEvent{{axisPosZ, axisCentrality}, true}; - SameKindPair pair{binningEvent, EMTrackSel.nUseMixedEvent, -1, &cache}; + SameKindPair pair{binningEvent, EMTrackSel.nUseMixedEvent, -1, collisions, tuple, &cache}; int lastRunNumber = -1; From 658250ec35603ffec4f98a73800b4b8793ee6ce7 Mon Sep 17 00:00:00 2001 From: nzardosh Date: Fri, 21 Feb 2025 13:50:20 +0000 Subject: [PATCH 0366/1650] [PWGHF] Fix McParticles slicing in candidateCreatorMcGen (#10123) --- PWGHF/TableProducer/candidateCreatorMcGen.cxx | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/PWGHF/TableProducer/candidateCreatorMcGen.cxx b/PWGHF/TableProducer/candidateCreatorMcGen.cxx index 9705d060f39..f2e9c685b55 100644 --- a/PWGHF/TableProducer/candidateCreatorMcGen.cxx +++ b/PWGHF/TableProducer/candidateCreatorMcGen.cxx @@ -51,14 +51,20 @@ struct HfCandidateCreatorMcGen { Configurable createLc{"createLc", false, "Create Lc in 3 prong"}; Configurable createXic{"createXic", false, "Create Xic in 3 prong"}; - void process(aod::McCollision const&, + Preslice mcParticlesPerMcCollision = aod::mcparticle::mcCollisionId; + + void process(aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) { - if (fill2Prong) { - hf_mc_gen::fillMcMatchGen2Prong(mcParticles, mcParticles, rowMcMatchGen2Prong, rejectBackground2Prong); - } - if (fill3Prong) { - hf_mc_gen::fillMcMatchGen3Prong(mcParticles, mcParticles, rowMcMatchGen3Prong, rejectBackground3Prong, createDplus, createDs, createLc, createXic); + + for (const auto& mcCollision : mcCollisions) { + const auto mcParticlesPerMcColl = mcParticles.sliceBy(mcParticlesPerMcCollision, mcCollision.globalIndex()); + if (fill2Prong) { + hf_mc_gen::fillMcMatchGen2Prong(mcParticles, mcParticlesPerMcColl, rowMcMatchGen2Prong, rejectBackground2Prong); + } + if (fill3Prong) { + hf_mc_gen::fillMcMatchGen3Prong(mcParticles, mcParticlesPerMcColl, rowMcMatchGen3Prong, rejectBackground3Prong, createDplus, createDs, createLc, createXic); + } } if (fillBplus) { hf_mc_gen::fillMcMatchGenBplus(mcParticles, rowMcMatchGenBplus); From c4b7180b59ac0970e89eda52bf5eeebf239a1736 Mon Sep 17 00:00:00 2001 From: Stefano Cannito <143754257+scannito@users.noreply.github.com> Date: Fri, 21 Feb 2025 17:53:56 +0100 Subject: [PATCH 0367/1650] [PWGLF] Explicitly set minpt for phi and k0s in GenMC (#10130) --- PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx index 572c5fb45a8..b2d2edc682c 100644 --- a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx @@ -1355,7 +1355,7 @@ struct Phik0shortanalysis { for (const auto& mcParticle : mcParticlesThisColl) { if (mcParticle.pdgCode() != 333) continue; - if (std::abs(mcParticle.y()) > cfgYAcceptance) + if (std::abs(mcParticle.y()) > cfgYAcceptance || mcParticle.pt() < minPhiPt) continue; if (!isCountedMCPhi.at(0)) { @@ -1436,7 +1436,7 @@ struct Phik0shortanalysis { for (const auto& mcParticle : mcParticlesThisColl) { if (mcParticle.pdgCode() != 333) continue; - if (std::abs(mcParticle.y()) > cfgYAcceptance) + if (std::abs(mcParticle.y()) > cfgYAcceptance || mcParticle.pt() < minPhiPt) continue; if (!isCountedMCPhi.at(0)) { @@ -1467,7 +1467,7 @@ struct Phik0shortanalysis { for (const auto& mcParticle : mcParticlesThisColl) { if (mcParticle.pdgCode() != 333) continue; - if (std::abs(mcParticle.y()) > cfgYAcceptance) + if (std::abs(mcParticle.y()) > cfgYAcceptance || mcParticle.pt() < minPhiPt) continue; if (!isCountedMCPhi.at(0)) { @@ -2022,7 +2022,7 @@ struct Phik0shortanalysis { for (const auto& mcParticle1 : mcParticles) { if (mcParticle1.pdgCode() != 310) continue; - if (!mcParticle1.isPhysicalPrimary()) + if (!mcParticle1.isPhysicalPrimary() || mcParticle1.pt() < v0Configs.v0SettingMinPt) continue; mcK0SHist.fill(HIST("h3K0SRapidityGenMC"), genmultiplicity, mcParticle1.pt(), mcParticle1.y()); @@ -2053,6 +2053,8 @@ struct Phik0shortanalysis { if (!isPosKaon || !isNegKaon) continue; } + if (mcParticle2.pt() < minPhiPt) + continue; if (std::abs(mcParticle2.y()) > cfgYAcceptance) continue; @@ -2105,7 +2107,7 @@ struct Phik0shortanalysis { for (const auto& mcParticle1 : mcParticles) { if (std::abs(mcParticle1.pdgCode()) != 211) continue; - if (!mcParticle1.isPhysicalPrimary()) + if (!mcParticle1.isPhysicalPrimary() || mcParticle1.pt() < trackConfigs.cMinPionPtcut) continue; mcPionHist.fill(HIST("h3PiRapidityGenMC"), genmultiplicity, mcParticle1.pt(), mcParticle1.y()); @@ -2136,6 +2138,8 @@ struct Phik0shortanalysis { if (!isPosKaon || !isNegKaon) continue; } + if (mcParticle2.pt() < minPhiPt) + continue; if (std::abs(mcParticle2.y()) > cfgYAcceptance) continue; From 1cada13672c574ba68f681beef36ee7010f423cb Mon Sep 17 00:00:00 2001 From: lauraser <45659867+lauraser@users.noreply.github.com> Date: Fri, 21 Feb 2025 19:35:30 +0100 Subject: [PATCH 0368/1650] Fix abs to std::abs (#10134) Co-authored-by: Laura Serksnyte --- PWGCF/FemtoDream/Core/femtoDreamV0Selection.h | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/PWGCF/FemtoDream/Core/femtoDreamV0Selection.h b/PWGCF/FemtoDream/Core/femtoDreamV0Selection.h index 6a4a8d68c0f..af9290d51ad 100644 --- a/PWGCF/FemtoDream/Core/femtoDreamV0Selection.h +++ b/PWGCF/FemtoDream/Core/femtoDreamV0Selection.h @@ -471,10 +471,10 @@ bool FemtoDreamV0Selection::isSelectedMinimal(C const& /*col*/, V const& v0, // v0 auto nSigmaPiNeg = negTrack.tpcNSigmaPi(); auto nSigmaPrPos = posTrack.tpcNSigmaPr(); - if (!(abs(nSigmaPrNeg - nSigmaPIDOffsetTPC) < nSigmaPIDMax && - abs(nSigmaPiPos - nSigmaPIDOffsetTPC) < nSigmaPIDMax) && - !(abs(nSigmaPrPos - nSigmaPIDOffsetTPC) < nSigmaPIDMax && - abs(nSigmaPiNeg - nSigmaPIDOffsetTPC) < nSigmaPIDMax)) { + if (!(std::abs(nSigmaPrNeg - nSigmaPIDOffsetTPC) < nSigmaPIDMax && + std::abs(nSigmaPiPos - nSigmaPIDOffsetTPC) < nSigmaPIDMax) && + !(std::abs(nSigmaPrPos - nSigmaPIDOffsetTPC) < nSigmaPIDMax && + std::abs(nSigmaPiNeg - nSigmaPIDOffsetTPC) < nSigmaPIDMax)) { return false; } @@ -558,8 +558,8 @@ std::array auto lambdaMassNominal = o2::constants::physics::MassLambda; auto lambdaMassHypothesis = v0.mLambda(); auto antiLambdaMassHypothesis = v0.mAntiLambda(); - auto diffLambda = abs(lambdaMassNominal - lambdaMassHypothesis); - auto diffAntiLambda = abs(antiLambdaMassHypothesis - lambdaMassHypothesis); + auto diffLambda = std::abs(lambdaMassNominal - lambdaMassHypothesis); + auto diffAntiLambda = std::abs(antiLambdaMassHypothesis - lambdaMassHypothesis); float sign = 0.; int nSigmaPIDMax = PosDaughTrack.getSigmaPIDMax(); @@ -568,15 +568,15 @@ std::array auto nSigmaPiNeg = negTrack.tpcNSigmaPi(); auto nSigmaPrPos = posTrack.tpcNSigmaPr(); // check the mass and the PID of daughters - if (abs(nSigmaPrNeg - nSigmaPIDOffsetTPC) < nSigmaPIDMax && abs(nSigmaPiPos - nSigmaPIDOffsetTPC) < nSigmaPIDMax && diffAntiLambda > diffLambda) { + if (std::abs(nSigmaPrNeg - nSigmaPIDOffsetTPC) < nSigmaPIDMax && std::abs(nSigmaPiPos - nSigmaPIDOffsetTPC) < nSigmaPIDMax && diffAntiLambda > diffLambda) { sign = -1.; - } else if (abs(nSigmaPrPos - nSigmaPIDOffsetTPC) < nSigmaPIDMax && abs(nSigmaPiNeg - nSigmaPIDOffsetTPC) < nSigmaPIDMax && diffAntiLambda < diffLambda) { + } else if (std::abs(nSigmaPrPos - nSigmaPIDOffsetTPC) < nSigmaPIDMax && std::abs(nSigmaPiNeg - nSigmaPIDOffsetTPC) < nSigmaPIDMax && diffAntiLambda < diffLambda) { sign = 1.; } else { // if it happens that none of these are true, ignore the invariant mass - if (abs(nSigmaPrNeg - nSigmaPIDOffsetTPC) < nSigmaPIDMax && abs(nSigmaPiPos - nSigmaPIDOffsetTPC) < nSigmaPIDMax) { + if (std::abs(nSigmaPrNeg - nSigmaPIDOffsetTPC) < nSigmaPIDMax && std::abs(nSigmaPiPos - nSigmaPIDOffsetTPC) < nSigmaPIDMax) { sign = -1.; - } else if (abs(nSigmaPrPos - nSigmaPIDOffsetTPC) < nSigmaPIDMax && abs(nSigmaPiNeg - nSigmaPIDOffsetTPC) < nSigmaPIDMax) { + } else if (std::abs(nSigmaPrPos - nSigmaPIDOffsetTPC) < nSigmaPIDMax && std::abs(nSigmaPiNeg - nSigmaPIDOffsetTPC) < nSigmaPIDMax) { sign = 1.; } } From 4c80998cf8fdaf05fc30cc7bb3de7353ebd8e133 Mon Sep 17 00:00:00 2001 From: Suraj Prasad Date: Sat, 22 Feb 2025 00:58:27 +0530 Subject: [PATCH 0369/1650] [PWGLF] Adding process functions for Xi versus Flattenicity (#10124) --- .../Strangeness/lambdak0sflattenicity.cxx | 503 +++++++++++++----- 1 file changed, 365 insertions(+), 138 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdak0sflattenicity.cxx b/PWGLF/Tasks/Strangeness/lambdak0sflattenicity.cxx index a931ae21070..2cc264499f2 100755 --- a/PWGLF/Tasks/Strangeness/lambdak0sflattenicity.cxx +++ b/PWGLF/Tasks/Strangeness/lambdak0sflattenicity.cxx @@ -22,6 +22,7 @@ #include #include #include +#include #include "Framework/AnalysisDataModel.h" #include "Framework/AnalysisTask.h" @@ -67,7 +68,12 @@ struct Lambdak0sflattenicity { OutputObjHandlingPolicy::AnalysisObject, true, true}; - + HistogramRegistry rXi{ + "Xi", + {}, + OutputObjHandlingPolicy::AnalysisObject, + true, + true}; HistogramRegistry rCommonHist{ "commonhists", {}, @@ -98,6 +104,8 @@ struct Lambdak0sflattenicity { Configurable nBinsK0sMass{"nBinsK0sMass", 200, "N bins in K0sMass"}; Configurable nBinsLambdaMass{"nBinsLambdaMass", 200, "N bins in LambdaMass"}; + Configurable nBinsXiMass{"nBinsXiMass", 200, "N bins in XiMass"}; + Configurable nBinspT{"nBinspT", 250, "N bins in pT"}; Configurable nBinsFlattenicity{"nBinsFlattenicity", 100, "N bins in Flattenicity"}; @@ -147,12 +155,14 @@ struct Lambdak0sflattenicity { "DCA Pos To PV"}; Configurable v0settingDCAnegtopv{"v0settingDCAnegtopv", 0.06, "DCA Neg To PV"}; + Configurable v0settingDCAbactopv{"v0settingDCAbactopv", 0.06, + "DCA Bchelor To PV"}; Configurable v0settingRapidity{"v0settingRapidity", 0.5, "V0 rapidity cut"}; // Configurable parameters for V0 selection for KOs - Configurable v0settingCosPAK0s{"v0settingCosPAK0s", 0.97, - "V0 CosPA for K0s"}; + Configurable v0settingCosPAK0s{"v0settingCosPAK0s", 0.97, + "V0 CosPA for K0s"}; Configurable v0settingRadiusK0s{"v0settingRadiusK0s", 0.5, "v0radius for K0s"}; Configurable v0settingcTauK0s{"v0settingcTauK0s", 20, @@ -163,8 +173,8 @@ struct Lambdak0sflattenicity { "Armenteros-Podolanski cut for K0s"}; // Configurable parameters for V0 selection for Lambda - Configurable v0settingCosPALambda{"v0settingCosPALambda", 0.995, - "V0 CosPA for Lambda"}; + Configurable v0settingCosPALambda{"v0settingCosPALambda", 0.995, + "V0 CosPA for Lambda"}; Configurable v0settingRadiusLambda{"v0settingRadiusLambda", 0.5, "v0radius for Lambda"}; Configurable v0settingcTauLambda{"v0settingcTauLambda", 30, @@ -175,6 +185,7 @@ struct Lambdak0sflattenicity { // Configurable parameters for PID selection Configurable nSigmaTPCPion{"nSigmaTPCPion", 5, "nSigmaTPCPion"}; Configurable nSigmaTPCProton{"nSigmaTPCProton", 5, "nSigmaTPCProton"}; + Configurable nSigmaTPCKaon{"nSigmaTPCKaon", 5, "nSigmaTPCKaon"}; // Configurable v0daughter_etacut{"V0DaughterEtaCut", 0.8, // "V0DaughterEtaCut"}; @@ -185,6 +196,20 @@ struct Lambdak0sflattenicity { "Eta range for tracks"}; Configurable cfgTrkLowPtCut{"cfgTrkLowPtCut", 0.0f, "Minimum pT"}; + // Additional Cut configurables for Cascades + Configurable nTPCcrossedRows{"nTPCcrossedRows", 52, "Number of TPC crossed pad raws"}; + Configurable cascsettingDCAv0toPV{"cascsettingDCAv0toPV", 0.03, "DCA V0 To PV"}; + Configurable cascsettingDCAv0bach{"cascsettingDCAv0bach", 0.25, "DCA V0 To bachelor"}; + Configurable cascsettingDCAxybaryonbach{"cascsettingDCAxybaryonbach", 0.02, "DCA Baryon To bachelor"}; + Configurable cascsettingCosPAcascPV{"cascsettingCosPAcascPV", 0.9947, "CosThetap for Cascade to PV"}; + Configurable cascsettingCosPAv0PV{"cascsettingCosPAv0PV", 0.9876, "CosThetap for V0 to PV"}; + Configurable cascsettingv0radius{"cascsettingv0radius", 0.55, "V0 decay radius for cadcades in cm"}; + Configurable cascsettingcascradius{"cascsettingcascradius", 1.01, "Cascade decay radius for cadcades in cm"}; + Configurable cascsettingRapidity{"cascsettingRapidity", 0.5, "Cascade rapidity cut"}; + Configurable cascsettingMassRejectionLambdaXi{"cascsettingMassRejectionLambdaXi", 0.0116, "Casc Mass Rejection cut of Lambda for Xi"}; + Configurable cascsettingMassRejectioOmegaXi{"cascsettingMassRejectioOmegaXi", -1, "Casc Mass Rejection cut of Omega for Xi"}; + Configurable cascsettingproplifetime{"cascsettingproplifetime", 4.6, "Scale for lifetime cut on ctau Xi"}; + int nbin = 1; void init(InitContext const&) @@ -196,6 +221,8 @@ struct Lambdak0sflattenicity { "#it{M}_{p#pi^{-}} [GeV/#it{c}^{2}]"}; AxisSpec antilambdaMassAxis = {nBinsLambdaMass, 1.015f, 1.215f, "#it{M}_{#pi^{+}#bar{p}} [GeV/#it{c}^{2}]"}; + AxisSpec xiMassAxis = {nBinsXiMass, 1.3f, 1.34f, + "#it{M}_{#Lambda#pi} [GeV/#it{c}^{2}]"}; AxisSpec vertexZAxis = {nBinsVz, -15., 15., "vrtx_{Z} [cm]"}; AxisSpec ptAxis = {nBinspT, 0.0f, 25.0f, "#it{p}_{T} (GeV/#it{c})"}; AxisSpec flatAxis = {nBinsFlattenicity, 0.0f, 1.0f, "1-#rho_{ch}"}; @@ -239,19 +266,152 @@ struct Lambdak0sflattenicity { if (isINELgt0) { rEventSelection.get(HIST("hEventsSelected"))->GetXaxis()->SetBinLabel(nbin++, "INEL>0"); } - if (doprocessGenMCLambdaK0s) { - rEventSelection.get(HIST("hEventsSelected"))->GetXaxis()->SetBinLabel(nbin, "Applied selection"); - } rEventSelection.add("hFlattenicityDistribution", "hFlattenicityDistribution", {HistType::kTH1D, {flatAxis}}); - if (doprocessRecMCLambdaK0s) { + if (doprocessRecMCLambdaK0s || doprocessRecMCRun3Cascade) { rEventSelection.add("hFlattenicityDistributionMCGen_Rec", "hFlattenicityDistributionMCGen_Rec", {HistType::kTH1D, {flatAxis}}); rEventSelection.add("hFlattenicity_Corr_Gen_vs_Rec", "hFlattenicity_Corr_Gen_vs_Rec", {HistType::kTH2D, {flatAxis, flatAxis}}); } - if (doprocessGenMCLambdaK0s) { + + if (doprocessDataRun3LambdaK0s || doprocessRecMCLambdaK0s) { + // K0s reconstruction + // Mass + rKzeroShort.add("hMassK0s", "hMassK0s", {HistType::kTH1D, {k0sMassAxis}}); + rKzeroShort.add("hMassK0sSelected", "hMassK0sSelected", + {HistType::kTH1D, {k0sMassAxis}}); + + // K0s topological/PID cuts + rKzeroShort.add("hrapidityK0s", "hrapidityK0s", + {HistType::kTH1D, {{40, -2.0f, 2.0f, "y"}}}); + rKzeroShort.add("hctauK0s", "hctauK0s", + {HistType::kTH1D, {{40, 0.0f, 40.0f, "c#tau (cm)"}}}); + rKzeroShort.add( + "h2DdecayRadiusK0s", "h2DdecayRadiusK0s", + {HistType::kTH1D, {{100, 0.0f, 1.0f, "Decay Radius (cm)"}}}); + rKzeroShort.add("hDCAV0DaughtersK0s", "hDCAV0DaughtersK0s", + {HistType::kTH1D, {{55, 0.0f, 2.2f, "DCA Daughters"}}}); + rKzeroShort.add("hV0CosPAK0s", "hV0CosPAK0s", + {HistType::kTH1D, {{100, 0.95f, 1.f, "CosPA"}}}); + rKzeroShort.add("hNSigmaPosPionFromK0s", "hNSigmaPosPionFromK0s", + {HistType::kTH2D, {{100, -5.f, 5.f}, {ptAxis}}}); + rKzeroShort.add("hNSigmaNegPionFromK0s", "hNSigmaNegPionFromK0s", + {HistType::kTH2D, {{100, -5.f, 5.f}, {ptAxis}}}); + rKzeroShort.add("hMassK0spT", "hMassK0spT", + {HistType::kTH2D, {{k0sMassAxis}, {ptAxis}}}); + rKzeroShort.add("hMassK0spTFlat", "hMassK0spTFlat", + {HistType::kTH3D, {{k0sMassAxis}, {ptAxis}, {flatAxis}}}); + rKzeroShort.add("hArmPodoAlphavsQTK0sAfterCut", "hArmPodoAlphavsQTK0sAfterCut", + {HistType::kTH2D, {{200, -1, 1, "#alpha"}, {70, 0, 0.35, "Q_{T}"}}}); + + if (doprocessRecMCLambdaK0s) { + rKzeroShort.add("Generated_MCRecoCollCheck_INEL_K0Short", "Generated_MCRecoCollCheck_INEL_K0Short", + {HistType::kTH2D, {{ptAxis}, {flatAxis}}}); + } + + // Lambda reconstruction Mass + rLambda.add("hMassLambda", "hMassLambda", + {HistType::kTH1D, {lambdaMassAxis}}); + rLambda.add("hMassLambdaSelected", "hMassLambdaSelected", + {HistType::kTH1D, {lambdaMassAxis}}); + + // Lambda topological/PID cuts + rLambda.add("hDCAV0DaughtersLambda", "hDCAV0DaughtersLambda", + {HistType::kTH1D, {{55, 0.0f, 2.2f, "DCA Daughters"}}}); + rLambda.add("hV0CosPALambda", "hV0CosPALambda", + {HistType::kTH1D, {{100, 0.95f, 1.f, "CosPA"}}}); + rLambda.add("hNSigmaPosPionFromLambda", "hNSigmaPosPionFromLambda", + {HistType::kTH2D, {{100, -5.f, 5.f}, {ptAxis}}}); + rLambda.add("hNSigmaNegPionFromLambda", "hNSigmaNegPionFromLambda", + {HistType::kTH2D, {{100, -5.f, 5.f}, {ptAxis}}}); + rLambda.add("hrapidityLambda", "hrapidityLambda", + {HistType::kTH1D, {{40, -2.0f, 2.0f, "y"}}}); + rLambda.add("hctauLambda", "hctauLambda", + {HistType::kTH1D, {{40, 0.0f, 40.0f, "c#tau (cm)"}}}); + rLambda.add("h2DdecayRadiusLambda", "h2DdecayRadiusLambda", + {HistType::kTH1D, {{100, 0.0f, 1.0f, "c#tau (cm)"}}}); + rLambda.add("hMassLambdapT", "hMassLambdapT", + {HistType::kTH2D, {{lambdaMassAxis}, {ptAxis}}}); + rLambda.add("hMassLambdapTFlat", "hMassLambdapTFlat", + {HistType::kTH3D, {{lambdaMassAxis}, {ptAxis}, {flatAxis}}}); + if (doprocessRecMCLambdaK0s) { + rLambda.add("Generated_MCRecoCollCheck_INEL_Lambda", "Generated_MCRecoCollCheck_INEL_Lambda", + {HistType::kTH2D, {{ptAxis}, {flatAxis}}}); + } + + // AntiLambda reconstruction + // Mass + rAntiLambda.add("hMassAntiLambda", "hMassAntiLambda", + {HistType::kTH1D, {antilambdaMassAxis}}); + rAntiLambda.add("hMassAntiLambdaSelected", "hMassAntiLambdaSelected", + {HistType::kTH1D, {antilambdaMassAxis}}); + + // AntiLambda topological/PID cuts + rAntiLambda.add("hDCAV0DaughtersAntiLambda", "hDCAV0DaughtersAntiLambda", + {HistType::kTH1D, {{55, 0.0f, 2.2f, "DCA Daughters"}}}); + rAntiLambda.add("hV0CosPAAntiLambda", "hV0CosPAAntiLambda", + {HistType::kTH1D, {{100, 0.95f, 1.f, "CosPA"}}}); + rAntiLambda.add("hNSigmaPosPionFromAntiLambda", + "hNSigmaPosPionFromAntiLambda", + {HistType::kTH2D, {{100, -5.f, 5.f}, {ptAxis}}}); + rAntiLambda.add("hNSigmaNegPionFromAntiLambda", + "hNSigmaNegPionFromAntiLambda", + {HistType::kTH2D, {{100, -5.f, 5.f}, {ptAxis}}}); + rAntiLambda.add("hrapidityAntiLambda", "hrapidityAntiLambda", + {HistType::kTH1D, {{40, -2.0f, 2.0f, "y"}}}); + rAntiLambda.add("hctauAntiLambda", "hctauAntiLambda", + {HistType::kTH1D, {{40, 0.0f, 40.0f, "c#tau (cm)"}}}); + rAntiLambda.add("h2DdecayRadiusAntiLambda", "h2DdecayRadiusAntiLambda", + {HistType::kTH1D, {{100, 0.0f, 1.0f, "c#tau (cm)"}}}); + rAntiLambda.add("hMassAntiLambdapT", "hMassAntiLambdapT", + {HistType::kTH2D, {{antilambdaMassAxis}, {ptAxis}}}); + rAntiLambda.add("hMassAntiLambdapTFlat", "hMassAntiLambdapTFlat", + {HistType::kTH3D, {{antilambdaMassAxis}, {ptAxis}, {flatAxis}}}); + if (doprocessRecMCLambdaK0s) { + rAntiLambda.add("Generated_MCRecoCollCheck_INEL_AntiLambda", "Generated_MCRecoCollCheck_INEL_AntiLambda", + {HistType::kTH2D, {{ptAxis}, {flatAxis}}}); + } + + rCommonHist.add("hArmPodoAlphavsQT", "hArmPodoAlphavsQT", + {HistType::kTH2D, {{200, -1, 1, "#alpha"}, {70, 0, 0.35, "Q_{T}"}}}); + } + + if (doprocessRecMCRun3Cascade || doprocessDataRun3Cascade) { + rXi.add("hMassXi", "hMassXi", {HistType::kTH1D, {xiMassAxis}}); + rXi.add("hMassXiSelected", "hMassXiSelected", + {HistType::kTH1D, {xiMassAxis}}); + + // Xi topological/PID cuts + rXi.add("hrapidityXi", "hrapidityXi", + {HistType::kTH1D, {{40, -2.0f, 2.0f, "y"}}}); + rXi.add("hctauXi", "hctauXi", + {HistType::kTH1D, {{40, 0.0f, 40.0f, "c#tau (cm)"}}}); + rXi.add( + "h2DdecayRadiusXi", "h2DdecayRadiusXi", + {HistType::kTH1D, {{100, 0.0f, 1.0f, "Decay Radius (cm)"}}}); + rXi.add("hDCAV0DaughtersXi", "hDCAV0DaughtersXi", + {HistType::kTH1D, {{55, 0.0f, 2.2f, "DCA Daughters"}}}); + rXi.add("hV0CosPAXi", "hV0CosPAXi", + {HistType::kTH1D, {{100, 0.95f, 1.f, "CosPA"}}}); + rXi.add("hNSigmaPosPionFromXi", "hNSigmaPosPionFromXi", + {HistType::kTH2D, {{100, -5.f, 5.f}, {ptAxis}}}); + rXi.add("hNSigmaNegPionFromXi", "hNSigmaNegPionFromXi", + {HistType::kTH2D, {{100, -5.f, 5.f}, {ptAxis}}}); + rXi.add("hMassXipT", "hMassXipT", + {HistType::kTH2D, {{xiMassAxis}, {ptAxis}}}); + rXi.add("hMassXipTFlat", "hMassXipTFlat", + {HistType::kTH3D, {{xiMassAxis}, {ptAxis}, {flatAxis}}}); + if (doprocessRecMCRun3Cascade) { + rXi.add("Generated_MCRecoCollCheck_INEL_Xi", "Generated_MCRecoCollCheck_INEL_Xi", + {HistType::kTH2D, {{ptAxis}, {flatAxis}}}); + } + } + if (doprocessGenMC) { + + rEventSelection.get(HIST("hEventsSelected"))->GetXaxis()->SetBinLabel(nbin, "Applied selection"); + rEventSelection.add("hVertexZGen", "hVertexZGen", {HistType::kTH1D, {vertexZAxis}}); @@ -281,42 +441,7 @@ struct Lambdak0sflattenicity { rEventSelection.get(HIST("hNEventsMCReco"))->GetXaxis()->SetBinLabel(4, "check"); rEventSelection.add("hTrueFV0amplvsFlat", "TrueFV0MvsFlat", HistType::kTH2D, {{500, -0.5, +499.5, "True Nch in FV0 region"}, flatAxis}); - } - // K0s reconstruction - // Mass - rKzeroShort.add("hMassK0s", "hMassK0s", {HistType::kTH1D, {k0sMassAxis}}); - rKzeroShort.add("hMassK0sSelected", "hMassK0sSelected", - {HistType::kTH1D, {k0sMassAxis}}); - - // K0s topological/PID cuts - rKzeroShort.add("hrapidityK0s", "hrapidityK0s", - {HistType::kTH1D, {{40, -2.0f, 2.0f, "y"}}}); - rKzeroShort.add("hctauK0s", "hctauK0s", - {HistType::kTH1D, {{40, 0.0f, 40.0f, "c#tau (cm)"}}}); - rKzeroShort.add( - "h2DdecayRadiusK0s", "h2DdecayRadiusK0s", - {HistType::kTH1D, {{100, 0.0f, 1.0f, "Decay Radius (cm)"}}}); - rKzeroShort.add("hDCAV0DaughtersK0s", "hDCAV0DaughtersK0s", - {HistType::kTH1D, {{55, 0.0f, 2.2f, "DCA Daughters"}}}); - rKzeroShort.add("hV0CosPAK0s", "hV0CosPAK0s", - {HistType::kTH1D, {{100, 0.95f, 1.f, "CosPA"}}}); - rKzeroShort.add("hNSigmaPosPionFromK0s", "hNSigmaPosPionFromK0s", - {HistType::kTH2D, {{100, -5.f, 5.f}, {ptAxis}}}); - rKzeroShort.add("hNSigmaNegPionFromK0s", "hNSigmaNegPionFromK0s", - {HistType::kTH2D, {{100, -5.f, 5.f}, {ptAxis}}}); - rKzeroShort.add("hMassK0spT", "hMassK0spT", - {HistType::kTH2D, {{k0sMassAxis}, {ptAxis}}}); - rKzeroShort.add("hMassK0spTFlat", "hMassK0spTFlat", - {HistType::kTH3D, {{k0sMassAxis}, {ptAxis}, {flatAxis}}}); - rKzeroShort.add("hArmPodoAlphavsQTK0sAfterCut", "hArmPodoAlphavsQTK0sAfterCut", - {HistType::kTH2D, {{200, -1, 1, "#alpha"}, {70, 0, 0.35, "Q_{T}"}}}); - - if (doprocessRecMCLambdaK0s) { - rKzeroShort.add("Generated_MCRecoCollCheck_INEL_K0Short", "Generated_MCRecoCollCheck_INEL_K0Short", - {HistType::kTH2D, {{ptAxis}, {flatAxis}}}); - } - - if (doprocessGenMCLambdaK0s) { + rKzeroShort.add("pGen_MCGenRecoColl_INEL_K0Short", "pGen_MCGenRecoColl_INEL_K0Short", {HistType::kTH2D, {ptAxis, flatAxis}}); rKzeroShort.add("Generated_MCRecoColl_INEL_K0Short", "Generated_MCRecoColl_INEL_K0Short", @@ -331,38 +456,7 @@ struct Lambdak0sflattenicity { {HistType::kTH2D, {ptAxis, flatAxis}}); rKzeroShort.add("pGen_MCGenColl_INELgt0_K0Short", "pGen_MCGenColl_INELgt0_K0Short", {HistType::kTH2D, {ptAxis, flatAxis}}); - } - // Lambda reconstruction Mass - rLambda.add("hMassLambda", "hMassLambda", - {HistType::kTH1D, {lambdaMassAxis}}); - rLambda.add("hMassLambdaSelected", "hMassLambdaSelected", - {HistType::kTH1D, {lambdaMassAxis}}); - - // Lambda topological/PID cuts - rLambda.add("hDCAV0DaughtersLambda", "hDCAV0DaughtersLambda", - {HistType::kTH1D, {{55, 0.0f, 2.2f, "DCA Daughters"}}}); - rLambda.add("hV0CosPALambda", "hV0CosPALambda", - {HistType::kTH1D, {{100, 0.95f, 1.f, "CosPA"}}}); - rLambda.add("hNSigmaPosPionFromLambda", "hNSigmaPosPionFromLambda", - {HistType::kTH2D, {{100, -5.f, 5.f}, {ptAxis}}}); - rLambda.add("hNSigmaNegPionFromLambda", "hNSigmaNegPionFromLambda", - {HistType::kTH2D, {{100, -5.f, 5.f}, {ptAxis}}}); - rLambda.add("hrapidityLambda", "hrapidityLambda", - {HistType::kTH1D, {{40, -2.0f, 2.0f, "y"}}}); - rLambda.add("hctauLambda", "hctauLambda", - {HistType::kTH1D, {{40, 0.0f, 40.0f, "c#tau (cm)"}}}); - rLambda.add("h2DdecayRadiusLambda", "h2DdecayRadiusLambda", - {HistType::kTH1D, {{100, 0.0f, 1.0f, "c#tau (cm)"}}}); - rLambda.add("hMassLambdapT", "hMassLambdapT", - {HistType::kTH2D, {{lambdaMassAxis}, {ptAxis}}}); - rLambda.add("hMassLambdapTFlat", "hMassLambdapTFlat", - {HistType::kTH3D, {{lambdaMassAxis}, {ptAxis}, {flatAxis}}}); - if (doprocessRecMCLambdaK0s) { - rLambda.add("Generated_MCRecoCollCheck_INEL_Lambda", "Generated_MCRecoCollCheck_INEL_Lambda", - {HistType::kTH2D, {{ptAxis}, {flatAxis}}}); - } - - if (doprocessGenMCLambdaK0s) { + rLambda.add("pGen_MCGenRecoColl_INEL_Lambda", "pGen_MCGenRecoColl_INEL_Lambda", {HistType::kTH2D, {ptAxis, flatAxis}}); rLambda.add("Generated_MCRecoColl_INEL_Lambda", "Generated_MCRecoColl_INEL_Lambda", @@ -377,41 +471,7 @@ struct Lambdak0sflattenicity { {HistType::kTH2D, {ptAxis, flatAxis}}); rLambda.add("pGen_MCGenColl_INELgt0_Lambda", "pGen_MCGenColl_INELgt0_Lambda", {HistType::kTH2D, {ptAxis, flatAxis}}); - } - // AntiLambda reconstruction - // Mass - rAntiLambda.add("hMassAntiLambda", "hMassAntiLambda", - {HistType::kTH1D, {antilambdaMassAxis}}); - rAntiLambda.add("hMassAntiLambdaSelected", "hMassAntiLambdaSelected", - {HistType::kTH1D, {antilambdaMassAxis}}); - - // AntiLambda topological/PID cuts - rAntiLambda.add("hDCAV0DaughtersAntiLambda", "hDCAV0DaughtersAntiLambda", - {HistType::kTH1D, {{55, 0.0f, 2.2f, "DCA Daughters"}}}); - rAntiLambda.add("hV0CosPAAntiLambda", "hV0CosPAAntiLambda", - {HistType::kTH1D, {{100, 0.95f, 1.f, "CosPA"}}}); - rAntiLambda.add("hNSigmaPosPionFromAntiLambda", - "hNSigmaPosPionFromAntiLambda", - {HistType::kTH2D, {{100, -5.f, 5.f}, {ptAxis}}}); - rAntiLambda.add("hNSigmaNegPionFromAntiLambda", - "hNSigmaNegPionFromAntiLambda", - {HistType::kTH2D, {{100, -5.f, 5.f}, {ptAxis}}}); - rAntiLambda.add("hrapidityAntiLambda", "hrapidityAntiLambda", - {HistType::kTH1D, {{40, -2.0f, 2.0f, "y"}}}); - rAntiLambda.add("hctauAntiLambda", "hctauAntiLambda", - {HistType::kTH1D, {{40, 0.0f, 40.0f, "c#tau (cm)"}}}); - rAntiLambda.add("h2DdecayRadiusAntiLambda", "h2DdecayRadiusAntiLambda", - {HistType::kTH1D, {{100, 0.0f, 1.0f, "c#tau (cm)"}}}); - rAntiLambda.add("hMassAntiLambdapT", "hMassAntiLambdapT", - {HistType::kTH2D, {{antilambdaMassAxis}, {ptAxis}}}); - rAntiLambda.add("hMassAntiLambdapTFlat", "hMassAntiLambdapTFlat", - {HistType::kTH3D, {{antilambdaMassAxis}, {ptAxis}, {flatAxis}}}); - if (doprocessRecMCLambdaK0s) { - rAntiLambda.add("Generated_MCRecoCollCheck_INEL_AntiLambda", "Generated_MCRecoCollCheck_INEL_AntiLambda", - {HistType::kTH2D, {{ptAxis}, {flatAxis}}}); - } - - if (doprocessGenMCLambdaK0s) { + rAntiLambda.add("pGen_MCGenRecoColl_INEL_AntiLambda", "pGen_MCGenRecoColl_INEL_AntiLambda", {HistType::kTH2D, {ptAxis, flatAxis}}); rAntiLambda.add("Generated_MCRecoColl_INEL_AntiLambda", "Generated_MCRecoColl_INEL_AntiLambda", @@ -426,9 +486,22 @@ struct Lambdak0sflattenicity { {HistType::kTH2D, {ptAxis, flatAxis}}); rAntiLambda.add("pGen_MCGenColl_INELgt0_AntiLambda", "pGen_MCGenColl_INELgt0_AntiLambda", {HistType::kTH2D, {ptAxis, flatAxis}}); + + rXi.add("pGen_MCGenRecoColl_INEL_Xi", "pGen_MCGenRecoColl_INEL_Xi", + {HistType::kTH2D, {ptAxis, flatAxis}}); + rXi.add("Generated_MCRecoColl_INEL_Xi", "Generated_MCRecoColl_INEL_Xi", + {HistType::kTH2D, {ptAxis, flatAxis}}); + rXi.add("pGen_MCGenColl_INEL_Xi", "pGen_MCGenColl_INEL_Xi", + {HistType::kTH2D, {ptAxis, flatAxis}}); + rXi.add("pGen_MCGenRecoColl_INELgt0_Xi", "pGen_MCGenRecoColl_INELgt0_Xi", + {HistType::kTH2D, {ptAxis, flatAxis}}); + rXi.add("Generated_MCRecoColl_INELgt0_Xi", "Generated_MCRecoColl_INELgt0_Xi", + {HistType::kTH2D, {ptAxis, flatAxis}}); + rXi.add("Generated_MCRecoCollCheck_INELgt0_Xi", "Generated_MCRecoCollCheck_INELgt0_Xi", + {HistType::kTH2D, {ptAxis, flatAxis}}); + rXi.add("pGen_MCGenColl_INELgt0_Xi", "pGen_MCGenColl_INELgt0_Xi", + {HistType::kTH2D, {ptAxis, flatAxis}}); } - rCommonHist.add("hArmPodoAlphavsQT", "hArmPodoAlphavsQT", - {HistType::kTH2D, {{200, -1, 1, "#alpha"}, {70, 0, 0.35, "Q_{T}"}}}); if (flattenicityQA) { rFlattenicity.add("hEv", "Ev", HistType::kTH1D, @@ -511,22 +584,14 @@ struct Lambdak0sflattenicity { "hAmpT0CvsVtx", "", HistType::kTH2D, {{30, -15.0, +15.0, "Vtx_z"}, {600, -0.5, +5999.5, "FT0C amplitude"}}); } - if (doprocessDataRun3LambdaK0s && (doprocessRecMCLambdaK0s || doprocessGenMCLambdaK0s)) { - LOGF(fatal, - "Both Data and MC are both set to true; try again with only " - "one of them set to true"); - } - if (!doprocessDataRun3LambdaK0s && !(doprocessRecMCLambdaK0s || doprocessGenMCLambdaK0s)) { - LOGF(fatal, - "Both Data and MC set to false; try again with only one of " - "them set to false"); - } - // if ((doprocessRecMCLambdaK0s && !doprocessGenMCLambdaK0s) || - // (!doprocessRecMCLambdaK0s && doprocessGenMCLambdaK0s)) { - // LOGF(fatal, - // "MCRec and MCGen are set to opposite switches, try again " - // "with both set to either true or false"); - // } + + if ((doprocessDataRun3LambdaK0s || doprocessRecMCLambdaK0s) && (doprocessDataRun3Cascade || doprocessRecMCRun3Cascade)) { + LOGF(fatal, "Can not run both LambdaK0s and Cascade process functions simulatenously. Try one at a time."); + } + + if ((doprocessDataRun3LambdaK0s || doprocessDataRun3Cascade) && doprocessGenMC) { + LOGF(fatal, "Can not run MCGen and Data process functions together. Try one of these at a time"); + } } int getT0ASector(int iCh) @@ -690,6 +755,8 @@ struct Lambdak0sflattenicity { } float pdgmassK0s = 0.497614; float pdgmassLambda = 1.115683; + float pdgmassXi = 1.3217; + float pdgmassOmega = 1.67243; // V0A signal and flatenicity calculation static constexpr float kCalib[48] = { 1.01697, 1.122, 1.03854, 1.108, 1.11634, 1.14971, 1.19321, @@ -1580,7 +1647,7 @@ struct Lambdak0sflattenicity { } // Filter posZFilterMC = (nabs(o2::aod::mccollision::posZ) < cutzvertex); - void processGenMCLambdaK0s( + void processGenMC( o2::aod::McCollision const& mcCollision, const soa::SmallGroups>& collisions, TrackCandidatesMC const& tracks, aod::FT0s const& /*ft0s*/, aod::FV0As const& /*fv0s*/, o2::aod::McParticles const& mcParticles) { @@ -1651,6 +1718,12 @@ struct Lambdak0sflattenicity { rAntiLambda.fill(HIST("pGen_MCGenColl_INELgt0_AntiLambda"), mcParticle.pt(), flattenicity); // AntiLambda } } + if (std::abs(mcParticle.pdgCode()) == 3312) { + rXi.fill(HIST("pGen_MCGenColl_INEL_Xi"), mcParticle.pt(), flattenicity); // Xi + if (isINELgt0true) { + rXi.fill(HIST("pGen_MCGenColl_INELgt0_Xi"), mcParticle.pt(), flattenicity); // Xi + } + } } int recoCollIndexINEL = 0; @@ -1710,6 +1783,12 @@ struct Lambdak0sflattenicity { rAntiLambda.fill(HIST("Generated_MCRecoColl_INELgt0_AntiLambda"), mcParticle.pt(), flattenicity); // AntiLambda } } + if (std::abs(mcParticle.pdgCode()) == 3312) { + rXi.fill(HIST("Generated_MCRecoColl_INEL_Xi"), mcParticle.pt(), flattenicity); // Xi + if (recoCollIndexINELgt0 > 0) { + rXi.fill(HIST("Generated_MCRecoColl_INELgt0_Xi"), mcParticle.pt(), flattenicity); // Xi + } + } } } @@ -1762,15 +1841,163 @@ struct Lambdak0sflattenicity { rAntiLambda.fill(HIST("pGen_MCGenRecoColl_INELgt0_AntiLambda"), mcParticle.pt(), flattenicity); // AntiLambda } } + if (std::abs(mcParticle.pdgCode()) == 3312) { + rXi.fill(HIST("pGen_MCGenRecoColl_INEL_Xi"), mcParticle.pt(), flattenicity); // Xi + if (recoCollIndexINELgt0 > 0) { + rXi.fill(HIST("pGen_MCGenRecoColl_INELgt0_Xi"), mcParticle.pt(), flattenicity); // Xi + } + } + } + } + TRandom2* fRand = new TRandom2(); + // Cascade Analysis Starts here + using DauTracks = soa::Join; + using LabeledCascades = soa::Join; + float ctauxiPDG = 4.91; // from PDG + float ctauomegaPDG = 2.461; // from PDG + + void processDataRun3Cascade(soa::Join::iterator const& collision, + aod::CascDataExt const& Cascades, + aod::V0Datas const&, DauTracks const& tracks, + soa::Join const& /*bcs*/, aod::FT0s const& /*ft0s*/, + aod::FV0As const& /*fv0s*/) + { + if (applyEvSel && + !(isEventSelected(collision))) { // Checking if the event passes the + // selection criteria + return; + } + + auto vtxZ = collision.posZ(); + auto vtxY = collision.posY(); + auto vtxX = collision.posX(); + + float flattenicity = estimateFlattenicity(collision, tracks); + + rEventSelection.fill(HIST("hVertexZ"), vtxZ); + rEventSelection.fill(HIST("hFlattenicityDistribution"), flattenicity); + + for (const auto& casc : Cascades) { + + auto posDaughterTrack = casc.posTrack_as(); + auto negDaughterTrack = casc.negTrack_as(); + auto bacDaughterTrack = casc.bachelor_as(); + + float cascPos = std::hypot(casc.x() - vtxX, casc.y() - vtxY, casc.z() - vtxZ); + float cascTotMom = std::hypot(casc.px(), casc.py(), casc.pz()); + float ctauXi = pdgmassXi * cascPos / (cascTotMom + 1e-13); + // float ctauOmega =pdgmassOmega * cascPos / (cascTotMom + 1e-13); + float dcav0pv = casc.dcav0topv(vtxX, vtxY, vtxZ); + float cosPAcasc = casc.casccosPA(collision.posX(), collision.posY(), collision.posZ()); + float cosPAv0 = casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ()); + float massXi = casc.mXi(); + // Cascade + if (posDaughterTrack.tpcNSigmaPi() < nSigmaTPCPion && negDaughterTrack.tpcNSigmaPi() < nSigmaTPCPion && bacDaughterTrack.tpcNSigmaPi() < nSigmaTPCPion && + posDaughterTrack.tpcNSigmaKa() < nSigmaTPCKaon && negDaughterTrack.tpcNSigmaKa() < nSigmaTPCKaon && bacDaughterTrack.tpcNSigmaKa() < nSigmaTPCKaon && + posDaughterTrack.tpcNSigmaPr() < nSigmaTPCProton && negDaughterTrack.tpcNSigmaPr() < nSigmaTPCProton && bacDaughterTrack.tpcNSigmaPr() < nSigmaTPCProton && + posDaughterTrack.tpcNClsCrossedRows() > nTPCcrossedRows && negDaughterTrack.tpcNClsCrossedRows() > nTPCcrossedRows && bacDaughterTrack.tpcNClsCrossedRows() > nTPCcrossedRows && + std::abs(posDaughterTrack.eta()) < cfgTrkEtaCut && std::abs(negDaughterTrack.eta()) < cfgTrkEtaCut && std::abs(bacDaughterTrack.eta()) < cfgTrkEtaCut && + casc.dcapostopv() > v0settingDCApostopv && casc.dcanegtopv() > v0settingDCAnegtopv && casc.dcabachtopv() > v0settingDCAbactopv && casc.dcaV0daughters() < v0settingDCAv0dau && dcav0pv > cascsettingDCAv0toPV && + casc.dcacascdaughters() < cascsettingDCAv0bach && casc.bachBaryonDCAxyToPV() > cascsettingDCAxybaryonbach && cosPAcasc > cascsettingCosPAcascPV && cosPAv0 > cascsettingCosPAv0PV && + casc.cascradius() > cascsettingcascradius && casc.v0radius() > cascsettingv0radius && + std::abs(casc.yXi()) < cascsettingRapidity && ctauXi < ctauxiPDG * cascsettingproplifetime && + std::abs(casc.mLambda() - pdgmassLambda) < cascsettingMassRejectionLambdaXi && std::abs(casc.mOmega() - pdgmassOmega) > cascsettingMassRejectioOmegaXi) { + + rXi.fill(HIST("hMassXiSelected"), massXi); + rXi.fill(HIST("hDCAV0DaughtersXi"), casc.dcaV0daughters()); + rXi.fill(HIST("hV0CosPAXi"), cosPAv0); + rXi.fill(HIST("hrapidityXi"), casc.rapidity(1)); + rXi.fill(HIST("hctauXi"), ctauXi); + rXi.fill(HIST("h2DdecayRadiusXi"), casc.v0radius()); + rXi.fill(HIST("hMassXipT"), massXi, casc.pt()); + rXi.fill(HIST("hMassXipTFlat"), massXi, casc.pt(), flattenicity); + } + } + } + Preslice> perColCasc = aod::track::collisionId; + SliceCache cacheCasc; + + void processRecMCRun3Cascade(soa::Join const& collisions, + soa::Join const& Cascades, + aod::V0Datas const&, soa::Join const& tracks, + soa::Join const& /*bcs*/, aod::FT0s const& /*ft0s*/, + aod::FV0As const& /*fv0s*/, aod::McCollisions const&, aod::McParticles const& mcParticles) + { + for (const auto& collision : collisions) { + if (applyEvSel && + !(isEventSelected(collision))) { // Checking if the event passes the + // selection criteria + return; + } + + auto vtxZ = collision.posZ(); + auto vtxY = collision.posY(); + auto vtxX = collision.posX(); + + float flattenicity = estimateFlattenicity(collision, tracks); + + rEventSelection.fill(HIST("hVertexZ"), vtxZ); + rEventSelection.fill(HIST("hFlattenicityDistribution"), flattenicity); + + auto cascsThisCollision = Cascades.sliceBy(perColCasc, collision.globalIndex()); + const auto& mcCollision = collision.mcCollision_as(); + + for (const auto& casc : cascsThisCollision) { + + auto posDaughterTrack = casc.posTrack_as(); + auto negDaughterTrack = casc.negTrack_as(); + auto bacDaughterTrack = casc.bachelor_as(); + + float cascPos = std::hypot(casc.x() - vtxX, casc.y() - vtxY, casc.z() - vtxZ); + float cascTotMom = std::hypot(casc.px(), casc.py(), casc.pz()); + float ctauXi = pdgmassXi * cascPos / (cascTotMom + 1e-13); + // float ctauOmega =pdgmassOmega * cascPos / (cascTotMom + 1e-13); + float dcav0pv = casc.dcav0topv(vtxX, vtxY, vtxZ); + float cosPAcasc = casc.casccosPA(collision.posX(), collision.posY(), collision.posZ()); + float cosPAv0 = casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ()); + float massXi = casc.mXi(); + // Cascade + if (posDaughterTrack.tpcNSigmaPi() < nSigmaTPCPion && negDaughterTrack.tpcNSigmaPi() < nSigmaTPCPion && bacDaughterTrack.tpcNSigmaPi() < nSigmaTPCPion && + posDaughterTrack.tpcNSigmaKa() < nSigmaTPCKaon && negDaughterTrack.tpcNSigmaKa() < nSigmaTPCKaon && bacDaughterTrack.tpcNSigmaKa() < nSigmaTPCKaon && + posDaughterTrack.tpcNSigmaPr() < nSigmaTPCProton && negDaughterTrack.tpcNSigmaPr() < nSigmaTPCProton && bacDaughterTrack.tpcNSigmaPr() < nSigmaTPCProton && + posDaughterTrack.tpcNClsCrossedRows() > nTPCcrossedRows && negDaughterTrack.tpcNClsCrossedRows() > nTPCcrossedRows && bacDaughterTrack.tpcNClsCrossedRows() > nTPCcrossedRows && + std::abs(posDaughterTrack.eta()) < cfgTrkEtaCut && std::abs(negDaughterTrack.eta()) < cfgTrkEtaCut && std::abs(bacDaughterTrack.eta()) < cfgTrkEtaCut && + casc.dcapostopv() > v0settingDCApostopv && casc.dcanegtopv() > v0settingDCAnegtopv && casc.dcabachtopv() > v0settingDCAbactopv && casc.dcaV0daughters() < v0settingDCAv0dau && dcav0pv > cascsettingDCAv0toPV && + casc.dcacascdaughters() < cascsettingDCAv0bach && casc.bachBaryonDCAxyToPV() > cascsettingDCAxybaryonbach && cosPAcasc > cascsettingCosPAcascPV && cosPAv0 > cascsettingCosPAv0PV && + casc.cascradius() > cascsettingcascradius && casc.v0radius() > cascsettingv0radius && + std::abs(casc.yXi()) < cascsettingRapidity && ctauXi < ctauxiPDG * cascsettingproplifetime && + std::abs(casc.mLambda() - pdgmassLambda) < cascsettingMassRejectionLambdaXi && std::abs(casc.mOmega() - pdgmassOmega) > cascsettingMassRejectioOmegaXi) { + + rXi.fill(HIST("hMassXiSelected"), massXi); + rXi.fill(HIST("hDCAV0DaughtersXi"), casc.dcaV0daughters()); + rXi.fill(HIST("hV0CosPAXi"), cosPAv0); + rXi.fill(HIST("hrapidityXi"), casc.rapidity(1)); + rXi.fill(HIST("hctauXi"), ctauXi); + rXi.fill(HIST("h2DdecayRadiusXi"), casc.v0radius()); + rXi.fill(HIST("hMassXipT"), massXi, casc.pt()); + rXi.fill(HIST("hMassXipTFlat"), massXi, casc.pt(), flattenicity); + } + } + const auto particlesInCollision = mcParticles.sliceByCached(aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cacheCasc); + float flattenicityMCGen = estimateFlattenicityFV0MC(particlesInCollision); + rEventSelection.fill(HIST("hFlattenicityDistributionMCGen_Rec"), flattenicityMCGen); + rEventSelection.fill(HIST("hFlattenicity_Corr_Gen_vs_Rec"), flattenicityMCGen, flattenicity); + + for (const auto& mcParticle : particlesInCollision) { + if (mcParticle.isPhysicalPrimary() && std::abs(mcParticle.y()) < 0.5f && std::abs(mcParticle.pdgCode()) == 3312) { + rXi.fill(HIST("Generated_MCRecoCollCheck_INEL_Xi"), mcParticle.pt(), flattenicity); // K0s + } + } } } - PROCESS_SWITCH(Lambdak0sflattenicity, processDataRun3LambdaK0s, "Process Run 3 Data", - true); - PROCESS_SWITCH(Lambdak0sflattenicity, processRecMCLambdaK0s, - "Process Run 3 mc, reconstructed", false); - PROCESS_SWITCH(Lambdak0sflattenicity, processGenMCLambdaK0s, - "Process Run 3 mc, generated", false); + PROCESS_SWITCH(Lambdak0sflattenicity, processDataRun3LambdaK0s, "Process Run 3 Data LambdaK0s", false); + PROCESS_SWITCH(Lambdak0sflattenicity, processRecMCLambdaK0s, "Process Run 3 MC reconstructed LambdaK0s", false); + PROCESS_SWITCH(Lambdak0sflattenicity, processGenMC, "Process Run 3 MC generated", false); + PROCESS_SWITCH(Lambdak0sflattenicity, processDataRun3Cascade, "Process Run 3 Data Cascade", true); + PROCESS_SWITCH(Lambdak0sflattenicity, processRecMCRun3Cascade, "Process Run 3 mc Rec Cascade", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From f64842e102077be227fa54403d50d4f62ff05f7e Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Sat, 22 Feb 2025 04:30:01 +0900 Subject: [PATCH 0370/1650] [PWGEM/Dilepton] update treeCreatorElectronMLDDA.cxx (#10126) --- PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx index 870dd58ed48..66221a1e2a3 100644 --- a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx +++ b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx @@ -778,7 +778,7 @@ struct MLTrackQC { }, }; - void process(aod::EMPrimaryTracks const& tracks) + void processQC(aod::EMPrimaryTracks const& tracks) { for (auto& track : tracks) { registry.fill(HIST("hTPCdEdx_P_All"), track.p(), track.tpcSignal()); @@ -811,6 +811,10 @@ struct MLTrackQC { } } // end of track loop } + PROCESS_SWITCH(MLTrackQC, processQC, "process QC for single track level", false); + + void processDummy(aod::EMPrimaryTracks const&) {} + PROCESS_SWITCH(MLTrackQC, processDummy, "process dummy", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 0be602b14d8ddd66adb475e7ed3d140967b763f2 Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Sat, 22 Feb 2025 03:55:15 +0800 Subject: [PATCH 0371/1650] [PWGCF] modify flowRunbyrun (#10132) --- PWGCF/Flow/Tasks/flowMc.cxx | 2 +- PWGCF/Flow/Tasks/flowPtEfficiency.cxx | 8 +- PWGCF/Flow/Tasks/flowRunbyRun.cxx | 121 +++++++++++++++++++++++--- 3 files changed, 114 insertions(+), 17 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowMc.cxx b/PWGCF/Flow/Tasks/flowMc.cxx index 79c9c6e2c3f..075e0af9cd2 100644 --- a/PWGCF/Flow/Tasks/flowMc.cxx +++ b/PWGCF/Flow/Tasks/flowMc.cxx @@ -223,7 +223,7 @@ struct FlowMc { fWeights->fill(mcParticle.phi(), mcParticle.eta(), vtxz, mcParticle.pt(), 0, 0); if (!setCurrentParticleWeights(weff, wacc, mcParticle.phi(), mcParticle.eta(), mcParticle.pt(), vtxz)) continue; - if (withinPtRef) { + if (validGlobal && withinPtRef) { histos.fill(HIST("hPhi"), mcParticle.phi()); histos.fill(HIST("hPhiWeighted"), mcParticle.phi(), wacc); histos.fill(HIST("hEPVsPhi"), evPhi, mcParticle.phi()); diff --git a/PWGCF/Flow/Tasks/flowPtEfficiency.cxx b/PWGCF/Flow/Tasks/flowPtEfficiency.cxx index ad5980c1746..f9b30d55d9a 100644 --- a/PWGCF/Flow/Tasks/flowPtEfficiency.cxx +++ b/PWGCF/Flow/Tasks/flowPtEfficiency.cxx @@ -159,6 +159,7 @@ struct FlowPtEfficiency { registry.add("hImpactParameterReco", "hImpactParameterReco", {HistType::kTH1D, {axisB}}); registry.add("hImpactParameterTruth", "hImpactParameterTruth", {HistType::kTH1D, {axisB}}); registry.add("hPhi", "#phi distribution", {HistType::kTH1D, {axisPhi}}); + registry.add("hPhiMCTruth", "#phi distribution", {HistType::kTH1D, {axisPhi}}); registry.add("hPhiWeighted", "corrected #phi distribution", {HistType::kTH1D, {axisPhi}}); o2::framework::AxisSpec axis = axisPt; @@ -189,7 +190,7 @@ struct FlowPtEfficiency { fGFWTrue->AddRegion("refP10", 0.5, 0.8, 1, 1); fGFWTrue->AddRegion("poiN10", -0.8, -0.5, 1 + fPtAxis->GetNbins(), 2); fGFWTrue->AddRegion("poifull", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 2); - fGFWTrue->AddRegion("olN10", -0.8, -0.5, 1, 4); + fGFWTrue->AddRegion("olN10", -0.8, -0.5, 1 + fPtAxis->GetNbins(), 4); fGFWTrue->AddRegion("olfull", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 4); corrconfigsTruth.push_back(fGFWTrue->GetCorrelatorConfig("full {2 -2}", "ChFull22", kFALSE)); corrconfigsTruth.push_back(fGFWTrue->GetCorrelatorConfig("poifull full | olfull {2 -2}", "ChFull22", kTRUE)); @@ -202,7 +203,7 @@ struct FlowPtEfficiency { fGFWReco->AddRegion("refP10", 0.5, 0.8, 1, 1); fGFWReco->AddRegion("poiN10", -0.8, -0.5, 1 + fPtAxis->GetNbins(), 2); fGFWReco->AddRegion("poifull", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 2); - fGFWReco->AddRegion("olN10", -0.8, -0.5, 1, 4); + fGFWReco->AddRegion("olN10", -0.8, -0.5, 1 + fPtAxis->GetNbins(), 4); fGFWReco->AddRegion("olfull", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 4); corrconfigsReco.push_back(fGFWReco->GetCorrelatorConfig("full {2 -2}", "ChFull22", kFALSE)); corrconfigsReco.push_back(fGFWReco->GetCorrelatorConfig("poifull full | olfull {2 -2}", "ChFull22", kTRUE)); @@ -470,6 +471,9 @@ struct FlowPtEfficiency { if (cfgFlowEnabled) { bool withinPtPOI = (cfgFlowCutPtPOIMin < mcParticle.pt()) && (mcParticle.pt() < cfgFlowCutPtPOIMax); // within POI pT range bool withinPtRef = (cfgFlowCutPtRefMin < mcParticle.pt()) && (mcParticle.pt() < cfgFlowCutPtRefMax); // within RF pT range + if (withinPtRef) { + registry.fill(HIST("hPhiMCTruth"), mcParticle.phi()); + } if (withinPtRef) fGFWTrue->Fill(mcParticle.eta(), fPtAxis->FindBin(mcParticle.pt()) - 1, mcParticle.phi(), wacc * weff, 1); if (withinPtPOI) diff --git a/PWGCF/Flow/Tasks/flowRunbyRun.cxx b/PWGCF/Flow/Tasks/flowRunbyRun.cxx index d9a80549077..ffcd91c483c 100644 --- a/PWGCF/Flow/Tasks/flowRunbyRun.cxx +++ b/PWGCF/Flow/Tasks/flowRunbyRun.cxx @@ -83,6 +83,8 @@ struct FlowRunbyRun { O2_DEFINE_CONFIGURABLE(cfgNbootstrap, int, 30, "Number of subsamples") O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeights, bool, false, "NUA weights are filled in ref pt bins") O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeightsRefPt, bool, false, "NUA weights are filled in ref pt bins") + O2_DEFINE_CONFIGURABLE(cfgEfficiency, std::string, "", "CCDB path to efficiency object") + O2_DEFINE_CONFIGURABLE(cfgAcceptanceList, std::string, "", "CCDB path to acceptance lsit object") O2_DEFINE_CONFIGURABLE(cfgDynamicRunNumber, bool, false, "Add runNumber during runtime") O2_DEFINE_CONFIGURABLE(cfgGetInteractionRate, bool, false, "Get interaction rate from CCDB") O2_DEFINE_CONFIGURABLE(cfgUseInteractionRateCut, bool, false, "Use events with low interaction rate") @@ -101,6 +103,12 @@ struct FlowRunbyRun { Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; Filter trackFilter = ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls) && (nabs(aod::track::dcaZ) < cfgCutDCAz); + // Corrections + TH1D* mEfficiency = nullptr; + GFWWeights* mAcceptance = nullptr; + TObjArray* mAcceptanceList = nullptr; + bool correctionsLoaded = false; + // Connect to ccdb Service ccdb; Configurable ccdbNoLaterThan{"ccdbNoLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; @@ -124,10 +132,12 @@ struct FlowRunbyRun { enum OutputTH1Names { // here are TProfiles for vn-pt correlations that are not implemented in GFW hPhi = 0, + hPhiWeighted, hEta, hVtxZ, hMult, hCent, + hEventCountSpecific, kCount_TH1Names }; enum OutputTH3Names { @@ -272,14 +282,77 @@ struct FlowRunbyRun { return; } + void loadCorrections(uint64_t timestamp, int runNumber) + { + if (correctionsLoaded) + return; + + if (cfgAcceptanceList.value.empty() == false) { + mAcceptanceList = ccdb->getForTimeStamp(cfgAcceptanceList, timestamp); + if (mAcceptanceList == nullptr) { + LOGF(fatal, "Could not load acceptance weights list from %s", cfgAcceptanceList.value.c_str()); + } + LOGF(info, "Loaded acceptance weights list from %s (%p)", cfgAcceptanceList.value.c_str(), (void*)mAcceptanceList); + + mAcceptance = static_cast(mAcceptanceList->FindObject(Form("%d", runNumber))); + if (mAcceptance == nullptr) { + LOGF(fatal, "Could not find acceptance weights for run %d in acceptance list", runNumber); + } + LOGF(info, "Loaded acceptance weights (%p) for run %d from list (%p)", (void*)mAcceptance, runNumber, (void*)mAcceptanceList); + } + if (cfgEfficiency.value.empty() == false) { + mEfficiency = ccdb->getForTimeStamp(cfgEfficiency, timestamp); + if (mEfficiency == nullptr) { + LOGF(fatal, "Could not load efficiency histogram for trigger particles from %s", cfgEfficiency.value.c_str()); + } + LOGF(info, "Loaded efficiency histogram from %s (%p)", cfgEfficiency.value.c_str(), (void*)mEfficiency); + } + correctionsLoaded = true; + } + + bool setCurrentParticleWeights(float& weight_nue, float& weight_nua, float phi, float eta, float pt, float vtxz) + { + float eff = 1.; + if (mEfficiency) + eff = mEfficiency->GetBinContent(mEfficiency->FindBin(pt)); + else + eff = 1.0; + if (eff == 0) + return false; + weight_nue = 1. / eff; + + if (mAcceptance) + weight_nua = mAcceptance->getNUA(phi, eta, vtxz); + else + weight_nua = 1; + return true; + } + + void initEventCount(std::shared_ptr hEventCountSpecific) + { + hEventCountSpecific->GetXaxis()->SetBinLabel(1, "after sel8"); + hEventCountSpecific->GetXaxis()->SetBinLabel(2, "kNoSameBunchPileup"); + hEventCountSpecific->GetXaxis()->SetBinLabel(3, "kIsGoodZvtxFT0vsPV"); + hEventCountSpecific->GetXaxis()->SetBinLabel(4, "kNoCollInTimeRangeStandard"); + hEventCountSpecific->GetXaxis()->SetBinLabel(5, "kIsGoodITSLayersAll"); + hEventCountSpecific->GetXaxis()->SetBinLabel(6, "kNoCollInRofStandard"); + hEventCountSpecific->GetXaxis()->SetBinLabel(7, "kNoHighMultCollInPrevRof"); + hEventCountSpecific->GetXaxis()->SetBinLabel(8, "occupancy"); + hEventCountSpecific->GetXaxis()->SetBinLabel(9, "MultCorrelation"); + hEventCountSpecific->GetXaxis()->SetBinLabel(10, "cfgEvSelV0AT0ACut"); + } + void createOutputObjectsForRun(int runNumber) { std::vector> histos(kCount_TH1Names); histos[hPhi] = registry.add(Form("%d/hPhi", runNumber), "", {HistType::kTH1D, {axisPhi}}); + histos[hPhiWeighted] = registry.add(Form("%d/hPhiWeighted", runNumber), "", {HistType::kTH1D, {axisPhi}}); histos[hEta] = registry.add(Form("%d/hEta", runNumber), "", {HistType::kTH1D, {axisEta}}); histos[hVtxZ] = registry.add(Form("%d/hVtxZ", runNumber), "", {HistType::kTH1D, {axisVertex}}); histos[hMult] = registry.add(Form("%d/hMult", runNumber), "", {HistType::kTH1D, {{3000, 0.5, 3000.5}}}); histos[hCent] = registry.add(Form("%d/hCent", runNumber), "", {HistType::kTH1D, {{90, 0, 90}}}); + histos[hEventCountSpecific] = registry.add(Form("%d/hEventCountSpecific", runNumber), "", {HistType::kTH1D, {{10, 0, 10}}}); + initEventCount(histos[hEventCountSpecific]); th1sList.insert(std::make_pair(runNumber, histos)); std::vector> profiles(kCount_TProfileNames); @@ -316,45 +389,54 @@ struct FlowRunbyRun { } template - bool eventSelected(TCollision collision, const int multTrk, const float centrality) + bool eventSelected(TCollision collision, const int multTrk, const float centrality, const int runNumber) { + th1sList[runNumber][hEventCountSpecific]->Fill(0.5); if (cfgEvSelkNoSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { // rejects collisions which are associated with the same "found-by-T0" bunch crossing // https://indico.cern.ch/event/1396220/#1-event-selection-with-its-rof return 0; } - + if (cfgEvSelkNoSameBunchPileup) + th1sList[runNumber][hEventCountSpecific]->Fill(1.5); if (cfgEvSelkIsGoodZvtxFT0vsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { // removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference // use this cut at low multiplicities with caution return 0; } - + if (cfgEvSelkIsGoodZvtxFT0vsPV) + th1sList[runNumber][hEventCountSpecific]->Fill(2.5); if (cfgEvSelkNoCollInTimeRangeStandard && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { // no collisions in specified time range return 0; } - + if (cfgEvSelkNoCollInTimeRangeStandard) + th1sList[runNumber][hEventCountSpecific]->Fill(3.5); if (cfgEvSelkIsGoodITSLayersAll && !collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { // from Jan 9 2025 AOT meeting // cut time intervals with dead ITS staves return 0; } - + if (cfgEvSelkIsGoodITSLayersAll) + th1sList[runNumber][hEventCountSpecific]->Fill(4.5); if (cfgEvSelkNoCollInRofStandard && !collision.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { // no other collisions in this Readout Frame with per-collision multiplicity above threshold return 0; } - + if (cfgEvSelkNoCollInRofStandard) + th1sList[runNumber][hEventCountSpecific]->Fill(5.5); if (cfgEvSelkNoHighMultCollInPrevRof && !collision.selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof)) { // veto an event if FT0C amplitude in previous ITS ROF is above threshold return 0; } - + if (cfgEvSelkNoHighMultCollInPrevRof) + th1sList[runNumber][hEventCountSpecific]->Fill(6.5); auto multNTracksPV = collision.multNTracksPV(); auto occupancy = collision.trackOccupancyInTimeRange(); if (cfgEvSelOccupancy && (occupancy < cfgCutOccupancyLow || occupancy > cfgCutOccupancyHigh)) return 0; + if (cfgEvSelOccupancy) + th1sList[runNumber][hEventCountSpecific]->Fill(7.5); if (cfgEvSelMultCorrelation) { if (multNTracksPV < fMultPVCutLow->Eval(centrality)) @@ -366,10 +448,14 @@ struct FlowRunbyRun { if (multTrk > fMultCutHigh->Eval(centrality)) return 0; } + if (cfgEvSelMultCorrelation) + th1sList[runNumber][hEventCountSpecific]->Fill(8.5); // V0A T0A 5 sigma cut if (cfgEvSelV0AT0ACut && (std::fabs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > 5 * fT0AV0ASigma->Eval(collision.multFT0A()))) return 0; + if (cfgEvSelV0AT0ACut) + th1sList[runNumber][hEventCountSpecific]->Fill(9.5); return 1; } @@ -392,7 +478,8 @@ struct FlowRunbyRun { // detect run number auto bc = collision.bc_as(); const auto cent = collision.centFT0C(); - if (cfgUseAdditionalEventCut && !eventSelected(collision, tracks.size(), cent)) + int runNumber = bc.runNumber(); + if (cfgUseAdditionalEventCut && !eventSelected(collision, tracks.size(), cent, runNumber)) return; if (cfgGetInteractionRate) { initHadronicRate(bc); @@ -402,7 +489,6 @@ struct FlowRunbyRun { return; gCurrentHadronicRate->Fill(seconds, hadronicRate); } - int runNumber = bc.runNumber(); float lRandom = fRndm->Rndm(); if (runNumber != lastRunNumer) { lastRunNumer = runNumber; @@ -422,18 +508,15 @@ struct FlowRunbyRun { th1sList[runNumber][hMult]->Fill(tracks.size()); th1sList[runNumber][hCent]->Fill(collision.centFT0C()); + loadCorrections(bc.timestamp(), runNumber); + fGFW->Clear(); float weff = 1, wacc = 1; for (const auto& track : tracks) { if (!trackSelected(track)) continue; - th1sList[runNumber][hPhi]->Fill(track.phi()); - th1sList[runNumber][hEta]->Fill(track.eta()); // bool WithinPtPOI = (cfgCutPtPOIMin < track.pt()) && (track.pt() < cfgCutPtPOIMax); // within POI pT range bool withinPtRef = (cfgCutPtRefMin < track.pt()) && (track.pt() < cfgCutPtRefMax); // within RF pT range - if (withinPtRef) { - fGFW->Fill(track.eta(), 1, track.phi(), wacc * weff, 1); - } if (cfgOutputNUAWeights) { if (cfgOutputNUAWeightsRefPt) { if (withinPtRef) { @@ -443,6 +526,16 @@ struct FlowRunbyRun { th3sList[runNumber][hPhiEtaVtxz]->Fill(track.phi(), track.eta(), collision.posZ()); } } + if (!setCurrentParticleWeights(weff, wacc, track.phi(), track.eta(), track.pt(), collision.posZ())) + continue; + if (withinPtRef) { + th1sList[runNumber][hPhi]->Fill(track.phi()); + th1sList[runNumber][hPhiWeighted]->Fill(track.phi(), wacc); + th1sList[runNumber][hEta]->Fill(track.eta()); + } + if (withinPtRef) { + fGFW->Fill(track.eta(), 1, track.phi(), wacc * weff, 1); + } } // Filling TProfile From ca0ae4645be28cf05d765f6e7c43504e1434341f Mon Sep 17 00:00:00 2001 From: yuanzhe <90246048+wang-yuanzhe@users.noreply.github.com> Date: Fri, 21 Feb 2025 21:47:43 +0100 Subject: [PATCH 0372/1650] [PWGLF] Fix Zorro initialization and extended table (#10137) Co-authored-by: Carolina Reetz --- PWGLF/DataModel/Reduced3BodyTables.h | 46 +++++++++---------- .../Nuspex/reduced3bodyCreator.cxx | 37 +++++++++++---- 2 files changed, 52 insertions(+), 31 deletions(-) diff --git a/PWGLF/DataModel/Reduced3BodyTables.h b/PWGLF/DataModel/Reduced3BodyTables.h index 52079537c75..42e87439f38 100644 --- a/PWGLF/DataModel/Reduced3BodyTables.h +++ b/PWGLF/DataModel/Reduced3BodyTables.h @@ -226,29 +226,29 @@ DECLARE_SOA_TABLE_FULL(StoredRedIUTracks, "RedIUTracks", "AOD", "REDIUTRACK", // reducedtracks3body::ITSClsSizeInLayer, reducedtracks3body::TPCCrossedRowsOverFindableCls); -DECLARE_SOA_EXTENDED_TABLE(RedIUTracks, StoredRedIUTracks, "EXREDIUTRACK", 0, //! Track parameters at inner most update (e.g. ITS) as it comes from the tracking - reducedtracks3body::Pt, - reducedtracks3body::P, - reducedtracks3body::Eta, - reducedtracks3body::Phi, - // cov matrix - reducedtracks3body::CYY, - reducedtracks3body::CZY, - reducedtracks3body::CZZ, - reducedtracks3body::CSnpY, - reducedtracks3body::CSnpZ, - reducedtracks3body::CSnpSnp, - reducedtracks3body::CTglY, - reducedtracks3body::CTglZ, - reducedtracks3body::CTglSnp, - reducedtracks3body::CTglTgl, - reducedtracks3body::C1PtY, - reducedtracks3body::C1PtZ, - reducedtracks3body::C1PtSnp, - reducedtracks3body::C1PtTgl, - reducedtracks3body::C1Pt21Pt2, - // tracks extra - reducedtracks3body::DetectorMap); +DECLARE_SOA_EXTENDED_TABLE_USER(RedIUTracks, StoredRedIUTracks, "REDIUTRACKEXT", //! Track parameters at inner most update (e.g. ITS) as it comes from the tracking + reducedtracks3body::Pt, + reducedtracks3body::P, + reducedtracks3body::Eta, + reducedtracks3body::Phi, + // cov matrix + reducedtracks3body::CYY, + reducedtracks3body::CZY, + reducedtracks3body::CZZ, + reducedtracks3body::CSnpY, + reducedtracks3body::CSnpZ, + reducedtracks3body::CSnpSnp, + reducedtracks3body::CTglY, + reducedtracks3body::CTglZ, + reducedtracks3body::CTglSnp, + reducedtracks3body::CTglTgl, + reducedtracks3body::C1PtY, + reducedtracks3body::C1PtZ, + reducedtracks3body::C1PtSnp, + reducedtracks3body::C1PtTgl, + reducedtracks3body::C1Pt21Pt2, + // tracks extra + reducedtracks3body::DetectorMap); namespace reduceddecay3body { diff --git a/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx b/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx index 1955955520a..f9202c33e69 100644 --- a/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx +++ b/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx @@ -9,6 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +/// \file reduced3bodyCreator.cxx /// \brief Task to produce reduced AO2Ds for use in the hypertriton 3body reconstruction with the decay3bodybuilder.cxx /// \author Yuanzhe Wang /// \author Carolina Reetz @@ -86,6 +87,8 @@ struct reduced3bodyCreator { Configurable fatalOnPassNotAvailable{"fatalOnPassNotAvailable", true, "Flag to throw a fatal if the pass is not available in the retrieved CCDB object"}; // Zorro counting Configurable cfgSkimmedProcessing{"cfgSkimmedProcessing", false, "Skimmed dataset processing"}; + // Flag for trigger + Configurable cfgOnlyKeepH3L3Body{"cfgOnlyKeepH3L3Body", false, "Flag to keep only H3L3Body trigger"}; int mRunNumber; o2::pid::tof::TOFResoParamsV2 mRespParamsV2; @@ -117,18 +120,21 @@ struct reduced3bodyCreator { hEventCounterZorro->GetXaxis()->SetBinLabel(2, "Zorro after evsel"); } + void initZorroBC(aod::BCsWithTimestamps::iterator const& bc) + { + if (cfgSkimmedProcessing) { + zorro.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), "fH3L3Body"); + zorro.populateHistRegistry(registry, bc.runNumber()); + } + } + void initCCDB(aod::BCsWithTimestamps::iterator const& bc) { // In case override, don't proceed, please - no CCDB access required if (mRunNumber == bc.runNumber()) { return; } - mRunNumber = bc.runNumber(); - if (cfgSkimmedProcessing) { - zorro.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), "fH3L3Body"); - zorro.populateHistRegistry(registry, bc.runNumber()); - } // Initial TOF PID Paras, copied from PIDTOF.h timestamp.value = bc.timestamp(); @@ -217,14 +223,20 @@ struct reduced3bodyCreator { void process(ColwithEvTimesMultsCents const& collisions, TrackExtPIDIUwithEvTimes const&, aod::Decay3Bodys const& decay3bodys, aod::BCsWithTimestamps const&) { - int lastCollisionID = -1; // collisionId of last analysed decay3body. Table is sorted. - + int lastRunNumber = -1; // RunNumber of last collision, used for zorro counting // Event counting for (const auto& collision : collisions) { + + auto bc = collision.bc_as(); + if (bc.runNumber() != lastRunNumber) { + initZorroBC(bc); + lastRunNumber = bc.runNumber(); // Update the last run number + } + // Zorro event counting bool isZorroSelected = false; if (cfgSkimmedProcessing) { - isZorroSelected = zorro.isSelected(collision.bc_as().globalBC()); + isZorroSelected = zorro.isSelected(bc.globalBC()); if (isZorroSelected) { registry.fill(HIST("hEventCounterZorro"), 0.5); } @@ -247,6 +259,8 @@ struct reduced3bodyCreator { } } + int lastCollisionID = -1; // collisionId of last analysed decay3body. Table is sorted. + // Creat reduced table for (const auto& d3body : decay3bodys) { @@ -263,6 +277,13 @@ struct reduced3bodyCreator { auto bc = collision.bc_as(); initCCDB(bc); + bool isZorroSelected = false; + if (cfgSkimmedProcessing && cfgOnlyKeepH3L3Body) { + isZorroSelected = zorro.isSelected(bc.globalBC()); + if (!isZorroSelected) { + continue; + } + } // Save the collision if (collision.globalIndex() != lastCollisionID) { From 2ad2ffabdd59e045cb00af7626cbf2bfe44b7f1f Mon Sep 17 00:00:00 2001 From: Gianni Shigeru Setoue Liveraro <81832939+gianniliveraro@users.noreply.github.com> Date: Fri, 21 Feb 2025 18:59:59 -0300 Subject: [PATCH 0373/1650] [PWGLF] Modifications in Sigma0 tasks (#10138) Co-authored-by: ALICE Action Bot --- .../Strangeness/sigma0builder.cxx | 22 +- PWGLF/Tasks/Strangeness/sigmaanalysis.cxx | 633 +++++++++++++----- 2 files changed, 481 insertions(+), 174 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/sigma0builder.cxx b/PWGLF/TableProducer/Strangeness/sigma0builder.cxx index f3c391aaba7..8dfb0cfed27 100644 --- a/PWGLF/TableProducer/Strangeness/sigma0builder.cxx +++ b/PWGLF/TableProducer/Strangeness/sigma0builder.cxx @@ -148,7 +148,8 @@ struct sigma0builder { // base properties ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.2f, 2.4f, 2.6f, 2.8f, 3.0f, 3.2f, 3.4f, 3.6f, 3.8f, 4.0f, 4.4f, 4.8f, 5.2f, 5.6f, 6.0f, 6.5f, 7.0f, 7.5f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 17.0f, 19.0f, 21.0f, 23.0f, 25.0f, 30.0f, 35.0f, 40.0f, 50.0f}, "pt axis for analysis"}; ConfigurableAxis axisCentrality{"axisCentrality", {VARIABLE_WIDTH, 0.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f, 110.0f}, "Centrality"}; - ConfigurableAxis axisDeltaPt{"axisDeltaPt", {100, -1.0, +1.0}, "#Delta(p_{T})"}; + ConfigurableAxis axisInvPt{"axisInvPt", {VARIABLE_WIDTH, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 2.0, 5.0, 10.0, 20.0, 50.0}, ""}; + ConfigurableAxis axisDeltaPt{"axisDeltaPt", {200, -500.0, 500.0}, ""}; // Invariant Mass ConfigurableAxis axisSigmaMass{"axisSigmaMass", {1000, 1.10f, 1.30f}, "M_{#Sigma^{0}} (GeV/c^{2})"}; @@ -243,6 +244,7 @@ struct sigma0builder { histos.add("GeneralQA/h2dMassGammaVsLambdaAfterMassSel", "h2dMassGammaVsLambdaAfterMassSel", kTH2D, {axisPhotonMass, axisLambdaMass}); histos.add("GeneralQA/h2dPtVsMassPi0BeforeSel_Candidates", "h2dPtVsMassPi0BeforeSel_Candidates", kTH2D, {axisPt, {500, 0.08f, 0.18f}}); histos.add("GeneralQA/h2dPtVsMassPi0AfterSel_Candidates", "h2dPtVsMassPi0AfterSel_Candidates", kTH2D, {axisPt, {500, 0.08f, 0.18f}}); + histos.add("GeneralQA/h3dV0XYZ", "h3dV0XYZ", kTH3F, {{400, -200, 200}, {400, -200, 200}, {240, -120.0f, 120.0f}}); // MC histos.add("MC/h2dPtVsCentrality_GammaBeforeSel", "h2dPtVsCentrality_GammaBeforeSel", kTH2D, {axisCentrality, axisPt}); @@ -256,14 +258,15 @@ struct sigma0builder { histos.add("MC/h2dPtVsCentrality_GammaAntiSigma0", "h2dPtVsCentrality_GammaAntiSigma0", kTH2D, {axisCentrality, axisPt}); histos.add("MC/h2dPtVsCentrality_LambdaAntiSigma0", "h2dPtVsCentrality_LambdaAntiSigma0", kTH2D, {axisCentrality, axisPt}); histos.add("MC/h2dPtVsCentrality_AntiSigma0AfterSel", "h2dPtVsCentrality_AntiSigma0AfterSel", kTH2D, {axisCentrality, axisPt}); + histos.add("MC/h3dGammasXYZ", "h3dGammasXYZ", kTH3F, {{400, -200, 200}, {400, -200, 200}, {240, -120.0f, 120.0f}}); // Sigma vs Daughters pT histos.add("MC/h2dSigmaPtVsLambdaPt", "h2dSigmaPtVsLambdaPt", kTH2D, {axisPt, axisPt}); histos.add("MC/h2dSigmaPtVsGammaPt", "h2dSigmaPtVsGammaPt", kTH2D, {axisPt, axisPt}); // pT Resolution: - histos.add("MC/h2dLambdaPtResolution", "h2dLambdaPtResolution", kTH2D, {axisPt, axisDeltaPt}); - histos.add("MC/h2dGammaPtResolution", "h2dGammaPtResolution", kTH2D, {axisPt, axisDeltaPt}); + histos.add("MC/h2dLambdaPtResolution", "h2dLambdaPtResolution", kTH2D, {axisInvPt, axisDeltaPt}); + histos.add("MC/h2dGammaPtResolution", "h2dGammaPtResolution", kTH2D, {axisInvPt, axisDeltaPt}); // For background decomposition histos.add("MC/h2dPtVsMassSigma_All", "h2dPtVsMassSigma_All", kTH2D, {axisPt, axisSigmaMass}); @@ -546,7 +549,7 @@ struct sigma0builder { histos.fill(HIST("hCandidateBuilderSelection"), 6.); histos.fill(HIST("Selection/hLambdaMass"), lambda.mLambda()); histos.fill(HIST("Selection/hAntiLambdaMass"), lambda.mAntiLambda()); - if ((TMath::Abs(lambda.mLambda() - 1.115683) > LambdaWindow) && (TMath::Abs(lambda.mAntiLambda() - 1.115683) > LambdaWindow)) + if ((TMath::Abs(lambda.mLambda() - o2::constants::physics::MassLambda0) > LambdaWindow) && (TMath::Abs(lambda.mAntiLambda() - o2::constants::physics::MassLambda0) > LambdaWindow)) return false; histos.fill(HIST("Selection/hLambdaNegEta"), lambda.negativeeta()); histos.fill(HIST("Selection/hLambdaPosEta"), lambda.positiveeta()); @@ -625,6 +628,7 @@ struct sigma0builder { return false; histos.fill(HIST("hCandidateBuilderSelection"), 13.); + histos.fill(HIST("GeneralQA/h3dV0XYZ"), gamma.x(), gamma.y(), gamma.z()); return true; } @@ -778,11 +782,13 @@ struct sigma0builder { // Auxiliary histograms: if (gammaMC.pdgCode() == 22) { + histos.fill(HIST("MC/h3dGammasXYZ"), gamma.x(), gamma.y(), gamma.z()); float GammaY = TMath::Abs(RecoDecay::y(std::array{gamma.px(), gamma.py(), gamma.pz()}, o2::constants::physics::MassGamma)); - + float gammaMCpT = RecoDecay::pt(array{gammaMC.pxMC(), gammaMC.pyMC()}); if (GammaY < 0.5) { // rapidity selection histos.fill(HIST("MC/h2dPtVsCentrality_GammaBeforeSel"), centrality, gamma.pt()); // isgamma - histos.fill(HIST("MC/h2dGammaPtResolution"), gamma.pt(), gamma.pt() - RecoDecay::pt(array{gammaMC.pxMC(), gammaMC.pyMC()})); // pT resolution + if (gammaMCpT > 0) + histos.fill(HIST("MC/h2dGammaPtResolution"), 1.f / gammaMCpT, gamma.pt() - gammaMCpT); // pT resolution if (gammaMC.pdgCodeMother() == 3212) { histos.fill(HIST("MC/h2dPtVsCentrality_GammaSigma0"), centrality, gamma.pt()); // isgamma from sigma @@ -794,9 +800,11 @@ struct sigma0builder { } if (gammaMC.pdgCode() == 3122) { // Is Lambda float LambdaY = TMath::Abs(RecoDecay::y(std::array{gamma.px(), gamma.py(), gamma.pz()}, o2::constants::physics::MassLambda)); + float lambdaMCpT = RecoDecay::pt(array{gammaMC.pxMC(), gammaMC.pyMC()}); if (LambdaY < 0.5) { // rapidity selection histos.fill(HIST("MC/h2dPtVsCentrality_LambdaBeforeSel"), centrality, gamma.pt()); - histos.fill(HIST("MC/h2dLambdaPtResolution"), gamma.pt(), gamma.pt() - RecoDecay::pt(array{gammaMC.pxMC(), gammaMC.pyMC()})); // pT resolution + if (lambdaMCpT > 0) + histos.fill(HIST("MC/h2dLambdaPtResolution"), 1.f / lambdaMCpT, gamma.pt() - lambdaMCpT); // pT resolution if (gammaMC.pdgCodeMother() == 3212) { histos.fill(HIST("MC/h2dPtVsCentrality_LambdaSigma0"), centrality, gamma.pt()); } diff --git a/PWGLF/Tasks/Strangeness/sigmaanalysis.cxx b/PWGLF/Tasks/Strangeness/sigmaanalysis.cxx index 22205f54ce8..f2e04920d50 100644 --- a/PWGLF/Tasks/Strangeness/sigmaanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/sigmaanalysis.cxx @@ -64,17 +64,45 @@ struct sigmaanalysis { HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; // Interaction rate selection: + // Event selection + Configurable doPPAnalysis{"doPPAnalysis", true, "if in pp, set to true"}; Configurable fGetIR{"fGetIR", false, "Flag to retrieve the IR info."}; Configurable irSource{"irSource", "T0VTX", "Estimator of the interaction rate (Recommended: pp --> T0VTX, Pb-Pb --> ZNC hadronic)"}; Configurable minIR{"minIR", -1, "Min Interaction Rate (kHz). Leave -1 if no selection desired."}; Configurable maxIR{"maxIR", -1, "Max Interaction Rate (kHz). Leave -1 if no selection desired."}; + struct : ConfigurableGroup { + Configurable requireSel8{"requireSel8", true, "require sel8 event selection"}; + Configurable requireTriggerTVX{"requireTriggerTVX", true, "require FT0 vertex (acceptable FT0C-FT0A time difference) at trigger level"}; + Configurable rejectITSROFBorder{"rejectITSROFBorder", true, "reject events at ITS ROF border"}; + Configurable rejectTFBorder{"rejectTFBorder", true, "reject events at TF border"}; + Configurable requireIsVertexITSTPC{"requireIsVertexITSTPC", true, "require events with at least one ITS-TPC track"}; + Configurable requireIsGoodZvtxFT0VsPV{"requireIsGoodZvtxFT0VsPV", true, "require events with PV position along z consistent (within 1 cm) between PV reconstructed using tracks and PV using FT0 A-C time difference"}; + Configurable requireIsVertexTOFmatched{"requireIsVertexTOFmatched", false, "require events with at least one of vertex contributors matched to TOF"}; + Configurable requireIsVertexTRDmatched{"requireIsVertexTRDmatched", false, "require events with at least one of vertex contributors matched to TRD"}; + Configurable rejectSameBunchPileup{"rejectSameBunchPileup", false, "reject collisions in case of pileup with another collision in the same foundBC"}; + Configurable requireNoCollInTimeRangeStd{"requireNoCollInTimeRangeStd", false, "reject collisions corrupted by the cannibalism, with other collisions within +/- 2 microseconds or mult above a certain threshold in -4 - -2 microseconds"}; + Configurable requireNoCollInTimeRangeStrict{"requireNoCollInTimeRangeStrict", false, "reject collisions corrupted by the cannibalism, with other collisions within +/- 10 microseconds"}; + Configurable requireNoCollInTimeRangeNarrow{"requireNoCollInTimeRangeNarrow", false, "reject collisions corrupted by the cannibalism, with other collisions within +/- 2 microseconds"}; + Configurable requireNoCollInTimeRangeVzDep{"requireNoCollInTimeRangeVzDep", false, "reject collisions corrupted by the cannibalism, with other collisions with pvZ of drifting TPC tracks from past/future collisions within 2.5 cm the current pvZ"}; + Configurable requireNoCollInROFStd{"requireNoCollInROFStd", false, "reject collisions corrupted by the cannibalism, with other collisions within the same ITS ROF with mult. above a certain threshold"}; + Configurable requireNoCollInROFStrict{"requireNoCollInROFStrict", false, "reject collisions corrupted by the cannibalism, with other collisions within the same ITS ROF"}; + Configurable requireINEL0{"requireINEL0", false, "require INEL>0 event selection"}; + Configurable requireINEL1{"requireINEL1", false, "require INEL>1 event selection"}; + Configurable maxZVtxPosition{"maxZVtxPosition", 10., "max Z vtx position"}; + Configurable useFT0CbasedOccupancy{"useFT0CbasedOccupancy", false, "Use sum of FT0-C amplitudes for estimating occupancy? (if not, use track-based definition)"}; + // fast check on occupancy + Configurable minOccupancy{"minOccupancy", -1, "minimum occupancy from neighbouring collisions"}; + Configurable maxOccupancy{"maxOccupancy", -1, "maximum occupancy from neighbouring collisions"}; + } eventSelections; + // Analysis strategy: Configurable fUseMLSel{"fUseMLSel", false, "Flag to use ML selection. If False, the standard selection is applied."}; Configurable fProcessMonteCarlo{"fProcessMonteCarlo", false, "Flag to process MC data."}; Configurable fselLambdaTPCPID{"fselLambdaTPCPID", true, "Flag to select lambda-like candidates using TPC NSigma."}; Configurable fselLambdaTOFPID{"fselLambdaTOFPID", false, "Flag to select lambda-like candidates using TOF NSigma."}; Configurable doMCAssociation{"doMCAssociation", false, "Flag to process only signal candidates. Use only with processMonteCarlo!"}; + Configurable doPhotonLambdaSelQA{"doPhotonLambdaSelQA", false, "Flag to fill photon and lambda QA histos!"}; // For ML Selection Configurable Gamma_MLThreshold{"Gamma_MLThreshold", 0.1, "Decision Threshold value to select gammas"}; @@ -130,6 +158,10 @@ struct sigmaanalysis { Configurable PhotonPsiPairMax{"PhotonPsiPairMax", 1e+9, "maximum psi angle of the track pair"}; Configurable PhotonMaxDauEta{"PhotonMaxDauEta", 0.8, "Max pseudorapidity of daughter tracks"}; Configurable PhotonLineCutZ0{"PhotonLineCutZ0", 7.0, "The offset for the linecute used in the Z vs R plot"}; + Configurable PhotonPhiMin1{"PhotonPhiMin1", -1, "Phi min value for photons, region 1 (leave negative if no selection desired)"}; + Configurable PhotonPhiMax1{"PhotonPhiMax1", -1, "Phi max value for photons, region 1 (leave negative if no selection desired)"}; + Configurable PhotonPhiMin2{"PhotonPhiMin2", -1, "Phi max value for photons, region 2 (leave negative if no selection desired)"}; + Configurable PhotonPhiMax2{"PhotonPhiMax2", -1, "Phi min value for photons, region 2 (leave negative if no selection desired)"}; Configurable SigmaMaxRap{"SigmaMaxRap", 0.5, "Max sigma0 rapidity"}; @@ -137,7 +169,8 @@ struct sigmaanalysis { // base properties ConfigurableAxis axisCentrality{"axisCentrality", {VARIABLE_WIDTH, 0.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f, 110.0f}, "Centrality"}; ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.2f, 2.4f, 2.6f, 2.8f, 3.0f, 3.2f, 3.4f, 3.6f, 3.8f, 4.0f, 4.4f, 4.8f, 5.2f, 5.6f, 6.0f, 6.5f, 7.0f, 7.5f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 17.0f, 19.0f, 21.0f, 23.0f, 25.0f, 30.0f, 35.0f, 40.0f, 50.0f}, "p_{T} (GeV/c)"}; - ConfigurableAxis axisDeltaPt{"axisDeltaPt", {100, 0.0, +1.0}, "#Delta(p_{T})"}; + ConfigurableAxis axisInvPt{"axisInvPt", {VARIABLE_WIDTH, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 2.0, 5.0, 10.0, 20.0, 50.0}, ""}; + ConfigurableAxis axisDeltaPt{"axisDeltaPt", {400, -50.0, 50.0}, ""}; ConfigurableAxis axisRapidity{"axisRapidity", {100, -2.0f, 2.0f}, "Rapidity"}; ConfigurableAxis axisIRBinning{"axisIRBinning", {5000, 0, 1500}, "Binning for the interaction rate (kHz)"}; @@ -164,7 +197,7 @@ struct sigmaanalysis { ConfigurableAxis axisDCAdau{"axisDCAdau", {50, 0.0f, 5.0f}, "DCA (cm)"}; ConfigurableAxis axisCosPA{"axisCosPA", {200, 0.5f, 1.0f}, "Cosine of pointing angle"}; ConfigurableAxis axisPsiPair{"axisPsiPair", {500, -5.0f, 5.0f}, "Psipair for photons"}; - ConfigurableAxis axisCandSel{"axisCandSel", {31, 0.5f, +31.5f}, "Candidate Selection"}; + ConfigurableAxis axisCandSel{"axisCandSel", {32, 0.5f, +32.5f}, "Candidate Selection"}; // ML ConfigurableAxis MLProb{"MLOutput", {100, 0.0f, 1.0f}, ""}; @@ -176,9 +209,37 @@ struct sigmaanalysis { ccdb->setCaching(true); ccdb->setFatalWhenNull(false); + // Event Counters + histos.add("hEventSelection", "hEventSelection", kTH1F, {{20, -0.5f, +18.5f}}); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(1, "All collisions"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(2, "sel8 cut"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(3, "kIsTriggerTVX"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(4, "kNoITSROFrameBorder"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(5, "kNoTimeFrameBorder"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(6, "posZ cut"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(7, "kIsVertexITSTPC"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(8, "kIsGoodZvtxFT0vsPV"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(9, "kIsVertexTOFmatched"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(10, "kIsVertexTRDmatched"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(11, "kNoSameBunchPileup"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(12, "kNoCollInTimeRangeStd"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(13, "kNoCollInTimeRangeStrict"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(14, "kNoCollInTimeRangeNarrow"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(15, "kNoCollInRofStd"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(16, "kNoCollInRofStrict"); + if (doPPAnalysis) { + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(17, "INEL>0"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(18, "INEL>1"); + } else { + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(17, "Below min occup."); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(18, "Above max occup."); + } + // All candidates received histos.add("GeneralQA/hInteractionRate", "hInteractionRate", kTH1F, {axisIRBinning}); + histos.add("GeneralQA/hInteractionRatePerColl", "hInteractionRatePerColl", kTH1F, {axisIRBinning}); histos.add("GeneralQA/hCentralityVsInteractionRate", "hCentralityVsInteractionRate", kTH2F, {axisCentrality, axisIRBinning}); + histos.add("GeneralQA/hCentralityVsInteractionRatePerColl", "hCentralityVsInteractionRatePerColl", kTH2F, {axisCentrality, axisIRBinning}); histos.add("GeneralQA/h2dArmenterosBeforeSel", "h2dArmenterosBeforeSel", {HistType::kTH2F, {axisAPAlpha, axisAPQt}}); histos.add("GeneralQA/h2dArmenterosAfterSel", "h2dArmenterosAfterSel", {HistType::kTH2F, {axisAPAlpha, axisAPQt}}); histos.add("GeneralQA/hMassSigma0BeforeSel", "hMassSigma0BeforeSel", kTH1F, {axisSigmaMass}); @@ -187,38 +248,38 @@ struct sigmaanalysis { histos.add("GeneralQA/hCandidateAnalysisSelection", "hCandidateAnalysisSelection", kTH1F, {axisCandSel}); histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(1, "No Sel"); histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(2, "Photon V0Type"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(3, "Photon Mass"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(4, "Photon DauPt"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(5, "Photon DCAToPV"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(6, "Photon DCADau"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(7, "Photon TPCCrossedRows"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(8, "Photon TPCNSigmaEl"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(9, "Photon TPCNSigmaPi"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(10, "Photon Pt"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(11, "Photon Y/Eta"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(12, "Photon Radius"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(13, "Photon RZ line"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(14, "Photon QT"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(15, "Photon Alpha"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(16, "Photon CosPA"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(17, "Photon PsiPair"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(18, "Lambda Radius"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(19, "Lambda DCADau"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(20, "Lambda QT"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(21, "Lambda Alpha"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(22, "Lambda CosPA"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(23, "Lambda Y/Eta"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(24, "Lambda TPCCrossedRows"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(25, "Lambda ITSNCls"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(26, "Lambda Lifetime"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(27, "Lambda/ALambda PID"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(28, "Lambda/ALambda DCAToPV"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(29, "Lambda/ALambda Mass"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(30, "Sigma Y"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(3, "Photon DauPt"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(4, "Photon DCAToPV"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(5, "Photon DCADau"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(6, "Photon TPCCrossedRows"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(7, "Photon TPCNSigmaEl"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(8, "Photon TPCNSigmaPi"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(9, "Photon Pt"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(10, "Photon Y/Eta"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(11, "Photon Radius"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(12, "Photon RZ line"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(13, "Photon QT"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(14, "Photon Alpha"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(15, "Photon CosPA"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(16, "Photon PsiPair"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(17, "Photon Phi"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(18, "Photon Mass"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(19, "Lambda Radius"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(20, "Lambda DCADau"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(21, "Lambda QT"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(22, "Lambda Alpha"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(23, "Lambda CosPA"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(24, "Lambda Y/Eta"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(25, "Lambda TPCCrossedRows"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(26, "Lambda ITSNCls"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(27, "Lambda Lifetime"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(28, "Lambda/ALambda PID"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(29, "Lambda/ALambda DCAToPV"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(30, "Lambda/ALambda Mass"); + histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(31, "Sigma Y"); // Photon Selection QA histos histos.add("GeneralQA/hPhotonV0Type", "hPhotonV0Type", kTH1F, {{8, 0.5f, 8.5f}}); - histos.add("GeneralQA/hPhotonMass", "hPhotonMass", kTH1F, {axisPhotonMass}); histos.add("GeneralQA/hPhotonNegpT", "hPhotonNegpT", kTH1F, {axisPt}); histos.add("GeneralQA/hPhotonPospT", "hPhotonPospT", kTH1F, {axisPt}); histos.add("GeneralQA/hPhotonDCANegToPV", "hPhotonDCANegToPV", kTH1F, {axisDCAtoPV}); @@ -238,10 +299,11 @@ struct sigmaanalysis { histos.add("GeneralQA/hPhotonZ", "hPhotonZ", kTH1F, {{240, 0.0f, 120.0f}}); histos.add("GeneralQA/h2dRZCut", "h2dRZCut", {HistType::kTH2F, {{240, -120.0f, 120.0f}, axisRadius}}); histos.add("GeneralQA/h2dRZPlane", "h2dRZPlane", {HistType::kTH2F, {{240, -120.0f, 120.0f}, axisRadius}}); - histos.add("GeneralQA/h2dPhotonArmenteros", "h2dPhotonArmenteros", {HistType::kTH2F, {axisAPAlpha, axisAPQt}}); histos.add("GeneralQA/hPhotonCosPA", "hPhotonCosPA", kTH1F, {axisCosPA}); histos.add("GeneralQA/hPhotonPsiPair", "hPhotonPsiPair", kTH1F, {axisPsiPair}); + histos.add("GeneralQA/hPhotonPhi", "hPhotonPhi", kTH1F, {{200, 0, 2 * o2::constants::math::PI}}); + histos.add("GeneralQA/h3dPhotonMass", "h3dPhotonMass", kTH3F, {axisCentrality, axisPt, axisPhotonMass}); // Lambda Selection QA histos histos.add("GeneralQA/hLambdaRadius", "hLambdaRadius", kTH1F, {axisRadius}); @@ -263,12 +325,12 @@ struct sigmaanalysis { histos.add("GeneralQA/h2dTPCvsTOFNSigma_LambdaPi", "h2dTPCvsTOFNSigma_LambdaPi", {HistType::kTH2F, {axisTPCNSigma, axisTOFNSigma}}); histos.add("GeneralQA/hLambdaDCANegToPV", "hLambdaDCANegToPV", kTH1F, {axisDCAtoPV}); histos.add("GeneralQA/hLambdaDCAPosToPV", "hLambdaDCAPosToPV", kTH1F, {axisDCAtoPV}); - histos.add("GeneralQA/hLambdaMass", "hLambdaMass", kTH1F, {axisLambdaMass}); + histos.add("GeneralQA/h3dLambdaMass", "h3dLambdaMass", kTH3F, {axisCentrality, axisPt, axisLambdaMass}); histos.add("GeneralQA/h2dTPCvsTOFNSigma_ALambdaPr", "h2dTPCvsTOFNSigma_ALambdaPr", {HistType::kTH2F, {axisTPCNSigma, axisTOFNSigma}}); histos.add("GeneralQA/h2dTPCvsTOFNSigma_ALambdaPi", "h2dTPCvsTOFNSigma_ALambdaPi", {HistType::kTH2F, {axisTPCNSigma, axisTOFNSigma}}); histos.add("GeneralQA/hALambdaDCANegToPV", "hALambdaDCANegToPV", kTH1F, {axisDCAtoPV}); histos.add("GeneralQA/hALambdaDCAPosToPV", "hALambdaDCAPosToPV", kTH1F, {axisDCAtoPV}); - histos.add("GeneralQA/hAntiLambdaMass", "hAntiLambdaMass", kTH1F, {axisLambdaMass}); + histos.add("GeneralQA/h3dAntiLambdaMass", "h3dAntiLambdaMass", kTH3F, {axisCentrality, axisPt, axisLambdaMass}); histos.add("GeneralQA/hPhotonMassSelected", "hPhotonMassSelected", kTH1F, {axisPhotonMass}); histos.add("GeneralQA/hLambdaMassSelected", "hLambdaMassSelected", kTH1F, {axisLambdaMass}); @@ -278,46 +340,80 @@ struct sigmaanalysis { histos.add("GeneralQA/hSigmaOPAngle", "hSigmaOPAngle", kTH1F, {{140, 0.0f, +7.0f}}); // Specific sigma0 QA - histos.add("SigmaMassQA/h2dPhotonV0Type", "h2dPhotonV0Type", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaMassQA/h2dPhotonMass", "h2dPhotonMass", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaMassQA/h2dPhotonDaupT", "h2dPhotonDaupT", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaMassQA/h2dPhotonDCADauToPV", "h2dPhotonDCADauToPV", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaMassQA/h2dPhotonDCADau", "h2dPhotonDCADau", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaMassQA/h2dPhotonDauTPCCR", "h2dPhotonDauTPCCR", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaMassQA/h2dPhotonTPCNSigmaEl", "h2dPhotonTPCNSigmaEl", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaMassQA/h2dPhotonpT", "h2dPhotonpT", {HistType::kTH2F, {axisPt, axisSigmaMass}}); // - histos.add("SigmaMassQA/h2dPhotonY", "h2dPhotonY", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaMassQA/h2dPhotonRadius", "h2dPhotonRadius", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaMassQA/h2dRZCut", "h2dRZCut", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaMassQA/h2dPhotonArmenteros", "h2dPhotonArmenteros", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaMassQA/h2dPhotonCosPA", "h2dPhotonCosPA", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaMassQA/h2dPhotonPsiPair", "h2dPhotonPsiPair", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaMassQA/h2dLambdaRadius", "h2dLambdaRadius", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaMassQA/h2dLambdaDCADau", "h2dLambdaDCADau", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaMassQA/h2dLambdaArmenteros", "h2dLambdaArmenteros", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaMassQA/h2dLambdaCosPA", "h2dLambdaCosPA", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaMassQA/h2dLambdaY", "h2dLambdaY", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaMassQA/h2dLambdaDauTPCCR", "h2dLambdaDauTPCCR", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaMassQA/h2dLambdaDauITSCls", "h2dLambdaDauITSCls", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaMassQA/h2dLambdaLifeTime", "h2dLambdaLifeTime", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaMassQA/h2dTPCvsTOFNSigma_Lambda", "h2dTPCvsTOFNSigma_Lambda", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaMassQA/h2dLambdaDCADauToPV", "h2dLambdaDCADauToPV", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaMassQA/h2dLambdaMass", "h2dLambdaMass", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaMassQA/h2dTPCvsTOFNSigma_ALambda", "h2dTPCvsTOFNSigma_ALambda", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaMassQA/h2dALambdaDCADauToPV", "h2dALambdaDCADauToPV", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaMassQA/h2dAntiLambdaMass", "h2dAntiLambdaMass", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaMassQA/h2dSigmaY", "h2dSigmaY", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dPhotonV0Type", "h2dPhotonV0Type", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dPhotonMass", "h2dPhotonMass", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dPhotonDaupT", "h2dPhotonDaupT", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dPhotonDCADauToPV", "h2dPhotonDCADauToPV", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dPhotonDCADau", "h2dPhotonDCADau", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dPhotonDauTPCCR", "h2dPhotonDauTPCCR", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dPhotonTPCNSigmaEl", "h2dPhotonTPCNSigmaEl", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dPhotonpT", "h2dPhotonpT", {HistType::kTH2F, {axisPt, axisSigmaMass}}); // + histos.add("SigmaSelQA/h2dPhotonY", "h2dPhotonY", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dPhotonRadius", "h2dPhotonRadius", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dRZCut", "h2dRZCut", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dPhotonArmenteros", "h2dPhotonArmenteros", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dPhotonCosPA", "h2dPhotonCosPA", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dPhotonPsiPair", "h2dPhotonPsiPair", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dLambdaRadius", "h2dLambdaRadius", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dLambdaDCADau", "h2dLambdaDCADau", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dLambdaArmenteros", "h2dLambdaArmenteros", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dLambdaCosPA", "h2dLambdaCosPA", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dLambdaY", "h2dLambdaY", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dLambdaDauTPCCR", "h2dLambdaDauTPCCR", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dLambdaDauITSCls", "h2dLambdaDauITSCls", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dLambdaLifeTime", "h2dLambdaLifeTime", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dTPCvsTOFNSigma_Lambda", "h2dTPCvsTOFNSigma_Lambda", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dLambdaDCADauToPV", "h2dLambdaDCADauToPV", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dLambdaMass", "h2dLambdaMass", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dTPCvsTOFNSigma_ALambda", "h2dTPCvsTOFNSigma_ALambda", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dALambdaDCADauToPV", "h2dALambdaDCADauToPV", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dAntiLambdaMass", "h2dAntiLambdaMass", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + histos.add("SigmaSelQA/h2dSigmaY", "h2dSigmaY", {HistType::kTH2F, {axisPt, axisSigmaMass}}); + + // Specific photon QA + histos.add("PhotonSelQA/h2dPhotonBaseline", "h2dPhotonBaseline", {HistType::kTH2F, {axisPt, axisPhotonMass}}); + histos.add("PhotonSelQA/h2dPhotonV0Type", "h2dPhotonV0Type", {HistType::kTH2F, {axisPt, axisPhotonMass}}); + histos.add("PhotonSelQA/h2dPhotonMass", "h2dPhotonMass", {HistType::kTH2F, {axisPt, axisPhotonMass}}); + histos.add("PhotonSelQA/h2dPhotonDaupT", "h2dPhotonDaupT", {HistType::kTH2F, {axisPt, axisPhotonMass}}); + histos.add("PhotonSelQA/h2dPhotonDCADauToPV", "h2dPhotonDCADauToPV", {HistType::kTH2F, {axisPt, axisPhotonMass}}); + histos.add("PhotonSelQA/h2dPhotonDCADau", "h2dPhotonDCADau", {HistType::kTH2F, {axisPt, axisPhotonMass}}); + histos.add("PhotonSelQA/h2dPhotonDauTPCCR", "h2dPhotonDauTPCCR", {HistType::kTH2F, {axisPt, axisPhotonMass}}); + histos.add("PhotonSelQA/h2dPhotonTPCNSigmaEl", "h2dPhotonTPCNSigmaEl", {HistType::kTH2F, {axisPt, axisPhotonMass}}); + histos.add("PhotonSelQA/h2dPhotonpT", "h2dPhotonpT", {HistType::kTH2F, {axisPt, axisPhotonMass}}); // + histos.add("PhotonSelQA/h2dPhotonY", "h2dPhotonY", {HistType::kTH2F, {axisPt, axisPhotonMass}}); + histos.add("PhotonSelQA/h2dPhotonRadius", "h2dPhotonRadius", {HistType::kTH2F, {axisPt, axisPhotonMass}}); + histos.add("PhotonSelQA/h2dRZCut", "h2dRZCut", {HistType::kTH2F, {axisPt, axisPhotonMass}}); + histos.add("PhotonSelQA/h2dPhotonArmenteros", "h2dPhotonArmenteros", {HistType::kTH2F, {axisPt, axisPhotonMass}}); + histos.add("PhotonSelQA/h2dPhotonCosPA", "h2dPhotonCosPA", {HistType::kTH2F, {axisPt, axisPhotonMass}}); + histos.add("PhotonSelQA/h2dPhotonPsiPair", "h2dPhotonPsiPair", {HistType::kTH2F, {axisPt, axisPhotonMass}}); + histos.add("PhotonSelQA/h2dPhotonPhi", "h2dPhotonPhi", {HistType::kTH2F, {axisPt, axisPhotonMass}}); + + // Specific Lambda/ALambda QA + histos.add("LambdaSelQA/h2dLambdaBaseline", "h2dLambdaBaseline", {HistType::kTH2F, {axisPt, axisLambdaMass}}); + histos.add("LambdaSelQA/h2dLambdaRadius", "h2dLambdaRadius", {HistType::kTH2F, {axisPt, axisLambdaMass}}); + histos.add("LambdaSelQA/h2dLambdaDCADau", "h2dLambdaDCADau", {HistType::kTH2F, {axisPt, axisLambdaMass}}); + histos.add("LambdaSelQA/h2dLambdaArmenteros", "h2dLambdaArmenteros", {HistType::kTH2F, {axisPt, axisLambdaMass}}); + histos.add("LambdaSelQA/h2dLambdaCosPA", "h2dLambdaCosPA", {HistType::kTH2F, {axisPt, axisLambdaMass}}); + histos.add("LambdaSelQA/h2dLambdaY", "h2dLambdaY", {HistType::kTH2F, {axisPt, axisLambdaMass}}); + histos.add("LambdaSelQA/h2dLambdaDauTPCCR", "h2dLambdaDauTPCCR", {HistType::kTH2F, {axisPt, axisLambdaMass}}); + histos.add("LambdaSelQA/h2dLambdaDauITSCls", "h2dLambdaDauITSCls", {HistType::kTH2F, {axisPt, axisLambdaMass}}); + histos.add("LambdaSelQA/h2dLambdaLifeTime", "h2dLambdaLifeTime", {HistType::kTH2F, {axisPt, axisLambdaMass}}); + histos.add("LambdaSelQA/h2dTPCvsTOFNSigma_Lambda", "h2dTPCvsTOFNSigma_Lambda", {HistType::kTH2F, {axisPt, axisLambdaMass}}); + histos.add("LambdaSelQA/h2dLambdaDCADauToPV", "h2dLambdaDCADauToPV", {HistType::kTH2F, {axisPt, axisLambdaMass}}); + histos.add("LambdaSelQA/h2dLambdaMass", "h2dLambdaMass", {HistType::kTH2F, {axisPt, axisLambdaMass}}); // For Signal Extraction // Sigma0 histos.add("Sigma0/h3dMassSigma0", "h3dMassSigma0", kTH3F, {axisCentrality, axisPt, axisSigmaMass}); + histos.add("Sigma0/h3dPhotonRadiusVsMassSigma0", "h3dPhotonRadiusVsMassSigma0", kTH3F, {axisCentrality, axisRadius, axisSigmaMass}); histos.add("Sigma0/hMassSigma0", "hMassSigma0", kTH1F, {axisSigmaMass}); histos.add("Sigma0/hPtSigma0", "hPtSigma0", kTH1F, {axisPt}); histos.add("Sigma0/hRapiditySigma0", "hRapiditySigma0", kTH1F, {axisRapidity}); // AntiSigma0 histos.add("AntiSigma0/h3dMassAntiSigma0", "h3dMassAntiSigma0", kTH3F, {axisCentrality, axisPt, axisSigmaMass}); + histos.add("AntiSigma0/h3dPhotonRadiusVsMassAntiSigma0", "h3dPhotonRadiusVsMassAntiSigma0", kTH3F, {axisCentrality, axisRadius, axisSigmaMass}); histos.add("AntiSigma0/hMassAntiSigma0", "hMassAntiSigma0", kTH1F, {axisSigmaMass}); histos.add("AntiSigma0/hPtAntiSigma0", "hPtAntiSigma0", kTH1F, {axisPt}); histos.add("AntiSigma0/hRapidityAntiSigma0", "hRapidityAntiSigma0", kTH1F, {axisRapidity}); @@ -327,7 +423,7 @@ struct sigmaanalysis { // Kinematic histos.add("MC/h3dMassSigma0", "h3dMassSigma0", kTH3F, {axisCentrality, axisPt, axisSigmaMass}); histos.add("MC/h3dMassAntiSigma0", "h3dMassSigma0", kTH3F, {axisCentrality, axisPt, axisSigmaMass}); - + histos.add("MC/h3dMassAllSigma0sBeforesel", "h3dMassAllSigma0sBeforesel", kTH3F, {axisCentrality, axisPt, axisSigmaMass}); histos.add("MC/h2dArmenterosBeforeSel", "h2dArmenterosBeforeSel", {HistType::kTH2F, {axisAPAlpha, axisAPQt}}); histos.add("MC/h2dArmenterosAfterSel", "h2dArmenterosAfterSel", {HistType::kTH2F, {axisAPAlpha, axisAPQt}}); @@ -396,12 +492,108 @@ struct sigmaanalysis { histos.add("MC/hPtTrueLambda_passedTPCTOFPID", "hPtTrueLambda_passedTPCTOFPID", kTH1F, {axisPt}); histos.add("MC/hPtLambdaCandidates_passedTPCTOFPID", "hPtLambdaCandidates_passedTPCTOFPID", kTH1F, {axisPt}); - // pT Resolution: - histos.add("MC/h3dLambdaPtResolution", "h3dLambdaPtResolution", kTH3F, {axisPt, axisDeltaPt, axisLambdaMass}); - histos.add("MC/h3dAntiLambdaPtResolution", "h3dAntiLambdaPtResolution", kTH3F, {axisPt, axisDeltaPt, axisLambdaMass}); - histos.add("MC/h3dGammaPtResolution", "h3dGammaPtResolution", kTH3F, {axisPt, axisDeltaPt, axisPhotonMass}); - histos.add("MC/h3dSigma0PtResolution", "h3dSigma0PtResolution", kTH3F, {axisPt, axisDeltaPt, axisSigmaMass}); + // 1/pT Resolution: + histos.add("MC/h2dLambdaPtResolution", "h2dLambdaPtResolution", kTH2D, {axisInvPt, axisDeltaPt}); + histos.add("MC/h2dAntiLambdaPtResolution", "h2dAntiLambdaPtResolution", kTH2D, {axisInvPt, axisDeltaPt}); + histos.add("MC/h2dGammaPtResolution", "h2dGammaPtResolution", kTH2D, {axisInvPt, axisDeltaPt}); + histos.add("MC/h2dSigma0PtResolution", "h2dSigma0PtResolution", kTH2D, {axisInvPt, axisDeltaPt}); + histos.add("MC/h2dAntiSigma0PtResolution", "h2dAntiSigma0PtResolution", kTH2D, {axisInvPt, axisDeltaPt}); + histos.add("MC/h3dLambdaPtResoVsTPCCR", "h3dLambdaPtResoVsTPCCR", kTH3F, {axisInvPt, axisDeltaPt, {320, -160.0f, 160.0f}}); + histos.add("MC/h3dAntiLambdaPtResoVsTPCCR", "h3dAntiLambdaPtResoVsTPCCR", kTH3F, {axisInvPt, axisDeltaPt, {320, -160.0f, 160.0f}}); + histos.add("MC/h3dGammaPtResoVsTPCCR", "h3dGammaPtResoVsTPCCR", kTH3F, {axisInvPt, axisDeltaPt, {320, -160.0f, 160.0f}}); + + // pTMC info: + histos.add("MC/h2dSigmaMCPtVsLambdaMCPt", "h2dSigmaMCPtVsLambdaMCPt", kTH2D, {axisPt, axisPt}); + histos.add("MC/h2dSigmaMCPtVsGammaMCPt", "h2dSigmaMCPtVsGammaMCPt", kTH2D, {axisPt, axisPt}); + } + } + + template + bool IsEventAccepted(TCollision collision) + // check whether the collision passes our collision selections + { + histos.fill(HIST("hEventSelection"), 0. /* all collisions */); + if (eventSelections.requireSel8 && !collision.sel8()) { + return false; + } + histos.fill(HIST("hEventSelection"), 1 /* sel8 collisions */); + if (eventSelections.requireTriggerTVX && !collision.selection_bit(aod::evsel::kIsTriggerTVX)) { + return false; + } + histos.fill(HIST("hEventSelection"), 2 /* FT0 vertex (acceptable FT0C-FT0A time difference) collisions */); + if (eventSelections.rejectITSROFBorder && !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { + return false; + } + histos.fill(HIST("hEventSelection"), 3 /* Not at ITS ROF border */); + if (eventSelections.rejectTFBorder && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { + return false; + } + histos.fill(HIST("hEventSelection"), 4 /* Not at TF border */); + if (std::abs(collision.posZ()) > eventSelections.maxZVtxPosition) { + return false; + } + histos.fill(HIST("hEventSelection"), 5 /* vertex-Z selected */); + if (eventSelections.requireIsVertexITSTPC && !collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) { + return false; + } + histos.fill(HIST("hEventSelection"), 6 /* Contains at least one ITS-TPC track */); + if (eventSelections.requireIsGoodZvtxFT0VsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { + return false; + } + histos.fill(HIST("hEventSelection"), 7 /* PV position consistency check */); + if (eventSelections.requireIsVertexTOFmatched && !collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) { + return false; + } + histos.fill(HIST("hEventSelection"), 8 /* PV with at least one contributor matched with TOF */); + if (eventSelections.requireIsVertexTRDmatched && !collision.selection_bit(o2::aod::evsel::kIsVertexTRDmatched)) { + return false; + } + histos.fill(HIST("hEventSelection"), 9 /* PV with at least one contributor matched with TRD */); + if (eventSelections.rejectSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { + return false; + } + histos.fill(HIST("hEventSelection"), 10 /* Not at same bunch pile-up */); + if (eventSelections.requireNoCollInTimeRangeStd && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + return false; + } + histos.fill(HIST("hEventSelection"), 11 /* No other collision within +/- 2 microseconds or mult above a certain threshold in -4 - -2 microseconds*/); + if (eventSelections.requireNoCollInTimeRangeStrict && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStrict)) { + return false; + } + histos.fill(HIST("hEventSelection"), 12 /* No other collision within +/- 10 microseconds */); + if (eventSelections.requireNoCollInTimeRangeNarrow && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeNarrow)) { + return false; + } + histos.fill(HIST("hEventSelection"), 13 /* No other collision within +/- 2 microseconds */); + if (eventSelections.requireNoCollInROFStd && !collision.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { + return false; + } + histos.fill(HIST("hEventSelection"), 14 /* No other collision within the same ITS ROF with mult. above a certain threshold */); + if (eventSelections.requireNoCollInROFStrict && !collision.selection_bit(o2::aod::evsel::kNoCollInRofStrict)) { + return false; + } + histos.fill(HIST("hEventSelection"), 15 /* No other collision within the same ITS ROF */); + if (doPPAnalysis) { // we are in pp + if (eventSelections.requireINEL0 && collision.multNTracksPVeta1() < 1) { + return false; + } + histos.fill(HIST("hEventSelection"), 16 /* INEL > 0 */); + if (eventSelections.requireINEL1 && collision.multNTracksPVeta1() < 2) { + return false; + } + histos.fill(HIST("hEventSelection"), 17 /* INEL > 1 */); + } else { // we are in Pb-Pb + float collisionOccupancy = eventSelections.useFT0CbasedOccupancy ? collision.ft0cOccupancyInTimeRange() : collision.trackOccupancyInTimeRange(); + if (eventSelections.minOccupancy >= 0 && collisionOccupancy < eventSelections.minOccupancy) { + return false; + } + histos.fill(HIST("hEventSelection"), 16 /* Below min occupancy */); + if (eventSelections.maxOccupancy >= 0 && collisionOccupancy > eventSelections.maxOccupancy) { + return false; + } + histos.fill(HIST("hEventSelection"), 17 /* Above max occupancy */); } + return true; } // Apply selections in sigma candidates @@ -425,141 +617,210 @@ struct sigmaanalysis { return false; } else { + bool isMCTrueLambda = false; + bool isMCTruePhoton = false; + if constexpr (requires { cand.lambdaCandPDGCode(); cand.photonCandPDGCode(); }) { + if (cand.photonCandPDGCode() == 22) + isMCTruePhoton = true; + if (cand.lambdaCandPDGCode() == 3122) + isMCTrueLambda = true; + } + // Photon Selections histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 1.); histos.fill(HIST("GeneralQA/hPhotonV0Type"), cand.photonV0Type()); + if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) + histos.fill(HIST("PhotonSelQA/h2dPhotonBaseline"), cand.photonPt(), cand.photonMass()); if (cand.photonV0Type() != Photonv0TypeSel && Photonv0TypeSel > -1) return false; - histos.fill(HIST("SigmaMassQA/h2dPhotonV0Type"), cand.sigmapT(), cand.sigmaMass()); - histos.fill(HIST("GeneralQA/hPhotonMass"), cand.photonMass()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 2.); - if (TMath::Abs(cand.photonMass()) > PhotonMaxMass) - return false; - histos.fill(HIST("SigmaMassQA/h2dPhotonMass"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("SigmaSelQA/h2dPhotonV0Type"), cand.sigmapT(), cand.sigmaMass()); + if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) + histos.fill(HIST("PhotonSelQA/h2dPhotonV0Type"), cand.photonPt(), cand.photonMass()); + + // histos.fill(HIST("GeneralQA/h3dPhotonMass"), cand.sigmaCentrality(), cand.photonPt(), cand.photonMass()); + // histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 2.); + // if (TMath::Abs(cand.photonMass()) > PhotonMaxMass) + // return false; + // histos.fill(HIST("SigmaSelQA/h2dPhotonMass"), cand.sigmapT(), cand.sigmaMass()); + // if (isMCTruePhoton || doPhotonLambdaSelQA) histos.fill(HIST("PhotonSelQA/h2dPhotonMass"), cand.photonPt(), cand.photonMass()); + histos.fill(HIST("GeneralQA/hPhotonNegpT"), cand.photonNegPt()); histos.fill(HIST("GeneralQA/hPhotonPospT"), cand.photonPosPt()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 3.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 2.); if ((cand.photonPosPt() < PhotonDauMinPt) || (cand.photonNegPt() < PhotonDauMinPt)) return false; - histos.fill(HIST("SigmaMassQA/h2dPhotonDaupT"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("SigmaSelQA/h2dPhotonDaupT"), cand.sigmapT(), cand.sigmaMass()); + if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) + histos.fill(HIST("PhotonSelQA/h2dPhotonDaupT"), cand.photonPt(), cand.photonMass()); histos.fill(HIST("GeneralQA/hPhotonDCANegToPV"), cand.photonDCANegPV()); histos.fill(HIST("GeneralQA/hPhotonDCAPosToPV"), cand.photonDCAPosPV()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 4.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 3.); if ((TMath::Abs(cand.photonDCAPosPV()) < PhotonMinDCADauToPv) || (TMath::Abs(cand.photonDCANegPV()) < PhotonMinDCADauToPv)) return false; - histos.fill(HIST("SigmaMassQA/h2dPhotonDCADauToPV"), cand.sigmapT(), cand.sigmaMass()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 5.); + histos.fill(HIST("SigmaSelQA/h2dPhotonDCADauToPV"), cand.sigmapT(), cand.sigmaMass()); + if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) + histos.fill(HIST("PhotonSelQA/h2dPhotonDCADauToPV"), cand.photonPt(), cand.photonMass()); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 4.); histos.fill(HIST("GeneralQA/hPhotonDCADau"), cand.photonDCADau()); if (TMath::Abs(cand.photonDCADau()) > PhotonMaxDCAV0Dau) return false; - histos.fill(HIST("SigmaMassQA/h2dPhotonDCADau"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("SigmaSelQA/h2dPhotonDCADau"), cand.sigmapT(), cand.sigmaMass()); + if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) + histos.fill(HIST("PhotonSelQA/h2dPhotonDCADau"), cand.photonPt(), cand.photonMass()); histos.fill(HIST("GeneralQA/hPhotonPosTPCCR"), cand.photonPosTPCCrossedRows()); histos.fill(HIST("GeneralQA/hPhotonNegTPCCR"), cand.photonNegTPCCrossedRows()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 6.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 5.); if ((cand.photonPosTPCCrossedRows() < PhotonMinTPCCrossedRows) || (cand.photonNegTPCCrossedRows() < PhotonMinTPCCrossedRows)) return false; - histos.fill(HIST("SigmaMassQA/h2dPhotonDauTPCCR"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("SigmaSelQA/h2dPhotonDauTPCCR"), cand.sigmapT(), cand.sigmaMass()); + if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) + histos.fill(HIST("PhotonSelQA/h2dPhotonDauTPCCR"), cand.photonPt(), cand.photonMass()); histos.fill(HIST("GeneralQA/h2dPhotonPosTPCNSigmaEl"), cand.photonPosPt(), cand.photonPosTPCNSigmaEl()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 7.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 6.); if (((cand.photonPosTPCNSigmaEl() < PhotonMinTPCNSigmas) || (cand.photonPosTPCNSigmaEl() > PhotonMaxTPCNSigmas))) return false; histos.fill(HIST("GeneralQA/h2dPhotonNegTPCNSigmaEl"), cand.photonNegPt(), cand.photonNegTPCNSigmaEl()); if (((cand.photonNegTPCNSigmaEl() < PhotonMinTPCNSigmas) || (cand.photonNegTPCNSigmaEl() > PhotonMaxTPCNSigmas))) return false; - histos.fill(HIST("SigmaMassQA/h2dPhotonTPCNSigmaEl"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("SigmaSelQA/h2dPhotonTPCNSigmaEl"), cand.sigmapT(), cand.sigmaMass()); + if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) + histos.fill(HIST("PhotonSelQA/h2dPhotonTPCNSigmaEl"), cand.photonPt(), cand.photonMass()); histos.fill(HIST("GeneralQA/h2dPhotonPosTPCNSigmaPi"), cand.photonPosPt(), cand.photonPosTPCNSigmaPi()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 8.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 7.); if (((TMath::Abs(cand.photonPosTPCNSigmaPi()) < PiMaxTPCNSigmas) && cand.photonPosPt() <= piMaxpT)) return false; histos.fill(HIST("GeneralQA/h2dPhotonNegTPCNSigmaPi"), cand.photonNegPt(), cand.photonNegTPCNSigmaPi()); if (((TMath::Abs(cand.photonNegTPCNSigmaPi()) < PiMaxTPCNSigmas) && cand.photonNegPt() <= piMaxpT)) return false; histos.fill(HIST("GeneralQA/hPhotonpT"), cand.photonPt()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 9.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 8.); if ((cand.photonPt() < PhotonMinPt) || (cand.photonPt() > PhotonMaxPt)) return false; - histos.fill(HIST("SigmaMassQA/h2dPhotonpT"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("SigmaSelQA/h2dPhotonpT"), cand.sigmapT(), cand.sigmaMass()); + if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) + histos.fill(HIST("PhotonSelQA/h2dPhotonpT"), cand.photonPt(), cand.photonMass()); histos.fill(HIST("GeneralQA/hPhotonY"), cand.photonY()); histos.fill(HIST("GeneralQA/hPhotonPosEta"), cand.photonPosEta()); histos.fill(HIST("GeneralQA/hPhotonNegEta"), cand.photonNegEta()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 10.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 9.); if ((TMath::Abs(cand.photonY()) > PhotonMaxRap) || (TMath::Abs(cand.photonPosEta()) > PhotonMaxDauEta) || (TMath::Abs(cand.photonNegEta()) > PhotonMaxDauEta)) return false; - histos.fill(HIST("SigmaMassQA/h2dPhotonY"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("SigmaSelQA/h2dPhotonY"), cand.sigmapT(), cand.sigmaMass()); + if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) + histos.fill(HIST("PhotonSelQA/h2dPhotonY"), cand.photonPt(), cand.photonMass()); histos.fill(HIST("GeneralQA/hPhotonRadius"), cand.photonRadius()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 11.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 10.); if ((cand.photonRadius() < PhotonMinRadius) || (cand.photonRadius() > PhotonMaxRadius)) return false; float photonRZLineCut = TMath::Abs(cand.photonZconv()) * TMath::Tan(2 * TMath::ATan(TMath::Exp(-PhotonMaxDauEta))) - PhotonLineCutZ0; - histos.fill(HIST("SigmaMassQA/h2dPhotonRadius"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("SigmaSelQA/h2dPhotonRadius"), cand.sigmapT(), cand.sigmaMass()); + if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) + histos.fill(HIST("PhotonSelQA/h2dPhotonRadius"), cand.photonPt(), cand.photonMass()); histos.fill(HIST("GeneralQA/hPhotonZ"), cand.photonZconv()); histos.fill(HIST("GeneralQA/h2dRZCut"), cand.photonRadius(), photonRZLineCut); histos.fill(HIST("GeneralQA/h2dRZPlane"), cand.photonZconv(), cand.photonRadius()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 12.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 11.); if ((TMath::Abs(cand.photonRadius()) < photonRZLineCut) || (TMath::Abs(cand.photonZconv()) > PhotonMaxZ)) return false; - histos.fill(HIST("SigmaMassQA/h2dRZCut"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("SigmaSelQA/h2dRZCut"), cand.sigmapT(), cand.sigmaMass()); + if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) + histos.fill(HIST("PhotonSelQA/h2dRZCut"), cand.photonPt(), cand.photonMass()); histos.fill(HIST("GeneralQA/h2dPhotonArmenteros"), cand.photonAlpha(), cand.photonQt()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 13.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 12.); if (cand.photonQt() > PhotonMaxQt) return false; - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 14.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 13.); if (TMath::Abs(cand.photonAlpha()) > PhotonMaxAlpha) return false; - histos.fill(HIST("SigmaMassQA/h2dPhotonArmenteros"), cand.sigmapT(), cand.sigmaMass()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 15.); + histos.fill(HIST("SigmaSelQA/h2dPhotonArmenteros"), cand.sigmapT(), cand.sigmaMass()); + if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) + histos.fill(HIST("PhotonSelQA/h2dPhotonArmenteros"), cand.photonPt(), cand.photonMass()); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 14.); histos.fill(HIST("GeneralQA/hPhotonCosPA"), cand.photonCosPA()); if (cand.photonCosPA() < PhotonMinV0cospa) return false; - histos.fill(HIST("SigmaMassQA/h2dPhotonCosPA"), cand.sigmapT(), cand.sigmaMass()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 16.); + histos.fill(HIST("SigmaSelQA/h2dPhotonCosPA"), cand.sigmapT(), cand.sigmaMass()); + if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) + histos.fill(HIST("PhotonSelQA/h2dPhotonCosPA"), cand.photonPt(), cand.photonMass()); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 15.); histos.fill(HIST("GeneralQA/hPhotonPsiPair"), cand.photonPsiPair()); if (TMath::Abs(cand.photonPsiPair()) > PhotonPsiPairMax) return false; - histos.fill(HIST("SigmaMassQA/h2dPhotonPsiPair"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("SigmaSelQA/h2dPhotonPsiPair"), cand.sigmapT(), cand.sigmaMass()); + if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) + histos.fill(HIST("PhotonSelQA/h2dPhotonPsiPair"), cand.photonPt(), cand.photonMass()); - // Lambda selections + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 16.); + histos.fill(HIST("GeneralQA/hPhotonPhi"), cand.photonPhi()); + if (((cand.photonPhi() < PhotonPhiMin1) || ((cand.photonPhi() > PhotonPhiMax1) && (cand.photonPhi() < PhotonPhiMin2)) || ((cand.photonPhi() > PhotonPhiMax2) && (PhotonPhiMax2 != -1)))) + return false; + if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) + histos.fill(HIST("PhotonSelQA/h2dPhotonPhi"), cand.photonPt(), cand.photonMass()); + histos.fill(HIST("GeneralQA/h3dPhotonMass"), cand.sigmaCentrality(), cand.photonPt(), cand.photonMass()); histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 17.); + if (TMath::Abs(cand.photonMass()) > PhotonMaxMass) + return false; + histos.fill(HIST("SigmaSelQA/h2dPhotonMass"), cand.sigmapT(), cand.sigmaMass()); + if (isMCTruePhoton || doPhotonLambdaSelQA) + histos.fill(HIST("PhotonSelQA/h2dPhotonMass"), cand.photonPt(), cand.photonMass()); + + // #### + // Lambda selections + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 18.); histos.fill(HIST("GeneralQA/hLambdaRadius"), cand.lambdaRadius()); + if ((isMCTrueLambda || doPhotonLambdaSelQA) && (TMath::Abs(cand.lambdaMass() - o2::constants::physics::MassLambda0) < LambdaWindow)) + histos.fill(HIST("LambdaSelQA/h2dLambdaBaseline"), cand.lambdaPt(), cand.lambdaMass()); if ((cand.lambdaRadius() < LambdaMinv0radius) || (cand.lambdaRadius() > LambdaMaxv0radius)) return false; - histos.fill(HIST("SigmaMassQA/h2dLambdaRadius"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("SigmaSelQA/h2dLambdaRadius"), cand.sigmapT(), cand.sigmaMass()); + if ((isMCTrueLambda || doPhotonLambdaSelQA) && (TMath::Abs(cand.lambdaMass() - o2::constants::physics::MassLambda0) < LambdaWindow)) + histos.fill(HIST("LambdaSelQA/h2dLambdaRadius"), cand.lambdaPt(), cand.lambdaMass()); histos.fill(HIST("GeneralQA/hLambdaDCADau"), cand.lambdaDCADau()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 18.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 19.); if (TMath::Abs(cand.lambdaDCADau()) > LambdaMaxDCAV0Dau) return false; - histos.fill(HIST("SigmaMassQA/h2dLambdaDCADau"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("SigmaSelQA/h2dLambdaDCADau"), cand.sigmapT(), cand.sigmaMass()); + if ((isMCTrueLambda || doPhotonLambdaSelQA) && (TMath::Abs(cand.lambdaMass() - o2::constants::physics::MassLambda0) < LambdaWindow)) + histos.fill(HIST("LambdaSelQA/h2dLambdaDCADau"), cand.lambdaPt(), cand.lambdaMass()); histos.fill(HIST("GeneralQA/h2dLambdaArmenteros"), cand.lambdaAlpha(), cand.lambdaQt()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 19.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 20.); if ((cand.lambdaQt() < LambdaMinQt) || (cand.lambdaQt() > LambdaMaxQt)) return false; - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 20.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 21.); if ((TMath::Abs(cand.lambdaAlpha()) < LambdaMinAlpha) || (TMath::Abs(cand.lambdaAlpha()) > LambdaMaxAlpha)) return false; - histos.fill(HIST("SigmaMassQA/h2dLambdaArmenteros"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("SigmaSelQA/h2dLambdaArmenteros"), cand.sigmapT(), cand.sigmaMass()); + if ((isMCTrueLambda || doPhotonLambdaSelQA) && (TMath::Abs(cand.lambdaMass() - o2::constants::physics::MassLambda0) < LambdaWindow)) + histos.fill(HIST("LambdaSelQA/h2dLambdaArmenteros"), cand.lambdaPt(), cand.lambdaMass()); histos.fill(HIST("GeneralQA/hLambdaCosPA"), cand.lambdaCosPA()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 21.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 22.); if (cand.lambdaCosPA() < LambdaMinv0cospa) return false; - histos.fill(HIST("SigmaMassQA/h2dLambdaCosPA"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("SigmaSelQA/h2dLambdaCosPA"), cand.sigmapT(), cand.sigmaMass()); + if ((isMCTrueLambda || doPhotonLambdaSelQA) && (TMath::Abs(cand.lambdaMass() - o2::constants::physics::MassLambda0) < LambdaWindow)) + histos.fill(HIST("LambdaSelQA/h2dLambdaCosPA"), cand.lambdaPt(), cand.lambdaMass()); histos.fill(HIST("GeneralQA/hLambdaY"), cand.lambdaY()); histos.fill(HIST("GeneralQA/hLambdaPosEta"), cand.lambdaPosEta()); histos.fill(HIST("GeneralQA/hLambdaNegEta"), cand.lambdaNegEta()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 22.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 23.); if ((TMath::Abs(cand.lambdaY()) > LambdaMaxRap) || (TMath::Abs(cand.lambdaPosEta()) > LambdaMaxDauEta) || (TMath::Abs(cand.lambdaNegEta()) > LambdaMaxDauEta)) return false; - histos.fill(HIST("SigmaMassQA/h2dLambdaY"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("SigmaSelQA/h2dLambdaY"), cand.sigmapT(), cand.sigmaMass()); + if ((isMCTrueLambda || doPhotonLambdaSelQA) && (TMath::Abs(cand.lambdaMass() - o2::constants::physics::MassLambda0) < LambdaWindow)) + histos.fill(HIST("LambdaSelQA/h2dLambdaY"), cand.lambdaPt(), cand.lambdaMass()); histos.fill(HIST("GeneralQA/hLambdaPosTPCCR"), cand.lambdaPosTPCCrossedRows()); histos.fill(HIST("GeneralQA/hLambdaNegTPCCR"), cand.lambdaNegTPCCrossedRows()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 23.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 24.); if ((cand.lambdaPosTPCCrossedRows() < LambdaMinTPCCrossedRows) || (cand.lambdaNegTPCCrossedRows() < LambdaMinTPCCrossedRows)) return false; - histos.fill(HIST("SigmaMassQA/h2dLambdaDauTPCCR"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("SigmaSelQA/h2dLambdaDauTPCCR"), cand.sigmapT(), cand.sigmaMass()); + if ((isMCTrueLambda || doPhotonLambdaSelQA) && (TMath::Abs(cand.lambdaMass() - o2::constants::physics::MassLambda0) < LambdaWindow)) + histos.fill(HIST("LambdaSelQA/h2dLambdaDauTPCCR"), cand.lambdaPt(), cand.lambdaMass()); histos.fill(HIST("GeneralQA/hLambdaPosITSCls"), cand.lambdaPosITSCls()); histos.fill(HIST("GeneralQA/hLambdaNegITSCls"), cand.lambdaNegITSCls()); histos.fill(HIST("GeneralQA/hLambdaPosChi2PerNc"), cand.lambdaPosChi2PerNcl()); histos.fill(HIST("GeneralQA/hLambdaNegChi2PerNc"), cand.lambdaNegChi2PerNcl()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 24.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 25.); // check minimum number of ITS clusters + reject ITS afterburner tracks if requested bool posIsFromAfterburner = cand.lambdaPosChi2PerNcl() < 0; bool negIsFromAfterburner = cand.lambdaNegChi2PerNcl() < 0; @@ -567,13 +828,17 @@ struct sigmaanalysis { return false; if (cand.lambdaNegITSCls() < LambdaMinITSclusters && (!LambdaRejectNegITSafterburner || negIsFromAfterburner)) return false; - histos.fill(HIST("SigmaMassQA/h2dLambdaDauITSCls"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("SigmaSelQA/h2dLambdaDauITSCls"), cand.sigmapT(), cand.sigmaMass()); + if ((isMCTrueLambda || doPhotonLambdaSelQA) && (TMath::Abs(cand.lambdaMass() - o2::constants::physics::MassLambda0) < LambdaWindow)) + histos.fill(HIST("LambdaSelQA/h2dLambdaDauITSCls"), cand.lambdaPt(), cand.lambdaMass()); histos.fill(HIST("GeneralQA/hLambdaLifeTime"), cand.lambdaLifeTime()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 25.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 26.); if (cand.lambdaLifeTime() > LambdaMaxLifeTime) return false; - histos.fill(HIST("SigmaMassQA/h2dLambdaLifeTime"), cand.sigmapT(), cand.sigmaMass()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 26.); + histos.fill(HIST("SigmaSelQA/h2dLambdaLifeTime"), cand.sigmapT(), cand.sigmaMass()); + if ((isMCTrueLambda || doPhotonLambdaSelQA) && (TMath::Abs(cand.lambdaMass() - o2::constants::physics::MassLambda0) < LambdaWindow)) + histos.fill(HIST("LambdaSelQA/h2dLambdaLifeTime"), cand.lambdaPt(), cand.lambdaMass()); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 27.); // Separating lambda and antilambda selections: if (isLambdalike) { // Lambda selection histos.fill(HIST("GeneralQA/h2dTPCvsTOFNSigma_LambdaPr"), cand.lambdaPosPrTPCNSigma(), cand.lambdaPrTOFNSigma()); @@ -591,39 +856,28 @@ struct sigmaanalysis { if (fselLambdaTOFPID && (TMath::Abs(cand.lambdaPiTOFNSigma()) > LambdaPiMaxTOFNSigmas)) return false; - histos.fill(HIST("SigmaMassQA/h2dTPCvsTOFNSigma_Lambda"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("SigmaSelQA/h2dTPCvsTOFNSigma_Lambda"), cand.sigmapT(), cand.sigmaMass()); + if ((isMCTrueLambda || doPhotonLambdaSelQA) && (TMath::Abs(cand.lambdaMass() - o2::constants::physics::MassLambda0) < LambdaWindow)) + histos.fill(HIST("LambdaSelQA/h2dTPCvsTOFNSigma_Lambda"), cand.lambdaPt(), cand.lambdaMass()); // DCA Selection histos.fill(HIST("GeneralQA/hLambdaDCANegToPV"), cand.lambdaDCANegPV()); histos.fill(HIST("GeneralQA/hLambdaDCAPosToPV"), cand.lambdaDCAPosPV()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 27.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 28.); if ((TMath::Abs(cand.lambdaDCAPosPV()) < LambdaMinDCAPosToPv) || (TMath::Abs(cand.lambdaDCANegPV()) < LambdaMinDCANegToPv)) return false; - histos.fill(HIST("SigmaMassQA/h2dLambdaDCADauToPV"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("SigmaSelQA/h2dLambdaDCADauToPV"), cand.sigmapT(), cand.sigmaMass()); + if ((isMCTrueLambda || doPhotonLambdaSelQA) && (TMath::Abs(cand.lambdaMass() - o2::constants::physics::MassLambda0) < LambdaWindow)) + histos.fill(HIST("LambdaSelQA/h2dLambdaDCADauToPV"), cand.lambdaPt(), cand.lambdaMass()); // Mass Selection - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 28.); - histos.fill(HIST("GeneralQA/hLambdaMass"), cand.lambdaMass()); - if (TMath::Abs(cand.lambdaMass() - 1.115683) > LambdaWindow) + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 29.); + histos.fill(HIST("GeneralQA/h3dLambdaMass"), cand.sigmaCentrality(), cand.lambdaPt(), cand.lambdaMass()); + if (TMath::Abs(cand.lambdaMass() - o2::constants::physics::MassLambda0) > LambdaWindow) return false; - histos.fill(HIST("SigmaMassQA/h2dLambdaMass"), cand.sigmapT(), cand.sigmaMass()); - - // if constexpr (requires { cand.lambdaCandPDGCode(); }) { - // if (doPIDQA && passedTPC) { - // histos.fill(HIST("MC/hPtLambdaCandidates_passedTPCPID"), cand.lambdaPt()); - // if (cand.lambdaCandPDGCode() == 3122) - // histos.fill(HIST("MC/hPtTrueLambda_passedTPCPID"), cand.lambdaPt()); - // } - // if (doPIDQA && passedTOF) { - // histos.fill(HIST("MC/hPtLambdaCandidates_passedTOFPID"), cand.lambdaPt()); - // if (cand.lambdaCandPDGCode() == 3122) - // histos.fill(HIST("MC/hPtTrueLambda_passedTOFPID"), cand.lambdaPt()); - // } - // if (doPIDQA && passedTPC && passedTOF) { - // histos.fill(HIST("MC/hPtLambdaCandidates_passedTPCTOFPID"), cand.lambdaPt()); - // if (cand.lambdaCandPDGCode() == 3122) - // histos.fill(HIST("MC/hPtTrueLambda_passedTPCTOFPID"), cand.lambdaPt()); - // } - // } + histos.fill(HIST("SigmaSelQA/h2dLambdaMass"), cand.sigmapT(), cand.sigmaMass()); + if (isMCTrueLambda || doPhotonLambdaSelQA) + histos.fill(HIST("LambdaSelQA/h2dLambdaMass"), cand.lambdaPt(), cand.lambdaMass()); + } else { // AntiLambda selection histos.fill(HIST("GeneralQA/h2dTPCvsTOFNSigma_ALambdaPr"), cand.lambdaNegPrTPCNSigma(), cand.aLambdaPrTOFNSigma()); histos.fill(HIST("GeneralQA/h2dTPCvsTOFNSigma_ALambdaPi"), cand.lambdaPosPiTPCNSigma(), cand.aLambdaPiTOFNSigma()); @@ -640,31 +894,31 @@ struct sigmaanalysis { if (fselLambdaTOFPID && (TMath::Abs(cand.aLambdaPiTOFNSigma()) > LambdaPiMaxTOFNSigmas)) return false; - histos.fill(HIST("SigmaMassQA/h2dTPCvsTOFNSigma_ALambda"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("SigmaSelQA/h2dTPCvsTOFNSigma_ALambda"), cand.sigmapT(), cand.sigmaMass()); // DCA Selection histos.fill(HIST("GeneralQA/hALambdaDCANegToPV"), cand.lambdaDCANegPV()); histos.fill(HIST("GeneralQA/hALambdaDCAPosToPV"), cand.lambdaDCAPosPV()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 27.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 28.); if ((TMath::Abs(cand.lambdaDCAPosPV()) < ALambdaMinDCAPosToPv) || (TMath::Abs(cand.lambdaDCANegPV()) < ALambdaMinDCANegToPv)) return false; - histos.fill(HIST("SigmaMassQA/h2dALambdaDCADauToPV"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("SigmaSelQA/h2dALambdaDCADauToPV"), cand.sigmapT(), cand.sigmaMass()); // Mass Selection - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 28.); - histos.fill(HIST("GeneralQA/hAntiLambdaMass"), cand.antilambdaMass()); - if (TMath::Abs(cand.antilambdaMass() - 1.115683) > LambdaWindow) + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 29.); + histos.fill(HIST("GeneralQA/h3dAntiLambdaMass"), cand.sigmaCentrality(), cand.lambdaPt(), cand.antilambdaMass()); + if (TMath::Abs(cand.antilambdaMass() - o2::constants::physics::MassLambda0) > LambdaWindow) return false; - histos.fill(HIST("SigmaMassQA/h2dAntiLambdaMass"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("SigmaSelQA/h2dAntiLambdaMass"), cand.sigmapT(), cand.sigmaMass()); } // Sigma0 selection histos.fill(HIST("GeneralQA/hSigmaY"), cand.sigmaRapidity()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 29.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 30.); if (TMath::Abs(cand.sigmaRapidity()) > SigmaMaxRap) return false; - histos.fill(HIST("SigmaMassQA/h2dSigmaY"), cand.sigmapT(), cand.sigmaMass()); + histos.fill(HIST("SigmaSelQA/h2dSigmaY"), cand.sigmapT(), cand.sigmaMass()); histos.fill(HIST("GeneralQA/hSigmaOPAngle"), cand.sigmaOPAngle()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 30.); + histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 31.); } return true; } @@ -685,6 +939,9 @@ struct sigmaanalysis { } // Filling histos before analysis selection + histos.fill(HIST("MC/h2dSigmaMCPtVsLambdaMCPt"), sigma.sigmaMCPt(), sigma.lambdaMCPt()); + histos.fill(HIST("MC/h2dSigmaMCPtVsGammaMCPt"), sigma.sigmaMCPt(), sigma.photonMCPt()); + histos.fill(HIST("MC/h3dMassAllSigma0sBeforesel"), sigma.sigmaCentrality(), sigma.sigmapT(), sigma.sigmaMass()); histos.fill(HIST("MC/h2dArmenterosBeforeSel"), sigma.photonAlpha(), sigma.photonQt()); histos.fill(HIST("MC/h2dArmenterosBeforeSel"), sigma.lambdaAlpha(), sigma.lambdaQt()); histos.fill(HIST("MC/hMassSigma0BeforeSel"), sigma.sigmaMass()); @@ -693,16 +950,40 @@ struct sigmaanalysis { histos.fill(HIST("MC/hPtLambdaCand_BeforeSel"), sigma.lambdaPt()); histos.fill(HIST("MC/hPtSigmaCand_BeforeSel"), sigma.sigmapT()); - if (sigma.photonCandPDGCode() == 22) + if (sigma.photonCandPDGCode() == 22) { histos.fill(HIST("MC/hPtTrueGamma_BeforeSel"), sigma.photonPt()); - if (sigma.lambdaCandPDGCode() == 3122) + if (sigma.photonMCPt() > 0) { + histos.fill(HIST("MC/h3dGammaPtResoVsTPCCR"), 1.f / sigma.lambdaMCPt(), 1.f / sigma.lambdaPt() - 1.f / sigma.lambdaMCPt(), -1 * sigma.photonNegTPCCrossedRows()); // 1/pT resolution + histos.fill(HIST("MC/h3dGammaPtResoVsTPCCR"), 1.f / sigma.lambdaMCPt(), 1.f / sigma.lambdaPt() - 1.f / sigma.lambdaMCPt(), sigma.photonPosTPCCrossedRows()); // 1/pT resolution + histos.fill(HIST("MC/h2dGammaPtResolution"), 1.f / sigma.photonMCPt(), 1.f / sigma.photonPt() - 1.f / sigma.photonMCPt()); // pT resolution + } + } + if (sigma.lambdaCandPDGCode() == 3122) { histos.fill(HIST("MC/hPtTrueLambda_BeforeSel"), sigma.lambdaPt()); - if (sigma.lambdaCandPDGCode() == -3122) + if (sigma.lambdaMCPt() > 0) { + histos.fill(HIST("MC/h2dLambdaPtResolution"), 1.f / sigma.lambdaMCPt(), 1.f / sigma.lambdaPt() - 1.f / sigma.lambdaMCPt()); // 1/pT resolution + histos.fill(HIST("MC/h3dLambdaPtResoVsTPCCR"), 1.f / sigma.lambdaMCPt(), 1.f / sigma.lambdaPt() - 1.f / sigma.lambdaMCPt(), -1 * sigma.lambdaNegTPCCrossedRows()); // 1/pT resolution + histos.fill(HIST("MC/h3dLambdaPtResoVsTPCCR"), 1.f / sigma.lambdaMCPt(), 1.f / sigma.lambdaPt() - 1.f / sigma.lambdaMCPt(), sigma.lambdaPosTPCCrossedRows()); // 1/pT resolution + } + } + if (sigma.lambdaCandPDGCode() == -3122) { + if (sigma.lambdaMCPt() > 0) { + histos.fill(HIST("MC/h2dAntiLambdaPtResolution"), 1.f / sigma.lambdaMCPt(), 1.f / sigma.lambdaPt() - 1.f / sigma.lambdaMCPt()); // pT resolution + histos.fill(HIST("MC/h3dAntiLambdaPtResoVsTPCCR"), 1.f / sigma.lambdaMCPt(), 1.f / sigma.lambdaPt() - 1.f / sigma.lambdaMCPt(), -1 * sigma.lambdaNegTPCCrossedRows()); // 1/pT resolution + histos.fill(HIST("MC/h3dAntiLambdaPtResoVsTPCCR"), 1.f / sigma.lambdaMCPt(), 1.f / sigma.lambdaPt() - 1.f / sigma.lambdaMCPt(), sigma.lambdaPosTPCCrossedRows()); // 1/pT resolution + } histos.fill(HIST("MC/hPtTrueAntiLambda_BeforeSel"), sigma.lambdaPt()); - if (sigma.isSigma()) + } + if (sigma.isSigma()) { histos.fill(HIST("MC/hPtTrueSigma_BeforeSel"), sigma.sigmapT()); - if (sigma.isAntiSigma()) + if (sigma.sigmaMCPt() > 0) + histos.fill(HIST("MC/h2dSigma0PtResolution"), 1.f / sigma.sigmaMCPt(), 1.f / sigma.sigmapT() - 1.f / sigma.sigmaMCPt()); // pT resolution + } + if (sigma.isAntiSigma()) { histos.fill(HIST("MC/hPtTrueAntiSigma_BeforeSel"), sigma.sigmapT()); + if (sigma.sigmaMCPt() > 0) + histos.fill(HIST("MC/h2dAntiSigma0PtResolution"), 1.f / sigma.sigmaMCPt(), 1.f / sigma.sigmapT() - 1.f / sigma.sigmaMCPt()); // pT resolution + } if (sigma.lambdaAlpha() > 0) { // Lambda Analysis if (!processSigmaCandidate(sigma, true)) @@ -715,18 +996,22 @@ struct sigmaanalysis { if (sigma.lambdaCandPDGCode() == 3122) { histos.fill(HIST("MC/hPtTrueLambda_AfterSel"), sigma.lambdaPt()); - histos.fill(HIST("MC/h3dLambdaPtResolution"), sigma.lambdaPt(), TMath::Abs((sigma.lambdaMCPt() - sigma.lambdaPt()) / sigma.lambdaMCPt()), sigma.lambdaMass()); // pT resolution histos.fill(HIST("MC/h3dTPCvsTOFNSigma_TrueLambdaPr"), sigma.lambdaPosPrTPCNSigma(), sigma.lambdaPrTOFNSigma(), sigma.lambdaPt()); histos.fill(HIST("MC/h3dTPCvsTOFNSigma_TrueLambdaPi"), sigma.lambdaNegPiTPCNSigma(), sigma.lambdaPiTOFNSigma(), sigma.lambdaPt()); } histos.fill(HIST("GeneralQA/hLambdaMassSelected"), sigma.lambdaMass()); + histos.fill(HIST("Sigma0/hMassSigma0"), sigma.sigmaMass()); + histos.fill(HIST("Sigma0/hPtSigma0"), sigma.sigmapT()); + histos.fill(HIST("Sigma0/hRapiditySigma0"), sigma.sigmaRapidity()); + histos.fill(HIST("Sigma0/h3dMassSigma0"), sigma.sigmaCentrality(), sigma.sigmapT(), sigma.sigmaMass()); + histos.fill(HIST("Sigma0/h3dPhotonRadiusVsMassSigma0"), sigma.sigmaCentrality(), sigma.photonRadius(), sigma.sigmaMass()); + if (sigma.isSigma()) { // Signal study histos.fill(HIST("MC/h2dArmenterosAfterSel"), sigma.photonAlpha(), sigma.photonQt()); histos.fill(HIST("MC/h2dArmenterosAfterSel"), sigma.lambdaAlpha(), sigma.lambdaQt()); histos.fill(HIST("MC/hMassSigma0"), sigma.sigmaMass()); histos.fill(HIST("MC/hPtSigma0"), sigma.sigmapT()); histos.fill(HIST("MC/h3dMassSigma0"), sigma.sigmaCentrality(), sigma.sigmapT(), sigma.sigmaMass()); - histos.fill(HIST("MC/h3dSigma0PtResolution"), sigma.sigmapT(), TMath::Abs((sigma.sigmaMCPt() - sigma.sigmapT()) / sigma.sigmaMCPt()), sigma.sigmaMass()); // pT resolution histos.fill(HIST("MC/h2dPtVsMassSigma_SignalOnly"), sigma.sigmapT(), sigma.sigmaMass()); histos.fill(HIST("MC/hPtTrueSigma_AfterSel"), sigma.sigmapT()); } @@ -736,12 +1021,15 @@ struct sigmaanalysis { if (sigma.lambdaCandPDGCode() == -3122) { histos.fill(HIST("MC/hPtTrueAntiLambda_AfterSel"), sigma.lambdaPt()); - histos.fill(HIST("MC/h3dAntiLambdaPtResolution"), sigma.lambdaPt(), TMath::Abs((sigma.lambdaMCPt() - sigma.lambdaPt()) / sigma.lambdaMCPt()), sigma.antilambdaMass()); // pT resolution histos.fill(HIST("MC/h3dTPCvsTOFNSigma_TrueALambdaPr"), sigma.lambdaNegPrTPCNSigma(), sigma.aLambdaPrTOFNSigma(), sigma.lambdaPt()); histos.fill(HIST("MC/h3dTPCvsTOFNSigma_TrueALambdaPi"), sigma.lambdaPosPiTPCNSigma(), sigma.aLambdaPiTOFNSigma(), sigma.lambdaPt()); } - histos.fill(HIST("GeneralQA/hAntiLambdaMassSelected"), sigma.antilambdaMass()); + histos.fill(HIST("AntiSigma0/hMassAntiSigma0"), sigma.sigmaMass()); + histos.fill(HIST("AntiSigma0/hPtAntiSigma0"), sigma.sigmapT()); + histos.fill(HIST("AntiSigma0/hRapidityAntiSigma0"), sigma.sigmaRapidity()); + histos.fill(HIST("AntiSigma0/h3dMassAntiSigma0"), sigma.sigmaCentrality(), sigma.sigmapT(), sigma.sigmaMass()); + histos.fill(HIST("AntiSigma0/h3dPhotonRadiusVsMassAntiSigma0"), sigma.sigmaCentrality(), sigma.photonRadius(), sigma.sigmaMass()); if (sigma.isAntiSigma()) { // Signal study histos.fill(HIST("MC/h2dArmenterosAfterSel"), sigma.photonAlpha(), sigma.photonQt()); histos.fill(HIST("MC/h2dArmenterosAfterSel"), sigma.lambdaAlpha(), sigma.lambdaQt()); @@ -760,7 +1048,6 @@ struct sigmaanalysis { if (sigma.photonCandPDGCode() == 22) { histos.fill(HIST("MC/hPtTrueGamma_AfterSel"), sigma.photonPt()); - histos.fill(HIST("MC/h3dGammaPtResolution"), sigma.photonPt(), TMath::Abs((sigma.photonMCPt() - sigma.photonPt()) / sigma.photonMCPt()), sigma.photonMass()); // pT resolution } // For background studies: @@ -817,10 +1104,8 @@ struct sigmaanalysis { histos.fill(HIST("Sigma0/hPtSigma0"), sigma.sigmapT()); histos.fill(HIST("Sigma0/hRapiditySigma0"), sigma.sigmaRapidity()); histos.fill(HIST("Sigma0/h3dMassSigma0"), sigma.sigmaCentrality(), sigma.sigmapT(), sigma.sigmaMass()); + histos.fill(HIST("Sigma0/h3dPhotonRadiusVsMassSigma0"), sigma.sigmaCentrality(), sigma.photonRadius(), sigma.sigmaMass()); - // Low-IR - // Normal IR - // High-IR } else { // Perform analysis selection for antisigma0 @@ -834,14 +1119,28 @@ struct sigmaanalysis { histos.fill(HIST("AntiSigma0/hPtAntiSigma0"), sigma.sigmapT()); histos.fill(HIST("AntiSigma0/hRapidityAntiSigma0"), sigma.sigmaRapidity()); histos.fill(HIST("AntiSigma0/h3dMassAntiSigma0"), sigma.sigmaCentrality(), sigma.sigmapT(), sigma.sigmaMass()); + histos.fill(HIST("AntiSigma0/h3dPhotonRadiusVsMassAntiSigma0"), sigma.sigmaCentrality(), sigma.photonRadius(), sigma.sigmaMass()); } histos.fill(HIST("GeneralQA/hPhotonMassSelected"), sigma.photonMass()); } } + void processCollisions(soa::Join const& collisions) + { + for (const auto& coll : collisions) { + if (!IsEventAccepted(coll)) { + continue; + } + double interactionRate = rateFetcher.fetch(ccdb.service, coll.timestamp(), coll.runNumber(), irSource) * 1.e-3; + histos.fill(HIST("GeneralQA/hInteractionRatePerColl"), interactionRate); + histos.fill(HIST("GeneralQA/hCentralityVsInteractionRatePerColl"), coll.centFT0C(), interactionRate); + } + } + // PROCESS_SWITCH(sigmaanalysis, processCounterQA, "Check standard counter correctness", true); PROCESS_SWITCH(sigmaanalysis, processMonteCarlo, "Do Monte-Carlo-based analysis", false); PROCESS_SWITCH(sigmaanalysis, processRealData, "Do real data analysis", true); + PROCESS_SWITCH(sigmaanalysis, processCollisions, "Process collisions to retrieve IR info", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 9eb20f575a594aa7ac266b21b602c11d80d66396 Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Fri, 21 Feb 2025 23:44:04 +0100 Subject: [PATCH 0374/1650] [PWGLF] Refactor + allow non-tracked cascades (#10125) --- PWGLF/DataModel/LFNonPromptCascadeTables.h | 161 ++++- PWGLF/Tasks/Strangeness/nonPromptCascade.cxx | 650 ++++++++----------- 2 files changed, 405 insertions(+), 406 deletions(-) diff --git a/PWGLF/DataModel/LFNonPromptCascadeTables.h b/PWGLF/DataModel/LFNonPromptCascadeTables.h index e6ed9470c46..288cd1778c3 100644 --- a/PWGLF/DataModel/LFNonPromptCascadeTables.h +++ b/PWGLF/DataModel/LFNonPromptCascadeTables.h @@ -72,16 +72,14 @@ DECLARE_SOA_COLUMN(V0Radius, v0Radius, float); DECLARE_SOA_COLUMN(CascLenght, cascLenght, float); DECLARE_SOA_COLUMN(V0Lenght, v0Lenght, float); -DECLARE_SOA_COLUMN(CascNClusITS, cascNClusITS, int); -DECLARE_SOA_COLUMN(ProtonNClusITS, protonNClusITS, int); -DECLARE_SOA_COLUMN(PionNClusITS, pionNClusITS, int); -DECLARE_SOA_COLUMN(BachKaonNClusITS, bachKaonNClusITS, int); -DECLARE_SOA_COLUMN(BachPionNClusITS, bachPionNClusITS, int); +DECLARE_SOA_COLUMN(CascNClusITS, cascNClusITS, int16_t); +DECLARE_SOA_COLUMN(ProtonNClusITS, protonNClusITS, int16_t); +DECLARE_SOA_COLUMN(PionNClusITS, pionNClusITS, int16_t); +DECLARE_SOA_COLUMN(BachNClusITS, bachNClusITS, int16_t); -DECLARE_SOA_COLUMN(ProtonNClusTPC, protonNClusTPC, int); -DECLARE_SOA_COLUMN(PionNClusTPC, pionNClusTPC, int); -DECLARE_SOA_COLUMN(BachKaonNClusTPC, bachKaonNClusTPC, int); -DECLARE_SOA_COLUMN(BachPionNClusTPC, bachPionNClusTPC, int); +DECLARE_SOA_COLUMN(ProtonNClusTPC, protonNClusTPC, int16_t); +DECLARE_SOA_COLUMN(PionNClusTPC, pionNClusTPC, int16_t); +DECLARE_SOA_COLUMN(BachNClusTPC, bachNClusTPC, int16_t); DECLARE_SOA_COLUMN(ProtonTPCNSigma, protonTPCNSigma, float); DECLARE_SOA_COLUMN(PionTPCNSigma, pionTPCNSigma, float); @@ -90,8 +88,7 @@ DECLARE_SOA_COLUMN(BachPionTPCNSigma, bachPionTPCNSigma, float); DECLARE_SOA_COLUMN(ProtonHasTOF, protonHasTOF, bool); DECLARE_SOA_COLUMN(PionHasTOF, pionHasTOF, bool); -DECLARE_SOA_COLUMN(BachKaonHasTOF, bachKaonHasTOF, bool); -DECLARE_SOA_COLUMN(BachPionHasTOF, bachPionHasTOF, bool); +DECLARE_SOA_COLUMN(BachHasTOF, bachHasTOF, bool); DECLARE_SOA_COLUMN(ProtonTOFNSigma, protonTOFNSigma, float); DECLARE_SOA_COLUMN(PionTOFNSigma, pionTOFNSigma, float); @@ -147,20 +144,72 @@ DECLARE_SOA_TABLE(NPCascTable, "AOD", "NPCASCTABLE", NPCascadeTable::CascNClusITS, NPCascadeTable::ProtonNClusITS, NPCascadeTable::PionNClusITS, - NPCascadeTable::BachKaonNClusITS, - NPCascadeTable::BachPionNClusITS, + NPCascadeTable::BachNClusITS, NPCascadeTable::ProtonNClusTPC, NPCascadeTable::PionNClusTPC, - NPCascadeTable::BachKaonNClusTPC, - NPCascadeTable::BachPionNClusTPC, + NPCascadeTable::BachNClusTPC, NPCascadeTable::ProtonTPCNSigma, NPCascadeTable::PionTPCNSigma, NPCascadeTable::BachKaonTPCNSigma, NPCascadeTable::BachPionTPCNSigma, NPCascadeTable::ProtonHasTOF, NPCascadeTable::PionHasTOF, - NPCascadeTable::BachKaonHasTOF, - NPCascadeTable::BachPionHasTOF, + NPCascadeTable::BachHasTOF, + NPCascadeTable::ProtonTOFNSigma, + NPCascadeTable::PionTOFNSigma, + NPCascadeTable::BachKaonTOFNSigma, + NPCascadeTable::BachPionTOFNSigma) + +DECLARE_SOA_TABLE(NPCascTableNT, "AOD", "NPCASCTABLENT", + NPCascadeTable::MatchingChi2, + NPCascadeTable::DeltaPtITSCascade, + NPCascadeTable::ITSClusSize, + NPCascadeTable::HasReassociatedCluster, + aod::collision::NumContrib, + aod::collision::CollisionTimeRes, + NPCascadeTable::PvX, + NPCascadeTable::PvY, + NPCascadeTable::PvZ, + NPCascadeTable::CascPt, + NPCascadeTable::CascEta, + NPCascadeTable::CascPhi, + NPCascadeTable::ProtonPt, + NPCascadeTable::ProtonEta, + NPCascadeTable::PionPt, + NPCascadeTable::PionEta, + NPCascadeTable::BachPt, + NPCascadeTable::BachEta, + NPCascadeTable::CascDCAxy, + NPCascadeTable::CascDCAz, + NPCascadeTable::ProtonDCAxy, + NPCascadeTable::ProtonDCAz, + NPCascadeTable::PionDCAxy, + NPCascadeTable::PionDCAz, + NPCascadeTable::BachDCAxy, + NPCascadeTable::BachDCAz, + NPCascadeTable::CascCosPA, + NPCascadeTable::V0CosPA, + NPCascadeTable::MassXi, + NPCascadeTable::MassOmega, + NPCascadeTable::MassV0, + NPCascadeTable::CascRadius, + NPCascadeTable::V0Radius, + NPCascadeTable::CascLenght, + NPCascadeTable::V0Lenght, + NPCascadeTable::CascNClusITS, + NPCascadeTable::ProtonNClusITS, + NPCascadeTable::PionNClusITS, + NPCascadeTable::BachNClusITS, + NPCascadeTable::ProtonNClusTPC, + NPCascadeTable::PionNClusTPC, + NPCascadeTable::BachNClusTPC, + NPCascadeTable::ProtonTPCNSigma, + NPCascadeTable::PionTPCNSigma, + NPCascadeTable::BachKaonTPCNSigma, + NPCascadeTable::BachPionTPCNSigma, + NPCascadeTable::ProtonHasTOF, + NPCascadeTable::PionHasTOF, + NPCascadeTable::BachHasTOF, NPCascadeTable::ProtonTOFNSigma, NPCascadeTable::PionTOFNSigma, NPCascadeTable::BachKaonTOFNSigma, @@ -211,20 +260,86 @@ DECLARE_SOA_TABLE(NPCascTableMC, "AOD", "NPCASCTABLEMC", NPCascadeTable::CascNClusITS, NPCascadeTable::ProtonNClusITS, NPCascadeTable::PionNClusITS, - NPCascadeTable::BachKaonNClusITS, - NPCascadeTable::BachPionNClusITS, + NPCascadeTable::BachNClusITS, + NPCascadeTable::ProtonNClusTPC, + NPCascadeTable::PionNClusTPC, + NPCascadeTable::BachNClusTPC, + NPCascadeTable::ProtonTPCNSigma, + NPCascadeTable::PionTPCNSigma, + NPCascadeTable::BachKaonTPCNSigma, + NPCascadeTable::BachPionTPCNSigma, + NPCascadeTable::ProtonHasTOF, + NPCascadeTable::PionHasTOF, + NPCascadeTable::BachHasTOF, + NPCascadeTable::ProtonTOFNSigma, + NPCascadeTable::PionTOFNSigma, + NPCascadeTable::BachKaonTOFNSigma, + NPCascadeTable::BachPionTOFNSigma, + NPCascadeTable::gPt, + NPCascadeTable::gEta, + NPCascadeTable::gPhi, + NPCascadeTable::PDGcode, + NPCascadeTable::DCAxMC, + NPCascadeTable::DCAyMC, + NPCascadeTable::DCAzMC, + NPCascadeTable::MCcollisionMatch) + +DECLARE_SOA_TABLE(NPCascTableMCNT, "AOD", "NPCASCTABLEMCNT", + NPCascadeTable::MatchingChi2, + NPCascadeTable::DeltaPtITSCascade, + NPCascadeTable::ITSClusSize, + NPCascadeTable::HasReassociatedCluster, + NPCascadeTable::IsGoodMatch, + NPCascadeTable::IsGoodCascade, + NPCascadeTable::PdgCodeMom, + NPCascadeTable::PdgCodeITStrack, + NPCascadeTable::IsFromBeauty, + NPCascadeTable::IsFromCharm, + aod::collision::NumContrib, + aod::collision::CollisionTimeRes, + NPCascadeTable::PvX, + NPCascadeTable::PvY, + NPCascadeTable::PvZ, + NPCascadeTable::CascPt, + NPCascadeTable::CascEta, + NPCascadeTable::CascPhi, + NPCascadeTable::ProtonPt, + NPCascadeTable::ProtonEta, + NPCascadeTable::PionPt, + NPCascadeTable::PionEta, + NPCascadeTable::BachPt, + NPCascadeTable::BachEta, + NPCascadeTable::CascDCAxy, + NPCascadeTable::CascDCAz, + NPCascadeTable::ProtonDCAxy, + NPCascadeTable::ProtonDCAz, + NPCascadeTable::PionDCAxy, + NPCascadeTable::PionDCAz, + NPCascadeTable::BachDCAxy, + NPCascadeTable::BachDCAz, + NPCascadeTable::CascCosPA, + NPCascadeTable::V0CosPA, + NPCascadeTable::MassXi, + NPCascadeTable::MassOmega, + NPCascadeTable::MassV0, + NPCascadeTable::CascRadius, + NPCascadeTable::V0Radius, + NPCascadeTable::CascLenght, + NPCascadeTable::V0Lenght, + NPCascadeTable::CascNClusITS, + NPCascadeTable::ProtonNClusITS, + NPCascadeTable::PionNClusITS, + NPCascadeTable::BachNClusITS, NPCascadeTable::ProtonNClusTPC, NPCascadeTable::PionNClusTPC, - NPCascadeTable::BachKaonNClusTPC, - NPCascadeTable::BachPionNClusTPC, + NPCascadeTable::BachNClusTPC, NPCascadeTable::ProtonTPCNSigma, NPCascadeTable::PionTPCNSigma, NPCascadeTable::BachKaonTPCNSigma, NPCascadeTable::BachPionTPCNSigma, NPCascadeTable::ProtonHasTOF, NPCascadeTable::PionHasTOF, - NPCascadeTable::BachKaonHasTOF, - NPCascadeTable::BachPionHasTOF, + NPCascadeTable::BachHasTOF, NPCascadeTable::ProtonTOFNSigma, NPCascadeTable::PionTOFNSigma, NPCascadeTable::BachKaonTOFNSigma, diff --git a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx index 14ea3c9e689..45770d24067 100644 --- a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx +++ b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx @@ -14,6 +14,8 @@ #include #include +#include "Math/Vector4D.h" + #include "CCDB/BasicCCDBManager.h" #include "Common/DataModel/Centrality.h" #include "Common/DataModel/EventSelection.h" @@ -95,40 +97,23 @@ struct NPCascCandidate { int cascNClusITS; int protonNClusITS; int pionNClusITS; - int bachKaonNClusITS; - int bachPionNClusITS; + int bachNClusITS; int protonNClusTPC; int pionNClusTPC; - int bachKaonNClusTPC; - int bachPionNClusTPC; + int bachNClusTPC; float protonTPCNSigma; float pionTPCNSigma; float bachKaonTPCNSigma; float bachPionTPCNSigma; bool protonHasTOF; bool pionHasTOF; - bool bachKaonHasTOF; - bool bachPionHasTOF; + bool bachHasTOF; float protonTOFNSigma; float pionTOFNSigma; float bachKaonTOFNSigma; float bachPionTOFNSigma; }; -struct motherDCA { - float DCAxy; - float DCAz; -}; - -struct daughtersDCA { - float bachDCAxy; - float bachDCAz; - float protonDCAxy; - float protonDCAz; - float pionDCAxy; - float pionDCAz; -}; - std::array isFromHF(auto& particle) { bool fromBeauty = false; @@ -160,13 +145,9 @@ static constexpr float cutsPID[nParticles][nCutsPID]{ {-4.f, +4.f}, /*Pr*/ {-4.f, +4.f}, /*Pi*/ }; -std::shared_ptr h2TPCsignal[nParticles]; -std::shared_ptr h2TPCnSigma[nParticles]; - -std::shared_ptr invMassBCV0; -std::shared_ptr invMassACV0; -std::vector candidates; +std::vector gCandidates; +std::vector gCandidatesNT; } // namespace @@ -174,6 +155,8 @@ struct NonPromptCascadeTask { Produces NPCTable; Produces NPCTableMC; + Produces NPCTableNT; + Produces NPCTableMCNT; Produces NPCTableGen; using TracksExtData = soa::Join; @@ -182,72 +165,30 @@ struct NonPromptCascadeTask { using CollisionCandidatesRun3MC = soa::Join; Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; - Configurable propToDCA{"propToDCA", true, "create tracks version propagated to PCA"}; - Configurable useAbsDCA{"useAbsDCA", true, "Minimise abs. distance rather than chi2"}; - Configurable maxR{"maxR", 200., "reject PCA's above this radius"}; - Configurable maxDZIni{"maxDZIni", 4., "reject (if>0) PCA candidate if tracks DZ exceeds threshold"}; - Configurable minParamChange{"minParamChange", 1.e-3, "stop iterations if largest change of any X is smaller than this"}; - Configurable minRelChi2Change{"minRelChi2Change", 0.9, "stop iterations if chi2/chi2old > this"}; + Configurable cfgPropToPCA{"cfgPropToPCA", true, "create tracks version propagated to PCA"}; + Configurable cfgUseAbsDCA{"cfgUseAbsDCA", true, "Minimise abs. distance rather than chi2"}; + Configurable cfgMaxR{"cfgMaxR", 200., "reject PCA's above this radius"}; + Configurable cfgMaxDZIni{"cfgMaxDZIni", 4., "reject (if>0) PCA candidate if tracks DZ exceeds threshold"}; + Configurable cfgMinParamChange{"cfgMinParamChange", 1.e-3, "stop iterations if largest change of any X is smaller than this"}; + Configurable cfgMinRelChi2Change{"cfgMinRelChi2Change", 0.9, "stop iterations if chi2/chi2old > this"}; Configurable cfgMaterialCorrection{"cfgMaterialCorrection", static_cast(o2::base::Propagator::MatCorrType::USEMatCorrLUT), "Type of material correction"}; Configurable cfgGRPmagPath{"cfgGRPmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + Configurable cfgSelectOnlyOmegas{"cfgSelectOnlyOmegas", false, "Toggle to select only Omegas"}; - Configurable cfgCutNclusTPC{"cfgCutNclusTPC", 70, "Minimum number of TPC clusters"}; + Configurable cfgCutNclusTPC{"cfgCutNclusTPC", 70, "Minimum number of TPC clusters"}; + Configurable cfgMinCosPA{"cfgMinCosPA", -1.f, "Minimum cosine of pointing angle"}; Configurable> cfgCutsPID{"particlesCutsPID", {cutsPID[0], nParticles, nCutsPID, particlesNames, cutsNames}, "Nuclei PID selections"}; Configurable cfgSkimmedProcessing{"cfgSkimmedProcessing", true, "Skimmed dataset processing"}; - Zorro zorro; - OutputObj zorroSummary{"zorroSummary"}; + Zorro mZorro; + OutputObj mZorroSummary{"ZorroSummary"}; - Service ccdb; + Service mCCDB; int mRunNumber = 0; float mBz = 0.f; + o2::vertexing::DCAFitterN<2> mDCAFitter; - HistogramRegistry registry{ - "registry", - { - {"h_PV_x", "Primary vertex x;x (cm)", {HistType::kTH1D, {{100, -1., 1.}}}}, - {"h_PV_y", "Primary vertex y;y (cm)", {HistType::kTH1D, {{100, -1., 1.}}}}, - {"h_PV_z", "Primary vertex z;z (cm)", {HistType::kTH1D, {{100, -1., 1.}}}}, - - {"h_dca_Omega", "DCA;DCA (cm)", {HistType::kTH1D, {{200, 0., .5}}}}, - {"h_dcaxy_Omega", "DCA xy;DCA_{xy} (cm)", {HistType::kTH1D, {{200, -.5, .5}}}}, - {"h_dcaz_Omega", "DCA z;DCA_{z} (cm)", {HistType::kTH1D, {{200, -.5, .5}}}}, - {"h_bachdcaxyM_Omega", "Bachelor DCA xy;DCA_{xy} (cm)", {HistType::kTH1D, {{200, -1., 1.}}}}, - {"h_bachdcaxyAM_Omega", "Bachelor DCA xy;DCA_{xy} (cm)", {HistType::kTH1D, {{200, -1., 1.}}}}, - {"h_bachdcazM_Omega", "Bachelor DCA z;DCA_{z} (cm)", {HistType::kTH1D, {{200, -1., 1.}}}}, - {"h_bachdcazAM_Omega", "Bachelor DCA z;DCA_{z} (cm)", {HistType::kTH1D, {{200, -1., 1.}}}}, - {"h_dcavspt_Omega", "DCA vs p_{T};DCA (cm);p_{T} (GeV/#it{c})", {HistType::kTH2D, {{100, -0.1, 0.1}, {50, 0., 10.}}}}, - {"h_bachdcavspt_Omega", "Bachelor DCA vs p_{T};DCA (cm);p_{T} (GeV/#it{c})", {HistType::kTH2D, {{200, -1., 1.}, {50, 0., 10.}}}}, - {"h_bachdcavsr_Omega", "Bachelor DCA vs R (cm);DCA (cm);R (cm)", {HistType::kTH2D, {{200, -1., 1.}, {50, 0., 30.}}}}, - {"h_ntrackdcavspt_Omega", "N track DCA vs p_{T};DCA (cm);p_{T} (GeV/#it{c})", {HistType::kTH2D, {{200, -1., 1.}, {50, 0., 10.}}}}, - {"h_ptrackdcavspt_Omega", "P track DCA vs p_{T};DCA (cm);p_{T} (GeV/#it{c})", {HistType::kTH2D, {{200, -1., 1.}, {50, 0., 10.}}}}, - {"h_dcavsr_Omega", "DCA vs R;DCA (cm);R (cm)", {HistType::kTH2D, {{200, -.5, .5}, {200, 0., 5.}}}}, - {"h_massvspt_Omega", "Mass vs p_{T};Mass (GeV/#it{c}^2);p_{T} (GeV/#it{c})", {HistType::kTH2D, {{125, 1.650, 1.700}, {50, 0., 10.}}}}, - {"h_buildermassvspt_Omega", "Mass (from builder) vs p_{T};Mass (GeV/#it{c}^2);p_{T} (GeV/#it{c})", {HistType::kTH2D, {{125, 1.650, 1.700}, {50, 0., 10.}}}}, - {"h_massvsmass_Omega", "Mass vs mass;Mass (GeV/#it{c}^{2});Mass (GeV/#it{c}^{2})", {HistType::kTH2D, {{125, 1.650, 1.700}, {125, 1.650, 1.700}}}}, - {"h_bachelorsign_Omega", "Bachelor sign;Sign;Counts", {HistType::kTH1D, {{6, -3., 3.}}}}, - - {"h_dca_Xi", "DCA;DCA (cm)", {HistType::kTH1D, {{200, 0., .5}}}}, - {"h_dcaxy_Xi", "DCA xy;DCA_{xy} (cm)", {HistType::kTH1D, {{200, -.5, .5}}}}, - {"h_dcaz_Xi", "DCA z;DCA_{z} (cm)", {HistType::kTH1D, {{200, -.5, .5}}}}, - {"h_bachdcaxyM_Xi", "Bachelor DCA xy;DCA_{xy} (cm)", {HistType::kTH1D, {{200, -1., 1.}}}}, - {"h_bachdcaxyAM_Xi", "Bachelor DCA xy;DCA_{xy} (cm)", {HistType::kTH1D, {{200, -1., 1.}}}}, - {"h_bachdcazM_Xi", "Bachelor DCA z;DCA_{z} (cm)", {HistType::kTH1D, {{200, -1., 1.}}}}, - {"h_bachdcazAM_Xi", "Bachelor DCA z;DCA_{z} (cm)", {HistType::kTH1D, {{200, -1., 1.}}}}, - {"h_dcavspt_Xi", "DCA vs p_{T};DCA (cm);p_{T} (GeV/#it{c})", {HistType::kTH2D, {{100, -0.1, 0.1}, {50, 0., 10.}}}}, - {"h_bachdcavspt_Xi", "Bachelor DCA vs p_{T};DCA (cm);p_{T} (GeV/#it{c})", {HistType::kTH2D, {{200, -1., 1.}, {50, 0., 10.}}}}, - {"h_bachdcavsr_Xi", "Bachelor DCA vs R (cm);DCA (cm);R (cm)", {HistType::kTH2D, {{200, -1., 1.}, {50, 0., 30.}}}}, - {"h_ntrackdcavspt_Xi", "N track DCA vs p_{T};DCA (cm);p_{T} (GeV/#it{c})", {HistType::kTH2D, {{200, -1., 1.}, {50, 0., 10.}}}}, - {"h_ptrackdcavspt_Xi", "P track DCA vs p_{T};DCA (cm);p_{T} (GeV/#it{c})", {HistType::kTH2D, {{200, -1., 1.}, {50, 0., 10.}}}}, - {"h_dcavsr_Xi", "DCA vs R;DCA (cm);R (cm)", {HistType::kTH2D, {{200, -.5, .5}, {200, 0., 5.}}}}, - {"h_massvspt_Xi", "Mass vs p_{T};Mass (GeV/#it{c}^2);p_{T} (GeV/#it{c})", {HistType::kTH2D, {{125, 1.296, 1.346}, {50, 0., 10.}}}}, - {"h_buildermassvspt_Xi", "Mass (from builder) vs p_{T};Mass (GeV/#it{c}^2);p_{T} (GeV/#it{c})", {HistType::kTH2D, {{125, 1.296, 1.346}, {50, 0., 10.}}}}, - {"h_massvsmass_Xi", "Mass vs mass;Mass (GeV/#it{c}^{2});Mass (GeV/#it{c}^{2})", {HistType::kTH2D, {{125, 1.296, 1.346}, {125, 1.296, 1.346}}}}, - {"h_bachelorsign_Xi", "Bachelor sign;Sign;Counts", {HistType::kTH1D, {{6, -3., 3.}}}}, - - {"h_massvspt_V0", "Mass vs p_{T};Mass (GeV/#it{c}^2);p_{T} (GeV/#it{c})", {HistType::kTH2D, {{125, 1.090, 1.140}, {50, 0., 10.}}}}, - - }}; + HistogramRegistry mRegistry; void initCCDB(aod::BCsWithTimestamps::iterator const& bc) { @@ -256,207 +197,166 @@ struct NonPromptCascadeTask { } mRunNumber = bc.runNumber(); - if (o2::parameters::GRPMagField* grpmag = ccdb->getForRun(cfgGRPmagPath, mRunNumber)) { + if (o2::parameters::GRPMagField* grpmag = mCCDB->getForRun(cfgGRPmagPath, mRunNumber)) { o2::base::Propagator::initFieldFromGRP(grpmag); mBz = static_cast(grpmag->getNominalL3Field()); } + mDCAFitter.setBz(mBz); if (static_cast(cfgMaterialCorrection.value) == o2::base::Propagator::MatCorrType::USEMatCorrLUT) { - auto* lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->getForRun("GLO/Param/MatLUT", mRunNumber)); + auto* lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(mCCDB->getForRun("GLO/Param/MatLUT", mRunNumber)); o2::base::Propagator::Instance(true)->setMatLUT(lut); } } void init(InitContext const&) { - zorroSummary.setObject(zorro.getZorroSummary()); - ccdb->setURL(ccdbUrl); - ccdb->setFatalWhenNull(true); - ccdb->setCaching(true); - ccdb->setLocalObjectValidityChecking(); + mZorroSummary.setObject(mZorro.getZorroSummary()); + mCCDB->setURL(ccdbUrl); + mCCDB->setFatalWhenNull(true); + mCCDB->setCaching(true); + mCCDB->setLocalObjectValidityChecking(); + + mDCAFitter.setPropagateToPCA(cfgPropToPCA); + mDCAFitter.setMaxR(cfgMaxR); + mDCAFitter.setMaxDZIni(cfgMaxDZIni); + mDCAFitter.setMinParamChange(cfgMinParamChange); + mDCAFitter.setMinRelChi2Change(cfgMinRelChi2Change); + mDCAFitter.setUseAbsDCA(cfgUseAbsDCA); std::vector ptBinning = {0.4, 0.8, 1.2, 1.6, 2.0, 2.4, 2.8, 3.2, 3.6, 4.0, 4.4, 4.8, 5.2, 5.6, 6.0}; AxisSpec ptAxis = {ptBinning, "#it{p}_{T} (GeV/#it{c})"}; - auto cutsOmega{std::get>(registry.add("h_PIDcutsOmega", ";;Invariant mass (GeV/#it{c}^{2})", HistType::kTH2D, {{6, -0.5, 5.5}, {125, 1.650, 1.700}}))}; - cutsOmega->GetXaxis()->SetBinLabel(1, "Tot #Omega"); - cutsOmega->GetXaxis()->SetBinLabel(2, "hasTof"); - cutsOmega->GetXaxis()->SetBinLabel(3, "nClusTPC"); - cutsOmega->GetXaxis()->SetBinLabel(4, "nSigmaTPCbach"); - cutsOmega->GetXaxis()->SetBinLabel(5, "nSigmaTPCprotontrack"); - cutsOmega->GetXaxis()->SetBinLabel(6, "nSigmaTPCpiontrack"); - - auto cutsXi{std::get>(registry.add("h_PIDcutsXi", ";;Invariant mass (GeV/#it{c}^{2})", HistType::kTH2D, {{6, -0.5, 5.5}, {125, 1.296, 1.346}}))}; - cutsXi->GetXaxis()->SetBinLabel(1, "Tot #Xi"); - cutsXi->GetXaxis()->SetBinLabel(2, "hasTof"); - cutsXi->GetXaxis()->SetBinLabel(3, "nClusTPC"); - cutsXi->GetXaxis()->SetBinLabel(4, "nSigmaTPCbach"); - cutsXi->GetXaxis()->SetBinLabel(5, "nSigmaTPCprotontrack"); - cutsXi->GetXaxis()->SetBinLabel(6, "nSigmaTPCpiontrack"); - - invMassBCV0 = registry.add("h_invariantmass_beforeCuts_V0", "Invariant Mass (GeV/#it{c}^{2})", HistType::kTH1D, {{125, 1.090, 1.140, "Invariant Mass (GeV/#it{c}^{2})"}}); - invMassACV0 = registry.add("h_invariantmass_afterCuts_V0", "Invariant Mass (GeV/#it{c}^{2})", HistType::kTH1D, {{125, 1.090, 1.140, "Invariant Mass (GeV/#it{c}^{2})"}}); - } - - template - void fillCascadeDCA(T const track, PR const& protonTrack, PI const& pionTrack, o2::dataformats::VertexBase primaryVertex, bool isOmega, motherDCA& motherDCA) - { - const auto matCorr = static_cast(cfgMaterialCorrection.value); - auto trackCovTrk = getTrackParCov(track); - o2::dataformats::DCA impactParameterTrk{-999.f, -999.f}; - - if (o2::base::Propagator::Instance()->propagateToDCA(primaryVertex, trackCovTrk, mBz, 2.f, matCorr, &impactParameterTrk)) { - if (protonTrack.hasTPC() && pionTrack.hasTPC()) { - if (isOmega) { - registry.fill(HIST("h_dca_Omega"), std::sqrt(impactParameterTrk.getR2())); - registry.fill(HIST("h_dcaxy_Omega"), impactParameterTrk.getY()); - registry.fill(HIST("h_dcaz_Omega"), impactParameterTrk.getZ()); - registry.fill(HIST("h_dcavspt_Omega"), impactParameterTrk.getY(), track.pt()); - registry.fill(HIST("h_dcavsr_Omega"), impactParameterTrk.getY(), std::hypot(track.x(), track.y())); - } - } + std::array cutsNames{"# candidates", "hasTOF", "nClusTPC", "nSigmaTPCbach", "nSigmaTPCprotontrack", "nSigmaTPCpiontrack", "cosPA"}; + auto cutsOmega{std::get>(mRegistry.add("h_PIDcutsOmega", ";;Invariant mass (GeV/#it{c}^{2})", HistType::kTH2D, {{cutsNames.size(), -0.5, -0.5 + cutsNames.size()}, {125, 1.650, 1.700}}))}; + auto cutsXi{std::get>(mRegistry.add("h_PIDcutsXi", ";;Invariant mass (GeV/#it{c}^{2})", HistType::kTH2D, {{6, -0.5, 5.5}, {125, 1.296, 1.346}}))}; - if (protonTrack.hasTPC() && pionTrack.hasTPC()) { - registry.fill(HIST("h_dca_Xi"), std::sqrt(impactParameterTrk.getR2())); - registry.fill(HIST("h_dcaxy_Xi"), impactParameterTrk.getY()); - registry.fill(HIST("h_dcaz_Xi"), impactParameterTrk.getZ()); - registry.fill(HIST("h_dcavspt_Xi"), impactParameterTrk.getY(), track.pt()); - registry.fill(HIST("h_dcavsr_Xi"), impactParameterTrk.getY(), std::hypot(track.x(), track.y())); - } + for (size_t iBin{0}; iBin < cutsNames.size(); ++iBin) { + cutsOmega->GetYaxis()->SetBinLabel(iBin + 1, cutsNames[iBin].c_str()); + cutsXi->GetYaxis()->SetBinLabel(iBin + 1, cutsNames[iBin].c_str()); } - motherDCA.DCAxy = impactParameterTrk.getY(); - motherDCA.DCAz = impactParameterTrk.getZ(); } - template - void fillDauDCA(TC const& trackedCascade, B const& bachelor, PR const& protonTrack, PI const& pionTrack, o2::dataformats::VertexBase primaryVertex, bool isOmega, daughtersDCA& dDCA) + void zorroAccounting(const auto& collisions) { - const auto matCorr = static_cast(cfgMaterialCorrection.value); - - auto trackCovBach = getTrackParCov(bachelor); - o2::dataformats::DCA impactParameterBach; - if (o2::base::Propagator::Instance()->propagateToDCA(primaryVertex, trackCovBach, mBz, 2.f, matCorr, &impactParameterBach)) { - if (isOmega) { - if (bachelor.sign() < 0) { - registry.fill(HIST("h_bachdcaxyM_Omega"), impactParameterBach.getY()); - registry.fill(HIST("h_bachdcazM_Omega"), impactParameterBach.getZ()); - } else if (bachelor.sign() > 0) { - registry.fill(HIST("h_bachdcaxyAM_Omega"), impactParameterBach.getY()); - registry.fill(HIST("h_bachdcazAM_Omega"), impactParameterBach.getZ()); + if (cfgSkimmedProcessing) { + int runNumber{-1}; + for (const auto& coll : collisions) { + auto bc = coll.template bc_as(); + if (runNumber != bc.runNumber()) { + mZorro.initCCDB(mCCDB.service, bc.runNumber(), bc.timestamp(), "fTrackedOmega"); + mZorro.populateHistRegistry(mRegistry, bc.runNumber()); + runNumber = bc.runNumber(); } - registry.fill(HIST("h_bachdcavspt_Omega"), impactParameterBach.getY(), bachelor.pt()); - registry.fill(HIST("h_bachdcavsr_Omega"), impactParameterBach.getY(), std::hypot(trackedCascade.decayX(), trackedCascade.decayY())); - registry.fill(HIST("h_bachelorsign_Omega"), bachelor.sign()); - } - if (bachelor.sign() < 0) { - registry.fill(HIST("h_bachdcaxyM_Xi"), impactParameterBach.getY()); - registry.fill(HIST("h_bachdcazM_Xi"), impactParameterBach.getZ()); - } else if (bachelor.sign() > 0) { - registry.fill(HIST("h_bachdcaxyAM_Xi"), impactParameterBach.getY()); - registry.fill(HIST("h_bachdcazAM_Xi"), impactParameterBach.getZ()); - } - registry.fill(HIST("h_bachdcavspt_Xi"), impactParameterBach.getY(), bachelor.pt()); - registry.fill(HIST("h_bachdcavsr_Xi"), impactParameterBach.getY(), std::hypot(trackedCascade.decayX(), trackedCascade.decayY())); - registry.fill(HIST("h_bachelorsign_Xi"), bachelor.sign()); - } - - auto trackCovNtrack = getTrackParCov(pionTrack); - o2::dataformats::DCA impactParameterPiontrack; - if (o2::base::Propagator::Instance()->propagateToDCA(primaryVertex, trackCovNtrack, mBz, 2.f, matCorr, &impactParameterPiontrack)) { - if (isOmega) { - registry.fill(HIST("h_ntrackdcavspt_Omega"), impactParameterPiontrack.getY(), pionTrack.pt()); + mZorro.isSelected(bc.globalBC()); /// Just let Zorro do the accounting } - registry.fill(HIST("h_ntrackdcavspt_Xi"), impactParameterPiontrack.getY(), pionTrack.pt()); } - - auto trackCovPtrack = getTrackParCov(protonTrack); - o2::dataformats::DCA impactParameterProtontrack; - if (o2::base::Propagator::Instance()->propagateToDCA(primaryVertex, trackCovPtrack, mBz, 2.f, matCorr, &impactParameterProtontrack)) { - if (isOmega) { - registry.fill(HIST("h_ptrackdcavspt_Omega"), impactParameterProtontrack.getY(), protonTrack.pt()); - } - registry.fill(HIST("h_ptrackdcavspt_Xi"), impactParameterProtontrack.getY(), protonTrack.pt()); - } - - dDCA.bachDCAxy = impactParameterBach.getY(); - dDCA.bachDCAz = impactParameterBach.getZ(); - dDCA.protonDCAxy = impactParameterProtontrack.getY(); - dDCA.protonDCAz = impactParameterProtontrack.getZ(); - dDCA.pionDCAxy = impactParameterPiontrack.getY(); - dDCA.pionDCAz = impactParameterPiontrack.getZ(); } template - void fillCandidatesVector(CollisionType const&, auto const& trackedCascades) + void fillCandidatesVector(CollisionType const&, auto const& cascades, auto& candidates) { + + const auto& getCascade = [](auto const& candidate) { + if constexpr (requires { candidate.cascade(); }) { + return candidate.cascade(); + } else { + return candidate; + } + }; + candidates.clear(); - for (const auto& trackedCascade : trackedCascades) { + for (const auto& candidate : cascades) { - auto collision = trackedCascade.template collision_as(); + auto collision = candidate.template collision_as(); auto bc = collision.template bc_as(); initCCDB(bc); const auto primaryVertex = getPrimaryVertex(collision); - o2::vertexing::DCAFitterN<2> df2; - df2.setBz(mBz); - df2.setPropagateToPCA(propToDCA); - df2.setMaxR(maxR); - df2.setMaxDZIni(maxDZIni); - df2.setMinParamChange(minParamChange); - df2.setMinRelChi2Change(minRelChi2Change); - df2.setUseAbsDCA(useAbsDCA); - - const auto& track = trackedCascade.template track_as(); - const auto& ITStrack = trackedCascade.template itsTrack_as(); - const auto& casc = trackedCascade.cascade(); + const auto& casc = getCascade(candidate); const auto& bachelor = casc.template bachelor_as(); const auto& v0 = casc.v0(); const auto& ptrack = v0.template posTrack_as(); const auto& ntrack = v0.template negTrack_as(); const auto& protonTrack = bachelor.sign() > 0 ? ntrack : ptrack; const auto& pionTrack = bachelor.sign() > 0 ? ptrack : ntrack; - bool hasReassociatedClusters = (track.itsNCls() != ITStrack.itsNCls()); - std::array, 2> momenta; - std::array v0Pos; - std::array masses; + mRegistry.fill(HIST("h_PIDcutsXi"), 0, 1.322); + mRegistry.fill(HIST("h_PIDcutsOmega"), 0, 1.675); - // track propagation - o2::track::TrackParCov trackParCovV0; - o2::track::TrackPar trackParV0; - o2::track::TrackPar trackParBachelor; - std::array cascadeMomentum; + mRegistry.fill(HIST("h_PIDcutsXi"), 1, 1.322); + mRegistry.fill(HIST("h_PIDcutsOmega"), 1, 1.675); + + if (protonTrack.tpcNClsFound() < cfgCutNclusTPC || pionTrack.tpcNClsFound() < cfgCutNclusTPC || bachelor.tpcNClsFound() < cfgCutNclusTPC) { + continue; + } + mRegistry.fill(HIST("h_PIDcutsXi"), 2, 1.322); + mRegistry.fill(HIST("h_PIDcutsOmega"), 2, 1.675); + + // QA PID + float nSigmaTPC[nParticles]{bachelor.tpcNSigmaKa(), bachelor.tpcNSigmaPi(), protonTrack.tpcNSigmaPr(), pionTrack.tpcNSigmaPi()}; + + bool isBachelorSurvived = false; + if (nSigmaTPC[0] > cfgCutsPID->get(0u, 0u) && nSigmaTPC[0] < cfgCutsPID->get(0u, 1u)) { + mRegistry.fill(HIST("h_PIDcutsOmega"), 3, 1.675); + isBachelorSurvived = true; + } + + if (!cfgSelectOnlyOmegas && nSigmaTPC[1] > cfgCutsPID->get(1u, 0u) && nSigmaTPC[1] < cfgCutsPID->get(1u, 1u)) { + mRegistry.fill(HIST("h_PIDcutsXi"), 3, 1.322); + isBachelorSurvived = true; + } + + if (!isBachelorSurvived) { + continue; + } + + if (nSigmaTPC[2] < cfgCutsPID->get(2u, 0u) || nSigmaTPC[2] > cfgCutsPID->get(2u, 1u)) { + continue; + } - float cascCpa = -1; - float v0Cpa = -1; - if (df2.process(getTrackParCov(pionTrack), getTrackParCov(protonTrack))) { - trackParCovV0 = df2.createParentTrackParCov(0); // V0 track retrieved from p and pi daughters - v0Pos = {trackParCovV0.getX(), trackParCovV0.getY(), trackParCovV0.getZ()}; - if (df2.process(trackParCovV0, getTrackParCov(bachelor))) { - trackParV0 = df2.getTrackParamAtPCA(0); - trackParBachelor = df2.getTrackParamAtPCA(1); - trackParV0.getPxPyPzGlo(momenta[0]); // getting the V0 momentum - trackParBachelor.getPxPyPzGlo(momenta[1]); // getting the bachelor momentum - df2.createParentTrackParCov().getPxPyPzGlo(cascadeMomentum); + mRegistry.fill(HIST("h_PIDcutsOmega"), 4, 1.675); + mRegistry.fill(HIST("h_PIDcutsXi"), 4, 1.322); + + if (nSigmaTPC[3] < cfgCutsPID->get(3u, 0u) || nSigmaTPC[3] > cfgCutsPID->get(3u, 1u)) { + continue; + } + + mRegistry.fill(HIST("h_PIDcutsOmega"), 5, 1.675); + mRegistry.fill(HIST("h_PIDcutsXi"), 5, 1.322); + + auto protonTrkParCov = getTrackParCov(protonTrack); + auto pionTrkParCov = getTrackParCov(pionTrack); + auto bachTrkParCov = getTrackParCov(bachelor); + + std::array, 2> momenta; + std::array cascadeMomentum; + o2::math_utils::SVector cascadePos, v0Pos; + + float cascCpa = -1, v0Cpa = -1; + if (mDCAFitter.process(pionTrkParCov, protonTrkParCov)) { + auto trackParCovV0 = mDCAFitter.createParentTrackParCov(0); // V0 track retrieved from p and pi daughters + v0Pos = mDCAFitter.getPCACandidate(); + if (mDCAFitter.process(trackParCovV0, bachTrkParCov)) { + mDCAFitter.getTrackParamAtPCA(0).getPxPyPzGlo(momenta[0]); + mDCAFitter.getTrackParamAtPCA(1).getPxPyPzGlo(momenta[1]); + mDCAFitter.createParentTrackParCov().getPxPyPzGlo(cascadeMomentum); std::array pvPos = {primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ()}; - cascCpa = RecoDecay::cpa(pvPos, df2.getPCACandidate(), cascadeMomentum); - v0Cpa = RecoDecay::cpa(pvPos, df2.getPCACandidate(), momenta[0]); + cascadePos = mDCAFitter.getPCACandidate(); + cascCpa = RecoDecay::cpa(pvPos, mDCAFitter.getPCACandidate(), cascadeMomentum); + v0Cpa = RecoDecay::cpa(pvPos, v0Pos, momenta[0]); } else { continue; } } else { continue; } - float deltaPtITSCascade = std::hypot(cascadeMomentum[0], cascadeMomentum[1]) - ITStrack.pt(); - - // PV - registry.fill(HIST("h_PV_x"), primaryVertex.getX()); - registry.fill(HIST("h_PV_y"), primaryVertex.getY()); - registry.fill(HIST("h_PV_z"), primaryVertex.getZ()); + ROOT::Math::LorentzVector> cascadeLvector; + cascadeLvector.SetPxPyPzE(cascadeMomentum[0], cascadeMomentum[1], cascadeMomentum[2], std::hypot(cascadeMomentum[0], cascadeMomentum[1], cascadeMomentum[2])); /// 0 mass, used only for the momentum // Omega - masses = {o2::constants::physics::MassLambda0, o2::constants::physics::MassKPlus}; + std::array masses{o2::constants::physics::MassLambda0, o2::constants::physics::MassKPlus}; const auto massOmega = RecoDecay::m(momenta, masses); // Xi @@ -471,6 +371,9 @@ struct NonPromptCascadeTask { //// Omega hypohesis -> rejecting Xi, we don't do it in the MC as we can identify the particle with the MC truth bool isOmega{std::abs(massXi - constants::physics::MassXiMinus) > 0.005}; + if (cfgSelectOnlyOmegas && !isOmega) { + continue; + } std::array fromHF{false, false}; bool isGoodMatch{false}, isGoodCascade{false}; @@ -494,116 +397,123 @@ struct NonPromptCascadeTask { } } } - isGoodMatch = ((mcParticleID == ITStrack.mcParticleId())) ? true : false; - - if (isGoodMatch) { - pdgCodeMom = track.mcParticle().has_mothers() ? track.mcParticle().template mothers_as()[0].pdgCode() : 0; - } - itsTrackPDG = ITStrack.has_mcParticle() ? ITStrack.mcParticle().pdgCode() : 0; - } - - invMassBCV0->Fill(v0mass); - - registry.fill(HIST("h_PIDcutsXi"), 0, massXi); - registry.fill(HIST("h_PIDcutsOmega"), 0, massOmega); - - int bachKaonNClusTPC = -1; - int bachPionNClusTPC = -1; - int bachKaonNClusITS = -1; - int bachPionNClusITS = -1; - if (isOmega) { - bachKaonNClusTPC = bachelor.tpcNClsFound(); - bachKaonNClusITS = bachelor.itsNCls(); } - bachPionNClusTPC = bachelor.tpcNClsFound(); /// by default cascade = Xi - bachPionNClusITS = bachelor.itsNCls(); /// by default cascade = Xi - bool bachKaonHasTOF = 0; - bool bachPionHasTOF = 0; - if (isOmega) { - bachKaonHasTOF = bachelor.hasTOF(); - } - bachPionHasTOF = bachelor.hasTOF(); - - registry.fill(HIST("h_PIDcutsXi"), 1, massXi); - registry.fill(HIST("h_PIDcutsOmega"), 1, massOmega); - - if (protonTrack.tpcNClsFound() < cfgCutNclusTPC || pionTrack.tpcNClsFound() < cfgCutNclusTPC) { - LOG(debug) << "no tpcNClsFound: " << bachelor.tpcNClsFound() << "/" << protonTrack.tpcNClsFound() << "/" << pionTrack.tpcNClsFound(); + if (cascCpa < cfgMinCosPA) { continue; } - registry.fill(HIST("h_PIDcutsXi"), 2, massXi); - registry.fill(HIST("h_PIDcutsOmega"), 2, massOmega); - - // QA PID - float nSigmaTPC[nParticles]{bachelor.tpcNSigmaKa(), bachelor.tpcNSigmaPi(), protonTrack.tpcNSigmaPr(), pionTrack.tpcNSigmaPi()}; - - bool isBachelorSurvived = false; if (isOmega) { - if (bachelor.hasTPC()) { - LOG(debug) << "TPCSignal bachelor " << bachelor.sign() << "/" << bachelor.tpcInnerParam() << "/" << bachelor.tpcSignal(); - if (nSigmaTPC[0] > cfgCutsPID->get(0u, 0u) && nSigmaTPC[0] < cfgCutsPID->get(0u, 1u)) { - registry.fill(HIST("h_PIDcutsOmega"), 3, massOmega); - isBachelorSurvived = true; - } - } + mRegistry.fill(HIST("h_PIDcutsOmega"), 6, massOmega); } - - if (bachelor.hasTPC()) { - LOG(debug) << "TPCSignal bachelor " << bachelor.sign() << "/" << bachelor.tpcInnerParam() << "/" << bachelor.tpcSignal(); - if (nSigmaTPC[1] > cfgCutsPID->get(1u, 0u) && nSigmaTPC[1] < cfgCutsPID->get(1u, 1u)) { - registry.fill(HIST("h_PIDcutsXi"), 3, massXi); - isBachelorSurvived = true; + mRegistry.fill(HIST("h_PIDcutsXi"), 6, massXi); + + const auto matCorr = static_cast(cfgMaterialCorrection.value); + o2::dataformats::DCA motherDCA{-999.f, -999.f}, protonDCA{-999.f, -999.f}, pionDCA{-999.f, -999.f}, bachDCA{-999.f, -999.f}; + o2::base::Propagator::Instance()->propagateToDCA(primaryVertex, protonTrkParCov, mBz, 2.f, matCorr, &protonDCA); + o2::base::Propagator::Instance()->propagateToDCA(primaryVertex, pionTrkParCov, mBz, 2.f, matCorr, &pionDCA); + o2::base::Propagator::Instance()->propagateToDCA(primaryVertex, bachTrkParCov, mBz, 2.f, matCorr, &bachDCA); + + float deltaPtITSCascade{-1.e10f}, cascITSclsSize{-1.e10f}, matchingChi2{-1.e10f}; + bool hasReassociatedClusters{false}; + int trackedCascGlobalIndex{-1}, itsTrackGlobalIndex{-1}, cascITSclusters{-1}; + if constexpr (requires { candidate.track(); }) { + const auto& track = candidate.template track_as(); + const auto& ITStrack = candidate.template itsTrack_as(); + auto trackTrkParCov = getTrackParCov(track); + o2::base::Propagator::Instance()->propagateToDCA(primaryVertex, trackTrkParCov, mBz, 2.f, matCorr, &motherDCA); + hasReassociatedClusters = (track.itsNCls() != ITStrack.itsNCls()); + cascadeLvector.SetCoordinates(track.pt(), track.eta(), track.phi(), 0); + deltaPtITSCascade = std::hypot(cascadeMomentum[0], cascadeMomentum[1]) - ITStrack.pt(); + trackedCascGlobalIndex = track.globalIndex(); + itsTrackGlobalIndex = ITStrack.globalIndex(); + cascITSclusters = track.itsNCls(); + cascITSclsSize = candidate.itsClsSize(); + matchingChi2 = candidate.matchingChi2(); + cascadePos = {candidate.decayX(), candidate.decayY(), candidate.decayZ()}; + if constexpr (TrackType::template contains()) { + isGoodMatch = ((mcParticleID == ITStrack.mcParticleId())) ? true : false; + + if (isGoodMatch) { + pdgCodeMom = track.mcParticle().has_mothers() ? track.mcParticle().template mothers_as()[0].pdgCode() : 0; + } + itsTrackPDG = ITStrack.has_mcParticle() ? ITStrack.mcParticle().pdgCode() : 0; } } + candidates.emplace_back(NPCascCandidate{mcParticleID, trackedCascGlobalIndex, itsTrackGlobalIndex, candidate.collisionId(), matchingChi2, deltaPtITSCascade, cascITSclsSize, hasReassociatedClusters, isGoodMatch, isGoodCascade, pdgCodeMom, itsTrackPDG, fromHF[0], fromHF[1], + collision.numContrib(), collision.collisionTimeRes(), primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ(), + cascadeLvector.pt(), cascadeLvector.eta(), cascadeLvector.phi(), + protonTrack.pt(), protonTrack.eta(), pionTrack.pt(), pionTrack.eta(), bachelor.pt(), bachelor.eta(), + motherDCA.getY(), motherDCA.getZ(), protonDCA.getY(), protonDCA.getZ(), pionDCA.getY(), pionDCA.getZ(), bachDCA.getY(), bachDCA.getZ(), + cascCpa, v0Cpa, massXi, massOmega, v0mass, + static_cast(std::hypot(cascadePos[0], cascadePos[1])), static_cast(std::hypot(v0Pos[0], v0Pos[1])), static_cast(std::hypot(cascadePos[0], cascadePos[1], cascadePos[2])), static_cast(std::hypot(v0Pos[0], v0Pos[1], v0Pos[2])), + cascITSclusters, protonTrack.itsNCls(), pionTrack.itsNCls(), bachelor.itsNCls(), protonTrack.tpcNClsFound(), pionTrack.tpcNClsFound(), bachelor.tpcNClsFound(), + protonTrack.tpcNSigmaPr(), pionTrack.tpcNSigmaPi(), bachelor.tpcNSigmaKa(), bachelor.tpcNSigmaPi(), + protonTrack.hasTOF(), pionTrack.hasTOF(), bachelor.hasTOF(), + protonTrack.tofNSigmaPr(), pionTrack.tofNSigmaPi(), bachelor.tofNSigmaKa(), bachelor.tofNSigmaPi()}); + } + } - if (!isBachelorSurvived) { - continue; - } - - LOG(debug) << "TPCSignal protonTrack " << protonTrack.sign() << "/" << protonTrack.tpcInnerParam() << "/" << protonTrack.tpcSignal(); - if (nSigmaTPC[2] < cfgCutsPID->get(2u, 0u) || nSigmaTPC[2] > cfgCutsPID->get(2u, 1u)) { - continue; - } - - if (isOmega) { - registry.fill(HIST("h_PIDcutsOmega"), 4, massOmega); - } - registry.fill(HIST("h_PIDcutsXi"), 4, massXi); + template + void fillDataTable(auto const& candidates) + { + for (const auto& c : candidates) { + getDataTable()(c.matchingChi2, c.deltaPt, c.itsClusSize, c.hasReassociatedCluster, + c.pvContributors, c.pvTimeResolution, c.pvX, c.pvY, c.pvZ, + c.cascPt, c.cascEta, c.cascPhi, + c.protonPt, c.protonEta, c.pionPt, c.pionEta, c.bachPt, c.bachEta, + c.cascDCAxy, c.cascDCAz, c.protonDCAxy, c.protonDCAz, c.pionDCAxy, c.pionDCAz, c.bachDCAxy, c.bachDCAz, + c.casccosPA, c.v0cosPA, + c.massXi, c.massOmega, c.massV0, + c.cascRadius, c.v0radius, c.cascLength, c.v0length, + c.cascNClusITS, c.protonNClusITS, c.pionNClusITS, c.bachNClusITS, c.protonNClusTPC, c.pionNClusTPC, c.bachNClusTPC, + c.protonTPCNSigma, c.pionTPCNSigma, c.bachKaonTPCNSigma, c.bachPionTPCNSigma, + c.protonHasTOF, c.pionHasTOF, c.bachHasTOF, + c.protonTOFNSigma, c.pionTOFNSigma, c.bachKaonTOFNSigma, c.bachPionTOFNSigma); + } + } - LOG(debug) << "TPCSignal ntrack " << pionTrack.sign() << "/" << pionTrack.tpcInnerParam() << "/" << pionTrack.tpcSignal(); - if (nSigmaTPC[3] < cfgCutsPID->get(3u, 0u) || nSigmaTPC[3] > cfgCutsPID->get(3u, 1u)) { + template + void fillMCtable(auto const& mcParticles, auto const& collisions, auto const& candidates) + { + for (size_t i = 0; i < candidates.size(); ++i) { + auto& c = candidates[i]; + if (c.mcParticleId < 0) { continue; } + auto particle = mcParticles.iteratorAt(c.mcParticleId); + auto mcCollision = particle.template mcCollision_as(); + auto recCollision = collisions.iteratorAt(c.collisionID); + + getMCtable()(c.matchingChi2, c.deltaPt, c.itsClusSize, c.hasReassociatedCluster, c.isGoodMatch, c.isGoodCascade, c.pdgCodeMom, c.pdgCodeITStrack, c.isFromBeauty, c.isFromCharm, + c.pvContributors, c.pvTimeResolution, c.pvX, c.pvY, c.pvZ, c.cascPt, c.cascEta, c.cascPhi, + c.protonPt, c.protonEta, c.pionPt, c.pionEta, c.bachPt, c.bachEta, + c.cascDCAxy, c.cascDCAz, c.protonDCAxy, c.protonDCAz, c.pionDCAxy, c.pionDCAz, c.bachDCAxy, c.bachDCAz, + c.casccosPA, c.v0cosPA, c.massXi, c.massOmega, c.massV0, c.cascRadius, c.v0radius, c.cascLength, c.v0length, + c.cascNClusITS, c.protonNClusITS, c.pionNClusITS, c.bachNClusITS, c.protonNClusTPC, c.pionNClusTPC, c.bachNClusTPC, c.protonTPCNSigma, + c.pionTPCNSigma, c.bachKaonTPCNSigma, c.bachPionTPCNSigma, c.protonHasTOF, c.pionHasTOF, c.bachHasTOF, + c.protonTOFNSigma, c.pionTOFNSigma, c.bachKaonTOFNSigma, c.bachPionTOFNSigma, + particle.pt(), particle.eta(), particle.phi(), particle.pdgCode(), mcCollision.posX() - particle.vx(), mcCollision.posY() - particle.vy(), + mcCollision.posZ() - particle.vz(), mcCollision.globalIndex() == recCollision.mcCollisionId()); + } + } - if (isOmega) { - registry.fill(HIST("h_PIDcutsOmega"), 5, massOmega); - registry.fill(HIST("h_massvspt_Omega"), massOmega, track.pt()); - } - - registry.fill(HIST("h_PIDcutsXi"), 5, massXi); - registry.fill(HIST("h_massvspt_Xi"), massXi, track.pt()); - - invMassACV0->Fill(v0mass); - registry.fill(HIST("h_massvspt_V0"), v0mass, track.pt()); - - motherDCA motherDCA; - fillCascadeDCA(track, protonTrack, pionTrack, primaryVertex, isOmega, motherDCA); - daughtersDCA dDCA; - fillDauDCA(trackedCascade, bachelor, protonTrack, pionTrack, primaryVertex, isOmega, dDCA); + template + auto& getMCtable() + { + if constexpr (std::is_same_v) { + return NPCTableMCNT; + } else { + return NPCTableMC; + } + } - candidates.emplace_back(NPCascCandidate{mcParticleID, track.globalIndex(), ITStrack.globalIndex(), trackedCascade.collisionId(), trackedCascade.matchingChi2(), deltaPtITSCascade, trackedCascade.itsClsSize(), hasReassociatedClusters, isGoodMatch, isGoodCascade, pdgCodeMom, itsTrackPDG, fromHF[0], fromHF[1], - collision.numContrib(), collision.collisionTimeRes(), primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ(), - track.pt(), track.eta(), track.phi(), - protonTrack.pt(), protonTrack.eta(), pionTrack.pt(), pionTrack.eta(), bachelor.pt(), bachelor.eta(), - motherDCA.DCAxy, motherDCA.DCAz, dDCA.protonDCAxy, dDCA.protonDCAz, dDCA.pionDCAxy, dDCA.pionDCAz, dDCA.bachDCAxy, dDCA.bachDCAz, - cascCpa, v0Cpa, - massXi, massOmega, v0mass, - std::hypot(trackedCascade.decayX(), trackedCascade.decayY()), std::hypot(v0Pos[0], v0Pos[1]), std::hypot(trackedCascade.decayX(), trackedCascade.decayY(), trackedCascade.decayZ()), std::hypot(v0Pos[0], v0Pos[1], v0Pos[2]), - track.itsNCls(), protonTrack.itsNCls(), pionTrack.itsNCls(), bachKaonNClusITS, bachPionNClusITS, protonTrack.tpcNClsFound(), pionTrack.tpcNClsFound(), bachKaonNClusTPC, bachPionNClusTPC, - protonTrack.tpcNSigmaPr(), pionTrack.tpcNSigmaPi(), bachelor.tpcNSigmaKa(), bachelor.tpcNSigmaPi(), - protonTrack.hasTOF(), pionTrack.hasTOF(), bachKaonHasTOF, bachPionHasTOF, - protonTrack.tofNSigmaPr(), pionTrack.tofNSigmaPi(), bachelor.tofNSigmaKa(), bachelor.tofNSigmaPi()}); + template + auto& getDataTable() + { + if constexpr (std::is_same_v) { + return NPCTableNT; + } else { + return NPCTable; } } @@ -612,82 +522,56 @@ struct NonPromptCascadeTask { aod::V0s const& /*v0s*/, TracksExtMC const& /*tracks*/, aod::McParticles const& mcParticles, aod::McCollisions const&, aod::BCsWithTimestamps const&) { + fillCandidatesVector(collisions, trackedCascades, gCandidates); + fillMCtable(mcParticles, collisions, gCandidates); + } + PROCESS_SWITCH(NonPromptCascadeTask, processTrackedCascadesMC, "process cascades from strangeness tracking: MC analysis", true); - fillCandidatesVector(collisions, trackedCascades); - - for (size_t i = 0; i < candidates.size(); ++i) { - - if (candidates[i].mcParticleId < 0) { - continue; - } - auto particle = mcParticles.iteratorAt(candidates[i].mcParticleId); - auto& c = candidates[i]; - auto mcCollision = particle.mcCollision_as(); - auto label = collisions.iteratorAt(c.collisionID); - - NPCTableMC(c.matchingChi2, c.deltaPt, c.itsClusSize, c.hasReassociatedCluster, c.isGoodMatch, c.isGoodCascade, c.pdgCodeMom, c.pdgCodeITStrack, c.isFromBeauty, c.isFromCharm, - c.pvContributors, c.pvTimeResolution, c.pvX, c.pvY, c.pvZ, - c.cascPt, c.cascEta, c.cascPhi, - c.protonPt, c.protonEta, c.pionPt, c.pionEta, c.bachPt, c.bachEta, - c.cascDCAxy, c.cascDCAz, c.protonDCAxy, c.protonDCAz, c.pionDCAxy, c.pionDCAz, c.bachDCAxy, c.bachDCAz, - c.casccosPA, c.v0cosPA, - c.massXi, c.massOmega, c.massV0, - c.cascRadius, c.v0radius, c.cascLength, c.v0length, - c.cascNClusITS, c.protonNClusITS, c.pionNClusITS, c.bachKaonNClusITS, c.bachPionNClusITS, c.protonNClusTPC, c.pionNClusTPC, c.bachKaonNClusTPC, c.bachPionNClusTPC, - c.protonTPCNSigma, c.pionTPCNSigma, c.bachKaonTPCNSigma, c.bachPionTPCNSigma, - c.protonHasTOF, c.pionHasTOF, c.bachKaonHasTOF, c.bachPionHasTOF, - c.protonTOFNSigma, c.pionTOFNSigma, c.bachKaonTOFNSigma, c.bachPionTOFNSigma, - particle.pt(), particle.eta(), particle.phi(), particle.pdgCode(), mcCollision.posX() - particle.vx(), mcCollision.posY() - particle.vy(), mcCollision.posZ() - particle.vz(), mcCollision.globalIndex() == label.mcCollisionId()); - } + void processCascadesMC(CollisionCandidatesRun3MC const& collisions, aod::Cascades const& cascades, + aod::V0s const& /*v0s*/, TracksExtMC const& /*tracks*/, + aod::McParticles const& mcParticles, aod::McCollisions const&, aod::BCsWithTimestamps const&) + { + fillCandidatesVector(collisions, cascades, gCandidatesNT); + fillMCtable(mcParticles, collisions, gCandidatesNT); + } + PROCESS_SWITCH(NonPromptCascadeTask, processCascadesMC, "process cascades: MC analysis", false); + void processGenParticles(aod::McParticles const& mcParticles, aod::McCollisions const&) + { for (const auto& p : mcParticles) { auto absCode = std::abs(p.pdgCode()); if (absCode != 3312 && absCode != 3334) { continue; } auto fromHF = isFromHF(p); - int pdgCodeMom = p.has_mothers() ? p.mothers_as()[0].pdgCode() : 0; - auto mcCollision = p.mcCollision_as(); + int pdgCodeMom = p.has_mothers() ? p.template mothers_as()[0].pdgCode() : 0; + auto mcCollision = p.template mcCollision_as(); NPCTableGen(p.pt(), p.eta(), p.phi(), p.pdgCode(), pdgCodeMom, mcCollision.posX() - p.vx(), mcCollision.posY() - p.vy(), mcCollision.posZ() - p.vz(), fromHF[0], fromHF[1]); } } - PROCESS_SWITCH(NonPromptCascadeTask, processTrackedCascadesMC, "process cascades from strangeness tracking: MC analysis", true); + PROCESS_SWITCH(NonPromptCascadeTask, processGenParticles, "process gen cascades: MC analysis", false); void processTrackedCascadesData(CollisionCandidatesRun3 const& collisions, aod::AssignedTrackedCascades const& trackedCascades, aod::Cascades const& /*cascades*/, aod::V0s const& /*v0s*/, TracksExtData const& /*tracks*/, aod::BCsWithTimestamps const&) { - if (cfgSkimmedProcessing) { - int runNumber{-1}; - for (const auto& coll : collisions) { - auto bc = coll.bc_as(); - if (runNumber != bc.runNumber()) { - zorro.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), "fTrackedOmega"); - zorro.populateHistRegistry(registry, bc.runNumber()); - runNumber = bc.runNumber(); - } - zorro.isSelected(bc.globalBC()); /// Just let Zorro do the accounting - } - } - fillCandidatesVector(collisions, trackedCascades); - for (const auto& c : candidates) { - NPCTable(c.matchingChi2, c.deltaPt, c.itsClusSize, c.hasReassociatedCluster, - c.pvContributors, c.pvTimeResolution, c.pvX, c.pvY, c.pvZ, - c.cascPt, c.cascEta, c.cascPhi, - c.protonPt, c.protonEta, c.pionPt, c.pionEta, c.bachPt, c.bachEta, - c.cascDCAxy, c.cascDCAz, c.protonDCAxy, c.protonDCAz, c.pionDCAxy, c.pionDCAz, c.bachDCAxy, c.bachDCAz, - c.casccosPA, c.v0cosPA, - c.massXi, c.massOmega, c.massV0, - c.cascRadius, c.v0radius, c.cascLength, c.v0length, - c.cascNClusITS, c.protonNClusITS, c.pionNClusITS, c.bachKaonNClusITS, c.bachPionNClusITS, c.protonNClusTPC, c.pionNClusTPC, c.bachKaonNClusTPC, c.bachPionNClusTPC, - c.protonTPCNSigma, c.pionTPCNSigma, c.bachKaonTPCNSigma, c.bachPionTPCNSigma, - c.protonHasTOF, c.pionHasTOF, c.bachKaonHasTOF, c.bachPionHasTOF, - c.protonTOFNSigma, c.pionTOFNSigma, c.bachKaonTOFNSigma, c.bachPionTOFNSigma); - } + zorroAccounting(collisions); + fillCandidatesVector(collisions, trackedCascades, gCandidates); + fillDataTable(gCandidates); } PROCESS_SWITCH(NonPromptCascadeTask, processTrackedCascadesData, "process cascades from strangeness tracking: Data analysis", false); + + void processCascadesData(CollisionCandidatesRun3 const& collisions, aod::Cascades const& cascades, + aod::V0s const& /*v0s*/, TracksExtData const& /*tracks*/, + aod::BCsWithTimestamps const&) + { + zorroAccounting(collisions); + fillCandidatesVector(collisions, cascades, gCandidatesNT); + fillDataTable(gCandidatesNT); + } + PROCESS_SWITCH(NonPromptCascadeTask, processCascadesData, "process cascades: Data analysis", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 58e9502cf9e54806b9a923d39b00158d0bdf2a07 Mon Sep 17 00:00:00 2001 From: sarjeetagami <162087855+sarjeetagami@users.noreply.github.com> Date: Sat, 22 Feb 2025 10:04:42 +0530 Subject: [PATCH 0375/1650] [PWGLF] added MC for Kstar flow task and purity for phi task (#10133) Co-authored-by: sarjeeta gami --- PWGLF/Tasks/Resonances/kstarpbpb.cxx | 331 +++++++++++++++--- .../Tasks/Resonances/phianalysisrun3_PbPb.cxx | 37 +- 2 files changed, 308 insertions(+), 60 deletions(-) diff --git a/PWGLF/Tasks/Resonances/kstarpbpb.cxx b/PWGLF/Tasks/Resonances/kstarpbpb.cxx index 2275d62d05d..f18b0e3e607 100644 --- a/PWGLF/Tasks/Resonances/kstarpbpb.cxx +++ b/PWGLF/Tasks/Resonances/kstarpbpb.cxx @@ -20,12 +20,12 @@ #include #include #include -#include -#include #include #include #include #include +#include +#include #include "TRandom3.h" #include "Math/Vector3D.h" @@ -54,6 +54,8 @@ #include "DataFormatsParameters/GRPMagField.h" #include "CCDB/BasicCCDBManager.h" #include "CCDB/CcdbApi.h" +#include "Common/DataModel/PIDResponseITS.h" +#include "PWGMM/Mult/DataModel/Index.h" // for Particles2Tracks table using namespace o2; using namespace o2::framework; @@ -113,6 +115,7 @@ struct kstarpbpb { Configurable additionalEvselITS{"additionalEvselITS", true, "Additional event selcection for ITS"}; Configurable ispTdepPID{"ispTdepPID", true, "pT dependent PID"}; Configurable isNoTOF{"isNoTOF", true, "isNoTOF"}; + Configurable PDGcheck{"PDGcheck", true, "PDGcheck"}; Configurable strategyPID{"strategyPID", 2, "PID strategy"}; Configurable cfgCutTOFBeta{"cfgCutTOFBeta", 0.0, "cut TOF beta"}; Configurable additionalQAplots{"additionalQAplots", true, "Additional QA plots"}; @@ -126,6 +129,9 @@ struct kstarpbpb { Configurable fillOccupancy{"fillOccupancy", false, "fill Occupancy"}; Configurable cfgOccupancyCut{"cfgOccupancyCut", 500, "Occupancy cut"}; Configurable useWeight{"useWeight", false, "use EP dep effi weight"}; + Configurable useSP{"useSP", false, "use SP"}; + Configurable genacceptancecut{"genacceptancecut", true, "use acceptance cut for generated"}; + Configurable avoidsplitrackMC{"avoidsplitrackMC", false, "avoid split track in MC"}; Configurable ConfWeightPath{"ConfWeightPath", "Users/s/skundu/My/Object/PbPb2024/MCWeight2", "Path to gain calibration"}; Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; @@ -135,6 +141,15 @@ struct kstarpbpb { using EventCandidates = soa::Filtered>; using TrackCandidates = soa::Filtered>; + + using CollisionMCTrueTable = aod::McCollisions; + using TrackMCTrueTable = aod::McParticles; + using CollisionMCRecTableCentFT0C = soa::SmallGroups>; + using TrackMCRecTable = soa::Join; + using FilTrackMCRecTable = soa::Filtered; + + Preslice perCollision = aod::track::collisionId; + SliceCache cache; Partition posTracks = aod::track::signed1Pt > cfgCutCharge; Partition negTracks = aod::track::signed1Pt < cfgCutCharge; @@ -171,8 +186,14 @@ struct kstarpbpb { histos.add("hRotation", "hRotation", kTH1F, {{360, 0.0, 2.0 * TMath::Pi()}}); histos.add("hSparseV2SASameEventRotational_V2", "hSparseV2SASameEventRotational_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); } - + histos.add("hSparseV2SAGen_V2", "hSparseV2SAGen_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); + histos.add("hSparseV2SARec_V2", "hSparseV2SARec_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); + histos.add("hpt", "hpt", kTH1F, {thnAxisPt}); + histos.add("hMC", "MC Event statistics", kTH1F, {{10, 0.0f, 10.0f}}); + histos.add("CentPercentileMCRecHist", "MC Centrality", kTH1F, {{100, 0.0f, 100.0f}}); histos.add("hSparseV2SAMixedEvent_V2", "hSparseV2SAMixedEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); + histos.add("h2PhiGen2", "Phi meson gen", kTH2F, {thnAxisPt, thnAxisCentrality}); + histos.add("h2PhiRec2", "Phi meson Rec", kTH2F, {thnAxisPt, thnAxisCentrality}); if (additionalQAplots1) { histos.add("hFTOCvsTPCSelected", "Mult correlation FT0C vs. TPC after selection", kTH2F, {{80, 0.0f, 80.0f}, {100, -0.5f, 5999.5f}}); @@ -197,12 +218,12 @@ struct kstarpbpb { histos.add("QAafter/trkDCAzka", "DCAz distribution of kaon track candidates", HistType::kTH1F, {{150, 0.0f, 1.0f}}); // PID QA before cuts histos.add("QAbefore/TOF_TPC_Mapka_allka", "TOF + TPC Combined PID for Kaon;#sigma_{TOF}^{Kaon};#sigma_{TPC}^{Kaon}", {HistType::kTH2D, {{100, -6, 6}, {100, -6, 6}}}); - histos.add("QAbefore/TOF_Nsigma_allka", "TOF NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Kaon};", {HistType::kTH2D, {{200, 0.0, 20.0}, {100, -6, 6}}}); - histos.add("QAbefore/TPC_Nsigma_allka", "TPC NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Kaon};", {HistType::kTH2D, {{200, 0.0, 20.0}, {100, -6, 6}}}); + histos.add("QAbefore/TOF_Nsigma_allka", "TOF NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Kaon};", {HistType::kTH3D, {{200, 0.0, 20.0}, {100, -6, 6}, {100, 0.0, 100.0}}}); + histos.add("QAbefore/TPC_Nsigma_allka", "TPC NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Kaon};", {HistType::kTH3D, {{200, 0.0, 20.0}, {100, -6, 6}, {100, 0.0, 100.0}}}); // PID QA after cuts histos.add("QAafter/TOF_TPC_Mapka_allka", "TOF + TPC Combined PID for Kaon;#sigma_{TOF}^{Kaon};#sigma_{TPC}^{Kaon}", {HistType::kTH2D, {{100, -6, 6}, {100, -6, 6}}}); - histos.add("QAafter/TOF_Nsigma_allka", "TOF NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Kaon};", {HistType::kTH2D, {{200, 0.0, 20.0}, {100, -6, 6}}}); - histos.add("QAafter/TPC_Nsigma_allka", "TPC NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Kaon};", {HistType::kTH2D, {{200, 0.0, 20.0}, {100, -6, 6}}}); + histos.add("QAafter/TOF_Nsigma_allka", "TOF NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Kaon};", {HistType::kTH3D, {{200, 0.0, 20.0}, {100, -6, 6}, {100, 0.0, 100.0}}}); + histos.add("QAafter/TPC_Nsigma_allka", "TPC NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Kaon};", {HistType::kTH3D, {{200, 0.0, 20.0}, {100, -6, 6}, {100, 0.0, 100.0}}}); // DCA QA histos.add("QAbefore/trkDCAxypi", "DCAxy distribution of pion track candidates", HistType::kTH1F, {{150, 0.0f, 1.0f}}); @@ -211,12 +232,12 @@ struct kstarpbpb { histos.add("QAafter/trkDCAzpi", "DCAz distribution of pion track candidates", HistType::kTH1F, {{150, 0.0f, 1.0f}}); // PID QA before cuts histos.add("QAbefore/TOF_TPC_Mapka_allpi", "TOF + TPC Combined PID for pion;#sigma_{TOF}^{pion};#sigma_{TPC}^{pion}", {HistType::kTH2D, {{100, -6, 6}, {100, -6, 6}}}); - histos.add("QAbefore/TOF_Nsigma_allpi", "TOF NSigma for pion;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{pion};", {HistType::kTH2D, {{200, 0.0, 20.0}, {100, -6, 6}}}); - histos.add("QAbefore/TPC_Nsigma_allpi", "TPC NSigma for pion;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{pion};", {HistType::kTH2D, {{200, 0.0, 20.0}, {100, -6, 6}}}); + histos.add("QAbefore/TOF_Nsigma_allpi", "TOF NSigma for pion;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{pion};", {HistType::kTH3D, {{200, 0.0, 20.0}, {100, -6, 6}, {100, 0.0, 100.0}}}); + histos.add("QAbefore/TPC_Nsigma_allpi", "TPC NSigma for pion;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{pion};", {HistType::kTH3D, {{200, 0.0, 20.0}, {100, -6, 6}, {100, 0.0, 100.0}}}); // PID QA after cuts histos.add("QAafter/TOF_TPC_Mapka_allpi", "TOF + TPC Combined PID for pion;#sigma_{TOF}^{pion};#sigma_{TPC}^{pion}", {HistType::kTH2D, {{100, -6, 6}, {100, -6, 6}}}); - histos.add("QAafter/TOF_Nsigma_allpi", "TOF NSigma for pion;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{pion};", {HistType::kTH2D, {{200, 0.0, 20.0}, {100, -6, 6}}}); - histos.add("QAafter/TPC_Nsigma_allpi", "TPC NSigma for pion;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{pion};", {HistType::kTH2D, {{200, 0.0, 20.0}, {100, -6, 6}}}); + histos.add("QAafter/TOF_Nsigma_allpi", "TOF NSigma for pion;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{pion};", {HistType::kTH3D, {{200, 0.0, 20.0}, {100, -6, 6}, {100, 0.0, 100.0}}}); + histos.add("QAafter/TPC_Nsigma_allpi", "TPC NSigma for pion;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{pion};", {HistType::kTH3D, {{200, 0.0, 20.0}, {100, -6, 6}, {100, 0.0, 100.0}}}); } // Event selection cut additional - Alex @@ -279,23 +300,23 @@ struct kstarpbpb { bool selectionPIDNew(const T& candidate, int PID) { if (PID == 0) { - if (!isNoTOF && !candidate.hasTOF() && TMath::Abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC) { + if (candidate.pt() < 0.5 && TMath::Abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC) { return true; } - if (!isNoTOF && candidate.hasTOF() && TMath::Abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC && TMath::Abs(candidate.tofNSigmaKa()) < nsigmaCutTOF) { + if (candidate.pt() >= 0.5 && TMath::Abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC && candidate.hasTOF() && TMath::Abs(candidate.tofNSigmaKa()) < nsigmaCutTOF && candidate.beta() > cfgCutTOFBeta) { return true; } - if (isNoTOF && std::abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC) { + if (candidate.pt() >= 0.5 && TMath::Abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC && !candidate.hasTOF()) { return true; } } else if (PID == 1) { - if (!isNoTOF && !candidate.hasTOF() && TMath::Abs(candidate.tpcNSigmaPi()) < nsigmaCutTPC) { + if (candidate.pt() < 0.5 && TMath::Abs(candidate.tpcNSigmaPi()) < nsigmaCutTPC) { return true; } - if (!isNoTOF && candidate.hasTOF() && TMath::Abs(candidate.tpcNSigmaPi()) < nsigmaCutTPC && TMath::Abs(candidate.tofNSigmaPi()) < nsigmaCutTOF) { + if (candidate.pt() >= 0.5 && TMath::Abs(candidate.tpcNSigmaPi()) < nsigmaCutTPC && candidate.hasTOF() && TMath::Abs(candidate.tofNSigmaPi()) < nsigmaCutTOF && candidate.beta() > cfgCutTOFBeta) { return true; } - if (isNoTOF && std::abs(candidate.tpcNSigmaPi()) < nsigmaCutTPC) { + if (candidate.pt() >= 0.5 && TMath::Abs(candidate.tpcNSigmaPi()) < nsigmaCutTPC && !candidate.hasTOF()) { return true; } } @@ -344,20 +365,20 @@ struct kstarpbpb { return true; } } else if (strategy == 1) { - if (!isNoTOF && !candidate.hasTOF() && TMath::Abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC) { + if (candidate.pt() < 0.5 && TMath::Abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC) { return true; } - if (!isNoTOF && candidate.hasTOF() && ((candidate.tofNSigmaKa() * candidate.tofNSigmaKa()) + (candidate.tpcNSigmaKa() * candidate.tpcNSigmaKa())) < (nsigmaCutCombined * nsigmaCutCombined)) { + if (candidate.pt() >= 0.5 && TMath::Abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC && candidate.hasTOF() && TMath::Abs(candidate.tofNSigmaKa()) < nsigmaCutTOF && candidate.beta() > cfgCutTOFBeta) { return true; } - if (isNoTOF && std::abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC) { + if (!useGlobalTrack && !candidate.hasTPC()) { return true; } } else if (strategy == 2) { if (candidate.pt() < 0.5 && TMath::Abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC) { return true; } - if (candidate.pt() >= 0.5 && TMath::Abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC && candidate.hasTOF() && TMath::Abs(candidate.tofNSigmaKa()) < nsigmaCutTOF && candidate.beta() > 0.5) { + if (candidate.pt() >= 0.5 && TMath::Abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC && candidate.hasTOF() && TMath::Abs(candidate.tofNSigmaKa()) < nsigmaCutTOF && candidate.beta() > cfgCutTOFBeta) { return true; } if (candidate.pt() >= 0.5 && TMath::Abs(candidate.tpcNSigmaKa()) < nsigmaCutTPC && !candidate.hasTOF()) { @@ -377,20 +398,20 @@ struct kstarpbpb { return true; } } else if (strategy == 1) { - if (!isNoTOF && !candidate.hasTOF() && TMath::Abs(candidate.tpcNSigmaPi()) < nsigmaCutTPC) { + if (candidate.pt() < 0.5 && TMath::Abs(candidate.tpcNSigmaPi()) < nsigmaCutTPC) { return true; } - if (!isNoTOF && candidate.hasTOF() && ((candidate.tofNSigmaPi() * candidate.tofNSigmaPi()) + (candidate.tpcNSigmaPi() * candidate.tpcNSigmaPi())) < (nsigmaCutCombined * nsigmaCutCombined)) { + if (candidate.pt() >= 0.5 && TMath::Abs(candidate.tpcNSigmaPi()) < nsigmaCutTPC && candidate.hasTOF() && TMath::Abs(candidate.tofNSigmaPi()) < nsigmaCutTOF && candidate.beta() > cfgCutTOFBeta) { return true; } - if (isNoTOF && std::abs(candidate.tpcNSigmaPi()) < nsigmaCutTPC) { + if (!useGlobalTrack && !candidate.hasTPC()) { return true; } } else if (strategy == 2) { if (candidate.pt() < 0.5 && TMath::Abs(candidate.tpcNSigmaPi()) < nsigmaCutTPC) { return true; } - if (candidate.pt() >= 0.5 && TMath::Abs(candidate.tpcNSigmaPi()) < nsigmaCutTPC && candidate.hasTOF() && TMath::Abs(candidate.tofNSigmaPi()) < nsigmaCutTOF && candidate.beta() > 0.5) { + if (candidate.pt() >= 0.5 && TMath::Abs(candidate.tpcNSigmaPi()) < nsigmaCutTPC && candidate.hasTOF() && TMath::Abs(candidate.tofNSigmaPi()) < nsigmaCutTOF && candidate.beta() > cfgCutTOFBeta) { return true; } if (candidate.pt() >= 0.5 && TMath::Abs(candidate.tpcNSigmaPi()) < nsigmaCutTPC && !candidate.hasTOF()) { @@ -428,7 +449,7 @@ struct kstarpbpb { double v2, v2Rot; using BinningTypeVertexContributor = ColumnBinningPolicy; - ROOT::Math::PxPyPzMVector KstarMother, daughter1, daughter2, kaonrot, kstarrot; + ROOT::Math::PxPyPzMVector KstarMother, daughter1, daughter2, kaonrot, kstarrot, KaonPlus, KaonMinus; int currentRunNumber = -999; int lastRunNumber = -999; @@ -512,7 +533,18 @@ struct kstarpbpb { if (!track1kaon || !track2pion) { continue; } - + if (additionalQAplots) { + histos.fill(HIST("QAafter/TPC_Nsigma_allka"), track1.pt(), track1.tpcNSigmaKa(), centrality); + histos.fill(HIST("QAafter/TOF_Nsigma_allka"), track1.pt(), track1.tofNSigmaKa(), centrality); + histos.fill(HIST("QAafter/trkDCAxyka"), track1.dcaXY()); + histos.fill(HIST("QAafter/trkDCAzka"), track1.dcaZ()); + histos.fill(HIST("QAafter/TOF_TPC_Mapka_allka"), track1.tofNSigmaKa(), track1.tpcNSigmaKa()); + histos.fill(HIST("QAafter/TOF_TPC_Mapka_allpi"), track2.tofNSigmaPi(), track2.tpcNSigmaPi()); + histos.fill(HIST("QAafter/TPC_Nsigma_allpi"), track2.pt(), track2.tpcNSigmaPi(), centrality); + histos.fill(HIST("QAafter/TOF_Nsigma_allpi"), track2.pt(), track2.tofNSigmaPi(), centrality); + histos.fill(HIST("QAafter/trkDCAxypi"), track2.dcaXY()); + histos.fill(HIST("QAafter/trkDCAzpi"), track2.dcaZ()); + } if (useWeight) { if (track2.pt() < 10.0 && track2.pt() > 0.15) { weight2 = hweight->GetBinContent(hweight->FindBin(centrality, GetPhiInRange(track2.phi() - psiFT0C), track2.pt() + 0.000005)); @@ -526,9 +558,15 @@ struct kstarpbpb { if (TMath::Abs(KstarMother.Rapidity()) > confRapidity) { continue; } + auto phiminuspsi = GetPhiInRange(KstarMother.Phi() - psiFT0C); - v2 = TMath::Cos(2.0 * phiminuspsi) * QFT0C; + if (useSP) { + v2 = TMath::Cos(2.0 * phiminuspsi) * QFT0C; + } + if (!useSP) { + v2 = TMath::Cos(2.0 * phiminuspsi); + } auto totalweight = weight1 * weight2; if (totalweight <= 0.0005) { totalweight = 1.0; @@ -556,8 +594,12 @@ struct kstarpbpb { } auto phiminuspsiRot = GetPhiInRange(kstarrot.Phi() - psiFT0C); - v2Rot = TMath::Cos(2.0 * phiminuspsiRot) * QFT0C; - + if (useSP) { + v2Rot = TMath::Cos(2.0 * phiminuspsiRot) * QFT0C; + } + if (!useSP) { + v2Rot = TMath::Cos(2.0 * phiminuspsiRot); + } histos.fill(HIST("hSparseV2SASameEventRotational_V2"), kstarrot.M(), kstarrot.Pt(), v2Rot, centrality); } } @@ -619,8 +661,8 @@ struct kstarpbpb { continue; } if (additionalQAplots) { - histos.fill(HIST("QAbefore/TPC_Nsigma_allka"), track1.pt(), track1.tpcNSigmaKa()); - histos.fill(HIST("QAbefore/TOF_Nsigma_allka"), track1.pt(), track1.tofNSigmaKa()); + histos.fill(HIST("QAbefore/TPC_Nsigma_allka"), track1.pt(), track1.tpcNSigmaKa(), centrality); + histos.fill(HIST("QAbefore/TOF_Nsigma_allka"), track1.pt(), track1.tofNSigmaKa(), centrality); histos.fill(HIST("QAbefore/trkDCAxyka"), track1.dcaXY()); histos.fill(HIST("QAbefore/trkDCAzka"), track1.dcaZ()); histos.fill(HIST("QAbefore/TOF_TPC_Mapka_allka"), track1.tofNSigmaKa(), track1.tpcNSigmaKa()); @@ -643,8 +685,8 @@ struct kstarpbpb { } if (additionalQAplots) { histos.fill(HIST("QAbefore/TOF_TPC_Mapka_allpi"), track2.tofNSigmaPi(), track2.tpcNSigmaPi()); - histos.fill(HIST("QAbefore/TPC_Nsigma_allpi"), track2.pt(), track2.tpcNSigmaPi()); - histos.fill(HIST("QAbefore/TOF_Nsigma_allpi"), track2.pt(), track2.tofNSigmaPi()); + histos.fill(HIST("QAbefore/TPC_Nsigma_allpi"), track2.pt(), track2.tpcNSigmaPi(), centrality); + histos.fill(HIST("QAbefore/TOF_Nsigma_allpi"), track2.pt(), track2.tofNSigmaPi(), centrality); histos.fill(HIST("QAbefore/trkDCAxypi"), track2.dcaXY()); histos.fill(HIST("QAbefore/trkDCAzpi"), track2.dcaZ()); } @@ -697,14 +739,14 @@ struct kstarpbpb { if (same) { if (track1kaon && track2pion) { if (additionalQAplots) { - histos.fill(HIST("QAafter/TPC_Nsigma_allka"), track1.pt(), track1.tpcNSigmaKa()); - histos.fill(HIST("QAafter/TOF_Nsigma_allka"), track1.pt(), track1.tofNSigmaKa()); + histos.fill(HIST("QAafter/TPC_Nsigma_allka"), track1.pt(), track1.tpcNSigmaKa(), centrality); + histos.fill(HIST("QAafter/TOF_Nsigma_allka"), track1.pt(), track1.tofNSigmaKa(), centrality); histos.fill(HIST("QAafter/trkDCAxyka"), track1.dcaXY()); histos.fill(HIST("QAafter/trkDCAzka"), track1.dcaZ()); histos.fill(HIST("QAafter/TOF_TPC_Mapka_allka"), track1.tofNSigmaKa(), track1.tpcNSigmaKa()); histos.fill(HIST("QAafter/TOF_TPC_Mapka_allpi"), track2.tofNSigmaPi(), track2.tpcNSigmaPi()); - histos.fill(HIST("QAafter/TPC_Nsigma_allpi"), track2.pt(), track2.tpcNSigmaPi()); - histos.fill(HIST("QAafter/TOF_Nsigma_allpi"), track2.pt(), track2.tofNSigmaPi()); + histos.fill(HIST("QAafter/TPC_Nsigma_allpi"), track2.pt(), track2.tpcNSigmaPi(), centrality); + histos.fill(HIST("QAafter/TOF_Nsigma_allpi"), track2.pt(), track2.tofNSigmaPi(), centrality); histos.fill(HIST("QAafter/trkDCAxypi"), track2.dcaXY()); histos.fill(HIST("QAafter/trkDCAzpi"), track2.dcaZ()); } @@ -723,7 +765,12 @@ struct kstarpbpb { } auto phiminuspsi = GetPhiInRange(KstarMother.Phi() - psiFT0C); - v2 = TMath::Cos(2.0 * phiminuspsi) * QFT0C; + if (useSP) { + v2 = TMath::Cos(2.0 * phiminuspsi) * QFT0C; + } + if (!useSP) { + v2 = TMath::Cos(2.0 * phiminuspsi); + } histos.fill(HIST("hSparseV2SASameEvent_V2"), KstarMother.M(), KstarMother.Pt(), v2, centrality); } @@ -753,7 +800,12 @@ struct kstarpbpb { } auto phiminuspsiRot = GetPhiInRange(kstarrot.Phi() - psiFT0C); - v2Rot = TMath::Cos(2.0 * phiminuspsiRot) * QFT0C; + if (useSP) { + v2Rot = TMath::Cos(2.0 * phiminuspsiRot) * QFT0C; + } + if (!useSP) { + v2Rot = TMath::Cos(2.0 * phiminuspsiRot); + } histos.fill(HIST("hSparseV2SASameEventRotational_V2"), kstarrot.M(), kstarrot.Pt(), v2Rot, centrality); } @@ -866,7 +918,12 @@ struct kstarpbpb { } auto phiminuspsi = GetPhiInRange(KstarMother.Phi() - psiFT0C); - v2 = TMath::Cos(2.0 * phiminuspsi) * QFT0C; + if (useSP) { + v2 = TMath::Cos(2.0 * phiminuspsi) * QFT0C; + } + if (!useSP) { + v2 = TMath::Cos(2.0 * phiminuspsi); + } histos.fill(HIST("hSparseV2SAlikeEventNN_V2"), KstarMother.M(), KstarMother.Pt(), v2, centrality); } } else if (track1pion && track2kaon) { @@ -879,7 +936,12 @@ struct kstarpbpb { } auto phiminuspsi = GetPhiInRange(KstarMother.Phi() - psiFT0C); - v2 = TMath::Cos(2.0 * phiminuspsi) * QFT0C; + if (useSP) { + v2 = TMath::Cos(2.0 * phiminuspsi) * QFT0C; + } + if (!useSP) { + v2 = TMath::Cos(2.0 * phiminuspsi); + } histos.fill(HIST("hSparseV2SAlikeEventPP_V2"), KstarMother.M(), KstarMother.Pt(), v2, centrality); } @@ -934,6 +996,11 @@ struct kstarpbpb { // printf("Mix = %d\n", 6); continue; } + auto track1ID = track1.globalIndex(); + auto track2ID = track2.globalIndex(); + if (track2ID == track1ID) { + continue; + } if (ispTdepPID && !(selectionPIDNew(track1, 0))) { continue; } @@ -961,6 +1028,186 @@ struct kstarpbpb { } } PROCESS_SWITCH(kstarpbpb, processMixedEvent, "Process Mixed event", true); + void processMC(CollisionMCTrueTable::iterator const& /*TrueCollision*/, CollisionMCRecTableCentFT0C const& RecCollisions, TrackMCTrueTable const& GenParticles, FilTrackMCRecTable const& RecTracks) + { + histos.fill(HIST("hMC"), 0); + if (RecCollisions.size() == 0) { + histos.fill(HIST("hMC"), 1); + return; + } + if (RecCollisions.size() > 1) { + histos.fill(HIST("hMC"), 2); + return; + } + for (auto& RecCollision : RecCollisions) { + auto psiFT0C = 0.0; + histos.fill(HIST("hMC"), 3); + if (!RecCollision.sel8()) { + histos.fill(HIST("hMC"), 4); + continue; + } + + if (!RecCollision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !RecCollision.selection_bit(aod::evsel::kNoITSROFrameBorder)) { + histos.fill(HIST("hMC"), 5); + continue; + } + if (TMath::Abs(RecCollision.posZ()) > cfgCutVertex) { + histos.fill(HIST("hMC"), 6); + continue; + } + histos.fill(HIST("hMC"), 7); + auto centrality = RecCollision.centFT0C(); + histos.fill(HIST("CentPercentileMCRecHist"), centrality); + auto oldindex = -999; + auto Rectrackspart = RecTracks.sliceBy(perCollision, RecCollision.globalIndex()); + // loop over reconstructed particle + for (auto track1 : Rectrackspart) { + if (!selectionTrack(track1)) { + continue; + } + if (ispTdepPID && !(selectionPIDNew(track1, 0))) { + continue; + } + if (!ispTdepPID && !(selectionPID(track1, 0))) { + continue; + } + if (!track1.has_mcParticle()) { + continue; + } + auto track1ID = track1.index(); + for (auto track2 : Rectrackspart) { + auto track2ID = track2.index(); + if (track2ID == track1ID) { + continue; + } + if (!selectionTrack(track2)) { + continue; + } + if (ispTdepPID && !(selectionPIDNew(track2, 1))) { + continue; + } + if (!ispTdepPID && !(selectionPID(track2, 1))) { + continue; + } + if (!track2.has_mcParticle()) { + continue; + } + if (track1.sign() * track2.sign() > 0) { + continue; + } + const auto mctrack1 = track1.mcParticle(); + const auto mctrack2 = track2.mcParticle(); + int track1PDG = TMath::Abs(mctrack1.pdgCode()); + int track2PDG = TMath::Abs(mctrack2.pdgCode()); + if (!mctrack1.isPhysicalPrimary()) { + continue; + } + if (!mctrack2.isPhysicalPrimary()) { + continue; + } + if (!(track1PDG == 321 && track2PDG == 211)) { + continue; + } + for (auto& mothertrack1 : mctrack1.mothers_as()) { + for (auto& mothertrack2 : mctrack2.mothers_as()) { + if (mothertrack1.pdgCode() != mothertrack2.pdgCode()) { + continue; + } + if (mothertrack1 != mothertrack2) { + continue; + } + if (TMath::Abs(mothertrack1.y()) > confRapidity) { + continue; + } + if (PDGcheck && TMath::Abs(mothertrack1.pdgCode()) != 313) { + continue; + } + if (ispTdepPID && !(selectionPIDNew(track1, 0) || selectionPIDNew(track2, 1))) { + continue; + } + if (!ispTdepPID && !(selectionPID(track1, 0) || selectionPID(track2, 1))) { + continue; + } + if (avoidsplitrackMC && oldindex == mothertrack1.globalIndex()) { + continue; + } + oldindex = mothertrack1.globalIndex(); + if (track1.sign() > 0 && track2.sign() < 0) { + KaonPlus = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); + KaonMinus = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massPi); + } + if (track1.sign() < 0 && track2.sign() > 0) { + KaonMinus = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); + KaonPlus = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massPi); + } + KstarMother = KaonPlus + KaonMinus; + if (TMath::Abs(KstarMother.Rapidity()) > confRapidity) { + continue; + } + auto phiminuspsi = GetPhiInRange(KstarMother.Phi() - psiFT0C); + + v2 = TMath::Cos(2.0 * phiminuspsi); + + histos.fill(HIST("hSparseV2SARec_V2"), KstarMother.M(), KstarMother.Pt(), v2, centrality); + histos.fill(HIST("h2PhiRec2"), KstarMother.pt(), centrality); + histos.fill(HIST("hpt"), KstarMother.Pt()); + } + } + } + } + // loop over generated particle + for (auto& mcParticle : GenParticles) { + if (TMath::Abs(mcParticle.y()) > confRapidity) { + continue; + } + if (PDGcheck && mcParticle.pdgCode() != 313) { + continue; + } + auto kDaughters = mcParticle.daughters_as(); + if (kDaughters.size() != 2) { + continue; + } + auto daughtp = false; + auto daughtm = false; + for (auto kCurrentDaughter : kDaughters) { + if (!kCurrentDaughter.isPhysicalPrimary()) { + continue; + } + if (kCurrentDaughter.pdgCode() == +321) { + if (genacceptancecut && kCurrentDaughter.pt() > cfgCutPT && TMath::Abs(kCurrentDaughter.eta()) < cfgCutEta) { + daughtp = true; + } + if (!genacceptancecut) { + daughtp = true; + } + KaonPlus = ROOT::Math::PxPyPzMVector(kCurrentDaughter.px(), kCurrentDaughter.py(), kCurrentDaughter.pz(), massKa); + } else if (kCurrentDaughter.pdgCode() == -211) { + if (genacceptancecut && kCurrentDaughter.pt() > cfgCutPT && TMath::Abs(kCurrentDaughter.eta()) < cfgCutEta) { + daughtm = true; + } + if (!genacceptancecut) { + daughtm = true; + } + KaonMinus = ROOT::Math::PxPyPzMVector(kCurrentDaughter.px(), kCurrentDaughter.py(), kCurrentDaughter.pz(), massPi); + } + } + if (daughtp && daughtm) { + KstarMother = KaonPlus + KaonMinus; + if (TMath::Abs(KstarMother.Rapidity()) > confRapidity) { + continue; + } + auto phiminuspsi = GetPhiInRange(KstarMother.Phi() - psiFT0C); + + v2 = TMath::Cos(2.0 * phiminuspsi); + + histos.fill(HIST("hSparseV2SAGen_V2"), KstarMother.M(), KstarMother.Pt(), v2, centrality); + histos.fill(HIST("h2PhiGen2"), KstarMother.pt(), centrality); + } + } + } // rec collision loop + + } // process MC + PROCESS_SWITCH(kstarpbpb, processMC, "Process MC", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx b/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx index b5145275178..ca4c7e313ba 100644 --- a/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx +++ b/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx @@ -96,6 +96,7 @@ struct phianalysisrun3_PbPb { Configurable fillRotation{"fillRotation", true, "fill rotation"}; Configurable confMinRot{"confMinRot", 5.0 * TMath::Pi() / 6.0, "Minimum of rotation"}; Configurable confMaxRot{"confMaxRot", 7.0 * TMath::Pi() / 6.0, "Maximum of rotation"}; + Configurable PDGcheck{"PDGcheck", true, "PDGcheck"}; Configurable genacceptancecut{"genacceptancecut", true, "use acceptance cut for generated"}; // MC @@ -131,8 +132,8 @@ struct phianalysisrun3_PbPb { histos.add("h1Phi1massrec", "Phi meson Rec", kTH1F, {{200, 0.9, 1.1}}); histos.add("h1Phipt", "Phi meson Rec", kTH1F, {{200, 0.0f, 20.0f}}); histos.add("hOccupancy1", "Occupancy distribution", kTH1F, {{500, 0, 50000}}); - histos.add("TOF_Nsigma_MC", "TOF NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Kaon};", {HistType::kTH2D, {{200, -12, 12}, {200, 0.0, 200.0}}}); - histos.add("TPC_Nsigma_MC", "TPC NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Kaon};", {HistType::kTH2D, {{200, -12, 12}, {200, 0.0, 200.0}}}); + histos.add("TOF_Nsigma_MC", "TOF NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Kaon};", {HistType::kTH3D, {{200, -12, 12}, {200, 0.0, 200.0}, {200, 0.0f, 20.0f}}}); + histos.add("TPC_Nsigma_MC", "TPC NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Kaon};", {HistType::kTH3D, {{200, -12, 12}, {200, 0.0, 200.0}, {200, 0.0f, 20.0f}}}); } // DCA QA @@ -142,12 +143,12 @@ struct phianalysisrun3_PbPb { histos.add("QAafter/trkDCAz", "DCAz distribution of kaon track candidates", HistType::kTH1F, {{150, 0.0f, 1.0f}}); // PID QA before cuts histos.add("QAbefore/TOF_TPC_Mapka_all", "TOF + TPC Combined PID for Kaon;#sigma_{TOF}^{Kaon};#sigma_{TPC}^{Kaon}", {HistType::kTH2D, {{100, -6, 6}, {100, -6, 6}}}); - histos.add("QAbefore/TOF_Nsigma_all", "TOF NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Kaon};", {HistType::kTH2D, {{100, -6, 6}, {200, 0.0, 200.0}}}); - histos.add("QAbefore/TPC_Nsigma_all", "TPC NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Kaon};", {HistType::kTH2D, {{100, -6, 6}, {200, 0.0, 200.0}}}); + histos.add("QAbefore/TOF_Nsigma_all", "TOF NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Kaon};", {HistType::kTH3D, {{200, -12, 12}, {200, 0.0, 200.0}, {200, 0.0f, 20.0f}}}); + histos.add("QAbefore/TPC_Nsigma_all", "TPC NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Kaon};", {HistType::kTH3D, {{200, -12, 12}, {200, 0.0, 200.0}, {200, 0.0f, 20.0f}}}); // PID QA after cuts histos.add("QAafter/TOF_TPC_Mapka_all", "TOF + TPC Combined PID for Kaon;#sigma_{TOF}^{Kaon};#sigma_{TPC}^{Kaon}", {HistType::kTH2D, {{100, -6, 6}, {100, -6, 6}}}); - histos.add("QAafter/TOF_Nsigma_all", "TOF NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Kaon};", {HistType::kTH2D, {{100, -6, 6}, {200, 0.0, 200.0}}}); - histos.add("QAafter/TPC_Nsigma_all", "TPC NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Kaon};", {HistType::kTH2D, {{100, -6, 6}, {200, 0.0, 200.0}}}); + histos.add("QAafter/TOF_Nsigma_all", "TOF NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Kaon};", {HistType::kTH3D, {{200, -12, 12}, {200, 0.0, 200.0}, {200, 0.0f, 20.0f}}}); + histos.add("QAafter/TPC_Nsigma_all", "TPC NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Kaon};", {HistType::kTH3D, {{200, -12, 12}, {200, 0.0, 200.0}, {200, 0.0f, 20.0f}}}); } double massKa = o2::constants::physics::MassKPlus; @@ -289,8 +290,8 @@ struct phianalysisrun3_PbPb { if (!selectionTrack(track1)) { continue; } - histos.fill(HIST("QAbefore/TPC_Nsigma_all"), track1.tpcNSigmaKa(), multiplicity); - histos.fill(HIST("QAbefore/TOF_Nsigma_all"), track1.tofNSigmaKa(), multiplicity); + histos.fill(HIST("QAbefore/TPC_Nsigma_all"), track1.tpcNSigmaKa(), multiplicity, track1.pt()); + histos.fill(HIST("QAbefore/TOF_Nsigma_all"), track1.tofNSigmaKa(), multiplicity, track1.pt()); histos.fill(HIST("QAbefore/trkDCAxy"), track1.dcaXY()); histos.fill(HIST("QAbefore/trkDCAz"), track1.dcaZ()); histos.fill(HIST("QAbefore/TOF_TPC_Mapka_all"), track1.tofNSigmaKa(), track1.tpcNSigmaKa()); @@ -310,16 +311,16 @@ struct phianalysisrun3_PbPb { bool unlike = true; bool mix = false; if (!ispTdepPID && selectionPID(track1) && selectionPID(track2)) { - histos.fill(HIST("QAafter/TPC_Nsigma_all"), track1.tpcNSigmaKa(), multiplicity); - histos.fill(HIST("QAafter/TOF_Nsigma_all"), track1.tofNSigmaKa(), multiplicity); + histos.fill(HIST("QAafter/TPC_Nsigma_all"), track1.tpcNSigmaKa(), multiplicity, track1.pt()); + histos.fill(HIST("QAafter/TOF_Nsigma_all"), track1.tofNSigmaKa(), multiplicity, track1.pt()); histos.fill(HIST("QAafter/trkDCAxy"), track1.dcaXY()); histos.fill(HIST("QAafter/trkDCAz"), track1.dcaZ()); histos.fill(HIST("QAafter/TOF_TPC_Mapka_all"), track1.tofNSigmaKa(), track1.tpcNSigmaKa()); FillinvMass(track1, track2, multiplicity, unlike, mix, massKa, massKa); } if (ispTdepPID && selectionPIDpTdependent(track1) && selectionPIDpTdependent(track2)) { - histos.fill(HIST("QAafter/TPC_Nsigma_all"), track1.tpcNSigmaKa(), multiplicity); - histos.fill(HIST("QAafter/TOF_Nsigma_all"), track1.tofNSigmaKa(), multiplicity); + histos.fill(HIST("QAafter/TPC_Nsigma_all"), track1.tpcNSigmaKa(), multiplicity, track1.pt()); + histos.fill(HIST("QAafter/TOF_Nsigma_all"), track1.tofNSigmaKa(), multiplicity, track1.pt()); histos.fill(HIST("QAafter/trkDCAxy"), track1.dcaXY()); histos.fill(HIST("QAafter/trkDCAz"), track1.dcaZ()); histos.fill(HIST("QAafter/TOF_TPC_Mapka_all"), track1.tofNSigmaKa(), track1.tpcNSigmaKa()); @@ -570,7 +571,7 @@ struct phianalysisrun3_PbPb { if (TMath::Abs(mothertrack1.y()) > confRapidity) { continue; } - if (TMath::Abs(mothertrack1.pdgCode()) != 333) { + if (PDGcheck && TMath::Abs(mothertrack1.pdgCode()) != 333) { continue; } if (!ispTdepPID && (!selectionPID(track1) || !selectionPID(track2))) { @@ -606,7 +607,7 @@ struct phianalysisrun3_PbPb { if (TMath::Abs(mcParticle.y()) > confRapidity) { continue; } - if (mcParticle.pdgCode() != 333) { + if (PDGcheck && mcParticle.pdgCode() != 333) { continue; } auto kDaughters = mcParticle.daughters_as(); @@ -681,7 +682,7 @@ struct phianalysisrun3_PbPb { if (std::abs(mcParticle.y()) >= 0.5) { continue; } - if (mcParticle.pdgCode() != 333) { + if (PDGcheck && mcParticle.pdgCode() != 333) { continue; } auto kDaughters = mcParticle.daughters_as(); @@ -786,7 +787,7 @@ struct phianalysisrun3_PbPb { if (std::abs(mothertrack1.y()) >= 0.5) { continue; } - if (std::abs(mothertrack1.pdgCode()) != 333) { + if (PDGcheck && std::abs(mothertrack1.pdgCode()) != 333) { continue; } if (!ispTdepPID && (!selectionPID(track1) || !selectionPID(track2))) { @@ -796,8 +797,8 @@ struct phianalysisrun3_PbPb { continue; } - histos.fill(HIST("TPC_Nsigma_MC"), track1.tpcNSigmaKa(), multiplicity); - histos.fill(HIST("TOF_Nsigma_MC"), track1.tofNSigmaKa(), multiplicity); + histos.fill(HIST("TPC_Nsigma_MC"), track1.tpcNSigmaKa(), multiplicity, track1.pt()); + histos.fill(HIST("TOF_Nsigma_MC"), track1.tofNSigmaKa(), multiplicity, track1.pt()); if (avoidsplitrackMC && oldindex == mothertrack1.globalIndex()) { histos.fill(HIST("h1PhiRecsplit"), mothertrack1.pt()); continue; From 919ee9cc3643c95ffe8a2d1829ed141dfdf4e353 Mon Sep 17 00:00:00 2001 From: Victor Gonzalez Date: Sat, 22 Feb 2025 06:49:33 +0100 Subject: [PATCH 0376/1650] [PWGCF] DptDpt - Enhanced the information about TPC sector chambers (#10139) Co-authored-by: Victor --- .../Tasks/dptDptEfficiencyAndQc.cxx | 96 ++++++++++++++++++- 1 file changed, 94 insertions(+), 2 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx index f15d8aaa6a7..46c2014f208 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx @@ -59,7 +59,7 @@ TpcExcludeTrack tpcExcluder; ///< the TPC excluder object instance namespace efficiencyandqatask { -/// \enum KindOfProcessQA +/// \enum KindOfData /// \brief The kind of data for templating the procedures enum KindOfData { kReco = 0, ///< processing over reconstructed particles/tracks @@ -127,14 +127,26 @@ struct QADataCollectingEngine { std::vector> fhPtVsEtaB{2, nullptr}; std::vector> fhPtVsZvtxB{2, nullptr}; std::shared_ptr fhPhiVsPtPosB{nullptr}; + std::shared_ptr fhNchVsPhiVsPtPosB{nullptr}; + TH2* fhPerColNchVsPhiVsPtPosB{nullptr}; std::shared_ptr fhPhiVsInnerWallMomPosB{nullptr}; + std::shared_ptr fhNchVsPhiVsInnerWallMomPosB{nullptr}; + TH2* fhPerColNchVsPhiVsInnerWallMomPosB{nullptr}; std::shared_ptr fhPhiVsPtNegB{nullptr}; + std::shared_ptr fhNchVsPhiVsPtNegB{nullptr}; + TH2* fhPerColNchVsPhiVsPtNegB{nullptr}; std::shared_ptr fhPhiVsInnerWallMomNegB{nullptr}; + std::shared_ptr fhNchVsPhiVsInnerWallMomNegB{nullptr}; + TH2* fhPerColNchVsPhiVsInnerWallMomNegB{nullptr}; std::vector>> fhPtA{2, {nsp, nullptr}}; std::vector>> fhPtVsEtaA{2, {nsp, nullptr}}; std::vector>> fhPtVsZvtxA{2, {nsp, nullptr}}; std::vector> fhPhiVsPtA{nsp, nullptr}; + std::vector> fhNchVsPhiVsPtA{nsp, nullptr}; + std::vector fhPerColNchVsPhiVsPtA{nsp, nullptr}; std::vector> fhPhiVsInnerWallMomA{nsp, nullptr}; + std::vector> fhNchVsPhiVsInnerWallMomA{nsp, nullptr}; + std::vector fhPerColNchVsPhiVsInnerWallMomA{nsp, nullptr}; std::vector> fhPhiShiftedVsPtA{nsp, nullptr}; std::vector> fhPhiShiftedVsInnerWallMomA{nsp, nullptr}; std::shared_ptr fhPtVsEtaItsAcc{nullptr}; @@ -197,13 +209,17 @@ struct QADataCollectingEngine { using namespace analysis::dptdptfilter; AxisSpec pidPtAxis{150, 0.1, 5.0, "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec pidPtAxisReduced{50, 0.1, 5.0, "#it{p}_{T} (GeV/#it{c})"}; AxisSpec pidPAxis{150, 0.1, 5.0, "#it{p} (GeV/#it{c})"}; + AxisSpec pidPAxisReduced{50, 0.1, 5.0, "#it{p} (GeV/#it{c})"}; pidPtAxis.makeLogarithmic(); pidPAxis.makeLogarithmic(); const AxisSpec ptAxis{ptbins, ptlow, ptup, "#it{p}_{T} (GeV/c)"}; const AxisSpec etaAxis{etabins, etalow, etaup, "#eta"}; const AxisSpec phiAxis{360, 0.0f, constants::math::TwoPI, "#varphi (rad)"}; - const AxisSpec phiSectorAxis{144, 0.0f, 0.36, "#varphi (mod(2#pi/18) (rad))"}; + const AxisSpec phiSectorAxis{144, 0.0f, 0.36f, "#varphi (mod(2#pi/18) (rad))"}; + const AxisSpec phiSectorAxisReduced{36, 0.0f, 0.36f, "#varphi (mod(2#pi/18) (rad))"}; + const AxisSpec nChargeAxis{100, 0.0f, 100.0f, "#it{N}_{ch}"}; const AxisSpec phiShiftedSectorAxis{220, -55.0f, 55.0f, "% of the sector"}; const AxisSpec zvtxAxis{zvtxbins, zvtxlow, zvtxup, "#it{z}_{vtx}"}; const AxisSpec itsNClsAxis{8, -0.5, 7.5, "ITS n clusters"}; @@ -228,9 +244,13 @@ struct QADataCollectingEngine { if constexpr (kindOfData == kReco) { /* only the reconstructed level histograms*/ fhPhiVsPtPosB = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "Before"), "PhiVsPtPos", "#varphi (mod(2#pi/18))", kTH2F, {pidPtAxis, phiSectorAxis}); + fhNchVsPhiVsPtPosB = ADDHISTOGRAM(TH3, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "Before"), "NchVsPhiVsPtPos", "#it{N}_{ch}^{#plus} #varphi (mod(2#pi/18))", kTH3F, {pidPtAxisReduced, phiSectorAxisReduced, nChargeAxis}); fhPhiVsInnerWallMomPosB = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "Before"), "PhiVsIwMomPos", "#varphi (mod(2#pi/18)) TPC_{iw} #it{p}", kTH2F, {pidPAxis, phiSectorAxis}); + fhNchVsPhiVsInnerWallMomPosB = ADDHISTOGRAM(TH3, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "Before"), "NchVsPhiVsIwMomPos", "#it{N}_{ch}^{#plus} #varphi (mod(2#pi/18)) TPC_{iw} #it{p}", kTH3F, {pidPAxisReduced, phiSectorAxisReduced, nChargeAxis}); fhPhiVsPtNegB = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "Before"), "PhiVsPtNeg", "#varphi (mod(2#pi/18))", kTH2F, {pidPtAxis, phiSectorAxis}); + fhNchVsPhiVsPtNegB = ADDHISTOGRAM(TH3, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "Before"), "NchVsPhiVsPtNeg", "#it{N}_{ch}^{#minus} #varphi (mod(2#pi/18))", kTH3F, {pidPtAxisReduced, phiSectorAxisReduced, nChargeAxis}); fhPhiVsInnerWallMomNegB = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "Before"), "PhiVsIwMomNeg", "#varphi (mod(2#pi/18)) TPC_{iw} #it{p}", kTH2F, {pidPAxis, phiSectorAxis}); + fhNchVsPhiVsInnerWallMomNegB = ADDHISTOGRAM(TH3, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "Before"), "NchVsPhiVsIwMomNeg", "#it{N}_{ch}^{#minus} #varphi (mod(2#pi/18)) TPC_{iw} #it{p}", kTH3F, {pidPAxisReduced, phiSectorAxisReduced, nChargeAxis}); fhItsNClsVsPtB = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "Before"), "ITSNCls", "ITS clusters", kTH2F, {ptAxis, itsNClsAxis}); fhItsChi2NClsVsPtB = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "Before"), "ITSChi2NCls", "ITS #Chi^{2}", kTH2F, {ptAxis, itsCh2Axis}); fhTpcFindableNClsVsPtB = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "Before"), "TPCFindableNCls", "TPC findable clusters", kTH2F, {ptAxis, tpcNClsAxis}); @@ -248,9 +268,25 @@ struct QADataCollectingEngine { fhPtVsEtaItsTofAcc = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "Efficiency", "Reco"), "ptItsTofAcc", "ITS&TOF tracks within the acceptance", kTH2F, {etaAxis, ptAxis}); fhPtVsEtaTpcTofAcc = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "Efficiency", "Reco"), "ptTpcTofAcc", "TPC&TOF tracks within the acceptance", kTH2F, {etaAxis, ptAxis}); fhPtVsEtaItsTpcTofAcc = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "Efficiency", "Reco"), "ptItsTpcTofAcc", "ITS&TPC&TOF tracks within the acceptance", kTH2F, {etaAxis, ptAxis}); + /* per collision histograms not going to the results file */ + int nPtBins = fhNchVsPhiVsPtPosB->GetNbinsX(); + float ptLow = fhNchVsPhiVsPtNegB->GetXaxis()->GetBinLowEdge(1); + float ptHigh = fhNchVsPhiVsPtNegB->GetXaxis()->GetBinUpEdge(nPtBins); + int nTpcIwMomBins = fhNchVsPhiVsInnerWallMomNegB->GetNbinsX(); + float tpcIwMomLow = fhNchVsPhiVsInnerWallMomNegB->GetXaxis()->GetBinLowEdge(1); + float tpcIwMomHigh = fhNchVsPhiVsInnerWallMomNegB->GetXaxis()->GetBinUpEdge(nTpcIwMomBins); + int nPhiSectorBins = fhNchVsPhiVsPtPosB->GetNbinsY(); + float phiSectorLow = fhNchVsPhiVsPtNegB->GetYaxis()->GetBinLowEdge(1); + float phiSectorHigh = fhNchVsPhiVsPtNegB->GetYaxis()->GetBinUpEdge(nPhiSectorBins); + fhPerColNchVsPhiVsPtPosB = new TH2F("PerColNchVsPhiVsPtPosB", "", nPtBins, ptLow, ptHigh, nPhiSectorBins, phiSectorLow, phiSectorHigh); + fhPerColNchVsPhiVsInnerWallMomPosB = new TH2F("PerColNchVsPhiVsInnerWallMomPosB", "", nTpcIwMomBins, tpcIwMomLow, tpcIwMomHigh, nPhiSectorBins, phiSectorLow, phiSectorHigh); + fhPerColNchVsPhiVsPtNegB = new TH2F("PerColNchVsPhiVsPtNegB", "", nPtBins, ptLow, ptHigh, nPhiSectorBins, phiSectorLow, phiSectorHigh); + fhPerColNchVsPhiVsInnerWallMomNegB = new TH2F("PerColNchVsPhiVsInnerWallMomNegB", "", nTpcIwMomBins, tpcIwMomLow, tpcIwMomHigh, nPhiSectorBins, phiSectorLow, phiSectorHigh); for (uint isp = 0; isp < nsp; ++isp) { fhPhiVsPtA[isp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "After"), HNAMESTRING("PhiVsPt_%s", tnames[isp].c_str()), HTITLESTRING("#varphi %s (mod(2#pi/18))", tnames[isp].c_str()), kTH2F, {pidPtAxis, phiSectorAxis}); + fhNchVsPhiVsPtA[isp] = ADDHISTOGRAM(TH3, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "After"), HNAMESTRING("NchVsPhiVsPt_%s", tnames[isp].c_str()), HTITLESTRING("#it{N}_{ch}^{%s} #varphi (mod(2#pi/18))", tnames[isp].c_str()), kTH3F, {pidPtAxisReduced, phiSectorAxisReduced, nChargeAxis}); fhPhiVsInnerWallMomA[isp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "After"), HNAMESTRING("PhiVsIwMom_%s", tnames[isp].c_str()), HTITLESTRING("#varphi %s (mod(2#pi/18)) TPC_{iw} #it{p}", tnames[isp].c_str()), kTH2F, {pidPAxis, phiSectorAxis}); + fhNchVsPhiVsInnerWallMomA[isp] = ADDHISTOGRAM(TH3, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "Before"), HNAMESTRING("NchVsPhiVsIwMom_%s", tnames[isp].c_str()), HTITLESTRING("#it{N}_{ch}^{%s} #varphi (mod(2#pi/18)) TPC_{iw} #it{p}", tnames[isp].c_str()), kTH3F, {pidPAxisReduced, phiSectorAxisReduced, nChargeAxis}); fhPhiShiftedVsPtA[isp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "After"), HNAMESTRING("PhiShiftedVsPt_%s", tnames[isp].c_str()), HTITLESTRING("%s TPC sector %%", tnames[isp].c_str()), kTH2F, {pidPtAxis, phiShiftedSectorAxis}); fhPhiShiftedVsInnerWallMomA[isp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "After"), HNAMESTRING("PhiShiftedVsIwMom_%s", tnames[isp].c_str()), HTITLESTRING("%s TPC sector %% TPC_{iw} #it{p}", tnames[isp].c_str()), kTH2F, {pidPAxis, phiShiftedSectorAxis}); fhItsNClsVsPtA[isp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "After"), HNAMESTRING("ITSNCls_%s", tnames[isp].c_str()), HTITLESTRING("ITS clusters %s", tnames[isp].c_str()), kTH2F, {ptAxis, itsNClsAxis}); @@ -269,6 +305,9 @@ struct QADataCollectingEngine { fhPtVsEtaItsTofA[isp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "Efficiency", "Reco"), HNAMESTRING("ptItsTof_%s", tnames[isp].c_str()), HTITLESTRING("ITS&TOF %s tracks", tnames[isp].c_str()), kTH2F, {etaAxis, ptAxis}); fhPtVsEtaTpcTofA[isp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "Efficiency", "Reco"), HNAMESTRING("ptTpcTof_%s", tnames[isp].c_str()), HTITLESTRING("TPC&TOF %s tracks", tnames[isp].c_str()), kTH2F, {etaAxis, ptAxis}); fhPtVsEtaItsTpcTofA[isp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "Efficiency", "Reco"), HNAMESTRING("ptItsTpcTof_%s", tnames[isp].c_str()), HTITLESTRING("ITS&TPC&TOF %s tracks", tnames[isp].c_str()), kTH2F, {etaAxis, ptAxis}); + /* per collision histograms not going to the results file */ + fhPerColNchVsPhiVsPtA[isp] = new TH2F(HNAMESTRING("PerColNchVsPhiVsPt_%s", tnames[isp].c_str()), "", nPtBins, ptLow, ptHigh, nPhiSectorBins, phiSectorLow, phiSectorHigh); + fhPerColNchVsPhiVsInnerWallMomA[isp] = new TH2F(HNAMESTRING("PerColNchVsPhiVsInnerWallMom_%s", tnames[isp].c_str()), "", nTpcIwMomBins, tpcIwMomLow, tpcIwMomHigh, nPhiSectorBins, phiSectorLow, phiSectorHigh); } } else { AxisSpec recoSpecies{static_cast(nsp) + 1, -0.5, nsp - 0.5, "reco species"}; @@ -369,10 +408,14 @@ struct QADataCollectingEngine { phiShiftedPercentInTpcSector = (phiShiftedPercentInTpcSector > 50.0f) ? (phiShiftedPercentInTpcSector - 100.0f) : phiShiftedPercentInTpcSector; if (track.sign() > 0) { fhPhiVsPtPosB->Fill(track.pt(), phiInTpcSector); + fhPerColNchVsPhiVsPtPosB->Fill(track.pt(), phiInTpcSector); fhPhiVsInnerWallMomPosB->Fill(track.tpcInnerParam(), phiInTpcSector); + fhPerColNchVsPhiVsInnerWallMomPosB->Fill(track.tpcInnerParam(), phiInTpcSector); } else { fhPhiVsPtNegB->Fill(track.pt(), phiInTpcSector); + fhPerColNchVsPhiVsPtNegB->Fill(track.pt(), phiInTpcSector); fhPhiVsInnerWallMomNegB->Fill(track.tpcInnerParam(), phiInTpcSector); + fhPerColNchVsPhiVsInnerWallMomNegB->Fill(track.tpcInnerParam(), phiInTpcSector); } fhItsNClsVsPtB->Fill(track.pt(), track.itsNCls()); fhItsChi2NClsVsPtB->Fill(track.pt(), track.itsChi2NCl()); @@ -394,7 +437,9 @@ struct QADataCollectingEngine { } if (!(track.trackacceptedid() < 0)) { fhPhiVsPtA[track.trackacceptedid()]->Fill(track.pt(), phiInTpcSector); + fhPerColNchVsPhiVsPtA[track.trackacceptedid()]->Fill(track.pt(), phiInTpcSector); fhPhiVsInnerWallMomA[track.trackacceptedid()]->Fill(track.tpcInnerParam(), phiInTpcSector); + fhPerColNchVsPhiVsInnerWallMomA[track.trackacceptedid()]->Fill(track.tpcInnerParam(), phiInTpcSector); fhPhiShiftedVsPtA[track.trackacceptedid()]->Fill(track.pt(), phiShiftedPercentInTpcSector); fhPhiShiftedVsInnerWallMomA[track.trackacceptedid()]->Fill(track.tpcInnerParam(), phiShiftedPercentInTpcSector); fhItsNClsVsPtA[track.trackacceptedid()]->Fill(track.pt(), track.itsNCls()); @@ -481,6 +526,47 @@ struct QADataCollectingEngine { } } } + + template + void newCollision() + { + using namespace efficiencyandqatask; + if constexpr (kindOfData == kReco) { + fhPerColNchVsPhiVsPtPosB->Reset(); + fhPerColNchVsPhiVsPtNegB->Reset(); + fhPerColNchVsPhiVsInnerWallMomPosB->Reset(); + fhPerColNchVsPhiVsInnerWallMomNegB->Reset(); + for (uint isp = 0; isp < nsp; ++isp) { + fhPerColNchVsPhiVsPtA[isp]->Reset(); + fhPerColNchVsPhiVsInnerWallMomA[isp]->Reset(); + } + } + } + + template + void finishedCollision() + { + using namespace efficiencyandqatask; + if constexpr (kindOfData == kReco) { + auto fillHistogram = [](auto& th, const TH2* sh) { + int nBinsX = sh->GetNbinsX(); + int nBinsY = sh->GetNbinsY(); + for (int ix = 0; ix < nBinsX; ++ix) { + for (int iy = 0; iy < nBinsY; ++iy) { + th->Fill(sh->GetXaxis()->GetBinCenter(ix + 1), sh->GetYaxis()->GetBinCenter(iy + 1), sh->GetBinContent(ix + 1, iy + 1)); + } + } + }; + fillHistogram(fhNchVsPhiVsPtPosB, fhPerColNchVsPhiVsPtPosB); + fillHistogram(fhNchVsPhiVsPtNegB, fhPerColNchVsPhiVsPtNegB); + fillHistogram(fhNchVsPhiVsInnerWallMomPosB, fhPerColNchVsPhiVsInnerWallMomPosB); + fillHistogram(fhNchVsPhiVsInnerWallMomNegB, fhPerColNchVsPhiVsInnerWallMomNegB); + for (uint isp = 0; isp < nsp; ++isp) { + fillHistogram(fhNchVsPhiVsPtA[isp], fhPerColNchVsPhiVsPtA[isp]); + fillHistogram(fhNchVsPhiVsInnerWallMomA[isp], fhPerColNchVsPhiVsInnerWallMomA[isp]); + } + } + } }; /* the PID data collecting engine */ @@ -986,6 +1072,9 @@ struct DptDptEfficiencyAndQc { int ixDCE = getDCEindex(collision); if (!(ixDCE < 0)) { + if constexpr (kindOfProcess == kBASIC) { + qaDataCE[ixDCE]->newCollision(); + } for (auto const& track : tracks) { float tpcmom = track.p(); float tofmom = track.p(); @@ -1004,6 +1093,9 @@ struct DptDptEfficiencyAndQc { pidExtraDataCE[ixDCE]->processTrack(track, tpcmom, tofmom); } } + if constexpr (kindOfProcess == kBASIC) { + qaDataCE[ixDCE]->finishedCollision(); + } } } From 802b802ca03edfb31d24f20f08401a41f3e041f6 Mon Sep 17 00:00:00 2001 From: Zhengqing Wang Date: Sat, 22 Feb 2025 22:11:49 +0800 Subject: [PATCH 0377/1650] [PWGCF] add PID TOF only mode (#10140) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/pidcme.cxx | 621 ++++++++++++++++++++---------------- 1 file changed, 349 insertions(+), 272 deletions(-) diff --git a/PWGCF/Flow/Tasks/pidcme.cxx b/PWGCF/Flow/Tasks/pidcme.cxx index baf95cdd60a..30ec8b6a455 100644 --- a/PWGCF/Flow/Tasks/pidcme.cxx +++ b/PWGCF/Flow/Tasks/pidcme.cxx @@ -98,10 +98,13 @@ struct FillPIDcolums { Configurable cfgOpenITSCut{"cfgOpenITSCut", true, "open ITSnsigma cut"}; Configurable cfgOpenDetailPlots{"cfgOpenDetailPlots", true, "open detail TH3D plots for nSigmaTPC-ITS Pt-eta-Phi nSigmaITS-clustersize"}; - Configurable cfgOpenAllowCrossTrack{"cfgOpenAllowCrossTrack", true, "Allow one track to be identified as different kind of PID particles"}; + Configurable cfgOpenAllowCrossTrack{"cfgOpenAllowCrossTrack", false, "Allow one track to be identified as different kind of PID particles"}; Configurable cfgOpenCrossTrackQAPlots{"cfgOpenCrossTrackQAPlots", true, "open cross pid track QA plots"}; + Configurable cfgOpenTOFOnlyPID{"cfgOpenTOFOnlyPID", true, "only accept tracks who has TOF infomation and use TOFnsigma for PID(priority greater than TPConly and combined)"}; + Configurable cfgOpenTPCOnlyPID{"cfgOpenTPCOnlyPID", false, "only use TPCnsigma for PID(priority grater than combined less than TOFOnly)"}; - Configurable> cfgnSigmaCutTPC{"cfgnSigmaCutTPC", {3, 3, 3}, "TPC cut for pi k p respectively at low pt"}; + Configurable> cfgnSigmaCutTPC{"cfgnSigmaCutTPC", {3, 3, 3}, "TPC nsigma cut for pi k p respectively at low pt and for the TPCOnly case"}; + Configurable> cfgnSigmaCutTOF{"cfgnSigmaCutTOF", {1.5, 1.5, 1.5}, "TOF nsigma cut for pi k p respectively for the TOFonly case"}; Configurable> cfgnSigmaCutRMS{"cfgnSigmaCutRMS", {3, 3, 3}, "TPC_TOF combined cut for pi k p respectively at high pt"}; Configurable> cfgnSigmaCutITS{"cfgnSigmaCutITS", {3, 2.5, 2}, "TPC_TOF combined cut for pi k p respectively at high pt"}; @@ -150,15 +153,36 @@ struct FillPIDcolums { template int selectionPidtpctof(const T& candidate) { + // initialization for basic parameter float averClusSizeCosl = averageClusterSizeCosl(candidate.itsClusterSizes(), candidate.eta()); std::array nSigmaTPC = {candidate.tpcNSigmaPi(), candidate.tpcNSigmaKa(), candidate.tpcNSigmaPr()}; + std::array nSigmaTOF = {candidate.tofNSigmaPi(), candidate.tofNSigmaKa(), candidate.tofNSigmaPr()}; std::array nSigmaCombined = {std::hypot(candidate.tpcNSigmaPi(), candidate.tofNSigmaPi()), std::hypot(candidate.tpcNSigmaKa(), candidate.tofNSigmaKa()), std::hypot(candidate.tpcNSigmaPr(), candidate.tofNSigmaPr())}; - // Choose which nSigma to use + std::array nSigmaToUse; + std::vector pidVector; int pid = -1; bool kIsPi = false, kIsKa = false, kIsPr = false; - std::vector pidVector = (candidate.pt() > cfgPtMaxforTPCOnlyPID && candidate.hasTOF()) ? cfgnSigmaCutRMS.value : cfgnSigmaCutTPC.value; + /*int currentPtBin = 0; + for (int i = 0; i < static_cast(cfgPtPIDCut.value.size()) - 1; ++i) { + if (candidate.pt() >= cfgPtPIDCut.value[i] && candidate.pt() < cfgPtPIDCut.value[i + 1]) { + currentPtBin = i; + break; + } + }*/ + // Choose which nSigma array and PIDcut array to use + if (cfgOpenTOFOnlyPID) { + if (!candidate.hasTOF()) + return -1; + nSigmaToUse = nSigmaTOF; + pidVector = cfgnSigmaCutTOF.value; + } else if (cfgOpenTPCOnlyPID) { + nSigmaToUse = nSigmaTPC; + pidVector = cfgnSigmaCutTPC.value; + } else { + nSigmaToUse = (candidate.pt() > cfgPtMaxforTPCOnlyPID && candidate.hasTOF()) ? nSigmaCombined : nSigmaTPC; + pidVector = (candidate.pt() > cfgPtMaxforTPCOnlyPID && candidate.hasTOF()) ? cfgnSigmaCutRMS.value : cfgnSigmaCutTPC.value; + } float nsigma = pidVector[0]; - std::array nSigmaToUse = (candidate.pt() > cfgPtMaxforTPCOnlyPID && candidate.hasTOF()) ? nSigmaCombined : nSigmaTPC; // Fill cross pid QA for (int i = 0; i < 3; ++i) { if (std::abs(nSigmaToUse[i]) < pidVector[i]) { @@ -175,6 +199,8 @@ struct FillPIDcolums { histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_cross_Pi"), candidate.tpcNSigmaPi(), averClusSizeCosl); histosQA.fill(HIST("QA/PID/histPhi_Dis_cross_Pi"), candidate.phi()); histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_cross_Pi"), candidate.tpcNSigmaPi(), candidate.itsNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_cross_Pi"), candidate.tofNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_cross_Pi"), candidate.pt(), candidate.tofNSigmaPi()); } } if (i == 1) { @@ -190,6 +216,8 @@ struct FillPIDcolums { histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_cross_Ka"), candidate.tpcNSigmaKa(), averClusSizeCosl); histosQA.fill(HIST("QA/PID/histPhi_Dis_cross_Ka"), candidate.phi()); histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_cross_Ka"), candidate.tpcNSigmaKa(), candidate.itsNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_cross_Ka"), candidate.tofNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_cross_Ka"), candidate.pt(), candidate.tofNSigmaKa()); } } if (i == 2) { @@ -205,6 +233,8 @@ struct FillPIDcolums { histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_cross_Pr"), candidate.tpcNSigmaKa(), averClusSizeCosl); histosQA.fill(HIST("QA/PID/histPhi_Dis_cross_Pr"), candidate.phi()); histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_cross_Pr"), candidate.tpcNSigmaPr(), candidate.itsNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_cross_Pr"), candidate.tofNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_cross_Pr"), candidate.pt(), candidate.tofNSigmaPr()); } } } @@ -229,6 +259,13 @@ struct FillPIDcolums { template bool selectionITS(const T& candidate, int mode, float avgclssize) { + /*int currentPtBin = 0; + for (int i = 0; i < static_cast(cfgPtPIDCut.value.size()) - 1; ++i) { + if (candidate.pt() >= cfgPtPIDCut.value[i] && candidate.pt() < cfgPtPIDCut.value[i + 1]) { + currentPtBin = i; + break; + } + }*/ switch (mode) { case 1: // For Pion if (!(std::abs(candidate.itsNSigmaPi()) < cfgnSigmaCutITS.value[0] && avgclssize > cfgAveClusSizeCoslMinPi && avgclssize < cfgAveClusSizeCoslMaxPi)) { @@ -280,9 +317,11 @@ struct FillPIDcolums { histosQA.add(Form("QA/PID/histnSigma_TPC_TOF_cross_Pi"), "", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaTOF, axisPtPID}}); histosQA.add(Form("QA/PID/histnSigma_TPC_TOF_cross_Ka"), "", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaTOF, axisPtPID}}); histosQA.add(Form("QA/PID/histnSigma_TPC_TOF_cross_Pr"), "", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaTOF, axisPtPID}}); - histosQA.add(Form("QA/PID/histnSigma_TPC_TOF_AfterITS_Pi"), "", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaTOF, axisPtPID}}); - histosQA.add(Form("QA/PID/histnSigma_TPC_TOF_AfterITS_Ka"), "", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaTOF, axisPtPID}}); - histosQA.add(Form("QA/PID/histnSigma_TPC_TOF_AfterITS_Pr"), "", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaTOF, axisPtPID}}); + if (cfgOpenITSCut) { + histosQA.add(Form("QA/PID/histnSigma_TPC_TOF_AfterITS_Pi"), "", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaTOF, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigma_TPC_TOF_AfterITS_Ka"), "", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaTOF, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigma_TPC_TOF_AfterITS_Pr"), "", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaTOF, axisPtPID}}); + } // Hist for PID Averge Cluster Size ITS related histosQA.add(Form("QA/PID/histAverClusterSizeCosl_Pi"), "", {HistType::kTH1F, {axisClusterSize}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_Ka"), "", {HistType::kTH1F, {axisClusterSize}}); @@ -290,53 +329,64 @@ struct FillPIDcolums { histosQA.add(Form("QA/PID/histAverClusterSizeCosl_cross_Pi"), "", {HistType::kTH1F, {axisClusterSize}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_cross_Ka"), "", {HistType::kTH1F, {axisClusterSize}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_cross_Pr"), "", {HistType::kTH1F, {axisClusterSize}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_AfterITS_Pi"), "", {HistType::kTH1F, {axisClusterSize}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_AfterITS_Ka"), "", {HistType::kTH1F, {axisClusterSize}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_AfterITS_Pr"), "", {HistType::kTH1F, {axisClusterSize}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_Pi"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_Ka"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_Pr"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_cross_Pi"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_cross_Ka"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_cross_Pr"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_AfterITS_Pi"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_AfterITS_Ka"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_AfterITS_Pr"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pi"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Ka"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pr"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_cross_Pi"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_cross_Ka"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_cross_Pr"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Pi"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Ka"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Pr"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_Pi"), "", {HistType::kTH2F, {axisnSigmaTPC, axisnSigmaITS}}); histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_Ka"), "", {HistType::kTH2F, {axisnSigmaTPC, axisnSigmaITS}}); histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_Pr"), "", {HistType::kTH2F, {axisnSigmaTPC, axisnSigmaITS}}); histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_cross_Pi"), "", {HistType::kTH2F, {axisnSigmaTPC, axisnSigmaITS}}); histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_cross_Ka"), "", {HistType::kTH2F, {axisnSigmaTPC, axisnSigmaITS}}); histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_cross_Pr"), "", {HistType::kTH2F, {axisnSigmaTPC, axisnSigmaITS}}); - histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Pi"), "", {HistType::kTH2F, {axisnSigmaTPC, axisnSigmaITS}}); - histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Ka"), "", {HistType::kTH2F, {axisnSigmaTPC, axisnSigmaITS}}); - histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Pr"), "", {HistType::kTH2F, {axisnSigmaTPC, axisnSigmaITS}}); + if (cfgOpenITSCut) { + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_AfterITS_Pi"), "", {HistType::kTH1F, {axisClusterSize}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_AfterITS_Ka"), "", {HistType::kTH1F, {axisClusterSize}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_AfterITS_Pr"), "", {HistType::kTH1F, {axisClusterSize}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_AfterITS_Pi"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_AfterITS_Ka"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_AfterITS_Pr"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Pi"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Ka"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Pr"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); + histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Pi"), "", {HistType::kTH2F, {axisnSigmaTPC, axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Ka"), "", {HistType::kTH2F, {axisnSigmaTPC, axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Pr"), "", {HistType::kTH2F, {axisnSigmaTPC, axisnSigmaITS}}); + } // Hist for Nsigma TPC TOF histosQA.add(Form("QA/PID/histdEdxTPC_All"), "", {HistType::kTH2F, {axisRigidity, axisdEdx}}); histosQA.add(Form("QA/PID/histdEdxTPC_Pi"), "", {HistType::kTH2F, {axisRigidity, axisdEdx}}); - histosQA.add(Form("QA/PID/histnSigma_Pi"), "", {HistType::kTH1F, {axisnSigmaTPC}}); - histosQA.add(Form("QA/PID/histnSigma_Pt_Pi"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_TPC_Pi"), "", {HistType::kTH1F, {axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_TPC_Pt_Pi"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); histosQA.add(Form("QA/PID/histdEdxTPC_Ka"), "", {HistType::kTH2F, {axisRigidity, axisdEdx}}); - histosQA.add(Form("QA/PID/histnSigma_Ka"), "", {HistType::kTH1F, {axisnSigmaTPC}}); - histosQA.add(Form("QA/PID/histnSigma_Pt_Ka"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_TPC_Ka"), "", {HistType::kTH1F, {axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_TPC_Pt_Ka"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); histosQA.add(Form("QA/PID/histdEdxTPC_Pr"), "", {HistType::kTH2F, {axisRigidity, axisdEdx}}); - histosQA.add(Form("QA/PID/histnSigma_Pr"), "", {HistType::kTH1F, {axisnSigmaTPC}}); - histosQA.add(Form("QA/PID/histnSigma_Pt_Pr"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_TPC_Pr"), "", {HistType::kTH1F, {axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_TPC_Pt_Pr"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); histosQA.add(Form("QA/PID/histnSigma_com_Pi"), "", {HistType::kTH1F, {axisnSigmaCom}}); histosQA.add(Form("QA/PID/histnSigma_com_Ka"), "", {HistType::kTH1F, {axisnSigmaCom}}); histosQA.add(Form("QA/PID/histnSigma_com_Pr"), "", {HistType::kTH1F, {axisnSigmaCom}}); histosQA.add(Form("QA/PID/histnSigma_TOF_Pi"), "", {HistType::kTH1F, {axisnSigmaTOF}}); histosQA.add(Form("QA/PID/histnSigma_TOF_Ka"), "", {HistType::kTH1F, {axisnSigmaTOF}}); histosQA.add(Form("QA/PID/histnSigma_TOF_Pr"), "", {HistType::kTH1F, {axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_cross_Pi"), "", {HistType::kTH1F, {axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_cross_Ka"), "", {HistType::kTH1F, {axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_cross_Pr"), "", {HistType::kTH1F, {axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_Pi"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_Ka"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_Pr"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_cross_Pi"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_cross_Ka"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_cross_Pr"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); histosQA.add(Form("QA/PID/histdEdxTPC_cross_Pi"), "", {HistType::kTH2F, {axisRigidity, axisdEdx}}); histosQA.add(Form("QA/PID/histnSigma_cross_Pi"), "", {HistType::kTH1F, {axisnSigmaTPC}}); histosQA.add(Form("QA/PID/histnSigma_Pt_cross_Pi"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); @@ -346,6 +396,14 @@ struct FillPIDcolums { histosQA.add(Form("QA/PID/histdEdxTPC_cross_Pr"), "", {HistType::kTH2F, {axisRigidity, axisdEdx}}); histosQA.add(Form("QA/PID/histnSigma_cross_Pr"), "", {HistType::kTH1F, {axisnSigmaTPC}}); histosQA.add(Form("QA/PID/histnSigma_Pt_cross_Pr"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); + if (cfgOpenITSCut) { + histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_AfterITS_Pi"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_AfterITS_Ka"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_AfterITS_Pr"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_TPC_Pt_AfterITS_Pi"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_TPC_Pt_AfterITS_Ka"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_TPC_Pt_AfterITS_Pr"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); + } // Hist for nSigma ITS histosQA.add(Form("QA/PID/histnSigma_ITS_Pi"), "", {HistType::kTH1F, {axisnSigmaITS}}); histosQA.add(Form("QA/PID/histnSigma_ITS_Ka"), "", {HistType::kTH1F, {axisnSigmaITS}}); @@ -353,9 +411,11 @@ struct FillPIDcolums { histosQA.add(Form("QA/PID/histnSigma_ITS_cross_Pi"), "", {HistType::kTH1F, {axisnSigmaITS}}); histosQA.add(Form("QA/PID/histnSigma_ITS_cross_Ka"), "", {HistType::kTH1F, {axisnSigmaITS}}); histosQA.add(Form("QA/PID/histnSigma_ITS_cross_Pr"), "", {HistType::kTH1F, {axisnSigmaITS}}); - histosQA.add(Form("QA/PID/histnSigma_ITS_AfterITS_Pi"), "", {HistType::kTH1F, {axisnSigmaITS}}); - histosQA.add(Form("QA/PID/histnSigma_ITS_AfterITS_Ka"), "", {HistType::kTH1F, {axisnSigmaITS}}); - histosQA.add(Form("QA/PID/histnSigma_ITS_AfterITS_Pr"), "", {HistType::kTH1F, {axisnSigmaITS}}); + if (cfgOpenITSCut) { + histosQA.add(Form("QA/PID/histnSigma_ITS_AfterITS_Pi"), "", {HistType::kTH1F, {axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigma_ITS_AfterITS_Ka"), "", {HistType::kTH1F, {axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigma_ITS_AfterITS_Pr"), "", {HistType::kTH1F, {axisnSigmaITS}}); + } // Hist for checking the PID phi distribution histosQA.add(Form("QA/PID/histPhi_Dis_Pi"), "", {HistType::kTH1F, {axisPhi}}); histosQA.add(Form("QA/PID/histPhi_Dis_Ka"), "", {HistType::kTH1F, {axisPhi}}); @@ -363,41 +423,45 @@ struct FillPIDcolums { histosQA.add(Form("QA/PID/histPhi_Dis_cross_Pi"), "", {HistType::kTH1F, {axisPhi}}); histosQA.add(Form("QA/PID/histPhi_Dis_cross_Ka"), "", {HistType::kTH1F, {axisPhi}}); histosQA.add(Form("QA/PID/histPhi_Dis_cross_Pr"), "", {HistType::kTH1F, {axisPhi}}); - histosQA.add(Form("QA/PID/histPhi_Dis_AfterITS_Pi"), "", {HistType::kTH1F, {axisPhi}}); - histosQA.add(Form("QA/PID/histPhi_Dis_AfterITS_Ka"), "", {HistType::kTH1F, {axisPhi}}); - histosQA.add(Form("QA/PID/histPhi_Dis_AfterITS_Pr"), "", {HistType::kTH1F, {axisPhi}}); + if (cfgOpenITSCut) { + histosQA.add(Form("QA/PID/histPhi_Dis_AfterITS_Pi"), "", {HistType::kTH1F, {axisPhi}}); + histosQA.add(Form("QA/PID/histPhi_Dis_AfterITS_Ka"), "", {HistType::kTH1F, {axisPhi}}); + histosQA.add(Form("QA/PID/histPhi_Dis_AfterITS_Pr"), "", {HistType::kTH1F, {axisPhi}}); + } // Hist 3D for PID check if (cfgOpenDetailPlots) { - histosQA.add(Form("QA/PID/histPhi_Pt_Eta_PosPi"), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhi, axisPtPID, cfgaxisetaPID}}); - histosQA.add(Form("QA/PID/histPhi_Pt_Eta_NegPi"), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhi, axisPtPID, cfgaxisetaPID}}); - histosQA.add(Form("QA/PID/histPhi_Pt_Eta_PosKa"), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhi, axisPtPID, cfgaxisetaPID}}); - histosQA.add(Form("QA/PID/histPhi_Pt_Eta_NegKa"), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhi, axisPtPID, cfgaxisetaPID}}); - histosQA.add(Form("QA/PID/histPhi_Pt_Eta_PosPr"), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhi, axisPtPID, cfgaxisetaPID}}); - histosQA.add(Form("QA/PID/histPhi_Pt_Eta_NegPr"), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhi, axisPtPID, cfgaxisetaPID}}); histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosPi_Before"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosKa_Before"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosPr_Before"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); - histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosPi_After"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); - histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosKa_After"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); - histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosPr_After"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegPi_Before"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegKa_Before"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegPr_Before"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); - histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegPi_After"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); - histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegKa_After"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); - histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegPr_After"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPi_Before"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosKa_Before"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPr_Before"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPi_After"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosKa_After"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPr_After"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPi_Before"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegKa_Before"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPr_Before"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPi_After"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegKa_After"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPr_After"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); + if (cfgOpenITSCut) { + histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosPi_After"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosKa_After"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosPr_After"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegPi_After"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegKa_After"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegPr_After"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPi_After"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosKa_After"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPr_After"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPi_After"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegKa_After"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPr_After"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); + histosQA.add(Form("QA/PID/histPhi_Pt_Eta_PosPi"), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhi, axisPtPID, cfgaxisetaPID}}); + histosQA.add(Form("QA/PID/histPhi_Pt_Eta_NegPi"), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhi, axisPtPID, cfgaxisetaPID}}); + histosQA.add(Form("QA/PID/histPhi_Pt_Eta_PosKa"), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhi, axisPtPID, cfgaxisetaPID}}); + histosQA.add(Form("QA/PID/histPhi_Pt_Eta_NegKa"), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhi, axisPtPID, cfgaxisetaPID}}); + histosQA.add(Form("QA/PID/histPhi_Pt_Eta_PosPr"), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhi, axisPtPID, cfgaxisetaPID}}); + histosQA.add(Form("QA/PID/histPhi_Pt_Eta_NegPr"), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhi, axisPtPID, cfgaxisetaPID}}); + } } } Produces pidCmeTable; @@ -416,234 +480,247 @@ struct FillPIDcolums { histosQA.fill(HIST("QA/PID/histdEdxTPC_All"), track.sign() * track.tpcInnerParam(), track.tpcSignal()); pidFlag = selectionPidtpctof(track); // First fill ITS uncut plots - if ((pidFlag == 1) || (pidFlag == 7) || (pidFlag == 8) || (pidFlag == 10)) { - histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_Pi"), track.tpcNSigmaPi(), track.tofNSigmaPi(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_Pi"), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_Pi"), track.p(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pi"), track.tpcNSigmaPi(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_Pi"), track.tpcNSigmaPi(), track.itsNSigmaPi()); - histosQA.fill(HIST("QA/PID/histdEdxTPC_Pi"), track.sign() * track.tpcInnerParam(), track.tpcSignal()); - histosQA.fill(HIST("QA/PID/histnSigma_Pi"), track.tpcNSigmaPi()); - histosQA.fill(HIST("QA/PID/histnSigma_Pt_Pi"), track.pt(), track.tpcNSigmaPi()); - histosQA.fill(HIST("QA/PID/histnSigma_com_Pi"), std::hypot(track.tpcNSigmaPi(), track.tofNSigmaPi())); - histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pi"), track.tofNSigmaPi()); - histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pi"), track.itsNSigmaPi()); - histosQA.fill(HIST("QA/PID/histPhi_Dis_Pi"), track.phi()); - if (cfgOpenDetailPlots) { - if (track.sign() > 0) { - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosPi_Before"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPi_Before"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); - } else if (track.sign() < 0) { - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegPi_Before"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPi_Before"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); - } - } - } - if ((pidFlag == 2) || (pidFlag == 7) || (pidFlag == 9) || (pidFlag == 10)) { - histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_Ka"), track.tpcNSigmaKa(), track.tofNSigmaKa(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_Ka"), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_Ka"), track.p(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Ka"), track.tpcNSigmaKa(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_Ka"), track.tpcNSigmaKa(), track.itsNSigmaKa()); - histosQA.fill(HIST("QA/PID/histdEdxTPC_Ka"), track.sign() * track.tpcInnerParam(), track.tpcSignal()); - histosQA.fill(HIST("QA/PID/histnSigma_Ka"), track.tpcNSigmaKa()); - histosQA.fill(HIST("QA/PID/histnSigma_Pt_Ka"), track.pt(), track.tpcNSigmaKa()); - histosQA.fill(HIST("QA/PID/histnSigma_com_Ka"), std::hypot(track.tpcNSigmaKa(), track.tofNSigmaKa())); - histosQA.fill(HIST("QA/PID/histnSigma_TOF_Ka"), track.tofNSigmaKa()); - histosQA.fill(HIST("QA/PID/histnSigma_ITS_Ka"), track.itsNSigmaKa()); - histosQA.fill(HIST("QA/PID/histPhi_Dis_Ka"), track.phi()); - if (cfgOpenDetailPlots) { - if (track.sign() > 0) { - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosKa_Before"), track.tpcNSigmaKa(), track.itsNSigmaKa(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosKa_Before"), track.tpcNSigmaKa(), averClusSizeCosl, track.pt()); - } else if (track.sign() < 0) { - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegKa_Before"), track.tpcNSigmaKa(), track.itsNSigmaKa(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegKa_Before"), track.tpcNSigmaKa(), averClusSizeCosl, track.pt()); + if (!(pidFlag == 0 || pidFlag == -1)) { + if ((pidFlag == 1) || (pidFlag == 7) || (pidFlag == 8) || (pidFlag == 10)) { + histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_Pi"), track.tpcNSigmaPi(), track.tofNSigmaPi(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_Pi"), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_Pi"), track.p(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pi"), track.tpcNSigmaPi(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_Pi"), track.tpcNSigmaPi(), track.itsNSigmaPi()); + histosQA.fill(HIST("QA/PID/histdEdxTPC_Pi"), track.sign() * track.tpcInnerParam(), track.tpcSignal()); + histosQA.fill(HIST("QA/PID/histnSigma_TPC_Pi"), track.tpcNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_TPC_Pt_Pi"), track.pt(), track.tpcNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_com_Pi"), std::hypot(track.tpcNSigmaPi(), track.tofNSigmaPi())); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pi"), track.tofNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_Pi"), track.pt(), track.tofNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pi"), track.itsNSigmaPi()); + histosQA.fill(HIST("QA/PID/histPhi_Dis_Pi"), track.phi()); + if (cfgOpenDetailPlots) { + if (track.sign() > 0) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosPi_Before"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPi_Before"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); + } else if (track.sign() < 0) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegPi_Before"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPi_Before"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); + } } } - } - if ((pidFlag == 3) || (pidFlag == 8) || (pidFlag == 9) || (pidFlag == 10)) { - histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_Pr"), track.tpcNSigmaPr(), track.tofNSigmaPr(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_Pr"), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_Pr"), track.p(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pr"), track.tpcNSigmaPr(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_Pr"), track.tpcNSigmaPr(), track.itsNSigmaPr()); - histosQA.fill(HIST("QA/PID/histdEdxTPC_Pr"), track.sign() * track.tpcInnerParam(), track.tpcSignal()); - histosQA.fill(HIST("QA/PID/histnSigma_Pr"), track.tpcNSigmaPr()); - histosQA.fill(HIST("QA/PID/histnSigma_Pt_Pr"), track.pt(), track.tpcNSigmaPr()); - histosQA.fill(HIST("QA/PID/histnSigma_com_Pr"), std::hypot(track.tpcNSigmaPr(), track.tofNSigmaPr())); - histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pr"), track.tofNSigmaPr()); - histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pr"), track.itsNSigmaPr()); - histosQA.fill(HIST("QA/PID/histPhi_Dis_Pr"), track.phi()); - if (cfgOpenDetailPlots) { - if (track.sign() > 0) { - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosPr_Before"), track.tpcNSigmaPr(), track.itsNSigmaPr(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPr_Before"), track.tpcNSigmaPr(), averClusSizeCosl, track.pt()); - } else if (track.sign() < 0) { - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegPr_Before"), track.tpcNSigmaPr(), track.itsNSigmaPr(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPr_Before"), track.tpcNSigmaPr(), averClusSizeCosl, track.pt()); + if ((pidFlag == 2) || (pidFlag == 7) || (pidFlag == 9) || (pidFlag == 10)) { + histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_Ka"), track.tpcNSigmaKa(), track.tofNSigmaKa(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_Ka"), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_Ka"), track.p(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Ka"), track.tpcNSigmaKa(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_Ka"), track.tpcNSigmaKa(), track.itsNSigmaKa()); + histosQA.fill(HIST("QA/PID/histdEdxTPC_Ka"), track.sign() * track.tpcInnerParam(), track.tpcSignal()); + histosQA.fill(HIST("QA/PID/histnSigma_TPC_Ka"), track.tpcNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_TPC_Pt_Ka"), track.pt(), track.tpcNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_com_Ka"), std::hypot(track.tpcNSigmaKa(), track.tofNSigmaKa())); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_Ka"), track.tofNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_Ka"), track.pt(), track.tofNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_Ka"), track.itsNSigmaKa()); + histosQA.fill(HIST("QA/PID/histPhi_Dis_Ka"), track.phi()); + if (cfgOpenDetailPlots) { + if (track.sign() > 0) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosKa_Before"), track.tpcNSigmaKa(), track.itsNSigmaKa(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosKa_Before"), track.tpcNSigmaKa(), averClusSizeCosl, track.pt()); + } else if (track.sign() < 0) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegKa_Before"), track.tpcNSigmaKa(), track.itsNSigmaKa(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegKa_Before"), track.tpcNSigmaKa(), averClusSizeCosl, track.pt()); + } } } - } - // Second proform ITS cut - if (cfgOpenITSCut) { - int idx = -1; - switch (pidFlag) { - case 1: - if (!selectionITS(track, 1, averClusSizeCosl)) { - pidFlag = 4; - } - break; - case 2: - if (!selectionITS(track, 2, averClusSizeCosl)) { - pidFlag = 5; - } - break; - case 3: - if (!selectionITS(track, 3, averClusSizeCosl)) { - pidFlag = 6; - } - break; - case 7: - idx = (selectionITS(track, 1, averClusSizeCosl) << 1) | selectionITS(track, 2, averClusSizeCosl); - switch (idx) { - case 0: - pidFlag = 11; - break; - - case 1: - pidFlag = 2; - break; - - case 2: - pidFlag = 1; - break; + if ((pidFlag == 3) || (pidFlag == 8) || (pidFlag == 9) || (pidFlag == 10)) { + histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_Pr"), track.tpcNSigmaPr(), track.tofNSigmaPr(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_Pr"), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_Pr"), track.p(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pr"), track.tpcNSigmaPr(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_Pr"), track.tpcNSigmaPr(), track.itsNSigmaPr()); + histosQA.fill(HIST("QA/PID/histdEdxTPC_Pr"), track.sign() * track.tpcInnerParam(), track.tpcSignal()); + histosQA.fill(HIST("QA/PID/histnSigma_TPC_Pr"), track.tpcNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_TPC_Pt_Pr"), track.pt(), track.tpcNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_com_Pr"), std::hypot(track.tpcNSigmaPr(), track.tofNSigmaPr())); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pr"), track.tofNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_Pr"), track.pt(), track.tofNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pr"), track.itsNSigmaPr()); + histosQA.fill(HIST("QA/PID/histPhi_Dis_Pr"), track.phi()); + if (cfgOpenDetailPlots) { + if (track.sign() > 0) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosPr_Before"), track.tpcNSigmaPr(), track.itsNSigmaPr(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPr_Before"), track.tpcNSigmaPr(), averClusSizeCosl, track.pt()); + } else if (track.sign() < 0) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegPr_Before"), track.tpcNSigmaPr(), track.itsNSigmaPr(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPr_Before"), track.tpcNSigmaPr(), averClusSizeCosl, track.pt()); } - break; - case 8: - idx = (selectionITS(track, 1, averClusSizeCosl) << 1) | selectionITS(track, 3, averClusSizeCosl); - switch (idx) { - case 0: - pidFlag = 12; - break; - - case 1: - pidFlag = 3; - break; - - case 2: - pidFlag = 1; - break; - } - break; - case 9: - idx = (selectionITS(track, 2, averClusSizeCosl) << 1) | selectionITS(track, 3, averClusSizeCosl); - switch (idx) { - case 0: - pidFlag = 13; - break; - - case 1: - pidFlag = 3; - break; - - case 2: - pidFlag = 2; - break; - } - break; - case 10: - idx = (selectionITS(track, 1, averClusSizeCosl) << 2) | (selectionITS(track, 2, averClusSizeCosl) << 1) | selectionITS(track, 3, averClusSizeCosl); - switch (idx) { - case 0: - pidFlag = 14; - break; - - case 1: - pidFlag = 3; - break; - - case 2: - pidFlag = 2; - break; - - case 3: - pidFlag = 9; - break; - - case 4: - pidFlag = 1; - break; - - case 5: - pidFlag = 8; - break; - - case 6: - pidFlag = 7; - break; - } - break; - } - } - // Third Fill ITS cut plots - if ((pidFlag == 1) || (pidFlag == 7) || (pidFlag == 8) || (pidFlag == 10)) { - histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_AfterITS_Pi"), track.tpcNSigmaPi(), track.tofNSigmaPi(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_AfterITS_Pi"), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_AfterITS_Pi"), track.p(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Pi"), track.tpcNSigmaPi(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Pi"), track.tpcNSigmaPi(), track.itsNSigmaPi()); - histosQA.fill(HIST("QA/PID/histnSigma_ITS_AfterITS_Pi"), track.itsNSigmaPi()); - histosQA.fill(HIST("QA/PID/histPhi_Dis_AfterITS_Pi"), track.phi()); - if (cfgOpenDetailPlots) { - if (track.sign() > 0) { - histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_PosPi"), track.phi(), track.pt(), track.eta()); - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosPi_After"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPi_After"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); - } else if (track.sign() < 0) { - histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_NegPi"), track.phi(), track.pt(), track.eta()); - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegPi_After"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPi_After"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); } } - } - if ((pidFlag == 2) || (pidFlag == 7) || (pidFlag == 9) || (pidFlag == 10)) { - histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_AfterITS_Ka"), track.tpcNSigmaKa(), track.tofNSigmaKa(), track.pt()); - histosQA.fill(HIST("QA/PID/histnSigma_ITS_AfterITS_Ka"), track.itsNSigmaKa()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_AfterITS_Ka"), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_AfterITS_Ka"), track.p(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Ka"), track.tpcNSigmaKa(), track.itsNSigmaKa()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Ka"), track.tpcNSigmaKa(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histPhi_Dis_AfterITS_Ka"), track.phi()); - if (cfgOpenDetailPlots) { - if (track.sign() > 0) { - histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_PosKa"), track.phi(), track.pt(), track.eta()); - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosKa_After"), track.tpcNSigmaKa(), track.itsNSigmaKa(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosKa_After"), track.tpcNSigmaKa(), averClusSizeCosl, track.pt()); - } else if (track.sign() < 0) { - histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_NegKa"), track.phi(), track.pt(), track.eta()); - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegKa_After"), track.tpcNSigmaKa(), track.itsNSigmaKa(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegKa_After"), track.tpcNSigmaKa(), averClusSizeCosl, track.pt()); + // Second proform ITS cut + if (cfgOpenITSCut) { + int idx = -1; + switch (pidFlag) { + case 1: + if (!selectionITS(track, 1, averClusSizeCosl)) { + pidFlag = 4; + } + break; + case 2: + if (!selectionITS(track, 2, averClusSizeCosl)) { + pidFlag = 5; + } + break; + case 3: + if (!selectionITS(track, 3, averClusSizeCosl)) { + pidFlag = 6; + } + break; + case 7: + idx = (selectionITS(track, 1, averClusSizeCosl) << 1) | selectionITS(track, 2, averClusSizeCosl); + switch (idx) { + case 0: + pidFlag = 11; + break; + + case 1: + pidFlag = 2; + break; + + case 2: + pidFlag = 1; + break; + } + break; + case 8: + idx = (selectionITS(track, 1, averClusSizeCosl) << 1) | selectionITS(track, 3, averClusSizeCosl); + switch (idx) { + case 0: + pidFlag = 12; + break; + + case 1: + pidFlag = 3; + break; + + case 2: + pidFlag = 1; + break; + } + break; + case 9: + idx = (selectionITS(track, 2, averClusSizeCosl) << 1) | selectionITS(track, 3, averClusSizeCosl); + switch (idx) { + case 0: + pidFlag = 13; + break; + + case 1: + pidFlag = 3; + break; + + case 2: + pidFlag = 2; + break; + } + break; + case 10: + idx = (selectionITS(track, 1, averClusSizeCosl) << 2) | (selectionITS(track, 2, averClusSizeCosl) << 1) | selectionITS(track, 3, averClusSizeCosl); + switch (idx) { + case 0: + pidFlag = 14; + break; + + case 1: + pidFlag = 3; + break; + + case 2: + pidFlag = 2; + break; + + case 3: + pidFlag = 9; + break; + + case 4: + pidFlag = 1; + break; + + case 5: + pidFlag = 8; + break; + + case 6: + pidFlag = 7; + break; + } + break; } } - } - if ((pidFlag == 3) || (pidFlag == 8) || (pidFlag == 9) || (pidFlag == 10)) { - histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_AfterITS_Pr"), track.tpcNSigmaPr(), track.tofNSigmaPr(), track.pt()); - histosQA.fill(HIST("QA/PID/histnSigma_ITS_AfterITS_Pr"), track.itsNSigmaPr()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_AfterITS_Pr"), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_AfterITS_Pr"), track.p(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Pr"), track.tpcNSigmaPr(), track.itsNSigmaPr()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Pr"), track.tpcNSigmaPr(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histPhi_Dis_AfterITS_Pr"), track.phi()); - if (cfgOpenDetailPlots) { - if (track.sign() > 0) { - histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_PosPr"), track.phi(), track.pt(), track.eta()); - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosPr_After"), track.tpcNSigmaPr(), track.itsNSigmaPr(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPr_After"), track.tpcNSigmaPr(), averClusSizeCosl, track.pt()); - } else if (track.sign() < 0) { - histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_NegPr"), track.phi(), track.pt(), track.eta()); - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegPr_After"), track.tpcNSigmaPr(), track.itsNSigmaPr(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPr_After"), track.tpcNSigmaPr(), averClusSizeCosl, track.pt()); + // Third Fill ITS cut plots + if (cfgOpenITSCut) { + if ((pidFlag == 1) || (pidFlag == 7) || (pidFlag == 8) || (pidFlag == 10)) { + histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_AfterITS_Pi"), track.tpcNSigmaPi(), track.tofNSigmaPi(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_AfterITS_Pi"), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_AfterITS_Pi"), track.p(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Pi"), track.tpcNSigmaPi(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Pi"), track.tpcNSigmaPi(), track.itsNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_AfterITS_Pi"), track.itsNSigmaPi()); + histosQA.fill(HIST("QA/PID/histPhi_Dis_AfterITS_Pi"), track.phi()); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_AfterITS_Pi"), track.pt(), track.tofNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_TPC_Pt_AfterITS_Pi"), track.pt(), track.tpcNSigmaPi()); + if (cfgOpenDetailPlots) { + if (track.sign() > 0) { + histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_PosPi"), track.phi(), track.pt(), track.eta()); + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosPi_After"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPi_After"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); + } else if (track.sign() < 0) { + histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_NegPi"), track.phi(), track.pt(), track.eta()); + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegPi_After"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPi_After"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); + } + } + } + if ((pidFlag == 2) || (pidFlag == 7) || (pidFlag == 9) || (pidFlag == 10)) { + histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_AfterITS_Ka"), track.tpcNSigmaKa(), track.tofNSigmaKa(), track.pt()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_AfterITS_Ka"), track.itsNSigmaKa()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_AfterITS_Ka"), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_AfterITS_Ka"), track.p(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Ka"), track.tpcNSigmaKa(), track.itsNSigmaKa()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Ka"), track.tpcNSigmaKa(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histPhi_Dis_AfterITS_Ka"), track.phi()); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_AfterITS_Ka"), track.pt(), track.tofNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_TPC_Pt_AfterITS_Ka"), track.pt(), track.tpcNSigmaKa()); + if (cfgOpenDetailPlots) { + if (track.sign() > 0) { + histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_PosKa"), track.phi(), track.pt(), track.eta()); + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosKa_After"), track.tpcNSigmaKa(), track.itsNSigmaKa(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosKa_After"), track.tpcNSigmaKa(), averClusSizeCosl, track.pt()); + } else if (track.sign() < 0) { + histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_NegKa"), track.phi(), track.pt(), track.eta()); + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegKa_After"), track.tpcNSigmaKa(), track.itsNSigmaKa(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegKa_After"), track.tpcNSigmaKa(), averClusSizeCosl, track.pt()); + } + } + } + if ((pidFlag == 3) || (pidFlag == 8) || (pidFlag == 9) || (pidFlag == 10)) { + histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_AfterITS_Pr"), track.tpcNSigmaPr(), track.tofNSigmaPr(), track.pt()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_AfterITS_Pr"), track.itsNSigmaPr()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_AfterITS_Pr"), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_AfterITS_Pr"), track.p(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Pr"), track.tpcNSigmaPr(), track.itsNSigmaPr()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Pr"), track.tpcNSigmaPr(), averClusSizeCosl); + histosQA.fill(HIST("QA/PID/histPhi_Dis_AfterITS_Pr"), track.phi()); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_AfterITS_Pr"), track.pt(), track.tofNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_TPC_Pt_AfterITS_Pr"), track.pt(), track.tpcNSigmaPr()); + if (cfgOpenDetailPlots) { + if (track.sign() > 0) { + histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_PosPr"), track.phi(), track.pt(), track.eta()); + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosPr_After"), track.tpcNSigmaPr(), track.itsNSigmaPr(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPr_After"), track.tpcNSigmaPr(), averClusSizeCosl, track.pt()); + } else if (track.sign() < 0) { + histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_NegPr"), track.phi(), track.pt(), track.eta()); + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegPr_After"), track.tpcNSigmaPr(), track.itsNSigmaPr(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPr_After"), track.tpcNSigmaPr(), averClusSizeCosl, track.pt()); + } + } } } } @@ -986,10 +1063,10 @@ struct pidcme { // o2-linter: disable=name/struct Configurable cfgOpenEvSelMultCorrelation{"cfgOpenEvSelMultCorrelation", true, "Multiplicity correlation cut"}; Configurable cfgOpenEvSelV0AT0ACut{"cfgOpenEvSelV0AT0ACut", true, "V0A T0A 5 sigma cut"}; Configurable cfgOpenFullEventQA{"cfgOpenFullEventQA", true, "Open full QA plots for event QA"}; - Configurable cfgkOpenCME{"cfgkOpenCME", true, "open PID CME"}; + Configurable cfgkOpenCME{"cfgkOpenCME", false, "open PID CME"}; Configurable cfgkOpenPiPi{"cfgkOpenPiPi", true, "open Pi-Pi"}; - Configurable cfgkOpenKaKa{"cfgkOpenKaKa", false, "open Ka-Ka"}; - Configurable cfgkOpenPrPr{"cfgkOpenPrPr", false, "open Pr-Pr"}; + Configurable cfgkOpenKaKa{"cfgkOpenKaKa", true, "open Ka-Ka"}; + Configurable cfgkOpenPrPr{"cfgkOpenPrPr", true, "open Pr-Pr"}; Configurable cfgkOpenPiKa{"cfgkOpenPiKa", true, "open Pi-Ka"}; Configurable cfgkOpenPiPr{"cfgkOpenPiPr", true, "open Pi-Pr"}; Configurable cfgkOpenKaPr{"cfgkOpenKaPr", true, "open Ka-Pr"}; From b754b9b3275f92860b1e54d5ade4c786db229042 Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Sat, 22 Feb 2025 15:43:44 +0100 Subject: [PATCH 0378/1650] [PWGLF] Strangeness builder vs derived builder streamlining (#10141) Co-authored-by: ALICE Builder --- .../Strangeness/strangederivedbuilder.cxx | 78 ------------------- .../strangenessbuilderfindable.cxx | 12 ++- 2 files changed, 11 insertions(+), 79 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx index 6c8edd1adcd..0f1e94963af 100644 --- a/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx @@ -130,11 +130,6 @@ struct strangederivedbuilder { Produces geOmegaMinus; Produces geOmegaPlus; - //__________________________________________________ - // Found tags for findable exercise - Produces v0FoundTags; - Produces cascFoundTags; - //__________________________________________________ // Debug Produces straOrigin; @@ -358,17 +353,6 @@ struct strangederivedbuilder { } else { LOGF(info, "Process strange mothers...........: no"); } - LOGF(info, "====] findable exercise extras [=================================="); - if (doprocessV0FoundTags) { - LOGF(info, "Process found V0 tags.............: yes"); - } else { - LOGF(info, "Process found V0 tags.............: no"); - } - if (doprocessCascFoundTags) { - LOGF(info, "Process found cascade tags........: yes"); - } else { - LOGF(info, "Process found cascade tags........: no"); - } LOGF(info, "=================================================================="); // setup map for fast checking if enabled @@ -388,16 +372,6 @@ struct strangederivedbuilder { histos.add("h2dNVerticesVsCentrality", "h2dNVerticesVsCentrality", kTH2D, {axisCentrality, axisNVertices}); - if (doprocessV0FoundTags || doprocessCascFoundTags) { - auto h = histos.add("hFoundTagsCounters", "hFoundTagsCounters", kTH1D, {{6, -0.5f, 5.5f}}); - h->GetXaxis()->SetBinLabel(1, "Found V0s"); - h->GetXaxis()->SetBinLabel(2, "Findable V0s"); - h->GetXaxis()->SetBinLabel(3, "Findable & found V0s"); - h->GetXaxis()->SetBinLabel(4, "Found Cascades"); - h->GetXaxis()->SetBinLabel(5, "Findable Cascades"); - h->GetXaxis()->SetBinLabel(6, "Findable & found Cascades"); - } - // for QA and test purposes auto hRawCentrality = histos.add("hRawCentrality", "hRawCentrality", kTH1F, {axisRawCentrality}); @@ -1057,60 +1031,12 @@ struct strangederivedbuilder { StraTPCQVs(collision.qTPCL() * std::cos(2 * collision.psiTPCL()), collision.qTPCL() * std::sin(2 * collision.psiTPCL()), collision.qTPCL(), collision.qTPCR() * std::cos(2 * collision.psiTPCR()), collision.qTPCR() * std::sin(2 * collision.psiTPCR()), collision.qTPCR()); } - uint64_t combineProngIndices(uint32_t low, uint32_t high) - { - return ((static_cast(high)) << 32) | (static_cast(low)); - } - - void processV0FoundTags(aod::V0s const& foundV0s, aod::V0Datas const& findableV0s, aod::FindableV0s const& /* added to avoid troubles */) - { - histos.fill(HIST("hFoundTagsCounters"), 0.0f, foundV0s.size()); - histos.fill(HIST("hFoundTagsCounters"), 1.0f, findableV0s.size()); - - for (auto const& findableV0 : findableV0s) { - bool hasBeenFound = false; - for (auto const& foundV0 : foundV0s) { - if (foundV0.posTrackId() == findableV0.posTrackId() && foundV0.negTrackId() == findableV0.negTrackId()) { - hasBeenFound = true; - } - } - v0FoundTags(hasBeenFound); - } - } - using uint128_t = __uint128_t; uint128_t combineProngIndices128(uint32_t pos, uint32_t neg, uint32_t bach) { return ((static_cast(pos)) << 64) | ((static_cast(neg)) << 32) | (static_cast(bach)); } - void processCascFoundTags(aod::Cascades const& foundCascades, aod::CascDatas const& findableCascades, aod::V0s const&, aod::FindableCascades const& /* added to avoid troubles */) - { - histos.fill(HIST("hFoundTagsCounters"), 3.0f, foundCascades.size()); - histos.fill(HIST("hFoundTagsCounters"), 4.0f, findableCascades.size()); - - // pack the found V0s in a long long - std::vector foundCascadesPacked; - foundCascadesPacked.reserve(foundCascades.size()); - for (auto const& foundCascade : foundCascades) { - auto v0 = foundCascade.v0(); - foundCascadesPacked[foundCascade.globalIndex()] = combineProngIndices128(v0.posTrackId(), v0.negTrackId(), foundCascade.bachelorId()); - } - - bool hasBeenFound = false; - for (auto const& findableCascade : findableCascades) { - uint128_t indexPack = combineProngIndices128(findableCascade.posTrackId(), findableCascade.negTrackId(), findableCascade.bachelorId()); - for (uint32_t ic = 0; ic < foundCascades.size(); ic++) { - if (indexPack == foundCascadesPacked[ic]) { - hasBeenFound = true; - histos.fill(HIST("hFoundTagsCounters"), 5.0f); - break; - } - } - cascFoundTags(hasBeenFound); - } - } - void processDataframeIDs(aod::Origins const& origins) { auto origin = origins.begin(); @@ -1150,10 +1076,6 @@ struct strangederivedbuilder { PROCESS_SWITCH(strangederivedbuilder, processTPCQVectors, "Produce TPC Q-vectors table", false); PROCESS_SWITCH(strangederivedbuilder, processTPCQVectorsLF, "Produce TPC Q-vectors table using LF temporary calibration", false); PROCESS_SWITCH(strangederivedbuilder, processZDCSP, "Produce ZDC SP table", false); - - // dedicated findable functionality - PROCESS_SWITCH(strangederivedbuilder, processV0FoundTags, "Produce FoundV0Tags for findable exercise", false); - PROCESS_SWITCH(strangederivedbuilder, processCascFoundTags, "Produce FoundCascTags for findable exercise", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) diff --git a/PWGLF/TableProducer/Strangeness/strangenessbuilderfindable.cxx b/PWGLF/TableProducer/Strangeness/strangenessbuilderfindable.cxx index 381d22721bd..7b52db5b185 100644 --- a/PWGLF/TableProducer/Strangeness/strangenessbuilderfindable.cxx +++ b/PWGLF/TableProducer/Strangeness/strangenessbuilderfindable.cxx @@ -9,7 +9,10 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. // -// Strangeness builder task +// ======================== +/// \file strangenessbuilder.cxx +/// \brief Strangeness builder task +/// \author David Dobrigkeit Chinellato (david.dobrigkeit.chinellato@cern.ch) // ======================== // // This task produces all tables that may be necessary for @@ -21,6 +24,13 @@ // -- processRealData[Run2] .........: use this OR processMonteCarlo but NOT both // -- processMonteCarlo[Run2] .......: use this OR processRealData but NOT both // +// Most important configurables: +// -- enabledTables ......: key control bools to decide which tables to generate +// task will adapt algorithm to spare / spend CPU accordingly +// -- mc_findableMode ....: 0: only found (default), 1: add findable to found, 2: all findable +// When using findables, refer to FoundTag bools for checking if found +// -- v0builderopts ......: V0-specific building options (topological, etc) +// -- cascadebuilderopts .: cascade-specific building options (topological, etc) #include #include From 8ce1469a9f4146968e80b117b97296a5ad8934c8 Mon Sep 17 00:00:00 2001 From: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> Date: Sat, 22 Feb 2025 17:08:42 +0100 Subject: [PATCH 0379/1650] [Common] Fill multNContribs variables for Run 2 converted data (#10135) --- Common/TableProducer/multiplicityTable.cxx | 125 ++++++++++++--------- 1 file changed, 72 insertions(+), 53 deletions(-) diff --git a/Common/TableProducer/multiplicityTable.cxx b/Common/TableProducer/multiplicityTable.cxx index c572f3b458d..4a1be55d0bd 100644 --- a/Common/TableProducer/multiplicityTable.cxx +++ b/Common/TableProducer/multiplicityTable.cxx @@ -8,6 +8,12 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +// +/// \file multiplicityTable.cxx +/// \brief Produces multiplicity tables +/// +/// \author ALICE +/// #include #include @@ -50,7 +56,7 @@ static constexpr int kFT0MultZeqs = 10; static constexpr int kFDDMultZeqs = 11; static constexpr int kPVMultZeqs = 12; static constexpr int kMultMCExtras = 13; -static constexpr int nTables = 14; +static constexpr int Ntables = 14; // Checking that the Zeq tables are after the normal ones static_assert(kFV0Mults < kFV0MultZeqs); @@ -58,7 +64,7 @@ static_assert(kFT0Mults < kFT0MultZeqs); static_assert(kFDDMults < kFDDMultZeqs); static_assert(kPVMults < kPVMultZeqs); -static constexpr int nParameters = 1; +static constexpr int Nparameters = 1; static const std::vector tableNames{"FV0Mults", // 0 "FT0Mults", // 1 "FDDMults", // 2 @@ -74,7 +80,7 @@ static const std::vector tableNames{"FV0Mults", // 0 "PVMultZeqs", // 12 "MultMCExtras"}; // 13 static const std::vector parameterNames{"Enable"}; -static const int defaultParameters[nTables][nParameters]{{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}}; +static const int defaultParameters[Ntables][Nparameters]{{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}}; struct MultiplicityTable { SliceCache cache; @@ -104,8 +110,8 @@ struct MultiplicityTable { using Run2Tracks = soa::Join; Partition run2tracklets = (aod::track::trackType == static_cast(o2::aod::track::TrackTypeEnum::Run2Tracklet)); Partition tracksWithTPC = (aod::track::tpcNClsFindable > (uint8_t)0); - Partition pvContribTracks = (nabs(aod::track::eta) < 0.8f) && ((aod::track::flags & (uint32_t)o2::aod::track::PVContributor) == (uint32_t)o2::aod::track::PVContributor); - Partition pvContribTracksEta1 = (nabs(aod::track::eta) < 1.0f) && ((aod::track::flags & (uint32_t)o2::aod::track::PVContributor) == (uint32_t)o2::aod::track::PVContributor); + Partition pvContribTracks = (nabs(aod::track::eta) < 0.8f) && ((aod::track::flags & static_cast(o2::aod::track::PVContributor)) == static_cast(o2::aod::track::PVContributor)); + Partition pvContribTracksEta1 = (nabs(aod::track::eta) < 1.0f) && ((aod::track::flags & static_cast(o2::aod::track::PVContributor)) == static_cast(o2::aod::track::PVContributor)); Preslice perCol = aod::track::collisionId; Preslice perColIU = aod::track::collisionId; Preslice perCollisionMFT = o2::aod::fwdtrack::collisionId; @@ -116,12 +122,12 @@ struct MultiplicityTable { Configurable doVertexZeq{"doVertexZeq", 1, "if 1: do vertex Z eq mult table"}; Configurable fractionOfEvents{"fractionOfEvents", 2.0, "Fractions of events to keep in case the QA is used"}; Configurable> enabledTables{"enabledTables", - {defaultParameters[0], nTables, nParameters, tableNames, parameterNames}, + {defaultParameters[0], Ntables, Nparameters, tableNames, parameterNames}, "Produce tables depending on needs. Values different than -1 override the automatic setup: the corresponding table can be set off (0) or on (1)"}; struct : ConfigurableGroup { Configurable ccdburl{"ccdburl", "http://alice-ccdb.cern.ch", "The CCDB endpoint url address"}; - Configurable ccdbPath{"ccdbpath", "Centrality/Calibration", "The CCDB path for centrality/multiplicity information"}; + Configurable ccdbPath{"ccdbPath", "Centrality/Calibration", "The CCDB path for centrality/multiplicity information"}; Configurable reconstructionPass{"reconstructionPass", "", {"Apass to use when fetching the calibration tables. Empty (default) does not check for any pass. Use `metadata` to fetch it from the AO2D metadata. Otherwise it will override the metadata."}}; } ccdbConfig; @@ -162,8 +168,8 @@ struct MultiplicityTable { LOGF(fatal, "Cannot enable processRun2 and processRun3 at the same time. Please choose one."); } - bool tEnabled[nTables] = {false}; - for (int i = 0; i < nTables; i++) { + bool tEnabled[Ntables] = {false}; + for (int i = 0; i < Ntables; i++) { int f = enabledTables->get(tableNames[i].c_str(), "Enable"); enableFlagIfTableRequired(context, tableNames[i], f); if (f == 1) { @@ -256,21 +262,21 @@ struct MultiplicityTable { int multNContribsEtaHalf = 0; if (collision.has_fv0a()) { - for (auto amplitude : collision.fv0a().amplitude()) { + for (const auto& amplitude : collision.fv0a().amplitude()) { multFV0A += amplitude; } } if (collision.has_fv0c()) { - for (auto amplitude : collision.fv0c().amplitude()) { + for (const auto& amplitude : collision.fv0c().amplitude()) { multFV0C += amplitude; } } if (collision.has_ft0()) { auto ft0 = collision.ft0(); - for (auto amplitude : ft0.amplitudeA()) { + for (const auto& amplitude : ft0.amplitudeA()) { multFT0A += amplitude; } - for (auto amplitude : ft0.amplitudeC()) { + for (const auto& amplitude : ft0.amplitudeC()) { multFT0C += amplitude; } } @@ -280,7 +286,20 @@ struct MultiplicityTable { multZNC = zdc.energyCommonZNC(); } - LOGF(debug, "multFV0A=%5.0f multFV0C=%5.0f multFT0A=%5.0f multFT0C=%5.0f multFDDA=%5.0f multFDDC=%5.0f multZNA=%6.0f multZNC=%6.0f multTracklets=%i multTPC=%i", multFV0A, multFV0C, multFT0A, multFT0C, multFDDA, multFDDC, multZNA, multZNC, multTracklets, multTPC); + // Try to do something Similar to https://github.com/alisw/AliPhysics/blob/22862a945004f719f8e9664c0264db46e7186a48/OADB/AliPPVsMultUtils.cxx#L541C26-L541C37 + for (const auto& tracklet : trackletsGrouped) { + if (std::abs(tracklet.eta()) < 1.0) { + multNContribsEta1++; + } + if (std::abs(tracklet.eta()) < 0.8) { + multNContribs++; + } + if (std::abs(tracklet.eta()) < 0.5) { + multNContribsEtaHalf++; + } + } + + LOGF(debug, "multFV0A=%5.0f multFV0C=%5.0f multFT0A=%5.0f multFT0C=%5.0f multFDDA=%5.0f multFDDC=%5.0f multZNA=%6.0f multZNC=%6.0f multTracklets=%i multTPC=%i multNContribsEta1=%i multNContribs=%i multNContribsEtaHalf=%i", multFV0A, multFV0C, multFT0A, multFT0C, multFDDA, multFDDC, multZNA, multZNC, multTracklets, multTPC, multNContribs, multNContribsEta1, multNContribsEtaHalf); tableFV0(multFV0A, multFV0C); tableFT0(multFT0A, multFT0C); tableFDD(multFDDA, multFDDC); @@ -292,10 +311,10 @@ struct MultiplicityTable { using Run3TracksIU = soa::Join; Partition tracksIUWithTPC = (aod::track::tpcNClsFindable > (uint8_t)0); - Partition pvAllContribTracksIU = ((aod::track::flags & (uint32_t)o2::aod::track::PVContributor) == (uint32_t)o2::aod::track::PVContributor); - Partition pvContribTracksIU = (nabs(aod::track::eta) < 0.8f) && ((aod::track::flags & (uint32_t)o2::aod::track::PVContributor) == (uint32_t)o2::aod::track::PVContributor); - Partition pvContribTracksIUEta1 = (nabs(aod::track::eta) < 1.0f) && ((aod::track::flags & (uint32_t)o2::aod::track::PVContributor) == (uint32_t)o2::aod::track::PVContributor); - Partition pvContribTracksIUEtaHalf = (nabs(aod::track::eta) < 0.5f) && ((aod::track::flags & (uint32_t)o2::aod::track::PVContributor) == (uint32_t)o2::aod::track::PVContributor); + Partition pvAllContribTracksIU = ((aod::track::flags & static_cast(o2::aod::track::PVContributor)) == static_cast(o2::aod::track::PVContributor)); + Partition pvContribTracksIU = (nabs(aod::track::eta) < 0.8f) && ((aod::track::flags & static_cast(o2::aod::track::PVContributor)) == static_cast(o2::aod::track::PVContributor)); + Partition pvContribTracksIUEta1 = (nabs(aod::track::eta) < 1.0f) && ((aod::track::flags & static_cast(o2::aod::track::PVContributor)) == static_cast(o2::aod::track::PVContributor)); + Partition pvContribTracksIUEtaHalf = (nabs(aod::track::eta) < 0.5f) && ((aod::track::flags & static_cast(o2::aod::track::PVContributor)) == static_cast(o2::aod::track::PVContributor)); void processRun3(soa::Join const& collisions, Run3TracksIU const&, @@ -306,7 +325,7 @@ struct MultiplicityTable { aod::FDDs const&) { // reserve memory - for (auto i : mEnabledTables) { + for (const auto& i : mEnabledTables) { switch (i) { case kFV0Mults: // FV0 tableFV0.reserve(collisions.size()); @@ -429,7 +448,7 @@ struct MultiplicityTable { } } - for (auto i : mEnabledTables) { + for (const auto& i : mEnabledTables) { switch (i) { case kFV0Mults: // FV0 { @@ -462,10 +481,10 @@ struct MultiplicityTable { // using FT0 row index from event selection task if (collision.has_foundFT0()) { const auto& ft0 = collision.foundFT0(); - for (auto amplitude : ft0.amplitudeA()) { + for (const auto& amplitude : ft0.amplitudeA()) { multFT0A += amplitude; } - for (auto amplitude : ft0.amplitudeC()) { + for (const auto& amplitude : ft0.amplitudeC()) { multFT0C += amplitude; } } else { @@ -482,10 +501,10 @@ struct MultiplicityTable { // using FDD row index from event selection task if (collision.has_foundFDD()) { const auto& fdd = collision.foundFDD(); - for (auto amplitude : fdd.chargeA()) { + for (const auto& amplitude : fdd.chargeA()) { multFDDA += amplitude; } - for (auto amplitude : fdd.chargeC()) { + for (const auto& amplitude : fdd.chargeC()) { multFDDC += amplitude; } } else { @@ -537,7 +556,7 @@ struct MultiplicityTable { // use only one single grouping operation, then do loop const auto& tracksThisCollision = pvContribTracksIUEta1.sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); multNContribsEta1 = tracksThisCollision.size(); - for (auto track : tracksThisCollision) { + for (const auto& track : tracksThisCollision) { if (std::abs(track.eta()) < 0.8) { multNContribs++; } @@ -556,7 +575,7 @@ struct MultiplicityTable { const auto& pvAllContribsGrouped = pvAllContribTracksIU->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); const auto& tpcTracksGrouped = tracksIUWithTPC->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - for (auto track : pvAllContribsGrouped) { + for (const auto& track : pvAllContribsGrouped) { if (track.hasITS()) { nHasITS++; if (track.hasTPC()) @@ -577,7 +596,7 @@ struct MultiplicityTable { int nAllTracksTPCOnly = 0; int nAllTracksITSTPC = 0; - for (auto track : tpcTracksGrouped) { + for (const auto& track : tpcTracksGrouped) { if (track.hasITS()) { nAllTracksITSTPC++; } else { @@ -599,14 +618,14 @@ struct MultiplicityTable { } break; case kFV0MultZeqs: // Z equalized FV0 { - if (fabs(collision.posZ()) < 15.0f && lCalibLoaded) { + if (std::fabs(collision.posZ()) < 15.0f && lCalibLoaded) { multZeqFV0A = hVtxZFV0A->Interpolate(0.0) * multFV0A / hVtxZFV0A->Interpolate(collision.posZ()); } tableFV0Zeqs(multZeqFV0A); } break; case kFT0MultZeqs: // Z equalized FT0 { - if (fabs(collision.posZ()) < 15.0f && lCalibLoaded) { + if (std::fabs(collision.posZ()) < 15.0f && lCalibLoaded) { multZeqFT0A = hVtxZFT0A->Interpolate(0.0) * multFT0A / hVtxZFT0A->Interpolate(collision.posZ()); multZeqFT0C = hVtxZFT0C->Interpolate(0.0) * multFT0C / hVtxZFT0C->Interpolate(collision.posZ()); } @@ -620,7 +639,7 @@ struct MultiplicityTable { } break; case kFDDMultZeqs: // Z equalized FDD { - if (fabs(collision.posZ()) < 15.0f && lCalibLoaded) { + if (std::fabs(collision.posZ()) < 15.0f && lCalibLoaded) { multZeqFDDA = hVtxZFDDA->Interpolate(0.0) * multFDDA / hVtxZFDDA->Interpolate(collision.posZ()); multZeqFDDC = hVtxZFDDC->Interpolate(0.0) * multFDDC / hVtxZFDDC->Interpolate(collision.posZ()); } @@ -628,7 +647,7 @@ struct MultiplicityTable { } break; case kPVMultZeqs: // Z equalized PV { - if (fabs(collision.posZ()) < 15.0f && lCalibLoaded) { + if (std::fabs(collision.posZ()) < 15.0f && lCalibLoaded) { multZeqNContribs = hVtxZNTracks->Interpolate(0.0) * multNContribs / hVtxZNTracks->Interpolate(collision.posZ()); } tablePVZeqs(multZeqNContribs); @@ -649,9 +668,9 @@ struct MultiplicityTable { // FIT FT0C: -3.3 < η < -2.1 // FOT FT0A: 3.5 < η < 4.9 Filter mcParticleFilter = (aod::mcparticle::eta < 7.0f) && (aod::mcparticle::eta > -7.0f); - using mcParticlesFiltered = soa::Filtered; + using McParticlesFiltered = soa::Filtered; - void processMC(aod::McCollision const& mcCollision, mcParticlesFiltered const& mcParticles) + void processMC(aod::McCollision const& mcCollision, McParticlesFiltered const& mcParticles) { int multFT0A = 0; int multFV0A = 0; @@ -703,49 +722,49 @@ struct MultiplicityTable { tableExtraMult2MCExtras(collision.mcCollisionId()); // interlink } - Configurable min_pt_globaltrack{"min_pt_globaltrack", 0.15, "min. pT for global tracks"}; - Configurable max_pt_globaltrack{"max_pt_globaltrack", 1e+10, "max. pT for global tracks"}; - Configurable min_ncluster_its_globaltrack{"min_ncluster_its_globaltrack", 5, "min. number of ITS clusters for global tracks"}; - Configurable min_ncluster_itsib_globaltrack{"min_ncluster_itsib_globaltrack", 1, "min. number of ITSib clusters for global tracks"}; + Configurable minPtGlobalTrack{"minPtGlobalTrack", 0.15, "min. pT for global tracks"}; + Configurable maxPtGlobalTrack{"maxPtGlobalTrack", 1e+10, "max. pT for global tracks"}; + Configurable minNclsITSGlobalTrack{"minNclsITSGlobalTrack", 5, "min. number of ITS clusters for global tracks"}; + Configurable minNclsITSibGlobalTrack{"minNclsITSibGlobalTrack", 1, "min. number of ITSib clusters for global tracks"}; using Run3Tracks = soa::Join; - Partition pvContribGlobalTracksEta1 = (min_pt_globaltrack < aod::track::pt && aod::track::pt < max_pt_globaltrack) && (nabs(aod::track::eta) < 1.0f) && ((aod::track::flags & (uint32_t)o2::aod::track::PVContributor) == (uint32_t)o2::aod::track::PVContributor) && requireQualityTracksInFilter(); + Partition pvContribGlobalTracksEta1 = (minPtGlobalTrack < aod::track::pt && aod::track::pt < maxPtGlobalTrack) && (nabs(aod::track::eta) < 1.0f) && ((aod::track::flags & static_cast(o2::aod::track::PVContributor)) == static_cast(o2::aod::track::PVContributor)) && requireQualityTracksInFilter(); void processGlobalTrackingCounters(aod::Collision const& collision, soa::Join const& tracksIU, Run3Tracks const&) { // counter from Igor int nGlobalTracks = 0; - int multNContribsEta05_kGlobalTrackWoDCA = 0; - int multNContribsEta08_kGlobalTrackWoDCA = 0; - int multNContribsEta10_kGlobalTrackWoDCA = 0; + int multNbrContribsEta05GlobalTrackWoDCA = 0; + int multNbrContribsEta08GlobalTrackWoDCA = 0; + int multNbrContribsEta10GlobalTrackWoDCA = 0; - auto pvContribGlobalTracksEta1_per_collision = pvContribGlobalTracksEta1->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + auto pvContribGlobalTracksEta1PerCollision = pvContribGlobalTracksEta1->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - for (auto& track : pvContribGlobalTracksEta1_per_collision) { - if (track.itsNCls() < min_ncluster_its_globaltrack || track.itsNClsInnerBarrel() < min_ncluster_itsib_globaltrack) { + for (const auto& track : pvContribGlobalTracksEta1PerCollision) { + if (track.itsNCls() < minNclsITSGlobalTrack || track.itsNClsInnerBarrel() < minNclsITSibGlobalTrack) { continue; } - multNContribsEta10_kGlobalTrackWoDCA++; + multNbrContribsEta10GlobalTrackWoDCA++; if (std::abs(track.eta()) < 0.8) { - multNContribsEta08_kGlobalTrackWoDCA++; + multNbrContribsEta08GlobalTrackWoDCA++; } if (std::abs(track.eta()) < 0.5) { - multNContribsEta05_kGlobalTrackWoDCA++; + multNbrContribsEta05GlobalTrackWoDCA++; } } - for (auto& track : tracksIU) { - if (fabs(track.eta()) < 0.8 && track.tpcNClsFound() >= 80 && track.tpcNClsCrossedRows() >= 100) { + for (const auto& track : tracksIU) { + if (std::fabs(track.eta()) < 0.8 && track.tpcNClsFound() >= 80 && track.tpcNClsCrossedRows() >= 100) { if (track.isGlobalTrack()) { nGlobalTracks++; } } } - LOGF(debug, "nGlobalTracks = %d, multNContribsEta08_kGlobalTrackWoDCA = %d, multNContribsEta10_kGlobalTrackWoDCA = %d, multNContribsEta05_kGlobalTrackWoDCA = %d", nGlobalTracks, multNContribsEta08_kGlobalTrackWoDCA, multNContribsEta10_kGlobalTrackWoDCA, multNContribsEta05_kGlobalTrackWoDCA); + LOGF(debug, "nGlobalTracks = %d, multNbrContribsEta08GlobalTrackWoDCA = %d, multNbrContribsEta10GlobalTrackWoDCA = %d, multNbrContribsEta05GlobalTrackWoDCA = %d", nGlobalTracks, multNbrContribsEta08GlobalTrackWoDCA, multNbrContribsEta10GlobalTrackWoDCA, multNbrContribsEta05GlobalTrackWoDCA); - multsGlobal(nGlobalTracks, multNContribsEta08_kGlobalTrackWoDCA, multNContribsEta10_kGlobalTrackWoDCA, multNContribsEta05_kGlobalTrackWoDCA); + multsGlobal(nGlobalTracks, multNbrContribsEta08GlobalTrackWoDCA, multNbrContribsEta10GlobalTrackWoDCA, multNbrContribsEta05GlobalTrackWoDCA); } void processRun3MFT(soa::Join::iterator const&, @@ -755,14 +774,14 @@ struct MultiplicityTable { int nAllTracks = 0; int nTracks = 0; - for (auto& track : mftTracks) { + for (const auto& track : mftTracks) { if (track.nClusters() >= 5) { // hardcoded for now nAllTracks++; } } if (retracks.size() > 0) { - for (auto& retrack : retracks) { + for (const auto& retrack : retracks) { auto track = retrack.mfttrack(); if (track.nClusters() < 5) { continue; // min cluster requirement From 6c1146478dc623f33287fe0cdeb36487fc8d0007 Mon Sep 17 00:00:00 2001 From: Georgios Mantzaridis <62671855+gmantzar@users.noreply.github.com> Date: Sat, 22 Feb 2025 20:17:12 +0100 Subject: [PATCH 0380/1650] [PWGCF,PWGHF] FemtoDream: Fixes in the Cascade Selection and Seperation of Producer (#10128) --- PWGCF/DataModel/FemtoDerived.h | 15 + .../Core/femtoDreamCascadeSelection.h | 52 +- .../Core/femtoDreamCollisionSelection.h | 15 + .../FemtoDream/Core/femtoDreamDetaDphiStar.h | 2 +- PWGCF/FemtoDream/Core/femtoDreamMath.h | 13 + .../FemtoDream/Core/femtoDreamParticleHisto.h | 43 +- PWGCF/FemtoDream/Core/femtoDreamSelection.h | 6 +- PWGCF/FemtoDream/TableProducer/CMakeLists.txt | 8 +- .../femtoDreamProducerReducedTask.cxx | 3 +- .../TableProducer/femtoDreamProducerTask.cxx | 318 +---- .../femtoDreamProducerTaskWithCascades.cxx | 1173 +++++++++++++++++ .../Tasks/femtoDreamDebugCascade.cxx | 71 +- .../FemtoDream/Tasks/femtoDreamDebugTrack.cxx | 2 +- PWGCF/FemtoDream/Tasks/femtoDreamDebugV0.cxx | 6 +- .../Tasks/femtoDreamPairTaskTrackCascade.cxx | 83 +- .../Tasks/femtoDreamPairTaskTrackTrack.cxx | 4 +- .../Tasks/femtoDreamPairTaskTrackV0.cxx | 8 +- .../femtoDreamTripletTaskTrackTrackTrack.cxx | 4 +- .../femtoDreamTripletTaskTrackTrackV0.cxx | 16 +- PWGCF/FemtoDream/Utils/femtoDreamCutCulator.h | 2 +- .../HFC/TableProducer/femtoDreamProducer.cxx | 4 +- .../HFC/Tasks/taskCharmHadronsFemtoDream.cxx | 4 +- 22 files changed, 1440 insertions(+), 412 deletions(-) create mode 100644 PWGCF/FemtoDream/TableProducer/femtoDreamProducerTaskWithCascades.cxx diff --git a/PWGCF/DataModel/FemtoDerived.h b/PWGCF/DataModel/FemtoDerived.h index c825c5a7a24..f7083c100a5 100644 --- a/PWGCF/DataModel/FemtoDerived.h +++ b/PWGCF/DataModel/FemtoDerived.h @@ -192,6 +192,14 @@ DECLARE_SOA_COLUMN(DecayVtxX, decayVtxX, float); //! X position of the decay DECLARE_SOA_COLUMN(DecayVtxY, decayVtxY, float); //! Y position of the decay vertex DECLARE_SOA_COLUMN(DecayVtxZ, decayVtxZ, float); //! Z position of the decay vertex DECLARE_SOA_COLUMN(MKaon, mKaon, float); //! The invariant mass of V0 candidate, assuming kaon +// Here the cascade specific collums +DECLARE_SOA_COLUMN(CascV0DCAtoPV, cascV0DCAtoPV, float); //! DCA of the daughter V0 to the primar vertex +DECLARE_SOA_COLUMN(CascDaughDCA, cascDaughDCA, float); //! DCA between daughters +DECLARE_SOA_COLUMN(CascTransRadius, cascTransRadius, float); //! Transverse radius of the decay vertex of the cascade +DECLARE_SOA_COLUMN(CascDecayVtxX, cascDecayVtxX, float); //! X position of the decay vertex of the cascade +DECLARE_SOA_COLUMN(CascDecayVtxY, cascDecayVtxY, float); //! Y position of the decay vertex of the cascade +DECLARE_SOA_COLUMN(CascDecayVtxZ, cascDecayVtxZ, float); //! Z position of the decay vertex of the cascade +DECLARE_SOA_COLUMN(MOmega, mOmega, float); //! The invariant mass of Cascade candidate, assuming Omega } // namespace femtodreamparticle namespace fdhf @@ -384,6 +392,13 @@ DECLARE_SOA_TABLE_STAGED(FDExtParticles, "FDEXTPARTICLE", femtodreamparticle::DecayVtxY, femtodreamparticle::DecayVtxZ, femtodreamparticle::MKaon, + femtodreamparticle::CascV0DCAtoPV, + femtodreamparticle::CascDaughDCA, + femtodreamparticle::CascTransRadius, + femtodreamparticle::CascDecayVtxX, + femtodreamparticle::CascDecayVtxY, + femtodreamparticle::CascDecayVtxZ, + femtodreamparticle::MOmega, femtodreamparticle::TPCCrossedRowsOverFindableCls) using FDFullParticle = FDExtParticles::iterator; diff --git a/PWGCF/FemtoDream/Core/femtoDreamCascadeSelection.h b/PWGCF/FemtoDream/Core/femtoDreamCascadeSelection.h index d7e8fb18e01..bc9289dc03a 100644 --- a/PWGCF/FemtoDream/Core/femtoDreamCascadeSelection.h +++ b/PWGCF/FemtoDream/Core/femtoDreamCascadeSelection.h @@ -59,16 +59,7 @@ enum CascadeSel { kCascadeV0TranRadMax, kCascadeV0DCAtoPVMin, kCascadeV0DCAtoPVMax - - // kNcascadeSelection - // kCascadeV0MassMin, - // kCascadeV0MassMax }; -/* -kCascadeDCAPosToPV, -kCascadeDCANegToPV, -kCascadeDCABachToPV, -*/ enum ChildTrackType { kPosTrack, kNegTrack, @@ -101,11 +92,6 @@ class FemtoDreamCascadeSelection nCascadeTranRadMin(0), nCascadeTranRadMax(0), nCascadeDecVtxMax(0), - /* - nCascadeDCAPosToPV(0), - nCascadeDCANegToPV(0), - nCascadeDCABachToPV(0), - */ nCascadeV0DCADaughMax(0), nCascadeV0CPAMin(0), nCascadeV0TranRadMin(0), @@ -121,11 +107,6 @@ class FemtoDreamCascadeSelection fCascadeTranRadMin(9999999), fCascadeTranRadMax(-9999999), fCascadeDecVtxMax(-9999999), - /* - fCascadeDCAPosToPV(9999999), - fCascadeDCANegToPV(9999999), - fCascadeDCABachToPV(9999999), - */ fCascadeV0DCADaughMax(-9999999), fCascadeV0CPAMin(9999999), fCascadeV0TranRadMin(9999999), @@ -141,7 +122,6 @@ class FemtoDreamCascadeSelection fInvMassCompetingLowLimit(1.5), fInvMassCompetingUpLimit(2.0), isCascOmega(false) - /*,nSigmaPIDOffsetTPC(0.)*/ { } @@ -174,7 +154,7 @@ class FemtoDreamCascadeSelection } else if (child == femtoDreamCascadeSelection::kNegTrack) { NegDaughTrack.setSelection(selVal, selVar, selType); } else if (child == femtoDreamCascadeSelection::kBachTrack) { - BachDaugTrack.setSelection(selVal, selVar, selType); + BachDaughTrack.setSelection(selVal, selVar, selType); } } @@ -187,7 +167,7 @@ class FemtoDreamCascadeSelection } else if (child == femtoDreamCascadeSelection::kNegTrack) { NegDaughTrack.setPIDSpecies(pids); } else if (child == femtoDreamCascadeSelection::kBachTrack) { - BachDaugTrack.setPIDSpecies(pids); + BachDaughTrack.setPIDSpecies(pids); } } @@ -315,7 +295,7 @@ class FemtoDreamCascadeSelection FemtoDreamTrackSelection PosDaughTrack; FemtoDreamTrackSelection NegDaughTrack; - FemtoDreamTrackSelection BachDaugTrack; + FemtoDreamTrackSelection BachDaughTrack; static constexpr int kNcascadeSelection = 16; @@ -431,9 +411,9 @@ void FemtoDreamCascadeSelection::init(HistogramRegistry* QAregistry, HistogramRe aod::femtodreamparticle::TrackType::kNegChild, aod::femtodreamparticle::cutContainerType>(mQAHistogramRegistry, mHistogramRegistry); - BachDaugTrack.init(mQAHistogramRegistry, mHistogramRegistry); + BachDaughTrack.init(mQAHistogramRegistry, mHistogramRegistry); } /// check whether the most open cuts are fulfilled - most of this should have @@ -506,7 +486,6 @@ bool FemtoDreamCascadeSelection::isSelectedMinimal(Col const& col, Casc const& c const float invMass = isCascOmega ? cascade.mOmega() : cascade.mXi(); // const float invMass = cascade.mXi(); - // LOGF(info, "GG producer: Charge %i", cascade.sign()); if (invMassLambda < fV0InvMassLowLimit || invMassLambda > fV0InvMassUpLimit) { return false; } @@ -515,7 +494,6 @@ bool FemtoDreamCascadeSelection::isSelectedMinimal(Col const& col, Casc const& c return false; } - /* if (fRejectCompetingMass) { const float invMassCompeting = isCascOmega ? cascade.mXi() : cascade.mOmega(); if (invMassCompeting > fInvMassCompetingLowLimit && @@ -523,7 +501,6 @@ bool FemtoDreamCascadeSelection::isSelectedMinimal(Col const& col, Casc const& c return false; } } - */ if (nCascadePtMin > 0 && cascade.pt() < fCascadePtMin) { return false; @@ -579,7 +556,7 @@ bool FemtoDreamCascadeSelection::isSelectedMinimal(Col const& col, Casc const& c if (!NegDaughTrack.isSelectedMinimal(negTrack)) { return false; } - if (!BachDaugTrack.isSelectedMinimal(bachTrack)) { + if (!BachDaughTrack.isSelectedMinimal(bachTrack)) { return false; } @@ -589,10 +566,10 @@ bool FemtoDreamCascadeSelection::isSelectedMinimal(Col const& col, Casc const& c template std::array FemtoDreamCascadeSelection::getCutContainer(Col const& col, Casc const& casc, Track const& posTrack, Track const& negTrack, Track const& bachTrack) { - // Cut bit - auto outputPosTrack = PosDaughTrack.getCutContainer(posTrack, casc.positivept(), casc.positiveeta(), casc.dcapostopv()); - auto outputNegTrack = NegDaughTrack.getCutContainer(negTrack, casc.negativept(), casc.negativeeta(), casc.dcanegtopv()); - auto outputBachTrack = BachDaugTrack.getCutContainer(bachTrack, casc.bachelorpt(), casc.bacheloreta(), casc.dcabachtopv()); + auto outputPosTrack = PosDaughTrack.getCutContainer(posTrack, posTrack.pt(), posTrack.eta(), posTrack.dcaXY()); + auto outputNegTrack = NegDaughTrack.getCutContainer(negTrack, negTrack.pt(), negTrack.eta(), negTrack.dcaXY()); + auto outputBachTrack = BachDaughTrack.getCutContainer(bachTrack, bachTrack.pt(), bachTrack.eta(), bachTrack.dcaXY()); + cutContainerType output = 0; size_t counter = 0; @@ -608,7 +585,6 @@ std::array FemtoDreamCascadeSelection::getCutContainer(Col const auto cpav0 = casc.v0cosPA(col.posX(), col.posY(), col.posZ()); const auto v0dcatopv = casc.dcav0topv(col.posX(), col.posY(), col.posZ()); - // LOGF(info, "GG producer: New dcatoPV: %f", dcav0topv); float observable = 0.; for (auto& sel : mSelections) { @@ -661,14 +637,12 @@ std::array FemtoDreamCascadeSelection::getCutContainer(Col break; case (femtoDreamCascadeSelection::kCascadeV0DCAtoPVMin): observable = v0dcatopv; - // LOGF(info, "==> Now it is: %f", dcav0topv); break; case (femtoDreamCascadeSelection::kCascadeV0DCAtoPVMax): observable = v0dcatopv; break; } // switch sel.checkSelectionSetBit(observable, output, counter, nullptr); - //} } // for loop return { @@ -711,8 +685,8 @@ void FemtoDreamCascadeSelection::fillQA(Col const& col, Casc const& casc, Track aod::femtodreamparticle::TrackType::kPosChild, false, cutstage>(posTrack); NegDaughTrack.fillQA(negTrack); - BachDaugTrack.fillQA(bachTrack); + BachDaughTrack.fillQA(bachTrack); } } diff --git a/PWGCF/FemtoDream/Core/femtoDreamCollisionSelection.h b/PWGCF/FemtoDream/Core/femtoDreamCollisionSelection.h index 5a43a5f6e3b..ef647b69f52 100644 --- a/PWGCF/FemtoDream/Core/femtoDreamCollisionSelection.h +++ b/PWGCF/FemtoDream/Core/femtoDreamCollisionSelection.h @@ -136,6 +136,21 @@ class FemtoDreamCollisionSelection return true; } + template + bool isCollisionWithoutTrkCasc(C const& col, Casc const& Cascades, CascC& CascadeCuts, T const& /*Tracks*/) + { + // check if there is no selected Cascade + for (auto const& Cascade : Cascades) { + auto postrack = Cascade.template posTrack_as(); + auto negtrack = Cascade.template negTrack_as(); + auto bachtrack = Cascade.template bachelor_as(); + if (CascadeCuts.isSelectedMinimal(col, Cascade, postrack, negtrack, bachtrack)) { + return false; + } + } + return true; + } + /// Some basic QA of the event /// \tparam T type of the collision /// \param col Collision diff --git a/PWGCF/FemtoDream/Core/femtoDreamDetaDphiStar.h b/PWGCF/FemtoDream/Core/femtoDreamDetaDphiStar.h index 07e7d740d9a..fa9577324bc 100644 --- a/PWGCF/FemtoDream/Core/femtoDreamDetaDphiStar.h +++ b/PWGCF/FemtoDream/Core/femtoDreamDetaDphiStar.h @@ -64,7 +64,7 @@ class FemtoDreamDetaDphiStar radiiTPC = radiiTPCtoCut; fillQA = fillTHSparse; - if constexpr (mPartOneType == o2::aod::femtodreamparticle::ParticleType::kTrack && (mPartTwoType == o2::aod::femtodreamparticle::ParticleType::kTrack || mPartTwoType == o2::aod::femtodreamparticle::ParticleType::kCascadeV0Child)) { + if constexpr (mPartOneType == o2::aod::femtodreamparticle::ParticleType::kTrack && (mPartTwoType == o2::aod::femtodreamparticle::ParticleType::kTrack || mPartTwoType == o2::aod::femtodreamparticle::ParticleType::kCascadeV0Child || mPartTwoType == o2::aod::femtodreamparticle::ParticleType::kCascadeBachelor)) { std::string dirName = static_cast(dirNames[0]); histdetadpi[0][0] = mHistogramRegistry->add((dirName + static_cast(histNames[0][0]) + static_cast(histNameSEorME[meORse])).c_str(), "; #Delta #eta; #Delta #phi^{*}", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); histdetadpi[0][1] = mHistogramRegistry->add((dirName + static_cast(histNames[1][0]) + static_cast(histNameSEorME[meORse])).c_str(), "; #Delta #eta; #Delta #phi^{*}", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); diff --git a/PWGCF/FemtoDream/Core/femtoDreamMath.h b/PWGCF/FemtoDream/Core/femtoDreamMath.h index 441e49066cd..bb3c37b284b 100644 --- a/PWGCF/FemtoDream/Core/femtoDreamMath.h +++ b/PWGCF/FemtoDream/Core/femtoDreamMath.h @@ -136,6 +136,19 @@ class FemtoDreamMath { return std::sqrt(std::pow(getkT(part1, mass1, part2, mass2), 2.) + std::pow(0.5 * (mass1 + mass2), 2.)); } + + template + static float getInvMassCascade(const T1& trackpos, const float masspos, const T1& trackneg, const float massneg, const T1& trackbach, const float massbach, const float massv0) + { + // calculate the invariant mass + const ROOT::Math::PtEtaPhiMVector posDaug(trackpos.pt(), trackpos.eta(), trackpos.phi(), masspos); + const ROOT::Math::PtEtaPhiMVector negDaug(trackneg.pt(), trackneg.eta(), trackneg.phi(), massneg); + const ROOT::Math::PtEtaPhiMVector bachDaug(trackbach.pt(), trackbach.eta(), trackbach.phi(), massbach); + const ROOT::Math::PxPyPzMVector v0(posDaug.Px() + negDaug.Px(), posDaug.Py() + negDaug.Py(), posDaug.Pz() + negDaug.Pz(), massv0); + const ROOT::Math::PxPyPzMVector casc = v0 + bachDaug; + + return casc.M(); + } }; } // namespace o2::analysis::femtoDream diff --git a/PWGCF/FemtoDream/Core/femtoDreamParticleHisto.h b/PWGCF/FemtoDream/Core/femtoDreamParticleHisto.h index 1b72e1b09ef..244466d2cb2 100644 --- a/PWGCF/FemtoDream/Core/femtoDreamParticleHisto.h +++ b/PWGCF/FemtoDream/Core/femtoDreamParticleHisto.h @@ -76,7 +76,7 @@ class FemtoDreamParticleHisto // comment template - void init_debug(std::string folderName, T& multAxis, T& multPercentileAxis, T& pTAxis, T& etaAxis, T& phiAxis, T& tempFitVarAxis, T& dcazAxis, T& NsigmaTPCAxis, T& NsigmaTOFAxis, T& NsigmaTPCTOFAxis, T& NsigmaITSAxis, bool correlatedPlots) + void init_debug(std::string folderName, T& multAxis, T& multPercentileAxis, T& pTAxis, T& etaAxis, T& phiAxis, T& tempFitVarAxis, T& dcazAxis, T& NsigmaTPCAxis, T& NsigmaTOFAxis, T& NsigmaTPCTOFAxis, T& NsigmaITSAxis, T& InvMassCompetingAxis, bool correlatedPlots) { std::string folderSuffix = static_cast(o2::aod::femtodreamMCparticle::MCTypeName[mc]).c_str(); @@ -132,19 +132,23 @@ class FemtoDreamParticleHisto if (correlatedPlots) { mHistogramRegistry->add((folderName + folderSuffix + "/HighDcorrelator").c_str(), "", kTHnSparseF, {multAxis, multPercentileAxis, pTAxis, etaAxis, phiAxis, tempFitVarAxis, dcazAxis, NsigmaTPCAxis, NsigmaTOFAxis}); } - } else if constexpr (mParticleType == o2::aod::femtodreamparticle::ParticleType::kV0 || mParticleType == o2::aod::femtodreamparticle::ParticleType::kCascadeV0) { + } else if constexpr (mParticleType == o2::aod::femtodreamparticle::ParticleType::kV0) { mHistogramRegistry->add((folderName + folderSuffix + "/hDaughDCA").c_str(), "; DCA^{daugh} (cm); Entries", kTH1F, {{1000, 0, 10}}); mHistogramRegistry->add((folderName + folderSuffix + "/hTransRadius").c_str(), "; #it{r}_{xy} (cm); Entries", kTH1F, {{1500, 0, 150}}); mHistogramRegistry->add((folderName + folderSuffix + "/hDecayVtxX").c_str(), "; #it{Vtx}_{x} (cm); Entries", kTH1F, {{2000, 0, 200}}); mHistogramRegistry->add((folderName + folderSuffix + "/hDecayVtxY").c_str(), "; #it{Vtx}_{y} (cm)); Entries", kTH1F, {{2000, 0, 200}}); mHistogramRegistry->add((folderName + folderSuffix + "/hDecayVtxZ").c_str(), "; #it{Vtx}_{z} (cm); Entries", kTH1F, {{2000, 0, 200}}); } else if constexpr (mParticleType == o2::aod::femtodreamparticle::ParticleType::kCascade) { - mHistogramRegistry->add((folderName + folderSuffix + "/hDaughDCA").c_str(), "; DCA^{daugh} (cm); Entries", kTH1F, {{1000, 0, 10}}); - mHistogramRegistry->add((folderName + folderSuffix + "/hTransRadius").c_str(), "; #it{r}_{xy} (cm); Entries", kTH1F, {{1500, 0, 150}}); - mHistogramRegistry->add((folderName + folderSuffix + "/hTransRadius_pT").c_str(), "; p_{T}; #it{r}_{xy} (cm)", kTH2F, {{100, 0, 6}, {1500, 0, 150}}); - mHistogramRegistry->add((folderName + folderSuffix + "/hDecayVtxX").c_str(), "; #it{Vtx}_{x} (cm); Entries", kTH1F, {{2000, 0, 200}}); - mHistogramRegistry->add((folderName + folderSuffix + "/hDecayVtxY").c_str(), "; #it{Vtx}_{y} (cm)); Entries", kTH1F, {{2000, 0, 200}}); - mHistogramRegistry->add((folderName + folderSuffix + "/hDecayVtxZ").c_str(), "; #it{Vtx}_{z} (cm); Entries", kTH1F, {{2000, 0, 200}}); + mHistogramRegistry->add((folderName + folderSuffix + "/hCascV0DCADaugh").c_str(), "; #DCA{daugh} (cm); Entries", kTH1F, {{300, 0, 3}}); + mHistogramRegistry->add((folderName + folderSuffix + "/hCascV0TransRadius").c_str(), "; #it{r}_{xy} (cm); Entries", kTH1F, {{1500, 0, 150}}); + mHistogramRegistry->add((folderName + folderSuffix + "/hCascV0DCAtoPV").c_str(), "; DCA^{PV} (cm); Entries", kTH1F, {{1000, 0, 10}}); + mHistogramRegistry->add((folderName + folderSuffix + "/hCascDaughDCA").c_str(), "; DCA^{daugh} (cm); Entries", kTH1F, {{1000, 0, 10}}); + mHistogramRegistry->add((folderName + folderSuffix + "/hCascTransRadius").c_str(), "; #it{r}_{xy} (cm); Entries", kTH1F, {{1500, 0, 150}}); + mHistogramRegistry->add((folderName + folderSuffix + "/hCascDecayVtxX").c_str(), "; #it{Vtx}_{x} (cm); Entries", kTH1F, {{2000, 0, 200}}); + mHistogramRegistry->add((folderName + folderSuffix + "/hCascDecayVtxY").c_str(), "; #it{Vtx}_{y} (cm)); Entries", kTH1F, {{2000, 0, 200}}); + mHistogramRegistry->add((folderName + folderSuffix + "/hCascDecayVtxZ").c_str(), "; #it{Vtx}_{z} (cm); Entries", kTH1F, {{2000, 0, 200}}); + mHistogramRegistry->add((folderName + folderSuffix + "/hInvMassCompetingCascade").c_str(), "; M_{Competing Cascade}; Entries", kTH1F, {InvMassCompetingAxis}); + mHistogramRegistry->add((folderName + folderSuffix + "/hpTInvMassCompetingCascade").c_str(), "; p_{T} (GeV/#it{c{}); M_{Competing Cascade}", kTH2F, {pTAxis, InvMassCompetingAxis}); } } @@ -242,7 +246,7 @@ class FemtoDreamParticleHisto /// \param tempFitVarBins binning of the tempFitVar (DCA_xy in case of tracks, CPA in case of V0s, etc.) /// \param isMC add Monte Carlo truth histograms to the output file template - void init(HistogramRegistry* registry, T& MultBins, T& PercentileBins, T& pTBins, T& etaBins, T& phiBins, T& tempFitVarBins, T& NsigmaTPCBins, T& NsigmaTOFBins, T& NsigmaTPCTOFBins, T& NsigmaITSBins, T& InvMassBins, bool isMC, int pdgCode, bool isDebug = false, bool correlatedPlots = false) + void init(HistogramRegistry* registry, T& MultBins, T& PercentileBins, T& pTBins, T& etaBins, T& phiBins, T& tempFitVarBins, T& NsigmaTPCBins, T& NsigmaTOFBins, T& NsigmaTPCTOFBins, T& NsigmaITSBins, T& InvMassBins, T& InvMassCompetingBins, bool isMC, int pdgCode, bool isDebug = false, bool correlatedPlots = false) { mPDG = pdgCode; if (registry) { @@ -274,13 +278,14 @@ class FemtoDreamParticleHisto framework::AxisSpec NsigmaTPCTOFAxis = {NsigmaTPCTOFBins, "n#sigma_{TPC+TOF}"}; framework::AxisSpec NsigmaITSAxis = {NsigmaITSBins, "n#sigma_{ITS}"}; framework::AxisSpec InvMassAxis = {InvMassBins, "M_{inv} (GeV/#it{c}^{2})"}; + framework::AxisSpec InvMassCompetingAxis = {InvMassCompetingBins, "M_{inv} (GeV/#it{c}^{2})"}; std::string folderName = (static_cast(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]).c_str() + static_cast(mFolderSuffix[mFolderSuffixType])).c_str(); // Fill here the actual histogramms by calling init_base and init_MC init_base(folderName, tempFitVarAxisTitle, pTAxis, tempFitVarAxis, InvMassAxis, multAxis); if (isDebug) { - init_debug(folderName, multAxis, multPercentileAxis, pTAxis, etaAxis, phiAxis, tempFitVarAxis, dcazAxis, NsigmaTPCAxis, NsigmaTOFAxis, NsigmaTPCTOFAxis, NsigmaITSAxis, correlatedPlots); + init_debug(folderName, multAxis, multPercentileAxis, pTAxis, etaAxis, phiAxis, tempFitVarAxis, dcazAxis, NsigmaTPCAxis, NsigmaTOFAxis, NsigmaTPCTOFAxis, NsigmaITSAxis, InvMassCompetingAxis, correlatedPlots); } if (isMC) { init_base(folderName, tempFitVarAxisTitle, pTAxis, tempFitVarAxis, InvMassAxis, multAxis); @@ -438,19 +443,23 @@ class FemtoDreamParticleHisto pidTPC, pidTOF); } - } else if constexpr (mParticleType == o2::aod::femtodreamparticle::ParticleType::kV0 || mParticleType == o2::aod::femtodreamparticle::ParticleType::kCascadeV0) { + } else if constexpr (mParticleType == o2::aod::femtodreamparticle::ParticleType::kV0) { mHistogramRegistry->fill(HIST(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]) + HIST(o2::aod::femtodreamMCparticle::MCTypeName[mc]) + HIST("/hDaughDCA"), part.daughDCA()); mHistogramRegistry->fill(HIST(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]) + HIST(o2::aod::femtodreamMCparticle::MCTypeName[mc]) + HIST("/hTransRadius"), part.transRadius()); mHistogramRegistry->fill(HIST(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]) + HIST(o2::aod::femtodreamMCparticle::MCTypeName[mc]) + HIST("/hDecayVtxX"), part.decayVtxX()); mHistogramRegistry->fill(HIST(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]) + HIST(o2::aod::femtodreamMCparticle::MCTypeName[mc]) + HIST("/hDecayVtxY"), part.decayVtxY()); mHistogramRegistry->fill(HIST(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]) + HIST(o2::aod::femtodreamMCparticle::MCTypeName[mc]) + HIST("/hDecayVtxZ"), part.decayVtxZ()); } else if constexpr (mParticleType == o2::aod::femtodreamparticle::ParticleType::kCascade) { - mHistogramRegistry->fill(HIST(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]) + HIST(o2::aod::femtodreamMCparticle::MCTypeName[mc]) + HIST("/hDaughDCA"), part.daughDCA()); - mHistogramRegistry->fill(HIST(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]) + HIST(o2::aod::femtodreamMCparticle::MCTypeName[mc]) + HIST("/hTransRadius"), part.transRadius()); - mHistogramRegistry->fill(HIST(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]) + HIST(o2::aod::femtodreamMCparticle::MCTypeName[mc]) + HIST("/hTransRadius_pT"), part.pt(), part.transRadius()); - mHistogramRegistry->fill(HIST(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]) + HIST(o2::aod::femtodreamMCparticle::MCTypeName[mc]) + HIST("/hDecayVtxX"), part.decayVtxX()); - mHistogramRegistry->fill(HIST(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]) + HIST(o2::aod::femtodreamMCparticle::MCTypeName[mc]) + HIST("/hDecayVtxY"), part.decayVtxY()); - mHistogramRegistry->fill(HIST(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]) + HIST(o2::aod::femtodreamMCparticle::MCTypeName[mc]) + HIST("/hDecayVtxZ"), part.decayVtxZ()); + mHistogramRegistry->fill(HIST(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]) + HIST(o2::aod::femtodreamMCparticle::MCTypeName[mc]) + HIST("/hCascV0DCADaugh"), part.daughDCA()); + mHistogramRegistry->fill(HIST(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]) + HIST(o2::aod::femtodreamMCparticle::MCTypeName[mc]) + HIST("/hCascV0TransRadius"), part.transRadius()); + mHistogramRegistry->fill(HIST(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]) + HIST(o2::aod::femtodreamMCparticle::MCTypeName[mc]) + HIST("/hCascV0DCAtoPV"), part.cascV0DCAtoPV()); + mHistogramRegistry->fill(HIST(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]) + HIST(o2::aod::femtodreamMCparticle::MCTypeName[mc]) + HIST("/hCascDaughDCA"), part.cascDaughDCA()); + mHistogramRegistry->fill(HIST(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]) + HIST(o2::aod::femtodreamMCparticle::MCTypeName[mc]) + HIST("/hCascTransRadius"), part.cascTransRadius()); + mHistogramRegistry->fill(HIST(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]) + HIST(o2::aod::femtodreamMCparticle::MCTypeName[mc]) + HIST("/hCascDecayVtxX"), part.cascDecayVtxX()); + mHistogramRegistry->fill(HIST(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]) + HIST(o2::aod::femtodreamMCparticle::MCTypeName[mc]) + HIST("/hCascDecayVtxY"), part.cascDecayVtxY()); + mHistogramRegistry->fill(HIST(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]) + HIST(o2::aod::femtodreamMCparticle::MCTypeName[mc]) + HIST("/hCascDecayVtxZ"), part.cascDecayVtxZ()); + mHistogramRegistry->fill(HIST(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]) + HIST(o2::aod::femtodreamMCparticle::MCTypeName[mc]) + HIST("/hInvMassCompetingCascade"), part.mOmega()); + mHistogramRegistry->fill(HIST(o2::aod::femtodreamparticle::ParticleTypeName[mParticleType]) + HIST(mFolderSuffix[mFolderSuffixType]) + HIST(o2::aod::femtodreamMCparticle::MCTypeName[mc]) + HIST("/hpTInvMassCompetingCascade"), part.pt(), part.mOmega()); } } diff --git a/PWGCF/FemtoDream/Core/femtoDreamSelection.h b/PWGCF/FemtoDream/Core/femtoDreamSelection.h index 73d29ff7d51..1260f358830 100644 --- a/PWGCF/FemtoDream/Core/femtoDreamSelection.h +++ b/PWGCF/FemtoDream/Core/femtoDreamSelection.h @@ -84,16 +84,16 @@ class FemtoDreamSelection case (femtoDreamSelection::SelectionType::kUpperLimit): return (observable <= mSelVal); case (femtoDreamSelection::SelectionType::kAbsUpperLimit): - return (std::abs(observable) <= mSelVal); + return (std::fabs(observable) <= mSelVal); break; case (femtoDreamSelection::SelectionType::kLowerLimit): return (observable >= mSelVal); case (femtoDreamSelection::SelectionType::kAbsLowerLimit): - return (std::abs(observable) >= mSelVal); + return (std::fabs(observable) >= mSelVal); break; case (femtoDreamSelection::SelectionType::kEqual): /// \todo can the comparison be done a bit nicer? - return (std::abs(observable - mSelVal) < std::abs(mSelVal * 1e-6)); + return (std::fabs(observable - mSelVal) < std::abs(mSelVal * 1e-6)); break; } return false; diff --git a/PWGCF/FemtoDream/TableProducer/CMakeLists.txt b/PWGCF/FemtoDream/TableProducer/CMakeLists.txt index 4f48c6bf10a..77ece58f958 100644 --- a/PWGCF/FemtoDream/TableProducer/CMakeLists.txt +++ b/PWGCF/FemtoDream/TableProducer/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright 2019-2024 CERN and copyright holders of ALICE O2. +# Copyright 2019-2025 CERN and copyright holders of ALICE O2. # See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. # All rights not expressly granted are reserved. # @@ -14,6 +14,11 @@ o2physics_add_dpl_workflow(femtodream-producer PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::EventFilteringUtils COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(femtodream-producer-withcascades + SOURCES femtoDreamProducerTaskWithCascades.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::EventFilteringUtils + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(femtodream-producer-reduced SOURCES femtoDreamProducerReducedTask.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore @@ -23,4 +28,3 @@ o2physics_add_dpl_workflow(femtodream-producer-for-specific-analysis SOURCES femtoDreamProducerTaskForSpecificAnalysis.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore COMPONENT_NAME Analysis) - diff --git a/PWGCF/FemtoDream/TableProducer/femtoDreamProducerReducedTask.cxx b/PWGCF/FemtoDream/TableProducer/femtoDreamProducerReducedTask.cxx index a22cc1732e6..621b2693ff9 100644 --- a/PWGCF/FemtoDream/TableProducer/femtoDreamProducerReducedTask.cxx +++ b/PWGCF/FemtoDream/TableProducer/femtoDreamProducerReducedTask.cxx @@ -317,7 +317,8 @@ struct femtoDreamProducerReducedTask { track.itsNSigmaDe(), track.itsNSigmaTr(), track.itsNSigmaHe(), - -999., -999., -999., -999., -999., -999.); + -999., -999., -999., -999., -999., -999., + -999., -999., -999., -999., -999., -999., -999.); } } } diff --git a/PWGCF/FemtoDream/TableProducer/femtoDreamProducerTask.cxx b/PWGCF/FemtoDream/TableProducer/femtoDreamProducerTask.cxx index ed9b0044666..6a80a9d2caa 100644 --- a/PWGCF/FemtoDream/TableProducer/femtoDreamProducerTask.cxx +++ b/PWGCF/FemtoDream/TableProducer/femtoDreamProducerTask.cxx @@ -125,7 +125,6 @@ struct femtoDreamProducerTask { Configurable ConfEvtAddOfflineCheck{"ConfEvtAddOfflineCheck", false, "Evt sel: additional checks for offline selection (not part of sel8 yet)"}; Configurable ConfIsActivateV0{"ConfIsActivateV0", true, "Activate filling of V0 into femtodream tables"}; Configurable ConfIsActivateReso{"ConfIsActivateReso", false, "Activate filling of sl Resonances into femtodream tables"}; - Configurable ConfIsActivateCascade{"ConfIsActivateCascade", false, "Activate filling of Cascades into femtodream tables"}; Configurable ConfTrkRejectNotPropagated{"ConfTrkRejectNotPropagated", false, "True: reject not propagated tracks"}; // Configurable ConfRejectITSHitandTOFMissing{ "ConfRejectITSHitandTOFMissing", false, "True: reject if neither ITS hit nor TOF timing satisfied"}; @@ -172,56 +171,6 @@ struct femtoDreamProducerTask { Configurable> ConfChildPIDnSigmaMax{"ConfChildPIDnSigmaMax", std::vector{5.f, 4.f}, "V0 Child sel: Max. PID nSigma TPC"}; Configurable> ConfChildPIDspecies{"ConfChildPIDspecies", std::vector{o2::track::PID::Pion, o2::track::PID::Proton}, "V0 Child sel: Particles species for PID"}; - FemtoDreamCascadeSelection cascadeCuts; - struct : o2::framework::ConfigurableGroup { - Configurable ConfCascInvMassLowLimit{"ConfCascInvMassLowLimit", 1.2, "Lower limit of the Cascade invariant mass"}; - Configurable ConfCascInvMassUpLimit{"ConfCascInvMassUpLimit", 1.5, "Upper limit of the Cascade invariant mass"}; - Configurable ConfCascIsSelectedOmega{"ConfCascIsSelectedOmega", false, "Select Omegas instead of Xis (invariant mass)"}; - // Cascade - Configurable> ConfCascadeSign{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeSign, "ConfCascade"), std::vector{-1, 1}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeSign, "Cascade selection: ")}; - Configurable> ConfCascadePtMin{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadePtMin, "ConfCascade"), std::vector{0.3f, 0.4f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadePtMin, "Cascade selection: ")}; - Configurable> ConfCascadePtMax{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadePtMax, "ConfCascade"), std::vector{5.5f, 6.0f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadePtMax, "Cascade selection: ")}; - Configurable> ConfCascadeEtaMax{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeEtaMax, "ConfCascade"), std::vector{0.8f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeEtaMax, "Cascade selection: ")}; - Configurable> ConfCascadeDCADaughMax{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeDCADaughMax, "ConfCascade"), std::vector{1.f, 1.2f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeDCADaughMax, "Cascade selection: ")}; - Configurable> ConfCascadeCPAMin{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeCPAMin, "ConfCascade"), std::vector{0.99f, 0.95f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeCPAMin, "Cascade selection: ")}; - Configurable> ConfCascadeTranRadMin{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeTranRadMin, "ConfCascade"), std::vector{0.2f, 0.5f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeTranRadMin, "Cascade selection: ")}; - Configurable> ConfCascadeTranRadMax{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeTranRadMax, "ConfCascade"), std::vector{100.f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeTranRadMax, "Cascade selection: ")}; - Configurable> ConfCascadeDecVtxMax{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeDecVtxMax, "ConfCascade"), std::vector{100.f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeDecVtxMax, "Cascade selection: ")}; - - // Cascade v0 daughters - Configurable> ConfCascadeV0DCADaughMax{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeV0DCADaughMax, "ConfCascade"), std::vector{1.2f, 1.5f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeV0DCADaughMax, "CascV0 selection: ")}; - Configurable> ConfCascadeV0CPAMin{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeV0CPAMin, "ConfCascade"), std::vector{0.99f, 0.995f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeV0CPAMin, "CascV0 selection: ")}; - Configurable> ConfCascadeV0TranRadMin{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeV0TranRadMin, "ConfCascade"), std::vector{0.2f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeV0TranRadMin, "CascV0 selection: ")}; - Configurable> ConfCascadeV0TranRadMax{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeV0TranRadMax, "ConfCascade"), std::vector{100.f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeV0TranRadMax, "CascV0 selection: ")}; - Configurable> ConfCascadeV0DCAtoPVMin{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeV0DCAtoPVMin, "ConfCascade"), std::vector{100.f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeV0DCAtoPVMin, "CascV0 selection: ")}; - Configurable> ConfCascadeV0DCAtoPVMax{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeV0DCAtoPVMax, "ConfCascade"), std::vector{100.f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeV0DCAtoPVMax, "CascV0 selection: ")}; - Configurable ConfCascV0InvMassLowLimit{"ConfCascV0InvMassLowLimit", 1.011461, "Lower limit of the Cascade invariant mass"}; - Configurable ConfCascV0InvMassUpLimit{"ConfCascV0InvMassUpLimit", 1.027461, "Upper limit of the Cascade invariant mass"}; - // Cascade Daughter Tracks - Configurable> ConfCascV0ChildCharge{"ConfCascV0ChildSign", std::vector{-1, 1}, "CascV0 Child sel: Charge"}; - Configurable> ConfCascV0ChildEtaMax{"ConfCascV0ChildEtaMax", std::vector{0.8f}, "CascV0 Child sel: max eta"}; - Configurable> ConfCascV0ChildTPCnClsMin{"ConfCascV0ChildTPCnClsMin", std::vector{80.f, 70.f, 60.f}, "CascV0 Child sel: Min. nCls TPC"}; - Configurable> ConfCascV0ChildDCAMin{"ConfCascV0ChildDCAMin", std::vector{0.05f, 0.06f}, "CascV0 Child sel: Max. DCA Daugh to PV (cm)"}; - Configurable> ConfCascV0ChildPIDnSigmaMax{"ConfCascV0ChildPIDnSigmaMax", std::vector{5.f, 4.f}, "CascV0 Child sel: Max. PID nSigma TPC"}; - Configurable> ConfCascV0ChildPIDspecies{"ConfCascV0ChildPIDspecies", std::vector{o2::track::PID::Pion, o2::track::PID::Proton}, "CascV0 Child sel: Particles species for PID"}; - // Cascade Bachelor Track - Configurable> ConfCascBachelorCharge{"ConfCascBachelorSign", std::vector{-1, 1}, "Cascade Bachelor sel: Charge"}; - Configurable> ConfCascBachelorEtaMax{"ConfCascBachelorEtaMax", std::vector{0.8f}, "Cascade Bachelor sel: max eta"}; - Configurable> ConfCascBachelorTPCnClsMin{"ConfCascBachelorTPCnClsMin", std::vector{80.f, 70.f, 60.f}, "Cascade Bachelor sel: Min. nCls TPC"}; - Configurable> ConfCascBachelorDCAMin{"ConfCascBachelorDCAMin", std::vector{0.05f, 0.06f}, "Cascade Bachelor sel: Max. DCA Daugh to PV (cm)"}; - Configurable> ConfCascBachelorPIDnSigmaMax{"ConfCascBachelorPIDnSigmaMax", std::vector{5.f, 4.f}, "Cascade Bachelor sel: Max. PID nSigma TPC"}; - Configurable> ConfCascBachelorPIDspecies{"ConfCascBachelorPIDspecies", std::vector{o2::track::PID::Pion}, "Cascade Bachelor sel: Particles species for PID"}; - /* - Configurable> ConfCascadeDCAPosToPV{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeDCAPosToPV, "ConfCascade"), std::vector{0.1f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeDCAPosToPV, "Cascade selection: ")}; - Configurable> ConfCascadeDCANegToPV{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeDCANegToPV, "ConfCascade"), std::vector{0.1f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeDCANegToPV, "Cascade selection: ")}; - Configurable> ConfCascadeDCABachToPV{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeDCABachToPV, "ConfCascade"), std::vector{0.1f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeDCABachToPV, "Cascade selection: ")}; - - Configurable confCascRejectCompetingMass{"confCascRejectCompetingMass", false, "Switch on to reject Omegas (for Xi) or Xis (for Omegas)"}; - Configurable confCascInvCompetingMassLowLimit{"confCascInvCompetingMassLowLimit", 1.66, "Lower limit of the cascade invariant mass for competing mass rejection"}; - Configurable confCascInvCompetingMassUpLimit{"confCascInvCompetingMassUpLimit", 1.68, "Upper limit of the cascade invariant mass for competing mass rejection"}; - */ - } ConfCascSel; - // Resonances Configurable ConfResoInvMassLowLimit{"ConfResoInvMassLowLimit", 1.011461, "Lower limit of the Reso invariant mass"}; Configurable ConfResoInvMassUpLimit{"ConfResoInvMassUpLimit", 1.027461, "Upper limit of the Reso invariant mass"}; @@ -260,7 +209,6 @@ struct femtoDreamProducerTask { HistogramRegistry TrackRegistry{"Tracks", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry V0Registry{"V0", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry ResoRegistry{"Reso", {}, OutputObjHandlingPolicy::AnalysisObject}; - HistogramRegistry CascadeRegistry{"Cascade", {}, OutputObjHandlingPolicy::AnalysisObject}; int mRunNumber; float mMagField; @@ -287,7 +235,6 @@ struct femtoDreamProducerTask { TrackRegistry.add("AnalysisQA/Mother", "; Bit; Entries", kTH1F, {{4000, -4000, 4000}}); TrackRegistry.add("AnalysisQA/Particle", "; Bit; Entries", kTH1F, {{4000, -4000, 4000}}); V0Registry.add("AnalysisQA/CutCounter", "; Bit; Counter", kTH1F, {{CutBits + 1, -0.5, CutBits + 0.5}}); - CascadeRegistry.add("AnalysisQA/CutCounter", "; Bit; Counter", kTH1F, {{CutBits + 1, -0.5, CutBits + 0.5}}); ResoRegistry.add("AnalysisQA/Reso/InvMass", "Invariant mass V0s;M_{KK};Entries", HistType::kTH1F, {{7000, 0.8, 1.5}}); ResoRegistry.add("AnalysisQA/Reso/InvMass_selected", "Invariant mass V0s;M_{KK};Entries", HistType::kTH1F, {{7000, 0.8, 1.5}}); ResoRegistry.add("AnalysisQA/Reso/Daughter1/Pt", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{1000, 0, 10}}); @@ -369,59 +316,6 @@ struct femtoDreamProducerTask { v0Cuts.setKaonInvMassLimits(ConfV0InvKaonMassLowLimit, ConfV0InvKaonMassUpLimit); } } - if (ConfIsActivateCascade) { - // Cascades - cascadeCuts.setSelection(ConfCascSel.ConfCascadeSign, femtoDreamCascadeSelection::kCascadeSign, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadeSign)); - cascadeCuts.setSelection(ConfCascSel.ConfCascadePtMin, femtoDreamCascadeSelection::kCascadePtMin, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadePtMin)); - cascadeCuts.setSelection(ConfCascSel.ConfCascadePtMax, femtoDreamCascadeSelection::kCascadePtMax, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadePtMax)); - cascadeCuts.setSelection(ConfCascSel.ConfCascadeEtaMax, femtoDreamCascadeSelection::kCascadeEtaMax, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadeEtaMax)); - cascadeCuts.setSelection(ConfCascSel.ConfCascadeDCADaughMax, femtoDreamCascadeSelection::kCascadeDCADaughMax, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadeDCADaughMax)); - cascadeCuts.setSelection(ConfCascSel.ConfCascadeCPAMin, femtoDreamCascadeSelection::kCascadeCPAMin, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadeCPAMin)); - cascadeCuts.setSelection(ConfCascSel.ConfCascadeTranRadMin, femtoDreamCascadeSelection::kCascadeTranRadMin, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadeTranRadMin)); - cascadeCuts.setSelection(ConfCascSel.ConfCascadeTranRadMax, femtoDreamCascadeSelection::kCascadeTranRadMax, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadeTranRadMax)); - cascadeCuts.setSelection(ConfCascSel.ConfCascadeDecVtxMax, femtoDreamCascadeSelection::kCascadeDecVtxMax, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadeDecVtxMax)); - // Cascade v0 - cascadeCuts.setSelection(ConfCascSel.ConfCascadeV0DCADaughMax, femtoDreamCascadeSelection::kCascadeV0DCADaughMax, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadeV0DCADaughMax)); - cascadeCuts.setSelection(ConfCascSel.ConfCascadeV0CPAMin, femtoDreamCascadeSelection::kCascadeV0CPAMin, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadeV0CPAMin)); - cascadeCuts.setSelection(ConfCascSel.ConfCascadeV0TranRadMin, femtoDreamCascadeSelection::kCascadeV0TranRadMin, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadeV0TranRadMin)); - cascadeCuts.setSelection(ConfCascSel.ConfCascadeV0TranRadMax, femtoDreamCascadeSelection::kCascadeV0TranRadMax, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadeV0TranRadMax)); - cascadeCuts.setSelection(ConfCascSel.ConfCascadeV0DCAtoPVMin, femtoDreamCascadeSelection::kCascadeV0DCAtoPVMin, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadeV0DCAtoPVMin)); - cascadeCuts.setSelection(ConfCascSel.ConfCascadeV0DCAtoPVMax, femtoDreamCascadeSelection::kCascadeV0DCAtoPVMax, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadeV0DCAtoPVMax)); - - // Cascade Daughter Tracks - cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kPosTrack, ConfCascSel.ConfCascV0ChildCharge, femtoDreamTrackSelection::kSign, femtoDreamSelection::kEqual); - cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kPosTrack, ConfCascSel.ConfCascV0ChildEtaMax, femtoDreamTrackSelection::kEtaMax, femtoDreamSelection::kAbsUpperLimit); - cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kPosTrack, ConfCascSel.ConfCascV0ChildTPCnClsMin, femtoDreamTrackSelection::kTPCnClsMin, femtoDreamSelection::kLowerLimit); - cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kPosTrack, ConfCascSel.ConfCascV0ChildDCAMin, femtoDreamTrackSelection::kDCAMin, femtoDreamSelection::kLowerLimit); - cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kPosTrack, ConfCascSel.ConfCascV0ChildPIDnSigmaMax, femtoDreamTrackSelection::kPIDnSigmaMax, femtoDreamSelection::kAbsUpperLimit); - cascadeCuts.setChildPIDSpecies(femtoDreamCascadeSelection::kPosTrack, ConfCascSel.ConfCascV0ChildPIDspecies); - - cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kNegTrack, ConfCascSel.ConfCascV0ChildCharge, femtoDreamTrackSelection::kSign, femtoDreamSelection::kEqual); - cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kNegTrack, ConfCascSel.ConfCascV0ChildEtaMax, femtoDreamTrackSelection::kEtaMax, femtoDreamSelection::kAbsUpperLimit); - cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kNegTrack, ConfCascSel.ConfCascV0ChildTPCnClsMin, femtoDreamTrackSelection::kTPCnClsMin, femtoDreamSelection::kLowerLimit); - cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kNegTrack, ConfCascSel.ConfCascV0ChildDCAMin, femtoDreamTrackSelection::kDCAMin, femtoDreamSelection::kLowerLimit); - cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kNegTrack, ConfCascSel.ConfCascV0ChildPIDnSigmaMax, femtoDreamTrackSelection::kPIDnSigmaMax, femtoDreamSelection::kAbsUpperLimit); - cascadeCuts.setChildPIDSpecies(femtoDreamCascadeSelection::kNegTrack, ConfCascSel.ConfCascV0ChildPIDspecies); - - // Cascade Bachelor Track - cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kBachTrack, ConfCascSel.ConfCascBachelorCharge, femtoDreamTrackSelection::kSign, femtoDreamSelection::kEqual); - cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kBachTrack, ConfCascSel.ConfCascBachelorEtaMax, femtoDreamTrackSelection::kEtaMax, femtoDreamSelection::kAbsUpperLimit); - cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kBachTrack, ConfCascSel.ConfCascBachelorTPCnClsMin, femtoDreamTrackSelection::kTPCnClsMin, femtoDreamSelection::kLowerLimit); - cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kBachTrack, ConfCascSel.ConfCascBachelorDCAMin, femtoDreamTrackSelection::kDCAMin, femtoDreamSelection::kLowerLimit); - cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kBachTrack, ConfCascSel.ConfCascBachelorPIDnSigmaMax, femtoDreamTrackSelection::kPIDnSigmaMax, femtoDreamSelection::kAbsUpperLimit); - cascadeCuts.setChildPIDSpecies(femtoDreamCascadeSelection::kBachTrack, ConfCascSel.ConfCascBachelorPIDspecies); - - /* - //Cascade daughter tracks - cascadeCuts.setSelection(ConfCascSel.ConfCascadeDCAPosToPV, femtoDreamCascadeSelection::kCascadeDCAPosToPV, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::CascadeSel::kCascadeDCAPosToPV)); - cascadeCuts.setSelection(ConfCascSel.ConfCascadeDCANegToPV, femtoDreamCascadeSelection::kCascadeDCANegToPV, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::CascadeSel::kCascadeDCANegToPV)); - cascadeCuts.setSelection(ConfCascSel.ConfCascadeDCABachToPV, femtoDreamCascadeSelection::kCascadeDCABachToPV, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::CascadeSel::kCascadeDCABachToPV)); - */ - - cascadeCuts.init(&qaRegistry, &CascadeRegistry, ConfCascSel.ConfCascIsSelectedOmega); - cascadeCuts.setInvMassLimits(ConfCascSel.ConfCascInvMassLowLimit, ConfCascSel.ConfCascInvMassUpLimit); - cascadeCuts.setV0InvMassLimits(ConfCascSel.ConfCascV0InvMassLowLimit, ConfCascSel.ConfCascV0InvMassUpLimit); - } mRunNumber = 0; mMagField = 0.0; @@ -515,7 +409,8 @@ struct femtoDreamProducerTask { particle.itsNSigmaDe(), particle.itsNSigmaTr(), particle.itsNSigmaHe(), - -999., -999., -999., -999., -999., -999.); + -999., -999., -999., -999., -999., -999., + -999., -999., -999., -999., -999., -999., -999.); } else { outputDebugParts(particle.sign(), (uint8_t)particle.tpcNClsFound(), @@ -542,34 +437,26 @@ struct femtoDreamProducerTask { particle.tofNSigmaDe(), particle.tofNSigmaTr(), particle.tofNSigmaHe(), - -999., -999., -999., -999., -999., -999., -999., + -999., -999., -999., -999., -999., -999., -999., -999., + -999., -999., -999., -999., -999., -999., -999., -999., -999., -999., -999., -999., -999.); } } else { - outputDebugParts(-999., -999., -999., -999., -999., -999., -999., - -999., -999., -999., -999., -999., -999., -999., - -999., -999., -999., -999., -999., -999., -999., - -999., -999., -999., -999., -999., -999., -999., - -999., -999., -999., -999., -999., + outputDebugParts(-999., // sign + -999., -999., -999., -999., -999., -999., -999., -999., -999., // track properties (DCA, NCls, crossed rows, etc.) + -999., -999., -999., -999., -999., -999., -999., -999., // TPC PID (TPC signal + particle hypothesis) + -999., -999., -999., -999., -999., -999., -999., // TOF PID + -999., -999., -999., -999., -999., -999., -999., -999., // ITS PID particle.dcaV0daughters(), particle.v0radius(), particle.x(), particle.y(), particle.z(), - particle.mK0Short()); + particle.mK0Short(), + -999., -999., -999., -999., -999., -999., -999.); // Cascade properties } } - template - void fillDebugCascade(ParticleType) - { - outputDebugParts(-999., -999., -999., -999., -999., -999., -999., -999., - -999., -999., -999., -999., -999., -999., -999., -999., - -999., -999., -999., -999., -999., -999., -999., -999., - -999., -999., -999., -999., -999., -999., -999., -999., - -999., -999. - 999., -999., -999., -999., -999., -999.); // QA for Reso - } - template void fillMCParticle(CollisionType const& col, ParticleType const& particle, o2::aod::femtodreamparticle::ParticleType fdparttype) { @@ -643,8 +530,8 @@ struct femtoDreamProducerTask { outputCollsMCLabels(-1); } } - template - void fillCollisionsAndTracksAndV0AndCascade(CollisionType const& col, TrackType const& tracks, TrackTypeWithItsPid const& tracksWithItsPid, V0Type const& fullV0s, CascadeType const& fullCascades) + template + void fillCollisionsAndTracksAndV0(CollisionType const& col, TrackType const& tracks, TrackTypeWithItsPid const& tracksWithItsPid, V0Type const& fullV0s) { // If triggering is enabled, select only events which were triggered wit our triggers if (ConfEnableTriggerSelection) { @@ -681,13 +568,6 @@ struct femtoDreamProducerTask { if (!colCuts.isSelectedCollision(col)) { return; } - /* - if (ConfIsActivatecascade.value) { - if (colCuts.isEmptyCollision(col, tracks, trackCuts) && colCuts.isEmptyCollision(col, fullV0s, v0Cuts, tracks)) { - return; - } - } - */ if (ConfIsActivateV0.value) { if (colCuts.isEmptyCollision(col, tracks, trackCuts) && colCuts.isEmptyCollision(col, fullV0s, v0Cuts, tracks)) { return; @@ -703,9 +583,8 @@ struct femtoDreamProducerTask { fillMCCollision(col); } - std::vector childIDs = {0, 0}; // these IDs are necessary to keep track of the children - std::vector cascadechildIDs = {0, 0, 0}; // these IDs are necessary to keep track of the children - std::vector tmpIDtrack; // this vector keeps track of the matching of the primary track table row <-> aod::track table global index + std::vector childIDs = {0, 0}; // these IDs are necessary to keep track of the children + std::vector tmpIDtrack; // this vector keeps track of the matching of the primary track table row <-> aod::track table global index std::vector Daughter1, Daughter2; for (auto& track : tracksWithItsPid) { @@ -867,119 +746,6 @@ struct femtoDreamProducerTask { } } } - if (ConfIsActivateCascade.value) { - for (auto& casc : fullCascades) { - // get the daughter tracks - const auto& posTrackCasc = casc.template posTrack_as(); - const auto& negTrackCasc = casc.template negTrack_as(); - const auto& bachTrackCasc = casc.template bachelor_as(); - - // const auto& v0daughLink = casc.template v0_as(); - // get the daughter v0 - - // QA before the cuts - // cascadeCuts.fillCascadeQA(col, casc, posTrackCasc, negTrackCasc, bachTrackCasc); - // cascadeCuts.fillQA(col, casc, posTrackCasc, negTrackCasc, bachTrackCasc); - - cascadeCuts.fillQA<0, aod::femtodreamparticle::ParticleType::kCascade>(col, casc, posTrackCasc, negTrackCasc, bachTrackCasc); - if (!cascadeCuts.isSelectedMinimal(col, casc, posTrackCasc, negTrackCasc, bachTrackCasc)) { - continue; - } - cascadeCuts.fillQA<1, aod::femtodreamparticle::ParticleType::kCascade>(col, casc, posTrackCasc, negTrackCasc, bachTrackCasc); - - // auto cutContainerCasc = cascadeCuts.getCutContainer(col, casc, v0daugh, posTrackCasc, negTrackCasc, bachTrackCasc); - auto cutContainerCasc = cascadeCuts.getCutContainer(col, casc, posTrackCasc, negTrackCasc, bachTrackCasc); - - // Fill positive child - int poscasctrackID = casc.posTrackId(); - int rowInPrimaryTrackTablePosCasc = -1; - rowInPrimaryTrackTablePosCasc = getRowDaughters(poscasctrackID, tmpIDtrack); - cascadechildIDs[0] = rowInPrimaryTrackTablePosCasc; - cascadechildIDs[1] = 0; - cascadechildIDs[2] = 0; - outputParts(outputCollision.lastIndex(), - casc.positivept(), - casc.positiveeta(), - casc.positivephi(), - aod::femtodreamparticle::ParticleType::kCascadeV0Child, - cutContainerCasc.at(femtoDreamCascadeSelection::CascadeContainerPosition::kPosCuts), - cutContainerCasc.at(femtoDreamCascadeSelection::CascadeContainerPosition::kPosPID), - posTrackCasc.dcaXY(), - cascadechildIDs, - 0, - 0); - const int rowOfPosCascadeTrack = outputParts.lastIndex(); - // TODO: include here MC filling - //------ - - // Fill negative child - int negcasctrackID = casc.negTrackId(); - int rowInPrimaryTrackTableNegCasc = -1; - rowInPrimaryTrackTableNegCasc = getRowDaughters(negcasctrackID, tmpIDtrack); - cascadechildIDs[0] = 0; - cascadechildIDs[1] = rowInPrimaryTrackTableNegCasc; - cascadechildIDs[2] = 0; - outputParts(outputCollision.lastIndex(), - casc.negativept(), - casc.negativeeta(), - casc.negativephi(), - aod::femtodreamparticle::ParticleType::kCascadeV0Child, - cutContainerCasc.at(femtoDreamCascadeSelection::CascadeContainerPosition::kNegCuts), - cutContainerCasc.at(femtoDreamCascadeSelection::CascadeContainerPosition::kNegPID), - negTrackCasc.dcaXY(), - cascadechildIDs, - 0, - 0); - const int rowOfNegCascadeTrack = outputParts.lastIndex(); - // TODO: include here MC filling - //------ - - // Fill bachelor child - int bachelorcasctrackID = casc.bachelorId(); - int rowInPrimaryTrackTableBachelorCasc = -1; - rowInPrimaryTrackTableBachelorCasc = getRowDaughters(bachelorcasctrackID, tmpIDtrack); - cascadechildIDs[0] = 0; - cascadechildIDs[1] = 0; - cascadechildIDs[2] = rowInPrimaryTrackTableBachelorCasc; - outputParts(outputCollision.lastIndex(), - casc.bachelorpt(), - casc.bacheloreta(), - casc.bachelorphi(), - aod::femtodreamparticle::ParticleType::kCascadeBachelor, - cutContainerCasc.at(femtoDreamCascadeSelection::CascadeContainerPosition::kBachCuts), - cutContainerCasc.at(femtoDreamCascadeSelection::CascadeContainerPosition::kBachPID), - bachTrackCasc.dcaXY(), - cascadechildIDs, - 0, - 0); - const int rowOfBachelorCascadeTrack = outputParts.lastIndex(); - // TODO: include here MC filling - //------ - - // Fill cascades - std::vector indexCascadeChildID = {rowOfPosCascadeTrack, rowOfNegCascadeTrack, rowOfBachelorCascadeTrack}; - outputParts(outputCollision.lastIndex(), - casc.pt(), - casc.eta(), - casc.phi(), - aod::femtodreamparticle::ParticleType::kCascade, - cutContainerCasc.at(femtoDreamCascadeSelection::CascadeContainerPosition::kCascade), - 0, - casc.casccosPA(col.posX(), col.posY(), col.posZ()), - indexCascadeChildID, - casc.mXi(), - casc.mLambda()); - // TODO: include here MC filling - //------ - - if (ConfIsDebug.value) { - fillDebugParticle(posTrackCasc); // QA for positive daughter - fillDebugParticle(negTrackCasc); // QA for negative daughter - fillDebugParticle(bachTrackCasc); // QA for negative daughter - fillDebugCascade(casc); // QA for Cascade - } - } - } if (ConfIsActivateReso.value) { for (std::size_t iDaug1 = 0; iDaug1 < Daughter1.size(); ++iDaug1) { @@ -1033,13 +799,15 @@ struct femtoDreamProducerTask { tempPhi.M(), tempPhi.M()); if (ConfIsDebug.value) { - fillDebugParticle(Daughter1.at(iDaug1)); // QA for positive daughter - fillDebugParticle(Daughter2.at(iDaug2)); // QA for negative daughter - outputDebugParts(-999., -999., -999., -999., -999., -999., -999., -999., - -999., -999., -999., -999., -999., -999., -999., -999., - -999., -999., -999., -999., -999., -999., -999., -999., - -999., -999., -999., -999., -999., -999., -999., -999., - -999., -999. - 999., -999., -999., -999., -999., -999.); // QA for Reso + fillDebugParticle(Daughter1.at(iDaug1)); // QA for positive daughter + fillDebugParticle(Daughter2.at(iDaug2)); // QA for negative daughter + outputDebugParts(-999., // sign + -999., -999., -999., -999., -999., -999., -999., -999., -999., // track properties (DCA, NCls, crossed rows, etc.) + -999., -999., -999., -999., -999., -999., -999., -999., // TPC PID (TPC signal + particle hypothesis) + -999., -999., -999., -999., -999., -999., -999., // TOF PID + -999., -999., -999., -999., -999., -999., -999., -999., // ITS PID + -999., -999., -999., -999., -999., -999., // V0 properties + -999., -999., -999., -999., -999., -999., -999.); // Cascade properties } } } @@ -1051,9 +819,7 @@ struct femtoDreamProducerTask { processData(aod::FemtoFullCollision const& col, aod::BCsWithTimestamps const&, aod::FemtoFullTracks const& tracks, - o2::aod::V0Datas const& fullV0s, - o2::aod::V0sLinked const&, - o2::aod::CascDatas const& fullCascades) + o2::aod::V0Datas const& fullV0s) { // get magnetic field for run initCCDB_Mag_Trig(col.bc_as()); @@ -1061,9 +827,9 @@ struct femtoDreamProducerTask { auto tracksWithItsPid = soa::Attach(tracks); if (ConfUseItsPid.value) { - fillCollisionsAndTracksAndV0AndCascade(col, tracks, tracksWithItsPid, fullV0s, fullCascades); + fillCollisionsAndTracksAndV0(col, tracks, tracksWithItsPid, fullV0s); } else { - fillCollisionsAndTracksAndV0AndCascade(col, tracks, tracks, fullV0s, fullCascades); + fillCollisionsAndTracksAndV0(col, tracks, tracks, fullV0s); } } PROCESS_SWITCH(femtoDreamProducerTask, processData, @@ -1073,9 +839,7 @@ struct femtoDreamProducerTask { processData_noCentrality(aod::FemtoFullCollision_noCent const& col, aod::BCsWithTimestamps const&, aod::FemtoFullTracks const& tracks, - o2::aod::V0Datas const& fullV0s, - o2::aod::V0sLinked const&, - o2::aod::CascDatas const& fullCascades) + o2::aod::V0Datas const& fullV0s) { // get magnetic field for run initCCDB_Mag_Trig(col.bc_as()); @@ -1083,9 +847,9 @@ struct femtoDreamProducerTask { auto tracksWithItsPid = soa::Attach(tracks); if (ConfUseItsPid.value) { - fillCollisionsAndTracksAndV0AndCascade(col, tracks, tracksWithItsPid, fullV0s, fullCascades); + fillCollisionsAndTracksAndV0(col, tracks, tracksWithItsPid, fullV0s); } else { - fillCollisionsAndTracksAndV0AndCascade(col, tracks, tracks, fullV0s, fullCascades); + fillCollisionsAndTracksAndV0(col, tracks, tracks, fullV0s); } } PROCESS_SWITCH(femtoDreamProducerTask, processData_noCentrality, @@ -1094,8 +858,7 @@ struct femtoDreamProducerTask { void processData_CentPbPb(aod::FemtoFullCollision_CentPbPb const& col, aod::BCsWithTimestamps const&, aod::FemtoFullTracks const& tracks, - o2::aod::V0Datas const& fullV0s, - o2::aod::CascDatas const& fullCascades) + o2::aod::V0Datas const& fullV0s) { // get magnetic field for run initCCDB_Mag_Trig(col.bc_as()); @@ -1103,9 +866,9 @@ struct femtoDreamProducerTask { auto tracksWithItsPid = soa::Attach(tracks); if (ConfUseItsPid.value) { - fillCollisionsAndTracksAndV0AndCascade(col, tracks, tracksWithItsPid, fullV0s, fullCascades); + fillCollisionsAndTracksAndV0(col, tracks, tracksWithItsPid, fullV0s); } else { - fillCollisionsAndTracksAndV0AndCascade(col, tracks, tracks, fullV0s, fullCascades); + fillCollisionsAndTracksAndV0(col, tracks, tracks, fullV0s); } } PROCESS_SWITCH(femtoDreamProducerTask, processData_CentPbPb, @@ -1116,13 +879,12 @@ struct femtoDreamProducerTask { soa::Join const& tracks, aod::FemtoFullMCgenCollisions const&, aod::McParticles const&, - soa::Join const& fullV0s, /// \todo with FilteredFullV0s - soa::Join const& fullCascades) + soa::Join const& fullV0s) /// \todo with FilteredFullV0s { // get magnetic field for run initCCDB_Mag_Trig(col.bc_as()); // fill the tables - fillCollisionsAndTracksAndV0AndCascade(col, tracks, tracks, fullV0s, fullCascades); + fillCollisionsAndTracksAndV0(col, tracks, tracks, fullV0s); } PROCESS_SWITCH(femtoDreamProducerTask, processMC, "Provide MC data", false); @@ -1131,13 +893,12 @@ struct femtoDreamProducerTask { soa::Join const& tracks, aod::FemtoFullMCgenCollisions const&, aod::McParticles const&, - soa::Join const& fullV0s, /// \todo with FilteredFullV0s - soa::Join const& fullCascades) + soa::Join const& fullV0s) /// \todo with FilteredFullV0s { // get magnetic field for run initCCDB_Mag_Trig(col.bc_as()); // fill the tables - fillCollisionsAndTracksAndV0AndCascade(col, tracks, tracks, fullV0s, fullCascades); + fillCollisionsAndTracksAndV0(col, tracks, tracks, fullV0s); } PROCESS_SWITCH(femtoDreamProducerTask, processMC_noCentrality, "Provide MC data without requiring a centrality calibration", false); @@ -1146,13 +907,12 @@ struct femtoDreamProducerTask { soa::Join const& tracks, aod::FemtoFullMCgenCollisions const&, aod::McParticles const&, - soa::Join const& fullV0s, /// \todo with FilteredFullV0s - soa::Join const& fullCascades) + soa::Join const& fullV0s) /// \todo with FilteredFullV0s { // get magnetic field for run initCCDB_Mag_Trig(col.bc_as()); // fill the tables - fillCollisionsAndTracksAndV0AndCascade(col, tracks, tracks, fullV0s, fullCascades); + fillCollisionsAndTracksAndV0(col, tracks, tracks, fullV0s); } PROCESS_SWITCH(femtoDreamProducerTask, processMC_CentPbPb, "Provide MC data with centrality information for PbPb collisions", false); }; diff --git a/PWGCF/FemtoDream/TableProducer/femtoDreamProducerTaskWithCascades.cxx b/PWGCF/FemtoDream/TableProducer/femtoDreamProducerTaskWithCascades.cxx new file mode 100644 index 00000000000..34702c55d83 --- /dev/null +++ b/PWGCF/FemtoDream/TableProducer/femtoDreamProducerTaskWithCascades.cxx @@ -0,0 +1,1173 @@ +// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file femtoDreamProducerTaskWithCascades.cxx +/// \brief Tasks that produces the track tables used for the pairing +/// \author Laura Serksnyte, TU München, laura.serksnyte@tum.de + +#include +#include +#include +#include +#include "Common/Core/trackUtilities.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/PIDResponseITS.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "DataFormatsParameters/GRPObject.h" +#include "PWGCF/FemtoDream/Core/femtoDreamCollisionSelection.h" +#include "PWGCF/FemtoDream/Core/femtoDreamTrackSelection.h" +#include "PWGCF/FemtoDream/Core/femtoDreamV0Selection.h" +#include "PWGCF/FemtoDream/Core/femtoDreamCascadeSelection.h" +#include "PWGCF/FemtoDream/Core/femtoDreamUtils.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/runDataProcessing.h" +#include "EventFiltering/Zorro.h" +#include "PWGCF/DataModel/FemtoDerived.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" +#include "ReconstructionDataFormats/Track.h" +#include "TMath.h" +#include "Math/Vector4D.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::analysis::femtoDream; + +namespace o2::aod +{ + +using FemtoFullCollision = soa::Join::iterator; +using FemtoFullCollision_noCent = soa::Join::iterator; +using FemtoFullCollision_CentPbPb = soa::Join::iterator; +using FemtoFullCollisionMC = soa::Join::iterator; +using FemtoFullCollision_noCent_MC = soa::Join::iterator; +using FemtoFullCollisionMC_CentPbPb = soa::Join::iterator; +using FemtoFullMCgenCollisions = soa::Join; +using FemtoFullMCgenCollision = FemtoFullMCgenCollisions::iterator; + +using FemtoFullTracks = + soa::Join; +} // namespace o2::aod + +namespace softwareTriggers +{ +static const int nTriggers = 6; +static const std::vector triggerNames{"fPPP", "fPPL", "fPLL", "fLLL", "fPD", "fLD"}; +static const float triggerSwitches[1][nTriggers]{ + {0, 0, 0, 0, 0, 0}}; +} // namespace softwareTriggers + +template +int getRowDaughters(int daughID, T const& vecID) +{ + int rowInPrimaryTrackTableDaugh = -1; + for (size_t i = 0; i < vecID.size(); i++) { + if (vecID.at(i) == daughID) { + rowInPrimaryTrackTableDaugh = i; + break; + } + } + return rowInPrimaryTrackTableDaugh; +} + +struct femtoDreamProducerTaskWithCascades { + + Zorro zorro; + + Produces outputCollision; + Produces outputMCCollision; + Produces outputCollsMCLabels; + Produces outputParts; + Produces outputPartsMC; + Produces outputDebugParts; + Produces outputPartsMCLabels; + Produces outputDebugPartsMC; + Produces outputPartsExtMCLabels; + + Configurable ConfIsDebug{"ConfIsDebug", true, "Enable Debug tables"}; + Configurable ConfUseItsPid{"ConfUseItsPid", false, "Enable Debug tables"}; + Configurable ConfIsRun3{"ConfIsRun3", false, "Running on Run3 or pilot"}; + Configurable ConfIsForceGRP{"ConfIsForceGRP", false, "Set true if the magnetic field configuration is not available in the usual CCDB directory (e.g. for Run 2 converted data or unanchorad Monte Carlo)"}; + /// Event cuts + FemtoDreamCollisionSelection colCuts; + // Event cuts - Triggers + Configurable ConfEnableTriggerSelection{"ConfEnableTriggerSelection", false, "Should the trigger selection be enabled for collisions?"}; + Configurable> ConfTriggerSwitches{ + "ConfTriggerSwitches", + {softwareTriggers::triggerSwitches[0], 1, softwareTriggers::nTriggers, std::vector{"Switch"}, softwareTriggers::triggerNames}, + "Turn on which trigger should be checked for recorded events to pass selection"}; + Configurable ConfBaseCCDBPathForTriggers{"ConfBaseCCDBPathForTriggers", "Users/m/mpuccio/EventFiltering/OTS/Chunked/", "Provide ccdb path for trigger table; default - trigger coordination"}; + + // Event cuts - usual selection criteria + Configurable ConfEvtZvtx{"ConfEvtZvtx", 10.f, "Evt sel: Max. z-Vertex (cm)"}; + Configurable ConfEvtTriggerCheck{"ConfEvtTriggerCheck", true, "Evt sel: check for trigger"}; + Configurable ConfEvtTriggerSel{"ConfEvtTriggerSel", kINT7, "Evt sel: trigger"}; + Configurable ConfEvtOfflineCheck{"ConfEvtOfflineCheck", false, "Evt sel: check for offline selection"}; + Configurable ConfEvtAddOfflineCheck{"ConfEvtAddOfflineCheck", false, "Evt sel: additional checks for offline selection (not part of sel8 yet)"}; + Configurable ConfIsActivateV0{"ConfIsActivateV0", true, "Activate filling of V0 into femtodream tables"}; + Configurable ConfIsActivateReso{"ConfIsActivateReso", false, "Activate filling of sl Resonances into femtodream tables"}; + Configurable ConfIsActivateCascade{"ConfIsActivateCascade", false, "Activate filling of Cascades into femtodream tables"}; + + Configurable ConfTrkRejectNotPropagated{"ConfTrkRejectNotPropagated", false, "True: reject not propagated tracks"}; + // Configurable ConfRejectITSHitandTOFMissing{ "ConfRejectITSHitandTOFMissing", false, "True: reject if neither ITS hit nor TOF timing satisfied"}; + Configurable ConfTrkPDGCode{"ConfTrkPDGCode", 2212, "PDG code of the selected track for Monte Carlo truth"}; + FemtoDreamTrackSelection trackCuts; + Configurable> ConfTrkCharge{FemtoDreamTrackSelection::getSelectionName(femtoDreamTrackSelection::kSign, "ConfTrk"), std::vector{-1, 1}, FemtoDreamTrackSelection::getSelectionHelper(femtoDreamTrackSelection::kSign, "Track selection: ")}; + Configurable> ConfTrkPtmin{FemtoDreamTrackSelection::getSelectionName(femtoDreamTrackSelection::kpTMin, "ConfTrk"), std::vector{0.5f, 0.4f, 0.6f}, FemtoDreamTrackSelection::getSelectionHelper(femtoDreamTrackSelection::kpTMin, "Track selection: ")}; + Configurable> ConfTrkPtmax{FemtoDreamTrackSelection::getSelectionName(femtoDreamTrackSelection::kpTMax, "ConfTrk"), std::vector{5.4f, 5.6f, 5.5f}, FemtoDreamTrackSelection::getSelectionHelper(femtoDreamTrackSelection::kpTMax, "Track selection: ")}; + Configurable> ConfTrkEta{FemtoDreamTrackSelection::getSelectionName(femtoDreamTrackSelection::kEtaMax, "ConfTrk"), std::vector{0.8f, 0.7f, 0.9f}, FemtoDreamTrackSelection::getSelectionHelper(femtoDreamTrackSelection::kEtaMax, "Track selection: ")}; + Configurable> ConfTrkTPCnclsMin{FemtoDreamTrackSelection::getSelectionName(femtoDreamTrackSelection::kTPCnClsMin, "ConfTrk"), std::vector{80.f, 70.f, 60.f}, FemtoDreamTrackSelection::getSelectionHelper(femtoDreamTrackSelection::kTPCnClsMin, "Track selection: ")}; + Configurable> ConfTrkTPCfCls{FemtoDreamTrackSelection::getSelectionName(femtoDreamTrackSelection::kTPCfClsMin, "ConfTrk"), std::vector{0.7f, 0.83f, 0.9f}, FemtoDreamTrackSelection::getSelectionHelper(femtoDreamTrackSelection::kTPCfClsMin, "Track selection: ")}; + Configurable> ConfTrkTPCcRowsMin{FemtoDreamTrackSelection::getSelectionName(femtoDreamTrackSelection::kTPCcRowsMin, "ConfTrk"), std::vector{70.f, 60.f, 80.f}, FemtoDreamTrackSelection::getSelectionHelper(femtoDreamTrackSelection::kTPCcRowsMin, "Track selection: ")}; + Configurable> ConfTrkTPCsCls{FemtoDreamTrackSelection::getSelectionName(femtoDreamTrackSelection::kTPCsClsMax, "ConfTrk"), std::vector{0.1f, 160.f}, FemtoDreamTrackSelection::getSelectionHelper(femtoDreamTrackSelection::kTPCsClsMax, "Track selection: ")}; + Configurable> ConfTrkITSnclsMin{FemtoDreamTrackSelection::getSelectionName(femtoDreamTrackSelection::kITSnClsMin, "ConfTrk"), std::vector{-1.f, 2.f, 4.f}, FemtoDreamTrackSelection::getSelectionHelper(femtoDreamTrackSelection::kITSnClsMin, "Track selection: ")}; + Configurable> ConfTrkITSnclsIbMin{FemtoDreamTrackSelection::getSelectionName(femtoDreamTrackSelection::kITSnClsIbMin, "ConfTrk"), std::vector{-1.f, 1.f}, FemtoDreamTrackSelection::getSelectionHelper(femtoDreamTrackSelection::kITSnClsIbMin, "Track selection: ")}; + Configurable> ConfTrkDCAxyMax{FemtoDreamTrackSelection::getSelectionName(femtoDreamTrackSelection::kDCAxyMax, "ConfTrk"), std::vector{0.1f, 3.5f}, FemtoDreamTrackSelection::getSelectionHelper(femtoDreamTrackSelection::kDCAxyMax, "Track selection: ")}; + Configurable> ConfTrkDCAzMax{FemtoDreamTrackSelection::getSelectionName(femtoDreamTrackSelection::kDCAzMax, "ConfTrk"), std::vector{0.2f, 3.5f}, FemtoDreamTrackSelection::getSelectionHelper(femtoDreamTrackSelection::kDCAzMax, "Track selection: ")}; + Configurable> ConfTrkPIDnSigmaMax{FemtoDreamTrackSelection::getSelectionName(femtoDreamTrackSelection::kPIDnSigmaMax, "ConfTrk"), std::vector{3.5f, 3.f, 2.5f}, FemtoDreamTrackSelection::getSelectionHelper(femtoDreamTrackSelection::kPIDnSigmaMax, "Track selection: ")}; + Configurable ConfTrkPIDnSigmaOffsetTPC{"ConfTrkPIDnSigmaOffsetTPC", 0., "Offset for TPC nSigma because of bad calibration"}; + Configurable ConfTrkPIDnSigmaOffsetTOF{"ConfTrkPIDnSigmaOffsetTOF", 0., "Offset for TOF nSigma because of bad calibration"}; + Configurable> ConfTrkPIDspecies{"ConfTrkPIDspecies", std::vector{o2::track::PID::Pion, o2::track::PID::Kaon, o2::track::PID::Proton, o2::track::PID::Deuteron}, "Trk sel: Particles species for PID"}; + + FemtoDreamV0Selection v0Cuts; + Configurable> ConfV0Sign{FemtoDreamV0Selection::getSelectionName(femtoDreamV0Selection::kV0Sign, "ConfV0"), std::vector{-1, 1}, FemtoDreamV0Selection::getSelectionHelper(femtoDreamV0Selection::kV0Sign, "V0 selection: ")}; + Configurable> ConfV0PtMin{FemtoDreamV0Selection::getSelectionName(femtoDreamV0Selection::kV0pTMin, "ConfV0"), std::vector{0.3f, 0.4f, 0.5f}, FemtoDreamV0Selection::getSelectionHelper(femtoDreamV0Selection::kV0pTMin, "V0 selection: ")}; + Configurable> ConfV0PtMax{FemtoDreamV0Selection::getSelectionName(femtoDreamV0Selection::kV0pTMax, "ConfV0"), std::vector{3.3f, 3.4f, 3.5f}, FemtoDreamV0Selection::getSelectionHelper(femtoDreamV0Selection::kV0pTMax, "V0 selection: ")}; + Configurable> ConfV0EtaMax{FemtoDreamV0Selection::getSelectionName(femtoDreamV0Selection::kV0etaMax, "ConfV0"), std::vector{0.8f, 0.7f, 0.9f}, FemtoDreamV0Selection::getSelectionHelper(femtoDreamV0Selection::kV0etaMax, "V0 selection: ")}; + Configurable> ConfV0DCADaughMax{FemtoDreamV0Selection::getSelectionName(femtoDreamV0Selection::kV0DCADaughMax, "ConfV0"), std::vector{1.2f, 1.5f}, FemtoDreamV0Selection::getSelectionHelper(femtoDreamV0Selection::kV0DCADaughMax, "V0 selection: ")}; + Configurable> ConfV0CPAMin{FemtoDreamV0Selection::getSelectionName(femtoDreamV0Selection::kV0CPAMin, "ConfV0"), std::vector{0.99f, 0.995f}, FemtoDreamV0Selection::getSelectionHelper(femtoDreamV0Selection::kV0CPAMin, "V0 selection: ")}; + Configurable> ConfV0TranRadMin{FemtoDreamV0Selection::getSelectionName(femtoDreamV0Selection::kV0TranRadMin, "ConfV0"), std::vector{0.2f}, FemtoDreamV0Selection::getSelectionHelper(femtoDreamV0Selection::kV0TranRadMin, "V0 selection: ")}; + Configurable> ConfV0TranRadMax{FemtoDreamV0Selection::getSelectionName(femtoDreamV0Selection::kV0TranRadMax, "ConfV0"), std::vector{100.f}, FemtoDreamV0Selection::getSelectionHelper(femtoDreamV0Selection::kV0TranRadMax, "V0 selection: ")}; + Configurable> ConfV0DecVtxMax{FemtoDreamV0Selection::getSelectionName(femtoDreamV0Selection::kV0DecVtxMax, "ConfV0"), std::vector{100.f}, FemtoDreamV0Selection::getSelectionHelper(femtoDreamV0Selection::kV0DecVtxMax, "V0 selection: ")}; + + Configurable ConfV0InvMassLowLimit{"ConfV0InvV0MassLowLimit", 1.05, "Lower limit of the V0 invariant mass"}; + Configurable ConfV0InvMassUpLimit{"ConfV0InvV0MassUpLimit", 1.30, "Upper limit of the V0 invariant mass"}; + Configurable ConfV0RejectKaons{"ConfV0RejectKaons", false, "Switch to reject kaons"}; + Configurable ConfV0InvKaonMassLowLimit{"ConfV0InvKaonMassLowLimit", 0.48, "Lower limit of the V0 invariant mass for Kaon rejection"}; + Configurable ConfV0InvKaonMassUpLimit{"ConfV0InvKaonMassUpLimit", 0.515, "Upper limit of the V0 invariant mass for Kaon rejection"}; + + Configurable> ConfChildCharge{"ConfChildSign", std::vector{-1, 1}, "V0 Child sel: Charge"}; + Configurable> ConfChildEtaMax{"ConfChildEtaMax", std::vector{0.8f}, "V0 Child sel: max eta"}; + Configurable> ConfChildTPCnClsMin{"ConfChildTPCnClsMin", std::vector{80.f, 70.f, 60.f}, "V0 Child sel: Min. nCls TPC"}; + Configurable> ConfChildDCAMin{"ConfChildDCAMin", std::vector{0.05f, 0.06f}, "V0 Child sel: Max. DCA Daugh to PV (cm)"}; + Configurable> ConfChildPIDnSigmaMax{"ConfChildPIDnSigmaMax", std::vector{5.f, 4.f}, "V0 Child sel: Max. PID nSigma TPC"}; + Configurable> ConfChildPIDspecies{"ConfChildPIDspecies", std::vector{o2::track::PID::Pion, o2::track::PID::Proton}, "V0 Child sel: Particles species for PID"}; + + FemtoDreamCascadeSelection cascadeCuts; + struct : o2::framework::ConfigurableGroup { + Configurable ConfCascInvMassLowLimit{"ConfCascInvMassLowLimit", 1.2, "Lower limit of the Cascade invariant mass"}; + Configurable ConfCascInvMassUpLimit{"ConfCascInvMassUpLimit", 1.5, "Upper limit of the Cascade invariant mass"}; + Configurable ConfCascIsSelectedOmega{"ConfCascIsSelectedOmega", false, "Select Omegas instead of Xis (invariant mass)"}; + // Cascade + Configurable> ConfCascadeSign{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeSign, "ConfCascade"), std::vector{-1, 1}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeSign, "Cascade selection: ")}; + Configurable> ConfCascadePtMin{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadePtMin, "ConfCascade"), std::vector{0.3f, 0.4f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadePtMin, "Cascade selection: ")}; + Configurable> ConfCascadePtMax{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadePtMax, "ConfCascade"), std::vector{5.5f, 6.0f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadePtMax, "Cascade selection: ")}; + Configurable> ConfCascadeEtaMax{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeEtaMax, "ConfCascade"), std::vector{0.8f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeEtaMax, "Cascade selection: ")}; + Configurable> ConfCascadeDCADaughMax{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeDCADaughMax, "ConfCascade"), std::vector{1.f, 1.2f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeDCADaughMax, "Cascade selection: ")}; + Configurable> ConfCascadeCPAMin{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeCPAMin, "ConfCascade"), std::vector{0.99f, 0.95f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeCPAMin, "Cascade selection: ")}; + Configurable> ConfCascadeTranRadMin{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeTranRadMin, "ConfCascade"), std::vector{0.2f, 0.5f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeTranRadMin, "Cascade selection: ")}; + Configurable> ConfCascadeTranRadMax{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeTranRadMax, "ConfCascade"), std::vector{100.f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeTranRadMax, "Cascade selection: ")}; + Configurable> ConfCascadeDecVtxMax{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeDecVtxMax, "ConfCascade"), std::vector{100.f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeDecVtxMax, "Cascade selection: ")}; + + // Cascade v0 daughters + Configurable> ConfCascadeV0DCADaughMax{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeV0DCADaughMax, "ConfCascade"), std::vector{1.2f, 1.5f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeV0DCADaughMax, "CascV0 selection: ")}; + Configurable> ConfCascadeV0CPAMin{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeV0CPAMin, "ConfCascade"), std::vector{0.99f, 0.995f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeV0CPAMin, "CascV0 selection: ")}; + Configurable> ConfCascadeV0TranRadMin{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeV0TranRadMin, "ConfCascade"), std::vector{0.2f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeV0TranRadMin, "CascV0 selection: ")}; + Configurable> ConfCascadeV0TranRadMax{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeV0TranRadMax, "ConfCascade"), std::vector{100.f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeV0TranRadMax, "CascV0 selection: ")}; + Configurable> ConfCascadeV0DCAtoPVMin{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeV0DCAtoPVMin, "ConfCascade"), std::vector{100.f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeV0DCAtoPVMin, "CascV0 selection: ")}; + Configurable> ConfCascadeV0DCAtoPVMax{FemtoDreamCascadeSelection::getSelectionName(femtoDreamCascadeSelection::kCascadeV0DCAtoPVMax, "ConfCascade"), std::vector{100.f}, FemtoDreamCascadeSelection::getSelectionHelper(femtoDreamCascadeSelection::kCascadeV0DCAtoPVMax, "CascV0 selection: ")}; + Configurable ConfCascV0InvMassLowLimit{"ConfCascV0InvMassLowLimit", 1.011461, "Lower limit of the Cascade invariant mass"}; + Configurable ConfCascV0InvMassUpLimit{"ConfCascV0InvMassUpLimit", 1.027461, "Upper limit of the Cascade invariant mass"}; + // Cascade Daughter Tracks + Configurable> ConfCascV0ChildCharge{"ConfCascV0ChildSign", std::vector{-1, 1}, "CascV0 Child sel: Charge"}; + Configurable> ConfCascV0ChildPtMin{"ConfCascV0ChildPtMin", std::vector{0.8f}, "CascV0 Child sel: min pt"}; + Configurable> ConfCascV0ChildEtaMax{"ConfCascV0ChildEtaMax", std::vector{0.8f}, "CascV0 Child sel: max eta"}; + Configurable> ConfCascV0ChildTPCnClsMin{"ConfCascV0ChildTPCnClsMin", std::vector{80.f, 70.f, 60.f}, "CascV0 Child sel: Min. nCls TPC"}; + Configurable> ConfCascV0ChildDCAMin{"ConfCascV0ChildDCAMin", std::vector{0.05f, 0.06f}, "CascV0 Child sel: Max. DCA Daugh to PV (cm)"}; + Configurable> ConfCascV0ChildPIDnSigmaMax{"ConfCascV0ChildPIDnSigmaMax", std::vector{5.f, 4.f}, "CascV0 Child sel: Max. PID nSigma TPC"}; + Configurable> ConfCascV0ChildPIDspecies{"ConfCascV0ChildPIDspecies", std::vector{o2::track::PID::Pion, o2::track::PID::Proton}, "CascV0 Child sel: Particles species for PID"}; + // Cascade Bachelor Track + Configurable> ConfCascBachelorCharge{"ConfCascBachelorSign", std::vector{-1, 1}, "Cascade Bachelor sel: Charge"}; + Configurable> ConfCascBachelorPtMin{"ConfCascBachelorPtMin", std::vector{0.8f}, "Cascade Bachelor sel: min pt"}; + Configurable> ConfCascBachelorEtaMax{"ConfCascBachelorEtaMax", std::vector{0.8f}, "Cascade Bachelor sel: max eta"}; + Configurable> ConfCascBachelorTPCnClsMin{"ConfCascBachelorTPCnClsMin", std::vector{80.f, 70.f, 60.f}, "Cascade Bachelor sel: Min. nCls TPC"}; + Configurable> ConfCascBachelorDCAMin{"ConfCascBachelorDCAMin", std::vector{0.05f, 0.06f}, "Cascade Bachelor sel: Max. DCA Daugh to PV (cm)"}; + Configurable> ConfCascBachelorPIDnSigmaMax{"ConfCascBachelorPIDnSigmaMax", std::vector{5.f, 4.f}, "Cascade Bachelor sel: Max. PID nSigma TPC"}; + Configurable> ConfCascBachelorPIDspecies{"ConfCascBachelorPIDspecies", std::vector{o2::track::PID::Pion}, "Cascade Bachelor sel: Particles species for PID"}; + + Configurable ConfCascRejectCompetingMass{"ConfCascRejectCompetingMass", false, "Switch on to reject Omegas (for Xi) or Xis (for Omegas)"}; + Configurable ConfCascInvCompetingMassLowLimit{"ConfCascInvCompetingMassLowLimit", 1.66, "Lower limit of the cascade invariant mass for competing mass rejection"}; + Configurable ConfCascInvCompetingMassUpLimit{"ConfCascInvCompetingMassUpLimit", 1.68, "Upper limit of the cascade invariant mass for competing mass rejection"}; + + } ConfCascSel; + + // Resonances + Configurable ConfResoInvMassLowLimit{"ConfResoInvMassLowLimit", 1.011461, "Lower limit of the Reso invariant mass"}; + Configurable ConfResoInvMassUpLimit{"ConfResoInvMassUpLimit", 1.027461, "Upper limit of the Reso invariant mass"}; + Configurable> ConfDaughterCharge{"ConfDaughterCharge", std::vector{1, -1}, "Reso Daughter sel: Charge"}; + Configurable> ConfDaughterEta{"ConfDaughterEta", std::vector{0.8, 0.8}, "Reso Daughter sel: Eta"}; // 0.8 + Configurable> ConfDaughterDCAxy{"ConfDaughterDCAxy", std::vector{0.1, 0.1}, "Reso Daughter sel: DCAxy"}; // 0.1 + Configurable> ConfDaughterDCAz{"ConfDaughterDCAz", std::vector{0.2, 0.2}, "Reso Daughter sel: DCAz"}; // 0.2 + Configurable> ConfDaughterNClus{"ConfDaughterNClus", std::vector{80, 80}, "Reso Daughter sel: NClusters"}; // 0.2 + Configurable> ConfDaughterNCrossed{"ConfDaughterNCrossed", std::vector{70, 70}, "Reso Daughter sel: NCrossedRowss"}; + Configurable> ConfDaughterTPCfCls{"ConfDaughterTPCfCls", std::vector{0.8, 0.8}, "Reso Daughter sel: Minimum fraction of crossed rows over findable cluster"}; // 0.2 + Configurable> ConfDaughterPtUp{"ConfDaughterPtUp", std::vector{2.0, 2.0}, "Reso Daughter sel: Upper limit pT"}; // 2.0 + Configurable> ConfDaughterPtLow{"ConfDaughterPtLow", std::vector{0.15, 0.15}, "Reso Daughter sel: Lower limit pT"}; // 0.15 + Configurable> ConfDaughterPTPCThr{"ConfDaughterPTPCThr", std::vector{0.40, 0.40}, "Reso Daughter sel: momentum threshold TPC only PID, p_TPC,Thr"}; // 0.4 + Configurable> ConfDaughterPIDnSigmaMax{"ConfDaughterPIDnSigmaMax", std::vector{3.00, 3.00}, "Reso Daughter sel: Max. PID nSigma TPC"}; // 3.0 + Configurable> ConfDaughterPIDspecies{"ConfDaughterPIDspecies", std::vector{o2::track::PID::Kaon, o2::track::PID::Kaon}, "Reso Daughter sel: Particles species for PID"}; + Configurable> ConfDaug1Daugh2ResoMass{"ConfDaug1Daugh2ResoMass", std::vector{o2::constants::physics::MassKPlus, o2::constants::physics::MassKMinus, o2::constants::physics::MassPhi}, "Masses: Daughter1 - Daughter2 - Resonance"}; + + /// \todo should we add filter on min value pT/eta of V0 and daughters? + /*Filter v0Filter = (nabs(aod::v0data::x) < V0DecVtxMax.value) && + (nabs(aod::v0data::y) < V0DecVtxMax.value) && + (nabs(aod::v0data::z) < V0DecVtxMax.value);*/ + // (aod::v0data::v0radius > V0TranRadV0Min.value); to be added, not working + // for now do not know why + + /// General options + struct : o2::framework::ConfigurableGroup { + Configurable ConfTrkMinChi2PerClusterTPC{"ConfTrkMinChi2PerClusterTPC", 0.f, "Lower limit for chi2 of TPC; currently for testing only"}; + Configurable ConfTrkMaxChi2PerClusterTPC{"ConfTrkMaxChi2PerClusterTPC", 1000.f, "Upper limit for chi2 of TPC; currently for testing only"}; + Configurable ConfTrkMaxChi2PerClusterITS{"ConfTrkMaxChi2PerClusterITS", 1000.0f, "Minimal track selection: max allowed chi2 per ITS cluster"}; // 36.0 is default + Configurable ConfTrkTPCRefit{"ConfTrkTPCRefit", false, "True: require TPC refit"}; + Configurable ConfTrkITSRefit{"ConfTrkITSRefit", false, "True: require ITS refit"}; + + } OptionTrackSpecialSelections; + + HistogramRegistry qaRegistry{"QAHistos", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry TrackRegistry{"Tracks", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry V0Registry{"V0", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry ResoRegistry{"Reso", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry CascadeRegistry{"Cascade", {}, OutputObjHandlingPolicy::AnalysisObject}; + + int mRunNumber; + float mMagField; + std::string zorroTriggerNames = ""; + Service ccdb; /// Accessing the CCDB + + void init(InitContext&) + { + if (doprocessData == false && doprocessData_noCentrality == false && doprocessData_CentPbPb == false && doprocessMC == false && doprocessMC_noCentrality == false && doprocessMC_CentPbPb == false) { + LOGF(fatal, "Neither processData nor processMC enabled. Please choose one."); + } + if ((doprocessData == true && doprocessMC == true) || (doprocessData == true && doprocessMC_noCentrality == true) || (doprocessMC == true && doprocessMC_noCentrality == true) || (doprocessData_noCentrality == true && doprocessData == true) || (doprocessData_noCentrality == true && doprocessMC == true) || (doprocessData_noCentrality == true && doprocessMC_noCentrality == true) || (doprocessData_CentPbPb == true && doprocessData == true) || (doprocessData_CentPbPb == true && doprocessData_noCentrality == true) || (doprocessData_CentPbPb == true && doprocessMC == true) || (doprocessData_CentPbPb == true && doprocessMC_noCentrality == true) || (doprocessData_CentPbPb == true && doprocessMC_CentPbPb == true)) { + LOGF(fatal, + "Cannot enable more than one process switch at the same time. " + "Please choose one."); + } + + int CutBits = 8 * sizeof(o2::aod::femtodreamparticle::cutContainerType); + TrackRegistry.add("AnalysisQA/CutCounter", "; Bit; Counter", kTH1F, {{CutBits + 1, -0.5, CutBits + 0.5}}); + TrackRegistry.add("AnalysisQA/Chi2ITSTPCperCluster", "; ITS_Chi2; TPC_Chi2", kTH2F, {{100, 0, 50}, {100, 0, 20}}); + TrackRegistry.add("AnalysisQA/RefitITSTPC", "; ITS_Refit; TPC_Refit", kTH2F, {{2, 0, 2}, {2, 0, 2}}); + TrackRegistry.add("AnalysisQA/getGenStatusCode", "; Bit; Entries", kTH1F, {{200, 0, 200}}); + TrackRegistry.add("AnalysisQA/getProcess", "; Bit; Entries", kTH1F, {{200, 0, 200}}); + TrackRegistry.add("AnalysisQA/Mother", "; Bit; Entries", kTH1F, {{4000, -4000, 4000}}); + TrackRegistry.add("AnalysisQA/Particle", "; Bit; Entries", kTH1F, {{4000, -4000, 4000}}); + V0Registry.add("AnalysisQA/CutCounter", "; Bit; Counter", kTH1F, {{CutBits + 1, -0.5, CutBits + 0.5}}); + CascadeRegistry.add("AnalysisQA/CutCounter", "; Bit; Counter", kTH1F, {{CutBits + 1, -0.5, CutBits + 0.5}}); + ResoRegistry.add("AnalysisQA/Reso/InvMass", "Invariant mass V0s;M_{KK};Entries", HistType::kTH1F, {{7000, 0.8, 1.5}}); + ResoRegistry.add("AnalysisQA/Reso/InvMass_selected", "Invariant mass V0s;M_{KK};Entries", HistType::kTH1F, {{7000, 0.8, 1.5}}); + ResoRegistry.add("AnalysisQA/Reso/Daughter1/Pt", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{1000, 0, 10}}); + ResoRegistry.add("AnalysisQA/Reso/Daughter1/Eta", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{1000, -2, 2}}); + ResoRegistry.add("AnalysisQA/Reso/Daughter1/Phi", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + ResoRegistry.add("AnalysisQA/Reso/Daughter2/Pt", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{1000, 0, 10}}); + ResoRegistry.add("AnalysisQA/Reso/Daughter2/Eta", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{1000, -2, 2}}); + ResoRegistry.add("AnalysisQA/Reso/Daughter2/Phi", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + ResoRegistry.add("AnalysisQA/Reso/PtD1_selected", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{1000, 0, 10}}); + ResoRegistry.add("AnalysisQA/Reso/PtD2_selected", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{1000, 0, 10}}); + + if (ConfEnableTriggerSelection) { + for (const std::string& triggerName : softwareTriggers::triggerNames) { + if (ConfTriggerSwitches->get("Switch", triggerName.c_str())) { + zorroTriggerNames += triggerName + ","; + } + } + zorroTriggerNames.pop_back(); + } + + colCuts.setCuts(ConfEvtZvtx.value, ConfEvtTriggerCheck.value, ConfEvtTriggerSel.value, ConfEvtOfflineCheck.value, ConfEvtAddOfflineCheck.value, ConfIsRun3.value); + colCuts.init(&qaRegistry); + + trackCuts.setSelection(ConfTrkCharge, femtoDreamTrackSelection::kSign, femtoDreamSelection::kEqual); + trackCuts.setSelection(ConfTrkPtmin, femtoDreamTrackSelection::kpTMin, femtoDreamSelection::kLowerLimit); + trackCuts.setSelection(ConfTrkPtmax, femtoDreamTrackSelection::kpTMax, femtoDreamSelection::kUpperLimit); + trackCuts.setSelection(ConfTrkEta, femtoDreamTrackSelection::kEtaMax, femtoDreamSelection::kAbsUpperLimit); + trackCuts.setSelection(ConfTrkTPCnclsMin, femtoDreamTrackSelection::kTPCnClsMin, femtoDreamSelection::kLowerLimit); + trackCuts.setSelection(ConfTrkTPCfCls, femtoDreamTrackSelection::kTPCfClsMin, femtoDreamSelection::kLowerLimit); + trackCuts.setSelection(ConfTrkTPCcRowsMin, femtoDreamTrackSelection::kTPCcRowsMin, femtoDreamSelection::kLowerLimit); + trackCuts.setSelection(ConfTrkTPCsCls, femtoDreamTrackSelection::kTPCsClsMax, femtoDreamSelection::kUpperLimit); + trackCuts.setSelection(ConfTrkITSnclsMin, femtoDreamTrackSelection::kITSnClsMin, femtoDreamSelection::kLowerLimit); + trackCuts.setSelection(ConfTrkITSnclsIbMin, femtoDreamTrackSelection::kITSnClsIbMin, femtoDreamSelection::kLowerLimit); + trackCuts.setSelection(ConfTrkDCAxyMax, femtoDreamTrackSelection::kDCAxyMax, femtoDreamSelection::kAbsUpperLimit); + trackCuts.setSelection(ConfTrkDCAzMax, femtoDreamTrackSelection::kDCAzMax, femtoDreamSelection::kAbsUpperLimit); + trackCuts.setSelection(ConfTrkPIDnSigmaMax, femtoDreamTrackSelection::kPIDnSigmaMax, femtoDreamSelection::kAbsUpperLimit); + trackCuts.setPIDSpecies(ConfTrkPIDspecies); + trackCuts.setnSigmaPIDOffset(ConfTrkPIDnSigmaOffsetTPC, ConfTrkPIDnSigmaOffsetTOF); + trackCuts.init(&qaRegistry, &TrackRegistry); + + /// \todo fix how to pass array to setSelection, getRow() passing a + /// different type! + // v0Cuts.setSelection(ConfV0Selection->getRow(0), + // femtoDreamV0Selection::kDecVtxMax, femtoDreamSelection::kAbsUpperLimit); + if (ConfIsActivateV0) { + v0Cuts.setSelection(ConfV0Sign, femtoDreamV0Selection::kV0Sign, femtoDreamSelection::kEqual); + v0Cuts.setSelection(ConfV0PtMin, femtoDreamV0Selection::kV0pTMin, femtoDreamSelection::kLowerLimit); + v0Cuts.setSelection(ConfV0PtMax, femtoDreamV0Selection::kV0pTMax, femtoDreamSelection::kUpperLimit); + v0Cuts.setSelection(ConfV0EtaMax, femtoDreamV0Selection::kV0etaMax, femtoDreamSelection::kAbsUpperLimit); + v0Cuts.setSelection(ConfV0DCADaughMax, femtoDreamV0Selection::kV0DCADaughMax, femtoDreamSelection::kUpperLimit); + v0Cuts.setSelection(ConfV0CPAMin, femtoDreamV0Selection::kV0CPAMin, femtoDreamSelection::kLowerLimit); + v0Cuts.setSelection(ConfV0TranRadMin, femtoDreamV0Selection::kV0TranRadMin, femtoDreamSelection::kLowerLimit); + v0Cuts.setSelection(ConfV0TranRadMax, femtoDreamV0Selection::kV0TranRadMax, femtoDreamSelection::kUpperLimit); + v0Cuts.setSelection(ConfV0DecVtxMax, femtoDreamV0Selection::kV0DecVtxMax, femtoDreamSelection::kUpperLimit); + v0Cuts.setChildCuts(femtoDreamV0Selection::kPosTrack, ConfChildCharge, femtoDreamTrackSelection::kSign, femtoDreamSelection::kEqual); + v0Cuts.setChildCuts(femtoDreamV0Selection::kPosTrack, ConfChildEtaMax, femtoDreamTrackSelection::kEtaMax, femtoDreamSelection::kAbsUpperLimit); + v0Cuts.setChildCuts(femtoDreamV0Selection::kPosTrack, ConfChildTPCnClsMin, femtoDreamTrackSelection::kTPCnClsMin, femtoDreamSelection::kLowerLimit); + v0Cuts.setChildCuts(femtoDreamV0Selection::kPosTrack, ConfChildDCAMin, femtoDreamTrackSelection::kDCAMin, femtoDreamSelection::kAbsLowerLimit); + v0Cuts.setChildCuts(femtoDreamV0Selection::kPosTrack, ConfChildPIDnSigmaMax, femtoDreamTrackSelection::kPIDnSigmaMax, femtoDreamSelection::kAbsUpperLimit); + + v0Cuts.setChildCuts(femtoDreamV0Selection::kNegTrack, ConfChildCharge, femtoDreamTrackSelection::kSign, femtoDreamSelection::kEqual); + v0Cuts.setChildCuts(femtoDreamV0Selection::kNegTrack, ConfChildEtaMax, femtoDreamTrackSelection::kEtaMax, femtoDreamSelection::kAbsUpperLimit); + v0Cuts.setChildCuts(femtoDreamV0Selection::kNegTrack, ConfChildTPCnClsMin, femtoDreamTrackSelection::kTPCnClsMin, femtoDreamSelection::kLowerLimit); + v0Cuts.setChildCuts(femtoDreamV0Selection::kNegTrack, ConfChildDCAMin, femtoDreamTrackSelection::kDCAMin, femtoDreamSelection::kAbsLowerLimit); + v0Cuts.setChildCuts(femtoDreamV0Selection::kNegTrack, ConfChildPIDnSigmaMax, femtoDreamTrackSelection::kPIDnSigmaMax, femtoDreamSelection::kAbsUpperLimit); + v0Cuts.setChildPIDSpecies(femtoDreamV0Selection::kPosTrack, ConfChildPIDspecies); + v0Cuts.setChildPIDSpecies(femtoDreamV0Selection::kNegTrack, ConfChildPIDspecies); + v0Cuts.init(&qaRegistry, &V0Registry); + v0Cuts.setInvMassLimits(ConfV0InvMassLowLimit, ConfV0InvMassUpLimit); + + v0Cuts.setChildRejectNotPropagatedTracks(femtoDreamV0Selection::kPosTrack, ConfTrkRejectNotPropagated); + v0Cuts.setChildRejectNotPropagatedTracks(femtoDreamV0Selection::kNegTrack, ConfTrkRejectNotPropagated); + + v0Cuts.setnSigmaPIDOffsetTPC(ConfTrkPIDnSigmaOffsetTPC); + v0Cuts.setChildnSigmaPIDOffset(femtoDreamV0Selection::kPosTrack, ConfTrkPIDnSigmaOffsetTPC, ConfTrkPIDnSigmaOffsetTOF); + v0Cuts.setChildnSigmaPIDOffset(femtoDreamV0Selection::kNegTrack, ConfTrkPIDnSigmaOffsetTPC, ConfTrkPIDnSigmaOffsetTOF); + + if (ConfV0RejectKaons) { + v0Cuts.setKaonInvMassLimits(ConfV0InvKaonMassLowLimit, ConfV0InvKaonMassUpLimit); + } + } + if (ConfIsActivateCascade) { + // Cascades + cascadeCuts.setSelection(ConfCascSel.ConfCascadeSign, femtoDreamCascadeSelection::kCascadeSign, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadeSign)); + cascadeCuts.setSelection(ConfCascSel.ConfCascadePtMin, femtoDreamCascadeSelection::kCascadePtMin, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadePtMin)); + cascadeCuts.setSelection(ConfCascSel.ConfCascadePtMax, femtoDreamCascadeSelection::kCascadePtMax, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadePtMax)); + cascadeCuts.setSelection(ConfCascSel.ConfCascadeEtaMax, femtoDreamCascadeSelection::kCascadeEtaMax, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadeEtaMax)); + cascadeCuts.setSelection(ConfCascSel.ConfCascadeDCADaughMax, femtoDreamCascadeSelection::kCascadeDCADaughMax, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadeDCADaughMax)); + cascadeCuts.setSelection(ConfCascSel.ConfCascadeCPAMin, femtoDreamCascadeSelection::kCascadeCPAMin, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadeCPAMin)); + cascadeCuts.setSelection(ConfCascSel.ConfCascadeTranRadMin, femtoDreamCascadeSelection::kCascadeTranRadMin, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadeTranRadMin)); + cascadeCuts.setSelection(ConfCascSel.ConfCascadeTranRadMax, femtoDreamCascadeSelection::kCascadeTranRadMax, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadeTranRadMax)); + cascadeCuts.setSelection(ConfCascSel.ConfCascadeDecVtxMax, femtoDreamCascadeSelection::kCascadeDecVtxMax, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadeDecVtxMax)); + // Cascade v0 + cascadeCuts.setSelection(ConfCascSel.ConfCascadeV0DCADaughMax, femtoDreamCascadeSelection::kCascadeV0DCADaughMax, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadeV0DCADaughMax)); + cascadeCuts.setSelection(ConfCascSel.ConfCascadeV0CPAMin, femtoDreamCascadeSelection::kCascadeV0CPAMin, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadeV0CPAMin)); + cascadeCuts.setSelection(ConfCascSel.ConfCascadeV0TranRadMin, femtoDreamCascadeSelection::kCascadeV0TranRadMin, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadeV0TranRadMin)); + cascadeCuts.setSelection(ConfCascSel.ConfCascadeV0TranRadMax, femtoDreamCascadeSelection::kCascadeV0TranRadMax, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadeV0TranRadMax)); + cascadeCuts.setSelection(ConfCascSel.ConfCascadeV0DCAtoPVMin, femtoDreamCascadeSelection::kCascadeV0DCAtoPVMin, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadeV0DCAtoPVMin)); + cascadeCuts.setSelection(ConfCascSel.ConfCascadeV0DCAtoPVMax, femtoDreamCascadeSelection::kCascadeV0DCAtoPVMax, FemtoDreamCascadeSelection::getSelectionType(femtoDreamCascadeSelection::kCascadeV0DCAtoPVMax)); + + // Cascade Daughter Tracks + cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kPosTrack, ConfCascSel.ConfCascV0ChildCharge, femtoDreamTrackSelection::kSign, femtoDreamSelection::kEqual); + cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kPosTrack, ConfCascSel.ConfCascV0ChildPtMin, femtoDreamTrackSelection::kpTMin, femtoDreamSelection::kLowerLimit); + cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kPosTrack, ConfCascSel.ConfCascV0ChildEtaMax, femtoDreamTrackSelection::kEtaMax, femtoDreamSelection::kAbsUpperLimit); + cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kPosTrack, ConfCascSel.ConfCascV0ChildTPCnClsMin, femtoDreamTrackSelection::kTPCnClsMin, femtoDreamSelection::kLowerLimit); + cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kPosTrack, ConfCascSel.ConfCascV0ChildDCAMin, femtoDreamTrackSelection::kDCAMin, femtoDreamSelection::kAbsLowerLimit); + cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kPosTrack, ConfCascSel.ConfCascV0ChildPIDnSigmaMax, femtoDreamTrackSelection::kPIDnSigmaMax, femtoDreamSelection::kAbsUpperLimit); + cascadeCuts.setChildPIDSpecies(femtoDreamCascadeSelection::kPosTrack, ConfCascSel.ConfCascV0ChildPIDspecies); + + cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kNegTrack, ConfCascSel.ConfCascV0ChildCharge, femtoDreamTrackSelection::kSign, femtoDreamSelection::kEqual); + cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kNegTrack, ConfCascSel.ConfCascV0ChildPtMin, femtoDreamTrackSelection::kpTMin, femtoDreamSelection::kLowerLimit); + cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kNegTrack, ConfCascSel.ConfCascV0ChildEtaMax, femtoDreamTrackSelection::kEtaMax, femtoDreamSelection::kAbsUpperLimit); + cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kNegTrack, ConfCascSel.ConfCascV0ChildTPCnClsMin, femtoDreamTrackSelection::kTPCnClsMin, femtoDreamSelection::kLowerLimit); + cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kNegTrack, ConfCascSel.ConfCascV0ChildDCAMin, femtoDreamTrackSelection::kDCAMin, femtoDreamSelection::kAbsLowerLimit); + cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kNegTrack, ConfCascSel.ConfCascV0ChildPIDnSigmaMax, femtoDreamTrackSelection::kPIDnSigmaMax, femtoDreamSelection::kAbsUpperLimit); + cascadeCuts.setChildPIDSpecies(femtoDreamCascadeSelection::kNegTrack, ConfCascSel.ConfCascV0ChildPIDspecies); + + // Cascade Bachelor Track + cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kBachTrack, ConfCascSel.ConfCascBachelorCharge, femtoDreamTrackSelection::kSign, femtoDreamSelection::kEqual); + cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kBachTrack, ConfCascSel.ConfCascBachelorPtMin, femtoDreamTrackSelection::kpTMin, femtoDreamSelection::kLowerLimit); + cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kBachTrack, ConfCascSel.ConfCascBachelorEtaMax, femtoDreamTrackSelection::kEtaMax, femtoDreamSelection::kAbsUpperLimit); + cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kBachTrack, ConfCascSel.ConfCascBachelorTPCnClsMin, femtoDreamTrackSelection::kTPCnClsMin, femtoDreamSelection::kLowerLimit); + cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kBachTrack, ConfCascSel.ConfCascBachelorDCAMin, femtoDreamTrackSelection::kDCAMin, femtoDreamSelection::kAbsLowerLimit); + cascadeCuts.setChildCuts(femtoDreamCascadeSelection::kBachTrack, ConfCascSel.ConfCascBachelorPIDnSigmaMax, femtoDreamTrackSelection::kPIDnSigmaMax, femtoDreamSelection::kAbsUpperLimit); + cascadeCuts.setChildPIDSpecies(femtoDreamCascadeSelection::kBachTrack, ConfCascSel.ConfCascBachelorPIDspecies); + + cascadeCuts.init(&qaRegistry, &CascadeRegistry, ConfCascSel.ConfCascIsSelectedOmega); + cascadeCuts.setInvMassLimits(ConfCascSel.ConfCascInvMassLowLimit, ConfCascSel.ConfCascInvMassUpLimit); + cascadeCuts.setV0InvMassLimits(ConfCascSel.ConfCascV0InvMassLowLimit, ConfCascSel.ConfCascV0InvMassUpLimit); + if (ConfCascSel.ConfCascRejectCompetingMass) { + cascadeCuts.setCompetingInvMassLimits(ConfCascSel.ConfCascInvCompetingMassLowLimit, ConfCascSel.ConfCascInvCompetingMassUpLimit); + } + } + + mRunNumber = 0; + mMagField = 0.0; + /// Initializing CCDB + ccdb->setURL("http://alice-ccdb.cern.ch"); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + + int64_t now = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); + ccdb->setCreatedNotAfter(now); + } + + /// Function to retrieve the nominal magnetic field in kG (0.1T) and convert it directly to T + void initCCDB_Mag_Trig(aod::BCsWithTimestamps::iterator bc) + { + // TODO done only once (and not per run). Will be replaced by CCDBConfigurable + // get magnetic field for run + if (mRunNumber == bc.runNumber()) + return; + auto timestamp = bc.timestamp(); + float output = -999; + + if (ConfIsRun3 && !ConfIsForceGRP) { + static o2::parameters::GRPMagField* grpo = nullptr; + grpo = ccdb->getForTimeStamp("GLO/Config/GRPMagField", timestamp); + if (grpo == nullptr) { + LOGF(fatal, "GRP object not found for timestamp %llu", timestamp); + return; + } + LOGF(info, "Retrieved GRP for timestamp %llu with L3 ", timestamp, grpo->getL3Current()); + // taken from GRP onject definition of getNominalL3Field; update later to something smarter (mNominalL3Field = std::lround(5.f * mL3Current / 30000.f);) + auto NominalL3Field = std::lround(5.f * grpo->getL3Current() / 30000.f); + output = 0.1 * (NominalL3Field); + + } else { + + static o2::parameters::GRPObject* grpo = nullptr; + grpo = ccdb->getForTimeStamp("GLO/GRP/GRP", timestamp); + if (grpo == nullptr) { + LOGF(fatal, "GRP object not found for timestamp %llu", timestamp); + return; + } + LOGF(info, "Retrieved GRP for timestamp %llu with magnetic field of %d kG", timestamp, grpo->getNominalL3Field()); + output = 0.1 * (grpo->getNominalL3Field()); + } + mMagField = output; + mRunNumber = bc.runNumber(); + + // Init for zorro to get trigger flags + if (ConfEnableTriggerSelection) { + zorro.setCCDBpath(ConfBaseCCDBPathForTriggers); + zorro.initCCDB(ccdb.service, mRunNumber, timestamp, zorroTriggerNames); + } + } + + template + void fillDebugParticle(ParticleType const& particle) + { + if constexpr (isTrackOrV0) { + if constexpr (hasItsPid) { + outputDebugParts(particle.sign(), + (uint8_t)particle.tpcNClsFound(), + particle.tpcNClsFindable(), + (uint8_t)particle.tpcNClsCrossedRows(), + particle.tpcNClsShared(), + particle.tpcInnerParam(), + particle.itsNCls(), + particle.itsNClsInnerBarrel(), + particle.dcaXY(), + particle.dcaZ(), + particle.tpcSignal(), + particle.tpcNSigmaEl(), + particle.tpcNSigmaPi(), + particle.tpcNSigmaKa(), + particle.tpcNSigmaPr(), + particle.tpcNSigmaDe(), + particle.tpcNSigmaTr(), + particle.tpcNSigmaHe(), + particle.tofNSigmaEl(), + particle.tofNSigmaPi(), + particle.tofNSigmaKa(), + particle.tofNSigmaPr(), + particle.tofNSigmaDe(), + particle.tofNSigmaTr(), + particle.tofNSigmaHe(), + o2::analysis::femtoDream::itsSignal(particle), + particle.itsNSigmaEl(), + particle.itsNSigmaPi(), + particle.itsNSigmaKa(), + particle.itsNSigmaPr(), + particle.itsNSigmaDe(), + particle.itsNSigmaTr(), + particle.itsNSigmaHe(), + -999., -999., -999., -999., -999., -999., + -999., -999., -999., -999., -999., -999., -999.); + } else { + outputDebugParts(particle.sign(), + (uint8_t)particle.tpcNClsFound(), + particle.tpcNClsFindable(), + (uint8_t)particle.tpcNClsCrossedRows(), + particle.tpcNClsShared(), + particle.tpcInnerParam(), + particle.itsNCls(), + particle.itsNClsInnerBarrel(), + particle.dcaXY(), + particle.dcaZ(), + particle.tpcSignal(), + particle.tpcNSigmaEl(), + particle.tpcNSigmaPi(), + particle.tpcNSigmaKa(), + particle.tpcNSigmaPr(), + particle.tpcNSigmaDe(), + particle.tpcNSigmaTr(), + particle.tpcNSigmaHe(), + particle.tofNSigmaEl(), + particle.tofNSigmaPi(), + particle.tofNSigmaKa(), + particle.tofNSigmaPr(), + particle.tofNSigmaDe(), + particle.tofNSigmaTr(), + particle.tofNSigmaHe(), + -999., -999., -999., -999., -999., -999., -999., -999., + -999., -999., -999., -999., -999., -999., + -999., -999., -999., -999., -999., -999., -999.); + } + } else { + outputDebugParts(-999., // sign + -999., -999., -999., -999., -999., -999., -999., -999., -999., // track properties (DCA, NCls, crossed rows, etc.) + -999., -999., -999., -999., -999., -999., -999., -999., // TPC PID (TPC signal + particle hypothesis) + -999., -999., -999., -999., -999., -999., -999., // TOF PID + -999., -999., -999., -999., -999., -999., -999., -999., // ITS PID + particle.dcaV0daughters(), + particle.v0radius(), + particle.x(), + particle.y(), + particle.z(), + particle.mK0Short(), + -999., -999., -999., -999., -999., -999., -999.); // Cascade properties + } + } + + template + void fillDebugCascade(ParticleType const& cascade, CollisionType const& col) + { + outputDebugParts(cascade.sign(), // sign + -999., -999., -999., -999., -999., -999., -999., -999., -999., // track properties (DCA, NCls, crossed rows, etc.) + -999., -999., -999., -999., -999., -999., -999., -999., // TPC PID (TPC signal + particle hypothesis) + -999., -999., -999., -999., -999., -999., -999., // TOF PID + -999., -999., -999., -999., -999., -999., -999., -999., // ITS PID + cascade.dcaV0daughters(), + cascade.v0radius(), + -999., // DecVtxV0 x + -999., // DecVtxV0 y + -999., // DecVtxV0 z + -999., // mKaon + cascade.dcav0topv(col.posX(), col.posY(), col.posZ()), + cascade.dcacascdaughters(), + cascade.cascradius(), + cascade.x(), + cascade.y(), + cascade.z(), + cascade.mOmega()); // QA for Reso + } + + template + void fillMCParticle(CollisionType const& col, ParticleType const& particle, o2::aod::femtodreamparticle::ParticleType fdparttype) + { + if (particle.has_mcParticle()) { + // get corresponding MC particle and its info + auto particleMC = particle.mcParticle(); + auto pdgCode = particleMC.pdgCode(); + TrackRegistry.fill(HIST("AnalysisQA/Particle"), pdgCode); + int particleOrigin = 99; + int pdgCodeMother = -1; + // get list of mothers, but it could be empty (for example in case of injected light nuclei) + auto motherparticlesMC = particleMC.template mothers_as(); + // check pdg code + TrackRegistry.fill(HIST("AnalysisQA/getGenStatusCode"), particleMC.getGenStatusCode()); + TrackRegistry.fill(HIST("AnalysisQA/getProcess"), particleMC.getProcess()); + // if this fails, the particle is a fake + if (abs(pdgCode) == abs(ConfTrkPDGCode.value)) { + // check first if particle is from pile up + // check if the collision associated with the particle is the same as the analyzed collision by checking their Ids + if ((col.has_mcCollision() && (particleMC.mcCollisionId() != col.mcCollisionId())) || !col.has_mcCollision()) { + particleOrigin = aod::femtodreamMCparticle::ParticleOriginMCTruth::kWrongCollision; + // check if particle is primary + } else if (particleMC.isPhysicalPrimary()) { + particleOrigin = aod::femtodreamMCparticle::ParticleOriginMCTruth::kPrimary; + // check if particle is secondary + // particle is from a decay -> getProcess() == 4 + // particle is generated during transport -> getGenStatusCode() == -1 + // list of mothers is not empty + } else if (particleMC.getProcess() == 4 && particleMC.getGenStatusCode() == -1 && !motherparticlesMC.empty()) { + // get direct mother + auto motherparticleMC = motherparticlesMC.front(); + pdgCodeMother = motherparticleMC.pdgCode(); + TrackRegistry.fill(HIST("AnalysisQA/Mother"), pdgCodeMother); + particleOrigin = checkDaughterType(fdparttype, motherparticleMC.pdgCode()); + // check if particle is material + // particle is from inelastic hadronic interaction -> getProcess() == 23 + // particle is generated during transport -> getGenStatusCode() == -1 + } else if (particleMC.getProcess() == 23 && particleMC.getGenStatusCode() == -1) { + particleOrigin = aod::femtodreamMCparticle::ParticleOriginMCTruth::kMaterial; + // cross check to see if we missed a case + } else { + particleOrigin = aod::femtodreamMCparticle::ParticleOriginMCTruth::kElse; + } + // if pdg code is wrong, particle is fake + } else { + particleOrigin = aod::femtodreamMCparticle::ParticleOriginMCTruth::kFake; + } + + outputPartsMC(particleOrigin, pdgCode, particleMC.pt(), particleMC.eta(), particleMC.phi()); + outputPartsMCLabels(outputPartsMC.lastIndex()); + if (ConfIsDebug) { + outputPartsExtMCLabels(outputPartsMC.lastIndex()); + outputDebugPartsMC(pdgCodeMother); + } + } else { + outputPartsMCLabels(-1); + if (ConfIsDebug) { + outputPartsExtMCLabels(-1); + } + } + } + + template + void fillMCCollision(CollisionType const& col) + { + if (col.has_mcCollision()) { + auto genMCcol = col.template mcCollision_as(); + outputMCCollision(genMCcol.multMCNParticlesEta08()); + outputCollsMCLabels(outputMCCollision.lastIndex()); + } else { + outputCollsMCLabels(-1); + } + } + template + void fillCollisionsAndTracksAndV0AndCascade(CollisionType const& col, TrackType const& tracks, TrackTypeWithItsPid const& tracksWithItsPid, V0Type const& fullV0s, CascadeType const& fullCascades) + { + // If triggering is enabled, select only events which were triggered wit our triggers + if (ConfEnableTriggerSelection) { + bool zorroSelected = zorro.isSelected(col.template bc_as().globalBC()); /// check if event was selected by triggers of interest + if (!zorroSelected) { + return; + } + } + + const auto vtxZ = col.posZ(); + const auto spher = colCuts.computeSphericity(col, tracks); + float mult = 0; + int multNtr = 0; + if (ConfIsRun3) { + if constexpr (useCentrality) { + if constexpr (analysePbPb) { + mult = col.centFT0C(); + } else { + mult = col.centFT0M(); + } + } else { + mult = 0; + } + multNtr = col.multNTracksPV(); + } else { + mult = 1; // multiplicity percentile is know in Run 2 + multNtr = col.multTracklets(); + } + + colCuts.fillQA(col, mult); + + // check whether the basic event selection criteria are fulfilled + // that included checking if there is at least on usable track or V0 + if (!colCuts.isSelectedCollision(col)) { + return; + } + bool emptyCollision = false; + if (ConfIsActivateCascade.value) { + if (colCuts.isEmptyCollision(col, tracks, trackCuts) && colCuts.isCollisionWithoutTrkCasc(col, fullCascades, cascadeCuts, tracks)) { + emptyCollision = true; + } + } + if (ConfIsActivateV0.value) { + if (colCuts.isEmptyCollision(col, tracks, trackCuts) && colCuts.isEmptyCollision(col, fullV0s, v0Cuts, tracks)) { + emptyCollision = true; + } + } else { + if (colCuts.isEmptyCollision(col, tracks, trackCuts)) { + emptyCollision = true; + } + } + if (emptyCollision) { + return; + } + + outputCollision(vtxZ, mult, multNtr, spher, mMagField); + if constexpr (isMC) { + fillMCCollision(col); + } + + std::vector childIDs = {0, 0}; // these IDs are necessary to keep track of the children + std::vector cascadechildIDs = {0, 0, 0}; // these IDs are necessary to keep track of the children + std::vector tmpIDtrack; // this vector keeps track of the matching of the primary track table row <-> aod::track table global index + std::vector Daughter1, Daughter2; + + for (auto& track : tracksWithItsPid) { + /// if the most open selection criteria are not fulfilled there is no + /// point looking further at the track + trackCuts.fillQA(track); + + if (track.tpcChi2NCl() < OptionTrackSpecialSelections.ConfTrkMinChi2PerClusterTPC || track.tpcChi2NCl() > OptionTrackSpecialSelections.ConfTrkMaxChi2PerClusterTPC) { + continue; + } + if (track.itsChi2NCl() > OptionTrackSpecialSelections.ConfTrkMaxChi2PerClusterITS) { + continue; + } + if ((OptionTrackSpecialSelections.ConfTrkTPCRefit && !track.hasTPC()) || (OptionTrackSpecialSelections.ConfTrkITSRefit && !track.hasITS())) { + continue; + } + + if (!trackCuts.isSelectedMinimal(track)) { + continue; + } + + TrackRegistry.fill(HIST("AnalysisQA/Chi2ITSTPCperCluster"), track.itsChi2NCl(), track.tpcChi2NCl()); + TrackRegistry.fill(HIST("AnalysisQA/RefitITSTPC"), track.hasITS(), track.hasTPC()); + + trackCuts.fillQA(track); + // the bit-wise container of the systematic variations is obtained + std::array cutContainer; + cutContainer = trackCuts.getCutContainer(track, track.pt(), track.eta(), sqrtf(powf(track.dcaXY(), 2.f) + powf(track.dcaZ(), 2.f))); + + // now the table is filled + outputParts(outputCollision.lastIndex(), + track.pt(), + track.eta(), + track.phi(), + aod::femtodreamparticle::ParticleType::kTrack, + cutContainer.at(femtoDreamTrackSelection::TrackContainerPosition::kCuts), + cutContainer.at(femtoDreamTrackSelection::TrackContainerPosition::kPID), + track.dcaXY(), childIDs, 0, 0); + tmpIDtrack.push_back(track.globalIndex()); + if (ConfIsDebug.value) { + fillDebugParticle(track); + } + + if constexpr (isMC) { + fillMCParticle(col, track, o2::aod::femtodreamparticle::ParticleType::kTrack); + } + + if (ConfIsActivateReso.value) { + // Already strict cuts for Daughter of reso selection + // TO DO: change TTV0 task to apply there the strict selection and have here only loose selection + + // select daugher 1 + if (track.sign() == ConfDaughterCharge.value[0] && track.pt() <= ConfDaughterPtUp.value[0] && track.pt() >= ConfDaughterPtLow.value[0] && std::abs(track.eta()) <= ConfDaughterEta.value[0] && std::abs(track.dcaXY()) <= ConfDaughterDCAxy.value[0] && std::abs(track.dcaZ()) <= ConfDaughterDCAz.value[0] && track.tpcNClsCrossedRows() >= ConfDaughterNCrossed.value[0] && track.tpcNClsFound() >= ConfDaughterNClus.value[0] && track.tpcCrossedRowsOverFindableCls() >= ConfDaughterTPCfCls.value[0]) { + if ((track.tpcInnerParam() < ConfDaughterPTPCThr.value[0] && std::abs(o2::aod::pidutils::tpcNSigma(ConfDaughterPIDspecies.value[0], track)) <= ConfDaughterPIDnSigmaMax.value[0]) || + (track.tpcInnerParam() >= ConfDaughterPTPCThr.value[0] && std::abs(std::sqrt(o2::aod::pidutils::tpcNSigma(ConfDaughterPIDspecies.value[0], track) * o2::aod::pidutils::tpcNSigma(ConfDaughterPIDspecies.value[0], track) + o2::aod::pidutils::tofNSigma(ConfDaughterPIDspecies.value[0], track) * o2::aod::pidutils::tofNSigma(ConfDaughterPIDspecies.value[0], track))) <= ConfDaughterPIDnSigmaMax.value[0])) { + Daughter1.push_back(track); + ResoRegistry.fill(HIST("AnalysisQA/Reso/Daughter1/Pt"), track.pt()); + ResoRegistry.fill(HIST("AnalysisQA/Reso/Daughter1/Eta"), track.eta()); + ResoRegistry.fill(HIST("AnalysisQA/Reso/Daughter1/Phi"), track.phi()); + } + } + // select daugher 2 + if (track.sign() == ConfDaughterCharge.value[1] && track.pt() <= ConfDaughterPtUp.value[1] && track.pt() >= ConfDaughterPtLow.value[1] && std::abs(track.eta()) <= ConfDaughterEta.value[1] && std::abs(track.dcaXY()) <= ConfDaughterDCAxy.value[1] && std::abs(track.dcaZ()) <= ConfDaughterDCAz.value[1] && track.tpcNClsCrossedRows() >= ConfDaughterNCrossed.value[1] && track.tpcNClsFound() >= ConfDaughterNClus.value[1] && track.tpcCrossedRowsOverFindableCls() >= ConfDaughterTPCfCls.value[1]) { + if ((track.tpcInnerParam() < ConfDaughterPTPCThr.value[1] && std::abs(o2::aod::pidutils::tpcNSigma(ConfDaughterPIDspecies.value[1], track)) <= ConfDaughterPIDnSigmaMax.value[1]) || + (track.tpcInnerParam() >= ConfDaughterPTPCThr.value[1] && std::abs(std::sqrt(o2::aod::pidutils::tpcNSigma(ConfDaughterPIDspecies.value[1], track) * o2::aod::pidutils::tpcNSigma(ConfDaughterPIDspecies.value[1], track) + o2::aod::pidutils::tofNSigma(ConfDaughterPIDspecies.value[1], track) * o2::aod::pidutils::tofNSigma(ConfDaughterPIDspecies.value[1], track))) <= ConfDaughterPIDnSigmaMax.value[1])) { + Daughter2.push_back(track); + ResoRegistry.fill(HIST("AnalysisQA/Reso/Daughter2/Pt"), track.pt()); + ResoRegistry.fill(HIST("AnalysisQA/Reso/Daughter2/Eta"), track.eta()); + ResoRegistry.fill(HIST("AnalysisQA/Reso/Daughter2/Phi"), track.phi()); + } + } + } + } + + if (ConfIsActivateV0.value) { + for (auto& v0 : fullV0s) { + + auto postrack = v0.template posTrack_as(); + auto negtrack = v0.template negTrack_as(); + ///\tocheck funnily enough if we apply the filter the + /// sign of Pos and Neg track is always negative + // const auto dcaXYpos = postrack.dcaXY(); + // const auto dcaZpos = postrack.dcaZ(); + // const auto dcapos = std::sqrt(pow(dcaXYpos, 2.) + pow(dcaZpos, 2.)); + v0Cuts.fillLambdaQA(col, v0, postrack, negtrack); + + if (!v0Cuts.isSelectedMinimal(col, v0, postrack, negtrack)) { + continue; + } + + // if (ConfRejectITSHitandTOFMissing) { + // Uncomment only when TOF timing is solved + // bool itsHit = o2PhysicsTrackSelection->IsSelected(postrack, + // TrackSelection::TrackCuts::kITSHits); bool itsHit = + // o2PhysicsTrackSelection->IsSelected(negtrack, + // TrackSelection::TrackCuts::kITSHits); + // } + + v0Cuts.fillQA(col, v0, postrack, negtrack); ///\todo fill QA also for daughters + auto cutContainerV0 = v0Cuts.getCutContainer(col, v0, postrack, negtrack); + + int postrackID = v0.posTrackId(); + int rowInPrimaryTrackTablePos = -1; + rowInPrimaryTrackTablePos = getRowDaughters(postrackID, tmpIDtrack); + childIDs[0] = rowInPrimaryTrackTablePos; + childIDs[1] = 0; + outputParts(outputCollision.lastIndex(), + v0.positivept(), v0.positiveeta(), v0.positivephi(), + aod::femtodreamparticle::ParticleType::kV0Child, + cutContainerV0.at(femtoDreamV0Selection::V0ContainerPosition::kPosCuts), + cutContainerV0.at(femtoDreamV0Selection::V0ContainerPosition::kPosPID), + postrack.dcaXY(), + childIDs, + 0, + 0); + const int rowOfPosTrack = outputParts.lastIndex(); + if constexpr (isMC) { + fillMCParticle(col, postrack, o2::aod::femtodreamparticle::ParticleType::kV0Child); + } + int negtrackID = v0.negTrackId(); + int rowInPrimaryTrackTableNeg = -1; + rowInPrimaryTrackTableNeg = getRowDaughters(negtrackID, tmpIDtrack); + childIDs[0] = 0; + childIDs[1] = rowInPrimaryTrackTableNeg; + outputParts(outputCollision.lastIndex(), + v0.negativept(), + v0.negativeeta(), + v0.negativephi(), + aod::femtodreamparticle::ParticleType::kV0Child, + cutContainerV0.at(femtoDreamV0Selection::V0ContainerPosition::kNegCuts), + cutContainerV0.at(femtoDreamV0Selection::V0ContainerPosition::kNegPID), + negtrack.dcaXY(), + childIDs, + 0, + 0); + const int rowOfNegTrack = outputParts.lastIndex(); + if constexpr (isMC) { + fillMCParticle(col, negtrack, o2::aod::femtodreamparticle::ParticleType::kV0Child); + } + std::vector indexChildID = {rowOfPosTrack, rowOfNegTrack}; + outputParts(outputCollision.lastIndex(), + v0.pt(), + v0.eta(), + v0.phi(), + aod::femtodreamparticle::ParticleType::kV0, + cutContainerV0.at(femtoDreamV0Selection::V0ContainerPosition::kV0), + 0, + v0.v0cosPA(), + indexChildID, + v0.mLambda(), + v0.mAntiLambda()); + if (ConfIsDebug.value) { + fillDebugParticle(postrack); // QA for positive daughter + fillDebugParticle(negtrack); // QA for negative daughter + fillDebugParticle(v0); // QA for v0 + } + if constexpr (isMC) { + fillMCParticle(col, v0, o2::aod::femtodreamparticle::ParticleType::kV0); + } + } + } + if (ConfIsActivateCascade.value) { + for (auto& casc : fullCascades) { + // get the daughter tracks + const auto& posTrackCasc = casc.template posTrack_as(); + const auto& negTrackCasc = casc.template negTrack_as(); + const auto& bachTrackCasc = casc.template bachelor_as(); + + cascadeCuts.fillQA<0, aod::femtodreamparticle::ParticleType::kCascade>(col, casc, posTrackCasc, negTrackCasc, bachTrackCasc); + if (!cascadeCuts.isSelectedMinimal(col, casc, posTrackCasc, negTrackCasc, bachTrackCasc)) { + continue; + } + cascadeCuts.fillQA<1, aod::femtodreamparticle::ParticleType::kCascade>(col, casc, posTrackCasc, negTrackCasc, bachTrackCasc); + + // auto cutContainerCasc = cascadeCuts.getCutContainer(col, casc, v0daugh, posTrackCasc, negTrackCasc, bachTrackCasc); + auto cutContainerCasc = cascadeCuts.getCutContainer(col, casc, posTrackCasc, negTrackCasc, bachTrackCasc); + + // Fill positive child + int poscasctrackID = casc.posTrackId(); + int rowInPrimaryTrackTablePosCasc = -1; + rowInPrimaryTrackTablePosCasc = getRowDaughters(poscasctrackID, tmpIDtrack); + cascadechildIDs[0] = rowInPrimaryTrackTablePosCasc; + cascadechildIDs[1] = 0; + cascadechildIDs[2] = 0; + outputParts(outputCollision.lastIndex(), + posTrackCasc.pt(), + posTrackCasc.eta(), + posTrackCasc.phi(), + aod::femtodreamparticle::ParticleType::kCascadeV0Child, + cutContainerCasc.at(femtoDreamCascadeSelection::CascadeContainerPosition::kPosCuts), + cutContainerCasc.at(femtoDreamCascadeSelection::CascadeContainerPosition::kPosPID), + posTrackCasc.dcaXY(), + cascadechildIDs, + 0, + 0); + const int rowOfPosCascadeTrack = outputParts.lastIndex(); + // TODO: include here MC filling + //------ + + // Fill negative child + int negcasctrackID = casc.negTrackId(); + int rowInPrimaryTrackTableNegCasc = -1; + rowInPrimaryTrackTableNegCasc = getRowDaughters(negcasctrackID, tmpIDtrack); + cascadechildIDs[0] = 0; + cascadechildIDs[1] = rowInPrimaryTrackTableNegCasc; + cascadechildIDs[2] = 0; + outputParts(outputCollision.lastIndex(), + negTrackCasc.pt(), + negTrackCasc.eta(), + negTrackCasc.phi(), + aod::femtodreamparticle::ParticleType::kCascadeV0Child, + cutContainerCasc.at(femtoDreamCascadeSelection::CascadeContainerPosition::kNegCuts), + cutContainerCasc.at(femtoDreamCascadeSelection::CascadeContainerPosition::kNegPID), + negTrackCasc.dcaXY(), + cascadechildIDs, + 0, + 0); + const int rowOfNegCascadeTrack = outputParts.lastIndex(); + // TODO: include here MC filling + //------ + + // Fill bachelor child + int bachelorcasctrackID = casc.bachelorId(); + int rowInPrimaryTrackTableBachelorCasc = -1; + rowInPrimaryTrackTableBachelorCasc = getRowDaughters(bachelorcasctrackID, tmpIDtrack); + cascadechildIDs[0] = 0; + cascadechildIDs[1] = 0; + cascadechildIDs[2] = rowInPrimaryTrackTableBachelorCasc; + outputParts(outputCollision.lastIndex(), + bachTrackCasc.pt(), + bachTrackCasc.eta(), + bachTrackCasc.phi(), + aod::femtodreamparticle::ParticleType::kCascadeBachelor, + cutContainerCasc.at(femtoDreamCascadeSelection::CascadeContainerPosition::kBachCuts), + cutContainerCasc.at(femtoDreamCascadeSelection::CascadeContainerPosition::kBachPID), + bachTrackCasc.dcaXY(), + cascadechildIDs, + 0, + 0); + const int rowOfBachelorCascadeTrack = outputParts.lastIndex(); + // TODO: include here MC filling + //------ + + // Fill cascades + std::vector indexCascadeChildID = {rowOfPosCascadeTrack, rowOfNegCascadeTrack, rowOfBachelorCascadeTrack}; + outputParts(outputCollision.lastIndex(), + casc.pt(), + casc.eta(), + casc.phi(), + aod::femtodreamparticle::ParticleType::kCascade, + cutContainerCasc.at(femtoDreamCascadeSelection::CascadeContainerPosition::kCascade), + 0, + casc.casccosPA(col.posX(), col.posY(), col.posZ()), + indexCascadeChildID, + casc.mXi(), + casc.mLambda()); + // TODO: include here MC filling + //------ + + if (ConfIsDebug.value) { + fillDebugParticle(posTrackCasc); // QA for positive daughter + fillDebugParticle(negTrackCasc); // QA for negative daughter + fillDebugParticle(bachTrackCasc); // QA for negative daughter + fillDebugCascade(casc, col); // QA for Cascade + } + } + } + + if (ConfIsActivateReso.value) { + for (std::size_t iDaug1 = 0; iDaug1 < Daughter1.size(); ++iDaug1) { + for (std::size_t iDaug2 = 0; iDaug2 < Daughter2.size(); ++iDaug2) { + // MC stuff is still missing, also V0 QA + // ALSO: fix indices and other table entries which are now set to 0 as deflaut as not needed for p-p-phi cf ana + + ROOT::Math::PtEtaPhiMVector tempD1(Daughter1.at(iDaug1).pt(), Daughter1.at(iDaug1).eta(), Daughter1.at(iDaug1).phi(), ConfDaug1Daugh2ResoMass.value[0]); + ROOT::Math::PtEtaPhiMVector tempD2(Daughter2.at(iDaug2).pt(), Daughter2.at(iDaug2).eta(), Daughter2.at(iDaug2).phi(), ConfDaug1Daugh2ResoMass.value[1]); + + ROOT::Math::PtEtaPhiMVector tempPhi = tempD1 + tempD2; + + ResoRegistry.fill(HIST("AnalysisQA/Reso/InvMass"), tempPhi.M()); + + if ((tempPhi.M() >= ConfResoInvMassLowLimit.value) && (tempPhi.M() <= ConfResoInvMassUpLimit.value)) { + + ResoRegistry.fill(HIST("AnalysisQA/Reso/InvMass_selected"), tempPhi.M()); + ResoRegistry.fill(HIST("AnalysisQA/Reso/PtD1_selected"), Daughter1.at(iDaug1).pt()); + ResoRegistry.fill(HIST("AnalysisQA/Reso/PtD2_selected"), Daughter2.at(iDaug2).pt()); + + childIDs[0] = 0; + childIDs[1] = 0; + std::vector indexChildID = {0, 0}; + outputParts(outputCollision.lastIndex(), + static_cast(Daughter1.at(iDaug1).pt()), static_cast(Daughter1.at(iDaug1).eta()), static_cast(Daughter1.at(iDaug1).phi()), + aod::femtodreamparticle::ParticleType::kV0Child, + static_cast(0), + static_cast(0), + static_cast(Daughter1.at(iDaug1).dcaXY()), + childIDs, + 0, + 0); + outputParts(outputCollision.lastIndex(), + static_cast(Daughter2.at(iDaug2).pt()), static_cast(Daughter2.at(iDaug2).eta()), static_cast(Daughter2.at(iDaug2).phi()), + aod::femtodreamparticle::ParticleType::kV0Child, + static_cast(0), + static_cast(0), + static_cast(Daughter2.at(iDaug2).dcaXY()), + childIDs, + 0, + 0); + outputParts(outputCollision.lastIndex(), + static_cast(tempPhi.pt()), + static_cast(tempPhi.eta()), + static_cast(tempPhi.phi()), + aod::femtodreamparticle::ParticleType::kV0, + static_cast(0), + 0, + 0.f, + indexChildID, + tempPhi.M(), + tempPhi.M()); + if (ConfIsDebug.value) { + fillDebugParticle(Daughter1.at(iDaug1)); // QA for positive daughter + fillDebugParticle(Daughter2.at(iDaug2)); // QA for negative daughter + outputDebugParts(-999., // sign + -999., -999., -999., -999., -999., -999., -999., -999., -999., // track properties (DCA, NCls, crossed rows, etc.) + -999., -999., -999., -999., -999., -999., -999., -999., // TPC PID (TPC signal + particle hypothesis) + -999., -999., -999., -999., -999., -999., -999., // TOF PID + -999., -999., -999., -999., -999., -999., -999., -999., // ITS PID + -999., -999., -999., -999., -999., -999., // V0 properties + -999., -999., -999., -999., -999., -999., -999.); // Cascade properties + } + } + } + } + } + } + + void + processData(aod::FemtoFullCollision const& col, + aod::BCsWithTimestamps const&, + aod::FemtoFullTracks const& tracks, + o2::aod::V0Datas const& fullV0s, + o2::aod::V0sLinked const&, + o2::aod::CascDatas const& fullCascades) + { + // get magnetic field for run + initCCDB_Mag_Trig(col.bc_as()); + // fill the tables + auto tracksWithItsPid = soa::Attach(tracks); + if (ConfUseItsPid.value) { + fillCollisionsAndTracksAndV0AndCascade(col, tracks, tracksWithItsPid, fullV0s, fullCascades); + } else { + fillCollisionsAndTracksAndV0AndCascade(col, tracks, tracks, fullV0s, fullCascades); + } + } + PROCESS_SWITCH(femtoDreamProducerTaskWithCascades, processData, + "Provide experimental data", true); + + void + processData_noCentrality(aod::FemtoFullCollision_noCent const& col, + aod::BCsWithTimestamps const&, + aod::FemtoFullTracks const& tracks, + o2::aod::V0Datas const& fullV0s, + o2::aod::V0sLinked const&, + o2::aod::CascDatas const& fullCascades) + { + // get magnetic field for run + initCCDB_Mag_Trig(col.bc_as()); + // fill the tables + auto tracksWithItsPid = soa::Attach(tracks); + if (ConfUseItsPid.value) { + fillCollisionsAndTracksAndV0AndCascade(col, tracks, tracksWithItsPid, fullV0s, fullCascades); + } else { + fillCollisionsAndTracksAndV0AndCascade(col, tracks, tracks, fullV0s, fullCascades); + } + } + PROCESS_SWITCH(femtoDreamProducerTaskWithCascades, processData_noCentrality, + "Provide experimental data without centrality information", false); + + void processData_CentPbPb(aod::FemtoFullCollision_CentPbPb const& col, + aod::BCsWithTimestamps const&, + aod::FemtoFullTracks const& tracks, + o2::aod::V0Datas const& fullV0s, + o2::aod::CascDatas const& fullCascades) + { + // get magnetic field for run + initCCDB_Mag_Trig(col.bc_as()); + // fill the tables + auto tracksWithItsPid = soa::Attach(tracks); + if (ConfUseItsPid.value) { + fillCollisionsAndTracksAndV0AndCascade(col, tracks, tracksWithItsPid, fullV0s, fullCascades); + } else { + fillCollisionsAndTracksAndV0AndCascade(col, tracks, tracks, fullV0s, fullCascades); + } + } + PROCESS_SWITCH(femtoDreamProducerTaskWithCascades, processData_CentPbPb, + "Provide experimental data with centrality information for PbPb collisions", false); + + void processMC(aod::FemtoFullCollisionMC const& col, + aod::BCsWithTimestamps const&, + soa::Join const& tracks, + aod::FemtoFullMCgenCollisions const&, + aod::McParticles const&, + soa::Join const& fullV0s, /// \todo with FilteredFullV0s + soa::Join const& fullCascades) + { + // get magnetic field for run + initCCDB_Mag_Trig(col.bc_as()); + // fill the tables + fillCollisionsAndTracksAndV0AndCascade(col, tracks, tracks, fullV0s, fullCascades); + } + PROCESS_SWITCH(femtoDreamProducerTaskWithCascades, processMC, "Provide MC data", false); + + void processMC_noCentrality(aod::FemtoFullCollision_noCent_MC const& col, + aod::BCsWithTimestamps const&, + soa::Join const& tracks, + aod::FemtoFullMCgenCollisions const&, + aod::McParticles const&, + soa::Join const& fullV0s, /// \todo with FilteredFullV0s + soa::Join const& fullCascades) + { + // get magnetic field for run + initCCDB_Mag_Trig(col.bc_as()); + // fill the tables + fillCollisionsAndTracksAndV0AndCascade(col, tracks, tracks, fullV0s, fullCascades); + } + PROCESS_SWITCH(femtoDreamProducerTaskWithCascades, processMC_noCentrality, "Provide MC data without requiring a centrality calibration", false); + + void processMC_CentPbPb(aod::FemtoFullCollisionMC_CentPbPb const& col, + aod::BCsWithTimestamps const&, + soa::Join const& tracks, + aod::FemtoFullMCgenCollisions const&, + aod::McParticles const&, + soa::Join const& fullV0s, /// \todo with FilteredFullV0s + soa::Join const& fullCascades) + { + // get magnetic field for run + initCCDB_Mag_Trig(col.bc_as()); + // fill the tables + fillCollisionsAndTracksAndV0AndCascade(col, tracks, tracks, fullV0s, fullCascades); + } + PROCESS_SWITCH(femtoDreamProducerTaskWithCascades, processMC_CentPbPb, "Provide MC data with centrality information for PbPb collisions", false); +}; +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + WorkflowSpec workflow{adaptAnalysisTask(cfgc)}; + return workflow; +} diff --git a/PWGCF/FemtoDream/Tasks/femtoDreamDebugCascade.cxx b/PWGCF/FemtoDream/Tasks/femtoDreamDebugCascade.cxx index 5717970c854..dd49096907e 100644 --- a/PWGCF/FemtoDream/Tasks/femtoDreamDebugCascade.cxx +++ b/PWGCF/FemtoDream/Tasks/femtoDreamDebugCascade.cxx @@ -29,6 +29,8 @@ #include "PWGCF/DataModel/FemtoDerived.h" #include "PWGCF/FemtoDream/Core/femtoDreamParticleHisto.h" #include "PWGCF/FemtoDream/Core/femtoDreamEventHisto.h" +#include "PWGCF/FemtoDream/Core/femtoDreamMath.h" +#include "PWGCF/FemtoDream/Core/femtoDreamUtils.h" using namespace o2; using namespace o2::analysis::femtoDream; @@ -53,6 +55,7 @@ struct femtoDreamDebugCascade { Configurable ConfCascadeTempFitVarMomentum{"ConfCascadeTempFitVarMomentum", 0, "Momentum used for binning: 0 -> pt; 1 -> preco; 2 -> ptpc"}; ConfigurableAxis ConfCascadeInvMassBins{"ConfCascadeInvMassBins", {200, 1.25, 1.45}, "Cascade: InvMass binning"}; + ConfigurableAxis ConfCascadeInvMassCompetingBins{"ConfCascadeInvMassCompetingBins", {200, 1.57, 1.77}, "Cascade: InvMass binning of the competing candidate"}; ConfigurableAxis ConfCascadeChildTempFitVarMomentumBins{"ConfCascadeChildTempFitVarMomentumBins", {600, 0, 6}, "p binning for the p vs Nsigma TPC/TOF plot"}; ConfigurableAxis ConfCascadeChildNsigmaTPCBins{"ConfCascadeChildNsigmaTPCBins", {1600, -8, 8}, "binning of Nsigma TPC plot"}; @@ -66,6 +69,13 @@ struct femtoDreamDebugCascade { Configurable ConfCascade_ChildBach_CutBit{"ConfCascade_ChildBach_CutBit", 149, "Bachelor Child of Cascade - PID bit from cutCulator"}; Configurable ConfCascade_ChildBach_TPCBit{"ConfCascade_ChildBach_TPCBit", 8, "Bachelor Child of Cascade - PID bit from cutCulator"}; Configurable ConfUseChildCuts{"ConfUseChildCuts", true, "Use cuts on the children of the Cascades additional to those of the selection of the cascade builder"}; + Configurable ConfUseChildPIDCuts{"ConfUseChildPIDCuts", true, "Use cuts on the children of the Cascades additional to those of the selection of the cascade builder"}; + + Configurable ConfIsOmega{"ConfIsOmega", false, "Switch between Xi and Omaga Cascades: If true: Omega; else: Xi"}; + Configurable ConfRejectCompetingMass{"ConfRejectCompetingMass", false, "Reject the competing Cascade Mass (use only for debugging. More efficient to exclude it already at the producer level)"}; + Configurable ConfCompetingCascadeMassLowLimit{"ConfCompetingCascadeMassLowLimit", 0., "Lower Limit of the invariant mass window within which to reject the cascade"}; + Configurable ConfCompetingCascadeMassUpLimit{"ConfCompetingCascadeMassUpLimit", 0., "Upper Limit of the invariant mass window within which to reject the cascade"}; + ConfigurableAxis ConfCascadeChildTempFitVarBins{"ConfCascadeChildTempFitVarBins", {300, -0.15, 0.15}, "Cascade child: binning of the TempFitVar in the pT vs. TempFitVar plot"}; ConfigurableAxis ConfCascadeChildTempFitVarpTBins{"ConfCascadeChildTempFitVarpTBins", {20, 0.5, 4.05}, "Cascade child: pT binning of the pT vs. TempFitVar plot"}; @@ -84,13 +94,29 @@ struct femtoDreamDebugCascade { HistogramRegistry EventRegistry{"Event", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry CascadeRegistry{"FullCascQA", {}, OutputObjHandlingPolicy::AnalysisObject}; + float massProton; + float massPion; + float massKaon; + float massLambda; + float massCompetingBach; + void init(InitContext&) { eventHisto.init(&EventRegistry, false); - posChildHistos.init(&CascadeRegistry, ConfBinmult, ConfDummy, ConfCascadeChildTempFitVarMomentumBins, ConfDummy, ConfDummy, ConfCascadeChildTempFitVarBins, ConfCascadeChildNsigmaTPCBins, ConfCascadeChildNsigmaTOFBins, ConfCascadeChildNsigmaTPCTOFBins, ConfDummy, ConfCascadeInvMassBins, false, ConfCascade_ChildPos_PDGCode.value, true); - negChildHistos.init(&CascadeRegistry, ConfBinmult, ConfDummy, ConfCascadeChildTempFitVarMomentumBins, ConfDummy, ConfDummy, ConfCascadeChildTempFitVarBins, ConfCascadeChildNsigmaTPCBins, ConfCascadeChildNsigmaTOFBins, ConfCascadeChildNsigmaTPCTOFBins, ConfDummy, ConfCascadeInvMassBins, false, ConfCascade_ChildNeg_PDGCode.value, true); - bachelorHistos.init(&CascadeRegistry, ConfBinmult, ConfDummy, ConfCascadeChildTempFitVarMomentumBins, ConfDummy, ConfDummy, ConfCascadeChildTempFitVarBins, ConfCascadeChildNsigmaTPCBins, ConfCascadeChildNsigmaTOFBins, ConfCascadeChildNsigmaTPCTOFBins, ConfDummy, ConfCascadeInvMassBins, false, ConfCascade_Bach_PDGCode.value, true); - CascadeHistos.init(&CascadeRegistry, ConfBinmult, ConfDummy, ConfCascadeTempFitVarMomentumBins, ConfDummy, ConfDummy, ConfCascadeTempFitVarBins, ConfCascadeChildNsigmaTPCBins, ConfCascadeChildNsigmaTOFBins, ConfCascadeChildNsigmaTPCTOFBins, ConfDummy, ConfCascadeInvMassBins, false, ConfCascade_PDGCode.value, false); + posChildHistos.init(&CascadeRegistry, ConfBinmult, ConfDummy, ConfCascadeChildTempFitVarMomentumBins, ConfDummy, ConfDummy, ConfCascadeChildTempFitVarBins, ConfCascadeChildNsigmaTPCBins, ConfCascadeChildNsigmaTOFBins, ConfCascadeChildNsigmaTPCTOFBins, ConfDummy, ConfCascadeInvMassBins, ConfCascadeInvMassCompetingBins, false, ConfCascade_ChildPos_PDGCode.value, true); + negChildHistos.init(&CascadeRegistry, ConfBinmult, ConfDummy, ConfCascadeChildTempFitVarMomentumBins, ConfDummy, ConfDummy, ConfCascadeChildTempFitVarBins, ConfCascadeChildNsigmaTPCBins, ConfCascadeChildNsigmaTOFBins, ConfCascadeChildNsigmaTPCTOFBins, ConfDummy, ConfCascadeInvMassBins, ConfCascadeInvMassCompetingBins, false, ConfCascade_ChildNeg_PDGCode.value, true); + bachelorHistos.init(&CascadeRegistry, ConfBinmult, ConfDummy, ConfCascadeChildTempFitVarMomentumBins, ConfDummy, ConfDummy, ConfCascadeChildTempFitVarBins, ConfCascadeChildNsigmaTPCBins, ConfCascadeChildNsigmaTOFBins, ConfCascadeChildNsigmaTPCTOFBins, ConfDummy, ConfCascadeInvMassBins, ConfCascadeInvMassCompetingBins, false, ConfCascade_Bach_PDGCode.value, true); + CascadeHistos.init(&CascadeRegistry, ConfBinmult, ConfDummy, ConfCascadeTempFitVarMomentumBins, ConfDummy, ConfDummy, ConfCascadeTempFitVarBins, ConfCascadeChildNsigmaTPCBins, ConfCascadeChildNsigmaTOFBins, ConfCascadeChildNsigmaTPCTOFBins, ConfDummy, ConfCascadeInvMassBins, ConfCascadeInvMassCompetingBins, false, ConfCascade_PDGCode.value, true); + + massProton = o2::analysis::femtoDream::getMass(2212); + massPion = o2::analysis::femtoDream::getMass(211); + massKaon = o2::analysis::femtoDream::getMass(321); + massLambda = o2::analysis::femtoDream::getMass(3122); + if (ConfIsOmega) { // if the Cascade is an Omega, then the bachelor is a Kaon + massCompetingBach = o2::analysis::femtoDream::getMass(211); + } else { // if the Cascade is a Xi, then the bachelor is a Pion + massCompetingBach = o2::analysis::femtoDream::getMass(321); + } } /// Porduce QA plots for V0 selection in FemtoDream framework @@ -115,16 +141,35 @@ struct femtoDreamDebugCascade { negChild.partType() == uint8_t(aod::femtodreamparticle::ParticleType::kCascadeV0Child) && bachChild.partType() == uint8_t(aod::femtodreamparticle::ParticleType::kCascadeBachelor)) { - if (ConfUseChildCuts && - !((posChild.cut() & ConfCascade_ChildPos_CutBit) == ConfCascade_ChildPos_CutBit && - (posChild.pidcut() & ConfCascade_ChildPos_TPCBit) == ConfCascade_ChildPos_TPCBit && - (negChild.cut() & ConfCascade_ChildNeg_CutBit) == ConfCascade_ChildNeg_CutBit && - (negChild.pidcut() & ConfCascade_ChildNeg_TPCBit) == ConfCascade_ChildNeg_TPCBit && - (bachChild.cut() & ConfCascade_ChildBach_CutBit) == ConfCascade_ChildBach_CutBit && - (bachChild.pidcut() & ConfCascade_ChildBach_TPCBit) == ConfCascade_ChildBach_TPCBit)) { - continue; + if (ConfUseChildCuts) { + if (!((posChild.cut() & ConfCascade_ChildPos_CutBit) == ConfCascade_ChildPos_CutBit && + (negChild.cut() & ConfCascade_ChildNeg_CutBit) == ConfCascade_ChildNeg_CutBit && + (bachChild.cut() & ConfCascade_ChildBach_CutBit) == ConfCascade_ChildBach_CutBit)) { + continue; + } + } + if (ConfUseChildPIDCuts) { + if (!((posChild.pidcut() & ConfCascade_ChildPos_TPCBit) == ConfCascade_ChildPos_TPCBit && + (negChild.pidcut() & ConfCascade_ChildNeg_TPCBit) == ConfCascade_ChildNeg_TPCBit && + (bachChild.pidcut() & ConfCascade_ChildBach_TPCBit) == ConfCascade_ChildBach_TPCBit)) { + continue; + } + } + + // Competing mass rejection + if (ConfRejectCompetingMass) { + float invMassCompetingCasc; + if (part.sign() < 0) { + invMassCompetingCasc = FemtoDreamMath::getInvMassCascade(posChild, massProton, negChild, massPion, bachChild, massCompetingBach, massLambda); + } else { + invMassCompetingCasc = FemtoDreamMath::getInvMassCascade(posChild, massPion, negChild, massProton, bachChild, massCompetingBach, massLambda); + } + if (invMassCompetingCasc > ConfCompetingCascadeMassLowLimit.value && + invMassCompetingCasc < ConfCompetingCascadeMassUpLimit.value) { + continue; + } } - CascadeHistos.fillQA(part, static_cast(ConfCascadeTempFitVarMomentum.value), col.multNtr(), col.multV0M()); // set isDebug to true + CascadeHistos.fillQA(part, static_cast(ConfCascadeTempFitVarMomentum.value), col.multNtr(), col.multV0M()); posChildHistos.fillQA(posChild, static_cast(ConfCascadeTempFitVarMomentum.value), col.multNtr(), col.multV0M()); negChildHistos.fillQA(negChild, static_cast(ConfCascadeTempFitVarMomentum.value), col.multNtr(), col.multV0M()); bachelorHistos.fillQA(bachChild, static_cast(ConfCascadeTempFitVarMomentum.value), col.multNtr(), col.multV0M()); diff --git a/PWGCF/FemtoDream/Tasks/femtoDreamDebugTrack.cxx b/PWGCF/FemtoDream/Tasks/femtoDreamDebugTrack.cxx index 9ad08d8a207..eb19d28486d 100644 --- a/PWGCF/FemtoDream/Tasks/femtoDreamDebugTrack.cxx +++ b/PWGCF/FemtoDream/Tasks/femtoDreamDebugTrack.cxx @@ -102,7 +102,7 @@ struct femtoDreamDebugTrack { void init(InitContext&) { eventHisto.init(&qaRegistry, ConfIsMC); - trackHisto.init(&qaRegistry, ConfBinmult, ConfBinmultPercentile, ConfBinpT, ConfBineta, ConfBinphi, ConfTempFitVarBins, ConfNsigmaTPCBins, ConfNsigmaTOFBins, ConfNsigmaTPCTOFBins, ConfNsigmaITSBins, ConfDummy, ConfIsMC, ConfTrk1_PDGCode.value, true, ConfOptCorrelatedPlots); + trackHisto.init(&qaRegistry, ConfBinmult, ConfBinmultPercentile, ConfBinpT, ConfBineta, ConfBinphi, ConfTempFitVarBins, ConfNsigmaTPCBins, ConfNsigmaTOFBins, ConfNsigmaTPCTOFBins, ConfNsigmaITSBins, ConfDummy, ConfDummy, ConfIsMC, ConfTrk1_PDGCode.value, true, ConfOptCorrelatedPlots); } /// Porduce QA plots for sigle track selection in FemtoDream framework diff --git a/PWGCF/FemtoDream/Tasks/femtoDreamDebugV0.cxx b/PWGCF/FemtoDream/Tasks/femtoDreamDebugV0.cxx index 11f12ed9b44..c20d2b2a445 100644 --- a/PWGCF/FemtoDream/Tasks/femtoDreamDebugV0.cxx +++ b/PWGCF/FemtoDream/Tasks/femtoDreamDebugV0.cxx @@ -84,9 +84,9 @@ struct femtoDreamDebugV0 { void init(InitContext&) { eventHisto.init(&EventRegistry, false); - posChildHistos.init(&V0Registry, ConfBinmult, ConfDummy, ConfV0ChildTempFitVarMomentumBins, ConfDummy, ConfDummy, ConfChildTempFitVarBins, ConfV0ChildNsigmaTPCBins, ConfV0ChildNsigmaTOFBins, ConfV0ChildNsigmaTPCTOFBins, ConfV0ChildNsigmaITSBins, ConfV0InvMassBins, false, ConfV01_ChildPos_PDGCode.value, true); - negChildHistos.init(&V0Registry, ConfBinmult, ConfDummy, ConfV0ChildTempFitVarMomentumBins, ConfDummy, ConfDummy, ConfChildTempFitVarBins, ConfV0ChildNsigmaTPCBins, ConfV0ChildNsigmaTOFBins, ConfV0ChildNsigmaTPCTOFBins, ConfV0ChildNsigmaITSBins, ConfV0InvMassBins, false, ConfV01_ChildNeg_PDGCode, true); - V0Histos.init(&V0Registry, ConfBinmult, ConfDummy, ConfV0TempFitVarMomentumBins, ConfDummy, ConfDummy, ConfV0TempFitVarBins, ConfV0ChildNsigmaTPCBins, ConfV0ChildNsigmaTOFBins, ConfV0ChildNsigmaTPCTOFBins, ConfV0ChildNsigmaITSBins, ConfV0InvMassBins, false, ConfV01_PDGCode.value, true); + posChildHistos.init(&V0Registry, ConfBinmult, ConfDummy, ConfV0ChildTempFitVarMomentumBins, ConfDummy, ConfDummy, ConfChildTempFitVarBins, ConfV0ChildNsigmaTPCBins, ConfV0ChildNsigmaTOFBins, ConfV0ChildNsigmaTPCTOFBins, ConfV0ChildNsigmaITSBins, ConfV0InvMassBins, ConfDummy, false, ConfV01_ChildPos_PDGCode.value, true); + negChildHistos.init(&V0Registry, ConfBinmult, ConfDummy, ConfV0ChildTempFitVarMomentumBins, ConfDummy, ConfDummy, ConfChildTempFitVarBins, ConfV0ChildNsigmaTPCBins, ConfV0ChildNsigmaTOFBins, ConfV0ChildNsigmaTPCTOFBins, ConfV0ChildNsigmaITSBins, ConfV0InvMassBins, ConfDummy, false, ConfV01_ChildNeg_PDGCode, true); + V0Histos.init(&V0Registry, ConfBinmult, ConfDummy, ConfV0TempFitVarMomentumBins, ConfDummy, ConfDummy, ConfV0TempFitVarBins, ConfV0ChildNsigmaTPCBins, ConfV0ChildNsigmaTOFBins, ConfV0ChildNsigmaTPCTOFBins, ConfV0ChildNsigmaITSBins, ConfV0InvMassBins, ConfDummy, false, ConfV01_PDGCode.value, true); V0Registry.add("hArmenterosPodolanski/hArmenterosPodolanskiPlot", "; #alpha; p_{T} (MeV/#it{c})", kTH2F, {{100, -1, 1}, {500, -0.3, 2}}); } diff --git a/PWGCF/FemtoDream/Tasks/femtoDreamPairTaskTrackCascade.cxx b/PWGCF/FemtoDream/Tasks/femtoDreamPairTaskTrackCascade.cxx index 57bda826deb..c632d4648c8 100644 --- a/PWGCF/FemtoDream/Tasks/femtoDreamPairTaskTrackCascade.cxx +++ b/PWGCF/FemtoDream/Tasks/femtoDreamPairTaskTrackCascade.cxx @@ -120,7 +120,8 @@ struct femtoDreamPairTaskTrackCascade { Configurable PtMax{"PtMax", 999., "Maximum pT of Partricle 2 (V0)"}; Configurable EtaMin{"EtaMin", -10., "Minimum eta of Partricle 2 (V0)"}; Configurable EtaMax{"EtaMax", 10., "Maximum eta of Partricle 2 (V0)"}; - Configurable UseChildCuts{"UseChildCuts", true, "Use cuts on the children of the Cascades additional to those of the selection of the cascade builder"}; + Configurable UseChildCuts{"UseChildCuts", true, "Use cuts on the children of the Cascades additional to those of the selection of the cascade builder (for debugging purposes)"}; + Configurable UseChildPIDCuts{"UseChildPIDCuts", true, "Use PID cuts on the children of the Cascades additional to those of the selection of the cascade builder (for debugging purposes)"}; } Cascade2; /// Partition for particle 2 Partition PartitionCascade2 = (aod::femtodreamparticle::partType == uint8_t(aod::femtodreamparticle::ParticleType::kCascade)) && @@ -190,11 +191,11 @@ struct femtoDreamPairTaskTrackCascade { colBinningMultPercentile = {{Mixing.BinVztx, Mixing.BinMultPercentile}, true}; colBinningMultMultPercentile = {{Mixing.BinVztx, Mixing.BinMult, Mixing.BinMultPercentile}, true}; eventHisto.init(&Registry, Option.IsMC); - trackHistoPartOne.init(&Registry, Binning.multTempFit, Option.Dummy, Binning.pTTrack, Option.Dummy, Option.Dummy, Binning.TempFitVarTrack, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.IsMC, Track1.PDGCode); - trackHistoPartTwo.init(&Registry, Binning.multTempFit, Option.Dummy, Binning.pTCascade, Option.Dummy, Option.Dummy, Binning.TempFitVarCascade, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Binning.InvMass, Option.IsMC, Cascade2.PDGCode); - posChildHistos.init(&Registry, Binning.multTempFit, Option.Dummy, Binning.pTCascadeChild, Option.Dummy, Option.Dummy, Binning.TempFitVarCascadeChild, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, false, 0); - negChildHistos.init(&Registry, Binning.multTempFit, Option.Dummy, Binning.pTCascadeChild, Option.Dummy, Option.Dummy, Binning.TempFitVarCascadeChild, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, false, 0); - bachChildHistos.init(&Registry, Binning.multTempFit, Option.Dummy, Binning.pTCascadeChild, Option.Dummy, Option.Dummy, Binning.TempFitVarCascadeChild, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, false, 0); + trackHistoPartOne.init(&Registry, Binning.multTempFit, Option.Dummy, Binning.pTTrack, Option.Dummy, Option.Dummy, Binning.TempFitVarTrack, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.IsMC, Track1.PDGCode); + trackHistoPartTwo.init(&Registry, Binning.multTempFit, Option.Dummy, Binning.pTCascade, Option.Dummy, Option.Dummy, Binning.TempFitVarCascade, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Binning.InvMass, Option.Dummy, Option.IsMC, Cascade2.PDGCode); + posChildHistos.init(&Registry, Binning.multTempFit, Option.Dummy, Binning.pTCascadeChild, Option.Dummy, Option.Dummy, Binning.TempFitVarCascadeChild, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, false, 0); + negChildHistos.init(&Registry, Binning.multTempFit, Option.Dummy, Binning.pTCascadeChild, Option.Dummy, Option.Dummy, Binning.TempFitVarCascadeChild, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, false, 0); + bachChildHistos.init(&Registry, Binning.multTempFit, Option.Dummy, Binning.pTCascadeChild, Option.Dummy, Option.Dummy, Binning.TempFitVarCascadeChild, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, false, 0); sameEventCont.init(&Registry, Binning.kstar, Binning.pT, Binning.kT, Binning.mT, Mixing.BinMult, Mixing.BinMultPercentile, Binning4D.kstar, Binning4D.mT, Binning4D.Mult, Binning4D.multPercentile, @@ -239,16 +240,20 @@ struct femtoDreamPairTaskTrackCascade { // auto posChild = v0.template children_as().front(); // auto negChild = v0.template children_as().back(); // check cuts on V0 children - - if (Cascade2.UseChildCuts && - !(((posChild.cut() & Cascade2.ChildPos_CutBit) == Cascade2.ChildPos_CutBit) && - ((posChild.pidcut() & Cascade2.ChildPos_TPCBit) == Cascade2.ChildPos_TPCBit) && - ((negChild.cut() & Cascade2.ChildNeg_CutBit) == Cascade2.ChildNeg_CutBit) && - ((negChild.pidcut() & Cascade2.ChildNeg_TPCBit) == Cascade2.ChildNeg_TPCBit) && - ((bachChild.cut() & Cascade2.ChildBach_CutBit) == Cascade2.ChildBach_CutBit) && - ((bachChild.pidcut() & Cascade2.ChildBach_TPCBit) == Cascade2.ChildBach_TPCBit))) { - continue; - } // cutbit + if (Cascade2.UseChildCuts) { + if (!(((posChild.cut() & Cascade2.ChildPos_CutBit) == Cascade2.ChildPos_CutBit) && + ((negChild.cut() & Cascade2.ChildNeg_CutBit) == Cascade2.ChildNeg_CutBit) && + ((bachChild.cut() & Cascade2.ChildBach_CutBit) == Cascade2.ChildBach_CutBit))) { + continue; + } + } + if (Cascade2.UseChildPIDCuts) { + if (!(((posChild.pidcut() & Cascade2.ChildPos_TPCBit) == Cascade2.ChildPos_TPCBit) && + ((negChild.pidcut() & Cascade2.ChildNeg_TPCBit) == Cascade2.ChildNeg_TPCBit) && + ((bachChild.pidcut() & Cascade2.ChildBach_TPCBit) == Cascade2.ChildBach_TPCBit))) { + continue; + } + } trackHistoPartTwo.fillQA(casc, aod::femtodreamparticle::kPt, col.multNtr(), col.multV0M()); posChildHistos.fillQA(posChild, aod::femtodreamparticle::kPt, col.multNtr(), col.multV0M()); negChildHistos.fillQA(negChild, aod::femtodreamparticle::kPt, col.multNtr(), col.multV0M()); @@ -259,16 +264,21 @@ struct femtoDreamPairTaskTrackCascade { const auto& posChild = parts.iteratorAt(p2.index() - 3); const auto& negChild = parts.iteratorAt(p2.index() - 2); const auto& bachChild = parts.iteratorAt(p2.index() - 1); - // cuts on Cascade children still need to be applied - if (Cascade2.UseChildCuts && - !(((posChild.cut() & Cascade2.ChildPos_CutBit) == Cascade2.ChildPos_CutBit) && - ((posChild.pidcut() & Cascade2.ChildPos_TPCBit) == Cascade2.ChildPos_TPCBit) && - ((negChild.cut() & Cascade2.ChildNeg_CutBit) == Cascade2.ChildNeg_CutBit) && - ((negChild.pidcut() & Cascade2.ChildNeg_TPCBit) == Cascade2.ChildNeg_TPCBit) && - ((bachChild.cut() & Cascade2.ChildBach_CutBit) == Cascade2.ChildBach_CutBit) && - ((bachChild.pidcut() & Cascade2.ChildBach_TPCBit) == Cascade2.ChildBach_TPCBit))) { - continue; + // cuts on Cascade children still need to be applied + if (Cascade2.UseChildCuts) { + if (!(((posChild.cut() & Cascade2.ChildPos_CutBit) == Cascade2.ChildPos_CutBit) && + ((negChild.cut() & Cascade2.ChildNeg_CutBit) == Cascade2.ChildNeg_CutBit) && + ((bachChild.cut() & Cascade2.ChildBach_CutBit) == Cascade2.ChildBach_CutBit))) { + continue; + } + } + if (Cascade2.UseChildPIDCuts) { + if (!(((posChild.pidcut() & Cascade2.ChildPos_TPCBit) == Cascade2.ChildPos_TPCBit) && + ((negChild.pidcut() & Cascade2.ChildNeg_TPCBit) == Cascade2.ChildNeg_TPCBit) && + ((bachChild.pidcut() & Cascade2.ChildBach_TPCBit) == Cascade2.ChildBach_TPCBit))) { + continue; + } } if (Option.CPROn.value) { if ((p1.cut() & kSignPlusMask) == kSignPlusMask) { @@ -281,6 +291,7 @@ struct femtoDreamPairTaskTrackCascade { } } } + if (!pairCleaner.isCleanPair(p1, p2, parts)) { continue; } @@ -320,15 +331,21 @@ struct femtoDreamPairTaskTrackCascade { const auto& negChild = parts.iteratorAt(p2.index() - 2); const auto& bachChild = parts.iteratorAt(p2.index() - 1); // check cuts on Cascade children - if (Cascade2.UseChildCuts && - !(((posChild.cut() & Cascade2.ChildPos_CutBit) == Cascade2.ChildPos_CutBit) && - ((posChild.pidcut() & Cascade2.ChildPos_TPCBit) == Cascade2.ChildPos_TPCBit) && - ((negChild.cut() & Cascade2.ChildNeg_CutBit) == Cascade2.ChildNeg_CutBit) && - ((negChild.pidcut() & Cascade2.ChildNeg_TPCBit) == Cascade2.ChildNeg_TPCBit) && - ((bachChild.cut() & Cascade2.ChildBach_CutBit) == Cascade2.ChildBach_CutBit) && - ((bachChild.pidcut() & Cascade2.ChildBach_TPCBit) == Cascade2.ChildBach_TPCBit))) { - continue; + if (Cascade2.UseChildCuts) { + if (!(((posChild.cut() & Cascade2.ChildPos_CutBit) == Cascade2.ChildPos_CutBit) && + ((negChild.cut() & Cascade2.ChildNeg_CutBit) == Cascade2.ChildNeg_CutBit) && + ((bachChild.cut() & Cascade2.ChildBach_CutBit) == Cascade2.ChildBach_CutBit))) { + continue; + } } + if (Cascade2.UseChildPIDCuts) { + if (!(((posChild.pidcut() & Cascade2.ChildPos_TPCBit) == Cascade2.ChildPos_TPCBit) && + ((negChild.pidcut() & Cascade2.ChildNeg_TPCBit) == Cascade2.ChildNeg_TPCBit) && + ((bachChild.pidcut() & Cascade2.ChildBach_TPCBit) == Cascade2.ChildBach_TPCBit))) { + continue; + } + } + if (Option.CPROn.value) { if ((p1.cut() & kSignPlusMask) == kSignPlusMask) { if (pairCloseRejectionME.isClosePair(p1, posChild, parts, collision1.magField())) { diff --git a/PWGCF/FemtoDream/Tasks/femtoDreamPairTaskTrackTrack.cxx b/PWGCF/FemtoDream/Tasks/femtoDreamPairTaskTrackTrack.cxx index 371324a96e8..5cfd8664985 100644 --- a/PWGCF/FemtoDream/Tasks/femtoDreamPairTaskTrackTrack.cxx +++ b/PWGCF/FemtoDream/Tasks/femtoDreamPairTaskTrackTrack.cxx @@ -242,9 +242,9 @@ struct femtoDreamPairTaskTrackTrack { random = new TRandom3(0); } eventHisto.init(&Registry, Option.IsMC); - trackHistoPartOne.init(&Registry, Binning.multTempFit, Option.Dummy, Binning.TrackpT, Option.Dummy, Option.Dummy, Binning.TempFitVar, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.IsMC, Track1.PDGCode); + trackHistoPartOne.init(&Registry, Binning.multTempFit, Option.Dummy, Binning.TrackpT, Option.Dummy, Option.Dummy, Binning.TempFitVar, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.IsMC, Track1.PDGCode); if (!Option.SameSpecies) { - trackHistoPartTwo.init(&Registry, Binning.multTempFit, Option.Dummy, Binning.TrackpT, Option.Dummy, Option.Dummy, Binning.TempFitVar, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.IsMC, Track2.PDGCode); + trackHistoPartTwo.init(&Registry, Binning.multTempFit, Option.Dummy, Binning.TrackpT, Option.Dummy, Option.Dummy, Binning.TempFitVar, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.IsMC, Track2.PDGCode); } sameEventCont.init(&Registry, diff --git a/PWGCF/FemtoDream/Tasks/femtoDreamPairTaskTrackV0.cxx b/PWGCF/FemtoDream/Tasks/femtoDreamPairTaskTrackV0.cxx index dbaaacedfe8..fccbb1716a8 100644 --- a/PWGCF/FemtoDream/Tasks/femtoDreamPairTaskTrackV0.cxx +++ b/PWGCF/FemtoDream/Tasks/femtoDreamPairTaskTrackV0.cxx @@ -234,10 +234,10 @@ struct femtoDreamPairTaskTrackV0 { colBinningMultMultPercentile = {{Mixing.BinVztx, Mixing.BinMult, Mixing.BinMultPercentile}, true}; eventHisto.init(&Registry, Option.IsMC); - trackHistoPartOne.init(&Registry, Binning.multTempFit, Option.Dummy, Binning.pTTrack, Option.Dummy, Option.Dummy, Binning.TempFitVarTrack, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.IsMC, Track1.PDGCode); - trackHistoPartTwo.init(&Registry, Binning.multTempFit, Option.Dummy, Binning.pTV0, Option.Dummy, Option.Dummy, Binning.TempFitVarV0, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Binning.InvMass, Option.IsMC, V02.PDGCode); - posChildHistos.init(&Registry, Binning.multTempFit, Option.Dummy, Binning.pTV0Child, Option.Dummy, Option.Dummy, Binning.TempFitVarV0Child, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, false, 0); - negChildHistos.init(&Registry, Binning.multTempFit, Option.Dummy, Binning.pTV0Child, Option.Dummy, Option.Dummy, Binning.TempFitVarV0Child, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, false, 0); + trackHistoPartOne.init(&Registry, Binning.multTempFit, Option.Dummy, Binning.pTTrack, Option.Dummy, Option.Dummy, Binning.TempFitVarTrack, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.IsMC, Track1.PDGCode); + trackHistoPartTwo.init(&Registry, Binning.multTempFit, Option.Dummy, Binning.pTV0, Option.Dummy, Option.Dummy, Binning.TempFitVarV0, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Binning.InvMass, Option.Dummy, Option.IsMC, V02.PDGCode); + posChildHistos.init(&Registry, Binning.multTempFit, Option.Dummy, Binning.pTV0Child, Option.Dummy, Option.Dummy, Binning.TempFitVarV0Child, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, false, 0); + negChildHistos.init(&Registry, Binning.multTempFit, Option.Dummy, Binning.pTV0Child, Option.Dummy, Option.Dummy, Binning.TempFitVarV0Child, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, Option.Dummy, false, 0); sameEventCont.init(&Registry, Binning.kstar, Binning.pT, Binning.kT, Binning.mT, Mixing.BinMult, Mixing.BinMultPercentile, diff --git a/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackTrack.cxx b/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackTrack.cxx index 10f59840862..811deab4bb2 100644 --- a/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackTrack.cxx +++ b/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackTrack.cxx @@ -138,8 +138,8 @@ struct femtoDreamTripletTaskTrackTrackTrack { colBinning = {{ConfVtxBins, ConfMultBins}, true}; - trackHistoSelectedParts.init(&qaRegistry, ConfBinmultTempFit, ConfDummy, ConfTempFitVarpTBins, ConfDummy, ConfDummy, ConfTempFitVarBins, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfIsMC, ConfPDGCodePart); - trackHistoALLSelectedParts.init(&qaRegistry, ConfBinmultTempFit, ConfDummy, ConfTempFitVarpTBins, ConfDummy, ConfDummy, ConfTempFitVarBins, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfIsMC, ConfPDGCodePart); + trackHistoSelectedParts.init(&qaRegistry, ConfBinmultTempFit, ConfDummy, ConfTempFitVarpTBins, ConfDummy, ConfDummy, ConfTempFitVarBins, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfIsMC, ConfPDGCodePart); + trackHistoALLSelectedParts.init(&qaRegistry, ConfBinmultTempFit, ConfDummy, ConfTempFitVarpTBins, ConfDummy, ConfDummy, ConfTempFitVarBins, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfIsMC, ConfPDGCodePart); ThreeBodyQARegistry.add("TripletTaskQA/hSECollisionBins", ";bin;Entries", kTH1F, {{120, -0.5, 119.5}}); ThreeBodyQARegistry.add("TripletTaskQA/hMECollisionBins", ";bin;Entries", kTH1F, {{120, -0.5, 119.5}}); diff --git a/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackV0.cxx b/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackV0.cxx index b61191caeb5..224515339c9 100644 --- a/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackV0.cxx +++ b/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackV0.cxx @@ -189,14 +189,14 @@ struct femtoDreamTripletTaskTrackTrackV0 { colBinning = {{ConfVtxBins, ConfMultBins}, true}; - trackHistoSelectedParts.init(&qaRegistry, ConfDummy, ConfDummy, ConfTempFitVarpTBins, ConfDummy, ConfDummy, ConfTempFitVarBinsTrack, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfIsMC, ConfPDGCodePart); - trackHistoALLSelectedParts.init(&qaRegistry, ConfDummy, ConfDummy, ConfTempFitVarpTBins, ConfDummy, ConfDummy, ConfTempFitVarBinsTrack, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfIsMC, ConfPDGCodePart); - particleHistoSelectedV0s.init(&qaRegistry, ConfDummy, ConfDummy, ConfTempFitVarpTV0Bins, ConfDummy, ConfDummy, ConfTempFitVarBinsV0, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfInvMassBins, ConfIsMC, ConfPDGCodeV0); - particleHistoPosChild.init(&qaRegistry, ConfDummy, ConfDummy, ConfTempFitVarpTV0Child, ConfDummy, ConfDummy, ConfTempFitVarBinsV0Child, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfIsMC, 0); - particleHistoNegChild.init(&qaRegistry, ConfDummy, ConfDummy, ConfTempFitVarpTV0Child, ConfDummy, ConfDummy, ConfTempFitVarBinsV0Child, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfIsMC, 0); - particleHistoALLSelectedV0s.init(&qaRegistry, ConfDummy, ConfDummy, ConfTempFitVarpTV0Bins, ConfDummy, ConfDummy, ConfTempFitVarBinsV0, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfInvMassBins, ConfIsMC, ConfPDGCodeV0); - particleHistoALLPosChild.init(&qaRegistry, ConfDummy, ConfDummy, ConfTempFitVarpTV0Child, ConfDummy, ConfDummy, ConfTempFitVarBinsV0Child, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfIsMC, 0); - particleHistoALLNegChild.init(&qaRegistry, ConfDummy, ConfDummy, ConfTempFitVarpTV0Child, ConfDummy, ConfDummy, ConfTempFitVarBinsV0Child, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfIsMC, 0); + trackHistoSelectedParts.init(&qaRegistry, ConfDummy, ConfDummy, ConfTempFitVarpTBins, ConfDummy, ConfDummy, ConfTempFitVarBinsTrack, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfIsMC, ConfPDGCodePart); + trackHistoALLSelectedParts.init(&qaRegistry, ConfDummy, ConfDummy, ConfTempFitVarpTBins, ConfDummy, ConfDummy, ConfTempFitVarBinsTrack, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfIsMC, ConfPDGCodePart); + particleHistoSelectedV0s.init(&qaRegistry, ConfDummy, ConfDummy, ConfTempFitVarpTV0Bins, ConfDummy, ConfDummy, ConfTempFitVarBinsV0, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfInvMassBins, ConfDummy, ConfIsMC, ConfPDGCodeV0); + particleHistoPosChild.init(&qaRegistry, ConfDummy, ConfDummy, ConfTempFitVarpTV0Child, ConfDummy, ConfDummy, ConfTempFitVarBinsV0Child, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfIsMC, 0); + particleHistoNegChild.init(&qaRegistry, ConfDummy, ConfDummy, ConfTempFitVarpTV0Child, ConfDummy, ConfDummy, ConfTempFitVarBinsV0Child, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfIsMC, 0); + particleHistoALLSelectedV0s.init(&qaRegistry, ConfDummy, ConfDummy, ConfTempFitVarpTV0Bins, ConfDummy, ConfDummy, ConfTempFitVarBinsV0, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfInvMassBins, ConfDummy, ConfIsMC, ConfPDGCodeV0); + particleHistoALLPosChild.init(&qaRegistry, ConfDummy, ConfDummy, ConfTempFitVarpTV0Child, ConfDummy, ConfDummy, ConfTempFitVarBinsV0Child, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfIsMC, 0); + particleHistoALLNegChild.init(&qaRegistry, ConfDummy, ConfDummy, ConfTempFitVarpTV0Child, ConfDummy, ConfDummy, ConfTempFitVarBinsV0Child, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfDummy, ConfIsMC, 0); ThreeBodyQARegistry.add("TripletTaskQA/hSECollisionBins", ";bin;Entries", kTH1F, {{120, -0.5, 119.5}}); ThreeBodyQARegistry.add("TripletTaskQA/hMECollisionBins", ";bin;Entries", kTH1F, {{120, -0.5, 119.5}}); diff --git a/PWGCF/FemtoDream/Utils/femtoDreamCutCulator.h b/PWGCF/FemtoDream/Utils/femtoDreamCutCulator.h index 32aaa6599ec..f36fd80481a 100644 --- a/PWGCF/FemtoDream/Utils/femtoDreamCutCulator.h +++ b/PWGCF/FemtoDream/Utils/femtoDreamCutCulator.h @@ -60,7 +60,7 @@ class FemtoDreamCutculator // check the config file for all known producer task std::vector ProducerTasks = { - "femto-dream-producer-task", "femto-dream-producer-reduced-task"}; + "femto-dream-producer-task", "femto-dream-producer-reduced-task", "femto-dream-producer-task-with-cascades"}; for (auto& Producer : ProducerTasks) { if (root.count(Producer) > 0) { mConfigTree = root.get_child(Producer); diff --git a/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx b/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx index 8cadade3d8f..535ce98e07b 100644 --- a/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx +++ b/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx @@ -231,7 +231,9 @@ struct HfFemtoDreamProducer { -999., -999., -999., -999., -999., -999., -999., -999., -999., -999., -999., -999., - -999., -999., -999., -999.); + -999., -999., -999., -999., + -999., -999., -999., -999., + -999., -999., -999.); } template diff --git a/PWGHF/HFC/Tasks/taskCharmHadronsFemtoDream.cxx b/PWGHF/HFC/Tasks/taskCharmHadronsFemtoDream.cxx index 9faaa37360a..5030a9f50a0 100644 --- a/PWGHF/HFC/Tasks/taskCharmHadronsFemtoDream.cxx +++ b/PWGHF/HFC/Tasks/taskCharmHadronsFemtoDream.cxx @@ -204,8 +204,8 @@ struct HfTaskCharmHadronsFemtoDream { colBinningMultPercentile = {{mixingBinVztx, mixingBinMultPercentile}, true}; colBinningMultMultPercentile = {{mixingBinVztx, mixingBinMult, mixingBinMultPercentile}, true}; eventHisto.init(®istry); - allTrackHisto.init(®istry, binmultTempFit, binMulPercentile, binpTTrack, binEta, binPhi, binTempFitVarTrack, binNSigmaTPC, binNSigmaTOF, binNSigmaTPCTOF, binTPCClusters, dummy, isMc, pdgCodeTrack1, true); - selectedTrackHisto.init(®istry, binmultTempFit, binMulPercentile, binpTTrack, binEta, binPhi, binTempFitVarTrack, binNSigmaTPC, binNSigmaTOF, binNSigmaTPCTOF, binTPCClusters, dummy, isMc, pdgCodeTrack1, true); + allTrackHisto.init(®istry, binmultTempFit, binMulPercentile, binpTTrack, binEta, binPhi, binTempFitVarTrack, binNSigmaTPC, binNSigmaTOF, binNSigmaTPCTOF, binTPCClusters, dummy, dummy, isMc, pdgCodeTrack1, true); + selectedTrackHisto.init(®istry, binmultTempFit, binMulPercentile, binpTTrack, binEta, binPhi, binTempFitVarTrack, binNSigmaTPC, binNSigmaTOF, binNSigmaTPCTOF, binTPCClusters, dummy, dummy, isMc, pdgCodeTrack1, true); sameEventCont.init(®istry, binkstar, binpTTrack, binkT, binmT, mixingBinMult, mixingBinMultPercentile, From 8a77b3fe4f56bf2f0c881da264d99082e222e04c Mon Sep 17 00:00:00 2001 From: Victor Gonzalez Date: Sat, 22 Feb 2025 23:46:44 +0100 Subject: [PATCH 0381/1650] [PWGCF] DptDpt - Proper placement of the Nch histogram (#10144) Co-authored-by: Victor --- PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx index 46c2014f208..af1645ba36f 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx @@ -286,7 +286,7 @@ struct QADataCollectingEngine { fhPhiVsPtA[isp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "After"), HNAMESTRING("PhiVsPt_%s", tnames[isp].c_str()), HTITLESTRING("#varphi %s (mod(2#pi/18))", tnames[isp].c_str()), kTH2F, {pidPtAxis, phiSectorAxis}); fhNchVsPhiVsPtA[isp] = ADDHISTOGRAM(TH3, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "After"), HNAMESTRING("NchVsPhiVsPt_%s", tnames[isp].c_str()), HTITLESTRING("#it{N}_{ch}^{%s} #varphi (mod(2#pi/18))", tnames[isp].c_str()), kTH3F, {pidPtAxisReduced, phiSectorAxisReduced, nChargeAxis}); fhPhiVsInnerWallMomA[isp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "After"), HNAMESTRING("PhiVsIwMom_%s", tnames[isp].c_str()), HTITLESTRING("#varphi %s (mod(2#pi/18)) TPC_{iw} #it{p}", tnames[isp].c_str()), kTH2F, {pidPAxis, phiSectorAxis}); - fhNchVsPhiVsInnerWallMomA[isp] = ADDHISTOGRAM(TH3, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "Before"), HNAMESTRING("NchVsPhiVsIwMom_%s", tnames[isp].c_str()), HTITLESTRING("#it{N}_{ch}^{%s} #varphi (mod(2#pi/18)) TPC_{iw} #it{p}", tnames[isp].c_str()), kTH3F, {pidPAxisReduced, phiSectorAxisReduced, nChargeAxis}); + fhNchVsPhiVsInnerWallMomA[isp] = ADDHISTOGRAM(TH3, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "After"), HNAMESTRING("NchVsPhiVsIwMom_%s", tnames[isp].c_str()), HTITLESTRING("#it{N}_{ch}^{%s} #varphi (mod(2#pi/18)) TPC_{iw} #it{p}", tnames[isp].c_str()), kTH3F, {pidPAxisReduced, phiSectorAxisReduced, nChargeAxis}); fhPhiShiftedVsPtA[isp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "After"), HNAMESTRING("PhiShiftedVsPt_%s", tnames[isp].c_str()), HTITLESTRING("%s TPC sector %%", tnames[isp].c_str()), kTH2F, {pidPtAxis, phiShiftedSectorAxis}); fhPhiShiftedVsInnerWallMomA[isp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "After"), HNAMESTRING("PhiShiftedVsIwMom_%s", tnames[isp].c_str()), HTITLESTRING("%s TPC sector %% TPC_{iw} #it{p}", tnames[isp].c_str()), kTH2F, {pidPAxis, phiShiftedSectorAxis}); fhItsNClsVsPtA[isp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "After"), HNAMESTRING("ITSNCls_%s", tnames[isp].c_str()), HTITLESTRING("ITS clusters %s", tnames[isp].c_str()), kTH2F, {ptAxis, itsNClsAxis}); From 27eed61a6784ed965573760d9c777471f328d3a4 Mon Sep 17 00:00:00 2001 From: Junlee Kim Date: Mon, 24 Feb 2025 09:05:05 +0100 Subject: [PATCH 0382/1650] [PWGLF] add acceptance correction on the fly (#10143) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Strangeness/lambdapolarization.cxx | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdapolarization.cxx b/PWGLF/Tasks/Strangeness/lambdapolarization.cxx index 489b70cc9b7..a22630d3b1c 100644 --- a/PWGLF/Tasks/Strangeness/lambdapolarization.cxx +++ b/PWGLF/Tasks/Strangeness/lambdapolarization.cxx @@ -125,6 +125,7 @@ struct lambdapolarization { Configurable cfgQvecRefBName{"cfgQvecRefBName", "TPCneg", "The name of detector for reference B"}; Configurable cfgPhiDepStudy{"cfgPhiDepStudy", false, "cfg for phi dependent study"}; + Configurable cfgUSESP{"cfgUSESP", false, "cfg for sp"}; Configurable cfgPhiDepSig{"cfgPhiDepSig", 0.2, "cfg for significance on phi dependent study"}; Configurable cfgShiftCorr{"cfgShiftCorr", false, "additional shift correction"}; @@ -134,6 +135,9 @@ struct lambdapolarization { Configurable cfgEffCor{"cfgEffCor", false, "flag to apply efficiency correction"}; Configurable cfgEffCorPath{"cfgEffCorPath", "", "path for pseudo efficiency correction"}; + Configurable cfgAccCor{"cfgAccCor", false, "flag to apply acceptance correction"}; + Configurable cfgAccCorPath{"cfgAccCorPath", "", "path for pseudo acceptance correction"}; + Configurable cfgCalcCum{"cfgCalcCum", false, "flag to calculate cumulants"}; Configurable cfgRapidityDep{"cfgRapidityDep", false, "flag for rapidity dependent study"}; @@ -167,6 +171,7 @@ struct lambdapolarization { int lastRunNumber = -999; std::vector shiftprofile{}; TProfile2D* EffMap = nullptr; + TProfile2D* AccMap = nullptr; std::string fullCCDBShiftCorrPath; @@ -697,9 +702,13 @@ struct lambdapolarization { 1.0 / EffMap->GetBinContent(EffMap->GetXaxis()->FindBin(v0.pt()), EffMap->GetYaxis()->FindBin(centrality))); } } + double weight = 1.0; + weight *= cfgEffCor ? 1.0 / EffMap->GetBinContent(EffMap->GetXaxis()->FindBin(v0.pt()), EffMap->GetYaxis()->FindBin(centrality)) : 1.; + weight *= cfgAccCor ? 1.0 / AccMap->GetBinContent(AccMap->GetXaxis()->FindBin(v0.pt()), AccMap->GetYaxis()->FindBin(v0.yLambda())) : 1.; - double weight = cfgEffCor ? 1.0 / EffMap->GetBinContent(EffMap->GetXaxis()->FindBin(v0.pt()), EffMap->GetYaxis()->FindBin(centrality)) : 1.; - double qvecMag = TMath::Sqrt(TMath::Power(collision.qvecIm()[3 + (nmode - 2) * 28], 2) + TMath::Power(collision.qvecRe()[3 + (nmode - 2) * 28], 2)); + double qvecMag = 1.0; + if (cfgUSESP) + qvecMag *= TMath::Sqrt(TMath::Power(collision.qvecIm()[3 + (nmode - 2) * 28], 2) + TMath::Power(collision.qvecRe()[3 + (nmode - 2) * 28], 2)); if (nmode == 2) { //////////// if (LambdaTag) { @@ -864,10 +873,13 @@ struct lambdapolarization { lastRunNumber = currentRunNumber; } } + auto bc = collision.bc_as(); if (cfgEffCor) { - auto bc = collision.bc_as(); EffMap = ccdb->getForTimeStamp(cfgEffCorPath.value, bc.timestamp()); } + if (cfgAccCor) { + AccMap = ccdb->getForTimeStamp(cfgAccCorPath.value, bc.timestamp()); + } for (int i = 2; i < cfgnMods + 2; i++) { if (cfgShiftCorrDef) { FillShiftCorrection(collision, i); From ff04b94391da43462ec6277b301f9341696ed486 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Mon, 24 Feb 2025 19:39:04 +0900 Subject: [PATCH 0383/1650] [PWGEM/Dilepton] remove unused table in treeCreatorElectronMLDDA.cxx (#10146) --- .../treeCreatorElectronMLDDA.cxx | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx index 66221a1e2a3..fc07180c8c4 100644 --- a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx +++ b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx @@ -49,7 +49,7 @@ using namespace o2::framework::expressions; using namespace o2::soa; using namespace o2::constants::physics; -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; using MyTracks = soa::Join -990) { d_bz = d_bz_input; o2::parameters::GRPMagField grpmag; - if (fabs(d_bz) > 1e-5) { + if (std::fabs(d_bz) > 1e-5) { grpmag.setL3Current(30000.f / (d_bz / 5.0f)); } o2::base::Propagator::initFieldFromGRP(&grpmag); @@ -340,7 +340,7 @@ struct TreeCreatorElectronMLDDA { } template - bool IsSelectedTrack(TTrack const& track) + bool isSelectedTrack(TTrack const& track) { if (std::fabs(track.eta()) > trackcuts.cfg_max_eta || track.pt() < trackcuts.cfg_min_pt) { return false; @@ -383,7 +383,7 @@ struct TreeCreatorElectronMLDDA { } template - bool IsSelectedV0Leg(TTrack const& track) + bool isSelectedV0Leg(TTrack const& track) { if (std::fabs(track.eta()) > v0cuts.cfg_max_eta || track.pt() < v0cuts.cfg_min_pt) { return false; @@ -426,7 +426,7 @@ struct TreeCreatorElectronMLDDA { } template - bool IsElectron(TTrack const& track) + bool isElectron(TTrack const& track) { bool is_El_TPC = v0cuts.cfg_min_TPCNsigmaEl < track.tpcNSigmaEl() && track.tpcNSigmaEl() < v0cuts.cfg_max_TPCNsigmaEl; bool is_El_TOF = track.hasTOF() ? v0cuts.cfg_min_TOFNsigmaEl < track.tofNSigmaEl() && track.tofNSigmaEl() < v0cuts.cfg_max_TOFNsigmaEl : true; // TOFif @@ -434,7 +434,7 @@ struct TreeCreatorElectronMLDDA { } template - bool IsPion(TTrack const& track) + bool isPion(TTrack const& track) { bool is_Pi_TPC = v0cuts.cfg_min_TPCNsigmaPi < track.tpcNSigmaPi() && track.tpcNSigmaPi() < v0cuts.cfg_max_TPCNsigmaPi; bool is_Pi_TOF = track.hasTOF() ? v0cuts.cfg_min_TOFNsigmaPi < track.tofNSigmaPi() && track.tofNSigmaPi() < v0cuts.cfg_max_TOFNsigmaPi : true; // TOFif @@ -442,7 +442,7 @@ struct TreeCreatorElectronMLDDA { } template - bool IsKaon(TTrack const& track) + bool isKaon(TTrack const& track) { bool is_Ka_TPC = v0cuts.cfg_min_TPCNsigmaKa < track.tpcNSigmaKa() && track.tpcNSigmaKa() < v0cuts.cfg_max_TPCNsigmaKa; bool is_Ka_TOF = track.hasTOF() ? v0cuts.cfg_min_TOFNsigmaKa < track.tofNSigmaKa() && track.tofNSigmaKa() < v0cuts.cfg_max_TOFNsigmaKa : true; // TOFif @@ -450,7 +450,7 @@ struct TreeCreatorElectronMLDDA { } template - bool IsProton(TTrack const& track) + bool isProton(TTrack const& track) { bool is_Pr_TPC = v0cuts.cfg_min_TPCNsigmaPr < track.tpcNSigmaPr() && track.tpcNSigmaPr() < v0cuts.cfg_max_TPCNsigmaPr; bool is_Pr_TOF = track.hasTOF() ? v0cuts.cfg_min_TOFNsigmaPr < track.tofNSigmaPr() && track.tofNSigmaPr() < v0cuts.cfg_max_TOFNsigmaPr : true; // TOFif @@ -458,7 +458,7 @@ struct TreeCreatorElectronMLDDA { } template - bool IsPionTight(TTrack const& track) + bool isPionTight(TTrack const& track) { bool is_Pi_TPC = v0cuts.cfg_min_TPCNsigmaPi_tight < track.tpcNSigmaPi() && track.tpcNSigmaPi() < v0cuts.cfg_max_TPCNsigmaPi_tight; bool is_Pi_TOF = track.hasTOF() ? v0cuts.cfg_min_TOFNsigmaPi_tight < track.tofNSigmaPi() && track.tofNSigmaPi() < v0cuts.cfg_max_TOFNsigmaPi_tight : true; // TOFif @@ -466,7 +466,7 @@ struct TreeCreatorElectronMLDDA { } template - bool IsProtonTight(TTrack const& track) + bool isProtonTight(TTrack const& track) { bool is_Pr_TPC = v0cuts.cfg_min_TPCNsigmaPr_tight < track.tpcNSigmaPr() && track.tpcNSigmaPr() < v0cuts.cfg_max_TPCNsigmaPr_tight; bool is_Pr_TOF = track.hasTOF() ? v0cuts.cfg_min_TOFNsigmaPr_tight < track.tofNSigmaPr() && track.tofNSigmaPr() < v0cuts.cfg_max_TOFNsigmaPr_tight : true; // TOFif @@ -510,17 +510,17 @@ struct TreeCreatorElectronMLDDA { void processPID(filteredMyCollisions const& collisions, aod::BCsWithTimestamps const&, filteredV0s const& v0s, filteredCascades const& cascades, MyTracks const& tracks) { stored_trackIds.reserve(tracks.size()); - for (auto& collision : collisions) { + for (const auto& collision : collisions) { registry.fill(HIST("hEventCounter"), 1.0); // all auto bc = collision.template foundBC_as(); initCCDB(bc); auto v0s_coll = v0s.sliceBy(perCollision_v0, collision.globalIndex()); - for (auto& v0 : v0s_coll) { + for (const auto& v0 : v0s_coll) { auto pos = v0.template posTrack_as(); auto neg = v0.template negTrack_as(); - if (!IsSelectedV0Leg(pos) || !IsSelectedV0Leg(neg)) { + if (!isSelectedV0Leg(pos) || !isSelectedV0Leg(neg)) { continue; } if (pos.sign() * neg.sign() > 0) { @@ -538,7 +538,7 @@ struct TreeCreatorElectronMLDDA { continue; } - if (IsPion(pos) && IsPion(neg)) { + if (isPion(pos) && isPion(neg)) { registry.fill(HIST("V0/hMassK0Short"), v0.mK0Short()); if (v0cuts.cfg_min_mass_k0s < v0.mK0Short() && v0.mK0Short() < v0cuts.cfg_max_mass_k0s) { registry.fill(HIST("V0/hTPCdEdx_P_Pi"), neg.p(), neg.tpcSignal()); @@ -553,7 +553,7 @@ struct TreeCreatorElectronMLDDA { } } } - if (IsProton(pos) && IsPionTight(neg)) { + if (isProton(pos) && isPionTight(neg)) { registry.fill(HIST("V0/hMassLambda"), v0.mLambda()); if (v0cuts.cfg_min_mass_lambda < v0.mLambda() && v0.mLambda() < v0cuts.cfg_max_mass_lambda) { if (dist01(engine) < downscaling_proton) { @@ -563,7 +563,7 @@ struct TreeCreatorElectronMLDDA { registry.fill(HIST("V0/hTOFbeta_P_Pr"), pos.p(), pos.beta()); } } - if (IsPionTight(pos) && IsProton(neg)) { + if (isPionTight(pos) && isProton(neg)) { registry.fill(HIST("V0/hMassAntiLambda"), v0.mAntiLambda()); if (v0cuts.cfg_min_mass_lambda < v0.mAntiLambda() && v0.mAntiLambda() < v0cuts.cfg_max_mass_lambda) { if (dist01(engine) < downscaling_proton) { @@ -573,7 +573,7 @@ struct TreeCreatorElectronMLDDA { registry.fill(HIST("V0/hTOFbeta_P_Pr"), neg.p(), neg.beta()); } } - if (IsElectron(pos) && IsElectron(neg) && store_v0photons) { + if (isElectron(pos) && isElectron(neg) && store_v0photons) { registry.fill(HIST("V0/hMassGamma"), v0.mGamma()); registry.fill(HIST("V0/hXY_Gamma"), v0.x(), v0.y()); registry.fill(HIST("V0/hMassGamma_Rxy"), v0.v0radius(), v0.mGamma()); @@ -595,12 +595,12 @@ struct TreeCreatorElectronMLDDA { if (!store_v0photons) { auto posTracks_per_coll = posTracks->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); auto negTracks_per_coll = negTracks->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); - for (auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, negTracks_per_coll))) { - if (!IsSelectedTrack(pos) || !IsSelectedTrack(neg)) { + for (const auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, negTracks_per_coll))) { + if (!isSelectedTrack(pos) || !isSelectedTrack(neg)) { continue; } - if (!IsElectron(pos) || !IsElectron(neg)) { + if (!isElectron(pos) || !isElectron(neg)) { continue; } @@ -627,12 +627,12 @@ struct TreeCreatorElectronMLDDA { } auto cascades_coll = cascades.sliceBy(perCollision_cascade, collision.globalIndex()); - for (auto& cascade : cascades_coll) { + for (const auto& cascade : cascades_coll) { // Track casting auto bachelor = cascade.template bachelor_as(); auto pos = cascade.template posTrack_as(); auto neg = cascade.template negTrack_as(); - if (!IsSelectedV0Leg(pos) || !IsSelectedV0Leg(neg) || !IsSelectedV0Leg(bachelor)) { + if (!isSelectedV0Leg(pos) || !isSelectedV0Leg(neg) || !isSelectedV0Leg(bachelor)) { continue; } @@ -641,11 +641,11 @@ struct TreeCreatorElectronMLDDA { } if (bachelor.sign() < 0) { // Omega- -> L + K- -> p + pi- + K- - if (!IsProtonTight(pos) || !IsPionTight(neg)) { + if (!isProtonTight(pos) || !isPionTight(neg)) { continue; } } else { // Omegabar+ -> Lbar + K+ -> pbar + pi+ + K+ - if (!IsProtonTight(neg) || !IsPionTight(pos)) { + if (!isProtonTight(neg) || !isPionTight(pos)) { continue; } } @@ -690,14 +690,14 @@ struct TreeCreatorElectronMLDDA { float ctauXi = length / mom * o2::constants::physics::MassXiMinus; // 4.91 cm in PDG float ctauOmega = length / mom * o2::constants::physics::MassOmegaMinus; // 2.46 cm in PDG - if (IsPion(bachelor)) { + if (isPion(bachelor)) { registry.fill(HIST("Cascade/hMassXi"), cascade.mXi()); registry.fill(HIST("Cascade/hMassPt_Xi"), cascade.mXi(), cascade.pt()); registry.fill(HIST("Cascade/hMassPt_Xi_bachelor"), cascade.mXi(), bachelor.p()); registry.fill(HIST("Cascade/hRxy_Xi"), cascade.mXi(), cascade.cascradius()); registry.fill(HIST("Cascade/hCTau_Xi"), cascade.mXi(), ctauXi); } - if (!(cascadecuts.cfg_min_mass_Xi < cascade.mXi() && cascade.mXi() < cascadecuts.cfg_max_mass_Xi) && IsKaon(bachelor)) { // reject Xi candidates + if (!(cascadecuts.cfg_min_mass_Xi < cascade.mXi() && cascade.mXi() < cascadecuts.cfg_max_mass_Xi) && isKaon(bachelor)) { // reject Xi candidates registry.fill(HIST("Cascade/hMassOmega"), cascade.mOmega()); registry.fill(HIST("Cascade/hMassPt_Omega"), cascade.mOmega(), cascade.pt()); registry.fill(HIST("Cascade/hMassPt_Omega_bachelor"), cascade.mOmega(), bachelor.p()); @@ -714,8 +714,8 @@ struct TreeCreatorElectronMLDDA { } // end of cascade loop auto tracks_coll = tracks.sliceBy(perCollision_track, collision.globalIndex()); - for (auto& track : tracks_coll) { - if (!IsSelectedTrack(track)) { + for (const auto& track : tracks_coll) { + if (!isSelectedTrack(track)) { continue; } @@ -780,7 +780,7 @@ struct MLTrackQC { void processQC(aod::EMPrimaryTracks const& tracks) { - for (auto& track : tracks) { + for (const auto& track : tracks) { registry.fill(HIST("hTPCdEdx_P_All"), track.p(), track.tpcSignal()); registry.fill(HIST("hTOFbeta_P_All"), track.p(), track.beta()); registry.fill(HIST("hITSClusterSize_P_All"), track.p(), track.meanClusterSizeITS() * std::cos(std::atan(track.tgl()))); From d9540c799b057aab1321c77ef3e9ba3e636020aa Mon Sep 17 00:00:00 2001 From: Marcello Di Costanzo <96481191+Marcellocosti@users.noreply.github.com> Date: Mon, 24 Feb 2025 12:18:06 +0100 Subject: [PATCH 0384/1650] [PWGHF] Add table with ML outputs for reco MC (#10063) Co-authored-by: ALICE Action Bot --- .../DataModel/CandidateReconstructionTables.h | 2 + .../TableProducer/candidateCreator3Prong.cxx | 45 ++++++++----------- PWGHF/TableProducer/candidateCreatorMcGen.cxx | 6 +-- .../TableProducer/treeCreatorDplusToPiKPi.cxx | 40 ++++++++++++++++- PWGHF/Utils/utilsMcGen.h | 17 ++++--- 5 files changed, 72 insertions(+), 38 deletions(-) diff --git a/PWGHF/DataModel/CandidateReconstructionTables.h b/PWGHF/DataModel/CandidateReconstructionTables.h index 7da70658ff0..4688148d5b8 100644 --- a/PWGHF/DataModel/CandidateReconstructionTables.h +++ b/PWGHF/DataModel/CandidateReconstructionTables.h @@ -949,6 +949,8 @@ enum DecayType { DplusToPiKPi = 0, XicToPKPi, N3ProngDecays }; // always keep N3ProngDecays at the end +static const int DstarToPiKPiBkg = DecayType::N3ProngDecays; + // Ds± → K± K∓ π± or D± → K± K∓ π± enum DecayChannelDToKKPi { diff --git a/PWGHF/TableProducer/candidateCreator3Prong.cxx b/PWGHF/TableProducer/candidateCreator3Prong.cxx index 9743725dae6..3918752570c 100644 --- a/PWGHF/TableProducer/candidateCreator3Prong.cxx +++ b/PWGHF/TableProducer/candidateCreator3Prong.cxx @@ -787,11 +787,6 @@ struct HfCandidateCreator3ProngExpressions { o2::framework::Configurable matchKinkedDecayTopology{"matchKinkedDecayTopology", false, "Match also candidates with tracks that decay with kinked topology"}; o2::framework::Configurable matchInteractionsWithMaterial{"matchInteractionsWithMaterial", false, "Match also candidates with tracks that interact with material"}; - bool createDplus{false}; - bool createDs{false}; - bool createLc{false}; - bool createXic{false}; - HfEventSelectionMc hfEvSelMc; // mc event selection and monitoring using BCsInfo = soa::Join; HistogramRegistry registry{"registry"}; @@ -817,28 +812,11 @@ struct HfCandidateCreator3ProngExpressions { for (const DeviceSpec& device : workflows.devices) { if (device.name.compare("hf-candidate-creator-3prong") == 0) { hfEvSelMc.configureFromDevice(device); - for (const auto& option : device.options) { - if (option.name.compare("createDplus") == 0) { - createDplus = option.defaultValue.get(); - } else if (option.name.compare("createDs") == 0) { - createDs = option.defaultValue.get(); - } else if (option.name.compare("createLc") == 0) { - createLc = option.defaultValue.get(); - } else if (option.name.compare("createXic") == 0) { - createXic = option.defaultValue.get(); - } - } break; } } hfEvSelMc.addHistograms(registry); // particles monitoring - - LOGP(info, "Flags for candidate creation from the reco workflow:"); - LOGP(info, " --> createDplus = {}", createDplus); - LOGP(info, " --> createDs = {}", createDs); - LOGP(info, " --> createLc = {}", createLc); - LOGP(info, " --> createXic = {}", createXic); } /// Performs MC matching. @@ -897,7 +875,7 @@ struct HfCandidateCreator3ProngExpressions { } // D± → π± K∓ π± - if (createDplus) { + if (flag == 0) { if (matchKinkedDecayTopology && matchInteractionsWithMaterial) { indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, Pdg::kDPlus, std::array{+kPiPlus, -kKPlus, +kPiPlus}, true, &sign, 2, &nKinkedTracks, &nInteractionsWithMaterial); } else if (matchKinkedDecayTopology && !matchInteractionsWithMaterial) { @@ -913,7 +891,7 @@ struct HfCandidateCreator3ProngExpressions { } // Ds± → K± K∓ π± and D± → K± K∓ π± - if (flag == 0 && createDs) { + if (flag == 0) { bool isDplus = false; if (matchKinkedDecayTopology && matchInteractionsWithMaterial) { indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, Pdg::kDS, std::array{+kKPlus, -kKPlus, +kPiPlus}, true, &sign, 2, &nKinkedTracks, &nInteractionsWithMaterial); @@ -958,8 +936,21 @@ struct HfCandidateCreator3ProngExpressions { } } + // D* → D0π → Kππ + if (flag == 0) { + if (matchKinkedDecayTopology) { + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, Pdg::kDStar, std::array{+kPiPlus, +kPiPlus, -kKPlus}, true, &sign, 2, &nKinkedTracks); + } else { + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, Pdg::kDStar, std::array{+kPiPlus, +kPiPlus, -kKPlus}, true, &sign, 2); + } + if (indexRec > -1) { + flag = sign * (1 << DstarToPiKPiBkg); + channel = 1; + } + } + // Λc± → p± K∓ π± - if (flag == 0 && createLc) { + if (flag == 0) { if (matchKinkedDecayTopology && matchInteractionsWithMaterial) { indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, Pdg::kLambdaCPlus, std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2, &nKinkedTracks, &nInteractionsWithMaterial); } else if (matchKinkedDecayTopology && !matchInteractionsWithMaterial) { @@ -994,7 +985,7 @@ struct HfCandidateCreator3ProngExpressions { } // Ξc± → p± K∓ π± - if (flag == 0 && createXic) { + if (flag == 0) { if (matchKinkedDecayTopology && matchInteractionsWithMaterial) { indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, Pdg::kXiCPlus, std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2, &nKinkedTracks, &nInteractionsWithMaterial); } else if (matchKinkedDecayTopology && !matchInteractionsWithMaterial) { @@ -1049,7 +1040,7 @@ struct HfCandidateCreator3ProngExpressions { } continue; } - hf_mc_gen::fillMcMatchGen3Prong(mcParticles, mcParticlesPerMcColl, rowMcMatchGen, rejectBackground, createDplus, createDs, createLc, createXic); + hf_mc_gen::fillMcMatchGen3Prong(mcParticles, mcParticlesPerMcColl, rowMcMatchGen, rejectBackground); } } diff --git a/PWGHF/TableProducer/candidateCreatorMcGen.cxx b/PWGHF/TableProducer/candidateCreatorMcGen.cxx index f2e9c685b55..c27a2f8b734 100644 --- a/PWGHF/TableProducer/candidateCreatorMcGen.cxx +++ b/PWGHF/TableProducer/candidateCreatorMcGen.cxx @@ -46,10 +46,6 @@ struct HfCandidateCreatorMcGen { Configurable fillB0{"fillB0", false, "fill table for B0 candidates"}; Configurable rejectBackground2Prong{"rejectBackground2Prong", false, "Reject particles from PbPb background for 2 prong candidates"}; Configurable rejectBackground3Prong{"rejectBackground3Prong", false, "Reject particles from PbPb background for 3 prong candidates"}; - Configurable createDplus{"createDplus", false, "Create D+ in 3 prong"}; - Configurable createDs{"createDs", false, "Create Ds in 3 prong"}; - Configurable createLc{"createLc", false, "Create Lc in 3 prong"}; - Configurable createXic{"createXic", false, "Create Xic in 3 prong"}; Preslice mcParticlesPerMcCollision = aod::mcparticle::mcCollisionId; @@ -63,7 +59,7 @@ struct HfCandidateCreatorMcGen { hf_mc_gen::fillMcMatchGen2Prong(mcParticles, mcParticlesPerMcColl, rowMcMatchGen2Prong, rejectBackground2Prong); } if (fill3Prong) { - hf_mc_gen::fillMcMatchGen3Prong(mcParticles, mcParticlesPerMcColl, rowMcMatchGen3Prong, rejectBackground3Prong, createDplus, createDs, createLc, createXic); + hf_mc_gen::fillMcMatchGen3Prong(mcParticles, mcParticlesPerMcColl, rowMcMatchGen3Prong, rejectBackground3Prong); } } if (fillBplus) { diff --git a/PWGHF/TableProducer/treeCreatorDplusToPiKPi.cxx b/PWGHF/TableProducer/treeCreatorDplusToPiKPi.cxx index 7b8b26c4410..b75aa3a4a3c 100644 --- a/PWGHF/TableProducer/treeCreatorDplusToPiKPi.cxx +++ b/PWGHF/TableProducer/treeCreatorDplusToPiKPi.cxx @@ -79,7 +79,13 @@ DECLARE_SOA_COLUMN(Ct, ct, float); // Events DECLARE_SOA_COLUMN(IsEventReject, isEventReject, int); //! Event rejection flag DECLARE_SOA_COLUMN(RunNumber, runNumber, int); //! Run number +// ML scores +DECLARE_SOA_COLUMN(MlScore0, mlScore0, float); //! ML score of the first configured index +DECLARE_SOA_COLUMN(MlScore1, mlScore1, float); //! ML score of the second configured index } // namespace full +DECLARE_SOA_TABLE(HfCandDpMls, "AOD", "HFCANDDPML", + full::MlScore0, + full::MlScore1) DECLARE_SOA_TABLE(HfCandDpLites, "AOD", "HFCANDDPLITE", hf_cand::Chi2PCA, @@ -233,19 +239,23 @@ struct HfTreeCreatorDplusToPiKPi { Produces rowCandidateFullEvents; Produces rowCandidateFullParticles; Produces rowCandidateLite; + Produces rowCandidateMl; Configurable selectionFlagDplus{"selectionFlagDplus", 1, "Selection Flag for Dplus"}; Configurable fillCandidateLiteTable{"fillCandidateLiteTable", false, "Switch to fill lite table with candidate properties"}; // parameters for production of training samples Configurable fillOnlySignal{"fillOnlySignal", false, "Flag to fill derived tables with signal for ML trainings"}; + Configurable fillOnlySignalMl{"fillOnlySignalMl", false, "Flag to fill derived tables with MC and ML info"}; Configurable fillOnlyBackground{"fillOnlyBackground", false, "Flag to fill derived tables with background for ML trainings"}; Configurable downSampleBkgFactor{"downSampleBkgFactor", 1., "Fraction of background candidates to keep for ML trainings"}; Configurable ptMaxForDownSample{"ptMaxForDownSample", 10., "Maximum pt for the application of the downsampling factor"}; + Configurable> classMl{"classMlindexes", {0, 2}, "Indexes of ML bkg and non-prompt scores."}; HfHelper hfHelper; using SelectedCandidatesMc = soa::Filtered>; using MatchedGenCandidatesMc = soa::Filtered>; + using SelectedCandidatesMcWithMl = soa::Filtered>; using TracksWPid = soa::Join; Filter filterSelectCandidates = aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlagDplus; @@ -253,6 +263,7 @@ struct HfTreeCreatorDplusToPiKPi { Partition reconstructedCandSig = nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_3prong::DecayType::DplusToPiKPi)) || nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_3prong::DecayType::DsToKKPi)); // DecayType::DsToKKPi is used to flag both Ds± → K± K∓ π± and D± → K± K∓ π± Partition reconstructedCandBkg = nabs(aod::hf_cand_3prong::flagMcMatchRec) != static_cast(BIT(aod::hf_cand_3prong::DecayType::DplusToPiKPi)); + Partition reconstructedCandSigMl = nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_3prong::DecayType::DplusToPiKPi)) || nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_3prong::DecayType::DsToKKPi)) || nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_3prong::DstarToPiKPiBkg)); // DecayType::DsToKKPi is used to flag both Ds± → K± K∓ π± and D± → K± K∓ π± void init(InitContext const&) { @@ -271,7 +282,7 @@ struct HfTreeCreatorDplusToPiKPi { runNumber); } - template + template void fillCandidateTable(const T& candidate) { int8_t flagMc = 0; @@ -283,6 +294,16 @@ struct HfTreeCreatorDplusToPiKPi { channelMc = candidate.flagMcDecayChanRec(); } + std::vector outputMl = {-999., -999.}; + if constexpr (doMl) { + for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { + outputMl[iclass] = candidate.mlProbDplusToPiKPi()[classMl->at(iclass)]; + } + rowCandidateMl( + outputMl[0], + outputMl[1]); + } + auto prong0 = candidate.template prong0_as(); auto prong1 = candidate.template prong1_as(); auto prong2 = candidate.template prong2_as(); @@ -450,6 +471,7 @@ struct HfTreeCreatorDplusToPiKPi { aod::McCollisions const&, SelectedCandidatesMc const& candidates, MatchedGenCandidatesMc const& particles, + SelectedCandidatesMcWithMl const&, TracksWPid const&) { // Filling event properties @@ -468,6 +490,22 @@ struct HfTreeCreatorDplusToPiKPi { for (const auto& candidate : reconstructedCandSig) { fillCandidateTable(candidate); } + } else if (fillOnlySignalMl) { + rowCandidateMl.reserve(reconstructedCandSigMl.size()); + if (fillCandidateLiteTable) { + rowCandidateLite.reserve(reconstructedCandSigMl.size()); + } else { + rowCandidateFull.reserve(reconstructedCandSigMl.size()); + } + for (const auto& candidate : reconstructedCandSigMl) { + if (downSampleBkgFactor < 1.) { + float pseudoRndm = candidate.ptProng0() * 1000. - (int64_t)(candidate.ptProng0() * 1000); + if (candidate.pt() < ptMaxForDownSample && pseudoRndm >= downSampleBkgFactor) { + continue; + } + } + fillCandidateTable(candidate); + } } else if (fillOnlyBackground) { if (fillCandidateLiteTable) { rowCandidateLite.reserve(reconstructedCandBkg.size()); diff --git a/PWGHF/Utils/utilsMcGen.h b/PWGHF/Utils/utilsMcGen.h index ffadc82f95a..23fcbe6d61d 100644 --- a/PWGHF/Utils/utilsMcGen.h +++ b/PWGHF/Utils/utilsMcGen.h @@ -79,7 +79,7 @@ void fillMcMatchGen2Prong(T const& mcParticles, U const& mcParticlesPerMcColl, V } template -void fillMcMatchGen3Prong(T const& mcParticles, U const& mcParticlesPerMcColl, V& rowMcMatchGen, bool rejectBackground, bool createDplus, bool createDs, bool createLc, bool createXic) +void fillMcMatchGen3Prong(T const& mcParticles, U const& mcParticlesPerMcColl, V& rowMcMatchGen, bool rejectBackground) { using namespace o2::constants::physics; @@ -104,14 +104,14 @@ void fillMcMatchGen3Prong(T const& mcParticles, U const& mcParticlesPerMcColl, V } // D± → π± K∓ π± - if (createDplus) { + if (flag == 0) { if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kDPlus, std::array{+kPiPlus, -kKPlus, +kPiPlus}, true, &sign, 2)) { flag = sign * (1 << o2::aod::hf_cand_3prong::DecayType::DplusToPiKPi); } } // Ds± → K± K∓ π± and D± → K± K∓ π± - if (flag == 0 && createDs) { + if (flag == 0) { bool isDplus = false; if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kDS, std::array{+kKPlus, -kKPlus, +kPiPlus}, true, &sign, 2)) { // DecayType::DsToKKPi is used to flag both Ds± → K± K∓ π± and D± → K± K∓ π± @@ -139,8 +139,15 @@ void fillMcMatchGen3Prong(T const& mcParticles, U const& mcParticlesPerMcColl, V } } + // D*± → D0(bar) π± + if (flag == 0) { + if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kDStar, std::array{+kPiPlus, +kPiPlus, -kKPlus}, true, &sign, 2)) { + flag = sign * (1 << o2::aod::hf_cand_3prong::DstarToPiKPiBkg); + } + } + // Λc± → p± K∓ π± - if (flag == 0 && createLc) { + if (flag == 0) { if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kLambdaCPlus, std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2)) { flag = sign * (1 << o2::aod::hf_cand_3prong::DecayType::LcToPKPi); @@ -163,7 +170,7 @@ void fillMcMatchGen3Prong(T const& mcParticles, U const& mcParticlesPerMcColl, V } // Ξc± → p± K∓ π± - if (flag == 0 && createXic) { + if (flag == 0) { if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kXiCPlus, std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2)) { flag = sign * (1 << o2::aod::hf_cand_3prong::DecayType::XicToPKPi); } From 7485a8a5693ac7fc5e04c23fb56970fd8928643e Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Mon, 24 Feb 2025 19:53:13 +0800 Subject: [PATCH 0385/1650] [PWGCF] flowPtEfficiency, flowRunbyRun: small fix (#10147) --- PWGCF/Flow/Tasks/flowPtEfficiency.cxx | 4 ++++ PWGCF/Flow/Tasks/flowRunbyRun.cxx | 25 ++++++++++--------------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowPtEfficiency.cxx b/PWGCF/Flow/Tasks/flowPtEfficiency.cxx index f9b30d55d9a..267caecfc07 100644 --- a/PWGCF/Flow/Tasks/flowPtEfficiency.cxx +++ b/PWGCF/Flow/Tasks/flowPtEfficiency.cxx @@ -382,6 +382,8 @@ struct FlowPtEfficiency { if (cfgFlowEnabled) { loadCentVsIPReco(bc.timestamp()); loadCorrections(bc.timestamp()); + + fGFWReco->Clear(); } for (const auto& track : tracks) { @@ -446,6 +448,8 @@ struct FlowPtEfficiency { auto bc = mcCollision.bc_as(); loadCentVsIPTruth(bc.timestamp()); centrality = mCentVsIPTruth->GetBinContent(mCentVsIPTruth->GetXaxis()->FindBin(imp)); + + fGFWTrue->Clear(); } float lRandom = fRndm->Rndm(); float wacc = 1.0f; diff --git a/PWGCF/Flow/Tasks/flowRunbyRun.cxx b/PWGCF/Flow/Tasks/flowRunbyRun.cxx index ffcd91c483c..87fbf185787 100644 --- a/PWGCF/Flow/Tasks/flowRunbyRun.cxx +++ b/PWGCF/Flow/Tasks/flowRunbyRun.cxx @@ -328,20 +328,6 @@ struct FlowRunbyRun { return true; } - void initEventCount(std::shared_ptr hEventCountSpecific) - { - hEventCountSpecific->GetXaxis()->SetBinLabel(1, "after sel8"); - hEventCountSpecific->GetXaxis()->SetBinLabel(2, "kNoSameBunchPileup"); - hEventCountSpecific->GetXaxis()->SetBinLabel(3, "kIsGoodZvtxFT0vsPV"); - hEventCountSpecific->GetXaxis()->SetBinLabel(4, "kNoCollInTimeRangeStandard"); - hEventCountSpecific->GetXaxis()->SetBinLabel(5, "kIsGoodITSLayersAll"); - hEventCountSpecific->GetXaxis()->SetBinLabel(6, "kNoCollInRofStandard"); - hEventCountSpecific->GetXaxis()->SetBinLabel(7, "kNoHighMultCollInPrevRof"); - hEventCountSpecific->GetXaxis()->SetBinLabel(8, "occupancy"); - hEventCountSpecific->GetXaxis()->SetBinLabel(9, "MultCorrelation"); - hEventCountSpecific->GetXaxis()->SetBinLabel(10, "cfgEvSelV0AT0ACut"); - } - void createOutputObjectsForRun(int runNumber) { std::vector> histos(kCount_TH1Names); @@ -352,7 +338,16 @@ struct FlowRunbyRun { histos[hMult] = registry.add(Form("%d/hMult", runNumber), "", {HistType::kTH1D, {{3000, 0.5, 3000.5}}}); histos[hCent] = registry.add(Form("%d/hCent", runNumber), "", {HistType::kTH1D, {{90, 0, 90}}}); histos[hEventCountSpecific] = registry.add(Form("%d/hEventCountSpecific", runNumber), "", {HistType::kTH1D, {{10, 0, 10}}}); - initEventCount(histos[hEventCountSpecific]); + histos[hEventCountSpecific]->GetXaxis()->SetBinLabel(1, "after sel8"); + histos[hEventCountSpecific]->GetXaxis()->SetBinLabel(2, "kNoSameBunchPileup"); + histos[hEventCountSpecific]->GetXaxis()->SetBinLabel(3, "kIsGoodZvtxFT0vsPV"); + histos[hEventCountSpecific]->GetXaxis()->SetBinLabel(4, "kNoCollInTimeRangeStandard"); + histos[hEventCountSpecific]->GetXaxis()->SetBinLabel(5, "kIsGoodITSLayersAll"); + histos[hEventCountSpecific]->GetXaxis()->SetBinLabel(6, "kNoCollInRofStandard"); + histos[hEventCountSpecific]->GetXaxis()->SetBinLabel(7, "kNoHighMultCollInPrevRof"); + histos[hEventCountSpecific]->GetXaxis()->SetBinLabel(8, "occupancy"); + histos[hEventCountSpecific]->GetXaxis()->SetBinLabel(9, "MultCorrelation"); + histos[hEventCountSpecific]->GetXaxis()->SetBinLabel(10, "cfgEvSelV0AT0ACut"); th1sList.insert(std::make_pair(runNumber, histos)); std::vector> profiles(kCount_TProfileNames); From 6e4394981c484af58e1a517b49d870eccb5836c8 Mon Sep 17 00:00:00 2001 From: Gyula Bencedi Date: Mon, 24 Feb 2025 12:54:14 +0100 Subject: [PATCH 0386/1650] [PWGLF] Fix histogram filling arguments (#10156) Co-authored-by: ALICE Action Bot --- PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx | 84 ++++++++++++++---------------- 1 file changed, 39 insertions(+), 45 deletions(-) diff --git a/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx b/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx index 520751f92a9..2efe478c796 100644 --- a/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx +++ b/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx @@ -10,6 +10,7 @@ // or submit itself to any jurisdiction. // /// +/// \file dndetaMFTPbPb.cxx /// \brief Task for calculating dNdeta in Pb-Pb collisions using MFT detector /// \author Gyula Bencedi, gyula.bencedi@cern.ch /// \since Nov 2024 @@ -39,11 +40,12 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "CommonConstants/MathConstants.h" -#include "Functions.h" -#include "Index.h" #include "MathUtils/Utils.h" #include "ReconstructionDataFormats/GlobalTrackID.h" #include "TPDGCode.h" + +#include "Functions.h" +#include "Index.h" #include "bestCollisionTable.h" using namespace o2; @@ -133,7 +135,7 @@ struct DndetaMFTPbPb { "centralityBins", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100}, "Centrality"}; - ConfigurableAxis IrBins{"IrBins", {500, 0, 50}, "Interaction rate (kHz)"}; + ConfigurableAxis irBins{"irBins", {500, 0, 50}, "Interaction rate (kHz)"}; Service pdg; @@ -246,7 +248,7 @@ struct DndetaMFTPbPb { x->SetBinLabel(2, "Selected"); qaregistry.add("hOccIRate", "hOccIRate", HistType::kTH2F, - {occupancyAxis, IrBins}); + {occupancyAxis, irBins}); registry.add({"Events/NtrkZvtx", "; N_{trk}; Z_{vtx} (cm); occupancy", @@ -332,7 +334,7 @@ struct DndetaMFTPbPb { hstat->GetAxis(0)->SetBinLabel(2, "Selected"); qaregistry.add("hCentOccIRate", "hCentOccIRate", HistType::kTHnSparseF, - {centralityAxis, occupancyAxis, IrBins}); + {centralityAxis, occupancyAxis, irBins}); qaregistry.add({"Events/Centrality/hCent", "; centrality; occupancy", @@ -1230,10 +1232,9 @@ struct DndetaMFTPbPb { processDatawBestTracks(collision, tracks, besttracks, bcs); } - PROCESS_SWITCH( - DndetaMFTPbPb, processDatawBestTracksCentFT0C, - "Count tracks in FT0C centrality bins based on BestCollisionsFwd table", - false); + PROCESS_SWITCH(DndetaMFTPbPb, processDatawBestTracksCentFT0C, + "Count tracks in FT0C centrality bins based on BestCollisionsFwd table", + false); void processDatawBestTracksCentFT0CVariant1( CollsCentFT0CVariant1::iterator const& collision, @@ -1258,10 +1259,9 @@ struct DndetaMFTPbPb { processDatawBestTracks(collision, tracks, besttracks, bcs); } - PROCESS_SWITCH( - DndetaMFTPbPb, processDatawBestTracksCentFT0M, - "Count tracks in FT0M centrality bins based on BestCollisionsFwd table", - false); + PROCESS_SWITCH(DndetaMFTPbPb, processDatawBestTracksCentFT0M, + "Count tracks in FT0M centrality bins based on BestCollisionsFwd table", + false); void processDatawBestTracksCentNGlobal( CollsCentNGlobal::iterator const& collision, FiltMftTracks const& tracks, @@ -1285,10 +1285,9 @@ struct DndetaMFTPbPb { processDatawBestTracks(collision, tracks, besttracks, bcs); } - PROCESS_SWITCH( - DndetaMFTPbPb, processDatawBestTracksCentMFT, - "Count tracks in MFT centrality bins based on BestCollisionsFwd table", - false); + PROCESS_SWITCH(DndetaMFTPbPb, processDatawBestTracksCentMFT, + "Count tracks in MFT centrality bins based on BestCollisionsFwd table", + false); Preslice perCol = o2::aod::fwdtrack::collisionId; PresliceUnsorted recColPerMcCol = @@ -1391,15 +1390,16 @@ struct DndetaMFTPbPb { auto perCollMCsample = mcSample->sliceByCached( aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); auto nchrg = countPart(perCollMCsample); + auto zvtxMC = mcCollision.posZ(); + if (gtOneColl > 1) { if constexpr (has_reco_cent) { - qaregistry.fill(HIST("Events/Centrality/SplitMult"), nchrg, cgen); + qaregistry.fill(HIST("Events/Centrality/SplitMult"), nchrg, zvtxMC, cgen); } else { - qaregistry.fill(HIST("Events/SplitMult"), nchrg); + qaregistry.fill(HIST("Events/SplitMult"), nchrg, zvtxMC); } } - auto zvtxMC = mcCollision.posZ(); auto nCharged = countPart(particles); if constexpr (has_reco_cent) { registry.fill(HIST("Events/Centrality/NtrkZvtxGen_t"), nCharged, zvtxMC, @@ -1562,9 +1562,9 @@ struct DndetaMFTPbPb { if constexpr (has_reco_cent) { registry.fill(HIST("Events/Centrality/NtrkZvtxGen"), nTrkRec, z, - crec); + crec, occrec); } else { - registry.fill(HIST("Events/NtrkZvtxGen"), nTrkRec, z); + registry.fill(HIST("Events/NtrkZvtxGen"), nTrkRec, z, occrec); } } } @@ -1620,10 +1620,9 @@ struct DndetaMFTPbPb { mccollision, collisions, particles, tracks, besttracks); } - PROCESS_SWITCH( - DndetaMFTPbPb, processMCwBestTracksCentFT0C, - "Count MC particles in FT0C centrality bins using aod::BestCollisionsFwd", - false); + PROCESS_SWITCH(DndetaMFTPbPb, processMCwBestTracksCentFT0C, + "Count MC particles in FT0C centrality bins using aod::BestCollisionsFwd", + false); void processMCwBestTracksCentFT0CVariant1( aod::McCollisions::iterator const& mccollision, @@ -1651,10 +1650,9 @@ struct DndetaMFTPbPb { mccollision, collisions, particles, tracks, besttracks); } - PROCESS_SWITCH( - DndetaMFTPbPb, processMCwBestTracksCentFT0M, - "Count MC particles in FT0M centrality bins using aod::BestCollisionsFwd", - false); + PROCESS_SWITCH(DndetaMFTPbPb, processMCwBestTracksCentFT0M, + "Count MC particles in FT0M centrality bins using aod::BestCollisionsFwd", + false); void processMCwBestTracksCentNGlobal( aod::McCollisions::iterator const& mccollision, @@ -1682,10 +1680,9 @@ struct DndetaMFTPbPb { mccollision, collisions, particles, tracks, besttracks); } - PROCESS_SWITCH( - DndetaMFTPbPb, processMCwBestTracksCentMFT, - "Count MC particles in MFT centrality bins using aod::BestCollisionsFwd", - false); + PROCESS_SWITCH(DndetaMFTPbPb, processMCwBestTracksCentMFT, + "Count MC particles in MFT centrality bins using aod::BestCollisionsFwd", + false); using ParticlesI = soa::Join; Partition primariesI = @@ -1843,9 +1840,8 @@ struct DndetaMFTPbPb { particles, tracks); } - PROCESS_SWITCH( - DndetaMFTPbPb, processTrkEffIdxCentFT0C, - "Process tracking efficiency (in FT0C centrality bins, indexed)", false); + PROCESS_SWITCH(DndetaMFTPbPb, processTrkEffIdxCentFT0C, + "Process tracking efficiency (in FT0C centrality bins, indexed)", false); /// @brief process function to calculate tracking efficiency (indexed) based /// on BestCollisionsFwd in FT0C bins @@ -1922,10 +1918,9 @@ struct DndetaMFTPbPb { particles, tracks, besttracks); } - PROCESS_SWITCH( - DndetaMFTPbPb, processTrkEffBestInclusive, - "Process tracking efficiency (inclusive, based on BestCollisionsFwd)", - false); + PROCESS_SWITCH(DndetaMFTPbPb, processTrkEffBestInclusive, + "Process tracking efficiency (inclusive, based on BestCollisionsFwd)", + false); void processTrkEffBestCentFT0C( soa::Join::iterator const& collision, @@ -2091,10 +2086,9 @@ struct DndetaMFTPbPb { collision, allcollisions, track); } - PROCESS_SWITCH( - DndetaMFTPbPb, processCheckAmbiguousMftTracksCentFT0C, - "Process checks for Ambiguous MFT tracks (in FT0C centrality bins)", - false); + PROCESS_SWITCH(DndetaMFTPbPb, processCheckAmbiguousMftTracksCentFT0C, + "Process checks for Ambiguous MFT tracks (in FT0C centrality bins)", + false); Preslice filtTrkperCol = o2::aod::fwdtrack::collisionId; From a40941d79e16255c4fb22b0e9303ea57ea787016 Mon Sep 17 00:00:00 2001 From: alcaliva <32872606+alcaliva@users.noreply.github.com> Date: Mon, 24 Feb 2025 14:06:11 +0100 Subject: [PATCH 0387/1650] [PWGLF] switched to fastjet for jet finding (#10142) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Nicolò Jacazio --- PWGLF/Tasks/Strangeness/CMakeLists.txt | 4 +- PWGLF/Tasks/Strangeness/strangenessInJets.cxx | 463 ++++++------------ 2 files changed, 156 insertions(+), 311 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/CMakeLists.txt b/PWGLF/Tasks/Strangeness/CMakeLists.txt index 0201ee95be2..e0b0fd7cde0 100644 --- a/PWGLF/Tasks/Strangeness/CMakeLists.txt +++ b/PWGLF/Tasks/Strangeness/CMakeLists.txt @@ -104,10 +104,12 @@ o2physics_add_dpl_workflow(cascpolsp PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) +if(FastJet_FOUND) o2physics_add_dpl_workflow(strangeness-in-jets SOURCES strangenessInJets.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::PWGJECore FastJet::FastJet FastJet::Contrib COMPONENT_NAME Analysis) +endif() o2physics_add_dpl_workflow(v0topologicalcuts SOURCES v0topologicalcuts.cxx diff --git a/PWGLF/Tasks/Strangeness/strangenessInJets.cxx b/PWGLF/Tasks/Strangeness/strangenessInJets.cxx index 1876716dd93..db7f3013eff 100644 --- a/PWGLF/Tasks/Strangeness/strangenessInJets.cxx +++ b/PWGLF/Tasks/Strangeness/strangenessInJets.cxx @@ -39,6 +39,19 @@ #include "PWGLF/DataModel/LFStrangenessTables.h" #include "ReconstructionDataFormats/Track.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include "PWGJE/Core/JetBkgSubUtils.h" +#include "PWGJE/Core/JetDerivedDataUtilities.h" +#include "PWGJE/DataModel/JetReducedData.h" +#include "PWGJE/DataModel/Jet.h" + using namespace std; using namespace o2; using namespace o2::soa; @@ -64,17 +77,11 @@ struct StrangenessInJets { // Global Parameters Configurable particleOfInterest{"particleOfInterest", 0, "0=v0, 1=cascade, 2=pions, 3=k+-, 4=proton"}; - Configurable minimumJetPt{"minimumJetPt", 10.0, "Minimum pt of the jet"}; + Configurable minJetPt{"minJetPt", 10.0, "Minimum pt of the jet"}; Configurable rJet{"rJet", 0.3, "Jet resolution parameter R"}; Configurable zVtx{"zVtx", 10.0, "Maximum zVertex"}; - Configurable minNumberOfParticlesInJet{"minNumberOfParticlesInJet", 2, "Minimum number of particles inside jet"}; - Configurable nJetsPerEventMax{"nJetsPerEventMax", 1000, "Maximum number of jets per event"}; - Configurable requireNoOverlap{"requireNoOverlap", false, "require no overlap between jets and UE cones"}; - Configurable alpha{"alpha", 1.0, "Alpha"}; - Configurable averagePtUE{"averagePtUE", 0.1, "Average pt of UE"}; - Configurable averagePtUEMC{"averagePtUEMC", 0.1, "Average pt of UE in MC"}; - Configurable par0{"par0", 0.004f, "par 0"}; - Configurable par1{"par1", 0.013f, "par 1"}; + Configurable deltaEtaEdge{"deltaEtaEdge", 0.05, "eta gap from the edge"}; + // Axis parameters struct : ConfigurableGroup { ConfigurableAxis binsPt{"binsPt", {VARIABLE_WIDTH, 0.0, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8, 5.0}, "Binning of the pT axis"}; @@ -87,6 +94,7 @@ struct StrangenessInJets { Configurable minITSnCls{"minITSnCls", 4.0f, "min number of ITS clusters"}; Configurable minTPCnClsFound{"minTPCnClsFound", 80.0f, "min number of found TPC clusters"}; Configurable minNCrossedRowsTPC{"minNCrossedRowsTPC", 80.0f, "min number of TPC crossed rows"}; + Configurable minTpcNcrossedRowsOverFindable{"minTpcNcrossedRowsOverFindable", 0.8, "crossed rows/findable"}; Configurable maxChi2TPC{"maxChi2TPC", 4.0f, "max chi2 per cluster TPC"}; Configurable maxChi2ITS{"maxChi2ITS", 36.0f, "max chi2 per cluster ITS"}; Configurable etaMin{"etaMin", -0.8f, "eta min"}; @@ -169,6 +177,9 @@ struct StrangenessInJets { ChargedKaon, ProtonAntiproton }; + // Jet background subtraction + JetBkgSubUtils backgroundSub; + void init(InitContext const&) { ccdb->setURL(urlToCcdb.value); @@ -198,7 +209,7 @@ struct StrangenessInJets { registryData.add("number_of_events_vsmultiplicity", "number of events in data vs multiplicity", HistType::kTH1D, {{101, 0, 101, "Multiplicity percentile"}}); } - if (doprocessGen || doprocessMCefficiency) { + if (doprocessMCefficiency) { registryMC.add("number_of_events_mc", "number of events in mc", HistType::kTH1D, {{10, 0, 10, "Event Cuts"}}); } @@ -309,7 +320,7 @@ struct StrangenessInJets { } // Histograms for efficiency (generated) - if (doprocessGen || doprocessMCefficiency) { + if (doprocessMCefficiency) { registryMC.add("K0s_generated_jet", "K0s_generated_jet", HistType::kTH2F, {multBinning, ptAxis}); registryMC.add("K0s_generated_ue", "K0s_generated_ue", HistType::kTH2F, {multBinning, ptAxis}); registryMC.add("Lambda_generated_jet", "Lambda_generated_jet", HistType::kTH2F, {multBinning, ptAxis}); @@ -416,17 +427,79 @@ struct StrangenessInJets { } } - // ITS Hit - template - bool hasITSHit(T const& track, int layer) + void getPerpendicularAxis(TVector3 p, TVector3& u, double sign) + { + // initialization + double ux(0), uy(0), uz(0); + + // components of vector p + double px = p.X(); + double py = p.Y(); + double pz = p.Z(); + + // protection 1 + if (px == 0 && py != 0) { + uy = -(pz * pz) / py; + ux = sign * std::sqrt(py * py - (pz * pz * pz * pz) / (py * py)); + uz = pz; + u.SetXYZ(ux, uy, uz); + return; + } + + // protection 2 + if (py == 0 && px != 0) { + ux = -(pz * pz) / px; + uy = sign * std::sqrt(px * px - (pz * pz * pz * pz) / (px * px)); + uz = pz; + u.SetXYZ(ux, uy, uz); + return; + } + + // equation parameters + double a = px * px + py * py; + double b = 2.0 * px * pz * pz; + double c = pz * pz * pz * pz - py * py * py * py - px * px * py * py; + double delta = b * b - 4.0 * a * c; + + // protection agains delta<0 + if (delta < 0) { + return; + } + + // solutions + ux = (-b + sign * std::sqrt(delta)) / (2.0 * a); + uy = (-pz * pz - px * ux) / py; + uz = pz; + u.SetXYZ(ux, uy, uz); + return; + } + + double getDeltaPhi(double a1, double a2) + { + double deltaPhi(0); + double phi1 = TVector2::Phi_0_2pi(a1); + double phi2 = TVector2::Phi_0_2pi(a2); + double diff = std::fabs(phi1 - phi2); + + if (diff <= PI) + deltaPhi = diff; + if (diff > PI) + deltaPhi = TwoPI - diff; + + return deltaPhi; + } + + // ITS hit + template + bool hasITSHit(const TrackIts& track, int layer) { int ibit = layer - 1; return (track.itsClusterMap() & (1 << ibit)); } // Single-Track Selection for Particles inside Jets - template - bool passedTrackSelectionForJetReconstruction(const T1& track) + template + bool passedTrackSelectionForJetReconstruction(const JetTrack& track) { if (!track.hasITS()) return false; @@ -436,7 +509,7 @@ struct StrangenessInJets { return false; if (track.tpcNClsCrossedRows() < 70) return false; - if (track.tpcNClsCrossedRows() / track.tpcNClsFindable() < 0.8) + if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < 0.8) return false; if (track.tpcChi2NCl() > 4) return false; @@ -444,9 +517,9 @@ struct StrangenessInJets { return false; if (track.eta() < -0.8 || track.eta() > 0.8) return false; - if (track.pt() < 0.15) + if (track.pt() < 0.1) return false; - if (std::fabs(track.dcaXY()) > 0.25) + if (std::fabs(track.dcaXY()) > (0.0105 + 0.035 / std::pow(track.pt(), 1.1))) return false; if (std::fabs(track.dcaZ()) > 2.0) return false; @@ -466,6 +539,8 @@ struct StrangenessInJets { return false; if (track.tpcNClsCrossedRows() < minNCrossedRowsTPC) return false; + if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < minTpcNcrossedRowsOverFindable) + return false; if (track.tpcChi2NCl() > maxChi2TPC) return false; if (track.itsChi2NCl() > maxChi2ITS) @@ -842,6 +917,8 @@ struct StrangenessInJets { return false; if (track.tpcNClsCrossedRows() < minNCrossedRowsTPC) return false; + if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < minTpcNcrossedRowsOverFindable) + return false; if (track.tpcChi2NCl() > maxChi2TPC) return false; if (track.eta() < etaMin || track.eta() > etaMax) @@ -862,103 +939,6 @@ struct StrangenessInJets { return false; } - float minimumValue(float x1, float x2) - { - float xMin(x1); - if (x1 < x2) - xMin = x1; - if (x1 >= x2) - xMin = x2; - return xMin; - } - - double getDeltaPhi(double a1, double a2) - { - double deltaPhi(0); - double phi1 = TVector2::Phi_0_2pi(a1); - double phi2 = TVector2::Phi_0_2pi(a2); - double diff = std::fabs(phi1 - phi2); - - if (diff <= o2::constants::math::PI) - deltaPhi = diff; - if (diff > o2::constants::math::PI) - deltaPhi = o2::constants::math::TwoPI - diff; - - return deltaPhi; - } - - void getPerpendicularAxis(TVector3 p, TVector3& u, double sign) - { - // Initialization - double ux(0), uy(0), uz(0); - - // Components of Vector p - double px = p.X(); - double py = p.Y(); - double pz = p.Z(); - - // Protection 1 - if (px == 0 && py != 0) { - - uy = -(pz * pz) / py; - ux = sign * std::sqrt(py * py - (pz * pz * pz * pz) / (py * py)); - uz = pz; - u.SetXYZ(ux, uy, uz); - return; - } - - // Protection 2 - if (py == 0 && px != 0) { - - ux = -(pz * pz) / px; - uy = sign * std::sqrt(px * px - (pz * pz * pz * pz) / (px * px)); - uz = pz; - u.SetXYZ(ux, uy, uz); - return; - } - - // Equation Parameters - double a = px * px + py * py; - double b = 2.0 * px * pz * pz; - double c = pz * pz * pz * pz - py * py * py * py - px * px * py * py; - double delta = b * b - 4.0 * a * c; - - // Protection agains delta<0 - if (delta < 0) { - return; - } - - // Solutions - ux = (-b + sign * std::sqrt(delta)) / (2.0 * a); - uy = (-pz * pz - px * ux) / py; - uz = pz; - u.SetXYZ(ux, uy, uz); - return; - } - - double calculateDij(TVector3 t1, TVector3 t2, double R) - { - double distanceJet(0); - double x1 = 1.0 / (t1.Pt() * t1.Pt()); - double x2 = 1.0 / (t2.Pt() * t2.Pt()); - double deltaEta = t1.Eta() - t2.Eta(); - double deltaPhi = getDeltaPhi(t1.Phi(), t2.Phi()); - double min = minimumValue(x1, x2); - double deltaSquare = deltaEta * deltaEta + deltaPhi * deltaPhi; - distanceJet = min * deltaSquare / (R * R); - return distanceJet; - } - - bool overlap(TVector3 v1, TVector3 v2, double R) - { - double dx = v1.Eta() - v2.Eta(); - double dy = getDeltaPhi(v1.Phi(), v2.Phi()); - double d = std::sqrt(dx * dx + dy * dy); - if (d < 2.0 * R) - return true; - return false; - } - double getCorrectedPt(double ptRec) { // to be developed @@ -1033,193 +1013,80 @@ struct StrangenessInJets { aod::CascDataExt const& Cascades, StrHadronDaughterTracks const& tracks) { - - // Event Counter: before event selection + // event counter: before event selection registryData.fill(HIST("number_of_events_data"), 0.5); - // Event Selection - if (!collision.sel8()) + // event selection + if (!collision.sel8() || std::fabs(collision.posZ()) > zVtx) return; - // Event Counter: after event selection sel8 + // event counter: after event selection registryData.fill(HIST("number_of_events_data"), 1.5); - // Cut on z-vertex - if (std::fabs(collision.posZ()) > zVtx) - return; - - // Event Counter: after z-vertex cut - registryData.fill(HIST("number_of_events_data"), 2.5); - - // List of Tracks - std::vector trk; - std::vector ntrk; - - for (const auto& track : tracks) { + // loop over reconstructed tracks + std::vector fjParticles; + for (auto const& track : tracks) { if (!passedTrackSelectionForJetReconstruction(track)) continue; - TVector3 momentum(track.px(), track.py(), track.pz()); - trk.push_back(momentum); - ntrk.push_back(1); + // 4-momentum representation of a particle + fastjet::PseudoJet fourMomentum(track.px(), track.py(), track.pz(), track.energy(MassPionCharged)); + fjParticles.emplace_back(fourMomentum); } - // Reject Empty Events - if (static_cast(trk.size()) < 1) + + // reject empty events + if (fjParticles.size() < 1) return; - registryData.fill(HIST("number_of_events_data"), 3.5); + registryData.fill(HIST("number_of_events_data"), 2.5); + + // cluster particles using the anti-kt algorithm + fastjet::JetDefinition jetDef(fastjet::antikt_algorithm, rJet); + fastjet::AreaDefinition areaDef(fastjet::active_area, fastjet::GhostedAreaSpec(1.0)); + fastjet::ClusterSequenceArea cs(fjParticles, jetDef, areaDef); + std::vector jets = fastjet::sorted_by_pt(cs.inclusive_jets()); + auto [rhoPerp, rhoMPerp] = backgroundSub.estimateRhoPerpCone(fjParticles, jets); - // Anti-kt Jet Finder - int nParticlesRemoved(0); - std::vector jet; + // jet selection + bool isAtLeastOneJetSelected = false; + std::vector selectedJet; std::vector ue1; std::vector ue2; - std::vector nParticlesInjet; - do { - double dijMin(1e+06), diBmin(1e+06); - int iMin(0), jMin(0), iBmin(0); - for (int i = 0; i < static_cast(trk.size()); i++) { - if (trk[i].Mag() == 0) - continue; - double diB = 1.0 / (trk[i].Pt() * trk[i].Pt()); - if (diB < diBmin) { - diBmin = diB; - iBmin = i; - } - for (int j = (i + 1); j < static_cast(trk.size()); j++) { - if (trk[j].Mag() == 0) - continue; - double dij = calculateDij(trk[i], trk[j], rJet); - if (dij < dijMin) { - dijMin = dij; - iMin = i; - jMin = j; - } - } - } - if (dijMin < diBmin) { - trk[iMin] = trk[iMin] + trk[jMin]; - ntrk[iMin] = ntrk[iMin] + ntrk[jMin]; - trk[jMin].SetXYZ(0, 0, 0); - ntrk[jMin] = 0; - nParticlesRemoved++; - } - if (dijMin > diBmin) { - jet.push_back(trk[iBmin]); - nParticlesInjet.push_back(ntrk[iBmin]); - trk[iBmin].SetXYZ(0, 0, 0); - nParticlesRemoved++; - } - } while (nParticlesRemoved < static_cast(trk.size())); - registryQC.fill(HIST("nJets_found"), static_cast(jet.size())); - - // Jet Selection - std::vector isSelected; - int nJetsSelected(0); - for (int i = 0; i < static_cast(jet.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] + for (auto& jet : jets) { // o2-linter: disable=[const-ref-in-for-loop] - // Initialization - isSelected.push_back(0); - - // Jet fully contained inside acceptance - if ((std::fabs(jet[i].Eta()) + rJet) > (etaMax - 0.5)) + // jet must be fully contained in the acceptance + if ((std::fabs(jet.eta()) + rJet) > (etaMax - deltaEtaEdge)) continue; - if (nParticlesInjet[i] < minNumberOfParticlesInJet) + + // jet pt must be larger than threshold + fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jet, rhoPerp, rhoMPerp); + if (getCorrectedPt(jetMinusBkg.pt()) < minJetPt) continue; + isAtLeastOneJetSelected = true; - // Perpendicular cones + // perpendicular cone + // double coneRadius = std::sqrt(jet.area() / PI); + TVector3 jetAxis(jet.px(), jet.py(), jet.pz()); TVector3 ueAxis1(0, 0, 0); TVector3 ueAxis2(0, 0, 0); - getPerpendicularAxis(jet[i], ueAxis1, +1); - getPerpendicularAxis(jet[i], ueAxis2, -1); - ue1.push_back(ueAxis1); - ue2.push_back(ueAxis2); - - double ptUE(0); - for (auto track : tracks) { // o2-linter: disable=[const-ref-in-for-loop] - - if (!passedTrackSelectionForJetReconstruction(track)) - continue; - TVector3 selectedTrack(track.px(), track.py(), track.pz()); - - double deltaEtaUe1 = selectedTrack.Eta() - ueAxis1.Eta(); - double deltaPhiUe1 = getDeltaPhi(selectedTrack.Phi(), ueAxis1.Phi()); - double deltaRUe1 = std::sqrt(deltaEtaUe1 * deltaEtaUe1 + deltaPhiUe1 * deltaPhiUe1); - double deltaEtaUe2 = selectedTrack.Eta() - ueAxis2.Eta(); - double deltaPhiUe2 = getDeltaPhi(selectedTrack.Phi(), ueAxis2.Phi()); - double deltaRUe2 = std::sqrt(deltaEtaUe2 * deltaEtaUe2 + deltaPhiUe2 * deltaPhiUe2); - - if (deltaRUe1 < alpha * rJet) { - registryQC.fill(HIST("deltaEtadeltaPhi_ue"), deltaEtaUe1, deltaPhiUe1); - ptUE = ptUE + selectedTrack.Pt(); - } - if (deltaRUe2 < alpha * rJet) { - registryQC.fill(HIST("deltaEtadeltaPhi_ue"), deltaEtaUe2, deltaPhiUe2); - ptUE = ptUE + selectedTrack.Pt(); - } - } - registryQC.fill(HIST("sumPtUE"), 0.5 * ptUE); - registryQC.fill(HIST("NchJetPlusUE"), nParticlesInjet[i]); - - double ptJetRec = jet[i].Pt() - averagePtUE; - double ptJetCorr = getCorrectedPt(ptJetRec); - - if (ptJetCorr < minimumJetPt) - continue; - - nJetsSelected++; - isSelected[i] = 1; - } - registryQC.fill(HIST("nJets_selected"), nJetsSelected); + getPerpendicularAxis(jetAxis, ueAxis1, +1); + getPerpendicularAxis(jetAxis, ueAxis2, -1); - if (nJetsSelected == 0) - return; - registryData.fill(HIST("number_of_events_data"), 4.5); - - // Overlaps - int nOverlapsJetJet(0); - int nOverlapsJetUe(0); - int nOverlapsUeUe(0); - int nOverlapsTot(0); - for (int i = 0; i < static_cast(jet.size()); i++) { - if (isSelected[i] == 0) - continue; - - for (int j = (i + 1); j < static_cast(jet.size()); j++) { - if (isSelected[j] == 0) - continue; - if (overlap(jet[i], jet[j], rJet)) - nOverlapsJetJet++; - if (overlap(jet[i], ue1[j], rJet) || overlap(jet[i], ue2[j], rJet)) - nOverlapsJetUe++; - if (overlap(ue1[i], ue1[j], rJet) || overlap(ue1[i], ue2[j], rJet) || overlap(ue2[i], ue2[j], rJet)) - nOverlapsUeUe++; - } + selectedJet.emplace_back(jetAxis); + ue1.emplace_back(ueAxis1); + ue2.emplace_back(ueAxis2); } - nOverlapsTot = nOverlapsJetJet + nOverlapsJetUe + nOverlapsUeUe; - registryQC.fill(HIST("jet_jet_overlaps"), nJetsSelected, nOverlapsJetJet); - registryQC.fill(HIST("jet_ue_overlaps"), nJetsSelected, nOverlapsJetUe); - registryQC.fill(HIST("ue_ue_overlaps"), nJetsSelected, nOverlapsUeUe); - registryQC.fill(HIST("tot_overlaps"), nJetsSelected, nOverlapsTot); - - if (nJetsSelected > nJetsPerEventMax) + if (!isAtLeastOneJetSelected) return; - registryData.fill(HIST("number_of_events_data"), 5.5); - - if (requireNoOverlap && nOverlapsTot > 0) - return; - registryData.fill(HIST("number_of_events_data"), 6.5); + registryData.fill(HIST("number_of_events_data"), 3.5); // Event multiplicity const float multiplicity = collision.centFT0M(); registryData.fill(HIST("number_of_events_vsmultiplicity"), multiplicity); - for (int i = 0; i < static_cast(jet.size()); i++) { - - if (isSelected[i] == 0) - continue; + for (int i = 0; i < static_cast(selectedJet.size()); i++) { // KZeroLambda if (particleOfInterest == Option::KZeroLambda) { @@ -1229,8 +1096,8 @@ struct StrangenessInJets { const auto& neg = v0.negTrack_as(); TVector3 v0dir(v0.px(), v0.py(), v0.pz()); - float deltaEtaJet = v0dir.Eta() - jet[i].Eta(); - float deltaPhiJet = getDeltaPhi(v0dir.Phi(), jet[i].Phi()); + float deltaEtaJet = v0dir.Eta() - selectedJet[i].Eta(); + float deltaPhiJet = getDeltaPhi(v0dir.Phi(), selectedJet[i].Phi()); float deltaRjet = std::sqrt(deltaEtaJet * deltaEtaJet + deltaPhiJet * deltaPhiJet); float deltaEtaUe1 = v0dir.Eta() - ue1[i].Eta(); float deltaPhiUe1 = getDeltaPhi(v0dir.Phi(), ue1[i].Phi()); @@ -1278,8 +1145,8 @@ struct StrangenessInJets { auto neg = casc.negTrack_as(); TVector3 cascadeDir(casc.px(), casc.py(), casc.pz()); - float deltaEtaJet = cascadeDir.Eta() - jet[i].Eta(); - float deltaPhiJet = getDeltaPhi(cascadeDir.Phi(), jet[i].Phi()); + float deltaEtaJet = cascadeDir.Eta() - selectedJet[i].Eta(); + float deltaPhiJet = getDeltaPhi(cascadeDir.Phi(), selectedJet[i].Phi()); float deltaRjet = std::sqrt(deltaEtaJet * deltaEtaJet + deltaPhiJet * deltaPhiJet); float deltaEtaUe1 = cascadeDir.Eta() - ue1[i].Eta(); float deltaPhiUe1 = getDeltaPhi(cascadeDir.Phi(), ue1[i].Phi()); @@ -1339,8 +1206,8 @@ struct StrangenessInJets { continue; TVector3 trackDir(track.px(), track.py(), track.pz()); - const float deltaEtaJet = trackDir.Eta() - jet[i].Eta(); - const float deltaPhiJet = getDeltaPhi(trackDir.Phi(), jet[i].Phi()); + const float deltaEtaJet = trackDir.Eta() - selectedJet[i].Eta(); + const float deltaPhiJet = getDeltaPhi(trackDir.Phi(), selectedJet[i].Phi()); const float deltaRjet = std::sqrt(deltaEtaJet * deltaEtaJet + deltaPhiJet * deltaPhiJet); const float deltaEtaUe1 = trackDir.Eta() - ue1[i].Eta(); const float deltaPhiUe1 = getDeltaPhi(trackDir.Phi(), ue1[i].Phi()); @@ -2014,6 +1881,7 @@ struct StrangenessInJets { } PROCESS_SWITCH(StrangenessInJets, processMCefficiency, "Process MC Efficiency", false); + /* void processGen(o2::aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) { for (const auto& mccollision : mcCollisions) { @@ -2069,7 +1937,7 @@ struct StrangenessInJets { do { double dijMin(1e+06), diBmin(1e+06); int iMin(0), jMin(0), iBmin(0); - for (int i = 0; i < static_cast(trk.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] + for (int i = 0; i < static_cast(trk.size()); i++) { if (trk[i].Mag() == 0) continue; double diB = 1.0 / (trk[i].Pt() * trk[i].Pt()); @@ -2077,7 +1945,7 @@ struct StrangenessInJets { diBmin = diB; iBmin = i; } - for (int j = (i + 1); j < static_cast(trk.size()); j++) { // o2-linter: disable=[const-ref-in-for-loop] + for (int j = (i + 1); j < static_cast(trk.size()); j++) { if (trk[j].Mag() == 0) continue; double dij = calculateDij(trk[i], trk[j], rJet); @@ -2106,7 +1974,7 @@ struct StrangenessInJets { // Jet Selection std::vector isSelected; int nJetsSelected(0); - for (int i = 0; i < static_cast(jet.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] + for (int i = 0; i < static_cast(jet.size()); i++) { // Initialization isSelected.push_back(0); @@ -2114,7 +1982,7 @@ struct StrangenessInJets { // Jet fully contained inside acceptance if ((std::fabs(jet[i].Eta()) + rJet) > (etaMax - 0.5)) continue; - if (nParticlesInjet[i] < minNumberOfParticlesInJet) + if (nParticlesInjet[i] < 2) continue; // Perpendicular cones @@ -2125,8 +1993,8 @@ struct StrangenessInJets { ue1.push_back(ueAxis1); ue2.push_back(ueAxis2); - double ptJetCorr = jet[i].Pt() - averagePtUEMC; - if (ptJetCorr < minimumJetPt) + double ptJetCorr = jet[i].Pt() - 0.5; + if (ptJetCorr < minJetPt) continue; nJetsSelected++; @@ -2135,32 +2003,6 @@ struct StrangenessInJets { if (nJetsSelected == 0) continue; - // Overlaps - int nOverlapsJetJet(0); - int nOverlapsJetUe(0); - int nOverlapsUeUe(0); - int nOverlapsTot(0); - for (int i = 0; i < static_cast(jet.size()); i++) { - if (isSelected[i] == 0) - continue; - - for (int j = (i + 1); j < static_cast(jet.size()); j++) { - if (isSelected[j] == 0) - continue; - if (overlap(jet[i], jet[j], rJet)) - nOverlapsJetJet++; - if (overlap(jet[i], ue1[j], rJet) || overlap(jet[i], ue2[j], rJet)) - nOverlapsJetUe++; - if (overlap(ue1[i], ue1[j], rJet) || overlap(ue1[i], ue2[j], rJet) || overlap(ue2[i], ue2[j], rJet)) - nOverlapsUeUe++; - } - } - nOverlapsTot = nOverlapsJetJet + nOverlapsJetUe + nOverlapsUeUe; - if (nJetsSelected > nJetsPerEventMax) - continue; - if (requireNoOverlap && nOverlapsTot > 0) - continue; - for (int i = 0; i < static_cast(jet.size()); i++) { if (isSelected[i] == 0) @@ -2294,6 +2136,7 @@ struct StrangenessInJets { } } PROCESS_SWITCH(StrangenessInJets, processGen, "Process generated MC", false); + */ }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From adfd0ff6004dc53bc2bfc78f691ecaf3e7c1e09a Mon Sep 17 00:00:00 2001 From: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> Date: Mon, 24 Feb 2025 15:31:05 +0100 Subject: [PATCH 0388/1650] [PWGLF] Fix bestCollisionIndex finding for Run2 analysis + other fixes in analysis task (#10149) --- .../derivedlambdakzeroanalysis.cxx | 586 +++++++++++------- 1 file changed, 349 insertions(+), 237 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx b/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx index c5db2865986..c0a390162db 100644 --- a/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx @@ -9,6 +9,12 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. // +/// \file derivedlambdakzeroanalysis.cxx +/// \brief V0s (K0s, Lambda and antiLambda) analysis task using derived data +/// +/// \author David Dobrigkeit Chinellato , Austrian Academy of Sciences & SMI +/// \author Romain Schotter , Austrian Academy of Sciences & SMI +// // V0 analysis task // ================ // @@ -26,13 +32,16 @@ #include #include #include +#include +#include +#include +#include #include #include #include #include #include -#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -61,15 +70,15 @@ using namespace o2::framework; using namespace o2::framework::expressions; using std::array; -using dauTracks = soa::Join; -using dauMCTracks = soa::Join; -using v0Candidates = soa::Join; -// using v0MCCandidates = soa::Join; -using v0MCCandidates = soa::Join; +using DauTracks = soa::Join; +using DauMCTracks = soa::Join; +using V0Candidates = soa::Join; +// using V0McCandidates = soa::Join; +using V0McCandidates = soa::Join; // simple checkers, but ensure 64 bit integers -#define bitset(var, nbit) ((var) |= (static_cast(1) << static_cast(nbit))) -#define bitcheck(var, nbit) ((var) & (static_cast(1) << static_cast(nbit))) +#define BITSET(var, nbit) ((var) |= (static_cast(1) << static_cast(nbit))) +#define BITCHECK(var, nbit) ((var) & (static_cast(1) << static_cast(nbit))) struct derivedlambdakzeroanalysis { HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -154,7 +163,8 @@ struct derivedlambdakzeroanalysis { // Track quality Configurable minTPCrows{"minTPCrows", 70, "minimum TPC crossed rows"}; Configurable minITSclusters{"minITSclusters", -1, "minimum ITS clusters"}; - Configurable minTPCrowsOverFindableClusters{"minTPCrowsOverFindableClusters", -1, "minimum nbr of TPC crossed rows over findable"}; + Configurable minTPCrowsOverFindableClusters{"minTPCrowsOverFindableClusters", -1, "minimum nbr of TPC crossed rows over findable clusters"}; + Configurable minTPCfoundOverFindableClusters{"minTPCfoundOverFindableClusters", -1, "minimum nbr of found over findable TPC clusters"}; Configurable maxFractionTPCSharedClusters{"maxFractionTPCSharedClusters", 1e+09, "maximum fraction of TPC shared clusters"}; Configurable maxITSchi2PerNcls{"maxITSchi2PerNcls", 1e+09, "maximum ITS chi2 per clusters"}; Configurable maxTPCchi2PerNcls{"maxTPCchi2PerNcls", 1e+09, "maximum TPC chi2 per clusters"}; @@ -167,10 +177,10 @@ struct derivedlambdakzeroanalysis { Configurable requireNegITSafterburnerOnly{"requireNegITSafterburnerOnly", false, "require negative track formed out of afterburner ITS tracks"}; // PID (TPC/TOF) - Configurable TpcPidNsigmaCut{"TpcPidNsigmaCut", 5, "TpcPidNsigmaCut"}; - Configurable TofPidNsigmaCutLaPr{"TofPidNsigmaCutLaPr", 1e+6, "TofPidNsigmaCutLaPr"}; - Configurable TofPidNsigmaCutLaPi{"TofPidNsigmaCutLaPi", 1e+6, "TofPidNsigmaCutLaPi"}; - Configurable TofPidNsigmaCutK0Pi{"TofPidNsigmaCutK0Pi", 1e+6, "TofPidNsigmaCutK0Pi"}; + Configurable tpcPidNsigmaCut{"tpcPidNsigmaCut", 5, "tpcPidNsigmaCut"}; + Configurable tofPidNsigmaCutLaPr{"tofPidNsigmaCutLaPr", 1e+6, "tofPidNsigmaCutLaPr"}; + Configurable tofPidNsigmaCutLaPi{"tofPidNsigmaCutLaPi", 1e+6, "tofPidNsigmaCutLaPi"}; + Configurable tofPidNsigmaCutK0Pi{"tofPidNsigmaCutK0Pi", 1e+6, "tofPidNsigmaCutK0Pi"}; // PID (TOF) Configurable maxDeltaTimeProton{"maxDeltaTimeProton", 1e+9, "check maximum allowed time"}; @@ -199,40 +209,42 @@ struct derivedlambdakzeroanalysis { o2::ml::OnnxModel mlCustomModelGamma; struct : ConfigurableGroup { + std::string prefix = "mlConfigurations"; // JSON group name // ML classifiers: master flags to control whether we should use custom ML classifiers or the scores in the derived data - Configurable useK0ShortScores{"mlConfigurations.useK0ShortScores", false, "use ML scores to select K0Short"}; - Configurable useLambdaScores{"mlConfigurations.useLambdaScores", false, "use ML scores to select Lambda"}; - Configurable useAntiLambdaScores{"mlConfigurations.useAntiLambdaScores", false, "use ML scores to select AntiLambda"}; + Configurable useK0ShortScores{"useK0ShortScores", false, "use ML scores to select K0Short"}; + Configurable useLambdaScores{"useLambdaScores", false, "use ML scores to select Lambda"}; + Configurable useAntiLambdaScores{"useAntiLambdaScores", false, "use ML scores to select AntiLambda"}; - Configurable calculateK0ShortScores{"mlConfigurations.calculateK0ShortScores", false, "calculate K0Short ML scores"}; - Configurable calculateLambdaScores{"mlConfigurations.calculateLambdaScores", false, "calculate Lambda ML scores"}; - Configurable calculateAntiLambdaScores{"mlConfigurations.calculateAntiLambdaScores", false, "calculate AntiLambda ML scores"}; + Configurable calculateK0ShortScores{"calculateK0ShortScores", false, "calculate K0Short ML scores"}; + Configurable calculateLambdaScores{"calculateLambdaScores", false, "calculate Lambda ML scores"}; + Configurable calculateAntiLambdaScores{"calculateAntiLambdaScores", false, "calculate AntiLambda ML scores"}; // ML input for ML calculation - Configurable customModelPathCCDB{"mlConfigurations.customModelPathCCDB", "", "Custom ML Model path in CCDB"}; - Configurable timestampCCDB{"mlConfigurations.timestampCCDB", -1, "timestamp of the ONNX file for ML model used to query in CCDB. Exceptions: > 0 for the specific timestamp, 0 gets the run dependent timestamp"}; - Configurable loadCustomModelsFromCCDB{"mlConfigurations.loadCustomModelsFromCCDB", false, "Flag to enable or disable the loading of custom models from CCDB"}; - Configurable enableOptimizations{"mlConfigurations.enableOptimizations", false, "Enables the ONNX extended model-optimization: sessionOptions.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_EXTENDED)"}; + Configurable customModelPathCCDB{"customModelPathCCDB", "", "Custom ML Model path in CCDB"}; + Configurable timestampCCDB{"timestampCCDB", -1, "timestamp of the ONNX file for ML model used to query in CCDB. Exceptions: > 0 for the specific timestamp, 0 gets the run dependent timestamp"}; + Configurable loadCustomModelsFromCCDB{"loadCustomModelsFromCCDB", false, "Flag to enable or disable the loading of custom models from CCDB"}; + Configurable enableOptimizations{"enableOptimizations", false, "Enables the ONNX extended model-optimization: sessionOptions.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_EXTENDED)"}; // Local paths for test purposes - Configurable localModelPathLambda{"mlConfigurations.localModelPathLambda", "Lambda_BDTModel.onnx", "(std::string) Path to the local .onnx file."}; - Configurable localModelPathAntiLambda{"mlConfigurations.localModelPathAntiLambda", "AntiLambda_BDTModel.onnx", "(std::string) Path to the local .onnx file."}; - Configurable localModelPathK0Short{"mlConfigurations.localModelPathK0Short", "KZeroShort_BDTModel.onnx", "(std::string) Path to the local .onnx file."}; + Configurable localModelPathLambda{"localModelPathLambda", "Lambda_BDTModel.onnx", "(std::string) Path to the local .onnx file."}; + Configurable localModelPathAntiLambda{"localModelPathAntiLambda", "AntiLambda_BDTModel.onnx", "(std::string) Path to the local .onnx file."}; + Configurable localModelPathK0Short{"localModelPathK0Short", "KZeroShort_BDTModel.onnx", "(std::string) Path to the local .onnx file."}; // Thresholds for choosing to populate V0Cores tables with pre-selections - Configurable thresholdLambda{"mlConfigurations.thresholdLambda", -1.0f, "Threshold to keep Lambda candidates"}; - Configurable thresholdAntiLambda{"mlConfigurations.thresholdAntiLambda", -1.0f, "Threshold to keep AntiLambda candidates"}; - Configurable thresholdK0Short{"mlConfigurations.thresholdK0Short", -1.0f, "Threshold to keep K0Short candidates"}; + Configurable thresholdLambda{"thresholdLambda", -1.0f, "Threshold to keep Lambda candidates"}; + Configurable thresholdAntiLambda{"thresholdAntiLambda", -1.0f, "Threshold to keep AntiLambda candidates"}; + Configurable thresholdK0Short{"thresholdK0Short", -1.0f, "Threshold to keep K0Short candidates"}; } mlConfigurations; // CCDB options struct : ConfigurableGroup { - Configurable ccdburl{"ccdbConfigurations.ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; - Configurable grpPath{"ccdbConfigurations.grpPath", "GLO/GRP/GRP", "Path of the grp file"}; - Configurable grpmagPath{"ccdbConfigurations.grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; - Configurable lutPath{"ccdbConfigurations.lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; - Configurable geoPath{"ccdbConfigurations.geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; - Configurable mVtxPath{"ccdbConfigurations.mVtxPath", "GLO/Calib/MeanVertex", "Path of the mean vertex file"}; + std::string prefix = "ccdbConfigurations"; // JSON group name + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; + Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; + Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; + Configurable mVtxPath{"mVtxPath", "GLO/Calib/MeanVertex", "Path of the mean vertex file"}; } ccdbConfigurations; o2::ccdb::CcdbApi ccdbApi; @@ -241,8 +253,8 @@ struct derivedlambdakzeroanalysis { int mRunNumber; std::map metadata; - static constexpr float defaultLifetimeCuts[1][2] = {{30., 20.}}; - Configurable> lifetimecut{"lifetimecut", {defaultLifetimeCuts[0], 2, {"lifetimecutLambda", "lifetimecutK0S"}}, "lifetimecut"}; + static constexpr float DefaultLifetimeCuts[1][2] = {{30., 20.}}; + Configurable> lifetimecut{"lifetimecut", {DefaultLifetimeCuts[0], 2, {"lifetimecutLambda", "lifetimecutK0S"}}, "lifetimecut"}; ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.2f, 2.4f, 2.6f, 2.8f, 3.0f, 3.2f, 3.4f, 3.6f, 3.8f, 4.0f, 4.4f, 4.8f, 5.2f, 5.6f, 6.0f, 6.5f, 7.0f, 7.5f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 17.0f, 19.0f, 21.0f, 23.0f, 25.0f, 30.0f, 35.0f, 40.0f, 50.0f}, "pt axis for analysis"}; ConfigurableAxis axisPtXi{"axisPtXi", {VARIABLE_WIDTH, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.2f, 2.4f, 2.6f, 2.8f, 3.0f, 3.2f, 3.4f, 3.6f, 3.8f, 4.0f, 4.4f, 4.8f, 5.2f, 5.6f, 6.0f, 6.5f, 7.0f, 7.5f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 17.0f, 19.0f, 21.0f, 23.0f, 25.0f, 30.0f, 35.0f, 40.0f, 50.0f}, "pt axis for feeddown from Xi"}; @@ -270,6 +282,9 @@ struct derivedlambdakzeroanalysis { ConfigurableAxis axisEta{"axisEta", {10, -1.0f, 1.0f}, "#eta"}; ConfigurableAxis axisITSchi2{"axisITSchi2", {100, 0.0f, 100.0f}, "#chi^{2} per ITS clusters"}; ConfigurableAxis axisTPCchi2{"axisTPCchi2", {100, 0.0f, 100.0f}, "#chi^{2} per TPC clusters"}; + ConfigurableAxis axisTPCrowsOverFindable{"axisTPCrowsOverFindable", {120, 0.0f, 1.2f}, "Fraction of TPC crossed rows over findable clusters"}; + ConfigurableAxis axisTPCfoundOverFindable{"axisTPCfoundOverFindable", {120, 0.0f, 1.2f}, "Fraction of TPC found over findable clusters"}; + ConfigurableAxis axisTPCsharedClusters{"axisTPCsharedClusters", {101, -0.005f, 1.005f}, "Fraction of TPC shared clusters"}; // UPC axes ConfigurableAxis axisSelGap{"axisSelGap", {4, -1.5, 2.5}, "Gap side"}; @@ -277,11 +292,12 @@ struct derivedlambdakzeroanalysis { // UPC selections SGSelector sgSelector; struct : ConfigurableGroup { - Configurable FV0cut{"upcCuts.FV0cut", 100., "FV0A threshold"}; - Configurable FT0Acut{"upcCuts.FT0Acut", 200., "FT0A threshold"}; - Configurable FT0Ccut{"upcCuts.FT0Ccut", 100., "FT0C threshold"}; - Configurable ZDCcut{"upcCuts.ZDCcut", 10., "ZDC threshold"}; - // Configurable gapSel{"upcCuts.gapSel", 2, "Gap selection"}; + std::string prefix = "upcCuts"; // JSON group name + Configurable fv0Cut{"fv0Cut", 100., "FV0A threshold"}; + Configurable ft0Acut{"ft0Acut", 200., "FT0A threshold"}; + Configurable ft0Ccut{"ft0Ccut", 100., "FT0C threshold"}; + Configurable zdcCut{"zdcCut", 10., "ZDC threshold"}; + // Configurable gapSel{"gapSel", 2, "Gap selection"}; } upcCuts; // AP plot axes @@ -291,7 +307,7 @@ struct derivedlambdakzeroanalysis { // Track quality axes ConfigurableAxis axisTPCrows{"axisTPCrows", {160, 0.0f, 160.0f}, "N TPC rows"}; ConfigurableAxis axisITSclus{"axisITSclus", {7, 0.0f, 7.0f}, "N ITS Clusters"}; - ConfigurableAxis axisITScluMap{"axisITSMap", {128, -0.5f, 127.5f}, "ITS Cluster map"}; + ConfigurableAxis axisITScluMap{"axisITScluMap", {128, -0.5f, 127.5f}, "ITS Cluster map"}; ConfigurableAxis axisDetMap{"axisDetMap", {16, -0.5f, 15.5f}, "Detector use map"}; ConfigurableAxis axisITScluMapCoarse{"axisITScluMapCoarse", {16, -3.5f, 12.5f}, "ITS Coarse cluster map"}; ConfigurableAxis axisDetMapCoarse{"axisDetMapCoarse", {5, -0.5f, 4.5f}, "Detector Coarse user map"}; @@ -304,7 +320,7 @@ struct derivedlambdakzeroanalysis { PresliceUnsorted> perMcCollision = aod::v0data::straMCCollisionId; PresliceUnsorted> perMcCollisionRun2 = aod::v0data::straMCCollisionId; - enum selection : uint64_t { selCosPA = 0, + enum Selection : uint64_t { selCosPA = 0, selRadius, selRadiusMax, selDCANegToPV, @@ -378,71 +394,145 @@ struct derivedlambdakzeroanalysis { isRun3 = false; } // setting CCDB service - ccdb->setURL(ccdbConfigurations.ccdburl); + ccdb->setURL(ccdbConfigurations.ccdbUrl); ccdb->setCaching(true); ccdb->setFatalWhenNull(false); // initialise bit masks - maskTopological = (uint64_t(1) << selCosPA) | (uint64_t(1) << selRadius) | (uint64_t(1) << selDCANegToPV) | (uint64_t(1) << selDCAPosToPV) | (uint64_t(1) << selDCAV0Dau) | (uint64_t(1) << selRadiusMax); - maskTopoNoV0Radius = (uint64_t(1) << selCosPA) | (uint64_t(1) << selDCANegToPV) | (uint64_t(1) << selDCAPosToPV) | (uint64_t(1) << selDCAV0Dau) | (uint64_t(1) << selRadiusMax); - maskTopoNoDCANegToPV = (uint64_t(1) << selCosPA) | (uint64_t(1) << selRadius) | (uint64_t(1) << selDCAPosToPV) | (uint64_t(1) << selDCAV0Dau) | (uint64_t(1) << selRadiusMax); - maskTopoNoDCAPosToPV = (uint64_t(1) << selCosPA) | (uint64_t(1) << selRadius) | (uint64_t(1) << selDCANegToPV) | (uint64_t(1) << selDCAV0Dau) | (uint64_t(1) << selRadiusMax); - maskTopoNoCosPA = (uint64_t(1) << selRadius) | (uint64_t(1) << selDCANegToPV) | (uint64_t(1) << selDCAPosToPV) | (uint64_t(1) << selDCAV0Dau) | (uint64_t(1) << selRadiusMax); - maskTopoNoDCAV0Dau = (uint64_t(1) << selCosPA) | (uint64_t(1) << selRadius) | (uint64_t(1) << selDCANegToPV) | (uint64_t(1) << selDCAPosToPV) | (uint64_t(1) << selRadiusMax); - - maskK0ShortSpecific = (uint64_t(1) << selK0ShortRapidity) | (uint64_t(1) << selK0ShortCTau) | (uint64_t(1) << selK0ShortArmenteros) | (uint64_t(1) << selConsiderK0Short); - maskLambdaSpecific = (uint64_t(1) << selLambdaRapidity) | (uint64_t(1) << selLambdaCTau) | (uint64_t(1) << selConsiderLambda); - maskAntiLambdaSpecific = (uint64_t(1) << selLambdaRapidity) | (uint64_t(1) << selLambdaCTau) | (uint64_t(1) << selConsiderAntiLambda); + // Mask with all topologic selections + maskTopological = 0; + BITSET(maskTopological, selCosPA); + BITSET(maskTopological, selRadius); + BITSET(maskTopological, selDCANegToPV); + BITSET(maskTopological, selDCAPosToPV); + BITSET(maskTopological, selDCAV0Dau); + BITSET(maskTopological, selRadiusMax); + // Mask with all topologic selections, except for V0 radius + maskTopoNoV0Radius = 0; + BITSET(maskTopoNoV0Radius, selCosPA); + BITSET(maskTopoNoV0Radius, selDCANegToPV); + BITSET(maskTopoNoV0Radius, selDCAPosToPV); + BITSET(maskTopoNoV0Radius, selDCAV0Dau); + BITSET(maskTopoNoV0Radius, selRadiusMax); + // Mask with all topologic selections, except for DCA neg. to PV + maskTopoNoDCANegToPV = 0; + BITSET(maskTopoNoDCANegToPV, selCosPA); + BITSET(maskTopoNoDCANegToPV, selRadius); + BITSET(maskTopoNoDCANegToPV, selDCAPosToPV); + BITSET(maskTopoNoDCANegToPV, selDCAV0Dau); + BITSET(maskTopoNoDCANegToPV, selRadiusMax); + // Mask with all topologic selections, except for DCA pos. to PV + maskTopoNoDCAPosToPV = 0; + BITSET(maskTopoNoDCAPosToPV, selCosPA); + BITSET(maskTopoNoDCAPosToPV, selRadius); + BITSET(maskTopoNoDCAPosToPV, selDCANegToPV); + BITSET(maskTopoNoDCAPosToPV, selDCAV0Dau); + BITSET(maskTopoNoDCAPosToPV, selRadiusMax); + // Mask with all topologic selections, except for cosPA + maskTopoNoCosPA = 0; + BITSET(maskTopoNoCosPA, selRadius); + BITSET(maskTopoNoCosPA, selDCANegToPV); + BITSET(maskTopoNoCosPA, selDCAPosToPV); + BITSET(maskTopoNoCosPA, selDCAV0Dau); + BITSET(maskTopoNoCosPA, selRadiusMax); + // Mask with all topologic selections, except for DCA between V0 dau + maskTopoNoDCAV0Dau = 0; + BITSET(maskTopoNoDCAV0Dau, selCosPA); + BITSET(maskTopoNoDCAV0Dau, selRadius); + BITSET(maskTopoNoDCAV0Dau, selDCANegToPV); + BITSET(maskTopoNoDCAV0Dau, selDCAPosToPV); + BITSET(maskTopoNoDCAV0Dau, selRadiusMax); + + // Mask for specifically selecting K0Short + maskK0ShortSpecific = 0; + BITSET(maskK0ShortSpecific, selK0ShortRapidity); + BITSET(maskK0ShortSpecific, selK0ShortCTau); + BITSET(maskK0ShortSpecific, selK0ShortArmenteros); + BITSET(maskK0ShortSpecific, selConsiderK0Short); + // Mask for specifically selecting Lambda + maskLambdaSpecific = 0; + BITSET(maskLambdaSpecific, selLambdaRapidity); + BITSET(maskLambdaSpecific, selLambdaCTau); + BITSET(maskLambdaSpecific, selConsiderLambda); + // Mask for specifically selecting AntiLambda + maskAntiLambdaSpecific = 0; + BITSET(maskAntiLambdaSpecific, selLambdaRapidity); + BITSET(maskAntiLambdaSpecific, selLambdaCTau); + BITSET(maskAntiLambdaSpecific, selConsiderAntiLambda); // ask for specific TPC/TOF PID selections maskTrackProperties = 0; if (v0Selections.requirePosITSonly) { - maskTrackProperties = maskTrackProperties | (uint64_t(1) << selPosItsOnly) | (uint64_t(1) << selPosGoodITSTrack); + BITSET(maskTrackProperties, selPosItsOnly); + BITSET(maskTrackProperties, selPosGoodITSTrack); } else { - maskTrackProperties = maskTrackProperties | (uint64_t(1) << selPosGoodTPCTrack) | (uint64_t(1) << selPosGoodITSTrack); + BITSET(maskTrackProperties, selPosGoodTPCTrack); + BITSET(maskTrackProperties, selPosGoodITSTrack); // TPC signal is available: ask for positive track PID - if (v0Selections.TpcPidNsigmaCut < 1e+5) { // safeguard for no cut - maskK0ShortSpecific = maskK0ShortSpecific | (uint64_t(1) << selTPCPIDPositivePion); - maskLambdaSpecific = maskLambdaSpecific | (uint64_t(1) << selTPCPIDPositiveProton); - maskAntiLambdaSpecific = maskAntiLambdaSpecific | (uint64_t(1) << selTPCPIDPositivePion); + if (v0Selections.tpcPidNsigmaCut < 1e+5) { // safeguard for no cut + BITSET(maskK0ShortSpecific, selTPCPIDPositivePion); + BITSET(maskLambdaSpecific, selTPCPIDPositiveProton); + BITSET(maskAntiLambdaSpecific, selTPCPIDPositivePion); } // TOF PID - if (v0Selections.TofPidNsigmaCutK0Pi < 1e+5) // safeguard for no cut - maskK0ShortSpecific = maskK0ShortSpecific | (uint64_t(1) << selTOFNSigmaPositivePionK0Short) | (uint64_t(1) << selTOFDeltaTPositivePionK0Short); - if (v0Selections.TofPidNsigmaCutLaPr < 1e+5) // safeguard for no cut - maskLambdaSpecific = maskLambdaSpecific | (uint64_t(1) << selTOFNSigmaPositiveProtonLambda) | (uint64_t(1) << selTOFDeltaTPositiveProtonLambda); - if (v0Selections.TofPidNsigmaCutLaPi < 1e+5) // safeguard for no cut - maskAntiLambdaSpecific = maskAntiLambdaSpecific | (uint64_t(1) << selTOFNSigmaPositivePionLambda) | (uint64_t(1) << selTOFDeltaTPositivePionLambda); + if (v0Selections.tofPidNsigmaCutK0Pi < 1e+5) { // safeguard for no cut + BITSET(maskK0ShortSpecific, selTOFNSigmaPositivePionK0Short); + BITSET(maskK0ShortSpecific, selTOFDeltaTPositivePionK0Short); + } + if (v0Selections.tofPidNsigmaCutLaPr < 1e+5) { // safeguard for no cut + BITSET(maskLambdaSpecific, selTOFNSigmaPositiveProtonLambda); + BITSET(maskLambdaSpecific, selTOFDeltaTPositiveProtonLambda); + } + if (v0Selections.tofPidNsigmaCutLaPi < 1e+5) { // safeguard for no cut + BITSET(maskAntiLambdaSpecific, selTOFNSigmaPositivePionLambda); + BITSET(maskAntiLambdaSpecific, selTOFDeltaTPositivePionLambda); + } } if (v0Selections.requireNegITSonly) { - maskTrackProperties = maskTrackProperties | (uint64_t(1) << selNegItsOnly) | (uint64_t(1) << selNegGoodITSTrack); + BITSET(maskTrackProperties, selNegItsOnly); + BITSET(maskTrackProperties, selNegGoodITSTrack); } else { - maskTrackProperties = maskTrackProperties | (uint64_t(1) << selNegGoodTPCTrack) | (uint64_t(1) << selNegGoodITSTrack); + BITSET(maskTrackProperties, selNegGoodTPCTrack); + BITSET(maskTrackProperties, selNegGoodITSTrack); // TPC signal is available: ask for negative track PID - if (v0Selections.TpcPidNsigmaCut < 1e+5) { // safeguard for no cut - maskK0ShortSpecific = maskK0ShortSpecific | (uint64_t(1) << selTPCPIDNegativePion); - maskLambdaSpecific = maskLambdaSpecific | (uint64_t(1) << selTPCPIDNegativePion); - maskAntiLambdaSpecific = maskAntiLambdaSpecific | (uint64_t(1) << selTPCPIDNegativeProton); + if (v0Selections.tpcPidNsigmaCut < 1e+5) { // safeguard for no cut + BITSET(maskK0ShortSpecific, selTPCPIDNegativePion); + BITSET(maskLambdaSpecific, selTPCPIDNegativePion); + BITSET(maskAntiLambdaSpecific, selTPCPIDNegativeProton); } // TOF PID - if (v0Selections.TofPidNsigmaCutK0Pi < 1e+5) // safeguard for no cut - maskK0ShortSpecific = maskK0ShortSpecific | (uint64_t(1) << selTOFNSigmaNegativePionK0Short) | (uint64_t(1) << selTOFDeltaTNegativePionK0Short); - if (v0Selections.TofPidNsigmaCutLaPi < 1e+5) // safeguard for no cut - maskLambdaSpecific = maskLambdaSpecific | (uint64_t(1) << selTOFNSigmaNegativePionLambda) | (uint64_t(1) << selTOFDeltaTNegativePionLambda); - if (v0Selections.TofPidNsigmaCutLaPr < 1e+5) // safeguard for no cut - maskAntiLambdaSpecific = maskAntiLambdaSpecific | (uint64_t(1) << selTOFNSigmaNegativeProtonLambda) | (uint64_t(1) << selTOFDeltaTNegativeProtonLambda); + if (v0Selections.tofPidNsigmaCutK0Pi < 1e+5) { // safeguard for no cut + BITSET(maskK0ShortSpecific, selTOFNSigmaNegativePionK0Short); + BITSET(maskK0ShortSpecific, selTOFDeltaTNegativePionK0Short); + } + if (v0Selections.tofPidNsigmaCutLaPi < 1e+5) { // safeguard for no cut + BITSET(maskLambdaSpecific, selTOFNSigmaNegativePionLambda); + BITSET(maskLambdaSpecific, selTOFDeltaTNegativePionLambda); + } + if (v0Selections.tofPidNsigmaCutLaPr < 1e+5) { // safeguard for no cut + BITSET(maskAntiLambdaSpecific, selTOFNSigmaNegativeProtonLambda); + BITSET(maskAntiLambdaSpecific, selTOFDeltaTNegativeProtonLambda); + } } if (v0Selections.skipTPConly) { - maskK0ShortSpecific = maskK0ShortSpecific | (uint64_t(1) << selPosNotTPCOnly) | (uint64_t(1) << selNegNotTPCOnly); - maskLambdaSpecific = maskLambdaSpecific | (uint64_t(1) << selPosNotTPCOnly) | (uint64_t(1) << selNegNotTPCOnly); - maskAntiLambdaSpecific = maskAntiLambdaSpecific | (uint64_t(1) << selPosNotTPCOnly) | (uint64_t(1) << selNegNotTPCOnly); + BITSET(maskK0ShortSpecific, selPosNotTPCOnly); + BITSET(maskLambdaSpecific, selPosNotTPCOnly); + BITSET(maskAntiLambdaSpecific, selPosNotTPCOnly); + + BITSET(maskK0ShortSpecific, selNegNotTPCOnly); + BITSET(maskLambdaSpecific, selNegNotTPCOnly); + BITSET(maskAntiLambdaSpecific, selNegNotTPCOnly); } // Primary particle selection, central to analysis - maskSelectionK0Short = maskTopological | maskTrackProperties | maskK0ShortSpecific | (uint64_t(1) << selPhysPrimK0Short); - maskSelectionLambda = maskTopological | maskTrackProperties | maskLambdaSpecific | (uint64_t(1) << selPhysPrimLambda); - maskSelectionAntiLambda = maskTopological | maskTrackProperties | maskAntiLambdaSpecific | (uint64_t(1) << selPhysPrimAntiLambda); + maskSelectionK0Short = maskTopological | maskTrackProperties | maskK0ShortSpecific | (static_cast(1) << selPhysPrimK0Short); + maskSelectionLambda = maskTopological | maskTrackProperties | maskLambdaSpecific | (static_cast(1) << selPhysPrimLambda); + maskSelectionAntiLambda = maskTopological | maskTrackProperties | maskAntiLambdaSpecific | (static_cast(1) << selPhysPrimAntiLambda); + + BITSET(maskSelectionK0Short, selPhysPrimK0Short); + BITSET(maskSelectionLambda, selPhysPrimLambda); + BITSET(maskSelectionAntiLambda, selPhysPrimAntiLambda); // No primary requirement for feeddown matrix secondaryMaskSelectionLambda = maskTopological | maskTrackProperties | maskLambdaSpecific; @@ -584,8 +674,9 @@ struct derivedlambdakzeroanalysis { if (doDetectPropQA == 3) { histos.add("K0Short/h3dITSchi2", "h3dMaxITSchi2", kTH3F, {axisCentrality, axisPtCoarse, axisITSchi2}); histos.add("K0Short/h3dTPCchi2", "h3dMaxTPCchi2", kTH3F, {axisCentrality, axisPtCoarse, axisTPCchi2}); - histos.add("K0Short/h3dTPCrowsOverFindable", "h3dTPCrowsOverFindable", kTH3F, {axisCentrality, axisPtCoarse, {100, 0.0f, 1.0f}}); - histos.add("K0Short/h3dTPCsharedCls", "h3dTPCsharedCls", kTH3F, {axisCentrality, axisPtCoarse, {100, 0.0f, 1.0f}}); + histos.add("K0Short/h3dTPCFoundOverFindable", "h3dTPCFoundOverFindable", kTH3F, {axisCentrality, axisPtCoarse, axisTPCfoundOverFindable}); + histos.add("K0Short/h3dTPCrowsOverFindable", "h3dTPCrowsOverFindable", kTH3F, {axisCentrality, axisPtCoarse, axisTPCrowsOverFindable}); + histos.add("K0Short/h3dTPCsharedCls", "h3dTPCsharedCls", kTH3F, {axisCentrality, axisPtCoarse, axisTPCsharedClusters}); histos.add("K0Short/h3dPositiveITSchi2", "h3dPositiveITSchi2", kTH3F, {axisCentrality, axisPtCoarse, axisITSchi2}); histos.add("K0Short/h3dNegativeITSchi2", "h3dNegativeITSchi2", kTH3F, {axisCentrality, axisPtCoarse, axisITSchi2}); histos.add("K0Short/h3dPositiveTPCchi2", "h3dPositiveTPCchi2", kTH3F, {axisCentrality, axisPtCoarse, axisTPCchi2}); @@ -650,8 +741,9 @@ struct derivedlambdakzeroanalysis { if (doDetectPropQA == 3) { histos.add("Lambda/h3dITSchi2", "h3dMaxITSchi2", kTH3F, {axisCentrality, axisPtCoarse, axisITSchi2}); histos.add("Lambda/h3dTPCchi2", "h3dMaxTPCchi2", kTH3F, {axisCentrality, axisPtCoarse, axisTPCchi2}); - histos.add("Lambda/h3dTPCrowsOverFindable", "h3dTPCrowsOverFindable", kTH3F, {axisCentrality, axisPtCoarse, {100, 0.0f, 1.0f}}); - histos.add("Lambda/h3dTPCsharedCls", "h3dTPCsharedCls", kTH3F, {axisCentrality, axisPtCoarse, {100, 0.0f, 1.0f}}); + histos.add("Lambda/h3dTPCFoundOverFindable", "h3dTPCFoundOverFindable", kTH3F, {axisCentrality, axisPtCoarse, axisTPCfoundOverFindable}); + histos.add("Lambda/h3dTPCrowsOverFindable", "h3dTPCrowsOverFindable", kTH3F, {axisCentrality, axisPtCoarse, axisTPCrowsOverFindable}); + histos.add("Lambda/h3dTPCsharedCls", "h3dTPCsharedCls", kTH3F, {axisCentrality, axisPtCoarse, axisTPCsharedClusters}); histos.add("Lambda/h3dPositiveITSchi2", "h3dPositiveITSchi2", kTH3F, {axisCentrality, axisPtCoarse, axisITSchi2}); histos.add("Lambda/h3dNegativeITSchi2", "h3dNegativeITSchi2", kTH3F, {axisCentrality, axisPtCoarse, axisITSchi2}); histos.add("Lambda/h3dPositiveTPCchi2", "h3dPositiveTPCchi2", kTH3F, {axisCentrality, axisPtCoarse, axisTPCchi2}); @@ -716,8 +808,9 @@ struct derivedlambdakzeroanalysis { if (doDetectPropQA == 3) { histos.add("AntiLambda/h3dITSchi2", "h3dMaxITSchi2", kTH3F, {axisCentrality, axisPtCoarse, axisITSchi2}); histos.add("AntiLambda/h3dTPCchi2", "h3dMaxTPCchi2", kTH3F, {axisCentrality, axisPtCoarse, axisTPCchi2}); - histos.add("AntiLambda/h3dTPCrowsOverFindable", "h3dTPCrowsOverFindable", kTH3F, {axisCentrality, axisPtCoarse, {100, 0.0f, 1.0f}}); - histos.add("AntiLambda/h3dTPCsharedCls", "h3dTPCsharedCls", kTH3F, {axisCentrality, axisPtCoarse, {100, 0.0f, 1.0f}}); + histos.add("AntiLambda/h3dTPCFoundOverFindable", "h3dTPCFoundOverFindable", kTH3F, {axisCentrality, axisPtCoarse, axisTPCfoundOverFindable}); + histos.add("AntiLambda/h3dTPCrowsOverFindable", "h3dTPCrowsOverFindable", kTH3F, {axisCentrality, axisPtCoarse, axisTPCrowsOverFindable}); + histos.add("AntiLambda/h3dTPCsharedCls", "h3dTPCsharedCls", kTH3F, {axisCentrality, axisPtCoarse, axisTPCsharedClusters}); histos.add("AntiLambda/h3dPositiveITSchi2", "h3dPositiveITSchi2", kTH3F, {axisCentrality, axisPtCoarse, axisITSchi2}); histos.add("AntiLambda/h3dNegativeITSchi2", "h3dNegativeITSchi2", kTH3F, {axisCentrality, axisPtCoarse, axisITSchi2}); histos.add("AntiLambda/h3dPositiveTPCchi2", "h3dPositiveTPCchi2", kTH3F, {axisCentrality, axisPtCoarse, axisTPCchi2}); @@ -886,7 +979,7 @@ struct derivedlambdakzeroanalysis { int64_t timeStampML = collision.timestamp(); if (mlConfigurations.timestampCCDB.value != -1) timeStampML = mlConfigurations.timestampCCDB.value; - LoadMachines(timeStampML); + loadMachines(timeStampML); } } @@ -897,26 +990,26 @@ struct derivedlambdakzeroanalysis { uint64_t bitMap = 0; // Base topological variables if (v0.v0radius() > v0Selections.v0radius) - bitset(bitMap, selRadius); + BITSET(bitMap, selRadius); if (v0.v0radius() < v0Selections.v0radiusMax) - bitset(bitMap, selRadiusMax); - if (TMath::Abs(v0.dcapostopv()) > v0Selections.dcapostopv) - bitset(bitMap, selDCAPosToPV); - if (TMath::Abs(v0.dcanegtopv()) > v0Selections.dcanegtopv) - bitset(bitMap, selDCANegToPV); + BITSET(bitMap, selRadiusMax); + if (std::abs(v0.dcapostopv()) > v0Selections.dcapostopv) + BITSET(bitMap, selDCAPosToPV); + if (std::abs(v0.dcanegtopv()) > v0Selections.dcanegtopv) + BITSET(bitMap, selDCANegToPV); if (v0.v0cosPA() > v0Selections.v0cospa) - bitset(bitMap, selCosPA); + BITSET(bitMap, selCosPA); if (v0.dcaV0daughters() < v0Selections.dcav0dau) - bitset(bitMap, selDCAV0Dau); + BITSET(bitMap, selDCAV0Dau); // rapidity - if (TMath::Abs(rapidityLambda) < v0Selections.rapidityCut) - bitset(bitMap, selLambdaRapidity); - if (TMath::Abs(rapidityK0Short) < v0Selections.rapidityCut) - bitset(bitMap, selK0ShortRapidity); + if (std::abs(rapidityLambda) < v0Selections.rapidityCut) + BITSET(bitMap, selLambdaRapidity); + if (std::abs(rapidityK0Short) < v0Selections.rapidityCut) + BITSET(bitMap, selK0ShortRapidity); - auto posTrackExtra = v0.template posTrackExtra_as(); - auto negTrackExtra = v0.template negTrackExtra_as(); + auto posTrackExtra = v0.template posTrackExtra_as(); + auto negTrackExtra = v0.template negTrackExtra_as(); // ITS quality flags bool posIsFromAfterburner = posTrackExtra.hasITSAfterburner(); @@ -927,88 +1020,90 @@ struct derivedlambdakzeroanalysis { posTrackExtra.itsChi2NCl() < v0Selections.maxITSchi2PerNcls && // check maximum ITS chi2 per clusters (!v0Selections.rejectPosITSafterburner || !posIsFromAfterburner) && // reject afterburner track or not (!v0Selections.requirePosITSafterburnerOnly || posIsFromAfterburner)) // keep afterburner track or not - bitset(bitMap, selPosGoodITSTrack); + BITSET(bitMap, selPosGoodITSTrack); if (negTrackExtra.itsNCls() >= v0Selections.minITSclusters && // check minium ITS clusters negTrackExtra.itsChi2NCl() < v0Selections.maxITSchi2PerNcls && // check maximum ITS chi2 per clusters (!v0Selections.rejectNegITSafterburner || !negIsFromAfterburner) && // reject afterburner track or not (!v0Selections.requireNegITSafterburnerOnly || negIsFromAfterburner)) // select only afterburner track or not - bitset(bitMap, selNegGoodITSTrack); + BITSET(bitMap, selNegGoodITSTrack); // TPC quality flags if (posTrackExtra.tpcCrossedRows() >= v0Selections.minTPCrows && // check minimum TPC crossed rows posTrackExtra.tpcChi2NCl() < v0Selections.maxTPCchi2PerNcls && // check maximum TPC chi2 per clusters posTrackExtra.tpcCrossedRowsOverFindableCls() >= v0Selections.minTPCrowsOverFindableClusters && // check minimum fraction of TPC rows over findable + posTrackExtra.tpcFoundOverFindableCls() >= v0Selections.minTPCfoundOverFindableClusters && // check minimum fraction of found over findable TPC clusters posTrackExtra.tpcFractionSharedCls() < v0Selections.maxFractionTPCSharedClusters) // check the maximum fraction of allowed shared TPC clusters - bitset(bitMap, selPosGoodTPCTrack); + BITSET(bitMap, selPosGoodTPCTrack); if (negTrackExtra.tpcCrossedRows() >= v0Selections.minTPCrows && // check minimum TPC crossed rows negTrackExtra.tpcChi2NCl() < v0Selections.maxTPCchi2PerNcls && // check maximum TPC chi2 per clusters negTrackExtra.tpcCrossedRowsOverFindableCls() >= v0Selections.minTPCrowsOverFindableClusters && // check minimum fraction of TPC rows over findable + negTrackExtra.tpcFoundOverFindableCls() >= v0Selections.minTPCfoundOverFindableClusters && // check minimum fraction of found over findable TPC clusters negTrackExtra.tpcFractionSharedCls() < v0Selections.maxFractionTPCSharedClusters) // check the maximum fraction of allowed shared TPC clusters - bitset(bitMap, selNegGoodTPCTrack); + BITSET(bitMap, selNegGoodTPCTrack); // TPC PID - if (fabs(posTrackExtra.tpcNSigmaPi()) < v0Selections.TpcPidNsigmaCut) - bitset(bitMap, selTPCPIDPositivePion); - if (fabs(posTrackExtra.tpcNSigmaPr()) < v0Selections.TpcPidNsigmaCut) - bitset(bitMap, selTPCPIDPositiveProton); - if (fabs(negTrackExtra.tpcNSigmaPi()) < v0Selections.TpcPidNsigmaCut) - bitset(bitMap, selTPCPIDNegativePion); - if (fabs(negTrackExtra.tpcNSigmaPr()) < v0Selections.TpcPidNsigmaCut) - bitset(bitMap, selTPCPIDNegativeProton); + if (std::fabs(posTrackExtra.tpcNSigmaPi()) < v0Selections.tpcPidNsigmaCut) + BITSET(bitMap, selTPCPIDPositivePion); + if (std::fabs(posTrackExtra.tpcNSigmaPr()) < v0Selections.tpcPidNsigmaCut) + BITSET(bitMap, selTPCPIDPositiveProton); + if (std::fabs(negTrackExtra.tpcNSigmaPi()) < v0Selections.tpcPidNsigmaCut) + BITSET(bitMap, selTPCPIDNegativePion); + if (std::fabs(negTrackExtra.tpcNSigmaPr()) < v0Selections.tpcPidNsigmaCut) + BITSET(bitMap, selTPCPIDNegativeProton); // TOF PID in DeltaT // Positive track - if (fabs(v0.posTOFDeltaTLaPr()) < v0Selections.maxDeltaTimeProton) - bitset(bitMap, selTOFDeltaTPositiveProtonLambda); - if (fabs(v0.posTOFDeltaTLaPi()) < v0Selections.maxDeltaTimePion) - bitset(bitMap, selTOFDeltaTPositivePionLambda); - if (fabs(v0.posTOFDeltaTK0Pi()) < v0Selections.maxDeltaTimePion) - bitset(bitMap, selTOFDeltaTPositivePionK0Short); + if (std::fabs(v0.posTOFDeltaTLaPr()) < v0Selections.maxDeltaTimeProton) + BITSET(bitMap, selTOFDeltaTPositiveProtonLambda); + if (std::fabs(v0.posTOFDeltaTLaPi()) < v0Selections.maxDeltaTimePion) + BITSET(bitMap, selTOFDeltaTPositivePionLambda); + if (std::fabs(v0.posTOFDeltaTK0Pi()) < v0Selections.maxDeltaTimePion) + BITSET(bitMap, selTOFDeltaTPositivePionK0Short); // Negative track - if (fabs(v0.negTOFDeltaTLaPr()) < v0Selections.maxDeltaTimeProton) - bitset(bitMap, selTOFDeltaTNegativeProtonLambda); - if (fabs(v0.negTOFDeltaTLaPi()) < v0Selections.maxDeltaTimePion) - bitset(bitMap, selTOFDeltaTNegativePionLambda); - if (fabs(v0.negTOFDeltaTK0Pi()) < v0Selections.maxDeltaTimePion) - bitset(bitMap, selTOFDeltaTNegativePionK0Short); + if (std::fabs(v0.negTOFDeltaTLaPr()) < v0Selections.maxDeltaTimeProton) + BITSET(bitMap, selTOFDeltaTNegativeProtonLambda); + if (std::fabs(v0.negTOFDeltaTLaPi()) < v0Selections.maxDeltaTimePion) + BITSET(bitMap, selTOFDeltaTNegativePionLambda); + if (std::fabs(v0.negTOFDeltaTK0Pi()) < v0Selections.maxDeltaTimePion) + BITSET(bitMap, selTOFDeltaTNegativePionK0Short); // TOF PID in NSigma // Positive track - if (fabs(v0.tofNSigmaLaPr()) < v0Selections.TofPidNsigmaCutLaPr) - bitset(bitMap, selTOFNSigmaPositiveProtonLambda); - if (fabs(v0.tofNSigmaALaPi()) < v0Selections.TofPidNsigmaCutLaPi) - bitset(bitMap, selTOFNSigmaPositivePionLambda); - if (fabs(v0.tofNSigmaK0PiPlus()) < v0Selections.TofPidNsigmaCutK0Pi) - bitset(bitMap, selTOFNSigmaPositivePionK0Short); + if (std::fabs(v0.tofNSigmaLaPr()) < v0Selections.tofPidNsigmaCutLaPr) + BITSET(bitMap, selTOFNSigmaPositiveProtonLambda); + if (std::fabs(v0.tofNSigmaALaPi()) < v0Selections.tofPidNsigmaCutLaPi) + BITSET(bitMap, selTOFNSigmaPositivePionLambda); + if (std::fabs(v0.tofNSigmaK0PiPlus()) < v0Selections.tofPidNsigmaCutK0Pi) + BITSET(bitMap, selTOFNSigmaPositivePionK0Short); // Negative track - if (fabs(v0.tofNSigmaALaPr()) < v0Selections.TofPidNsigmaCutLaPr) - bitset(bitMap, selTOFNSigmaNegativeProtonLambda); - if (fabs(v0.tofNSigmaLaPi()) < v0Selections.TofPidNsigmaCutLaPi) - bitset(bitMap, selTOFNSigmaNegativePionLambda); - if (fabs(v0.tofNSigmaK0PiMinus()) < v0Selections.TofPidNsigmaCutK0Pi) - bitset(bitMap, selTOFNSigmaNegativePionK0Short); + if (std::fabs(v0.tofNSigmaALaPr()) < v0Selections.tofPidNsigmaCutLaPr) + BITSET(bitMap, selTOFNSigmaNegativeProtonLambda); + if (std::fabs(v0.tofNSigmaLaPi()) < v0Selections.tofPidNsigmaCutLaPi) + BITSET(bitMap, selTOFNSigmaNegativePionLambda); + if (std::fabs(v0.tofNSigmaK0PiMinus()) < v0Selections.tofPidNsigmaCutK0Pi) + BITSET(bitMap, selTOFNSigmaNegativePionK0Short); // ITS only tag if (posTrackExtra.tpcCrossedRows() < 1) - bitset(bitMap, selPosItsOnly); + BITSET(bitMap, selPosItsOnly); if (negTrackExtra.tpcCrossedRows() < 1) - bitset(bitMap, selNegItsOnly); + BITSET(bitMap, selNegItsOnly); // TPC only tag if (posTrackExtra.detectorMap() != o2::aod::track::TPC) - bitset(bitMap, selPosNotTPCOnly); + BITSET(bitMap, selPosNotTPCOnly); if (negTrackExtra.detectorMap() != o2::aod::track::TPC) - bitset(bitMap, selNegNotTPCOnly); + BITSET(bitMap, selNegNotTPCOnly); // proper lifetime if (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0 < lifetimecut->get("lifetimecutLambda")) - bitset(bitMap, selLambdaCTau); + BITSET(bitMap, selLambdaCTau); if (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecut->get("lifetimecutK0S")) - bitset(bitMap, selK0ShortCTau); + BITSET(bitMap, selK0ShortCTau); // armenteros - if (v0.qtarm() * v0Selections.armPodCut > TMath::Abs(v0.alpha()) || v0Selections.armPodCut < 1e-4) - bitset(bitMap, selK0ShortArmenteros); + if (v0.qtarm() * v0Selections.armPodCut > std::abs(v0.alpha()) || v0Selections.armPodCut < 1e-4) + BITSET(bitMap, selK0ShortArmenteros); return bitMap; } @@ -1024,19 +1119,19 @@ struct derivedlambdakzeroanalysis { bool isNegativePion = v0.pdgCodeNegative() == -211 || (doTreatPiToMuon && v0.pdgCodeNegative() == 13); if (v0.pdgCode() == 310 && isPositivePion && isNegativePion) { - bitset(bitMap, selConsiderK0Short); + BITSET(bitMap, selConsiderK0Short); if (v0.isPhysicalPrimary()) - bitset(bitMap, selPhysPrimK0Short); + BITSET(bitMap, selPhysPrimK0Short); } if (v0.pdgCode() == 3122 && isPositiveProton && isNegativePion) { - bitset(bitMap, selConsiderLambda); + BITSET(bitMap, selConsiderLambda); if (v0.isPhysicalPrimary()) - bitset(bitMap, selPhysPrimLambda); + BITSET(bitMap, selPhysPrimLambda); } if (v0.pdgCode() == -3122 && isPositivePion && isNegativeProton) { - bitset(bitMap, selConsiderAntiLambda); + BITSET(bitMap, selConsiderAntiLambda); if (v0.isPhysicalPrimary()) - bitset(bitMap, selPhysPrimAntiLambda); + BITSET(bitMap, selPhysPrimAntiLambda); } return bitMap; } @@ -1153,10 +1248,10 @@ struct derivedlambdakzeroanalysis { } // function to load models for ML-based classifiers - void LoadMachines(int64_t timeStampML) + void loadMachines(int64_t timeStampML) { if (mlConfigurations.loadCustomModelsFromCCDB) { - ccdbApi.init(ccdbConfigurations.ccdburl); + ccdbApi.init(ccdbConfigurations.ccdbUrl); LOG(info) << "Fetching models for timestamp: " << timeStampML; if (mlConfigurations.calculateLambdaScores) { @@ -1254,8 +1349,8 @@ struct derivedlambdakzeroanalysis { passAntiLambdaSelections = verifyMask(selMap, maskSelectionAntiLambda); } - auto posTrackExtra = v0.template posTrackExtra_as(); - auto negTrackExtra = v0.template negTrackExtra_as(); + auto posTrackExtra = v0.template posTrackExtra_as(); + auto negTrackExtra = v0.template negTrackExtra_as(); bool posIsFromAfterburner = posTrackExtra.itsChi2PerNcl() < 0; bool negIsFromAfterburner = negTrackExtra.itsChi2PerNcl() < 0; @@ -1271,7 +1366,7 @@ struct derivedlambdakzeroanalysis { histos.fill(HIST("hPosDCAToPV"), v0.dcapostopv()); histos.fill(HIST("hNegDCAToPV"), v0.dcanegtopv()); histos.fill(HIST("hDCADaughters"), v0.dcaV0daughters()); - histos.fill(HIST("hPointingAngle"), TMath::ACos(v0.v0cosPA())); + histos.fill(HIST("hPointingAngle"), std::acos(v0.v0cosPA())); histos.fill(HIST("hV0Radius"), v0.v0radius()); histos.fill(HIST("h2dPositiveITSvsTPCpts"), posTrackExtra.tpcCrossedRows(), posTrackExtra.itsNCls()); histos.fill(HIST("h2dNegativeITSvsTPCpts"), negTrackExtra.tpcCrossedRows(), negTrackExtra.itsNCls()); @@ -1295,7 +1390,7 @@ struct derivedlambdakzeroanalysis { histos.fill(HIST("K0Short/hPosDCAToPV"), v0.dcapostopv()); histos.fill(HIST("K0Short/hNegDCAToPV"), v0.dcanegtopv()); histos.fill(HIST("K0Short/hDCADaughters"), v0.dcaV0daughters()); - histos.fill(HIST("K0Short/hPointingAngle"), TMath::ACos(v0.v0cosPA())); + histos.fill(HIST("K0Short/hPointingAngle"), std::acos(v0.v0cosPA())); histos.fill(HIST("K0Short/hV0Radius"), v0.v0radius()); histos.fill(HIST("K0Short/h2dPositiveITSvsTPCpts"), posTrackExtra.tpcCrossedRows(), posTrackExtra.itsNCls()); histos.fill(HIST("K0Short/h2dNegativeITSvsTPCpts"), negTrackExtra.tpcCrossedRows(), negTrackExtra.itsNCls()); @@ -1313,6 +1408,7 @@ struct derivedlambdakzeroanalysis { if (doDetectPropQA == 3) { histos.fill(HIST("K0Short/h3dITSchi2"), centrality, pt, std::max(posTrackExtra.itsChi2NCl(), negTrackExtra.itsChi2NCl())); histos.fill(HIST("K0Short/h3dTPCchi2"), centrality, pt, std::max(posTrackExtra.tpcChi2NCl(), negTrackExtra.tpcChi2NCl())); + histos.fill(HIST("K0Short/h3dTPCFoundOverFindable"), centrality, pt, std::min(posTrackExtra.tpcFoundOverFindableCls(), negTrackExtra.tpcFoundOverFindableCls())); histos.fill(HIST("K0Short/h3dTPCrowsOverFindable"), centrality, pt, std::min(posTrackExtra.tpcCrossedRowsOverFindableCls(), negTrackExtra.tpcCrossedRowsOverFindableCls())); histos.fill(HIST("K0Short/h3dTPCsharedCls"), centrality, pt, std::max(posTrackExtra.tpcFractionSharedCls(), negTrackExtra.tpcFractionSharedCls())); histos.fill(HIST("K0Short/h3dPositiveITSchi2"), centrality, pt, posTrackExtra.itsChi2NCl()); @@ -1329,10 +1425,10 @@ struct derivedlambdakzeroanalysis { histos.fill(HIST("K0Short/h3dNegNsigmaTPC"), centrality, pt, negTrackExtra.tpcNSigmaPi()); histos.fill(HIST("K0Short/h3dPosTPCsignal"), centrality, pt, posTrackExtra.tpcSignal()); histos.fill(HIST("K0Short/h3dNegTPCsignal"), centrality, pt, negTrackExtra.tpcSignal()); - histos.fill(HIST("K0Short/h3dPosNsigmaTPCvsTrackPtot"), centrality, v0.positivept() * TMath::CosH(v0.positiveeta()), posTrackExtra.tpcNSigmaPi()); - histos.fill(HIST("K0Short/h3dNegNsigmaTPCvsTrackPtot"), centrality, v0.negativept() * TMath::CosH(v0.negativeeta()), negTrackExtra.tpcNSigmaPi()); - histos.fill(HIST("K0Short/h3dPosTPCsignalVsTrackPtot"), centrality, v0.positivept() * TMath::CosH(v0.positiveeta()), posTrackExtra.tpcSignal()); - histos.fill(HIST("K0Short/h3dNegTPCsignalVsTrackPtot"), centrality, v0.negativept() * TMath::CosH(v0.negativeeta()), negTrackExtra.tpcSignal()); + histos.fill(HIST("K0Short/h3dPosNsigmaTPCvsTrackPtot"), centrality, v0.pfracpos() * v0.p(), posTrackExtra.tpcNSigmaPi()); + histos.fill(HIST("K0Short/h3dNegNsigmaTPCvsTrackPtot"), centrality, v0.pfracneg() * v0.p(), negTrackExtra.tpcNSigmaPi()); + histos.fill(HIST("K0Short/h3dPosTPCsignalVsTrackPtot"), centrality, v0.pfracpos() * v0.p(), posTrackExtra.tpcSignal()); + histos.fill(HIST("K0Short/h3dNegTPCsignalVsTrackPtot"), centrality, v0.pfracneg() * v0.p(), negTrackExtra.tpcSignal()); histos.fill(HIST("K0Short/h3dPosNsigmaTPCvsTrackPt"), centrality, v0.positivept(), posTrackExtra.tpcNSigmaPi()); histos.fill(HIST("K0Short/h3dNegNsigmaTPCvsTrackPt"), centrality, v0.negativept(), negTrackExtra.tpcNSigmaPi()); histos.fill(HIST("K0Short/h3dPosTPCsignalVsTrackPt"), centrality, v0.positivept(), posTrackExtra.tpcSignal()); @@ -1343,10 +1439,10 @@ struct derivedlambdakzeroanalysis { histos.fill(HIST("K0Short/h3dNegNsigmaTOF"), centrality, pt, v0.tofNSigmaK0PiMinus()); histos.fill(HIST("K0Short/h3dPosTOFdeltaT"), centrality, pt, v0.posTOFDeltaTK0Pi()); histos.fill(HIST("K0Short/h3dNegTOFdeltaT"), centrality, pt, v0.negTOFDeltaTK0Pi()); - histos.fill(HIST("K0Short/h3dPosNsigmaTOFvsTrackPtot"), centrality, v0.positivept() * TMath::CosH(v0.positiveeta()), v0.tofNSigmaK0PiPlus()); - histos.fill(HIST("K0Short/h3dNegNsigmaTOFvsTrackPtot"), centrality, v0.negativept() * TMath::CosH(v0.negativeeta()), v0.tofNSigmaK0PiMinus()); - histos.fill(HIST("K0Short/h3dPosTOFdeltaTvsTrackPtot"), centrality, v0.positivept() * TMath::CosH(v0.positiveeta()), v0.posTOFDeltaTK0Pi()); - histos.fill(HIST("K0Short/h3dNegTOFdeltaTvsTrackPtot"), centrality, v0.negativept() * TMath::CosH(v0.negativeeta()), v0.negTOFDeltaTK0Pi()); + histos.fill(HIST("K0Short/h3dPosNsigmaTOFvsTrackPtot"), centrality, v0.pfracpos() * v0.p(), v0.tofNSigmaK0PiPlus()); + histos.fill(HIST("K0Short/h3dNegNsigmaTOFvsTrackPtot"), centrality, v0.pfracneg() * v0.p(), v0.tofNSigmaK0PiMinus()); + histos.fill(HIST("K0Short/h3dPosTOFdeltaTvsTrackPtot"), centrality, v0.pfracpos() * v0.p(), v0.posTOFDeltaTK0Pi()); + histos.fill(HIST("K0Short/h3dNegTOFdeltaTvsTrackPtot"), centrality, v0.pfracneg() * v0.p(), v0.negTOFDeltaTK0Pi()); histos.fill(HIST("K0Short/h3dPosNsigmaTOFvsTrackPt"), centrality, v0.positivept(), v0.tofNSigmaK0PiPlus()); histos.fill(HIST("K0Short/h3dNegNsigmaTOFvsTrackPt"), centrality, v0.negativept(), v0.tofNSigmaK0PiMinus()); histos.fill(HIST("K0Short/h3dPosTOFdeltaTvsTrackPt"), centrality, v0.positivept(), v0.posTOFDeltaTK0Pi()); @@ -1368,7 +1464,7 @@ struct derivedlambdakzeroanalysis { histos.fill(HIST("Lambda/hPosDCAToPV"), v0.dcapostopv()); histos.fill(HIST("Lambda/hNegDCAToPV"), v0.dcanegtopv()); histos.fill(HIST("Lambda/hDCADaughters"), v0.dcaV0daughters()); - histos.fill(HIST("Lambda/hPointingAngle"), TMath::ACos(v0.v0cosPA())); + histos.fill(HIST("Lambda/hPointingAngle"), std::acos(v0.v0cosPA())); histos.fill(HIST("Lambda/hV0Radius"), v0.v0radius()); histos.fill(HIST("Lambda/h2dPositiveITSvsTPCpts"), posTrackExtra.tpcCrossedRows(), posTrackExtra.itsNCls()); histos.fill(HIST("Lambda/h2dNegativeITSvsTPCpts"), negTrackExtra.tpcCrossedRows(), negTrackExtra.itsNCls()); @@ -1386,6 +1482,7 @@ struct derivedlambdakzeroanalysis { if (doDetectPropQA == 3) { histos.fill(HIST("Lambda/h3dITSchi2"), centrality, pt, std::max(posTrackExtra.itsChi2NCl(), negTrackExtra.itsChi2NCl())); histos.fill(HIST("Lambda/h3dTPCchi2"), centrality, pt, std::max(posTrackExtra.tpcChi2NCl(), negTrackExtra.tpcChi2NCl())); + histos.fill(HIST("Lambda/h3dTPCFoundOverFindable"), centrality, pt, std::min(posTrackExtra.tpcFoundOverFindableCls(), negTrackExtra.tpcFoundOverFindableCls())); histos.fill(HIST("Lambda/h3dTPCrowsOverFindable"), centrality, pt, std::min(posTrackExtra.tpcCrossedRowsOverFindableCls(), negTrackExtra.tpcCrossedRowsOverFindableCls())); histos.fill(HIST("Lambda/h3dTPCsharedCls"), centrality, pt, std::max(posTrackExtra.tpcFractionSharedCls(), negTrackExtra.tpcFractionSharedCls())); histos.fill(HIST("Lambda/h3dPositiveITSchi2"), centrality, pt, posTrackExtra.itsChi2NCl()); @@ -1402,10 +1499,10 @@ struct derivedlambdakzeroanalysis { histos.fill(HIST("Lambda/h3dNegNsigmaTPC"), centrality, pt, negTrackExtra.tpcNSigmaPi()); histos.fill(HIST("Lambda/h3dPosTPCsignal"), centrality, pt, posTrackExtra.tpcSignal()); histos.fill(HIST("Lambda/h3dNegTPCsignal"), centrality, pt, negTrackExtra.tpcSignal()); - histos.fill(HIST("Lambda/h3dPosNsigmaTPCvsTrackPtot"), centrality, v0.positivept() * TMath::CosH(v0.positiveeta()), posTrackExtra.tpcNSigmaPr()); - histos.fill(HIST("Lambda/h3dNegNsigmaTPCvsTrackPtot"), centrality, v0.negativept() * TMath::CosH(v0.negativeeta()), negTrackExtra.tpcNSigmaPi()); - histos.fill(HIST("Lambda/h3dPosTPCsignalVsTrackPtot"), centrality, v0.positivept() * TMath::CosH(v0.positiveeta()), posTrackExtra.tpcSignal()); - histos.fill(HIST("Lambda/h3dNegTPCsignalVsTrackPtot"), centrality, v0.negativept() * TMath::CosH(v0.negativeeta()), negTrackExtra.tpcSignal()); + histos.fill(HIST("Lambda/h3dPosNsigmaTPCvsTrackPtot"), centrality, v0.pfracpos() * v0.p(), posTrackExtra.tpcNSigmaPr()); + histos.fill(HIST("Lambda/h3dNegNsigmaTPCvsTrackPtot"), centrality, v0.pfracneg() * v0.p(), negTrackExtra.tpcNSigmaPi()); + histos.fill(HIST("Lambda/h3dPosTPCsignalVsTrackPtot"), centrality, v0.pfracpos() * v0.p(), posTrackExtra.tpcSignal()); + histos.fill(HIST("Lambda/h3dNegTPCsignalVsTrackPtot"), centrality, v0.pfracneg() * v0.p(), negTrackExtra.tpcSignal()); histos.fill(HIST("Lambda/h3dPosNsigmaTPCvsTrackPt"), centrality, v0.positivept(), posTrackExtra.tpcNSigmaPr()); histos.fill(HIST("Lambda/h3dNegNsigmaTPCvsTrackPt"), centrality, v0.negativept(), negTrackExtra.tpcNSigmaPi()); histos.fill(HIST("Lambda/h3dPosTPCsignalVsTrackPt"), centrality, v0.positivept(), posTrackExtra.tpcSignal()); @@ -1416,10 +1513,10 @@ struct derivedlambdakzeroanalysis { histos.fill(HIST("Lambda/h3dNegNsigmaTOF"), centrality, pt, v0.tofNSigmaLaPi()); histos.fill(HIST("Lambda/h3dPosTOFdeltaT"), centrality, pt, v0.posTOFDeltaTLaPr()); histos.fill(HIST("Lambda/h3dNegTOFdeltaT"), centrality, pt, v0.negTOFDeltaTLaPi()); - histos.fill(HIST("Lambda/h3dPosNsigmaTOFvsTrackPtot"), centrality, v0.positivept() * TMath::CosH(v0.positiveeta()), v0.tofNSigmaLaPr()); - histos.fill(HIST("Lambda/h3dNegNsigmaTOFvsTrackPtot"), centrality, v0.negativept() * TMath::CosH(v0.negativeeta()), v0.tofNSigmaLaPi()); - histos.fill(HIST("Lambda/h3dPosTOFdeltaTvsTrackPtot"), centrality, v0.positivept() * TMath::CosH(v0.positiveeta()), v0.posTOFDeltaTLaPr()); - histos.fill(HIST("Lambda/h3dNegTOFdeltaTvsTrackPtot"), centrality, v0.negativept() * TMath::CosH(v0.negativeeta()), v0.negTOFDeltaTLaPi()); + histos.fill(HIST("Lambda/h3dPosNsigmaTOFvsTrackPtot"), centrality, v0.pfracpos() * v0.p(), v0.tofNSigmaLaPr()); + histos.fill(HIST("Lambda/h3dNegNsigmaTOFvsTrackPtot"), centrality, v0.pfracneg() * v0.p(), v0.tofNSigmaLaPi()); + histos.fill(HIST("Lambda/h3dPosTOFdeltaTvsTrackPtot"), centrality, v0.pfracpos() * v0.p(), v0.posTOFDeltaTLaPr()); + histos.fill(HIST("Lambda/h3dNegTOFdeltaTvsTrackPtot"), centrality, v0.pfracneg() * v0.p(), v0.negTOFDeltaTLaPi()); histos.fill(HIST("Lambda/h3dPosNsigmaTOFvsTrackPt"), centrality, v0.positivept(), v0.tofNSigmaLaPr()); histos.fill(HIST("Lambda/h3dNegNsigmaTOFvsTrackPt"), centrality, v0.negativept(), v0.tofNSigmaLaPi()); histos.fill(HIST("Lambda/h3dPosTOFdeltaTvsTrackPt"), centrality, v0.positivept(), v0.posTOFDeltaTLaPr()); @@ -1441,7 +1538,7 @@ struct derivedlambdakzeroanalysis { histos.fill(HIST("AntiLambda/hPosDCAToPV"), v0.dcapostopv()); histos.fill(HIST("AntiLambda/hNegDCAToPV"), v0.dcanegtopv()); histos.fill(HIST("AntiLambda/hDCADaughters"), v0.dcaV0daughters()); - histos.fill(HIST("AntiLambda/hPointingAngle"), TMath::ACos(v0.v0cosPA())); + histos.fill(HIST("AntiLambda/hPointingAngle"), std::acos(v0.v0cosPA())); histos.fill(HIST("AntiLambda/hV0Radius"), v0.v0radius()); histos.fill(HIST("AntiLambda/h2dPositiveITSvsTPCpts"), posTrackExtra.tpcCrossedRows(), posTrackExtra.itsNCls()); histos.fill(HIST("AntiLambda/h2dNegativeITSvsTPCpts"), negTrackExtra.tpcCrossedRows(), negTrackExtra.itsNCls()); @@ -1459,6 +1556,7 @@ struct derivedlambdakzeroanalysis { if (doDetectPropQA == 3) { histos.fill(HIST("AntiLambda/h3dITSchi2"), centrality, pt, std::max(posTrackExtra.itsChi2NCl(), negTrackExtra.itsChi2NCl())); histos.fill(HIST("AntiLambda/h3dTPCchi2"), centrality, pt, std::max(posTrackExtra.tpcChi2NCl(), negTrackExtra.tpcChi2NCl())); + histos.fill(HIST("AntiLambda/h3dTPCFoundOverFindable"), centrality, pt, std::min(posTrackExtra.tpcFoundOverFindableCls(), negTrackExtra.tpcFoundOverFindableCls())); histos.fill(HIST("AntiLambda/h3dTPCrowsOverFindable"), centrality, pt, std::min(posTrackExtra.tpcCrossedRowsOverFindableCls(), negTrackExtra.tpcCrossedRowsOverFindableCls())); histos.fill(HIST("AntiLambda/h3dTPCsharedCls"), centrality, pt, std::max(posTrackExtra.tpcFractionSharedCls(), negTrackExtra.tpcFractionSharedCls())); histos.fill(HIST("AntiLambda/h3dPositiveITSchi2"), centrality, pt, posTrackExtra.itsChi2NCl()); @@ -1475,10 +1573,10 @@ struct derivedlambdakzeroanalysis { histos.fill(HIST("AntiLambda/h3dNegNsigmaTPC"), centrality, pt, negTrackExtra.tpcNSigmaPr()); histos.fill(HIST("AntiLambda/h3dPosTPCsignal"), centrality, pt, posTrackExtra.tpcSignal()); histos.fill(HIST("AntiLambda/h3dNegTPCsignal"), centrality, pt, negTrackExtra.tpcSignal()); - histos.fill(HIST("AntiLambda/h3dPosNsigmaTPCvsTrackPtot"), centrality, v0.positivept() * TMath::CosH(v0.positiveeta()), posTrackExtra.tpcNSigmaPi()); - histos.fill(HIST("AntiLambda/h3dNegNsigmaTPCvsTrackPtot"), centrality, v0.negativept() * TMath::CosH(v0.negativeeta()), negTrackExtra.tpcNSigmaPr()); - histos.fill(HIST("AntiLambda/h3dPosTPCsignalVsTrackPtot"), centrality, v0.positivept() * TMath::CosH(v0.positiveeta()), posTrackExtra.tpcSignal()); - histos.fill(HIST("AntiLambda/h3dNegTPCsignalVsTrackPtot"), centrality, v0.negativept() * TMath::CosH(v0.negativeeta()), negTrackExtra.tpcSignal()); + histos.fill(HIST("AntiLambda/h3dPosNsigmaTPCvsTrackPtot"), centrality, v0.pfracpos() * v0.p(), posTrackExtra.tpcNSigmaPi()); + histos.fill(HIST("AntiLambda/h3dNegNsigmaTPCvsTrackPtot"), centrality, v0.pfracneg() * v0.p(), negTrackExtra.tpcNSigmaPr()); + histos.fill(HIST("AntiLambda/h3dPosTPCsignalVsTrackPtot"), centrality, v0.pfracpos() * v0.p(), posTrackExtra.tpcSignal()); + histos.fill(HIST("AntiLambda/h3dNegTPCsignalVsTrackPtot"), centrality, v0.pfracneg() * v0.p(), negTrackExtra.tpcSignal()); histos.fill(HIST("AntiLambda/h3dPosNsigmaTPCvsTrackPt"), centrality, v0.positivept(), posTrackExtra.tpcNSigmaPi()); histos.fill(HIST("AntiLambda/h3dNegNsigmaTPCvsTrackPt"), centrality, v0.negativept(), negTrackExtra.tpcNSigmaPr()); histos.fill(HIST("AntiLambda/h3dPosTPCsignalVsTrackPt"), centrality, v0.positivept(), posTrackExtra.tpcSignal()); @@ -1489,10 +1587,10 @@ struct derivedlambdakzeroanalysis { histos.fill(HIST("AntiLambda/h3dNegNsigmaTOF"), centrality, pt, v0.tofNSigmaALaPr()); histos.fill(HIST("AntiLambda/h3dPosTOFdeltaT"), centrality, pt, v0.posTOFDeltaTLaPi()); histos.fill(HIST("AntiLambda/h3dNegTOFdeltaT"), centrality, pt, v0.negTOFDeltaTLaPr()); - histos.fill(HIST("AntiLambda/h3dPosNsigmaTOFvsTrackPtot"), centrality, v0.positivept() * TMath::CosH(v0.positiveeta()), v0.tofNSigmaALaPi()); - histos.fill(HIST("AntiLambda/h3dNegNsigmaTOFvsTrackPtot"), centrality, v0.negativept() * TMath::CosH(v0.negativeeta()), v0.tofNSigmaALaPr()); - histos.fill(HIST("AntiLambda/h3dPosTOFdeltaTvsTrackPtot"), centrality, v0.positivept() * TMath::CosH(v0.positiveeta()), v0.posTOFDeltaTLaPi()); - histos.fill(HIST("AntiLambda/h3dNegTOFdeltaTvsTrackPtot"), centrality, v0.negativept() * TMath::CosH(v0.negativeeta()), v0.negTOFDeltaTLaPr()); + histos.fill(HIST("AntiLambda/h3dPosNsigmaTOFvsTrackPtot"), centrality, v0.pfracpos() * v0.p(), v0.tofNSigmaALaPi()); + histos.fill(HIST("AntiLambda/h3dNegNsigmaTOFvsTrackPtot"), centrality, v0.pfracneg() * v0.p(), v0.tofNSigmaALaPr()); + histos.fill(HIST("AntiLambda/h3dPosTOFdeltaTvsTrackPtot"), centrality, v0.pfracpos() * v0.p(), v0.posTOFDeltaTLaPi()); + histos.fill(HIST("AntiLambda/h3dNegTOFdeltaTvsTrackPtot"), centrality, v0.pfracneg() * v0.p(), v0.negTOFDeltaTLaPr()); histos.fill(HIST("AntiLambda/h3dPosNsigmaTOFvsTrackPt"), centrality, v0.positivept(), v0.tofNSigmaALaPi()); histos.fill(HIST("AntiLambda/h3dNegNsigmaTOFvsTrackPt"), centrality, v0.negativept(), v0.tofNSigmaALaPr()); histos.fill(HIST("AntiLambda/h3dPosTOFdeltaTvsTrackPt"), centrality, v0.positivept(), v0.posTOFDeltaTLaPi()); @@ -1508,11 +1606,11 @@ struct derivedlambdakzeroanalysis { if (verifyMask(selMap, maskTopoNoV0Radius | maskK0ShortSpecific)) histos.fill(HIST("K0Short/h4dV0Radius"), centrality, pt, v0.mK0Short(), v0.v0radius()); if (verifyMask(selMap, maskTopoNoDCAPosToPV | maskK0ShortSpecific)) - histos.fill(HIST("K0Short/h4dPosDCAToPV"), centrality, pt, v0.mK0Short(), TMath::Abs(v0.dcapostopv())); + histos.fill(HIST("K0Short/h4dPosDCAToPV"), centrality, pt, v0.mK0Short(), std::abs(v0.dcapostopv())); if (verifyMask(selMap, maskTopoNoDCANegToPV | maskK0ShortSpecific)) - histos.fill(HIST("K0Short/h4dNegDCAToPV"), centrality, pt, v0.mK0Short(), TMath::Abs(v0.dcanegtopv())); + histos.fill(HIST("K0Short/h4dNegDCAToPV"), centrality, pt, v0.mK0Short(), std::abs(v0.dcanegtopv())); if (verifyMask(selMap, maskTopoNoCosPA | maskK0ShortSpecific)) - histos.fill(HIST("K0Short/h4dPointingAngle"), centrality, pt, v0.mK0Short(), TMath::ACos(v0.v0cosPA())); + histos.fill(HIST("K0Short/h4dPointingAngle"), centrality, pt, v0.mK0Short(), std::acos(v0.v0cosPA())); if (verifyMask(selMap, maskTopoNoDCAV0Dau | maskK0ShortSpecific)) histos.fill(HIST("K0Short/h4dDCADaughters"), centrality, pt, v0.mK0Short(), v0.dcaV0daughters()); @@ -1524,11 +1622,11 @@ struct derivedlambdakzeroanalysis { if (verifyMask(selMap, maskTopoNoV0Radius | maskLambdaSpecific)) histos.fill(HIST("Lambda/h4dV0Radius"), centrality, pt, v0.mLambda(), v0.v0radius()); if (verifyMask(selMap, maskTopoNoDCAPosToPV | maskLambdaSpecific)) - histos.fill(HIST("Lambda/h4dPosDCAToPV"), centrality, pt, v0.mLambda(), TMath::Abs(v0.dcapostopv())); + histos.fill(HIST("Lambda/h4dPosDCAToPV"), centrality, pt, v0.mLambda(), std::abs(v0.dcapostopv())); if (verifyMask(selMap, maskTopoNoDCANegToPV | maskLambdaSpecific)) - histos.fill(HIST("Lambda/h4dNegDCAToPV"), centrality, pt, v0.mLambda(), TMath::Abs(v0.dcanegtopv())); + histos.fill(HIST("Lambda/h4dNegDCAToPV"), centrality, pt, v0.mLambda(), std::abs(v0.dcanegtopv())); if (verifyMask(selMap, maskTopoNoCosPA | maskLambdaSpecific)) - histos.fill(HIST("Lambda/h4dPointingAngle"), centrality, pt, v0.mLambda(), TMath::ACos(v0.v0cosPA())); + histos.fill(HIST("Lambda/h4dPointingAngle"), centrality, pt, v0.mLambda(), std::acos(v0.v0cosPA())); if (verifyMask(selMap, maskTopoNoDCAV0Dau | maskLambdaSpecific)) histos.fill(HIST("Lambda/h4dDCADaughters"), centrality, pt, v0.mLambda(), v0.dcaV0daughters()); @@ -1539,11 +1637,11 @@ struct derivedlambdakzeroanalysis { if (verifyMask(selMap, maskTopoNoV0Radius | maskAntiLambdaSpecific)) histos.fill(HIST("AntiLambda/h4dV0Radius"), centrality, pt, v0.mAntiLambda(), v0.v0radius()); if (verifyMask(selMap, maskTopoNoDCAPosToPV | maskAntiLambdaSpecific)) - histos.fill(HIST("AntiLambda/h4dPosDCAToPV"), centrality, pt, v0.mAntiLambda(), TMath::Abs(v0.dcapostopv())); + histos.fill(HIST("AntiLambda/h4dPosDCAToPV"), centrality, pt, v0.mAntiLambda(), std::abs(v0.dcapostopv())); if (verifyMask(selMap, maskTopoNoDCANegToPV | maskAntiLambdaSpecific)) - histos.fill(HIST("AntiLambda/h4dNegDCAToPV"), centrality, pt, v0.mAntiLambda(), TMath::Abs(v0.dcanegtopv())); + histos.fill(HIST("AntiLambda/h4dNegDCAToPV"), centrality, pt, v0.mAntiLambda(), std::abs(v0.dcanegtopv())); if (verifyMask(selMap, maskTopoNoCosPA | maskAntiLambdaSpecific)) - histos.fill(HIST("AntiLambda/h4dPointingAngle"), centrality, pt, v0.mAntiLambda(), TMath::ACos(v0.v0cosPA())); + histos.fill(HIST("AntiLambda/h4dPointingAngle"), centrality, pt, v0.mAntiLambda(), std::acos(v0.v0cosPA())); if (verifyMask(selMap, maskTopoNoDCAV0Dau | maskAntiLambdaSpecific)) histos.fill(HIST("AntiLambda/h4dDCADaughters"), centrality, pt, v0.mAntiLambda(), v0.dcaV0daughters()); @@ -1586,7 +1684,7 @@ struct derivedlambdakzeroanalysis { auto v0mother = v0.motherMCPart(); float rapidityXi = RecoDecay::y(std::array{v0mother.px(), v0mother.py(), v0mother.pz()}, o2::constants::physics::MassXiMinus); - if (fabs(rapidityXi) > 0.5f) + if (std::fabs(rapidityXi) > 0.5f) return; // not a valid mother rapidity (PDG selection is later) // __________________________________________ @@ -1601,7 +1699,7 @@ struct derivedlambdakzeroanalysis { } template - bool IsEventAccepted(TCollision collision, bool fillHists) + bool isEventAccepted(TCollision collision, bool fillHists) // check whether the collision passes our collision selections { if (fillHists) @@ -1858,20 +1956,24 @@ struct derivedlambdakzeroanalysis { std::vector listBestCollisionIdx(mcCollisions.size()); for (auto const& mcCollision : mcCollisions) { auto groupedCollisions = getGroupedCollisions(collisions, mcCollision.globalIndex()); - // Find the collision with the biggest nbr of PV contributors - // Follows what was done here: https://github.com/AliceO2Group/O2Physics/blob/master/Common/TableProducer/mcCollsExtra.cxx#L93 int biggestNContribs = -1; int bestCollisionIndex = -1; for (auto const& collision : groupedCollisions) { // consider event selections in the recoed <-> gen collision association, for the denominator (or numerator) of the efficiency (or signal loss)? if (eventSelections.useEvtSelInDenomEff) { - if (!IsEventAccepted(collision, false)) { + if (!isEventAccepted(collision, false)) { continue; } } - if (biggestNContribs < collision.multPVTotalContributors()) { - biggestNContribs = collision.multPVTotalContributors(); + if constexpr (run3) { // check if we are in Run 3 + // Find the collision with the biggest nbr of PV contributors + // Follows what was done here: https://github.com/AliceO2Group/O2Physics/blob/master/Common/TableProducer/mcCollsExtra.cxx#L93 + if (biggestNContribs < collision.multPVTotalContributors()) { + biggestNContribs = collision.multPVTotalContributors(); + bestCollisionIndex = collision.globalIndex(); + } + } else { // we are in Run 2: there should be only one collision in groupedCollisions bestCollisionIndex = collision.globalIndex(); } } @@ -1904,7 +2006,7 @@ struct derivedlambdakzeroanalysis { // 0 --> Single Gap - A side // 1 --> Single Gap - C side // 2 --> Double Gap - both A & C sides - selGapSide = sgSelector.trueGap(collision, upcCuts.FV0cut, upcCuts.FT0Acut, upcCuts.FT0Ccut, upcCuts.ZDCcut); + selGapSide = sgSelector.trueGap(collision, upcCuts.fv0Cut, upcCuts.ft0Acut, upcCuts.ft0Ccut, upcCuts.zdcCut); } else { // no, we are in Run 2 centrality = eventSelections.useSPDTrackletsCent ? collision.centRun2SPDTracklets() : collision.centRun2V0M(); } @@ -1963,17 +2065,17 @@ struct derivedlambdakzeroanalysis { int nCollisions = 0; for (auto const& collision : groupedCollisions) { - if (!IsEventAccepted(collision, false)) { + if (!isEventAccepted(collision, false)) { continue; } - if (biggestNContribs < collision.multPVTotalContributors()) { - biggestNContribs = collision.multPVTotalContributors(); - if constexpr (requires { collision.centFT0C(); }) { // check if we are in Run 3 + if constexpr (run3) { // check if we are in Run 3 + if (biggestNContribs < collision.multPVTotalContributors()) { + biggestNContribs = collision.multPVTotalContributors(); centrality = doPPAnalysis ? collision.centFT0M() : collision.centFT0C(); - } else { // we are in Run 2 - centrality = eventSelections.useSPDTrackletsCent ? collision.centRun2SPDTracklets() : collision.centRun2V0M(); } + } else { // we are in Run 2: there should be only one collision in groupedCollisions + centrality = eventSelections.useSPDTrackletsCent ? collision.centRun2SPDTracklets() : collision.centRun2V0M(); } nCollisions++; @@ -2008,7 +2110,7 @@ struct derivedlambdakzeroanalysis { initCCDB(collision); } - if (!IsEventAccepted(collision, true)) { + if (!isEventAccepted(collision, true)) { return; } @@ -2028,7 +2130,7 @@ struct derivedlambdakzeroanalysis { int nK0Shorts = 0; int nLambdas = 0; int nAntiLambdas = 0; - for (auto& v0 : fullV0s) { + for (auto const& v0 : fullV0s) { if (std::abs(v0.negativeeta()) > v0Selections.daughterEtaCut || std::abs(v0.positiveeta()) > v0Selections.daughterEtaCut) continue; // remove acceptance that's badly reproduced by MC / superfluous in future @@ -2041,8 +2143,13 @@ struct derivedlambdakzeroanalysis { uint64_t selMap = computeReconstructionBitmap(v0, collision, v0.yLambda(), v0.yK0Short(), v0.pt()); // consider for histograms for all species - selMap = selMap | (uint64_t(1) << selConsiderK0Short) | (uint64_t(1) << selConsiderLambda) | (uint64_t(1) << selConsiderAntiLambda); - selMap = selMap | (uint64_t(1) << selPhysPrimK0Short) | (uint64_t(1) << selPhysPrimLambda) | (uint64_t(1) << selPhysPrimAntiLambda); + BITSET(selMap, selConsiderK0Short); + BITSET(selMap, selConsiderLambda); + BITSET(selMap, selConsiderAntiLambda); + + BITSET(selMap, selPhysPrimK0Short); + BITSET(selMap, selPhysPrimLambda); + BITSET(selMap, selPhysPrimAntiLambda); analyseCandidate(v0, v0.pt(), centrality, selMap, selGapSide, nK0Shorts, nLambdas, nAntiLambdas); } // end v0 loop @@ -2071,7 +2178,7 @@ struct derivedlambdakzeroanalysis { initCCDB(collision); } - if (!IsEventAccepted(collision, true)) { + if (!isEventAccepted(collision, true)) { return; } @@ -2091,7 +2198,7 @@ struct derivedlambdakzeroanalysis { int nK0Shorts = 0; int nLambdas = 0; int nAntiLambdas = 0; - for (auto& v0 : fullV0s) { + for (auto const& v0 : fullV0s) { if (std::abs(v0.negativeeta()) > v0Selections.daughterEtaCut || std::abs(v0.positiveeta()) > v0Selections.daughterEtaCut) continue; // remove acceptance that's badly reproduced by MC / superfluous in future @@ -2110,7 +2217,7 @@ struct derivedlambdakzeroanalysis { float ymc = 1e-3; if (v0MC.pdgCode() == 310) ymc = RecoDecay::y(std::array{v0MC.pxPosMC() + v0MC.pxNegMC(), v0MC.pyPosMC() + v0MC.pyNegMC(), v0MC.pzPosMC() + v0MC.pzNegMC()}, o2::constants::physics::MassKaonNeutral); - else if (TMath::Abs(v0MC.pdgCode()) == 3122) + else if (std::abs(v0MC.pdgCode()) == 3122) ymc = RecoDecay::y(std::array{v0MC.pxPosMC() + v0MC.pxNegMC(), v0MC.pyPosMC() + v0MC.pyNegMC(), v0MC.pzPosMC() + v0MC.pzNegMC()}, o2::constants::physics::MassLambda); uint64_t selMap = computeReconstructionBitmap(v0, collision, ymc, ymc, ptmc); @@ -2122,8 +2229,13 @@ struct derivedlambdakzeroanalysis { // consider only associated candidates if asked to do so, disregard association if (!doMCAssociation) { - selMap = selMap | (uint64_t(1) << selConsiderK0Short) | (uint64_t(1) << selConsiderLambda) | (uint64_t(1) << selConsiderAntiLambda); - selMap = selMap | (uint64_t(1) << selPhysPrimK0Short) | (uint64_t(1) << selPhysPrimLambda) | (uint64_t(1) << selPhysPrimAntiLambda); + BITSET(selMap, selConsiderK0Short); + BITSET(selMap, selConsiderLambda); + BITSET(selMap, selConsiderAntiLambda); + + BITSET(selMap, selPhysPrimK0Short); + BITSET(selMap, selPhysPrimLambda); + BITSET(selMap, selPhysPrimAntiLambda); } analyseCandidate(v0, ptmc, centrality, selMap, selGapSide, nK0Shorts, nLambdas, nAntiLambdas); @@ -2172,10 +2284,10 @@ struct derivedlambdakzeroanalysis { float ymc = 1e3; if (v0MC.pdgCode() == 310) ymc = v0MC.rapidityMC(0); - else if (TMath::Abs(v0MC.pdgCode()) == 3122) + else if (std::abs(v0MC.pdgCode()) == 3122) ymc = v0MC.rapidityMC(1); - if (TMath::Abs(ymc) > v0Selections.rapidityCut) + if (std::abs(ymc) > v0Selections.rapidityCut) continue; auto mcCollision = v0MC.template straMCCollision_as>(); @@ -2235,12 +2347,12 @@ struct derivedlambdakzeroanalysis { float ptmc = cascMC.ptMC(); float ymc = 1e3; - if (TMath::Abs(cascMC.pdgCode()) == 3312) + if (std::abs(cascMC.pdgCode()) == 3312) ymc = cascMC.rapidityMC(0); - else if (TMath::Abs(cascMC.pdgCode()) == 3334) + else if (std::abs(cascMC.pdgCode()) == 3334) ymc = cascMC.rapidityMC(2); - if (TMath::Abs(ymc) > v0Selections.rapidityCut) + if (std::abs(ymc) > v0Selections.rapidityCut) continue; auto mcCollision = cascMC.template straMCCollision_as>(); @@ -2301,28 +2413,28 @@ struct derivedlambdakzeroanalysis { // ______________________________________________________ // Real data processing in Run 3 - no MC subscription - void processRealDataRun3(soa::Join::iterator const& collision, v0Candidates const& fullV0s, dauTracks const&) + void processRealDataRun3(soa::Join::iterator const& collision, V0Candidates const& fullV0s, DauTracks const&) { analyzeRecoedV0sInRealData(collision, fullV0s); } // ______________________________________________________ // Real data processing in Run 2 - no MC subscription - void processRealDataRun2(soa::Join::iterator const& collision, v0Candidates const& fullV0s, dauTracks const&) + void processRealDataRun2(soa::Join::iterator const& collision, V0Candidates const& fullV0s, DauTracks const&) { analyzeRecoedV0sInRealData(collision, fullV0s); } // ______________________________________________________ // Simulated processing in Run 3 (subscribes to MC information too) - void processMonteCarloRun3(soa::Join::iterator const& collision, v0MCCandidates const& fullV0s, dauTracks const&, aod::MotherMCParts const&, soa::Join const& /*mccollisions*/, soa::Join const&) + void processMonteCarloRun3(soa::Join::iterator const& collision, V0McCandidates const& fullV0s, DauTracks const&, aod::MotherMCParts const&, soa::Join const& /*mccollisions*/, soa::Join const&) { analyzeRecoedV0sInMonteCarlo(collision, fullV0s); } // ______________________________________________________ // Simulated processing in Run 2 (subscribes to MC information too) - void processMonteCarloRun2(soa::Join::iterator const& collision, v0MCCandidates const& fullV0s, dauTracks const&, aod::MotherMCParts const&, soa::Join const& /*mccollisions*/, soa::Join const&) + void processMonteCarloRun2(soa::Join::iterator const& collision, V0McCandidates const& fullV0s, DauTracks const&, aod::MotherMCParts const&, soa::Join const& /*mccollisions*/, soa::Join const&) { analyzeRecoedV0sInMonteCarlo(collision, fullV0s); } @@ -2355,49 +2467,49 @@ struct derivedlambdakzeroanalysis { auto hXiPlus = histos.get(HIST("h2dGeneratedXiPlus")); auto hOmegaMinus = histos.get(HIST("h2dGeneratedOmegaMinus")); auto hOmegaPlus = histos.get(HIST("h2dGeneratedOmegaPlus")); - for (auto& gVec : geK0Short) { + for (auto const& gVec : geK0Short) { if (static_cast(gVec.generatedK0Short().size()) != hK0Short->GetNcells()) LOGF(fatal, "K0Short: Number of elements in generated array and number of cells in receiving histogram differ: %i vs %i!", gVec.generatedK0Short().size(), hK0Short->GetNcells()); for (int iv = 0; iv < hK0Short->GetNcells(); iv++) { hK0Short->SetBinContent(iv, hK0Short->GetBinContent(iv) + gVec.generatedK0Short()[iv]); } } - for (auto& gVec : geLambda) { + for (auto const& gVec : geLambda) { if (static_cast(gVec.generatedLambda().size()) != hLambda->GetNcells()) LOGF(fatal, "Lambda: Number of elements in generated array and number of cells in receiving histogram differ: %i vs %i!", gVec.generatedLambda().size(), hLambda->GetNcells()); for (int iv = 0; iv < hLambda->GetNcells(); iv++) { hLambda->SetBinContent(iv, hLambda->GetBinContent(iv) + gVec.generatedLambda()[iv]); } } - for (auto& gVec : geAntiLambda) { + for (auto const& gVec : geAntiLambda) { if (static_cast(gVec.generatedAntiLambda().size()) != hAntiLambda->GetNcells()) LOGF(fatal, "AntiLambda: Number of elements in generated array and number of cells in receiving histogram differ: %i vs %i!", gVec.generatedAntiLambda().size(), hAntiLambda->GetNcells()); for (int iv = 0; iv < hAntiLambda->GetNcells(); iv++) { hAntiLambda->SetBinContent(iv, hAntiLambda->GetBinContent(iv) + gVec.generatedAntiLambda()[iv]); } } - for (auto& gVec : geXiMinus) { + for (auto const& gVec : geXiMinus) { if (static_cast(gVec.generatedXiMinus().size()) != hXiMinus->GetNcells()) LOGF(fatal, "XiMinus: Number of elements in generated array and number of cells in receiving histogram differ: %i vs %i!", gVec.generatedXiMinus().size(), hXiMinus->GetNcells()); for (int iv = 0; iv < hXiMinus->GetNcells(); iv++) { hXiMinus->SetBinContent(iv, hXiMinus->GetBinContent(iv) + gVec.generatedXiMinus()[iv]); } } - for (auto& gVec : geXiPlus) { + for (auto const& gVec : geXiPlus) { if (static_cast(gVec.generatedXiPlus().size()) != hXiPlus->GetNcells()) LOGF(fatal, "XiPlus: Number of elements in generated array and number of cells in receiving histogram differ: %i vs %i!", gVec.generatedXiPlus().size(), hXiPlus->GetNcells()); for (int iv = 0; iv < hXiPlus->GetNcells(); iv++) { hXiPlus->SetBinContent(iv, hXiPlus->GetBinContent(iv) + gVec.generatedXiPlus()[iv]); } } - for (auto& gVec : geOmegaMinus) { + for (auto const& gVec : geOmegaMinus) { if (static_cast(gVec.generatedOmegaMinus().size()) != hOmegaMinus->GetNcells()) LOGF(fatal, "OmegaMinus: Number of elements in generated array and number of cells in receiving histogram differ: %i vs %i!", gVec.generatedOmegaMinus().size(), hOmegaMinus->GetNcells()); for (int iv = 0; iv < hOmegaMinus->GetNcells(); iv++) { hOmegaMinus->SetBinContent(iv, hOmegaMinus->GetBinContent(iv) + gVec.generatedOmegaMinus()[iv]); } } - for (auto& gVec : geOmegaPlus) { + for (auto const& gVec : geOmegaPlus) { if (static_cast(gVec.generatedOmegaPlus().size()) != hOmegaPlus->GetNcells()) LOGF(fatal, "OmegaPlus: Number of elements in generated array and number of cells in receiving histogram differ: %i vs %i!", gVec.generatedOmegaPlus().size(), hOmegaPlus->GetNcells()); for (int iv = 0; iv < hOmegaPlus->GetNcells(); iv++) { @@ -2407,7 +2519,7 @@ struct derivedlambdakzeroanalysis { } PROCESS_SWITCH(derivedlambdakzeroanalysis, processRealDataRun3, "process as if real data in Run 3", true); - PROCESS_SWITCH(derivedlambdakzeroanalysis, processRealDataRun2, "process as if real data in Run 2", true); + PROCESS_SWITCH(derivedlambdakzeroanalysis, processRealDataRun2, "process as if real data in Run 2", false); PROCESS_SWITCH(derivedlambdakzeroanalysis, processMonteCarloRun3, "process as if MC in Run 3", false); PROCESS_SWITCH(derivedlambdakzeroanalysis, processMonteCarloRun2, "process as if MC in Run 2", false); PROCESS_SWITCH(derivedlambdakzeroanalysis, processBinnedGenerated, "process MC generated", false); From eb1ad92114950c3761993f770ee8082c8056e964 Mon Sep 17 00:00:00 2001 From: mcoquet642 <74600025+mcoquet642@users.noreply.github.com> Date: Mon, 24 Feb 2025 15:38:57 +0100 Subject: [PATCH 0389/1650] [PWGDQ] event mixing for muons only and ambiguity fix (#10152) Co-authored-by: Maurice Coquet Co-authored-by: ALICE Action Bot --- PWGDQ/Tasks/dqEfficiency_withAssoc.cxx | 2 +- PWGDQ/Tasks/tableReader_withAssoc.cxx | 44 +++++++++++++++++++++++--- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx index e7b7cc9dd0a..cf87365c6c8 100644 --- a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx +++ b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx @@ -1817,7 +1817,7 @@ struct AnalysisSameEventPairing { t2.reducedMCTrack().pt(), t2.reducedMCTrack().eta(), t2.reducedMCTrack().phi(), t2.reducedMCTrack().e(), t1.reducedMCTrack().vx(), t1.reducedMCTrack().vy(), t1.reducedMCTrack().vz(), t1.reducedMCTrack().vt(), t2.reducedMCTrack().vx(), t2.reducedMCTrack().vy(), t2.reducedMCTrack().vz(), t2.reducedMCTrack().vt(), - (twoTrackFilter & (static_cast(1) << 28)) || (twoTrackFilter & (static_cast(1) << 30)), (twoTrackFilter & (static_cast(1) << 29)) || (twoTrackFilter & (static_cast(1) << 31)), + (twoTrackFilter & (static_cast(1) << 28)) || (twoTrackFilter & (static_cast(1) << 29)), (twoTrackFilter & (static_cast(1) << 30)) || (twoTrackFilter & (static_cast(1) << 31)), -999.0, -999.0, -999.0, -999.0, -999.0, -999.0, -999.0, -999.0, -999.0, -999.0, -999.0, VarManager::fgValues[VarManager::kMultDimuons], diff --git a/PWGDQ/Tasks/tableReader_withAssoc.cxx b/PWGDQ/Tasks/tableReader_withAssoc.cxx index c8282de9e45..9a745f61ea2 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.cxx +++ b/PWGDQ/Tasks/tableReader_withAssoc.cxx @@ -1155,7 +1155,7 @@ struct AnalysisSameEventPairing { Service fCCDB; o2::ccdb::CcdbApi fCCDBApi; - Filter filterEventSelected = aod::dqanalysisflags::isEventSelected > static_cast(1); + Filter filterEventSelected = aod::dqanalysisflags::isEventSelected > static_cast(0); HistogramManager* fHistMan; @@ -1190,8 +1190,8 @@ struct AnalysisSameEventPairing { fEnableBarrelHistos = context.mOptions.get("processAllSkimmed") || context.mOptions.get("processBarrelOnlySkimmed") || context.mOptions.get("processBarrelOnlyWithCollSkimmed") || context.mOptions.get("processBarrelOnlySkimmedNoCov"); fEnableBarrelMixingHistos = context.mOptions.get("processMixingAllSkimmed") || context.mOptions.get("processMixingBarrelSkimmed"); - fEnableMuonHistos = context.mOptions.get("processAllSkimmed") || context.mOptions.get("processMuonOnlySkimmed") || context.mOptions.get("processMuonOnlySkimmedMultExtra"); - fEnableMuonMixingHistos = context.mOptions.get("processMixingAllSkimmed"); + fEnableMuonHistos = context.mOptions.get("processAllSkimmed") || context.mOptions.get("processMuonOnlySkimmed") || context.mOptions.get("processMuonOnlySkimmedMultExtra") || context.mOptions.get("processMixingMuonSkimmed"); + fEnableMuonMixingHistos = context.mOptions.get("processMixingAllSkimmed") || context.mOptions.get("processMixingMuonSkimmed"); // Keep track of all the histogram class names to avoid composing strings in the pairing loop TString histNames = ""; @@ -1663,7 +1663,7 @@ struct AnalysisSameEventPairing { -999., -999., -999., -999., -999., -999., -999., -999., -999., -999., -999., -999., - (twoTrackFilter & (static_cast(1) << 28)) || (twoTrackFilter & (static_cast(1) << 30)), (twoTrackFilter & (static_cast(1) << 29)) || (twoTrackFilter & (static_cast(1) << 31)), + (twoTrackFilter & (static_cast(1) << 28)) || (twoTrackFilter & (static_cast(1) << 29)), (twoTrackFilter & (static_cast(1) << 30)) || (twoTrackFilter & (static_cast(1) << 31)), VarManager::fgValues[VarManager::kU2Q2], VarManager::fgValues[VarManager::kU3Q3], VarManager::fgValues[VarManager::kR2EP_AB], VarManager::fgValues[VarManager::kR2SP_AB], VarManager::fgValues[VarManager::kCentFT0C], VarManager::fgValues[VarManager::kCos2DeltaPhi], VarManager::fgValues[VarManager::kCos3DeltaPhi], @@ -1819,6 +1819,35 @@ struct AnalysisSameEventPairing { } ncuts = fNCutsMuon; histNames = fMuonHistNames; + + if (fConfigOptions.flatTables.value) { + dimuonAllList(-999., -999., -999., -999., + 0, 0, + -999., -999., -999., + VarManager::fgValues[VarManager::kMass], + false, + VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kEta], VarManager::fgValues[VarManager::kPhi], t1.sign() + t2.sign(), VarManager::fgValues[VarManager::kVertexingChi2PCA], + VarManager::fgValues[VarManager::kVertexingTauz], VarManager::fgValues[VarManager::kVertexingTauzErr], + VarManager::fgValues[VarManager::kVertexingTauxy], VarManager::fgValues[VarManager::kVertexingTauxyErr], + VarManager::fgValues[VarManager::kCosPointingAngle], + t1.pt(), t1.eta(), t1.phi(), t1.sign(), + t2.pt(), t2.eta(), t2.phi(), t2.sign(), + t1.fwdDcaX(), t1.fwdDcaY(), t2.fwdDcaX(), t2.fwdDcaY(), + 0., 0., + t1.chi2MatchMCHMID(), t2.chi2MatchMCHMID(), + t1.chi2MatchMCHMFT(), t2.chi2MatchMCHMFT(), + t1.chi2(), t2.chi2(), + -999., -999., -999., -999., + -999., -999., -999., -999., + -999., -999., -999., -999., + -999., -999., -999., -999., + (twoTrackFilter & (static_cast(1) << 28)) || (twoTrackFilter & (static_cast(1) << 29)), (twoTrackFilter & (static_cast(1) << 30)) || (twoTrackFilter & (static_cast(1) << 31)), + VarManager::fgValues[VarManager::kU2Q2], VarManager::fgValues[VarManager::kU3Q3], + VarManager::fgValues[VarManager::kR2EP_AB], VarManager::fgValues[VarManager::kR2SP_AB], VarManager::fgValues[VarManager::kCentFT0C], + VarManager::fgValues[VarManager::kCos2DeltaPhi], VarManager::fgValues[VarManager::kCos3DeltaPhi], + VarManager::fgValues[VarManager::kCORR2POI], VarManager::fgValues[VarManager::kCORR4POI], VarManager::fgValues[VarManager::kM01POI], VarManager::fgValues[VarManager::kM0111POI], VarManager::fgValues[VarManager::kMultDimuons], + VarManager::fgValues[VarManager::kVertexingPz], VarManager::fgValues[VarManager::kVertexingSV]); + } } /*if constexpr (TPairType == VarManager::kElectronMuon) { twoTrackFilter = a1.isBarrelSelected_raw() & a1.isBarrelSelectedPrefilter_raw() & a2.isMuonSelected_raw() & fTrackFilterMask; @@ -1957,6 +1986,12 @@ struct AnalysisSameEventPairing { runSameSideMixing(events, trackAssocs, tracks, trackAssocsPerCollision); } + void processMixingMuonSkimmed(soa::Filtered& events, + soa::Join const& muonAssocs, MyMuonTracksWithCovWithAmbiguities const& muons) + { + runSameSideMixing(events, muonAssocs, muons, muonAssocsPerCollision); + } + void processDummy(MyEvents&) { // do nothing @@ -1970,6 +2005,7 @@ struct AnalysisSameEventPairing { PROCESS_SWITCH(AnalysisSameEventPairing, processMuonOnlySkimmedMultExtra, "Run muon only pairing, with skimmed tracks", false); PROCESS_SWITCH(AnalysisSameEventPairing, processMixingAllSkimmed, "Run all types of mixed pairing, with skimmed tracks/muons", false); PROCESS_SWITCH(AnalysisSameEventPairing, processMixingBarrelSkimmed, "Run barrel type mixing pairing, with skimmed tracks", false); + PROCESS_SWITCH(AnalysisSameEventPairing, processMixingMuonSkimmed, "Run muon type mixing pairing, with skimmed muons", false); PROCESS_SWITCH(AnalysisSameEventPairing, processDummy, "Dummy function, enabled only if none of the others are enabled", false); }; From 1883298f920ce71015f7f72aeee385b6cbb4661e Mon Sep 17 00:00:00 2001 From: ilikmeta <152337132+ilikmeta@users.noreply.github.com> Date: Mon, 24 Feb 2025 09:28:24 -0600 Subject: [PATCH 0390/1650] [PWGCF] Fix Global histogram. (#10157) --- PWGCF/Flow/Tasks/flowGfwTask.cxx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowGfwTask.cxx b/PWGCF/Flow/Tasks/flowGfwTask.cxx index b452eec4539..5a6e96b70e5 100644 --- a/PWGCF/Flow/Tasks/flowGfwTask.cxx +++ b/PWGCF/Flow/Tasks/flowGfwTask.cxx @@ -902,11 +902,10 @@ struct FlowGfwTask { globalPlusitsNch++; - registry.fill(HIST("GlobalplusITS"), centrality); - if (cfgGlobalplusITS) { if (withinPtRef) { fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), wacc * weff, 1); + registry.fill(HIST("GlobalplusITS"), centrality); } } @@ -916,7 +915,7 @@ struct FlowGfwTask { fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), wacc * weff, 1); gloabalOnlyNch++; registry.fill(HIST("Globalonly"), centrality); - registry.fill(HIST("pt_Cen_ITSOnly"), centrality, track.pt()); + registry.fill(HIST("pt_Cen_GlobalOnly"), centrality, track.pt()); registry.fill(HIST("phi_Cen_GlobalOnly"), centrality, track.pt()); } } From b00fe19b71644215400bb8a4e9a5300251106741 Mon Sep 17 00:00:00 2001 From: Maxim Virta <84773378+MaximVirta@users.noreply.github.com> Date: Mon, 24 Feb 2025 17:33:06 +0200 Subject: [PATCH 0391/1650] [PWGCF] SPC centrality fixed & NaN guard added (#10145) Co-authored-by: ALICE Action Bot --- PWGCF/JCorran/Core/FlowJHistManager.cxx | 2 +- PWGCF/JCorran/Core/FlowJSPCAnalysis.cxx | 17 ++++++++++++++++- PWGCF/JCorran/Core/FlowJSPCAnalysis.h | 5 ++--- PWGCF/JCorran/Tasks/flowJSPCAnalysis.cxx | 2 +- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/PWGCF/JCorran/Core/FlowJHistManager.cxx b/PWGCF/JCorran/Core/FlowJHistManager.cxx index 8be0371f1ab..880ec409dbd 100644 --- a/PWGCF/JCorran/Core/FlowJHistManager.cxx +++ b/PWGCF/JCorran/Core/FlowJHistManager.cxx @@ -158,7 +158,7 @@ void FlowJHistManager::createHistQA() /// \return Bin for the histograms,... int FlowJHistManager::getCentBin(float cValue) { - const float centClasses[] = {0., 1., 2., 5., 10., 20., 30., 40., 50., 60., 70.}; + const float centClasses[] = {0., 5., 10., 20., 30., 40., 50., 60., 70., 100.}; for (int i = 0; i < mNcentBins + 1; i++) { if (cValue >= centClasses[i]) { diff --git a/PWGCF/JCorran/Core/FlowJSPCAnalysis.cxx b/PWGCF/JCorran/Core/FlowJSPCAnalysis.cxx index 1ce55de4f34..40585b3abec 100644 --- a/PWGCF/JCorran/Core/FlowJSPCAnalysis.cxx +++ b/PWGCF/JCorran/Core/FlowJSPCAnalysis.cxx @@ -112,8 +112,11 @@ void FlowJSPCAnalysis::calculateCorrelators(const int fCentBin) correlationDenom = dataCorrelation[0]; weightCorrelationDenom = dataCorrelation[1]; - // Histogram filling + // Check if the values are real numbers before filling. + if (std::isnan(correlationNum) || std::isnan(correlationDenom) || std::isnan(weightCorrelationNum) || std::isnan(weightCorrelationDenom)) + continue; + // Histogram filling fillHistograms(fCentBin, j, correlationNum, correlationDenom, weightCorrelationNum, weightCorrelationDenom); correlationNum = 0.; @@ -190,6 +193,14 @@ void FlowJSPCAnalysis::fillHistograms(const int fCentBin, int ind, double cNum, mHistRegistry->fill(HIST(MCentClasses[7]) + HIST("fCovResults"), 4. * static_cast(ind) + 2.5, wNum, 1.); mHistRegistry->fill(HIST(MCentClasses[7]) + HIST("fCovResults"), 4. * static_cast(ind) + 3.5, wDenom, 1.); } break; + case 8: { + mHistRegistry->fill(HIST(MCentClasses[8]) + HIST("fResults"), 2. * static_cast(ind) + 0.5, cNum, wNum); + mHistRegistry->fill(HIST(MCentClasses[8]) + HIST("fResults"), 2. * static_cast(ind) + 1.5, cDenom, wDenom); + mHistRegistry->fill(HIST(MCentClasses[8]) + HIST("fCovResults"), 4. * static_cast(ind) + 0.5, cNum * cDenom, wNum * wDenom); + mHistRegistry->fill(HIST(MCentClasses[8]) + HIST("fCovResults"), 4. * static_cast(ind) + 1.5, wNum * wDenom, 1.); + mHistRegistry->fill(HIST(MCentClasses[8]) + HIST("fCovResults"), 4. * static_cast(ind) + 2.5, wNum, 1.); + mHistRegistry->fill(HIST(MCentClasses[8]) + HIST("fCovResults"), 4. * static_cast(ind) + 3.5, wDenom, 1.); + } break; default: return; } @@ -230,6 +241,10 @@ void FlowJSPCAnalysis::fillQAHistograms(const int fCentBin, double phi, double p mHistRegistry->fill(HIST(MCentClasses[7]) + HIST("phiBefore"), phi); mHistRegistry->fill(HIST(MCentClasses[7]) + HIST("phiAfter"), phi, phiWeight); } break; + case 8: { + mHistRegistry->fill(HIST(MCentClasses[8]) + HIST("phiBefore"), phi); + mHistRegistry->fill(HIST(MCentClasses[8]) + HIST("phiAfter"), phi, phiWeight); + } break; default: return; } diff --git a/PWGCF/JCorran/Core/FlowJSPCAnalysis.h b/PWGCF/JCorran/Core/FlowJSPCAnalysis.h index 8882f206255..ba584d1e1eb 100644 --- a/PWGCF/JCorran/Core/FlowJSPCAnalysis.h +++ b/PWGCF/JCorran/Core/FlowJSPCAnalysis.h @@ -55,7 +55,7 @@ class FlowJSPCAnalysis mHistRegistry->add("Centrality_0/phiBefore", "Phi before", {o2::framework::HistType::kTH1D, {{100, 0., o2::constants::math::TwoPI}}}, true); mHistRegistry->add("Centrality_0/phiAfter", "Phi after", {o2::framework::HistType::kTH1D, {{100, 0., o2::constants::math::TwoPI}}}, true); - for (uint i = 1; i < 8; i++) { + for (uint i = 1; i < 9; i++) { mHistRegistry->addClone("Centrality_0/", Form("Centrality_%u/", i)); } } @@ -80,8 +80,7 @@ class FlowJSPCAnalysis "Centrality_5/", "Centrality_6/", "Centrality_7/", - "Centrality_8/", - "Centrality_9/"}; + "Centrality_8/"}; private: const int mNqHarmos = 113; ///< Highest harmo for Q(n,p): (v8*14part)+1. diff --git a/PWGCF/JCorran/Tasks/flowJSPCAnalysis.cxx b/PWGCF/JCorran/Tasks/flowJSPCAnalysis.cxx index 1eaebffa274..2ce4568348f 100644 --- a/PWGCF/JCorran/Tasks/flowJSPCAnalysis.cxx +++ b/PWGCF/JCorran/Tasks/flowJSPCAnalysis.cxx @@ -111,7 +111,7 @@ struct flowJSPCAnalysis { return; float cent = collision.multiplicity(); - if (cent < 0. || cent > 70.) { + if (cent < 0. || cent > 100.) { return; } int cBin = histManager.getCentBin(cent); From d3b739e099629e4f22722ee4a3fbe049029b0ec4 Mon Sep 17 00:00:00 2001 From: Yunfan Liu Date: Mon, 24 Feb 2025 16:45:24 +0100 Subject: [PATCH 0392/1650] [PWGHF] fix error of configurable type (#10150) Co-authored-by: ALICE Action Bot --- PWGHF/D2H/Tasks/taskOmegac0ToOmegapi.cxx | 57 +++++++++++------------- 1 file changed, 27 insertions(+), 30 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskOmegac0ToOmegapi.cxx b/PWGHF/D2H/Tasks/taskOmegac0ToOmegapi.cxx index 0b98a32593b..e65bf9d590b 100644 --- a/PWGHF/D2H/Tasks/taskOmegac0ToOmegapi.cxx +++ b/PWGHF/D2H/Tasks/taskOmegac0ToOmegapi.cxx @@ -33,27 +33,15 @@ using namespace o2::framework::expressions; /// Omegac0 analysis task -struct HfTaskOmegac0 { - Configurable yCandGenMax{"yCandGenMax", 0.5, "max. gen particle rapidity"}; - Configurable yCandRecoMax{"yCandRecoMax", 0.8, "max. cand. rapidity"}; - Configurable selectionFlagOmegac0{"selectionFlagOmegac0", 1, "Selection Flag for Omegac0 candidates"}; - +struct HfTaskOmegac0ToOmegapi { // ML inference Configurable applyMl{"applyMl", false, "Flag to apply ML selections"}; - - // ThnSparse for ML outputScores and Vars - ConfigurableAxis thnConfigAxisPromptScore{"thnConfigAxisPromptScore", {50, 0, 1}, "Prompt score bins"}; - ConfigurableAxis thnConfigAxisMass{"thnConfigAxisMass", {120, 2.4, 3.1}, "Cand. inv-mass bins"}; - ConfigurableAxis thnConfigAxisPtB{"thnConfigAxisPtB", {1000, 0, 100}, "Cand. beauty mother pTB bins"}; - ConfigurableAxis thnConfigAxisPt{"thnConfigAxisPt", {100, 0, 20}, "Cand. pT bins"}; - ConfigurableAxis thnConfigAxisY{"thnConfigAxisY", {20, -1, 1}, "Cand. rapidity bins"}; - ConfigurableAxis thnConfigAxisOrigin{"thnConfigAxisOrigin", {3, -0.5, 2.5}, "Cand. origin type"}; - ConfigurableAxis thnConfigAxisCandType{"thnConfigAxisCandType", {6, -0.5, 5.5}, "Omegac0 type"}; - ConfigurableAxis thnConfigAxisGenPtD{"thnConfigAxisGenPtD", {500, 0, 50}, "Gen Pt D"}; - ConfigurableAxis thnConfigAxisGenPtB{"thnConfigAxisGenPtB", {1000, 0, 100}, "Gen Pt B"}; - ConfigurableAxis thnConfigAxisNumPvContr{"thnConfigAxisNumPvContr", {200, -0.5, 199.5}, "Number of PV contributors"}; + Configurable selectionFlagOmegac0{"selectionFlagOmegac0", false, "Selection Flag for Omegac0 candidates"}; + Configurable yCandGenMax{"yCandGenMax", 0.5, "max. gen particle rapidity"}; + Configurable yCandRecoMax{"yCandRecoMax", 0.8, "max. cand. rapidity"}; HfHelper hfHelper; + SliceCache cache; using MyTracksWMc = soa::Join; using Omegac0Candidates = soa::Join; @@ -67,11 +55,20 @@ struct HfTaskOmegac0 { using Collisions = soa::Join; using CollisionsWithMcLabels = soa::Join; PresliceUnsorted colPerMcCollision = aod::mccollisionlabel::mcCollisionId; - SliceCache cache; - Partition selectedOmegac0CandidatesKF = aod::hf_sel_toomegapi::resultSelections >= selectionFlagOmegac0; - Partition selectedOmegac0CandidatesMlKF = aod::hf_sel_toomegapi::resultSelections >= selectionFlagOmegac0; + Partition selectedOmegac0CandidatesKF = aod::hf_sel_toomegapi::resultSelections && !selectionFlagOmegac0; + Partition selectedOmegac0CandidatesMlKF = aod::hf_sel_toomegapi::resultSelections && !selectionFlagOmegac0; + // ThnSparse for ML outputScores and Vars + ConfigurableAxis thnConfigAxisPromptScore{"thnConfigAxisPromptScore", {50, 0, 1}, "Prompt score bins"}; + ConfigurableAxis thnConfigAxisMass{"thnConfigAxisMass", {120, 2.4, 3.1}, "Cand. inv-mass bins"}; + ConfigurableAxis thnConfigAxisPtB{"thnConfigAxisPtB", {1000, 0, 100}, "Cand. beauty mother pTB bins"}; + ConfigurableAxis thnConfigAxisPt{"thnConfigAxisPt", {100, 0, 20}, "Cand. pT bins"}; + ConfigurableAxis thnConfigAxisY{"thnConfigAxisY", {20, -1, 1}, "Cand. rapidity bins"}; + ConfigurableAxis thnConfigAxisOrigin{"thnConfigAxisOrigin", {3, -0.5, 2.5}, "Cand. origin type"}; + ConfigurableAxis thnConfigAxisGenPtD{"thnConfigAxisGenPtD", {500, 0, 50}, "Gen Pt D"}; + ConfigurableAxis thnConfigAxisGenPtB{"thnConfigAxisGenPtB", {1000, 0, 100}, "Gen Pt B"}; + ConfigurableAxis thnConfigAxisNumPvContr{"thnConfigAxisNumPvContr", {200, -0.5, 199.5}, "Number of PV contributors"}; HistogramRegistry registry{ "registry", {}}; @@ -147,15 +144,15 @@ struct HfTaskOmegac0 { { processData(selectedOmegac0CandidatesKF, collisions); } - PROCESS_SWITCH(HfTaskOmegac0, processDataWithKFParticle, "process taskOmegac0 with KFParticle", false); - // TODO: add processKFParticleCent + PROCESS_SWITCH(HfTaskOmegac0ToOmegapi, processDataWithKFParticle, "process HfTaskOmegac0ToOmegapi with KFParticle", false); + // TODO: add processKFParticle void processDataWithKFParticleMl(Omegac0CandidatesMlKF const&, Collisions const& collisions) { processData(selectedOmegac0CandidatesMlKF, collisions); } - PROCESS_SWITCH(HfTaskOmegac0, processDataWithKFParticleMl, "process taskOmegac0 with KFParticle and ML selections", false); - // TODO: add processKFParticleMlCent + PROCESS_SWITCH(HfTaskOmegac0ToOmegapi, processDataWithKFParticleMl, "process HfTaskOmegac0ToOmegapi with KFParticle and ML selections", false); + // TODO: add processKFParticleMl template void processMc(const CandType& candidates, @@ -178,7 +175,7 @@ struct HfTaskOmegac0 { massOmegac0 = candidate.invMassCharmBaryon(); auto ptCandidate = candidate.ptCharmBaryon(); auto rapidityCandidate = candidate.kfRapOmegac(); - if (candidate.resultSelections() >= selectionFlagOmegac0) + if (candidate.resultSelections() && !selectionFlagOmegac0) if (candidate.flagMcMatchRec() == (1 << aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi)) { if constexpr (applyMl) { registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsOmegac0Type"), candidate.mlProbOmegac()[0], massOmegac0, ptCandidate, rapidityCandidate, candidate.ptBhadMotherPart(), candidate.originRec(), numPvContributors); @@ -223,8 +220,8 @@ struct HfTaskOmegac0 { { processMc(omegaC0CandidatesMcKF, mcParticles, tracks, collisions, mcCollisions); } - PROCESS_SWITCH(HfTaskOmegac0, processMcWithKFParticle, "Process MC with KFParticle", false); - // TODO: add the processMcWithKFParticleCent + PROCESS_SWITCH(HfTaskOmegac0ToOmegapi, processMcWithKFParticle, "Process MC with KFParticle", false); + // TODO: add the processMcWithKFParticle void processMcWithKFParticleMl(Omegac0CandidatesMlMcKF const& omegac0CandidatesMlMcKF, soa::Join const& mcParticles, @@ -234,11 +231,11 @@ struct HfTaskOmegac0 { { processMc(omegac0CandidatesMlMcKF, mcParticles, tracks, collisions, mcCollisions); } - PROCESS_SWITCH(HfTaskOmegac0, processMcWithKFParticleMl, "Process MC with KFParticle and ML selections", false); - // TODO: add the processMcWithKFParticleMlCent + PROCESS_SWITCH(HfTaskOmegac0ToOmegapi, processMcWithKFParticleMl, "Process MC with KFParticle and ML selections", false); + // TODO: add the processMcWithKFParticleMl }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{adaptAnalysisTask(cfgc)}; + return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From 364b34f1260d101109c22c3144a1a309bbad250b Mon Sep 17 00:00:00 2001 From: JStaa <39123272+JStaa@users.noreply.github.com> Date: Mon, 24 Feb 2025 17:05:30 +0100 Subject: [PATCH 0393/1650] [PWGCF] Added processMCSame and processMCMixed functions for MC closure test (#10162) Co-authored-by: ALICE Action Bot --- .../Tasks/threeParticleCorrelations.cxx | 119 ++++++++++++++++-- 1 file changed, 111 insertions(+), 8 deletions(-) diff --git a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx index f0d72cfccf8..d0746966a3d 100644 --- a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx +++ b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx @@ -56,7 +56,6 @@ struct ThreeParticleCorrelations { Filter globalTracks = requireGlobalTrackInFilter(); // Particle filters - Filter particlePt = aod::mcparticle::pt > 0.2f && aod::mcparticle::pt < 3.0f; Filter particleEta = nabs(aod::mcparticle::eta) < 0.8f; // Table aliases - Data @@ -68,7 +67,8 @@ struct ThreeParticleCorrelations { aod::pidTOFFullPi, aod::pidTOFFullKa, aod::pidTOFFullPr, aod::pidTOFbeta>>; // Table aliases - MC - using MyFilteredMCGenCollision = soa::Filtered::iterator; + using MyFilteredMCGenCollisions = soa::Filtered>; + using MyFilteredMCGenCollision = MyFilteredMCGenCollisions::iterator; using MyFilteredMCParticles = soa::Filtered; using MyFilteredMCRecCollision = soa::Filtered>::iterator; using MyFilteredMCTracks = soa::Filtered; BinningType collBinning{{confCentBins, confZvtxBins}, true}; - Pair pair{collBinning, 5, -1, &cache}; + Pair pairData{collBinning, 5, -1, &cache}; + SameKindPair pairMC{collBinning, 5, -1, &cache}; // Process configurables Configurable confFilterSwitch{"confFilterSwitch", false, "Switch for the fakeV0Filter function"}; @@ -97,7 +98,7 @@ struct ThreeParticleCorrelations { TH1D** hEffProtons = new TH1D*[2]; // Correlation variables - int triggSign; + int triggSign, assocSign; double candMass; double* assocPID; @@ -145,6 +146,7 @@ struct ThreeParticleCorrelations { rQARegistry.add("hInvMassLambda", "hInvMassLambda", {HistType::kTH3D, {{lambdaInvMassAxis}, {v0PtAxis}, {centralityAxis}}}); rQARegistry.add("hInvMassAntiLambda", "hInvMassAntiLambda", {HistType::kTH3D, {{lambdaInvMassAxis}, {v0PtAxis}, {centralityAxis}}}); + rQARegistry.add("hNLambdas_MC", "hNLambdas_MC", {HistType::kTH3D, {{2, -2, 2}, {v0PtAxis}, {centralityAxis}}}); // PhiStar rPhiStarRegistry.add("hSEProtonPreCut", "hSEProtonPreCut", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); @@ -189,6 +191,9 @@ struct ThreeParticleCorrelations { rSECorrRegistry.add("hSameLambdaKaon_SB", "Same-event #Lambda - K correlator (SB region)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); rSECorrRegistry.add("hSameLambdaProton_SGNL", "Same-event #Lambda - p correlator (SGNL region)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); rSECorrRegistry.add("hSameLambdaProton_SB", "Same-event #Lambda - p correlator (SB region)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaPion_MC", "Same-event #Lambda - #pi correlator (MC)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaKaon_MC", "Same-event #Lambda - K correlator (MC)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaProton_MC", "Same-event #Lambda - p correlator (MC)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); rMECorrRegistry.add("hMixLambdaPion_SGNL", "Mixed-event #Lambda - #pi correlator (SGNL region)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); rMECorrRegistry.add("hMixLambdaPion_SB", "Mixed-event #Lambda - #pi correlator (SB region)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); @@ -196,6 +201,9 @@ struct ThreeParticleCorrelations { rMECorrRegistry.add("hMixLambdaKaon_SB", "Mixed-event #Lambda - K correlator (SB region)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); rMECorrRegistry.add("hMixLambdaProton_SGNL", "Mixed-event #Lambda - p correlator (SGNL region)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); rMECorrRegistry.add("hMixLambdaProton_SB", "Mixed-event #Lambda - p correlator (SB region)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaPion_MC", "Mixed-event #Lambda - #pi correlator (MC)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaKaon_MC", "Mixed-event #Lambda - K correlator (MC)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaProton_MC", "Mixed-event #Lambda - p correlator (MC)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); ccdb->setURL("http://alice-ccdb.cern.ch"); ccdb->setCaching(true); @@ -253,7 +261,7 @@ struct ThreeParticleCorrelations { } // End of the Track QA - // Start of the V0-Track Correlations + // Start of the Same-Event Correlations for (const auto& trigger : v0s) { if (v0Filters(trigger)) { @@ -296,14 +304,14 @@ struct ThreeParticleCorrelations { } } } - // End of the V0-Track Correlations + // End of the Same-Event Correlations } void processMixed(MyFilteredCollisions const&, MyFilteredV0s const&, MyFilteredTracks const&, aod::BCsWithTimestamps const&) { // Start of the Mixed-events Correlations - for (const auto& [coll_1, v0_1, coll_2, track_2] : pair) { + for (const auto& [coll_1, v0_1, coll_2, track_2] : pairData) { auto bc = coll_1.bc_as(); auto bField = getMagneticField(bc.timestamp()); @@ -346,11 +354,104 @@ struct ThreeParticleCorrelations { // End of the Mixed-events Correlations } + void processMCSame(MyFilteredMCGenCollision const& collision, MyFilteredMCParticles const& particles) + { + + Partition mcTriggers = (aod::mcparticle::pdgCode == static_cast(kLambda0) || aod::mcparticle::pdgCode == static_cast(kLambda0Bar)) && aod::mcparticle::pt > 0.6f && aod::mcparticle::pt < 12.0f && nabs(aod::mcparticle::eta) < 0.72f; + Partition mcAssociates = (((aod::mcparticle::pdgCode == static_cast(kPiPlus) || aod::mcparticle::pdgCode == static_cast(kPiMinus)) && aod::mcparticle::pt > 0.3f && aod::mcparticle::pt < 2.3f) || + ((aod::mcparticle::pdgCode == static_cast(kKPlus) || aod::mcparticle::pdgCode == static_cast(kKMinus)) && aod::mcparticle::pt > 0.5f && aod::mcparticle::pt < 2.5f) || + ((aod::mcparticle::pdgCode == static_cast(kProton) || aod::mcparticle::pdgCode == static_cast(kProtonBar)) && aod::mcparticle::pt > 0.5f)); + mcTriggers.bindTable(particles); + mcAssociates.bindTable(particles); + + // Start of the MC Same-Event Correlations + for (const auto& trigger : mcTriggers) { + if (trigger.isPhysicalPrimary()) { + + if (trigger.pdgCode() > 0) { + triggSign = 1; + rQARegistry.fill(HIST("hNLambdas_MC"), 1, trigger.pt(), collision.centFT0M()); + } else if (trigger.pdgCode() < 0) { + triggSign = -1; + rQARegistry.fill(HIST("hNLambdas_MC"), -1, trigger.pt(), collision.centFT0M()); + } + + for (const auto& associate : mcAssociates) { + if (associate.isPhysicalPrimary()) { + + if (associate.pdgCode() > 0) { + assocSign = 1; + } else if (associate.pdgCode() < 0) { + assocSign = -1; + } + + deltaPhi = RecoDecay::constrainAngle(trigger.phi() - associate.phi(), -constants::math::PIHalf); + deltaEta = trigger.eta() - associate.eta(); + + if (std::abs(associate.pdgCode()) == kPiPlus) { + rSECorrRegistry.fill(HIST("hSameLambdaPion_MC"), deltaPhi, deltaEta, collision.centFT0M(), collision.posZ(), triggSign, assocSign); + } else if (std::abs(associate.pdgCode()) == kKPlus) { + rSECorrRegistry.fill(HIST("hSameLambdaKaon_MC"), deltaPhi, deltaEta, collision.centFT0M(), collision.posZ(), triggSign, assocSign); + } else if (std::abs(associate.pdgCode()) == kProton) { + rSECorrRegistry.fill(HIST("hSameLambdaProton_MC"), deltaPhi, deltaEta, collision.centFT0M(), collision.posZ(), triggSign, assocSign); + } + } + } + } + } + // End of the MC Same-Event Correlations + } + + void processMCMixed(MyFilteredMCGenCollisions const&, MyFilteredMCParticles const&) + { + + // Start of the MC Mixed-events Correlations + for (const auto& [coll_1, v0_1, coll_2, track_2] : pairMC) { + Partition mcTriggers = (aod::mcparticle::pdgCode == static_cast(kLambda0) || aod::mcparticle::pdgCode == static_cast(kLambda0Bar)) && aod::mcparticle::pt > 0.6f && aod::mcparticle::pt < 12.0f && nabs(aod::mcparticle::eta) < 0.72f; + Partition mcAssociates = (((aod::mcparticle::pdgCode == static_cast(kPiPlus) || aod::mcparticle::pdgCode == static_cast(kPiMinus)) && aod::mcparticle::pt > 0.3f && aod::mcparticle::pt < 2.3f) || + ((aod::mcparticle::pdgCode == static_cast(kKPlus) || aod::mcparticle::pdgCode == static_cast(kKMinus)) && aod::mcparticle::pt > 0.5f && aod::mcparticle::pt < 2.5f) || + ((aod::mcparticle::pdgCode == static_cast(kProton) || aod::mcparticle::pdgCode == static_cast(kProtonBar)) && aod::mcparticle::pt > 0.5f)); + mcTriggers.bindTable(v0_1); + mcAssociates.bindTable(track_2); + + for (const auto& [trigger, associate] : soa::combinations(soa::CombinationsFullIndexPolicy(mcTriggers, mcAssociates))) { + if (trigger.isPhysicalPrimary() && associate.isPhysicalPrimary()) { + + if (trigger.pdgCode() > 0) { + triggSign = 1; + } else if (trigger.pdgCode() < 0) { + triggSign = -1; + } + if (associate.pdgCode() > 0) { + assocSign = 1; + } else if (associate.pdgCode() < 0) { + assocSign = -1; + } + + deltaPhi = RecoDecay::constrainAngle(trigger.phi() - associate.phi(), -constants::math::PIHalf); + deltaEta = trigger.eta() - associate.eta(); + + if (std::abs(associate.pdgCode()) == kPiPlus) { + rMECorrRegistry.fill(HIST("hMixLambdaPion_MC"), deltaPhi, deltaEta, coll_1.centFT0M(), coll_1.posZ(), triggSign, assocSign); + } else if (std::abs(associate.pdgCode()) == kKPlus) { + rMECorrRegistry.fill(HIST("hMixLambdaKaon_MC"), deltaPhi, deltaEta, coll_1.centFT0M(), coll_1.posZ(), triggSign, assocSign); + } else if (std::abs(associate.pdgCode()) == kProton) { + rMECorrRegistry.fill(HIST("hMixLambdaProton_MC"), deltaPhi, deltaEta, coll_1.centFT0M(), coll_1.posZ(), triggSign, assocSign); + } + } + } + } + // End of the MC Mixed-events Correlations + } + void processMCGen(MyFilteredMCGenCollision const&, MyFilteredMCParticles const& particles) { + Partition mcParticles = aod::mcparticle::pt > 0.2f && aod::mcparticle::pt < 3.0f; + mcParticles.bindTable(particles); + // Start of the Monte-Carlo generated QA - for (const auto& particle : particles) { + for (const auto& particle : mcParticles) { if (particle.isPhysicalPrimary()) { // Efficiency - Generated @@ -452,6 +553,8 @@ struct ThreeParticleCorrelations { PROCESS_SWITCH(ThreeParticleCorrelations, processSame, "Process same-event correlations", true); PROCESS_SWITCH(ThreeParticleCorrelations, processMixed, "Process mixed-event correlations", true); + PROCESS_SWITCH(ThreeParticleCorrelations, processMCSame, "Process MC same-event correlations", true); + PROCESS_SWITCH(ThreeParticleCorrelations, processMCMixed, "Process MC mixed-event correlations", true); PROCESS_SWITCH(ThreeParticleCorrelations, processMCGen, "Process Monte-Carlo, generator level", false); PROCESS_SWITCH(ThreeParticleCorrelations, processMCRec, "Process Monte-Carlo, reconstructed level", false); From b9da622834a3f656207d49e1f30870cb2ed7dfa3 Mon Sep 17 00:00:00 2001 From: Diana <70915994+diana0x0f@users.noreply.github.com> Date: Mon, 24 Feb 2025 17:08:00 +0100 Subject: [PATCH 0394/1650] [PWGUD] Remove ROF and TF borders for global fwd tracks (#10168) Co-authored-by: Diana Krupova --- PWGUD/TableProducer/UPCCandidateProducer.cxx | 58 ++++++++++++++++++-- 1 file changed, 54 insertions(+), 4 deletions(-) diff --git a/PWGUD/TableProducer/UPCCandidateProducer.cxx b/PWGUD/TableProducer/UPCCandidateProducer.cxx index 75fb8f61063..aa266305bdb 100644 --- a/PWGUD/TableProducer/UPCCandidateProducer.cxx +++ b/PWGUD/TableProducer/UPCCandidateProducer.cxx @@ -124,6 +124,9 @@ struct UpcCandProducer { histRegistry.get(HIST("hCountersTrg"))->GetXaxis()->SetBinLabel(1, "TCE"); histRegistry.get(HIST("hCountersTrg"))->GetXaxis()->SetBinLabel(2, "ZNA"); histRegistry.get(HIST("hCountersTrg"))->GetXaxis()->SetBinLabel(3, "ZNC"); + histRegistry.get(HIST("hCountersTrg"))->GetXaxis()->SetBinLabel(4, "TCE_ROF"); + histRegistry.get(HIST("hCountersTrg"))->GetXaxis()->SetBinLabel(5, "TCE_TF"); + histRegistry.get(HIST("hCountersTrg"))->GetXaxis()->SetBinLabel(6, "TCE_ROF_TF"); const AxisSpec axisBcDist{201, 0.5, 200.5, ""}; histRegistry.add("hDistToITSTPC", "", kTH1F, {axisBcDist}); @@ -691,6 +694,43 @@ struct UpcCandProducer { } } + template + void collectForwardGlobalTracks(std::vector& bcsMatchedTrIds, + int typeFilter, + TBCs const& /*bcs*/, + o2::aod::Collisions const& /*collisions*/, + ForwardTracks const& fwdTracks, + o2::aod::AmbiguousFwdTracks const& /*ambFwdTracks*/, + std::unordered_map& ambFwdTrBCs) + { + for (const auto& trk : fwdTracks) { + if (trk.trackType() != typeFilter) + continue; + if (!applyFwdCuts(trk)) + continue; + int64_t trkId = trk.globalIndex(); + int32_t nContrib = -1; + uint64_t trackBC = 0; + auto ambIter = ambFwdTrBCs.find(trkId); + if (ambIter == ambFwdTrBCs.end()) { + const auto& col = trk.collision(); + nContrib = col.numContrib(); + trackBC = col.bc_as().globalBC(); + if (!(col.bc_as().selection_bit(o2::aod::evsel::kNoTimeFrameBorder) && + col.bc_as().selection_bit(o2::aod::evsel::kNoITSROFrameBorder))) { + continue; // skip this track if both selection bits are not set + } + } else { + trackBC = ambIter->second; + } + int64_t tint = TMath::FloorNint(trk.trackTime() / o2::constants::lhc::LHCBunchSpacingNS + static_cast(fMuonTrackTShift)); + uint64_t bc = trackBC + tint; + if (nContrib > upcCuts.getMaxNContrib()) + continue; + addTrack(bcsMatchedTrIds, bc, trkId); + } + } + int32_t searchTracks(uint64_t midbc, uint64_t range, uint32_t tracksToFind, std::vector& tracks, std::vector& v, @@ -1519,10 +1559,10 @@ struct UpcCandProducer { bcs, collisions, fwdTracks, ambFwdTracks, ambFwdTrBCs); - collectForwardTracks(bcsMatchedTrIdsGlobal, - o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack, - bcs, collisions, - fwdTracks, ambFwdTracks, ambFwdTrBCs); + collectForwardGlobalTracks(bcsMatchedTrIdsGlobal, + o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack, + bcs, collisions, + fwdTracks, ambFwdTracks, ambFwdTrBCs); std::sort(bcsMatchedTrIdsMID.begin(), bcsMatchedTrIdsMID.end(), [](const auto& left, const auto& right) { return left.first < right.first; }); @@ -1539,6 +1579,16 @@ struct UpcCandProducer { continue; if (TESTBIT(ft0.triggerMask(), o2::fit::Triggers::bitCen)) { // TVX & TCE histRegistry.get(HIST("hCountersTrg"))->Fill("TCE", 1); + if (ft0.bc_as().selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { // TVX & TCE without ROF borders + histRegistry.get(HIST("hCountersTrg"))->Fill("TCE_ROF", 1); + } + if (ft0.bc_as().selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { // TVX & TCE without TF borders + histRegistry.get(HIST("hCountersTrg"))->Fill("TCE_TF", 1); + } + if (ft0.bc_as().selection_bit(o2::aod::evsel::kNoITSROFrameBorder) && + ft0.bc_as().selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { // TVX & TCE without ROF and TF borders + histRegistry.get(HIST("hCountersTrg"))->Fill("TCE_ROF_TF", 1); + } } if (std::abs(ft0.timeA()) > 2.f) continue; From 95b28221636dc2364cf77c0122ee9d10ff8b2ce7 Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Tue, 25 Feb 2025 00:12:23 +0800 Subject: [PATCH 0395/1650] [PWGCF] add track type Qa task, add MC pt-Nch QA; (#10165) --- PWGCF/Flow/Tasks/CMakeLists.txt | 5 + PWGCF/Flow/Tasks/flowMc.cxx | 27 ++ PWGCF/Flow/Tasks/flowQa.cxx | 723 ++++++++++++++++++++++++++++++++ 3 files changed, 755 insertions(+) create mode 100644 PWGCF/Flow/Tasks/flowQa.cxx diff --git a/PWGCF/Flow/Tasks/CMakeLists.txt b/PWGCF/Flow/Tasks/CMakeLists.txt index d7bc12308eb..3a00f2b5956 100644 --- a/PWGCF/Flow/Tasks/CMakeLists.txt +++ b/PWGCF/Flow/Tasks/CMakeLists.txt @@ -29,6 +29,11 @@ o2physics_add_dpl_workflow(flow-mc PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::GFWCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(flow-qa + SOURCES flowQa.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::AnalysisCCDB O2Physics::GFWCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(flow-gfw-task SOURCES flowGfwTask.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::GFWCore diff --git a/PWGCF/Flow/Tasks/flowMc.cxx b/PWGCF/Flow/Tasks/flowMc.cxx index 075e0af9cd2..1fa0744e479 100644 --- a/PWGCF/Flow/Tasks/flowMc.cxx +++ b/PWGCF/Flow/Tasks/flowMc.cxx @@ -99,7 +99,10 @@ struct FlowMc { histos.add("hPhi", "#phi distribution", HistType::kTH1D, {axisPhi}); histos.add("hPhiWeighted", "corrected #phi distribution", HistType::kTH1D, {axisPhi}); + histos.add("hEPVsPhiMC", "hEPVsPhiMC;Event Plane Angle; #varphi", HistType::kTH2D, {axisPhi, axisPhi}); histos.add("hEPVsPhi", "hEPVsPhi;Event Plane Angle; #varphi", HistType::kTH2D, {axisPhi, axisPhi}); + histos.add("hPtNchGenerated", "Reco production; pT (GeV/c); multiplicity", HistType::kTH2D, {axisPt, axisNch}); + histos.add("hPtNchGlobal", "Global production; pT (GeV/c); multiplicity", HistType::kTH2D, {axisPt, axisNch}); if (cfgOutputNUAWeights) { o2::framework::AxisSpec axis = axisPt; @@ -161,6 +164,7 @@ struct FlowMc { evPhi += constants::math::TwoPI; int64_t nCh = 0; + int64_t nChGlobal = 0; float weff = 1.; float wacc = 1.; auto bc = mcCollision.bc_as(); @@ -171,6 +175,23 @@ struct FlowMc { histos.fill(HIST("hImpactParameter"), imp); histos.fill(HIST("hEventPlaneAngle"), evPhi); + for (auto const& mcParticle : mcParticles) { + int pdgCode = std::abs(mcParticle.pdgCode()); + if (pdgCode != PDG_t::kElectron && pdgCode != PDG_t::kMuonMinus && pdgCode != PDG_t::kPiPlus && pdgCode != kKPlus && pdgCode != PDG_t::kProton) + continue; + if (!mcParticle.isPhysicalPrimary()) + continue; + if (std::fabs(mcParticle.eta()) > 0.8) // main acceptance + continue; + if (mcParticle.has_tracks()) { + auto const& tracks = mcParticle.tracks_as(); + for (auto const& track : tracks) { + if (track.hasTPC() && track.hasITS()) + nChGlobal++; + } + } + } + for (auto const& mcParticle : mcParticles) { // focus on bulk: e, mu, pi, k, p int pdgCode = std::abs(mcParticle.pdgCode()); @@ -189,6 +210,7 @@ struct FlowMc { deltaPhi -= constants::math::TwoPI; histos.fill(HIST("hPtVsPhiGenerated"), deltaPhi, mcParticle.pt()); histos.fill(HIST("hBVsPtVsPhiGenerated"), imp, deltaPhi, mcParticle.pt()); + histos.fill(HIST("hPtNchGenerated"), mcParticle.pt(), nChGlobal); nCh++; @@ -223,6 +245,10 @@ struct FlowMc { fWeights->fill(mcParticle.phi(), mcParticle.eta(), vtxz, mcParticle.pt(), 0, 0); if (!setCurrentParticleWeights(weff, wacc, mcParticle.phi(), mcParticle.eta(), mcParticle.pt(), vtxz)) continue; + if (withinPtRef) { + histos.fill(HIST("hEPVsPhiMC"), evPhi, mcParticle.phi()); + } + if (validGlobal && withinPtRef) { histos.fill(HIST("hPhi"), mcParticle.phi()); histos.fill(HIST("hPhiWeighted"), mcParticle.phi(), wacc); @@ -233,6 +259,7 @@ struct FlowMc { if (validGlobal) { histos.fill(HIST("hPtVsPhiGlobal"), deltaPhi, mcParticle.pt(), wacc * weff); histos.fill(HIST("hBVsPtVsPhiGlobal"), imp, deltaPhi, mcParticle.pt(), wacc * weff); + histos.fill(HIST("hPtNchGlobal"), mcParticle.pt(), nChGlobal); } // if any track present, fill if (validTrack) diff --git a/PWGCF/Flow/Tasks/flowQa.cxx b/PWGCF/Flow/Tasks/flowQa.cxx new file mode 100644 index 00000000000..b12450a8d3d --- /dev/null +++ b/PWGCF/Flow/Tasks/flowQa.cxx @@ -0,0 +1,723 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file flowQa.cxx +/// \author Zhiyong Lu (zhiyong.lu@cern.ch) +/// \since Feb/23/2025 +/// \brief jira: PWGCF-254, QA for flow analysis + +#include +#include +#include +#include +#include +#include +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/RunningWorkflowInfo.h" +#include "Framework/HistogramRegistry.h" + +#include "Common/DataModel/EventSelection.h" +#include "Common/Core/TrackSelection.h" +#include "Common/Core/TrackSelectionDefaults.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/CCDB/ctpRateFetcher.h" + +#include "GFWPowerArray.h" +#include "GFW.h" +#include "GFWCumulant.h" +#include "GFWWeights.h" +#include "FlowContainer.h" +#include "TList.h" +#include +#include +#include +#include + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +#define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable NAME{#NAME, DEFAULT, HELP}; + +struct FlowQa { + + O2_DEFINE_CONFIGURABLE(cfgCutVertex, float, 10.0f, "Accepted z-vertex range") + O2_DEFINE_CONFIGURABLE(cfgCentEstimator, int, 0, "0:FT0C; 1:FT0CVariant1; 2:FT0M; 3:FT0A") + O2_DEFINE_CONFIGURABLE(cfgCentFT0CMin, float, 0.0f, "Minimum centrality (FT0C) to cut events in filter") + O2_DEFINE_CONFIGURABLE(cfgCentFT0CMax, float, 100.0f, "Maximum centrality (FT0C) to cut events in filter") + O2_DEFINE_CONFIGURABLE(cfgCutPtPOIMin, float, 0.2f, "Minimal pT for poi tracks") + O2_DEFINE_CONFIGURABLE(cfgCutPtPOIMax, float, 10.0f, "Maximal pT for poi tracks") + O2_DEFINE_CONFIGURABLE(cfgCutPtRefMin, float, 0.2f, "Minimal pT for ref tracks") + O2_DEFINE_CONFIGURABLE(cfgCutPtRefMax, float, 3.0f, "Maximal pT for ref tracks") + O2_DEFINE_CONFIGURABLE(cfgCutPtMin, float, 0.2f, "Minimal pT for all tracks") + O2_DEFINE_CONFIGURABLE(cfgCutPtMax, float, 10.0f, "Maximal pT for all tracks") + O2_DEFINE_CONFIGURABLE(cfgCutEta, float, 0.8f, "Eta range for tracks") + O2_DEFINE_CONFIGURABLE(cfgCutTPCclu, float, 30.0f, "minimum TPC clusters") + O2_DEFINE_CONFIGURABLE(cfgCutITSclu, float, 5.0f, "minimum ITS clusters") + O2_DEFINE_CONFIGURABLE(cfgCutITSTPCcluEnabled, bool, false, "switch of minimum ITS/TPC clusters") + O2_DEFINE_CONFIGURABLE(cfgCutDCAz, float, 2.0f, "max DCA to vertex z") + O2_DEFINE_CONFIGURABLE(cfgCutDCAxyppPass3Enabled, bool, false, "switch of ppPass3 DCAxy pt dependent cut") + O2_DEFINE_CONFIGURABLE(cfgCutDCAzPtDepEnabled, bool, false, "switch of DCAz pt dependent cut") + O2_DEFINE_CONFIGURABLE(cfgTrackType, int, 0, "0:Global; 1:GlobalSDD; 2:QualityITS; 3:QualityTPC; 4:ITS; 5: TPC; 6:GloalorITS; 7: GlobalorTPC") + O2_DEFINE_CONFIGURABLE(cfgUseAdditionalEventCut, bool, false, "Use additional event cut on mult correlations") + O2_DEFINE_CONFIGURABLE(cfgUseTentativeEventCounter, bool, false, "After sel8(), count events regardless of real event selection") + O2_DEFINE_CONFIGURABLE(cfgEvSelkNoSameBunchPileup, bool, false, "rejects collisions which are associated with the same found-by-T0 bunch crossing") + O2_DEFINE_CONFIGURABLE(cfgEvSelkIsGoodZvtxFT0vsPV, bool, false, "removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference, use this cut at low multiplicities with caution") + O2_DEFINE_CONFIGURABLE(cfgEvSelkNoCollInTimeRangeStandard, bool, false, "no collisions in specified time range") + O2_DEFINE_CONFIGURABLE(cfgEvSelkIsGoodITSLayersAll, bool, true, "cut time intervals with dead ITS staves") + O2_DEFINE_CONFIGURABLE(cfgEvSelkNoCollInRofStandard, bool, false, "no other collisions in this Readout Frame with per-collision multiplicity above threshold") + O2_DEFINE_CONFIGURABLE(cfgEvSelkNoHighMultCollInPrevRof, bool, false, "veto an event if FT0C amplitude in previous ITS ROF is above threshold") + O2_DEFINE_CONFIGURABLE(cfgGetInteractionRate, bool, false, "Get interaction rate from CCDB") + O2_DEFINE_CONFIGURABLE(cfgUseInteractionRateCut, bool, false, "Use events with low interaction rate") + O2_DEFINE_CONFIGURABLE(cfgCutMaxIR, float, 50.0f, "maximum interaction rate (kHz)") + O2_DEFINE_CONFIGURABLE(cfgCutMinIR, float, 0.0f, "minimum interaction rate (kHz)") + O2_DEFINE_CONFIGURABLE(cfgUseNch, bool, false, "Use Nch for flow observables") + O2_DEFINE_CONFIGURABLE(cfgNbootstrap, int, 30, "Number of subsamples") + O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeights, bool, false, "Fill and output NUA weights") + O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeightsRefPt, bool, false, "NUA weights are filled in ref pt bins") + O2_DEFINE_CONFIGURABLE(cfgEfficiency, std::string, "", "CCDB path to efficiency object") + O2_DEFINE_CONFIGURABLE(cfgAcceptance, std::string, "", "CCDB path to acceptance object") + O2_DEFINE_CONFIGURABLE(cfgAcceptanceList, std::string, "", "CCDB path to acceptance lsit object") + O2_DEFINE_CONFIGURABLE(cfgAcceptanceListEnabled, bool, false, "switch of acceptance list") + O2_DEFINE_CONFIGURABLE(cfgEvSelOccupancy, bool, true, "Occupancy cut") + O2_DEFINE_CONFIGURABLE(cfgCutOccupancyHigh, int, 500, "High cut on TPC occupancy") + O2_DEFINE_CONFIGURABLE(cfgCutOccupancyLow, int, 0, "Low cut on TPC occupancy") + O2_DEFINE_CONFIGURABLE(cfgUseSmallMemory, bool, false, "Use small memory mode") + Configurable> cfgUserDefineGFWCorr{"cfgUserDefineGFWCorr", std::vector{"refN02 {2} refP02 {-2}", "refN12 {2} refP12 {-2}"}, "User defined GFW CorrelatorConfig"}; + Configurable> cfgUserDefineGFWName{"cfgUserDefineGFWName", std::vector{"Ch02Gap22", "Ch12Gap22"}, "User defined GFW Name"}; + Configurable> cfgRunRemoveList{"cfgRunRemoveList", std::vector{-1}, "excluded run numbers"}; + + ConfigurableAxis axisPtHist{"axisPtHist", {100, 0., 10.}, "pt axis for histograms"}; + ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.2, 2.4, 2.6, 2.8, 3, 3.5, 4, 5, 6, 8, 10}, "pt axis for histograms"}; + ConfigurableAxis axisIndependent{"axisIndependent", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90}, "X axis for histograms"}; + ConfigurableAxis axisNch{"axisNch", {4000, 0, 4000}, "N_{ch}"}; + ConfigurableAxis axisDCAz{"axisDCAz", {200, -2, 2}, "DCA_{z} (cm)"}; + ConfigurableAxis axisDCAxy{"axisDCAxy", {200, -1, 1}, "DCA_{xy} (cm)"}; + + Filter collisionFilter = (nabs(aod::collision::posZ) < cfgCutVertex) && (aod::cent::centFT0C > cfgCentFT0CMin) && (aod::cent::centFT0C < cfgCentFT0CMax); + Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax) && (nabs(aod::track::dcaZ) < cfgCutDCAz); + + // Corrections + TH1D* mEfficiency = nullptr; + GFWWeights* mAcceptance = nullptr; + TObjArray* mAcceptanceList = nullptr; + bool correctionsLoaded = false; + + // Connect to ccdb + Service ccdb; + Configurable ccdbNoLaterThan{"ccdbNoLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + + // Define output + OutputObj fFC{FlowContainer("FlowContainer")}; + OutputObj fWeights{GFWWeights("weights")}; + HistogramRegistry registry{"registry"}; + + // define global variables + GFW* fGFW = new GFW(); + std::vector corrconfigs; + TAxis* fPtAxis; + TRandom3* fRndm = new TRandom3(0); + enum CentEstimators { + kCentFT0C = 0, + kCentFT0CVariant1, + kCentFT0M, + kCentFV0A, + // Count the total number of enum + kCount_CentEstimators + }; + enum TrackType { + kGlobalTrack = 0, + kGlobalTrackSDD, + kQualityTracksITS, + kQualityTracksTPC, + kITSTracks, + kTPCTracks, + kGlobalOrITSTracks, + kGlobalOrTPCTracks, + // Count the total number of enum + kCount_TrackType + }; + int mRunNumber{-1}; + uint64_t mSOR{0}; + double mMinSeconds{-1.}; + std::unordered_map gHadronicRate; + ctpRateFetcher mRateFetcher; + TH2* gCurrentHadronicRate; + + using AodCollisions = soa::Filtered>; + using AodTracks = soa::Filtered>; + + void init(InitContext const&) + { + const AxisSpec axisVertex{40, -20, 20, "Vtxz (cm)"}; + const AxisSpec axisPhi{60, 0.0, constants::math::TwoPI, "#varphi"}; + const AxisSpec axisEta{40, -1., 1., "#eta"}; + const AxisSpec axisCentForQA{100, 0, 100, "centrality (%)"}; + const AxisSpec axisT0C{70, 0, 70000, "N_{ch} (T0C)"}; + const AxisSpec axisT0A{200, 0, 200000, "N_{ch} (T0A)"}; + + ccdb->setURL(ccdbUrl.value); + ccdb->setCaching(true); + ccdb->setCreatedNotAfter(ccdbNoLaterThan.value); + + // Add some output objects to the histogram registry + // Event QA + registry.add("hEventCount", "Number of Event;; Count", {HistType::kTH1D, {{5, 0, 5}}}); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(1, "Filtered event"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(2, "after sel8"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(3, "after supicious Runs removal"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(4, "after additional event cut"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(5, "after correction loads"); + registry.add("hEventCountSpecific", "Number of Event;; Count", {HistType::kTH1D, {{8, 0, 8}}}); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(1, "after sel8"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(2, "kNoSameBunchPileup"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(3, "kIsGoodZvtxFT0vsPV"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(4, "kNoCollInTimeRangeStandard"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(5, "kIsGoodITSLayersAll"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(6, "kNoCollInRofStandard"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(7, "kNoHighMultCollInPrevRof"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(8, "occupancy"); + if (cfgUseTentativeEventCounter) { + registry.add("hEventCountTentative", "Number of Event;; Count", {HistType::kTH1D, {{8, 0, 8}}}); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(1, "after sel8"); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(2, "kNoSameBunchPileup"); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(3, "kIsGoodZvtxFT0vsPV"); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(4, "kNoCollInTimeRangeStandard"); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(5, "kIsGoodITSLayersAll"); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(6, "kNoCollInRofStandard"); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(7, "kNoHighMultCollInPrevRof"); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(8, "occupancy"); + } + registry.add("hVtxZ", "Vexter Z distribution", {HistType::kTH1D, {axisVertex}}); + std::string hMultTitle = "Multiplicity distribution, TrackType " + std::to_string(cfgTrackType); + registry.add("hMult", hMultTitle.c_str(), {HistType::kTH1D, {{6000, 0, 6000}}}); + std::string hCentTitle = "Centrality distribution, Estimator " + std::to_string(cfgCentEstimator); + registry.add("hCent", hCentTitle.c_str(), {HistType::kTH1D, {{90, 0, 90}}}); + if (!cfgUseSmallMemory) { + registry.add("BeforeSel8_Tracks_centT0C", "before sel8;Centrality T0C;mulplicity tracks", {HistType::kTH2D, {axisCentForQA, axisNch}}); + registry.add("BeforeCut_Tracks_centT0C", "before cut;Centrality T0C;mulplicity tracks", {HistType::kTH2D, {axisCentForQA, axisNch}}); + registry.add("BeforeCut_PVTracks_centT0C", "before cut;Centrality T0C;mulplicity PV tracks", {HistType::kTH2D, {axisCentForQA, axisNch}}); + registry.add("BeforeCut_Tracks_PVTracks", "before cut;mulplicity PV tracks;mulplicity tracks", {HistType::kTH2D, {axisNch, axisNch}}); + registry.add("BeforeCut_Tracks_multT0A", "before cut;mulplicity T0A;mulplicity tracks", {HistType::kTH2D, {axisT0A, axisNch}}); + registry.add("BeforeCut_Tracks_multV0A", "before cut;mulplicity V0A;mulplicity tracks", {HistType::kTH2D, {axisT0A, axisNch}}); + registry.add("BeforeCut_multV0A_multT0A", "before cut;mulplicity T0A;mulplicity V0A", {HistType::kTH2D, {axisT0A, axisT0A}}); + registry.add("BeforeCut_multT0C_centT0C", "before cut;Centrality T0C;mulplicity T0C", {HistType::kTH2D, {axisCentForQA, axisT0C}}); + registry.add("Tracks_centT0C", "after cut;Centrality T0C;mulplicity tracks", {HistType::kTH2D, {axisCentForQA, axisNch}}); + registry.add("PVTracks_centT0C", "after cut;Centrality T0C;mulplicity PV tracks", {HistType::kTH2D, {axisCentForQA, axisNch}}); + registry.add("Tracks_PVTracks", "after cut;mulplicity PV tracks;mulplicity tracks", {HistType::kTH2D, {axisNch, axisNch}}); + registry.add("Tracks_multT0A", "after cut;mulplicity T0A;mulplicity tracks", {HistType::kTH2D, {axisT0A, axisNch}}); + registry.add("Tracks_multV0A", "after cut;mulplicity V0A;mulplicity tracks", {HistType::kTH2D, {axisT0A, axisNch}}); + registry.add("multV0A_multT0A", "after cut;mulplicity T0A;mulplicity V0A", {HistType::kTH2D, {axisT0A, axisT0A}}); + registry.add("multT0C_centT0C", "after cut;Centrality T0C;mulplicity T0C", {HistType::kTH2D, {axisCentForQA, axisT0C}}); + registry.add("centFT0CVar_centFT0C", "after cut;Centrality T0C;Centrality T0C Var", {HistType::kTH2D, {axisCentForQA, axisCentForQA}}); + registry.add("centFT0M_centFT0C", "after cut;Centrality T0C;Centrality T0M", {HistType::kTH2D, {axisCentForQA, axisCentForQA}}); + registry.add("centFV0A_centFT0C", "after cut;Centrality T0C;Centrality V0A", {HistType::kTH2D, {axisCentForQA, axisCentForQA}}); + } + // Track QA + registry.add("hPhi", "#phi distribution", {HistType::kTH1D, {axisPhi}}); + registry.add("hPhiWeighted", "corrected #phi distribution", {HistType::kTH1D, {axisPhi}}); + registry.add("hEta", "#eta distribution", {HistType::kTH1D, {axisEta}}); + registry.add("hPt", "p_{T} distribution before cut", {HistType::kTH1D, {axisPtHist}}); + registry.add("hPtRef", "p_{T} distribution after cut", {HistType::kTH1D, {axisPtHist}}); + registry.add("hChi2prTPCcls", "#chi^{2}/cluster for the TPC track segment", {HistType::kTH1D, {{100, 0., 5.}}}); + registry.add("hChi2prITScls", "#chi^{2}/cluster for the ITS track", {HistType::kTH1D, {{100, 0., 50.}}}); + registry.add("hnTPCClu", "Number of found TPC clusters", {HistType::kTH1D, {{100, 40, 180}}}); + registry.add("hnITSClu", "Number of found ITS clusters", {HistType::kTH1D, {{100, 0, 20}}}); + registry.add("hnTPCCrossedRow", "Number of crossed TPC Rows", {HistType::kTH1D, {{100, 40, 180}}}); + registry.add("hDCAz", "DCAz after cuts; DCAz (cm); Pt", {HistType::kTH2D, {{200, -0.5, 0.5}, {200, 0, 5}}}); + registry.add("hDCAxy", "DCAxy after cuts; DCAxy (cm); Pt", {HistType::kTH2D, {{200, -0.5, 0.5}, {200, 0, 5}}}); + registry.add("hTrackCorrection2d", "Correlation table for number of tracks table; uncorrected track; corrected track", {HistType::kTH2D, {axisNch, axisNch}}); + + o2::framework::AxisSpec axis = axisPt; + int nPtBins = axis.binEdges.size() - 1; + double* ptBins = &(axis.binEdges)[0]; + fPtAxis = new TAxis(nPtBins, ptBins); + + if (cfgOutputNUAWeights) { + fWeights->setPtBins(nPtBins, ptBins); + fWeights->init(true, false); + } + + // add in FlowContainer to Get boostrap sample automatically + TObjArray* oba = new TObjArray(); + oba->Add(new TNamed("ChGap22", "ChGap22")); + oba->Add(new TNamed("ChFull22", "ChFull22")); + oba->Add(new TNamed("ChFull32", "ChFull32")); + oba->Add(new TNamed("ChFull42", "ChFull42")); + oba->Add(new TNamed("ChFull24", "ChFull24")); + oba->Add(new TNamed("ChFull26", "ChFull26")); + for (auto i = 0; i < fPtAxis->GetNbins(); i++) + oba->Add(new TNamed(Form("ChFull22_pt_%i", i + 1), "ChFull22_pTDiff")); + for (auto i = 0; i < fPtAxis->GetNbins(); i++) + oba->Add(new TNamed(Form("ChFull24_pt_%i", i + 1), "ChFull24_pTDiff")); + for (auto i = 0; i < fPtAxis->GetNbins(); i++) + oba->Add(new TNamed(Form("ChFull26_pt_%i", i + 1), "ChFull26_pTDiff")); + oba->Add(new TNamed("Ch10Gap22", "Ch10Gap22")); + for (auto i = 0; i < fPtAxis->GetNbins(); i++) + oba->Add(new TNamed(Form("Ch10Gap22_pt_%i", i + 1), "Ch10Gap22_pTDiff")); + oba->Add(new TNamed("Ch10Gap32", "Ch10Gap32")); + for (auto i = 0; i < fPtAxis->GetNbins(); i++) + oba->Add(new TNamed(Form("Ch10Gap32_pt_%i", i + 1), "Ch10Gap32_pTDiff")); + oba->Add(new TNamed("Ch10Gap42", "Ch10Gap42")); + for (auto i = 0; i < fPtAxis->GetNbins(); i++) + oba->Add(new TNamed(Form("Ch10Gap42_pt_%i", i + 1), "Ch10Gap42_pTDiff")); + oba->Add(new TNamed("Ch10GapA422", "Ch10GapA422")); + oba->Add(new TNamed("Ch10GapB422", "Ch10GapB422")); + oba->Add(new TNamed("ChFull3232", "ChFull3232")); + oba->Add(new TNamed("ChFull4242", "ChFull4242")); + oba->Add(new TNamed("Ch10Gap24", "Ch10Gap24")); + for (auto i = 0; i < fPtAxis->GetNbins(); i++) + oba->Add(new TNamed(Form("Ch10Gap24_pt_%i", i + 1), "Ch10Gap24_pTDiff")); + std::vector userDefineGFWCorr = cfgUserDefineGFWCorr; + std::vector userDefineGFWName = cfgUserDefineGFWName; + if (!userDefineGFWCorr.empty() && !userDefineGFWName.empty()) { + for (uint i = 0; i < userDefineGFWName.size(); i++) { + oba->Add(new TNamed(userDefineGFWName.at(i).c_str(), userDefineGFWName.at(i).c_str())); + } + } + fFC->SetName("FlowContainer"); + fFC->SetXAxis(fPtAxis); + fFC->Initialize(oba, axisIndependent, cfgNbootstrap); + delete oba; + + // eta region + fGFW->AddRegion("full", -0.8, 0.8, 1, 1); + fGFW->AddRegion("refN00", -0.8, 0., 1, 1); // gap0 negative region + fGFW->AddRegion("refP00", 0., 0.8, 1, 1); // gap0 positve region + fGFW->AddRegion("refN02", -0.8, -0.1, 1, 1); // gap2 negative region + fGFW->AddRegion("refP02", 0.1, 0.8, 1, 1); // gap2 positve region + fGFW->AddRegion("refN04", -0.8, -0.2, 1, 1); // gap4 negative region + fGFW->AddRegion("refP04", 0.2, 0.8, 1, 1); // gap4 positve region + fGFW->AddRegion("refN06", -0.8, -0.3, 1, 1); // gap6 negative region + fGFW->AddRegion("refP06", 0.3, 0.8, 1, 1); // gap6 positve region + fGFW->AddRegion("refN08", -0.8, -0.4, 1, 1); + fGFW->AddRegion("refP08", 0.4, 0.8, 1, 1); + fGFW->AddRegion("refN10", -0.8, -0.5, 1, 1); + fGFW->AddRegion("refP10", 0.5, 0.8, 1, 1); + fGFW->AddRegion("refN12", -0.8, -0.6, 1, 1); + fGFW->AddRegion("refP12", 0.6, 0.8, 1, 1); + fGFW->AddRegion("refN14", -0.8, -0.7, 1, 1); + fGFW->AddRegion("refP14", 0.7, 0.8, 1, 1); + fGFW->AddRegion("refN", -0.8, -0.4, 1, 1); + fGFW->AddRegion("refP", 0.4, 0.8, 1, 1); + fGFW->AddRegion("refM", -0.4, 0.4, 1, 1); + fGFW->AddRegion("poiN", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 2); + fGFW->AddRegion("poiN10", -0.8, -0.5, 1 + fPtAxis->GetNbins(), 2); + fGFW->AddRegion("poifull", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 2); + fGFW->AddRegion("olN", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 4); + fGFW->AddRegion("olN10", -0.8, -0.5, 1 + fPtAxis->GetNbins(), 4); + fGFW->AddRegion("olfull", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 4); + + corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {2 -2}", "ChFull22", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {3 -3}", "ChFull32", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {4 -4}", "ChFull42", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {2 2 -2 -2}", "ChFull24", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {2 2 2 -2 -2 -2}", "ChFull26", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN10 {2} refP10 {-2}", "Ch10Gap22", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN10 {3} refP10 {-3}", "Ch10Gap32", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN10 {4} refP10 {-4}", "Ch10Gap42", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN {2} refP {-2}", "ChGap22", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poifull full | olfull {2 -2}", "ChFull22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poifull full | olfull {2 2 -2 -2}", "ChFull24", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poifull full | olfull {2 2 2 -2 -2 -2}", "ChFull26", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiN10 refN10 | olN10 {2} refP10 {-2}", "Ch10Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiN10 refN10 | olN10 {3} refP10 {-3}", "Ch10Gap32", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiN10 refN10 | olN10 {4} refP10 {-4}", "Ch10Gap42", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN10 {-2 -2} refP10 {4}", "Ch10GapA422", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN10 {4} refP10 {-2 -2}", "Ch10GapB422", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {3 2 -3 -2}", "ChFull3232", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {4 2 -4 -2}", "ChFull4242", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN10 {2 2} refP10 {-2 -2}", "Ch10Gap24", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiN10 refN10 | olN10 {2 2} refP10 {-2 -2}", "Ch10Gap24", kTRUE)); + if (!userDefineGFWCorr.empty() && !userDefineGFWName.empty()) { + LOGF(info, "User adding GFW CorrelatorConfig:"); + // attentaion: here we follow the index of cfgUserDefineGFWCorr + for (uint i = 0; i < userDefineGFWCorr.size(); i++) { + if (i >= userDefineGFWName.size()) { + LOGF(fatal, "The names you provided are more than configurations. userDefineGFWName.size(): %d > userDefineGFWCorr.size(): %d", userDefineGFWName.size(), userDefineGFWCorr.size()); + break; + } + LOGF(info, "%d: %s %s", i, userDefineGFWCorr.at(i).c_str(), userDefineGFWName.at(i).c_str()); + corrconfigs.push_back(fGFW->GetCorrelatorConfig(userDefineGFWCorr.at(i).c_str(), userDefineGFWName.at(i).c_str(), kFALSE)); + } + } + fGFW->CreateRegions(); + } + + template + void fillProfile(const GFW::CorrConfig& corrconf, const ConstStr& tarName, const double& cent) + { + double dnx, val; + dnx = fGFW->Calculate(corrconf, 0, kTRUE).real(); + if (dnx == 0) + return; + if (!corrconf.pTDif) { + val = fGFW->Calculate(corrconf, 0, kFALSE).real() / dnx; + if (std::fabs(val) < 1) + registry.fill(tarName, cent, val, dnx); + return; + } + return; + } + + void fillFC(const GFW::CorrConfig& corrconf, const double& cent, const double& rndm) + { + double dnx, val; + dnx = fGFW->Calculate(corrconf, 0, kTRUE).real(); + if (dnx == 0) + return; + if (!corrconf.pTDif) { + val = fGFW->Calculate(corrconf, 0, kFALSE).real() / dnx; + if (std::fabs(val) < 1) + fFC->FillProfile(corrconf.Head.c_str(), cent, val, dnx, rndm); + return; + } + for (auto i = 1; i <= fPtAxis->GetNbins(); i++) { + dnx = fGFW->Calculate(corrconf, i - 1, kTRUE).real(); + if (dnx == 0) + continue; + val = fGFW->Calculate(corrconf, i - 1, kFALSE).real() / dnx; + if (std::fabs(val) < 1) + fFC->FillProfile(Form("%s_pt_%i", corrconf.Head.c_str(), i), cent, val, dnx, rndm); + } + return; + } + + void loadCorrections(uint64_t timestamp, int runNumber) + { + if (correctionsLoaded) + return; + if (!cfgAcceptanceListEnabled && cfgAcceptance.value.empty() == false) { + mAcceptance = ccdb->getForTimeStamp(cfgAcceptance, timestamp); + if (mAcceptance) + LOGF(info, "Loaded acceptance weights from %s (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance); + else + LOGF(warning, "Could not load acceptance weights from %s (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance); + } + if (cfgAcceptanceListEnabled && cfgAcceptanceList.value.empty() == false) { + mAcceptanceList = ccdb->getForTimeStamp(cfgAcceptanceList, timestamp); + if (mAcceptanceList == nullptr) { + LOGF(fatal, "Could not load acceptance weights list from %s", cfgAcceptanceList.value.c_str()); + } + LOGF(info, "Loaded acceptance weights list from %s (%p)", cfgAcceptanceList.value.c_str(), (void*)mAcceptanceList); + + mAcceptance = static_cast(mAcceptanceList->FindObject(Form("%d", runNumber))); + if (mAcceptance == nullptr) { + LOGF(fatal, "Could not find acceptance weights for run %d in acceptance list", runNumber); + } + LOGF(info, "Loaded acceptance weights (%p) for run %d from list (%p)", (void*)mAcceptance, runNumber, (void*)mAcceptanceList); + } + if (cfgEfficiency.value.empty() == false) { + mEfficiency = ccdb->getForTimeStamp(cfgEfficiency, timestamp); + if (mEfficiency == nullptr) { + LOGF(fatal, "Could not load efficiency histogram for trigger particles from %s", cfgEfficiency.value.c_str()); + } + LOGF(info, "Loaded efficiency histogram from %s (%p)", cfgEfficiency.value.c_str(), (void*)mEfficiency); + } + correctionsLoaded = true; + } + + bool setCurrentParticleWeights(float& weight_nue, float& weight_nua, float phi, float eta, float pt, float vtxz) + { + float eff = 1.; + if (mEfficiency) + eff = mEfficiency->GetBinContent(mEfficiency->FindBin(pt)); + else + eff = 1.0; + if (eff == 0) + return false; + weight_nue = 1. / eff; + + if (mAcceptance) + weight_nua = mAcceptance->getNUA(phi, eta, vtxz); + else + weight_nua = 1; + return true; + } + + template + bool eventSelected(TCollision collision) + { + registry.fill(HIST("hEventCountSpecific"), 0.5); + if (cfgEvSelkNoSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { + // rejects collisions which are associated with the same "found-by-T0" bunch crossing + // https://indico.cern.ch/event/1396220/#1-event-selection-with-its-rof + return 0; + } + if (cfgEvSelkNoSameBunchPileup) + registry.fill(HIST("hEventCountSpecific"), 1.5); + if (cfgEvSelkIsGoodZvtxFT0vsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { + // removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference + // use this cut at low multiplicities with caution + return 0; + } + if (cfgEvSelkIsGoodZvtxFT0vsPV) + registry.fill(HIST("hEventCountSpecific"), 2.5); + if (cfgEvSelkNoCollInTimeRangeStandard && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + // no collisions in specified time range + return 0; + } + if (cfgEvSelkNoCollInTimeRangeStandard) + registry.fill(HIST("hEventCountSpecific"), 3.5); + if (cfgEvSelkIsGoodITSLayersAll && !collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + // from Jan 9 2025 AOT meeting + // cut time intervals with dead ITS staves + return 0; + } + if (cfgEvSelkIsGoodITSLayersAll) + registry.fill(HIST("hEventCountSpecific"), 4.5); + if (cfgEvSelkNoCollInRofStandard && !collision.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { + // no other collisions in this Readout Frame with per-collision multiplicity above threshold + return 0; + } + if (cfgEvSelkNoCollInRofStandard) + registry.fill(HIST("hEventCountSpecific"), 5.5); + if (cfgEvSelkNoHighMultCollInPrevRof && !collision.selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof)) { + // veto an event if FT0C amplitude in previous ITS ROF is above threshold + return 0; + } + if (cfgEvSelkNoHighMultCollInPrevRof) + registry.fill(HIST("hEventCountSpecific"), 6.5); + auto occupancy = collision.trackOccupancyInTimeRange(); + if (cfgEvSelOccupancy && (occupancy < cfgCutOccupancyLow || occupancy > cfgCutOccupancyHigh)) + return 0; + if (cfgEvSelOccupancy) + registry.fill(HIST("hEventCountSpecific"), 7.5); + + return 1; + } + + template + void eventCounterQA(TCollision collision) + { + registry.fill(HIST("hEventCountTentative"), 0.5); + // Regradless of the event selection, fill the event counter histograms + if (collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) + registry.fill(HIST("hEventCountTentative"), 1.5); + if (collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) + registry.fill(HIST("hEventCountTentative"), 2.5); + if (collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) + registry.fill(HIST("hEventCountTentative"), 3.5); + if (collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) + registry.fill(HIST("hEventCountTentative"), 4.5); + if (collision.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) + registry.fill(HIST("hEventCountTentative"), 5.5); + if (collision.selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof)) + registry.fill(HIST("hEventCountTentative"), 6.5); + auto occupancy = collision.trackOccupancyInTimeRange(); + if (!(occupancy < cfgCutOccupancyLow || occupancy > cfgCutOccupancyHigh)) + registry.fill(HIST("hEventCountTentative"), 7.5); + } + + template + bool trackSelected(TTrack track) + { + // track type selection + bool passTrackTypeSelection = false; + switch (cfgTrackType) { + case kGlobalTrack: + passTrackTypeSelection = track.isGlobalTrack(); + break; + case kGlobalTrackSDD: + passTrackTypeSelection = track.isGlobalTrackSDD(); + break; + case kQualityTracksITS: + passTrackTypeSelection = track.isQualityTrackITS(); + break; + case kQualityTracksTPC: + passTrackTypeSelection = track.isQualityTrackTPC(); + break; + case kITSTracks: + passTrackTypeSelection = (track.isQualityTrackITS() && track.isPrimaryTrack() && track.isInAcceptanceTrack()); + break; + case kTPCTracks: + passTrackTypeSelection = (track.isQualityTrackTPC() && track.isPrimaryTrack() && track.isInAcceptanceTrack()); + break; + case kGlobalOrITSTracks: + passTrackTypeSelection = (track.isGlobalTrack() || (track.isQualityTrackITS() && track.isPrimaryTrack() && track.isInAcceptanceTrack())); + break; + case kGlobalOrTPCTracks: + passTrackTypeSelection = (track.isGlobalTrack() || (track.isQualityTrackTPC() && track.isPrimaryTrack() && track.isInAcceptanceTrack())); + break; + } + if (!passTrackTypeSelection) + return false; + + if (cfgCutDCAzPtDepEnabled && (std::fabs(track.dcaZ()) > (0.004f + 0.013f / track.pt()))) + return false; + + if (cfgCutITSTPCcluEnabled && (track.tpcNClsFound() < cfgCutTPCclu || track.itsNCls() < cfgCutITSclu)) + return false; + + return true; + } + + void initHadronicRate(aod::BCsWithTimestamps::iterator const& bc) + { + if (mRunNumber == bc.runNumber()) { + return; + } + mRunNumber = bc.runNumber(); + if (gHadronicRate.find(mRunNumber) == gHadronicRate.end()) { + auto runDuration = ccdb->getRunDuration(mRunNumber); + mSOR = runDuration.first; + mMinSeconds = std::floor(mSOR * 1.e-3); /// round tsSOR to the highest integer lower than tsSOR + double maxSec = std::ceil(runDuration.second * 1.e-3); /// round tsEOR to the lowest integer higher than tsEOR + const AxisSpec axisSeconds{static_cast((maxSec - mMinSeconds) / 20.f), 0, maxSec - mMinSeconds, "Seconds since SOR"}; + gHadronicRate[mRunNumber] = registry.add(Form("HadronicRate/%i", mRunNumber), ";Time since SOR (s);Hadronic rate (kHz)", kTH2D, {axisSeconds, {510, 0., 51.}}).get(); + } + gCurrentHadronicRate = gHadronicRate[mRunNumber]; + } + + void process(AodCollisions::iterator const& collision, aod::BCsWithTimestamps const&, AodTracks const& tracks) + { + registry.fill(HIST("hEventCount"), 0.5); + if (!cfgUseSmallMemory && tracks.size() >= 1) { + registry.fill(HIST("BeforeSel8_Tracks_centT0C"), collision.centFT0C(), tracks.size()); + } + if (!collision.sel8()) + return; + if (tracks.size() < 1) + return; + registry.fill(HIST("hEventCount"), 1.5); + auto bc = collision.bc_as(); + int currentRunNumber = bc.runNumber(); + for (const auto& ExcludedRun : cfgRunRemoveList.value) { + if (currentRunNumber == ExcludedRun) { + return; + } + } + registry.fill(HIST("hEventCount"), 2.5); + if (!cfgUseSmallMemory) { + registry.fill(HIST("BeforeCut_Tracks_centT0C"), collision.centFT0C(), tracks.size()); + registry.fill(HIST("BeforeCut_PVTracks_centT0C"), collision.centFT0C(), collision.multNTracksPV()); + registry.fill(HIST("BeforeCut_Tracks_PVTracks"), collision.multNTracksPV(), tracks.size()); + registry.fill(HIST("BeforeCut_Tracks_multT0A"), collision.multFT0A(), tracks.size()); + registry.fill(HIST("BeforeCut_Tracks_multV0A"), collision.multFV0A(), tracks.size()); + registry.fill(HIST("BeforeCut_multV0A_multT0A"), collision.multFT0A(), collision.multFV0A()); + registry.fill(HIST("BeforeCut_multT0C_centT0C"), collision.centFT0C(), collision.multFT0C()); + } + float cent; + switch (cfgCentEstimator) { + case kCentFT0C: + cent = collision.centFT0C(); + break; + case kCentFT0CVariant1: + cent = collision.centFT0CVariant1(); + break; + case kCentFT0M: + cent = collision.centFT0M(); + break; + case kCentFV0A: + cent = collision.centFV0A(); + break; + default: + cent = collision.centFT0C(); + } + if (cfgUseTentativeEventCounter) + eventCounterQA(collision); + if (cfgUseAdditionalEventCut && !eventSelected(collision)) + return; + registry.fill(HIST("hEventCount"), 3.5); + float lRandom = fRndm->Rndm(); + float vtxz = collision.posZ(); + registry.fill(HIST("hVtxZ"), vtxz); + registry.fill(HIST("hMult"), tracks.size()); + registry.fill(HIST("hCent"), cent); + fGFW->Clear(); + if (cfgGetInteractionRate) { + initHadronicRate(bc); + double hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), mRunNumber, "ZNC hadronic") * 1.e-3; // + double seconds = bc.timestamp() * 1.e-3 - mMinSeconds; + if (cfgUseInteractionRateCut && (hadronicRate < cfgCutMinIR || hadronicRate > cfgCutMaxIR)) // cut on hadronic rate + return; + gCurrentHadronicRate->Fill(seconds, hadronicRate); + } + loadCorrections(bc.timestamp(), currentRunNumber); + registry.fill(HIST("hEventCount"), 4.5); + + // fill event QA + if (!cfgUseSmallMemory) { + registry.fill(HIST("Tracks_centT0C"), collision.centFT0C(), tracks.size()); + registry.fill(HIST("PVTracks_centT0C"), collision.centFT0C(), collision.multNTracksPV()); + registry.fill(HIST("Tracks_PVTracks"), collision.multNTracksPV(), tracks.size()); + registry.fill(HIST("Tracks_multT0A"), collision.multFT0A(), tracks.size()); + registry.fill(HIST("Tracks_multV0A"), collision.multFV0A(), tracks.size()); + registry.fill(HIST("multV0A_multT0A"), collision.multFT0A(), collision.multFV0A()); + registry.fill(HIST("multT0C_centT0C"), collision.centFT0C(), collision.multFT0C()); + registry.fill(HIST("centFT0CVar_centFT0C"), collision.centFT0C(), collision.centFT0CVariant1()); + registry.fill(HIST("centFT0M_centFT0C"), collision.centFT0C(), collision.centFT0M()); + registry.fill(HIST("centFV0A_centFT0C"), collision.centFT0C(), collision.centFV0A()); + } + + // track weights + float weff = 1, wacc = 1; + double nTracksCorrected = 0; + float independent = cent; + if (cfgUseNch) + independent = static_cast(tracks.size()); + + for (const auto& track : tracks) { + if (!trackSelected(track)) + continue; + bool withinPtPOI = (cfgCutPtPOIMin < track.pt()) && (track.pt() < cfgCutPtPOIMax); // within POI pT range + bool withinPtRef = (cfgCutPtRefMin < track.pt()) && (track.pt() < cfgCutPtRefMax); // within RF pT range + if (cfgOutputNUAWeights) { + if (cfgOutputNUAWeightsRefPt) { + if (withinPtRef) + fWeights->fill(track.phi(), track.eta(), vtxz, track.pt(), cent, 0); + } else { + fWeights->fill(track.phi(), track.eta(), vtxz, track.pt(), cent, 0); + } + } + if (!setCurrentParticleWeights(weff, wacc, track.phi(), track.eta(), track.pt(), vtxz)) + continue; + registry.fill(HIST("hPt"), track.pt()); + if (withinPtRef) { + registry.fill(HIST("hPhi"), track.phi()); + registry.fill(HIST("hPhiWeighted"), track.phi(), wacc); + registry.fill(HIST("hEta"), track.eta()); + registry.fill(HIST("hPtRef"), track.pt()); + registry.fill(HIST("hChi2prTPCcls"), track.tpcChi2NCl()); + registry.fill(HIST("hChi2prITScls"), track.itsChi2NCl()); + registry.fill(HIST("hnTPCClu"), track.tpcNClsFound()); + registry.fill(HIST("hnITSClu"), track.itsNCls()); + registry.fill(HIST("hnTPCCrossedRow"), track.tpcNClsCrossedRows()); + registry.fill(HIST("hDCAz"), track.dcaZ(), track.pt()); + registry.fill(HIST("hDCAxy"), track.dcaXY(), track.pt()); + nTracksCorrected += weff; + } + if (withinPtRef) + fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), wacc * weff, 1); + if (withinPtPOI) + fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), wacc * weff, 2); + if (withinPtPOI && withinPtRef) + fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), wacc * weff, 4); + } + registry.fill(HIST("hTrackCorrection2d"), tracks.size(), nTracksCorrected); + + // Filling Flow Container + for (uint l_ind = 0; l_ind < corrconfigs.size(); l_ind++) { + fillFC(corrconfigs.at(l_ind), independent, lRandom); + } + } +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc)}; +} From f844145715c730baacd796a31deb11cd98f409c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Mon, 24 Feb 2025 18:14:19 +0100 Subject: [PATCH 0396/1650] [PWGHF,Trigger] Fix linter issues (#9595) --- EventFiltering/PWGHF/HFFilter.cxx | 30 +- .../PWGHF/HFFilterCharmHadronSignals.cxx | 12 +- EventFiltering/PWGHF/HFFilterHelpers.h | 4 +- .../candidateSelectorChicToJpsiGamma.cxx | 6 +- .../candidateSelectorD0Alice3Barrel.cxx | 2 +- .../candidateSelectorD0Alice3Forward.cxx | 2 +- .../candidateSelectorD0ParametrizedPid.cxx | 2 +- .../TableProducer/candidateSelectorJpsi.cxx | 2 +- .../candidateSelectorLcAlice3.cxx | 2 +- .../candidateSelectorLcParametrizedPid.cxx | 2 +- .../candidateSelectorXToJpsiPiPi.cxx | 2 +- PWGHF/Core/HfMlResponseB0ToDPi.h | 8 +- PWGHF/Core/HfMlResponseBsToDsPi.h | 2 +- PWGHF/Core/SelectorCuts.h | 260 +++++++++--------- PWGHF/D2H/Core/SelectorCutsRedDataFormat.h | 20 +- PWGHF/D2H/DataModel/ReducedDataModel.h | 53 ++-- .../candidateCreatorCharmResoReduced.cxx | 4 +- .../candidateSelectorB0ToDPiReduced.cxx | 8 +- .../candidateSelectorBplusToD0PiReduced.cxx | 8 +- .../candidateSelectorBsToDsPiReduced.cxx | 8 +- .../dataCreatorCharmHadPiReduced.cxx | 6 +- .../DataModel/CandidateReconstructionTables.h | 76 ++--- PWGHF/DataModel/CandidateSelectionTables.h | 2 + PWGHF/HFC/TableProducer/correlatorD0D0bar.cxx | 12 +- .../correlatorD0D0barBarrelFullPid.cxx | 12 +- .../TableProducer/correlatorDMesonPairs.cxx | 4 +- .../TableProducer/correlatorDplusDminus.cxx | 10 +- .../TableProducer/correlatorDplusHadrons.cxx | 2 +- PWGHF/HFC/Tasks/taskCorrelationD0Hadrons.cxx | 2 +- PWGHF/HFC/Tasks/taskCorrelationDDbar.cxx | 96 +++---- .../HFC/Tasks/taskCorrelationDplusHadrons.cxx | 2 +- .../HFC/Tasks/taskCorrelationDstarHadrons.cxx | 2 +- PWGHF/HFL/DataModel/ElectronSelectionTable.h | 16 +- PWGHF/TableProducer/candidateCreatorB0.cxx | 12 +- PWGHF/TableProducer/candidateCreatorBplus.cxx | 14 +- PWGHF/TableProducer/candidateCreatorBs.cxx | 12 +- .../TableProducer/candidateCreatorCascade.cxx | 18 +- .../candidateCreatorSigmac0plusplus.cxx | 6 +- .../candidateSelectorB0ToDPi.cxx | 2 +- .../candidateSelectorBplusToD0Pi.cxx | 8 +- .../candidateSelectorBsToDsPi.cxx | 6 +- PWGHF/TableProducer/candidateSelectorD0.cxx | 6 +- .../candidateSelectorDplusToPiKPi.cxx | 8 +- .../candidateSelectorDsToKKPi.cxx | 8 +- .../candidateSelectorDstarToD0Pi.cxx | 8 +- .../candidateSelectorLbToLcPi.cxx | 2 +- PWGHF/TableProducer/candidateSelectorLc.cxx | 8 +- .../candidateSelectorLcPidMl.cxx | 2 +- .../candidateSelectorLcToK0sP.cxx | 6 +- .../candidateSelectorOmegac0ToOmegaPi.cxx | 8 +- .../candidateSelectorXicToPKPi.cxx | 6 +- .../candidateSelectorXicToXiPiPi.cxx | 8 +- .../candidateSelectorXiccToPKPiPi.cxx | 2 +- PWGHF/TableProducer/trackIndexSkimCreator.cxx | 44 +-- PWGHF/TableProducer/treeCreatorLcToK0sP.cxx | 6 +- .../treeCreatorOmegacToOmegaPi.cxx | 4 +- PWGHF/TableProducer/treeCreatorToXiPi.cxx | 16 +- .../TableProducer/treeCreatorXic0ToXiPiKf.cxx | 2 +- PWGHF/Utils/utilsAnalysis.h | 21 +- PWGHF/Utils/utilsEvSelHf.h | 48 ++-- PWGHF/Utils/utilsMcGen.h | 2 +- PWGHF/Utils/utilsPid.h | 10 +- 62 files changed, 494 insertions(+), 488 deletions(-) diff --git a/EventFiltering/PWGHF/HFFilter.cxx b/EventFiltering/PWGHF/HFFilter.cxx index 1222700797a..ee41cd01c30 100644 --- a/EventFiltering/PWGHF/HFFilter.cxx +++ b/EventFiltering/PWGHF/HFFilter.cxx @@ -81,9 +81,9 @@ struct HfFilter { // Main struct for HF triggers // parameters for beauty triggers Configurable> pTBinsTrack{"pTBinsTrack", std::vector{hf_cuts_single_track::vecBinsPtTrack}, "track pT bin limits for DCAXY pT-dependent cut"}; - Configurable> cutsTrackBeauty3Prong{"cutsTrackBeauty3Prong", {hf_cuts_single_track::cutsTrack[0], hf_cuts_single_track::nBinsPtTrack, hf_cuts_single_track::nCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for 3-prong beauty candidates"}; - Configurable> cutsTrackBeauty4Prong{"cutsTrackBeauty4Prong", {hf_cuts_single_track::cutsTrack[0], hf_cuts_single_track::nBinsPtTrack, hf_cuts_single_track::nCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for 4-prong beauty candidates"}; - Configurable> cutsTrackBeautyToJPsi{"cutsTrackBeautyToJPsi", {hf_cuts_single_track::cutsTrack[0], hf_cuts_single_track::nBinsPtTrack, hf_cuts_single_track::nCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for beauty->JPsi candidates (not muons)"}; + Configurable> cutsTrackBeauty3Prong{"cutsTrackBeauty3Prong", {hf_cuts_single_track::CutsTrack[0], hf_cuts_single_track::NBinsPtTrack, hf_cuts_single_track::NCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for 3-prong beauty candidates"}; + Configurable> cutsTrackBeauty4Prong{"cutsTrackBeauty4Prong", {hf_cuts_single_track::CutsTrack[0], hf_cuts_single_track::NBinsPtTrack, hf_cuts_single_track::NCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for 4-prong beauty candidates"}; + Configurable> cutsTrackBeautyToJPsi{"cutsTrackBeautyToJPsi", {hf_cuts_single_track::CutsTrack[0], hf_cuts_single_track::NBinsPtTrack, hf_cuts_single_track::NCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for beauty->JPsi candidates (not muons)"}; Configurable paramCharmMassShape{"paramCharmMassShape", "2023_pass3", "Parametrisation of charm-hadron mass shape (options: 2023_pass3)"}; Configurable numSigmaDeltaMassCharmHad{"numSigmaDeltaMassCharmHad", 2.5, "Number of sigma for charm-hadron delta mass cut in B and D resonance triggers"}; Configurable> pTBinsBHadron{"pTBinsBHadron", std::vector{hf_trigger_cuts_presel_beauty::vecBinsPt}, "pT bin limits for beauty hadrons preselections"}; @@ -114,17 +114,17 @@ struct HfFilter { // Main struct for HF triggers // parameters for charm baryons to Xi bachelor Configurable> cutsXiCascades{"cutsXiCascades", {cutsCascades[0], 1, 8, labelsEmpty, labelsColumnsCascades}, "Selections for cascades (Xi) for Xi+bachelor triggers"}; Configurable> cutsXiBachelor{"cutsXiBachelor", {cutsCharmBaryons[0], 1, 8, labelsEmpty, labelsColumnsCharmBarCuts}, "Selections for charm baryons (Xi+Pi, Xi+Ka, Xi+Pi+Pi)"}; - Configurable> cutsTrackCharmBaryonBachelor{"cutsTrackCharmBaryonBachelor", {hf_cuts_single_track::cutsTrack[0], hf_cuts_single_track::nBinsPtTrack, hf_cuts_single_track::nCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for charm-baryon bachelor candidates"}; + Configurable> cutsTrackCharmBaryonBachelor{"cutsTrackCharmBaryonBachelor", {hf_cuts_single_track::CutsTrack[0], hf_cuts_single_track::NBinsPtTrack, hf_cuts_single_track::NCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for charm-baryon bachelor candidates"}; Configurable> requireStrangenessTracking{"requireStrangenessTracking", {requireStrangenessTrackedXi[0], 1, 2, labelsEmpty, labelsColumnsCharmBaryons}, "Flags to require strangeness tracking for channels with Xi"}; // parameters for ML application Configurable> pTBinsBDT{"pTBinsBDT", std::vector{hf_cuts_bdt_multiclass::vecBinsPt}, "track pT bin limits for BDT cut"}; - Configurable> thresholdBDTScoreD0ToKPi{"thresholdBDTScoreD0ToKPi", {hf_cuts_bdt_multiclass::cuts[0], hf_cuts_bdt_multiclass::nBinsPt, hf_cuts_bdt_multiclass::nCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for BDT output scores of D0 candidates"}; - Configurable> thresholdBDTScoreDPlusToPiKPi{"thresholdBDTScoreDPlusToPiKPi", {hf_cuts_bdt_multiclass::cuts[0], hf_cuts_bdt_multiclass::nBinsPt, hf_cuts_bdt_multiclass::nCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for BDT output scores of D+ candidates"}; - Configurable> thresholdBDTScoreDSToPiKK{"thresholdBDTScoreDSToPiKK", {hf_cuts_bdt_multiclass::cuts[0], hf_cuts_bdt_multiclass::nBinsPt, hf_cuts_bdt_multiclass::nCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for BDT output scores of Ds+ candidates"}; - Configurable> thresholdBDTScoreLcToPiKP{"thresholdBDTScoreLcToPiKP", {hf_cuts_bdt_multiclass::cuts[0], hf_cuts_bdt_multiclass::nBinsPt, hf_cuts_bdt_multiclass::nCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for BDT output scores of Lc+ candidates"}; - Configurable> thresholdBDTScoreXicToPiKP{"thresholdBDTScoreXicToPiKP", {hf_cuts_bdt_multiclass::cuts[0], hf_cuts_bdt_multiclass::nBinsPt, hf_cuts_bdt_multiclass::nCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for BDT output scores of Xic+ candidates"}; + Configurable> thresholdBDTScoreD0ToKPi{"thresholdBDTScoreD0ToKPi", {hf_cuts_bdt_multiclass::Cuts[0], hf_cuts_bdt_multiclass::NBinsPt, hf_cuts_bdt_multiclass::NCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for BDT output scores of D0 candidates"}; + Configurable> thresholdBDTScoreDPlusToPiKPi{"thresholdBDTScoreDPlusToPiKPi", {hf_cuts_bdt_multiclass::Cuts[0], hf_cuts_bdt_multiclass::NBinsPt, hf_cuts_bdt_multiclass::NCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for BDT output scores of D+ candidates"}; + Configurable> thresholdBDTScoreDSToPiKK{"thresholdBDTScoreDSToPiKK", {hf_cuts_bdt_multiclass::Cuts[0], hf_cuts_bdt_multiclass::NBinsPt, hf_cuts_bdt_multiclass::NCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for BDT output scores of Ds+ candidates"}; + Configurable> thresholdBDTScoreLcToPiKP{"thresholdBDTScoreLcToPiKP", {hf_cuts_bdt_multiclass::Cuts[0], hf_cuts_bdt_multiclass::NBinsPt, hf_cuts_bdt_multiclass::NCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for BDT output scores of Lc+ candidates"}; + Configurable> thresholdBDTScoreXicToPiKP{"thresholdBDTScoreXicToPiKP", {hf_cuts_bdt_multiclass::Cuts[0], hf_cuts_bdt_multiclass::NBinsPt, hf_cuts_bdt_multiclass::NCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for BDT output scores of Xic+ candidates"}; Configurable acceptBdtBkgOnly{"acceptBdtBkgOnly", true, "Enable / disable selection based on BDT bkg score only"}; @@ -154,11 +154,11 @@ struct HfFilter { // Main struct for HF triggers // array of BDT thresholds std::array, kNCharmParticles> thresholdBDTScores; - o2::vertexing::DCAFitterN<2> df2; // fitter for Charm Hadron vertex (2-prong vertex fitter) - o2::vertexing::DCAFitterN<3> df3; // fitter for Charm/Beauty Hadron vertex (3-prong vertex fitter) - o2::vertexing::DCAFitterN<4> df4; // fitter for Beauty Hadron vertex (4-prong vertex fitter) - o2::vertexing::DCAFitterN<2> dfB; // fitter for Beauty Hadron vertex (2-prong vertex fitter) - o2::vertexing::DCAFitterN<3> dfBtoDstar; // fitter for Beauty Hadron to D* vertex (3-prong vertex fitter) + o2::vertexing::DCAFitterN<2> df2; // fitter for Charm Hadron vertex (2-prong vertex fitter) + o2::vertexing::DCAFitterN<3> df3; // fitter for Charm/Beauty Hadron vertex (3-prong vertex fitter) + o2::vertexing::DCAFitterN<4> df4; // fitter for Beauty Hadron vertex (4-prong vertex fitter) + o2::vertexing::DCAFitterN<2> dfB; // fitter for Beauty Hadron vertex (2-prong vertex fitter) + o2::vertexing::DCAFitterN<3> dfBtoDstar; // fitter for Beauty Hadron to D* vertex (3-prong vertex fitter) o2::vertexing::DCAFitterN<2> dfStrangeness; // fitter for V0s and cascades (2-prong vertex fitter) HistogramRegistry registry{"registry"}; @@ -419,7 +419,7 @@ struct HfFilter { // Main struct for HF triggers std::vector> indicesDau2Prong{}; auto cand2ProngsThisColl = cand2Prongs.sliceBy(hf2ProngPerCollision, thisCollId); - for (const auto& cand2Prong : cand2ProngsThisColl) { // start loop over 2 prongs + for (const auto& cand2Prong : cand2ProngsThisColl) { // start loop over 2 prongs int8_t preselD0 = TESTBIT(cand2Prong.hfflag(), o2::aod::hf_cand_2prong::DecayType::D0ToPiK); // check if it's a D0 int8_t preselJPsiToMuMu = TESTBIT(cand2Prong.hfflag(), o2::aod::hf_cand_2prong::DecayType::JpsiToMuMu); // check if it's a JPsi diff --git a/EventFiltering/PWGHF/HFFilterCharmHadronSignals.cxx b/EventFiltering/PWGHF/HFFilterCharmHadronSignals.cxx index 00876d642be..6ed8498e838 100644 --- a/EventFiltering/PWGHF/HFFilterCharmHadronSignals.cxx +++ b/EventFiltering/PWGHF/HFFilterCharmHadronSignals.cxx @@ -52,11 +52,11 @@ struct HfFilterCharmHadronSignals { // Main struct for HF triggers // parameters for ML application Configurable> pTBinsBDT{"pTBinsBDT", std::vector{hf_cuts_bdt_multiclass::vecBinsPt}, "track pT bin limits for BDT cut"}; - Configurable> thresholdBDTScoreD0ToKPi{"thresholdBDTScoreD0ToKPi", {hf_cuts_bdt_multiclass::cuts[0], hf_cuts_bdt_multiclass::nBinsPt, hf_cuts_bdt_multiclass::nCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for BDT output scores of D0 candidates"}; - Configurable> thresholdBDTScoreDPlusToPiKPi{"thresholdBDTScoreDPlusToPiKPi", {hf_cuts_bdt_multiclass::cuts[0], hf_cuts_bdt_multiclass::nBinsPt, hf_cuts_bdt_multiclass::nCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for BDT output scores of D+ candidates"}; - Configurable> thresholdBDTScoreDSToPiKK{"thresholdBDTScoreDSToPiKK", {hf_cuts_bdt_multiclass::cuts[0], hf_cuts_bdt_multiclass::nBinsPt, hf_cuts_bdt_multiclass::nCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for BDT output scores of Ds+ candidates"}; - Configurable> thresholdBDTScoreLcToPiKP{"thresholdBDTScoreLcToPiKP", {hf_cuts_bdt_multiclass::cuts[0], hf_cuts_bdt_multiclass::nBinsPt, hf_cuts_bdt_multiclass::nCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for BDT output scores of Lc+ candidates"}; - Configurable> thresholdBDTScoreXicToPiKP{"thresholdBDTScoreXicToPiKP", {hf_cuts_bdt_multiclass::cuts[0], hf_cuts_bdt_multiclass::nBinsPt, hf_cuts_bdt_multiclass::nCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for BDT output scores of Xic+ candidates"}; + Configurable> thresholdBDTScoreD0ToKPi{"thresholdBDTScoreD0ToKPi", {hf_cuts_bdt_multiclass::Cuts[0], hf_cuts_bdt_multiclass::NBinsPt, hf_cuts_bdt_multiclass::NCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for BDT output scores of D0 candidates"}; + Configurable> thresholdBDTScoreDPlusToPiKPi{"thresholdBDTScoreDPlusToPiKPi", {hf_cuts_bdt_multiclass::Cuts[0], hf_cuts_bdt_multiclass::NBinsPt, hf_cuts_bdt_multiclass::NCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for BDT output scores of D+ candidates"}; + Configurable> thresholdBDTScoreDSToPiKK{"thresholdBDTScoreDSToPiKK", {hf_cuts_bdt_multiclass::Cuts[0], hf_cuts_bdt_multiclass::NBinsPt, hf_cuts_bdt_multiclass::NCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for BDT output scores of Ds+ candidates"}; + Configurable> thresholdBDTScoreLcToPiKP{"thresholdBDTScoreLcToPiKP", {hf_cuts_bdt_multiclass::Cuts[0], hf_cuts_bdt_multiclass::NBinsPt, hf_cuts_bdt_multiclass::NCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for BDT output scores of Lc+ candidates"}; + Configurable> thresholdBDTScoreXicToPiKP{"thresholdBDTScoreXicToPiKP", {hf_cuts_bdt_multiclass::Cuts[0], hf_cuts_bdt_multiclass::NBinsPt, hf_cuts_bdt_multiclass::NCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for BDT output scores of Xic+ candidates"}; Configurable paramCharmMassShape{"paramCharmMassShape", "2023_pass3", "Parametrisation of charm-hadron mass shape (options: 2023_pass3)"}; Configurable numSigmaDeltaMassCharmHad{"numSigmaDeltaMassCharmHad", 2.5, "Number of sigma for charm-hadron delta mass cut in B and D resonance triggers"}; @@ -66,7 +66,7 @@ struct HfFilterCharmHadronSignals { // Main struct for HF triggers Configurable minDeltaMassDstar{"minDeltaMassDstar", static_cast(cutsCharmReso[0][0]), "minimum invariant-mass delta for D*+ in GeV/c2"}; Configurable maxDeltaMassDstar{"maxDeltaMassDstar", static_cast(cutsCharmReso[1][0]), "maximum invariant-mass delta for D*+ in GeV/c2"}; Configurable> pTBinsTrack{"pTBinsTrack", std::vector{hf_cuts_single_track::vecBinsPtTrack}, "track pT bin limits for DCAXY pT-dependent cut (D* from beauty)"}; - Configurable> cutsTrackBeauty3Prong{"cutsTrackBeauty3Prong", {hf_cuts_single_track::cutsTrack[0], hf_cuts_single_track::nBinsPtTrack, hf_cuts_single_track::nCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for 3-prong beauty candidates"}; + Configurable> cutsTrackBeauty3Prong{"cutsTrackBeauty3Prong", {hf_cuts_single_track::CutsTrack[0], hf_cuts_single_track::NBinsPtTrack, hf_cuts_single_track::NCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for 3-prong beauty candidates"}; // CCDB configuration Service ccdb; diff --git a/EventFiltering/PWGHF/HFFilterHelpers.h b/EventFiltering/PWGHF/HFFilterHelpers.h index c4d97eec439..a44cc11ea17 100644 --- a/EventFiltering/PWGHF/HFFilterHelpers.h +++ b/EventFiltering/PWGHF/HFFilterHelpers.h @@ -365,8 +365,8 @@ static const std::vector labelsColumnsCharmBaryons = {"CharmBarToXi // dummy array static const std::vector labelsEmpty{}; -static constexpr double cutsTrackDummy[o2::analysis::hf_cuts_single_track::nBinsPtTrack][o2::analysis::hf_cuts_single_track::nCutVarsTrack] = {{0., 10.}, {0., 10.}, {0., 10.}, {0., 10.}, {0., 10.}, {0., 10.}}; -o2::framework::LabeledArray cutsSingleTrackDummy{cutsTrackDummy[0], o2::analysis::hf_cuts_single_track::nBinsPtTrack, o2::analysis::hf_cuts_single_track::nCutVarsTrack, o2::analysis::hf_cuts_single_track::labelsPtTrack, o2::analysis::hf_cuts_single_track::labelsCutVarTrack}; +static constexpr double cutsTrackDummy[o2::analysis::hf_cuts_single_track::NBinsPtTrack][o2::analysis::hf_cuts_single_track::NCutVarsTrack] = {{0., 10.}, {0., 10.}, {0., 10.}, {0., 10.}, {0., 10.}, {0., 10.}}; +o2::framework::LabeledArray cutsSingleTrackDummy{cutsTrackDummy[0], o2::analysis::hf_cuts_single_track::NBinsPtTrack, o2::analysis::hf_cuts_single_track::NCutVarsTrack, o2::analysis::hf_cuts_single_track::labelsPtTrack, o2::analysis::hf_cuts_single_track::labelsCutVarTrack}; // manual downscale factors for tests constexpr double defDownscaleFactors[kNtriggersHF][1] = {{1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}}; // one for each trigger diff --git a/PWGHF/ALICE3/TableProducer/candidateSelectorChicToJpsiGamma.cxx b/PWGHF/ALICE3/TableProducer/candidateSelectorChicToJpsiGamma.cxx index fa91b7bd6e5..5160a2ba99c 100644 --- a/PWGHF/ALICE3/TableProducer/candidateSelectorChicToJpsiGamma.cxx +++ b/PWGHF/ALICE3/TableProducer/candidateSelectorChicToJpsiGamma.cxx @@ -48,7 +48,7 @@ struct HfCandidateSelectorChicToJpsiGamma { Configurable nSigmaTofMax{"nSigmaTofMax", 3., "Nsigma cut on TOF only"}; // topological cuts Configurable> binsPt{"binsPt", std::vector{hf_cuts_chic_to_jpsi_gamma::vecBinsPt}, "pT bin limits"}; - Configurable> cuts{"cuts", {hf_cuts_chic_to_jpsi_gamma::cuts[0], hf_cuts_chic_to_jpsi_gamma::nBinsPt, hf_cuts_chic_to_jpsi_gamma::nCutVars, hf_cuts_chic_to_jpsi_gamma::labelsPt, hf_cuts_chic_to_jpsi_gamma::labelsCutVar}, "Jpsi candidate selection per pT bin"}; + Configurable> cuts{"cuts", {hf_cuts_chic_to_jpsi_gamma::Cuts[0], hf_cuts_chic_to_jpsi_gamma::NBinsPt, hf_cuts_chic_to_jpsi_gamma::NCutVars, hf_cuts_chic_to_jpsi_gamma::labelsPt, hf_cuts_chic_to_jpsi_gamma::labelsCutVar}, "Jpsi candidate selection per pT bin"}; HfHelper hfHelper; @@ -97,8 +97,8 @@ struct HfCandidateSelectorChicToJpsiGamma { return false; // CPA check } - if ((std::abs(hfCandChic.impactParameter0()) > cuts->get(pTBin, "d0 Jpsi"))) { // adf: Warning: no cut on photon - return false; // DCA check on daughters + if ((std::abs(hfCandChic.impactParameter0()) > cuts->get(pTBin, "d0 Jpsi"))) { // adf: Warning: no cut on photon + return false; // DCA check on daughters } // add more cuts: d0 product? PCA? diff --git a/PWGHF/ALICE3/TableProducer/candidateSelectorD0Alice3Barrel.cxx b/PWGHF/ALICE3/TableProducer/candidateSelectorD0Alice3Barrel.cxx index 7e34c1a0f0d..705deeeaff2 100644 --- a/PWGHF/ALICE3/TableProducer/candidateSelectorD0Alice3Barrel.cxx +++ b/PWGHF/ALICE3/TableProducer/candidateSelectorD0Alice3Barrel.cxx @@ -68,7 +68,7 @@ struct HfCandidateSelectorD0Alice3Barrel { Configurable nSigmaTofCombinedMax{"nSigmaTofCombinedMax", 5., "Nsigma cut on TOF combined with TPC"}; // topological cuts Configurable> binsPt{"binsPt", std::vector{hf_cuts_d0_to_pi_k::vecBinsPt}, "pT bin limits"}; - Configurable> cuts{"cuts", {hf_cuts_d0_to_pi_k::cuts[0], hf_cuts_d0_to_pi_k::nBinsPt, hf_cuts_d0_to_pi_k::nCutVars, hf_cuts_d0_to_pi_k::labelsPt, hf_cuts_d0_to_pi_k::labelsCutVar}, "D0 candidate selection per pT bin"}; + Configurable> cuts{"cuts", {hf_cuts_d0_to_pi_k::Cuts[0], hf_cuts_d0_to_pi_k::NBinsPt, hf_cuts_d0_to_pi_k::NCutVars, hf_cuts_d0_to_pi_k::labelsPt, hf_cuts_d0_to_pi_k::labelsCutVar}, "D0 candidate selection per pT bin"}; HfHelper hfHelper; diff --git a/PWGHF/ALICE3/TableProducer/candidateSelectorD0Alice3Forward.cxx b/PWGHF/ALICE3/TableProducer/candidateSelectorD0Alice3Forward.cxx index c437a3efcec..a213c3edd04 100644 --- a/PWGHF/ALICE3/TableProducer/candidateSelectorD0Alice3Forward.cxx +++ b/PWGHF/ALICE3/TableProducer/candidateSelectorD0Alice3Forward.cxx @@ -68,7 +68,7 @@ struct HfCandidateSelectorD0Alice3Forward { Configurable nSigmaTofCombinedMax{"nSigmaTofCombinedMax", 5., "Nsigma cut on TOF combined with TPC"}; // topological cuts Configurable> binsPt{"binsPt", std::vector{hf_cuts_d0_to_pi_k::vecBinsPt}, "pT bin limits"}; - Configurable> cuts{"cuts", {hf_cuts_d0_to_pi_k::cuts[0], hf_cuts_d0_to_pi_k::nBinsPt, hf_cuts_d0_to_pi_k::nCutVars, hf_cuts_d0_to_pi_k::labelsPt, hf_cuts_d0_to_pi_k::labelsCutVar}, "D0 candidate selection per pT bin"}; + Configurable> cuts{"cuts", {hf_cuts_d0_to_pi_k::Cuts[0], hf_cuts_d0_to_pi_k::NBinsPt, hf_cuts_d0_to_pi_k::NCutVars, hf_cuts_d0_to_pi_k::labelsPt, hf_cuts_d0_to_pi_k::labelsCutVar}, "D0 candidate selection per pT bin"}; HfHelper hfHelper; diff --git a/PWGHF/ALICE3/TableProducer/candidateSelectorD0ParametrizedPid.cxx b/PWGHF/ALICE3/TableProducer/candidateSelectorD0ParametrizedPid.cxx index a5bada3d957..6a46231b0c2 100644 --- a/PWGHF/ALICE3/TableProducer/candidateSelectorD0ParametrizedPid.cxx +++ b/PWGHF/ALICE3/TableProducer/candidateSelectorD0ParametrizedPid.cxx @@ -68,7 +68,7 @@ struct HfCandidateSelectorD0ParametrizedPid { Configurable nSigmaTofCombinedMax{"nSigmaTofCombinedMax", 5., "Nsigma cut on TOF combined with TPC"}; // topological cuts Configurable> binsPt{"binsPt", std::vector{hf_cuts_d0_to_pi_k::vecBinsPt}, "pT bin limits"}; - Configurable> cuts{"cuts", {hf_cuts_d0_to_pi_k::cuts[0], hf_cuts_d0_to_pi_k::nBinsPt, hf_cuts_d0_to_pi_k::nCutVars, hf_cuts_d0_to_pi_k::labelsPt, hf_cuts_d0_to_pi_k::labelsCutVar}, "D0 candidate selection per pT bin"}; + Configurable> cuts{"cuts", {hf_cuts_d0_to_pi_k::Cuts[0], hf_cuts_d0_to_pi_k::NBinsPt, hf_cuts_d0_to_pi_k::NCutVars, hf_cuts_d0_to_pi_k::labelsPt, hf_cuts_d0_to_pi_k::labelsCutVar}, "D0 candidate selection per pT bin"}; HfHelper hfHelper; diff --git a/PWGHF/ALICE3/TableProducer/candidateSelectorJpsi.cxx b/PWGHF/ALICE3/TableProducer/candidateSelectorJpsi.cxx index e004fe79a41..391aba49da0 100644 --- a/PWGHF/ALICE3/TableProducer/candidateSelectorJpsi.cxx +++ b/PWGHF/ALICE3/TableProducer/candidateSelectorJpsi.cxx @@ -84,7 +84,7 @@ struct HfCandidateSelectorJpsi { Configurable nSigmaRichCombinedTofMax{"nSigmaRichCombinedTofMax", 5., "Nsigma cut on RICH combined with TOF"}; // topological cuts Configurable> binsPt{"binsPt", std::vector{hf_cuts_jpsi_to_e_e::vecBinsPt}, "pT bin limits"}; - Configurable> cuts{"cuts", {hf_cuts_jpsi_to_e_e::cuts[0], hf_cuts_jpsi_to_e_e::nBinsPt, hf_cuts_jpsi_to_e_e::nCutVars, hf_cuts_jpsi_to_e_e::labelsPt, hf_cuts_jpsi_to_e_e::labelsCutVar}, "Jpsi candidate selection per pT bin"}; + Configurable> cuts{"cuts", {hf_cuts_jpsi_to_e_e::Cuts[0], hf_cuts_jpsi_to_e_e::NBinsPt, hf_cuts_jpsi_to_e_e::NCutVars, hf_cuts_jpsi_to_e_e::labelsPt, hf_cuts_jpsi_to_e_e::labelsCutVar}, "Jpsi candidate selection per pT bin"}; HfHelper hfHelper; TrackSelectorEl selectorElectron; diff --git a/PWGHF/ALICE3/TableProducer/candidateSelectorLcAlice3.cxx b/PWGHF/ALICE3/TableProducer/candidateSelectorLcAlice3.cxx index 4a8cfdb7891..c9abeedad39 100644 --- a/PWGHF/ALICE3/TableProducer/candidateSelectorLcAlice3.cxx +++ b/PWGHF/ALICE3/TableProducer/candidateSelectorLcAlice3.cxx @@ -69,7 +69,7 @@ struct HfCandidateSelectorLcAlice3 { // topological cuts Configurable decayLengthXYNormalisedMin{"decayLengthXYNormalisedMin", 3., "Min. normalised decay length"}; Configurable> binsPt{"binsPt", std::vector{hf_cuts_lc_to_p_k_pi::vecBinsPt}, "pT bin limits"}; - Configurable> cuts{"cuts", {hf_cuts_lc_to_p_k_pi::cuts[0], hf_cuts_lc_to_p_k_pi::nBinsPt, hf_cuts_lc_to_p_k_pi::nCutVars, hf_cuts_lc_to_p_k_pi::labelsPt, hf_cuts_lc_to_p_k_pi::labelsCutVar}, "Lc candidate selection per pT bin"}; + Configurable> cuts{"cuts", {hf_cuts_lc_to_p_k_pi::Cuts[0], hf_cuts_lc_to_p_k_pi::NBinsPt, hf_cuts_lc_to_p_k_pi::NCutVars, hf_cuts_lc_to_p_k_pi::labelsPt, hf_cuts_lc_to_p_k_pi::labelsCutVar}, "Lc candidate selection per pT bin"}; HfHelper hfHelper; diff --git a/PWGHF/ALICE3/TableProducer/candidateSelectorLcParametrizedPid.cxx b/PWGHF/ALICE3/TableProducer/candidateSelectorLcParametrizedPid.cxx index 316433d40fe..0a3210a63f6 100644 --- a/PWGHF/ALICE3/TableProducer/candidateSelectorLcParametrizedPid.cxx +++ b/PWGHF/ALICE3/TableProducer/candidateSelectorLcParametrizedPid.cxx @@ -70,7 +70,7 @@ struct HfCandidateSelectorLcParametrizedPid { // topological cuts Configurable decayLengthXYNormalisedMin{"decayLengthXYNormalisedMin", 3., "Normalised decay length"}; Configurable> binsPt{"binsPt", std::vector{hf_cuts_lc_to_p_k_pi::vecBinsPt}, "pT bin limits"}; - Configurable> cuts{"cuts", {hf_cuts_lc_to_p_k_pi::cuts[0], hf_cuts_lc_to_p_k_pi::nBinsPt, hf_cuts_lc_to_p_k_pi::nCutVars, hf_cuts_lc_to_p_k_pi::labelsPt, hf_cuts_lc_to_p_k_pi::labelsCutVar}, "Lc candidate selection per pT bin"}; + Configurable> cuts{"cuts", {hf_cuts_lc_to_p_k_pi::Cuts[0], hf_cuts_lc_to_p_k_pi::NBinsPt, hf_cuts_lc_to_p_k_pi::NCutVars, hf_cuts_lc_to_p_k_pi::labelsPt, hf_cuts_lc_to_p_k_pi::labelsCutVar}, "Lc candidate selection per pT bin"}; HfHelper hfHelper; diff --git a/PWGHF/ALICE3/TableProducer/candidateSelectorXToJpsiPiPi.cxx b/PWGHF/ALICE3/TableProducer/candidateSelectorXToJpsiPiPi.cxx index 0bf44e7df56..bff87d84e70 100644 --- a/PWGHF/ALICE3/TableProducer/candidateSelectorXToJpsiPiPi.cxx +++ b/PWGHF/ALICE3/TableProducer/candidateSelectorXToJpsiPiPi.cxx @@ -49,7 +49,7 @@ struct HfCandidateSelectorXToJpsiPiPi { Configurable nSigmaTofMax{"nSigmaTofMax", 3., "Nsigma cut on TOF only"}; // topological cuts Configurable> binsPt{"binsPt", std::vector{hf_cuts_x_to_jpsi_pi_pi::vecBinsPt}, "pT bin limits"}; - Configurable> cuts{"cuts", {hf_cuts_x_to_jpsi_pi_pi::cuts[0], hf_cuts_x_to_jpsi_pi_pi::nBinsPt, hf_cuts_x_to_jpsi_pi_pi::nCutVars, hf_cuts_x_to_jpsi_pi_pi::labelsPt, hf_cuts_x_to_jpsi_pi_pi::labelsCutVar}, "Jpsi candidate selection per pT bin"}; + Configurable> cuts{"cuts", {hf_cuts_x_to_jpsi_pi_pi::Cuts[0], hf_cuts_x_to_jpsi_pi_pi::NBinsPt, hf_cuts_x_to_jpsi_pi_pi::NCutVars, hf_cuts_x_to_jpsi_pi_pi::labelsPt, hf_cuts_x_to_jpsi_pi_pi::labelsCutVar}, "Jpsi candidate selection per pT bin"}; HfHelper hfHelper; diff --git a/PWGHF/Core/HfMlResponseB0ToDPi.h b/PWGHF/Core/HfMlResponseB0ToDPi.h index 18584ae5258..1e2f82c028f 100644 --- a/PWGHF/Core/HfMlResponseB0ToDPi.h +++ b/PWGHF/Core/HfMlResponseB0ToDPi.h @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file HfMlResponsB0ToDPi.h +/// \file HfMlResponseB0ToDPi.h /// \brief Class to compute the ML response for B0 → D∓ π± analysis selections /// \author Alexandre Bigot , IPHC Strasbourg @@ -26,9 +26,9 @@ // Fill the map of available input features // the key is the feature's name (std::string) // the value is the corresponding value in EnumInputFeatures -#define FILL_MAP_B0(FEATURE) \ - { \ -#FEATURE, static_cast < uint8_t>(InputFeaturesB0ToDPi::FEATURE) \ +#define FILL_MAP_B0(FEATURE) \ + { \ + #FEATURE, static_cast(InputFeaturesB0ToDPi::FEATURE) \ } // Check if the index of mCachedIndices (index associated to a FEATURE) diff --git a/PWGHF/Core/HfMlResponseBsToDsPi.h b/PWGHF/Core/HfMlResponseBsToDsPi.h index 821463e0ec8..111a76b1227 100644 --- a/PWGHF/Core/HfMlResponseBsToDsPi.h +++ b/PWGHF/Core/HfMlResponseBsToDsPi.h @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file HfMlResponsBsToDsPi.h +/// \file HfMlResponseBsToDsPi.h /// \brief Class to compute the ML response for Bs → Ds∓ π± analysis selections /// \author Fabio Catalano , CERN diff --git a/PWGHF/Core/SelectorCuts.h b/PWGHF/Core/SelectorCuts.h index ea5248ec9b0..a3313abe79e 100644 --- a/PWGHF/Core/SelectorCuts.h +++ b/PWGHF/Core/SelectorCuts.h @@ -11,6 +11,8 @@ /// \file SelectorCuts.h /// \brief Default pT bins and cut arrays for heavy-flavour selectors and analysis tasks +/// +/// \author Anton Alkin , CERN #ifndef PWGHF_CORE_SELECTORCUTS_H_ #define PWGHF_CORE_SELECTORCUTS_H_ @@ -25,12 +27,12 @@ namespace o2::analysis namespace hf_cuts_single_track { -static constexpr int nBinsPtTrack = 6; -static constexpr int nCutVarsTrack = 4; +static constexpr int NBinsPtTrack = 6; +static constexpr int NCutVarsTrack = 4; // default values for the pT bin edges (can be used to configure histogram axis) // common for any candidate type (2-prong, 3-prong) // offset by 1 from the bin numbers in cuts array -constexpr double binsPtTrack[nBinsPtTrack + 1] = { +constexpr double BinsPtTrack[NBinsPtTrack + 1] = { 0, 0.5, 1.0, @@ -38,10 +40,10 @@ constexpr double binsPtTrack[nBinsPtTrack + 1] = { 2.0, 3.0, 1000.0}; -auto vecBinsPtTrack = std::vector{binsPtTrack, binsPtTrack + nBinsPtTrack + 1}; +auto vecBinsPtTrack = std::vector{BinsPtTrack, BinsPtTrack + NBinsPtTrack + 1}; // default values for the dca_xy and dca_z cuts of displaced tracks -constexpr double cutsTrack[nBinsPtTrack][nCutVarsTrack] = {{0.0000, 10., 0.0000, 100.}, /* 0 < pt < 0.5 */ +constexpr double CutsTrack[NBinsPtTrack][NCutVarsTrack] = {{0.0000, 10., 0.0000, 100.}, /* 0 < pt < 0.5 */ {0.0000, 10., 0.0000, 100.}, /* 0.5 < pt < 1 */ {0.0000, 10., 0.0000, 100.}, /* 1 < pt < 1.5 */ {0.0000, 10., 0.0000, 100.}, /* 1.5 < pt < 2 */ @@ -49,7 +51,7 @@ constexpr double cutsTrack[nBinsPtTrack][nCutVarsTrack] = {{0.0000, 10., 0.0000, {0.0000, 10., 0.0000, 100.}}; /* 3 < pt < 1000 */ // default values for the dca_xy and dca_z cuts of primary tracks (e.g. D* soft pions) -constexpr double cutsTrackPrimary[nBinsPtTrack][nCutVarsTrack] = {{0.0000, 2., 0.0000, 100.}, /* 0 < pt < 0.5 */ +constexpr double CutsTrackPrimary[NBinsPtTrack][NCutVarsTrack] = {{0.0000, 2., 0.0000, 100.}, /* 0 < pt < 0.5 */ {0.0000, 2., 0.0000, 100.}, /* 0.5 < pt < 1 */ {0.0000, 2., 0.0000, 100.}, /* 1 < pt < 1.5 */ {0.0000, 2., 0.0000, 100.}, /* 1.5 < pt < 2 */ @@ -66,7 +68,7 @@ static const std::vector labelsCutVarTrack = {"min_dcaxytoprimary", namespace hf_presel_pid { // default values for the PID cuts for protons in the track-index-skim-creator -constexpr float cutsPid[4][6] = {{0.f, 1000.f, 5.f, 0.f, 1000.f, 5.f}, +constexpr float CutsPid[4][6] = {{0.f, 1000.f, 5.f, 0.f, 1000.f, 5.f}, {0.f, 1000.f, 5.f, 0.f, 1000.f, 5.f}, {0.f, 1000.f, 5.f, 0.f, 1000.f, 5.f}, {0.f, 1000.f, 5.f, 0.f, 1000.f, 5.f}}; @@ -76,18 +78,18 @@ static const std::vector labelsRowsPid = {"ProtonInLcToPKPi", "Prot namespace hf_cuts_bdt_multiclass { -static constexpr int nBinsPt = 1; -static constexpr int nCutBdtScores = 3; +static constexpr int NBinsPt = 1; +static constexpr int NCutBdtScores = 3; // default values for the pT bin edges (can be used to configure histogram axis) // common for any charm candidate // offset by 1 from the bin numbers in cuts array -constexpr double binsPt[nBinsPt + 1] = { +constexpr double BinsPt[NBinsPt + 1] = { 0., 1000.0}; -auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // default values for the cuts -constexpr double cuts[nBinsPt][nCutBdtScores] = {{0.1, 0.5, 0.5}}; +constexpr double Cuts[NBinsPt][NCutBdtScores] = {{0.1, 0.5, 0.5}}; // row labels static const std::vector labelsPt{}; @@ -115,10 +117,10 @@ enum CutDirection { CutNot // do not cut on score }; -static constexpr int nBinsPt = 12; -static constexpr int nCutScores = 3; +static constexpr int NBinsPt = 12; +static constexpr int NCutScores = 3; // default values for the pT bin edges, offset by 1 from the bin numbers in cuts array -constexpr double binsPt[nBinsPt + 1] = { +constexpr double BinsPt[NBinsPt + 1] = { 0., 1., 2., @@ -132,18 +134,18 @@ constexpr double binsPt[nBinsPt + 1] = { 16., 24., 50.}; -auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // default values for the ML model paths, one model per pT bin static const std::vector modelPaths = { ""}; // default values for the cut directions -constexpr int cutDir[nCutScores] = {CutGreater, CutSmaller, CutSmaller}; -auto vecCutDir = std::vector{cutDir, cutDir + nCutScores}; +constexpr int CutDir[NCutScores] = {CutGreater, CutSmaller, CutSmaller}; +auto vecCutDir = std::vector{CutDir, CutDir + NCutScores}; // default values for the cuts -constexpr double cuts[nBinsPt][nCutScores] = { +constexpr double Cuts[NBinsPt][NCutScores] = { {0.5, 0.5, 0.5}, {0.5, 0.5, 0.5}, {0.5, 0.5, 0.5}, @@ -179,19 +181,19 @@ static const std::vector labelsDmesCutScore = {"ML score charm bkg" namespace hf_cuts_presel_2prong { -static constexpr int nBinsPt = 2; -static constexpr int nCutVars = 4; +static constexpr int NBinsPt = 2; +static constexpr int NCutVars = 4; // default values for the pT bin edges (can be used to configure histogram axis) // common for any 2-prong candidate // offset by 1 from the bin numbers in cuts array -constexpr double binsPt[nBinsPt + 1] = { +constexpr double BinsPt[NBinsPt + 1] = { 1., 5., 1000.0}; -auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // default values for the cuts -constexpr double cuts[nBinsPt][nCutVars] = {{1.65, 2.15, 0.5, 100.}, /* 1 < pt < 5 */ +constexpr double Cuts[NBinsPt][NCutVars] = {{1.65, 2.15, 0.5, 100.}, /* 1 < pt < 5 */ {1.65, 2.15, 0.5, 100.}}; /* 5 < pt < 1000 */ // row labels @@ -203,19 +205,19 @@ static const std::vector labelsCutVar = {"massMin", "massMax", "cos namespace hf_cuts_presel_3prong { -static constexpr int nBinsPt = 2; -static constexpr int nCutVars = 4; +static constexpr int NBinsPt = 2; +static constexpr int NCutVars = 4; // default values for the pT bin edges (can be used to configure histogram axis) // common for any 3-prong candidate // offset by 1 from the bin numbers in cuts array -constexpr double binsPt[nBinsPt + 1] = { +constexpr double BinsPt[NBinsPt + 1] = { 1., 5., 1000.0}; -auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // default values for the cuts -constexpr double cuts[nBinsPt][nCutVars] = {{1.75, 2.05, 0.7, 0.02}, /* 1 < pt < 5 */ +constexpr double Cuts[NBinsPt][NCutVars] = {{1.75, 2.05, 0.7, 0.02}, /* 1 < pt < 5 */ {1.75, 2.05, 0.5, 0.02}}; /* 5 < pt < 1000 */ // row labels @@ -227,18 +229,18 @@ static const std::vector labelsCutVar = {"massMin", "massMax", "cos namespace hf_cuts_presel_ds { -static constexpr int nBinsPt = 2; -static constexpr int nCutVars = 5; +static constexpr int NBinsPt = 2; +static constexpr int NCutVars = 5; // default values for the pT bin edges (can be used to configure histogram axis) // offset by 1 from the bin numbers in cuts array -constexpr double binsPt[nBinsPt + 1] = { +constexpr double BinsPt[NBinsPt + 1] = { 1., 5., 1000.0}; -auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // default values for the cuts -constexpr double cuts[nBinsPt][nCutVars] = {{1.70, 2.15, 0.7, 0.02, 0.02}, /* 1 < pt < 5 */ +constexpr double Cuts[NBinsPt][NCutVars] = {{1.70, 2.15, 0.7, 0.02, 0.02}, /* 1 < pt < 5 */ {1.70, 2.15, 0.5, 0.02, 0.02}}; /* 5 < pt < 1000 */ // row labels @@ -250,18 +252,18 @@ static const std::vector labelsCutVar = {"massMin", "massMax", "cos namespace hf_cuts_presel_dstar { -static constexpr int nBinsPt = 2; -static constexpr int nCutVars = 2; +static constexpr int NBinsPt = 2; +static constexpr int NCutVars = 2; // default values for the pT bin edges (can be used to configure histogram axis) // offset by 1 from the bin numbers in cuts array -constexpr double binsPt[nBinsPt + 1] = { +constexpr double BinsPt[NBinsPt + 1] = { 1., 5., 1000.0}; -auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // default values for the cuts -constexpr double cuts[nBinsPt][nCutVars] = {{0.17, 0.05}, /* 1 < pt < 5 */ +constexpr double Cuts[NBinsPt][NCutVars] = {{0.17, 0.05}, /* 1 < pt < 5 */ {0.17, 0.08}}; /* 5 < pt < 1000 */ // row labels @@ -273,11 +275,11 @@ static const std::vector labelsCutVar = {"deltaMassMax", "deltaMass namespace hf_cuts_d0_to_pi_k { -static constexpr int nBinsPt = 25; -static constexpr int nCutVars = 15; +static constexpr int NBinsPt = 25; +static constexpr int NCutVars = 15; // default values for the pT bin edges (can be used to configure histogram axis) // offset by 1 from the bin numbers in cuts array -constexpr double binsPt[nBinsPt + 1] = { +constexpr double BinsPt[NBinsPt + 1] = { 0, 0.5, 1.0, @@ -304,10 +306,10 @@ constexpr double binsPt[nBinsPt + 1] = { 36.0, 50.0, 100.0}; -auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // default values for the cuts -constexpr double cuts[nBinsPt][nCutVars] = {{0.400, 350. * 1E-4, 0.8, 0.5, 0.5, 1000. * 1E-4, 1000. * 1E-4, -5000. * 1E-8, 0.80, 0., 0., 10., 10., 0.06, 0.5}, /* 0 < pT < 0.5 */ +constexpr double Cuts[NBinsPt][NCutVars] = {{0.400, 350. * 1E-4, 0.8, 0.5, 0.5, 1000. * 1E-4, 1000. * 1E-4, -5000. * 1E-8, 0.80, 0., 0., 10., 10., 0.06, 0.5}, /* 0 < pT < 0.5 */ {0.400, 350. * 1E-4, 0.8, 0.5, 0.5, 1000. * 1E-4, 1000. * 1E-4, -5000. * 1E-8, 0.80, 0., 0., 10., 10., 0.06, 0.5}, /* 0.5 < pT < 1 */ {0.400, 300. * 1E-4, 0.8, 0.4, 0.4, 1000. * 1E-4, 1000. * 1E-4, -25000. * 1E-8, 0.80, 0., 0., 10., 10., 0.06, 0.5}, /* 1 < pT < 1.5 */ {0.400, 300. * 1E-4, 0.8, 0.4, 0.4, 1000. * 1E-4, 1000. * 1E-4, -25000. * 1E-8, 0.80, 0., 0., 10., 10., 0.06, 0.5}, /* 1.5 < pT < 2 */ @@ -367,11 +369,11 @@ static const std::vector labelsCutVar = {"m", "DCA", "cos theta*", namespace hf_cuts_dstar_to_d0_pi { -static constexpr int nBinsPt = 25; -static constexpr int nCutVars = 8; +static constexpr int NBinsPt = 25; +static constexpr int NCutVars = 8; // default values for the pT bin edges (can be used to configure histogram axis) // offset by 1 from the bin numbers in cuts array -constexpr double binsPt[nBinsPt + 1] = { +constexpr double BinsPt[NBinsPt + 1] = { 0., 0.5, 1.0, @@ -398,7 +400,7 @@ constexpr double binsPt[nBinsPt + 1] = { 36.0, 50.0, 100.0}; -auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // row labels static const std::vector labelsPt = { @@ -432,7 +434,7 @@ static const std::vector labelsPt = { static const std::vector labelsCutVar = {"ptSoftPiMin", "ptSoftPiMax", "d0SoftPi", "d0SoftPiNormalised", "deltaMInvDstar", "chi2PCA", "d0Prong0Normalised", "d0Prong1Normalised"}; // default values for the cuts -constexpr double cuts[nBinsPt][nCutVars] = {{0.05, 0.2, 0.1, 1000.0, 0.2, 300.0, 0.0, 0.0}, +constexpr double Cuts[NBinsPt][NCutVars] = {{0.05, 0.2, 0.1, 1000.0, 0.2, 300.0, 0.0, 0.0}, {0.05, 0.2, 0.1, 1000.0, 0.2, 300.0, 0.0, 0.0}, {0.05, 0.3, 0.1, 1000.0, 0.2, 300.0, 0.0, 0.0}, {0.05, 0.3, 0.1, 1000.0, 0.2, 300.0, 0.0, 0.0}, @@ -461,11 +463,11 @@ constexpr double cuts[nBinsPt][nCutVars] = {{0.05, 0.2, 0.1, 1000.0, 0.2, 300.0, namespace hf_cuts_lc_to_p_k_pi { -static constexpr int nBinsPt = 10; -static constexpr int nCutVars = 11; +static constexpr int NBinsPt = 10; +static constexpr int NCutVars = 11; // default values for the pT bin edges (can be used to configure histogram axis) // offset by 1 from the bin numbers in cuts array -constexpr double binsPt[nBinsPt + 1] = { +constexpr double BinsPt[NBinsPt + 1] = { 0., 1., 2., @@ -477,10 +479,10 @@ constexpr double binsPt[nBinsPt + 1] = { 12., 24., 36.}; -auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // default values for the cuts m, ptP, ptK, ptPi, chi2PCA, dL, cosp, dLXY, NdLXY, ImpParXY, mass(Kpi) -constexpr double cuts[nBinsPt][nCutVars] = {{0.4, 0.4, 0.4, 0.4, 0., 0.005, 0., 0., 0., 1e+10, -1.}, /* 0 < pT < 1 */ +constexpr double Cuts[NBinsPt][NCutVars] = {{0.4, 0.4, 0.4, 0.4, 0., 0.005, 0., 0., 0., 1e+10, -1.}, /* 0 < pT < 1 */ {0.4, 0.4, 0.4, 0.4, 0., 0.005, 0., 0., 0., 1e+10, -1.}, /* 1 < pT < 2 */ {0.4, 0.4, 0.4, 0.4, 0., 0.005, 0., 0., 0., 1e+10, -1.}, /* 2 < pT < 3 */ {0.4, 0.4, 0.4, 0.4, 0., 0.005, 0., 0., 0., 1e+10, -1.}, /* 3 < pT < 4 */ @@ -510,11 +512,11 @@ static const std::vector labelsCutVar = {"m", "pT p", "pT K", "pT P namespace hf_cuts_lc_to_k0s_p { -static constexpr int nBinsPt = 8; -static constexpr int nCutVars = 8; +static constexpr int NBinsPt = 8; +static constexpr int NCutVars = 8; // default values for the pT bin edges (can be used to configure histogram axis) // offset by 1 from the bin numbers in cuts array -constexpr double binsPt[nBinsPt + 1] = { +constexpr double BinsPt[NBinsPt + 1] = { 1., 2., 3., @@ -524,11 +526,11 @@ constexpr double binsPt[nBinsPt + 1] = { 8., 12., 24.}; -auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // default values for the cuts // mK0s(GeV) mLambdas(GeV) mGammas(GeV) ptp ptK0sdau ptK0s d0p d0K0 -constexpr double cuts[nBinsPt][nCutVars] = {{0.008, 0.005, 0.1, 0.5, 0.3, 0.6, 0.05, 999999.}, // 1 < pt < 2 +constexpr double Cuts[NBinsPt][NCutVars] = {{0.008, 0.005, 0.1, 0.5, 0.3, 0.6, 0.05, 999999.}, // 1 < pt < 2 {0.008, 0.005, 0.1, 0.5, 0.4, 1.3, 0.05, 999999.}, // 2 < pt < 3 {0.009, 0.005, 0.1, 0.6, 0.4, 1.3, 0.05, 999999.}, // 3 < pt < 4 {0.011, 0.005, 0.1, 0.6, 0.4, 1.4, 0.05, 999999.}, // 4 < pt < 5 @@ -554,11 +556,11 @@ static const std::vector labelsCutVar = {"mK0s", "mLambda", "mGamma namespace hf_cuts_dplus_to_pi_k_pi { -static const int nBinsPt = 12; -static const int nCutVars = 8; +static constexpr int NBinsPt = 12; +static constexpr int NCutVars = 8; // default values for the pT bin edges (can be used to configure histogram axis) // offset by 1 from the bin numbers in cuts array -constexpr double binsPt[nBinsPt + 1] = { +constexpr double BinsPt[NBinsPt + 1] = { 1., 2., 3., @@ -572,11 +574,11 @@ constexpr double binsPt[nBinsPt + 1] = { 16., 24., 36.}; -auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // default values for the cuts // selections from pp at 5 TeV 2017 analysis https://alice-notes.web.cern.ch/node/808 -constexpr double cuts[nBinsPt][nCutVars] = {{0.2, 0.3, 0.3, 0.07, 6., 0.96, 0.985, 2.5}, /* 1 < pT < 2 */ +constexpr double Cuts[NBinsPt][NCutVars] = {{0.2, 0.3, 0.3, 0.07, 6., 0.96, 0.985, 2.5}, /* 1 < pT < 2 */ {0.2, 0.3, 0.3, 0.07, 5., 0.96, 0.985, 2.5}, /* 2 < pT < 3 */ {0.2, 0.3, 0.3, 0.10, 5., 0.96, 0.980, 2.5}, /* 3 < pT < 4 */ {0.2, 0.3, 0.3, 0.10, 5., 0.96, 0.000, 2.5}, /* 4 < pT < 5 */ @@ -610,10 +612,10 @@ static const std::vector labelsCutVar = {"deltaM", "pT Pi", "pT K", namespace hf_cuts_ds_to_k_k_pi { -static const int nBinsPt = 8; -static const int nCutVars = 11; +static constexpr int NBinsPt = 8; +static constexpr int NCutVars = 11; // momentary cuts -constexpr double binsPt[nBinsPt + 1] = { +constexpr double BinsPt[NBinsPt + 1] = { 2., 3., 4., @@ -623,11 +625,11 @@ constexpr double binsPt[nBinsPt + 1] = { 12., 16., 24.}; -auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // default values for the cuts // selections from pp at 5 TeV 2017 analysis https://alice-notes.web.cern.ch/node/808 -constexpr double cuts[nBinsPt][nCutVars] = {{0.2, 0.3, 0.3, 0.02, 4., 0.92, 0.92, 0.014, 0.010, 0.10, 5}, /* 2 < pT < 3 */ +constexpr double Cuts[NBinsPt][NCutVars] = {{0.2, 0.3, 0.3, 0.02, 4., 0.92, 0.92, 0.014, 0.010, 0.10, 5}, /* 2 < pT < 3 */ {0.2, 0.3, 0.3, 0.02, 4., 0.92, 0.92, 0.014, 0.010, 0.10, 5}, /* 3 < pT < 4 */ {0.2, 0.3, 0.3, 0.03, 4., 0.90, 0.90, 0.012, 0.010, 0.05, 5}, /* 4 < pT < 5 */ {0.2, 0.3, 0.3, 0.03, 4., 0.90, 0.90, 0.012, 0.010, 0.05, 5}, /* 5 < pT < 6 */ @@ -653,11 +655,11 @@ static const std::vector labelsCutVar = {"deltaM", "pT Pi", "pT K", namespace hf_cuts_omegac_to_omega_pi { -static constexpr int nBinsPt = 4; -static constexpr int nCutVars = 1; +static constexpr int NBinsPt = 4; +static constexpr int NCutVars = 1; // default values for the pT bin edges (can be used to configure histogram axis) // offset by 1 from the bin numbers in cuts array -constexpr double binsPt[nBinsPt + 1] = { +constexpr double BinsPt[NBinsPt + 1] = { 1.0, 2.0, @@ -665,11 +667,11 @@ constexpr double binsPt[nBinsPt + 1] = { 6.0, 12.0}; -auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // default values for the cuts // pi_pT -constexpr double cuts[nBinsPt][nCutVars] = {{0.2}, /* 1 < pt < 2 */ +constexpr double Cuts[NBinsPt][NCutVars] = {{0.2}, /* 1 < pt < 2 */ {0.2}, /* 2 < pt < 4 */ {0.6}, /* 4 < pt < 6 */ {0.8}}; /* 6 < pt < 12 */ @@ -687,11 +689,11 @@ static const std::vector labelsCutVar = {"pT pi from Omegac"}; namespace hf_cuts_xic_to_p_k_pi { -static const int nBinsPt = 10; -static const int nCutVars = 11; +static constexpr int NBinsPt = 10; +static constexpr int NCutVars = 11; // default values for the pT bin edges (can be used to configure histogram axis) // offset by 1 from the bin numbers in cuts array -constexpr double binsPt[nBinsPt + 1] = { +constexpr double BinsPt[NBinsPt + 1] = { 0., 1., 2., @@ -703,10 +705,10 @@ constexpr double binsPt[nBinsPt + 1] = { 12., 24., 36.}; -auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // default values for the cuts m ptP ptK ptPi chi2PCA dL cosp, dLXY, NdL, ct, ImpParXY -constexpr double cuts[nBinsPt][nCutVars] = {{0.400, 0.4, 0.4, 0.4, 1e-5, 0.005, 0.8, 0.005, 4., 2., 0.}, /* 0 < pT < 1 */ +constexpr double Cuts[NBinsPt][NCutVars] = {{0.400, 0.4, 0.4, 0.4, 1e-5, 0.005, 0.8, 0.005, 4., 2., 0.}, /* 0 < pT < 1 */ {0.400, 0.4, 0.4, 0.4, 1e-5, 0.005, 0.8, 0.005, 4., 2., 0.}, /* 1 < pT < 2 */ {0.400, 0.4, 0.4, 0.4, 1e-5, 0.005, 0.8, 0.005, 4., 2., 0.}, /* 2 < pT < 3 */ {0.400, 0.4, 0.4, 0.4, 1e-5, 0.005, 0.8, 0.005, 4., 2., 0.}, /* 3 < pT < 4 */ @@ -736,11 +738,11 @@ static const std::vector labelsCutVar = {"m", "pT p", "pT K", "pT P namespace hf_cuts_xic_to_xi_pi_pi { -static const int nBinsPt = 10; -static const int nCutVars = 12; +static constexpr int NBinsPt = 10; +static constexpr int NCutVars = 12; // default values for the pT bin edges (can be used to configure histogram axis) // offset by 1 from the bin numbers in cuts array -constexpr double binsPt[nBinsPt + 1] = { +constexpr double BinsPt[NBinsPt + 1] = { 0., 1., 2., @@ -752,10 +754,10 @@ constexpr double binsPt[nBinsPt + 1] = { 12., 24., 36.}; -auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // default values for the cuts m ptXi ptPi0 ptPi1 chi2PCA dL dLXY cosp cospXY impParXY Xi Pi0 Pi1 -constexpr double cuts[nBinsPt][nCutVars] = {{0.4, 0.4, 0.4, 0.4, 1e-5, 0.5, 0.5, 0.9, 0.9, 0.1, 0.1, 0.1}, /* 0 < pT < 1 */ +constexpr double Cuts[NBinsPt][NCutVars] = {{0.4, 0.4, 0.4, 0.4, 1e-5, 0.5, 0.5, 0.9, 0.9, 0.1, 0.1, 0.1}, /* 0 < pT < 1 */ {0.4, 0.4, 0.4, 0.4, 1e-5, 0.5, 0.5, 0.9, 0.9, 0.1, 0.1, 0.1}, /* 1 < pT < 2 */ {0.4, 0.4, 0.4, 0.4, 1e-5, 0.5, 0.5, 0.9, 0.9, 0.1, 0.1, 0.1}, /* 2 < pT < 3 */ {0.4, 0.4, 0.4, 0.4, 1e-5, 0.5, 0.5, 0.9, 0.9, 0.1, 0.1, 0.1}, /* 3 < pT < 4 */ @@ -785,11 +787,11 @@ static const std::vector labelsCutVar = {"m", "pT Xi", "pT Pi0", "p namespace hf_cuts_xicc_to_p_k_pi_pi { -static const int nBinsPt = 10; -static const int nCutVars = 14; +static constexpr int NBinsPt = 10; +static constexpr int NCutVars = 14; // default values for the pT bin edges (can be used to configure histogram axis) // offset by 1 from the bin numbers in cuts array -constexpr double binsPt[nBinsPt + 1] = { +constexpr double BinsPt[NBinsPt + 1] = { 0., 1., 2., @@ -801,10 +803,10 @@ constexpr double binsPt[nBinsPt + 1] = { 12., 24., 36.}; -auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // default values for the cuts -constexpr double cuts[nBinsPt][nCutVars] = {{0.400, 0.5, 0.2, 1.e-3, 10.0, 1.e-3, 10.0, 9999., 1.e-3, 0.0, 50.0, 50.0, 0.8, 0.8}, /* 0 < pT < 1 */ +constexpr double Cuts[NBinsPt][NCutVars] = {{0.400, 0.5, 0.2, 1.e-3, 10.0, 1.e-3, 10.0, 9999., 1.e-3, 0.0, 50.0, 50.0, 0.8, 0.8}, /* 0 < pT < 1 */ {0.400, 0.5, 0.2, 1.e-3, 10.0, 1.e-3, 10.0, 9999., 1.e-3, 0.0, 50.0, 50.0, 0.8, 0.8}, /* 1 < pT < 2 */ {0.400, 0.5, 0.2, 1.e-3, 10.0, 1.e-3, 10.0, 9999., 1.e-3, 0.0, 50.0, 50.0, 0.8, 0.8}, /* 2 < pT < 3 */ {0.400, 0.5, 0.2, 1.e-3, 10.0, 1.e-3, 10.0, 9999., 1.e-3, 0.0, 50.0, 50.0, 0.8, 0.8}, /* 3 < pT < 4 */ @@ -834,11 +836,11 @@ static const std::vector labelsCutVar = {"m", "pT Xic", "pT Pi", "m namespace hf_cuts_jpsi_to_e_e { -static constexpr int nBinsPt = 9; -static constexpr int nCutVars = 5; +static constexpr int NBinsPt = 9; +static constexpr int NCutVars = 5; // default values for the pT bin edges (can be used to configure histogram axis) // offset by 1 from the bin numbers in cuts array -constexpr double binsPt[nBinsPt + 1] = { +constexpr double BinsPt[NBinsPt + 1] = { 0, 0.5, 1.0, @@ -850,10 +852,10 @@ constexpr double binsPt[nBinsPt + 1] = { 10.0, 15.0, }; -auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // default values for the cuts -constexpr double cuts[nBinsPt][nCutVars] = {{0.5, 0.2, 0.4, 1, 1.}, /* 0 < pT < 0.5 */ +constexpr double Cuts[NBinsPt][NCutVars] = {{0.5, 0.2, 0.4, 1, 1.}, /* 0 < pT < 0.5 */ {0.5, 0.2, 0.4, 1, 1.}, /* 0.5 < pT < 1 */ {0.5, 0.2, 0.4, 1, 1.}, /* 1 < pT < 2 */ {0.5, 0.2, 0.4, 1, 1.}, /* 2 < pT < 3 */ @@ -881,11 +883,11 @@ static const std::vector labelsCutVar = {"m", "DCA_xy", "DCA_z", "p namespace hf_cuts_b0_to_d_pi { -static constexpr int nBinsPt = 12; -static constexpr int nCutVars = 12; +static constexpr int NBinsPt = 12; +static constexpr int NCutVars = 12; // default values for the pT bin edges (can be used to configure histogram axis) // offset by 1 from the bin numbers in cuts array -constexpr double binsPt[nBinsPt + 1] = { +constexpr double BinsPt[NBinsPt + 1] = { 0, 0.5, 1.0, @@ -900,11 +902,11 @@ constexpr double binsPt[nBinsPt + 1] = { 20.0, 24.0}; -auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // default values for the cuts // DeltaM CPA chi2PCA d0D d0Pi pTD pTPi B0DecayLength B0DecayLengthXY IPProd DeltaMD CthetaStr -constexpr double cuts[nBinsPt][nCutVars] = {{1., 0.8, 1., 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.8}, /* 0 < pt < 0.5 */ +constexpr double Cuts[NBinsPt][NCutVars] = {{1., 0.8, 1., 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.8}, /* 0 < pt < 0.5 */ {1., 0.8, 1., 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.8}, /* 0.5 < pt < 1 */ {1., 0.8, 1., 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.8}, /* 1 < pt < 2 */ {1., 0.8, 1., 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.8}, /* 2 < pt < 3 */ @@ -937,11 +939,11 @@ static const std::vector labelsCutVar = {"m", "CPA", "Chi2PCA", "d0 namespace hf_cuts_bs_to_ds_pi { -static constexpr int nBinsPt = 10; -static constexpr int nCutVars = 10; +static constexpr int NBinsPt = 10; +static constexpr int NCutVars = 10; // default values for the pT bin edges (can be used to configure histogram axis) // offset by 1 from the bin numbers in cuts array -constexpr double binsPt[nBinsPt + 1] = { +constexpr double BinsPt[NBinsPt + 1] = { 0, 1.0, 2.0, @@ -954,11 +956,11 @@ constexpr double binsPt[nBinsPt + 1] = { 16.0, 24.0}; -auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // default values for the cuts // DeltaM CPA chi2PCA d0Ds d0Pi pTDs pTPi BsDecayLength BsDecayLengthXY IPProd -constexpr double cuts[nBinsPt][nCutVars] = {{1., 0.8, 1., 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0.}, /* 0 < pt < 1 */ +constexpr double Cuts[NBinsPt][NCutVars] = {{1., 0.8, 1., 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0.}, /* 0 < pt < 1 */ {1., 0.8, 1., 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0.}, /* 1 < pt < 2 */ {1., 0.8, 1., 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0.}, /* 2 < pt < 3 */ {1., 0.8, 1., 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0.}, /* 3 < pt < 4 */ @@ -988,11 +990,11 @@ static const std::vector labelsCutVar = {"m", "CPA", "Chi2PCA", "d0 namespace hf_cuts_bplus_to_d0_pi { -static constexpr int nBinsPt = 12; -static constexpr int nCutVars = 11; +static constexpr int NBinsPt = 12; +static constexpr int NCutVars = 11; // default values for the pT bin edges (can be used to configure histogram axis) // offset by 1 from the bin numbers in cuts array -constexpr double binsPt[nBinsPt + 1] = { +constexpr double BinsPt[NBinsPt + 1] = { 0, 0.5, 1.0, @@ -1007,11 +1009,11 @@ constexpr double binsPt[nBinsPt + 1] = { 20.0, 24.0}; -auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // default values for the cuts // DeltaM CPA d0D0 d0Pi pTD0 pTPi BDecayLength BDecayLengthXY IPProd DeltaMD0 CthetaStr -constexpr double cuts[nBinsPt][nCutVars] = {{1., 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.8}, /* 0 < pt < 0.5 */ +constexpr double Cuts[NBinsPt][NCutVars] = {{1., 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.8}, /* 0 < pt < 0.5 */ {1., 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.8}, /* 0.5 < pt < 1 */ {1., 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.8}, /* 1 < pt < 2 */ {1., 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.8}, /* 2 < pt < 3 */ @@ -1044,11 +1046,11 @@ static const std::vector labelsCutVar = {"m", "CPA", "d0 D0", "d0 P namespace hf_cuts_lb_to_lc_pi { -static constexpr int nBinsPt = 12; -static constexpr int nCutVars = 12; +static constexpr int NBinsPt = 12; +static constexpr int NCutVars = 12; // default values for the pT bin edges (can be used to configure histogram axis) // offset by 1 from the bin numbers in cuts array -constexpr double binsPt[nBinsPt + 1] = { +constexpr double BinsPt[NBinsPt + 1] = { 0, 0.5, 1.0, @@ -1063,11 +1065,11 @@ constexpr double binsPt[nBinsPt + 1] = { 20.0, 24.0}; -auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // default values for the cuts // DeltaM CPA chi2PCA d0Lc d0Pi pTLc pTPi LbDecayLength LbDecayLengthXY IPProd DeltaMLc CthetaStr -constexpr double cuts[nBinsPt][nCutVars] = {{1., 0.8, 1., 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.8}, /* 0 < pt < 0.5 */ +constexpr double Cuts[NBinsPt][NCutVars] = {{1., 0.8, 1., 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.8}, /* 0 < pt < 0.5 */ {1., 0.8, 1., 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.8}, /* 0.5 < pt < 1 */ {1., 0.8, 1., 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.8}, /* 1 < pt < 2 */ {1., 0.8, 1., 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.8}, /* 2 < pt < 3 */ @@ -1100,11 +1102,11 @@ static const std::vector labelsCutVar = {"m", "CPA", "Chi2PCA", "d0 namespace hf_cuts_x_to_jpsi_pi_pi { -static constexpr int nBinsPt = 9; -static constexpr int nCutVars = 7; +static constexpr int NBinsPt = 9; +static constexpr int NCutVars = 7; // default values for the pT bin edges (can be used to configure histogram axis) // offset by 1 from the bin numbers in cuts array -constexpr double binsPt[nBinsPt + 1] = { +constexpr double BinsPt[NBinsPt + 1] = { 0, 0.5, 1.0, @@ -1116,11 +1118,11 @@ constexpr double binsPt[nBinsPt + 1] = { 10.0, 15.0, }; -auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // default values for the cuts // m CPA d0Jpsi d0Pi pTJpsi pTPi chi2PCA -constexpr double cuts[nBinsPt][nCutVars] = {{0.5, 0.80, 0.001, 0.001, 3.0, 0.15, 1.}, /* 0 labelsCutVar = {"m", "CPA", "d0 Jpsi", "d0 namespace hf_cuts_chic_to_jpsi_gamma { // dummy selections for chic --> TO BE IMPLEMENTED -static constexpr int nBinsPt = 9; -static constexpr int nCutVars = 7; +static constexpr int NBinsPt = 9; +static constexpr int NCutVars = 7; // default values for the pT bin edges (can be used to configure histogram axis) // offset by 1 from the bin numbers in cuts array -constexpr double binsPt[nBinsPt + 1] = { +constexpr double BinsPt[NBinsPt + 1] = { 0, 0.5, 1.0, @@ -1163,11 +1165,11 @@ constexpr double binsPt[nBinsPt + 1] = { 10.0, 15.0, }; -auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // default values for the cuts // m CPA d0Jpsi d0gamma pTJpsi pTgamma chi2PCA -constexpr double cuts[nBinsPt][nCutVars] = {{3.0, -1., 0.001, 0.001, 0.5, 0.15, 1.}, /* 0 labelsCutVar = {"m", "CPA", "d0 Jpsi", "d0 namespace hf_cuts_sigmac_to_p_k_pi { -static constexpr int nBinsPt = 10; -static constexpr int nCutVars = 2; +static constexpr int NBinsPt = 10; +static constexpr int NCutVars = 2; // default values for the pT bin edges (can be used to configure histogram axis) // offset by 1 from the bin numbers in cuts array -constexpr double binsPt[nBinsPt + 1] = { +constexpr double BinsPt[NBinsPt + 1] = { 0., 1., 2., @@ -1209,10 +1211,10 @@ constexpr double binsPt[nBinsPt + 1] = { 12., 24., 36.}; -auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // default values for the cuts -constexpr double cuts[nBinsPt][nCutVars] = {{0.03, 0.03}, /* 0 < pT < 1 */ +constexpr double Cuts[NBinsPt][NCutVars] = {{0.03, 0.03}, /* 0 < pT < 1 */ {0.03, 0.03}, /* 1 < pT < 2 */ {0.03, 0.03}, /* 2 < pT < 3 */ {0.03, 0.03}, /* 3 < pT < 4 */ diff --git a/PWGHF/D2H/Core/SelectorCutsRedDataFormat.h b/PWGHF/D2H/Core/SelectorCutsRedDataFormat.h index daa642f1601..039de3834df 100644 --- a/PWGHF/D2H/Core/SelectorCutsRedDataFormat.h +++ b/PWGHF/D2H/Core/SelectorCutsRedDataFormat.h @@ -26,9 +26,9 @@ namespace o2::analysis { namespace hf_cuts_d_daughter { -static constexpr int nBinsPt = 7; -static constexpr int nCutVars = 6; -constexpr double binsPt[nBinsPt + 1] = { +static constexpr int NBinsPt = 7; +static constexpr int NCutVars = 6; +constexpr double BinsPt[NBinsPt + 1] = { 1., 2., 4., @@ -37,9 +37,9 @@ constexpr double binsPt[nBinsPt + 1] = { 12., 24., 1000.}; -auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // default values for the cuts -constexpr double cuts[nBinsPt][nCutVars] = {{1.84, 1.89, 1.77, 1.81, 1.92, 1.96}, /* 1 < pt < 2 */ +constexpr double Cuts[NBinsPt][NCutVars] = {{1.84, 1.89, 1.77, 1.81, 1.92, 1.96}, /* 1 < pt < 2 */ {1.84, 1.89, 1.77, 1.81, 1.92, 1.96}, /* 2 < pt < 4 */ {1.84, 1.89, 1.77, 1.81, 1.92, 1.96}, /* 4 < pt < 6 */ {1.84, 1.89, 1.77, 1.81, 1.92, 1.96}, /* 6 < pt < 8 */ @@ -62,9 +62,9 @@ static const std::vector labelsCutVar = {"invMassSignalLow", "invMa // namespace with v0 selections for reduced charmed-resonances analysis namespace hf_cuts_v0_daughter { -static constexpr int nBinsPt = 7; -static constexpr int nCutVars = 5; -constexpr double binsPt[nBinsPt + 1] = { +static constexpr int NBinsPt = 7; +static constexpr int NCutVars = 5; +constexpr double BinsPt[NBinsPt + 1] = { 0., 1., 2., @@ -73,9 +73,9 @@ constexpr double binsPt[nBinsPt + 1] = { 12., 24., 1000.}; -auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // default values for the cuts -constexpr double cuts[nBinsPt][nCutVars] = {{0.48, 0.52, 0.99, 1., 0.9}, /* 1 < pt < 2 */ +constexpr double Cuts[NBinsPt][NCutVars] = {{0.48, 0.52, 0.99, 1., 0.9}, /* 1 < pt < 2 */ {0.48, 0.52, 0.99, 1., 0.9}, /* 2 < pt < 4 */ {0.48, 0.52, 0.99, 1., 0.9}, /* 4 < pt < 6 */ {0.48, 0.52, 0.99, 1., 0.9}, /* 6 < pt < 8 */ diff --git a/PWGHF/D2H/DataModel/ReducedDataModel.h b/PWGHF/D2H/DataModel/ReducedDataModel.h index 0c8218d1a07..0c467c1cf56 100644 --- a/PWGHF/D2H/DataModel/ReducedDataModel.h +++ b/PWGHF/D2H/DataModel/ReducedDataModel.h @@ -11,8 +11,7 @@ /// \file ReducedDataModel.h /// \brief Header file with definition of methods and tables -// used to fold (unfold) track and primary vertex information by writing (reading) AO2Ds -/// \note +/// \note used to fold (unfold) track and primary vertex information by writing (reading) AO2Ds /// /// \author Alexandre Bigot , IPHC Strasbourg /// \author Antonio Palasciano , Università degli Studi di Bari & INFN, Bari @@ -182,36 +181,36 @@ DECLARE_SOA_DYNAMIC_COLUMN(EtaProng2, etaProng2, //! namespace hf_track_pid_reduced { -DECLARE_SOA_COLUMN(TPCNSigmaPiProng0, tpcNSigmaPiProng0, float); //! NsigmaTPCPi for prong0 -DECLARE_SOA_COLUMN(TPCNSigmaPiProng1, tpcNSigmaPiProng1, float); //! NsigmaTPCPi for prong1 -DECLARE_SOA_COLUMN(TPCNSigmaPiProng2, tpcNSigmaPiProng2, float); //! NsigmaTPCPi for prong2 -DECLARE_SOA_COLUMN(TPCNSigmaKaProng0, tpcNSigmaKaProng0, float); //! NsigmaTPCKa for prong0 -DECLARE_SOA_COLUMN(TPCNSigmaKaProng1, tpcNSigmaKaProng1, float); //! NsigmaTPCKa for prong1 -DECLARE_SOA_COLUMN(TPCNSigmaKaProng2, tpcNSigmaKaProng2, float); //! NsigmaTPCKa for prong2 -DECLARE_SOA_COLUMN(TOFNSigmaPiProng0, tofNSigmaPiProng0, float); //! NsigmaTOFPi for prong0 -DECLARE_SOA_COLUMN(TOFNSigmaPiProng1, tofNSigmaPiProng1, float); //! NsigmaTOFPi for prong1 -DECLARE_SOA_COLUMN(TOFNSigmaPiProng2, tofNSigmaPiProng2, float); //! NsigmaTOFPi for prong2 -DECLARE_SOA_COLUMN(TOFNSigmaKaProng0, tofNSigmaKaProng0, float); //! NsigmaTOFKa for prong0 -DECLARE_SOA_COLUMN(TOFNSigmaKaProng1, tofNSigmaKaProng1, float); //! NsigmaTOFKa for prong1 -DECLARE_SOA_COLUMN(TOFNSigmaKaProng2, tofNSigmaKaProng2, float); //! NsigmaTOFKa for prong2 +DECLARE_SOA_COLUMN(TPCNSigmaPiProng0, tpcNSigmaPiProng0, float); //! NsigmaTPCPi for prong0, o2-linter: disable=name/o2-column (written to disk) +DECLARE_SOA_COLUMN(TPCNSigmaPiProng1, tpcNSigmaPiProng1, float); //! NsigmaTPCPi for prong1, o2-linter: disable=name/o2-column (written to disk) +DECLARE_SOA_COLUMN(TPCNSigmaPiProng2, tpcNSigmaPiProng2, float); //! NsigmaTPCPi for prong2, o2-linter: disable=name/o2-column (written to disk) +DECLARE_SOA_COLUMN(TPCNSigmaKaProng0, tpcNSigmaKaProng0, float); //! NsigmaTPCKa for prong0, o2-linter: disable=name/o2-column (written to disk) +DECLARE_SOA_COLUMN(TPCNSigmaKaProng1, tpcNSigmaKaProng1, float); //! NsigmaTPCKa for prong1, o2-linter: disable=name/o2-column (written to disk) +DECLARE_SOA_COLUMN(TPCNSigmaKaProng2, tpcNSigmaKaProng2, float); //! NsigmaTPCKa for prong2, o2-linter: disable=name/o2-column (written to disk) +DECLARE_SOA_COLUMN(TOFNSigmaPiProng0, tofNSigmaPiProng0, float); //! NsigmaTOFPi for prong0, o2-linter: disable=name/o2-column (written to disk) +DECLARE_SOA_COLUMN(TOFNSigmaPiProng1, tofNSigmaPiProng1, float); //! NsigmaTOFPi for prong1, o2-linter: disable=name/o2-column (written to disk) +DECLARE_SOA_COLUMN(TOFNSigmaPiProng2, tofNSigmaPiProng2, float); //! NsigmaTOFPi for prong2, o2-linter: disable=name/o2-column (written to disk) +DECLARE_SOA_COLUMN(TOFNSigmaKaProng0, tofNSigmaKaProng0, float); //! NsigmaTOFKa for prong0, o2-linter: disable=name/o2-column (written to disk) +DECLARE_SOA_COLUMN(TOFNSigmaKaProng1, tofNSigmaKaProng1, float); //! NsigmaTOFKa for prong1, o2-linter: disable=name/o2-column (written to disk) +DECLARE_SOA_COLUMN(TOFNSigmaKaProng2, tofNSigmaKaProng2, float); //! NsigmaTOFKa for prong2, o2-linter: disable=name/o2-column (written to disk) // dynamic columns -DECLARE_SOA_DYNAMIC_COLUMN(TPCTOFNSigmaPi, tpcTofNSigmaPi, //! Combination of NsigmaTPC and NsigmaTOF +DECLARE_SOA_DYNAMIC_COLUMN(TPCTOFNSigmaPi, tpcTofNSigmaPi, //! Combination of NsigmaTPC and NsigmaTOF, o2-linter: disable=name/o2-column (written to disk) [](float tpcNSigmaPi, float tofNSigmaPi) -> float { return pid_tpc_tof_utils::combineNSigma(tpcNSigmaPi, tofNSigmaPi); }); -DECLARE_SOA_DYNAMIC_COLUMN(TPCTOFNSigmaKa, tpcTofNSigmaKa, //! Combination of NsigmaTPC and NsigmaTOF +DECLARE_SOA_DYNAMIC_COLUMN(TPCTOFNSigmaKa, tpcTofNSigmaKa, //! Combination of NsigmaTPC and NsigmaTOF, o2-linter: disable=name/o2-column (written to disk) [](float tpcNSigmaPi, float tofNSigmaPi) -> float { return pid_tpc_tof_utils::combineNSigma(tpcNSigmaPi, tofNSigmaPi); }); -DECLARE_SOA_DYNAMIC_COLUMN(TPCTOFNSigmaPr, tpcTofNSigmaPr, //! Combination of NsigmaTPC and NsigmaTOF +DECLARE_SOA_DYNAMIC_COLUMN(TPCTOFNSigmaPr, tpcTofNSigmaPr, //! Combination of NsigmaTPC and NsigmaTOF, o2-linter: disable=name/o2-column (written to disk) [](float tpcNSigmaPi, float tofNSigmaPi) -> float { return pid_tpc_tof_utils::combineNSigma(tpcNSigmaPi, tofNSigmaPi); }); -DECLARE_SOA_DYNAMIC_COLUMN(TPCTOFNSigmaPiProng0, tpcTofNSigmaPiProng0, //! Combination of NsigmaTPC and NsigmaTOF +DECLARE_SOA_DYNAMIC_COLUMN(TPCTOFNSigmaPiProng0, tpcTofNSigmaPiProng0, //! Combination of NsigmaTPC and NsigmaTOF, o2-linter: disable=name/o2-column (written to disk) [](float tpcNSigmaPi, float tofNSigmaPi) -> float { return pid_tpc_tof_utils::combineNSigma(tpcNSigmaPi, tofNSigmaPi); }); -DECLARE_SOA_DYNAMIC_COLUMN(TPCTOFNSigmaPiProng1, tpcTofNSigmaPiProng1, //! Combination of NsigmaTPC and NsigmaTOF +DECLARE_SOA_DYNAMIC_COLUMN(TPCTOFNSigmaPiProng1, tpcTofNSigmaPiProng1, //! Combination of NsigmaTPC and NsigmaTOF, o2-linter: disable=name/o2-column (written to disk) [](float tpcNSigmaPi, float tofNSigmaPi) -> float { return pid_tpc_tof_utils::combineNSigma(tpcNSigmaPi, tofNSigmaPi); }); -DECLARE_SOA_DYNAMIC_COLUMN(TPCTOFNSigmaPiProng2, tpcTofNSigmaPiProng2, //! Combination of NsigmaTPC and NsigmaTOF +DECLARE_SOA_DYNAMIC_COLUMN(TPCTOFNSigmaPiProng2, tpcTofNSigmaPiProng2, //! Combination of NsigmaTPC and NsigmaTOF, o2-linter: disable=name/o2-column (written to disk) [](float tpcNSigmaPi, float tofNSigmaPi) -> float { return pid_tpc_tof_utils::combineNSigma(tpcNSigmaPi, tofNSigmaPi); }); -DECLARE_SOA_DYNAMIC_COLUMN(TPCTOFNSigmaKaProng0, tpcTofNSigmaKaProng0, //! Combination of NsigmaTPC and NsigmaTOF +DECLARE_SOA_DYNAMIC_COLUMN(TPCTOFNSigmaKaProng0, tpcTofNSigmaKaProng0, //! Combination of NsigmaTPC and NsigmaTOF, o2-linter: disable=name/o2-column (written to disk) [](float tpcNSigmaKa, float tofNSigmaKa) -> float { return pid_tpc_tof_utils::combineNSigma(tpcNSigmaKa, tofNSigmaKa); }); -DECLARE_SOA_DYNAMIC_COLUMN(TPCTOFNSigmaKaProng1, tpcTofNSigmaKaProng1, //! Combination of NsigmaTPC and NsigmaTOF +DECLARE_SOA_DYNAMIC_COLUMN(TPCTOFNSigmaKaProng1, tpcTofNSigmaKaProng1, //! Combination of NsigmaTPC and NsigmaTOF, o2-linter: disable=name/o2-column (written to disk) [](float tpcNSigmaKa, float tofNSigmaKa) -> float { return pid_tpc_tof_utils::combineNSigma(tpcNSigmaKa, tofNSigmaKa); }); -DECLARE_SOA_DYNAMIC_COLUMN(TPCTOFNSigmaKaProng2, tpcTofNSigmaKaProng2, //! Combination of NsigmaTPC and NsigmaTOF +DECLARE_SOA_DYNAMIC_COLUMN(TPCTOFNSigmaKaProng2, tpcTofNSigmaKaProng2, //! Combination of NsigmaTPC and NsigmaTOF, o2-linter: disable=name/o2-column (written to disk) [](float tpcNSigmaKa, float tofNSigmaKa) -> float { return pid_tpc_tof_utils::combineNSigma(tpcNSigmaKa, tofNSigmaKa); }); } // namespace hf_track_pid_reduced @@ -802,10 +801,10 @@ DECLARE_SOA_TABLE(HfRed3PrNoTrks, "AOD", "HFRED3PRNOTRK", //! Table with 3 prong namespace hf_reso_cand_reduced { -DECLARE_SOA_COLUMN(InvMass, invMass, float); //! Invariant mass in GeV/c2 -DECLARE_SOA_COLUMN(InvMassProng0, invMassProng0, float); //! Invariant Mass of D daughter in GeV/c -DECLARE_SOA_COLUMN(InvMassProng1, invMassProng1, float); //! Invariant Mass of V0 daughter in GeV/c -DECLARE_SOA_COLUMN(InvMassD0, invMassD0, float); //! Invariant Mass of potential D0 daughter +DECLARE_SOA_COLUMN(InvMass, invMass, float); //! Invariant mass in GeV/c2 +DECLARE_SOA_COLUMN(InvMassProng0, invMassProng0, float); //! Invariant Mass of D daughter in GeV/c +DECLARE_SOA_COLUMN(InvMassProng1, invMassProng1, float); //! Invariant Mass of V0 daughter in GeV/c +DECLARE_SOA_COLUMN(InvMassD0, invMassD0, float); //! Invariant Mass of potential D0 daughter DECLARE_SOA_COLUMN(MlScoreBkgProng0, mlScoreBkgProng0, float); //! Bkg ML score of the D daughter DECLARE_SOA_COLUMN(MlScorePromptProng0, mlScorePromptProng0, float); //! Prompt ML score of the D daughter diff --git a/PWGHF/D2H/TableProducer/candidateCreatorCharmResoReduced.cxx b/PWGHF/D2H/TableProducer/candidateCreatorCharmResoReduced.cxx index 062fb658128..8b83e3bf349 100644 --- a/PWGHF/D2H/TableProducer/candidateCreatorCharmResoReduced.cxx +++ b/PWGHF/D2H/TableProducer/candidateCreatorCharmResoReduced.cxx @@ -96,9 +96,9 @@ struct HfCandidateCreatorCharmResoReduced { Configurable activateQA{"activateQA", false, "Flag to enable QA histogram"}; Configurable> binsPt{"binsPt", std::vector{vecBinsPt}, "Histogram pT bin limits"}; // Daughters selection cuts - Configurable> cutsD{"cutsDdaughter", {hf_cuts_d_daughter::cuts[0], hf_cuts_d_daughter::nBinsPt, hf_cuts_d_daughter::nCutVars, hf_cuts_d_daughter::labelsPt, hf_cuts_d_daughter::labelsCutVar}, "D daughter selections"}; + Configurable> cutsD{"cutsDdaughter", {hf_cuts_d_daughter::Cuts[0], hf_cuts_d_daughter::NBinsPt, hf_cuts_d_daughter::NCutVars, hf_cuts_d_daughter::labelsPt, hf_cuts_d_daughter::labelsCutVar}, "D daughter selections"}; Configurable> binsPtD{"binsPtD", std::vector{hf_cuts_d_daughter::vecBinsPt}, "pT bin limits for D daughter cuts"}; - Configurable> cutsV0{"cutsV0daughter", {hf_cuts_v0_daughter::cuts[0], hf_cuts_v0_daughter::nBinsPt, hf_cuts_v0_daughter::nCutVars, hf_cuts_v0_daughter::labelsPt, hf_cuts_v0_daughter::labelsCutVar}, "V0 daughter selections"}; + Configurable> cutsV0{"cutsV0daughter", {hf_cuts_v0_daughter::Cuts[0], hf_cuts_v0_daughter::NBinsPt, hf_cuts_v0_daughter::NCutVars, hf_cuts_v0_daughter::labelsPt, hf_cuts_v0_daughter::labelsCutVar}, "V0 daughter selections"}; Configurable> binsPtV0{"binsPtV0", std::vector{hf_cuts_v0_daughter::vecBinsPt}, "pT bin limits for V0 daughter cuts"}; // Configurables for ME diff --git a/PWGHF/D2H/TableProducer/candidateSelectorB0ToDPiReduced.cxx b/PWGHF/D2H/TableProducer/candidateSelectorB0ToDPiReduced.cxx index c5ed599c244..2ad0f29869a 100644 --- a/PWGHF/D2H/TableProducer/candidateSelectorB0ToDPiReduced.cxx +++ b/PWGHF/D2H/TableProducer/candidateSelectorB0ToDPiReduced.cxx @@ -56,18 +56,18 @@ struct HfCandidateSelectorB0ToDPiReduced { Configurable nSigmaTofCombinedMax{"nSigmaTofCombinedMax", 5., "Nsigma cut on TOF combined with TPC"}; // topological cuts Configurable> binsPt{"binsPt", std::vector{hf_cuts_b0_to_d_pi::vecBinsPt}, "pT bin limits"}; - Configurable> cuts{"cuts", {hf_cuts_b0_to_d_pi::cuts[0], hf_cuts_b0_to_d_pi::nBinsPt, hf_cuts_b0_to_d_pi::nCutVars, hf_cuts_b0_to_d_pi::labelsPt, hf_cuts_b0_to_d_pi::labelsCutVar}, "B0 candidate selection per pT bin"}; + Configurable> cuts{"cuts", {hf_cuts_b0_to_d_pi::Cuts[0], hf_cuts_b0_to_d_pi::NBinsPt, hf_cuts_b0_to_d_pi::NCutVars, hf_cuts_b0_to_d_pi::labelsPt, hf_cuts_b0_to_d_pi::labelsCutVar}, "B0 candidate selection per pT bin"}; // D-meson ML cuts Configurable> binsPtDmesMl{"binsPtDmesMl", std::vector{hf_cuts_ml::vecBinsPt}, "D-meson pT bin limits for ML cuts"}; - Configurable> cutsDmesMl{"cutsDmesMl", {hf_cuts_ml::cuts[0], hf_cuts_ml::nBinsPt, hf_cuts_ml::nCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsDmesCutScore}, "D-meson ML cuts per pT bin"}; + Configurable> cutsDmesMl{"cutsDmesMl", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsDmesCutScore}, "D-meson ML cuts per pT bin"}; // QA switch Configurable activateQA{"activateQA", false, "Flag to enable QA histogram"}; // B0 ML inference Configurable applyB0Ml{"applyB0Ml", false, "Flag to apply ML selections"}; Configurable> binsPtB0Ml{"binsPtB0Ml", std::vector{hf_cuts_ml::vecBinsPt}, "pT bin limits for ML application"}; Configurable> cutDirB0Ml{"cutDirB0Ml", std::vector{hf_cuts_ml::vecCutDir}, "Whether to reject score values greater or smaller than the threshold"}; - Configurable> cutsB0Ml{"cutsB0Ml", {hf_cuts_ml::cuts[0], hf_cuts_ml::nBinsPt, hf_cuts_ml::nCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; - Configurable nClassesB0Ml{"nClassesB0Ml", static_cast(hf_cuts_ml::nCutScores), "Number of classes in ML model"}; + Configurable> cutsB0Ml{"cutsB0Ml", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; + Configurable nClassesB0Ml{"nClassesB0Ml", static_cast(hf_cuts_ml::NCutScores), "Number of classes in ML model"}; Configurable> namesInputFeatures{"namesInputFeatures", std::vector{"feature1", "feature2"}, "Names of ML model input features"}; // CCDB configuration Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; diff --git a/PWGHF/D2H/TableProducer/candidateSelectorBplusToD0PiReduced.cxx b/PWGHF/D2H/TableProducer/candidateSelectorBplusToD0PiReduced.cxx index 60649b57fdd..09a9c39c933 100644 --- a/PWGHF/D2H/TableProducer/candidateSelectorBplusToD0PiReduced.cxx +++ b/PWGHF/D2H/TableProducer/candidateSelectorBplusToD0PiReduced.cxx @@ -55,18 +55,18 @@ struct HfCandidateSelectorBplusToD0PiReduced { Configurable nSigmaTofCombinedMax{"nSigmaTofCombinedMax", 5., "Nsigma cut on TOF combined with TPC"}; // topological cuts Configurable> binsPt{"binsPt", std::vector{hf_cuts_bplus_to_d0_pi::vecBinsPt}, "pT bin limits"}; - Configurable> cuts{"cuts", {hf_cuts_bplus_to_d0_pi::cuts[0], hf_cuts_bplus_to_d0_pi::nBinsPt, hf_cuts_bplus_to_d0_pi::nCutVars, hf_cuts_bplus_to_d0_pi::labelsPt, hf_cuts_bplus_to_d0_pi::labelsCutVar}, "B+ candidate selection per pT bin"}; + Configurable> cuts{"cuts", {hf_cuts_bplus_to_d0_pi::Cuts[0], hf_cuts_bplus_to_d0_pi::NBinsPt, hf_cuts_bplus_to_d0_pi::NCutVars, hf_cuts_bplus_to_d0_pi::labelsPt, hf_cuts_bplus_to_d0_pi::labelsCutVar}, "B+ candidate selection per pT bin"}; // D0-meson ML cuts Configurable> binsPtDmesMl{"binsPtDmesMl", std::vector{hf_cuts_ml::vecBinsPt}, "D0-meson pT bin limits for ML cuts"}; - Configurable> cutsDmesMl{"cutsDmesMl", {hf_cuts_ml::cuts[0], hf_cuts_ml::nBinsPt, hf_cuts_ml::nCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsDmesCutScore}, "D0-meson ML cuts per pT bin"}; + Configurable> cutsDmesMl{"cutsDmesMl", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsDmesCutScore}, "D0-meson ML cuts per pT bin"}; // QA switch Configurable activateQA{"activateQA", false, "Flag to enable QA histogram"}; // B+ ML inference Configurable applyBplusMl{"applyBplusMl", false, "Flag to apply ML selections"}; Configurable> binsPtBpMl{"binsPtBpMl", std::vector{hf_cuts_ml::vecBinsPt}, "pT bin limits for ML application"}; Configurable> cutDirBpMl{"cutDirBpMl", std::vector{hf_cuts_ml::vecCutDir}, "Whether to reject score values greater or smaller than the threshold"}; - Configurable> cutsBpMl{"cutsBpMl", {hf_cuts_ml::cuts[0], hf_cuts_ml::nBinsPt, hf_cuts_ml::nCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; - Configurable nClassesBpMl{"nClassesBpMl", static_cast(hf_cuts_ml::nCutScores), "Number of classes in ML model"}; + Configurable> cutsBpMl{"cutsBpMl", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; + Configurable nClassesBpMl{"nClassesBpMl", static_cast(hf_cuts_ml::NCutScores), "Number of classes in ML model"}; Configurable> namesInputFeatures{"namesInputFeatures", std::vector{"feature1", "feature2"}, "Names of ML model input features"}; // CCDB configuration Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; diff --git a/PWGHF/D2H/TableProducer/candidateSelectorBsToDsPiReduced.cxx b/PWGHF/D2H/TableProducer/candidateSelectorBsToDsPiReduced.cxx index 9a6c47fce58..3e970cc347b 100644 --- a/PWGHF/D2H/TableProducer/candidateSelectorBsToDsPiReduced.cxx +++ b/PWGHF/D2H/TableProducer/candidateSelectorBsToDsPiReduced.cxx @@ -55,18 +55,18 @@ struct HfCandidateSelectorBsToDsPiReduced { Configurable nSigmaTofCombinedMax{"nSigmaTofCombinedMax", 5., "Nsigma cut on TOF combined with TPC"}; // topological cuts Configurable> binsPt{"binsPt", std::vector{hf_cuts_bs_to_ds_pi::vecBinsPt}, "pT bin limits"}; - Configurable> cuts{"cuts", {hf_cuts_bs_to_ds_pi::cuts[0], hf_cuts_bs_to_ds_pi::nBinsPt, hf_cuts_bs_to_ds_pi::nCutVars, hf_cuts_bs_to_ds_pi::labelsPt, hf_cuts_bs_to_ds_pi::labelsCutVar}, "Bs candidate selection per pT bin"}; + Configurable> cuts{"cuts", {hf_cuts_bs_to_ds_pi::Cuts[0], hf_cuts_bs_to_ds_pi::NBinsPt, hf_cuts_bs_to_ds_pi::NCutVars, hf_cuts_bs_to_ds_pi::labelsPt, hf_cuts_bs_to_ds_pi::labelsCutVar}, "Bs candidate selection per pT bin"}; // D-meson ML cuts Configurable> binsPtDmesMl{"binsPtDmesMl", std::vector{hf_cuts_ml::vecBinsPt}, "D-meson pT bin limits for ML cuts"}; - Configurable> cutsDmesMl{"cutsDmesMl", {hf_cuts_ml::cuts[0], hf_cuts_ml::nBinsPt, hf_cuts_ml::nCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsDmesCutScore}, "D-meson ML cuts per pT bin"}; + Configurable> cutsDmesMl{"cutsDmesMl", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsDmesCutScore}, "D-meson ML cuts per pT bin"}; // QA switch Configurable activateQA{"activateQA", false, "Flag to enable QA histogram"}; // B0 ML inference Configurable applyBsMl{"applyBsMl", false, "Flag to apply ML selections"}; Configurable> binsPtBsMl{"binsPtBsMl", std::vector{hf_cuts_ml::vecBinsPt}, "pT bin limits for ML application"}; Configurable> cutDirBsMl{"cutDirBsMl", std::vector{hf_cuts_ml::vecCutDir}, "Whether to reject score values greater or smaller than the threshold"}; - Configurable> cutsBsMl{"cutsBsMl", {hf_cuts_ml::cuts[0], hf_cuts_ml::nBinsPt, hf_cuts_ml::nCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; - Configurable nClassesBsMl{"nClassesBsMl", static_cast(hf_cuts_ml::nCutScores), "Number of classes in ML model"}; + Configurable> cutsBsMl{"cutsBsMl", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; + Configurable nClassesBsMl{"nClassesBsMl", static_cast(hf_cuts_ml::NCutScores), "Number of classes in ML model"}; Configurable> namesInputFeatures{"namesInputFeatures", std::vector{"feature1", "feature2"}, "Names of ML model input features"}; // CCDB configuration Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; diff --git a/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx b/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx index 1c1bea74eb2..a79e2fe2193 100644 --- a/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx +++ b/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx @@ -121,7 +121,7 @@ struct HfDataCreatorCharmHadPiReduced { Configurable usePionIsGlobalTrackWoDCA{"usePionIsGlobalTrackWoDCA", true, "check isGlobalTrackWoDCA status for pions, for Run3 studies"}; Configurable ptPionMin{"ptPionMin", 0.5, "minimum pion pT threshold (GeV/c)"}; Configurable> binsPtPion{"binsPtPion", std::vector{hf_cuts_single_track::vecBinsPtTrack}, "track pT bin limits for pion DCA XY pT-dependent cut"}; - Configurable> cutsTrackPionDCA{"cutsTrackPionDCA", {hf_cuts_single_track::cutsTrack[0], hf_cuts_single_track::nBinsPtTrack, hf_cuts_single_track::nCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for pions"}; + Configurable> cutsTrackPionDCA{"cutsTrackPionDCA", {hf_cuts_single_track::CutsTrack[0], hf_cuts_single_track::NBinsPtTrack, hf_cuts_single_track::NCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for pions"}; Configurable invMassWindowCharmHadPi{"invMassWindowCharmHadPi", 0.3, "invariant-mass window for CharmHad-Pi pair preselections (GeV/c2)"}; Configurable selectionFlagDplus{"selectionFlagDplus", 7, "Selection Flag for D+"}; Configurable selectionFlagDs{"selectionFlagDs", 7, "Selection Flag for Ds"}; @@ -958,8 +958,8 @@ struct HfDataCreatorCharmHadPiReduced { fillMcRecoInfo(collision, particlesMc, beautyHadDauTracks, indexHfCandCharm, selectedTracksPion, indexCollisionMaxNumContrib); } fillHfCandCharm = true; - } // pion loop - if (fillHfCandCharm) { // fill candCplus table only once per D candidate + } // pion loop + if (fillHfCandCharm) { // fill candCplus table only once per D candidate if constexpr (decChannel == DecayChannel::B0ToDminusPi || decChannel == DecayChannel::BsToDsminusPi) { // D∓ → π∓ K± π∓ and Ds∓ → K∓ K± π∓ hfCand3Prong(charmHadDauTracks[0].globalIndex(), charmHadDauTracks[1].globalIndex(), charmHadDauTracks[2].globalIndex(), indexHfReducedCollision, diff --git a/PWGHF/DataModel/CandidateReconstructionTables.h b/PWGHF/DataModel/CandidateReconstructionTables.h index 4688148d5b8..3650fd4ece0 100644 --- a/PWGHF/DataModel/CandidateReconstructionTables.h +++ b/PWGHF/DataModel/CandidateReconstructionTables.h @@ -245,7 +245,7 @@ DECLARE_SOA_INDEX_COLUMN_FULL(Prong1, prong1, int, Tracks, "_1"); //! Index to s DECLARE_SOA_INDEX_COLUMN_FULL(Prong2, prong2, int, Tracks, "_2"); //! Index to third prong DECLARE_SOA_INDEX_COLUMN(V0, v0); //! Index to V0 prong DECLARE_SOA_INDEX_COLUMN(Cascade, cascade); //! Index to cascade prong -DECLARE_SOA_COLUMN(HFflag, hfflag, uint8_t); //! +DECLARE_SOA_COLUMN(HFflag, hfflag, uint8_t); //! Bitmap to store selection results, o2-linter: disable=name/o2-column (written to disk) DECLARE_SOA_COLUMN(FlagD0ToKPi, flagD0ToKPi, uint8_t); //! DECLARE_SOA_COLUMN(FlagJpsiToEE, flagJpsiToEE, uint8_t); //! @@ -573,9 +573,9 @@ DECLARE_SOA_DYNAMIC_COLUMN(DecayLengthXYNormalised, decayLengthXYNormalised, //! [](float xVtxP, float yVtxP, float xVtxS, float yVtxS, float err) -> float { return RecoDecay::distanceXY(std::array{xVtxP, yVtxP}, std::array{xVtxS, yVtxS}) / err; }); DECLARE_SOA_COLUMN(ErrorDecayLength, errorDecayLength, float); //! DECLARE_SOA_COLUMN(ErrorDecayLengthXY, errorDecayLengthXY, float); //! -DECLARE_SOA_DYNAMIC_COLUMN(CPA, cpa, //! +DECLARE_SOA_DYNAMIC_COLUMN(Cpa, cpa, //! [](float xVtxP, float yVtxP, float zVtxP, float xVtxS, float yVtxS, float zVtxS, float px, float py, float pz) -> float { return RecoDecay::cpa(std::array{xVtxP, yVtxP, zVtxP}, std::array{xVtxS, yVtxS, zVtxS}, std::array{px, py, pz}); }); -DECLARE_SOA_DYNAMIC_COLUMN(CPAXY, cpaXY, //! +DECLARE_SOA_DYNAMIC_COLUMN(CpaXY, cpaXY, //! [](float xVtxP, float yVtxP, float xVtxS, float yVtxS, float px, float py) -> float { return RecoDecay::cpaXY(std::array{xVtxP, yVtxP}, std::array{xVtxS, yVtxS}, std::array{px, py}); }); DECLARE_SOA_DYNAMIC_COLUMN(Ct, ct, //! [](float xVtxP, float yVtxP, float zVtxP, float xVtxS, float yVtxS, float zVtxS, float px, float py, float pz, double m) -> float { return RecoDecay::ct(std::array{px, py, pz}, RecoDecay::distance(std::array{xVtxP, yVtxP, zVtxP}, std::array{xVtxS, yVtxS, zVtxS}), m); }); @@ -680,8 +680,8 @@ DECLARE_SOA_TABLE(HfCand2ProngBase, "AOD", "HFCAND2PBASE", //! hf_cand::P, hf_cand::P2, hf_cand::PVector, - hf_cand::CPA, - hf_cand::CPAXY, + hf_cand::Cpa, + hf_cand::CpaXY, hf_cand::Ct, hf_cand::ImpactParameterXY, hf_cand_2prong::MaxNormalisedDeltaIP, @@ -766,9 +766,9 @@ DECLARE_SOA_COLUMN(FlagMcMatchRec, flagMcMatchRec, int8_t); //! reconstruction l DECLARE_SOA_COLUMN(FlagMcMatchGen, flagMcMatchGen, int8_t); //! generator level DECLARE_SOA_COLUMN(OriginMcRec, originMcRec, int8_t); //! particle origin, reconstruction level DECLARE_SOA_COLUMN(OriginMcGen, originMcGen, int8_t); //! particle origin, generator level -DECLARE_SOA_COLUMN(V0X, v0x, float); //! X position of V0 decay -DECLARE_SOA_COLUMN(V0Y, v0y, float); //! Y position of V0 decay -DECLARE_SOA_COLUMN(V0Z, v0z, float); //! Z position of V0 decay +DECLARE_SOA_COLUMN(V0X, v0X, float); //! X position of V0 decay +DECLARE_SOA_COLUMN(V0Y, v0Y, float); //! Y position of V0 decay +DECLARE_SOA_COLUMN(V0Z, v0Z, float); //! Z position of V0 decay } // namespace hf_cand_casc DECLARE_SOA_TABLE(HfCandCascBase, "AOD", "HFCANDCASCBASE", //! @@ -801,8 +801,8 @@ DECLARE_SOA_TABLE(HfCandCascBase, "AOD", "HFCANDCASCBASE", //! hf_cand::P, hf_cand::P2, hf_cand::PVector, - hf_cand::CPA, - hf_cand::CPAXY, + hf_cand::Cpa, + hf_cand::CpaXY, hf_cand::Ct, hf_cand::ImpactParameterXY, hf_cand_2prong::MaxNormalisedDeltaIP, @@ -886,8 +886,8 @@ DECLARE_SOA_TABLE(HfCandBplusBase, "AOD", "HFCANDBPLUSBASE", hf_cand::P, hf_cand::P2, hf_cand::PVector, - hf_cand::CPA, - hf_cand::CPAXY, + hf_cand::Cpa, + hf_cand::CpaXY, hf_cand::Ct, hf_cand::ImpactParameterXY, hf_cand_2prong::MaxNormalisedDeltaIP, @@ -1026,8 +1026,8 @@ DECLARE_SOA_TABLE(HfCand3ProngBase, "AOD", "HFCAND3PBASE", //! hf_cand::P, hf_cand::P2, hf_cand::PVector, - hf_cand::CPA, - hf_cand::CPAXY, + hf_cand::Cpa, + hf_cand::CpaXY, hf_cand::Ct, hf_cand::ImpactParameterXY, hf_cand_3prong::MaxNormalisedDeltaIP, @@ -1128,8 +1128,8 @@ DECLARE_SOA_TABLE(HfCandXBase, "AOD", "HFCANDXBASE", hf_cand::P, hf_cand::P2, hf_cand::PVector, - hf_cand::CPA, - hf_cand::CPAXY, + hf_cand::Cpa, + hf_cand::CpaXY, hf_cand::Ct, hf_cand::ImpactParameterXY, hf_cand_3prong::MaxNormalisedDeltaIP, @@ -1192,8 +1192,8 @@ DECLARE_SOA_TABLE(HfCandXiccBase, "AOD", "HFCANDXICCBASE", hf_cand::P, hf_cand::P2, hf_cand::PVector, - hf_cand::CPA, - hf_cand::CPAXY, + hf_cand::Cpa, + hf_cand::CpaXY, hf_cand::Ct, hf_cand::ImpactParameterXY, hf_cand_2prong::MaxNormalisedDeltaIP, @@ -1283,10 +1283,10 @@ DECLARE_SOA_COLUMN(CosPACasc, cosPACasc, float); DECLARE_SOA_COLUMN(CosPAXYV0, cosPAXYV0, float); DECLARE_SOA_COLUMN(CosPAXYCharmBaryon, cosPAXYCharmBaryon, float); DECLARE_SOA_COLUMN(CosPAXYCasc, cosPAXYCasc, float); -DECLARE_SOA_COLUMN(CTauOmegac, ctauOmegac, float); -DECLARE_SOA_COLUMN(CTauCascade, ctauCascade, float); -DECLARE_SOA_COLUMN(CTauV0, ctauV0, float); -DECLARE_SOA_COLUMN(CTauXic, ctauXic, float); +DECLARE_SOA_COLUMN(CTauOmegac, cTauOmegac, float); +DECLARE_SOA_COLUMN(CTauCascade, cTauCascade, float); +DECLARE_SOA_COLUMN(CTauV0, cTauV0, float); +DECLARE_SOA_COLUMN(CTauXic, cTauXic, float); DECLARE_SOA_COLUMN(EtaV0PosDau, etaV0PosDau, float); DECLARE_SOA_COLUMN(EtaV0NegDau, etaV0NegDau, float); DECLARE_SOA_COLUMN(EtaBachFromCasc, etaBachFromCasc, float); @@ -1724,8 +1724,8 @@ DECLARE_SOA_TABLE(HfCandXicBase, "AOD", "HFCANDXICBASE", hf_cand::Pt, hf_cand::P, hf_cand::PVector, - hf_cand::CPA, - hf_cand::CPAXY, + hf_cand::Cpa, + hf_cand::CpaXY, hf_cand::Ct, hf_cand::ImpactParameterXY, hf_cand_3prong::MaxNormalisedDeltaIP, @@ -1800,8 +1800,8 @@ DECLARE_SOA_TABLE(HfCandChicBase, "AOD", "HFCANDCHICBASE", hf_cand::P, hf_cand::P2, hf_cand::PVector, - hf_cand::CPA, - hf_cand::CPAXY, + hf_cand::Cpa, + hf_cand::CpaXY, hf_cand::Ct, hf_cand::ImpactParameterXY, hf_cand_2prong::MaxNormalisedDeltaIP, @@ -1864,8 +1864,8 @@ DECLARE_SOA_TABLE(HfCandLbBase, "AOD", "HFCANDLBBASE", hf_cand::P, hf_cand::P2, hf_cand::PVector, - hf_cand::CPA, - hf_cand::CPAXY, + hf_cand::Cpa, + hf_cand::CpaXY, hf_cand::Ct, hf_cand::ImpactParameterXY, hf_cand_2prong::MaxNormalisedDeltaIP, @@ -1936,8 +1936,8 @@ DECLARE_SOA_TABLE(HfCandB0Base, "AOD", "HFCANDB0BASE", hf_cand::P, hf_cand::P2, hf_cand::PVector, - hf_cand::CPA, - hf_cand::CPAXY, + hf_cand::Cpa, + hf_cand::CpaXY, hf_cand::Ct, hf_cand::ImpactParameterXY, hf_cand_2prong::MaxNormalisedDeltaIP, @@ -2013,8 +2013,8 @@ DECLARE_SOA_TABLE(HfCandBsBase, "AOD", "HFCANDBSBASE", hf_cand::P, hf_cand::P2, hf_cand::PVector, - hf_cand::CPA, - hf_cand::CPAXY, + hf_cand::Cpa, + hf_cand::CpaXY, hf_cand::Ct, hf_cand::ImpactParameterXY, hf_cand_2prong::MaxNormalisedDeltaIP, @@ -2126,8 +2126,8 @@ namespace hf_cand_sigmac_to_cascade { DECLARE_SOA_INDEX_COLUMN_FULL(ProngLc, prongLc, int, HfCandCascade, ""); //! Index to a Lc prong DECLARE_SOA_COLUMN(Charge, charge, int8_t); //! // Σc charge(either 0 or ++) -DECLARE_SOA_COLUMN(ChargeLc, chargelc, int8_t); //! // Λc charge(+) -DECLARE_SOA_COLUMN(ChargeSoftPi, chargesoftpi, int8_t); //! // pion charge(either - or +) +DECLARE_SOA_COLUMN(ChargeLc, chargeLc, int8_t); //! // Λc charge(+) +DECLARE_SOA_COLUMN(ChargeSoftPi, chargeSoftPi, int8_t); //! // pion charge(either - or +) DECLARE_SOA_COLUMN(StatusSpreadLcMinvKs0PFromPDG, statusSpreadLcMinvKs0PFromPDG, int); //! // Λc Minv spread from PDG Λc mass DECLARE_SOA_INDEX_COLUMN_FULL(Prong0, prong0, int, HfCandCascade, "_0"); //! Λc index // MC matching result: @@ -2245,9 +2245,9 @@ DECLARE_SOA_DYNAMIC_COLUMN(DecayLengthXYNormalisedD0, decayLengthXYNormalisedD0, [](float xVtxP, float yVtxP, float xVtxS, float yVtxS, float err) -> float { return RecoDecay::distanceXY(std::array{xVtxP, yVtxP}, std::array{xVtxS, yVtxS}) / err; }); DECLARE_SOA_COLUMN(ErrorDecayLengthD0, errorDecayLengthD0, float); DECLARE_SOA_COLUMN(ErrorDecayLengthXYD0, errorDecayLengthXYD0, float); -DECLARE_SOA_DYNAMIC_COLUMN(CPAD0, cpaD0, +DECLARE_SOA_DYNAMIC_COLUMN(CpaD0, cpaD0, [](float xVtxP, float yVtxP, float zVtxP, float xVtxS, float yVtxS, float zVtxS, float px, float py, float pz) -> float { return RecoDecay::cpa(std::array{xVtxP, yVtxP, zVtxP}, std::array{xVtxS, yVtxS, zVtxS}, std::array{px, py, pz}); }); -DECLARE_SOA_DYNAMIC_COLUMN(CPAXYD0, cpaXYD0, +DECLARE_SOA_DYNAMIC_COLUMN(CpaXYD0, cpaXYD0, [](float xVtxP, float yVtxP, float xVtxS, float yVtxS, float px, float py) -> float { return RecoDecay::cpaXY(std::array{xVtxP, yVtxP}, std::array{xVtxS, yVtxS}, std::array{px, py}); }); DECLARE_SOA_DYNAMIC_COLUMN(CtD0, ctD0, [](float xVtxP, float yVtxP, float zVtxP, float xVtxS, float yVtxS, float zVtxS, float px, float py, float pz) -> float { return RecoDecay::ct(std::array{px, py, pz}, RecoDecay::distance(std::array{xVtxP, yVtxP, zVtxP}, std::array{xVtxS, yVtxS, zVtxS}), constants::physics::MassD0); }); @@ -2339,8 +2339,8 @@ DECLARE_SOA_TABLE(HfD0FromDstarBase, "AOD", "HFD0FRMDSTR", hf_cand_dstar::PD0, hf_cand_dstar::P2D0, hf_cand_dstar::PVectorD0, - hf_cand_dstar::CPAD0, - hf_cand_dstar::CPAXYD0, + hf_cand_dstar::CpaD0, + hf_cand_dstar::CpaXYD0, hf_cand_dstar::CtD0, hf_cand_dstar::ImpactParameterXYD0, hf_cand_dstar::DeltaIPNormalisedMaxD0, diff --git a/PWGHF/DataModel/CandidateSelectionTables.h b/PWGHF/DataModel/CandidateSelectionTables.h index 344572adc39..06dd445f98e 100644 --- a/PWGHF/DataModel/CandidateSelectionTables.h +++ b/PWGHF/DataModel/CandidateSelectionTables.h @@ -11,6 +11,8 @@ /// \file CandidateSelectionTables.h /// \brief Definitions of tables produced by candidate selectors +/// +/// \author Nima Zardoshti , CERN #ifndef PWGHF_DATAMODEL_CANDIDATESELECTIONTABLES_H_ #define PWGHF_DATAMODEL_CANDIDATESELECTIONTABLES_H_ diff --git a/PWGHF/HFC/TableProducer/correlatorD0D0bar.cxx b/PWGHF/HFC/TableProducer/correlatorD0D0bar.cxx index 4470cdcfe3b..294e34db2c7 100644 --- a/PWGHF/HFC/TableProducer/correlatorD0D0bar.cxx +++ b/PWGHF/HFC/TableProducer/correlatorD0D0bar.cxx @@ -50,7 +50,7 @@ const double incrementEtaCut = 0.1; const double incrementPtThreshold = 0.5; const double epsilon = 1E-5; -const int npTBinsMassAndEfficiency = o2::analysis::hf_cuts_d0_to_pi_k::nBinsPt; +const int npTBinsMassAndEfficiency = o2::analysis::hf_cuts_d0_to_pi_k::NBinsPt; const double efficiencyDmesonDefault[npTBinsMassAndEfficiency] = {}; auto efficiencyDmeson_v = std::vector{efficiencyDmesonDefault, efficiencyDmesonDefault + npTBinsMassAndEfficiency}; @@ -306,7 +306,7 @@ struct HfCorrelatorD0D0bar { registry.fill(HIST("hSelectionStatusMCRec"), candidate1.isSelD0bar() + (candidate1.isSelD0() * 2)); } // fill invariant mass plots from D0/D0bar signal and background candidates - if (candidate1.isSelD0() >= selectionFlagD0) { // only reco as D0 + if (candidate1.isSelD0() >= selectionFlagD0) { // only reco as D0 if (candidate1.flagMcMatchRec() == 1 << aod::hf_cand_2prong::DecayType::D0ToPiK) { // also matched as D0 registry.fill(HIST("hMassD0MCRecSig"), hfHelper.invMassD0ToPiK(candidate1), candidate1.pt(), efficiencyWeight); } else if (candidate1.flagMcMatchRec() == -(1 << aod::hf_cand_2prong::DecayType::D0ToPiK)) { @@ -315,7 +315,7 @@ struct HfCorrelatorD0D0bar { registry.fill(HIST("hMassD0MCRecBkg"), hfHelper.invMassD0ToPiK(candidate1), candidate1.pt(), efficiencyWeight); } } - if (candidate1.isSelD0bar() >= selectionFlagD0bar) { // only reco as D0bar + if (candidate1.isSelD0bar() >= selectionFlagD0bar) { // only reco as D0bar if (candidate1.flagMcMatchRec() == -(1 << aod::hf_cand_2prong::DecayType::D0ToPiK)) { // also matched as D0bar registry.fill(HIST("hMassD0barMCRecSig"), hfHelper.invMassD0barToKPi(candidate1), candidate1.pt(), efficiencyWeight); } else if (candidate1.flagMcMatchRec() == 1 << aod::hf_cand_2prong::DecayType::D0ToPiK) { @@ -477,7 +477,7 @@ struct HfCorrelatorD0D0bar { } while (ptCut < ptThresholdForMaxEtaCut - epsilon); } while (etaCut < maxEtaCut - epsilon); } // end inner loop - } // end outer loop + } // end outer loop registry.fill(HIST("hCountD0D0barPerEvent"), counterD0D0bar); } @@ -542,8 +542,8 @@ struct HfCorrelatorD0D0bar { entryD0D0barRecoInfo(1.864, 1.864, 8); // dummy information - } // end inner loop - } // end outer loop + } // end inner loop + } // end outer loop registry.fill(HIST("hCountCCbarPerEvent"), counterCCbar); registry.fill(HIST("hCountCCbarPerEventBeforeEtaCut"), counterCCbarBeforeEtasel); } diff --git a/PWGHF/HFC/TableProducer/correlatorD0D0barBarrelFullPid.cxx b/PWGHF/HFC/TableProducer/correlatorD0D0barBarrelFullPid.cxx index 27e150594de..f92f8150abc 100644 --- a/PWGHF/HFC/TableProducer/correlatorD0D0barBarrelFullPid.cxx +++ b/PWGHF/HFC/TableProducer/correlatorD0D0barBarrelFullPid.cxx @@ -50,7 +50,7 @@ const double incrementEtaCut = 0.1; const double incrementPtThreshold = 0.5; const double epsilon = 1E-5; -const int npTBinsMassAndEfficiency = o2::analysis::hf_cuts_d0_to_pi_k::nBinsPt; +const int npTBinsMassAndEfficiency = o2::analysis::hf_cuts_d0_to_pi_k::NBinsPt; const double efficiencyDmesonDefault[npTBinsMassAndEfficiency] = {}; auto efficiencyDmeson_v = std::vector{efficiencyDmesonDefault, efficiencyDmesonDefault + npTBinsMassAndEfficiency}; @@ -307,7 +307,7 @@ struct HfCorrelatorD0D0barBarrelFullPid { registry.fill(HIST("hSelectionStatusMCRec"), candidate1.isSelD0barTofPlusRichPid() + (candidate1.isSelD0TofPlusRichPid() * 2)); } // fill invariant mass plots from D0/D0bar signal and background candidates - if (candidate1.isSelD0TofPlusRichPid() >= selectionFlagD0) { // only reco as D0 + if (candidate1.isSelD0TofPlusRichPid() >= selectionFlagD0) { // only reco as D0 if (candidate1.flagMcMatchRec() == 1 << aod::hf_cand_2prong::DecayType::D0ToPiK) { // also matched as D0 registry.fill(HIST("hMassD0MCRecSig"), hfHelper.invMassD0ToPiK(candidate1), candidate1.pt(), efficiencyWeight); } else if (candidate1.flagMcMatchRec() == -(1 << aod::hf_cand_2prong::DecayType::D0ToPiK)) { @@ -316,7 +316,7 @@ struct HfCorrelatorD0D0barBarrelFullPid { registry.fill(HIST("hMassD0MCRecBkg"), hfHelper.invMassD0ToPiK(candidate1), candidate1.pt(), efficiencyWeight); } } - if (candidate1.isSelD0barTofPlusRichPid() >= selectionFlagD0bar) { // only reco as D0bar + if (candidate1.isSelD0barTofPlusRichPid() >= selectionFlagD0bar) { // only reco as D0bar if (candidate1.flagMcMatchRec() == -(1 << aod::hf_cand_2prong::DecayType::D0ToPiK)) { // also matched as D0bar registry.fill(HIST("hMassD0barMCRecSig"), hfHelper.invMassD0barToKPi(candidate1), candidate1.pt(), efficiencyWeight); } else if (candidate1.flagMcMatchRec() == 1 << aod::hf_cand_2prong::DecayType::D0ToPiK) { @@ -478,7 +478,7 @@ struct HfCorrelatorD0D0barBarrelFullPid { } while (ptCut < ptThresholdForMaxEtaCut - epsilon); } while (etaCut < maxEtaCut - epsilon); } // end inner loop - } // end outer loop + } // end outer loop registry.fill(HIST("hCountD0D0barPerEvent"), counterD0D0bar); } @@ -543,8 +543,8 @@ struct HfCorrelatorD0D0barBarrelFullPid { entryD0D0barRecoInfo(1.864, 1.864, 8); // dummy information - } // end inner loop - } // end outer loop + } // end inner loop + } // end outer loop registry.fill(HIST("hCountCCbarPerEvent"), counterCCbar); registry.fill(HIST("hCountCCbarPerEventBeforeEtaCut"), counterCCbarBeforeEtasel); } diff --git a/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx b/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx index aed74e9ad7a..4f1fcd2f049 100644 --- a/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx @@ -79,8 +79,8 @@ struct HfCorrelatorDMesonPairs { Configurable applyMl{"applyMl", false, "Flag to apply ML selections"}; Configurable> binsPtMl{"binsPtMl", std::vector{hf_cuts_ml::vecBinsPt}, "pT bin limits for ML application"}; Configurable> cutDirMl{"cutDirMl", std::vector{hf_cuts_ml::vecCutDir}, "Whether to reject score values greater or smaller than the threshold"}; - Configurable> cutsMl{"cutsMl", {hf_cuts_ml::cuts[0], hf_cuts_ml::nBinsPt, hf_cuts_ml::nCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; - Configurable nClassesMl{"nClassesMl", static_cast(hf_cuts_ml::nCutScores), "Number of classes in ML model"}; + Configurable> cutsMl{"cutsMl", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; + Configurable nClassesMl{"nClassesMl", static_cast(hf_cuts_ml::NCutScores), "Number of classes in ML model"}; Configurable> namesInputFeatures{"namesInputFeatures", std::vector{"feature1", "feature2"}, "Names of ML model input features"}; // ML model CCDB configuration diff --git a/PWGHF/HFC/TableProducer/correlatorDplusDminus.cxx b/PWGHF/HFC/TableProducer/correlatorDplusDminus.cxx index 6f207473989..2871d9f9793 100644 --- a/PWGHF/HFC/TableProducer/correlatorDplusDminus.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDplusDminus.cxx @@ -50,7 +50,7 @@ const double incrementEtaCut = 0.1; const double incrementPtThreshold = 0.5; const double epsilon = 1E-5; -const int npTBinsMassAndEfficiency = o2::analysis::hf_cuts_dplus_to_pi_k_pi::nBinsPt; +const int npTBinsMassAndEfficiency = o2::analysis::hf_cuts_dplus_to_pi_k_pi::NBinsPt; const double efficiencyDmesonDefault[npTBinsMassAndEfficiency] = {}; auto efficiencyDmeson_v = std::vector{efficiencyDmesonDefault, efficiencyDmesonDefault + npTBinsMassAndEfficiency}; @@ -243,7 +243,7 @@ struct HfCorrelatorDplusDminus { } while (ptCut < ptThresholdForMaxEtaCut - epsilon); } while (etaCut < maxEtaCut - epsilon); } // end inner loop (Dminus) - } // end outer loop (Dplus) + } // end outer loop (Dplus) } PROCESS_SWITCH(HfCorrelatorDplusDminus, processData, "Process data", false); @@ -460,7 +460,7 @@ struct HfCorrelatorDplusDminus { } while (ptCut < ptThresholdForMaxEtaCut - epsilon); } while (etaCut < maxEtaCut - epsilon); } // end inner loop - } // end outer loop + } // end outer loop registry.fill(HIST("hCountDplusDminusPerEvent"), counterDplusDminus); } PROCESS_SWITCH(HfCorrelatorDplusDminus, processMcGen, "Process MC Gen mode", false); @@ -524,8 +524,8 @@ struct HfCorrelatorDplusDminus { entryDplusDminusRecoInfo(1.869, 1.869, 8); // Dummy - } // end inner loop - } // end outer loop + } // end inner loop + } // end outer loop registry.fill(HIST("hCountCCbarPerEvent"), counterCCbar); registry.fill(HIST("hCountCCbarPerEventBeforeEtaCut"), counterCCbarBeforeEtasel); } diff --git a/PWGHF/HFC/TableProducer/correlatorDplusHadrons.cxx b/PWGHF/HFC/TableProducer/correlatorDplusHadrons.cxx index b786faaffc3..d9ac67f59ae 100644 --- a/PWGHF/HFC/TableProducer/correlatorDplusHadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDplusHadrons.cxx @@ -45,7 +45,7 @@ double getDeltaPhi(double phiD, double phiHadron) } /// definition of variables for Dplus hadron pairs (in data-like, MC-reco and MC-kine tasks) -const int npTBinsMassAndEfficiency = o2::analysis::hf_cuts_dplus_to_pi_k_pi::nBinsPt; +const int npTBinsMassAndEfficiency = o2::analysis::hf_cuts_dplus_to_pi_k_pi::NBinsPt; std::vector efficiencyDmeson(npTBinsMassAndEfficiency + 1); // definition of ME variables diff --git a/PWGHF/HFC/Tasks/taskCorrelationD0Hadrons.cxx b/PWGHF/HFC/Tasks/taskCorrelationD0Hadrons.cxx index 5d6f8e3bf0d..2112aa91566 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationD0Hadrons.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationD0Hadrons.cxx @@ -53,7 +53,7 @@ auto vecSidebandLeftInner = std::vector{sidebandLeftInnerDefault, sideba auto vecSidebandLeftOuter = std::vector{sidebandLeftOuterDefault, sidebandLeftOuterDefault + nPtBinsCorrelations}; auto vecSidebandRightInner = std::vector{sidebandRightInnerDefault, sidebandRightInnerDefault + nPtBinsCorrelations}; auto vecSidebandRightOuter = std::vector{sidebandRightOuterDefault, sidebandRightOuterDefault + nPtBinsCorrelations}; -const int nPtbinsPtEfficiencyD = o2::analysis::hf_cuts_d0_to_pi_k::nBinsPt; +const int nPtbinsPtEfficiencyD = o2::analysis::hf_cuts_d0_to_pi_k::NBinsPt; const double efficiencyDmesonDefault[nPtbinsPtEfficiencyD] = {}; auto vecEfficiencyDmeson = std::vector{efficiencyDmesonDefault, efficiencyDmesonDefault + nPtbinsPtEfficiencyD}; diff --git a/PWGHF/HFC/Tasks/taskCorrelationDDbar.cxx b/PWGHF/HFC/Tasks/taskCorrelationDDbar.cxx index ea58816ab55..b45ce1b4a63 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationDDbar.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationDDbar.cxx @@ -63,7 +63,7 @@ const TString stringSideband = "sidebands;"; const TString stringMCParticles = "MC gen - D,Dbar particles;"; const TString stringMCReco = "MC reco - D,Dbar candidates "; -//definition of vectors for standard ptbin and invariant mass configurables +// definition of vectors for standard ptbin and invariant mass configurables const int npTBinsCorrelations = 8; const double pTBinsCorrelations[npTBinsCorrelations + 1] = {0., 2., 4., 6., 8., 12., 16., 24., 99.}; auto pTBinsCorrelations_v = std::vector{pTBinsCorrelations, pTBinsCorrelations + npTBinsCorrelations + 1}; @@ -79,7 +79,7 @@ auto sidebandLeftInner_v = std::vector{sidebandLeftInnerDefault, sideban auto sidebandLeftOuter_v = std::vector{sidebandLeftOuterDefault, sidebandLeftOuterDefault + npTBinsCorrelations}; auto sidebandRightInner_v = std::vector{sidebandRightInnerDefault, sidebandRightInnerDefault + npTBinsCorrelations}; auto sidebandRightOuter_v = std::vector{sidebandRightOuterDefault, sidebandRightOuterDefault + npTBinsCorrelations}; -const int npTBinsEfficiency = o2::analysis::hf_cuts_d0_to_pi_k::nBinsPt; +const int npTBinsEfficiency = o2::analysis::hf_cuts_d0_to_pi_k::NBinsPt; const double efficiencyDmesonDefault[npTBinsEfficiency] = {}; auto efficiencyDmeson_v = std::vector{efficiencyDmesonDefault, efficiencyDmesonDefault + npTBinsEfficiency}; @@ -235,7 +235,7 @@ struct HfTaskCorrelationDDbar { void processData(aod::DDbarPairFull const& pairEntries) { for (const auto& pairEntry : pairEntries) { - //define variables for widely used quantities + // define variables for widely used quantities double deltaPhi = pairEntry.deltaPhi(); double deltaEta = pairEntry.deltaEta(); double ptD = pairEntry.ptD(); @@ -251,17 +251,17 @@ struct HfTaskCorrelationDDbar { efficiencyWeight = 1. / (efficiencyD->at(o2::analysis::findBin(binsPtEfficiency, ptD)) * efficiencyD->at(o2::analysis::findBin(binsPtEfficiency, ptDbar))); } - //fill 2D invariant mass plots + // fill 2D invariant mass plots registry.fill(HIST("hMass2DCorrelationPairs"), massD, massDbar, ptD, ptDbar, efficiencyWeight); - //reject entries outside pT ranges of interest - if (pTBinD == -1 || pTBinDbar == -1) { //at least one particle outside accepted pT range + // reject entries outside pT ranges of interest + if (pTBinD == -1 || pTBinDbar == -1) { // at least one particle outside accepted pT range continue; } - //check if correlation entry belongs to signal region, sidebands or is outside both, and fill correlation plots + // check if correlation entry belongs to signal region, sidebands or is outside both, and fill correlation plots if (massD > signalRegionInner->at(pTBinD) && massD < signalRegionOuter->at(pTBinD) && massDbar > signalRegionInner->at(pTBinDbar) && massDbar < signalRegionOuter->at(pTBinDbar)) { - //in signal region + // in signal region registry.fill(HIST("hCorrel2DVsPtSignalRegion"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); registry.fill(HIST("hCorrel2DPtIntSignalRegion"), deltaPhi, deltaEta, efficiencyWeight); registry.fill(HIST("hDeltaEtaPtIntSignalRegion"), deltaEta, efficiencyWeight); @@ -274,7 +274,7 @@ struct HfTaskCorrelationDDbar { (massD > sidebandRightInner->at(pTBinD) && massD < sidebandRightOuter->at(pTBinD) && massDbar > sidebandLeftInner->at(pTBinDbar) && massDbar < sidebandRightOuter->at(pTBinDbar)) || (massD > sidebandLeftInner->at(pTBinD) && massD < sidebandRightOuter->at(pTBinD) && massDbar > sidebandLeftInner->at(pTBinDbar) && massDbar < sidebandLeftOuter->at(pTBinDbar)) || (massD > sidebandLeftInner->at(pTBinD) && massD < sidebandRightOuter->at(pTBinD) && massDbar > sidebandRightInner->at(pTBinDbar) && massDbar < sidebandRightOuter->at(pTBinDbar))) { - //in sideband region + // in sideband region registry.fill(HIST("hCorrel2DVsPtSidebands"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); registry.fill(HIST("hCorrel2DPtIntSidebands"), deltaPhi, deltaEta, efficiencyWeight); registry.fill(HIST("hDeltaEtaPtIntSidebands"), deltaEta, efficiencyWeight); @@ -292,7 +292,7 @@ struct HfTaskCorrelationDDbar { void processMcRec(aod::DDbarPairFull const& pairEntries) { for (const auto& pairEntry : pairEntries) { - //define variables for widely used quantities + // define variables for widely used quantities double deltaPhi = pairEntry.deltaPhi(); double deltaEta = pairEntry.deltaEta(); double ptD = pairEntry.ptD(); @@ -308,81 +308,81 @@ struct HfTaskCorrelationDDbar { efficiencyWeight = 1. / (efficiencyD->at(o2::analysis::findBin(binsPtEfficiency, ptD)) * efficiencyD->at(o2::analysis::findBin(binsPtEfficiency, ptDbar))); } - //fill 2D invariant mass plots + // fill 2D invariant mass plots switch (pairEntry.signalStatus()) { - case 0: //D Bkg, Dbar Bkg + case 0: // D Bkg, Dbar Bkg registry.fill(HIST("hMass2DCorrelationPairsMCRecBkgBkg"), massD, massDbar, ptD, ptDbar, efficiencyWeight); break; - case 1: //D Bkg, Dbar Ref + case 1: // D Bkg, Dbar Ref registry.fill(HIST("hMass2DCorrelationPairsMCRecBkgRef"), massD, massDbar, ptD, ptDbar, efficiencyWeight); break; - case 2: //D Bkg, Dbar Sig + case 2: // D Bkg, Dbar Sig registry.fill(HIST("hMass2DCorrelationPairsMCRecBkgSig"), massD, massDbar, ptD, ptDbar, efficiencyWeight); break; - case 3: //D Ref, Dbar Bkg + case 3: // D Ref, Dbar Bkg registry.fill(HIST("hMass2DCorrelationPairsMCRecRefBkg"), massD, massDbar, ptD, ptDbar, efficiencyWeight); break; - case 4: //D Ref, Dbar Ref + case 4: // D Ref, Dbar Ref registry.fill(HIST("hMass2DCorrelationPairsMCRecRefRef"), massD, massDbar, ptD, ptDbar, efficiencyWeight); break; - case 5: //D Ref, Dbar Sig + case 5: // D Ref, Dbar Sig registry.fill(HIST("hMass2DCorrelationPairsMCRecRefSig"), massD, massDbar, ptD, ptDbar, efficiencyWeight); break; - case 6: //D Sig, Dbar Bkg + case 6: // D Sig, Dbar Bkg registry.fill(HIST("hMass2DCorrelationPairsMCRecSigBkg"), massD, massDbar, ptD, ptDbar, efficiencyWeight); break; - case 7: //D Sig, Dbar Ref + case 7: // D Sig, Dbar Ref registry.fill(HIST("hMass2DCorrelationPairsMCRecSigRef"), massD, massDbar, ptD, ptDbar, efficiencyWeight); break; - case 8: //D Sig, Dbar Sig + case 8: // D Sig, Dbar Sig registry.fill(HIST("hMass2DCorrelationPairsMCRecSigSig"), massD, massDbar, ptD, ptDbar, efficiencyWeight); break; - default: //should not happen for MC reco + default: // should not happen for MC reco break; } - //reject entries outside pT ranges of interest - if (pTBinD == -1 || pTBinDbar == -1) { //at least one particle outside accepted pT range + // reject entries outside pT ranges of interest + if (pTBinD == -1 || pTBinDbar == -1) { // at least one particle outside accepted pT range continue; } - //check if correlation entry belongs to signal region, sidebands or is outside both, and fill correlation plots + // check if correlation entry belongs to signal region, sidebands or is outside both, and fill correlation plots if (massD > signalRegionInner->at(pTBinD) && massD < signalRegionOuter->at(pTBinD) && massDbar > signalRegionInner->at(pTBinDbar) && massDbar < signalRegionOuter->at(pTBinDbar)) { - //in signal region + // in signal region registry.fill(HIST("hCorrel2DPtIntSignalRegionMCRec"), deltaPhi, deltaEta, efficiencyWeight); registry.fill(HIST("hDeltaEtaPtIntSignalRegionMCRec"), deltaEta, efficiencyWeight); registry.fill(HIST("hDeltaPhiPtIntSignalRegionMCRec"), deltaPhi, efficiencyWeight); registry.fill(HIST("hDeltaPtDDbarSignalRegionMCRec"), ptDbar - ptD, efficiencyWeight); registry.fill(HIST("hDeltaPtMaxMinSignalRegionMCRec"), std::abs(ptDbar - ptD), efficiencyWeight); switch (pairEntry.signalStatus()) { - case 0: //D Bkg, Dbar Bkg + case 0: // D Bkg, Dbar Bkg registry.fill(HIST("hCorrel2DVsPtSignalRegionMCRecBkgBkg"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); break; - case 1: //D Bkg, Dbar Ref + case 1: // D Bkg, Dbar Ref registry.fill(HIST("hCorrel2DVsPtSignalRegionMCRecBkgRef"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); break; - case 2: //D Bkg, Dbar Sig + case 2: // D Bkg, Dbar Sig registry.fill(HIST("hCorrel2DVsPtSignalRegionMCRecBkgSig"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); break; - case 3: //D Ref, Dbar Bkg + case 3: // D Ref, Dbar Bkg registry.fill(HIST("hCorrel2DVsPtSignalRegionMCRecRefBkg"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); break; - case 4: //D Ref, Dbar Ref + case 4: // D Ref, Dbar Ref registry.fill(HIST("hCorrel2DVsPtSignalRegionMCRecRefRef"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); break; - case 5: //D Ref, Dbar Sig + case 5: // D Ref, Dbar Sig registry.fill(HIST("hCorrel2DVsPtSignalRegionMCRecRefSig"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); break; - case 6: //D Sig, Dbar Bkg + case 6: // D Sig, Dbar Bkg registry.fill(HIST("hCorrel2DVsPtSignalRegionMCRecSigBkg"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); break; - case 7: //D Sig, Dbar Ref + case 7: // D Sig, Dbar Ref registry.fill(HIST("hCorrel2DVsPtSignalRegionMCRecSigRef"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); break; - case 8: //D Sig, Dbar Sig + case 8: // D Sig, Dbar Sig registry.fill(HIST("hCorrel2DVsPtSignalRegionMCRecSigSig"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); break; - default: //should not happen for MC reco + default: // should not happen for MC reco break; } } @@ -391,41 +391,41 @@ struct HfTaskCorrelationDDbar { (massD > sidebandRightInner->at(pTBinD) && massD < sidebandRightOuter->at(pTBinD) && massDbar > sidebandLeftInner->at(pTBinDbar) && massDbar < sidebandRightOuter->at(pTBinDbar)) || (massD > sidebandLeftInner->at(pTBinD) && massD < sidebandRightOuter->at(pTBinD) && massDbar > sidebandLeftInner->at(pTBinDbar) && massDbar < sidebandLeftOuter->at(pTBinDbar)) || (massD > sidebandLeftInner->at(pTBinD) && massD < sidebandRightOuter->at(pTBinD) && massDbar > sidebandRightInner->at(pTBinDbar) && massDbar < sidebandRightOuter->at(pTBinDbar))) { - //in sideband region + // in sideband region registry.fill(HIST("hCorrel2DPtIntSidebandsMCRec"), deltaPhi, deltaEta, efficiencyWeight); registry.fill(HIST("hDeltaEtaPtIntSidebandsMCRec"), deltaEta, efficiencyWeight); registry.fill(HIST("hDeltaPhiPtIntSidebandsMCRec"), deltaPhi, efficiencyWeight); registry.fill(HIST("hDeltaPtDDbarSidebandsMCRec"), ptDbar - ptD, efficiencyWeight); registry.fill(HIST("hDeltaPtMaxMinSidebandsMCRec"), std::abs(ptDbar - ptD), efficiencyWeight); switch (pairEntry.signalStatus()) { - case 0: //D Bkg, Dbar Bkg + case 0: // D Bkg, Dbar Bkg registry.fill(HIST("hCorrel2DVsPtSidebandsMCRecBkgBkg"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); break; - case 1: //D Bkg, Dbar Ref + case 1: // D Bkg, Dbar Ref registry.fill(HIST("hCorrel2DVsPtSidebandsMCRecBkgRef"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); break; - case 2: //D Bkg, Dbar Sig + case 2: // D Bkg, Dbar Sig registry.fill(HIST("hCorrel2DVsPtSidebandsMCRecBkgSig"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); break; - case 3: //D Ref, Dbar Bkg + case 3: // D Ref, Dbar Bkg registry.fill(HIST("hCorrel2DVsPtSidebandsMCRecRefBkg"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); break; - case 4: //D Ref, Dbar Ref + case 4: // D Ref, Dbar Ref registry.fill(HIST("hCorrel2DVsPtSidebandsMCRecRefRef"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); break; - case 5: //D Ref, Dbar Sig + case 5: // D Ref, Dbar Sig registry.fill(HIST("hCorrel2DVsPtSidebandsMCRecRefSig"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); break; - case 6: //D Sig, Dbar Bkg + case 6: // D Sig, Dbar Bkg registry.fill(HIST("hCorrel2DVsPtSidebandsMCRecSigBkg"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); break; - case 7: //D Sig, Dbar Ref + case 7: // D Sig, Dbar Ref registry.fill(HIST("hCorrel2DVsPtSidebandsMCRecSigRef"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); break; - case 8: //D Sig, Dbar Sig + case 8: // D Sig, Dbar Sig registry.fill(HIST("hCorrel2DVsPtSidebandsMCRecSigSig"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); break; - default: //should not happen for MC reco + default: // should not happen for MC reco break; } } @@ -439,13 +439,13 @@ struct HfTaskCorrelationDDbar { void processMcGen(aod::DDbarPair const& pairEntries) { for (const auto& pairEntry : pairEntries) { - //define variables for widely used quantities + // define variables for widely used quantities double deltaPhi = pairEntry.deltaPhi(); double deltaEta = pairEntry.deltaEta(); double ptD = pairEntry.ptD(); double ptDbar = pairEntry.ptDbar(); - //reject entries outside pT ranges of interest + // reject entries outside pT ranges of interest if (o2::analysis::findBin(binsPtCorrelations, ptD) == -1 || o2::analysis::findBin(binsPtCorrelations, ptDbar) == -1) { continue; } diff --git a/PWGHF/HFC/Tasks/taskCorrelationDplusHadrons.cxx b/PWGHF/HFC/Tasks/taskCorrelationDplusHadrons.cxx index a196c6fb9a8..8ccda0a3b71 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationDplusHadrons.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationDplusHadrons.cxx @@ -61,7 +61,7 @@ auto sidebandLeftInner_v = std::vector{sidebandLeftInnerDefault, sideban auto sidebandLeftOuter_v = std::vector{sidebandLeftOuterDefault, sidebandLeftOuterDefault + npTBinsCorrelations}; auto sidebandRightInner_v = std::vector{sidebandRightInnerDefault, sidebandRightInnerDefault + npTBinsCorrelations}; auto sidebandRightOuter_v = std::vector{sidebandRightOuterDefault, sidebandRightOuterDefault + npTBinsCorrelations}; -const int npTBinsEfficiency = o2::analysis::hf_cuts_dplus_to_pi_k_pi::nBinsPt; +const int npTBinsEfficiency = o2::analysis::hf_cuts_dplus_to_pi_k_pi::NBinsPt; std::vector efficiencyDmeson(npTBinsEfficiency + 1); /// Dplus-Hadron correlation pair filling task, from pair tables - for real data and data-like analysis (i.e. reco-level w/o matching request via MC truth) diff --git a/PWGHF/HFC/Tasks/taskCorrelationDstarHadrons.cxx b/PWGHF/HFC/Tasks/taskCorrelationDstarHadrons.cxx index cc0ca29bb1a..1e002d9118d 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationDstarHadrons.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationDstarHadrons.cxx @@ -63,7 +63,7 @@ auto vecSidebandRightInnerDefault = std::vector{sidebandRightInnerDefaul const double sidebandRightOuterDefault[nBinsPtCorrelation] = {0.154, 0.154, 0.154, 0.154, 0.154, 0.154, 0.154, 0.154}; auto vecSidebandRightOuterDefault = std::vector{sidebandRightOuterDefault, sidebandRightOuterDefault + nBinsPtCorrelation}; -const int npTBinsEfficiency = o2::analysis::hf_cuts_dstar_to_d0_pi::nBinsPt; +const int npTBinsEfficiency = o2::analysis::hf_cuts_dstar_to_d0_pi::NBinsPt; std::vector vecEfficiencyDstarDefault(npTBinsEfficiency); // line # 76 in taskCorrelationDstarHadron.cxx; why (npTBinsEfficiency+1) ? // Dstar-Hadron correlation pair diff --git a/PWGHF/HFL/DataModel/ElectronSelectionTable.h b/PWGHF/HFL/DataModel/ElectronSelectionTable.h index ecf50e1e3de..bb8b57ef07c 100644 --- a/PWGHF/HFL/DataModel/ElectronSelectionTable.h +++ b/PWGHF/HFL/DataModel/ElectronSelectionTable.h @@ -22,7 +22,7 @@ namespace o2::aod { -// definition of columns and tables forElectron Selection +// definition of columns and tables for electron selection namespace hf_sel_electron { DECLARE_SOA_INDEX_COLUMN(Collision, collision); //! collisioniD of the electron track @@ -31,11 +31,11 @@ DECLARE_SOA_COLUMN(EtaTrack, etaTrack, float); //! pseudorapidit DECLARE_SOA_COLUMN(PhiTrack, phiTrack, float); //! azimuth of the electron track DECLARE_SOA_COLUMN(PtTrack, ptTrack, float); //! transverse momentum of the electron track DECLARE_SOA_COLUMN(PTrack, pTrack, float); //! momentum of the electron track -DECLARE_SOA_COLUMN(RapidityTrack, rapadityTrack, float); //! rapidity of the electron track +DECLARE_SOA_COLUMN(RapidityTrack, rapidityTrack, float); //! rapidity of the electron track DECLARE_SOA_COLUMN(DcaXYTrack, dcaXYTrack, float); //! dca of the electron in xy direction DECLARE_SOA_COLUMN(DcaZTrack, dcaZTrack, float); //! dca of the electron in z direction -DECLARE_SOA_COLUMN(TPCNSigmaElTrack, tpcNSigmaElTrack, float); //! tpcNSigma of the electron track(TPC PID) -DECLARE_SOA_COLUMN(TOFNSigmaElTrack, tofNSigmaElTrack, float); //! tofNSigma of the electron track(TOF PID) +DECLARE_SOA_COLUMN(TpcNSigmaElTrack, tpcNSigmaElTrack, float); //! tpcNSigma of the electron track(TPC PID) +DECLARE_SOA_COLUMN(TofNSigmaElTrack, tofNSigmaElTrack, float); //! tofNSigma of the electron track(TOF PID) // EMCal cluster values DECLARE_SOA_COLUMN(EnergyEmcCluster, energyEmcCluster, float); //! energy of the EMCal cluster @@ -48,7 +48,7 @@ DECLARE_SOA_COLUMN(TimeEmcCluster, timeEmcCluster, float); //! time of the DECLARE_SOA_COLUMN(DeltaEtaMatch, deltaEtaMatch, float); //! dEta matched track to EMCal cluster DECLARE_SOA_COLUMN(DeltaPhiMatch, deltaPhiMatch, float); //! dPhi matched track to EMCal cluster -DECLARE_SOA_COLUMN(ISEmcal, isEmcal, bool); //! electron information with Emcal +DECLARE_SOA_COLUMN(IsEmcal, isEmcal, bool); //! electron information with Emcal } // namespace hf_sel_electron DECLARE_SOA_TABLE(HfSelEl, "AOD", "HFSELEL", //! Electron Informations @@ -62,8 +62,8 @@ DECLARE_SOA_TABLE(HfSelEl, "AOD", "HFSELEL", //! Electron Informations hf_sel_electron::RapidityTrack, hf_sel_electron::DcaXYTrack, hf_sel_electron::DcaZTrack, - hf_sel_electron::TPCNSigmaElTrack, - hf_sel_electron::TOFNSigmaElTrack, + hf_sel_electron::TpcNSigmaElTrack, + hf_sel_electron::TofNSigmaElTrack, hf_sel_electron::EnergyEmcCluster, hf_sel_electron::EtaEmcCluster, hf_sel_electron::PhiEmcCluster, @@ -73,7 +73,7 @@ DECLARE_SOA_TABLE(HfSelEl, "AOD", "HFSELEL", //! Electron Informations hf_sel_electron::TimeEmcCluster, hf_sel_electron::DeltaEtaMatch, hf_sel_electron::DeltaPhiMatch, - hf_sel_electron::ISEmcal); + hf_sel_electron::IsEmcal); } // namespace o2::aod diff --git a/PWGHF/TableProducer/candidateCreatorB0.cxx b/PWGHF/TableProducer/candidateCreatorB0.cxx index 27779e37ab5..fa80f8a287b 100644 --- a/PWGHF/TableProducer/candidateCreatorB0.cxx +++ b/PWGHF/TableProducer/candidateCreatorB0.cxx @@ -62,7 +62,7 @@ struct HfCandidateCreatorB0 { Configurable usePionIsGlobalTrackWoDCA{"usePionIsGlobalTrackWoDCA", true, "check isGlobalTrackWoDCA status for pions, for Run3 studies"}; Configurable ptPionMin{"ptPionMin", 0.5, "minimum pion pT threshold (GeV/c)"}; Configurable> binsPtPion{"binsPtPion", std::vector{hf_cuts_single_track::vecBinsPtTrack}, "track pT bin limits for pion DCA XY pT-dependent cut"}; - Configurable> cutsTrackPionDCA{"cutsTrackPionDCA", {hf_cuts_single_track::cutsTrack[0], hf_cuts_single_track::nBinsPtTrack, hf_cuts_single_track::nCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for pions"}; + Configurable> cutsTrackPionDCA{"cutsTrackPionDCA", {hf_cuts_single_track::CutsTrack[0], hf_cuts_single_track::NBinsPtTrack, hf_cuts_single_track::NCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for pions"}; Configurable invMassWindowB0{"invMassWindowB0", 0.3, "invariant-mass window for B0 candidates"}; Configurable selectionFlagD{"selectionFlagD", 1, "Selection Flag for D"}; // magnetic field setting from CCDB @@ -360,10 +360,10 @@ struct HfCandidateCreatorB0 { rowCandidateProngs(candD.globalIndex(), trackPion.globalIndex()); } // pi loop - } // D loop - } // collision loop - } // process -}; // struct + } // D loop + } // collision loop + } // process +}; // struct /// Extends the base table with expression columns and performs MC matching. struct HfCandidateCreatorB0Expressions { @@ -454,7 +454,7 @@ struct HfCandidateCreatorB0Expressions { } // rec hf_mc_gen::fillMcMatchGenB0(mcParticles, rowMcMatchGen); // gen - } // processMc + } // processMc PROCESS_SWITCH(HfCandidateCreatorB0Expressions, processMc, "Process MC", false); }; // struct diff --git a/PWGHF/TableProducer/candidateCreatorBplus.cxx b/PWGHF/TableProducer/candidateCreatorBplus.cxx index 4d98f65cdaa..aa5704c31a2 100644 --- a/PWGHF/TableProducer/candidateCreatorBplus.cxx +++ b/PWGHF/TableProducer/candidateCreatorBplus.cxx @@ -65,7 +65,7 @@ struct HfCandidateCreatorBplus { Configurable usePionIsGlobalTrackWoDCA{"usePionIsGlobalTrackWoDCA", true, "check isGlobalTrackWoDCA status for pions, for Run3 studies"}; Configurable ptPionMin{"ptPionMin", 0.2, "minimum pion pT threshold (GeV/c)"}; Configurable> binsPtPion{"binsPtPion", std::vector{hf_cuts_single_track::vecBinsPtTrack}, "track pT bin limits for pion DCA XY pT-dependent cut"}; - Configurable> cutsTrackPionDCA{"cutsTrackPionDCA", {hf_cuts_single_track::cutsTrack[0], hf_cuts_single_track::nBinsPtTrack, hf_cuts_single_track::nCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for pions"}; + Configurable> cutsTrackPionDCA{"cutsTrackPionDCA", {hf_cuts_single_track::CutsTrack[0], hf_cuts_single_track::NBinsPtTrack, hf_cuts_single_track::NCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for pions"}; Configurable invMassWindowBplus{"invMassWindowBplus", 0.3, "invariant-mass window for B^{+} candidates"}; Configurable selectionFlagD0{"selectionFlagD0", 1, "Selection Flag for D0"}; Configurable selectionFlagD0bar{"selectionFlagD0bar", 1, "Selection Flag for D0bar"}; @@ -342,11 +342,11 @@ struct HfCandidateCreatorBplus { std::sqrt(impactParameter0.getSigmaY2()), std::sqrt(impactParameter1.getSigmaY2())); rowCandidateProngs(candD0.globalIndex(), trackPion.globalIndex()); // index D0 and bachelor - } // track loop - } // D0 cand loop - } // collision - } // process -}; // struct + } // track loop + } // D0 cand loop + } // collision + } // process +}; // struct /// Extends the base table with expression columns and performs MC matching struct HfCandidateCreatorBplusExpressions { @@ -387,7 +387,7 @@ struct HfCandidateCreatorBplusExpressions { rowMcMatchRec(flag, origin); } hf_mc_gen::fillMcMatchGenBplus(mcParticles, rowMcMatchGen); // gen - } // process + } // process PROCESS_SWITCH(HfCandidateCreatorBplusExpressions, processMc, "Process MC", false); }; // struct diff --git a/PWGHF/TableProducer/candidateCreatorBs.cxx b/PWGHF/TableProducer/candidateCreatorBs.cxx index f05ddc0d8bf..4184498c7db 100644 --- a/PWGHF/TableProducer/candidateCreatorBs.cxx +++ b/PWGHF/TableProducer/candidateCreatorBs.cxx @@ -45,7 +45,7 @@ using namespace o2::hf_trkcandsel; /// Reconstruction of Bs candidates struct HfCandidateCreatorBs { - Produces rowCandidateBase; // table defined in CandidateReconstructionTables.h + Produces rowCandidateBase; // table defined in CandidateReconstructionTables.h Produces rowCandidateProngs; // table defined in CandidateReconstructionTables.h // vertexing @@ -61,7 +61,7 @@ struct HfCandidateCreatorBs { Configurable usePionIsGlobalTrackWoDCA{"usePionIsGlobalTrackWoDCA", true, "check isGlobalTrackWoDCA status for pions, for Run3 studies"}; Configurable ptPionMin{"ptPionMin", 0.5, "minimum pion pT threshold (GeV/c)"}; Configurable> binsPtPion{"binsPtPion", std::vector{hf_cuts_single_track::vecBinsPtTrack}, "track pT bin limits for pion DCA XY pT-dependent cut"}; - Configurable> cutsTrackPionDCA{"cutsTrackPionDCA", {hf_cuts_single_track::cutsTrack[0], hf_cuts_single_track::nBinsPtTrack, hf_cuts_single_track::nCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for pions"}; + Configurable> cutsTrackPionDCA{"cutsTrackPionDCA", {hf_cuts_single_track::CutsTrack[0], hf_cuts_single_track::NBinsPtTrack, hf_cuts_single_track::NCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for pions"}; Configurable invMassWindowBs{"invMassWindowBs", 0.3, "invariant-mass window for Bs candidates"}; Configurable selectionFlagDs{"selectionFlagDs", 1, "Selection Flag for Ds"}; // magnetic field setting from CCDB @@ -347,10 +347,10 @@ struct HfCandidateCreatorBs { rowCandidateProngs(candDs.globalIndex(), trackPion.globalIndex()); } // pi loop - } // Ds loop - } // collision loop - } // process -}; // struct + } // Ds loop + } // collision loop + } // process +}; // struct /// Extends the base table with expression columns and performs MC matching. struct HfCandidateCreatorBsExpressions { diff --git a/PWGHF/TableProducer/candidateCreatorCascade.cxx b/PWGHF/TableProducer/candidateCreatorCascade.cxx index f2cc96f8829..a4b138039e6 100644 --- a/PWGHF/TableProducer/candidateCreatorCascade.cxx +++ b/PWGHF/TableProducer/candidateCreatorCascade.cxx @@ -174,7 +174,7 @@ struct HfCandidateCreatorCascade { } int posGlobalIndex = -1, negGlobalIndex = -1; - float v0x, v0y, v0z, v0px, v0py, v0pz; + float v0X, v0Y, v0Z, v0px, v0py, v0pz; float v0PosPx, v0PosPy, v0PosPz, v0NegPx, v0NegPy, v0NegPz; float dcaV0dau, dcaPosToPV, dcaNegToPV, v0cosPA; std::array covV = {0.}; @@ -187,9 +187,9 @@ struct HfCandidateCreatorCascade { const auto& trackV0DaughNeg = v0row.negTrack_as(); posGlobalIndex = trackV0DaughPos.globalIndex(); negGlobalIndex = trackV0DaughNeg.globalIndex(); - v0x = v0row.x(); - v0y = v0row.y(); - v0z = v0row.z(); + v0X = v0row.x(); + v0Y = v0row.y(); + v0Z = v0row.z(); v0px = v0row.px(); v0py = v0row.py(); v0pz = v0row.pz(); @@ -216,9 +216,9 @@ struct HfCandidateCreatorCascade { const auto& trackV0DaughNeg = v0row.negTrack_as(); posGlobalIndex = trackV0DaughPos.globalIndex(); negGlobalIndex = trackV0DaughNeg.globalIndex(); - v0x = v0row.x(); - v0y = v0row.y(); - v0z = v0row.z(); + v0X = v0row.x(); + v0Y = v0row.y(); + v0Z = v0row.z(); v0px = v0row.px(); v0py = v0row.py(); v0pz = v0row.pz(); @@ -255,7 +255,7 @@ struct HfCandidateCreatorCascade { df.setBz(bz); auto trackBach = getTrackParCov(bach); - const std::array vertexV0 = {v0x, v0y, v0z}; + const std::array vertexV0 = {v0X, v0Y, v0Z}; const std::array momentumV0 = {v0px, v0py, v0pz}; // we build the neutral track to then build the cascade auto trackV0 = o2::track::TrackParCov(vertexV0, momentumV0, covV, 0, true); @@ -318,7 +318,7 @@ struct HfCandidateCreatorCascade { impactParameterBach.getY(), impactParameterV0.getY(), std::sqrt(impactParameterBach.getSigmaY2()), std::sqrt(impactParameterV0.getSigmaY2()), casc.prong0Id(), casc.v0Id(), - v0x, v0y, v0z, + v0X, v0Y, v0Z, posGlobalIndex, negGlobalIndex, v0PosPx, v0PosPy, v0PosPz, v0NegPx, v0NegPy, v0NegPz, diff --git a/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx b/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx index 2fd21d2ab42..62a7131295b 100644 --- a/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx +++ b/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx @@ -55,7 +55,7 @@ struct HfCandidateCreatorSigmac0plusplus { Configurable selectionFlagLc{"selectionFlagLc", 1, "Selection Flag for Lc"}; Configurable yCandLcMax{"yCandLcMax", -1., "max. candLc. Lc rapidity"}; Configurable> binsPt{"binsPt", std::vector{hf_cuts_sigmac_to_p_k_pi::vecBinsPt}, "pT bin limits"}; - Configurable> cutsMassLcMax{"cutsMassLcMax", {hf_cuts_sigmac_to_p_k_pi::cuts[0], hf_cuts_sigmac_to_p_k_pi::nBinsPt, hf_cuts_sigmac_to_p_k_pi::nCutVars, hf_cuts_sigmac_to_p_k_pi::labelsPt, hf_cuts_sigmac_to_p_k_pi::labelsCutVar}, "Lc candidate selection per pT bin"}; + Configurable> cutsMassLcMax{"cutsMassLcMax", {hf_cuts_sigmac_to_p_k_pi::Cuts[0], hf_cuts_sigmac_to_p_k_pi::NBinsPt, hf_cuts_sigmac_to_p_k_pi::NCutVars, hf_cuts_sigmac_to_p_k_pi::labelsPt, hf_cuts_sigmac_to_p_k_pi::labelsCutVar}, "Lc candidate selection per pT bin"}; /// Selections on candidate soft π-,+ Configurable applyGlobalTrkWoDcaCutsSoftPi{"applyGlobalTrkWoDcaCutsSoftPi", false, "Switch on the application of the global-track w/o dca cuts for soft pion BEFORE ALL OTHER CUSTOM CUTS"}; @@ -252,7 +252,7 @@ struct HfCandidateCreatorSigmac0plusplus { chargeSigmac, statusSpreadMinvPKPiFromPDG, statusSpreadMinvPiKPFromPDG); } /// end loop over Λc+ → pK-π+ (and charge conj.) candidates - } /// end makeSoftPiLcPair + } /// end makeSoftPiLcPair /// @brief function to loop over candidate soft pions and, for each of them, over candidate Λc+ for Σc0,++ → Λc+(→pK-π+) π- candidate reconstruction /// @param collision is a o2::aod::Collisions @@ -549,7 +549,7 @@ struct HfCandidateSigmac0plusplusMc { rowMCMatchScGen(flag, origin, -1); } } /// end loop over mcParticles - } /// end processMc + } /// end processMc PROCESS_SWITCH(HfCandidateSigmac0plusplusMc, processMc, "Process MC", false); }; diff --git a/PWGHF/TableProducer/candidateSelectorB0ToDPi.cxx b/PWGHF/TableProducer/candidateSelectorB0ToDPi.cxx index 6aef1ff17b7..9387fb6261b 100644 --- a/PWGHF/TableProducer/candidateSelectorB0ToDPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorB0ToDPi.cxx @@ -53,7 +53,7 @@ struct HfCandidateSelectorB0ToDPi { Configurable nSigmaTofCombinedMax{"nSigmaTofCombinedMax", 5., "Nsigma cut on TOF combined with TPC"}; // topological cuts Configurable> binsPt{"binsPt", std::vector{hf_cuts_b0_to_d_pi::vecBinsPt}, "pT bin limits"}; - Configurable> cuts{"cuts", {hf_cuts_b0_to_d_pi::cuts[0], hf_cuts_b0_to_d_pi::nBinsPt, hf_cuts_b0_to_d_pi::nCutVars, hf_cuts_b0_to_d_pi::labelsPt, hf_cuts_b0_to_d_pi::labelsCutVar}, "B0 candidate selection per pT bin"}; + Configurable> cuts{"cuts", {hf_cuts_b0_to_d_pi::Cuts[0], hf_cuts_b0_to_d_pi::NBinsPt, hf_cuts_b0_to_d_pi::NCutVars, hf_cuts_b0_to_d_pi::labelsPt, hf_cuts_b0_to_d_pi::labelsCutVar}, "B0 candidate selection per pT bin"}; // QA switch Configurable activateQA{"activateQA", false, "Flag to enable QA histogram"}; // check if selectionFlagD (defined in candidateCreatorB0.cxx) and usePid configurables are in sync diff --git a/PWGHF/TableProducer/candidateSelectorBplusToD0Pi.cxx b/PWGHF/TableProducer/candidateSelectorBplusToD0Pi.cxx index ed816b61eeb..add94de2553 100644 --- a/PWGHF/TableProducer/candidateSelectorBplusToD0Pi.cxx +++ b/PWGHF/TableProducer/candidateSelectorBplusToD0Pi.cxx @@ -58,18 +58,18 @@ struct HfCandidateSelectorBplusToD0Pi { Configurable nSigmaTofCombinedMax{"nSigmaTofCombinedMax", 5., "Nsigma cut on TOF combined with TPC"}; // topological cuts Configurable> binsPt{"binsPt", std::vector{hf_cuts_bplus_to_d0_pi::vecBinsPt}, "pT bin limits"}; - Configurable> cuts{"cuts", {hf_cuts_bplus_to_d0_pi::cuts[0], hf_cuts_bplus_to_d0_pi::nBinsPt, hf_cuts_bplus_to_d0_pi::nCutVars, hf_cuts_bplus_to_d0_pi::labelsPt, hf_cuts_bplus_to_d0_pi::labelsCutVar}, "B+ candidate selection per pT bin"}; + Configurable> cuts{"cuts", {hf_cuts_bplus_to_d0_pi::Cuts[0], hf_cuts_bplus_to_d0_pi::NBinsPt, hf_cuts_bplus_to_d0_pi::NCutVars, hf_cuts_bplus_to_d0_pi::labelsPt, hf_cuts_bplus_to_d0_pi::labelsCutVar}, "B+ candidate selection per pT bin"}; // D0-meson ML cuts Configurable> binsPtDmesMl{"binsPtDmesMl", std::vector{hf_cuts_ml::vecBinsPt}, "D0-meson pT bin limits for ML cuts"}; - Configurable> cutsDmesMl{"cutsDmesMl", {hf_cuts_ml::cuts[0], hf_cuts_ml::nBinsPt, hf_cuts_ml::nCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsDmesCutScore}, "D0-meson ML cuts per pT bin"}; + Configurable> cutsDmesMl{"cutsDmesMl", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsDmesCutScore}, "D0-meson ML cuts per pT bin"}; // QA switch Configurable activateQA{"activateQA", false, "Flag to enable QA histogram"}; // B+ ML inference Configurable applyBplusMl{"applyBplusMl", false, "Flag to apply ML selections"}; Configurable> binsPtBpMl{"binsPtBpMl", std::vector{hf_cuts_ml::vecBinsPt}, "pT bin limits for ML application"}; Configurable> cutDirBpMl{"cutDirBpMl", std::vector{hf_cuts_ml::vecCutDir}, "Whether to reject score values greater or smaller than the threshold"}; - Configurable> cutsBpMl{"cutsBpMl", {hf_cuts_ml::cuts[0], hf_cuts_ml::nBinsPt, hf_cuts_ml::nCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; - Configurable nClassesBpMl{"nClassesBpMl", static_cast(hf_cuts_ml::nCutScores), "Number of classes in ML model"}; + Configurable> cutsBpMl{"cutsBpMl", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; + Configurable nClassesBpMl{"nClassesBpMl", static_cast(hf_cuts_ml::NCutScores), "Number of classes in ML model"}; Configurable> namesInputFeatures{"namesInputFeatures", std::vector{"feature1", "feature2"}, "Names of ML model input features"}; // CCDB configuration Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; diff --git a/PWGHF/TableProducer/candidateSelectorBsToDsPi.cxx b/PWGHF/TableProducer/candidateSelectorBsToDsPi.cxx index 9fc9fc8bdfc..e85be935a89 100644 --- a/PWGHF/TableProducer/candidateSelectorBsToDsPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorBsToDsPi.cxx @@ -54,15 +54,15 @@ struct HfCandidateSelectorBsToDsPi { Configurable nSigmaTofCombinedMax{"nSigmaTofCombinedMax", 5., "Nsigma cut on TOF combined with TPC"}; // topological cuts Configurable> binsPt{"binsPt", std::vector{hf_cuts_bs_to_ds_pi::vecBinsPt}, "pT bin limits"}; - Configurable> cuts{"cuts", {hf_cuts_bs_to_ds_pi::cuts[0], hf_cuts_bs_to_ds_pi::nBinsPt, hf_cuts_bs_to_ds_pi::nCutVars, hf_cuts_bs_to_ds_pi::labelsPt, hf_cuts_bs_to_ds_pi::labelsCutVar}, "Bs candidate selection per pT bin"}; + Configurable> cuts{"cuts", {hf_cuts_bs_to_ds_pi::Cuts[0], hf_cuts_bs_to_ds_pi::NBinsPt, hf_cuts_bs_to_ds_pi::NCutVars, hf_cuts_bs_to_ds_pi::labelsPt, hf_cuts_bs_to_ds_pi::labelsCutVar}, "Bs candidate selection per pT bin"}; // QA switch Configurable activateQA{"activateQA", false, "Flag to enable QA histogram"}; // ML inference Configurable applyMl{"applyMl", false, "Flag to apply ML selections"}; Configurable> binsPtMl{"binsPtMl", std::vector{hf_cuts_ml::vecBinsPt}, "pT bin limits for ML application"}; Configurable> cutDirMl{"cutDirMl", std::vector{hf_cuts_ml::vecCutDir}, "Whether to reject score values greater or smaller than the threshold"}; - Configurable> cutsMl{"cutsMl", {hf_cuts_ml::cuts[0], hf_cuts_ml::nBinsPt, hf_cuts_ml::nCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; - Configurable nClassesMl{"nClassesMl", static_cast(hf_cuts_ml::nCutScores), "Number of classes in ML model"}; + Configurable> cutsMl{"cutsMl", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; + Configurable nClassesMl{"nClassesMl", static_cast(hf_cuts_ml::NCutScores), "Number of classes in ML model"}; // CCDB configuration Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Configurable> modelPathsCCDB{"modelPathsCCDB", std::vector{"EventFiltering/PWGHF/BDTBs"}, "Paths of models on CCDB"}; diff --git a/PWGHF/TableProducer/candidateSelectorD0.cxx b/PWGHF/TableProducer/candidateSelectorD0.cxx index 88a8fb017b3..75c61745e7c 100644 --- a/PWGHF/TableProducer/candidateSelectorD0.cxx +++ b/PWGHF/TableProducer/candidateSelectorD0.cxx @@ -61,13 +61,13 @@ struct HfCandidateSelectorD0 { Configurable distanceFromD0MassForSidebands{"distanceFromD0MassForSidebands", 0.15, "Minimum distance from nominal D0 mass value for sideband region"}; // topological cuts Configurable> binsPt{"binsPt", std::vector{hf_cuts_d0_to_pi_k::vecBinsPt}, "pT bin limits"}; - Configurable> cuts{"cuts", {hf_cuts_d0_to_pi_k::cuts[0], hf_cuts_d0_to_pi_k::nBinsPt, hf_cuts_d0_to_pi_k::nCutVars, hf_cuts_d0_to_pi_k::labelsPt, hf_cuts_d0_to_pi_k::labelsCutVar}, "D0 candidate selection per pT bin"}; + Configurable> cuts{"cuts", {hf_cuts_d0_to_pi_k::Cuts[0], hf_cuts_d0_to_pi_k::NBinsPt, hf_cuts_d0_to_pi_k::NCutVars, hf_cuts_d0_to_pi_k::labelsPt, hf_cuts_d0_to_pi_k::labelsCutVar}, "D0 candidate selection per pT bin"}; // ML inference Configurable applyMl{"applyMl", false, "Flag to apply ML selections"}; Configurable> binsPtMl{"binsPtMl", std::vector{hf_cuts_ml::vecBinsPt}, "pT bin limits for ML application"}; Configurable> cutDirMl{"cutDirMl", std::vector{hf_cuts_ml::vecCutDir}, "Whether to reject score values greater or smaller than the threshold"}; - Configurable> cutsMl{"cutsMl", {hf_cuts_ml::cuts[0], hf_cuts_ml::nBinsPt, hf_cuts_ml::nCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; - Configurable nClassesMl{"nClassesMl", static_cast(hf_cuts_ml::nCutScores), "Number of classes in ML model"}; + Configurable> cutsMl{"cutsMl", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; + Configurable nClassesMl{"nClassesMl", static_cast(hf_cuts_ml::NCutScores), "Number of classes in ML model"}; Configurable enableDebugMl{"enableDebugMl", false, "Flag to enable histograms to monitor BDT application"}; Configurable> namesInputFeatures{"namesInputFeatures", std::vector{"feature1", "feature2"}, "Names of ML model input features"}; // CCDB configuration diff --git a/PWGHF/TableProducer/candidateSelectorDplusToPiKPi.cxx b/PWGHF/TableProducer/candidateSelectorDplusToPiKPi.cxx index d6d607ba9c4..776596c9df8 100644 --- a/PWGHF/TableProducer/candidateSelectorDplusToPiKPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorDplusToPiKPi.cxx @@ -57,9 +57,9 @@ struct HfCandidateSelectorDplusToPiKPi { Configurable usePidTpcAndTof{"usePidTpcAndTof", false, "Use AND logic for TPC and TOF PID"}; // topological cuts Configurable> binsPt{"binsPt", std::vector{hf_cuts_dplus_to_pi_k_pi::vecBinsPt}, "pT bin limits"}; - Configurable> cuts{"cuts", {hf_cuts_dplus_to_pi_k_pi::cuts[0], hf_cuts_dplus_to_pi_k_pi::nBinsPt, hf_cuts_dplus_to_pi_k_pi::nCutVars, hf_cuts_dplus_to_pi_k_pi::labelsPt, hf_cuts_dplus_to_pi_k_pi::labelsCutVar}, "Dplus candidate selection per pT bin"}; + Configurable> cuts{"cuts", {hf_cuts_dplus_to_pi_k_pi::Cuts[0], hf_cuts_dplus_to_pi_k_pi::NBinsPt, hf_cuts_dplus_to_pi_k_pi::NCutVars, hf_cuts_dplus_to_pi_k_pi::labelsPt, hf_cuts_dplus_to_pi_k_pi::labelsCutVar}, "Dplus candidate selection per pT bin"}; // DCAxy selections - Configurable> cutsSingleTrack{"cutsSingleTrack", {hf_cuts_single_track::cutsTrack[0], hf_cuts_single_track::nBinsPtTrack, hf_cuts_single_track::nCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections"}; + Configurable> cutsSingleTrack{"cutsSingleTrack", {hf_cuts_single_track::CutsTrack[0], hf_cuts_single_track::NBinsPtTrack, hf_cuts_single_track::NCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections"}; Configurable> binsPtTrack{"binsPtTrack", std::vector{hf_cuts_single_track::vecBinsPtTrack}, "track pT bin limits for DCA pT-dependent cut"}; // QA switch Configurable activateQA{"activateQA", false, "Flag to enable QA histogram"}; @@ -69,8 +69,8 @@ struct HfCandidateSelectorDplusToPiKPi { Configurable applyMl{"applyMl", false, "Flag to apply ML selections"}; Configurable> binsPtMl{"binsPtMl", std::vector{hf_cuts_ml::vecBinsPt}, "pT bin limits for ML application"}; Configurable> cutDirMl{"cutDirMl", std::vector{hf_cuts_ml::vecCutDir}, "Whether to reject score values greater or smaller than the threshold"}; - Configurable> cutsMl{"cutsMl", {hf_cuts_ml::cuts[0], hf_cuts_ml::nBinsPt, hf_cuts_ml::nCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; - Configurable nClassesMl{"nClassesMl", static_cast(hf_cuts_ml::nCutScores), "Number of classes in ML model"}; + Configurable> cutsMl{"cutsMl", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; + Configurable nClassesMl{"nClassesMl", static_cast(hf_cuts_ml::NCutScores), "Number of classes in ML model"}; Configurable> namesInputFeatures{"namesInputFeatures", std::vector{"feature1", "feature2"}, "Names of ML model input features"}; // CCDB configuration Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; diff --git a/PWGHF/TableProducer/candidateSelectorDsToKKPi.cxx b/PWGHF/TableProducer/candidateSelectorDsToKKPi.cxx index 6d00e6daee9..3fee66bf344 100644 --- a/PWGHF/TableProducer/candidateSelectorDsToKKPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorDsToKKPi.cxx @@ -55,11 +55,11 @@ struct HfCandidateSelectorDsToKKPi { Configurable usePidTpcAndTof{"usePidTpcAndTof", false, "Use AND logic for TPC and TOF PID"}; // topological cuts Configurable> binsPt{"binsPt", std::vector{hf_cuts_ds_to_k_k_pi::vecBinsPt}, "pT bin limits"}; - Configurable> cuts{"cuts", {hf_cuts_ds_to_k_k_pi::cuts[0], hf_cuts_ds_to_k_k_pi::nBinsPt, hf_cuts_ds_to_k_k_pi::nCutVars, hf_cuts_ds_to_k_k_pi::labelsPt, hf_cuts_ds_to_k_k_pi::labelsCutVar}, "Ds candidate selection per pT bin"}; + Configurable> cuts{"cuts", {hf_cuts_ds_to_k_k_pi::Cuts[0], hf_cuts_ds_to_k_k_pi::NBinsPt, hf_cuts_ds_to_k_k_pi::NCutVars, hf_cuts_ds_to_k_k_pi::labelsPt, hf_cuts_ds_to_k_k_pi::labelsCutVar}, "Ds candidate selection per pT bin"}; Configurable rejectCandsInDplusToPiKPiRegion{"rejectCandsInDplusToPiKPiRegion", false, "Flag to reject candidates in the D+ to PiKPi signal region"}; Configurable deltaMRegionDplusToPiKPi{"deltaMRegionDplusToPiKPi", 0.03, "Width of the D+ to PiKPi signal region (GeV/c^2)"}; // DCAxy and DCAz selections - Configurable> cutsSingleTrack{"cutsSingleTrack", {hf_cuts_single_track::cutsTrack[0], hf_cuts_single_track::nBinsPtTrack, hf_cuts_single_track::nCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections"}; + Configurable> cutsSingleTrack{"cutsSingleTrack", {hf_cuts_single_track::CutsTrack[0], hf_cuts_single_track::NBinsPtTrack, hf_cuts_single_track::NCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections"}; // pT bins for single-track cuts Configurable> binsPtTrack{"binsPtTrack", std::vector{hf_cuts_single_track::vecBinsPtTrack}, "track pT bin limits for DCA pT-dependent cut"}; // QA switch @@ -68,8 +68,8 @@ struct HfCandidateSelectorDsToKKPi { Configurable applyMl{"applyMl", false, "Flag to apply ML selections"}; Configurable> binsPtMl{"binsPtMl", std::vector{hf_cuts_ml::vecBinsPt}, "pT bin limits for ML application"}; Configurable> cutDirMl{"cutDirMl", std::vector{hf_cuts_ml::vecCutDir}, "Whether to reject score values greater or smaller than the threshold"}; - Configurable> cutsMl{"cutsMl", {hf_cuts_ml::cuts[0], hf_cuts_ml::nBinsPt, hf_cuts_ml::nCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; - Configurable nClassesMl{"nClassesMl", static_cast(hf_cuts_ml::nCutScores), "Number of classes in ML model"}; + Configurable> cutsMl{"cutsMl", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; + Configurable nClassesMl{"nClassesMl", static_cast(hf_cuts_ml::NCutScores), "Number of classes in ML model"}; Configurable> namesInputFeatures{"namesInputFeatures", std::vector{"feature1", "feature2"}, "Names of ML model input features"}; // CCDB configuration Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; diff --git a/PWGHF/TableProducer/candidateSelectorDstarToD0Pi.cxx b/PWGHF/TableProducer/candidateSelectorDstarToD0Pi.cxx index 90115a3f257..a94f510f01c 100644 --- a/PWGHF/TableProducer/candidateSelectorDstarToD0Pi.cxx +++ b/PWGHF/TableProducer/candidateSelectorDstarToD0Pi.cxx @@ -48,7 +48,7 @@ struct HfCandidateSelectorDstarToD0Pi { Configurable ptD0CandMin{"ptD0CandMin", 0., "Minimum D0 candidate pT"}; Configurable ptD0CandMax{"ptD0CandMax", 50., "Maximum D0 candidate pT"}; Configurable> binsPtD0{"binsPtD0", std::vector{hf_cuts_d0_to_pi_k::vecBinsPt}, "pT bin limits for D0"}; - Configurable> cutsD0{"cutsD0", {hf_cuts_d0_to_pi_k::cuts[0], hf_cuts_d0_to_pi_k::nBinsPt, hf_cuts_d0_to_pi_k::nCutVars, hf_cuts_d0_to_pi_k::labelsPt, hf_cuts_d0_to_pi_k::labelsCutVar}, "D0 candidate selection per pT bin"}; + Configurable> cutsD0{"cutsD0", {hf_cuts_d0_to_pi_k::Cuts[0], hf_cuts_d0_to_pi_k::NBinsPt, hf_cuts_d0_to_pi_k::NCutVars, hf_cuts_d0_to_pi_k::labelsPt, hf_cuts_d0_to_pi_k::labelsCutVar}, "D0 candidate selection per pT bin"}; // Mass Cut for trigger analysis Configurable useTriggerMassCut{"useTriggerMassCut", false, "Flag to enable parametrize pT differential mass cut for triggered data"}; @@ -56,7 +56,7 @@ struct HfCandidateSelectorDstarToD0Pi { Configurable ptDstarCandMin{"ptDstarCandMin", 0., "Minimum Dstar candidate pT"}; Configurable ptDstarCandMax{"ptDstarCandMax", 50., "Maximum Dstar candidate pT"}; Configurable> binsPtDstar{"binsPtDstar", std::vector{hf_cuts_dstar_to_d0_pi::vecBinsPt}, "pT bin limits for Dstar"}; - Configurable> cutsDstar{"cutsDstar", {hf_cuts_dstar_to_d0_pi::cuts[0], hf_cuts_dstar_to_d0_pi::nBinsPt, hf_cuts_dstar_to_d0_pi::nCutVars, hf_cuts_dstar_to_d0_pi::labelsPt, hf_cuts_dstar_to_d0_pi::labelsCutVar}, "Dstar candidate selection per pT bin"}; + Configurable> cutsDstar{"cutsDstar", {hf_cuts_dstar_to_d0_pi::Cuts[0], hf_cuts_dstar_to_d0_pi::NBinsPt, hf_cuts_dstar_to_d0_pi::NCutVars, hf_cuts_dstar_to_d0_pi::labelsPt, hf_cuts_dstar_to_d0_pi::labelsCutVar}, "Dstar candidate selection per pT bin"}; // common Configurable // TPC PID @@ -84,8 +84,8 @@ struct HfCandidateSelectorDstarToD0Pi { Configurable applyMl{"applyMl", false, "Flag to apply ML selections"}; Configurable> binsPtMl{"binsPtMl", std::vector{hf_cuts_ml::vecBinsPt}, "pT bin limits for ML application"}; Configurable> cutDirMl{"cutDirMl", std::vector{hf_cuts_ml::vecCutDir}, "Whether to reject score values greater or smaller than the threshold"}; - Configurable> cutsMl{"cutsMl", {hf_cuts_ml::cuts[0], hf_cuts_ml::nBinsPt, hf_cuts_ml::nCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; - Configurable nClassesMl{"nClassesMl", static_cast(hf_cuts_ml::nCutScores), "Number of classes in ML model"}; + Configurable> cutsMl{"cutsMl", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; + Configurable nClassesMl{"nClassesMl", static_cast(hf_cuts_ml::NCutScores), "Number of classes in ML model"}; Configurable> namesInputFeatures{"namesInputFeatures", std::vector{"feature1", "feature2"}, "Names of ML model input features"}; // CCDB configuration diff --git a/PWGHF/TableProducer/candidateSelectorLbToLcPi.cxx b/PWGHF/TableProducer/candidateSelectorLbToLcPi.cxx index c9c4f771c4c..afd1f4cf796 100644 --- a/PWGHF/TableProducer/candidateSelectorLbToLcPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorLbToLcPi.cxx @@ -53,7 +53,7 @@ struct HfCandidateSelectorLbToLcPi { Configurable maxDecayLengthError{"maxDecayLengthError", 0.015, "decay length error quality selection"}; Configurable maxDecayLengthXYError{"maxDecayLengthXYError", 0.01, "decay length xy error quality selection"}; Configurable maxVertexDistanceLbLc{"maxVertexDistanceLbLc", 0.05, "maximum distance between Lb and Lc vertex"}; - Configurable> cuts{"cuts", {hf_cuts_lb_to_lc_pi::cuts[0], hf_cuts_lb_to_lc_pi::nBinsPt, hf_cuts_lb_to_lc_pi::nCutVars, hf_cuts_lb_to_lc_pi::labelsPt, hf_cuts_lb_to_lc_pi::labelsCutVar}, "Lb0 candidate selection per pT bin"}; + Configurable> cuts{"cuts", {hf_cuts_lb_to_lc_pi::Cuts[0], hf_cuts_lb_to_lc_pi::NBinsPt, hf_cuts_lb_to_lc_pi::NCutVars, hf_cuts_lb_to_lc_pi::labelsPt, hf_cuts_lb_to_lc_pi::labelsCutVar}, "Lb0 candidate selection per pT bin"}; Configurable selectionFlagLc{"selectionFlagLc", 1, "Selection Flag for Lc+"}; HfHelper hfHelper; diff --git a/PWGHF/TableProducer/candidateSelectorLc.cxx b/PWGHF/TableProducer/candidateSelectorLc.cxx index eacc06a872c..0585fd66b5f 100644 --- a/PWGHF/TableProducer/candidateSelectorLc.cxx +++ b/PWGHF/TableProducer/candidateSelectorLc.cxx @@ -69,18 +69,18 @@ struct HfCandidateSelectorLc { Configurable itsChi2PerClusterMax{"itsChi2PerClusterMax", 1e10f, "max its fit chi2 per ITS cluster"}; // DCA track cuts Configurable> binsPtTrack{"binsPtTrack", std::vector{hf_cuts_single_track::vecBinsPtTrack}, "track pT bin limits for DCA XY/Z pT-dependent cut"}; - Configurable> cutsSingleTrack{"cutsSingleTrack", {hf_cuts_single_track::cutsTrack[0], hf_cuts_single_track::nBinsPtTrack, hf_cuts_single_track::nCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections"}; + Configurable> cutsSingleTrack{"cutsSingleTrack", {hf_cuts_single_track::CutsTrack[0], hf_cuts_single_track::NBinsPtTrack, hf_cuts_single_track::NCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections"}; // topological cuts Configurable> binsPt{"binsPt", std::vector{hf_cuts_lc_to_p_k_pi::vecBinsPt}, "pT bin limits"}; - Configurable> cuts{"cuts", {hf_cuts_lc_to_p_k_pi::cuts[0], hf_cuts_lc_to_p_k_pi::nBinsPt, hf_cuts_lc_to_p_k_pi::nCutVars, hf_cuts_lc_to_p_k_pi::labelsPt, hf_cuts_lc_to_p_k_pi::labelsCutVar}, "Lc candidate selection per pT bin"}; + Configurable> cuts{"cuts", {hf_cuts_lc_to_p_k_pi::Cuts[0], hf_cuts_lc_to_p_k_pi::NBinsPt, hf_cuts_lc_to_p_k_pi::NCutVars, hf_cuts_lc_to_p_k_pi::labelsPt, hf_cuts_lc_to_p_k_pi::labelsCutVar}, "Lc candidate selection per pT bin"}; // QA switch Configurable activateQA{"activateQA", false, "Flag to enable QA histogram"}; // ML inference Configurable applyMl{"applyMl", false, "Flag to apply ML selections"}; Configurable> binsPtMl{"binsPtMl", std::vector{hf_cuts_ml::vecBinsPt}, "pT bin limits for ML application"}; Configurable> cutDirMl{"cutDirMl", std::vector{hf_cuts_ml::vecCutDir}, "Whether to reject score values greater or smaller than the threshold"}; - Configurable> cutsMl{"cutsMl", {hf_cuts_ml::cuts[0], hf_cuts_ml::nBinsPt, hf_cuts_ml::nCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; - Configurable nClassesMl{"nClassesMl", static_cast(hf_cuts_ml::nCutScores), "Number of classes in ML model"}; + Configurable> cutsMl{"cutsMl", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; + Configurable nClassesMl{"nClassesMl", static_cast(hf_cuts_ml::NCutScores), "Number of classes in ML model"}; Configurable> namesInputFeatures{"namesInputFeatures", std::vector{"feature1", "feature2"}, "Names of ML model input features"}; // CCDB configuration Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; diff --git a/PWGHF/TableProducer/candidateSelectorLcPidMl.cxx b/PWGHF/TableProducer/candidateSelectorLcPidMl.cxx index 6da79ccc898..2e127ff2829 100644 --- a/PWGHF/TableProducer/candidateSelectorLcPidMl.cxx +++ b/PWGHF/TableProducer/candidateSelectorLcPidMl.cxx @@ -65,7 +65,7 @@ struct HfCandidateSelectorLcPidMl { // ONNX BDT Configurable applyML{"applyML", false, "Flag to enable or disable ML application"}; Configurable onnxFileLcToPiKPConf{"onnxFileLcToPiKPConf", "/cvmfs/alice.cern.ch/data/analysis/2022/vAN-20220818/PWGHF/o2/trigger/ModelHandler_onnx_LcToPKPi.onnx", "ONNX file for ML model for Lc+ candidates"}; - Configurable> thresholdBDTScoreLcToPiKP{"thresholdBDTScoreLcToPiKP", {hf_cuts_bdt_multiclass::cuts[0], hf_cuts_bdt_multiclass::nBinsPt, hf_cuts_bdt_multiclass::nCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for BDT output scores of Lc+ candidates"}; + Configurable> thresholdBDTScoreLcToPiKP{"thresholdBDTScoreLcToPiKP", {hf_cuts_bdt_multiclass::Cuts[0], hf_cuts_bdt_multiclass::NBinsPt, hf_cuts_bdt_multiclass::NCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for BDT output scores of Lc+ candidates"}; Configurable url{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Configurable mlModelPathCCDB{"mlModelPathCCDB", "Analysis/PWGHF/ML/HFTrigger/Lc", "Path on CCDB"}; diff --git a/PWGHF/TableProducer/candidateSelectorLcToK0sP.cxx b/PWGHF/TableProducer/candidateSelectorLcToK0sP.cxx index c7b17972b8f..f1e52a18a94 100644 --- a/PWGHF/TableProducer/candidateSelectorLcToK0sP.cxx +++ b/PWGHF/TableProducer/candidateSelectorLcToK0sP.cxx @@ -59,13 +59,13 @@ struct HfCandidateSelectorLcToK0sP { Configurable probBayesMinHighP{"probBayesMinHighP", 0.8, "min. Bayes probability for bachelor at high p [%]"}; // topological cuts Configurable> binsPt{"binsPt", std::vector{hf_cuts_lc_to_k0s_p::vecBinsPt}, "pT bin limits"}; - Configurable> cuts{"cuts", {hf_cuts_lc_to_k0s_p::cuts[0], hf_cuts_lc_to_k0s_p::nBinsPt, hf_cuts_lc_to_k0s_p::nCutVars, hf_cuts_lc_to_k0s_p::labelsPt, hf_cuts_lc_to_k0s_p::labelsCutVar}, "Lc candidate selection per pT bin"}; + Configurable> cuts{"cuts", {hf_cuts_lc_to_k0s_p::Cuts[0], hf_cuts_lc_to_k0s_p::NBinsPt, hf_cuts_lc_to_k0s_p::NCutVars, hf_cuts_lc_to_k0s_p::labelsPt, hf_cuts_lc_to_k0s_p::labelsCutVar}, "Lc candidate selection per pT bin"}; // ML inference Configurable applyMl{"applyMl", false, "Flag to apply ML selections"}; Configurable> binsPtMl{"binsPtMl", std::vector{hf_cuts_ml::vecBinsPt}, "pT bin limits for ML application"}; Configurable> cutDirMl{"cutDirMl", std::vector{hf_cuts_ml::vecCutDir}, "Whether to reject score values greater or smaller than the threshold"}; - Configurable> cutsMl{"cutsMl", {hf_cuts_ml::cuts[0], hf_cuts_ml::nBinsPt, hf_cuts_ml::nCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; - Configurable nClassesMl{"nClassesMl", static_cast(hf_cuts_ml::nCutScores), "Number of classes in ML model"}; + Configurable> cutsMl{"cutsMl", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; + Configurable nClassesMl{"nClassesMl", static_cast(hf_cuts_ml::NCutScores), "Number of classes in ML model"}; Configurable> namesInputFeatures{"namesInputFeatures", std::vector{"feature1", "feature2"}, "Names of ML model input features"}; // CCDB configuration Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; diff --git a/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx b/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx index d5937319f77..26b297ba8bd 100644 --- a/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx @@ -157,13 +157,13 @@ struct HfCandidateSelectorToOmegaPi { } KfconfigurableGroup; // topological cuts Configurable> binsPt{"binsPt", std::vector{hf_cuts_omegac_to_omega_pi::vecBinsPt}, "pT bin limits"}; - Configurable> cuts{"cuts", {hf_cuts_omegac_to_omega_pi::cuts[0], hf_cuts_omegac_to_omega_pi::nBinsPt, hf_cuts_omegac_to_omega_pi::nCutVars, hf_cuts_omegac_to_omega_pi::labelsPt, hf_cuts_omegac_to_omega_pi::labelsCutVar}, "OmegaC0 candidate selection per pT bin"}; + Configurable> cuts{"cuts", {hf_cuts_omegac_to_omega_pi::Cuts[0], hf_cuts_omegac_to_omega_pi::NBinsPt, hf_cuts_omegac_to_omega_pi::NCutVars, hf_cuts_omegac_to_omega_pi::labelsPt, hf_cuts_omegac_to_omega_pi::labelsCutVar}, "OmegaC0 candidate selection per pT bin"}; // ML inference Configurable applyMl{"applyMl", false, "Flag to apply ML selections"}; Configurable> binsPtMl{"binsPtMl", std::vector{hf_cuts_ml::vecBinsPt}, "pT bin limits for ML application"}; Configurable> cutDirMl{"cutDirMl", std::vector{hf_cuts_ml::vecCutDir}, "Whether to reject score values greater or smaller than the threshold"}; - Configurable> cutsMl{"cutsMl", {hf_cuts_ml::cuts[0], hf_cuts_ml::nBinsPt, hf_cuts_ml::nCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; - Configurable nClassesMl{"nClassesMl", (int8_t)hf_cuts_ml::nCutScores, "Number of classes in ML model"}; + Configurable> cutsMl{"cutsMl", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; + Configurable nClassesMl{"nClassesMl", static_cast(hf_cuts_ml::NCutScores), "Number of classes in ML model"}; Configurable> namesInputFeatures{"namesInputFeaturesW", std::vector{"feature1", "feature2"}, "Names of ML model input features"}; // CCDB configuration Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; @@ -546,7 +546,7 @@ struct HfCandidateSelectorToOmegaPi { } // Omegac ctau selsection - if (candidate.ctauOmegac() > KfconfigurableGroup.cTauOmegacMax) { + if (candidate.cTauOmegac() > KfconfigurableGroup.cTauOmegacMax) { resultSelections = false; registry.fill(HIST("hSelctauOmegac"), 0); } else { diff --git a/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx b/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx index e77936a6fa5..1b005b89d4e 100644 --- a/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx @@ -59,13 +59,13 @@ struct HfCandidateSelectorXicToPKPi { // topological cuts Configurable decayLengthXYNormalisedMin{"decayLengthXYNormalisedMin", 3., "Min. normalised decay length XY"}; Configurable> binsPt{"binsPt", std::vector{hf_cuts_xic_to_p_k_pi::vecBinsPt}, "pT bin limits"}; - Configurable> cuts{"cuts", {hf_cuts_xic_to_p_k_pi::cuts[0], hf_cuts_xic_to_p_k_pi::nBinsPt, hf_cuts_xic_to_p_k_pi::nCutVars, hf_cuts_xic_to_p_k_pi::labelsPt, hf_cuts_xic_to_p_k_pi::labelsCutVar}, "Xic candidate selection per pT bin"}; + Configurable> cuts{"cuts", {hf_cuts_xic_to_p_k_pi::Cuts[0], hf_cuts_xic_to_p_k_pi::NBinsPt, hf_cuts_xic_to_p_k_pi::NCutVars, hf_cuts_xic_to_p_k_pi::labelsPt, hf_cuts_xic_to_p_k_pi::labelsCutVar}, "Xic candidate selection per pT bin"}; // ML inference Configurable applyMl{"applyMl", false, "Flag to apply ML selections"}; Configurable> binsPtMl{"binsPtMl", std::vector{hf_cuts_ml::vecBinsPt}, "pT bin limits for ML application"}; Configurable> cutDirMl{"cutDirMl", std::vector{hf_cuts_ml::vecCutDir}, "Whether to reject score values greater or smaller than the threshold"}; - Configurable> cutsMl{"cutsMl", {hf_cuts_ml::cuts[0], hf_cuts_ml::nBinsPt, hf_cuts_ml::nCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; - Configurable nClassesMl{"nClassesMl", static_cast(hf_cuts_ml::nCutScores), "Number of classes in ML model"}; + Configurable> cutsMl{"cutsMl", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; + Configurable nClassesMl{"nClassesMl", static_cast(hf_cuts_ml::NCutScores), "Number of classes in ML model"}; Configurable> namesInputFeatures{"namesInputFeatures", std::vector{"feature1", "feature2"}, "Names of ML model input features"}; // CCDB configuration Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; diff --git a/PWGHF/TableProducer/candidateSelectorXicToXiPiPi.cxx b/PWGHF/TableProducer/candidateSelectorXicToXiPiPi.cxx index a2191501706..745a881d7ad 100644 --- a/PWGHF/TableProducer/candidateSelectorXicToXiPiPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorXicToXiPiPi.cxx @@ -42,7 +42,7 @@ struct HfCandidateSelectorXicToXiPiPi { Configurable ptCandMax{"ptCandMax", 36., "Upper bound of candidate pT"}; // topological cuts Configurable> binsPt{"binsPt", std::vector{hf_cuts_xic_to_xi_pi_pi::vecBinsPt}, "pT bin limits"}; - Configurable> cuts{"cuts", {hf_cuts_xic_to_xi_pi_pi::cuts[0], hf_cuts_xic_to_xi_pi_pi::nBinsPt, hf_cuts_xic_to_xi_pi_pi::nCutVars, hf_cuts_xic_to_xi_pi_pi::labelsPt, hf_cuts_xic_to_xi_pi_pi::labelsCutVar}, "Xicplus candidate selection per pT bin"}; + Configurable> cuts{"cuts", {hf_cuts_xic_to_xi_pi_pi::Cuts[0], hf_cuts_xic_to_xi_pi_pi::NBinsPt, hf_cuts_xic_to_xi_pi_pi::NCutVars, hf_cuts_xic_to_xi_pi_pi::labelsPt, hf_cuts_xic_to_xi_pi_pi::labelsCutVar}, "Xicplus candidate selection per pT bin"}; // QA switch Configurable activateQA{"activateQA", false, "Flag to enable QA histogram"}; // Enable PID @@ -62,8 +62,8 @@ struct HfCandidateSelectorXicToXiPiPi { Configurable applyMl{"applyMl", false, "Flag to apply ML selections"}; Configurable> binsPtMl{"binsPtMl", std::vector{hf_cuts_ml::vecBinsPt}, "pT bin limits for ML application"}; Configurable> cutDirMl{"cutDirMl", std::vector{hf_cuts_ml::vecCutDir}, "Whether to reject score values greater or smaller than the threshold"}; - Configurable> cutsMl{"cutsMl", {hf_cuts_ml::cuts[0], hf_cuts_ml::nBinsPt, hf_cuts_ml::nCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; - Configurable nClassesMl{"nClassesMl", (int8_t)hf_cuts_ml::nCutScores, "Number of classes in ML model"}; + Configurable> cutsMl{"cutsMl", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; + Configurable nClassesMl{"nClassesMl", static_cast(hf_cuts_ml::NCutScores), "Number of classes in ML model"}; Configurable> namesInputFeatures{"namesInputFeatures", std::vector{"feature1", "feature2"}, "Names of ML model input features"}; // CCDB configuration Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; @@ -231,7 +231,7 @@ struct HfCandidateSelectorXicToXiPiPi { registry.fill(HIST("hSelections"), 1, ptCandXic); } - // No hfFlag -> by default skim selected + // No hfflag -> by default skim selected SETBIT(statusXicToXiPiPi, SelectionStep::RecoSkims); // RecoSkims = 0 --> statusXicToXiPiPi = 1 if (activateQA) { registry.fill(HIST("hSelections"), 2 + SelectionStep::RecoSkims, ptCandXic); diff --git a/PWGHF/TableProducer/candidateSelectorXiccToPKPiPi.cxx b/PWGHF/TableProducer/candidateSelectorXiccToPKPiPi.cxx index b164b409d13..28e0035f39c 100644 --- a/PWGHF/TableProducer/candidateSelectorXiccToPKPiPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorXiccToPKPiPi.cxx @@ -49,7 +49,7 @@ struct HfCandidateSelectorXiccToPKPiPi { Configurable nSigmaTofCombinedMax{"nSigmaTofCombinedMax", 5., "Nsigma cut on TOF combined with TPC"}; // topological cuts Configurable> binsPt{"binsPt", std::vector{hf_cuts_xicc_to_p_k_pi_pi::vecBinsPt}, "pT bin limits"}; - Configurable> cuts{"cuts", {hf_cuts_xicc_to_p_k_pi_pi::cuts[0], hf_cuts_xicc_to_p_k_pi_pi::nBinsPt, hf_cuts_xicc_to_p_k_pi_pi::nCutVars, hf_cuts_xicc_to_p_k_pi_pi::labelsPt, hf_cuts_xicc_to_p_k_pi_pi::labelsCutVar}, "Xicc candidate selection per pT bin"}; + Configurable> cuts{"cuts", {hf_cuts_xicc_to_p_k_pi_pi::Cuts[0], hf_cuts_xicc_to_p_k_pi_pi::NBinsPt, hf_cuts_xicc_to_p_k_pi_pi::NCutVars, hf_cuts_xicc_to_p_k_pi_pi::labelsPt, hf_cuts_xicc_to_p_k_pi_pi::labelsCutVar}, "Xicc candidate selection per pT bin"}; HfHelper hfHelper; TrackSelectorPi selectorPion; diff --git a/PWGHF/TableProducer/trackIndexSkimCreator.cxx b/PWGHF/TableProducer/trackIndexSkimCreator.cxx index 5548863ac6c..cd696ccac09 100644 --- a/PWGHF/TableProducer/trackIndexSkimCreator.cxx +++ b/PWGHF/TableProducer/trackIndexSkimCreator.cxx @@ -219,22 +219,22 @@ struct HfTrackIndexSkimCreatorTagSelTracks { Configurable> binsPtTrack{"binsPtTrack", std::vector{hf_cuts_single_track::vecBinsPtTrack}, "track pT bin limits for 2-prong DCA XY pT-dependent cut"}; // 2-prong cuts Configurable ptMinTrack2Prong{"ptMinTrack2Prong", -1., "min. track pT for 2 prong candidate"}; - Configurable> cutsTrack2Prong{"cutsTrack2Prong", {hf_cuts_single_track::cutsTrack[0], hf_cuts_single_track::nBinsPtTrack, hf_cuts_single_track::nCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for 2-prong candidates"}; + Configurable> cutsTrack2Prong{"cutsTrack2Prong", {hf_cuts_single_track::CutsTrack[0], hf_cuts_single_track::NBinsPtTrack, hf_cuts_single_track::NCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for 2-prong candidates"}; Configurable etaMinTrack2Prong{"etaMinTrack2Prong", -99999., "min. pseudorapidity for 2 prong candidate"}; Configurable etaMaxTrack2Prong{"etaMaxTrack2Prong", 4., "max. pseudorapidity for 2 prong candidate"}; // 3-prong cuts Configurable ptMinTrack3Prong{"ptMinTrack3Prong", -1., "min. track pT for 3 prong candidate"}; - Configurable> cutsTrack3Prong{"cutsTrack3Prong", {hf_cuts_single_track::cutsTrack[0], hf_cuts_single_track::nBinsPtTrack, hf_cuts_single_track::nCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for 3-prong candidates"}; + Configurable> cutsTrack3Prong{"cutsTrack3Prong", {hf_cuts_single_track::CutsTrack[0], hf_cuts_single_track::NBinsPtTrack, hf_cuts_single_track::NCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for 3-prong candidates"}; Configurable etaMinTrack3Prong{"etaMinTrack3Prong", -99999., "min. pseudorapidity for 3 prong candidate"}; Configurable etaMaxTrack3Prong{"etaMaxTrack3Prong", 4., "max. pseudorapidity for 3 prong candidate"}; // bachelor cuts (V0 + bachelor decays) Configurable ptMinTrackBach{"ptMinTrackBach", 0.3, "min. track pT for bachelor in cascade candidate"}; // 0.5 for PbPb 2015? - Configurable> cutsTrackBach{"cutsTrackBach", {hf_cuts_single_track::cutsTrack[0], hf_cuts_single_track::nBinsPtTrack, hf_cuts_single_track::nCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for the bachelor of V0-bachelor candidates"}; + Configurable> cutsTrackBach{"cutsTrackBach", {hf_cuts_single_track::CutsTrack[0], hf_cuts_single_track::NBinsPtTrack, hf_cuts_single_track::NCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for the bachelor of V0-bachelor candidates"}; Configurable etaMinTrackBach{"etaMinTrackBach", -99999., "min. pseudorapidity for bachelor in cascade candidate"}; Configurable etaMaxTrackBach{"etaMaxTrackBach", 0.8, "max. pseudorapidity for bachelor in cascade candidate"}; // bachelor cuts (cascade + bachelor decays) Configurable ptMinTrackBachLfCasc{"ptMinTrackBachLfCasc", 0.1, "min. track pT for bachelor in cascade + bachelor decays"}; // 0.5 for PbPb 2015? - Configurable> cutsTrackBachLfCasc{"cutsTrackBachLfCasc", {hf_cuts_single_track::cutsTrack[0], hf_cuts_single_track::nBinsPtTrack, hf_cuts_single_track::nCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for the bachelor in cascade + bachelor decays"}; + Configurable> cutsTrackBachLfCasc{"cutsTrackBachLfCasc", {hf_cuts_single_track::CutsTrack[0], hf_cuts_single_track::NBinsPtTrack, hf_cuts_single_track::NCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for the bachelor in cascade + bachelor decays"}; Configurable etaMinTrackBachLfCasc{"etaMinTrackBachLfCasc", -99999., "min. pseudorapidity for bachelor in cascade + bachelor decays"}; Configurable etaMaxTrackBachLfCasc{"etaMaxTrackBachLfCasc", 1.1, "max. pseudorapidity for bachelor in cascade + bachelor decays"}; Configurable useIsGlobalTrackForBachLfCasc{"useIsGlobalTrackForBachLfCasc", false, "check isGlobalTrack status for bachelor in cascade + bachelor decays"}; @@ -244,12 +244,12 @@ struct HfTrackIndexSkimCreatorTagSelTracks { Configurable ptMinSoftPionForDstar{"ptMinSoftPionForDstar", 0.05, "min. track pT for soft pion in D* candidate"}; Configurable etaMinSoftPionForDstar{"etaMinSoftPionForDstar", -99999., "min. pseudorapidity for soft pion in D* candidate"}; Configurable etaMaxSoftPionForDstar{"etaMaxSoftPionForDstar", 0.8, "max. pseudorapidity for soft pion in D* candidate"}; - Configurable> cutsTrackDstar{"cutsTrackDstar", {hf_cuts_single_track::cutsTrackPrimary[0], hf_cuts_single_track::nBinsPtTrack, hf_cuts_single_track::nCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for the soft pion of D* candidates"}; + Configurable> cutsTrackDstar{"cutsTrackDstar", {hf_cuts_single_track::CutsTrackPrimary[0], hf_cuts_single_track::NBinsPtTrack, hf_cuts_single_track::NCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for the soft pion of D* candidates"}; Configurable useIsGlobalTrackForSoftPion{"useIsGlobalTrackForSoftPion", false, "check isGlobalTrack status for soft pion tracks"}; Configurable useIsGlobalTrackWoDCAForSoftPion{"useIsGlobalTrackWoDCAForSoftPion", false, "check isGlobalTrackWoDCA status for soft pion tracks"}; Configurable useIsQualityTrackITSForSoftPion{"useIsQualityTrackITSForSoftPion", true, "check qualityTracksITS status for soft pion tracks"}; // proton PID, applied only if corresponding process function enabled - Configurable> selectionsPid{"selectionsPid", {hf_presel_pid::cutsPid[0], 4, 6, hf_presel_pid::labelsRowsPid, hf_presel_pid::labelsCutsPid}, "PID selections for proton / kaon applied if proper process function enabled"}; + Configurable> selectionsPid{"selectionsPid", {hf_presel_pid::CutsPid[0], 4, 6, hf_presel_pid::labelsRowsPid, hf_presel_pid::labelsCutsPid}, "PID selections for proton / kaon applied if proper process function enabled"}; // CCDB Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Configurable ccdbPathLut{"ccdbPathLut", "GLO/Param/MatLUT", "Path for LUT parametrization"}; @@ -1159,28 +1159,28 @@ struct HfTrackIndexSkimCreator { // D0 cuts Configurable> binsPtD0ToPiK{"binsPtD0ToPiK", std::vector{hf_cuts_presel_2prong::vecBinsPt}, "pT bin limits for D0->piK pT-dependent cuts"}; - Configurable> cutsD0ToPiK{"cutsD0ToPiK", {hf_cuts_presel_2prong::cuts[0], hf_cuts_presel_2prong::nBinsPt, hf_cuts_presel_2prong::nCutVars, hf_cuts_presel_2prong::labelsPt, hf_cuts_presel_2prong::labelsCutVar}, "D0->piK selections per pT bin"}; + Configurable> cutsD0ToPiK{"cutsD0ToPiK", {hf_cuts_presel_2prong::Cuts[0], hf_cuts_presel_2prong::NBinsPt, hf_cuts_presel_2prong::NCutVars, hf_cuts_presel_2prong::labelsPt, hf_cuts_presel_2prong::labelsCutVar}, "D0->piK selections per pT bin"}; // Jpsi -> ee cuts Configurable> binsPtJpsiToEE{"binsPtJpsiToEE", std::vector{hf_cuts_presel_2prong::vecBinsPt}, "pT bin limits for Jpsi->ee pT-dependent cuts"}; - Configurable> cutsJpsiToEE{"cutsJpsiToEE", {hf_cuts_presel_2prong::cuts[0], hf_cuts_presel_2prong::nBinsPt, hf_cuts_presel_2prong::nCutVars, hf_cuts_presel_2prong::labelsPt, hf_cuts_presel_2prong::labelsCutVar}, "Jpsi->ee selections per pT bin"}; + Configurable> cutsJpsiToEE{"cutsJpsiToEE", {hf_cuts_presel_2prong::Cuts[0], hf_cuts_presel_2prong::NBinsPt, hf_cuts_presel_2prong::NCutVars, hf_cuts_presel_2prong::labelsPt, hf_cuts_presel_2prong::labelsCutVar}, "Jpsi->ee selections per pT bin"}; // Jpsi -> mumu cuts Configurable> binsPtJpsiToMuMu{"binsPtJpsiToMuMu", std::vector{hf_cuts_presel_2prong::vecBinsPt}, "pT bin limits for Jpsi->mumu pT-dependent cuts"}; - Configurable> cutsJpsiToMuMu{"cutsJpsiToMuMu", {hf_cuts_presel_2prong::cuts[0], hf_cuts_presel_2prong::nBinsPt, hf_cuts_presel_2prong::nCutVars, hf_cuts_presel_2prong::labelsPt, hf_cuts_presel_2prong::labelsCutVar}, "Jpsi->mumu selections per pT bin"}; + Configurable> cutsJpsiToMuMu{"cutsJpsiToMuMu", {hf_cuts_presel_2prong::Cuts[0], hf_cuts_presel_2prong::NBinsPt, hf_cuts_presel_2prong::NCutVars, hf_cuts_presel_2prong::labelsPt, hf_cuts_presel_2prong::labelsCutVar}, "Jpsi->mumu selections per pT bin"}; // D+ cuts Configurable> binsPtDplusToPiKPi{"binsPtDplusToPiKPi", std::vector{hf_cuts_presel_3prong::vecBinsPt}, "pT bin limits for D+->piKpi pT-dependent cuts"}; - Configurable> cutsDplusToPiKPi{"cutsDplusToPiKPi", {hf_cuts_presel_3prong::cuts[0], hf_cuts_presel_3prong::nBinsPt, hf_cuts_presel_3prong::nCutVars, hf_cuts_presel_3prong::labelsPt, hf_cuts_presel_3prong::labelsCutVar}, "D+->piKpi selections per pT bin"}; + Configurable> cutsDplusToPiKPi{"cutsDplusToPiKPi", {hf_cuts_presel_3prong::Cuts[0], hf_cuts_presel_3prong::NBinsPt, hf_cuts_presel_3prong::NCutVars, hf_cuts_presel_3prong::labelsPt, hf_cuts_presel_3prong::labelsCutVar}, "D+->piKpi selections per pT bin"}; // Ds+ cuts Configurable> binsPtDsToKKPi{"binsPtDsToKKPi", std::vector{hf_cuts_presel_ds::vecBinsPt}, "pT bin limits for Ds+->KKPi pT-dependent cuts"}; - Configurable> cutsDsToKKPi{"cutsDsToKKPi", {hf_cuts_presel_ds::cuts[0], hf_cuts_presel_ds::nBinsPt, hf_cuts_presel_ds::nCutVars, hf_cuts_presel_ds::labelsPt, hf_cuts_presel_ds::labelsCutVar}, "Ds+->KKPi selections per pT bin"}; + Configurable> cutsDsToKKPi{"cutsDsToKKPi", {hf_cuts_presel_ds::Cuts[0], hf_cuts_presel_ds::NBinsPt, hf_cuts_presel_ds::NCutVars, hf_cuts_presel_ds::labelsPt, hf_cuts_presel_ds::labelsCutVar}, "Ds+->KKPi selections per pT bin"}; // Lc+ cuts Configurable> binsPtLcToPKPi{"binsPtLcToPKPi", std::vector{hf_cuts_presel_3prong::vecBinsPt}, "pT bin limits for Lc->pKpi pT-dependent cuts"}; - Configurable> cutsLcToPKPi{"cutsLcToPKPi", {hf_cuts_presel_3prong::cuts[0], hf_cuts_presel_3prong::nBinsPt, hf_cuts_presel_3prong::nCutVars, hf_cuts_presel_3prong::labelsPt, hf_cuts_presel_3prong::labelsCutVar}, "Lc->pKpi selections per pT bin"}; + Configurable> cutsLcToPKPi{"cutsLcToPKPi", {hf_cuts_presel_3prong::Cuts[0], hf_cuts_presel_3prong::NBinsPt, hf_cuts_presel_3prong::NCutVars, hf_cuts_presel_3prong::labelsPt, hf_cuts_presel_3prong::labelsCutVar}, "Lc->pKpi selections per pT bin"}; // Xic+ cuts Configurable> binsPtXicToPKPi{"binsPtXicToPKPi", std::vector{hf_cuts_presel_3prong::vecBinsPt}, "pT bin limits for Xic->pKpi pT-dependent cuts"}; - Configurable> cutsXicToPKPi{"cutsXicToPKPi", {hf_cuts_presel_3prong::cuts[0], hf_cuts_presel_3prong::nBinsPt, hf_cuts_presel_3prong::nCutVars, hf_cuts_presel_3prong::labelsPt, hf_cuts_presel_3prong::labelsCutVar}, "Xic->pKpi selections per pT bin"}; + Configurable> cutsXicToPKPi{"cutsXicToPKPi", {hf_cuts_presel_3prong::Cuts[0], hf_cuts_presel_3prong::NBinsPt, hf_cuts_presel_3prong::NCutVars, hf_cuts_presel_3prong::labelsPt, hf_cuts_presel_3prong::labelsCutVar}, "Xic->pKpi selections per pT bin"}; // D*+ cuts Configurable> binsPtDstarToD0Pi{"binsPtDstarToD0Pi", std::vector{hf_cuts_presel_dstar::vecBinsPt}, "pT bin limits for D*+->D0pi pT-dependent cuts"}; - Configurable> cutsDstarToD0Pi{"cutsDstarToD0Pi", {hf_cuts_presel_dstar::cuts[0], hf_cuts_presel_dstar::nBinsPt, hf_cuts_presel_dstar::nCutVars, hf_cuts_presel_dstar::labelsPt, hf_cuts_presel_dstar::labelsCutVar}, "D*+->D0pi selections per pT bin"}; + Configurable> cutsDstarToD0Pi{"cutsDstarToD0Pi", {hf_cuts_presel_dstar::Cuts[0], hf_cuts_presel_dstar::NBinsPt, hf_cuts_presel_dstar::NCutVars, hf_cuts_presel_dstar::labelsPt, hf_cuts_presel_dstar::labelsCutVar}, "D*+->D0pi selections per pT bin"}; // proton PID selections for Lc and Xic Configurable applyProtonPidForLcToPKPi{"applyProtonPidForLcToPKPi", false, "Apply proton PID for Lc->pKpi"}; @@ -1195,11 +1195,11 @@ struct HfTrackIndexSkimCreator { Configurable> onnxFileNames{"onnxFileNames", {hf_cuts_bdt_multiclass::onnxFileNameSpecies[0], 5, 1, hf_cuts_bdt_multiclass::labelsSpecies, hf_cuts_bdt_multiclass::labelsModels}, "ONNX file names for ML models"}; - Configurable> thresholdMlScoreD0ToKPi{"thresholdMlScoreD0ToKPi", {hf_cuts_bdt_multiclass::cuts[0], hf_cuts_bdt_multiclass::nBinsPt, hf_cuts_bdt_multiclass::nCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for Ml output scores of D0 candidates"}; - Configurable> thresholdMlScoreDplusToPiKPi{"thresholdMlScoreDplusToPiKPi", {hf_cuts_bdt_multiclass::cuts[0], hf_cuts_bdt_multiclass::nBinsPt, hf_cuts_bdt_multiclass::nCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for Ml output scores of D+ candidates"}; - Configurable> thresholdMlScoreDsToPiKK{"thresholdMlScoreDsToPiKK", {hf_cuts_bdt_multiclass::cuts[0], hf_cuts_bdt_multiclass::nBinsPt, hf_cuts_bdt_multiclass::nCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for Ml output scores of Ds+ candidates"}; - Configurable> thresholdMlScoreLcToPiKP{"thresholdMlScoreLcToPiKP", {hf_cuts_bdt_multiclass::cuts[0], hf_cuts_bdt_multiclass::nBinsPt, hf_cuts_bdt_multiclass::nCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for Ml output scores of Lc+ candidates"}; - Configurable> thresholdMlScoreXicToPiKP{"thresholdMlScoreXicToPiKP", {hf_cuts_bdt_multiclass::cuts[0], hf_cuts_bdt_multiclass::nBinsPt, hf_cuts_bdt_multiclass::nCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for Ml output scores of Xic+ candidates"}; + Configurable> thresholdMlScoreD0ToKPi{"thresholdMlScoreD0ToKPi", {hf_cuts_bdt_multiclass::Cuts[0], hf_cuts_bdt_multiclass::NBinsPt, hf_cuts_bdt_multiclass::NCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for Ml output scores of D0 candidates"}; + Configurable> thresholdMlScoreDplusToPiKPi{"thresholdMlScoreDplusToPiKPi", {hf_cuts_bdt_multiclass::Cuts[0], hf_cuts_bdt_multiclass::NBinsPt, hf_cuts_bdt_multiclass::NCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for Ml output scores of D+ candidates"}; + Configurable> thresholdMlScoreDsToPiKK{"thresholdMlScoreDsToPiKK", {hf_cuts_bdt_multiclass::Cuts[0], hf_cuts_bdt_multiclass::NBinsPt, hf_cuts_bdt_multiclass::NCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for Ml output scores of Ds+ candidates"}; + Configurable> thresholdMlScoreLcToPiKP{"thresholdMlScoreLcToPiKP", {hf_cuts_bdt_multiclass::Cuts[0], hf_cuts_bdt_multiclass::NBinsPt, hf_cuts_bdt_multiclass::NCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for Ml output scores of Lc+ candidates"}; + Configurable> thresholdMlScoreXicToPiKP{"thresholdMlScoreXicToPiKP", {hf_cuts_bdt_multiclass::Cuts[0], hf_cuts_bdt_multiclass::NBinsPt, hf_cuts_bdt_multiclass::NCutBdtScores, hf_cuts_bdt_multiclass::labelsPt, hf_cuts_bdt_multiclass::labelsCutBdt}, "Threshold values for Ml output scores of Xic+ candidates"}; } config; SliceCache cache; @@ -1223,8 +1223,8 @@ struct HfTrackIndexSkimCreator { static constexpr int kN2ProngDecays = hf_cand_2prong::DecayType::N2ProngDecays; // number of 2-prong hadron types static constexpr int kN3ProngDecays = hf_cand_3prong::DecayType::N3ProngDecays; // number of 3-prong hadron types - static constexpr int kNCuts2Prong[kN2ProngDecays] = {hf_cuts_presel_2prong::nCutVars, hf_cuts_presel_2prong::nCutVars, hf_cuts_presel_2prong::nCutVars}; // how many different selections are made on 2-prongs - static constexpr int kNCuts3Prong[kN3ProngDecays] = {hf_cuts_presel_3prong::nCutVars, hf_cuts_presel_3prong::nCutVars + 1, hf_cuts_presel_ds::nCutVars, hf_cuts_presel_3prong::nCutVars + 1}; // how many different selections are made on 3-prongs (Lc and Xic have also PID potentially) + static constexpr int kNCuts2Prong[kN2ProngDecays] = {hf_cuts_presel_2prong::NCutVars, hf_cuts_presel_2prong::NCutVars, hf_cuts_presel_2prong::NCutVars}; // how many different selections are made on 2-prongs + static constexpr int kNCuts3Prong[kN3ProngDecays] = {hf_cuts_presel_3prong::NCutVars, hf_cuts_presel_3prong::NCutVars + 1, hf_cuts_presel_ds::NCutVars, hf_cuts_presel_3prong::NCutVars + 1}; // how many different selections are made on 3-prongs (Lc and Xic have also PID potentially) static constexpr int kNCutsDstar = 3; // how many different selections are made on Dstars std::array, 2>, kN2ProngDecays> arrMass2Prong; std::array, 2>, kN3ProngDecays> arrMass3Prong; @@ -1591,7 +1591,7 @@ struct HfTrackIndexSkimCreator { if (whichHypo[iDecay3P] == 0) { CLRBIT(isSelected, iDecay3P); if (config.debug) { - cutStatus[iDecay3P][hf_cuts_presel_3prong::nCutVars] = false; // PID + cutStatus[iDecay3P][hf_cuts_presel_3prong::NCutVars] = false; // PID } continue; // no need to check further for this particle hypothesis } diff --git a/PWGHF/TableProducer/treeCreatorLcToK0sP.cxx b/PWGHF/TableProducer/treeCreatorLcToK0sP.cxx index 8d8e5f023b2..35e15a7cb9f 100644 --- a/PWGHF/TableProducer/treeCreatorLcToK0sP.cxx +++ b/PWGHF/TableProducer/treeCreatorLcToK0sP.cxx @@ -307,9 +307,9 @@ struct HfTreeCreatorLcToK0sP { candidate.impactParameter1(), candidate.errorImpactParameter0(), candidate.errorImpactParameter1(), - candidate.v0x(), - candidate.v0y(), - candidate.v0z(), + candidate.v0X(), + candidate.v0Y(), + candidate.v0Z(), candidate.v0radius(), candidate.v0cosPA(), candidate.mLambda(), diff --git a/PWGHF/TableProducer/treeCreatorOmegacToOmegaPi.cxx b/PWGHF/TableProducer/treeCreatorOmegacToOmegaPi.cxx index 727c412a6a4..223e9a65ea7 100644 --- a/PWGHF/TableProducer/treeCreatorOmegacToOmegaPi.cxx +++ b/PWGHF/TableProducer/treeCreatorOmegacToOmegaPi.cxx @@ -359,7 +359,7 @@ struct HfTreeCreatorOmegac0ToOmegaPi { candidate.kfptPiFromOmegac(), candidate.kfptOmegac(), candidate.cosThetaStarPiFromOmegac(), - candidate.ctauOmegac(), + candidate.cTauOmegac(), candidate.etaCharmBaryon(), candidate.v0Ndf(), candidate.cascNdf(), @@ -405,7 +405,7 @@ struct HfTreeCreatorOmegac0ToOmegaPi { candidate.kfptPiFromOmegac(), candidate.kfptOmegac(), candidate.cosThetaStarPiFromOmegac(), - candidate.ctauOmegac(), + candidate.cTauOmegac(), candidate.etaCharmBaryon(), candidate.v0Chi2OverNdf(), candidate.cascChi2OverNdf(), diff --git a/PWGHF/TableProducer/treeCreatorToXiPi.cxx b/PWGHF/TableProducer/treeCreatorToXiPi.cxx index 0e17fc51294..e583b4f2253 100644 --- a/PWGHF/TableProducer/treeCreatorToXiPi.cxx +++ b/PWGHF/TableProducer/treeCreatorToXiPi.cxx @@ -101,10 +101,10 @@ DECLARE_SOA_COLUMN(CosPACasc, cosPACasc, float); DECLARE_SOA_COLUMN(CosPAXYV0, cosPAXYV0, float); DECLARE_SOA_COLUMN(CosPAXYCharmBaryon, cosPAXYCharmBaryon, float); DECLARE_SOA_COLUMN(CosPAXYCasc, cosPAXYCasc, float); -DECLARE_SOA_COLUMN(CTauOmegac, ctauOmegac, float); -DECLARE_SOA_COLUMN(CTauCascade, ctauCascade, float); -DECLARE_SOA_COLUMN(CTauV0, ctauV0, float); -DECLARE_SOA_COLUMN(CTauXic, ctauXic, float); +DECLARE_SOA_COLUMN(CTauOmegac, cTauOmegac, float); +DECLARE_SOA_COLUMN(CTauCascade, cTauCascade, float); +DECLARE_SOA_COLUMN(CTauV0, cTauV0, float); +DECLARE_SOA_COLUMN(CTauXic, cTauXic, float); DECLARE_SOA_COLUMN(EtaV0PosDau, etaV0PosDau, float); DECLARE_SOA_COLUMN(EtaV0NegDau, etaV0NegDau, float); DECLARE_SOA_COLUMN(EtaPiFromCasc, etaPiFromCasc, float); @@ -357,10 +357,10 @@ struct HfTreeCreatorToXiPi { candidate.cosPAXYV0(), candidate.cosPAXYCharmBaryon(), candidate.cosPAXYCasc(), - candidate.ctauOmegac(), - candidate.ctauCascade(), - candidate.ctauV0(), - candidate.ctauXic(), + candidate.cTauOmegac(), + candidate.cTauCascade(), + candidate.cTauV0(), + candidate.cTauXic(), candidate.etaV0PosDau(), candidate.etaV0NegDau(), candidate.etaBachFromCasc(), diff --git a/PWGHF/TableProducer/treeCreatorXic0ToXiPiKf.cxx b/PWGHF/TableProducer/treeCreatorXic0ToXiPiKf.cxx index 1e1bd4e359b..e763724e501 100644 --- a/PWGHF/TableProducer/treeCreatorXic0ToXiPiKf.cxx +++ b/PWGHF/TableProducer/treeCreatorXic0ToXiPiKf.cxx @@ -183,7 +183,7 @@ struct HfTreeCreatorXic0ToXiPiKf { candidate.kfptPiFromXic(), candidate.kfptXic(), candidate.cosThetaStarPiFromXic(), - candidate.ctauXic(), + candidate.cTauXic(), candidate.etaCharmBaryon(), candidate.v0Ndf(), candidate.cascNdf(), diff --git a/PWGHF/Utils/utilsAnalysis.h b/PWGHF/Utils/utilsAnalysis.h index 9148076e0ec..ec59ec55bf0 100644 --- a/PWGHF/Utils/utilsAnalysis.h +++ b/PWGHF/Utils/utilsAnalysis.h @@ -11,6 +11,8 @@ /// \file utilsAnalysis.h /// \brief Utilities for HF analyses +/// +/// \author Vít Kučera , Inha University #ifndef PWGHF_UTILS_UTILSANALYSIS_H_ #define PWGHF_UTILS_UTILSANALYSIS_H_ @@ -19,9 +21,10 @@ #include // std::distance #include //std::string +#include "CommonConstants/PhysicsConstants.h" + namespace o2::analysis { - enum BHadMothers { NotMatched = 0, BPlus, BZero, @@ -156,26 +159,26 @@ bool isCandidateInMassRange(const float& invMass, const double& pdgMass, const f struct HfTrigger2ProngCuts : o2::framework::ConfigurableGroup { std::string prefix = "hfTrigger2ProngCuts"; // JSON group name - static constexpr float defaultDeltaMassPars[1][2] = {{-0.0025f, 0.0001f}}; - static constexpr float defaultSigmaPars[1][2] = {{0.01424f, 0.00178f}}; + static constexpr float DefaultDeltaMassPars[1][2] = {{-0.0025f, 0.0001f}}; + static constexpr float DefaultSigmaPars[1][2] = {{0.01424f, 0.00178f}}; o2::framework::Configurable nSigmaMax{"nSigmaMax", 2, "Maximum number of sigmas for pT-differential mass cut for 2-prong candidates"}; o2::framework::Configurable ptDeltaMassMax{"ptDeltaMassMax", 10., "Max pT to apply delta mass shift to PDG mass value for 2-prong candidates"}; o2::framework::Configurable ptMassCutMax{"ptMassCutMax", 9999., "Max pT to apply pT-differential cut for 2-prong candidates"}; - o2::framework::Configurable> deltaMassPars{"deltaMassPars", {defaultDeltaMassPars[0], 2, {"constant", "linear"}}, "delta mass parameters for HF 2-prong trigger mass cut"}; - o2::framework::Configurable> sigmaPars{"sigmaPars", {defaultSigmaPars[0], 2, {"constant", "linear"}}, "sigma parameters for HF 2-prong trigger mass cut"}; + o2::framework::Configurable> deltaMassPars{"deltaMassPars", {DefaultDeltaMassPars[0], 2, {"constant", "linear"}}, "delta mass parameters for HF 2-prong trigger mass cut"}; + o2::framework::Configurable> sigmaPars{"sigmaPars", {DefaultSigmaPars[0], 2, {"constant", "linear"}}, "sigma parameters for HF 2-prong trigger mass cut"}; }; /// Configurable group to apply trigger specific cuts for 3-prong HF analysis struct HfTrigger3ProngCuts : o2::framework::ConfigurableGroup { std::string prefix = "hfTrigger3ProngCuts"; // JSON group name - static constexpr float defaultDeltaMassPars[1][2] = {{-0.0025f, 0.0001f}}; - static constexpr float defaultSigmaPars[1][2] = {{0.00796f, 0.00176f}}; + static constexpr float DefaultDeltaMassPars[1][2] = {{-0.0025f, 0.0001f}}; + static constexpr float DefaultSigmaPars[1][2] = {{0.00796f, 0.00176f}}; o2::framework::Configurable nSigmaMax{"nSigmaMax", 2, "Maximum number of sigmas for pT-differential mass cut for 3-prong candidates"}; o2::framework::Configurable ptDeltaMassMax{"ptDeltaMassMax", 10., "Max pT to apply delta mass shift to PDG mass value for 3-prong candidates"}; o2::framework::Configurable ptMassCutMax{"ptMassCutMax", 9999., "Max pT to apply pT-differential cut for 3-prong candidates"}; - o2::framework::Configurable> deltaMassPars{"deltaMassPars", {defaultDeltaMassPars[0], 2, {"constant", "linear"}}, "delta mass parameters for HF 3-prong trigger mass cut"}; - o2::framework::Configurable> sigmaPars{"sigmaPars", {defaultSigmaPars[0], 2, {"constant", "linear"}}, "sigma parameters for HF 3-prong trigger mass cut"}; + o2::framework::Configurable> deltaMassPars{"deltaMassPars", {DefaultDeltaMassPars[0], 2, {"constant", "linear"}}, "delta mass parameters for HF 3-prong trigger mass cut"}; + o2::framework::Configurable> sigmaPars{"sigmaPars", {DefaultSigmaPars[0], 2, {"constant", "linear"}}, "sigma parameters for HF 3-prong trigger mass cut"}; }; } // namespace o2::analysis diff --git a/PWGHF/Utils/utilsEvSelHf.h b/PWGHF/Utils/utilsEvSelHf.h index 5d50fd0d4fc..ee5183eea1f 100644 --- a/PWGHF/Utils/utilsEvSelHf.h +++ b/PWGHF/Utils/utilsEvSelHf.h @@ -157,14 +157,14 @@ struct HfEventSelection : o2::framework::ConfigurableGroup { o2::framework::ConfigurableAxis th2ConfigAxisOccupancy{"th2ConfigAxisOccupancy", {14, 0, 140000}, ""}; // histogram names - static constexpr char nameHistCollisions[] = "hCollisions"; - static constexpr char nameHistSelCollisionsCent[] = "hSelCollisionsCent"; - static constexpr char nameHistPosZBeforeEvSel[] = "hPosZBeforeEvSel"; - static constexpr char nameHistPosZAfterEvSel[] = "hPosZAfterEvSel"; - static constexpr char nameHistPosXAfterEvSel[] = "hPosXAfterEvSel"; - static constexpr char nameHistPosYAfterEvSel[] = "hPosYAfterEvSel"; - static constexpr char nameHistNumPvContributorsAfterSel[] = "hNumPvContributorsAfterSel"; - static constexpr char nameHistCollisionsCentOcc[] = "hCollisionsCentOcc"; + static constexpr char NameHistCollisions[] = "hCollisions"; + static constexpr char NameHistSelCollisionsCent[] = "hSelCollisionsCent"; + static constexpr char NameHistPosZBeforeEvSel[] = "hPosZBeforeEvSel"; + static constexpr char NameHistPosZAfterEvSel[] = "hPosZAfterEvSel"; + static constexpr char NameHistPosXAfterEvSel[] = "hPosXAfterEvSel"; + static constexpr char NameHistPosYAfterEvSel[] = "hPosYAfterEvSel"; + static constexpr char NameHistNumPvContributorsAfterSel[] = "hNumPvContributorsAfterSel"; + static constexpr char NameHistCollisionsCentOcc[] = "hCollisionsCentOcc"; std::shared_ptr hCollisions, hSelCollisionsCent, hPosZBeforeEvSel, hPosZAfterEvSel, hPosXAfterEvSel, hPosYAfterEvSel, hNumPvContributorsAfterSel; std::shared_ptr hCollisionsCentOcc; @@ -178,18 +178,18 @@ struct HfEventSelection : o2::framework::ConfigurableGroup { /// \param registry reference to the histogram registry void addHistograms(o2::framework::HistogramRegistry& registry) { - hCollisions = registry.add(nameHistCollisions, "HF event counter;;# of accepted collisions", {o2::framework::HistType::kTH1D, {axisEvents}}); - hSelCollisionsCent = registry.add(nameHistSelCollisionsCent, "HF event counter;T0M;# of accepted collisions", {o2::framework::HistType::kTH1D, {{100, 0., 100.}}}); - hPosZBeforeEvSel = registry.add(nameHistPosZBeforeEvSel, "all events;#it{z}_{prim. vtx.} (cm);entries", {o2::framework::HistType::kTH1D, {{400, -20., 20.}}}); - hPosZAfterEvSel = registry.add(nameHistPosZAfterEvSel, "selected events;#it{z}_{prim. vtx.} (cm);entries", {o2::framework::HistType::kTH1D, {{400, -20., 20.}}}); - hPosXAfterEvSel = registry.add(nameHistPosXAfterEvSel, "selected events;#it{x}_{prim. vtx.} (cm);entries", {o2::framework::HistType::kTH1D, {{200, -0.5, 0.5}}}); - hPosYAfterEvSel = registry.add(nameHistPosYAfterEvSel, "selected events;#it{y}_{prim. vtx.} (cm);entries", {o2::framework::HistType::kTH1D, {{200, -0.5, 0.5}}}); - hNumPvContributorsAfterSel = registry.add(nameHistNumPvContributorsAfterSel, "selected events;#it{y}_{prim. vtx.} (cm);entries", {o2::framework::HistType::kTH1D, {{500, -0.5, 499.5}}}); + hCollisions = registry.add(NameHistCollisions, "HF event counter;;# of accepted collisions", {o2::framework::HistType::kTH1D, {axisEvents}}); + hSelCollisionsCent = registry.add(NameHistSelCollisionsCent, "HF event counter;T0M;# of accepted collisions", {o2::framework::HistType::kTH1D, {{100, 0., 100.}}}); + hPosZBeforeEvSel = registry.add(NameHistPosZBeforeEvSel, "all events;#it{z}_{prim. vtx.} (cm);entries", {o2::framework::HistType::kTH1D, {{400, -20., 20.}}}); + hPosZAfterEvSel = registry.add(NameHistPosZAfterEvSel, "selected events;#it{z}_{prim. vtx.} (cm);entries", {o2::framework::HistType::kTH1D, {{400, -20., 20.}}}); + hPosXAfterEvSel = registry.add(NameHistPosXAfterEvSel, "selected events;#it{x}_{prim. vtx.} (cm);entries", {o2::framework::HistType::kTH1D, {{200, -0.5, 0.5}}}); + hPosYAfterEvSel = registry.add(NameHistPosYAfterEvSel, "selected events;#it{y}_{prim. vtx.} (cm);entries", {o2::framework::HistType::kTH1D, {{200, -0.5, 0.5}}}); + hNumPvContributorsAfterSel = registry.add(NameHistNumPvContributorsAfterSel, "selected events;#it{y}_{prim. vtx.} (cm);entries", {o2::framework::HistType::kTH1D, {{500, -0.5, 499.5}}}); setEventRejectionLabels(hCollisions, softwareTrigger); const o2::framework::AxisSpec th2AxisCent{th2ConfigAxisCent, "Centrality"}; const o2::framework::AxisSpec th2AxisOccupancy{th2ConfigAxisOccupancy, "Occupancy"}; - hCollisionsCentOcc = registry.add(nameHistCollisionsCentOcc, "selected events;Centrality; Occupancy", {o2::framework::HistType::kTH2D, {th2AxisCent, th2AxisOccupancy}}); + hCollisionsCentOcc = registry.add(NameHistCollisionsCentOcc, "selected events;Centrality; Occupancy", {o2::framework::HistType::kTH2D, {th2AxisCent, th2AxisOccupancy}}); // we initialise the summary object if (softwareTrigger.value != "") { @@ -343,23 +343,23 @@ struct HfEventSelectionMc { float centralityMax{100.f}; // Maximum centrality // histogram names - static constexpr char nameHistGenCollisionsCent[] = "hGenCollisionsCent"; + static constexpr char NameHistGenCollisionsCent[] = "hGenCollisionsCent"; std::shared_ptr hGenCollisionsCent; - static constexpr char nameHistRecCollisionsCentMc[] = "hRecCollisionsCentMc"; + static constexpr char NameHistRecCollisionsCentMc[] = "hRecCollisionsCentMc"; std::shared_ptr hRecCollisionsCentMc; - static constexpr char nameHistNSplitVertices[] = "hNSplitVertices"; + static constexpr char NameHistNSplitVertices[] = "hNSplitVertices"; std::shared_ptr hNSplitVertices; - static constexpr char nameHistParticles[] = "hParticles"; + static constexpr char NameHistParticles[] = "hParticles"; std::shared_ptr hParticles; /// \brief Adds collision monitoring histograms in the histogram registry. /// \param registry reference to the histogram registry void addHistograms(o2::framework::HistogramRegistry& registry) { - hGenCollisionsCent = registry.add(nameHistGenCollisionsCent, "HF event counter;T0M;# of generated collisions", {o2::framework::HistType::kTH1D, {{100, 0., 100.}}}); - hRecCollisionsCentMc = registry.add(nameHistRecCollisionsCentMc, "HF event counter;T0M;# of reconstructed collisions", {o2::framework::HistType::kTH1D, {{100, 0., 100.}}}); - hNSplitVertices = registry.add(nameHistNSplitVertices, "HF split vertices counter;;# of reconstructed collisions per mc collision", {o2::framework::HistType::kTH1D, {{4, 1., 5.}}}); - hParticles = registry.add(nameHistParticles, "HF particle counter;;# of accepted particles", {o2::framework::HistType::kTH1D, {axisEvents}}); + hGenCollisionsCent = registry.add(NameHistGenCollisionsCent, "HF event counter;T0M;# of generated collisions", {o2::framework::HistType::kTH1D, {{100, 0., 100.}}}); + hRecCollisionsCentMc = registry.add(NameHistRecCollisionsCentMc, "HF event counter;T0M;# of reconstructed collisions", {o2::framework::HistType::kTH1D, {{100, 0., 100.}}}); + hNSplitVertices = registry.add(NameHistNSplitVertices, "HF split vertices counter;;# of reconstructed collisions per mc collision", {o2::framework::HistType::kTH1D, {{4, 1., 5.}}}); + hParticles = registry.add(NameHistParticles, "HF particle counter;;# of accepted particles", {o2::framework::HistType::kTH1D, {axisEvents}}); // Puts labels on the collision monitoring histogram. setEventRejectionLabels(hParticles); } diff --git a/PWGHF/Utils/utilsMcGen.h b/PWGHF/Utils/utilsMcGen.h index 23fcbe6d61d..863d7041102 100644 --- a/PWGHF/Utils/utilsMcGen.h +++ b/PWGHF/Utils/utilsMcGen.h @@ -205,7 +205,7 @@ void fillMcMatchGenBplus(T const& mcParticles, U& rowMcMatchGen) std::vector arrayDaughterB; if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kBPlus, std::array{-Pdg::kD0, +kPiPlus}, true, &signB, 1, &arrayDaughterB)) { // D0(bar) → π± K∓ - for (const auto iD : arrayDaughterB) { + for (const auto iD : arrayDaughterB) { // o2-linter: disable=const-ref-in-for-loop (int values) auto candDaughterMC = mcParticles.rawIteratorAt(iD); if (std::abs(candDaughterMC.pdgCode()) == Pdg::kD0) { indexGenD0 = RecoDecay::isMatchedMCGen(mcParticles, candDaughterMC, Pdg::kD0, std::array{-kKPlus, +kPiPlus}, true, &signD0, 1); diff --git a/PWGHF/Utils/utilsPid.h b/PWGHF/Utils/utilsPid.h index 19325426cd6..5fd2b95ef1e 100644 --- a/PWGHF/Utils/utilsPid.h +++ b/PWGHF/Utils/utilsPid.h @@ -31,21 +31,21 @@ enum HfProngSpecies : uint8_t { Pion = 0, template T1 combineNSigma(T1 tpcNSigma, T1 tofNSigma) { - static constexpr float defaultNSigmaTolerance = .1f; - static constexpr float defaultNSigma = -999.f + defaultNSigmaTolerance; // -999.f is the default value set in TPCPIDResponse.h and PIDTOF.h + static constexpr float DefaultNSigmaTolerance = .1f; + static constexpr float DefaultNSigma = -999.f + DefaultNSigmaTolerance; // -999.f is the default value set in TPCPIDResponse.h and PIDTOF.h if constexpr (tiny) { tpcNSigma *= aod::pidtpc_tiny::binning::bin_width; tofNSigma *= aod::pidtof_tiny::binning::bin_width; } - if ((tpcNSigma > defaultNSigma) && (tofNSigma > defaultNSigma)) { // TPC and TOF + if ((tpcNSigma > DefaultNSigma) && (tofNSigma > DefaultNSigma)) { // TPC and TOF return std::sqrt(.5f * (tpcNSigma * tpcNSigma + tofNSigma * tofNSigma)); } - if (tpcNSigma > defaultNSigma) { // only TPC + if (tpcNSigma > DefaultNSigma) { // only TPC return std::abs(tpcNSigma); } - if (tofNSigma > defaultNSigma) { // only TOF + if (tofNSigma > DefaultNSigma) { // only TOF return std::abs(tofNSigma); } return tofNSigma; // no TPC nor TOF From ea4f598c20be5e9b657b6b6bb04b288e04242b4d Mon Sep 17 00:00:00 2001 From: Hadi Hassan Date: Mon, 24 Feb 2025 20:02:51 +0200 Subject: [PATCH 0397/1650] [PWGJE] Adding event weight to THnSparse (#10154) --- PWGJE/Core/JetTaggingUtilities.h | 80 +++++------ PWGJE/Core/MlResponseHfTagging.h | 228 +++++++++++++++---------------- PWGJE/Tasks/bjetTaggingML.cxx | 12 +- 3 files changed, 160 insertions(+), 160 deletions(-) diff --git a/PWGJE/Core/JetTaggingUtilities.h b/PWGJE/Core/JetTaggingUtilities.h index fa42b52c865..885db9ff3c3 100644 --- a/PWGJE/Core/JetTaggingUtilities.h +++ b/PWGJE/Core/JetTaggingUtilities.h @@ -63,50 +63,50 @@ namespace jettaggingutilities const int cmTomum = 10000; // using cm -> #mum for impact parameter (dca) struct BJetParams { - float JetpT = 0.0; - float JetEta = 0.0; - float JetPhi = 0.0; - int NTracks = -1; - int NSV = -1; - float JetMass = 0.0; + float jetpT = 0.0; + float jetEta = 0.0; + float jetPhi = 0.0; + int nTracks = -1; + int nSV = -1; + float jetMass = 0.0; }; struct BJetTrackParams { - double TrackpT = 0.0; - double TrackEta = 0.0; - double DotProdTrackJet = 0.0; - double DotProdTrackJetOverJet = 0.0; - double DeltaRJetTrack = 0.0; - double SignedIP2D = 0.0; - double SignedIP2DSign = 0.0; - double SignedIP3D = 0.0; - double SignedIP3DSign = 0.0; - double MomFraction = 0.0; - double DeltaRTrackVertex = 0.0; - double TrackPhi = 0.0; - double TrackCharge = 0.0; - double TrackITSChi2NCl = 0.0; - double TrackTPCChi2NCl = 0.0; - double TrackITSNCls = 0.0; - double TrackTPCNCls = 0.0; - double TrackTPCNCrossedRows = 0.0; - int TrackOrigin = -1; - int TrackVtxIndex = -1; + double trackpT = 0.0; + double trackEta = 0.0; + double dotProdTrackJet = 0.0; + double dotProdTrackJetOverJet = 0.0; + double deltaRJetTrack = 0.0; + double signedIP2D = 0.0; + double signedIP2DSign = 0.0; + double signedIP3D = 0.0; + double signedIP3DSign = 0.0; + double momFraction = 0.0; + double deltaRTrackVertex = 0.0; + double trackPhi = 0.0; + double trackCharge = 0.0; + double trackITSChi2NCl = 0.0; + double trackTPCChi2NCl = 0.0; + double trackITSNCls = 0.0; + double trackTPCNCls = 0.0; + double trackTPCNCrossedRows = 0.0; + int trackOrigin = -1; + int trackVtxIndex = -1; }; struct BJetSVParams { - double SVpT = 0.0; - double DeltaRSVJet = 0.0; - double SVMass = 0.0; - double SVfE = 0.0; - double IPxy = 0.0; - double CPA = 0.0; - double Chi2PCA = 0.0; - double Dispersion = 0.0; - double DecayLength2D = 0.0; - double DecayLength2DError = 0.0; - double DecayLength3D = 0.0; - double DecayLength3DError = 0.0; + double svpT = 0.0; + double deltaRSVJet = 0.0; + double svMass = 0.0; + double svfE = 0.0; + double svIPxy = 0.0; + double svCPA = 0.0; + double svChi2PCA = 0.0; + double dispersion = 0.0; + double decayLength2D = 0.0; + double decayLength2DError = 0.0; + double decayLength3D = 0.0; + double decayLength3DError = 0.0; }; //________________________________________________________________________ @@ -1015,7 +1015,7 @@ void analyzeJetTrackInfo4ML(AnalysisJet const& analysisJet, AnyTracks const& /*a } auto compare = [](BJetTrackParams& tr1, BJetTrackParams& tr2) { - return (tr1.SignedIP2D / tr1.SignedIP2DSign) > (tr2.SignedIP2D / tr2.SignedIP2DSign); + return (tr1.signedIP2D / tr1.signedIP2DSign) > (tr2.signedIP2D / tr2.signedIP2DSign); }; // Sort the tracks based on their IP significance in descending order @@ -1040,7 +1040,7 @@ void analyzeJetTrackInfo4MLnoSV(AnalysisJet const& analysisJet, AnyTracks const& } auto compare = [](BJetTrackParams& tr1, BJetTrackParams& tr2) { - return (tr1.SignedIP2D / tr1.SignedIP2DSign) > (tr2.SignedIP2D / tr2.SignedIP2DSign); + return (tr1.signedIP2D / tr1.signedIP2DSign) > (tr2.signedIP2D / tr2.signedIP2DSign); }; // Sort the tracks based on their IP significance in descending order diff --git a/PWGJE/Core/MlResponseHfTagging.h b/PWGJE/Core/MlResponseHfTagging.h index f66c16e30c1..8db76fe8d38 100644 --- a/PWGJE/Core/MlResponseHfTagging.h +++ b/PWGJE/Core/MlResponseHfTagging.h @@ -58,44 +58,44 @@ namespace o2::analysis { enum class InputFeaturesBTag : uint8_t { - JetpT = 0, - JetEta, - JetPhi, - NTracks, - NSV, - JetMass, - TrackpT, - TrackEta, - DotProdTrackJet, - DotProdTrackJetOverJet, - DeltaRJetTrack, - SignedIP2D, - SignedIP2DSign, - SignedIP3D, - SignedIP3DSign, - MomFraction, - DeltaRTrackVertex, - TrackPhi, - TrackCharge, - TrackITSChi2NCl, - TrackTPCChi2NCl, - TrackITSNCls, - TrackTPCNCls, - TrackTPCNCrossedRows, - TrackOrigin, - TrackVtxIndex, - SVpT, - DeltaRSVJet, - SVMass, - SVfE, - IPxy, - CPA, - Chi2PCA, - Dispersion, - DecayLength2D, - DecayLength2DError, - DecayLength3D, - DecayLength3DError, + jetpT = 0, + jetEta, + jetPhi, + nTracks, + nSV, + jetMass, + trackpT, + trackEta, + dotProdTrackJet, + dotProdTrackJetOverJet, + deltaRJetTrack, + signedIP2D, + signedIP2DSign, + signedIP3D, + signedIP3DSign, + momFraction, + deltaRTrackVertex, + trackPhi, + trackCharge, + trackITSChi2NCl, + trackTPCChi2NCl, + trackITSNCls, + trackTPCNCls, + trackTPCNCrossedRows, + trackOrigin, + trackVtxIndex, + svpT, + deltaRSVJet, + svMass, + svfE, + svIPxy, + svCPA, + svChi2PCA, + dispersion, + decayLength2D, + decayLength2DError, + decayLength3D, + decayLength3DError, }; template @@ -125,12 +125,12 @@ class MlResponseHfTagging : public MlResponse // Jet features for (const auto& idx : MlResponse::mCachedIndices) { switch (idx) { - CHECK_AND_FILL_VEC_BTAG(jetInput, jet, JetpT) - CHECK_AND_FILL_VEC_BTAG(jetInput, jet, JetEta) - CHECK_AND_FILL_VEC_BTAG(jetInput, jet, JetPhi) - CHECK_AND_FILL_VEC_BTAG(jetInput, jet, NTracks) - CHECK_AND_FILL_VEC_BTAG(jetInput, jet, NSV) - CHECK_AND_FILL_VEC_BTAG(jetInput, jet, JetMass) + CHECK_AND_FILL_VEC_BTAG(jetInput, jet, jetpT) + CHECK_AND_FILL_VEC_BTAG(jetInput, jet, jetEta) + CHECK_AND_FILL_VEC_BTAG(jetInput, jet, jetPhi) + CHECK_AND_FILL_VEC_BTAG(jetInput, jet, nTracks) + CHECK_AND_FILL_VEC_BTAG(jetInput, jet, nSV) + CHECK_AND_FILL_VEC_BTAG(jetInput, jet, jetMass) default: break; @@ -141,26 +141,26 @@ class MlResponseHfTagging : public MlResponse for (const auto& track : tracks) { for (const auto& idx : MlResponse::mCachedIndices) { switch (idx) { - CHECK_AND_FILL_VEC_BTAG(trackInput, track, TrackpT) - CHECK_AND_FILL_VEC_BTAG(trackInput, track, TrackEta) - CHECK_AND_FILL_VEC_BTAG(trackInput, track, DotProdTrackJet) - CHECK_AND_FILL_VEC_BTAG(trackInput, track, DotProdTrackJetOverJet) - CHECK_AND_FILL_VEC_BTAG(trackInput, track, DeltaRJetTrack) - CHECK_AND_FILL_VEC_BTAG(trackInput, track, SignedIP2D) - CHECK_AND_FILL_VEC_BTAG(trackInput, track, SignedIP2DSign) - CHECK_AND_FILL_VEC_BTAG(trackInput, track, SignedIP3D) - CHECK_AND_FILL_VEC_BTAG(trackInput, track, SignedIP3DSign) - CHECK_AND_FILL_VEC_BTAG(trackInput, track, MomFraction) - CHECK_AND_FILL_VEC_BTAG(trackInput, track, DeltaRTrackVertex) - CHECK_AND_FILL_VEC_BTAG(trackInput, track, TrackPhi) - CHECK_AND_FILL_VEC_BTAG(trackInput, track, TrackCharge) - CHECK_AND_FILL_VEC_BTAG(trackInput, track, TrackITSChi2NCl) - CHECK_AND_FILL_VEC_BTAG(trackInput, track, TrackTPCChi2NCl) - CHECK_AND_FILL_VEC_BTAG(trackInput, track, TrackITSNCls) - CHECK_AND_FILL_VEC_BTAG(trackInput, track, TrackTPCNCls) - CHECK_AND_FILL_VEC_BTAG(trackInput, track, TrackTPCNCrossedRows) - CHECK_AND_FILL_VEC_BTAG(trackInput, track, TrackOrigin) - CHECK_AND_FILL_VEC_BTAG(trackInput, track, TrackVtxIndex) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, trackpT) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, trackEta) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, dotProdTrackJet) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, dotProdTrackJetOverJet) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, deltaRJetTrack) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, signedIP2D) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, signedIP2DSign) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, signedIP3D) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, signedIP3DSign) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, momFraction) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, deltaRTrackVertex) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, trackPhi) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, trackCharge) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, trackITSChi2NCl) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, trackTPCChi2NCl) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, trackITSNCls) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, trackTPCNCls) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, trackTPCNCrossedRows) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, trackOrigin) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, trackVtxIndex) default: break; @@ -172,18 +172,18 @@ class MlResponseHfTagging : public MlResponse for (const auto& sv : svs) { for (const auto& idx : MlResponse::mCachedIndices) { switch (idx) { - CHECK_AND_FILL_VEC_BTAG(svInput, sv, SVpT) - CHECK_AND_FILL_VEC_BTAG(svInput, sv, DeltaRSVJet) - CHECK_AND_FILL_VEC_BTAG(svInput, sv, SVMass) - CHECK_AND_FILL_VEC_BTAG(svInput, sv, SVfE) - CHECK_AND_FILL_VEC_BTAG(svInput, sv, IPxy) - CHECK_AND_FILL_VEC_BTAG(svInput, sv, CPA) - CHECK_AND_FILL_VEC_BTAG(svInput, sv, Chi2PCA) - CHECK_AND_FILL_VEC_BTAG(svInput, sv, Dispersion) - CHECK_AND_FILL_VEC_BTAG(svInput, sv, DecayLength2D) - CHECK_AND_FILL_VEC_BTAG(svInput, sv, DecayLength2DError) - CHECK_AND_FILL_VEC_BTAG(svInput, sv, DecayLength3D) - CHECK_AND_FILL_VEC_BTAG(svInput, sv, DecayLength3DError) + CHECK_AND_FILL_VEC_BTAG(svInput, sv, svpT) + CHECK_AND_FILL_VEC_BTAG(svInput, sv, deltaRSVJet) + CHECK_AND_FILL_VEC_BTAG(svInput, sv, svMass) + CHECK_AND_FILL_VEC_BTAG(svInput, sv, svfE) + CHECK_AND_FILL_VEC_BTAG(svInput, sv, svIPxy) + CHECK_AND_FILL_VEC_BTAG(svInput, sv, svCPA) + CHECK_AND_FILL_VEC_BTAG(svInput, sv, svChi2PCA) + CHECK_AND_FILL_VEC_BTAG(svInput, sv, dispersion) + CHECK_AND_FILL_VEC_BTAG(svInput, sv, decayLength2D) + CHECK_AND_FILL_VEC_BTAG(svInput, sv, decayLength2DError) + CHECK_AND_FILL_VEC_BTAG(svInput, sv, decayLength3D) + CHECK_AND_FILL_VEC_BTAG(svInput, sv, decayLength3DError) default: break; @@ -246,48 +246,48 @@ class MlResponseHfTagging : public MlResponse { MlResponse::mAvailableInputFeatures = { // Jet features - FILL_MAP_BJET(JetpT), - FILL_MAP_BJET(JetEta), - FILL_MAP_BJET(JetPhi), - FILL_MAP_BJET(NTracks), - FILL_MAP_BJET(NSV), - FILL_MAP_BJET(JetMass), + FILL_MAP_BJET(jetpT), + FILL_MAP_BJET(jetEta), + FILL_MAP_BJET(jetPhi), + FILL_MAP_BJET(nTracks), + FILL_MAP_BJET(nSV), + FILL_MAP_BJET(jetMass), // Track features - FILL_MAP_BJET(TrackpT), - FILL_MAP_BJET(TrackEta), - FILL_MAP_BJET(DotProdTrackJet), - FILL_MAP_BJET(DotProdTrackJetOverJet), - FILL_MAP_BJET(DeltaRJetTrack), - FILL_MAP_BJET(SignedIP2D), - FILL_MAP_BJET(SignedIP2DSign), - FILL_MAP_BJET(SignedIP3D), - FILL_MAP_BJET(SignedIP3DSign), - FILL_MAP_BJET(MomFraction), - FILL_MAP_BJET(DeltaRTrackVertex), - FILL_MAP_BJET(TrackPhi), - FILL_MAP_BJET(TrackCharge), - FILL_MAP_BJET(TrackITSChi2NCl), - FILL_MAP_BJET(TrackTPCChi2NCl), - FILL_MAP_BJET(TrackITSNCls), - FILL_MAP_BJET(TrackTPCNCls), - FILL_MAP_BJET(TrackTPCNCrossedRows), - FILL_MAP_BJET(TrackOrigin), - FILL_MAP_BJET(TrackVtxIndex), + FILL_MAP_BJET(trackpT), + FILL_MAP_BJET(trackEta), + FILL_MAP_BJET(dotProdTrackJet), + FILL_MAP_BJET(dotProdTrackJetOverJet), + FILL_MAP_BJET(deltaRJetTrack), + FILL_MAP_BJET(signedIP2D), + FILL_MAP_BJET(signedIP2DSign), + FILL_MAP_BJET(signedIP3D), + FILL_MAP_BJET(signedIP3DSign), + FILL_MAP_BJET(momFraction), + FILL_MAP_BJET(deltaRTrackVertex), + FILL_MAP_BJET(trackPhi), + FILL_MAP_BJET(trackCharge), + FILL_MAP_BJET(trackITSChi2NCl), + FILL_MAP_BJET(trackTPCChi2NCl), + FILL_MAP_BJET(trackITSNCls), + FILL_MAP_BJET(trackTPCNCls), + FILL_MAP_BJET(trackTPCNCrossedRows), + FILL_MAP_BJET(trackOrigin), + FILL_MAP_BJET(trackVtxIndex), // Secondary vertex features - FILL_MAP_BJET(SVpT), - FILL_MAP_BJET(DeltaRSVJet), - FILL_MAP_BJET(SVMass), - FILL_MAP_BJET(SVfE), - FILL_MAP_BJET(IPxy), - FILL_MAP_BJET(CPA), - FILL_MAP_BJET(Chi2PCA), - FILL_MAP_BJET(Dispersion), - FILL_MAP_BJET(DecayLength2D), - FILL_MAP_BJET(DecayLength2DError), - FILL_MAP_BJET(DecayLength3D), - FILL_MAP_BJET(DecayLength3DError)}; + FILL_MAP_BJET(svpT), + FILL_MAP_BJET(deltaRSVJet), + FILL_MAP_BJET(svMass), + FILL_MAP_BJET(svfE), + FILL_MAP_BJET(svIPxy), + FILL_MAP_BJET(svCPA), + FILL_MAP_BJET(svChi2PCA), + FILL_MAP_BJET(dispersion), + FILL_MAP_BJET(decayLength2D), + FILL_MAP_BJET(decayLength2DError), + FILL_MAP_BJET(decayLength3D), + FILL_MAP_BJET(decayLength3DError)}; } }; diff --git a/PWGJE/Tasks/bjetTaggingML.cxx b/PWGJE/Tasks/bjetTaggingML.cxx index 8cf97bd2049..7b2638f37a5 100644 --- a/PWGJE/Tasks/bjetTaggingML.cxx +++ b/PWGJE/Tasks/bjetTaggingML.cxx @@ -259,7 +259,7 @@ struct BJetTaggingML { } auto compare = [](jettaggingutilities::BJetTrackParams& tr1, jettaggingutilities::BJetTrackParams& tr2) { - return (tr1.SignedIP2D / tr1.SignedIP2DSign) > (tr2.SignedIP2D / tr2.SignedIP2DSign); + return (tr1.signedIP2D / tr1.signedIP2DSign) > (tr2.signedIP2D / tr2.signedIP2DSign); }; // Sort the tracks based on their IP significance in descending order @@ -312,7 +312,7 @@ struct BJetTaggingML { registry.fill(HIST("h2_jetMass_jetpT"), analysisJet.pt(), analysisJet.mass()); if (doDataDriven) { - registry.fill(HIST("hSparse_Incljets"), analysisJet.pt(), analysisJet.scoreML(), -1 * std::log(1 - analysisJet.scoreML()), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].SVMass, svsParams[0].SVfE); + registry.fill(HIST("hSparse_Incljets"), analysisJet.pt(), analysisJet.scoreML(), -1 * std::log(1 - analysisJet.scoreML()), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].svMass, svsParams[0].svfE); } } } @@ -373,13 +373,13 @@ struct BJetTaggingML { registry.fill(HIST("h2_jetMass_jetpT"), analysisJet.pt(), analysisJet.mass(), eventWeight); if (doDataDriven) { - registry.fill(HIST("hSparse_Incljets"), analysisJet.pt(), analysisJet.scoreML(), -1 * std::log(1 - analysisJet.scoreML()), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].SVMass, svsParams[0].SVfE); + registry.fill(HIST("hSparse_Incljets"), analysisJet.pt(), analysisJet.scoreML(), -1 * std::log(1 - analysisJet.scoreML()), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].svMass, svsParams[0].svfE, eventWeight); if (jetFlavor == 2) { - registry.fill(HIST("hSparse_bjets"), analysisJet.pt(), analysisJet.scoreML(), -1 * std::log(1 - analysisJet.scoreML()), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].SVMass, svsParams[0].SVfE); + registry.fill(HIST("hSparse_bjets"), analysisJet.pt(), analysisJet.scoreML(), -1 * std::log(1 - analysisJet.scoreML()), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].svMass, svsParams[0].svfE, eventWeight); } else if (jetFlavor == 1) { - registry.fill(HIST("hSparse_cjets"), analysisJet.pt(), analysisJet.scoreML(), -1 * std::log(1 - analysisJet.scoreML()), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].SVMass, svsParams[0].SVfE); + registry.fill(HIST("hSparse_cjets"), analysisJet.pt(), analysisJet.scoreML(), -1 * std::log(1 - analysisJet.scoreML()), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].svMass, svsParams[0].svfE, eventWeight); } else { - registry.fill(HIST("hSparse_lfjets"), analysisJet.pt(), analysisJet.scoreML(), -1 * std::log(1 - analysisJet.scoreML()), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].SVMass, svsParams[0].SVfE); + registry.fill(HIST("hSparse_lfjets"), analysisJet.pt(), analysisJet.scoreML(), -1 * std::log(1 - analysisJet.scoreML()), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].svMass, svsParams[0].svfE, eventWeight); } } From 27311d21406405abd22a63757ee04c408c86ded6 Mon Sep 17 00:00:00 2001 From: Joachim Carlo Kristian Bjerg Hansen <50103987+joachimckh@users.noreply.github.com> Date: Mon, 24 Feb 2025 19:03:03 +0100 Subject: [PATCH 0398/1650] [PWGJE] rho(phi) and random cone background with ESE + event plane information (#10163) --- PWGJE/Tasks/jetSpectraEseTask.cxx | 314 ++++++++++++++++++++++++------ 1 file changed, 258 insertions(+), 56 deletions(-) diff --git a/PWGJE/Tasks/jetSpectraEseTask.cxx b/PWGJE/Tasks/jetSpectraEseTask.cxx index de08d761e85..60734e9a5b6 100644 --- a/PWGJE/Tasks/jetSpectraEseTask.cxx +++ b/PWGJE/Tasks/jetSpectraEseTask.cxx @@ -17,6 +17,10 @@ #include #include #include +#include + +#include +#include #include "Framework/ASoA.h" #include "Framework/AnalysisDataModel.h" @@ -41,7 +45,6 @@ using namespace o2::framework; using namespace o2::framework::expressions; #include "Framework/runDataProcessing.h" -#include "Framework/StaticFor.h" struct JetSpectraEseTask { ConfigurableAxis binJetPt{"binJetPt", {200, 0., 200.}, ""}; @@ -50,13 +53,24 @@ struct JetSpectraEseTask { ConfigurableAxis binCos{"binCos", {100, -1.05, 1.05}, ""}; ConfigurableAxis binOccupancy{"binOccupancy", {5000, 0, 25000}, ""}; ConfigurableAxis binQVec{"binQVec", {500, -3, 3}, ""}; + ConfigurableAxis binCentrality{"binCentrality", {100, 0, 100}, ""}; + ConfigurableAxis binPhi{"binPhi", {60, -1.0, 7.0}, ""}; + ConfigurableAxis binEta{"binEta", {80, -0.9, 0, 9}, ""}; + ConfigurableAxis binFit{"binFit", {100, 0, 50}, ""}; Configurable jetPtMin{"jetPtMin", 5.0, "minimum jet pT cut"}; Configurable jetR{"jetR", 0.2, "jet resolution parameter"}; + Configurable randomConeR{"randomConeR", 0.4, "size of random Cone for estimating background fluctuations"}; + Configurable randomConeLeadJetDeltaR{"randomConeLeadJetDeltaR", -99.0, "min distance between leading jet axis and random cone (RC) axis; if negative, min distance is set to automatic value of R_leadJet+R_RC "}; Configurable vertexZCut{"vertexZCut", 10.0, "vertex z cut"}; Configurable> centRange{"centRange", {30, 50}, "centrality region of interest"}; Configurable leadingJetPtCut{"leadingJetPtCut", 5.0, "leading jet pT cut"}; + Configurable trackEtaMin{"trackEtaMin", -0.9, "minimum eta acceptance for tracks"}; + Configurable trackEtaMax{"trackEtaMax", 0.9, "maximum eta acceptance for tracks"}; + Configurable trackPtMin{"trackPtMin", 0.15, "minimum pT acceptance for tracks"}; + Configurable trackPtMax{"trackPtMax", 100.0, "maximum pT acceptance for tracks"}; + Configurable eventSelections{"eventSelections", "sel8FullPbPb", "choose event selection"}; Configurable trackSelections{"trackSelections", "globalTracks", "set track selections"}; @@ -65,6 +79,8 @@ struct JetSpectraEseTask { Configurable> cfgCutOccupancy{"cfgCutOccupancy", {0, 1000}, "Occupancy cut"}; Configurable> cfgOccupancyPtCut{"cfgOccupancyPtCut", {0, 100}, "pT cut"}; + Configurable cfgrhoPhi{"cfgrhoPhi", true, "Flag for rho(phi)"}; + Configurable cfgnTotalSystem{"cfgnTotalSystem", 7, "total qvector number // look in Qvector table for this number"}; Configurable cfgnCorrLevel{"cfgnCorrLevel", 3, "QVector step: 0 = no corr, 1 = rect, 2 = twist, 3 = full"}; @@ -78,6 +94,10 @@ struct JetSpectraEseTask { AxisSpec cosAxis = {binCos, ""}; AxisSpec occAxis = {binOccupancy, "Occupancy"}; AxisSpec qvecAxis = {binQVec, "Q-vector"}; + AxisSpec centAxis = {binCentrality, "Centrality"}; + AxisSpec phiAxis = {binPhi, "#phi"}; + AxisSpec etaAxis = {binEta, "#eta"}; + AxisSpec fitAxis = {binFit, "Fit"}; HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject, false, false}; @@ -98,6 +118,11 @@ struct JetSpectraEseTask { TPCneg, TPCall }; + struct EventPlane { + float psi2; + float psi3; + }; + void init(o2::framework::InitContext&) { eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast(eventSelections)); @@ -108,25 +133,25 @@ struct JetSpectraEseTask { if (doprocessESEDataCharged) { LOGF(info, "JetSpectraEseTask::init() - processESEDataCharged"); registry.add("hEventCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); - registry.add("hCentralitySel", ";Centrality;entries", {HistType::kTH1F, {{100, 0, 100}}}); - registry.add("hCentralityAnalyzed", ";Centrality;entries", {HistType::kTH1F, {{100, 0, 100}}}); + registry.add("hCentralitySel", ";Centrality;entries", {HistType::kTH1F, {{centAxis}}}); + registry.add("hCentralityAnalyzed", ";Centrality;entries", {HistType::kTH1F, {{centAxis}}}); registry.add("hJetPt", "jet pT;#it{p}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {{jetPtAxis}}}); registry.add("hJetPt_bkgsub", "jet pT background sub;#it{p}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {{jetPtAxis}}}); - registry.add("hJetEta", "jet #eta;#eta_{jet};entries", {HistType::kTH1F, {{100, -1.0, 1.0}}}); - registry.add("hJetPhi", "jet #phi;#phi_{jet};entries", {HistType::kTH1F, {{80, -1.0, 7.}}}); + registry.add("hJetEta", "jet #eta;#eta_{jet};entries", {HistType::kTH1F, {{etaAxis}}}); + registry.add("hJetPhi", "jet #phi;#phi_{jet};entries", {HistType::kTH1F, {{phiAxis}}}); registry.add("hRho", ";#rho;entries", {HistType::kTH1F, {{100, 0, 200.}}}); - registry.add("hJetArea", ";area_{jet};entries", {HistType::kTH1F, {{100, 0, 10.}}}); + registry.add("hJetArea", ";area_{jet};entries", {HistType::kTH1F, {{80, 0, 10.}}}); registry.add("hdPhi", "#Delta#phi;entries;", {HistType::kTH1F, {{dPhiAxis}}}); - registry.add("hCentJetPtdPhiq2", "", {HistType::kTHnSparseF, {{100, 0, 100}, {jetPtAxis}, {dPhiAxis}, {eseAxis}}}); - registry.add("hPsi2FT0C", ";Centrality; #Psi_{2}", {HistType::kTH2F, {{100, 0, 100}, {150, -2.5, 2.5}}}); + registry.add("hCentJetPtdPhiq2", "", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {dPhiAxis}, {eseAxis}}}); + registry.add("hPsi2FT0C", ";Centrality; #Psi_{2}", {HistType::kTH2F, {{centAxis}, {150, -2.5, 2.5}}}); registry.addClone("hPsi2FT0C", "hPsi2FT0A"); registry.addClone("hPsi2FT0C", "hPsi2FV0A"); registry.addClone("hPsi2FT0C", "hPsi2TPCpos"); registry.addClone("hPsi2FT0C", "hPsi2TPCneg"); - registry.add("hCosPsi2AmC", ";Centrality;cos(2(#Psi_{2}^{A}-#Psi_{2}^{B}));#it{q}_{2}", {HistType::kTH3F, {{100, 0, 100}, {cosAxis}, {eseAxis}}}); + registry.add("hCosPsi2AmC", ";Centrality;cos(2(#Psi_{2}^{A}-#Psi_{2}^{B}));#it{q}_{2}", {HistType::kTH3F, {{centAxis}, {cosAxis}, {eseAxis}}}); registry.addClone("hCosPsi2AmC", "hCosPsi2AmB"); registry.addClone("hCosPsi2AmC", "hCosPsi2BmC"); - registry.add("hQvecUncorV2", ";Centrality;Q_x;Q_y", {HistType::kTH3F, {{100, 0, 100}, {qvecAxis}, {qvecAxis}}}); + registry.add("hQvecUncorV2", ";Centrality;Q_x;Q_y", {HistType::kTH3F, {{centAxis}, {qvecAxis}, {qvecAxis}}}); registry.addClone("hQvecUncorV2", "hQvecRectrV2"); registry.addClone("hQvecUncorV2", "hQvecTwistV2"); registry.addClone("hQvecUncorV2", "hQvecFinalV2"); @@ -141,16 +166,30 @@ struct JetSpectraEseTask { registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(5, "Lead track"); registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(6, "Jet loop"); registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(7, "Centrality analyzed"); + + registry.add("hPhiPtsum", "jet sumpt;sum p_{T};entries", {HistType::kTH1F, {{40, 0., o2::constants::math::TwoPI}}}); + registry.add("hfitPar0", "", {HistType::kTH2F, {{centAxis}, {fitAxis}}}); + registry.add("hfitPar1", "", {HistType::kTH2F, {{centAxis}, {fitAxis}}}); + registry.add("hfitPar2", "", {HistType::kTH2F, {{centAxis}, {fitAxis}}}); + registry.add("hfitPar3", "", {HistType::kTH2F, {{centAxis}, {fitAxis}}}); + registry.add("hfitPar4", "", {HistType::kTH2F, {{centAxis}, {fitAxis}}}); + registry.add("hPValueCentCDF", "p-value cDF vs centrality; centrality; p-value", {HistType::kTH2F, {{centAxis}, {40, 0, 1}}}); + registry.add("hCentChi2Ndf", "Chi2 vs centrality; centrality; #tilde{#chi^{2}}", {HistType::kTH2F, {{centAxis}, {100, 0, 5}}}); + } + if (doprocessESEBackground) { + registry.add("hCentRhoRandomCone", "; centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho} (GeV/c);", {HistType::kTH2F, {{1100, 0., 110.}, {800, -400.0, 400.0}}}); + registry.add("hCentRhoRandomConeRandomTrackDir", "; centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho} (GeV/c);", {HistType::kTH2F, {{1100, 0., 110.}, {800, -400.0, 400.0}}}); + registry.add("hCentRhoRandomConewoLeadingJet", "; centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho} (GeV/c);", {HistType::kTHnSparseF, {{centAxis}, {800, -400.0, 400.0}, {dPhiAxis}, {eseAxis}}}); } if (doprocessMCParticleLevel) { LOGF(info, "JetSpectraEseTask::init() - processMCParticleLevel"); registry.add("hMCPartEventCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); - registry.add("hPartCentralitySel", ";centr;entries", {HistType::kTH1F, {{100, 0.0, 100.0}}}); + registry.add("hPartCentralitySel", ";centr;entries", {HistType::kTH1F, {{centAxis}}}); registry.add("hPartJetPt", "particle level jet pT;#it{p}_{T,jet part} (GeV/#it{c});entries", {HistType::kTH1F, {{jetPtAxis}}}); registry.add("hPartJetPtSubBkg", "particle level jet pT;#it{p}_{T,jet part} (GeV/#it{c});entries", {HistType::kTH1F, {{jetPtAxis}}}); - registry.add("hPartJetSparse", ";Centrality;#it{p}_{T,jet part} (GeV/#it{c})", {HistType::kTHnSparseF, {{110, -10, 100}, {jetPtAxis}, {100, -1.0, 1.0}, {80, -1.0, 7}}}); - registry.add("hPartJetEta", "particle level jet #eta;#eta_{jet part};entries", {HistType::kTH1F, {{100, -1.0, 1.0}}}); - registry.add("hPartJetPhi", "particle level jet #phi;#phi_{jet part};entries", {HistType::kTH1F, {{80, -1.0, 7.}}}); + registry.add("hPartJetSparse", ";Centrality;#it{p}_{T,jet part} (GeV/#it{c})", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {etaAxis}, {phiAxis}}}); + registry.add("hPartJetEta", "particle level jet #eta;#eta_{jet part};entries", {HistType::kTH1F, {{etaAxis}}}); + registry.add("hPartJetPhi", "particle level jet #phi;#phi_{jet part};entries", {HistType::kTH1F, {{phiAxis}}}); registry.get(HIST("hMCPartEventCounter"))->GetXaxis()->SetBinLabel(1, "Input event"); registry.get(HIST("hMCPartEventCounter"))->GetXaxis()->SetBinLabel(2, "Collision size < 1"); @@ -161,9 +200,9 @@ struct JetSpectraEseTask { registry.add("hMCDetEventCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); registry.add("hDetCentralitySel", ";centr;entries", {HistType::kTH1F, {{100, 0.0, 100.0}}}); registry.add("hDetJetPt", "particle level jet pT;#it{p}_{T,jet part} (GeV/#it{c});entries", {HistType::kTH1F, {{jetPtAxis}}}); - registry.add("hDetJetSparse", ";Centr;#it{p}_{T,jet part} (GeV/#it{c})", {HistType::kTHnSparseF, {{110, -10, 100}, {jetPtAxis}, {100, -1.0, 1.0}, {80, -1.0, 7}}}); - registry.add("hDetJetEta", "particle level jet #eta;#eta_{jet part};entries", {HistType::kTH1F, {{100, -1.0, 1.0}}}); - registry.add("hDetJetPhi", "particle level jet #phi;#phi_{jet part};entries", {HistType::kTH1F, {{80, -1.0, 7.}}}); + registry.add("hDetJetSparse", ";Centr;#it{p}_{T,jet part} (GeV/#it{c})", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {etaAxis}, {phiAxis}}}); + registry.add("hDetJetEta", "particle level jet #eta;#eta_{jet part};entries", {HistType::kTH1F, {{etaAxis}}}); + registry.add("hDetJetPhi", "particle level jet #phi;#phi_{jet part};entries", {HistType::kTH1F, {{phiAxis}}}); registry.get(HIST("hMCDetEventCounter"))->GetXaxis()->SetBinLabel(1, "Input event"); registry.get(HIST("hMCDetEventCounter"))->GetXaxis()->SetBinLabel(2, "Event eelection"); @@ -173,23 +212,23 @@ struct JetSpectraEseTask { LOGF(info, "JetSpectraEseTask::init() - processMCChargedMatched"); registry.add("hMCEventCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); registry.add("hMCDMatchedEventCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); - registry.add("hCentralityAnalyzed", ";Centrality;entries", {HistType::kTH1F, {{100, 0, 100}}}); - registry.add("hPartJetPtMatch", ";Centrality;#it{p}_{T,jet part} (GeV/#it{c})", {HistType::kTH2F, {{100, 0, 100}, {jetPtAxis}}}); - registry.add("hPartJetPtMatchSubBkg", ";Centrality;#it{p}_{T,jet part} (GeV/#it{c})", {HistType::kTH2F, {{100, 0, 100}, {jetPtAxis}}}); - registry.add("hPartJetMatchSparse", ";Centrality;#it{p}_{T,jet part} (GeV/#it{c})", {HistType::kTHnSparseF, {{110, -10, 100}, {jetPtAxis}, {100, -1.0, 1.0}, {80, -1.0, 7}}}); - registry.add("hPartJetEtaMatch", "particle level jet #eta;#eta_{jet part};entries", {HistType::kTH1F, {{100, -1.0, 1.0}}}); - registry.add("hPartJetPhiMatch", "particle level jet #phi;#phi_{jet part};entries", {HistType::kTH1F, {{80, -1.0, 7.}}}); - registry.add("hDetectorJetPt", ";Centrality;#it{p}_{T,jet det} (GeV/#it{c})", {HistType::kTH2F, {{100, 0, 100}, {jetPtAxis}}}); - registry.add("hDetectorJetPtSubBkg", ";Centrality;#it{p}_{T,jet det} (GeV/#it{c})", {HistType::kTH2F, {{100, 0, 100}, {jetPtAxis}}}); - registry.add("hDetectorJetEta", "detector level jet #eta;#eta_{jet det};entries", {HistType::kTH1F, {{100, -1.0, 1.0}}}); - registry.add("hDetectorJetPhi", "detector level jet #phi;#phi_{jet det};entries", {HistType::kTH1F, {{80, -1.0, 7.}}}); - registry.add("hMatchedJetsPtDelta", "#it{p}_{T,jet part}; det - part", {HistType::kTH2F, {{jetPtAxis}, {200, -20., 20.0}}}); - registry.add("hGenMatchedJetsPtDeltadPt", "#it{p}_{T,jet part}; det - part / part", {HistType::kTHnSparseF, {{100, 0, 100}, {jetPtAxis}, {200, -20., 20.0}}}); - registry.add("hRecoMatchedJetsPtDeltadPt", "#it{p}_{T,jet det}; det - part / det", {HistType::kTHnSparseF, {{100, 0, 100}, {jetPtAxis}, {200, -20., 20.0}}}); - registry.add("hMatchedJetsEtaDelta", "#eta_{jet part}; det - part", {HistType::kTH2F, {{100, -1.0, 1.0}, {200, -0.8, 0.8}}}); - registry.add("hMatchedJetsPhiDelta", "#phi_{jet part}; det - part", {HistType::kTH2F, {{80, -1.0, 7.}, {200, -10.0, 10.}}}); - registry.add("hRespMcDMcPMatch", ";Centrality,#it{p}_{T, jet det}; #it{p}_{T, jet part}", HistType::kTHnSparseF, {{100, 0, 100}, jetPtAxis, jetPtAxis}); - registry.add("hRespMcDMcPMatchSubBkg", ";Centrality,#it{p}_{T, jet det}; #it{p}_{T, jet part}", HistType::kTHnSparseF, {{100, 0, 100}, jetPtAxis, jetPtAxis}); + registry.add("hCentralityAnalyzed", ";Centrality;entries", {HistType::kTH1F, {{centAxis}}}); + registry.add("hPartJetPtMatch", ";Centrality;#it{p}_{T,jet part} (GeV/#it{c})", {HistType::kTH2F, {{centAxis}, {jetPtAxis}}}); + registry.add("hPartJetPtMatchSubBkg", ";Centrality;#it{p}_{T,jet part} (GeV/#it{c})", {HistType::kTH2F, {{centAxis}, {jetPtAxis}}}); + registry.add("hPartJetMatchSparse", ";Centrality;#it{p}_{T,jet part} (GeV/#it{c})", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {etaAxis}, {phiAxis}}}); + registry.add("hPartJetEtaMatch", "particle level jet #eta;#eta_{jet part};entries", {HistType::kTH1F, {{etaAxis}}}); + registry.add("hPartJetPhiMatch", "particle level jet #phi;#phi_{jet part};entries", {HistType::kTH1F, {{phiAxis}}}); + registry.add("hDetectorJetPt", ";Centrality;#it{p}_{T,jet det} (GeV/#it{c})", {HistType::kTH2F, {{centAxis}, {jetPtAxis}}}); + registry.add("hDetectorJetPtSubBkg", ";Centrality;#it{p}_{T,jet det} (GeV/#it{c})", {HistType::kTH2F, {{centAxis}, {jetPtAxis}}}); + registry.add("hDetectorJetEta", "detector level jet #eta;#eta_{jet det};entries", {HistType::kTH1F, {{etaAxis}}}); + registry.add("hDetectorJetPhi", "detector level jet #phi;#phi_{jet det};entries", {HistType::kTH1F, {{phiAxis}}}); + registry.add("hMatchedJetsPtDelta", "#it{p}_{T,jet part}; det - part", {HistType::kTH2F, {{jetPtAxis}, {100, -20., 20.0}}}); + registry.add("hGenMatchedJetsPtDeltadPt", "#it{p}_{T,jet part}; det - part / part", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {200, -20., 20.0}}}); + registry.add("hRecoMatchedJetsPtDeltadPt", "#it{p}_{T,jet det}; det - part / det", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {200, -20., 20.0}}}); + registry.add("hMatchedJetsEtaDelta", "#eta_{jet part}; det - part", {HistType::kTH2F, {{etaAxis}, {200, -0.8, 0.8}}}); + registry.add("hMatchedJetsPhiDelta", "#phi_{jet part}; det - part", {HistType::kTH2F, {{phiAxis}, {200, -10.0, 10.}}}); + registry.add("hRespMcDMcPMatch", ";Centrality,#it{p}_{T, jet det}; #it{p}_{T, jet part}", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {jetPtAxis}}}); + registry.add("hRespMcDMcPMatchSubBkg", ";Centrality,#it{p}_{T, jet det}; #it{p}_{T, jet part}", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {jetPtAxis}}}); registry.get(HIST("hMCEventCounter"))->GetXaxis()->SetBinLabel(1, "Input event"); registry.get(HIST("hMCEventCounter"))->GetXaxis()->SetBinLabel(2, "Collision size < 1"); @@ -205,11 +244,11 @@ struct JetSpectraEseTask { if (doprocessESEOccupancy) { LOGF(info, "JetSpectraEseTask::init() - processESEOccupancy"); registry.add("hEventCounterOcc", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); - registry.add("hTrackPt", "track pT;#it{p}_{T,track} (GeV/#it{c});entries", {HistType::kTHnSparseF, {{100, 0, 100}, {100, 0, 100}, {eseAxis}, {occAxis}}}); - registry.add("hTrackEta", "track #eta;#eta_{track};entries", {HistType::kTH3F, {{100, 0, 100}, {100, -1.0, 1.0}, {occAxis}}}); - registry.add("hTrackPhi", "track #phi;#phi_{track};entries", {HistType::kTH3F, {{100, 0, 100}, {80, -1.0, 7.}, {occAxis}}}); + registry.add("hTrackPt", "track pT;#it{p}_{T,track} (GeV/#it{c});entries", {HistType::kTHnSparseF, {{centAxis}, {100, 0, 100}, {eseAxis}, {occAxis}}}); + registry.add("hTrackEta", "track #eta;#eta_{track};entries", {HistType::kTH3F, {{centAxis}, {etaAxis}, {occAxis}}}); + registry.add("hTrackPhi", "track #phi;#phi_{track};entries", {HistType::kTH3F, {{centAxis}, {phiAxis}, {occAxis}}}); registry.add("hOccupancy", "Occupancy;Occupancy;entries", {HistType::kTH1F, {{occAxis}}}); - registry.add("hPsiOccupancy", "Occupancy;#Psi_{2};entries", {HistType::kTH3F, {{100, 0, 100}, {150, -2.5, 2.5}, {occAxis}}}); + registry.add("hPsiOccupancy", "Occupancy;#Psi_{2};entries", {HistType::kTH3F, {{centAxis}, {150, -2.5, 2.5}, {occAxis}}}); } } @@ -228,7 +267,7 @@ struct JetSpectraEseTask { registry.fill(HIST("hEventCounter"), counter++); registry.fill(HIST("hCentralitySel"), collision.centrality()); - const auto vPsi2{procEP(collision)}; + const auto psi{procEP(collision)}; const auto qPerc{collision.qPERCFT0C()}; if (qPerc[0] < 0) return; @@ -237,18 +276,25 @@ struct JetSpectraEseTask { if (!isAcceptedLeadTrack(tracks)) return; + auto rho = collision.rho(); + std::unique_ptr rhoFit{nullptr}; + if (cfgrhoPhi) + rhoFit = fitRho(collision, psi, tracks); + registry.fill(HIST("hEventCounter"), counter++); - registry.fill(HIST("hRho"), collision.rho()); + registry.fill(HIST("hRho"), rho); registry.fill(HIST("hCentralityAnalyzed"), collision.centrality()); for (auto const& jet : jets) { - float jetpTbkgsub = jet.pt() - (collision.rho() * jet.area()); + float jetpTbkgsub = jet.pt() - (rho * jet.area()); + if (cfgrhoPhi) + rho = evalRho(rhoFit.get(), jet.phi(), rho); registry.fill(HIST("hJetPt"), jet.pt()); registry.fill(HIST("hJetPt_bkgsub"), jetpTbkgsub); registry.fill(HIST("hJetEta"), jet.eta()); registry.fill(HIST("hJetPhi"), jet.phi()); registry.fill(HIST("hJetArea"), jet.area()); - float dPhi{RecoDecay::constrainAngle(jet.phi() - vPsi2, -o2::constants::math::PI)}; + float dPhi{RecoDecay::constrainAngle(jet.phi() - psi.psi2, -o2::constants::math::PI)}; registry.fill(HIST("hdPhi"), dPhi); registry.fill(HIST("hCentJetPtdPhiq2"), collision.centrality(), jetpTbkgsub, dPhi, qPerc[0]); } @@ -260,16 +306,24 @@ struct JetSpectraEseTask { } PROCESS_SWITCH(JetSpectraEseTask, processESEDataCharged, "process ese collisions", true); + void processESEBackground(soa::Filtered>::iterator const& collision, + soa::Join const& jets, + aod::JetTracks const& tracks) + { + bkgFluctuationsRandomCone(collision, jets, tracks); + } + PROCESS_SWITCH(JetSpectraEseTask, processESEBackground, "process random cones with event plane and ESE", false); + void processESEOccupancy(soa::Join::iterator const& collision, soa::Join const& tracks) { float count{0.5}; registry.fill(HIST("hEventCounterOcc"), count++); - const auto vPsi2{procEP(collision)}; + const auto psi{procEP(collision)}; const auto qPerc{collision.qPERCFT0C()}; auto occupancy{collision.trackOccupancyInTimeRange()}; - registry.fill(HIST("hPsiOccupancy"), collision.centrality(), vPsi2, occupancy); + registry.fill(HIST("hPsiOccupancy"), collision.centrality(), psi.psi2, occupancy); registry.fill(HIST("hOccupancy"), occupancy); if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) @@ -430,26 +484,35 @@ struct JetSpectraEseTask { return true; } template - float procEP(EPCol const& vec) + EventPlane procEP(EPCol const& vec) { constexpr std::array AmpCut{1e-8, 0.0}; - auto computeEP = [&AmpCut](std::vector vec, auto det) { return vec[2] > AmpCut[det] ? 0.5 * std::atan2(vec[1], vec[0]) : 999.; }; + auto computeEP = [&AmpCut](std::vector vec, auto det, float n) { return vec[2] > AmpCut[det] ? (1.0 / n) * std::atan2(vec[1], vec[0]) : 999.; }; std::map epMap; - epMap["FT0A"] = computeEP(qVecNoESE(vec), 0); + std::map ep3Map; + auto vec1{qVecNoESE(vec)}; + epMap["FT0A"] = computeEP(vec1, 0, 2.0); + ep3Map["FT0A"] = computeEP(vec1, 0, 3.0); if constexpr (Fill) { - epMap["FT0C"] = computeEP(qVecNoESE(vec), 0); - epMap["FV0A"] = computeEP(qVecNoESE(vec), 0); - epMap["TPCpos"] = computeEP(qVecNoESE(vec), 1); - epMap["TPCneg"] = computeEP(qVecNoESE(vec), 1); + auto vec2{qVecNoESE(vec)}; + epMap["FT0C"] = computeEP(vec2, 0, 2.0); + ep3Map["FT0C"] = computeEP(vec2, 0, 3.0); + epMap["FV0A"] = computeEP(qVecNoESE(vec), 0, 2.0); + epMap["TPCpos"] = computeEP(qVecNoESE(vec), 1, 2.0); + epMap["TPCneg"] = computeEP(qVecNoESE(vec), 1, 2.0); fillEP(/*std::make_index_sequence<5>{},*/ vec, epMap); auto cosPsi = [](float psiX, float psiY) { return (static_cast(psiX) == 999. || static_cast(psiY) == 999.) ? 999. : std::cos(2.0 * (psiX - psiY)); }; std::array epCorrContainer{}; - epCorrContainer[0] = cosPsi(epMap[cfgEPRefA], epMap[cfgEPRefC]); - epCorrContainer[1] = cosPsi(epMap[cfgEPRefA], epMap[cfgEPRefB]); - epCorrContainer[2] = cosPsi(epMap[cfgEPRefB], epMap[cfgEPRefC]); + epCorrContainer[0] = cosPsi(epMap.at(cfgEPRefA), epMap.at(cfgEPRefC)); + epCorrContainer[1] = cosPsi(epMap.at(cfgEPRefA), epMap.at(cfgEPRefB)); + epCorrContainer[2] = cosPsi(epMap.at(cfgEPRefB), epMap.at(cfgEPRefC)); fillEPCos(/*std::make_index_sequence<3>{},*/ vec, epCorrContainer); } - return epMap[cfgEPRefA]; + EventPlane localPlane; + localPlane.psi2 = epMap.at(cfgEPRefA); + localPlane.psi3 = ep3Map.at(cfgEPRefA); + return localPlane; + // return epMap.at(cfgEPRefA); } template void fillEPCos(/*const std::index_sequence&,*/ const collision& col, const std::array& Corr) @@ -532,6 +595,145 @@ struct JetSpectraEseTask { else return true; } -}; + template + std::unique_ptr fitRho(const C& col, const EventPlane& ep, T const& tracks) + { + auto hPhiPt = std::unique_ptr(new TH1F("h_ptsum_sumpt_fit", "h_ptsum_sumpt fit use", TMath::CeilNint(std::sqrt(tracks.size())), 0., o2::constants::math::TwoPI)); + + for (const auto& track : tracks) { + if (jetderiveddatautilities::selectTrack(track, trackSelection)) { + hPhiPt->Fill(track.phi(), track.pt()); + registry.fill(HIST("hPhiPtsum"), track.phi(), track.pt()); + } + } + auto modulationFit = std::unique_ptr(new TF1("fit_rholoc", "[0] * (1. + 2. * ([1] * cos(2. * (x - [2])) + [3] * cos(3. * (x - [4]))))", 0, o2::constants::math::TwoPI)); + + modulationFit->SetParameter(0, 1.0); + modulationFit->SetParameter(1, 0.01); + modulationFit->SetParameter(3, 0.01); + + modulationFit->FixParameter(2, (ep.psi2 < 0) ? RecoDecay::constrainAngle(ep.psi2) : ep.psi2); + modulationFit->FixParameter(4, (ep.psi3 < 0) ? RecoDecay::constrainAngle(ep.psi3) : ep.psi3); + + hPhiPt->Fit(modulationFit.get(), "Q", "", 0, o2::constants::math::TwoPI); + + std::array fitParams{}; + for (int i{0}; i < 5; ++i) { + fitParams[i] = modulationFit->GetParameter(i); + } + + registry.fill(HIST("hfitPar0"), col.centrality(), fitParams[0]); + registry.fill(HIST("hfitPar1"), col.centrality(), fitParams[1]); + registry.fill(HIST("hfitPar2"), col.centrality(), fitParams[2]); + registry.fill(HIST("hfitPar3"), col.centrality(), fitParams[3]); + registry.fill(HIST("hfitPar4"), col.centrality(), fitParams[4]); + + double chi2{0.}; + for (int i{0}; i < hPhiPt->GetXaxis()->GetNbins(); i++) { + if (hPhiPt->GetBinContent(i + 1) <= 0.) + continue; + chi2 += std::pow((hPhiPt->GetBinContent(i + 1) - modulationFit->Eval(hPhiPt->GetXaxis()->GetBinCenter(1 + i))), 2) / hPhiPt->GetBinContent(i + 1); + } + + int nDF{1}; + int numParams{2}; + nDF = static_cast(modulationFit->GetXaxis()->GetNbins()) - numParams; + if (nDF == 0 || static_cast(nDF) <= 0.) + nDF = 1; + + auto cDF = 1. - TMath::Gamma(nDF, chi2); + + registry.fill(HIST("hPValueCentCDF"), col.centrality(), cDF); + registry.fill(HIST("hCentChi2Ndf"), col.centrality(), chi2 / (static_cast(nDF))); + + return modulationFit; + } + + template + double evalRho(TF1* fit, phiT const& jetPhi, rhoT const& colRho) + { + double integralValue{fit->Integral(jetPhi - jetR, jetPhi + jetR)}; + if (fit->GetParameter(0) < 0) + return colRho; + double rhoLocal{colRho / (2 * jetR * fit->GetParameter(0)) * integralValue}; + return rhoLocal; + } + + template + void bkgFluctuationsRandomCone(TCollisions const& collision, TJets const& jets, TTracks const& tracks) + { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + return; + } + if (cfgEvSelOccupancy && !isOccupancyWithin(collision)) + return; + + const auto psi{procEP(collision)}; + auto qPerc{collision.qPERCFT0C()}; + if (qPerc[0] < 0) + return; + + TRandom3 randomNumber(0); + float randomConeEta = randomNumber.Uniform(trackEtaMin + randomConeR, trackEtaMax - randomConeR); + float randomConePhi = randomNumber.Uniform(0.0, o2::constants::math::TwoPI); + float randomConePt = 0; + for (auto const& track : tracks) { + if (jetderiveddatautilities::selectTrack(track, trackSelection)) { + float dPhi = RecoDecay::constrainAngle(track.phi() - randomConePhi, -o2::constants::math::PI); + float dEta = track.eta() - randomConeEta; + if (std::sqrt(dEta * dEta + dPhi * dPhi) < randomConeR) { + randomConePt += track.pt(); + } + } + } + registry.fill(HIST("hCentRhoRandomCone"), collision.centrality(), randomConePt - o2::constants::math::PI * randomConeR * randomConeR * collision.rho()); + + randomConePt = 0; + for (auto const& track : tracks) { + if (jetderiveddatautilities::selectTrack(track, trackSelection)) { + float dPhi = RecoDecay::constrainAngle(randomNumber.Uniform(0.0, o2::constants::math::TwoPI) - randomConePhi, -o2::constants::math::PI); + float dEta = randomNumber.Uniform(trackEtaMin, trackEtaMax) - randomConeEta; + if (std::sqrt(dEta * dEta + dPhi * dPhi) < randomConeR) { + randomConePt += track.pt(); + } + } + } + registry.fill(HIST("hCentRhoRandomConeRandomTrackDir"), collision.centrality(), randomConePt - o2::constants::math::PI * randomConeR * randomConeR * collision.rho()); + + if (jets.size() > 0) { + float dPhiLeadingJet = RecoDecay::constrainAngle(jets.iteratorAt(0).phi() - randomConePhi, -o2::constants::math::PI); + float dEtaLeadingJet = jets.iteratorAt(0).eta() - randomConeEta; + + bool jetWasInCone = false; + while ((randomConeLeadJetDeltaR <= 0 && (std::sqrt(dEtaLeadingJet * dEtaLeadingJet + dPhiLeadingJet * dPhiLeadingJet) < jets.iteratorAt(0).r() / 100.0 + randomConeR)) || (randomConeLeadJetDeltaR > 0 && (std::sqrt(dEtaLeadingJet * dEtaLeadingJet + dPhiLeadingJet * dPhiLeadingJet) < randomConeLeadJetDeltaR))) { + jetWasInCone = true; + randomConeEta = randomNumber.Uniform(trackEtaMin + randomConeR, trackEtaMax - randomConeR); + randomConePhi = randomNumber.Uniform(0.0, o2::constants::math::TwoPI); + dPhiLeadingJet = RecoDecay::constrainAngle(jets.iteratorAt(0).phi() - randomConePhi, -o2::constants::math::PI); + dEtaLeadingJet = jets.iteratorAt(0).eta() - randomConeEta; + } + if (jetWasInCone) { + randomConePt = 0.0; + for (auto const& track : tracks) { + if (jetderiveddatautilities::selectTrack(track, trackSelection)) { + float dPhi = RecoDecay::constrainAngle(track.phi() - randomConePhi, -o2::constants::math::PI); + float dEta = track.eta() - randomConeEta; + if (std::sqrt(dEta * dEta + dPhi * dPhi) < randomConeR) { + randomConePt += track.pt(); + } + } + } + } + } + auto rho = collision.rho(); + std::unique_ptr rhoFit{nullptr}; + if (cfgrhoPhi) { + rhoFit = fitRho(collision, psi, tracks); + rho = evalRho(rhoFit.get(), randomConePhi, rho); + } + float dPhi{RecoDecay::constrainAngle(randomConePhi - psi.psi2, -o2::constants::math::PI)}; + registry.fill(HIST("hCentRhoRandomConewoLeadingJet"), collision.centrality(), randomConePt - o2::constants::math::PI * randomConeR * randomConeR * rho, dPhi, qPerc[0]); + } +}; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From f51c61c193aa52ac7c4e1154721e125248c5cd49 Mon Sep 17 00:00:00 2001 From: sarjeetagami <162087855+sarjeetagami@users.noreply.github.com> Date: Tue, 25 Feb 2025 00:10:47 +0530 Subject: [PATCH 0399/1650] [PWGLF] added event loss and signal loss (#10155) Co-authored-by: sarjeeta gami --- .../Tasks/Resonances/phianalysisrun3_PbPb.cxx | 119 ++++++++++++++++-- 1 file changed, 111 insertions(+), 8 deletions(-) diff --git a/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx b/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx index ca4c7e313ba..31468db8754 100644 --- a/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx +++ b/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx @@ -97,6 +97,7 @@ struct phianalysisrun3_PbPb { Configurable confMinRot{"confMinRot", 5.0 * TMath::Pi() / 6.0, "Minimum of rotation"}; Configurable confMaxRot{"confMaxRot", 7.0 * TMath::Pi() / 6.0, "Maximum of rotation"}; Configurable PDGcheck{"PDGcheck", true, "PDGcheck"}; + Configurable Reco{"Reco", true, "Reco"}; Configurable genacceptancecut{"genacceptancecut", true, "use acceptance cut for generated"}; // MC @@ -115,6 +116,12 @@ struct phianalysisrun3_PbPb { histos.add("h3PhiInvMassSame", "Invariant mass of Phi meson same", kTH3F, {{200, 0.0, 200.0}, {200, 0.0f, 20.0f}, {200, 0.9, 1.1}}); } else if (isMC) { histos.add("hMC", "MC Event statistics", kTH1F, {{10, 0.0f, 10.0f}}); + histos.add("EL1", "MC Event statistics", kTH2F, {{1, 0.0f, 1.0f}, {200, 0.0f, 20.0f}}); + histos.add("EL2", "MC Event statistics", kTH2F, {{1, 0.0f, 1.0f}, {200, 0.0, 200.0}}); + histos.add("ES1", "MC Event statistics", kTH2F, {{1, 0.0f, 1.0f}, {200, 0.0f, 20.0f}}); + histos.add("ES3", "MC Event statistics", kTH2F, {{1, 0.0f, 1.0f}, {200, 0.0f, 20.0f}}); + histos.add("ES2", "MC Event statistics", kTH2F, {{1, 0.0f, 1.0f}, {200, 0.0, 200.0}}); + histos.add("ES4", "MC Event statistics", kTH2F, {{1, 0.0f, 1.0f}, {200, 0.0, 200.0}}); histos.add("h1PhiGen", "Phi meson Gen", kTH1F, {{200, 0.0f, 20.0f}}); histos.add("h1PhiGen1", "Phi meson Gen", kTH1F, {{200, 0.0f, 20.0f}}); histos.add("h1PhiRecsplit", "Phi meson Rec split", kTH1F, {{200, 0.0f, 20.0f}}); @@ -125,13 +132,22 @@ struct phianalysisrun3_PbPb { histos.add("h3Phi1Rec3", "Phi meson Rec", kTH3F, {{200, 0.0f, 20.0f}, {200, 0.0, 200.0}, {200, 0.9, 1.1}}); histos.add("h3PhiGen3", "Phi meson Gen", kTH3F, {{200, 0.0f, 20.0f}, {200, 0.0, 200.0}, {200, 0.9, 1.1}}); histos.add("h3PhiInvMassMixedMC", "Invariant mass of Phi meson Mixed", kTH3F, {{200, 0.0, 200.0}, {200, 0.0f, 20.0f}, {200, 0.9, 1.1}}); + histos.add("h3PhiInvMassSameMC", "Invariant mass of Phi meson same", kTH3F, {{200, 0.0, 200.0}, {200, 0.0f, 20.0f}, {200, 0.9, 1.1}}); + histos.add("h3PhiInvMassRotMC", "Invariant mass of Phi meson Rotation", kTH3F, {{200, 0.0, 200.0}, {200, 0.0f, 20.0f}, {200, 0.9, 1.1}}); histos.add("h2PhiGen2", "Phi meson gen", kTH2F, {{200, 0.0f, 20.0f}, {200, 0.0, 200.0}}); histos.add("h1PhiRec1", "Phi meson Rec", kTH1F, {{200, 0.0f, 20.0f}}); histos.add("h1Phimassgen", "Phi meson gen", kTH1F, {{200, 0.9, 1.1}}); histos.add("h1Phimassrec", "Phi meson Rec", kTH1F, {{200, 0.9, 1.1}}); + histos.add("h1Phimasssame", "Phi meson Rec", kTH1F, {{200, 0.9, 1.1}}); + histos.add("h1Phimassmix", "Phi meson Rec", kTH1F, {{200, 0.9, 1.1}}); + histos.add("h1Phimassrot", "Phi meson Rec", kTH1F, {{200, 0.9, 1.1}}); histos.add("h1Phi1massrec", "Phi meson Rec", kTH1F, {{200, 0.9, 1.1}}); histos.add("h1Phipt", "Phi meson Rec", kTH1F, {{200, 0.0f, 20.0f}}); histos.add("hOccupancy1", "Occupancy distribution", kTH1F, {{500, 0, 50000}}); + histos.add("hImpactParameterGen", "Impact parameter of generated MC events", kTH1F, {{200, 0.0f, 20.0f}}); + histos.add("hImpactParameterRec", "Impact parameter of generated MC events", kTH1F, {{200, 0.0f, 20.0f}}); + histos.add("hImpactParameterGenCen", "Impact parameter of generated MC events", kTH2F, {{200, 0.0f, 20.0f}, {200, 0.0, 200.0}}); + histos.add("hImpactParameterRecCen", "Impact parameter of generated MC events", kTH2F, {{200, 0.0f, 20.0f}, {200, 0.0, 200.0}}); histos.add("TOF_Nsigma_MC", "TOF NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Kaon};", {HistType::kTH3D, {{200, -12, 12}, {200, 0.0, 200.0}, {200, 0.0f, 20.0f}}}); histos.add("TPC_Nsigma_MC", "TPC NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Kaon};", {HistType::kTH3D, {{200, -12, 12}, {200, 0.0, 200.0}, {200, 0.0f, 20.0f}}}); } @@ -498,7 +514,7 @@ struct phianalysisrun3_PbPb { } int occupancy = RecCollision.trackOccupancyInTimeRange(); if (fillOccupancy && !(occupancy > cfgOccupancyCut1 && occupancy < cfgOccupancyCut2)) { - return; + continue; } if (TMath::Abs(RecCollision.posZ()) > cfgCutVertex) { histos.fill(HIST("hMC"), 6); @@ -506,7 +522,6 @@ struct phianalysisrun3_PbPb { } histos.fill(HIST("hMC"), 7); auto centrality = RecCollision.centFT0C(); - histos.fill(HIST("Centrec"), centrality); auto oldindex = -999; auto Rectrackspart = RecTracks.sliceBy(perCollision, RecCollision.globalIndex()); // loop over reconstructed particle @@ -598,6 +613,7 @@ struct phianalysisrun3_PbPb { histos.fill(HIST("h2PhiRec2"), PhiMesonMother.pt(), centrality); histos.fill(HIST("h1Phimassrec"), PhiMesonMother.M()); histos.fill(HIST("h3PhiRec3"), PhiMesonMother.pt(), centrality, PhiMesonMother.M()); + histos.fill(HIST("Centrec"), centrality); } } } @@ -642,6 +658,7 @@ struct phianalysisrun3_PbPb { PhiMesonMother = KaonPlus + KaonMinus; histos.fill(HIST("h1PhiGen"), PhiMesonMother.pt()); histos.fill(HIST("h2PhiGen2"), PhiMesonMother.pt(), centrality); + histos.fill(HIST("Centgen"), centrality); histos.fill(HIST("h1Phimassgen"), PhiMesonMother.M()); } } @@ -651,10 +668,13 @@ struct phianalysisrun3_PbPb { PROCESS_SWITCH(phianalysisrun3_PbPb, processMC, "Process Reconstructed", false); void processGen(aod::McCollision const& mcCollision, aod::McParticles& mcParticles, const soa::SmallGroups& collisions) { + histos.fill(HIST("hMC"), 0.5); if (std::abs(mcCollision.posZ()) < cfgCutVertex) { histos.fill(HIST("hMC"), 1.5); } + float imp = mcCollision.impactParameter(); + histos.fill(HIST("hImpactParameterGen"), imp); std::vector SelectedEvents(collisions.size()); int nevts = 0; auto multiplicity = 0; @@ -669,15 +689,21 @@ struct phianalysisrun3_PbPb { histos.fill(HIST("hOccupancy1"), occupancy); multiplicity = collision.centFT0C(); histos.fill(HIST("Centgen"), multiplicity); + histos.fill(HIST("hImpactParameterGenCen"), imp, multiplicity); + SelectedEvents[nevts++] = collision.mcCollision_as().globalIndex(); + histos.fill(HIST("hMC"), 2.5); } SelectedEvents.resize(nevts); + const auto evtReconstructedAndSelected = std::find(SelectedEvents.begin(), SelectedEvents.end(), mcCollision.globalIndex()) != SelectedEvents.end(); - histos.fill(HIST("hMC"), 3.5); - if (!evtReconstructedAndSelected) { // Check that the event is reconstructed and that the reconstructed events pass the selection + histos.fill(HIST("EL1"), 0, imp); + histos.fill(HIST("EL2"), 0, multiplicity); + if (Reco && !evtReconstructedAndSelected) { // Check that the event is reconstructed and that the reconstructed events pass the selection return; } - histos.fill(HIST("hMC"), 4.5); + histos.fill(HIST("ES1"), 0, imp); + histos.fill(HIST("ES2"), 0, multiplicity); for (auto& mcParticle : mcParticles) { if (std::abs(mcParticle.y()) >= 0.5) { continue; @@ -727,7 +753,11 @@ struct phianalysisrun3_PbPb { } auto multiplicity = collision.centFT0C(); histos.fill(HIST("Centrec"), multiplicity); - histos.fill(HIST("hMC"), 5.5); + float imp = collision.mcCollision().impactParameter(); + histos.fill(HIST("hImpactParameterRec"), imp); + histos.fill(HIST("hImpactParameterRecCen"), imp, multiplicity); + histos.fill(HIST("ES3"), 0, imp); + histos.fill(HIST("ES4"), 0, multiplicity); auto oldindex = -999; for (auto track1 : tracks) { if (!selectionTrack(track1)) { @@ -824,6 +854,80 @@ struct phianalysisrun3_PbPb { } PROCESS_SWITCH(phianalysisrun3_PbPb, processRec, "Process Reconstructed", false); + void processSameEventMC(EventCandidatesMC::iterator const& collision, TrackCandidatesMC const& tracks, aod::McParticles const& /*mcParticles*/, aod::McCollisions const& /*mcCollisions*/) + { + if (!collision.sel8()) { + return; + } + if (additionalEvSel2 && (!collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { + return; + } + if (additionalEvSel3 && (!collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard))) { + return; + } + int occupancy = collision.trackOccupancyInTimeRange(); + if (fillOccupancy && !(occupancy > cfgOccupancyCut1 && occupancy < cfgOccupancyCut2)) { + return; + } + float multiplicity{-1}; + multiplicity = collision.centFT0C(); + for (auto track1 : tracks) { + if (!selectionTrack(track1)) { + continue; + } + auto track1ID = track1.globalIndex(); + for (auto track2 : tracks) { + if (!selectionTrack(track2)) { + continue; + } + auto track2ID = track2.globalIndex(); + if (track2ID <= track1ID) { + continue; + } + if (!selectionPair(track1, track2)) { + continue; + } + if (!ispTdepPID && (!selectionPID(track1) || !selectionPID(track2))) { + continue; + } + if (ispTdepPID && (!selectionPIDpTdependent(track1) || !selectionPIDpTdependent(track2))) { + continue; + } + if (track1.sign() * track2.sign() < 0) { + KaonPlus = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); + KaonMinus = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massKa); + } + PhiMesonMother = KaonPlus + KaonMinus; + if (TMath::Abs(PhiMesonMother.Rapidity()) > confRapidity) { + continue; + } + histos.fill(HIST("h3PhiInvMassSameMC"), multiplicity, PhiMesonMother.pt(), PhiMesonMother.M()); + histos.fill(HIST("h1Phimasssame"), PhiMesonMother.M()); + if (fillRotation) { + for (int nrotbkg = 0; nrotbkg < nBkgRotations; nrotbkg++) { + auto anglestart = confMinRot; + auto angleend = confMaxRot; + auto anglestep = (angleend - anglestart) / (1.0 * (nBkgRotations - 1)); + auto rotangle = anglestart + nrotbkg * anglestep; + if (track1.sign() * track2.sign() < 0) { + auto rotkaonPx = track1.px() * std::cos(rotangle) - track1.py() * std::sin(rotangle); + auto rotkaonPy = track1.px() * std::sin(rotangle) + track1.py() * std::cos(rotangle); + KaonPlus = ROOT::Math::PxPyPzMVector(rotkaonPx, rotkaonPy, track1.pz(), massKa); + KaonMinus = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massKa); + } + PhiMesonMother = KaonPlus + KaonMinus; + if (TMath::Abs(PhiMesonMother.Rapidity()) > confRapidity) { + continue; + } + histos.fill(HIST("h3PhiInvMassRotMC"), multiplicity, PhiMesonMother.pt(), PhiMesonMother.M()); + histos.fill(HIST("h1Phimassrot"), PhiMesonMother.M()); + } + } + } + } + } + + PROCESS_SWITCH(phianalysisrun3_PbPb, processSameEventMC, "Process Same event", false); void processMixedEventMC(EventCandidatesMC const& recCollisions, TrackCandidatesMC const& RecTracks, aod::McParticles const&) { @@ -876,7 +980,6 @@ struct phianalysisrun3_PbPb { if (ispTdepPID && (!selectionPIDpTdependent(t1) || !selectionPIDpTdependent(t2))) { continue; } - histos.fill(HIST("hMC"), 7.5); if (t1.sign() * t2.sign() < 0) { KaonPlus = ROOT::Math::PxPyPzMVector(t1.px(), t1.py(), t1.pz(), massKa); KaonMinus = ROOT::Math::PxPyPzMVector(t2.px(), t2.py(), t2.pz(), massKa); @@ -885,8 +988,8 @@ struct phianalysisrun3_PbPb { if (TMath::Abs(PhiMesonMother.Rapidity()) > confRapidity) { continue; } - histos.fill(HIST("hMC"), 8.5); histos.fill(HIST("h3PhiInvMassMixedMC"), multiplicity, PhiMesonMother.pt(), PhiMesonMother.M()); + histos.fill(HIST("h1Phimassmix"), PhiMesonMother.M()); } } } From e66bcf4f3ffd1fd6ca8e7fcaf0b318ad9f84a5f2 Mon Sep 17 00:00:00 2001 From: Anantha Padmanabhan M Nair <82643666+ananthapadmanabhan18@users.noreply.github.com> Date: Tue, 25 Feb 2025 01:24:40 +0530 Subject: [PATCH 0400/1650] [PWGUD] Added Cos Theta vs Phi (#10148) --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 63 +++++++++++++++++++++++++++---- 1 file changed, 56 insertions(+), 7 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index b12a4ae4be1..d363c9b356f 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -138,6 +138,12 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosData.add("rapidity_event_non0charge_WTS_PID_Pi_domainB", "Rapidity of Events With Track Selection and PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c$; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); histosData.add("rapidity_event_non0charge_WTS_PID_Pi_domainC", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} > 0.80 GeV/c; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + // Pair Invariant Mass + histosData.add("invMass_pair_1", "Invariant Mass Distribution of 2 pions 1 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); + histosData.add("invMass_pair_2", "Invariant Mass Distribution of 2 pions 2 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); + histosData.add("invMass_pair_3", "Invariant Mass Distribution of 2 pions 3 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); + histosData.add("invMass_pair_4", "Invariant Mass Distribution of 2 pions 4 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); + // Invariant Mass of 0 charge events histosData.add("invMass_event_0charge_WTS_PID_Pi_domainA", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for p_{T} < 0.15 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // pT < 0.15GeV histosData.add("invMass_event_0charge_WTS_PID_Pi_domainB", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // 0.15GeV < pT < 0.8GeV @@ -168,6 +174,8 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosData.add("CS_phi_pair_2", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); histosData.add("CS_costheta_pair_1", "#theta Distribution;cos(#theta); Counts", kTH1F, {{nBinsCosTheta, -1, 1}}); histosData.add("CS_costheta_pair_2", "#theta Distribution;cos(#theta); Counts", kTH1F, {{nBinsCosTheta, -1, 1}}); + histosData.add("phi_cosTheta_pair_1", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); + histosData.add("phi_cosTheta_pair_2", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); // MC Gen Stuff @@ -180,7 +188,14 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosMCgen.add("MCgen_particle_rapidity", "Generated Rapidity; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); histosMCgen.add("MCgen_particle_rapidity_contributed", "Generated Rapidity; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + // Pair Invariant Mass + histosMCgen.add("MCgen_invMass_pair_1", "Invariant Mass Distribution of 2 pions 1 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); + histosMCgen.add("MCgen_invMass_pair_2", "Invariant Mass Distribution of 2 pions 2 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); + histosMCgen.add("MCgen_invMass_pair_3", "Invariant Mass Distribution of 2 pions 3 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); + histosMCgen.add("MCgen_invMass_pair_4", "Invariant Mass Distribution of 2 pions 4 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); + // Generated Transverse Momentum, Rapidty and Invariant Mass + histosMCgen.add("MCgen_rhoPrime_pT", "Generated pT; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); histosMCgen.add("MCgen_4pion_pT", "Generated pT; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); histosMCgen.add("MCgen_4pion_rapidity", "Generated Rapidity; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); histosMCgen.add("MCgen_4pion_invmass", "Invariant Mass of 4-Pions; m(4-pion); Events", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); @@ -190,6 +205,8 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosMCgen.add("MCgen_CS_phi_pair_2", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); histosMCgen.add("MCgen_CS_costheta_pair_1", "#theta Distribution;cos(#theta); Events", kTH1F, {{nBinsCosTheta, -1, 1}}); histosMCgen.add("MCgen_CS_costheta_pair_2", "#theta Distribution;cos(#theta); Events", kTH1F, {{nBinsCosTheta, -1, 1}}); + histosMCgen.add("MCgen_phi_cosTheta_pair_1", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); + histosMCgen.add("MCgen_phi_cosTheta_pair_2", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); // MC Reco Stuff @@ -247,6 +264,12 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosMCreco.add("rapidity_event_non0charge_WTS_PID_Pi_domainB", "Rapidity of Events With Track Selection and PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c$; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); histosMCreco.add("rapidity_event_non0charge_WTS_PID_Pi_domainC", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} > 0.80 GeV/c; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + // Pair Invariant Mass + histosMCreco.add("invMass_pair_1", "Invariant Mass Distribution of 2 pions 1 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); + histosMCreco.add("invMass_pair_2", "Invariant Mass Distribution of 2 pions 2 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); + histosMCreco.add("invMass_pair_3", "Invariant Mass Distribution of 2 pions 3 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); + histosMCreco.add("invMass_pair_4", "Invariant Mass Distribution of 2 pions 4 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); + // Invariant Mass of 0 charge events histosMCreco.add("invMass_event_0charge_WTS_PID_Pi_domainA", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for p_{T} < 0.15 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // pT < 0.15GeV histosMCreco.add("invMass_event_0charge_WTS_PID_Pi_domainB", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // 0.15GeV < pT < 0.8GeV @@ -277,6 +300,8 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosMCreco.add("CS_phi_pair_2", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); histosMCreco.add("CS_costheta_pair_1", "#theta Distribution;cos(#theta); Counts", kTH1F, {{nBinsCosTheta, -1, 1}}); histosMCreco.add("CS_costheta_pair_2", "#theta Distribution;cos(#theta); Counts", kTH1F, {{nBinsCosTheta, -1, 1}}); + histosMCreco.add("phi_cosTheta_pair_1", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); + histosMCreco.add("phi_cosTheta_pair_2", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); } // End of init function //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -502,6 +527,11 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosData.fill(HIST("rapidity_event_0charge_WTS_PID_Pi_domainA"), p1234.Rapidity()); histosData.fill(HIST("invMass_event_0charge_WTS_PID_Pi_domainA"), p1234.M()); + histosData.fill(HIST("invMass_pair_1"), (p1 + p3).M()); + histosData.fill(HIST("invMass_pair_2"), (p1 + p4).M()); + histosData.fill(HIST("invMass_pair_3"), (p2 + p3).M()); + histosData.fill(HIST("invMass_pair_4"), (p2 + p4).M()); + auto phiPair1 = phiCollinsSoperFrame(k13, k24, k1234); auto phiPair2 = phiCollinsSoperFrame(k14, k23, k1234); auto cosThetaPair1 = cosThetaCollinsSoperFrame(k13, k24, k1234); @@ -511,6 +541,9 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosData.fill(HIST("CS_phi_pair_2"), phiPair2); histosData.fill(HIST("CS_costheta_pair_1"), cosThetaPair1); histosData.fill(HIST("CS_costheta_pair_2"), cosThetaPair2); + + histosData.fill(HIST("phi_cosTheta_pair_1"), phiPair1, cosThetaPair1); + histosData.fill(HIST("phi_cosTheta_pair_2"), phiPair2, cosThetaPair2); } if (p1234.Pt() > 0.15 && p1234.Pt() < 0.80) { histosData.fill(HIST("rapidity_event_0charge_WTS_PID_Pi_domainB"), p1234.Rapidity()); @@ -563,7 +596,7 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct { std::vector piPlusvectors; std::vector piMinusvectors; - TLorentzVector tempVector, p1, p2, p3, p4; + TLorentzVector motherVector, tempVector, p1, p2, p3, p4; TLorentzVector p1234; bool flag = false; @@ -577,6 +610,8 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct for (const auto& mother : particle.mothers_as()) { if (mother.pdgCode() == 30113) { + motherVector.SetXYZM(mother.px(), mother.py(), mother.pz(), o2::constants::physics::MassPionCharged); + histosMCgen.fill(HIST("MCgen_rhoPrime_pT"), motherVector.Pt()); if (flag == false) { histosMCgen.fill(HIST("rhoPrimeCounts"), 5); } @@ -585,16 +620,16 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct if (particle.pdgCode() == 211) { histosMCgen.fill(HIST("MCgen_particle_pT"), tempVector.Pt()); histosMCgen.fill(HIST("MCgen_particle_rapidity"), tempVector.Rapidity()); - if (std::abs(tempVector.Rapidity()) < 0.9) { - piPlusvectors.push_back(tempVector); - } + // if(std::abs(tempVector.Rapidity()) < 0.9){ + piPlusvectors.push_back(tempVector); + // } } if (particle.pdgCode() == -211) { histosMCgen.fill(HIST("MCgen_particle_pT"), tempVector.Pt()); histosMCgen.fill(HIST("MCgen_particle_rapidity"), tempVector.Rapidity()); - if (std::abs(tempVector.Rapidity()) < 0.9) { - piMinusvectors.push_back(tempVector); - } + // if(std::abs(tempVector.Rapidity()) < 0.9){ + piMinusvectors.push_back(tempVector); + // } } } // End of Mother ID 30113 rho prime } // End of loop over mothers @@ -620,6 +655,11 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosMCgen.fill(HIST("MCgen_4pion_rapidity"), p1234.Rapidity()); histosMCgen.fill(HIST("MCgen_4pion_invmass"), p1234.M()); + histosMCgen.fill(HIST("MCgen_invMass_pair_1"), (piPlusvectors[0] + piMinusvectors[0]).M()); + histosMCgen.fill(HIST("MCgen_invMass_pair_2"), (piPlusvectors[0] + piMinusvectors[1]).M()); + histosMCgen.fill(HIST("MCgen_invMass_pair_3"), (piPlusvectors[1] + piMinusvectors[0]).M()); + histosMCgen.fill(HIST("MCgen_invMass_pair_4"), (piPlusvectors[1] + piMinusvectors[1]).M()); + ROOT::Math::PtEtaPhiMVector k1, k2, k3, k4, k1234, k13, k14, k23, k24; k1.SetCoordinates(piPlusvectors[0].Pt(), piPlusvectors[0].Eta(), piPlusvectors[0].Phi(), o2::constants::physics::MassPionCharged); @@ -643,6 +683,8 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosMCgen.fill(HIST("MCgen_CS_phi_pair_2"), phiPair2); histosMCgen.fill(HIST("MCgen_CS_costheta_pair_1"), cosThetaPair1); histosMCgen.fill(HIST("MCgen_CS_costheta_pair_2"), cosThetaPair2); + histosMCgen.fill(HIST("MCgen_phi_cosTheta_pair_1"), phiPair1, cosThetaPair1); + histosMCgen.fill(HIST("MCgen_phi_cosTheta_pair_2"), phiPair2, cosThetaPair2); } // End of 4 Pion MC Generation Process function PROCESS_SWITCH(exclusiveRhoTo4Pi, processMCgen, "The Process for 4 Pion Analysis from MC Generation", false); @@ -812,6 +854,11 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosMCreco.fill(HIST("rapidity_event_0charge_WTS_PID_Pi_domainA"), p1234.Rapidity()); histosMCreco.fill(HIST("invMass_event_0charge_WTS_PID_Pi_domainA"), p1234.M()); + histosMCreco.fill(HIST("invMass_pair_1"), (p1 + p3).M()); + histosMCreco.fill(HIST("invMass_pair_2"), (p1 + p4).M()); + histosMCreco.fill(HIST("invMass_pair_3"), (p2 + p3).M()); + histosMCreco.fill(HIST("invMass_pair_4"), (p2 + p4).M()); + auto phiPair1 = phiCollinsSoperFrame(k13, k24, k1234); auto phiPair2 = phiCollinsSoperFrame(k14, k23, k1234); auto cosThetaPair1 = cosThetaCollinsSoperFrame(k13, k24, k1234); @@ -821,6 +868,8 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosMCreco.fill(HIST("CS_phi_pair_2"), phiPair2); histosMCreco.fill(HIST("CS_costheta_pair_1"), cosThetaPair1); histosMCreco.fill(HIST("CS_costheta_pair_2"), cosThetaPair2); + histosMCreco.fill(HIST("phi_cosTheta_pair_1"), phiPair1, cosThetaPair1); + histosMCreco.fill(HIST("phi_cosTheta_pair_2"), phiPair2, cosThetaPair2); } if (p1234.Pt() > 0.15 && p1234.Pt() < 0.80) { histosMCreco.fill(HIST("rapidity_event_0charge_WTS_PID_Pi_domainB"), p1234.Rapidity()); From 618a83e7e4e5b235f997fb7c1f29e241fdac7e67 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Mon, 24 Feb 2025 21:17:20 +0100 Subject: [PATCH 0401/1650] [PWGLF] Add new process function to calculate event plane dependent phi meson weight (#10174) --- PWGLF/Tasks/Resonances/phipbpb.cxx | 166 +++++++++++++++++++++++++++-- 1 file changed, 160 insertions(+), 6 deletions(-) diff --git a/PWGLF/Tasks/Resonances/phipbpb.cxx b/PWGLF/Tasks/Resonances/phipbpb.cxx index 760fb5a2e05..7782885a042 100644 --- a/PWGLF/Tasks/Resonances/phipbpb.cxx +++ b/PWGLF/Tasks/Resonances/phipbpb.cxx @@ -142,10 +142,10 @@ struct phipbpb { using CollisionMCTrueTable = aod::McCollisions; using TrackMCTrueTable = aod::McParticles; + using CollisionMCRecTableCentFT0C = soa::SmallGroups>; using TrackMCRecTable = soa::Join; using FilTrackMCRecTable = soa::Filtered; - Preslice perCollision = aod::track::collisionId; SliceCache cache; @@ -253,6 +253,9 @@ struct phipbpb { histos.add("hSparseV2MCRecCosThetaStar_effy", "hSparseV2SameEventCosThetaStar_effy", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, thnAxisCosThetaStar, thnAxisRapidity, thnAxisCentrality}); // weight + histos.add("hSparsePhiMCGenWeight", "hSparsePhiMCGenWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, thnAxisPt, {8, -0.8, 0.8}}); + histos.add("hSparsePhiMCRecWeight", "hSparsePhiMCRecWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, thnAxisPt, {8, -0.8, 0.8}}); + histos.add("hImpactParameter", "Impact parameter", kTH1F, {{200, 0.0f, 20.0f}}); histos.add("hEventPlaneAngle", "hEventPlaneAngle", kTH1F, {{200, -2.0f * TMath::Pi(), 2.0f * TMath::Pi()}}); histos.add("hEventPlaneAngleRec", "hEventPlaneAngleRec", kTH1F, {{200, -2.0f * TMath::Pi(), 2.0f * TMath::Pi()}}); @@ -410,7 +413,8 @@ struct phipbpb { ROOT::Math::XYZVector threeVecDauCM, threeVecDauCMXY, eventplaneVec, eventplaneVecNorm, beamvector; int currentRunNumber = -999; int lastRunNumber = -999; - TH3D* hweight; + // TH3D* hweight; + TH2D* hweight; void processSameEvent(EventCandidates::iterator const& collision, TrackCandidates const& /*tracks, aod::BCs const&*/, aod::BCsWithTimestamps const&) { if (!collision.sel8() || !collision.triggereventep() || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(aod::evsel::kNoITSROFrameBorder) || !collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV) || !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { @@ -470,7 +474,8 @@ struct phipbpb { auto bc = collision.bc_as(); currentRunNumber = collision.bc_as().runNumber(); if (useWeight && (currentRunNumber != lastRunNumber)) { - hweight = ccdb->getForTimeStamp(ConfWeightPath.value, bc.timestamp()); + // hweight = ccdb->getForTimeStamp(ConfWeightPath.value, bc.timestamp()); + hweight = ccdb->getForTimeStamp(ConfWeightPath.value, bc.timestamp()); } lastRunNumber = currentRunNumber; int Npostrack = 0; @@ -500,7 +505,8 @@ struct phipbpb { auto track1ID = track1.globalIndex(); if (useWeight) { if (track1.pt() < 10.0 && track1.pt() > 0.15) { - weight1 = hweight->GetBinContent(hweight->FindBin(centrality, GetPhiInRange(track1.phi() - psiFT0C), track1.pt() + 0.000005)); + // weight1 = hweight->GetBinContent(hweight->FindBin(centrality, GetPhiInRange(track1.phi() - psiFT0C), track1.pt() + 0.000005)); + weight1 = 1 + hweight->GetBinContent(hweight->FindBin(centrality, track1.pt() + 0.000005)) * TMath::Cos(2.0 * GetPhiInRange(track1.phi() - psiFT0C)); } else { weight1 = 1; } @@ -538,7 +544,8 @@ struct phipbpb { } if (useWeight) { if (track2.pt() < 10.0 && track2.pt() > 0.15) { - weight2 = hweight->GetBinContent(hweight->FindBin(centrality, GetPhiInRange(track2.phi() - psiFT0C), track2.pt() + 0.000005)); + // weight2 = hweight->GetBinContent(hweight->FindBin(centrality, GetPhiInRange(track2.phi() - psiFT0C), track2.pt() + 0.000005)); + weight2 = 1 + hweight->GetBinContent(hweight->FindBin(centrality, track2.pt() + 0.000005)) * TMath::Cos(2.0 * GetPhiInRange(track2.phi() - psiFT0C)); } else { weight2 = 1; } @@ -552,7 +559,7 @@ struct phipbpb { auto phimother = PhiMesonMother.Phi(); histos.fill(HIST("hpTvsRapidity"), PhiMesonMother.Pt(), PhiMesonMother.Rapidity()); auto totalweight = weight1 * weight2; - if (totalweight <= 0.0005) { + if (totalweight <= 0.0000005) { totalweight = 1.0; } // LOGF(info, Form("weight %f %f",weight1, weight2)); @@ -992,6 +999,153 @@ struct phipbpb { histos.fill(HIST("hNchVsImpactParameter"), imp, nCh); } PROCESS_SWITCH(phipbpb, processMCweight, "Process MC Weight", false); + + void processMCPhiWeight(CollisionMCTrueTable::iterator const& TrueCollision, CollisionMCRecTableCentFT0C const& RecCollisions, TrackMCTrueTable const& GenParticles, FilTrackMCRecTable const& RecTracks) + { + float imp = TrueCollision.impactParameter(); + float evPhi = TrueCollision.eventPlaneAngle() / 2.0; + float centclass = -999; + if (imp >= 0 && imp < 3.49) { + centclass = 2.5; + } + if (imp >= 3.49 && imp < 4.93) { + centclass = 7.5; + } + if (imp >= 4.93 && imp < 6.98) { + centclass = 15.0; + } + if (imp >= 6.98 && imp < 8.55) { + centclass = 25.0; + } + if (imp >= 8.55 && imp < 9.87) { + centclass = 35.0; + } + if (imp >= 9.87 && imp < 11) { + centclass = 45.0; + } + if (imp >= 11 && imp < 12.1) { + centclass = 55.0; + } + if (imp >= 12.1 && imp < 13.1) { + centclass = 65.0; + } + if (imp >= 13.1 && imp < 14) { + centclass = 75.0; + } + histos.fill(HIST("hImpactParameter"), imp); + histos.fill(HIST("hEventPlaneAngle"), evPhi); + if (centclass < 0.0 || centclass > 80.0) { + return; + } + for (auto& RecCollision : RecCollisions) { + auto psiFT0C = evPhi; + if (!RecCollision.sel8()) { + continue; + } + if (!RecCollision.selection_bit(aod::evsel::kNoITSROFrameBorder)) { + continue; + } + if (TMath::Abs(RecCollision.posZ()) > cfgCutVertex) { + continue; + } + auto oldindex = -999; + auto Rectrackspart = RecTracks.sliceBy(perCollision, RecCollision.globalIndex()); + // loop over reconstructed particle + for (auto track1 : Rectrackspart) { + if (!track1.has_mcParticle()) { + continue; + } + auto track1ID = track1.index(); + for (auto track2 : Rectrackspart) { + if (!track2.has_mcParticle()) { + continue; + } + auto track2ID = track2.index(); + if (track2ID <= track1ID) { + continue; + } + const auto mctrack1 = track1.mcParticle(); + const auto mctrack2 = track2.mcParticle(); + int track1PDG = TMath::Abs(mctrack1.pdgCode()); + int track2PDG = TMath::Abs(mctrack2.pdgCode()); + if (!mctrack1.isPhysicalPrimary()) { + continue; + } + if (!mctrack2.isPhysicalPrimary()) { + continue; + } + if (!(track1PDG == 321 && track2PDG == 321)) { + continue; + } + if (!selectionTrack(track1) || !selectionTrack(track2) || !selectionPIDpTdependent(track1) || !selectionPIDpTdependent(track2) || track1.sign() * track2.sign() > 0) { + continue; + } + for (auto& mothertrack1 : mctrack1.mothers_as()) { + for (auto& mothertrack2 : mctrack2.mothers_as()) { + if (mothertrack1.pdgCode() != mothertrack2.pdgCode()) { + continue; + } + if (mothertrack1 != mothertrack2) { + continue; + } + if (TMath::Abs(mothertrack1.y()) > confRapidity) { + continue; + } + if (TMath::Abs(mothertrack1.pdgCode()) != 333) { + continue; + } + // if (avoidsplitrackMC && oldindex == mothertrack1.globalIndex()) { + if (avoidsplitrackMC && oldindex == mothertrack1.index()) { + histos.fill(HIST("h1PhiRecsplit"), mothertrack1.pt()); + continue; + } + // oldindex = mothertrack1.globalIndex(); + oldindex = mothertrack1.index(); + auto PhiMinusPsi = GetPhiInRange(mothertrack1.phi() - psiFT0C); + histos.fill(HIST("hSparsePhiMCRecWeight"), centclass, PhiMinusPsi, TMath::Power(TMath::Cos(2.0 * PhiMinusPsi), 2.0), mothertrack1.pt(), mothertrack1.eta()); + } + } + } + } + // loop over generated particle + for (auto& mcParticle : GenParticles) { + if (TMath::Abs(mcParticle.y()) > confRapidity) { + continue; + } + if (mcParticle.pdgCode() != 333) { + continue; + } + auto kDaughters = mcParticle.daughters_as(); + if (kDaughters.size() != 2) { + continue; + } + auto daughtp = false; + auto daughtm = false; + for (auto kCurrentDaughter : kDaughters) { + if (!kCurrentDaughter.isPhysicalPrimary()) { + continue; + } + if (kCurrentDaughter.pdgCode() == +321) { + if (kCurrentDaughter.pt() > cfgCutPT && TMath::Abs(kCurrentDaughter.eta()) < cfgCutEta) { + daughtp = true; + } + KaonPlus = ROOT::Math::PxPyPzMVector(kCurrentDaughter.px(), kCurrentDaughter.py(), kCurrentDaughter.pz(), massKa); + } else if (kCurrentDaughter.pdgCode() == -321) { + if (kCurrentDaughter.pt() > cfgCutPT && TMath::Abs(kCurrentDaughter.eta()) < cfgCutEta) { + daughtm = true; + } + KaonMinus = ROOT::Math::PxPyPzMVector(kCurrentDaughter.px(), kCurrentDaughter.py(), kCurrentDaughter.pz(), massKa); + } + } + if (daughtp && daughtm) { + auto PhiMinusPsiGen = GetPhiInRange(mcParticle.phi() - psiFT0C); + histos.fill(HIST("hSparsePhiMCGenWeight"), centclass, PhiMinusPsiGen, TMath::Power(TMath::Cos(2.0 * PhiMinusPsiGen), 2.0), mcParticle.pt(), mcParticle.eta()); + } + } + } // rec collision loop + + } // process MC + PROCESS_SWITCH(phipbpb, processMCPhiWeight, "Process MC Phi Weight", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { From 66b5d9a796c69b03d93691367a2c529283ada681 Mon Sep 17 00:00:00 2001 From: bghanley1995 Date: Mon, 24 Feb 2025 16:40:57 -0500 Subject: [PATCH 0402/1650] [PWGCF] IdentifiedBf: Added flag for out of bunch pile up. Fixed O2 linter errors (#10175) Co-authored-by: ALICE Action Bot --- .../TableProducer/identifiedBfFilter.cxx | 235 +++++++++--------- 1 file changed, 122 insertions(+), 113 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx b/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx index f0629bcfd38..dae2decf997 100644 --- a/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx +++ b/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx @@ -8,6 +8,10 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. + +/// \file identifiedBfFilter.cxx +/// \brief Filters collisions and tracks according to selection criteria +/// \author bghanley1995@gmail.com #include "PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.h" #include @@ -28,8 +32,8 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/CollisionAssociationTables.h" #include "Framework/runDataProcessing.h" +#include "Framework/O2DatabasePDGPlugin.h" #include -#include #include #include #include @@ -110,7 +114,7 @@ TH1I* fhITSNclA = nullptr; TH2F* fhNSigmaTPC[kIdBfNoOfSpecies] = {nullptr}; TH2F* fhNSigmaTOF[kIdBfNoOfSpecies] = {nullptr}; TH2F* fhNSigmaCombo[kIdBfNoOfSpecies] = {nullptr}; -TH2F* fhNSigmaTPC_IdTrks[kIdBfNoOfSpecies] = {nullptr}; +TH2F* fhNSigmaTPCIdTrks[kIdBfNoOfSpecies] = {nullptr}; TH1F* fhNSigmaCorrection[kIdBfNoOfSpecies] = {nullptr}; @@ -195,15 +199,15 @@ int partMultNeg[kIdBfNoOfSpecies + 1]; // multiplicity of negative particles using namespace identifiedbffilter; struct IdentifiedBfFilter { - Configurable cfgFullDerivedData{"fullderiveddata", false, "Produce the full derived data for external storage. Default false"}; - Configurable cfgCentMultEstimator{"centmultestimator", "V0M", "Centrality/multiplicity estimator detector: V0M,CL0,CL1,FV0A,FT0M,FT0A,FT0C,NTPV,NOCM: none. Default V0M"}; - Configurable cfgSystem{"syst", "PbPb", "System: pp, PbPb, Pbp, pPb, XeXe, ppRun3, PbPbRun3. Default PbPb"}; - Configurable cfgDataType{"datatype", "data", "Data type: data, datanoevsel, MC, FastMC, OnTheFlyMC. Default data"}; - Configurable cfgTriggSel{"triggsel", "MB", "Trigger selection: MB, None. Default MB"}; - Configurable cfgBinning{"binning", + Configurable cfgFullDerivedData{"cfgFullDerivedData", false, "Produce the full derived data for external storage. Default false"}; + Configurable cfgCentMultEstimator{"cfgCentMultEstimator", "V0M", "Centrality/multiplicity estimator detector: V0M,CL0,CL1,FV0A,FT0M,FT0A,FT0C,NTPV,NOCM: none. Default V0M"}; + Configurable cfgSystem{"cfgSystem", "PbPb", "System: pp, PbPb, Pbp, pPb, XeXe, ppRun3, PbPbRun3. Default PbPb"}; + Configurable cfgDataType{"cfgDataType", "data", "Data type: data, datanoevsel, MC, FastMC, OnTheFlyMC. Default data"}; + Configurable cfgTriggSel{"cfgTriggSel", "MB", "Trigger selection: MB, None. Default MB"}; + Configurable cfgBinning{"cfgBinning", {28, -7.0, 7.0, 18, 0.2, 2.0, 16, -0.8, 0.8, 72, 0.5}, "triplets - nbins, min, max - for z_vtx, pT, eta and phi, binning plus bin fraction of phi origin shift"}; - Configurable cfgTraceCollId0{"tracecollid0", false, "Trace particles in collisions id 0. Default false"}; + Configurable cfgTraceCollId0{"cfgTraceCollId0", false, "Trace particles in collisions id 0. Default false"}; OutputObj fOutput{"IdentifiedBfFilterCollisionsInfo", OutputObjHandlingPolicy::AnalysisObject}; @@ -544,7 +548,7 @@ void IdentifiedBfFilter::processGeneratorLevel(aod::McCollision const& mccollisi } bool processed = false; - for (auto& tmpcollision : collisions) { + for (const auto& tmpcollision : collisions) { if (tmpcollision.has_mcCollision()) { if (tmpcollision.mcCollisionId() == mccollision.globalIndex()) { typename AllCollisions::iterator const& collision = allcollisions.iteratorAt(tmpcollision.globalIndex()); @@ -608,8 +612,8 @@ T computeRMS(std::vector& vec) std::vector diff(vec.size()); std::transform(vec.begin(), vec.end(), diff.begin(), [mean](T x) { return x - mean; }); - T sq_sum = std::inner_product(diff.begin(), diff.end(), diff.begin(), 0.0); - T stdev = std::sqrt(sq_sum / vec.size()); + T sqSum = std::inner_product(diff.begin(), diff.end(), diff.begin(), 0.0); + T stdev = std::sqrt(sqSum / vec.size()); return stdev; } @@ -617,9 +621,9 @@ T computeRMS(std::vector& vec) struct IdentifiedBfFilterTracks { struct : ConfigurableGroup { - Configurable cfgCCDBUrl{"input_ccdburl", "http://ccdb-test.cern.ch:8080", "The CCDB url for the input file"}; - Configurable cfgCCDBPathName{"input_ccdbpath", "", "The CCDB path for the input file. Default \"\", i.e. don't load from CCDB"}; - Configurable cfgCCDBDate{"input_ccdbdate", "20220307", "The CCDB date for the input file"}; + Configurable inputCCDBUrl{"inputCCDBUrl", "http://ccdb-test.cern.ch:8080", "The CCDB url for the input file"}; + Configurable inputCCDBPathName{"inputCCDBPathName", "", "The CCDB path for the input file. Default \"\", i.e. don't load from CCDB"}; + Configurable inputCCDBDate{"inputCCDBDate", "20220307", "The CCDB date for the input file"}; } cfgcentersinputfile; Service ccdb; @@ -646,18 +650,18 @@ struct IdentifiedBfFilterTracks { Produces scannedgentracks; Produces gentracksinfo; - Configurable cfgFullDerivedData{"fullderiveddata", false, "Produce the full derived data for external storage. Default false"}; - Configurable cfgTrackType{"trktype", 1, "Type of selected tracks: 0 = no selection, 1 = Run2 global tracks FB96, 3 = Run3 tracks, 5 = Run2 TPC only tracks, 7 = Run 3 TPC only tracks. Default 1"}; - Configurable cfgSystem{"syst", "PbPb", "System: pp, PbPb, Pbp, pPb, XeXe, ppRun3, PbPbRun3. Default PbPb"}; - Configurable cfgDataType{"datatype", "data", "Data type: data, datanoevsel, MC, FastMC, OnTheFlyMC. Default data"}; - Configurable cfgBinning{"binning", + Configurable cfgFullDerivedData{"cfgFullDerivedData", false, "Produce the full derived data for external storage. Default false"}; + Configurable cfgTrackType{"cfgTrackType", 1, "Type of selected tracks: 0 = no selection, 1 = Run2 global tracks FB96, 3 = Run3 tracks, 5 = Run2 TPC only tracks, 7 = Run 3 TPC only tracks. Default 1"}; + Configurable cfgSystem{"cfgSystem", "PbPb", "System: pp, PbPb, Pbp, pPb, XeXe, ppRun3, PbPbRun3. Default PbPb"}; + Configurable cfgDataType{"cfgDataType", "data", "Data type: data, datanoevsel, MC, FastMC, OnTheFlyMC. Default data"}; + Configurable cfgBinning{"cfgBinning", {28, -7.0, 7.0, 18, 0.2, 2.0, 16, -0.8, 0.8, 72, 0.5}, "triplets - nbins, min, max - for z_vtx, pT, eta and phi, binning plus bin fraction of phi origin shift"}; - Configurable cfgTraceDCAOutliers{"trackdcaoutliers", {false, 0.0, 0.0}, "Track the generator level DCAxy outliers: false/true, low dcaxy, up dcaxy. Default {false,0.0,0.0}"}; - Configurable cfgTraceOutOfSpeciesParticles{"trackoutparticles", false, "Track the particles which are not e,mu,pi,K,p: false/true. Default false"}; - Configurable cfgRecoIdMethod{"recoidmethod", 0, "Method for identifying reconstructed tracks: 0 No PID, 1 PID, 2 mcparticle. Default 0"}; - Configurable cfgTrackSelection{"tracksel", {false, false, 0, 70, 0.8, 2.4, 3.2}, "Track selection: {useit: true/false, ongen: true/false, tpccls, tpcxrws, tpcxrfc, dcaxy, dcaz}. Default {false,0.70.0.8,2.4,3.2}"}; - Configurable reqTOF{"requireTOF", false, "Require TOF data for PID. Default false"}; + Configurable cfgTraceDCAOutliers{"cfgTraceDCAOutliers", {false, 0.0, 0.0}, "Track the generator level DCAxy outliers: false/true, low dcaxy, up dcaxy. Default {false,0.0,0.0}"}; + Configurable cfgTraceOutOfSpeciesParticles{"cfgTraceOutOfSpeciesParticles", false, "Track the particles which are not e,mu,pi,K,p: false/true. Default false"}; + Configurable cfgRecoIdMethod{"cfgRecoIdMethod", 0, "Method for identifying reconstructed tracks: 0 No PID, 1 PID, 2 mcparticle. Default 0"}; + Configurable cfgTrackSelection{"cfgTrackSelection", {false, false, 0, 70, 0.8, 2.4, 3.2}, "Track selection: {useit: true/false, ongen: true/false, tpccls, tpcxrws, tpcxrfc, dcaxy, dcaz}. Default {false,0.70.0.8,2.4,3.2}"}; + Configurable reqTOF{"reqTOF", false, "Require TOF data for PID. Default false"}; Configurable onlyTOF{"onlyTOF", false, "Only use TOF data for PID. Default false"}; Configurable pidEl{"pidEl", -1, "Identify Electron Tracks"}; @@ -665,13 +669,13 @@ struct IdentifiedBfFilterTracks { Configurable pidKa{"pidKa", -1, "Identify Kaon Tracks"}; Configurable pidPr{"pidPr", -1, "Identify Proton Tracks"}; - Configurable minPIDSigma{"minpidsigma", -3.0, "Minimum required sigma for PID Acceptance"}; - Configurable maxPIDSigma{"maxpidsigma", 3.0, "Maximum required sigma for PID Acceptance"}; + Configurable minPIDSigma{"minPIDSigma", -3.0, "Minimum required sigma for PID Acceptance"}; + Configurable maxPIDSigma{"maxPIDSigma", 3.0, "Maximum required sigma for PID Acceptance"}; - Configurable minRejectSigma{"minrejectsigma", -1.0, "Minimum required sigma for PID double match rejection"}; - Configurable maxRejectSigma{"maxrejectsigma", 1.0, "Maximum required sigma for PID double match rejection"}; + Configurable minRejectSigma{"minRejectSigma", -1.0, "Minimum required sigma for PID double match rejection"}; + Configurable maxRejectSigma{"maxRejectSigma", 1.0, "Maximum required sigma for PID double match rejection"}; - Configurable tofCut{"TOFCutoff", 0.8, "Momentum under which we don't use TOF PID data"}; + Configurable tofCut{"tofCut", 0.8, "Momentum under which we don't use TOF PID data"}; OutputObj fOutput{"IdentifiedBfFilterTracksInfo", OutputObjHandlingPolicy::AnalysisObject}; bool checkAmbiguousTracks = false; @@ -681,18 +685,18 @@ struct IdentifiedBfFilterTracks { LOGF(info, "IdentifiedBfFilterTracks::init()"); // ccdb info - ccdb->setURL(cfgcentersinputfile.cfgCCDBUrl); + ccdb->setURL(cfgcentersinputfile.inputCCDBUrl); ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); LOGF(info, "Initizalized CCDB"); - loadfromccdb = cfgcentersinputfile.cfgCCDBPathName->length() > 0; + loadfromccdb = cfgcentersinputfile.inputCCDBPathName->length() > 0; if (ccdblst == nullptr) { if (loadfromccdb) { LOGF(info, "Loading CCDB Objects"); - ccdblst = getCCDBInput(cfgcentersinputfile.cfgCCDBPathName->c_str(), cfgcentersinputfile.cfgCCDBDate->c_str()); + ccdblst = getCCDBInput(cfgcentersinputfile.inputCCDBPathName->c_str(), cfgcentersinputfile.inputCCDBDate->c_str()); for (int i = 0; i < kIdBfNoOfSpecies; i++) { fhNSigmaCorrection[i] = reinterpret_cast(ccdblst->FindObject(Form("centerBin_%s", speciesName[i]))); } @@ -752,7 +756,7 @@ struct IdentifiedBfFilterTracks { /* if the system type is not known at this time, we have to put the initialization somewhere else */ fSystem = getSystemType(cfgSystem); fDataType = getDataType(cfgDataType); - fPDG = TDatabasePDG::Instance(); + fPDG = o2::O2DatabasePDG::Instance(); /* required ambiguous tracks checks? */ if (dofilterDetectorLevelWithoutPIDAmbiguous || dofilterDetectorLevelWithPIDAmbiguous || dofilterRecoWithoutPIDAmbiguous || dofilterRecoWithPIDAmbiguous) { @@ -765,9 +769,9 @@ struct IdentifiedBfFilterTracks { fOutput.setObject(fOutputList); /* incorporate configuration parameters to the output */ - fOutputList->Add(new TParameter("TrackType", cfgTrackType, 'f')); - fOutputList->Add(new TParameter("TrackOneCharge", 1, 'f')); - fOutputList->Add(new TParameter("TrackTwoCharge", -1, 'f')); + fOutputList->Add(new TParameter("TrackType", cfgTrackType, 'f')); + fOutputList->Add(new TParameter("TrackOneCharge", 1, 'f')); + fOutputList->Add(new TParameter("TrackTwoCharge", -1, 'f')); if ((fDataType == kData) || (fDataType == kDataNoEvtSel) || (fDataType == kMC)) { /* create the reconstructed data histograms */ @@ -830,10 +834,10 @@ struct IdentifiedBfFilterTracks { TString::Format("N Sigma from Combo vs P for %s;N #sigma;p (GeV/c)", speciesTitle[sp]).Data(), 48, -6, 6, ptbins, ptlow, ptup); - fhNSigmaTPC_IdTrks[sp] = new TH2F(TString::Format("fhNSigmaTPC_IdTrks_%s", speciesName[sp]).Data(), - TString::Format("N Sigma from TPC vs P for Identified %s;N #sigma;p (GeV/c)", speciesTitle[sp]).Data(), - 48, -6, 6, - ptbins, ptlow, ptup); + fhNSigmaTPCIdTrks[sp] = new TH2F(TString::Format("fhNSigmaTPC_IdTrks_%s", speciesName[sp]).Data(), + TString::Format("N Sigma from TPC vs P for Identified %s;N #sigma;p (GeV/c)", speciesTitle[sp]).Data(), + 48, -6, 6, + ptbins, ptlow, ptup); } LOGF(info, "Making histos"); @@ -916,7 +920,7 @@ struct IdentifiedBfFilterTracks { fOutputList->Add(fhNSigmaTPC[sp]); fOutputList->Add(fhNSigmaTOF[sp]); fOutputList->Add(fhNSigmaCombo[sp]); - fOutputList->Add(fhNSigmaTPC_IdTrks[sp]); + fOutputList->Add(fhNSigmaTPCIdTrks[sp]); } LOGF(info, "Adding Histos to list"); @@ -1025,15 +1029,15 @@ struct IdentifiedBfFilterTracks { } template - inline MatchRecoGenSpecies IdentifyTrack(TrackObject const& track); + inline MatchRecoGenSpecies identifyTrack(TrackObject const& track); template - int8_t AcceptTrack(TrackObject const& track); + int8_t acceptTrack(TrackObject const& track); template - int8_t AcceptParticle(ParticleObject& particle, MCCollisionObject const& mccollision); + int8_t acceptParticle(ParticleObject& particle, MCCollisionObject const& mccollision); template int8_t selectTrackAmbiguousCheck(CollisionObjects const& collisions, TrackObject const& track); template - inline MatchRecoGenSpecies IdentifyParticle(ParticleObject const& particle); + inline MatchRecoGenSpecies identifyParticle(ParticleObject const& particle); template void fillTrackHistosBeforeSelection(TrackObject const& track); template @@ -1059,12 +1063,12 @@ struct IdentifiedBfFilterTracks { if (!fullDerivedData) { tracksinfo.reserve(tracks.size()); } - for (auto collision : collisions) { + for (const auto& collision : collisions) { if (collision.collisionaccepted()) { ncollaccepted++; } } - for (auto track : tracks) { + for (const auto& track : tracks) { int8_t pid = -1; if (track.has_collision() && (track.template collision_as>()).collisionaccepted()) { pid = selectTrackAmbiguousCheck(collisions, track); @@ -1116,13 +1120,13 @@ struct IdentifiedBfFilterTracks { gentracksinfo.reserve(particles.size()); } - for (auto gencoll : gencollisions) { + for (const auto& gencoll : gencollisions) { if (gencoll.collisionaccepted()) { acceptedcollisions++; } } - for (auto& particle : particles) { + for (const auto& particle : particles) { int8_t pid = -1; if (particle.isPhysicalPrimary()) { TParticlePDG* pdgpart = fPDG->GetParticle(particle.pdgCode()); @@ -1139,7 +1143,7 @@ struct IdentifiedBfFilterTracks { fillParticleHistosBeforeSelection(particle, mccollision, charge); /* track selection */ - pid = AcceptParticle(particle, mccollision); + pid = acceptParticle(particle, mccollision); if (!(pid < 0)) { // if PID isn't negative acceptedparticles++; } @@ -1248,11 +1252,11 @@ struct IdentifiedBfFilterTracks { }; template -inline MatchRecoGenSpecies IdentifiedBfFilterTracks::IdentifyParticle(ParticleObject const& particle) +inline MatchRecoGenSpecies IdentifiedBfFilterTracks::identifyParticle(ParticleObject const& particle) { using namespace identifiedbffilter; - int pdgcode = fabs(particle.pdgCode()); + int pdgcode = std::fabs(particle.pdgCode()); switch (pdgcode) { case pdgcodeEl: @@ -1311,7 +1315,7 @@ void fillNSigmaHistos(TrackObject const& track) } template -inline MatchRecoGenSpecies IdentifiedBfFilterTracks::IdentifyTrack(TrackObject const& track) +inline MatchRecoGenSpecies IdentifiedBfFilterTracks::identifyTrack(TrackObject const& track) { using namespace o2::analysis::identifiedbffilter; @@ -1375,19 +1379,19 @@ inline MatchRecoGenSpecies IdentifiedBfFilterTracks::IdentifyTrack(TrackObject c nsigmas[kIdBfProton] = 999.0f; } - float min_nsigma = 999.0f; - MatchRecoGenSpecies sp_min_nsigma = kWrongSpecies; + float minNSigma = 999.0f; + MatchRecoGenSpecies spMinNSigma = kWrongSpecies; for (int sp = 0; sp < kIdBfNoOfSpecies; ++sp) { - if (fabs(nsigmas[sp]) < fabs(min_nsigma)) { // Check if species nsigma is less than current nsigma - min_nsigma = nsigmas[sp]; // If yes, set species nsigma to current nsigma - sp_min_nsigma = MatchRecoGenSpecies(sp); // set current species sp number to current sp + if (std::fabs(nsigmas[sp]) < std::fabs(minNSigma)) { // Check if species nsigma is less than current nsigma + minNSigma = nsigmas[sp]; // If yes, set species nsigma to current nsigma + spMinNSigma = MatchRecoGenSpecies(sp); // set current species sp number to current sp } } bool doublematch = false; MatchRecoGenSpecies spDouble = kWrongSpecies; - if (min_nsigma < maxPIDSigma && min_nsigma > minPIDSigma) { // Check that current nsigma is in accpetance range + if (minNSigma < maxPIDSigma && minNSigma > minPIDSigma) { // Check that current nsigma is in accpetance range for (int sp = 0; (sp < kIdBfNoOfSpecies) && !doublematch; ++sp) { // iterate over all species while there's no double match and we're in the list - if (sp != sp_min_nsigma) { // for species not current minimum nsigma species + if (sp != spMinNSigma) { // for species not current minimum nsigma species if (nsigmas[sp] < maxRejectSigma && nsigmas[sp] > minRejectSigma) { // If secondary species is in rejection range doublematch = true; // Set double match true spDouble = MatchRecoGenSpecies(sp); @@ -1398,23 +1402,23 @@ inline MatchRecoGenSpecies IdentifiedBfFilterTracks::IdentifyTrack(TrackObject c fhWrongTrackID->Fill(track.p()); fhdEdxA[kIdBfNoOfSpecies]->Fill(track.p(), track.tpcSignal()); fhdEdxIPTPCA[kIdBfNoOfSpecies]->Fill(track.tpcInnerParam(), track.tpcSignal()); - fhDoublePID->Fill(sp_min_nsigma, spDouble); + fhDoublePID->Fill(spMinNSigma, spDouble); return kWrongSpecies; // Return wrong species value } else { - if (sp_min_nsigma == 0) { - fhNSigmaTPC_IdTrks[sp_min_nsigma]->Fill(actualTPCNSigmaEl, track.tpcInnerParam()); + if (spMinNSigma == 0) { + fhNSigmaTPCIdTrks[spMinNSigma]->Fill(actualTPCNSigmaEl, track.tpcInnerParam()); } - if (sp_min_nsigma == 1) { - fhNSigmaTPC_IdTrks[sp_min_nsigma]->Fill(actualTPCNSigmaPi, track.tpcInnerParam()); + if (spMinNSigma == 1) { + fhNSigmaTPCIdTrks[spMinNSigma]->Fill(actualTPCNSigmaPi, track.tpcInnerParam()); } - if (sp_min_nsigma == 2) { - fhNSigmaTPC_IdTrks[sp_min_nsigma]->Fill(actualTPCNSigmaKa, track.tpcInnerParam()); + if (spMinNSigma == 2) { + fhNSigmaTPCIdTrks[spMinNSigma]->Fill(actualTPCNSigmaKa, track.tpcInnerParam()); } - if (sp_min_nsigma == 3) { - fhNSigmaTPC_IdTrks[sp_min_nsigma]->Fill(actualTPCNSigmaPr, track.tpcInnerParam()); + if (spMinNSigma == 3) { + fhNSigmaTPCIdTrks[spMinNSigma]->Fill(actualTPCNSigmaPr, track.tpcInnerParam()); } - return sp_min_nsigma; + return spMinNSigma; } } else { return kWrongSpecies; @@ -1429,7 +1433,7 @@ inline MatchRecoGenSpecies IdentifiedBfFilterTracks::IdentifyTrack(TrackObject c /// - positive track pid even /// - negative track pid odd template -inline int8_t IdentifiedBfFilterTracks::AcceptTrack(TrackObject const& track) +inline int8_t IdentifiedBfFilterTracks::acceptTrack(TrackObject const& track) { fillTrackHistosBeforeSelection(track); // || framework::has_type_v) { - sp = IdentifyTrack(track); + sp = identifyTrack(track); } else { LOGF(fatal, "Track identification required but PID information not present"); } } else if (recoIdMethod == 2) { if constexpr (framework::has_type_v) { - sp = IdentifyParticle(track.template mcParticle_as()); + sp = identifyParticle(track.template mcParticle_as()); } else { LOGF(fatal, "Track identification required from MC particle but MC information not present"); } @@ -1483,7 +1487,7 @@ inline int8_t IdentifiedBfFilterTracks::AcceptTrack(TrackObject const& track) /// \param track the particle of interest /// \return `true` if the particle is accepted, `false` otherwise template -inline int8_t IdentifiedBfFilterTracks::AcceptParticle(ParticleObject& particle, MCCollisionObject const& mccollision) +inline int8_t IdentifiedBfFilterTracks::acceptParticle(ParticleObject& particle, MCCollisionObject const& mccollision) { /* overall momentum cut */ if (!(overallminp < particle.p())) { @@ -1494,44 +1498,49 @@ inline int8_t IdentifiedBfFilterTracks::AcceptParticle(ParticleObject& particle, if (pdgpart != nullptr) { charge = getCharge(pdgpart->Charge()); } + if ((particle.flags() & 0x8) != 0x8) { + if (particle.isPhysicalPrimary() && std::fabs(charge) > 0.0) { + if ((particle.mcCollisionId() == 0) && traceCollId0) { + LOGF(info, "Particle %d passed isPhysicalPrimary", particle.globalIndex()); + } - if (particle.isPhysicalPrimary() && fabs(charge) > 0.0) { - if ((particle.mcCollisionId() == 0) && traceCollId0) { - LOGF(info, "Particle %d passed isPhysicalPrimary", particle.globalIndex()); - } - - if (ptlow < particle.pt() && particle.pt() < ptup && etalow < particle.eta() && particle.eta() < etaup) { - MatchRecoGenSpecies sp = IdentifyParticle(particle); - if (sp != kWrongSpecies) { - if (sp != kIdBfCharged) { - /* fill the charged particle histograms */ - fillParticleHistosAfterSelection(particle, mccollision, charge, kIdBfCharged); - /* update charged multiplicities */ + if (ptlow < particle.pt() && particle.pt() < ptup && etalow < particle.eta() && particle.eta() < etaup) { + MatchRecoGenSpecies sp = identifyParticle(particle); + if (sp != kWrongSpecies) { + if (sp != kIdBfCharged) { + /* fill the charged particle histograms */ + fillParticleHistosAfterSelection(particle, mccollision, charge, kIdBfCharged); + /* update charged multiplicities */ + if (charge == 1) { + partMultPos[kIdBfCharged]++; + } else if (charge == -1) { + partMultNeg[kIdBfCharged]++; + } + } + /* fill the species histograms */ + fillParticleHistosAfterSelection(particle, mccollision, charge, sp); + /* update species multiplicities */ if (charge == 1) { - partMultPos[kIdBfCharged]++; + partMultPos[sp]++; } else if (charge == -1) { - partMultNeg[kIdBfCharged]++; + partMultNeg[sp]++; } } - /* fill the species histograms */ - fillParticleHistosAfterSelection(particle, mccollision, charge, sp); - /* update species multiplicities */ if (charge == 1) { - partMultPos[sp]++; + return speciesChargeValue1[sp]; + } else if (charge == -1) { - partMultNeg[sp]++; + return speciesChargeValue1[sp] + 1; } } - if (charge == 1) { - return speciesChargeValue1[sp]; - - } else if (charge == -1) { - return speciesChargeValue1[sp] + 1; + } else { + if ((particle.mcCollisionId() == 0) && traceCollId0) { + LOGF(info, "Particle %d NOT passed isPhysicalPrimary", particle.globalIndex()); } } } else { if ((particle.mcCollisionId() == 0) && traceCollId0) { - LOGF(info, "Particle %d NOT passed isPhysicalPrimary", particle.globalIndex()); + LOGF(info, "Particle %d Out of Bunch Pileup", particle.globalIndex()); } } return kWrongSpecies; @@ -1587,7 +1596,7 @@ int8_t IdentifiedBfFilterTracks::selectTrackAmbiguousCheck(CollisionObjects cons /* feedback of no ambiguous tracks only if checks required */ fhAmbiguousTrackType->Fill(tracktype, multiplicityclass); } - return AcceptTrack(track); + return acceptTrack(track); } } @@ -1669,16 +1678,16 @@ void IdentifiedBfFilterTracks::fillParticleHistosBeforeSelection(ParticleObject fhTruePtNegB->Fill(particle.pt()); } - float dcaxy = TMath::Sqrt((particle.vx() - collision.posX()) * (particle.vx() - collision.posX()) + - (particle.vy() - collision.posY()) * (particle.vy() - collision.posY())); + float dcaxy = std::sqrt((particle.vx() - collision.posX()) * (particle.vx() - collision.posX()) + + (particle.vy() - collision.posY()) * (particle.vy() - collision.posY())); if (traceDCAOutliers.mDoIt && (traceDCAOutliers.mLowValue < dcaxy) && (dcaxy < traceDCAOutliers.mUpValue)) { fhTrueDCAxyBid->Fill(TString::Format("%d", particle.pdgCode()).Data(), 1.0); } - fhTrueDCAxyB->Fill(TMath::Sqrt((particle.vx() - collision.posX()) * (particle.vx() - collision.posX()) + - (particle.vy() - collision.posY()) * (particle.vy() - collision.posY()))); - fhTrueDCAxyzB->Fill(TMath::Sqrt((particle.vx() - collision.posX()) * (particle.vx() - collision.posX()) + - (particle.vy() - collision.posY()) * (particle.vy() - collision.posY())), + fhTrueDCAxyB->Fill(std::sqrt((particle.vx() - collision.posX()) * (particle.vx() - collision.posX()) + + (particle.vy() - collision.posY()) * (particle.vy() - collision.posY()))); + fhTrueDCAxyzB->Fill(std::sqrt((particle.vx() - collision.posX()) * (particle.vx() - collision.posX()) + + (particle.vy() - collision.posY()) * (particle.vy() - collision.posY())), (particle.vz() - collision.posZ())); fhTrueDCAzB->Fill((particle.vz() - collision.posZ())); } @@ -1692,19 +1701,19 @@ void IdentifiedBfFilterTracks::fillParticleHistosAfterSelection(ParticleObject c fhTruePtYA->Fill(particle.pt(), particle.eta()); fhTrueEtaA->Fill(particle.eta()); fhTruePhiA->Fill(particle.phi()); - float dcaxy = TMath::Sqrt((particle.vx() - collision.posX()) * (particle.vx() - collision.posX()) + - (particle.vy() - collision.posY()) * (particle.vy() - collision.posY())); + float dcaxy = std::sqrt((particle.vx() - collision.posX()) * (particle.vx() - collision.posX()) + + (particle.vy() - collision.posY()) * (particle.vy() - collision.posY())); if (traceDCAOutliers.mDoIt && (traceDCAOutliers.mLowValue < dcaxy) && (dcaxy < traceDCAOutliers.mUpValue)) { LOGF(info, "DCAxy outlier: Particle with index %d and pdg code %d assigned to MC collision %d, pT: %f, phi: %f, eta: %f", particle.globalIndex(), particle.pdgCode(), particle.mcCollisionId(), particle.pt(), particle.phi(), particle.eta()); LOGF(info, " With status %d and flags %0X", particle.statusCode(), particle.flags()); } - fhTrueDCAxyA->Fill(TMath::Sqrt((particle.vx() - collision.posX()) * (particle.vx() - collision.posX()) + - (particle.vy() - collision.posY()) * (particle.vy() - collision.posY()))); + fhTrueDCAxyA->Fill(std::sqrt((particle.vx() - collision.posX()) * (particle.vx() - collision.posX()) + + (particle.vy() - collision.posY()) * (particle.vy() - collision.posY()))); fhTrueDCAzA->Fill((particle.vz() - collision.posZ())); - fhTrueDCAxyzA->Fill(TMath::Sqrt((particle.vx() - collision.posX()) * (particle.vx() - collision.posX()) + - (particle.vy() - collision.posY()) * (particle.vy() - collision.posY())), + fhTrueDCAxyzA->Fill(std::sqrt((particle.vx() - collision.posX()) * (particle.vx() - collision.posX()) + + (particle.vy() - collision.posY()) * (particle.vy() - collision.posY())), (particle.vz() - collision.posZ())); } fhTruePA[sp]->Fill(particle.p()); From 2c36d04c9d5f2b111ccf32849a309c0e1e9172d1 Mon Sep 17 00:00:00 2001 From: Georgios Mantzaridis <62671855+gmantzar@users.noreply.github.com> Date: Tue, 25 Feb 2025 02:38:47 +0100 Subject: [PATCH 0403/1650] [PWGCF] FemtoDream: DetaDphiStar: replacing abs() with std::fabs() (#10160) --- PWGCF/FemtoDream/Core/femtoDreamDetaDphiStar.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PWGCF/FemtoDream/Core/femtoDreamDetaDphiStar.h b/PWGCF/FemtoDream/Core/femtoDreamDetaDphiStar.h index fa9577324bc..d8711b6fbc5 100644 --- a/PWGCF/FemtoDream/Core/femtoDreamDetaDphiStar.h +++ b/PWGCF/FemtoDream/Core/femtoDreamDetaDphiStar.h @@ -558,7 +558,7 @@ class FemtoDreamDetaDphiStar if (!runOldVersion) { auto arg = 0.3 * charge * magfield * tmpRadiiTPC[i] * 0.01 / (2. * pt); // for very low pT particles, this value goes outside of range -1 to 1 at at large tpc radius; asin fails - if (abs(arg) < 1) { + if (std::fabs(arg) < 1) { tmpVec.push_back(phi0 - std::asin(0.3 * charge * magfield * tmpRadiiTPC[i] * 0.01 / (2. * pt))); } else { tmpVec.push_back(999); @@ -618,7 +618,7 @@ class FemtoDreamDetaDphiStar if (!runOldVersion) { auto arg = 0.3 * charge * magfield * radii * 0.01 / (2. * pt); // for very low pT particles, this value goes outside of range -1 to 1 at at large tpc radius; asin fails - if (abs(arg) < 1) { + if (std::fabs(arg) < 1) { phiAtRadii = phi0 - std::asin(0.3 * charge * magfield * radii * 0.01 / (2. * pt)); } else { phiAtRadii = 999.; @@ -661,7 +661,7 @@ class FemtoDreamDetaDphiStar if (!runOldVersion) { auto arg = 0.3 * charge * magfield * tmpRadiiTPC[i] * 0.01 / (2. * pt); // for very low pT particles, this value goes outside of range -1 to 1 at at large tpc radius; asin fails - if (abs(arg) < 1) { + if (std::fabs(arg) < 1) { tmpVec.push_back(phi0 - std::asin(0.3 * charge * magfield * tmpRadiiTPC[i] * 0.01 / (2. * pt))); } else { tmpVec.push_back(999); From d2ff9c6f498f303a052eddc282a59e9f2efcfcd2 Mon Sep 17 00:00:00 2001 From: Sandeep Dudi <69388148+sdudi123@users.noreply.github.com> Date: Tue, 25 Feb 2025 03:54:04 +0100 Subject: [PATCH 0404/1650] [PWGUD] Occupancy cut is added (#10161) Co-authored-by: Sandeep Dudi Co-authored-by: Sandeep Dudi --- PWGUD/Tasks/sginclusivePhiKstarSD.cxx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/PWGUD/Tasks/sginclusivePhiKstarSD.cxx b/PWGUD/Tasks/sginclusivePhiKstarSD.cxx index 90ca2a8485d..16df12dced3 100644 --- a/PWGUD/Tasks/sginclusivePhiKstarSD.cxx +++ b/PWGUD/Tasks/sginclusivePhiKstarSD.cxx @@ -50,11 +50,13 @@ struct SGResonanceAnalyzer { HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; Configurable FV0_cut{"FV0", 50., "FV0A threshold"}; - Configurable FT0A_cut{"FT0A", 50., "FT0A threshold"}; + Configurable FT0A_cut{"FT0A", 100., "FT0A threshold"}; Configurable FT0C_cut{"FT0C", 50., "FT0C threshold"}; Configurable FDDA_cut{"FDDA", 10000., "FDDA threshold"}; Configurable FDDC_cut{"FDDC", 10000., "FDDC threshold"}; Configurable ZDC_cut{"ZDC", 0., "ZDC threshold"}; + Configurable Vz_cut{"Vz_cut", 10., "Vz position"}; + Configurable OccT_cut{"OccT", 1000., "Occupancy cut"}; // Track Selections Configurable PV_cut{"PV_cut", 1.0, "Use Only PV tracks"}; @@ -372,7 +374,7 @@ struct SGResonanceAnalyzer { using udtracks = soa::Join; using udtracksfull = soa::Join; - using UDCollisionsFull = soa::Join; // + using UDCollisionsFull = soa::Join; // using UDCollisionFull = UDCollisionsFull::iterator; void process(UDCollisionFull const& collision, udtracksfull const& tracks) @@ -403,6 +405,11 @@ struct SGResonanceAnalyzer { gapSide = truegapSide; if (gapSide < 0 || gapSide > 2) return; + if (std::abs(collision.posZ()) > Vz_cut) + return; + if (std::abs(collision.occupancyInTime()) > OccT_cut) + return; + Int_t mult = collision.numContrib(); if (gapSide == 0) { registry.fill(HIST("gap_mult0"), mult); From 36173f75e3a682186285922cd980f663de937b75 Mon Sep 17 00:00:00 2001 From: wefeng1110 <147308878+wefeng1110@users.noreply.github.com> Date: Tue, 25 Feb 2025 12:47:59 +0800 Subject: [PATCH 0405/1650] [PWGJE] Fix a bug in JetMatching function (#10164) --- PWGJE/Tasks/jetSpectraCharged.cxx | 86 ++++++++++++++++++++----------- 1 file changed, 56 insertions(+), 30 deletions(-) diff --git a/PWGJE/Tasks/jetSpectraCharged.cxx b/PWGJE/Tasks/jetSpectraCharged.cxx index 56639d7dc0f..e3b5c7d454b 100644 --- a/PWGJE/Tasks/jetSpectraCharged.cxx +++ b/PWGJE/Tasks/jetSpectraCharged.cxx @@ -100,12 +100,15 @@ struct JetSpectraCharged { AxisSpec jetEtaAxis = {nBinsEta, -1.0, 1.0, "#eta"}; if (doprocessQC || doprocessQCWeighted) { + registry.add("h_track_pt", "track #it{p}_{T} ; #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH1F, {trackPtAxis}}); + registry.add("h2_track_eta_track_phi", "track eta vs. track phi; #eta; #phi; counts", {HistType::kTH2F, {trackEtaAxis, phiAxis}}); + } + + if (doprocessCollisions || doprocessCollisionsWeighted) { registry.add("h_collisions", "event status;event status;entries", {HistType::kTH1F, {{4, 0.0, 4.0}}}); registry.add("h2_centrality_occupancy", "centrality vs occupancy; centrality; occupancy", {HistType::kTH2F, {centralityAxis, {60, 0, 30000}}}); registry.add("h_collisions_Zvertex", "position of collision ;#it{Z} (cm)", {HistType::kTH1F, {{300, -15.0, 15.0}}}); - registry.add("h_track_pt", "track #it{p}_{T} ; #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH1F, {trackPtAxis}}); - registry.add("h2_track_eta_track_phi", "track eta vs. track phi; #eta; #phi; counts", {HistType::kTH2F, {trackEtaAxis, phiAxis}}); - if (doprocessQCWeighted) { + if (doprocessCollisionsWeighted) { registry.add("h_collisions_weighted", "event status;event status;entries", {HistType::kTH1F, {{4, 0.0, 4.0}}}); } } @@ -120,7 +123,7 @@ struct JetSpectraCharged { registry.add("h2_jet_pt_jet_area", "jet #it{p}_{T,jet} vs. Area_{jet}; #it{p}_{T,jet} (GeV/#it{c}); Area_{jet}", {HistType::kTH2F, {jetPtAxis, {150, 0., 1.5}}}); registry.add("h2_jet_pt_jet_ntracks", "jet #it{p}_{T,jet} vs. N_{jet tracks}; #it{p}_{T,jet} (GeV/#it{c}); N_{jet, tracks}", {HistType::kTH2F, {jetPtAxis, {200, -0.5, 199.5}}}); registry.add("h2_jet_pt_track_pt", "jet #it{p}_{T,jet} vs. #it{p}_{T,track}; #it{p}_{T,jet} (GeV/#it{c}); #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, trackPtAxis}}); - registry.add("h3_jet_pt_eta_phi", "jet pt vs. eta vs. phi", {HistType::kTH3F, {jetPtAxis, jetEtaAxis, phiAxis}}); + registry.add("h3_jet_pt_jet_eta_jet_phi", "jet pt vs. eta vs. phi", {HistType::kTH3F, {jetPtAxis, jetEtaAxis, phiAxis}}); if (doprocessSpectraMCDWeighted) { registry.add("h_jet_phat", "jet #hat{p};#hat{p} (GeV/#it{c});entries", {HistType::kTH1F, {{1000, 0, 1000}}}); registry.add("h_jet_phat_weighted", "jet #hat{p};#hat{p} (GeV/#it{c});entries", {HistType::kTH1F, {{1000, 0, 1000}}}); @@ -138,7 +141,7 @@ struct JetSpectraCharged { registry.add("h2_jet_pt_jet_ntracks_rhoareasubtracted", "jet #it{p}_{T,jet} vs. N_{jet tracks}; #it{p}_{T,jet} (GeV/#it{c}); N_{jet, tracks}", {HistType::kTH2F, {jetPtAxis, {200, -0.5, 199.5}}}); registry.add("h2_jet_pt_jet_corr_pt_rhoareasubtracted", "jet #it{p}_{T,jet} vs. #it{p}_{T,corr}; #it{p}_{T,jet} (GeV/#it{c}); #it{p}_{T,corr} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, jetPtAxisRhoAreaSub}}); registry.add("h2_jet_pt_track_pt_rhoareasubtracted", "jet #it{p}_{T,jet} vs. #it{p}_{T,track}; #it{p}_{T,jet} (GeV/#it{c}); #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxisRhoAreaSub, trackPtAxis}}); - registry.add("h3_jet_pt_eta_phi_rhoareasubtracted", "jet_pt_eta_phi_rhoareasubtracted", {HistType::kTH3F, {jetPtAxisRhoAreaSub, jetEtaAxis, phiAxis}}); + registry.add("h3_jet_pt_jet_eta_jet_phi_rhoareasubtracted", "jet_pt_eta_phi_rhoareasubtracted", {HistType::kTH3F, {jetPtAxisRhoAreaSub, jetEtaAxis, phiAxis}}); } if (doprocessSpectraMCP || doprocessSpectraMCPWeighted) { @@ -157,7 +160,7 @@ struct JetSpectraCharged { registry.add("h2_jet_pt_part_jet_area_part", "part jet #it{p}_{T,jet} vs. Area_{jet}; #it{p}_{T,jet}^{part} (GeV/#it{c}); Area_{jet}^{part}", {HistType::kTH2F, {jetPtAxis, {150, 0., 1.5}}}); registry.add("h2_jet_pt_part_jet_ntracks_part", "part jet #it{p}_{T,jet} vs. N_{jet tracks}; #it{p}_{T,jet}^{part} (GeV/#it{c}); N_{jet, tracks}^{part}", {HistType::kTH2F, {jetPtAxis, {200, -0.5, 199.5}}}); registry.add("h2_jet_pt_part_track_pt_part", "part jet #it{p}_{T,jet} vs. #it{p}_{T,track}; #it{p}_{T,jet}^{part} (GeV/#it{c}); #it{p}_{T,track}^{part} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxisRhoAreaSub, trackPtAxis}}); - registry.add("h3_jet_pt_eta_phi_part", "part jet pt vs. eta vs. phi", {HistType::kTH3F, {jetPtAxis, jetEtaAxis, phiAxis}}); + registry.add("h3_jet_pt_jet_eta_jet_phi_part", "part jet pt vs. eta vs. phi", {HistType::kTH3F, {jetPtAxis, jetEtaAxis, phiAxis}}); if (doprocessSpectraMCPWeighted) { registry.add("h2_jet_ptcut_part", "p_{T} cut;p_{T,jet}^{part} (GeV/#it{c});N;entries", {HistType::kTH2F, {{300, 0, 300}, {20, 0, 5}}}); registry.add("h_jet_phat_part_weighted", "jet #hat{p};#hat{p} (GeV/#it{c});entries", {HistType::kTH1F, {{1000, 0, 1000}}}); @@ -180,7 +183,7 @@ struct JetSpectraCharged { registry.add("h_jet_phi_part_rhoareasubtracted", "part jet #varphi;#varphi^{part}; counts", {HistType::kTH1F, {phiAxis}}); registry.add("h2_jet_pt_part_jet_area_part_rhoareasubtracted", "part jet #it{p}_{T,jet} vs. Area_{jet}; #it{p}_{T,jet}^{part} (GeV/#it{c}); Area_{jet}^{part}", {HistType::kTH2F, {jetPtAxisRhoAreaSub, {150, 0., 1.5}}}); registry.add("h2_jet_pt_part_jet_ntracks_part_rhoareasubtracted", "part jet #it{p}_{T,jet} vs. N_{jet tracks}; #it{p}_{T,jet}^{part} (GeV/#it{c}); N_{jet, tracks}{part}", {HistType::kTH2F, {jetPtAxisRhoAreaSub, {200, -0.5, 199.5}}}); - registry.add("h3_jet_pt_eta_phi_part_rhoareasubtracted", "part jet pt vs. eta vs.phi", {HistType::kTH3F, {jetPtAxisRhoAreaSub, jetEtaAxis, phiAxis}}); + registry.add("h3_jet_pt_jet_eta_jet_phi_part_rhoareasubtracted", "part jet pt vs. eta vs.phi", {HistType::kTH3F, {jetPtAxisRhoAreaSub, jetEtaAxis, phiAxis}}); } if (doprocessEvtWiseConstSubJetsData || doprocessEvtWiseConstSubJetsMCD) { @@ -280,7 +283,7 @@ struct JetSpectraCharged { registry.fill(HIST("h2_centrality_jet_phi"), centrality, jet.phi(), weight); registry.fill(HIST("h2_jet_pt_jet_area"), jet.pt(), jet.area(), weight); registry.fill(HIST("h2_jet_pt_jet_ntracks"), jet.pt(), jet.tracksIds().size(), weight); - registry.fill(HIST("h3_jet_pt_eta_phi"), jet.pt(), jet.eta(), jet.phi(), weight); + registry.fill(HIST("h3_jet_pt_jet_eta_jet_phi"), jet.pt(), jet.eta(), jet.phi(), weight); } for (const auto& constituent : jet.template tracks_as()) { @@ -297,7 +300,7 @@ struct JetSpectraCharged { registry.fill(HIST("h_jet_pt_rhoareasubtracted"), jetcorrpt, weight); registry.fill(HIST("h2_centrality_jet_pt_rhoareasubtracted"), centrality, jetcorrpt, weight); registry.fill(HIST("h2_jet_pt_jet_corr_pt_rhoareasubtracted"), jet.pt(), jetcorrpt, weight); - registry.fill(HIST("h3_jet_pt_eta_phi_rhoareasubtracted"), jetcorrpt, jet.eta(), jet.phi(), weight); + registry.fill(HIST("h3_jet_pt_jet_eta_jet_phi_rhoareasubtracted"), jetcorrpt, jet.eta(), jet.phi(), weight); if (jetcorrpt > 0) { registry.fill(HIST("h_jet_eta_rhoareasubtracted"), jet.eta(), weight); registry.fill(HIST("h_jet_phi_rhoareasubtracted"), jet.phi(), weight); @@ -321,7 +324,7 @@ struct JetSpectraCharged { registry.fill(HIST("h_jet_pt_part"), jet.pt(), weight); registry.fill(HIST("h_jet_eta_part"), jet.eta(), weight); registry.fill(HIST("h_jet_phi_part"), jet.phi(), weight); - registry.fill(HIST("h3_jet_pt_eta_phi_part"), jet.pt(), jet.eta(), jet.phi(), weight); + registry.fill(HIST("h3_jet_pt_jet_eta_jet_phi_part"), jet.pt(), jet.eta(), jet.phi(), weight); registry.fill(HIST("h2_jet_pt_part_jet_area_part"), jet.pt(), jet.area(), weight); registry.fill(HIST("h2_jet_pt_part_jet_ntracks_part"), jet.pt(), jet.tracksIds().size(), weight); } @@ -338,7 +341,7 @@ struct JetSpectraCharged { // fill mcp jet histograms double jetcorrpt = jet.pt() - (rho * jet.area()); registry.fill(HIST("h_jet_pt_part_rhoareasubtracted"), jetcorrpt, weight); - registry.fill(HIST("h3_jet_pt_eta_phi_part_rhoareasubtracted"), jetcorrpt, jet.eta(), jet.phi(), weight); + registry.fill(HIST("h3_jet_pt_jet_eta_jet_phi_part_rhoareasubtracted"), jetcorrpt, jet.eta(), jet.phi(), weight); if (jetcorrpt > 0) { registry.fill(HIST("h_jet_eta_part_rhoareasubtracted"), jet.eta(), weight); registry.fill(HIST("h_jet_phi_part_rhoareasubtracted"), jet.phi(), weight); @@ -461,18 +464,12 @@ struct JetSpectraCharged { void processQC(soa::Filtered::iterator const& collision, soa::Filtered> const& tracks) { - registry.fill(HIST("h_collisions"), 0.5); if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { return; } - registry.fill(HIST("h_collisions"), 1.5); if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { return; } - registry.fill(HIST("h_collisions"), 2.5); - registry.fill(HIST("h2_centrality_occupancy"), collision.centrality(), collision.trackOccupancyInTimeRange()); - registry.fill(HIST("h_collisions_Zvertex"), collision.posZ()); - for (auto const& track : tracks) { if (!jetderiveddatautilities::selectTrack(track, trackSelection)) { continue; @@ -480,27 +477,19 @@ struct JetSpectraCharged { fillTrackHistograms(track, collision.centrality()); } } - PROCESS_SWITCH(JetSpectraCharged, processQC, "collisions and track QC for Data and MCD", true); + PROCESS_SWITCH(JetSpectraCharged, processQC, "collisions and track QC for Data and MCD", false); void processQCWeighted(soa::Join::iterator const& collision, aod::JetMcCollisions const&, soa::Filtered> const& tracks) { float eventWeight = collision.mcCollision().weight(); - registry.fill(HIST("h_collisions"), 0.5); - registry.fill(HIST("h_collisions_weighted"), 0.5, eventWeight); if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { return; } - registry.fill(HIST("h_collisions"), 1.5); - registry.fill(HIST("h_collisions_weighted"), 1.5, eventWeight); if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { return; } - registry.fill(HIST("h_collisions"), 2.5); - registry.fill(HIST("h_collisions_weighted"), 2.5, eventWeight); - registry.fill(HIST("h_collisions_Zvertex"), collision.posZ(), eventWeight); - for (auto const& track : tracks) { if (!jetderiveddatautilities::selectTrack(track, trackSelection)) { continue; @@ -510,6 +499,43 @@ struct JetSpectraCharged { } PROCESS_SWITCH(JetSpectraCharged, processQCWeighted, "weighted collsions and tracks QC for MC", false); + void processCollisions(soa::Filtered::iterator const& collision) + { + registry.fill(HIST("h_collisions"), 0.5); + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + return; + } + registry.fill(HIST("h_collisions"), 1.5); + if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { + return; + } + registry.fill(HIST("h_collisions"), 2.5); + registry.fill(HIST("h2_centrality_occupancy"), collision.centrality(), collision.trackOccupancyInTimeRange()); + registry.fill(HIST("h_collisions_Zvertex"), collision.posZ()); + } + PROCESS_SWITCH(JetSpectraCharged, processCollisions, "collisions Data and MCD", true); + + void processCollisionsWeighted(soa::Join::iterator const& collision, + aod::JetMcCollisions const&) + { + float eventWeight = collision.mcCollision().weight(); + registry.fill(HIST("h_collisions"), 0.5); + registry.fill(HIST("h_collisions_weighted"), 0.5, eventWeight); + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + return; + } + registry.fill(HIST("h_collisions"), 1.5); + registry.fill(HIST("h_collisions_weighted"), 1.5, eventWeight); + if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { + return; + } + registry.fill(HIST("h_collisions"), 2.5); + registry.fill(HIST("h_collisions_weighted"), 2.5, eventWeight); + registry.fill(HIST("h2_centrality_occupancy"), collision.centrality(), collision.trackOccupancyInTimeRange()); + registry.fill(HIST("h_collisions_Zvertex"), collision.posZ(), eventWeight); + } + PROCESS_SWITCH(JetSpectraCharged, processCollisionsWeighted, "weighted collsions for MCD", false); + void processSpectraData(soa::Filtered::iterator const& collision, soa::Join const& jets, aod::JetTracks const&) @@ -660,7 +686,7 @@ struct JetSpectraCharged { occupancyIsGood = true; } } else { - for (auto& collision : collisions) { + for (auto const& collision : collisions) { if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { hasSel8Coll = true; } @@ -717,7 +743,7 @@ struct JetSpectraCharged { bool hasSel8Coll = false; bool centralityIsGood = false; bool occupancyIsGood = false; - for (auto& collision : collisions) { + for (auto const& collision : collisions) { if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { hasSel8Coll = true; } @@ -770,7 +796,7 @@ struct JetSpectraCharged { registry.fill(HIST("h_mcColl_counts"), 2.5); bool hasSel8Coll = false; - for (auto& collision : collisions) { + for (auto const& collision : collisions) { if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { hasSel8Coll = true; } @@ -932,7 +958,7 @@ struct JetSpectraCharged { if (!isAcceptedJet(mcdjet)) { continue; } - fillGeoMatchedCorrHistograms(mcdjet, collision.rho()); + fillGeoMatchedCorrHistograms(mcdjet, collision.rho(), mcrho); } } } From 8eef411e3963f58ee869647ab5e260c0063c4a95 Mon Sep 17 00:00:00 2001 From: sofiatomassini <122356048+sofiatomassini@users.noreply.github.com> Date: Tue, 25 Feb 2025 08:16:38 +0100 Subject: [PATCH 0406/1650] [PWGCF,PWGLF] adding ITS PID and other minor changes (#10171) Co-authored-by: Sofia Tomassini --- PWGCF/Femto3D/Core/femto3dPairTask.h | 38 ++++++++++++++- PWGCF/Femto3D/DataModel/singletrackselector.h | 48 +++++++++++++++++-- .../TableProducer/singleTrackSelector.cxx | 2 +- .../singleTrackSelectorPIDMaker.cxx | 2 + PWGCF/Femto3D/Tasks/femto3dPairTask.cxx | 24 +++++----- PWGCF/Femto3D/Tasks/femto3dPairTaskMC.cxx | 14 +++--- PWGCF/Femto3D/Tasks/femto3dQA.cxx | 3 +- PWGLF/Tasks/Strangeness/k0_mixed_events.cxx | 8 ++-- 8 files changed, 112 insertions(+), 27 deletions(-) diff --git a/PWGCF/Femto3D/Core/femto3dPairTask.h b/PWGCF/Femto3D/Core/femto3dPairTask.h index a3b74c36cd0..38108379302 100755 --- a/PWGCF/Femto3D/Core/femto3dPairTask.h +++ b/PWGCF/Femto3D/Core/femto3dPairTask.h @@ -17,7 +17,6 @@ #define PWGCF_FEMTO3D_CORE_FEMTO3DPAIRTASK_H_ #define THETA(eta) 2.0 * atan(exp(-eta)) - // #include "Framework/ASoA.h" // #include "Framework/DataTypes.h" // #include "Framework/AnalysisDataModel.h" @@ -31,6 +30,8 @@ #include "TVector3.h" #include "TDatabasePDG.h" +#include "CommonConstants/MathConstants.h" + double particle_mass(int PDGcode) { // if(PDGcode == 2212) return TDatabasePDG::Instance()->GetParticle(2212)->Mass(); @@ -194,6 +195,7 @@ class FemtoPair bool IsIdentical() { return _isidentical; } bool IsClosePair(const float& deta, const float& dphi, const float& radius) const; + bool IsClosePair(const float& deta, const float& dphi) const; bool IsClosePair(const float& avgSep) const { return static_cast(GetAvgSep() < avgSep); } float GetAvgSep() const; @@ -212,6 +214,8 @@ class FemtoPair else return 1000; } + float GetAvgPhiStarDiff() const; + float GetKstar() const; TVector3 GetQLCMS() const; float GetKt() const; @@ -261,6 +265,20 @@ bool FemtoPair::IsClosePair(const float& deta, const float& dphi, con return false; } +template +bool FemtoPair::IsClosePair(const float& deta, const float& dphi) const +{ + if (_first == NULL || _second == NULL) + return true; + if (_magfield1 * _magfield2 == 0) + return true; + if (std::pow(std::fabs(GetEtaDiff()) / deta, 2) + std::pow(std::fabs(GetAvgPhiStarDiff()) / dphi, 2) < 1.0f) + return true; + // if (std::fabs(GetEtaDiff()) < deta && std::fabs(GetPhiStarDiff(radius)) < dphi) + // return true; + + return false; +} template float FemtoPair::GetAvgSep() const { @@ -279,6 +297,24 @@ float FemtoPair::GetAvgSep() const return 100.0 * res / TPCradii.size(); } +template +float FemtoPair::GetAvgPhiStarDiff() const +{ + if (_first == NULL || _second == NULL) + return -100.f; + if (_magfield1 * _magfield2 == 0) + return -100.f; + + float res = 0.0; + + for (const auto& radius : TPCradii) { + auto dphi = GetPhiStarDiff(radius); + res += fabs(dphi) > o2::constants::math::PI ? (1.0 - 2.0 * o2::constants::math::PI / fabs(dphi)) * dphi : dphi; + } + + return res / TPCradii.size(); +} + template float FemtoPair::GetKstar() const { diff --git a/PWGCF/Femto3D/DataModel/singletrackselector.h b/PWGCF/Femto3D/DataModel/singletrackselector.h index a545977d28c..958c1ecf14c 100644 --- a/PWGCF/Femto3D/DataModel/singletrackselector.h +++ b/PWGCF/Femto3D/DataModel/singletrackselector.h @@ -517,11 +517,53 @@ DECLARE_SOA_TABLE(SingleTrkMCs, "AOD", "SINGLETRKMC", // Table with generatad in namespace o2::aod::singletrackselector { - template -inline bool TPCselection(TrackType const& track, std::pair> const& PIDcuts) +inline bool ITSselection(TrackType const& track, std::pair> const& PIDcuts) { int PDG = PIDcuts.first; + + float Nsigma = -1000; + switch (PDG) { + case 2212: + Nsigma = track.itsNSigmaPr(); + break; + case 1000010020: + Nsigma = track.itsNSigmaDe(); + break; + case 1000020030: + Nsigma = track.itsNSigmaHe(); + break; + case 1000010030: + Nsigma = track.itsNSigmaTr(); + break; + case 211: + Nsigma = track.itsNSigmaPi(); + break; + case 321: + Nsigma = track.itsNSigmaKa(); + break; + case 0: + return false; + default: + LOG(fatal) << "Cannot interpret PDG for ITS selection: " << PIDcuts.first; + } + + if (Nsigma > PIDcuts.second[0] && Nsigma < PIDcuts.second[1]) { + return true; + } + return false; +} + +template +inline bool TPCselection(TrackType const& track, std::pair> const& PIDcuts, std::vector const& ITSCut = std::vector{}) +{ + int PDG = PIDcuts.first; + + if constexpr (useITS) { + if (ITSCut.size() != 0 && !ITSselection(track, std::make_pair(PDG, ITSCut))) + return false; + } + float Nsigma = -1000; switch (PDG) { case 2212: @@ -558,7 +600,7 @@ template inline bool TOFselection(TrackType const& track, std::pair> const& PIDcuts, std::vector const& TPCresidualCut = std::vector{-5.0f, 5.0f}) { int PDG = PIDcuts.first; - if (!TPCselection(track, std::make_pair(PDG, TPCresidualCut))) + if (!TPCselection(track, std::make_pair(PDG, TPCresidualCut))) return false; float Nsigma = -1000; diff --git a/PWGCF/Femto3D/TableProducer/singleTrackSelector.cxx b/PWGCF/Femto3D/TableProducer/singleTrackSelector.cxx index 757c760b28f..05a47bdc8e2 100644 --- a/PWGCF/Femto3D/TableProducer/singleTrackSelector.cxx +++ b/PWGCF/Femto3D/TableProducer/singleTrackSelector.cxx @@ -230,7 +230,7 @@ struct singleTrackSelector { registry.fill(HIST("hNTracks"), 1.5); for (auto ii : particlesToKeep) - if (o2::aod::singletrackselector::TPCselection(track, std::make_pair(ii, keepWithinNsigmaTPC))) { + if (o2::aod::singletrackselector::TPCselection(track, std::make_pair(ii, keepWithinNsigmaTPC))) { if (track.p() > _pRemoveTofOutOfRange && !o2::aod::singletrackselector::TOFselection(track, std::make_pair(ii, std::vector{-10.0, 10.0}), std::vector{-10.0, 10.0})) continue; diff --git a/PWGCF/Femto3D/TableProducer/singleTrackSelectorPIDMaker.cxx b/PWGCF/Femto3D/TableProducer/singleTrackSelectorPIDMaker.cxx index 03689b0154a..611a5333841 100644 --- a/PWGCF/Femto3D/TableProducer/singleTrackSelectorPIDMaker.cxx +++ b/PWGCF/Femto3D/TableProducer/singleTrackSelectorPIDMaker.cxx @@ -88,6 +88,7 @@ struct StPidDe { } } }; + struct StPidTr { Produces table; void process(o2::aod::SingleTrackSels const& tracks) @@ -99,6 +100,7 @@ struct StPidTr { } } }; + struct StPidHe { Produces table; void process(o2::aod::SingleTrackSels const& tracks) diff --git a/PWGCF/Femto3D/Tasks/femto3dPairTask.cxx b/PWGCF/Femto3D/Tasks/femto3dPairTask.cxx index aeace9e6122..968ed384c7a 100644 --- a/PWGCF/Femto3D/Tasks/femto3dPairTask.cxx +++ b/PWGCF/Femto3D/Tasks/femto3dPairTask.cxx @@ -74,6 +74,7 @@ struct FemtoCorrelations { Configurable _sign_1{"sign_1", 1, "sign of the first particle in a pair"}; Configurable _particlePDG_1{"particlePDG_1", 2212, "PDG code of the first particle in a pair to perform PID for (only pion, kaon, proton and deurton are supported now)"}; Configurable> _tpcNSigma_1{"tpcNSigma_1", std::vector{-3.0f, 3.0f}, "first particle PID: Nsigma range in TPC before the TOF is used"}; + Configurable> _itsNSigma_1{"itsNSigma_1", std::vector{-10.0f, 10.0f}, "first particle PID: Nsigma range in ITS with TPC is used"}; Configurable _PIDtrshld_1{"PIDtrshld_1", 10.0, "first particle PID: value of momentum from which the PID is done with TOF (before that only TPC is used)"}; Configurable> _tofNSigma_1{"tofNSigma_1", std::vector{-3.0f, 3.0f}, "first particle PID: Nsigma range in TOF"}; Configurable> _tpcNSigmaResidual_1{"tpcNSigmaResidual_1", std::vector{-5.0f, 5.0f}, "first particle PID: residual TPC Nsigma cut to use with the TOF"}; @@ -81,6 +82,7 @@ struct FemtoCorrelations { Configurable _sign_2{"sign_2", 1, "sign of the second particle in a pair"}; Configurable _particlePDG_2{"particlePDG_2", 2212, "PDG code of the second particle in a pair to perform PID for (only pion, kaon, proton and deurton are supported now)"}; Configurable> _tpcNSigma_2{"tpcNSigma_2", std::vector{-3.0f, 3.0f}, "second particle PID: Nsigma range in TPC before the TOF is used"}; + Configurable> _itsNSigma_2{"itsNSigma_2", std::vector{-10.0f, 10.0f}, "first particle PID: Nsigma range in ITS with TPC is used"}; Configurable _PIDtrshld_2{"PIDtrshld_2", 10.0, "second particle PID: value of momentum from which the PID is done with TOF (before that only TPC is used)"}; Configurable> _tofNSigma_2{"tofNSigma_2", std::vector{-3.0f, 3.0f}, "second particle PID: Nsigma range in TOF"}; Configurable> _tpcNSigmaResidual_2{"tpcNSigmaResidual_2", std::vector{-5.0f, 5.0f}, "second particle PID: residual TPC Nsigma cut to use with the TOF"}; @@ -90,7 +92,7 @@ struct FemtoCorrelations { Configurable _deta{"deta", 0.01, "minimum allowed defference in eta between two tracks in a pair"}; Configurable _dphi{"dphi", 0.01, "minimum allowed defference in phi_star between two tracks in a pair"}; - Configurable _radiusTPC{"radiusTPC", 1.2, "TPC radius to calculate phi_star for"}; + // Configurable _radiusTPC{"radiusTPC", 1.2, "TPC radius to calculate phi_star for"}; Configurable _avgSepTPC{"avgSepTPC", 10, "average sep. (cm) in TPC"}; Configurable _vertexNbinsToMix{"vertexNbinsToMix", 10, "Number of vertexZ bins for the mixing"}; @@ -294,15 +296,15 @@ struct FemtoCorrelations { LOGF(fatal, "kTbin value obtained for a pair exceeds the configured number of kT bins (3D)"); if (_fillDetaDphi % 2 == 0) - DoubleTrack_SE_histos_BC[multBin][kTbin]->Fill(Pair->GetPhiStarDiff(_radiusTPC), Pair->GetEtaDiff()); + DoubleTrack_SE_histos_BC[multBin][kTbin]->Fill(Pair->GetAvgPhiStarDiff(), Pair->GetEtaDiff()); - if (_deta > 0 && _dphi > 0 && Pair->IsClosePair(_deta, _dphi, _radiusTPC)) + if (_deta > 0 && _dphi > 0 && Pair->IsClosePair(_deta, _dphi)) continue; if (_avgSepTPC > 0 && Pair->IsClosePair(_avgSepTPC)) continue; if (_fillDetaDphi > 0) - DoubleTrack_SE_histos_AC[multBin][kTbin]->Fill(Pair->GetPhiStarDiff(_radiusTPC), Pair->GetEtaDiff()); + DoubleTrack_SE_histos_AC[multBin][kTbin]->Fill(Pair->GetAvgPhiStarDiff(), Pair->GetEtaDiff()); kThistos[multBin][kTbin]->Fill(pair_kT); mThistos[multBin][kTbin]->Fill(Pair->GetMt()); // test @@ -343,21 +345,21 @@ struct FemtoCorrelations { if (_fillDetaDphi % 2 == 0) { if (!SE_or_ME) - DoubleTrack_SE_histos_BC[multBin][kTbin]->Fill(Pair->GetPhiStarDiff(_radiusTPC), Pair->GetEtaDiff()); + DoubleTrack_SE_histos_BC[multBin][kTbin]->Fill(Pair->GetAvgPhiStarDiff(), Pair->GetEtaDiff()); else - DoubleTrack_ME_histos_BC[multBin][kTbin]->Fill(Pair->GetPhiStarDiff(_radiusTPC), Pair->GetEtaDiff()); + DoubleTrack_ME_histos_BC[multBin][kTbin]->Fill(Pair->GetAvgPhiStarDiff(), Pair->GetEtaDiff()); } - if (_deta > 0 && _dphi > 0 && Pair->IsClosePair(_deta, _dphi, _radiusTPC)) + if (_deta > 0 && _dphi > 0 && Pair->IsClosePair(_deta, _dphi)) continue; if (_avgSepTPC > 0 && Pair->IsClosePair(_avgSepTPC)) continue; if (_fillDetaDphi > 0) { if (!SE_or_ME) - DoubleTrack_SE_histos_AC[multBin][kTbin]->Fill(Pair->GetPhiStarDiff(_radiusTPC), Pair->GetEtaDiff()); + DoubleTrack_SE_histos_AC[multBin][kTbin]->Fill(Pair->GetAvgPhiStarDiff(), Pair->GetEtaDiff()); else - DoubleTrack_ME_histos_AC[multBin][kTbin]->Fill(Pair->GetPhiStarDiff(_radiusTPC), Pair->GetEtaDiff()); + DoubleTrack_ME_histos_AC[multBin][kTbin]->Fill(Pair->GetAvgPhiStarDiff(), Pair->GetEtaDiff()); } if (!SE_or_ME) { @@ -417,7 +419,7 @@ struct FemtoCorrelations { if (std::fabs(track.dcaXY()) > _dcaXY.value[0] + _dcaXY.value[1] * std::pow(track.pt(), _dcaXY.value[2]) || std::fabs(track.dcaZ()) > _dcaZ.value[0] + _dcaZ.value[1] * std::pow(track.pt(), _dcaZ.value[2])) continue; - if (track.sign() == _sign_1 && (track.p() < _PIDtrshld_1 ? o2::aod::singletrackselector::TPCselection(track, TPCcuts_1) : o2::aod::singletrackselector::TOFselection(track, TOFcuts_1, _tpcNSigmaResidual_1.value))) { // filling the map: eventID <-> selected particles1 + if (track.sign() == _sign_1 && (track.p() < _PIDtrshld_1 ? o2::aod::singletrackselector::TPCselection(track, TPCcuts_1, _itsNSigma_1.value) : o2::aod::singletrackselector::TOFselection(track, TOFcuts_1, _tpcNSigmaResidual_1.value))) { // filling the map: eventID <-> selected particles1 selectedtracks_1[track.singleCollSelId()].push_back(std::make_shared(track)); registry.fill(HIST("p_first"), track.p()); @@ -441,7 +443,7 @@ struct FemtoCorrelations { if (IsIdentical) { continue; - } else if (track.sign() != _sign_2 && !TOFselection(track, std::make_pair(_particlePDGtoReject, _rejectWithinNsigmaTOF)) && (track.p() < _PIDtrshld_2 ? o2::aod::singletrackselector::TPCselection(track, TPCcuts_2) : o2::aod::singletrackselector::TOFselection(track, TOFcuts_2, _tpcNSigmaResidual_2.value))) { // filling the map: eventID <-> selected particles2 if (see condition above ^) + } else if (track.sign() != _sign_2 && !TOFselection(track, std::make_pair(_particlePDGtoReject, _rejectWithinNsigmaTOF)) && (track.p() < _PIDtrshld_2 ? o2::aod::singletrackselector::TPCselection(track, TPCcuts_2, _itsNSigma_2.value) : o2::aod::singletrackselector::TOFselection(track, TOFcuts_2, _tpcNSigmaResidual_2.value))) { // filling the map: eventID <-> selected particles2 if (see condition above ^) selectedtracks_2[track.singleCollSelId()].push_back(std::make_shared(track)); registry.fill(HIST("p_second"), track.p()); diff --git a/PWGCF/Femto3D/Tasks/femto3dPairTaskMC.cxx b/PWGCF/Femto3D/Tasks/femto3dPairTaskMC.cxx index 3d24afdd1cf..06635858ce0 100644 --- a/PWGCF/Femto3D/Tasks/femto3dPairTaskMC.cxx +++ b/PWGCF/Femto3D/Tasks/femto3dPairTaskMC.cxx @@ -70,6 +70,7 @@ struct FemtoCorrelationsMC { Configurable _sign_1{"sign_1", 1, "sign of the first particle in a pair"}; Configurable _particlePDG_1{"particlePDG_1", 2212, "PDG code of the first particle in a pair to perform PID for (only pion, kaon, proton and deurton are supported now)"}; Configurable> _tpcNSigma_1{"tpcNSigma_1", std::vector{-3.0f, 3.0f}, "first particle PID: Nsigma range in TPC before the TOF is used"}; + Configurable> _itsNSigma_1{"itsNSigma_1", std::vector{-10.0f, 10.0f}, "first particle PID: Nsigma range in ITS with TPC is used"}; Configurable _PIDtrshld_1{"PIDtrshld_1", 10.0, "first particle PID: value of momentum from which the PID is done with TOF (before that only TPC is used)"}; Configurable> _tofNSigma_1{"tofNSigma_1", std::vector{-3.0f, 3.0f}, "first particle PID: Nsigma range in TOF"}; Configurable> _tpcNSigmaResidual_1{"tpcNSigmaResidual_1", std::vector{-5.0f, 5.0f}, "first particle PID: residual TPC Nsigma cut to use with the TOF"}; @@ -77,6 +78,7 @@ struct FemtoCorrelationsMC { Configurable _sign_2{"sign_2", 1, "sign of the second particle in a pair"}; Configurable _particlePDG_2{"particlePDG_2", 2212, "PDG code of the second particle in a pair to perform PID for (only pion, kaon, proton and deurton are supported now)"}; Configurable> _tpcNSigma_2{"tpcNSigma_2", std::vector{-3.0f, 3.0f}, "second particle PID: Nsigma range in TPC before the TOF is used"}; + Configurable> _itsNSigma_2{"itsNSigma_2", std::vector{-10.0f, 10.0f}, "first particle PID: Nsigma range in ITS with TPC is used"}; Configurable _PIDtrshld_2{"PIDtrshld_2", 10.0, "second particle PID: value of momentum from which the PID is done with TOF (before that only TPC is used)"}; Configurable> _tofNSigma_2{"tofNSigma_2", std::vector{-3.0f, 3.0f}, "second particle PID: Nsigma range in TOF"}; Configurable> _tpcNSigmaResidual_2{"tpcNSigmaResidual_2", std::vector{-5.0f, 5.0f}, "second particle PID: residual TPC Nsigma cut to use with the TOF"}; @@ -84,7 +86,7 @@ struct FemtoCorrelationsMC { Configurable _particlePDGtoReject{"particlePDGtoRejectFromSecond", 0, "applied only if the particles are non-identical and only to the second particle in the pair!!!"}; Configurable> _rejectWithinNsigmaTOF{"rejectWithinNsigmaTOF", std::vector{-0.0f, 0.0f}, "TOF rejection Nsigma range for the particle specified with PDG to be rejected"}; - Configurable _radiusTPC{"radiusTPC", 1.2, "TPC radius to calculate phi_star for"}; + // Configurable _radiusTPC{"radiusTPC", 1.2, "TPC radius to calculate phi_star for"}; Configurable _vertexNbinsToMix{"vertexNbinsToMix", 10, "Number of vertexZ bins for the mixing"}; Configurable> _centBins{"multBins", std::vector{0.0f, 100.0f}, "multiplicity percentile/centrality binning (min:0, max:100)"}; @@ -252,7 +254,7 @@ struct FemtoCorrelationsMC { LOGF(fatal, "kTbin value obtained for a pair exceeds the configured number of kT bins"); kThistos[centBin][kTbin]->Fill(pair_kT); - DoubleTrack_SE_histos[centBin][kTbin]->Fill(Pair->GetPhiStarDiff(_radiusTPC), Pair->GetEtaDiff()); + DoubleTrack_SE_histos[centBin][kTbin]->Fill(Pair->GetAvgPhiStarDiff(), Pair->GetEtaDiff()); AvgSep_SE_histos[centBin][kTbin]->Fill(Pair->GetAvgSep()); Pair->ResetPair(); } @@ -276,7 +278,7 @@ struct FemtoCorrelationsMC { LOGF(fatal, "kTbin value obtained for a pair exceeds the configured number of kT bins"); kThistos[centBin][kTbin]->Fill(pair_kT); - DoubleTrack_SE_histos[centBin][kTbin]->Fill(Pair->GetPhiStarDiff(_radiusTPC), Pair->GetEtaDiff()); + DoubleTrack_SE_histos[centBin][kTbin]->Fill(Pair->GetAvgPhiStarDiff(), Pair->GetEtaDiff()); AvgSep_SE_histos[centBin][kTbin]->Fill(Pair->GetAvgSep()); Pair->ResetPair(); } @@ -299,7 +301,7 @@ struct FemtoCorrelationsMC { if (kTbin > Resolution_histos[centBin].size() || kTbin > DoubleTrack_ME_histos[centBin].size()) LOGF(fatal, "kTbin value obtained for a pair exceeds the configured number of kT bins"); - DoubleTrack_ME_histos[centBin][kTbin]->Fill(Pair->GetPhiStarDiff(_radiusTPC), Pair->GetEtaDiff()); + DoubleTrack_ME_histos[centBin][kTbin]->Fill(Pair->GetAvgPhiStarDiff(), Pair->GetEtaDiff()); AvgSep_ME_histos[centBin][kTbin]->Fill(Pair->GetAvgSep()); if (abs(ii->pdgCode()) != _particlePDG_1.value || abs(iii->pdgCode()) != _particlePDG_2.value) @@ -347,7 +349,7 @@ struct FemtoCorrelationsMC { unsigned int centBin = o2::aod::singletrackselector::getBinIndex(track.template singleCollSel_as>().multPerc(), _centBins); - if (track.sign() == _sign_1 && (track.p() < _PIDtrshld_1 ? o2::aod::singletrackselector::TPCselection(track, TPCcuts_1) : o2::aod::singletrackselector::TOFselection(track, TOFcuts_1, _tpcNSigmaResidual_1.value))) { + if (track.sign() == _sign_1 && (track.p() < _PIDtrshld_1 ? o2::aod::singletrackselector::TPCselection(track, TPCcuts_1, _itsNSigma_1.value) : o2::aod::singletrackselector::TOFselection(track, TOFcuts_1, _tpcNSigmaResidual_1.value))) { trackOrigin = track.origin(); @@ -368,7 +370,7 @@ struct FemtoCorrelationsMC { if (IsIdentical) { continue; - } else if (track.sign() != _sign_2 && !TOFselection(track, std::make_pair(_particlePDGtoReject, _rejectWithinNsigmaTOF)) && (track.p() < _PIDtrshld_2 ? o2::aod::singletrackselector::TPCselection(track, TPCcuts_2) : o2::aod::singletrackselector::TOFselection(track, TOFcuts_2, _tpcNSigmaResidual_2.value))) { // filling the map: eventID <-> selected particles2 if (see condition above ^) + } else if (track.sign() != _sign_2 && !TOFselection(track, std::make_pair(_particlePDGtoReject, _rejectWithinNsigmaTOF)) && (track.p() < _PIDtrshld_2 ? o2::aod::singletrackselector::TPCselection(track, TPCcuts_2, _itsNSigma_2.value) : o2::aod::singletrackselector::TOFselection(track, TOFcuts_2, _tpcNSigmaResidual_2.value))) { // filling the map: eventID <-> selected particles2 if (see condition above ^) trackOrigin = track.origin(); diff --git a/PWGCF/Femto3D/Tasks/femto3dQA.cxx b/PWGCF/Femto3D/Tasks/femto3dQA.cxx index 116d79fe9d0..22fab0e58b0 100644 --- a/PWGCF/Femto3D/Tasks/femto3dQA.cxx +++ b/PWGCF/Femto3D/Tasks/femto3dQA.cxx @@ -68,6 +68,7 @@ struct QAHistograms { Configurable _itsChi2NCl{"itsChi2NCl", 100.0, "upper limit for chi2 value of a fit over ITS clasters for a track"}; Configurable _particlePDG{"particlePDG", 2212, "PDG code of a particle to perform PID for (only pion, kaon, proton and deurton are supported now)"}; Configurable> _tpcNSigma{"tpcNSigma", std::vector{-4.0f, 4.0f}, "Nsigma range in TPC before the TOF is used"}; + Configurable> _itsNSigma{"itsNSigma", std::vector{-10.0f, 10.0f}, "Nsigma range in ITS to use along with TPC"}; Configurable _PIDtrshld{"PIDtrshld", 10.0, "value of momentum from which the PID is done with TOF (before that only TPC is used)"}; Configurable> _tofNSigma{"tofNSigma", std::vector{-4.0f, 4.0f}, "Nsigma range in TOF"}; Configurable> _tpcNSigmaResidual{"tpcNSigmaResidual", std::vector{-5.0f, 5.0f}, "residual TPC Nsigma cut to use with the TOF"}; @@ -245,7 +246,7 @@ struct QAHistograms { registry.fill(HIST("TOFSignal_nocuts"), track.p(), track.beta()); } - if (!TOFselection(track, std::make_pair(_particlePDGtoReject, _rejectWithinNsigmaTOF)) && (track.p() < _PIDtrshld ? o2::aod::singletrackselector::TPCselection(track, TPCcuts) : o2::aod::singletrackselector::TOFselection(track, TOFcuts, _tpcNSigmaResidual.value))) { + if (!TOFselection(track, std::make_pair(_particlePDGtoReject, _rejectWithinNsigmaTOF)) && (track.p() < _PIDtrshld ? o2::aod::singletrackselector::TPCselection(track, TPCcuts, _itsNSigma.value) : o2::aod::singletrackselector::TOFselection(track, TOFcuts, _tpcNSigmaResidual.value))) { registry.fill(HIST("eta"), track.eta()); registry.fill(HIST("phi"), track.phi()); registry.fill(HIST("px"), track.px()); diff --git a/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx b/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx index baab9efea6e..5de8a32c122 100644 --- a/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx +++ b/PWGLF/Tasks/Strangeness/k0_mixed_events.cxx @@ -548,7 +548,7 @@ struct K0MixedEvents { registry.fill(HIST("rapidity_first"), track.pt(), track.rapidity(particle_mass(_particlePDG_1))); if ((track.sign() == _sign_1) && - (track.p() < _PIDtrshld_1 ? o2::aod::singletrackselector::TPCselection(track, TPCcuts_1) : o2::aod::singletrackselector::TOFselection(track, TOFcuts_1))) { // filling the map: eventID <-> selected particles1 + (track.p() < _PIDtrshld_1 ? o2::aod::singletrackselector::TPCselection(track, TPCcuts_1) : o2::aod::singletrackselector::TOFselection(track, TOFcuts_1))) { // filling the map: eventID <-> selected particles1 selectedtracks_1[track.singleCollSelId()].push_back(std::make_shared(track)); registry.fill(HIST("p_first"), track.p()); @@ -580,7 +580,7 @@ struct K0MixedEvents { continue; } else if ((track.sign() == _sign_2) && (_particlePDGtoReject != 0 || !o2::aod::singletrackselector::TOFselection(track, std::make_pair(_particlePDGtoReject, _rejectWithinNsigmaTOF))) && - (track.p() < _PIDtrshld_2 ? o2::aod::singletrackselector::TPCselection(track, TPCcuts_2) : o2::aod::singletrackselector::TOFselection(track, TOFcuts_2))) { // filling the map: eventID <-> selected particles2 if (see condition above ^) + (track.p() < _PIDtrshld_2 ? o2::aod::singletrackselector::TPCselection(track, TPCcuts_2) : o2::aod::singletrackselector::TOFselection(track, TOFcuts_2))) { // filling the map: eventID <-> selected particles2 if (see condition above ^) selectedtracks_2[track.singleCollSelId()].push_back(std::make_shared(track)); registry.fill(HIST("p_second"), track.p()); @@ -746,7 +746,7 @@ struct K0MixedEvents { registry.fill(HIST("rapidity_first"), track.pt(), track.rapidity(particle_mass(_particlePDG_1))); if ((track.sign() == _sign_1) && - (track.p() < _PIDtrshld_1 ? o2::aod::singletrackselector::TPCselection(track, TPCcuts_1) : o2::aod::singletrackselector::TOFselection(track, TOFcuts_1))) { // filling the map: eventID <-> selected particles1 + (track.p() < _PIDtrshld_1 ? o2::aod::singletrackselector::TPCselection(track, TPCcuts_1) : o2::aod::singletrackselector::TOFselection(track, TOFcuts_1))) { // filling the map: eventID <-> selected particles1 selectedtracks_1[track.collisionId()].push_back(std::make_shared(track)); registry.fill(HIST("p_first"), track.p()); @@ -778,7 +778,7 @@ struct K0MixedEvents { continue; } else if ((track.sign() == _sign_2) && (_particlePDGtoReject != 0 || !o2::aod::singletrackselector::TOFselection(track, std::make_pair(_particlePDGtoReject, _rejectWithinNsigmaTOF))) && - (track.p() < _PIDtrshld_2 ? o2::aod::singletrackselector::TPCselection(track, TPCcuts_2) : o2::aod::singletrackselector::TOFselection(track, TOFcuts_2))) { // filling the map: eventID <-> selected particles2 if (see condition above ^) + (track.p() < _PIDtrshld_2 ? o2::aod::singletrackselector::TPCselection(track, TPCcuts_2) : o2::aod::singletrackselector::TOFselection(track, TOFcuts_2))) { // filling the map: eventID <-> selected particles2 if (see condition above ^) selectedtracks_2[track.collisionId()].push_back(std::make_shared(track)); registry.fill(HIST("p_second"), track.p()); From e43cb26284a278b0497bef0936b7f352aba60e5b Mon Sep 17 00:00:00 2001 From: Phil Stahlhut <138057549+pstahlhu@users.noreply.github.com> Date: Tue, 25 Feb 2025 08:35:15 +0100 Subject: [PATCH 0407/1650] [PWGHF] XicToXiPiPi: Update output table structures (#10177) Co-authored-by: pstahlhu --- .../DataModel/CandidateReconstructionTables.h | 3 +- .../candidateCreatorXicToXiPiPi.cxx | 28 ++++++--- .../TableProducer/treeCreatorXicToXiPiPi.cxx | 62 +++++++------------ 3 files changed, 44 insertions(+), 49 deletions(-) diff --git a/PWGHF/DataModel/CandidateReconstructionTables.h b/PWGHF/DataModel/CandidateReconstructionTables.h index 3650fd4ece0..e104da7f634 100644 --- a/PWGHF/DataModel/CandidateReconstructionTables.h +++ b/PWGHF/DataModel/CandidateReconstructionTables.h @@ -1743,8 +1743,7 @@ DECLARE_SOA_TABLE(HfCandXicKF, "AOD", "HFCANDXICKF", cascdata::KFCascadeChi2, cascdata::KFV0Chi2, hf_cand_xic_to_xi_pi_pi::Chi2TopoXicPlusToPVBeforeConstraint, hf_cand_xic_to_xi_pi_pi::Chi2TopoXicPlusToPV, hf_cand_xic_to_xi_pi_pi::Chi2TopoXiToXicPlusBeforeConstraint, hf_cand_xic_to_xi_pi_pi::Chi2TopoXiToXicPlus, hf_cand_xic_to_xi_pi_pi::DcaXYPi0Pi1, hf_cand_xic_to_xi_pi_pi::DcaXYPi0Xi, hf_cand_xic_to_xi_pi_pi::DcaXYPi1Xi, - hf_cand_xic_to_xi_pi_pi::DcaPi0Pi1, hf_cand_xic_to_xi_pi_pi::DcaPi0Xi, hf_cand_xic_to_xi_pi_pi::DcaPi1Xi, - cascdata::DCACascDaughters); + hf_cand_xic_to_xi_pi_pi::DcaPi0Pi1, hf_cand_xic_to_xi_pi_pi::DcaPi0Xi, hf_cand_xic_to_xi_pi_pi::DcaPi1Xi); // table with results of reconstruction level MC matching DECLARE_SOA_TABLE(HfCandXicMcRec, "AOD", "HFCANDXICMCREC", //! diff --git a/PWGHF/TableProducer/candidateCreatorXicToXiPiPi.cxx b/PWGHF/TableProducer/candidateCreatorXicToXiPiPi.cxx index fb9ee7188a3..ffe671328ab 100644 --- a/PWGHF/TableProducer/candidateCreatorXicToXiPiPi.cxx +++ b/PWGHF/TableProducer/candidateCreatorXicToXiPiPi.cxx @@ -14,6 +14,7 @@ /// /// \author Phil Lennart Stahlhut , Heidelberg University /// \author Carolina Reetz , Heidelberg University +/// \author Jaeyoon Cho , Inha University /// \author Jinjoo Seo , Heidelberg University #ifndef HomogeneousField @@ -178,7 +179,9 @@ struct HfCandidateCreatorXicToXiPiPi { auto trackCharmBachelor0 = rowTrackIndexXicPlus.prong0_as(); auto trackCharmBachelor1 = rowTrackIndexXicPlus.prong1_as(); auto collision = rowTrackIndexXicPlus.collision(); - registry.fill(HIST("hCandCounter"), 1 + AllIdTriplets); + if (fillHistograms) { + registry.fill(HIST("hCandCounter"), 1 + AllIdTriplets); + } // preselect cascade candidates if (doCascadePreselection) { @@ -189,7 +192,9 @@ struct HfCandidateCreatorXicToXiPiPi { continue; } } - registry.fill(HIST("hCandCounter"), 1 + CascPreSel); + if (fillHistograms) { + registry.fill(HIST("hCandCounter"), 1 + CascPreSel); + } //----------------------Set the magnetic field from ccdb--------------------------------------- /// The static instance of the propagator was already modified in the HFTrackIndexSkimCreator, @@ -241,7 +246,9 @@ struct HfCandidateCreatorXicToXiPiPi { LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN cannot work, skipping the candidate."; continue; } - registry.fill(HIST("hCandCounter"), 1 + VertexFit); + if (fillHistograms) { + registry.fill(HIST("hCandCounter"), 1 + VertexFit); + } //----------------------------calculate physical properties----------------------- // Charge of charm baryon @@ -399,7 +406,9 @@ struct HfCandidateCreatorXicToXiPiPi { auto trackCharmBachelor0 = rowTrackIndexXicPlus.prong0_as(); auto trackCharmBachelor1 = rowTrackIndexXicPlus.prong1_as(); auto collision = rowTrackIndexXicPlus.collision(); - registry.fill(HIST("hCandCounter"), 1 + AllIdTriplets); + if (fillHistograms) { + registry.fill(HIST("hCandCounter"), 1 + AllIdTriplets); + } //-------------------preselect cascade candidates-------------------------------------- if (doCascadePreselection) { @@ -410,7 +419,9 @@ struct HfCandidateCreatorXicToXiPiPi { continue; } } - registry.fill(HIST("hCandCounter"), 1 + CascPreSel); + if (fillHistograms) { + registry.fill(HIST("hCandCounter"), 1 + CascPreSel); + } //----------------------Set the magnetic field from ccdb----------------------------- /// The static instance of the propagator was already modified in the HFTrackIndexSkimCreator, @@ -464,7 +475,9 @@ struct HfCandidateCreatorXicToXiPiPi { LOG(debug) << "Failed to construct XicPlus : " << e.what(); continue; } - registry.fill(HIST("hCandCounter"), 1 + VertexFit); + if (fillHistograms) { + registry.fill(HIST("hCandCounter"), 1 + VertexFit); + } // get geometrical chi2 of XicPlus float chi2GeoXicPlus = kfXicPlus.GetChi2() / kfXicPlus.GetNDF(); @@ -645,8 +658,7 @@ struct HfCandidateCreatorXicToXiPiPi { rowCandidateKF(casc.kfCascadeChi2(), casc.kfV0Chi2(), chi2topoXicPlusToPVBeforeConstraint, chi2topoXicPlusToPV, chi2topoXiToXicPlusBeforeConstraint, chi2topoXiToXicPlus, dcaXYPi0Pi1, dcaXYPi0Xi, dcaXYPi1Xi, - dcaPi0Pi1, dcaPi0Xi, dcaPi1Xi, - casc.dcacascdaughters()); + dcaPi0Pi1, dcaPi0Xi, dcaPi1Xi); } // loop over track triplets } PROCESS_SWITCH(HfCandidateCreatorXicToXiPiPi, processXicplusWithKFParticle, "Run candidate creator with KFParticle using derived data from HfTrackIndexSkimCreatorLfCascades.", false); diff --git a/PWGHF/TableProducer/treeCreatorXicToXiPiPi.cxx b/PWGHF/TableProducer/treeCreatorXicToXiPiPi.cxx index 8c945b91ea9..47b1c3f71d4 100644 --- a/PWGHF/TableProducer/treeCreatorXicToXiPiPi.cxx +++ b/PWGHF/TableProducer/treeCreatorXicToXiPiPi.cxx @@ -14,6 +14,7 @@ /// /// \author Phil Lennart Stahlhut , Heidelberg University /// \author Carolina Reetz , Heidelberg University +/// \author Jaeyoon Cho , Inha University #include @@ -35,12 +36,6 @@ namespace full { DECLARE_SOA_COLUMN(CandidateSelFlag, candidateSelFlag, int); //! Selection flag of candidate (output of candidateSelector) // vertices -DECLARE_SOA_COLUMN(XPvErr, xPvErr, float); -DECLARE_SOA_COLUMN(YPvErr, yPvErr, float); -DECLARE_SOA_COLUMN(ZPvErr, zPvErr, float); -DECLARE_SOA_COLUMN(XSvErr, xSvErr, float); -DECLARE_SOA_COLUMN(YSvErr, ySvErr, float); -DECLARE_SOA_COLUMN(ZSvErr, zSvErr, float); DECLARE_SOA_COLUMN(Chi2Sv, chi2Sv, float); DECLARE_SOA_COLUMN(Chi2XiVtx, chi2XiVtx, float); DECLARE_SOA_COLUMN(Chi2LamVtx, chi2LamVtx, float); @@ -89,7 +84,6 @@ DECLARE_SOA_COLUMN(DcaXYPi1Xi, dcaXYPi1Xi, float); DECLARE_SOA_COLUMN(DcaPi0Pi1, dcaPi0Pi1, float); DECLARE_SOA_COLUMN(DcaPi0Xi, dcaPi0Xi, float); DECLARE_SOA_COLUMN(DcaPi1Xi, dcaPi1Xi, float); -DECLARE_SOA_COLUMN(DcaXiDaughters, dcaXiDaughters, float); DECLARE_SOA_COLUMN(InvMassXi, invMassXi, float); DECLARE_SOA_COLUMN(InvMassLambda, invMassLambda, float); DECLARE_SOA_COLUMN(InvMassXiPi0, invMassXiPi0, float); @@ -169,6 +163,7 @@ DECLARE_SOA_TABLE(HfCandXicToXiPiPiLiteKfs, "AOD", "HFXICXI2PILITKF", full::PtPi1, full::M, full::InvMassXi, + full::InvMassLambda, full::InvMassXiPi0, full::InvMassXiPi1, full::Chi2Sv, @@ -202,8 +197,7 @@ DECLARE_SOA_TABLE(HfCandXicToXiPiPiLiteKfs, "AOD", "HFXICXI2PILITKF", full::DcaXYPi1Xi, full::DcaPi0Pi1, full::DcaPi0Xi, - full::DcaPi1Xi, - full::DcaXiDaughters); + full::DcaPi1Xi); DECLARE_SOA_TABLE(HfCandXicToXiPiPiFulls, "AOD", "HFXICXI2PIFULL", hf_cand_xic_to_xi_pi_pi::FlagMcMatchRec, @@ -244,12 +238,6 @@ DECLARE_SOA_TABLE(HfCandXicToXiPiPiFulls, "AOD", "HFXICXI2PIFULL", full::ImpactParameterNormalisedPi1, full::MaxNormalisedDeltaIP, // additional columns only stored in the full candidate table - full::XPvErr, - full::YPvErr, - full::ZPvErr, - full::XSvErr, - full::YSvErr, - full::ZSvErr, full::CpaLamToXi, full::CpaXYLamToXi, full::PPi0, @@ -291,6 +279,7 @@ DECLARE_SOA_TABLE(HfCandXicToXiPiPiFullKfs, "AOD", "HFXICXI2PIFULKF", full::PtPi1, full::M, full::InvMassXi, + full::InvMassLambda, full::InvMassXiPi0, full::InvMassXiPi1, full::Chi2Sv, @@ -313,12 +302,6 @@ DECLARE_SOA_TABLE(HfCandXicToXiPiPiFullKfs, "AOD", "HFXICXI2PIFULKF", full::ImpactParameterNormalisedPi1, full::MaxNormalisedDeltaIP, // additional columns only stored in the full candidate table - full::XPvErr, - full::YPvErr, - full::ZPvErr, - full::XSvErr, - full::YSvErr, - full::ZSvErr, full::CpaLamToXi, full::CpaXYLamToXi, full::PPi0, @@ -326,6 +309,13 @@ DECLARE_SOA_TABLE(HfCandXicToXiPiPiFullKfs, "AOD", "HFXICXI2PIFULKF", full::PBachelorPi, full::PPiFromLambda, full::PPrFromLambda, + hf_cand_xic_to_xi_pi_pi::DcaXiDaughters, + hf_cand_xic_to_xi_pi_pi::DcaV0Daughters, + hf_cand_xic_to_xi_pi_pi::DcaPosToPV, + hf_cand_xic_to_xi_pi_pi::DcaNegToPV, + hf_cand_xic_to_xi_pi_pi::DcaBachelorToPV, + hf_cand_xic_to_xi_pi_pi::DcaXYCascToPV, + hf_cand_xic_to_xi_pi_pi::DcaZCascToPV, hf_cand_xic_to_xi_pi_pi::NSigTpcPiFromXicPlus0, hf_cand_xic_to_xi_pi_pi::NSigTpcPiFromXicPlus1, hf_cand_xic_to_xi_pi_pi::NSigTpcBachelorPi, @@ -348,8 +338,7 @@ DECLARE_SOA_TABLE(HfCandXicToXiPiPiFullKfs, "AOD", "HFXICXI2PIFULKF", full::DcaXYPi1Xi, full::DcaPi0Pi1, full::DcaPi0Xi, - full::DcaPi1Xi, - full::DcaXiDaughters); + full::DcaPi1Xi); DECLARE_SOA_TABLE(HfCandXicToXiPiPiFullPs, "AOD", "HFXICXI2PIFULLP", hf_cand_xic_to_xi_pi_pi::FlagMcMatchGen, @@ -503,12 +492,6 @@ struct HfTreeCreatorXicToXiPiPi { candidate.impactParameterNormalised2(), candidate.maxNormalisedDeltaIP(), // additional columns only stored in the full candidate table - candidate.xPvErr(), - candidate.yPvErr(), - candidate.zPvErr(), - candidate.xSvErr(), - candidate.ySvErr(), - candidate.zSvErr(), candidate.cosPaLambdaToXi(), candidate.cosPaXYLambdaToXi(), candidate.pProng1(), @@ -552,6 +535,7 @@ struct HfTreeCreatorXicToXiPiPi { candidate.ptProng2(), candidate.invMassXicPlus(), candidate.invMassXi(), + candidate.invMassLambda(), candidate.invMassXiPi0(), candidate.invMassXiPi1(), candidate.chi2PCA(), @@ -585,8 +569,7 @@ struct HfTreeCreatorXicToXiPiPi { candidate.dcaXYPi1Xi(), candidate.dcaPi0Pi1(), candidate.dcaPi0Xi(), - candidate.dcaPi1Xi(), - candidate.dcacascdaughters()); + candidate.dcaPi1Xi()); } else { rowCandidateFullKf( flagMc, @@ -604,6 +587,7 @@ struct HfTreeCreatorXicToXiPiPi { candidate.ptProng2(), candidate.invMassXicPlus(), candidate.invMassXi(), + candidate.invMassLambda(), candidate.invMassXiPi0(), candidate.invMassXiPi1(), candidate.chi2PCA(), @@ -626,12 +610,6 @@ struct HfTreeCreatorXicToXiPiPi { candidate.impactParameterNormalised2(), candidate.maxNormalisedDeltaIP(), // additional columns only stored in the full candidate table - candidate.xPvErr(), - candidate.yPvErr(), - candidate.zPvErr(), - candidate.xSvErr(), - candidate.ySvErr(), - candidate.zSvErr(), candidate.cosPaLambdaToXi(), candidate.cosPaXYLambdaToXi(), candidate.pProng1(), @@ -639,6 +617,13 @@ struct HfTreeCreatorXicToXiPiPi { candidate.pBachelorPi(), candidate.pPiFromLambda(), candidate.pPrFromLambda(), + candidate.dcaXiDaughters(), + candidate.dcaV0Daughters(), + candidate.dcaPosToPV(), + candidate.dcaNegToPV(), + candidate.dcaBachelorToPV(), + candidate.dcaXYCascToPV(), + candidate.dcaZCascToPV(), candidate.nSigTpcPiFromXicPlus0(), candidate.nSigTpcPiFromXicPlus1(), candidate.nSigTpcBachelorPi(), @@ -661,8 +646,7 @@ struct HfTreeCreatorXicToXiPiPi { candidate.dcaXYPi1Xi(), candidate.dcaPi0Pi1(), candidate.dcaPi0Xi(), - candidate.dcaPi1Xi(), - candidate.dcacascdaughters()); + candidate.dcaPi1Xi()); } } } From ba81bba3ccac06aa3e835c102c6fc6ef44621522 Mon Sep 17 00:00:00 2001 From: Junlee Kim Date: Tue, 25 Feb 2025 09:12:40 +0100 Subject: [PATCH 0408/1650] [PWGLF] add lower cumulants (#10167) Co-authored-by: ALICE Action Bot --- .../Tasks/Strangeness/lambdapolarization.cxx | 96 ++++++++++++++++--- 1 file changed, 81 insertions(+), 15 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdapolarization.cxx b/PWGLF/Tasks/Strangeness/lambdapolarization.cxx index a22630d3b1c..aae80763817 100644 --- a/PWGLF/Tasks/Strangeness/lambdapolarization.cxx +++ b/PWGLF/Tasks/Strangeness/lambdapolarization.cxx @@ -138,7 +138,8 @@ struct lambdapolarization { Configurable cfgAccCor{"cfgAccCor", false, "flag to apply acceptance correction"}; Configurable cfgAccCorPath{"cfgAccCorPath", "", "path for pseudo acceptance correction"}; - Configurable cfgCalcCum{"cfgCalcCum", false, "flag to calculate cumulants"}; + Configurable cfgCalcCum{"cfgCalcCum", false, "flag to calculate cumulants of cossin"}; + Configurable cfgCalcCum1{"cfgCalcCum1", false, "flag to calculate cumulants of coscos"}; Configurable cfgRapidityDep{"cfgRapidityDep", false, "flag for rapidity dependent study"}; Configurable cfgAccAzimuth{"cfgAccAzimuth", false, "flag for azimuth closure study"}; @@ -284,6 +285,38 @@ struct lambdapolarization { histos.add("psi2/QA/sinPhi_cosPsi_al", "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); } + if (cfgCalcCum1) { + histos.add("psi2/QA/cosTheta_l", "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); + histos.add("psi2/QA/cosPsi_l", "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); + histos.add("psi2/QA/cosPhi_l", "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); + + histos.add("psi2/QA/cosPhi_cosPsi_l", "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); + histos.add("psi2/QA/cosTheta_cosPhi_l", "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); + histos.add("psi2/QA/cosTheta_cosPsi_l", "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); + + histos.add("psi2/QA/sinPhi_sinPsi_l", "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); + histos.add("psi2/QA/cosTheta_sinPhi_l", "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); + histos.add("psi2/QA/cosTheta_sinPsi_l", "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); + + histos.add("psi2/QA/sinPsi_l", "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); + histos.add("psi2/QA/sinPhi_l", "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); + + histos.add("psi2/QA/cosTheta_al", "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); + histos.add("psi2/QA/cosPsi_al", "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); + histos.add("psi2/QA/cosPhi_al", "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); + + histos.add("psi2/QA/cosPhi_cosPsi_al", "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); + histos.add("psi2/QA/cosTheta_cosPhi_al", "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); + histos.add("psi2/QA/cosTheta_cosPsi_al", "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); + + histos.add("psi2/QA/sinPhi_sinPsi_al", "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); + histos.add("psi2/QA/cosTheta_sinPhi_al", "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); + histos.add("psi2/QA/cosTheta_sinPsi_al", "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); + + histos.add("psi2/QA/sinPsi_al", "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); + histos.add("psi2/QA/sinPhi_al", "", {HistType::kTHnSparseF, {massAxis, ptAxis, cosAxis, centAxis}}); + } + if (cfgQAv0) { histos.add("QA/CentDist", "", {HistType::kTH1F, {centQaAxis}}); histos.add("QA/PVzDist", "", {HistType::kTH1F, {PVzQaAxis}}); @@ -666,9 +699,9 @@ struct lambdapolarization { auto deltapsiFT0A = 0.0; auto deltapsiFV0A = 0.0; - auto psidefFT0C = TMath::ATan2(collision.qvecIm()[3 + (nmode - 2) * 28], collision.qvecRe()[3 + (nmode - 2) * 28]) / static_cast(nmode); - auto psidefFT0A = TMath::ATan2(collision.qvecIm()[3 + 4 + (nmode - 2) * 28], collision.qvecRe()[3 + 4 + (nmode - 2) * 28]) / static_cast(nmode); - auto psidefFV0A = TMath::ATan2(collision.qvecIm()[3 + 12 + (nmode - 2) * 28], collision.qvecRe()[3 + 12 + (nmode - 2) * 28]) / static_cast(nmode); + auto psidefFT0C = TMath::ATan2(collision.qvecIm()[QvecDetInd], collision.qvecRe()[QvecDetInd]) / static_cast(nmode); + auto psidefFT0A = TMath::ATan2(collision.qvecIm()[QvecRefAInd], collision.qvecRe()[QvecRefAInd]) / static_cast(nmode); + auto psidefFV0A = TMath::ATan2(collision.qvecIm()[QvecRefBInd], collision.qvecRe()[QvecRefBInd]) / static_cast(nmode); for (int ishift = 1; ishift <= 10; ishift++) { auto coeffshiftxFT0C = shiftprofile.at(nmode - 2)->GetBinContent(shiftprofile.at(nmode - 2)->FindBin(centrality, 0.5, ishift - 0.5)); auto coeffshiftyFT0C = shiftprofile.at(nmode - 2)->GetBinContent(shiftprofile.at(nmode - 2)->FindBin(centrality, 1.5, ishift - 0.5)); @@ -681,6 +714,7 @@ struct lambdapolarization { deltapsiFT0A += ((1 / (1.0 * ishift)) * (-coeffshiftxFT0A * TMath::Cos(ishift * static_cast(nmode) * psidefFT0A) + coeffshiftyFT0A * TMath::Sin(ishift * static_cast(nmode) * psidefFT0A))); deltapsiFV0A += ((1 / (1.0 * ishift)) * (-coeffshiftxFV0A * TMath::Cos(ishift * static_cast(nmode) * psidefFV0A) + coeffshiftyFV0A * TMath::Sin(ishift * static_cast(nmode) * psidefFV0A))); } + psi += deltapsiFT0C; relphi = TVector2::Phi_0_2pi(static_cast(nmode) * (LambdaVec.Phi() - psidefFT0C - deltapsiFT0C)); } @@ -743,6 +777,22 @@ struct lambdapolarization { histos.fill(HIST("psi2/QA/cosPhi_sinPsi_l"), v0.mLambda(), v0.pt(), TMath::Cos(v0.phi() * 2.0) * TMath::Sin(psi * 2.0), centrality); histos.fill(HIST("psi2/QA/sinPhi_cosPsi_l"), v0.mLambda(), v0.pt(), TMath::Sin(v0.phi() * 2.0) * TMath::Cos(psi * 2.0), centrality); } + if (cfgCalcCum1) { + histos.fill(HIST("psi2/QA/cosTheta_l"), v0.mLambda(), v0.pt(), angle, centrality); + histos.fill(HIST("psi2/QA/cosPsi_l"), v0.mLambda(), v0.pt(), TMath::Cos(psi * 2.0), centrality); + histos.fill(HIST("psi2/QA/cosPhi_l"), v0.mLambda(), v0.pt(), TMath::Cos(v0.phi() * 2.0), centrality); + + histos.fill(HIST("psi2/QA/cosPhi_cosPsi_l"), v0.mLambda(), v0.pt(), TMath::Cos(v0.phi() * 2.0) * TMath::Cos(psi * 2.0), centrality); + histos.fill(HIST("psi2/QA/cosTheta_cosPhi_l"), v0.mLambda(), v0.pt(), angle * TMath::Cos(v0.phi() * 2.0), centrality); + histos.fill(HIST("psi2/QA/cosTheta_cosPsi_l"), v0.mLambda(), v0.pt(), angle * TMath::Cos(psi * 2.0), centrality); + + histos.fill(HIST("psi2/QA/sinPhi_sinPsi_l"), v0.mLambda(), v0.pt(), TMath::Sin(v0.phi() * 2.0) * TMath::Sin(psi * 2.0), centrality); + histos.fill(HIST("psi2/QA/cosTheta_sinPhi_l"), v0.mLambda(), v0.pt(), angle * TMath::Sin(v0.phi() * 2.0), centrality); + histos.fill(HIST("psi2/QA/cosTheta_sinPsi_l"), v0.mLambda(), v0.pt(), angle * TMath::Sin(psi * 2.0), centrality); + + histos.fill(HIST("psi2/QA/sinPsi_l"), v0.mLambda(), v0.pt(), TMath::Sin(psi * 2.0), centrality); + histos.fill(HIST("psi2/QA/sinPhi_l"), v0.mLambda(), v0.pt(), TMath::Sin(v0.phi() * 2.0), centrality); + } } if (aLambdaTag) { histos.fill(HIST("psi2/h_alambda_cos"), v0.mAntiLambda(), v0.pt(), angle, centrality, relphi, weight); @@ -760,21 +810,37 @@ struct lambdapolarization { } if (cfgCalcCum) { - histos.fill(HIST("psi2/QA/cosTheta_al"), v0.mLambda(), v0.pt(), angle, centrality); - histos.fill(HIST("psi2/QA/cosPsi_al"), v0.mLambda(), v0.pt(), TMath::Cos(psi * 2.0), centrality); - histos.fill(HIST("psi2/QA/cosPhi_al"), v0.mLambda(), v0.pt(), TMath::Cos(v0.phi() * 2.0), centrality); + histos.fill(HIST("psi2/QA/cosTheta_al"), v0.mAntiLambda(), v0.pt(), angle, centrality); + histos.fill(HIST("psi2/QA/cosPsi_al"), v0.mAntiLambda(), v0.pt(), TMath::Cos(psi * 2.0), centrality); + histos.fill(HIST("psi2/QA/cosPhi_al"), v0.mAntiLambda(), v0.pt(), TMath::Cos(v0.phi() * 2.0), centrality); + + histos.fill(HIST("psi2/QA/sinPsi_al"), v0.mAntiLambda(), v0.pt(), TMath::Sin(psi * 2.0), centrality); + histos.fill(HIST("psi2/QA/sinPhi_al"), v0.mAntiLambda(), v0.pt(), TMath::Sin(v0.phi() * 2.0), centrality); + + histos.fill(HIST("psi2/QA/cosTheta_cosPhi_al"), v0.mAntiLambda(), v0.pt(), angle * TMath::Cos(v0.phi() * 2.0), centrality); + histos.fill(HIST("psi2/QA/cosTheta_cosPsi_al"), v0.mAntiLambda(), v0.pt(), angle * TMath::Cos(psi * 2.0), centrality); - histos.fill(HIST("psi2/QA/sinPsi_al"), v0.mLambda(), v0.pt(), TMath::Sin(psi * 2.0), centrality); - histos.fill(HIST("psi2/QA/sinPhi_al"), v0.mLambda(), v0.pt(), TMath::Sin(v0.phi() * 2.0), centrality); + histos.fill(HIST("psi2/QA/cosTheta_sinPhi_al"), v0.mAntiLambda(), v0.pt(), angle * TMath::Sin(v0.phi() * 2.0), centrality); + histos.fill(HIST("psi2/QA/cosTheta_sinPsi_al"), v0.mAntiLambda(), v0.pt(), angle * TMath::Sin(psi * 2.0), centrality); + + histos.fill(HIST("psi2/QA/cosPhi_sinPsi_al"), v0.mAntiLambda(), v0.pt(), TMath::Cos(v0.phi() * 2.0) * TMath::Sin(psi * 2.0), centrality); + histos.fill(HIST("psi2/QA/sinPhi_cosPsi_al"), v0.mAntiLambda(), v0.pt(), TMath::Sin(v0.phi() * 2.0) * TMath::Cos(psi * 2.0), centrality); + } + if (cfgCalcCum1) { + histos.fill(HIST("psi2/QA/cosTheta_al"), v0.mAntiLambda(), v0.pt(), angle, centrality); + histos.fill(HIST("psi2/QA/cosPsi_al"), v0.mAntiLambda(), v0.pt(), TMath::Cos(psi * 2.0), centrality); + histos.fill(HIST("psi2/QA/cosPhi_al"), v0.mAntiLambda(), v0.pt(), TMath::Cos(v0.phi() * 2.0), centrality); - histos.fill(HIST("psi2/QA/cosTheta_cosPhi_al"), v0.mLambda(), v0.pt(), angle * TMath::Cos(v0.phi() * 2.0), centrality); - histos.fill(HIST("psi2/QA/cosTheta_cosPsi_al"), v0.mLambda(), v0.pt(), angle * TMath::Cos(psi * 2.0), centrality); + histos.fill(HIST("psi2/QA/cosPhi_cosPsi_al"), v0.mAntiLambda(), v0.pt(), TMath::Cos(v0.phi() * 2.0) * TMath::Cos(psi * 2.0), centrality); + histos.fill(HIST("psi2/QA/cosTheta_cosPhi_al"), v0.mAntiLambda(), v0.pt(), angle * TMath::Cos(v0.phi() * 2.0), centrality); + histos.fill(HIST("psi2/QA/cosTheta_cosPsi_al"), v0.mAntiLambda(), v0.pt(), angle * TMath::Cos(psi * 2.0), centrality); - histos.fill(HIST("psi2/QA/cosTheta_sinPhi_al"), v0.mLambda(), v0.pt(), angle * TMath::Sin(v0.phi() * 2.0), centrality); - histos.fill(HIST("psi2/QA/cosTheta_sinPsi_al"), v0.mLambda(), v0.pt(), angle * TMath::Sin(psi * 2.0), centrality); + histos.fill(HIST("psi2/QA/sinPhi_sinPsi_al"), v0.mAntiLambda(), v0.pt(), TMath::Sin(v0.phi() * 2.0) * TMath::Sin(psi * 2.0), centrality); + histos.fill(HIST("psi2/QA/cosTheta_sinPhi_al"), v0.mAntiLambda(), v0.pt(), angle * TMath::Sin(v0.phi() * 2.0), centrality); + histos.fill(HIST("psi2/QA/cosTheta_sinPsi_al"), v0.mAntiLambda(), v0.pt(), angle * TMath::Sin(psi * 2.0), centrality); - histos.fill(HIST("psi2/QA/cosPhi_sinPsi_al"), v0.mLambda(), v0.pt(), TMath::Cos(v0.phi() * 2.0) * TMath::Sin(psi * 2.0), centrality); - histos.fill(HIST("psi2/QA/sinPhi_cosPsi_al"), v0.mLambda(), v0.pt(), TMath::Sin(v0.phi() * 2.0) * TMath::Cos(psi * 2.0), centrality); + histos.fill(HIST("psi2/QA/sinPsi_al"), v0.mAntiLambda(), v0.pt(), TMath::Sin(psi * 2.0), centrality); + histos.fill(HIST("psi2/QA/sinPhi_al"), v0.mAntiLambda(), v0.pt(), TMath::Sin(v0.phi() * 2.0), centrality); } } } else if (nmode == 3) { From 386afa822130a53110dca36c1bf528a3b1008d5e Mon Sep 17 00:00:00 2001 From: sawan <124118453+sawankumawat@users.noreply.github.com> Date: Tue, 25 Feb 2025 13:59:58 +0530 Subject: [PATCH 0409/1650] [PWGLF] Modified angular cut (#10172) --- .../Tasks/Resonances/higherMassResonances.cxx | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/PWGLF/Tasks/Resonances/higherMassResonances.cxx b/PWGLF/Tasks/Resonances/higherMassResonances.cxx index 4d042e372bd..4112e41ff2e 100644 --- a/PWGLF/Tasks/Resonances/higherMassResonances.cxx +++ b/PWGLF/Tasks/Resonances/higherMassResonances.cxx @@ -246,7 +246,7 @@ struct HigherMassResonances { rKzeroShort.add("hDCAV0Daughters", "DCA between v0 daughters", {HistType::kTH1F, {{60, -3.0f, 3.0f}}}); rKzeroShort.add("hV0CosPA", "hV0CosPA", {HistType::kTH1F, {{100, 0.96f, 1.1f}}}); rKzeroShort.add("hLT", "hLT", {HistType::kTH1F, {{100, 0.0f, 50.0f}}}); - rKzeroShort.add("angularSeparation", "Angular separation between two K0s", {HistType::kTH1F, {{200, 0.0f, 4.0f}}}); + rKzeroShort.add("angularSeparation", "Angular distribution between two K0s vs pT", {HistType::kTH1F, {{200, 0.0f, 4.0f}}}); // rKzeroShort.add("Mass_lambda", "Mass under lambda hypothesis", kTH1F, {glueballMassAxis}); // rKzeroShort.add("mass_AntiLambda", "Mass under anti-lambda hypothesis", kTH1F, {glueballMassAxis}); // rKzeroShort.add("mass_Gamma", "Mass under Gamma hypothesis", kTH1F, {glueballMassAxis}); @@ -536,16 +536,13 @@ struct HigherMassResonances { template bool applyAngSep(const T1& candidate1, const T2& candidate2) { - double p1, p2, px1, px2, py1, py2, pz1, pz2, angle; - px1 = candidate1.px(); - px2 = candidate2.px(); - py1 = candidate1.py(); - py2 = candidate2.py(); - pz1 = candidate1.pz(); - pz2 = candidate2.pz(); - p1 = candidate1.p(); - p2 = candidate2.p(); - angle = std::acos((px1 * px2 + py1 * py2 + pz1 * pz2) / (p1 * p2)); + double eta1, eta2, phi1, phi2; + eta1 = candidate1.eta(); + eta2 = candidate2.eta(); + phi1 = candidate1.phi(); + phi2 = candidate2.phi(); + + double angle = std::sqrt(std::pow(eta1 - eta2, 2) + std::pow(phi1 - phi2, 2)); rKzeroShort.fill(HIST("angularSeparation"), angle); if (config.applyAngSepCut && angle < config.angSepCut) { return false; From 37955a5147fbe9db1782a712070c9d6bb7dfb20d Mon Sep 17 00:00:00 2001 From: czhang Date: Tue, 25 Feb 2025 10:16:29 +0100 Subject: [PATCH 0410/1650] [PWGDQ] Use finer pT binning in flow analysis (#10151) --- PWGDQ/Core/HistogramsLibrary.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 83b2e2a97d6..7925acff1fb 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -1085,8 +1085,8 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "U2Q2_CentFT0C_ev2", "mass vs. centrality vs. U2Q2_event2", false, 125, 0.0, 5.0, VarManager::kMass, 9, 0.0, 90.0, VarManager::kCentFT0C, 100, -10.0, 10.0, VarManager::kU2Q2Ev2); } if (subGroupStr.Contains("metest")) { - hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V2ME_SP", "Mass_Pt_CentFT0C_V2ME_SP", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV2ME_SP, VarManager::kWV2ME_SP); - hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V2ME_EP", "Mass_Pt_CentFT0C_V2ME_EP", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV2ME_EP, VarManager::kWV2ME_EP); + hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V2ME_SP", "Mass_Pt_CentFT0C_V2ME_SP", true, 250, 0.0, 5.0, VarManager::kMass, 200, 0.0, 20.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV2ME_SP, VarManager::kWV2ME_SP); + hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V2ME_EP", "Mass_Pt_CentFT0C_V2ME_EP", true, 250, 0.0, 5.0, VarManager::kMass, 200, 0.0, 20.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV2ME_EP, VarManager::kWV2ME_EP); } if (subGroupStr.Contains("cumulantme")) { hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_M11REFoverMpME", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 9, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kM11REFoverMpME); @@ -1275,8 +1275,8 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h // hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_V3", "", 6, varV3, bins, minBins, maxBins, 0, -1, kTRUE); // removed temporarily } if (subGroupStr.Contains("flow-ccdb")) { - hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V2SPwR", "Mass_Pt_CentFT0C_V2SPwR", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV2SP, VarManager::kWV2SP); - hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V2EPwR", "Mass_Pt_CentFT0C_V2EPwR", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV2EP, VarManager::kWV2EP); + hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V2SPwR", "Mass_Pt_CentFT0C_V2SPwR", true, 250, 0.0, 5.0, VarManager::kMass, 200, 0.0, 20.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV2SP, VarManager::kWV2SP); + hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V2EPwR", "Mass_Pt_CentFT0C_V2EPwR", true, 250, 0.0, 5.0, VarManager::kMass, 200, 0.0, 20.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV2EP, VarManager::kWV2EP); } if (subGroupStr.Contains("cumulant")) { int var[4] = {VarManager::kMass, VarManager::kPt, VarManager::kRap, VarManager::kCentFT0C}; From 0398a6cda3d71dfa0c73d7307f0ec6e8dea8cb09 Mon Sep 17 00:00:00 2001 From: sgaretti <129837066+sgaretti@users.noreply.github.com> Date: Tue, 25 Feb 2025 10:43:39 +0100 Subject: [PATCH 0411/1650] [PWGDQ] Mass range changed in dimuon-rap (#10176) --- PWGDQ/Core/HistogramsLibrary.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 7925acff1fb..f076fdfda87 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -1138,9 +1138,9 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h } if (subGroupStr.Contains("dimuon-rap")) { int vars[4] = {VarManager::kMass, VarManager::kPt, VarManager::kCentFT0C, VarManager::kRap}; - int binspT[4] = {150, 200, 10, 6}; + int binspT[4] = {300, 200, 10, 6}; double xminpT[4] = {2., 0., 0, 2.5}; - double xmaxpT[4] = {5., 20., 100, 4.0}; + double xmaxpT[4] = {8., 20., 100, 4.0}; hm->AddHistogram(histClass, "Mass_Pt_Cent_Rap", "", 4, vars, binspT, xminpT, xmaxpT, 0, -1, kFALSE); } if (subGroupStr.Contains("dimuon-polarization-he-pbpb")) { From 6bb7cfdb352f2d1d2f3dbfaafad872c9a5e4d2c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Tue, 25 Feb 2025 13:19:21 +0100 Subject: [PATCH 0412/1650] [PWGHF] Fix type of DstarToPiKPiBkg in data model (#10180) --- PWGHF/DataModel/CandidateReconstructionTables.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGHF/DataModel/CandidateReconstructionTables.h b/PWGHF/DataModel/CandidateReconstructionTables.h index e104da7f634..455f695ed94 100644 --- a/PWGHF/DataModel/CandidateReconstructionTables.h +++ b/PWGHF/DataModel/CandidateReconstructionTables.h @@ -949,7 +949,7 @@ enum DecayType { DplusToPiKPi = 0, XicToPKPi, N3ProngDecays }; // always keep N3ProngDecays at the end -static const int DstarToPiKPiBkg = DecayType::N3ProngDecays; +static constexpr int DstarToPiKPiBkg = DecayType::N3ProngDecays; // Ds± → K± K∓ π± or D± → K± K∓ π± From ca31b2e7d5a7f08a5241dc84ab24f9d882799785 Mon Sep 17 00:00:00 2001 From: Stefano Cannito <143754257+scannito@users.noreply.github.com> Date: Tue, 25 Feb 2025 13:21:02 +0100 Subject: [PATCH 0413/1650] [PWGLF] More protections for getPhiPurity function calling (#10183) --- .../Tasks/Strangeness/phik0shortanalysis.cxx | 78 +++++++++++++------ 1 file changed, 56 insertions(+), 22 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx index b2d2edc682c..9279d486718 100644 --- a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx @@ -111,6 +111,7 @@ struct Phik0shortanalysis { // Configurables on phi pT bins Configurable> binspTPhi{"binspTPhi", {0.4, 0.8, 1.4, 2.0, 2.8, 4.0, 6.0, 10.0}, "pT bin limits for Phi"}; Configurable minPhiPt{"minPhiPt", 0.4f, "Minimum pT for Phi"}; + Configurable maxPhiPt{"maxPhiPt", 10.0f, "Maximum pT for Phi"}; // Configurables on phi mass Configurable nBinsMPhi{"nBinsMPhi", 13, "N bins in cfgmassPhiaxis"}; @@ -139,7 +140,7 @@ struct Phik0shortanalysis { Configurable upMK0S{"upMK0S", 0.52f, "Upper limit on K0Short mass"}; // Configurable on K0S pT bins - Configurable> binspTK0S{"binspTK0S", {0.1, 0.8, 1.2, 1.6, 2.0, 2.5, 3.0, 4.0, 6.0}, "pT bin limits for K0S"}; + Configurable> binspTK0S{"binspTK0S", {0.1, 0.5, 0.8, 1.2, 1.6, 2.0, 2.5, 3.0, 4.0, 6.0}, "pT bin limits for K0S"}; // Configurable on pion pT bins Configurable> binspTPi{"binspTPi", {0.3, 0.4, 0.5, 0.6, 0.8, 1.0, 1.2, 1.5, 2.0, 3.0}, "pT bin limits for pions"}; @@ -740,16 +741,27 @@ struct Phik0shortanalysis { // Get the phi purity choosing the correct purity function according to the multiplicity and pt of the phi double getPhiPurity(float multiplicity, const ROOT::Math::PxPyPzMVector& Phi) { - // Find multiplicity bin using lower_bound - auto multIt = std::lower_bound(binsMult->begin(), binsMult->end(), multiplicity); - auto multIdx = multIt != binsMult->end() ? std::distance(binsMult->begin(), multIt) - 1 : -1; + // Check if multiplicity is out of range + if (multiplicity < binsMult->front() || multiplicity >= binsMult->back()) { + LOG(info) << "Multiplicity out of range: " << multiplicity; + return 0; + } + + // Find the multiplicity bin using upper_bound which finds the first element strictly greater than 'multiplicity' + // Subtract 1 to get the correct bin index + auto multIt = std::upper_bound(binsMult->begin(), binsMult->end(), multiplicity); + int multIdx = std::distance(binsMult->begin(), multIt) - 1; - // Find phi-pT bin using lower_bound - auto pTIt = std::lower_bound(binspTPhi->begin(), binspTPhi->end(), Phi.Pt()); - auto pTIdx = pTIt != binspTPhi->end() ? std::distance(binspTPhi->begin(), pTIt) - 1 : -1; + // Check if pT is out of range + if (Phi.Pt() < binspTPhi->front() || Phi.Pt() >= binspTPhi->back()) { + LOG(info) << "pT out of range: " << Phi.Pt(); + return 0; + } - if (multIdx == -1 || pTIdx == -1) - LOG(fatal) << "Problem computing phi purity!"; + // Find the pT bin using upper_bound + // The logic is the same as for multiplicity + auto pTIt = std::upper_bound(binspTPhi->begin(), binspTPhi->end(), Phi.Pt()); + int pTIdx = std::distance(binspTPhi->begin(), pTIt) - 1; return phiPurityFunctions[multIdx][pTIdx]->Eval(Phi.M()); } @@ -854,6 +866,8 @@ struct Phik0shortanalysis { bool isCountedPhi = false; bool isFilledhV0 = false; + double weight{1.0}; + // Loop over all positive tracks for (const auto& track1 : posThisColl) { if (!selectionTrackResonance(track1, true) || !selectionPIDKaonpTdependent(track1)) @@ -875,7 +889,7 @@ struct Phik0shortanalysis { continue; // condition to avoid double counting of pair ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa); - if (recPhi.Pt() < minPhiPt) + if (recPhi.Pt() < minPhiPt || recPhi.Pt() > maxPhiPt) continue; if (std::abs(recPhi.Rapidity()) > cfgYAcceptance) continue; @@ -886,6 +900,9 @@ struct Phik0shortanalysis { isCountedPhi = true; } + if (fillMethodSingleWeight) + weight *= (1 - getPhiPurity(multiplicity, recPhi)); + dataPhiHist.fill(HIST("h3PhipurInvMass"), multiplicity, recPhi.Pt(), recPhi.M()); std::array isCountedK0S{false, false, false}; @@ -962,6 +979,9 @@ struct Phik0shortanalysis { } } } + + weight = 1 - weight; + dataEventHist.fill(HIST("hEventSelection"), 5, weight); // at least a Phi in the event } PROCESS_SWITCH(Phik0shortanalysis, processQAPurity, "Process for QA and Phi Purities", true); @@ -1016,7 +1036,7 @@ struct Phik0shortanalysis { continue; // condition to avoid double counting of pair ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa); - if (recPhi.Pt() < minPhiPt) + if (recPhi.Pt() < minPhiPt || recPhi.Pt() > maxPhiPt) continue; if (recPhi.M() < lowMPhi || recPhi.M() > upMPhi) continue; @@ -1105,7 +1125,7 @@ struct Phik0shortanalysis { continue; // condition to avoid double counting of pair ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa); - if (recPhi.Pt() < minPhiPt) + if (recPhi.Pt() < minPhiPt || recPhi.Pt() > maxPhiPt) continue; if (recPhi.M() < lowMPhi || recPhi.M() > upMPhi) continue; @@ -1213,7 +1233,7 @@ struct Phik0shortanalysis { continue; ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa); - if (recPhi.Pt() < minPhiPt) + if (recPhi.Pt() < minPhiPt || recPhi.Pt() > maxPhiPt) continue; mcPhiHist.fill(HIST("h3PhiRapiditySmearing"), genmultiplicity, recPhi.Rapidity(), mcMotherPhi.y()); @@ -1355,7 +1375,9 @@ struct Phik0shortanalysis { for (const auto& mcParticle : mcParticlesThisColl) { if (mcParticle.pdgCode() != 333) continue; - if (std::abs(mcParticle.y()) > cfgYAcceptance || mcParticle.pt() < minPhiPt) + if (mcParticle.pt() < minPhiPt || mcParticle.pt() > maxPhiPt) + continue; + if (std::abs(mcParticle.y()) > cfgYAcceptance) continue; if (!isCountedMCPhi.at(0)) { @@ -1436,7 +1458,9 @@ struct Phik0shortanalysis { for (const auto& mcParticle : mcParticlesThisColl) { if (mcParticle.pdgCode() != 333) continue; - if (std::abs(mcParticle.y()) > cfgYAcceptance || mcParticle.pt() < minPhiPt) + if (mcParticle.pt() < minPhiPt || mcParticle.pt() > maxPhiPt) + continue; + if (std::abs(mcParticle.y()) > cfgYAcceptance) continue; if (!isCountedMCPhi.at(0)) { @@ -1467,7 +1491,9 @@ struct Phik0shortanalysis { for (const auto& mcParticle : mcParticlesThisColl) { if (mcParticle.pdgCode() != 333) continue; - if (std::abs(mcParticle.y()) > cfgYAcceptance || mcParticle.pt() < minPhiPt) + if (mcParticle.pt() < minPhiPt || mcParticle.pt() > maxPhiPt) + continue; + if (std::abs(mcParticle.y()) > cfgYAcceptance) continue; if (!isCountedMCPhi.at(0)) { @@ -1512,6 +1538,8 @@ struct Phik0shortanalysis { bool isCountedPhi = false; + double weight{1.0}; + // Loop over all positive tracks for (const auto& track1 : posThisColl) { if (!selectionTrackResonance(track1, true) || !selectionPIDKaonpTdependent(track1)) @@ -1529,17 +1557,20 @@ struct Phik0shortanalysis { continue; // condition to avoid double counting of pair ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa); - if (recPhi.Pt() < minPhiPt) + if (recPhi.Pt() < minPhiPt || recPhi.Pt() > maxPhiPt) continue; if (std::abs(recPhi.Rapidity()) > cfgYAcceptance) continue; if (!isCountedPhi) { - mcEventHist.fill(HIST("hRecMCEventSelection"), 7); // at least a Phi in the event + mcEventHist.fill(HIST("hRecMCEventSelection"), 7); // at least a Phi candidate in the event mcEventHist.fill(HIST("hRecMCGenMultiplicityPercentWithPhi"), genmultiplicity); isCountedPhi = true; } + if (fillMethodSingleWeight) + weight *= (1 - getPhiPurity(genmultiplicity, recPhi)); + closureMCPhiHist.fill(HIST("h3MCPhipurInvMass"), genmultiplicity, recPhi.Pt(), recPhi.M()); std::array isCountedK0S{false, false, false}; @@ -1620,6 +1651,9 @@ struct Phik0shortanalysis { } } } + + weight = 1 - weight; + mcEventHist.fill(HIST("hRecMCEventSelection"), 8, weight); // at least a Phi in the event } PROCESS_SWITCH(Phik0shortanalysis, processRecMCClosurePhiQA, "Process for ReCMCQA and Phi in RecMCClosure", false); @@ -1709,7 +1743,7 @@ struct Phik0shortanalysis { } ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa); - if (recPhi.Pt() < minPhiPt) + if (recPhi.Pt() < minPhiPt || recPhi.Pt() > maxPhiPt) continue; if (recPhi.M() < lowMPhi || recPhi.M() > upMPhi) continue; @@ -1833,7 +1867,7 @@ struct Phik0shortanalysis { } ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa); - if (recPhi.Pt() < minPhiPt) + if (recPhi.Pt() < minPhiPt || recPhi.Pt() > maxPhiPt) continue; if (recPhi.M() < lowMPhi || recPhi.M() > upMPhi) continue; @@ -2053,7 +2087,7 @@ struct Phik0shortanalysis { if (!isPosKaon || !isNegKaon) continue; } - if (mcParticle2.pt() < minPhiPt) + if (mcParticle2.pt() < minPhiPt || mcParticle2.pt() > maxPhiPt) continue; if (std::abs(mcParticle2.y()) > cfgYAcceptance) @@ -2138,7 +2172,7 @@ struct Phik0shortanalysis { if (!isPosKaon || !isNegKaon) continue; } - if (mcParticle2.pt() < minPhiPt) + if (mcParticle2.pt() < minPhiPt || mcParticle2.pt() > maxPhiPt) continue; if (std::abs(mcParticle2.y()) > cfgYAcceptance) From bea5f7ec3e0952d1263a1464c48897c069c3483b Mon Sep 17 00:00:00 2001 From: navneetkumar231295 <71565461+navneetkumar231295@users.noreply.github.com> Date: Tue, 25 Feb 2025 18:21:02 +0530 Subject: [PATCH 0414/1650] [PWGLF] To solve the empty histogram error (#10181) Co-authored-by: Navneet --- PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx b/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx index d8820fff52a..b82e58f3a66 100644 --- a/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx +++ b/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx @@ -246,8 +246,8 @@ struct chargedkstaranalysis { // TPC PID (before cuts) histos1.fill(HIST("QAbefore/tpcNsigmaPionQA"), trackptPi, trkNSigmaPiTPC); if (istrkhasTOF) { - histos1.fill(HIST("QA/before/trkpionTOFPID"), trackptPi, trkNSigmaPiTOF); - histos1.fill(HIST("QA/before/trkpionTPCTOFPID"), trkNSigmaPiTPC, trkNSigmaPiTOF); + histos1.fill(HIST("QAbefore/trkpionTOFPID"), trackptPi, trkNSigmaPiTOF); + histos1.fill(HIST("QAbefore/trkpionTPCTOFPID"), trkNSigmaPiTPC, trkNSigmaPiTOF); } // DCA QA (before cuts) histos1.fill(HIST("QAbefore/DCAxy_pi"), track.dcaXY()); From 04e3d03a9df9a8d9aa6a9837f199ea4822a2e3c0 Mon Sep 17 00:00:00 2001 From: lucamicheletti93 <38209984+lucamicheletti93@users.noreply.github.com> Date: Tue, 25 Feb 2025 14:19:40 +0100 Subject: [PATCH 0415/1650] [PWGDQ] Adding minitree to esimate offline Axe (#10170) Co-authored-by: Lucamicheletti93 --- PWGDQ/DataModel/ReducedInfoTables.h | 18 +++++++++- PWGDQ/Tasks/dqEfficiency_withAssoc.cxx | 47 ++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/PWGDQ/DataModel/ReducedInfoTables.h b/PWGDQ/DataModel/ReducedInfoTables.h index 31bf8bc39e1..40352fd1588 100644 --- a/PWGDQ/DataModel/ReducedInfoTables.h +++ b/PWGDQ/DataModel/ReducedInfoTables.h @@ -848,7 +848,21 @@ DECLARE_SOA_TABLE(DimuonsAll, "AOD", "RTDIMUONALL", //! reducedpair::SVertex); DECLARE_SOA_TABLE(DileptonsMiniTree, "AOD", "RTDILEPTMTREE", //! - reducedpair::Mass, reducedpair::Pt, reducedpair::Eta, reducedpair::CentFT0C, reducedpair::Cos2DeltaPhi, dilepton_track_index::Pt1, dilepton_track_index::Eta1, dilepton_track_index::Phi1, dilepton_track_index::Pt2, dilepton_track_index::Eta2, dilepton_track_index::Phi2); + reducedpair::Mass, reducedpair::Pt, reducedpair::Eta, reducedpair::CentFT0C, reducedpair::Cos2DeltaPhi, + dilepton_track_index::Pt1, dilepton_track_index::Eta1, dilepton_track_index::Phi1, + dilepton_track_index::Pt2, dilepton_track_index::Eta2, dilepton_track_index::Phi2); + +DECLARE_SOA_TABLE(DileptonsMiniTreeGen, "AOD", "RTDILMTREEGEN", //! + reducedpair::McDecision, mccollision::ImpactParameter, + dilepton_track_index::PtMC1, dilepton_track_index::EtaMC1, dilepton_track_index::PhiMC1, + dilepton_track_index::PtMC2, dilepton_track_index::EtaMC2, dilepton_track_index::PhiMC2); + +DECLARE_SOA_TABLE(DileptonsMiniTreeRec, "AOD", "RTDILMTREEREC", //! + reducedpair::McDecision, reducedpair::Mass, reducedpair::Pt, reducedpair::Eta, reducedpair::Phi, reducedpair::CentFT0C, + dilepton_track_index::PtMC1, dilepton_track_index::EtaMC1, dilepton_track_index::PhiMC1, + dilepton_track_index::PtMC2, dilepton_track_index::EtaMC2, dilepton_track_index::PhiMC2, + dilepton_track_index::Pt1, dilepton_track_index::Eta1, dilepton_track_index::Phi1, + dilepton_track_index::Pt2, dilepton_track_index::Eta2, dilepton_track_index::Phi2); using Dielectron = Dielectrons::iterator; using StoredDielectron = StoredDielectrons::iterator; @@ -861,6 +875,8 @@ using DileptonInfo = DileptonsInfo::iterator; using DielectronAll = DielectronsAll::iterator; using DimuonAll = DimuonsAll::iterator; using DileptonMiniTree = DileptonsMiniTree::iterator; +using DileptonMiniTreeGen = DileptonsMiniTreeGen::iterator; +using DileptonMiniTreeRec = DileptonsMiniTreeRec::iterator; // Tables for using analysis-dilepton-track with analysis-asymmetric-pairing DECLARE_SOA_TABLE(Ditracks, "AOD", "RTDITRACK", //! diff --git a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx index cf87365c6c8..a1834f5b58c 100644 --- a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx +++ b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx @@ -1199,6 +1199,8 @@ struct AnalysisSameEventPairing { Produces dielectronInfoList; Produces dimuonsExtraList; Produces dimuonAllList; + Produces dileptonMiniTreeGen; + Produces dileptonMiniTreeRec; Produces dileptonInfoList; Produces PromptNonPromptSepTable; @@ -1247,6 +1249,12 @@ struct AnalysisSameEventPairing { Configurable runMCGenPair{"cfgRunMCGenPair", false, "Do pairing of true MC particles"}; } fConfigMC; + struct : ConfigurableGroup { + Configurable fConfigMiniTree{"useMiniTree.cfgMiniTree", false, "Produce a single flat table with minimal information for analysis"}; + Configurable fConfigMiniTreeMinMass{"useMiniTree.cfgMiniTreeMinMass", 2, "Min. mass cut for minitree"}; + Configurable fConfigMiniTreeMaxMass{"useMiniTree.cfgMiniTreeMaxMass", 5, "Max. mass cut for minitree"}; + } useMiniTree; + // Track related options Configurable fPropTrack{"cfgPropTrack", true, "Propgate tracks to associated collision to recalculate DCA and momentum vector"}; @@ -1648,6 +1656,10 @@ struct AnalysisSameEventPairing { if (fConfigOptions.flatTables.value) { dimuonAllList.reserve(1); } + if (useMiniTree.fConfigMiniTree) { + dileptonMiniTreeGen.reserve(1); + dileptonMiniTreeRec.reserve(1); + } constexpr bool eventHasQvector = ((TEventFillMap & VarManager::ObjTypes::ReducedEventQvector) > 0); constexpr bool trackHasCov = ((TTrackFillMap & VarManager::ObjTypes::ReducedTrackBarrelCov) > 0); @@ -1847,6 +1859,27 @@ struct AnalysisSameEventPairing { if (mcDecision & (static_cast(1) << isig)) { PromptNonPromptSepTable(VarManager::fgValues[VarManager::kMass], VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kVertexingTauxyProjected], VarManager::fgValues[VarManager::kVertexingTauxyProjectedPoleJPsiMass], VarManager::fgValues[VarManager::kVertexingTauzProjected], isAmbiInBunch, isAmbiOutOfBunch, isCorrect_pair); fHistMan->FillHistClass(histNamesMC[icut * fRecMCSignals.size() + isig][0].Data(), VarManager::fgValues); // matched signal + if (useMiniTree.fConfigMiniTree) { + if constexpr (TPairType == VarManager::kDecayToMuMu) { + twoTrackFilter = a1.isMuonSelected_raw() & a2.isMuonSelected_raw() & fMuonFilterMask; + if (!twoTrackFilter) { // the tracks must have at least one filter bit in common to continue + continue; + } + auto t1 = a1.template reducedmuon_as(); + auto t2 = a2.template reducedmuon_as(); + + float dileptonMass = VarManager::fgValues[VarManager::kMass]; + if (dileptonMass > useMiniTree.fConfigMiniTreeMinMass && dileptonMass < useMiniTree.fConfigMiniTreeMaxMass) { + dileptonMiniTreeRec(mcDecision, + VarManager::fgValues[VarManager::kMass], + VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kEta], VarManager::fgValues[VarManager::kPhi], VarManager::fgValues[VarManager::kCentFT0C], + t1.reducedMCTrack().pt(), t1.reducedMCTrack().eta(), t1.reducedMCTrack().phi(), + t2.reducedMCTrack().pt(), t2.reducedMCTrack().eta(), t2.reducedMCTrack().phi(), + VarManager::fgValues[VarManager::kPt1], VarManager::fgValues[VarManager::kEta1], VarManager::fgValues[VarManager::kPhi1], + VarManager::fgValues[VarManager::kPt2], VarManager::fgValues[VarManager::kEta2], VarManager::fgValues[VarManager::kPhi2]); + } + } + } if (fConfigQA) { if (isCorrectAssoc_leg1 && isCorrectAssoc_leg2) { // correct track-collision association fHistMan->FillHistClass(histNamesMC[icut * fRecMCSignals.size() + isig][3].Data(), VarManager::fgValues); @@ -1941,6 +1974,8 @@ struct AnalysisSameEventPairing { // loop over mc stack and fill histograms for pure MC truth signals // group all the MC tracks which belong to the MC event corresponding to the current reconstructed event // auto groupedMCTracks = tracksMC.sliceBy(aod::reducedtrackMC::reducedMCeventId, event.reducedMCevent().globalIndex()); + uint32_t mcDecision = 0; + int isig = 0; for (auto& mctrack : mcTracks) { VarManager::FillTrackMC(mcTracks, mctrack); // NOTE: Signals are checked here mostly based on the skimmed MC stack, so depending on the requested signal, the stack could be incomplete. @@ -1958,9 +1993,15 @@ struct AnalysisSameEventPairing { checked = sig->CheckSignal(true, mctrack); //} if (checked) { + mcDecision |= (static_cast(1) << isig); fHistMan->FillHistClass(Form("MCTruthGen_%s", sig->GetName()), VarManager::fgValues); + if (useMiniTree.fConfigMiniTree) { + auto mcEvent = mcEvents.rawIteratorAt(mctrack.reducedMCeventId()); + dileptonMiniTreeGen(mcDecision, mcEvent.impactParameter(), mctrack.pt(), mctrack.eta(), mctrack.phi(), -999, -999, -999); + } } } + isig++; } if (fHasTwoProngGenMCsignals) { @@ -1975,9 +2016,15 @@ struct AnalysisSameEventPairing { continue; } if (sig->CheckSignal(true, t1_raw, t2_raw)) { + mcDecision |= (static_cast(1) << isig); VarManager::FillPairMC(t1, t2); fHistMan->FillHistClass(Form("MCTruthGenPair_%s", sig->GetName()), VarManager::fgValues); + if (useMiniTree.fConfigMiniTree) { + // WARNING! To be checked + dileptonMiniTreeGen(mcDecision, event.impactParameter(), t1.pt(), t1.eta(), t1.phi(), t2.pt(), t2.eta(), t2.phi()); + } } + isig++; } // end loop over MC signals } // end loop over pairs } // end loop over events From a14983b1c711aeadab298843cbbcdff6ed36fc78 Mon Sep 17 00:00:00 2001 From: Oton Vazquez Doce Date: Tue, 25 Feb 2025 16:34:06 +0100 Subject: [PATCH 0416/1650] [Infrastructure] Update CODEOWNERS (#10185) --- CODEOWNERS | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index eba5b5d7c70..ecd3c4c9aa7 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -29,11 +29,11 @@ /EventFiltering/PWGCF @alibuild @lauraser @mpuccio @lietava /EventFiltering/PWGMM @alibuild @aortizve @mpuccio @lietava /EventFiltering/PWGJE @alibuild @fkrizek @nzardosh @mpuccio @lietava -/PWGCF @alibuild @saganatt @victor-gonzalez @zchochul @lgraczykCern @prchakra @lauraser @ariedel-cern @EmilGorm @otonvd @shouqiye -/PWGCF/Core @alibuild @jgrosseo @saganatt @victor-gonzalez @zchochul @lgraczykCern @prchakra @lauraser @ariedel-cern @EmilGorm @otonvd @shouqiye -/PWGCF/DataModel @alibuild @jgrosseo @saganatt @victor-gonzalez @zchochul @lgraczykCern @prchakra @lauraser @ariedel-cern @EmilGorm @otonvd @shouqiye -/PWGCF/TableProducer @alibuild @jgrosseo @saganatt @victor-gonzalez @zchochul @lgraczykCern @prchakra @lauraser @ariedel-cern @EmilGorm @otonvd @shouqiye -/PWGCF/Tasks @alibuild @jgrosseo @saganatt @victor-gonzalez @zchochul @lgraczykCern @prchakra @lauraser @ariedel-cern @EmilGorm @otonvd @shouqiye +/PWGCF @alibuild @saganatt @victor-gonzalez @zchochul @lgraczykCern @prchakra @lauraser @ariedel-cern @EmilGorm @otonvd @shouqiye @glromane +/PWGCF/Core @alibuild @jgrosseo @saganatt @victor-gonzalez @zchochul @lgraczykCern @prchakra @lauraser @ariedel-cern @EmilGorm @otonvd @shouqiye @glromane +/PWGCF/DataModel @alibuild @jgrosseo @saganatt @victor-gonzalez @zchochul @lgraczykCern @prchakra @lauraser @ariedel-cern @EmilGorm @otonvd @shouqiye @glromane +/PWGCF/TableProducer @alibuild @jgrosseo @saganatt @victor-gonzalez @zchochul @lgraczykCern @prchakra @lauraser @ariedel-cern @EmilGorm @otonvd @shouqiye @glromane +/PWGCF/Tasks @alibuild @jgrosseo @saganatt @victor-gonzalez @zchochul @lgraczykCern @prchakra @lauraser @ariedel-cern @EmilGorm @otonvd @shouqiye @glromane /PWGDQ @alibuild @iarsene @dsekihat @feisenhu @lucamicheletti93 /PWGEM @alibuild @feisenhu @dsekihat @ivorobye /PWGEM/Dilepton @alibuild @mikesas @rbailhac @dsekihat @ivorobye @feisenhu From aa4d8910a742f61dbb4a0cf8f07e32c5d090f6ab Mon Sep 17 00:00:00 2001 From: ilikmeta <152337132+ilikmeta@users.noreply.github.com> Date: Tue, 25 Feb 2025 10:03:21 -0600 Subject: [PATCH 0417/1650] [PWGCF] Fix track type histograms. (#10178) --- PWGCF/Flow/Tasks/flowGfwTask.cxx | 36 +++++++++++++------------------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowGfwTask.cxx b/PWGCF/Flow/Tasks/flowGfwTask.cxx index 5a6e96b70e5..75bdf52e6f4 100644 --- a/PWGCF/Flow/Tasks/flowGfwTask.cxx +++ b/PWGCF/Flow/Tasks/flowGfwTask.cxx @@ -313,15 +313,16 @@ struct FlowGfwTask { // Track plots registry.add("Nch", "N_{ch 0-5%} vs #Events;N_{ch 0-5%};No. of Events", {HistType::kTH1D, {axisNch}}); registry.add("Events_per_Centrality_Bin", "Events_per_Centrality_Bin;Centrality FT0C;No. of Events", kTH1F, {axisCentrality}); + registry.add("Tracks_per_Centrality_Bin", "Tracks_per_Centrality_Bin;Centrality FT0C;No. of Tracks", kTH1F, {axisCentrality}); registry.add("pt_Cen_GlobalOnly", "pt_Cen_Global;Centrality (%); p_{T} (GeV/c);", {HistType::kTH2D, {axisCentrality, axisPt}}); registry.add("phi_Cen_GlobalOnly", "phi_Cen_Global;Centrality (%); #phi;", {HistType::kTH2D, {axisCentrality, axisPhi}}); registry.add("pt_Cen_ITSOnly", "pt_Cen_ITS;Centrality (%); p_{T} (GeV/c);", {HistType::kTH2D, {axisCentrality, axisPt}}); registry.add("phi_Cen_ITSOnly", "phi_Cen_ITS;Centrality (%); #phi;", {HistType::kTH2D, {axisCentrality, axisPhi}}); // Track types - registry.add("GlobalplusITS", "Global plus ITS;Centrality FT0C;Nch", kTH1F, {axisCentrality}); - registry.add("Globalonly", "Global only;Centrality FT0C;Nch", kTH1F, {axisCentrality}); - registry.add("ITSonly", "ITS only;Centrality FT0C;Nch", kTH1F, {axisCentrality}); + registry.add("GlobalplusITS", "Global plus ITS;Centrality FT0C;Nch", {HistType::kTH2D, {axisCentrality, axisNch}}); + registry.add("Globalonly", "Global only;Centrality FT0C;Nch", {HistType::kTH2D, {axisCentrality, axisNch}}); + registry.add("ITSonly", "ITS only;Centrality FT0C;Nch", {HistType::kTH2D, {axisCentrality, axisNch}}); // Track QA registry.add("hPt", "p_{T} distribution before cut", {HistType::kTH1D, {axisPtHist}}); @@ -868,9 +869,6 @@ struct FlowGfwTask { // track loop int globalTracksNch = 0; - int globalPlusitsNch = 0; - int gloabalOnlyNch = 0; - int itsOnlyNch = 0; for (const auto& track : tracks) { if (!trackSelected(track)) @@ -900,12 +898,11 @@ struct FlowGfwTask { registry.fill(HIST("hDCAxy"), track.dcaXY(), track.pt()); } - globalPlusitsNch++; - if (cfgGlobalplusITS) { if (withinPtRef) { fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), wacc * weff, 1); - registry.fill(HIST("GlobalplusITS"), centrality); + globalTracksNch++; + registry.fill(HIST("GlobalplusITS"), centrality, globalTracksNch); } } @@ -913,20 +910,20 @@ struct FlowGfwTask { if (cfgGlobalonly) { if (withinPtRef) { fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), wacc * weff, 1); - gloabalOnlyNch++; - registry.fill(HIST("Globalonly"), centrality); + globalTracksNch++; + registry.fill(HIST("Globalonly"), centrality, globalTracksNch); registry.fill(HIST("pt_Cen_GlobalOnly"), centrality, track.pt()); - registry.fill(HIST("phi_Cen_GlobalOnly"), centrality, track.pt()); + registry.fill(HIST("phi_Cen_GlobalOnly"), centrality, track.phi()); } } } else { if (cfgITSonly) { if (withinPtRef) { fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), wacc * weff, 1); - itsOnlyNch++; - registry.fill(HIST("ITSonly"), centrality); + globalTracksNch++; + registry.fill(HIST("ITSonly"), centrality, globalTracksNch); registry.fill(HIST("pt_Cen_ITSOnly"), centrality, track.pt()); - registry.fill(HIST("phi_Cen_ITSOnly"), centrality, track.pt()); + registry.fill(HIST("phi_Cen_ITSOnly"), centrality, track.phi()); } } } @@ -936,14 +933,9 @@ struct FlowGfwTask { } // End of track loop - globalTracksNch = globalPlusitsNch; - globalTracksNch = gloabalOnlyNch; - globalTracksNch = itsOnlyNch; - + // Only one type of track will be plotted registry.fill(HIST("Events_per_Centrality_Bin"), centrality); - registry.fill(HIST("GlobalplusITS"), centrality, globalPlusitsNch); - registry.fill(HIST("Globalonly"), centrality, gloabalOnlyNch); - registry.fill(HIST("ITSonly"), centrality, itsOnlyNch); + registry.fill(HIST("Tracks_per_Centrality_Bin"), centrality, globalTracksNch); // Filling c22 with ROOT TProfile fillProfile(corrconfigs.at(0), HIST("c22"), centrality); From 9ed383d80db24ecb2865cb8d6c2311b1e39c199f Mon Sep 17 00:00:00 2001 From: EmilGorm <50658075+EmilGorm@users.noreply.github.com> Date: Tue, 25 Feb 2025 17:17:40 +0100 Subject: [PATCH 0418/1650] [PWGCF] move to TH3D in registry for weights (#10182) Co-authored-by: Emil Gorm Nielsen Co-authored-by: ALICE Action Bot --- .../Tasks/flowGenericFramework.cxx | 261 ++++++++++++------ 1 file changed, 175 insertions(+), 86 deletions(-) diff --git a/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx b/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx index 632dff15c85..f5dab09c53b 100644 --- a/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx +++ b/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx @@ -21,6 +21,8 @@ #include #include #include +#include +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -86,7 +88,7 @@ struct FlowGenericFramework { O2_DEFINE_CONFIGURABLE(cfgMpar, int, 8, "Highest order of pt-pt correlations") O2_DEFINE_CONFIGURABLE(cfgUseNch, bool, false, "Do correlations as function of Nch") O2_DEFINE_CONFIGURABLE(cfgFillWeights, bool, false, "Fill NUA weights") - O2_DEFINE_CONFIGURABLE(cfgRunByRunWeights, bool, false, "Use run by run NUA corrections") + O2_DEFINE_CONFIGURABLE(cfgRunByRun, bool, false, "Fill histograms on a run-by-run basis") O2_DEFINE_CONFIGURABLE(cfgFillQA, bool, false, "Fill QA histograms") O2_DEFINE_CONFIGURABLE(cfgUseAdditionalEventCut, bool, false, "Use additional event cut on mult correlations") O2_DEFINE_CONFIGURABLE(cfgUseAdditionalTrackCut, bool, false, "Use additional track cut on phi") @@ -113,6 +115,7 @@ struct FlowGenericFramework { O2_DEFINE_CONFIGURABLE(cfgTVXinTRD, bool, true, "Use kTVXinTRD (reject TRD triggered events)"); O2_DEFINE_CONFIGURABLE(cfgIsVertexITSTPC, bool, true, "Selects collisions with at least one ITS-TPC track"); O2_DEFINE_CONFIGURABLE(cfgMagField, float, 99999, "Configurable magnetic field; default CCDB will be queried"); + O2_DEFINE_CONFIGURABLE(cfgTofPtCut, float, 1.0, "pt cut on TOF for PID"); Configurable cfgGFWBinning{"cfgGFWBinning", {40, 16, 72, 300, 0, 3000, 0.2, 10.0, 0.2, 3.0, {0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.2, 2.4, 2.6, 2.8, 3, 3.5, 4, 5, 6, 8, 10}, {0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90}}, "Configuration for binning"}; Configurable cfgRegions{"cfgRegions", {{"refN", "refP", "refFull"}, {-0.8, 0.4, -0.8}, {-0.4, 0.8, 0.8}, {0, 0, 0}, {1, 1, 1}}, "Configurations for GFW regions"}; @@ -125,7 +128,7 @@ struct FlowGenericFramework { struct Config { TH1D* mEfficiency = nullptr; - GFWWeightsList* mAcceptance; + std::vector mAcceptance; bool correctionsLoaded = false; } cfg; @@ -133,16 +136,35 @@ struct FlowGenericFramework { OutputObj fFC{FlowContainer("FlowContainer")}; OutputObj fFCpt{FlowPtContainer("FlowPtContainer")}; OutputObj fFCgen{FlowContainer("FlowContainer_gen")}; - OutputObj fWeightList{GFWWeightsList("WeightList")}; HistogramRegistry registry{"registry"}; + std::map>> th1sList; + std::map>> th3sList; + enum OutputTH1Names { + hPhi = 0, + hEta, + hVtxZ, + hMult, + hCent, + hEventSel, + kCount_TH1Names + }; + enum OutputTH3Names { + hNUAref = 0, + hNUAch, + hNUApi, + hNUAka, + hNUApr, + kCount_TH3Names + }; + // define global variables GFW* fGFW = new GFW(); std::vector corrconfigs; TRandom3* fRndm = new TRandom3(0); TAxis* fPtAxis; - int lastRun = 0; - + int lastRun = -1; + std::vector runNumbers; // Event selection cuts - Alex TF1* fPhiCutLow = nullptr; TF1* fPhiCutHigh = nullptr; @@ -212,16 +234,6 @@ struct FlowGenericFramework { int ptbins = ptbinning.size() - 1; fPtAxis = new TAxis(ptbins, &ptbinning[0]); - fWeightList->init("weightList"); - - if (!cfgRunByRunWeights && cfgFillWeights) { - if (cfgUsePID) { - fWeightList->addPIDGFWWeightsByName("weight", fPtAxis->GetNbins(), &ptbinning[0], ptrefup, true, false); - } else { - fWeightList->addGFWWeightsByName("weight", fPtAxis->GetNbins(), &ptbinning[0], true, false); - } - } - if (doprocessMCGen) { registry.add("MCGen/before/pt_gen", "", {HistType::kTH1D, {ptAxis}}); registry.add("MCGen/before/phi_eta_vtxZ_gen", "", {HistType::kTH3D, {phiAxis, etaAxis, vtxAxis}}); @@ -255,6 +267,18 @@ struct FlowGenericFramework { registry.get(HIST("eventQA/eventSel"))->GetXaxis()->SetBinLabel(9, "kIsGoodITSLayersAll"); registry.get(HIST("eventQA/eventSel"))->GetXaxis()->SetBinLabel(10, "after Mult cuts"); registry.get(HIST("eventQA/eventSel"))->GetXaxis()->SetBinLabel(11, "has track + within cent"); + + if (!cfgRunByRun) { + if (cfgUsePID) { + registry.add("phi_eta_vtxz_ref", "", {HistType::kTH3D, {phiAxis, etaAxis, vtxAxis}}); + registry.add("phi_eta_vtxz_ch", "", {HistType::kTH3D, {phiAxis, etaAxis, vtxAxis}}); + registry.add("phi_eta_vtxz_pi", "", {HistType::kTH3D, {phiAxis, etaAxis, vtxAxis}}); + registry.add("phi_eta_vtxz_ka", "", {HistType::kTH3D, {phiAxis, etaAxis, vtxAxis}}); + registry.add("phi_eta_vtxz_pr", "", {HistType::kTH3D, {phiAxis, etaAxis, vtxAxis}}); + } else { + registry.add("phi_eta_vtxz_ref", "", {HistType::kTH3D, {phiAxis, etaAxis, vtxAxis}}); + } + } } if (regions.GetSize() < 0) @@ -359,16 +383,21 @@ struct FlowGenericFramework { void loadCorrections(aod::BCsWithTimestamps::iterator const& bc) { uint64_t timestamp = bc.timestamp(); - if (cfg.correctionsLoaded) + if (!cfgRunByRun && cfg.correctionsLoaded) return; if (!cfgAcceptance.value.empty()) { - cfg.mAcceptance = ccdb->getForTimeStamp(cfgAcceptance, timestamp); - if (cfg.mAcceptance) - LOGF(info, "Loaded acceptance weights from %s", cfgAcceptance.value.c_str()); - else - LOGF(warning, "Could not load acceptance weights from %s", cfgAcceptance.value.c_str()); + std::string runstr = (cfgRunByRun) ? "RBR/" : ""; + cfg.mAcceptance.clear(); + if (cfgUsePID) { + cfg.mAcceptance.push_back(ccdb->getForTimeStamp(cfgAcceptance.value + runstr + "ref/", timestamp)); + cfg.mAcceptance.push_back(ccdb->getForTimeStamp(cfgAcceptance.value + runstr + "ch/", timestamp)); + cfg.mAcceptance.push_back(ccdb->getForTimeStamp(cfgAcceptance.value + runstr + "pi/", timestamp)); + cfg.mAcceptance.push_back(ccdb->getForTimeStamp(cfgAcceptance.value + runstr + "ka/", timestamp)); + cfg.mAcceptance.push_back(ccdb->getForTimeStamp(cfgAcceptance.value + runstr + "pr/", timestamp)); + } else { + cfg.mAcceptance.push_back(ccdb->getForTimeStamp(cfgAcceptance.value + runstr, timestamp)); + } } - if (!cfgEfficiency.value.empty()) { cfg.mEfficiency = ccdb->getForTimeStamp(cfgEfficiency, timestamp); if (cfg.mEfficiency == nullptr) { @@ -383,19 +412,8 @@ struct FlowGenericFramework { double getAcceptance(TTrack track, const double& vtxz, int index) { // 0 ref, 1 ch, 2 pi, 3 ka, 4 pr double wacc = 1; - if (cfg.mAcceptance) { - if (cfgUsePID) { - if (cfgRunByRunWeights) - wacc = cfg.mAcceptance->getPIDGFWWeightsByRun(lastRun, index)->getNUA(track.phi(), track.eta(), vtxz); - else - wacc = cfg.mAcceptance->getPIDGFWWeightsByName("weight", index)->getNUA(track.phi(), track.eta(), vtxz); - } else { - if (cfgRunByRunWeights) - wacc = cfg.mAcceptance->getGFWWeightsByRun(lastRun)->getNUA(track.phi(), track.eta(), vtxz); - else - wacc = cfg.mAcceptance->getGFWWeightsByName("weight")->getNUA(track.phi(), track.eta(), vtxz); - } - } + if (!cfg.mAcceptance.empty()) + wacc = cfg.mAcceptance[index]->getNUA(track.phi(), track.eta(), vtxz); return wacc; } @@ -410,24 +428,6 @@ struct FlowGenericFramework { else return 1. / eff; } - // Obsolete for now untill service wagons get added - /* template - int getBayesPIDIndex(TTrack track) { - float maxProb[3] = {0.95,0.85,0.85}; - int pidID = 0; - if(track.bayesID()==o2::track::PID::Pion || track.bayesID()==o2::track::PID::Kaon || track.bayesID()==o2::track::PID::Proton){ - pidID = track.bayesID()-1; //Realign - float nsigmaTPC[3] = {track.tpcNSigmaPi(),track.tpcNSigmaKa(),track.tpcNSigmaPr()}; - float nsigmaTOF[3] = {track.tofNSigmaPi(),track.tofNSigmaKa(),track.tofNSigmaPr()}; - if(track.bayesProb() > maxProb[pidID-1]) { - if(std::abs(nsigmaTPC[pidID-1]) > 3) return 0; - if(std::abs(nsigmaTOF[pidID-1]) > 3) return 0; - return pidID; - } - else return 0; - } - return 0; - } */ template int getNsigmaPID(TTrack track) @@ -439,7 +439,9 @@ struct FlowGenericFramework { float nsigma = 3.0; // Choose which nSigma to use - std::array nSigmaToUse = (track.pt() > 0.4 && track.hasTOF()) ? nSigmaCombined : nSigmaTPC; + std::array nSigmaToUse = (track.pt() > cfgTofPtCut && track.hasTOF()) ? nSigmaCombined : nSigmaTPC; + if (track.pt() >= cfgTofPtCut && !track.hasTOF()) + return -1; // Select particle with the lowest nsigma for (int i = 0; i < 3; ++i) { @@ -452,7 +454,7 @@ struct FlowGenericFramework { } template - bool eventSelected(TCollision collision, const int& multTrk, const float& centrality) + bool eventSelected(TCollision collision, const int& multTrk, const float& centrality, const int& run) { if (cfgTVXinTRD) { if (collision.alias_bit(kTVXinTRD)) { @@ -461,6 +463,8 @@ struct FlowGenericFramework { return 0; } registry.fill(HIST("eventQA/eventSel"), 3.5); + if (cfgRunByRun) + th1sList[run][hEventSel]->Fill(3.5); } if (cfgNoSameBunchPileupCut) { @@ -470,6 +474,8 @@ struct FlowGenericFramework { return 0; } registry.fill(HIST("eventQA/eventSel"), 4.5); + if (cfgRunByRun) + th1sList[run][hEventSel]->Fill(4.5); } if (cfgIsGoodZvtxFT0vsPV) { if (!collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { @@ -478,6 +484,8 @@ struct FlowGenericFramework { return 0; } registry.fill(HIST("eventQA/eventSel"), 5.5); + if (cfgRunByRun) + th1sList[run][hEventSel]->Fill(5.5); } if (cfgNoCollInTimeRangeStandard) { if (!collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { @@ -485,6 +493,8 @@ struct FlowGenericFramework { return 0; } registry.fill(HIST("eventQA/eventSel"), 6.5); + if (cfgRunByRun) + th1sList[run][hEventSel]->Fill(6.5); } if (cfgIsVertexITSTPC) { @@ -493,6 +503,8 @@ struct FlowGenericFramework { return 0; } registry.fill(HIST("eventQA/eventSel"), 7.5); + if (cfgRunByRun) + th1sList[run][hEventSel]->Fill(7.5); } if (cfgIsGoodITSLayersAll) { @@ -500,6 +512,8 @@ struct FlowGenericFramework { return 0; } registry.fill(HIST("eventQA/eventSel"), 8.5); + if (cfgRunByRun) + th1sList[run][hEventSel]->Fill(8.5); } float vtxz = -999; if (collision.numContrib() > 1) { @@ -526,6 +540,8 @@ struct FlowGenericFramework { if (multTrk > fMultCutHigh->Eval(centrality)) return 0; registry.fill(HIST("eventQA/eventSel"), 9.5); + if (cfgRunByRun) + th1sList[run][hEventSel]->Fill(9.5); } /* 22s @@ -571,40 +587,82 @@ struct FlowGenericFramework { }; template - void fillWeights(const TTrack track, const double vtxz, const double multcent, const int& pid_index, const int& run) + void fillWeights(const TTrack track, const double vtxz, const int& pid_index, const int& run) { if (cfgUsePID) { double ptpidmins[] = {ptpoilow, ptpoilow, 0.3, 0.5}; // min pt for ch, pi, ka, pr double ptpidmaxs[] = {ptpoiup, ptpoiup, 6.0, 6.0}; // max pt for ch, pi, ka, pr bool withinPtPOI = (ptpidmins[pid_index] < track.pt()) && (track.pt() < ptpidmaxs[pid_index]); // within POI pT range bool withinPtRef = (ptreflow < track.pt()) && (track.pt() < ptrefup); // within RF pT range - if (cfgRunByRunWeights) { + if (cfgRunByRun) { if (withinPtRef && !pid_index) - fWeightList->getPIDGFWWeightsByRun(run, pid_index)->fill(track.phi(), track.eta(), vtxz, track.pt(), multcent, 0); // pt-subset of charged particles for ref flow + th3sList[run][hNUAref]->Fill(track.phi(), track.eta(), vtxz); // pt-subset of charged particles for ref flow if (withinPtPOI) - fWeightList->getPIDGFWWeightsByRun(run, pid_index + 1)->fill(track.phi(), track.eta(), vtxz, track.pt(), multcent, 0); // charged and id'ed particle weights + th3sList[run][hNUAch + pid_index]->Fill(track.phi(), track.eta(), vtxz); // charged and id'ed particle weights } else { if (withinPtRef && !pid_index) - fWeightList->getPIDGFWWeightsByName("weight", pid_index)->fill(track.phi(), track.eta(), vtxz, track.pt(), multcent, 0); // pt-subset of charged particles for ref flow - if (withinPtPOI) - fWeightList->getPIDGFWWeightsByName("weight", pid_index + 1)->fill(track.phi(), track.eta(), vtxz, track.pt(), multcent, 0); // charged and id'ed particle weights + registry.fill(HIST("hPhiEtaVtxz_ref"), track.phi(), track.eta(), vtxz); // pt-subset of charged particles for ref flow + if (withinPtPOI) { + switch (pid_index) { + case 0: + registry.fill(HIST("hPhiEtaVtxz_ch"), track.phi(), track.eta(), vtxz); // charged particle weights + break; + case 1: + registry.fill(HIST("hPhiEtaVtxz_pi"), track.phi(), track.eta(), vtxz); // pion weights + break; + case 2: + registry.fill(HIST("hPhiEtaVtxz_ka"), track.phi(), track.eta(), vtxz); // kaon weights + break; + case 3: + registry.fill(HIST("hPhiEtaVtxz_pr"), track.phi(), track.eta(), vtxz); // proton weights + break; + } + } } } else { - if (cfgRunByRunWeights) - fWeightList->getGFWWeightsByRun(lastRun)->fill(track.phi(), track.eta(), vtxz, track.pt(), multcent, 0); + if (cfgRunByRun) + th3sList[run][hNUAref]->Fill(track.phi(), track.eta(), vtxz); else - fWeightList->getGFWWeightsByName("weight")->fill(track.phi(), track.eta(), vtxz, track.pt(), multcent, 0); + registry.fill(HIST("hPhiEtaVtxz_ref"), track.phi(), track.eta(), vtxz); } return; } - void createRunByRunWeights(int run) + void createRunByRunHistograms(const int& run) { + AxisSpec phiAxis = {phibins, philow, phiup, "#phi"}; + AxisSpec etaAxis = {etabins, -cfgEta, cfgEta, "#eta"}; + AxisSpec vtxAxis = {vtxZbins, -cfgVtxZ, cfgVtxZ, "Vtx_{z} (cm)"}; + std::vector> histos(kCount_TH1Names); + histos[hPhi] = registry.add(Form("%d/phi", run), "", {HistType::kTH1D, {phiAxis}}); + histos[hEta] = registry.add(Form("%d/eta", run), "", {HistType::kTH1D, {etaAxis}}); + histos[hVtxZ] = registry.add(Form("%d/vtxz", run), "", {HistType::kTH1D, {vtxAxis}}); + histos[hMult] = registry.add(Form("%d/mult", run), "", {HistType::kTH1D, {{3000, 0.5, 3000.5}}}); + histos[hCent] = registry.add(Form("%d/cent", run), "", {HistType::kTH1D, {{90, 0, 90}}}); + histos[hEventSel] = registry.add(Form("%d/eventSel", run), "Number of Events;; Counts", {HistType::kTH1D, {{11, 0, 11}}}); + histos[hEventSel]->GetXaxis()->SetBinLabel(1, "Filtered event"); + histos[hEventSel]->GetXaxis()->SetBinLabel(2, "sel8"); + histos[hEventSel]->GetXaxis()->SetBinLabel(3, "occupancy"); + histos[hEventSel]->GetXaxis()->SetBinLabel(4, "kTVXinTRD"); + histos[hEventSel]->GetXaxis()->SetBinLabel(5, "kNoSameBunchPileup"); + histos[hEventSel]->GetXaxis()->SetBinLabel(6, "kIsGoodZvtxFT0vsPV"); + histos[hEventSel]->GetXaxis()->SetBinLabel(7, "kNoCollInTimeRangeStandard"); + histos[hEventSel]->GetXaxis()->SetBinLabel(8, "kIsVertexITSTPC"); + histos[hEventSel]->GetXaxis()->SetBinLabel(9, "kIsGoodITSLayersAll"); + histos[hEventSel]->GetXaxis()->SetBinLabel(10, "after Mult cuts"); + histos[hEventSel]->GetXaxis()->SetBinLabel(11, "has track + within cent"); + th1sList.insert(std::make_pair(run, histos)); + std::vector> histos3d(kCount_TH3Names); if (cfgUsePID) { - fWeightList->addPIDGFWWeightsByRun(run, fPtAxis->GetNbins(), &ptbinning[0], ptrefup, true, false); + histos3d[hNUAref] = registry.add(Form("%d/phi_eta_vtxz_ref", run), "", {HistType::kTH3D, {phiAxis, etaAxis, vtxAxis}}); + histos3d[hNUAch] = registry.add(Form("%d/phi_eta_vtxz_ch", run), "", {HistType::kTH3D, {phiAxis, etaAxis, vtxAxis}}); + histos3d[hNUApi] = registry.add(Form("%d/phi_eta_vtxz_pi", run), "", {HistType::kTH3D, {phiAxis, etaAxis, vtxAxis}}); + histos3d[hNUAka] = registry.add(Form("%d/phi_eta_vtxz_ka", run), "", {HistType::kTH3D, {phiAxis, etaAxis, vtxAxis}}); + histos3d[hNUApr] = registry.add(Form("%d/phi_eta_vtxz_pr", run), "", {HistType::kTH3D, {phiAxis, etaAxis, vtxAxis}}); } else { - fWeightList->addGFWWeightsByRun(run, fPtAxis->GetNbins(), &ptbinning[0], true, false); + histos3d[hNUAref] = registry.add(Form("%d/phi_eta_vtxz_ref", run), "", {HistType::kTH3D, {phiAxis, etaAxis, vtxAxis}}); } + th3sList.insert(std::make_pair(run, histos3d)); return; } @@ -649,19 +707,26 @@ struct FlowGenericFramework { if (centrality < centbinning.front() || centrality > centbinning.back()) return; registry.fill(HIST("eventQA/eventSel"), 10.5); + if (cfgRunByRun) + th1sList[run][hEventSel]->Fill(10.5); float vtxz = collision.posZ(); + if (dt != kGen && cfgRunByRun) { + th1sList[run][hVtxZ]->Fill(vtxz); + th1sList[run][hMult]->Fill(tracks.size()); + th1sList[run][hCent]->Fill(centrality); + } fGFW->Clear(); fFCpt->clearVector(); float lRandom = fRndm->Rndm(); for (const auto& track : tracks) { - processTrack(track, centrality, vtxz, field, run); + processTrack(track, vtxz, field, run); } if (!cfgFillWeights) fillOutputContainers

((cfgUseNch) ? tracks.size() : centrality, lRandom); } template - inline void processTrack(TTrack const& track, const float& centrality, const float& vtxz, const int& field, const int& run) + inline void processTrack(TTrack const& track, const float& vtxz, const int& field, const int& run) { if constexpr (framework::has_type_v) { if (track.mcParticleId() < 0 || !(track.has_mcParticle())) @@ -690,14 +755,19 @@ struct FlowGenericFramework { } if (cfgFillWeights) { - fillWeights(mcParticle, vtxz, centrality, 0, run); + fillWeights(mcParticle, vtxz, 0, run); } else { fillPtSums(track, vtxz); fillGFW(mcParticle, vtxz, pidIndex); } - if (cfgFillQA) + if (cfgFillQA) { fillTrackQA(track, vtxz); + if (cfgRunByRun) { + th1sList[run][hPhi]->Fill(track.phi()); + th1sList[run][hEta]->Fill(track.eta()); + } + } } else if constexpr (framework::has_type_v) { if (!track.isPhysicalPrimary()) @@ -738,13 +808,18 @@ struct FlowGenericFramework { pidIndex = getNsigmaPID(track); } if (cfgFillWeights) { - fillWeights(track, vtxz, centrality, pidIndex, run); + fillWeights(track, vtxz, pidIndex, run); } else { fillPtSums(track, vtxz); fillGFW(track, vtxz, pidIndex); } - if (cfgFillQA) + if (cfgFillQA) { fillTrackQA(track, vtxz); + if (cfgRunByRun) { + th1sList[run][hPhi]->Fill(track.phi()); + th1sList[run][hEta]->Fill(track.eta()); + } + } } } @@ -842,30 +917,44 @@ struct FlowGenericFramework { int run = bc.runNumber(); if (run != lastRun) { lastRun = run; - if (cfgFillWeights && cfgRunByRunWeights) - createRunByRunWeights(run); + LOGF(info, "run = %d", run); + if (cfgRunByRun) { + if (std::find(runNumbers.begin(), runNumbers.end(), run) == runNumbers.end()) { + LOGF(info, "Creating histograms for run %d", run); + createRunByRunHistograms(run); + runNumbers.push_back(run); + } else { + LOGF(info, "run %d already in runNumbers", run); + } + if (!cfgFillWeights) + loadCorrections(bc); + } } + if (!cfgFillWeights && !cfgRunByRun) + loadCorrections(bc); registry.fill(HIST("eventQA/eventSel"), 0.5); + if (cfgRunByRun) + th1sList[run][hEventSel]->Fill(0.5); if (!collision.sel8()) return; registry.fill(HIST("eventQA/eventSel"), 1.5); - + if (cfgRunByRun) + th1sList[run][hEventSel]->Fill(1.5); if (cfgOccupancySelection != -999) { int occupancy = collision.trackOccupancyInTimeRange(); if (occupancy < 0 || occupancy > cfgOccupancySelection) return; } registry.fill(HIST("eventQA/eventSel"), 2.5); + if (cfgRunByRun) + th1sList[run][hEventSel]->Fill(2.5); const auto centrality = collision.centFT0C(); - if (cfgFillQA) fillEventQA(collision, tracks); - if (cfgUseAdditionalEventCut && !eventSelected(collision, tracks.size(), centrality)) + if (cfgUseAdditionalEventCut && !eventSelected(collision, tracks.size(), centrality, run)) return; if (cfgFillQA) fillEventQA(collision, tracks); - if (!cfgFillWeights) - loadCorrections(bc); auto field = (cfgMagField == 99999) ? getMagneticField(bc.timestamp()) : cfgMagField; processCollision(collision, tracks, centrality, field, run); } @@ -877,15 +966,15 @@ struct FlowGenericFramework { int run = bc.runNumber(); if (run != lastRun) { lastRun = run; - if (cfgFillWeights && cfgRunByRunWeights) - createRunByRunWeights(run); + if (cfgRunByRun) + createRunByRunHistograms(run); } if (!collision.sel8()) return; const auto centrality = collision.centFT0C(); if (cfgFillQA) fillEventQA(collision, tracks); - if (cfgUseAdditionalEventCut && !eventSelected(collision, tracks.size(), centrality)) + if (cfgUseAdditionalEventCut && !eventSelected(collision, tracks.size(), centrality, run)) return; if (cfgFillQA) fillEventQA(collision, tracks); @@ -916,8 +1005,8 @@ struct FlowGenericFramework { int run = bc.runNumber(); if (run != lastRun) { lastRun = run; - if (cfgFillWeights && cfgRunByRunWeights) - createRunByRunWeights(run); + if (cfgRunByRun) + createRunByRunHistograms(run); } if (!collision.sel7()) return; From f86f85fd898b9a1f446afbd57af52bacce117303 Mon Sep 17 00:00:00 2001 From: Preet-Bhanjan Date: Tue, 25 Feb 2025 17:45:24 +0100 Subject: [PATCH 0419/1650] [PWGCF] Adding 2 and 4 particle flow for resonance (#10184) Co-authored-by: Preet Pati --- PWGCF/Flow/Tasks/resonancesGfwFlow.cxx | 137 ++++++++++++++++++++++--- 1 file changed, 125 insertions(+), 12 deletions(-) diff --git a/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx b/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx index 67e0e6ff776..6662bd389e2 100644 --- a/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx +++ b/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx @@ -31,17 +31,24 @@ #include "Framework/StepTHn.h" #include "Common/DataModel/EventSelection.h" -#include "Common/Core/TrackSelection.h" #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/Centrality.h" #include "Common/DataModel/PIDResponse.h" -#include "Common/Core/trackUtilities.h" -#include "Common/Core/RecoDecay.h" #include "Common/DataModel/Multiplicity.h" -#include "PWGLF/DataModel/EPCalibrationTables.h" +#include "Common/Core/TrackSelection.h" +#include "Common/Core/trackUtilities.h" #include "CommonConstants/PhysicsConstants.h" + +#include "PWGLF/DataModel/EPCalibrationTables.h" #include "PWGLF/DataModel/LFStrangenessTables.h" +#include "PWGCF/GenericFramework/Core/GFWPowerArray.h" +#include "PWGCF/GenericFramework/Core/GFW.h" +#include "PWGCF/GenericFramework/Core/GFWCumulant.h" +#include "PWGCF/GenericFramework/Core/FlowContainer.h" +#include "PWGCF/GenericFramework/Core/GFWWeights.h" +#include "PWGCF/GenericFramework/Core/GFWWeightsList.h" + #include "ReconstructionDataFormats/Track.h" #include "ReconstructionDataFormats/PID.h" @@ -116,9 +123,9 @@ struct ResonancesGfwFlow { ConfigurableAxis axisNsigmaTPC{"axisNsigmaTPC", {80, -5, 5}, "nsigmaTPC axis"}; ConfigurableAxis axisNsigmaTOF{"axisNsigmaTOF", {80, -5, 5}, "nsigmaTOF axis"}; ConfigurableAxis axisParticles{"axisParticles", {3, 0, 3}, "axis for different hadrons"}; - ConfigurableAxis axisPhiMass{"axisPhiMass", {50000, 0, 5}, "axis for invariant mass distibution for Phi"}; - ConfigurableAxis axisK0Mass{"axisK0Mass", {50000, 0, 5}, "axis for invariant mass distibution for K0"}; - ConfigurableAxis axisLambdaMass{"axisLambdaMass", {50000, 0, 5}, "axis for invariant mass distibution for Lambda"}; + ConfigurableAxis axisPhiMass{"axisPhiMass", {70, 0.99, 1.06}, "axis for invariant mass distibution for Phi"}; + ConfigurableAxis axisK0Mass{"axisK0Mass", {120, 0.44, 0.56}, "axis for invariant mass distibution for K0"}; + ConfigurableAxis axisLambdaMass{"axisLambdaMass", {70, 1.08, 1.15}, "axis for invariant mass distibution for Lambda"}; ConfigurableAxis axisTPCsignal{"axisTPCsignal", {10000, 0, 1000}, "axis for TPC signal"}; ConfigurableAxis axisTOFsignal{"axisTOFsignal", {10000, 0, 1000}, "axis for TOF signal"}; @@ -135,6 +142,14 @@ struct ResonancesGfwFlow { HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + GFW* fGFW = new GFW(); + std::vector corrconfigs; + TAxis* fPtAxis; + TAxis* fPhiMassAxis; + TAxis* fK0MassAxis; + TAxis* fLambdaMassAxis; + TRandom3* fRndm = new TRandom3(0); + void init(InitContext const&) { ccdb->setURL(ccdbUrl.value); @@ -179,6 +194,79 @@ struct ResonancesGfwFlow { histos.add("hK0Eta", "", {HistType::kTH1D, {axisEta}}); histos.add("hK0Mass_sparse", "", {HistType::kTHnSparseF, {{axisK0Mass, axisPt, axisMultiplicity}}}); histos.add("hK0Count", "", {HistType::kTH1D, {singleCount}}); + + histos.add("Phic22", "", {HistType::kTProfile, {axisMultiplicity}}); + histos.add("Phic24", "", {HistType::kTProfile, {axisMultiplicity}}); + histos.add("Phiv22pt", "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); + histos.add("Phiv24pt", "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); + + o2::framework::AxisSpec axis = axisPt; + int nPtBins = axis.binEdges.size() - 1; + double* ptBins = &(axis.binEdges)[0]; + fPtAxis = new TAxis(nPtBins, ptBins); + + o2::framework::AxisSpec axisPhisMass = axisPhiMass; + int nPhiMassBins = axisPhisMass.binEdges.size() - 1; + double* phiMassBins = &(axisPhisMass.binEdges)[0]; + fPhiMassAxis = new TAxis(nPhiMassBins, phiMassBins); + int nPhisPtMassBins = nPtBins * nPhiMassBins; + + o2::framework::AxisSpec axisK0sMass = axisK0Mass; + int nK0MassBins = axisK0sMass.binEdges.size() - 1; + double* k0MassBins = &(axisK0sMass.binEdges)[0]; + fK0MassAxis = new TAxis(nK0MassBins, k0MassBins); + + o2::framework::AxisSpec axisLambdasMass = axisLambdaMass; + int nLambdaMassBins = axisLambdasMass.binEdges.size() - 1; + double* lambdaMassBins = &(axisLambdasMass.binEdges)[0]; + fLambdaMassAxis = new TAxis(nLambdaMassBins, lambdaMassBins); + + //********** Defining the regions ********** + // reference particles + fGFW->AddRegion("refN08", -0.8, -0.4, 1, 1); + fGFW->AddRegion("refP08", 0.4, 0.8, 1, 1); + + // phi + fGFW->AddRegion("poiNphi", -0.8, -0.4, 1 + nPhisPtMassBins, 2); + fGFW->AddRegion("olNphi", -0.8, -0.4, 1 + nPhisPtMassBins, 32); + + //********** Defining the correlations ********** + // reference particles + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Phi08Gap22", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2 2} refP08 {-2 -2}", "Phi08Gap24", kFALSE)); + + // pt differential pois + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2} refP08 {-2}", "Phi08Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2 2} refP08 {-2 -2}", "Phi08Gap24", kTRUE)); + + fGFW->CreateRegions(); + } + + // This function is specific for Phi flow: will be made more generic in further iterations + template + void fillResoProfile(const GFW::CorrConfig& corrconf, const ConstStr& tarName, const double& cent) + { + double dnx, val; + if (!corrconf.pTDif) { + dnx = fGFW->Calculate(corrconf, 0, kTRUE).real(); + if (dnx == 0) + return; + val = fGFW->Calculate(corrconf, 0, kFALSE).real() / dnx; + if (std::fabs(val) < 1) + histos.fill(tarName, cent, val, dnx); + return; + } + for (int i = 1; i <= fPtAxis->GetNbins(); i++) { + for (int j = 1; j <= fPhiMassAxis->GetNbins(); j++) { + dnx = fGFW->Calculate(corrconf, ((i - 1) * fPhiMassAxis->GetNbins()) + (j - 1), kTRUE).real(); + if (dnx == 0) + continue; + val = fGFW->Calculate(corrconf, ((i - 1) * fPhiMassAxis->GetNbins()) + (j - 1), kFALSE).real() / dnx; + if (std::fabs(val) < 1) + histos.fill(tarName, fPtAxis->GetBinCenter(i), fPhiMassAxis->GetBinCenter(j), cent, val, dnx); + } + } + return; } // Cosine pointing angle cut @@ -248,7 +336,7 @@ struct ResonancesGfwFlow { } template - void resurrectKaon(TTrack trackplus, TTrack trackminus, vector plusdaug, vector minusdaug, vector mom, double plusmass, const ConstStr& hist, const double cent) + void resurrectPhi(TTrack trackplus, TTrack trackminus, vector plusdaug, vector minusdaug, vector mom, double plusmass, const ConstStr& hist, const double cent, float weff, float wacc) { for (auto const& [partplus, partminus] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(trackplus, trackminus))) { if (getNsigmaPID(partplus) != 2) @@ -271,10 +359,20 @@ struct ResonancesGfwFlow { minusdaug = ROOT::Math::PxPyPzMVector(partminus.px(), partminus.py(), partminus.pz(), plusmass); mom = plusdaug + minusdaug; + double pt = mom.Pt(); + double invMass = mom.M(); + bool withinPtPOI = (cfgCutPtPOIMin < pt) && (pt < cfgCutPtPOIMax); // within POI pT range + bool withinPtRef = (cfgCutPtMin < pt) && (pt < cfgCutPtMax); + if (std::abs(mom.Rapidity()) < cfgRapidityCut) { - histos.fill(hist, mom.M(), mom.Pt(), cent); - histos.fill(HIST("hPhiPhi"), phiMom.Phi()); - histos.fill(HIST("hPhiEta"), phiMom.Eta()); + histos.fill(hist, invMass, pt, cent); + histos.fill(HIST("hPhiPhi"), mom.Phi()); + histos.fill(HIST("hPhiEta"), mom.Eta()); + + if (withinPtPOI) + fGFW->Fill(mom.Eta(), ((fPtAxis->FindBin(pt) - 1) * fPhiMassAxis->GetNbins()) + (fPhiMassAxis->FindBin(invMass) - 1), mom.Phi(), wacc * weff, 2); + if (withinPtPOI && withinPtRef) + fGFW->Fill(mom.Eta(), ((fPtAxis->FindBin(pt) - 1) * fPhiMassAxis->GetNbins()) + (fPhiMassAxis->FindBin(invMass) - 1), mom.Phi(), wacc * weff, 32); } } return; @@ -462,11 +560,22 @@ struct ResonancesGfwFlow { histos.fill(HIST("hVtxZ"), vtxz); histos.fill(HIST("hMult"), nTot); histos.fill(HIST("hCent"), cent); + fGFW->Clear(); + + float weff = 1, wacc = 1; + + for (auto const& track : tracks) { + double pt = track.pt(); + bool withinPtRef = (cfgCutPtMin < pt) && (pt < cfgCutPtMax); + + if (withinPtRef) + fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), wacc * weff, 1); + } auto posSlicedTracks = posTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); auto negSlicedTracks = negTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - resurrectKaon(posSlicedTracks, negSlicedTracks, kaonPlus, kaonMinus, phiMom, massKaPlus, HIST("hPhiMass_sparse"), cent); + resurrectPhi(posSlicedTracks, negSlicedTracks, kaonPlus, kaonMinus, phiMom, massKaPlus, HIST("hPhiMass_sparse"), cent, weff, wacc); for (auto const& v0s : V0s) { if (selectionLambda(collision, v0s) == true) @@ -476,6 +585,10 @@ struct ResonancesGfwFlow { } // End of v0 loop + fillResoProfile(corrconfigs.at(0), HIST("Phic22"), cent); + fillResoProfile(corrconfigs.at(1), HIST("Phic24"), cent); + fillResoProfile(corrconfigs.at(2), HIST("Phiv22pt"), cent); + fillResoProfile(corrconfigs.at(3), HIST("Phiv24pt"), cent); } // end of process }; From 53c9cc9aa8ddcb8b3de98ef3f49906c701db54c0 Mon Sep 17 00:00:00 2001 From: abilandz Date: Tue, 25 Feb 2025 22:55:33 +0100 Subject: [PATCH 0420/1650] =?UTF-8?q?[PWGCF]=20new=20series=20of=20qa=20pl?= =?UTF-8?q?ots,=20support=20for=20sp.=20histos,=20trivial=20labels,=20fix?= =?UTF-8?q?=20f=E2=80=A6=20(#10188)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Core/MuPa-Configurables.h | 11 +- .../Core/MuPa-DataMembers.h | 155 +- .../Core/MuPa-Enums.h | 54 +- .../Core/MuPa-GlobalConstants.h | 9 +- .../Core/MuPa-MemberFunctions.h | 2071 ++++++++++++++--- .../Tasks/multiparticle-correlations-ab.cxx | 1 + 6 files changed, 1892 insertions(+), 409 deletions(-) diff --git a/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h b/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h index 23be4a64bb0..785a62ff62e 100644 --- a/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h +++ b/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h @@ -46,12 +46,15 @@ struct : ConfigurableGroup { Configurable cfCheckUnderflowAndOverflow{"cfCheckUnderflowAndOverflow", false, "check and bail out if in event and particle histograms there are entries which went to underflow or overflow bins (use only locally)"}; Configurable cfRebin{"cfRebin", 1, "number of bins of selected heavy 2D histograms are devided with this number"}; Configurable cfFillQAEventHistograms2D{"cfFillQAEventHistograms2D", false, "if false, all QA 2D event histograms are not filled. if true, only the ones for which fBookQAEventHistograms2D[...] is true, are filled"}; - Configurable> cfBookQAEventHistograms2D{"cfBookQAEventHistograms2D", {"1-Multiplicity_vs_ReferenceMultiplicity", "1-Multiplicity_vs_NContributors", "1-Multiplicity_vs_Centrality", "1-Multiplicity_vs_Vertex_z", "1-Multiplicity_vs_Occupancy", "1-ReferenceMultiplicity_vs_NContributors", "1-ReferenceMultiplicity_vs_Centrality", "1-ReferenceMultiplicity_vs_Vertex_z", "1-ReferenceMultiplicity_vs_Occupancy", "1-NContributors_vs_Centrality", "1-NContributors_vs_Vertex_z", "1-NContributors_vs_Occupancy", "1-Centrality_vs_Vertex_z", "1-Centrality_vs_Occupancy", "0-Centrality_vs_ImpactParameter", "1-Vertex_z_vs_Occupancy", "0-MultNTracksPV_vs_MultNTracksGlobal", "1-CentFT0C_vs_CentFT0CVariant1", "1-eCentFT0C_vs_CentFT0M", "1-eCentFT0C_vs_CentFV0A", "0-CentFT0C_vs_CentNTPV", "0-CentFT0C_vs_CentNGlobal", "0-CentFT0M_vs_CentNTPV", "0-CentRun2V0M_vs_CentRun2SPDTracklets", "1-TrackOccupancyInTimeRange_vs_FT0COccupancyInTimeRange", "1-CurrentRunDuration_vs_InteractionRate"}, "book (1) or do not book (0) this QA 2D event histogram"}; + Configurable> cfBookQAEventHistograms2D{"cfBookQAEventHistograms2D", {"1-Multiplicity_vs_ReferenceMultiplicity", "1-Multiplicity_vs_NContributors", "1-Multiplicity_vs_Centrality", "1-Multiplicity_vs_Vertex_z", "1-Multiplicity_vs_Occupancy", "1-ReferenceMultiplicity_vs_NContributors", "1-ReferenceMultiplicity_vs_Centrality", "1-ReferenceMultiplicity_vs_Vertex_z", "1-ReferenceMultiplicity_vs_Occupancy", "1-NContributors_vs_Centrality", "1-NContributors_vs_Vertex_z", "1-NContributors_vs_Occupancy", "1-Centrality_vs_Vertex_z", "1-Centrality_vs_Occupancy", "0-Centrality_vs_ImpactParameter", "1-Vertex_z_vs_Occupancy", "0-MultNTracksPV_vs_MultNTracksGlobal", "1-CentFT0C_vs_CentFT0CVariant1", "1-CentFT0C_vs_CentFT0M", "1-CentFT0C_vs_CentFV0A", "0-CentFT0C_vs_CentNTPV", "0-CentFT0C_vs_CentNGlobal", "0-CentFT0M_vs_CentNTPV", "0-CentRun2V0M_vs_CentRun2SPDTracklets", "1-TrackOccupancyInTimeRange_vs_FT0COccupancyInTimeRange", "1-CurrentRunDuration_vs_InteractionRate"}, "book (1) or do not book (0) this QA 2D event histogram"}; Configurable cfFillQAParticleHistograms2D{"cfFillQAParticleHistograms2D", false, "if false, all QA 2D particle histograms are not filled. if true, only the ones for which fBookQAParticleHistograms2D[...] is true, are filled"}; Configurable> cfBookQAParticleHistograms2D{"cfBookQAParticleHistograms2D", {"1-Pt_vs_dcaXY"}, "book (1) or do not book (0) this QA 2D particle histogram"}; Configurable cfFillQAParticleEventHistograms2D{"cfFillQAParticleEventHistograms2D", false, "if false, all QA 2D particle event histograms are not filled. if true, only the ones for which fBookQAParticleEventHistograms2D[...] is true, are filled"}; Configurable> cfBookQAParticleEventHistograms2D{"cfBookQAParticleEventHistograms2D", {"1-CurrentRunDuration_vs_itsNCls", "1-CurrentRunDuration_vs_itsNClsNegEtaEbyE", "1-CurrentRunDuration_vs_itsNClsPosEtaEbyE", "1-CurrentRunDuration_vs_Eta0804EbyE", "1-CurrentRunDuration_vs_Eta0400EbyE", "1-CurrentRunDuration_vs_Eta0004EbyE", "1-CurrentRunDuration_vs_Eta0408EbyE", "1-CurrentRunDuration_vs_Pt0005EbyE", "1-CurrentRunDuration_vs_Pt0510EbyE", "1-CurrentRunDuration_vs_Pt1050EbyE"}, "book (1) or do not book (0) this QA 2D particle event histogram"}; + Configurable cfFillQACorrelationsVsHistograms2D{"cfFillQACorrelationsVsHistograms2D", true, "if false, all QA 2D histograms of this category are not filled. if true, only the ones for which fBookQACorrelationsVsHistograms2D[...] is true, are filled"}; + Configurable> cfBookQACorrelationsVsHistograms2D{"cfBookQACorrelationsVsHistograms2D", {"1-Correlations_vs_Multiplicity", "1-Correlations_vs_ReferenceMultiplicity", "1-Correlations_vs_Centrality", "1-Correlations_vs_Phi", "1-Correlations_vs_Pt", "1-Correlations_vs_Eta"}, "book (1) or do not book (0) this QA 2D histogram"}; + Configurable> cfQACorrelationsVsHistogramsMinMaxHarmonic{"cfQACorrelationsVsHistogramsMinMaxHarmonic", {1, 5}, "harmonics are filled for min <= harmonic < max"}; } cf_qa; // *) Event histograms: @@ -114,6 +117,9 @@ struct : ConfigurableGroup { Configurable> cfBookParticleHistograms{"cfBookParticleHistograms", {"1-Phi", "1-Pt", "1-Eta", "1-Charge", "1-tpcNClsFindable", "1-tpcNClsShared", "1-itsChi2NCl", "1-tpcNClsFound", "1-tpcNClsCrossedRows", "1-itsNCls", "1-itsNClsInnerBarrel", "1-tpcCrossedRowsOverFindableCls", "1-tpcFoundOverFindableCls", "1-tpcFractionSharedCls", "1-tpcChi2NCl", "1-dcaXY", "1-dcaZ", "0-PDG"}, "Book (1) or do not book (0) particle histogram"}; Configurable cfFillParticleHistograms2D{"cfFillParticleHistograms2D", false, "if false, all 2D particle histograms are not filled. if kTRUE, the ones for which fBookParticleHistograms2D[...] is kTRUE, are filled"}; Configurable> cfBookParticleHistograms2D{"cfBookParticleHistograms2D", {"1-Phi_vs_Pt", "1-Phi_vs_Eta"}, "Book (1) or do not book (0) 2D particle histograms"}; + Configurable cfRebinSparse{"cfRebinSparse", 1, "used only for all fixed-length bins which are implemented directly for sparse histograms (i.e. not inherited from results histograms)"}; + Configurable> cfBookParticleSparseHistograms{"cfBookParticleSparseHistograms", {"0-DWPhi", "0-DWPt", "0-DWEta"}, "Book (1) or do not book (0) particular category of sparse histograms"}; + // TBI 20250223 add eventually configurable for FillParticleSparseHistogramsDimension } cf_ph; // *) Particle cuts: @@ -210,6 +216,9 @@ struct : ConfigurableGroup { Configurable cfUseEtaWeights{"cfUseEtaWeights", false, "use or not eta weights"}; Configurable cfUseDiffPhiPtWeights{"cfUseDiffPhiPtWeights", false, "use or not differential phi(pt) weights"}; Configurable cfUseDiffPhiEtaWeights{"cfUseDiffPhiEtaWeights", false, "use or not differential phi(eta) weights"}; + Configurable> cfWhichDiffPhiWeights{"cfWhichDiffPhiWeights", {"1-wPhi", "1-wPt", "1-wEta", "1-wCharge", "1-wCentrality", "1-wVertex_z"}, "use (1) or do not use (0) differential phi weight for particular dimension. If only phi is set to 1, integrated phi weights are used. If phi is set to 0, ALL dimensions are switched off (yes!)"}; + Configurable> cfWhichDiffPtWeights{"cfWhichDiffPtWeights", {"1-wPt"}, "use (1) or do not use (0) differential pt weight for particular dimension. If only pt is set to 1, integrated pt weights are used. If pt is set to 0, ALL dimensions are switched off (yes!)"}; + Configurable> cfWhichDiffEtaWeights{"cfWhichDiffEtaWeights", {"1-wEta"}, "use (1) or do not use (0) differential eta weight for particular dimension. If only eta is set to 1, integrated eta weights are used. If eta is set to 0, ALL dimensions are switched off (yes!)"}; Configurable cfFileWithWeights{"cfFileWithWeights", "/home/abilandz/DatasetsO2/weights.root", "path to external ROOT file which holds all particle weights in O2 format"}; // for AliEn file prepend "/alice/cern.ch/", for CCDB prepend "/alice-ccdb.cern.ch" } cf_pw; diff --git a/PWGCF/MultiparticleCorrelations/Core/MuPa-DataMembers.h b/PWGCF/MultiparticleCorrelations/Core/MuPa-DataMembers.h index 16702f19706..ff0d65afce6 100644 --- a/PWGCF/MultiparticleCorrelations/Core/MuPa-DataMembers.h +++ b/PWGCF/MultiparticleCorrelations/Core/MuPa-DataMembers.h @@ -44,29 +44,29 @@ struct TaskConfiguration { // TBI 20250122 Therefore, when running in HL, it's important to configure manually cfTaskName to be exactly the same as subwagon name. // Can I automate this? TString fRunNumber = ""; // over which run number this task is executed - bool fRunNumberIsDetermined = kFALSE; // ensures that run number is determined in process() and propagated to already booked objects only once + bool fRunNumberIsDetermined = false; // ensures that run number is determined in process() and propagated to already booked objects only once int64_t fRunTime[eRunTime_N] = {0}; // stores permanently start of run, end of run, and run duration - bool fDryRun = kFALSE; // book all histos and run without storing and calculating anything - bool fVerbose = kFALSE; // print additional info during debugging, but not for simply utility function or function calls per particle (see next) - bool fVerboseUtility = kFALSE; // print additional info during debugging also for simply utility function, but not for function calls per particle (see next) - bool fVerboseForEachParticle = kFALSE; // print additional info during debugging, also for function calls per particle - bool fVerboseEventCounter = kTRUE; // print or not only event counter - bool fVerboseEventCut = kTRUE; // print or not only which event cut didn't survive - bool fPlainPrintout = kFALSE; // print in color or in plain (use the latter in HL) - bool fDoAdditionalInsanityChecks = kFALSE; // do additional insanity checks at run time, at the expense of losing a bit of performance + bool fDryRun = false; // book all histos and run without storing and calculating anything + bool fVerbose = false; // print additional info during debugging, but not for simply utility function or function calls per particle (see next) + bool fVerboseUtility = false; // print additional info during debugging also for simply utility function, but not for function calls per particle (see next) + bool fVerboseForEachParticle = false; // print additional info during debugging, also for function calls per particle + bool fVerboseEventCounter = true; // print or not only event counter + bool fVerboseEventCut = true; // print or not only which event cut didn't survive + bool fPlainPrintout = false; // print in color or in plain (use the latter in HL) + bool fDoAdditionalInsanityChecks = false; // do additional insanity checks at run time, at the expense of losing a bit of performance // (for instance, check if the run number in the current 'collision' is the same as run number in the first 'collision', etc.) - bool fInsanityCheckForEachParticle = kFALSE; // do additional insanity checks at run time for each particle, at the expense of losing a lot of performance. Use only during debugging. - bool fProcess[eProcess_N] = {kFALSE}; // set what to process. See enum eProcess for full description. Set via implicit variables within a PROCESS_SWITCH clause. + bool fInsanityCheckForEachParticle = false; // do additional insanity checks at run time for each particle, at the expense of losing a lot of performance. Use only during debugging. + bool fProcess[eProcess_N] = {false}; // set what to process. See enum eProcess for full description. Set via implicit variables within a PROCESS_SWITCH clause. TString fWhichProcess = "ProcessRec"; // dump in this variable which process was used UInt_t fRandomSeed = 0; // argument for TRandom3 constructor. By default it is 0 (seed is guaranteed to be unique in time and space) - bool fUseFisherYates = kFALSE; // algorithm used to randomize particle indices, set via configurable + bool fUseFisherYates = false; // algorithm used to randomize particle indices, set via configurable TArrayI* fRandomIndices = NULL; // array to store random indices obtained from Fisher-Yates algorithm int fFixedNumberOfRandomlySelectedTracks = -1; // use a fixed number of randomly selected particles in each event. It is set and applied, if > 0. Set to <=0 to ignore. - bool fUseStopwatch = kFALSE; // do some basing profiling with TStopwatch for where the execution time is going + bool fUseStopwatch = false; // do some basing profiling with TStopwatch for where the execution time is going TStopwatch* fTimer[eTimer_N] = {NULL}; // stopwatch, global (overal execution time) and local float fFloatingPointPrecision = 1.e-6; // two floats are the same if TMath::Abs(f1 - f2) < fFloatingPointPrecision (there is configurable for it) int fSequentialBailout = 0; // if fSequentialBailout > 0, then each fSequentialBailout events the function BailOut() is called. Can be used for real analysis and for IV. - bool fUseSpecificCuts = kFALSE; // apply after DefaultCuts() also hardwired analysis-specific cuts, determined via tc.fWhichSpecificCuts + bool fUseSpecificCuts = false; // apply after DefaultCuts() also hardwired analysis-specific cuts, determined via tc.fWhichSpecificCuts TString fWhichSpecificCuts = ""; // determine which set of analysis-specific cuts will be applied after DefaultCuts(). Use in combination with tc.fUseSpecificCuts } tc; // "tc" labels an instance of this group of variables. @@ -90,35 +90,43 @@ struct EventByEventQuantities { // Remark 1: I keep new histograms in this group, until I need them permanently in the analysis. Then, they are moved to EventHistograms or ParticleHistograms (yes, even if they are 2D). // Remark 2: All 2D histograms book as TH2F, due to "stmem error" in terminate (see .cxx for further details) struct QualityAssurance { - TList* fQAList = NULL; //! event-by-event // [reco, sim][before, after]. Type dimension is bin. + TList* fQACorrelationsVsList = NULL; //! TBI 20250215 this is obsolete and superseeded with fUseDiffPhiWeights, etc. + TH1D* fDiffWeightsHist[eDiffWeights_N][gMaxBinsDiffWeights] = {{NULL}}; // histograms holding differential weights [phipt,phieta][bin number] => TBI 20250222 obsolete + + // ** sparse histograms: + THnSparse* fDiffWeightsSparse[eDiffWeightCategory_N] = {NULL}; // multidimensional sparse histogram to hold all differential phi-weights (as a function of pt, eta, etc.). + // each dimension has its own enum category, e.g. 0 = eDWPhi => eDiffPhiWeights, 1 = eDWPt => eDiffPtWeights, etc. + bool fUseDiffPhiWeights[eDiffPhiWeights_N] = {false}; // use differential phi weights, see enum eDiffPhiWeights for supported dimensions + bool fUseDiffPtWeights[eDiffPtWeights_N] = {false}; // use differential pt weights, see enum eDiffPtWeights for supported dimensions + bool fUseDiffEtaWeights[eDiffEtaWeights_N] = {false}; // use differential eta weights, see enum eDiffEtaWeights for supported dimensions + // ... + int fDWdimension[eDiffWeightCategory_N] = {0}; // dimension of differential weight for each category in current analysis + TArrayD* fFindBinVector[eDiffWeightCategory_N] = {NULL}; // this is the vector I use to find bin TBI 20250224 finalie description + + TString fFileWithWeights = ""; // path to external ROOT file which holds all particle weights + bool fParticleWeightsAreFetched = false; // ensures that particle weights are fetched only once +} pw; // "pw" labels an instance of this group of histograms // *) Centrality weights: struct CentralityWeights { @@ -249,16 +282,16 @@ struct CentralityWeights { bool fUseCentralityWeights = false; // use centrality weights TH1D* fCentralityWeightsHist = NULL; // histograms holding centrality weights TString fFileWithCentralityWeights = ""; // path to external ROOT file which holds all centrality weights - bool fCentralityWeightsAreFetched = kFALSE; // ensures that centrality weights are fetched only once + bool fCentralityWeightsAreFetched = false; // ensures that centrality weights are fetched only once } cw; // *) Nested loops: struct NestedLoops { TList* fNestedLoopsList = NULL; // list to hold all nested loops objects TProfile* fNestedLoopsFlagsPro = NULL; // profile to hold all flags for nested loops - bool fCalculateNestedLoops = kFALSE; // calculate and store correlations with nested loops, as a cross-check - bool fCalculateCustomNestedLoops = kFALSE; // validate e-b-e all correlations with custom nested loop - bool fCalculateKineCustomNestedLoops = kFALSE; // validate e-b-e all differential (vs pt, eta, etc.) correlations with custom nested loop + bool fCalculateNestedLoops = false; // calculate and store correlations with nested loops, as a cross-check + bool fCalculateCustomNestedLoops = false; // validate e-b-e all correlations with custom nested loop + bool fCalculateKineCustomNestedLoops = false; // validate e-b-e all differential (vs pt, eta, etc.) correlations with custom nested loop int fMaxNestedLoop = -1; // if set to e.g. 4, all nested loops beyond that, e.g. 6-p and 8-p, are NOT calculated TProfile* fNestedLoopsPro[4][gMaxHarmonic][eAsFunctionOf_N] = {{{NULL}}}; //! multiparticle correlations from nested loops //! [2p=0,4p=1,6p=2,8p=3][n=1,n=2,...,n=gMaxHarmonic][0=integrated,1=vs. @@ -267,13 +300,13 @@ struct NestedLoops { TArrayD* ftaNestedLoopsKine[eqvectorKine_N][gMaxNoBinsKine][2] = {{{NULL}}}; //! e-b-e container for nested loops // [0=pT,1=eta][kine bin][0=angles;1=product of all weights] } nl; // "nl" labels an instance of this group of histograms -// *) Toy NUA (can be applied both in real data analysis and in analysis 'on-the-fly'): +// *) Toy NUA (can be applied both in real data analysis and in analysis 'on-the-fly', e.g. when running internal validation): struct NUA { TList* fNUAList = NULL; // list to hold all NUA objects TProfile* fNUAFlagsPro = NULL; // profile to hold all flags for NUA objects - bool fApplyNUAPDF[eNUAPDF_N] = {kFALSE}; // apply NUA to particular kine variable (see the corresponding enum eNUAPDF) - bool fUseDefaultNUAPDF[eNUAPDF_N] = {kTRUE}; // by default, use simple hardcoded expressions for NUA acceptance profile - TF1* fDefaultNUAPDF[eNUAPDF_N] = {NULL}; // default distributions used as pdfs to simulate events on-the-fly + bool fApplyNUAPDF[eNUAPDF_N] = {false}; // apply NUA to particular kine variable (see the corresponding enum eNUAPDF) + bool fUseDefaultNUAPDF[eNUAPDF_N] = {true}; // by default, use simple hardcoded expressions for NUA acceptance profile + TF1* fDefaultNUAPDF[eNUAPDF_N] = {NULL}; // default distributions used as pdfs to simulate NUA on-the-fly TH1D* fCustomNUAPDF[eNUAPDF_N] = {NULL}; // custom, user-supplied distributions used to simulate NUA TString* fCustomNUAPDFHistNames[eNUAPDF_N] = {NULL}; // these are the names of histograms holding custom NUA in an external file. There is a configurable for this one. TString fFileWithCustomNUA = ""; // path to external ROOT file which holds all histograms with custom NUA @@ -284,14 +317,14 @@ struct NUA { struct InternalValidation { TList* fInternalValidationList = NULL; // list to hold all objects for internal validation TProfile* fInternalValidationFlagsPro = NULL; // profile to hold all flags for internal validation - bool fUseInternalValidation = kFALSE; // use internal validation - bool fInternalValidationForceBailout = kFALSE; // force bailout in internal validation after either eNumberOfEvents or eSelectedEvents is reached. + bool fUseInternalValidation = false; // use internal validation + bool fInternalValidationForceBailout = false; // force bailout in internal validation after either eNumberOfEvents or eSelectedEvents is reached. // This is OK as long as I do not apply any event cuts in InternalValidation(). // Remember that for each real event, I do fnEventsInternalValidation events on-the-fly. // Can be used in combination with setting fSequentialBailout > 0. UInt_t fnEventsInternalValidation = 0; // how many on-the-fly events will be sampled for each real event, for internal validation TString* fHarmonicsOptionInternalValidation = NULL; // "constant", "correlated" or "persistent", see .cxx for full documentation - bool fRescaleWithTheoreticalInput = kFALSE; // if kTRUE, all measured correlators are rescaled with theoretical input, so that in profiles everything is at 1 + bool fRescaleWithTheoreticalInput = false; // if true, all measured correlators are rescaled with theoretical input, so that in profiles everything is at 1 TArrayD* fInternalValidationVnPsin[2] = {NULL}; // 0 = { v1, v2, ... }, 1 = { Psi1, Psi2, ... } int fMultRangeInternalValidation[2] = {0, 0}; // min and max values for uniform multiplicity distribution in on-the-fly analysis (convention: min <= M < max) } iv; @@ -300,12 +333,12 @@ struct InternalValidation { struct Test0 { TList* fTest0List = NULL; // list to hold all objects for Test0 TProfile* fTest0FlagsPro = NULL; // store all flags for Test0 - bool fCalculateTest0 = kFALSE; // calculate or not Test0 + bool fCalculateTest0 = false; // calculate or not Test0 TProfile* fTest0Pro[gMaxCorrelator][gMaxIndex][eAsFunctionOf_N] = {{{NULL}}}; //! [order][index][0=integrated,1=vs. multiplicity,2=vs. centrality,3=pT,4=eta] TString* fTest0Labels[gMaxCorrelator][gMaxIndex] = {{NULL}}; // all labels: k-p'th order is stored in k-1'th index. So yes, I also store 1-p bool fCalculateTest0AsFunctionOf[eAsFunctionOf_N] = {false}; //! [0=integrated,1=vs. multiplicity,2=vs. centrality,3=pT,4=eta,5=vs. occupancy, ...] TString fFileWithLabels = ""; // path to external ROOT file which specifies all labels of interest - bool fUseDefaultLabels = kFALSE; // use default labels hardwired in GetDefaultObjArrayWithLabels(), the choice is made with cfWhichDefaultLabels + bool fUseDefaultLabels = false; // use default labels hardwired in GetDefaultObjArrayWithLabels(), the choice is made with cfWhichDefaultLabels TString fWhichDefaultLabels = ""; // only for testing purposes, select one set of default labels, see GetDefaultObjArrayWithLabels for supported options TH1I* fTest0LabelsPlaceholder = NULL; // store all Test0 labels in this histogram } t0; // "t0" labels an instance of this group of histograms @@ -342,7 +375,7 @@ struct Results { // This is in addition also s // Remark: These settings apply to following categories fCorrelationsPro, fNestedLoopsPro, fTest0Pro, and fResultsHist float fResultsProFixedLengthBins[eAsFunctionOf_N][3] = {{0.}}; // [nBins,min,max] TArrayF* fResultsProVariableLengthBins[eAsFunctionOf_N] = {NULL}; // here for each variable in eAsFunctionOf I specify array holding bin boundaries - bool fUseResultsProVariableLengthBins[eAsFunctionOf_N] = {kFALSE}; // use or not variable-length bins + bool fUseResultsProVariableLengthBins[eAsFunctionOf_N] = {false}; // use or not variable-length bins TString fResultsProVariableLengthBinsString[eAsFunctionOf_N] = {""}; // TBI 20241110 this one is obsolete, can be removed TString fResultsProXaxisTitle[eAsFunctionOf_N] = {""}; // keep ordering in sync with enum eAsFunctionOf TString fResultsProRawName[eAsFunctionOf_N] = {""}; // this is how it appears simplified in the hist name when saved to the file diff --git a/PWGCF/MultiparticleCorrelations/Core/MuPa-Enums.h b/PWGCF/MultiparticleCorrelations/Core/MuPa-Enums.h index aae03bfdbe2..24431c8c907 100644 --- a/PWGCF/MultiparticleCorrelations/Core/MuPa-Enums.h +++ b/PWGCF/MultiparticleCorrelations/Core/MuPa-Enums.h @@ -83,12 +83,42 @@ enum eWeights { wPHI = 0, wETA = 2, eWeights_N }; -enum eDiffWeights { +enum eDiffWeights { // TBI 20250215 this is now obsolete, superseeded with more general implementation, see enums eDiffWeightCategory, eDiffPhiWeights, etc. wPHIPT = 0, wPHIETA, eDiffWeights_N }; +enum eDiffWeightCategory { + eDWPhi = 0, // corresponds to eDiffPhiWeights structure, here the fundamental 0-th axis never to be projected out is "phi" + eDWPt, // corresponds to eDiffPtWeights structure, here the fundamental 0-th axis never to be projected out is "pt" + eDWEta, // corresponds to eDiffEtaWeights structure, here the fundamental 0-th axis never to be projected out is "eta" + // ... + eDiffWeightCategory_N +}; + +enum eDiffPhiWeights { + wPhiPhiAxis = 0, // this is the main axis in this category, the only axis which shall never be projected out. If I project out all remaining axes, I shall recover the standard integrated phi weights + wPhiPtAxis, + wPhiEtaAxis, + wPhiChargeAxis, + wPhiCentralityAxis, + wPhiVertex_zAxis, + eDiffPhiWeights_N +}; + +enum eDiffPtWeights { + wPtPtAxis = 0, + // ... TBI 20250222 add all other axes on which differential pt weight could have non-trivial dependence, in the same spirit I did it above for phi weights in enum eDiffPhiWeights + eDiffPtWeights_N +}; + +enum eDiffEtaWeights { + wEtaEtaAxis = 0, + // ... TBI 20250222 add all other axes on which differential eta weight could have non-trivial dependence, in the same spirit I did it above for phi weights in enum eDiffPhiWeights + eDiffEtaWeights_N +}; + enum eVnPsin { eVn = 0, ePsin = 1 }; @@ -326,7 +356,7 @@ enum eQAParticleHistograms2D { enum eQAParticleEventHistograms2D { // In this category I do correlation vs. some-event-property. // The < ... > goes over all particles in that event. - // All < ... > over particles are calculated with helper TProfile + // All < ... > over particles are calculated with helper TProfile fQAParticleEventProEbyE // For instance: vs. current run duration eCurrentRunDuration_vs_itsNClsEbyE, eCurrentRunDuration_vs_itsNClsNegEtaEbyE, @@ -352,9 +382,29 @@ enum eQAParticleEventProEbyE { ePt0005EbyE, // in a given event for 0.0 < pt < 0.5 ePt0510EbyE, // in a given event for 0.5 < pt < 1.0 ePt1050EbyE, // in a given event for 1.0 < pt < 5.0 + eMeanPhi, // in an event TBI 20250214 I need to unify naming convention for <> with previous enums in above in the series, but okay... + eMeanPt, // in an event + eMeanEta, // in an event eQAParticleEventProEbyE_N }; +enum eQACorrelationsVsHistograms2D { + // In this category I correlate <2> vs. some-event-property. + // For instance: <2> vs. ref. mult + // <2> vs. , where is calculated from all particles in that event (so in this sense, it's an event property as well) + // Remark 1: If I would ever need the same thingie for <4>, <6>, etc., just introduce new dimension in 2D histogram + // Remark 2: All < ... > over particles are calculated with helper TProfile fQAParticleEventProEbyE + eCorrelations_vs_Multiplicity = 0, + eCorrelations_vs_ReferenceMultiplicity, + eCorrelations_vs_Centrality, + // ... + eCorrelations_vs_MeanPhi, + eCorrelations_vs_MeanPt, + eCorrelations_vs_MeanEta, + // ... + eQACorrelationsVsHistograms2D_N +}; + enum eReferenceMultiplicityEstimators { // Run 3: eMultTPC = 0, diff --git a/PWGCF/MultiparticleCorrelations/Core/MuPa-GlobalConstants.h b/PWGCF/MultiparticleCorrelations/Core/MuPa-GlobalConstants.h index a2d17790dd4..e7a31c445df 100644 --- a/PWGCF/MultiparticleCorrelations/Core/MuPa-GlobalConstants.h +++ b/PWGCF/MultiparticleCorrelations/Core/MuPa-GlobalConstants.h @@ -14,9 +14,10 @@ const int gMaxCorrelator = 12; const int gMaxHarmonic = 9; -const int gMaxIndex = 300; // per order, used only in Test0 -const int gMaxNoBinsKine = 1000; // max number of bins for differential q-vector -const int gMaxBinsDiffWeights = 100; // max number of bins for differential weights, see MakeWeights.C -const int gMaxNumberEtaSeparations = 9; // max number of different eta separations used to calculated 2p corr. with eta separations +const int gMaxIndex = 300; // per order, used only in Test0 +const int gMaxNoBinsKine = 1000; // max number of bins for differential q-vector +const int gMaxBinsDiffWeights = 100; // max number of bins for differential weights, see MakeWeights.C +const int gMaxNumberEtaSeparations = 9; // max number of different eta separations used to calculated 2p corr. with eta separations +const int gMaxNumberSparseDimensions = 10; // max number of dimensions in sparse histograms #endif // PWGCF_MULTIPARTICLECORRELATIONS_CORE_MUPA_GLOBALCONSTANTS_H_ diff --git a/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h b/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h index 79a6389322f..a2d9c0d3281 100644 --- a/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h +++ b/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h @@ -31,13 +31,13 @@ void BookBaseList() // a) Book base TList: TList* temp = new TList(); - temp->SetOwner(kTRUE); + temp->SetOwner(true); fBaseList.setObject(temp); // b) Store task configuration: fBasePro = new TProfile("fBasePro", "flags for the whole analysis", eConfiguration_N - 1, 0.5, static_cast(eConfiguration_N) - 0.5); // yes, eConfiguration_N - 1 and -0.5, because eConfiguration kicks off from 1 - fBasePro->SetStats(kFALSE); + fBasePro->SetStats(false); fBasePro->SetLineColor(eColor); fBasePro->SetFillColor(eFillColor); @@ -150,6 +150,7 @@ void DefaultConfiguration() tc.fVerboseUtility = cf_tc.cfVerboseUtility; tc.fVerboseForEachParticle = cf_tc.cfVerboseForEachParticle; tc.fVerboseEventCounter = cf_tc.cfVerboseEventCounter; + tc.fVerboseEventCut = cf_tc.cfVerboseEventCut; tc.fPlainPrintout = cf_tc.cfPlainPrintout; tc.fDoAdditionalInsanityChecks = cf_tc.cfDoAdditionalInsanityChecks; // Set automatically what to process, from an implicit variable "doprocessSomeProcessName" within a PROCESS_SWITCH clause: @@ -404,8 +405,65 @@ void DefaultConfiguration() pw.fUseWeights[wPHI] = cf_pw.cfUsePhiWeights; pw.fUseWeights[wPT] = cf_pw.cfUsePtWeights; pw.fUseWeights[wETA] = cf_pw.cfUseEtaWeights; - pw.fUseDiffWeights[wPHIPT] = cf_pw.cfUseDiffPhiPtWeights; - pw.fUseDiffWeights[wPHIETA] = cf_pw.cfUseDiffPhiEtaWeights; + pw.fUseDiffWeights[wPHIPT] = cf_pw.cfUseDiffPhiPtWeights; // TBI 20250222 obsolete + pw.fUseDiffWeights[wPHIETA] = cf_pw.cfUseDiffPhiEtaWeights; // TBI 20250222 obsolete + + // **) Differential phi weights: + auto lWhichDiffPhiWeights = cf_pw.cfWhichDiffPhiWeights.value; + if (lWhichDiffPhiWeights.size() != eDiffPhiWeights_N) { + LOGF(info, "\033[1;31m lWhichDiffPhiWeights.size() = %d\033[0m", lWhichDiffPhiWeights.size()); + LOGF(info, "\033[1;31m eDiffPhiWeights_N = %d\033[0m", static_cast(eDiffPhiWeights_N)); + LOGF(fatal, "\033[1;31m%s at line %d : Mismatch in the number of flags in configurable cfWhichDiffPhiWeights, and number of entries in enum eDiffPhiWeights_N \n \033[0m", __FUNCTION__, __LINE__); + } + for (int dpw = 0; dpw < eDiffPhiWeights_N; dpw++) { // "differential phi weight" + if (TString(lWhichDiffPhiWeights[dpw]).Contains("wPhi")) { + pw.fUseDiffPhiWeights[wPhiPhiAxis] = Alright(lWhichDiffPhiWeights[dpw]); // if I pass "1-Phi" => true, "0-Phi" => false + } else if (TString(lWhichDiffPhiWeights[dpw]).Contains("wPt")) { + pw.fUseDiffPhiWeights[wPhiPtAxis] = Alright(lWhichDiffPhiWeights[dpw]) && pw.fUseDiffPhiWeights[wPhiPhiAxis]; // I chain here with wPhiPhiAxis , so that I can switch off all differential phi weights, if phi itself is not set to true + } else if (TString(lWhichDiffPhiWeights[dpw]).Contains("wEta")) { + pw.fUseDiffPhiWeights[wPhiEtaAxis] = Alright(lWhichDiffPhiWeights[dpw]) && pw.fUseDiffPhiWeights[wPhiPhiAxis]; + } else if (TString(lWhichDiffPhiWeights[dpw]).Contains("wCharge")) { + pw.fUseDiffPhiWeights[wPhiChargeAxis] = Alright(lWhichDiffPhiWeights[dpw]) && pw.fUseDiffPhiWeights[wPhiPhiAxis]; + } else if (TString(lWhichDiffPhiWeights[dpw]).Contains("wCentrality")) { + pw.fUseDiffPhiWeights[wPhiCentralityAxis] = Alright(lWhichDiffPhiWeights[dpw]) && pw.fUseDiffPhiWeights[wPhiPhiAxis]; + } else if (TString(lWhichDiffPhiWeights[dpw]).Contains("wVertex_z")) { + pw.fUseDiffPhiWeights[wPhiVertex_zAxis] = Alright(lWhichDiffPhiWeights[dpw]) && pw.fUseDiffPhiWeights[wPhiPhiAxis]; + } else { + LOGF(fatal, "\033[1;31m%s at line %d : The setting %s in configurable cfWhichDiffPhiWeights is not supported yet. See enum eDiffPhiWeights . \n \033[0m", __FUNCTION__, __LINE__, TString(lWhichDiffPhiWeights[dpw]).Data()); + } + } + + // **) Differential pt weights: + auto lWhichDiffPtWeights = cf_pw.cfWhichDiffPtWeights.value; + if (lWhichDiffPtWeights.size() != eDiffPtWeights_N) { + LOGF(info, "\033[1;31m lWhichDiffPtWeights.size() = %d\033[0m", lWhichDiffPtWeights.size()); + LOGF(info, "\033[1;31m eDiffPtWeights_N = %d\033[0m", static_cast(eDiffPtWeights_N)); + LOGF(fatal, "\033[1;31m%s at line %d : Mismatch in the number of flags in configurable cfWhichDiffPtWeights, and number of entries in enum eDiffPtWeights_N \n \033[0m", __FUNCTION__, __LINE__); + } + for (int dpw = 0; dpw < eDiffPtWeights_N; dpw++) { // "differential pt weight" + if (TString(lWhichDiffPtWeights[dpw]).Contains("wPt")) { + pw.fUseDiffPtWeights[wPtPtAxis] = Alright(lWhichDiffPtWeights[dpw]); // if I pass "1-Pt" => true, "0-Pt" => false + } else { // ... TBI 20250222 add support for other dimensions of differential pt weights, in the same spirit i did it for differential phi weights + LOGF(fatal, "\033[1;31m%s at line %d : The setting %s in configurable cfWhichDiffPtWeights is not supported yet. See enum eDiffPtWeights . \n \033[0m", __FUNCTION__, __LINE__, TString(lWhichDiffPtWeights[dpw]).Data()); + } + } + + // **) Differential eta weights: + auto lWhichDiffEtaWeights = cf_pw.cfWhichDiffEtaWeights.value; + if (lWhichDiffEtaWeights.size() != eDiffEtaWeights_N) { + LOGF(info, "\033[1;31m lWhichDiffEtaWeights.size() = %d\033[0m", lWhichDiffEtaWeights.size()); + LOGF(info, "\033[1;31m eDiffEtaWeights_N = %d\033[0m", static_cast(eDiffEtaWeights_N)); + LOGF(fatal, "\033[1;31m%s at line %d : Mismatch in the number of flags in configurable cfWhichDiffEtaWeights, and number of entries in enum eDiffEtaWeights_N \n \033[0m", __FUNCTION__, __LINE__); + } + for (int dpw = 0; dpw < eDiffEtaWeights_N; dpw++) { // "differential eta weight" + if (TString(lWhichDiffEtaWeights[dpw]).Contains("wEta")) { + pw.fUseDiffEtaWeights[wEtaEtaAxis] = Alright(lWhichDiffEtaWeights[dpw]); // if I pass "1-Eta" => true, "0-Eta" => false + } else { // ... TBI 20250222 add support for other dimensions of differential eta weights, in the same spirit i did it for differential phi weights + LOGF(fatal, "\033[1;31m%s at line %d : The setting %s in configurable cfWhichDiffEtaWeights is not supported yet. See enum eDiffEtaWeights . \n \033[0m", __FUNCTION__, __LINE__, TString(lWhichDiffEtaWeights[dpw]).Data()); + } + } + + // **) File holding all particle weights: pw.fFileWithWeights = cf_pw.cfFileWithWeights; // *) Centrality weights: @@ -607,8 +665,6 @@ void DefaultConfiguration() qa.fQAParticleEventHistogramsName2D[eCurrentRunDuration_vs_Pt0510EbyE] = TString::Format("%s_vs_%s", eh.fEventHistogramsName[eCurrentRunDuration].Data(), TString(ph.fParticleHistogramsName[ePt].Data()).Append("0510EbyE").Data()).Data(); // TBI 20241214 time will tell if this Append() is safe enough... Remember that Append works in-place qa.fQAParticleEventHistogramsName2D[eCurrentRunDuration_vs_Pt1050EbyE] = TString::Format("%s_vs_%s", eh.fEventHistogramsName[eCurrentRunDuration].Data(), TString(ph.fParticleHistogramsName[ePt].Data()).Append("1050EbyE").Data()).Data(); // TBI 20241214 time will tell if this Append() is safe enough... Remember that Append works in-place - // ... - // ***) Quick insanity check that all names are set: for (int t = 0; t < eQAParticleEventHistograms2D_N; t++) { if (qa.fQAParticleEventHistogramsName2D[t].EqualTo("")) { @@ -616,6 +672,35 @@ void DefaultConfiguration() } } + // **) Names of QA 2D "correlations vs." histograms: + qa.fQACorrelationsVsHistogramsName2D[eCorrelations_vs_Multiplicity] = TString::Format("%s_vs_%s", "Correlations", eh.fEventHistogramsName[eMultiplicity].Data()).Data(); + qa.fQACorrelationsVsHistogramsName2D[eCorrelations_vs_ReferenceMultiplicity] = TString::Format("%s_vs_%s", "Correlations", eh.fEventHistogramsName[eReferenceMultiplicity].Data()).Data(); + qa.fQACorrelationsVsHistogramsName2D[eCorrelations_vs_Centrality] = TString::Format("%s_vs_%s", "Correlations", eh.fEventHistogramsName[eCentrality].Data()).Data(); + // ... + qa.fQACorrelationsVsHistogramsName2D[eCorrelations_vs_MeanPhi] = TString::Format("%s_vs_%s", "Correlations", ph.fParticleHistogramsName[ePhi].Data()).Data(); + qa.fQACorrelationsVsHistogramsName2D[eCorrelations_vs_MeanPt] = TString::Format("%s_vs_%s", "Correlations", ph.fParticleHistogramsName[ePt].Data()).Data(); + qa.fQACorrelationsVsHistogramsName2D[eCorrelations_vs_MeanEta] = TString::Format("%s_vs_%s", "Correlations", ph.fParticleHistogramsName[eEta].Data()).Data(); + // ... + + // ***) Quick insanity check that all names are set: + for (int t = 0; t < eQACorrelationsVsHistograms2D_N; t++) { + if (qa.fQACorrelationsVsHistogramsName2D[t].EqualTo("")) { + LOGF(fatal, "\033[1;31m%s at line %d : qa.fQACorrelationsVsHistogramsName2D[%d] is not set, check corresponding enum eQACorrelationsVsHistograms2D \033[0m", __FUNCTION__, __LINE__, t); + } + } + + // **) Names and titles of all categories of sparse histograms: + ph.fParticleSparseHistogramsName[eDWPhi] = "fParticleSparseHistograms_DWPhi"; + ph.fParticleSparseHistogramsTitle[eDWPhi] = "sparse histogram for differential #phi weights,"; + + ph.fParticleSparseHistogramsName[eDWPt] = "fParticleSparseHistograms_DWPt"; + ph.fParticleSparseHistogramsTitle[eDWPt] = "sparse histogram for differential p_{T} weights,"; + + ph.fParticleSparseHistogramsName[eDWEta] = "fParticleSparseHistograms_DWEta"; + ph.fParticleSparseHistogramsTitle[eDWEta] = "sparse histogram for differential #eta weights,"; + + // ... + // ** Eta separations: es.fCalculateEtaSeparations = cf_es.cfCalculateEtaSeparations; es.fCalculateEtaSeparationsAsFunctionOf[AFO_INTEGRATED] = cf_es.cfCalculateEtaSeparationsAsFunctionOfIntegrated && es.fCalculateEtaSeparations; @@ -674,7 +759,7 @@ bool Alright(TString s) LOGF(info, "\033[1;32m TString s = %s\033[0m", s.Data()); } - bool returnValue = kFALSE; + bool returnValue = false; // a) Insanity check on the format: TObjArray* oa = s.Tokenize("-"); @@ -690,10 +775,10 @@ bool Alright(TString s) // Algorithm: I split "0-someName" or "1-someName" with respect to "-" as a field separator, and check what is in the 1st field. if (TString(oa->At(0)->GetName()).EqualTo("0")) { delete oa; - returnValue = kFALSE; + returnValue = false; } else if (TString(oa->At(0)->GetName()).EqualTo("1")) { delete oa; - returnValue = kTRUE; + returnValue = true; } else { LOGF(fatal, "\033[1;31m%s at line %d : string expected in this function must be formatted as \"0-someName\" or \"1-someName\" => s = %s\033[0m", __FUNCTION__, __LINE__, s.Data()); } @@ -716,14 +801,15 @@ void DefaultBooking() // b) Event histograms 2D; // c) Particle histograms 1D; // d) Particle histograms 2D; - // e) QA; + // e) Particle sparse histograms; + // f) QA. if (tc.fVerbose) { StartFunction(__FUNCTION__); } // a) Event histograms 1D: - // By default all event histograms are booked. Set this flag to kFALSE to switch off booking of all event histograms: + // By default all event histograms are booked. Set this flag to false to switch off booking of all event histograms: eh.fFillEventHistograms = cf_eh.cfFillEventHistograms; // *) By default all event histograms are booked. If you do not want particular event histogram to be booked, @@ -768,7 +854,7 @@ void DefaultBooking() // ... // c) Particle histograms 1D: - // By default all 1D particle histograms are booked. Set this flag to kFALSE to switch off booking of all 1D particle histograms: + // By default all 1D particle histograms are booked. Set this flag to false to switch off booking of all 1D particle histograms: ph.fFillParticleHistograms = cf_ph.cfFillParticleHistograms; // *) If you do not want particular particle histogram to be booked, use configurable array cfBookParticleHistograms, where you can specify flags 1 (book) or 0 (do not book). @@ -812,7 +898,7 @@ void DefaultBooking() // Remark #2: Nothing special here for ePtDependentDCAxyParameterization, because that is a string. // d) Particle histograms 2D: - // By default all 2D particle histograms are booked. Set this flag to kFALSE to switch off booking of all 2D particle histograms: + // By default all 2D particle histograms are booked. Set this flag to false to switch off booking of all 2D particle histograms: ph.fFillParticleHistograms2D = cf_ph.cfFillParticleHistograms2D; // If you do not want particular 2D particle histogram to be booked, use configurable array cfBookParticleHistograms2D, where you can specify flags 1 (book) or 0 (do not book). @@ -838,7 +924,36 @@ void DefaultBooking() ph.fBookParticleHistograms2D[ePhiPt] = Alright(lBookParticleHistograms2D[ePhiPt]) && ph.fFillParticleHistograms2D; ph.fBookParticleHistograms2D[ePhiEta] = Alright(lBookParticleHistograms2D[ePhiEta]) && ph.fFillParticleHistograms2D; - // e) QA: + // e) Particle sparse histograms: + ph.fRebinSparse = cf_ph.cfRebinSparse; + + // *) Categories of sparse histograms: + auto lBookParticleSparseHistograms = cf_ph.cfBookParticleSparseHistograms.value; // fill or not particulat category of sparse histograms + if (lBookParticleSparseHistograms.size() != eDiffWeightCategory_N) { + LOGF(info, "\033[1;31m lBookParticleSparseHistograms.size() = %d\033[0m", lBookParticleSparseHistograms.size()); + LOGF(info, "\033[1;31m eDiffWeightCategory_N) = %d\033[0m", static_cast(eDiffWeightCategory_N)); + LOGF(fatal, "in function \033[1;31m%s at line %d Mismatch in the number of flags in configurable cfBookParticleSparseHistograms, and number of entries in enum eDiffWeightCategory_N \n \033[0m", __FUNCTION__, __LINE__); + } + + // *) Insanity check on the content and ordering in the initialization in configurable cfBookParticleSparseHistograms: + // TBI 20241109 I do not need this in fact, I can automate initialization even without ordering in configurable, but it feels with the ordering enforced, it's much safer. + // Algorithm: From [01]-DWPhi I tokenize with respect to "-" the 2nd field, and check if e.g. fParticleSparseHistogramsName_DWPhi ends with it. + for (int name = 0; name < eDiffWeightCategory_N; name++) { + TObjArray* oa = TString(lBookParticleSparseHistograms[name]).Tokenize("-"); + if (!oa) { + LOGF(fatal, "\033[1;31m%s at line %d : name = %s\033[0m", __FUNCTION__, __LINE__, TString(lBookParticleSparseHistograms[name]).Data()); + } + if (!ph.fParticleSparseHistogramsName[name].EndsWith(oa->At(1)->GetName())) { + LOGF(fatal, "\033[1;31m%s at line %d : Wrong content or ordering of contents in configurable cfBookParticleSparseHistograms => name = %d, lBookParticleSparseHistograms[name] = \"%s\", ph.fParticleSparseHistogramsName[name] = \"%s\" \n Check if you are using an up to date tag. \033[0m", __FUNCTION__, __LINE__, name, TString(lBookParticleSparseHistograms[name]).Data(), ph.fParticleSparseHistogramsName[name].Data()); + } + delete oa; + } + // Remark: below exceptionally I do not append the common flag with &&, since each of these flags already stands for one category + ph.fBookParticleSparseHistograms[eDWPhi] = Alright(lBookParticleSparseHistograms[eDWPhi]); + ph.fBookParticleSparseHistograms[eDWPt] = Alright(lBookParticleSparseHistograms[eDWPt]); + ph.fBookParticleSparseHistograms[eDWEta] = Alright(lBookParticleSparseHistograms[eDWEta]); + + // f) QA: // **) QA 2D event histograms: qa.fFillQAEventHistograms2D = cf_qa.cfFillQAEventHistograms2D; @@ -947,6 +1062,46 @@ void DefaultBooking() qa.fBookQAParticleEventHistograms2D[eCurrentRunDuration_vs_Pt0510EbyE] = Alright(lBookQAParticleEventHistograms2D[eCurrentRunDuration_vs_Pt0510EbyE]) && qa.fFillQAParticleEventHistograms2D; qa.fBookQAParticleEventHistograms2D[eCurrentRunDuration_vs_Pt1050EbyE] = Alright(lBookQAParticleEventHistograms2D[eCurrentRunDuration_vs_Pt1050EbyE]) && qa.fFillQAParticleEventHistograms2D; + // **) QA 2D "correlations vs." histograms: + qa.fFillQACorrelationsVsHistograms2D = cf_qa.cfFillQACorrelationsVsHistograms2D; + + // *) If you do not want particular 2D "correlations vs." histogram to be booked, use configurable array cfBookQACorrelationsVsHistograms2D, where you can specify flags 1 (book) or 0 (do not book). + // Ordering of the flags in that array is interpreted through ordering of enums in enum eQACorrelationsVsHistograms2D. + auto lBookQACorrelationsVsHistograms2D = cf_qa.cfBookQACorrelationsVsHistograms2D.value; // this is now the local version of that string array from configurable + if (lBookQACorrelationsVsHistograms2D.size() != eQACorrelationsVsHistograms2D_N) { + LOGF(info, "\033[1;31m lBookQACorrelationsVsHistograms2D.size() = %d\033[0m", lBookQACorrelationsVsHistograms2D.size()); + LOGF(info, "\033[1;31m eQACorrelationsVsHistograms2D_N = %d\033[0m", static_cast(eQACorrelationsVsHistograms2D_N)); + LOGF(fatal, "in function \033[1;31m%s at line %d Mismatch in the number of flags in configurable cfBookQACorrelationsVsHistograms2D, and number of entries in enum eCorrelationsVsHistograms2D \n \033[0m", __FUNCTION__, __LINE__); + } + + // *) Insanity check on the content and ordering of QA 2D "correlations vs." histograms in the initialization in configurable cfBookQACorrelationsVsHistograms2D: + // TBI 20240518 I do not need this in fact, I can automate initialization even without ordering in configurable, but it feels with the ordering enforced, it's much safer. + for (int name = 0; name < eQACorrelationsVsHistograms2D_N; name++) { + // TBI 20240518 I could implement even a strickter EqualTo instead of EndsWith, but then I need to tokenize, etc., etc. This shall be safe enough. + if (!TString(lBookQACorrelationsVsHistograms2D[name]).EndsWith(qa.fQACorrelationsVsHistogramsName2D[name].Data())) { + LOGF(fatal, "\033[1;31m%s at line %d : Wrong content or ordering of contents in configurable cfBookQACorrelationsVsHistograms2D => name = %d, lBookQACorrelationsVsHistograms2D[name] = \"%s\", qa.fCorrelationsVsHistogramsName2D[name] = \"%s\" \n Check if you are using an up to date tag. \033[0m", __FUNCTION__, __LINE__, name, TString(lBookQACorrelationsVsHistograms2D[name]).Data(), qa.fQACorrelationsVsHistogramsName2D[name].Data()); + } + } + + // I append "&& qa.fFillQACorrelationsVsHistograms2D" below, to switch off booking of all 2D "correlations vs." histograms with one common flag: + qa.fBookQACorrelationsVsHistograms2D[eCorrelations_vs_Multiplicity] = Alright(lBookQACorrelationsVsHistograms2D[eCorrelations_vs_Multiplicity]) && qa.fFillQACorrelationsVsHistograms2D; + qa.fBookQACorrelationsVsHistograms2D[eCorrelations_vs_ReferenceMultiplicity] = Alright(lBookQACorrelationsVsHistograms2D[eCorrelations_vs_ReferenceMultiplicity]) && qa.fFillQACorrelationsVsHistograms2D; + qa.fBookQACorrelationsVsHistograms2D[eCorrelations_vs_Centrality] = Alright(lBookQACorrelationsVsHistograms2D[eCorrelations_vs_Centrality]) && qa.fFillQACorrelationsVsHistograms2D; + // ..... + qa.fBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeanPhi] = Alright(lBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeanPhi]) && qa.fFillQACorrelationsVsHistograms2D; + qa.fBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeanPt] = Alright(lBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeanPt]) && qa.fFillQACorrelationsVsHistograms2D; + qa.fBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeanEta] = Alright(lBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeanEta]) && qa.fFillQACorrelationsVsHistograms2D; + // ..... + + // *) min and max harmonics for which this series of histograms will be booked: + auto lQACorrelationsVsHistogramsMinMaxHarmonic = cf_qa.cfQACorrelationsVsHistogramsMinMaxHarmonic.value; + qa.fQACorrelationsVsHistogramsMinMaxHarmonic[eMin] = lQACorrelationsVsHistogramsMinMaxHarmonic[eMin]; + qa.fQACorrelationsVsHistogramsMinMaxHarmonic[eMax] = lQACorrelationsVsHistogramsMinMaxHarmonic[eMax]; + // **) insanity check: + if (!(qa.fQACorrelationsVsHistogramsMinMaxHarmonic[eMin] < qa.fQACorrelationsVsHistogramsMinMaxHarmonic[eMax])) { + LOGF(fatal, "\033[1;31m%s at line %d : wrong setting for min and max harmonics: min = %d, max = %d \033[0m", __FUNCTION__, __LINE__, qa.fQACorrelationsVsHistogramsMinMaxHarmonic[eMin], qa.fQACorrelationsVsHistogramsMinMaxHarmonic[eMax]); + } + // ... if (tc.fVerbose) { @@ -963,13 +1118,13 @@ void DefaultBinning() // TBI 20240114 If some of these values are going to change frequently, add support for them in MuPa-Configurables.h, // in the same way I did it for DefaultCuts(). - // Remark: If + // At the moment, I added to configurables support only for binning of sparse histograms, because there memory managment is critical. // a) Default binning for event histograms; // b) Default binning for particle histograms 1D; // c) Default binning for particle histograms 2D; // d) Default binning for results histograms; - // e) Variable-length binning set via MuPa-Configurables.h. + // e) Variable-length binning for results histograms set via MuPa-Configurables.h. if (tc.fVerbose) { StartFunction(__FUNCTION__); @@ -1035,7 +1190,7 @@ void DefaultBinning() // b) Default binning for particle histograms 1D: ph.fParticleHistogramsBins[ePhi][0] = 360; ph.fParticleHistogramsBins[ePhi][1] = 0.; - ph.fParticleHistogramsBins[ePhi][2] = TMath::TwoPi(); + ph.fParticleHistogramsBins[ePhi][2] = o2::constants::math::TwoPI; ph.fParticleHistogramsBins[ePt][0] = 2000; ph.fParticleHistogramsBins[ePt][1] = 0.; @@ -1294,7 +1449,7 @@ void InitializeVariableLengthBins(eAsFunctionOf AFO) } // switch(AFO) // From this point onward, the code is the same for any AFO variable: - res.fUseResultsProVariableLengthBins[AFO] = kTRUE; + res.fUseResultsProVariableLengthBins[AFO] = true; if (lVariableLength_bins.size() < 2) { LOGF(fatal, "in function \033[1;31m%s at line %d => The array cfVariableLength_bins must have at least 2 entries \n \033[0m", __FUNCTION__, __LINE__); } @@ -1706,61 +1861,122 @@ void SpecificCuts(TString whichSpecificCuts) switch (specificCuts) { case eLHC23zzh: + + // In this branch I implement default cuts and settings for PbPb Run 3 datasets collected in 2023. + // If I change some cut here, keep in sync. with other branches (e.g. for 2024 data). + + // Event cuts: + ec.fUseEventCuts[eSel7] = false; + ec.fUseEventCuts[eSel8] = true; + ec.fUseEventCuts[eNoSameBunchPileup] = true; + ec.fUseEventCuts[eIsVertexITSTPC] = true; + ec.fUseEventCuts[eNoCollInTimeRangeStandard] = true; + ec.fUseEventCuts[eNoCollInTimeRangeStrict] = false; + ec.fUseEventCuts[eNoCollInRofStandard] = true; + ec.fUseEventCuts[eNoCollInRofStrict] = false; + + // Particle cuts: + pc.fUseParticleCuts[eitsNCls] = true; + pc.fdParticleCuts[eitsNCls][eMin] = 5.; + pc.fdParticleCuts[eitsNCls][eMax] = 1000.; + + pc.fUseParticleCuts[etpcNClsFound] = true; + pc.fdParticleCuts[etpcNClsFound][eMin] = 70.; + pc.fdParticleCuts[etpcNClsFound][eMax] = 1000.; + + pc.fUseParticleCuts[etpcNClsCrossedRows] = true; + pc.fdParticleCuts[etpcNClsCrossedRows][eMin] = 70.; + pc.fdParticleCuts[etpcNClsCrossedRows][eMax] = 1000.; + + pc.fUseParticleCuts[etpcCrossedRowsOverFindableCls] = true; + pc.fdParticleCuts[etpcCrossedRowsOverFindableCls][eMin] = 0.8; + pc.fdParticleCuts[etpcCrossedRowsOverFindableCls][eMax] = 1000.; + + pc.fUseParticleCuts[etpcFoundOverFindableCls] = true; + pc.fdParticleCuts[etpcFoundOverFindableCls][eMin] = 0.8; + pc.fdParticleCuts[etpcFoundOverFindableCls][eMax] = 1000.; + + pc.fUseParticleCuts[etpcFractionSharedCls] = true; + pc.fdParticleCuts[etpcFractionSharedCls][eMin] = -1000.; + pc.fdParticleCuts[etpcFractionSharedCls][eMax] = 0.4; + + pc.fUseParticleCuts[etpcChi2NCl] = true; + pc.fdParticleCuts[etpcChi2NCl][eMin] = -1000.; + pc.fdParticleCuts[etpcChi2NCl][eMax] = 4.0; + + pc.fUseParticleCuts[edcaXY] = true; + pc.fdParticleCuts[edcaXY][eMin] = -2.4; + pc.fdParticleCuts[edcaXY][eMax] = 2.4; + + pc.fUseParticleCuts[edcaZ] = true; + pc.fdParticleCuts[edcaZ][eMin] = -3.2; + pc.fdParticleCuts[edcaZ][eMax] = 3.2; + + pc.fUseParticleCuts[eisInAcceptanceTrack] = false; // see enum + pc.fUseParticleCuts[eisGlobalTrack] = false; // only for Run 2 + pc.fUseParticleCuts[eisPVContributor] = true; + + break; + case eLHC24ar: case eLHC24as: - // In this branch I implement default cuts and settings for Run 3 datasets: + // In this branch I implement default cuts and settings for PbPb Run 3 datasets collected in 2024: + // If I change some cut here, keep in sync. with other branches (e.g. for 2023 data). + // As of 20250207, all cuts are the same as for 2023, expect that here I do NOT use eIsGoodZvtxFT0vsPV and eNoHighMultCollInPrevRof // Event cuts: - ec.fUseEventCuts[eSel7] = kFALSE; - ec.fUseEventCuts[eSel8] = kTRUE; - ec.fUseEventCuts[eNoSameBunchPileup] = kTRUE; - ec.fUseEventCuts[eIsVertexITSTPC] = kTRUE; - ec.fUseEventCuts[eNoCollInTimeRangeStandard] = kTRUE; - ec.fUseEventCuts[eNoCollInTimeRangeStrict] = kFALSE; - ec.fUseEventCuts[eNoCollInRofStandard] = kTRUE; - ec.fUseEventCuts[eNoCollInRofStrict] = kFALSE; + ec.fUseEventCuts[eSel7] = false; + ec.fUseEventCuts[eSel8] = true; + ec.fUseEventCuts[eNoSameBunchPileup] = true; + ec.fUseEventCuts[eIsVertexITSTPC] = true; + ec.fUseEventCuts[eNoCollInTimeRangeStandard] = true; + ec.fUseEventCuts[eNoCollInTimeRangeStrict] = false; + ec.fUseEventCuts[eNoCollInRofStandard] = true; + ec.fUseEventCuts[eNoCollInRofStrict] = false; + ec.fUseEventCuts[eIsGoodZvtxFT0vsPV] = false; // diff commpared to 2023 + ec.fUseEventCuts[eNoHighMultCollInPrevRof] = false; // diff commpared to 2023 // Particle cuts: - pc.fUseParticleCuts[eitsNCls] = kTRUE; + pc.fUseParticleCuts[eitsNCls] = true; pc.fdParticleCuts[eitsNCls][eMin] = 5.; pc.fdParticleCuts[eitsNCls][eMax] = 1000.; - pc.fUseParticleCuts[etpcNClsFound] = kTRUE; + pc.fUseParticleCuts[etpcNClsFound] = true; pc.fdParticleCuts[etpcNClsFound][eMin] = 70.; pc.fdParticleCuts[etpcNClsFound][eMax] = 1000.; - pc.fUseParticleCuts[etpcNClsCrossedRows] = kTRUE; + pc.fUseParticleCuts[etpcNClsCrossedRows] = true; pc.fdParticleCuts[etpcNClsCrossedRows][eMin] = 70.; pc.fdParticleCuts[etpcNClsCrossedRows][eMax] = 1000.; - pc.fUseParticleCuts[etpcCrossedRowsOverFindableCls] = kTRUE; + pc.fUseParticleCuts[etpcCrossedRowsOverFindableCls] = true; pc.fdParticleCuts[etpcCrossedRowsOverFindableCls][eMin] = 0.8; pc.fdParticleCuts[etpcCrossedRowsOverFindableCls][eMax] = 1000.; - pc.fUseParticleCuts[etpcFoundOverFindableCls] = kTRUE; + pc.fUseParticleCuts[etpcFoundOverFindableCls] = true; pc.fdParticleCuts[etpcFoundOverFindableCls][eMin] = 0.8; pc.fdParticleCuts[etpcFoundOverFindableCls][eMax] = 1000.; - pc.fUseParticleCuts[etpcFractionSharedCls] = kTRUE; + pc.fUseParticleCuts[etpcFractionSharedCls] = true; pc.fdParticleCuts[etpcFractionSharedCls][eMin] = -1000.; pc.fdParticleCuts[etpcFractionSharedCls][eMax] = 0.4; - pc.fUseParticleCuts[etpcChi2NCl] = kTRUE; + pc.fUseParticleCuts[etpcChi2NCl] = true; pc.fdParticleCuts[etpcChi2NCl][eMin] = -1000.; pc.fdParticleCuts[etpcChi2NCl][eMax] = 4.0; - pc.fUseParticleCuts[edcaXY] = kTRUE; + pc.fUseParticleCuts[edcaXY] = true; pc.fdParticleCuts[edcaXY][eMin] = -2.4; pc.fdParticleCuts[edcaXY][eMax] = 2.4; - pc.fUseParticleCuts[edcaZ] = kTRUE; + pc.fUseParticleCuts[edcaZ] = true; pc.fdParticleCuts[edcaZ][eMin] = -3.2; pc.fdParticleCuts[edcaZ][eMax] = 3.2; - pc.fUseParticleCuts[eisInAcceptanceTrack] = kFALSE; // see enum - pc.fUseParticleCuts[eisGlobalTrack] = kFALSE; // only for Run 2 - pc.fUseParticleCuts[eisPVContributor] = kTRUE; + pc.fUseParticleCuts[eisInAcceptanceTrack] = false; // see enum + pc.fUseParticleCuts[eisGlobalTrack] = false; // only for Run 2 + pc.fUseParticleCuts[eisPVContributor] = true; break; @@ -1769,47 +1985,47 @@ void SpecificCuts(TString whichSpecificCuts) // In this branch I implement default cuts and settings for Run 2 datasets: // Event cuts: - // ec.fUseEventCuts[eSel7] = kTRUE; // TBI 20250115 ehen i procees in "Rec" some converted Run 2 MC, it removes 99% of events, see enum - ec.fUseEventCuts[eSel8] = kFALSE; - ec.fUseEventCuts[eNoSameBunchPileup] = kFALSE; - ec.fUseEventCuts[eIsGoodZvtxFT0vsPV] = kFALSE; - ec.fUseEventCuts[eIsVertexITSTPC] = kFALSE; - ec.fUseEventCuts[eNoCollInTimeRangeStrict] = kFALSE; - ec.fUseEventCuts[eNoCollInRofStrict] = kFALSE; - ec.fUseEventCuts[eNoHighMultCollInPrevRof] = kFALSE; - ec.fUseEventCuts[eNoCollInTimeRangeStandard] = kFALSE; - ec.fUseEventCuts[eNoCollInRofStrict] = kFALSE; - ec.fUseEventCuts[eNoCollInRofStandard] = kFALSE; - ec.fUseEventCuts[eNoCollInRofStandard] = kFALSE; - ec.fUseEventCuts[eIsGoodITSLayer3] = kFALSE; - ec.fUseEventCuts[eIsGoodITSLayer0123] = kFALSE; - ec.fUseEventCuts[eIsGoodITSLayersAll] = kFALSE; - - // ec.fUseEventCuts[eTrigger] = kTRUE; + // ec.fUseEventCuts[eSel7] = true; // TBI 20250115 ehen i procees in "Rec" some converted Run 2 MC, it removes 99% of events, see enum + ec.fUseEventCuts[eSel8] = false; + ec.fUseEventCuts[eNoSameBunchPileup] = false; + ec.fUseEventCuts[eIsGoodZvtxFT0vsPV] = false; + ec.fUseEventCuts[eIsVertexITSTPC] = false; + ec.fUseEventCuts[eNoCollInTimeRangeStrict] = false; + ec.fUseEventCuts[eNoCollInRofStrict] = false; + ec.fUseEventCuts[eNoHighMultCollInPrevRof] = false; + ec.fUseEventCuts[eNoCollInTimeRangeStandard] = false; + ec.fUseEventCuts[eNoCollInRofStrict] = false; + ec.fUseEventCuts[eNoCollInRofStandard] = false; + ec.fUseEventCuts[eNoCollInRofStandard] = false; + ec.fUseEventCuts[eIsGoodITSLayer3] = false; + ec.fUseEventCuts[eIsGoodITSLayer0123] = false; + ec.fUseEventCuts[eIsGoodITSLayersAll] = false; + + // ec.fUseEventCuts[eTrigger] = true; // ec.fsEventCuts[eTrigger] = "kINT7"; // TBI 20250115 cannot be used when i procees in "Rec" some converted Run 2 MC, see enum // ... // Particle cuts: - pc.fUseParticleCuts[eisInAcceptanceTrack] = kFALSE; // see enum - pc.fUseParticleCuts[etrackCutFlagFb1] = kFALSE; // only for Run 3 - pc.fUseParticleCuts[etrackCutFlagFb2] = kFALSE; // only for Run 3 - pc.fUseParticleCuts[eisPVContributor] = kFALSE; // only for Run 3 + pc.fUseParticleCuts[eisInAcceptanceTrack] = false; // see enum + pc.fUseParticleCuts[etrackCutFlagFb1] = false; // only for Run 3 + pc.fUseParticleCuts[etrackCutFlagFb2] = false; // only for Run 3 + pc.fUseParticleCuts[eisPVContributor] = false; // only for Run 3 // ... // The rest: - mupa.fCalculateCorrelationsAsFunctionOf[AFO_OCCUPANCY] = kFALSE; - mupa.fCalculateCorrelationsAsFunctionOf[AFO_INTERACTIONRATE] = kFALSE; - mupa.fCalculateCorrelationsAsFunctionOf[AFO_CURRENTRUNDURATION] = kFALSE; + mupa.fCalculateCorrelationsAsFunctionOf[AFO_OCCUPANCY] = false; + mupa.fCalculateCorrelationsAsFunctionOf[AFO_INTERACTIONRATE] = false; + mupa.fCalculateCorrelationsAsFunctionOf[AFO_CURRENTRUNDURATION] = false; - t0.fCalculateTest0AsFunctionOf[AFO_OCCUPANCY] = kFALSE; - t0.fCalculateTest0AsFunctionOf[AFO_INTERACTIONRATE] = kFALSE; - t0.fCalculateTest0AsFunctionOf[AFO_CURRENTRUNDURATION] = kFALSE; + t0.fCalculateTest0AsFunctionOf[AFO_OCCUPANCY] = false; + t0.fCalculateTest0AsFunctionOf[AFO_INTERACTIONRATE] = false; + t0.fCalculateTest0AsFunctionOf[AFO_CURRENTRUNDURATION] = false; - es.fCalculateEtaSeparationsAsFunctionOf[AFO_OCCUPANCY] = kFALSE; - es.fCalculateEtaSeparationsAsFunctionOf[AFO_INTERACTIONRATE] = kFALSE; - es.fCalculateEtaSeparationsAsFunctionOf[AFO_CURRENTRUNDURATION] = kFALSE; + es.fCalculateEtaSeparationsAsFunctionOf[AFO_OCCUPANCY] = false; + es.fCalculateEtaSeparationsAsFunctionOf[AFO_INTERACTIONRATE] = false; + es.fCalculateEtaSeparationsAsFunctionOf[AFO_CURRENTRUNDURATION] = false; // ... @@ -1980,11 +2196,11 @@ void InsanityChecksBeforeBooking() LOGF(fatal, "\033[1;31m%s at line %d : use either flat or pt-dependent DCAxy cut, but not both \033[0m", __FUNCTION__, __LINE__); } - // **) Insanity check on individual flags: Make sure that only one process is set to kTRUE. - // If 2 or more are kTRUE, then corresponding process function is executed over ALL data, then another process(...) function, etc. + // **) Insanity check on individual flags: Make sure that only one process is set to true. + // If 2 or more are true, then corresponding process function is executed over ALL data, then another process(...) function, etc. // Re-think this if it's possible to run different process(...)'s concurently over the same data. if (static_cast(tc.fProcess[eProcessRec]) + static_cast(tc.fProcess[eProcessRecSim]) + static_cast(tc.fProcess[eProcessSim]) + static_cast(tc.fProcess[eProcessRec_Run2]) + static_cast(tc.fProcess[eProcessRecSim_Run2]) + static_cast(tc.fProcess[eProcessSim_Run2]) + static_cast(tc.fProcess[eProcessRec_Run1]) + static_cast(tc.fProcess[eProcessRecSim_Run1]) + static_cast(tc.fProcess[eProcessSim_Run1]) > 1) { - LOGF(info, "\033[1;31m Only one flag can be kTRUE: tc.fProcess[eProcessRec] = %d, tc.fProcess[eProcessRecSim] = %d, tc.fProcess[eProcessSim] = %d, tc.fProcess[eProcessRec_Run2] = %d, tc.fProcess[eProcessRecSim_Run2] = %d, tc.fProcess[eProcessSim_Run2] = %d, tc.fProcess[eProcessRec_Run1] = %d, tc.fProcess[eProcessRecSim_Run1] = %d, tc.fProcess[eProcessSim_Run1] = %d \033[0m", static_cast(tc.fProcess[eProcessRec]), static_cast(tc.fProcess[eProcessRecSim]), static_cast(tc.fProcess[eProcessSim]), static_cast(tc.fProcess[eProcessRec_Run2]), static_cast(tc.fProcess[eProcessRecSim_Run2]), static_cast(tc.fProcess[eProcessSim_Run2]), static_cast(tc.fProcess[eProcessRec_Run1]), static_cast(tc.fProcess[eProcessRecSim_Run1]), static_cast(tc.fProcess[eProcessSim_Run1])); + LOGF(info, "\033[1;31m Only one flag can be true: tc.fProcess[eProcessRec] = %d, tc.fProcess[eProcessRecSim] = %d, tc.fProcess[eProcessSim] = %d, tc.fProcess[eProcessRec_Run2] = %d, tc.fProcess[eProcessRecSim_Run2] = %d, tc.fProcess[eProcessSim_Run2] = %d, tc.fProcess[eProcessRec_Run1] = %d, tc.fProcess[eProcessRecSim_Run1] = %d, tc.fProcess[eProcessSim_Run1] = %d \033[0m", static_cast(tc.fProcess[eProcessRec]), static_cast(tc.fProcess[eProcessRecSim]), static_cast(tc.fProcess[eProcessSim]), static_cast(tc.fProcess[eProcessRec_Run2]), static_cast(tc.fProcess[eProcessRecSim_Run2]), static_cast(tc.fProcess[eProcessSim_Run2]), static_cast(tc.fProcess[eProcessRec_Run1]), static_cast(tc.fProcess[eProcessRecSim_Run1]), static_cast(tc.fProcess[eProcessSim_Run1])); LOGF(fatal, "in function \033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); } @@ -1996,7 +2212,7 @@ void InsanityChecksBeforeBooking() // So if the upper limit is set to some number < 1e6, I want to bail out for that number of events. // TBI 20241011 this is a bit shaky, but nevermind now... if (!eh.fBookEventHistograms[eNumberOfEvents]) { - LOGF(fatal, "\033[1;31m%s at line %d : Bailout for max number of events cannot be done, unless eh.fBookEventHistograms[eNumberOfEvents] is kTRUE.\033[0m", __FUNCTION__, __LINE__); + LOGF(fatal, "\033[1;31m%s at line %d : Bailout for max number of events cannot be done, unless eh.fBookEventHistograms[eNumberOfEvents] is true.\033[0m", __FUNCTION__, __LINE__); } } @@ -2056,6 +2272,17 @@ void InsanityChecksBeforeBooking() LOGF(fatal, "\033[1;31m%s at line %d : set fSequentialBailout = %d either to 0 (not used), or to positive integer.\033[0m", __FUNCTION__, __LINE__, tc.fSequentialBailout); } + // **) Ensure that I do not spill over with number of dimensions in sparse histograms: + if (eDiffPhiWeights_N > gMaxNumberSparseDimensions) { + LOGF(fatal, "\033[1;31m%s at line %d : set eDiffPhiWeights_N = %d is bigger than gMaxNumberSparseDimensions = %d\033[0m", __FUNCTION__, __LINE__, static_cast(eDiffPhiWeights_N), gMaxNumberSparseDimensions); + } + if (eDiffPtWeights_N > gMaxNumberSparseDimensions) { + LOGF(fatal, "\033[1;31m%s at line %d : set eDiffPtWeights_N = %d is bigger than gMaxNumberSparseDimensions = %d\033[0m", __FUNCTION__, __LINE__, static_cast(eDiffPtWeights_N), gMaxNumberSparseDimensions); + } + if (eDiffEtaWeights_N > gMaxNumberSparseDimensions) { + LOGF(fatal, "\033[1;31m%s at line %d : set eDiffEtaWeights_N = %d is bigger than gMaxNumberSparseDimensions = %d\033[0m", __FUNCTION__, __LINE__, static_cast(eDiffEtaWeights_N), gMaxNumberSparseDimensions); + } + // b) Ensure that Run 1/2 specific cuts and flags are used only in Run 1/2 (both data and sim): // **) Ensure that eSel7 is used only for converted Run 2 and Run 1 (both data and sim): if (ec.fUseEventCuts[eSel7]) { @@ -2376,19 +2603,19 @@ bool Skip(int recOrSim) // *) If I am doing internal validation, I book and fill only eSim: if (iv.fUseInternalValidation) { if (recOrSim == eRec) { - return kTRUE; // yes, skip + return true; // yes, skip } else { - return kFALSE; // this is eSim, do not skip + return false; // this is eSim, do not skip } } // *) If I am analyzing only reconstructed data, do not book histos for simulated, and vice versa. // TBI 20240223 tc.fProcess[eProcessTest] is treated as tc.fProcess[eProcessRec], for the time being if ((tc.fProcess[eGenericRec] && recOrSim == eSim) || (tc.fProcess[eGenericSim] && recOrSim == eRec)) { - return kTRUE; // yes, skip + return true; // yes, skip } - return kFALSE; // by default, I do not skip anything + return false; // by default, I do not skip anything } // bool Skip(int recOrSim) @@ -2420,14 +2647,14 @@ void BookAndNestAllLists() // *) QA: qa.fQAList = new TList(); qa.fQAList->SetName("QA"); - qa.fQAList->SetOwner(kTRUE); + qa.fQAList->SetOwner(true); fBaseList->Add(qa.fQAList); // **) QA event histograms; if (qa.fFillQAEventHistograms2D) { qa.fQAEventList = new TList(); qa.fQAEventList->SetName("QAEvent"); - qa.fQAEventList->SetOwner(kTRUE); + qa.fQAEventList->SetOwner(true); qa.fQAList->Add(qa.fQAEventList); // yes, this one is nested within base QA TList } @@ -2435,7 +2662,7 @@ void BookAndNestAllLists() if (qa.fFillQAParticleHistograms2D) { qa.fQAParticleList = new TList(); qa.fQAParticleList->SetName("QAParticle"); - qa.fQAParticleList->SetOwner(kTRUE); + qa.fQAParticleList->SetOwner(true); qa.fQAList->Add(qa.fQAParticleList); // yes, this one is nested within base QA TList } @@ -2443,92 +2670,100 @@ void BookAndNestAllLists() if (qa.fFillQAParticleEventHistograms2D) { qa.fQAParticleEventList = new TList(); qa.fQAParticleEventList->SetName("QAParticleEvent"); - qa.fQAParticleEventList->SetOwner(kTRUE); + qa.fQAParticleEventList->SetOwner(true); qa.fQAList->Add(qa.fQAParticleEventList); // yes, this one is nested within base QA TList } + // **) QA "correlations vs." histograms; + if (qa.fFillQACorrelationsVsHistograms2D) { + qa.fQACorrelationsVsList = new TList(); + qa.fQACorrelationsVsList->SetName("QACorrelationsVs"); + qa.fQACorrelationsVsList->SetOwner(true); + qa.fQAList->Add(qa.fQACorrelationsVsList); // yes, this one is nested within base QA TList + } + // *) Event cuts: ec.fEventCutsList = new TList(); ec.fEventCutsList->SetName("EventCuts"); - ec.fEventCutsList->SetOwner(kTRUE); + ec.fEventCutsList->SetOwner(true); fBaseList->Add(ec.fEventCutsList); // *) Control event histograms: eh.fEventHistogramsList = new TList(); eh.fEventHistogramsList->SetName("EventHistograms"); - eh.fEventHistogramsList->SetOwner(kTRUE); + eh.fEventHistogramsList->SetOwner(true); fBaseList->Add(eh.fEventHistogramsList); // *) Particle cuts: pc.fParticleCutsList = new TList(); pc.fParticleCutsList->SetName("ParticleCuts"); - pc.fParticleCutsList->SetOwner(kTRUE); + pc.fParticleCutsList->SetOwner(true); fBaseList->Add(pc.fParticleCutsList); // *) Control particle histograms: ph.fParticleHistogramsList = new TList(); ph.fParticleHistogramsList->SetName("ParticleHistograms"); - ph.fParticleHistogramsList->SetOwner(kTRUE); + ph.fParticleHistogramsList->SetOwner(true); fBaseList->Add(ph.fParticleHistogramsList); // *) Q-vectors: qv.fQvectorList = new TList(); qv.fQvectorList->SetName("Q-vectors"); - qv.fQvectorList->SetOwner(kTRUE); + qv.fQvectorList->SetOwner(true); fBaseList->Add(qv.fQvectorList); // *) Correlations: mupa.fCorrelationsList = new TList(); mupa.fCorrelationsList->SetName("Correlations"); - mupa.fCorrelationsList->SetOwner(kTRUE); + mupa.fCorrelationsList->SetOwner(true); fBaseList->Add(mupa.fCorrelationsList); // *) Particle weights: pw.fWeightsList = new TList(); pw.fWeightsList->SetName("Weights"); - pw.fWeightsList->SetOwner(kTRUE); + pw.fWeightsList->SetOwner(true); fBaseList->Add(pw.fWeightsList); // *) Centrality weights: cw.fCentralityWeightsList = new TList(); cw.fCentralityWeightsList->SetName("CentralityWeights"); - cw.fCentralityWeightsList->SetOwner(kTRUE); + cw.fCentralityWeightsList->SetOwner(true); fBaseList->Add(cw.fCentralityWeightsList); // *) Nested loops: nl.fNestedLoopsList = new TList(); nl.fNestedLoopsList->SetName("NestedLoops"); - nl.fNestedLoopsList->SetOwner(kTRUE); + nl.fNestedLoopsList->SetOwner(true); fBaseList->Add(nl.fNestedLoopsList); // *) Toy NUA: nua.fNUAList = new TList(); nua.fNUAList->SetName("ToyNUA"); - nua.fNUAList->SetOwner(kTRUE); + nua.fNUAList->SetOwner(true); fBaseList->Add(nua.fNUAList); // *) Internal validation: iv.fInternalValidationList = new TList(); iv.fInternalValidationList->SetName("InternalValidation"); - iv.fInternalValidationList->SetOwner(kTRUE); + iv.fInternalValidationList->SetOwner(true); fBaseList->Add(iv.fInternalValidationList); // *) Test0: t0.fTest0List = new TList(); t0.fTest0List->SetName("Test0"); - t0.fTest0List->SetOwner(kTRUE); + t0.fTest0List->SetOwner(true); fBaseList->Add(t0.fTest0List); // *) Eta separations: es.fEtaSeparationsList = new TList(); es.fEtaSeparationsList->SetName("EtaSeparations"); - es.fEtaSeparationsList->SetOwner(kTRUE); + es.fEtaSeparationsList->SetOwner(true); fBaseList->Add(es.fEtaSeparationsList); // *) Results: res.fResultsList = new TList(); res.fResultsList->SetName("Results"); - res.fResultsList->SetOwner(kTRUE); + res.fResultsList->SetOwner(true); fBaseList->Add(res.fResultsList); if (tc.fVerbose) { @@ -2549,7 +2784,8 @@ void BookQAHistograms() // b) Common local variables; // c) Book specific QA 2D event histograms; // d) Book specific QA 2D particle histograms; - // e) Book specific QA 2D particle event histograms. + // e) Book specific QA 2D particle event histograms; + // f) Book specific QA 2D "correlations vs." histograms. if (tc.fVerbose) { StartFunction(__FUNCTION__); @@ -2568,8 +2804,8 @@ void BookQAHistograms() } // a) Book the profile holding flags: - qa.fQAHistogramsPro = new TProfile("fQAHistogramsPro", "flags for QA histograms", 5, 0., 5.); - qa.fQAHistogramsPro->SetStats(kFALSE); + qa.fQAHistogramsPro = new TProfile("fQAHistogramsPro", "flags for QA histograms", 6, 0., 6.); + qa.fQAHistogramsPro->SetStats(false); qa.fQAHistogramsPro->SetLineColor(eColor); qa.fQAHistogramsPro->SetFillColor(eFillColor); qa.fQAHistogramsPro->GetXaxis()->SetBinLabel(1, "fCheckUnderflowAndOverflow"); @@ -2580,8 +2816,10 @@ void BookQAHistograms() qa.fQAHistogramsPro->Fill(2.5, static_cast(qa.fFillQAParticleHistograms2D)); qa.fQAHistogramsPro->GetXaxis()->SetBinLabel(4, "fFillQAParticleEventHistograms2D"); qa.fQAHistogramsPro->Fill(3.5, static_cast(qa.fFillQAParticleEventHistograms2D)); - qa.fQAHistogramsPro->GetXaxis()->SetBinLabel(5, "fRebin"); - qa.fQAHistogramsPro->Fill(4.5, static_cast(qa.fRebin)); + qa.fQAHistogramsPro->GetXaxis()->SetBinLabel(5, "fFillQACorrelationsVsHistograms2D"); + qa.fQAHistogramsPro->Fill(4.5, static_cast(qa.fFillQACorrelationsVsHistograms2D)); + qa.fQAHistogramsPro->GetXaxis()->SetBinLabel(6, "fRebin"); + qa.fQAHistogramsPro->Fill(5.5, static_cast(qa.fRebin)); // ... @@ -2911,8 +3149,8 @@ void BookQAHistograms() } qa.fQAEventHistograms2D[t][rs][ba] = new TH2F( - Form("fQAEventHistograms2D[%s][%s][%s]", qa.fEventHistogramsName2D[t].Data(), gc.srs[rs].Data(), gc.sba[ba].Data()), - Form("%s, %s, %s", "__RUN_NUMBER__", gc.srs_long[rs].Data(), gc.sba_long[ba].Data()), // __RUN_NUMBER__ is handled in PropagateRunNumber(...) + TString::Format("fQAEventHistograms2D[%s][%s][%s]", qa.fEventHistogramsName2D[t].Data(), gc.srs[rs].Data(), gc.sba[ba].Data()), + TString::Format("%s, %s, %s", "__RUN_NUMBER__", gc.srs_long[rs].Data(), gc.sba_long[ba].Data()), // __RUN_NUMBER__ is handled in PropagateRunNumber(...) nBins_x_Event[t], min_x_Event[t], max_x_Event[t], nBins_y_Event[t], min_y_Event[t], max_y_Event[t]); qa.fQAEventHistograms2D[t][rs][ba]->GetXaxis()->SetTitle(title_x_Event[t].Data()); qa.fQAEventHistograms2D[t][rs][ba]->GetYaxis()->SetTitle(title_y_Event[t].Data()); @@ -2975,8 +3213,8 @@ void BookQAHistograms() for (int ba = 0; ba < 2; ba++) // before/after cuts { qa.fQAParticleHistograms2D[t][rs][ba] = new TH2F( - Form("fQAParticleHistograms2D[%s][%s][%s]", qa.fParticleHistogramsName2D[t].Data(), gc.srs[rs].Data(), gc.sba[ba].Data()), - Form("%s, %s, %s", "__RUN_NUMBER__", gc.srs_long[rs].Data(), gc.sba_long[ba].Data()), // __RUN_NUMBER__ is handled in PropagateRunNumber(...) + TString::Format("fQAParticleHistograms2D[%s][%s][%s]", qa.fParticleHistogramsName2D[t].Data(), gc.srs[rs].Data(), gc.sba[ba].Data()), + TString::Format("%s, %s, %s", "__RUN_NUMBER__", gc.srs_long[rs].Data(), gc.sba_long[ba].Data()), // __RUN_NUMBER__ is handled in PropagateRunNumber(...) nBins_x_Particle[t], min_x_Particle[t], max_x_Particle[t], nBins_y_Particle[t], min_y_Particle[t], max_y_Particle[t]); qa.fQAParticleHistograms2D[t][rs][ba]->GetXaxis()->SetTitle(title_x_Particle[t].Data()); @@ -3135,8 +3373,8 @@ void BookQAHistograms() } qa.fQAParticleEventHistograms2D[t][rs][ba] = new TH2F( - Form("fQAParticleEventHistograms2D[%s][%s][%s]", qa.fQAParticleEventHistogramsName2D[t].Data(), gc.srs[rs].Data(), gc.sba[ba].Data()), - Form("%s, %s, %s", "__RUN_NUMBER__", gc.srs_long[rs].Data(), gc.sba_long[ba].Data()), // __RUN_NUMBER__ is handled in PropagateRunNumber(...) + TString::Format("fQAParticleEventHistograms2D[%s][%s][%s]", qa.fQAParticleEventHistogramsName2D[t].Data(), gc.srs[rs].Data(), gc.sba[ba].Data()), + TString::Format("%s, %s, %s", "__RUN_NUMBER__", gc.srs_long[rs].Data(), gc.sba_long[ba].Data()), // __RUN_NUMBER__ is handled in PropagateRunNumber(...) nBins_x_ParticleEvent[t], min_x_ParticleEvent[t], max_x_ParticleEvent[t], nBins_y_ParticleEvent[t], min_y_ParticleEvent[t], max_y_ParticleEvent[t]); qa.fQAParticleEventHistograms2D[t][rs][ba]->GetXaxis()->SetTitle(title_x_ParticleEvent[t].Data()); @@ -3165,8 +3403,8 @@ void BookQAHistograms() } qa.fQAParticleEventProEbyE[rs][ba] = new TProfile( - Form("fParticleEventProEbyE[%s][%s]", gc.srs[rs].Data(), gc.sba[ba].Data()), - Form("%s, %s", gc.srs_long[rs].Data(), gc.sba_long[ba].Data()), + TString::Format("fParticleEventProEbyE[%s][%s]", gc.srs[rs].Data(), gc.sba[ba].Data()), + TString::Format("%s, %s", gc.srs_long[rs].Data(), gc.sba_long[ba].Data()), eQAParticleEventProEbyE_N, 0., eQAParticleEventProEbyE_N); qa.fQAParticleEventProEbyE[rs][ba]->GetXaxis()->SetBinLabel(eitsNClsEbyE, "#LTitsNCls#GT"); // TBI 20241214 this bin labeling is not really needed, as I never save this TProfile persistently qa.fQAParticleEventProEbyE[rs][ba]->GetXaxis()->SetBinLabel(eitsNClsNegEtaEbyE, "#LTitsNClsNegEta#GT"); @@ -3181,6 +3419,108 @@ void BookQAHistograms() } } + // f) Book specific QA 2D "correlations vs." histograms: + + // Binning of 2D "correlations vs." histos: + // Remark: I use the same binning for x axis for all 2D QA histos in this category, therefore here implementation in shorter. + int nBins_x_CorrelationsVs = 2000; + double min_x_CorrelationsVs = -1.; + double max_x_CorrelationsVs = 1.; + TString title_x_CorrelationsVs = "#LT2#GT"; // harmonic I store elsewhere TBI-today document here where + int nBins_y_CorrelationsVs[eQACorrelationsVsHistograms2D_N] = {0}; + double min_y_CorrelationsVs[eQACorrelationsVsHistograms2D_N] = {0.}; + double max_y_CorrelationsVs[eQACorrelationsVsHistograms2D_N] = {0.}; + TString title_y_CorrelationsVs[eQACorrelationsVsHistograms2D_N] = {""}; + + // *) "eCorrelations_vs_Multiplicity": + nBins_y_CorrelationsVs[eCorrelations_vs_Multiplicity] = static_cast(eh.fEventHistogramsBins[eMultiplicity][0] / qa.fRebin); + min_y_CorrelationsVs[eCorrelations_vs_Multiplicity] = eh.fEventHistogramsBins[eMultiplicity][1]; + max_y_CorrelationsVs[eCorrelations_vs_Multiplicity] = eh.fEventHistogramsBins[eMultiplicity][2]; + title_y_CorrelationsVs[eCorrelations_vs_Multiplicity] = FancyFormatting(eh.fEventHistogramsName[eMultiplicity].Data()); + + // *) "eCorrelations_vs_ReferenceMultiplicity": + nBins_y_CorrelationsVs[eCorrelations_vs_ReferenceMultiplicity] = static_cast(eh.fEventHistogramsBins[eReferenceMultiplicity][0] / qa.fRebin); + min_y_CorrelationsVs[eCorrelations_vs_ReferenceMultiplicity] = eh.fEventHistogramsBins[eReferenceMultiplicity][1]; + max_y_CorrelationsVs[eCorrelations_vs_ReferenceMultiplicity] = eh.fEventHistogramsBins[eReferenceMultiplicity][2]; + title_y_CorrelationsVs[eCorrelations_vs_ReferenceMultiplicity] = FancyFormatting(eh.fEventHistogramsName[eReferenceMultiplicity].Data()); + + // *) "eCorrelations_vs_Centrality": + nBins_y_CorrelationsVs[eCorrelations_vs_Centrality] = static_cast(eh.fEventHistogramsBins[eCentrality][0]); + min_y_CorrelationsVs[eCorrelations_vs_Centrality] = eh.fEventHistogramsBins[eCentrality][1]; + max_y_CorrelationsVs[eCorrelations_vs_Centrality] = eh.fEventHistogramsBins[eCentrality][2]; + title_y_CorrelationsVs[eCorrelations_vs_Centrality] = FancyFormatting(eh.fEventHistogramsName[eCentrality].Data()); + + // ..... + + // *) "eCorrelations_vs_MeanPhi": + nBins_y_CorrelationsVs[eCorrelations_vs_MeanPhi] = 200; + min_y_CorrelationsVs[eCorrelations_vs_MeanPhi] = 2.; + max_y_CorrelationsVs[eCorrelations_vs_MeanPhi] = 4.; + title_y_CorrelationsVs[eCorrelations_vs_MeanPhi] = FancyFormatting(ph.fParticleHistogramsName[ePhi].Data()); + + // *) "eCorrelations_vs_MeanPt": + nBins_y_CorrelationsVs[eCorrelations_vs_MeanPt] = 200; + min_y_CorrelationsVs[eCorrelations_vs_MeanPt] = 0.0; + max_y_CorrelationsVs[eCorrelations_vs_MeanPt] = 2.0; + title_y_CorrelationsVs[eCorrelations_vs_MeanPt] = FancyFormatting(ph.fParticleHistogramsName[ePt].Data()); + + // *) "eCorrelations_vs_MeanEta": + nBins_y_CorrelationsVs[eCorrelations_vs_MeanEta] = 600; + min_y_CorrelationsVs[eCorrelations_vs_MeanEta] = -0.3; + max_y_CorrelationsVs[eCorrelations_vs_MeanEta] = 0.3; + title_y_CorrelationsVs[eCorrelations_vs_MeanEta] = FancyFormatting(ph.fParticleHistogramsName[eEta].Data()); + + // ..... + + // *) Quick insanity check on title_x_CorrelationsVs and title_y_CorrelationsVs: + if (title_x_CorrelationsVs.EqualTo("")) { + LOGF(fatal, "\033[1;31m%s at line %d : title_x_CorrelationsVs is not set, check corresponding enum \033[0m", __FUNCTION__, __LINE__); + } + for (int t = 0; t < eQACorrelationsVsHistograms2D_N; t++) { + if (title_y_CorrelationsVs[t].EqualTo("")) { + LOGF(fatal, "\033[1;31m%s at line %d : title_y_CorrelationsVs[%d] is not set, check corresponding enum \033[0m", __FUNCTION__, __LINE__, t); + } + } + + // Okay, let's book 'em all: + for (int t = 0; t < eQACorrelationsVsHistograms2D_N; t++) // type, see enum eQACorrelationsVsHistograms2D + { + if (!qa.fBookQACorrelationsVsHistograms2D[t]) { + continue; + } + + for (int h = 0; h < gMaxHarmonic; h++) { + + if (h + 1 < qa.fQACorrelationsVsHistogramsMinMaxHarmonic[eMin] || h + 1 >= qa.fQACorrelationsVsHistogramsMinMaxHarmonic[eMax]) { + continue; + } + + for (int rs = 0; rs < 2; rs++) // reco/sim + { + + if (Skip(rs)) { + continue; + } + + qa.fQACorrelationsVsHistograms2D[t][h][rs] = new TH2F( + TString::Format("fQACorrelationsVsHistograms2D[%s][%d][%s]", qa.fQACorrelationsVsHistogramsName2D[t].Data(), h, gc.srs[rs].Data()), + TString::Format("%s, %s", "__RUN_NUMBER__", gc.srs_long[rs].Data()), // __RUN_NUMBER__ is handled in PropagateRunNumber(...) + nBins_x_CorrelationsVs, min_x_CorrelationsVs, max_x_CorrelationsVs, nBins_y_CorrelationsVs[t], min_y_CorrelationsVs[t], max_y_CorrelationsVs[t]); + + qa.fQACorrelationsVsHistograms2D[t][h][rs]->GetXaxis()->SetTitle(TString::Format("%s (harmonic = %d)", title_x_CorrelationsVs.Data(), h + 1)); + qa.fQACorrelationsVsHistograms2D[t][h][rs]->GetYaxis()->SetTitle(title_y_CorrelationsVs[t].Data()); + qa.fQACorrelationsVsHistograms2D[t][h][rs]->SetLineColor(ec.fBeforeAfterColor[eAfter]); + qa.fQACorrelationsVsHistograms2D[t][h][rs]->SetFillColor(ec.fBeforeAfterColor[eAfter] - 10); + qa.fQACorrelationsVsHistograms2D[t][h][rs]->SetOption("col"); + qa.fQACorrelationsVsList->Add(qa.fQACorrelationsVsHistograms2D[t][h][rs]); + } // for(int rs=0;rs<2;rs++) // reco/sim + + } // for (int h = 0; h < gMaxHarmonic; h++) { + + } // for(int t=0;tSetStats(kFALSE); + eh.fEventHistogramsPro->SetStats(false); eh.fEventHistogramsPro->SetLineColor(eColor); eh.fEventHistogramsPro->SetFillColor(eFillColor); eh.fEventHistogramsPro->GetXaxis()->SetBinLabel(1, "fFillEventHistograms"); @@ -3235,8 +3575,8 @@ void BookEventHistograms() continue; } eh.fEventHistograms[t][rs][ba] = new TH1F( - Form("fEventHistograms[%s][%s][%s]", eh.fEventHistogramsName[t].Data(), gc.srs[rs].Data(), gc.sba[ba].Data()), - Form("%s, %s, %s", "__RUN_NUMBER__", gc.srs_long[rs].Data(), gc.sba_long[ba].Data()), // __RUN_NUMBER__ is handled in PropagateRunNumber(...) + TString::Format("fEventHistograms[%s][%s][%s]", eh.fEventHistogramsName[t].Data(), gc.srs[rs].Data(), gc.sba[ba].Data()), + TString::Format("%s, %s, %s", "__RUN_NUMBER__", gc.srs_long[rs].Data(), gc.sba_long[ba].Data()), // __RUN_NUMBER__ is handled in PropagateRunNumber(...) static_cast(eh.fEventHistogramsBins[t][0]), eh.fEventHistogramsBins[t][1], eh.fEventHistogramsBins[t][2]); eh.fEventHistograms[t][rs][ba]->GetXaxis()->SetTitle(FancyFormatting(eh.fEventHistogramsName[t].Data())); @@ -3274,7 +3614,7 @@ void BookEventCutsHistograms() } else { ec.fEventCutsPro->SetTitle(TString::Format("%s (hardwired analysis-specific cuts not used)", ec.fEventCutsPro->GetTitle()).Data()); } - ec.fEventCutsPro->SetStats(kFALSE); + ec.fEventCutsPro->SetStats(false); ec.fEventCutsPro->SetLineColor(eColor); ec.fEventCutsPro->SetFillColor(eFillColor); ec.fEventCutsPro->GetXaxis()->SetLabelSize(0.025); @@ -3311,8 +3651,8 @@ void BookEventCutsHistograms() continue; } - ec.fEventCutCounterHist[rs][cc] = new TH1I(Form("fEventCutCounterHist[%s][%s]", gc.srs[rs].Data(), gc.scc[cc].Data()), Form("%s, %s, event cut counter (%s)", "__RUN_NUMBER__", gc.srs_long[rs].Data(), gc.scc_long[cc].Data()), eEventCuts_N, 0.5, static_cast(eEventCuts_N) + 0.5); // I cast in double the last argument, because that's what this particular TH1I constructor expects. And yes, +0.5, because eEventCuts kicks off from 0 - ec.fEventCutCounterHist[rs][cc]->SetStats(kFALSE); + ec.fEventCutCounterHist[rs][cc] = new TH1I(TString::Format("fEventCutCounterHist[%s][%s]", gc.srs[rs].Data(), gc.scc[cc].Data()), TString::Format("%s, %s, event cut counter (%s)", "__RUN_NUMBER__", gc.srs_long[rs].Data(), gc.scc_long[cc].Data()), eEventCuts_N, 0.5, static_cast(eEventCuts_N) + 0.5); // I cast in double the last argument, because that's what this particular TH1I constructor expects. And yes, +0.5, because eEventCuts kicks off from 0 + ec.fEventCutCounterHist[rs][cc]->SetStats(false); ec.fEventCutCounterHist[rs][cc]->SetLineColor(eColor); ec.fEventCutCounterHist[rs][cc]->SetFillColor(eFillColor); ec.fEventCutCounterHist[rs][cc]->GetXaxis()->SetLabelSize(0.025); @@ -3338,7 +3678,9 @@ void BookParticleHistograms() // a) Book the profile holding flags; // b) Book specific particle histograms 1D; - // c) Book specific particle histograms 2D. + // c) Book specific particle histograms 2D; + // e) Default binning for particle sparse histograms (yes, here, see comments below); + // d) Book specific particle sparse histograms (n-dimensions). if (tc.fVerbose) { StartFunction(__FUNCTION__); @@ -3347,7 +3689,7 @@ void BookParticleHistograms() // a) Book the profile holding flags: ph.fParticleHistogramsPro = new TProfile( "fParticleHistogramsPro", "flags for particle histograms", 1, 0., 1.); - ph.fParticleHistogramsPro->SetStats(kFALSE); + ph.fParticleHistogramsPro->SetStats(false); ph.fParticleHistogramsPro->SetLineColor(eColor); ph.fParticleHistogramsPro->SetFillColor(eFillColor); ph.fParticleHistogramsPro->GetXaxis()->SetLabelSize(0.025); @@ -3379,8 +3721,8 @@ void BookParticleHistograms() for (int ba = 0; ba < 2; ba++) // before/after cuts { - ph.fParticleHistograms[t][rs][ba] = new TH1F(Form("fParticleHistograms[%s][%s][%s]", ph.fParticleHistogramsName[t].Data(), gc.srs[rs].Data(), gc.sba[ba].Data()), - Form("%s, %s, %s", "__RUN_NUMBER__", gc.srs_long[rs].Data(), gc.sba_long[ba].Data()), + ph.fParticleHistograms[t][rs][ba] = new TH1F(TString::Format("fParticleHistograms[%s][%s][%s]", ph.fParticleHistogramsName[t].Data(), gc.srs[rs].Data(), gc.sba[ba].Data()), + TString::Format("%s, %s, %s", "__RUN_NUMBER__", gc.srs_long[rs].Data(), gc.sba_long[ba].Data()), static_cast(ph.fParticleHistogramsBins[t][0]), ph.fParticleHistogramsBins[t][1], ph.fParticleHistogramsBins[t][2]); ph.fParticleHistograms[t][rs][ba]->SetLineColor(ec.fBeforeAfterColor[ba]); ph.fParticleHistograms[t][rs][ba]->SetFillColor(ec.fBeforeAfterColor[ba] - 10); @@ -3434,21 +3776,23 @@ void BookParticleHistograms() // Remark: placeholder __RUN_NUMBER__ is handled in PropagateRunNumber(...) // *) variable-length binning for phi vs pt, but only in pt axis: - ph.fParticleHistograms2D[t][rs][ba] = new TH2D(Form("fParticleHistograms2D[%s][%s][%s]", ph.fParticleHistogramsName2D[t].Data(), gc.srs[rs].Data(), gc.sba[ba].Data()), - Form("%s, %s, %s", "__RUN_NUMBER__", gc.srs_long[rs].Data(), gc.sba_long[ba].Data()), + ph.fParticleHistograms2D[t][rs][ba] = new TH2D(TString::Format("fParticleHistograms2D[%s][%s][%s]", ph.fParticleHistogramsName2D[t].Data(), gc.srs[rs].Data(), gc.sba[ba].Data()), + TString::Format("%s, %s, %s", "__RUN_NUMBER__", gc.srs_long[rs].Data(), gc.sba_long[ba].Data()), static_cast(ph.fParticleHistogramsBins2D[t][eX][0]), ph.fParticleHistogramsBins2D[t][eX][1], ph.fParticleHistogramsBins2D[t][eX][2], res.fResultsPro[AFO_PT]->GetXaxis()->GetXbins()->GetSize() - 1, res.fResultsPro[AFO_PT]->GetXaxis()->GetXbins()->GetArray()); // yes, x-axis of "results vs pt" hist is y-axis here for 2D. } else if (ph.fParticleHistogramsName2D[t].EqualTo("Phi_vs_Eta") && res.fUseResultsProVariableLengthBins[AFO_ETA]) { // *) variable-length binning for phi vs eta, but only in eta axis: - ph.fParticleHistograms2D[t][rs][ba] = new TH2D(Form("fParticleHistograms2D[%s][%s][%s]", ph.fParticleHistogramsName2D[t].Data(), gc.srs[rs].Data(), gc.sba[ba].Data()), - Form("%s, %s, %s", "__RUN_NUMBER__", gc.srs_long[rs].Data(), gc.sba_long[ba].Data()), + ph.fParticleHistograms2D[t][rs][ba] = new TH2D(TString::Format("fParticleHistograms2D[%s][%s][%s]", ph.fParticleHistogramsName2D[t].Data(), gc.srs[rs].Data(), gc.sba[ba].Data()), + TString::Format("%s, %s, %s", "__RUN_NUMBER__", gc.srs_long[rs].Data(), gc.sba_long[ba].Data()), static_cast(ph.fParticleHistogramsBins2D[t][eX][0]), ph.fParticleHistogramsBins2D[t][eX][1], ph.fParticleHistogramsBins2D[t][eX][2], res.fResultsPro[AFO_ETA]->GetXaxis()->GetXbins()->GetSize() - 1, res.fResultsPro[AFO_ETA]->GetXaxis()->GetXbins()->GetArray()); // yes, x-axis of "results vs pt" hist is y-axis here for 2D } else { // default fixed-length binning: - ph.fParticleHistograms2D[t][rs][ba] = new TH2D(Form("fParticleHistograms2D[%s][%s][%s]", ph.fParticleHistogramsName2D[t].Data(), gc.srs[rs].Data(), gc.sba[ba].Data()), - Form("%s, %s, %s", "__RUN_NUMBER__", gc.srs_long[rs].Data(), gc.sba_long[ba].Data()), + // Remark: Remember that I cannot use here GetXaxis()->GetXbins()->GetArray() as for variable-width case, because for fixed-width case, this is always 0 + // See https://root-forum.cern.ch/t/get-bin-array/7276/9 + ph.fParticleHistograms2D[t][rs][ba] = new TH2D(TString::Format("fParticleHistograms2D[%s][%s][%s]", ph.fParticleHistogramsName2D[t].Data(), gc.srs[rs].Data(), gc.sba[ba].Data()), + TString::Format("%s, %s, %s", "__RUN_NUMBER__", gc.srs_long[rs].Data(), gc.sba_long[ba].Data()), static_cast(ph.fParticleHistogramsBins2D[t][eX][0]), ph.fParticleHistogramsBins2D[t][eX][1], ph.fParticleHistogramsBins2D[t][eX][2], static_cast(ph.fParticleHistogramsBins2D[t][eY][0]), ph.fParticleHistogramsBins2D[t][eY][1], ph.fParticleHistogramsBins2D[t][eY][2]); } @@ -3462,6 +3806,132 @@ void BookParticleHistograms() } // for(int t=0;t(180. / ph.fRebinSparse); + lAxis = new TAxis(ph.fParticleSparseHistogramsNBins[eDWPhi][wPhiPhiAxis], 0., o2::constants::math::TwoPI); + ph.fParticleSparseHistogramsBinEdges[eDWPhi][wPhiPhiAxis] = new TArrayD(1 + ph.fParticleSparseHistogramsNBins[eDWPhi][wPhiPhiAxis]); + for (int bin = 1; bin <= lAxis->GetNbins(); bin++) { + ph.fParticleSparseHistogramsBinEdges[eDWPhi][wPhiPhiAxis]->AddAt(lAxis->GetBinLowEdge(bin), bin - 1); + } + ph.fParticleSparseHistogramsBinEdges[eDWPhi][wPhiPhiAxis]->AddAt(lAxis->GetBinLowEdge(1 + lAxis->GetNbins()), lAxis->GetNbins()); // special treatment for last bin + delete lAxis; + ph.fParticleSparseHistogramsAxisTitle[eDWPhi][wPhiPhiAxis] = FancyFormatting("Phi"); + + // ***) pt-axis for diff phi weights: I re-use binning from results histograms + ph.fParticleSparseHistogramsNBins[eDWPhi][wPhiPtAxis] = res.fResultsPro[AFO_PT]->GetNbinsX(); + lAxis = res.fResultsPro[AFO_PT]->GetXaxis(); + ph.fParticleSparseHistogramsBinEdges[eDWPhi][wPhiPtAxis] = new TArrayD(1 + ph.fParticleSparseHistogramsNBins[eDWPhi][wPhiPtAxis]); + for (int bin = 1; bin <= lAxis->GetNbins(); bin++) { + ph.fParticleSparseHistogramsBinEdges[eDWPhi][wPhiPtAxis]->AddAt(lAxis->GetBinLowEdge(bin), bin - 1); + } + ph.fParticleSparseHistogramsBinEdges[eDWPhi][wPhiPtAxis]->AddAt(lAxis->GetBinLowEdge(1 + lAxis->GetNbins()), lAxis->GetNbins()); // special treatment for last bin + // delete lAxis; // I do not need to delete here, only when new TAxis(...) + ph.fParticleSparseHistogramsAxisTitle[eDWPhi][wPhiPtAxis] = FancyFormatting("Pt"); + + // ***) eta-axis for diff phi weights: I re-use binning from results histograms + ph.fParticleSparseHistogramsNBins[eDWPhi][wPhiEtaAxis] = res.fResultsPro[AFO_ETA]->GetNbinsX(); + lAxis = res.fResultsPro[AFO_ETA]->GetXaxis(); + ph.fParticleSparseHistogramsBinEdges[eDWPhi][wPhiEtaAxis] = new TArrayD(1 + ph.fParticleSparseHistogramsNBins[eDWPhi][wPhiEtaAxis]); + for (int bin = 1; bin <= lAxis->GetNbins(); bin++) { + ph.fParticleSparseHistogramsBinEdges[eDWPhi][wPhiEtaAxis]->AddAt(lAxis->GetBinLowEdge(bin), bin - 1); + } + ph.fParticleSparseHistogramsBinEdges[eDWPhi][wPhiEtaAxis]->AddAt(lAxis->GetBinLowEdge(1 + lAxis->GetNbins()), lAxis->GetNbins()); // special treatment for last bin + // delete lAxis; // I do not need to delete here, only when new TAxis(...) + ph.fParticleSparseHistogramsAxisTitle[eDWPhi][wPhiEtaAxis] = FancyFormatting("Eta"); + + // ***) charge-axis for diff phi weights: I support only fixed-length binning, nothing really to ever change here: + ph.fParticleSparseHistogramsNBins[eDWPhi][wPhiChargeAxis] = 2; + lAxis = new TAxis(ph.fParticleSparseHistogramsNBins[eDWPhi][wPhiChargeAxis], -1.5, 1.5); + ph.fParticleSparseHistogramsBinEdges[eDWPhi][wPhiChargeAxis] = new TArrayD(1 + ph.fParticleSparseHistogramsNBins[eDWPhi][wPhiChargeAxis]); + for (int bin = 1; bin <= lAxis->GetNbins(); bin++) { + ph.fParticleSparseHistogramsBinEdges[eDWPhi][wPhiChargeAxis]->AddAt(lAxis->GetBinLowEdge(bin), bin - 1); + } + ph.fParticleSparseHistogramsBinEdges[eDWPhi][wPhiChargeAxis]->AddAt(lAxis->GetBinLowEdge(1 + lAxis->GetNbins()), lAxis->GetNbins()); // special treatment for last bin + // delete lAxis; // I do not need to delete here, only when new TAxis(...) + ph.fParticleSparseHistogramsAxisTitle[eDWPhi][wPhiChargeAxis] = FancyFormatting("Charge"); + + // ***) centrality-axis for diff phi weights: I re-use binning from results histograms + ph.fParticleSparseHistogramsNBins[eDWPhi][wPhiCentralityAxis] = res.fResultsPro[AFO_CENTRALITY]->GetNbinsX(); + lAxis = res.fResultsPro[AFO_CENTRALITY]->GetXaxis(); + ph.fParticleSparseHistogramsBinEdges[eDWPhi][wPhiCentralityAxis] = new TArrayD(1 + ph.fParticleSparseHistogramsNBins[eDWPhi][wPhiCentralityAxis]); + for (int bin = 1; bin <= lAxis->GetNbins(); bin++) { + ph.fParticleSparseHistogramsBinEdges[eDWPhi][wPhiCentralityAxis]->AddAt(lAxis->GetBinLowEdge(bin), bin - 1); + } + ph.fParticleSparseHistogramsBinEdges[eDWPhi][wPhiCentralityAxis]->AddAt(lAxis->GetBinLowEdge(1 + lAxis->GetNbins()), lAxis->GetNbins()); // special treatment for last bin + // delete lAxis; // I do not need to delete here, only when new TAxis(...) + ph.fParticleSparseHistogramsAxisTitle[eDWPhi][wPhiCentralityAxis] = "Centrality"; // TBI 20250222 I cannot call here FancyFormatting for "Centrality", because ec.fsEventCuts[eCentralityEstimator] is still not fetched and set from configurable. Re-think how to proceed for this specific case. + + // ***) vertex_z-axis for diff phi weights: I re-use binning from results histograms + ph.fParticleSparseHistogramsNBins[eDWPhi][wPhiVertex_zAxis] = res.fResultsPro[AFO_VZ]->GetNbinsX(); + lAxis = res.fResultsPro[AFO_VZ]->GetXaxis(); + ph.fParticleSparseHistogramsBinEdges[eDWPhi][wPhiVertex_zAxis] = new TArrayD(1 + ph.fParticleSparseHistogramsNBins[eDWPhi][wPhiVertex_zAxis]); + for (int bin = 1; bin <= lAxis->GetNbins(); bin++) { + ph.fParticleSparseHistogramsBinEdges[eDWPhi][wPhiVertex_zAxis]->AddAt(lAxis->GetBinLowEdge(bin), bin - 1); + } + ph.fParticleSparseHistogramsBinEdges[eDWPhi][wPhiVertex_zAxis]->AddAt(lAxis->GetBinLowEdge(1 + lAxis->GetNbins()), lAxis->GetNbins()); // special treatment for last bin + // delete lAxis; // I do not need to delete here, only when new TAxis(...) + ph.fParticleSparseHistogramsAxisTitle[eDWPhi][wPhiVertex_zAxis] = "Vertex_z"; // TBI 20250222 I cannot call here FancyFormatting for "Centrality", because ec.fsEventCuts[eCentralityEstimator] + + // ... + + // **) eDiffWeightCategory = eDWPt: + + // ***) pt-axis for diff pt weights: I re-use binning from results histograms + ph.fParticleSparseHistogramsNBins[eDWPt][wPtPtAxis] = res.fResultsPro[AFO_PT]->GetNbinsX(); + lAxis = res.fResultsPro[AFO_PT]->GetXaxis(); + ph.fParticleSparseHistogramsBinEdges[eDWPt][wPtPtAxis] = new TArrayD(1 + ph.fParticleSparseHistogramsNBins[eDWPt][wPtPtAxis]); + for (int bin = 1; bin <= lAxis->GetNbins(); bin++) { + ph.fParticleSparseHistogramsBinEdges[eDWPt][wPtPtAxis]->AddAt(lAxis->GetBinLowEdge(bin), bin - 1); + } + ph.fParticleSparseHistogramsBinEdges[eDWPt][wPtPtAxis]->AddAt(lAxis->GetBinLowEdge(1 + lAxis->GetNbins()), lAxis->GetNbins()); // special treatment for last bin + // delete lAxis; // I do not need to delete here, only when new TAxis(...) + ph.fParticleSparseHistogramsAxisTitle[eDWPt][wPtPtAxis] = FancyFormatting("Pt"); + + // ... + + // **) eDiffWeightCategory = eDWEta: + + // ***) eta-axis for diff eta weights: I re-use binning from results histograms + ph.fParticleSparseHistogramsNBins[eDWEta][wEtaEtaAxis] = res.fResultsPro[AFO_ETA]->GetNbinsX(); + lAxis = res.fResultsPro[AFO_ETA]->GetXaxis(); + ph.fParticleSparseHistogramsBinEdges[eDWEta][wEtaEtaAxis] = new TArrayD(1 + ph.fParticleSparseHistogramsNBins[eDWEta][wEtaEtaAxis]); + for (int bin = 1; bin <= lAxis->GetNbins(); bin++) { + ph.fParticleSparseHistogramsBinEdges[eDWEta][wEtaEtaAxis]->AddAt(lAxis->GetBinLowEdge(bin), bin - 1); + } + ph.fParticleSparseHistogramsBinEdges[eDWEta][wEtaEtaAxis]->AddAt(lAxis->GetBinLowEdge(1 + lAxis->GetNbins()), lAxis->GetNbins()); // special treatment for last bin + // delete lAxis; // I do not need to delete here, only when new TAxis(...) + ph.fParticleSparseHistogramsAxisTitle[eDWEta][wEtaEtaAxis] = FancyFormatting("Eta"); + + // ... + + // e) Book specific particle sparse histograms (n-dimensions): + if (ph.fBookParticleSparseHistograms[eDWPhi]) { + BookParticleSparseHistograms(eDWPhi); + } + + if (ph.fBookParticleSparseHistograms[eDWPt]) { + BookParticleSparseHistograms(eDWPt); + } + + if (ph.fBookParticleSparseHistograms[eDWEta]) { + BookParticleSparseHistograms(eDWEta); + } + if (tc.fVerbose) { ExitFunction(__FUNCTION__); } @@ -3470,6 +3940,71 @@ void BookParticleHistograms() //============================================================ +void BookParticleSparseHistograms(eDiffWeightCategory dwc) +{ + // This is a helper function for BookParticleHistograms(), merely to reduce code bloat. + + if (tc.fVerbose) { + StartFunction(__FUNCTION__); + } + + // *) Determine number of dimensions for sparse histogram for this differential weight category: + int nDimensions = -1; + switch (dwc) { + case eDWPhi: { + nDimensions = static_cast(eDiffPhiWeights_N); + break; + } + case eDWPt: { + nDimensions = static_cast(eDiffPtWeights_N); + break; + } + case eDWEta: { + nDimensions = static_cast(eDiffEtaWeights_N); + break; + } + default: { + LOGF(fatal, "\033[1;31m%s at line %d : This differential weight category, dwc = %d, is not supported yet. \033[0m", __FUNCTION__, __LINE__, static_cast(dwc)); + break; + } + } // switch(dwc) + + // *) Determine binning for all dimensions: + TArrayI* nBins = new TArrayI(nDimensions); + for (int d = 0; d < nDimensions; d++) { + nBins->AddAt(static_cast(ph.fParticleSparseHistogramsNBins[dwc][d]), d); + } + + // *) Book THnSparse with correct number of bins for each dimension, but void bin edges: + for (int rs = 0; rs < 2; rs++) // reco/sim + { + if (Skip(rs)) { + continue; + } + // Remark: Here I have a bit unusual convention for the name and title, but okay... + ph.fParticleSparseHistograms[dwc][rs] = new THnSparseF(TString::Format("%s[%s]", ph.fParticleSparseHistogramsName[dwc].Data(), gc.srs[rs].Data()), TString::Format("__RUN_NUMBER__, %s, %s", gc.srs_long[rs].Data(), ph.fParticleSparseHistogramsTitle[dwc].Data()), nDimensions, nBins->GetArray(), NULL, NULL); + + // *) For each dimension set bin edges, axis title, etc.: + for (int d = 0; d < nDimensions; d++) { + ph.fParticleSparseHistograms[dwc][rs]->SetBinEdges(d, ph.fParticleSparseHistogramsBinEdges[dwc][d]->GetArray()); + ph.fParticleSparseHistograms[dwc][rs]->GetAxis(d)->SetTitle(ph.fParticleSparseHistogramsAxisTitle[dwc][d].Data()); + } + + // *) Finally, add the fully configured THnSparse to its TList: + ph.fParticleHistogramsList->Add(ph.fParticleSparseHistograms[dwc][rs]); + } // for (int rs = 0; rs < 2; rs++) // reco/sim + + // *) Clean up: + delete nBins; + + if (tc.fVerbose) { + ExitFunction(__FUNCTION__); + } + +} // void BookParticleSparseHistograms() + +//============================================================ + void BookParticleCutsHistograms() { // Book all particle cuts objects. @@ -3490,7 +4025,7 @@ void BookParticleCutsHistograms() } else { pc.fParticleCutsPro->SetTitle(TString::Format("%s (hardwired analysis-specific cuts not used)", pc.fParticleCutsPro->GetTitle()).Data()); } - pc.fParticleCutsPro->SetStats(kFALSE); + pc.fParticleCutsPro->SetStats(false); pc.fParticleCutsPro->SetLineColor(eColor); pc.fParticleCutsPro->SetFillColor(eFillColor); for (int cut = 0; cut < eParticleCuts_N; cut++) { @@ -3526,10 +4061,10 @@ void BookParticleCutsHistograms() continue; } - pc.fParticleCutCounterHist[rs][cc] = new TH1I(Form("fParticleCutCounterHist[%s][%s]", gc.srs[rs].Data(), gc.scc[cc].Data()), Form("%s, %s, particle cut counter (%s)", "__RUN_NUMBER__", gc.srs_long[rs].Data(), gc.scc_long[cc].Data()), eParticleCuts_N, 0.5, static_cast(eParticleCuts_N) + 0.5); + pc.fParticleCutCounterHist[rs][cc] = new TH1I(TString::Format("fParticleCutCounterHist[%s][%s]", gc.srs[rs].Data(), gc.scc[cc].Data()), TString::Format("%s, %s, particle cut counter (%s)", "__RUN_NUMBER__", gc.srs_long[rs].Data(), gc.scc_long[cc].Data()), eParticleCuts_N, 0.5, static_cast(eParticleCuts_N) + 0.5); // I cast in double the last argument, because that's what this particular TH1I constructor expects // Yes, +0.5, because eParticleCuts kicks off from 0 - pc.fParticleCutCounterHist[rs][cc]->SetStats(kFALSE); + pc.fParticleCutCounterHist[rs][cc]->SetStats(false); pc.fParticleCutCounterHist[rs][cc]->SetLineColor(eColor); pc.fParticleCutCounterHist[rs][cc]->SetFillColor(eFillColor); pc.fParticleCutCounterHist[rs][cc]->GetXaxis()->SetLabelSize(0.025); @@ -3572,7 +4107,7 @@ void BookQvectorHistograms() // a) Book the profile holding flags: qv.fQvectorFlagsPro = new TProfile("fQvectorFlagsPro", "flags for Q-vector objects", 3, 0., 3.); - qv.fQvectorFlagsPro->SetStats(kFALSE); + qv.fQvectorFlagsPro->SetStats(false); qv.fQvectorFlagsPro->SetLineColor(eColor); qv.fQvectorFlagsPro->SetFillColor(eFillColor); qv.fQvectorFlagsPro->GetXaxis()->SetLabelSize(0.05); @@ -3587,7 +4122,7 @@ void BookQvectorHistograms() // b) Book multiplicity distributions in A and B, for each eta separation: if (es.fCalculateEtaSeparations) { TString sEtaSep[2] = {"A", "B"}; // A <=> -eta , B <=> + eta - TString sEtaSep_long[2] = {Form("%.2f < #eta <", pc.fdParticleCuts[eEta][eMin]), Form("< #eta < %.2f", pc.fdParticleCuts[eEta][eMax])}; + TString sEtaSep_long[2] = {TString::Format("%.2f < #eta <", pc.fdParticleCuts[eEta][eMin]), TString::Format("< #eta < %.2f", pc.fdParticleCuts[eEta][eMax])}; // yes, here I define first the part of intervals as etaCutMin < eta < "subevent boundary", and "subevent" boundary < eta < etaCutMax // Then below in the loop, I inject for "subevent boundary" the corresponding fEtaSeparationsValues (devided by 2, becaus it's symmetric round 0) for (int ab = 0; ab < 2; ab++) { // ab = 0 <=> -eta , ab = 1 <=> + eta @@ -3645,7 +4180,7 @@ void BookCorrelationsHistograms() // a) Book the profile holding flags: mupa.fCorrelationsFlagsPro = new TProfile("fCorrelationsFlagsPro", "flags for correlations", 1, 0., 1.); - mupa.fCorrelationsFlagsPro->SetStats(kFALSE); + mupa.fCorrelationsFlagsPro->SetStats(false); mupa.fCorrelationsFlagsPro->SetLineColor(eColor); mupa.fCorrelationsFlagsPro->SetFillColor(eFillColor); mupa.fCorrelationsFlagsPro->GetXaxis()->SetLabelSize(0.05); @@ -3706,7 +4241,7 @@ void BookCorrelationsHistograms() LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); } mupa.fCorrelationsPro[k][n][v] = reinterpret_cast(res.fResultsPro[v]->Clone(Form("fCorrelationsPro[%d][%d][%s]", k, n, res.fResultsProRawName[v].Data()))); // yes - mupa.fCorrelationsPro[k][n][v]->SetStats(kFALSE); + mupa.fCorrelationsPro[k][n][v]->SetStats(false); mupa.fCorrelationsPro[k][n][v]->Sumw2(); mupa.fCorrelationsPro[k][n][v]->GetXaxis()->SetTitle(FancyFormatting(res.fResultsProXaxisTitle[v].Data())); mupa.fCorrelationsPro[k][n][v]->GetYaxis()->SetTitle(Form("#LT#LTcos[%s(%s)]#GT#GT", 1 == n + 1 ? "" : Form("%d", n + 1), oVariable[k].Data())); @@ -3737,37 +4272,84 @@ void BookWeightsHistograms() // a) Book the profile holding flags; // b) Histograms for integrated weights; - // c) Histograms for differential weights. + // c) Histograms for differential weights; + // d) Sparse histograms for differential phi weights. if (tc.fVerbose) { StartFunction(__FUNCTION__); } // a) Book the profile holding flags: - pw.fWeightsFlagsPro = - new TProfile("fWeightsFlagsPro", "flags for particle weights", 5, 0., 5.); - pw.fWeightsFlagsPro->SetStats(kFALSE); + pw.fWeightsFlagsPro = new TProfile("fWeightsFlagsPro", "flags for particle weights", 13, 0., 13.); + pw.fWeightsFlagsPro->SetStats(false); pw.fWeightsFlagsPro->SetLineColor(eColor); pw.fWeightsFlagsPro->SetFillColor(eFillColor); - pw.fWeightsFlagsPro->GetXaxis()->SetLabelSize(0.05); + pw.fWeightsFlagsPro->GetXaxis()->SetLabelSize(0.035); pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(1, "w_{#varphi}"); pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(2, "w_{p_{t}}"); pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(3, "w_{#eta}"); pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(4, "(w_{#varphi})_{| p_{T}}"); // TBI 20241019 not sure if this is the final notation, keep in sync with void SetDiffWeightsHist(...) pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(5, "(w_{#varphi})_{| #eta}"); // TBI 20241019 not sure if this is the final notation, keep in sync with void SetDiffWeightsHist(...) + // **) differential phi weights using sparse: + pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(6, "(w_{#varphi})_{phi axis (sparse)}"); + pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(7, "(w_{#varphi})_{p_{T} axis (sparse)}"); + pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(8, "(w_{#varphi})_{#eta axis (sparse)}"); + pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(9, "(w_{#varphi})_{charge axis (sparse)}"); + pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(10, "(w_{#varphi})_{centrality axis (sparse)}"); + pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(11, "(w_{#varphi})_{vertex_z axis (sparse)}"); + + // **) differential pt weights using sparse: + pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(12, "(w_{p_{T}})_{pt axis (sparse)}"); + + // **) differential eta weights using sparse: + pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(13, "(w_{#eta})_{eta axis (sparse)}"); + for (int w = 0; w < eWeights_N; w++) // use weights [phi,pt,eta] { if (pw.fUseWeights[w]) { pw.fWeightsFlagsPro->Fill(w + 0.5, 1.); } } - for (int w = 0; w < eDiffWeights_N; w++) // use differential weights [phipt,phieta,...] - { - if (pw.fUseDiffWeights[w]) { - pw.fWeightsFlagsPro->Fill(w + 3.5, 1.); // TBI 20231026 This hadrwired offset of +3.5 will bite me sooner or later, but nevermind now... - } + + // **) use differential weights [phipt,phieta,...] TBI 20250514 obsolete + if (pw.fUseDiffWeights[wPHIPT]) { + pw.fWeightsFlagsPro->Fill(3.5, 1.); + } + if (pw.fUseDiffWeights[wPHIETA]) { + pw.fWeightsFlagsPro->Fill(4.5, 1.); + } + + // **) differential phi weights using sparse: + if (pw.fUseDiffPhiWeights[wPhiPhiAxis]) { + pw.fWeightsFlagsPro->Fill(5.5, 1.); + } + if (pw.fUseDiffPhiWeights[wPhiPtAxis]) { + pw.fWeightsFlagsPro->Fill(6.5, 1.); + } + if (pw.fUseDiffPhiWeights[wPhiEtaAxis]) { + pw.fWeightsFlagsPro->Fill(7.5, 1.); } + if (pw.fUseDiffPhiWeights[wPhiChargeAxis]) { + pw.fWeightsFlagsPro->Fill(8.5, 1.); + } + if (pw.fUseDiffPhiWeights[wPhiCentralityAxis]) { + pw.fWeightsFlagsPro->Fill(9.5, 1.); + } + if (pw.fUseDiffPhiWeights[wPhiVertex_zAxis]) { + pw.fWeightsFlagsPro->Fill(10.5, 1.); + } + + // **) differential pt weights using sparse: + if (pw.fUseDiffPtWeights[wPtPtAxis]) { + pw.fWeightsFlagsPro->Fill(11.5, 1.); + } + + // **) differential eta weights using sparse: + if (pw.fUseDiffEtaWeights[wEtaEtaAxis]) { + pw.fWeightsFlagsPro->Fill(12.5, 1.); + } + pw.fWeightsList->Add(pw.fWeightsFlagsPro); // b) Histograms for integrated weights: @@ -3778,6 +4360,9 @@ void BookWeightsHistograms() // c) Histograms for differential weights: // Same comment applies as for b) => add histograms to the list, only after they are cloned from external files. + // d) Sparse histograms for differential phi weights: + // Same comment applies as for b) => add sparse histograms to the list, only after they are cloned from external files. + if (tc.fVerbose) { ExitFunction(__FUNCTION__); } @@ -3800,7 +4385,7 @@ void BookCentralityWeightsHistograms() // a) Book the profile holding flags: cw.fCentralityWeightsFlagsPro = new TProfile("fCentralityWeightsFlagsPro", "flags for centrality weights", 1, 0., 1.); - cw.fCentralityWeightsFlagsPro->SetStats(kFALSE); + cw.fCentralityWeightsFlagsPro->SetStats(false); cw.fCentralityWeightsFlagsPro->SetLineColor(eColor); cw.fCentralityWeightsFlagsPro->SetFillColor(eFillColor); cw.fCentralityWeightsFlagsPro->GetXaxis()->SetLabelSize(0.05); @@ -3839,7 +4424,7 @@ void BookNestedLoopsHistograms() // a) Book the profile holding flags: nl.fNestedLoopsFlagsPro = new TProfile("fNestedLoopsFlagsPro", "flags for nested loops", 4, 0., 4.); - nl.fNestedLoopsFlagsPro->SetStats(kFALSE); + nl.fNestedLoopsFlagsPro->SetStats(false); nl.fNestedLoopsFlagsPro->SetLineColor(eColor); nl.fNestedLoopsFlagsPro->SetFillColor(eFillColor); nl.fNestedLoopsFlagsPro->GetXaxis()->SetLabelSize(0.03); @@ -3903,7 +4488,7 @@ void BookNestedLoopsHistograms() } nl.fNestedLoopsPro[k][n][v] = reinterpret_cast(res.fResultsPro[v]->Clone(Form("fNestedLoopsPro[%d][%d][%d]", k, n, v))); // yes nl.fNestedLoopsPro[k][n][v]->SetTitle(Form("#LT#LTcos[%s(%s)]#GT#GT", 1 == n + 1 ? "" : Form("%d", n + 1), oVariable[k].Data())); - nl.fNestedLoopsPro[k][n][v]->SetStats(kFALSE); + nl.fNestedLoopsPro[k][n][v]->SetStats(false); nl.fNestedLoopsPro[k][n][v]->Sumw2(); nl.fNestedLoopsPro[k][n][v]->GetXaxis()->SetTitle(res.fResultsProXaxisTitle[v].Data()); @@ -3955,7 +4540,7 @@ void BookNUAHistograms() // a) Book the profile holding flags: nua.fNUAFlagsPro = new TProfile("fNUAFlagsPro", "flags for Toy NUA", 6, 0.5, 6.5); - nua.fNUAFlagsPro->SetStats(kFALSE); + nua.fNUAFlagsPro->SetStats(false); nua.fNUAFlagsPro->SetLineColor(eColor); nua.fNUAFlagsPro->SetFillColor(eFillColor); nua.fNUAFlagsPro->GetXaxis()->SetLabelSize(0.03); @@ -4006,10 +4591,10 @@ void BookNUAHistograms() continue; } // Define default detector acceptance in azimuthal angle: Two sectors, with different probabilities. - double dFirstSector[2] = {-(3. / 4.) * TMath::Pi(), -(1. / 4.) * TMath::Pi()}; // first sector is defined as [-3Pi/4,Pi/4] - double dSecondSector[2] = {(1. / 3.) * TMath::Pi(), (2. / 3.) * TMath::Pi()}; // second sector is defined as [Pi/3,2Pi/3] - double dProbability[2] = {0.3, 0.5}; // probabilities - nua.fDefaultNUAPDF[ePhiNUAPDF] = new TF1(Form("fDefaultNUAPDF[%d]", ePhiNUAPDF), "1.-(x>=[0])*(1.-[4]) + (x>=[1])*(1.-[4]) - (x>=[2])*(1.-[5]) + (x>=[3])*(1.-[5]) ", + double dFirstSector[2] = {-(3. / 4.) * o2::constants::math::PI, -(1. / 4.) * o2::constants::math::PI}; // first sector is defined as [-3Pi/4,Pi/4] + double dSecondSector[2] = {(1. / 3.) * o2::constants::math::PI, (2. / 3.) * o2::constants::math::PI}; // second sector is defined as [Pi/3,2Pi/3] + double dProbability[2] = {0.3, 0.5}; // probabilities + nua.fDefaultNUAPDF[ePhiNUAPDF] = new TF1(TString::Format("fDefaultNUAPDF[%d]", ePhiNUAPDF), "1.-(x>=[0])*(1.-[4]) + (x>=[1])*(1.-[4]) - (x>=[2])*(1.-[5]) + (x>=[3])*(1.-[5]) ", ph.fParticleHistogramsBins[ePhi][1], ph.fParticleHistogramsBins[ePhi][2]); nua.fDefaultNUAPDF[ePhiNUAPDF]->SetParameter(0, dFirstSector[0]); nua.fDefaultNUAPDF[ePhiNUAPDF]->SetParameter(1, dFirstSector[1]); @@ -4028,7 +4613,7 @@ void BookNUAHistograms() // Define default detector acceptance in transverse momentum: One sectors, with probability < 1. double dSector[2] = {0.4, 0.8}; // sector is defined as 0.8 < pT < 1.2 double dProbability = 0.3; // probability, so after being set this way, only 30% of particles in that sector are reconstructed - nua.fDefaultNUAPDF[ePtNUAPDF] = new TF1(Form("fDefaultNUAPDF[%d]", ePtNUAPDF), "1.-(x>=[0])*(1.-[2]) + (x>=[1])*(1.-[2])", + nua.fDefaultNUAPDF[ePtNUAPDF] = new TF1(TString::Format("fDefaultNUAPDF[%d]", ePtNUAPDF), "1.-(x>=[0])*(1.-[2]) + (x>=[1])*(1.-[2])", ph.fParticleHistogramsBins[ePt][1], ph.fParticleHistogramsBins[ePt][2]); nua.fDefaultNUAPDF[ePtNUAPDF]->SetParameter(0, dSector[0]); nua.fDefaultNUAPDF[ePtNUAPDF]->SetParameter(1, dSector[1]); @@ -4044,7 +4629,7 @@ void BookNUAHistograms() // Define default detector acceptance in pseudorapidity: One sectors, with probability < 1. double dSector[2] = {2.0, 2.5}; // sector is defined as 0.5 < eta < 1.0 double dProbability = 0.5; // probability, so after being set this way, only 50% of particles in that sector are reconstructed - nua.fDefaultNUAPDF[eEtaNUAPDF] = new TF1(Form("fDefaultNUAPDF[%d]", eEtaNUAPDF), "1.-(x>=[0])*(1.-[2]) + (x>=[1])*(1.-[2])", + nua.fDefaultNUAPDF[eEtaNUAPDF] = new TF1(TString::Format("fDefaultNUAPDF[%d]", eEtaNUAPDF), "1.-(x>=[0])*(1.-[2]) + (x>=[1])*(1.-[2])", ph.fParticleHistogramsBins[eEta][1], ph.fParticleHistogramsBins[eEta][2]); nua.fDefaultNUAPDF[eEtaNUAPDF]->SetParameter(0, dSector[0]); nua.fDefaultNUAPDF[eEtaNUAPDF]->SetParameter(1, dSector[1]); @@ -4056,8 +4641,8 @@ void BookNUAHistograms() } else { // if(!nua.fCustomNUAPDF[pdf]) // generic cosmetics for custom user-supplied pdfs via histograms: - nua.fCustomNUAPDF[pdf]->SetTitle(Form("Custom user-provided NUA for %s", sVariable[pdf].Data())); - nua.fCustomNUAPDF[pdf]->SetStats(kFALSE); + nua.fCustomNUAPDF[pdf]->SetTitle(TString::Format("Custom user-provided NUA for %s", sVariable[pdf].Data())); + nua.fCustomNUAPDF[pdf]->SetStats(false); nua.fCustomNUAPDF[pdf]->GetXaxis()->SetTitle(sVariable[pdf].Data()); nua.fCustomNUAPDF[pdf]->SetFillColor(eFillColor); nua.fCustomNUAPDF[pdf]->SetLineColor(eColor); @@ -4098,7 +4683,7 @@ void BookInternalValidationHistograms() // a) Book the profile holding flags: iv.fInternalValidationFlagsPro = new TProfile("fInternalValidationFlagsPro", "flags for internal validation", 4, 0., 4.); - iv.fInternalValidationFlagsPro->SetStats(kFALSE); + iv.fInternalValidationFlagsPro->SetStats(false); iv.fInternalValidationFlagsPro->SetLineColor(eColor); iv.fInternalValidationFlagsPro->SetFillColor(eFillColor); iv.fInternalValidationFlagsPro->GetXaxis()->SetLabelSize(0.04); @@ -4191,10 +4776,10 @@ TComplex TheoreticalValue(TArrayI* harmonics, TArrayD* amplitudes, TArrayD* plan } // b) Main calculus: - TComplex value = TComplex(1., 0., kTRUE); // yes, polar representation + TComplex value = TComplex(1., 0., true); // yes, polar representation for (int h = 0; h < harmonics->GetSize(); h++) { - // Using polar form of TComplex (double re, double im=0, bool polar=kFALSE): - value *= TComplex(amplitudes->GetAt(TMath::Abs(harmonics->GetAt(h)) - 1), 1. * harmonics->GetAt(h) * planes->GetAt(TMath::Abs(harmonics->GetAt(h)) - 1), kTRUE); + // Using polar form of TComplex (double re, double im=0, bool polar=false): + value *= TComplex(amplitudes->GetAt(TMath::Abs(harmonics->GetAt(h)) - 1), 1. * harmonics->GetAt(h) * planes->GetAt(TMath::Abs(harmonics->GetAt(h)) - 1), true); } // for(int h=0;hGetSize();h++) // c) Return value: @@ -4244,7 +4829,14 @@ void InternalValidation() GetParticleWeights(); pw.fParticleWeightsAreFetched = true; } - } + // differential phi weights: + if (pw.fUseDiffPhiWeights[wPhiPhiAxis]) { // Yes, I check only the first flag. This way, I can switch off all differential phi weights by setting 0-wPhi in config. + // On the other hand, it doesn't make sense to calculate differential phi weights without having phi axis. + // At any point I shall be able to fall back to integrated phi weights, that corresponds to the case wheh "1-wPhi" and all others are "0-w..." + GetParticleWeights(); + pw.fParticleWeightsAreFetched = true; + } + } // if (!pw.fParticleWeightsAreFetched) { // a) Fourier like p.d.f. for azimuthal angles and flow amplitudes: TF1* fPhiPDF = NULL; @@ -4254,10 +4846,10 @@ void InternalValidation() // For this option, vn's and psin's are constant for all simulated events, therefore I can configure fPhiPDF outside of loop over events. // Remark: The last parameter [18] is a random reaction plane, keep in sync with fPhiPDF->SetParameter(18,fReactionPlane); below // Keep also in sync with const int gMaxHarmonic = 9; in *GlobalConstants.h - fPhiPDF = new TF1("fPhiPDF", "1 + 2.*[0]*TMath::Cos(x-[1]-[18]) + 2.*[2]*TMath::Cos(2.*(x-[3]-[18])) + 2.*[4]*TMath::Cos(3.*(x-[5]-[18])) + 2.*[6]*TMath::Cos(4.*(x-[7]-[18])) + 2.*[8]*TMath::Cos(5.*(x-[9]-[18])) + 2.*[10]*TMath::Cos(6.*(x-[11]-[18])) + 2.*[12]*TMath::Cos(7.*(x-[13]-[18])) + 2.*[14]*TMath::Cos(8.*(x-[15]-[18])) + 2.*[16]*TMath::Cos(9.*(x-[17]-[18]))", 0., TMath::TwoPi()); + fPhiPDF = new TF1("fPhiPDF", "1 + 2.*[0]*TMath::Cos(x-[1]-[18]) + 2.*[2]*TMath::Cos(2.*(x-[3]-[18])) + 2.*[4]*TMath::Cos(3.*(x-[5]-[18])) + 2.*[6]*TMath::Cos(4.*(x-[7]-[18])) + 2.*[8]*TMath::Cos(5.*(x-[9]-[18])) + 2.*[10]*TMath::Cos(6.*(x-[11]-[18])) + 2.*[12]*TMath::Cos(7.*(x-[13]-[18])) + 2.*[14]*TMath::Cos(8.*(x-[15]-[18])) + 2.*[16]*TMath::Cos(9.*(x-[17]-[18]))", 0., o2::constants::math::TwoPI); for (int h = 0; h < gMaxHarmonic; h++) { - fPhiPDF->SetParName(2 * h, Form("v_{%d}", h + 1)); // set name v_n - fPhiPDF->SetParName(2 * h + 1, Form("Psi_{%d}", h + 1)); // set name psi_n + fPhiPDF->SetParName(2 * h, TString::Format("v_{%d}", h + 1)); // set name v_n + fPhiPDF->SetParName(2 * h + 1, TString::Format("Psi_{%d}", h + 1)); // set name psi_n // initialize v_n: if (iv.fInternalValidationVnPsin[eVn] && h + 1 <= iv.fInternalValidationVnPsin[eVn]->GetSize()) { fPhiPDF->SetParameter(2 * h, iv.fInternalValidationVnPsin[eVn]->GetAt(h)); @@ -4287,7 +4879,7 @@ void InternalValidation() // Keep also in sync with const int gMaxHarmonic = 9; in *GlobalConstants.h // Azimuthal angles are sampled from this pdf: - fPhiPDF = new TF1("fPhiPDF", "1 + 2.*[0]*TMath::Cos(x-[3]) + 2.*[1]*TMath::Cos(2.*(x-[3])) + 2.*[2]*TMath::Cos(3.*(x-[3]))", 0., TMath::TwoPi()); + fPhiPDF = new TF1("fPhiPDF", "1 + 2.*[0]*TMath::Cos(x-[3]) + 2.*[1]*TMath::Cos(2.*(x-[3])) + 2.*[2]*TMath::Cos(3.*(x-[3]))", 0., o2::constants::math::TwoPI); // With this parameterization, I have: // [0] => v1 // [1] => v2 @@ -4312,7 +4904,7 @@ void InternalValidation() // Keep also in sync with const int gMaxHarmonic = 9; in *GlobalConstants.h // Azimuthal angles are sampled from this pdf: - fPhiPDF = new TF1("fPhiPDF", "1 + 2.*[0]*TMath::Cos(x-[3]) + 2.*[1]*TMath::Cos(2.*(x-[4])) + 2.*[2]*TMath::Cos(3.*(x-[5]))", 0., TMath::TwoPi()); + fPhiPDF = new TF1("fPhiPDF", "1 + 2.*[0]*TMath::Cos(x-[3]) + 2.*[1]*TMath::Cos(2.*(x-[4])) + 2.*[2]*TMath::Cos(3.*(x-[5]))", 0., o2::constants::math::TwoPI); // With this parameterization, I have: // [0] => v1 // [1] => v2 @@ -4343,7 +4935,7 @@ void InternalValidation() // b1) Determine multiplicity, centrality, reaction plane and configure p.d.f. for azimuthal angles if harmonics are not constant e-by-e: int nMult = static_cast(gRandom->Uniform(iv.fMultRangeInternalValidation[eMin], iv.fMultRangeInternalValidation[eMax])); - double fReactionPlane = gRandom->Uniform(0., TMath::TwoPi()); // no cast is needed, since Uniform(...) returns double + double fReactionPlane = gRandom->Uniform(0., o2::constants::math::TwoPI); // no cast is needed, since Uniform(...) returns double if (iv.fHarmonicsOptionInternalValidation->EqualTo("constant")) { fPhiPDF->SetParameter(18, fReactionPlane); } else if (iv.fHarmonicsOptionInternalValidation->EqualTo("correlated")) { @@ -4540,7 +5132,7 @@ void InternalValidation() // *) If I reached max number of events, ignore the remaining collisions: if (MaxNumberOfEvents(eAfter)) { if (iv.fInternalValidationForceBailout) { - BailOut(kTRUE); + BailOut(true); } } @@ -4588,7 +5180,7 @@ bool Accept(const double& value, int var) LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); } - bool bAccept = kTRUE; // return value + bool bAccept = true; // return value double acceptanceProbability = 1.; double correspondingAcceptance = -44.; @@ -4602,7 +5194,7 @@ bool Accept(const double& value, int var) acceptanceProbability = 1. - (nua.fMaxValuePDF[var] - correspondingAcceptance) / nua.fMaxValuePDF[var]; // Accept or not: - (gRandom->Uniform(0, 1) < acceptanceProbability) ? bAccept = kTRUE : bAccept = kFALSE; + (gRandom->Uniform(0, 1) < acceptanceProbability) ? bAccept = true : bAccept = false; return bAccept; @@ -4626,7 +5218,7 @@ void BookTest0Histograms() // a) Book the profile holding flags: t0.fTest0FlagsPro = new TProfile("fTest0FlagsPro", "flags for Test0", 1, 0., 1.); - t0.fTest0FlagsPro->SetStats(kFALSE); + t0.fTest0FlagsPro->SetStats(false); t0.fTest0FlagsPro->GetXaxis()->SetLabelSize(0.04); t0.fTest0FlagsPro->GetXaxis()->SetBinLabel(1, "fCalculateTest0"); t0.fTest0FlagsPro->Fill(0.5, t0.fCalculateTest0); @@ -4689,7 +5281,7 @@ void BookTest0Histograms() } t0.fTest0Pro[mo][mi][v] = reinterpret_cast(res.fResultsPro[v]->Clone(Form("fTest0Pro[%d][%d][%s]", mo, mi, res.fResultsProRawName[v].Data()))); // yes - t0.fTest0Pro[mo][mi][v]->SetStats(kFALSE); + t0.fTest0Pro[mo][mi][v]->SetStats(false); t0.fTest0Pro[mo][mi][v]->Sumw2(); t0.fTest0Pro[mo][mi][v]->SetTitle(t0.fTest0Labels[mo][mi]->Data()); t0.fTest0Pro[mo][mi][v]->GetXaxis()->SetTitle(FancyFormatting(res.fResultsProXaxisTitle[v].Data())); @@ -4735,7 +5327,7 @@ void BookEtaSeparationsHistograms() // a) Book the profile holding flags: es.fEtaSeparationsFlagsPro = new TProfile("fEtaSeparationsFlagsPro", "flags for eta separations", 1, 0., 1.); - es.fEtaSeparationsFlagsPro->SetStats(kFALSE); + es.fEtaSeparationsFlagsPro->SetStats(false); es.fEtaSeparationsFlagsPro->SetLineColor(eColor); es.fEtaSeparationsFlagsPro->SetFillColor(eFillColor); es.fEtaSeparationsFlagsPro->GetXaxis()->SetLabelSize(0.04); @@ -4788,7 +5380,7 @@ void BookEtaSeparationsHistograms() } es.fEtaSeparationsPro[h][e][v] = reinterpret_cast(res.fResultsPro[v]->Clone(Form("fEtaSeparationsPro[%d][%d][%s]", h, e, res.fResultsProRawName[v].Data()))); // yes - es.fEtaSeparationsPro[h][e][v]->SetStats(kFALSE); + es.fEtaSeparationsPro[h][e][v]->SetStats(false); es.fEtaSeparationsPro[h][e][v]->Sumw2(); es.fEtaSeparationsPro[h][e][v]->SetTitle(Form("%d -%d, |#Delta#eta| > %.2f", h + 1, h + 1, es.fEtaSeparationsValues[e])); es.fEtaSeparationsPro[h][e][v]->GetXaxis()->SetTitle(FancyFormatting(res.fResultsProXaxisTitle[v].Data())); @@ -4826,7 +5418,7 @@ void BookResultsHistograms() // a) Book the profile holding flags: res.fResultsFlagsPro = new TProfile("fResultsFlagsPro", "flags for results histograms", 1, 0., 1.); - res.fResultsFlagsPro->SetStats(kFALSE); + res.fResultsFlagsPro->SetStats(false); res.fResultsFlagsPro->SetLineColor(eColor); res.fResultsFlagsPro->SetFillColor(eFillColor); res.fResultsFlagsPro->GetXaxis()->SetBinLabel(1, "fSaveResultsHistograms"); @@ -4903,7 +5495,7 @@ void Preprocess(T1 const& collision, T2 const& bcs) // *) If I reached max number of events, ignore the remaining collisions: if (MaxNumberOfEvents(eAfter) || MaxNumberOfEvents(eBefore)) { // TBI 20240510 this is a bit confusing, implemented this way. Shall I split off? - BailOut(kTRUE); + BailOut(true); } // *) Determine and propagate run number info to already booked objects: @@ -4918,18 +5510,30 @@ void Preprocess(T1 const& collision, T2 const& bcs) // *) Fetch the weights for this particular run number. Do it only once. // TBI 20231012 If eventualy I can access programatically run number in init(...) at run time, this shall go there. if (!pw.fParticleWeightsAreFetched) { + + // integrated weights and differentials weights without sparse histograms (the latter is becoming obsolete): if (pw.fUseWeights[wPHI] || pw.fUseWeights[wPT] || pw.fUseWeights[wETA] || pw.fUseDiffWeights[wPHIPT] || pw.fUseDiffWeights[wPHIETA]) { + pw.fParticleWeightsAreFetched = true; + } + + // differential particle weights using sparse histogreams: + if (pw.fUseDiffPhiWeights[wPhiPhiAxis] || pw.fUseDiffPtWeights[wPtPtAxis] || pw.fUseDiffPtWeights[wEtaEtaAxis]) { + // Yes, I check only the first flag. This way, I can e.g. switch off all differential phi weights by setting 0-wPhi in config. + // On the other hand, it doesn't make sense to calculate differential phi weights without having phi axis. + // At any point I shall be able to fall back e.g. to integrated phi weights, that corresponds to the case wheh "1-wPhi" and all others are "0-w..." + // Same for differential pt or eta weights. GetParticleWeights(); - pw.fParticleWeightsAreFetched = kTRUE; + pw.fParticleWeightsAreFetched = true; } - } + + } // if (!pw.fParticleWeightsAreFetched) { // *) Fetch the centrality weights for this particular run number. Do it only once. // TBI 20231012 If eventualy I can access programatically run number in init(...) at run time, this shall go there. if (!cw.fCentralityWeightsAreFetched) { if (cw.fUseCentralityWeights) { GetCentralityWeights(); - cw.fCentralityWeightsAreFetched = kTRUE; + cw.fCentralityWeightsAreFetched = true; } } @@ -4991,7 +5595,7 @@ void DetermineRunNumber(T1 const& collision, T2 const&) // b) Determine run number for the rest. TBI 20241126 differentiate this support as well, e.g. for eRecSim and eSim. LOGF(fatal, "\033[1;31m%s at line %d : bc.runNumber() is not validated yet for this case\033[0m", __FUNCTION__, __LINE__); } - tc.fRunNumberIsDetermined = kTRUE; + tc.fRunNumberIsDetermined = true; if (tc.fVerbose) { ExitFunction(__FUNCTION__); @@ -5112,6 +5716,40 @@ void PropagateRunNumber() } // for(int rs=0;rs<2;rs++) // reco/sim } // for (int t = 0; t < eQAParticleEventHistograms2D_N; t++) // type, see enum eParticleEventHistograms2D + // *) particle sparse histograms: + for (int t = 0; t < eDiffWeightCategory_N; t++) // category, see enum eDiffWeightCategory + { + for (int rs = 0; rs < 2; rs++) // reco/sim + { + if (!ph.fParticleSparseHistograms[t][rs]) { + continue; + } + histTitle = ph.fParticleSparseHistograms[t][rs]->GetTitle(); + if (histTitle.Contains("__RUN_NUMBER__")) { + histTitle.ReplaceAll("__RUN_NUMBER__", tc.fRunNumber.Data()); // it replaces in-place + ph.fParticleSparseHistograms[t][rs]->SetTitle(histTitle.Data()); + } + } // for(int rs=0;rs<2;rs++) // reco/sim + } // for (int t = 0; t < eDiffWeightCategory; t++) // category, see enum eDiffWeightCategory + + // *) "correlations vs." histograms 2D: + for (int t = 0; t < eQACorrelationsVsHistograms2D_N; t++) // type, see enum eCorrelationsVsHistograms2D + { + for (int h = 0; h < gMaxHarmonic; h++) { + for (int rs = 0; rs < 2; rs++) // reco/sim + { + if (!qa.fQACorrelationsVsHistograms2D[t][h][rs]) { + continue; + } + histTitle = qa.fQACorrelationsVsHistograms2D[t][h][rs]->GetTitle(); + if (histTitle.Contains("__RUN_NUMBER__")) { + histTitle.ReplaceAll("__RUN_NUMBER__", tc.fRunNumber.Data()); // it replaces in-place + qa.fQACorrelationsVsHistograms2D[t][h][rs]->SetTitle(histTitle.Data()); + } + } // for(int rs=0;rs<2;rs++) // reco/sim + } // for (int h = 0; h < gMaxHarmonic; h++) + } // for (int t = 0; t < eQACorrelationsVsHistograms2D_N; t++) // type, see enum eCorrelationsVsHistograms2D + // *) particle cuts: for (int rs = 0; rs < 2; rs++) // reco/sim { @@ -5455,7 +6093,7 @@ void EventCutsCounters(T1 const& collision, T2 const& tracks) } } - ec.fEventCutCounterBinLabelingIsDone = kTRUE; // this flag ensures that this specific binning is performed only once, for the first processed event + ec.fEventCutCounterBinLabelingIsDone = true; // this flag ensures that this specific binning is performed only once, for the first processed event // delete ec.fEventCutCounterMap[eRec]; // TBI 20240508 if i do not need them later, I could delete here // delete ec.fEventCutCounterMap[eSim]; // delete ec.fEventCutCounterMapInverse[eRec]; @@ -5531,11 +6169,11 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eTrigger, eCutCounterBinning); } else if (ec.fsEventCuts[eTrigger].EqualTo("kINT7") && !collision.alias_bit(kINT7)) { // Validated only for Run 2 if (!EventCut(eRec, eTrigger, cutModus)) { - return kFALSE; + return false; } } else if (ec.fsEventCuts[eTrigger].EqualTo("kTVXinTRD") && !collision.alias_bit(kTVXinTRD)) { // Validated only for Run 3 if (!EventCut(eRec, eTrigger, cutModus)) { - return kFALSE; + return false; } } // ... @@ -5549,7 +6187,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eSel8, eCutCounterBinning); } else if (!collision.sel8()) { if (!EventCut(eRec, eSel8, cutModus)) { - return kFALSE; + return false; } } } @@ -5560,7 +6198,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eTotalMultiplicity, eCutCounterBinning); } else if (tracks.size() < ec.fdEventCuts[eTotalMultiplicity][eMin] || tracks.size() > ec.fdEventCuts[eTotalMultiplicity][eMax] || TMath::Abs(tracks.size() - ec.fdEventCuts[eTotalMultiplicity][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eRec, eTotalMultiplicity, cutModus)) { - return kFALSE; + return false; } } } @@ -5576,7 +6214,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eReferenceMultiplicity, eCutCounterBinning); } else if (ebye.fReferenceMultiplicity < ec.fdEventCuts[eReferenceMultiplicity][eMin] || ebye.fReferenceMultiplicity > ec.fdEventCuts[eReferenceMultiplicity][eMax] || TMath::Abs(ebye.fReferenceMultiplicity - ec.fdEventCuts[eReferenceMultiplicity][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eRec, eReferenceMultiplicity, cutModus)) { - return kFALSE; + return false; } } } @@ -5588,7 +6226,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eCentrality, eCutCounterBinning); } else if (ebye.fCentrality < ec.fdEventCuts[eCentrality][eMin] || ebye.fCentrality > ec.fdEventCuts[eCentrality][eMax] || TMath::Abs(ebye.fCentrality - ec.fdEventCuts[eCentrality][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eRec, eCentrality, cutModus)) { - return kFALSE; + return false; } } } @@ -5599,7 +6237,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eVertex_x, eCutCounterBinning); } else if (collision.posX() < ec.fdEventCuts[eVertex_x][eMin] || collision.posX() > ec.fdEventCuts[eVertex_x][eMax] || TMath::Abs(collision.posX() - ec.fdEventCuts[eVertex_x][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eRec, eVertex_x, cutModus)) { - return kFALSE; + return false; } } } @@ -5610,7 +6248,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eVertex_y, eCutCounterBinning); } else if (collision.posY() < ec.fdEventCuts[eVertex_y][eMin] || collision.posY() > ec.fdEventCuts[eVertex_y][eMax] || TMath::Abs(collision.posY() - ec.fdEventCuts[eVertex_y][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eRec, eVertex_y, cutModus)) { - return kFALSE; + return false; } } } @@ -5621,7 +6259,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eVertex_z, eCutCounterBinning); } else if (collision.posZ() < ec.fdEventCuts[eVertex_z][eMin] || collision.posZ() > ec.fdEventCuts[eVertex_z][eMax] || TMath::Abs(collision.posZ() - ec.fdEventCuts[eVertex_z][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eRec, eVertex_z, cutModus)) { - return kFALSE; + return false; } } } @@ -5632,7 +6270,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eMinVertexDistanceFromIP, eCutCounterBinning); } else if (sqrt(pow(collision.posX(), 2.) + pow(collision.posY(), 2.) + pow(collision.posZ(), 2.)) < ec.fdEventCuts[eMinVertexDistanceFromIP][eMin]) { if (!EventCut(eRec, eMinVertexDistanceFromIP, cutModus)) { - return kFALSE; + return false; } } } @@ -5643,7 +6281,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eNContributors, eCutCounterBinning); } else if (collision.numContrib() < ec.fdEventCuts[eNContributors][eMin] || collision.numContrib() > ec.fdEventCuts[eNContributors][eMax] || TMath::Abs(collision.numContrib() - ec.fdEventCuts[eNContributors][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eRec, eNContributors, cutModus)) { - return kFALSE; + return false; } } } @@ -5656,7 +6294,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) if constexpr (rs == eRecAndSim || rs == eRecAndSim_Run2 || rs == eRecAndSim_Run1) { if (!collision.has_mcCollision()) { LOGF(warning, "No MC collision for this collision, skip..."); // TBI 20231106 re-think. I shouldn't probably get to this point, if MC truth info doesn't exist for this collision - return kFALSE; + return false; } // In this branch I can cut additionally and directly on corresponding MC truth simulated, e.g. on collision.mcCollision().posZ(). @@ -5683,7 +6321,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eSim, eImpactParameter, eCutCounterBinning); } else if (collision.impactParameter() < ec.fdEventCuts[eImpactParameter][eMin] || collision.impactParameter() > ec.fdEventCuts[eImpactParameter][eMax] || TMath::Abs(collision.impactParameter() - ec.fdEventCuts[eImpactParameter][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eSim, eImpactParameter, cutModus)) { - return kFALSE; + return false; } } } @@ -5694,7 +6332,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eSim, eEventPlaneAngle, eCutCounterBinning); } else if (collision.eventPlaneAngle() < ec.fdEventCuts[eEventPlaneAngle][eMin] || collision.eventPlaneAngle() > ec.fdEventCuts[eEventPlaneAngle][eMax] || TMath::Abs(collision.eventPlaneAngle() - ec.fdEventCuts[eEventPlaneAngle][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eSim, eEventPlaneAngle, cutModus)) { - return kFALSE; + return false; } } } @@ -5713,7 +6351,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eSim, eVertex_x, eCutCounterBinning); } else if (collision.posX() < ec.fdEventCuts[eVertex_x][eMin] || collision.posX() > ec.fdEventCuts[eVertex_x][eMax] || TMath::Abs(collision.posX() - ec.fdEventCuts[eVertex_x][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eSim, eVertex_x, cutModus)) { - return kFALSE; + return false; } } } @@ -5724,7 +6362,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eSim, eVertex_y, eCutCounterBinning); } else if (collision.posY() < ec.fdEventCuts[eVertex_y][eMin] || collision.posY() > ec.fdEventCuts[eVertex_y][eMax] || TMath::Abs(collision.posY() - ec.fdEventCuts[eVertex_y][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eSim, eVertex_y, cutModus)) { - return kFALSE; + return false; } } } @@ -5735,7 +6373,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eSim, eVertex_z, eCutCounterBinning); } else if (collision.posZ() < ec.fdEventCuts[eVertex_z][eMin] || collision.posZ() > ec.fdEventCuts[eVertex_z][eMax] || TMath::Abs(collision.posZ() - ec.fdEventCuts[eVertex_z][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eSim, eVertex_z, cutModus)) { - return kFALSE; + return false; } } } @@ -5746,7 +6384,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eMinVertexDistanceFromIP, eCutCounterBinning); } else if (sqrt(pow(collision.posX(), 2.) + pow(collision.posY(), 2.) + pow(collision.posZ(), 2.)) < ec.fdEventCuts[eMinVertexDistanceFromIP][eMin]) { if (!EventCut(eRec, eMinVertexDistanceFromIP, cutModus)) { - return kFALSE; + return false; } } } @@ -5776,7 +6414,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eOccupancy, eCutCounterBinning); } else if (ebye.fOccupancy < ec.fdEventCuts[eOccupancy][eMin] || ebye.fOccupancy > ec.fdEventCuts[eOccupancy][eMax] || TMath::Abs(ebye.fOccupancy - ec.fdEventCuts[eOccupancy][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eRec, eOccupancy, cutModus)) { - return kFALSE; + return false; } } } @@ -5787,7 +6425,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eInteractionRate, eCutCounterBinning); } else if (ebye.fInteractionRate < ec.fdEventCuts[eInteractionRate][eMin] || ebye.fInteractionRate > ec.fdEventCuts[eInteractionRate][eMax] || TMath::Abs(ebye.fInteractionRate - ec.fdEventCuts[eInteractionRate][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eRec, eInteractionRate, cutModus)) { - return kFALSE; + return false; } } } @@ -5798,7 +6436,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eCurrentRunDuration, eCutCounterBinning); } else if (ebye.fCurrentRunDuration < ec.fdEventCuts[eCurrentRunDuration][eMin] || ebye.fCurrentRunDuration > ec.fdEventCuts[eCurrentRunDuration][eMax] || TMath::Abs(ebye.fCurrentRunDuration - ec.fdEventCuts[eCurrentRunDuration][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eRec, eCurrentRunDuration, cutModus)) { - return kFALSE; + return false; } } } @@ -5809,7 +6447,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eNoSameBunchPileup, eCutCounterBinning); } else if (!collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { if (!EventCut(eRec, eNoSameBunchPileup, cutModus)) { - return kFALSE; + return false; } } } @@ -5820,7 +6458,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eIsGoodZvtxFT0vsPV, eCutCounterBinning); } else if (!collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { if (!EventCut(eRec, eIsGoodZvtxFT0vsPV, cutModus)) { - return kFALSE; + return false; } } } @@ -5831,7 +6469,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eIsVertexITSTPC, eCutCounterBinning); } else if (!collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) { if (!EventCut(eRec, eIsVertexITSTPC, cutModus)) { - return kFALSE; + return false; } } } @@ -5842,7 +6480,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eIsVertexTOFmatched, eCutCounterBinning); } else if (!collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) { if (!EventCut(eRec, eIsVertexTOFmatched, cutModus)) { - return kFALSE; + return false; } } } @@ -5853,7 +6491,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eIsVertexTRDmatched, eCutCounterBinning); } else if (!collision.selection_bit(o2::aod::evsel::kIsVertexTRDmatched)) { if (!EventCut(eRec, eIsVertexTRDmatched, cutModus)) { - return kFALSE; + return false; } } } @@ -5864,7 +6502,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eNoCollInTimeRangeStrict, eCutCounterBinning); } else if (!collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStrict)) { if (!EventCut(eRec, eNoCollInTimeRangeStrict, cutModus)) { - return kFALSE; + return false; } } } @@ -5875,7 +6513,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eNoCollInTimeRangeStandard, eCutCounterBinning); } else if (!collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { if (!EventCut(eRec, eNoCollInTimeRangeStandard, cutModus)) { - return kFALSE; + return false; } } } @@ -5886,7 +6524,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eNoCollInRofStrict, eCutCounterBinning); } else if (!collision.selection_bit(o2::aod::evsel::kNoCollInRofStrict)) { if (!EventCut(eRec, eNoCollInRofStrict, cutModus)) { - return kFALSE; + return false; } } } @@ -5897,7 +6535,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eNoCollInRofStandard, eCutCounterBinning); } else if (!collision.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { if (!EventCut(eRec, eNoCollInRofStandard, cutModus)) { - return kFALSE; + return false; } } } @@ -5908,7 +6546,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eNoHighMultCollInPrevRof, eCutCounterBinning); } else if (!collision.selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof)) { if (!EventCut(eRec, eNoHighMultCollInPrevRof, cutModus)) { - return kFALSE; + return false; } } } @@ -5919,7 +6557,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eIsGoodITSLayer3, eCutCounterBinning); } else if (!collision.selection_bit(o2::aod::evsel::kIsGoodITSLayer3)) { if (!EventCut(eRec, eIsGoodITSLayer3, cutModus)) { - return kFALSE; + return false; } } } @@ -5930,7 +6568,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eIsGoodITSLayer0123, eCutCounterBinning); } else if (!collision.selection_bit(o2::aod::evsel::kIsGoodITSLayer0123)) { if (!EventCut(eRec, eIsGoodITSLayer0123, cutModus)) { - return kFALSE; + return false; } } } @@ -5941,7 +6579,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eIsGoodITSLayersAll, eCutCounterBinning); } else if (!collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { if (!EventCut(eRec, eIsGoodITSLayersAll, cutModus)) { - return kFALSE; + return false; } } } @@ -5957,7 +6595,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eCentralityWeights, eCutCounterBinning); } else if (gRandom->Uniform(0, 1) > CentralityWeight(ebye.fCentrality)) { // yes, since centralityWeight is normalized probability (see CentralityWeight(...)) if (!EventCut(eRec, eCentralityWeights, cutModus)) { - return kFALSE; + return false; } } } @@ -5970,7 +6608,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) if constexpr (rs == eRecAndSim) { if (!collision.has_mcCollision()) { LOGF(warning, "No MC collision for this collision, skip..."); // TBI 20231106 re-think. I shouldn't probably get to this point, if MC truth info doesn't exist for this collision - return kFALSE; + return false; } // In this branch I can cut additionally and directly on corresponding MC truth simulated. @@ -6007,7 +6645,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eSel7, eCutCounterBinning); } else if (!collision.sel7()) { if (!EventCut(eRec, eSel7, cutModus)) { - return kFALSE; + return false; } } } @@ -6023,7 +6661,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eCentralityWeights, eCutCounterBinning); } else if (gRandom->Uniform(0, 1) > CentralityWeight(ebye.fCentrality)) { // yes, since centralityWeight is normalized probability (see CentralityWeight(...)) if (!EventCut(eRec, eCentralityWeights, cutModus)) { - return kFALSE; + return false; } } } @@ -6036,7 +6674,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) if constexpr (rs == eRecAndSim_Run2 || rs == eRecAndSim_Run1) { if (!collision.has_mcCollision()) { LOGF(warning, "No MC collision for this collision, skip..."); // TBI 20231106 re-think. I shouldn't probably get to this point, if MC truth info doesn't exist for this collision - return kFALSE; + return false; } // In this branch I can cut additionally and directly on corresponding MC truth simulated. @@ -6074,7 +6712,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eTotalMultiplicity, eCutCounterBinning); } else if (tracks.size() < ec.fdEventCuts[eTotalMultiplicity][eMin] || tracks.size() > ec.fdEventCuts[eTotalMultiplicity][eMax] || TMath::Abs(tracks.size() - ec.fdEventCuts[eTotalMultiplicity][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eRec, eTotalMultiplicity, cutModus)) { - return kFALSE; + return false; } } } @@ -6085,7 +6723,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eSim, eVertex_z, eCutCounterBinning); } else if (collision.posZ() < ec.fdEventCuts[eVertex_z][eMin] || collision.posZ() > ec.fdEventCuts[eVertex_z][eMax] || TMath::Abs(collision.posZ() - ec.fdEventCuts[eVertex_z][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eSim, eVertex_z, cutModus)) { - return kFALSE; + return false; } } } @@ -6096,7 +6734,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) EventCut(eRec, eCentrality, eCutCounterBinning); } else if (ebye.fCentrality < ec.fdEventCuts[eCentrality][eMin] || ebye.fCentrality > ec.fdEventCuts[eCentrality][eMax] || TMath::Abs(ebye.fCentrality - ec.fdEventCuts[eCentrality][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eRec, eCentrality, cutModus)) { - return kFALSE; + return false; } } } @@ -6105,7 +6743,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) } // if constexpr (rs == eTest) { - return kTRUE; + return true; } // template bool EventCuts(T1 const& collision, T2 const& tracks) @@ -6115,6 +6753,8 @@ bool EventCut(int rs, int eventCut, eCutModus cutModus) { // Helper function to reduce code bloat in EventCuts(). It's meant to be used only in EventCuts(). // It can be used also in exceptional cases outside of EventCuts(), like for eMultiplicity, but use with care. + // For instance, I can call EventCut(eRec, eCentrality, eCutCounterSequential) directly, only if I have checked that + // fUseEventCutCounterSequential is true, etc. // Remark: Remember that as a second argument I cannot use enum eEventCuts, because here in one go I take both enum eEventCuts and enum eEventHistograms . @@ -6132,28 +6772,28 @@ bool EventCut(int rs, int eventCut, eCutModus cutModus) if (tc.fVerboseEventCut) { LOGF(info, "\033[1;31mEvent didn't survive the cut: %s\033[0m", ec.fEventCutName[eventCut].Data()); } - return kFALSE; + return false; break; case eCutCounterBinning: ec.fEventCutCounterMap[rs]->Add(ec.fEventCutCounterBinNumber[rs], eventCut); ec.fEventCutCounterMapInverse[rs]->Add(eventCut, ec.fEventCutCounterBinNumber[rs]); ec.fEventCutCounterBinNumber[rs]++; // yes - return kTRUE; + return true; break; case eCutCounterAbsolute: ec.fEventCutCounterHist[rs][eAbsolute]->Fill(ec.fEventCutCounterMapInverse[rs]->GetValue(eventCut)); - return kTRUE; // yes, so that I can proceed with another cut in EventCuts + return true; // yes, so that I can proceed with another cut in EventCuts break; case eCutCounterSequential: ec.fEventCutCounterHist[rs][eSequential]->Fill(ec.fEventCutCounterMapInverse[rs]->GetValue(eventCut)); - return kFALSE; // yes, so that I bail out from EventCuts + return false; // yes, so that I bail out from EventCuts break; default: LOGF(fatal, "\033[1;31m%s at line %d : This cutModus = %d is not supported yet. \033[0m", __FUNCTION__, __LINE__, static_cast(cutModus)); break; } // switch(cutModus) - return kFALSE; // obsolete, but it suppresses the warning... + return false; // obsolete, but it suppresses the warning... } // bool EventCut(int rs, int eventCut, eCutModus cutModus) @@ -6188,13 +6828,15 @@ bool RemainingEventCuts() if (ec.fUseEventCuts[eMultiplicity]) { if (ebye.fMultiplicity < ec.fdEventCuts[eMultiplicity][eMin] || ebye.fMultiplicity > ec.fdEventCuts[eMultiplicity][eMax] || TMath::Abs(ebye.fMultiplicity - ec.fdEventCuts[eMultiplicity][eMax]) < tc.fFloatingPointPrecision) { // Remark: I have to implement RemainingEventCuts() in a slightly different way as EventCuts() - EventCut(rs, eMultiplicity, eCut); // just a printout that this event didn't survive this cut - EventCut(rs, eMultiplicity, eCutCounterSequential); - return kFALSE; + EventCut(rs, eMultiplicity, eCut); // just a printout that this event didn't survive this cut + if (ec.fUseEventCutCounterSequential) { // yes, this is important. Otherwise fEventCutCounterHist can be used in EventCut(...), even though it's NULL + EventCut(rs, eMultiplicity, eCutCounterSequential); + } + return false; } } - return kTRUE; + return true; } // bool RemainingEventCuts() @@ -6288,6 +6930,46 @@ void FillEventHistograms(T1 const& collision, T2 const& tracks, eBeforeAfter ba) !qa.fQAEventHistograms2D[eCentrality_vs_Vertex_z][eRec][ba] ? true : qa.fQAEventHistograms2D[eCentrality_vs_Vertex_z][eRec][ba]->Fill(ebye.fCentrality, collision.posZ()); } + if (qa.fFillQACorrelationsVsHistograms2D && qa.fQAParticleEventProEbyE[eRec][ba] && ba == eAfter) { // fill only for eAfter, because I do not calculate Q-vectors before cuts + + // Calculate quickly 2-p correlation in harmonic h for this event: TBI 20250114 shall I add this also to some EbyE variable? There is no really much of a code bloat for the time being... + + // Flush 'n' fill the generic Q-vectors: + ResetQ(); + int lMaxCorrelator = 2; // used only here locally + for (int h = 0; h < gMaxHarmonic * lMaxCorrelator + 1; h++) { + for (int wp = 0; wp < lMaxCorrelator + 1; wp++) // weight power + { + qv.fQ[h][wp] = qv.fQvector[h][wp]; + } + } + + for (int h = 1; h <= gMaxHarmonic; h++) { + TComplex two = Two(h, -h); + double twoC = two.Re(); // cos + // double twoS = two.Im(); // sin + double wTwo = Two(0, 0).Re(); // Weight is 'number of combinations' by default TBI + // 20220809 add support for other weights + if (wTwo > 0.0) { + twoC /= wTwo; + } else { + LOGF(fatal, "In function \033[1;31m%s at line %d, wTwo = %f <=0. ebye.fSelectedTracks = %d\033[0m", __FUNCTION__, __LINE__, wTwo, ebye.fSelectedTracks); + } + !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_Multiplicity][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_Multiplicity][h - 1][eRec]->Fill(twoC, ebye.fMultiplicity); + !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_ReferenceMultiplicity][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_ReferenceMultiplicity][h - 1][eRec]->Fill(twoC, ebye.fReferenceMultiplicity); + !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_Centrality][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_Centrality][h - 1][eRec]->Fill(twoC, ebye.fCentrality); + // ..... + !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeanPhi][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeanPhi][h - 1][eRec]->Fill(twoC, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeanPhi)); + !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeanPt][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeanPt][h - 1][eRec]->Fill(twoC, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeanPt)); + !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeanEta][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeanEta][h - 1][eRec]->Fill(twoC, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeanEta)); + // ..... + } + + // Flush the generic Q-vectors: + ResetQ(); + + } // if (qa.fFillQACorrelationsVsHistograms2D && qa.fQAParticleEventProEbyE[eRec][ba] && ba == eAfter) { + // ... and corresponding MC truth simulated (common to Run 3, Run 2 and Run 1) ( see https://github.com/AliceO2Group/O2Physics/blob/master/Tutorials/src/mcHistograms.cxx ): if constexpr (rs == eRecAndSim || rs == eRecAndSim_Run2 || rs == eRecAndSim_Run1) { if (!collision.has_mcCollision()) { @@ -6693,7 +7375,7 @@ bool ValidTrack(T const& track) if (tc.fVerboseForEachParticle) { LOGF(info, "\033[1;31m%s track.trackType() == o2::aod::track::TrackTypeEnum::Trac\033[0m", __FUNCTION__); } - return kFALSE; + return false; } } @@ -6704,7 +7386,7 @@ bool ValidTrack(T const& track) if (tc.fVerboseForEachParticle) { LOGF(info, "\033[1;31m%s track.trackType() == o2::aod::track::TrackTypeEnum::Run2Track\033[0m", __FUNCTION__); } - return kFALSE; + return false; } } @@ -6722,7 +7404,7 @@ bool ValidTrack(T const& track) LOGF(info, "\033[1;31m%s std::isnan(track.phi()) || std::isnan(track.pt()) || std::isnan(track.eta())\033[0m", __FUNCTION__); LOGF(error, "track.phi() = %f\ntrack.pt() = %f\ntrack.eta() = %f", track.phi(), track.pt(), track.eta()); } - return kFALSE; + return false; } // *) ... @@ -6731,7 +7413,7 @@ bool ValidTrack(T const& track) } // if(tc.fInsanityCheckForEachParticle) { // *) All checks above survived, then it's a valid track: - return kTRUE; + return true; } // template bool ValidTrack(T const& track) @@ -6776,7 +7458,7 @@ void ParticleCutsCounters(T const& track) pc.fParticleCutCounterHist[rec_sim][cc]->GetXaxis()->SetRangeUser(pc.fParticleCutCounterHist[rec_sim][cc]->GetBinLowEdge(1), pc.fParticleCutCounterHist[rec_sim][cc]->GetBinLowEdge(pc.fParticleCutCounterBinNumber[rec_sim])); } } - pc.fParticleCutCounterBinLabelingIsDone = kTRUE; // this flag ensures that this specific binning is performed only once, for the first processed particle + pc.fParticleCutCounterBinLabelingIsDone = true; // this flag ensures that this specific binning is performed only once, for the first processed particle // delete pc.fParticleCutCounterMap[eRec]; // TBI 20240508 if i do not need them later, I could delete here // delete pc.fParticleCutCounterMap[eSim]; // delete pc.fParticleCutCounterMapInverse[eRec]; @@ -6831,7 +7513,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, ePhi, eCutCounterBinning); } else if (track.phi() < pc.fdParticleCuts[ePhi][eMin] || track.phi() > pc.fdParticleCuts[ePhi][eMax] || TMath::Abs(track.phi() - pc.fdParticleCuts[ePhi][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eRec, ePhi, cutModus)) { - return kFALSE; + return false; } } } @@ -6842,7 +7524,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, ePt, eCutCounterBinning); } else if (track.pt() < pc.fdParticleCuts[ePt][eMin] || track.pt() > pc.fdParticleCuts[ePt][eMax] || TMath::Abs(track.pt() - pc.fdParticleCuts[ePt][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eRec, ePt, cutModus)) { - return kFALSE; + return false; } } } @@ -6853,7 +7535,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, eEta, eCutCounterBinning); } else if (track.eta() < pc.fdParticleCuts[eEta][eMin] || track.eta() > pc.fdParticleCuts[eEta][eMax] || TMath::Abs(track.eta() - pc.fdParticleCuts[eEta][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eRec, eEta, cutModus)) { - return kFALSE; + return false; } } } @@ -6866,7 +7548,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) // With first condition, I always throw away neutral particles. // I can use safely == here, because track.sign() returns short int. if (!ParticleCut(eRec, eCharge, cutModus)) { - return kFALSE; + return false; } } } @@ -6877,7 +7559,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, etpcNClsFindable, eCutCounterBinning); } else if (track.tpcNClsFindable() < pc.fdParticleCuts[etpcNClsFindable][eMin] || track.tpcNClsFindable() > pc.fdParticleCuts[etpcNClsFindable][eMax]) { if (!ParticleCut(eRec, etpcNClsFindable, cutModus)) { - return kFALSE; + return false; } } } @@ -6888,7 +7570,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, etpcNClsShared, eCutCounterBinning); } else if (track.tpcNClsShared() < pc.fdParticleCuts[etpcNClsShared][eMin] || track.tpcNClsShared() > pc.fdParticleCuts[etpcNClsShared][eMax]) { if (!ParticleCut(eRec, etpcNClsShared, cutModus)) { - return kFALSE; + return false; } } } @@ -6899,7 +7581,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, eitsChi2NCl, eCutCounterBinning); } else if (track.itsChi2NCl() < pc.fdParticleCuts[eitsChi2NCl][eMin] || track.itsChi2NCl() > pc.fdParticleCuts[eitsChi2NCl][eMax]) { if (!ParticleCut(eRec, eitsChi2NCl, cutModus)) { - return kFALSE; + return false; } } } @@ -6910,7 +7592,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, etpcNClsFound, eCutCounterBinning); } else if (track.tpcNClsFound() < pc.fdParticleCuts[etpcNClsFound][eMin] || track.tpcNClsFound() > pc.fdParticleCuts[etpcNClsFound][eMax]) { if (!ParticleCut(eRec, etpcNClsFound, cutModus)) { - return kFALSE; + return false; } } } @@ -6921,7 +7603,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, etpcNClsCrossedRows, eCutCounterBinning); } else if (track.tpcNClsCrossedRows() < pc.fdParticleCuts[etpcNClsCrossedRows][eMin] || track.tpcNClsCrossedRows() > pc.fdParticleCuts[etpcNClsCrossedRows][eMax]) { if (!ParticleCut(eRec, etpcNClsCrossedRows, cutModus)) { - return kFALSE; + return false; } } } @@ -6932,7 +7614,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, eitsNCls, eCutCounterBinning); } else if (track.itsNCls() < pc.fdParticleCuts[eitsNCls][eMin] || track.itsNCls() > pc.fdParticleCuts[eitsNCls][eMax]) { if (!ParticleCut(eRec, eitsNCls, cutModus)) { - return kFALSE; + return false; } } } @@ -6943,7 +7625,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, eitsNClsInnerBarrel, eCutCounterBinning); } else if (track.itsNClsInnerBarrel() < pc.fdParticleCuts[eitsNClsInnerBarrel][eMin] || track.itsNClsInnerBarrel() > pc.fdParticleCuts[eitsNClsInnerBarrel][eMax]) { if (!ParticleCut(eRec, eitsNClsInnerBarrel, cutModus)) { - return kFALSE; + return false; } } } @@ -6954,7 +7636,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, etpcCrossedRowsOverFindableCls, eCutCounterBinning); } else if (track.tpcCrossedRowsOverFindableCls() < pc.fdParticleCuts[etpcCrossedRowsOverFindableCls][eMin] || track.tpcCrossedRowsOverFindableCls() > pc.fdParticleCuts[etpcCrossedRowsOverFindableCls][eMax] || TMath::Abs(track.tpcCrossedRowsOverFindableCls() - pc.fdParticleCuts[etpcCrossedRowsOverFindableCls][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eRec, etpcCrossedRowsOverFindableCls, cutModus)) { - return kFALSE; + return false; } } } @@ -6965,7 +7647,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, etpcFoundOverFindableCls, eCutCounterBinning); } else if (track.tpcFoundOverFindableCls() < pc.fdParticleCuts[etpcFoundOverFindableCls][eMin] || track.tpcFoundOverFindableCls() > pc.fdParticleCuts[etpcFoundOverFindableCls][eMax] || TMath::Abs(track.tpcFoundOverFindableCls() - pc.fdParticleCuts[etpcFoundOverFindableCls][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eRec, etpcFoundOverFindableCls, cutModus)) { - return kFALSE; + return false; } } } @@ -6976,7 +7658,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, etpcFractionSharedCls, eCutCounterBinning); } else if (track.tpcFractionSharedCls() < pc.fdParticleCuts[etpcFractionSharedCls][eMin] || track.tpcFractionSharedCls() > pc.fdParticleCuts[etpcFractionSharedCls][eMax] || TMath::Abs(track.tpcFractionSharedCls() - pc.fdParticleCuts[etpcFractionSharedCls][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eRec, etpcFractionSharedCls, cutModus)) { - return kFALSE; + return false; } } } @@ -6987,7 +7669,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, etpcChi2NCl, eCutCounterBinning); } else if (track.tpcChi2NCl() < pc.fdParticleCuts[etpcChi2NCl][eMin] || track.tpcChi2NCl() > pc.fdParticleCuts[etpcChi2NCl][eMax] || TMath::Abs(track.tpcChi2NCl() - pc.fdParticleCuts[etpcChi2NCl][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eRec, etpcChi2NCl, cutModus)) { - return kFALSE; + return false; } } } @@ -6998,7 +7680,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, edcaXY, eCutCounterBinning); } else if (track.dcaXY() < pc.fdParticleCuts[edcaXY][eMin] || track.dcaXY() > pc.fdParticleCuts[edcaXY][eMax] || TMath::Abs(track.dcaXY() - pc.fdParticleCuts[edcaXY][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eRec, edcaXY, cutModus)) { - return kFALSE; + return false; } } } @@ -7009,7 +7691,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, edcaZ, eCutCounterBinning); } else if (track.dcaZ() < pc.fdParticleCuts[edcaZ][eMin] || track.dcaZ() > pc.fdParticleCuts[edcaZ][eMax] || TMath::Abs(track.dcaZ() - pc.fdParticleCuts[edcaZ][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eRec, edcaZ, cutModus)) { - return kFALSE; + return false; } } } @@ -7020,7 +7702,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, etrackCutFlag, eCutCounterBinning); } else if (!track.trackCutFlag()) { if (!ParticleCut(eRec, etrackCutFlag, cutModus)) { - return kFALSE; + return false; } } } @@ -7031,7 +7713,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, etrackCutFlagFb1, eCutCounterBinning); } else if (!track.trackCutFlagFb1()) { if (!ParticleCut(eRec, etrackCutFlagFb1, cutModus)) { - return kFALSE; + return false; } } } @@ -7042,7 +7724,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, etrackCutFlagFb2, eCutCounterBinning); } else if (!track.trackCutFlagFb2()) { if (!ParticleCut(eRec, etrackCutFlagFb2, cutModus)) { - return kFALSE; + return false; } } } @@ -7053,7 +7735,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, eisQualityTrack, eCutCounterBinning); } else if (!track.isQualityTrack()) { if (!ParticleCut(eRec, eisQualityTrack, cutModus)) { - return kFALSE; + return false; } } } @@ -7064,7 +7746,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, eisPrimaryTrack, eCutCounterBinning); } else if (!track.isPrimaryTrack()) { if (!ParticleCut(eRec, eisPrimaryTrack, cutModus)) { - return kFALSE; + return false; } } } @@ -7075,7 +7757,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, eisInAcceptanceTrack, eCutCounterBinning); } else if (!track.isInAcceptanceTrack()) { if (!ParticleCut(eRec, eisInAcceptanceTrack, cutModus)) { - return kFALSE; + return false; } } } @@ -7086,7 +7768,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, eisGlobalTrack, eCutCounterBinning); } else if (!track.isGlobalTrack()) { if (!ParticleCut(eRec, eisGlobalTrack, cutModus)) { - return kFALSE; + return false; } } } @@ -7097,7 +7779,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, eisPVContributor, eCutCounterBinning); } else if (!track.isPVContributor()) { if (!ParticleCut(eRec, eisPVContributor, cutModus)) { - return kFALSE; + return false; } } } @@ -7108,7 +7790,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, ePtDependentDCAxyParameterization, eCutCounterBinning); } else if (TMath::Abs(track.dcaXY()) > pc.fPtDependentDCAxyFormula->Eval(track.pt())) { if (!ParticleCut(eRec, ePtDependentDCAxyParameterization, cutModus)) { - return kFALSE; + return false; } } } @@ -7122,7 +7804,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) if (!track.has_mcParticle()) { LOGF(warning, "No MC particle for this track, skip..."); - return kFALSE; // TBI 20231107 re-think. I shouldn't probably get to this point, if MC truth info doesn't exist for this track + return false; // TBI 20231107 re-think. I shouldn't probably get to this point, if MC truth info doesn't exist for this track } // auto mcparticle = track.mcParticle(); // corresponding MC truth simulated particle @@ -7136,7 +7818,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eSim, ePhi, eCutCounterBinning); } else if (mcparticle.phi() < pc.fdParticleCuts[ePhi][eMin] || mcparticle.phi() > pc.fdParticleCuts[ePhi][eMax]) { if (!ParticleCut(eSim, ePhi, cutModus)) { - return kFALSE; + return false; } } } @@ -7149,7 +7831,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) } else if (0 == mcparticle.sign() || mcparticle.sign() < pc.fdParticleCuts[eCharge][eMin] || mcparticle.sign() > pc.fdParticleCuts[eCharge][eMax]) { // TBI 20240511 with first condition, I always throw away neutral particles, so for the time being that is hardcoded if (!ParticleCut(eSim, eCharge, cutModus)) { - return kFALSE; + return false; } } } @@ -7175,7 +7857,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eSim, ePhi, eCutCounterBinning); } else if (track.phi() < pc.fdParticleCuts[ePhi][eMin] || track.phi() > pc.fdParticleCuts[ePhi][eMax] || TMath::Abs(track.phi() - pc.fdParticleCuts[ePhi][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eSim, ePhi, cutModus)) { - return kFALSE; + return false; } } } @@ -7186,7 +7868,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eSim, ePt, eCutCounterBinning); } else if (track.pt() < pc.fdParticleCuts[ePt][eMin] || track.pt() > pc.fdParticleCuts[ePt][eMax] || TMath::Abs(track.pt() - pc.fdParticleCuts[ePt][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eSim, ePt, cutModus)) { - return kFALSE; + return false; } } } @@ -7197,7 +7879,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eSim, eEta, eCutCounterBinning); } else if (track.eta() < pc.fdParticleCuts[eEta][eMin] || track.eta() > pc.fdParticleCuts[eEta][eMax] || TMath::Abs(track.eta() - pc.fdParticleCuts[eEta][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eSim, eEta, cutModus)) { - return kFALSE; + return false; } } } @@ -7210,7 +7892,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) } else if (0 == track.sign() || track.sign() < pc.fdParticleCuts[eCharge][eMin] || track.sign() > pc.fdParticleCuts[eCharge][eMax]) { // TBI 20240511 with first condition, I always throw away neutral particles, so for the time being that is hardcoded if (!ParticleCut(eSim, eCharge, cutModus)) { - return kFALSE; + return false; } } } @@ -7234,7 +7916,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) if (!track.has_mcParticle()) { LOGF(warning, "No MC particle for this track, skip..."); - return kFALSE; // TBI 20231107 re-think. I shouldn't probably get to this point, if MC truth info doesn't exist for this track + return false; // TBI 20231107 re-think. I shouldn't probably get to this point, if MC truth info doesn't exist for this track } // auto mcparticle = track.mcParticle(); // corresponding MC truth simulated particle @@ -7271,7 +7953,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) if (!track.has_mcParticle()) { LOGF(warning, "No MC particle for this track, skip..."); - return kFALSE; // TBI 20231107 re-think. I shouldn't probably get to this point, if MC truth info doesn't exist for this track + return false; // TBI 20231107 re-think. I shouldn't probably get to this point, if MC truth info doesn't exist for this track } // auto mcparticle = track.mcParticle(); // corresponding MC truth simulated particle @@ -7306,7 +7988,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, ePhi, eCutCounterBinning); } else if (track.phi() < pc.fdParticleCuts[ePhi][eMin] || track.phi() > pc.fdParticleCuts[ePhi][eMax] || TMath::Abs(track.phi() - pc.fdParticleCuts[ePhi][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eRec, ePhi, cutModus)) { - return kFALSE; + return false; } } } @@ -7317,7 +7999,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, ePt, eCutCounterBinning); } else if (track.pt() < pc.fdParticleCuts[ePt][eMin] || track.pt() > pc.fdParticleCuts[ePt][eMax] || TMath::Abs(track.pt() - pc.fdParticleCuts[ePt][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eRec, ePt, cutModus)) { - return kFALSE; + return false; } } } @@ -7328,7 +8010,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) ParticleCut(eRec, eEta, eCutCounterBinning); } else if (track.eta() < pc.fdParticleCuts[eEta][eMin] || track.eta() > pc.fdParticleCuts[eEta][eMax] || TMath::Abs(track.eta() - pc.fdParticleCuts[eEta][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eRec, eEta, cutModus)) { - return kFALSE; + return false; } } } @@ -7357,20 +8039,20 @@ bool ParticleCuts(T const& track, eCutModus cutModus) // Apply NUA on these kine variables: if (nua.fApplyNUAPDF[ePhiNUAPDF] && !Accept(dPhi, ePhiNUAPDF)) { - return kFALSE; + return false; } if (nua.fApplyNUAPDF[ePtNUAPDF] && !Accept(dPt, ePtNUAPDF)) { - return kFALSE; + return false; } if (nua.fApplyNUAPDF[eEtaNUAPDF] && !Accept(dEta, eEtaNUAPDF)) { - return kFALSE; + return false; } // ... and corresponding MC truth simulated ( see https://github.com/AliceO2Group/O2Physics/blob/master/Tutorials/src/mcHistograms.cxx ): if constexpr (rs == eRecAndSim || rs == eRecAndSim_Run2 || rs == eRecAndSim_Run1) { if (!track.has_mcParticle()) { LOGF(warning, "No MC particle for this track, skip..."); - return kFALSE; // TBI 20231107 re-think. I shouldn't probably get to this point, if MC truth info doesn't exist for this particle + return false; // TBI 20231107 re-think. I shouldn't probably get to this point, if MC truth info doesn't exist for this particle } auto mcparticle = track.mcParticle(); // corresponding MC truth simulated particle dPhi = mcparticle.phi(); @@ -7379,13 +8061,13 @@ bool ParticleCuts(T const& track, eCutModus cutModus) // Apply NUA on these kine variables: if (nua.fApplyNUAPDF[ePhiNUAPDF] && !Accept(dPhi, ePhiNUAPDF)) { - return kFALSE; + return false; } if (nua.fApplyNUAPDF[ePtNUAPDF] && !Accept(dPt, ePtNUAPDF)) { - return kFALSE; + return false; } if (nua.fApplyNUAPDF[eEtaNUAPDF] && !Accept(dEta, eEtaNUAPDF)) { - return kFALSE; + return false; } } // if constexpr (rs == eRecAndSim || rs == eRecAndSim_Run2 || rs == eRecAndSim_Run1) { @@ -7400,19 +8082,19 @@ bool ParticleCuts(T const& track, eCutModus cutModus) // Apply NUA on these kine variables: if (nua.fApplyNUAPDF[ePhiNUAPDF] && !Accept(dPhi, ePhiNUAPDF)) { - return kFALSE; + return false; } if (nua.fApplyNUAPDF[ePtNUAPDF] && !Accept(dPt, ePtNUAPDF)) { - return kFALSE; + return false; } if (nua.fApplyNUAPDF[eEtaNUAPDF] && !Accept(dEta, eEtaNUAPDF)) { - return kFALSE; + return false; } } // if constexpr (rs == eSim || rs == eSim_Run2 || rs == eSim_Run1) { } // if(nua.fApplyNUAPDF[ePhiNUAPDF] || nua.fApplyNUAPDF[ePtNUAPDF] || nua.fApplyNUAPDF[eEtaNUAPDF]) { - return kTRUE; + return true; } // template bool ParticleCuts(T const& track, eCutModus cutModus) @@ -7429,28 +8111,28 @@ bool ParticleCut(int rs, int particleCut, eCutModus cutModus) if (tc.fVerboseForEachParticle) { LOGF(info, "\033[1;31mParticle didn't pass the cut: %s\033[0m", pc.fParticleCutName[particleCut].Data()); } - return kFALSE; + return false; break; case eCutCounterBinning: pc.fParticleCutCounterMap[rs]->Add(pc.fParticleCutCounterBinNumber[rs], particleCut); pc.fParticleCutCounterMapInverse[rs]->Add(particleCut, pc.fParticleCutCounterBinNumber[rs]); pc.fParticleCutCounterBinNumber[rs]++; // yes - return kTRUE; + return true; break; case eCutCounterAbsolute: pc.fParticleCutCounterHist[rs][eAbsolute]->Fill(pc.fParticleCutCounterMapInverse[rs]->GetValue(particleCut)); - return kTRUE; // yes, so that I can proceed with another cut in ParticleCuts + return true; // yes, so that I can proceed with another cut in ParticleCuts break; case eCutCounterSequential: pc.fParticleCutCounterHist[rs][eSequential]->Fill(pc.fParticleCutCounterMapInverse[rs]->GetValue(particleCut)); - return kFALSE; // yes, so that I bail out from ParticleCuts + return false; // yes, so that I bail out from ParticleCuts break; default: LOGF(fatal, "\033[1;31m%s at line %d : This cutModus = %d is not supported yet. \033[0m", __FUNCTION__, __LINE__, static_cast(cutModus)); break; } // switch(cutModus) - return kFALSE; // obsolete, but it suppresses the warning... + return false; // obsolete, but it suppresses the warning... } // bool ParticleCut(int rs, int particleCut, eCutModus cutModus) @@ -7527,11 +8209,33 @@ void FillParticleHistograms(T const& track, eBeforeAfter ba, int weight = 1) !ph.fParticleHistograms2D[ePhiEta][eRec][ba] ? true : ph.fParticleHistograms2D[ePhiEta][eRec][ba]->Fill(track.phi(), track.eta(), weight); } // if (ph.fFillParticleHistograms2D) { + // nD (THnSparse): + if (ba == eAfter) { // yes, I feel sparse histograms only AFTER cuts for the time being + // **) eDWPhi : here the fundamental 0-th axis never to be projected out is "phi" + if (ph.fBookParticleSparseHistograms[eDWPhi]) { + // Remark: It is mandatory that ordering in initialization here resembles the ordering in enum eDiffPhiWeights + double vector[eDiffPhiWeights_N] = {track.phi(), track.pt(), track.eta(), static_cast(track.sign()), ebye.fCentrality, ebye.fVz}; + ph.fParticleSparseHistograms[eDWPhi][eRec]->Fill(vector, weight); + } + // **) eDWPt : here the fundamental 0-th axis never to be projected out is "pt" + if (ph.fBookParticleSparseHistograms[eDWPt]) { + // Remark: It is mandatory that ordering in initialization here resembles the ordering in enum eDiffPtWeights + double vector[eDiffPtWeights_N] = {track.pt()}; + ph.fParticleSparseHistograms[eDWPt][eRec]->Fill(vector, weight); + } + // **) eDWEta : here the fundamental 0-th axis never to be projected out is "eta" + if (ph.fBookParticleSparseHistograms[eDWEta]) { + // Remark: It is mandatory that ordering in initialization here resembles the ordering in enum eDiffEtaWeights + double vector[eDiffEtaWeights_N] = {track.eta()}; + ph.fParticleSparseHistograms[eDWEta][eRec]->Fill(vector, weight); + } + } // if (ba == eAfter) { + // QA: if (qa.fFillQAParticleHistograms2D) { !qa.fQAParticleHistograms2D[ePt_vs_dcaXY][eRec][ba] ? true : qa.fQAParticleHistograms2D[ePt_vs_dcaXY][eRec][ba]->Fill(track.pt(), track.dcaXY(), weight); } - if (qa.fFillQAParticleEventHistograms2D && qa.fQAParticleEventProEbyE[eRec][ba]) { + if ((qa.fFillQAParticleEventHistograms2D || qa.fFillQACorrelationsVsHistograms2D) && qa.fQAParticleEventProEbyE[eRec][ba]) { // Here I only fill the helper profile to get average of requested particle variable for current event: qa.fQAParticleEventProEbyE[eRec][ba]->Fill(static_cast(eitsNClsEbyE) - 0.5, track.itsNCls(), weight); @@ -7559,9 +8263,18 @@ void FillParticleHistograms(T const& track, eBeforeAfter ba, int weight = 1) qa.fQAParticleEventProEbyE[eRec][ba]->Fill(static_cast(ePt1050EbyE) - 0.5, track.pt(), weight); } + // eMeanPhi: + qa.fQAParticleEventProEbyE[eRec][ba]->Fill(static_cast(eMeanPhi) - 0.5, track.phi(), weight); + + // eMeanPt: + qa.fQAParticleEventProEbyE[eRec][ba]->Fill(static_cast(eMeanPt) - 0.5, track.pt(), weight); + + // eMeanEta: + qa.fQAParticleEventProEbyE[eRec][ba]->Fill(static_cast(eMeanEta) - 0.5, track.eta(), weight); + // ... - } // if (qa.fFillQAParticleEventHistograms2D && qa.fQAParticleEventProEbyE[eRec][ba]) { + } // if ... // ... and corresponding MC truth simulated (common to Run 3, Run 2 and Run 1) // See https://github.com/AliceO2Group/O2Physics/blob/master/Tutorials/src/mcHistograms.cxx @@ -7589,6 +8302,31 @@ void FillParticleHistograms(T const& track, eBeforeAfter ba, int weight = 1) !ph.fParticleHistograms2D[ePhiEta][eSim][ba] ? true : ph.fParticleHistograms2D[ePhiEta][eSim][ba]->Fill(mcparticle.phi(), mcparticle.eta(), weight); } // if(ph.fFillParticleHistograms2D) { + // nD (THnSparse): + if (ba == eAfter) { // yes, I feel sparse histograms only AFTER cuts for the time being + // **) eDWPhi : here the fundamental 0-th axis never to be projected out is "phi" + if (ph.fBookParticleSparseHistograms[eDWPhi]) { + // Remark: It is mandatory that ordering in initialization here resembles the ordering in enum eDiffPhiWeights + double vector[eDiffPhiWeights_N] = {mcparticle.phi(), mcparticle.pt(), mcparticle.eta(), 0., 0., 0.}; + // TBI 20250223 I do not have access to particle charge signature here => I set it to 0 temporarily. + // Then, I did not calculate and store centrality for "sim" => I set it to 0 temporarily. + // Same for vertex z, I could trivially extend ebye.fVz also for "sim" dimension => I set it to 0 temporarily here, until that's done. + ph.fParticleSparseHistograms[eDWPhi][eSim]->Fill(vector, weight); + } + // **) eDWPt : here the fundamental 0-th axis never to be projected out is "pt" + if (ph.fBookParticleSparseHistograms[eDWPt]) { + // Remark: It is mandatory that ordering in initialization here resembles the ordering in enum eDiffPtWeights + double vector[eDiffPtWeights_N] = {mcparticle.pt()}; + ph.fParticleSparseHistograms[eDWPt][eSim]->Fill(vector, weight); + } + // **) eDWEta : here the fundamental 0-th axis never to be projected out is "eta" + if (ph.fBookParticleSparseHistograms[eDWEta]) { + // Remark: It is mandatory that ordering in initialization here resembles the ordering in enum eDiffEtaWeights + double vector[eDiffEtaWeights_N] = {mcparticle.eta()}; + ph.fParticleSparseHistograms[eDWEta][eSim]->Fill(vector, weight); + } + } // if (ba == eAfter) { + } // if constexpr (rs == eRecAndSim || rs == eRecAndSim_Run2 || rs == eRecAndSim_Run1) { } // if constexpr (rs == eRec || rs == eRecAndSim || rs == eRec_Run2 || rs == eRecAndSim_Run2 || rs == eRec_Run1 || rs == eRecAndSim_Run1) { @@ -9390,7 +10128,7 @@ void SetWeightsHist(TH1D* const hist, eWeights whichWeight) // Or I could move all this to GetHistogramWithWeights, where in any case I am setting e.g. histogram title, etc. TString sVariable[eWeights_N] = {"#varphi", "p_{t}", "#eta"}; // [phi,pt,eta] TString sWeights[eWeights_N] = {"w_{#varphi}", "w_{p_{t}}", "w_{#eta}"}; - pw.fWeightsHist[whichWeight]->SetStats(kFALSE); + pw.fWeightsHist[whichWeight]->SetStats(false); pw.fWeightsHist[whichWeight]->GetXaxis()->SetTitle(sVariable[whichWeight].Data()); pw.fWeightsHist[whichWeight]->GetYaxis()->SetTitle(sWeights[whichWeight].Data()); pw.fWeightsHist[whichWeight]->SetFillColor(eFillColor); @@ -9402,7 +10140,7 @@ void SetWeightsHist(TH1D* const hist, eWeights whichWeight) // But if eventually it will be possible to fetch run number programatically in init(), I will have to re-think this line. // Flag: - pw.fUseWeights[whichWeight] = kTRUE; + pw.fUseWeights[whichWeight] = true; if (tc.fVerbose) { ExitFunction(__FUNCTION__); @@ -9435,7 +10173,7 @@ void SetDiffWeightsHist(TH1D* const hist, eDiffWeights whichDiffWeight, int bin) // Or I could move all this to GetHistogramWithWeights, where in any case I am setting e.g. histogram title, etc. TString sVariable[eDiffWeights_N] = {"#varphi", "#varphi"}; // yes, for the time being, x-axis is always phi TString sWeights[eDiffWeights_N] = {"(w_{#varphi})_{| p_{T}}", "(w_{#varphi})_{| #eta}"}; - pw.fDiffWeightsHist[whichDiffWeight][bin]->SetStats(kFALSE); + pw.fDiffWeightsHist[whichDiffWeight][bin]->SetStats(false); pw.fDiffWeightsHist[whichDiffWeight][bin]->GetXaxis()->SetTitle(sVariable[whichDiffWeight].Data()); pw.fDiffWeightsHist[whichDiffWeight][bin]->GetYaxis()->SetTitle(sWeights[whichDiffWeight].Data()); pw.fDiffWeightsHist[whichDiffWeight][bin]->SetFillColor(eFillColor); @@ -9444,9 +10182,9 @@ void SetDiffWeightsHist(TH1D* const hist, eDiffWeights whichDiffWeight, int bin) // But if eventually it will be possible to fetch run number programatically in init(), I will have to re-think this line. // Flag: - if (!pw.fUseDiffWeights[whichDiffWeight]) // yes, set it only once to kTRUE, for all bins + if (!pw.fUseDiffWeights[whichDiffWeight]) // yes, set it only once to true, for all bins { - pw.fUseDiffWeights[whichDiffWeight] = kTRUE; + pw.fUseDiffWeights[whichDiffWeight] = true; } if (tc.fVerbose) { @@ -9457,9 +10195,69 @@ void SetDiffWeightsHist(TH1D* const hist, eDiffWeights whichDiffWeight, int bin) //============================================================ -void SetCentralityWeightsHist(TH1D* const hist) +void SetDiffWeightsSparse(THnSparseF* const sparse, eDiffWeightCategory dwc) { - // Copy histogram holding weights from an external file to the corresponding data member. + // Copy sparse histogram holding differential phi, pt, eta, etc., weights from an external file to the corresponding data member. + + // Remark: Do not edit sparse histogram title here, because that's done in GetHistogramWithWeights(), because I have "filePath" info there locally. + // Only if I promote "filePath" to data members, re-think the design of this function, and what goes where. + + if (tc.fVerbose) { + StartFunction(__FUNCTION__); + } + + // Finally: + // sparse->SetDirectory(0); I cannot use this for sparse + pw.fDiffWeightsSparse[dwc] = reinterpret_cast(sparse->Clone()); + + if (!pw.fDiffWeightsSparse[dwc]) { + LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); + } + + // Within current analysis the dimension of weight for each category won't change, therefore I store it permanently: + pw.fDWdimension[dwc] = pw.fDiffWeightsSparse[dwc]->GetNdimensions(); + + // I book here immediately vectors needed to fetch the weight from the right bin of THnSparse: + pw.fFindBinVector[dwc] = new TArrayD(pw.fDWdimension[dwc]); + + // Finally, add to corresponding TList: + pw.fWeightsList->Add(pw.fDiffWeightsSparse[dwc]); + + /* + +TBI-today + + // Cosmetics: TBI 20240216 do I really want to overwrite initial cosmetics, perhaps this shall go better into MakeWeights.C ? + // Or I could move all this to GetHistogramWithWeights, where in any case I am setting e.g. histogram title, etc. + TString sVariable[eDiffWeights_N] = {"#varphi", "#varphi"}; // yes, for the time being, x-axis is always phi + TString sWeights[eDiffWeights_N] = {"(w_{#varphi})_{| p_{T}}", "(w_{#varphi})_{| #eta}"}; + pw.fDiffWeightsSparse[whichDiffWeight][bin]->SetStats(false); + pw.fDiffWeightsSparse[whichDiffWeight][bin]->GetXaxis()->SetTitle(sVariable[whichDiffWeight].Data()); + pw.fDiffWeightsSparse[whichDiffWeight][bin]->GetYaxis()->SetTitle(sWeights[whichDiffWeight].Data()); + pw.fDiffWeightsSparse[whichDiffWeight][bin]->SetFillColor(eFillColor); + pw.fDiffWeightsSparse[whichDiffWeight][bin]->SetLineColor(eColor); + pw.fWeightsList->Add(pw.fDiffWeightsSparse[whichDiffWeight][bin]); // This is working at the moment, because I am fetching all weights in Preprocess(), which is called after init() + // But if eventually it will be possible to fetch run number programatically in init(), I will have to re-think this line. + + // Flag: + if (!pw.fUseDiffWeights[whichDiffWeight]) // yes, set it only once to true, for all bins + { + pw.fUseDiffWeights[whichDiffWeight] = true; + } + + if (tc.fVerbose) { + ExitFunction(__FUNCTION__); + } + + */ + +} // void SetDiffWeightsSparse(THnSparseF* const sparse) + +//============================================================ + +void SetCentralityWeightsHist(TH1D* const hist) +{ + // Copy histogram holding weights from an external file to the corresponding data member. if (tc.fVerbose) { StartFunction(__FUNCTION__); @@ -9475,7 +10273,7 @@ void SetCentralityWeightsHist(TH1D* const hist) // Cosmetics: TBI 20240216 do I really want to overwrite initial cosmetics, perhaps this shall go better into MakeCentralityWeights.C ? // Or I could move all this to GetHistogramWithCentralityWeights, where in any case I am setting e.g. histogram title, etc. - cw.fCentralityWeightsHist->SetStats(kFALSE); + cw.fCentralityWeightsHist->SetStats(false); cw.fCentralityWeightsHist->GetXaxis()->SetTitle("Centrality percentile"); cw.fCentralityWeightsHist->GetYaxis()->SetTitle(Form("Centrality weight (%s)", ec.fsEventCuts[eCentralityEstimator].Data())); cw.fCentralityWeightsHist->SetFillColor(eFillColor); @@ -9487,7 +10285,7 @@ void SetCentralityWeightsHist(TH1D* const hist) // But if eventually it will be possible to fetch run number programatically in init(), I will have to re-think this line. // Flag: - cw.fUseCentralityWeights = kTRUE; + cw.fUseCentralityWeights = true; if (tc.fVerbose) { ExitFunction(__FUNCTION__); @@ -9569,13 +10367,13 @@ TH1D* GetHistogramWithWeights(const char* filePath, const char* runNumber, const // dir AliEn. If filePath begins with "/alice-ccdb.cern.ch/" then it's in // CCDB. Therefore, files in AliEn and CCDB must be specified with abs path, // for local files both abs and relative paths are just fine. - bool bFileIsInAliEn = kFALSE; - bool bFileIsInCCDB = kFALSE; + bool bFileIsInAliEn = false; + bool bFileIsInCCDB = false; if (TString(filePath).BeginsWith("/alice/cern.ch/")) { - bFileIsInAliEn = kTRUE; + bFileIsInAliEn = true; } else { if (TString(filePath).BeginsWith("/alice-ccdb.cern.ch/")) { - bFileIsInCCDB = kTRUE; + bFileIsInCCDB = true; } // else { } // if (TString(filePath).BeginsWith("/alice/cern.ch/")) { @@ -9797,6 +10595,280 @@ TH1D* GetHistogramWithWeights(const char* filePath, const char* runNumber, const //============================================================ +THnSparseF* GetSparseHistogramWithWeights(const char* filePath, const char* runNumber, const char* whichCategory, const char* whichDimensions) +{ + // Get and return sparse histogram with weights from an external file. + + // Remark 1: "whichCategory" always indicates the default x-axis (0th dimension), for instance for "differential phi weights" it's "phi" + + // Remark 2: "whichDimensions" is formatted as follows: __..., for instance "pt_cent", if weights are calculated differentially as a function of pt and centrality + // If empty, that is also fine, I am fetching integrated weights, for instance integrated phi-weights. + + // Remark 3: The nameing convention for sparse histogram in the output file is: __multiparticle-correlations-a-b_ + // a) I allow possibility that "multiparticle-correlations-a-b_" is not present in the name + // b) In HL, fTaskName is typically subwagon name. Therefoere, it's mandatory that for a given subwagon in HL, BOTH subwagon name and fTaskName are set to the same name + // TBI 20250215 If I can get within my task at run time subwagon name, I can automate this step. Check if that is possible + + // TBI 20240504: Here I can keep const char* variable , i.e. no need to switch to enums, because this function is called only once, at init. + // Nevertheless, I could switch to enums and make it more general, i.e. I could introduce additional data members and configurables, + // for the names of histograms with weights. Like I did it in void GetHistogramWithCustomNUA(const char* filePath, eNUAPDF variable) + + // TBI 20241021 Strictly speaking, I do not need to pass here first 2 arguments, "filePath" and "runNumber", because they are initialized at call from data members. + // But since this function is called only once, it's not an important performance loss. But re-think the design here eventually. + // If I decide to promote filePath to data member, implement it as an array, to allow possibility that different catagories of weights are fetched from different external files. + + // a) Return value; + // b) Basic protection for arguments; + // c) Determine from filePath if the file in on a local machine, or in AliEn, or in CCDB; + // d) Handle the AliEn case; + // e) Handle the CCDB case; + // f) Handle the local case; + // g) The final touch on histogram with weights. + + if (tc.fVerbose) { + StartFunction(__FUNCTION__); + LOGF(info, "\033[1;33m filePath = %s\033[0m", filePath); + LOGF(info, "\033[1;33m runNumber = %s\033[0m", runNumber); + LOGF(info, "\033[1;33m whichDimensions = %s\033[0m", whichDimensions); + } + + // a) Return value: + THnSparseF* sparseHist = NULL; + TList* baseList = NULL; // base top-level list in the TFile, e.g. named "ccdb_object" + TList* listWithRuns = NULL; // nested list with run-wise TList's holding run-specific weights + + // b) Basic protection for arguments: + // Remark: below I do one more specific check. + if (!(TString(whichCategory).EqualTo("phi"))) { // TBI 20250215 I could in the future extend support to differential pT weights, etc. + LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); + } + if (TString(whichDimensions).EqualTo("")) { + LOGF(warning, "\033[1;33m%s at line %d : whichDimensions is empty, accessing only integrated %s weights\033[0m", __FUNCTION__, __LINE__, whichCategory); + } + + // c) Determine from filePath if the file in on a local machine, or in home + // dir AliEn, or in CCDB: + // Algorithm: If filePath begins with "/alice/cern.ch/" then it's in home + // dir AliEn. If filePath begins with "/alice-ccdb.cern.ch/" then it's in + // CCDB. Therefore, files in AliEn and CCDB must be specified with abs path, + // for local files both abs and relative paths are just fine. + bool bFileIsInAliEn = false; + bool bFileIsInCCDB = false; + if (TString(filePath).BeginsWith("/alice/cern.ch/")) { + bFileIsInAliEn = true; + } else { + if (TString(filePath).BeginsWith("/alice-ccdb.cern.ch/")) { + bFileIsInCCDB = true; + } // else { + } // if (TString(filePath).BeginsWith("/alice/cern.ch/")) { + + if (bFileIsInAliEn) { + // d) Handle the AliEn case: + TGrid* alien = TGrid::Connect("alien", gSystem->Getenv("USER"), "", ""); + if (!alien) { + LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); + } + TFile* weightsFile = TFile::Open(Form("alien://%s", filePath), "READ"); + if (!weightsFile) { + LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); + } + + weightsFile->GetObject("ccdb_object", baseList); // TBI 20231008 for simplicity, hardwired name + // of base TList is "ccdb_object" also for + // AliEn case, see if I need to change this + if (!baseList) { + // weightsFile->ls(); + LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); + } + + listWithRuns = reinterpret_cast(GetObjectFromList(baseList, runNumber)); + if (!listWithRuns) { + TString runNumberWithLeadingZeroes = "000"; + runNumberWithLeadingZeroes += runNumber; // another try, with "000" prepended to run number + listWithRuns = reinterpret_cast(GetObjectFromList(baseList, runNumberWithLeadingZeroes.Data())); + if (!listWithRuns) { + LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); + } + } + + } else if (bFileIsInCCDB) { + + // e) Handle the CCDB case: Remember that here I do not access the file, + // instead directly object in that file. + // My home dir in CCDB: https://alice-ccdb.cern.ch/browse/Users/a/abilandz/ + // Inspired by: + // 1. Discussion at: + // https://alice-talk.web.cern.ch/t/access-to-lhc-filling-scheme/1073/17 + // 2. See also: + // https://github.com/AliceO2Group/O2Physics/blob/master/Tutorials/src/efficiencyGlobal.cxx + // https://github.com/AliceO2Group/O2Physics/blob/master/Tutorials/src/efficiencyPerRun.cxx + // 3. O2 Analysis Tutorial 2.0: + // https://indico.cern.ch/event/1267433/timetable/#20230417.detailed + + ccdb->setURL("http://alice-ccdb.cern.ch"); + if (tc.fVerbose) { + LOGF(info, "\033[1;32mAccessing in CCDB %s\033[0m", TString(filePath).ReplaceAll("/alice-ccdb.cern.ch/", "").Data()); + } + + baseList = reinterpret_cast(ccdb->get(TString(filePath).ReplaceAll("/alice-ccdb.cern.ch/", "").Data())); + + if (!baseList) { + LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); + } + + listWithRuns = reinterpret_cast(GetObjectFromList(baseList, runNumber)); + if (!listWithRuns) { + TString runNumberWithLeadingZeroes = "000"; + runNumberWithLeadingZeroes += runNumber; // another try, with "000" prepended to run number + listWithRuns = reinterpret_cast(GetObjectFromList(baseList, runNumberWithLeadingZeroes.Data())); + if (!listWithRuns) { + LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); + } + } + + } else { + + // f) Handle the local case: + // TBI 20231008 In principle, also for the local case in O2, I could + // maintain the same local structure of weights as it was in AliPhysics. + // But for simplicity, in O2 I organize local weights in the + // same way as in AliEn or CCDB. + + // Check if the external ROOT file exists at specified path: + if (gSystem->AccessPathName(filePath, kFileExists)) { + LOGF(info, "\033[1;33m if(gSystem->AccessPathName(filePath,kFileExists)), filePath = %s \033[0m", filePath); + LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); + } + + TFile* weightsFile = TFile::Open(filePath, "READ"); + if (!weightsFile) { + LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); + } + + weightsFile->GetObject("ccdb_object", baseList); // TBI 20231008 for simplicity, hardwired name + // of base TList is "ccdb_object" also for + // local case, see if I need to change this + if (!baseList) { + // weightsFile->ls(); + LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); + } + + listWithRuns = reinterpret_cast(GetObjectFromList(baseList, runNumber)); + if (!listWithRuns) { + TString runNumberWithLeadingZeroes = "000"; + runNumberWithLeadingZeroes += runNumber; // another try, with "000" prepended to run number + listWithRuns = reinterpret_cast(GetObjectFromList(baseList, runNumberWithLeadingZeroes.Data())); + if (!listWithRuns) { + // baseList->ls(); + LOGF(fatal, "\033[1;31m%s at line %d : this crash can happen if in the output file there is no list with weights for the current run number = %s\033[0m", __FUNCTION__, __LINE__, tc.fRunNumber.Data()); + } + } + + } // else { + + // g) The final touch on sparse histogram with weights: + TString sparseHistName = ""; + if (TString(whichDimensions).EqualTo("")) { + sparseHistName = TString::Format("%s_multiparticle-correlations-a-b", whichCategory); + } else if (TString(whichDimensions).BeginsWith("_")) { // TBI 20250215 alternativelly, I can remove leading "_" before calling this function + sparseHistName = TString::Format("%s%s_multiparticle-correlations-a-b", whichCategory, whichDimensions); + } else { + sparseHistName = TString::Format("%s_%s_multiparticle-correlations-a-b", whichCategory, whichDimensions); + } + // *) If not empty, I still need to appent TaskName (i.e. the cut name): + if (!TString(tc.fTaskName).EqualTo("")) { + sparseHistName += tc.fTaskName.Data(); + } + + // 1. fetch histogram directly from this list: const char* whichCategory, const char* whichDimensions + LOGF(info, "\033[1;33m%s at line %d : fetching directly from the list sparse histogram with name = %s\033[0m", __FUNCTION__, __LINE__, sparseHistName.Data()); + sparseHist = reinterpret_cast(listWithRuns->FindObject(sparseHistName.Data())); + if (!sparseHist) { + // try once again by chopping off "multiparticle-correlations-a-b_" from name: + TString tmp = sparseHistName; // yes, because "ReplaceAll" below replaces in-place, and I will need sparseHistName unmodified still later + sparseHist = reinterpret_cast(listWithRuns->FindObject(tmp.ReplaceAll("multiparticle-correlations-a-b_", ""))); + } + + // 2. if the previous search failed, descend recursively into the nested lists: + if (!sparseHist) { + LOGF(info, "\033[1;33m%s at line %d : previous attempt failed, fetching instead recursively sparse histogram with name = %s\033[0m", __FUNCTION__, __LINE__, sparseHistName.Data()); + sparseHist = reinterpret_cast(GetObjectFromList(listWithRuns, sparseHistName.Data())); + if (!sparseHist) { + // try once again by chopping off "multiparticle-correlations-a-b_" from name: + TString tmp = sparseHistName; // yes, because "ReplaceAll" below replaces in-place, and I will need sparseHistName unmodified still later + sparseHist = reinterpret_cast(GetObjectFromList(listWithRuns, tmp.ReplaceAll("multiparticle-correlations-a-b_", ""))); + } + } + + if (!sparseHist) { + listWithRuns->ls(); + LOGF(fatal, "\033[1;31m%s at line %d : couldn't fetch sparse histogram with name = %s from this list\033[0m", __FUNCTION__, __LINE__, sparseHistName.Data()); + } + + sparseHist->SetTitle(Form("%s, %s", filePath, runNumber)); // I have to do it here, because only here I have "filePath" available + + // hist->SetTitle(Form("%s, %.2f < %s < %.2f", filePath, min, lVariableName, max)); + + /* + // *) insanity check for differential weights => check if boundaries of current bin are the same as bin boundaries for which these weights were calculated. + // This way I ensure that weights correspond to same kinematic cuts and binning as in current analysis. + // Current example format which was set in MakeWeights.C: someString(s), min < kinematic-variable-name < max + // Algorithm: IFS is " " and I take (N-1)th and (N-5)th entry: + TObjArray* oa = TString(hist->GetTitle()).Tokenize(" "); + if (!oa) { + LOGF(fatal, "in function \033[1;31m%s at line %d \n hist->GetTitle() = %s\033[0m", __FUNCTION__, __LINE__, hist->GetTitle()); + } + int nEntries = oa->GetEntries(); + + // I need to figure out corresponding variable from results histograms and its formatting: + eAsFunctionOf AFO = eAsFunctionOf_N; + const char* lVariableName = ""; + if (TString(variable).EqualTo("phipt")) { + AFO = AFO_PT; + lVariableName = FancyFormatting("Pt"); + } else if (TString(variable).EqualTo("phieta")) { + AFO = AFO_ETA; + lVariableName = FancyFormatting("Eta"); + } else { + LOGF(fatal, "\033[1;31m%s at line %d : name = %s is not supported yet. \033[0m", __FUNCTION__, __LINE__, static_cast(variable)); + } + + // Get min and max value for bin, stored locally: + float min = res.fResultsPro[AFO]->GetBinLowEdge(bin + 1); + float max = res.fResultsPro[AFO]->GetBinLowEdge(bin + 2); + if (min > max) { + LOGF(fatal, "\033[1;33m min = %f, max = %f, res.fResultsPro[AFO]->GetName() = %s\033[0m", min, max, res.fResultsPro[AFO]->GetName()); + } + + // Compare with min and max value stored in external weights.root file using MakeWeights.C: + if (!(TMath::Abs(TString(oa->At(nEntries - 1)->GetName()).Atof() - max) < tc.fFloatingPointPrecision)) { + LOGF(info, "\033[1;33m hist->GetTitle() = %s, res.fResultsPro[AFO]->GetName() = %s\033[0m", hist->GetTitle(), res.fResultsPro[AFO]->GetName()); + LOGF(fatal, "in function \033[1;31m%s at line %d : mismatch in upper bin boundaries \n from title = %f , local = %f\033[0m", __FUNCTION__, __LINE__, TString(oa->At(nEntries - 1)->GetName()).Atof(), max); + } + if (!(TMath::Abs(TString(oa->At(nEntries - 5)->GetName()).Atof() - min) < tc.fFloatingPointPrecision)) { + LOGF(info, "\033[1;33m hist->GetTitle() = %s, res.fResultsPro[AFO]->GetName() = %s\033[0m", hist->GetTitle(), res.fResultsPro[AFO]->GetName()); + LOGF(fatal, "in function \033[1;31m%s at line %d : mismatch in lower bin boundaries \n from title = %f , local = %f\033[0m", __FUNCTION__, __LINE__, TString(oa->At(nEntries - 5)->GetName()).Atof(), min); + } + delete oa; // yes, otherwise it's a memory leak + + // *) final settings and cosmetics: + hist->SetDirectory(0); + + */ + + // TBI 20241021 if I need to split hist title across two lines, use this technique: + // hist->SetTitle(Form("#splitline{#scale[0.6]{%s}}{#scale[0.4]{%s}}",hist->GetTitle(),filePath)); + + if (tc.fVerbose) { + ExitFunction(__FUNCTION__); + } + + return sparseHist; + +} // THnSparseF* GetSparseHistogramWithWeights(const char* filePath, const char* runNumber, const char* whichCategory, const char* whichDimensions) + +//============================================================ + TH1D* GetHistogramWithCentralityWeights(const char* filePath, const char* runNumber) { // Get and return histogram with centrality weights from an external file. @@ -9834,13 +10906,13 @@ TH1D* GetHistogramWithCentralityWeights(const char* filePath, const char* runNum // dir AliEn. If filePath begins with "/alice-ccdb.cern.ch/" then it's in // CCDB. Therefore, files in AliEn and CCDB must be specified with abs path, // for local files both abs and relative paths are just fine. - bool bFileIsInAliEn = kFALSE; - bool bFileIsInCCDB = kFALSE; + bool bFileIsInAliEn = false; + bool bFileIsInCCDB = false; if (TString(filePath).BeginsWith("/alice/cern.ch/")) { - bFileIsInAliEn = kTRUE; + bFileIsInAliEn = true; } else { if (TString(filePath).BeginsWith("/alice-ccdb.cern.ch/")) { - bFileIsInCCDB = kTRUE; + bFileIsInCCDB = true; } // else { } // if (TString(filePath).BeginsWith("/alice/cern.ch/")) { @@ -10033,6 +11105,13 @@ TObjArray* GetDefaultObjArrayWithLabels(const char* whichDefaultLabels) TObjString* objstr = new TObjString(labels[l].Data()); arr->Add(objstr); } + } else if (TString(whichDefaultLabels).EqualTo("scan2p")) { + const int nLabels = 6; + TString labels[nLabels] = {"1 -1", "2 -2", "3 -3", "4 -4", "5 -5", "6 -6"}; + for (int l = 0; l < nLabels; l++) { + TObjString* objstr = new TObjString(labels[l].Data()); + arr->Add(objstr); + } } else if (TString(whichDefaultLabels).EqualTo("standard")) { const int nLabels = 7; TString labels[nLabels] = {"1 -1", "2 -2", "3 -3", "2 1 -1 -2", "3 1 -1 -3", "3 2 -2 -3", "3 2 1 -1 -2 -3"}; @@ -10112,13 +11191,13 @@ TObjArray* GetObjArrayWithLabels(const char* filePath) // CCDB. Therefore, files in AliEn and CCDB must be specified // with abs path, for local files both abs and relative paths // are just fine. - bool bFileIsInAliEn = kFALSE; - bool bFileIsInCCDB = kFALSE; + bool bFileIsInAliEn = false; + bool bFileIsInCCDB = false; if (TString(filePath).BeginsWith("/alice/cern.ch/")) { - bFileIsInAliEn = kTRUE; + bFileIsInAliEn = true; } else { if (TString(filePath).BeginsWith("/alice-ccdb.cern.ch/")) { - bFileIsInCCDB = kTRUE; + bFileIsInCCDB = true; } // else { } // if (TString(filePath).BeginsWith("/alice/cern.ch/")) { @@ -10268,13 +11347,13 @@ void GetHistogramWithCustomNUA(const char* filePath, eNUAPDF variable) // *) If filePath begins with "/alice-ccdb.cern.ch/" then it's in CCDB. // *) It's a local file otherwise. // Therefore, files in AliEn and CCDB must be specified with abs path, for local files both abs and relative paths are just fine. - bool bFileIsInAliEn = kFALSE; - bool bFileIsInCCDB = kFALSE; + bool bFileIsInAliEn = false; + bool bFileIsInCCDB = false; if (TString(filePath).BeginsWith("/alice/cern.ch/")) { - bFileIsInAliEn = kTRUE; + bFileIsInAliEn = true; } else { if (TString(filePath).BeginsWith("/alice-ccdb.cern.ch/")) { - bFileIsInCCDB = kTRUE; + bFileIsInCCDB = true; } // else { } // if (TString(filePath).BeginsWith("/alice/cern.ch/")) { @@ -10402,7 +11481,7 @@ void StoreLabelsInPlaceholder() new TH1I("fTest0LabelsPlaceholder", Form("placeholder for all labels, %d in total", nLabels), nLabels, 0, nLabels); - t0.fTest0LabelsPlaceholder->SetStats(kFALSE); + t0.fTest0LabelsPlaceholder->SetStats(false); // d) Finally, store the labels from external source into placeholder: int bin = 1; // used only for fTest0LabelsPlaceholder @@ -10487,7 +11566,7 @@ bool RetrieveCorrelationsLabels() ExitFunction(__FUNCTION__); } - return kTRUE; + return true; } // bool RetrieveCorrelationsLabels() @@ -10590,6 +11669,94 @@ double Weight(const double& value, eWeights whichWeight) // value, integrated [p //============================================================ +double WeightFromSparse(const double& dPhi, const double& dPt, const double& dEta, const double& dCharge, eDiffWeightCategory dwc) +{ + // Determine differential multidimensional particle weight using sparse histograms. + + if (tc.fVerbose) { + StartFunction(__FUNCTION__); + } + + // *) Reduce dimensionality is possible, i.e. look up only the dimensions in THnSparse which were requested in this analysis: + Int_t dim = 1; // yes, because dimension 0 is always reserved for each category + switch (dwc) { + case eDWPhi: { + // Remember that ordering here has to resemble ordering in eDiffPhiWeights + pw.fFindBinVector[dwc]->AddAt(dPhi, 0); // special treatment for phi in eDWPhi category + if (pw.fUseDiffPhiWeights[wPhiPtAxis]) { + pw.fFindBinVector[dwc]->AddAt(dPt, dim++); + } + if (pw.fUseDiffPhiWeights[wPhiEtaAxis]) { + pw.fFindBinVector[dwc]->AddAt(dEta, dim++); + } + if (pw.fUseDiffPhiWeights[wPhiChargeAxis]) { + pw.fFindBinVector[dwc]->AddAt(dCharge, dim++); + } + if (pw.fUseDiffPhiWeights[wPhiCentralityAxis]) { + pw.fFindBinVector[dwc]->AddAt(ebye.fCentrality, dim++); + } + if (pw.fUseDiffPhiWeights[wPhiVertex_zAxis]) { + pw.fFindBinVector[dwc]->AddAt(ebye.fVz, dim++); + } + // ... + break; + } + case eDWPt: { + pw.fFindBinVector[dwc]->AddAt(dPt, 0); // special treatment for pt in eDWPt category + // Remember that ordering here has to resemble ordering in eDiffPtWeights + // if(pw.fUseDiffPtWeights[...]) { + // pw.fFindBinVector[dwc]->AddAt(..., dim++); // skeleton for next dimension + // } + // ... + break; + } + case eDWEta: { + pw.fFindBinVector[dwc]->AddAt(dEta, 0); // special treatment for eta in eDWEta category + // Remember that ordering here has to resemble ordering in eDiffEtaWeights + // if(pw.fUseDiffEtaWeights[...]) { + // pw.fFindBinVector[dwc]->AddAt(..., dim++); // skeleton for next dimension + // } + // ... + break; + } + default: { + LOGF(fatal, "\033[1;31m%s at line %d : This differential weight category, dwc = %d, is not supported yet. \033[0m", __FUNCTION__, __LINE__, static_cast(dwc)); + break; + } + } // switch(dwc) + + // *) Insanity check: + // **) ... + if (!pw.fDiffWeightsSparse[dwc]) { + LOGF(fatal, "\033[1;31m dwc = %d\033[0m", static_cast(dwc)); + LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); + } + + // **) Check that dimensions of vector I will use to fetch the right bin content and sparse histogram with weights do match: + if (tc.fInsanityCheckForEachParticle) { + if (pw.fFindBinVector[dwc]->GetSize() != pw.fDiffWeightsSparse[dwc]->GetNdimensions()) { + LOGF(fatal, "\033[1;31m dwc = %d\033[0m", static_cast(dwc)); + LOGF(fatal, "\033[1;31m pw.fFindBinVector[dwc]->GetSize() = %d\033[0m", pw.fFindBinVector[dwc]->GetSize()); + LOGF(fatal, "\033[1;31m pw.fDiffWeightsSparse[dwc]->GetNdimensions() = %d\033[0m", pw.fDiffWeightsSparse[dwc]->GetNdimensions()); + LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); + } + } // if(tc.fInsanityCheckForEachParticle) + + // *) okay, let's fetch the weight: + int bin = pw.fDiffWeightsSparse[dwc]->GetBin(pw.fFindBinVector[dwc]->GetArray()); // this is the general bin, corresponding to the actual multidimensional bin + // TBI 20250224 do I need some insanity check here, e.g. that bin is neither in overflow nor in underflow? + double weight = pw.fDiffWeightsSparse[dwc]->GetBinContent(bin); + + if (tc.fVerbose) { + ExitFunction(__FUNCTION__); + } + + return weight; + +} // double WeightFromSparse(...) + +//============================================================ + double DiffWeight(const double& valueY, const double& valueX, eqvectorKine variableX) { // Determine differential particle weight y(x). For the time being, "y = phi" always, but this can be generalized. @@ -10686,7 +11853,10 @@ void GetParticleWeights() // If any of these 2 assumptions are violated, this code will have to be modified. // a) Integrated weights; - // b) Differential weights. + // b) Differential weights; => TBI 20250225 this is now obsolete and superseeded with c), where I use more general approach with sparse histograms + // c) Differential phi weights using sparse histograms; + // d) Differential pt weights using sparse histograms; + // e) Differential eta weights using sparse histograms. if (tc.fVerbose) { StartFunction(__FUNCTION__); @@ -10779,6 +11949,84 @@ void GetParticleWeights() } // for(int b=0; bGetBinContent(1) == ec.fdEventCuts[eNumberOfEvents][eMax] || eh.fEventHistograms[eNumberOfEvents][eSim][eAfter]->GetBinContent(1) == ec.fdEventCuts[eSelectedEvents][eMax])) { - return kTRUE; + return true; } else { - return kFALSE; + return false; } } @@ -10892,12 +12140,12 @@ bool MaxNumberOfEvents(eBeforeAfter ba) switch (ba) { case eBefore: if (eh.fEventHistograms[eNumberOfEvents][rs][eBefore] && eh.fEventHistograms[eNumberOfEvents][rs][eBefore]->GetBinContent(1) == ec.fdEventCuts[eNumberOfEvents][eMax]) { - reachedMaxNumberOfEvents = kTRUE; + reachedMaxNumberOfEvents = true; } break; case eAfter: if (eh.fEventHistograms[eNumberOfEvents][rs][eAfter] && eh.fEventHistograms[eNumberOfEvents][rs][eAfter]->GetBinContent(1) == ec.fdEventCuts[eSelectedEvents][eMax]) { - reachedMaxNumberOfEvents = kTRUE; + reachedMaxNumberOfEvents = true; } break; default: @@ -10956,7 +12204,7 @@ void PrintEventCounter(eBeforeAfter ba) void EventCounterForDryRun(eEventCounterForDryRun eVar) { // Simple utility function which either fills histogram with event count, or prints its current content. - // Remark: Use only in combination with tc.fDryRun = kTRUE, otherwise I might be filling the same histogram in different member functions, there is a protection below. + // Remark: Use only in combination with tc.fDryRun = true, otherwise I might be filling the same histogram in different member functions, there is a protection below. // It fills or prints per call, therefore I do not have to pass 'collision' objects, etc. if (tc.fVerbose) { @@ -10964,7 +12212,7 @@ void EventCounterForDryRun(eEventCounterForDryRun eVar) } if (!tc.fDryRun) { - LOGF(fatal, "\033[1;31m%s at line %d : for the time being, function EventCounterForDryRun(...) can be safely used only for tc.fDryRun = kTRUE \033[0m", __FUNCTION__, __LINE__); + LOGF(fatal, "\033[1;31m%s at line %d : for the time being, function EventCounterForDryRun(...) can be safely used only for tc.fDryRun = true \033[0m", __FUNCTION__, __LINE__); } switch (eVar) { @@ -11038,7 +12286,7 @@ const char* FancyFormatting(const char* name) } else if (tmp.BeginsWith("Cent")) { fancyFormatting = Form("Centrality (%s)", tmp.ReplaceAll("Cent", "").Data()); // "CentFT0C" => "Centrality (FT0C)" } else { - LOGF(fatal, "\033[1;31m%s at line %d : the case tmp = %s is not supported yet\033[0m", __FUNCTION__, __LINE__, tmp.Data()); + LOGF(fatal, "\033[1;31m%s at line %d : the case tmp = \"%s\" is not supported yet\033[0m", __FUNCTION__, __LINE__, tmp.Data()); } } else if (TString(name).EqualTo("Trigger")) { fancyFormatting = Form("Trigger (%s)", ec.fsEventCuts[eTrigger].Data()); @@ -12000,7 +13248,7 @@ void BanishmentLoopOverParticles(T const& tracks) break; } - // *) Break the loop if fixed number of particles is taken randomly from each event (use always in combination with tc.fUseFisherYates = kTRUE): + // *) Break the loop if fixed number of particles is taken randomly from each event (use always in combination with tc.fUseFisherYates = true): if (tc.fFixedNumberOfRandomlySelectedTracks > 0 && tc.fFixedNumberOfRandomlySelectedTracks == lSelectedTracks) { LOGF(info, "%s : Breaking the loop over particles, since requested fixed number of %d particles was reached", __FUNCTION__, tc.fFixedNumberOfRandomlySelectedTracks); break; @@ -12089,7 +13337,7 @@ void Exit() void StartFunction(const char* functionName) { - // A simple utility wrapper, used when tc.fVerbose = kTRUE. It merely ensures uniform formatting of notification when the function starts. + // A simple utility wrapper, used when tc.fVerbose = true. It merely ensures uniform formatting of notification when the function starts. LOGF(info, "\033[1;32mStart %s\033[0m", functionName); // prints in green @@ -12099,7 +13347,7 @@ void StartFunction(const char* functionName) void ExitFunction(const char* functionName) { - // A simple utility wrapper, used when tc.fVerbose = kTRUE. It merely ensures uniform formatting of notification when the function exits. + // A simple utility wrapper, used when tc.fVerbose = true. It merely ensures uniform formatting of notification when the function exits. LOGF(info, "\033[1;32mExit %s\033[0m", functionName); // prints in green @@ -12107,14 +13355,14 @@ void ExitFunction(const char* functionName) //============================================================ -void BailOut(bool finalBailout = kFALSE) +void BailOut(bool finalBailout = false) { // Use only locally - bail out if maximum number of events was reached, and dump all results by that point in a local ROOT file. // If fSequentialBailout > 0, bail out is performed each fSequentialBailout events, each time in a new local ROOT file. // For sequential bailout, the naming scheme of ROOT files is AnalysisResultsBailOut_eh.fEventCounter[eProcessed].root . // If ROOT file with the same name already exists, BailOut is not performed, since the argument is that // it's pointless to perform Bailout for same eh.fEventCounter[eProcessed], even if eh.fEventCounter[eTotal] changed. - // Only if finalBailout = kTRUE, I will overwrite the existing file with the same name. + // Only if finalBailout = true, I will overwrite the existing file with the same name. if (tc.fVerbose) { StartFunction(__FUNCTION__); @@ -12129,7 +13377,7 @@ void BailOut(bool finalBailout = kFALSE) sBailOutFile.ReplaceAll(".root", Form("_%d.root", eh.fEventCounter[eProcessed])); // replaces in-place // basically, at 1st call "AnalysisResultsBailOut.root" => "AnalysisResultsBailOut_1*eh.fEventCounter[eProcessed].root", // at 2nd call "AnalysisResultsBailOut.root" => "AnalysisResultsBailOut_2*eh.fEventCounter[eProcessed].root", etc. - if (!finalBailout && !gSystem->AccessPathName(sBailOutFile.Data(), kFileExists)) { // only for finalBailout = kTRUE, I will overwrite the existing file with the same name. + if (!finalBailout && !gSystem->AccessPathName(sBailOutFile.Data(), kFileExists)) { // only for finalBailout = true, I will overwrite the existing file with the same name. LOGF(info, "\033[1;33m\nsBailOutFile = %s already exits, that means that eh.fEventCounter[eProcessed] is the same as in the previous call of BailOut.\nJust skipping and waiting more events to pass selection criteria... \033[0m", sBailOutFile.Data()); return; } @@ -12147,7 +13395,7 @@ void BailOut(bool finalBailout = kFALSE) // Therefore, adding one-by-one nested TList's I want to bail out. // Keep in sync with BookAndNestAllLists(). TList* bailOutList = new TList(); // this is sort of 'fake' fBaseList - bailOutList->SetOwner(kFALSE); // yes, beacause for sequential bailout, with SetOwner(kTRUE) the code is crashing after 1st sequential bailout is done + bailOutList->SetOwner(false); // yes, beacause for sequential bailout, with SetOwner(true) the code is crashing after 1st sequential bailout is done bailOutList->SetName(sBaseListName.Data()); bailOutList->Add(fBasePro); // yes, this one needs a special treatment bailOutList->Add(qa.fQAList); @@ -12167,7 +13415,7 @@ void BailOut(bool finalBailout = kFALSE) bailOutList->Add(res.fResultsList); // *) Add list with nested list to TDirectoryFile: - dirFile->Add(bailOutList, kTRUE); + dirFile->Add(bailOutList, true); dirFile->Write(dirFile->GetName(), TObject::kSingleKey + TObject::kOverwrite); delete dirFile; dirFile = NULL; @@ -12187,7 +13435,7 @@ void BailOut(bool finalBailout = kFALSE) } } -} // void BailOut(bool finalBailout = kFALSE) +} // void BailOut(bool finalBailout = false) //============================================================ @@ -12287,6 +13535,138 @@ void FillQvector(const double& dPhi, const double& dPt, const double& dEta) //============================================================ +void FillQvectorFromSparse(const double& dPhi, const double& dPt, const double& dEta, const double& dCharge) +{ + // Fill integrated Q-vector using sparse histograms. + + // Remark: I pass by reference particle quantities, while event quantities (centrality, vertex z, ...) I fetch from data members (or from global variables in a macro). + + // To do: + // 20250224 do I need to switch to this function also in InternalValidation()? I still use simple FillQvector() there. + // That would really make sense only after I add support for usage of particle weights in InternalValidation() + + if (tc.fVerboseForEachParticle) { + StartFunction(__FUNCTION__); + LOGF(info, "\033[1;32m dPhi = %f\033[0m", dPhi); + LOGF(info, "\033[1;32m dPt = %f\033[0m", dPt); + LOGF(info, "\033[1;32m dEta = %f\033[0m", dEta); + LOGF(info, "\033[1;32m dCharge = %f\033[0m", dCharge); + } + + // Particle weights from sparse histograms: + double wPhi = 1.; // differential multidimensional phi weight, its dimensions are defined via enum eDiffPhiWeights + double wPt = 1.; // differential multidimensional pt weight, its dimensions are defined via enum eDiffPtWeights + double wEta = 1.; // differential multidimensional eta weight, its dimensions are defined via enum eDiffEtaWeights + double wToPowerP = 1.; // weight raised to power p + + // *) Multidimensional phi weights: + if (pw.fUseDiffPhiWeights[wPhiPhiAxis]) { // yes, 0th axis serves as a comon boolean for this category + wPhi = WeightFromSparse(dPhi, dPt, dEta, dCharge, eDWPhi); + // last argument is enum eDiffWeightCategory. Event quantities, e.g. centraliy and vz, I do not need to pass, because + // for them I have ebye data members + if (!(wPhi > 0.)) { + LOGF(error, "\033[1;33m%s wPhi is not positive\033[0m", __FUNCTION__); + LOGF(error, "dPhi = %f", dPhi); + if (pw.fUseDiffPhiWeights[wPhiPtAxis]) { + LOGF(fatal, "dPt = %f", dPt); + } + if (pw.fUseDiffPhiWeights[wPhiEtaAxis]) { + LOGF(fatal, "dEta = %f", dEta); + } + if (pw.fUseDiffPhiWeights[wPhiChargeAxis]) { + LOGF(fatal, "dCharge = %f", dCharge); + } + if (pw.fUseDiffPhiWeights[wPhiCentralityAxis]) { + LOGF(fatal, "ebye.Centrality = %f", ebye.fCentrality); + } + if (pw.fUseDiffPhiWeights[wPhiVertex_zAxis]) { + LOGF(fatal, "ebye.Vz = %f", ebye.fVz); + } + LOGF(fatal, "Multidimensional weight for enabled dimensions is wPhi = %f", wPhi); + } + } // if(pw.fUseDiffPhiWeights[wPhiPhiAxis]) + + // *) Multidimensional pt weights: + if (pw.fUseDiffPtWeights[wPtPtAxis]) { // yes, 0th axis serves as a comon boolean for this category + wPt = WeightFromSparse(dPhi, dPt, dEta, dCharge, eDWPt); // TBI 20250224 not sure if this is the right/best approach + // last argument is enum eDiffWeightCategory. Event quantities, e.g. centraliy and vz, I do not need to pass, because + // for them I have ebye data members + if (!(wPt > 0.)) { + LOGF(error, "\033[1;33m%s wPt is not positive\033[0m", __FUNCTION__); + LOGF(error, "dPt = %f", dPt); + if (pw.fUseDiffPtWeights[wPtPtAxis]) { + LOGF(fatal, "dPt = %f", dPt); + } + LOGF(fatal, "Multidimensional weight for enabled dimensions is wPt = %f", wPt); + } + } // if(pw.fUseDiffPtWeights[wPtPtAxis]) + + // *) Multidimensional eta weights: + if (pw.fUseDiffEtaWeights[wEtaEtaAxis]) { // yes, 0th axis serves as a comon boolean for this category + wEta = WeightFromSparse(dPhi, dPt, dEta, dCharge, eDWEta); // TBI 20250224 not sure if this is the right/best approach + // last argument is enum eDiffWeightCategory. Event quantities, e.g. centraliy and vz, I do not need to pass, because + // for them I have ebye data members + if (!(wEta > 0.)) { + LOGF(error, "\033[1;33m%s wEta is not positive\033[0m", __FUNCTION__); + LOGF(error, "dEta = %f", dEta); + if (pw.fUseDiffEtaWeights[wEtaEtaAxis]) { + LOGF(fatal, "dEta = %f", dEta); + } + LOGF(fatal, "Multidimensional weight for enabled dimensions is wEta = %f", wEta); + } + } // if(pw.fUseDiffEtaWeights[wEtaEtaAxis]) + + if (qv.fCalculateQvectors) { + for (int h = 0; h < gMaxHarmonic * gMaxCorrelator + 1; h++) { + for (int wp = 0; wp < gMaxCorrelator + 1; wp++) { // weight power + if (pw.fUseDiffPhiWeights[wPhiPhiAxis] || pw.fUseDiffPtWeights[wPtPtAxis] || pw.fUseDiffEtaWeights[wEtaEtaAxis]) { + wToPowerP = pow(wPhi * wPt * wEta, wp); + qv.fQvector[h][wp] += TComplex(wToPowerP * TMath::Cos(h * dPhi), wToPowerP * TMath::Sin(h * dPhi)); // Q-vector with weights + } else { + qv.fQvector[h][wp] += TComplex(TMath::Cos(h * dPhi), TMath::Sin(h * dPhi)); // bare Q-vector without weights + } + } // for(int wp=0;wp 0.) { + for (int e = 0; e < gMaxNumberEtaSeparations; e++) { + if (dEta > es.fEtaSeparationsValues[e] / 2.) { // yes, if eta separation is 0.2, then separation interval runs from -0.1 to 0.1 + qv.fMab[1][e] += wPhi * wPt * wEta; + for (int h = 0; h < gMaxHarmonic; h++) { + { + if (es.fEtaSeparationsSkipHarmonics[h]) { + continue; + } + qv.fQabVector[1][h][e] += TComplex(wPhi * wPt * wEta * TMath::Cos((h + 1) * dPhi), wPhi * wPt * wEta * TMath::Sin((h + 1) * dPhi)); + } + } // for (int h = 0; h < gMaxHarmonic; h++) { + } // for (int e = 0; e < gMaxNumberEtaSeparations; e++) { // eta separation + } + } + } // if(es.fCalculateEtaSeparations) { + + if (tc.fVerboseForEachParticle) { + ExitFunction(__FUNCTION__); + } + +} // void FillQvectorFromSparse(const double& dPhi, const double& dPt, const double& dEta, const double& dCharge) + +//============================================================ + void Fillqvector(const double& dPhi, const double& kineVarValue, eqvectorKine kineVarChoice, const double& dEta = 0.) { // Fill differential q-vector, in generic kinematic variable. Here "kine" originally meant vs. pt or vs. eta, now it's general. @@ -12470,7 +13850,7 @@ void CalculateEverything() this->CalculateNestedLoops(); if (mupa.fCalculateCorrelations) { // I do not have option here for Test0, because in Test0 I cross-check either e-by-e with CustomNestedLoops or - // for all events with IV + fRescaleWithTheoreticalInput = kTRUE + // for all events with IV + fRescaleWithTheoreticalInput = true this->ComparisonNestedLoopsVsCorrelations(); // I call it here, so comparison is performed cumulatively after each event. The final printout corresponds to all events. } } @@ -12580,7 +13960,15 @@ void MainLoopOverParticles(T const& tracks) // Remark: Keep in sync all calls and flags below with the ones in InternalValidation(). // *) Integrated Q-vectors: if (qv.fCalculateQvectors || es.fCalculateEtaSeparations) { - this->FillQvector(dPhi, dPt, dEta); // all 3 arguments are passed by reference + if (!(pw.fUseDiffPhiWeights[wPhiPhiAxis] || pw.fUseDiffPtWeights[wPtPtAxis] || pw.fUseDiffPtWeights[wEtaEtaAxis])) { + // legacy integrated weights: + this->FillQvector(dPhi, dPt, dEta); // all 3 arguments are passed by reference + } else { + // this is now the new approach, with sparse histograms: + this->FillQvectorFromSparse(dPhi, dPt, dEta, track.sign()); // particle arguments are passed by reference. + // Event observables (centrality, vertex z, ...), I do not need to pass as arguments, + // as I have data members for them (ebye.fCentrality, ebye.Vz, ...) + } } // *) Differential q-vectors: @@ -12610,7 +13998,7 @@ void MainLoopOverParticles(T const& tracks) break; } - // *) Break the loop if fixed number of particles is taken randomly from each event (use always in combination with tc.fUseFisherYates = kTRUE): + // *) Break the loop if fixed number of particles is taken randomly from each event (use always in combination with tc.fUseFisherYates = true): if (tc.fFixedNumberOfRandomlySelectedTracks > 0 && tc.fFixedNumberOfRandomlySelectedTracks == ebye.fSelectedTracks) { LOGF(info, "%s : Breaking the loop over particles, since requested fixed number of %d particles was reached", __FUNCTION__, tc.fFixedNumberOfRandomlySelectedTracks); break; @@ -12689,7 +14077,8 @@ void Steer(T1 const& collision, T2 const& bcs, T3 const& tracks) DetermineVertexZ(collision); // *) Fill event histograms before event cuts: - if (eh.fFillEventHistograms || qa.fFillQAEventHistograms2D) { + if (eh.fFillEventHistograms || qa.fFillQAEventHistograms2D || qa.fFillQAParticleEventHistograms2D) { + // Remark: I do not above the flag fFillQACorrelationsVsHistograms2D, because as a part of QA I calculate <2> only after cuts in any case FillEventHistograms(collision, tracks, eBefore); } @@ -12723,7 +14112,7 @@ void Steer(T1 const& collision, T2 const& bcs, T3 const& tracks) } // *) Fill event histograms after event AND particle cuts: - if (eh.fFillEventHistograms || qa.fFillQAEventHistograms2D) { + if (eh.fFillEventHistograms || qa.fFillQAEventHistograms2D || qa.fFillQAParticleEventHistograms2D || qa.fFillQACorrelationsVsHistograms2D) { FillEventHistograms(collision, tracks, eAfter); } diff --git a/PWGCF/MultiparticleCorrelations/Tasks/multiparticle-correlations-ab.cxx b/PWGCF/MultiparticleCorrelations/Tasks/multiparticle-correlations-ab.cxx index 51d9a2f053e..4facc37f7c2 100644 --- a/PWGCF/MultiparticleCorrelations/Tasks/multiparticle-correlations-ab.cxx +++ b/PWGCF/MultiparticleCorrelations/Tasks/multiparticle-correlations-ab.cxx @@ -73,6 +73,7 @@ using CollisionRecSim_Run1 = soa::Join #include #include +#include using namespace std; // *) Enums: From 9a49bbb9aa6fd62eb992521583f34528891238d7 Mon Sep 17 00:00:00 2001 From: pravatp98 <158029188+pravatp98@users.noreply.github.com> Date: Wed, 26 Feb 2025 03:28:14 +0530 Subject: [PATCH 0421/1650] [PWGCF] Addition of Net charge fluctuation functionality (#10166) --- PWGCF/EbyEFluctuations/Tasks/CMakeLists.txt | 5 + .../EbyEFluctuations/Tasks/nchCumulantsId.cxx | 671 ++++++++++++++++++ 2 files changed, 676 insertions(+) create mode 100644 PWGCF/EbyEFluctuations/Tasks/nchCumulantsId.cxx diff --git a/PWGCF/EbyEFluctuations/Tasks/CMakeLists.txt b/PWGCF/EbyEFluctuations/Tasks/CMakeLists.txt index 2d493562ed1..e763f929e71 100644 --- a/PWGCF/EbyEFluctuations/Tasks/CMakeLists.txt +++ b/PWGCF/EbyEFluctuations/Tasks/CMakeLists.txt @@ -53,3 +53,8 @@ o2physics_add_dpl_workflow(netcharge-fluctuations SOURCES netchargeFluctuations.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(nch-cumulants-id + SOURCES nchCumulantsId.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore + COMPONENT_NAME Analysis) diff --git a/PWGCF/EbyEFluctuations/Tasks/nchCumulantsId.cxx b/PWGCF/EbyEFluctuations/Tasks/nchCumulantsId.cxx new file mode 100644 index 00000000000..e9bdb714580 --- /dev/null +++ b/PWGCF/EbyEFluctuations/Tasks/nchCumulantsId.cxx @@ -0,0 +1,671 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file NchCumulantsId.cxx +/// \brief Event by Event conserved charges fluctuations +/// it is meant to be a blank page for further developments. +/// \author Pravata Panigrahi :: Sadhana Dash (sadhana@phy.iitb.ac.in) and Rahul Verma (rahul.verma@iitb.ac.in) +#include +#include + +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/HistogramSpec.h" +#include "Framework/O2DatabasePDGPlugin.h" + +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/Centrality.h" +#include "TLorentzVector.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::constants::physics; // for constants +using namespace std; + +struct NchCumulantsId { + + HistogramRegistry hist{"hist", {}, OutputObjHandlingPolicy::AnalysisObject}; + + // PDG data base + Service pdgDB; + + Configurable cfgCutPosZ{"cfgCutPosZ", 10.0, "cut for vertex Z"}; + Configurable cfgCutDcaXY{"cfgCutDcaXY", 0.12, "cut for dcaXY"}; + Configurable cfgCutDcaZ{"cfgCutDcaZ", 0.3, "cut for dcaZ"}; + Configurable cfgCutEta{"cfgCutEta", 0.8, "cut for eta"}; + + void init(InitContext const&) + { + // QA check axes + const AxisSpec axisEvents{1, 0, 1, "Counts"}; + const AxisSpec axisEta{100, -1., +1., "#eta"}; + const AxisSpec axisPt{100, 0., 3., "p_{T} (GeV/c)"}; + const AxisSpec axisP{100, 0., 5., "p (GeV/c)"}; + const AxisSpec axisTPCInnerParam{100, 0, 3, "P_innerParam_Gev"}; + const AxisSpec axisdEdx(100, 20, 500, {"#frac{dE}{dx}"}); + const AxisSpec axisVtxZ{80, -20., 20., "V_{Z} (cm)"}; + const AxisSpec axisDCAz{200, -3., 3., "DCA_{Z} (cm)"}; + const AxisSpec axisDCAxy{200, -3., 3., "DCA_{XY} (cm)"}; + const AxisSpec axisMultFT0(150, 0, 1500, "MultFT0"); + const AxisSpec axisCent(103, -1., 102., "FT0C(%)"); + const AxisSpec axisPhi(80, -1, 7, "phi"); + + const AxisSpec axisTOFBeta = {40, -2.0, 2.0, "tofBeta"}; + const AxisSpec axisTPCSignal = {100, -1, 1000, "tpcSignal"}; + const AxisSpec axisTPCNSigma = {200, -10.0, 10.0, "n#sigma_{TPC}"}; + const AxisSpec axisTOFNSigma = {200, -10.0, 10.0, "n#sigma_{TOF}"}; + const AxisSpec axisTOFExpMom = {200, 0.0f, 10.0f, "#it{p}_{tofExpMom} (GeV/#it{c})"}; + + const AxisSpec axisNch(100, -50, 50, "Net_charge_dN"); + const AxisSpec axisPosCh(101, -1, 100, "Pos_charge"); + const AxisSpec axisNegCh(101, -1, 100, "Neg_charge"); + const AxisSpec axisNt(201, -1, 200, "Mult_midRap_Nch"); + const AxisSpec axisPrCh(101, -1, 100, "Pr_charge"); + const AxisSpec axisAPrCh(101, -1, 100, "APr_charge"); + const AxisSpec axisKaCh(101, -1, 100, "Ka_charge"); + const AxisSpec axisAKaCh(101, -1, 100, "AKa_charge"); + const AxisSpec axisPiCh(101, -1, 100, "Pion_Positive"); + const AxisSpec axisAPiCh(101, -1, 100, "Pion_Negative"); + + HistogramConfigSpec qnHist1({HistType::kTHnSparseD, {axisNch, axisPosCh, axisNegCh, axisPrCh, axisAPrCh, axisKaCh, axisAKaCh, axisNt, axisCent}}); + HistogramConfigSpec qnHist2({HistType::kTHnSparseD, {axisNch, axisPosCh, axisNegCh, axisPiCh, axisAPiCh, axisKaCh, axisAKaCh, axisNt, axisCent}}); + + HistogramConfigSpec histPPt({HistType::kTH2F, {axisP, axisPt}}); + HistogramConfigSpec histPTpcInnerParam({HistType::kTH2F, {axisP, axisTPCInnerParam}}); + HistogramConfigSpec histPTpcSignal({HistType::kTH2F, {axisP, axisTPCSignal}}); + HistogramConfigSpec histTpcInnerParamTpcSignal({HistType::kTH2F, {axisTPCInnerParam, axisTPCSignal}}); + HistogramConfigSpec histPBeta({HistType::kTH2F, {axisP, axisTOFBeta}}); + HistogramConfigSpec histTpcInnerParamBeta({HistType::kTH2F, {axisTPCInnerParam, axisTOFBeta}}); + HistogramConfigSpec histPTpcNSigma({HistType::kTH2F, {axisP, axisTPCNSigma}}); + HistogramConfigSpec histPtTpcNSigma({HistType::kTH2F, {axisPt, axisTPCNSigma}}); + HistogramConfigSpec histTpcInnerParamTpcNSigma({HistType::kTH2F, {axisTPCInnerParam, axisTPCNSigma}}); + HistogramConfigSpec histTofExpMomTpcNSigma({HistType::kTH2F, {axisTOFExpMom, axisTPCNSigma}}); + HistogramConfigSpec histPTofNSigma({HistType::kTH2F, {axisP, axisTOFNSigma}}); + HistogramConfigSpec histPtTofNSigma({HistType::kTH2F, {axisPt, axisTOFNSigma}}); + HistogramConfigSpec histTpcInnerParamTofNSigma({HistType::kTH2F, {axisTPCInnerParam, axisTOFNSigma}}); + HistogramConfigSpec histTofExpMomTofNSigma({HistType::kTH2F, {axisTOFExpMom, axisTOFNSigma}}); + HistogramConfigSpec histTpcNSigmaTofNSigma({HistType::kTH2F, {axisTPCNSigma, axisTOFNSigma}}); + + // QA check histos + + hist.add("QA/events/preSel/h_VtxZ", "V_{Z}", kTH1D, {axisVtxZ}); + hist.add("QA/events/preSel/h_Counts", "Counts", kTH1D, {axisEvents}); + hist.add("QA/events/preSel/multFT0", "multFT0", kTH1F, {axisMultFT0}); + hist.add("QA/events/preSel/centFT0", "centFT0", kTH1F, {axisCent}); + hist.addClone("QA/events/preSel/", "QA/events/postSel/"); + hist.add("QA/events/postSel/net_charge", "net_charge", kTH1F, {axisNch}); + hist.add("QA/events/postSel/Nt_centFT", "Mid_rap_Mult_VS_Cent", kTH2D, {{axisCent}, {axisNt}}); + + hist.add("QA/tracks/preSel/h_P", "p (Gev/c)", kTH1D, {axisP}); + hist.add("QA/tracks/preSel/h_P_InnerParameter", "p_InnerParameter (Gev/c)", kTH1D, {axisTPCInnerParam}); + hist.add("QA/tracks/preSel/h_Pt", "p_{T} (TPC & TPC+TOF)", kTH1D, {axisPt}); + hist.add("QA/tracks/preSel/h_Eta", "#eta ", kTH1D, {axisEta}); + hist.add("QA/tracks/preSel/h_phi", "#phi ", kTH1D, {axisPhi}); + hist.add("QA/tracks/preSel/h2_Pt_DcaZ", "DCA_{z}", kTH2D, {{axisPt}, {axisDCAz}}); + hist.add("QA/tracks/preSel/h2_Pt_DcaXY", "DCA_{xy}", kTH2D, {{axisPt}, {axisDCAxy}}); + hist.add("QA/tracks/preSel/h2_p_DcaZ", "DCA_{z}", kTH2D, {{axisP}, {axisDCAz}}); + hist.add("QA/tracks/preSel/h2_p_DcaXY", "DCA_{xy}", kTH2D, {{axisP}, {axisDCAxy}}); + hist.add("QA/tracks/preSel/dE_dx1", "dE/dx vs p", kTH2F, {axisP, axisdEdx}); + hist.add("QA/tracks/preSel/dE_dx2", "dE/dx vs innerparam", kTH2F, {axisTPCInnerParam, axisdEdx}); + hist.add("QA/tracks/preSel/p_pt", "p_vs_pT", kTH2F, {axisP, axisPt}); + hist.add("QA/tracks/preSel/p_pInnerParameter", "p_vs_innerparameter", kTH2F, {axisP, axisTPCInnerParam}); + + // tofBeta + hist.add("QA/tracks/preSel/p_beta", "p_beta", histPBeta); + hist.add("QA/tracks/preSel/tpcInnerParam_beta", "tpcInnerParam_beta", histTpcInnerParamBeta); + + // Look at Pion + hist.add("QA/tracks/preSel/Pi/NoId/p_tpcNSigma", "p_tpcNSigma", histPTpcNSigma); + hist.add("QA/tracks/preSel/Pi/NoId/pt_tpcNSigma", "pt_tpcNSigma", histPtTpcNSigma); + hist.add("QA/tracks/preSel/Pi/NoId/tpcInnerParam_tpcNSigma", "tpcInnerParam_tpcNSigma", histTpcInnerParamTpcNSigma); + hist.add("QA/tracks/preSel/Pi/NoId/tofExpMom_tpcNSigma", "tofExpMom_tpcNSigma", histTofExpMomTpcNSigma); + hist.add("QA/tracks/preSel/Pi/NoId/p_tofNSigma", "p_tofNSigma", histPTofNSigma); + hist.add("QA/tracks/preSel/Pi/NoId/pt_tofNSigma", "pt_tofNSigma", histPtTofNSigma); + hist.add("QA/tracks/preSel/Pi/NoId/tpcInnerParam_tofNSigma", "tpcInnerParam_tofNSigma", histTpcInnerParamTofNSigma); + hist.add("QA/tracks/preSel/Pi/NoId/tofExpMom_tofNSigma", "tofExpMom_tofNSigma", histTofExpMomTofNSigma); + hist.add("QA/tracks/preSel/Pi/NoId/tpcNSigma_tofNSigma", "tpcNSigma_tofNSigma", histTpcNSigmaTofNSigma); + + hist.addClone("QA/tracks/preSel/Pi/", "QA/tracks/preSel/Ka/"); + hist.addClone("QA/tracks/preSel/Pi/", "QA/tracks/preSel/Pr/"); + + hist.addClone("QA/tracks/preSel/", "QA/tracks/postSel/"); + + hist.add("QA/tracks/Idfd/Pi/tpcId/p_pt", "p_pt", histPPt); + hist.add("QA/tracks/Idfd/Pi/tpcId/p_tpcInnerParam", "p_tpcInnerParam", histPTpcInnerParam); + // tpcSignal + hist.add("QA/tracks/Idfd/Pi/tpcId/p_tpcSignal", "p_tpcSignal", histPTpcSignal); + hist.add("QA/tracks/Idfd/Pi/tpcId/tpcInnerParam_tpcSignal", "tpcInnerParam_tpcSignal", histTpcInnerParamTpcSignal); + // tofBeta + hist.add("QA/tracks/Idfd/Pi/tpcId/p_beta", "p_beta", histPBeta); + hist.add("QA/tracks/Idfd/Pi/tpcId/tpcInnerParam_beta", "tpcInnerParam_beta", histTpcInnerParamBeta); + // Look at Pion + hist.add("QA/tracks/Idfd/Pi/tpcId/p_tpcNSigma", "p_tpcNSigma", histPTpcNSigma); + hist.add("QA/tracks/Idfd/Pi/tpcId/pt_tpcNSigma", "pt_tpcNSigma", histPtTpcNSigma); + hist.add("QA/tracks/Idfd/Pi/tpcId/tpcInnerParam_tpcNSigma", "tpcInnerParam_tpcNSigma", histTpcInnerParamTpcNSigma); + hist.add("QA/tracks/Idfd/Pi/tpcId/tofExpMom_tpcNSigma", "tofExpMom_tpcNSigma", histTofExpMomTpcNSigma); + hist.add("QA/tracks/Idfd/Pi/tpcId/p_tofNSigma", "p_tofNSigma", histPTofNSigma); + hist.add("QA/tracks/Idfd/Pi/tpcId/pt_tofNSigma", "pt_tofNSigma", histPtTofNSigma); + hist.add("QA/tracks/Idfd/Pi/tpcId/tpcInnerParam_tofNSigma", "tpcInnerParam_tofNSigma", histTpcInnerParamTofNSigma); + hist.add("QA/tracks/Idfd/Pi/tpcId/tofExpMom_tofNSigma", "tofExpMom_tofNSigma", histTofExpMomTofNSigma); + hist.add("QA/tracks/Idfd/Pi/tpcId/tpcNSigma_tofNSigma", "tpcNSigma_tofNSigma", histTpcNSigmaTofNSigma); + + hist.addClone("QA/tracks/Idfd/Pi/tpcId/", "QA/tracks/Idfd/Pi/tofId/"); + hist.addClone("QA/tracks/Idfd/Pi/", "QA/tracks/Idfd/Ka/"); + hist.addClone("QA/tracks/Idfd/Pi/", "QA/tracks/Idfd/Pr/"); + + hist.add("sparse1", "sparse1", qnHist1); + hist.add("sparse2", "sparse2", qnHist2); + } // init ends + + // particle identifications + // tpc Selections + template + bool selPionTPCInnerParam(T track) + { + if (std::abs(track.tpcNSigmaEl()) > 3.0 && std::abs(track.tpcNSigmaKa()) > 3.0 && std::abs(track.tpcNSigmaPr()) > 3.0 && std::abs(track.tpcNSigmaDe()) > 3.0) { + if (0.05 <= track.tpcInnerParam() && track.tpcInnerParam() < 0.70 && std::abs(track.tpcNSigmaPi()) < 3.0) { + return true; + } + if (0.70 <= track.tpcInnerParam() && std::abs(track.tpcNSigmaPi()) < 2.0) { + return true; + } + } + return false; + } + + template + bool selKaonTPCInnerParam(T track) + { + // p dependent cuts + if (std::abs(track.tpcNSigmaEl()) > 3.0 && std::abs(track.tpcNSigmaPi()) > 3.0 && std::abs(track.tpcNSigmaPr()) > 3.0 && std::abs(track.tpcNSigmaDe()) > 3.0) { + if (0.05 <= track.tpcInnerParam() && track.tpcInnerParam() < 0.70 && std::abs(track.tpcNSigmaKa()) < 3.0) { + return true; + } + if (0.70 <= track.tpcInnerParam() && std::abs(track.tpcNSigmaKa()) < 2.0) { + return true; + } + } + return false; + } + + template + bool selProtonTPCInnerParam(T track) + { + if (std::abs(track.tpcNSigmaEl()) > 3.0 && std::abs(track.tpcNSigmaPi()) > 3.0 && std::abs(track.tpcNSigmaKa()) > 3.0 && std::abs(track.tpcNSigmaDe()) > 3.0) { + if (0.05 <= track.tpcInnerParam() && track.tpcInnerParam() < 1.60 && std::abs(track.tpcNSigmaPr()) < 3.0) { + return true; + } + if (1.60 <= track.tpcInnerParam() && std::abs(track.tpcNSigmaPr()) < 2.0) { + return true; + } + } + return false; + } + + template + bool selDeuteronTPCInnerParam(T track) + { + if (std::abs(track.tpcNSigmaEl()) > 3.0 && std::abs(track.tpcNSigmaPi()) > 3.0 && std::abs(track.tpcNSigmaKa()) > 3.0 && std::abs(track.tpcNSigmaPr()) > 3.0) { + if (0.05 <= track.tpcInnerParam() && track.tpcInnerParam() < 1.80 && std::abs(track.tpcNSigmaDe()) < 3.0) { + return true; + } + if (1.80 <= track.tpcInnerParam() && std::abs(track.tpcNSigmaDe()) < 2.0) { + return true; + } + } + return false; + } + + template + bool selElectronTPCInnerParam(T track) + { + if (track.tpcNSigmaEl() < 3.0 && track.tpcNSigmaPi() > 3.0 && track.tpcNSigmaKa() > 3.0 && track.tpcNSigmaPr() > 3.0 && track.tpcNSigmaDe() > 3.0) { + return true; + } + return false; + } + // + + // TOF Selections + // Pion + template + bool selPionTOF(T track) + { + if (track.p() <= 0.75 && std::abs(track.tpcNSigmaPi()) < 3.0 && std::abs(track.tofNSigmaPi()) < 3.0 && std::abs(track.tofNSigmaEl()) > 3.0) { + return true; + } else if (0.75 < track.p() // after p = 0.75, Pi and Ka lines of nSigma 3.0 will start intersecting + && std::abs(track.tpcNSigmaPi()) < 2.0 && std::abs(track.tofNSigmaPi()) < 2.0 && std::abs(track.tofNSigmaEl()) > 3.0 && std::abs(track.tofNSigmaKa()) > 3.0 && std::abs(track.tofNSigmaPr()) > 3.0 && std::abs(track.tofNSigmaDe()) > 3.0) { + return true; + } + return false; + } + + // Kaon + template + bool selKaonTOF(T track) + { + if (track.p() <= 0.75 && std::abs(track.tpcNSigmaKa()) < 3.0 && std::abs(track.tofNSigmaKa()) < 3.0) { + return true; + } + if (0.75 < track.p() && track.p() <= 1.30 // after 0.75 Pi and Ka lines of nSigma 3.0 will start intersecting + && std::abs(track.tpcNSigmaKa()) < 3.0 && std::abs(track.tofNSigmaKa()) < 3.0 && std::abs(track.tofNSigmaPi()) > 3.0 && std::abs(track.tofNSigmaEl()) > 3.0) { + return true; + } + if (1.30 < track.p() // after 1.30 Pr and Ka lines of nSigma 3.0 will start intersecting + && std::abs(track.tpcNSigmaKa()) < 2.0 && std::abs(track.tofNSigmaKa()) < 2.0 && std::abs(track.tofNSigmaEl()) > 3.0 && std::abs(track.tofNSigmaPi()) > 3.0 && std::abs(track.tofNSigmaPr()) > 3.0 && std::abs(track.tofNSigmaDe()) > 3.0) { + return true; + } + return false; + } + + // Proton + template + bool selProtonTOF(T track) + { + if (track.p() <= 1.30 && std::abs(track.tpcNSigmaPr()) < 3.0 && std::abs(track.tofNSigmaPr()) < 3.0) { + return true; + } + if (1.30 < track.p() && track.p() <= 3.10 // after 1.30 Pr and Ka lines of nSigma 3.0 will start intersecting + && std::abs(track.tpcNSigmaPr()) < 3.0 && std::abs(track.tofNSigmaPr()) < 3.0 && std::abs(track.tofNSigmaEl()) > 3.0 && std::abs(track.tofNSigmaPi()) > 3.0 && std::abs(track.tofNSigmaKa()) > 3.0 && std::abs(track.tofNSigmaDe()) > 3.0 // Some Deuteron contamination is still coming in p dependent cuts + ) { + return true; + } + if (3.10 < track.p() // after 3.10 Pr and De lines of nSigma 3.0 will start intersecting + && std::abs(track.tpcNSigmaPr()) < 2.0 && std::abs(track.tofNSigmaPr()) < 2.0 && std::abs(track.tofNSigmaEl()) > 3.0 && std::abs(track.tofNSigmaPi()) > 3.0 && std::abs(track.tofNSigmaKa()) > 3.0 && std::abs(track.tofNSigmaDe()) > 3.0) { + return true; + } + return false; + } + + // Deuteron + template + bool selDeuteronTOF(T track) + { + if (track.p() <= 3.10 && std::abs(track.tpcNSigmaDe()) < 3.0 && std::abs(track.tofNSigmaDe()) < 3.0 && std::abs(track.tofNSigmaEl()) > 3.0 && std::abs(track.tofNSigmaPi()) > 3.0 && std::abs(track.tofNSigmaKa()) > 3.0 && std::abs(track.tofNSigmaPr()) > 3.0) { + return true; + } + if (3.10 < track.p() // after 3.10 De and Pr lines of nSigma 3.0 will start intersecting + && std::abs(track.tpcNSigmaDe()) < 2.0 && std::abs(track.tofNSigmaDe()) < 2.0 && std::abs(track.tofNSigmaEl()) > 3.0 && std::abs(track.tofNSigmaPi()) > 3.0 && std::abs(track.tofNSigmaKa()) > 3.0 && std::abs(track.tofNSigmaPr()) > 3.0) { + return true; + } + return false; + } + + // Electron + template + bool selElectronTOF(T track) + { + if ( + (std::pow(track.tpcNSigmaEl(), 2) + std::pow(track.tofNSigmaEl(), 2)) < 9.00 && std::abs(track.tofNSigmaPi()) > 3.0 && std::abs(track.tofNSigmaKa()) > 3.0 && std::abs(track.tofNSigmaPr()) > 3.0 && std::abs(track.tofNSigmaDe()) > 3.0) { + return true; + } + return false; + } + // + + // SelectionFunctions + // Pion + template + bool selPion(T track, int& IdMethod) + { + if (!track.hasTOF() && selPionTPCInnerParam(track)) { + IdMethod = 0; + return true; + } + if (track.hasTOF() && track.beta() < 0.0 && selPionTPCInnerParam(track)) { + IdMethod = 0; + return true; + } + if (track.hasTOF() && track.beta() > 0.0 && selPionTPCInnerParam(track)) { + IdMethod = 0; + return true; + } + if (track.hasTOF() && track.beta() > 0.0 && !selPionTPCInnerParam(track)) { + IdMethod = 1; + return selPionTOF(track); + } + return false; + } + + // Kaon + template + bool selKaon(T track, int& IdMethod) + { + if (!track.hasTOF() && selKaonTPCInnerParam(track)) { + IdMethod = 0; + return true; + } + if (track.hasTOF() && track.beta() < 0.0 && selKaonTPCInnerParam(track)) { + IdMethod = 0; + return true; + } + if (track.hasTOF() && track.beta() > 0.0 && selKaonTPCInnerParam(track)) { + IdMethod = 0; + return true; + } + if (track.hasTOF() && track.beta() > 0.0 && !selKaonTPCInnerParam(track)) { + IdMethod = 1; + return selKaonTOF(track); + } + return false; + } + + // Proton + template + bool selProton(T track, int& IdMethod) + { + if (!track.hasTOF() && selProtonTPCInnerParam(track)) { + IdMethod = 0; + return true; + } + if (track.hasTOF() && track.beta() < 0.0 && selProtonTPCInnerParam(track)) { + IdMethod = 0; + return true; + } + if (track.hasTOF() && track.beta() > 0.0 && selProtonTPCInnerParam(track)) { + IdMethod = 0; + return true; + } + if (track.hasTOF() && track.beta() > 0.0 && !selProtonTPCInnerParam(track)) { + IdMethod = 1; + return selProtonTOF(track); + } + return false; + } + + // Deuteron + template + bool selDeuteron(T track, int& IdMethod) + { + if (!track.hasTOF() && selDeuteronTPCInnerParam(track)) { + IdMethod = 0; + return true; + } + if (track.hasTOF() && track.beta() < 0.0 && selDeuteronTPCInnerParam(track)) { + IdMethod = 0; + return true; + } + if (track.hasTOF() && track.beta() > 0.0 && selDeuteronTPCInnerParam(track)) { + IdMethod = 0; + return true; + } + if (track.hasTOF() && track.beta() > 0.0 && !selDeuteronTPCInnerParam(track)) { + IdMethod = 1; + return selDeuteronTOF(track); + } + return false; + } + + // Electron + template + bool selElectron(T track, int& IdMethod) + { + if (!track.hasTOF() && selElectronTPCInnerParam(track)) { + IdMethod = 0; + return true; + } + if (track.hasTOF() && track.beta() < 0.0 && selElectronTPCInnerParam(track)) { + IdMethod = 0; + return true; + } + if (track.hasTOF() && track.beta() > 0.0 && selElectronTPCInnerParam(track)) { + IdMethod = 0; + return true; + } + if (track.hasTOF() && track.beta() > 0.0 && !selElectronTPCInnerParam(track)) { + IdMethod = 1; + return selElectronTOF(track); + } + return false; + } + // + + enum HistRegEnum { + qaEventPreSel = 0, + qaEventPostSel, + qaTracksPreSel, + qaTracksPostSel, + qaTracksIdfd + }; + + static constexpr std::string_view HistRegDire[] = { + "QA/events/preSel/", + "QA/events/postSel/", + "QA/tracks/preSel/", + "QA/tracks/postSel/", + "QA/tracks/Idfd/"}; + + enum PidEnum { + kPi = 0, // dont use kPion, kKaon, as these enumeration + kKa, // are already defined in $ROOTSYS/root/include/TPDGCode.h + kPr, + kEl, + kDe + }; + + static constexpr std::string_view PidDire[] = { + "Pi/", + "Ka/", + "Pr/", + "El/", + "De/"}; + + enum DetEnum { + tpcId = 0, + tofId, + NoId + }; + + static constexpr std::string_view DetDire[] = { + "tpcId/", + "tofId/", + "NoId/"}; + + template + void fillIdentificationQA(H histReg, const T& track) + { + float tpcNSigmaVal = -999, tofNSigmaVal = -999; + switch (pidMode) { + case kPi: + tpcNSigmaVal = track.tpcNSigmaPi(); + tofNSigmaVal = track.tofNSigmaPi(); + break; + case kKa: + tpcNSigmaVal = track.tpcNSigmaKa(); + tofNSigmaVal = track.tofNSigmaKa(); + break; + case kPr: + tpcNSigmaVal = track.tpcNSigmaPr(); + tofNSigmaVal = track.tofNSigmaPr(); + break; + case kEl: + tpcNSigmaVal = track.tpcNSigmaEl(); + tofNSigmaVal = track.tofNSigmaEl(); + break; + case kDe: + tpcNSigmaVal = track.tpcNSigmaDe(); + tofNSigmaVal = track.tofNSigmaDe(); + break; + default: + tpcNSigmaVal = -999, tofNSigmaVal = -999; + break; + } + + // NSigma + histReg.fill(HIST(HistRegDire[Mode]) + HIST(PidDire[pidMode]) + HIST(DetDire[detMode]) + HIST("p_tpcNSigma"), track.p(), tpcNSigmaVal); + histReg.fill(HIST(HistRegDire[Mode]) + HIST(PidDire[pidMode]) + HIST(DetDire[detMode]) + HIST("pt_tpcNSigma"), track.pt(), tpcNSigmaVal); + histReg.fill(HIST(HistRegDire[Mode]) + HIST(PidDire[pidMode]) + HIST(DetDire[detMode]) + HIST("tpcInnerParam_tpcNSigma"), track.tpcInnerParam(), tpcNSigmaVal); + histReg.fill(HIST(HistRegDire[Mode]) + HIST(PidDire[pidMode]) + HIST(DetDire[detMode]) + HIST("tofExpMom_tpcNSigma"), track.tofExpMom(), tpcNSigmaVal); + histReg.fill(HIST(HistRegDire[Mode]) + HIST(PidDire[pidMode]) + HIST(DetDire[detMode]) + HIST("p_tofNSigma"), track.p(), tofNSigmaVal); + histReg.fill(HIST(HistRegDire[Mode]) + HIST(PidDire[pidMode]) + HIST(DetDire[detMode]) + HIST("pt_tofNSigma"), track.pt(), tofNSigmaVal); + histReg.fill(HIST(HistRegDire[Mode]) + HIST(PidDire[pidMode]) + HIST(DetDire[detMode]) + HIST("tpcInnerParam_tofNSigma"), track.tpcInnerParam(), tofNSigmaVal); + histReg.fill(HIST(HistRegDire[Mode]) + HIST(PidDire[pidMode]) + HIST(DetDire[detMode]) + HIST("tofExpMom_tofNSigma"), track.tofExpMom(), tofNSigmaVal); + histReg.fill(HIST(HistRegDire[Mode]) + HIST(PidDire[pidMode]) + HIST(DetDire[detMode]) + HIST("tpcNSigma_tofNSigma"), tpcNSigmaVal, tofNSigmaVal); + } + + template + void fillCollQA(const T& col, const int& nCh, const int& nT) + { + hist.fill(HIST(HistRegDire[mode]) + HIST("h_VtxZ"), col.posZ()); + hist.fill(HIST(HistRegDire[mode]) + HIST("h_Counts"), 0.5); + hist.fill(HIST(HistRegDire[mode]) + HIST("multFT0"), col.multFT0C()); + hist.fill(HIST(HistRegDire[mode]) + HIST("centFT0"), col.centFT0M()); + if (mode == qaEventPostSel) { + hist.fill(HIST(HistRegDire[mode]) + HIST("net_charge"), nCh); + hist.fill(HIST(HistRegDire[mode]) + HIST("Nt_centFT"), col.centFT0M(), nT); + } + } + + template + void fillTrackQA(const T& track) + { + hist.fill(HIST(HistRegDire[mode]) + HIST("h_P"), track.p()); + hist.fill(HIST(HistRegDire[mode]) + HIST("h_P_InnerParameter"), track.tpcInnerParam()); + hist.fill(HIST(HistRegDire[mode]) + HIST("h_Pt"), track.pt()); + hist.fill(HIST(HistRegDire[mode]) + HIST("h_Eta"), track.eta()); + hist.fill(HIST(HistRegDire[mode]) + HIST("h_phi"), track.phi()); + hist.fill(HIST(HistRegDire[mode]) + HIST("h2_Pt_DcaZ"), track.pt(), track.dcaZ()); + hist.fill(HIST(HistRegDire[mode]) + HIST("h2_Pt_DcaXY"), track.pt(), track.dcaXY()); + hist.fill(HIST(HistRegDire[mode]) + HIST("h2_p_DcaZ"), track.p(), track.dcaZ()); + hist.fill(HIST(HistRegDire[mode]) + HIST("h2_p_DcaXY"), track.p(), track.dcaXY()); + hist.fill(HIST(HistRegDire[mode]) + HIST("dE_dx1"), track.p(), track.tpcSignal()); + hist.fill(HIST(HistRegDire[mode]) + HIST("dE_dx2"), track.tpcInnerParam(), track.tpcSignal()); + hist.fill(HIST(HistRegDire[mode]) + HIST("p_pt"), track.p(), track.pt()); + hist.fill(HIST(HistRegDire[mode]) + HIST("p_pInnerParameter"), track.p(), track.tpcInnerParam()); + + // tofBeta + hist.fill(HIST(HistRegDire[mode]) + HIST("p_beta"), track.p(), track.beta()); + hist.fill(HIST(HistRegDire[mode]) + HIST("tpcInnerParam_beta"), track.tpcInnerParam(), track.beta()); + + // Look at Pion + fillIdentificationQA(hist, track); // Look at Pion + fillIdentificationQA(hist, track); // Look at Kaon + fillIdentificationQA(hist, track); // Look at Proton + } + + using MyAllTracks = soa::Join; + using MyCollisions = soa::Join; + // tracks and collision filters + Filter col = aod::evsel::sel8 == true; + Filter colFilter = nabs(aod::collision::posZ) < cfgCutPosZ; + Filter trackFilter = requireGlobalTrackInFilter(); + Filter trackPt = (aod::track::pt > 0.15f) && (aod::track::pt < 2.0f); + Filter trackDCAxy = nabs(aod::track::dcaXY) < cfgCutDcaXY; + Filter trackDCAz = nabs(aod::track::dcaZ) < cfgCutDcaZ; + Filter tracketa = nabs(aod::track::eta) < cfgCutEta; + + using MyFilteredCol = soa::Filtered; + using MyFilteredTracks = soa::Filtered; + + // manual sliceby + SliceCache cache; + Preslice tracksPerCollisionPreslice = o2::aod::track::collisionId; + + void process(MyFilteredCol const& collisions, MyFilteredTracks const& tracks) + { + for (const auto& col : collisions) { + + int nP = 0; + int nM = 0; + int nCh = 0; + int nT = 0; + int nPr = 0; + int nAPr = 0; + int nKa = 0; + int nAKa = 0; + int nPi = 0; + int nAPi = 0; + // group tracks manually with corresponding collision using col id; + const uint64_t collIdx = col.globalIndex(); + const auto tracksTablePerColl = tracks.sliceBy(tracksPerCollisionPreslice, collIdx); + + for (const auto& track : tracksTablePerColl) { + + fillTrackQA(track); + + if (track.sign() == 1) { + nP++; + } + if (track.sign() == -1) { + nM++; + } + + int idMethod; + // pion + if (selPion(track, idMethod)) { + if (track.sign() == 1) { + nPi++; + } + if (track.sign() == -1) { + nAPi++; + } + + if (idMethod == 0) + fillIdentificationQA(hist, track); + if (idMethod == 1) + fillIdentificationQA(hist, track); + } + // kaon + if (selKaon(track, idMethod)) { + if (track.sign() == 1) { + nKa++; + } + if (track.sign() == -1) { + nAKa++; + } + + if (idMethod == 0) + fillIdentificationQA(hist, track); + if (idMethod == 1) + fillIdentificationQA(hist, track); + } + // proton + if (selProton(track, idMethod)) { + if (track.sign() == 1) { + nPr++; + } + if (track.sign() == -1) { + nAPr++; + } + + if (idMethod == 0) + fillIdentificationQA(hist, track); + if (idMethod == 1) + fillIdentificationQA(hist, track); + } + + } // track itteration ends + nCh = nP - nM; + nT = nP + nM; + + fillCollQA(col, nCh, nT); + + hist.fill(HIST("sparse1"), nCh, nP, nM, nPr, nAPr, nKa, nAKa, nT, col.centFT0M()); + hist.fill(HIST("sparse2"), nCh, nP, nM, nPi, nAPi, nKa, nAKa, nT, col.centFT0M()); + + } // collision ends + } // process ends +}; // structure ends + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc)}; +} From 8b911fd5c35465573ac950cc9cbda0af67a2bf52 Mon Sep 17 00:00:00 2001 From: Giovanni Malfattore <89481844+giovannimalfattore@users.noreply.github.com> Date: Wed, 26 Feb 2025 02:37:13 +0100 Subject: [PATCH 0422/1650] [PWGLF] NucleiTask - Add skimming histo (#10192) --- PWGLF/Tasks/Nuspex/CMakeLists.txt | 2 +- PWGLF/Tasks/Nuspex/LFNucleiBATask.cxx | 145 +++++++++++++++++++------- 2 files changed, 108 insertions(+), 39 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/CMakeLists.txt b/PWGLF/Tasks/Nuspex/CMakeLists.txt index 8cf61dda93f..4e3dcf2a892 100644 --- a/PWGLF/Tasks/Nuspex/CMakeLists.txt +++ b/PWGLF/Tasks/Nuspex/CMakeLists.txt @@ -11,7 +11,7 @@ o2physics_add_dpl_workflow(nuclei-batask SOURCES LFNucleiBATask.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::AnalysisCCDB O2Physics::EventFilteringUtils COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(hypertritonanalysis diff --git a/PWGLF/Tasks/Nuspex/LFNucleiBATask.cxx b/PWGLF/Tasks/Nuspex/LFNucleiBATask.cxx index 510529af1de..3ead8169490 100644 --- a/PWGLF/Tasks/Nuspex/LFNucleiBATask.cxx +++ b/PWGLF/Tasks/Nuspex/LFNucleiBATask.cxx @@ -16,6 +16,12 @@ /// /// \author Giovanni Malfattore and Rutuparna Rath /// +#include "EventFiltering/Zorro.h" +#include "EventFiltering/ZorroSummary.h" + +#include "CCDB/BasicCCDBManager.h" +#include + #include "PWGLF/DataModel/LFNucleiTables.h" #include #include @@ -42,6 +48,11 @@ using namespace o2::framework; using namespace o2::framework::expressions; struct LFNucleiBATask { + Service ccdb; + + Zorro zorro; + OutputObj zorroSummary{"zorroSummary"}; + HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry spectraGen{"spectraGen", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; HistogramRegistry debugHistos{"debugHistos", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -55,6 +66,13 @@ struct LFNucleiBATask { Configurable enableAl{"enableAl", true, "Flag to enable alpha analysis."}; Configurable enableTrackingEff{"enableTrackingEff", 0, "Flag to enable tracking efficiency hitos."}; + Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + + // Set the triggered events skimming scheme + struct : ConfigurableGroup { + Configurable applySkimming{"applySkimming", false, "Skimmed dataset processing"}; + Configurable cfgSkimming{"cfgSkimming", "fHe", "Configurable for skimming"}; + } skimmingOptions; // Set the event selection cuts struct : ConfigurableGroup { @@ -206,8 +224,20 @@ struct LFNucleiBATask { return averageClusterSizePerCoslInv(track.itsClusterSizes(), track.eta()); } + void initCCDB(o2::aod::BCsWithTimestamps::iterator const& bc) + { + if (skimmingOptions.applySkimming) { + zorro.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), skimmingOptions.cfgSkimming.value); + zorro.populateHistRegistry(histos, bc.runNumber()); + } + } + void init(o2::framework::InitContext&) { + if (skimmingOptions.applySkimming) { + zorroSummary.setObject(zorro.getZorroSummary()); + } + const AxisSpec pAxis{binsPt, "#it{p} (GeV/#it{c})"}; const AxisSpec ptAxis{binsPt, "#it{p}_{T} (GeV/#it{c})"}; const AxisSpec ptHeAxis{binsPtHe, "#it{p}_{T} (GeV/#it{c})"}; @@ -267,6 +297,11 @@ struct LFNucleiBATask { } } + histos.add("event/eventSkimming", "eventSkimming", HistType::kTH1D, {{2, 0.0, 2.0}}); + auto hSkim = histos.get(HIST("event/eventSkimming")); + hSkim->GetXaxis()->SetBinLabel(1, "Total"); + hSkim->GetXaxis()->SetBinLabel(2, "Skimmed events"); + histos.add("event/eventSelection", "eventSelection", HistType::kTH1D, {{7, -0.5, 6.5}}); auto h = histos.get(HIST("event/eventSelection")); h->GetXaxis()->SetBinLabel(1, "Total"); @@ -278,8 +313,10 @@ struct LFNucleiBATask { h->GetXaxis()->SetBinLabel(7, "Z-vert Cut"); histos.add("event/h1VtxZ", "V_{z};V_{z} (in cm); counts", HistType::kTH1F, {{1500, -15, 15}}); - histos.add("tracks/h1pT", "Track #it{p}_{T}; #it{p}_{T} (GeV/#it{c}); counts", HistType::kTH1F, {{500, 0., 10.}}); - histos.add("tracks/h1p", "Track momentum; p (GeV/#it{c}); counts", HistType::kTH1F, {{500, 0., 10.}}); + if (enablePIDplot) { + histos.add("tracks/h1pT", "Track #it{p}_{T}; #it{p}_{T} (GeV/#it{c}); counts", HistType::kTH1F, {{500, 0., 10.}}); + histos.add("tracks/h1p", "Track momentum; p (GeV/#it{c}); counts", HistType::kTH1F, {{500, 0., 10.}}); + } histos.add("qa/h1ITSncr", "number of crossed rows in ITS; ITSncr; counts", HistType::kTH1F, {{12, 0, 12}}); histos.add("qa/h1TPCncr", "number of crossed rows in TPC; TPCncr; counts", HistType::kTH1F, {{150, 60, 170}}); @@ -1442,8 +1479,7 @@ struct LFNucleiBATask { } // Bethe-Bloch TPC distribution and Beta vs pT TOF distribution - histos.add("tracks/h2TPCsignVsTPCmomentum", "TPC <-dE/dX> vs #it{p}/Z; Signed #it{p} (GeV/#it{c}); TPC <-dE/dx> (a.u.)", HistType::kTH2F, {{400, -8.f, 8.f}, {dedxAxis}}); - if (nsigmaITSvar.showAverageClusterSize) { + if (nsigmaITSvar.showAverageClusterSize && enablePIDplot) { histos.add("tracks/averageClusterSize", "", HistType::kTH2F, {{pZAxis}, {avClsAxis}}); histos.add("tracks/averageClusterSizePerCoslInv", "", HistType::kTH2F, {{pZAxis}, {avClsEffAxis}}); } @@ -1452,6 +1488,7 @@ struct LFNucleiBATask { debugHistos.add("debug/h2TPCsignVsTPCmomentum_FakeHits", "TPC <-dE/dX> vs #it{p}/Z (Fake hits); Signed #it{p} (GeV/#it{c}); TPC <-dE/dx> (a.u.)", HistType::kTH2F, {{400, -8.f, 8.f}, {dedxAxis}}); } if (enablePIDplot) { + histos.add("tracks/h2TPCsignVsTPCmomentum", "TPC <-dE/dX> vs #it{p}/Z; Signed #it{p} (GeV/#it{c}); TPC <-dE/dx> (a.u.)", HistType::kTH2F, {{400, -8.f, 8.f}, {dedxAxis}}); if (enablePr) { histos.add("tracks/proton/h2TPCsignVsTPCmomentumProton", "TPC <-dE/dX> vs #it{p}/Z; Signed #it{p} (GeV/#it{c}); TPC <-dE/dx> (a.u.)", HistType::kTH2F, {{400, 0.f, 8.f}, {dedxAxis}}); histos.add("tracks/proton/h2TPCsignVsTPCmomentumantiProton", "TPC <-dE/dX> vs #it{p}/Z; Signed #it{p} (GeV/#it{c}); TPC <-dE/dx> (a.u.)", HistType::kTH2F, {{400, 0.f, 8.f}, {dedxAxis}}); @@ -1467,10 +1504,6 @@ struct LFNucleiBATask { if (enableHe) { histos.add("tracks/helium/h2TPCsignVsTPCmomentumHelium", "TPC <-dE/dX> vs #it{p}/Z; Signed #it{p} (GeV/#it{c}); TPC <-dE/dx> (a.u.)", HistType::kTH2F, {{400, 0.f, 8.f}, {dedxAxis}}); histos.add("tracks/helium/h2TPCsignVsTPCmomentumantiHelium", "TPC <-dE/dX> vs #it{p}/Z; Signed #it{p} (GeV/#it{c}); TPC <-dE/dx> (a.u.)", HistType::kTH2F, {{400, 0.f, 8.f}, {dedxAxis}}); - if (nsigmaITSvar.showAverageClusterSize) { - histos.add("tracks/helium/averageClusterSize", "", HistType::kTH2F, {{pZAxis}, {avClsAxis}}); - histos.add("tracks/helium/averageClusterSizePerCoslInv", "", HistType::kTH2F, {{pZAxis}, {avClsEffAxis}}); - } } if (enableAl) { histos.add("tracks/alpha/h2TPCsignVsTPCmomentumAlpha", "TPC <-dE/dX> vs #it{p}/Z; Signed #it{p} (GeV/#it{c}); TPC <-dE/dx> (a.u.)", HistType::kTH2F, {{400, 0.f, 8.f}, {dedxAxis}}); @@ -1478,7 +1511,14 @@ struct LFNucleiBATask { } } - if (outFlagOptions.doTOFplots) { + if (enableHe) { + if (nsigmaITSvar.showAverageClusterSize) { + histos.add("tracks/helium/averageClusterSize", "", HistType::kTH2F, {{pZAxis}, {avClsAxis}}); + histos.add("tracks/helium/averageClusterSizePerCoslInv", "", HistType::kTH2F, {{pZAxis}, {avClsEffAxis}}); + } + } + + if (outFlagOptions.doTOFplots && enablePIDplot) { histos.add("tracks/h2TPCsignVsBetaGamma", "TPC <-dE/dX> vs #beta#gamma/Z; Signed #beta#gamma; TPC <-dE/dx> (a.u.)", HistType::kTH2F, {{250, -5.f, 5.f}, {dedxAxis}}); histos.add("tracks/h2TOFbetaVsP", "TOF #beta vs #it{p}/Z; Signed #it{p} (GeV/#it{c}); TOF #beta", HistType::kTH2F, {{250, -5.f, 5.f}, {betaAxis}}); if (outFlagOptions.enableBetaCut) @@ -1609,7 +1649,8 @@ struct LFNucleiBATask { histos.add("tracks/helium/h2antiHeliumVspTNSigmaTOF", "NSigmaTOF(#bar{He}) vs #it{p}_{T}/z; #it{p}_{T}/z (GeV/#it{c}); NSigmaTOF", HistType::kTH2F, {{ptZHeAxis}, {sigmaTOFAxis}}); } // TOF mass histograms - histos.add("tracks/h2TOFmassVsPt", "h2TOFmassVsPt; TOFmass; #it{p}_{T} (GeV)", HistType::kTH2F, {{180, 0.4, 4.}, {250, 0., 5.}}); + if (enablePIDplot) + histos.add("tracks/h2TOFmassVsPt", "h2TOFmassVsPt; TOFmass; #it{p}_{T} (GeV)", HistType::kTH2F, {{180, 0.4, 4.}, {250, 0., 5.}}); if (enablePr) { histos.add("tracks/proton/h2TOFmassProtonVsPt", "h2TOFmassProtonVsPt; TOFmass; #it{p}_{T} (GeV)", HistType::kTH2F, {{180, 0.4, 4.}, {250, 0., 5.}}); histos.add("tracks/proton/h2TOFmassantiProtonVsPt", "h2TOFmassantiProtonVsPt; TOFmass; #it{p}_{T} (GeV)", HistType::kTH2F, {{180, 0.4, 4.}, {250, 0., 5.}}); @@ -2007,6 +2048,19 @@ struct LFNucleiBATask { const TracksType& tracks, const ParticleType& /*particles*/) { + histos.fill(HIST("event/eventSkimming"), 0.5); + // Apply skimming + if constexpr (!IsFilteredData) { + const auto& bc = event.template bc_as(); + initCCDB(bc); + if (skimmingOptions.applySkimming) { + if (!zorro.isSelected(bc.globalBC())) { + return; + } + } + histos.fill(HIST("event/eventSkimming"), 1.5); + } + // Event histos fill histos.fill(HIST("event/eventSelection"), 0); if (enableDebug) @@ -2097,8 +2151,10 @@ struct LFNucleiBATask { } for (auto& track : tracksWithITS) { - histos.fill(HIST("tracks/h1pT"), track.pt()); - histos.fill(HIST("tracks/h1p"), track.p()); + if (enablePIDplot) { + histos.fill(HIST("tracks/h1pT"), track.pt()); + histos.fill(HIST("tracks/h1p"), track.p()); + } if constexpr (!IsFilteredData) { if (!track.isGlobalTrackWoDCA()) { @@ -3655,9 +3711,11 @@ struct LFNucleiBATask { continue; } - histos.fill(HIST("tracks/h2TPCsignVsTPCmomentum"), track.tpcInnerParam() / (1.f * track.sign()), track.tpcSignal()); + if (enablePIDplot) + histos.fill(HIST("tracks/h2TPCsignVsTPCmomentum"), track.tpcInnerParam() / (1.f * track.sign()), track.tpcSignal()); + if constexpr (!IsFilteredData) { - if (nsigmaITSvar.showAverageClusterSize) { + if (nsigmaITSvar.showAverageClusterSize && enablePIDplot) { histos.fill(HIST("tracks/averageClusterSize"), track.p(), averageClusterSizeTrk(track)); histos.fill(HIST("tracks/averageClusterSizePerCoslInv"), track.p(), averageClusterSizePerCoslInv(track)); } @@ -4249,22 +4307,24 @@ struct LFNucleiBATask { } } - if (outFlagOptions.enableBetaCut && (track.beta() > betaCut)) + if (outFlagOptions.enableBetaCut && (track.beta() > betaCut) && enablePIDplot) histos.fill(HIST("tracks/h2TOFbetaVsP_BetaCut"), track.p() / (1.f * track.sign()), track.beta()); - switch (useHasTRDConfig) { - case 0: - histos.fill(HIST("tracks/h2TOFbetaVsP"), track.p() / (1.f * track.sign()), track.beta()); - break; - case 1: - if (track.hasTRD()) { - histos.fill(HIST("tracks/h2TOFbetaVsP"), track.p() / (1.f * track.sign()), track.beta()); - } - break; - case 2: - if (!track.hasTRD()) { + if (enablePIDplot) { + switch (useHasTRDConfig) { + case 0: histos.fill(HIST("tracks/h2TOFbetaVsP"), track.p() / (1.f * track.sign()), track.beta()); - } - break; + break; + case 1: + if (track.hasTRD()) { + histos.fill(HIST("tracks/h2TOFbetaVsP"), track.p() / (1.f * track.sign()), track.beta()); + } + break; + case 2: + if (!track.hasTRD()) { + histos.fill(HIST("tracks/h2TOFbetaVsP"), track.p() / (1.f * track.sign()), track.beta()); + } + break; + } } if (enablePtSpectra) @@ -4419,7 +4479,7 @@ struct LFNucleiBATask { massTOFantihe = antiheP * std::sqrt(1.f / (track.beta() * track.beta()) - 1.f); break; } - if (passDCAxyzCut) + if (passDCAxyzCut && outFlagOptions.doTOFplots && enablePIDplot) histos.fill(HIST("tracks/h2TPCsignVsBetaGamma"), (track.beta() * gamma) / (1.f * track.sign()), track.tpcSignal()); } else { massTOF = -99.f; @@ -4428,7 +4488,8 @@ struct LFNucleiBATask { } if (passDCAxyzCut) { - histos.fill(HIST("tracks/h2TOFmassVsPt"), massTOF, track.pt()); + if (enablePIDplot) + histos.fill(HIST("tracks/h2TOFmassVsPt"), massTOF, track.pt()); if (enableEvTimeSplitting) { if (track.isEvTimeTOF() && track.isEvTimeT0AC()) { evtimeHistos.fill(HIST("tracks/evtime/ft0tof/h2TOFmassVsPt"), massTOF, track.pt()); @@ -5560,7 +5621,8 @@ struct LFNucleiBATask { // Process function that runs on the original AO2D void processData(EventCandidates::iterator const& event, - TrackCandidates const& tracks) + TrackCandidates const& tracks, + o2::aod::BCsWithTimestamps const&) { fillHistograms(event, tracks, true /*dummy*/); } @@ -5568,7 +5630,8 @@ struct LFNucleiBATask { // Process function that runs on the original AO2D void processDataLfPid(EventCandidates::iterator const& event, - TrackCandidatesLfPid const& tracks) + TrackCandidatesLfPid const& tracks, + o2::aod::BCsWithTimestamps const&) { fillHistograms(event, tracks, true /*dummy*/); } @@ -5576,7 +5639,8 @@ struct LFNucleiBATask { // Process function that runs on the filtered data void processDataFiltered(o2::aod::LfNuclEvents::iterator const& event, - o2::aod::LfCandNucleusFull const& tracks) + o2::aod::LfCandNucleusFull const& tracks, + o2::aod::BCsWithTimestamps const&) { // Runs on data filtered on the fly with LF Tree creator nuclei task // Takes as input full AO2Ds @@ -5585,7 +5649,8 @@ struct LFNucleiBATask { PROCESS_SWITCH(LFNucleiBATask, processDataFiltered, "process data on the filtered data", false); void processDataLight(o2::aod::LfNuclEvents::iterator const& event, - o2::aod::LfCandNucleusDummy const& tracks) + o2::aod::LfCandNucleusDummy const& tracks, + o2::aod::BCsWithTimestamps const&) { // Runs on derived tables produced with LF Tree creator nuclei task // Takes as input derived trees @@ -5600,7 +5665,8 @@ struct LFNucleiBATask { // Process function that runs on the original AO2D (for the MC) void processMCReco(EventCandidatesMC::iterator const& event, soa::Join const& tracks, - aod::McParticles const& mcParticles) + aod::McParticles const& mcParticles, + o2::aod::BCsWithTimestamps const&) { fillHistograms(event, tracks, mcParticles); } // CLOSING PROCESS MC RECO @@ -5609,7 +5675,8 @@ struct LFNucleiBATask { // Process function that runs on the original AO2D (for the MC) with the LfPIDcalibration void processMCRecoLfPid(EventCandidatesMC::iterator const& event, soa::Join const& tracks, - aod::McParticles const& mcParticles) + aod::McParticles const& mcParticles, + o2::aod::BCsWithTimestamps const&) { fillHistograms(event, tracks, mcParticles); } // CLOSING PROCESS MC RECO @@ -5730,14 +5797,16 @@ struct LFNucleiBATask { // Process function that runs on the filtered AO2D (for the MC) void processMCRecoFiltered(o2::aod::LfNuclEvents::iterator const& event, - soa::Join const& tracks) + soa::Join const& tracks, + o2::aod::BCsWithTimestamps const&) { fillHistograms(event, tracks, true /*dummy*/); } // CLOSING PROCESS MC RECO ON FILTERED DATA PROCESS_SWITCH(LFNucleiBATask, processMCRecoFiltered, "process mc reco on the filtered data", false); void processMCRecoFilteredLight(o2::aod::LfNuclEvents::iterator const& event, - soa::Join const& tracks) + soa::Join const& tracks, + o2::aod::BCsWithTimestamps const&) { fillHistograms(event, tracks, true /*dummy*/); } // CLOSING PROCESS MC RECO ON FILTERED DATA From cb9e8be36e483a5ecd16062dc74aea636bc7727b Mon Sep 17 00:00:00 2001 From: sangwoo <141385263+sangwoo184@users.noreply.github.com> Date: Wed, 26 Feb 2025 12:55:39 +0900 Subject: [PATCH 0423/1650] [PWGLF] Add Rotational background method (#10159) Co-authored-by: sangwoo --- PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx | 129 +++++++++++-------- 1 file changed, 78 insertions(+), 51 deletions(-) diff --git a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx index 97af68572b8..fe6b08d9e19 100644 --- a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx +++ b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx @@ -9,6 +9,8 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +/// \file f0980pbpbanalysis.cxx +/// \brief f0980 resonance analysis in PbPb collisions /// \author Junlee Kim (jikim1290@gmail.com) #include @@ -16,7 +18,7 @@ #include #include #include -#include +// #include #include #include "TLorentzVector.h" @@ -73,11 +75,11 @@ struct f0980pbpbanalysis { o2::ccdb::CcdbApi ccdbApi; Configurable cfgURL{"cfgURL", "http://alice-ccdb.cern.ch", "Address of the CCDB to browse"}; - Configurable nolaterthan{"ccdb-no-later-than", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "Latest acceptable timestamp of creation for the object"}; + Configurable ccdbNoLaterThan{"ccdbNoLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "Latest acceptable timestamp of creation for the object"}; Configurable cfgCutVertex{"cfgCutVertex", 10.0, "PV selection"}; Configurable cfgQvecSel{"cfgQvecSel", true, "Reject events when no QVector"}; - Configurable cfgOccupancySel{"cfgOccupancySe", false, "Occupancy selection"}; + Configurable cfgOccupancySel{"cfgOccupancySel", false, "Occupancy selection"}; Configurable cfgMaxOccupancy{"cfgMaxOccupancy", 999999, "maximum occupancy of tracks in neighbouring collisions in a given time range"}; Configurable cfgMinOccupancy{"cfgMinOccupancy", -100, "maximum occupancy of tracks in neighbouring collisions in a given time range"}; Configurable cfgNCollinTR{"cfgNCollinTR", false, "Additional selection for the number of coll in time range"}; @@ -105,7 +107,7 @@ struct f0980pbpbanalysis { Configurable cMaxTPCnSigmaPion{"cMaxTPCnSigmaPion", 5.0, "TPC nSigma cut for Pion"}; // TPC Configurable cMaxTPCnSigmaPionS{"cMaxTPCnSigmaPionS", 3.0, "TPC nSigma cut for Pion as a standalone"}; Configurable cfgUSETOF{"cfgUSETOF", false, "TPC usage"}; - Configurable SelectType{"SelectType", 0, "PID selection type"}; + Configurable cfgSelectType{"cfgSelectType", 0, "PID selection type"}; Configurable cfgnMods{"cfgnMods", 1, "The number of modulations of interest starting from 2"}; Configurable cfgNQvec{"cfgNQvec", 7, "The number of total Qvectors for looping over the task"}; @@ -114,6 +116,9 @@ struct f0980pbpbanalysis { Configurable cfgQvecRefAName{"cfgQvecRefAName", "TPCpos", "The name of detector for reference A"}; Configurable cfgQvecRefBName{"cfgQvecRefBName", "TPCneg", "The name of detector for reference B"}; + Configurable cfgRotBkg{"cfgRotBkg", true, "flag to construct rotational backgrounds"}; + Configurable cfgNRotBkg{"cfgNRotBkg", 10, "the number of rotational backgrounds"}; + ConfigurableAxis massAxis{"massAxis", {400, 0.2, 2.2}, "Invariant mass axis"}; ConfigurableAxis ptAxis{"ptAxis", {VARIABLE_WIDTH, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0, 10.0, 13.0, 20.0}, "Transverse momentum Binning"}; ConfigurableAxis centAxis{"centAxis", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 100}, "Centrality interval"}; @@ -121,30 +126,34 @@ struct f0980pbpbanalysis { TF1* fMultPVCutLow = nullptr; TF1* fMultPVCutHigh = nullptr; - int DetId; - int RefAId; - int RefBId; + int detId; + int refAId; + int refBId; - int QvecDetInd; - int QvecRefAInd; - int QvecRefBInd; + int qVecDetInd; + int qVecRefAInd; + int qVecRefBInd; float centrality; double angle; double relPhi; + double relPhiRot; double massPi = o2::constants::physics::MassPionCharged; + TRandom* rn = new TRandom(); + // float theta2; + Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; Filter acceptanceFilter = (nabs(aod::track::eta) < cfgMaxEta && nabs(aod::track::pt) > cfgMinPt); - Filter DCAcutFilter = (nabs(aod::track::dcaXY) < cfgMaxDCArToPVcut) && (nabs(aod::track::dcaZ) < cfgMaxDCAzToPVcut); + Filter cutDCAFilter = (nabs(aod::track::dcaXY) < cfgMaxDCArToPVcut) && (nabs(aod::track::dcaZ) < cfgMaxDCAzToPVcut); using EventCandidates = soa::Filtered>; using TrackCandidates = soa::Filtered>; template - int GetDetId(const T& name) + int getDetId(const T& name) { if (name.value == "FT0C") { return 0; @@ -188,7 +197,7 @@ struct f0980pbpbanalysis { if (!collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { return 0; } - if (cfgQvecSel && (collision.qvecAmp()[DetId] < 1e-4 || collision.qvecAmp()[RefAId] < 1e-4 || collision.qvecAmp()[RefAId] < 1e-4)) { + if (cfgQvecSel && (collision.qvecAmp()[detId] < 1e-4 || collision.qvecAmp()[refAId] < 1e-4 || collision.qvecAmp()[refAId] < 1e-4)) { return 0; } if (cfgOccupancySel && (collision.trackOccupancyInTimeRange() > cfgMaxOccupancy || collision.trackOccupancyInTimeRange() < cfgMinOccupancy)) { @@ -239,9 +248,9 @@ struct f0980pbpbanalysis { } template - bool PIDSelected(const TrackType track) + bool selectionPID(const TrackType track) { - if (SelectType == 0) { + if (cfgSelectType == 0) { if (cfgUSETOF) { if (std::fabs(track.tofNSigmaPi()) > cMaxTOFnSigmaPion) { return 0; @@ -254,7 +263,7 @@ struct f0980pbpbanalysis { return 0; } } - if (SelectType == 1) { + if (cfgSelectType == 1) { if (cfgUSETOF) { if (track.hasTOF()) { if (std::fabs(track.tofNSigmaPi()) > cMaxTOFnSigmaPion) { @@ -279,37 +288,43 @@ struct f0980pbpbanalysis { } template - void FillHistograms(const CollisionType& collision, + void fillHistograms(const CollisionType& collision, const TracksType& dTracks, int nmode) { - QvecDetInd = DetId * 4 + 3 + (nmode - 2) * cfgNQvec * 4; - QvecRefAInd = RefAId * 4 + 3 + (nmode - 2) * cfgNQvec * 4; - QvecRefBInd = RefBId * 4 + 3 + (nmode - 2) * cfgNQvec * 4; + qVecDetInd = detId * 4 + 3 + (nmode - 2) * cfgNQvec * 4; + qVecRefAInd = refAId * 4 + 3 + (nmode - 2) * cfgNQvec * 4; + qVecRefBInd = refBId * 4 + 3 + (nmode - 2) * cfgNQvec * 4; - double eventPlaneDet = TMath::ATan2(collision.qvecIm()[QvecDetInd], collision.qvecRe()[QvecDetInd]) / static_cast(nmode); - double eventPlaneRefA = TMath::ATan2(collision.qvecIm()[QvecRefAInd], collision.qvecRe()[QvecRefAInd]) / static_cast(nmode); - double eventPlaneRefB = TMath::ATan2(collision.qvecIm()[QvecRefBInd], collision.qvecRe()[QvecRefBInd]) / static_cast(nmode); + double eventPlaneDet = std::atan2(collision.qvecIm()[qVecDetInd], collision.qvecRe()[qVecDetInd]) / static_cast(nmode); + double eventPlaneRefA = std::atan2(collision.qvecIm()[qVecRefAInd], collision.qvecRe()[qVecRefAInd]) / static_cast(nmode); + double eventPlaneRefB = std::atan2(collision.qvecIm()[qVecRefBInd], collision.qvecRe()[qVecRefBInd]) / static_cast(nmode); histos.fill(HIST("QA/EPhist"), centrality, eventPlaneDet); - histos.fill(HIST("QA/EPResAB"), centrality, TMath::Cos(static_cast(nmode) * (eventPlaneDet - eventPlaneRefA))); - histos.fill(HIST("QA/EPResAC"), centrality, TMath::Cos(static_cast(nmode) * (eventPlaneDet - eventPlaneRefB))); - histos.fill(HIST("QA/EPResBC"), centrality, TMath::Cos(static_cast(nmode) * (eventPlaneRefA - eventPlaneRefB))); + histos.fill(HIST("QA/EPResAB"), centrality, std::cos(static_cast(nmode) * (eventPlaneDet - eventPlaneRefA))); + histos.fill(HIST("QA/EPResAC"), centrality, std::cos(static_cast(nmode) * (eventPlaneDet - eventPlaneRefB))); + histos.fill(HIST("QA/EPResBC"), centrality, std::cos(static_cast(nmode) * (eventPlaneRefA - eventPlaneRefB))); + + TLorentzVector pion1, pion2, pion2Rot, reco, recoRot; + for (const auto& trk1 : dTracks) { + if (!trackSelected(trk1)) { + continue; + } - TLorentzVector Pion1, Pion2, Reco; - for (auto& trk1 : dTracks) { - if (!trackSelected(trk1)) + if (!selectionPID(trk1)) { continue; + } + histos.fill(HIST("QA/Nsigma_TPC"), trk1.pt(), trk1.tpcNSigmaPi()); histos.fill(HIST("QA/Nsigma_TOF"), trk1.pt(), trk1.tofNSigmaPi()); histos.fill(HIST("QA/TPC_TOF"), trk1.tpcNSigmaPi(), trk1.tofNSigmaPi()); - for (auto& trk2 : dTracks) { - if (!trackSelected(trk1) || !trackSelected(trk2)) { + for (const auto& trk2 : dTracks) { + if (!trackSelected(trk2)) { continue; } // PID - if (!PIDSelected(trk1) || !PIDSelected(trk2)) { + if (!selectionPID(trk2)) { continue; } @@ -319,22 +334,33 @@ struct f0980pbpbanalysis { histos.fill(HIST("QA/TPC_TOF_selected"), trk1.tpcNSigmaPi(), trk1.tofNSigmaPi()); } - Pion1.SetXYZM(trk1.px(), trk1.py(), trk1.pz(), massPi); - Pion2.SetXYZM(trk2.px(), trk2.py(), trk2.pz(), massPi); - Reco = Pion1 + Pion2; + pion1.SetXYZM(trk1.px(), trk1.py(), trk1.pz(), massPi); + pion2.SetXYZM(trk2.px(), trk2.py(), trk2.pz(), massPi); + reco = pion1 + pion2; - if (Reco.Rapidity() > cfgMaxRap || Reco.Rapidity() < cfgMinRap) { + if (reco.Rapidity() > cfgMaxRap || reco.Rapidity() < cfgMinRap) { continue; } - relPhi = TVector2::Phi_0_2pi((Reco.Phi() - eventPlaneDet) * static_cast(nmode)); + relPhi = TVector2::Phi_0_2pi((reco.Phi() - eventPlaneDet) * static_cast(nmode)); if (trk1.sign() * trk2.sign() < 0) { - histos.fill(HIST("hInvMass_f0980_US_EPA"), Reco.M(), Reco.Pt(), centrality, relPhi); + histos.fill(HIST("hInvMass_f0980_US_EPA"), reco.M(), reco.Pt(), centrality, relPhi); } else if (trk1.sign() > 0 && trk2.sign() > 0) { - histos.fill(HIST("hInvMass_f0980_LSpp_EPA"), Reco.M(), Reco.Pt(), centrality, relPhi); + histos.fill(HIST("hInvMass_f0980_LSpp_EPA"), reco.M(), reco.Pt(), centrality, relPhi); } else if (trk1.sign() < 0 && trk2.sign() < 0) { - histos.fill(HIST("hInvMass_f0980_LSmm_EPA"), Reco.M(), Reco.Pt(), centrality, relPhi); + histos.fill(HIST("hInvMass_f0980_LSmm_EPA"), reco.M(), reco.Pt(), centrality, relPhi); + } + + if (cfgRotBkg && trk1.sign() * trk2.sign() < 0) { + for (int nr = 0; nr < cfgNRotBkg; nr++) { + auto randomPhi = rn->Uniform(o2::constants::math::PI * 5.0 / 6.0, o2::constants::math::PI * 7.0 / 6.0); + randomPhi += pion2.Phi(); + pion2Rot.SetXYZM(pion2.Pt() * std::cos(randomPhi), pion2.Pt() * std::sin(randomPhi), trk2.pz(), massPi); + recoRot = pion1 + pion2Rot; + relPhiRot = TVector2::Phi_0_2pi((recoRot.Phi() - eventPlaneDet) * static_cast(nmode)); + histos.fill(HIST("hInvMass_f0980_USRot_EPA"), recoRot.M(), recoRot.Pt(), centrality, relPhiRot); + } } } } @@ -342,12 +368,12 @@ struct f0980pbpbanalysis { void init(o2::framework::InitContext&) { - AxisSpec epAxis = {6, 0.0, 2.0 * constants::math::PI}; + AxisSpec epAxis = {6, 0.0, 2.0 * o2::constants::math::PI}; AxisSpec centQaAxis = {110, 0, 110}; AxisSpec vzQaAxis = {100, -20, 20}; AxisSpec PIDqaAxis = {100, -10, 10}; AxisSpec pTqaAxis = {200, 0, 20}; - AxisSpec epQaAxis = {100, -1.0 * constants::math::PI, constants::math::PI}; + AxisSpec epQaAxis = {100, -1.0 * o2::constants::math::PI, o2::constants::math::PI}; AxisSpec epresAxis = {102, -1.02, 1.02}; histos.add("QA/CentDist", "", {HistType::kTH1F, {centQaAxis}}); @@ -372,21 +398,22 @@ struct f0980pbpbanalysis { {HistType::kTHnSparseF, {massAxis, ptAxis, centAxis, epAxis}}); histos.add("hInvMass_f0980_LSmm_EPA", "-- invariant mass", {HistType::kTHnSparseF, {massAxis, ptAxis, centAxis, epAxis}}); - + histos.add("hInvMass_f0980_USRot_EPA", "unlike invariant mass Rotation", + {HistType::kTHnSparseF, {massAxis, ptAxis, centAxis, epAxis}}); // if (doprocessMCLight) { // histos.add("MCL/hpT_f0980_GEN", "generated f0 signals", HistType::kTH1F, {pTqaAxis}); // histos.add("MCL/hpT_f0980_REC", "reconstructed f0 signals", HistType::kTH3F, {massAxis, pTqaAxis, centAxis}); // } - DetId = GetDetId(cfgQvecDetName); - RefAId = GetDetId(cfgQvecRefAName); - RefBId = GetDetId(cfgQvecRefBName); + detId = getDetId(cfgQvecDetName); + refAId = getDetId(cfgQvecRefAName); + refBId = getDetId(cfgQvecRefBName); - if (DetId == RefAId || DetId == RefBId || RefAId == RefBId) { + if (detId == refAId || detId == refBId || refAId == refBId) { LOGF(info, "Wrong detector configuration \n The FT0C will be used to get Q-Vector \n The TPCpos and TPCneg will be used as reference systems"); - DetId = 0; - RefAId = 4; - RefBId = 5; + detId = 0; + refAId = 4; + refBId = 5; } fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x - 2.5*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); @@ -415,7 +442,7 @@ struct f0980pbpbanalysis { histos.fill(HIST("QA/CentDist"), centrality, 1.0); histos.fill(HIST("QA/Vz"), collision.posZ(), 1.0); - FillHistograms(collision, tracks, 2); // second order + fillHistograms(collision, tracks, 2); // second order }; PROCESS_SWITCH(f0980pbpbanalysis, processData, "Process Event for data", true); }; From f7e9469e0b5da6a6af95e810e69ce2e4a298ea28 Mon Sep 17 00:00:00 2001 From: omvazque Date: Tue, 25 Feb 2025 23:32:38 -0600 Subject: [PATCH 0424/1650] [PWGLF] Adds pt correlations V5 (#10196) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 271 +++++++++++++------ 1 file changed, 187 insertions(+), 84 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index 5d163088962..352fc29103c 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -15,9 +15,15 @@ /// \author Omar Vazquez (omar.vazquez.rueda@cern.ch) /// \since January 29, 2025 +#include + +#include #include +#include #include #include +#include +#include #include "Common/CCDB/EventSelectionParams.h" #include "Common/CCDB/TriggerAliases.h" @@ -53,8 +59,8 @@ using ColEvSels = o2::aod::CentFT0Cs, aod::TPCMults, o2::aod::BarrelMults>; using BCsRun3 = soa::Join; -using TracksSel = - soa::Join; +using TracksSel = soa::Join; using SimCollisions = soa::Join; using SimTracks = soa::Join minT0CcentCut{"minT0CcentCut", 0.0, "Min T0C Cent. cut"}; Configurable maxT0CcentCut{"maxT0CcentCut", 90.0, "Max T0C Cent. cut"}; - // Track selection settings - // Configurable minItsNclusters{"minItsNclusters", 5, - // "minimum number of ITS clusters"}; - // Configurable minTpcNclusters{"minTpcNclusters", 70, - // "minimum number of TPC clusters"}; - // Configurable minTpcNcrossedRows{ - // "minTpcNcrossedRows", 70, "minimum number of TPC crossed pad rows"}; - // Configurable maxChiSquareTpc{"maxChiSquareTpc", 4.0, - // "maximum TPC chi^2/Ncls"}; - // Configurable maxChiSquareIts{"maxChiSquareIts", 36.0, - // "maximum ITS chi^2/Ncls"}; - Configurable minPt{"minPt", 0.1, "minimum pt of the tracks"}; - Configurable maxPt{"maxPt", 50., "maximum pt of the tracks"}; - Configurable minEta{"minEta", -0.8, "minimum eta"}; - Configurable maxEta{"maxEta", +0.8, "maximum eta"}; - // Configurable maxDcaxy{"maxDcaxy", 0.05, "Maximum DCAxy"}; - // Configurable maxDcaz{"maxDcaz", 0.05, "Maximum DCAz"}; - // Configurable setDCAselectionPtDep{"setDCAselectionPtDep", true, - // "require pt dependent selection"}; - // Configurable par0{"par0", 0.0105, "par 0"}; - // Configurable par1{"par1", 0.035, "par 1"}; + Configurable minPt{"minPt", 0.1, "minimum pt of the tracks"}; + Configurable maxPt{"maxPt", 50., "maximum pt of the tracks"}; + Configurable minEta{"minEta", -0.8, "minimum eta"}; + Configurable maxEta{"maxEta", +0.8, "maximum eta"}; + // Configurables, binning - Configurable nBinsAmpFV0{"nBinsAmpFV0", 1000, "N bins FV0 amp"}; - Configurable maxAmpFV0{"maxAmpFV0", 3000, "Max FV0 amp"}; - Configurable nBinsAmpFT0{"nBinsAmpFT0", 1000, "N bins FT0 amp"}; - Configurable maxAmpFT0{"maxAmpFT0", 3000, "Max FT0 amp"}; - Configurable nBinsNch{"nBinsNch", 2500, "N bins Nch (|eta|<0.8)"}; + Configurable nBinsAmpFV0{"nBinsAmpFV0", 100, "N bins FV0 amp"}; + Configurable maxAmpFV0{"maxAmpFV0", 2000, "Max FV0 amp"}; + Configurable nBinsAmpFT0{"nBinsAmpFT0", 100, "N bins FT0 amp"}; + Configurable maxAmpFT0{"maxAmpFT0", 2500, "Max FT0 amp"}; + Configurable nBinsNch{"nBinsNch", 2501, "N bins Nch (|eta|<0.8)"}; Configurable maxNch{"maxNch", 2500, "Max Nch (|eta|<0.8)"}; - Configurable nBinsZDC{"nBinsZDC", 1025, "nBinsZDC"}; + Configurable nBinsZDC{"nBinsZDC", 400, "nBinsZDC"}; Configurable nBinsZEM{"nBinsZEM", 100, "nBinsZEM"}; - Configurable maxZN{"maxZN", 4099.5, "Max ZN signal"}; - Configurable maxZP{"maxZP", 3099.5, "Max ZP signal"}; - Configurable maxZEM{"maxZEM", 3099.5, "Max ZEM signal"}; - Configurable nBinsTDC{"nBinsTDC", 480, "nbinsTDC"}; + Configurable maxZN{"maxZN", 150, "Max ZN signal"}; + Configurable maxZP{"maxZP", 60, "Max ZP signal"}; + Configurable maxZEM{"maxZEM", 2200, "Max ZEM signal"}; + Configurable nBinsTDC{"nBinsTDC", 150, "nbinsTDC"}; Configurable minTdc{"minTdc", -15.0, "minimum TDC"}; Configurable maxTdc{"maxTdc", 15.0, "maximum TDC"}; Configurable minMeanpT{"minMeanpT", 0.5, "minimum [pT]"}; Configurable maxMeanpT{"maxMeanpT", 1.1, "maximum [pT]"}; Configurable nBinsMeanpT{"nBinsMeanpT", 160, "# bins [pT]"}; - ConfigurableAxis binsPt{"binsPt", {VARIABLE_WIDTH, 0., 0.1, 0.25, 0.5, 1., 2., 4., 6., 8., 10., 20.}, "pT binning"}; + ConfigurableAxis binsPt{"binsPt", {VARIABLE_WIDTH, 0.0, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8, 5.0}, "pT binning"}; ConfigurableAxis binsCent{"binsCent", {VARIABLE_WIDTH, 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.}, "T0C binning"}; // Configurable event selectiond and flags ZDC @@ -126,8 +116,15 @@ struct UccZdc { Configurable isSumTowers{"isSumTowers", false, "Use sum of Tow ZDC?"}; Configurable isTDCcut{"isTDCcut", false, "Use TDC cut?"}; Configurable isZEMcut{"isZEMcut", true, "Use ZEM cut?"}; - Configurable zemCut{"zemCut", 1000.0, "ZEM cut"}; - Configurable tdcCut{"tdcCut", 1.0, "TDC cut"}; + + Configurable isZNbasedSel{"isZNbasedSel", false, "Use ZN based Sel."}; + Configurable isZN{"isZN", false, "Use ZN based Sel."}; + Configurable isZNA{"isZNA", false, "Use ZNA based Sel."}; + Configurable isZNC{"isZNC", false, "Use ZNC based Sel."}; + Configurable znBasedCut{"znBasedCut", 100, "ZN-based cut"}; + + Configurable zemCut{"zemCut", 1000., "ZEM cut"}; + Configurable tdcCut{"tdcCut", 1., "TDC cut"}; Configurable minOccCut{"minOccCut", 0, "min Occu cut"}; Configurable maxOccCut{"maxOccCut", 500, "max Occu cut"}; @@ -150,7 +147,11 @@ struct UccZdc { // Filters Filter collFilter = (nabs(aod::collision::posZ) < posZcut); - Filter trackFilter = (requireGlobalTrackInFilter()); + // Filter trackFilter = (requireGlobalTrackInFilter()); + Filter trackFilter = + ((aod::track::eta > minEta) && (aod::track::eta < maxEta) && + (aod::track::pt > minPt) && (aod::track::pt < maxPt) && + requireGlobalTrackInFilter()); // Apply Filters // using TheFilteredCollisions = soa::Filtered; @@ -169,6 +170,14 @@ struct UccZdc { true, true}; + Service ccdb; + Configurable paTH{"paTH", "Users/o/omvazque/TrackingEfficiency", "base path to the ccdb object"}; + Configurable uRl{"uRl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable noLaterThan{"noLaterThan", 1740173636328, "latest acceptable timestamp of creation for the object"}; + + // the efficiency has been previously stored in the CCDB as TH1F histogram + TH1F* efficiency = nullptr; + void init(InitContext const&) { // define axes you want to use @@ -204,42 +213,64 @@ struct UccZdc { if (doprocessZdcCollAss) { registry.add("EtaVsPhi", ";#eta;#varphi", kTH2F, {{{axisEta}, {100, -0.1 * PI, +2.1 * PI}}}); - registry.add("etaHistogram", "etaHistogram", kTH1F, {axisEta}); - registry.add("ptHistogram", "ptHistogram", kTH1F, {axisPt}); + registry.add("eta", ";;Entries;", kTH1F, {axisEta}); + registry.add("pt", ";;Entries;", kTH1F, {axisPt}); + registry.add("sigma1Pt", ";;#sigma(p_{T})/p_{T};", kTProfile, {axisPt}); + registry.add("pP1", + ";Nch;P_{1}=#Sigma_{evs} W^{(1)}_{e} [p_{T}^{(1)}]_{e};", + kTProfile, {{nBinsNch, -0.5, maxNch}}); + registry.add("pW1", ";Nch;W_{1}=#Sigma_{evs} W^{(1)}_{e};", kTProfile, + {{nBinsNch, -0.5, maxNch}}); + registry.add("pP2", + ";Nch;P_{2}=#Sigma_{evs} W^{(2)}_{e} [p_{T}^{(2)}]_{e};", + kTProfile, {{nBinsNch, -0.5, maxNch}}); + registry.add("pW2", ";Nch;W_{2}=#Sigma_{evs} W^{(2)}_{e};", kTProfile, + {{nBinsNch, -0.5, maxNch}}); + registry.add("pP3", + ";Nch;P_{3}=#Sigma_{evs} W^{(3)}_{e} [p_{T}^{(3)}]_{e};", + kTProfile, {{nBinsNch, -0.5, maxNch}}); + registry.add("pW3", ";Nch;W_{3}=#Sigma_{evs} W^{(3)}_{e};", kTProfile, + {{nBinsNch, -0.5, maxNch}}); + registry.add("pP4", + ";Nch;P_{4}=#Sigma_{evs} W^{(4)}_{e} [p_{T}^{(4)}]_{e};", + kTProfile, {{nBinsNch, -0.5, maxNch}}); + registry.add("pW4", ";Nch;W_{4}=#Sigma_{evs} W^{(4)}_{e};", kTProfile, + {{nBinsNch, -0.5, maxNch}}); registry.add("dcaXYvspT", "", kTH2F, {{{50, -1., 1.}, {axisPt}}}); registry.add("T0Ccent", ";T0C centrality;Entries", kTH1F, {axisCent}); registry.add("Nch", ";Nch (|#eta|<0.8);", kTH1F, {{nBinsNch, -0.5, maxNch}}); + registry.add("ZN", "", kTH1F, {{nBinsZDC, -0.5, maxZN}}); registry.add("ZNA", "", kTH1F, {{nBinsZDC, -0.5, maxZN}}); registry.add("ZPA", "", kTH1F, {{nBinsZDC, -0.5, maxZP}}); registry.add("ZNC", "", kTH1F, {{nBinsZDC, -0.5, maxZN}}); registry.add("ZPC", "", kTH1F, {{nBinsZDC, -0.5, maxZP}}); registry.add("ZNvsZEM", "ZNvsZEM; ZEM; ZNA+ZNC", kTH2F, - {{{nBinsZDC, -0.5, maxZEM}, {nBinsZEM, -0.5, maxZN}}}); + {{{60, -0.5, maxZEM}, {60, -0.5, maxZN}}}); registry.add("ZNAvsZNC", "ZNAvsZNC; ZNC; ZNA", kTH2F, - {{{nBinsZDC, -0.5, maxZN}, {nBinsZDC, -0.5, maxZN}}}); + {{{30, -0.5, maxZN}, {30, -0.5, maxZN}}}); registry.add("ZPAvsZPC", "ZPAvsZPC; ZPA; ZPC", kTH2F, - {{{nBinsZDC, -0.5, maxZP}, {nBinsZDC, -0.5, maxZP}}}); + {{{100, -0.5, maxZP}, {100, -0.5, maxZP}}}); registry.add("ZNAvsZPA", "ZNAvsZPA; ZPA; ZNA", kTH2F, - {{{nBinsZDC, -0.5, maxZP}, {nBinsZDC, -0.5, maxZN}}}); + {{{20, -0.5, maxZP}, {30, -0.5, maxZN}}}); registry.add("ZNCvsZPC", "ZNCvsZPC; ZPC; ZNC", kTH2F, - {{{nBinsZDC, -0.5, maxZP}, {nBinsZDC, -0.5, maxZN}}}); + {{{20, -0.5, maxZP}, {30, -0.5, maxZN}}}); registry.add("ZNCvstdc", "ZNCvstdc; time ZNC; ZNC", kTH2F, - {{{nBinsTDC, minTdc, maxTdc}, {nBinsZDC, -0.5, maxZN}}}); + {{{30, -15., 15.}, {nBinsZDC, -0.5, maxZN}}}); registry.add("ZNAvstdc", "ZNAvstdc; time ZNA; ZNA", kTH2F, - {{{nBinsTDC, minTdc, maxTdc}, {nBinsZDC, -0.5, maxZN}}}); + {{{30, -15., 15.}, {30, -0.5, maxZN}}}); registry.add("ZPCvstdc", "ZPCvstdc; time ZPC; ZPC", kTH2F, - {{{nBinsTDC, minTdc, maxTdc}, {nBinsZDC, -0.5, maxZP}}}); + {{{30, -15., 15}, {20, -0.5, maxZP}}}); registry.add("ZPAvstdc", "ZPAvstdc; time ZPA; ZPA", kTH2F, - {{{nBinsTDC, minTdc, maxTdc}, {nBinsZDC, -0.5, maxZP}}}); + {{{30, -15., 15.}, {20, -0.5, maxZP}}}); registry.add("ZEM1vstdc", "ZEM1vstdc; time ZEM1; ZEM1", kTH2F, - {{{nBinsTDC, minTdc, maxTdc}, {nBinsZEM, -0.5, maxZEM}}}); + {{{30, -15., 15.}, {30, -0.5, 2000.5}}}); registry.add("ZEM2vstdc", "ZEM2vstdc; time ZEM2; ZEM2", kTH2F, - {{{nBinsTDC, minTdc, maxTdc}, {nBinsZEM, -0.5, maxZEM}}}); + {{{30, -15., 15.}, {30, -0.5, 2000.5}}}); registry.add("debunch", ";t_{ZDC}-t_{ZDA};t_{ZDC}+t_{ZDA}", kTH2F, {{{nBinsTDC, minTdc, maxTdc}, {nBinsTDC, minTdc, maxTdc}}}); registry.add("NchvsFT0C", ";T0C;N_{ch} (|#eta|<0.8);", kTH2F, - {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsNch, -0.5, maxNch}}}); + {{{nBinsAmpFT0, 0., 950.}, {nBinsNch, -0.5, maxNch}}}); registry.add("NchvsFT0A", ";T0A;N_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsNch, -0.5, maxNch}}}); registry.add("NchvsFV0A", ";V0A;N_{ch} (|#eta|<0.8);", kTH2F, @@ -251,14 +282,12 @@ struct UccZdc { {{{nBinsNch, -0.5, maxNch}, {nBinsZDC, -0.5, maxZN}}}); registry.add("ZNAvsNch", ";Nch (|#eta|<0.8);ZNA", kTH2F, {{{nBinsNch, -0.5, maxNch}, {nBinsZDC, -0.5, maxZN}}}); - registry.add("ZNCvsNchvspT", ";Nch (|#eta|<0.8);ZNC;[p_{T}]", kTH3F, - {{{nBinsNch, -0.5, maxNch}, - {nBinsZDC, -0.5, maxZN}, - {nBinsMeanpT, minMeanpT, maxMeanpT}}}); - registry.add("ZNAvsNchvspT", ";Nch (|#eta|<0.8);ZNA;[p_{T}]", kTH3F, - {{{nBinsNch, -0.5, maxNch}, - {nBinsZDC, -0.5, maxZN}, - {nBinsMeanpT, minMeanpT, maxMeanpT}}}); + registry.add("ZNvsNch", ";Nch (|#eta|<0.8);ZNA+ZNC", kTH2F, + {{{nBinsNch, -0.5, maxNch}, {nBinsZDC, -0.5, maxZN}}}); + registry.add("NchvsOneParCorr", ";Nch (|#eta|<0.8);[p_{T}]=(#Sigma w_{i} p_{T}^{i})/(#Sigma w_{i})", kTH2F, {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); + registry.add("NchvsTwoParCorr", ";Nch (|#eta|<0.8);[p_{T}^{2}]=(P_{1}^{2} - P_{2})/(W_{1}^{2} - W_{2})", kTH2F, {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); + registry.add("NchvsThreeParCorr", ";Nch (|#eta|<0.8);[p_{T}^{3}]=(P_{1}^{3} - 3P_{2}P_{1} + 2P_{3})/(W_{1}^{3} - 3W_{2}W_{1} + 2W_{3})", kTH2F, {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); + registry.add("NchvsFourParCorr", ";Nch (|#eta|<0.8);[p_{T}^{4}]", kTH2F, {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); } // MC Histograms @@ -297,6 +326,19 @@ struct UccZdc { registry.add("Pt_MC_tru_re", "Remaining ch particles;p_{T};Entries;", kTH1F, {axisPt}); } + + ccdb->setURL(uRl.value); + // Enabling object caching, otherwise each call goes to the CCDB server + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + // Not later than now, will be replaced by the value of the train creation + // This avoids that users can replace objects **while** a train is running + ccdb->setCreatedNotAfter(noLaterThan.value); + LOGF(info, "Getting object %s", paTH.value.data()); + efficiency = ccdb->getForTimeStamp(paTH.value, noLaterThan); + if (!efficiency) { + LOGF(fatal, "Efficiency object not found!"); + } } template @@ -440,6 +482,10 @@ struct UccZdc { zpA = -999.; zpC = -999.; } + znA /= 2.81; + znC /= 2.81; + zpA /= 2.81; + zpC /= 2.81; sumZNs = znA + znC; sumZEMs = aZEM1 + aZEM2; @@ -481,6 +527,7 @@ struct UccZdc { registry.fill(HIST("hEventCounter"), EvCutLabel::Zem); registry.fill(HIST("zPos"), collision.posZ()); registry.fill(HIST("T0Ccent"), collision.centFT0C()); + registry.fill(HIST("ZN"), znA + znC); registry.fill(HIST("ZNA"), znA); registry.fill(HIST("ZNC"), znC); registry.fill(HIST("ZPA"), zpA); @@ -498,40 +545,56 @@ struct UccZdc { registry.fill(HIST("ZEM2vstdc"), tZEM2, aZEM2); registry.fill(HIST("debunch"), tZDCdif, tZDCsum); - float p1{0.0}; - // float p2{0.0}; - float oneParCorr{0.0}; - // float twoParCorr{0.0}; - const int64_t nch{tracks.size()}; + std::vector pTs; + std::vector wIs; + + // Calculates the event weight, W_k for (const auto& track : tracks) { // Track Selection if (!track.isGlobalTrack()) { continue; } - // if (track.eta() < minEta || track.eta() > maxEta) { - // continue; - // } - // if (track.pt() < minPt || track.pt() > maxPt) { - // continue; - // } - - float pt{track.pt()}; - p1 += pt; - // p2 += std::pow(pt, 2.); registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); - registry.fill(HIST("etaHistogram"), track.eta()); - registry.fill(HIST("ptHistogram"), track.pt()); + registry.fill(HIST("eta"), track.eta()); + registry.fill(HIST("pt"), track.pt()); + registry.fill(HIST("sigma1Pt"), track.pt(), track.sigma1Pt()); registry.fill(HIST("dcaXYvspT"), track.dcaXY(), track.pt()); - } - oneParCorr = p1; - // twoParCorr = std::pow(p1, 2.) - p2; - // std::cout << "twoParCorr= " << twoParCorr << '\n'; + float pt{track.pt()}; + double trkEff{efficiency->GetBinContent(efficiency->FindBin(pt))}; + if (trkEff > 0.) { + pTs.push_back(pt); + wIs.push_back(trkEff); + } + } - if (nch > 0) { - oneParCorr /= nch; + double p1, p2, p3, p4, w1, w2, w3, w4; + p1 = p2 = p3 = p4 = w1 = w2 = w3 = w4 = 0.0; + getMoments(pTs, wIs, p1, w1, p2, w2, p3, w3, p4, w4); + const double nch{static_cast(pTs.size())}; + if (std::isnan(p1) || std::isnan(p2) || std::isnan(p3) || std::isnan(p4) || + p1 == 0.0 || p2 == 0.0 || p3 == 0.0 || p4 == 0.0) { + return; } + if (std::isnan(w1) || std::isnan(w2) || std::isnan(w3) || std::isnan(w4) || + w1 == 0.0 || w2 == 0.0 || w3 == 0.0 || w4 == 0.0) { + return; + } + + // oneParCorr = P1 / W1 + double oneParCorr{p1 / w1}; + // twoParCorr = (P1^{2} - P2)/(W1^{2} - W2) + double twoParCorr{(std::pow(p1, 2.) - p2) / (std::pow(w1, 2.) - w2)}; + // threeParCorr = (P1^{3} − 3P2P1 + 2P3)/(W1^{3} − 3W2W1 + 2W3) + double threeParCorr{(std::pow(p1, 3.) - 3. * p2 * p1 + 2. * p3) / + (std::pow(w1, 3.) - 3. * w2 * w1 + 2. * w3)}; + // fourParCorr = (P1^{4} − 6P2P1^{2} + 3P2^{2} + 8P3P1 − 6P4)/(W1^{4} − + // 6W2W1^{2} + 3W2^{2} + 8W3W1 − 6W4) + double fourParCorr{(std::pow(p1, 4.) - 6. * p2 * std::pow(p1, 2.) + + 3. * std::pow(p2, 2.) + 8 * p3 * p1 - 6. * p4) / + (std::pow(w1, 4.) - 6. * w2 * std::pow(w1, 2.) + + 3. * std::pow(w2, 2.) + 8 * w3 * w1 - 6. * w4)}; registry.fill(HIST("NchvsFV0A"), aV0A / 100., nch); registry.fill(HIST("NchvsFT0A"), aT0A / 100., nch); @@ -540,11 +603,51 @@ struct UccZdc { registry.fill(HIST("Nch"), nch); registry.fill(HIST("ZNAvsNch"), nch, znA); registry.fill(HIST("ZNCvsNch"), nch, znC); - registry.fill(HIST("ZNCvsNchvspT"), nch, znC, oneParCorr); - registry.fill(HIST("ZNAvsNchvspT"), nch, znA, oneParCorr); + registry.fill(HIST("ZNvsNch"), nch, sumZNs); + + if (isZNbasedSel) { + if (isZN && (sumZNs > znBasedCut)) + return; + if (isZNA && (znA > znBasedCut)) + return; + if (isZNC && (znC > znBasedCut)) + return; + } + registry.fill(HIST("NchvsOneParCorr"), nch, oneParCorr); + registry.fill(HIST("NchvsTwoParCorr"), nch, twoParCorr); + registry.fill(HIST("NchvsThreeParCorr"), nch, threeParCorr); + registry.fill(HIST("NchvsFourParCorr"), nch, fourParCorr); + registry.fill(HIST("pP1"), nch, w1 * oneParCorr); + registry.fill(HIST("pW1"), nch, w1); + registry.fill(HIST("pP2"), nch, w2 * twoParCorr); + registry.fill(HIST("pW2"), nch, w2); + registry.fill(HIST("pP3"), nch, w3 * threeParCorr); + registry.fill(HIST("pW3"), nch, w3); + registry.fill(HIST("pP4"), nch, w4 * fourParCorr); + registry.fill(HIST("pW4"), nch, w4); } + PROCESS_SWITCH(UccZdc, processZdcCollAss, "Process ZDC W/Coll Ass.", true); + template + void getMoments(const T& pTs, const T& wIs, U& pOne, U& wOne, U& pTwo, U& wTwo, U& pThree, U& wThree, U& pFour, U& wFour) + { + pOne = wOne = pTwo = wTwo = pThree = wThree = pFour = wFour = 0.; + + for (std::size_t i = 0; i < pTs.size(); ++i) { + const float pTi{pTs.at(i)}; + const float wEighti{wIs.at(i)}; + pOne += wEighti * pTi; + wOne += wEighti; + pTwo += std::pow(wEighti * pTi, 2.); + wTwo += std::pow(wEighti, 2.); + pThree += std::pow(wEighti * pTi, 3.); + wThree += std::pow(wEighti, 3.); + pFour += std::pow(wEighti * pTi, 4.); + wFour += std::pow(wEighti, 4.); + } + } + Preslice perMCCollision = aod::mcparticle::mcCollisionId; Preslice perCollision = aod::track::collisionId; void processMC(aod::McCollisions const& mcCollisions, From 241a29a48464338ff047f330902a141914ac0890 Mon Sep 17 00:00:00 2001 From: Junlee Kim Date: Wed, 26 Feb 2025 06:44:17 +0100 Subject: [PATCH 0425/1650] [PWGLF] initial commit for heptaquark search task (#10187) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Resonances/CMakeLists.txt | 5 + PWGLF/Tasks/Resonances/heptaquark.cxx | 332 ++++++++++++++++++++++++++ 2 files changed, 337 insertions(+) create mode 100644 PWGLF/Tasks/Resonances/heptaquark.cxx diff --git a/PWGLF/Tasks/Resonances/CMakeLists.txt b/PWGLF/Tasks/Resonances/CMakeLists.txt index 47267af9f97..314fdf48072 100644 --- a/PWGLF/Tasks/Resonances/CMakeLists.txt +++ b/PWGLF/Tasks/Resonances/CMakeLists.txt @@ -198,3 +198,8 @@ o2physics_add_dpl_workflow(kstarpbpbv1 SOURCES kstarFlowv1.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(heptaquark + SOURCES heptaquark.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) diff --git a/PWGLF/Tasks/Resonances/heptaquark.cxx b/PWGLF/Tasks/Resonances/heptaquark.cxx new file mode 100644 index 00000000000..a2be19c65ce --- /dev/null +++ b/PWGLF/Tasks/Resonances/heptaquark.cxx @@ -0,0 +1,332 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// +/// \brief this is a starting point for the Resonances tutorial +/// \author junlee kim + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Framework/AnalysisTask.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/StepTHn.h" +#include "Common/Core/trackUtilities.h" +#include "PWGLF/DataModel/ReducedHeptaQuarkTables.h" +#include "CommonConstants/PhysicsConstants.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::soa; + +struct heptaquark { + HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + Configurable cfgRotBkg{"cfgRotBkg", true, "flag to construct rotational backgrounds"}; + Configurable cfgNRotBkg{"cfgNRotBkg", 10, "the number of rotational backgrounds"}; + + Configurable cfgPIDStrategy{"cfgPIDStrategy", 3, "PID strategy 1"}; + Configurable cfgPIDPrPi{"cfgPIDPrPi", 3, "PID selection for proton and pion"}; + + Configurable minPhiMass{"minPhiMass", 1.01, "Minimum phi mass"}; + Configurable maxPhiMass{"maxPhiMass", 1.03, "Maximum phi mass"}; + + Configurable minLambdaMass{"minLambdaMass", 1.1, "Minimum lambda mass"}; + Configurable maxLambdaMass{"maxLambdaMass", 1.13, "Maximum lambda mass"}; + + Configurable cutNsigmaTPC{"cutNsigmaTPC", 2.5, "nsigma cut TPC"}; + Configurable cutNsigmaTOF{"cutNsigmaTOF", 3.0, "nsigma cut TOF"}; + + ConfigurableAxis massAxis{"massAxis", {600, 2.8, 3.4}, "Invariant mass axis"}; + ConfigurableAxis ptAxis{"ptAxis", {VARIABLE_WIDTH, 0.2, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 6.5, 8.0, 10.0, 100.0}, "Transverse momentum bins"}; + ConfigurableAxis centAxis{"centAxis", {VARIABLE_WIDTH, 0, 20, 50, 100}, "Centrality interval"}; + ConfigurableAxis massPPAxis{"massPPAxis", {100, 3.0, 8.0}, "Mass square of phi phi"}; + ConfigurableAxis massPLAxis{"massPLAxis", {100, 3.0, 8.0}, "Mass square of phi lambda"}; + + void init(o2::framework::InitContext&) + { + histos.add("hnsigmaTPCPi", "hnsigmaTPCPi", kTH2F, {{1000, -7.0, 7.0f}, {100, 0.0f, 10.0f}}); + + histos.add("hnsigmaTPCKa", "hnsigmaTPCKa", kTH2F, {{1000, -7.0, 7.0f}, {100, 0.0f, 10.0f}}); + histos.add("hnsigmaTOFKa", "hnsigmaTOFKa", kTH2F, {{1000, -7.0, 7.0f}, {100, 0.0f, 10.0f}}); + + histos.add("hnsigmaTPCPr", "hnsigmaTPCPr", kTH2F, {{1000, -7.0, 7.0f}, {100, 0.0f, 10.0f}}); + + histos.add("hPhid1Mass", "hPhid1Mass", kTH2F, {{40, 1.0, 1.04f}, {100, 0.0f, 10.0f}}); + histos.add("hPhid2Mass", "hPhid2Mass", kTH2F, {{40, 1.0, 1.04f}, {100, 0.0f, 10.0f}}); + histos.add("hLambdaMass", "hLambdaMass", kTH2F, {{140, 1.095, 1.135}, {100, 0.0f, 10.0f}}); + + histos.add("h_InvMass_same", "h_InvMass_same", {HistType::kTH3F, {massAxis, ptAxis, centAxis}}); + histos.add("h_InvMass_rotPhi", "h_InvMass_rotPhi", {HistType::kTH3F, {massAxis, ptAxis, centAxis}}); + histos.add("h_InvMass_rotLambda", "h_InvMass_rotLambda", {HistType::kTH3F, {massAxis, ptAxis, centAxis}}); + histos.add("h_InvMass_rotPhiLambda", "h_InvMass_rotPhiLambda", {HistType::kTH3F, {massAxis, ptAxis, centAxis}}); + + histos.add("hDalitz", "hDalitz", {HistType::kTHnSparseF, {massPPAxis, massPLAxis, massAxis, ptAxis, centAxis}}); + histos.add("hDalitzRot", "hDalitzRot", {HistType::kTHnSparseF, {massPPAxis, massPLAxis, massAxis, ptAxis, centAxis}}); + } + + double massLambda = o2::constants::physics::MassLambda; + double massPr = o2::constants::physics::MassProton; + double massPi = o2::constants::physics::MassPionCharged; + double massKa = o2::constants::physics::MassKPlus; + + TRandom* rn = new TRandom(); + + bool selectionPIDKaon(float nsigmaTPC, float nsigmaTOF, int TOFHit, int PIDStrategy, float ptcand) + { + if (PIDStrategy == 0) { + if (TOFHit != 1) { + if (TMath::Abs(nsigmaTPC) < cutNsigmaTPC) { + return true; + } + } + if (TOFHit == 1) { + if (TMath::Abs(nsigmaTOF) < cutNsigmaTOF) { + return true; + } + } + } + if (PIDStrategy == 1) { + if (ptcand < 0.5) { + if (TOFHit != 1 && TMath::Abs(nsigmaTPC) < cutNsigmaTPC) { + return true; + } + if (TOFHit == 1 && TMath::Abs(nsigmaTOF) < cutNsigmaTOF) { + return true; + } + } + if (ptcand >= 0.5) { + if (TOFHit == 1 && TMath::Abs(nsigmaTOF) < cutNsigmaTOF) { + return true; + } + } + } + if (PIDStrategy == 2) { + if (ptcand < 0.5) { + if (TOFHit != 1 && TMath::Abs(nsigmaTPC) < cutNsigmaTPC) { + return true; + } + if (TOFHit == 1 && TMath::Abs(nsigmaTOF) < cutNsigmaTOF) { + return true; + } + } + if (ptcand >= 0.5 && ptcand < 1.2) { + if (TOFHit == 1 && TMath::Abs(nsigmaTOF) < cutNsigmaTOF) { + return true; + } + if (TOFHit != 1 && nsigmaTPC > -1.5 && nsigmaTPC < cutNsigmaTPC) { + return true; + } + } + if (ptcand >= 1.2) { + if (TOFHit == 1 && TMath::Abs(nsigmaTOF) < cutNsigmaTOF) { + return true; + } + if (TOFHit != 1 && TMath::Abs(nsigmaTPC) < cutNsigmaTPC) { + return true; + } + } + } + if (PIDStrategy == 3) { + if (ptcand < 0.5) { + if (TOFHit != 1 && TMath::Abs(nsigmaTPC) < cutNsigmaTPC) { + return true; + } + if (TOFHit == 1 && TMath::Abs(nsigmaTOF) < cutNsigmaTOF) { + return true; + } + } + if (ptcand >= 0.5 && ptcand < 1.2) { + if (TOFHit == 1 && TMath::Abs(nsigmaTOF) < cutNsigmaTOF) { + return true; + } + } + if (ptcand >= 1.2) { + if (TOFHit == 1 && TMath::Abs(nsigmaTOF) < cutNsigmaTOF) { + return true; + } + if (TOFHit != 1 && TMath::Abs(nsigmaTPC) < cutNsigmaTPC) { + return true; + } + } + } + return false; + } + + ROOT::Math::PxPyPzMVector DauVec1, DauVec2; + + TLorentzVector exotic, HQ1, HQ2, HQ3; + TLorentzVector exoticRot2, HQ2Rot; + TLorentzVector exoticRot3, HQ3Rot; + TLorentzVector exoticRot23; + TLorentzVector HQ12, HQ13; + TLorentzVector HQ12Rot, HQ13Rot; + + void processSameEvent(aod::RedHQEvents::iterator const& collision, aod::HQTracks const& hqtracks) + { + if (collision.numLambda() < 1 || collision.numPhi() < 2) + return; + + for (auto hqtrackd1 : hqtracks) { + if (hqtrackd1.hqId() != 333) + continue; + + if (hqtrackd1.hqMass() < minPhiMass || hqtrackd1.hqMass() > maxPhiMass) + continue; + + DauVec1 = ROOT::Math::PxPyPzMVector(hqtrackd1.hqd1Px(), hqtrackd1.hqd1Py(), hqtrackd1.hqd1Pz(), massKa); + DauVec2 = ROOT::Math::PxPyPzMVector(hqtrackd1.hqd2Px(), hqtrackd1.hqd2Py(), hqtrackd1.hqd2Pz(), massKa); + + if (!selectionPIDKaon(hqtrackd1.hqd1TPC(), hqtrackd1.hqd1TOF(), hqtrackd1.hqd1TOFHit(), cfgPIDStrategy, DauVec1.Pt())) + continue; + + if (!selectionPIDKaon(hqtrackd1.hqd2TPC(), hqtrackd1.hqd2TOF(), hqtrackd1.hqd2TOFHit(), cfgPIDStrategy, DauVec2.Pt())) + continue; + + HQ1.SetXYZM(hqtrackd1.hqPx(), hqtrackd1.hqPy(), hqtrackd1.hqPz(), hqtrackd1.hqMass()); + + histos.fill(HIST("hnsigmaTPCKa"), hqtrackd1.hqd1TPC(), DauVec1.Pt()); + histos.fill(HIST("hnsigmaTPCKa"), hqtrackd1.hqd2TPC(), DauVec2.Pt()); + if (hqtrackd1.hqd1TOFHit()) + histos.fill(HIST("hnsigmaTOFKa"), hqtrackd1.hqd1TOF(), DauVec1.Pt()); + if (hqtrackd1.hqd2TOFHit()) + histos.fill(HIST("hnsigmaTOFKa"), hqtrackd1.hqd2TOF(), DauVec2.Pt()); + + auto hqd1id = hqtrackd1.index(); + histos.fill(HIST("hPhid1Mass"), HQ1.M(), HQ1.Pt()); + + for (auto hqtrackd2 : hqtracks) { + auto hqd2id = hqtrackd2.index(); + if (hqd2id <= hqd1id) + continue; + + if (hqtrackd2.hqId() != 333) + continue; + + if (hqtrackd2.hqMass() < minPhiMass || hqtrackd2.hqMass() > maxPhiMass) + continue; + + DauVec1 = ROOT::Math::PxPyPzMVector(hqtrackd2.hqd1Px(), hqtrackd2.hqd1Py(), hqtrackd2.hqd1Pz(), massKa); + DauVec2 = ROOT::Math::PxPyPzMVector(hqtrackd2.hqd2Px(), hqtrackd2.hqd2Py(), hqtrackd2.hqd2Pz(), massKa); + + if (!selectionPIDKaon(hqtrackd2.hqd1TPC(), hqtrackd2.hqd1TOF(), hqtrackd2.hqd1TOFHit(), cfgPIDStrategy, DauVec1.Pt())) + continue; + + if (!selectionPIDKaon(hqtrackd2.hqd2TPC(), hqtrackd2.hqd2TOF(), hqtrackd2.hqd2TOFHit(), cfgPIDStrategy, DauVec2.Pt())) + continue; + + if (hqtrackd1.hqd1Index() == hqtrackd2.hqd1Index()) + continue; + + if (hqtrackd1.hqd2Index() == hqtrackd2.hqd2Index()) + continue; + + HQ2.SetXYZM(hqtrackd2.hqPx(), hqtrackd2.hqPy(), hqtrackd2.hqPz(), hqtrackd2.hqMass()); + + histos.fill(HIST("hnsigmaTPCKa"), hqtrackd2.hqd1TPC(), DauVec1.Pt()); + histos.fill(HIST("hnsigmaTPCKa"), hqtrackd2.hqd2TPC(), DauVec2.Pt()); + if (hqtrackd2.hqd1TOFHit()) + histos.fill(HIST("hnsigmaTOFKa"), hqtrackd2.hqd1TOF(), DauVec1.Pt()); + if (hqtrackd2.hqd2TOFHit()) + histos.fill(HIST("hnsigmaTOFKa"), hqtrackd2.hqd2TOF(), DauVec2.Pt()); + histos.fill(HIST("hPhid2Mass"), HQ2.M(), HQ2.Pt()); + + for (auto hqtrackd3 : hqtracks) { + if (std::abs(hqtrackd3.hqId()) != 3122) + continue; + + if (hqtrackd3.hqMass() < minLambdaMass || hqtrackd3.hqMass() > maxLambdaMass) + continue; + + if (hqtrackd3.hqId() > 0) { + DauVec1 = ROOT::Math::PxPyPzMVector(hqtrackd3.hqd1Px(), hqtrackd3.hqd1Py(), hqtrackd3.hqd1Pz(), massPr); + DauVec2 = ROOT::Math::PxPyPzMVector(hqtrackd3.hqd2Px(), hqtrackd3.hqd2Py(), hqtrackd3.hqd2Pz(), massPi); + } else if (hqtrackd3.hqId() < 0) { + DauVec1 = ROOT::Math::PxPyPzMVector(hqtrackd3.hqd1Px(), hqtrackd3.hqd1Py(), hqtrackd3.hqd1Pz(), massPi); + DauVec2 = ROOT::Math::PxPyPzMVector(hqtrackd3.hqd2Px(), hqtrackd3.hqd2Py(), hqtrackd3.hqd2Pz(), massPr); + } + + if (std::abs(hqtrackd3.hqd1TPC()) > cfgPIDPrPi || std::abs(hqtrackd3.hqd2TPC()) > cfgPIDPrPi) + continue; + + if (hqtrackd1.hqd1Index() == hqtrackd3.hqd1Index()) + continue; + + if (hqtrackd1.hqd2Index() == hqtrackd3.hqd2Index()) + continue; + + if (hqtrackd2.hqd1Index() == hqtrackd3.hqd1Index()) + continue; + + if (hqtrackd2.hqd2Index() == hqtrackd3.hqd2Index()) + continue; + + HQ3.SetXYZM(hqtrackd3.hqPx(), hqtrackd3.hqPy(), hqtrackd3.hqPz(), hqtrackd3.hqMass()); + histos.fill(HIST("hLambdaMass"), HQ3.M(), HQ3.Pt()); + + if (hqtrackd3.hqId() > 0) { + histos.fill(HIST("hnsigmaTPCPr"), hqtrackd3.hqd1TPC(), DauVec1.Pt()); + histos.fill(HIST("hnsigmaTPCPi"), hqtrackd3.hqd2TPC(), DauVec2.Pt()); + } else if (hqtrackd3.hqId() < 0) { + histos.fill(HIST("hnsigmaTPCPi"), hqtrackd3.hqd1TPC(), DauVec1.Pt()); + histos.fill(HIST("hnsigmaTPCPr"), hqtrackd3.hqd2TPC(), DauVec2.Pt()); + } + + exotic = HQ1 + HQ2 + HQ3; + HQ12 = HQ1 + HQ2; + HQ13 = HQ1 + HQ3; + + histos.fill(HIST("h_InvMass_same"), exotic.M(), exotic.Pt(), collision.centrality()); + histos.fill(HIST("hDalitz"), HQ12.M2(), HQ13.M2(), exotic.M(), exotic.Pt(), collision.centrality()); + + if (cfgRotBkg) { + for (int nr = 0; nr < cfgNRotBkg; nr++) { + auto RanPhiForD2 = rn->Uniform(o2::constants::math::PI * 5.0 / 6.0, o2::constants::math::PI * 7.0 / 6.0); + auto RanPhiForD3 = rn->Uniform(o2::constants::math::PI * 5.0 / 6.0, o2::constants::math::PI * 7.0 / 6.0); + + RanPhiForD2 += HQ2.Phi(); + RanPhiForD3 += HQ3.Phi(); + + HQ2Rot.SetXYZM(HQ2.Pt() * std::cos(RanPhiForD2), HQ2.Pt() * std::sin(RanPhiForD2), HQ2.Pz(), HQ2.M()); + HQ3Rot.SetXYZM(HQ3.Pt() * std::cos(RanPhiForD3), HQ3.Pt() * std::sin(RanPhiForD3), HQ3.Pz(), HQ3.M()); + + exoticRot2 = HQ1 + HQ2Rot + HQ3; + exoticRot3 = HQ1 + HQ2 + HQ3Rot; + exoticRot23 = HQ1 + HQ2Rot + HQ3Rot; + + HQ12Rot = HQ1 + HQ2Rot; + HQ13Rot = HQ1 + HQ3Rot; + + histos.fill(HIST("h_InvMass_rotPhi"), exoticRot2.M(), exoticRot2.Pt(), collision.centrality()); + histos.fill(HIST("h_InvMass_rotLambda"), exoticRot3.M(), exoticRot3.Pt(), collision.centrality()); + histos.fill(HIST("h_InvMass_rotPhiLambda"), exoticRot23.M(), exoticRot23.Pt(), collision.centrality()); + histos.fill(HIST("hDalitzRot"), HQ12Rot.M2(), HQ13Rot.M2(), exoticRot23.M(), exoticRot23.Pt(), collision.centrality()); + } + } + } + } + } + } + PROCESS_SWITCH(heptaquark, processSameEvent, "Process same event", true); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From c64fd61c79aaacb43716ed8cbfc8e7c3f8a2fdd6 Mon Sep 17 00:00:00 2001 From: victorvalenciatorres <118812999+victorvalenciatorres@users.noreply.github.com> Date: Wed, 26 Feb 2025 08:50:12 +0100 Subject: [PATCH 0426/1650] [PWGDQ] Adding correct initialisation of V2ME for cumulants (#10190) --- PWGDQ/Core/VarManager.h | 56 ++++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 4e12d4eb013..050b0a5c9bf 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -1986,38 +1986,48 @@ void VarManager::FillTwoMixEventsFlowResoFactor(T const& hs_sp, T const& hs_ep, } template -void VarManager::FillTwoMixEventsCumulants(T const& h_v22m, T const& h_v24m, T const& h_v22p, T const& h_v24p, T1 const& t1, T2 const& t2, float* values) +void VarManager::FillTwoMixEventsCumulants(T const& h_v22ev1, T const& h_v24ev1, T const& h_v22ev2, T const& h_v24ev2, T1 const& t1, T2 const& t2, float* values) { if (!values) { values = fgValues; } - float ptp, ptm, centp, centm; - if (t1.sign() < 0) { - ptm = t1.sign(); - ptp = t2.sign(); - centm = values[kTwoEvCentFT0C1]; - centp = values[kTwoEvCentFT0C2]; - } else { - ptm = t2.sign(); - ptp = t1.sign(); - centm = values[kTwoEvCentFT0C2]; - centp = values[kTwoEvCentFT0C1]; - } - if (centm >= 0.) { - int idx_v22m = h_v22m->FindBin(centm, ptm); - int idx_v24m = h_v24m->FindBin(centm, ptm); + int idx_v22ev1; + int idx_v24ev1; + int idx_v22ev2; + int idx_v24ev2; + + if (values[kTwoEvCentFT0C1] >= 0.) { + if (t1.sign() < 0) { + + idx_v22ev1 = h_v22ev1->FindBin(values[kTwoEvCentFT0C1], t1.pt()); + idx_v24ev1 = h_v24ev1->FindBin(values[kTwoEvCentFT0C1], t1.pt()); + values[kV22m] = h_v22ev1->GetBinContent(idx_v22ev1); + values[kV24m] = h_v24ev1->GetBinContent(idx_v24ev1); + + } else { - values[kV22m] = h_v22m->GetBinContent(idx_v22m); - values[kV24m] = h_v24m->GetBinContent(idx_v24m); + idx_v22ev1 = h_v22ev2->FindBin(values[kTwoEvCentFT0C1], t1.pt()); + idx_v24ev1 = h_v24ev2->FindBin(values[kTwoEvCentFT0C1], t1.pt()); + values[kV22m] = h_v22ev2->GetBinContent(idx_v22ev1); + values[kV24m] = h_v24ev2->GetBinContent(idx_v24ev1); + } } + if (values[kTwoEvCentFT0C2] >= 0.) { + if (t2.sign() < 0) { - if (centp >= 0.) { - int idx_v22p = h_v22p->FindBin(centp, ptp); - int idx_v24p = h_v24p->FindBin(centp, ptp); + idx_v22ev2 = h_v22ev1->FindBin(values[kTwoEvCentFT0C2], t2.pt()); + idx_v24ev2 = h_v24ev1->FindBin(values[kTwoEvCentFT0C2], t2.pt()); + values[kV22p] = h_v22ev1->GetBinContent(idx_v22ev2); + values[kV24p] = h_v24ev1->GetBinContent(idx_v24ev2); - values[kV22p] = h_v22p->GetBinContent(idx_v22p); - values[kV24p] = h_v24p->GetBinContent(idx_v24p); + } else { + + idx_v22ev2 = h_v22ev2->FindBin(values[kTwoEvCentFT0C2], t2.pt()); + idx_v24ev2 = h_v24ev2->FindBin(values[kTwoEvCentFT0C2], t2.pt()); + values[kV22p] = h_v22ev2->GetBinContent(idx_v22ev2); + values[kV24p] = h_v24ev2->GetBinContent(idx_v24ev2); + } } } From b5aa9be2fb4d2631cbc1d3c73aea6f3440c605b5 Mon Sep 17 00:00:00 2001 From: shaidlov <109801990+Edingrast@users.noreply.github.com> Date: Wed, 26 Feb 2025 09:31:05 +0100 Subject: [PATCH 0427/1650] [PWGUD] Jpsi central v10 (#10191) --- PWGUD/Tasks/CMakeLists.txt | 2 +- PWGUD/Tasks/upcJpsiCentralBarrelCorr.cxx | 2250 ---------------------- PWGUD/Tasks/upcJpsiCorr.cxx | 1378 +++++++++++++ 3 files changed, 1379 insertions(+), 2251 deletions(-) delete mode 100644 PWGUD/Tasks/upcJpsiCentralBarrelCorr.cxx create mode 100644 PWGUD/Tasks/upcJpsiCorr.cxx diff --git a/PWGUD/Tasks/CMakeLists.txt b/PWGUD/Tasks/CMakeLists.txt index 3e31bfe9b0c..f752f7d12ac 100644 --- a/PWGUD/Tasks/CMakeLists.txt +++ b/PWGUD/Tasks/CMakeLists.txt @@ -135,7 +135,7 @@ o2physics_add_dpl_workflow(polarisation-rho COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(upc-jpsi-corr - SOURCES upcJpsiCentralBarrelCorr.cxx + SOURCES upcJpsiCorr.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGPIDSelector COMPONENT_NAME Analysis) diff --git a/PWGUD/Tasks/upcJpsiCentralBarrelCorr.cxx b/PWGUD/Tasks/upcJpsiCentralBarrelCorr.cxx deleted file mode 100644 index fed6937f561..00000000000 --- a/PWGUD/Tasks/upcJpsiCentralBarrelCorr.cxx +++ /dev/null @@ -1,2250 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. -/// -/// \brief -/// \author Sara Haidlova, sara.haidlova@cern.ch -/// \since March 2024 - -#include -#include - -// O2 headers -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "CommonConstants/MathConstants.h" -#include "CommonConstants/PhysicsConstants.h" - -// O2Physics headers -#include "Common/DataModel/PIDResponse.h" -#include "Common/Core/RecoDecay.h" -#include "PWGUD/DataModel/UDTables.h" -#include "PWGUD/Core/UDHelpers.h" -#include "PWGUD/Core/UPCJpsiCentralBarrelCorrHelper.h" -#include "PWGUD/Core/SGSelector.h" - -// ROOT headers -#include "TLorentzVector.h" - -using namespace o2; -using namespace o2::framework; -using namespace o2::framework::expressions; -using namespace o2::constants::math; - -SGSelector sgSelector; - -struct UpcJpsiCentralBarrel { - // configurable axes - ConfigurableAxis axisIVM{"axisIVM", {500.0f, 2.0f, 4.5f}, "M_#it{inv} (GeV/#it{c}^{2})"}; - ConfigurableAxis axisIVMWide{"axisIVMWide", {350.0f, 0.0f, 4.5f}, "M_#it{inv} (GeV/#it{c}^{2})"}; - ConfigurableAxis axisPt{"axisPt", {250.0f, 0.1f, 3.0f}, "#it{p}_T (GeV/#it{c})"}; - ConfigurableAxis axisPt2{"axisPt2", {250.0f, 0.0f, 0.01f}, "#it{p}_T (GeV/#it{c})"}; - ConfigurableAxis axisPt2wide{"axisPt2wide", {250.0f, 0.0f, 0.04f}, "#it{p}_T (GeV/#it{c})"}; - ConfigurableAxis axisP{"axisP", {250.0f, 0.1f, 3.0f}, "#it{p} (GeV/#it{c})"}; - ConfigurableAxis axisEta{"axisEta", {250.0f, -1.5f, 1.5f}, "#eta (-)"}; - ConfigurableAxis axisCounter{"axisCounter", {20.0f, 0.0f, 20.0f}, "Number of events (-)"}; - ConfigurableAxis axisPhi{"axisPhi", {250.0f, 0, TwoPI}, "#phi (rad)"}; - ConfigurableAxis axisAccAngle{"axisAccAngle", {250.0f, -0.2f, 0.2f}, "accAngle"}; - ConfigurableAxis axisAngTheta{"axisAngTheta", {250.0f, -1.5f, 1.5f}, "cos #theta (-)"}; - ConfigurableAxis axisTPC{"axisTPC", {1000.0f, 0, 200.0f}, "TPC d#it{E}/d#it{x}"}; - ConfigurableAxis axisBetaTOF{"axisBetaTOF", {100.0f, 0, 1.5}, "TOF #beta"}; - ConfigurableAxis axisSigma{"axisSigma", {50, -25, 25}, "#sigma"}; - ConfigurableAxis axisZDCEnergy{"axisZDCEnergy", {250, -5.0, 20.0}, "ZDC energy"}; - ConfigurableAxis axisZDCTime{"axisZDCTime", {200, -10.0, 10.0}, "ZDC time"}; - ConfigurableAxis axisDCA{"axisDCA", {1000, -20.0, 20.0}, "DCA"}; - ConfigurableAxis axisChi2{"axisChi2", {200, -10.0, 40}, "Chi2"}; - ConfigurableAxis axisIVMSel{"axisIVMSel", {1000, 0.0, 10.0}, "IVM"}; - ConfigurableAxis axisCounterSel{"axisCounterSel", {1000, 0.0, 200.0}, "Selection"}; - ConfigurableAxis axisITSNCls{"axisITSNCls", {10, 0.0, 10.0}, "ITSNCls"}; - ConfigurableAxis axisTPCNCls{"axisTPCNCls", {170, -1, 160.0}, "TPCNCls"}; - ConfigurableAxis axisTPCCrossed{"axisTPCCrossed", {300, 20, 170.0}, "TPCCrossedRows"}; - - // configurable cuts (modify in json) - // track quality cuts - Configurable TPCNClsCrossedRows{"TPCNClsCrossedRows", 70, "number of crossed rows in TPC"}; - Configurable TOFAtLeastOneProton{"TOFAtLeastOneProton", false, "at least one candidate track has TOF hits"}; - Configurable TOFBothProtons{"TOFBothProtons", false, "both candidate protons have TOF hits"}; - Configurable TOFOneProton{"TOFOneProton", false, "one candidate proton has TOF hits"}; - Configurable DCAcut{"DCAcut", false, "DCA cut from run2."}; - Configurable newCutTPC{"newCutTPC", false, "New cuts for TPC quality tracks."}; - Configurable EtaCut{"EtaCut", 0.9f, "acceptance cut per track"}; - Configurable cutPtTrack{"cutPtTrack", 0.7f, "pT cut per track"}; - Configurable cutVertexZ{"cutVertexZ", 10.0f, "cut on vertex position in Z"}; - Configurable RapCut{"RapCut", 0.9f, "choose event in midrapidity"}; - Configurable dcaZCut{"dcaZCut", 2, "cut on the impact parameter in z of the track to the PV"}; - Configurable dcaXYCut{"dcaXYCut", 1e10, "cut on the impact parameter in xy of the track to the PV"}; - Configurable ITSNClsCut{"ITSNClsCut", 4, "minimal number of ITS clusters"}; - Configurable ITSChi2NClsCut{"ITSChi2NClsCut", 36, "minimal Chi2/cluster for the ITS track"}; - Configurable TPCNClsCrossedRowsCut{"TPCNClsCrossedRowsCut", 70, "minimal number of crossed TPC rows"}; - Configurable TPCChi2NCls{"TPCChi2NCls", 4, "minimal Chi2/cluster for the TPC track"}; - Configurable TPCMinNCls{"TPCMinNCls", 3, "minimum number of TPC clusters"}; - Configurable TPCCrossedOverFindable{"TPCCrossedOverFindable", 3, "number of TPC crossed rows over findable clusters"}; - - // ZDC classes cuts - Configurable ZNenergyCut{"ZNenergyCut", 0.0, "ZN common energy cut"}; - Configurable ZNtimeCut{"ZNtimeCut", 2.0, "ZN time cut"}; - - // Analysis cuts - Configurable maxJpsiMass{"maxJpsiMass", 3.18, "Maximum of the jpsi peak for peak cut"}; - Configurable minJpsiMass{"minJpsiMass", 3.0, "Minimum of the jpsi peak for peak cut"}; - - // SG cuts - Configurable whichGapSide{"whichGapSide", 2, {"0 for side A, 1 for side C, 2 for both sides"}}; - Configurable useTrueGap{"useTrueGap", true, {"Calculate gapSide for a given FV0/FT0/ZDC thresholds"}}; - Configurable cutMyGapSideFV0{"FV0", 100, "FV0A threshold for SG selector"}; - Configurable cutMyGapSideFT0A{"FT0A", 200., "FT0A threshold for SG selector"}; - Configurable cutMyGapSideFT0C{"FT0C", 100., "FT0C threshold for SG selector"}; - Configurable cutMyGapSideZDC{"ZDC", 1000., "ZDC threshold for SG selector"}; - - // process cuts - Configurable doMuons{"doMuons", true, "Provide muon plots."}; - Configurable doElectrons{"doElectrons", true, "Provide electron plots."}; - Configurable doProtons{"doProtons", true, "Provide proton plots."}; - Configurable chargeOrdered{"chargeOrdered", false, "Order tracks based on charge."}; - Configurable doOnlyUPC{"doOnlyUPC", false, "Analyse only collisions with UPC settings."}; - Configurable doOnlyStandard{"doOnlyStandard", false, "Analyse only collisions with standard settings."}; - - // initialize histogram registry - HistogramRegistry Statistics{ - "Statistics", - {}}; - - HistogramRegistry RawData{ - "RawData", - {}}; - - HistogramRegistry Selections{ - "Selections", - {}}; - - HistogramRegistry PVContributors{ - "PVContributors", - {}}; - - HistogramRegistry TG{ - "TG", - {}}; - - HistogramRegistry TGmu{ - "TGmu", - {}}; - - HistogramRegistry TGmuCand{ - "TGmuCand", - {}}; - - HistogramRegistry TGel{ - "TGel", - {}}; - - HistogramRegistry TGelCand{ - "TGelCand", - {}}; - - HistogramRegistry TGp{ - "TGp", - {}}; - - HistogramRegistry TGpCand{ - "TGpCand", - {}}; - - HistogramRegistry JPsiToEl{ - "JPsiToEl", - {}}; - - HistogramRegistry JPsiToMu{ - "JPsiToMu", - {}}; - - HistogramRegistry JPsiToP{ - "JPsiToP", - {}}; - - HistogramRegistry Correlation{ - "Correlation", - {}}; - - HistogramRegistry Asymmetry{ - "Asymmetry", - {}}; - - HistogramRegistry MC{ - "MC", - {}}; - - using UDCollisionsFull = soa::Join; - using UDCollisionFull = UDCollisionsFull::iterator; - using UDTracksFull = soa::Join; - using UDTrackFull = UDTracksFull::iterator; - using SGUDCollisionFull = soa::Join::iterator; - - void init(InitContext&) - { - - // statistics histograms for counters - Statistics.add("Statistics/hNumberOfCollisions", "hNumberOfCollisions", {HistType::kTH1F, {axisCounter}}); - Statistics.add("Statistics/hNumberOfTracks", "hNumberOfTracks", {HistType::kTH1F, {axisCounter}}); - Statistics.add("Statistics/hNumberGT", "hNumberGT", {HistType::kTH1F, {axisCounter}}); - Statistics.add("Statistics/hCutCounterCollisions", "hCutCounterCollisions", {HistType::kTH1F, {axisCounter}}); - Statistics.add("Statistics/hCutCounterTracks", "hCutCounterTracks", {HistType::kTH1F, {axisCounter}}); - - // raw data histograms - RawData.add("RawData/hTrackPt", "hTrackPt", {HistType::kTH1F, {axisPt}}); - RawData.add("RawData/hTrackEta", "hTrackEta", {HistType::kTH1F, {axisEta}}); - RawData.add("RawData/hTrackPhi", "hTrackPhi", {HistType::kTH1F, {axisPhi}}); - RawData.add("RawData/hTrackDCAXYZ", "hTrackDCAXYZ", {HistType::kTH2F, {axisDCA, axisDCA}}); - RawData.add("RawData/hTPCNClsFindable", "hTPCNClsFindable", {HistType::kTH1F, {axisTPC}}); - RawData.add("RawData/hTPCNClsFindableMinusFound", "hTPCNClsFindableMinusFound", {HistType::kTH1F, {axisTPC}}); - RawData.add("RawData/hITSNCls", "hITSNCls", {HistType::kTH1F, {axisCounter}}); - RawData.add("RawData/hTPCNCls", "hTPCNCls", {HistType::kTH1F, {axisCounter}}); - RawData.add("RawData/hITSChi2NCls", "hITSChi2NCls", {HistType::kTH1F, {axisChi2}}); - RawData.add("RawData/hTPCChi2NCls", "hTPCChi2NCls", {HistType::kTH1F, {axisChi2}}); - RawData.add("RawData/hPositionZ", "hPositionZ", {HistType::kTH1F, {axisSigma}}); - RawData.add("RawData/hPositionX", "hPositionX", {HistType::kTH1F, {axisSigma}}); - RawData.add("RawData/hPositionY", "hPositionY", {HistType::kTH1F, {axisSigma}}); - RawData.add("RawData/hPositionXY", "hPositionXY", {HistType::kTH2F, {axisSigma, axisSigma}}); - RawData.add("RawData/hZNACommonEnergy", "hZNACommonEnergy", {HistType::kTH1F, {axisZDCEnergy}}); - RawData.add("RawData/hZNCCommonEnergy", "hZNCCommonEnergy", {HistType::kTH1F, {axisZDCEnergy}}); - RawData.add("RawData/hZNAvsZNCCommonEnergy", "hZNAvsZNCCommonEnergy", {HistType::kTH2F, {axisZDCEnergy, axisZDCEnergy}}); - RawData.add("RawData/hZNATime", "hZNATime", {HistType::kTH1F, {axisZDCTime}}); - RawData.add("RawData/hZNCTime", "hZNCTime", {HistType::kTH1F, {axisZDCTime}}); - RawData.add("RawData/hZNAvsZNCTime", "hZNAvsZNCTime", {HistType::kTH2F, {axisZDCTime, axisZDCTime}}); - RawData.add("RawData/PID/hTPCVsP", "hTPCVsP", {HistType::kTH2F, {axisP, axisTPC}}); - RawData.add("RawData/PID/hTPCVsPt", "hTPCVsPt", {HistType::kTH2F, {axisPt, axisTPC}}); - RawData.add("RawData/PID/hTPCVsPhi", "hTPCVsPhi", {HistType::kTH2F, {axisPhi, axisTPC}}); - RawData.add("RawData/PID/hTPCVsEta", "hTPCVsEta", {HistType::kTH2F, {axisEta, axisTPC}}); - RawData.add("RawData/PID/hBetaTOFVsP", "hBetaTOFVsP", {HistType::kTH2F, {axisP, axisBetaTOF}}); - - // Selection checks - Selections.add("Selections/Electron/Mass/Leading/hITSNClsVsM", "hITSNClsVsM", {HistType::kTH2F, {axisIVMSel, axisITSNCls}}); - Selections.add("Selections/Electron/Mass/Leading/hITSChi2NClsVsM", "hITSChi2NClsVsM", {HistType::kTH2F, {axisIVMSel, axisChi2}}); - Selections.add("Selections/Electron/Mass/Leading/hTPCNClsVsM", "hTPCNClsVsM", {HistType::kTH2F, {axisIVMSel, axisTPCNCls}}); - Selections.add("Selections/Electron/Mass/Leading/hTPCChi2NClsVsM", "hTPCChi2NClsVsM", {HistType::kTH2F, {axisIVMSel, axisChi2}}); - Selections.add("Selections/Electron/Mass/Leading/hTPCNClsCrossedRowsVsM", "hTPCNClsCrossedRowsVsM", {HistType::kTH2F, {axisIVMSel, axisTPCCrossed}}); - Selections.add("Selections/Electron/Mass/Subleading/hITSNClsVsM", "hITSNClsVsM", {HistType::kTH2F, {axisIVMSel, axisITSNCls}}); - Selections.add("Selections/Electron/Mass/Subleading/hITSChi2NClsVsM", "hITSChi2NClsVsM", {HistType::kTH2F, {axisIVMSel, axisChi2}}); - Selections.add("Selections/Electron/Mass/Subleading/hTPCNClsVsM", "hTPCNClsVsM", {HistType::kTH2F, {axisIVMSel, axisTPCNCls}}); - Selections.add("Selections/Electron/Mass/Subleading/hTPCChi2NClsVsM", "hTPCChi2NClsVsM", {HistType::kTH2F, {axisIVMSel, axisChi2}}); - Selections.add("Selections/Electron/Mass/Subleading/hTPCNClsCrossedRowsVsM", "hTPCNClsCrossedRowsVsM", {HistType::kTH2F, {axisIVMSel, axisTPCCrossed}}); - - Selections.add("Selections/Electron/Rapidity/Leading/hITSNClsVsY", "hITSNClsVsY", {HistType::kTH2F, {axisEta, axisITSNCls}}); - Selections.add("Selections/Electron/Rapidity/Leading/hITSChi2NClsVsY", "hITSChi2NClsVsY", {HistType::kTH2F, {axisEta, axisChi2}}); - Selections.add("Selections/Electron/Rapidity/Leading/hTPCNClsVsY", "hTPCNClsVsY", {HistType::kTH2F, {axisEta, axisTPCNCls}}); - Selections.add("Selections/Electron/Rapidity/Leading/hTPCChi2NClsVsY", "hTPCChi2NClsVsY", {HistType::kTH2F, {axisEta, axisChi2}}); - Selections.add("Selections/Electron/Rapidity/Leading/hTPCNClsCrossedRowsVsY", "hTPCNClsCrossedRowsVsY", {HistType::kTH2F, {axisEta, axisTPCCrossed}}); - Selections.add("Selections/Electron/Rapidity/Subleading/hITSNClsVsY", "hITSNClsVsY", {HistType::kTH2F, {axisEta, axisITSNCls}}); - Selections.add("Selections/Electron/Rapidity/Subleading/hITSChi2NClsVsY", "hITSChi2NClsVsY", {HistType::kTH2F, {axisEta, axisChi2}}); - Selections.add("Selections/Electron/Rapidity/Subleading/hTPCNClsVsY", "hTPCNClsVsY", {HistType::kTH2F, {axisEta, axisTPCNCls}}); - Selections.add("Selections/Electron/Rapidity/Subleading/hTPCChi2NClsVsY", "hTPCChi2NClsVsY", {HistType::kTH2F, {axisEta, axisChi2}}); - Selections.add("Selections/Electron/Rapidity/Subleading/hTPCNClsCrossedRowsVsY", "hTPCNClsCrossedRowsVsY", {HistType::kTH2F, {axisEta, axisTPCCrossed}}); - - Selections.add("Selections/Electron/Pt/Leading/hITSNClsVsPt", "hITSNClsVsPt", {HistType::kTH2F, {axisPt, axisITSNCls}}); - Selections.add("Selections/Electron/Pt/Leading/hITSChi2NClsVsPt", "hITSChi2NClsVsPt", {HistType::kTH2F, {axisPt, axisChi2}}); - Selections.add("Selections/Electron/Pt/Leading/hTPCNClsVsPt", "hTPCNClsVsPt", {HistType::kTH2F, {axisPt, axisTPCNCls}}); - Selections.add("Selections/Electron/Pt/Leading/hTPCChi2NClsVsPt", "hTPCChi2NClsVsPt", {HistType::kTH2F, {axisPt, axisChi2}}); - Selections.add("Selections/Electron/Pt/Leading/hTPCNClsCrossedRowsVsPt", "hTPCNClsCrossedRowsVsPt", {HistType::kTH2F, {axisPt, axisTPCCrossed}}); - Selections.add("Selections/Electron/Pt/Subleading/hITSNClsVsPt", "hITSNClsVsPt", {HistType::kTH2F, {axisPt, axisITSNCls}}); - Selections.add("Selections/Electron/Pt/Subleading/hITSChi2NClsVsPt", "hITSChi2NClsVsPt", {HistType::kTH2F, {axisPt, axisChi2}}); - Selections.add("Selections/Electron/Pt/Subleading/hTPCNClsVsPt", "hTPCNClsVsPt", {HistType::kTH2F, {axisPt, axisTPCNCls}}); - Selections.add("Selections/Electron/Pt/Subleading/hTPCChi2NClsVsPt", "hTPCChi2NClsVsPt", {HistType::kTH2F, {axisPt, axisChi2}}); - Selections.add("Selections/Electron/Pt/Subleading/hTPCNClsCrossedRowsVsPt", "hTPCNClsCrossedRowsVsPt", {HistType::kTH2F, {axisPt, axisTPCCrossed}}); - - Selections.add("Selections/Muon/Mass/Leading/hITSNClsVsM", "hITSNClsVsM", {HistType::kTH2F, {axisIVMSel, axisITSNCls}}); - Selections.add("Selections/Muon/Mass/Leading/hITSChi2NClsVsM", "hITSChi2NClsVsM", {HistType::kTH2F, {axisIVMSel, axisChi2}}); - Selections.add("Selections/Muon/Mass/Leading/hTPCNClsVsM", "hTPCNClsVsM", {HistType::kTH2F, {axisIVMSel, axisTPCNCls}}); - Selections.add("Selections/Muon/Mass/Leading/hTPCChi2NClsVsM", "hTPCChi2NClsVsM", {HistType::kTH2F, {axisIVMSel, axisChi2}}); - Selections.add("Selections/Muon/Mass/Leading/hTPCNClsCrossedRowsVsM", "hTPCNClsCrossedRowsVsM", {HistType::kTH2F, {axisIVMSel, axisTPCCrossed}}); - Selections.add("Selections/Muon/Mass/Subleading/hITSNClsVsM", "hITSNClsVsM", {HistType::kTH2F, {axisIVMSel, axisITSNCls}}); - Selections.add("Selections/Muon/Mass/Subleading/hITSChi2NClsVsM", "hITSChi2NClsVsM", {HistType::kTH2F, {axisIVMSel, axisChi2}}); - Selections.add("Selections/Muon/Mass/Subleading/hTPCNClsVsM", "hTPCNClsVsM", {HistType::kTH2F, {axisIVMSel, axisTPCNCls}}); - Selections.add("Selections/Muon/Mass/Subleading/hTPCChi2NClsVsM", "hTPCChi2NClsVsM", {HistType::kTH2F, {axisIVMSel, axisChi2}}); - Selections.add("Selections/Muon/Mass/Subleading/hTPCNClsCrossedRowsVsM", "hTPCNClsCrossedRowsVsM", {HistType::kTH2F, {axisIVMSel, axisTPCCrossed}}); - - Selections.add("Selections/Muon/Rapidity/Leading/hITSNClsVsY", "hITSNClsVsY", {HistType::kTH2F, {axisEta, axisITSNCls}}); - Selections.add("Selections/Muon/Rapidity/Leading/hITSChi2NClsVsY", "hITSChi2NClsVsY", {HistType::kTH2F, {axisEta, axisChi2}}); - Selections.add("Selections/Muon/Rapidity/Leading/hTPCNClsVsY", "hTPCNClsVsY", {HistType::kTH2F, {axisEta, axisTPCNCls}}); - Selections.add("Selections/Muon/Rapidity/Leading/hTPCChi2NClsVsY", "hTPCChi2NClsVsY", {HistType::kTH2F, {axisEta, axisChi2}}); - Selections.add("Selections/Muon/Rapidity/Leading/hTPCNClsCrossedRowsVsY", "hTPCNClsCrossedRowsVsY", {HistType::kTH2F, {axisEta, axisTPCCrossed}}); - Selections.add("Selections/Muon/Rapidity/Subleading/hITSNClsVsY", "hITSNClsVsY", {HistType::kTH2F, {axisEta, axisITSNCls}}); - Selections.add("Selections/Muon/Rapidity/Subleading/hITSChi2NClsVsY", "hITSChi2NClsVsY", {HistType::kTH2F, {axisEta, axisChi2}}); - Selections.add("Selections/Muon/Rapidity/Subleading/hTPCNClsVsY", "hTPCNClsVsY", {HistType::kTH2F, {axisEta, axisTPCNCls}}); - Selections.add("Selections/Muon/Rapidity/Subleading/hTPCChi2NClsVsY", "hTPCChi2NClsVsY", {HistType::kTH2F, {axisEta, axisChi2}}); - Selections.add("Selections/Muon/Rapidity/Subleading/hTPCNClsCrossedRowsVsY", "hTPCNClsCrossedRowsVsY", {HistType::kTH2F, {axisEta, axisTPCCrossed}}); - - Selections.add("Selections/Muon/Pt/Leading/hITSNClsVsPt", "hITSNClsVsPt", {HistType::kTH2F, {axisPt, axisITSNCls}}); - Selections.add("Selections/Muon/Pt/Leading/hITSChi2NClsVsPt", "hITSChi2NClsVsPt", {HistType::kTH2F, {axisPt, axisChi2}}); - Selections.add("Selections/Muon/Pt/Leading/hTPCNClsVsPt", "hTPCNClsVsPt", {HistType::kTH2F, {axisPt, axisTPCNCls}}); - Selections.add("Selections/Muon/Pt/Leading/hTPCChi2NClsVsPt", "hTPCChi2NClsVsPt", {HistType::kTH2F, {axisPt, axisChi2}}); - Selections.add("Selections/Muon/Pt/Leading/hTPCNClsCrossedRowsVsPt", "hTPCNClsCrossedRowsVsPt", {HistType::kTH2F, {axisPt, axisTPCCrossed}}); - Selections.add("Selections/Muon/Pt/Subleading/hITSNClsVsPt", "hITSNClsVsPt", {HistType::kTH2F, {axisPt, axisITSNCls}}); - Selections.add("Selections/Muon/Pt/Subleading/hITSChi2NClsVsPt", "hITSChi2NClsVsPt", {HistType::kTH2F, {axisPt, axisChi2}}); - Selections.add("Selections/Muon/Pt/Subleading/hTPCNClsVsPt", "hTPCNClsVsPt", {HistType::kTH2F, {axisPt, axisTPCNCls}}); - Selections.add("Selections/Muon/Pt/Subleading/hTPCChi2NClsVsPt", "hTPCChi2NClsVsPt", {HistType::kTH2F, {axisPt, axisChi2}}); - Selections.add("Selections/Muon/Pt/Subleading/hTPCNClsCrossedRowsVsPt", "hTPCNClsCrossedRowsVsPt", {HistType::kTH2F, {axisPt, axisTPCCrossed}}); - - // PVContributors histograms - PVContributors.add("PVContributors/hTrackPt", "hTrackPt", {HistType::kTH1F, {axisPt}}); - PVContributors.add("PVContributors/hTrackEta", "hTrackEta", {HistType::kTH1F, {axisEta}}); - PVContributors.add("PVContributors/hTrackPhi", "hTrackPhi", {HistType::kTH1F, {axisPhi}}); - PVContributors.add("PVContributors/hTPCNClsFindable", "hTPCNClsFindable", {HistType::kTH1F, {axisTPC}}); - PVContributors.add("PVContributors/hTPCNClsFindableMinusFound", "hTPCNClsFindableMinusFound", {HistType::kTH1F, {axisTPC}}); - PVContributors.add("PVContributors/PID/hTPCVsP", "hTPCVsP", {HistType::kTH2F, {axisP, axisTPC}}); - PVContributors.add("PVContributors/PID/hTPCVsPt", "hTPCVsPt", {HistType::kTH2F, {axisPt, axisTPC}}); - PVContributors.add("PVContributors/PID/hTPCVsPhi", "hTPCVsPhi", {HistType::kTH2F, {axisPhi, axisTPC}}); - PVContributors.add("PVContributors/PID/hTPCVsEta", "hTPCVsEta", {HistType::kTH2F, {axisEta, axisTPC}}); - PVContributors.add("PVContributors/PID/hBetaTOFVsP", "hBetaTOFVsP", {HistType::kTH2F, {axisP, axisBetaTOF}}); - - // TG histograms - TG.add("TG/hTrackPt1", "hTrackPt1", {HistType::kTH1F, {axisPt}}); - TG.add("TG/hTrackEta1", "hTrackEta1", {HistType::kTH1F, {axisEta}}); - TG.add("TG/hTrackPhi1", "hTrackPhi1", {HistType::kTH1F, {axisPhi}}); - TG.add("TG/hTrackPt2", "hTrackPt2", {HistType::kTH1F, {axisPt}}); - TG.add("TG/hTrackEta2", "hTrackEta2", {HistType::kTH1F, {axisEta}}); - TG.add("TG/hTrackPhi2", "hTrackPhi2", {HistType::kTH1F, {axisPhi}}); - TG.add("TG/hTPCNClsFindable", "hTPCNClsFindable", {HistType::kTH1F, {axisTPC}}); - TG.add("TG/hTPCNClsFindableMinusFound", "hTPCNClsFindableMinusFound", {HistType::kTH1F, {axisTPC}}); - TG.add("TG/PID/hTPCVsP", "hTPCVsP", {HistType::kTH2F, {axisP, axisTPC}}); - TG.add("TG/PID/hTPCVsPt", "hTPCVsPt", {HistType::kTH2F, {axisPt, axisTPC}}); - TG.add("TG/PID/hTPCVsPhi", "hTPCVsPhi", {HistType::kTH2F, {axisPhi, axisTPC}}); - TG.add("TG/PID/hTPCVsEta", "hTPCVsEta", {HistType::kTH2F, {axisEta, axisTPC}}); - TG.add("TG/PID/hBetaTOFVsP", "hBetaTOFVsP", {HistType::kTH2F, {axisP, axisBetaTOF}}); - TG.add("TG/TPC/TPCNegVsPosSignal", "TPCNegVsPosSignal", HistType::kTH2F, {axisTPC, axisTPC}); - - // TGmu histograms - TGmu.add("TGmu/hTrackPt1", "hTrackPt1", {HistType::kTH1F, {axisPt}}); - TGmu.add("TGmu/hTrackEta1", "hTrackEta1", {HistType::kTH1F, {axisEta}}); - TGmu.add("TGmu/hTrackPhi1", "hTrackPhi1", {HistType::kTH1F, {axisPhi}}); - TGmu.add("TGmu/hTrackPt2", "hTrackPt2", {HistType::kTH1F, {axisPt}}); - TGmu.add("TGmu/hTrackEta2", "hTrackEta2", {HistType::kTH1F, {axisEta}}); - TGmu.add("TGmu/hTrackPhi2", "hTrackPhi2", {HistType::kTH1F, {axisPhi}}); - TGmu.add("TGmu/TPCNegVsPosSignal", "TPCNegVsPosSignal", HistType::kTH2F, {axisTPC, axisTPC}); - TGmu.add("TGmu/PID/hTPCVsP", "hTPCVsP", {HistType::kTH2F, {axisP, axisTPC}}); - TGmu.add("TGmu/PID/hTPCVsPt", "hTPCVsPt", {HistType::kTH2F, {axisPt, axisTPC}}); - TGmu.add("TGmu/PID/hTPCVsPhi", "hTPCVsPhi", {HistType::kTH2F, {axisPhi, axisTPC}}); - TGmu.add("TGmu/PID/hTPCVsEta", "hTPCVsEta", {HistType::kTH2F, {axisEta, axisTPC}}); - TGmu.add("TGmu/PID/hBetaTOFVsP", "hBetaTOFVsP", {HistType::kTH2F, {axisP, axisBetaTOF}}); - - // TGmuCand histograms - TGmuCand.add("TGmuCand/hTrackPt1", "hTrackPt1", {HistType::kTH1F, {axisPt}}); - TGmuCand.add("TGmuCand/hTrackEta1", "hTrackEta1", {HistType::kTH1F, {axisEta}}); - TGmuCand.add("TGmuCand/hTrackPhi1", "hTrackPhi1", {HistType::kTH1F, {axisPhi}}); - TGmuCand.add("TGmuCand/hTrackPt2", "hTrackPt2", {HistType::kTH1F, {axisPt}}); - TGmuCand.add("TGmuCand/hTrackEta2", "hTrackEta2", {HistType::kTH1F, {axisEta}}); - TGmuCand.add("TGmuCand/hTrackPhi2", "hTrackPhi2", {HistType::kTH1F, {axisPhi}}); - TGmuCand.add("TGmuCand/hPairPt", "hPairPt", {HistType::kTH1F, {axisPt}}); - TGmuCand.add("TGmuCand/hPairIVM", "hPairIVM", {HistType::kTH1F, {axisIVMWide}}); - TGmuCand.add("TGmuCand/hJpsiPt", "hJpsiPt", {HistType::kTH1F, {axisPt}}); - TGmuCand.add("TGmuCand/hJpsiPt2", "hJpsiPt2", {HistType::kTH1F, {axisPt2}}); - TGmuCand.add("TGmuCand/XnXn/hJpsiPt2", "hJpsiPt2", {HistType::kTH1F, {axisPt2}}); - TGmuCand.add("TGmuCand/OnOn/hJpsiPt2", "hJpsiPt2", {HistType::kTH1F, {axisPt2}}); - TGmuCand.add("TGmuCand/OnXn/hJpsiPt2", "hJpsiPt2", {HistType::kTH1F, {axisPt2}}); - TGmuCand.add("TGmuCand/XnOn/hJpsiPt2", "hJpsiPt2", {HistType::kTH1F, {axisPt2}}); - TGmuCand.add("TGmuCand/hJpsiPt2wide", "hJpsiPt2wide", {HistType::kTH1F, {axisPt2}}); - TGmuCand.add("TGmuCand/XnXn/hJpsiPt2wide", "hJpsiPt2wide", {HistType::kTH1F, {axisPt2wide}}); - TGmuCand.add("TGmuCand/OnOn/hJpsiPt2wide", "hJpsiPt2wide", {HistType::kTH1F, {axisPt2wide}}); - TGmuCand.add("TGmuCand/OnXn/hJpsiPt2wide", "hJpsiPt2wide", {HistType::kTH1F, {axisPt2wide}}); - TGmuCand.add("TGmuCand/XnOn/hJpsiPt2wide", "hJpsiPt2wide", {HistType::kTH1F, {axisPt2wide}}); - TGmuCand.add("TGmuCand/hJpsiRap", "hJpsiRap", {HistType::kTH1F, {axisEta}}); - TGmuCand.add("TGmuCand/TPCNegVsPosSignal", "TPCNegVsPosSignal", HistType::kTH2F, {axisTPC, axisTPC}); - TGmuCand.add("TGmuCand/PID/hTPCVsP", "hTPCVsP", {HistType::kTH2F, {axisP, axisTPC}}); - TGmuCand.add("TGmuCand/PID/hTPCVsPt", "hTPCVsPt", {HistType::kTH2F, {axisPt, axisTPC}}); - TGmuCand.add("TGmuCand/PID/hTPCVsPhi", "hTPCVsPhi", {HistType::kTH2F, {axisPhi, axisTPC}}); - TGmuCand.add("TGmuCand/PID/hTPCVsEta", "hTPCVsEta", {HistType::kTH2F, {axisEta, axisTPC}}); - TGmuCand.add("TGmuCand/PID/hBetaTOFVsP", "hBetaTOFVsP", {HistType::kTH2F, {axisP, axisBetaTOF}}); - - // TGel histograms - TGel.add("TGel/hTrackPt1", "hTrackPt1", {HistType::kTH1F, {axisPt}}); - TGel.add("TGel/hTrackEta1", "hTrackEta1", {HistType::kTH1F, {axisEta}}); - TGel.add("TGel/hTrackPhi1", "hTrackPhi1", {HistType::kTH1F, {axisPhi}}); - TGel.add("TGel/hTrackPt2", "hTrackPt2", {HistType::kTH1F, {axisPt}}); - TGel.add("TGel/hTrackEta2", "hTrackEta2", {HistType::kTH1F, {axisEta}}); - TGel.add("TGel/hTrackPhi2", "hTrackPhi2", {HistType::kTH1F, {axisPhi}}); - TGel.add("TGel/TPCNegVsPosSignal", "TPCNegVsPosSignal", HistType::kTH2F, {axisTPC, axisTPC}); - TGel.add("TGel/PID/hTPCVsP", "hTPCVsP", {HistType::kTH2F, {axisP, axisTPC}}); - TGel.add("TGel/PID/hTPCVsPt", "hTPCVsPt", {HistType::kTH2F, {axisPt, axisTPC}}); - TGel.add("TGel/PID/hTPCVsPhi", "hTPCVsPhi", {HistType::kTH2F, {axisPhi, axisTPC}}); - TGel.add("TGel/PID/hTPCVsEta", "hTPCVsEta", {HistType::kTH2F, {axisEta, axisTPC}}); - TGel.add("TGel/PID/hBetaTOFVsP", "hBetaTOFVsP", {HistType::kTH2F, {axisP, axisBetaTOF}}); - - // TGelCand histograms - TGelCand.add("TGelCand/hTrackPt1", "hTrackPt1", {HistType::kTH1F, {axisPt}}); - TGelCand.add("TGelCand/hTrackEta1", "hTrackEta1", {HistType::kTH1F, {axisEta}}); - TGelCand.add("TGelCand/hTrackPhi1", "hTrackPhi1", {HistType::kTH1F, {axisPhi}}); - TGelCand.add("TGelCand/hTrackPt2", "hTrackPt2", {HistType::kTH1F, {axisPt}}); - TGelCand.add("TGelCand/hTrackEta2", "hTrackEta2", {HistType::kTH1F, {axisEta}}); - TGelCand.add("TGelCand/hTrackPhi2", "hTrackPhi2", {HistType::kTH1F, {axisPhi}}); - TGelCand.add("TGelCand/TPCNegVsPosSignal", "TPCNegVsPosSignal", HistType::kTH2F, {axisTPC, axisTPC}); - TGelCand.add("TGelCand/hPairPt", "hPairPt", {HistType::kTH1F, {axisPt}}); - TGelCand.add("TGelCand/hPairIVM", "hPairIVM", {HistType::kTH1F, {axisIVMWide}}); - TGelCand.add("TGelCand/hJpsiPt", "hJpsiPt", {HistType::kTH1F, {axisPt}}); - TGelCand.add("TGelCand/hJpsiRap", "hJpsiRap", {HistType::kTH1F, {axisEta}}); - TGelCand.add("TGelCand/PID/hTPCVsP", "hTPCVsP", {HistType::kTH2F, {axisP, axisTPC}}); - TGelCand.add("TGelCand/PID/hTPCVsPt", "hTPCVsPt", {HistType::kTH2F, {axisPt, axisTPC}}); - TGelCand.add("TGelCand/PID/hTPCVsPhi", "hTPCVsPhi", {HistType::kTH2F, {axisPhi, axisTPC}}); - TGelCand.add("TGelCand/PID/hTPCVsEta", "hTPCVsEta", {HistType::kTH2F, {axisEta, axisTPC}}); - TGelCand.add("TGelCand/PID/hBetaTOFVsP", "hBetaTOFVsP", {HistType::kTH2F, {axisP, axisBetaTOF}}); - - // TGp histograms - TGp.add("TGp/hTrackPt1", "hTrackPt1", {HistType::kTH1F, {axisPt}}); - TGp.add("TGp/hTrackEta1", "hTrackEta1", {HistType::kTH1F, {axisEta}}); - TGp.add("TGp/hTrackPhi1", "hTrackPhi1", {HistType::kTH1F, {axisPhi}}); - TGp.add("TGp/hTrackPt2", "hTrackPt2", {HistType::kTH1F, {axisPt}}); - TGp.add("TGp/hTrackEta2", "hTrackEta2", {HistType::kTH1F, {axisEta}}); - TGp.add("TGp/hTrackPhi2", "hTrackPhi2", {HistType::kTH1F, {axisPhi}}); - TGp.add("TGp/PID/hTPCVsP", "hTPCVsP", {HistType::kTH2F, {axisP, axisTPC}}); - TGp.add("TGp/PID/hTPCVsPt", "hTPCVsPt", {HistType::kTH2F, {axisPt, axisTPC}}); - TGp.add("TGp/PID/hTPCVsPhi", "hTPCVsPhi", {HistType::kTH2F, {axisPhi, axisTPC}}); - TGp.add("TGp/PID/hTPCVsEta", "hTPCVsEta", {HistType::kTH2F, {axisEta, axisTPC}}); - TGp.add("TGp/PID/hBetaTOFVsP", "hBetaTOFVsP", {HistType::kTH2F, {axisP, axisBetaTOF}}); - - // TGpCand histograms - TGpCand.add("TGpCand/hTrackPt1", "hTrackPt1", {HistType::kTH1F, {axisPt}}); - TGpCand.add("TGpCand/hTrackEta1", "hTrackEta1", {HistType::kTH1F, {axisEta}}); - TGpCand.add("TGpCand/hTrackPhi1", "hTrackPhi1", {HistType::kTH1F, {axisPhi}}); - TGpCand.add("TGpCand/hTrackPt2", "hTrackPt2", {HistType::kTH1F, {axisPt}}); - TGpCand.add("TGpCand/hTrackEta2", "hTrackEta2", {HistType::kTH1F, {axisEta}}); - TGpCand.add("TGpCand/hTrackPhi2", "hTrackPhi2", {HistType::kTH1F, {axisPhi}}); - TGpCand.add("TGpCand/hPairPt", "hPairPt", {HistType::kTH1F, {axisPt}}); - TGpCand.add("TGpCand/hPairIVM", "hPairIVM", {HistType::kTH1F, {axisIVMWide}}); - TGpCand.add("TGpCand/hJpsiPt", "hJpsiPt", {HistType::kTH1F, {axisPt}}); - TGpCand.add("TGpCand/hJpsiRap", "hJpsiRap", {HistType::kTH1F, {axisEta}}); - TGpCand.add("TGpCand/PID/hTPCVsP", "hTPCVsP", {HistType::kTH2F, {axisP, axisTPC}}); - TGpCand.add("TGpCand/PID/hTPCVsPt", "hTPCVsPt", {HistType::kTH2F, {axisPt, axisTPC}}); - TGpCand.add("TGpCand/PID/hTPCVsPhi", "hTPCVsPhi", {HistType::kTH2F, {axisPhi, axisTPC}}); - TGpCand.add("TGpCand/PID/hTPCVsEta", "hTPCVsEta", {HistType::kTH2F, {axisEta, axisTPC}}); - TGpCand.add("TGpCand/PID/hBetaTOFVsP", "hBetaTOFVsP", {HistType::kTH2F, {axisP, axisBetaTOF}}); - - // JPsiToEl histograms - JPsiToEl.add("JPsiToEl/Coherent/hPt", "Pt of J/Psi ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Coherent/hPt1", "pT of track 1 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Coherent/hPt2", "pT of track 2 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Coherent/hEta1", "eta of track 1 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Coherent/hEta2", "eta of track 2 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Coherent/hPhi1", "phi of track 1 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Coherent/hPhi2", "phi of track 2 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Coherent/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToEl.add("JPsiToEl/Coherent/hRap", "Rap of J/Psi ; y {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Coherent/hEta", "Eta of J/Psi ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Coherent/hPhi", "Phi of J/Psi ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Coherent/XnXn/hPt", "Pt of J/Psi ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Coherent/XnXn/hPt1", "pT of track 1 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Coherent/XnXn/hPt2", "pT of track 2 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Coherent/XnXn/hEta1", "eta of track 1 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Coherent/XnXn/hEta2", "eta of track 2 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Coherent/XnXn/hPhi1", "phi of track 1 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Coherent/XnXn/hPhi2", "phi of track 2 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Coherent/XnXn/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToEl.add("JPsiToEl/Coherent/XnXn/hRap", "Rap of J/Psi ; y {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Coherent/XnXn/hEta", "Eta of J/Psi ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Coherent/XnXn/hPhi", "Phi of J/Psi ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Coherent/OnOn/hPt", "Pt of J/Psi ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Coherent/OnOn/hPt1", "pT of track 1 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Coherent/OnOn/hPt2", "pT of track 2 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Coherent/OnOn/hEta1", "eta of track 1 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Coherent/OnOn/hEta2", "eta of track 2 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Coherent/OnOn/hPhi1", "phi of track 1 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Coherent/OnOn/hPhi2", "phi of track 2 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Coherent/OnOn/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToEl.add("JPsiToEl/Coherent/OnOn/hRap", "Rap of J/Psi ; y {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Coherent/OnOn/hEta", "Eta of J/Psi ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Coherent/OnOn/hPhi", "Phi of J/Psi ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Coherent/OnXn/hPt", "Pt of J/Psi ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Coherent/OnXn/hPt1", "pT of track 1 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Coherent/OnXn/hPt2", "pT of track 2 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Coherent/OnXn/hEta1", "eta of track 1 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Coherent/OnXn/hEta2", "eta of track 2 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Coherent/OnXn/hPhi1", "phi of track 1 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Coherent/OnXn/hPhi2", "phi of track 2 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Coherent/OnXn/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToEl.add("JPsiToEl/Coherent/OnXn/hRap", "Rap of J/Psi ; y {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Coherent/OnXn/hEta", "Eta of J/Psi ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Coherent/OnXn/hPhi", "Phi of J/Psi ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Coherent/XnOn/hPt", "Pt of J/Psi ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Coherent/XnOn/hPt1", "pT of track 1 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Coherent/XnOn/hPt2", "pT of track 2 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Coherent/XnOn/hEta1", "eta of track 1 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Coherent/XnOn/hEta2", "eta of track 2 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Coherent/XnOn/hPhi1", "phi of track 1 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Coherent/XnOn/hPhi2", "phi of track 2 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Coherent/XnOn/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToEl.add("JPsiToEl/Coherent/XnOn/hRap", "Rap of J/Psi ; y {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Coherent/XnOn/hEta", "Eta of J/Psi ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Coherent/XnOn/hPhi", "Phi of J/Psi ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Coherent/PID/hTPCVsP", "hTPCVsP", {HistType::kTH2F, {axisP, axisTPC}}); - JPsiToEl.add("JPsiToEl/Coherent/PID/hTPCVsPt", "hTPCVsPt", {HistType::kTH2F, {axisPt, axisTPC}}); - JPsiToEl.add("JPsiToEl/Coherent/PID/hTPCVsPhi", "hTPCVsPhi", {HistType::kTH2F, {axisPhi, axisTPC}}); - JPsiToEl.add("JPsiToEl/Coherent/PID/hTPCVsEta", "hTPCVsEta", {HistType::kTH2F, {axisEta, axisTPC}}); - JPsiToEl.add("JPsiToEl/Coherent/PID/hBetaTOFVsP", "hBetaTOFVsP", {HistType::kTH2F, {axisP, axisBetaTOF}}); - - JPsiToEl.add("JPsiToEl/Incoherent/hPt", "Pt of J/Psi ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Incoherent/hPt1", "pT of track 1 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Incoherent/hPt2", "pT of track 2 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Incoherent/hEta1", "eta of track 1 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Incoherent/hEta2", "eta of track 2 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Incoherent/hPhi1", "phi of track 1 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Incoherent/hPhi2", "phi of track 2 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Incoherent/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToEl.add("JPsiToEl/NotCoherent/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToEl.add("JPsiToEl/Incoherent/hRap", "Rap of J/Psi ; y {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Incoherent/hEta", "Eta of J/Psi ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Incoherent/hPhi", "Phi of J/Psi ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Incoherent/XnXn/hPt", "Pt of J/Psi ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Incoherent/XnXn/hPt1", "pT of track 1 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Incoherent/XnXn/hPt2", "pT of track 2 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Incoherent/XnXn/hEta1", "eta of track 1 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Incoherent/XnXn/hEta2", "eta of track 2 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Incoherent/XnXn/hPhi1", "phi of track 1 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Incoherent/XnXn/hPhi2", "phi of track 2 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Incoherent/XnXn/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToEl.add("JPsiToEl/NotCoherent/XnXn/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToEl.add("JPsiToEl/Incoherent/XnXn/hRap", "Rap of J/Psi ; y {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Incoherent/XnXn/hEta", "Eta of J/Psi ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Incoherent/XnXn/hPhi", "Phi of J/Psi ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Incoherent/OnOn/hPt", "Pt of J/Psi ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Incoherent/OnOn/hPt1", "pT of track 1 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Incoherent/OnOn/hPt2", "pT of track 2 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Incoherent/OnOn/hEta1", "eta of track 1 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Incoherent/OnOn/hEta2", "eta of track 2 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Incoherent/OnOn/hPhi1", "phi of track 1 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Incoherent/OnOn/hPhi2", "phi of track 2 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Incoherent/OnOn/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToEl.add("JPsiToEl/NotCoherent/OnOn/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToEl.add("JPsiToEl/Incoherent/OnOn/hRap", "Rap of J/Psi ; y {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Incoherent/OnOn/hEta", "Eta of J/Psi ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Incoherent/OnOn/hPhi", "Phi of J/Psi ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Incoherent/OnXn/hPt", "Pt of J/Psi ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Incoherent/OnXn/hPt1", "pT of track 1 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Incoherent/OnXn/hPt2", "pT of track 2 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Incoherent/OnXn/hEta1", "eta of track 1 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Incoherent/OnXn/hEta2", "eta of track 2 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Incoherent/OnXn/hPhi1", "phi of track 1 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Incoherent/OnXn/hPhi2", "phi of track 2 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Incoherent/OnXn/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToEl.add("JPsiToEl/NotCoherent/OnXn/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToEl.add("JPsiToEl/Incoherent/OnXn/hRap", "Rap of J/Psi ; y {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Incoherent/OnXn/hEta", "Eta of J/Psi ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Incoherent/OnXn/hPhi", "Phi of J/Psi ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Incoherent/XnOn/hPt", "Pt of J/Psi ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Incoherent/XnOn/hPt1", "pT of track 1 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Incoherent/XnOn/hPt2", "pT of track 2 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToEl.add("JPsiToEl/Incoherent/XnOn/hEta1", "eta of track 1 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Incoherent/XnOn/hEta2", "eta of track 2 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Incoherent/XnOn/hPhi1", "phi of track 1 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Incoherent/XnOn/hPhi2", "phi of track 2 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Incoherent/XnOn/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToEl.add("JPsiToEl/NotCoherent/XnOn/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToEl.add("JPsiToEl/Incoherent/XnOn/hRap", "Rap of J/Psi ; y {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Incoherent/XnOn/hEta", "Eta of J/Psi ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToEl.add("JPsiToEl/Incoherent/XnOn/hPhi", "Phi of J/Psi ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToEl.add("JPsiToEl/Incoherent/PID/hTPCVsP", "hTPCVsP", {HistType::kTH2F, {axisP, axisTPC}}); - JPsiToEl.add("JPsiToEl/Incoherent/PID/hTPCVsPt", "hTPCVsPt", {HistType::kTH2F, {axisPt, axisTPC}}); - JPsiToEl.add("JPsiToEl/Incoherent/PID/hTPCVsPhi", "hTPCVsPhi", {HistType::kTH2F, {axisPhi, axisTPC}}); - JPsiToEl.add("JPsiToEl/Incoherent/PID/hTPCVsEta", "hTPCVsEta", {HistType::kTH2F, {axisEta, axisTPC}}); - JPsiToEl.add("JPsiToEl/Incoherent/PID/hBetaTOFVsP", "hBetaTOFVsP", {HistType::kTH2F, {axisP, axisBetaTOF}}); - - // JPsiToMu histograms - JPsiToMu.add("JPsiToMu/Coherent/hPt", "Pt of J/Psi ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Coherent/hPt1", "pT of track 1 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Coherent/hPt2", "pT of track 2 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Coherent/hEta1", "eta of track 1 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Coherent/hEta2", "eta of track 2 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Coherent/hPhi1", "phi of track 1 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Coherent/hPhi2", "phi of track 2 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Coherent/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToMu.add("JPsiToMu/Coherent/hRap", "Rap of J/Psi ; y {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Coherent/hEta", "Eta of J/Psi ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Coherent/hPhi", "Phi of J/Psi ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Coherent/XnXn/hPt", "Pt of J/Psi ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Coherent/XnXn/hPt1", "pT of track 1 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Coherent/XnXn/hPt2", "pT of track 2 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Coherent/XnXn/hEta1", "eta of track 1 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Coherent/XnXn/hEta2", "eta of track 2 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Coherent/XnXn/hPhi1", "phi of track 1 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Coherent/XnXn/hPhi2", "phi of track 2 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Coherent/XnXn/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToMu.add("JPsiToMu/Coherent/XnXn/hRap", "Rap of J/Psi ; y {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Coherent/XnXn/hEta", "Eta of J/Psi ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Coherent/XnXn/hPhi", "Phi of J/Psi ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Coherent/OnOn/hPt", "Pt of J/Psi ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Coherent/OnOn/hPt1", "pT of track 1 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Coherent/OnOn/hPt2", "pT of track 2 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Coherent/OnOn/hEta1", "eta of track 1 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Coherent/OnOn/hEta2", "eta of track 2 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Coherent/OnOn/hPhi1", "phi of track 1 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Coherent/OnOn/hPhi2", "phi of track 2 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Coherent/OnOn/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToMu.add("JPsiToMu/Coherent/OnOn/hRap", "Rap of J/Psi ; y {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Coherent/OnOn/hEta", "Eta of J/Psi ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Coherent/OnOn/hPhi", "Phi of J/Psi ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Coherent/OnXn/hPt", "Pt of J/Psi ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Coherent/OnXn/hPt1", "pT of track 1 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Coherent/OnXn/hPt2", "pT of track 2 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Coherent/OnXn/hEta1", "eta of track 1 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Coherent/OnXn/hEta2", "eta of track 2 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Coherent/OnXn/hPhi1", "phi of track 1 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Coherent/OnXn/hPhi2", "phi of track 2 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Coherent/OnXn/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToMu.add("JPsiToMu/Coherent/OnXn/hRap", "Rap of J/Psi ; y {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Coherent/OnXn/hEta", "Eta of J/Psi ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Coherent/OnXn/hPhi", "Phi of J/Psi ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Coherent/XnOn/hPt", "Pt of J/Psi ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Coherent/XnOn/hPt1", "pT of track 1 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Coherent/XnOn/hPt2", "pT of track 2 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Coherent/XnOn/hEta1", "eta of track 1 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Coherent/XnOn/hEta2", "eta of track 2 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Coherent/XnOn/hPhi1", "phi of track 1 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Coherent/XnOn/hPhi2", "phi of track 2 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Coherent/XnOn/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToMu.add("JPsiToMu/Coherent/XnOn/hRap", "Rap of J/Psi ; y {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Coherent/XnOn/hEta", "Eta of J/Psi ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Coherent/XnOn/hPhi", "Phi of J/Psi ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Coherent/PID/hTPCVsP", "hTPCVsP", {HistType::kTH2F, {axisP, axisTPC}}); - JPsiToMu.add("JPsiToMu/Coherent/PID/hTPCVsPt", "hTPCVsPt", {HistType::kTH2F, {axisPt, axisTPC}}); - JPsiToMu.add("JPsiToMu/Coherent/PID/hTPCVsPhi", "hTPCVsPhi", {HistType::kTH2F, {axisPhi, axisTPC}}); - JPsiToMu.add("JPsiToMu/Coherent/PID/hTPCVsEta", "hTPCVsEta", {HistType::kTH2F, {axisEta, axisTPC}}); - JPsiToMu.add("JPsiToMu/Coherent/PID/hBetaTOFVsP", "hBetaTOFVsP", {HistType::kTH2F, {axisP, axisBetaTOF}}); - - JPsiToMu.add("JPsiToMu/Incoherent/hPt", "Pt of J/Psi ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Incoherent/hPt1", "pT of track 1 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Incoherent/hPt2", "pT of track 2 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Incoherent/hEta1", "eta of track 1 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Incoherent/hEta2", "eta of track 2 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Incoherent/hPhi1", "phi of track 1 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Incoherent/hPhi2", "phi of track 2 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Incoherent/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToMu.add("JPsiToMu/NotCoherent/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToMu.add("JPsiToMu/Incoherent/hRap", "Rap of J/Psi ; y {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Incoherent/hEta", "Eta of J/Psi ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Incoherent/hPhi", "Phi of J/Psi ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Incoherent/XnXn/hPt", "Pt of J/Psi ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Incoherent/XnXn/hPt1", "pT of track 1 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Incoherent/XnXn/hPt2", "pT of track 2 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Incoherent/XnXn/hEta1", "eta of track 1 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Incoherent/XnXn/hEta2", "eta of track 2 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Incoherent/XnXn/hPhi1", "phi of track 1 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Incoherent/XnXn/hPhi2", "phi of track 2 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Incoherent/XnXn/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToMu.add("JPsiToMu/NotCoherent/XnXn/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToMu.add("JPsiToMu/Incoherent/XnXn/hRap", "Rap of J/Psi ; y {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Incoherent/XnXn/hEta", "Eta of J/Psi ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Incoherent/XnXn/hPhi", "Phi of J/Psi ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Incoherent/OnOn/hPt", "Pt of J/Psi ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Incoherent/OnOn/hPt1", "pT of track 1 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Incoherent/OnOn/hPt2", "pT of track 2 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Incoherent/OnOn/hEta1", "eta of track 1 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Incoherent/OnOn/hEta2", "eta of track 2 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Incoherent/OnOn/hPhi1", "phi of track 1 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Incoherent/OnOn/hPhi2", "phi of track 2 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Incoherent/OnOn/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToMu.add("JPsiToMu/NotCoherent/OnOn/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToMu.add("JPsiToMu/Incoherent/OnOn/hRap", "Rap of J/Psi ; y {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Incoherent/OnOn/hEta", "Eta of J/Psi ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Incoherent/OnOn/hPhi", "Phi of J/Psi ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Incoherent/OnXn/hPt", "Pt of J/Psi ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Incoherent/OnXn/hPt1", "pT of track 1 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Incoherent/OnXn/hPt2", "pT of track 2 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Incoherent/OnXn/hEta1", "eta of track 1 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Incoherent/OnXn/hEta2", "eta of track 2 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Incoherent/OnXn/hPhi1", "phi of track 1 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Incoherent/OnXn/hPhi2", "phi of track 2 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Incoherent/OnXn/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToMu.add("JPsiToMu/NotCoherent/OnXn/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToMu.add("JPsiToMu/Incoherent/OnXn/hRap", "Rap of J/Psi ; y {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Incoherent/OnXn/hEta", "Eta of J/Psi ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Incoherent/OnXn/hPhi", "Phi of J/Psi ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Incoherent/XnOn/hPt", "Pt of J/Psi ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Incoherent/XnOn/hPt1", "pT of track 1 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Incoherent/XnOn/hPt2", "pT of track 2 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToMu.add("JPsiToMu/Incoherent/XnOn/hEta1", "eta of track 1 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Incoherent/XnOn/hEta2", "eta of track 2 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Incoherent/XnOn/hPhi1", "phi of track 1 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Incoherent/XnOn/hPhi2", "phi of track 2 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Incoherent/XnOn/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToMu.add("JPsiToMu/NotCoherent/XnOn/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToMu.add("JPsiToMu/Incoherent/XnOn/hRap", "Rap of J/Psi ; y {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Incoherent/XnOn/hEta", "Eta of J/Psi ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToMu.add("JPsiToMu/Incoherent/XnOn/hPhi", "Phi of J/Psi ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToMu.add("JPsiToMu/Incoherent/PID/hTPCVsP", "hTPCVsP", {HistType::kTH2F, {axisP, axisTPC}}); - JPsiToMu.add("JPsiToMu/Incoherent/PID/hTPCVsPt", "hTPCVsPt", {HistType::kTH2F, {axisPt, axisTPC}}); - JPsiToMu.add("JPsiToMu/Incoherent/PID/hTPCVsPhi", "hTPCVsPhi", {HistType::kTH2F, {axisPhi, axisTPC}}); - JPsiToMu.add("JPsiToMu/Incoherent/PID/hTPCVsEta", "hTPCVsEta", {HistType::kTH2F, {axisEta, axisTPC}}); - JPsiToMu.add("JPsiToMu/Incoherent/PID/hBetaTOFVsP", "hBetaTOFVsP", {HistType::kTH2F, {axisP, axisBetaTOF}}); - - // JPsiToP histograms - JPsiToP.add("JPsiToP/Coherent/hPt", "Pt of J/Psi ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToP.add("JPsiToP/Coherent/hPt1", "pT of track 1 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToP.add("JPsiToP/Coherent/hPt2", "pT of track 2 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToP.add("JPsiToP/Coherent/hEta1", "eta of track 1 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToP.add("JPsiToP/Coherent/hEta2", "eta of track 2 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToP.add("JPsiToP/Coherent/hPhi1", "phi of track 1 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToP.add("JPsiToP/Coherent/hPhi2", "phi of track 2 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToP.add("JPsiToP/Coherent/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToP.add("JPsiToP/Coherent/hRap", "Rap of J/Psi ; y {-]", {HistType::kTH1F, {axisEta}}); - JPsiToP.add("JPsiToP/Coherent/hEta", "Eta of J/Psi ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToP.add("JPsiToP/Coherent/hPhi", "Phi of J/Psi ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToP.add("JPsiToP/Coherent/PID/hTPCVsP", "hTPCVsP", {HistType::kTH2F, {axisP, axisTPC}}); - JPsiToP.add("JPsiToP/Coherent/PID/hTPCVsPt", "hTPCVsPt", {HistType::kTH2F, {axisPt, axisTPC}}); - JPsiToP.add("JPsiToP/Coherent/PID/hTPCVsPhi", "hTPCVsPhi", {HistType::kTH2F, {axisPhi, axisTPC}}); - JPsiToP.add("JPsiToP/Coherent/PID/hTPCVsEta", "hTPCVsEta", {HistType::kTH2F, {axisEta, axisTPC}}); - JPsiToP.add("JPsiToP/Coherent/PID/hBetaTOFVsP", "hBetaTOFVsP", {HistType::kTH2F, {axisP, axisBetaTOF}}); - - JPsiToP.add("JPsiToP/Incoherent/hPt", "Pt of J/Psi ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToP.add("JPsiToP/Incoherent/hPt1", "pT of track 1 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToP.add("JPsiToP/Incoherent/hPt2", "pT of track 2 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); - JPsiToP.add("JPsiToP/Incoherent/hEta1", "eta of track 1 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToP.add("JPsiToP/Incoherent/hEta2", "eta of track 2 ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToP.add("JPsiToP/Incoherent/hPhi1", "phi of track 1 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToP.add("JPsiToP/Incoherent/hPhi2", "phi of track 2 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToP.add("JPsiToP/Incoherent/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); - JPsiToP.add("JPsiToP/Incoherent/hRap", "Rap of J/Psi ; y {-]", {HistType::kTH1F, {axisEta}}); - JPsiToP.add("JPsiToP/Incoherent/hEta", "Eta of J/Psi ; #eta {-]", {HistType::kTH1F, {axisEta}}); - JPsiToP.add("JPsiToP/Incoherent/hPhi", "Phi of J/Psi ; #phi {-]", {HistType::kTH1F, {axisPhi}}); - JPsiToP.add("JPsiToP/Incoherent/PID/hTPCVsP", "hTPCVsP", {HistType::kTH2F, {axisP, axisTPC}}); - JPsiToP.add("JPsiToP/Incoherent/PID/hTPCVsPt", "hTPCVsPt", {HistType::kTH2F, {axisPt, axisTPC}}); - JPsiToP.add("JPsiToP/Incoherent/PID/hTPCVsPhi", "hTPCVsPhi", {HistType::kTH2F, {axisPhi, axisTPC}}); - JPsiToP.add("JPsiToP/Incoherent/PID/hTPCVsEta", "hTPCVsEta", {HistType::kTH2F, {axisEta, axisTPC}}); - JPsiToP.add("JPsiToP/Incoherent/PID/hBetaTOFVsP", "hBetaTOFVsP", {HistType::kTH2F, {axisP, axisBetaTOF}}); - - // Correlation histograms - Correlation.add("Correlation/Muon/Coherent/AccoplAngle", "AccoplAngle", {HistType::kTH1F, {axisAccAngle}}); - Correlation.add("Correlation/Muon/Coherent/CosTheta", "CosTheta", {HistType::kTH1F, {axisAngTheta}}); - Correlation.add("Correlation/Muon/Coherent/Phi", "Phi", {HistType::kTH1F, {axisPhi}}); - Correlation.add("Correlation/Muon/Coherent/Phi1", "Phi1", {HistType::kTH1F, {axisPhi}}); - Correlation.add("Correlation/Muon/Coherent/Phi2", "Phi2", {HistType::kTH1F, {axisPhi}}); - Correlation.add("Correlation/Muon/Coherent/CosThetaPhi", "CosThetaPhi", {HistType::kTH2F, {{axisAngTheta}, {axisPhi}}}); - - Correlation.add("Correlation/Muon/Incoherent/AccoplAngle", "AccoplAngle", {HistType::kTH1F, {axisAccAngle}}); - Correlation.add("Correlation/Muon/Incoherent/CosTheta", "CosTheta", {HistType::kTH1F, {axisAngTheta}}); - Correlation.add("Correlation/Muon/Incoherent/Phi", "Phi", {HistType::kTH1F, {axisPhi}}); - Correlation.add("Correlation/Muon/Incoherent/Phi1", "Phi1", {HistType::kTH1F, {axisPhi}}); - Correlation.add("Correlation/Muon/Incoherent/Phi2", "Phi2", {HistType::kTH1F, {axisPhi}}); - Correlation.add("Correlation/Muon/Incoherent/CosThetaPhi", "CosThetaPhi", {HistType::kTH2F, {{axisAngTheta}, {axisPhi}}}); - - Correlation.add("Correlation/Electron/Coherent/AccoplAngle", "AccoplAngle", {HistType::kTH1F, {axisAccAngle}}); - Correlation.add("Correlation/Electron/Coherent/CosTheta", "CosTheta", {HistType::kTH1F, {axisAngTheta}}); - Correlation.add("Correlation/Electron/Coherent/Phi", "Phi", {HistType::kTH1F, {axisPhi}}); - Correlation.add("Correlation/Electron/Coherent/Phi1", "Phi1", {HistType::kTH1F, {axisPhi}}); - Correlation.add("Correlation/Electron/Coherent/Phi2", "Phi2", {HistType::kTH1F, {axisPhi}}); - Correlation.add("Correlation/Electron/Coherent/CosThetaPhi", "CosThetaPhi", {HistType::kTH2F, {{axisAngTheta}, {axisPhi}}}); - - Correlation.add("Correlation/Electron/Incoherent/AccoplAngle", "AccoplAngle", {HistType::kTH1F, {axisAccAngle}}); - Correlation.add("Correlation/Electron/Incoherent/CosTheta", "CosTheta", {HistType::kTH1F, {axisAngTheta}}); - Correlation.add("Correlation/Electron/Incoherent/Phi", "Phi", {HistType::kTH1F, {axisPhi}}); - Correlation.add("Correlation/Electron/Incoherent/Phi1", "Phi1", {HistType::kTH1F, {axisPhi}}); - Correlation.add("Correlation/Electron/Incoherent/Phi2", "Phi2", {HistType::kTH1F, {axisPhi}}); - Correlation.add("Correlation/Electron/Incoherent/CosThetaPhi", "CosThetaPhi", {HistType::kTH2F, {{axisAngTheta}, {axisPhi}}}); - - // Asymmetry histograms - Asymmetry.add("Asymmetry/Muon/Coherent/DeltaPhi", "DeltaPhi", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Muon/Coherent/XnXn/DeltaPhi", "DeltaPhi", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Muon/Coherent/OnOn/DeltaPhi", "DeltaPhi", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Muon/Coherent/XnOn/DeltaPhi", "DeltaPhi", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Muon/Coherent/OnXn/DeltaPhi", "DeltaPhi", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Muon/Incoherent/DeltaPhi", "DeltaPhi", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Muon/Incoherent/XnXn/DeltaPhi", "DeltaPhi", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Muon/Incoherent/OnOn/DeltaPhi", "DeltaPhi", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Muon/Incoherent/XnOn/DeltaPhi", "DeltaPhi", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Muon/Incoherent/OnXn/DeltaPhi", "DeltaPhi", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Electron/Coherent/DeltaPhi", "DeltaPhi", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Electron/Coherent/XnXn/DeltaPhi", "DeltaPhi", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Electron/Coherent/OnOn/DeltaPhi", "DeltaPhi", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Electron/Coherent/XnOn/DeltaPhi", "DeltaPhi", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Electron/Coherent/OnXn/DeltaPhi", "DeltaPhi", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Electron/Incoherent/DeltaPhi", "DeltaPhi", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Electron/Incoherent/XnXn/DeltaPhi", "DeltaPhi", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Electron/Incoherent/OnOn/DeltaPhi", "DeltaPhi", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Electron/Incoherent/XnOn/DeltaPhi", "DeltaPhi", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Electron/Incoherent/OnXn/DeltaPhi", "DeltaPhi", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Muon/Coherent/DeltaPhiRandom", "DeltaPhiRandom", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Muon/Coherent/XnXn/DeltaPhiRandom", "DeltaPhiRandom", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Muon/Coherent/OnOn/DeltaPhiRandom", "DeltaPhiRandom", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Muon/Coherent/XnOn/DeltaPhiRandom", "DeltaPhiRandom", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Muon/Coherent/OnXn/DeltaPhiRandom", "DeltaPhiRandom", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Muon/Incoherent/DeltaPhiRandom", "DeltaPhiRandom", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Muon/Incoherent/XnXn/DeltaPhiRandom", "DeltaPhiRandom", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Muon/Incoherent/OnOn/DeltaPhiRandom", "DeltaPhiRandom", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Muon/Incoherent/XnOn/DeltaPhiRandom", "DeltaPhiRandom", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Muon/Incoherent/OnXn/DeltaPhiRandom", "DeltaPhiRandom", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Electron/Coherent/DeltaPhiRandom", "DeltaPhiRandom", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Electron/Coherent/XnXn/DeltaPhiRandom", "DeltaPhiRandom", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Electron/Coherent/OnOn/DeltaPhiRandom", "DeltaPhiRandom", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Electron/Coherent/XnOn/DeltaPhiRandom", "DeltaPhiRandom", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Electron/Coherent/OnXn/DeltaPhiRandom", "DeltaPhiRandom", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Electron/Incoherent/DeltaPhiRandom", "DeltaPhiRandom", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Electron/Incoherent/XnXn/DeltaPhiRandom", "DeltaPhiRandom", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Electron/Incoherent/OnOn/DeltaPhiRandom", "DeltaPhiRandom", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Electron/Incoherent/XnOn/DeltaPhiRandom", "DeltaPhiRandom", {HistType::kTH1F, {{180, -PI, PI}}}); - Asymmetry.add("Asymmetry/Electron/Incoherent/OnXn/DeltaPhiRandom", "DeltaPhiRandom", {HistType::kTH1F, {{180, -PI, PI}}}); - - // MC histograms - MC.add("MC/hNumberOfMCCollisions", "hNumberOfCollisions", {HistType::kTH1F, {{10, 0, 10}}}); - MC.add("MC/hNumberOfRecoCollisions", "hNumberOfRecoCollisions", {HistType::kTH1F, {{10, 0, 10}}}); - MC.add("MC/Muon/hNumberOfMCTracks", "hNumberOfMCTracks", {HistType::kTH1F, {{10, 0, 10}}}); - MC.add("MC/Electron/hNumberOfMCTracks", "hNumberOfMCTracks", {HistType::kTH1F, {{10, 0, 10}}}); - MC.add("MC/Proton/hNumberOfMCTracks", "hNumberOfMCTracks", {HistType::kTH1F, {{10, 0, 10}}}); - MC.add("MC/hPosZ", "hPosZ", {HistType::kTH1F, {{60, -15, 15}}}); - MC.add("MC/hPDG", "hPDG", {HistType::kTH1F, {{200000, -100000, 100000}}}); - MC.add("MC/Electron/hEta1", "hEta1", {HistType::kTH1F, {axisEta}}); - MC.add("MC/Electron/hEta2", "hEta2", {HistType::kTH1F, {axisEta}}); - MC.add("MC/Electron/hPhi1", "hPhi1", {HistType::kTH1F, {axisPhi}}); - MC.add("MC/Electron/hPhi2", "hPhi2", {HistType::kTH1F, {axisPhi}}); - MC.add("MC/Electron/hIVM", "hIVM", {HistType::kTH1F, {axisIVM}}); - MC.add("MC/Electron/hRapidity", "hRapidity", {HistType::kTH1F, {axisEta}}); - MC.add("MC/Electron/hPt1", "hPt1", {HistType::kTH1F, {axisPt}}); - MC.add("MC/Electron/hPt2", "hPt2", {HistType::kTH1F, {axisPt}}); - MC.add("MC/Electron/hPt", "hPt", {HistType::kTH1F, {axisPt}}); - MC.add("MC/Muon/hEta1", "hEta1", {HistType::kTH1F, {axisEta}}); - MC.add("MC/Muon/hEta2", "hEta2", {HistType::kTH1F, {axisEta}}); - MC.add("MC/Muon/hPhi1", "hPhi1", {HistType::kTH1F, {axisPhi}}); - MC.add("MC/Muon/hPhi2", "hPhi2", {HistType::kTH1F, {axisPhi}}); - MC.add("MC/Muon/hIVM", "hIVM", {HistType::kTH1F, {axisIVM}}); - MC.add("MC/Muon/hRapidity", "hRapidity", {HistType::kTH1F, {axisEta}}); - MC.add("MC/Muon/hPt1", "hPt1", {HistType::kTH1F, {axisPt}}); - MC.add("MC/Muon/hPt2", "hPt2", {HistType::kTH1F, {axisPt}}); - MC.add("MC/Muon/hPt", "hPt", {HistType::kTH1F, {axisPt}}); - MC.add("MC/Proton/hEta1", "hEta1", {HistType::kTH1F, {axisEta}}); - MC.add("MC/Proton/hEta2", "hEta2", {HistType::kTH1F, {axisEta}}); - MC.add("MC/Proton/hPhi1", "hPhi1", {HistType::kTH1F, {axisPhi}}); - MC.add("MC/Proton/hPhi2", "hPhi2", {HistType::kTH1F, {axisPhi}}); - MC.add("MC/Proton/hIVM", "hIVM", {HistType::kTH1F, {axisIVM}}); - MC.add("MC/Proton/hRapidity", "hRapidity", {HistType::kTH1F, {axisEta}}); - MC.add("MC/Proton/hPt1", "hPt1", {HistType::kTH1F, {axisPt}}); - MC.add("MC/Proton/hPt2", "hPt2", {HistType::kTH1F, {axisPt}}); - MC.add("MC/Proton/hPt", "hPt", {HistType::kTH1F, {axisPt}}); - } - - bool cutITSLayers(uint8_t itsClusterMap) const - { - std::vector>> requiredITSHits{}; - requiredITSHits.push_back(std::make_pair(1, std::array{0, 1, 2})); // at least one hit in the innermost layer - constexpr uint8_t bit = 1; - for (auto& itsRequirement : requiredITSHits) { - auto hits = std::count_if(itsRequirement.second.begin(), itsRequirement.second.end(), [&](auto&& requiredLayer) { return itsClusterMap & (bit << requiredLayer); }); - - if ((itsRequirement.first == -1) && (hits > 0)) { - return false; // no hits were required in specified layers - } else if (hits < itsRequirement.first) { - return false; // not enough hits found in specified layers - } - } - return true; - } - - template - bool GoodTrackCuts(T const& track) - { - // choose only PV contributors - if (!track.isPVContributor()) { - Statistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(1); - return false; - } - // pT cut to choose only tracks contributing to J/psi - if (track.pt() < cutPtTrack) { - Statistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(2); - return false; - } - // acceptance cut (TPC) - if (std::abs(RecoDecay::eta(std::array{track.px(), track.py(), track.pz()})) > EtaCut) { - Statistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(3); - return false; - } - // DCA - if (std::abs(track.dcaZ()) > dcaZCut) { - Statistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(4); - return false; - } - if (DCAcut) { - float dcaXYPtCut = 0.0105f + 0.0350f / pow(track.pt(), 1.1f); - if (std::abs(track.dcaXY()) > dcaXYPtCut) { - Statistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(5); - return false; - } - } else { - if (std::abs(track.dcaXY()) > dcaXYCut) { - Statistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(5); - return false; - } - } - // ITS - if (!track.hasITS()) { - Statistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(6); - return false; - } - if (track.itsNCls() < ITSNClsCut) { - Statistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(7); - return false; - } - if (!cutITSLayers(track.itsClusterMap())) { - Statistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(8); - return false; - } - if (track.itsChi2NCl() > ITSChi2NClsCut) { - Statistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(9); - return false; - } - // TPC - if (!track.hasTPC()) { - Statistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(10); - return false; - } - if (track.tpcNClsCrossedRows() < TPCNClsCrossedRowsCut) { - Statistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(11); - return false; - } - if (track.tpcChi2NCl() > TPCChi2NCls) { - Statistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(12); - return false; // TPC chi2 - } - if ((track.tpcNClsFindable() - track.tpcNClsFindableMinusFound()) < TPCMinNCls) { - Statistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(13); - return false; - } - if (newCutTPC) { - if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < TPCCrossedOverFindable) { - Statistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(14); - return false; - } - } - - return true; - } - - // template - bool CandidateCuts(float massJpsi, float rapJpsi) - { - if (std::abs(rapJpsi) > RapCut) { - Statistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(15); - return false; - } - - if (massJpsi < 2.0f) { - Statistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(16); - return false; - } - - return true; - } - - template - void fillHistograms(C collision, Ts tracks) - { - Statistics.get(HIST("Statistics/hCutCounterCollisions"))->Fill(0); // number of collisions without any cuts - - // check UPC vs standard - if (doOnlyUPC) { - if (collision.flags() == 0) { - return; - } - } - if (doOnlyStandard) { - if (collision.flags() == 1) { - return; - } - } - - // distinguish ZDC classes - bool XnXn = false, OnOn = false, XnOn = false, OnXn = false; - if (collision.energyCommonZNA() < ZNenergyCut && collision.energyCommonZNC() < ZNenergyCut) { - OnOn = true; - } - if (collision.energyCommonZNA() > ZNenergyCut && std::abs(collision.timeZNA()) < ZNtimeCut && collision.energyCommonZNC() > ZNenergyCut && std::abs(collision.timeZNC()) < ZNtimeCut) { - XnXn = true; - } - if (collision.energyCommonZNA() > ZNenergyCut && std::abs(collision.timeZNA()) < ZNtimeCut && collision.energyCommonZNC() < ZNenergyCut) { - XnOn = true; - } - if (collision.energyCommonZNA() < ZNenergyCut && collision.energyCommonZNC() > ZNenergyCut && std::abs(collision.timeZNC()) < ZNtimeCut) { - OnXn = true; - } - - // loop over tracks without selections - for (auto& track : tracks) { - float trkPx = track.px(); - float trkPy = track.py(); - float trkPz = track.pz(); - - Statistics.get(HIST("Statistics/hNumberOfTracks"))->Fill(0); - Statistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(0); - if (track.isPVContributor() == 1) { - Statistics.get(HIST("Statistics/hNumberOfTracks"))->Fill(1); - PVContributors.get(HIST("PVContributors/hTrackPt"))->Fill(track.pt()); - PVContributors.get(HIST("PVContributors/hTrackEta"))->Fill(RecoDecay::eta(std::array{trkPx, trkPy, trkPz})); - PVContributors.get(HIST("PVContributors/hTrackPhi"))->Fill(RecoDecay::phi(trkPx, trkPy)); - - if (track.hasTPC()) { - PVContributors.get(HIST("PVContributors/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkPx, trkPy, trkPz), track.tpcSignal()); - PVContributors.get(HIST("PVContributors/PID/hTPCVsPt"))->Fill(track.pt(), track.tpcSignal()); - PVContributors.get(HIST("PVContributors/PID/hTPCVsEta"))->Fill(RecoDecay::eta(std::array{trkPx, trkPy, trkPz}), track.tpcSignal()); - PVContributors.get(HIST("PVContributors/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(trkPx, trkPy), track.tpcSignal()); - PVContributors.get(HIST("PVContributors/hTPCNClsFindable"))->Fill(track.tpcNClsFindable()); - PVContributors.get(HIST("PVContributors/hTPCNClsFindableMinusFound"))->Fill(track.tpcNClsFindableMinusFound()); - } - - if (track.hasTOF()) { - PVContributors.get(HIST("PVContributors/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkPx, trkPy, trkPz), track.beta()); - } - } - - RawData.get(HIST("RawData/hTrackPt"))->Fill(track.pt()); - RawData.get(HIST("RawData/hTrackEta"))->Fill(RecoDecay::eta(std::array{trkPx, trkPy, trkPz})); - RawData.get(HIST("RawData/hTrackPhi"))->Fill(RecoDecay::phi(trkPx, trkPy)); - RawData.get(HIST("RawData/hTrackDCAXYZ"))->Fill(track.dcaXY(), track.dcaZ()); - RawData.get(HIST("RawData/hTPCNClsFindable"))->Fill(track.tpcNClsFindable()); - RawData.get(HIST("RawData/hTPCNClsFindableMinusFound"))->Fill(track.tpcNClsFindableMinusFound()); - RawData.get(HIST("RawData/hITSNCls"))->Fill(track.itsNCls()); - RawData.get(HIST("RawData/hTPCNCls"))->Fill(track.tpcNClsFindable() - track.tpcNClsFindableMinusFound()); - RawData.get(HIST("RawData/hITSChi2NCls"))->Fill(track.itsChi2NCl()); - RawData.get(HIST("RawData/hTPCChi2NCls"))->Fill(track.tpcChi2NCl()); - - if (track.hasTPC()) { - RawData.get(HIST("RawData/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkPx, trkPy, trkPz), track.tpcSignal()); - RawData.get(HIST("RawData/PID/hTPCVsPt"))->Fill(track.pt(), track.tpcSignal()); - RawData.get(HIST("RawData/PID/hTPCVsEta"))->Fill(RecoDecay::eta(std::array{trkPx, trkPy, trkPz}), track.tpcSignal()); - RawData.get(HIST("RawData/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(trkPx, trkPy), track.tpcSignal()); - } - - if (track.hasTOF()) { - RawData.get(HIST("RawData/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkPx, trkPy, trkPz), track.beta()); - } - } - - int countGT = 0; - std::vector trkIdx; - // loop over tracks with selections - if (std::abs(collision.posZ()) > cutVertexZ) { - Statistics.get(HIST("Statistics/hCutCounterCollisions"))->Fill(1); - return; - } - - RawData.get(HIST("RawData/hPositionX"))->Fill(collision.posX()); - RawData.get(HIST("RawData/hPositionY"))->Fill(collision.posY()); - RawData.get(HIST("RawData/hPositionZ"))->Fill(collision.posZ()); - RawData.get(HIST("RawData/hPositionXY"))->Fill(collision.posX(), collision.posY()); - RawData.get(HIST("RawData/hZNACommonEnergy"))->Fill(collision.energyCommonZNA()); - RawData.get(HIST("RawData/hZNCCommonEnergy"))->Fill(collision.energyCommonZNC()); - RawData.get(HIST("RawData/hZNAvsZNCCommonEnergy"))->Fill(collision.energyCommonZNA(), collision.energyCommonZNC()); - RawData.get(HIST("RawData/hZNCTime"))->Fill(collision.timeZNC()); - RawData.get(HIST("RawData/hZNATime"))->Fill(collision.timeZNA()); - RawData.get(HIST("RawData/hZNAvsZNCTime"))->Fill(collision.timeZNA(), collision.timeZNC()); - - for (auto& track : tracks) { - - Statistics.get(HIST("Statistics/hNumberOfTracks"))->Fill(2.); - - // select good tracks - if (GoodTrackCuts(track) != 1) { - continue; - } - - countGT++; - trkIdx.push_back(track.index()); - } - - Statistics.get(HIST("Statistics/hNumberOfTracks"))->Fill(3., countGT); - Statistics.get(HIST("Statistics/hNumberGT"))->Fill(countGT); - - float massEl = o2::constants::physics::MassElectron; - float massMu = o2::constants::physics::MassMuonMinus; - float massPr = o2::constants::physics::MassProton; - - if (countGT == 2) { - TLorentzVector mom, daughter[2]; - auto trkDaughter1 = tracks.iteratorAt(trkIdx[0]); - auto trkDaughter2 = tracks.iteratorAt(trkIdx[1]); - - if ((trkDaughter1.sign() * trkDaughter2.sign()) != -1) { - return; - } - - if (chargeOrdered) { - if (tracks.iteratorAt(trkIdx[0]).sign() < 0) { - trkDaughter1 = tracks.iteratorAt(trkIdx[0]); - trkDaughter2 = tracks.iteratorAt(trkIdx[1]); - } else { - trkDaughter1 = tracks.iteratorAt(trkIdx[1]); - trkDaughter2 = tracks.iteratorAt(trkIdx[0]); - } - } - - std::array daughter1 = {trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()}; - std::array daughter2 = {trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()}; - - TG.get(HIST("TG/hTrackPt1"))->Fill(trkDaughter1.pt()); - TG.get(HIST("TG/hTrackPt2"))->Fill(trkDaughter2.pt()); - TG.get(HIST("TG/hTrackEta1"))->Fill(RecoDecay::eta(daughter1)); - TG.get(HIST("TG/hTrackEta2"))->Fill(RecoDecay::eta(daughter2)); - TG.get(HIST("TG/hTrackPhi1"))->Fill(RecoDecay::phi(daughter1)); - TG.get(HIST("TG/hTrackPhi2"))->Fill(RecoDecay::phi(daughter2)); - - if (trkDaughter1.hasTPC()) { - TG.get(HIST("TG/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.tpcSignal()); - TG.get(HIST("TG/PID/hTPCVsPt"))->Fill(trkDaughter1.pt(), trkDaughter1.tpcSignal()); - TG.get(HIST("TG/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter1), trkDaughter1.tpcSignal()); - TG.get(HIST("TG/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter1), trkDaughter1.tpcSignal()); - TG.get(HIST("TG/hTPCNClsFindable"))->Fill(trkDaughter1.tpcNClsFindable()); - TG.get(HIST("TG/hTPCNClsFindableMinusFound"))->Fill(trkDaughter1.tpcNClsFindableMinusFound()); - if (trkDaughter1.sign() < 0) { - TG.get(HIST("TG/TPC/TPCNegVsPosSignal"))->Fill(trkDaughter1.tpcSignal(), trkDaughter2.tpcSignal()); - } else { - TG.get(HIST("TG/TPC/TPCNegVsPosSignal"))->Fill(trkDaughter2.tpcSignal(), trkDaughter1.tpcSignal()); - } - } - if (trkDaughter2.hasTPC()) { - TG.get(HIST("TG/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.tpcSignal()); - TG.get(HIST("TG/PID/hTPCVsPt"))->Fill(trkDaughter2.pt(), trkDaughter2.tpcSignal()); - TG.get(HIST("TG/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter2), trkDaughter2.tpcSignal()); - TG.get(HIST("TG/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter2), trkDaughter2.tpcSignal()); - TG.get(HIST("TG/hTPCNClsFindable"))->Fill(trkDaughter2.tpcNClsFindable()); - TG.get(HIST("TG/hTPCNClsFindableMinusFound"))->Fill(trkDaughter2.tpcNClsFindableMinusFound()); - } - if (trkDaughter1.hasTOF()) { - TG.get(HIST("TG/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.beta()); - } - if (trkDaughter2.hasTOF()) { - TG.get(HIST("TG/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.beta()); - } - if (doElectrons) { - if (RecoDecay::sumOfSquares(trkDaughter1.tpcNSigmaMu(), trkDaughter2.tpcNSigmaMu()) > RecoDecay::sumOfSquares(trkDaughter1.tpcNSigmaEl(), trkDaughter2.tpcNSigmaEl())) { - - auto ene1 = RecoDecay::e(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz(), massEl); - auto ene2 = RecoDecay::e(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz(), massEl); - daughter[0].SetPxPyPzE(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz(), ene1); - daughter[1].SetPxPyPzE(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz(), ene2); - mom = daughter[0] + daughter[1]; - - std::array mother = {trkDaughter1.px() + trkDaughter2.px(), trkDaughter1.py() + trkDaughter2.py(), trkDaughter1.pz() + trkDaughter2.pz()}; - - auto arrMom = std::array{daughter1, daughter2}; - float massJpsi = RecoDecay::m(arrMom, std::array{massEl, massEl}); - float rapJpsi = RecoDecay::y(mother, massJpsi); - - auto leadingP = RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()) > RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()) ? trkDaughter1 : trkDaughter2; - auto subleadingP = (leadingP == trkDaughter1) ? trkDaughter1 : trkDaughter2; - - TGel.get(HIST("TGel/hTrackPt1"))->Fill(trkDaughter1.pt()); - TGel.get(HIST("TGel/hTrackPt2"))->Fill(trkDaughter2.pt()); - TGel.get(HIST("TGel/hTrackEta1"))->Fill(RecoDecay::eta(daughter1)); - TGel.get(HIST("TGel/hTrackEta2"))->Fill(RecoDecay::eta(daughter2)); - TGel.get(HIST("TGel/hTrackPhi1"))->Fill(RecoDecay::phi(daughter1)); - TGel.get(HIST("TGel/hTrackPhi2"))->Fill(RecoDecay::phi(daughter2)); - - // selections - Selections.get(HIST("Selections/Electron/Mass/Leading/hITSNClsVsM"))->Fill(massJpsi, leadingP.itsNCls()); - Selections.get(HIST("Selections/Electron/Mass/Leading/hITSChi2NClsVsM"))->Fill(massJpsi, leadingP.itsChi2NCl()); - Selections.get(HIST("Selections/Electron/Mass/Leading/hTPCNClsVsM"))->Fill(massJpsi, leadingP.tpcNClsFindable() - leadingP.tpcNClsFindableMinusFound()); - Selections.get(HIST("Selections/Electron/Mass/Leading/hTPCChi2NClsVsM"))->Fill(massJpsi, leadingP.tpcChi2NCl()); - Selections.get(HIST("Selections/Electron/Mass/Leading/hTPCNClsCrossedRowsVsM"))->Fill(massJpsi, subleadingP.tpcNClsCrossedRows()); - Selections.get(HIST("Selections/Electron/Mass/Subleading/hITSNClsVsM"))->Fill(massJpsi, subleadingP.itsNCls()); - Selections.get(HIST("Selections/Electron/Mass/Subleading/hITSChi2NClsVsM"))->Fill(massJpsi, subleadingP.itsChi2NCl()); - Selections.get(HIST("Selections/Electron/Mass/Subleading/hTPCNClsVsM"))->Fill(massJpsi, subleadingP.tpcNClsFindable() - subleadingP.tpcNClsFindableMinusFound()); - Selections.get(HIST("Selections/Electron/Mass/Subleading/hTPCChi2NClsVsM"))->Fill(massJpsi, subleadingP.tpcChi2NCl()); - Selections.get(HIST("Selections/Electron/Mass/Subleading/hTPCNClsCrossedRowsVsM"))->Fill(massJpsi, subleadingP.tpcNClsCrossedRows()); - - Selections.get(HIST("Selections/Electron/Rapidity/Leading/hITSNClsVsY"))->Fill(rapJpsi, leadingP.itsNCls()); - Selections.get(HIST("Selections/Electron/Rapidity/Leading/hITSChi2NClsVsY"))->Fill(rapJpsi, leadingP.itsChi2NCl()); - Selections.get(HIST("Selections/Electron/Rapidity/Leading/hTPCNClsVsY"))->Fill(rapJpsi, leadingP.tpcNClsFindable() - leadingP.tpcNClsFindableMinusFound()); - Selections.get(HIST("Selections/Electron/Rapidity/Leading/hTPCChi2NClsVsY"))->Fill(rapJpsi, leadingP.tpcChi2NCl()); - Selections.get(HIST("Selections/Electron/Rapidity/Leading/hTPCNClsCrossedRowsVsY"))->Fill(rapJpsi, subleadingP.tpcNClsCrossedRows()); - Selections.get(HIST("Selections/Electron/Rapidity/Subleading/hITSNClsVsY"))->Fill(rapJpsi, subleadingP.itsNCls()); - Selections.get(HIST("Selections/Electron/Rapidity/Subleading/hITSChi2NClsVsY"))->Fill(rapJpsi, subleadingP.itsChi2NCl()); - Selections.get(HIST("Selections/Electron/Rapidity/Subleading/hTPCNClsVsY"))->Fill(rapJpsi, subleadingP.tpcNClsFindable() - subleadingP.tpcNClsFindableMinusFound()); - Selections.get(HIST("Selections/Electron/Rapidity/Subleading/hTPCChi2NClsVsY"))->Fill(rapJpsi, subleadingP.tpcChi2NCl()); - Selections.get(HIST("Selections/Electron/Rapidity/Subleading/hTPCNClsCrossedRowsVsY"))->Fill(rapJpsi, subleadingP.tpcNClsCrossedRows()); - - Selections.get(HIST("Selections/Electron/Pt/Leading/hITSNClsVsPt"))->Fill(RecoDecay::pt(mother), leadingP.itsNCls()); - Selections.get(HIST("Selections/Electron/Pt/Leading/hITSChi2NClsVsPt"))->Fill(RecoDecay::pt(mother), leadingP.itsChi2NCl()); - Selections.get(HIST("Selections/Electron/Pt/Leading/hTPCNClsVsPt"))->Fill(RecoDecay::pt(mother), leadingP.tpcNClsFindable() - leadingP.tpcNClsFindableMinusFound()); - Selections.get(HIST("Selections/Electron/Pt/Leading/hTPCChi2NClsVsPt"))->Fill(RecoDecay::pt(mother), leadingP.tpcChi2NCl()); - Selections.get(HIST("Selections/Electron/Pt/Leading/hTPCNClsCrossedRowsVsPt"))->Fill(RecoDecay::pt(mother), subleadingP.tpcNClsCrossedRows()); - Selections.get(HIST("Selections/Electron/Pt/Subleading/hITSNClsVsPt"))->Fill(RecoDecay::pt(mother), subleadingP.itsNCls()); - Selections.get(HIST("Selections/Electron/Pt/Subleading/hITSChi2NClsVsPt"))->Fill(RecoDecay::pt(mother), subleadingP.itsChi2NCl()); - Selections.get(HIST("Selections/Electron/Pt/Subleading/hTPCNClsVsPt"))->Fill(RecoDecay::pt(mother), subleadingP.tpcNClsFindable() - subleadingP.tpcNClsFindableMinusFound()); - Selections.get(HIST("Selections/Electron/Pt/Subleading/hTPCChi2NClsVsPt"))->Fill(RecoDecay::pt(mother), subleadingP.tpcChi2NCl()); - Selections.get(HIST("Selections/Electron/Pt/Subleading/hTPCNClsCrossedRowsVsPt"))->Fill(RecoDecay::pt(mother), subleadingP.tpcNClsCrossedRows()); - - if (trkDaughter1.hasTPC()) { - TGel.get(HIST("TGel/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.tpcSignal()); - TGel.get(HIST("TGel/PID/hTPCVsPt"))->Fill(trkDaughter1.pt(), trkDaughter1.tpcSignal()); - TGel.get(HIST("TGel/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter1), trkDaughter1.tpcSignal()); - TGel.get(HIST("TGel/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter1), trkDaughter1.tpcSignal()); - } - if (trkDaughter2.hasTPC()) { - TGel.get(HIST("TGel/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.tpcSignal()); - TGel.get(HIST("TGel/PID/hTPCVsPt"))->Fill(trkDaughter2.pt(), trkDaughter2.tpcSignal()); - TGel.get(HIST("TGel/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter2), trkDaughter2.tpcSignal()); - TGel.get(HIST("TGel/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter2), trkDaughter2.tpcSignal()); - } - if (trkDaughter1.hasTOF()) { - TGel.get(HIST("TGel/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.beta()); - } - if (trkDaughter2.hasTOF()) { - TGel.get(HIST("TGel/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.beta()); - } - - if (CandidateCuts(massJpsi, rapJpsi) != 1) { - return; - } - - TGelCand.get(HIST("TGelCand/hTrackPt1"))->Fill(trkDaughter1.pt()); - TGelCand.get(HIST("TGelCand/hTrackPt2"))->Fill(trkDaughter2.pt()); - TGelCand.get(HIST("TGelCand/hTrackEta1"))->Fill(RecoDecay::eta(daughter1)); - TGelCand.get(HIST("TGelCand/hTrackEta2"))->Fill(RecoDecay::eta(daughter2)); - TGelCand.get(HIST("TGelCand/hTrackPhi1"))->Fill(RecoDecay::phi(daughter1)); - TGelCand.get(HIST("TGelCand/hTrackPhi2"))->Fill(RecoDecay::phi(daughter2)); - TGelCand.get(HIST("TGelCand/hPairPt"))->Fill(RecoDecay::pt(mother)); - TGelCand.get(HIST("TGelCand/hPairIVM"))->Fill(massJpsi); - - if (trkDaughter1.hasTPC()) { - TGelCand.get(HIST("TGelCand/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.tpcSignal()); - TGelCand.get(HIST("TGelCand/PID/hTPCVsPt"))->Fill(trkDaughter1.pt(), trkDaughter1.tpcSignal()); - TGelCand.get(HIST("TGelCand/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter1), trkDaughter1.tpcSignal()); - TGelCand.get(HIST("TGelCand/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter1), trkDaughter1.tpcSignal()); - if (trkDaughter1.sign() < 0) { - TGelCand.get(HIST("TGelCand/TPCNegVsPosSignal"))->Fill(trkDaughter1.tpcSignal(), trkDaughter2.tpcSignal()); - } else { - TGelCand.get(HIST("TGelCand/TPCNegVsPosSignal"))->Fill(trkDaughter2.tpcSignal(), trkDaughter1.tpcSignal()); - } - } - if (trkDaughter2.hasTPC()) { - TGelCand.get(HIST("TGelCand/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.tpcSignal()); - TGelCand.get(HIST("TGelCand/PID/hTPCVsPt"))->Fill(trkDaughter2.pt(), trkDaughter2.tpcSignal()); - TGelCand.get(HIST("TGelCand/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter2), trkDaughter2.tpcSignal()); - TGelCand.get(HIST("TGelCand/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter2), trkDaughter2.tpcSignal()); - } - if (trkDaughter1.hasTOF()) { - TGelCand.get(HIST("TGelCand/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.beta()); - } - if (trkDaughter2.hasTOF()) { - TGelCand.get(HIST("TGelCand/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.beta()); - } - - if (RecoDecay::pt(mother) < 0.2f) { - JPsiToEl.get(HIST("JPsiToEl/Coherent/hIVM"))->Fill(massJpsi); - if (XnXn) { - JPsiToEl.get(HIST("JPsiToEl/Coherent/XnXn/hIVM"))->Fill(massJpsi); - } else if (OnXn) { - JPsiToEl.get(HIST("JPsiToEl/Coherent/OnXn/hIVM"))->Fill(massJpsi); - } else if (XnOn) { - JPsiToEl.get(HIST("JPsiToEl/Coherent/XnOn/hIVM"))->Fill(massJpsi); - } else if (OnOn) { - JPsiToEl.get(HIST("JPsiToEl/Coherent/OnOn/hIVM"))->Fill(massJpsi); - } - } else if (RecoDecay::pt(mother) > 0.4f) { - JPsiToEl.get(HIST("JPsiToEl/NotCoherent/hIVM"))->Fill(massJpsi); - if (XnXn) { - JPsiToEl.get(HIST("JPsiToEl/NotCoherent/XnXn/hIVM"))->Fill(massJpsi); - } else if (OnXn) { - JPsiToEl.get(HIST("JPsiToEl/NotCoherent/OnXn/hIVM"))->Fill(massJpsi); - } else if (XnOn) { - JPsiToEl.get(HIST("JPsiToEl/NotCoherent/XnOn/hIVM"))->Fill(massJpsi); - } else if (OnOn) { - JPsiToEl.get(HIST("JPsiToEl/NotCoherent/OnOn/hIVM"))->Fill(massJpsi); - } - } - if (RecoDecay::pt(mother) > 0.2f) { - JPsiToEl.get(HIST("JPsiToEl/Incoherent/hIVM"))->Fill(massJpsi); - if (XnXn) { - JPsiToEl.get(HIST("JPsiToEl/Incoherent/XnXn/hIVM"))->Fill(massJpsi); - } else if (OnXn) { - JPsiToEl.get(HIST("JPsiToEl/Incoherent/OnXn/hIVM"))->Fill(massJpsi); - } else if (XnOn) { - JPsiToEl.get(HIST("JPsiToEl/Incoherent/XnOn/hIVM"))->Fill(massJpsi); - } else if (OnOn) { - JPsiToEl.get(HIST("JPsiToEl/Incoherent/OnOn/hIVM"))->Fill(massJpsi); - } - } - - if ((massJpsi < maxJpsiMass) && (massJpsi > minJpsiMass)) { - TGelCand.get(HIST("TGelCand/hJpsiPt"))->Fill(RecoDecay::pt(mother)); - TGelCand.get(HIST("TGelCand/hJpsiRap"))->Fill(rapJpsi); - - if (trkDaughter1.sign() < 0) { - TGelCand.get(HIST("TGelCand/TPCNegVsPosSignal"))->Fill(trkDaughter1.tpcSignal(), trkDaughter2.tpcSignal()); - } else { - TGelCand.get(HIST("TGelCand/TPCNegVsPosSignal"))->Fill(trkDaughter2.tpcSignal(), trkDaughter1.tpcSignal()); - } - - if (RecoDecay::pt(mother) < 0.2f) { - // fill track histos - JPsiToEl.get(HIST("JPsiToEl/Coherent/hPt1"))->Fill(trkDaughter1.pt()); - JPsiToEl.get(HIST("JPsiToEl/Coherent/hPt2"))->Fill(trkDaughter2.pt()); - JPsiToEl.get(HIST("JPsiToEl/Coherent/hEta1"))->Fill(RecoDecay::eta(daughter1)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/hEta2"))->Fill(RecoDecay::eta(daughter2)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/hPhi1"))->Fill(RecoDecay::phi(daughter1)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/hPhi2"))->Fill(RecoDecay::phi(daughter2)); - - if (XnXn) { - JPsiToEl.get(HIST("JPsiToEl/Coherent/XnXn/hPt1"))->Fill(trkDaughter1.pt()); - JPsiToEl.get(HIST("JPsiToEl/Coherent/XnXn/hPt2"))->Fill(trkDaughter2.pt()); - JPsiToEl.get(HIST("JPsiToEl/Coherent/XnXn/hEta1"))->Fill(RecoDecay::eta(daughter1)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/XnXn/hEta2"))->Fill(RecoDecay::eta(daughter2)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/XnXn/hPhi1"))->Fill(RecoDecay::phi(daughter1)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/XnXn/hPhi2"))->Fill(RecoDecay::phi(daughter2)); - } else if (OnOn) { - JPsiToEl.get(HIST("JPsiToEl/Coherent/OnOn/hPt1"))->Fill(trkDaughter1.pt()); - JPsiToEl.get(HIST("JPsiToEl/Coherent/OnOn/hPt2"))->Fill(trkDaughter2.pt()); - JPsiToEl.get(HIST("JPsiToEl/Coherent/OnOn/hEta1"))->Fill(RecoDecay::eta(daughter1)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/OnOn/hEta2"))->Fill(RecoDecay::eta(daughter2)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/OnOn/hPhi1"))->Fill(RecoDecay::phi(daughter1)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/OnOn/hPhi2"))->Fill(RecoDecay::phi(daughter2)); - } else if (XnOn) { - JPsiToEl.get(HIST("JPsiToEl/Coherent/XnOn/hPt1"))->Fill(trkDaughter1.pt()); - JPsiToEl.get(HIST("JPsiToEl/Coherent/XnOn/hPt2"))->Fill(trkDaughter2.pt()); - JPsiToEl.get(HIST("JPsiToEl/Coherent/XnOn/hEta1"))->Fill(RecoDecay::eta(daughter1)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/XnOn/hEta2"))->Fill(RecoDecay::eta(daughter2)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/XnOn/hPhi1"))->Fill(RecoDecay::phi(daughter1)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/XnOn/hPhi2"))->Fill(RecoDecay::phi(daughter2)); - } else if (OnXn) { - JPsiToEl.get(HIST("JPsiToEl/Coherent/OnXn/hPt1"))->Fill(trkDaughter1.pt()); - JPsiToEl.get(HIST("JPsiToEl/Coherent/OnXn/hPt2"))->Fill(trkDaughter2.pt()); - JPsiToEl.get(HIST("JPsiToEl/Coherent/OnXn/hEta1"))->Fill(RecoDecay::eta(daughter1)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/OnXn/hEta2"))->Fill(RecoDecay::eta(daughter2)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/OnXn/hPhi1"))->Fill(RecoDecay::phi(daughter1)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/OnXn/hPhi2"))->Fill(RecoDecay::phi(daughter2)); - } - - if (trkDaughter1.hasTPC()) { - JPsiToEl.get(HIST("JPsiToEl/Coherent/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.tpcSignal()); - JPsiToEl.get(HIST("JPsiToEl/Coherent/PID/hTPCVsPt"))->Fill(trkDaughter1.pt(), trkDaughter1.tpcSignal()); - JPsiToEl.get(HIST("JPsiToEl/Coherent/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter1), trkDaughter1.tpcSignal()); - JPsiToEl.get(HIST("JPsiToEl/Coherent/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter1), trkDaughter1.tpcSignal()); - } - if (trkDaughter2.hasTPC()) { - JPsiToEl.get(HIST("JPsiToEl/Coherent/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.tpcSignal()); - JPsiToEl.get(HIST("JPsiToEl/Coherent/PID/hTPCVsPt"))->Fill(trkDaughter2.pt(), trkDaughter2.tpcSignal()); - JPsiToEl.get(HIST("JPsiToEl/Coherent/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter2), trkDaughter2.tpcSignal()); - JPsiToEl.get(HIST("JPsiToEl/Coherent/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter2), trkDaughter2.tpcSignal()); - } - - if (trkDaughter1.hasTOF()) { - JPsiToEl.get(HIST("JPsiToEl/Coherent/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.beta()); - } - if (trkDaughter2.hasTOF()) { - JPsiToEl.get(HIST("JPsiToEl/Coherent/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.beta()); - } - // fill J/psi histos - JPsiToEl.get(HIST("JPsiToEl/Coherent/hPt"))->Fill(RecoDecay::pt(mother)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/hEta"))->Fill(RecoDecay::eta(mother)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/hPhi"))->Fill(RecoDecay::phi(mother)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/hRap"))->Fill(rapJpsi); - - if (XnXn) { - JPsiToEl.get(HIST("JPsiToEl/Coherent/XnXn/hPt"))->Fill(RecoDecay::pt(mother)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/XnXn/hEta"))->Fill(RecoDecay::eta(mother)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/XnXn/hPhi"))->Fill(RecoDecay::phi(mother)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/XnXn/hRap"))->Fill(rapJpsi); - } else if (OnOn) { - JPsiToEl.get(HIST("JPsiToEl/Coherent/OnOn/hPt"))->Fill(RecoDecay::pt(mother)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/OnOn/hEta"))->Fill(RecoDecay::eta(mother)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/OnOn/hPhi"))->Fill(RecoDecay::phi(mother)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/OnOn/hRap"))->Fill(rapJpsi); - } else if (OnXn) { - JPsiToEl.get(HIST("JPsiToEl/Coherent/OnXn/hPt"))->Fill(RecoDecay::pt(mother)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/OnXn/hEta"))->Fill(RecoDecay::eta(mother)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/OnXn/hPhi"))->Fill(RecoDecay::phi(mother)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/OnXn/hRap"))->Fill(rapJpsi); - } else if (XnOn) { - JPsiToEl.get(HIST("JPsiToEl/Coherent/XnOn/hPt"))->Fill(RecoDecay::pt(mother)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/XnOn/hEta"))->Fill(RecoDecay::eta(mother)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/XnOn/hPhi"))->Fill(RecoDecay::phi(mother)); - JPsiToEl.get(HIST("JPsiToEl/Coherent/XnOn/hRap"))->Fill(rapJpsi); - } - - float* q = correlation(&daughter[0], &daughter[1], &mom); - Correlation.get(HIST("Correlation/Electron/Coherent/Phi1"))->Fill(RecoDecay::phi(daughter1), 1.); - Correlation.get(HIST("Correlation/Electron/Coherent/Phi2"))->Fill(RecoDecay::phi(daughter2), 1.); - Correlation.get(HIST("Correlation/Electron/Coherent/Phi"))->Fill(q[1], 1.); - Correlation.get(HIST("Correlation/Electron/Coherent/CosTheta"))->Fill(q[2], 1.); - Correlation.get(HIST("Correlation/Electron/Coherent/AccoplAngle"))->Fill(q[0], 1.); - Correlation.get(HIST("Correlation/Electron/Coherent/CosThetaPhi"))->Fill(q[2], q[1]); - - double dp = DeltaPhi(daughter[0], daughter[1]); - Asymmetry.get(HIST("Asymmetry/Electron/Coherent/DeltaPhi"))->Fill(dp); - if (XnXn) { - Asymmetry.get(HIST("Asymmetry/Electron/Coherent/XnXn/DeltaPhi"))->Fill(dp); - } else if (OnOn) { - Asymmetry.get(HIST("Asymmetry/Electron/Coherent/OnOn/DeltaPhi"))->Fill(dp); - } else if (XnOn) { - Asymmetry.get(HIST("Asymmetry/Electron/Coherent/XnOn/DeltaPhi"))->Fill(dp); - } else if (OnXn) { - Asymmetry.get(HIST("Asymmetry/Electron/Coherent/OnXn/DeltaPhi"))->Fill(dp); - } - - double dpRandom = DeltaPhiRandom(daughter[0], daughter[1]); - Asymmetry.get(HIST("Asymmetry/Electron/Coherent/DeltaPhiRandom"))->Fill(dpRandom); - if (XnXn) { - Asymmetry.get(HIST("Asymmetry/Electron/Coherent/XnXn/DeltaPhiRandom"))->Fill(dpRandom); - } else if (OnOn) { - Asymmetry.get(HIST("Asymmetry/Electron/Coherent/OnOn/DeltaPhiRandom"))->Fill(dpRandom); - } else if (XnOn) { - Asymmetry.get(HIST("Asymmetry/Electron/Coherent/XnOn/DeltaPhiRandom"))->Fill(dpRandom); - } else if (OnXn) { - Asymmetry.get(HIST("Asymmetry/Electron/Coherent/OnXn/DeltaPhiRandom"))->Fill(dpRandom); - } - - delete[] q; - } // end coherent electrons - if (RecoDecay::pt(mother) > 0.2f) { - // fill track histos - JPsiToEl.get(HIST("JPsiToEl/Incoherent/hPt1"))->Fill(trkDaughter1.pt()); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/hPt2"))->Fill(trkDaughter2.pt()); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/hEta1"))->Fill(RecoDecay::eta(daughter1)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/hEta2"))->Fill(RecoDecay::eta(daughter2)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/hPhi1"))->Fill(RecoDecay::phi(daughter1)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/hPhi2"))->Fill(RecoDecay::phi(daughter2)); - - if (XnXn) { - JPsiToEl.get(HIST("JPsiToEl/Incoherent/XnXn/hPt1"))->Fill(trkDaughter1.pt()); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/XnXn/hPt2"))->Fill(trkDaughter2.pt()); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/XnXn/hEta1"))->Fill(RecoDecay::eta(daughter1)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/XnXn/hEta2"))->Fill(RecoDecay::eta(daughter2)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/XnXn/hPhi1"))->Fill(RecoDecay::phi(daughter1)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/XnXn/hPhi2"))->Fill(RecoDecay::phi(daughter2)); - } else if (OnOn) { - JPsiToEl.get(HIST("JPsiToEl/Incoherent/OnOn/hPt1"))->Fill(trkDaughter1.pt()); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/OnOn/hPt2"))->Fill(trkDaughter2.pt()); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/OnOn/hEta1"))->Fill(RecoDecay::eta(daughter1)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/OnOn/hEta2"))->Fill(RecoDecay::eta(daughter2)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/OnOn/hPhi1"))->Fill(RecoDecay::phi(daughter1)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/OnOn/hPhi2"))->Fill(RecoDecay::phi(daughter2)); - } else if (XnOn) { - JPsiToEl.get(HIST("JPsiToEl/Incoherent/XnOn/hPt1"))->Fill(trkDaughter1.pt()); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/XnOn/hPt2"))->Fill(trkDaughter2.pt()); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/XnOn/hEta1"))->Fill(RecoDecay::eta(daughter1)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/XnOn/hEta2"))->Fill(RecoDecay::eta(daughter2)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/XnOn/hPhi1"))->Fill(RecoDecay::phi(daughter1)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/XnOn/hPhi2"))->Fill(RecoDecay::phi(daughter2)); - } else if (OnXn) { - JPsiToEl.get(HIST("JPsiToEl/Incoherent/OnXn/hPt1"))->Fill(trkDaughter1.pt()); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/OnXn/hPt2"))->Fill(trkDaughter2.pt()); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/OnXn/hEta1"))->Fill(RecoDecay::eta(daughter1)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/OnXn/hEta2"))->Fill(RecoDecay::eta(daughter2)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/OnXn/hPhi1"))->Fill(RecoDecay::phi(daughter1)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/OnXn/hPhi2"))->Fill(RecoDecay::phi(daughter2)); - } - - if (trkDaughter1.hasTPC()) { - JPsiToEl.get(HIST("JPsiToEl/Incoherent/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.tpcSignal()); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/PID/hTPCVsPt"))->Fill(trkDaughter1.pt(), trkDaughter1.tpcSignal()); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter1), trkDaughter1.tpcSignal()); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter1), trkDaughter1.tpcSignal()); - } - if (trkDaughter2.hasTPC()) { - JPsiToEl.get(HIST("JPsiToEl/Incoherent/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.tpcSignal()); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/PID/hTPCVsPt"))->Fill(trkDaughter2.pt(), trkDaughter2.tpcSignal()); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter2), trkDaughter2.tpcSignal()); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter2), trkDaughter2.tpcSignal()); - } - - if (trkDaughter1.hasTOF()) { - JPsiToEl.get(HIST("JPsiToEl/Incoherent/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.beta()); - } - if (trkDaughter2.hasTOF()) { - JPsiToEl.get(HIST("JPsiToEl/Incoherent/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.beta()); - } - // fill J/psi histos - JPsiToEl.get(HIST("JPsiToEl/Incoherent/hPt"))->Fill(RecoDecay::pt(mother)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/hEta"))->Fill(RecoDecay::eta(mother)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/hPhi"))->Fill(RecoDecay::phi(mother)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/hRap"))->Fill(rapJpsi); - - if (XnXn) { - JPsiToEl.get(HIST("JPsiToEl/Incoherent/XnXn/hPt"))->Fill(RecoDecay::pt(mother)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/XnXn/hEta"))->Fill(RecoDecay::eta(mother)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/XnXn/hPhi"))->Fill(RecoDecay::phi(mother)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/XnXn/hRap"))->Fill(rapJpsi); - } else if (OnOn) { - JPsiToEl.get(HIST("JPsiToEl/Incoherent/OnOn/hPt"))->Fill(RecoDecay::pt(mother)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/OnOn/hEta"))->Fill(RecoDecay::eta(mother)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/OnOn/hPhi"))->Fill(RecoDecay::phi(mother)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/OnOn/hRap"))->Fill(rapJpsi); - } else if (OnXn) { - JPsiToEl.get(HIST("JPsiToEl/Incoherent/OnXn/hPt"))->Fill(RecoDecay::pt(mother)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/OnXn/hEta"))->Fill(RecoDecay::eta(mother)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/OnXn/hPhi"))->Fill(RecoDecay::phi(mother)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/OnXn/hRap"))->Fill(rapJpsi); - } else if (XnOn) { - JPsiToEl.get(HIST("JPsiToEl/Incoherent/XnOn/hPt"))->Fill(RecoDecay::pt(mother)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/XnOn/hEta"))->Fill(RecoDecay::eta(mother)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/XnOn/hPhi"))->Fill(RecoDecay::phi(mother)); - JPsiToEl.get(HIST("JPsiToEl/Incoherent/XnOn/hRap"))->Fill(rapJpsi); - } - - float* q = correlation(&daughter[0], &daughter[1], &mom); - Correlation.get(HIST("Correlation/Electron/Incoherent/Phi1"))->Fill(RecoDecay::phi(daughter1), 1.); - Correlation.get(HIST("Correlation/Electron/Incoherent/Phi2"))->Fill(RecoDecay::phi(daughter2), 1.); - Correlation.get(HIST("Correlation/Electron/Incoherent/Phi"))->Fill(q[1], 1.); - Correlation.get(HIST("Correlation/Electron/Incoherent/CosTheta"))->Fill(q[2], 1.); - Correlation.get(HIST("Correlation/Electron/Incoherent/AccoplAngle"))->Fill(q[0], 1.); - Correlation.get(HIST("Correlation/Electron/Incoherent/CosThetaPhi"))->Fill(q[2], q[1]); - - double dp = DeltaPhi(daughter[0], daughter[1]); - Asymmetry.get(HIST("Asymmetry/Electron/Incoherent/DeltaPhi"))->Fill(dp); - if (XnXn) { - Asymmetry.get(HIST("Asymmetry/Electron/Incoherent/XnXn/DeltaPhi"))->Fill(dp); - } else if (OnOn) { - Asymmetry.get(HIST("Asymmetry/Electron/Incoherent/OnOn/DeltaPhi"))->Fill(dp); - } else if (XnOn) { - Asymmetry.get(HIST("Asymmetry/Electron/Incoherent/XnOn/DeltaPhi"))->Fill(dp); - } else if (OnXn) { - Asymmetry.get(HIST("Asymmetry/Electron/Incoherent/OnXn/DeltaPhi"))->Fill(dp); - } - - double dpRandom = DeltaPhiRandom(daughter[0], daughter[1]); - Asymmetry.get(HIST("Asymmetry/Electron/Incoherent/DeltaPhiRandom"))->Fill(dpRandom); - if (XnXn) { - Asymmetry.get(HIST("Asymmetry/Electron/Incoherent/XnXn/DeltaPhiRandom"))->Fill(dpRandom); - } else if (OnOn) { - Asymmetry.get(HIST("Asymmetry/Electron/Incoherent/OnOn/DeltaPhiRandom"))->Fill(dpRandom); - } else if (XnOn) { - Asymmetry.get(HIST("Asymmetry/Electron/Incoherent/XnOn/DeltaPhiRandom"))->Fill(dpRandom); - } else if (OnXn) { - Asymmetry.get(HIST("Asymmetry/Electron/Incoherent/OnXn/DeltaPhiRandom"))->Fill(dpRandom); - } - - delete[] q; - } // end incoherent electrons - } // end mass cut - } - } // end electrons - if (doMuons) { - if (RecoDecay::sumOfSquares(trkDaughter1.tpcNSigmaEl(), trkDaughter2.tpcNSigmaEl()) > RecoDecay::sumOfSquares(trkDaughter1.tpcNSigmaMu(), trkDaughter2.tpcNSigmaMu())) { - - auto ene1 = RecoDecay::e(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz(), massMu); - auto ene2 = RecoDecay::e(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz(), massMu); - daughter[0].SetPxPyPzE(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz(), ene1); - daughter[1].SetPxPyPzE(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz(), ene2); - mom = daughter[0] + daughter[1]; - - std::array mother = {trkDaughter1.px() + trkDaughter2.px(), trkDaughter1.py() + trkDaughter2.py(), trkDaughter1.pz() + trkDaughter2.pz()}; - - auto arrMom = std::array{daughter1, daughter2}; - float massJpsi = RecoDecay::m(arrMom, std::array{massMu, massMu}); - float rapJpsi = RecoDecay::y(mother, massJpsi); - - auto leadingP = RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()) > RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()) ? trkDaughter1 : trkDaughter2; - auto subleadingP = (leadingP == trkDaughter1) ? trkDaughter1 : trkDaughter2; - - TGmu.get(HIST("TGmu/hTrackPt1"))->Fill(trkDaughter1.pt()); - TGmu.get(HIST("TGmu/hTrackPt2"))->Fill(trkDaughter2.pt()); - TGmu.get(HIST("TGmu/hTrackEta1"))->Fill(RecoDecay::eta(daughter1)); - TGmu.get(HIST("TGmu/hTrackEta2"))->Fill(RecoDecay::eta(daughter2)); - TGmu.get(HIST("TGmu/hTrackPhi1"))->Fill(RecoDecay::phi(daughter1)); - TGmu.get(HIST("TGmu/hTrackPhi2"))->Fill(RecoDecay::phi(daughter2)); - - // selections - Selections.get(HIST("Selections/Muon/Mass/Leading/hITSNClsVsM"))->Fill(massJpsi, leadingP.itsNCls()); - Selections.get(HIST("Selections/Muon/Mass/Leading/hITSChi2NClsVsM"))->Fill(massJpsi, leadingP.itsChi2NCl()); - Selections.get(HIST("Selections/Muon/Mass/Leading/hTPCNClsVsM"))->Fill(massJpsi, leadingP.tpcNClsFindable() - leadingP.tpcNClsFindableMinusFound()); - Selections.get(HIST("Selections/Muon/Mass/Leading/hTPCChi2NClsVsM"))->Fill(massJpsi, leadingP.tpcChi2NCl()); - Selections.get(HIST("Selections/Muon/Mass/Leading/hTPCNClsCrossedRowsVsM"))->Fill(massJpsi, subleadingP.tpcNClsCrossedRows()); - Selections.get(HIST("Selections/Muon/Mass/Subleading/hITSNClsVsM"))->Fill(massJpsi, subleadingP.itsNCls()); - Selections.get(HIST("Selections/Muon/Mass/Subleading/hITSChi2NClsVsM"))->Fill(massJpsi, subleadingP.itsChi2NCl()); - Selections.get(HIST("Selections/Muon/Mass/Subleading/hTPCNClsVsM"))->Fill(massJpsi, subleadingP.tpcNClsFindable() - subleadingP.tpcNClsFindableMinusFound()); - Selections.get(HIST("Selections/Muon/Mass/Subleading/hTPCChi2NClsVsM"))->Fill(massJpsi, subleadingP.tpcChi2NCl()); - Selections.get(HIST("Selections/Muon/Mass/Subleading/hTPCNClsCrossedRowsVsM"))->Fill(massJpsi, subleadingP.tpcNClsCrossedRows()); - - Selections.get(HIST("Selections/Muon/Rapidity/Leading/hITSNClsVsY"))->Fill(rapJpsi, leadingP.itsNCls()); - Selections.get(HIST("Selections/Muon/Rapidity/Leading/hITSChi2NClsVsY"))->Fill(rapJpsi, leadingP.itsChi2NCl()); - Selections.get(HIST("Selections/Muon/Rapidity/Leading/hTPCNClsVsY"))->Fill(rapJpsi, leadingP.tpcNClsFindable() - leadingP.tpcNClsFindableMinusFound()); - Selections.get(HIST("Selections/Muon/Rapidity/Leading/hTPCChi2NClsVsY"))->Fill(rapJpsi, leadingP.tpcChi2NCl()); - Selections.get(HIST("Selections/Muon/Rapidity/Leading/hTPCNClsCrossedRowsVsY"))->Fill(rapJpsi, subleadingP.tpcNClsCrossedRows()); - Selections.get(HIST("Selections/Muon/Rapidity/Subleading/hITSNClsVsY"))->Fill(rapJpsi, subleadingP.itsNCls()); - Selections.get(HIST("Selections/Muon/Rapidity/Subleading/hITSChi2NClsVsY"))->Fill(rapJpsi, subleadingP.itsChi2NCl()); - Selections.get(HIST("Selections/Muon/Rapidity/Subleading/hTPCNClsVsY"))->Fill(rapJpsi, subleadingP.tpcNClsFindable() - subleadingP.tpcNClsFindableMinusFound()); - Selections.get(HIST("Selections/Muon/Rapidity/Subleading/hTPCChi2NClsVsY"))->Fill(rapJpsi, subleadingP.tpcChi2NCl()); - Selections.get(HIST("Selections/Muon/Rapidity/Subleading/hTPCNClsCrossedRowsVsY"))->Fill(rapJpsi, subleadingP.tpcNClsCrossedRows()); - - Selections.get(HIST("Selections/Muon/Pt/Leading/hITSNClsVsPt"))->Fill(RecoDecay::pt(mother), leadingP.itsNCls()); - Selections.get(HIST("Selections/Muon/Pt/Leading/hITSChi2NClsVsPt"))->Fill(RecoDecay::pt(mother), leadingP.itsChi2NCl()); - Selections.get(HIST("Selections/Muon/Pt/Leading/hTPCNClsVsPt"))->Fill(RecoDecay::pt(mother), leadingP.tpcNClsFindable() - leadingP.tpcNClsFindableMinusFound()); - Selections.get(HIST("Selections/Muon/Pt/Leading/hTPCChi2NClsVsPt"))->Fill(RecoDecay::pt(mother), leadingP.tpcChi2NCl()); - Selections.get(HIST("Selections/Muon/Pt/Leading/hTPCNClsCrossedRowsVsPt"))->Fill(RecoDecay::pt(mother), subleadingP.tpcNClsCrossedRows()); - Selections.get(HIST("Selections/Muon/Pt/Subleading/hITSNClsVsPt"))->Fill(RecoDecay::pt(mother), subleadingP.itsNCls()); - Selections.get(HIST("Selections/Muon/Pt/Subleading/hITSChi2NClsVsPt"))->Fill(RecoDecay::pt(mother), subleadingP.itsChi2NCl()); - Selections.get(HIST("Selections/Muon/Pt/Subleading/hTPCNClsVsPt"))->Fill(RecoDecay::pt(mother), subleadingP.tpcNClsFindable() - subleadingP.tpcNClsFindableMinusFound()); - Selections.get(HIST("Selections/Muon/Pt/Subleading/hTPCChi2NClsVsPt"))->Fill(RecoDecay::pt(mother), subleadingP.tpcChi2NCl()); - Selections.get(HIST("Selections/Muon/Pt/Subleading/hTPCNClsCrossedRowsVsPt"))->Fill(RecoDecay::pt(mother), subleadingP.tpcNClsCrossedRows()); - - if (trkDaughter1.hasTPC()) { - TGmu.get(HIST("TGmu/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.tpcSignal()); - TGmu.get(HIST("TGmu/PID/hTPCVsPt"))->Fill(trkDaughter1.pt(), trkDaughter1.tpcSignal()); - TGmu.get(HIST("TGmu/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter1), trkDaughter1.tpcSignal()); - TGmu.get(HIST("TGmu/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter1), trkDaughter1.tpcSignal()); - if (trkDaughter1.sign() < 0) { - TGmu.get(HIST("TGmu/TPCNegVsPosSignal"))->Fill(trkDaughter1.tpcSignal(), trkDaughter2.tpcSignal()); - } else { - TGmu.get(HIST("TGmu/TPCNegVsPosSignal"))->Fill(trkDaughter2.tpcSignal(), trkDaughter1.tpcSignal()); - } - } - if (trkDaughter2.hasTPC()) { - TGmu.get(HIST("TGmu/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.tpcSignal()); - TGmu.get(HIST("TGmu/PID/hTPCVsPt"))->Fill(trkDaughter2.pt(), trkDaughter2.tpcSignal()); - TGmu.get(HIST("TGmu/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter2), trkDaughter2.tpcSignal()); - TGmu.get(HIST("TGmu/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter2), trkDaughter2.tpcSignal()); - } - if (trkDaughter1.hasTOF()) { - TGmu.get(HIST("TGmu/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.beta()); - } - if (trkDaughter2.hasTOF()) { - - TGmu.get(HIST("TGmu/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.beta()); - } - - if (CandidateCuts(massJpsi, rapJpsi) != 1) { - return; - } - - TGmuCand.get(HIST("TGmuCand/hTrackPt1"))->Fill(trkDaughter1.pt()); - TGmuCand.get(HIST("TGmuCand/hTrackPt2"))->Fill(trkDaughter2.pt()); - TGmuCand.get(HIST("TGmuCand/hTrackEta1"))->Fill(RecoDecay::eta(daughter1)); - TGmuCand.get(HIST("TGmuCand/hTrackEta2"))->Fill(RecoDecay::eta(daughter2)); - TGmuCand.get(HIST("TGmuCand/hTrackPhi1"))->Fill(RecoDecay::phi(daughter1)); - TGmuCand.get(HIST("TGmuCand/hTrackPhi2"))->Fill(RecoDecay::phi(daughter2)); - TGmuCand.get(HIST("TGmuCand/hPairPt"))->Fill(RecoDecay::pt(mother)); - TGmuCand.get(HIST("TGmuCand/hPairIVM"))->Fill(massJpsi); - - if (trkDaughter1.hasTPC()) { - TGmuCand.get(HIST("TGmuCand/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.tpcSignal()); - TGmuCand.get(HIST("TGmuCand/PID/hTPCVsPt"))->Fill(trkDaughter1.pt(), trkDaughter1.tpcSignal()); - TGmuCand.get(HIST("TGmuCand/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter1), trkDaughter1.tpcSignal()); - TGmuCand.get(HIST("TGmuCand/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter1), trkDaughter1.tpcSignal()); - } - if (trkDaughter2.hasTPC()) { - TGmuCand.get(HIST("TGmuCand/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.tpcSignal()); - TGmuCand.get(HIST("TGmuCand/PID/hTPCVsPt"))->Fill(trkDaughter2.pt(), trkDaughter2.tpcSignal()); - TGmuCand.get(HIST("TGmuCand/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter2), trkDaughter2.tpcSignal()); - TGmuCand.get(HIST("TGmuCand/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter2), trkDaughter2.tpcSignal()); - } - if (trkDaughter1.hasTOF()) { - TGmuCand.get(HIST("TGmuCand/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.beta()); - } - if (trkDaughter2.hasTOF()) { - TGmuCand.get(HIST("TGmuCand/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.beta()); - } - - if (RecoDecay::pt(mother) < 0.2f) { - JPsiToMu.get(HIST("JPsiToMu/Coherent/hIVM"))->Fill(massJpsi); - if (XnXn) { - JPsiToMu.get(HIST("JPsiToMu/Coherent/XnXn/hIVM"))->Fill(massJpsi); - } else if (OnXn) { - JPsiToMu.get(HIST("JPsiToMu/Coherent/OnXn/hIVM"))->Fill(massJpsi); - } else if (XnOn) { - JPsiToMu.get(HIST("JPsiToMu/Coherent/XnOn/hIVM"))->Fill(massJpsi); - } else if (OnOn) { - JPsiToMu.get(HIST("JPsiToMu/Coherent/OnOn/hIVM"))->Fill(massJpsi); - } - } else if (RecoDecay::pt(mother) > 0.4f) { - JPsiToMu.get(HIST("JPsiToMu/NotCoherent/hIVM"))->Fill(massJpsi); - if (XnXn) { - JPsiToMu.get(HIST("JPsiToMu/NotCoherent/XnXn/hIVM"))->Fill(massJpsi); - } else if (OnXn) { - JPsiToMu.get(HIST("JPsiToMu/NotCoherent/OnXn/hIVM"))->Fill(massJpsi); - } else if (XnOn) { - JPsiToMu.get(HIST("JPsiToMu/NotCoherent/XnOn/hIVM"))->Fill(massJpsi); - } else if (OnOn) { - JPsiToMu.get(HIST("JPsiToMu/NotCoherent/OnOn/hIVM"))->Fill(massJpsi); - } - } - if (RecoDecay::pt(mother) > 0.2f) { - JPsiToMu.get(HIST("JPsiToMu/Incoherent/hIVM"))->Fill(massJpsi); - if (XnXn) { - JPsiToMu.get(HIST("JPsiToMu/Incoherent/XnXn/hIVM"))->Fill(massJpsi); - } else if (OnXn) { - JPsiToMu.get(HIST("JPsiToMu/Incoherent/OnXn/hIVM"))->Fill(massJpsi); - } else if (XnOn) { - JPsiToMu.get(HIST("JPsiToMu/Incoherent/XnOn/hIVM"))->Fill(massJpsi); - } else if (OnOn) { - JPsiToMu.get(HIST("JPsiToMu/Incoherent/OnOn/hIVM"))->Fill(massJpsi); - } - } - - if ((massJpsi < maxJpsiMass) && (massJpsi > minJpsiMass)) { - TGmuCand.get(HIST("TGmuCand/hJpsiPt"))->Fill(RecoDecay::pt(mother)); - if (RecoDecay::pt(mother) < 0.1f) { - TGmuCand.get(HIST("TGmuCand/hJpsiPt2"))->Fill(RecoDecay::pt(mother) * RecoDecay::pt(mother)); - if (XnXn) { - TGmuCand.get(HIST("TGmuCand/XnXn/hJpsiPt2"))->Fill(RecoDecay::pt(mother) * RecoDecay::pt(mother)); - } else if (XnOn) { - TGmuCand.get(HIST("TGmuCand/XnOn/hJpsiPt2"))->Fill(RecoDecay::pt(mother) * RecoDecay::pt(mother)); - } else if (OnXn) { - TGmuCand.get(HIST("TGmuCand/OnXn/hJpsiPt2"))->Fill(RecoDecay::pt(mother) * RecoDecay::pt(mother)); - } else if (OnOn) { - TGmuCand.get(HIST("TGmuCand/OnOn/hJpsiPt2"))->Fill(RecoDecay::pt(mother) * RecoDecay::pt(mother)); - } - } - TGmuCand.get(HIST("TGmuCand/hJpsiRap"))->Fill(rapJpsi); - if (trkDaughter1.sign() < 0) { - TGmuCand.get(HIST("TGmuCand/TPCNegVsPosSignal"))->Fill(trkDaughter1.tpcSignal(), trkDaughter2.tpcSignal()); - } else { - TGmuCand.get(HIST("TGmuCand/TPCNegVsPosSignal"))->Fill(trkDaughter2.tpcSignal(), trkDaughter1.tpcSignal()); - } - - if (RecoDecay::pt(mother) < 0.2f) { - // fill track histos - TGmuCand.get(HIST("TGmuCand/hJpsiPt2wide"))->Fill(RecoDecay::pt(mother) * RecoDecay::pt(mother)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/hPt1"))->Fill(trkDaughter1.pt()); - JPsiToMu.get(HIST("JPsiToMu/Coherent/hPt2"))->Fill(trkDaughter2.pt()); - JPsiToMu.get(HIST("JPsiToMu/Coherent/hEta1"))->Fill(RecoDecay::eta(daughter1)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/hEta2"))->Fill(RecoDecay::eta(daughter2)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/hPhi1"))->Fill(RecoDecay::phi(daughter1)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/hPhi2"))->Fill(RecoDecay::phi(daughter2)); - - if (XnXn) { - JPsiToMu.get(HIST("JPsiToMu/Coherent/XnXn/hPt1"))->Fill(trkDaughter1.pt()); - JPsiToMu.get(HIST("JPsiToMu/Coherent/XnXn/hPt2"))->Fill(trkDaughter2.pt()); - JPsiToMu.get(HIST("JPsiToMu/Coherent/XnXn/hEta1"))->Fill(RecoDecay::eta(daughter1)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/XnXn/hEta2"))->Fill(RecoDecay::eta(daughter2)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/XnXn/hPhi1"))->Fill(RecoDecay::phi(daughter1)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/XnXn/hPhi2"))->Fill(RecoDecay::phi(daughter2)); - TGmuCand.get(HIST("TGmuCand/XnXn/hJpsiPt2wide"))->Fill(RecoDecay::pt(mother) * RecoDecay::pt(mother)); - } else if (OnOn) { - JPsiToMu.get(HIST("JPsiToMu/Coherent/OnOn/hPt1"))->Fill(trkDaughter1.pt()); - JPsiToMu.get(HIST("JPsiToMu/Coherent/OnOn/hPt2"))->Fill(trkDaughter2.pt()); - JPsiToMu.get(HIST("JPsiToMu/Coherent/OnOn/hEta1"))->Fill(RecoDecay::eta(daughter1)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/OnOn/hEta2"))->Fill(RecoDecay::eta(daughter2)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/OnOn/hPhi1"))->Fill(RecoDecay::phi(daughter1)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/OnOn/hPhi2"))->Fill(RecoDecay::phi(daughter2)); - TGmuCand.get(HIST("TGmuCand/OnOn/hJpsiPt2wide"))->Fill(RecoDecay::pt(mother) * RecoDecay::pt(mother)); - } else if (XnOn) { - JPsiToMu.get(HIST("JPsiToMu/Coherent/XnOn/hPt1"))->Fill(trkDaughter1.pt()); - JPsiToMu.get(HIST("JPsiToMu/Coherent/XnOn/hPt2"))->Fill(trkDaughter2.pt()); - JPsiToMu.get(HIST("JPsiToMu/Coherent/XnOn/hEta1"))->Fill(RecoDecay::eta(daughter1)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/XnOn/hEta2"))->Fill(RecoDecay::eta(daughter2)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/XnOn/hPhi1"))->Fill(RecoDecay::phi(daughter1)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/XnOn/hPhi2"))->Fill(RecoDecay::phi(daughter2)); - TGmuCand.get(HIST("TGmuCand/XnOn/hJpsiPt2wide"))->Fill(RecoDecay::pt(mother) * RecoDecay::pt(mother)); - } else if (OnXn) { - JPsiToMu.get(HIST("JPsiToMu/Coherent/OnXn/hPt1"))->Fill(trkDaughter1.pt()); - JPsiToMu.get(HIST("JPsiToMu/Coherent/OnXn/hPt2"))->Fill(trkDaughter2.pt()); - JPsiToMu.get(HIST("JPsiToMu/Coherent/OnXn/hEta1"))->Fill(RecoDecay::eta(daughter1)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/OnXn/hEta2"))->Fill(RecoDecay::eta(daughter2)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/OnXn/hPhi1"))->Fill(RecoDecay::phi(daughter1)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/OnXn/hPhi2"))->Fill(RecoDecay::phi(daughter2)); - TGmuCand.get(HIST("TGmuCand/OnXn/hJpsiPt2wide"))->Fill(RecoDecay::pt(mother) * RecoDecay::pt(mother)); - } - - if (trkDaughter1.hasTPC()) { - JPsiToMu.get(HIST("JPsiToMu/Coherent/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.tpcSignal()); - JPsiToMu.get(HIST("JPsiToMu/Coherent/PID/hTPCVsPt"))->Fill(trkDaughter1.pt(), trkDaughter1.tpcSignal()); - JPsiToMu.get(HIST("JPsiToMu/Coherent/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter1), trkDaughter1.tpcSignal()); - JPsiToMu.get(HIST("JPsiToMu/Coherent/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter1), trkDaughter1.tpcSignal()); - } - if (trkDaughter2.hasTPC()) { - JPsiToMu.get(HIST("JPsiToMu/Coherent/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.tpcSignal()); - JPsiToMu.get(HIST("JPsiToMu/Coherent/PID/hTPCVsPt"))->Fill(trkDaughter2.pt(), trkDaughter2.tpcSignal()); - JPsiToMu.get(HIST("JPsiToMu/Coherent/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter2), trkDaughter2.tpcSignal()); - JPsiToMu.get(HIST("JPsiToMu/Coherent/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter2), trkDaughter2.tpcSignal()); - } - if (trkDaughter1.hasTOF()) { - JPsiToMu.get(HIST("JPsiToMu/Coherent/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.beta()); - } - if (trkDaughter2.hasTOF()) { - JPsiToMu.get(HIST("JPsiToMu/Coherent/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.beta()); - } - // fill J/psi histos - JPsiToMu.get(HIST("JPsiToMu/Coherent/hPt"))->Fill(RecoDecay::pt(mother)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/hEta"))->Fill(RecoDecay::eta(mother)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/hPhi"))->Fill(RecoDecay::phi(mother)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/hRap"))->Fill(rapJpsi); - - if (XnXn) { - JPsiToMu.get(HIST("JPsiToMu/Coherent/XnXn/hPt"))->Fill(RecoDecay::pt(mother)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/XnXn/hEta"))->Fill(RecoDecay::eta(mother)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/XnXn/hPhi"))->Fill(RecoDecay::phi(mother)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/XnXn/hRap"))->Fill(rapJpsi); - } else if (OnOn) { - JPsiToMu.get(HIST("JPsiToMu/Coherent/OnOn/hPt"))->Fill(RecoDecay::pt(mother)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/OnOn/hEta"))->Fill(RecoDecay::eta(mother)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/OnOn/hPhi"))->Fill(RecoDecay::phi(mother)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/OnOn/hRap"))->Fill(rapJpsi); - } else if (OnXn) { - JPsiToMu.get(HIST("JPsiToMu/Coherent/OnXn/hPt"))->Fill(RecoDecay::pt(mother)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/OnXn/hEta"))->Fill(RecoDecay::eta(mother)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/OnXn/hPhi"))->Fill(RecoDecay::phi(mother)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/OnXn/hRap"))->Fill(rapJpsi); - } else if (XnOn) { - JPsiToMu.get(HIST("JPsiToMu/Coherent/XnOn/hPt"))->Fill(RecoDecay::pt(mother)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/XnOn/hEta"))->Fill(RecoDecay::eta(mother)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/XnOn/hPhi"))->Fill(RecoDecay::phi(mother)); - JPsiToMu.get(HIST("JPsiToMu/Coherent/XnOn/hRap"))->Fill(rapJpsi); - } - - float* q = correlation(&daughter[0], &daughter[1], &mom); - Correlation.get(HIST("Correlation/Muon/Coherent/Phi1"))->Fill(RecoDecay::phi(daughter1), 1.); - Correlation.get(HIST("Correlation/Muon/Coherent/Phi2"))->Fill(RecoDecay::phi(daughter2), 1.); - Correlation.get(HIST("Correlation/Muon/Coherent/Phi"))->Fill(q[1], 1.); - Correlation.get(HIST("Correlation/Muon/Coherent/CosTheta"))->Fill(q[2], 1.); - Correlation.get(HIST("Correlation/Muon/Coherent/AccoplAngle"))->Fill(q[0], 1.); - Correlation.get(HIST("Correlation/Muon/Coherent/CosThetaPhi"))->Fill(q[2], q[1]); - - double dp = DeltaPhi(daughter[0], daughter[1]); - Asymmetry.get(HIST("Asymmetry/Muon/Coherent/DeltaPhi"))->Fill(dp); - if (XnXn) { - Asymmetry.get(HIST("Asymmetry/Muon/Coherent/XnXn/DeltaPhi"))->Fill(dp); - } else if (OnOn) { - Asymmetry.get(HIST("Asymmetry/Muon/Coherent/OnOn/DeltaPhi"))->Fill(dp); - } else if (XnOn) { - Asymmetry.get(HIST("Asymmetry/Muon/Coherent/XnOn/DeltaPhi"))->Fill(dp); - } else if (OnXn) { - Asymmetry.get(HIST("Asymmetry/Muon/Coherent/OnXn/DeltaPhi"))->Fill(dp); - } - double dpRandom = DeltaPhiRandom(daughter[0], daughter[1]); - Asymmetry.get(HIST("Asymmetry/Muon/Coherent/DeltaPhiRandom"))->Fill(dpRandom); - if (XnXn) { - Asymmetry.get(HIST("Asymmetry/Muon/Coherent/XnXn/DeltaPhiRandom"))->Fill(dpRandom); - } else if (OnOn) { - Asymmetry.get(HIST("Asymmetry/Muon/Coherent/OnOn/DeltaPhiRandom"))->Fill(dpRandom); - } else if (XnOn) { - Asymmetry.get(HIST("Asymmetry/Muon/Coherent/XnOn/DeltaPhiRandom"))->Fill(dpRandom); - } else if (OnXn) { - Asymmetry.get(HIST("Asymmetry/Muon/Coherent/OnXn/DeltaPhiRandom"))->Fill(dpRandom); - } - - delete[] q; - } - if (RecoDecay::pt(mother) > 0.2f) { - // fill track histos - JPsiToMu.get(HIST("JPsiToMu/Incoherent/hPt1"))->Fill(trkDaughter1.pt()); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/hPt2"))->Fill(trkDaughter2.pt()); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/hEta1"))->Fill(RecoDecay::eta(daughter1)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/hEta2"))->Fill(RecoDecay::eta(daughter2)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/hPhi1"))->Fill(RecoDecay::phi(daughter1)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/hPhi2"))->Fill(RecoDecay::phi(daughter2)); - - if (XnXn) { - JPsiToMu.get(HIST("JPsiToMu/Incoherent/XnXn/hPt1"))->Fill(trkDaughter1.pt()); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/XnXn/hPt2"))->Fill(trkDaughter2.pt()); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/XnXn/hEta1"))->Fill(RecoDecay::eta(daughter1)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/XnXn/hEta2"))->Fill(RecoDecay::eta(daughter2)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/XnXn/hPhi1"))->Fill(RecoDecay::phi(daughter1)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/XnXn/hPhi2"))->Fill(RecoDecay::phi(daughter2)); - } else if (OnOn) { - JPsiToMu.get(HIST("JPsiToMu/Incoherent/OnOn/hPt1"))->Fill(trkDaughter1.pt()); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/OnOn/hPt2"))->Fill(trkDaughter2.pt()); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/OnOn/hEta1"))->Fill(RecoDecay::eta(daughter1)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/OnOn/hEta2"))->Fill(RecoDecay::eta(daughter2)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/OnOn/hPhi1"))->Fill(RecoDecay::phi(daughter1)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/OnOn/hPhi2"))->Fill(RecoDecay::phi(daughter2)); - } else if (XnOn) { - JPsiToMu.get(HIST("JPsiToMu/Incoherent/XnOn/hPt1"))->Fill(trkDaughter1.pt()); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/XnOn/hPt2"))->Fill(trkDaughter2.pt()); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/XnOn/hEta1"))->Fill(RecoDecay::eta(daughter1)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/XnOn/hEta2"))->Fill(RecoDecay::eta(daughter2)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/XnOn/hPhi1"))->Fill(RecoDecay::phi(daughter1)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/XnOn/hPhi2"))->Fill(RecoDecay::phi(daughter2)); - } else if (OnXn) { - JPsiToMu.get(HIST("JPsiToMu/Incoherent/OnXn/hPt1"))->Fill(trkDaughter1.pt()); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/OnXn/hPt2"))->Fill(trkDaughter2.pt()); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/OnXn/hEta1"))->Fill(RecoDecay::eta(daughter1)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/OnXn/hEta2"))->Fill(RecoDecay::eta(daughter2)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/OnXn/hPhi1"))->Fill(RecoDecay::phi(daughter1)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/OnXn/hPhi2"))->Fill(RecoDecay::phi(daughter2)); - } - - if (trkDaughter1.hasTPC()) { - JPsiToMu.get(HIST("JPsiToMu/Incoherent/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.tpcSignal()); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/PID/hTPCVsPt"))->Fill(trkDaughter1.pt(), trkDaughter1.tpcSignal()); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter1), trkDaughter1.tpcSignal()); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter1), trkDaughter1.tpcSignal()); - } - if (trkDaughter2.hasTPC()) { - JPsiToMu.get(HIST("JPsiToMu/Incoherent/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.tpcSignal()); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/PID/hTPCVsPt"))->Fill(trkDaughter2.pt(), trkDaughter2.tpcSignal()); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter2), trkDaughter2.tpcSignal()); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter2), trkDaughter2.tpcSignal()); - } - if (trkDaughter1.hasTOF()) { - JPsiToMu.get(HIST("JPsiToMu/Incoherent/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.beta()); - } - if (trkDaughter2.hasTOF()) { - JPsiToMu.get(HIST("JPsiToMu/Incoherent/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.beta()); - } - - // fill J/psi histos - JPsiToMu.get(HIST("JPsiToMu/Incoherent/hPt"))->Fill(RecoDecay::pt(mother)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/hEta"))->Fill(RecoDecay::eta(mother)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/hPhi"))->Fill(RecoDecay::phi(mother)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/hRap"))->Fill(rapJpsi); - - if (XnXn) { - JPsiToMu.get(HIST("JPsiToMu/Incoherent/XnXn/hPt"))->Fill(RecoDecay::pt(mother)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/XnXn/hEta"))->Fill(RecoDecay::eta(mother)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/XnXn/hPhi"))->Fill(RecoDecay::phi(mother)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/XnXn/hRap"))->Fill(rapJpsi); - } else if (OnOn) { - JPsiToMu.get(HIST("JPsiToMu/Incoherent/OnOn/hPt"))->Fill(RecoDecay::pt(mother)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/OnOn/hEta"))->Fill(RecoDecay::eta(mother)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/OnOn/hPhi"))->Fill(RecoDecay::phi(mother)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/OnOn/hRap"))->Fill(rapJpsi); - } else if (OnXn) { - JPsiToMu.get(HIST("JPsiToMu/Incoherent/OnXn/hPt"))->Fill(RecoDecay::pt(mother)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/OnXn/hEta"))->Fill(RecoDecay::eta(mother)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/OnXn/hPhi"))->Fill(RecoDecay::phi(mother)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/OnXn/hRap"))->Fill(rapJpsi); - } else if (XnOn) { - JPsiToMu.get(HIST("JPsiToMu/Incoherent/XnOn/hPt"))->Fill(RecoDecay::pt(mother)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/XnOn/hEta"))->Fill(RecoDecay::eta(mother)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/XnOn/hPhi"))->Fill(RecoDecay::phi(mother)); - JPsiToMu.get(HIST("JPsiToMu/Incoherent/XnOn/hRap"))->Fill(rapJpsi); - } - - float* q = correlation(&daughter[0], &daughter[1], &mom); - Correlation.get(HIST("Correlation/Muon/Incoherent/Phi1"))->Fill(RecoDecay::phi(daughter1), 1.); - Correlation.get(HIST("Correlation/Muon/Incoherent/Phi2"))->Fill(RecoDecay::phi(daughter2), 1.); - Correlation.get(HIST("Correlation/Muon/Incoherent/Phi"))->Fill(q[1], 1.); - Correlation.get(HIST("Correlation/Muon/Incoherent/CosTheta"))->Fill(q[2], 1.); - Correlation.get(HIST("Correlation/Muon/Incoherent/AccoplAngle"))->Fill(q[0], 1.); - Correlation.get(HIST("Correlation/Muon/Incoherent/CosThetaPhi"))->Fill(q[2], q[1]); - - double dp = DeltaPhi(daughter[0], daughter[1]); - Asymmetry.get(HIST("Asymmetry/Muon/Incoherent/DeltaPhi"))->Fill(dp); - if (XnXn) { - Asymmetry.get(HIST("Asymmetry/Muon/Incoherent/XnXn/DeltaPhi"))->Fill(dp); - } else if (OnOn) { - Asymmetry.get(HIST("Asymmetry/Muon/Incoherent/OnOn/DeltaPhi"))->Fill(dp); - } else if (XnOn) { - Asymmetry.get(HIST("Asymmetry/Muon/Incoherent/XnOn/DeltaPhi"))->Fill(dp); - } else if (OnXn) { - Asymmetry.get(HIST("Asymmetry/Muon/Incoherent/OnXn/DeltaPhi"))->Fill(dp); - } - - double dpRandom = DeltaPhiRandom(daughter[0], daughter[1]); - Asymmetry.get(HIST("Asymmetry/Muon/Incoherent/DeltaPhiRandom"))->Fill(dpRandom); - if (XnXn) { - Asymmetry.get(HIST("Asymmetry/Muon/Incoherent/XnXn/DeltaPhiRandom"))->Fill(dpRandom); - } else if (OnOn) { - Asymmetry.get(HIST("Asymmetry/Muon/Incoherent/OnOn/DeltaPhiRandom"))->Fill(dpRandom); - } else if (XnOn) { - Asymmetry.get(HIST("Asymmetry/Muon/Incoherent/XnOn/DeltaPhiRandom"))->Fill(dpRandom); - } else if (OnXn) { - Asymmetry.get(HIST("Asymmetry/Muon/Incoherent/OnXn/DeltaPhiRandom"))->Fill(dpRandom); - } - - delete[] q; - } - } - } - } // end muons - if (doProtons) { - if (RecoDecay::sumOfSquares((trkDaughter1.hasTOF() ? trkDaughter1.tofNSigmaPr() : trkDaughter1.tpcNSigmaPr()), (trkDaughter2.hasTOF() ? trkDaughter2.tofNSigmaPr() : trkDaughter2.tpcNSigmaPr()) < 4)) { - - auto ene1 = RecoDecay::e(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz(), massPr); - auto ene2 = RecoDecay::e(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz(), massPr); - daughter[0].SetPxPyPzE(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz(), ene1); - daughter[1].SetPxPyPzE(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz(), ene2); - mom = daughter[0] + daughter[1]; - - std::array mother = {trkDaughter1.px() + trkDaughter2.px(), trkDaughter1.py() + trkDaughter2.py(), trkDaughter1.pz() + trkDaughter2.pz()}; - - if (TOFBothProtons) { - if (!trkDaughter1.hasTOF() || !trkDaughter2.hasTOF()) - return; - } - if (TOFOneProton) { - if ((trkDaughter1.hasTOF() && trkDaughter2.hasTOF()) || (!trkDaughter1.hasTOF() && !trkDaughter2.hasTOF())) - return; - } - if (TOFAtLeastOneProton) { - if (!trkDaughter1.hasTOF() && !trkDaughter2.hasTOF()) - return; - } - - auto arrMom = std::array{daughter1, daughter2}; - float massJpsi = RecoDecay::m(arrMom, std::array{massPr, massPr}); - float rapJpsi = RecoDecay::y(mother, massJpsi); - - TGp.get(HIST("TGp/hTrackPt1"))->Fill(trkDaughter1.pt()); - TGp.get(HIST("TGp/hTrackPt2"))->Fill(trkDaughter2.pt()); - TGp.get(HIST("TGp/hTrackEta1"))->Fill(RecoDecay::eta(daughter1)); - TGp.get(HIST("TGp/hTrackEta2"))->Fill(RecoDecay::eta(daughter2)); - TGp.get(HIST("TGp/hTrackPhi1"))->Fill(RecoDecay::phi(daughter1)); - TGp.get(HIST("TGp/hTrackPhi2"))->Fill(RecoDecay::phi(daughter2)); - - if (trkDaughter1.hasTPC()) { - TGp.get(HIST("TGp/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.tpcSignal()); - TGp.get(HIST("TGp/PID/hTPCVsPt"))->Fill(trkDaughter1.pt(), trkDaughter1.tpcSignal()); - TGp.get(HIST("TGp/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter1), trkDaughter1.tpcSignal()); - TGp.get(HIST("TGp/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter1), trkDaughter1.tpcSignal()); - } - if (trkDaughter2.hasTPC()) { - TGp.get(HIST("TGp/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.tpcSignal()); - TGp.get(HIST("TGp/PID/hTPCVsPt"))->Fill(trkDaughter2.pt(), trkDaughter2.tpcSignal()); - TGp.get(HIST("TGp/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter2), trkDaughter2.tpcSignal()); - TGp.get(HIST("TGp/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter2), trkDaughter2.tpcSignal()); - } - if (trkDaughter1.hasTOF()) { - TGp.get(HIST("TGp/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.beta()); - } - if (trkDaughter2.hasTOF()) { - TGp.get(HIST("TGp/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.beta()); - } - - if (CandidateCuts(massJpsi, rapJpsi) != 1) { - return; - } - - TGpCand.get(HIST("TGpCand/hTrackPt1"))->Fill(trkDaughter1.pt()); - TGpCand.get(HIST("TGpCand/hTrackPt2"))->Fill(trkDaughter2.pt()); - TGpCand.get(HIST("TGpCand/hTrackEta1"))->Fill(RecoDecay::eta(daughter1)); - TGpCand.get(HIST("TGpCand/hTrackEta2"))->Fill(RecoDecay::eta(daughter2)); - TGpCand.get(HIST("TGpCand/hTrackPhi1"))->Fill(RecoDecay::phi(daughter1)); - TGpCand.get(HIST("TGpCand/hTrackPhi2"))->Fill(RecoDecay::phi(daughter2)); - TGpCand.get(HIST("TGpCand/hPairPt"))->Fill(RecoDecay::pt(mother)); - TGpCand.get(HIST("TGpCand/hPairIVM"))->Fill(massJpsi); - - if (trkDaughter1.hasTPC()) { - TGpCand.get(HIST("TGpCand/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.tpcSignal()); - TGpCand.get(HIST("TGpCand/PID/hTPCVsPt"))->Fill(trkDaughter1.pt(), trkDaughter1.tpcSignal()); - TGpCand.get(HIST("TGpCand/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter1), trkDaughter1.tpcSignal()); - TGpCand.get(HIST("TGpCand/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter1), trkDaughter1.tpcSignal()); - } - if (trkDaughter2.hasTPC()) { - TGpCand.get(HIST("TGpCand/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.tpcSignal()); - TGpCand.get(HIST("TGpCand/PID/hTPCVsPt"))->Fill(trkDaughter2.pt(), trkDaughter2.tpcSignal()); - TGpCand.get(HIST("TGpCand/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter2), trkDaughter2.tpcSignal()); - TGpCand.get(HIST("TGpCand/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter2), trkDaughter2.tpcSignal()); - } - if (trkDaughter1.hasTOF()) { - TGpCand.get(HIST("TGpCand/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.beta()); - } - if (trkDaughter2.hasTOF()) { - TGpCand.get(HIST("TGpCand/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.beta()); - } - - if (RecoDecay::pt(mother) < 0.2f) { - JPsiToP.get(HIST("JPsiToP/Coherent/hIVM"))->Fill(massJpsi); - } else { - JPsiToP.get(HIST("JPsiToP/Incoherent/hIVM"))->Fill(massJpsi); - } - - if (massJpsi < maxJpsiMass && massJpsi > minJpsiMass) { - TGpCand.get(HIST("TGpCand/hJpsiPt"))->Fill(RecoDecay::pt(mother)); - TGpCand.get(HIST("TGpCand/hJpsiRap"))->Fill(rapJpsi); - if (RecoDecay::pt(mother) < 0.2f) { - // fill track histos - JPsiToP.get(HIST("JPsiToP/Coherent/hPt1"))->Fill(trkDaughter1.pt()); - JPsiToP.get(HIST("JPsiToP/Coherent/hPt2"))->Fill(trkDaughter2.pt()); - JPsiToP.get(HIST("JPsiToP/Coherent/hEta1"))->Fill(RecoDecay::eta(daughter1)); - JPsiToP.get(HIST("JPsiToP/Coherent/hEta2"))->Fill(RecoDecay::eta(daughter2)); - JPsiToP.get(HIST("JPsiToP/Coherent/hPhi1"))->Fill(RecoDecay::phi(daughter1)); - JPsiToP.get(HIST("JPsiToP/Coherent/hPhi2"))->Fill(RecoDecay::phi(daughter2)); - if (trkDaughter1.hasTPC()) { - JPsiToP.get(HIST("JPsiToP/Coherent/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.tpcSignal()); - JPsiToP.get(HIST("JPsiToP/Coherent/PID/hTPCVsPt"))->Fill(trkDaughter1.pt(), trkDaughter1.tpcSignal()); - JPsiToP.get(HIST("JPsiToP/Coherent/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter1), trkDaughter1.tpcSignal()); - JPsiToP.get(HIST("JPsiToP/Coherent/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter1), trkDaughter1.tpcSignal()); - } - if (trkDaughter2.hasTPC()) { - JPsiToP.get(HIST("JPsiToP/Coherent/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.tpcSignal()); - JPsiToP.get(HIST("JPsiToP/Coherent/PID/hTPCVsPt"))->Fill(trkDaughter2.pt(), trkDaughter2.tpcSignal()); - JPsiToP.get(HIST("JPsiToP/Coherent/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter2), trkDaughter2.tpcSignal()); - JPsiToP.get(HIST("JPsiToP/Coherent/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter2), trkDaughter2.tpcSignal()); - } - if (trkDaughter1.hasTOF()) { - JPsiToP.get(HIST("JPsiToP/Coherent/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.beta()); - } - if (trkDaughter2.hasTOF()) { - JPsiToP.get(HIST("JPsiToP/Coherent/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.beta()); - } - // fill J/psi histos - JPsiToP.get(HIST("JPsiToP/Coherent/hPt"))->Fill(RecoDecay::pt(mother)); - JPsiToP.get(HIST("JPsiToP/Coherent/hEta"))->Fill(RecoDecay::eta(mother)); - JPsiToP.get(HIST("JPsiToP/Coherent/hPhi"))->Fill(RecoDecay::phi(mother)); - JPsiToP.get(HIST("JPsiToP/Coherent/hRap"))->Fill(rapJpsi); - } // end coherent - if (RecoDecay::pt(mother) > 0.2f) { - // fill track histos - JPsiToP.get(HIST("JPsiToP/Incoherent/hPt1"))->Fill(trkDaughter1.pt()); - JPsiToP.get(HIST("JPsiToP/Incoherent/hPt2"))->Fill(trkDaughter2.pt()); - JPsiToP.get(HIST("JPsiToP/Incoherent/hEta1"))->Fill(RecoDecay::eta(daughter1)); - JPsiToP.get(HIST("JPsiToP/Incoherent/hEta2"))->Fill(RecoDecay::eta(daughter2)); - JPsiToP.get(HIST("JPsiToP/Incoherent/hPhi1"))->Fill(RecoDecay::phi(daughter1)); - JPsiToP.get(HIST("JPsiToP/Incoherent/hPhi2"))->Fill(RecoDecay::phi(daughter2)); - if (trkDaughter1.hasTPC()) { - JPsiToP.get(HIST("JPsiToP/Incoherent/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.tpcSignal()); - JPsiToP.get(HIST("JPsiToP/Incoherent/PID/hTPCVsPt"))->Fill(trkDaughter1.pt(), trkDaughter1.tpcSignal()); - JPsiToP.get(HIST("JPsiToP/Incoherent/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter1), trkDaughter1.tpcSignal()); - JPsiToP.get(HIST("JPsiToP/Incoherent/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter1), trkDaughter1.tpcSignal()); - } - if (trkDaughter2.hasTPC()) { - JPsiToP.get(HIST("JPsiToP/Incoherent/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.tpcSignal()); - JPsiToP.get(HIST("JPsiToP/Incoherent/PID/hTPCVsPt"))->Fill(trkDaughter2.pt(), trkDaughter2.tpcSignal()); - JPsiToP.get(HIST("JPsiToP/Incoherent/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter2), trkDaughter2.tpcSignal()); - JPsiToP.get(HIST("JPsiToP/Incoherent/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter2), trkDaughter2.tpcSignal()); - } - if (trkDaughter1.hasTOF()) { - JPsiToP.get(HIST("JPsiToP/Incoherent/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.beta()); - } - if (trkDaughter2.hasTOF()) { - JPsiToP.get(HIST("JPsiToP/Incoherent/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.beta()); - } - // fill J/psi histos - JPsiToP.get(HIST("JPsiToP/Incoherent/hPt"))->Fill(RecoDecay::pt(mother)); - JPsiToP.get(HIST("JPsiToP/Incoherent/hEta"))->Fill(RecoDecay::eta(mother)); - JPsiToP.get(HIST("JPsiToP/Incoherent/hPhi"))->Fill(RecoDecay::phi(mother)); - JPsiToP.get(HIST("JPsiToP/Incoherent/hRap"))->Fill(rapJpsi); - } // end incoherent - } // end mass cut - } - } // end protons - } // end two tracks - } // end reco process - - template - void processMC(C const& mcCollision, T const& mcParticles) - { - - MC.get(HIST("MC/hNumberOfMCCollisions"))->Fill(1.); - MC.get(HIST("MC/hPosZ"))->Fill(mcCollision.posZ()); - - std::array daughPart1Mu; - std::array daughPart2Mu; - std::array daughPart1El; - std::array daughPart2El; - std::array daughPart1Pr; - std::array daughPart2Pr; - - // fill number of particles - for (auto const& mcParticle : mcParticles) { - MC.get(HIST("MC/Muon/hNumberOfMCTracks"))->Fill(1.); - MC.get(HIST("MC/Electron/hNumberOfMCTracks"))->Fill(1.); - MC.get(HIST("MC/Proton/hNumberOfMCTracks"))->Fill(1.); - MC.get(HIST("MC/hPDG"))->Fill(mcParticle.pdgCode()); - - // check if only muons and physical primaries are present - if ((mcParticle.pdgCode() == 13) && mcParticle.isPhysicalPrimary()) { - daughPart1Mu = {mcParticle.px(), mcParticle.py(), mcParticle.pz()}; - - MC.get(HIST("MC/Muon/hNumberOfMCTracks"))->Fill(2.); - } - if ((mcParticle.pdgCode() == -13) && mcParticle.isPhysicalPrimary()) { - daughPart2Mu = {mcParticle.px(), mcParticle.py(), mcParticle.pz()}; - - MC.get(HIST("MC/Muon/hNumberOfMCTracks"))->Fill(3.); - } - if ((mcParticle.pdgCode() == 11) && mcParticle.isPhysicalPrimary()) { - daughPart1El = {mcParticle.px(), mcParticle.py(), mcParticle.pz()}; - - MC.get(HIST("MC/Electron/hNumberOfMCTracks"))->Fill(2.); - } - if ((mcParticle.pdgCode() == -11) && mcParticle.isPhysicalPrimary()) { - daughPart2El = {mcParticle.px(), mcParticle.py(), mcParticle.pz()}; - - MC.get(HIST("MC/Electron/hNumberOfMCTracks"))->Fill(3.); - } - if ((mcParticle.pdgCode() == 2212) && mcParticle.isPhysicalPrimary()) { - daughPart1Pr = {mcParticle.px(), mcParticle.py(), mcParticle.pz()}; - - MC.get(HIST("MC/Proton/hNumberOfMCTracks"))->Fill(2.); - } - if ((mcParticle.pdgCode() == -2212) && mcParticle.isPhysicalPrimary()) { - daughPart2Pr = {mcParticle.px(), mcParticle.py(), mcParticle.pz()}; - - MC.get(HIST("MC/Proton/hNumberOfMCTracks"))->Fill(3.); - } - } - - // calculate J/psi system and needed distributions - std::array motherPartMu = {daughPart1Mu[0] + daughPart2Mu[0], daughPart1Mu[1] + daughPart2Mu[1], daughPart1Mu[2] + daughPart2Mu[2]}; - std::array motherPartEl = {daughPart1El[0] + daughPart2El[0], daughPart1El[1] + daughPart2El[1], daughPart1El[2] + daughPart2El[2]}; - std::array motherPartPr = {daughPart1Pr[0] + daughPart2Pr[0], daughPart1Pr[1] + daughPart2Pr[1], daughPart1Pr[2] + daughPart2Pr[2]}; - - float massEl = o2::constants::physics::MassElectron; - float massMu = o2::constants::physics::MassMuonMinus; - float massPr = o2::constants::physics::MassProton; - - auto arrMomMu = std::array{daughPart1Mu, daughPart2Mu}; - float massJpsiMu = RecoDecay::m(arrMomMu, std::array{massMu, massMu}); - auto arrMomEl = std::array{daughPart1El, daughPart2El}; - float massJpsiEl = RecoDecay::m(arrMomEl, std::array{massEl, massEl}); - auto arrMomPr = std::array{daughPart1Pr, daughPart2Pr}; - float massJpsiPr = RecoDecay::m(arrMomPr, std::array{massPr, massPr}); - - MC.get(HIST("MC/Muon/hEta1"))->Fill(RecoDecay::eta(daughPart1Mu)); - MC.get(HIST("MC/Muon/hEta2"))->Fill(RecoDecay::eta(daughPart2Mu)); - MC.get(HIST("MC/Muon/hPhi1"))->Fill(RecoDecay::phi(daughPart1Mu)); - MC.get(HIST("MC/Muon/hPhi2"))->Fill(RecoDecay::phi(daughPart2Mu)); - MC.get(HIST("MC/Muon/hPt1"))->Fill(RecoDecay::pt(daughPart1Mu)); - MC.get(HIST("MC/Muon/hPt2"))->Fill(RecoDecay::pt(daughPart2Mu)); - MC.get(HIST("MC/Muon/hPt"))->Fill(RecoDecay::pt(motherPartMu)); - MC.get(HIST("MC/Muon/hIVM"))->Fill(massJpsiMu); - MC.get(HIST("MC/Muon/hRapidity"))->Fill(RecoDecay::y(motherPartMu, massJpsiMu)); - - MC.get(HIST("MC/Electron/hEta1"))->Fill(RecoDecay::eta(daughPart1El)); - MC.get(HIST("MC/Electron/hEta2"))->Fill(RecoDecay::eta(daughPart2El)); - MC.get(HIST("MC/Electron/hPhi1"))->Fill(RecoDecay::phi(daughPart1El)); - MC.get(HIST("MC/Electron/hPhi2"))->Fill(RecoDecay::phi(daughPart2El)); - MC.get(HIST("MC/Electron/hPt1"))->Fill(RecoDecay::pt(daughPart1El)); - MC.get(HIST("MC/Electron/hPt2"))->Fill(RecoDecay::pt(daughPart2El)); - MC.get(HIST("MC/Electron/hPt"))->Fill(RecoDecay::pt(motherPartEl)); - MC.get(HIST("MC/Electron/hIVM"))->Fill(massJpsiEl); - MC.get(HIST("MC/Electron/hRapidity"))->Fill(RecoDecay::y(motherPartEl, massJpsiEl)); - - MC.get(HIST("MC/Proton/hEta1"))->Fill(RecoDecay::eta(daughPart1Pr)); - MC.get(HIST("MC/Proton/hEta2"))->Fill(RecoDecay::eta(daughPart2Pr)); - MC.get(HIST("MC/Proton/hPhi1"))->Fill(RecoDecay::phi(daughPart1Pr)); - MC.get(HIST("MC/Proton/hPhi2"))->Fill(RecoDecay::phi(daughPart2Pr)); - MC.get(HIST("MC/Proton/hPt1"))->Fill(RecoDecay::pt(daughPart1Pr)); - MC.get(HIST("MC/Proton/hPt2"))->Fill(RecoDecay::pt(daughPart2Pr)); - MC.get(HIST("MC/Proton/hPt"))->Fill(RecoDecay::pt(motherPartPr)); - MC.get(HIST("MC/Proton/hIVM"))->Fill(massJpsiPr); - MC.get(HIST("MC/Proton/hRapidity"))->Fill(RecoDecay::y(motherPartPr, massJpsiPr)); - - } // end MC skimmed process - - template - void processMCU(C const& collisions) - { - MC.fill(HIST("MC/hNumberOfRecoCollisions"), collisions.size()); - } // end MC unskimmed process - - void processDGrecoLevel(UDCollisionFull const& collision, UDTracksFull const& tracks) - { - fillHistograms(collision, tracks); - } // end DG process - - void processSGrecoLevel(SGUDCollisionFull const& collision, UDTracksFull const& tracks) - { - int gapSide = collision.gapSide(); - int trueGapSide = sgSelector.trueGap(collision, cutMyGapSideFV0, cutMyGapSideFT0A, cutMyGapSideFT0C, cutMyGapSideZDC); - if (useTrueGap) { - gapSide = trueGapSide; - } - if (gapSide != whichGapSide) { - return; - } - fillHistograms(collision, tracks); - - } // end SG process - - void processMCtruth(aod::UDMcCollision const& mcCollision, aod::UDMcParticles const& mcParticles) - { - processMC(mcCollision, mcParticles); - } - - void processMCUnskimmed(aod::McCollision const&, soa::SmallGroups> const& collisions /*, aod::McParticles const& mcParticles, aod::TracksIU const& tracks*/) - { - processMCU(collisions); - } - - PROCESS_SWITCH(UpcJpsiCentralBarrel, processDGrecoLevel, "Iterate over DG skimmed data.", false); - PROCESS_SWITCH(UpcJpsiCentralBarrel, processSGrecoLevel, "Iterate over SG skimmed data.", false); - PROCESS_SWITCH(UpcJpsiCentralBarrel, processMCtruth, "Iterate of MC true data.", true); - PROCESS_SWITCH(UpcJpsiCentralBarrel, processMCUnskimmed, "Iterate over unskimmed data.", true); -}; // end struct - -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"upc-jpsi-corr"}), - }; -} diff --git a/PWGUD/Tasks/upcJpsiCorr.cxx b/PWGUD/Tasks/upcJpsiCorr.cxx new file mode 100644 index 00000000000..8db8746b99d --- /dev/null +++ b/PWGUD/Tasks/upcJpsiCorr.cxx @@ -0,0 +1,1378 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +// +/// \file upcJpsiCorr.cxx +/// \brief Personal task for analysis of azimuthal asymmetry and quantum tomography in J/Psi system. +/// +/// \author Sara Haidlova, sara.haidlova@cern.ch +/// \since March 2024 + +#include +#include + +// O2 headers +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "CommonConstants/MathConstants.h" +#include "CommonConstants/PhysicsConstants.h" + +// O2Physics headers +#include "Common/DataModel/PIDResponse.h" +#include "Common/Core/RecoDecay.h" +#include "PWGUD/DataModel/UDTables.h" +#include "PWGUD/Core/UDHelpers.h" +#include "PWGUD/Core/UPCJpsiCentralBarrelCorrHelper.h" +#include "PWGUD/Core/SGSelector.h" + +// ROOT headers +#include "TLorentzVector.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::constants::math; + +SGSelector sgSelector; + +namespace o2::aod +{ +namespace tree +{ +// misc event info +DECLARE_SOA_COLUMN(RunNumber, runNumber, int32_t); +DECLARE_SOA_COLUMN(GlobalBC, globalBC, uint64_t); +// event vertex +DECLARE_SOA_COLUMN(PosX, posX, double); +DECLARE_SOA_COLUMN(PosY, posY, double); +DECLARE_SOA_COLUMN(PosZ, posZ, double); +// FIT info +DECLARE_SOA_COLUMN(TotalFT0AmplitudeA, totalFT0AmplitudeA, float); +DECLARE_SOA_COLUMN(TotalFT0AmplitudeC, totalFT0AmplitudeC, float); +DECLARE_SOA_COLUMN(TotalFV0AmplitudeA, totalFV0AmplitudeA, float); +DECLARE_SOA_COLUMN(TotalFDDAmplitudeA, totalFDDAmplitudeA, float); +DECLARE_SOA_COLUMN(TotalFDDAmplitudeC, totalFDDAmplitudeC, float); +DECLARE_SOA_COLUMN(TimeFT0A, timeFT0A, float); +DECLARE_SOA_COLUMN(TimeFT0C, timeFT0C, float); +DECLARE_SOA_COLUMN(TimeFV0A, timeFV0A, float); +DECLARE_SOA_COLUMN(TimeFDDA, timeFDDA, float); +DECLARE_SOA_COLUMN(TimeFDDC, timeFDDC, float); +// ZDC info +DECLARE_SOA_COLUMN(EnergyCommonZNA, energyCommonZNA, float); +DECLARE_SOA_COLUMN(EnergyCommonZNC, energyCommonZNC, float); +DECLARE_SOA_COLUMN(TimeZNA, timeZNA, float); +DECLARE_SOA_COLUMN(TimeZNC, timeZNC, float); +DECLARE_SOA_COLUMN(NeutronClass, neutronClass, int); + +// J/Psi +DECLARE_SOA_COLUMN(JpsiPt, jpsiPt, double); +DECLARE_SOA_COLUMN(JpsiEta, jpsiEta, double); +DECLARE_SOA_COLUMN(JpsiPhi, jpsiPhi, double); +DECLARE_SOA_COLUMN(JpsiM, jpsiM, double); +DECLARE_SOA_COLUMN(JpsiRap, jpsiRap, double); + +// asymmetry and correlation +DECLARE_SOA_COLUMN(JpsiPhiRandom, jpsiPhiRandom, double); +DECLARE_SOA_COLUMN(JpsiPhiCharge, jpsiPhiCharge, double); +DECLARE_SOA_COLUMN(JpsiPhiCS, jpsiPhiCS, double); +DECLARE_SOA_COLUMN(JpsiCosThetaCS, jpsiCosThetaCS, double); + +// muon tracks +DECLARE_SOA_COLUMN(TrackSign1, trackSign1, double); +DECLARE_SOA_COLUMN(TrackPt1, trackPt1, double); +DECLARE_SOA_COLUMN(TrackEta1, trackEta1, double); +DECLARE_SOA_COLUMN(TrackPhi1, trackPhi1, double); +DECLARE_SOA_COLUMN(TrackSign2, trackSign2, double); +DECLARE_SOA_COLUMN(TrackPt2, trackPt2, double); +DECLARE_SOA_COLUMN(TrackEta2, trackEta2, double); +DECLARE_SOA_COLUMN(TrackPhi2, trackPhi2, double); +} // namespace tree +DECLARE_SOA_TABLE(Tree, "AOD", "TREE", + tree::RunNumber, tree::GlobalBC, + tree::PosX, tree::PosY, tree::PosZ, tree::TotalFT0AmplitudeA, tree::TotalFT0AmplitudeC, tree::TotalFV0AmplitudeA, tree::TotalFDDAmplitudeA, tree::TotalFDDAmplitudeC, + tree::TimeFT0A, tree::TimeFT0C, tree::TimeFV0A, tree::TimeFDDA, tree::TimeFDDC, + tree::EnergyCommonZNA, tree::EnergyCommonZNC, tree::TimeZNA, tree::TimeZNC, tree::NeutronClass, + tree::JpsiPt, tree::JpsiEta, tree::JpsiPhi, tree::JpsiRap, tree::JpsiM, tree::JpsiPhiRandom, tree::JpsiPhiCharge, tree::JpsiPhiCS, tree::JpsiCosThetaCS, + tree::TrackSign1, tree::TrackPt1, tree::TrackEta1, tree::TrackPhi1, + tree::TrackSign2, tree::TrackPt2, tree::TrackEta2, tree::TrackPhi2); +namespace tree_mc +{ +// misc event info +DECLARE_SOA_COLUMN(GlobalBC, globalBC, uint64_t); +// event vertex +DECLARE_SOA_COLUMN(PosX, posX, double); +DECLARE_SOA_COLUMN(PosY, posY, double); +DECLARE_SOA_COLUMN(PosZ, posZ, double); + +// J/Psi +DECLARE_SOA_COLUMN(JpsiPt, jpsiPt, double); +DECLARE_SOA_COLUMN(JpsiEta, jpsiEta, double); +DECLARE_SOA_COLUMN(JpsiPhi, jpsiPhi, double); +DECLARE_SOA_COLUMN(JpsiM, jpsiM, double); +DECLARE_SOA_COLUMN(JpsiRap, jpsiRap, double); + +// asymmetry and correlation +DECLARE_SOA_COLUMN(JpsiPhiRandom, jpsiPhiRandom, double); +DECLARE_SOA_COLUMN(JpsiPhiCharge, jpsiPhiCharge, double); +DECLARE_SOA_COLUMN(JpsiPhiCS, jpsiPhiCS, double); +DECLARE_SOA_COLUMN(JpsiCosThetaCS, jpsiCosThetaCS, double); + +// muon tracks +DECLARE_SOA_COLUMN(TrackSign1, trackSign1, double); +DECLARE_SOA_COLUMN(TrackPt1, trackPt1, double); +DECLARE_SOA_COLUMN(TrackEta1, trackEta1, double); +DECLARE_SOA_COLUMN(TrackPhi1, trackPhi1, double); +DECLARE_SOA_COLUMN(TrackSign2, trackSign2, double); +DECLARE_SOA_COLUMN(TrackPt2, trackPt2, double); +DECLARE_SOA_COLUMN(TrackEta2, trackEta2, double); +DECLARE_SOA_COLUMN(TrackPhi2, trackPhi2, double); +} // namespace tree_mc +DECLARE_SOA_TABLE(TreeMC, "AOD", "TREEMC", + tree_mc::GlobalBC, + tree_mc::JpsiPt, tree_mc::JpsiEta, tree_mc::JpsiPhi, tree_mc::JpsiRap, tree_mc::JpsiM, tree_mc::JpsiPhiRandom, tree_mc::JpsiPhiCharge, tree_mc::JpsiPhiCS, tree_mc::JpsiCosThetaCS, + tree_mc::TrackSign1, tree_mc::TrackPt1, tree_mc::TrackEta1, tree_mc::TrackPhi1, + tree_mc::TrackSign2, tree_mc::TrackPt2, tree_mc::TrackEta2, tree_mc::TrackPhi2); +//} // namespace tree_mc +} // namespace o2::aod + +struct UpcJpsiCorr { + Produces tree; + Produces treeMC; + + // configurable axes + ConfigurableAxis axisIVM{"axisIVM", {500.0f, 2.0f, 4.5f}, "M_#it{inv} (GeV/#it{c}^{2})"}; + ConfigurableAxis axisIVMWide{"axisIVMWide", {350.0f, 0.0f, 4.5f}, "M_#it{inv} (GeV/#it{c}^{2})"}; + ConfigurableAxis axisPt{"axisPt", {250.0f, 0.1f, 3.0f}, "#it{p}_T (GeV/#it{c})"}; + ConfigurableAxis axisPt2{"axisPt2", {250.0f, 0.0f, 0.01f}, "#it{p}_T (GeV/#it{c})"}; + ConfigurableAxis axisPt2wide{"axisPt2wide", {250.0f, 0.0f, 0.04f}, "#it{p}_T (GeV/#it{c})"}; + ConfigurableAxis axisP{"axisP", {250.0f, 0.1f, 3.0f}, "#it{p} (GeV/#it{c})"}; + ConfigurableAxis axisEta{"axisEta", {250.0f, -1.5f, 1.5f}, "#eta (-)"}; + ConfigurableAxis axisCounter{"axisCounter", {20.0f, 0.0f, 20.0f}, "Number of events (-)"}; + ConfigurableAxis axisPhi{"axisPhi", {250.0f, 0, TwoPI}, "#phi (rad)"}; + ConfigurableAxis axisAccAngle{"axisAccAngle", {250.0f, -0.2f, 0.2f}, "accAngle"}; + ConfigurableAxis axisAngTheta{"axisAngTheta", {250.0f, -1.5f, 1.5f}, "cos #theta (-)"}; + ConfigurableAxis axisTPC{"axisTPC", {1000.0f, 0, 200.0f}, "TPC d#it{E}/d#it{x}"}; + ConfigurableAxis axisBetaTOF{"axisBetaTOF", {100.0f, 0, 1.5}, "TOF #beta"}; + ConfigurableAxis axisSigma{"axisSigma", {50, -25, 25}, "#sigma"}; + ConfigurableAxis axisZDCEnergy{"axisZDCEnergy", {250, -5.0, 20.0}, "ZDC energy"}; + ConfigurableAxis axisZDCTime{"axisZDCTime", {200, -10.0, 10.0}, "ZDC time"}; + ConfigurableAxis axisDCA{"axisDCA", {1000, -20.0, 20.0}, "DCA"}; + ConfigurableAxis axisChi2{"axisChi2", {200, -10.0, 40}, "Chi2"}; + ConfigurableAxis axisIVMSel{"axisIVMSel", {1000, 0.0, 10.0}, "IVM"}; + ConfigurableAxis axisCounterSel{"axisCounterSel", {1000, 0.0, 200.0}, "Selection"}; + ConfigurableAxis axisITSNCls{"axisITSNCls", {10, 0.0, 10.0}, "ITSNCls"}; + ConfigurableAxis axisTPCNCls{"axisTPCNCls", {170, -1, 160.0}, "TPCNCls"}; + ConfigurableAxis axisTPCCrossed{"axisTPCCrossed", {300, 20, 170.0}, "TPCCrossedRows"}; + + // configurable cuts (modify in json) + // track quality cuts + Configurable tpcNClsCrossedRows{"tpcNClsCrossedRows", 70, "number of crossed rows in TPC"}; + Configurable tofAtLeastOneProton{"tofAtLeastOneProton", false, "at least one candidate track has TOF hits"}; + Configurable tofBothProtons{"tofBothProtons", false, "both candidate protons have TOF hits"}; + Configurable tofOneProton{"tofOneProton", false, "one candidate proton has TOF hits"}; + Configurable dcaCut{"dcaCut", false, "DCA cut from run2."}; + Configurable newCutTPC{"newCutTPC", false, "New cuts for TPC quality tracks."}; + Configurable etaCut{"etaCut", 0.9f, "acceptance cut per track"}; + Configurable cutPtTrack{"cutPtTrack", 0.1f, "pT cut per track"}; + Configurable cutVertexZ{"cutVertexZ", 10.0f, "cut on vertex position in Z"}; + Configurable rapCut{"rapCut", 0.9f, "choose event in midrapidity"}; + Configurable dcaZCut{"dcaZCut", 2, "cut on the impact parameter in z of the track to the PV"}; + Configurable dcaXYCut{"dcaXYCut", 1e10, "cut on the impact parameter in xy of the track to the PV"}; + Configurable itsNClsCut{"itsNClsCut", 4, "minimal number of ITS clusters"}; + Configurable itsChi2NClsCut{"itsChi2NClsCut", 36, "minimal Chi2/cluster for the ITS track"}; + Configurable tpcNClsCrossedRowsCut{"tpcNClsCrossedRowsCut", 70, "minimal number of crossed TPC rows"}; + Configurable tpcChi2NCls{"tpcChi2NCls", 4, "minimal Chi2/cluster for the TPC track"}; + Configurable tpcMinNCls{"tpcMinNCls", 3, "minimum number of TPC clusters"}; + Configurable tpcCrossedOverFindable{"tpcCrossedOverFindable", 3, "number of TPC crossed rows over findable clusters"}; + + // ZDC classes cuts + Configurable znEnergyCut{"znEnergyCut", 0.0, "ZN common energy cut"}; + Configurable znTimeCut{"znTimeCut", 2.0, "ZN time cut"}; + + // Analysis cuts + Configurable maxJpsiMass{"maxJpsiMass", 3.18, "Maximum of the jpsi peak for peak cut"}; + Configurable minJpsiMass{"minJpsiMass", 3.0, "Minimum of the jpsi peak for peak cut"}; + + // SG cuts + Configurable whichGapSide{"whichGapSide", 2, {"0 for side A, 1 for side C, 2 for both sides"}}; + Configurable useTrueGap{"useTrueGap", true, {"Calculate gapSide for a given FV0/FT0/ZDC thresholds"}}; + Configurable cutMyGapSideFV0{"cutMyGapSideFV0", 100, "FV0A threshold for SG selector"}; + Configurable cutMyGapSideFT0A{"cutMyGapSideFT0A", 200., "FT0A threshold for SG selector"}; + Configurable cutMyGapSideFT0C{"cutMyGapSideFT0C", 100., "FT0C threshold for SG selector"}; + Configurable cutMyGapSideZDC{"cutMyGapSideZDC", 1000., "ZDC threshold for SG selector"}; + + // process cuts + Configurable doMuons{"doMuons", true, "Provide muon plots."}; + Configurable doElectrons{"doElectrons", true, "Provide electron plots."}; + Configurable doProtons{"doProtons", true, "Provide proton plots."}; + Configurable chargeOrdered{"chargeOrdered", false, "Order tracks based on charge."}; + Configurable doOnlyUPC{"doOnlyUPC", false, "Analyse only collisions with UPC settings."}; + Configurable doOnlyStandard{"doOnlyStandard", false, "Analyse only collisions with standard settings."}; + + // initialize histogram registry + HistogramRegistry rStatistics{ + "rStatistics", + {}}; + + HistogramRegistry rRawData{ + "rRawData", + {}}; + + HistogramRegistry rSelections{ + "rSelections", + {}}; + + HistogramRegistry rPVContributors{ + "rPVContributors", + {}}; + + HistogramRegistry rTG{ + "rTG", + {}}; + + HistogramRegistry rTGdaug{ + "TrGdaug", + {}}; + + HistogramRegistry rTGdaugCand{ + "rTGdaugCand", + {}}; + + HistogramRegistry rJpsiToDaug{ + "rJpsiToDaug", + {}}; + + HistogramRegistry rCorrelation{ + "rCorrelation", + {}}; + + HistogramRegistry rAsymmetry{ + "rAsymmetry", + {}}; + + HistogramRegistry rMC{ + "rMC", + {}}; + + using UDCollisionsFull = soa::Join; + using UDCollisionFull = UDCollisionsFull::iterator; + using UDTracksFull = soa::Join; + using UDTrackFull = UDTracksFull::iterator; + using SGUDCollisionFull = soa::Join::iterator; + using MCUDTracksFull = soa::Join; + using MCUDCollisionFull = soa::Join::iterator; + using MCSGUDCollisionFull = soa::Join::iterator; + + void init(InitContext&) + { + + // statistics histograms for counters + rStatistics.add("Statistics/hNumberOfCollisions", "hNumberOfCollisions", {HistType::kTH1F, {axisCounter}}); + rStatistics.add("Statistics/hNumberOfTracks", "hNumberOfTracks", {HistType::kTH1F, {axisCounter}}); + rStatistics.add("Statistics/hNumberGT", "hNumberGT", {HistType::kTH1F, {axisCounter}}); + rStatistics.add("Statistics/hCutCounterCollisions", "hCutCounterCollisions", {HistType::kTH1F, {axisCounter}}); + rStatistics.add("Statistics/hCutCounterTracks", "hCutCounterTracks", {HistType::kTH1F, {axisCounter}}); + + // raw data histograms + rRawData.add("RawData/hTrackPt", "hTrackPt", {HistType::kTH1F, {axisPt}}); + rRawData.add("RawData/hTrackEta", "hTrackEta", {HistType::kTH1F, {axisEta}}); + rRawData.add("RawData/hTrackPhi", "hTrackPhi", {HistType::kTH1F, {axisPhi}}); + rRawData.add("RawData/hTrackDCAXYZ", "hTrackDCAXYZ", {HistType::kTH2F, {axisDCA, axisDCA}}); + rRawData.add("RawData/hTPCNClsFindable", "hTPCNClsFindable", {HistType::kTH1F, {axisTPC}}); + rRawData.add("RawData/hTPCNClsFindableMinusFound", "hTPCNClsFindableMinusFound", {HistType::kTH1F, {axisTPC}}); + rRawData.add("RawData/hITSNCls", "hITSNCls", {HistType::kTH1F, {axisCounter}}); + rRawData.add("RawData/hTPCNCls", "hTPCNCls", {HistType::kTH1F, {axisCounter}}); + rRawData.add("RawData/hITSChi2NCls", "hITSChi2NCls", {HistType::kTH1F, {axisChi2}}); + rRawData.add("RawData/hTPCChi2NCls", "hTPCChi2NCls", {HistType::kTH1F, {axisChi2}}); + rRawData.add("RawData/hPositionZ", "hPositionZ", {HistType::kTH1F, {axisSigma}}); + rRawData.add("RawData/hPositionX", "hPositionX", {HistType::kTH1F, {axisSigma}}); + rRawData.add("RawData/hPositionY", "hPositionY", {HistType::kTH1F, {axisSigma}}); + rRawData.add("RawData/hPositionXY", "hPositionXY", {HistType::kTH2F, {axisSigma, axisSigma}}); + rRawData.add("RawData/QA/ZDC/hZNACommonEnergy", "hZNACommonEnergy", {HistType::kTH1F, {axisZDCEnergy}}); + rRawData.add("RawData/QA/ZDC/hZNCCommonEnergy", "hZNCCommonEnergy", {HistType::kTH1F, {axisZDCEnergy}}); + rRawData.add("RawData/QA/ZDC/hZNAvsZNCCommonEnergy", "hZNAvsZNCCommonEnergy", {HistType::kTH2F, {axisZDCEnergy, axisZDCEnergy}}); + rRawData.add("RawData/QA/ZDC/hZNATime", "hZNATime", {HistType::kTH1F, {axisZDCTime}}); + rRawData.add("RawData/QA/ZDC/hZNCTime", "hZNCTime", {HistType::kTH1F, {axisZDCTime}}); + rRawData.add("RawData/QA/ZDC/hZNAvsZNCTime", "hZNAvsZNCTime", {HistType::kTH2F, {axisZDCTime, axisZDCTime}}); + rRawData.add("RawData/PID/hTPCVsP", "hTPCVsP", {HistType::kTH2F, {axisP, axisTPC}}); + rRawData.add("RawData/PID/hTPCVsPt", "hTPCVsPt", {HistType::kTH2F, {axisPt, axisTPC}}); + rRawData.add("RawData/PID/hTPCVsPhi", "hTPCVsPhi", {HistType::kTH2F, {axisPhi, axisTPC}}); + rRawData.add("RawData/PID/hTPCVsEta", "hTPCVsEta", {HistType::kTH2F, {axisEta, axisTPC}}); + rRawData.add("RawData/PID/hBetaTOFVsP", "hBetaTOFVsP", {HistType::kTH2F, {axisP, axisBetaTOF}}); + rRawData.add("RawData/QA/FIT/hTotFT0AmplitudeA", "hTotFT0AmplitudeA", {HistType::kTH1D, {{1000, 0.0, 1000}}}); + rRawData.add("RawData/QA/FIT/hTotFT0AmplitudeC", "hTotFT0AmplitudeC", {HistType::kTH1D, {{1000, 0.0, 1000}}}); + rRawData.add("RawData/QA/FIT/hTotFV0AmplitudeA", "hTotFV0AmplitudeA", {HistType::kTH1D, {{1000, 0.0, 1000}}}); + rRawData.add("RawData/QA/FIT/hTotFDDAmplitudeA", "hTotFDDAmplitudeA", {HistType::kTH1D, {{1000, 0.0, 1000}}}); + rRawData.add("RawData/QA/FIT/hTotFDDAmplitudeC", "hTotFDDAmplitudeC", {HistType::kTH1D, {{1000, 0.0, 1000}}}); + rRawData.add("RawData/QA/FIT/hTimeFT0A", "hTimeFT0A", {HistType::kTH1D, {{200, -100, 100}}}); + rRawData.add("RawData/QA/FIT/hTimeFT0C", "hTimeFT0C", {HistType::kTH1D, {{200, -100, 100}}}); + rRawData.add("RawData/QA/FIT/hTimeFV0A", "hTimeFV0A", {HistType::kTH1D, {{200, -100, 100}}}); + rRawData.add("RawData/QA/FIT/hTimeFDDA", "hTimeFDDA", {HistType::kTH1D, {{200, -100, 100}}}); + rRawData.add("RawData/QA/FIT/hTimeFDDC", "hTimeFDDC", {HistType::kTH1D, {{200, -100, 100}}}); + + // Selection checks + rSelections.add("Selections/Electron/Mass/Leading/hITSNCls", "hITSNCls", {HistType::kTH2F, {axisIVMSel, axisITSNCls}}); + rSelections.add("Selections/Electron/Mass/Leading/hITSChi2NCls", "hITSChi2NCls", {HistType::kTH2F, {axisIVMSel, axisChi2}}); + rSelections.add("Selections/Electron/Mass/Leading/hTPCNCls", "hTPCNCls", {HistType::kTH2F, {axisIVMSel, axisTPCNCls}}); + rSelections.add("Selections/Electron/Mass/Leading/hTPCChi2NCls", "hTPCChi2NCls", {HistType::kTH2F, {axisIVMSel, axisChi2}}); + rSelections.add("Selections/Electron/Mass/Leading/hTPCNClsCrossedRows", "hTPCNClsCrossedRows", {HistType::kTH2F, {axisIVMSel, axisTPCCrossed}}); + rSelections.addClone("Selections/Electron/Mass/Leading/", "Selections/Electron/Mass/Subleading/"); + rSelections.addClone("Selections/Electron/Mass/", "Selections/Electron/Rapidity/"); + rSelections.addClone("Selections/Electron/Mass/", "Selections/Electron/Pt/"); + rSelections.addClone("Selections/Electron/", "Selections/Muon/"); + + // PVContributors histograms + rPVContributors.add("PVContributors/hTrackPt", "hTrackPt", {HistType::kTH1F, {axisPt}}); + rPVContributors.add("PVContributors/hTrackEta", "hTrackEta", {HistType::kTH1F, {axisEta}}); + rPVContributors.add("PVContributors/hTrackPhi", "hTrackPhi", {HistType::kTH1F, {axisPhi}}); + rPVContributors.add("PVContributors/hTPCNClsFindable", "hTPCNClsFindable", {HistType::kTH1F, {axisTPC}}); + rPVContributors.add("PVContributors/hTPCNClsFindableMinusFound", "hTPCNClsFindableMinusFound", {HistType::kTH1F, {axisTPC}}); + rPVContributors.add("PVContributors/PID/hTPCVsP", "hTPCVsP", {HistType::kTH2F, {axisP, axisTPC}}); + rPVContributors.add("PVContributors/PID/hTPCVsPt", "hTPCVsPt", {HistType::kTH2F, {axisPt, axisTPC}}); + rPVContributors.add("PVContributors/PID/hTPCVsPhi", "hTPCVsPhi", {HistType::kTH2F, {axisPhi, axisTPC}}); + rPVContributors.add("PVContributors/PID/hTPCVsEta", "hTPCVsEta", {HistType::kTH2F, {axisEta, axisTPC}}); + rPVContributors.add("PVContributors/PID/hBetaTOFVsP", "hBetaTOFVsP", {HistType::kTH2F, {axisP, axisBetaTOF}}); + + // TG histograms + rTG.add("TG/hTrackPt1", "hTrackPt1", {HistType::kTH1F, {axisPt}}); + rTG.add("TG/hTrackEta1", "hTrackEta1", {HistType::kTH1F, {axisEta}}); + rTG.add("TG/hTrackPhi1", "hTrackPhi1", {HistType::kTH1F, {axisPhi}}); + rTG.add("TG/hTrackPt2", "hTrackPt2", {HistType::kTH1F, {axisPt}}); + rTG.add("TG/hTrackEta2", "hTrackEta2", {HistType::kTH1F, {axisEta}}); + rTG.add("TG/hTrackPhi2", "hTrackPhi2", {HistType::kTH1F, {axisPhi}}); + rTG.add("TG/hTPCNClsFindable", "hTPCNClsFindable", {HistType::kTH1F, {axisTPC}}); + rTG.add("TG/hTPCNClsFindableMinusFound", "hTPCNClsFindableMinusFound", {HistType::kTH1F, {axisTPC}}); + rTG.add("TG/PID/hTPCVsP", "hTPCVsP", {HistType::kTH2F, {axisP, axisTPC}}); + rTG.add("TG/PID/hTPCVsPt", "hTPCVsPt", {HistType::kTH2F, {axisPt, axisTPC}}); + rTG.add("TG/PID/hTPCVsPhi", "hTPCVsPhi", {HistType::kTH2F, {axisPhi, axisTPC}}); + rTG.add("TG/PID/hTPCVsEta", "hTPCVsEta", {HistType::kTH2F, {axisEta, axisTPC}}); + rTG.add("TG/PID/hBetaTOFVsP", "hBetaTOFVsP", {HistType::kTH2F, {axisP, axisBetaTOF}}); + rTG.add("TG/TPC/TPCNegVsPosSignal", "TPCNegVsPosSignal", HistType::kTH2F, {axisTPC, axisTPC}); + + // TGdaug histograms + rTGdaug.add("TGdaug/Muon/hTrackPt1", "hTrackPt1", {HistType::kTH1F, {axisPt}}); + rTGdaug.add("TGdaug/Muon/hTrackEta1", "hTrackEta1", {HistType::kTH1F, {axisEta}}); + rTGdaug.add("TGdaug/Muon/hTrackPhi1", "hTrackPhi1", {HistType::kTH1F, {axisPhi}}); + rTGdaug.add("TGdaug/Muon/hTrackPt2", "hTrackPt2", {HistType::kTH1F, {axisPt}}); + rTGdaug.add("TGdaug/Muon/hTrackEta2", "hTrackEta2", {HistType::kTH1F, {axisEta}}); + rTGdaug.add("TGdaug/Muon/hTrackPhi2", "hTrackPhi2", {HistType::kTH1F, {axisPhi}}); + rTGdaug.add("TGdaug/Muon/TPCNegVsPosSignal", "TPCNegVsPosSignal", HistType::kTH2F, {axisTPC, axisTPC}); + rTGdaug.add("TGdaug/Muon/PID/hTPCVsP", "hTPCVsP", {HistType::kTH2F, {axisP, axisTPC}}); + rTGdaug.add("TGdaug/Muon/PID/hTPCVsPt", "hTPCVsPt", {HistType::kTH2F, {axisPt, axisTPC}}); + rTGdaug.add("TGdaug/Muon/PID/hTPCVsPhi", "hTPCVsPhi", {HistType::kTH2F, {axisPhi, axisTPC}}); + rTGdaug.add("TGdaug/Muon/PID/hTPCVsEta", "hTPCVsEta", {HistType::kTH2F, {axisEta, axisTPC}}); + rTGdaug.add("TGdaug/Muon/PID/hBetaTOFVsP", "hBetaTOFVsP", {HistType::kTH2F, {axisP, axisBetaTOF}}); + rTGdaug.addClone("TGdaug/Muon/", "TGdaug/Electron/"); + rTGdaug.addClone("TGdaug/Muon/", "TGdaug/Proton/"); + + // TGmuCand histograms + rTGdaugCand.add("TGdaugCand/Muon/hTrackPt1", "hTrackPt1", {HistType::kTH1F, {axisPt}}); + rTGdaugCand.add("TGdaugCand/Muon/hTrackEta1", "hTrackEta1", {HistType::kTH1F, {axisEta}}); + rTGdaugCand.add("TGdaugCand/Muon/hTrackPhi1", "hTrackPhi1", {HistType::kTH1F, {axisPhi}}); + rTGdaugCand.add("TGdaugCand/Muon/hTrackPt2", "hTrackPt2", {HistType::kTH1F, {axisPt}}); + rTGdaugCand.add("TGdaugCand/Muon/hTrackEta2", "hTrackEta2", {HistType::kTH1F, {axisEta}}); + rTGdaugCand.add("TGdaugCand/Muon/hTrackPhi2", "hTrackPhi2", {HistType::kTH1F, {axisPhi}}); + rTGdaugCand.add("TGdaugCand/Muon/hPairPt", "hPairPt", {HistType::kTH1F, {axisPt}}); + rTGdaugCand.add("TGdaugCand/Muon/hPairIVM", "hPairIVM", {HistType::kTH1F, {axisIVMWide}}); + rTGdaugCand.add("TGdaugCand/Muon/hJpsiPt", "hJpsiPt", {HistType::kTH1F, {axisPt}}); + rTGdaugCand.add("TGdaugCand/Muon/hJpsiRap", "hJpsiRap", {HistType::kTH1F, {axisEta}}); + rTGdaugCand.add("TGdaugCand/Muon/TPCNegVsPosSignal", "TPCNegVsPosSignal", HistType::kTH2F, {axisTPC, axisTPC}); + rTGdaugCand.add("TGdaugCand/Muon/PID/hTPCVsP", "hTPCVsP", {HistType::kTH2F, {axisP, axisTPC}}); + rTGdaugCand.add("TGdaugCand/Muon/PID/hTPCVsPt", "hTPCVsPt", {HistType::kTH2F, {axisPt, axisTPC}}); + rTGdaugCand.add("TGdaugCand/Muon/PID/hTPCVsPhi", "hTPCVsPhi", {HistType::kTH2F, {axisPhi, axisTPC}}); + rTGdaugCand.add("TGdaugCand/Muon/PID/hTPCVsEta", "hTPCVsEta", {HistType::kTH2F, {axisEta, axisTPC}}); + rTGdaugCand.add("TGdaugCand/Muon/PID/hBetaTOFVsP", "hBetaTOFVsP", {HistType::kTH2F, {axisP, axisBetaTOF}}); + rTGdaugCand.addClone("TGdaugCand/Muon/", "TGdaugCand/Electron/"); + rTGdaugCand.addClone("TGdaugCand/Muon/", "TGdaugCand/Proton/"); + + // JPsiToEl histograms + rJpsiToDaug.add("JPsiToDaug/Electron/Coherent/hPt", "Pt of J/Psi ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); + rJpsiToDaug.add("JPsiToDaug/Electron/Coherent/hPt1", "pT of track 1 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); + rJpsiToDaug.add("JPsiToDaug/Electron/Coherent/hPt2", "pT of track 2 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); + rJpsiToDaug.add("JPsiToDaug/Electron/Coherent/hEta1", "eta of track 1 ; #eta {-]", {HistType::kTH1F, {axisEta}}); + rJpsiToDaug.add("JPsiToDaug/Electron/Coherent/hEta2", "eta of track 2 ; #eta {-]", {HistType::kTH1F, {axisEta}}); + rJpsiToDaug.add("JPsiToDaug/Electron/Coherent/hPhi1", "phi of track 1 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); + rJpsiToDaug.add("JPsiToDaug/Electron/Coherent/hPhi2", "phi of track 2 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); + rJpsiToDaug.add("JPsiToDaug/Electron/Coherent/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); + rJpsiToDaug.add("JPsiToDaug/Electron/Coherent/hRap", "Rap of J/Psi ; y {-]", {HistType::kTH1F, {axisEta}}); + rJpsiToDaug.add("JPsiToDaug/Electron/Coherent/hEta", "Eta of J/Psi ; #eta {-]", {HistType::kTH1F, {axisEta}}); + rJpsiToDaug.add("JPsiToDaug/Electron/Coherent/hPhi", "Phi of J/Psi ; #phi {-]", {HistType::kTH1F, {axisPhi}}); + rJpsiToDaug.add("JPsiToDaug/Electron/Coherent/xnxn/hPt", "Pt of J/Psi ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); + rJpsiToDaug.add("JPsiToDaug/Electron/Coherent/xnxn/hPt1", "pT of track 1 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); + rJpsiToDaug.add("JPsiToDaug/Electron/Coherent/xnxn/hPt2", "pT of track 2 ; p_{T} {GeV/c]", {HistType::kTH1F, {axisPt}}); + rJpsiToDaug.add("JPsiToDaug/Electron/Coherent/xnxn/hEta1", "eta of track 1 ; #eta {-]", {HistType::kTH1F, {axisEta}}); + rJpsiToDaug.add("JPsiToDaug/Electron/Coherent/xnxn/hEta2", "eta of track 2 ; #eta {-]", {HistType::kTH1F, {axisEta}}); + rJpsiToDaug.add("JPsiToDaug/Electron/Coherent/xnxn/hPhi1", "phi of track 1 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); + rJpsiToDaug.add("JPsiToDaug/Electron/Coherent/xnxn/hPhi2", "phi of track 2 ; #phi {-]", {HistType::kTH1F, {axisPhi}}); + rJpsiToDaug.add("JPsiToDaug/Electron/Coherent/xnxn/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); + rJpsiToDaug.add("JPsiToDaug/Electron/Coherent/xnxn/hRap", "Rap of J/Psi ; y {-]", {HistType::kTH1F, {axisEta}}); + rJpsiToDaug.add("JPsiToDaug/Electron/Coherent/xnxn/hEta", "Eta of J/Psi ; #eta {-]", {HistType::kTH1F, {axisEta}}); + rJpsiToDaug.add("JPsiToDaug/Electron/Coherent/xnxn/hPhi", "Phi of J/Psi ; #phi {-]", {HistType::kTH1F, {axisPhi}}); + rJpsiToDaug.add("JPsiToDaug/Electron/Coherent/PID/hTPCVsP", "hTPCVsP", {HistType::kTH2F, {axisP, axisTPC}}); + rJpsiToDaug.add("JPsiToDaug/Electron/Coherent/PID/hTPCVsPt", "hTPCVsPt", {HistType::kTH2F, {axisPt, axisTPC}}); + rJpsiToDaug.add("JPsiToDaug/Electron/Coherent/PID/hTPCVsPhi", "hTPCVsPhi", {HistType::kTH2F, {axisPhi, axisTPC}}); + rJpsiToDaug.add("JPsiToDaug/Electron/Coherent/PID/hTPCVsEta", "hTPCVsEta", {HistType::kTH2F, {axisEta, axisTPC}}); + rJpsiToDaug.add("JPsiToDaug/Electron/Coherent/PID/hBetaTOFVsP", "hBetaTOFVsP", {HistType::kTH2F, {axisP, axisBetaTOF}}); + rJpsiToDaug.add("JPsiToDaug/Electron/NotCoherent/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); + rJpsiToDaug.add("JPsiToDaug/Electron/NotCoherent/xnxn/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); + rJpsiToDaug.add("JPsiToDaug/Electron/NotCoherent/onon/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); + rJpsiToDaug.add("JPsiToDaug/Electron/NotCoherent/xnon/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); + rJpsiToDaug.add("JPsiToDaug/Electron/NotCoherent/onxn/hIVM", "J/Psi Invariant Mass ; m {GeV]", {HistType::kTH1F, {axisIVM}}); + rJpsiToDaug.addClone("JPsiToDaug/Electron/Coherent/xnxn/", "JPsiToDaug/Electron/Coherent/onxn/"); + rJpsiToDaug.addClone("JPsiToDaug/Electron/Coherent/xnxn/", "JPsiToDaug/Electron/Coherent/onon/"); + rJpsiToDaug.addClone("JPsiToDaug/Electron/Coherent/xnxn/", "JPsiToDaug/Electron/Coherent/xnon/"); + rJpsiToDaug.addClone("JPsiToDaug/Electron/Coherent/", "JPsiToDaug/Electron/Incoherent/"); + rJpsiToDaug.addClone("JPsiToDaug/Electron/", "JPsiToDaug/Muon/"); + rJpsiToDaug.addClone("JPsiToDaug/Electron/", "JPsiToDaug/Proton/"); + + // Correlation histograms + rCorrelation.add("Correlation/Muon/Coherent/AccoplAngle", "AccoplAngle", {HistType::kTH1F, {axisAccAngle}}); + rCorrelation.add("Correlation/Muon/Coherent/CosTheta", "CosTheta", {HistType::kTH1F, {axisAngTheta}}); + rCorrelation.add("Correlation/Muon/Coherent/Phi", "Phi", {HistType::kTH1F, {axisPhi}}); + rCorrelation.add("Correlation/Muon/Coherent/Phi1", "Phi1", {HistType::kTH1F, {axisPhi}}); + rCorrelation.add("Correlation/Muon/Coherent/Phi2", "Phi2", {HistType::kTH1F, {axisPhi}}); + rCorrelation.add("Correlation/Muon/Coherent/CosThetaPhi", "CosThetaPhi", {HistType::kTH2F, {{axisAngTheta}, {axisPhi}}}); + rCorrelation.addClone("Correlation/Muon/Coherent/", "Correlation/Muon/Incoherent/"); + rCorrelation.addClone("Correlation/Muon/", "Correlation/Electron/"); + rCorrelation.addClone("Correlation/Muon/", "Correlation/Proton/"); + + // Asymmetry histograms + rAsymmetry.add("Asymmetry/Muon/Coherent/DeltaPhi", "DeltaPhi", {HistType::kTH1F, {{180, -PI, PI}}}); + rAsymmetry.add("Asymmetry/Muon/Coherent/xnxn/DeltaPhi", "DeltaPhi", {HistType::kTH1F, {{180, -PI, PI}}}); + rAsymmetry.add("Asymmetry/Muon/Coherent/DeltaPhiRandom", "DeltaPhiRandom", {HistType::kTH1F, {{180, -PI, PI}}}); + rAsymmetry.add("Asymmetry/Muon/Coherent/xnxn/DeltaPhiRandom", "DeltaPhiRandom", {HistType::kTH1F, {{180, -PI, PI}}}); + rAsymmetry.addClone("Asymmetry/Muon/Coherent/xnxn/", "Asymmetry/Muon/Coherent/onxn/"); + rAsymmetry.addClone("Asymmetry/Muon/Coherent/xnxn/", "Asymmetry/Muon/Coherent/onon/"); + rAsymmetry.addClone("Asymmetry/Muon/Coherent/xnxn/", "Asymmetry/Muon/Coherent/xnon/"); + rAsymmetry.addClone("Asymmetry/Muon/Coherent/", "Asymmetry/Muon/Incoherent/"); + rAsymmetry.addClone("Asymmetry/Muon/", "Asymmetry/Electron/"); + + // MC histograms + rMC.add("MC/hNumberOfMCCollisions", "hNumberOfCollisions", {HistType::kTH1F, {{10, 0, 10}}}); + rMC.add("MC/hNumberOfRecoCollisions", "hNumberOfRecoCollisions", {HistType::kTH1F, {{10, 0, 10}}}); + rMC.add("MC/hNumberOfTrueCollisions", "hNumberOfTrueCollisions", {HistType::kTH1F, {{10, 0, 10}}}); + rMC.add("MC/Muon/hNumberOfMCTracks", "hNumberOfMCTracks", {HistType::kTH1F, {{10, 0, 10}}}); + rMC.add("MC/hNumberOfMatchedMCTracks", "hNumberOfMatchedMCTracks", {HistType::kTH1F, {{10, 0, 10}}}); + rMC.add("MC/hPosZ", "hPosZ", {HistType::kTH1F, {{60, -15, 15}}}); + rMC.add("MC/hMothersPdg", "hMothersPdg", {HistType::kTH1F, {{1000, -500, 500}}}); + rMC.add("MC/hPdg", "hPdg", {HistType::kTH1F, {{1000, -500, 500}}}); + rMC.add("MC/Muon/hEta1", "hEta1", {HistType::kTH1F, {axisEta}}); + rMC.add("MC/Muon/hEta2", "hEta2", {HistType::kTH1F, {axisEta}}); + rMC.add("MC/Muon/hEta", "hEta", {HistType::kTH1F, {axisEta}}); + rMC.add("MC/Muon/hPhi1", "hPhi1", {HistType::kTH1F, {axisPhi}}); + rMC.add("MC/Muon/hPhi2", "hPhi2", {HistType::kTH1F, {axisPhi}}); + rMC.add("MC/Muon/hPhi", "hPhi", {HistType::kTH1F, {axisPhi}}); + rMC.add("MC/Muon/hIVM", "hIVM", {HistType::kTH1F, {axisIVM}}); + rMC.add("MC/Muon/hRapidity", "hRapidity", {HistType::kTH1F, {axisEta}}); + rMC.add("MC/Muon/hPt1", "hPt1", {HistType::kTH1F, {axisPt}}); + rMC.add("MC/Muon/hPt2", "hPt2", {HistType::kTH1F, {axisPt}}); + rMC.add("MC/Muon/hPt", "hPt", {HistType::kTH1F, {axisPt}}); + rMC.add("MC/hResolution", "hResolution", {HistType::kTH1F, {{100, -10, 10}}}); + rMC.add("MC/hResolutionPhi", "hResolutionPhi", {HistType::kTH1F, {{100, -0.01, 0.01}}}); + } + + bool cutITSLayers(uint8_t itsClusterMap) const + { + std::vector>> requiredITSHits{}; + requiredITSHits.push_back(std::make_pair(1, std::array{0, 1, 2})); // at least one hit in the innermost layer + constexpr uint8_t kBit = 1; + for (const auto& itsRequirement : requiredITSHits) { + auto hits = std::count_if(itsRequirement.second.begin(), itsRequirement.second.end(), [&](auto&& requiredLayer) { return itsClusterMap & (kBit << requiredLayer); }); + + if ((itsRequirement.first == -1) && (hits > 0)) { + return false; // no hits were required in specified layers + } else if (hits < itsRequirement.first) { + return false; // not enough hits found in specified layers + } + } + return true; + } + + template + bool goodTrackCuts(T const& track) + { + // choose only PV contributors + if (!track.isPVContributor()) { + rStatistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(1); + return false; + } + // pT cut to choose only tracks contributing to J/psi + if (track.pt() < cutPtTrack) { + rStatistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(2); + return false; + } + // acceptance cut (TPC) + if (std::abs(RecoDecay::eta(std::array{track.px(), track.py(), track.pz()})) > etaCut) { + rStatistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(3); + return false; + } + // DCA + if (std::abs(track.dcaZ()) > dcaZCut) { + rStatistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(4); + return false; + } + if (dcaCut) { + float dcaXYPtCut = 0.0105f + 0.0350f / std::pow(track.pt(), 1.1f); + if (std::abs(track.dcaXY()) > dcaXYPtCut) { + rStatistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(5); + return false; + } + } else { + if (std::abs(track.dcaXY()) > dcaXYCut) { + rStatistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(5); + return false; + } + } + // ITS + if (!track.hasITS()) { + rStatistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(6); + return false; + } + if (track.itsNCls() < itsNClsCut) { + rStatistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(7); + return false; + } + if (!cutITSLayers(track.itsClusterMap())) { + rStatistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(8); + return false; + } + if (track.itsChi2NCl() > itsChi2NClsCut) { + rStatistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(9); + return false; + } + // TPC + if (!track.hasTPC()) { + rStatistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(10); + return false; + } + if (track.tpcNClsCrossedRows() < tpcNClsCrossedRowsCut) { + rStatistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(11); + return false; + } + if (track.tpcChi2NCl() > tpcChi2NCls) { + rStatistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(12); + return false; // TPC chi2 + } + if ((track.tpcNClsFindable() - track.tpcNClsFindableMinusFound()) < tpcMinNCls) { + rStatistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(13); + return false; + } + if (newCutTPC) { + if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < tpcCrossedOverFindable) { + rStatistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(14); + return false; + } + } + + return true; + } + + bool candidateCuts(float massJpsi, float rapJpsi) + { + if (std::abs(rapJpsi) > rapCut) { + rStatistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(15); + return false; + } + + if (massJpsi < 2.0f) { + rStatistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(16); + return false; + } + + return true; + } + + static constexpr std::string_view DaugType[3] = {"Electron/", "Muon/", "Proton/"}; + static constexpr std::string_view ProdType[2] = {"Coherent/", "Incoherent/"}; + static constexpr std::string_view NeutronClass[5] = {"", "xnxn/", "onxn/", "onon/", "xnon/"}; + + template + void fillSelections(const T& leadingP, const T& subleadingP, float massJpsi, float rapJpsi, std::array mother) + { + // selections + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Mass/Leading/hITSNCls"))->Fill(massJpsi, leadingP.itsNCls()); + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Mass/Leading/hITSChi2NCls"))->Fill(massJpsi, leadingP.itsChi2NCl()); + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Mass/Leading/hTPCNCls"))->Fill(massJpsi, leadingP.tpcNClsFindable() - leadingP.tpcNClsFindableMinusFound()); + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Mass/Leading/hTPCChi2NCls"))->Fill(massJpsi, leadingP.tpcChi2NCl()); + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Mass/Leading/hTPCNClsCrossedRows"))->Fill(massJpsi, subleadingP.tpcNClsCrossedRows()); + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Mass/Subleading/hITSNCls"))->Fill(massJpsi, subleadingP.itsNCls()); + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Mass/Subleading/hITSChi2NCls"))->Fill(massJpsi, subleadingP.itsChi2NCl()); + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Mass/Subleading/hTPCNCls"))->Fill(massJpsi, subleadingP.tpcNClsFindable() - subleadingP.tpcNClsFindableMinusFound()); + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Mass/Subleading/hTPCChi2NCls"))->Fill(massJpsi, subleadingP.tpcChi2NCl()); + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Mass/Subleading/hTPCNClsCrossedRows"))->Fill(massJpsi, subleadingP.tpcNClsCrossedRows()); + + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Rapidity/Leading/hITSNCls"))->Fill(rapJpsi, leadingP.itsNCls()); + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Rapidity/Leading/hITSChi2NCls"))->Fill(rapJpsi, leadingP.itsChi2NCl()); + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Rapidity/Leading/hTPCNCls"))->Fill(rapJpsi, leadingP.tpcNClsFindable() - leadingP.tpcNClsFindableMinusFound()); + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Rapidity/Leading/hTPCChi2NCls"))->Fill(rapJpsi, leadingP.tpcChi2NCl()); + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Rapidity/Leading/hTPCNClsCrossedRows"))->Fill(rapJpsi, subleadingP.tpcNClsCrossedRows()); + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Rapidity/Subleading/hITSNCls"))->Fill(rapJpsi, subleadingP.itsNCls()); + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Rapidity/Subleading/hITSChi2NCls"))->Fill(rapJpsi, subleadingP.itsChi2NCl()); + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Rapidity/Subleading/hTPCNCls"))->Fill(rapJpsi, subleadingP.tpcNClsFindable() - subleadingP.tpcNClsFindableMinusFound()); + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Rapidity/Subleading/hTPCChi2NCls"))->Fill(rapJpsi, subleadingP.tpcChi2NCl()); + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Rapidity/Subleading/hTPCNClsCrossedRows"))->Fill(rapJpsi, subleadingP.tpcNClsCrossedRows()); + + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Pt/Leading/hITSNCls"))->Fill(RecoDecay::pt(mother), leadingP.itsNCls()); + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Pt/Leading/hITSChi2NCls"))->Fill(RecoDecay::pt(mother), leadingP.itsChi2NCl()); + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Pt/Leading/hTPCNCls"))->Fill(RecoDecay::pt(mother), leadingP.tpcNClsFindable() - leadingP.tpcNClsFindableMinusFound()); + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Pt/Leading/hTPCChi2NCls"))->Fill(RecoDecay::pt(mother), leadingP.tpcChi2NCl()); + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Pt/Leading/hTPCNClsCrossedRows"))->Fill(RecoDecay::pt(mother), subleadingP.tpcNClsCrossedRows()); + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Pt/Subleading/hITSNCls"))->Fill(RecoDecay::pt(mother), subleadingP.itsNCls()); + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Pt/Subleading/hITSChi2NCls"))->Fill(RecoDecay::pt(mother), subleadingP.itsChi2NCl()); + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Pt/Subleading/hTPCNCls"))->Fill(RecoDecay::pt(mother), subleadingP.tpcNClsFindable() - subleadingP.tpcNClsFindableMinusFound()); + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Pt/Subleading/hTPCChi2NCls"))->Fill(RecoDecay::pt(mother), subleadingP.tpcChi2NCl()); + rSelections.get(HIST("Selections/") + HIST(DaugType[daug]) + HIST("Pt/Subleading/hTPCNClsCrossedRows"))->Fill(RecoDecay::pt(mother), subleadingP.tpcNClsCrossedRows()); + } + + template + void fillTGdaug(const T& trkDaughter1, const T& trkDaughter2, std::array daughter1, std::array daughter2) + { + rTGdaug.get(HIST("TGdaug/") + HIST(DaugType[daug]) + HIST("hTrackPt1"))->Fill(trkDaughter1.pt()); + rTGdaug.get(HIST("TGdaug/") + HIST(DaugType[daug]) + HIST("hTrackPt2"))->Fill(trkDaughter2.pt()); + rTGdaug.get(HIST("TGdaug/") + HIST(DaugType[daug]) + HIST("hTrackEta1"))->Fill(RecoDecay::eta(daughter1)); + rTGdaug.get(HIST("TGdaug/") + HIST(DaugType[daug]) + HIST("hTrackEta2"))->Fill(RecoDecay::eta(daughter2)); + rTGdaug.get(HIST("TGdaug/") + HIST(DaugType[daug]) + HIST("hTrackPhi1"))->Fill(RecoDecay::phi(daughter1)); + rTGdaug.get(HIST("TGdaug/") + HIST(DaugType[daug]) + HIST("hTrackPhi2"))->Fill(RecoDecay::phi(daughter2)); + + if (trkDaughter1.hasTPC()) { + rTGdaug.get(HIST("TGdaug/") + HIST(DaugType[daug]) + HIST("PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.tpcSignal()); + rTGdaug.get(HIST("TGdaug/") + HIST(DaugType[daug]) + HIST("PID/hTPCVsPt"))->Fill(trkDaughter1.pt(), trkDaughter1.tpcSignal()); + rTGdaug.get(HIST("TGdaug/") + HIST(DaugType[daug]) + HIST("PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter1), trkDaughter1.tpcSignal()); + rTGdaug.get(HIST("TGdaug/") + HIST(DaugType[daug]) + HIST("PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter1), trkDaughter1.tpcSignal()); + if (trkDaughter1.sign() < 0) { + rTGdaug.get(HIST("TGdaug/") + HIST(DaugType[daug]) + HIST("TPCNegVsPosSignal"))->Fill(trkDaughter1.tpcSignal(), trkDaughter2.tpcSignal()); + } else { + rTGdaug.get(HIST("TGdaug/") + HIST(DaugType[daug]) + HIST("TPCNegVsPosSignal"))->Fill(trkDaughter2.tpcSignal(), trkDaughter1.tpcSignal()); + } + } + if (trkDaughter2.hasTPC()) { + rTGdaug.get(HIST("TGdaug/") + HIST(DaugType[daug]) + HIST("PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.tpcSignal()); + rTGdaug.get(HIST("TGdaug/") + HIST(DaugType[daug]) + HIST("PID/hTPCVsPt"))->Fill(trkDaughter2.pt(), trkDaughter2.tpcSignal()); + rTGdaug.get(HIST("TGdaug/") + HIST(DaugType[daug]) + HIST("PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter2), trkDaughter2.tpcSignal()); + rTGdaug.get(HIST("TGdaug/") + HIST(DaugType[daug]) + HIST("PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter2), trkDaughter2.tpcSignal()); + } + if (trkDaughter1.hasTOF()) { + rTGdaug.get(HIST("TGdaug/") + HIST(DaugType[daug]) + HIST("PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.beta()); + } + if (trkDaughter2.hasTOF()) { + + rTGdaug.get(HIST("TGdaug/") + HIST(DaugType[daug]) + HIST("PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.beta()); + } + } + template + void fillCand(const T& trkDaughter1, const T& trkDaughter2, std::array daughter1, std::array daughter2, std::array mother, float massJpsi, bool xnxn, bool onon, bool onxn, bool xnon) + { + rTGdaugCand.get(HIST("TGdaugCand/") + HIST(DaugType[daug]) + HIST("hTrackPt1"))->Fill(trkDaughter1.pt()); + rTGdaugCand.get(HIST("TGdaugCand/") + HIST(DaugType[daug]) + HIST("hTrackPt2"))->Fill(trkDaughter2.pt()); + rTGdaugCand.get(HIST("TGdaugCand/") + HIST(DaugType[daug]) + HIST("hTrackEta1"))->Fill(RecoDecay::eta(daughter1)); + rTGdaugCand.get(HIST("TGdaugCand/") + HIST(DaugType[daug]) + HIST("hTrackEta2"))->Fill(RecoDecay::eta(daughter2)); + rTGdaugCand.get(HIST("TGdaugCand/") + HIST(DaugType[daug]) + HIST("hTrackPhi1"))->Fill(RecoDecay::phi(daughter1)); + rTGdaugCand.get(HIST("TGdaugCand/") + HIST(DaugType[daug]) + HIST("hTrackPhi2"))->Fill(RecoDecay::phi(daughter2)); + rTGdaugCand.get(HIST("TGdaugCand/") + HIST(DaugType[daug]) + HIST("hPairPt"))->Fill(RecoDecay::pt(mother)); + rTGdaugCand.get(HIST("TGdaugCand/") + HIST(DaugType[daug]) + HIST("hPairIVM"))->Fill(massJpsi); + + if (trkDaughter1.hasTPC()) { + rTGdaugCand.get(HIST("TGdaugCand/") + HIST(DaugType[daug]) + HIST("PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.tpcSignal()); + rTGdaugCand.get(HIST("TGdaugCand/") + HIST(DaugType[daug]) + HIST("PID/hTPCVsPt"))->Fill(trkDaughter1.pt(), trkDaughter1.tpcSignal()); + rTGdaugCand.get(HIST("TGdaugCand/") + HIST(DaugType[daug]) + HIST("PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter1), trkDaughter1.tpcSignal()); + rTGdaugCand.get(HIST("TGdaugCand/") + HIST(DaugType[daug]) + HIST("PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter1), trkDaughter1.tpcSignal()); + } + if (trkDaughter2.hasTPC()) { + rTGdaugCand.get(HIST("TGdaugCand/") + HIST(DaugType[daug]) + HIST("PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.tpcSignal()); + rTGdaugCand.get(HIST("TGdaugCand/") + HIST(DaugType[daug]) + HIST("PID/hTPCVsPt"))->Fill(trkDaughter2.pt(), trkDaughter2.tpcSignal()); + rTGdaugCand.get(HIST("TGdaugCand/") + HIST(DaugType[daug]) + HIST("PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter2), trkDaughter2.tpcSignal()); + rTGdaugCand.get(HIST("TGdaugCand/") + HIST(DaugType[daug]) + HIST("PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter2), trkDaughter2.tpcSignal()); + } + if (trkDaughter1.hasTOF()) { + rTGdaugCand.get(HIST("TGdaugCand/") + HIST(DaugType[daug]) + HIST("PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.beta()); + } + if (trkDaughter2.hasTOF()) { + rTGdaugCand.get(HIST("TGdaugCand/") + HIST(DaugType[daug]) + HIST("PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.beta()); + } + + if (RecoDecay::pt(mother) < 0.2f) { + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST("Coherent/hIVM"))->Fill(massJpsi); + if (xnxn) { + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST("Coherent/xnxn/hIVM"))->Fill(massJpsi); + } else if (onxn) { + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST("Coherent/onxn/hIVM"))->Fill(massJpsi); + } else if (xnon) { + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST("Coherent/xnon/hIVM"))->Fill(massJpsi); + } else if (onon) { + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST("Coherent/onon/hIVM"))->Fill(massJpsi); + } + } else if (RecoDecay::pt(mother) > 0.4f) { + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST("NotCoherent/hIVM"))->Fill(massJpsi); + if (xnxn) { + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST("NotCoherent/xnxn/hIVM"))->Fill(massJpsi); + } else if (onxn) { + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST("NotCoherent/onxn/hIVM"))->Fill(massJpsi); + } else if (xnon) { + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST("NotCoherent/xnon/hIVM"))->Fill(massJpsi); + } else if (onon) { + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST("NotCoherent/onon/hIVM"))->Fill(massJpsi); + } + } + if (RecoDecay::pt(mother) > 0.2f) { + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST("Incoherent/hIVM"))->Fill(massJpsi); + if (xnxn) { + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST("Incoherent/xnxn/hIVM"))->Fill(massJpsi); + } else if (onxn) { + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST("Incoherent/onxn/hIVM"))->Fill(massJpsi); + } else if (xnon) { + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST("Incoherent/xnon/hIVM"))->Fill(massJpsi); + } else if (onon) { + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST("Incoherent/onon/hIVM"))->Fill(massJpsi); + } + } + } + + template + void fillPeak(const T& trkDaughter1, const T& trkDaughter2, std::array daughter1, std::array daughter2, std::array mother, float rapJpsi) + { + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST(NeutronClass[neutron]) + HIST("hPt1"))->Fill(trkDaughter1.pt()); + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST(NeutronClass[neutron]) + HIST("hPt2"))->Fill(trkDaughter2.pt()); + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST(NeutronClass[neutron]) + HIST("hEta1"))->Fill(RecoDecay::eta(daughter1)); + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST(NeutronClass[neutron]) + HIST("hEta2"))->Fill(RecoDecay::eta(daughter2)); + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST(NeutronClass[neutron]) + HIST("hPhi1"))->Fill(RecoDecay::phi(daughter1)); + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST(NeutronClass[neutron]) + HIST("hPhi2"))->Fill(RecoDecay::phi(daughter2)); + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST(NeutronClass[neutron]) + HIST("hPt"))->Fill(RecoDecay::pt(mother)); + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST(NeutronClass[neutron]) + HIST("hEta"))->Fill(RecoDecay::eta(mother)); + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST(NeutronClass[neutron]) + HIST("hRap"))->Fill(rapJpsi); + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST(NeutronClass[neutron]) + HIST("hPhi"))->Fill(RecoDecay::phi(mother)); + + if (trkDaughter1.hasTPC()) { + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST("PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.tpcSignal()); + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST("PID/hTPCVsPt"))->Fill(trkDaughter1.pt(), trkDaughter1.tpcSignal()); + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST("PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter1), trkDaughter1.tpcSignal()); + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST("PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter1), trkDaughter1.tpcSignal()); + } + if (trkDaughter2.hasTPC()) { + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST("PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.tpcSignal()); + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST("PID/hTPCVsPt"))->Fill(trkDaughter2.pt(), trkDaughter2.tpcSignal()); + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST("PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter2), trkDaughter2.tpcSignal()); + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST("PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter2), trkDaughter2.tpcSignal()); + } + if (trkDaughter1.hasTOF()) { + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST("PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.beta()); + } + if (trkDaughter2.hasTOF()) { + rJpsiToDaug.get(HIST("JPsiToDaug/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST("PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.beta()); + } + } + + template + void fillCorrAsy(std::array daughter1, std::array daughter2, double dp, double dpRandom, float* q) + { + if (neutron == 0) { + rCorrelation.get(HIST("Correlation/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST("Phi1"))->Fill(RecoDecay::phi(daughter1), 1.); + rCorrelation.get(HIST("Correlation/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST("Phi2"))->Fill(RecoDecay::phi(daughter2), 1.); + rCorrelation.get(HIST("Correlation/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST("Phi"))->Fill(q[1], 1.); + rCorrelation.get(HIST("Correlation/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST("CosTheta"))->Fill(q[2], 1.); + rCorrelation.get(HIST("Correlation/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST("AccoplAngle"))->Fill(q[0], 1.); + rCorrelation.get(HIST("Correlation/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST("CosThetaPhi"))->Fill(q[2], q[1]); + } + + rAsymmetry.get(HIST("Asymmetry/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST(NeutronClass[neutron]) + HIST("DeltaPhi"))->Fill(dp); + rAsymmetry.get(HIST("Asymmetry/") + HIST(DaugType[daug]) + HIST(ProdType[prod]) + HIST(NeutronClass[neutron]) + HIST("DeltaPhiRandom"))->Fill(dpRandom); + } + + template + void fillHistograms(C collision, Ts tracks) + { + rStatistics.get(HIST("Statistics/hCutCounterCollisions"))->Fill(0); // number of collisions without any cuts + + // check UPC vs standard + if (doOnlyUPC) { + if (collision.flags() == 0) { + return; + } + } + if (doOnlyStandard) { + if (collision.flags() == 1) { + return; + } + } + + if (std::abs(collision.posZ()) > cutVertexZ) { + rStatistics.get(HIST("Statistics/hCutCounterCollisions"))->Fill(1); + return; + } + + // distinguish ZDC classes + bool xnxn = false, onon = false, xnon = false, onxn = false; + int neutronClass = -1; + if (collision.energyCommonZNA() < znEnergyCut && collision.energyCommonZNC() < znEnergyCut) { + onon = true; + neutronClass = 0; + } + if (collision.energyCommonZNA() > znEnergyCut && std::abs(collision.timeZNA()) < znTimeCut && collision.energyCommonZNC() > znEnergyCut && std::abs(collision.timeZNC()) < znTimeCut) { + xnxn = true; + neutronClass = 1; + } + if (collision.energyCommonZNA() > znEnergyCut && std::abs(collision.timeZNA()) < znTimeCut && collision.energyCommonZNC() < znEnergyCut) { + xnon = true; + neutronClass = 2; + } + if (collision.energyCommonZNA() < znEnergyCut && collision.energyCommonZNC() > znEnergyCut && std::abs(collision.timeZNC()) < znTimeCut) { + onxn = true; + neutronClass = 3; + } + + // loop over tracks without selections + for (const auto& track : tracks) { + float trkPx = track.px(); + float trkPy = track.py(); + float trkPz = track.pz(); + + rStatistics.get(HIST("Statistics/hNumberOfTracks"))->Fill(0); + rStatistics.get(HIST("Statistics/hCutCounterTracks"))->Fill(0); + if (track.isPVContributor() == 1) { + rStatistics.get(HIST("Statistics/hNumberOfTracks"))->Fill(1); + rPVContributors.get(HIST("PVContributors/hTrackPt"))->Fill(track.pt()); + rPVContributors.get(HIST("PVContributors/hTrackEta"))->Fill(RecoDecay::eta(std::array{trkPx, trkPy, trkPz})); + rPVContributors.get(HIST("PVContributors/hTrackPhi"))->Fill(RecoDecay::phi(trkPx, trkPy)); + + if (track.hasTPC()) { + rPVContributors.get(HIST("PVContributors/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkPx, trkPy, trkPz), track.tpcSignal()); + rPVContributors.get(HIST("PVContributors/PID/hTPCVsPt"))->Fill(track.pt(), track.tpcSignal()); + rPVContributors.get(HIST("PVContributors/PID/hTPCVsEta"))->Fill(RecoDecay::eta(std::array{trkPx, trkPy, trkPz}), track.tpcSignal()); + rPVContributors.get(HIST("PVContributors/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(trkPx, trkPy), track.tpcSignal()); + rPVContributors.get(HIST("PVContributors/hTPCNClsFindable"))->Fill(track.tpcNClsFindable()); + rPVContributors.get(HIST("PVContributors/hTPCNClsFindableMinusFound"))->Fill(track.tpcNClsFindableMinusFound()); + } + + if (track.hasTOF()) { + rPVContributors.get(HIST("PVContributors/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkPx, trkPy, trkPz), track.beta()); + } + } + + rRawData.get(HIST("RawData/hTrackPt"))->Fill(track.pt()); + rRawData.get(HIST("RawData/hTrackEta"))->Fill(RecoDecay::eta(std::array{trkPx, trkPy, trkPz})); + rRawData.get(HIST("RawData/hTrackPhi"))->Fill(RecoDecay::phi(trkPx, trkPy)); + rRawData.get(HIST("RawData/hTrackDCAXYZ"))->Fill(track.dcaXY(), track.dcaZ()); + rRawData.get(HIST("RawData/hTPCNClsFindable"))->Fill(track.tpcNClsFindable()); + rRawData.get(HIST("RawData/hTPCNClsFindableMinusFound"))->Fill(track.tpcNClsFindableMinusFound()); + rRawData.get(HIST("RawData/hITSNCls"))->Fill(track.itsNCls()); + rRawData.get(HIST("RawData/hTPCNCls"))->Fill(track.tpcNClsFindable() - track.tpcNClsFindableMinusFound()); + rRawData.get(HIST("RawData/hITSChi2NCls"))->Fill(track.itsChi2NCl()); + rRawData.get(HIST("RawData/hTPCChi2NCls"))->Fill(track.tpcChi2NCl()); + rRawData.get(HIST("RawData/QA/FIT/hTotFT0AmplitudeA"))->Fill(collision.totalFT0AmplitudeA()); + rRawData.get(HIST("RawData/QA/FIT/hTotFT0AmplitudeC"))->Fill(collision.totalFT0AmplitudeC()); + rRawData.get(HIST("RawData/QA/FIT/hTotFV0AmplitudeA"))->Fill(collision.totalFV0AmplitudeA()); + rRawData.get(HIST("RawData/QA/FIT/hTotFDDAmplitudeA"))->Fill(collision.totalFDDAmplitudeA()); + rRawData.get(HIST("RawData/QA/FIT/hTotFDDAmplitudeC"))->Fill(collision.totalFDDAmplitudeC()); + rRawData.get(HIST("RawData/QA/FIT/hTimeFT0A"))->Fill(collision.timeFT0A()); + rRawData.get(HIST("RawData/QA/FIT/hTimeFT0C"))->Fill(collision.timeFT0C()); + rRawData.get(HIST("RawData/QA/FIT/hTimeFV0A"))->Fill(collision.timeFV0A()); + rRawData.get(HIST("RawData/QA/FIT/hTimeFDDA"))->Fill(collision.timeFDDA()); + rRawData.get(HIST("RawData/QA/FIT/hTimeFDDC"))->Fill(collision.timeFDDC()); + + if (track.hasTPC()) { + rRawData.get(HIST("RawData/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkPx, trkPy, trkPz), track.tpcSignal()); + rRawData.get(HIST("RawData/PID/hTPCVsPt"))->Fill(track.pt(), track.tpcSignal()); + rRawData.get(HIST("RawData/PID/hTPCVsEta"))->Fill(RecoDecay::eta(std::array{trkPx, trkPy, trkPz}), track.tpcSignal()); + rRawData.get(HIST("RawData/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(trkPx, trkPy), track.tpcSignal()); + } + + if (track.hasTOF()) { + rRawData.get(HIST("RawData/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkPx, trkPy, trkPz), track.beta()); + } + } + + int countGT = 0; + std::vector trkIdx; + // loop over tracks with selections + + rRawData.get(HIST("RawData/hPositionX"))->Fill(collision.posX()); + rRawData.get(HIST("RawData/hPositionY"))->Fill(collision.posY()); + rRawData.get(HIST("RawData/hPositionZ"))->Fill(collision.posZ()); + rRawData.get(HIST("RawData/hPositionXY"))->Fill(collision.posX(), collision.posY()); + rRawData.get(HIST("RawData/QA/ZDC/hZNACommonEnergy"))->Fill(collision.energyCommonZNA()); + rRawData.get(HIST("RawData/QA/ZDC/hZNCCommonEnergy"))->Fill(collision.energyCommonZNC()); + rRawData.get(HIST("RawData/QA/ZDC/hZNAvsZNCCommonEnergy"))->Fill(collision.energyCommonZNA(), collision.energyCommonZNC()); + rRawData.get(HIST("RawData/QA/ZDC/hZNCTime"))->Fill(collision.timeZNC()); + rRawData.get(HIST("RawData/QA/ZDC/hZNATime"))->Fill(collision.timeZNA()); + rRawData.get(HIST("RawData/QA/ZDC/hZNAvsZNCTime"))->Fill(collision.timeZNA(), collision.timeZNC()); + + for (const auto& track : tracks) { + + rStatistics.get(HIST("Statistics/hNumberOfTracks"))->Fill(2.); + + // select good tracks + if (goodTrackCuts(track) != 1) { + continue; + } + + countGT++; + trkIdx.push_back(track.index()); + } + + rStatistics.get(HIST("Statistics/hNumberOfTracks"))->Fill(3., countGT); + rStatistics.get(HIST("Statistics/hNumberGT"))->Fill(countGT); + + float massEl = o2::constants::physics::MassElectron; + float massMu = o2::constants::physics::MassMuonMinus; + float massPr = o2::constants::physics::MassProton; + + if (countGT == 2) { + TLorentzVector mom, daughter[2]; + auto trkDaughter1 = tracks.iteratorAt(trkIdx[0]); + auto trkDaughter2 = tracks.iteratorAt(trkIdx[1]); + + if ((trkDaughter1.sign() * trkDaughter2.sign()) != -1) { + return; + } + + if (chargeOrdered) { + if (tracks.iteratorAt(trkIdx[0]).sign() < 0) { + trkDaughter1 = tracks.iteratorAt(trkIdx[0]); + trkDaughter2 = tracks.iteratorAt(trkIdx[1]); + } else { + trkDaughter1 = tracks.iteratorAt(trkIdx[1]); + trkDaughter2 = tracks.iteratorAt(trkIdx[0]); + } + } + + std::array daughter1 = {trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()}; + std::array daughter2 = {trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()}; + + rTG.get(HIST("TG/hTrackPt1"))->Fill(trkDaughter1.pt()); + rTG.get(HIST("TG/hTrackPt2"))->Fill(trkDaughter2.pt()); + rTG.get(HIST("TG/hTrackEta1"))->Fill(RecoDecay::eta(daughter1)); + rTG.get(HIST("TG/hTrackEta2"))->Fill(RecoDecay::eta(daughter2)); + rTG.get(HIST("TG/hTrackPhi1"))->Fill(RecoDecay::phi(daughter1)); + rTG.get(HIST("TG/hTrackPhi2"))->Fill(RecoDecay::phi(daughter2)); + + if (trkDaughter1.hasTPC()) { + rTG.get(HIST("TG/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.tpcSignal()); + rTG.get(HIST("TG/PID/hTPCVsPt"))->Fill(trkDaughter1.pt(), trkDaughter1.tpcSignal()); + rTG.get(HIST("TG/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter1), trkDaughter1.tpcSignal()); + rTG.get(HIST("TG/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter1), trkDaughter1.tpcSignal()); + rTG.get(HIST("TG/hTPCNClsFindable"))->Fill(trkDaughter1.tpcNClsFindable()); + rTG.get(HIST("TG/hTPCNClsFindableMinusFound"))->Fill(trkDaughter1.tpcNClsFindableMinusFound()); + if (trkDaughter1.sign() < 0) { + rTG.get(HIST("TG/TPC/TPCNegVsPosSignal"))->Fill(trkDaughter1.tpcSignal(), trkDaughter2.tpcSignal()); + } else { + rTG.get(HIST("TG/TPC/TPCNegVsPosSignal"))->Fill(trkDaughter2.tpcSignal(), trkDaughter1.tpcSignal()); + } + } + if (trkDaughter2.hasTPC()) { + rTG.get(HIST("TG/PID/hTPCVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.tpcSignal()); + rTG.get(HIST("TG/PID/hTPCVsPt"))->Fill(trkDaughter2.pt(), trkDaughter2.tpcSignal()); + rTG.get(HIST("TG/PID/hTPCVsEta"))->Fill(RecoDecay::eta(daughter2), trkDaughter2.tpcSignal()); + rTG.get(HIST("TG/PID/hTPCVsPhi"))->Fill(RecoDecay::phi(daughter2), trkDaughter2.tpcSignal()); + rTG.get(HIST("TG/hTPCNClsFindable"))->Fill(trkDaughter2.tpcNClsFindable()); + rTG.get(HIST("TG/hTPCNClsFindableMinusFound"))->Fill(trkDaughter2.tpcNClsFindableMinusFound()); + } + if (trkDaughter1.hasTOF()) { + rTG.get(HIST("TG/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()), trkDaughter1.beta()); + } + if (trkDaughter2.hasTOF()) { + rTG.get(HIST("TG/PID/hBetaTOFVsP"))->Fill(RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()), trkDaughter2.beta()); + } + + if (doElectrons) { + if (RecoDecay::sumOfSquares(trkDaughter1.tpcNSigmaMu(), trkDaughter2.tpcNSigmaMu()) > RecoDecay::sumOfSquares(trkDaughter1.tpcNSigmaEl(), trkDaughter2.tpcNSigmaEl())) { + + auto ene1 = RecoDecay::e(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz(), massEl); + auto ene2 = RecoDecay::e(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz(), massEl); + daughter[0].SetPxPyPzE(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz(), ene1); + daughter[1].SetPxPyPzE(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz(), ene2); + mom = daughter[0] + daughter[1]; + + std::array mother = {trkDaughter1.px() + trkDaughter2.px(), trkDaughter1.py() + trkDaughter2.py(), trkDaughter1.pz() + trkDaughter2.pz()}; + + auto arrMom = std::array{daughter1, daughter2}; + float massJpsi = RecoDecay::m(arrMom, std::array{massEl, massEl}); + float rapJpsi = RecoDecay::y(mother, massJpsi); + + auto leadingP = RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()) > RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()) ? trkDaughter1 : trkDaughter2; + auto subleadingP = (leadingP == trkDaughter1) ? trkDaughter1 : trkDaughter2; + + // TGdaug + fillTGdaug<0>(trkDaughter1, trkDaughter2, daughter1, daughter2); + + // selections + fillSelections<0>(leadingP, subleadingP, massJpsi, rapJpsi, mother); + + if (candidateCuts(massJpsi, rapJpsi) != 1) { + return; + } + + // TGdaugCand + fillCand<0>(trkDaughter1, trkDaughter2, daughter1, daughter2, mother, massJpsi, xnxn, onon, onxn, xnon); + + double dp = DeltaPhi(daughter[0], daughter[1]); + float* q = correlation(&daughter[0], &daughter[1], &mom); + double dpRandom = DeltaPhiRandom(daughter[0], daughter[1]); + + if ((massJpsi < maxJpsiMass) && (massJpsi > minJpsiMass)) { + rTGdaugCand.get(HIST("TGdaugCand/Electron/hJpsiPt"))->Fill(RecoDecay::pt(mother)); + rTGdaugCand.get(HIST("TGdaugCand/Electron/hJpsiRap"))->Fill(rapJpsi); + + if (trkDaughter1.sign() < 0) { + rTGdaugCand.get(HIST("TGdaugCand/Electron/TPCNegVsPosSignal"))->Fill(trkDaughter1.tpcSignal(), trkDaughter2.tpcSignal()); + } else { + rTGdaugCand.get(HIST("TGdaugCand/Electron/TPCNegVsPosSignal"))->Fill(trkDaughter2.tpcSignal(), trkDaughter1.tpcSignal()); + } + + if (RecoDecay::pt(mother) < 0.2f) { + fillPeak<0, 0, 0>(trkDaughter1, trkDaughter2, daughter1, daughter2, mother, rapJpsi); + + if (xnxn) { + fillPeak<0, 0, 1>(trkDaughter1, trkDaughter2, daughter1, daughter2, mother, rapJpsi); + fillCorrAsy<0, 0, 1>(daughter1, daughter2, dp, dpRandom, q); + } else if (onon) { + fillPeak<0, 0, 3>(trkDaughter1, trkDaughter2, daughter1, daughter2, mother, rapJpsi); + fillCorrAsy<0, 0, 3>(daughter1, daughter2, dp, dpRandom, q); + } else if (xnon) { + fillPeak<0, 0, 4>(trkDaughter1, trkDaughter2, daughter1, daughter2, mother, rapJpsi); + fillCorrAsy<0, 0, 4>(daughter1, daughter2, dp, dpRandom, q); + } else if (onxn) { + fillPeak<0, 0, 2>(trkDaughter1, trkDaughter2, daughter1, daughter2, mother, rapJpsi); + fillCorrAsy<0, 0, 2>(daughter1, daughter2, dp, dpRandom, q); + } + fillCorrAsy<0, 0, 0>(daughter1, daughter2, dp, dpRandom, q); + + } // end coherent electrons + if (RecoDecay::pt(mother) > 0.2f) { + fillPeak<0, 1, 0>(trkDaughter1, trkDaughter2, daughter1, daughter2, mother, rapJpsi); + fillCorrAsy<0, 1, 0>(daughter1, daughter2, dp, dpRandom, q); + + if (xnxn) { + fillPeak<0, 1, 1>(trkDaughter1, trkDaughter2, daughter1, daughter2, mother, rapJpsi); + } else if (onon) { + fillPeak<0, 1, 3>(trkDaughter1, trkDaughter2, daughter1, daughter2, mother, rapJpsi); + fillCorrAsy<0, 1, 3>(daughter1, daughter2, dp, dpRandom, q); + } else if (xnon) { + fillPeak<0, 1, 4>(trkDaughter1, trkDaughter2, daughter1, daughter2, mother, rapJpsi); + fillCorrAsy<0, 1, 4>(daughter1, daughter2, dp, dpRandom, q); + } else if (onxn) { + fillPeak<0, 1, 2>(trkDaughter1, trkDaughter2, daughter1, daughter2, mother, rapJpsi); + fillCorrAsy<0, 1, 2>(daughter1, daughter2, dp, dpRandom, q); + } + + } // end incoherent electrons + } // end mass cut + delete[] q; + } + } // end electrons + if (doMuons) { + if (RecoDecay::sumOfSquares(trkDaughter1.tpcNSigmaEl(), trkDaughter2.tpcNSigmaEl()) > RecoDecay::sumOfSquares(trkDaughter1.tpcNSigmaMu(), trkDaughter2.tpcNSigmaMu())) { + + auto ene1 = RecoDecay::e(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz(), massMu); + auto ene2 = RecoDecay::e(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz(), massMu); + daughter[0].SetPxPyPzE(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz(), ene1); + daughter[1].SetPxPyPzE(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz(), ene2); + mom = daughter[0] + daughter[1]; + + std::array mother = {trkDaughter1.px() + trkDaughter2.px(), trkDaughter1.py() + trkDaughter2.py(), trkDaughter1.pz() + trkDaughter2.pz()}; + + auto arrMom = std::array{daughter1, daughter2}; + float massJpsi = RecoDecay::m(arrMom, std::array{massMu, massMu}); + float rapJpsi = RecoDecay::y(mother, massJpsi); + + auto leadingP = RecoDecay::sqrtSumOfSquares(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz()) > RecoDecay::sqrtSumOfSquares(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz()) ? trkDaughter1 : trkDaughter2; + auto subleadingP = (leadingP == trkDaughter1) ? trkDaughter1 : trkDaughter2; + + // TGdaug + fillTGdaug<1>(trkDaughter1, trkDaughter2, daughter1, daughter2); + // selections + fillSelections<1>(leadingP, subleadingP, massJpsi, rapJpsi, mother); + + if (candidateCuts(massJpsi, rapJpsi) != 1) { + return; + } + + // TGdaugCand + fillCand<1>(trkDaughter1, trkDaughter2, daughter1, daughter2, mother, massJpsi, xnxn, onon, onxn, xnon); + + double dp = DeltaPhi(daughter[0], daughter[1]); + float* q = correlation(&daughter[0], &daughter[1], &mom); + double dpRandom = DeltaPhiRandom(daughter[0], daughter[1]); + // fill tree with muon J/Psi candidates + tree(collision.runNumber(), collision.globalBC(), + collision.posX(), collision.posY(), collision.posZ(), + collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFV0AmplitudeA(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), + collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC(), + collision.energyCommonZNA(), collision.energyCommonZNC(), collision.timeZNA(), collision.timeZNC(), neutronClass, + RecoDecay::pt(mother), RecoDecay::eta(mother), RecoDecay::phi(mother), rapJpsi, massJpsi, dpRandom, dp, q[1], q[2], + trkDaughter1.sign(), trkDaughter1.pt(), RecoDecay::eta(daughter1), RecoDecay::phi(daughter1), + trkDaughter2.sign(), trkDaughter2.pt(), RecoDecay::eta(daughter2), RecoDecay::phi(daughter2)); + + if ((massJpsi < maxJpsiMass) && (massJpsi > minJpsiMass)) { + rTGdaugCand.get(HIST("TGdaugCand/Muon/hJpsiPt"))->Fill(RecoDecay::pt(mother)); + rTGdaugCand.get(HIST("TGdaugCand/Muon/hJpsiRap"))->Fill(rapJpsi); + if (trkDaughter1.sign() < 0) { + rTGdaugCand.get(HIST("TGdaugCand/Muon/TPCNegVsPosSignal"))->Fill(trkDaughter1.tpcSignal(), trkDaughter2.tpcSignal()); + } else { + rTGdaugCand.get(HIST("TGdaugCand/Muon/TPCNegVsPosSignal"))->Fill(trkDaughter2.tpcSignal(), trkDaughter1.tpcSignal()); + } + + if (RecoDecay::pt(mother) < 0.2f) { + fillPeak<1, 0, 0>(trkDaughter1, trkDaughter2, daughter1, daughter2, mother, rapJpsi); + fillCorrAsy<1, 0, 0>(daughter1, daughter2, dp, dpRandom, q); + + if (xnxn) { + fillPeak<1, 0, 1>(trkDaughter1, trkDaughter2, daughter1, daughter2, mother, rapJpsi); + fillCorrAsy<1, 0, 1>(daughter1, daughter2, dp, dpRandom, q); + } else if (onon) { + fillPeak<1, 0, 3>(trkDaughter1, trkDaughter2, daughter1, daughter2, mother, rapJpsi); + fillCorrAsy<1, 0, 3>(daughter1, daughter2, dp, dpRandom, q); + } else if (xnon) { + fillPeak<1, 0, 4>(trkDaughter1, trkDaughter2, daughter1, daughter2, mother, rapJpsi); + fillCorrAsy<1, 0, 4>(daughter1, daughter2, dp, dpRandom, q); + } else if (onxn) { + fillPeak<1, 0, 2>(trkDaughter1, trkDaughter2, daughter1, daughter2, mother, rapJpsi); + fillCorrAsy<1, 0, 2>(daughter1, daughter2, dp, dpRandom, q); + } + } + if (RecoDecay::pt(mother) > 0.2f) { + fillPeak<1, 1, 0>(trkDaughter1, trkDaughter2, daughter1, daughter2, mother, rapJpsi); + fillCorrAsy<1, 1, 0>(daughter1, daughter2, dp, dpRandom, q); + + if (xnxn) { + fillPeak<1, 1, 1>(trkDaughter1, trkDaughter2, daughter1, daughter2, mother, rapJpsi); + fillCorrAsy<1, 1, 1>(daughter1, daughter2, dp, dpRandom, q); + } else if (onon) { + fillPeak<1, 1, 3>(trkDaughter1, trkDaughter2, daughter1, daughter2, mother, rapJpsi); + fillCorrAsy<1, 1, 3>(daughter1, daughter2, dp, dpRandom, q); + } else if (xnon) { + fillPeak<1, 1, 4>(trkDaughter1, trkDaughter2, daughter1, daughter2, mother, rapJpsi); + fillCorrAsy<1, 1, 4>(daughter1, daughter2, dp, dpRandom, q); + } else if (onxn) { + fillPeak<1, 1, 2>(trkDaughter1, trkDaughter2, daughter1, daughter2, mother, rapJpsi); + fillCorrAsy<1, 1, 2>(daughter1, daughter2, dp, dpRandom, q); + } + } // end incoherent + } // end mass cut + delete[] q; + } + } // end muons + if (doProtons) { + if (RecoDecay::sumOfSquares((trkDaughter1.hasTOF() ? trkDaughter1.tofNSigmaPr() : trkDaughter1.tpcNSigmaPr()), (trkDaughter2.hasTOF() ? trkDaughter2.tofNSigmaPr() : trkDaughter2.tpcNSigmaPr()) < 4)) { + + auto ene1 = RecoDecay::e(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz(), massPr); + auto ene2 = RecoDecay::e(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz(), massPr); + daughter[0].SetPxPyPzE(trkDaughter1.px(), trkDaughter1.py(), trkDaughter1.pz(), ene1); + daughter[1].SetPxPyPzE(trkDaughter2.px(), trkDaughter2.py(), trkDaughter2.pz(), ene2); + mom = daughter[0] + daughter[1]; + + std::array mother = {trkDaughter1.px() + trkDaughter2.px(), trkDaughter1.py() + trkDaughter2.py(), trkDaughter1.pz() + trkDaughter2.pz()}; + + if (tofBothProtons) { + if (!trkDaughter1.hasTOF() || !trkDaughter2.hasTOF()) + return; + } + if (tofOneProton) { + if ((trkDaughter1.hasTOF() && trkDaughter2.hasTOF()) || (!trkDaughter1.hasTOF() && !trkDaughter2.hasTOF())) + return; + } + if (tofAtLeastOneProton) { + if (!trkDaughter1.hasTOF() && !trkDaughter2.hasTOF()) + return; + } + + auto arrMom = std::array{daughter1, daughter2}; + float massJpsi = RecoDecay::m(arrMom, std::array{massPr, massPr}); + float rapJpsi = RecoDecay::y(mother, massJpsi); + + // TGdaug + fillTGdaug<2>(trkDaughter1, trkDaughter2, daughter1, daughter2); + + if (candidateCuts(massJpsi, rapJpsi) != 1) { + return; + } + + // TGdaugCand + fillCand<2>(trkDaughter1, trkDaughter2, daughter1, daughter2, mother, massJpsi, xnxn, onon, onxn, xnon); + + if (RecoDecay::pt(mother) < 0.2f) { + rJpsiToDaug.get(HIST("JPsiToDaug/Proton/Coherent/hIVM"))->Fill(massJpsi); + } else { + rJpsiToDaug.get(HIST("JPsiToDaug/Proton/Incoherent/hIVM"))->Fill(massJpsi); + } + + if (massJpsi < maxJpsiMass && massJpsi > minJpsiMass) { + rTGdaugCand.get(HIST("TGdaugCand/Proton/hJpsiPt"))->Fill(RecoDecay::pt(mother)); + rTGdaugCand.get(HIST("TGdaugCand/Proton/hJpsiRap"))->Fill(rapJpsi); + if (RecoDecay::pt(mother) < 0.2f) { + + fillPeak<2, 0, 0>(trkDaughter1, trkDaughter2, daughter1, daughter2, mother, rapJpsi); + + } // end coherent + if (RecoDecay::pt(mother) > 0.2f) { + // fill track histos + fillPeak<1, 1, 0>(trkDaughter1, trkDaughter2, daughter1, daughter2, mother, rapJpsi); + } // end incoherent + } // end mass cut + } + } // end protons + } // end two tracks + } // end reco process + + template + void processMC(C const& mcCollision, T const& mcParticles) + { + + rMC.get(HIST("MC/hNumberOfMCCollisions"))->Fill(1.); + rMC.get(HIST("MC/hPosZ"))->Fill(mcCollision.posZ()); + + std::array daughPart1Mu = {-999, -999, -999}; + std::array daughPart2Mu = {-999, -999, -999}; + std::array motherPart = {-999, -999, -999}; + float energyMother = -999; + float daughPart1pdg = -999; + float daughPart2pdg = -999; + + // fill number of particles + for (auto const& mcParticle : mcParticles) { + rMC.get(HIST("MC/Muon/hNumberOfMCTracks"))->Fill(1.); + rMC.get(HIST("MC/hPdg"))->Fill(mcParticle.pdgCode()); + if (mcParticle.has_daughters()) { + rMC.get(HIST("MC/hMothersPdg"))->Fill(mcParticle.pdgCode()); + rMC.get(HIST("MC/Muon/hNumberOfMCTracks"))->Fill(3.); + if (mcParticle.pdgCode() == 443) { + rMC.get(HIST("MC/Muon/hNumberOfMCTracks"))->Fill(4.); + int count = 0; + for (const auto& daughter : mcParticle.template daughters_as()) { + if ((daughter.pdgCode() == -13) && daughter.isPhysicalPrimary()) { + daughPart1Mu = {daughter.px(), daughter.py(), daughter.pz()}; + daughPart1pdg = daughter.pdgCode(); + + rMC.get(HIST("MC/Muon/hNumberOfMCTracks"))->Fill(5.); + count++; + } + if ((daughter.pdgCode() == 13) && daughter.isPhysicalPrimary()) { + daughPart2Mu = {daughter.px(), daughter.py(), daughter.pz()}; + daughPart2pdg = daughter.pdgCode(); + + rMC.get(HIST("MC/Muon/hNumberOfMCTracks"))->Fill(6.); + count++; + } + } + if (count == 2) { + rMC.get(HIST("MC/Muon/hNumberOfMCTracks"))->Fill(7.); + motherPart = {mcParticle.px(), mcParticle.py(), mcParticle.pz()}; + energyMother = mcParticle.e(); + } + } + } + } + + // calculate needed distributions + + rMC.get(HIST("MC/Muon/hEta1"))->Fill(RecoDecay::eta(daughPart1Mu)); + rMC.get(HIST("MC/Muon/hEta2"))->Fill(RecoDecay::eta(daughPart2Mu)); + rMC.get(HIST("MC/Muon/hEta"))->Fill(RecoDecay::eta(motherPart)); + rMC.get(HIST("MC/Muon/hPhi1"))->Fill(RecoDecay::phi(daughPart1Mu)); + rMC.get(HIST("MC/Muon/hPhi2"))->Fill(RecoDecay::phi(daughPart2Mu)); + rMC.get(HIST("MC/Muon/hPhi"))->Fill(RecoDecay::phi(motherPart)); + rMC.get(HIST("MC/Muon/hPt1"))->Fill(RecoDecay::pt(daughPart1Mu)); + rMC.get(HIST("MC/Muon/hPt2"))->Fill(RecoDecay::pt(daughPart2Mu)); + rMC.get(HIST("MC/Muon/hPt"))->Fill(RecoDecay::pt(motherPart)); + rMC.get(HIST("MC/Muon/hIVM"))->Fill(RecoDecay::m(motherPart, energyMother)); + rMC.get(HIST("MC/Muon/hRapidity"))->Fill(RecoDecay::y(motherPart, RecoDecay::m(motherPart, energyMother))); + + float massMu = o2::constants::physics::MassMuonMinus; + auto ene1 = RecoDecay::e(daughPart1Mu, massMu); + auto ene2 = RecoDecay::e(daughPart2Mu, massMu); + + TLorentzVector mom, daughter[2]; + daughter[0].SetPxPyPzE(daughPart1Mu[0], daughPart1Mu[1], daughPart1Mu[2], ene1); + daughter[1].SetPxPyPzE(daughPart2Mu[0], daughPart2Mu[1], daughPart2Mu[2], ene2); + mom = daughter[0] + daughter[1]; + + double dp = DeltaPhi(daughter[0], daughter[1]); + float* q = correlation(&daughter[0], &daughter[1], &mom); + double dpRandom = DeltaPhiRandom(daughter[0], daughter[1]); + + // fill tree with muon J/Psi candidates + treeMC(mcCollision.globalBC(), + RecoDecay::pt(motherPart), RecoDecay::eta(motherPart), RecoDecay::phi(motherPart), RecoDecay::y(motherPart, RecoDecay::m(motherPart, energyMother)), RecoDecay::m(motherPart, energyMother), dpRandom, dp, q[1], q[2], + daughPart1pdg, RecoDecay::pt(daughPart1Mu), RecoDecay::eta(daughPart1Mu), RecoDecay::phi(daughPart1Mu), + daughPart2pdg, RecoDecay::pt(daughPart2Mu), RecoDecay::eta(daughPart2Mu), RecoDecay::phi(daughPart2Mu)); + + } // end MC skimmed process + + void processMCFull(MCUDCollisionFull const& collision, MCUDTracksFull const& tracks, aod::UDMcCollisions const& mcCollision, aod::UDMcParticles const&) + { + rMC.get(HIST("MC/hNumberOfRecoCollisions"))->Fill(collision.size()); + rMC.get(HIST("MC/hNumberOfTrueCollisions"))->Fill(mcCollision.size()); + rMC.get(HIST("MC/hNumberOfMatchedMCTracks"))->Fill(1.); + if (collision.has_udMcCollision()) { + std::array recoTrack; + std::array truePart; + bool mesonFound = false; + for (const auto& track : tracks) { + rMC.get(HIST("MC/hNumberOfMatchedMCTracks"))->Fill(1.); + mesonFound = false; + if (track.has_udMcParticle()) { + rMC.get(HIST("MC/hNumberOfMatchedMCTracks"))->Fill(2.); + auto mcParticle = track.udMcParticle(); + rMC.fill(HIST("MC/hResolution"), mcParticle.px() - track.px()); + if (std::abs(mcParticle.pdgCode()) == 13 && mcParticle.isPhysicalPrimary()) { + rMC.get(HIST("MC/hNumberOfMatchedMCTracks"))->Fill(3.); + if (mcParticle.has_mothers()) { + rMC.get(HIST("MC/hNumberOfMatchedMCTracks"))->Fill(4.); + auto const& mother = mcParticle.mothers_first_as(); + if (mother.pdgCode() == 443) { + rMC.get(HIST("MC/hNumberOfMatchedMCTracks"))->Fill(5.); + recoTrack = {track.px(), track.py(), track.pz()}; + truePart = {mcParticle.px(), mcParticle.py(), mcParticle.pz()}; + mesonFound = true; + } + } + } + if (mesonFound) { + rMC.fill(HIST("MC/hResolutionPhi"), RecoDecay::phi(recoTrack) - RecoDecay::phi(truePart)); + } + } + } + } + } // end MC Full process + + void processDGrecoLevel(UDCollisionFull const& collision, UDTracksFull const& tracks) + { + fillHistograms(collision, tracks); + } // end DG process + + void processSGrecoLevel(SGUDCollisionFull const& collision, UDTracksFull const& tracks) + { + int gapSide = collision.gapSide(); + int trueGapSide = sgSelector.trueGap(collision, cutMyGapSideFV0, cutMyGapSideFT0A, cutMyGapSideFT0C, cutMyGapSideZDC); + if (useTrueGap) { + gapSide = trueGapSide; + } + if (gapSide != whichGapSide) { + return; + } + fillHistograms(collision, tracks); + + } // end SG process + + void processMCtruth(aod::UDMcCollision const& mcCollision, aod::UDMcParticles const& mcParticles) + { + processMC(mcCollision, mcParticles); + } + + PROCESS_SWITCH(UpcJpsiCorr, processDGrecoLevel, "Iterate over DG skimmed data.", false); + PROCESS_SWITCH(UpcJpsiCorr, processSGrecoLevel, "Iterate over SG skimmed data.", true); + PROCESS_SWITCH(UpcJpsiCorr, processMCtruth, "Iterate of MC true data.", true); + PROCESS_SWITCH(UpcJpsiCorr, processMCFull, "Iterate over both true and reco.", true); +}; // end struct + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc), + }; +} From 83528a993a8950b0ea77948b6f3313c12aa855f8 Mon Sep 17 00:00:00 2001 From: kpradhan-kshitish <149397157+kpradhan-kshitish@users.noreply.github.com> Date: Wed, 26 Feb 2025 20:09:40 +0530 Subject: [PATCH 0428/1650] [PWGDQ] Add CosTheta and Phi distribution histograms for Upsilon (#10158) --- PWGDQ/Core/HistogramsLibrary.cxx | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index f076fdfda87..34002a83acd 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -1124,6 +1124,30 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "Mass_Pt_cosThetaCS_phiCS", "", 4, varspTCS, binspT, xminpT, xmaxpT, 0, -1, kFALSE); hm->AddHistogram(histClass, "Mass_y_cosThetaCS_phiCS", "", 4, varsrapCS, binsy, xminy, xmaxy, 0, -1, kFALSE); } + if (subGroupStr.Contains("upsilon-polarization-he")) { + int varspTHE[4] = {VarManager::kMass, VarManager::kPt, VarManager::kCosThetaHE, VarManager::kPhiHE}; + int varsrapHE[4] = {VarManager::kMass, VarManager::kRap, VarManager::kCosThetaHE, VarManager::kPhiHE}; + int binspT[4] = {100, 20, 20, 20}; + int binsy[4] = {100, 10, 20, 20}; + double xminpT[4] = {1., 0., -1., -3.14}; + double xmaxpT[4] = {15., 20., 1., +3.14}; + double xminy[4] = {1., 2.5, -1., -3.14}; + double xmaxy[4] = {15., 4.0, 1., +3.14}; + hm->AddHistogram(histClass, "Mass_Pt_cosThetaHE_phiHE", "", 4, varspTHE, binspT, xminpT, xmaxpT, 0, -1, kFALSE); + hm->AddHistogram(histClass, "Mass_y_cosThetaHE_phiHE", "", 4, varsrapHE, binsy, xminy, xmaxy, 0, -1, kFALSE); + } + if (subGroupStr.Contains("upsilon-polarization-cs")) { + int varspTCS[4] = {VarManager::kMass, VarManager::kPt, VarManager::kCosThetaCS, VarManager::kPhiCS}; + int varsrapCS[4] = {VarManager::kMass, VarManager::kRap, VarManager::kCosThetaCS, VarManager::kPhiCS}; + int binspT[4] = {100, 20, 20, 20}; + int binsy[4] = {100, 10, 20, 20}; + double xminpT[4] = {1., 0., -1., -3.14}; + double xmaxpT[4] = {15., 20., 1., +3.14}; + double xminy[4] = {1., 2.5, -1., -3.14}; + double xmaxy[4] = {15., 4.0, 1., +3.14}; + hm->AddHistogram(histClass, "Mass_Pt_cosThetaCS_phiCS", "", 4, varspTCS, binspT, xminpT, xmaxpT, 0, -1, kFALSE); + hm->AddHistogram(histClass, "Mass_y_cosThetaCS_phiCS", "", 4, varsrapCS, binsy, xminy, xmaxy, 0, -1, kFALSE); + } if (subGroupStr.Contains("dimuon-polarization-vp")) { int varspTVP[4] = {VarManager::kMass, VarManager::kPt, VarManager::kCosPhiVP, VarManager::kPhiVP}; int varsrapVP[4] = {VarManager::kMass, VarManager::kRap, VarManager::kCosPhiVP, VarManager::kPhiVP}; From cd90fa3481f7ec3283d257131ddc6de88316a34a Mon Sep 17 00:00:00 2001 From: Francesco Mazzaschi <43742195+fmazzasc@users.noreply.github.com> Date: Wed, 26 Feb 2025 16:01:51 +0100 Subject: [PATCH 0429/1650] [PWGLF] 3Body MC task - add primary deuteron information (#10189) Co-authored-by: Francesco Mazzaschi --- PWGLF/DataModel/Vtx3BodyTables.h | 5 +- .../TableProducer/Nuspex/threebodyKFTask.cxx | 84 +++++++++---------- 2 files changed, 41 insertions(+), 48 deletions(-) diff --git a/PWGLF/DataModel/Vtx3BodyTables.h b/PWGLF/DataModel/Vtx3BodyTables.h index 122b8136b5f..20eb659eca1 100644 --- a/PWGLF/DataModel/Vtx3BodyTables.h +++ b/PWGLF/DataModel/Vtx3BodyTables.h @@ -424,10 +424,10 @@ DECLARE_SOA_COLUMN(GenBachP, genbachp, float); //! generated momentum b DECLARE_SOA_COLUMN(GenBachPt, genbachpt, float); //! generated transverse momentum bachelor daughter particle DECLARE_SOA_COLUMN(IsTrueH3L, istrueh3l, bool); //! flag for true hypertriton candidate DECLARE_SOA_COLUMN(IsTrueAntiH3L, istrueantih3l, bool); //! flag for true anti-hypertriton candidate -DECLARE_SOA_COLUMN(PdgCode, pdgcode, int); //! MC particle mother PDG code DECLARE_SOA_COLUMN(PdgCodeDau0, pdgcodedau0, int); //! MC particle daughter 0 PDG code DECLARE_SOA_COLUMN(PdgCodeDau1, pdgcodedau1, int); //! MC particle daughter 1 PDG code DECLARE_SOA_COLUMN(PdgCodeDau2, pdgcodedau2, int); //! MC particle daughter 2 PDG code +DECLARE_SOA_COLUMN(IsBachPrimary, isbachprimary, bool); //! flag for bachelor daughter primary DECLARE_SOA_COLUMN(SurvEvSel, survevsel, int); //! flag if reco collision survived event selection DECLARE_SOA_COLUMN(IsReco, isreco, int); //! flag if candidate was reconstructed @@ -584,7 +584,8 @@ DECLARE_SOA_TABLE(McKFVtx3BodyDatas, "AOD", "MCKF3BODYDATAS", kfvtx3body::GenNegP, kfvtx3body::GenNegPt, kfvtx3body::GenBachP, kfvtx3body::GenBachPt, kfvtx3body::IsTrueH3L, kfvtx3body::IsTrueAntiH3L, - kfvtx3body::PdgCode, kfvtx3body::PdgCodeDau0, kfvtx3body::PdgCodeDau1, kfvtx3body::PdgCodeDau2, + kfvtx3body::PdgCodeDau0, kfvtx3body::PdgCodeDau1, kfvtx3body::PdgCodeDau2, + kfvtx3body::IsBachPrimary, kfvtx3body::IsReco, kfvtx3body::SurvEvSel); diff --git a/PWGLF/TableProducer/Nuspex/threebodyKFTask.cxx b/PWGLF/TableProducer/Nuspex/threebodyKFTask.cxx index 20bb51fa46e..e81eeaf354b 100644 --- a/PWGLF/TableProducer/Nuspex/threebodyKFTask.cxx +++ b/PWGLF/TableProducer/Nuspex/threebodyKFTask.cxx @@ -97,15 +97,8 @@ struct threebodyKFTask { // helper function to check if a mother track is a true H3L/Anti-H3L template - int checkH3LTruth(MCTrack3B const& trackPr, MCTrack3B const& trackPi, MCTrack3B const& trackDe, bool& isMuonReco) + int checkH3LTruth(MCTrack3B const& mcParticlePr, MCTrack3B const& mcParticlePi, MCTrack3B const& mcParticleDe, bool& isMuonReco) { - if (!trackPi.has_mcParticle() || !trackPr.has_mcParticle() || !trackDe.has_mcParticle()) { - return -1; - } - auto mcParticlePr = trackPr.template mcParticle_as(); - auto mcParticlePi = trackPi.template mcParticle_as(); - auto mcParticleDe = trackDe.template mcParticle_as(); - if (abs(mcParticlePr.pdgCode()) != 2212 || abs(mcParticleDe.pdgCode()) != 1000010020) { return -1; } @@ -126,17 +119,18 @@ struct threebodyKFTask { return -1; } // check if the pion track is a muon coming from a pi -> mu + vu decay, if yes, take the mother pi - if (std::abs(mcParticlePi.pdgCode()) == 13) { - for (const auto& motherPi : mcParticlePi.template mothers_as()) { + auto mcParticlePiTmp = mcParticlePi; + if (std::abs(mcParticlePiTmp.pdgCode()) == 13) { + for (const auto& motherPi : mcParticlePiTmp.template mothers_as()) { if (std::abs(motherPi.pdgCode()) == 211) { - mcParticlePi = motherPi; + mcParticlePiTmp = motherPi; isMuonReco = true; break; } } } // now loop over the pion mother - for (const auto& motherPi : mcParticlePi.template mothers_as()) { + for (const auto& motherPi : mcParticlePiTmp.template mothers_as()) { if (motherPi.globalIndex() == prDeMomID) { return motherPi.globalIndex(); } @@ -215,6 +209,29 @@ struct threebodyKFTask { // fill QA histograms for all reco candidates fillQAPlots(vtx3bodydata); + auto track0 = vtx3bodydata.track0_as(); + auto track1 = vtx3bodydata.track1_as(); + auto track2 = vtx3bodydata.track2_as(); + + if (!track0.has_mcParticle() || !track1.has_mcParticle() || !track2.has_mcParticle()) { + continue; + } + + auto mcTrack0 = track0.mcParticle_as(); + auto mcTrack1 = track1.mcParticle_as(); + auto mcTrack2 = track2.mcParticle_as(); + + float genPosPt = mcTrack0.pt(); + float genPosP = mcTrack0.p(); + int daughter0PDGcode = mcTrack0.pdgCode(); + float genNegPt = mcTrack1.pt(); + float genNegP = mcTrack1.p(); + int daughter1PDGcode = mcTrack1.pdgCode(); + float genBachPt = mcTrack2.pt(); + float genBachP = mcTrack2.p(); + int daughter2PDGcode = mcTrack2.pdgCode(); + bool isBachPrimary = mcTrack2.isPhysicalPrimary(); + double MClifetime = -1.; bool isTrueH3L = false; bool isTrueAntiH3L = false; @@ -224,48 +241,22 @@ struct threebodyKFTask { float genP = -1.; float genPt = -1.; std::array genDecVtx{-1.f}; - int vtx3bodyPDGcode = -1; - int daughter0PDGcode = -1; - int daughter1PDGcode = -1; - int daughter2PDGcode = -1; - double MCmassPrPi = -1.; - float genPosP = -1.; - float genPosPt = -1.; - float genNegP = -1.; - float genNegPt = -1.; - float genBachP = -1.; - float genBachPt = -1.; - - auto track0 = vtx3bodydata.track0_as(); - auto track1 = vtx3bodydata.track1_as(); - auto track2 = vtx3bodydata.track2_as(); - auto& trackPr = vtx3bodydata.track2sign() > 0 ? track0 : track1; - auto& trackPi = vtx3bodydata.track2sign() > 0 ? track1 : track0; - auto& trackDe = track2; - bool isMuonReco = false; - int motherID = checkH3LTruth(trackPr, trackPi, trackDe, isMuonReco); + auto& mcTrackPr = vtx3bodydata.sign() > 0 ? mcTrack0 : mcTrack1; + auto& mcTrackPi = vtx3bodydata.sign() > 0 ? mcTrack1 : mcTrack0; + auto& mcTrackDe = mcTrack2; + int motherID = checkH3LTruth(mcTrackPr, mcTrackPi, mcTrackDe, isMuonReco); if (motherID > 0) { - int chargeFactor = vtx3bodydata.track2sign() > 0 ? 1 : -1; auto mcTrackHyp = particlesMC.rawIteratorAt(motherID); - auto mcTrackPr = trackPr.mcParticle_as(); - auto mcTrackPi = trackPi.mcParticle_as(); - auto mcTrackDe = trackDe.mcParticle_as(); - genPosPt = chargeFactor > 0 ? mcTrackPr.pt() : mcTrackPi.pt(); - genPosP = chargeFactor > 0 ? mcTrackPr.p() : mcTrackPi.p(); - genNegPt = chargeFactor < 0 ? mcTrackPr.pt() : mcTrackPi.pt(); - genNegP = chargeFactor < 0 ? mcTrackPr.p() : mcTrackPi.p(); - genBachPt = mcTrackDe.pt(); - genBachP = mcTrackDe.p(); - genPhi = mcTrackHyp.phi(); genEta = mcTrackHyp.eta(); genPt = mcTrackHyp.pt(); + int chargeFactor = mcTrackHyp.pdgCode() > 0 ? 1 : -1; isTrueH3L = chargeFactor > 0; isTrueAntiH3L = chargeFactor < 0; MClifetime = RecoDecay::sqrtSumOfSquares(mcTrackPr.vx() - mcTrackHyp.vx(), mcTrackPr.vy() - mcTrackHyp.vy(), mcTrackPr.vz() - mcTrackHyp.vz()) * o2::constants::physics::MassHyperTriton / mcTrackHyp.p(); double MCMass = RecoDecay::m(array{array{mcTrackPr.px(), mcTrackPr.py(), mcTrackPr.pz()}, array{mcTrackPi.px(), mcTrackPi.py(), mcTrackPi.pz()}, array{mcTrackDe.px(), mcTrackDe.py(), mcTrackDe.pz()}}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged, o2::constants::physics::MassDeuteron}); - MCmassPrPi = RecoDecay::m(array{array{mcTrackPr.px(), mcTrackPr.py(), mcTrackPr.pz()}, array{mcTrackPi.px(), mcTrackPi.py(), mcTrackPi.pz()}}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged}); + float MCmassPrPi = RecoDecay::m(array{array{mcTrackPr.px(), mcTrackPr.py(), mcTrackPr.pz()}, array{mcTrackPi.px(), mcTrackPi.py(), mcTrackPi.pz()}}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged}); registry.fill(HIST("hLabelCounter"), 2.5); registry.fill(HIST("hTrueHypertritonMCPt"), mcTrackHyp.pt() * chargeFactor); registry.fill(HIST("hTrueHypertritonMCCTau"), MClifetime); @@ -322,7 +313,7 @@ struct threebodyKFTask { genRap, genPosP, genPosPt, genNegP, genNegPt, genBachP, genBachPt, isTrueH3L, isTrueAntiH3L, - vtx3bodyPDGcode, daughter0PDGcode, daughter1PDGcode, daughter2PDGcode, + daughter0PDGcode, daughter1PDGcode, daughter2PDGcode, isBachPrimary, true, // is reconstructed true); // reco event passed event selection } // end vtx3bodydatas loop @@ -480,7 +471,8 @@ struct threebodyKFTask { mcparticle.y(), genPPos, genPtPos, genPNeg, genPtNeg, genPBach, genPtBach, isTrueGenH3L, isTrueGenAntiH3L, - mcparticle.pdgCode(), posDauPdgCode, negDauPdgCode, bachDauPdgCode, + posDauPdgCode, negDauPdgCode, bachDauPdgCode, + false, // isBachPrimary false, // is reconstructed survEvSel); } // end mcparticles loop From 0b0d84cd86112f14ea0262784f56df1b8f1d9032 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Wed, 26 Feb 2025 16:59:32 +0100 Subject: [PATCH 0430/1650] [PWGLF] Modify PID selection (#10204) --- PWGLF/Tasks/Resonances/highmasslambda.cxx | 229 +++++++++++++++++----- 1 file changed, 185 insertions(+), 44 deletions(-) diff --git a/PWGLF/Tasks/Resonances/highmasslambda.cxx b/PWGLF/Tasks/Resonances/highmasslambda.cxx index 300dea34f90..8be828ee392 100644 --- a/PWGLF/Tasks/Resonances/highmasslambda.cxx +++ b/PWGLF/Tasks/Resonances/highmasslambda.cxx @@ -94,8 +94,6 @@ struct highmasslambda { Configurable cfgCutCentralityMin{"cfgCutCentralityMin", 30.0f, "Accepted minimum Centrality"}; Configurable additionalEvSel{"additionalEvSel", true, "additionalEvSel"}; // proton track cut - Configurable confMinDCAProtonV0{"confMinDCAProtonV0", -5.0, "Minimum DCA between Proton and V0"}; - Configurable confMaxDCAProtonV0{"confMaxDCAProtonV0", 5.0, "Maximum DCA between Proton and V0"}; Configurable confMinRot{"confMinRot", 5.0 * TMath::Pi() / 6.0, "Minimum of rotation"}; Configurable confMaxRot{"confMaxRot", 7.0 * TMath::Pi() / 6.0, "Maximum of rotation"}; Configurable confRapidity{"confRapidity", 0.8, "cut on Rapidity"}; @@ -110,7 +108,7 @@ struct highmasslambda { Configurable cfgCutDCAz{"cfgCutDCAz", 1.0f, "DCAz range for tracks"}; Configurable cfgITScluster{"cfgITScluster", 5, "Number of ITS cluster"}; Configurable cfgTPCcluster{"cfgTPCcluster", 70, "Number of TPC cluster"}; - Configurable PIDstrategy{"PIDstrategy", 0, "0: TOF Veto, 1: TOF Veto opti, 2: TOF, 3: TOF loose 1, 4: TOF loose 2, 5: old pt dep"}; + Configurable PIDstrategy{"PIDstrategy", 0, "0: default p dep TPC and TOF (TOF no mandatory), 1: 7 with relax TOF, 2: 7 with relax TPC and TOF, 3: TOF mandatory"}; Configurable nsigmaCutTPC{"nsigmacutTPC", 3.0, "Value of the TPC Nsigma cut"}; Configurable nsigmaCutTOF{"nsigmaCutTOF", 3.0, "TOF PID"}; Configurable nsigmaCutITS{"nsigmaCutITS", 3.0, "Value of the ITS Nsigma cut"}; @@ -176,12 +174,11 @@ struct highmasslambda { // std::vector ptLambdaBinning = {2.0, 3.0, 4.0, 5.0, 6.0}; std::vector occupancyBinning = {-0.5, 500.0, 1000.0, 1500.0, 2000.0, 3000.0, 4000.0, 5000.0, 50000.0}; - std::vector dcaV0toPVBinning = {0.0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.08, 0.1, 0.15, 0.2, 0.3, 0.5, 1.0}; + std::vector dcaV0toPVBinning = {0.0, 0.1, 0.2, 0.3, 0.5, 3.0, 100.0}; std::vector cpaV0Binning = {0.995, 0.996, 0.997, 0.998, 0.999, 0.9995, 0.9997, 0.9999, 1.005}; std::vector ptV0Binning = {0.0, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1.0, 1.5, 100.0}; std::vector dcaBetweenV0 = {0.0, 0.05, 0.1, 0.15, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1.0}; std::vector dcaBetweenProtonV0 = {-2.0, -1.0, -0.5, -0.4, -0.3, -0.2, -0.18, -0.16, -0.14, -0.12, -0.1, -0.08, -0.06, -0.05, -0.04, -0.03, -0.025, -0.02, -0.01, -0.005, -0.004, -0.003, -0.003, -0.002, -0.001, 0.0, 0.001, 0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.01, 0.012, 0.014, 0.016, 0.018, 0.02, 0.025, 0.03, 0.04, 0.05, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2, 0.3, 0.4, 0.5, 1.0, 2.0}; - AxisSpec resAxis = {1600, -30, 30, "Res"}; AxisSpec phiAxis = {500, -6.28, 6.28, "phi"}; AxisSpec centAxis = {8, 0, 80, "V0M (%)"}; @@ -202,6 +199,9 @@ struct highmasslambda { histos.add("hMomCorr", "hMomCorr", kTH2F, {{200, -10.0f, 10.0f}, {200, -10.0f, 10.0f}}); histos.add("hInvMassKs0", "hInvMassKs0", kTH1F, {{200, 0.4f, 0.6f}}); + histos.add("hInvMassKs0before", "hInvMassKs0before", kTH1F, {{200, 0.4f, 0.6f}}); + histos.add("hInvMassKs0before2", "hInvMassKs0before2", kTH1F, {{200, 0.4f, 0.6f}}); + histos.add("hInvMassKs0before3", "hInvMassKs0before3", kTH1F, {{200, 0.4f, 0.6f}}); histos.add("hV0Dca", "hV0Dca", kTH1F, {{2000, -1.0f, 1.0f}}); histos.add("hpTvsRapidity", "pT vs Rapidity", kTH2F, {{100, 0.0f, 10.0f}, {300, -1.5f, 1.5f}}); histos.add("hCentrality", "Centrality distribution", kTH1F, {{200, 0.0, 200.0}}); @@ -237,8 +237,8 @@ struct highmasslambda { histos.add("hSparseV2SAMixedEvent_V2", "hSparseV2SAMixedEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, dcaV0toPVBinning, cpaV0Binning, ptV0Binning, dcaBetweenV0, dcaBetweenProtonV0}); } if (useKshortOpti == 2) { - histos.add("hSparseV2SASameEvent_V2", "hSparseV2SASameEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, dcaBetweenProtonV0}); - histos.add("hSparseV2SAMixedEvent_V2", "hSparseV2SAMixedEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, dcaBetweenProtonV0}); + histos.add("hSparseV2SASameEvent_V2", "hSparseV2SASameEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisDCA, dcaV0toPVBinning}); + histos.add("hSparseV2SAMixedEvent_V2", "hSparseV2SAMixedEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisDCA, dcaV0toPVBinning}); } // histogram for resolution histos.add("ResFT0CTPC", "ResFT0CTPC", kTH2F, {centAxis, resAxis}); @@ -507,6 +507,149 @@ struct highmasslambda { return false; } + // TPC TOF + template + bool selectionPID7(const T& candidate) + { + if (candidate.pt() < 0.7 && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.7) { + if (candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + if (candidate.pt() < 2.5 && std::abs(candidate.tofNSigmaPr()) < nsigmaCutTOF) { + return true; + } + if (candidate.pt() >= 2.5 && candidate.pt() < 4 && candidate.tofNSigmaPr() > -2.0 && candidate.tofNSigmaPr() < nsigmaCutTOF) { + return true; + } + if (candidate.pt() >= 4 && candidate.pt() < 5 && candidate.tofNSigmaPr() > -1.5 && candidate.tofNSigmaPr() < nsigmaCutTOF) { + return true; + } + if (candidate.pt() >= 5 && candidate.tofNSigmaPr() > -1.0 && candidate.tofNSigmaPr() < nsigmaCutTOF) { + return true; + } + } + if (!candidate.hasTOF()) { + if (candidate.pt() >= 0.7 && candidate.pt() < 0.8 && candidate.tpcNSigmaPr() > -1.8 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.8 && candidate.pt() < 0.9 && candidate.tpcNSigmaPr() > -1.7 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.9 && candidate.pt() < 1.0 && candidate.tpcNSigmaPr() > -1.6 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 1.0 && candidate.pt() < 1.8 && candidate.tpcNSigmaPr() > -0.5 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 1.8 && TMath::Abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + return true; + } + } + } + return false; + } + + // TPC TOF + template + bool selectionPID8(const T& candidate) + { + if (candidate.pt() < 0.7 && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.7) { + if (candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + if (candidate.pt() < 2.5 && std::abs(candidate.tofNSigmaPr()) < nsigmaCutTOF) { + return true; + } + if (candidate.pt() >= 2.5 && candidate.tofNSigmaPr() > -2.0 && candidate.tofNSigmaPr() < nsigmaCutTOF) { + return true; + } + } + if (!candidate.hasTOF()) { + if (candidate.pt() >= 0.7 && candidate.pt() < 0.8 && candidate.tpcNSigmaPr() > -1.8 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.8 && candidate.pt() < 0.9 && candidate.tpcNSigmaPr() > -1.7 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.9 && candidate.pt() < 1.0 && candidate.tpcNSigmaPr() > -1.6 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 1.0 && candidate.pt() < 1.8 && candidate.tpcNSigmaPr() > -0.5 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 1.8 && TMath::Abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + return true; + } + } + } + return false; + } + + // TPC TOF + template + bool selectionPID9(const T& candidate) + { + if (candidate.pt() < 0.7 && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.7) { + if (candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + if (candidate.pt() < 2.5 && std::abs(candidate.tofNSigmaPr()) < nsigmaCutTOF) { + return true; + } + if (candidate.pt() >= 2.5 && candidate.tofNSigmaPr() > -2.0 && candidate.tofNSigmaPr() < nsigmaCutTOF) { + return true; + } + } + if (!candidate.hasTOF()) { + if (candidate.pt() >= 0.7 && candidate.pt() < 0.8 && candidate.tpcNSigmaPr() > -1.8 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.8 && candidate.pt() < 0.9 && candidate.tpcNSigmaPr() > -1.7 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.9 && candidate.pt() < 1.0 && candidate.tpcNSigmaPr() > -1.6 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 1.0 && candidate.pt() < 1.8 && candidate.tpcNSigmaPr() > -1.5 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 1.8 && TMath::Abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + return true; + } + } + } + return false; + } + + // TPC TOF + template + bool selectionPID10(const T& candidate) + { + if (candidate.pt() < 0.7 && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 0.7 && candidate.pt() < 1.8 && candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + return true; + } + if (candidate.pt() >= 1.8) { + if (candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + if (candidate.pt() < 2.5 && std::abs(candidate.tofNSigmaPr()) < nsigmaCutTOF) { + return true; + } + if (candidate.pt() >= 2.5 && candidate.tofNSigmaPr() > -2.0 && candidate.tofNSigmaPr() < nsigmaCutTOF) { + return true; + } + } + if (!candidate.hasTOF() && TMath::Abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + return true; + } + } + return false; + } + template bool SelectionV0(Collision const& collision, V0 const& candidate) { @@ -563,7 +706,7 @@ struct highmasslambda { if (std::abs(pt) < 0.15) { return false; } - if (tpcNClsF < 70) { + if (tpcNClsF < 50) { return false; } if (std::abs(dcaXY) < ConfDaughDCAMin) { @@ -641,26 +784,23 @@ struct highmasslambda { continue; } histos.fill(HIST("hNsigmaProtonITS"), itsResponse.nSigmaITS(track1), track1.pt()); - if (track1.p() < 1.0 && !(itsResponse.nSigmaITS(track1) > -nsigmaCutITS && itsResponse.nSigmaITS(track1) < nsigmaCutITS)) { - continue; - } - histos.fill(HIST("hNsigmaProtonTPCPre"), track1.tpcNSigmaPr(), track1.pt()); - if (PIDstrategy == 0 && !selectionPID1(track1)) { + if (track1.pt() <= 0.6 && !(itsResponse.nSigmaITS(track1) > -2.0)) { continue; } - if (PIDstrategy == 1 && !selectionPID2(track1)) { + if (track1.pt() > 0.6 && track1.pt() <= 0.8 && !(itsResponse.nSigmaITS(track1) > -1.5)) { continue; } - if (PIDstrategy == 2 && !selectionPID3(track1)) { + histos.fill(HIST("hNsigmaProtonTPCPre"), track1.tpcNSigmaPr(), track1.pt()); + if (PIDstrategy == 0 && !selectionPID7(track1)) { continue; } - if (PIDstrategy == 3 && !selectionPID4(track1)) { + if (PIDstrategy == 1 && !selectionPID8(track1)) { continue; } - if (PIDstrategy == 4 && !selectionPID5(track1)) { + if (PIDstrategy == 2 && !selectionPID9(track1)) { continue; } - if (PIDstrategy == 5 && !selectionPID6(track1)) { + if (PIDstrategy == 3 && !selectionPID10(track1)) { continue; } histos.fill(HIST("hEta"), track1.eta()); @@ -672,9 +812,16 @@ struct highmasslambda { } auto track1ID = track1.globalIndex(); for (auto v0 : V0s) { + if (firstprimarytrack == 0) { + histos.fill(HIST("hInvMassKs0before"), v0.mK0Short()); + } if (!SelectionV0(collision, v0)) { continue; } + if (firstprimarytrack == 0) { + histos.fill(HIST("hInvMassKs0before2"), v0.mK0Short()); + } + if (firstprimarytrack == 0) { histos.fill(HIST("hV0Dca"), v0.dcav0topv()); } @@ -686,6 +833,10 @@ struct highmasslambda { if (!isSelectedV0Daughter(negtrack, -1)) { continue; } + if (firstprimarytrack == 0) { + histos.fill(HIST("hInvMassKs0before3"), v0.mK0Short()); + } + if (track1ID == postrack.globalIndex()) { continue; } @@ -709,7 +860,7 @@ struct highmasslambda { auto ptV0 = v0.pt(); auto dcaV0Daughters = std::abs(v0.dcaV0daughters()); auto dcaProtonV0 = v0.dcav0topv() - track1.dcaXY(); - if (Lambdac.M() > cMinLambdaMass && Lambdac.M() <= cMaxLambdaMass && std::abs(Lambdac.Rapidity()) < confRapidity && Lambdac.Pt() > 1.0 && Lambdac.Pt() <= 6.0 && dcaProtonV0 > confMinDCAProtonV0 && dcaProtonV0 < confMaxDCAProtonV0) { + if (Lambdac.M() > cMinLambdaMass && Lambdac.M() <= cMaxLambdaMass && std::abs(Lambdac.Rapidity()) < confRapidity && Lambdac.Pt() > 1.0 && Lambdac.Pt() <= 6.0) { if (useKshortOpti == 0) { histos.fill(HIST("hSparseV2SASameEvent_V2"), Lambdac.M(), Lambdac.Pt(), std::abs(track1.dcaXY()), Proton.Pt()); } @@ -717,7 +868,7 @@ struct highmasslambda { histos.fill(HIST("hSparseV2SASameEvent_V2"), Lambdac.M(), Lambdac.Pt(), dcaV0toPV, cpaV0, ptV0, dcaV0Daughters, dcaProtonV0); } if (useKshortOpti == 2) { - histos.fill(HIST("hSparseV2SASameEvent_V2"), Lambdac.M(), Lambdac.Pt(), v2, dcaProtonV0); + histos.fill(HIST("hSparseV2SASameEvent_V2"), Lambdac.M(), Lambdac.Pt(), v2, std::abs(track1.dcaXY()), dcaV0toPV); } } if (fillRotation) { @@ -736,7 +887,7 @@ struct highmasslambda { if (useSP) { v2Rot = TMath::Cos(2.0 * phiminuspsiRot); } - if (LambdacRot.M() > cMinLambdaMass && LambdacRot.M() <= cMaxLambdaMass && std::abs(LambdacRot.Rapidity()) < confRapidity && LambdacRot.Pt() > 1.0 && LambdacRot.Pt() <= 6.0 && dcaProtonV0 > confMinDCAProtonV0 && dcaProtonV0 < confMaxDCAProtonV0) { + if (LambdacRot.M() > cMinLambdaMass && LambdacRot.M() <= cMaxLambdaMass && std::abs(LambdacRot.Rapidity()) < confRapidity && LambdacRot.Pt() > 1.0 && LambdacRot.Pt() <= 6.0) { histos.fill(HIST("hSparseV2SASameEventRotational_V2"), LambdacRot.M(), LambdacRot.Pt(), v2Rot); } } @@ -789,27 +940,23 @@ struct highmasslambda { if (!selectionTrack(track1)) { continue; } - if (track1.p() < 1.0 && !(itsResponse.nSigmaITS(track1) > -nsigmaCutITS && itsResponse.nSigmaITS(track1) < nsigmaCutITS)) { + if (track1.pt() <= 0.6 && !(itsResponse.nSigmaITS(track1) > -2.0)) { continue; } - - // PID check - if (PIDstrategy == 0 && !selectionPID1(track1)) { + if (track1.pt() > 0.6 && track1.pt() <= 0.8 && !(itsResponse.nSigmaITS(track1) > -1.5)) { continue; } - if (PIDstrategy == 1 && !selectionPID2(track1)) { - continue; - } - if (PIDstrategy == 2 && !selectionPID3(track1)) { + // PID check + if (PIDstrategy == 0 && !selectionPID7(track1)) { continue; } - if (PIDstrategy == 3 && !selectionPID4(track1)) { + if (PIDstrategy == 1 && !selectionPID8(track1)) { continue; } - if (PIDstrategy == 4 && !selectionPID5(track1)) { + if (PIDstrategy == 2 && !selectionPID9(track1)) { continue; } - if (PIDstrategy == 5 && !selectionPID6(track1)) { + if (PIDstrategy == 3 && !selectionPID10(track1)) { continue; } if (!SelectionV0(collision2, v0)) { @@ -842,7 +989,7 @@ struct highmasslambda { auto ptV0 = v0.pt(); auto dcaV0Daughters = std::abs(v0.dcaV0daughters()); auto dcaProtonV0 = v0.dcav0topv() - track1.dcaXY(); - if (Lambdac.M() > cMinLambdaMass && Lambdac.M() <= cMaxLambdaMass && std::abs(Lambdac.Rapidity()) < confRapidity && Lambdac.Pt() > 1.0 && Lambdac.Pt() <= 6.0 && dcaProtonV0 > confMinDCAProtonV0 && dcaProtonV0 < confMaxDCAProtonV0) { + if (Lambdac.M() > cMinLambdaMass && Lambdac.M() <= cMaxLambdaMass && std::abs(Lambdac.Rapidity()) < confRapidity && Lambdac.Pt() > 1.0 && Lambdac.Pt() <= 6.0) { if (useKshortOpti == 0) { histos.fill(HIST("hSparseV2SAMixedEvent_V2"), Lambdac.M(), Lambdac.Pt(), std::abs(track1.dcaXY()), Proton.Pt()); } @@ -850,7 +997,7 @@ struct highmasslambda { histos.fill(HIST("hSparseV2SAMixedEvent_V2"), Lambdac.M(), Lambdac.Pt(), dcaV0toPV, cpaV0, ptV0, dcaV0Daughters, dcaProtonV0); } if (useKshortOpti == 2) { - histos.fill(HIST("hSparseV2SAMixedEvent_V2"), Lambdac.M(), Lambdac.Pt(), v2, dcaProtonV0); + histos.fill(HIST("hSparseV2SAMixedEvent_V2"), Lambdac.M(), Lambdac.Pt(), v2, std::abs(track1.dcaXY()), dcaV0toPV); } } } @@ -918,22 +1065,16 @@ struct highmasslambda { histos.fill(HIST("hNsigmaProtonTPCPre"), track1.tpcNSigmaPr(), track1.pt()); // PID check - if (PIDstrategy == 0 && !selectionPID1(track1)) { - continue; - } - if (PIDstrategy == 1 && !selectionPID2(track1)) { - continue; - } - if (PIDstrategy == 2 && !selectionPID3(track1)) { + if (PIDstrategy == 0 && !selectionPID7(track1)) { continue; } - if (PIDstrategy == 3 && !selectionPID4(track1)) { + if (PIDstrategy == 1 && !selectionPID8(track1)) { continue; } - if (PIDstrategy == 4 && !selectionPID5(track1)) { + if (PIDstrategy == 2 && !selectionPID9(track1)) { continue; } - if (PIDstrategy == 5 && !selectionPID6(track1)) { + if (PIDstrategy == 3 && !selectionPID10(track1)) { continue; } histos.fill(HIST("hEta"), track1.eta()); From d23b4753f96d7140d6b376f09381b20d2117ad4a Mon Sep 17 00:00:00 2001 From: Joachim Carlo Kristian Bjerg Hansen <50103987+joachimckh@users.noreply.github.com> Date: Wed, 26 Feb 2025 17:03:59 +0100 Subject: [PATCH 0431/1650] [PWGJE] fix constexpr on histogram fillers in different process func (#10202) --- PWGJE/Tasks/jetSpectraEseTask.cxx | 55 ++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/PWGJE/Tasks/jetSpectraEseTask.cxx b/PWGJE/Tasks/jetSpectraEseTask.cxx index 60734e9a5b6..d708db35267 100644 --- a/PWGJE/Tasks/jetSpectraEseTask.cxx +++ b/PWGJE/Tasks/jetSpectraEseTask.cxx @@ -123,6 +123,15 @@ struct JetSpectraEseTask { float psi3; }; + struct EventPlaneFiller { + bool psi; + bool hist; + }; + + static constexpr EventPlaneFiller PsiFillerEse = {true, true}; + static constexpr EventPlaneFiller PsiFillerBkg = {true, false}; + static constexpr EventPlaneFiller PsiFillerOcc = {false, false}; + void init(o2::framework::InitContext&) { eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast(eventSelections)); @@ -267,7 +276,7 @@ struct JetSpectraEseTask { registry.fill(HIST("hEventCounter"), counter++); registry.fill(HIST("hCentralitySel"), collision.centrality()); - const auto psi{procEP(collision)}; + const auto psi{procEP(collision)}; const auto qPerc{collision.qPERCFT0C()}; if (qPerc[0] < 0) return; @@ -279,7 +288,7 @@ struct JetSpectraEseTask { auto rho = collision.rho(); std::unique_ptr rhoFit{nullptr}; if (cfgrhoPhi) - rhoFit = fitRho(collision, psi, tracks); + rhoFit = fitRho(collision, psi, tracks); registry.fill(HIST("hEventCounter"), counter++); registry.fill(HIST("hRho"), rho); @@ -319,7 +328,7 @@ struct JetSpectraEseTask { { float count{0.5}; registry.fill(HIST("hEventCounterOcc"), count++); - const auto psi{procEP(collision)}; + const auto psi{procEP(collision)}; const auto qPerc{collision.qPERCFT0C()}; auto occupancy{collision.trackOccupancyInTimeRange()}; @@ -483,30 +492,33 @@ struct JetSpectraEseTask { else return true; } - template + // template + template EventPlane procEP(EPCol const& vec) { constexpr std::array AmpCut{1e-8, 0.0}; auto computeEP = [&AmpCut](std::vector vec, auto det, float n) { return vec[2] > AmpCut[det] ? (1.0 / n) * std::atan2(vec[1], vec[0]) : 999.; }; std::map epMap; std::map ep3Map; - auto vec1{qVecNoESE(vec)}; + auto vec1{qVecNoESE(vec)}; epMap["FT0A"] = computeEP(vec1, 0, 2.0); ep3Map["FT0A"] = computeEP(vec1, 0, 3.0); - if constexpr (Fill) { + if constexpr (P.psi) { auto vec2{qVecNoESE(vec)}; epMap["FT0C"] = computeEP(vec2, 0, 2.0); ep3Map["FT0C"] = computeEP(vec2, 0, 3.0); epMap["FV0A"] = computeEP(qVecNoESE(vec), 0, 2.0); epMap["TPCpos"] = computeEP(qVecNoESE(vec), 1, 2.0); epMap["TPCneg"] = computeEP(qVecNoESE(vec), 1, 2.0); - fillEP(/*std::make_index_sequence<5>{},*/ vec, epMap); + if constexpr (P.hist) + fillEP(/*std::make_index_sequence<5>{},*/ vec, epMap); auto cosPsi = [](float psiX, float psiY) { return (static_cast(psiX) == 999. || static_cast(psiY) == 999.) ? 999. : std::cos(2.0 * (psiX - psiY)); }; std::array epCorrContainer{}; epCorrContainer[0] = cosPsi(epMap.at(cfgEPRefA), epMap.at(cfgEPRefC)); epCorrContainer[1] = cosPsi(epMap.at(cfgEPRefA), epMap.at(cfgEPRefB)); epCorrContainer[2] = cosPsi(epMap.at(cfgEPRefB), epMap.at(cfgEPRefC)); - fillEPCos(/*std::make_index_sequence<3>{},*/ vec, epCorrContainer); + if constexpr (P.hist) + fillEPCos(/*std::make_index_sequence<3>{},*/ vec, epCorrContainer); } EventPlane localPlane; localPlane.psi2 = epMap.at(cfgEPRefA); @@ -596,7 +608,7 @@ struct JetSpectraEseTask { return true; } - template + template std::unique_ptr fitRho(const C& col, const EventPlane& ep, T const& tracks) { auto hPhiPt = std::unique_ptr(new TH1F("h_ptsum_sumpt_fit", "h_ptsum_sumpt fit use", TMath::CeilNint(std::sqrt(tracks.size())), 0., o2::constants::math::TwoPI)); @@ -604,7 +616,8 @@ struct JetSpectraEseTask { for (const auto& track : tracks) { if (jetderiveddatautilities::selectTrack(track, trackSelection)) { hPhiPt->Fill(track.phi(), track.pt()); - registry.fill(HIST("hPhiPtsum"), track.phi(), track.pt()); + if constexpr (fillHist) + registry.fill(HIST("hPhiPtsum"), track.phi(), track.pt()); } } auto modulationFit = std::unique_ptr(new TF1("fit_rholoc", "[0] * (1. + 2. * ([1] * cos(2. * (x - [2])) + [3] * cos(3. * (x - [4]))))", 0, o2::constants::math::TwoPI)); @@ -623,11 +636,13 @@ struct JetSpectraEseTask { fitParams[i] = modulationFit->GetParameter(i); } - registry.fill(HIST("hfitPar0"), col.centrality(), fitParams[0]); - registry.fill(HIST("hfitPar1"), col.centrality(), fitParams[1]); - registry.fill(HIST("hfitPar2"), col.centrality(), fitParams[2]); - registry.fill(HIST("hfitPar3"), col.centrality(), fitParams[3]); - registry.fill(HIST("hfitPar4"), col.centrality(), fitParams[4]); + if constexpr (fillHist) { + registry.fill(HIST("hfitPar0"), col.centrality(), fitParams[0]); + registry.fill(HIST("hfitPar1"), col.centrality(), fitParams[1]); + registry.fill(HIST("hfitPar2"), col.centrality(), fitParams[2]); + registry.fill(HIST("hfitPar3"), col.centrality(), fitParams[3]); + registry.fill(HIST("hfitPar4"), col.centrality(), fitParams[4]); + } double chi2{0.}; for (int i{0}; i < hPhiPt->GetXaxis()->GetNbins(); i++) { @@ -644,8 +659,10 @@ struct JetSpectraEseTask { auto cDF = 1. - TMath::Gamma(nDF, chi2); - registry.fill(HIST("hPValueCentCDF"), col.centrality(), cDF); - registry.fill(HIST("hCentChi2Ndf"), col.centrality(), chi2 / (static_cast(nDF))); + if constexpr (fillHist) { + registry.fill(HIST("hPValueCentCDF"), col.centrality(), cDF); + registry.fill(HIST("hCentChi2Ndf"), col.centrality(), chi2 / (static_cast(nDF))); + } return modulationFit; } @@ -669,7 +686,7 @@ struct JetSpectraEseTask { if (cfgEvSelOccupancy && !isOccupancyWithin(collision)) return; - const auto psi{procEP(collision)}; + const auto psi{procEP(collision)}; auto qPerc{collision.qPERCFT0C()}; if (qPerc[0] < 0) return; @@ -729,7 +746,7 @@ struct JetSpectraEseTask { auto rho = collision.rho(); std::unique_ptr rhoFit{nullptr}; if (cfgrhoPhi) { - rhoFit = fitRho(collision, psi, tracks); + rhoFit = fitRho(collision, psi, tracks); rho = evalRho(rhoFit.get(), randomConePhi, rho); } float dPhi{RecoDecay::constrainAngle(randomConePhi - psi.psi2, -o2::constants::math::PI)}; From 83166baa3945da544a47cdf885201411fcefb58b Mon Sep 17 00:00:00 2001 From: Hadi Hassan Date: Wed, 26 Feb 2025 20:40:47 +0200 Subject: [PATCH 0432/1650] [PWGJE] Fixing a bug in the hf determination using distance method (#10212) --- PWGJE/TableProducer/heavyFlavourDefinition.cxx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/PWGJE/TableProducer/heavyFlavourDefinition.cxx b/PWGJE/TableProducer/heavyFlavourDefinition.cxx index 091013d7848..f28368b10dc 100644 --- a/PWGJE/TableProducer/heavyFlavourDefinition.cxx +++ b/PWGJE/TableProducer/heavyFlavourDefinition.cxx @@ -92,15 +92,14 @@ struct HeavyFlavourDefinitionTask { } PROCESS_SWITCH(HeavyFlavourDefinitionTask, processMCPByConstituents, "Fill definition of flavour for mcp jets using constituents", false); - void processMCPByDistance(soa::Join const& /*mcCollisions*/, JetTableMCP const& mcpjets, aod::JetParticles const& particles) + void processMCPByDistance(aod::JetMcCollision const& /*mcCollision*/, JetTableMCP const& mcpjets, aod::JetParticles const& particles) { for (auto const& mcpjet : mcpjets) { - auto const particlesPerMcColl = particles.sliceBy(particlesPerMcCollision, mcpjet.globalIndex()); int8_t origin = -1; if (searchUpToQuark) { - origin = jettaggingutilities::getJetFlavor(mcpjet, particlesPerMcColl); + origin = jettaggingutilities::getJetFlavor(mcpjet, particles); } else { - origin = jettaggingutilities::getJetFlavorHadron(mcpjet, particlesPerMcColl); + origin = jettaggingutilities::getJetFlavorHadron(mcpjet, particles); } flavourTableMCP(origin); } From 155542778c5a16cb2d641d1ceb7f61bcdad67c5f Mon Sep 17 00:00:00 2001 From: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> Date: Wed, 26 Feb 2025 19:45:28 +0100 Subject: [PATCH 0433/1650] [Common] Allows to fill Run 2 centrality tables with dummy values (#10200) --- Common/TableProducer/centralityTable.cxx | 170 ++++++++++++++--------- 1 file changed, 103 insertions(+), 67 deletions(-) diff --git a/Common/TableProducer/centralityTable.cxx b/Common/TableProducer/centralityTable.cxx index edf4c9ff9ff..2d7fc92f1f9 100644 --- a/Common/TableProducer/centralityTable.cxx +++ b/Common/TableProducer/centralityTable.cxx @@ -8,9 +8,17 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. - -/// \file centrality.cxx +// +/// \file centralityTable.cxx /// \brief Task to produce the centrality tables associated to each of the required centrality estimators +/// +/// \author ALICE +// + +#include +#include +#include +#include #include #include @@ -47,8 +55,8 @@ static constexpr int kCentFDDMs = 11; static constexpr int kCentNTPVs = 12; static constexpr int kCentNGlobals = 13; static constexpr int kCentMFTs = 14; -static constexpr int nTables = 15; -static constexpr int nParameters = 1; +static constexpr int NTables = 15; +static constexpr int NParameters = 1; static const std::vector tableNames{"CentRun2V0Ms", "CentRun2V0As", "CentRun2SPDTrks", @@ -65,7 +73,7 @@ static const std::vector tableNames{"CentRun2V0Ms", "CentNGlobals", "CentMFTs"}; static const std::vector parameterNames{"Enable"}; -static const int defaultParameters[nTables][nParameters]{{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}}; +static const int defaultParameters[NTables][NParameters]{{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}}; struct CentralityTable { Produces centRun2V0M; @@ -85,12 +93,12 @@ struct CentralityTable { Produces centMFTs; Service ccdb; Configurable> enabledTables{"enabledTables", - {defaultParameters[0], nTables, nParameters, tableNames, parameterNames}, + {defaultParameters[0], NTables, NParameters, tableNames, parameterNames}, "Produce tables depending on needs. Values different than -1 override the automatic setup: the corresponding table can be set off (0) or on (1)"}; struct : ConfigurableGroup { - Configurable ccdburl{"ccdburl", "http://alice-ccdb.cern.ch", "The CCDB endpoint url address"}; - Configurable ccdbPath{"ccdbpath", "Centrality/Estimators", "The CCDB path for centrality/multiplicity information"}; - Configurable genName{"genname", "", "Genearator name: HIJING, PYTHIA8, ... Default: \"\""}; + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "The CCDB endpoint url address"}; + Configurable ccdbPath{"ccdbPath", "Centrality/Estimators", "The CCDB path for centrality/multiplicity information"}; + Configurable genName{"genName", "", "Genearator name: HIJING, PYTHIA8, ... Default: \"\""}; Configurable doNotCrashOnNull{"doNotCrashOnNull", false, {"Option to not crash on null and instead fill required tables with dummy info"}}; Configurable reconstructionPass{"reconstructionPass", "", {"Apass to use when fetching the calibration tables. Empty (default) does not check for any pass. Use `metadata` to fetch it from the AO2D metadata. Otherwise it will override the metadata."}}; } ccdbConfig; @@ -100,7 +108,7 @@ struct CentralityTable { ConfigurableAxis binsPercentile{"binsPercentile", {VARIABLE_WIDTH, 0, 0.001, 0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.009, 0.01, 0.011, 0.012, 0.013, 0.014, 0.015, 0.016, 0.017, 0.018, 0.019, 0.02, 0.021, 0.022, 0.023, 0.024, 0.025, 0.026, 0.027, 0.028, 0.029, 0.03, 0.031, 0.032, 0.033, 0.034, 0.035, 0.036, 0.037, 0.038, 0.039, 0.04, 0.041, 0.042, 0.043, 0.044, 0.045, 0.046, 0.047, 0.048, 0.049, 0.05, 0.051, 0.052, 0.053, 0.054, 0.055, 0.056, 0.057, 0.058, 0.059, 0.06, 0.061, 0.062, 0.063, 0.064, 0.065, 0.066, 0.067, 0.068, 0.069, 0.07, 0.071, 0.072, 0.073, 0.074, 0.075, 0.076, 0.077, 0.078, 0.079, 0.08, 0.081, 0.082, 0.083, 0.084, 0.085, 0.086, 0.087, 0.088, 0.089, 0.09, 0.091, 0.092, 0.093, 0.094, 0.095, 0.096, 0.097, 0.098, 0.099, 0.1, 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.2, 0.21, 0.22, 0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.3, 0.31, 0.32, 0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.4, 0.41, 0.42, 0.43, 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.5, 0.51, 0.52, 0.53, 0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.6, 0.61, 0.62, 0.63, 0.64, 0.65, 0.66, 0.67, 0.68, 0.69, 0.7, 0.71, 0.72, 0.73, 0.74, 0.75, 0.76, 0.77, 0.78, 0.79, 0.8, 0.81, 0.82, 0.83, 0.84, 0.85, 0.86, 0.87, 0.88, 0.89, 0.9, 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5.0, 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 6.0, 6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 6.7, 6.8, 6.9, 7.0, 7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 7.7, 7.8, 7.9, 8.0, 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9, 9.0, 9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7, 9.8, 9.9, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0, 26.0, 27.0, 28.0, 29.0, 30.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 41.0, 42.0, 43.0, 44.0, 45.0, 46.0, 47.0, 48.0, 49.0, 50.0, 51.0, 52.0, 53.0, 54.0, 55.0, 56.0, 57.0, 58.0, 59.0, 60.0, 61.0, 62.0, 63.0, 64.0, 65.0, 66.0, 67.0, 68.0, 69.0, 70.0, 71.0, 72.0, 73.0, 74.0, 75.0, 76.0, 77.0, 78.0, 79.0, 80.0, 81.0, 82.0, 83.0, 84.0, 85.0, 86.0, 87.0, 88.0, 89.0, 90.0, 91.0, 92.0, 93.0, 94.0, 95.0, 96.0, 97.0, 98.0, 99.0, 100.0}, "Binning of the percentile axis"}; int mRunNumber; - struct tagRun2V0MCalibration { + struct TagRun2V0MCalibration { bool mCalibrationStored = false; TFormula* mMCScale = nullptr; float mMCScalePars[6] = {0.0}; @@ -108,39 +116,39 @@ struct CentralityTable { TH1* mhVtxAmpCorrV0C = nullptr; TH1* mhMultSelCalib = nullptr; } Run2V0MInfo; - struct tagRun2V0ACalibration { + struct TagRun2V0ACalibration { bool mCalibrationStored = false; TH1* mhVtxAmpCorrV0A = nullptr; TH1* mhMultSelCalib = nullptr; } Run2V0AInfo; - struct tagRun2SPDTrackletsCalibration { + struct TagRun2SPDTrackletsCalibration { bool mCalibrationStored = false; TH1* mhVtxAmpCorr = nullptr; TH1* mhMultSelCalib = nullptr; } Run2SPDTksInfo; - struct tagRun2SPDClustersCalibration { + struct TagRun2SPDClustersCalibration { bool mCalibrationStored = false; TH1* mhVtxAmpCorrCL0 = nullptr; TH1* mhVtxAmpCorrCL1 = nullptr; TH1* mhMultSelCalib = nullptr; } Run2SPDClsInfo; - struct tagRun2CL0Calibration { + struct TagRun2CL0Calibration { bool mCalibrationStored = false; TH1* mhVtxAmpCorr = nullptr; TH1* mhMultSelCalib = nullptr; } Run2CL0Info; - struct tagRun2CL1Calibration { + struct TagRun2CL1Calibration { bool mCalibrationStored = false; TH1* mhVtxAmpCorr = nullptr; TH1* mhMultSelCalib = nullptr; } Run2CL1Info; - struct calibrationInfo { + struct CalibrationInfo { std::string name = ""; bool mCalibrationStored = false; TH1* mhMultSelCalib = nullptr; float mMCScalePars[6] = {0.0}; TFormula* mMCScale = nullptr; - explicit calibrationInfo(std::string name) + explicit CalibrationInfo(std::string name) : name(name), mCalibrationStored(false), mhMultSelCalib(nullptr), @@ -165,17 +173,17 @@ struct CentralityTable { return true; } }; - calibrationInfo FV0AInfo = calibrationInfo("FV0"); - calibrationInfo FT0MInfo = calibrationInfo("FT0"); - calibrationInfo FT0AInfo = calibrationInfo("FT0A"); - calibrationInfo FT0CInfo = calibrationInfo("FT0C"); - calibrationInfo FT0CVariant1Info = calibrationInfo("FT0Cvar1"); - calibrationInfo FDDMInfo = calibrationInfo("FDD"); - calibrationInfo NTPVInfo = calibrationInfo("NTracksPV"); - calibrationInfo NGlobalInfo = calibrationInfo("NGlobal"); - calibrationInfo MFTInfo = calibrationInfo("MFT"); + CalibrationInfo fv0aInfo = CalibrationInfo("FV0"); + CalibrationInfo ft0mInfo = CalibrationInfo("FT0"); + CalibrationInfo ft0aInfo = CalibrationInfo("FT0A"); + CalibrationInfo ft0cInfo = CalibrationInfo("FT0C"); + CalibrationInfo ft0cVariant1Info = CalibrationInfo("FT0Cvar1"); + CalibrationInfo fddmInfo = CalibrationInfo("FDD"); + CalibrationInfo ntpvInfo = CalibrationInfo("NTracksPV"); + CalibrationInfo nGlobalInfo = CalibrationInfo("NGlobal"); + CalibrationInfo mftInfo = CalibrationInfo("MFT"); std::vector mEnabledTables; // Vector of enabled tables - std::array isTableEnabled; + std::array isTableEnabled; // Debug output HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -195,7 +203,7 @@ struct CentralityTable { } /* Checking the tables which are requested in the workflow and enabling them */ - for (int i = 0; i < nTables; i++) { + for (int i = 0; i < NTables; i++) { int f = enabledTables->get(tableNames[i].c_str(), "Enable"); enableFlagIfTableRequired(context, tableNames[i], f); if (f == 1) { @@ -225,7 +233,7 @@ struct CentralityTable { doprocessRun3.value = false; } - ccdb->setURL(ccdbConfig.ccdburl); + ccdb->setURL(ccdbConfig.ccdbUrl); ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); ccdb->setFatalWhenNull(false); @@ -306,12 +314,20 @@ struct CentralityTable { Run2V0MInfo.mMCScalePars[ixpar] = Run2V0MInfo.mMCScale->GetParameter(ixpar); } } else { - LOGF(fatal, "MC Scale information from V0M for run %d not available", bc.runNumber()); + if (!ccdbConfig.doNotCrashOnNull) { // default behaviour: crash + LOGF(fatal, "MC Scale information from V0M for run %d not available", bc.runNumber()); + } else { // only if asked: continue filling with non-valid values (105) + LOGF(info, "MC Scale information from V0M for run %d not available", bc.runNumber()); + } } } Run2V0MInfo.mCalibrationStored = true; } else { - LOGF(fatal, "Calibration information from V0M for run %d corrupted", bc.runNumber()); + if (!ccdbConfig.doNotCrashOnNull) { // default behaviour: crash + LOGF(fatal, "Calibration information from V0M for run %d corrupted", bc.runNumber()); + } else { // only if asked: continue filling with non-valid values (105) + LOGF(info, "Calibration information from V0M for run %d corrupted, will fill V0M tables with dummy values", bc.runNumber()); + } } } if (isTableEnabled[kCentRun2V0As]) { @@ -321,7 +337,11 @@ struct CentralityTable { if ((Run2V0AInfo.mhVtxAmpCorrV0A != nullptr) && (Run2V0AInfo.mhMultSelCalib != nullptr)) { Run2V0AInfo.mCalibrationStored = true; } else { - LOGF(fatal, "Calibration information from V0A for run %d corrupted", bc.runNumber()); + if (!ccdbConfig.doNotCrashOnNull) { // default behaviour: crash + LOGF(fatal, "Calibration information from V0A for run %d corrupted", bc.runNumber()); + } else { // only if asked: continue filling with non-valid values (105) + LOGF(info, "Calibration information from V0A for run %d corrupted, will fill V0A tables with dummy values", bc.runNumber()); + } } } if (isTableEnabled[kCentRun2SPDTrks]) { @@ -331,7 +351,11 @@ struct CentralityTable { if ((Run2SPDTksInfo.mhVtxAmpCorr != nullptr) && (Run2SPDTksInfo.mhMultSelCalib != nullptr)) { Run2SPDTksInfo.mCalibrationStored = true; } else { - LOGF(fatal, "Calibration information from SPD tracklets for run %d corrupted", bc.runNumber()); + if (!ccdbConfig.doNotCrashOnNull) { // default behaviour: crash + LOGF(fatal, "Calibration information from SPD tracklets for run %d corrupted", bc.runNumber()); + } else { // only if asked: continue filling with non-valid values (105) + LOGF(info, "Calibration information from SPD tracklets for run %d corrupted, will fill SPD tracklets tables with dummy values", bc.runNumber()); + } } } if (isTableEnabled[kCentRun2SPDClss]) { @@ -342,7 +366,11 @@ struct CentralityTable { if ((Run2SPDClsInfo.mhVtxAmpCorrCL0 != nullptr) && (Run2SPDClsInfo.mhVtxAmpCorrCL1 != nullptr) && (Run2SPDClsInfo.mhMultSelCalib != nullptr)) { Run2SPDClsInfo.mCalibrationStored = true; } else { - LOGF(fatal, "Calibration information from SPD clusters for run %d corrupted", bc.runNumber()); + if (!ccdbConfig.doNotCrashOnNull) { // default behaviour: crash + LOGF(fatal, "Calibration information from SPD clusters for run %d corrupted", bc.runNumber()); + } else { // only if asked: continue filling with non-valid values (105) + LOGF(info, "Calibration information from SPD clusters for run %d corrupted, will fill SPD clusters tables with dummy values", bc.runNumber()); + } } } if (isTableEnabled[kCentRun2CL0s]) { @@ -352,7 +380,11 @@ struct CentralityTable { if ((Run2CL0Info.mhVtxAmpCorr != nullptr) && (Run2CL0Info.mhMultSelCalib != nullptr)) { Run2CL0Info.mCalibrationStored = true; } else { - LOGF(fatal, "Calibration information from CL0 multiplicity for run %d corrupted", bc.runNumber()); + if (!ccdbConfig.doNotCrashOnNull) { // default behaviour: crash + LOGF(fatal, "Calibration information from CL0 multiplicity for run %d corrupted", bc.runNumber()); + } else { // only if asked: continue filling with non-valid values (105) + LOGF(info, "Calibration information from CL0 multiplicity for run %d corrupted, will fill CL0 multiplicity tables with dummy values", bc.runNumber()); + } } } if (isTableEnabled[kCentRun2CL1s]) { @@ -362,7 +394,11 @@ struct CentralityTable { if ((Run2CL1Info.mhVtxAmpCorr != nullptr) && (Run2CL1Info.mhMultSelCalib != nullptr)) { Run2CL1Info.mCalibrationStored = true; } else { - LOGF(fatal, "Calibration information from CL1 multiplicity for run %d corrupted", bc.runNumber()); + if (!ccdbConfig.doNotCrashOnNull) { // default behaviour: crash + LOGF(fatal, "Calibration information from CL1 multiplicity for run %d corrupted", bc.runNumber()); + } else { // only if asked: continue filling with non-valid values (105) + LOGF(info, "Calibration information from CL1 multiplicity for run %d corrupted, will fill CL1 multiplicity tables with dummy values", bc.runNumber()); + } } } } else { @@ -375,7 +411,7 @@ struct CentralityTable { } auto scaleMC = [](float x, float pars[6]) { - return pow(((pars[0] + pars[1] * pow(x, pars[2])) - pars[3]) / pars[4], 1.0f / pars[5]); + return std::pow(((pars[0] + pars[1] * std::pow(x, pars[2])) - pars[3]) / pars[4], 1.0f / pars[5]); }; if (isTableEnabled[kCentRun2V0Ms]) { @@ -522,21 +558,21 @@ struct CentralityTable { } } - FV0AInfo.mCalibrationStored = false; - FT0MInfo.mCalibrationStored = false; - FT0AInfo.mCalibrationStored = false; - FT0CInfo.mCalibrationStored = false; - FT0CVariant1Info.mCalibrationStored = false; - FDDMInfo.mCalibrationStored = false; - NTPVInfo.mCalibrationStored = false; - NGlobalInfo.mCalibrationStored = false; - MFTInfo.mCalibrationStored = false; + fv0aInfo.mCalibrationStored = false; + ft0mInfo.mCalibrationStored = false; + ft0aInfo.mCalibrationStored = false; + ft0cInfo.mCalibrationStored = false; + ft0cVariant1Info.mCalibrationStored = false; + fddmInfo.mCalibrationStored = false; + ntpvInfo.mCalibrationStored = false; + nGlobalInfo.mCalibrationStored = false; + mftInfo.mCalibrationStored = false; if (callst != nullptr) { if (produceHistograms) { listCalib->Add(callst->Clone(Form("%i", bc.runNumber()))); } LOGF(info, "Getting new histograms with %d run number for %d run number", mRunNumber, bc.runNumber()); - auto getccdb = [callst, bc](struct calibrationInfo& estimator, const Configurable generatorName) { // TODO: to consider the name inside the estimator structure + auto getccdb = [callst, bc](struct CalibrationInfo& estimator, const Configurable generatorName) { // TODO: to consider the name inside the estimator structure estimator.mhMultSelCalib = reinterpret_cast(callst->FindObject(TString::Format("hCalibZeq%s", estimator.name.c_str()).Data())); estimator.mMCScale = reinterpret_cast(callst->FindObject(TString::Format("%s-%s", generatorName->c_str(), estimator.name.c_str()).Data())); if (estimator.mhMultSelCalib != nullptr) { @@ -561,31 +597,31 @@ struct CentralityTable { for (auto const& table : mEnabledTables) { switch (table) { case kCentFV0As: - getccdb(FV0AInfo, ccdbConfig.genName); + getccdb(fv0aInfo, ccdbConfig.genName); break; case kCentFT0Ms: - getccdb(FT0MInfo, ccdbConfig.genName); + getccdb(ft0mInfo, ccdbConfig.genName); break; case kCentFT0As: - getccdb(FT0AInfo, ccdbConfig.genName); + getccdb(ft0aInfo, ccdbConfig.genName); break; case kCentFT0Cs: - getccdb(FT0CInfo, ccdbConfig.genName); + getccdb(ft0cInfo, ccdbConfig.genName); break; case kCentFT0CVariant1s: - getccdb(FT0CVariant1Info, ccdbConfig.genName); + getccdb(ft0cVariant1Info, ccdbConfig.genName); break; case kCentFDDMs: - getccdb(FDDMInfo, ccdbConfig.genName); + getccdb(fddmInfo, ccdbConfig.genName); break; case kCentNTPVs: - getccdb(NTPVInfo, ccdbConfig.genName); + getccdb(ntpvInfo, ccdbConfig.genName); break; case kCentNGlobals: - getccdb(NGlobalInfo, ccdbConfig.genName); + getccdb(nGlobalInfo, ccdbConfig.genName); break; case kCentMFTs: - getccdb(MFTInfo, ccdbConfig.genName); + getccdb(mftInfo, ccdbConfig.genName); break; default: LOGF(fatal, "Table %d not supported in Run3", table); @@ -609,10 +645,10 @@ struct CentralityTable { * @param multiplicity The multiplicity value. */ - auto populateTable = [&](auto& table, struct calibrationInfo& estimator, float multiplicity) { + auto populateTable = [&](auto& table, struct CalibrationInfo& estimator, float multiplicity) { const bool assignOutOfRange = embedINELgtZEROselection && !collision.isInelGt0(); auto scaleMC = [](float x, float pars[6]) { - return pow(((pars[0] + pars[1] * pow(x, pars[2])) - pars[3]) / pars[4], 1.0f / pars[5]); + return std::pow(((pars[0] + pars[1] * std::pow(x, pars[2])) - pars[3]) / pars[4], 1.0f / pars[5]); }; float percentile = 105.0f; @@ -635,12 +671,12 @@ struct CentralityTable { switch (table) { case kCentFV0As: if constexpr (enableCentFV0) { - populateTable(centFV0A, FV0AInfo, collision.multZeqFV0A()); + populateTable(centFV0A, fv0aInfo, collision.multZeqFV0A()); } break; case kCentFT0Ms: if constexpr (enableCentFT0) { - const float perC = populateTable(centFT0M, FT0MInfo, collision.multZeqFT0A() + collision.multZeqFT0C()); + const float perC = populateTable(centFT0M, ft0mInfo, collision.multZeqFT0A() + collision.multZeqFT0C()); if (produceHistograms.value) { histos.fill(HIST("FT0M/percentile"), perC); histos.fill(HIST("FT0M/percentilevsPV"), perC, collision.multNTracksPV()); @@ -655,7 +691,7 @@ struct CentralityTable { break; case kCentFT0As: if constexpr (enableCentFT0) { - const float perC = populateTable(centFT0A, FT0AInfo, collision.multZeqFT0A()); + const float perC = populateTable(centFT0A, ft0aInfo, collision.multZeqFT0A()); if (produceHistograms.value) { histos.fill(HIST("FT0A/percentile"), perC); histos.fill(HIST("FT0A/percentilevsPV"), perC, collision.multNTracksPV()); @@ -670,7 +706,7 @@ struct CentralityTable { break; case kCentFT0Cs: if constexpr (enableCentFT0) { - const float perC = populateTable(centFT0C, FT0CInfo, collision.multZeqFT0C()); + const float perC = populateTable(centFT0C, ft0cInfo, collision.multZeqFT0C()); if (produceHistograms.value) { histos.fill(HIST("FT0C/percentile"), perC); histos.fill(HIST("FT0C/percentilevsPV"), perC, collision.multNTracksPV()); @@ -685,27 +721,27 @@ struct CentralityTable { break; case kCentFT0CVariant1s: if constexpr (enableCentFT0) { - populateTable(centFT0CVariant1, FT0CVariant1Info, collision.multZeqFT0C()); + populateTable(centFT0CVariant1, ft0cVariant1Info, collision.multZeqFT0C()); } break; case kCentFDDMs: if constexpr (enableCentFDD) { - populateTable(centFDDM, FDDMInfo, collision.multZeqFDDA() + collision.multZeqFDDC()); + populateTable(centFDDM, fddmInfo, collision.multZeqFDDA() + collision.multZeqFDDC()); } break; case kCentNTPVs: if constexpr (enableCentNTPV) { - populateTable(centNTPV, NTPVInfo, collision.multZeqNTracksPV()); + populateTable(centNTPV, ntpvInfo, collision.multZeqNTracksPV()); } break; case kCentNGlobals: if constexpr (enableCentNGlobal) { - populateTable(centNGlobals, NGlobalInfo, collision.multNTracksGlobal()); + populateTable(centNGlobals, nGlobalInfo, collision.multNTracksGlobal()); } break; case kCentMFTs: if constexpr (enableCentMFT) { - populateTable(centMFTs, MFTInfo, collision.mftNtracks()); + populateTable(centMFTs, mftInfo, collision.mftNtracks()); } break; default: From 29b0b3306a3d202b41873018d55bd38bfb5847af Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Thu, 27 Feb 2025 03:56:14 +0800 Subject: [PATCH 0434/1650] [PWGCF] fix run time error and add regular NUA option (#10199) --- PWGCF/Flow/Tasks/flowRunbyRun.cxx | 35 +++++++++++++++++++------------ PWGCF/Flow/Tasks/flowTask.cxx | 4 ++-- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowRunbyRun.cxx b/PWGCF/Flow/Tasks/flowRunbyRun.cxx index 87fbf185787..620063e1d5d 100644 --- a/PWGCF/Flow/Tasks/flowRunbyRun.cxx +++ b/PWGCF/Flow/Tasks/flowRunbyRun.cxx @@ -84,7 +84,9 @@ struct FlowRunbyRun { O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeights, bool, false, "NUA weights are filled in ref pt bins") O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeightsRefPt, bool, false, "NUA weights are filled in ref pt bins") O2_DEFINE_CONFIGURABLE(cfgEfficiency, std::string, "", "CCDB path to efficiency object") + O2_DEFINE_CONFIGURABLE(cfgAcceptance, std::string, "", "CCDB path to acceptance object") O2_DEFINE_CONFIGURABLE(cfgAcceptanceList, std::string, "", "CCDB path to acceptance lsit object") + O2_DEFINE_CONFIGURABLE(cfgAcceptanceListEnabled, bool, false, "switch of acceptance list") O2_DEFINE_CONFIGURABLE(cfgDynamicRunNumber, bool, false, "Add runNumber during runtime") O2_DEFINE_CONFIGURABLE(cfgGetInteractionRate, bool, false, "Get interaction rate from CCDB") O2_DEFINE_CONFIGURABLE(cfgUseInteractionRateCut, bool, false, "Use events with low interaction rate") @@ -286,8 +288,14 @@ struct FlowRunbyRun { { if (correctionsLoaded) return; - - if (cfgAcceptanceList.value.empty() == false) { + if (!cfgAcceptanceListEnabled && cfgAcceptance.value.empty() == false) { + mAcceptance = ccdb->getForTimeStamp(cfgAcceptance, timestamp); + if (mAcceptance) + LOGF(info, "Loaded acceptance weights from %s (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance); + else + LOGF(warning, "Could not load acceptance weights from %s (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance); + } + if (cfgAcceptanceListEnabled && cfgAcceptanceList.value.empty() == false) { mAcceptanceList = ccdb->getForTimeStamp(cfgAcceptanceList, timestamp); if (mAcceptanceList == nullptr) { LOGF(fatal, "Could not load acceptance weights list from %s", cfgAcceptanceList.value.c_str()); @@ -474,17 +482,6 @@ struct FlowRunbyRun { auto bc = collision.bc_as(); const auto cent = collision.centFT0C(); int runNumber = bc.runNumber(); - if (cfgUseAdditionalEventCut && !eventSelected(collision, tracks.size(), cent, runNumber)) - return; - if (cfgGetInteractionRate) { - initHadronicRate(bc); - double hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), mRunNumber, "ZNC hadronic") * 1.e-3; // - double seconds = bc.timestamp() * 1.e-3 - mMinSeconds; - if (cfgUseInteractionRateCut && (hadronicRate < cfgCutMinIR || hadronicRate > cfgCutMaxIR)) // cut on hadronic rate - return; - gCurrentHadronicRate->Fill(seconds, hadronicRate); - } - float lRandom = fRndm->Rndm(); if (runNumber != lastRunNumer) { lastRunNumer = runNumber; if (cfgDynamicRunNumber && std::find(runNumbers.begin(), runNumbers.end(), runNumber) == runNumbers.end()) { @@ -499,6 +496,18 @@ struct FlowRunbyRun { } } + if (cfgUseAdditionalEventCut && !eventSelected(collision, tracks.size(), cent, runNumber)) + return; + if (cfgGetInteractionRate) { + initHadronicRate(bc); + double hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), mRunNumber, "ZNC hadronic") * 1.e-3; // + double seconds = bc.timestamp() * 1.e-3 - mMinSeconds; + if (cfgUseInteractionRateCut && (hadronicRate < cfgCutMinIR || hadronicRate > cfgCutMaxIR)) // cut on hadronic rate + return; + gCurrentHadronicRate->Fill(seconds, hadronicRate); + } + float lRandom = fRndm->Rndm(); + th1sList[runNumber][hVtxZ]->Fill(collision.posZ()); th1sList[runNumber][hMult]->Fill(tracks.size()); th1sList[runNumber][hCent]->Fill(collision.centFT0C()); diff --git a/PWGCF/Flow/Tasks/flowTask.cxx b/PWGCF/Flow/Tasks/flowTask.cxx index 63f2d0037e6..2c3c094cdac 100644 --- a/PWGCF/Flow/Tasks/flowTask.cxx +++ b/PWGCF/Flow/Tasks/flowTask.cxx @@ -446,9 +446,9 @@ struct FlowTask { { double dnx, val; dnx = fGFW->Calculate(corrconf, 0, kTRUE).real(); - if (dnx == 0) - return; if (!corrconf.pTDif) { + if (dnx == 0) + return; val = fGFW->Calculate(corrconf, 0, kFALSE).real() / dnx; if (std::fabs(val) < 1) fFC->FillProfile(corrconf.Head.c_str(), cent, val, dnx, rndm); From b33cdd2a4645b16f92066b6077db8a9d40baab13 Mon Sep 17 00:00:00 2001 From: Stefano Cannito <143754257+scannito@users.noreply.github.com> Date: Wed, 26 Feb 2025 22:59:10 +0100 Subject: [PATCH 0435/1650] [PWGLF] Fixed std::move bug (#10215) --- .../Tasks/Strangeness/phik0shortanalysis.cxx | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx index 9279d486718..7eae15e2134 100644 --- a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx @@ -146,7 +146,8 @@ struct Phik0shortanalysis { Configurable> binspTPi{"binspTPi", {0.3, 0.4, 0.5, 0.6, 0.8, 1.0, 1.2, 1.5, 2.0, 3.0}, "pT bin limits for pions"}; // Configurables for delta y selection - Configurable nBinsy{"nBinsy", 80, "Number of bins in y and deltay axis"}; + Configurable nBinsY{"nBinsY", 80, "Number of bins in y axis"}; + Configurable nBinsDeltaY{"nBinsDeltaY", 24, "Number of bins in deltay axis"}; Configurable cfgYAcceptance{"cfgYAcceptance", 0.5f, "Rapidity acceptance"}; Configurable cfgFCutOnDeltaY{"cfgFCutOnDeltaY", 0.5f, "First upper bound on Deltay selection"}; Configurable cfgSCutOnDeltaY{"cfgSCutOnDeltaY", 0.1f, "Second upper bound on Deltay selection"}; @@ -225,8 +226,8 @@ struct Phik0shortanalysis { AxisSpec massPhiAxis = {200, 0.9f, 1.2f, "#it{M}_{inv} [GeV/#it{c}^{2}]"}; AxisSpec sigmassPhiAxis = {nBinsMPhi, lowMPhi, upMPhi, "#it{M}_{inv} [GeV/#it{c}^{2}]"}; AxisSpec vertexZAxis = {100, -15.f, 15.f, "vrtx_{Z} [cm]"}; - AxisSpec yAxis = {nBinsy, -cfgYAcceptanceSmear, cfgYAcceptanceSmear, "#it{y}"}; - AxisSpec deltayAxis = {nBinsy, 0.0f, 1.6f, "|#it{#Deltay}|"}; + AxisSpec yAxis = {nBinsY, -cfgYAcceptanceSmear, cfgYAcceptanceSmear, "#it{y}"}; + AxisSpec deltayAxis = {nBinsDeltaY, -1.2f, 1.2f, "#Delta#it{y}"}; AxisSpec multAxis = {120, 0.0f, 120.0f, "centFT0M"}; AxisSpec binnedmultAxis{(std::vector)binsMult, "centFT0M"}; AxisSpec binnedpTPhiAxis{(std::vector)binspTPhi, "#it{p}_{T} (GeV/#it{c})"}; @@ -1047,9 +1048,6 @@ struct Phik0shortanalysis { if (fillMethodSingleWeight) phiPurity = getPhiPurity(multiplicity, recPhi); - if (fillMethodMultipleWeights) - listrecPhi.push_back(std::move(recPhi)); - counts.at(0)++; weights.at(0) *= (1 - phiPurity); if (std::abs(v0.yK0Short() - recPhi.Rapidity()) > cfgFCutOnDeltaY) @@ -1060,6 +1058,9 @@ struct Phik0shortanalysis { continue; counts.at(2)++; weights.at(2) *= (1 - phiPurity); + + if (fillMethodMultipleWeights) + listrecPhi.push_back(std::move(recPhi)); } } @@ -1136,9 +1137,6 @@ struct Phik0shortanalysis { if (fillMethodSingleWeight) phiPurity = getPhiPurity(multiplicity, recPhi); - if (fillMethodMultipleWeights) - listrecPhi.push_back(std::move(recPhi)); - counts.at(0)++; weights.at(0) *= (1 - phiPurity); if (std::abs(track.rapidity(massPi) - recPhi.Rapidity()) > cfgFCutOnDeltaY) @@ -1149,6 +1147,9 @@ struct Phik0shortanalysis { continue; counts.at(2)++; weights.at(2) *= (1 - phiPurity); + + if (fillMethodMultipleWeights) + listrecPhi.push_back(std::move(recPhi)); } } @@ -1754,9 +1755,6 @@ struct Phik0shortanalysis { if (fillMethodSingleWeight) phiPurity = getPhiPurity(genmultiplicity, recPhi); - if (fillMethodMultipleWeights) - listrecPhi.push_back(std::move(recPhi)); - counts.at(0)++; weights.at(0) *= (1 - phiPurity); if (std::abs(v0.yK0Short() - recPhi.Rapidity()) > cfgFCutOnDeltaY) @@ -1767,6 +1765,9 @@ struct Phik0shortanalysis { continue; counts.at(2)++; weights.at(2) *= (1 - phiPurity); + + if (fillMethodMultipleWeights) + listrecPhi.push_back(std::move(recPhi)); } } @@ -1878,9 +1879,6 @@ struct Phik0shortanalysis { if (fillMethodSingleWeight) phiPurity = getPhiPurity(genmultiplicity, recPhi); - if (fillMethodMultipleWeights) - listrecPhi.push_back(std::move(recPhi)); - counts.at(0)++; weights.at(0) *= (1 - phiPurity); if (std::abs(track.rapidity(massPi) - recPhi.Rapidity()) > cfgFCutOnDeltaY) @@ -1891,6 +1889,9 @@ struct Phik0shortanalysis { continue; counts.at(2)++; weights.at(2) *= (1 - phiPurity); + + if (fillMethodMultipleWeights) + listrecPhi.push_back(std::move(recPhi)); } } From 57fbc1ddcdccd82952315adc98bbef2eed571129 Mon Sep 17 00:00:00 2001 From: mkor <37400009+makor@users.noreply.github.com> Date: Wed, 26 Feb 2025 23:05:12 +0100 Subject: [PATCH 0436/1650] [PWGCF,Trigger] Add p-p-rho trigger. Fix bugs in configs. (#10109) Co-authored-by: Maximilian Korwieser --- EventFiltering/PWGCF/CFFilterAll.cxx | 403 +++++++++++++++++++++++---- 1 file changed, 352 insertions(+), 51 deletions(-) diff --git a/EventFiltering/PWGCF/CFFilterAll.cxx b/EventFiltering/PWGCF/CFFilterAll.cxx index 9af70660c2a..4e326968b03 100644 --- a/EventFiltering/PWGCF/CFFilterAll.cxx +++ b/EventFiltering/PWGCF/CFFilterAll.cxx @@ -12,7 +12,7 @@ /// \file CFFilterAll.cxx /// \brief Selection of events with triplets and pairs for femtoscopic studies /// -/// \author Laura Serksnyte, TU München, laura.serksnyte@cern.ch; Anton Riedel, TU München, anton.riedel@cern.ch +/// \author Laura Serksnyte, TU München, laura.serksnyte@cern.ch; Anton Riedel, TU München, anton.riedel@cern.ch; Maximilian Korwieser, TU Munich, maximilian.korwieser@cern.ch #include #include @@ -57,6 +57,7 @@ enum CFThreeBodyTriggers { kPPP, kPLL, kLLL, kPPPhi, + kPPRho, kNThreeBodyTriggers }; enum CFTwoBodyTriggers { kPD, kLD, @@ -65,6 +66,7 @@ enum CFTwoBodyTriggers { kPD, enum ParticleSpecies { kProton, kDeuteron, + kPion, kLambda, kNParticleSpecies }; @@ -89,43 +91,49 @@ enum PIDLimits { kTPCMin, }; // For configurable tables -static const std::vector CFTriggerNamesALL{"ppp", "ppL", "pLL", "LLL", "ppPhi", "pd", "Ld"}; -static const std::vector SpeciesNameAll{"Proton", "Deuteron", "Lambda"}; -static const std::vector SpeciesName{"Proton", "Deuteron"}; -static const std::vector SpeciesNameAnti{"AntiProton", "AntiDeuteron"}; +static const std::vector CFTriggerNamesALL{"ppp", "ppL", "pLL", "LLL", "ppPhi", "ppRho", "pd", "Ld"}; +static const std::vector SpeciesNameAll{"Proton", "Deuteron", "Lambda", "Pion"}; +static const std::vector SpeciesName{"Proton", "Deuteron", "Pion"}; +static const std::vector SpeciesNameAnti{"AntiProton", "AntiDeuteron", "AntiPion"}; static const std::vector SpeciesV0DaughterName{"Pion", "Proton"}; static const std::vector SpeciesRejectionName{"Proton", "Pion", "Electron"}; static const std::vector TPCCutName{"TPC min", "TPC max"}; -static const std::vector SpeciesMinTPCClustersName{"Proton", "Deuteron"}; -static const std::vector SpeciesAvgTPCTOFName{"Proton", "AntiProton", "Deuteron", "AntiDeuteron"}; +static const std::vector SpeciesMinTPCClustersName{"Proton", "Deuteron", "Pion"}; +static const std::vector SpeciesAvgTPCTOFName{"Proton", "AntiProton", "Deuteron", "AntiDeuteron", "Pion", "AntiPion"}; static const std::vector TPCTOFAvgName{"TPC Avg", "TOF Avg"}; static const std::vector PidCutsName{"TPC min", "TPC max", "TOF min", "TOF max", "TPCTOF max", "ITS min", "ITS max"}; static const std::vector PtCutsName{"Pt min (particle)", "Pt max (particle)", "Pt min (antiparticle)", "Pt max (antiparticle)", "P thres"}; static const std::vector MomCorCutsName{"Momemtum Correlation min", "Momemtum Correlation max"}; static const std::vector PIDForTrackingName{"Switch", "Momemtum Threshold"}; -static const std::vector ThreeBodyFilterNames{"PPP", "PPL", "PLL", "LLL", "PPPhi"}; +static const std::vector ThreeBodyFilterNames{"PPP", "PPL", "PLL", "LLL", "PPPhi", "PPRho"}; static const std::vector TwoBodyFilterNames{"PD", "LD"}; -static const std::vector ParticleNames{"PPP", "aPaPaP", "PPL", "aPaPaL", "PLL", "aPaLaL", "LLL", "aLaLaL", "PPPhi", "aPaPPhi", "PD", "aPaD", "LD", "aLaD"}; +static const std::vector ParticleNames{"PPP", "aPaPaP", "PPL", "aPaPaL", "PLL", "aPaLaL", "LLL", "aLaLaL", "PPPhi", "aPaPPhi", "PPRho", "aPaPRho", "PD", "aPaD", "LD", "aLaD"}; static const int nPidRejection = 2; -static const int nTracks = 2; -static const int nPidAvg = 4; +static const int nTracks = 3; +static const int nPidAvg = 6; static const int nPidCutsDaughers = 2; static const int nPtCuts = 5; -static const int nAllTriggers = 7; -static const int nTriggerAllNames = 14; +static const int nAllTriggers = 8; +static const int nTriggerAllNames = 16; static const int nMomCorCuts = 2; +static const int nTPCTOFAvg = 2; static const float pidcutsTable[nTracks][kNPIDLimits]{ {-6.f, 6.f, -6.f, 6.f, 6.f, -99.f, 99.f}, - {-6.f, 6.f, -99.f, 99.f, 99.f, -6.f, 6.f}}; + {-6.f, 6.f, -99.f, 99.f, 99.f, -6.f, 6.f}, + {-6.f, 6.f, -99.f, 99.f, 99.f, -9999.f, 9999.f}}; static const float pidcutsTableAnti[nTracks][kNPIDLimits]{ {-6.f, 6.f, -6.f, 6.f, 6.f, -99.f, 99.f}, - {-6.f, 6.f, -99.f, 99.f, 99.f, -6.f, 6.f}}; + {-6.f, 6.f, -99.f, 99.f, 99.f, -6.f, 6.f}, + {-6.f, 6.f, -99.f, 99.f, 99.f, -9999.f, 9999.f}}; static const float pidRejectionTable[kNParticleRejection][nPidRejection]{ {-2.f, 2.f}, - {-2.f, 2.f}}; -static const double pidTPCTOFAvgTable[nPidAvg][nTracks]{ + {-2.f, 2.f}, + {-999.f, 999.f}}; +static const double pidTPCTOFAvgTable[nPidAvg][nTPCTOFAvg]{ + {0.f, 0.f}, + {0.f, 0.f}, {0.f, 0.f}, {0.f, 0.f}, {0.f, 0.f}, @@ -133,33 +141,36 @@ static const double pidTPCTOFAvgTable[nPidAvg][nTracks]{ static const float pidcutsV0DaughterTable[kNV0Daughters][nPidCutsDaughers]{ {-6.f, 6.f}, {-6.f, 6.f}}; -static const float ptcutsTable[kNParticleRejection][nPtCuts]{ +static const float ptcutsTable[kNParticleSpecies][nPtCuts]{ {0.35f, 6.f, 0.35f, 6.0f, 0.75f}, {0.35f, 1.6f, 0.35f, 1.6f, 99.f}, + {0.f, 6.f, 0.f, 6.f, 99.f}, {0.f, 6.f, 0.f, 6.f, 99.f}}; static const float NClustersMin[1][nTracks]{ - {60.0f, 60.0f}}; -static const float MomCorLimits[2][nMomCorCuts] = + {60.0f, 60.0f, 60.0f}}; +static const float MomCorLimits[3][nMomCorCuts] = {{-99, 99}, + {-99, 99}, {-99, 99}}; -static const float PIDForTrackingTable[2][nTracks]{ +static const float PIDForTrackingTable[nTracks][2]{ {-1, 0.75}, + {-1, 1.2}, {-1, 1.2}}; static const float ITSCutsTable[1][nTracks] = { - {1, 1}}; + {1, 1, 0}}; static const float triggerSwitches[1][nAllTriggers]{ - {1, 1, 1, 1, 1, 1, 1}}; + {1, 1, 1, 1, 1, 1, 1, 1}}; static const float Q3Limits[1][kNThreeBodyTriggers]{ - {0.6f, 0.6f, 0.6f, 0.6f, 0.6f}}; + {0.6f, 0.6f, 0.6f, 0.6f, 0.6f, 0.6f}}; static const float KstarLimits[1][kNTwoBodyTriggers]{ {1.2f, 1.2f}}; static const float Downsample[2][nTriggerAllNames]{ - {-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1, -1., -1.}, - {1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.}}; + {-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1, -1., -1., -1., -1.}, + {1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.}}; } // namespace CFTrigger @@ -375,7 +386,7 @@ struct CFFilter { "Particle PID Rejection selections (Deuteron candidates only)"}; Configurable> ConfPIDTPCTOFAvg{ "ConfPIDTPCTOFAvg", - {CFTrigger::pidTPCTOFAvgTable[0], CFTrigger::nPidAvg, CFTrigger::nTracks, CFTrigger::SpeciesAvgTPCTOFName, CFTrigger::TPCTOFAvgName}, + {CFTrigger::pidTPCTOFAvgTable[0], CFTrigger::nPidAvg, CFTrigger::nTPCTOFAvg, CFTrigger::SpeciesAvgTPCTOFName, CFTrigger::TPCTOFAvgName}, "Average expected nSigma of TPC and TOF, which is substracted in calculation of combined TPC and TOF nSigma"}; // Momentum selections @@ -491,6 +502,16 @@ struct CFFilter { Configurable ConfTrkKaSigmaPID{"ConfTrkKaSigmaPID", 3.50, "n_sigma kaon daughters"}; // 3.0 } PPPhi; + // config collection for ppRho // + struct : ConfigurableGroup { + std::string prefix = "PPRho"; + Configurable ConfResoRho0InvMassLowLimit{"ConfResoRho0InvMassLowLimit", 0.7, "Lower limit of the RhoReso invariant mass"}; + Configurable ConfResoRho0InvMassUpLimit{"ConfResoRho0InvMassUpLimit", 0.85, "Upper limit of the RhoReso invariant mass"}; + + Configurable ConfTrkPtRho0CandLowLimit{"ConfTrkPtRho0CandLowLimit", 1.8, "Pt_LowLimit Rho0Cand"}; + Configurable ConfTrkPtRho0CandUpLimit{"ConfTrkPtRho0CandUpLimit", 10., "Pt_UpLimit Rho0Cand"}; + } PPRho; + // Trigger selections Configurable> ConfTriggerSwitches{ "ConfTriggerSwitches", @@ -540,8 +561,8 @@ struct CFFilter { } // global histograms - registry.add("fProcessedEvents", "CF - event filtered;;Events", HistType::kTH1F, {{9, -0.5, 8.5}}); - std::vector eventTitles = {"all", "rejected", "ppp", "ppL", "pLL", "LLL", "ppPhi", "pD", "LD"}; + registry.add("fProcessedEvents", "CF - event filtered;;Events", HistType::kTH1F, {{10, -0.5, 9.5}}); + std::vector eventTitles = {"all", "rejected", "ppp", "ppL", "pLL", "LLL", "ppPhi", "ppRho", "pD", "LD"}; for (size_t iBin = 0; iBin < eventTitles.size(); iBin++) { registry.get(HIST("fProcessedEvents"))->GetXaxis()->SetBinLabel(iBin + 1, eventTitles[iBin].data()); } @@ -563,6 +584,9 @@ struct CFFilter { registry.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsDeuteron", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); registry.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsAntiDeuteron", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); + registry.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsPion", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{1000, 0.0f, 20.0f}, {1000, 0.0f, 20.0f}}}); + registry.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsAntiPion", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{1000, 0.0f, 20.0f}, {1000, 0.0f, 20.0f}}}); + // all tracks registry.add("TrackCuts/TracksBefore/fPtTrackBefore", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); registry.add("TrackCuts/TracksBefore/fEtaTrackBefore", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); @@ -603,14 +627,16 @@ struct CFFilter { registry.add("TrackCuts/TPCSignal/fTPCSignalAntiALLCUTSP", "TPCSignalALLCUTSP;p(GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); // TPC signal particles - registry.add("TrackCuts/TPCSignal/fTPCSignalProton", "fTPCSignalProton;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {20000, -100.f, 500.f}}}); - registry.add("TrackCuts/TPCSignal/fTPCSignalAntiProton", "fTPCSignalAntiProton;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {20000, -100.f, 500.f}}}); - registry.add("TrackCuts/TPCSignal/fTPCSignalDeuteron", "fTPCSignalDeuteron;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {20000, -100.f, 500.f}}}); - registry.add("TrackCuts/TPCSignal/fTPCSignalAntiDeuteron", "fTPCSignalAntiDeuteron;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {20000, -100.f, 500.f}}}); - registry.add("TrackCuts/TPCSignal/fTPCSignalPionMinusV0Daughter", "fTPCSignalPionMinusV0Daughter;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {20000, -100.f, 500.f}}}); - registry.add("TrackCuts/TPCSignal/fTPCSignalPionPlusV0Daughter", "fTPCSignalPionPlusV0Daughter;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {20000, -100.f, 500.f}}}); - registry.add("TrackCuts/TPCSignal/fTPCSignalProtonMinusV0Daughter", "fTPCSignalProtonMinusV0Daughter;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {20000, -100.f, 500.f}}}); - registry.add("TrackCuts/TPCSignal/fTPCSignalProtonPlusV0Daughter", "fTPCSignalProtonPlusV0Daughter;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {20000, -100.f, 500.f}}}); + registry.add("TrackCuts/TPCSignal/fTPCSignalProton", "fTPCSignalProton;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); + registry.add("TrackCuts/TPCSignal/fTPCSignalAntiProton", "fTPCSignalAntiProton;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); + registry.add("TrackCuts/TPCSignal/fTPCSignalDeuteron", "fTPCSignalDeuteron;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); + registry.add("TrackCuts/TPCSignal/fTPCSignalAntiDeuteron", "fTPCSignalAntiDeuteron;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); + registry.add("TrackCuts/TPCSignal/fTPCSignalPionMinusV0Daughter", "fTPCSignalPionMinusV0Daughter;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); + registry.add("TrackCuts/TPCSignal/fTPCSignalPionPlusV0Daughter", "fTPCSignalPionPlusV0Daughter;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); + registry.add("TrackCuts/TPCSignal/fTPCSignalProtonMinusV0Daughter", "fTPCSignalProtonMinusV0Daughter;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); + registry.add("TrackCuts/TPCSignal/fTPCSignalProtonPlusV0Daughter", "fTPCSignalProtonPlusV0Daughter;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); + registry.add("TrackCuts/TPCSignal/fTPCSignalPion", "fTPCSignalPion;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); + registry.add("TrackCuts/TPCSignal/fTPCSignalAntiPion", "fTPCSignalAntiPion;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); // PID vs momentum before cuts daughters registry.add("TrackCuts/NSigmaBefore/fNsigmaTPCvsPProtonV0DaughBefore", "NSigmaTPC Proton V0Daught Before;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); @@ -830,6 +856,80 @@ struct CFFilter { registry.add("TrackCuts/Phi/After/NegDaughter/fEta", "Phi Neg Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); registry.add("TrackCuts/Phi/After/NegDaughter/fPhi", "Azimuthal angle of Neg Daugh tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + // pions + registry.add("TrackCuts/Pion/fPPion", "Momentum of Pions at PV;p (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + registry.add("TrackCuts/Pion/fPTPCPion", "Momentum of Pions at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + registry.add("TrackCuts/Pion/fPtPion", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + registry.add("TrackCuts/Pion/fMomCorPionDif", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); + registry.add("TrackCuts/Pion/fMomCorPionRatio", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); + registry.add("TrackCuts/Pion/fEtaPion", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + registry.add("TrackCuts/Pion/fPhiPion", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + registry.add("TrackCuts/Pion/fNsigmaTPCvsPPion", "NSigmaTPC Pion;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + registry.add("TrackCuts/Pion/fNsigmaTOFvsPPion", "NSigmaTOF Pion;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + registry.add("TrackCuts/Pion/fNsigmaTPCTOFvsPPion", "NSigmaTPCTOF Pion;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); + + registry.add("TrackCuts/Pion/fNsigmaTPCvsPPionP", "NSigmaTPC Pion P;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + registry.add("TrackCuts/Pion/fNsigmaTOFvsPPionP", "NSigmaTOF Pion P;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + registry.add("TrackCuts/Pion/fNsigmaTPCTOFvsPPionP", "NSigmaTPCTOF Pion P;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); + + registry.add("TrackCuts/Pion/fDCAxyPion", "fDCAxy Pion;DCA_{XY};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); + registry.add("TrackCuts/Pion/fDCAzPion", "fDCAz Pion;DCA_{Z};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); + registry.add("TrackCuts/Pion/fTPCsClsPion", "fTPCsCls Pion;TPC Shared Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + registry.add("TrackCuts/Pion/fTPCcRowsPion", "fTPCcRows Pion;TPC Crossed Rows;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + registry.add("TrackCuts/Pion/fTrkTPCfClsPion", "fTrkTPCfCls Pion;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {{500, 0.0f, 3.0f}}); + registry.add("TrackCuts/Pion/fTPCnclsPion", "fTPCncls Pion;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + + // anti-pions + registry.add("TrackCuts/AntiPion/fPtAntiPion", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + registry.add("TrackCuts/AntiPion/fMomCorAntiPionDif", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); + registry.add("TrackCuts/AntiPion/fMomCorAntiPionRatio", "Momentum correlation;p_{reco} (GeV/c); |p_{TPC} - p_{reco}| (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); + registry.add("TrackCuts/AntiPion/fEtaAntiPion", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + registry.add("TrackCuts/AntiPion/fPhiAntiPion", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + registry.add("TrackCuts/AntiPion/fNsigmaTPCvsPAntiPion", "NSigmaTPC AntiPion;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + registry.add("TrackCuts/AntiPion/fNsigmaTOFvsPAntiPion", "NSigmaTOF AntiPion;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + registry.add("TrackCuts/AntiPion/fNsigmaTPCTOFvsPAntiPion", "NSigmaTPCTOF AntiPion;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); + + registry.add("TrackCuts/AntiPion/fNsigmaTPCvsPAntiPionP", "NSigmaTPC AntiPion P;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + registry.add("TrackCuts/AntiPion/fNsigmaTOFvsPAntiPionP", "NSigmaTOF AntiPion P;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + registry.add("TrackCuts/AntiPion/fNsigmaTPCTOFvsPAntiPionP", "NSigmaTPCTOF AntiPion P;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); + + registry.add("TrackCuts/AntiPion/fDCAxyAntiPion", "fDCAxy AntiPion;DCA_{XY};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); + registry.add("TrackCuts/AntiPion/fDCAzAntiPion", "fDCAz AntiPion;DCA_{Z};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); + registry.add("TrackCuts/AntiPion/fTPCsClsAntiPion", "fTPCsCls AntiPion;TPC Shared Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + registry.add("TrackCuts/AntiPion/fTPCcRowsAntiPion", "fTPCcRows AntiPion;TPC Crossed Rows;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + registry.add("TrackCuts/AntiPion/fTrkTPCfClsAntiPion", "fTrkTPCfCls AntiPion;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {{500, 0.0f, 3.0f}}); + registry.add("TrackCuts/AntiPion/fTPCnclsAntiPion", "fTPCncls AntiPion;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + + // rho QA + // daughter pos before + registry.add("TrackCuts/Rho/Before/PosDaughter/fInvMass", "Invariant mass Rho Pos Daugh;M_{#pi};Entries", HistType::kTH1F, {{500, 0, 1}}); + registry.add("TrackCuts/Rho/Before/PosDaughter/fPt", "Transverse momentum Rho Pos Daugh tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + registry.add("TrackCuts/Rho/Before/PosDaughter/fEta", "Rho Pos Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + registry.add("TrackCuts/Rho/Before/PosDaughter/fPhi", "Azimuthal angle of Rho Pos Daugh tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + // daughter neg before + registry.add("TrackCuts/Rho/Before/NegDaughter/fInvMass", "Invariant mass Rho Neg Daugh;M_{#pi};Entries", HistType::kTH1F, {{500, 0, 1}}); + registry.add("TrackCuts/Rho/Before/NegDaughter/fPt", "Transverse momentum Rho Neg Daugh tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + registry.add("TrackCuts/Rho/Before/NegDaughter/fEta", "Rho Neg Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + registry.add("TrackCuts/Rho/Before/NegDaughter/fPhi", "Azimuthal angle of Rho Neg Daugh tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + // rhoCand before + registry.add("TrackCuts/Rho/Before/fInvMass", "Invariant mass RhoCand;M_{#pi#pi};Entries", HistType::kTH1F, {{5000, 0, 5}}); + registry.add("TrackCuts/Rho/Before/fPt", "Transverse momentum RhoCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + registry.add("TrackCuts/Rho/Before/fEta", "Pseudorapidity of RhoCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + registry.add("TrackCuts/Rho/Before/fPhi", "Azimuthal angle of RhoCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + // daughter pos after + registry.add("TrackCuts/Rho/After/PosDaughter/fPt", "Transverse momentum RhoCand Pos Daugh tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + registry.add("TrackCuts/Rho/After/PosDaughter/fEta", "RhoCand Pos Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + registry.add("TrackCuts/Rho/After/PosDaughter/fPhi", "Azimuthal angle of RhoCand Pos Daugh tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + // daughter neg after + registry.add("TrackCuts/Rho/After/NegDaughter/fPt", "Transverse momentum RhoCand Neg Daugh tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + registry.add("TrackCuts/Rho/After/NegDaughter/fEta", "RhoCand Neg Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + registry.add("TrackCuts/Rho/After/NegDaughter/fPhi", "Azimuthal angle of RhoCand Neg Daugh tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + // rhoCand after + registry.add("TrackCuts/Rho/After/fInvMass", "Invariant mass RhoCand;M_{#pi#pi};Entries", HistType::kTH1F, {{5000, 0, 5}}); + registry.add("TrackCuts/Rho/After/fPt", "Transverse momentum RhoCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + registry.add("TrackCuts/Rho/After/fEta", "Pseudorapidity of RhoCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + registry.add("TrackCuts/Rho/After/fPhi", "Azimuthal angle of RhoCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + // for ppp registry.add("ppp/fMultiplicity", "Multiplicity of all processed events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); registry.add("ppp/fZvtx", "Zvtx of all processed events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); @@ -886,6 +986,17 @@ struct CFFilter { registry.add("ppphi/fAntiProtonPtVsQ3", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); registry.add("ppphi/fAntiPhiPtVsQ3", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); + // for ppRho + registry.add("ppRho/fMultiplicity", "Multiplicity of all triggered events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); + registry.add("ppRho/fZvtx", "Zvtx of all triggered events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); + registry.add("ppRho/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {{8000, 0, 8}}); + registry.add("ppRho/fSE_particle_downsample", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {{8000, 0, 8}}); + registry.add("ppRho/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {{8000, 0, 8}}); + registry.add("ppRho/fSE_antiparticle_downsample", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {{8000, 0, 8}}); + registry.add("ppRho/fProtonPtVsQ3", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {{8000, 0, 8}}); + registry.add("ppRho/fAntiProtonPtVsQ3", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {{8000, 0, 8}}); + registry.add("ppRho/fRhoCandPtVsQ3", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {{8000, 0, 8}}); + // for pd registry.add("pd/fMultiplicity", "Multiplicity of all processed events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); registry.add("pd/fZvtx", "Zvtx of all processed events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); @@ -919,6 +1030,7 @@ struct CFFilter { float mMassPhi = o2::constants::physics::MassPhi; float mMassKaonPlus = o2::constants::physics::MassKPlus; float mMassKaonMinus = o2::constants::physics::MassKMinus; + float mMassRho0 = 0.7665; // GeV/c^2 // o2::constants::physics::MassRho0; //Will not work as this is missing in the central framework, also ROOT reports the lepton production value of 0.77549 GeV/c^2, which is wrong for the hadron production at ALICE. int currentRunNumber = -999; int lastRunNumber = -999; @@ -1097,7 +1209,7 @@ struct CFFilter { template bool isSelectedTrackPID(T const& track, CFTrigger::ParticleSpecies partSpecies, bool Rejection, double nSigmaTPC[2], int charge) { - // nSigma should have entries [proton, deuteron] + // nSigma should have entries [proton, deuteron, pion] bool isSelected = false; bool pThres = true; float nSigma = -999.; @@ -1109,6 +1221,8 @@ struct CFFilter { SpeciesForTracking = o2::track::PID::Proton; } else if (partSpecies == CFTrigger::kDeuteron) { SpeciesForTracking = o2::track::PID::Deuteron; + } else if (partSpecies == CFTrigger::kPion) { + SpeciesForTracking = o2::track::PID::Pion; } else { LOG(warn) << "Unknown PID for tracking encountered"; } @@ -1161,6 +1275,18 @@ struct CFFilter { case CFTrigger::kLambda: LOG(fatal) << "No PID selection for Lambdas"; break; + case CFTrigger::kPion: + nSigmaIts = track.itsNSigmaPi(); + if (pThres) { + nSigma = nSigmaTPC[2]; + } else { + if (charge > 0) { + nSigma = std::sqrt(std::pow(nSigmaTPC[2] - TPCTOFAvg[8], 2) + std::pow(track.tofNSigmaPr() - TPCTOFAvg[9], 2)); + } else { + nSigma = std::sqrt(std::pow(nSigmaTPC[2] - TPCTOFAvg[10], 2) + std::pow(track.tofNSigmaPr() - TPCTOFAvg[11], 2)); + } + } + break; default: LOG(fatal) << "Particle species not known"; } @@ -1309,6 +1435,14 @@ struct CFFilter { return isSelected; } + double translatePhi(double phi) + { + if (phi < 0) { + phi += 2 * M_PI; // Add 2 pi to make it positive + } + return phi; + } + float getkstar(const ROOT::Math::PtEtaPhiMVector part1, const ROOT::Math::PtEtaPhiMVector part2) { @@ -1445,14 +1579,14 @@ struct CFFilter { } } - auto tracksWithItsPid = soa::Attach(tracks); + auto tracksWithItsPid = soa::Attach(tracks); registry.fill(HIST("fProcessedEvents"), 0); registry.fill(HIST("EventCuts/fMultiplicityBefore"), col.multNTracksPV()); registry.fill(HIST("EventCuts/fZvtxBefore"), col.posZ()); - bool keepEvent3N[CFTrigger::kNThreeBodyTriggers] = {false, false, false, false}; - int lowQ3Triplets[CFTrigger::kNThreeBodyTriggers] = {0, 0, 0, 0}; + bool keepEvent3N[CFTrigger::kNThreeBodyTriggers] = {false, false, false, false, false, false}; + int lowQ3Triplets[CFTrigger::kNThreeBodyTriggers] = {0, 0, 0, 0, 0, 0}; bool keepEvent2N[CFTrigger::kNTwoBodyTriggers] = {false, false}; int lowKstarPairs[CFTrigger::kNTwoBodyTriggers] = {0, 0}; @@ -1467,13 +1601,13 @@ struct CFFilter { std::vector AntiProtonIndex = {}; // Prepare vectors for different species - std::vector protons, antiprotons, deuterons, antideuterons, lambdas, antilambdas, kaons, antikaons, phi; + std::vector protons, antiprotons, deuterons, antideuterons, lambdas, antilambdas, kaons, antikaons, phi, pions, antipions, rho; // create deuteron and proton vectors (and corresponding antiparticles) for pair and triplet creation for (auto& track : tracksWithItsPid) { - double nTPCSigmaP[2]{track.tpcNSigmaPr(), track.tpcNSigmaDe()}; - double nTPCSigmaN[2]{track.tpcNSigmaPr(), track.tpcNSigmaDe()}; + double nTPCSigmaP[3]{track.tpcNSigmaPr(), track.tpcNSigmaDe(), track.tpcNSigmaPi()}; + double nTPCSigmaN[3]{track.tpcNSigmaPr(), track.tpcNSigmaDe(), track.tpcNSigmaPi()}; if (ConfUseManualPIDproton) { auto bgScalingProton = 1 / mMassProton; // momentum scaling? @@ -1704,6 +1838,64 @@ struct CFFilter { } } } + // get pions + if (isSelectedTrack(track, CFTrigger::kPion)) { + ROOT::Math::PtEtaPhiMVector temp(track.pt(), track.eta(), track.phi(), mMassPion); + if (track.sign() > 0 && isSelectedTrackPID(track, CFTrigger::kPion, false, nTPCSigmaP, 1)) { + pions.push_back(temp); + + registry.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationAfterCutsPion"), track.p(), track.tpcInnerParam()); + + registry.fill(HIST("TrackCuts/TPCSignal/fTPCSignalPion"), track.tpcInnerParam(), track.tpcSignal()); + registry.fill(HIST("TrackCuts/Pion/fPPion"), track.p()); + registry.fill(HIST("TrackCuts/Pion/fPTPCPion"), track.tpcInnerParam()); + registry.fill(HIST("TrackCuts/Pion/fPtPion"), track.pt()); + registry.fill(HIST("TrackCuts/Pion/fMomCorPionDif"), track.p(), track.tpcInnerParam() - track.p()); + registry.fill(HIST("TrackCuts/Pion/fMomCorPionRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + registry.fill(HIST("TrackCuts/Pion/fEtaPion"), track.eta()); + registry.fill(HIST("TrackCuts/Pion/fPhiPion"), track.phi()); + registry.fill(HIST("TrackCuts/Pion/fNsigmaTPCvsPPion"), track.tpcInnerParam(), nTPCSigmaP[2]); + registry.fill(HIST("TrackCuts/Pion/fNsigmaTOFvsPPion"), track.tpcInnerParam(), track.tofNSigmaPi()); + registry.fill(HIST("TrackCuts/Pion/fNsigmaTPCTOFvsPPion"), track.tpcInnerParam(), std::sqrt(std::pow(nTPCSigmaP[2] - TPCTOFAvg[8], 2) + std::pow(track.tofNSigmaPi() - TPCTOFAvg[9], 2))); + + registry.fill(HIST("TrackCuts/Pion/fNsigmaTPCvsPPionP"), track.p(), nTPCSigmaP[2]); + registry.fill(HIST("TrackCuts/Pion/fNsigmaTOFvsPPionP"), track.p(), track.tofNSigmaPi()); + registry.fill(HIST("TrackCuts/Pion/fNsigmaTPCTOFvsPPionP"), track.p(), std::sqrt(std::pow(nTPCSigmaP[2] - TPCTOFAvg[8], 2) + std::pow(track.tofNSigmaPi() - TPCTOFAvg[9], 2))); + + registry.fill(HIST("TrackCuts/Pion/fDCAxyPion"), track.dcaXY()); + registry.fill(HIST("TrackCuts/Pion/fDCAzPion"), track.dcaZ()); + registry.fill(HIST("TrackCuts/Pion/fTPCsClsPion"), track.tpcNClsShared()); + registry.fill(HIST("TrackCuts/Pion/fTPCcRowsPion"), track.tpcNClsCrossedRows()); + registry.fill(HIST("TrackCuts/Pion/fTrkTPCfClsPion"), track.tpcCrossedRowsOverFindableCls()); + registry.fill(HIST("TrackCuts/Pion/fTPCnclsPion"), track.tpcNClsFound()); + } + if (track.sign() < 0 && isSelectedTrackPID(track, CFTrigger::kPion, false, nTPCSigmaN, -1)) { + antipions.push_back(temp); + + registry.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationAfterCutsAntiPion"), track.p(), track.tpcInnerParam()); + + registry.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAntiPion"), track.tpcInnerParam(), track.tpcSignal()); + registry.fill(HIST("TrackCuts/AntiPion/fPtAntiPion"), track.pt()); + registry.fill(HIST("TrackCuts/AntiPion/fMomCorAntiPionDif"), track.p(), track.tpcInnerParam() - track.p()); + registry.fill(HIST("TrackCuts/AntiPion/fMomCorAntiPionRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + registry.fill(HIST("TrackCuts/AntiPion/fEtaAntiPion"), track.eta()); + registry.fill(HIST("TrackCuts/AntiPion/fPhiAntiPion"), track.phi()); + registry.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCvsPAntiPion"), track.tpcInnerParam(), nTPCSigmaN[2]); + registry.fill(HIST("TrackCuts/AntiPion/fNsigmaTOFvsPAntiPion"), track.tpcInnerParam(), track.tofNSigmaPi()); + registry.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCTOFvsPAntiPion"), track.tpcInnerParam(), std::sqrt(std::pow(nTPCSigmaN[2] - TPCTOFAvg[10], 2) + std::pow(track.tofNSigmaPi() - TPCTOFAvg[11], 2))); + + registry.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCvsPAntiPionP"), track.p(), nTPCSigmaN[2]); + registry.fill(HIST("TrackCuts/AntiPion/fNsigmaTOFvsPAntiPionP"), track.p(), track.tofNSigmaPi()); + registry.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCTOFvsPAntiPionP"), track.p(), std::sqrt(std::pow(nTPCSigmaN[2] - TPCTOFAvg[10], 2) + std::pow(track.tofNSigmaPi() - TPCTOFAvg[11], 2))); + + registry.fill(HIST("TrackCuts/AntiPion/fDCAxyAntiPion"), track.dcaXY()); + registry.fill(HIST("TrackCuts/AntiPion/fDCAzAntiPion"), track.dcaZ()); + registry.fill(HIST("TrackCuts/AntiPion/fTPCsClsAntiPion"), track.tpcNClsShared()); + registry.fill(HIST("TrackCuts/AntiPion/fTPCcRowsAntiPion"), track.tpcNClsCrossedRows()); + registry.fill(HIST("TrackCuts/AntiPion/fTrkTPCfClsAntiPion"), track.tpcCrossedRowsOverFindableCls()); + registry.fill(HIST("TrackCuts/AntiPion/fTPCnclsAntiPion"), track.tpcNClsFound()); + } + } } // keep track of daugher indices to avoid selfcorrelations @@ -1816,6 +2008,7 @@ struct CFFilter { } if (ConfTriggerSwitches->get("Switch", "ppPhi") > 0.) { + for (const auto& postrack : kaons) { for (const auto& negtrack : antikaons) { @@ -1824,7 +2017,7 @@ struct CFFilter { registry.fill(HIST("TrackCuts/Phi/Before/fInvMass"), temp.M()); registry.fill(HIST("TrackCuts/Phi/Before/fPt"), temp.pt()); registry.fill(HIST("TrackCuts/Phi/Before/fEta"), temp.eta()); - registry.fill(HIST("TrackCuts/Phi/Before/fPhi"), temp.phi()); + registry.fill(HIST("TrackCuts/Phi/Before/fPhi"), translatePhi(temp.phi())); if ((temp.M() >= PPPhi.ConfResoInvMassLowLimit.value) && (temp.M() <= PPPhi.ConfResoInvMassUpLimit.value)) { @@ -1833,15 +2026,59 @@ struct CFFilter { registry.fill(HIST("TrackCuts/Phi/After/fInvMass"), temp.M()); registry.fill(HIST("TrackCuts/Phi/After/fPt"), temp.pt()); registry.fill(HIST("TrackCuts/Phi/After/fEta"), temp.eta()); - registry.fill(HIST("TrackCuts/Phi/After/fPhi"), temp.phi()); + registry.fill(HIST("TrackCuts/Phi/After/fPhi"), translatePhi(temp.phi())); registry.fill(HIST("TrackCuts/Phi/After/PosDaughter/fPt"), postrack.pt()); registry.fill(HIST("TrackCuts/Phi/After/PosDaughter/fEta"), postrack.eta()); - registry.fill(HIST("TrackCuts/Phi/After/PosDaughter/fPhi"), postrack.phi()); + registry.fill(HIST("TrackCuts/Phi/After/PosDaughter/fPhi"), translatePhi(postrack.phi())); registry.fill(HIST("TrackCuts/Phi/After/NegDaughter/fPt"), negtrack.pt()); registry.fill(HIST("TrackCuts/Phi/After/NegDaughter/fEta"), negtrack.eta()); - registry.fill(HIST("TrackCuts/Phi/After/NegDaughter/fPhi"), negtrack.phi()); + registry.fill(HIST("TrackCuts/Phi/After/NegDaughter/fPhi"), translatePhi(negtrack.phi())); + } + } + } + } + + // construct rho cand + if (ConfTriggerSwitches->get("Switch", "ppRho") > 0.) { // here we could select on extra pion properties important for the Rho0Cands + + for (const auto& postrack : pions) { + for (const auto& negtrack : antipions) { + + ROOT::Math::PtEtaPhiMVector temp = postrack + negtrack; + + registry.fill(HIST("TrackCuts/Rho/Before/fInvMass"), temp.M()); + registry.fill(HIST("TrackCuts/Rho/Before/fPt"), temp.pt()); + registry.fill(HIST("TrackCuts/Rho/Before/fEta"), temp.eta()); + registry.fill(HIST("TrackCuts/Rho/Before/fPhi"), translatePhi(temp.phi())); + + registry.fill(HIST("TrackCuts/Rho/Before/PosDaughter/fInvMass"), postrack.M()); + registry.fill(HIST("TrackCuts/Rho/Before/PosDaughter/fPt"), postrack.pt()); + registry.fill(HIST("TrackCuts/Rho/Before/PosDaughter/fEta"), postrack.eta()); + registry.fill(HIST("TrackCuts/Rho/Before/PosDaughter/fPhi"), translatePhi(postrack.phi())); + + registry.fill(HIST("TrackCuts/Rho/Before/PosDaughter/fInvMass"), negtrack.M()); + registry.fill(HIST("TrackCuts/Rho/Before/NegDaughter/fPt"), negtrack.pt()); + registry.fill(HIST("TrackCuts/Rho/Before/NegDaughter/fEta"), negtrack.eta()); + registry.fill(HIST("TrackCuts/Rho/Before/NegDaughter/fPhi"), translatePhi(negtrack.phi())); + + if ((temp.M() >= PPRho.ConfResoRho0InvMassLowLimit.value) && (temp.M() <= PPRho.ConfResoRho0InvMassUpLimit.value) && (temp.pt() >= PPRho.ConfTrkPtRho0CandLowLimit.value) && (temp.pt() <= PPRho.ConfTrkPtRho0CandUpLimit.value)) { + + rho.push_back(temp); + + registry.fill(HIST("TrackCuts/Rho/After/fInvMass"), temp.M()); + registry.fill(HIST("TrackCuts/Rho/After/fPt"), temp.pt()); + registry.fill(HIST("TrackCuts/Rho/After/fEta"), temp.eta()); + registry.fill(HIST("TrackCuts/Rho/After/fPhi"), translatePhi(temp.phi())); + + registry.fill(HIST("TrackCuts/Rho/After/PosDaughter/fPt"), postrack.pt()); + registry.fill(HIST("TrackCuts/Rho/After/PosDaughter/fEta"), postrack.eta()); + registry.fill(HIST("TrackCuts/Rho/After/PosDaughter/fPhi"), translatePhi(postrack.phi())); + + registry.fill(HIST("TrackCuts/Rho/After/NegDaughter/fPt"), negtrack.pt()); + registry.fill(HIST("TrackCuts/Rho/After/NegDaughter/fEta"), negtrack.eta()); + registry.fill(HIST("TrackCuts/Rho/After/NegDaughter/fPhi"), translatePhi(negtrack.phi())); } } } @@ -2160,6 +2397,63 @@ struct CFFilter { } } } + if (ConfTriggerSwitches->get("Switch", "ppRho") > 0.) { + // ppRho trigger + for (size_t i = 0; i < protons.size(); ++i) { + for (size_t j = i + 1; j < protons.size(); ++j) { + for (const auto& rhoParticle : rho) { + const auto& Proton1 = protons[i]; + const auto& Proton2 = protons[j]; + + Q3 = getQ3(Proton1, Proton2, rhoParticle); + + registry.fill(HIST("ppRho/fSE_particle"), Q3); + registry.fill(HIST("ppRho/fProtonPtVsQ3"), Q3, Proton1.Pt()); + registry.fill(HIST("ppRho/fProtonPtVsQ3"), Q3, Proton2.Pt()); + registry.fill(HIST("ppRho/fRhoCandPtVsQ3"), Q3, rhoParticle.Pt()); + + if (Q3 < ConfQ3Limits->get(static_cast(0), CFTrigger::kPPRho)) { + if (ConfDownsample->get("Switch", "PPRho") > 0) { + if (rng->Uniform(0., 1.) < ConfDownsample->get("Factor", "PPRho")) { + registry.fill(HIST("ppRho/fSE_particle_downsample"), Q3); + lowQ3Triplets[CFTrigger::kPPRho] += 1; + } + } else { + lowQ3Triplets[CFTrigger::kPPRho] += 1; + } + } + } + } + } + // apapRho trigger + for (size_t i = 0; i < antiprotons.size(); ++i) { + for (size_t j = i + 1; j < antiprotons.size(); ++j) { + for (const auto& rhoParticle : rho) { + const auto& antiProton1 = antiprotons[i]; + const auto& antiProton2 = antiprotons[j]; + + Q3 = getQ3(antiProton1, antiProton2, rhoParticle); + + registry.fill(HIST("ppRho/fSE_antiparticle"), Q3); + registry.fill(HIST("ppRho/fAntiProtonPtVsQ3"), Q3, antiProton1.Pt()); + registry.fill(HIST("ppRho/fAntiProtonPtVsQ3"), Q3, antiProton2.Pt()); + registry.fill(HIST("ppRho/fRhoCandPtVsQ3"), Q3, rhoParticle.Pt()); + + if (Q3 < ConfQ3Limits->get(static_cast(0), CFTrigger::kPPRho)) { + if (ConfDownsample->get("Switch", "aPaPRho") > 0) { + if (rng->Uniform(0., 1.) < ConfDownsample->get("Factor", "aPaPRho")) { + registry.fill(HIST("ppRho/fSE_antiparticle_downsample"), Q3); + lowQ3Triplets[CFTrigger::kPPRho] += 1; + } + } else { + lowQ3Triplets[CFTrigger::kPPRho] += 1; + } + } + } + } + } + } + if (ConfTriggerSwitches->get("Switch", "pd") > 0.) { // pd trigger for (auto iProton = protons.begin(); iProton != protons.end(); ++iProton) { @@ -2272,17 +2566,23 @@ struct CFFilter { registry.fill(HIST("ppphi/fMultiplicity"), col.multNTracksPV()); registry.fill(HIST("ppphi/fZvtx"), col.posZ()); } + if (lowQ3Triplets[CFTrigger::kPPRho] > 0) { + keepEvent3N[CFTrigger::kPPRho] = true; + registry.fill(HIST("fProcessedEvents"), 7); + registry.fill(HIST("ppRho/fMultiplicity"), col.multNTracksPV()); + registry.fill(HIST("ppRho/fZvtx"), col.posZ()); + } // create tags for two body triggers if (lowKstarPairs[CFTrigger::kPD] > 0) { keepEvent2N[CFTrigger::kPD] = true; - registry.fill(HIST("fProcessedEvents"), 7); + registry.fill(HIST("fProcessedEvents"), 8); registry.fill(HIST("pd/fMultiplicity"), col.multNTracksPV()); registry.fill(HIST("pd/fZvtx"), col.posZ()); } if (lowKstarPairs[CFTrigger::kLD] > 0) { keepEvent2N[CFTrigger::kLD] = true; - registry.fill(HIST("fProcessedEvents"), 8); + registry.fill(HIST("fProcessedEvents"), 9); registry.fill(HIST("ld/fMultiplicity"), col.multNTracksPV()); registry.fill(HIST("ld/fZvtx"), col.posZ()); } @@ -2292,10 +2592,11 @@ struct CFFilter { keepEvent3N[CFTrigger::kPLL], keepEvent3N[CFTrigger::kLLL], keepEvent3N[CFTrigger::kPPPhi], + // keepEvent3N[CFTrigger::kPPRho], //To be changed once trigger is integrated keepEvent2N[CFTrigger::kPD], keepEvent2N[CFTrigger::kLD]); - if (!keepEvent3N[CFTrigger::kPPP] && !keepEvent3N[CFTrigger::kPPL] && !keepEvent3N[CFTrigger::kPLL] && !keepEvent3N[CFTrigger::kLLL] && !keepEvent3N[CFTrigger::kPPPhi] && + if (!keepEvent3N[CFTrigger::kPPP] && !keepEvent3N[CFTrigger::kPPL] && !keepEvent3N[CFTrigger::kPLL] && !keepEvent3N[CFTrigger::kLLL] && !keepEvent3N[CFTrigger::kPPPhi] && !keepEvent3N[CFTrigger::kPPRho] && !keepEvent2N[CFTrigger::kPD] && !keepEvent2N[CFTrigger::kLD]) { registry.fill(HIST("fProcessedEvents"), 1); } From 69df7d4bfd46d336d16e8a3b477532600f295bfc Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Wed, 26 Feb 2025 23:33:23 +0100 Subject: [PATCH 0437/1650] [PWGCF] jFlucEfficiencyTask - fix crash (#10203) --- PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx b/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx index 6a65a5d5fd0..ba46a4c227a 100644 --- a/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx +++ b/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx @@ -279,7 +279,8 @@ struct JFlucEfficiencyTask { } // Fill track histograms - for (const auto& track : tracks) { + auto groupedTracks = tracks.sliceBy(perCollision, collision.globalIndex()); + for (const auto& track : groupedTracks) { if (!track.has_cfMCParticle()) { if (debugMode) { LOGF(debug, "Track without MC particle found"); @@ -293,7 +294,7 @@ struct JFlucEfficiencyTask { if (track.sign() > 0) { registry.fill(HIST("hPtRecDataPos"), track.pt(), collision.multiplicity()); } else if (track.sign() < 0) { - registry.fill(HIST("hPtRecDatfaNeg"), track.pt(), collision.multiplicity()); + registry.fill(HIST("hPtRecDataNeg"), track.pt(), collision.multiplicity()); } } From 1a21445d102baa4000d6b009f581777989e665c2 Mon Sep 17 00:00:00 2001 From: jaimenorman Date: Wed, 26 Feb 2025 22:54:48 +0000 Subject: [PATCH 0438/1650] [PWGJE] add cross section info for derived,reduced data (#10211) --- PWGJE/DataModel/JetReducedData.h | 10 +++++++++- PWGJE/TableProducer/derivedDataProducer.cxx | 9 ++++++++- PWGJE/TableProducer/derivedDataWriter.cxx | 3 +-- PWGJE/Tasks/jetFinderQA.cxx | 16 ++++++++++++++++ 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/PWGJE/DataModel/JetReducedData.h b/PWGJE/DataModel/JetReducedData.h index fa1efd9d4dd..52b9d92fd05 100644 --- a/PWGJE/DataModel/JetReducedData.h +++ b/PWGJE/DataModel/JetReducedData.h @@ -158,6 +158,10 @@ DECLARE_SOA_COLUMN(PosY, posY, float); DECLARE_SOA_COLUMN(PosZ, posZ, float); DECLARE_SOA_COLUMN(Weight, weight, float); DECLARE_SOA_COLUMN(SubGeneratorId, subGeneratorId, int); +DECLARE_SOA_COLUMN(Accepted, accepted, uint64_t); +DECLARE_SOA_COLUMN(Attempted, attempted, uint64_t); +DECLARE_SOA_COLUMN(XsectGen, xsectGen, float); +DECLARE_SOA_COLUMN(XsectErr, xsectErr, float); } // namespace jmccollision DECLARE_SOA_TABLE_STAGED(JMcCollisions, "JMCCOLLISION", o2::soa::Index<>, @@ -165,7 +169,11 @@ DECLARE_SOA_TABLE_STAGED(JMcCollisions, "JMCCOLLISION", jmccollision::PosY, jmccollision::PosZ, jmccollision::Weight, - jmccollision::SubGeneratorId); + jmccollision::SubGeneratorId, + jmccollision::Accepted, + jmccollision::Attempted, + jmccollision::XsectGen, + jmccollision::XsectErr); using JMcCollision = JMcCollisions::iterator; using StoredJMcCollision = StoredJMcCollisions::iterator; diff --git a/PWGJE/TableProducer/derivedDataProducer.cxx b/PWGJE/TableProducer/derivedDataProducer.cxx index 3cccd60e506..01274c11a34 100644 --- a/PWGJE/TableProducer/derivedDataProducer.cxx +++ b/PWGJE/TableProducer/derivedDataProducer.cxx @@ -238,11 +238,18 @@ struct JetDerivedDataProducerTask { void processMcCollisions(aod::McCollision const& mcCollision) { - products.jMcCollisionsTable(mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), mcCollision.weight(), mcCollision.getSubGeneratorId()); + products.jMcCollisionsTable(mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), mcCollision.weight(), mcCollision.getSubGeneratorId(), 1, 1, 1.0, 1.0); products.jMcCollisionsParentIndexTable(mcCollision.globalIndex()); } PROCESS_SWITCH(JetDerivedDataProducerTask, processMcCollisions, "produces derived MC collision table", false); + void processMcCollisionsWithXsection(soa::Join::iterator const& mcCollision) + { + products.jMcCollisionsTable(mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), mcCollision.weight(), mcCollision.getSubGeneratorId(), mcCollision.accepted(), mcCollision.attempted(), mcCollision.xsectGen(), mcCollision.xsectErr()); + products.jMcCollisionsParentIndexTable(mcCollision.globalIndex()); + } + PROCESS_SWITCH(JetDerivedDataProducerTask, processMcCollisionsWithXsection, "produces derived MC collision table with cross section information", false); + void processTracks(soa::Join::iterator const& track, aod::Collisions const&) { products.jTracksTable(track.collisionId(), track.pt(), track.eta(), track.phi(), jetderiveddatautilities::setTrackSelectionBit(track, track.dcaZ(), dcaZMax)); diff --git a/PWGJE/TableProducer/derivedDataWriter.cxx b/PWGJE/TableProducer/derivedDataWriter.cxx index 0bac7812852..9100a7fbc5e 100644 --- a/PWGJE/TableProducer/derivedDataWriter.cxx +++ b/PWGJE/TableProducer/derivedDataWriter.cxx @@ -421,8 +421,7 @@ struct JetDerivedDataWriter { mcCollisionMapping.resize(mcCollisions.size(), -1); for (auto const& mcCollision : mcCollisions) { if (mcCollision.isMcCollisionSelected()) { - - products.storedJMcCollisionsTable(mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), mcCollision.weight(), mcCollision.subGeneratorId()); + products.storedJMcCollisionsTable(mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), mcCollision.weight(), mcCollision.subGeneratorId(), mcCollision.accepted(), mcCollision.attempted(), mcCollision.xsectGen(), mcCollision.xsectErr()); products.storedJMcCollisionsParentIndexTable(mcCollision.mcCollisionId()); mcCollisionMapping[mcCollision.globalIndex()] = products.storedJMcCollisionsTable.lastIndex(); } diff --git a/PWGJE/Tasks/jetFinderQA.cxx b/PWGJE/Tasks/jetFinderQA.cxx index 089c50887bd..b5b2e24e15b 100644 --- a/PWGJE/Tasks/jetFinderQA.cxx +++ b/PWGJE/Tasks/jetFinderQA.cxx @@ -327,6 +327,14 @@ struct JetFinderQATask { if (doprocessMCCollisionsWeighted) { AxisSpec weightAxis = {{VARIABLE_WIDTH, 1e-13, 1e-12, 1e-11, 1e-10, 1e-9, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1.0, 10.0}, "weights"}; registry.add("h_collision_eventweight_part", "event weight;event weight;entries", {HistType::kTH1F, {weightAxis}}); + registry.add("h_accepted", "No. of Generated Events;No. of Generated Events;entries", {HistType::kTH1F, {{5000, 0., 5000.}}}); + registry.add("h_attempted", "No. of Attempted Events;No. of Attempted Events;entries", {HistType::kTH1F, {{5000, 0., 5000.}}}); + registry.add("h_xsecGen", "Cross section in pb; Cross section in pb; entries", {HistType::kTH1F, {{200000, 0., 2e11}}}); + registry.add("h_xsecErr", "Error associated with the cross section", {HistType::kTH1F, {{200000, 0., 2e11}}}); + registry.add("h_xsecGenSum", "Summed Cross section per collision in pb; Summed Cross section per collision in pb; entries", {HistType::kTH1F, {{1, 0., 1.}}}); + registry.add("h_xsecGenSumWeighted", "Summed Cross section per collision in pb with weights; Summed Cross section per collision in pb with weights; entries", {HistType::kTH1F, {{1, 0., 1.}}}); + registry.add("h_xsecErrSum", "Summed Cross section error per collision in pb; Summed Cross section error per collision in pb; entries", {HistType::kTH1F, {{1, 0., 1.}}}); + registry.add("h_xsecErrSumWeighted", "Summed Cross section error per collision in pb with weights; Summed Cross section error per collision in pb with weights; entries", {HistType::kTH1F, {{1, 0., 1.}}}); } AxisSpec occupancyAxis = {142, -1.5, 14000.5, "occupancy"}; @@ -949,6 +957,14 @@ struct JetFinderQATask { return; } registry.fill(HIST("h_collision_eventweight_part"), collision.weight()); + registry.fill(HIST("h_accepted"), collision.accepted()); + registry.fill(HIST("h_attempted"), collision.attempted()); + registry.fill(HIST("h_xsecGen"), collision.xsectGen()); + registry.fill(HIST("h_xsecErr"), collision.xsectErr()); + registry.fill(HIST("h_xsecGenSum"), 0.5, collision.xsectGen()); + registry.fill(HIST("h_xsecGenSumWeighted"), 0.5, collision.xsectGen() * collision.weight()); + registry.fill(HIST("h_xsecErrSum"), 0.5, collision.xsectErr()); + registry.fill(HIST("h_xsecErrSumWeighted"), 0.5, collision.xsectErr() * collision.weight()); } PROCESS_SWITCH(JetFinderQATask, processMCCollisionsWeighted, "collision QA for weighted events", false); From a5355c0c4039e6c39135f854511d6bc13057a816 Mon Sep 17 00:00:00 2001 From: Giovanni Malfattore <89481844+giovannimalfattore@users.noreply.github.com> Date: Thu, 27 Feb 2025 00:28:05 +0100 Subject: [PATCH 0439/1650] [PWGLF] NucleiTask - Fix ITS PID related MC bug (#10210) --- PWGLF/Tasks/Nuspex/LFNucleiBATask.cxx | 79 ++++++++++++++++----------- 1 file changed, 47 insertions(+), 32 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/LFNucleiBATask.cxx b/PWGLF/Tasks/Nuspex/LFNucleiBATask.cxx index 3ead8169490..3e235378b5d 100644 --- a/PWGLF/Tasks/Nuspex/LFNucleiBATask.cxx +++ b/PWGLF/Tasks/Nuspex/LFNucleiBATask.cxx @@ -16,13 +16,13 @@ /// /// \author Giovanni Malfattore and Rutuparna Rath /// + +#include "PWGLF/DataModel/LFNucleiTables.h" + #include "EventFiltering/Zorro.h" #include "EventFiltering/ZorroSummary.h" - #include "CCDB/BasicCCDBManager.h" #include - -#include "PWGLF/DataModel/LFNucleiTables.h" #include #include #include "ReconstructionDataFormats/Track.h" @@ -145,8 +145,11 @@ struct LFNucleiBATask { ConfigurableAxis avClsBins{"avClsBins", {200, 0, 20}, "Binning in average cluster size"}; // Enable custom cuts/debug functions - Configurable enableFiltering{"enableFiltering", false, "Flag to enable filtering for p,d,t,He only -- disable if launch on skimmed dataset!"}; - Configurable enableEvTimeSplitting{"enableEvTimeSplitting", false, "Flag to enable histograms splitting depending on the Event Time used"}; + struct : ConfigurableGroup { + Configurable enableFiltering{"enableFiltering", false, "Flag to enable filtering for p,d,t,He only -- disable if launch on skimmed dataset!"}; + Configurable enableIsGlobalTrack{"enableIsGlobalTrack", true, "Flag to enable IsGlobalTrackWoDCA"}; + Configurable enableEvTimeSplitting{"enableEvTimeSplitting", false, "Flag to enable histograms splitting depending on the Event Time used"}; + } filterOptions; Configurable enableDCACustomCut{"enableDCACustomCut", false, "Flag to enable DCA custom cuts - unflag to use standard isGlobalCut DCA cut"}; struct : ConfigurableGroup { @@ -304,7 +307,10 @@ struct LFNucleiBATask { histos.add("event/eventSelection", "eventSelection", HistType::kTH1D, {{7, -0.5, 6.5}}); auto h = histos.get(HIST("event/eventSelection")); - h->GetXaxis()->SetBinLabel(1, "Total"); + if (skimmingOptions.applySkimming) + h->GetXaxis()->SetBinLabel(1, "Skimmed events"); + else + h->GetXaxis()->SetBinLabel(1, "Total"); h->GetXaxis()->SetBinLabel(2, "TVX trigger cut"); h->GetXaxis()->SetBinLabel(3, "TF border cut"); h->GetXaxis()->SetBinLabel(4, "ITS ROF cut"); @@ -375,9 +381,10 @@ struct LFNucleiBATask { if (enableDebug) { debugHistos.add("debug/event/h1CentV0M", "V0M; Multiplicity; counts", HistType::kTH1F, {{27000, 0, 27000}}); // trackQA - debugHistos.add("debug/tracks/h1Eta", "pseudoRapidity; #eta; counts", HistType::kTH1F, {{200, -1.0, 1.0}}); + debugHistos.add("debug/tracks/h1Eta", "pseudoRapidity; #eta; counts", HistType::kTH1F, {{200, -2.0, 2.0}}); debugHistos.add("debug/tracks/h1VarPhi", "#phi; #phi; counts", HistType::kTH1F, {{63, 0.0, 6.3}}); - debugHistos.add("debug/tracks/h2EtaVsPhi", "#eta vs #phi; #eta; #phi", HistType::kTH2F, {{200, -1.0, 1.0}, {63, 0.0, 6.3}}); + debugHistos.add("debug/tracks/h2EtaVsPhi", "#eta vs #phi; #eta; #phi", HistType::kTH2F, {{200, -2.0, 2.0}, {63, 0.0, 6.3}}); + debugHistos.add("debug/tracks/h2PionYvsPt", "#it{y} vs #it{p}_{T} (#pi)", HistType::kTH2F, {{200, -2.0, 2.0}, {ptAxis}}); } if (enablePtSpectra) { @@ -1724,7 +1731,7 @@ struct LFNucleiBATask { } } // TOF EvTime Splitting plots - if (enableEvTimeSplitting) { + if (filterOptions.enableEvTimeSplitting) { // Bethe-Bloch TPC distribution - TOF EvTime Splitted evtimeHistos.add("tracks/evtime/fill/h2TPCsignVsTPCmomentum", "TPC <-dE/dX> vs #it{p}/Z; Signed #it{p} (GeV/#it{c}); TPC <-dE/dx> (a.u.)", HistType::kTH2F, {{500, -5.f, 5.f}, {dedxAxis}}); evtimeHistos.add("tracks/evtime/tof/h2TPCsignVsTPCmomentum", "TPC <-dE/dX> vs #it{p}/Z; Signed #it{p} (GeV/#it{c}); TPC <-dE/dx> (a.u.)", HistType::kTH2F, {{500, -5.f, 5.f}, {dedxAxis}}); @@ -1921,8 +1928,8 @@ struct LFNucleiBATask { } } } - - if (!doprocessMCGen) { + // To be optimised + if (!doprocessMCGen && !doprocessMCReco && !doprocessMCRecoLfPid && !doprocessMCRecoFiltered && !doprocessMCRecoFilteredLight) { LOG(info) << "Histograms of LFNucleiBATask:"; histos.print(); return; @@ -2150,14 +2157,11 @@ struct LFNucleiBATask { LOG(fatal) << "Problem with track size"; } - for (auto& track : tracksWithITS) { - if (enablePIDplot) { - histos.fill(HIST("tracks/h1pT"), track.pt()); - histos.fill(HIST("tracks/h1p"), track.p()); - } + tracks.copyIndexBindings(tracksWithITS); + for (auto& track : tracksWithITS) { if constexpr (!IsFilteredData) { - if (!track.isGlobalTrackWoDCA()) { + if (!track.isGlobalTrackWoDCA() && filterOptions.enableIsGlobalTrack) { continue; } } @@ -2169,6 +2173,11 @@ struct LFNucleiBATask { if (track.tpcNClsFound() < cfgCutTPCClusters) continue; + if (enablePIDplot) { + histos.fill(HIST("tracks/h1pT"), track.pt()); + histos.fill(HIST("tracks/h1p"), track.p()); + } + isTritonTPCpid = std::abs(track.tpcNSigmaTr()) < nsigmaTPCvar.nsigmaTPCTr; float shiftPtPos = 0.f; @@ -2393,6 +2402,9 @@ struct LFNucleiBATask { // p cut if (std::abs(track.tpcInnerParam()) < kinemOptions.pCut) continue; + // eta cut + if (std::abs(track.eta()) > kinemOptions.etaCut) + continue; // Rapidity cuts prRapCut = track.rapidity(o2::track::PID::getMass2Z(o2::track::PID::Proton)) > kinemOptions.yLowCut && track.rapidity(o2::track::PID::getMass2Z(o2::track::PID::Proton)) < kinemOptions.yHighCut; @@ -3553,12 +3565,14 @@ struct LFNucleiBATask { // DCA Cut if constexpr (!IsFilteredData) { - if (!enableDCACustomCut) { - if (!track.isGlobalTrack()) - continue; - } else { - if (!track.isGlobalTrackWoDCA()) - continue; + if (filterOptions.enableIsGlobalTrack) { + if (!enableDCACustomCut) { + if (!track.isGlobalTrack()) + continue; + } else { + if (!track.isGlobalTrackWoDCA()) + continue; + } } } @@ -3670,6 +3684,7 @@ struct LFNucleiBATask { debugHistos.fill(HIST("debug/tracks/h1Eta"), track.eta()); debugHistos.fill(HIST("debug/tracks/h1VarPhi"), track.phi()); debugHistos.fill(HIST("debug/tracks/h2EtaVsPhi"), track.eta(), track.phi()); + debugHistos.fill(HIST("debug/tracks/h2PionYvsPt"), track.rapidity(o2::track::PID::getMass2Z(o2::track::PID::Pion)), track.pt()); if (track.sign() > 0) { debugHistos.fill(HIST("debug/qa/h2TPCncrVsPtPos"), track.tpcInnerParam(), track.tpcNClsCrossedRows()); @@ -3706,7 +3721,7 @@ struct LFNucleiBATask { if (enablePtSpectra) histos.fill(HIST("tracks/eff/h2pVsTPCmomentum"), track.tpcInnerParam(), track.p()); - if (enableFiltering) { + if (filterOptions.enableFiltering) { if (track.tpcNSigmaKa() < 5) continue; } @@ -3804,7 +3819,7 @@ struct LFNucleiBATask { histos.fill(HIST("tracks/proton/h2ProtonTOFExpSignalDiffVsPt"), track.pt(), track.tofExpSignalDiffPr()); } - if (enableEvTimeSplitting && track.hasTOF()) { + if (filterOptions.enableEvTimeSplitting && track.hasTOF()) { if (track.isEvTimeTOF() && track.isEvTimeT0AC()) { if (enablePr) evtimeHistos.fill(HIST("tracks/evtime/ft0tof/proton/h2ProtonVspTNSigmaTOF"), track.pt(), track.tofNSigmaPr()); @@ -3958,7 +3973,7 @@ struct LFNucleiBATask { if (outFlagOptions.enableExpSignalTOF) histos.fill(HIST("tracks/proton/h2antiProtonTOFExpSignalDiffVsPt"), track.pt(), track.tofExpSignalDiffPr()); } - if (enableEvTimeSplitting && track.hasTOF()) { + if (filterOptions.enableEvTimeSplitting && track.hasTOF()) { if (track.isEvTimeTOF() && track.isEvTimeT0AC()) { if (enablePr) evtimeHistos.fill(HIST("tracks/evtime/ft0tof/proton/h2antiProtonVspTNSigmaTOF"), track.pt(), track.tofNSigmaPr()); @@ -4362,7 +4377,7 @@ struct LFNucleiBATask { } } } - if (enableEvTimeSplitting) { + if (filterOptions.enableEvTimeSplitting) { if (track.isEvTimeTOF() && track.isEvTimeT0AC()) { evtimeHistos.fill(HIST("tracks/evtime/ft0tof/h2TOFbetaVsP"), track.p() / (1.f * track.sign()), track.beta()); evtimeHistos.fill(HIST("tracks/evtime/ft0tof/h2TPCsignVsTPCmomentum"), track.tpcInnerParam() / (1.f * track.sign()), track.tpcSignal()); @@ -4490,7 +4505,7 @@ struct LFNucleiBATask { if (passDCAxyzCut) { if (enablePIDplot) histos.fill(HIST("tracks/h2TOFmassVsPt"), massTOF, track.pt()); - if (enableEvTimeSplitting) { + if (filterOptions.enableEvTimeSplitting) { if (track.isEvTimeTOF() && track.isEvTimeT0AC()) { evtimeHistos.fill(HIST("tracks/evtime/ft0tof/h2TOFmassVsPt"), massTOF, track.pt()); } else if (track.isEvTimeT0AC()) { @@ -4517,7 +4532,7 @@ struct LFNucleiBATask { } if (outFlagOptions.enableExpSignalTOF) histos.fill(HIST("tracks/proton/h2ProtonTOFExpSignalDiffVsPtCut"), track.pt(), track.tofExpSignalDiffPr()); - if (enableEvTimeSplitting) { + if (filterOptions.enableEvTimeSplitting) { if (track.isEvTimeTOF() && track.isEvTimeT0AC()) { evtimeHistos.fill(HIST("tracks/evtime/ft0tof/proton/h2TOFmass2ProtonVsPt"), massTOF * massTOF - MassProtonVal * MassProtonVal, track.pt()); } else if (track.isEvTimeT0AC()) { @@ -4541,7 +4556,7 @@ struct LFNucleiBATask { } if (outFlagOptions.enableExpSignalTOF) histos.fill(HIST("tracks/proton/h2antiProtonTOFExpSignalDiffVsPtCut"), track.pt(), track.tofExpSignalDiffPr()); - if (enableEvTimeSplitting) { + if (filterOptions.enableEvTimeSplitting) { if (track.isEvTimeTOF() && track.isEvTimeT0AC()) { evtimeHistos.fill(HIST("tracks/evtime/ft0tof/proton/h2TOFmass2antiProtonVsPt"), massTOF * massTOF - MassProtonVal * MassProtonVal, track.pt()); } else if (track.isEvTimeT0AC()) { @@ -4595,7 +4610,7 @@ struct LFNucleiBATask { } if (outFlagOptions.enableExpSignalTOF) histos.fill(HIST("tracks/deuteron/h2DeuteronTOFExpSignalDiffVsPtCut"), DPt, track.tofExpSignalDiffDe()); - if (enableEvTimeSplitting) { + if (filterOptions.enableEvTimeSplitting) { if (track.isEvTimeTOF() && track.isEvTimeT0AC()) { evtimeHistos.fill(HIST("tracks/evtime/ft0tof/deuteron/h2TOFmass2DeuteronVsPt"), massTOF * massTOF - MassDeuteronVal * MassDeuteronVal, DPt); } else if (track.isEvTimeT0AC()) { @@ -4621,7 +4636,7 @@ struct LFNucleiBATask { } if (outFlagOptions.enableExpSignalTOF) histos.fill(HIST("tracks/deuteron/h2antiDeuteronTOFExpSignalDiffVsPtCut"), antiDPt, track.tofExpSignalDiffDe()); - if (enableEvTimeSplitting) { + if (filterOptions.enableEvTimeSplitting) { if (track.isEvTimeTOF() && track.isEvTimeT0AC()) { evtimeHistos.fill(HIST("tracks/evtime/ft0tof/deuteron/h2TOFmass2antiDeuteronVsPt"), massTOF * massTOF - MassDeuteronVal * MassDeuteronVal, antiDPt); } else if (track.isEvTimeT0AC()) { From 32dcf5cd12767c3d71ea190107198439d2408e14 Mon Sep 17 00:00:00 2001 From: yuanzhe <90246048+wang-yuanzhe@users.noreply.github.com> Date: Thu, 27 Feb 2025 00:35:31 +0100 Subject: [PATCH 0440/1650] [PWGLF] Check if bachelor is primary for 3body analysis (#10214) --- PWGLF/DataModel/Vtx3BodyTables.h | 7 ++ .../Nuspex/threebodyRecoTask.cxx | 93 ++++++++++--------- 2 files changed, 58 insertions(+), 42 deletions(-) diff --git a/PWGLF/DataModel/Vtx3BodyTables.h b/PWGLF/DataModel/Vtx3BodyTables.h index 20eb659eca1..9ae43bb0255 100644 --- a/PWGLF/DataModel/Vtx3BodyTables.h +++ b/PWGLF/DataModel/Vtx3BodyTables.h @@ -9,6 +9,11 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +/// \file Vtx3BodyTables.h +/// \brief Definitions of reduced tables for 3body decayed hypertriton +/// \author Yuanzhe Wang +/// \author Carolina Reetz + #ifndef PWGLF_DATAMODEL_VTX3BODYTABLES_H_ #define PWGLF_DATAMODEL_VTX3BODYTABLES_H_ @@ -251,6 +256,7 @@ DECLARE_SOA_COLUMN(DCAXYBachelorToPV, dcaxyBachelortoPV, float); //! DCAXY of th DECLARE_SOA_COLUMN(DCAProtonToPV, dcaProtontoPV, float); //! DCA of the proton daughter to pv DECLARE_SOA_COLUMN(DCAPionToPV, dcaPiontoPV, float); //! DCA of the pion daughter to pv DECLARE_SOA_COLUMN(DCABachelorToPV, dcaBachelortoPV, float); //! DCA of the bachelor daughter to pv +DECLARE_SOA_COLUMN(IsBachPrimary, isbachprimary, bool); //! flag for bachelor daughter primary // for MC DECLARE_SOA_COLUMN(GenP, genP, float); // P of the hypertriton DECLARE_SOA_COLUMN(GenPt, genPt, float); // pT of the hypertriton @@ -313,6 +319,7 @@ DECLARE_SOA_TABLE(MCHyp3BodyCands, "AOD", "MCHYP3BODYCANDS", hyp3body::TOFNSigmaBachelor, hyp3body::DCAXYProtonToPV, hyp3body::DCAXYPionToPV, hyp3body::DCAXYBachelorToPV, hyp3body::DCAProtonToPV, hyp3body::DCAPionToPV, hyp3body::DCABachelorToPV, + hyp3body::IsBachPrimary, // MC information hyp3body::GenP, hyp3body::GenPt, diff --git a/PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx b/PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx index 5405bbb81f4..d1e7b769b63 100644 --- a/PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx +++ b/PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx @@ -75,6 +75,7 @@ struct Candidate3body { float dautpcNsigma[3]; // 0 - proton, 1 - pion, 2 - bachelor float dauinnermostR[3]; // 0 - proton, 1 - pion, 2 - bachelor !!! TracksIU required !!! float bachelortofNsigma; + bool isBachPrimary = false; // MC infomartion TLorentzVector lgencand = {0, 0, 0, 0}; float genct = -1; @@ -111,9 +112,9 @@ struct ThreebodyRecoTask { Configurable tofPIDNSigmaMin{"tofPIDNSigmaMin", -5, "tofPIDNSigmaMin"}; Configurable tofPIDNSigmaMax{"tofPIDNSigmaMax", 5, "tofPIDNSigmaMax"}; Configurable tpcPIDNSigmaCut{"tpcPIDNSigmaCut", 5, "tpcPIDNSigmaCut"}; - Configurable event_sel8_selection{"event_sel8_selection", true, "event selection count post sel8 cut"}; - Configurable mc_event_selection{"mc_event_selection", true, "mc event selection count post kIsTriggerTVX and kNoTimeFrameBorder"}; - Configurable event_posZ_selection{"event_posZ_selection", true, "event selection count post poZ cut"}; + Configurable eventSel8Cut{"eventSel8Cut", true, "flag to enable event sel8 selection"}; + Configurable mcEventCut{"mcEventCut", true, "flag to enable mc event selection: kIsTriggerTVX and kNoTimeFrameBorder"}; + Configurable eventPosZCut{"eventPosZCut", true, "flag to enable event posZ selection"}; Configurable lifetimecut{"lifetimecut", 40., "lifetimecut"}; // ct Configurable minProtonPt{"minProtonPt", 0.3, "minProtonPt"}; Configurable maxProtonPt{"maxProtonPt", 5, "maxProtonPt"}; @@ -137,8 +138,7 @@ struct ThreebodyRecoTask { float uppersignallimit = o2::constants::physics::MassHyperTriton + 3 * mcsigma; // CCDB options - Configurable d_bz_input{"d_bz", -999, "bz field, -999 is automatic"}; - Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; @@ -223,7 +223,7 @@ struct ThreebodyRecoTask { zorroSummary.setObject(zorro.getZorroSummary()); mRunNumber = 0; - ccdb->setURL(ccdburl); + ccdb->setURL(ccdbUrl); ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); ccdb->setFatalWhenNull(false); @@ -323,11 +323,11 @@ struct ThreebodyRecoTask { initCCDB(bc); registry.fill(HIST("hEventCounter"), 0.5); - if (event_sel8_selection && !collision.sel8()) { + if (eventSel8Cut && !collision.sel8()) { return false; } registry.fill(HIST("hEventCounter"), 1.5); - if (event_posZ_selection && std::abs(collision.posZ()) > 10.f) { // 10cm + if (eventPosZCut && std::abs(collision.posZ()) > 10.f) { // 10cm return false; } registry.fill(HIST("hEventCounter"), 2.5); @@ -346,7 +346,7 @@ struct ThreebodyRecoTask { //------------------------------------------------------------------ // Fill candidate table template - void fillCand(TCollisionTable const& collision, TCandTable const& candData, TTrackTable const& trackProton, TTrackTable const& trackPion, TTrackTable const& trackDeuteron, bool isMatter, bool isTrueCand = false, int lLabel = -1, TLorentzVector lmother = {0, 0, 0, 0}, double MClifetime = -1) + void fillCand(TCollisionTable const& collision, TCandTable const& candData, TTrackTable const& trackProton, TTrackTable const& trackPion, TTrackTable const& trackDeuteron, bool isMatter, bool isTrueCand = false, int lLabel = -1, TLorentzVector lmother = {0, 0, 0, 0}, double mcLifetime = -1, bool isBachPrimary = false) { double cospa = candData.vtxcosPA(collision.posX(), collision.posY(), collision.posZ()); double ct = candData.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassHyperTriton; @@ -394,10 +394,11 @@ struct ThreebodyRecoTask { cand3body.dauinnermostR[2] = trackDeuteron.x(); cand3body.bachelortofNsigma = candData.tofNSigmaBachDe(); + cand3body.isBachPrimary = isBachPrimary; if (isTrueCand) { cand3body.mcmotherId = lLabel; cand3body.lgencand = lmother; - cand3body.genct = MClifetime; + cand3body.genct = mcLifetime; cand3body.genrapidity = lmother.Rapidity(); cand3body.isSignal = true; cand3body.isReco = true; @@ -511,7 +512,7 @@ struct ThreebodyRecoTask { //------------------------------------------------------------------ // Analysis process for a single candidate template - void candidateAnalysis(TCollisionTable const& collision, TCandTable const& candData, bool& if_hasvtx, bool isTrueCand = false, int lLabel = -1, TLorentzVector lmother = {0, 0, 0, 0}, double MClifetime = -1) + void candidateAnalysis(TCollisionTable const& collision, TCandTable const& candData, bool& ifHasCandidate, bool isTrueCand = false, int lLabel = -1, TLorentzVector lmother = {0, 0, 0, 0}, double mcLifetime = -1, double isBachPrimary = false) { auto track0 = candData.template track0_as(); auto track1 = candData.template track1_as(); @@ -524,15 +525,15 @@ struct ThreebodyRecoTask { auto& trackDeuteron = track2; if (selectCand(collision, candData, trackProton, trackPion, trackDeuteron, isMatter, isTrueCand)) { - if_hasvtx = true; - fillCand(collision, candData, trackProton, trackPion, trackDeuteron, isMatter, isTrueCand, lLabel, lmother, MClifetime); + ifHasCandidate = true; + fillCand(collision, candData, trackProton, trackPion, trackDeuteron, isMatter, isTrueCand, lLabel, lmother, mcLifetime, isBachPrimary); } } //------------------------------------------------------------------ // Analysis process for like-sign candidates : (p pi- anti-d) or (anti-p pi+ d) template - void likeSignAnalysis(TCollisionTable const& collision, TCandTable const& candData, bool& if_hasvtx, bool isTrueCand = false, int lLabel = -1, TLorentzVector lmother = {0, 0, 0, 0}, double MClifetime = -1) + void likeSignAnalysis(TCollisionTable const& collision, TCandTable const& candData, bool& ifHasCandidate, bool isTrueCand = false, int lLabel = -1, TLorentzVector lmother = {0, 0, 0, 0}, double mcLifetime = -1, double isBachPrimary = false) { auto track0 = candData.template track0_as(); auto track1 = candData.template track1_as(); @@ -546,8 +547,8 @@ struct ThreebodyRecoTask { auto& trackDeuteron = track2; if (selectCand(collision, candData, trackProton, trackPion, trackDeuteron, isMatter, isTrueCand)) { - if_hasvtx = true; - fillCand(collision, candData, trackProton, trackPion, trackDeuteron, isMatter, isTrueCand, lLabel, lmother, MClifetime); + ifHasCandidate = true; + fillCand(collision, candData, trackProton, trackPion, trackDeuteron, isMatter, isTrueCand, lLabel, lmother, mcLifetime, isBachPrimary); // QA for if signals have the possibility to be reconginzed as a like-sign background if (isMatter) { registry.fill(HIST("hInvMassCorrectSign"), candData.mHypertriton()); @@ -560,7 +561,7 @@ struct ThreebodyRecoTask { //------------------------------------------------------------------ // Analysis process for reduced data template - void reducedAnalysis(TCollisionTable const& collision, TCandTable const& candData, TTracks tracks, bool isTrueCand = false, int lLabel = -1, TLorentzVector lmother = {0, 0, 0, 0}, double MClifetime = -1) + void reducedAnalysis(TCollisionTable const& collision, TCandTable const& candData, TTracks tracks, bool isTrueCand = false, int lLabel = -1, TLorentzVector lmother = {0, 0, 0, 0}, double mcLifetime = -1, double isBachPrimary = false) { auto track0 = tracks.rawIteratorAt(candData.track0Id()); auto track1 = tracks.rawIteratorAt(candData.track1Id()); @@ -573,14 +574,14 @@ struct ThreebodyRecoTask { auto& trackDeuteron = track2; if (selectCand(collision, candData, trackProton, trackPion, trackDeuteron, isMatter, isTrueCand)) { - fillCand(collision, candData, trackProton, trackPion, trackDeuteron, isMatter, isTrueCand, lLabel, lmother, MClifetime); + fillCand(collision, candData, trackProton, trackPion, trackDeuteron, isMatter, isTrueCand, lLabel, lmother, mcLifetime, isBachPrimary); } } //------------------------------------------------------------------ // Analysis process for reduced data with like-sign candidates template - void reducedLikeSignAnalysis(TCollisionTable const& collision, TCandTable const& candData, TTracks tracks, bool isTrueCand = false, int lLabel = -1, TLorentzVector lmother = {0, 0, 0, 0}, double MClifetime = -1) + void reducedLikeSignAnalysis(TCollisionTable const& collision, TCandTable const& candData, TTracks tracks, bool isTrueCand = false, int lLabel = -1, TLorentzVector lmother = {0, 0, 0, 0}, double mcLifetime = -1, bool isBachPrimary = false) { auto track0 = tracks.rawIteratorAt(candData.track0Id()); auto track1 = tracks.rawIteratorAt(candData.track1Id()); @@ -594,7 +595,7 @@ struct ThreebodyRecoTask { auto& trackDeuteron = track2; if (selectCand(collision, candData, trackProton, trackPion, trackDeuteron, isMatter, isTrueCand)) { - fillCand(collision, candData, trackProton, trackPion, trackDeuteron, isMatter, isTrueCand, lLabel, lmother, MClifetime); + fillCand(collision, candData, trackProton, trackPion, trackDeuteron, isMatter, isTrueCand, lLabel, lmother, mcLifetime, isBachPrimary); // QA for if signals have the possibility to be reconginzed as a like-sign background if (isMatter) { registry.fill(HIST("hInvMassCorrectSign"), candData.mHypertriton()); @@ -632,7 +633,7 @@ struct ThreebodyRecoTask { bool haveProton = false, havePionPlus = false, haveDeuteron = false; bool haveAntiProton = false, havePionMinus = false, haveAntiDeuteron = false; - double MClifetime = -1; + double mcLifetime = -1; for (const auto& mcparticleDaughter : mcparticle.template daughters_as()) { if (mcparticleDaughter.pdgCode() == 2212) haveProton = true; @@ -644,23 +645,23 @@ struct ThreebodyRecoTask { havePionMinus = true; if (mcparticleDaughter.pdgCode() == bachelorPdgCode) { haveDeuteron = true; - MClifetime = RecoDecay::sqrtSumOfSquares(mcparticleDaughter.vx() - mcparticle.vx(), mcparticleDaughter.vy() - mcparticle.vy(), mcparticleDaughter.vz() - mcparticle.vz()) * o2::constants::physics::MassHyperTriton / mcparticle.p(); + mcLifetime = RecoDecay::sqrtSumOfSquares(mcparticleDaughter.vx() - mcparticle.vx(), mcparticleDaughter.vy() - mcparticle.vy(), mcparticleDaughter.vz() - mcparticle.vz()) * o2::constants::physics::MassHyperTriton / mcparticle.p(); } if (mcparticleDaughter.pdgCode() == -bachelorPdgCode) { haveAntiDeuteron = true; - MClifetime = RecoDecay::sqrtSumOfSquares(mcparticleDaughter.vx() - mcparticle.vx(), mcparticleDaughter.vy() - mcparticle.vy(), mcparticleDaughter.vz() - mcparticle.vz()) * o2::constants::physics::MassHyperTriton / mcparticle.p(); + mcLifetime = RecoDecay::sqrtSumOfSquares(mcparticleDaughter.vx() - mcparticle.vx(), mcparticleDaughter.vy() - mcparticle.vy(), mcparticleDaughter.vz() - mcparticle.vz()) * o2::constants::physics::MassHyperTriton / mcparticle.p(); } } if (haveProton && havePionMinus && haveDeuteron && mcparticle.pdgCode() == motherPdgCode) { registry.fill(HIST("hGeneratedHypertritonCounter"), 1.5); registry.fill(HIST("hPtGeneratedHypertriton"), mcparticle.pt()); - registry.fill(HIST("hctGeneratedHypertriton"), MClifetime); + registry.fill(HIST("hctGeneratedHypertriton"), mcLifetime); registry.fill(HIST("hEtaGeneratedHypertriton"), mcparticle.eta()); registry.fill(HIST("hRapidityGeneratedHypertriton"), mcparticle.y()); } else if (haveAntiProton && havePionPlus && haveAntiDeuteron && mcparticle.pdgCode() == -motherPdgCode) { registry.fill(HIST("hGeneratedHypertritonCounter"), 1.5); registry.fill(HIST("hPtGeneratedAntiHypertriton"), mcparticle.pt()); - registry.fill(HIST("hctGeneratedAntiHypertriton"), MClifetime); + registry.fill(HIST("hctGeneratedAntiHypertriton"), mcLifetime); registry.fill(HIST("hEtaGeneratedAntiHypertriton"), mcparticle.eta()); registry.fill(HIST("hRapidityGeneratedAntiHypertriton"), mcparticle.y()); } @@ -678,16 +679,16 @@ struct ThreebodyRecoTask { continue; } - bool if_hasvtx = false; - auto d3bodyCands = vtx3bodydatas.sliceBy(perCollisionVtx3BodyDatas, collision.globalIndex()); - for (const auto& vtx : d3bodyCands) { + bool ifHasCandidate = false; + auto d3BodyCands = vtx3bodydatas.sliceBy(perCollisionVtx3BodyDatas, collision.globalIndex()); + for (const auto& vtx : d3BodyCands) { if (cfgLikeSignAnalysis) { - likeSignAnalysis(collision, vtx, if_hasvtx); + likeSignAnalysis(collision, vtx, ifHasCandidate); } else { - candidateAnalysis(collision, vtx, if_hasvtx); + candidateAnalysis(collision, vtx, ifHasCandidate); } } - if (if_hasvtx) + if (ifHasCandidate) registry.fill(HIST("hEventCounter"), 4.5); fillHistos(); resetHistos(); @@ -733,11 +734,11 @@ struct ThreebodyRecoTask { for (const auto& collision : collisions) { candidates3body.clear(); registry.fill(HIST("hEventCounter"), 0.5); - if (mc_event_selection && (!collision.selection_bit(aod::evsel::kIsTriggerTVX) || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder))) { + if (mcEventCut && (!collision.selection_bit(aod::evsel::kIsTriggerTVX) || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder))) { continue; } registry.fill(HIST("hEventCounter"), 1.5); - if (event_posZ_selection && std::abs(collision.posZ()) > 10.f) { // 10cm + if (eventPosZCut && std::abs(collision.posZ()) > 10.f) { // 10cm continue; } registry.fill(HIST("hEventCounter"), 2.5); @@ -747,13 +748,14 @@ struct ThreebodyRecoTask { isGoodCollision[collision.mcCollisionId()] = true; } - bool if_hasvtx = false; - auto vtxsthiscol = vtx3bodydatas.sliceBy(perCollisionVtx3BodyDatas, collision.globalIndex()); + bool ifHasCandidate = false; + auto vtxsThisCol = vtx3bodydatas.sliceBy(perCollisionVtx3BodyDatas, collision.globalIndex()); - for (const auto& vtx : vtxsthiscol) { + for (const auto& vtx : vtxsThisCol) { + bool isBachPrimary = false; int lLabel = -1; int lPDG = -1; - double MClifetime = -1; + double mcLifetime = -1; TLorentzVector lmother; bool isTrueCand = false; auto track0 = vtx.track0_as(); @@ -763,6 +765,11 @@ struct ThreebodyRecoTask { auto lMCTrack0 = track0.mcParticle_as(); auto lMCTrack1 = track1.mcParticle_as(); auto lMCTrack2 = track2.mcParticle_as(); + + if (lMCTrack2.isPhysicalPrimary()) { + isBachPrimary = true; + } + if (lMCTrack0.has_mothers() && lMCTrack1.has_mothers() && lMCTrack2.has_mothers()) { for (const auto& lMother0 : lMCTrack0.mothers_as()) { for (const auto& lMother1 : lMCTrack1.mothers_as()) { @@ -773,7 +780,7 @@ struct ThreebodyRecoTask { if ((lPDG == motherPdgCode && lMCTrack0.pdgCode() == 2212 && lMCTrack1.pdgCode() == -211 && lMCTrack2.pdgCode() == bachelorPdgCode) || (lPDG == -motherPdgCode && lMCTrack0.pdgCode() == 211 && lMCTrack1.pdgCode() == -2212 && lMCTrack2.pdgCode() == -bachelorPdgCode)) { isTrueCand = true; - MClifetime = RecoDecay::sqrtSumOfSquares(lMCTrack2.vx() - lMother2.vx(), lMCTrack2.vy() - lMother2.vy(), lMCTrack2.vz() - lMother2.vz()) * o2::constants::physics::MassHyperTriton / lMother2.p(); + mcLifetime = RecoDecay::sqrtSumOfSquares(lMCTrack2.vx() - lMother2.vx(), lMCTrack2.vy() - lMother2.vy(), lMCTrack2.vz() - lMother2.vz()) * o2::constants::physics::MassHyperTriton / lMother2.p(); lmother.SetXYZM(lMother0.px(), lMother0.py(), lMother0.pz(), o2::constants::physics::MassHyperTriton); } } @@ -783,10 +790,10 @@ struct ThreebodyRecoTask { } } - candidateAnalysis(collision, vtx, if_hasvtx, isTrueCand, lLabel, lmother, MClifetime); + candidateAnalysis(collision, vtx, ifHasCandidate, isTrueCand, lLabel, lmother, mcLifetime, isBachPrimary); } - if (if_hasvtx) + if (ifHasCandidate) registry.fill(HIST("hEventCounter"), 4.5); fillHistos(); resetHistos(); @@ -803,6 +810,7 @@ struct ThreebodyRecoTask { cand3body.dautpcNsigma[0], cand3body.dautpcNsigma[1], cand3body.dautpcNsigma[2], cand3body.bachelortofNsigma, cand3body.daudcaxytopv[0], cand3body.daudcaxytopv[1], cand3body.daudcaxytopv[2], cand3body.daudcatopv[0], cand3body.daudcatopv[1], cand3body.daudcatopv[2], + cand3body.isBachPrimary, cand3body.lgencand.P(), cand3body.lgencand.Pt(), cand3body.genct, cand3body.lgencand.Phi(), cand3body.lgencand.Eta(), cand3body.lgencand.Rapidity(), cand3body.isSignal, cand3body.isReco, cand3body.pdgCode, cand3body.survivedEventSelection); } @@ -823,7 +831,7 @@ struct ThreebodyRecoTask { posSV = {mcDaughter.vx(), mcDaughter.vy(), mcDaughter.vz()}; } } - double MClifetime = RecoDecay::sqrtSumOfSquares(posSV[0] - mcparticle.vx(), posSV[1] - mcparticle.vy(), posSV[2] - mcparticle.vz()) * o2::constants::physics::MassHyperTriton / mcparticle.p(); + double mcLifetime = RecoDecay::sqrtSumOfSquares(posSV[0] - mcparticle.vx(), posSV[1] - mcparticle.vy(), posSV[2] - mcparticle.vz()) * o2::constants::physics::MassHyperTriton / mcparticle.p(); outputMCTable(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -835,7 +843,8 @@ struct ThreebodyRecoTask { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - mcparticle.p(), mcparticle.pt(), MClifetime, mcparticle.phi(), mcparticle.eta(), mcparticle.y(), + false, + mcparticle.p(), mcparticle.pt(), mcLifetime, mcparticle.phi(), mcparticle.eta(), mcparticle.y(), true, false, mcparticle.pdgCode(), isSurEvSelection); } } From f5ecf75243d9e72e2f9779df5f93d95bbe66444e Mon Sep 17 00:00:00 2001 From: Zuzanna Chochulska <87480906+zchochul@users.noreply.github.com> Date: Thu, 27 Feb 2025 00:51:08 +0100 Subject: [PATCH 0441/1650] [PWGCF] FemtoUniverse -- change in naming of configurables for p-phi analysis (#10208) Co-authored-by: Zuzanna <01150674@pw.edu.pl> --- ...emto_universe_efficiency_phi_calculator.py | 223 ++++++++++++++++++ .../Tasks/femtoUniversePairTaskTrackPhi.cxx | 194 ++++++++------- 2 files changed, 315 insertions(+), 102 deletions(-) create mode 100644 PWGCF/FemtoUniverse/Scripts/femto_universe_efficiency_phi_calculator.py diff --git a/PWGCF/FemtoUniverse/Scripts/femto_universe_efficiency_phi_calculator.py b/PWGCF/FemtoUniverse/Scripts/femto_universe_efficiency_phi_calculator.py new file mode 100644 index 00000000000..97f5bede27a --- /dev/null +++ b/PWGCF/FemtoUniverse/Scripts/femto_universe_efficiency_phi_calculator.py @@ -0,0 +1,223 @@ +#!/usr/bin/env python3 + +# Copyright 2019-2020 CERN and copyright holders of ALICE O2. +# See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +# All rights not expressly granted are reserved. +# +# This software is distributed under the terms of the GNU General Public +# License v3 (GPL Version 3), copied verbatim in the file "COPYING". +# +# In applying this license CERN does not waive the privileges and immunities +# granted to it by virtue of its status as an Intergovernmental Organization +# or submit itself to any jurisdiction. + +""" +A tool to calculate efficiency and upload it to CCDB. +Author: Dawid Karpiński (dawid.karpinski@cern.ch) +Modified by: Zuzanna Chochulska (zchochul@cern.ch) +""" + +import argparse +import subprocess +import sys +import tempfile +import time +from pathlib import Path + +import ROOT # pylint: disable=import-error + + +class CustomHelpFormatter(argparse.HelpFormatter): + "Add default value to help format" + + def _get_help_string(self, action): + help_str = action.help + if help_str is not None and action.default not in [argparse.SUPPRESS, None]: + help_str += f" (default: {action.default})" + return help_str + + +parser = argparse.ArgumentParser( + description="A tool to calculate efficiency and upload it to CCDB", + formatter_class=CustomHelpFormatter, +) +parser.add_argument( + "--alien-path", + type=Path, + help="path to train run's directory in Alien with analysis results " + "[example: /alice/cern.ch/user/a/alihyperloop/outputs/0033/332611/70301]", +) +parser.add_argument( + "--mc-reco", + type=str, + nargs="+", + help="paths to MC Reco histograms, separated by space [example: task/mcreco_one/hPt task/mcreco_two/hPt]", + required=True, +) +parser.add_argument( + "--mc-truth", + type=str, + nargs="+", + help="paths to MC Truth histograms, separated by space [example: task/mctruth_one/hPt task/mctruth_one/hPt]", + required=True, +) +parser.add_argument( + "--ccdb-path", + type=str, + help="location in CCDB to where objects will be uploaded", + required=True, +) +parser.add_argument( + "--ccdb-url", + type=str, + help="URL to CCDB", + default="http://ccdb-test.cern.ch:8080", +) +parser.add_argument( + "--ccdb-labels", + type=str, + nargs="+", + help="custom labels to add to objects' metadata in CCDB [example: label1 label2]", + default=[], +) +parser.add_argument( + "--ccdb-lifetime", + type=int, + help="how long should objects in CCDB remain valid (milliseconds)", + default=365 * 24 * 60 * 60 * 1000, # one year +) +args = parser.parse_args() + +if len(args.mc_reco) != len(args.mc_truth): + print("[!] Provided number of histograms with MC Reco must match MC Truth", file=sys.stderr) + sys.exit(1) + +if len(args.ccdb_labels) > 0 and len(args.ccdb_labels) != len(args.mc_reco): + print("[!] You must provide labels for all particles", file=sys.stderr) + sys.exit(1) + +if len(args.ccdb_labels) == 0: + # if flag is not provided, fill with empty strings to match size + args.ccdb_labels = [""] * len(args.mc_reco) + +ANALYSIS_RESULTS = "AnalysisResults.root" +results_path = args.alien_path / ANALYSIS_RESULTS +job_id = results_path.parent.name +train_number = results_path.parent.parent.name + +tmp_dir = Path(tempfile.gettempdir()) + +res_dest = tmp_dir / f"{train_number}-{job_id}-{ANALYSIS_RESULTS}" +eff_dest = tmp_dir / f"{train_number}-{job_id}-Efficiency.root" + +# get file from alien +if not res_dest.is_file(): + print(f"[↓] Downloading analysis results from Alien to '{res_dest}' ...", file=sys.stderr) + ROOT.TGrid.Connect("alien://") + try: + subprocess.run( + ["alien_cp", results_path, "file://" + str(res_dest)], + capture_output=True, + check=True, + ) + print("[-] Download complete!", file=sys.stderr) + except subprocess.CalledProcessError as error: + print(f"[!] Error while downloading results file: {error.stderr}", file=sys.stderr) + sys.exit(1) +else: + print( + f"[-] Skipping download from Alien, since '{res_dest}' is already present", + file=sys.stderr, + ) + +print() + +histos_to_upload = [] + +# get reco & truth histos +with ( + ROOT.TFile.Open(res_dest.as_uri()) as res_file, + ROOT.TFile.Open(eff_dest.as_uri(), "recreate") as eff_file, +): + + for idx, (mc_reco, mc_truth) in enumerate(zip(args.mc_reco, args.mc_truth)): + hist_reco = res_file.Get(mc_reco) + if not hist_reco: + print(f"[!] Cannot find MC Reco histogram in '{mc_reco}', aborting", file=sys.stderr) + sys.exit(1) + + hist_truth = res_file.Get(mc_truth) + if not hist_truth: + print(f"[!] Cannot find MC Truth histogram in '{mc_truth}', aborting", file=sys.stderr) + sys.exit(1) + + hist_reco.Rebin(4) + hist_truth.Rebin(4) + + num_bins = hist_reco.GetNbinsX() + x_max = hist_reco.GetXaxis().GetBinLowEdge(num_bins) + x_max += hist_reco.GetXaxis().GetBinWidth(num_bins) + + hist_name = f"Efficiency_part{idx + 1}" + + # calculate efficiency + eff = ROOT.TH1F(hist_name, "", num_bins, 0, x_max) + for bin_idx in range(1, num_bins + 1): # Bins start at 1 in ROOT + denom = hist_truth.GetBinContent(bin_idx) + if idx == 0: + denom *= 0.489 + eff.SetBinContent(bin_idx, hist_reco.GetBinContent(bin_idx) / denom if denom > 0 else 0) + + # save efficiency object to file + eff_file.WriteObject(eff, hist_name) + histos_to_upload.append(hist_name) + +if len(histos_to_upload) == 0: + print("[-] Exiting, since there is nothing to upload", file=sys.stderr) + sys.exit(1) + +# upload objects to ccdb +try: + for idx, key in enumerate(histos_to_upload): + timestamp_start = int(time.time() * 1000) + timestamp_end = timestamp_start + args.ccdb_lifetime + + print(f"[↑] Uploading {key} to {args.ccdb_url} ... ", file=sys.stderr, end="") + upload_cmd = [ + "o2-ccdb-upload", + "--file", + eff_dest.as_uri(), + "--host", + args.ccdb_url, + "--key", + key, + "--path", + args.ccdb_path, + "--starttimestamp", + str(timestamp_start), + "--endtimestamp", + str(timestamp_end), + "--meta", + f"trainNumber={train_number};label={args.ccdb_labels[idx]}", + ] + result = subprocess.run(upload_cmd, capture_output=True, check=True) + + if "html" in result.stdout.decode("utf-8"): + print( + f"\n[!] Something went wrong with upload request: {result.stdout.decode('utf-8')}", + file=sys.stderr, + ) + sys.exit(1) + + if result.stderr: + print(f"\n[!] Error while uploading: {result.stderr.decode('utf-8')}", file=sys.stderr) + sys.exit(1) + + print("complete!", file=sys.stderr) + +except subprocess.CalledProcessError as error: + print(f"\n[!] Error while uploading: {error.stderr.decode('utf-8')}", file=sys.stderr) + sys.exit(1) + +print() +print("[✓] Success!", file=sys.stderr) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx index 62d54676197..25536b83262 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx @@ -66,62 +66,52 @@ struct FemtoUniversePairTaskTrackPhi { using FemtoRecoParticles = soa::Join; Preslice perColMC = aod::femtouniverseparticle::fdCollisionId; - struct : o2::framework::ConfigurableGroup { - Configurable confCPRIsEnabled{"confCPRIsEnabled", false, "Close Pair Rejection"}; - Configurable confCPRPlotPerRadii{"confCPRPlotPerRadii", false, "Plot CPR per radii"}; - Configurable confCPRdeltaPhiCutMax{"confCPRdeltaPhiCutMax", 0.0, "Delta Phi max cut for Close Pair Rejection"}; - Configurable confCPRdeltaPhiCutMin{"confCPRdeltaPhiCutMin", 0.0, "Delta Phi min cut for Close Pair Rejection"}; - Configurable confCPRdeltaEtaCutMax{"confCPRdeltaEtaCutMax", 0.0, "Delta Eta max cut for Close Pair Rejection"}; - Configurable confCPRdeltaEtaCutMin{"confCPRdeltaEtaCutMin", 0.0, "Delta Eta min cut for Close Pair Rejection"}; - Configurable confCPRInvMassCutMin{"confCPRInvMassCutMin", 1.014, "Invariant mass (low) cut for Close Pair Rejection"}; - Configurable confCPRInvMassCutMax{"confCPRInvMassCutMax", 1.026, "Invariant mass (high) cut for Close Pair Rejection"}; - Configurable confCPRChosenRadii{"confCPRChosenRadii", 0.80, "Delta Eta cut for Close Pair Rejection"}; - } ConfCPR; + Configurable ConfCPRIsEnabled{"ConfCPRIsEnabled", false, "Close Pair Rejection"}; + Configurable ConfCPRPlotPerRadii{"ConfCPRPlotPerRadii", false, "Plot CPR per radii"}; + Configurable ConfCPRdeltaPhiCutMax{"ConfCPRdeltaPhiCutMax", 0.0, "Delta Phi max cut for Close Pair Rejection"}; + Configurable ConfCPRdeltaPhiCutMin{"ConfCPRdeltaPhiCutMin", 0.0, "Delta Phi min cut for Close Pair Rejection"}; + Configurable ConfCPRdeltaEtaCutMax{"ConfCPRdeltaEtaCutMax", 0.0, "Delta Eta max cut for Close Pair Rejection"}; + Configurable ConfCPRdeltaEtaCutMin{"ConfCPRdeltaEtaCutMin", 0.0, "Delta Eta min cut for Close Pair Rejection"}; + Configurable ConfCPRInvMassCutMin{"ConfCPRInvMassCutMin", 1.014, "Invariant mass (low) cut for Close Pair Rejection"}; + Configurable ConfCPRInvMassCutMax{"ConfCPRInvMassCutMax", 1.026, "Invariant mass (high) cut for Close Pair Rejection"}; + Configurable ConfCPRChosenRadii{"ConfCPRChosenRadii", 0.80, "Delta Eta cut for Close Pair Rejection"}; /// Table for both particles - struct : o2::framework::ConfigurableGroup { - Configurable confPIDProtonNsigmaCombined{"confPIDProtonNsigmaCombined", 3.0, "TPC and TOF Proton Sigma (combined) for momentum > 0.5"}; - Configurable confPIDProtonNsigmaTPC{"confPIDProtonNsigmaTPC", 3.0, "TPC Proton Sigma for momentum < 0.5"}; - Configurable confPIDKaonNsigmaReject{"confPIDKaonNsigmaReject", 3.0, "Reject if particle could be a Kaon combined nsigma value."}; - Configurable confPIDPionNsigmaReject{"confPIDPionNsigmaReject", 3.0, "Reject if particle could be a Pion combined nsigma value."}; - Configurable confPIDProtonNsigmaReject{"confPIDProtonNsigmaReject", 3.0, "Reject if particle could be a Proton combined nsigma value."}; - Configurable confPIDPionNsigmaCombined{"confPIDPionNsigmaCombined", 3.0, "TPC and TOF Pion Sigma (combined) for momentum > 0.5"}; - Configurable confPIDPionNsigmaTPC{"confPIDPionNsigmaTPC", 3.0, "TPC Pion Sigma for momentum < 0.5"}; - Configurable confIsMC{"confIsMC", false, "Enable additional Histograms in the case of a MonteCarlo Run"}; - Configurable> confTrkPIDnSigmaMax{"confTrkPIDnSigmaMax", std::vector{4.f, 3.f, 2.f}, "This configurable needs to be the same as the one used in the producer task"}; - Configurable confUse3D{"confUse3D", false, "Enable three dimensional histogramms (to be used only for analysis with high statistics): k* vs mT vs multiplicity"}; - Configurable confBinsPhi{"confBinsPhi", 29, "Number of phi bins in deta dphi"}; - Configurable confBinsEta{"confBinsEta", 29, "Number of eta bins in deta dphi"}; - } ConfBothTracks; + Configurable ConfPIDProtonNsigmaCombined{"ConfPIDProtonNsigmaCombined", 3.0, "TPC and TOF Proton Sigma (combined) for momentum > 0.5"}; + Configurable ConfPIDProtonNsigmaTPC{"ConfPIDProtonNsigmaTPC", 3.0, "TPC Proton Sigma for momentum < 0.5"}; + Configurable ConfPIDKaonNsigmaReject{"ConfPIDKaonNsigmaReject", 3.0, "Reject if particle could be a Kaon combined nsigma value."}; + Configurable ConfPIDPionNsigmaReject{"ConfPIDPionNsigmaReject", 3.0, "Reject if particle could be a Pion combined nsigma value."}; + Configurable ConfPIDProtonNsigmaReject{"ConfPIDProtonNsigmaReject", 3.0, "Reject if particle could be a Proton combined nsigma value."}; + Configurable ConfPIDPionNsigmaCombined{"ConfPIDPionNsigmaCombined", 3.0, "TPC and TOF Pion Sigma (combined) for momentum > 0.5"}; + Configurable ConfPIDPionNsigmaTPC{"ConfPIDPionNsigmaTPC", 3.0, "TPC Pion Sigma for momentum < 0.5"}; + Configurable ConfIsMC{"ConfIsMC", false, "Enable additional Histograms in the case of a MonteCarlo Run"}; + Configurable ConfUse3D{"ConfUse3D", false, "Enable three dimensional histogramms (to be used only for analysis with high statistics): k* vs mT vs multiplicity"}; + Configurable ConfBinsPhi{"ConfBinsPhi", 29, "Number of phi bins in deta dphi"}; + Configurable ConfBinsEta{"ConfBinsEta", 29, "Number of eta bins in deta dphi"}; /// Particle 1 --- IDENTIFIED TRACK - struct : o2::framework::ConfigurableGroup { - Configurable confTrackPDGCode{"confTrackPDGCode", 2212, "Particle 2 - PDG code"}; - Configurable confTrackPID{"confTrackPID", 2, "Particle 2 - Read from cutCulator"}; // we also need the possibility to specify whether the bit is true/false ->std>>vector> - Configurable confTrackSign{"confTrackSign", 1, "Track sign"}; - Configurable confTrackIsIdentified{"confTrackIsIdentified", true, "Enable PID for the track"}; - Configurable confTrackIsRejected{"confTrackIsRejected", true, "Enable PID rejection for the track other species than the identified one."}; - Configurable confTrackPtPIDLimit{"confTrackPtPIDLimit", 0.5, "Momentum threshold for change of the PID method (from using TPC to TPC and TOF)."}; - Configurable confTrackPtLowLimit{"confTrackPtLowLimit", 0.5, "Lower limit of the hadron pT."}; - Configurable confTrackPtHighLimit{"confTrackPtHighLimit", 2.5, "Higher limit of the hadron pT."}; - } ConfTrack; + Configurable ConfTrackPDGCode{"ConfTrackPDGCode", 2212, "Particle 2 - PDG code"}; + Configurable ConfTrackSign{"ConfTrackSign", 1, "Track sign"}; + Configurable ConfTrackIsIdentified{"ConfTrackIsIdentified", true, "Enable PID for the track"}; + Configurable ConfTrackIsRejected{"ConfTrackIsRejected", true, "Enable PID rejection for the track other species than the identified one."}; + Configurable ConfTrackPtPIDLimit{"ConfTrackPtPIDLimit", 0.5, "Momentum threshold for change of the PID method (from using TPC to TPC and TOF)."}; + Configurable ConfTrackPtLow{"ConfTrackPtLow", 0.5, "Lower limit of the hadron pT."}; + Configurable ConfTrackPtHigh{"ConfTrackPtHigh", 2.5, "Higher limit of the hadron pT."}; /// Partitions for the track (particle 1) Partition partsTrack = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kTrack)) && - (aod::femtouniverseparticle::sign == ConfTrack.confTrackSign.value) && - (aod::femtouniverseparticle::pt > ConfTrack.confTrackPtLowLimit.value) && - (aod::femtouniverseparticle::pt < ConfTrack.confTrackPtHighLimit.value); + (aod::femtouniverseparticle::sign == ConfTrackSign) && + (aod::femtouniverseparticle::pt > ConfTrackPtLow) && + (aod::femtouniverseparticle::pt < ConfTrackPtHigh); /// Particle 2 --- PHI MESON - struct : o2::framework::ConfigurableGroup { - Configurable confPhiPtLowLimit{"confPhiPtLowLimit", 0.8, "Lower limit of the Phi pT."}; - Configurable confPhiPtHighLimit{"confPhiPtHighLimit", 4.0, "Higher limit of the Phi pT."}; - } ConfPhi; + Configurable ConfPhiPtLow{"ConfPhiPtLow", 0.8, "Lower limit of the Phi pT."}; + Configurable ConfPhiPtHigh{"ConfPhiPtHigh", 4.0, "Higher limit of the Phi pT."}; /// Partitions for the Phi meson (particle 2) Partition partsPhi = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kPhi)) && - (aod::femtouniverseparticle::pt > ConfPhi.confPhiPtLowLimit.value) && - (aod::femtouniverseparticle::pt < ConfPhi.confPhiPtHighLimit.value); + (aod::femtouniverseparticle::pt > ConfPhiPtLow) && + (aod::femtouniverseparticle::pt < ConfPhiPtHigh); /// Partitions for Phi daughters kPhiChild Partition partsPhiDaugh = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kPhiChild)); @@ -144,23 +134,23 @@ struct FemtoUniversePairTaskTrackPhi { FemtoUniverseEventHisto eventHisto; /// particle part - ConfigurableAxis confBinsTempFitVar{"confBinsTempFitVar", {300, -0.15, 0.15}, "binning of the TempFitVar in the pT vs. TempFitVar plot"}; - ConfigurableAxis confBinsTempFitVarInvMass{"confBinsTempFitVarInvMass", {6000, 0.9, 4.0}, "binning of the TempFitVar in the pT vs. TempFitVar plot"}; - ConfigurableAxis confBinsTempFitVarpT{"confBinsTempFitVarpT", {20, 0.5, 4.05}, "pT binning of the pT vs. TempFitVar plot"}; - ConfigurableAxis confBinsTempFitVarPDG{"confBinsTempFitVarPDG", {6000, -2300, 2300}, "Binning of the PDG code in the pT vs. TempFitVar plot"}; - ConfigurableAxis confBinsTempFitVarDCA{"confBinsTempFitVarDCA", {300, -3.0, 3.0}, "binning of the TempFitVar in the pT vs. TempFitVar plot"}; + ConfigurableAxis ConfBinsTempFitVar{"ConfBinsTempFitVar", {300, -0.15, 0.15}, "binning of the TempFitVar in the pT vs. TempFitVar plot"}; + ConfigurableAxis ConfBinsTempFitVarInvMass{"ConfBinsTempFitVarInvMass", {6000, 0.9, 4.0}, "binning of the TempFitVar in the pT vs. TempFitVar plot"}; + ConfigurableAxis ConfBinsTempFitVarpT{"ConfBinsTempFitVarpT", {20, 0.5, 4.05}, "pT binning of the pT vs. TempFitVar plot"}; + ConfigurableAxis ConfBinsTempFitVarPDG{"ConfBinsTempFitVarPDG", {6000, -2300, 2300}, "Binning of the PDG code in the pT vs. TempFitVar plot"}; + ConfigurableAxis ConfBinsTempFitVarDCA{"ConfBinsTempFitVarDCA", {300, -3.0, 3.0}, "binning of the TempFitVar in the pT vs. TempFitVar plot"}; /// Correlation part - ConfigurableAxis confBinsMult{"confBinsMult", {VARIABLE_WIDTH, 0.0f, 4.0f, 8.0f, 12.0f, 16.0f, 20.0f, 24.0f, 28.0f, 32.0f, 36.0f, 40.0f, 44.0f, 48.0f, 52.0f, 56.0f, 60.0f, 64.0f, 68.0f, 72.0f, 76.0f, 80.0f, 84.0f, 88.0f, 92.0f, 96.0f, 100.0f, 200.0f, 99999.f}, "Mixing bins - multiplicity"}; // \todo to be obtained from the hash task - ConfigurableAxis confBinsVtx{"confBinsVtx", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; - ConfigurableAxis confBins3DmT{"confBins3DmT", {VARIABLE_WIDTH, 1.02f, 1.14f, 1.20f, 1.26f, 1.38f, 1.56f, 1.86f, 4.50f}, "mT Binning for the 3Dimensional plot: k* vs multiplicity vs mT (set <> to true in order to use)"}; - ConfigurableAxis confBins3Dmult{"confBins3Dmult", {VARIABLE_WIDTH, 0.0f, 20.0f, 30.0f, 40.0f, 99999.0f}, "multiplicity Binning for the 3Dimensional plot: k* vs multiplicity vs mT (set <> to true in order to use)"}; + ConfigurableAxis ConfBinsMult{"ConfBinsMult", {VARIABLE_WIDTH, 0.0f, 4.0f, 8.0f, 12.0f, 16.0f, 20.0f, 24.0f, 28.0f, 32.0f, 36.0f, 40.0f, 44.0f, 48.0f, 52.0f, 56.0f, 60.0f, 64.0f, 68.0f, 72.0f, 76.0f, 80.0f, 84.0f, 88.0f, 92.0f, 96.0f, 100.0f, 200.0f, 99999.f}, "Mixing bins - multiplicity"}; // \todo to be obtained from the hash task + ConfigurableAxis ConfBinsVtx{"ConfBinsVtx", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; + ConfigurableAxis ConfBins3DmT{"ConfBins3DmT", {VARIABLE_WIDTH, 1.02f, 1.14f, 1.20f, 1.26f, 1.38f, 1.56f, 1.86f, 4.50f}, "mT Binning for the 3Dimensional plot: k* vs multiplicity vs mT (set <> to true in order to use)"}; + ConfigurableAxis ConfBins3Dmult{"ConfBins3Dmult", {VARIABLE_WIDTH, 0.0f, 20.0f, 30.0f, 40.0f, 99999.0f}, "multiplicity Binning for the 3Dimensional plot: k* vs multiplicity vs mT (set <> to true in order to use)"}; - ColumnBinningPolicy colBinning{{confBinsVtx, confBinsMult}, true}; + ColumnBinningPolicy colBinning{{ConfBinsVtx, ConfBinsMult}, true}; - ConfigurableAxis confBinskstar{"confBinskstar", {1500, 0., 6.}, "binning kstar"}; - ConfigurableAxis confBinskT{"confBinskT", {150, 0., 9.}, "binning kT"}; - ConfigurableAxis confBinsmT{"confBinsmT", {225, 0., 7.5}, "binning mT"}; + ConfigurableAxis ConfBinskstar{"ConfBinskstar", {1500, 0., 6.}, "binning kstar"}; + ConfigurableAxis ConfBinskT{"ConfBinskT", {150, 0., 9.}, "binning kT"}; + ConfigurableAxis ConfBinsmT{"ConfBinsmT", {225, 0., 7.5}, "binning mT"}; FemtoUniverseContainer sameEventCont; FemtoUniverseContainer mixedEventCont; @@ -177,7 +167,6 @@ struct FemtoUniversePairTaskTrackPhi { HistogramRegistry registryPhiMinvBackground{"registryPhiMinvBackground", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; HistogramRegistry registryDCA{"registryDCA", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; - Configurable confDoEfficiency{"confDoEfficiency", true, "Do efficiency corrections."}; EfficiencyConfigurableGroup effConfGroup; EfficiencyCalculator efficiencyCalculator{&effConfGroup}; @@ -189,14 +178,14 @@ struct FemtoUniversePairTaskTrackPhi { // PID for protons bool isProtonNSigma(float mom, float nsigmaTPCPr, float nsigmaTOFPr) // previous version from: https://github.com/alisw/AliPhysics/blob/master/PWGCF/FEMTOSCOPY/AliFemtoUser/AliFemtoMJTrackCut.cxx { - if (mom < ConfTrack.confTrackPtPIDLimit.value) { - if (std::abs(nsigmaTPCPr) < ConfBothTracks.confPIDProtonNsigmaTPC.value) { + if (mom < ConfTrackPtPIDLimit) { + if (std::abs(nsigmaTPCPr) < ConfPIDProtonNsigmaTPC) { return true; } else { return false; } - } else if (mom > ConfTrack.confTrackPtPIDLimit.value) { - if (std::hypot(nsigmaTOFPr, nsigmaTPCPr) < ConfBothTracks.confPIDProtonNsigmaCombined.value) { + } else if (mom > ConfTrackPtPIDLimit) { + if (std::hypot(nsigmaTOFPr, nsigmaTPCPr) < ConfPIDProtonNsigmaCombined) { return true; } else { return false; @@ -211,9 +200,9 @@ struct FemtoUniversePairTaskTrackPhi { return true; } if (mom > 0.5) { - if (std::hypot(nsigmaTOFPi, nsigmaTPCPi) < ConfBothTracks.confPIDPionNsigmaReject.value) { + if (std::hypot(nsigmaTOFPi, nsigmaTPCPi) < ConfPIDPionNsigmaReject) { return true; - } else if (std::hypot(nsigmaTOFK, nsigmaTPCK) < ConfBothTracks.confPIDKaonNsigmaReject.value) { + } else if (std::hypot(nsigmaTOFK, nsigmaTPCK) < ConfPIDKaonNsigmaReject) { return true; } else { return false; @@ -265,16 +254,16 @@ struct FemtoUniversePairTaskTrackPhi { bool isKaonRejected(float mom, float nsigmaTPCPr, float nsigmaTOFPr, float nsigmaTPCPi, float nsigmaTOFPi) { if (mom < 0.5) { - if (std::abs(nsigmaTPCPi) < ConfBothTracks.confPIDPionNsigmaReject.value) { + if (std::abs(nsigmaTPCPi) < ConfPIDPionNsigmaReject) { return true; - } else if (std::abs(nsigmaTPCPr) < ConfBothTracks.confPIDProtonNsigmaReject.value) { + } else if (std::abs(nsigmaTPCPr) < ConfPIDProtonNsigmaReject) { return true; } } if (mom > 0.5) { - if (std::hypot(nsigmaTOFPi, nsigmaTPCPi) < ConfBothTracks.confPIDPionNsigmaReject.value) { + if (std::hypot(nsigmaTOFPi, nsigmaTPCPi) < ConfPIDPionNsigmaReject) { return true; - } else if (std::hypot(nsigmaTOFPr, nsigmaTPCPr) < ConfBothTracks.confPIDProtonNsigmaReject.value) { + } else if (std::hypot(nsigmaTOFPr, nsigmaTPCPr) < ConfPIDProtonNsigmaReject) { return true; } else { return false; @@ -288,13 +277,13 @@ struct FemtoUniversePairTaskTrackPhi { { if (true) { if (mom < 0.5) { - if (std::abs(nsigmaTPCPi) < ConfBothTracks.confPIDPionNsigmaTPC.value) { + if (std::abs(nsigmaTPCPi) < ConfPIDPionNsigmaTPC) { return true; } else { return false; } } else if (mom > 0.5) { - if (std::hypot(nsigmaTOFPi, nsigmaTPCPi) < ConfBothTracks.confPIDPionNsigmaCombined.value) { + if (std::hypot(nsigmaTOFPi, nsigmaTPCPi) < ConfPIDPionNsigmaCombined) { return true; } else { return false; @@ -307,16 +296,16 @@ struct FemtoUniversePairTaskTrackPhi { bool isPionRejected(float mom, float nsigmaTPCPr, float nsigmaTOFPr, float nsigmaTPCK, float nsigmaTOFK) { if (mom < 0.5) { - if (std::abs(nsigmaTPCK) < ConfBothTracks.confPIDKaonNsigmaReject.value) { + if (std::abs(nsigmaTPCK) < ConfPIDKaonNsigmaReject) { return true; - } else if (std::abs(nsigmaTPCPr) < ConfBothTracks.confPIDProtonNsigmaReject.value) { + } else if (std::abs(nsigmaTPCPr) < ConfPIDProtonNsigmaReject) { return true; } } if (mom > 0.5) { - if (std::hypot(nsigmaTOFK, nsigmaTPCK) < ConfBothTracks.confPIDKaonNsigmaReject.value) { + if (std::hypot(nsigmaTOFK, nsigmaTPCK) < ConfPIDKaonNsigmaReject) { return true; - } else if (std::hypot(nsigmaTOFPr, nsigmaTPCPr) < ConfBothTracks.confPIDProtonNsigmaReject.value) { + } else if (std::hypot(nsigmaTOFPr, nsigmaTPCPr) < ConfPIDProtonNsigmaReject) { return true; } else { return false; @@ -328,7 +317,7 @@ struct FemtoUniversePairTaskTrackPhi { bool isParticleNSigmaAccepted(float mom, float nsigmaTPCPr, float nsigmaTOFPr, float nsigmaTPCPi, float nsigmaTOFPi, float nsigmaTPCK, float nsigmaTOFK) { - switch (ConfTrack.confTrackPDGCode.value) { + switch (ConfTrackPDGCode) { case 2212: // Proton case -2212: // anty Proton return isProtonNSigma(mom, nsigmaTPCPr, nsigmaTOFPr); @@ -348,7 +337,7 @@ struct FemtoUniversePairTaskTrackPhi { bool isParticleNSigmaRejected(float mom, float nsigmaTPCPr, float nsigmaTOFPr, float nsigmaTPCPi, float nsigmaTOFPi, float nsigmaTPCK, float nsigmaTOFK) { - switch (ConfTrack.confTrackPDGCode.value) { + switch (ConfTrackPDGCode) { case 2212: // Proton case -2212: // anty Proton return isProtonRejected(mom, nsigmaTPCPi, nsigmaTOFPi, nsigmaTPCK, nsigmaTOFK); @@ -369,11 +358,11 @@ struct FemtoUniversePairTaskTrackPhi { void init(InitContext&) { if (effConfGroup.confEfficiencyDoMCTruth) { - hMCTruth1.init(&qaRegistry, confBinsTempFitVarpT, confBinsTempFitVarPDG, false, ConfTrack.confTrackPDGCode, false); - hMCTruth2.init(&qaRegistry, confBinsTempFitVarpT, confBinsTempFitVarPDG, false, 333, false); + hMCTruth1.init(&qaRegistry, ConfBinsTempFitVarpT, ConfBinsTempFitVarPDG, false, ConfTrackPDGCode, false); + hMCTruth2.init(&qaRegistry, ConfBinsTempFitVarpT, ConfBinsTempFitVarPDG, false, 333, false); } - if (ConfBothTracks.confIsMC) { - hTrackDCA.init(®istryDCA, confBinsTempFitVarpT, confBinsTempFitVar, true, ConfTrack.confTrackPDGCode, true); + if (ConfIsMC) { + hTrackDCA.init(®istryDCA, ConfBinsTempFitVarpT, ConfBinsTempFitVarDCA, true, ConfTrackPDGCode, true); } efficiencyCalculator.init(); @@ -434,21 +423,21 @@ struct FemtoUniversePairTaskTrackPhi { registryMCreco.add("MCrecoPhi", "MC reco Phi;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); registryMCreco.add("MCrecoPhiPt", "MC reco Phi; #it{p_T} (GeV/#it{c}); Counts", kTH1F, {{500, 0, 5}}); - trackHistoPartPhi.init(&qaRegistry, confBinsTempFitVarpT, confBinsTempFitVarInvMass, ConfBothTracks.confIsMC.value, 333); - trackHistoPartTrack.init(&qaRegistry, confBinsTempFitVarpT, confBinsTempFitVar, ConfBothTracks.confIsMC.value, ConfTrack.confTrackPDGCode.value); + trackHistoPartPhi.init(&qaRegistry, ConfBinsTempFitVarpT, ConfBinsTempFitVarInvMass, ConfIsMC, 333); + trackHistoPartTrack.init(&qaRegistry, ConfBinsTempFitVarpT, ConfBinsTempFitVar, ConfIsMC, ConfTrackPDGCode); mixQaRegistry.add("MixingQA/hSECollisionBins", ";bin;Entries", kTH1F, {{120, -0.5, 119.5}}); mixQaRegistry.add("MixingQA/hMECollisionBins", ";bin;Entries", kTH1F, {{120, -0.5, 119.5}}); - sameEventCont.init(&resultRegistry, confBinskstar, confBinsMult, confBinskT, confBinsmT, confBins3Dmult, confBins3DmT, ConfBothTracks.confBinsEta, ConfBothTracks.confBinsPhi, ConfBothTracks.confIsMC, ConfBothTracks.confUse3D); - mixedEventCont.init(&resultRegistry, confBinskstar, confBinsMult, confBinskT, confBinsmT, confBins3Dmult, confBins3DmT, ConfBothTracks.confBinsEta, ConfBothTracks.confBinsPhi, ConfBothTracks.confIsMC, ConfBothTracks.confUse3D); + sameEventCont.init(&resultRegistry, ConfBinskstar, ConfBinsMult, ConfBinskT, ConfBinsmT, ConfBins3Dmult, ConfBins3DmT, ConfBinsEta, ConfBinsPhi, ConfIsMC, ConfUse3D); + mixedEventCont.init(&resultRegistry, ConfBinskstar, ConfBinsMult, ConfBinskT, ConfBinsmT, ConfBins3Dmult, ConfBins3DmT, ConfBinsEta, ConfBinsPhi, ConfIsMC, ConfUse3D); - sameEventCont.setPDGCodes(333, ConfTrack.confTrackPDGCode.value); - mixedEventCont.setPDGCodes(333, ConfTrack.confTrackPDGCode.value); + sameEventCont.setPDGCodes(333, ConfTrackPDGCode); + mixedEventCont.setPDGCodes(333, ConfTrackPDGCode); pairCleaner.init(&qaRegistry); - if (ConfCPR.confCPRIsEnabled.value) { - pairCloseRejection.init(&resultRegistry, &qaRegistry, ConfCPR.confCPRdeltaPhiCutMin.value, ConfCPR.confCPRdeltaPhiCutMax.value, ConfCPR.confCPRdeltaEtaCutMin.value, ConfCPR.confCPRdeltaEtaCutMax.value, ConfCPR.confCPRChosenRadii.value, ConfCPR.confCPRPlotPerRadii.value, ConfCPR.confCPRInvMassCutMin.value, ConfCPR.confCPRInvMassCutMax.value); + if (ConfCPRIsEnabled) { + pairCloseRejection.init(&resultRegistry, &qaRegistry, ConfCPRdeltaPhiCutMin, ConfCPRdeltaPhiCutMax, ConfCPRdeltaEtaCutMin, ConfCPRdeltaEtaCutMax, ConfCPRChosenRadii, ConfCPRPlotPerRadii, ConfCPRInvMassCutMin, ConfCPRInvMassCutMax); } } @@ -516,13 +505,13 @@ struct FemtoUniversePairTaskTrackPhi { tpcNSigmaPr = trackCuts.getNsigmaTPC(track, o2::track::PID::Proton); tofNSigmaPr = trackCuts.getNsigmaTOF(track, o2::track::PID::Proton); - if (ConfTrack.confTrackIsIdentified.value) { + if (ConfTrackIsIdentified) { if (!isParticleNSigmaAccepted(track.p(), tpcNSigmaPr, tofNSigmaPr, tpcNSigmaPi, tofNSigmaPi, tpcNSigmaKa, tofNSigmaKa)) { continue; } } - if (ConfTrack.confTrackIsRejected.value) { + if (ConfTrackIsRejected) { if (isParticleNSigmaRejected(track.p(), tpcNSigmaPr, tofNSigmaPr, tpcNSigmaPi, tofNSigmaPi, tpcNSigmaKa, tofNSigmaKa)) { continue; } @@ -540,20 +529,20 @@ struct FemtoUniversePairTaskTrackPhi { /// Now build the combinations for (auto const& [track, phicandidate] : combinations(CombinationsFullIndexPolicy(groupPartsTrack, groupPartsPhi))) { - if (ConfTrack.confTrackIsIdentified.value) { + if (ConfTrackIsIdentified) { if (!isParticleNSigmaAccepted(track.p(), trackCuts.getNsigmaTPC(track, o2::track::PID::Proton), trackCuts.getNsigmaTOF(track, o2::track::PID::Proton), trackCuts.getNsigmaTPC(track, o2::track::PID::Pion), trackCuts.getNsigmaTOF(track, o2::track::PID::Pion), trackCuts.getNsigmaTPC(track, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(track, o2::track::PID::Kaon))) { continue; } } - if (ConfTrack.confTrackIsRejected.value) { + if (ConfTrackIsRejected) { if (isParticleNSigmaRejected(track.p(), trackCuts.getNsigmaTPC(track, o2::track::PID::Proton), trackCuts.getNsigmaTOF(track, o2::track::PID::Proton), trackCuts.getNsigmaTPC(track, o2::track::PID::Pion), trackCuts.getNsigmaTOF(track, o2::track::PID::Pion), trackCuts.getNsigmaTPC(track, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(track, o2::track::PID::Kaon))) { continue; } } // Close Pair Rejection - if (ConfCPR.confCPRIsEnabled.value) { + if (ConfCPRIsEnabled) { if (pairCloseRejection.isClosePair(track, phicandidate, parts, magFieldTesla, femto_universe_container::EventType::same)) { continue; } @@ -567,9 +556,9 @@ struct FemtoUniversePairTaskTrackPhi { weight = efficiencyCalculator.getWeight(ParticleNo::ONE, phicandidate) * efficiencyCalculator.getWeight(ParticleNo::TWO, track); if (swpart) - sameEventCont.setPair(track, phicandidate, multCol, ConfBothTracks.confUse3D.value, weight); + sameEventCont.setPair(track, phicandidate, multCol, ConfUse3D, weight); else - sameEventCont.setPair(phicandidate, track, multCol, ConfBothTracks.confUse3D.value, weight); + sameEventCont.setPair(phicandidate, track, multCol, ConfUse3D, weight); swpart = !swpart; } @@ -636,19 +625,19 @@ struct FemtoUniversePairTaskTrackPhi { fNeventsProcessed++; for (auto const& [track, phicandidate] : combinations(CombinationsFullIndexPolicy(groupPartsTrack, groupPartsPhi))) { - if (ConfTrack.confTrackIsIdentified.value) { + if (ConfTrackIsIdentified) { if (!isParticleNSigmaAccepted(track.p(), trackCuts.getNsigmaTPC(track, o2::track::PID::Proton), trackCuts.getNsigmaTOF(track, o2::track::PID::Proton), trackCuts.getNsigmaTPC(track, o2::track::PID::Pion), trackCuts.getNsigmaTOF(track, o2::track::PID::Pion), trackCuts.getNsigmaTPC(track, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(track, o2::track::PID::Kaon))) { continue; } } - if (ConfTrack.confTrackIsRejected.value) { + if (ConfTrackIsRejected) { if (isParticleNSigmaRejected(track.p(), trackCuts.getNsigmaTPC(track, o2::track::PID::Proton), trackCuts.getNsigmaTOF(track, o2::track::PID::Proton), trackCuts.getNsigmaTPC(track, o2::track::PID::Pion), trackCuts.getNsigmaTOF(track, o2::track::PID::Pion), trackCuts.getNsigmaTPC(track, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(track, o2::track::PID::Kaon))) { continue; } } - if (ConfCPR.confCPRIsEnabled.value) { + if (ConfCPRIsEnabled) { if (pairCloseRejection.isClosePair(track, phicandidate, parts, magFieldTesla, femto_universe_container::EventType::mixed)) { continue; } @@ -657,9 +646,9 @@ struct FemtoUniversePairTaskTrackPhi { weight = efficiencyCalculator.getWeight(ParticleNo::ONE, phicandidate) * efficiencyCalculator.getWeight(ParticleNo::TWO, track); if (swpart) - mixedEventCont.setPair(track, phicandidate, multCol, ConfBothTracks.confUse3D.value, weight); + mixedEventCont.setPair(track, phicandidate, multCol, ConfUse3D, weight); else - mixedEventCont.setPair(phicandidate, track, multCol, ConfBothTracks.confUse3D.value, weight); + mixedEventCont.setPair(phicandidate, track, multCol, ConfUse3D, weight); swpart = !swpart; } @@ -753,6 +742,8 @@ struct FemtoUniversePairTaskTrackPhi { if (mcPartId == -1) continue; // no MC particle const auto& mcpart = mcparts.iteratorAt(mcPartId); + if (isParticleNSigmaAccepted(part.p(), trackCuts.getNsigmaTPC(part, o2::track::PID::Proton), trackCuts.getNsigmaTOF(part, o2::track::PID::Proton), trackCuts.getNsigmaTPC(part, o2::track::PID::Pion), trackCuts.getNsigmaTOF(part, o2::track::PID::Pion), trackCuts.getNsigmaTPC(part, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(part, o2::track::PID::Kaon))) + hTrackDCA.fillQA(part); if ((part.partType() == aod::femtouniverseparticle::ParticleType::kPhi) && (mcpart.pdgMCTruth() == 333) && (mcpart.partOriginMCTruth() == aod::femtouniverse_mc_particle::ParticleOriginMCTruth::kPrimary)) { registryMCreco.fill(HIST("MCrecoPhi"), mcpart.pt(), mcpart.eta()); // phi registryMCreco.fill(HIST("MCrecoPhiPt"), mcpart.pt()); @@ -772,8 +763,7 @@ struct FemtoUniversePairTaskTrackPhi { registryMCreco.fill(HIST("MCrecoPnegPt"), mcpart.pt()); } } - if (isParticleNSigmaAccepted(part.p(), trackCuts.getNsigmaTPC(part, o2::track::PID::Proton), trackCuts.getNsigmaTOF(part, o2::track::PID::Proton), trackCuts.getNsigmaTPC(part, o2::track::PID::Pion), trackCuts.getNsigmaTOF(part, o2::track::PID::Pion), trackCuts.getNsigmaTPC(part, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(part, o2::track::PID::Kaon))) - hTrackDCA.fillQA(part); + } // partType kTrack } } From 5b78520d625d7f2d639bbbdb295a6c4bbf8521a4 Mon Sep 17 00:00:00 2001 From: alcaliva <32872606+alcaliva@users.noreply.github.com> Date: Thu, 27 Feb 2025 02:12:48 +0100 Subject: [PATCH 0442/1650] [PWGLF] removed coupling between v0 daughters and added DCA cuts for global tracks (#10209) --- .../QC/lfITSTPCMatchingSecondaryTracksQA.cxx | 110 +++++++----------- 1 file changed, 45 insertions(+), 65 deletions(-) diff --git a/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx b/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx index 4667bf133d0..c36dfcb4a8d 100644 --- a/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx +++ b/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx @@ -72,13 +72,15 @@ struct LfITSTPCMatchingSecondaryTracksQA { Configurable nsigmaTPCmax{"nsigmaTPCmax", +3.0f, "Maximum nsigma TPC"}; Configurable nsigmaTOFmin{"nsigmaTOFmin", -3.0f, "Minimum nsigma TOF"}; Configurable nsigmaTOFmax{"nsigmaTOFmax", +3.0f, "Maximum nsigma TOF"}; + Configurable dcaxyMax{"dcaxyMax", 0.1, "dcaxy max"}; + Configurable dcazMax{"dcazMax", 0.1, "dcaz max"}; Configurable requireTOF{"requireTOF", false, "require TOF hit"}; Configurable requireItsHits{"requireItsHits", false, "require ITS hits"}; - Configurable> requiredHit{"requiredHit", {0, 0, 0, 1, 1, 1, 1}, "required ITS Hits"}; + Configurable> requiredHit{"requiredHit", {0, 0, 0, 0, 0, 0, 0}, "required ITS Hits (1=required, 0=not required)"}; // V0 Parameters - Configurable minimumV0Radius{"minimumV0Radius", 0.5f, "Minimum V0 Radius"}; - Configurable maximumV0Radius{"maximumV0Radius", 40.0f, "Maximum V0 Radius"}; + Configurable minimumV0Radius{"minimumV0Radius", 0.0f, "Minimum V0 Radius"}; + Configurable maximumV0Radius{"maximumV0Radius", 100.0f, "Maximum V0 Radius"}; Configurable dcanegtoPVmin{"dcanegtoPVmin", 0.1f, "Minimum DCA Neg To PV"}; Configurable dcapostoPVmin{"dcapostoPVmin", 0.1f, "Minimum DCA Pos To PV"}; Configurable v0cospaMin{"v0cospaMin", 0.99f, "Minimum V0 CosPA"}; @@ -112,6 +114,27 @@ struct LfITSTPCMatchingSecondaryTracksQA { return (itsClsmap & testBit); } + template + bool passedTrackSelectionTpcGlobal(const TpcTrackGlo& track) + { + if (!track.hasTPC()) + return false; + if (track.tpcNClsCrossedRows() < minNCrossedRowsTPC) + return false; + if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < minNCrossedRowsOverFindable) + return false; + if (track.tpcChi2NCl() > maxChi2TPC) + return false; + if (track.eta() < etaMin || track.eta() > etaMax) + return false; + if (std::fabs(track.dcaXY()) > dcaxyMax) + return false; + if (std::fabs(track.dcaZ()) > dcazMax) + return false; + + return true; + } + template bool passedTrackSelectionTpc(const TpcTrack& track) { @@ -119,7 +142,7 @@ struct LfITSTPCMatchingSecondaryTracksQA { return false; if (track.tpcNClsCrossedRows() < minNCrossedRowsTPC) return false; - if ((track.tpcNClsCrossedRows() / track.tpcNClsFindable()) < minNCrossedRowsOverFindable) + if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < minNCrossedRowsOverFindable) return false; if (track.tpcChi2NCl() > maxChi2TPC) return false; @@ -182,7 +205,6 @@ struct LfITSTPCMatchingSecondaryTracksQA { } } } - return true; } @@ -197,7 +219,7 @@ struct LfITSTPCMatchingSecondaryTracksQA { for (const auto& track : tracks) { - if (!passedTrackSelectionTpc(track)) + if (!passedTrackSelectionTpcGlobal(track)) continue; if (!passedPionSelection(track)) continue; @@ -217,25 +239,17 @@ struct LfITSTPCMatchingSecondaryTracksQA { if (!passedK0ShortSelection(v0)) continue; - if (!passedTrackSelectionTpc(posTrack)) - continue; - if (!passedTrackSelectionTpc(negTrack)) - continue; - if (!passedPionSelection(posTrack)) - continue; - if (!passedPionSelection(negTrack)) - continue; + if (passedTrackSelectionTpc(posTrack) && passedPionSelection(posTrack)) + registryData.fill(HIST("secPionTPC"), posTrack.pt(), posTrack.eta(), TVector2::Phi_0_2pi(posTrack.phi())); - registryData.fill(HIST("secPionTPC"), posTrack.pt(), posTrack.eta(), TVector2::Phi_0_2pi(posTrack.phi())); - registryData.fill(HIST("secPionTPC"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); + if (passedTrackSelectionTpc(negTrack) && passedPionSelection(negTrack)) + registryData.fill(HIST("secPionTPC"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); - if (!passedTrackSelectionIts(posTrack)) - continue; - registryData.fill(HIST("secPionTPC_ITS"), posTrack.pt(), posTrack.eta(), TVector2::Phi_0_2pi(posTrack.phi())); + if (passedTrackSelectionTpc(posTrack) && passedPionSelection(posTrack) && passedTrackSelectionIts(posTrack)) + registryData.fill(HIST("secPionTPC_ITS"), posTrack.pt(), posTrack.eta(), TVector2::Phi_0_2pi(posTrack.phi())); - if (!passedTrackSelectionIts(negTrack)) - continue; - registryData.fill(HIST("secPionTPC_ITS"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); + if (passedTrackSelectionTpc(negTrack) && passedPionSelection(negTrack) && passedTrackSelectionIts(negTrack)) + registryData.fill(HIST("secPionTPC_ITS"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); } } PROCESS_SWITCH(LfITSTPCMatchingSecondaryTracksQA, processData, "Process data", true); @@ -256,15 +270,10 @@ struct LfITSTPCMatchingSecondaryTracksQA { auto tracksPerColl = mcTracks.sliceBy(perCollisionTrk, collision.globalIndex()); for (const auto& track : tracksPerColl) { - if (!passedTrackSelectionTpc(track)) + if (!passedTrackSelectionTpcGlobal(track)) continue; if (!passedPionSelection(track)) continue; - if (!track.has_mcParticle()) - continue; - const auto particle = track.mcParticle(); - if (std::fabs(particle.pdgCode()) != 211) - continue; registryMC.fill(HIST("gloPionTPC_MC"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); if (!passedTrackSelectionIts(track)) @@ -279,47 +288,18 @@ struct LfITSTPCMatchingSecondaryTracksQA { const auto& negTrack = v0.negTrack_as(); if (!passedK0ShortSelection(v0)) continue; - if (!passedTrackSelectionTpc(posTrack)) - continue; - if (!passedTrackSelectionTpc(negTrack)) - continue; - if (!passedPionSelection(posTrack)) - continue; - if (!passedPionSelection(negTrack)) - continue; - if (!posTrack.has_mcParticle()) - continue; - if (!negTrack.has_mcParticle()) - continue; - auto posParticle = posTrack.mcParticle_as(); - auto negParticle = negTrack.mcParticle_as(); - if (!posParticle.has_mothers()) - continue; - if (!negParticle.has_mothers()) - continue; + if (passedTrackSelectionTpc(posTrack) && passedPionSelection(posTrack)) + registryMC.fill(HIST("secPionTPC_MC"), posTrack.pt(), posTrack.eta(), TVector2::Phi_0_2pi(posTrack.phi())); - int pdgParent(0); - for (const auto& particleMotherOfNeg : negParticle.mothers_as()) { - for (const auto& particleMotherOfPos : posParticle.mothers_as()) { - if (particleMotherOfNeg == particleMotherOfPos) { - pdgParent = particleMotherOfNeg.pdgCode(); - } - } - } - if (pdgParent != 310) - continue; - - registryMC.fill(HIST("secPionTPC_MC"), posTrack.pt(), posTrack.eta(), TVector2::Phi_0_2pi(posTrack.phi())); - registryMC.fill(HIST("secPionTPC_MC"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); + if (passedTrackSelectionTpc(negTrack) && passedPionSelection(negTrack)) + registryMC.fill(HIST("secPionTPC_MC"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); - if (!passedTrackSelectionIts(posTrack)) - continue; - registryMC.fill(HIST("secPionTPC_ITS_MC"), posTrack.pt(), posTrack.eta(), TVector2::Phi_0_2pi(posTrack.phi())); + if (passedTrackSelectionTpc(posTrack) && passedPionSelection(posTrack) && passedTrackSelectionIts(posTrack)) + registryMC.fill(HIST("secPionTPC_ITS_MC"), posTrack.pt(), posTrack.eta(), TVector2::Phi_0_2pi(posTrack.phi())); - if (!passedTrackSelectionIts(negTrack)) - continue; - registryMC.fill(HIST("secPionTPC_ITS_MC"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); + if (passedTrackSelectionTpc(negTrack) && passedPionSelection(negTrack) && passedTrackSelectionIts(negTrack)) + registryMC.fill(HIST("secPionTPC_ITS_MC"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); } } } From f9b878eda80f8e43c9325713ef420a1184269892 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Thu, 27 Feb 2025 03:33:12 +0100 Subject: [PATCH 0443/1650] [PWGLF] Add kaon hypothesis in PID (#10213) --- PWGLF/Tasks/Resonances/highmasslambda.cxx | 248 +++------------------- 1 file changed, 35 insertions(+), 213 deletions(-) diff --git a/PWGLF/Tasks/Resonances/highmasslambda.cxx b/PWGLF/Tasks/Resonances/highmasslambda.cxx index 8be828ee392..c799c1d0ba7 100644 --- a/PWGLF/Tasks/Resonances/highmasslambda.cxx +++ b/PWGLF/Tasks/Resonances/highmasslambda.cxx @@ -153,11 +153,11 @@ struct highmasslambda { using EventCandidates = soa::Filtered>; - using TrackCandidates = soa::Filtered>; + using TrackCandidates = soa::Filtered>; using AllTrackCandidates = soa::Join; using ResoV0s = aod::V0Datas; - using TrackCandidatesSvx = soa::Filtered>; + using TrackCandidatesSvx = soa::Filtered>; using AllTrackCandidatesSvx = soa::Join; using ResoV0sSvx = soa::Join; @@ -179,6 +179,7 @@ struct highmasslambda { std::vector ptV0Binning = {0.0, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1.0, 1.5, 100.0}; std::vector dcaBetweenV0 = {0.0, 0.05, 0.1, 0.15, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1.0}; std::vector dcaBetweenProtonV0 = {-2.0, -1.0, -0.5, -0.4, -0.3, -0.2, -0.18, -0.16, -0.14, -0.12, -0.1, -0.08, -0.06, -0.05, -0.04, -0.03, -0.025, -0.02, -0.01, -0.005, -0.004, -0.003, -0.003, -0.002, -0.001, 0.0, 0.001, 0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.01, 0.012, 0.014, 0.016, 0.018, 0.02, 0.025, 0.03, 0.04, 0.05, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2, 0.3, 0.4, 0.5, 1.0, 2.0}; + std::vector nsigmaKaon = {-0.1, 0.0, 0.005, 0.01, 0.03, 0.05, 0.1, 0.15, 0.2, 0.5, 0.8, 1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 4.5, 5.0, 6.0, 8.0, 10.0, 20.0, 100.0, 1000.0}; AxisSpec resAxis = {1600, -30, 30, "Res"}; AxisSpec phiAxis = {500, -6.28, 6.28, "phi"}; AxisSpec centAxis = {8, 0, 80, "V0M (%)"}; @@ -209,8 +210,8 @@ struct highmasslambda { histos.add("hOccupancy", "Occupancy", kTH1F, {{5000, -0.5, 50000.5}}); histos.add("hRotation", "hRotation", kTH1F, {{360, 0.0, 2.0 * TMath::Pi()}}); histos.add("hEta", "Eta distribution", kTH1F, {{200, -1.0f, 1.0f}}); - histos.add("hDcaxy", "Dcaxy distribution", kTH1F, {{1000, -0.5f, 0.5f}}); - histos.add("hDcaz", "Dcaz distribution", kTH1F, {{1000, -0.5f, 0.5f}}); + histos.add("hDcaxy", "Dcaxy distribution", kTH2F, {{1000, -0.5f, 0.5f}, {100, 0.0f, 10.0f}}); + histos.add("hDcaz", "Dcaz distribution", kTH2F, {{1000, -0.5f, 0.5f}, {100, 0.0f, 10.0f}}); histos.add("hNsigmaProtonITS", "NsigmaProton ITS distribution", kTH2F, {{100, -5.0f, 5.0f}, {60, 0.0f, 6.0f}}); histos.add("hNsigmaProtonTPC", "NsigmaProton TPC distribution", kTH2F, {{100, -5.0f, 5.0f}, {60, 0.0f, 6.0f}}); histos.add("hNsigmaProtonTOF", "NsigmaProton TOF distribution", kTH2F, {{1000, -50.0f, 50.0f}, {60, 0.0f, 6.0f}}); @@ -237,8 +238,8 @@ struct highmasslambda { histos.add("hSparseV2SAMixedEvent_V2", "hSparseV2SAMixedEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, dcaV0toPVBinning, cpaV0Binning, ptV0Binning, dcaBetweenV0, dcaBetweenProtonV0}); } if (useKshortOpti == 2) { - histos.add("hSparseV2SASameEvent_V2", "hSparseV2SASameEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisDCA, dcaV0toPVBinning}); - histos.add("hSparseV2SAMixedEvent_V2", "hSparseV2SAMixedEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisDCA, dcaV0toPVBinning}); + histos.add("hSparseV2SASameEvent_V2", "hSparseV2SASameEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisDCA, nsigmaKaon}); + histos.add("hSparseV2SAMixedEvent_V2", "hSparseV2SAMixedEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisDCA, nsigmaKaon}); } // histogram for resolution histos.add("ResFT0CTPC", "ResFT0CTPC", kTH2F, {centAxis, resAxis}); @@ -269,6 +270,9 @@ struct highmasslambda { if (!(candidate.isGlobalTrackWoDCA() && candidate.itsNCls() > cfgITScluster && candidate.tpcNClsCrossedRows() > cfgTPCcluster)) { return false; } + if (std::abs(candidate.dcaXY()) > (0.0105 + (0.035 / TMath::Power(candidate.pt(), 1.1)))) { + return false; + } if (candidate.pt() > 0.0 && candidate.pt() < 0.5 && std::abs(candidate.dcaXY()) < cfgCutDCAxymin1) { return false; } @@ -292,10 +296,10 @@ struct highmasslambda { bool selectionPID1(const T& candidate) { if (candidate.hasTOF()) { - if (candidate.p() < 0.5 && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { + if (candidate.pt() < 0.7 && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { return true; } - if (candidate.p() >= 0.5 && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC && std::abs(candidate.tofNSigmaPr()) < nsigmaCutTOF) { + if (candidate.p() >= 0.7 && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC && std::abs(candidate.tofNSigmaPr()) < nsigmaCutTOF) { return true; } } @@ -306,207 +310,6 @@ struct highmasslambda { } return false; } - - // TPC TOF - template - bool selectionPID2(const T& candidate) - { - if (candidate.pt() < 0.7 && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { - return true; - } - if (candidate.pt() >= 0.7 && candidate.pt() < 1.4) { - if (candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC && std::abs(candidate.tofNSigmaPr()) < nsigmaCutTOF) { - return true; - } - if (!candidate.hasTOF()) { - if (candidate.pt() >= 0.7 && candidate.pt() < 0.8 && candidate.tpcNSigmaPr() > -1.8 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { - return true; - } - if (candidate.pt() >= 0.8 && candidate.pt() < 0.9 && candidate.tpcNSigmaPr() > -1.7 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { - return true; - } - if (candidate.pt() >= 0.9 && candidate.pt() < 1.0 && candidate.tpcNSigmaPr() > -1.6 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { - return true; - } - if (candidate.pt() >= 1.0 && candidate.pt() < 1.4 && candidate.tpcNSigmaPr() > -1.0 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { - return true; - } - } - } - if (candidate.pt() >= 1.4) { - if (candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC && std::abs(candidate.tofNSigmaPr()) < nsigmaCutTOF) { - return true; - } - if (!candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { - return true; - } - } - return false; - } - - // TPC TOF - template - bool selectionPID3(const T& candidate) - { - if (candidate.pt() < 0.7 && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { - return true; - } - if (candidate.pt() >= 0.7 && candidate.pt() < 1.8) { - if (candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC && std::abs(candidate.tofNSigmaPr()) < nsigmaCutTOF) { - return true; - } - if (!candidate.hasTOF()) { - if (candidate.pt() >= 0.7 && candidate.pt() < 0.8 && candidate.tpcNSigmaPr() > -1.8 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { - return true; - } - if (candidate.pt() >= 0.8 && candidate.pt() < 0.9 && candidate.tpcNSigmaPr() > -1.7 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { - return true; - } - if (candidate.pt() >= 0.9 && candidate.pt() < 1.0 && candidate.tpcNSigmaPr() > -1.6 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { - return true; - } - } - } - if (candidate.pt() >= 1.8) { - if (candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC && std::abs(candidate.tofNSigmaPr()) < nsigmaCutTOF) { - return true; - } - if (!candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { - return true; - } - } - return false; - } - - // TPC TOF - template - bool selectionPID4(const T& candidate) - { - if (candidate.pt() < 0.7 && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { - return true; - } - if (candidate.pt() >= 0.7 && candidate.pt() < 1.4) { - if (candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC && std::abs(candidate.tofNSigmaPr()) < nsigmaCutTOF) { - return true; - } - if (!candidate.hasTOF()) { - if (candidate.pt() >= 0.7 && candidate.pt() < 0.8 && candidate.tpcNSigmaPr() > -1.8 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { - return true; - } - if (candidate.pt() >= 0.8 && candidate.pt() < 0.9 && candidate.tpcNSigmaPr() > -1.7 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { - return true; - } - if (candidate.pt() >= 0.9 && candidate.pt() < 1.0 && candidate.tpcNSigmaPr() > -1.6 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { - return true; - } - if (candidate.pt() >= 1.0 && candidate.pt() < 1.4 && candidate.tpcNSigmaPr() > -1.0 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { - return true; - } - } - } - if (candidate.pt() >= 1.4) { - if (candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { - if (candidate.pt() < 2.5 && std::abs(candidate.tofNSigmaPr()) < nsigmaCutTOF) { - return true; - } - if (candidate.pt() >= 2.5 && candidate.pt() < 4 && candidate.tofNSigmaPr() > -2.0 && candidate.tofNSigmaPr() < nsigmaCutTOF) { - return true; - } - if (candidate.pt() >= 4 && candidate.pt() < 5 && candidate.tofNSigmaPr() > -1.5 && candidate.tofNSigmaPr() < nsigmaCutTOF) { - return true; - } - if (candidate.pt() >= 5 && candidate.tofNSigmaPr() > -1.0 && candidate.tofNSigmaPr() < nsigmaCutTOF) { - return true; - } - } - if (!candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { - return true; - } - } - return false; - } - - // TPC TOF - template - bool selectionPID5(const T& candidate) - { - if (candidate.pt() < 0.7 && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { - return true; - } - if (candidate.pt() >= 0.7 && candidate.pt() < 1.8) { - if (candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC && std::abs(candidate.tofNSigmaPr()) < nsigmaCutTOF) { - return true; - } - if (!candidate.hasTOF()) { - if (candidate.pt() >= 0.7 && candidate.pt() < 0.8 && candidate.tpcNSigmaPr() > -1.8 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { - return true; - } - if (candidate.pt() >= 0.8 && candidate.pt() < 0.9 && candidate.tpcNSigmaPr() > -1.7 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { - return true; - } - if (candidate.pt() >= 0.9 && candidate.pt() < 1.0 && candidate.tpcNSigmaPr() > -1.6 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { - return true; - } - } - } - if (candidate.pt() >= 1.8) { - if (candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { - if (candidate.pt() < 2.5 && std::abs(candidate.tofNSigmaPr()) < nsigmaCutTOF) { - return true; - } - if (candidate.pt() >= 2.5 && candidate.pt() < 4 && candidate.tofNSigmaPr() > -2.0 && candidate.tofNSigmaPr() < nsigmaCutTOF) { - return true; - } - if (candidate.pt() >= 4 && candidate.pt() < 5 && candidate.tofNSigmaPr() > -1.5 && candidate.tofNSigmaPr() < nsigmaCutTOF) { - return true; - } - if (candidate.pt() >= 5 && candidate.tofNSigmaPr() > -1.0 && candidate.tofNSigmaPr() < nsigmaCutTOF) { - return true; - } - } - if (!candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { - return true; - } - } - return false; - } - // TPC TOF - template - bool selectionPID6(const T& candidate) - { - if (candidate.pt() < 0.7 && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { - return true; - } - if (candidate.pt() >= 0.7) { - if (candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < nsigmaCutTPC) { - if (candidate.pt() < 2.5 && std::abs(candidate.tofNSigmaPr()) < nsigmaCutTOF) { - return true; - } - if (candidate.pt() >= 2.5 && candidate.pt() < 4 && candidate.tofNSigmaPr() > -2.0 && candidate.tofNSigmaPr() < nsigmaCutTOF) { - return true; - } - if (candidate.pt() >= 4 && candidate.pt() < 5 && candidate.tofNSigmaPr() > -1.5 && candidate.tofNSigmaPr() < nsigmaCutTOF) { - return true; - } - if (candidate.pt() >= 5 && candidate.tofNSigmaPr() > -1.0 && candidate.tofNSigmaPr() < nsigmaCutTOF) { - return true; - } - } - if (!candidate.hasTOF()) { - if (candidate.pt() >= 0.7 && candidate.pt() < 0.8 && candidate.tpcNSigmaPr() > -1.8 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { - return true; - } - if (candidate.pt() >= 0.8 && candidate.pt() < 0.9 && candidate.tpcNSigmaPr() > -1.7 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { - return true; - } - if (candidate.pt() >= 0.9 && candidate.pt() < 1.0 && candidate.tpcNSigmaPr() > -1.6 && candidate.tpcNSigmaPr() < nsigmaCutTPC) { - return true; - } - } - } - return false; - } - // TPC TOF template bool selectionPID7(const T& candidate) @@ -650,6 +453,19 @@ struct highmasslambda { return false; } + template + double combinekaon(const T& candidate) + { + if (candidate.pt() < 0.7) { + return std::abs(candidate.tpcNSigmaKa()); + } else if (candidate.pt() >= 0.7 && candidate.hasTOF()) { + return std::sqrt((candidate.tofNSigmaKa() * candidate.tofNSigmaKa() + candidate.tpcNSigmaKa() * candidate.tpcNSigmaKa()) / 2.0); + } else if (candidate.pt() >= 0.7 && !candidate.hasTOF()) { + return std::abs(candidate.tpcNSigmaKa()); + } + return -0.1; + } + template bool SelectionV0(Collision const& collision, V0 const& candidate) { @@ -803,9 +619,12 @@ struct highmasslambda { if (PIDstrategy == 3 && !selectionPID10(track1)) { continue; } + if (PIDstrategy == 4 && !selectionPID1(track1)) { + continue; + } histos.fill(HIST("hEta"), track1.eta()); - histos.fill(HIST("hDcaxy"), track1.dcaXY()); - histos.fill(HIST("hDcaz"), track1.dcaZ()); + histos.fill(HIST("hDcaxy"), track1.dcaXY(), track1.pt()); + histos.fill(HIST("hDcaz"), track1.dcaZ(), track1.pt()); histos.fill(HIST("hNsigmaProtonTPC"), track1.tpcNSigmaPr(), track1.pt()); if (track1.hasTOF()) { histos.fill(HIST("hNsigmaProtonTOF"), track1.tofNSigmaPr(), track1.pt()); @@ -868,7 +687,7 @@ struct highmasslambda { histos.fill(HIST("hSparseV2SASameEvent_V2"), Lambdac.M(), Lambdac.Pt(), dcaV0toPV, cpaV0, ptV0, dcaV0Daughters, dcaProtonV0); } if (useKshortOpti == 2) { - histos.fill(HIST("hSparseV2SASameEvent_V2"), Lambdac.M(), Lambdac.Pt(), v2, std::abs(track1.dcaXY()), dcaV0toPV); + histos.fill(HIST("hSparseV2SASameEvent_V2"), Lambdac.M(), Lambdac.Pt(), v2, std::abs(track1.dcaXY()), combinekaon(track1)); } } if (fillRotation) { @@ -959,6 +778,9 @@ struct highmasslambda { if (PIDstrategy == 3 && !selectionPID10(track1)) { continue; } + if (PIDstrategy == 4 && !selectionPID1(track1)) { + continue; + } if (!SelectionV0(collision2, v0)) { continue; } @@ -997,7 +819,7 @@ struct highmasslambda { histos.fill(HIST("hSparseV2SAMixedEvent_V2"), Lambdac.M(), Lambdac.Pt(), dcaV0toPV, cpaV0, ptV0, dcaV0Daughters, dcaProtonV0); } if (useKshortOpti == 2) { - histos.fill(HIST("hSparseV2SAMixedEvent_V2"), Lambdac.M(), Lambdac.Pt(), v2, std::abs(track1.dcaXY()), dcaV0toPV); + histos.fill(HIST("hSparseV2SAMixedEvent_V2"), Lambdac.M(), Lambdac.Pt(), v2, std::abs(track1.dcaXY()), combinekaon(track1)); } } } From 9ef3d4ebf3baf2252f4ff4c697410f874f4661b5 Mon Sep 17 00:00:00 2001 From: fuchuncui <162277233+fuchuncui@users.noreply.github.com> Date: Thu, 27 Feb 2025 15:15:07 +0800 Subject: [PATCH 0444/1650] [PWGCF] calculate and apply V0s and cascades local density efficiency (#10197) --- PWGCF/Flow/Tasks/CMakeLists.txt | 9 +- PWGCF/Flow/Tasks/flowEfficiencyCasc.cxx | 253 ++++++++++++++++++ ...{flowGFWOmegaXi.cxx => flowGfwOmegaXi.cxx} | 138 ++++++---- 3 files changed, 353 insertions(+), 47 deletions(-) create mode 100644 PWGCF/Flow/Tasks/flowEfficiencyCasc.cxx rename PWGCF/Flow/Tasks/{flowGFWOmegaXi.cxx => flowGfwOmegaXi.cxx} (89%) diff --git a/PWGCF/Flow/Tasks/CMakeLists.txt b/PWGCF/Flow/Tasks/CMakeLists.txt index 3a00f2b5956..c62480f8d79 100644 --- a/PWGCF/Flow/Tasks/CMakeLists.txt +++ b/PWGCF/Flow/Tasks/CMakeLists.txt @@ -54,8 +54,8 @@ o2physics_add_dpl_workflow(flow-pbpb-pikp PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::GFWCore COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(flow-gfw-omegaxi - SOURCES flowGFWOmegaXi.cxx +o2physics_add_dpl_workflow(flow-gfw-omega-xi + SOURCES flowGfwOmegaXi.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::GFWCore COMPONENT_NAME Analysis) @@ -73,3 +73,8 @@ o2physics_add_dpl_workflow(resonances-gfw-flow SOURCES resonancesGfwFlow.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::GFWCore COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(flow-efficiency-casc + SOURCES flowEfficiencyCasc.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::GFWCore + COMPONENT_NAME Analysis) diff --git a/PWGCF/Flow/Tasks/flowEfficiencyCasc.cxx b/PWGCF/Flow/Tasks/flowEfficiencyCasc.cxx new file mode 100644 index 00000000000..2dc6f8f51ce --- /dev/null +++ b/PWGCF/Flow/Tasks/flowEfficiencyCasc.cxx @@ -0,0 +1,253 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// +/// \file flowEfficiencyCasc.cxx +/// \author Fuchun Cui(fcui@cern.ch) +/// \since Feb/21/2025 +/// \brief This task is to calculate V0s and cascades local density efficiency + +#include +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/EventSelection.h" +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/ASoAHelpers.h" +#include "Common/Core/TrackSelection.h" +#include "Common/Core/TrackSelectionDefaults.h" +#include "Common/DataModel/PIDResponse.h" +#include "PWGLF/DataModel/cascqaanalysis.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" +#include "PWGLF/DataModel/LFStrangenessPIDTables.h" +#include "CommonConstants/PhysicsConstants.h" +#include + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +#define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable NAME{#NAME, DEFAULT, HELP}; + +struct FlowEfficiencyCasc { + O2_DEFINE_CONFIGURABLE(cfgCutVertex, float, 10.0f, "Accepted z-vertex range") + O2_DEFINE_CONFIGURABLE(cfgCutPtMin, float, 0.2f, "Minimal pT for tracks") + O2_DEFINE_CONFIGURABLE(cfgCutPtMax, float, 3.0f, "Maximal pT for tracks") + O2_DEFINE_CONFIGURABLE(cfgCutEta, float, 0.8f, "Eta range for tracks") + O2_DEFINE_CONFIGURABLE(cfgCutChi2prTPCcls, float, 2.5f, "max chi2 per TPC clusters") + // topological cut for V0 + O2_DEFINE_CONFIGURABLE(cfgv0_radius, float, 5.0f, "minimum decay radius") + O2_DEFINE_CONFIGURABLE(cfgv0_v0cospa, float, 0.995f, "minimum cosine of pointing angle") + O2_DEFINE_CONFIGURABLE(cfgv0_dcadautopv, float, 0.1f, "minimum daughter DCA to PV") + O2_DEFINE_CONFIGURABLE(cfgv0_dcav0dau, float, 0.5f, "maximum DCA among V0 daughters") + O2_DEFINE_CONFIGURABLE(cfgv0_mk0swindow, float, 0.1f, "Invariant mass window of K0s") + O2_DEFINE_CONFIGURABLE(cfgv0_mlambdawindow, float, 0.04f, "Invariant mass window of lambda") + O2_DEFINE_CONFIGURABLE(cfgv0_ArmPodocut, float, 0.2f, "Armenteros Podolski cut for K0") + // topological cut for cascade + O2_DEFINE_CONFIGURABLE(cfgcasc_radius, float, 0.5f, "minimum decay radius") + O2_DEFINE_CONFIGURABLE(cfgcasc_casccospa, float, 0.999f, "minimum cosine of pointing angle") + O2_DEFINE_CONFIGURABLE(cfgcasc_v0cospa, float, 0.998f, "minimum cosine of pointing angle") + O2_DEFINE_CONFIGURABLE(cfgcasc_dcav0topv, float, 0.01f, "minimum daughter DCA to PV") + O2_DEFINE_CONFIGURABLE(cfgcasc_dcabachtopv, float, 0.01f, "minimum bachelor DCA to PV") + O2_DEFINE_CONFIGURABLE(cfgcasc_dcacascdau, float, 0.3f, "maximum DCA among cascade daughters") + O2_DEFINE_CONFIGURABLE(cfgcasc_dcav0dau, float, 1.0f, "maximum DCA among V0 daughters") + O2_DEFINE_CONFIGURABLE(cfgcasc_mlambdawindow, float, 0.04f, "Invariant mass window of lambda") + // track quality and type selections + O2_DEFINE_CONFIGURABLE(cfgtpcclusters, int, 70, "minimum number of TPC clusters requirement") + O2_DEFINE_CONFIGURABLE(cfgitsclusters, int, 1, "minimum number of ITS clusters requirement") + O2_DEFINE_CONFIGURABLE(cfgtpcclufindable, int, 1, "minimum number of findable TPC clusters") + O2_DEFINE_CONFIGURABLE(cfgtpccrossoverfindable, int, 1, "minimum number of Ratio crossed rows over findable clusters") + O2_DEFINE_CONFIGURABLE(cfgcheckDauTPC, bool, true, "check daughter tracks TPC or not") + O2_DEFINE_CONFIGURABLE(cfgcheckDauTOF, bool, false, "check daughter tracks TOF or not") + O2_DEFINE_CONFIGURABLE(cfgCasc_rapidity, float, 0.5, "rapidity") + + O2_DEFINE_CONFIGURABLE(cfgNSigmatpctof, std::vector, (std::vector{3, 3, 3}), "tpc and tof NSigma for Pion Kaon Proton") + + ConfigurableAxis cfgaxisPt{"cfgaxisPt", {VARIABLE_WIDTH, 0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50, 0.55, 0.60, 0.65, 0.70, 0.75, 0.80, 0.85, 0.90, 0.95, 1.00, 1.10, 1.20, 1.30, 1.40, 1.50, 1.60, 1.70, 1.80, 1.90, 2.00, 2.20, 2.40, 2.60, 2.80, 3.00, 3.50, 4.00, 4.50, 5.00, 5.50, 6.00, 10.0}, "pt (GeV)"}; + ConfigurableAxis cfgaxisPtXi{"cfgaxisPtXi", {VARIABLE_WIDTH, 0, 0.1, 0.5, 0.9, 1.1, 1.3, 1.5, 1.7, 1.9, 2.1, 2.3, 2.5, 2.7, 2.9, 3.9, 4.9, 5.9, 9.9}, "pt (GeV)"}; + ConfigurableAxis cfgaxisPtOmega{"cfgaxisPtOmega", {VARIABLE_WIDTH, 0, 0.1, 0.5, 0.9, 1.1, 1.3, 1.5, 1.7, 1.9, 2.1, 2.3, 2.5, 2.7, 2.9, 3.9, 4.9, 5.9, 9.9}, "pt (GeV)"}; + ConfigurableAxis cfgaxisPtV0{"cfgaxisPtV0", {VARIABLE_WIDTH, 0, 0.1, 0.5, 0.9, 1.1, 1.3, 1.5, 1.7, 1.9, 2.1, 2.3, 2.5, 2.7, 2.9, 3.9, 4.9, 5.9, 9.9}, "pt (GeV)"}; + ConfigurableAxis cfgaxisMultiplicity{"cfgaxisMultiplicity", {1000, 0, 5000}, "Nch"}; + + using MyCollisions = soa::Join; + using MyMcCollisions = soa::Join; + using CascMCCandidates = soa::Join; + using V0MCCandidates = soa::Join; + using DaughterTracks = soa::Join; + + // Define the output + HistogramRegistry registry{"registry"}; + + std::vector cfgNSigma = cfgNSigmatpctof; + + void init(InitContext const&) + { + const AxisSpec axisCounter{1, 0, +1, ""}; + // create histograms + registry.add("eventCounter", "eventCounter", kTH1F, {axisCounter}); + registry.add("mcEventCounter", "Monte Carlo Truth EventCounter", kTH1F, {axisCounter}); + + registry.add("h2DGenK0s", "", {HistType::kTH2D, {cfgaxisPtV0, cfgaxisMultiplicity}}); + registry.add("h2DGenLambda", "", {HistType::kTH2D, {cfgaxisPtV0, cfgaxisMultiplicity}}); + registry.add("h2DGenXi", "", {HistType::kTH2D, {cfgaxisPtXi, cfgaxisMultiplicity}}); + registry.add("h2DGenOmega", "", {HistType::kTH2D, {cfgaxisPtOmega, cfgaxisMultiplicity}}); + registry.add("h2DRecK0s", "", {HistType::kTH2D, {cfgaxisPtV0, cfgaxisMultiplicity}}); + registry.add("h2DRecLambda", "", {HistType::kTH2D, {cfgaxisPtV0, cfgaxisMultiplicity}}); + registry.add("h2DRecXi", "", {HistType::kTH2D, {cfgaxisPtXi, cfgaxisMultiplicity}}); + registry.add("h2DRecOmega", "", {HistType::kTH2D, {cfgaxisPtOmega, cfgaxisMultiplicity}}); + } + + void processRec(MyCollisions::iterator const& collision, V0MCCandidates const& V0s, CascMCCandidates const& Cascades, DaughterTracks const&, soa::Join const&, soa::Join const&) + { + registry.fill(HIST("eventCounter"), 0.5); + if (!collision.sel8()) + return; + int rectracknum = collision.multNTracksGlobal(); + for (const auto& casc : Cascades) { + if (!casc.has_cascMCCore()) + continue; + auto negdau = casc.negTrackExtra_as(); + auto posdau = casc.posTrackExtra_as(); + auto bachelor = casc.bachTrackExtra_as(); + // track quality check + if (bachelor.tpcNClsFound() < cfgtpcclusters) + continue; + if (posdau.tpcNClsFound() < cfgtpcclusters) + continue; + if (negdau.tpcNClsFound() < cfgtpcclusters) + continue; + if (bachelor.itsNCls() < cfgitsclusters) + continue; + if (posdau.itsNCls() < cfgitsclusters) + continue; + if (negdau.itsNCls() < cfgitsclusters) + continue; + // topological cut + if (casc.cascradius() < cfgcasc_radius) + continue; + if (casc.casccosPA(collision.posX(), collision.posY(), collision.posZ()) < cfgcasc_casccospa) + continue; + if (casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ()) < cfgcasc_v0cospa) + continue; + if (std::fabs(casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ())) < cfgcasc_dcav0topv) + continue; + if (std::fabs(casc.dcabachtopv()) < cfgcasc_dcabachtopv) + continue; + if (casc.dcacascdaughters() > cfgcasc_dcacascdau) + continue; + if (casc.dcaV0daughters() > cfgcasc_dcav0dau) + continue; + if (std::fabs(casc.mLambda() - o2::constants::physics::MassLambda0) > cfgcasc_mlambdawindow) + continue; + // Omega and antiOmega + if (casc.sign() < 0 && (casc.mOmega() > 1.63) && (casc.mOmega() < 1.71) && std::fabs(casc.yOmega()) < cfgCasc_rapidity && + (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { + registry.fill(HIST("h2DRecOmega"), casc.pt(), rectracknum); + } else if (casc.sign() < 0 && (casc.mOmega() > 1.63) && (casc.mOmega() < 1.71) && std::fabs(casc.yOmega()) < cfgCasc_rapidity && + (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0]))) { + registry.fill(HIST("h2DRecOmega"), casc.pt(), rectracknum); + } + // Xi and antiXi + if (casc.sign() < 0 && (casc.mXi() > 1.30) && (casc.mXi() < 1.37) && std::fabs(casc.yXi()) < cfgCasc_rapidity && + (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { + registry.fill(HIST("h2DRecXi"), casc.pt(), rectracknum); + } else if (casc.sign() < 0 && (casc.mXi() > 1.30) && (casc.mXi() < 1.37) && std::fabs(casc.yXi()) < cfgCasc_rapidity && + (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0]))) { + registry.fill(HIST("h2DRecXi"), casc.pt(), rectracknum); + } + } + + for (const auto& v0 : V0s) { + if (!v0.has_v0MCCore()) + continue; + auto v0negdau = v0.negTrackExtra_as(); + auto v0posdau = v0.posTrackExtra_as(); + + // track quality check + if (v0posdau.tpcNClsFound() < cfgtpcclusters) + continue; + if (v0negdau.tpcNClsFound() < cfgtpcclusters) + continue; + if (v0posdau.tpcNClsFindable() < cfgtpcclufindable) + continue; + if (v0negdau.tpcNClsFindable() < cfgtpcclufindable) + continue; + if (v0posdau.tpcCrossedRowsOverFindableCls() < cfgtpccrossoverfindable) + continue; + if (v0posdau.itsNCls() < cfgitsclusters) + continue; + if (v0negdau.itsNCls() < cfgitsclusters) + continue; + // topological cut + if (v0.v0radius() < cfgv0_radius) + continue; + if (v0.v0cosPA() < cfgv0_v0cospa) + continue; + if (v0.dcaV0daughters() > cfgv0_dcav0dau) + continue; + if (std::fabs(v0.dcapostopv()) < cfgv0_dcadautopv) + continue; + if (std::fabs(v0.dcanegtopv()) < cfgv0_dcadautopv) + continue; + + // K0short + if (v0.qtarm() / std::fabs(v0.alpha()) > cfgv0_ArmPodocut && std::fabs(v0.y()) < 0.5 && std::fabs(v0.mK0Short() - o2::constants::physics::MassK0Short) < cfgv0_mk0swindow && + (!cfgcheckDauTPC || (std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { + registry.fill(HIST("h2DRecK0s"), v0.pt(), rectracknum); + } + // Lambda and antiLambda + if (std::fabs(v0.y()) < 0.5 && std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < cfgv0_mlambdawindow && + (!cfgcheckDauTPC || (std::fabs(v0posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { + registry.fill(HIST("h2DRecLambda"), v0.pt(), rectracknum); + } else if (std::fabs(v0.y()) < 0.5 && std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < cfgv0_mlambdawindow && + (!cfgcheckDauTPC || (std::fabs(v0negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0]))) { + registry.fill(HIST("h2DRecLambda"), v0.pt(), rectracknum); + } + } + } + PROCESS_SWITCH(FlowEfficiencyCasc, processRec, "process reconstructed information", true); + + void processGen(MyMcCollisions::iterator const&, soa::SmallGroups> const& coll, const soa::SmallGroups>& cascMCs, const soa::SmallGroups>& v0MCs) + { + registry.fill(HIST("mcEventCounter"), 0.5); + int rectracknum = 0; + for (const auto& col : coll) { + rectracknum = col.multNTracksGlobal(); + } + for (auto const& cascmc : cascMCs) { + if (std::abs(cascmc.pdgCode()) == kXiMinus) { + if (std::fabs(cascmc.yMC()) < cfgCasc_rapidity) + registry.fill(HIST("h2DGenXi"), cascmc.ptMC(), rectracknum); + } + if (std::abs(cascmc.pdgCode()) == kOmegaMinus) { + if (std::fabs(cascmc.yMC()) < cfgCasc_rapidity) + registry.fill(HIST("h2DGenOmega"), cascmc.ptMC(), rectracknum); + } + } + for (auto const& v0mc : v0MCs) { + if (std::abs(v0mc.pdgCode()) == kK0Short) { + if (std::fabs(v0mc.yMC()) < cfgCasc_rapidity) + registry.fill(HIST("h2DGenK0s"), v0mc.ptMC(), rectracknum); + } + if (std::abs(v0mc.pdgCode()) == kLambda0) { + if (std::fabs(v0mc.yMC()) < cfgCasc_rapidity) + registry.fill(HIST("h2DGenLambda"), v0mc.ptMC(), rectracknum); + } + } + } + PROCESS_SWITCH(FlowEfficiencyCasc, processGen, "process gen information", true); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc)}; +} diff --git a/PWGCF/Flow/Tasks/flowGFWOmegaXi.cxx b/PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx similarity index 89% rename from PWGCF/Flow/Tasks/flowGFWOmegaXi.cxx rename to PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx index 2759453850a..66ef0f50183 100644 --- a/PWGCF/Flow/Tasks/flowGFWOmegaXi.cxx +++ b/PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file flowGFWOmegaXi.cxx +/// \file flowGfwOmegaXi.cxx /// \author Fuchun Cui(fcui@cern.ch) /// \since Sep/13/2024 /// \brief This task is to caculate V0s and cascades flow by GenericFramework @@ -66,7 +66,7 @@ std::shared_ptr omegac24[10]; #define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable NAME{#NAME, DEFAULT, HELP}; -struct FlowGFWOmegaXi { +struct FlowGfwOmegaXi { O2_DEFINE_CONFIGURABLE(cfgCutVertex, float, 10.0f, "Accepted z-vertex range") O2_DEFINE_CONFIGURABLE(cfgCutPtPOIMin, float, 0.2f, "Minimal pT for poi tracks") @@ -81,6 +81,7 @@ struct FlowGFWOmegaXi { O2_DEFINE_CONFIGURABLE(cfgXiMassbins, int, 14, "Number of Xi mass axis bins for c22") O2_DEFINE_CONFIGURABLE(cfgK0sMassbins, int, 80, "Number of K0s mass axis bins for c22") O2_DEFINE_CONFIGURABLE(cfgLambdaMassbins, int, 32, "Number of Lambda mass axis bins for c22") + O2_DEFINE_CONFIGURABLE(cfgDeltaPhiLocDen, int, 3, "Number of delta phi for local density, 200 bins in 2 pi") // topological cut for V0 O2_DEFINE_CONFIGURABLE(cfgv0_radius, float, 5.0f, "minimum decay radius") O2_DEFINE_CONFIGURABLE(cfgv0_v0cospa, float, 0.995f, "minimum cosine of pointing angle") @@ -106,15 +107,11 @@ struct FlowGFWOmegaXi { O2_DEFINE_CONFIGURABLE(cfgcheckDauTPC, bool, true, "check daughter tracks TPC or not") O2_DEFINE_CONFIGURABLE(cfgcheckDauTOF, bool, false, "check daughter tracks TOF or not") O2_DEFINE_CONFIGURABLE(cfgCasc_rapidity, float, 0.5, "rapidity") - O2_DEFINE_CONFIGURABLE(cfgtpcNSigmaCascPion, float, 3, "NSigmaCascPion") - O2_DEFINE_CONFIGURABLE(cfgtpcNSigmaCascProton, float, 3, "NSigmaCascProton") - O2_DEFINE_CONFIGURABLE(cfgtpcNSigmaCascKaon, float, 3, "NSigmaCascKaon") - O2_DEFINE_CONFIGURABLE(cfgtofNSigmaCascPion, float, 3, "NSigmaCascPion") - O2_DEFINE_CONFIGURABLE(cfgtofNSigmaCascProton, float, 3, "NSigmaCascProton") - O2_DEFINE_CONFIGURABLE(cfgtofNSigmaCascKaon, float, 3, "NSigmaCascKaon") + O2_DEFINE_CONFIGURABLE(cfgNSigmatpctof, std::vector, (std::vector{3, 3, 3, 3, 3, 3}), "tpc and tof NSigma for Pion Proton Kaon") O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeights, bool, true, "Fill and output NUA weights") O2_DEFINE_CONFIGURABLE(cfgAcceptancePath, std::vector, (std::vector{"Users/f/fcui/NUA/NUAREFPartical", "Users/f/fcui/NUA/NUAK0s", "Users/f/fcui/NUA/NUALambda", "Users/f/fcui/NUA/NUAXi", "Users/f/fcui/NUA/NUAOmega"}), "CCDB path to acceptance object") O2_DEFINE_CONFIGURABLE(cfgEfficiencyPath, std::vector, (std::vector{"PathtoRef"}), "CCDB path to efficiency object") + O2_DEFINE_CONFIGURABLE(cfgLocDenPath, std::vector, (std::vector{"PathtoRef"}), "CCDB path to local density efficiency object") ConfigurableAxis cfgaxisVertex{"cfgaxisVertex", {20, -10, 10}, "vertex axis for histograms"}; ConfigurableAxis cfgaxisPhi{"cfgaxisPhi", {60, 0.0, constants::math::TwoPI}, "phi axis for histograms"}; @@ -155,9 +152,12 @@ struct FlowGFWOmegaXi { std::vector corrconfigs; std::vector cfgAcceptance = cfgAcceptancePath; std::vector cfgEfficiency = cfgEfficiencyPath; + std::vector cfgLocDen = cfgLocDenPath; + std::vector cfgNSigma = cfgNSigmatpctof; - std::vector mEfficiency; std::vector mAcceptance; + std::vector mEfficiency; + std::vector mLocDen; bool correctionsLoaded = false; TF1* fMultPVCutLow = nullptr; @@ -543,13 +543,22 @@ struct FlowGFWOmegaXi { } if (cfgEfficiency.size() == 5) { for (int i = 0; i <= 4; i++) { - mAcceptance.push_back(ccdb->getForTimeStamp(cfgAcceptance[i], timestamp)); + mEfficiency.push_back(ccdb->getForTimeStamp(cfgEfficiency[i], timestamp)); } if (mEfficiency.size() == 5) LOGF(info, "Loaded efficiency histogram"); else LOGF(fatal, "Could not load efficiency histogram"); } + if (cfgLocDen.size() == 5) { + for (int i = 0; i <= 4; i++) { + mLocDen.push_back(ccdb->getForTimeStamp(cfgLocDen[i], timestamp)); + } + if (cfgLocDen.size() == 5) + LOGF(info, "Loaded local density efficiency histogram"); + else + LOGF(fatal, "Could not load local density efficiency histogram"); + } correctionsLoaded = true; } @@ -570,6 +579,22 @@ struct FlowGFWOmegaXi { weight_nua = 1; return true; } + + template + bool setCurrentLocalDensityWeights(float& weight_loc, TrackObject track, float locDensity, int ispecies) + { + float eff = 1.; + if (mLocDen.size() == 5) { + int ptbin = mLocDen[ispecies]->GetXaxis()->FindBin(track.pt()); + float density = locDensity * 200 / (2 * cfgDeltaPhiLocDen + 1); + int densitybin = mLocDen[ispecies]->GetYaxis()->FindBin(density); + eff = mLocDen[ispecies]->GetBinContent(ptbin, densitybin); + } else { + eff = 1.0; + } + weight_loc = 1 / eff; + return true; + } // event selection template bool eventSelected(TCollision collision, const int multTrk, const float centrality) @@ -652,6 +677,7 @@ struct FlowGFWOmegaXi { return; if (eventSelected(collision, tracks.size(), cent)) return; + TH1D* hLocalDensity = new TH1D("hphi", "hphi", 400, -constants::math::TwoPI, constants::math::TwoPI); auto bc = collision.bc_as(); loadCorrections(bc.timestamp()); float vtxz = collision.posZ(); @@ -664,6 +690,7 @@ struct FlowGFWOmegaXi { float weff = 1; float wacc = 1; + float wloc = 1; // fill GFW ref flow for (const auto& track : tracks) { if (!setCurrentParticleWeights(weff, wacc, track, vtxz, 0)) @@ -676,6 +703,8 @@ struct FlowGFWOmegaXi { int ptbin = fPtAxis->FindBin(track.pt()) - 1; if ((track.pt() > cfgCutPtMin) && (track.pt() < cfgCutPtMax)) { fGFW->Fill(track.eta(), ptbin, track.phi(), wacc * weff, 1); //(eta, ptbin, phi, wacc*weff, bitmask) + hLocalDensity->Fill(track.phi()); + hLocalDensity->Fill(RecoDecay::constrainAngle(track.phi(), -constants::math::TwoPI)); } if ((track.pt() > cfgCutPtPOIMin) && (track.pt() < cfgCutPtPOIMax)) { fGFW->Fill(track.eta(), ptbin, track.phi(), wacc * weff, 32); @@ -695,30 +724,24 @@ struct FlowGFWOmegaXi { // check daughter TPC and TOF // K0short if (v0.qtarm() / std::fabs(v0.alpha()) > cfgv0_ArmPodocut && std::fabs(v0.y()) < 0.5 && std::fabs(v0.mK0Short() - o2::constants::physics::MassK0Short) < cfgv0_mk0swindow && - (!cfgcheckDauTPC || (std::fabs(v0posdau.tpcNSigmaPi()) < cfgtpcNSigmaCascPion && std::fabs(v0negdau.tpcNSigmaPi()) < cfgtpcNSigmaCascPion)) && - (!cfgcheckDauTOF || ((std::fabs(v0posdau.tofNSigmaPi()) < cfgtofNSigmaCascPion || v0posdau.pt() < 0.4) && (std::fabs(v0negdau.tofNSigmaPi()) < cfgtofNSigmaCascPion || v0negdau.pt() < 0.4)))) { + (!cfgcheckDauTPC || (std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0])) && + (!cfgcheckDauTOF || ((std::fabs(v0posdau.tofNSigmaPi()) < cfgNSigma[3] || v0posdau.pt() < 0.4) && (std::fabs(v0negdau.tofNSigmaPi()) < cfgNSigma[3] || v0negdau.pt() < 0.4)))) { registry.fill(HIST("InvMassK0s_all"), v0.pt(), v0.mK0Short(), v0.eta(), cent); - if (!setCurrentParticleWeights(weff, wacc, v0, vtxz, 1)) - continue; isK0s = true; candNumAll[0] = candNumAll[0] + 1; registry.fill(HIST("hqaarm_podoafter"), v0.alpha(), v0.qtarm()); } // Lambda and antiLambda if (std::fabs(v0.y()) < 0.5 && std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < cfgv0_mlambdawindow && - (!cfgcheckDauTPC || (std::fabs(v0posdau.tpcNSigmaPr()) < cfgtpcNSigmaCascProton && std::fabs(v0negdau.tpcNSigmaPi()) < cfgtpcNSigmaCascPion)) && - (!cfgcheckDauTOF || ((std::fabs(v0posdau.tofNSigmaPr()) < cfgtofNSigmaCascProton || v0posdau.pt() < 0.4) && (std::fabs(v0negdau.tofNSigmaPi()) < cfgtofNSigmaCascPion || v0negdau.pt() < 0.4)))) { + (!cfgcheckDauTPC || (std::fabs(v0posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0])) && + (!cfgcheckDauTOF || ((std::fabs(v0posdau.tofNSigmaPr()) < cfgNSigma[4] || v0posdau.pt() < 0.4) && (std::fabs(v0negdau.tofNSigmaPi()) < cfgNSigma[3] || v0negdau.pt() < 0.4)))) { registry.fill(HIST("InvMassLambda_all"), v0.pt(), v0.mLambda(), v0.eta(), cent); - if (!setCurrentParticleWeights(weff, wacc, v0, vtxz, 2)) - continue; isLambda = true; candNumAll[1] = candNumAll[1] + 1; } else if (std::fabs(v0.y()) < 0.5 && std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < cfgv0_mlambdawindow && - (!cfgcheckDauTPC || (std::fabs(v0negdau.tpcNSigmaPr()) < cfgtpcNSigmaCascProton && std::fabs(v0posdau.tpcNSigmaPi()) < cfgtpcNSigmaCascPion)) && - (!cfgcheckDauTOF || ((std::fabs(v0negdau.tofNSigmaPr()) < cfgtofNSigmaCascProton || v0negdau.pt() < 0.4) && (std::fabs(v0posdau.tofNSigmaPi()) < cfgtofNSigmaCascPion || v0posdau.pt() < 0.4)))) { + (!cfgcheckDauTPC || (std::fabs(v0negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0])) && + (!cfgcheckDauTOF || ((std::fabs(v0negdau.tofNSigmaPr()) < cfgNSigma[4] || v0negdau.pt() < 0.4) && (std::fabs(v0posdau.tofNSigmaPi()) < cfgNSigma[3] || v0posdau.pt() < 0.4)))) { registry.fill(HIST("InvMassLambda_all"), v0.pt(), v0.mLambda(), v0.eta(), cent); - if (!setCurrentParticleWeights(weff, wacc, v0, vtxz, 2)) - continue; isLambda = true; candNumAll[1] = candNumAll[1] + 1; } @@ -762,18 +785,34 @@ struct FlowGFWOmegaXi { registry.fill(HIST("hqadcapostoPVafter"), v0.dcapostopv()); registry.fill(HIST("hqadcanegtoPVafter"), v0.dcanegtopv()); if (isK0s) { + setCurrentParticleWeights(weff, wacc, v0, vtxz, 1); + int phibin = -999; + phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(v0.phi(), -constants::math::PI)); + if (phibin > -900) { + int density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + setCurrentLocalDensityWeights(wloc, v0, density, 1); + } + candNum[0] = candNum[0] + 1; registry.fill(HIST("InvMassK0s"), v0.pt(), v0.mK0Short(), v0.eta(), cent); registry.fill(HIST("hEtaPhiVtxzPOIK0s"), v0.phi(), v0.eta(), vtxz, wacc); - fGFW->Fill(v0.eta(), fV0PtAxis->FindBin(v0.pt()) - 1 + ((fK0sMass->FindBin(v0.mK0Short()) - 1) * nV0PtBins), v0.phi(), wacc * weff, 8); + fGFW->Fill(v0.eta(), fV0PtAxis->FindBin(v0.pt()) - 1 + ((fK0sMass->FindBin(v0.mK0Short()) - 1) * nV0PtBins), v0.phi(), wacc * weff * wloc, 8); if (cfgOutputNUAWeights) fWeightsK0s->fill(v0.phi(), v0.eta(), vtxz, v0.pt(), cent, 0); } if (isLambda) { + setCurrentParticleWeights(weff, wacc, v0, vtxz, 2); + int phibin = -999; + phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(v0.phi(), -constants::math::PI)); + if (phibin > -900) { + int density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + setCurrentLocalDensityWeights(wloc, v0, density, 2); + } + candNum[1] = candNum[1] + 1; registry.fill(HIST("InvMassLambda"), v0.pt(), v0.mLambda(), v0.eta(), cent); registry.fill(HIST("hEtaPhiVtxzPOILambda"), v0.phi(), v0.eta(), vtxz, wacc); - fGFW->Fill(v0.eta(), fV0PtAxis->FindBin(v0.pt()) - 1 + ((fLambdaMass->FindBin(v0.mLambda()) - 1) * nV0PtBins), v0.phi(), wacc * weff, 16); + fGFW->Fill(v0.eta(), fV0PtAxis->FindBin(v0.pt()) - 1 + ((fLambdaMass->FindBin(v0.mLambda()) - 1) * nV0PtBins), v0.phi(), wacc * weff * wloc, 16); if (cfgOutputNUAWeights) fWeightsLambda->fill(v0.phi(), v0.eta(), vtxz, v0.pt(), cent, 0); } @@ -791,37 +830,29 @@ struct FlowGFWOmegaXi { bool isXi = false; // Omega and antiOmega if (casc.sign() < 0 && (casc.mOmega() > 1.63) && (casc.mOmega() < 1.71) && std::fabs(casc.yOmega()) < cfgCasc_rapidity && - (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgtpcNSigmaCascKaon && std::fabs(posdau.tpcNSigmaPr()) < cfgtpcNSigmaCascProton && std::fabs(negdau.tpcNSigmaPi()) < cfgtpcNSigmaCascPion)) && - (!cfgcheckDauTOF || ((std::fabs(bachelor.tofNSigmaKa()) < cfgtofNSigmaCascKaon || bachelor.pt() < 0.4) && (std::fabs(posdau.tofNSigmaPr()) < cfgtofNSigmaCascProton || posdau.pt() < 0.4) && (std::fabs(negdau.tofNSigmaPi()) < cfgtofNSigmaCascPion || negdau.pt() < 0.4)))) { + (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0])) && + (!cfgcheckDauTOF || ((std::fabs(bachelor.tofNSigmaKa()) < cfgNSigma[5] || bachelor.pt() < 0.4) && (std::fabs(posdau.tofNSigmaPr()) < cfgNSigma[4] || posdau.pt() < 0.4) && (std::fabs(negdau.tofNSigmaPi()) < cfgNSigma[3] || negdau.pt() < 0.4)))) { registry.fill(HIST("InvMassOmega_all"), casc.pt(), casc.mOmega(), casc.eta(), cent); - if (!setCurrentParticleWeights(weff, wacc, casc, vtxz, 4)) - continue; isOmega = true; candNumAll[3] = candNumAll[3] + 1; } else if (casc.sign() < 0 && (casc.mOmega() > 1.63) && (casc.mOmega() < 1.71) && std::fabs(casc.yOmega()) < cfgCasc_rapidity && - (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgtpcNSigmaCascKaon && std::fabs(negdau.tpcNSigmaPr()) < cfgtpcNSigmaCascProton && std::fabs(posdau.tpcNSigmaPi()) < cfgtpcNSigmaCascPion)) && - (!cfgcheckDauTOF || ((std::fabs(bachelor.tofNSigmaKa()) < cfgtofNSigmaCascKaon || bachelor.pt() < 0.4) && (std::fabs(negdau.tofNSigmaPr()) < cfgtofNSigmaCascProton || negdau.pt() < 0.4) && (std::fabs(posdau.tofNSigmaPi()) < cfgtofNSigmaCascPion || posdau.pt() < 0.4)))) { + (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0])) && + (!cfgcheckDauTOF || ((std::fabs(bachelor.tofNSigmaKa()) < cfgNSigma[5] || bachelor.pt() < 0.4) && (std::fabs(negdau.tofNSigmaPr()) < cfgNSigma[4] || negdau.pt() < 0.4) && (std::fabs(posdau.tofNSigmaPi()) < cfgNSigma[3] || posdau.pt() < 0.4)))) { registry.fill(HIST("InvMassOmega_all"), casc.pt(), casc.mOmega(), casc.eta(), cent); - if (!setCurrentParticleWeights(weff, wacc, casc, vtxz, 4)) - continue; isOmega = true; candNumAll[3] = candNumAll[3] + 1; } // Xi and antiXi if (casc.sign() < 0 && (casc.mXi() > 1.30) && (casc.mXi() < 1.37) && std::fabs(casc.yXi()) < cfgCasc_rapidity && - (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgtpcNSigmaCascPion && std::fabs(posdau.tpcNSigmaPr()) < cfgtpcNSigmaCascProton && std::fabs(negdau.tpcNSigmaPi()) < cfgtpcNSigmaCascPion)) && - (!cfgcheckDauTOF || ((std::fabs(bachelor.tofNSigmaPi()) < cfgtofNSigmaCascPion || bachelor.pt() < 0.4) && (std::fabs(posdau.tofNSigmaPr()) < cfgtofNSigmaCascProton || posdau.pt() < 0.4) && (std::fabs(negdau.tofNSigmaPi()) < cfgtofNSigmaCascPion || negdau.pt() < 0.4)))) { + (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0])) && + (!cfgcheckDauTOF || ((std::fabs(bachelor.tofNSigmaPi()) < cfgNSigma[3] || bachelor.pt() < 0.4) && (std::fabs(posdau.tofNSigmaPr()) < cfgNSigma[4] || posdau.pt() < 0.4) && (std::fabs(negdau.tofNSigmaPi()) < cfgNSigma[3] || negdau.pt() < 0.4)))) { registry.fill(HIST("InvMassXi_all"), casc.pt(), casc.mXi(), casc.eta(), cent); - if (!setCurrentParticleWeights(weff, wacc, casc, vtxz, 3)) - continue; isXi = true; candNumAll[2] = candNumAll[2] + 1; } else if (casc.sign() < 0 && (casc.mXi() > 1.30) && (casc.mXi() < 1.37) && std::fabs(casc.yXi()) < cfgCasc_rapidity && - (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgtpcNSigmaCascPion && std::fabs(negdau.tpcNSigmaPr()) < cfgtpcNSigmaCascProton && std::fabs(posdau.tpcNSigmaPi()) < cfgtpcNSigmaCascPion)) && - (!cfgcheckDauTOF || ((std::fabs(bachelor.tofNSigmaPi()) < cfgtofNSigmaCascPion || bachelor.pt() < 0.4) && (std::fabs(negdau.tofNSigmaPr()) < cfgtofNSigmaCascProton || negdau.pt() < 0.4) && (std::fabs(posdau.tofNSigmaPi()) < cfgtofNSigmaCascPion || posdau.pt() < 0.4)))) { + (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0])) && + (!cfgcheckDauTOF || ((std::fabs(bachelor.tofNSigmaPi()) < cfgNSigma[3] || bachelor.pt() < 0.4) && (std::fabs(negdau.tofNSigmaPr()) < cfgNSigma[4] || negdau.pt() < 0.4) && (std::fabs(posdau.tofNSigmaPi()) < cfgNSigma[3] || posdau.pt() < 0.4)))) { registry.fill(HIST("InvMassXi_all"), casc.pt(), casc.mXi(), casc.eta(), cent); - if (!setCurrentParticleWeights(weff, wacc, casc, vtxz, 3)) - continue; isXi = true; candNumAll[2] = candNumAll[2] + 1; } @@ -832,9 +863,9 @@ struct FlowGFWOmegaXi { continue; if (casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ()) < cfgcasc_v0cospa) continue; - if (casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ()) < cfgcasc_dcav0topv) + if (std::fabs(casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ())) < cfgcasc_dcav0topv) continue; - if (casc.dcabachtopv() < cfgcasc_dcabachtopv) + if (std::fabs(casc.dcabachtopv()) < cfgcasc_dcabachtopv) continue; if (casc.dcacascdaughters() > cfgcasc_dcacascdau) continue; @@ -856,18 +887,34 @@ struct FlowGFWOmegaXi { if (negdau.itsNCls() < cfgitsclusters) continue; if (isOmega) { + setCurrentParticleWeights(weff, wacc, casc, vtxz, 4); + int phibin = -999; + phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(casc.phi(), -constants::math::PI)); + if (phibin > -900) { + int density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + setCurrentLocalDensityWeights(wloc, casc, density, 4); + } + candNum[3] = candNum[3] + 1; registry.fill(HIST("hEtaPhiVtxzPOIOmega"), casc.phi(), casc.eta(), vtxz, wacc); registry.fill(HIST("InvMassOmega"), casc.pt(), casc.mOmega(), casc.eta(), cent); - fGFW->Fill(casc.eta(), fXiPtAxis->FindBin(casc.pt()) - 1 + ((fOmegaMass->FindBin(casc.mOmega()) - 1) * nXiPtBins), casc.phi(), wacc * weff, 4); + fGFW->Fill(casc.eta(), fXiPtAxis->FindBin(casc.pt()) - 1 + ((fOmegaMass->FindBin(casc.mOmega()) - 1) * nXiPtBins), casc.phi(), wacc * weff * wloc, 4); if (cfgOutputNUAWeights) fWeightsOmega->fill(casc.phi(), casc.eta(), vtxz, casc.pt(), cent, 0); } if (isXi) { + setCurrentParticleWeights(weff, wacc, casc, vtxz, 3); + int phibin = -999; + phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(casc.phi(), -constants::math::PI)); + if (phibin > -900) { + int density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + setCurrentLocalDensityWeights(wloc, casc, density, 3); + } + candNum[2] = candNum[2] + 1; registry.fill(HIST("hEtaPhiVtxzPOIXi"), casc.phi(), casc.eta(), vtxz, wacc); registry.fill(HIST("InvMassXi"), casc.pt(), casc.mXi(), casc.eta(), cent); - fGFW->Fill(casc.eta(), fXiPtAxis->FindBin(casc.pt()) - 1 + ((fXiMass->FindBin(casc.mXi()) - 1) * nXiPtBins), casc.phi(), wacc * weff, 2); + fGFW->Fill(casc.eta(), fXiPtAxis->FindBin(casc.pt()) - 1 + ((fXiMass->FindBin(casc.mXi()) - 1) * nXiPtBins), casc.phi(), wacc * weff * wloc, 2); if (cfgOutputNUAWeights) fWeightsXi->fill(casc.phi(), casc.eta(), vtxz, casc.pt(), cent, 0); } @@ -880,6 +927,7 @@ struct FlowGFWOmegaXi { registry.fill(HIST("hEventCount"), 3.5, i + 0.5); } } + delete hLocalDensity; // Filling cumulant with ROOT TProfile and loop for all ptBins fillProfile(corrconfigs.at(15), HIST("c22"), cent); fillProfile(corrconfigs.at(16), HIST("c24"), cent); @@ -939,5 +987,5 @@ struct FlowGFWOmegaXi { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc)}; + adaptAnalysisTask(cfgc)}; } From daf849d75b2895edb9375ad77eb7e67c0824b002 Mon Sep 17 00:00:00 2001 From: navneetkumar231295 <71565461+navneetkumar231295@users.noreply.github.com> Date: Thu, 27 Feb 2025 14:43:00 +0530 Subject: [PATCH 0445/1650] [PWGLF] PWGLF::To add the histogram for trkpionTPCTOFPID (#10216) Co-authored-by: Navneet --- PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx b/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx index b82e58f3a66..9085a7b4368 100644 --- a/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx +++ b/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx @@ -167,6 +167,7 @@ struct chargedkstaranalysis { histos1.add("QAbefore/chargedkstarpmRapidity", "Reconstructed K*^{#pm} rapidity", kTH1F, {etaAxis}); histos1.add("QAbefore/trkpionTOFPID", "TOF PID of bachelor pion candidates", HistType::kTH2D, {ptAxisQA, pidQAAxis}); + histos1.add("QAbefore/trkpionTPCTOFPID", "TPC-TOF PID map of bachelor pion candidates", HistType::kTH2D, {pidQAAxis, pidQAAxis}); histos1.add("QAbefore/DCAxy_pi", "DCAxy distribution of pion track candidates", HistType::kTH1F, From 46b3fd6bcfc44c23d949b4fd89923ff65a8d101d Mon Sep 17 00:00:00 2001 From: dajones2 <140733426+dajones2@users.noreply.github.com> Date: Thu, 27 Feb 2025 10:51:47 +0000 Subject: [PATCH 0446/1650] [PWGJE] Adding shift in rho for reference events (#10193) --- PWGJE/Tasks/jetHadronRecoil.cxx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/PWGJE/Tasks/jetHadronRecoil.cxx b/PWGJE/Tasks/jetHadronRecoil.cxx index fa9bdb7af4b..7eaca5774c0 100644 --- a/PWGJE/Tasks/jetHadronRecoil.cxx +++ b/PWGJE/Tasks/jetHadronRecoil.cxx @@ -65,6 +65,7 @@ struct JetHadronRecoil { Configurable pTHatExponent{"pTHatExponent", 4.0, "exponent of the event weight for the calculation of pTHat"}; Configurable pTHatMaxMCD{"pTHatMaxMCD", 999.0, "maximum fraction of hard scattering for jet acceptance in detector MC"}; Configurable pTHatMaxMCP{"pTHatMaxMCP", 999.0, "maximum fraction of hard scattering for jet acceptance in particle MC"}; + Configurable rhoReferenceShift{"rhoReferenceShift", 0.0, "shift in rho calculated in reference events for consistency with signal events"}; Configurable triggerMasks{"triggerMasks", "", "possible JE Trigger masks: fJetChLowPt,fJetChHighPt,fTrackLowPt,fTrackHighPt,fJetD0ChLowPt,fJetD0ChHighPt,fJetLcChLowPt,fJetLcChHighPt,fEMCALReadout,fJetFullHighPt,fJetFullLowPt,fJetNeutralHighPt,fJetNeutralLowPt,fGammaVeryHighPtEMCAL,fGammaVeryHighPtDCAL,fGammaHighPtEMCAL,fGammaHighPtDCAL,fGammaLowPtEMCAL,fGammaLowPtDCAL,fGammaVeryLowPtEMCAL,fGammaVeryLowPtDCAL"}; Configurable skipMBGapEvents{"skipMBGapEvents", false, "flag to choose to reject min. bias gap events; jet-level rejection applied at the jet finder level, here rejection is applied for collision and track process functions"}; @@ -167,6 +168,7 @@ struct JetHadronRecoil { int trigNumber = 0; int nTT = 0; float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); + float rhoReference = rho + rhoReferenceShift; float dice = rand->Rndm(); if (dice < fracSig) @@ -204,7 +206,7 @@ struct JetHadronRecoil { if (!isSigCol) { registry.fill(HIST("hNtrig"), 0.5, weight); registry.fill(HIST("hRefEventTriggers"), nTT, weight); - registry.fill(HIST("hRhoReference"), rho, weight); + registry.fill(HIST("hRhoReference"), rhoReference, weight); } } @@ -252,14 +254,14 @@ struct JetHadronRecoil { double deltaEta = jetWTA.eta() - jet.eta(); double dR = RecoDecay::sqrtSumOfSquares(deltaPhi, deltaEta); if (std::abs(dphi - o2::constants::math::PI) < 0.6) { - registry.fill(HIST("hDeltaRpTReference"), jet.pt() - (rho * jet.area()), dR, weight); + registry.fill(HIST("hDeltaRpTReference"), jet.pt() - (rhoReference * jet.area()), dR, weight); registry.fill(HIST("hDeltaRReference"), dR, weight); } - registry.fill(HIST("hDeltaRpTDPhiReference"), jet.pt() - (rho * jet.area()), dphi, dR, weight); + registry.fill(HIST("hDeltaRpTDPhiReference"), jet.pt() - (rhoReference * jet.area()), dphi, dR, weight); } - registry.fill(HIST("hReferencePtDPhi"), dphi, jet.pt() - (rho * jet.area()), weight); + registry.fill(HIST("hReferencePtDPhi"), dphi, jet.pt() - (rhoReference * jet.area()), weight); if (std::abs(dphi - o2::constants::math::PI) < 0.6) { - registry.fill(HIST("hReferencePt"), jet.pt() - (rho * jet.area()), weight); + registry.fill(HIST("hReferencePt"), jet.pt() - (rhoReference * jet.area()), weight); } } } From 8560e52c08a99e17ec6499e0b786a9ead83d0260 Mon Sep 17 00:00:00 2001 From: Diana <70915994+diana0x0f@users.noreply.github.com> Date: Thu, 27 Feb 2025 12:52:23 +0100 Subject: [PATCH 0447/1650] [PWGUD] Add more selection bits to UPCCandidateProducer (#10207) Co-authored-by: Diana Krupova --- PWGUD/TableProducer/UPCCandidateProducer.cxx | 46 +++++++++++++++++--- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/PWGUD/TableProducer/UPCCandidateProducer.cxx b/PWGUD/TableProducer/UPCCandidateProducer.cxx index aa266305bdb..4694458b6fb 100644 --- a/PWGUD/TableProducer/UPCCandidateProducer.cxx +++ b/PWGUD/TableProducer/UPCCandidateProducer.cxx @@ -98,6 +98,9 @@ struct UpcCandProducer { Configurable fMinEtaMFT{"minEtaMFT", -3.6, "Minimum eta for MFT tracks"}; Configurable fMaxEtaMFT{"maxEtaMFT", -2.5, "Maximum eta for MFT tracks"}; + Configurable fRequireNoTimeFrameBorder{"requireNoTimeFrameBorder", true, "Require kNoTimeFrameBorder selection bit"}; + Configurable fRequireNoITSROFrameBorder{"requireNoITSROFrameBorder", true, "Require kNoITSROFrameBorder selection bit"}; + // QA histograms HistogramRegistry histRegistry{"HistRegistry", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -701,7 +704,10 @@ struct UpcCandProducer { o2::aod::Collisions const& /*collisions*/, ForwardTracks const& fwdTracks, o2::aod::AmbiguousFwdTracks const& /*ambFwdTracks*/, - std::unordered_map& ambFwdTrBCs) + std::unordered_map& ambFwdTrBCs, + std::unordered_map& bcTRS, + std::unordered_map& bcTROFS, + std::unordered_map& bcHMPR) { for (const auto& trk : fwdTracks) { if (trk.trackType() != typeFilter) @@ -711,14 +717,32 @@ struct UpcCandProducer { int64_t trkId = trk.globalIndex(); int32_t nContrib = -1; uint64_t trackBC = 0; + int64_t trs = 0; // for kNoCollInTimeRangeStandard + int64_t trofs = 0; // for kNoCollInRofStandard + int64_t hmpr = 0; // for kNoHighMultCollInPrevRof auto ambIter = ambFwdTrBCs.find(trkId); if (ambIter == ambFwdTrBCs.end()) { const auto& col = trk.collision(); nContrib = col.numContrib(); trackBC = col.bc_as().globalBC(); - if (!(col.bc_as().selection_bit(o2::aod::evsel::kNoTimeFrameBorder) && - col.bc_as().selection_bit(o2::aod::evsel::kNoITSROFrameBorder))) { - continue; // skip this track if both selection bits are not set + const auto& bc = col.bc_as(); + if (bc.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + trs = 1; + } + if (bc.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { + trofs = 1; + } + if (bc.selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof)) { + hmpr = 1; + } + bcTRS[trackBC] = trs; + bcTROFS[trackBC] = trofs; + bcHMPR[trackBC] = hmpr; + if (fRequireNoTimeFrameBorder && !bc.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { + continue; // skip this track if the kNoTimeFrameBorder bit is required but not set + } + if (fRequireNoITSROFrameBorder && !bc.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { + continue; // skip this track if the kNoITSROFrameBorder bit is required but not set } } else { trackBC = ambIter->second; @@ -1545,6 +1569,11 @@ struct UpcCandProducer { std::vector bcsMatchedTrIdsMCH; std::vector bcsMatchedTrIdsGlobal; + // to store selection bits + std::unordered_map bcTRS; + std::unordered_map bcTROFS; + std::unordered_map bcHMPR; + // trackID -> index in amb. track table std::unordered_map ambFwdTrBCs; collectAmbTrackBCs<1, BCsWithBcSels>(ambFwdTrBCs, ambFwdTracks); @@ -1562,7 +1591,8 @@ struct UpcCandProducer { collectForwardGlobalTracks(bcsMatchedTrIdsGlobal, o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack, bcs, collisions, - fwdTracks, ambFwdTracks, ambFwdTrBCs); + fwdTracks, ambFwdTracks, ambFwdTrBCs, + bcTRS, bcTROFS, bcHMPR); std::sort(bcsMatchedTrIdsMID.begin(), bcsMatchedTrIdsMID.end(), [](const auto& left, const auto& right) { return left.first < right.first; }); @@ -1805,7 +1835,11 @@ struct UpcCandProducer { fitInfo.BBFT0Apf, fitInfo.BBFT0Cpf, fitInfo.BGFT0Apf, fitInfo.BGFT0Cpf, fitInfo.BBFV0Apf, fitInfo.BGFV0Apf, fitInfo.BBFDDApf, fitInfo.BBFDDCpf, fitInfo.BGFDDApf, fitInfo.BGFDDCpf); - eventCandidatesSelExtras(chFT0A, chFT0C, chFDDA, chFDDC, chFV0A, 0, 0, 0, 0, 0); + // get selection flags per BC + int trsVal = bcTRS.count(globalBC) ? bcTRS[globalBC] : 0; + int trofsVal = bcTROFS.count(globalBC) ? bcTROFS[globalBC] : 0; + int hmprVal = bcHMPR.count(globalBC) ? bcHMPR[globalBC] : 0; + eventCandidatesSelExtras(chFT0A, chFT0C, chFDDA, chFDDC, chFV0A, 0, 0, trsVal, trofsVal, hmprVal); eventCandidatesSelsFwd(fitInfo.distClosestBcV0A, fitInfo.distClosestBcT0A, amplitudesT0A, From 2984c4236cab418d8620b7874bdd1fd7ab180a3b Mon Sep 17 00:00:00 2001 From: arvindkhuntia <31609955+arvindkhuntia@users.noreply.github.com> Date: Thu, 27 Feb 2025 13:16:54 +0100 Subject: [PATCH 0448/1650] [PWGJE] Histograms for the skimmed data (#10222) Co-authored-by: Arvind Khuntia --- PWGJE/Tasks/CMakeLists.txt | 1 + PWGJE/Tasks/nucleiInJets.cxx | 57 +++++++++++++++++++++++++++++++++--- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/PWGJE/Tasks/CMakeLists.txt b/PWGJE/Tasks/CMakeLists.txt index 7d9fae0b221..1b32c63cbb7 100644 --- a/PWGJE/Tasks/CMakeLists.txt +++ b/PWGJE/Tasks/CMakeLists.txt @@ -211,6 +211,7 @@ if(FastJet_FOUND) o2physics_add_dpl_workflow(nuclei-in-jets SOURCES nucleiInJets.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore + O2Physics::AnalysisCCDB O2Physics::EventFilteringUtils COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(jet-taggerhf-qa SOURCES jetTaggerHFQA.cxx diff --git a/PWGJE/Tasks/nucleiInJets.cxx b/PWGJE/Tasks/nucleiInJets.cxx index bdc0807a671..4c6edc5e3ad 100644 --- a/PWGJE/Tasks/nucleiInJets.cxx +++ b/PWGJE/Tasks/nucleiInJets.cxx @@ -22,6 +22,7 @@ #include "Framework/HistogramRegistry.h" #include "Framework/runDataProcessing.h" +#include "CCDB/BasicCCDBManager.h" #include "Common/Core/RecoDecay.h" #include "Common/Core/TrackSelection.h" #include "Common/Core/TrackSelectionDefaults.h" @@ -31,6 +32,10 @@ #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/PIDResponse.h" #include "CommonConstants/PhysicsConstants.h" + +#include "EventFiltering/Zorro.h" +#include "EventFiltering/ZorroSummary.h" + #include "ReconstructionDataFormats/Track.h" #include "PWGLF/DataModel/LFParticleIdentification.h" @@ -38,6 +43,7 @@ #include "PWGJE/Core/FastJetUtilities.h" #include "PWGJE/Core/JetDerivedDataUtilities.h" #include "PWGJE/DataModel/Jet.h" +#include "PWGJE/DataModel/JetReducedDataSelector.h" using namespace o2; using namespace o2::framework; @@ -140,6 +146,9 @@ struct nucleiInJets { ConfigurableAxis binsPtZHe{"binsPtZHe", {VARIABLE_WIDTH, 0.5, 0.625, 0.75, 0.875, 1.0, 1.125, 1.25, 1.375, 1.5, 1.625, 1.75, 1.875, 2.0, 2.25, 2.5, 3.0, 3.5, 4.0}, ""}; + Configurable applySkim{"applySkim", false, "Apply skimming"}; + Configurable cfgSkim{"cfgSkim", "fHighFt0Mult", "Configurable for skimming"}; + static constexpr float gMassProton = 0.93827208f; static constexpr float gMassDeuteron = 1.87561f; static constexpr float gMassTriton = 2.80892f; @@ -170,6 +179,11 @@ struct nucleiInJets { SliceCache cache; HistogramRegistry jetHist{"jetHist", {}, OutputObjHandlingPolicy::AnalysisObject}; + Zorro zorro; + OutputObj zorroSummary{"zorroSummary"}; + + Service ccdb; + void init(o2::framework::InitContext&) { const AxisSpec PtAxis = {100, 0, 10.0}; @@ -188,6 +202,15 @@ struct nucleiInJets { const AxisSpec massTrAxis{binsMassTr, ""}; const AxisSpec massHeAxis{binsMassHe, ""}; + if (applySkim) { + jetHist.add("hNEvents", "hNEvents", {HistType::kTH1D, {{6, 0.f, 6.f}}}); + jetHist.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(1, "All"); + jetHist.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(2, "Skimmed"); + jetHist.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(3, "|Vz|<10"); + jetHist.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(4, "Sel8+|Vz|<10"); + jetHist.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(5, "nJets>0"); + } + // jet property jetHist.add("jet/h1JetPt", "jet_{p_{T}}", kTH1F, {PtJetAxis}); jetHist.add("jet/h1JetEvents", "NumbeOfJetEvents", kTH1F, {{1, 0, 1}}); @@ -508,6 +531,14 @@ struct nucleiInJets { } } + template + void initCCDB(const BCType& bc) + { + if (applySkim) { + zorro.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), cfgSkim.value); + zorro.populateHistRegistry(jetHist, bc.runNumber()); + } + } std::array getPerpendicuarPhi(float jetPhi) { std::array PerpendicularConeAxisPhi = {-999.0f, -999.0f}; @@ -932,13 +963,28 @@ struct nucleiInJets { //////////////////////////////////////// } - void processJetTracksData(aod::JetCollision const& collision, chargedJetstrack const& chargedjets, soa::Join const& tracks, TrackCandidates const&) + void processJetTracksData(soa::Join::iterator const& collision, chargedJetstrack const& chargedjets, soa::Join const& tracks, TrackCandidates const&, + TrackCandidatesLfPid const&, aod::JBCs const&) { + auto bc = collision.bc_as(); + initCCDB(bc); + + if (applySkim) { + jetHist.fill(HIST("hNEvents"), 0.5); + bool zorroSelected = zorro.isSelected(bc.globalBC()); + if (!zorroSelected) { + return; + } + jetHist.fill(HIST("hNEvents"), 1.5); + } if (fabs(collision.posZ()) > 10) return; + + jetHist.fill(HIST("hNEvents"), 2.5); if (!jetderiveddatautilities::selectCollision(collision, jetderiveddatautilities::initialiseEventSelectionBits("sel8"))) return; + jetHist.fill(HIST("hNEvents"), 3.5); int nJets = 0; std::vector leadingJetWithPtEtaPhi(3); @@ -959,13 +1005,16 @@ struct nucleiInJets { jetHist.fill(HIST("jet/nJetsPerEvent"), nJets); jetHist.fill(HIST("vertexZ"), collision.posZ()); - if (nJets > 0) + if (nJets > 0) { jetHist.fill(HIST("jet/vertexZ"), collision.posZ()); - else + jetHist.fill(HIST("hNEvents"), 4.5); + } else { jetHist.fill(HIST("jetOut/vertexZ"), collision.posZ()); + } if (isWithJetEvents && nJets == 0) return; + jetHist.fill(HIST("jet/h1JetEvents"), 0.5); for (auto& track : tracks) { @@ -1299,7 +1348,7 @@ struct nucleiInJets { } // process PROCESS_SWITCH(nucleiInJets, processJetTracksData, "nuclei in Jets data", true); - PROCESS_SWITCH(nucleiInJets, processMCRec, "nuclei in Jets for detectorlevel Jets", true); + PROCESS_SWITCH(nucleiInJets, processMCRec, "nuclei in Jets for detectorlevel Jets", false); PROCESS_SWITCH(nucleiInJets, processMCGen, "nuclei in Jets MC particlelevel Jets", false); PROCESS_SWITCH(nucleiInJets, processRecMatched, "nuclei in Jets rec matched", false); PROCESS_SWITCH(nucleiInJets, processGenMatched, "nuclei in Jets gen matched", false); From a257a4dd8acb644a801775d11d95e1ddd0e08619 Mon Sep 17 00:00:00 2001 From: ynishida-style Date: Thu, 27 Feb 2025 21:57:10 +0900 Subject: [PATCH 0449/1650] [PWGJE] New task for jetShape.cxx (#9644) --- PWGJE/Tasks/CMakeLists.txt | 4 + PWGJE/Tasks/jetShape.cxx | 277 +++++++++++++++++++++++++++++++++++++ 2 files changed, 281 insertions(+) create mode 100644 PWGJE/Tasks/jetShape.cxx diff --git a/PWGJE/Tasks/CMakeLists.txt b/PWGJE/Tasks/CMakeLists.txt index 1b32c63cbb7..7bd3a82114b 100644 --- a/PWGJE/Tasks/CMakeLists.txt +++ b/PWGJE/Tasks/CMakeLists.txt @@ -265,4 +265,8 @@ if(FastJet_FOUND) SOURCES bjetTaggingGNN.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(jet-shape + SOURCES jetShape.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore + COMPONENT_NAME Analysis) endif() \ No newline at end of file diff --git a/PWGJE/Tasks/jetShape.cxx b/PWGJE/Tasks/jetShape.cxx new file mode 100644 index 00000000000..4beaeb24d89 --- /dev/null +++ b/PWGJE/Tasks/jetShape.cxx @@ -0,0 +1,277 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file jetShape.cxx +/// \author Yuto Nishida +/// \brief Task for measuring the dependence of the jet shape function rho(r) on the distance r from the jet axis. + +#include +#include +#include + +#include "Framework/ASoA.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" + +#include "Common/Core/RecoDecay.h" +#include "Common/Core/TrackSelection.h" +#include "Common/Core/TrackSelectionDefaults.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/TrackSelectionTables.h" + +#include "PWGJE/Core/FastJetUtilities.h" +#include "PWGJE/Core/JetUtilities.h" +#include "PWGJE/Core/JetDerivedDataUtilities.h" +#include "PWGJE/DataModel/Jet.h" + +#include "Framework/runDataProcessing.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +struct JetShapeTask { + HistogramRegistry registry{"registry", + {{"tpcPi", "tpcPi", {HistType::kTH2F, {{1000, 0, 5}, {401, -10.025f, 10.025f}}}}, + {"tofPi", "tofPi", {HistType::kTH2F, {{1000, 0, 5}, {401, -10.025f, 10.025f}}}}, + {"tpcPr", "tpcPr", {HistType::kTH2F, {{1000, 0, 5}, {401, -10.025f, 10.025f}}}}, + {"tofPr", "tofPr", {HistType::kTH2F, {{1000, 0, 5}, {401, -10.025f, 10.025f}}}}, + {"tpcDedx", "tpcDedx", {HistType::kTH2F, {{1000, 0, 5}, {1000, 0, 1000}}}}, + {"tofBeta", "tofBeta", {HistType::kTH2F, {{1000, 0, 5}, {900, 0.2, 1.1}}}}, + {"tofMass", "tofMass", {HistType::kTH1F, {{3000, 0, 3}}}}, + {"jetPt", "jet pT;#it{p}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {{200, 0., 200.}}}}, + {"jetEta", "jet #eta;#eta_{jet};entries", {HistType::kTH1F, {{100, -1.0, 1.0}}}}, + {"jetPhi", "jet #phi;#phi_{jet};entries", {HistType::kTH1F, {{80, -1.0, 7.}}}}, + {"area", "area", {HistType::kTH1F, {{200, 0, 4}}}}, + {"rho", "rho", {HistType::kTH1F, {{200, -1, 119}}}}, + {"ptCorr", "Corrected jet pT; p_{T}^{corr} (GeV/c); Counts", {HistType::kTH1F, {{200, 0, 200}}}}, + {"ptCorrVsDistance", "ptcorr_vs_distance", {HistType::kTH2F, {{70, 0, 0.7}, {100, 0, 100}}}}, + {"distanceVsTrackpt", "trackpt_vs_distance", {HistType::kTH2F, {{70, 0, 0.7}, {100, 0, 100}}}}, + {"ptSum", "ptSum", {HistType::kTH2F, {{14, 0, 0.7}, {300, 0, 300}}}}, + {"ptSumBg1", "ptSumBg1", {HistType::kTH2F, {{14, 0, 0.7}, {300, 0, 300}}}}, + {"ptSumBg2", "ptSumBg2", {HistType::kTH2F, {{14, 0, 0.7}, {300, 0, 300}}}}, + {"ptVsCentrality", "ptvscentrality", {HistType::kTH2F, {{100, 0, 100}, {300, 0, 300}}}}}}; + + Configurable vertexZCut{"vertexZCut", 10.0f, "Accepted z-vertex range"}; + + Configurable jetPtMin{"jetPtMin", 5.0, "minimum jet pT cut"}; + Configurable jetR{"jetR", 0.4, "jet resolution parameter"}; + + Configurable eventSelections{"eventSelections", "sel8", "choose event selection"}; + Configurable trackSelections{"trackSelections", "globalTracks", "set track selections"}; + + Configurable jetAreaFractionMin{"jetAreaFractionMin", -99.0, "used to make a cut on the jet areas"}; + Configurable leadingConstituentPtMin{"leadingConstituentPtMin", 5.0, "minimum pT selection on jet constituent"}; + Configurable leadingConstituentPtMax{"leadingConstituentPtMax", 9999.0, "maximum pT selection on jet constituent"}; + + // for jet shape + Configurable> distanceCategory{"distanceCategory", {0.00f, 0.05f, 0.10f, 0.15f, 0.20f, 0.25f, 0.30f, 0.35f, 0.40f, 0.45f, 0.50f, 0.55f, 0.60f, 0.65f, 0.70f}, "distance of category"}; + + // for ppi production + Configurable maxTpcNClsCrossedRows{"maxTpcNClsCrossedRows", 70, ""}; + Configurable maxDcaXY{"maxDcaXY", 0.2, ""}; + Configurable maxItsNCls{"maxItsNCls", 2, ""}; + + Configurable triggerMasks{"triggerMasks", "", "possible JE Trigger masks: fJetChLowPt,fJetChHighPt,fTrackLowPt,fTrackHighPt,fJetD0ChLowPt,fJetD0ChHighPt,fJetLcChLowPt,fJetLcChHighPt,fEMCALReadout,fJetFullHighPt,fJetFullLowPt,fJetNeutralHighPt,fJetNeutralLowPt,fGammaVeryHighPtEMCAL,fGammaVeryHighPtDCAL,fGammaHighPtEMCAL,fGammaHighPtDCAL,fGammaLowPtEMCAL,fGammaLowPtDCAL,fGammaVeryLowPtEMCAL,fGammaVeryLowPtDCAL"}; + + std::vector eventSelectionBits; + int trackSelection = -1; + std::vector triggerMaskBits; + + void init(o2::framework::InitContext&) + { + eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast(eventSelections)); + trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast(trackSelections)); + triggerMaskBits = jetderiveddatautilities::initialiseTriggerMaskBits(triggerMasks); + } + + template + bool isAcceptedJet(U const& jet) + { + if (jetAreaFractionMin > -98.0) { + if (jet.area() < jetAreaFractionMin * o2::constants::math::PI * (jet.r() / 100.0) * (jet.r() / 100.0)) { + return false; + } + if (jet.area() < o2::constants::math::PIHalf * (jet.r() / 100.0) * (jet.r() / 100.0)) { + return false; + } + } + bool checkConstituentPt = true; + bool checkConstituentMinPt = (leadingConstituentPtMin > 5); + bool checkConstituentMaxPt = (leadingConstituentPtMax < 9998.0); + if (!checkConstituentMinPt && !checkConstituentMaxPt) { + checkConstituentPt = false; + } + + if (checkConstituentPt) { + bool isMinLeadingConstituent = !checkConstituentMinPt; + bool isMaxLeadingConstituent = true; + + for (const auto& constituent : jet.template tracks_as()) { + double pt = constituent.pt(); + + if (checkConstituentMinPt && pt >= leadingConstituentPtMin) { + isMinLeadingConstituent = true; + } + if (checkConstituentMaxPt && pt > leadingConstituentPtMax) { + isMaxLeadingConstituent = false; + } + } + return isMinLeadingConstituent && isMaxLeadingConstituent; + } + + return true; + } + + Filter jetCuts = aod::jet::pt > jetPtMin&& aod::jet::r == nround(jetR.node() * 100.0f); + Filter collisionFilter = nabs(aod::jcollision::posZ) < vertexZCut; + Filter mcCollisionFilter = nabs(aod::jmccollision::posZ) < vertexZCut; + + Preslice> perMcCollisionJets = aod::jet::mcCollisionId; + + void processJetShape(soa::Filtered>::iterator const& collision, aod::JetTracks const& tracks, soa::Join const& jets) + { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + return; + } + std::vector ptDensity; + std::vector ptDensityBg1; + std::vector ptDensityBg2; + + ptDensity.reserve(distanceCategory->size() - 1); + ptDensityBg1.reserve(distanceCategory->size() - 1); + ptDensityBg2.reserve(distanceCategory->size() - 1); + + // std::cout << collision.centrality() << std::endl; + + for (auto const& jet : jets) { + if (!isAcceptedJet(jet)) { + continue; + } + + // Get underlying event subtracted jet.pt() as ptCorr + float ptCorr = jet.pt() - collision.rho() * jet.area(); + + for (const auto& track : tracks) { + float preDeltaPhi1 = track.phi() - jet.phi(); + float deltaPhi1 = RecoDecay::constrainAngle(preDeltaPhi1); + float deltaEta = track.eta() - jet.eta(); + + // calculate distance from jet axis + float distance = std::sqrt(deltaEta * deltaEta + deltaPhi1 * deltaPhi1); + + registry.fill(HIST("ptCorrVsDistance"), distance, ptCorr); + registry.fill(HIST("ptVsCentrality"), collision.centrality(), track.pt()); + + // calculate compornents of jetshapefunction rho(r) + std::vector trackPtSum; + std::vector trackPtSumBg1; + std::vector trackPtSumBg2; + trackPtSum.reserve(distanceCategory->size() - 1); + trackPtSumBg1.reserve(distanceCategory->size() - 1); + trackPtSumBg2.reserve(distanceCategory->size() - 1); + float phiBg1 = jet.phi() + (o2::constants::math::PIHalf); + float phiBg2 = jet.phi() - (o2::constants::math::PIHalf); + + float preDeltaPhiBg1 = track.phi() - phiBg1; + float preDeltaPhiBg2 = track.phi() - phiBg2; + + float deltaPhiBg1 = RecoDecay::constrainAngle(preDeltaPhiBg1); + float deltaPhiBg2 = RecoDecay::constrainAngle(preDeltaPhiBg2); + + float distanceBg1 = std::sqrt(deltaEta * deltaEta + deltaPhiBg1 * deltaPhiBg1); + float distanceBg2 = std::sqrt(deltaEta * deltaEta + deltaPhiBg2 * deltaPhiBg2); + + for (size_t i = 0; i < distanceCategory->size() - 1; i++) { + if (distance < distanceCategory->at(i + 1)) + trackPtSum[i] += track.pt(); + if (distanceBg1 < distanceCategory->at(i + 1)) + trackPtSumBg1[i] += track.pt(); + if (distanceBg2 < distanceCategory->at(i + 1)) + trackPtSumBg2[i] += track.pt(); + } + + for (size_t i = 0; i < distanceCategory->size() - 1; i++) { + ptDensity[i] += trackPtSum[i] / ((distanceCategory->at(i + 1) - distanceCategory->at(i)) * ptCorr); + ptDensityBg1[i] += trackPtSumBg1[i] / ((distanceCategory->at(i + 1) - distanceCategory->at(i)) * ptCorr); + ptDensityBg2[i] += trackPtSumBg2[i] / ((distanceCategory->at(i + 1) - distanceCategory->at(i)) * ptCorr); + } + } + + registry.fill(HIST("jetPt"), jet.pt()); + registry.fill(HIST("jetEta"), jet.eta()); + registry.fill(HIST("jetPhi"), jet.phi()); + registry.fill(HIST("area"), jet.area()); + registry.fill(HIST("rho"), collision.rho()); + registry.fill(HIST("ptCorr"), ptCorr); + + for (size_t i = 0; i < distanceCategory->size() - 1; i++) { + double jetX = (distanceCategory->at(i + 1) - distanceCategory->at(i)) * i + (distanceCategory->at(i + 1) - distanceCategory->at(i)) / 2; + double jetShapeFunction = ptDensity[i + 1]; + double jetShapeFunctionBg1 = ptDensityBg1[i + 1]; + double jetShapeFunctionBg2 = ptDensityBg2[i + 1]; + registry.fill(HIST("ptSum"), jetX, jetShapeFunction); + registry.fill(HIST("ptSumBg1"), jetX, jetShapeFunctionBg1); + registry.fill(HIST("ptSumBg2"), jetX, jetShapeFunctionBg2); + } + } + } + PROCESS_SWITCH(JetShapeTask, processJetShape, "JetShape", true); + + void processProductionRatio(soa::Filtered>::iterator const& collision, soa::Join const& tracks, soa::Join const& jets) + { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + return; + } + + for (auto const& jet : jets) { + if (!isAcceptedJet(jet)) { + continue; + } + + // tracks conditions + for (const auto& track : tracks) { + if (track.tpcNClsCrossedRows() < maxTpcNClsCrossedRows) + continue; + if (std::fabs(track.dcaXY()) > maxDcaXY) + continue; + if (track.itsNCls() < maxItsNCls) { + continue; + } + + // PID check + registry.fill(HIST("tpcDedx"), track.pt(), track.tpcSignal()); + registry.fill(HIST("tofBeta"), track.pt(), track.beta()); + registry.fill(HIST("tofMass"), track.mass()); + + // for calculate purity + registry.fill(HIST("tpcPi"), track.pt(), track.tpcNSigmaPi()); + registry.fill(HIST("tofPi"), track.pt(), track.tofNSigmaPi()); + registry.fill(HIST("tpcPr"), track.pt(), track.tpcNSigmaPr()); + registry.fill(HIST("tofPr"), track.pt(), track.tofNSigmaPr()); + + // for calculate distance + float preDeltaPhi1 = track.phi() - jet.phi(); + float deltaPhi1 = RecoDecay::constrainAngle(preDeltaPhi1); + float deltaEta = track.eta() - jet.eta(); + + // calculate distance from jet axis + float distance = std::sqrt(deltaEta * deltaEta + deltaPhi1 * deltaPhi1); + + registry.fill(HIST("distanceVsTrackpt"), distance, track.pt()); + } + } + } + PROCESS_SWITCH(JetShapeTask, processProductionRatio, "production ratio", true); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From f316082ad8d23e5701ca35c0560b0ec804e4d64f Mon Sep 17 00:00:00 2001 From: rolavick Date: Thu, 27 Feb 2025 15:13:31 +0100 Subject: [PATCH 0450/1650] [PWGUD] Personal task modification (#10227) Co-authored-by: ALICE Action Bot --- PWGUD/Tasks/CMakeLists.txt | 2 +- ...upcTauCentralBarrelRL.cxx => upcTauRl.cxx} | 288 ++---------------- 2 files changed, 32 insertions(+), 258 deletions(-) rename PWGUD/Tasks/{upcTauCentralBarrelRL.cxx => upcTauRl.cxx} (89%) diff --git a/PWGUD/Tasks/CMakeLists.txt b/PWGUD/Tasks/CMakeLists.txt index f752f7d12ac..c875ce1aa25 100644 --- a/PWGUD/Tasks/CMakeLists.txt +++ b/PWGUD/Tasks/CMakeLists.txt @@ -125,7 +125,7 @@ o2physics_add_dpl_workflow(tautau13topo COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(upc-tau-rl - SOURCES upcTauCentralBarrelRL.cxx + SOURCES upcTauRl.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::ReconstructionDataFormats O2::DetectorsBase O2::DetectorsCommonDataFormats COMPONENT_NAME Analysis) diff --git a/PWGUD/Tasks/upcTauCentralBarrelRL.cxx b/PWGUD/Tasks/upcTauRl.cxx similarity index 89% rename from PWGUD/Tasks/upcTauCentralBarrelRL.cxx rename to PWGUD/Tasks/upcTauRl.cxx index 9551270f3fa..f249a05834f 100644 --- a/PWGUD/Tasks/upcTauCentralBarrelRL.cxx +++ b/PWGUD/Tasks/upcTauRl.cxx @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. // -/// \file upcTauCentralBarrelRL.cxx +/// \file upcTauRl.cxx /// \brief Personal task to analyze tau events from UPC collisions /// /// \author Roman Lavicka , Austrian Academy of Sciences & SMI @@ -67,12 +67,14 @@ struct UpcTauRl { Configurable doMCtrueElectronCheck{"doMCtrueElectronCheck", false, {"Check if track hypothesis corresponds to MC truth. If no, it cuts."}}; Configurable oppositeMCtrueElectronCheck{"oppositeMCtrueElectronCheck", false, {"While doMCtrueElectronCheck is true, check if track hypothesis corresponds to MC truth. If yes, it cuts."}}; Configurable doTwoTracks{"doTwoTracks", false, {"Define histos for two tracks and allow to fill them"}}; - Configurable doFourTracks{"doFourTracks", false, {"Define histos for four tracks and allow to fill them"}}; - Configurable doSixTracks{"doSixTracks", false, {"Define histos for six tracks and allow to fill them"}}; struct : ConfigurableGroup { Configurable whichGapSide{"whichGapSide", 2, {"0 for side A, 1 for side C, 2 for both sides"}}; Configurable useTrueGap{"useTrueGap", true, {"Calculate gapSide for a given FV0/FT0/ZDC thresholds"}}; + Configurable cutNumContribs{"cutNumContribs", 2, {"How many contributors event has"}}; + Configurable useNumContribs{"useNumContribs", true, {"Use coll.numContribs as event cut"}}; + Configurable cutRecoFlag{"cutRecoFlag", 1, {"0 = std mode, 1 = upc mode"}}; + Configurable useRecoFlag{"useRecoFlag", false, {"Use coll.flags as event cut"}}; Configurable cutTrueGapSideFV0{"cutTrueGapSideFV0", -1, "FV0A threshold for SG selector"}; Configurable cutTrueGapSideFT0A{"cutTrueGapSideFT0A", 150., "FT0A threshold for SG selector"}; Configurable cutTrueGapSideFT0C{"cutTrueGapSideFT0C", 50., "FT0C threshold for SG selector"}; @@ -653,72 +655,6 @@ struct UpcTauRl { histos.add("EventTwoTracks/ElectronOther/PID/hTOFnSigmaVsPP", ";Pion #it{p} (GeV/c);n#sigma_{TOF} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisNsigma}); } - if (doFourTracks) { - histos.add("EventFourTracks/hInvariantMass", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMass}); - histos.add("EventFourTracks/hInvariantMassWide", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMassWide}); - histos.add("EventFourTracks/hInvariantMassWideNoMothers", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMassWide}); - histos.add("EventFourTracks/hMotherP", ";Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMom}); - histos.add("EventFourTracks/hMotherPwide", ";Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMomWide}); - histos.add("EventFourTracks/hMotherPt", ";Mother #it{p_{T}} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPt}); - histos.add("EventFourTracks/hMotherPhi", ";Mother #phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPhi}); - histos.add("EventFourTracks/hMotherRapidity", ";Mother #it{y} (-);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisRap}); - histos.add("EventFourTracks/hMotherMassVsPt", ";Invariant mass (GeV/c^{2});Mother #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisInvMassWide, confAxis.zzAxisPt}); - histos.add("EventFourTracks/PID/hTPCsignalVsP", ";Track #it{p} (GeV/c);TPC d#it{E}/d#it{x} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisTPCdEdx}); - - histos.add("EventFourTracks/WithElectron/hInvariantMass", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMass}); - histos.add("EventFourTracks/WithElectron/hInvariantMassWide", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMassWide}); - histos.add("EventFourTracks/WithElectron/hMotherP", ";Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMom}); - histos.add("EventFourTracks/WithElectron/hMotherPwide", ";Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMomWide}); - histos.add("EventFourTracks/WithElectron/hMotherPt", ";Mother #it{p_{T}} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPt}); - histos.add("EventFourTracks/WithElectron/hMotherPhi", ";Mother #phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPhi}); - histos.add("EventFourTracks/WithElectron/hMotherRapidity", ";Mother #it{y} (-);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisRap}); - histos.add("EventFourTracks/WithElectron/hMotherMassVsPt", ";Invariant mass (GeV/c^{2});Mother #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisInvMassWide, confAxis.zzAxisPt}); - histos.add("EventFourTracks/WithElectron/PID/hTPCsignalVsP", ";Track #it{p} (GeV/c);TPC d#it{E}/d#it{x} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisTPCdEdx}); - - histos.add("EventFourTracks/WithMuon/hInvariantMass", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMass}); - histos.add("EventFourTracks/WithMuon/hInvariantMassWide", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMassWide}); - histos.add("EventFourTracks/WithMuon/hMotherP", ";Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMom}); - histos.add("EventFourTracks/WithMuon/hMotherPwide", ";Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMomWide}); - histos.add("EventFourTracks/WithMuon/hMotherPt", ";Mother #it{p_{T}} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPt}); - histos.add("EventFourTracks/WithMuon/hMotherPhi", ";Mother #phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPhi}); - histos.add("EventFourTracks/WithMuon/hMotherRapidity", ";Mother #it{y} (-);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisRap}); - histos.add("EventFourTracks/WithMuon/hMotherMassVsPt", ";Invariant mass (GeV/c^{2});Mother #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisInvMassWide, confAxis.zzAxisPt}); - histos.add("EventFourTracks/WithMuon/PID/hTPCsignalVsP", ";Track #it{p} (GeV/c);TPC d#it{E}/d#it{x} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisTPCdEdx}); - - histos.add("EventFourTracks/WithPion/hInvariantMass", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMass}); - histos.add("EventFourTracks/WithPion/hInvariantMassWide", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMassWide}); - histos.add("EventFourTracks/WithPion/hMotherP", ";Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMom}); - histos.add("EventFourTracks/WithPion/hMotherPwide", ";Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMomWide}); - histos.add("EventFourTracks/WithPion/hMotherPt", ";Mother #it{p_{T}} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPt}); - histos.add("EventFourTracks/WithPion/hMotherPhi", ";Mother #phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPhi}); - histos.add("EventFourTracks/WithPion/hMotherRapidity", ";Mother #it{y} (-);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisRap}); - histos.add("EventFourTracks/WithPion/hMotherMassVsPt", ";Invariant mass (GeV/c^{2});Mother #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisInvMassWide, confAxis.zzAxisPt}); - histos.add("EventFourTracks/WithPion/PID/hTPCsignalVsP", ";Track #it{p} (GeV/c);TPC d#it{E}/d#it{x} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisTPCdEdx}); - } - - if (doSixTracks) { - histos.add("EventSixTracks/hInvariantMass", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMass}); - histos.add("EventSixTracks/hInvariantMassWide", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMassWide}); - histos.add("EventSixTracks/hInvariantMassWideNoMothers", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMassWide}); - histos.add("EventSixTracks/hMotherP", ";Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMom}); - histos.add("EventSixTracks/hMotherPwide", ";Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMomWide}); - histos.add("EventSixTracks/hMotherPt", ";Mother #it{p_{T}} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPt}); - histos.add("EventSixTracks/hMotherPhi", ";Mother #phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPhi}); - histos.add("EventSixTracks/hMotherRapidity", ";Mother #it{y} (-);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisRap}); - histos.add("EventSixTracks/hMotherMassVsPt", ";Invariant mass (GeV/c^{2});Mother #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisInvMassWide, confAxis.zzAxisPt}); - histos.add("EventSixTracks/PID/hTPCsignalVsP", ";Track #it{p} (GeV/c);TPC d#it{E}/d#it{x} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisTPCdEdx}); - - histos.add("EventSixTracks/SixPions/hInvariantMass", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMass}); - histos.add("EventSixTracks/SixPions/hInvariantMassWide", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMassWide}); - histos.add("EventSixTracks/SixPions/hMotherP", ";Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMom}); - histos.add("EventSixTracks/SixPions/hMotherPwide", ";Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMomWide}); - histos.add("EventSixTracks/SixPions/hMotherPt", ";Mother #it{p_{T}} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPt}); - histos.add("EventSixTracks/SixPions/hMotherPhi", ";Mother #phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPhi}); - histos.add("EventSixTracks/SixPions/hMotherRapidity", ";Mother #it{y} (-);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisRap}); - histos.add("EventSixTracks/SixPions/hMotherMassVsPt", ";Invariant mass (GeV/c^{2});Mother #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisInvMassWide, confAxis.zzAxisPt}); - histos.add("EventSixTracks/SixPions/PID/hTPCsignalVsP", ";Track #it{p} (GeV/c);TPC d#it{E}/d#it{x} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisTPCdEdx}); - } - if (doTruthHistos) { histos.add("Events/Truth/hCountCollisions", ";;Number of generated collision (-)", HistType::kTH1D, {{1, 0.5, 1.5}}); histos.add("Events/Truth/hChannels", ";Channels (-);Number of events (-)", HistType::kTH1D, {{confAxis.zzAxisChannels}}); @@ -791,9 +727,9 @@ struct UpcTauRl { bool isFulfillsITSHitRequirementsReinstatement(uint8_t itsClusterMap) const { - constexpr uint8_t bit = 1; + constexpr uint8_t kBit = 1; for (const auto& kITSrequirement : cutMyRequiredITSHits) { - auto hits = std::count_if(kITSrequirement.second.begin(), kITSrequirement.second.end(), [&](auto&& requiredLayer) { return itsClusterMap & (bit << requiredLayer); }); + auto hits = std::count_if(kITSrequirement.second.begin(), kITSrequirement.second.end(), [&](auto&& requiredLayer) { return itsClusterMap & (kBit << requiredLayer); }); if ((kITSrequirement.first == -1) && (hits > 0)) { return false; // no hits were required in specified layers } else if (hits < kITSrequirement.first) { @@ -1563,99 +1499,6 @@ struct UpcTauRl { if (electronPt > 2. && electronPt < 100.) histos.get(HIST("EventTwoTracks/ElectronOther/hNeventsPtCuts"))->Fill(12); } - } else if (countPVGTselected == 4 && doFourTracks) { - - TLorentzVector mother, daug[4]; - const auto& trkDaug1 = reconstructedBarrelTracks.iteratorAt(vecPVidx[0]); - const auto& trkDaug2 = reconstructedBarrelTracks.iteratorAt(vecPVidx[1]); - const auto& trkDaug3 = reconstructedBarrelTracks.iteratorAt(vecPVidx[2]); - const auto& trkDaug4 = reconstructedBarrelTracks.iteratorAt(vecPVidx[3]); - daug[0].SetPxPyPzE(trkDaug1.px(), trkDaug1.py(), trkDaug1.pz(), energy(pdg->Mass(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)), trkDaug1.px(), trkDaug1.py(), trkDaug1.pz())); - daug[1].SetPxPyPzE(trkDaug2.px(), trkDaug2.py(), trkDaug2.pz(), energy(pdg->Mass(trackPDG(trkDaug2, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)), trkDaug2.px(), trkDaug2.py(), trkDaug2.pz())); - daug[2].SetPxPyPzE(trkDaug3.px(), trkDaug3.py(), trkDaug3.pz(), energy(pdg->Mass(trackPDG(trkDaug3, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)), trkDaug3.px(), trkDaug3.py(), trkDaug3.pz())); - daug[3].SetPxPyPzE(trkDaug4.px(), trkDaug4.py(), trkDaug4.pz(), energy(pdg->Mass(trackPDG(trkDaug4, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)), trkDaug4.px(), trkDaug4.py(), trkDaug4.pz())); - mother = daug[0] + daug[1] + daug[2] + daug[3]; - - histos.get(HIST("EventFourTracks/hInvariantMass"))->Fill(mother.M()); - histos.get(HIST("EventFourTracks/hInvariantMassWide"))->Fill(mother.M()); - histos.get(HIST("EventFourTracks/hMotherP"))->Fill(mother.P()); - histos.get(HIST("EventFourTracks/hMotherPwide"))->Fill(mother.P()); - histos.get(HIST("EventFourTracks/hMotherPt"))->Fill(mother.Pt()); - histos.get(HIST("EventFourTracks/hMotherPhi"))->Fill(mother.Phi()); - histos.get(HIST("EventFourTracks/hMotherRapidity"))->Fill(mother.Rapidity()); - histos.get(HIST("EventFourTracks/hMotherMassVsPt"))->Fill(mother.M(), mother.Pt()); - - // ee, mm, em, pp, ep, mp, pppp, eppp, mppp, pppppp - if (countPVGTpions == 4) { - histos.get(HIST("Events/hChannels"))->Fill(CH_FOURPI); - histos.get(HIST("EventFourTracks/WithPion/hInvariantMass"))->Fill(mother.M()); - histos.get(HIST("EventFourTracks/WithPion/hInvariantMassWide"))->Fill(mother.M()); - histos.get(HIST("EventFourTracks/WithPion/hMotherP"))->Fill(mother.P()); - histos.get(HIST("EventFourTracks/WithPion/hMotherPwide"))->Fill(mother.P()); - histos.get(HIST("EventFourTracks/WithPion/hMotherPt"))->Fill(mother.Pt()); - histos.get(HIST("EventFourTracks/WithPion/hMotherPhi"))->Fill(mother.Phi()); - histos.get(HIST("EventFourTracks/WithPion/hMotherRapidity"))->Fill(mother.Rapidity()); - histos.get(HIST("EventFourTracks/WithPion/hMotherMassVsPt"))->Fill(mother.M(), mother.Pt()); - } - if (countPVGTelectrons == 1 && countPVGTpions == 3) { - histos.get(HIST("Events/hChannels"))->Fill(CH_ETHREEPI); - histos.get(HIST("EventFourTracks/WithElectron/hInvariantMass"))->Fill(mother.M()); - histos.get(HIST("EventFourTracks/WithElectron/hInvariantMassWide"))->Fill(mother.M()); - histos.get(HIST("EventFourTracks/WithElectron/hMotherP"))->Fill(mother.P()); - histos.get(HIST("EventFourTracks/WithElectron/hMotherPwide"))->Fill(mother.P()); - histos.get(HIST("EventFourTracks/WithElectron/hMotherPt"))->Fill(mother.Pt()); - histos.get(HIST("EventFourTracks/WithElectron/hMotherPhi"))->Fill(mother.Phi()); - histos.get(HIST("EventFourTracks/WithElectron/hMotherRapidity"))->Fill(mother.Rapidity()); - histos.get(HIST("EventFourTracks/WithElectron/hMotherMassVsPt"))->Fill(mother.M(), mother.Pt()); - } - if (countPVGTpions == 3 && countPVGTmuons == 1) { - histos.get(HIST("Events/hChannels"))->Fill(CH_MUTHREEPI); - histos.get(HIST("EventFourTracks/WithMuon/hInvariantMass"))->Fill(mother.M()); - histos.get(HIST("EventFourTracks/WithMuon/hInvariantMassWide"))->Fill(mother.M()); - histos.get(HIST("EventFourTracks/WithMuon/hMotherP"))->Fill(mother.P()); - histos.get(HIST("EventFourTracks/WithMuon/hMotherPwide"))->Fill(mother.P()); - histos.get(HIST("EventFourTracks/WithMuon/hMotherPt"))->Fill(mother.Pt()); - histos.get(HIST("EventFourTracks/WithMuon/hMotherPhi"))->Fill(mother.Phi()); - histos.get(HIST("EventFourTracks/WithMuon/hMotherRapidity"))->Fill(mother.Rapidity()); - histos.get(HIST("EventFourTracks/WithMuon/hMotherMassVsPt"))->Fill(mother.M(), mother.Pt()); - } - } else if (countPVGTselected == 6 && doSixTracks) { - TLorentzVector mother, daug[6]; - const auto& trkDaug1 = reconstructedBarrelTracks.iteratorAt(vecPVidx[0]); - const auto& trkDaug2 = reconstructedBarrelTracks.iteratorAt(vecPVidx[1]); - const auto& trkDaug3 = reconstructedBarrelTracks.iteratorAt(vecPVidx[2]); - const auto& trkDaug4 = reconstructedBarrelTracks.iteratorAt(vecPVidx[3]); - const auto& trkDaug5 = reconstructedBarrelTracks.iteratorAt(vecPVidx[4]); - const auto& trkDaug6 = reconstructedBarrelTracks.iteratorAt(vecPVidx[5]); - daug[0].SetPxPyPzE(trkDaug1.px(), trkDaug1.py(), trkDaug1.pz(), energy(pdg->Mass(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)), trkDaug1.px(), trkDaug1.py(), trkDaug1.pz())); - daug[1].SetPxPyPzE(trkDaug2.px(), trkDaug2.py(), trkDaug2.pz(), energy(pdg->Mass(trackPDG(trkDaug2, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)), trkDaug2.px(), trkDaug2.py(), trkDaug2.pz())); - daug[2].SetPxPyPzE(trkDaug3.px(), trkDaug3.py(), trkDaug3.pz(), energy(pdg->Mass(trackPDG(trkDaug3, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)), trkDaug3.px(), trkDaug3.py(), trkDaug3.pz())); - daug[3].SetPxPyPzE(trkDaug4.px(), trkDaug4.py(), trkDaug4.pz(), energy(pdg->Mass(trackPDG(trkDaug4, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)), trkDaug4.px(), trkDaug4.py(), trkDaug4.pz())); - daug[4].SetPxPyPzE(trkDaug5.px(), trkDaug5.py(), trkDaug5.pz(), energy(pdg->Mass(trackPDG(trkDaug5, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)), trkDaug5.px(), trkDaug5.py(), trkDaug5.pz())); - daug[5].SetPxPyPzE(trkDaug6.px(), trkDaug6.py(), trkDaug6.pz(), energy(pdg->Mass(trackPDG(trkDaug6, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)), trkDaug6.px(), trkDaug6.py(), trkDaug6.pz())); - mother = daug[0] + daug[1] + daug[2] + daug[3] + daug[4] + daug[5]; - - histos.get(HIST("EventSixTracks/hInvariantMass"))->Fill(mother.M()); - histos.get(HIST("EventSixTracks/hInvariantMassWide"))->Fill(mother.M()); - histos.get(HIST("EventSixTracks/hMotherP"))->Fill(mother.P()); - histos.get(HIST("EventSixTracks/hMotherPwide"))->Fill(mother.P()); - histos.get(HIST("EventSixTracks/hMotherPt"))->Fill(mother.Pt()); - histos.get(HIST("EventSixTracks/hMotherPhi"))->Fill(mother.Phi()); - histos.get(HIST("EventSixTracks/hMotherRapidity"))->Fill(mother.Rapidity()); - histos.get(HIST("EventSixTracks/hMotherMassVsPt"))->Fill(mother.M(), mother.Pt()); - - // ee, mm, em, pp, ep, mp, pppp, eppp, mppp, pppppp - if (countPVGTpions == 6) { - histos.get(HIST("Events/hChannels"))->Fill(CH_SIXPI); - histos.get(HIST("EventSixTracks/SixPions/hInvariantMass"))->Fill(mother.M()); - histos.get(HIST("EventSixTracks/SixPions/hInvariantMassWide"))->Fill(mother.M()); - histos.get(HIST("EventSixTracks/SixPions/hMotherP"))->Fill(mother.P()); - histos.get(HIST("EventSixTracks/SixPions/hMotherPwide"))->Fill(mother.P()); - histos.get(HIST("EventSixTracks/SixPions/hMotherPt"))->Fill(mother.Pt()); - histos.get(HIST("EventSixTracks/SixPions/hMotherPhi"))->Fill(mother.Phi()); - histos.get(HIST("EventSixTracks/SixPions/hMotherRapidity"))->Fill(mother.Rapidity()); - histos.get(HIST("EventSixTracks/SixPions/hMotherMassVsPt"))->Fill(mother.M(), mother.Pt()); - } } else { printDebugMessage("Other particles"); } @@ -2152,99 +1995,6 @@ struct UpcTauRl { } } } - } else if (countPVGTselected == 4 && doFourTracks) { - - TLorentzVector daug[4]; - const auto& trkDaug1 = reconstructedBarrelTracks.iteratorAt(vecPVidx[0]); - const auto& trkDaug2 = reconstructedBarrelTracks.iteratorAt(vecPVidx[1]); - const auto& trkDaug3 = reconstructedBarrelTracks.iteratorAt(vecPVidx[2]); - const auto& trkDaug4 = reconstructedBarrelTracks.iteratorAt(vecPVidx[3]); - daug[0].SetPxPyPzE(trkDaug1.px(), trkDaug1.py(), trkDaug1.pz(), energy(pdg->Mass(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)), trkDaug1.px(), trkDaug1.py(), trkDaug1.pz())); - daug[1].SetPxPyPzE(trkDaug2.px(), trkDaug2.py(), trkDaug2.pz(), energy(pdg->Mass(trackPDG(trkDaug2, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)), trkDaug2.px(), trkDaug2.py(), trkDaug2.pz())); - daug[2].SetPxPyPzE(trkDaug3.px(), trkDaug3.py(), trkDaug3.pz(), energy(pdg->Mass(trackPDG(trkDaug3, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)), trkDaug3.px(), trkDaug3.py(), trkDaug3.pz())); - daug[3].SetPxPyPzE(trkDaug4.px(), trkDaug4.py(), trkDaug4.pz(), energy(pdg->Mass(trackPDG(trkDaug4, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)), trkDaug4.px(), trkDaug4.py(), trkDaug4.pz())); - - if (trkDaug1.hasTPC()) { - histos.get(HIST("EventFourTracks/PID/hTPCsignalVsP"))->Fill(daug[0].P(), trkDaug1.tpcSignal()); - if (countPVGTpions == 4) - histos.get(HIST("EventFourTracks/WithPion/PID/hTPCsignalVsP"))->Fill(daug[0].P(), trkDaug1.tpcSignal()); - if (countPVGTelectrons == 1 && countPVGTpions == 3) - histos.get(HIST("EventFourTracks/WithElectron/PID/hTPCsignalVsP"))->Fill(daug[0].P(), trkDaug1.tpcSignal()); - if (countPVGTpions == 3 && countPVGTmuons == 1) - histos.get(HIST("EventFourTracks/WithMuon/PID/hTPCsignalVsP"))->Fill(daug[0].P(), trkDaug1.tpcSignal()); - } - if (trkDaug2.hasTPC()) { - histos.get(HIST("EventFourTracks/PID/hTPCsignalVsP"))->Fill(daug[1].P(), trkDaug2.tpcSignal()); - if (countPVGTpions == 4) - histos.get(HIST("EventFourTracks/WithPion/PID/hTPCsignalVsP"))->Fill(daug[1].P(), trkDaug2.tpcSignal()); - if (countPVGTelectrons == 1 && countPVGTpions == 3) - histos.get(HIST("EventFourTracks/WithElectron/PID/hTPCsignalVsP"))->Fill(daug[1].P(), trkDaug2.tpcSignal()); - if (countPVGTpions == 3 && countPVGTmuons == 1) - histos.get(HIST("EventFourTracks/WithMuon/PID/hTPCsignalVsP"))->Fill(daug[1].P(), trkDaug2.tpcSignal()); - } - if (trkDaug3.hasTPC()) { - histos.get(HIST("EventFourTracks/PID/hTPCsignalVsP"))->Fill(daug[2].P(), trkDaug3.tpcSignal()); - if (countPVGTpions == 4) - histos.get(HIST("EventFourTracks/WithPion/PID/hTPCsignalVsP"))->Fill(daug[2].P(), trkDaug3.tpcSignal()); - if (countPVGTelectrons == 1 && countPVGTpions == 3) - histos.get(HIST("EventFourTracks/WithElectron/PID/hTPCsignalVsP"))->Fill(daug[2].P(), trkDaug3.tpcSignal()); - if (countPVGTpions == 3 && countPVGTmuons == 1) - histos.get(HIST("EventFourTracks/WithMuon/PID/hTPCsignalVsP"))->Fill(daug[2].P(), trkDaug3.tpcSignal()); - } - if (trkDaug4.hasTPC()) { - histos.get(HIST("EventFourTracks/PID/hTPCsignalVsP"))->Fill(daug[3].P(), trkDaug4.tpcSignal()); - if (countPVGTpions == 4) - histos.get(HIST("EventFourTracks/WithPion/PID/hTPCsignalVsP"))->Fill(daug[3].P(), trkDaug4.tpcSignal()); - if (countPVGTelectrons == 1 && countPVGTpions == 3) - histos.get(HIST("EventFourTracks/WithElectron/PID/hTPCsignalVsP"))->Fill(daug[3].P(), trkDaug4.tpcSignal()); - if (countPVGTpions == 3 && countPVGTmuons == 1) - histos.get(HIST("EventFourTracks/WithMuon/PID/hTPCsignalVsP"))->Fill(daug[3].P(), trkDaug4.tpcSignal()); - } - } else if (countPVGTselected == 6 && doSixTracks) { - TLorentzVector daug[6]; - const auto& trkDaug1 = reconstructedBarrelTracks.iteratorAt(vecPVidx[0]); - const auto& trkDaug2 = reconstructedBarrelTracks.iteratorAt(vecPVidx[1]); - const auto& trkDaug3 = reconstructedBarrelTracks.iteratorAt(vecPVidx[2]); - const auto& trkDaug4 = reconstructedBarrelTracks.iteratorAt(vecPVidx[3]); - const auto& trkDaug5 = reconstructedBarrelTracks.iteratorAt(vecPVidx[4]); - const auto& trkDaug6 = reconstructedBarrelTracks.iteratorAt(vecPVidx[5]); - daug[0].SetPxPyPzE(trkDaug1.px(), trkDaug1.py(), trkDaug1.pz(), energy(pdg->Mass(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)), trkDaug1.px(), trkDaug1.py(), trkDaug1.pz())); - daug[1].SetPxPyPzE(trkDaug2.px(), trkDaug2.py(), trkDaug2.pz(), energy(pdg->Mass(trackPDG(trkDaug2, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)), trkDaug2.px(), trkDaug2.py(), trkDaug2.pz())); - daug[2].SetPxPyPzE(trkDaug3.px(), trkDaug3.py(), trkDaug3.pz(), energy(pdg->Mass(trackPDG(trkDaug3, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)), trkDaug3.px(), trkDaug3.py(), trkDaug3.pz())); - daug[3].SetPxPyPzE(trkDaug4.px(), trkDaug4.py(), trkDaug4.pz(), energy(pdg->Mass(trackPDG(trkDaug4, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)), trkDaug4.px(), trkDaug4.py(), trkDaug4.pz())); - daug[4].SetPxPyPzE(trkDaug5.px(), trkDaug5.py(), trkDaug5.pz(), energy(pdg->Mass(trackPDG(trkDaug5, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)), trkDaug5.px(), trkDaug5.py(), trkDaug5.pz())); - daug[5].SetPxPyPzE(trkDaug6.px(), trkDaug6.py(), trkDaug6.pz(), energy(pdg->Mass(trackPDG(trkDaug6, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)), trkDaug6.px(), trkDaug6.py(), trkDaug6.pz())); - - if (trkDaug1.hasTPC()) { - histos.get(HIST("EventSixTracks/PID/hTPCsignalVsP"))->Fill(daug[0].P(), trkDaug1.tpcSignal()); - if (countPVGTpions == 6) - histos.get(HIST("EventSixTracks/SixPions/PID/hTPCsignalVsP"))->Fill(daug[0].P(), trkDaug1.tpcSignal()); - } - if (trkDaug2.hasTPC()) { - histos.get(HIST("EventSixTracks/PID/hTPCsignalVsP"))->Fill(daug[1].P(), trkDaug2.tpcSignal()); - if (countPVGTpions == 6) - histos.get(HIST("EventSixTracks/SixPions/PID/hTPCsignalVsP"))->Fill(daug[1].P(), trkDaug2.tpcSignal()); - } - if (trkDaug3.hasTPC()) { - histos.get(HIST("EventSixTracks/PID/hTPCsignalVsP"))->Fill(daug[2].P(), trkDaug3.tpcSignal()); - if (countPVGTpions == 6) - histos.get(HIST("EventSixTracks/SixPions/PID/hTPCsignalVsP"))->Fill(daug[2].P(), trkDaug3.tpcSignal()); - } - if (trkDaug4.hasTPC()) { - histos.get(HIST("EventSixTracks/PID/hTPCsignalVsP"))->Fill(daug[3].P(), trkDaug4.tpcSignal()); - if (countPVGTpions == 6) - histos.get(HIST("EventSixTracks/SixPions/PID/hTPCsignalVsP"))->Fill(daug[3].P(), trkDaug4.tpcSignal()); - } - if (trkDaug5.hasTPC()) { - histos.get(HIST("EventSixTracks/PID/hTPCsignalVsP"))->Fill(daug[4].P(), trkDaug5.tpcSignal()); - if (countPVGTpions == 6) - histos.get(HIST("EventSixTracks/SixPions/PID/hTPCsignalVsP"))->Fill(daug[4].P(), trkDaug5.tpcSignal()); - } - if (trkDaug6.hasTPC()) { - histos.get(HIST("EventSixTracks/PID/hTPCsignalVsP"))->Fill(daug[5].P(), trkDaug6.tpcSignal()); - if (countPVGTpions == 6) - histos.get(HIST("EventSixTracks/SixPions/PID/hTPCsignalVsP"))->Fill(daug[5].P(), trkDaug6.tpcSignal()); - } } else { printDebugMessage("Other particles"); } @@ -2523,6 +2273,12 @@ struct UpcTauRl { if (!isGoodFITtime(reconstructedCollision, cutSample.cutFITtime)) return; + if (cutSample.useNumContribs && (reconstructedCollision.numContrib() != cutSample.cutNumContribs)) + return; + + if (cutSample.useRecoFlag && (reconstructedCollision.flags() != cutSample.cutRecoFlag)) + return; + if (doMainHistos) { fillHistograms(reconstructedBarrelTracks); fillFIThistograms(reconstructedCollision); @@ -2552,6 +2308,12 @@ struct UpcTauRl { if (!isGoodFITtime(reconstructedCollision, cutSample.cutFITtime)) return; + if (cutSample.useNumContribs && (reconstructedCollision.numContrib() != cutSample.cutNumContribs)) + return; + + if (cutSample.useRecoFlag && (reconstructedCollision.flags() != cutSample.cutRecoFlag)) + return; + if (doMainHistos) { fillHistograms(reconstructedBarrelTracks); fillFIThistograms(reconstructedCollision); @@ -2573,6 +2335,12 @@ struct UpcTauRl { if (!isGoodFITtime(reconstructedCollision, cutSample.cutFITtime)) return; + if (cutSample.useNumContribs && (reconstructedCollision.numContrib() != cutSample.cutNumContribs)) + return; + + if (cutSample.useRecoFlag && (reconstructedCollision.flags() != cutSample.cutRecoFlag)) + return; + if (cutSample.applyAcceptanceSelection) { for (const auto& track : reconstructedBarrelTracks) { if (!track.isPVContributor()) @@ -2612,6 +2380,12 @@ struct UpcTauRl { if (!isGoodFITtime(reconstructedCollision, cutSample.cutFITtime)) return; + if (cutSample.useNumContribs && (reconstructedCollision.numContrib() != cutSample.cutNumContribs)) + return; + + if (cutSample.useRecoFlag && (reconstructedCollision.flags() != cutSample.cutRecoFlag)) + return; + if (cutSample.applyAcceptanceSelection) { for (const auto& track : reconstructedBarrelTracks) { if (!track.isPVContributor()) From 5330289a55006a3b29157ea404b3ce74fb05e005 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Karpi=C5=84ski?= <40724893+davkk@users.noreply.github.com> Date: Thu, 27 Feb 2025 16:24:20 +0100 Subject: [PATCH 0451/1650] [PWGCF/FemtoUniverse] Make `EfficiencyCalculator` generic and allow histograms of higher dimensions (#9931) --- .../Core/FemtoUniverseEfficiencyCalculator.h | 99 +++++++++++-------- .../Tasks/femtoUniversePairTaskTrackD0.cxx | 16 +-- .../Tasks/femtoUniversePairTaskTrackPhi.cxx | 14 +-- ...emtoUniversePairTaskTrackTrackExtended.cxx | 24 +++-- 4 files changed, 83 insertions(+), 70 deletions(-) diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCalculator.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCalculator.h index 05794b5c477..4c3599de001 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCalculator.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCalculator.h @@ -35,18 +35,31 @@ enum ParticleNo : size_t { template concept isOneOrTwo = T == ParticleNo::ONE || T == ParticleNo::TWO; +template +consteval auto getHistDim() -> int +{ + if (std::is_same_v) + return 1; + else if (std::is_same_v) + return 2; + else if (std::is_same_v) + return 3; + else + return -1; +} + struct EfficiencyConfigurableGroup : ConfigurableGroup { - Configurable confEfficiencyDoMCTruth{"confEfficiencyDoMCTruth", false, "Should fill MC Truth histogram"}; Configurable confEfficiencyApplyCorrections{"confEfficiencyApplyCorrections", false, "Should apply corrections from efficiency"}; - Configurable> confEfficiencyCCDBLabels{"confEfficiencyCCDBLabels", {}, "Custom labels for efficiency objects in CCDB"}; - Configurable confCCDBTrainNumber{"confCCDBTrainNumber", -1, "Train number for which to query CCDB objects (set to -1 to ignore)"}; - Configurable> confEfficiencyCCDBTimestamps{"confEfficiencyCCDBTimestamps", {"-1", "-1"}, "Timestamps in CCDB, to query for specific objects (default: -1 for both, the latest valid object)"}; + Configurable confEfficiencyCCDBTrainNumber{"confEfficiencyCCDBTrainNumber", -1, "Train number for which to query CCDB objects (set to -1 to ignore)"}; + Configurable> confEfficiencyCCDBTimestamps{"confEfficiencyCCDBTimestamps", {}, "Timestamps of efficiency histograms in CCDB, to query for specific objects (default: ['-1', '-1'], gets the latest valid objects for both)"}; // NOTE: in the future we might move the below configurables to a separate struct, eg. CCDBConfigurableGroup Configurable confCCDBUrl{"confCCDBUrl", "http://alice-ccdb.cern.ch", "CCDB URL to be used"}; Configurable confCCDBPath{"confCCDBPath", "", "CCDB base path to where to upload objects"}; }; +template + requires std::is_base_of_v class EfficiencyCalculator { public: @@ -63,39 +76,31 @@ class EfficiencyCalculator int64_t now = duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); ccdb.setCreatedNotAfter(now); - shouldDoTruth = config->confEfficiencyDoMCTruth; shouldApplyCorrections = config->confEfficiencyApplyCorrections; - if (config->confEfficiencyApplyCorrections) { - hLoaded = { - loadEfficiencyFromCCDB(ParticleNo::ONE), - loadEfficiencyFromCCDB(ParticleNo::TWO), // - }; - } - } - - template - requires isOneOrTwo - auto doMCTruth( - FemtoUniverseParticleHisto& hMCTruth, - const auto& particles) const -> void - { - if (shouldDoTruth) { - for (const auto& particle : particles) { - hMCTruth.template fillQA(particle); + if (config->confEfficiencyApplyCorrections && !config->confEfficiencyCCDBTimestamps.value.empty()) { + for (const auto& timestamp : config->confEfficiencyCCDBTimestamps.value) { + hLoaded.push_back(loadEfficiencyFromCCDB(std::stol(timestamp))); } + + LOGF(info, notify("Successfully loaded %d efficiency histogram(s)"), hLoaded.size()); } } - auto getWeight(const size_t partNo, const auto& particle) const -> float + template + requires(sizeof...(BinVars) == getHistDim()) + auto getWeight(ParticleNo partNo, const BinVars&... binVars) const -> float { auto weight = 1.0f; - auto hEff = hLoaded[partNo - 1]; - if (shouldApplyCorrections && hEff) { - auto bin = hEff->FindBin(particle.pt()); - auto eff = hEff->GetBinContent(bin); - weight /= eff > 0 ? eff : 1.0f; + if (partNo - 1 < config->confEfficiencyCCDBTimestamps.value.size()) { + auto hEff = hLoaded[partNo - 1]; + + if (shouldApplyCorrections && hEff) { + auto bin = hEff->FindBin(binVars...); + auto eff = hEff->GetBinContent(bin); + weight /= eff > 0 ? eff : 1.0f; + } } return weight; @@ -107,38 +112,46 @@ class EfficiencyCalculator return fmt::format("[EFFICIENCY] {}", msg); } - auto loadEfficiencyFromCCDB(const size_t partNo) const -> TH1* + static auto isHistEmpty(HistType* hist) -> bool { - std::map metadata{}; - - if (partNo - 1 < config->confEfficiencyCCDBLabels->size()) { - metadata["label"] = config->confEfficiencyCCDBLabels.value[partNo - 1]; + if (!hist) { + return true; } - if (config->confCCDBTrainNumber > 0) { - metadata["trainNumber"] = std::to_string(config->confCCDBTrainNumber); + for (auto idx = 0; idx <= hist->GetNbinsX() + 1; idx++) { + if (hist->GetBinContent(idx) > 0) { + return false; + } } + return true; + } - auto timestamp = partNo - 1 < config->confEfficiencyCCDBTimestamps->size() - ? std::stoll(config->confEfficiencyCCDBTimestamps.value[partNo - 1]) - : -1; + auto loadEfficiencyFromCCDB(const int64_t timestamp) const -> HistType* + { + std::map metadata{}; - auto hEff = ccdb.getSpecific(config->confCCDBPath, timestamp, metadata); + if (config->confEfficiencyCCDBTrainNumber > 0) { + metadata["trainNumber"] = std::to_string(config->confEfficiencyCCDBTrainNumber); + } + + auto hEff = ccdb.getSpecific(config->confCCDBPath, timestamp, metadata); if (!hEff || hEff->IsZombie()) { - LOGF(error, notify("Could not load histogram from %s for particle %d"), config->confCCDBPath.value, partNo); + LOGF(error, notify("Could not load histogram \"%s/%ld\""), config->confCCDBPath.value, timestamp); return nullptr; } - LOGF(info, notify("Histogram for particle %d loaded from \"%s\""), partNo, config->confCCDBPath.value); + if (isHistEmpty(hEff)) { + LOGF(warn, notify("Histogram \"%s/%ld\" has been loaded, but it is empty"), config->confCCDBPath.value, timestamp); + } + return hEff; } EfficiencyConfigurableGroup* config{}; - bool shouldDoTruth = false; bool shouldApplyCorrections = false; o2::ccdb::BasicCCDBManager& ccdb{o2::ccdb::BasicCCDBManager::instance()}; - std::array hLoaded{}; + std::vector hLoaded{}; }; } // namespace o2::analysis::femto_universe::efficiency diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx index 234f2352971..75d39bdf510 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx @@ -239,7 +239,7 @@ struct FemtoUniversePairTaskTrackD0 { // Efficiency EfficiencyConfigurableGroup effConfGroup; - EfficiencyCalculator efficiencyCalculator{&effConfGroup}; + EfficiencyCalculator efficiencyCalculator{&effConfGroup}; float weight = 1.0; HistogramRegistry registry{"registry", @@ -365,11 +365,11 @@ struct FemtoUniversePairTaskTrackD0 { void init(InitContext&) { - if (effConfGroup.confEfficiencyDoMCTruth) { - // WORK IN PROGRESS - // hMCTruth1.init(&qaRegistry, confBinsTempFitVarpT, confBinsTempFitVarPDG, false, ConfTrack.confTrackPDGCode, false); - // hMCTruth2.init(&qaRegistry, confBinsTempFitVarpT, confBinsTempFitVarPDG, false, 333, false); - } + // if (effConfGroup.confEfficiencyDoMCTruth) { + // WORK IN PROGRESS + // hMCTruth1.init(&qaRegistry, confBinsTempFitVarpT, confBinsTempFitVarPDG, false, ConfTrack.confTrackPDGCode, false); + // hMCTruth2.init(&qaRegistry, confBinsTempFitVarpT, confBinsTempFitVarPDG, false, 333, false); + // } efficiencyCalculator.init(); eventHisto.init(&qaRegistry); @@ -763,7 +763,7 @@ struct FemtoUniversePairTaskTrackD0 { // Efficiency weight = 1.0f; if (ConfEff.doEfficiencyCorr) { - weight = efficiencyCalculator.getWeight(ParticleNo::ONE, track) * efficiencyCalculator.getWeight(ParticleNo::TWO, d0candidate); + weight = efficiencyCalculator.getWeight(ParticleNo::ONE, track.pt()) * efficiencyCalculator.getWeight(ParticleNo::TWO, d0candidate.pt()); } sameEventAngularCont.setPair(track, d0candidate, multCol, ConfBothTracks.confUse3D); } @@ -861,7 +861,7 @@ struct FemtoUniversePairTaskTrackD0 { // Efficiency weight = 1.0f; if (ConfEff.doEfficiencyCorr) { - weight = efficiencyCalculator.getWeight(ParticleNo::ONE, track) * efficiencyCalculator.getWeight(ParticleNo::TWO, d0candidate); + weight = efficiencyCalculator.getWeight(ParticleNo::ONE, track.pt()) * efficiencyCalculator.getWeight(ParticleNo::TWO, d0candidate.pt()); } mixedEventAngularCont.setPair(track, d0candidate, multCol, ConfBothTracks.confUse3D); diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx index 25536b83262..d596aeb493e 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx @@ -168,7 +168,7 @@ struct FemtoUniversePairTaskTrackPhi { HistogramRegistry registryDCA{"registryDCA", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; EfficiencyConfigurableGroup effConfGroup; - EfficiencyCalculator efficiencyCalculator{&effConfGroup}; + EfficiencyCalculator efficiencyCalculator{&effConfGroup}; /// @brief Counter for particle swapping int fNeventsProcessed = 0; @@ -357,11 +357,9 @@ struct FemtoUniversePairTaskTrackPhi { void init(InitContext&) { - if (effConfGroup.confEfficiencyDoMCTruth) { + if (ConfIsMC) { hMCTruth1.init(&qaRegistry, ConfBinsTempFitVarpT, ConfBinsTempFitVarPDG, false, ConfTrackPDGCode, false); hMCTruth2.init(&qaRegistry, ConfBinsTempFitVarpT, ConfBinsTempFitVarPDG, false, 333, false); - } - if (ConfIsMC) { hTrackDCA.init(®istryDCA, ConfBinsTempFitVarpT, ConfBinsTempFitVarDCA, true, ConfTrackPDGCode, true); } efficiencyCalculator.init(); @@ -553,7 +551,7 @@ struct FemtoUniversePairTaskTrackPhi { continue; } - weight = efficiencyCalculator.getWeight(ParticleNo::ONE, phicandidate) * efficiencyCalculator.getWeight(ParticleNo::TWO, track); + weight = efficiencyCalculator.getWeight(ParticleNo::ONE, phicandidate.pt()) * efficiencyCalculator.getWeight(ParticleNo::TWO, track.pt()); if (swpart) sameEventCont.setPair(track, phicandidate, multCol, ConfUse3D, weight); @@ -643,7 +641,7 @@ struct FemtoUniversePairTaskTrackPhi { } } - weight = efficiencyCalculator.getWeight(ParticleNo::ONE, phicandidate) * efficiencyCalculator.getWeight(ParticleNo::TWO, track); + weight = efficiencyCalculator.getWeight(ParticleNo::ONE, phicandidate.pt()) * efficiencyCalculator.getWeight(ParticleNo::TWO, track.pt()); if (swpart) mixedEventCont.setPair(track, phicandidate, multCol, ConfUse3D, weight); @@ -754,9 +752,7 @@ struct FemtoUniversePairTaskTrackPhi { registryMCreco.fill(HIST("MCrecoPpos"), mcpart.pt(), mcpart.eta()); registryMCreco.fill(HIST("MCrecoPposPt"), mcpart.pt()); } - } - - else if (part.sign() < 0) { + } else if (part.sign() < 0) { registryMCreco.fill(HIST("MCrecoAllNegativePt"), mcpart.pt()); if (mcpart.pdgMCTruth() == -2212 && isParticleNSigmaAccepted(part.p(), trackCuts.getNsigmaTPC(part, o2::track::PID::Proton), trackCuts.getNsigmaTOF(part, o2::track::PID::Proton), trackCuts.getNsigmaTPC(part, o2::track::PID::Pion), trackCuts.getNsigmaTOF(part, o2::track::PID::Pion), trackCuts.getNsigmaTPC(part, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(part, o2::track::PID::Kaon))) { registryMCreco.fill(HIST("MCrecoPneg"), mcpart.pt(), mcpart.eta()); diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackExtended.cxx index c4bb27394de..b4dad165507 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackExtended.cxx @@ -177,7 +177,7 @@ struct FemtoUniversePairTaskTrackTrackExtended { HistogramRegistry mixQaRegistry{"mixQaRegistry", {}, OutputObjHandlingPolicy::AnalysisObject}; EfficiencyConfigurableGroup effConfGroup; - EfficiencyCalculator efficiencyCalculator{&effConfGroup}; + EfficiencyCalculator efficiencyCalculator{&effConfGroup}; /// @brief Counter for particle swapping int fNeventsProcessed = 0; @@ -315,7 +315,7 @@ struct FemtoUniversePairTaskTrackTrackExtended { void init(InitContext&) { - if (effConfGroup.confEfficiencyDoMCTruth) { + if (twotracksconfigs.confIsMC) { hMCTruth1.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarPDGBins, false, trackonefilter.confPDGCodePartOne, false); if (!confIsSame) { hMCTruth2.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarPDGBins, false, tracktwofilter.confPDGCodePartTwo, false); @@ -466,9 +466,9 @@ struct FemtoUniversePairTaskTrackTrackExtended { continue; } - float weight = efficiencyCalculator.getWeight(ParticleNo::ONE, p1); + float weight = efficiencyCalculator.getWeight(ParticleNo::ONE, p1.pt()); if (!confIsSame) { - weight *= efficiencyCalculator.getWeight(ParticleNo::TWO, p2); + weight *= efficiencyCalculator.getWeight(ParticleNo::TWO, p2.pt()); } if (swpart) @@ -527,9 +527,9 @@ struct FemtoUniversePairTaskTrackTrackExtended { continue; } - float weight = efficiencyCalculator.getWeight(ParticleNo::ONE, p1); + float weight = efficiencyCalculator.getWeight(ParticleNo::ONE, p1.pt()); if (!confIsSame) { - weight *= efficiencyCalculator.getWeight(ParticleNo::TWO, p2); + weight *= efficiencyCalculator.getWeight(ParticleNo::TWO, p2.pt()); } sameEventCont.setPair(p1, p2, multCol, twotracksconfigs.confUse3D, weight); @@ -563,11 +563,15 @@ struct FemtoUniversePairTaskTrackTrackExtended { fillCollision(col); auto groupMCTruth1 = partsOneMCTruth->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - efficiencyCalculator.doMCTruth<1>(hMCTruth1, groupMCTruth1); + for (const auto& particle : groupMCTruth1) { + hMCTruth1.fillQA(particle); + } if (!confIsSame) { auto groupMCTruth2 = partsTwoMCTruth->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - efficiencyCalculator.doMCTruth<2>(hMCTruth2, groupMCTruth2); + for (const auto& particle : groupMCTruth1) { + hMCTruth2.fillQA(particle); + } } auto groupMCReco1 = partsOneMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); @@ -635,9 +639,9 @@ struct FemtoUniversePairTaskTrackTrackExtended { } } - float weight = efficiencyCalculator.getWeight(ParticleNo::ONE, p1); + float weight = efficiencyCalculator.getWeight(ParticleNo::ONE, p1.pt()); if (!confIsSame) { - weight *= efficiencyCalculator.getWeight(ParticleNo::TWO, p2); + weight *= efficiencyCalculator.getWeight(ParticleNo::TWO, p2.pt()); } if (swpart) From 2c5802d8f51451b70ea55cb5fc42d0379c58f809 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Fri, 28 Feb 2025 01:16:22 +0900 Subject: [PATCH 0452/1650] [PWGEM/Dilepton] update studyMCTruth.cxx (#10219) --- PWGEM/Dilepton/Tasks/studyMCTruth.cxx | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/PWGEM/Dilepton/Tasks/studyMCTruth.cxx b/PWGEM/Dilepton/Tasks/studyMCTruth.cxx index 4e5fbf44ae3..58bed22b8d3 100644 --- a/PWGEM/Dilepton/Tasks/studyMCTruth.cxx +++ b/PWGEM/Dilepton/Tasks/studyMCTruth.cxx @@ -82,6 +82,8 @@ struct studyMCTruth { const AxisSpec axis_mll{ConfMllBins, "m_{ll} (GeV/c^{2})"}; const AxisSpec axis_ptll{ConfPtllBins, "p_{T,ll} (GeV/c)"}; + fRegistry.add("Event/hReccollsPerMCcoll", "Rec. colls per MC coll;Rec. colls per MC coll;Number of MC collisions", kTH1D, {{21, -0.5, 20.5}}, false); + fRegistry.add("Event/hSelReccollsPerMCcoll", "Selected Rec. colls per MC coll;Selected Rec. colls per MC coll;Number of MC collisions", kTH1D, {{21, -0.5, 20.5}}, false); fRegistry.add("Event/hDiffBC", "diffrence in BC;BC_{rec. coll.} - BC_{mc coll.}", kTH1D, {{101, -50.5, +50.5}}, false); fRegistry.add("Event/allMC/hZvtx", "MC Zvtx;Z_{vtx} (cm)", kTH1D, {{100, -50, +50}}, false); fRegistry.add("Event/allMC/hImpactParameter", "impact parameter;impact parameter b (fm)", kTH1D, {{200, 0, 20}}, false); @@ -238,6 +240,16 @@ struct studyMCTruth { const auto& bc_from_mcCollision = mcCollision.template bc_as(); bool isSelectedMC = isSelectedCollision(mcCollision, bc_from_mcCollision); + auto reccolls_per_mccoll = collisions.sliceBy(recColperMcCollision, mcCollision.globalIndex()); + fRegistry.fill(HIST("Event/hReccollsPerMCcoll"), reccolls_per_mccoll.size()); + int nselreccolls_per_mccoll = 0; + for (const auto& rec_col : reccolls_per_mccoll) { + if (isSelectedCollision(rec_col, rec_col.template foundBC_as())) { + nselreccolls_per_mccoll++; + } + } // end of reconstructed collision + fRegistry.fill(HIST("Event/hSelReccollsPerMCcoll"), nselreccolls_per_mccoll); + bool isSelectedRec = false; bool hasRecCollision = false; if (mcCollision.mpemeventId() >= 0) { @@ -312,6 +324,7 @@ struct studyMCTruth { SliceCache cache; Preslice perMcCollision = aod::mcparticle::mcCollisionId; + PresliceUnsorted recColperMcCollision = aod::mccollisionlabel::mcCollisionId; using MyMcCollisions = soa::Join; From c6316011d09ef718b967ccd163a79f910504bc5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Thu, 27 Feb 2025 18:21:53 +0100 Subject: [PATCH 0453/1650] [PWGHF] Fix missing std prefix (#10231) --- PWGHF/D2H/Macros/HFInvMassFitter.cxx | 4 ++-- PWGHF/D2H/Macros/runMassFitter.C | 4 ++-- PWGHF/D2H/TableProducer/dataCreatorCharmResoReduced.cxx | 6 +++--- PWGHF/D2H/Tasks/taskLb.cxx | 2 +- PWGHF/HFC/Macros/ExtractOutputCorrel.C | 8 ++++---- PWGHF/HFC/Macros/FitCorrel.C | 2 +- PWGHF/HFC/TableProducer/femtoDreamProducer.cxx | 2 +- PWGHF/TableProducer/candidateSelectorLbToLcPi.cxx | 4 ++-- PWGHF/TableProducer/mcPidTof.cxx | 6 +++--- 9 files changed, 19 insertions(+), 19 deletions(-) diff --git a/PWGHF/D2H/Macros/HFInvMassFitter.cxx b/PWGHF/D2H/Macros/HFInvMassFitter.cxx index 9b1ac55cd31..091b5a6f943 100644 --- a/PWGHF/D2H/Macros/HFInvMassFitter.cxx +++ b/PWGHF/D2H/Macros/HFInvMassFitter.cxx @@ -591,8 +591,8 @@ void HFInvMassFitter::calculateSignificance(Double_t& significance, Double_t& er Double_t sgnErrSquare = errSignal * errSignal; Double_t bkgErrSquare = errBkg * errBkg; Double_t totalSgnBkg = signal + bkg; - significance = signal / sqrt(signal + bkg); - errSignificance = significance * sqrt((sgnErrSquare + bkgErrSquare) / (mNSigmaForSidebands * totalSgnBkg * totalSgnBkg) + (bkg / totalSgnBkg) * (sgnErrSquare / signal / signal)); + significance = signal / std::sqrt(signal + bkg); + errSignificance = significance * std::sqrt((sgnErrSquare + bkgErrSquare) / (mNSigmaForSidebands * totalSgnBkg * totalSgnBkg) + (bkg / totalSgnBkg) * (sgnErrSquare / signal / signal)); } // estimate Signnal diff --git a/PWGHF/D2H/Macros/runMassFitter.C b/PWGHF/D2H/Macros/runMassFitter.C index 0c4c44f9ff7..b5fc1fb9187 100644 --- a/PWGHF/D2H/Macros/runMassFitter.C +++ b/PWGHF/D2H/Macros/runMassFitter.C @@ -40,7 +40,7 @@ using namespace rapidjson; int runMassFitter(TString configFileName = "config_massfitter.json"); template -void readArray(const Value& jsonArray, vector& output) +void readArray(const Value& jsonArray, std::vector& output) { for (auto it = jsonArray.Begin(); it != jsonArray.End(); it++) { auto value = it->template Get(); @@ -48,7 +48,7 @@ void readArray(const Value& jsonArray, vector& output) } } -void parseStringArray(const Value& jsonArray, vector& output) +void parseStringArray(const Value& jsonArray, std::vector& output) { size_t arrayLength = jsonArray.Size(); for (size_t i = 0; i < arrayLength; i++) { diff --git a/PWGHF/D2H/TableProducer/dataCreatorCharmResoReduced.cxx b/PWGHF/D2H/TableProducer/dataCreatorCharmResoReduced.cxx index 20188be07b8..714de7448ac 100644 --- a/PWGHF/D2H/TableProducer/dataCreatorCharmResoReduced.cxx +++ b/PWGHF/D2H/TableProducer/dataCreatorCharmResoReduced.cxx @@ -102,9 +102,9 @@ struct HfDataCreatorCharmResoReduced { Produces hfReducedCollision; // Defined in PWGHF/D2H/DataModel/ReducedDataModel.h Produces hfCollisionCounter; // Defined in PWGHF/D2H/DataModel/ReducedDataModel.h // tracks, V0 and D candidates reduced tables - Produces hfCandV0; // Defined in PWGHF/D2H/DataModel/ReducedDataModel.h + Produces hfCandV0; // Defined in PWGHF/D2H/DataModel/ReducedDataModel.h Produces hfTrackNoParam; // Defined in PWGHF/D2H/DataModel/ReducedDataModel.h - Produces hfCandD; // Defined in PWGHF/D2H/DataModel/ReducedDataModel.h + Produces hfCandD; // Defined in PWGHF/D2H/DataModel/ReducedDataModel.h // ML optional Tables Produces hfCandDMl; // Defined in PWGHF/D2H/DataModel/ReducedDataModel.h // MC Tables @@ -368,7 +368,7 @@ struct HfDataCreatorCharmResoReduced { auto trackNegPar = getTrackPar(trackNeg); o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackNegPar, 2.f, fitter.getMatCorrType(), &dcaInfo); auto trackNegDcaXY = dcaInfo[0]; - if (fabs(trackPosDcaXY) < cfgV0Cuts.dcaMaxDauToPv || fabs(trackNegDcaXY) < cfgV0Cuts.dcaMaxDauToPv) { + if (std::fabs(trackPosDcaXY) < cfgV0Cuts.dcaMaxDauToPv || std::fabs(trackNegDcaXY) < cfgV0Cuts.dcaMaxDauToPv) { return false; } // vertex reconstruction diff --git a/PWGHF/D2H/Tasks/taskLb.cxx b/PWGHF/D2H/Tasks/taskLb.cxx index e5f6099c4ac..a2c0723bd4f 100644 --- a/PWGHF/D2H/Tasks/taskLb.cxx +++ b/PWGHF/D2H/Tasks/taskLb.cxx @@ -66,7 +66,7 @@ struct HfTaskLb { bool passesImpactParameterResolution(float pT, float d0Resolution) { - float expectedResolution(0.001 + 0.0052 * exp(-0.655 * pT)); + float expectedResolution(0.001 + 0.0052 * std::exp(-0.655 * pT)); return (d0Resolution <= expectedResolution * 1.5); } // Compares to pT dependent cut on impact parameter resolution diff --git a/PWGHF/HFC/Macros/ExtractOutputCorrel.C b/PWGHF/HFC/Macros/ExtractOutputCorrel.C index f13116bffd6..301434f66e2 100644 --- a/PWGHF/HFC/Macros/ExtractOutputCorrel.C +++ b/PWGHF/HFC/Macros/ExtractOutputCorrel.C @@ -26,7 +26,7 @@ using namespace rapidjson; template -void readArray(const Value& jsonArray, vector& output) +void readArray(const Value& jsonArray, std::vector& output) { for (auto it = jsonArray.Begin(); it != jsonArray.End(); it++) { auto value = it->template Get(); @@ -34,7 +34,7 @@ void readArray(const Value& jsonArray, vector& output) } } -void parseStringArray(const Value& jsonArray, vector& output) +void parseStringArray(const Value& jsonArray, std::vector& output) { size_t arrayLength = jsonArray.Size(); for (size_t i = 0; i < arrayLength; i++) { @@ -45,7 +45,7 @@ void parseStringArray(const Value& jsonArray, vector& output) } void SetInputCorrelNames(DhCorrelationExtraction* plotter, TString pathFileMass, TString pathFileSE, TString pathFileME, TString dirSE, TString dirME, TString histoNameCorrSignal, TString histoNameCorrSideba); -void SetInputHistoInvMassNames(DhCorrelationExtraction* plotter, vector inputMassNames); +void SetInputHistoInvMassNames(DhCorrelationExtraction* plotter, std::vector inputMassNames); void ExtractOutputCorrel(TString cfgFileName = "config_CorrAnalysis.json") { @@ -185,7 +185,7 @@ void SetInputCorrelNames(DhCorrelationExtraction* plotter, TString pathFileMass, return; } -void SetInputHistoInvMassNames(DhCorrelationExtraction* plotter, vector inputMassNames) +void SetInputHistoInvMassNames(DhCorrelationExtraction* plotter, std::vector inputMassNames) { // to use if sgn and bkg extraction is done apart plotter->SetMassHistoNameSgn(inputMassNames[0].data()); diff --git a/PWGHF/HFC/Macros/FitCorrel.C b/PWGHF/HFC/Macros/FitCorrel.C index 591933112c6..37b36a5e1b3 100644 --- a/PWGHF/HFC/Macros/FitCorrel.C +++ b/PWGHF/HFC/Macros/FitCorrel.C @@ -31,7 +31,7 @@ using namespace rapidjson; template -void readArray(const Value& jsonArray, vector& output) +void readArray(const Value& jsonArray, std::vector& output) { for (auto it = jsonArray.Begin(); it != jsonArray.End(); it++) { auto value = it->template Get(); diff --git a/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx b/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx index 535ce98e07b..026d7d80992 100644 --- a/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx +++ b/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx @@ -249,7 +249,7 @@ struct HfFemtoDreamProducer { auto motherparticlesMc = particleMc.template mothers_as(); // check pdg code // if this fails, the particle is a fake - if (abs(pdgCode) == abs(trkPDGCode.value)) { + if (std::abs(pdgCode) == std::abs(trkPDGCode.value)) { // check first if particle is from pile up // check if the collision associated with the particle is the same as the analyzed collision by checking their Ids if ((col.has_mcCollision() && (particleMc.mcCollisionId() != col.mcCollisionId())) || !col.has_mcCollision()) { diff --git a/PWGHF/TableProducer/candidateSelectorLbToLcPi.cxx b/PWGHF/TableProducer/candidateSelectorLbToLcPi.cxx index afd1f4cf796..b1033c9555f 100644 --- a/PWGHF/TableProducer/candidateSelectorLbToLcPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorLbToLcPi.cxx @@ -62,7 +62,7 @@ struct HfCandidateSelectorLbToLcPi { bool passesImpactParameterResolution(float pT, float d0Resolution) { - float expectedResolution(0.001 + 0.0052 * exp(-0.655 * pT)); + float expectedResolution(0.001 + 0.0052 * std::exp(-0.655 * pT)); if (d0Resolution > expectedResolution * 1.5) return false; else @@ -149,7 +149,7 @@ struct HfCandidateSelectorLbToLcPi { float diffXVert = hfCandLb.xSecondaryVertex() - hfCandLc.xSecondaryVertex(); float diffYVert = hfCandLb.ySecondaryVertex() - hfCandLc.ySecondaryVertex(); float diffZVert = hfCandLb.zSecondaryVertex() - hfCandLc.zSecondaryVertex(); - float vertexDistance = sqrt(diffXVert * diffXVert + diffYVert * diffYVert + diffZVert * diffZVert); + float vertexDistance = std::sqrt(diffXVert * diffXVert + diffYVert * diffYVert + diffZVert * diffZVert); if (vertexDistance > maxVertexDistanceLbLc) { return false; } diff --git a/PWGHF/TableProducer/mcPidTof.cxx b/PWGHF/TableProducer/mcPidTof.cxx index 68429424b77..cdba1ab70c5 100644 --- a/PWGHF/TableProducer/mcPidTof.cxx +++ b/PWGHF/TableProducer/mcPidTof.cxx @@ -593,7 +593,7 @@ struct tofEventTime { if constexpr (removeTOFEvTimeBias) { evTimeMakerTOF.removeBias(trk, nGoodTracksForTOF, t0TOF[0], t0TOF[1], 2); } - if (t0TOF[1] < errDiamond && (maxEvTimeTOF <= 0 || abs(t0TOF[0]) < maxEvTimeTOF)) { + if (t0TOF[1] < errDiamond && (maxEvTimeTOF <= 0 || std::abs(t0TOF[0]) < maxEvTimeTOF)) { flags |= o2::aod::pidflags::enums::PIDFlags::EvTimeTOF; weight = 1.f / (t0TOF[1] * t0TOF[1]); @@ -621,7 +621,7 @@ struct tofEventTime { } else { tableFlags(flags); } - tableEvTime(eventTime / sumOfWeights, sqrt(1. / sumOfWeights)); + tableEvTime(eventTime / sumOfWeights, std::sqrt(1. / sumOfWeights)); if (enableTableEvTimeTOFOnly) { tableEvTimeTOFOnly((uint8_t)filterForTOFEventTime(trk), t0TOF[0], t0TOF[1], evTimeMakerTOF.mEventTimeMultiplicity); } @@ -657,7 +657,7 @@ struct tofEventTime { evTimeMakerTOF.removeBias(trk, nGoodTracksForTOF, et, erret, 2); } uint8_t flags = 0; - if (erret < errDiamond && (maxEvTimeTOF <= 0.f || abs(et) < maxEvTimeTOF)) { + if (erret < errDiamond && (maxEvTimeTOF <= 0.f || std::abs(et) < maxEvTimeTOF)) { flags |= o2::aod::pidflags::enums::PIDFlags::EvTimeTOF; } else { et = 0.f; From 4a4dd3fcfd7fb12d07fec79b71729611fd65b486 Mon Sep 17 00:00:00 2001 From: Noor Koster <82090643+cnkoster@users.noreply.github.com> Date: Thu, 27 Feb 2025 19:18:16 +0100 Subject: [PATCH 0454/1650] [PWGCF] Add bool for MCReco Event Selections (#10220) --- PWGCF/Flow/Tasks/flowSP.cxx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowSP.cxx b/PWGCF/Flow/Tasks/flowSP.cxx index 02bf82e2b44..32f1ca5691b 100644 --- a/PWGCF/Flow/Tasks/flowSP.cxx +++ b/PWGCF/Flow/Tasks/flowSP.cxx @@ -92,6 +92,7 @@ struct FlowSP { O2_DEFINE_CONFIGURABLE(cfgTVXinTRD, bool, false, "Use kTVXinTRD (reject TRD triggered events)"); O2_DEFINE_CONFIGURABLE(cfgIsVertexITSTPC, bool, true, "Selects collisions with at least one ITS-TPC track"); O2_DEFINE_CONFIGURABLE(cfgIsGoodITSLayersAll, bool, true, "Cut time intervals with dead ITS staves"); + O2_DEFINE_CONFIGURABLE(cfgEvSelsMCReco, bool, true, "Apply event selections in MC Reco"); // harmonics for v coefficients O2_DEFINE_CONFIGURABLE(cfgHarm, int, 1, "Flow harmonic n for ux and uy: (Cos(n*phi), Sin(n*phi))"); O2_DEFINE_CONFIGURABLE(cfgHarmMixed, int, 2, "Flow harmonic n for ux and uy in mixed harmonics (MH): (Cos(n*phi), Sin(n*phi))"); @@ -678,7 +679,6 @@ struct FlowSP { template inline void fillHistograms(TrackObject track, float wacc, float weff, double ux, double uy, double uxMH, double uyMH, double qxA, double qyA, double qxC, double qyC, double corrQQx, double corrQQy, double corrQQ, double vnA, double vnC, double vnFull, double centrality) { - registry.fill(HIST(Charge[ct]) + HIST("vnA_eta"), track.eta(), (uy * qyA + ux * qxA) / std::sqrt(std::fabs(corrQQ)), wacc * weff); registry.fill(HIST(Charge[ct]) + HIST("vnC_eta"), track.eta(), (uy * qyC + ux * qxC) / std::sqrt(std::fabs(corrQQ)), wacc * weff); @@ -874,9 +874,9 @@ struct FlowSP { registry.fill(HIST("hTrackCount"), trackSel_FilteredTracks); - float weff = 1, wacc = 1; - float weffP = 1, waccP = 1; - float weffN = 1, waccN = 1; + float weff = 1., wacc = 1.; + float weffP = 1., waccP = 1.; + float weffN = 1., waccN = 1.; if (!trackSelected(track, field)) continue; @@ -964,7 +964,7 @@ struct FlowSP { if (cfgFillQAHistos) fillEventQA(collision, tracks); - if (!eventSelected(collision, tracks.size(), centrality)) + if (cfgEvSelsMCReco && !eventSelected(collision, tracks.size(), centrality)) return; if (cfgFillQAHistos) From 4d8b022eb479634bb520b12e5a74e272e7dd618c Mon Sep 17 00:00:00 2001 From: hernasab Date: Thu, 27 Feb 2025 15:07:37 -0600 Subject: [PATCH 0455/1650] [PWGCF] adjusted event selection (#10235) Co-authored-by: Sabrina Hernandez --- PWGCF/Flow/Tasks/flowZdcTask.cxx | 35 +++++++++++++++++++------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowZdcTask.cxx b/PWGCF/Flow/Tasks/flowZdcTask.cxx index 7afe0fab2ec..53e84155958 100644 --- a/PWGCF/Flow/Tasks/flowZdcTask.cxx +++ b/PWGCF/Flow/Tasks/flowZdcTask.cxx @@ -83,6 +83,7 @@ struct FlowZdcTask { Configurable vtxRange{"vtxRange", 10.0f, "Vertex Z range to consider"}; Configurable etaRange{"etaRange", 1.0f, "Eta range to consider"}; Configurable npvTracksCut{"npvTracksCut", 1.0f, "Apply extra NPVtracks cut"}; + // event selection Configurable isApplySameBunchPileup{"isApplySameBunchPileup", true, "Enable SameBunchPileup cut"}; Configurable isApplyGoodZvtxFT0vsPV{"isApplyGoodZvtxFT0vsPV", true, "Enable GoodZvtxFT0vsPV cut"}; Configurable isApplyVertexITSTPC{"isApplyVertexITSTPC", false, "Enable VertexITSTPC cut"}; @@ -100,7 +101,11 @@ struct FlowZdcTask { Configurable isApplyCentNGlobal{"isApplyCentNGlobal", false, "Centrality based on global tracks"}; Configurable isApplyCentMFT{"isApplyCentMFT", false, "Centrality based on MFT tracks"}; Configurable isGoodITSLayersAll{"isGoodITSLayersAll", false, "Centrality based on no other collisions in this Readout Frame with per-collision multiplicity above threshold tracks"}; + Configurable isOccupancyCut{"isOccupancyCut", true, "Occupancy cut?"}; Configurable ft0cCut{"ft0cCut", 1.0f, "Apply extra FT0C cut"}; + Configurable minOccCut{"minOccCut", 0, "min Occu cut"}; + Configurable maxOccCut{"maxOccCut", 500, "max Occu cut"}; + Configurable posZcut{"posZcut", +10.0, "z-vertex position cut"}; ConfigurableAxis axisVertex{"axisVertex", {20, -10, 10}, "vertex axis for histograms"}; ConfigurableAxis axisPhi{"axisPhi", {60, 0.0, constants::math::TwoPI}, "phi axis for histograms"}; @@ -108,7 +113,7 @@ struct FlowZdcTask { ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.2, 0.25, 0.30, 0.40, 0.45, 0.50, 0.55, 0.60, 0.65, 0.70, 0.75, 0.80, 0.85, 0.90, 0.95, 1.00, 1.10, 1.20, 1.30, 1.40, 1.50, 1.60, 1.70, 1.80, 1.90, 2.00, 2.20, 2.40, 2.60, 2.80, 3.00}, "pt axis for histograms"}; ConfigurableAxis axisMultiplicity{"axisMultiplicity", {3500, 0, 3500}, "centrality axis for histograms"}; ConfigurableAxis axisEnergy{"axisEnergy", {100, 0, 700}, "energy axis for zdc histos"}; - ConfigurableAxis axisMultTpc{"axisMultTpc", {1000, -0.5f, 1999.5f}, "TPCmultiplicity"}; + ConfigurableAxis axisMultTpc{"axisMultTpc", {2000, -0.5f, 2999.5f}, "TPCmultiplicity"}; ConfigurableAxis axisZN{"axisZN", {5000, 0, 500}, "axisZN"}; ConfigurableAxis axisZP{"axisZP", {5000, 0, 500}, "axisZP"}; ConfigurableAxis axisFT0CAmp{"axisFT0CAmp", {5000, 0, 5000}, "axisFT0CAmp"}; @@ -224,11 +229,7 @@ struct FlowZdcTask { xAxis->SetBinLabel(3, "kNoSameBunchPileup"); // reject collisions in case of pileup with another collision in the same foundBC xAxis->SetBinLabel(4, "kIsGoodZvtxFT0vsPV"); // small difference between z-vertex from PV and from FT0 xAxis->SetBinLabel(5, "kIsVertexITSTPC"); // at least one ITS-TPC track (reject vertices built from ITS-only tracks) - xAxis->SetBinLabel(6, "kIsGoodITSLayersAll"); //"Centrality based on no other collisions in this Readout Frame with per-collision multiplicity above threshold tracks" - xAxis->SetBinLabel(7, "kIsApplyVertexTOFmatched"); - xAxis->SetBinLabel(8, "kIsVertexTRDmatched"); - xAxis->SetBinLabel(9, "centrality selection"); - xAxis->SetBinLabel(10, "isApplyExtraCorrCut"); + xAxis->SetBinLabel(6, "kIsApplyVertexTOFmatched"); //"Centrality based on no other collisions in this Readout Frame with per-collision multiplicity above threshold tracks" histos.add("GlobalMult_vs_FT0C", "GlobalMult_vs_FT0C", kTH2F, {axisMult, axisFT0CMult}); histos.add("VtxZHist", "VtxZHist", kTH1D, {axisVtxZ}); @@ -299,29 +300,35 @@ struct FlowZdcTask { } histos.fill(HIST("eventSelectionSteps"), 5); - if (isGoodITSLayersAll && !col.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + if (isApplyVertexTOFmatched && !col.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) { return false; } histos.fill(HIST("eventSelectionSteps"), 6); - if (isApplyVertexTOFmatched && !col.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) { + + if (isOccupancyCut) { + auto occuValue{isApplyFT0CbasedOccupancy + ? col.ft0cOccupancyInTimeRange() + : col.trackOccupancyInTimeRange()}; + + if (occuValue < minOccCut || occuValue > maxOccCut) + return false; + } + if (isGoodITSLayersAll && !col.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { return false; } - histos.fill(HIST("eventSelectionSteps"), 7); - if (isApplyVertexTRDmatched && !col.selection_bit(o2::aod::evsel::kIsVertexTRDmatched)) { return false; } - histos.fill(HIST("eventSelectionSteps"), 8); if (col.centFT0C() < 0. || col.centFT0C() > 100.) { return false; } - histos.fill(HIST("eventSelectionSteps"), 9); + if (std::fabs(col.posZ()) > posZcut) { + return false; + } if (isApplyExtraCorrCut && col.multNTracksPV() > npvTracksCut && col.multFT0C() < (10 * col.multNTracksPV() - ft0cCut)) { return false; } - histos.fill(HIST("eventSelectionSteps"), 10); - histos.fill(HIST("eventSelectionSteps"), 11); return true; } From b635d5c6d7a8d0746c95912770abd5ff12abd2cc Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Fri, 28 Feb 2025 07:25:52 +0900 Subject: [PATCH 0456/1650] [PWGEM/Photon] fix abs, fabs (#10224) Co-authored-by: ALICE Action Bot --- PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h | 16 ++-- PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h | 12 +-- PWGEM/PhotonMeson/DataModel/gammaTables.h | 2 +- .../skimmerPrimaryElectronFromDalitzEE.cxx | 90 ++++++++++--------- PWGEM/PhotonMeson/Tasks/pcmQC.cxx | 2 +- PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx | 4 +- 6 files changed, 67 insertions(+), 59 deletions(-) diff --git a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h index d26dca62045..e3c220a0c7f 100644 --- a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h +++ b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h @@ -532,10 +532,10 @@ struct Pi0EtaToGammaGamma { float openingAngle1 = std::acos(photon1.Vect().Dot(photon3.Vect()) / (photon1.P() * photon3.P())); float openingAngle2 = std::acos(photon2.Vect().Dot(photon3.Vect()) / (photon2.P() * photon3.P())); - if (openingAngle1 > emccuts.minOpenAngle && std::abs(mother1.Rapidity()) < maxY && iCellID_photon1 > 0) { + if (openingAngle1 > emccuts.minOpenAngle && std::fabs(mother1.Rapidity()) < maxY && iCellID_photon1 > 0) { fRegistry.fill(HIST("Pair/rotation/hs"), mother1.M(), mother1.Pt(), eventWeight); } - if (openingAngle2 > emccuts.minOpenAngle && std::abs(mother2.Rapidity()) < maxY && iCellID_photon2 > 0) { + if (openingAngle2 > emccuts.minOpenAngle && std::fabs(mother2.Rapidity()) < maxY && iCellID_photon2 > 0) { fRegistry.fill(HIST("Pair/rotation/hs"), mother2.M(), mother2.Pt(), eventWeight); } } @@ -635,7 +635,7 @@ struct Pi0EtaToGammaGamma { ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.); ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.); ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - if (std::abs(v12.Rapidity()) > maxY) { + if (std::fabs(v12.Rapidity()) > maxY) { continue; } @@ -699,7 +699,7 @@ struct Pi0EtaToGammaGamma { ROOT::Math::PtEtaPhiMVector v_ele(ele2.pt(), ele2.eta(), ele2.phi(), o2::constants::physics::MassElectron); ROOT::Math::PtEtaPhiMVector v_ee = v_pos + v_ele; ROOT::Math::PtEtaPhiMVector veeg = v_gamma + v_pos + v_ele; - if (std::abs(veeg.Rapidity()) > maxY) { + if (std::fabs(veeg.Rapidity()) > maxY) { continue; } @@ -729,7 +729,7 @@ struct Pi0EtaToGammaGamma { ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.); ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.); ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - if (std::abs(v12.Rapidity()) > maxY) { + if (std::fabs(v12.Rapidity()) > maxY) { continue; } @@ -779,7 +779,7 @@ struct Pi0EtaToGammaGamma { ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.); ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.); ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - if (std::abs(v12.Rapidity()) > maxY) { + if (std::fabs(v12.Rapidity()) > maxY) { continue; } @@ -808,7 +808,7 @@ struct Pi0EtaToGammaGamma { v2.SetM(g2.mass()); } ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - if (std::abs(v12.Rapidity()) > maxY) { + if (std::fabs(v12.Rapidity()) > maxY) { continue; } fRegistry.fill(HIST("Pair/mix/hs"), v12.M(), v12.Pt(), collision.weight()); @@ -834,7 +834,7 @@ struct Pi0EtaToGammaGamma { v1.SetM(g1.mass()); } ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - if (std::abs(v12.Rapidity()) > maxY) { + if (std::fabs(v12.Rapidity()) > maxY) { continue; } fRegistry.fill(HIST("Pair/mix/hs"), v12.M(), v12.Pt(), collision.weight()); diff --git a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h index e39d4165e4e..fb6ce8842d3 100644 --- a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h +++ b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h @@ -244,7 +244,7 @@ struct Pi0EtaToGammaGammaMC { if (d_bz_input > -990) { d_bz = d_bz_input; o2::parameters::GRPMagField grpmag; - if (fabs(d_bz) > 1e-5) { + if (std::fabs(d_bz) > 1e-5) { grpmag.setL3Current(30000.f / (d_bz / 5.0f)); } mRunNumber = collision.runNumber(); @@ -434,7 +434,7 @@ struct Pi0EtaToGammaGammaMC { continue; } - if (eventcuts.onlyKeepWeightedEvents && fabs(collision.weight() - 1.) < 1E-10) { + if (eventcuts.onlyKeepWeightedEvents && std::fabs(collision.weight() - 1.) < 1E-10) { continue; } @@ -507,7 +507,7 @@ struct Pi0EtaToGammaGammaMC { ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.); ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.); ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - if (std::abs(v12.Rapidity()) > maxY_rec) { + if (std::fabs(v12.Rapidity()) > maxY_rec) { continue; } @@ -583,7 +583,7 @@ struct Pi0EtaToGammaGammaMC { ROOT::Math::PtEtaPhiMVector v_pos(pos2.pt(), pos2.eta(), pos2.phi(), o2::constants::physics::MassElectron); ROOT::Math::PtEtaPhiMVector v_ele(ele2.pt(), ele2.eta(), ele2.phi(), o2::constants::physics::MassElectron); ROOT::Math::PtEtaPhiMVector veeg = v_gamma + v_pos + v_ele; - if (std::abs(veeg.Rapidity()) > maxY_rec) { + if (std::fabs(veeg.Rapidity()) > maxY_rec) { continue; } if (pi0id > 0) { @@ -606,7 +606,7 @@ struct Pi0EtaToGammaGammaMC { ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.); ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.); ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - if (std::abs(v12.Rapidity()) > maxY_rec) { + if (std::fabs(v12.Rapidity()) > maxY_rec) { continue; } // if (pi0id > 0) { @@ -664,7 +664,7 @@ struct Pi0EtaToGammaGammaMC { continue; // I don't know why this is necessary in simulation. } - if (eventcuts.onlyKeepWeightedEvents && fabs(collision.weight() - 1.) < 1E-10) { + if (eventcuts.onlyKeepWeightedEvents && std::fabs(collision.weight() - 1.) < 1E-10) { continue; } diff --git a/PWGEM/PhotonMeson/DataModel/gammaTables.h b/PWGEM/PhotonMeson/DataModel/gammaTables.h index d81902b234f..f2d97a68a36 100644 --- a/PWGEM/PhotonMeson/DataModel/gammaTables.h +++ b/PWGEM/PhotonMeson/DataModel/gammaTables.h @@ -277,7 +277,7 @@ using V0PhotonKFCov = V0PhotonsKFCov::iterator; DECLARE_SOA_TABLE(EMPrimaryElectronsFromDalitz, "AOD", "EMPRIMARYELDA", //! o2::soa::Index<>, emprimaryelectron::CollisionId, emprimaryelectron::TrackId, emprimaryelectron::Sign, - track::Pt, track::Eta, track::Phi, track::DcaXY, track::DcaZ, + track::Pt, track::Eta, track::Phi, track::DcaXY, track::DcaZ, track::CYY, track::CZY, track::CZZ, track::TPCNClsFindable, track::TPCNClsFindableMinusFound, track::TPCNClsFindableMinusCrossedRows, track::TPCChi2NCl, track::TPCInnerParam, track::TPCSignal, pidtpc::TPCNSigmaEl, pidtpc::TPCNSigmaPi, diff --git a/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx b/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx index a42f00e0374..95c4a0678ee 100644 --- a/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx +++ b/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx @@ -13,6 +13,10 @@ /// \author daiki.sekihata@cern.ch #include +#include +#include +#include + #include "Math/Vector4D.h" #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -35,6 +39,8 @@ using namespace o2::framework::expressions; using namespace o2::constants::physics; using namespace o2::pwgem::photonmeson; +using MyCollisions = soa::Join; +using MyCollisionsMC = soa::Join; using MyTracks = soa::Join; using MyTrack = MyTracks::iterator; using MyTracksMC = soa::Join; @@ -58,24 +64,23 @@ struct skimmerPrimaryElectronFromDalitzEE { Configurable min_ncluster_tpc{"min_ncluster_tpc", 0, "min ncluster tpc"}; Configurable mincrossedrows{"mincrossedrows", 70, "min. crossed rows"}; Configurable min_tpc_cr_findable_ratio{"min_tpc_cr_findable_ratio", 0.8, "min. TPC Ncr/Nf ratio"}; - Configurable minitsncls{"minitsncls", 4, "min. number of ITS clusters"}; + Configurable max_frac_shared_clusters_tpc{"max_frac_shared_clusters_tpc", 999.f, "max fraction of shared clusters in TPC"}; + Configurable min_ncluster_its{"min_ncluster_its", 4, "min ncluster its"}; + Configurable min_ncluster_itsib{"min_ncluster_itsib", 1, "min ncluster itsib"}; Configurable maxchi2tpc{"maxchi2tpc", 5.0, "max. chi2/NclsTPC"}; Configurable maxchi2its{"maxchi2its", 6.0, "max. chi2/NclsITS"}; - Configurable minpt{"minpt", 0.15, "min pt for track"}; - Configurable maxeta{"maxeta", 0.8, "eta acceptance"}; - Configurable dca_xy_max{"dca_xy_max", 0.1, "max DCAxy in cm"}; - Configurable dca_z_max{"dca_z_max", 0.1, "max DCAz in cm"}; + Configurable minpt{"minpt", 0.1, "min pt for track"}; + Configurable maxeta{"maxeta", 0.9, "eta acceptance"}; + Configurable dca_xy_max{"dca_xy_max", 0.05, "max DCAxy in cm"}; + Configurable dca_z_max{"dca_z_max", 0.05, "max DCAz in cm"}; Configurable minTPCNsigmaEl{"minTPCNsigmaEl", -2.5, "min. TPC n sigma for electron inclusion"}; Configurable maxTPCNsigmaEl{"maxTPCNsigmaEl", 3.5, "max. TPC n sigma for electron inclusion"}; - Configurable maxTPCNsigmaPi{"maxTPCNsigmaPi", 2.5, "max. TPC n sigma for pion exclusion"}; - Configurable minTPCNsigmaPi{"minTPCNsigmaPi", -1e+10, "min. TPC n sigma for pion exclusion"}; - Configurable maxMee_lowPtee{"maxMee_lowPtee", 0.02, "max. mee to store dalitz ee pairs for recovery"}; - Configurable maxMee_highPtee{"maxMee_highPtee", 0.04, "max. mee to store dalitz ee pairs for recovery"}; + Configurable maxTPCNsigmaPi{"maxTPCNsigmaPi", 0.0, "max. TPC n sigma for pion exclusion"}; + Configurable minTPCNsigmaPi{"minTPCNsigmaPi", 0.0, "min. TPC n sigma for pion exclusion"}; + Configurable maxMee{"maxMee", 0.06, "max. mee to store dalitz ee pairs"}; HistogramRegistry fRegistry{"output", {}, OutputObjHandlingPolicy::AnalysisObject, false, false}; - std::pair> itsRequirement = {1, {0, 1, 2}}; // any hits on 3 ITS ib layers. - int mRunNumber; float d_bz; Service ccdb; @@ -121,7 +126,7 @@ struct skimmerPrimaryElectronFromDalitzEE { if (d_bz_input > -990) { d_bz = d_bz_input; o2::parameters::GRPMagField grpmag; - if (fabs(d_bz) > 1e-5) { + if (std::fabs(d_bz) > 1e-5) { grpmag.setL3Current(30000.f / (d_bz / 5.0f)); } o2::base::Propagator::initFieldFromGRP(&grpmag); @@ -172,12 +177,10 @@ struct skimmerPrimaryElectronFromDalitzEE { if (!track.hasITS() || !track.hasTPC()) { return false; } - if (track.itsNCls() < minitsncls) { + if (track.itsNCls() < min_ncluster_its) { return false; } - - auto hits = std::count_if(itsRequirement.second.begin(), itsRequirement.second.end(), [&](auto&& requiredLayer) { return track.itsClusterMap() & (1 << requiredLayer); }); - if (hits < itsRequirement.first) { + if (track.itsNClsInnerBarrel() < min_ncluster_itsib) { return false; } @@ -193,11 +196,15 @@ struct skimmerPrimaryElectronFromDalitzEE { return false; } - if (abs(track.dcaXY()) > dca_xy_max || abs(track.dcaZ()) > dca_z_max) { + if (track.tpcFractionSharedCls() > max_frac_shared_clusters_tpc) { + return false; + } + + if (std::fabs(track.dcaXY()) > dca_xy_max || std::fabs(track.dcaZ()) > dca_z_max) { return false; } - if (track.pt() < minpt || abs(track.eta()) > maxeta) { + if (track.pt() < minpt || std::fabs(track.eta()) > maxeta) { return false; } @@ -221,7 +228,7 @@ struct skimmerPrimaryElectronFromDalitzEE { { if (std::find(stored_trackIds.begin(), stored_trackIds.end(), std::make_pair(collision.globalIndex(), track.globalIndex())) == stored_trackIds.end()) { emprimaryelectrons(collision.globalIndex(), track.globalIndex(), track.sign(), - track.pt(), track.eta(), track.phi(), track.dcaXY(), track.dcaZ(), + track.pt(), track.eta(), track.phi(), track.dcaXY(), track.dcaZ(), track.cYY(), track.cZY(), track.cZZ(), track.tpcNClsFindable(), track.tpcNClsFindableMinusFound(), track.tpcNClsFindableMinusCrossedRows(), track.tpcChi2NCl(), track.tpcInnerParam(), track.tpcSignal(), track.tpcNSigmaEl(), track.tpcNSigmaPi(), @@ -252,8 +259,8 @@ struct skimmerPrimaryElectronFromDalitzEE { template void fillPairInfo(TCollision const& collision, TTracks1 const& tracks1, TTracks2 const& tracks2) { - for (auto& t1 : tracks1) { - for (auto& t2 : tracks2) { + for (const auto& t1 : tracks1) { + for (const auto& t2 : tracks2) { if (!checkTrack(collision, t1) || !checkTrack(collision, t2)) { continue; } @@ -265,47 +272,44 @@ struct skimmerPrimaryElectronFromDalitzEE { ROOT::Math::PtEtaPhiMVector v2(t2.pt(), t2.eta(), t2.phi(), o2::constants::physics::MassElectron); ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - if (v12.Pt() < 1.0) { // don't store - if (v12.M() > maxMee_lowPtee) { // don't store - continue; - } - } else { - if (v12.M() > maxMee_highPtee) { // don't store - continue; - } + if (v12.M() > maxMee) { // don't store + continue; } fRegistry.fill(HIST("Pair/hMeePtee_ULS"), v12.M(), v12.Pt()); fillTrackTable(collision, t1); fillTrackTable(collision, t2); } // end of t2 - } // end of t1 + } // end of t1 } std::vector> stored_trackIds; - Filter trackFilter = o2::aod::track::pt > minpt&& nabs(o2::aod::track::eta) < maxeta&& o2::aod::track::tpcChi2NCl < maxchi2tpc&& o2::aod::track::itsChi2NCl < maxchi2its&& ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::ITS) == true && ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::TPC) == true; + Filter trackFilter = o2::aod::track::pt > minpt&& nabs(o2::aod::track::eta) < maxeta&& o2::aod::track::tpcChi2NCl < maxchi2tpc&& o2::aod::track::itsChi2NCl < maxchi2its&& ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::ITS) == true && ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::TPC) == true && nabs(o2::aod::track::dcaXY) < dca_xy_max&& nabs(o2::aod::track::dcaZ) < dca_z_max; Filter pidFilter = minTPCNsigmaEl < o2::aod::pidtpc::tpcNSigmaEl && o2::aod::pidtpc::tpcNSigmaEl < maxTPCNsigmaEl; using MyFilteredTracks = soa::Filtered; Partition posTracks = o2::aod::track::signed1Pt > 0.f; Partition negTracks = o2::aod::track::signed1Pt < 0.f; // ---------- for data ---------- - void processRec(Join const& collisions, aod::BCsWithTimestamps const&, MyFilteredTracks const& tracks) + void processRec(MyCollisions const& collisions, aod::BCsWithTimestamps const&, MyFilteredTracks const& tracks) { stored_trackIds.reserve(tracks.size()); - for (auto& collision : collisions) { - auto bc = collision.bc_as(); + for (const auto& collision : collisions) { + auto bc = collision.template foundBC_as(); initCCDB(bc); if (applyEveSel_at_skimming && (!collision.selection_bit(o2::aod::evsel::kIsTriggerTVX) || !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder))) { continue; } + if (collision.ngpcm() < 1) { + continue; + } auto posTracks_per_coll = posTracks->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); auto negTracks_per_coll = negTracks->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); fillPairInfo(collision, posTracks_per_coll, negTracks_per_coll); // ULS - } // end of collision loop + } // end of collision loop stored_trackIds.clear(); stored_trackIds.shrink_to_fit(); @@ -316,25 +320,29 @@ struct skimmerPrimaryElectronFromDalitzEE { Partition posTracksMC = o2::aod::track::signed1Pt > 0.f; Partition negTracksMC = o2::aod::track::signed1Pt < 0.f; // ---------- for MC ---------- - void processMC(soa::Join const& collisions, aod::McCollisions const&, aod::BCsWithTimestamps const&, MyFilteredTracksMC const& tracks) + void processMC(MyCollisionsMC const& collisions, aod::McCollisions const&, aod::BCsWithTimestamps const&, MyFilteredTracksMC const& tracks) { stored_trackIds.reserve(tracks.size()); - for (auto& collision : collisions) { + for (const auto& collision : collisions) { if (!collision.has_mcCollision()) { continue; } - auto bc = collision.bc_as(); + auto bc = collision.template foundBC_as(); initCCDB(bc); + if (applyEveSel_at_skimming && (!collision.selection_bit(o2::aod::evsel::kIsTriggerTVX) || !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder))) { continue; } + if (collision.ngpcm() < 1) { + continue; + } auto posTracks_per_coll = posTracksMC->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); auto negTracks_per_coll = negTracksMC->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); fillPairInfo(collision, posTracks_per_coll, negTracks_per_coll); // ULS - } // end of collision loop + } // end of collision loop stored_trackIds.clear(); stored_trackIds.shrink_to_fit(); @@ -351,10 +359,10 @@ struct skimmerPrimaryElectronFromDalitzEE { // // void process(aod::EMPrimaryElectrons const& electrons) // { -// for (auto& electron : electrons) { +// for (const auto& electron : electrons) { // auto electrons_with_same_trackId = electrons.sliceBy(perTrack, electron.trackId()); // ambele_self_Ids.reserve(electrons_with_same_trackId.size()); -// for (auto& amp_ele : electrons_with_same_trackId) { +// for (const auto& amp_ele : electrons_with_same_trackId) { // if (amp_ele.globalIndex() == electron.globalIndex()) { // don't store myself. // continue; // } diff --git a/PWGEM/PhotonMeson/Tasks/pcmQC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQC.cxx index feb1a31f6cc..e764a1b3dc7 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQC.cxx @@ -277,7 +277,7 @@ struct PCMQC { if (collision.sel8()) { fRegistry.fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hCollisionCounter"), 8.0); } - if (abs(collision.posZ()) < 10.0) { + if (std::fabs(collision.posZ()) < 10.0) { fRegistry.fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hCollisionCounter"), 9.0); } fRegistry.fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hZvtx"), collision.posZ()); diff --git a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx index 73b84fbabf6..4a0ac90067a 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx @@ -335,7 +335,7 @@ struct PCMQCMC { if (collision.sel8()) { fRegistry.fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hCollisionCounter"), 8.0); } - if (std::abs(collision.posZ()) < 10.0) { + if (std::fabs(collision.posZ()) < 10.0) { fRegistry.fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hCollisionCounter"), 9.0); } @@ -534,7 +534,7 @@ struct PCMQCMC { auto mctracks_coll = mcparticles.sliceBy(perMcCollision, mccollision.globalIndex()); for (auto& mctrack : mctracks_coll) { - if (std::abs(mctrack.y()) > pcmcuts.cfg_max_eta_v0) { + if (std::fabs(mctrack.y()) > pcmcuts.cfg_max_eta_v0) { continue; } From 784dab1d0a70bf4b02248e21678c3f969916f846 Mon Sep 17 00:00:00 2001 From: alcaliva <32872606+alcaliva@users.noreply.github.com> Date: Fri, 28 Feb 2025 02:40:33 +0100 Subject: [PATCH 0457/1650] [PWGLF] relaxed ITS requirement (#10233) --- .../QC/lfITSTPCMatchingSecondaryTracksQA.cxx | 43 +++++++------------ 1 file changed, 16 insertions(+), 27 deletions(-) diff --git a/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx b/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx index c36dfcb4a8d..923f2cd8507 100644 --- a/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx +++ b/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx @@ -72,8 +72,9 @@ struct LfITSTPCMatchingSecondaryTracksQA { Configurable nsigmaTPCmax{"nsigmaTPCmax", +3.0f, "Maximum nsigma TPC"}; Configurable nsigmaTOFmin{"nsigmaTOFmin", -3.0f, "Minimum nsigma TOF"}; Configurable nsigmaTOFmax{"nsigmaTOFmax", +3.0f, "Maximum nsigma TOF"}; - Configurable dcaxyMax{"dcaxyMax", 0.1, "dcaxy max"}; - Configurable dcazMax{"dcazMax", 0.1, "dcaz max"}; + Configurable dcaxyMax{"dcaxyMax", 0.1f, "dcaxy max"}; + Configurable dcazMax{"dcazMax", 0.1f, "dcaz max"}; + Configurable dcaMin{"dcaMin", 0.1f, "dca min"}; Configurable requireTOF{"requireTOF", false, "require TOF hit"}; Configurable requireItsHits{"requireItsHits", false, "require ITS hits"}; Configurable> requiredHit{"requiredHit", {0, 0, 0, 0, 0, 0, 0}, "required ITS Hits (1=required, 0=not required)"}; @@ -127,9 +128,7 @@ struct LfITSTPCMatchingSecondaryTracksQA { return false; if (track.eta() < etaMin || track.eta() > etaMax) return false; - if (std::fabs(track.dcaXY()) > dcaxyMax) - return false; - if (std::fabs(track.dcaZ()) > dcazMax) + if (std::sqrt(track.dcaXY() * track.dcaXY() + track.dcaZ() * track.dcaZ()) < dcaMin) return false; return true; @@ -219,17 +218,11 @@ struct LfITSTPCMatchingSecondaryTracksQA { for (const auto& track : tracks) { - if (!passedTrackSelectionTpcGlobal(track)) - continue; - if (!passedPionSelection(track)) - continue; + if (passedTrackSelectionTpcGlobal(track) && passedPionSelection(track)) + registryData.fill(HIST("gloPionTPC"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); - registryData.fill(HIST("gloPionTPC"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); - - if (!passedTrackSelectionIts(track)) - continue; - - registryData.fill(HIST("gloPionTPC_ITS"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); + if (passedTrackSelectionTpcGlobal(track) && passedPionSelection(track) && track.hasITS()) + registryData.fill(HIST("gloPionTPC_ITS"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); } for (const auto& v0 : fullV0s) { @@ -245,10 +238,10 @@ struct LfITSTPCMatchingSecondaryTracksQA { if (passedTrackSelectionTpc(negTrack) && passedPionSelection(negTrack)) registryData.fill(HIST("secPionTPC"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); - if (passedTrackSelectionTpc(posTrack) && passedPionSelection(posTrack) && passedTrackSelectionIts(posTrack)) + if (passedTrackSelectionTpc(posTrack) && passedPionSelection(posTrack) && posTrack.hasITS()) registryData.fill(HIST("secPionTPC_ITS"), posTrack.pt(), posTrack.eta(), TVector2::Phi_0_2pi(posTrack.phi())); - if (passedTrackSelectionTpc(negTrack) && passedPionSelection(negTrack) && passedTrackSelectionIts(negTrack)) + if (passedTrackSelectionTpc(negTrack) && passedPionSelection(negTrack) && negTrack.hasITS()) registryData.fill(HIST("secPionTPC_ITS"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); } } @@ -270,16 +263,12 @@ struct LfITSTPCMatchingSecondaryTracksQA { auto tracksPerColl = mcTracks.sliceBy(perCollisionTrk, collision.globalIndex()); for (const auto& track : tracksPerColl) { - if (!passedTrackSelectionTpcGlobal(track)) - continue; - if (!passedPionSelection(track)) - continue; - registryMC.fill(HIST("gloPionTPC_MC"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); - if (!passedTrackSelectionIts(track)) - continue; + if (passedTrackSelectionTpcGlobal(track) && passedPionSelection(track)) + registryMC.fill(HIST("gloPionTPC_MC"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); - registryMC.fill(HIST("gloPionTPC_ITS_MC"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); + if (passedTrackSelectionTpcGlobal(track) && passedPionSelection(track) && track.hasITS()) + registryMC.fill(HIST("gloPionTPC_ITS_MC"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); } for (const auto& v0 : v0sPerColl) { @@ -295,10 +284,10 @@ struct LfITSTPCMatchingSecondaryTracksQA { if (passedTrackSelectionTpc(negTrack) && passedPionSelection(negTrack)) registryMC.fill(HIST("secPionTPC_MC"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); - if (passedTrackSelectionTpc(posTrack) && passedPionSelection(posTrack) && passedTrackSelectionIts(posTrack)) + if (passedTrackSelectionTpc(posTrack) && passedPionSelection(posTrack) && posTrack.hasITS()) registryMC.fill(HIST("secPionTPC_ITS_MC"), posTrack.pt(), posTrack.eta(), TVector2::Phi_0_2pi(posTrack.phi())); - if (passedTrackSelectionTpc(negTrack) && passedPionSelection(negTrack) && passedTrackSelectionIts(negTrack)) + if (passedTrackSelectionTpc(negTrack) && passedPionSelection(negTrack) && negTrack.hasITS()) registryMC.fill(HIST("secPionTPC_ITS_MC"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); } } From 064c7b6990ecba2e72ed1af5a05c6f2aa4939bdb Mon Sep 17 00:00:00 2001 From: lucamicheletti93 <38209984+lucamicheletti93@users.noreply.github.com> Date: Fri, 28 Feb 2025 04:06:55 +0100 Subject: [PATCH 0458/1650] [PWGDQ] Adding charge information to minitree (#10236) Co-authored-by: Lucamicheletti93 --- PWGDQ/Core/VarManager.h | 16 ++++++++++++++++ PWGDQ/Tasks/tableReader.cxx | 13 +++++++------ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 050b0a5c9bf..4f3d57282e3 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -2746,6 +2746,22 @@ void VarManager::FillPair(T1 const& t1, T2 const& t2, float* values) double Ptot2 = TMath::Sqrt(v2.Px() * v2.Px() + v2.Py() * v2.Py() + v2.Pz() * v2.Pz()); values[kDeltaPtotTracks] = Ptot1 - Ptot2; + if (t1.sign() > 0) { + values[kPt1] = t1.pt(); + values[kEta1] = t1.eta(); + values[kPhi1] = t1.phi(); + values[kPt2] = t2.pt(); + values[kEta2] = t2.eta(); + values[kPhi2] = t2.phi(); + } else { + values[kPt1] = t2.pt(); + values[kEta1] = t2.eta(); + values[kPhi1] = t2.phi(); + values[kPt2] = t1.pt(); + values[kEta2] = t1.eta(); + values[kPhi2] = t1.phi(); + } + if (fgUsedVars[kDeltaPhiPair2]) { double phipair2 = v1.Phi() - v2.Phi(); if (phipair2 > 3 * TMath::Pi() / 2) { diff --git a/PWGDQ/Tasks/tableReader.cxx b/PWGDQ/Tasks/tableReader.cxx index 3502825be02..f3fb74552be 100644 --- a/PWGDQ/Tasks/tableReader.cxx +++ b/PWGDQ/Tasks/tableReader.cxx @@ -1442,6 +1442,7 @@ struct AnalysisSameEventPairing { fHistMan->FillHistClass(Form("%s_unambiguous", histNames[iCut][0].Data()), VarManager::fgValues); } if (useMiniTree.fConfigMiniTree) { + // By default (kPt1, kEta1, kPhi1) are for the positive charge float dileptonMass = VarManager::fgValues[VarManager::kMass]; if (dileptonMass > useMiniTree.fConfigMiniTreeMinMass && dileptonMass < useMiniTree.fConfigMiniTreeMaxMass) { dileptonMiniTree(VarManager::fgValues[VarManager::kMass], @@ -1449,12 +1450,12 @@ struct AnalysisSameEventPairing { VarManager::fgValues[VarManager::kRap], VarManager::fgValues[VarManager::kCentFT0C], VarManager::fgValues[VarManager::kCos2DeltaPhi], - t1.pt(), - t1.eta(), - t1.phi(), - t2.pt(), - t2.eta(), - t2.phi()); + VarManager::fgValues[VarManager::kPt1], + VarManager::fgValues[VarManager::kEta1], + VarManager::fgValues[VarManager::kPhi1], + VarManager::fgValues[VarManager::kPt2], + VarManager::fgValues[VarManager::kEta2], + VarManager::fgValues[VarManager::kPhi2]); } } } else { From ade87aa2c1d7db99928c9e709ce544656b756831 Mon Sep 17 00:00:00 2001 From: Victor Gonzalez Date: Fri, 28 Feb 2025 04:41:59 +0100 Subject: [PATCH 0459/1650] [PWGCF] DptDpt - Tracking the ITS dead chips (#10237) Co-authored-by: Victor --- .../Tasks/perRunQc.cxx | 84 +++++++++++++++++-- 1 file changed, 76 insertions(+), 8 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/perRunQc.cxx b/PWGCF/TwoParticleCorrelations/Tasks/perRunQc.cxx index 0faa24ab951..2136eba6756 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/perRunQc.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/perRunQc.cxx @@ -8,16 +8,25 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -// -// Minimal example to run this task: -// o2-analysis-centrality-table -b --configuration json://configuration.json | o2-analysis-timestamp -b --configuration json://configuration.json | o2-analysis-event-selection -b --configuration json://configuration.json | o2-analysis-multiplicity-table -b --configuration json://configuration.json | o2-analysis-lf-zdcsp -b --configuration json://configuration.json --aod-file @input_data.txt --aod-writer-json OutputDirector.json + +/// \file perRunQc.cxx +/// \brief basic per run check of the ITS dead chips and of the hadronic interaction rate +/// \author victor.gonzalez.sebastian@gmail.com #include #include +#include +#include +#include #include "CCDB/BasicCCDBManager.h" #include "Common/CCDB/ctpRateFetcher.h" +#include "DataFormatsParameters/AggregatedRunInfo.h" +#include "DataFormatsITSMFT/NoiseMap.h" // missing include in TimeDeadMap.h +#include "DataFormatsITSMFT/TimeDeadMap.h" +#include "ITSMFTReconstruction/ChipMappingITS.h" + #include "Framework/AnalysisDataModel.h" #include "Framework/AnalysisTask.h" #include "Framework/ASoAHelpers.h" @@ -35,9 +44,15 @@ using BCsWithTimestamps = soa::Join; namespace perrunqatask { +static const int32_t nBCsPerOrbit = o2::constants::lhc::LHCMaxBunches; std::unordered_map gHadronicRate; +std::unordered_map>> gDeadChipsVsOrbitInLayer; +std::unordered_map> gCollisionOrbitBefore; +std::unordered_map> gCollisionOrbitAfter; TH2* gCurrentHadronicRate; +std::shared_ptr gCurrentCollisionOrbitBefore; +std::shared_ptr gCurrentCollisionOrbitAfter; } // namespace perrunqatask struct DptDptPerRunQa { @@ -45,7 +60,6 @@ struct DptDptPerRunQa { Service ccdb; int mRunNumber{-1}; - uint64_t mSOR{0}; double mMinSeconds{-1.}; ctpRateFetcher mRateFetcher; @@ -62,13 +76,63 @@ struct DptDptPerRunQa { mRunNumber = bc.runNumber(); if (gHadronicRate.find(mRunNumber) == gHadronicRate.end()) { auto runDuration = ccdb->getRunDuration(mRunNumber); - mSOR = runDuration.first; + uint64_t mSOR = runDuration.first; mMinSeconds = std::floor(mSOR * 1.e-3); /// round tsSOR to the highest integer lower than tsSOR double maxSec = std::ceil(runDuration.second * 1.e-3); /// round tsEOR to the lowest integer higher than tsEOR const AxisSpec axisSeconds{static_cast(maxSec - mMinSeconds), 0, maxSec - mMinSeconds, "Seconds since SOR"}; gHadronicRate[mRunNumber] = mHistos.add(Form("%i/hadronicRate", mRunNumber), ";Time since SOR (s);Hadronic rate (kHz)", kTH2D, {{static_cast((maxSec - mMinSeconds) / 20.f), 0, maxSec - mMinSeconds, "Seconds since SOR"}, {1010, 0., 1010.}}).get(); + + /* initializing the ITS chips dead map*/ + /* inspired in DPG/Tasks/AOTEvent/eventSelectionQa.cxx */ + auto runInfo = o2::parameters::AggregatedRunInfo::buildAggregatedRunInfo(o2::ccdb::BasicCCDBManager::instance(), mRunNumber); + int64_t tsSOR = runInfo.sor; + int64_t tsEOR = runInfo.eor; + o2::itsmft::TimeDeadMap* itsDeadMap = ccdb->getForTimeStamp("ITS/Calib/TimeDeadMap", (tsSOR + tsEOR) / 2); + auto itsDeadMapOrbits = itsDeadMap->getEvolvingMapKeys(); // roughly every second, ~350 TFs = 350x32 orbits + if (itsDeadMapOrbits.size() > 0) { + std::vector itsDeadMapOrbitsDouble(itsDeadMapOrbits.begin(), itsDeadMapOrbits.end()); + const AxisSpec axisItsDeadMapOrbits{itsDeadMapOrbitsDouble}; + gDeadChipsVsOrbitInLayer[mRunNumber] = std::vector>(o2::itsmft::ChipMappingITS::NLayers, nullptr); + for (int layer = 0; layer < o2::itsmft::ChipMappingITS::NLayers; ++layer) { + int nChips = o2::itsmft::ChipMappingITS::getNChipsOnLayer(layer); + double idFirstChip = o2::itsmft::ChipMappingITS::getFirstChipsOnLayer(layer); + gDeadChipsVsOrbitInLayer[mRunNumber][layer] = mHistos.add(TString::Format("%d/Before/hDeadChipsVsOrbitInLayer%d", mRunNumber, layer), + TString::Format("Dead chips in ITS layer %d, before;orbit; chip", layer), + kTH2C, {axisItsDeadMapOrbits, {nChips, idFirstChip, idFirstChip + nChips}}); + } + gCollisionOrbitBefore[mRunNumber] = mHistos.add(TString::Format("%d/Before/hCollisionOrbitB", mRunNumber), "Collision orbit before; orbit", kTH1I, {axisItsDeadMapOrbits}); + gCollisionOrbitAfter[mRunNumber] = mHistos.add(TString::Format("%d/After/hCollisionOrbitA", mRunNumber), "Collision orbit; orbit", kTH1I, {axisItsDeadMapOrbits}); + LOGF(info, "Created the histograms"); + + std::vector vClosest; + for (const auto& orbit : itsDeadMapOrbits) { + itsDeadMap->getMapAtOrbit(orbit, vClosest); + for (size_t iel = 0; iel < vClosest.size(); iel++) { + // dead chips are stored as ranges + // vClosest contains first and last chip ids in the range + // last chip id in the range is marked with 0x8000 bit set to 1 + uint16_t w1 = vClosest[iel]; + bool isLastInSequence = (w1 & 0x8000) == 0; + uint16_t w2 = isLastInSequence ? w1 + 1 : vClosest[iel + 1]; + uint16_t chipId1 = w1 & 0x7FFF; + uint16_t chipId2 = w2 & 0x7FFF; + for (int chipId = chipId1; chipId < chipId2; chipId++) { + for (int layer = 0; layer < o2::itsmft::ChipMappingITS::NLayers; ++layer) { + gDeadChipsVsOrbitInLayer[mRunNumber][layer]->Fill(orbit, chipId, 1); + } + } + } + } + LOGF(info, "Initializing the current ones"); + gCurrentCollisionOrbitBefore = gCollisionOrbitBefore[mRunNumber]; + gCurrentCollisionOrbitAfter = gCollisionOrbitAfter[mRunNumber]; + } else { + gCurrentCollisionOrbitBefore = nullptr; + gCurrentCollisionOrbitAfter = nullptr; + } } gCurrentHadronicRate = gHadronicRate[mRunNumber]; + LOGF(info, "Getting out"); } void init(o2::framework::InitContext&) @@ -78,20 +142,24 @@ struct DptDptPerRunQa { ccdb->setFatalWhenNull(false); } - void process(soa::Join::iterator const& collision, aod::BCsWithTimestamps const&) + void process(soa::Join::iterator const& collision, aod::BCsWithTimestamps const&) { using namespace perrunqatask; using namespace analysis::dptdptfilter; + auto bc = collision.bc_as(); + initCCDB(bc); + int64_t orbit = bc.globalBC() / nBCsPerOrbit; + gCurrentCollisionOrbitBefore->Fill(orbit); + if (!collision.collisionaccepted()) { return; } - auto bc = collision.bc_as(); - initCCDB(bc); double hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), mRunNumber, "T0VTX") * 1.e-3; // double seconds = bc.timestamp() * 1.e-3 - mMinSeconds; gCurrentHadronicRate->Fill(seconds, hadronicRate); + gCurrentCollisionOrbitAfter->Fill(orbit); } }; From 87a34e53629586cb9b4305212fbc7bdc8c2a8496 Mon Sep 17 00:00:00 2001 From: omvazque Date: Thu, 27 Feb 2025 23:34:23 -0600 Subject: [PATCH 0460/1650] [PWGLF] Update to MC (#10238) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 40 +++++++------------- 1 file changed, 14 insertions(+), 26 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index 352fc29103c..0518604c080 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -22,8 +22,8 @@ #include #include #include -#include #include +#include #include "Common/CCDB/EventSelectionParams.h" #include "Common/CCDB/TriggerAliases.h" @@ -146,7 +146,7 @@ struct UccZdc { }; // Filters - Filter collFilter = (nabs(aod::collision::posZ) < posZcut); + // Filter collFilter = (nabs(aod::collision::posZ) < posZcut); // Filter trackFilter = (requireGlobalTrackInFilter()); Filter trackFilter = ((aod::track::eta > minEta) && (aod::track::eta < maxEta) && @@ -159,7 +159,7 @@ struct UccZdc { using TheFilteredTracks = soa::Filtered; // using TheFilteredTrack = TheFilteredTracks::iterator; - using TheFilteredSimCollisions = soa::Filtered; + // using TheFilteredSimCollisions = soa::Filtered; using TheFilteredSimTracks = soa::Filtered; // Histograms: Data @@ -216,30 +216,17 @@ struct UccZdc { registry.add("eta", ";;Entries;", kTH1F, {axisEta}); registry.add("pt", ";;Entries;", kTH1F, {axisPt}); registry.add("sigma1Pt", ";;#sigma(p_{T})/p_{T};", kTProfile, {axisPt}); - registry.add("pP1", - ";Nch;P_{1}=#Sigma_{evs} W^{(1)}_{e} [p_{T}^{(1)}]_{e};", - kTProfile, {{nBinsNch, -0.5, maxNch}}); - registry.add("pW1", ";Nch;W_{1}=#Sigma_{evs} W^{(1)}_{e};", kTProfile, - {{nBinsNch, -0.5, maxNch}}); - registry.add("pP2", - ";Nch;P_{2}=#Sigma_{evs} W^{(2)}_{e} [p_{T}^{(2)}]_{e};", - kTProfile, {{nBinsNch, -0.5, maxNch}}); - registry.add("pW2", ";Nch;W_{2}=#Sigma_{evs} W^{(2)}_{e};", kTProfile, - {{nBinsNch, -0.5, maxNch}}); - registry.add("pP3", - ";Nch;P_{3}=#Sigma_{evs} W^{(3)}_{e} [p_{T}^{(3)}]_{e};", - kTProfile, {{nBinsNch, -0.5, maxNch}}); - registry.add("pW3", ";Nch;W_{3}=#Sigma_{evs} W^{(3)}_{e};", kTProfile, - {{nBinsNch, -0.5, maxNch}}); - registry.add("pP4", - ";Nch;P_{4}=#Sigma_{evs} W^{(4)}_{e} [p_{T}^{(4)}]_{e};", - kTProfile, {{nBinsNch, -0.5, maxNch}}); - registry.add("pW4", ";Nch;W_{4}=#Sigma_{evs} W^{(4)}_{e};", kTProfile, - {{nBinsNch, -0.5, maxNch}}); + registry.add("pP1", ";Nch;P_{1}=#Sigma_{evs} W^{(1)}_{e} [p_{T}^{(1)}]_{e};", kTProfile, {{nBinsNch, -0.5, maxNch}}); + registry.add("pW1", ";Nch;W_{1}=#Sigma_{evs} W^{(1)}_{e};", kTProfile, {{nBinsNch, -0.5, maxNch}}); + registry.add("pP2", ";Nch;P_{2}=#Sigma_{evs} W^{(2)}_{e} [p_{T}^{(2)}]_{e};", kTProfile, {{nBinsNch, -0.5, maxNch}}); + registry.add("pW2", ";Nch;W_{2}=#Sigma_{evs} W^{(2)}_{e};", kTProfile, {{nBinsNch, -0.5, maxNch}}); + registry.add("pP3", " ;Nch;P_{3}=#Sigma_{evs} W^{(3)}_{e} [p_{T}^{(3)}]_{e};", kTProfile, {{nBinsNch, -0.5, maxNch}}); + registry.add("pW3", ";Nch;W_{3}=#Sigma_{evs} W^{(3)}_{e};", kTProfile, {{nBinsNch, -0.5, maxNch}}); + registry.add("pP4", ";Nch;P_{4}=#Sigma_{evs} W^{(4)}_{e} [p_{T}^{(4)}]_{e};", kTProfile, {{nBinsNch, -0.5, maxNch}}); + registry.add("pW4", ";Nch;W_{4}=#Sigma_{evs} W^{(4)}_{e};", kTProfile, {{nBinsNch, -0.5, maxNch}}); registry.add("dcaXYvspT", "", kTH2F, {{{50, -1., 1.}, {axisPt}}}); registry.add("T0Ccent", ";T0C centrality;Entries", kTH1F, {axisCent}); - registry.add("Nch", ";Nch (|#eta|<0.8);", kTH1F, - {{nBinsNch, -0.5, maxNch}}); + registry.add("Nch", ";Nch (|#eta|<0.8);", kTH1F, {{nBinsNch, -0.5, maxNch}}); registry.add("ZN", "", kTH1F, {{nBinsZDC, -0.5, maxZN}}); registry.add("ZNA", "", kTH1F, {{nBinsZDC, -0.5, maxZN}}); registry.add("ZPA", "", kTH1F, {{nBinsZDC, -0.5, maxZP}}); @@ -630,7 +617,8 @@ struct UccZdc { PROCESS_SWITCH(UccZdc, processZdcCollAss, "Process ZDC W/Coll Ass.", true); template - void getMoments(const T& pTs, const T& wIs, U& pOne, U& wOne, U& pTwo, U& wTwo, U& pThree, U& wThree, U& pFour, U& wFour) + void getMoments(const T& pTs, const T& wIs, U& pOne, U& wOne, U& pTwo, + U& wTwo, U& pThree, U& wThree, U& pFour, U& wFour) { pOne = wOne = pTwo = wTwo = pThree = wThree = pFour = wFour = 0.; From 7006a173107f02514775652ae5bb46d37031e53b Mon Sep 17 00:00:00 2001 From: creetz16 <79141119+creetz16@users.noreply.github.com> Date: Fri, 28 Feb 2025 08:35:30 +0100 Subject: [PATCH 0461/1650] [PWGLF] Update hypertriton 3-body decay event mixing and derived data model (#10232) --- PWGLF/DataModel/Reduced3BodyTables.h | 6 + PWGLF/TableProducer/Nuspex/CMakeLists.txt | 2 +- .../Nuspex/decay3bodybuilder.cxx | 739 ++++++++++-------- .../Nuspex/reduced3bodyCreator.cxx | 100 ++- .../TableProducer/Nuspex/threebodyKFTask.cxx | 2 +- 5 files changed, 500 insertions(+), 349 deletions(-) diff --git a/PWGLF/DataModel/Reduced3BodyTables.h b/PWGLF/DataModel/Reduced3BodyTables.h index 42e87439f38..b73c6c8775d 100644 --- a/PWGLF/DataModel/Reduced3BodyTables.h +++ b/PWGLF/DataModel/Reduced3BodyTables.h @@ -256,6 +256,9 @@ DECLARE_SOA_INDEX_COLUMN_FULL(Track0, track0, int, RedIUTracks, "_0"); //! DECLARE_SOA_INDEX_COLUMN_FULL(Track1, track1, int, RedIUTracks, "_1"); //! Track 1 index DECLARE_SOA_INDEX_COLUMN_FULL(Track2, track2, int, RedIUTracks, "_2"); //! Track 2 index DECLARE_SOA_INDEX_COLUMN_FULL(Collision, collision, int, RedCollisions, ""); //! Collision index +DECLARE_SOA_COLUMN(Phi, phi, float); //! decay3body radius +DECLARE_SOA_COLUMN(Radius, radius, float); //! decay3body phi +DECLARE_SOA_COLUMN(PosZ, posz, float); //! decay3body z position } // namespace reduceddecay3body DECLARE_SOA_TABLE(RedDecay3Bodys, "AOD", "REDDECAY3BODY", //! reduced 3-body decay table @@ -264,6 +267,9 @@ DECLARE_SOA_TABLE(RedDecay3Bodys, "AOD", "REDDECAY3BODY", //! reduced 3-body dec using ReducedDecay3BodysLinked = soa::Join; using ReducedDecay3BodyLinked = ReducedDecay3BodysLinked::iterator; +DECLARE_SOA_TABLE(Red3BodyInfo, "AOD", "RED3BODYINFO", //! joinable with RedDecay3Bodys + reduceddecay3body::Radius, reduceddecay3body::Phi, reduceddecay3body::PosZ); + } // namespace o2::aod #endif // PWGLF_DATAMODEL_REDUCED3BODYTABLES_H_ diff --git a/PWGLF/TableProducer/Nuspex/CMakeLists.txt b/PWGLF/TableProducer/Nuspex/CMakeLists.txt index 076349f3af5..67738870283 100644 --- a/PWGLF/TableProducer/Nuspex/CMakeLists.txt +++ b/PWGLF/TableProducer/Nuspex/CMakeLists.txt @@ -101,5 +101,5 @@ o2physics_add_dpl_workflow(tr-he-analysis o2physics_add_dpl_workflow(reduced3body-creator SOURCES reduced3bodyCreator.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::EventFilteringUtils O2::TOFBase + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore KFParticle::KFParticle O2Physics::EventFilteringUtils O2::TOFBase COMPONENT_NAME Analysis) diff --git a/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx b/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx index 35fbdeac975..d02fecd1d63 100644 --- a/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx +++ b/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx @@ -162,14 +162,12 @@ struct decay3bodyBuilder { o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; std::vector vtxCandidates; + std::unordered_map ccdbCache; // Maps runNumber -> d_bz + Zorro zorro; OutputObj zorroSummary{"zorroSummary"}; std::vector fTrackedClSizeVector; - std::vector kfProtonDaughters; - std::vector kfPionDaughters; - std::vector kfDeuteronDaughters; - std::vector kf3bodyVtxCandidates; // Configurables Configurable d_UseAbsDCA{"d_UseAbsDCA", true, "Use Abs DCAs"}; @@ -253,11 +251,10 @@ struct decay3bodyBuilder { Configurable doDCAFitterPreMinimum{"kfparticleConfigurations.doDCAFitterPreMinimum", false, "do DCAFitter pre-optimization before KF fit to include material corrections for decay3body vertex"}; Configurable doTrackQA{"kfparticleConfigurations.doTrackQA", false, "Flag to fill QA histograms for daughter tracks."}; Configurable doVertexQA{"kfparticleConfigurations.doVertexQA", false, "Flag to fill QA histograms for KFParticle PV."}; - Configurable rotateDeuteron{"kfparticleConfigurations.rotateDeuteron", false, "Flag to rotate deuteron track before vertex fitting."}; - Configurable rotateProton{"kfparticleConfigurations.rotateProton", false, "Flag to rotate proton track before vertex fitting."}; - Configurable nRotations{"kfparticleConfigurations.nRotations", 1, "Number of times to rotate track before vertex fitting."}; Configurable useLambdaMassConstraint{"kfparticleConfigurations.useLambdaMassConstraint", false, "Apply Lambda mass constraint on proton-pion vertex"}; - Configurable maxEta{"kfparticleConfigurations.maxEta", 0.9, "Maximum eta for daughter tracks"}; + Configurable doDCAPreSel{"kfparticleConfigurations.doDCAPreSel", false, "Apply selection on DCA of daughter tracks to PV"}; + Configurable maxEta{"kfparticleConfigurations.maxEta", 1.0, "Maximum eta for proton and pion daughter tracks"}; + Configurable maxEtaDeuteron{"kfparticleConfigurations.maxEtaDeuteron", 0.9, "Maximum eta for deuteron daughter track"}; Configurable useTPCforPion{"kfparticleConfigurations.useTPCforPion", true, "Flag to ask for TPC info for pion track (PID, nClusters), false: pion track can be ITS only"}; Configurable mintpcNClsProton{"kfparticleConfigurations.mintpcNClsProton", 70, "Minimum number of TPC clusters for proton track"}; Configurable mintpcNClsPion{"kfparticleConfigurations.mintpcNClsPion", 70, "Minimum number of TPC clusters for pion track"}; @@ -291,9 +288,13 @@ struct decay3bodyBuilder { Configurable applyTopoSel{"kfparticleConfigurations.applyTopoSel", false, "Apply selection constraining the mother to the PV with KFParticle"}; Configurable maxChi2topo{"kfparticleConfigurations.maxChi2topo", 1000., "Maximum chi2 topological with KFParticle"}; Configurable nEvtMixing{"kfparticleConfigurations.nEvtMixing", 5, "Number of events to mix"}; - Configurable applySVertexerCuts{"kfparticleConfigurations.applySVertexerCuts", true, "Apply SVertexer selections in event mixing case"}; ConfigurableAxis binsVtxZ{"kfparticleConfigurations.binsVtxZ", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; ConfigurableAxis binsMultiplicity{"kfparticleConfigurations.binsMultiplicity", {VARIABLE_WIDTH, 0.0f, 1.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f, 110.0f}, "Mixing bins - multiplicity"}; + ConfigurableAxis bins3BodyRadius{"kfparticleConfigurations.bins3BodyRadius", {VARIABLE_WIDTH, 0.0f, 0.5f, 1.0f, 1.5f, 2.0f, 2.5f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 12.0f, 14.0f, 16.0f, 18.0f, 20.0f, 30.0f, 40.0f, 50.0f, 100.0f}, "Mixing bins - 3body radius"}; + ConfigurableAxis bins3BodyPhi{"kfparticleConfigurations.bins3BodyPhi", {VARIABLE_WIDTH, 0.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f, 110.0f, 120.0f, 130.0f, 140.0f, 150.0f, 160.0f, 170.0f, 180.0f, 190.0f, 200.0f, 210.0f, 220.0f, 230.0f, 240.0f, 250.0f, 260.0f, 270.0f, 280.0f, 290.0f, 300.0f, 310.0f, 320.0f, 330.0f, 340.0f, 350.0f, 360.0f}, "Mixing bins - 3body phi"}; + ConfigurableAxis bins3BodyPosZ{"kfparticleConfigurations.bins3BodyPosZ", {VARIABLE_WIDTH, -500.0f, -200.0f, -100.0f, -70.0f, -60.0f, -50.0f, -40.0f, -35.0f, -30.0f, -25.0f, -20.0f, -15.0f, -13.0f, -10.0f, -8.0f, -6.0f, -4.0f, -2.0f, 0.0f, 2.0f, 4.0f, 6.0f, 8.0f, 10.0f, 13.0f, 15.0f, 20.0f, 25.0f, 30.0f, 35.0f, 40.0f, 50.0f, 60.0f, 70.0f, 100.0f, 200.0f, 500.0f}, "Mixing bins - 3body z position"}; + Configurable selectVtxZ3bodyMixing{"kfparticleConfigurations.selectVtxZ3bodyMixing", true, "Select same VtxZ events in case of 3body mixing"}; + Configurable VtxZBin3bodyMixing{"kfparticleConfigurations.VtxZBin3bodyMixing", 1., "Bin width for event vtx z position in case of 3body mixing"}; } kfparticleConfigurations; //------------------------------------------------------------------ @@ -322,6 +323,9 @@ struct decay3bodyBuilder { // KF event mixing using BinningTypeKF = ColumnBinningPolicy; + // 3body mixing + using Binning3Body = ColumnBinningPolicy; + // Filters and slices Preslice perCollision = o2::aod::decay3body::collisionId; Preslice perReducedCollision = o2::aod::reduceddecay3body::collisionId; @@ -412,17 +416,17 @@ struct decay3bodyBuilder { registry.add("hBachelorTOFNSigmaDe", "", HistType::kTH2F, {{40, -10.0f, 10.0f, "p/z (GeV/c)"}, {40, -10.0f, 10.0f, "TOF n#sigma"}}); } - if (doprocessRun3withKFParticle == true || doprocessRun3withKFParticleStrangenessTracking == true || doprocessRun3withKFParticleTrackRotation == true || doprocessRun3withKFParticleReduced == true || doprocessRun3withKFParticleReducedEM == true) { + if (doprocessRun3withKFParticle == true || doprocessRun3withKFParticleStrangenessTracking == true || doprocessRun3withKFParticleReduced == true || doprocessRun3withKFParticleReducedEM == true || doprocessRun3withKFParticleReduced3bodyMixing == true) { auto hEventCounterZorro = registry.add("Counters/hEventCounterZorro", "hEventCounterZorro", HistType::kTH1D, {{2, -0.5, 1.5}}); hEventCounterZorro->GetXaxis()->SetBinLabel(1, "Zorro before evsel"); hEventCounterZorro->GetXaxis()->SetBinLabel(2, "Zorro after evsel"); - auto hEventCounterKFParticle = registry.add("Counters/hEventCounterKFParticle", "hEventCounterKFParticle", HistType::kTH1F, {{4, 0.0f, 4.0f}}); + auto hEventCounterKFParticle = registry.add("Counters/hEventCounterKFParticle", "hEventCounterKFParticle", HistType::kTH1D, {{4, 0.0f, 4.0f}}); hEventCounterKFParticle->GetXaxis()->SetBinLabel(1, "total"); hEventCounterKFParticle->GetXaxis()->SetBinLabel(2, "sel8"); hEventCounterKFParticle->GetXaxis()->SetBinLabel(3, "vertexZ"); hEventCounterKFParticle->GetXaxis()->SetBinLabel(4, "has candidate"); hEventCounterKFParticle->LabelsOption("v"); - auto hVtx3BodyCounterKFParticle = registry.add("Counters/hVtx3BodyCounterKFParticle", "hVtx3BodyCounterKFParticle", HistType::kTH1F, {{21, 0.0f, 21.0f}}); + auto hVtx3BodyCounterKFParticle = registry.add("Counters/hVtx3BodyCounterKFParticle", "hVtx3BodyCounterKFParticle", HistType::kTH1D, {{21, 0.0f, 21.0f}}); hVtx3BodyCounterKFParticle->GetXaxis()->SetBinLabel(1, "Total"); hVtx3BodyCounterKFParticle->GetXaxis()->SetBinLabel(2, "Charge"); hVtx3BodyCounterKFParticle->GetXaxis()->SetBinLabel(3, "Eta"); @@ -481,17 +485,17 @@ struct decay3bodyBuilder { } if (doprocessRun3withKFParticleReducedEM == true) { - auto hPairCounterMixing = registry.add("QA/EM/hPairCounterMixing", "hPairCounterMixing", HistType::kTH1F, {{3, 0.0f, 3.0f}}); - hPairCounterMixing->GetXaxis()->SetBinLabel(1, "total"); - hPairCounterMixing->GetXaxis()->SetBinLabel(2, "sel8"); - hPairCounterMixing->GetXaxis()->SetBinLabel(3, "vertexZ"); - hPairCounterMixing->LabelsOption("v"); - auto hCombinationCounterMixing = registry.add("QA/EM/hCombinationCounterMixing", "hCombinationCounterMixing", HistType::kTH1F, {{3, 0.0f, 3.0f}}); + registry.add("QA/EM/hPairCounterMixing", "hPairCounterMixing", HistType::kTH1D, {{1, 0.0f, 1.0f}}); + auto hCombinationCounterMixing = registry.add("QA/EM/hCombinationCounterMixing", "hCombinationCounterMixing", HistType::kTH1D, {{3, 0.0f, 3.0f}}); hCombinationCounterMixing->GetXaxis()->SetBinLabel(1, "total"); hCombinationCounterMixing->GetXaxis()->SetBinLabel(2, "bach sign/ID"); - hCombinationCounterMixing->GetXaxis()->SetBinLabel(3, "bach pT or radius, phi"); + hCombinationCounterMixing->GetXaxis()->SetBinLabel(3, "radius, phi"); hCombinationCounterMixing->LabelsOption("v"); + registry.add("QA/EM/hEventBinCounts", "hEventBinCounts", HistType::kTH2D, {{10, 0, 10, "bins VtxZ"}, {13, 0, 13, "bins mult"}}); + registry.add("QA/EM/h3bodyBinCounts", "h3bodyBinCounts", HistType::kTH2D, {{10, 0, 10, "bins VtxZ"}, {13, 0, 13, "bins mult"}}); + registry.add("QA/EM/hPairBinCounts", "hPairBinCounts", HistType::kTH2D, {{10, 0, 10, "bins VtxZ"}, {13, 0, 13, "bins mult"}}); + registry.add("QA/EM/hRadius1", "hRadius1", HistType::kTH1F, {{200, 0.0f, 20.0f, "Radius (cm)"}}); registry.add("QA/EM/hRadius2", "hRadius2", HistType::kTH1F, {{200, 0.0f, 20.0f, "Radius (cm)"}}); registry.add("QA/EM/hPhi1", "hPhi1", HistType::kTH1F, {{360, 0.0f, 360.0f, "#phi (degree)"}}); @@ -499,6 +503,15 @@ struct decay3bodyBuilder { registry.add("QA/EM/hDeltaRadius", "hDeltaRadius", HistType::kTH1F, {{200, 0.0f, 10.0f, "#Delta Radius (cm)"}}); registry.add("QA/EM/hDeltaPhi", "hDeltaPhi", HistType::kTH1F, {{360, 0.0f, 360.0f, "#Delta #phi (degree)"}}); } + + if (doprocessRun3withKFParticleReduced3bodyMixing == true) { + auto h3bodyCombinationCounter = registry.add("QA/EM/h3bodyCombinationCounter", "h3bodyCombinationCounter", HistType::kTH1D, {{4, 0.0f, 4.0f}}); + h3bodyCombinationCounter->GetXaxis()->SetBinLabel(1, "total"); + h3bodyCombinationCounter->GetXaxis()->SetBinLabel(2, "bach sign/ID"); + h3bodyCombinationCounter->GetXaxis()->SetBinLabel(3, "not same collision"); + h3bodyCombinationCounter->GetXaxis()->SetBinLabel(3, "collision VtxZ"); + h3bodyCombinationCounter->LabelsOption("v"); + } } void initCCDB(aod::BCsWithTimestamps::iterator const& bc) @@ -621,27 +634,50 @@ struct decay3bodyBuilder { bachelorTOFPID.SetParams(mRespParamsV2); } - void initCCDBReduced(const int& runNumber) + void initCCDBfromRunNumber(int runNumber) { - o2::parameters::GRPMagField* grpmag = ccdb->getForRun(grpmagPath, runNumber); - if (!grpmag) { - LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for run number " << runNumber; - } - o2::base::Propagator::initFieldFromGRP(grpmag); - // Fetch magnetic field from ccdb for current collision - d_bz = o2::base::Propagator::Instance()->getNominalBz(); - LOG(info) << "Retrieved GRP for run number " << runNumber << " with magnetic field of " << d_bz << " kZG"; + // Check if the CCDB data for this run is already cached + if (ccdbCache.find(runNumber) != ccdbCache.end()) { + LOG(debug) << "CCDB data already cached for run " << runNumber; - // Set magnetic field for KF vertexing + // get magnetic field info from cache + float d_bz = ccdbCache[runNumber]; + + // Set magnetic field for KF vertexing #ifdef HomogeneousField - KFParticle::SetField(d_bz); + KFParticle::SetField(d_bz); #endif - // Set field for DCAfitter - fitter3body.setBz(d_bz); + // Set field for DCAfitter + fitter3body.setBz(d_bz); - if (useMatCorrType == 2) { - // setMatLUT only after magfield has been initalized - o2::base::Propagator::Instance()->setMatLUT(lut); + if (useMatCorrType == 2) { + // setMatLUT only after magfield has been initalized + o2::base::Propagator::Instance()->setMatLUT(lut); + } + } else { // fetch data from CCDB and cache it + o2::parameters::GRPMagField* grpmag = ccdb->getForRun(grpmagPath, runNumber); + if (!grpmag) { + LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for run number " << runNumber; + } + o2::base::Propagator::initFieldFromGRP(grpmag); + // Fetch magnetic field from ccdb for current collision + d_bz = o2::base::Propagator::Instance()->getNominalBz(); + LOG(info) << "Retrieved GRP for run number " << runNumber << " with magnetic field of " << d_bz << " kZG"; + + // Set magnetic field for KF vertexing +#ifdef HomogeneousField + KFParticle::SetField(d_bz); +#endif + // Set field for DCAfitter + fitter3body.setBz(d_bz); + + if (useMatCorrType == 2) { + // setMatLUT only after magfield has been initalized + o2::base::Propagator::Instance()->setMatLUT(lut); + } + + // cache magnetic field info + ccdbCache[runNumber] = d_bz; } } @@ -956,24 +992,12 @@ struct decay3bodyBuilder { //------------------------------------------------------------------ // 3body candidate builder with KFParticle - template - void buildVtx3BodyDataTableKFParticle(TCollision const& collision, TTrack const& trackPos, TTrack const& trackNeg, TTrack const& trackBach, int64_t decay3bodyID, int bachelorcharge, int nRotations, double tofNSigmaDeuteron) + template + void buildVtx3BodyDataTableKFParticle(TCollision const& collision, TTrack const& trackPos, TTrack const& trackNeg, TTrack const& trackBach, int64_t decay3bodyID, int bachelorcharge, double tofNSigmaDeuteron) { gROOT->SetBatch(true); gRandom->SetSeed(42); - kf3bodyVtxCandidates.clear(); - kfProtonDaughters.clear(); - kfPionDaughters.clear(); - kfDeuteronDaughters.clear(); - - LOG(debug) << "buildVtx3BodyDataTableKFParticle called."; - - bool isEventMixing = false; - if (decay3bodyID == -1) { - isEventMixing = true; - } - // initialise KF primary vertex KFPVertex kfpVertex = createKFPVertexFromCollision(collision); KFParticle kfpv(kfpVertex); @@ -1048,7 +1072,7 @@ struct decay3bodyBuilder { registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxCharge); // track eta - if (abs(trackPos.eta()) > kfparticleConfigurations.maxEta || abs(trackNeg.eta()) > kfparticleConfigurations.maxEta || abs(trackBach.eta()) > kfparticleConfigurations.maxEta) { + if (std::abs(trackPos.eta()) > kfparticleConfigurations.maxEta || std::abs(trackNeg.eta()) > kfparticleConfigurations.maxEta || std::abs(trackBach.eta()) > kfparticleConfigurations.maxEtaDeuteron) { return; } registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxEta); @@ -1138,22 +1162,18 @@ struct decay3bodyBuilder { auto TrackNegDca = std::sqrt(TrackNegDcaXY * TrackNegDcaXY + TrackNegDcaZ * TrackNegDcaZ); auto TrackBachDca = std::sqrt(TrackBachDcaXY * TrackBachDcaXY + TrackBachDcaZ * TrackBachDcaZ); // selection - if (isMatter && (fabs(TrackNegDcaXY) <= kfparticleConfigurations.mindcaXYPionPV || fabs(TrackPosDcaXY) <= kfparticleConfigurations.mindcaXYProtonPV)) { + if (kfparticleConfigurations.doDCAPreSel && isMatter && (std::fabs(TrackNegDcaXY) <= kfparticleConfigurations.mindcaXYPionPV || std::fabs(TrackPosDcaXY) <= kfparticleConfigurations.mindcaXYProtonPV)) { return; - } else if (!isMatter && (fabs(TrackPosDcaXY) <= kfparticleConfigurations.mindcaXYPionPV || fabs(TrackNegDcaXY) <= kfparticleConfigurations.mindcaXYProtonPV)) { + } else if (kfparticleConfigurations.doDCAPreSel && !isMatter && (std::fabs(TrackPosDcaXY) <= kfparticleConfigurations.mindcaXYPionPV || std::fabs(TrackNegDcaXY) <= kfparticleConfigurations.mindcaXYProtonPV)) { return; } registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxDCAxyPV); - if (isMatter && (fabs(TrackNegDcaZ) <= kfparticleConfigurations.mindcaZPionPV || fabs(TrackPosDcaZ) <= kfparticleConfigurations.mindcaZProtonPV)) { + if (kfparticleConfigurations.doDCAPreSel && isMatter && (std::fabs(TrackNegDcaZ) <= kfparticleConfigurations.mindcaZPionPV || std::fabs(TrackPosDcaZ) <= kfparticleConfigurations.mindcaZProtonPV)) { return; - } else if (!isMatter && (fabs(TrackPosDcaZ) <= kfparticleConfigurations.mindcaZPionPV || fabs(TrackNegDcaZ) <= kfparticleConfigurations.mindcaZProtonPV)) { + } else if (kfparticleConfigurations.doDCAPreSel && !isMatter && (std::fabs(TrackPosDcaZ) <= kfparticleConfigurations.mindcaZPionPV || std::fabs(TrackNegDcaZ) <= kfparticleConfigurations.mindcaZProtonPV)) { return; } registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxDCAzPV); - // SVertexer selection bachelor track for event mixing - if (isEventMixing && kfparticleConfigurations.applySVertexerCuts && TrackBachDca < 0.05) { - return; - } // daughter track momentum at inner wall of TPC float tpcInnerParamProton; @@ -1226,251 +1246,205 @@ struct decay3bodyBuilder { KFParticle kfpDeuteron; kfpDeuteron = createKFParticleFromTrackParCov(trackParCovBach, trackBach.sign() * bachelorcharge, constants::physics::MassDeuteron); LOG(debug) << "KFParticle created from deuteron track."; - float kfpvPos[3] = {kfpv.GetX(), kfpv.GetY(), kfpv.GetZ()}; // Construct vertex - /// BRIEF: Case 1: fully uncorrelated bkg via rotation of proton track - /// BRIEF: Case 2: uncorrelated Lambda-deuteron bkg via rotation of deuteron track - /// BRIEF: Case 3: Single event (signal + bkg) and mixed event (bkg) cases - if (kfparticleConfigurations.rotateProton) { // Case 1 - for (int i = 0; i < nRotations; i++) { - KFParticle KFHt; - auto rotationAngle = gRandom->Rndm() * o2::constants::math::TwoPI; - kfpProton.RotateXY(rotationAngle, kfpvPos); - fit3bodyVertex(kfpProton, kfpPion, kfpDeuteron, KFHt); - kfProtonDaughters.push_back(kfpProton); // rotated and transported to HtVtx - kfPionDaughters.push_back(kfpPion); // transported to HtVtx - kfDeuteronDaughters.push_back(kfpDeuteron); // transported to HtVtx - kf3bodyVtxCandidates.push_back(KFHt); - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxhasSV); - } - } else if (kfparticleConfigurations.rotateDeuteron) { // Case 2 - for (int i = 0; i < nRotations; i++) { - KFParticle KFHt; - auto rotationAngle = gRandom->Rndm() * o2::constants::math::TwoPI; - kfpDeuteron.RotateXY(rotationAngle, kfpvPos); - fit3bodyVertex(kfpProton, kfpPion, kfpDeuteron, KFHt); - kfProtonDaughters.push_back(kfpProton); // transported to HtVtx - kfPionDaughters.push_back(kfpPion); // transported to HtVtx - kfDeuteronDaughters.push_back(kfpDeuteron); // rotated and transported to HtVtx - kf3bodyVtxCandidates.push_back(KFHt); - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxhasSV); - } - } else { // Case 3 - KFParticle KFHt; - fit3bodyVertex(kfpProton, kfpPion, kfpDeuteron, KFHt); - kfProtonDaughters.push_back(kfpProton); // transported to HtVtx - kfPionDaughters.push_back(kfpPion); // transported to HtVtx - kfDeuteronDaughters.push_back(kfpDeuteron); // transported to HtVtx - kf3bodyVtxCandidates.push_back(KFHt); - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxhasSV); - } - - for (int i = 0; i < nRotations; i++) { - - // -------- STEP 4: daughter selections after geometrical vertex fit -------- - // daughter DCAs with KF - if ((kfProtonDaughters[i].GetDistanceFromParticle(kfPionDaughters[i]) >= kfparticleConfigurations.maxDcaProPi) || (kfProtonDaughters[i].GetDistanceFromParticle(kfDeuteronDaughters[i]) >= kfparticleConfigurations.maxDcaProDeu) || (kfPionDaughters[i].GetDistanceFromParticle(kfDeuteronDaughters[i]) >= kfparticleConfigurations.maxDcaPiDe)) { - continue; - } - float DCAvtxDaughters3D = kfProtonDaughters[i].GetDistanceFromParticle(kfPionDaughters[i]) + kfProtonDaughters[i].GetDistanceFromParticle(kfDeuteronDaughters[i]) + kfPionDaughters[i].GetDistanceFromParticle(kfDeuteronDaughters[i]); - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxDcaDau); - LOG(debug) << "DCA selection after vertex fit applied."; + KFParticle KFHt; + fit3bodyVertex(kfpProton, kfpPion, kfpDeuteron, KFHt); + registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxhasSV); - // daughter DCAs to vertex - if (kfProtonDaughters[i].GetDistanceFromVertexXY(kf3bodyVtxCandidates[i]) >= kfparticleConfigurations.maxDcaXYSVDau || kfPionDaughters[i].GetDistanceFromVertexXY(kf3bodyVtxCandidates[i]) >= kfparticleConfigurations.maxDcaXYSVDau || kfDeuteronDaughters[i].GetDistanceFromVertexXY(kf3bodyVtxCandidates[i]) >= kfparticleConfigurations.maxDcaXYSVDau) { - continue; - } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxDcaDauVtx); - LOG(debug) << "DCA to vertex selection after vertex fit applied."; + // -------- STEP 4: daughter selections after geometrical vertex fit -------- + // daughter DCAs with KF + if ((kfpProton.GetDistanceFromParticle(kfpPion) >= kfparticleConfigurations.maxDcaProPi) || (kfpProton.GetDistanceFromParticle(kfpDeuteron) >= kfparticleConfigurations.maxDcaProDeu) || (kfpPion.GetDistanceFromParticle(kfpDeuteron) >= kfparticleConfigurations.maxDcaPiDe)) { + return; + } + float DCAvtxDaughters3D = kfpProton.GetDistanceFromParticle(kfpPion) + kfpProton.GetDistanceFromParticle(kfpDeuteron) + kfpPion.GetDistanceFromParticle(kfpDeuteron); + registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxDcaDau); + LOG(debug) << "DCA selection after vertex fit applied."; - // daughter pT - if (kfProtonDaughters[i].GetPt() < kfparticleConfigurations.minPtProton || kfProtonDaughters[i].GetPt() > kfparticleConfigurations.maxPtProton || kfPionDaughters[i].GetPt() < kfparticleConfigurations.minPtPion || kfPionDaughters[i].GetPt() > kfparticleConfigurations.maxPtPion || kfDeuteronDaughters[i].GetPt() < kfparticleConfigurations.minPtDeuteron || kfDeuteronDaughters[i].GetPt() > kfparticleConfigurations.maxPtDeuteron) { - continue; - } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxDauPt); - LOG(debug) << "Daughter pT selection applied."; + // daughter DCAs to vertex + if (kfpProton.GetDistanceFromVertexXY(KFHt) >= kfparticleConfigurations.maxDcaXYSVDau || kfpPion.GetDistanceFromVertexXY(KFHt) >= kfparticleConfigurations.maxDcaXYSVDau || kfpDeuteron.GetDistanceFromVertexXY(KFHt) >= kfparticleConfigurations.maxDcaXYSVDau) { + return; + } + registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxDcaDauVtx); + LOG(debug) << "DCA to vertex selection after vertex fit applied."; - // -------- STEP 5: candidate selection and constraint after geometrical vertex fit -------- - // Rapidity - float rapHt = RecoDecay::y(std::array{kf3bodyVtxCandidates[i].GetPx(), kf3bodyVtxCandidates[i].GetPy(), kf3bodyVtxCandidates[i].GetPz()}, o2::constants::physics::MassHyperTriton); - if (std::abs(rapHt) > kfparticleConfigurations.maxRapidityHt) { - continue; - } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxRap); + // daughter pT + if (kfpProton.GetPt() < kfparticleConfigurations.minPtProton || kfpProton.GetPt() > kfparticleConfigurations.maxPtProton || kfpPion.GetPt() < kfparticleConfigurations.minPtPion || kfpPion.GetPt() > kfparticleConfigurations.maxPtPion || kfpDeuteron.GetPt() < kfparticleConfigurations.minPtDeuteron || kfpDeuteron.GetPt() > kfparticleConfigurations.maxPtDeuteron) { + return; + } + registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxDauPt); + LOG(debug) << "Daughter pT selection applied."; - // Pt selection - if (kf3bodyVtxCandidates[i].GetPt() <= kfparticleConfigurations.minPtHt || kf3bodyVtxCandidates[i].GetPt() >= kfparticleConfigurations.maxPtHt) { - continue; - } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxPt); + // -------- STEP 5: candidate selection and constraint after geometrical vertex fit -------- + // Rapidity + float rapHt = RecoDecay::y(std::array{KFHt.GetPx(), KFHt.GetPy(), KFHt.GetPz()}, o2::constants::physics::MassHyperTriton); + if (std::abs(rapHt) > kfparticleConfigurations.maxRapidityHt) { + return; + } + registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxRap); - // Mass window - float massHt, sigmaMassHt; - kf3bodyVtxCandidates[i].GetMass(massHt, sigmaMassHt); - if (massHt <= kfparticleConfigurations.minMassHt || massHt >= kfparticleConfigurations.maxMassHt) { - continue; - } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxMass); + // Pt selection + if (KFHt.GetPt() <= kfparticleConfigurations.minPtHt || KFHt.GetPt() >= kfparticleConfigurations.maxPtHt) { + return; + } + registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxPt); - // cos(PA) to PV - if (std::abs(cpaFromKF(kf3bodyVtxCandidates[i], kfpv)) <= kfparticleConfigurations.minCosPA) { - continue; - } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxCosPA); + // Mass window + float massHt, sigmaMassHt; + KFHt.GetMass(massHt, sigmaMassHt); + if (massHt <= kfparticleConfigurations.minMassHt || massHt >= kfparticleConfigurations.maxMassHt) { + return; + } + registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxMass); - // cos(PA) xy to PV - if (std::abs(cpaXYFromKF(kf3bodyVtxCandidates[i], kfpv)) <= kfparticleConfigurations.minCosPAxy) { - continue; - } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxCosPAXY); + // cos(PA) to PV + if (std::abs(cpaFromKF(KFHt, kfpv)) <= kfparticleConfigurations.minCosPA) { + return; + } + registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxCosPA); - // chi2 geometrical - float chi2geoNDF = kf3bodyVtxCandidates[i].GetChi2() / kf3bodyVtxCandidates[i].GetNDF(); - if (chi2geoNDF >= kfparticleConfigurations.maxChi2geo) { - continue; - } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxChi2geo); - LOG(debug) << "Basic selections after vertex fit done."; + // cos(PA) xy to PV + if (std::abs(cpaXYFromKF(KFHt, kfpv)) <= kfparticleConfigurations.minCosPAxy) { + return; + } + registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxCosPAXY); - // ctau before topo constraint - if (kf3bodyVtxCandidates[i].GetLifeTime() > kfparticleConfigurations.maxctauHt) { - continue; - } + // chi2 geometrical + float chi2geoNDF = KFHt.GetChi2() / KFHt.GetNDF(); + if (kfparticleConfigurations.applyTopoSel && chi2geoNDF >= kfparticleConfigurations.maxChi2geo) { + return; + } + registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxChi2geo); + LOG(debug) << "Basic selections after vertex fit done."; - // Set vertex constraint and topological selection - KFParticle KFHtPV = kf3bodyVtxCandidates[i]; - try { - KFHtPV.SetProductionVertex(kfpv); - } catch (std::runtime_error& e) { - LOG(error) << "Exception caught KFParticle process call: Topological constraint failed"; - continue; - } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxTopoConstr); // to check if topo constraint fails - // get topological chi2 - float chi2topoNDF = KFHtPV.GetChi2() / KFHtPV.GetNDF(); - KFHtPV.TransportToDecayVertex(); - if (kfparticleConfigurations.applyTopoSel && chi2topoNDF >= kfparticleConfigurations.maxChi2topo) { - continue; - } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxChi2topo); + // ctau before topo constraint + if (KFHt.GetLifeTime() > kfparticleConfigurations.maxctauHt) { + return; + } - // additional selections from SVertexer for event mixing - float radius3body = sqrt(kf3bodyVtxCandidates[i].GetX() * kf3bodyVtxCandidates[i].GetX() + kf3bodyVtxCandidates[i].GetY() * kf3bodyVtxCandidates[i].GetY()); - float radiusV0 = sqrt(KFV0.GetX() * KFV0.GetX() + KFV0.GetY() * KFV0.GetY()); - float radiusTrackBachIU = sqrt(trackBach.x() * trackBach.x() + trackBach.y() * trackBach.y()); - if (isEventMixing && kfparticleConfigurations.applySVertexerCuts && (abs(radiusV0 - radius3body) > 3 || (radiusTrackBachIU - radius3body) > 50 || (radius3body - radiusTrackBachIU) > 1)) { - continue; - } + // Set vertex constraint and topological selection + KFParticle KFHtPV = KFHt; + try { + KFHtPV.SetProductionVertex(kfpv); + } catch (std::runtime_error& e) { + LOG(error) << "Exception caught KFParticle process call: Topological constraint failed"; + return; + } + registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxTopoConstr); // to check if topo constraint fails + // get topological chi2 + float chi2topoNDF = KFHtPV.GetChi2() / KFHtPV.GetNDF(); + KFHtPV.TransportToDecayVertex(); + if (kfparticleConfigurations.applyTopoSel && chi2topoNDF >= kfparticleConfigurations.maxChi2topo) { + return; + } + registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxChi2topo); - // -------- STEP 6: collect and fill candidate info -------- - // get cluster size of strangeness tracked 3bodies - float trackedClSize; - if (decay3bodyID == -1) { - trackedClSize = 0; - } else { - trackedClSize = !fTrackedClSizeVector.empty() ? fTrackedClSizeVector[decay3bodyID] : 0; - } + // -------- STEP 6: collect and fill candidate info -------- + // get cluster size of strangeness tracked 3bodies + float trackedClSize; + if (decay3bodyID == -1) { + trackedClSize = 0; + } else { + trackedClSize = !fTrackedClSizeVector.empty() ? fTrackedClSizeVector[decay3bodyID] : 0; + } + + // candidate filling + kfCandidate candidate; + candidate.collisionID = collision.globalIndex(); + candidate.trackPosID = trackPos.globalIndex(); + candidate.trackNegID = trackNeg.globalIndex(); + candidate.trackBachID = trackBach.globalIndex(); + candidate.decay3bodyID = decay3bodyID; + // hypertriton + candidate.mass = massHt; + candidate.pos[0] = KFHt.GetX(); + candidate.pos[1] = KFHt.GetY(); + candidate.pos[2] = KFHt.GetZ(); + candidate.posErr[0] = KFHt.GetErrX(); + candidate.posErr[1] = KFHt.GetErrY(); + candidate.posErr[2] = KFHt.GetErrZ(); + candidate.mom[0] = KFHt.GetPx(); + candidate.mom[1] = KFHt.GetPy(); + candidate.mom[2] = KFHt.GetPz(); + candidate.mom[3] = KFHt.GetPt(); + candidate.momErr[0] = KFHt.GetErrPx(); + candidate.momErr[1] = KFHt.GetErrPy(); + candidate.momErr[2] = KFHt.GetErrPz(); + candidate.momErr[3] = KFHt.GetErrPt(); + candidate.charge = KFHt.GetQ(); + candidate.dcaToPV[0] = KFHt.GetDistanceFromVertex(kfpv); + candidate.dcaToPV[1] = KFHt.GetDistanceFromVertexXY(kfpv); + candidate.cpaToPV[0] = cpaFromKF(KFHt, kfpv); + candidate.cpaToPV[1] = cpaXYFromKF(KFHt, kfpv); + candidate.cpaToPVtopo[0] = cpaFromKF(KFHtPV, kfpv); + candidate.cpaToPVtopo[1] = cpaXYFromKF(KFHtPV, kfpv); + candidate.decLen[0] = KFHtPV.GetDecayLength(); + candidate.decLen[1] = KFHtPV.GetDecayLengthXY(); + candidate.ldl = KFHtPV.GetDecayLength() / KFHtPV.GetErrDecayLength(); + candidate.chi2geoNDF = chi2geoNDF; + candidate.chi2topoNDF = chi2topoNDF; + candidate.ctau = KFHtPV.GetLifeTime(); + candidate.trackedClSize = trackedClSize; + // V0 + candidate.massV0 = massV0; + candidate.chi2massV0 = chi2massV0; + candidate.cpaV0ToPV = cpaFromKF(KFV0, kfpv); + // daughter momenta + candidate.protonMom[0] = kfpProton.GetPx(); + candidate.protonMom[1] = kfpProton.GetPy(); + candidate.protonMom[2] = kfpProton.GetPz(); + candidate.pionMom[0] = kfpPion.GetPx(); + candidate.pionMom[1] = kfpPion.GetPy(); + candidate.pionMom[2] = kfpPion.GetPz(); + candidate.deuteronMom[0] = kfpDeuteron.GetPx(); + candidate.deuteronMom[1] = kfpDeuteron.GetPy(); + candidate.deuteronMom[2] = kfpDeuteron.GetPz(); + candidate.tpcInnerParam[0] = tpcInnerParamProton; + candidate.tpcInnerParam[1] = tpcInnerParamPion; + candidate.tpcInnerParam[2] = tpcInnerParamDeuteron; + // daughter DCAs with KF + candidate.DCAdaughterToPV[0] = kfpProton.GetDistanceFromVertex(kfpv); + candidate.DCAdaughterToPV[1] = kfpPion.GetDistanceFromVertex(kfpv); + candidate.DCAdaughterToPV[2] = kfpDeuteron.GetDistanceFromVertex(kfpv); + candidate.DCAdaughterToPVxy[0] = kfpProton.GetDistanceFromVertexXY(kfpv); + candidate.DCAdaughterToPVxy[1] = kfpPion.GetDistanceFromVertexXY(kfpv); + candidate.DCAdaughterToPVxy[2] = kfpDeuteron.GetDistanceFromVertexXY(kfpv); + candidate.DCAdaughterToSVxy[0] = kfpProton.GetDistanceFromVertexXY(KFHt); + candidate.DCAdaughterToSVxy[1] = kfpPion.GetDistanceFromVertexXY(KFHt); + candidate.DCAdaughterToSVxy[2] = kfpDeuteron.GetDistanceFromVertexXY(KFHt); + candidate.DCAprotonToPion = kfpProton.GetDistanceFromParticle(kfpPion); + candidate.DCAprotonToDeuteron = kfpProton.GetDistanceFromParticle(kfpDeuteron); + candidate.DCApionToDeuteron = kfpPion.GetDistanceFromParticle(kfpDeuteron); + candidate.DCAvtxDaughters3D = DCAvtxDaughters3D; + // daughter DCAs with material corrections + candidate.trackDCAxy[0] = TrackPosDcaXY; + candidate.trackDCAxy[1] = TrackNegDcaXY; + candidate.trackDCAxy[2] = TrackBachDcaXY; + candidate.trackDCA[0] = TrackPosDca; + candidate.trackDCA[1] = TrackNegDca; + candidate.trackDCA[2] = TrackBachDca; + // daughter signs + candidate.daughterCharge[0] = kfpProton.GetQ(); + candidate.daughterCharge[1] = kfpPion.GetQ(); + candidate.daughterCharge[2] = trackBach.sign(); + // daughter PID + candidate.tpcNsigma[0] = tpcNsigmaProton; + candidate.tpcNsigma[1] = tpcNsigmaPion; + candidate.tpcNsigma[2] = tpcNsigmaDeuteron; + candidate.tpcNsigma[3] = tpcNsigmaPionBach; + candidate.tpcdEdx[0] = dEdxProton; + candidate.tpcdEdx[1] = dEdxPion; + candidate.tpcdEdx[2] = dEdxDeuteron; + candidate.tofNsigmaDeuteron = tofNSigmaDeuteron; + candidate.averageClusterSizeDeuteron = averageClusterSizeDeuteron; + candidate.pidForTrackingDeuteron = trackBach.pidForTracking(); + + //------------------------------------------------------------------ + // table filling + fillCandidateTable(candidate); + LOG(debug) << "Table filled."; - // candidate filling - kfCandidate candidate; - candidate.collisionID = collision.globalIndex(); - candidate.trackPosID = trackPos.globalIndex(); - candidate.trackNegID = trackNeg.globalIndex(); - candidate.trackBachID = trackBach.globalIndex(); - candidate.decay3bodyID = decay3bodyID; - // hypertriton - candidate.mass = massHt; - candidate.pos[0] = kf3bodyVtxCandidates[i].GetX(); - candidate.pos[1] = kf3bodyVtxCandidates[i].GetY(); - candidate.pos[2] = kf3bodyVtxCandidates[i].GetZ(); - candidate.posErr[0] = kf3bodyVtxCandidates[i].GetErrX(); - candidate.posErr[1] = kf3bodyVtxCandidates[i].GetErrY(); - candidate.posErr[2] = kf3bodyVtxCandidates[i].GetErrZ(); - candidate.mom[0] = kf3bodyVtxCandidates[i].GetPx(); - candidate.mom[1] = kf3bodyVtxCandidates[i].GetPy(); - candidate.mom[2] = kf3bodyVtxCandidates[i].GetPz(); - candidate.mom[3] = kf3bodyVtxCandidates[i].GetPt(); - candidate.momErr[0] = kf3bodyVtxCandidates[i].GetErrPx(); - candidate.momErr[1] = kf3bodyVtxCandidates[i].GetErrPy(); - candidate.momErr[2] = kf3bodyVtxCandidates[i].GetErrPz(); - candidate.momErr[3] = kf3bodyVtxCandidates[i].GetErrPt(); - candidate.charge = kf3bodyVtxCandidates[i].GetQ(); - candidate.dcaToPV[0] = kf3bodyVtxCandidates[i].GetDistanceFromVertex(kfpv); - candidate.dcaToPV[1] = kf3bodyVtxCandidates[i].GetDistanceFromVertexXY(kfpv); - candidate.cpaToPV[0] = cpaFromKF(kf3bodyVtxCandidates[i], kfpv); - candidate.cpaToPV[1] = cpaXYFromKF(kf3bodyVtxCandidates[i], kfpv); - candidate.cpaToPVtopo[0] = cpaFromKF(KFHtPV, kfpv); - candidate.cpaToPVtopo[1] = cpaXYFromKF(KFHtPV, kfpv); - candidate.decLen[0] = KFHtPV.GetDecayLength(); - candidate.decLen[1] = KFHtPV.GetDecayLengthXY(); - candidate.ldl = KFHtPV.GetDecayLength() / KFHtPV.GetErrDecayLength(); - candidate.chi2geoNDF = chi2geoNDF; - candidate.chi2topoNDF = chi2topoNDF; - candidate.ctau = KFHtPV.GetLifeTime(); - candidate.trackedClSize = trackedClSize; - // V0 - candidate.massV0 = massV0; - candidate.chi2massV0 = chi2massV0; - candidate.cpaV0ToPV = cpaFromKF(KFV0, kfpv); // NOTE: in proton track rotation case this is the un-rotated V0 - // daughter momenta - candidate.protonMom[0] = kfProtonDaughters[i].GetPx(); - candidate.protonMom[1] = kfProtonDaughters[i].GetPy(); - candidate.protonMom[2] = kfProtonDaughters[i].GetPz(); - candidate.pionMom[0] = kfPionDaughters[i].GetPx(); - candidate.pionMom[1] = kfPionDaughters[i].GetPy(); - candidate.pionMom[2] = kfPionDaughters[i].GetPz(); - candidate.deuteronMom[0] = kfDeuteronDaughters[i].GetPx(); - candidate.deuteronMom[1] = kfDeuteronDaughters[i].GetPy(); - candidate.deuteronMom[2] = kfDeuteronDaughters[i].GetPz(); - candidate.tpcInnerParam[0] = tpcInnerParamProton; - candidate.tpcInnerParam[1] = tpcInnerParamPion; - candidate.tpcInnerParam[2] = tpcInnerParamDeuteron; - // daughter DCAs with KF - candidate.DCAdaughterToPV[0] = kfProtonDaughters[i].GetDistanceFromVertex(kfpv); - candidate.DCAdaughterToPV[1] = kfPionDaughters[i].GetDistanceFromVertex(kfpv); - candidate.DCAdaughterToPV[2] = kfDeuteronDaughters[i].GetDistanceFromVertex(kfpv); - candidate.DCAdaughterToPVxy[0] = kfProtonDaughters[i].GetDistanceFromVertexXY(kfpv); - candidate.DCAdaughterToPVxy[1] = kfPionDaughters[i].GetDistanceFromVertexXY(kfpv); - candidate.DCAdaughterToPVxy[2] = kfDeuteronDaughters[i].GetDistanceFromVertexXY(kfpv); - candidate.DCAdaughterToSVxy[0] = kfProtonDaughters[i].GetDistanceFromVertexXY(kf3bodyVtxCandidates[i]); - candidate.DCAdaughterToSVxy[1] = kfPionDaughters[i].GetDistanceFromVertexXY(kf3bodyVtxCandidates[i]); - candidate.DCAdaughterToSVxy[2] = kfDeuteronDaughters[i].GetDistanceFromVertexXY(kf3bodyVtxCandidates[i]); - candidate.DCAprotonToPion = kfProtonDaughters[i].GetDistanceFromParticle(kfPionDaughters[i]); - candidate.DCAprotonToDeuteron = kfProtonDaughters[i].GetDistanceFromParticle(kfDeuteronDaughters[i]); - candidate.DCApionToDeuteron = kfPionDaughters[i].GetDistanceFromParticle(kfDeuteronDaughters[i]); - candidate.DCAvtxDaughters3D = DCAvtxDaughters3D; - // daughter DCAs with material corrections - candidate.trackDCAxy[0] = TrackPosDcaXY; - candidate.trackDCAxy[1] = TrackNegDcaXY; - candidate.trackDCAxy[2] = TrackBachDcaXY; - candidate.trackDCA[0] = TrackPosDca; - candidate.trackDCA[1] = TrackNegDca; - candidate.trackDCA[2] = TrackBachDca; - // daughter signs - candidate.daughterCharge[0] = kfProtonDaughters[i].GetQ(); - candidate.daughterCharge[1] = kfPionDaughters[i].GetQ(); - candidate.daughterCharge[2] = trackBach.sign(); - // daughter PID - candidate.tpcNsigma[0] = tpcNsigmaProton; - candidate.tpcNsigma[1] = tpcNsigmaPion; - candidate.tpcNsigma[2] = tpcNsigmaDeuteron; - candidate.tpcNsigma[3] = tpcNsigmaPionBach; - candidate.tpcdEdx[0] = dEdxProton; - candidate.tpcdEdx[1] = dEdxPion; - candidate.tpcdEdx[2] = dEdxDeuteron; - candidate.tofNsigmaDeuteron = tofNSigmaDeuteron; - candidate.averageClusterSizeDeuteron = averageClusterSizeDeuteron; - candidate.pidForTrackingDeuteron = trackBach.pidForTracking(); - - //------------------------------------------------------------------ - // table filling - fillCandidateTable(candidate); - LOG(debug) << "Table filled."; - - } // end loop over rotations - - // fill event counter hist (has selected candidate) --> only filled once per vertex even in rotation case + // fill event counter hist (has selected candidate) --> only filled once per vertex registry.fill(HIST("Counters/hEventCounterKFParticle"), 3.5); } // end buildVtx3BodyDataTableKFParticle @@ -1521,7 +1495,7 @@ struct decay3bodyBuilder { auto collision = d3body.collision_as(); if (collision.runNumber() != lastRunNumber) { - initCCDBReduced(collision.runNumber()); + initCCDBfromRunNumber(collision.runNumber()); lastRunNumber = collision.runNumber(); // Update the last run number LOG(debug) << "CCDB initialized for run " << lastRunNumber; } @@ -1556,14 +1530,14 @@ struct decay3bodyBuilder { auto tbach1 = d3body1.track2_as(); if (c0.runNumber() != lastRunNumber) { - initCCDBReduced(c0.runNumber()); + initCCDBfromRunNumber(c0.runNumber()); lastRunNumber = c0.runNumber(); // Update the last run number LOG(debug) << "CCDB initialized for run " << lastRunNumber; } fillVtxCand(c0, tpos0, tneg0, tbach1, -1, bachelorcharge, tbach1.tofNSigmaDe()); if (c1.runNumber() != lastRunNumber) { - initCCDBReduced(c1.runNumber()); + initCCDBfromRunNumber(c1.runNumber()); lastRunNumber = c1.runNumber(); // Update the last run number LOG(debug) << "CCDB initialized for run " << lastRunNumber; } @@ -1583,7 +1557,6 @@ struct decay3bodyBuilder { PROCESS_SWITCH(decay3bodyBuilder, processRun3ReducedEM, "Produce event-mix background", false); //------------------------------------------------------------------ - void processRun3withKFParticle(ColwithEvTimes const& collisions, TrackExtPIDIUwithEvTimes const&, aod::Decay3Bodys const& decay3bodys, aod::BCsWithTimestamps const&) { for (const auto& collision : collisions) { @@ -1624,7 +1597,7 @@ struct decay3bodyBuilder { auto trackPos = vtx3body.template track0_as(); auto trackNeg = vtx3body.template track1_as(); auto trackBach = vtx3body.template track2_as(); - buildVtx3BodyDataTableKFParticle(collision, trackPos, trackNeg, trackBach, vtx3body.globalIndex(), bachelorcharge, 1 /*nRotations*/, getTOFnSigma(collision, trackBach, false /*isEventMixing*/)); + buildVtx3BodyDataTableKFParticle(collision, trackPos, trackNeg, trackBach, vtx3body.globalIndex(), bachelorcharge, getTOFnSigma(collision, trackBach, false /*isEventMixing*/)); LOG(debug) << "End of processKFParticle."; } } @@ -1642,40 +1615,6 @@ struct decay3bodyBuilder { } PROCESS_SWITCH(decay3bodyBuilder, processRun3withKFParticleStrangenessTracking, "Produce KFParticle strangeness tracked decay3body tables", false); - void processRun3withKFParticleTrackRotation(ColwithEvTimes const& collisions, TrackExtPIDIUwithEvTimes const&, aod::Decay3Bodys const& decay3bodys, aod::BCsWithTimestamps const&) - { - // same process as processRun3withKFParticle but with nRotations set according to configurable - for (const auto& collision : collisions) { - // event selection - registry.fill(HIST("Counters/hEventCounterKFParticle"), 0.5); - if (kfparticleConfigurations.doSel8selection && !collision.sel8()) { - continue; - } - registry.fill(HIST("Counters/hEventCounterKFParticle"), 1.5); - if (kfparticleConfigurations.doPosZselection && (collision.posZ() >= 10.0f || collision.posZ() <= -10.0f)) { - continue; - } - registry.fill(HIST("Counters/hEventCounterKFParticle"), 2.5); - registry.fill(HIST("QA/Event/hAllSelEventsVtxZ"), collision.posZ()); - - auto bc = collision.bc_as(); - initCCDB(bc); - LOG(debug) << "CCDB initialised."; - - // slice Decay3Body table by collision - const uint64_t collIdx = collision.globalIndex(); - auto Decay3BodyTable_thisCollision = decay3bodys.sliceBy(perCollision, collIdx); - for (auto& vtx3body : Decay3BodyTable_thisCollision) { - auto trackPos = vtx3body.template track0_as(); - auto trackNeg = vtx3body.template track1_as(); - auto trackBach = vtx3body.template track2_as(); - buildVtx3BodyDataTableKFParticle(collision, trackPos, trackNeg, trackBach, vtx3body.globalIndex(), bachelorcharge, kfparticleConfigurations.nRotations, getTOFnSigma(collision, trackBach, false /*isEventMixing*/)); - } - LOG(debug) << "End of processKFParticle."; - } - } - PROCESS_SWITCH(decay3bodyBuilder, processRun3withKFParticleTrackRotation, "Produce KFParticle decay3body tables with rotated tracks", false); - void processRun3withKFParticleReduced(aod::RedCollisions const& collisions, aod::RedIUTracks const&, aod::RedDecay3Bodys const& decay3bodys) { int lastRunNumber = -1; @@ -1683,7 +1622,7 @@ struct decay3bodyBuilder { for (const auto& collision : collisions) { // set magnetic field only when run number changes if (collision.runNumber() != lastRunNumber) { - initCCDBReduced(collision.runNumber()); + initCCDBfromRunNumber(collision.runNumber()); lastRunNumber = collision.runNumber(); // Update the last run number LOG(debug) << "CCDB initialized for run " << lastRunNumber; } @@ -1699,7 +1638,7 @@ struct decay3bodyBuilder { auto trackPos = vtx3body.template track0_as(); auto trackNeg = vtx3body.template track1_as(); auto trackBach = vtx3body.template track2_as(); - buildVtx3BodyDataTableKFParticle(collision, trackPos, trackNeg, trackBach, vtx3body.globalIndex(), bachelorcharge, 1 /*nRotations*/, trackBach.tofNSigmaDe()); + buildVtx3BodyDataTableKFParticle(collision, trackPos, trackNeg, trackBach, vtx3body.globalIndex(), bachelorcharge, trackBach.tofNSigmaDe()); } LOG(debug) << "End of processKFParticleDerived."; } @@ -1708,8 +1647,83 @@ struct decay3bodyBuilder { void processRun3withKFParticleReducedEM(ReducedCollisionsMults const& collisions, aod::RedIUTracks const&, aod::RedDecay3Bodys const& decay3bodys) { + // ------------- Check number of events in bins -------------- + // Define a 2D array to count events and pairs per bin + std::vector> binEventCounts(10, std::vector(13, 0)); // 10 vtxZ bins, 13 multiplicity bins + std::vector> binPairCounts(10, std::vector(13, 0)); + + // Function to find bin index (returns -1 if out of range) + auto findBin = [](float value, const std::vector& binEdges) -> int { + for (size_t i = 0; i < binEdges.size() - 1; ++i) { + if (value > binEdges[i] && value <= binEdges[i + 1]) { + return i; + } + } + return -1; // Shouldn't happen if events are within range + }; + // Loop over all collisions to count them in bins + for (auto& collision : collisions) { + float vtxZ = collision.posZ(); + float mult = collision.multNTracksPV(); + + // Determine bin indices + int vtxZBin = findBin(vtxZ, {-10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}); + int multBin = findBin(mult, {0.0f, 1.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f, 110.0f}); + + if (vtxZBin >= 0 && multBin >= 0) { + binEventCounts[vtxZBin][multBin]++; + } + } + // Print out the number of events per bin + LOG(info) << "Event count per bin (vtxZ, mult):"; + for (size_t i = 0; i < binEventCounts.size(); ++i) { + for (size_t j = 0; j < binEventCounts[i].size(); ++j) { + LOG(info) << "Bin (" << i << ", " << j << "): " << binEventCounts[i][j] << " events"; + } + } + // Fill histogram with numbers per bin + for (size_t i = 0; i < binEventCounts.size(); ++i) { + for (size_t j = 0; j < binEventCounts[i].size(); ++j) { + registry.fill(HIST("QA/EM/hEventBinCounts"), i, j, binEventCounts[i][j]); + } + } + LOG(info) << "Integral of hEventBinCounts:" << registry.get(HIST("QA/EM/hEventBinCounts"))->Integral(); + + // ------------- Check number of decay3bodys in bins ------------- + // Define a 2D array to count events and pairs per bin + std::vector> binDecay3BodyCounts(10, std::vector(13, 0)); // 10 vtxZ bins, 13 multiplicity bins + // Loop over all decay3bodys to count them in bins + for (auto& decay3body : decay3bodys) { + auto collision = decay3body.template collision_as(); + float vtx3bodyZ = collision.posZ(); + float mult3body = collision.multNTracksPV(); + + // Determine bin indices + int vtx3bodyZBin = findBin(vtx3bodyZ, {-10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}); + int mult3bodyBin = findBin(mult3body, {0.0f, 1.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f, 110.0f}); + + if (vtx3bodyZBin >= 0 && mult3bodyBin >= 0) { + binDecay3BodyCounts[vtx3bodyZBin][mult3bodyBin]++; + } + } + // Print out the number of events per bin + LOG(debug) << "Event count per bin (vtxZ, mult):"; + for (size_t i = 0; i < binDecay3BodyCounts.size(); ++i) { + for (size_t j = 0; j < binDecay3BodyCounts[i].size(); ++j) { + LOG(debug) << "Bin (" << i << ", " << j << "): " << binDecay3BodyCounts[i][j] << " events"; + } + } + // Fill histogram with numbers per bin + for (size_t i = 0; i < binDecay3BodyCounts.size(); ++i) { + for (size_t j = 0; j < binDecay3BodyCounts[i].size(); ++j) { + registry.fill(HIST("QA/EM/h3bodyBinCounts"), i, j, binDecay3BodyCounts[i][j]); + } + } + LOG(info) << "Integral of h3bodyBinCounts:" << registry.get(HIST("QA/EM/h3bodyBinCounts"))->Integral(); + + // ------------- Do event mixing -------------- auto tuple = std::make_tuple(decay3bodys); - BinningTypeKF binningOnPosAndMult{{kfparticleConfigurations.binsVtxZ, kfparticleConfigurations.binsMultiplicity}, true}; + BinningTypeKF binningOnPosAndMult{{kfparticleConfigurations.binsVtxZ, kfparticleConfigurations.binsMultiplicity}, true}; // ignore over-/underflow SameKindPair pair{binningOnPosAndMult, kfparticleConfigurations.nEvtMixing, -1, collisions, tuple, &cache}; // indicates that under/overflow (-1) to be ignored int lastRunNumber = -1; @@ -1721,11 +1735,21 @@ struct decay3bodyBuilder { // set magnetic field only when run number changes if (c1.runNumber() != lastRunNumber) { - initCCDBReduced(c1.runNumber()); + initCCDBfromRunNumber(c1.runNumber()); lastRunNumber = c1.runNumber(); // Update the last run number LOG(debug) << "CCDB initialized for run " << lastRunNumber; } + // Get vtxZ and multiplicity from collision + float vtxZpair = c1.posZ(); + float multpair = c1.multNTracksPV(); + // Find the bin index + int vtxZpairBin = findBin(vtxZpair, {-10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}); + int multpairBin = findBin(multpair, {0.0f, 1.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f, 110.0f}); + if (vtxZpairBin >= 0 && multpairBin >= 0) { + binPairCounts[vtxZpairBin][multpairBin]++; // Count the pair + } + for (auto& [decay3body1, decay3body2] : soa::combinations(soa::CombinationsFullIndexPolicy(decays3body1, decays3body2))) { auto trackPos1 = decay3body1.template track0_as(); auto trackNeg1 = decay3body1.template track1_as(); @@ -1767,7 +1791,7 @@ struct decay3bodyBuilder { kfpProton2 = createKFParticleFromTrackParCov(trackParCovNeg2, trackNeg2.sign(), constants::physics::MassProton); kfpPion2 = createKFParticleFromTrackParCov(trackParCovPos2, trackPos2.sign(), constants::physics::MassPionCharged); } - kfpDeuteron1 = createKFParticleFromTrackParCov(trackParCovBach2, trackBach2.sign() * bachelorcharge, constants::physics::MassDeuteron); + kfpDeuteron2 = createKFParticleFromTrackParCov(trackParCovBach2, trackBach2.sign() * bachelorcharge, constants::physics::MassDeuteron); // fit vertices KFParticle KFHt1, KFHt2; fit3bodyVertex(kfpProton1, kfpPion1, kfpDeuteron1, KFHt1); @@ -1778,8 +1802,8 @@ struct decay3bodyBuilder { auto radius2 = std::sqrt(KFHt2.GetX() * KFHt2.GetX() + KFHt2.GetY() * KFHt2.GetY()); registry.fill(HIST("QA/EM/hRadius1"), radius1); registry.fill(HIST("QA/EM/hRadius2"), radius2); - registry.fill(HIST("QA/EM/hPhi1"), radius1); - registry.fill(HIST("QA/EM/hPhi2"), radius2); + registry.fill(HIST("QA/EM/hPhi1"), KFHt1.GetPhi() * (180.0 / TMath::Pi())); + registry.fill(HIST("QA/EM/hPhi2"), KFHt2.GetPhi() * (180.0 / TMath::Pi())); registry.fill(HIST("QA/EM/hDeltaRadius"), std::abs(radius1 - radius2)); registry.fill(HIST("QA/EM/hDeltaPhi"), std::abs(KFHt1.GetPhi() - KFHt2.GetPhi()) * (180.0 / TMath::Pi())); if (std::abs(KFHt1.GetPhi() - KFHt2.GetPhi()) * (180.0 / TMath::Pi()) > 10 || std::abs(radius1 - radius2) > 2) { @@ -1787,13 +1811,52 @@ struct decay3bodyBuilder { } registry.fill(HIST("QA/EM/hCombinationCounterMixing"), 2.5); + // fill 2D pair counter per bin + registry.fill(HIST("QA/EM/hPairBinCounts"), vtxZpairBin, multpairBin, 1); + // ---------- do candidate analysis ---------- - buildVtx3BodyDataTableKFParticle(c1, trackPos1, trackNeg1, trackBach2, -1 /*vtx3bodyID*/, bachelorcharge, 1 /*nRotations*/, trackBach2.tofNSigmaDe()); - LOG(debug) << "buildVtx3BodyDataTableKFParticle called."; - } + buildVtx3BodyDataTableKFParticle(c1, trackPos1, trackNeg1, trackBach2, -1 /*vtx3bodyID*/, bachelorcharge, trackBach2.tofNSigmaDe()); + } // end decay3body combinations loop } // end pairing loop - } + } // end process PROCESS_SWITCH(decay3bodyBuilder, processRun3withKFParticleReducedEM, "Produce KFParticle event mixing decay3body tables from derived decay3body data", false); + + void processRun3withKFParticleReduced3bodyMixing(ReducedCollisionsMults const&, aod::RedIUTracks const&, soa::Join const& decay3bodys) + { + Binning3Body binningOnRadPhiPosZ{{kfparticleConfigurations.bins3BodyRadius, kfparticleConfigurations.bins3BodyPhi, kfparticleConfigurations.bins3BodyPosZ}, true}; + + // Strictly upper index policy for decay3body objects binned by radius, phi and z position + for (auto& [decay3body1, decay3body2] : selfCombinations(binningOnRadPhiPosZ, kfparticleConfigurations.nEvtMixing, -1, decay3bodys, decay3bodys)) { + auto trackPos1 = decay3body1.template track0_as(); + auto trackNeg1 = decay3body1.template track1_as(); + auto trackBach1 = decay3body1.template track2_as(); + auto trackBach2 = decay3body2.template track2_as(); + + registry.fill(HIST("QA/EM/h3bodyCombinationCounter"), 0.5); + + // ---------- selections ---------- + if ((trackBach1.sign() > 0 && !(trackBach2.sign() > 0)) || (trackBach1.sign() < 0 && !(trackBach2.sign() < 0)) || trackBach1.globalIndex() == trackBach2.globalIndex()) { // only combine if trackBach2 has correct sign and is not same as trackBach1 + continue; + } + registry.fill(HIST("QA/EM/h3bodyCombinationCounter"), 1.5); + + if (decay3body1.collisionId() == decay3body2.collisionId()) { // only combine if from different event + continue; + } + registry.fill(HIST("QA/EM/h3bodyCombinationCounter"), 2.5); + + auto collision1 = decay3body1.template collision_as(); + auto collision2 = decay3body2.template collision_as(); + if (kfparticleConfigurations.selectVtxZ3bodyMixing && std::abs(collision1.posZ() - collision2.posZ()) > kfparticleConfigurations.VtxZBin3bodyMixing) { // only combine if collision similar in VtxZ + continue; + } + registry.fill(HIST("QA/EM/h3bodyCombinationCounter"), 3.5); + + // ---------- do candidate analysis ---------- + buildVtx3BodyDataTableKFParticle(collision1, trackPos1, trackNeg1, trackBach2, -1 /*vtx3bodyID*/, bachelorcharge, trackBach2.tofNSigmaDe()); + } // end decay3body combinations loop + } + PROCESS_SWITCH(decay3bodyBuilder, processRun3withKFParticleReduced3bodyMixing, "Produce KFParticle mixed decay3body tables from derived decay3body data", false); }; // build link from decay3body -> vtx3body diff --git a/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx b/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx index f9202c33e69..93ca8a26990 100644 --- a/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx +++ b/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx @@ -25,7 +25,6 @@ #include "Framework/AnalysisDataModel.h" #include "Framework/ASoAHelpers.h" #include "ReconstructionDataFormats/Track.h" -#include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/Centrality.h" @@ -35,15 +34,28 @@ #include "Common/DataModel/PIDResponse.h" #include "Common/Core/PID/PIDTOF.h" #include "TableHelper.h" +#include "Tools/KFparticle/KFUtilities.h" #include "EventFiltering/Zorro.h" #include "EventFiltering/ZorroSummary.h" +#include "DetectorsBase/Propagator.h" #include "DetectorsBase/GeometryManager.h" #include "DataFormatsParameters/GRPObject.h" #include "DataFormatsParameters/GRPMagField.h" #include "CCDB/BasicCCDBManager.h" +#ifndef HomogeneousField +#define HomogeneousField +#endif + +// includes KFParticle +#include "KFParticle.h" +#include "KFPTrack.h" +#include "KFPVertex.h" +#include "KFParticleBase.h" +#include "KFVertex.h" + using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; @@ -62,6 +74,7 @@ struct reduced3bodyCreator { Produces reducedPVMults; Produces reducedCentFT0Cs; Produces reducedDecay3Bodys; + Produces reduced3BodyInfo; Produces reducedFullTracksPIDIU; Service ccdb; @@ -70,13 +83,13 @@ struct reduced3bodyCreator { o2::aod::pidtofgeneric::TofPidNewCollision bachelorTOFPID; - std::vector daughterTracks; - Configurable event_sel8_selection{"event_sel8_selection", true, "event selection count post sel8 cut"}; Configurable mc_event_selection{"mc_event_selection", true, "mc event selection count post kIsTriggerTVX and kNoTimeFrameBorder"}; Configurable event_posZ_selection{"event_posZ_selection", true, "event selection count post poZ cut"}; // CCDB options Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; + Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; // CCDB TOF PID paras Configurable timestamp{"ccdb-timestamp", -1, "timestamp of the object"}; Configurable paramFileName{"paramFileName", "", "Path to the parametrization object. If empty the parametrization is not taken from file"}; @@ -91,6 +104,7 @@ struct reduced3bodyCreator { Configurable cfgOnlyKeepH3L3Body{"cfgOnlyKeepH3L3Body", false, "Flag to keep only H3L3Body trigger"}; int mRunNumber; + float d_bz; o2::pid::tof::TOFResoParamsV2 mRespParamsV2; HistogramRegistry registry{"registry", {}}; @@ -108,7 +122,7 @@ struct reduced3bodyCreator { registry.add("hAllSelEventsVtxZ", "hAllSelEventsVtxZ", HistType::kTH1F, {{500, -15.0f, 15.0f, "PV Z (cm)"}}); - auto hEventCounter = registry.add("hEventCounter", "hEventCounter", HistType::kTH1F, {{4, 0.0f, 4.0f}}); + auto hEventCounter = registry.add("hEventCounter", "hEventCounter", HistType::kTH1D, {{4, 0.0f, 4.0f}}); hEventCounter->GetXaxis()->SetBinLabel(1, "total"); hEventCounter->GetXaxis()->SetBinLabel(2, "sel8"); hEventCounter->GetXaxis()->SetBinLabel(3, "vertexZ"); @@ -136,6 +150,31 @@ struct reduced3bodyCreator { } mRunNumber = bc.runNumber(); + // In case override, don't proceed, please - no CCDB access required + auto run3grp_timestamp = bc.timestamp(); + o2::parameters::GRPObject* grpo = ccdb->getForTimeStamp(grpPath, run3grp_timestamp); + o2::parameters::GRPMagField* grpmag = 0x0; + if (grpo) { + o2::base::Propagator::initFieldFromGRP(grpo); + // Fetch magnetic field from ccdb for current collision + d_bz = grpo->getNominalL3Field(); + LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; + } else { + grpmag = ccdb->getForTimeStamp(grpmagPath, run3grp_timestamp); + if (!grpmag) { + LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for timestamp " << run3grp_timestamp; + } + o2::base::Propagator::initFieldFromGRP(grpmag); + // Fetch magnetic field from ccdb for current collision + // d_bz = std::lround(5.f * grpmag->getL3Current() / 30000.f); + d_bz = o2::base::Propagator::Instance()->getNominalBz(); + LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; + } +// Set magnetic field for KF vertexing +#ifdef HomogeneousField + KFParticle::SetField(d_bz); +#endif + // Initial TOF PID Paras, copied from PIDTOF.h timestamp.value = bc.timestamp(); ccdb->setTimestamp(timestamp.value); @@ -197,6 +236,8 @@ struct reduced3bodyCreator { bachelorTOFPID.SetParams(mRespParamsV2); } + //------------------------------------------------------------------ + // function to fill reduced track table template void fillTrackTable(TTrack const& daughter, double tofNSigmaTrack, auto collisionIndex) { @@ -220,6 +261,24 @@ struct reduced3bodyCreator { tofNSigmaTrack); } + //------------------------------------------------------------------ + // function to fit KFParticle 3body vertex + template + void fit3bodyVertex(TKFParticle& kfpProton, TKFParticle& kfpPion, TKFParticle& kfpDeuteron, TKFParticle& KFHt) + { + // Construct 3body vertex + int nDaughters3body = 3; + const KFParticle* Daughters3body[3] = {&kfpProton, &kfpPion, &kfpDeuteron}; + KFHt.SetConstructMethod(2); + try { + KFHt.Construct(Daughters3body, nDaughters3body); + } catch (std::runtime_error& e) { + LOG(debug) << "Failed to create Hyper triton 3-body vertex." << e.what(); + return; + } + LOG(debug) << "Hypertriton vertex constructed."; + } + void process(ColwithEvTimesMultsCents const& collisions, TrackExtPIDIUwithEvTimes const&, aod::Decay3Bodys const& decay3bodys, aod::BCsWithTimestamps const&) { @@ -264,8 +323,6 @@ struct reduced3bodyCreator { // Creat reduced table for (const auto& d3body : decay3bodys) { - daughterTracks.clear(); - auto collision = d3body.template collision_as(); if (event_sel8_selection && !collision.sel8()) { @@ -314,15 +371,40 @@ struct reduced3bodyCreator { double tofNSigmaBach = bachelorTOFPID.GetTOFNSigma(daughter2, originalcol, collision); // ---------------------------------------------- - // save reduced track table with decay3body daughters + // -------- save reduced track table with decay3body daughters ---------- fillTrackTable(daughter0, -999, collisionIndex); fillTrackTable(daughter1, -999, collisionIndex); fillTrackTable(daughter2, tofNSigmaBach, collisionIndex); - // save reduced decay3body table + // -------- save reduced decay3body table -------- const auto trackStartIndex = reducedFullTracksPIDIU.lastIndex(); reducedDecay3Bodys(collisionIndex, trackStartIndex - 2, trackStartIndex - 1, trackStartIndex); - } + + // -------- save reduced decay3body info table -------- + // get trackParCov daughters + auto trackParCovPos = getTrackParCov(daughter0); + auto trackParCovNeg = getTrackParCov(daughter1); + auto trackParCovBach = getTrackParCov(daughter2); + // create KFParticle daughters + KFParticle kfpProton, kfpPion, kfpDeuteron; + if (daughter2.sign() > 0) { + kfpProton = createKFParticleFromTrackParCov(trackParCovPos, daughter0.sign(), constants::physics::MassProton); + kfpPion = createKFParticleFromTrackParCov(trackParCovNeg, daughter1.sign(), constants::physics::MassPionCharged); + } else if (!(daughter2.sign() > 0)) { + kfpProton = createKFParticleFromTrackParCov(trackParCovNeg, daughter1.sign(), constants::physics::MassProton); + kfpPion = createKFParticleFromTrackParCov(trackParCovPos, daughter0.sign(), constants::physics::MassPionCharged); + } + kfpDeuteron = createKFParticleFromTrackParCov(trackParCovBach, daughter2.sign(), constants::physics::MassDeuteron); + // fit 3body vertex + KFParticle KFHt; + fit3bodyVertex(kfpProton, kfpPion, kfpDeuteron, KFHt); + // calculate radius and phi + auto radius = std::sqrt(KFHt.GetX() * KFHt.GetX() + KFHt.GetY() * KFHt.GetY()); + float phi, sigma; + KFHt.GetPhi(phi, sigma); + // fill 3body info table + reduced3BodyInfo(radius, phi, KFHt.GetZ()); + } // end decay3body loop registry.fill(HIST("hEventCounter"), 3.5, reducedCollisions.lastIndex() + 1); } diff --git a/PWGLF/TableProducer/Nuspex/threebodyKFTask.cxx b/PWGLF/TableProducer/Nuspex/threebodyKFTask.cxx index e81eeaf354b..1fed55805c2 100644 --- a/PWGLF/TableProducer/Nuspex/threebodyKFTask.cxx +++ b/PWGLF/TableProducer/Nuspex/threebodyKFTask.cxx @@ -193,7 +193,7 @@ struct threebodyKFTask { // loop over collisions for (const auto& collision : collisions) { // event selection - if (!collision.sel8() || abs(collision.posZ()) > 10.f) { + if (!collision.sel8() || std::abs(collision.posZ()) > 10.f) { continue; } // reco collision survived event selection filter --> fill value for MC collision if collision is "true" MC collision From b4d7ff7599251c90e6bdf6b374f4590f7655c4ea Mon Sep 17 00:00:00 2001 From: Zhen Zhang <74494053+zz951@users.noreply.github.com> Date: Fri, 28 Feb 2025 10:41:05 +0100 Subject: [PATCH 0462/1650] [PWGHF] Fix ThnSparse ignored statusLcPrompt (#10230) --- PWGHF/HFC/Tasks/taskCorrelationLcHadrons.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGHF/HFC/Tasks/taskCorrelationLcHadrons.cxx b/PWGHF/HFC/Tasks/taskCorrelationLcHadrons.cxx index ede013d1f22..2c7e3dd3e80 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationLcHadrons.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationLcHadrons.cxx @@ -661,7 +661,7 @@ struct HfTaskCorrelationLcHadrons { if (fillSign) { registry.fill(HIST("hCorrel2DVsPtSignSignalRegionMcRec"), deltaPhi, deltaEta, ptLc, ptHadron, signPair, poolBin, efficiencyWeight); } else { - registry.fill(HIST("hCorrel2DVsPtSignalRegionMcRec"), deltaPhi, deltaEta, ptLc, ptHadron, poolBin, efficiencyWeight); + registry.fill(HIST("hCorrel2DVsPtSignalRegionMcRec"), deltaPhi, deltaEta, ptLc, ptHadron, statusLcPrompt, poolBin, efficiencyWeight); } registry.fill(HIST("hCorrel2DPtIntSignalRegionMcRec"), deltaPhi, deltaEta, efficiencyWeight); registry.fill(HIST("hDeltaEtaPtIntSignalRegionMcRec"), deltaEta, efficiencyWeight); From 89c0ac8b5dcf70a6fc394e8bb9dc013f41d493c9 Mon Sep 17 00:00:00 2001 From: alcaliva <32872606+alcaliva@users.noreply.github.com> Date: Fri, 28 Feb 2025 11:06:57 +0100 Subject: [PATCH 0463/1650] [PWGLF] added histos for prim, sec and sec from v0 (#10240) --- .../QC/lfITSTPCMatchingSecondaryTracksQA.cxx | 111 +++++++++++------- 1 file changed, 70 insertions(+), 41 deletions(-) diff --git a/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx b/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx index 923f2cd8507..6322224f14f 100644 --- a/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx +++ b/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx @@ -94,18 +94,22 @@ struct LfITSTPCMatchingSecondaryTracksQA { // Event Counters if (doprocessData) { registryData.add("number_of_events_data", "number of events in data", HistType::kTH1D, {{20, 0, 20, "Event Cuts"}}); - registryData.add("gloPionTPC", "gloPionTPC", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); - registryData.add("gloPionTPC_ITS", "gloPionTPC_ITS", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); + registryData.add("primPionTPC", "primPionTPC", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); + registryData.add("primPionTPC_ITS", "primPionTPC_ITS", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); registryData.add("secPionTPC", "secPionTPC", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); registryData.add("secPionTPC_ITS", "secPionTPC_ITS", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); + registryData.add("secPionV0TPC", "secPionV0TPC", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); + registryData.add("secPionV0TPC_ITS", "secPionV0TPC_ITS", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); } if (doprocessMC) { registryMC.add("number_of_events_mc", "number of events in mc", HistType::kTH1D, {{20, 0, 20, "Event Cuts"}}); - registryMC.add("gloPionTPC_MC", "gloPionTPC_MC", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); - registryMC.add("gloPionTPC_ITS_MC", "gloPionTPC_ITS_MC", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); + registryMC.add("primPionTPC_MC", "primPionTPC_MC", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); + registryMC.add("primPionTPC_ITS_MC", "primPionTPC_ITS_MC", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); registryMC.add("secPionTPC_MC", "secPionTPC_MC", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); registryMC.add("secPionTPC_ITS_MC", "secPionTPC_ITS_MC", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); + registryMC.add("secPionV0TPC_MC", "secPionV0TPC_MC", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); + registryMC.add("secPionV0TPC_ITS_MC", "secPionV0TPC_ITS_MC", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); } } @@ -115,8 +119,8 @@ struct LfITSTPCMatchingSecondaryTracksQA { return (itsClsmap & testBit); } - template - bool passedTrackSelectionTpcGlobal(const TpcTrackGlo& track) + template + bool passedTrackSelectionTpcPrimary(const TpcPrimTrack& track) { if (!track.hasTPC()) return false; @@ -128,14 +132,33 @@ struct LfITSTPCMatchingSecondaryTracksQA { return false; if (track.eta() < etaMin || track.eta() > etaMax) return false; - if (std::sqrt(track.dcaXY() * track.dcaXY() + track.dcaZ() * track.dcaZ()) < dcaMin) + if (std::fabs(track.dcaXY()) > dcaxyMax) + return false; + if (std::fabs(track.dcaZ()) > dcazMax) return false; + return true; + } + template + bool passedTrackSelectionTpcSecondary(const TpcSecTrack& track) + { + if (!track.hasTPC()) + return false; + if (track.tpcNClsCrossedRows() < minNCrossedRowsTPC) + return false; + if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < minNCrossedRowsOverFindable) + return false; + if (track.tpcChi2NCl() > maxChi2TPC) + return false; + if (track.eta() < etaMin || track.eta() > etaMax) + return false; + if (std::sqrt(track.dcaXY() * track.dcaXY() + track.dcaZ() * track.dcaZ()) < dcaMin) + return false; return true; } - template - bool passedTrackSelectionTpc(const TpcTrack& track) + template + bool passedTrackSelectionV0daughTPC(const v0Track& track) { if (!track.hasTPC()) return false; @@ -218,11 +241,17 @@ struct LfITSTPCMatchingSecondaryTracksQA { for (const auto& track : tracks) { - if (passedTrackSelectionTpcGlobal(track) && passedPionSelection(track)) - registryData.fill(HIST("gloPionTPC"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); - - if (passedTrackSelectionTpcGlobal(track) && passedPionSelection(track) && track.hasITS()) - registryData.fill(HIST("gloPionTPC_ITS"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); + // Primary Tracks + if (passedTrackSelectionTpcPrimary(track) && passedPionSelection(track)) + registryData.fill(HIST("primPionTPC"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); + if (passedTrackSelectionTpcPrimary(track) && passedPionSelection(track) && passedTrackSelectionIts(track)) + registryData.fill(HIST("primPionTPC_ITS"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); + + // Secondary Tracks + if (passedTrackSelectionTpcSecondary(track) && passedPionSelection(track)) + registryData.fill(HIST("secPionTPC"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); + if (passedTrackSelectionTpcSecondary(track) && passedPionSelection(track) && track.hasITS()) + registryData.fill(HIST("secPionTPC_ITS"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); } for (const auto& v0 : fullV0s) { @@ -232,17 +261,14 @@ struct LfITSTPCMatchingSecondaryTracksQA { if (!passedK0ShortSelection(v0)) continue; - if (passedTrackSelectionTpc(posTrack) && passedPionSelection(posTrack)) - registryData.fill(HIST("secPionTPC"), posTrack.pt(), posTrack.eta(), TVector2::Phi_0_2pi(posTrack.phi())); - - if (passedTrackSelectionTpc(negTrack) && passedPionSelection(negTrack)) - registryData.fill(HIST("secPionTPC"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); - - if (passedTrackSelectionTpc(posTrack) && passedPionSelection(posTrack) && posTrack.hasITS()) - registryData.fill(HIST("secPionTPC_ITS"), posTrack.pt(), posTrack.eta(), TVector2::Phi_0_2pi(posTrack.phi())); - - if (passedTrackSelectionTpc(negTrack) && passedPionSelection(negTrack) && negTrack.hasITS()) - registryData.fill(HIST("secPionTPC_ITS"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); + if (passedTrackSelectionV0daughTPC(posTrack) && passedPionSelection(posTrack)) + registryData.fill(HIST("secPionV0TPC"), posTrack.pt(), posTrack.eta(), TVector2::Phi_0_2pi(posTrack.phi())); + if (passedTrackSelectionV0daughTPC(negTrack) && passedPionSelection(negTrack)) + registryData.fill(HIST("secPionV0TPC"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); + if (passedTrackSelectionV0daughTPC(posTrack) && passedPionSelection(posTrack) && posTrack.hasITS()) + registryData.fill(HIST("secPionV0TPC_ITS"), posTrack.pt(), posTrack.eta(), TVector2::Phi_0_2pi(posTrack.phi())); + if (passedTrackSelectionV0daughTPC(negTrack) && passedPionSelection(negTrack) && negTrack.hasITS()) + registryData.fill(HIST("secPionV0TPC_ITS"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); } } PROCESS_SWITCH(LfITSTPCMatchingSecondaryTracksQA, processData, "Process data", true); @@ -264,11 +290,17 @@ struct LfITSTPCMatchingSecondaryTracksQA { for (const auto& track : tracksPerColl) { - if (passedTrackSelectionTpcGlobal(track) && passedPionSelection(track)) - registryMC.fill(HIST("gloPionTPC_MC"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); - - if (passedTrackSelectionTpcGlobal(track) && passedPionSelection(track) && track.hasITS()) - registryMC.fill(HIST("gloPionTPC_ITS_MC"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); + // Primary Tracks + if (passedTrackSelectionTpcPrimary(track) && passedPionSelection(track)) + registryMC.fill(HIST("primPionTPC_MC"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); + if (passedTrackSelectionTpcPrimary(track) && passedPionSelection(track) && passedTrackSelectionIts(track)) + registryMC.fill(HIST("primPionTPC_ITS_MC"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); + + // Secondary Tracks + if (passedTrackSelectionTpcSecondary(track) && passedPionSelection(track)) + registryMC.fill(HIST("secPionTPC_MC"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); + if (passedTrackSelectionTpcSecondary(track) && passedPionSelection(track) && track.hasITS()) + registryMC.fill(HIST("secPionTPC_ITS_MC"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); } for (const auto& v0 : v0sPerColl) { @@ -278,17 +310,14 @@ struct LfITSTPCMatchingSecondaryTracksQA { if (!passedK0ShortSelection(v0)) continue; - if (passedTrackSelectionTpc(posTrack) && passedPionSelection(posTrack)) - registryMC.fill(HIST("secPionTPC_MC"), posTrack.pt(), posTrack.eta(), TVector2::Phi_0_2pi(posTrack.phi())); - - if (passedTrackSelectionTpc(negTrack) && passedPionSelection(negTrack)) - registryMC.fill(HIST("secPionTPC_MC"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); - - if (passedTrackSelectionTpc(posTrack) && passedPionSelection(posTrack) && posTrack.hasITS()) - registryMC.fill(HIST("secPionTPC_ITS_MC"), posTrack.pt(), posTrack.eta(), TVector2::Phi_0_2pi(posTrack.phi())); - - if (passedTrackSelectionTpc(negTrack) && passedPionSelection(negTrack) && negTrack.hasITS()) - registryMC.fill(HIST("secPionTPC_ITS_MC"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); + if (passedTrackSelectionV0daughTPC(posTrack) && passedPionSelection(posTrack)) + registryMC.fill(HIST("secPionV0TPC_MC"), posTrack.pt(), posTrack.eta(), TVector2::Phi_0_2pi(posTrack.phi())); + if (passedTrackSelectionV0daughTPC(negTrack) && passedPionSelection(negTrack)) + registryMC.fill(HIST("secPionV0TPC_MC"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); + if (passedTrackSelectionV0daughTPC(posTrack) && passedPionSelection(posTrack) && posTrack.hasITS()) + registryMC.fill(HIST("secPionV0TPC_ITS_MC"), posTrack.pt(), posTrack.eta(), TVector2::Phi_0_2pi(posTrack.phi())); + if (passedTrackSelectionV0daughTPC(negTrack) && passedPionSelection(negTrack) && negTrack.hasITS()) + registryMC.fill(HIST("secPionV0TPC_ITS_MC"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); } } } From c35c7121cdfab5ed9993d2ba0fa85297a49cb357 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Fri, 28 Feb 2025 11:59:31 +0100 Subject: [PATCH 0464/1650] [PWGCF] Pow -> product (#10194) --- PWGCF/Femto3D/Core/femto3dPairTask.h | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/PWGCF/Femto3D/Core/femto3dPairTask.h b/PWGCF/Femto3D/Core/femto3dPairTask.h index 38108379302..2b8941262a5 100755 --- a/PWGCF/Femto3D/Core/femto3dPairTask.h +++ b/PWGCF/Femto3D/Core/femto3dPairTask.h @@ -257,7 +257,9 @@ bool FemtoPair::IsClosePair(const float& deta, const float& dphi, con return true; if (_magfield1 * _magfield2 == 0) return true; - if (std::pow(std::fabs(GetEtaDiff()) / deta, 2) + std::pow(std::fabs(GetPhiStarDiff(radius)) / dphi, 2) < 1.0f) + const float relEtaDiff = GetEtaDiff() / deta; + const float relPhiStarDiff = GetPhiStarDiff(radius) / dphi; + if ((relEtaDiff * relEtaDiff + relPhiStarDiff * relPhiStarDiff) < 1.0f) return true; // if (std::fabs(GetEtaDiff()) < deta && std::fabs(GetPhiStarDiff(radius)) < dphi) // return true; @@ -272,7 +274,9 @@ bool FemtoPair::IsClosePair(const float& deta, const float& dphi) con return true; if (_magfield1 * _magfield2 == 0) return true; - if (std::pow(std::fabs(GetEtaDiff()) / deta, 2) + std::pow(std::fabs(GetAvgPhiStarDiff()) / dphi, 2) < 1.0f) + const float relEtaDiff = GetEtaDiff() / deta; + const float relPhiStarDiff = GetAvgPhiStarDiff() / dphi; + if ((relEtaDiff * relEtaDiff + relPhiStarDiff * relPhiStarDiff) < 1.0f) return true; // if (std::fabs(GetEtaDiff()) < deta && std::fabs(GetPhiStarDiff(radius)) < dphi) // return true; @@ -291,7 +295,9 @@ float FemtoPair::GetAvgSep() const float res = 0.0; for (const auto& radius : TPCradii) { - res += sqrt(pow(2.0 * radius * sin(0.5 * GetPhiStarDiff(radius)), 2) + pow(2.0 * radius * sin(0.5 * dtheta), 2)); + const float dRtrans = 2.0 * radius * sin(0.5 * GetPhiStarDiff(radius)); + const float dRlong = 2.0 * radius * sin(0.5 * dtheta); + res += sqrt(dRtrans * dRtrans + dRlong * dRlong); } return 100.0 * res / TPCradii.size(); @@ -308,7 +314,7 @@ float FemtoPair::GetAvgPhiStarDiff() const float res = 0.0; for (const auto& radius : TPCradii) { - auto dphi = GetPhiStarDiff(radius); + const float dphi = GetPhiStarDiff(radius); res += fabs(dphi) > o2::constants::math::PI ? (1.0 - 2.0 * o2::constants::math::PI / fabs(dphi)) * dphi : dphi; } @@ -360,8 +366,9 @@ float FemtoPair::GetKt() const return -1000; if (_PDG1 * _PDG2 == 0) return -1000; - - return 0.5 * std::sqrt(std::pow(_first->px() + _second->px(), 2) + std::pow(_first->py() + _second->py(), 2)); + const float px = _first->px() + _second->px(); + const float py = _first->py() + _second->py(); + return 0.5 * std::sqrt(px * px + py * py); } template From 68659e4995de366b7874a55dc397def384193337 Mon Sep 17 00:00:00 2001 From: glromane <95305986+glromane@users.noreply.github.com> Date: Fri, 28 Feb 2025 12:00:26 +0100 Subject: [PATCH 0465/1650] [PWGCF] fixing the workflow.json (#10228) --- .../TableProducer/singleTrackSelectorPIDMaker.cxx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/PWGCF/Femto3D/TableProducer/singleTrackSelectorPIDMaker.cxx b/PWGCF/Femto3D/TableProducer/singleTrackSelectorPIDMaker.cxx index 611a5333841..ebdc786469b 100644 --- a/PWGCF/Femto3D/TableProducer/singleTrackSelectorPIDMaker.cxx +++ b/PWGCF/Femto3D/TableProducer/singleTrackSelectorPIDMaker.cxx @@ -129,9 +129,7 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) {"O2singlepidpr", {[&]() { workflow.push_back(adaptAnalysisTask(cfgc)); }}}, {"O2singlepidde", {[&]() { workflow.push_back(adaptAnalysisTask(cfgc)); }}}, {"O2singlepidtr", {[&]() { workflow.push_back(adaptAnalysisTask(cfgc)); }}}, - {"O2singlepidhe", {[&]() { workflow.push_back(adaptAnalysisTask(cfgc)); }}} - - }; + {"O2singlepidhe", {[&]() { workflow.push_back(adaptAnalysisTask(cfgc)); }}}}; for (auto const& tableInWorkflow : tables) { LOG(info) << tableInWorkflow; @@ -154,7 +152,14 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) } } } else { - LOG(warning) << "AOD converter: No tables found in the meta data"; + LOG(warning) << "AOD converter: No tables found in the meta data. Adding all workflows"; + workflow.push_back(adaptAnalysisTask(cfgc)); + workflow.push_back(adaptAnalysisTask(cfgc)); + workflow.push_back(adaptAnalysisTask(cfgc)); + workflow.push_back(adaptAnalysisTask(cfgc)); + workflow.push_back(adaptAnalysisTask(cfgc)); + workflow.push_back(adaptAnalysisTask(cfgc)); + workflow.push_back(adaptAnalysisTask(cfgc)); } return workflow; } From 0aa1883d244cfd6d7e30c73d59b40956309a9abd Mon Sep 17 00:00:00 2001 From: suyoupeng <109774812+15071832337@users.noreply.github.com> Date: Fri, 28 Feb 2025 19:01:44 +0800 Subject: [PATCH 0466/1650] [PWGLF] PWGLF:Lambda polarization induced by jet in pp collision in 13.6 TeV (#10239) --- PWGLF/DataModel/lambdaJetpolarization.h | 77 +++ .../TableProducer/Strangeness/CMakeLists.txt | 5 + .../lambdaJetpolarizationbuilder.cxx | 623 ++++++++++++++++++ PWGLF/Tasks/Strangeness/CMakeLists.txt | 5 + .../Strangeness/lambdaJetpolarization.cxx | 248 +++++++ 5 files changed, 958 insertions(+) create mode 100644 PWGLF/DataModel/lambdaJetpolarization.h create mode 100644 PWGLF/TableProducer/Strangeness/lambdaJetpolarizationbuilder.cxx create mode 100644 PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx diff --git a/PWGLF/DataModel/lambdaJetpolarization.h b/PWGLF/DataModel/lambdaJetpolarization.h new file mode 100644 index 00000000000..eb69f9e3b77 --- /dev/null +++ b/PWGLF/DataModel/lambdaJetpolarization.h @@ -0,0 +1,77 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// +/// \brief QA task for lambda polarization induced by jet analysis using derived data +/// +/// \author Youpeng Su (yousu@cern.ch) + +#ifndef PWGLF_DATAMODEL_LAMBDAJETPOLARIZATION_H_ +#define PWGLF_DATAMODEL_LAMBDAJETPOLARIZATION_H_ + +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/Centrality.h" +#include "TRandom.h" +#include "Math/Vector4D.h" +#include "Math/Boost.h" + +namespace o2::aod +{ +DECLARE_SOA_TABLE(MyCollisions, "AOD", "MYCOLLISION", //! vertex information of collision + o2::soa::Index<>, collision::PosZ); +using MyCollision = MyCollisions::iterator; + +DECLARE_SOA_TABLE(MyCollisionsV0, "AOD", "MYCOLLISIONV0", //! vertex information of collision + o2::soa::Index<>, collision::PosX); +using MyCollisionV0s = MyCollisionsV0::iterator; + +namespace myTable +{ +DECLARE_SOA_INDEX_COLUMN(MyCollision, mycollision); +DECLARE_SOA_COLUMN(MyCollisionV0, mycollisionv0, Int_t); +DECLARE_SOA_COLUMN(V0px, v0px, Float_t); +DECLARE_SOA_COLUMN(V0py, v0py, Float_t); +DECLARE_SOA_COLUMN(V0pz, v0pz, Float_t); +DECLARE_SOA_COLUMN(V0pT, v0pt, Float_t); +DECLARE_SOA_COLUMN(V0Lambdamass, v0Lambdamass, Float_t); +DECLARE_SOA_COLUMN(V0protonpx, v0protonpx, Float_t); +DECLARE_SOA_COLUMN(V0protonpy, v0protonpy, Float_t); +DECLARE_SOA_COLUMN(V0protonpz, v0protonpz, Float_t); +DECLARE_SOA_COLUMN(MyCollisionJet, mycollisionjet, Int_t); +DECLARE_SOA_COLUMN(Jetpx, jetpx, Float_t); +DECLARE_SOA_COLUMN(Jetpy, jetpy, Float_t); +DECLARE_SOA_COLUMN(Jetpz, jetpz, Float_t); +DECLARE_SOA_COLUMN(JetpT, jetpt, Float_t); +DECLARE_SOA_COLUMN(MyCollisionLeadingJet, mycollisionleadingjet, Int_t); +DECLARE_SOA_COLUMN(LeadingJetpx, leadingjetpx, Float_t); +DECLARE_SOA_COLUMN(LeadingJetpy, leadingjetpy, Float_t); +DECLARE_SOA_COLUMN(LeadingJetpz, leadingjetpz, Float_t); +DECLARE_SOA_COLUMN(LeadingJetpT, leadingjetpt, Float_t); + +} // namespace myTable + +DECLARE_SOA_TABLE(MyTable, "AOD", "MYTABLE", o2::soa::Index<>, + myTable::MyCollisionId, myTable::MyCollisionV0, myTable::V0px, myTable::V0py, myTable::V0pz, myTable::V0pT, myTable::V0Lambdamass, + myTable::V0protonpx, myTable::V0protonpy, myTable::V0protonpz); + +DECLARE_SOA_TABLE(MyTableJet, "AOD", "MYTABLEJet", o2::soa::Index<>, + myTable::MyCollisionId, myTable::MyCollisionJet, myTable::Jetpx, myTable::Jetpy, myTable::Jetpz, myTable::JetpT); + +DECLARE_SOA_TABLE(MyTableLeadingJet, "AOD", "LeadingJet", o2::soa::Index<>, myTable::MyCollisionId, myTable::MyCollisionLeadingJet, myTable::LeadingJetpx, myTable::LeadingJetpy, myTable::LeadingJetpz, myTable::LeadingJetpT); + +} // namespace o2::aod + +#endif // PWGLF_DATAMODEL_LAMBDAJETPOLARIZATION_H_ diff --git a/PWGLF/TableProducer/Strangeness/CMakeLists.txt b/PWGLF/TableProducer/Strangeness/CMakeLists.txt index 542455b6203..81647db03ee 100644 --- a/PWGLF/TableProducer/Strangeness/CMakeLists.txt +++ b/PWGLF/TableProducer/Strangeness/CMakeLists.txt @@ -151,3 +151,8 @@ o2physics_add_dpl_workflow(sigma0builder SOURCES sigma0builder.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::MLCore COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(lambdajetpolarizationbuilder + SOURCES lambdaJetpolarizationbuilder.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) diff --git a/PWGLF/TableProducer/Strangeness/lambdaJetpolarizationbuilder.cxx b/PWGLF/TableProducer/Strangeness/lambdaJetpolarizationbuilder.cxx new file mode 100644 index 00000000000..b079721e181 --- /dev/null +++ b/PWGLF/TableProducer/Strangeness/lambdaJetpolarizationbuilder.cxx @@ -0,0 +1,623 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// + +/// \author Youpeng Su (yousu@cern.ch) + +#include +#include +#include +#include +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Common/DataModel/EventSelection.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" +#include "Common/DataModel/PIDResponse.h" +#include "Framework/O2DatabasePDGPlugin.h" +#include "PWGJE/Core/JetDerivedDataUtilities.h" +#include "PWGJE/DataModel/Jet.h" +#include +#include "Framework/ASoA.h" +#include "Framework/AnalysisDataModel.h" +#include +#include +#include +#include "PWGLF/DataModel/lambdaJetpolarization.h" + +using std::cout; +using std::endl; +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +struct myAnalysis { + Produces myTable; + Produces myTableJet; + Produces outputCollisions; + Produces outputCollisionsV0; + Produces myTableLeadingJet; + + HistogramRegistry registry{"registry"}; + Configurable v0cospa{"v0cospa", 0.995, "V0 CosPA"}; + Configurable dcanegtopv{"dcanegtopv", 0.05, "DCA Neg To PV"}; + Configurable dcapostopv{"dcapostopv", 0.05, "DCA Pos To PV"}; + SliceCache cache; + HistogramRegistry JEhistos{"JEhistos", {}, OutputObjHandlingPolicy::AnalysisObject}; + + Configurable cfgeventSelections{"cfgeventSelections", "sel8", "choose event selection"}; + Configurable cfgtrackSelections{"cfgtrackSelections", "globalTracks", "set track selections"}; + Configurable cfgDataHists{"cfgDataHists", true, "Enables DataHists"}; + Configurable trackSelections{"trackSelections", "globalTracks", "set track selections"}; + // Others configure + Configurable cDebugLevel{"cDebugLevel", 1, "Resolution of Debug"}; + Configurable cfgVtxCut{"cfgVtxCut", 10.0, "V_z cut selection"}; + Configurable cfgjetPtMin{"cfgjetPtMin", 0.0, "minimum jet pT cut"}; + Configurable cfgjetR{"cfgjetR", 0.4, "jet resolution parameter"}; + Configurable cfgtrkMinPt{"cfgtrkMinPt", 0.15, "set track min pT"}; + Configurable cfgtrkMaxEta{"cfgtrkMaxEta", 0.8, "set track max Eta"}; + Configurable cfgMaxDCArToPVcut{"cfgMaxDCArToPVcut", 0.5, "Track DCAr cut to PV Maximum"}; + Configurable cfgMaxDCAzToPVcut{"cfgMaxDCAzToPVcut", 2.0, "Track DCAz cut to PV Maximum"}; + Configurable cfgnFindableTPCClusters{"cfgnFindableTPCClusters", 50, "nFindable TPC Clusters"}; + Configurable cfgnTPCCrossedRows{"cfgnTPCCrossedRows", 70, "nCrossed TPC Rows"}; + Configurable cfgnRowsOverFindable{"cfgnRowsOverFindable", 1.2, "nRowsOverFindable TPC CLusters"}; + Configurable cfgnTPCChi2{"cfgnTPChi2", 4.0, "nTPC Chi2 per Cluster"}; + Configurable cfgnITSChi2{"cfgnITShi2", 36.0, "nITS Chi2 per Cluster"}; + Configurable cfgConnectedToPV{"cfgConnectedToPV", true, "PV contributor track selection"}; + Configurable cfgPrimaryTrack{"cfgPrimaryTrack", true, "Primary track selection"}; + Configurable cfgnTPCPID{"cfgnTPCPID", 4, "nTPC PID"}; + Configurable cfgnTOFPID{"cfgnTOFPID", 4, "nTOF PID"}; + // V0 track selection//////////////////////////////////////////////////////////////// + Configurable requireITS{"requireITS", false, "require ITS hit"}; + Configurable requireTOF{"requireTOF", false, "require TOF hit"}; + Configurable requireTPC{"requireTPC", true, "require TPC hit"}; + Configurable requirepassedSingleTrackSelection{"requirepassedSingleTrackSelection", false, "requirepassedSingleTrackSelection"}; + Configurable minITSnCls{"minITSnCls", 4.0f, "min number of ITS clusters"}; + Configurable minTPCnClsFound{"minTPCnClsFound", 80.0f, "min number of found TPC clusters"}; + Configurable minNCrossedRowsTPC{"minNCrossedRowsTPC", 80.0f, "min number of TPC crossed rows"}; + Configurable maxChi2TPC{"maxChi2TPC", 4.0f, "max chi2 per cluster TPC"}; + Configurable maxChi2ITS{"maxChi2ITS", 36.0f, "max chi2 per cluster ITS"}; + Configurable etaMin{"etaMin", -0.8f, "eta min track"}; + Configurable etaMax{"etaMax", +0.8f, "eta max track"}; + Configurable ptMin_V0_proton{"ptMin_V0_proton", 0.3f, "pt min of proton from V0"}; + Configurable ptMax_V0_proton{"ptMax_V0_proton", 10.0f, "pt max of proton from V0"}; + Configurable ptMin_V0_pion{"ptMin_V0_pion", 0.1f, "pt min of pion from V0"}; + Configurable ptMax_V0_pion{"ptMax_V0_pion", 1.5f, "pt max of pion from V0"}; + Configurable ptMin_K0_pion{"ptMin_K0_pion", 0.3f, "pt min of pion from K0"}; + Configurable ptMax_K0_pion{"ptMax_K0_pion", 10.0f, "pt max of pion from K0"}; + Configurable minimumV0Radius{"minimumV0Radius", 0.2f, "Minimum V0 Radius"}; + Configurable maximumV0Radius{"maximumV0Radius", 40.0f, "Maximum V0 Radius"}; + Configurable nsigmaTPCmin{"nsigmaTPCmin", -5.0f, "Minimum nsigma TPC"}; + Configurable nsigmaTPCmax{"nsigmaTPCmax", +5.0f, "Maximum nsigma TPC"}; + Configurable nsigmaTOFmin{"nsigmaTOFmin", -5.0f, "Minimum nsigma TOF"}; + Configurable nsigmaTOFmax{"nsigmaTOFmax", +5.0f, "Maximum nsigma TOF"}; + Configurable yMin{"yMin", -0.5f, "minimum y"}; + Configurable yMax{"yMax", +0.5f, "maximum y"}; + Configurable v0rejLambda{"v0rejLambda", 0.01, "V0 rej K0s"}; + Configurable CtauLambda{"ctauLambda", 30, "C tau Lambda (cm)"}; + // Event Selection///////////////////////////////// + Configurable cutzvertex{"cutzvertex", 10.0f, "Accepted z-vertex range (cm)"}; + Configurable sel8{"sel8", 0, "Apply sel8 event selection"}; + Configurable isTriggerTVX{"isTriggerTVX", 1, "TVX trigger"}; + Configurable iscutzvertex{"iscutzvertex", 1, "Accepted z-vertex range (cm)"}; + Configurable isNoTimeFrameBorder{"isNoTimeFrameBorder", 1, "TF border cut"}; + Configurable isNoITSROFrameBorder{"isNoITSROFrameBorder", 1, "ITS ROF border cut"}; + Configurable isVertexTOFmatched{"isVertexTOFmatched", 1, "Is Vertex TOF matched"}; + Configurable isGoodZvtxFT0vsPV{"isGoodZvtxFT0vsPV", 0, "isGoodZvtxFT0vsPV"}; + /////////////////////////V0 QA analysis/////////////////////////////// + Configurable dcav0dau{"dcav0dau", 1.0, "DCA V0 Daughters"}; + Configurable doArmenterosCut{"doArmenterosCut", 1, "do Armenteros Cut"}; + Configurable paramArmenterosCut{"paramArmenterosCut", 0.2, "parameter Armenteros Cut"}; + // CONFIG DONE + ///////////////////////////////////////// //INIT//////////////////////////////////////////////////////////////////// + // int eventSelection = -1; + int trackSelection = -1; + std::vector eventSelectionBits; + void init(o2::framework::InitContext&) + { + // HISTOGRAMS + const AxisSpec axisEta{30, -1.5, +1.5, "#eta"}; + const AxisSpec axisPhi{200, -1, +7, "#phi"}; + const AxisSpec axisPt{200, 0, +200, "#pt"}; + const AxisSpec MinvAxis = {500, 0.1, 1.25}; + const AxisSpec PtAxis = {200, 0, 20.0}; + const AxisSpec MultAxis = {100, 0, 100}; + const AxisSpec dRAxis = {100, 0, 100}; + + const AxisSpec axisPx{200, -10, 10, "#px"}; + const AxisSpec axisPy{200, -10, 10, "#py"}; + const AxisSpec axisPz{200, -10, 10, "#pz"}; + const AxisSpec massAxis{200, 0.9f, 1.2f, "mass"}; + const AxisSpec eventAxis{1000000, 0.5f, 1000000.5f, "event"}; + + if (cfgDataHists) { + + JEhistos.add("h_track_pt", "track pT;#it{p}_{T,track} (GeV/#it{c});entries", kTH1F, {{200, 0., 200.}}); + JEhistos.add("h_track_eta", "track #eta;#eta_{track};entries", kTH1F, {{100, -1.f, 1.f}}); + JEhistos.add("h_track_phi", "track #varphi;#varphi_{track};entries", kTH1F, {{80, -1.f, 7.f}}); + JEhistos.add("nJetsPerEvent", "nJetsPerEvent", kTH1F, {{10, 0.0, 10.0}}); + JEhistos.add("FJetaHistogram", "FJetaHistogram", kTH1F, {axisEta}); + JEhistos.add("FJphiHistogram", "FJphiHistogram", kTH1F, {axisPhi}); + JEhistos.add("FJptHistogram", "FJptHistogram", kTH1F, {axisPt}); + JEhistos.add("hDCArToPv", "DCArToPv", kTH1F, {{300, 0.0, 3.0}}); + JEhistos.add("hDCAzToPv", "DCAzToPv", kTH1F, {{300, 0.0, 3.0}}); + JEhistos.add("rawpT", "rawpT", kTH1F, {{1000, 0.0, 10.0}}); + JEhistos.add("rawDpT", "rawDpT", kTH2F, {{1000, 0.0, 10.0}, {300, -1.5, 1.5}}); + JEhistos.add("hIsPrim", "hIsPrim", kTH1F, {{2, -0.5, +1.5}}); + JEhistos.add("hIsGood", "hIsGood", kTH1F, {{2, -0.5, +1.5}}); + JEhistos.add("hIsPrimCont", "hIsPrimCont", kTH1F, {{2, -0.5, +1.5}}); + JEhistos.add("hFindableTPCClusters", "hFindableTPCClusters", kTH1F, {{200, 0, 200}}); + JEhistos.add("hFindableTPCRows", "hFindableTPCRows", kTH1F, {{200, 0, 200}}); + JEhistos.add("hClustersVsRows", "hClustersVsRows", kTH1F, {{200, 0, 2}}); + JEhistos.add("hTPCChi2", "hTPCChi2", kTH1F, {{200, 0, 100}}); + JEhistos.add("hITSChi2", "hITSChi2", kTH1F, {{200, 0, 100}}); + JEhistos.add("etaHistogram", "etaHistogram", kTH1F, {axisEta}); + JEhistos.add("phiHistogram", "phiHistogram", kTH1F, {axisPhi}); + JEhistos.add("ptHistogram", "ptHistogram", kTH1F, {axisPt}); + JEhistos.add("V0Counts", "V0Counts", kTH1F, {{10, 0, 10}}); + JEhistos.add("hUSS_1D", "hUSS_1D", kTH1F, {MinvAxis}); + JEhistos.add("hPt", "hPt", {HistType::kTH1F, {{100, 0.0f, 10.0f}}}); + JEhistos.add("hMassVsPtLambda", "hMassVsPtLambda", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {200, 1.016f, 1.216f}}}); + JEhistos.add("hMassVsPtAntiLambda", "hMassVsPtAntiLambda", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {200, 1.016f, 1.216f}}}); + JEhistos.add("hMassLambda", "hMassLambda", {HistType::kTH1F, {{200, 0.9f, 1.2f}}}); + JEhistos.add("hMassAntiLambda", "hMassAntiLambda", {HistType::kTH1F, {{200, 0.9f, 1.2f}}}); + JEhistos.add("V0Radius", "V0Radius", {HistType::kTH1D, {{100, 0.0f, 20.0f}}}); + JEhistos.add("CosPA", "CosPA", {HistType::kTH1F, {{100, 0.9f, 1.0f}}}); + JEhistos.add("V0DCANegToPV", "V0DCANegToPV", {HistType::kTH1F, {{100, -1.0f, 1.0f}}}); + JEhistos.add("V0DCAPosToPV", "V0DCAPosToPV", {HistType::kTH1F, {{100, -1.0f, 1.0f}}}); + JEhistos.add("V0DCAV0Daughters", "V0DCAV0Daughters", {HistType::kTH1F, {{55, 0.0f, 2.20f}}}); + JEhistos.add("TPCNSigmaPosPi", "TPCNSigmaPosPi", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); + JEhistos.add("TPCNSigmaNegPi", "TPCNSigmaNegPi", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); + JEhistos.add("TPCNSigmaPosPr", "TPCNSigmaPosPr", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); + JEhistos.add("TPCNSigmaNegPr", "TPCNSigmaNegPr", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); + JEhistos.add("hNEvents", "hNEvents", {HistType::kTH1I, {{10, 0.f, 10.f}}}); + JEhistos.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(1, "all"); + JEhistos.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(2, "sel8"); + JEhistos.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(3, "TVX"); + JEhistos.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(4, "zvertex"); + JEhistos.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(5, "TFBorder"); + JEhistos.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(6, "ITSROFBorder"); + JEhistos.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(7, "isTOFVertexMatched"); + JEhistos.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(8, "isGoodZvtxFT0vsPV"); + JEhistos.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(9, "Applied selected"); + registry.add("hNEventsJet", "hNEventsJet", {HistType::kTH1I, {{4, 0.f, 4.f}}}); + registry.get(HIST("hNEventsJet"))->GetXaxis()->SetBinLabel(1, "all"); + registry.get(HIST("hNEventsJet"))->GetXaxis()->SetBinLabel(2, "zvertex"); + registry.get(HIST("hNEventsJet"))->GetXaxis()->SetBinLabel(3, "JCollisionSel::sel8"); + JEhistos.add("v0Lambdapx", "v0Lambdapx", kTH1F, {axisPx}); + JEhistos.add("v0Lambdapy", "v0Lambdapy", kTH1F, {axisPy}); + JEhistos.add("v0Lambdapz", "v0Lambdapz", kTH1F, {axisPz}); + JEhistos.add("v0AntiLambdapx", "v0AntiLambdapx", kTH1F, {axisPx}); + JEhistos.add("v0AntiLambdapy", "v0AntiLambdapy", kTH1F, {axisPy}); + JEhistos.add("v0AntiLambdapz", "v0AntiLambdapz", kTH1F, {axisPz}); + JEhistos.add("jetpx", "jetpx", kTH1F, {axisPx}); + JEhistos.add("jetpy", "jetpy", kTH1F, {axisPy}); + JEhistos.add("jetpz", "jetpz", kTH1F, {axisPz}); + JEhistos.add("hV0Lambda", "V0Lambda", + {HistType::kTHnSparseF, {eventAxis, axisPx, axisPy, axisPz, massAxis, axisPx, axisPy, axisPz}}); + JEhistos.add("EventIndexselection", "EventIndexselection", {HistType::kTH1F, {{1000000, 0.5f, 1000000.5f}}}); + } + JEhistos.add("hKaonplusCounts", "hKaonplusCounts", {HistType::kTH1F, {{1, -0.5, 0.5f}}}); + JEhistos.add("hKaonminusCounts", "hKaonminusCounts", {HistType::kTH1F, {{1, -0.5, 0.5f}}}); + + eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast(cfgeventSelections)); + trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast(trackSelections)); + } // end of init + + double massPi = o2::constants::physics::MassPiMinus; + double massPr = o2::constants::physics::MassProton; + using DauTracks = soa::Join; + using EventCandidates = soa::Join; // , aod::CentFT0Ms, aod::CentFT0As, aod::CentFT0Cs + using TrackCandidates = soa::Join; + using JCollisions = soa::Join; + using V0Collisions = soa::Join; + + Filter jetCuts = aod::jet::pt > cfgjetPtMin&& aod::jet::r == nround(cfgjetR.node() * 100.0f); + template + bool TrackSelection(const TrackType track) + { + // basic track cuts + if (track.pt() < cfgtrkMinPt) + return false; + + if (std::abs(track.eta()) > cfgtrkMaxEta) + return false; + + if (std::abs(track.dcaXY()) > cfgMaxDCArToPVcut) + return false; + + if (std::abs(track.dcaZ()) > cfgMaxDCAzToPVcut) + return false; + + if (cfgPrimaryTrack && !track.isPrimaryTrack()) + return false; + + if (track.tpcNClsFindable() < cfgnFindableTPCClusters) + return false; + + if (track.tpcNClsCrossedRows() < cfgnTPCCrossedRows) + return false; + + if (track.tpcCrossedRowsOverFindableCls() > cfgnRowsOverFindable) + return false; + + if (track.tpcChi2NCl() > cfgnTPCChi2) + return false; + + if (track.itsChi2NCl() > cfgnITSChi2) + return false; + + if (cfgConnectedToPV && !track.isPVContributor()) + return false; + + return true; + }; + + template + bool trackPIDPion(const T& candidate) + { + bool tpcPIDPassed{false}, tofPIDPassed{false}; + if (std::abs(candidate.tpcNSigmaPi()) < cfgnTPCPID) + tpcPIDPassed = true; + + if (candidate.hasTOF()) { + if (std::abs(candidate.tofNSigmaPi()) < cfgnTOFPID) { + tofPIDPassed = true; + } + } else { + tofPIDPassed = true; + } + if (tpcPIDPassed && tofPIDPassed) { + return true; + } + return false; + } + + template + bool trackPIDProton(const T& candidate) + { + bool tpcPIDPassed{false}, tofPIDPassed{false}; + if (std::abs(candidate.tpcNSigmaPr()) < cfgnTPCPID) + tpcPIDPassed = true; + + if (candidate.hasTOF()) { + if (std::abs(candidate.tofNSigmaPr()) < cfgnTOFPID) { + tofPIDPassed = true; + } + } else { + tofPIDPassed = true; + } + if (tpcPIDPassed && tofPIDPassed) { + return true; + } + return false; + } + + // Single-Track Selection + template + bool passedSingleTrackSelection(const Track& track) + { + if (requireITS && (!track.hasITS())) + return false; + if (requireITS && track.itsNCls() < minITSnCls) + return false; + if (!track.hasTPC()) + return false; + if (track.tpcNClsFound() < minTPCnClsFound) + return false; + if (track.tpcNClsCrossedRows() < minNCrossedRowsTPC) + return false; + if (track.tpcChi2NCl() > maxChi2TPC) + return false; + if (track.eta() < etaMin || track.eta() > etaMax) + return false; + if (requireTOF && (!track.hasTOF())) + return false; + return true; + } + // Lambda Selections + template + bool passedLambdaSelection(const Lambda& v0, const TrackPos& ptrack, const TrackNeg& ntrack) + { + + if (ptrack.tpcNSigmaKa() > nsigmaTPCmin && ptrack.tpcNSigmaKa() < nsigmaTPCmax) { + JEhistos.fill(HIST("hKaonplusCounts"), 1); + } + + if (ntrack.tpcNSigmaKa() > nsigmaTPCmin && ntrack.tpcNSigmaKa() < nsigmaTPCmax) { + JEhistos.fill(HIST("hKaonminusCounts"), 1); + } + + // Single-Track Selections + if (requirepassedSingleTrackSelection && !passedSingleTrackSelection(ptrack)) + return false; + if (requirepassedSingleTrackSelection && !passedSingleTrackSelection(ntrack)) + return false; + + if (v0.v0radius() < minimumV0Radius || v0.v0cosPA() < v0cospa || + TMath::Abs(ptrack.eta()) > etaMax || + TMath::Abs(ntrack.eta()) > etaMax) { + return false; + } + if (TMath::Abs(v0.dcanegtopv()) < dcanegtopv) + return false; + if (TMath::Abs(v0.dcapostopv()) < dcapostopv) + return false; + if (v0.dcaV0daughters() > dcav0dau) + return false; + + // PID Selections (TPC) + if (requireTPC) { + if (ptrack.tpcNSigmaPr() < nsigmaTPCmin || ptrack.tpcNSigmaPr() > nsigmaTPCmax) + return false; + if (ntrack.tpcNSigmaPi() < nsigmaTPCmin || ntrack.tpcNSigmaPi() > nsigmaTPCmax) + return false; + } + + if (requireTOF) { + if (ptrack.tofNSigmaPr() < nsigmaTOFmin || ptrack.tofNSigmaPr() > nsigmaTOFmax) + return false; + if (ntrack.tofNSigmaPi() < nsigmaTOFmin || ntrack.tofNSigmaPi() > nsigmaTOFmax) + return false; + } + + TLorentzVector lorentzVect; + lorentzVect.SetXYZM(v0.px(), v0.py(), v0.pz(), 1.115683); + + if (lorentzVect.Rapidity() < yMin || lorentzVect.Rapidity() > yMax) { + return false; + } + + if (TMath::Abs(v0.mK0Short() - o2::constants::physics::MassK0Short) < v0rejLambda) { + return false; + } + if (TMath::Abs(v0.mLambda() - o2::constants::physics::MassLambda0) > 0.075) { + return false; + } + + return true; + } + // AntiLambda Selections + template + bool passedAntiLambdaSelection(const AntiLambda& v0, const TrackPos& ptrack, const TrackNeg& ntrack) + { + // Single-Track Selections + if (requirepassedSingleTrackSelection && !passedSingleTrackSelection(ptrack)) + return false; + if (requirepassedSingleTrackSelection && !passedSingleTrackSelection(ntrack)) + return false; + + if (v0.v0radius() < minimumV0Radius || v0.v0cosPA() < v0cospa || + TMath::Abs(ptrack.eta()) > etaMax || + TMath::Abs(ntrack.eta()) > etaMax) { + return false; + } + + if (TMath::Abs(v0.dcanegtopv()) < dcanegtopv) // + return false; + if (TMath::Abs(v0.dcapostopv()) < dcapostopv) // + return false; + if (v0.dcaV0daughters() > dcav0dau) // + return false; + // PID Selections (TOF) + if (requireTOF) { + if (ptrack.tofNSigmaPi() < nsigmaTOFmin || ptrack.tofNSigmaPi() > nsigmaTOFmax) + return false; + if (ntrack.tofNSigmaPr() < nsigmaTOFmin || ntrack.tofNSigmaPr() > nsigmaTOFmax) + return false; + } + if (requireTPC) { + if (ptrack.tpcNSigmaPi() < nsigmaTPCmin || ptrack.tpcNSigmaPi() > nsigmaTPCmax) + return false; + if (ntrack.tpcNSigmaPr() < nsigmaTPCmin || ntrack.tpcNSigmaPr() > nsigmaTPCmax) + return false; + } + + TLorentzVector lorentzVect; + lorentzVect.SetXYZM(v0.px(), v0.py(), v0.pz(), 1.115683); + if (lorentzVect.Rapidity() < yMin || lorentzVect.Rapidity() > yMax) { + return false; + } + + if (TMath::Abs(v0.mK0Short() - o2::constants::physics::MassK0Short) < v0rejLambda) { + return false; + } + if (TMath::Abs(v0.mAntiLambda() - o2::constants::physics::MassLambda0) > 0.075) { + return false; + } + return true; + } + ///////Event selection + template + bool AcceptEvent(TCollision const& collision) + { + if (sel8 && !collision.sel8()) { + return false; + } + JEhistos.fill(HIST("hNEvents"), 1.5); + + if (isTriggerTVX && !collision.selection_bit(aod::evsel::kIsTriggerTVX)) { + return false; + } + JEhistos.fill(HIST("hNEvents"), 2.5); + + if (iscutzvertex && TMath::Abs(collision.posZ()) > cutzvertex) { + return false; + } + JEhistos.fill(HIST("hNEvents"), 3.5); + + if (isNoTimeFrameBorder && !collision.selection_bit(aod::evsel::kNoTimeFrameBorder)) { + return false; + } + + JEhistos.fill(HIST("hNEvents"), 4.5); + + if (isNoITSROFrameBorder && !collision.selection_bit(aod::evsel::kNoITSROFrameBorder)) { + return false; + } + JEhistos.fill(HIST("hNEvents"), 5.5); + if (isVertexTOFmatched && !collision.selection_bit(aod::evsel::kIsVertexTOFmatched)) { + return false; + } + JEhistos.fill(HIST("hNEvents"), 6.5); + if (isGoodZvtxFT0vsPV && !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { + return false; + } + JEhistos.fill(HIST("hNEvents"), 7.5); + + return true; + } + // Filter preFilterV0 = nabs(aod::v0data::dcapostopv) > dcapostopv&&nabs(aod::v0data::dcanegtopv) > dcanegtopv&& aod::v0data::dcaV0daughters < dcaV0DaughtersMax; + + int nEventsJet = 0; + void processJetTracks(aod::JetCollision const& collision, soa::Filtered> const& chargedjets, soa::Join const& tracks, TrackCandidates const&) + { + + registry.fill(HIST("hNEventsJet"), 0.5); + if (fabs(collision.posZ()) > cfgVtxCut) { + + return; + } + registry.fill(HIST("hNEventsJet"), 1.5); + + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + return; + } + registry.fill(HIST("hNEventsJet"), 2.5); + outputCollisions(collision.posZ()); + + for (auto const& track : tracks) { + + auto originalTrack = track.track_as>(); + JEhistos.fill(HIST("hDCArToPv"), originalTrack.dcaXY()); + JEhistos.fill(HIST("hDCAzToPv"), originalTrack.dcaZ()); + JEhistos.fill(HIST("rawpT"), originalTrack.pt()); + JEhistos.fill(HIST("rawDpT"), track.pt(), track.pt() - originalTrack.pt()); + JEhistos.fill(HIST("hIsPrim"), originalTrack.isPrimaryTrack()); + JEhistos.fill(HIST("hIsGood"), originalTrack.isGlobalTrackWoDCA()); + JEhistos.fill(HIST("hIsPrimCont"), originalTrack.isPVContributor()); + JEhistos.fill(HIST("hFindableTPCClusters"), originalTrack.tpcNClsFindable()); + JEhistos.fill(HIST("hFindableTPCRows"), originalTrack.tpcNClsCrossedRows()); + JEhistos.fill(HIST("hClustersVsRows"), originalTrack.tpcCrossedRowsOverFindableCls()); + JEhistos.fill(HIST("hTPCChi2"), originalTrack.tpcChi2NCl()); + JEhistos.fill(HIST("hITSChi2"), originalTrack.itsChi2NCl()); + JEhistos.fill(HIST("h_track_pt"), track.pt()); + JEhistos.fill(HIST("h_track_eta"), track.eta()); + JEhistos.fill(HIST("h_track_phi"), track.phi()); + + if (track.pt() < cfgtrkMinPt && std::abs(track.eta()) > cfgtrkMaxEta) { + continue; + } + JEhistos.fill(HIST("ptHistogram"), track.pt()); + JEhistos.fill(HIST("etaHistogram"), track.eta()); + JEhistos.fill(HIST("phiHistogram"), track.phi()); + } + int nJets = 0; + int lastindex = 0; + int collisionId = 0; + float maxJetpx = 0; + float maxJetpy = 0; + float maxJetpz = 0; + float maxJetpT = 0; + float maxJetPt = -999; + nEventsJet++; + for (const auto& chargedjet : chargedjets) { + JEhistos.fill(HIST("FJetaHistogram"), chargedjet.eta()); + JEhistos.fill(HIST("FJphiHistogram"), chargedjet.phi()); + JEhistos.fill(HIST("FJptHistogram"), chargedjet.pt()); + + JEhistos.fill(HIST("jetpx"), chargedjet.px()); + JEhistos.fill(HIST("jetpy"), chargedjet.py()); + JEhistos.fill(HIST("jetpz"), chargedjet.pz()); + + myTableJet(outputCollisions.lastIndex(), chargedjet.collisionId(), chargedjet.px(), chargedjet.py(), chargedjet.pz(), chargedjet.pt()); + + nJets++; + if (chargedjet.pt() > maxJetPt) { + maxJetpx = chargedjet.px(); + maxJetpy = chargedjet.py(); + maxJetpz = chargedjet.pz(); + maxJetpT = chargedjet.pt(); + collisionId = chargedjet.collisionId(); + lastindex = outputCollisions.lastIndex(); + } + } + if (maxJetpT > 0) { + myTableLeadingJet(lastindex, collisionId, maxJetpx, maxJetpy, maxJetpz, maxJetpT); + } + JEhistos.fill(HIST("nJetsPerEvent"), nJets); + } + PROCESS_SWITCH(myAnalysis, processJetTracks, "process JE Framework", true); + int nEventsV0 = 0; + + void processV0(V0Collisions::iterator const& collision, aod::V0Datas const& V0s, TrackCandidates const&) + { + nEventsV0++; + JEhistos.fill(HIST("hNEvents"), 0.5); + if (!AcceptEvent(collision)) { + return; + } + JEhistos.fill(HIST("hNEvents"), 8.5); + int V0NumbersPerEvent = 0; + int V0LambdaNumbers = 0; + outputCollisionsV0(collision.posX()); + for (auto& v0 : V0s) { + float ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0; + float ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0Bar; + + const auto& pos = v0.posTrack_as(); + const auto& neg = v0.negTrack_as(); + V0NumbersPerEvent = V0NumbersPerEvent + 1; + if (passedLambdaSelection(v0, pos, neg) && ctauLambda < CtauLambda) { + JEhistos.fill(HIST("hPt"), v0.pt()); + JEhistos.fill(HIST("V0Radius"), v0.v0radius()); + JEhistos.fill(HIST("CosPA"), v0.v0cosPA()); + JEhistos.fill(HIST("V0DCANegToPV"), v0.dcanegtopv()); + JEhistos.fill(HIST("V0DCAPosToPV"), v0.dcapostopv()); + JEhistos.fill(HIST("V0DCAV0Daughters"), v0.dcaV0daughters()); + } + if (passedLambdaSelection(v0, pos, neg) && ctauAntiLambda < CtauLambda) { + + V0LambdaNumbers = V0LambdaNumbers + 1; + JEhistos.fill(HIST("hMassVsPtLambda"), v0.pt(), v0.mLambda()); + JEhistos.fill(HIST("hMassLambda"), v0.mLambda()); + JEhistos.fill(HIST("TPCNSigmaPosPr"), pos.tpcNSigmaPr()); + JEhistos.fill(HIST("TPCNSigmaNegPi"), neg.tpcNSigmaPi()); + + JEhistos.fill(HIST("v0Lambdapx"), v0.px()); + JEhistos.fill(HIST("v0Lambdapy"), v0.py()); + JEhistos.fill(HIST("v0Lambdapz"), v0.pz()); + myTable(outputCollisionsV0.lastIndex(), v0.collisionId(), v0.px(), v0.py(), v0.pz(), v0.pt(), v0.mLambda(), pos.px(), pos.py(), pos.pz()); + JEhistos.fill(HIST("hV0Lambda"), nEventsV0, v0.px(), v0.py(), v0.pz(), v0.mLambda(), pos.px(), pos.py(), pos.pz()); + } + + if (passedAntiLambdaSelection(v0, pos, neg)) { + + JEhistos.fill(HIST("hMassVsPtAntiLambda"), v0.pt(), v0.mAntiLambda()); + JEhistos.fill(HIST("hMassAntiLambda"), v0.mAntiLambda()); + JEhistos.fill(HIST("TPCNSigmaPosPi"), pos.tpcNSigmaPi()); + JEhistos.fill(HIST("TPCNSigmaNegPr"), neg.tpcNSigmaPr()); + + JEhistos.fill(HIST("v0AntiLambdapx"), v0.px()); + JEhistos.fill(HIST("v0AntiLambdapy"), v0.py()); + JEhistos.fill(HIST("v0AntiLambdapz"), v0.pz()); + } + } + JEhistos.fill(HIST("V0Counts"), V0NumbersPerEvent); + } + PROCESS_SWITCH(myAnalysis, processV0, "processV0", true); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc), + }; +} diff --git a/PWGLF/Tasks/Strangeness/CMakeLists.txt b/PWGLF/Tasks/Strangeness/CMakeLists.txt index e0b0fd7cde0..22a46cb7318 100644 --- a/PWGLF/Tasks/Strangeness/CMakeLists.txt +++ b/PWGLF/Tasks/Strangeness/CMakeLists.txt @@ -135,3 +135,8 @@ o2physics_add_dpl_workflow(lambdalambda SOURCES lambdalambda.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(lambdajetpolarization + SOURCES lambdaJetpolarization.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + COMPONENT_NAME Analysis) diff --git a/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx b/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx new file mode 100644 index 00000000000..6927a9df7ce --- /dev/null +++ b/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx @@ -0,0 +1,248 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// + +/// \author Youpeng Su (yousu@cern.ch) +#include +#include +#include +#include +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Common/DataModel/EventSelection.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" +#include "Common/DataModel/PIDResponse.h" +#include "Framework/O2DatabasePDGPlugin.h" +#include "PWGJE/Core/JetDerivedDataUtilities.h" +#include "PWGJE/DataModel/Jet.h" +#include +#include "Framework/ASoA.h" +#include "Framework/AnalysisDataModel.h" +#include +#include +#include +#include "PWGLF/DataModel/lambdaJetpolarization.h" +using std::cout; +using std::endl; +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +struct LfMyV0s { + HistogramRegistry registry{"registry"}; + void init(InitContext const&) + { + const AxisSpec axisPx{100, -10, 10, "#px (GeV/c)"}; + const AxisSpec axisPy{100, -10, 10, "#py (GeV/c)"}; + const AxisSpec axisPz{100, -10, 10, "#pz (GeV/c)"}; + const AxisSpec axisPT{200, 0, 50, "#p_{T} (GeV/c)"}; + const AxisSpec axisPhi{100, -3.14, 3.14, "#Phi"}; + + registry.add("hMassLambda", "hMassLambda", {HistType::kTH1F, {{200, 0.9f, 1.2f}}}); + registry.add("V0pTInLab", "V0pTInLab", kTH1F, {axisPT}); + registry.add("hMassVsPtLambda", "hMassVsPtLambda", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {200, 1.016f, 1.216f}}}); + + registry.add("V0pxInLab", "V0pxInLab", kTH1F, {axisPx}); + registry.add("V0pyInLab", "V0pyInLab", kTH1F, {axisPy}); + registry.add("V0pzInLab", "V0pzInLab", kTH1F, {axisPz}); + + registry.add("V0pxInRest_frame", "V0pxInRest_frame", kTH1F, {axisPx}); + registry.add("V0pyInRest_frame", "V0pyInRest_frame", kTH1F, {axisPy}); + registry.add("V0pzInRest_frame", "V0pzInRest_frame", kTH1F, {axisPz}); + + registry.add("JetpxInLab", "JetpxInLab", kTH1F, {axisPx}); + registry.add("JetpyInLab", "JetpyInLab", kTH1F, {axisPy}); + registry.add("JetpzInLab", "JetpzInLab", kTH1F, {axisPz}); + registry.add("JetpTInLab", "JetpTInLab", kTH1F, {axisPT}); + + registry.add("LeadingJetpx", "LeadingJetpx", kTH1F, {axisPx}); + registry.add("LeadingJetpy", "LeadingJetpy", kTH1F, {axisPy}); + registry.add("LeadingJetpz", "LeadingJetpz", kTH1F, {axisPz}); + registry.add("LeadingJetpT", "LeadingJetpT", kTH1F, {axisPT}); + + registry.add("V0protonpxInLab", "V0protonpxInLab", kTH1F, {axisPx}); + registry.add("V0protonpyInLab", "V0protonpyInLab", kTH1F, {axisPy}); + registry.add("V0protonpzInLab", "V0protonpzInLab", kTH1F, {axisPz}); + registry.add("V0protonphiInLab", "V0protonphiInLab", kTH1F, {axisPhi}); + + registry.add("V0protonpxInRest_frame", "V0protonpxInRest_frame", kTH1F, {axisPx}); + registry.add("V0protonpyInRest_frame", "V0protonpyInRest_frame", kTH1F, {axisPy}); + registry.add("V0protonpzInRest_frame", "V0protonpzInRest_frame", kTH1F, {axisPz}); + registry.add("V0protonphiInRest_frame", "V0protonphiInRest_frame", kTH1F, {axisPhi}); + + registry.add("V0protonpxInJetV0frame", "V0protonpxInJetV0frame", kTH1F, {axisPx}); + registry.add("V0protonpyInJetV0frame", "V0protonpyInJetV0frame", kTH1F, {axisPy}); + registry.add("V0protonpzInJetV0frame", "V0protonpzInJetV0frame", kTH1F, {axisPz}); + registry.add("V0protonphiInJetV0frame", "V0protonphiInJetV0frame", kTH1F, {axisPhi}); + + registry.add("hLambdamassandSinPhi", "hLambdamassandSinPhi", kTH2F, {{200, 0.9, 1.2}, {200, -1, 1}}); + registry.add("profile", "Invariant Mass vs sin(phi)", {HistType::kTProfile, {{200, 0.9, 1.2}}}); + } + double massPr = o2::constants::physics::MassProton; + double massLambda = o2::constants::physics::MassLambda; + + TMatrixD LorentzTransInV0frame(double ELambda, double Lambdapx, double Lambdapy, double Lambdapz) + { + double PLambda = sqrt(Lambdapx * Lambdapx + Lambdapy * Lambdapy + Lambdapz * Lambdapz); + double LambdaMass = sqrt(ELambda * ELambda - PLambda * PLambda); + double Alpha = 1 / (LambdaMass * (ELambda + LambdaMass)); + TMatrixD matrixLabToLambda(4, 4); + matrixLabToLambda(0, 0) = ELambda / LambdaMass; + matrixLabToLambda(0, 1) = -Lambdapx / LambdaMass; + matrixLabToLambda(0, 2) = -Lambdapy / LambdaMass; + matrixLabToLambda(0, 3) = -Lambdapz / LambdaMass; + matrixLabToLambda(1, 0) = -Lambdapx / LambdaMass; + matrixLabToLambda(1, 1) = 1 + Alpha * Lambdapx * Lambdapx; + matrixLabToLambda(1, 2) = Alpha * Lambdapx * Lambdapy; + matrixLabToLambda(1, 3) = Alpha * Lambdapx * Lambdapz; + matrixLabToLambda(2, 0) = -Lambdapy / LambdaMass; + matrixLabToLambda(2, 1) = Alpha * Lambdapy * Lambdapx; + matrixLabToLambda(2, 2) = 1 + Alpha * Lambdapy * Lambdapy; + matrixLabToLambda(2, 3) = Alpha * Lambdapy * Lambdapz; + matrixLabToLambda(3, 0) = -Lambdapz / LambdaMass; + matrixLabToLambda(3, 1) = Alpha * Lambdapz * Lambdapx; + matrixLabToLambda(3, 2) = Alpha * Lambdapz * Lambdapy; + matrixLabToLambda(3, 3) = 1 + Alpha * Lambdapz * Lambdapz; + return matrixLabToLambda; + } + TMatrixD MyTMatrixTranslationToJet(double Jetpx, double Jetpy, double Jetpz, double Lambdapx, double Lambdapy, double Lambdapz) + { + TVector3 UnitX(1.0, 0.0, 0.0); + TVector3 UnitY(0.0, 1.0, 0.0); + TVector3 UnitZ(0.0, 0.0, 1.0); + TVector3 JetP(Jetpx, Jetpy, Jetpz); + TVector3 V0LambdaP(Lambdapx, Lambdapy, Lambdapz); + TVector3 JetCrossV0 = (JetP.Cross(V0LambdaP)); + TVector3 YinJet = (JetCrossV0).Cross(JetP); + TVector3 UnitXInJet = YinJet.Unit(); + TVector3 UnitYInJet = JetCrossV0.Unit(); + TVector3 UnitZInJet = JetP.Unit(); + + TMatrixD matrixLabToJet(4, 4); + matrixLabToJet(0, 0) = 1; + matrixLabToJet(0, 1) = 0.0; + matrixLabToJet(0, 2) = 0.0; + matrixLabToJet(0, 3) = 0.0; + matrixLabToJet(1, 0) = 0.0; + matrixLabToJet(1, 1) = UnitXInJet * UnitX; + matrixLabToJet(1, 2) = UnitXInJet * UnitY; + matrixLabToJet(1, 3) = UnitXInJet * UnitZ; + matrixLabToJet(2, 0) = 0.0; + matrixLabToJet(2, 1) = UnitYInJet * UnitX; + matrixLabToJet(2, 2) = UnitYInJet * UnitY; + matrixLabToJet(2, 3) = UnitYInJet * UnitZ; + matrixLabToJet(3, 0) = 0.0; + matrixLabToJet(3, 1) = UnitZInJet * UnitX; + matrixLabToJet(3, 2) = UnitZInJet * UnitY; + matrixLabToJet(3, 3) = UnitZInJet * UnitZ; + return matrixLabToJet; + } + // aod::MyCollision const& collision + void processJetV0Analysis(aod::MyTable const& myv0s, aod::MyTableJet const& myJets) + { + for (auto& candidate : myv0s) { + registry.fill(HIST("hMassLambda"), candidate.v0Lambdamass()); + registry.fill(HIST("V0pTInLab"), candidate.v0pt()); + registry.fill(HIST("hMassVsPtLambda"), candidate.v0pt(), candidate.v0Lambdamass()); + registry.fill(HIST("V0pxInLab"), candidate.v0px()); + registry.fill(HIST("V0pyInLab"), candidate.v0py()); + registry.fill(HIST("V0pzInLab"), candidate.v0pz()); + registry.fill(HIST("V0protonpxInLab"), candidate.v0protonpx()); + registry.fill(HIST("V0protonpyInLab"), candidate.v0protonpy()); + registry.fill(HIST("V0protonpzInLab"), candidate.v0protonpz()); + + double protonsinPhiInLab = candidate.v0protonpy() / sqrt(candidate.v0protonpx() * candidate.v0protonpx() + candidate.v0protonpy() * candidate.v0protonpy()); + registry.fill(HIST("V0protonphiInLab"), protonsinPhiInLab); + + double PLambda = sqrt(candidate.v0px() * candidate.v0px() + candidate.v0py() * candidate.v0py() + candidate.v0pz() * candidate.v0pz()); + double ELambda = sqrt(candidate.v0Lambdamass() * candidate.v0Lambdamass() + PLambda * PLambda); + TMatrixD pLabV0(4, 1); + pLabV0(0, 0) = ELambda; + pLabV0(1, 0) = candidate.v0px(); + pLabV0(2, 0) = candidate.v0py(); + pLabV0(3, 0) = candidate.v0pz(); + TMatrixD V0InV0(4, 1); + V0InV0 = LorentzTransInV0frame(ELambda, candidate.v0px(), candidate.v0py(), candidate.v0pz()) * pLabV0; + registry.fill(HIST("V0pxInRest_frame"), V0InV0(1, 0)); + registry.fill(HIST("V0pyInRest_frame"), V0InV0(2, 0)); + registry.fill(HIST("V0pzInRest_frame"), V0InV0(3, 0)); + } + for (auto& candidate : myv0s) { + + double PLambda = sqrt(candidate.v0px() * candidate.v0px() + candidate.v0py() * candidate.v0py() + candidate.v0pz() * candidate.v0pz()); + double ELambda = sqrt(candidate.v0Lambdamass() * candidate.v0Lambdamass() + PLambda * PLambda); + TMatrixD pLabproton(4, 1); + double protonE = sqrt(massPr * massPr + candidate.v0protonpx() * candidate.v0protonpx() + candidate.v0protonpy() * candidate.v0protonpy() + candidate.v0protonpz() * candidate.v0protonpz()); + pLabproton(0, 0) = protonE; + pLabproton(1, 0) = candidate.v0protonpx(); + pLabproton(2, 0) = candidate.v0protonpy(); + pLabproton(3, 0) = candidate.v0protonpz(); + TMatrixD protonInV0(4, 1); + protonInV0 = LorentzTransInV0frame(ELambda, candidate.v0px(), candidate.v0py(), candidate.v0pz()) * pLabproton; + registry.fill(HIST("V0protonpxInRest_frame"), protonInV0(1, 0)); + registry.fill(HIST("V0protonpyInRest_frame"), protonInV0(2, 0)); + registry.fill(HIST("V0protonpzInRest_frame"), protonInV0(3, 0)); + double protonsinPhiInV0frame = protonInV0(2, 0) / sqrt(protonInV0(1, 0) * protonInV0(1, 0) + protonInV0(2, 0) * protonInV0(2, 0)); + registry.fill(HIST("V0protonphiInRest_frame"), protonsinPhiInV0frame); + } + + for (auto& Jet : myJets) { + registry.fill(HIST("JetpxInLab"), Jet.jetpx()); + registry.fill(HIST("JetpyInLab"), Jet.jetpy()); + registry.fill(HIST("JetpzInLab"), Jet.jetpz()); + registry.fill(HIST("JetpTInLab"), Jet.jetpt()); + } + } + + PROCESS_SWITCH(LfMyV0s, processJetV0Analysis, "processJetV0Analysis", true); + // aod::MyTableJet + // aod::MyCollision const& collision, + void processLeadingJetV0Analysis(aod::MyTable const& myv0s, aod::MyTableLeadingJet const& myleadingJets) + { + for (auto& candidate : myv0s) { + for (auto& LeadingJet : myleadingJets) { + if (candidate.mycollisionv0() == LeadingJet.mycollisionleadingjet()) { + double PLambda = sqrt(candidate.v0px() * candidate.v0px() + candidate.v0py() * candidate.v0py() + candidate.v0pz() * candidate.v0pz()); + double ELambda = sqrt(candidate.v0Lambdamass() * candidate.v0Lambdamass() + PLambda * PLambda); + TMatrixD pLabproton(4, 1); + double protonE = sqrt(massPr * massPr + candidate.v0protonpx() * candidate.v0protonpx() + candidate.v0protonpy() * candidate.v0protonpy() + candidate.v0protonpz() * candidate.v0protonpz()); + pLabproton(0, 0) = protonE; + pLabproton(1, 0) = candidate.v0protonpx(); + pLabproton(2, 0) = candidate.v0protonpy(); + pLabproton(3, 0) = candidate.v0protonpz(); + TMatrixD protonInJetV0(4, 1); + protonInJetV0 = LorentzTransInV0frame(ELambda, candidate.v0px(), candidate.v0py(), candidate.v0pz()) * MyTMatrixTranslationToJet(LeadingJet.leadingjetpx(), LeadingJet.leadingjetpy(), LeadingJet.leadingjetpz(), candidate.v0px(), candidate.v0py(), candidate.v0pz()) * pLabproton; + registry.fill(HIST("V0protonpxInJetV0frame"), protonInJetV0(1, 0)); + registry.fill(HIST("V0protonpyInJetV0frame"), protonInJetV0(2, 0)); + registry.fill(HIST("V0protonpzInJetV0frame"), protonInJetV0(3, 0)); + double protonsinPhiInJetV0frame = protonInJetV0(2, 0) / sqrt(protonInJetV0(1, 0) * protonInJetV0(1, 0) + protonInJetV0(2, 0) * protonInJetV0(2, 0)); + registry.fill(HIST("V0protonphiInJetV0frame"), protonsinPhiInJetV0frame); + registry.fill(HIST("hLambdamassandSinPhi"), candidate.v0Lambdamass(), protonsinPhiInJetV0frame); + registry.fill(HIST("profile"), candidate.v0Lambdamass(), protonsinPhiInJetV0frame); + } + } + } + for (auto& LeadingJet : myleadingJets) { + registry.fill(HIST("LeadingJetpx"), LeadingJet.leadingjetpx()); + registry.fill(HIST("LeadingJetpy"), LeadingJet.leadingjetpy()); + registry.fill(HIST("LeadingJetpz"), LeadingJet.leadingjetpz()); + registry.fill(HIST("LeadingJetpT"), LeadingJet.leadingjetpt()); + } + } + PROCESS_SWITCH(LfMyV0s, processLeadingJetV0Analysis, "processLeadingJetV0Analysis", true); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc), + }; +} From 341f18190963f8b4724c1f7851ee8632e5253e39 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Fri, 28 Feb 2025 20:04:19 +0900 Subject: [PATCH 0467/1650] [PWGEM/Dilepton] add collision cov. matrix and matlut (#10242) --- .../TableProducer/skimmerPrimaryElectron.cxx | 127 +++++++++++++----- 1 file changed, 96 insertions(+), 31 deletions(-) diff --git a/PWGEM/Dilepton/TableProducer/skimmerPrimaryElectron.cxx b/PWGEM/Dilepton/TableProducer/skimmerPrimaryElectron.cxx index 48b47e44f6b..28f523db1cb 100644 --- a/PWGEM/Dilepton/TableProducer/skimmerPrimaryElectron.cxx +++ b/PWGEM/Dilepton/TableProducer/skimmerPrimaryElectron.cxx @@ -25,6 +25,7 @@ #include "DetectorsBase/GeometryManager.h" #include "DataFormatsParameters/GRPObject.h" #include "DataFormatsParameters/GRPMagField.h" +#include "DataFormatsCalibration/MeanVertexObject.h" #include "CCDB/BasicCCDBManager.h" #include "Common/Core/trackUtilities.h" #include "CommonConstants/PhysicsConstants.h" @@ -62,6 +63,8 @@ struct skimmerPrimaryElectron { Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; + Configurable mVtxPath{"mVtxPath", "GLO/Calib/MeanVertex", "Path of the mean vertex file"}; Configurable skipGRPOquery{"skipGRPOquery", true, "skip grpo query"}; // Operation and minimisation criteria @@ -97,7 +100,11 @@ struct skimmerPrimaryElectron { int mRunNumber; float d_bz; Service ccdb; - o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; + // o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; + o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT; + o2::dataformats::VertexBase mVtx; + const o2::dataformats::MeanVertexObject* mMeanVtx = nullptr; + o2::base::MatLayerCylSet* lut = nullptr; void init(InitContext&) { @@ -154,6 +161,14 @@ struct skimmerPrimaryElectron { return; } + // load matLUT for this timestamp + if (!lut) { + LOG(info) << "Loading material look-up table for timestamp: " << bc.timestamp(); + lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->getForTimeStamp(lutPath, bc.timestamp())); + } else { + LOG(info) << "Material look-up table already in place. Not reloading."; + } + // In case override, don't proceed, please - no CCDB access required if (d_bz_input > -990) { d_bz = d_bz_input; @@ -162,6 +177,8 @@ struct skimmerPrimaryElectron { grpmag.setL3Current(30000.f / (d_bz / 5.0f)); } o2::base::Propagator::initFieldFromGRP(&grpmag); + o2::base::Propagator::Instance()->setMatLUT(lut); + mMeanVtx = ccdb->getForTimeStamp(mVtxPath, bc.timestamp()); mRunNumber = bc.runNumber(); return; } @@ -169,10 +186,13 @@ struct skimmerPrimaryElectron { auto run3grp_timestamp = bc.timestamp(); o2::parameters::GRPObject* grpo = 0x0; o2::parameters::GRPMagField* grpmag = 0x0; - if (!skipGRPOquery) + if (!skipGRPOquery) { grpo = ccdb->getForTimeStamp(grpPath, run3grp_timestamp); + } if (grpo) { o2::base::Propagator::initFieldFromGRP(grpo); + o2::base::Propagator::Instance()->setMatLUT(lut); + mMeanVtx = ccdb->getForTimeStamp(mVtxPath, bc.timestamp()); // Fetch magnetic field from ccdb for current collision d_bz = grpo->getNominalL3Field(); LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; @@ -182,6 +202,9 @@ struct skimmerPrimaryElectron { LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for timestamp " << run3grp_timestamp; } o2::base::Propagator::initFieldFromGRP(grpmag); + o2::base::Propagator::Instance()->setMatLUT(lut); + mMeanVtx = ccdb->getForTimeStamp(mVtxPath, bc.timestamp()); + // Fetch magnetic field from ccdb for current collision d_bz = std::lround(5.f * grpmag->getL3Current() / 30000.f); LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; @@ -240,14 +263,17 @@ struct skimmerPrimaryElectron { return false; } - gpu::gpustd::array dcaInfo; + o2::dataformats::DCA mDcaInfoCov; + mDcaInfoCov.set(999, 999, 999, 999, 999); auto track_par_cov_recalc = getTrackParCov(track); track_par_cov_recalc.setPID(o2::track::PID::Electron); - // std::array pVec_recalc = {0, 0, 0}; // px, py, pz - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, track_par_cov_recalc, 2.f, matCorr, &dcaInfo); - // getPxPyPz(track_par_cov_recalc, pVec_recalc); - float dcaXY = dcaInfo[0]; - float dcaZ = dcaInfo[1]; + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc, 2.f, matCorr, &mDcaInfoCov); + float dcaXY = mDcaInfoCov.getY(); + float dcaZ = mDcaInfoCov.getZ(); + + // LOGF(info, "track_par_cov_recalc.getSigmaY2() = %.16f, mDcaInfoCov.getSigmaY2() = %.16f, track_par_cov_recalc.getSigmaZ2() = %.16f, mDcaInfoCov.getSigmaZ2() = %.16f, track_par_cov_recalc.getSigmaZY() = %.16f, mDcaInfoCov.getSigmaYZ() = %.16f", track_par_cov_recalc.getSigmaY2(), mDcaInfoCov.getSigmaY2(), track_par_cov_recalc.getSigmaZ2(), mDcaInfoCov.getSigmaZ2(), track_par_cov_recalc.getSigmaZY(), mDcaInfoCov.getSigmaYZ()); if (std::fabs(dcaXY) > dca_xy_max || std::fabs(dcaZ) > dca_z_max) { return false; @@ -312,14 +338,15 @@ struct skimmerPrimaryElectron { void fillTrackTable(TCollision const& collision, TTrack const& track) { if (std::find(stored_trackIds.begin(), stored_trackIds.end(), std::pair{collision.globalIndex(), track.globalIndex()}) == stored_trackIds.end()) { - gpu::gpustd::array dcaInfo; + o2::dataformats::DCA mDcaInfoCov; + mDcaInfoCov.set(999, 999, 999, 999, 999); auto track_par_cov_recalc = getTrackParCov(track); track_par_cov_recalc.setPID(o2::track::PID::Electron); - // std::array pVec_recalc = {0, 0, 0}; // px, py, pz - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, track_par_cov_recalc, 2.f, matCorr, &dcaInfo); - // getPxPyPz(track_par_cov_recalc, pVec_recalc); - float dcaXY = dcaInfo[0]; - float dcaZ = dcaInfo[1]; + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc, 2.f, matCorr, &mDcaInfoCov); + float dcaXY = mDcaInfoCov.getY(); + float dcaZ = mDcaInfoCov.getZ(); float pt_recalc = track_par_cov_recalc.getPt(); float eta_recalc = track_par_cov_recalc.getEta(); @@ -620,6 +647,8 @@ struct prefilterPrimaryElectron { Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; + Configurable mVtxPath{"mVtxPath", "GLO/Calib/MeanVertex", "Path of the mean vertex file"}; Configurable skipGRPOquery{"skipGRPOquery", true, "skip grpo query"}; // Operation and minimisation criteria @@ -649,7 +678,11 @@ struct prefilterPrimaryElectron { int mRunNumber; float d_bz; Service ccdb; - o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; + // o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; + o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT; + o2::dataformats::VertexBase mVtx; + const o2::dataformats::MeanVertexObject* mMeanVtx = nullptr; + o2::base::MatLayerCylSet* lut = nullptr; void init(InitContext&) { @@ -684,6 +717,14 @@ struct prefilterPrimaryElectron { return; } + // load matLUT for this timestamp + if (!lut) { + LOG(info) << "Loading material look-up table for timestamp: " << bc.timestamp(); + lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->getForTimeStamp(lutPath, bc.timestamp())); + } else { + LOG(info) << "Material look-up table already in place. Not reloading."; + } + // In case override, don't proceed, please - no CCDB access required if (d_bz_input > -990) { d_bz = d_bz_input; @@ -692,6 +733,8 @@ struct prefilterPrimaryElectron { grpmag.setL3Current(30000.f / (d_bz / 5.0f)); } o2::base::Propagator::initFieldFromGRP(&grpmag); + o2::base::Propagator::Instance()->setMatLUT(lut); + mMeanVtx = ccdb->getForTimeStamp(mVtxPath, bc.timestamp()); mRunNumber = bc.runNumber(); return; } @@ -703,6 +746,8 @@ struct prefilterPrimaryElectron { grpo = ccdb->getForTimeStamp(grpPath, run3grp_timestamp); if (grpo) { o2::base::Propagator::initFieldFromGRP(grpo); + o2::base::Propagator::Instance()->setMatLUT(lut); + mMeanVtx = ccdb->getForTimeStamp(mVtxPath, bc.timestamp()); // Fetch magnetic field from ccdb for current collision d_bz = grpo->getNominalL3Field(); LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; @@ -712,6 +757,8 @@ struct prefilterPrimaryElectron { LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for timestamp " << run3grp_timestamp; } o2::base::Propagator::initFieldFromGRP(grpmag); + o2::base::Propagator::Instance()->setMatLUT(lut); + mMeanVtx = ccdb->getForTimeStamp(mVtxPath, bc.timestamp()); // Fetch magnetic field from ccdb for current collision d_bz = std::lround(5.f * grpmag->getL3Current() / 30000.f); LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; @@ -759,14 +806,17 @@ struct prefilterPrimaryElectron { return false; } - gpu::gpustd::array dcaInfo; + o2::dataformats::DCA mDcaInfoCov; + mDcaInfoCov.set(999, 999, 999, 999, 999); auto track_par_cov_recalc = getTrackParCov(track); track_par_cov_recalc.setPID(o2::track::PID::Electron); - // std::array pVec_recalc = {0, 0, 0}; // px, py, pz - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, track_par_cov_recalc, 2.f, matCorr, &dcaInfo); - // getPxPyPz(track_par_cov_recalc, pVec_recalc); + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc, 2.f, matCorr, &mDcaInfoCov); + float dcaXY = mDcaInfoCov.getY(); + float dcaZ = mDcaInfoCov.getZ(); - if (std::fabs(dcaInfo[0]) > max_dcaxy || std::fabs(dcaInfo[1]) > max_dcaz) { + if (std::fabs(dcaXY) > max_dcaxy || std::fabs(dcaZ) > max_dcaz) { return false; } @@ -781,12 +831,15 @@ struct prefilterPrimaryElectron { bool reconstructPC(TCollision const& collision, TTrack1 const& ele, TTrack2 const& pos) { float mee = 0, phiv = 0; - gpu::gpustd::array dcaInfo; + o2::dataformats::DCA mDcaInfoCov; + mDcaInfoCov.set(999, 999, 999, 999, 999); std::array pVec_recalc = {0, 0, 0}; // px, py, pz + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); if constexpr (loose_track_sign > 0) { // positive track is loose track auto track_par_cov_recalc = getTrackParCov(pos); - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, track_par_cov_recalc, 2.f, matCorr, &dcaInfo); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc, 2.f, matCorr, &mDcaInfoCov); getPxPyPz(track_par_cov_recalc, pVec_recalc); ROOT::Math::PtEtaPhiMVector v1(ele.pt(), ele.eta(), ele.phi(), o2::constants::physics::MassElectron); @@ -796,7 +849,7 @@ struct prefilterPrimaryElectron { phiv = o2::aod::pwgem::dilepton::utils::pairutil::getPhivPair(pVec_recalc[0], pVec_recalc[1], pVec_recalc[2], ele.px(), ele.py(), ele.pz(), pos.sign(), ele.sign(), d_bz); } else { auto track_par_cov_recalc = getTrackParCov(ele); - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, track_par_cov_recalc, 2.f, matCorr, &dcaInfo); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc, 2.f, matCorr, &mDcaInfoCov); getPxPyPz(track_par_cov_recalc, pVec_recalc); ROOT::Math::PtEtaPhiMVector v1(track_par_cov_recalc.getPt(), track_par_cov_recalc.getEta(), track_par_cov_recalc.getPhi(), o2::constants::physics::MassElectron); @@ -861,11 +914,14 @@ struct prefilterPrimaryElectron { if (!checkTrack(collision, ele)) { continue; } - gpu::gpustd::array dcaInfo; + o2::dataformats::DCA mDcaInfoCov; + mDcaInfoCov.set(999, 999, 999, 999, 999); std::array pVec_recalc = {0, 0, 0}; // px, py, pz auto track_par_cov_recalc = getTrackParCov(ele); track_par_cov_recalc.setPID(o2::track::PID::Electron); - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, track_par_cov_recalc, 2.f, matCorr, &dcaInfo); + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc, 2.f, matCorr, &mDcaInfoCov); getPxPyPz(track_par_cov_recalc, pVec_recalc); for (auto& empos : positrons_per_coll) { @@ -899,11 +955,14 @@ struct prefilterPrimaryElectron { if (!checkTrack(collision, pos)) { // track cut is applied to loose sample continue; } - gpu::gpustd::array dcaInfo; + o2::dataformats::DCA mDcaInfoCov; + mDcaInfoCov.set(999, 999, 999, 999, 999); std::array pVec_recalc = {0, 0, 0}; // px, py, pz auto track_par_cov_recalc = getTrackParCov(pos); track_par_cov_recalc.setPID(o2::track::PID::Electron); - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, track_par_cov_recalc, 2.f, matCorr, &dcaInfo); + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc, 2.f, matCorr, &mDcaInfoCov); getPxPyPz(track_par_cov_recalc, pVec_recalc); for (auto& emele : electrons_per_coll) { if (emele.trackId() == pos.globalIndex()) { @@ -935,11 +994,14 @@ struct prefilterPrimaryElectron { if (!checkTrack(collision, pos)) { // track cut is applied to loose sample continue; } - gpu::gpustd::array dcaInfo; + o2::dataformats::DCA mDcaInfoCov; + mDcaInfoCov.set(999, 999, 999, 999, 999); std::array pVec_recalc = {0, 0, 0}; // px, py, pz auto track_par_cov_recalc = getTrackParCov(pos); track_par_cov_recalc.setPID(o2::track::PID::Electron); - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, track_par_cov_recalc, 2.f, matCorr, &dcaInfo); + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc, 2.f, matCorr, &mDcaInfoCov); getPxPyPz(track_par_cov_recalc, pVec_recalc); for (auto& empos : positrons_per_coll) { if (empos.trackId() == pos.globalIndex()) { @@ -959,11 +1021,14 @@ struct prefilterPrimaryElectron { if (!checkTrack(collision, ele)) { continue; } - gpu::gpustd::array dcaInfo; + o2::dataformats::DCA mDcaInfoCov; + mDcaInfoCov.set(999, 999, 999, 999, 999); std::array pVec_recalc = {0, 0, 0}; // px, py, pz auto track_par_cov_recalc = getTrackParCov(ele); track_par_cov_recalc.setPID(o2::track::PID::Electron); - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, track_par_cov_recalc, 2.f, matCorr, &dcaInfo); + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc, 2.f, matCorr, &mDcaInfoCov); getPxPyPz(track_par_cov_recalc, pVec_recalc); for (auto& emele : electrons_per_coll) { From 0755acb0dd76351be85f483e2bb1e3d19e8a85f9 Mon Sep 17 00:00:00 2001 From: Victor Gonzalez Date: Fri, 28 Feb 2025 13:05:24 +0100 Subject: [PATCH 0468/1650] [PWGCF] DptDpt - Per run QC. Addressing `linter` recommendations (#10241) Co-authored-by: Victor --- .../Tasks/CMakeLists.txt | 8 +++--- ...RunExtraQc.cxx => dptDptPerRunExtraQc.cxx} | 26 ++++++++++--------- .../{perRunQc.cxx => dptDptPerRunQc.cxx} | 14 +++++----- 3 files changed, 25 insertions(+), 23 deletions(-) rename PWGCF/TwoParticleCorrelations/Tasks/{perRunExtraQc.cxx => dptDptPerRunExtraQc.cxx} (77%) rename PWGCF/TwoParticleCorrelations/Tasks/{perRunQc.cxx => dptDptPerRunQc.cxx} (97%) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt b/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt index 547403be12d..653d6173930 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt +++ b/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt @@ -38,13 +38,13 @@ o2physics_add_dpl_workflow(dpt-dpt-efficiency-and-qc PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(twopartcorr-per-run-qc - SOURCES perRunQc.cxx +o2physics_add_dpl_workflow(dpt-dpt-per-run-qc + SOURCES dptDptPerRunQc.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore O2Physics::AnalysisCCDB COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(twopartcorr-per-run-extraqc - SOURCES perRunExtraQc.cxx +o2physics_add_dpl_workflow(dpt-dpt-per-run-extra-qc + SOURCES dptDptPerRunExtraQc.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore O2Physics::AnalysisCCDB COMPONENT_NAME Analysis) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/perRunExtraQc.cxx b/PWGCF/TwoParticleCorrelations/Tasks/dptDptPerRunExtraQc.cxx similarity index 77% rename from PWGCF/TwoParticleCorrelations/Tasks/perRunExtraQc.cxx rename to PWGCF/TwoParticleCorrelations/Tasks/dptDptPerRunExtraQc.cxx index ce09b4fed46..d6500b88617 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/perRunExtraQc.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/dptDptPerRunExtraQc.cxx @@ -8,12 +8,14 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -// -// Minimal example to run this task: -// o2-analysis-centrality-table -b --configuration json://configuration.json | o2-analysis-timestamp -b --configuration json://configuration.json | o2-analysis-event-selection -b --configuration json://configuration.json | o2-analysis-multiplicity-table -b --configuration json://configuration.json | o2-analysis-lf-zdcsp -b --configuration json://configuration.json --aod-file @input_data.txt --aod-writer-json OutputDirector.json + +/// \file dptDptPerRunExtraQc.cxx +/// \brief basic per run check of the per analyzed species p vs TPC IW momentum +/// \author victor.gonzalez.sebastian@gmail.com #include #include +#include #include "Framework/AnalysisDataModel.h" #include "Framework/AnalysisTask.h" @@ -31,21 +33,21 @@ using namespace o2::constants::physics; using BCsWithTimestamps = soa::Join; -namespace perrunextraqa +namespace perrunextraqc { std::unordered_map gRunMapPvsTpcIwP; TProfile3D* gCurrentRunPvsPtcIwP; -} // namespace perrunextraqa +} // namespace perrunextraqc -struct DptDptPerRunExtraQa { +struct DptDptPerRunExtraQc { int mRunNumber{-1}; AxisSpec qaPAxis{150, 0.1, 5.0}; - HistogramRegistry mHistos{"PerRunExtraQaHistograms", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry mHistos{"PerRunExtraQcHistograms", {}, OutputObjHandlingPolicy::AnalysisObject}; void initRunNumber(aod::BCsWithTimestamps::iterator const& bc) { - using namespace perrunextraqa; + using namespace perrunextraqc; if (mRunNumber == bc.runNumber()) { return; @@ -60,7 +62,7 @@ struct DptDptPerRunExtraQa { void init(InitContext&) { - using namespace perrunextraqa; + using namespace perrunextraqc; qaPAxis.makeLogarithmic(); } @@ -68,9 +70,9 @@ struct DptDptPerRunExtraQa { template void processTracks(PassedTracks const& tracks) { - using namespace perrunextraqa; + using namespace perrunextraqc; - for (auto& track : tracks) { + for (const auto& track : tracks) { gCurrentRunPvsPtcIwP->Fill(track.trackacceptedid(), track.p(), track.tpcInnerParam(), track.pt()); } } @@ -95,5 +97,5 @@ struct DptDptPerRunExtraQa { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc)}; + adaptAnalysisTask(cfgc)}; } diff --git a/PWGCF/TwoParticleCorrelations/Tasks/perRunQc.cxx b/PWGCF/TwoParticleCorrelations/Tasks/dptDptPerRunQc.cxx similarity index 97% rename from PWGCF/TwoParticleCorrelations/Tasks/perRunQc.cxx rename to PWGCF/TwoParticleCorrelations/Tasks/dptDptPerRunQc.cxx index 2136eba6756..1065d4a74fa 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/perRunQc.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/dptDptPerRunQc.cxx @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file perRunQc.cxx +/// \file dptDptPerRunQc.cxx /// \brief basic per run check of the ITS dead chips and of the hadronic interaction rate /// \author victor.gonzalez.sebastian@gmail.com @@ -42,7 +42,7 @@ using namespace o2::framework::expressions; using BCsWithTimestamps = soa::Join; -namespace perrunqatask +namespace perrunqctask { static const int32_t nBCsPerOrbit = o2::constants::lhc::LHCMaxBunches; std::unordered_map gHadronicRate; @@ -53,9 +53,9 @@ std::unordered_map> gCollisionOrbitAfter; TH2* gCurrentHadronicRate; std::shared_ptr gCurrentCollisionOrbitBefore; std::shared_ptr gCurrentCollisionOrbitAfter; -} // namespace perrunqatask +} // namespace perrunqctask -struct DptDptPerRunQa { +struct DptDptPerRunQc { Service ccdb; @@ -67,7 +67,7 @@ struct DptDptPerRunQa { void initCCDB(aod::BCsWithTimestamps::iterator const& bc) { - using namespace perrunqatask; + using namespace perrunqctask; using namespace analysis::dptdptfilter; if (mRunNumber == bc.runNumber()) { @@ -144,7 +144,7 @@ struct DptDptPerRunQa { void process(soa::Join::iterator const& collision, aod::BCsWithTimestamps const&) { - using namespace perrunqatask; + using namespace perrunqctask; using namespace analysis::dptdptfilter; auto bc = collision.bc_as(); @@ -166,5 +166,5 @@ struct DptDptPerRunQa { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc)}; + adaptAnalysisTask(cfgc)}; } From b53c347c7270510fc2464968a6c5c8ed3acd7cd8 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Fri, 28 Feb 2025 21:52:00 +0900 Subject: [PATCH 0469/1650] [PWGEM/Photon] add a prefilter task for photons from pi0s (#10244) --- PWGEM/Dilepton/Tasks/prefilterDielectron.cxx | 2 +- PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h | 26 +- PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h | 14 +- PWGEM/PhotonMeson/Core/V0PhotonCut.cxx | 6 + PWGEM/PhotonMeson/Core/V0PhotonCut.h | 5 + PWGEM/PhotonMeson/DataModel/gammaTables.h | 5 + .../skimmerPrimaryElectronFromDalitzEE.cxx | 128 ++++---- PWGEM/PhotonMeson/Tasks/CMakeLists.txt | 6 + PWGEM/PhotonMeson/Tasks/pcmQC.cxx | 4 +- PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx | 4 +- PWGEM/PhotonMeson/Tasks/prefilterPhoton.cxx | 274 ++++++++++++++++++ PWGEM/PhotonMeson/Utils/PairUtilities.h | 8 + 12 files changed, 421 insertions(+), 61 deletions(-) create mode 100644 PWGEM/PhotonMeson/Tasks/prefilterPhoton.cxx diff --git a/PWGEM/Dilepton/Tasks/prefilterDielectron.cxx b/PWGEM/Dilepton/Tasks/prefilterDielectron.cxx index 59d9d0ac002..5ac01703a06 100644 --- a/PWGEM/Dilepton/Tasks/prefilterDielectron.cxx +++ b/PWGEM/Dilepton/Tasks/prefilterDielectron.cxx @@ -334,7 +334,7 @@ struct prefilterDielectron { Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); Filter collisionFilter_occupancy_track = eventcuts.cfgTrackOccupancyMin <= o2::aod::evsel::trackOccupancyInTimeRange && o2::aod::evsel::trackOccupancyInTimeRange < eventcuts.cfgTrackOccupancyMax; - Filter collisionFilter_occupancy_ft0c = eventcuts.cfgFT0COccupancyMin < o2::aod::evsel::ft0cOccupancyInTimeRange && o2::aod::evsel::ft0cOccupancyInTimeRange < eventcuts.cfgFT0COccupancyMax; + Filter collisionFilter_occupancy_ft0c = eventcuts.cfgFT0COccupancyMin <= o2::aod::evsel::ft0cOccupancyInTimeRange && o2::aod::evsel::ft0cOccupancyInTimeRange < eventcuts.cfgFT0COccupancyMax; using FilteredMyCollisions = soa::Filtered; int ndf = 0; diff --git a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h index e3c220a0c7f..17435a959d1 100644 --- a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h +++ b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h @@ -94,6 +94,7 @@ struct Pi0EtaToGammaGamma { Configurable cfgQvecEstimator{"cfgQvecEstimator", 0, "FT0M:0, FT0A:1, FT0C:2"}; Configurable cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"}; + Configurable cfgOccupancyEstimator{"cfgOccupancyEstimator", 0, "FT0C:0, Track:1"}; Configurable cfgCentMin{"cfgCentMin", 0, "min. centrality"}; Configurable cfgCentMax{"cfgCentMax", 999, "max. centrality"}; Configurable maxY{"maxY", 0.8, "maximum rapidity for reconstructed particles"}; @@ -117,8 +118,10 @@ struct Pi0EtaToGammaGamma { Configurable cfgRequireGoodZvtxFT0vsPV{"cfgRequireGoodZvtxFT0vsPV", false, "require good Zvtx between FT0 vs. PV in event cut"}; Configurable cfgRequireEMCReadoutInMB{"cfgRequireEMCReadoutInMB", false, "require the EMC to be read out in an MB collision (kTVXinEMC)"}; Configurable cfgRequireEMCHardwareTriggered{"cfgRequireEMCHardwareTriggered", false, "require the EMC to be hardware triggered (kEMC7 or kDMC7)"}; - Configurable cfgOccupancyMin{"cfgOccupancyMin", -1, "min. occupancy"}; - Configurable cfgOccupancyMax{"cfgOccupancyMax", 1000000000, "max. occupancy"}; + Configurable cfgTrackOccupancyMin{"cfgTrackOccupancyMin", -2, "min. occupancy"}; + Configurable cfgTrackOccupancyMax{"cfgTrackOccupancyMax", 1000000000, "max. occupancy"}; + Configurable cfgFT0COccupancyMin{"cfgFT0COccupancyMin", -2, "min. FT0C occupancy"}; + Configurable cfgFT0COccupancyMax{"cfgFT0COccupancyMax", 1000000000, "max. FT0C occupancy"}; Configurable onlyKeepWeightedEvents{"onlyKeepWeightedEvents", false, "flag to keep only weighted events (for JJ MCs) and remove all MB events (with weight = 1)"}; } eventcuts; @@ -147,6 +150,8 @@ struct Pi0EtaToGammaGamma { Configurable cfg_max_chi2its{"cfg_max_chi2its", 5.0, "max chi2/NclsITS"}; Configurable cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -3.0, "min. TPC n sigma for electron"}; Configurable cfg_max_TPCNsigmaEl{"cfg_max_TPCNsigmaEl", +3.0, "max. TPC n sigma for electron"}; + Configurable cfg_disable_itsonly_track{"cfg_disable_itsonly_track", false, "flag to disable ITSonly tracks"}; + Configurable cfg_disable_tpconly_track{"cfg_disable_tpconly_track", false, "flag to disable TPConly tracks"}; } pcmcuts; DalitzEECut fDileptonCut; @@ -228,6 +233,7 @@ struct Pi0EtaToGammaGamma { ep_bin_edges = std::vector(ConfEPBins.value.begin(), ConfEPBins.value.end()); ep_bin_edges.erase(ep_bin_edges.begin()); + LOGF(info, "cfgOccupancyEstimator = %d", cfgOccupancyEstimator.value); occ_bin_edges = std::vector(ConfOccupancyBins.value.begin(), ConfOccupancyBins.value.end()); occ_bin_edges.erase(occ_bin_edges.begin()); @@ -352,6 +358,9 @@ struct Pi0EtaToGammaGamma { fV0PhotonCut.SetChi2PerClusterTPC(0.0, pcmcuts.cfg_max_chi2tpc); fV0PhotonCut.SetTPCNsigmaElRange(pcmcuts.cfg_min_TPCNsigmaEl, pcmcuts.cfg_max_TPCNsigmaEl); fV0PhotonCut.SetChi2PerClusterITS(-1e+10, pcmcuts.cfg_max_chi2its); + fV0PhotonCut.SetDisableITSonly(pcmcuts.cfg_disable_itsonly_track); + fV0PhotonCut.SetDisableTPConly(pcmcuts.cfg_disable_tpconly_track); + if (pcmcuts.cfg_reject_v0_on_itsib) { fV0PhotonCut.SetNClustersITS(2, 4); } else { @@ -611,7 +620,15 @@ struct Pi0EtaToGammaGamma { epbin = static_cast(ep_bin_edges.size()) - 2; } - int occbin = lower_bound(occ_bin_edges.begin(), occ_bin_edges.end(), collision.trackOccupancyInTimeRange()) - occ_bin_edges.begin() - 1; + int occbin = -1; + if (cfgOccupancyEstimator == 0) { + occbin = lower_bound(occ_bin_edges.begin(), occ_bin_edges.end(), collision.ft0cOccupancyInTimeRange()) - occ_bin_edges.begin() - 1; + } else if (cfgOccupancyEstimator == 1) { + occbin = lower_bound(occ_bin_edges.begin(), occ_bin_edges.end(), collision.trackOccupancyInTimeRange()) - occ_bin_edges.begin() - 1; + } else { + occbin = lower_bound(occ_bin_edges.begin(), occ_bin_edges.end(), collision.ft0cOccupancyInTimeRange()) - occ_bin_edges.begin() - 1; + } + if (occbin < 0) { occbin = 0; } else if (static_cast(occ_bin_edges.size()) - 2 < occbin) { @@ -851,7 +868,8 @@ struct Pi0EtaToGammaGamma { } // end of collision loop } - Filter collisionFilter_occupancy = eventcuts.cfgOccupancyMin <= o2::aod::evsel::trackOccupancyInTimeRange && o2::aod::evsel::trackOccupancyInTimeRange < eventcuts.cfgOccupancyMax; + Filter collisionFilter_occupancy_track = eventcuts.cfgTrackOccupancyMin <= o2::aod::evsel::trackOccupancyInTimeRange && o2::aod::evsel::trackOccupancyInTimeRange < eventcuts.cfgTrackOccupancyMax; + Filter collisionFilter_occupancy_ft0c = eventcuts.cfgFT0COccupancyMin <= o2::aod::evsel::ft0cOccupancyInTimeRange && o2::aod::evsel::ft0cOccupancyInTimeRange < eventcuts.cfgFT0COccupancyMax; Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); using FilteredMyCollisions = soa::Filtered; diff --git a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h index fb6ce8842d3..b273cc7bc65 100644 --- a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h +++ b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h @@ -105,8 +105,10 @@ struct Pi0EtaToGammaGammaMC { Configurable cfgRequireGoodZvtxFT0vsPV{"cfgRequireGoodZvtxFT0vsPV", false, "require good Zvtx between FT0 vs. PV in event cut"}; Configurable cfgRequireEMCReadoutInMB{"cfgRequireEMCReadoutInMB", false, "require the EMC to be read out in an MB collision (kTVXinEMC)"}; Configurable cfgRequireEMCHardwareTriggered{"cfgRequireEMCHardwareTriggered", false, "require the EMC to be hardware triggered (kEMC7 or kDMC7)"}; - Configurable cfgOccupancyMin{"cfgOccupancyMin", -1, "min. occupancy"}; - Configurable cfgOccupancyMax{"cfgOccupancyMax", 1000000000, "max. occupancy"}; + Configurable cfgTrackOccupancyMin{"cfgTrackOccupancyMin", -2, "min. occupancy"}; + Configurable cfgTrackOccupancyMax{"cfgTrackOccupancyMax", 1000000000, "max. occupancy"}; + Configurable cfgFT0COccupancyMin{"cfgFT0COccupancyMin", -2, "min. FT0C occupancy"}; + Configurable cfgFT0COccupancyMax{"cfgFT0COccupancyMax", 1000000000, "max. FT0C occupancy"}; Configurable onlyKeepWeightedEvents{"onlyKeepWeightedEvents", false, "flag to keep only weighted events (for JJ MCs) and remove all MB events (with weight = 1)"}; } eventcuts; @@ -135,6 +137,8 @@ struct Pi0EtaToGammaGammaMC { Configurable cfg_max_chi2its{"cfg_max_chi2its", 5.0, "max chi2/NclsITS"}; Configurable cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -3.0, "min. TPC n sigma for electron"}; Configurable cfg_max_TPCNsigmaEl{"cfg_max_TPCNsigmaEl", +3.0, "max. TPC n sigma for electron"}; + Configurable cfg_disable_itsonly_track{"cfg_disable_itsonly_track", false, "flag to disable ITSonly tracks"}; + Configurable cfg_disable_tpconly_track{"cfg_disable_tpconly_track", false, "flag to disable TPConly tracks"}; } pcmcuts; DalitzEECut fDileptonCut; @@ -315,6 +319,9 @@ struct Pi0EtaToGammaGammaMC { fV0PhotonCut.SetChi2PerClusterTPC(0.0, pcmcuts.cfg_max_chi2tpc); fV0PhotonCut.SetTPCNsigmaElRange(pcmcuts.cfg_min_TPCNsigmaEl, pcmcuts.cfg_max_TPCNsigmaEl); fV0PhotonCut.SetChi2PerClusterITS(-1e+10, pcmcuts.cfg_max_chi2its); + fV0PhotonCut.SetDisableITSonly(pcmcuts.cfg_disable_itsonly_track); + fV0PhotonCut.SetDisableTPConly(pcmcuts.cfg_disable_tpconly_track); + if (pcmcuts.cfg_reject_v0_on_itsib) { fV0PhotonCut.SetNClustersITS(2, 4); } else { @@ -685,7 +692,8 @@ struct Pi0EtaToGammaGammaMC { } // end of collision loop } - Filter collisionFilter_occupancy = eventcuts.cfgOccupancyMin <= o2::aod::evsel::trackOccupancyInTimeRange && o2::aod::evsel::trackOccupancyInTimeRange < eventcuts.cfgOccupancyMax; + Filter collisionFilter_occupancy_track = eventcuts.cfgTrackOccupancyMin <= o2::aod::evsel::trackOccupancyInTimeRange && o2::aod::evsel::trackOccupancyInTimeRange < eventcuts.cfgTrackOccupancyMax; + Filter collisionFilter_occupancy_ft0c = eventcuts.cfgFT0COccupancyMin <= o2::aod::evsel::ft0cOccupancyInTimeRange && o2::aod::evsel::ft0cOccupancyInTimeRange < eventcuts.cfgFT0COccupancyMax; Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); using FilteredMyCollisions = soa::Filtered; diff --git a/PWGEM/PhotonMeson/Core/V0PhotonCut.cxx b/PWGEM/PhotonMeson/Core/V0PhotonCut.cxx index 94343e0104d..d00d8366d34 100644 --- a/PWGEM/PhotonMeson/Core/V0PhotonCut.cxx +++ b/PWGEM/PhotonMeson/Core/V0PhotonCut.cxx @@ -240,3 +240,9 @@ void V0PhotonCut::SetDisableITSonly(bool flag) mDisableITSonly = flag; LOG(info) << "V0 Photon Cut, disable ITS only track: " << mDisableITSonly; } + +void V0PhotonCut::SetDisableTPConly(bool flag) +{ + mDisableTPConly = flag; + LOG(info) << "V0 Photon Cut, disable TPC only track: " << mDisableTPConly; +} diff --git a/PWGEM/PhotonMeson/Core/V0PhotonCut.h b/PWGEM/PhotonMeson/Core/V0PhotonCut.h index bdc5d84aca4..afcc0030544 100644 --- a/PWGEM/PhotonMeson/Core/V0PhotonCut.h +++ b/PWGEM/PhotonMeson/Core/V0PhotonCut.h @@ -150,6 +150,9 @@ class V0PhotonCut : public TNamed if (mDisableITSonly && isITSonlyTrack(track)) { return false; } + if (mDisableTPConly && isTPConlyTrack(track)) { + return false; + } if (mRejectITSib) { auto hits_ib = std::count_if(its_ib_Requirement.second.begin(), its_ib_Requirement.second.end(), [&](auto&& requiredLayer) { return track.itsClusterMap() & (1 << requiredLayer); }); @@ -476,6 +479,7 @@ class V0PhotonCut : public TNamed void SetRequireTPCTOF(bool flag); void SetRequireTPCTRDTOF(bool flag); void SetDisableITSonly(bool flag); + void SetDisableTPConly(bool flag); private: static const std::pair> its_ib_Requirement; @@ -527,6 +531,7 @@ class V0PhotonCut : public TNamed bool mRequireTPCTOF{false}; bool mRequireTPCTRDTOF{false}; bool mDisableITSonly{false}; + bool mDisableTPConly{false}; ClassDef(V0PhotonCut, 1); }; diff --git a/PWGEM/PhotonMeson/DataModel/gammaTables.h b/PWGEM/PhotonMeson/DataModel/gammaTables.h index f2d97a68a36..1e2bca55e81 100644 --- a/PWGEM/PhotonMeson/DataModel/gammaTables.h +++ b/PWGEM/PhotonMeson/DataModel/gammaTables.h @@ -237,6 +237,7 @@ DECLARE_SOA_COLUMN(SigmaPz2, sigmaPz2, float); //! erro DECLARE_SOA_COLUMN(SigmaPxPy, sigmaPxPy, float); //! error of px x py in covariant matrix DECLARE_SOA_COLUMN(SigmaPyPz, sigmaPyPz, float); //! error of py x pz in covariant matrix DECLARE_SOA_COLUMN(SigmaPzPx, sigmaPzPx, float); //! error of pz x px in covariant matrix +DECLARE_SOA_COLUMN(PrefilterBitDerived, pfbderived, uint16_t); //! DECLARE_SOA_DYNAMIC_COLUMN(E, e, [](float px, float py, float pz, float m = 0) -> float { return RecoDecay::sqrtSumOfSquares(px, py, pz, m); }); //! energy of v0 photn, mass to be given as argument when getter is called! DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, [](float px, float py) -> float { return RecoDecay::sqrtSumOfSquares(px, py); }); @@ -274,6 +275,10 @@ DECLARE_SOA_TABLE(V0PhotonsKFCov, "AOD", "V0PHOTONKFCOV", //! To be joined with // iterators using V0PhotonKFCov = V0PhotonsKFCov::iterator; +DECLARE_SOA_TABLE(V0PhotonsKFPrefilterBitDerived, "AOD", "V0PHOTONKFPFBPI0", v0photonkf::PrefilterBitDerived); // To be joined with V0PhotonsKF table at analysis level. +// iterators +using V0PhotonKFPrefilterBitDerived = V0PhotonsKFPrefilterBitDerived::iterator; + DECLARE_SOA_TABLE(EMPrimaryElectronsFromDalitz, "AOD", "EMPRIMARYELDA", //! o2::soa::Index<>, emprimaryelectron::CollisionId, emprimaryelectron::TrackId, emprimaryelectron::Sign, diff --git a/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx b/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx index 95c4a0678ee..575d5c88370 100644 --- a/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx +++ b/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx @@ -28,9 +28,9 @@ #include "CCDB/BasicCCDBManager.h" #include "Common/Core/trackUtilities.h" #include "CommonConstants/PhysicsConstants.h" -#include "Common/DataModel/CollisionAssociationTables.h" #include "PWGEM/PhotonMeson/DataModel/gammaTables.h" #include "PWGEM/PhotonMeson/Utils/TrackSelection.h" +#include "PWGEM/Dilepton/Utils/PairUtilities.h" using namespace o2; using namespace o2::soa; @@ -47,7 +47,6 @@ using MyTracksMC = soa::Join; using MyTrackMC = MyTracksMC::iterator; struct skimmerPrimaryElectronFromDalitzEE { - SliceCache cache; Preslice perCol = o2::aod::track::collisionId; Produces emprimaryelectrons; @@ -69,7 +68,7 @@ struct skimmerPrimaryElectronFromDalitzEE { Configurable min_ncluster_itsib{"min_ncluster_itsib", 1, "min ncluster itsib"}; Configurable maxchi2tpc{"maxchi2tpc", 5.0, "max. chi2/NclsTPC"}; Configurable maxchi2its{"maxchi2its", 6.0, "max. chi2/NclsITS"}; - Configurable minpt{"minpt", 0.1, "min pt for track"}; + Configurable minpt{"minpt", 0.05, "min pt for track"}; Configurable maxeta{"maxeta", 0.9, "eta acceptance"}; Configurable dca_xy_max{"dca_xy_max", 0.05, "max DCAxy in cm"}; Configurable dca_z_max{"dca_z_max", 0.05, "max DCAz in cm"}; @@ -77,9 +76,11 @@ struct skimmerPrimaryElectronFromDalitzEE { Configurable maxTPCNsigmaEl{"maxTPCNsigmaEl", 3.5, "max. TPC n sigma for electron inclusion"}; Configurable maxTPCNsigmaPi{"maxTPCNsigmaPi", 0.0, "max. TPC n sigma for pion exclusion"}; Configurable minTPCNsigmaPi{"minTPCNsigmaPi", 0.0, "min. TPC n sigma for pion exclusion"}; - Configurable maxMee{"maxMee", 0.06, "max. mee to store dalitz ee pairs"}; + Configurable maxMee{"maxMee", 0.03, "max. mee to store dalitz ee pairs"}; + Configurable fillLS{"fillLS", true, "flag to fill LS histograms for QA"}; HistogramRegistry fRegistry{"output", {}, OutputObjHandlingPolicy::AnalysisObject, false, false}; + static constexpr std::string_view dileptonSigns[3] = {"uls/", "lspp/", "lsmm/"}; int mRunNumber; float d_bz; @@ -97,23 +98,37 @@ struct skimmerPrimaryElectronFromDalitzEE { ccdb->setFatalWhenNull(false); fRegistry.add("Track/hPt", "pT;p_{T} (GeV/c)", kTH1F, {{1000, 0.0f, 10}}, false); + fRegistry.add("Track/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {40, -1.0f, 1.0f}}, false); fRegistry.add("Track/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{400, -20, 20}}, false); - fRegistry.add("Track/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {20, -1.0f, 1.0f}}, false); fRegistry.add("Track/hDCAxyz", "DCA xy vs. z;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -1.0f, 1.0f}, {200, -1.0f, 1.0f}}, false); - fRegistry.add("Track/hDCAxy_Pt", "DCA_{xy} vs. pT;p_{T} (GeV/c);DCA_{xy} (cm)", kTH2F, {{1000, 0, 10}, {200, -1, 1}}, false); - fRegistry.add("Track/hDCAz_Pt", "DCA_{z} vs. pT;p_{T} (GeV/c);DCA_{z} (cm)", kTH2F, {{1000, 0, 10}, {200, -1, 1}}, false); + fRegistry.add("Track/hDCAxy_Pt", "DCA_{xy} vs. pT;p_{T} (GeV/c);DCA_{xy} (cm)", kTH2F, {{200, 0, 10}, {200, -1, 1}}, false); + fRegistry.add("Track/hDCAz_Pt", "DCA_{z} vs. pT;p_{T} (GeV/c);DCA_{z} (cm)", kTH2F, {{200, 0, 10}, {200, -1, 1}}, false); + fRegistry.add("Track/hDCAxyzSigma", "DCA xy vs. z;DCA_{xy} (#sigma);DCA_{z} (#sigma)", kTH2F, {{200, -10.0f, 10.0f}, {200, -10.0f, 10.0f}}, false); + fRegistry.add("Track/hDCAxyRes_Pt", "DCA_{xy} resolution vs. pT;p_{T} (GeV/c);DCA_{xy} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0., 500}}, false); + fRegistry.add("Track/hDCAzRes_Pt", "DCA_{z} resolution vs. pT;p_{T} (GeV/c);DCA_{z} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0., 500}}, false); + + // TPC fRegistry.add("Track/hNclsTPC", "number of TPC clusters", kTH1F, {{161, -0.5, 160.5}}, false); fRegistry.add("Track/hNcrTPC", "number of TPC crossed rows", kTH1F, {{161, -0.5, 160.5}}, false); fRegistry.add("Track/hChi2TPC", "chi2/number of TPC clusters", kTH1F, {{100, 0, 10}}, false); + fRegistry.add("Track/hTPCNcr2Nf", "TPC Ncr/Nfindable", kTH1F, {{200, 0, 2}}, false); + fRegistry.add("Track/hTPCNcls2Nf", "TPC Ncls/Nfindable", kTH1F, {{200, 0, 2}}, false); + fRegistry.add("Track/hTPCNclsShared", "TPC Ncls shared/Ncls;p_{T} (GeV/c);N_{cls}^{shared}/N_{cls} in TPC", kTH2F, {{1000, 0, 10}, {100, 0, 1}}, false); fRegistry.add("Track/hTPCdEdx", "TPC dE/dx;p_{in} (GeV/c);TPC dE/dx (a.u.)", kTH2F, {{1000, 0, 10}, {200, 0, 200}}, false); fRegistry.add("Track/hTPCNsigmaEl", "TPC n sigma el;p_{in} (GeV/c);n #sigma_{e}^{TPC}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); fRegistry.add("Track/hTPCNsigmaPi", "TPC n sigma pi;p_{in} (GeV/c);n #sigma_{#pi}^{TPC}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); - fRegistry.add("Track/hTPCNcr2Nf", "TPC Ncr/Nfindable", kTH1F, {{200, 0, 2}}, false); - fRegistry.add("Track/hTPCNcls2Nf", "TPC Ncls/Nfindable", kTH1F, {{200, 0, 2}}, false); + + // ITS fRegistry.add("Track/hNclsITS", "number of ITS clusters", kTH1F, {{8, -0.5, 7.5}}, false); fRegistry.add("Track/hChi2ITS", "chi2/number of ITS clusters", kTH1F, {{100, 0, 10}}, false); fRegistry.add("Track/hITSClusterMap", "ITS cluster map", kTH1F, {{128, -0.5, 127.5}}, false); - fRegistry.add("Pair/hMeePtee_ULS", "mee vs. pTee for dalitz ee ULS;m_{ee} (GeV/c^{2});p_{T,ee} (GeV/c)", kTH2F, {{100, 0, 0.1}, {100, 0, 10}}, false); + fRegistry.add("Track/hMeanClusterSizeITS", "mean cluster size ITS;p_{pv} (GeV/c); on ITS #times cos(#lambda)", kTH2F, {{1000, 0, 10}, {150, 0, 15}}, false); + + // pair + fRegistry.add("Pair/uls/hMvsPt", "m_{ee} vs. p_{T,ee};m_{ee} (GeV/c^{2});p_{T,ee} (GeV/c)", kTH2F, {{100, 0, 0.1}, {200, 0, 2}}, false); + fRegistry.add("Pair/uls/hMvsPhiV", "m_{ee} vs. #varphi_{V};#varphi_{V} (rad.);m_{ee} (GeV/c^{2})", kTH2F, {{180, 0, M_PI}, {100, 0, 0.1}}, false); + fRegistry.addClone("Pair/uls/", "Pair/lspp/"); + fRegistry.addClone("Pair/uls/", "Pair/lsmm/"); } void initCCDB(aod::BCsWithTimestamps::iterator const& bc) @@ -235,32 +250,44 @@ struct skimmerPrimaryElectronFromDalitzEE { track.itsClusterSizes(), track.itsChi2NCl(), track.detectorMap(), track.tgl()); fRegistry.fill(HIST("Track/hPt"), track.pt()); - fRegistry.fill(HIST("Track/hQoverPt"), track.sign() / track.pt()); fRegistry.fill(HIST("Track/hEtaPhi"), track.phi(), track.eta()); + fRegistry.fill(HIST("Track/hQoverPt"), track.sign() / track.pt()); fRegistry.fill(HIST("Track/hDCAxyz"), track.dcaXY(), track.dcaZ()); fRegistry.fill(HIST("Track/hDCAxy_Pt"), track.pt(), track.dcaXY()); fRegistry.fill(HIST("Track/hDCAz_Pt"), track.pt(), track.dcaZ()); - fRegistry.fill(HIST("Track/hNclsITS"), track.itsNCls()); + fRegistry.fill(HIST("Track/hDCAxyzSigma"), track.dcaXY() / std::sqrt(track.cYY()), track.dcaZ() / std::sqrt(track.cZZ())); + fRegistry.fill(HIST("Track/hDCAxyRes_Pt"), track.pt(), std::sqrt(track.cYY()) * 1e+4); // convert cm to um + fRegistry.fill(HIST("Track/hDCAzRes_Pt"), track.pt(), std::sqrt(track.cZZ()) * 1e+4); // convert cm to um + fRegistry.fill(HIST("Track/hNclsTPC"), track.tpcNClsFound()); fRegistry.fill(HIST("Track/hNcrTPC"), track.tpcNClsCrossedRows()); + fRegistry.fill(HIST("Track/hChi2TPC"), track.tpcChi2NCl()); fRegistry.fill(HIST("Track/hTPCNcr2Nf"), track.tpcCrossedRowsOverFindableCls()); fRegistry.fill(HIST("Track/hTPCNcls2Nf"), track.tpcFoundOverFindableCls()); - fRegistry.fill(HIST("Track/hChi2TPC"), track.tpcChi2NCl()); - fRegistry.fill(HIST("Track/hChi2ITS"), track.itsChi2NCl()); - fRegistry.fill(HIST("Track/hITSClusterMap"), track.itsClusterMap()); + fRegistry.fill(HIST("Track/hTPCNclsShared"), track.pt(), track.tpcFractionSharedCls()); fRegistry.fill(HIST("Track/hTPCdEdx"), track.tpcInnerParam(), track.tpcSignal()); fRegistry.fill(HIST("Track/hTPCNsigmaEl"), track.tpcInnerParam(), track.tpcNSigmaEl()); fRegistry.fill(HIST("Track/hTPCNsigmaPi"), track.tpcInnerParam(), track.tpcNSigmaPi()); + fRegistry.fill(HIST("Track/hNclsITS"), track.itsNCls()); + fRegistry.fill(HIST("Track/hChi2ITS"), track.itsChi2NCl()); + fRegistry.fill(HIST("Track/hITSClusterMap"), track.itsClusterMap()); + + int nsize = 0; + for (int il = 0; il < 7; il++) { + nsize += track.itsClsSizeInLayer(il); + } + fRegistry.fill(HIST("Track/hMeanClusterSizeITS"), track.p(), static_cast(nsize) / static_cast(track.itsNCls()) * std::cos(std::atan(track.tgl()))); + stored_trackIds.emplace_back(std::make_pair(collision.globalIndex(), track.globalIndex())); } } - template + template void fillPairInfo(TCollision const& collision, TTracks1 const& tracks1, TTracks2 const& tracks2) { - for (const auto& t1 : tracks1) { - for (const auto& t2 : tracks2) { + if constexpr (pairtype == 0) { // ULS + for (const auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) { if (!checkTrack(collision, t1) || !checkTrack(collision, t2)) { continue; } @@ -271,15 +298,33 @@ struct skimmerPrimaryElectronFromDalitzEE { ROOT::Math::PtEtaPhiMVector v1(t1.pt(), t1.eta(), t1.phi(), o2::constants::physics::MassElectron); ROOT::Math::PtEtaPhiMVector v2(t2.pt(), t2.eta(), t2.phi(), o2::constants::physics::MassElectron); ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; + float phiv = o2::aod::pwgem::dilepton::utils::pairutil::getPhivPair(t1.px(), t1.py(), t1.pz(), t2.px(), t2.py(), t2.pz(), t1.sign(), t2.sign(), d_bz); + fRegistry.fill(HIST("Pair/") + HIST(dileptonSigns[pairtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + fRegistry.fill(HIST("Pair/") + HIST(dileptonSigns[pairtype]) + HIST("hMvsPhiV"), phiv, v12.M()); if (v12.M() > maxMee) { // don't store continue; } - fRegistry.fill(HIST("Pair/hMeePtee_ULS"), v12.M(), v12.Pt()); fillTrackTable(collision, t1); fillTrackTable(collision, t2); - } // end of t2 - } // end of t1 + } // end of pairing + } else { // LS + for (auto& [t1, t2] : combinations(CombinationsStrictlyUpperIndexPolicy(tracks1, tracks2))) { + if (!checkTrack(collision, t1) || !checkTrack(collision, t2)) { + continue; + } + if (!isElectron(t1) || !isElectron(t2)) { + continue; + } + + ROOT::Math::PtEtaPhiMVector v1(t1.pt(), t1.eta(), t1.phi(), o2::constants::physics::MassElectron); + ROOT::Math::PtEtaPhiMVector v2(t2.pt(), t2.eta(), t2.phi(), o2::constants::physics::MassElectron); + ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; + float phiv = o2::aod::pwgem::dilepton::utils::pairutil::getPhivPair(t1.px(), t1.py(), t1.pz(), t2.px(), t2.py(), t2.pz(), t1.sign(), t2.sign(), d_bz); + fRegistry.fill(HIST("Pair/") + HIST(dileptonSigns[pairtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); + fRegistry.fill(HIST("Pair/") + HIST(dileptonSigns[pairtype]) + HIST("hMvsPhiV"), phiv, v12.M()); + } // end of pairing + } } std::vector> stored_trackIds; @@ -308,7 +353,11 @@ struct skimmerPrimaryElectronFromDalitzEE { auto posTracks_per_coll = posTracks->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); auto negTracks_per_coll = negTracks->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); - fillPairInfo(collision, posTracks_per_coll, negTracks_per_coll); // ULS + fillPairInfo(collision, posTracks_per_coll, negTracks_per_coll); // ULS + if (fillLS) { + fillPairInfo(collision, posTracks_per_coll, posTracks_per_coll); // LS++ + fillPairInfo(collision, negTracks_per_coll, negTracks_per_coll); // LS-- + } } // end of collision loop stored_trackIds.clear(); @@ -341,7 +390,11 @@ struct skimmerPrimaryElectronFromDalitzEE { auto posTracks_per_coll = posTracksMC->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); auto negTracks_per_coll = negTracksMC->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); - fillPairInfo(collision, posTracks_per_coll, negTracks_per_coll); // ULS + fillPairInfo(collision, posTracks_per_coll, negTracks_per_coll); // ULS + if (fillLS) { + fillPairInfo(collision, posTracks_per_coll, posTracks_per_coll); // LS++ + fillPairInfo(collision, negTracks_per_coll, negTracks_per_coll); // LS-- + } } // end of collision loop stored_trackIds.clear(); @@ -350,34 +403,7 @@ struct skimmerPrimaryElectronFromDalitzEE { PROCESS_SWITCH(skimmerPrimaryElectronFromDalitzEE, processMC, "process reconstructed and MC info ", false); }; -// struct associateAmbiguousElectron { -// Produces em_amb_ele_ids; -// -// SliceCache cache; -// PresliceUnsorted perTrack = o2::aod::emprimaryelectron::trackId; -// std::vector ambele_self_Ids; -// -// void process(aod::EMPrimaryElectrons const& electrons) -// { -// for (const auto& electron : electrons) { -// auto electrons_with_same_trackId = electrons.sliceBy(perTrack, electron.trackId()); -// ambele_self_Ids.reserve(electrons_with_same_trackId.size()); -// for (const auto& amp_ele : electrons_with_same_trackId) { -// if (amp_ele.globalIndex() == electron.globalIndex()) { // don't store myself. -// continue; -// } -// ambele_self_Ids.emplace_back(amp_ele.globalIndex()); -// } -// em_amb_ele_ids(ambele_self_Ids); -// ambele_self_Ids.clear(); -// ambele_self_Ids.shrink_to_fit(); -// } -// } -// }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"skimmer-primary-electron-from-dalitzee"}), - // adaptAnalysisTask(cfgc, TaskName{"associate-ambiguous-electron"}) - }; + return WorkflowSpec{adaptAnalysisTask(cfgc, TaskName{"skimmer-primary-electron-from-dalitzee"})}; } diff --git a/PWGEM/PhotonMeson/Tasks/CMakeLists.txt b/PWGEM/PhotonMeson/Tasks/CMakeLists.txt index 82dd5775d75..d46ce9f0ada 100644 --- a/PWGEM/PhotonMeson/Tasks/CMakeLists.txt +++ b/PWGEM/PhotonMeson/Tasks/CMakeLists.txt @@ -128,3 +128,9 @@ o2physics_add_dpl_workflow(pi0-flow-emc SOURCES taskPi0FlowEMC.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2::EMCALBase O2::EMCALCalib O2Physics::AnalysisCore O2Physics::PWGEMPhotonMesonCore COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(prefilter-photon + SOURCES prefilterPhoton.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGEMPhotonMesonCore + COMPONENT_NAME Analysis) + diff --git a/PWGEM/PhotonMeson/Tasks/pcmQC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQC.cxx index e764a1b3dc7..b5f0d91099d 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQC.cxx @@ -94,6 +94,7 @@ struct PCMQC { Configurable cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -3.0, "min. TPC n sigma for electron"}; Configurable cfg_max_TPCNsigmaEl{"cfg_max_TPCNsigmaEl", +3.0, "max. TPC n sigma for electron"}; Configurable cfg_disable_itsonly_track{"cfg_disable_itsonly_track", false, "flag to disable ITSonly tracks"}; + Configurable cfg_disable_tpconly_track{"cfg_disable_tpconly_track", false, "flag to disable TPConly tracks"}; } pcmcuts; static constexpr std::string_view event_types[2] = {"before/", "after/"}; @@ -224,6 +225,7 @@ struct PCMQC { fV0PhotonCut.SetTPCNsigmaElRange(pcmcuts.cfg_min_TPCNsigmaEl, pcmcuts.cfg_max_TPCNsigmaEl); fV0PhotonCut.SetChi2PerClusterITS(-1e+10, pcmcuts.cfg_max_chi2its); fV0PhotonCut.SetDisableITSonly(pcmcuts.cfg_disable_itsonly_track); + fV0PhotonCut.SetDisableTPConly(pcmcuts.cfg_disable_tpconly_track); if (pcmcuts.cfg_reject_v0_on_itsib) { fV0PhotonCut.SetNClustersITS(2, 4); @@ -350,7 +352,7 @@ struct PCMQC { Preslice perCollision = aod::v0photonkf::emeventId; Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); Filter collisionFilter_occupancy_track = eventcuts.cfgTrackOccupancyMin <= o2::aod::evsel::trackOccupancyInTimeRange && o2::aod::evsel::trackOccupancyInTimeRange < eventcuts.cfgTrackOccupancyMax; - Filter collisionFilter_occupancy_ft0c = eventcuts.cfgFT0COccupancyMin < o2::aod::evsel::ft0cOccupancyInTimeRange && o2::aod::evsel::ft0cOccupancyInTimeRange < eventcuts.cfgFT0COccupancyMax; + Filter collisionFilter_occupancy_ft0c = eventcuts.cfgFT0COccupancyMin <= o2::aod::evsel::ft0cOccupancyInTimeRange && o2::aod::evsel::ft0cOccupancyInTimeRange < eventcuts.cfgFT0COccupancyMax; using FilteredMyCollisions = soa::Filtered; void processQC(FilteredMyCollisions const& collisions, MyV0Photons const& v0photons, aod::V0Legs const&) diff --git a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx index 4a0ac90067a..6ee14e90931 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx @@ -108,6 +108,7 @@ struct PCMQCMC { Configurable cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -3.0, "min. TPC n sigma for electron"}; Configurable cfg_max_TPCNsigmaEl{"cfg_max_TPCNsigmaEl", +3.0, "max. TPC n sigma for electron"}; Configurable cfg_disable_itsonly_track{"cfg_disable_itsonly_track", false, "flag to disable ITSonly tracks"}; + Configurable cfg_disable_tpconly_track{"cfg_disable_tpconly_track", false, "flag to disable TPConly tracks"}; } pcmcuts; HistogramRegistry fRegistry{"output", {}, OutputObjHandlingPolicy::AnalysisObject, false, false}; @@ -282,6 +283,7 @@ struct PCMQCMC { fV0PhotonCut.SetTPCNsigmaElRange(pcmcuts.cfg_min_TPCNsigmaEl, pcmcuts.cfg_max_TPCNsigmaEl); fV0PhotonCut.SetChi2PerClusterITS(-1e+10, pcmcuts.cfg_max_chi2its); fV0PhotonCut.SetDisableITSonly(pcmcuts.cfg_disable_itsonly_track); + fV0PhotonCut.SetDisableTPConly(pcmcuts.cfg_disable_tpconly_track); if (pcmcuts.cfg_reject_v0_on_itsib) { fV0PhotonCut.SetNClustersITS(2, 4); @@ -419,7 +421,7 @@ struct PCMQCMC { Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); Filter collisionFilter_occupancy_track = eventcuts.cfgTrackOccupancyMin <= o2::aod::evsel::trackOccupancyInTimeRange && o2::aod::evsel::trackOccupancyInTimeRange < eventcuts.cfgTrackOccupancyMax; - Filter collisionFilter_occupancy_ft0c = eventcuts.cfgFT0COccupancyMin < o2::aod::evsel::ft0cOccupancyInTimeRange && o2::aod::evsel::ft0cOccupancyInTimeRange < eventcuts.cfgFT0COccupancyMax; + Filter collisionFilter_occupancy_ft0c = eventcuts.cfgFT0COccupancyMin <= o2::aod::evsel::ft0cOccupancyInTimeRange && o2::aod::evsel::ft0cOccupancyInTimeRange < eventcuts.cfgFT0COccupancyMax; using FilteredMyCollisions = soa::Filtered; Preslice perCollision = aod::v0photonkf::emeventId; diff --git a/PWGEM/PhotonMeson/Tasks/prefilterPhoton.cxx b/PWGEM/PhotonMeson/Tasks/prefilterPhoton.cxx new file mode 100644 index 00000000000..3063392e5f2 --- /dev/null +++ b/PWGEM/PhotonMeson/Tasks/prefilterPhoton.cxx @@ -0,0 +1,274 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +// +// ======================== +// +// This code produces information on prefilter for photon. +// Please write to: daiki.sekihata@cern.ch + +#include +#include +#include +#include +#include + +#include "TString.h" +#include "Math/Vector4D.h" +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/ASoAHelpers.h" +#include "Common/Core/RecoDecay.h" +#include "Common/Core/trackUtilities.h" + +#include "DetectorsBase/Propagator.h" +#include "DetectorsBase/GeometryManager.h" +#include "DataFormatsParameters/GRPObject.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "CCDB/BasicCCDBManager.h" + +#include "PWGEM/PhotonMeson/DataModel/gammaTables.h" +#include "PWGEM/PhotonMeson/Utils/PairUtilities.h" +#include "PWGEM/PhotonMeson/Core/V0PhotonCut.h" +#include "PWGEM/PhotonMeson/Core/EMPhotonEventCut.h" + +using namespace o2; +using namespace o2::aod; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::soa; + +using MyCollisions = soa::Join; +using MyCollision = MyCollisions::iterator; + +using MyV0Photons = soa::Join; +using MyV0Photon = MyV0Photons::iterator; + +struct prefilterPhoton { + Produces pfb_derived; + + // Configurables + Configurable cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"}; + Configurable cfgCentMin{"cfgCentMin", -1, "min. centrality"}; + Configurable cfgCentMax{"cfgCentMax", 999.f, "max. centrality"}; + + EMPhotonEventCut fEMEventCut; + struct : ConfigurableGroup { + std::string prefix = "eventcut_group"; + Configurable cfgZvtxMax{"cfgZvtxMax", 10.f, "max. Zvtx"}; + Configurable cfgRequireSel8{"cfgRequireSel8", false, "require sel8 in event cut"}; + Configurable cfgRequireFT0AND{"cfgRequireFT0AND", true, "require FT0AND in event cut"}; + Configurable cfgRequireNoTFB{"cfgRequireNoTFB", false, "require No time frame border in event cut"}; + Configurable cfgRequireNoITSROFB{"cfgRequireNoITSROFB", false, "require no ITS readout frame border in event cut"}; + Configurable cfgRequireNoSameBunchPileup{"cfgRequireNoSameBunchPileup", false, "require no same bunch pileup in event cut"}; + Configurable cfgRequireGoodZvtxFT0vsPV{"cfgRequireGoodZvtxFT0vsPV", false, "require good Zvtx between FT0 vs. PV in event cut"}; + Configurable cfgTrackOccupancyMin{"cfgTrackOccupancyMin", -2, "min. occupancy"}; + Configurable cfgTrackOccupancyMax{"cfgTrackOccupancyMax", 1000000000, "max. occupancy"}; + Configurable cfgFT0COccupancyMin{"cfgFT0COccupancyMin", -2, "min. FT0C occupancy"}; + Configurable cfgFT0COccupancyMax{"cfgFT0COccupancyMax", 1000000000, "max. FT0C occupancy"}; + } eventcuts; + + V0PhotonCut fV0PhotonCut; + struct : ConfigurableGroup { + std::string prefix = "pcmcut_group"; + + // for mgg prefilter + Configurable cfg_min_mass{"cfg_min_mass", 0.12, "min mass for prefilter"}; // region to be rejected + Configurable cfg_max_mass{"cfg_max_mass", 0.15, "max mass for prefilter"}; // region to be rejected + + Configurable cfg_min_pt_v0{"cfg_min_pt_v0", 0.1, "min pT for v0 photons at PV"}; + Configurable cfg_min_eta_v0{"cfg_min_eta_v0", -0.9, "min eta for v0 photons at PV"}; + Configurable cfg_max_eta_v0{"cfg_max_eta_v0", +0.9, "max eta for v0 photons at PV"}; + Configurable cfg_min_v0radius{"cfg_min_v0radius", 4.0, "min v0 radius"}; + Configurable cfg_max_v0radius{"cfg_max_v0radius", 90.0, "max v0 radius"}; + Configurable cfg_max_alpha_ap{"cfg_max_alpha_ap", 0.95, "max alpha for AP cut"}; + Configurable cfg_max_qt_ap{"cfg_max_qt_ap", 0.01, "max qT for AP cut"}; + Configurable cfg_min_cospa{"cfg_min_cospa", 0.999, "min V0 CosPA"}; + Configurable cfg_max_pca{"cfg_max_pca", 1.5, "max distance btween 2 legs"}; + Configurable cfg_max_chi2kf{"cfg_max_chi2kf", 1e+10, "max chi2/ndf with KF"}; + Configurable cfg_require_v0_with_correct_xz{"cfg_require_v0_with_correct_xz", true, "flag to select V0s with correct xz"}; + Configurable cfg_reject_v0_on_itsib{"cfg_reject_v0_on_itsib", true, "flag to reject V0s on ITSib"}; + Configurable cfg_min_ncluster_tpc{"cfg_min_ncluster_tpc", 0, "min ncluster tpc"}; + Configurable cfg_min_ncrossedrows{"cfg_min_ncrossedrows", 40, "min ncrossed rows"}; + Configurable cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 999.f, "max fraction of shared clusters in TPC"}; + Configurable cfg_max_chi2tpc{"cfg_max_chi2tpc", 4.0, "max chi2/NclsTPC"}; + Configurable cfg_max_chi2its{"cfg_max_chi2its", 5.0, "max chi2/NclsITS"}; + Configurable cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -3.0, "min. TPC n sigma for electron"}; + Configurable cfg_max_TPCNsigmaEl{"cfg_max_TPCNsigmaEl", +3.0, "max. TPC n sigma for electron"}; + Configurable cfg_disable_itsonly_track{"cfg_disable_itsonly_track", false, "flag to disable ITSonly tracks"}; + Configurable cfg_disable_tpconly_track{"cfg_disable_tpconly_track", false, "flag to disable TPConly tracks"}; + } pcmcuts; + + HistogramRegistry fRegistry{"output", {}, OutputObjHandlingPolicy::AnalysisObject, false, false}; + + void init(InitContext& /*context*/) + { + DefineEMEventCut(); + DefinePCMCut(); + addhistograms(); + } + + ~prefilterPhoton() {} + + void addhistograms() + { + const AxisSpec axis_mass{200, 0, 0.8, "m_{#gamma#gamma} (GeV/c^{2})"}; + const AxisSpec axis_pair_pt{100, 0, 10, "p_{T,#gamma#gamma} (GeV/c)"}; + + // for pair + fRegistry.add("Pair/before/hMvsPt", "m_{#gamma#gamma} vs. p_{T,#gamma#gamma}", kTH2D, {axis_mass, axis_pair_pt}, true); + fRegistry.addClone("Pair/before/", "Pair/after/"); + } + + void DefineEMEventCut() + { + fEMEventCut = EMPhotonEventCut("fEMEventCut", "fEMEventCut"); + fEMEventCut.SetRequireSel8(eventcuts.cfgRequireSel8); + fEMEventCut.SetRequireFT0AND(eventcuts.cfgRequireFT0AND); + fEMEventCut.SetZvtxRange(-eventcuts.cfgZvtxMax, +eventcuts.cfgZvtxMax); + fEMEventCut.SetRequireNoTFB(eventcuts.cfgRequireNoTFB); + fEMEventCut.SetRequireNoITSROFB(eventcuts.cfgRequireNoITSROFB); + fEMEventCut.SetRequireNoSameBunchPileup(eventcuts.cfgRequireNoSameBunchPileup); + fEMEventCut.SetRequireGoodZvtxFT0vsPV(eventcuts.cfgRequireGoodZvtxFT0vsPV); + } + + void DefinePCMCut() + { + fV0PhotonCut = V0PhotonCut("fV0PhotonCut", "fV0PhotonCut"); + + // for v0 + fV0PhotonCut.SetV0PtRange(pcmcuts.cfg_min_pt_v0, 1e10f); + fV0PhotonCut.SetV0EtaRange(pcmcuts.cfg_min_eta_v0, pcmcuts.cfg_max_eta_v0); + fV0PhotonCut.SetMinCosPA(pcmcuts.cfg_min_cospa); + fV0PhotonCut.SetMaxPCA(pcmcuts.cfg_max_pca); + fV0PhotonCut.SetMaxChi2KF(pcmcuts.cfg_max_chi2kf); + fV0PhotonCut.SetRxyRange(pcmcuts.cfg_min_v0radius, pcmcuts.cfg_max_v0radius); + fV0PhotonCut.SetAPRange(pcmcuts.cfg_max_alpha_ap, pcmcuts.cfg_max_qt_ap); + fV0PhotonCut.RejectITSib(pcmcuts.cfg_reject_v0_on_itsib); + + // for track + fV0PhotonCut.SetMinNClustersTPC(pcmcuts.cfg_min_ncluster_tpc); + fV0PhotonCut.SetMinNCrossedRowsTPC(pcmcuts.cfg_min_ncrossedrows); + fV0PhotonCut.SetMinNCrossedRowsOverFindableClustersTPC(0.8); + fV0PhotonCut.SetMaxFracSharedClustersTPC(pcmcuts.cfg_max_frac_shared_clusters_tpc); + fV0PhotonCut.SetChi2PerClusterTPC(0.0, pcmcuts.cfg_max_chi2tpc); + fV0PhotonCut.SetTPCNsigmaElRange(pcmcuts.cfg_min_TPCNsigmaEl, pcmcuts.cfg_max_TPCNsigmaEl); + fV0PhotonCut.SetChi2PerClusterITS(-1e+10, pcmcuts.cfg_max_chi2its); + fV0PhotonCut.SetDisableITSonly(pcmcuts.cfg_disable_itsonly_track); + fV0PhotonCut.SetDisableTPConly(pcmcuts.cfg_disable_tpconly_track); + + fV0PhotonCut.SetNClustersITS(0, 7); + fV0PhotonCut.SetMeanClusterSizeITSob(0.0, 16.0); + fV0PhotonCut.SetIsWithinBeamPipe(pcmcuts.cfg_require_v0_with_correct_xz); + } + + std::unordered_map map_pfb; // map v0.globalIndex -> prefilter bit + + SliceCache cache; + Preslice perCollision_v0 = aod::v0photonkf::emeventId; + + Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); + Filter collisionFilter_occupancy_track = eventcuts.cfgTrackOccupancyMin <= o2::aod::evsel::trackOccupancyInTimeRange && o2::aod::evsel::trackOccupancyInTimeRange < eventcuts.cfgTrackOccupancyMax; + Filter collisionFilter_occupancy_ft0c = eventcuts.cfgFT0COccupancyMin <= o2::aod::evsel::ft0cOccupancyInTimeRange && o2::aod::evsel::ft0cOccupancyInTimeRange < eventcuts.cfgFT0COccupancyMax; + using FilteredMyCollisions = soa::Filtered; + + void processPFB(FilteredMyCollisions const& collisions, MyV0Photons const& v0s, aod::V0Legs const&) + { + + for (const auto& v0 : v0s) { + map_pfb[v0.globalIndex()] = 0; + } // end of v0 loop + + for (const auto& collision : collisions) { + // initCCDB(collision); + const float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; + bool is_cent_ok = true; + if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { + is_cent_ok = false; + } + + auto v0s_per_collision = v0s.sliceBy(perCollision_v0, collision.globalIndex()); + + if (!fEMEventCut.IsSelected(collision) || !is_cent_ok) { + for (const auto& v0 : v0s_per_collision) { + map_pfb[v0.globalIndex()] = 0; + } + continue; + } + + for (const auto& [g1, g2] : combinations(CombinationsStrictlyUpperIndexPolicy(v0s_per_collision, v0s_per_collision))) { + if (!fV0PhotonCut.template IsSelected(g1) || !fV0PhotonCut.template IsSelected(g2)) { + continue; + } + // don't apply pair cut when you produce prefilter bit. + + ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.f); + ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.f); + ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; + + fRegistry.fill(HIST("Pair/before/hMvsPt"), v12.M(), v12.Pt()); + + if (pcmcuts.cfg_min_mass < v12.M() && v12.M() < pcmcuts.cfg_max_mass) { + map_pfb[g1.globalIndex()] |= 1 << static_cast(o2::aod::pwgem::photonmeson::utils::pairutil::PhotonPrefilterBitDerived::kPhotonFromPi0Default); + map_pfb[g2.globalIndex()] |= 1 << static_cast(o2::aod::pwgem::photonmeson::utils::pairutil::PhotonPrefilterBitDerived::kPhotonFromPi0Default); + } + } + } // end of collision loop + + for (auto& v0 : v0s) { + // LOGF(info, "map_pfb[%d] = %d", v0.globalIndex(), map_pfb[v0.globalIndex()]); + pfb_derived(map_pfb[v0.globalIndex()]); + } // end of v0 loop + + // check pfb. + for (auto& collision : collisions) { + const float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; + if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { + continue; + } + + if (!fEMEventCut.IsSelected(collision)) { + continue; + } + auto v0s_per_collision = v0s.sliceBy(perCollision_v0, collision.globalIndex()); + + for (const auto& [g1, g2] : combinations(CombinationsStrictlyUpperIndexPolicy(v0s_per_collision, v0s_per_collision))) { + if (!fV0PhotonCut.template IsSelected(g1) || !fV0PhotonCut.template IsSelected(g2)) { + continue; + } + if (map_pfb[g1.globalIndex()] != 0 || map_pfb[g2.globalIndex()] != 0) { + continue; + } + + ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.f); + ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.f); + ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; + fRegistry.fill(HIST("Pair/after/hMvsPt"), v12.M(), v12.Pt()); + } + } // end of collision loop + + map_pfb.clear(); + + } // end of process + PROCESS_SWITCH(prefilterPhoton, processPFB, "produce prefilter bit", false); + + void processDummy(MyV0Photons const& v0s) + { + for (int i = 0; i < v0s.size(); i++) { + pfb_derived(0); + } + } + PROCESS_SWITCH(prefilterPhoton, processDummy, "dummy", true); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc, TaskName{"prefilter-photon"})}; +} diff --git a/PWGEM/PhotonMeson/Utils/PairUtilities.h b/PWGEM/PhotonMeson/Utils/PairUtilities.h index 2277caea505..1f9cd8aa9dd 100644 --- a/PWGEM/PhotonMeson/Utils/PairUtilities.h +++ b/PWGEM/PhotonMeson/Utils/PairUtilities.h @@ -18,6 +18,14 @@ #include #include +namespace o2::aod::pwgem::photonmeson::utils::pairutil +{ +enum class PhotonPrefilterBitDerived : int { + kPhotonFromPi0Default = 0, // photon from pi0, default + kPhotonFromPi0Loose = 1, // photon from pi0, loose + kPhotonFromPi0Tight = 2, // photon from pi0, tight +}; +} // namespace o2::aod::pwgem::photonmeson::utils::pairutil namespace o2::aod::pwgem::photonmeson::photonpair { enum PairType { From d636311f401ed35aba4a448f5163c6471083149d Mon Sep 17 00:00:00 2001 From: nepeivodaRS <94179174+nepeivodaRS@users.noreply.github.com> Date: Fri, 28 Feb 2025 15:03:24 +0100 Subject: [PATCH 0470/1650] [PWGLF] gen. MC update in strangeness UPC analysis (#10243) Co-authored-by: ALICE Action Bot --- .../Tasks/Strangeness/derivedupcanalysis.cxx | 48 ++++++++++++------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/derivedupcanalysis.cxx b/PWGLF/Tasks/Strangeness/derivedupcanalysis.cxx index 820be5aa408..e8a08c185f0 100644 --- a/PWGLF/Tasks/Strangeness/derivedupcanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/derivedupcanalysis.cxx @@ -198,6 +198,9 @@ struct Derivedupcanalysis { Configurable minOccupancy{"minOccupancy", -1, "minimum occupancy from neighbouring collisions"}; Configurable maxOccupancy{"maxOccupancy", 1000, "maximum occupancy from neighbouring collisions"}; + // z vertex cut + Configurable maxZVtxPosition{"maxZVtxPosition", 10.0f, "max Z vtx position"}; + // Kinematic axes ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.2f, 2.4f, 2.6f, 2.8f, 3.0f, 3.2f, 3.4f, 3.6f, 3.8f, 4.0f, 4.4f, 4.8f, 5.2f, 5.6f, 6.0f, 6.5f, 7.0f, 7.5f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 17.0f, 19.0f, 21.0f, 23.0f, 25.0f, 30.0f, 35.0f, 40.0f, 50.0f}, "pt axis for v0 analysis"}; ConfigurableAxis axisPtXi{"axisPtXi", {VARIABLE_WIDTH, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.2f, 2.4f, 2.6f, 2.8f, 3.0f, 3.2f, 3.4f, 3.6f, 3.8f, 4.0f, 4.4f, 4.8f, 5.2f, 5.6f, 6.0f, 6.5f, 7.0f, 7.5f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 17.0f, 19.0f, 21.0f, 23.0f, 25.0f, 30.0f, 35.0f, 40.0f, 50.0f}, "pt axis for cascade analysis"}; @@ -1014,7 +1017,7 @@ struct Derivedupcanalysis { const std::array checks = {{ {true, true, 0.0}, // All collisions {requireIsTriggerTVX, collision.selection_bit(aod::evsel::kIsTriggerTVX), 1.0}, // Triggered by FT0M - {true, std::fabs(collision.posZ()) <= 10.f, 2.0}, // Vertex-Z selected + {true, std::fabs(collision.posZ()) < maxZVtxPosition, 2.0}, // Vertex-Z selected {rejectITSROFBorder, collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder), 3.0}, // Not at ITS ROF border {rejectTFBorder, collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder), 4.0}, // Not at TF border {requireIsVertexITSTPC, collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC), 5.0}, // At least one ITS-TPC track @@ -1576,10 +1579,10 @@ struct Derivedupcanalysis { PresliceUnsorted perMcCollision = aod::v0data::straMCCollisionId; - std::vector getListOfRecoCollIndices(StraMCCollisionsFull const& mcCollisions, - StraCollisonsFullMC const& collisions) + std::vector getListOfRecoCollIds(StraMCCollisionsFull const& mcCollisions, + StraCollisonsFullMC const& collisions) { - std::vector listBestCollisionIdx(mcCollisions.size(), -1); + std::vector listBestCollisionIds(mcCollisions.size(), -1); for (auto const& mcCollision : mcCollisions) { auto groupedCollisions = collisions.sliceBy(perMcCollision, mcCollision.globalIndex()); @@ -1588,15 +1591,23 @@ struct Derivedupcanalysis { int biggestNContribs = -1; int bestCollisionIndex = -1; for (auto const& collision : groupedCollisions) { + if (!acceptEvent(collision, false)) { + continue; + } + + int selGapSide = collision.isUPC() ? getGapSide(collision) : -1; + if (studyUPConly && (selGapSide < -0.5)) + continue; + if (biggestNContribs < collision.multPVTotalContributors()) { biggestNContribs = collision.multPVTotalContributors(); bestCollisionIndex = collision.globalIndex(); } } - listBestCollisionIdx[mcCollision.globalIndex()] = bestCollisionIndex; + listBestCollisionIds[mcCollision.globalIndex()] = bestCollisionIndex; } - return listBestCollisionIdx; + return listBestCollisionIds; } void fillGenMCHistogramsQA(StraMCCollisionsFull const& mcCollisions, StraCollisonsFullMC const& collisions) @@ -1605,7 +1616,7 @@ struct Derivedupcanalysis { histos.fill(HIST("eventQA/mc/hEventSelectionMC"), 0.0); histos.fill(HIST("eventQA/mc/hMCNParticlesEta10"), mcCollision.multMCNParticlesEta10(), 0 /* all gen. events*/); - if (std::abs(mcCollision.posZ()) > 10.f) + if (std::abs(mcCollision.posZ()) > maxZVtxPosition) continue; histos.fill(HIST("eventQA/mc/hEventSelectionMC"), 1.0); @@ -1629,14 +1640,14 @@ struct Derivedupcanalysis { if (studyUPConly && (selGapSide < -0.5)) continue; + ++nCollisions; + atLeastOne = true; + if (biggestNContribs < collision.multPVTotalContributors()) { biggestNContribs = collision.multPVTotalContributors(); centrality = collision.centFT0C(); nTracksGlobal = collision.multNTracksGlobal(); } - - ++nCollisions; - atLeastOne = true; } // Fill histograms @@ -1759,7 +1770,7 @@ struct Derivedupcanalysis { StraCollisonsFullMC const& collisions) { fillGenMCHistogramsQA(mcCollisions, collisions); - std::vector listBestCollisionIdx = getListOfRecoCollIndices(mcCollisions, collisions); + std::vector listBestCollisionIds = getListOfRecoCollIds(mcCollisions, collisions); // V0 start for (auto const& v0MC : V0MCCores) { // Consider only primaries @@ -1777,13 +1788,15 @@ struct Derivedupcanalysis { continue; auto mcCollision = v0MC.straMCCollision_as(); // take gen. collision - if (std::abs(mcCollision.posZ()) > 10.f) + + if (std::abs(mcCollision.posZ()) > maxZVtxPosition) continue; float centrality = -1.f; int nTracksGlobal = -1; - if (listBestCollisionIdx[mcCollision.globalIndex()] > -1) { - auto collision = collisions.iteratorAt(listBestCollisionIdx[mcCollision.globalIndex()]); + + if (listBestCollisionIds[mcCollision.globalIndex()] > -1) { + auto collision = collisions.iteratorAt(listBestCollisionIds[mcCollision.globalIndex()]); centrality = collision.centFT0C(); nTracksGlobal = collision.multNTracksGlobal(); } @@ -1816,13 +1829,14 @@ struct Derivedupcanalysis { continue; auto mcCollision = cascMC.straMCCollision_as(); // take gen. collision - if (std::abs(mcCollision.posZ()) > 10.f) + if (std::abs(mcCollision.posZ()) > maxZVtxPosition) continue; float centrality = -1.f; int nTracksGlobal = -1; - if (listBestCollisionIdx[mcCollision.globalIndex()] > -1) { - auto collision = collisions.iteratorAt(listBestCollisionIdx[mcCollision.globalIndex()]); + + if (listBestCollisionIds[mcCollision.globalIndex()] > -1) { + auto collision = collisions.iteratorAt(listBestCollisionIds[mcCollision.globalIndex()]); centrality = collision.centFT0C(); nTracksGlobal = collision.multNTracksGlobal(); } From d1fbdd7bd868b62a1d205708eb947f5f35ca89da Mon Sep 17 00:00:00 2001 From: sarjeetagami <162087855+sarjeetagami@users.noreply.github.com> Date: Fri, 28 Feb 2025 20:08:59 +0530 Subject: [PATCH 0471/1650] [PWGLF] modify event and track selection (#10247) Co-authored-by: sarjeeta gami --- .../Tasks/Resonances/phianalysisrun3_PbPb.cxx | 138 ++++++++++++++---- 1 file changed, 107 insertions(+), 31 deletions(-) diff --git a/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx b/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx index 31468db8754..425bb69d512 100644 --- a/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx +++ b/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx @@ -78,8 +78,6 @@ struct phianalysisrun3_PbPb { Configurable nsigmaCutCombined{"nsigmaCutCombined", 3.0, "Value of the TOF Nsigma cut"}; Configurable cfgNoMixedEvents{"cfgNoMixedEvents", 5, "Number of mixed events per event"}; Configurable fillOccupancy{"fillOccupancy", true, "fill Occupancy"}; - Configurable cfgOccupancyCut1{"cfgOccupancyCut1", 500, "Occupancy cut"}; - Configurable cfgOccupancyCut2{"cfgOccupancyCut2", 1500, "Occupancy cut"}; Configurable isNoTOF{"isNoTOF", false, "isNoTOF"}; Configurable additionalEvSel2{"additionalEvSel2", true, "Additional evsel2"}; Configurable additionalEvSel3{"additionalEvSel3", true, "Additional evsel3"}; @@ -98,6 +96,13 @@ struct phianalysisrun3_PbPb { Configurable confMaxRot{"confMaxRot", 7.0 * TMath::Pi() / 6.0, "Maximum of rotation"}; Configurable PDGcheck{"PDGcheck", true, "PDGcheck"}; Configurable Reco{"Reco", true, "Reco"}; + ConfigurableAxis binsImpactPar{"binsImpactPar", {VARIABLE_WIDTH, 0, 3.5, 5.67, 7.45, 8.85, 10.0, 11.21, 12.26, 13.28, 14.23, 15.27}, "Binning of the impact parameter axis"}; + ConfigurableAxis binsPt{"binsPt", {VARIABLE_WIDTH, 0.0, 0.1, 0.2, 0.3, 0.4, 0.6, 0.8, 1, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.5, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0, 10.0, 12.0}, "Binning of the pT axis"}; + ConfigurableAxis binsCent{"binsCent", {VARIABLE_WIDTH, 0.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0, 110.0}, "Binning of the centrality axis"}; + Configurable cfgCutCentrality{"cfgCutCentrality", 80.0f, "Accepted maximum Centrality"}; + Configurable cfgCutMaxOccupancy{"cfgCutMaxOccupancy", 2000.0f, "Accepted maximum Occupancy"}; + Configurable cfgApplyOccupancyCut{"cfgApplyOccupancyCut", false, "Apply maximum Occupancy"}; + Configurable cfgCutOccupancy{"cfgCutOccupancy", 3000, "Occupancy cut"}; Configurable genacceptancecut{"genacceptancecut", true, "use acceptance cut for generated"}; // MC @@ -105,7 +110,9 @@ struct phianalysisrun3_PbPb { Configurable avoidsplitrackMC{"avoidsplitrackMC", false, "avoid split track in MC"}; void init(o2::framework::InitContext&) { - + AxisSpec impactParAxis = {binsImpactPar, "Impact Parameter"}; + AxisSpec ptAxis = {binsPt, "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec centAxis = {binsCent, "V0M (%)"}; histos.add("hCentrality", "Centrality distribution", kTH1F, {{200, 0.0, 200.0}}); histos.add("hVtxZ", "Vertex distribution in Z;Z (cm)", kTH1F, {{400, -20.0, 20.0}}); histos.add("hOccupancy", "Occupancy distribution", kTH1F, {{500, 0, 50000}}); @@ -116,12 +123,12 @@ struct phianalysisrun3_PbPb { histos.add("h3PhiInvMassSame", "Invariant mass of Phi meson same", kTH3F, {{200, 0.0, 200.0}, {200, 0.0f, 20.0f}, {200, 0.9, 1.1}}); } else if (isMC) { histos.add("hMC", "MC Event statistics", kTH1F, {{10, 0.0f, 10.0f}}); - histos.add("EL1", "MC Event statistics", kTH2F, {{1, 0.0f, 1.0f}, {200, 0.0f, 20.0f}}); - histos.add("EL2", "MC Event statistics", kTH2F, {{1, 0.0f, 1.0f}, {200, 0.0, 200.0}}); - histos.add("ES1", "MC Event statistics", kTH2F, {{1, 0.0f, 1.0f}, {200, 0.0f, 20.0f}}); - histos.add("ES3", "MC Event statistics", kTH2F, {{1, 0.0f, 1.0f}, {200, 0.0f, 20.0f}}); - histos.add("ES2", "MC Event statistics", kTH2F, {{1, 0.0f, 1.0f}, {200, 0.0, 200.0}}); - histos.add("ES4", "MC Event statistics", kTH2F, {{1, 0.0f, 1.0f}, {200, 0.0, 200.0}}); + histos.add("EL1", "MC Event statistics", kTH1F, {impactParAxis}); + histos.add("EL2", "MC Event statistics", kTH1F, {centAxis}); + histos.add("ES1", "MC Event statistics", kTH1F, {impactParAxis}); + histos.add("ES3", "MC Event statistics", kTH1F, {impactParAxis}); + histos.add("ES2", "MC Event statistics", kTH1F, {centAxis}); + histos.add("ES4", "MC Event statistics", kTH1F, {centAxis}); histos.add("h1PhiGen", "Phi meson Gen", kTH1F, {{200, 0.0f, 20.0f}}); histos.add("h1PhiGen1", "Phi meson Gen", kTH1F, {{200, 0.0f, 20.0f}}); histos.add("h1PhiRecsplit", "Phi meson Rec split", kTH1F, {{200, 0.0f, 20.0f}}); @@ -135,6 +142,7 @@ struct phianalysisrun3_PbPb { histos.add("h3PhiInvMassSameMC", "Invariant mass of Phi meson same", kTH3F, {{200, 0.0, 200.0}, {200, 0.0f, 20.0f}, {200, 0.9, 1.1}}); histos.add("h3PhiInvMassRotMC", "Invariant mass of Phi meson Rotation", kTH3F, {{200, 0.0, 200.0}, {200, 0.0f, 20.0f}, {200, 0.9, 1.1}}); histos.add("h2PhiGen2", "Phi meson gen", kTH2F, {{200, 0.0f, 20.0f}, {200, 0.0, 200.0}}); + histos.add("h2PhiGen1", "Phi meson gen", kTH2F, {ptAxis, impactParAxis}); histos.add("h1PhiRec1", "Phi meson Rec", kTH1F, {{200, 0.0f, 20.0f}}); histos.add("h1Phimassgen", "Phi meson gen", kTH1F, {{200, 0.9, 1.1}}); histos.add("h1Phimassrec", "Phi meson Rec", kTH1F, {{200, 0.9, 1.1}}); @@ -144,12 +152,19 @@ struct phianalysisrun3_PbPb { histos.add("h1Phi1massrec", "Phi meson Rec", kTH1F, {{200, 0.9, 1.1}}); histos.add("h1Phipt", "Phi meson Rec", kTH1F, {{200, 0.0f, 20.0f}}); histos.add("hOccupancy1", "Occupancy distribution", kTH1F, {{500, 0, 50000}}); - histos.add("hImpactParameterGen", "Impact parameter of generated MC events", kTH1F, {{200, 0.0f, 20.0f}}); - histos.add("hImpactParameterRec", "Impact parameter of generated MC events", kTH1F, {{200, 0.0f, 20.0f}}); - histos.add("hImpactParameterGenCen", "Impact parameter of generated MC events", kTH2F, {{200, 0.0f, 20.0f}, {200, 0.0, 200.0}}); - histos.add("hImpactParameterRecCen", "Impact parameter of generated MC events", kTH2F, {{200, 0.0f, 20.0f}, {200, 0.0, 200.0}}); + histos.add("hImpactParameterGen", "Impact parameter of generated MC events", kTH1F, {impactParAxis}); + histos.add("hImpactParameterRec", "Impact parameter of generated MC events", kTH1F, {impactParAxis}); + histos.add("hImpactParameterGenCen", "Impact parameter of generated MC events", kTH2F, {impactParAxis, centAxis}); + histos.add("hImpactParameterRecCen", "Impact parameter of generated MC events", kTH2F, {impactParAxis, centAxis}); histos.add("TOF_Nsigma_MC", "TOF NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Kaon};", {HistType::kTH3D, {{200, -12, 12}, {200, 0.0, 200.0}, {200, 0.0f, 20.0f}}}); histos.add("TPC_Nsigma_MC", "TPC NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Kaon};", {HistType::kTH3D, {{200, -12, 12}, {200, 0.0, 200.0}, {200, 0.0f, 20.0f}}}); + if (doprocessEvtLossSigLossMC) { + histos.add("QAevent/hImpactParameterGen", "Impact parameter of generated MC events", kTH1F, {impactParAxis}); + histos.add("QAevent/hImpactParameterRec", "Impact parameter of selected MC events", kTH1F, {impactParAxis}); + histos.add("QAevent/hImpactParvsCentrRec", "Impact parameter of selected MC events vs centrality", kTH2F, {{120, 0.0f, 120.0f}, impactParAxis}); + histos.add("QAevent/phigenBeforeEvtSel", "phi before event selections", kTH2F, {ptAxis, impactParAxis}); + histos.add("QAevent/phigenAfterEvtSel", "phi after event selections", kTH2F, {ptAxis, impactParAxis}); + } } // DCA QA @@ -214,6 +229,22 @@ struct phianalysisrun3_PbPb { } return false; } + template + bool myEventSelections(const CollType& collision) + { + if (std::abs(collision.posZ()) > cfgCutVertex) + return false; + if (!collision.sel8()) + return false; + if (additionalEvSel2 && (!collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) + return false; + if (additionalEvSel3 && (!collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard))) + return false; + int occupancy = collision.trackOccupancyInTimeRange(); + if (fillOccupancy && (occupancy > cfgCutOccupancy)) + return false; + return true; + } // deep angle cut on pair to remove photon conversion template bool selectionPair(const T1& candidate1, const T2& candidate2) @@ -293,7 +324,7 @@ struct phianalysisrun3_PbPb { return; } int occupancy = collision.trackOccupancyInTimeRange(); - if (fillOccupancy && !(occupancy > cfgOccupancyCut1 && occupancy < cfgOccupancyCut2)) { + if (fillOccupancy && (occupancy > cfgCutOccupancy)) { return; } float multiplicity{-1}; @@ -374,10 +405,10 @@ struct phianalysisrun3_PbPb { } int occupancy1 = c1.trackOccupancyInTimeRange(); int occupancy2 = c2.trackOccupancyInTimeRange(); - if (fillOccupancy && !(occupancy1 > cfgOccupancyCut1 && occupancy1 < cfgOccupancyCut2)) { + if (fillOccupancy && (occupancy1 > cfgCutOccupancy)) { continue; } - if (fillOccupancy && !(occupancy2 > cfgOccupancyCut1 && occupancy2 < cfgOccupancyCut2)) { + if (fillOccupancy && (occupancy2 > cfgCutOccupancy)) { continue; } float multiplicity; @@ -421,7 +452,7 @@ struct phianalysisrun3_PbPb { return; } int occupancy = collision.trackOccupancyInTimeRange(); - if (fillOccupancy && !(occupancy > cfgOccupancyCut1 && occupancy < cfgOccupancyCut2)) { + if (fillOccupancy && (occupancy > cfgCutOccupancy)) { return; } float multiplicity{-1}; @@ -434,8 +465,8 @@ struct phianalysisrun3_PbPb { if (!selectionTrack(track1)) { continue; } - histos.fill(HIST("QAbefore/TPC_Nsigma_all"), track1.tpcNSigmaKa(), multiplicity); - histos.fill(HIST("QAbefore/TOF_Nsigma_all"), track1.tofNSigmaKa(), multiplicity); + histos.fill(HIST("QAbefore/TPC_Nsigma_all"), track1.tpcNSigmaKa(), multiplicity, track1.pt()); + histos.fill(HIST("QAbefore/TOF_Nsigma_all"), track1.tofNSigmaKa(), multiplicity, track1.pt()); histos.fill(HIST("QAbefore/trkDCAxy"), track1.dcaXY()); histos.fill(HIST("QAbefore/trkDCAz"), track1.dcaZ()); histos.fill(HIST("QAbefore/TOF_TPC_Mapka_all"), track1.tofNSigmaKa(), track1.tpcNSigmaKa()); @@ -512,8 +543,11 @@ struct phianalysisrun3_PbPb { histos.fill(HIST("hMC"), 5); continue; } + if (additionalEvSel2 && (!RecCollision.selection_bit(aod::evsel::kNoSameBunchPileup) || !RecCollision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { + continue; + } int occupancy = RecCollision.trackOccupancyInTimeRange(); - if (fillOccupancy && !(occupancy > cfgOccupancyCut1 && occupancy < cfgOccupancyCut2)) { + if (fillOccupancy && (occupancy > cfgCutOccupancy)) { continue; } if (TMath::Abs(RecCollision.posZ()) > cfgCutVertex) { @@ -682,8 +716,11 @@ struct phianalysisrun3_PbPb { if (!collision.sel8() || std::abs(collision.mcCollision().posZ()) > cfgCutVertex) { continue; } + if (additionalEvSel2 && (!collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { + continue; + } int occupancy = collision.trackOccupancyInTimeRange(); - if (fillOccupancy && !(occupancy > cfgOccupancyCut1 && occupancy < cfgOccupancyCut2)) { + if (fillOccupancy && (occupancy > cfgCutOccupancy)) { continue; } histos.fill(HIST("hOccupancy1"), occupancy); @@ -697,13 +734,13 @@ struct phianalysisrun3_PbPb { SelectedEvents.resize(nevts); const auto evtReconstructedAndSelected = std::find(SelectedEvents.begin(), SelectedEvents.end(), mcCollision.globalIndex()) != SelectedEvents.end(); - histos.fill(HIST("EL1"), 0, imp); - histos.fill(HIST("EL2"), 0, multiplicity); + histos.fill(HIST("EL1"), imp); + histos.fill(HIST("EL2"), multiplicity); if (Reco && !evtReconstructedAndSelected) { // Check that the event is reconstructed and that the reconstructed events pass the selection return; } - histos.fill(HIST("ES1"), 0, imp); - histos.fill(HIST("ES2"), 0, multiplicity); + histos.fill(HIST("ES1"), imp); + histos.fill(HIST("ES2"), multiplicity); for (auto& mcParticle : mcParticles) { if (std::abs(mcParticle.y()) >= 0.5) { continue; @@ -733,6 +770,7 @@ struct phianalysisrun3_PbPb { PhiMesonMother = KaonPlus + KaonMinus; histos.fill(HIST("h1PhiGen"), PhiMesonMother.pt()); histos.fill(HIST("h2PhiGen2"), PhiMesonMother.pt(), multiplicity); + histos.fill(HIST("h2PhiGen1"), PhiMesonMother.pt(), imp); histos.fill(HIST("h1Phimassgen"), PhiMesonMother.M()); histos.fill(HIST("h3PhiGen3"), PhiMesonMother.pt(), multiplicity, PhiMesonMother.M()); } @@ -747,8 +785,11 @@ struct phianalysisrun3_PbPb { if (std::abs(collision.mcCollision().posZ()) > cfgCutVertex || !collision.sel8()) { return; } + if (additionalEvSel2 && (!collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { + return; + } int occupancy = collision.trackOccupancyInTimeRange(); - if (fillOccupancy && !(occupancy > cfgOccupancyCut1 && occupancy < cfgOccupancyCut2)) { + if (fillOccupancy && (occupancy > cfgCutOccupancy)) { return; } auto multiplicity = collision.centFT0C(); @@ -756,8 +797,8 @@ struct phianalysisrun3_PbPb { float imp = collision.mcCollision().impactParameter(); histos.fill(HIST("hImpactParameterRec"), imp); histos.fill(HIST("hImpactParameterRecCen"), imp, multiplicity); - histos.fill(HIST("ES3"), 0, imp); - histos.fill(HIST("ES4"), 0, multiplicity); + histos.fill(HIST("ES3"), imp); + histos.fill(HIST("ES4"), multiplicity); auto oldindex = -999; for (auto track1 : tracks) { if (!selectionTrack(track1)) { @@ -866,7 +907,7 @@ struct phianalysisrun3_PbPb { return; } int occupancy = collision.trackOccupancyInTimeRange(); - if (fillOccupancy && !(occupancy > cfgOccupancyCut1 && occupancy < cfgOccupancyCut2)) { + if (fillOccupancy && (occupancy > cfgCutOccupancy)) { return; } float multiplicity{-1}; @@ -956,10 +997,10 @@ struct phianalysisrun3_PbPb { } int occupancy1 = c1.trackOccupancyInTimeRange(); int occupancy2 = c2.trackOccupancyInTimeRange(); - if (fillOccupancy && !(occupancy1 > cfgOccupancyCut1 && occupancy1 < cfgOccupancyCut2)) { + if (fillOccupancy && (occupancy1 > cfgCutOccupancy)) { continue; } - if (fillOccupancy && !(occupancy2 > cfgOccupancyCut1 && occupancy2 < cfgOccupancyCut2)) { + if (fillOccupancy && (occupancy2 > cfgCutOccupancy)) { continue; } auto multiplicity = c1.centFT0C(); @@ -994,6 +1035,41 @@ struct phianalysisrun3_PbPb { } } PROCESS_SWITCH(phianalysisrun3_PbPb, processMixedEventMC, "Process Mixed event MC", true); + void processEvtLossSigLossMC(aod::McCollisions::iterator const& mcCollision, aod::McParticles const& mcParticles, const soa::SmallGroups& recCollisions) + { + + // Event loss estimation + auto impactPar = mcCollision.impactParameter(); + histos.fill(HIST("QAevent/hImpactParameterGen"), impactPar); + + bool isSel = false; + auto centrality = -999.; + for (const auto& RecCollision : recCollisions) { + if (!myEventSelections(RecCollision)) + continue; + centrality = RecCollision.centFT0C(); + isSel = true; + } + + if (isSel) { + histos.fill(HIST("QAevent/hImpactParameterRec"), impactPar); + histos.fill(HIST("QAevent/hImpactParvsCentrRec"), centrality, impactPar); + } + + // Generated MC + for (const auto& mcPart : mcParticles) { + if (std::abs(mcPart.y()) >= 0.5 || std::abs(mcPart.pdgCode()) != 333) + continue; + + // signal loss estimation + histos.fill(HIST("QAevent/phigenBeforeEvtSel"), mcPart.pt(), impactPar); + if (isSel) { + // signal loss estimation + histos.fill(HIST("QAevent/phigenAfterEvtSel"), mcPart.pt(), impactPar); + } + } // end loop on gen particles + } + PROCESS_SWITCH(phianalysisrun3_PbPb, processEvtLossSigLossMC, "Process Signal Loss, Event Loss", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { From 8e367ca95f1f38b892f6cf4822ffa4ed8a21c915 Mon Sep 17 00:00:00 2001 From: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> Date: Fri, 28 Feb 2025 16:01:20 +0100 Subject: [PATCH 0472/1650] [PWGLF] Finish detached / collisionless findable implementation (#10226) Co-authored-by: ddobrigk --- .../TableProducer/Strangeness/CMakeLists.txt | 5 - .../Strangeness/strangenessbuilder.cxx | 740 +++++- .../strangenessbuilderfindable.cxx | 2129 ----------------- PWGLF/Utils/strangenessBuilderHelper.h | 69 +- 4 files changed, 675 insertions(+), 2268 deletions(-) delete mode 100644 PWGLF/TableProducer/Strangeness/strangenessbuilderfindable.cxx diff --git a/PWGLF/TableProducer/Strangeness/CMakeLists.txt b/PWGLF/TableProducer/Strangeness/CMakeLists.txt index 81647db03ee..565e4a7f19e 100644 --- a/PWGLF/TableProducer/Strangeness/CMakeLists.txt +++ b/PWGLF/TableProducer/Strangeness/CMakeLists.txt @@ -111,11 +111,6 @@ o2physics_add_dpl_workflow(strangenessbuilder PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DCAFitter KFParticle::KFParticle COMPONENT_NAME Analysis) - o2physics_add_dpl_workflow(strangenessbuilderfindable - SOURCES strangenessbuilderfindable.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DCAFitter KFParticle::KFParticle - COMPONENT_NAME Analysis) - o2physics_add_dpl_workflow(v0-selector SOURCES v0selector.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore diff --git a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx index 79a5ba0b98e..fb0475025aa 100644 --- a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx @@ -9,7 +9,10 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. // -// Strangeness builder task +// ======================== +/// \file strangenessbuilder.cxx +/// \brief Strangeness builder task +/// \author David Dobrigkeit Chinellato (david.dobrigkeit.chinellato@cern.ch) // ======================== // // This task produces all tables that may be necessary for @@ -21,6 +24,13 @@ // -- processRealData[Run2] .........: use this OR processMonteCarlo but NOT both // -- processMonteCarlo[Run2] .......: use this OR processRealData but NOT both // +// Most important configurables: +// -- enabledTables ......: key control bools to decide which tables to generate +// task will adapt algorithm to spare / spend CPU accordingly +// -- mc_findableMode ....: 0: only found (default), 1: add findable to found, 2: all findable +// When using findables, refer to FoundTag bools for checking if found +// -- v0builderopts ......: V0-specific building options (topological, etc) +// -- cascadebuilderopts .: cascade-specific building options (topological, etc) #include #include @@ -76,10 +86,12 @@ static const std::vector tableNames{ "CascToTraRefs", //.31 (interlink CascCores -> TraCascCores) "CascToKFRefs", //.32 (interlink CascCores -> KFCascCores) "TraToCascRefs", //.33 (interlink TraCascCores -> CascCores) - "KFToCascRefs" //.34 (interlink KFCascCores -> CascCores) + "KFToCascRefs", //.34 (interlink KFCascCores -> CascCores) + "V0FoundTags", //.35 (tags found vs findable V0s in findable mode) + "CascFoundTags" //.36 (tags found vs findable Cascades in findable mode) }; -static constexpr int nTablesConst = 35; +static constexpr int nTablesConst = 37; static const std::vector parameterNames{"enable"}; static const int defaultParameters[nTablesConst][nParameters]{ @@ -117,6 +129,8 @@ static const int defaultParameters[nTablesConst][nParameters]{ {-1}, {-1}, {-1}, + {-1}, + {-1}, {-1}}; // use parameters + cov mat non-propagated, aux info + (extension propagated) @@ -169,6 +183,8 @@ struct StrangenessBuilder { kCascToKFRefs, kTraToCascRefs, kKFToCascRefs, + kV0FoundTags, + kCascFoundTags, nTables }; //__________________________________________________ @@ -228,10 +244,16 @@ struct StrangenessBuilder { //__________________________________________________ // cascade interlinks - Produces cascToTraRefs; // cascades -> tracked - Produces cascToKFRefs; // cascades -> KF - Produces traToCascRefs; // tracked -> cascades - Produces kfToCascRefs; // KF -> cascades + // FIXME: commented out until strangederivedbuilder adjusted accordingly + // Produces cascToTraRefs; // cascades -> tracked + // Produces cascToKFRefs; // cascades -> KF + // Produces traToCascRefs; // tracked -> cascades + // Produces kfToCascRefs; // KF -> cascades + + //__________________________________________________ + // Findable tags + Produces v0FoundTag; + Produces cascFoundTag; Configurable> enabledTables{"enabledTables", {defaultParameters[0], nTables, nParameters, tableNames, parameterNames}, @@ -248,6 +270,8 @@ struct StrangenessBuilder { Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; } ccdbConfigurations; + Configurable mc_findableMode{"mc_findableMode", 0, "0: disabled; 1: add findable-but-not-found to existing V0s from AO2D; 2: reset V0s and generate only findable-but-not-found"}; + // V0 building options struct : ConfigurableGroup { std::string prefix = "v0BuilderOpts"; @@ -267,10 +291,12 @@ struct StrangenessBuilder { Configurable mc_populateV0MCCoresAsymmetric{"mc_populateV0MCCoresAsymmetric", true, "populate V0MCCores table for derived data analysis, create V0Cores -> V0MCCores interlink. Saves only labeled V0s."}; Configurable mc_treatPiToMuDecays{"mc_treatPiToMuDecays", true, "if true, will correctly capture pi -> mu and V0 label will still point to originating V0 decay in those cases. Nota bene: prong info will still be for the muon!"}; Configurable mc_rapidityWindow{"mc_rapidityWindow", 0.5, "rapidity window to save non-recoed candidates"}; - Configurable mc_addGeneratedK0Short{"mc_addGeneratedK0Short", false, "add V0MCCore entry for generated, not-recoed K0Short"}; - Configurable mc_addGeneratedLambda{"mc_addGeneratedLambda", false, "add V0MCCore entry for generated, not-recoed Lambda"}; - Configurable mc_addGeneratedAntiLambda{"mc_addGeneratedAntiLambda", false, "add V0MCCore entry for generated, not-recoed AntiLambda"}; + Configurable mc_addGeneratedK0Short{"mc_addGeneratedK0Short", true, "add V0MCCore entry for generated, not-recoed K0Short"}; + Configurable mc_addGeneratedLambda{"mc_addGeneratedLambda", true, "add V0MCCore entry for generated, not-recoed Lambda"}; + Configurable mc_addGeneratedAntiLambda{"mc_addGeneratedAntiLambda", true, "add V0MCCore entry for generated, not-recoed AntiLambda"}; Configurable mc_addGeneratedGamma{"mc_addGeneratedGamma", false, "add V0MCCore entry for generated, not-recoed Gamma"}; + Configurable mc_addGeneratedGammaMakeCollinear{"mc_addGeneratedGammaMakeCollinear", true, "when adding findable gammas, mark them as collinear"}; + Configurable mc_findableDetachedV0{"mc_findableDetachedV0", false, "if true, generate findable V0s that have collisionId -1. Caution advised."}; } v0BuilderOpts; // cascade building options @@ -298,12 +324,13 @@ struct StrangenessBuilder { // MC builder options Configurable mc_populateCascMCCoresSymmetric{"mc_populateCascMCCoresSymmetric", false, "populate CascMCCores table for derived data analysis, keep CascMCCores joinable with CascCores"}; Configurable mc_populateCascMCCoresAsymmetric{"mc_populateCascMCCoresAsymmetric", true, "populate CascMCCores table for derived data analysis, create CascCores -> CascMCCores interlink. Saves only labeled Cascades."}; - Configurable mc_addGeneratedXiMinus{"mc_addGeneratedXiMinus", false, "add CascMCCore entry for generated, not-recoed XiMinus"}; - Configurable mc_addGeneratedXiPlus{"mc_addGeneratedXiPlus", false, "add CascMCCore entry for generated, not-recoed XiPlus"}; - Configurable mc_addGeneratedOmegaMinus{"mc_addGeneratedOmegaMinus", false, "add CascMCCore entry for generated, not-recoed OmegaMinus"}; - Configurable mc_addGeneratedOmegaPlus{"mc_addGeneratedOmegaPlus", false, "add CascMCCore entry for generated, not-recoed OmegaPlus"}; + Configurable mc_addGeneratedXiMinus{"mc_addGeneratedXiMinus", true, "add CascMCCore entry for generated, not-recoed XiMinus"}; + Configurable mc_addGeneratedXiPlus{"mc_addGeneratedXiPlus", true, "add CascMCCore entry for generated, not-recoed XiPlus"}; + Configurable mc_addGeneratedOmegaMinus{"mc_addGeneratedOmegaMinus", true, "add CascMCCore entry for generated, not-recoed OmegaMinus"}; + Configurable mc_addGeneratedOmegaPlus{"mc_addGeneratedOmegaPlus", true, "add CascMCCore entry for generated, not-recoed OmegaPlus"}; Configurable mc_treatPiToMuDecays{"mc_treatPiToMuDecays", true, "if true, will correctly capture pi -> mu and V0 label will still point to originating V0 decay in those cases. Nota bene: prong info will still be for the muon!"}; Configurable mc_rapidityWindow{"mc_rapidityWindow", 0.5, "rapidity window to save non-recoed candidates"}; + Configurable mc_findableDetachedCascade{"mc_findableDetachedCascade", false, "if true, generate findable cascades that have collisionId -1. Caution advised."}; } cascadeBuilderOpts; o2::ccdb::CcdbApi ccdbApi; @@ -317,7 +344,6 @@ struct StrangenessBuilder { std::vector v0Map; // index to relate V0s -> v0sFromCascades // for establishing CascData/KFData/TraCascData interlinks - struct { std::vector cascCoreToCascades; std::vector kfCascCoreToCascades; @@ -327,6 +353,39 @@ struct StrangenessBuilder { std::vector cascadeToTraCascCores; } interlinks; + //*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+* + // struct to add abstraction layer between V0s, Cascades and build indices + // desirable for adding extra (findable, etc) V0s, Cascades to built list + struct trackEntry { + int globalId = -1; + int originId = -1; + int mcCollisionId = -1; + int pdgCode = -1; + }; + struct v0Entry { + int globalId = -1; + int collisionId = -1; + int posTrackId = -1; + int negTrackId = -1; + int v0Type = 0; + int pdgCode = 0; // undefined if not MC - useful for faster finding + int particleId = -1; // de-reference the V0 particle if necessary + bool isCollinearV0 = false; + bool found = false; + }; + struct cascadeEntry { + int globalId = -1; + int collisionId = -1; + int v0Id = -1; + int posTrackId = -1; + int negTrackId = -1; + int bachTrackId = -1; + bool found = false; + }; + std::vector v0List; + std::vector cascadeList; + std::vector sorted_v0; + std::vector sorted_cascade; //*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+* // Helper struct to contain V0MCCore information prior to filling struct mcV0info { @@ -384,6 +443,18 @@ struct StrangenessBuilder { auto h2 = histos.add("hInputStatistics", "hInputStatistics", kTH1D, {{nTablesConst, -0.5f, static_cast(nTablesConst)}}); h2->SetTitle("Input table sizes"); + if (mc_findableMode.value > 0) { + // save statistics of findable candidate processing + auto hFindable = histos.add("hFindableStatistics", "hFindableStatistics", kTH1D, {{6, -0.5f, 5.5f}}); + hFindable->SetTitle(Form("Findable mode: %i", static_cast(mc_findableMode.value))); + hFindable->GetXaxis()->SetBinLabel(1, "AO2D V0s"); + hFindable->GetXaxis()->SetBinLabel(2, "V0s to be built"); + hFindable->GetXaxis()->SetBinLabel(3, "V0s with collId -1"); + hFindable->GetXaxis()->SetBinLabel(4, "AO2D Cascades"); + hFindable->GetXaxis()->SetBinLabel(5, "Cascades to be built"); + hFindable->GetXaxis()->SetBinLabel(6, "Cascades with collId -1"); + } + mRunNumber = 0; mEnabledTables.resize(nTables, 0); @@ -433,6 +504,15 @@ struct StrangenessBuilder { if (doprocessMonteCarloRun2) { LOGF(info, " ===> process function enabled: processMonteCarloRun2"); } + if (mc_findableMode.value == 1) { + LOGF(info, " ===> findable mode 1 is enabled: complement reco-ed with non-found findable"); + } + if (mc_findableMode.value == 2) { + LOGF(info, " ===> findable mode 2 is enabled: re-generate all findable from scratch"); + } + + // list enabled tables + for (int i = 0; i < nTables; i++) { // printout to be improved in the future if (mEnabledTables[i]) { @@ -483,9 +563,24 @@ struct StrangenessBuilder { straHelper.cascadeselections.maxDaughterEta = cascadeBuilderOpts.maxDaughterEta; } - bool initCCDB(aod::BCsWithTimestamps const& bcs, aod::Collisions const& collisions) + // for sorting + template + std::vector sort_indices(const std::vector& v, bool doSorting = false) + { + std::vector idx(v.size()); + std::iota(idx.begin(), idx.end(), 0); + if (doSorting) { + // do sorting only if requested (not always necessary) + std::stable_sort(idx.begin(), idx.end(), + [&v](std::size_t i1, std::size_t i2) { return v[i1].collisionId < v[i2].collisionId; }); + } + return idx; + } + + template + bool initCCDB(aod::BCsWithTimestamps const& bcs, TCollisions const& collisions) { - auto bc = collisions.size() ? collisions.begin().bc_as() : bcs.begin(); + auto bc = collisions.size() ? collisions.begin().template bc_as() : bcs.begin(); if (!bcs.size()) { LOGF(warn, "No BC found, skipping this DF."); return false; // signal to skip this DF @@ -545,30 +640,426 @@ struct StrangenessBuilder { //__________________________________________________ void populateCascadeInterlinks() { - if (mEnabledTables[kCascToKFRefs]) { - for (const auto& cascCore : interlinks.cascCoreToCascades) { - cascToKFRefs(interlinks.cascadeToKFCascCores[cascCore]); - histos.fill(HIST("hTableBuildingStatistics"), kCascToKFRefs); - } - } - if (mEnabledTables[kCascToTraRefs]) { - for (const auto& cascCore : interlinks.cascCoreToCascades) { - cascToTraRefs(interlinks.cascadeToTraCascCores[cascCore]); - histos.fill(HIST("hTableBuildingStatistics"), kCascToTraRefs); - } - } - if (mEnabledTables[kKFToCascRefs]) { - for (const auto& kfCascCore : interlinks.kfCascCoreToCascades) { - kfToCascRefs(interlinks.cascadeToCascCores[kfCascCore]); - histos.fill(HIST("hTableBuildingStatistics"), kKFToCascRefs); + // if (mEnabledTables[kCascToKFRefs]) { + // for (const auto& cascCore : interlinks.cascCoreToCascades) { + // cascToKFRefs(interlinks.cascadeToKFCascCores[cascCore]); + // histos.fill(HIST("hTableBuildingStatistics"), kCascToKFRefs); + // } + // } + // if (mEnabledTables[kCascToTraRefs]) { + // for (const auto& cascCore : interlinks.cascCoreToCascades) { + // cascToTraRefs(interlinks.cascadeToTraCascCores[cascCore]); + // histos.fill(HIST("hTableBuildingStatistics"), kCascToTraRefs); + // } + // } + // if (mEnabledTables[kKFToCascRefs]) { + // for (const auto& kfCascCore : interlinks.kfCascCoreToCascades) { + // kfToCascRefs(interlinks.cascadeToCascCores[kfCascCore]); + // histos.fill(HIST("hTableBuildingStatistics"), kKFToCascRefs); + // } + // } + // if (mEnabledTables[kTraToCascRefs]) { + // for (const auto& traCascCore : interlinks.traCascCoreToCascades) { + // traToCascRefs(interlinks.cascadeToCascCores[traCascCore]); + // histos.fill(HIST("hTableBuildingStatistics"), kTraToCascRefs); + // } + // } + } + + //__________________________________________________ + template + void prepareBuildingLists(TCollisions const& collisions, TMCCollisions const& mcCollisions, TV0s const& v0s, TCascades const& cascades, TTracks const& tracks, TMCParticles const& mcParticles) + { + // this function prepares the v0List and cascadeList depending on + // how the task has been set up. Standard operation simply uses + // the existing V0s and Cascades from AO2D, while findable MC + // operation either complements with all findable-but-not-found + // or resets and fills with all findable. + // + // Whenever using findable candidates, they will be appropriately + // marked for posterior analysis using 'type' variables. + // + // findable mode legend: + // 0: simple passthrough of V0s, Cascades in AO2Ds + // (in data, this is the only mode possible!) + // 1: add extra findable that haven't been found + // 2: generate only findable (no background) + + // redo lists from scratch + v0List.clear(); + cascadeList.clear(); + sorted_v0.clear(); + sorted_cascade.clear(); + + trackEntry currentTrackEntry; + v0Entry currentV0Entry; + cascadeEntry currentCascadeEntry; + + std::vector bestCollisionArray; // stores McCollision -> Collision map + std::vector bestCollisionNContribsArray; // stores Ncontribs for biggest coll assoc to mccoll + + int collisionLessV0s = 0; + int collisionLessCascades = 0; + + if (mc_findableMode.value > 0) { + if constexpr (soa::is_table) { + // if mcCollisions exist, assemble mcColl -> bestRecoColl map here + bestCollisionArray.clear(); + bestCollisionNContribsArray.clear(); + bestCollisionArray.resize(mcCollisions.size(), -1); // marks not reconstructed + bestCollisionNContribsArray.resize(mcCollisions.size(), -1); // marks not reconstructed + + // single loop over double loop at a small cost in memory for extra array + for (const auto& collision : collisions) { + if (collision.has_mcCollision()) { + if (collision.numContrib() > bestCollisionNContribsArray[collision.mcCollisionId()]) { + bestCollisionArray[collision.mcCollisionId()] = collision.globalIndex(); + bestCollisionNContribsArray[collision.mcCollisionId()] = collision.numContrib(); + } + } + } // end collision loop + } // end is_table + } // end findable mode check + + if (mc_findableMode.value < 2) { + // simple passthrough: copy existing v0s to build list + for (const auto& v0 : v0s) { + currentV0Entry.globalId = v0.globalIndex(); + currentV0Entry.collisionId = v0.collisionId(); + currentV0Entry.posTrackId = v0.posTrackId(); + currentV0Entry.negTrackId = v0.negTrackId(); + currentV0Entry.v0Type = v0.v0Type(); + currentV0Entry.pdgCode = 0; + currentV0Entry.particleId = -1; + currentV0Entry.isCollinearV0 = v0.isCollinearV0(); + currentV0Entry.found = true; + v0List.push_back(currentV0Entry); } } - if (mEnabledTables[kTraToCascRefs]) { - for (const auto& traCascCore : interlinks.traCascCoreToCascades) { - traToCascRefs(interlinks.cascadeToCascCores[traCascCore]); - histos.fill(HIST("hTableBuildingStatistics"), kTraToCascRefs); + // any mode other than 0 will require mcParticles + if constexpr (soa::is_table) { + if (mc_findableMode.value > 0) { + // for search if existing or not + int v0ListReconstructedSize = v0List.size(); + + // find extra candidates, step 1: find subset of tracks that interest + std::vector positiveTrackArray; + std::vector negativeTrackArray; + // vector elements: track index, origin index [, mc collision id, pdg code] + int dummy = -1; // unnecessary in this path + for (const auto& track : tracks) { + if (!track.has_mcParticle()) { + continue; // skip this, it's trouble + } + auto particle = track.template mcParticle_as(); + int originParticleIndex = getOriginatingParticle(particle, dummy, v0BuilderOpts.mc_treatPiToMuDecays); + if (originParticleIndex < 0) { + continue; // skip this, it's trouble (2) + } + auto originParticle = mcParticles.rawIteratorAt(originParticleIndex); + + bool trackIsInteresting = false; + if ( + (originParticle.pdgCode() == 310 && v0BuilderOpts.mc_addGeneratedK0Short.value > 0) || + (originParticle.pdgCode() == 3122 && v0BuilderOpts.mc_addGeneratedLambda.value > 0) || + (originParticle.pdgCode() == -3122 && v0BuilderOpts.mc_addGeneratedAntiLambda.value > 0) || + (originParticle.pdgCode() == 22 && v0BuilderOpts.mc_addGeneratedGamma.value > 0)) { + trackIsInteresting = true; + } + if (!trackIsInteresting) { + continue; // skip this, it's uninteresting + } + + currentTrackEntry.globalId = static_cast(track.globalIndex()); + currentTrackEntry.originId = originParticleIndex; + currentTrackEntry.mcCollisionId = originParticle.mcCollisionId(); + currentTrackEntry.pdgCode = originParticle.pdgCode(); + + // now separate according to particle species + if (track.sign() < 0) { + negativeTrackArray.push_back(currentTrackEntry); + } else { + positiveTrackArray.push_back(currentTrackEntry); + } + } + + // Nested loop only with valuable tracks + for (const auto& positiveTrackIndex : positiveTrackArray) { + for (const auto& negativeTrackIndex : negativeTrackArray) { + if (positiveTrackIndex.originId != negativeTrackIndex.originId) { + continue; // not the same originating particle + } + // findable mode 1: add non-reconstructed as v0Type 8 + if (mc_findableMode.value == 1) { + bool detected = false; + for (int ii = 0; ii < v0ListReconstructedSize; ii++) { + // check if this particular combination already exists in v0List + if (v0List[ii].posTrackId == positiveTrackIndex.globalId && + v0List[ii].negTrackId == negativeTrackIndex.globalId) { + detected = true; + // override pdg code with something useful for cascade findable math + v0List[ii].pdgCode = positiveTrackIndex.pdgCode; + break; + } + } + if (detected == false) { + // collision index: from best-version-of-this-mcCollision + // nota bene: this could be negative, caution advised + currentV0Entry.globalId = -1; + currentV0Entry.collisionId = bestCollisionArray[positiveTrackIndex.mcCollisionId]; + currentV0Entry.posTrackId = positiveTrackIndex.globalId; + currentV0Entry.negTrackId = negativeTrackIndex.globalId; + currentV0Entry.v0Type = 1; // mark with bit 3 + currentV0Entry.pdgCode = positiveTrackIndex.pdgCode; + currentV0Entry.particleId = positiveTrackIndex.originId; + currentV0Entry.isCollinearV0 = false; + if (v0BuilderOpts.mc_addGeneratedGammaMakeCollinear.value && currentV0Entry.pdgCode == 22) { + currentV0Entry.isCollinearV0 = true; + } + currentV0Entry.found = false; + if (bestCollisionArray[positiveTrackIndex.mcCollisionId] < 0) { + collisionLessV0s++; + } + if (v0BuilderOpts.mc_findableDetachedV0.value || currentV0Entry.collisionId >= 0) { + v0List.push_back(currentV0Entry); + } + } + } + // findable mode 2: determine type based on V0 table, + // with type 8 being reserved to findable-but-not-found + if (mc_findableMode.value == 2) { + currentV0Entry.globalId = -1; + currentV0Entry.collisionId = bestCollisionArray[positiveTrackIndex.mcCollisionId]; + currentV0Entry.posTrackId = positiveTrackIndex.globalId; + currentV0Entry.negTrackId = negativeTrackIndex.globalId; + currentV0Entry.v0Type = 1; + currentV0Entry.pdgCode = positiveTrackIndex.pdgCode; + currentV0Entry.particleId = positiveTrackIndex.originId; + currentV0Entry.isCollinearV0 = false; + if (v0BuilderOpts.mc_addGeneratedGammaMakeCollinear.value && currentV0Entry.pdgCode == 22) { + currentV0Entry.isCollinearV0 = true; + } + currentV0Entry.found = false; + for (const auto& v0 : v0s) { + if (v0.posTrackId() == positiveTrackIndex.globalId && + v0.negTrackId() == negativeTrackIndex.globalId) { + // this will override type, but not collision index + // N.B.: collision index checks still desirable! + currentV0Entry.globalId = v0.globalIndex(); + currentV0Entry.v0Type = v0.v0Type(); + currentV0Entry.isCollinearV0 = v0.isCollinearV0(); + currentV0Entry.found = true; + break; + } + } + if (v0BuilderOpts.mc_findableDetachedV0.value || currentV0Entry.collisionId >= 0) { + v0List.push_back(currentV0Entry); + } + } + } + } // end positive / negative track loops + + // fill findable statistics table + histos.fill(HIST("hFindableStatistics"), 0.0, v0s.size()); + histos.fill(HIST("hFindableStatistics"), 1.0, v0List.size()); + histos.fill(HIST("hFindableStatistics"), 2.0, collisionLessV0s); + + } // end findableMode > 0 check + } // end soa::is_table + + // determine properly collision-id-sorted index array for later use + // N.B.: necessary also before cascade part + sorted_v0.clear(); + sorted_v0 = sort_indices(v0List, (mc_findableMode.value > 0)); + + // Cascade part if cores are requested, skip otherwise + if (mEnabledTables[kStoredCascCores] || mEnabledTables[kStoredKFCascCores]) { + if (mc_findableMode.value < 2) { + // simple passthrough: copy existing cascades to build list + for (const auto& cascade : cascades) { + auto const& v0 = cascade.v0(); + currentCascadeEntry.globalId = cascade.globalIndex(); + currentCascadeEntry.collisionId = cascade.collisionId(); + currentCascadeEntry.v0Id = v0.globalIndex(); + currentCascadeEntry.posTrackId = v0.posTrackId(); + currentCascadeEntry.negTrackId = v0.negTrackId(); + currentCascadeEntry.bachTrackId = cascade.bachelorId(); + currentCascadeEntry.found = true; + cascadeList.push_back(currentCascadeEntry); + } } + + // any mode other than 0 will require mcParticles + if constexpr (soa::is_table) { + if (mc_findableMode.value > 0) { + // for search if existing or not + size_t cascadeListReconstructedSize = cascadeList.size(); + + // determine which tracks are of interest + std::vector bachelorTrackArray; + // vector elements: track index, origin index, mc collision id, pdg code] + int dummy = -1; // unnecessary in this path + for (const auto& track : tracks) { + if (!track.has_mcParticle()) { + continue; // skip this, it's trouble + } + auto particle = track.template mcParticle_as(); + int originParticleIndex = getOriginatingParticle(particle, dummy, cascadeBuilderOpts.mc_treatPiToMuDecays); + if (originParticleIndex < 0) { + continue; // skip this, it's trouble (2) + } + auto originParticle = mcParticles.rawIteratorAt(originParticleIndex); + + bool trackIsInteresting = false; + if ( + (originParticle.pdgCode() == 3312 && cascadeBuilderOpts.mc_addGeneratedXiMinus.value > 0) || + (originParticle.pdgCode() == -3312 && cascadeBuilderOpts.mc_addGeneratedXiPlus.value > 0) || + (originParticle.pdgCode() == 3334 && cascadeBuilderOpts.mc_addGeneratedOmegaMinus.value > 0) || + (originParticle.pdgCode() == -3334 && cascadeBuilderOpts.mc_addGeneratedOmegaPlus.value > 0)) { + trackIsInteresting = true; + } + if (!trackIsInteresting) { + continue; // skip this, it's uninteresting + } + + currentTrackEntry.globalId = static_cast(track.globalIndex()); + currentTrackEntry.originId = originParticleIndex; + currentTrackEntry.mcCollisionId = originParticle.mcCollisionId(); + currentTrackEntry.pdgCode = originParticle.pdgCode(); + + // populate list of bachelor tracks to pair + bachelorTrackArray.push_back(currentTrackEntry); + } + + // determine which V0s are of interest to pair and do pairing + for (size_t v0i = 0; v0i < v0List.size(); v0i++) { + auto v0 = v0List[sorted_v0[v0i]]; + + if (std::abs(v0.pdgCode) != 3122) { + continue; // this V0 isn't a lambda, can't come from a cascade: skip + } + if (v0.particleId < 0) { + continue; // no de-referencing possible (e.g. background, ...) + } + auto v0Particle = mcParticles.rawIteratorAt(v0.particleId); + + int v0OriginParticleIndex = -1; + if (v0Particle.has_mothers()) { + auto const& motherList = v0Particle.template mothers_as(); + if (motherList.size() == 1) { + for (const auto& mother : motherList) { + v0OriginParticleIndex = mother.globalIndex(); + } + } + } + if (v0OriginParticleIndex < 0) { + continue; + } + auto v0OriginParticle = mcParticles.rawIteratorAt(v0OriginParticleIndex); + + if (std::abs(v0OriginParticle.pdgCode()) != 3312 && std::abs(v0OriginParticle.pdgCode()) != 3334) { + continue; // this V0 does not come from any particle of interest, don't try + } + for (const auto& bachelorTrackIndex : bachelorTrackArray) { + if (bachelorTrackIndex.originId != v0OriginParticle.globalIndex()) { + continue; + } + // if we are here: v0 origin is 3312 or 3334, bachelor origin matches V0 origin + // findable mode 1: add non-reconstructed as cascadeType 1 + if (mc_findableMode.value == 1) { + bool detected = false; + for (size_t ii = 0; ii < cascadeListReconstructedSize; ii++) { + // check if this particular combination already exists in cascadeList + // caution: use track indices (immutable) but not V0 indices (re-indexing) + if (cascadeList[ii].posTrackId == v0.posTrackId && + cascadeList[ii].negTrackId == v0.negTrackId && + cascadeList[ii].bachTrackId == bachelorTrackIndex.globalId) { + detected = true; + break; + } + } + if (detected == false) { + // collision index: from best-version-of-this-mcCollision + // nota bene: this could be negative, caution advised + currentCascadeEntry.globalId = -1; + currentCascadeEntry.collisionId = bestCollisionArray[bachelorTrackIndex.mcCollisionId]; + currentCascadeEntry.v0Id = v0i; // correct information here + currentCascadeEntry.posTrackId = v0.posTrackId; + currentCascadeEntry.negTrackId = v0.negTrackId; + currentCascadeEntry.bachTrackId = bachelorTrackIndex.globalId; + currentCascadeEntry.found = false; + cascadeList.push_back(currentCascadeEntry); + if (bestCollisionArray[bachelorTrackIndex.mcCollisionId] < 0) { + collisionLessCascades++; + } + if (cascadeBuilderOpts.mc_findableDetachedCascade.value || currentCascadeEntry.collisionId >= 0) { + cascadeList.push_back(currentCascadeEntry); + } + } + } + + // findable mode 2: determine type based on cascade table, + // with type 1 being reserved to findable-but-not-found + if (mc_findableMode.value == 2) { + currentCascadeEntry.globalId = -1; + currentCascadeEntry.collisionId = bestCollisionArray[bachelorTrackIndex.mcCollisionId]; + currentCascadeEntry.v0Id = v0i; // fill this in one go later + currentCascadeEntry.posTrackId = v0.posTrackId; + currentCascadeEntry.negTrackId = v0.negTrackId; + currentCascadeEntry.bachTrackId = bachelorTrackIndex.globalId; + currentCascadeEntry.found = false; + if (bestCollisionArray[bachelorTrackIndex.mcCollisionId] < 0) { + collisionLessCascades++; + } + for (const auto& cascade : cascades) { + auto const& v0fromAOD = cascade.v0(); + if (v0fromAOD.posTrackId() == v0.posTrackId && + v0fromAOD.negTrackId() == v0.negTrackId && + cascade.bachelorId() == bachelorTrackIndex.globalId) { + // this will override type, but not collision index + // N.B.: collision index checks still desirable! + currentCascadeEntry.found = true; + currentCascadeEntry.globalId = cascade.globalIndex(); + break; + } + } + if (cascadeBuilderOpts.mc_findableDetachedCascade.value || currentCascadeEntry.collisionId >= 0) { + cascadeList.push_back(currentCascadeEntry); + } + } + } // end bachelorTrackArray loop + } // end v0List loop + + // at this stage, cascadeList is alright, but the v0 indices are still not + // correct. We'll have to loop over all V0s and find the appropriate matches + // ---> but only in mode 1, and only for AO2D-native V0s + if (mc_findableMode.value == 1) { + for (size_t casci = 0; casci < cascadeListReconstructedSize; casci++) { + // loop over v0List to find corresponding v0 index, but do it in sorted way + for (size_t v0i = 0; v0i < v0List.size(); v0i++) { + auto v0 = v0List[sorted_v0[v0i]]; + if (cascadeList[casci].posTrackId == v0.posTrackId && + cascadeList[casci].negTrackId == v0.negTrackId) { + cascadeList[casci].v0Id = v0i; // fix, point to correct V0 index + break; + } + } + } + } + // we should now be done! collect statistics + histos.fill(HIST("hFindableStatistics"), 3.0, cascades.size()); + histos.fill(HIST("hFindableStatistics"), 4.0, cascadeList.size()); + histos.fill(HIST("hFindableStatistics"), 5.0, collisionLessCascades); + + } // end findable mode check + } // end soa::is_table + + // we need to allow for sorted use of cascadeList + sorted_cascade.clear(); + sorted_cascade = sort_indices(cascadeList, (mc_findableMode.value > 0)); } + + LOGF(info, "AO2D input: %i V0s, %i cascades. Building list sizes: %i V0s, %i cascades", v0s.size(), cascades.size(), v0List.size(), cascadeList.size()); } //__________________________________________________ @@ -578,18 +1069,19 @@ struct StrangenessBuilder { int v0sUsedInCascades = 0; v0sFromCascades.clear(); v0Map.clear(); - v0Map.resize(v0s.size(), -2); // marks not used + v0Map.resize(v0List.size(), -2); // marks not used if (mEnabledTables[kStoredCascCores]) { - for (const auto& cascade : cascades) { - if (v0Map[cascade.v0Id()] == -2) { + for (const auto& cascade : cascadeList) { + if (v0Map[cascade.v0Id] == -2) { v0sUsedInCascades++; } - v0Map[cascade.v0Id()] = -1; // marks used (but isn't the index of a properly built V0, which would be >= 0) + v0Map[cascade.v0Id] = -1; // marks used (but isn't the index of a properly built V0, which would be >= 0) } } int trackedCascadeCount = 0; if constexpr (soa::is_table) { - if (mEnabledTables[kStoredTraCascCores]) { + // tracked only created outside of findable mode + if (mEnabledTables[kStoredTraCascCores] && mc_findableMode.value == 0) { trackedCascadeCount = trackedCascades.size(); for (const auto& trackedCascade : trackedCascades) { auto const& cascade = trackedCascade.cascade(); @@ -604,8 +1096,8 @@ struct StrangenessBuilder { } //__________________________________________________ - template - void buildV0s(TV0s const& v0s, TMCParticles const& mcParticles) + template + void buildV0s(TCollisions const& collisions, TV0s const& v0s, TTracks const& tracks, TMCParticles const& mcParticles) { // prepare MC containers (not necessarily used) std::vector mcV0infos; // V0MCCore information @@ -619,32 +1111,42 @@ struct StrangenessBuilder { int nV0s = 0; // Loops over all V0s in the time frame histos.fill(HIST("hInputStatistics"), kV0CoresBase, v0s.size()); - for (const auto& v0 : v0s) { - if (!mEnabledTables[kV0CoresBase] && v0Map[v0.globalIndex()] == -2) { + for (size_t iv0 = 0; iv0 < v0List.size(); iv0++) { + const auto& v0 = v0List[sorted_v0[iv0]]; + + if (!mEnabledTables[kV0CoresBase] && v0Map[iv0] == -2) { // this v0 hasn't been used by cascades and we're not generating V0s, so skip it v0dataLink(-1, -1); continue; } // Get tracks and generate candidate - auto const& collision = v0.collision(); - auto const& posTrack = v0.template posTrack_as(); - auto const& negTrack = v0.template negTrack_as(); - if (!straHelper.buildV0Candidate(collision, posTrack, negTrack, v0.isCollinearV0(), mEnabledTables[kV0Covs])) { + // if collisionId positive: get vertex, negative: origin + // could be replaced by mean vertex (but without much benefit...) + float pvX = 0.0f, pvY = 0.0f, pvZ = 0.0f; + if (v0.collisionId >= 0) { + auto const& collision = collisions.rawIteratorAt(v0.collisionId); + pvX = collision.posX(); + pvY = collision.posY(); + pvZ = collision.posZ(); + } + auto const& posTrack = tracks.rawIteratorAt(v0.posTrackId); + auto const& negTrack = tracks.rawIteratorAt(v0.negTrackId); + if (!straHelper.buildV0Candidate(v0.collisionId, pvX, pvY, pvZ, posTrack, negTrack, v0.isCollinearV0, mEnabledTables[kV0Covs])) { v0dataLink(-1, -1); continue; } - if (v0Map[v0.globalIndex()] == -1) { - v0Map[v0.globalIndex()] = v0sFromCascades.size(); // provide actual valid index in buffer + if (v0Map[iv0] == -1) { + v0Map[iv0] = v0sFromCascades.size(); // provide actual valid index in buffer v0sFromCascades.push_back(straHelper.v0); } // fill requested cursors only if type is not 0 - if (v0.v0Type() == 1 || (v0.v0Type() > 1 && v0BuilderOpts.generatePhotonCandidates)) { + if (v0.v0Type == 1 || (v0.v0Type > 1 && v0BuilderOpts.generatePhotonCandidates)) { nV0s++; if (mEnabledTables[kV0Indices]) { // for referencing (especially - but not only - when using derived data) - v0indices(v0.posTrackId(), v0.negTrackId(), - v0.collisionId(), v0.globalIndex()); + v0indices(v0.posTrackId, v0.negTrackId, + v0.collisionId, iv0); histos.fill(HIST("hTableBuildingStatistics"), kV0Indices); } if (mEnabledTables[kV0TrackXs]) { @@ -662,7 +1164,7 @@ struct StrangenessBuilder { straHelper.v0.negativeDCAxy, TMath::Cos(straHelper.v0.pointingAngle), straHelper.v0.dcaXY, - v0.v0Type()); + v0.v0Type); v0dataLink(v0cores.lastIndex(), -1); histos.fill(HIST("hTableBuildingStatistics"), kV0CoresBase); } @@ -765,6 +1267,12 @@ struct StrangenessBuilder { histos.fill(HIST("hTableBuildingStatistics"), kMcV0Labels); } + // Construct found tag + if (mEnabledTables[kV0FoundTags]) { + v0FoundTag(v0.found); + histos.fill(HIST("hTableBuildingStatistics"), kV0FoundTags); + } + // Mark mcParticle as recoed (no searching necessary afterwards) if (thisInfo.label > -1) { mcParticleIsReco[thisInfo.label] = true; @@ -794,7 +1302,7 @@ struct StrangenessBuilder { // code that is agnostic with respect to the joinability of // V0Cores and V0MCCores (always dereference -> safe) if (mEnabledTables[kV0CoreMCLabels]) { - v0CoreMCLabels(v0.globalIndex()); // interlink index + v0CoreMCLabels(iv0); // interlink index histos.fill(HIST("hTableBuildingStatistics"), kV0CoreMCLabels); } } @@ -1023,8 +1531,8 @@ struct StrangenessBuilder { } //__________________________________________________ - template - void buildCascades(TCascades const& cascades, TMCParticles const& mcParticles) + template + void buildCascades(TCollisions const& collisions, TCascades const& cascades, TTracks const& tracks, TMCParticles const& mcParticles) { // prepare MC containers (not necessarily used) std::vector mcCascinfos; // V0MCCore information @@ -1041,21 +1549,29 @@ struct StrangenessBuilder { int nCascades = 0; // Loops over all cascades in the time frame histos.fill(HIST("hInputStatistics"), kStoredCascCores, cascades.size()); - for (const auto& cascade : cascades) { + for (size_t icascade = 0; icascade < cascades.size(); icascade++) { // Get tracks and generate candidate - auto const& collision = cascade.collision(); - auto const& v0 = cascade.v0(); - auto const& posTrack = v0.template posTrack_as(); - auto const& negTrack = v0.template negTrack_as(); - auto const& bachTrack = cascade.template bachelor_as(); - if (v0Map[v0.globalIndex()] < 0) { + auto const& cascade = cascades[sorted_cascade[icascade]]; + // if collisionId positive: get vertex, negative: origin + // could be replaced by mean vertex (but without much benefit...) + float pvX = 0.0f, pvY = 0.0f, pvZ = 0.0f; + if (cascade.collisionId >= 0) { + auto const& collision = collisions.rawIteratorAt(cascade.collisionId); + pvX = collision.posX(); + pvY = collision.posY(); + pvZ = collision.posZ(); + } + auto const& posTrack = tracks.rawIteratorAt(cascade.posTrackId); + auto const& negTrack = tracks.rawIteratorAt(cascade.negTrackId); + auto const& bachTrack = tracks.rawIteratorAt(cascade.bachTrackId); + if (v0Map[cascade.v0Id] < 0) { // this V0 hasn't been stored / cached cascdataLink(-1); interlinks.cascadeToCascCores.push_back(-1); continue; // didn't work out, skip } - if (!straHelper.buildCascadeCandidate(collision, - v0sFromCascades[v0Map[v0.globalIndex()]], + if (!straHelper.buildCascadeCandidate(cascade.collisionId, pvX, pvY, pvZ, + v0sFromCascades[v0Map[cascade.v0Id]], posTrack, negTrack, bachTrack, @@ -1070,7 +1586,7 @@ struct StrangenessBuilder { // generate analysis tables as required if (mEnabledTables[kCascIndices]) { - cascidx(cascade.globalIndex(), + cascidx(cascade.globalId, straHelper.cascade.positiveTrack, straHelper.cascade.negativeTrack, straHelper.cascade.bachelorTrack, straHelper.cascade.collisionId); histos.fill(HIST("hTableBuildingStatistics"), kCascIndices); @@ -1090,7 +1606,7 @@ struct StrangenessBuilder { // interlink always produced if cascades generated cascdataLink(cascdata.lastIndex()); - interlinks.cascCoreToCascades.push_back(cascade.globalIndex()); + interlinks.cascCoreToCascades.push_back(cascade.globalId); interlinks.cascadeToCascCores.push_back(cascdata.lastIndex()); } @@ -1121,6 +1637,12 @@ struct StrangenessBuilder { histos.fill(HIST("hTableBuildingStatistics"), kMcCascLabels); } + // Construct found tag + if (mEnabledTables[kCascFoundTags]) { + cascFoundTag(cascade.found); + histos.fill(HIST("hTableBuildingStatistics"), kCascFoundTags); + } + // Mark mcParticle as recoed (no searching necessary afterwards) if (thisCascInfo.label > -1) { mcParticleIsReco[thisCascInfo.label] = true; @@ -1333,8 +1855,8 @@ struct StrangenessBuilder { } //__________________________________________________ - template - void buildKFCascades(TCascades const& cascades, TMCParticles const& mcParticles) + template + void buildKFCascades(TCollisions const& collisions, TCascades const& cascades, TTracks const& tracks, TMCParticles const& mcParticles) { if (!mEnabledTables[kStoredKFCascCores]) { return; // don't do if no request for cascades in place @@ -1342,14 +1864,22 @@ struct StrangenessBuilder { int nCascades = 0; // Loops over all cascades in the time frame histos.fill(HIST("hInputStatistics"), kStoredKFCascCores, cascades.size()); - for (const auto& cascade : cascades) { + for (size_t icascade = 0; icascade < cascades.size(); icascade++) { // Get tracks and generate candidate - auto const& collision = cascade.collision(); - auto const& v0 = cascade.v0(); - auto const& posTrack = v0.template posTrack_as(); - auto const& negTrack = v0.template negTrack_as(); - auto const& bachTrack = cascade.template bachelor_as(); - if (!straHelper.buildCascadeCandidateWithKF(collision, + auto const& cascade = cascades[sorted_cascade[icascade]]; + // if collisionId positive: get vertex, negative: origin + // could be replaced by mean vertex (but without much benefit...) + float pvX = 0.0f, pvY = 0.0f, pvZ = 0.0f; + if (cascade.collisionId >= 0) { + auto const& collision = collisions.rawIteratorAt(cascade.collisionId); + pvX = collision.posX(); + pvY = collision.posY(); + pvZ = collision.posZ(); + } + auto const& posTrack = tracks.rawIteratorAt(cascade.posTrackId); + auto const& negTrack = tracks.rawIteratorAt(cascade.negTrackId); + auto const& bachTrack = tracks.rawIteratorAt(cascade.bachTrackId); + if (!straHelper.buildCascadeCandidateWithKF(cascade.collisionId, pvX, pvY, pvZ, posTrack, negTrack, bachTrack, @@ -1368,7 +1898,7 @@ struct StrangenessBuilder { // generate analysis tables as required if (mEnabledTables[kKFCascIndices]) { - kfcascidx(cascade.globalIndex(), + kfcascidx(cascade.globalId, straHelper.cascade.positiveTrack, straHelper.cascade.negativeTrack, straHelper.cascade.bachelorTrack, straHelper.cascade.collisionId); histos.fill(HIST("hTableBuildingStatistics"), kKFCascIndices); @@ -1392,7 +1922,7 @@ struct StrangenessBuilder { // interlink always produced if cascades generated kfcascdataLink(kfcascdata.lastIndex()); - interlinks.kfCascCoreToCascades.push_back(cascade.globalIndex()); + interlinks.kfCascCoreToCascades.push_back(cascade.globalId); interlinks.cascadeToKFCascCores.push_back(kfcascdata.lastIndex()); } if (mEnabledTables[kKFCascCovs]) { @@ -1421,8 +1951,8 @@ struct StrangenessBuilder { template void buildTrackedCascades(TStrangeTracks const& cascadeTracks, TMCParticles const& mcParticles) { - if (!mEnabledTables[kStoredTraCascCores]) { - return; // don't do if no request for cascades in place + if (!mEnabledTables[kStoredTraCascCores] || mc_findableMode.value != 0) { + return; // don't do if no request for cascades in place or findable mode used } int nCascades = 0; // Loops over all V0s in the time frame @@ -1434,12 +1964,21 @@ struct StrangenessBuilder { auto const& strangeTrack = cascadeTrack.template track_as(); auto const& collision = strangeTrack.collision(); + // if collisionId positive: get vertex, negative: origin + // could be replaced by mean vertex (but without much benefit...) + float pvX = 0.0f, pvY = 0.0f, pvZ = 0.0f; + if (strangeTrack.has_collision()) { + auto const& collision = strangeTrack.collision(); + pvX = collision.posX(); + pvY = collision.posY(); + pvZ = collision.posZ(); + } auto const& cascade = cascadeTrack.cascade(); auto const& v0 = cascade.v0(); auto const& posTrack = v0.template posTrack_as(); auto const& negTrack = v0.template negTrack_as(); auto const& bachTrack = cascade.template bachelor_as(); - if (!straHelper.buildCascadeCandidate(collision, + if (!straHelper.buildCascadeCandidate(strangeTrack.collisionId(), pvX, pvY, pvZ, posTrack, negTrack, bachTrack, @@ -1550,8 +2089,8 @@ struct StrangenessBuilder { } //__________________________________________________ - template - void dataProcess(TCollisions const& collisions, TV0s const& v0s, TCascades const& cascades, TTrackedCascades const& trackedCascades, TTracks const&, TBCs const& bcs, TMCParticles const& mcParticles) + template + void dataProcess(TCollisions const& collisions, TMCCollisions const& mccollisions, TV0s const& v0s, TCascades const& cascades, TTrackedCascades const& trackedCascades, TTracks const& tracks, TBCs const& bcs, TMCParticles const& mcParticles) { if (!initCCDB(bcs, collisions)) return; @@ -1559,15 +2098,18 @@ struct StrangenessBuilder { // reset vectors for cascade interlinks resetInterlinks(); + // prepare v0List, cascadeList + prepareBuildingLists(collisions, mccollisions, v0s, cascades, tracks, mcParticles); + // mark V0s that will be buffered for the cascade building - markV0sUsedInCascades(v0s, cascades, trackedCascades); + markV0sUsedInCascades(v0List, cascadeList, trackedCascades); // build V0s - buildV0s(v0s, mcParticles); + buildV0s(collisions, v0List, tracks, mcParticles); // build cascades - buildCascades(cascades, mcParticles); - buildKFCascades(cascades, mcParticles); + buildCascades(collisions, cascadeList, tracks, mcParticles); + buildKFCascades(collisions, cascadeList, tracks, mcParticles); // build tracked cascades only if subscription is Run 3 like (doesn't exist in Run 2) if constexpr (soa::is_table) { @@ -1579,34 +2121,28 @@ struct StrangenessBuilder { void processRealData(aod::Collisions const& collisions, aod::V0s const& v0s, aod::Cascades const& cascades, aod::TrackedCascades const& trackedCascades, FullTracksExtIU const& tracks, aod::BCsWithTimestamps const& bcs) { - dataProcess(collisions, v0s, cascades, trackedCascades, tracks, bcs, static_cast(nullptr)); + dataProcess(collisions, static_cast(nullptr), v0s, cascades, trackedCascades, tracks, bcs, static_cast(nullptr)); } void processRealDataRun2(aod::Collisions const& collisions, aod::V0s const& v0s, aod::Cascades const& cascades, FullTracksExt const& tracks, aod::BCsWithTimestamps const& bcs) { - dataProcess(collisions, v0s, cascades, static_cast(nullptr), tracks, bcs, static_cast(nullptr)); - } - - void processMonteCarlo(aod::Collisions const& collisions, aod::V0s const& v0s, aod::Cascades const& cascades, aod::TrackedCascades const& trackedCascades, FullTracksExtLabeledIU const& tracks, aod::BCsWithTimestamps const& bcs, aod::McParticles const& mcParticles) - { - dataProcess(collisions, v0s, cascades, trackedCascades, tracks, bcs, mcParticles); + dataProcess(collisions, static_cast(nullptr), v0s, cascades, static_cast(nullptr), tracks, bcs, static_cast(nullptr)); } - void processMonteCarloRun2(aod::Collisions const& collisions, aod::V0s const& v0s, aod::Cascades const& cascades, FullTracksExtLabeled const& tracks, aod::BCsWithTimestamps const& bcs, aod::McParticles const& mcParticles) + void processMonteCarlo(soa::Join const& collisions, aod::McCollisions const& mccollisions, aod::V0s const& v0s, aod::Cascades const& cascades, aod::TrackedCascades const& trackedCascades, FullTracksExtLabeledIU const& tracks, aod::BCsWithTimestamps const& bcs, aod::McParticles const& mcParticles) { - dataProcess(collisions, v0s, cascades, static_cast(nullptr), tracks, bcs, mcParticles); + dataProcess(collisions, mccollisions, v0s, cascades, trackedCascades, tracks, bcs, mcParticles); } - void processSimulationFindable(aod::Collisions const& collisions, aod::FindableV0s const& v0s, aod::Cascades const& cascades, FullTracksExtIU const& tracks, aod::BCsWithTimestamps const& bcs) + void processMonteCarloRun2(soa::Join const& collisions, aod::McCollisions const& mccollisions, aod::V0s const& v0s, aod::Cascades const& cascades, FullTracksExtLabeled const& tracks, aod::BCsWithTimestamps const& bcs, aod::McParticles const& mcParticles) { - dataProcess(collisions, v0s, cascades, static_cast(nullptr), tracks, bcs, static_cast(nullptr)); + dataProcess(collisions, mccollisions, v0s, cascades, static_cast(nullptr), tracks, bcs, mcParticles); } PROCESS_SWITCH(StrangenessBuilder, processRealData, "process real data", true); PROCESS_SWITCH(StrangenessBuilder, processRealDataRun2, "process real data (Run 2)", false); PROCESS_SWITCH(StrangenessBuilder, processMonteCarlo, "process monte carlo", false); PROCESS_SWITCH(StrangenessBuilder, processMonteCarloRun2, "process monte carlo (Run 2)", false); - PROCESS_SWITCH(StrangenessBuilder, processSimulationFindable, "process simulation findable (requires lambdakzeromcfinder)", false); }; // Extends the v0data table with expression columns diff --git a/PWGLF/TableProducer/Strangeness/strangenessbuilderfindable.cxx b/PWGLF/TableProducer/Strangeness/strangenessbuilderfindable.cxx deleted file mode 100644 index 7b52db5b185..00000000000 --- a/PWGLF/TableProducer/Strangeness/strangenessbuilderfindable.cxx +++ /dev/null @@ -1,2129 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. -// -// ======================== -/// \file strangenessbuilder.cxx -/// \brief Strangeness builder task -/// \author David Dobrigkeit Chinellato (david.dobrigkeit.chinellato@cern.ch) -// ======================== -// -// This task produces all tables that may be necessary for -// strangeness analyses. A single device is provided to -// ensure better computing resource (memory) management. -// -// process functions: -// -// -- processRealData[Run2] .........: use this OR processMonteCarlo but NOT both -// -- processMonteCarlo[Run2] .......: use this OR processRealData but NOT both -// -// Most important configurables: -// -- enabledTables ......: key control bools to decide which tables to generate -// task will adapt algorithm to spare / spend CPU accordingly -// -- mc_findableMode ....: 0: only found (default), 1: add findable to found, 2: all findable -// When using findables, refer to FoundTag bools for checking if found -// -- v0builderopts ......: V0-specific building options (topological, etc) -// -- cascadebuilderopts .: cascade-specific building options (topological, etc) - -#include -#include - -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Common/DataModel/PIDResponse.h" -#include "TableHelper.h" -#include "PWGLF/DataModel/LFStrangenessTables.h" -#include "PWGLF/DataModel/LFStrangenessPIDTables.h" -#include "PWGLF/Utils/strangenessBuilderHelper.h" -#include "CCDB/BasicCCDBManager.h" -#include "DataFormatsParameters/GRPObject.h" -#include "DataFormatsParameters/GRPMagField.h" - -using namespace o2; -using namespace o2::framework; - -static constexpr int nParameters = 1; -static const std::vector tableNames{ - "V0Indices", //.0 (standard analysis: V0Cores) - "V0CoresBase", //.1 (standard analyses: main table) - "V0Covs", //.2 (joinable with V0Cores) - "CascIndices", //.3 (standard analyses: CascData) - "KFCascIndices", //.4 (standard analyses: KFCascData) - "TraCascIndices", //.5 (standard analyses: TraCascData) - "StoredCascCores", //.6 (standard analyses: CascData, main table) - "StoredKFCascCores", //.7 (standard analyses: KFCascData, main table) - "StoredTraCascCores", //.8 (standard analyses: TraCascData, main table) - "CascCovs", //.9 (joinable with CascData) - "KFCascCovs", //.10 (joinable with KFCascData) - "TraCascCovs", //.11 (joinable with TraCascData) - "V0TrackXs", //.12 (joinable with V0Data) - "CascTrackXs", //.13 (joinable with CascData) - "CascBBs", //.14 (standard, bachelor-baryon vars) - "V0DauCovs", //.15 (requested: tracking studies) - "V0DauCovIUs", //.16 (requested: tracking studies) - "V0TraPosAtDCAs", //.17 (requested: tracking studies) - "V0TraPosAtIUs", //.18 (requested: tracking studies) - "V0Ivanovs", //.19 (requested: tracking studies) - "McV0Labels", //.20 (MC/standard analysis) - "V0MCCores", //.21 (MC, all generated desired V0s) - "V0CoreMCLabels", //.22 (MC, refs V0Cores to V0MCCores) - "V0MCCollRefs", //.23 (MC, refs V0MCCores to McCollisions) - "McCascLabels", //.24 (MC/standard analysis) - "McKFCascLabels", //.25 (MC, refs KFCascCores to CascMCCores) - "McTraCascLabels", //.26 (MC, refs TraCascCores to CascMCCores) - "McCascBBTags", //.27 (MC, joinable with CascCores, tags reco-ed) - "CascMCCores", //.28 (MC, all generated desired cascades) - "CascCoreMCLabels", //.29 (MC, refs CascCores to CascMCCores) - "CascMCCollRefs", // 30 (MC, refs CascMCCores to McCollisions) - "CascToTraRefs", //.31 (interlink CascCores -> TraCascCores) - "CascToKFRefs", //.32 (interlink CascCores -> KFCascCores) - "TraToCascRefs", //.33 (interlink TraCascCores -> CascCores) - "KFToCascRefs", //.34 (interlink KFCascCores -> CascCores) - "V0FoundTags", //.35 (tags found vs findable V0s in findable mode) - "CascFoundTags" //.36 (tags found vs findable Cascades in findable mode) -}; - -static constexpr int nTablesConst = 37; - -static const std::vector parameterNames{"enable"}; -static const int defaultParameters[nTablesConst][nParameters]{ - {-1}, - {-1}, - {-1}, - {-1}, - {-1}, - {-1}, - {-1}, - {-1}, - {-1}, - {-1}, // index 9 - {-1}, - {-1}, - {-1}, - {-1}, - {-1}, - {-1}, - {-1}, - {-1}, - {-1}, - {-1}, // index 19 - {-1}, - {-1}, - {-1}, - {-1}, - {-1}, - {-1}, - {-1}, - {-1}, - {-1}, - {-1}, // index 29 - {-1}, - {-1}, - {-1}, - {-1}, - {-1}, - {-1}, - {-1}}; - -// use parameters + cov mat non-propagated, aux info + (extension propagated) -using FullTracksExt = soa::Join; -using FullTracksExtIU = soa::Join; -using FullTracksExtLabeled = soa::Join; -using FullTracksExtLabeledIU = soa::Join; -using TracksWithExtra = soa::Join; - -// For dE/dx association in pre-selection -using TracksExtraWithPID = soa::Join; - -struct StrangenessBuilder { - // helper object - o2::pwglf::strangenessBuilderHelper straHelper; - - // table index : match order above - enum tableIndex { kV0Indices = 0, - kV0CoresBase, - kV0Covs, - kCascIndices, - kKFCascIndices, - kTraCascIndices, - kStoredCascCores, - kStoredKFCascCores, - kStoredTraCascCores, - kCascCovs, - kKFCascCovs, - kTraCascCovs, - kV0TrackXs, - kCascTrackXs, - kCascBBs, - kV0DauCovs, - kV0DauCovIUs, - kV0TraPosAtDCAs, - kV0TraPosAtIUs, - kV0Ivanovs, - kMcV0Labels, - kV0MCCores, - kV0CoreMCLabels, - kV0MCCollRefs, - kMcCascLabels, - kMcKFCascLabels, - kMcTraCascLabels, - kMcCascBBTags, - kCascMCCores, - kCascCoreMCLabels, - kCascMCCollRefs, - kCascToTraRefs, - kCascToKFRefs, - kTraToCascRefs, - kKFToCascRefs, - kV0FoundTags, - kCascFoundTags, - nTables }; - - //__________________________________________________ - // V0 tables - Produces v0indices; // standard part of V0Datas - Produces v0cores; // standard part of V0Datas - Produces v0covs; // for decay chain reco - - //__________________________________________________ - // cascade tables - Produces cascidx; // standard part of CascDatas - Produces kfcascidx; // standard part of KFCascDatas - Produces tracascidx; // standard part of TraCascDatas - Produces cascdata; // standard part of CascDatas - Produces kfcascdata; // standard part of KFCascDatas - Produces tracascdata; // standard part of TraCascDatas - Produces casccovs; // for decay chain reco - Produces kfcasccovs; // for decay chain reco - Produces tracasccovs; // for decay chain reco - - //__________________________________________________ - // interlink tables - Produces v0dataLink; // de-refs V0s -> V0Data - Produces cascdataLink; // de-refs Cascades -> CascData - Produces kfcascdataLink; // de-refs Cascades -> KFCascData - Produces tracascdataLink; // de-refs Cascades -> TraCascData - - //__________________________________________________ - // secondary auxiliary tables - Produces v0trackXs; // for decay chain reco - Produces cascTrackXs; // for decay chain reco - - //__________________________________________________ - // further auxiliary / optional if desired - Produces cascbb; - Produces v0daucovs; // covariances of daughter tracks - Produces v0daucovIUs; // covariances of daughter tracks - Produces v0dauPositions; // auxiliary debug information - Produces v0dauPositionsIU; // auxiliary debug information - Produces v0ivanovs; // information for Marian's tests - - //__________________________________________________ - // MC information: V0 - Produces v0labels; // MC labels for V0s - Produces v0mccores; // mc info storage - Produces v0CoreMCLabels; // interlink V0Cores -> V0MCCores - Produces v0mccollref; // references collisions from V0MCCores - - // MC information: Cascades - Produces casclabels; // MC labels for cascades - Produces kfcasclabels; // MC labels for KF cascades - Produces tracasclabels; // MC labels for tracked cascades - Produces bbtags; // bb tags (inv structure tagging in mc) - Produces cascmccores; // mc info storage - Produces cascCoreMClabels; // interlink CascCores -> CascMCCores - Produces cascmccollrefs; // references MC collisions from MC cascades - - //__________________________________________________ - // cascade interlinks - // FIXME: commented out until strangederivedbuilder adjusted accordingly - // Produces cascToTraRefs; // cascades -> tracked - // Produces cascToKFRefs; // cascades -> KF - // Produces traToCascRefs; // tracked -> cascades - // Produces kfToCascRefs; // KF -> cascades - - //__________________________________________________ - // Findable tags - Produces v0FoundTag; - Produces cascFoundTag; - - Configurable> enabledTables{"enabledTables", - {defaultParameters[0], nTables, nParameters, tableNames, parameterNames}, - "Produce this table: -1 for autodetect; otherwise, 0/1 is false/true"}; - std::vector mEnabledTables; // Vector of enabled tables - - // CCDB options - struct : ConfigurableGroup { - std::string prefix = "ccdb"; - Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; - Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; - Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; - Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; - Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; - } ccdbConfigurations; - - Configurable mc_findableMode{"mc_findableMode", 0, "0: disabled; 1: add findable-but-not-found to existing V0s from AO2D; 2: reset V0s and generate only findable-but-not-found"}; - - // V0 building options - struct : ConfigurableGroup { - std::string prefix = "v0BuilderOpts"; - Configurable generatePhotonCandidates{"generatePhotonCandidates", false, "generate gamma conversion candidates (V0s using TPC-only tracks)"}; - - // baseline conditionals of V0 building - Configurable minCrossedRows{"minCrossedRows", 50, "minimum TPC crossed rows for daughter tracks"}; - Configurable dcanegtopv{"dcanegtopv", .1, "DCA Neg To PV"}; - Configurable dcapostopv{"dcapostopv", .1, "DCA Pos To PV"}; - Configurable v0cospa{"v0cospa", 0.95, "V0 CosPA"}; // double -> N.B. dcos(x)/dx = 0 at x=0) - Configurable dcav0dau{"dcav0dau", 1.0, "DCA V0 Daughters"}; - Configurable v0radius{"v0radius", 0.9, "v0radius"}; - Configurable maxDaughterEta{"maxDaughterEta", 5.0, "Maximum daughter eta (in abs value)"}; - - // MC builder options - Configurable mc_populateV0MCCoresSymmetric{"mc_populateV0MCCoresSymmetric", false, "populate V0MCCores table for derived data analysis, keep V0MCCores joinable with V0Cores"}; - Configurable mc_populateV0MCCoresAsymmetric{"mc_populateV0MCCoresAsymmetric", true, "populate V0MCCores table for derived data analysis, create V0Cores -> V0MCCores interlink. Saves only labeled V0s."}; - Configurable mc_treatPiToMuDecays{"mc_treatPiToMuDecays", true, "if true, will correctly capture pi -> mu and V0 label will still point to originating V0 decay in those cases. Nota bene: prong info will still be for the muon!"}; - Configurable mc_rapidityWindow{"mc_rapidityWindow", 0.5, "rapidity window to save non-recoed candidates"}; - Configurable mc_addGeneratedK0Short{"mc_addGeneratedK0Short", true, "add V0MCCore entry for generated, not-recoed K0Short"}; - Configurable mc_addGeneratedLambda{"mc_addGeneratedLambda", true, "add V0MCCore entry for generated, not-recoed Lambda"}; - Configurable mc_addGeneratedAntiLambda{"mc_addGeneratedAntiLambda", true, "add V0MCCore entry for generated, not-recoed AntiLambda"}; - Configurable mc_addGeneratedGamma{"mc_addGeneratedGamma", false, "add V0MCCore entry for generated, not-recoed Gamma"}; - Configurable mc_addGeneratedGammaMakeCollinear{"mc_addGeneratedGammaMakeCollinear", true, "when adding findable gammas, mark them as collinear"}; - Configurable mc_findableDetachedV0{"mc_findableDetachedV0", false, "if true, generate findable V0s that have collisionId -1. Caution advised."}; - } v0BuilderOpts; - - // cascade building options - struct : ConfigurableGroup { - std::string prefix = "cascadeBuilderOpts"; - Configurable useCascadeMomentumAtPrimVtx{"useCascadeMomentumAtPrimVtx", false, "use cascade momentum at PV"}; - - // conditionals - Configurable minCrossedRows{"minCrossedRows", 50, "minimum TPC crossed rows for daughter tracks"}; - Configurable dcabachtopv{"dcabachtopv", .05, "DCA Bach To PV"}; - Configurable cascradius{"cascradius", 0.9, "cascradius"}; - Configurable casccospa{"casccospa", 0.95, "casccospa"}; - Configurable dcacascdau{"dcacascdau", 1.0, "DCA cascade Daughters"}; - Configurable lambdaMassWindow{"lambdaMassWindow", .010, "Distance from Lambda mass (does not apply to KF path)"}; - Configurable maxDaughterEta{"maxDaughterEta", 5.0, "Maximum daughter eta (in abs value)"}; - - // KF building specific - Configurable kfTuneForOmega{"kfTuneForOmega", false, "if enabled, take main cascade properties from Omega fit instead of Xi fit (= default)"}; - Configurable kfConstructMethod{"kfConstructMethod", 2, "KF Construct Method"}; - Configurable kfUseV0MassConstraint{"kfUseV0MassConstraint", true, "KF: use Lambda mass constraint"}; - Configurable kfUseCascadeMassConstraint{"kfUseCascadeMassConstraint", false, "KF: use Cascade mass constraint - WARNING: not adequate for inv mass analysis of Xi"}; - Configurable kfDoDCAFitterPreMinimV0{"kfDoDCAFitterPreMinimV0", true, "KF: do DCAFitter pre-optimization before KF fit to include material corrections for V0"}; - Configurable kfDoDCAFitterPreMinimCasc{"kfDoDCAFitterPreMinimCasc", true, "KF: do DCAFitter pre-optimization before KF fit to include material corrections for Xi"}; - - // MC builder options - Configurable mc_populateCascMCCoresSymmetric{"mc_populateCascMCCoresSymmetric", false, "populate CascMCCores table for derived data analysis, keep CascMCCores joinable with CascCores"}; - Configurable mc_populateCascMCCoresAsymmetric{"mc_populateCascMCCoresAsymmetric", true, "populate CascMCCores table for derived data analysis, create CascCores -> CascMCCores interlink. Saves only labeled Cascades."}; - Configurable mc_addGeneratedXiMinus{"mc_addGeneratedXiMinus", true, "add CascMCCore entry for generated, not-recoed XiMinus"}; - Configurable mc_addGeneratedXiPlus{"mc_addGeneratedXiPlus", true, "add CascMCCore entry for generated, not-recoed XiPlus"}; - Configurable mc_addGeneratedOmegaMinus{"mc_addGeneratedOmegaMinus", true, "add CascMCCore entry for generated, not-recoed OmegaMinus"}; - Configurable mc_addGeneratedOmegaPlus{"mc_addGeneratedOmegaPlus", true, "add CascMCCore entry for generated, not-recoed OmegaPlus"}; - Configurable mc_treatPiToMuDecays{"mc_treatPiToMuDecays", true, "if true, will correctly capture pi -> mu and V0 label will still point to originating V0 decay in those cases. Nota bene: prong info will still be for the muon!"}; - Configurable mc_rapidityWindow{"mc_rapidityWindow", 0.5, "rapidity window to save non-recoed candidates"}; - Configurable mc_findableDetachedCascade{"mc_findableDetachedCascade", false, "if true, generate findable cascades that have collisionId -1. Caution advised."}; - } cascadeBuilderOpts; - - o2::ccdb::CcdbApi ccdbApi; - Service ccdb; - - int mRunNumber; - o2::base::MatLayerCylSet* lut = nullptr; - - // for tagging V0s used in cascades - std::vector v0sFromCascades; // Vector of v0 candidates used in cascades - std::vector v0Map; // index to relate V0s -> v0sFromCascades - - // for establishing CascData/KFData/TraCascData interlinks - struct { - std::vector cascCoreToCascades; - std::vector kfCascCoreToCascades; - std::vector traCascCoreToCascades; - std::vector cascadeToCascCores; - std::vector cascadeToKFCascCores; - std::vector cascadeToTraCascCores; - } interlinks; - - //*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+* - // struct to add abstraction layer between V0s, Cascades and build indices - // desirable for adding extra (findable, etc) V0s, Cascades to built list - struct trackEntry { - int globalId = -1; - int originId = -1; - int mcCollisionId = -1; - int pdgCode = -1; - }; - struct v0Entry { - int globalId = -1; - int collisionId = -1; - int posTrackId = -1; - int negTrackId = -1; - int v0Type = 0; - int pdgCode = 0; // undefined if not MC - useful for faster finding - int particleId = -1; // de-reference the V0 particle if necessary - bool isCollinearV0 = false; - bool found = false; - }; - struct cascadeEntry { - int globalId = -1; - int collisionId = -1; - int v0Id = -1; - int posTrackId = -1; - int negTrackId = -1; - int bachTrackId = -1; - bool found = false; - }; - std::vector v0List; - std::vector cascadeList; - std::vector sorted_v0; - std::vector sorted_cascade; - //*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+* - // Helper struct to contain V0MCCore information prior to filling - struct mcV0info { - int label = -1; - int motherLabel = -1; - int pdgCode = 0; - int pdgCodeMother = 0; - int pdgCodePositive = 0; - int pdgCodeNegative = 0; - int mcCollision = -1; - bool isPhysicalPrimary = false; - int processPositive = -1; - int processNegative = -1; - std::array xyz; - std::array posP; - std::array negP; - std::array momentum; - }; - mcV0info thisInfo; - //*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+* - // Helper struct to contain CascMCCore information prior to filling - struct mcCascinfo { - int label; - int motherLabel; - int mcCollision; - int pdgCode; - int pdgCodeMother; - int pdgCodeV0; - int pdgCodePositive; - int pdgCodeNegative; - int pdgCodeBachelor; - bool isPhysicalPrimary; - int processPositive = -1; - int processNegative = -1; - int processBachelor = -1; - std::array xyz; - std::array lxyz; - std::array posP; - std::array negP; - std::array bachP; - std::array momentum; - int mcParticlePositive; - int mcParticleNegative; - int mcParticleBachelor; - }; - mcCascinfo thisCascInfo; - //*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+* - - HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; - - void init(InitContext& context) - { - // setup bookkeeping histogram - auto h = histos.add("hTableBuildingStatistics", "hTableBuildingStatistics", kTH1D, {{nTablesConst, -0.5f, static_cast(nTablesConst)}}); - auto h2 = histos.add("hInputStatistics", "hInputStatistics", kTH1D, {{nTablesConst, -0.5f, static_cast(nTablesConst)}}); - h2->SetTitle("Input table sizes"); - - if (mc_findableMode.value > 0) { - // save statistics of findable candidate processing - auto hFindable = histos.add("hFindableStatistics", "hFindableStatistics", kTH1D, {{6, -0.5f, 5.5f}}); - hFindable->SetTitle(Form("Findable mode: %i", static_cast(mc_findableMode.value))); - hFindable->GetXaxis()->SetBinLabel(1, "AO2D V0s"); - hFindable->GetXaxis()->SetBinLabel(2, "V0s to be built"); - hFindable->GetXaxis()->SetBinLabel(3, "V0s with collId -1"); - hFindable->GetXaxis()->SetBinLabel(4, "AO2D Cascades"); - hFindable->GetXaxis()->SetBinLabel(5, "Cascades to be built"); - hFindable->GetXaxis()->SetBinLabel(6, "Cascades with collId -1"); - } - - mRunNumber = 0; - - mEnabledTables.resize(nTables, 0); - - LOGF(info, "Configuring tables to generate"); - auto& workflows = context.services().get(); - - for (int i = 0; i < nTables; i++) { - // adjust bookkeeping histogram - h->GetXaxis()->SetBinLabel(i + 1, tableNames[i].c_str()); - h2->GetXaxis()->SetBinLabel(i + 1, tableNames[i].c_str()); - h->SetBinContent(i + 1, -1); // mark all as disabled to start - - int f = enabledTables->get(tableNames[i].c_str(), "enable"); - if (f == 1) { - mEnabledTables[i] = 1; - } - if (f == -1) { - // autodetect this table in other devices - for (DeviceSpec const& device : workflows.devices) { - // Step 1: check if this device subscribed to the V0data table - for (auto const& input : device.inputs) { - if (device.name.compare("strangenessbuilder-initializer") == 0) - continue; // don't listen to the initializer - if (input.matcher.binding == tableNames[i]) { - LOGF(info, "Device %s has subscribed to %s", device.name, tableNames[i]); - mEnabledTables[i] = 1; - } - } - } - } - } - - LOGF(info, "*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*"); - LOGF(info, " Strangeness builder: basic configuration listing"); - LOGF(info, "*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*"); - - if (doprocessRealData) { - LOGF(info, " ===> process function enabled: processRealData"); - } - if (doprocessRealDataRun2) { - LOGF(info, " ===> process function enabled: processRealDataRun2"); - } - if (doprocessMonteCarlo) { - LOGF(info, " ===> process function enabled: processMonteCarlo"); - } - if (doprocessMonteCarloRun2) { - LOGF(info, " ===> process function enabled: processMonteCarloRun2"); - } - if (mc_findableMode.value == 1) { - LOGF(info, " ===> findable mode 1 is enabled: complement reco-ed with non-found findable"); - } - if (mc_findableMode.value == 2) { - LOGF(info, " ===> findable mode 2 is enabled: re-generate all findable from scratch"); - } - - // list enabled tables - - for (int i = 0; i < nTables; i++) { - // printout to be improved in the future - if (mEnabledTables[i]) { - LOGF(info, " -~> Table enabled: %s", tableNames[i]); - h->SetBinContent(i + 1, 0); // mark enabled - } - } - LOGF(info, "*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*"); - // print base cuts - LOGF(info, "-~> V0 | min crossed rows ..............: %i", v0BuilderOpts.minCrossedRows.value); - LOGF(info, "-~> V0 | DCA pos track to PV ...........: %f", v0BuilderOpts.dcapostopv.value); - LOGF(info, "-~> V0 | DCA neg track to PV ...........: %f", v0BuilderOpts.dcanegtopv.value); - LOGF(info, "-~> V0 | V0 cosine of PA ...............: %f", v0BuilderOpts.v0cospa.value); - LOGF(info, "-~> V0 | DCA between V0 daughters ......: %f", v0BuilderOpts.dcav0dau.value); - LOGF(info, "-~> V0 | V0 2D decay radius ............: %f", v0BuilderOpts.v0radius.value); - LOGF(info, "-~> V0 | Maximum daughter eta ..........: %f", v0BuilderOpts.maxDaughterEta.value); - - LOGF(info, "-~> Cascade | min crossed rows .........: %i", cascadeBuilderOpts.minCrossedRows.value); - LOGF(info, "-~> Cascade | DCA bach track to PV .....: %f", cascadeBuilderOpts.dcabachtopv.value); - LOGF(info, "-~> Cascade | Cascade cosine of PA .....: %f", cascadeBuilderOpts.casccospa.value); - LOGF(info, "-~> Cascade | Cascade daughter DCA .....: %f", cascadeBuilderOpts.dcacascdau.value); - LOGF(info, "-~> Cascade | Cascade radius ...........: %f", cascadeBuilderOpts.cascradius.value); - LOGF(info, "-~> Cascade | Lambda mass window .......: %f", cascadeBuilderOpts.lambdaMassWindow.value); - LOGF(info, "-~> Cascade | Maximum daughter eta .....: %f", cascadeBuilderOpts.maxDaughterEta.value); - LOGF(info, "*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*"); - - ccdb->setURL(ccdbConfigurations.ccdburl); - ccdb->setCaching(true); - ccdb->setLocalObjectValidityChecking(); - ccdb->setFatalWhenNull(false); - - // set V0 parameters in the helper - straHelper.v0selections.minCrossedRows = v0BuilderOpts.minCrossedRows; - straHelper.v0selections.dcanegtopv = v0BuilderOpts.dcanegtopv; - straHelper.v0selections.dcapostopv = v0BuilderOpts.dcapostopv; - straHelper.v0selections.v0cospa = v0BuilderOpts.v0cospa; - straHelper.v0selections.dcav0dau = v0BuilderOpts.dcav0dau; - straHelper.v0selections.v0radius = v0BuilderOpts.v0radius; - straHelper.v0selections.maxDaughterEta = v0BuilderOpts.maxDaughterEta; - - // set cascade parameters in the helper - straHelper.cascadeselections.minCrossedRows = cascadeBuilderOpts.minCrossedRows; - straHelper.cascadeselections.dcabachtopv = cascadeBuilderOpts.dcabachtopv; - straHelper.cascadeselections.cascradius = cascadeBuilderOpts.cascradius; - straHelper.cascadeselections.casccospa = cascadeBuilderOpts.casccospa; - straHelper.cascadeselections.dcacascdau = cascadeBuilderOpts.dcacascdau; - straHelper.cascadeselections.lambdaMassWindow = cascadeBuilderOpts.lambdaMassWindow; - straHelper.cascadeselections.maxDaughterEta = cascadeBuilderOpts.maxDaughterEta; - } - - // for sorting - template - std::vector sort_indices(const std::vector& v, bool doSorting = false) - { - std::vector idx(v.size()); - std::iota(idx.begin(), idx.end(), 0); - if (doSorting) { - // do sorting only if requested (not always necessary) - std::stable_sort(idx.begin(), idx.end(), - [&v](std::size_t i1, std::size_t i2) { return v[i1].collisionId < v[i2].collisionId; }); - } - return idx; - } - - template - bool initCCDB(aod::BCsWithTimestamps const& bcs, TCollisions const& collisions) - { - auto bc = collisions.size() ? collisions.begin().template bc_as() : bcs.begin(); - if (!bcs.size()) { - LOGF(warn, "No BC found, skipping this DF."); - return false; // signal to skip this DF - } - - if (mRunNumber == bc.runNumber()) { - return true; - } - - auto timestamp = bc.timestamp(); - o2::parameters::GRPObject* grpo = 0x0; - o2::parameters::GRPMagField* grpmag = 0x0; - if (doprocessRealDataRun2) { - grpo = ccdb->getForTimeStamp(ccdbConfigurations.grpPath, timestamp); - if (!grpo) { - LOG(fatal) << "Got nullptr from CCDB for path " << ccdbConfigurations.grpPath << " of object GRPObject for timestamp " << timestamp; - } - o2::base::Propagator::initFieldFromGRP(grpo); - } else { - grpmag = ccdb->getForTimeStamp(ccdbConfigurations.grpmagPath, timestamp); - if (!grpmag) { - LOG(fatal) << "Got nullptr from CCDB for path " << ccdbConfigurations.grpmagPath << " of object GRPMagField for timestamp " << timestamp; - } - o2::base::Propagator::initFieldFromGRP(grpmag); - } - // Fetch magnetic field from ccdb for current collision - auto magneticField = o2::base::Propagator::Instance()->getNominalBz(); - LOG(info) << "Retrieved GRP for timestamp " << timestamp << " with magnetic field of " << magneticField << " kG"; - - // Set magnetic field value once known - straHelper.fitter.setBz(magneticField); - - // acquire LUT for this timestamp - LOG(info) << "Loading material look-up table for timestamp: " << timestamp; - lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->getForTimeStamp(ccdbConfigurations.lutPath, timestamp)); - o2::base::Propagator::Instance()->setMatLUT(lut); - straHelper.lut = lut; - - LOG(info) << "Fully configured for run: " << bc.runNumber(); - // mmark this run as configured - mRunNumber = bc.runNumber(); - - return true; - } - - //__________________________________________________ - void resetInterlinks() - { - interlinks.cascCoreToCascades.clear(); - interlinks.kfCascCoreToCascades.clear(); - interlinks.traCascCoreToCascades.clear(); - interlinks.cascadeToCascCores.clear(); - interlinks.cascadeToKFCascCores.clear(); - interlinks.cascadeToTraCascCores.clear(); - } - - //__________________________________________________ - void populateCascadeInterlinks() - { - // if (mEnabledTables[kCascToKFRefs]) { - // for (const auto& cascCore : interlinks.cascCoreToCascades) { - // cascToKFRefs(interlinks.cascadeToKFCascCores[cascCore]); - // histos.fill(HIST("hTableBuildingStatistics"), kCascToKFRefs); - // } - // } - // if (mEnabledTables[kCascToTraRefs]) { - // for (const auto& cascCore : interlinks.cascCoreToCascades) { - // cascToTraRefs(interlinks.cascadeToTraCascCores[cascCore]); - // histos.fill(HIST("hTableBuildingStatistics"), kCascToTraRefs); - // } - // } - // if (mEnabledTables[kKFToCascRefs]) { - // for (const auto& kfCascCore : interlinks.kfCascCoreToCascades) { - // kfToCascRefs(interlinks.cascadeToCascCores[kfCascCore]); - // histos.fill(HIST("hTableBuildingStatistics"), kKFToCascRefs); - // } - // } - // if (mEnabledTables[kTraToCascRefs]) { - // for (const auto& traCascCore : interlinks.traCascCoreToCascades) { - // traToCascRefs(interlinks.cascadeToCascCores[traCascCore]); - // histos.fill(HIST("hTableBuildingStatistics"), kTraToCascRefs); - // } - // } - } - - //__________________________________________________ - template - void prepareBuildingLists(TCollisions const& collisions, TMCCollisions const& mcCollisions, TV0s const& v0s, TCascades const& cascades, TTracks const& tracks, TMCParticles const& mcParticles) - { - // this function prepares the v0List and cascadeList depending on - // how the task has been set up. Standard operation simply uses - // the existing V0s and Cascades from AO2D, while findable MC - // operation either complements with all findable-but-not-found - // or resets and fills with all findable. - // - // Whenever using findable candidates, they will be appropriately - // marked for posterior analysis using 'type' variables. - // - // findable mode legend: - // 0: simple passthrough of V0s, Cascades in AO2Ds - // (in data, this is the only mode possible!) - // 1: add extra findable that haven't been found - // 2: generate only findable (no background) - - // redo lists from scratch - v0List.clear(); - cascadeList.clear(); - sorted_v0.clear(); - sorted_cascade.clear(); - - trackEntry currentTrackEntry; - v0Entry currentV0Entry; - cascadeEntry currentCascadeEntry; - - std::vector bestCollisionArray; // stores McCollision -> Collision map - std::vector bestCollisionNContribsArray; // stores Ncontribs for biggest coll assoc to mccoll - - int collisionLessV0s = 0; - int collisionLessCascades = 0; - - if (mc_findableMode.value > 0) { - if constexpr (soa::is_table) { - // if mcCollisions exist, assemble mcColl -> bestRecoColl map here - bestCollisionArray.clear(); - bestCollisionNContribsArray.clear(); - bestCollisionArray.resize(mcCollisions.size(), -1); // marks not reconstructed - bestCollisionNContribsArray.resize(mcCollisions.size(), -1); // marks not reconstructed - - // single loop over double loop at a small cost in memory for extra array - for (const auto& collision : collisions) { - if (collision.has_mcCollision()) { - if (collision.numContrib() > bestCollisionNContribsArray[collision.mcCollisionId()]) { - bestCollisionArray[collision.mcCollisionId()] = collision.globalIndex(); - bestCollisionNContribsArray[collision.mcCollisionId()] = collision.numContrib(); - } - } - } // end collision loop - } // end is_table - } // end findable mode check - - if (mc_findableMode.value < 2) { - // simple passthrough: copy existing v0s to build list - for (const auto& v0 : v0s) { - currentV0Entry.globalId = v0.globalIndex(); - currentV0Entry.collisionId = v0.collisionId(); - currentV0Entry.posTrackId = v0.posTrackId(); - currentV0Entry.negTrackId = v0.negTrackId(); - currentV0Entry.v0Type = v0.v0Type(); - currentV0Entry.pdgCode = 0; - currentV0Entry.particleId = -1; - currentV0Entry.isCollinearV0 = v0.isCollinearV0(); - currentV0Entry.found = true; - v0List.push_back(currentV0Entry); - } - } - // any mode other than 0 will require mcParticles - if constexpr (soa::is_table) { - if (mc_findableMode.value > 0) { - // for search if existing or not - int v0ListReconstructedSize = v0List.size(); - - // find extra candidates, step 1: find subset of tracks that interest - std::vector positiveTrackArray; - std::vector negativeTrackArray; - // vector elements: track index, origin index [, mc collision id, pdg code] - int dummy = -1; // unnecessary in this path - for (const auto& track : tracks) { - if (!track.has_mcParticle()) { - continue; // skip this, it's trouble - } - auto particle = track.template mcParticle_as(); - int originParticleIndex = getOriginatingParticle(particle, dummy, v0BuilderOpts.mc_treatPiToMuDecays); - if (originParticleIndex < 0) { - continue; // skip this, it's trouble (2) - } - auto originParticle = mcParticles.rawIteratorAt(originParticleIndex); - - bool trackIsInteresting = false; - if ( - (originParticle.pdgCode() == 310 && v0BuilderOpts.mc_addGeneratedK0Short.value > 0) || - (originParticle.pdgCode() == 3122 && v0BuilderOpts.mc_addGeneratedLambda.value > 0) || - (originParticle.pdgCode() == -3122 && v0BuilderOpts.mc_addGeneratedAntiLambda.value > 0) || - (originParticle.pdgCode() == 22 && v0BuilderOpts.mc_addGeneratedGamma.value > 0)) { - trackIsInteresting = true; - } - if (!trackIsInteresting) { - continue; // skip this, it's uninteresting - } - - currentTrackEntry.globalId = static_cast(track.globalIndex()); - currentTrackEntry.originId = originParticleIndex; - currentTrackEntry.mcCollisionId = originParticle.mcCollisionId(); - currentTrackEntry.pdgCode = originParticle.pdgCode(); - - // now separate according to particle species - if (track.sign() < 0) { - negativeTrackArray.push_back(currentTrackEntry); - } else { - positiveTrackArray.push_back(currentTrackEntry); - } - } - - // Nested loop only with valuable tracks - for (const auto& positiveTrackIndex : positiveTrackArray) { - for (const auto& negativeTrackIndex : negativeTrackArray) { - if (positiveTrackIndex.originId != negativeTrackIndex.originId) { - continue; // not the same originating particle - } - // findable mode 1: add non-reconstructed as v0Type 8 - if (mc_findableMode.value == 1) { - bool detected = false; - for (int ii = 0; ii < v0ListReconstructedSize; ii++) { - // check if this particular combination already exists in v0List - if (v0List[ii].posTrackId == positiveTrackIndex.globalId && - v0List[ii].negTrackId == negativeTrackIndex.globalId) { - detected = true; - // override pdg code with something useful for cascade findable math - v0List[ii].pdgCode = positiveTrackIndex.pdgCode; - break; - } - } - if (detected == false) { - // collision index: from best-version-of-this-mcCollision - // nota bene: this could be negative, caution advised - currentV0Entry.globalId = -1; - currentV0Entry.collisionId = bestCollisionArray[positiveTrackIndex.mcCollisionId]; - currentV0Entry.posTrackId = positiveTrackIndex.globalId; - currentV0Entry.negTrackId = negativeTrackIndex.globalId; - currentV0Entry.v0Type = 1; // mark with bit 3 - currentV0Entry.pdgCode = positiveTrackIndex.pdgCode; - currentV0Entry.particleId = positiveTrackIndex.originId; - currentV0Entry.isCollinearV0 = false; - if (v0BuilderOpts.mc_addGeneratedGammaMakeCollinear.value && currentV0Entry.pdgCode == 22) { - currentV0Entry.isCollinearV0 = true; - } - currentV0Entry.found = false; - if (bestCollisionArray[positiveTrackIndex.mcCollisionId] < 0) { - collisionLessV0s++; - } - if (v0BuilderOpts.mc_findableDetachedV0.value || currentV0Entry.collisionId >= 0) { - v0List.push_back(currentV0Entry); - } - } - } - // findable mode 2: determine type based on V0 table, - // with type 8 being reserved to findable-but-not-found - if (mc_findableMode.value == 2) { - currentV0Entry.globalId = -1; - currentV0Entry.collisionId = bestCollisionArray[positiveTrackIndex.mcCollisionId]; - currentV0Entry.posTrackId = positiveTrackIndex.globalId; - currentV0Entry.negTrackId = negativeTrackIndex.globalId; - currentV0Entry.v0Type = 1; - currentV0Entry.pdgCode = positiveTrackIndex.pdgCode; - currentV0Entry.particleId = positiveTrackIndex.originId; - currentV0Entry.isCollinearV0 = false; - if (v0BuilderOpts.mc_addGeneratedGammaMakeCollinear.value && currentV0Entry.pdgCode == 22) { - currentV0Entry.isCollinearV0 = true; - } - currentV0Entry.found = false; - for (const auto& v0 : v0s) { - if (v0.posTrackId() == positiveTrackIndex.globalId && - v0.negTrackId() == negativeTrackIndex.globalId) { - // this will override type, but not collision index - // N.B.: collision index checks still desirable! - currentV0Entry.globalId = v0.globalIndex(); - currentV0Entry.v0Type = v0.v0Type(); - currentV0Entry.isCollinearV0 = v0.isCollinearV0(); - currentV0Entry.found = true; - break; - } - } - if (v0BuilderOpts.mc_findableDetachedV0.value || currentV0Entry.collisionId >= 0) { - v0List.push_back(currentV0Entry); - } - } - } - } // end positive / negative track loops - - // fill findable statistics table - histos.fill(HIST("hFindableStatistics"), 0.0, v0s.size()); - histos.fill(HIST("hFindableStatistics"), 1.0, v0List.size()); - histos.fill(HIST("hFindableStatistics"), 2.0, collisionLessV0s); - - } // end findableMode > 0 check - } // end soa::is_table - - // determine properly collision-id-sorted index array for later use - // N.B.: necessary also before cascade part - sorted_v0.clear(); - sorted_v0 = sort_indices(v0List, (mc_findableMode.value > 0)); - - // Cascade part if cores are requested, skip otherwise - if (mEnabledTables[kStoredCascCores] || mEnabledTables[kStoredKFCascCores]) { - if (mc_findableMode.value < 2) { - // simple passthrough: copy existing cascades to build list - for (const auto& cascade : cascades) { - auto const& v0 = cascade.v0(); - currentCascadeEntry.globalId = cascade.globalIndex(); - currentCascadeEntry.collisionId = cascade.collisionId(); - currentCascadeEntry.v0Id = v0.globalIndex(); - currentCascadeEntry.posTrackId = v0.posTrackId(); - currentCascadeEntry.negTrackId = v0.negTrackId(); - currentCascadeEntry.bachTrackId = cascade.bachelorId(); - currentCascadeEntry.found = true; - cascadeList.push_back(currentCascadeEntry); - } - } - - // any mode other than 0 will require mcParticles - if constexpr (soa::is_table) { - if (mc_findableMode.value > 0) { - // for search if existing or not - size_t cascadeListReconstructedSize = cascadeList.size(); - - // determine which tracks are of interest - std::vector bachelorTrackArray; - // vector elements: track index, origin index, mc collision id, pdg code] - int dummy = -1; // unnecessary in this path - for (const auto& track : tracks) { - if (!track.has_mcParticle()) { - continue; // skip this, it's trouble - } - auto particle = track.template mcParticle_as(); - int originParticleIndex = getOriginatingParticle(particle, dummy, cascadeBuilderOpts.mc_treatPiToMuDecays); - if (originParticleIndex < 0) { - continue; // skip this, it's trouble (2) - } - auto originParticle = mcParticles.rawIteratorAt(originParticleIndex); - - bool trackIsInteresting = false; - if ( - (originParticle.pdgCode() == 3312 && cascadeBuilderOpts.mc_addGeneratedXiMinus.value > 0) || - (originParticle.pdgCode() == -3312 && cascadeBuilderOpts.mc_addGeneratedXiPlus.value > 0) || - (originParticle.pdgCode() == 3334 && cascadeBuilderOpts.mc_addGeneratedOmegaMinus.value > 0) || - (originParticle.pdgCode() == -3334 && cascadeBuilderOpts.mc_addGeneratedOmegaPlus.value > 0)) { - trackIsInteresting = true; - } - if (!trackIsInteresting) { - continue; // skip this, it's uninteresting - } - - currentTrackEntry.globalId = static_cast(track.globalIndex()); - currentTrackEntry.originId = originParticleIndex; - currentTrackEntry.mcCollisionId = originParticle.mcCollisionId(); - currentTrackEntry.pdgCode = originParticle.pdgCode(); - - // populate list of bachelor tracks to pair - bachelorTrackArray.push_back(currentTrackEntry); - } - - // determine which V0s are of interest to pair and do pairing - for (size_t v0i = 0; v0i < v0List.size(); v0i++) { - auto v0 = v0List[sorted_v0[v0i]]; - - if (std::abs(v0.pdgCode) != 3122) { - continue; // this V0 isn't a lambda, can't come from a cascade: skip - } - if (v0.particleId < 0) { - continue; // no de-referencing possible (e.g. background, ...) - } - auto v0Particle = mcParticles.rawIteratorAt(v0.particleId); - - int v0OriginParticleIndex = -1; - if (v0Particle.has_mothers()) { - auto const& motherList = v0Particle.template mothers_as(); - if (motherList.size() == 1) { - for (const auto& mother : motherList) { - v0OriginParticleIndex = mother.globalIndex(); - } - } - } - if (v0OriginParticleIndex < 0) { - continue; - } - auto v0OriginParticle = mcParticles.rawIteratorAt(v0OriginParticleIndex); - - if (std::abs(v0OriginParticle.pdgCode()) != 3312 && std::abs(v0OriginParticle.pdgCode()) != 3334) { - continue; // this V0 does not come from any particle of interest, don't try - } - for (const auto& bachelorTrackIndex : bachelorTrackArray) { - if (bachelorTrackIndex.originId != v0OriginParticle.globalIndex()) { - continue; - } - // if we are here: v0 origin is 3312 or 3334, bachelor origin matches V0 origin - // findable mode 1: add non-reconstructed as cascadeType 1 - if (mc_findableMode.value == 1) { - bool detected = false; - for (size_t ii = 0; ii < cascadeListReconstructedSize; ii++) { - // check if this particular combination already exists in cascadeList - // caution: use track indices (immutable) but not V0 indices (re-indexing) - if (cascadeList[ii].posTrackId == v0.posTrackId && - cascadeList[ii].negTrackId == v0.negTrackId && - cascadeList[ii].bachTrackId == bachelorTrackIndex.globalId) { - detected = true; - break; - } - } - if (detected == false) { - // collision index: from best-version-of-this-mcCollision - // nota bene: this could be negative, caution advised - currentCascadeEntry.globalId = -1; - currentCascadeEntry.collisionId = bestCollisionArray[bachelorTrackIndex.mcCollisionId]; - currentCascadeEntry.v0Id = v0i; // correct information here - currentCascadeEntry.posTrackId = v0.posTrackId; - currentCascadeEntry.negTrackId = v0.negTrackId; - currentCascadeEntry.bachTrackId = bachelorTrackIndex.globalId; - currentCascadeEntry.found = false; - cascadeList.push_back(currentCascadeEntry); - if (bestCollisionArray[bachelorTrackIndex.mcCollisionId] < 0) { - collisionLessCascades++; - } - if (cascadeBuilderOpts.mc_findableDetachedCascade.value || currentCascadeEntry.collisionId >= 0) { - cascadeList.push_back(currentCascadeEntry); - } - } - } - - // findable mode 2: determine type based on cascade table, - // with type 1 being reserved to findable-but-not-found - if (mc_findableMode.value == 2) { - currentCascadeEntry.globalId = -1; - currentCascadeEntry.collisionId = bestCollisionArray[bachelorTrackIndex.mcCollisionId]; - currentCascadeEntry.v0Id = v0i; // fill this in one go later - currentCascadeEntry.posTrackId = v0.posTrackId; - currentCascadeEntry.negTrackId = v0.negTrackId; - currentCascadeEntry.bachTrackId = bachelorTrackIndex.globalId; - currentCascadeEntry.found = false; - if (bestCollisionArray[bachelorTrackIndex.mcCollisionId] < 0) { - collisionLessCascades++; - } - for (const auto& cascade : cascades) { - auto const& v0fromAOD = cascade.v0(); - if (v0fromAOD.posTrackId() == v0.posTrackId && - v0fromAOD.negTrackId() == v0.negTrackId && - cascade.bachelorId() == bachelorTrackIndex.globalId) { - // this will override type, but not collision index - // N.B.: collision index checks still desirable! - currentCascadeEntry.found = true; - currentCascadeEntry.globalId = cascade.globalIndex(); - break; - } - } - if (cascadeBuilderOpts.mc_findableDetachedCascade.value || currentCascadeEntry.collisionId >= 0) { - cascadeList.push_back(currentCascadeEntry); - } - } - } // end bachelorTrackArray loop - } // end v0List loop - - // at this stage, cascadeList is alright, but the v0 indices are still not - // correct. We'll have to loop over all V0s and find the appropriate matches - // ---> but only in mode 1, and only for AO2D-native V0s - if (mc_findableMode.value == 1) { - for (size_t casci = 0; casci < cascadeListReconstructedSize; casci++) { - // loop over v0List to find corresponding v0 index, but do it in sorted way - for (size_t v0i = 0; v0i < v0List.size(); v0i++) { - auto v0 = v0List[sorted_v0[v0i]]; - if (cascadeList[casci].posTrackId == v0.posTrackId && - cascadeList[casci].negTrackId == v0.negTrackId) { - cascadeList[casci].v0Id = v0i; // fix, point to correct V0 index - break; - } - } - } - } - // we should now be done! collect statistics - histos.fill(HIST("hFindableStatistics"), 3.0, cascades.size()); - histos.fill(HIST("hFindableStatistics"), 4.0, cascadeList.size()); - histos.fill(HIST("hFindableStatistics"), 5.0, collisionLessCascades); - - } // end findable mode check - } // end soa::is_table - - // we need to allow for sorted use of cascadeList - sorted_cascade.clear(); - sorted_cascade = sort_indices(cascadeList, (mc_findableMode.value > 0)); - } - - LOGF(info, "AO2D input: %i V0s, %i cascades. Building list sizes: %i V0s, %i cascades", v0s.size(), cascades.size(), v0List.size(), cascadeList.size()); - } - - //__________________________________________________ - template - void markV0sUsedInCascades(TV0s const& v0s, TCascades const& cascades, TTrackedCascades const& trackedCascades) - { - int v0sUsedInCascades = 0; - v0sFromCascades.clear(); - v0Map.clear(); - v0Map.resize(v0List.size(), -2); // marks not used - if (mEnabledTables[kStoredCascCores]) { - for (const auto& cascade : cascadeList) { - if (v0Map[cascade.v0Id] == -2) { - v0sUsedInCascades++; - } - v0Map[cascade.v0Id] = -1; // marks used (but isn't the index of a properly built V0, which would be >= 0) - } - } - int trackedCascadeCount = 0; - if constexpr (soa::is_table) { - // tracked only created outside of findable mode - if (mEnabledTables[kStoredTraCascCores] && mc_findableMode.value == 0) { - trackedCascadeCount = trackedCascades.size(); - for (const auto& trackedCascade : trackedCascades) { - auto const& cascade = trackedCascade.cascade(); - if (v0Map[cascade.v0Id()] == -2) { - v0sUsedInCascades++; - } - v0Map[cascade.v0Id()] = -1; // marks used (but isn't the index of a properly built V0, which would be >= 0) - } - } - } - LOGF(debug, "V0 total %i, Cascade total %i, Tracked cascade total %i, V0s flagged used in cascades: %i", v0s.size(), cascades.size(), trackedCascadeCount, v0sUsedInCascades); - } - - //__________________________________________________ - template - void buildV0s(TCollisions const& collisions, TV0s const& v0s, TTracks const& tracks, TMCParticles const& mcParticles) - { - // prepare MC containers (not necessarily used) - std::vector mcV0infos; // V0MCCore information - std::vector mcParticleIsReco; - - if constexpr (soa::is_table) { - // do this if provided with a mcParticle table as well - mcParticleIsReco.resize(mcParticles.size(), false); - } - - int nV0s = 0; - // Loops over all V0s in the time frame - histos.fill(HIST("hInputStatistics"), kV0CoresBase, v0s.size()); - for (size_t iv0 = 0; iv0 < v0List.size(); iv0++) { - const auto& v0 = v0List[sorted_v0[iv0]]; - - if (!mEnabledTables[kV0CoresBase] && v0Map[iv0] == -2) { - // this v0 hasn't been used by cascades and we're not generating V0s, so skip it - v0dataLink(-1, -1); - continue; - } - - // Get tracks and generate candidate - auto const& collision = collisions.rawIteratorAt(v0.collisionId); - auto const& posTrack = tracks.rawIteratorAt(v0.posTrackId); - auto const& negTrack = tracks.rawIteratorAt(v0.negTrackId); - if (!straHelper.buildV0Candidate(collision, posTrack, negTrack, v0.isCollinearV0, mEnabledTables[kV0Covs])) { - v0dataLink(-1, -1); - continue; - } - if (v0Map[iv0] == -1) { - v0Map[iv0] = v0sFromCascades.size(); // provide actual valid index in buffer - v0sFromCascades.push_back(straHelper.v0); - } - // fill requested cursors only if type is not 0 - if (v0.v0Type == 1 || (v0.v0Type > 1 && v0BuilderOpts.generatePhotonCandidates)) { - nV0s++; - if (mEnabledTables[kV0Indices]) { - // for referencing (especially - but not only - when using derived data) - v0indices(v0.posTrackId, v0.negTrackId, - v0.collisionId, iv0); - histos.fill(HIST("hTableBuildingStatistics"), kV0Indices); - } - if (mEnabledTables[kV0TrackXs]) { - // further decay chains may need this - v0trackXs(straHelper.v0.positiveTrackX, straHelper.v0.negativeTrackX); - histos.fill(HIST("hTableBuildingStatistics"), kV0TrackXs); - } - if (mEnabledTables[kV0CoresBase]) { - // standard analysis - v0cores(straHelper.v0.position[0], straHelper.v0.position[1], straHelper.v0.position[2], - straHelper.v0.positiveMomentum[0], straHelper.v0.positiveMomentum[1], straHelper.v0.positiveMomentum[2], - straHelper.v0.negativeMomentum[0], straHelper.v0.negativeMomentum[1], straHelper.v0.negativeMomentum[2], - straHelper.v0.daughterDCA, - straHelper.v0.positiveDCAxy, - straHelper.v0.negativeDCAxy, - TMath::Cos(straHelper.v0.pointingAngle), - straHelper.v0.dcaXY, - v0.v0Type); - v0dataLink(v0cores.lastIndex(), -1); - histos.fill(HIST("hTableBuildingStatistics"), kV0CoresBase); - } - if (mEnabledTables[kV0TraPosAtDCAs]) { - // for tracking studies - v0dauPositions(straHelper.v0.positivePosition[0], straHelper.v0.positivePosition[1], straHelper.v0.positivePosition[2], - straHelper.v0.negativePosition[0], straHelper.v0.negativePosition[1], straHelper.v0.negativePosition[2]); - histos.fill(HIST("hTableBuildingStatistics"), kV0TraPosAtDCAs); - } - if (mEnabledTables[kV0TraPosAtIUs]) { - // for tracking studies - std::array positivePositionIU; - std::array negativePositionIU; - o2::track::TrackPar positiveTrackParam = getTrackPar(posTrack); - o2::track::TrackPar negativeTrackParam = getTrackPar(negTrack); - positiveTrackParam.getXYZGlo(positivePositionIU); - negativeTrackParam.getXYZGlo(negativePositionIU); - v0dauPositionsIU(positivePositionIU[0], positivePositionIU[1], positivePositionIU[2], - negativePositionIU[0], negativePositionIU[1], negativePositionIU[2]); - histos.fill(HIST("hTableBuildingStatistics"), kV0TraPosAtIUs); - } - if (mEnabledTables[kV0Covs]) { - v0covs(straHelper.v0.positionCovariance, straHelper.v0.momentumCovariance); - histos.fill(HIST("hTableBuildingStatistics"), kV0Covs); - } - - //_________________________________________________________ - // MC handling part - if constexpr (soa::is_table) { - // only worry about this if someone else worried about this - if ((mEnabledTables[kV0MCCores] || mEnabledTables[kMcV0Labels] || mEnabledTables[kV0MCCollRefs])) { - thisInfo.label = -1; - thisInfo.motherLabel = -1; - thisInfo.pdgCode = 0; - thisInfo.pdgCodeMother = 0; - thisInfo.pdgCodePositive = 0; - thisInfo.pdgCodeNegative = 0; - thisInfo.mcCollision = -1; - thisInfo.xyz[0] = thisInfo.xyz[1] = thisInfo.xyz[2] = 0.0f; - thisInfo.posP[0] = thisInfo.posP[1] = thisInfo.posP[2] = 0.0f; - thisInfo.negP[0] = thisInfo.negP[1] = thisInfo.negP[2] = 0.0f; - thisInfo.momentum[0] = thisInfo.momentum[1] = thisInfo.momentum[2] = 0.0f; - - // Association check - // There might be smarter ways of doing this in the future - if (negTrack.has_mcParticle() && posTrack.has_mcParticle()) { - auto lMCNegTrack = negTrack.template mcParticle_as(); - auto lMCPosTrack = posTrack.template mcParticle_as(); - - thisInfo.pdgCodePositive = lMCPosTrack.pdgCode(); - thisInfo.pdgCodeNegative = lMCNegTrack.pdgCode(); - thisInfo.processPositive = lMCPosTrack.getProcess(); - thisInfo.processNegative = lMCNegTrack.getProcess(); - thisInfo.posP[0] = lMCPosTrack.px(); - thisInfo.posP[1] = lMCPosTrack.py(); - thisInfo.posP[2] = lMCPosTrack.pz(); - thisInfo.negP[0] = lMCNegTrack.px(); - thisInfo.negP[1] = lMCNegTrack.py(); - thisInfo.negP[2] = lMCNegTrack.pz(); - - // check for pi -> mu + antineutrino decay - // if present, de-reference original V0 correctly and provide label to original object - // NOTA BENE: the prong info will still correspond to a muon, treat carefully! - int negOriginating = -1, posOriginating = -1, particleForDecayPositionIdx = -1; - negOriginating = getOriginatingParticle(lMCNegTrack, particleForDecayPositionIdx, v0BuilderOpts.mc_treatPiToMuDecays); - posOriginating = getOriginatingParticle(lMCPosTrack, particleForDecayPositionIdx, v0BuilderOpts.mc_treatPiToMuDecays); - - if (negOriginating > -1 && negOriginating == posOriginating) { - auto originatingV0 = mcParticles.rawIteratorAt(negOriginating); - auto particleForDecayPosition = mcParticles.rawIteratorAt(particleForDecayPositionIdx); - - thisInfo.label = originatingV0.globalIndex(); - thisInfo.xyz[0] = particleForDecayPosition.vx(); - thisInfo.xyz[1] = particleForDecayPosition.vy(); - thisInfo.xyz[2] = particleForDecayPosition.vz(); - - if (originatingV0.has_mcCollision()) { - thisInfo.mcCollision = originatingV0.mcCollisionId(); // save this reference, please - } - - // acquire information - thisInfo.pdgCode = originatingV0.pdgCode(); - thisInfo.isPhysicalPrimary = originatingV0.isPhysicalPrimary(); - thisInfo.momentum[0] = originatingV0.px(); - thisInfo.momentum[1] = originatingV0.py(); - thisInfo.momentum[2] = originatingV0.pz(); - - if (originatingV0.has_mothers()) { - for (const auto& lV0Mother : originatingV0.template mothers_as()) { - thisInfo.pdgCodeMother = lV0Mother.pdgCode(); - thisInfo.motherLabel = lV0Mother.globalIndex(); - } - } - } - - } // end association check - // Construct label table (note: this will be joinable with V0Datas!) - if (mEnabledTables[kMcV0Labels]) { - v0labels(thisInfo.label, thisInfo.motherLabel); - histos.fill(HIST("hTableBuildingStatistics"), kMcV0Labels); - } - - // Construct found tag - if (mEnabledTables[kV0FoundTags]) { - v0FoundTag(v0.found); - histos.fill(HIST("hTableBuildingStatistics"), kV0FoundTags); - } - - // Mark mcParticle as recoed (no searching necessary afterwards) - if (thisInfo.label > -1) { - mcParticleIsReco[thisInfo.label] = true; - } - - // ---] Symmetric populate [--- - // in this approach, V0Cores will be joinable with V0MCCores. - // this is the most pedagogical approach, but it is also more limited - // and it might use more disk space unnecessarily. - if (v0BuilderOpts.mc_populateV0MCCoresSymmetric) { - if (mEnabledTables[kV0MCCores]) { - v0mccores( - thisInfo.label, thisInfo.pdgCode, - thisInfo.pdgCodeMother, thisInfo.pdgCodePositive, thisInfo.pdgCodeNegative, - thisInfo.isPhysicalPrimary, thisInfo.xyz[0], thisInfo.xyz[1], thisInfo.xyz[2], - thisInfo.posP[0], thisInfo.posP[1], thisInfo.posP[2], - thisInfo.negP[0], thisInfo.negP[1], thisInfo.negP[2], - thisInfo.momentum[0], thisInfo.momentum[1], thisInfo.momentum[2]); - histos.fill(HIST("hTableBuildingStatistics"), kV0MCCores); - } - if (mEnabledTables[kV0MCCollRefs]) { - v0mccollref(thisInfo.mcCollision); - histos.fill(HIST("hTableBuildingStatistics"), kV0MCCollRefs); - } - - // n.b. placing the interlink index here allows for the writing of - // code that is agnostic with respect to the joinability of - // V0Cores and V0MCCores (always dereference -> safe) - if (mEnabledTables[kV0CoreMCLabels]) { - v0CoreMCLabels(iv0); // interlink index - histos.fill(HIST("hTableBuildingStatistics"), kV0CoreMCLabels); - } - } - // ---] Asymmetric populate [--- - // in this approach, V0Cores will NOT be joinable with V0MCCores. - // an additional reference to V0MCCore that IS joinable with V0Cores - // will be provided to the user. - if (v0BuilderOpts.mc_populateV0MCCoresAsymmetric) { - int thisV0MCCoreIndex = -1; - // step 1: check if this element is already provided in the table - // using the packedIndices variable calculated above - for (uint32_t ii = 0; ii < mcV0infos.size(); ii++) { - if (thisInfo.label == mcV0infos[ii].label && mcV0infos[ii].label > -1) { - thisV0MCCoreIndex = ii; - break; // this exists already in list - } - } - if (thisV0MCCoreIndex < 0 && thisInfo.label > -1) { - // this V0MCCore does not exist yet. Create it and reference it - thisV0MCCoreIndex = mcV0infos.size(); - mcV0infos.push_back(thisInfo); - } - if (mEnabledTables[kV0CoreMCLabels]) { - v0CoreMCLabels(thisV0MCCoreIndex); // interlink index - histos.fill(HIST("hTableBuildingStatistics"), kV0CoreMCLabels); - } - } - } // enabled tables check - } // constexpr requires check - } - } - - // finish populating V0MCCores if in asymmetric mode - if constexpr (soa::is_table) { - if (v0BuilderOpts.mc_populateV0MCCoresAsymmetric && (mEnabledTables[kV0MCCores] || mEnabledTables[kV0MCCollRefs])) { - // first step: add any un-recoed v0mmcores that were requested - for (const auto& mcParticle : mcParticles) { - thisInfo.label = -1; - thisInfo.motherLabel = -1; - thisInfo.pdgCode = 0; - thisInfo.pdgCodeMother = -1; - thisInfo.pdgCodePositive = -1; - thisInfo.pdgCodeNegative = -1; - thisInfo.mcCollision = -1; - thisInfo.xyz[0] = thisInfo.xyz[1] = thisInfo.xyz[2] = 0.0f; - thisInfo.posP[0] = thisInfo.posP[1] = thisInfo.posP[2] = 0.0f; - thisInfo.negP[0] = thisInfo.negP[1] = thisInfo.negP[2] = 0.0f; - thisInfo.momentum[0] = thisInfo.momentum[1] = thisInfo.momentum[2] = 0.0f; - - if (mcParticleIsReco[mcParticle.globalIndex()] == true) - continue; // skip if already created in list - - if (std::fabs(mcParticle.y()) > v0BuilderOpts.mc_rapidityWindow) - continue; // skip outside midrapidity - - if ( - (v0BuilderOpts.mc_addGeneratedK0Short && mcParticle.pdgCode() == 310) || - (v0BuilderOpts.mc_addGeneratedLambda && mcParticle.pdgCode() == 3122) || - (v0BuilderOpts.mc_addGeneratedAntiLambda && mcParticle.pdgCode() == -3122) || - (v0BuilderOpts.mc_addGeneratedGamma && mcParticle.pdgCode() == 22)) { - thisInfo.pdgCode = mcParticle.pdgCode(); - thisInfo.isPhysicalPrimary = mcParticle.isPhysicalPrimary(); - thisInfo.label = mcParticle.globalIndex(); - - if (mcParticle.has_mcCollision()) { - thisInfo.mcCollision = mcParticle.mcCollisionId(); // save this reference, please - } - - // - thisInfo.momentum[0] = mcParticle.px(); - thisInfo.momentum[1] = mcParticle.py(); - thisInfo.momentum[2] = mcParticle.pz(); - - if (mcParticle.has_mothers()) { - auto const& mother = mcParticle.template mothers_first_as(); - thisInfo.pdgCodeMother = mother.pdgCode(); - thisInfo.motherLabel = mother.globalIndex(); - } - if (mcParticle.has_daughters()) { - auto const& daughters = mcParticle.template daughters_as(); - - for (const auto& dau : daughters) { - if (dau.getProcess() != 4) - continue; - - if (dau.pdgCode() > 0) { - thisInfo.pdgCodePositive = dau.pdgCode(); - thisInfo.processPositive = dau.getProcess(); - thisInfo.posP[0] = dau.px(); - thisInfo.posP[1] = dau.py(); - thisInfo.posP[2] = dau.pz(); - thisInfo.xyz[0] = dau.vx(); - thisInfo.xyz[1] = dau.vy(); - thisInfo.xyz[2] = dau.vz(); - } - if (dau.pdgCode() < 0) { - thisInfo.pdgCodeNegative = dau.pdgCode(); - thisInfo.processNegative = dau.getProcess(); - thisInfo.negP[0] = dau.px(); - thisInfo.negP[1] = dau.py(); - thisInfo.negP[2] = dau.pz(); - } - } - } - - // if I got here, it means this MC particle was not recoed and is of interest. Add it please - mcV0infos.push_back(thisInfo); - } - } - - for (const auto& info : mcV0infos) { - if (mEnabledTables[kV0MCCores]) { - v0mccores( - info.label, info.pdgCode, - info.pdgCodeMother, info.pdgCodePositive, info.pdgCodeNegative, - info.isPhysicalPrimary, info.xyz[0], info.xyz[1], info.xyz[2], - info.posP[0], info.posP[1], info.posP[2], - info.negP[0], info.negP[1], info.negP[2], - info.momentum[0], info.momentum[1], info.momentum[2]); - histos.fill(HIST("hTableBuildingStatistics"), kV0MCCores); - } - if (mEnabledTables[kV0MCCollRefs]) { - v0mccollref(info.mcCollision); - histos.fill(HIST("hTableBuildingStatistics"), kV0MCCollRefs); - } - } - } // end V0MCCores filling in case of MC - } // end constexpr requires mcParticles - - LOGF(debug, "V0s in DF: %i, V0s built: %i, V0s built and buffered for cascades: %i.", v0s.size(), nV0s, v0sFromCascades.size()); - } - - //__________________________________________________ - template - void extractMonteCarloProperties(TTrack const& posTrack, TTrack const& negTrack, TTrack const& bachTrack, TMCParticles const& mcParticles) - { - // encapsulates acquisition of MC properties from MC - thisCascInfo.pdgCode = -1, thisCascInfo.pdgCodeMother = -1; - thisCascInfo.pdgCodePositive = -1, thisCascInfo.pdgCodeNegative = -1; - thisCascInfo.pdgCodeBachelor = -1, thisCascInfo.pdgCodeV0 = -1; - thisCascInfo.isPhysicalPrimary = false; - thisCascInfo.xyz[0] = -999.0f, thisCascInfo.xyz[1] = -999.0f, thisCascInfo.xyz[2] = -999.0f; - thisCascInfo.lxyz[0] = -999.0f, thisCascInfo.lxyz[1] = -999.0f, thisCascInfo.lxyz[2] = -999.0f; - thisCascInfo.posP[0] = -999.0f, thisCascInfo.posP[1] = -999.0f, thisCascInfo.posP[2] = -999.0f; - thisCascInfo.negP[0] = -999.0f, thisCascInfo.negP[1] = -999.0f, thisCascInfo.negP[2] = -999.0f; - thisCascInfo.bachP[0] = -999.0f, thisCascInfo.bachP[1] = -999.0f, thisCascInfo.bachP[2] = -999.0f; - thisCascInfo.momentum[0] = -999.0f, thisCascInfo.momentum[1] = -999.0f, thisCascInfo.momentum[2] = -999.0f; - thisCascInfo.label = -1, thisCascInfo.motherLabel = -1; - thisCascInfo.mcParticlePositive = -1; - thisCascInfo.mcParticleNegative = -1; - thisCascInfo.mcParticleBachelor = -1; - - // Association check - // There might be smarter ways of doing this in the future - if (negTrack.has_mcParticle() && posTrack.has_mcParticle() && bachTrack.has_mcParticle()) { - auto lMCBachTrack = bachTrack.template mcParticle_as(); - auto lMCNegTrack = negTrack.template mcParticle_as(); - auto lMCPosTrack = posTrack.template mcParticle_as(); - - thisCascInfo.mcParticlePositive = lMCPosTrack.globalIndex(); - thisCascInfo.mcParticleNegative = lMCNegTrack.globalIndex(); - thisCascInfo.mcParticleBachelor = lMCBachTrack.globalIndex(); - thisCascInfo.pdgCodePositive = lMCPosTrack.pdgCode(); - thisCascInfo.pdgCodeNegative = lMCNegTrack.pdgCode(); - thisCascInfo.pdgCodeBachelor = lMCBachTrack.pdgCode(); - thisCascInfo.posP[0] = lMCPosTrack.px(); - thisCascInfo.posP[1] = lMCPosTrack.py(); - thisCascInfo.posP[2] = lMCPosTrack.pz(); - thisCascInfo.negP[0] = lMCNegTrack.px(); - thisCascInfo.negP[1] = lMCNegTrack.py(); - thisCascInfo.negP[2] = lMCNegTrack.pz(); - thisCascInfo.bachP[0] = lMCBachTrack.px(); - thisCascInfo.bachP[1] = lMCBachTrack.py(); - thisCascInfo.bachP[2] = lMCBachTrack.pz(); - thisCascInfo.processPositive = lMCPosTrack.getProcess(); - thisCascInfo.processNegative = lMCNegTrack.getProcess(); - thisCascInfo.processBachelor = lMCBachTrack.getProcess(); - - // Step 0: treat pi -> mu + antineutrino - // if present, de-reference original V0 correctly and provide label to original object - // NOTA BENE: the prong info will still correspond to a muon, treat carefully! - int negOriginating = -1, posOriginating = -1, bachOriginating = -1; - int particleForLambdaDecayPositionIdx = -1, particleForCascadeDecayPositionIdx = -1; - negOriginating = getOriginatingParticle(lMCNegTrack, particleForLambdaDecayPositionIdx, cascadeBuilderOpts.mc_treatPiToMuDecays); - posOriginating = getOriginatingParticle(lMCPosTrack, particleForLambdaDecayPositionIdx, cascadeBuilderOpts.mc_treatPiToMuDecays); - bachOriginating = getOriginatingParticle(lMCBachTrack, particleForCascadeDecayPositionIdx, cascadeBuilderOpts.mc_treatPiToMuDecays); - - if (negOriginating > -1 && negOriginating == posOriginating) { - auto originatingV0 = mcParticles.rawIteratorAt(negOriginating); - auto particleForLambdaDecayPosition = mcParticles.rawIteratorAt(particleForLambdaDecayPositionIdx); - - thisCascInfo.label = originatingV0.globalIndex(); - thisCascInfo.lxyz[0] = particleForLambdaDecayPosition.vx(); - thisCascInfo.lxyz[1] = particleForLambdaDecayPosition.vy(); - thisCascInfo.lxyz[2] = particleForLambdaDecayPosition.vz(); - thisCascInfo.pdgCodeV0 = originatingV0.pdgCode(); - - if (originatingV0.has_mothers()) { - for (const auto& lV0Mother : originatingV0.template mothers_as()) { - if (lV0Mother.globalIndex() == bachOriginating) { // found mother particle - thisCascInfo.label = lV0Mother.globalIndex(); - - if (lV0Mother.has_mcCollision()) { - thisCascInfo.mcCollision = lV0Mother.mcCollisionId(); // save this reference, please - } - - thisCascInfo.pdgCode = lV0Mother.pdgCode(); - thisCascInfo.isPhysicalPrimary = lV0Mother.isPhysicalPrimary(); - thisCascInfo.xyz[0] = originatingV0.vx(); - thisCascInfo.xyz[1] = originatingV0.vy(); - thisCascInfo.xyz[2] = originatingV0.vz(); - thisCascInfo.momentum[0] = lV0Mother.px(); - thisCascInfo.momentum[1] = lV0Mother.py(); - thisCascInfo.momentum[2] = lV0Mother.pz(); - if (lV0Mother.has_mothers()) { - for (const auto& lV0GrandMother : lV0Mother.template mothers_as()) { - thisCascInfo.pdgCodeMother = lV0GrandMother.pdgCode(); - thisCascInfo.motherLabel = lV0GrandMother.globalIndex(); - } - } - } - } // end v0 mother loop - } // end has_mothers check for V0 - } // end conditional of pos/neg originating being the same - } // end association check - } - - //__________________________________________________ - template - void buildCascades(TCollisions const& collisions, TCascades const& cascades, TTracks const& tracks, TMCParticles const& mcParticles) - { - // prepare MC containers (not necessarily used) - std::vector mcCascinfos; // V0MCCore information - std::vector mcParticleIsReco; - - if constexpr (soa::is_table) { - // do this if provided with a mcParticle table as well - mcParticleIsReco.resize(mcParticles.size(), false); - } - - if (!mEnabledTables[kStoredCascCores]) { - return; // don't do if no request for cascades in place - } - int nCascades = 0; - // Loops over all cascades in the time frame - histos.fill(HIST("hInputStatistics"), kStoredCascCores, cascades.size()); - for (size_t icascade = 0; icascade < cascades.size(); icascade++) { - // Get tracks and generate candidate - auto const& cascade = cascades[sorted_cascade[icascade]]; - auto const& collision = collisions.rawIteratorAt(cascade.collisionId); - auto const& posTrack = tracks.rawIteratorAt(cascade.posTrackId); - auto const& negTrack = tracks.rawIteratorAt(cascade.negTrackId); - auto const& bachTrack = tracks.rawIteratorAt(cascade.bachTrackId); - if (v0Map[cascade.v0Id] < 0) { - // this V0 hasn't been stored / cached - cascdataLink(-1); - interlinks.cascadeToCascCores.push_back(-1); - continue; // didn't work out, skip - } - if (!straHelper.buildCascadeCandidate(collision, - v0sFromCascades[v0Map[cascade.v0Id]], - posTrack, - negTrack, - bachTrack, - mEnabledTables[kCascBBs], - cascadeBuilderOpts.useCascadeMomentumAtPrimVtx, - mEnabledTables[kCascCovs])) { - cascdataLink(-1); - interlinks.cascadeToCascCores.push_back(-1); - continue; // didn't work out, skip - } - nCascades++; - - // generate analysis tables as required - if (mEnabledTables[kCascIndices]) { - cascidx(cascade.globalId, - straHelper.cascade.positiveTrack, straHelper.cascade.negativeTrack, - straHelper.cascade.bachelorTrack, straHelper.cascade.collisionId); - histos.fill(HIST("hTableBuildingStatistics"), kCascIndices); - } - if (mEnabledTables[kStoredCascCores]) { - cascdata(straHelper.cascade.charge, straHelper.cascade.massXi, straHelper.cascade.massOmega, - straHelper.cascade.cascadePosition[0], straHelper.cascade.cascadePosition[1], straHelper.cascade.cascadePosition[2], - straHelper.cascade.v0Position[0], straHelper.cascade.v0Position[1], straHelper.cascade.v0Position[2], - straHelper.cascade.positiveMomentum[0], straHelper.cascade.positiveMomentum[1], straHelper.cascade.positiveMomentum[2], - straHelper.cascade.negativeMomentum[0], straHelper.cascade.negativeMomentum[1], straHelper.cascade.negativeMomentum[2], - straHelper.cascade.bachelorMomentum[0], straHelper.cascade.bachelorMomentum[1], straHelper.cascade.bachelorMomentum[2], - straHelper.cascade.cascadeMomentum[0], straHelper.cascade.cascadeMomentum[1], straHelper.cascade.cascadeMomentum[2], - straHelper.cascade.v0DaughterDCA, straHelper.cascade.cascadeDaughterDCA, - straHelper.cascade.positiveDCAxy, straHelper.cascade.negativeDCAxy, - straHelper.cascade.bachelorDCAxy, straHelper.cascade.cascadeDCAxy, straHelper.cascade.cascadeDCAz); - histos.fill(HIST("hTableBuildingStatistics"), kStoredCascCores); - - // interlink always produced if cascades generated - cascdataLink(cascdata.lastIndex()); - interlinks.cascCoreToCascades.push_back(cascade.globalId); - interlinks.cascadeToCascCores.push_back(cascdata.lastIndex()); - } - - if (mEnabledTables[kCascTrackXs]) { - cascTrackXs(straHelper.cascade.positiveTrackX, straHelper.cascade.negativeTrackX, straHelper.cascade.bachelorTrackX); - histos.fill(HIST("hTableBuildingStatistics"), kCascTrackXs); - } - if (mEnabledTables[kCascBBs]) { - cascbb(straHelper.cascade.bachBaryonCosPA, straHelper.cascade.bachBaryonDCAxyToPV); - histos.fill(HIST("hTableBuildingStatistics"), kCascBBs); - } - if (mEnabledTables[kCascCovs]) { - casccovs(straHelper.cascade.covariance); - histos.fill(HIST("hTableBuildingStatistics"), kCascCovs); - } - - //_________________________________________________________ - // MC handling part - if constexpr (soa::is_table) { - // only worry about this if someone else worried about this - if ((mEnabledTables[kCascMCCores] || mEnabledTables[kMcCascLabels] || mEnabledTables[kCascMCCollRefs])) { - extractMonteCarloProperties(posTrack, negTrack, bachTrack, mcParticles); - - // Construct label table (note: this will be joinable with CascDatas) - if (mEnabledTables[kMcCascLabels]) { - casclabels( - thisCascInfo.label, thisCascInfo.motherLabel); - histos.fill(HIST("hTableBuildingStatistics"), kMcCascLabels); - } - - // Construct found tag - if (mEnabledTables[kCascFoundTags]) { - cascFoundTag(cascade.found); - histos.fill(HIST("hTableBuildingStatistics"), kCascFoundTags); - } - - // Mark mcParticle as recoed (no searching necessary afterwards) - if (thisCascInfo.label > -1) { - mcParticleIsReco[thisCascInfo.label] = true; - } - - if (cascadeBuilderOpts.mc_populateCascMCCoresSymmetric) { - if (mEnabledTables[kCascMCCores]) { - cascmccores( - thisCascInfo.pdgCode, thisCascInfo.pdgCodeMother, thisCascInfo.pdgCodeV0, thisCascInfo.isPhysicalPrimary, - thisCascInfo.pdgCodePositive, thisCascInfo.pdgCodeNegative, thisCascInfo.pdgCodeBachelor, - thisCascInfo.xyz[0], thisCascInfo.xyz[1], thisCascInfo.xyz[2], - thisCascInfo.lxyz[0], thisCascInfo.lxyz[1], thisCascInfo.lxyz[2], - thisCascInfo.posP[0], thisCascInfo.posP[1], thisCascInfo.posP[2], - thisCascInfo.negP[0], thisCascInfo.negP[1], thisCascInfo.negP[2], - thisCascInfo.bachP[0], thisCascInfo.bachP[1], thisCascInfo.bachP[2], - thisCascInfo.momentum[0], thisCascInfo.momentum[1], thisCascInfo.momentum[2]); - histos.fill(HIST("hTableBuildingStatistics"), kCascMCCores); - } - if (mEnabledTables[kCascMCCollRefs]) { - cascmccollrefs(thisCascInfo.mcCollision); - histos.fill(HIST("hTableBuildingStatistics"), kCascMCCollRefs); - } - } - - if (cascadeBuilderOpts.mc_populateCascMCCoresAsymmetric) { - int thisCascMCCoreIndex = -1; - // step 1: check if this element is already provided in the table - // using the packedIndices variable calculated above - for (uint32_t ii = 0; ii < mcCascinfos.size(); ii++) { - if (thisCascInfo.label == mcCascinfos[ii].label && mcCascinfos[ii].label > -1) { - thisCascMCCoreIndex = ii; - break; // this exists already in list - } - } - if (thisCascMCCoreIndex < 0) { - // this CascMCCore does not exist yet. Create it and reference it - thisCascMCCoreIndex = mcCascinfos.size(); - mcCascinfos.push_back(thisCascInfo); - } - if (mEnabledTables[kCascCoreMCLabels]) { - cascCoreMClabels(thisCascMCCoreIndex); // interlink: reconstructed -> MC index - histos.fill(HIST("hTableBuildingStatistics"), kCascCoreMCLabels); - } - } - - } // enabled tables check - - // if BB tags requested, generate them now - if (mEnabledTables[kMcCascBBTags]) { - bool bbTag = false; - if (bachTrack.has_mcParticle()) { - auto bachelorParticle = bachTrack.template mcParticle_as(); - if (bachelorParticle.pdgCode() == 211) { // pi+, look for antiproton in negative prong - if (negTrack.has_mcParticle()) { - auto baryonParticle = negTrack.template mcParticle_as(); - if (baryonParticle.has_mothers() && bachelorParticle.has_mothers() && baryonParticle.pdgCode() == -2212) { - for (const auto& baryonMother : baryonParticle.template mothers_as()) { - for (const auto& pionMother : bachelorParticle.template mothers_as()) { - if (baryonMother.globalIndex() == pionMother.globalIndex() && baryonMother.pdgCode() == -3122) { - bbTag = true; - } - } - } - } - } - } // end if-pion - if (bachelorParticle.pdgCode() == -211) { // pi-, look for proton in positive prong - if (posTrack.has_mcParticle()) { - auto baryonParticle = posTrack.template mcParticle_as(); - if (baryonParticle.has_mothers() && bachelorParticle.has_mothers() && baryonParticle.pdgCode() == 2212) { - for (const auto& baryonMother : baryonParticle.template mothers_as()) { - for (const auto& pionMother : bachelorParticle.template mothers_as()) { - if (baryonMother.globalIndex() == pionMother.globalIndex() && baryonMother.pdgCode() == 3122) { - bbTag = true; - } - } - } - } - } - } // end if-pion - } // end bachelor has mcparticle - // Construct label table (note: this will be joinable with CascDatas) - bbtags(bbTag); - histos.fill(HIST("hTableBuildingStatistics"), kMcCascBBTags); - } // end BB tag table enabled check - - } // constexpr requires mcParticles check - } // cascades loop - - //_________________________________________________________ - // MC handling part - if constexpr (soa::is_table) { - if ((mEnabledTables[kCascMCCores] || mEnabledTables[kMcCascLabels] || mEnabledTables[kCascMCCollRefs])) { - // now populate V0MCCores if in asymmetric mode - if (cascadeBuilderOpts.mc_populateCascMCCoresAsymmetric) { - // first step: add any un-recoed v0mmcores that were requested - for (const auto& mcParticle : mcParticles) { - thisCascInfo.pdgCode = -1, thisCascInfo.pdgCodeMother = -1; - thisCascInfo.pdgCodePositive = -1, thisCascInfo.pdgCodeNegative = -1; - thisCascInfo.pdgCodeBachelor = -1, thisCascInfo.pdgCodeV0 = -1; - thisCascInfo.isPhysicalPrimary = false; - thisCascInfo.xyz[0] = 0.0f, thisCascInfo.xyz[1] = 0.0f, thisCascInfo.xyz[2] = 0.0f; - thisCascInfo.lxyz[0] = 0.0f, thisCascInfo.lxyz[1] = 0.0f, thisCascInfo.lxyz[2] = 0.0f; - thisCascInfo.posP[0] = 0.0f, thisCascInfo.posP[1] = 0.0f, thisCascInfo.posP[2] = 0.0f; - thisCascInfo.negP[0] = 0.0f, thisCascInfo.negP[1] = 0.0f, thisCascInfo.negP[2] = 0.0f; - thisCascInfo.bachP[0] = 0.0f, thisCascInfo.bachP[1] = 0.0f, thisCascInfo.bachP[2] = 0.0f; - thisCascInfo.momentum[0] = 0.0f, thisCascInfo.momentum[1] = 0.0f, thisCascInfo.momentum[2] = 0.0f; - thisCascInfo.label = -1, thisCascInfo.motherLabel = -1; - thisCascInfo.mcParticlePositive = -1; - thisCascInfo.mcParticleNegative = -1; - thisCascInfo.mcParticleBachelor = -1; - - if (mcParticleIsReco[mcParticle.globalIndex()] == true) - continue; // skip if already created in list - - if (std::fabs(mcParticle.y()) > cascadeBuilderOpts.mc_rapidityWindow) - continue; // skip outside midrapidity - - if ( - (cascadeBuilderOpts.mc_addGeneratedXiMinus && mcParticle.pdgCode() == 3312) || - (cascadeBuilderOpts.mc_addGeneratedXiPlus && mcParticle.pdgCode() == -3312) || - (cascadeBuilderOpts.mc_addGeneratedOmegaMinus && mcParticle.pdgCode() == 3334) || - (cascadeBuilderOpts.mc_addGeneratedOmegaPlus && mcParticle.pdgCode() == -3334)) { - thisCascInfo.pdgCode = mcParticle.pdgCode(); - thisCascInfo.isPhysicalPrimary = mcParticle.isPhysicalPrimary(); - - if (mcParticle.has_mcCollision()) { - thisCascInfo.mcCollision = mcParticle.mcCollisionId(); // save this reference, please - } - thisCascInfo.momentum[0] = mcParticle.px(); - thisCascInfo.momentum[1] = mcParticle.py(); - thisCascInfo.momentum[2] = mcParticle.pz(); - thisCascInfo.label = mcParticle.globalIndex(); - - if (mcParticle.has_daughters()) { - auto const& daughters = mcParticle.template daughters_as(); - for (const auto& dau : daughters) { - if (dau.getProcess() != 4) // check whether the daughter comes from a decay - continue; - - if (std::abs(dau.pdgCode()) == 211 || std::abs(dau.pdgCode()) == 321) { - thisCascInfo.pdgCodeBachelor = dau.pdgCode(); - thisCascInfo.bachP[0] = dau.px(); - thisCascInfo.bachP[1] = dau.py(); - thisCascInfo.bachP[2] = dau.pz(); - thisCascInfo.xyz[0] = dau.vx(); - thisCascInfo.xyz[1] = dau.vy(); - thisCascInfo.xyz[2] = dau.vz(); - thisCascInfo.mcParticleBachelor = dau.globalIndex(); - } - if (std::abs(dau.pdgCode()) == 2212) { - thisCascInfo.pdgCodeV0 = dau.pdgCode(); - - for (const auto& v0Dau : dau.template daughters_as()) { - if (v0Dau.getProcess() != 4) - continue; - - if (v0Dau.pdgCode() > 0) { - thisCascInfo.pdgCodePositive = v0Dau.pdgCode(); - thisCascInfo.processPositive = v0Dau.getProcess(); - thisCascInfo.posP[0] = v0Dau.px(); - thisCascInfo.posP[1] = v0Dau.py(); - thisCascInfo.posP[2] = v0Dau.pz(); - thisCascInfo.lxyz[0] = v0Dau.vx(); - thisCascInfo.lxyz[1] = v0Dau.vy(); - thisCascInfo.lxyz[2] = v0Dau.vz(); - thisCascInfo.mcParticlePositive = v0Dau.globalIndex(); - } - if (v0Dau.pdgCode() < 0) { - thisCascInfo.pdgCodeNegative = v0Dau.pdgCode(); - thisCascInfo.processNegative = v0Dau.getProcess(); - thisCascInfo.negP[0] = v0Dau.px(); - thisCascInfo.negP[1] = v0Dau.py(); - thisCascInfo.negP[2] = v0Dau.pz(); - thisCascInfo.mcParticleNegative = v0Dau.globalIndex(); - } - } - } - } - } - - // if I got here, it means this MC particle was not recoed and is of interest. Add it please - mcCascinfos.push_back(thisCascInfo); - } - } - - for (const auto& thisInfoToFill : mcCascinfos) { - if (mEnabledTables[kCascMCCores]) { - cascmccores( // a lot of the info below will be compressed in case of not-recoed MC (good!) - thisInfoToFill.pdgCode, thisInfoToFill.pdgCodeMother, thisInfoToFill.pdgCodeV0, thisInfoToFill.isPhysicalPrimary, - thisInfoToFill.pdgCodePositive, thisInfoToFill.pdgCodeNegative, thisInfoToFill.pdgCodeBachelor, - thisInfoToFill.xyz[0], thisInfoToFill.xyz[1], thisInfoToFill.xyz[2], - thisInfoToFill.lxyz[0], thisInfoToFill.lxyz[1], thisInfoToFill.lxyz[2], - thisInfoToFill.posP[0], thisInfoToFill.posP[1], thisInfoToFill.posP[2], - thisInfoToFill.negP[0], thisInfoToFill.negP[1], thisInfoToFill.negP[2], - thisInfoToFill.bachP[0], thisInfoToFill.bachP[1], thisInfoToFill.bachP[2], - thisInfoToFill.momentum[0], thisInfoToFill.momentum[1], thisInfoToFill.momentum[2]); - histos.fill(HIST("hTableBuildingStatistics"), kCascMCCores); - } - if (mEnabledTables[kCascMCCollRefs]) { - cascmccollrefs(thisInfoToFill.mcCollision); - histos.fill(HIST("hTableBuildingStatistics"), kCascMCCollRefs); - } - } - } - } // enabled tables check - } // constexpr requires mcParticles check - - LOGF(debug, "Cascades in DF: %i, cascades built: %i", cascades.size(), nCascades); - } - - //__________________________________________________ - template - void buildKFCascades(TCollisions const& collisions, TCascades const& cascades, TTracks const& tracks, TMCParticles const& mcParticles) - { - if (!mEnabledTables[kStoredKFCascCores]) { - return; // don't do if no request for cascades in place - } - int nCascades = 0; - // Loops over all cascades in the time frame - histos.fill(HIST("hInputStatistics"), kStoredKFCascCores, cascades.size()); - for (size_t icascade = 0; icascade < cascades.size(); icascade++) { - // Get tracks and generate candidate - auto const& cascade = cascades[sorted_cascade[icascade]]; - auto const& collision = collisions.rawIteratorAt(cascade.collisionId); - auto const& posTrack = tracks.rawIteratorAt(cascade.posTrackId); - auto const& negTrack = tracks.rawIteratorAt(cascade.negTrackId); - auto const& bachTrack = tracks.rawIteratorAt(cascade.bachTrackId); - if (!straHelper.buildCascadeCandidateWithKF(collision, - posTrack, - negTrack, - bachTrack, - mEnabledTables[kCascBBs], - cascadeBuilderOpts.kfConstructMethod, - cascadeBuilderOpts.kfTuneForOmega, - cascadeBuilderOpts.kfUseV0MassConstraint, - cascadeBuilderOpts.kfUseCascadeMassConstraint, - cascadeBuilderOpts.kfDoDCAFitterPreMinimV0, - cascadeBuilderOpts.kfDoDCAFitterPreMinimCasc)) { - kfcascdataLink(-1); - interlinks.cascadeToKFCascCores.push_back(-1); - continue; // didn't work out, skip - } - nCascades++; - - // generate analysis tables as required - if (mEnabledTables[kKFCascIndices]) { - kfcascidx(cascade.globalId, - straHelper.cascade.positiveTrack, straHelper.cascade.negativeTrack, - straHelper.cascade.bachelorTrack, straHelper.cascade.collisionId); - histos.fill(HIST("hTableBuildingStatistics"), kKFCascIndices); - } - if (mEnabledTables[kStoredKFCascCores]) { - kfcascdata(straHelper.cascade.charge, straHelper.cascade.massXi, straHelper.cascade.massOmega, - straHelper.cascade.cascadePosition[0], straHelper.cascade.cascadePosition[1], straHelper.cascade.cascadePosition[2], - straHelper.cascade.v0Position[0], straHelper.cascade.v0Position[1], straHelper.cascade.v0Position[2], - straHelper.cascade.positivePosition[0], straHelper.cascade.positivePosition[1], straHelper.cascade.positivePosition[2], - straHelper.cascade.negativePosition[0], straHelper.cascade.negativePosition[1], straHelper.cascade.negativePosition[2], - straHelper.cascade.positiveMomentum[0], straHelper.cascade.positiveMomentum[1], straHelper.cascade.positiveMomentum[2], - straHelper.cascade.negativeMomentum[0], straHelper.cascade.negativeMomentum[1], straHelper.cascade.negativeMomentum[2], - straHelper.cascade.bachelorMomentum[0], straHelper.cascade.bachelorMomentum[1], straHelper.cascade.bachelorMomentum[2], - straHelper.cascade.v0Momentum[0], straHelper.cascade.v0Momentum[1], straHelper.cascade.v0Momentum[2], - straHelper.cascade.cascadeMomentum[0], straHelper.cascade.cascadeMomentum[1], straHelper.cascade.cascadeMomentum[2], - straHelper.cascade.v0DaughterDCA, straHelper.cascade.cascadeDaughterDCA, - straHelper.cascade.positiveDCAxy, straHelper.cascade.negativeDCAxy, - straHelper.cascade.bachelorDCAxy, straHelper.cascade.cascadeDCAxy, straHelper.cascade.cascadeDCAz, - straHelper.cascade.kfMLambda, straHelper.cascade.kfV0Chi2, straHelper.cascade.kfCascadeChi2); - histos.fill(HIST("hTableBuildingStatistics"), kStoredKFCascCores); - - // interlink always produced if cascades generated - kfcascdataLink(kfcascdata.lastIndex()); - interlinks.kfCascCoreToCascades.push_back(cascade.globalId); - interlinks.cascadeToKFCascCores.push_back(kfcascdata.lastIndex()); - } - if (mEnabledTables[kKFCascCovs]) { - kfcasccovs(straHelper.cascade.covariance, straHelper.cascade.kfTrackCovarianceV0, straHelper.cascade.kfTrackCovariancePos, straHelper.cascade.kfTrackCovarianceNeg); - histos.fill(HIST("hTableBuildingStatistics"), kKFCascCovs); - } - - //_________________________________________________________ - // MC handling part (labels only) - if constexpr (soa::is_table) { - // only worry about this if someone else worried about this - if ((mEnabledTables[kMcKFCascLabels])) { - extractMonteCarloProperties(posTrack, negTrack, bachTrack, mcParticles); - - // Construct label table (note: this will be joinable with KFCascDatas) - kfcasclabels(thisCascInfo.label); - histos.fill(HIST("hTableBuildingStatistics"), kMcKFCascLabels); - } // enabled tables check - } // constexpr requires mcParticles check - } // end loop over cascades - - LOGF(debug, "KF Cascades in DF: %i, KF cascades built: %i", cascades.size(), nCascades); - } - - //__________________________________________________ - template - void buildTrackedCascades(TStrangeTracks const& cascadeTracks, TMCParticles const& mcParticles) - { - if (!mEnabledTables[kStoredTraCascCores] || mc_findableMode.value != 0) { - return; // don't do if no request for cascades in place or findable mode used - } - int nCascades = 0; - // Loops over all V0s in the time frame - histos.fill(HIST("hInputStatistics"), kStoredTraCascCores, cascadeTracks.size()); - for (const auto& cascadeTrack : cascadeTracks) { - // Get tracks and generate candidate - if (!cascadeTrack.has_track()) - continue; // safety (should be fine but depends on future stratrack dev) - - auto const& strangeTrack = cascadeTrack.template track_as(); - auto const& collision = strangeTrack.collision(); - auto const& cascade = cascadeTrack.cascade(); - auto const& v0 = cascade.v0(); - auto const& posTrack = v0.template posTrack_as(); - auto const& negTrack = v0.template negTrack_as(); - auto const& bachTrack = cascade.template bachelor_as(); - if (!straHelper.buildCascadeCandidate(collision, - posTrack, - negTrack, - bachTrack, - mEnabledTables[kCascBBs], - cascadeBuilderOpts.useCascadeMomentumAtPrimVtx, - mEnabledTables[kCascCovs])) { - tracascdataLink(-1); - interlinks.cascadeToTraCascCores.push_back(-1); - continue; // didn't work out, skip - } - - // recalculate DCAxy, DCAz with strange track - auto strangeTrackParCov = getTrackParCov(strangeTrack); - gpu::gpustd::array dcaInfo; - strangeTrackParCov.setPID(o2::track::PID::XiMinus); // FIXME: not OK for omegas - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, strangeTrackParCov, 2.f, straHelper.fitter.getMatCorrType(), &dcaInfo); - straHelper.cascade.cascadeDCAxy = dcaInfo[0]; - straHelper.cascade.cascadeDCAz = dcaInfo[1]; - - // get momentum from strange track (should not be very different) - strangeTrackParCov.getPxPyPzGlo(straHelper.cascade.cascadeMomentum); - - // accounting - nCascades++; - - // generate analysis tables as required - if (mEnabledTables[kTraCascIndices]) { - tracascidx(cascade.globalIndex(), - straHelper.cascade.positiveTrack, straHelper.cascade.negativeTrack, - straHelper.cascade.bachelorTrack, cascadeTrack.trackId(), straHelper.cascade.collisionId); - histos.fill(HIST("hTableBuildingStatistics"), kTraCascIndices); - } - if (mEnabledTables[kStoredTraCascCores]) { - tracascdata(straHelper.cascade.charge, cascadeTrack.xiMass(), cascadeTrack.omegaMass(), - cascadeTrack.decayX(), cascadeTrack.decayY(), cascadeTrack.decayZ(), - straHelper.cascade.v0Position[0], straHelper.cascade.v0Position[1], straHelper.cascade.v0Position[2], - straHelper.cascade.positiveMomentum[0], straHelper.cascade.positiveMomentum[1], straHelper.cascade.positiveMomentum[2], - straHelper.cascade.negativeMomentum[0], straHelper.cascade.negativeMomentum[1], straHelper.cascade.negativeMomentum[2], - straHelper.cascade.bachelorMomentum[0], straHelper.cascade.bachelorMomentum[1], straHelper.cascade.bachelorMomentum[2], - straHelper.cascade.cascadeMomentum[0], straHelper.cascade.cascadeMomentum[1], straHelper.cascade.cascadeMomentum[2], - straHelper.cascade.v0DaughterDCA, straHelper.cascade.cascadeDaughterDCA, - straHelper.cascade.positiveDCAxy, straHelper.cascade.negativeDCAxy, - straHelper.cascade.bachelorDCAxy, straHelper.cascade.cascadeDCAxy, straHelper.cascade.cascadeDCAz, - cascadeTrack.matchingChi2(), cascadeTrack.topologyChi2(), cascadeTrack.itsClsSize()); - histos.fill(HIST("hTableBuildingStatistics"), kStoredTraCascCores); - - // interlink always produced if base core table generated - tracascdataLink(tracascdata.lastIndex()); - interlinks.traCascCoreToCascades.push_back(cascade.globalIndex()); - interlinks.cascadeToTraCascCores.push_back(tracascdata.lastIndex()); - } - if (mEnabledTables[kCascCovs]) { - std::array traCovMat = {0.}; - strangeTrackParCov.getCovXYZPxPyPzGlo(traCovMat); - float traCovMatArray[21]; - for (int ii = 0; ii < 21; ii++) { - traCovMatArray[ii] = traCovMat[ii]; - } - tracasccovs(traCovMatArray); - histos.fill(HIST("hTableBuildingStatistics"), kCascCovs); - } - - //_________________________________________________________ - // MC handling part (labels only) - if constexpr (soa::is_table) { - // only worry about this if someone else worried about this - if ((mEnabledTables[kMcTraCascLabels])) { - extractMonteCarloProperties(posTrack, negTrack, bachTrack, mcParticles); - - // Construct label table (note: this will be joinable with KFCascDatas) - tracasclabels(thisCascInfo.label); - histos.fill(HIST("hTableBuildingStatistics"), kMcTraCascLabels); - } // enabled tables check - } // constexpr requires mcParticles check - } // end loop over cascades - LOGF(debug, "Tracked cascades in DF: %i, tracked cascades built: %i", cascadeTracks.size(), nCascades); - } - - //__________________________________________________ - // MC kink handling - template - int getOriginatingParticle(mcpart const& part, int& indexForPositionOfDecay, bool treatPiToMuDecays) - { - int returnValue = -1; - if (part.has_mothers()) { - auto const& motherList = part.template mothers_as(); - if (motherList.size() == 1) { - for (const auto& mother : motherList) { - if (std::abs(part.pdgCode()) == 13 && treatPiToMuDecays) { - // muon decay, de-ref mother twice - if (mother.has_mothers()) { - auto grandMotherList = mother.template mothers_as(); - if (grandMotherList.size() == 1) { - for (const auto& grandMother : grandMotherList) { - returnValue = grandMother.globalIndex(); - indexForPositionOfDecay = mother.globalIndex(); // for V0 decay position: grab muon - } - } - } - } else { - returnValue = mother.globalIndex(); - indexForPositionOfDecay = part.globalIndex(); - } - } - } - } - return returnValue; - } - - //__________________________________________________ - template - void dataProcess(TCollisions const& collisions, TMCCollisions const& mccollisions, TV0s const& v0s, TCascades const& cascades, TTrackedCascades const& trackedCascades, TTracks const& tracks, TBCs const& bcs, TMCParticles const& mcParticles) - { - if (!initCCDB(bcs, collisions)) - return; - - // reset vectors for cascade interlinks - resetInterlinks(); - - // prepare v0List, cascadeList - prepareBuildingLists(collisions, mccollisions, v0s, cascades, tracks, mcParticles); - - // mark V0s that will be buffered for the cascade building - markV0sUsedInCascades(v0List, cascadeList, trackedCascades); - - // build V0s - buildV0s(collisions, v0List, tracks, mcParticles); - - // build cascades - buildCascades(collisions, cascadeList, tracks, mcParticles); - buildKFCascades(collisions, cascadeList, tracks, mcParticles); - - // build tracked cascades only if subscription is Run 3 like (doesn't exist in Run 2) - if constexpr (soa::is_table) { - buildTrackedCascades(trackedCascades, mcParticles); - } - - populateCascadeInterlinks(); - } - - void processRealData(aod::Collisions const& collisions, aod::V0s const& v0s, aod::Cascades const& cascades, aod::TrackedCascades const& trackedCascades, FullTracksExtIU const& tracks, aod::BCsWithTimestamps const& bcs) - { - dataProcess(collisions, static_cast(nullptr), v0s, cascades, trackedCascades, tracks, bcs, static_cast(nullptr)); - } - - void processRealDataRun2(aod::Collisions const& collisions, aod::V0s const& v0s, aod::Cascades const& cascades, FullTracksExt const& tracks, aod::BCsWithTimestamps const& bcs) - { - dataProcess(collisions, static_cast(nullptr), v0s, cascades, static_cast(nullptr), tracks, bcs, static_cast(nullptr)); - } - - void processMonteCarlo(soa::Join const& collisions, aod::McCollisions const& mccollisions, aod::V0s const& v0s, aod::Cascades const& cascades, aod::TrackedCascades const& trackedCascades, FullTracksExtLabeledIU const& tracks, aod::BCsWithTimestamps const& bcs, aod::McParticles const& mcParticles) - { - dataProcess(collisions, mccollisions, v0s, cascades, trackedCascades, tracks, bcs, mcParticles); - } - - void processMonteCarloRun2(soa::Join const& collisions, aod::McCollisions const& mccollisions, aod::V0s const& v0s, aod::Cascades const& cascades, FullTracksExtLabeled const& tracks, aod::BCsWithTimestamps const& bcs, aod::McParticles const& mcParticles) - { - dataProcess(collisions, mccollisions, v0s, cascades, static_cast(nullptr), tracks, bcs, mcParticles); - } - - PROCESS_SWITCH(StrangenessBuilder, processRealData, "process real data", true); - PROCESS_SWITCH(StrangenessBuilder, processRealDataRun2, "process real data (Run 2)", false); - PROCESS_SWITCH(StrangenessBuilder, processMonteCarlo, "process monte carlo", false); - PROCESS_SWITCH(StrangenessBuilder, processMonteCarloRun2, "process monte carlo (Run 2)", false); -}; - -// Extends the v0data table with expression columns -struct strangenessbuilderInitializer { - Spawns v0cores; - Spawns cascdataext; - Spawns kfcascdataext; - Spawns tracascdataext; - void init(InitContext const&) {} -}; - -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - return WorkflowSpec{ - adaptAnalysisTask(cfgc), - adaptAnalysisTask(cfgc)}; -} diff --git a/PWGLF/Utils/strangenessBuilderHelper.h b/PWGLF/Utils/strangenessBuilderHelper.h index bed7cc74955..289c8c32594 100644 --- a/PWGLF/Utils/strangenessBuilderHelper.h +++ b/PWGLF/Utils/strangenessBuilderHelper.h @@ -161,8 +161,9 @@ class strangenessBuilderHelper fitter.setBz(-999.9f); // will NOT make sense if not changed }; - template - bool buildV0Candidate(TCollision const& collision, + template + bool buildV0Candidate(int collisionIndex, + float pvX, float pvY, float pvZ, TTrack const& positiveTrack, TTrack const& negativeTrack, bool useCollinearFit = false, @@ -188,7 +189,7 @@ class strangenessBuilderHelper gpu::gpustd::array dcaInfo; auto posTrackPar = getTrackPar(positiveTrack); - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, posTrackPar, 2.f, fitter.getMatCorrType(), &dcaInfo); + o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, posTrackPar, 2.f, fitter.getMatCorrType(), &dcaInfo); v0.positiveDCAxy = dcaInfo[0]; if (std::fabs(v0.positiveDCAxy) < v0selections.dcanegtopv) { @@ -196,7 +197,7 @@ class strangenessBuilderHelper } auto negTrackPar = getTrackPar(negativeTrack); - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, negTrackPar, 2.f, fitter.getMatCorrType(), &dcaInfo); + o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, negTrackPar, 2.f, fitter.getMatCorrType(), &dcaInfo); v0.negativeDCAxy = dcaInfo[0]; if (std::fabs(v0.negativeDCAxy) < v0selections.dcanegtopv) { @@ -245,7 +246,7 @@ class strangenessBuilderHelper } double cosPA = RecoDecay::cpa( - std::array{collision.posX(), collision.posY(), collision.posZ()}, + std::array{pvX, pvY, pvZ}, std::array{v0.position[0], v0.position[1], v0.position[2]}, std::array{v0.positiveMomentum[0] + v0.negativeMomentum[0], v0.positiveMomentum[1] + v0.negativeMomentum[1], v0.positiveMomentum[2] + v0.negativeMomentum[2]}); if (cosPA < v0selections.v0cospa) { @@ -258,7 +259,7 @@ class strangenessBuilderHelper v0.positiveMomentum[0] + v0.negativeMomentum[0], v0.positiveMomentum[1] + v0.negativeMomentum[1], v0.positiveMomentum[2] + v0.negativeMomentum[2], - collision.posX(), collision.posY(), collision.posZ()); + pvX, pvY, pvZ); // Calculate masses v0.massGamma = RecoDecay::m(std::array{ @@ -300,15 +301,16 @@ class strangenessBuilderHelper } // set collision Id correctly - v0.collisionId = collision.globalIndex(); + v0.collisionId = collisionIndex; // information validated, V0 built successfully. Signal OK return true; } // cascade builder creating a cascade from plain tracks - template - bool buildCascadeCandidate(TCollision const& collision, + template + bool buildCascadeCandidate(int collisionIndex, + float pvX, float pvY, float pvZ, TTrack const& positiveTrack, TTrack const& negativeTrack, TTrack const& bachelorTrack, @@ -316,10 +318,10 @@ class strangenessBuilderHelper bool useCascadeMomentumAtPV = false, bool processCovariances = false) { - if (!buildV0Candidate(collision, positiveTrack, negativeTrack, false, processCovariances)) { + if (!buildV0Candidate(collisionIndex, pvX, pvY, pvZ, positiveTrack, negativeTrack, false, processCovariances)) { return false; } - if (!buildCascadeCandidate(collision, v0, positiveTrack, negativeTrack, bachelorTrack, calculateBachelorBaryonVariables, useCascadeMomentumAtPV, processCovariances)) { + if (!buildCascadeCandidate(collisionIndex, pvX, pvY, pvZ, v0, positiveTrack, negativeTrack, bachelorTrack, calculateBachelorBaryonVariables, useCascadeMomentumAtPV, processCovariances)) { return false; } return true; @@ -328,8 +330,9 @@ class strangenessBuilderHelper // cascade builder using pre-fabricated information, thus not calling // the DCAfitter again for the V0 contained in the cascade // if generating from scratch, prefer the other variant - template - bool buildCascadeCandidate(TCollision const& collision, + template + bool buildCascadeCandidate(int collisionIndex, + float pvX, float pvY, float pvZ, v0candidate const& v0input, TTrack const& positiveTrack, TTrack const& negativeTrack, @@ -372,9 +375,9 @@ class strangenessBuilderHelper // Calculates properties of the V0 comprised of bachelor and baryon in the cascade // baryon: distinguished via bachelor charge if (bachelorTrack.sign() < 0) { - processBachBaryonVariables(collision, bachelorTrack, positiveTrack); + processBachBaryonVariables(pvX, pvY, pvZ, bachelorTrack, positiveTrack); } else { - processBachBaryonVariables(collision, bachelorTrack, negativeTrack); + processBachBaryonVariables(pvX, pvY, pvZ, bachelorTrack, negativeTrack); } } @@ -386,7 +389,7 @@ class strangenessBuilderHelper gpu::gpustd::array dcaInfo; auto bachTrackPar = getTrackPar(bachelorTrack); - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, bachTrackPar, 2.f, fitter.getMatCorrType(), &dcaInfo); + o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, bachTrackPar, 2.f, fitter.getMatCorrType(), &dcaInfo); cascade.bachelorDCAxy = dcaInfo[0]; if (std::fabs(cascade.bachelorDCAxy) < cascadeselections.dcabachtopv) { @@ -441,7 +444,7 @@ class strangenessBuilderHelper } double cosPA = RecoDecay::cpa( - std::array{collision.posX(), collision.posY(), collision.posZ()}, + std::array{pvX, pvY, pvZ}, std::array{cascade.cascadePosition[0], cascade.cascadePosition[1], cascade.cascadePosition[2]}, std::array{v0input.positiveMomentum[0] + v0input.negativeMomentum[0] + cascade.bachelorMomentum[0], v0input.positiveMomentum[1] + v0input.negativeMomentum[1] + cascade.bachelorMomentum[1], @@ -458,7 +461,7 @@ class strangenessBuilderHelper dcaInfo[0] = 999; dcaInfo[1] = 999; - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, lCascadeTrack, 2.f, fitter.getMatCorrType(), &dcaInfo); + o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, lCascadeTrack, 2.f, fitter.getMatCorrType(), &dcaInfo); cascade.cascadeDCAxy = dcaInfo[0]; cascade.cascadeDCAz = dcaInfo[1]; @@ -472,7 +475,7 @@ class strangenessBuilderHelper // Populate information // cascadecandidate.v0Id = v0index.globalIndex(); - cascade.collisionId = collision.globalIndex(); + cascade.collisionId = collisionIndex; cascade.positiveTrack = positiveTrack.globalIndex(); cascade.negativeTrack = negativeTrack.globalIndex(); cascade.bachelorTrack = bachelorTrack.globalIndex(); @@ -534,8 +537,9 @@ class strangenessBuilderHelper return true; } - template - bool buildCascadeCandidateWithKF(TCollision const& collision, + template + bool buildCascadeCandidateWithKF(int collisionIndex, + float pvX, float pvY, float pvZ, TTrack const& positiveTrack, TTrack const& negativeTrack, TTrack const& bachelorTrack, @@ -577,9 +581,9 @@ class strangenessBuilderHelper // Calculates properties of the V0 comprised of bachelor and baryon in the cascade // baryon: distinguished via bachelor charge if (bachelorTrack.sign() < 0) { - processBachBaryonVariables(collision, bachelorTrack, positiveTrack); + processBachBaryonVariables(pvX, pvY, pvZ, bachelorTrack, positiveTrack); } else { - processBachBaryonVariables(collision, bachelorTrack, negativeTrack); + processBachBaryonVariables(pvX, pvY, pvZ, bachelorTrack, negativeTrack); } } @@ -591,13 +595,13 @@ class strangenessBuilderHelper gpu::gpustd::array dcaInfo; auto bachTrackPar = getTrackPar(bachelorTrack); - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, bachTrackPar, 2.f, fitter.getMatCorrType(), &dcaInfo); + o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, bachTrackPar, 2.f, fitter.getMatCorrType(), &dcaInfo); cascade.bachelorDCAxy = dcaInfo[0]; o2::track::TrackParCov posTrackParCovForDCA = getTrackParCov(positiveTrack); - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, posTrackParCovForDCA, 2.f, fitter.getMatCorrType(), &dcaInfo); + o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, posTrackParCovForDCA, 2.f, fitter.getMatCorrType(), &dcaInfo); cascade.positiveDCAxy = dcaInfo[0]; o2::track::TrackParCov negTrackParCovForDCA = getTrackParCov(negativeTrack); - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, negTrackParCovForDCA, 2.f, fitter.getMatCorrType(), &dcaInfo); + o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, negTrackParCovForDCA, 2.f, fitter.getMatCorrType(), &dcaInfo); cascade.negativeDCAxy = dcaInfo[0]; if (std::fabs(cascade.bachelorDCAxy) < cascadeselections.dcabachtopv) { @@ -735,7 +739,7 @@ class strangenessBuilderHelper } dcaInfo[0] = 999; dcaInfo[1] = 999; - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, lCascadeTrack, 2.f, fitter.getMatCorrType(), &dcaInfo); + o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, lCascadeTrack, 2.f, fitter.getMatCorrType(), &dcaInfo); cascade.cascadeDCAxy = dcaInfo[0]; cascade.cascadeDCAz = dcaInfo[1]; @@ -743,6 +747,7 @@ class strangenessBuilderHelper //*>~<* step 6 : acquire all parameters for analysis // basic indices + cascade.collisionId = collisionIndex; cascade.v0Id = -1; cascade.positiveTrack = positiveTrack.globalIndex(); cascade.negativeTrack = negativeTrack.globalIndex(); @@ -795,7 +800,7 @@ class strangenessBuilderHelper // KF-aware cosPA double cosPA = RecoDecay::cpa( - std::array{collision.posX(), collision.posY(), collision.posZ()}, + std::array{pvX, pvY, pvZ}, std::array{cascade.cascadePosition[0], cascade.cascadePosition[1], cascade.cascadePosition[2]}, std::array{cascade.cascadeMomentum[0], cascade.cascadeMomentum[1], cascade.cascadeMomentum[2]}); if (cosPA < cascadeselections.casccospa) { @@ -873,8 +878,8 @@ class strangenessBuilderHelper return std::sqrt((std::pow((pvY - Y) * Pz - (pvZ - Z) * Py, 2) + std::pow((pvX - X) * Pz - (pvZ - Z) * Px, 2) + std::pow((pvX - X) * Py - (pvY - Y) * Px, 2)) / (Px * Px + Py * Py + Pz * Pz)); } - template - void processBachBaryonVariables(TCollision const& collision, TTrack const& track1, TTrack const& track2) + template + void processBachBaryonVariables(float pvX, float pvY, float pvZ, TTrack const& track1, TTrack const& track2) { cascade.bachBaryonCosPA = 0; // would ordinarily accept all cascade.bachBaryonDCAxyToPV = 1e+3; // would ordinarily accept all @@ -902,7 +907,7 @@ class strangenessBuilderHelper dcaInfo[1] = 999; // bachelor-baryon DCAxy to PV - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, wrongV0, 2.f, fitter.getMatCorrType(), &dcaInfo); + o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, wrongV0, 2.f, fitter.getMatCorrType(), &dcaInfo); cascade.bachBaryonDCAxyToPV = dcaInfo[0]; const auto& vtx = fitter.getPCACandidate(); @@ -917,7 +922,7 @@ class strangenessBuilderHelper // bachelor-baryon CosPA cascade.bachBaryonCosPA = RecoDecay::cpa( - std::array{collision.posX(), collision.posY(), collision.posZ()}, + std::array{pvX, pvY, pvZ}, std::array{vtx[0], vtx[1], vtx[2]}, std::array{tr1p[0] + tr2p[0], tr1p[1] + tr2p[1], tr1p[2] + tr2p[2]}); From fc6b953c3b114421152ecab62c8300fd342c1a0a Mon Sep 17 00:00:00 2001 From: Paul Buehler Date: Fri, 28 Feb 2025 17:01:08 +0100 Subject: [PATCH 0473/1650] [PWGUD] Introducing configurable generatorIds in the table producers, which allows to specify the MC processes to consider (#10225) Co-authored-by: rolavick --- PWGUD/Core/decayTree.h | 9 +- PWGUD/TableProducer/DGCandProducer.cxx | 263 +++++++++++++++---------- PWGUD/TableProducer/SGCandProducer.cxx | 87 ++++++-- 3 files changed, 224 insertions(+), 135 deletions(-) diff --git a/PWGUD/Core/decayTree.h b/PWGUD/Core/decayTree.h index a23f688adea..3dd4f53578b 100644 --- a/PWGUD/Core/decayTree.h +++ b/PWGUD/Core/decayTree.h @@ -201,11 +201,6 @@ class reconstructedParticle private: std::string fName; - - // status - // 0: not defined - // 1: ULS - // 2: LS TLorentzVector fIVM; std::vector fComb; }; @@ -896,11 +891,11 @@ class decayTree // M vs dcaXYZ hname = base; hname.append("MvsdcaXY_").append(res->name()).append(d1->name()); - annot = "M versus dcaXY; M (" + res->name() + ") GeV/c^{2}; dca_{XY} (" + d1->name() + ") {mu}m"; + annot = "M versus dcaXY; M (" + res->name() + ") GeV/c^{2}; dca_{XY} (" + d1->name() + ") #mu m"; fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {HistType::kTH2F, {max, dcaxyax}})}); hname = base; hname.append("MvsdcaZ_").append(res->name()).append(d1->name()); - annot = "M versus dcaZ; M (" + res->name() + ") GeV/c^{2}; dca_{Z} (" + d1->name() + ") {mu}m"; + annot = "M versus dcaZ; M (" + res->name() + ") GeV/c^{2}; dca_{Z} (" + d1->name() + ") #mu m"; fhistPointers.insert({hname, registry.add(hname.c_str(), annot.c_str(), {HistType::kTH2F, {max, dcazax}})}); // M vs chi2 track diff --git a/PWGUD/TableProducer/DGCandProducer.cxx b/PWGUD/TableProducer/DGCandProducer.cxx index 20f3b7f1a4a..a33ae48bb33 100644 --- a/PWGUD/TableProducer/DGCandProducer.cxx +++ b/PWGUD/TableProducer/DGCandProducer.cxx @@ -15,7 +15,6 @@ #include #include #include - #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/HistogramRegistry.h" @@ -32,6 +31,8 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; +#define getHist(type, name) std::get>(histPointers[name]) + struct DGCandProducer { // data tables Produces outputCollisions; @@ -59,7 +60,7 @@ struct DGCandProducer { // configurables Configurable saveAllTracks{"saveAllTracks", true, "save only PV contributors or all tracks associated to a collision"}; - Configurable fillFIThistos{"fillFIThistos", false, "fill the histograms with the FIT amplitudes"}; + Configurable> generatorIds{"generatorIds", std::vector{-1}, "MC generatorIds to process"}; // zorro object int mRunNumber; @@ -76,6 +77,7 @@ struct DGCandProducer { // initialize histogram registry HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; + std::map histPointers; // data inputs using CCs = soa::Join; @@ -88,6 +90,9 @@ struct DGCandProducer { aod::pidTOFFullEl, aod::pidTOFFullMu, aod::pidTOFFullPi, aod::pidTOFFullKa, aod::pidTOFFullPr>; using FWs = aod::FwdTracks; + using MCCCs = soa::Join; + using MCCC = MCCCs::iterator; + // function to update UDFwdTracks, UDFwdTracksExtra template void updateUDFwdTrackTables(TFwdTrack const& fwdtrack, uint64_t const& bcnum) @@ -157,8 +162,54 @@ struct DGCandProducer { outputTracksLabel(track.globalIndex()); } + void createHistograms(std::string histdir) + { + const int nXbinsInStatH = 26; + std::string labels[nXbinsInStatH] = { + "all", "hasBC", "zorro", "accepted", "FITveto", "MID trk", "global not PV trk", "not global PV trk", + "ITS-only PV trk", "TOF PV trk fraction", "n PV trks", "PID", "pt", "eta", "net charge", + "inv mass", "evsel TF border", "evsel no pile-up", "evsel ITSROF", "evsel z-vtx", "evsel ITSTPC vtx", + "evsel TRD vtx", "evsel TOF vtx", "", "", ""}; + + std::string hname = histdir + "/Stat"; + histPointers.insert({hname, registry.add(hname.c_str(), "Cut statistics, Collisions", {HistType::kTH1F, {{nXbinsInStatH, -0.5, static_cast(nXbinsInStatH - 0.5)}}})}); + getHist(TH1, hname)->SetNdivisions(nXbinsInStatH, "X"); + for (int iXbin(1); iXbin < nXbinsInStatH + 1; iXbin++) { + getHist(TH1, hname)->GetXaxis()->ChangeLabel(iXbin, 45, 0.03, 33, -1, -1, labels[iXbin - 1]); + } + + hname = histdir + "/pt1Vspt2"; + histPointers.insert({hname, registry.add(hname.c_str(), "2 prong events, p_{T} versus p_{T}", {HistType::kTH2F, {{100, -3., 3.}, {100, -3., 3.0}}})}); + hname = histdir + "/TPCsignal1"; + histPointers.insert({hname, registry.add(hname.c_str(), "2 prong events, TPC signal versus p_{T} of particle 1", {HistType::kTH2F, {{200, -3., 3.}, {200, 0., 100.0}}})}); + hname = histdir + "/TPCsignal2"; + histPointers.insert({hname, registry.add(hname.c_str(), "2 prong events, TPC signal versus p_{T} of particle 2", {HistType::kTH2F, {{200, -3., 3.}, {200, 0., 100.0}}})}); + hname = histdir + "/sig1VsSig2TPC"; + histPointers.insert({hname, registry.add(hname.c_str(), "2 prong events, TPC signal versus TPC signal", {HistType::kTH2F, {{100, 0., 100.}, {100, 0., 100.}}})}); + + // FIT amplitudes + // 0: unconditional + // 1: TOR 5: no TOR + // 2: TVX 6: no TVX + // 3: TSC 7: no TSC + // 4: TCE 8: no TCE + // 9: IsBBXXX 10: !IsBBXXX + // 11: kNoBGXXX 12: !kNoBGXXX + const int nXbinsFITH = 201; + hname = histdir + "/fv0"; + histPointers.insert({hname, registry.add(hname.c_str(), "FV0 amplitudes", {HistType::kTH2F, {{nXbinsFITH, -0.5, nXbinsFITH - 0.5}, {13, -0.5, 12.5}}})}); + hname = histdir + "/ft0A"; + histPointers.insert({hname, registry.add(hname.c_str(), "FT0A amplitudes", {HistType::kTH2F, {{nXbinsFITH, -0.5, nXbinsFITH - 0.5}, {13, -0.5, 12.5}}})}); + hname = histdir + "/ft0C"; + histPointers.insert({hname, registry.add(hname.c_str(), "FT0C amplitudes", {HistType::kTH2F, {{nXbinsFITH, -0.5, nXbinsFITH - 0.5}, {13, -0.5, 12.5}}})}); + hname = histdir + "/fddA"; + histPointers.insert({hname, registry.add(hname.c_str(), "FDDA amplitudes", {HistType::kTH2F, {{nXbinsFITH, -0.5, nXbinsFITH - 0.5}, {13, -0.5, 12.5}}})}); + hname = histdir + "/fddC"; + histPointers.insert({hname, registry.add(hname.c_str(), "FDDC amplitudes", {HistType::kTH2F, {{nXbinsFITH, -0.5, nXbinsFITH - 0.5}, {13, -0.5, 12.5}}})}); + } + template - void fillFIThistograms(TBC const& bc) + void fillFIThistograms(TBC const& bc, std::string histdir) { LOGF(debug, ""); std::array triggers{{true, !udhelpers::cleanFIT(bc, diffCuts.maxFITtime(), diffCuts.FITAmpLimits()), @@ -167,118 +218,68 @@ struct DGCandProducer { if (bc.has_foundFV0()) { auto fv0 = bc.foundFV0(); auto ampA = udhelpers::FV0AmplitudeA(fv0); - registry.get(HIST("reco/fv0"))->Fill(ampA, 0); - registry.get(HIST("reco/fv0"))->Fill(ampA, triggers[1] ? 1 : 5); - registry.get(HIST("reco/fv0"))->Fill(ampA, triggers[2] ? 2 : 6); - registry.get(HIST("reco/fv0"))->Fill(ampA, triggers[3] ? 3 : 7); - registry.get(HIST("reco/fv0"))->Fill(ampA, triggers[4] ? 4 : 8); - registry.get(HIST("reco/fv0"))->Fill(ampA, bc.selection_bit(o2::aod::evsel::kIsBBV0A) ? 9 : 10); - registry.get(HIST("reco/fv0"))->Fill(ampA, bc.selection_bit(o2::aod::evsel::kNoBGV0A) ? 11 : 12); + getHist(TH2, histdir + "/fv0")->Fill(ampA, 0); + getHist(TH2, histdir + "/fv0")->Fill(ampA, triggers[1] ? 1 : 5); + getHist(TH2, histdir + "/fv0")->Fill(ampA, triggers[2] ? 2 : 6); + getHist(TH2, histdir + "/fv0")->Fill(ampA, triggers[3] ? 3 : 7); + getHist(TH2, histdir + "/fv0")->Fill(ampA, triggers[4] ? 4 : 8); + getHist(TH2, histdir + "/fv0")->Fill(ampA, bc.selection_bit(o2::aod::evsel::kIsBBV0A) ? 9 : 10); + getHist(TH2, histdir + "/fv0")->Fill(ampA, bc.selection_bit(o2::aod::evsel::kNoBGV0A) ? 11 : 12); } if (bc.has_foundFT0()) { auto ft0 = bc.foundFT0(); auto ampA = udhelpers::FT0AmplitudeA(ft0); auto ampC = udhelpers::FT0AmplitudeC(ft0); - registry.get(HIST("reco/ft0A"))->Fill(ampA, 0); - registry.get(HIST("reco/ft0C"))->Fill(ampC, 0); - registry.get(HIST("reco/ft0A"))->Fill(ampA, triggers[1] ? 1 : 5); - registry.get(HIST("reco/ft0C"))->Fill(ampC, triggers[1] ? 1 : 5); - registry.get(HIST("reco/ft0A"))->Fill(ampA, triggers[2] ? 2 : 6); - registry.get(HIST("reco/ft0C"))->Fill(ampC, triggers[2] ? 2 : 6); - registry.get(HIST("reco/ft0A"))->Fill(ampA, triggers[3] ? 3 : 7); - registry.get(HIST("reco/ft0C"))->Fill(ampC, triggers[3] ? 3 : 7); - registry.get(HIST("reco/ft0A"))->Fill(ampA, triggers[4] ? 4 : 8); - registry.get(HIST("reco/ft0C"))->Fill(ampC, triggers[4] ? 4 : 8); - registry.get(HIST("reco/ft0A"))->Fill(ampA, bc.selection_bit(o2::aod::evsel::kIsBBT0A) ? 9 : 10); - registry.get(HIST("reco/ft0C"))->Fill(ampC, bc.selection_bit(o2::aod::evsel::kIsBBT0C) ? 9 : 10); - registry.get(HIST("reco/ft0A"))->Fill(ampA, bc.selection_bit(o2::aod::evsel::kNoBGT0A) ? 11 : 12); - registry.get(HIST("reco/ft0C"))->Fill(ampC, bc.selection_bit(o2::aod::evsel::kNoBGT0C) ? 11 : 12); + getHist(TH2, histdir + "/ft0A")->Fill(ampA, 0); + getHist(TH2, histdir + "/ft0C")->Fill(ampC, 0); + getHist(TH2, histdir + "/ft0A")->Fill(ampA, triggers[1] ? 1 : 5); + getHist(TH2, histdir + "/ft0C")->Fill(ampC, triggers[1] ? 1 : 5); + getHist(TH2, histdir + "/ft0A")->Fill(ampA, triggers[2] ? 2 : 6); + getHist(TH2, histdir + "/ft0C")->Fill(ampC, triggers[2] ? 2 : 6); + getHist(TH2, histdir + "/ft0A")->Fill(ampA, triggers[3] ? 3 : 7); + getHist(TH2, histdir + "/ft0C")->Fill(ampC, triggers[3] ? 3 : 7); + getHist(TH2, histdir + "/ft0A")->Fill(ampA, triggers[4] ? 4 : 8); + getHist(TH2, histdir + "/ft0C")->Fill(ampC, triggers[4] ? 4 : 8); + getHist(TH2, histdir + "/ft0A")->Fill(ampA, bc.selection_bit(o2::aod::evsel::kIsBBT0A) ? 9 : 10); + getHist(TH2, histdir + "/ft0C")->Fill(ampC, bc.selection_bit(o2::aod::evsel::kIsBBT0C) ? 9 : 10); + getHist(TH2, histdir + "/ft0A")->Fill(ampA, bc.selection_bit(o2::aod::evsel::kNoBGT0A) ? 11 : 12); + getHist(TH2, histdir + "/ft0C")->Fill(ampC, bc.selection_bit(o2::aod::evsel::kNoBGT0C) ? 11 : 12); } if (bc.has_foundFDD()) { auto fdd = bc.foundFDD(); auto ampA = udhelpers::FDDAmplitudeA(fdd); auto ampC = udhelpers::FDDAmplitudeC(fdd); - registry.get(HIST("reco/fddA"))->Fill(ampA, 0); - registry.get(HIST("reco/fddC"))->Fill(ampC, 0); - registry.get(HIST("reco/fddA"))->Fill(ampA, triggers[1] ? 1 : 5); - registry.get(HIST("reco/fddC"))->Fill(ampC, triggers[1] ? 1 : 5); - registry.get(HIST("reco/fddA"))->Fill(ampA, triggers[2] ? 2 : 6); - registry.get(HIST("reco/fddC"))->Fill(ampC, triggers[2] ? 2 : 6); - registry.get(HIST("reco/fddA"))->Fill(ampA, triggers[3] ? 3 : 7); - registry.get(HIST("reco/fddC"))->Fill(ampC, triggers[3] ? 3 : 7); - registry.get(HIST("reco/fddA"))->Fill(ampA, triggers[4] ? 4 : 8); - registry.get(HIST("reco/fddC"))->Fill(ampC, triggers[4] ? 4 : 8); - registry.get(HIST("reco/fddA"))->Fill(ampA, bc.selection_bit(o2::aod::evsel::kIsBBFDA) ? 9 : 10); - registry.get(HIST("reco/fddC"))->Fill(ampC, bc.selection_bit(o2::aod::evsel::kIsBBFDC) ? 9 : 10); - registry.get(HIST("reco/fddA"))->Fill(ampA, bc.selection_bit(o2::aod::evsel::kNoBGFDA) ? 11 : 12); - registry.get(HIST("reco/fddC"))->Fill(ampC, bc.selection_bit(o2::aod::evsel::kNoBGFDC) ? 11 : 12); + getHist(TH2, histdir + "/fddA")->Fill(ampA, 0); + getHist(TH2, histdir + "/fddC")->Fill(ampC, 0); + getHist(TH2, histdir + "/fddA")->Fill(ampA, triggers[1] ? 1 : 5); + getHist(TH2, histdir + "/fddC")->Fill(ampC, triggers[1] ? 1 : 5); + getHist(TH2, histdir + "/fddA")->Fill(ampA, triggers[2] ? 2 : 6); + getHist(TH2, histdir + "/fddC")->Fill(ampC, triggers[2] ? 2 : 6); + getHist(TH2, histdir + "/fddA")->Fill(ampA, triggers[3] ? 3 : 7); + getHist(TH2, histdir + "/fddC")->Fill(ampC, triggers[3] ? 3 : 7); + getHist(TH2, histdir + "/fddA")->Fill(ampA, triggers[4] ? 4 : 8); + getHist(TH2, histdir + "/fddC")->Fill(ampC, triggers[4] ? 4 : 8); + getHist(TH2, histdir + "/fddA")->Fill(ampA, bc.selection_bit(o2::aod::evsel::kIsBBFDA) ? 9 : 10); + getHist(TH2, histdir + "/fddC")->Fill(ampC, bc.selection_bit(o2::aod::evsel::kIsBBFDC) ? 9 : 10); + getHist(TH2, histdir + "/fddA")->Fill(ampA, bc.selection_bit(o2::aod::evsel::kNoBGFDA) ? 11 : 12); + getHist(TH2, histdir + "/fddC")->Fill(ampC, bc.selection_bit(o2::aod::evsel::kNoBGFDC) ? 11 : 12); } } - void init(InitContext&) - { - LOGF(debug, " beginning of init reached"); - // initialize zorro - mRunNumber = -1; - zorroSummary.setObject(zorro.getZorroSummary()); - zorro.setBaseCCDBPath(cfgZorroCCDBpath.value); - ccdb->setURL(cfgCCDBurl); - ccdb->setCaching(true); - ccdb->setLocalObjectValidityChecking(); - ccdb->setFatalWhenNull(false); - - // DGCuts - diffCuts = (DGCutparHolder)DGCuts; - - // add histograms for the different process functions - const int nXbinsInStatH = 26; - registry.add("reco/Stat", "Cut statistics;; Collisions", {HistType::kTH1F, {{nXbinsInStatH, -0.5, static_cast(nXbinsInStatH - 0.5)}}}); - registry.add("reco/pt1Vspt2", "2 prong events, p_{T} versus p_{T}", {HistType::kTH2F, {{100, -3., 3.}, {100, -3., 3.0}}}); - registry.add("reco/TPCsignal1", "2 prong events, TPC signal versus p_{T} of particle 1", {HistType::kTH2F, {{200, -3., 3.}, {200, 0., 100.0}}}); - registry.add("reco/TPCsignal2", "2 prong events, TPC signal versus p_{T} of particle 2", {HistType::kTH2F, {{200, -3., 3.}, {200, 0., 100.0}}}); - registry.add("reco/sig1VsSig2TPC", "2 prong events, TPC signal versus TPC signal", {HistType::kTH2F, {{100, 0., 100.}, {100, 0., 100.}}}); - - // FIT amplitudes - // 0: unconditional - // 1: TOR 5: no TOR - // 2: TVX 6: no TVX - // 3: TSC 7: no TSC - // 4: TCE 8: no TCE - // 9: IsBBXXX 10: !IsBBXXX - // 11: kNoBGXXX 12: !kNoBGXXX - const int nXbinsFITH = 201; - registry.add("reco/fv0", "FV0 amplitudes", {HistType::kTH2F, {{nXbinsFITH, -0.5, nXbinsFITH - 0.5}, {13, -0.5, 12.5}}}); - registry.add("reco/ft0A", "FT0A amplitudes", {HistType::kTH2F, {{nXbinsFITH, -0.5, nXbinsFITH - 0.5}, {13, -0.5, 12.5}}}); - registry.add("reco/ft0C", "FT0C amplitudes", {HistType::kTH2F, {{nXbinsFITH, -0.5, nXbinsFITH - 0.5}, {13, -0.5, 12.5}}}); - registry.add("reco/fddA", "FDDA amplitudes", {HistType::kTH2F, {{nXbinsFITH, -0.5, nXbinsFITH - 0.5}, {13, -0.5, 12.5}}}); - registry.add("reco/fddC", "FDDC amplitudes", {HistType::kTH2F, {{nXbinsFITH, -0.5, nXbinsFITH - 0.5}, {13, -0.5, 12.5}}}); - - std::string labels[nXbinsInStatH] = {"all", "hasBC", "zorro", "accepted", "FITveto", "MID trk", "global not PV trk", "not global PV trk", - "ITS-only PV trk", "TOF PV trk fraction", "n PV trks", "PID", "pt", "eta", "net charge", - "inv mass", "evsel TF border", "evsel no pile-up", "evsel ITSROF", "evsel z-vtx", "evsel ITSTPC vtx", - "evsel TRD vtx", "evsel TOF vtx", "", "", ""}; - - registry.get(HIST("reco/Stat"))->SetNdivisions(nXbinsInStatH, "X"); - for (int iXbin(1); iXbin < nXbinsInStatH + 1; iXbin++) { - registry.get(HIST("reco/Stat"))->GetXaxis()->ChangeLabel(iXbin, 45, 0.03, 33, -1, -1, labels[iXbin - 1]); - } - - LOGF(debug, " end of init reached"); - } - - // process function for reconstructed data - void process(CC const& collision, BCs const& bcs, TCs const& tracks, FWs const& fwdtracks, - aod::Zdcs const& /*zdcs*/, aod::FV0As const& fv0as, aod::FT0s const& ft0s, aod::FDDs const& fdds) + template + void processReco(std::string histdir, TCol const& collision, BCs const& bcs, + TCs const& tracks, FWs const& fwdtracks, + aod::FV0As const& fv0as, aod::FT0s const& ft0s, aod::FDDs const& fdds) { LOGF(debug, " collision %d", collision.globalIndex()); - registry.get(HIST("reco/Stat"))->Fill(0., 1.); + getHist(TH1, histdir + "/Stat")->Fill(0., 1.); // nominal BC if (!collision.has_foundBC()) { return; } - registry.get(HIST("reco/Stat"))->Fill(1., 1.); - auto bc = collision.foundBC_as(); + getHist(TH1, histdir + "/Stat")->Fill(1., 1.); + auto bc = collision.template foundBC_as(); LOGF(debug, " BC id %d", bc.globalBC()); const uint64_t ts = bc.timestamp(); const int runnumber = bc.runNumber(); @@ -317,7 +318,7 @@ struct DGCandProducer { } // fill FIT histograms - fillFIThistograms(bc); + fillFIThistograms(bc, histdir); // obtain slice of compatible BCs auto bcRange = udhelpers::compatibleBCs(collision, diffCuts.NDtcoll(), bcs, diffCuts.minNBCs()); @@ -327,7 +328,7 @@ struct DGCandProducer { auto isDGEvent = dgSelector.IsSelected(diffCuts, collision, bcRange, tracks, fwdtracks); // save DG candidates - registry.get(HIST("reco/Stat"))->Fill(isDGEvent + 3, 1.); + getHist(TH1, histdir + "/Stat")->Fill(isDGEvent + 3, 1.); if (isDGEvent == 0) { LOGF(debug, " Data: good collision!"); @@ -336,7 +337,7 @@ struct DGCandProducer { auto zorroDecision = zorro.isSelected(bc.globalBC()); LOGF(info, " zorroDecision %d", zorroDecision); if (zorroDecision) { - registry.get(HIST("reco/Stat"))->Fill(2, 1.); + getHist(TH1, histdir + "/Stat")->Fill(2, 1.); } } @@ -416,13 +417,61 @@ struct DGCandProducer { cnt, tr.isGlobalTrack(), tr.pt(), tr.itsNCls(), tr.tpcNClsCrossedRows(), tr.hasTRD(), tr.hasTOF()); } } - registry.get(HIST("reco/pt1Vspt2"))->Fill(pt1, pt2); - registry.get(HIST("reco/TPCsignal1"))->Fill(pt1, signalTPC1); - registry.get(HIST("reco/TPCsignal2"))->Fill(pt2, signalTPC2); - registry.get(HIST("reco/sig1VsSig2TPC"))->Fill(signalTPC1, signalTPC2); + getHist(TH2, histdir + "/pt1Vspt2")->Fill(pt1, pt2); + getHist(TH2, histdir + "/TPCsignal1")->Fill(pt1, signalTPC1); + getHist(TH2, histdir + "/TPCsignal2")->Fill(pt2, signalTPC2); + getHist(TH2, histdir + "/sig1VsSig2TPC")->Fill(signalTPC1, signalTPC2); } } } + + void init(InitContext& context) + { + // initialize zorro + mRunNumber = -1; + zorroSummary.setObject(zorro.getZorroSummary()); + zorro.setBaseCCDBPath(cfgZorroCCDBpath.value); + ccdb->setURL(cfgCCDBurl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setFatalWhenNull(false); + + // DGCuts + diffCuts = (DGCutparHolder)DGCuts; + + // add histograms for the different process functions + histPointers.clear(); + if (context.mOptions.get("processData")) { + createHistograms("reco"); + } + if (context.mOptions.get("processMcData")) { + createHistograms("MCreco"); + } + } + + // process function for reconstructed data + void processData(CC const& collision, BCs const& bcs, TCs const& tracks, FWs const& fwdtracks, + aod::Zdcs const& /*zdcs*/, aod::FV0As const& fv0as, aod::FT0s const& ft0s, aod::FDDs const& fdds) + { + processReco(std::string("reco"), collision, bcs, tracks, fwdtracks, fv0as, ft0s, fdds); + } + PROCESS_SWITCH(DGCandProducer, processData, "Produce UD table with data", true); + + // process function for reconstructed MC data + void processMcData(MCCC const& collision, aod::McCollisions const& /*mccollisions*/, BCs const& bcs, + TCs const& tracks, FWs const& fwdtracks, aod::Zdcs const& /*zdcs*/, aod::FV0As const& fv0as, + aod::FT0s const& ft0s, aod::FDDs const& fdds) + { + // select specific processes with the GeneratorID + auto mccol = collision.mcCollision(); + LOGF(debug, "GeneratorId %d (%d)", mccol.getGeneratorId(), generatorIds->size()); + + if (std::find(generatorIds->begin(), generatorIds->end(), mccol.getGeneratorId()) != generatorIds->end()) { + LOGF(debug, "Event with good generatorId"); + processReco(std::string("MCreco"), collision, bcs, tracks, fwdtracks, fv0as, ft0s, fdds); + } + } + PROCESS_SWITCH(DGCandProducer, processMcData, "Produce UD tables with MC data", false); }; struct McDGCandProducer { @@ -633,7 +682,7 @@ struct McDGCandProducer { void init(InitContext& context) { // add histograms for the different process functions - if (context.mOptions.get("processMC")) { + if (context.mOptions.get("processMCTruth")) { registry.add("mcTruth/collisions", "Number of associated collisions", {HistType::kTH1F, {{11, -0.5, 10.5}}}); registry.add("mcTruth/collType", "Collision type", {HistType::kTH1F, {{5, -0.5, 4.5}}}); registry.add("mcTruth/IVMpt", "Invariant mass versus p_{T}", {HistType::kTH2F, {{150, 0.0, 3.0}, {150, 0.0, 3.0}}}); @@ -642,9 +691,9 @@ struct McDGCandProducer { // process function for MC data // save the MC truth of all events of interest and of the DG events - void processMC(aod::McCollisions const& mccols, aod::McParticles const& mcparts, - UDCCs const& dgcands, UDTCs const& udtracks, - CCs const& /*collisions*/, BCs const& /*bcs*/, TCs const& /*tracks*/) + void processMCTruth(aod::McCollisions const& mccols, aod::McParticles const& mcparts, + UDCCs const& dgcands, UDTCs const& udtracks, + CCs const& /*collisions*/, BCs const& /*bcs*/, TCs const& /*tracks*/) { LOGF(debug, "Number of McCollisions %d", mccols.size()); LOGF(debug, "Number of DG candidates %d", dgcands.size()); @@ -789,7 +838,7 @@ struct McDGCandProducer { goon = !dgcandAtEnd || !mccolAtEnd; } } - PROCESS_SWITCH(McDGCandProducer, processMC, "Produce MC tables", false); + PROCESS_SWITCH(McDGCandProducer, processMCTruth, "Produce MC tables", false); void processDummy(aod::Collisions const& /*collisions*/) { diff --git a/PWGUD/TableProducer/SGCandProducer.cxx b/PWGUD/TableProducer/SGCandProducer.cxx index bbded07d3f6..98fe249dfe6 100644 --- a/PWGUD/TableProducer/SGCandProducer.cxx +++ b/PWGUD/TableProducer/SGCandProducer.cxx @@ -11,6 +11,7 @@ #include #include +#include #include #include "CCDB/BasicCCDBManager.h" #include "Framework/ASoA.h" @@ -37,6 +38,8 @@ using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::dataformats; +#define getHist(type, name) std::get>(histPointers[name]) + struct SGCandProducer { Service ccdb; // data inputs @@ -51,6 +54,10 @@ struct SGCandProducer { aod::pidTOFFullDe, aod::pidTOFFullTr, aod::pidTOFFullHe, aod::pidTOFFullAl, aod::pidTOFFullEl, aod::pidTOFFullMu, aod::pidTOFFullPi, aod::pidTOFFullKa, aod::pidTOFFullPr>; using FWs = aod::FwdTracks; + + using MCCCs = soa::Join; + using MCCC = MCCCs::iterator; + // get an SGCutparHolder SGCutParHolder sameCuts = SGCutParHolder(); // SGCutparHolder Configurable SGCuts{"SGCuts", {}, "SG event cuts"}; @@ -62,6 +69,7 @@ struct SGCandProducer { Configurable noSameBunchPileUp{"noSameBunchPileUp", true, "reject SameBunchPileUp"}; Configurable IsGoodVertex{"IsGoodVertex", false, "Select FT0 PV vertex matching"}; Configurable ITSTPCVertex{"ITSTPCVertex", true, "reject ITS-only vertex"}; // if one wants to look at Single Gap pp events + Configurable> generatorIds{"generatorIds", std::vector{-1}, "MC generatorIds to process"}; // Configurables to decide which tables are filled Configurable fillTrackTables{"fillTrackTables", true, "Fill track tables"}; @@ -93,6 +101,7 @@ struct SGCandProducer { HistogramRegistry registry{ "registry", {}}; + std::map histPointers; // function to update UDFwdTracks, UDFwdTracksExtra template @@ -171,52 +180,45 @@ struct SGCandProducer { outputTracksLabel(track.globalIndex()); } - void init(InitContext&) - { - ccdb->setURL("http://alice-ccdb.cern.ch"); - ccdb->setCaching(true); - ccdb->setFatalWhenNull(false); - sameCuts = (SGCutParHolder)SGCuts; - registry.add("reco/Stat", "Cut statistics; Selection criterion; Collisions", {HistType::kTH1F, {{14, -0.5, 13.5}}}); - } - - // process function for real data - void process(CC const& collision, BCs const& bcs, TCs& tracks, FWs& fwdtracks, - aod::Zdcs& /*zdcs*/, aod::FT0s& ft0s, aod::FV0As& fv0as, aod::FDDs& fdds) + // function to process reconstructed data + template + void processReco(std::string histdir, TCol const& collision, BCs const& bcs, + TCs const& tracks, FWs const& fwdtracks, + aod::FV0As const& fv0as, aod::FT0s const& ft0s, aod::FDDs const& fdds) { if (verboseInfo) LOGF(debug, " collision %d", collision.globalIndex()); - registry.get(HIST("reco/Stat"))->Fill(0., 1.); + getHist(TH1, histdir + "/Stat")->Fill(0., 1.); // reject collisions at TF boundaries if (rejectAtTFBoundary && !collision.selection_bit(aod::evsel::kNoTimeFrameBorder)) { return; } - registry.get(HIST("reco/Stat"))->Fill(1., 1.); + getHist(TH1, histdir + "/Stat")->Fill(1., 1.); // reject collisions at ITS RO TF boundaries if (noITSROFrameBorder && !collision.selection_bit(aod::evsel::kNoITSROFrameBorder)) { return; } - registry.get(HIST("reco/Stat"))->Fill(2., 1.); + getHist(TH1, histdir + "/Stat")->Fill(2., 1.); // reject Same Bunch PileUp if (noSameBunchPileUp && !collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { return; } - registry.get(HIST("reco/Stat"))->Fill(3., 1.); + getHist(TH1, histdir + "/Stat")->Fill(3., 1.); // check vertex matching to FT0 if (IsGoodVertex && !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { return; } - registry.get(HIST("reco/Stat"))->Fill(4., 1.); + getHist(TH1, histdir + "/Stat")->Fill(4., 1.); // reject ITS Only vertices if (ITSTPCVertex && !collision.selection_bit(aod::evsel::kIsVertexITSTPC)) { return; } - registry.get(HIST("reco/Stat"))->Fill(5., 1.); + getHist(TH1, histdir + "/Stat")->Fill(5., 1.); // nominal BC if (!collision.has_foundBC()) { return; } - registry.get(HIST("reco/Stat"))->Fill(6., 1.); + getHist(TH1, histdir + "/Stat")->Fill(6., 1.); int trs = 0; if (collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { trs = 1; @@ -229,7 +231,7 @@ struct SGCandProducer { if (collision.selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof)) { hmpr = 1; } - auto bc = collision.foundBC_as(); + auto bc = collision.template foundBC_as(); double ir = 0.; const uint64_t ts = bc.timestamp(); const int runnumber = bc.runNumber(); @@ -249,7 +251,7 @@ struct SGCandProducer { if (verboseInfo) LOGF(info, "No Newbc %i", bc.globalBC()); } - registry.get(HIST("reco/Stat"))->Fill(issgevent + 8, 1.); + getHist(TH1, histdir + "/Stat")->Fill(issgevent + 8, 1.); if (issgevent <= 2) { if (verboseInfo) LOGF(info, "Current BC: %i, %i, %i", bc.globalBC(), newbc.globalBC(), issgevent); @@ -318,6 +320,49 @@ struct SGCandProducer { } } } + + void init(InitContext& context) + { + ccdb->setURL("http://alice-ccdb.cern.ch"); + ccdb->setCaching(true); + ccdb->setFatalWhenNull(false); + sameCuts = (SGCutParHolder)SGCuts; + + // add histograms for the different process functions + histPointers.clear(); + if (context.mOptions.get("processData")) { + histPointers.insert({"reco/Stat", registry.add("reco/Stat", "Cut statistics; Selection criterion; Collisions", {HistType::kTH1F, {{14, -0.5, 13.5}}})}); + } + if (context.mOptions.get("processMcData")) { + histPointers.insert({"MCreco/Stat", registry.add("MCreco/Stat", "Cut statistics; Selection criterion; Collisions", {HistType::kTH1F, {{14, -0.5, 13.5}}})}); + } + } + + // process function for reconstructed data + void processData(CC const& collision, BCs const& bcs, TCs const& tracks, FWs const& fwdtracks, + aod::Zdcs const& /*zdcs*/, aod::FV0As const& fv0as, aod::FT0s const& ft0s, aod::FDDs const& fdds) + { + processReco(std::string("reco"), collision, bcs, tracks, fwdtracks, fv0as, ft0s, fdds); + } + PROCESS_SWITCH(SGCandProducer, processData, "Produce UD table with data", true); + + // process function for reconstructed MC data + void processMcData(MCCC const& collision, aod::McCollisions const& /*mccollisions*/, BCs const& bcs, + TCs const& tracks, FWs const& fwdtracks, aod::Zdcs const& /*zdcs*/, aod::FV0As const& fv0as, + aod::FT0s const& ft0s, aod::FDDs const& fdds) + { + // select specific processes with the GeneratorID + auto mccol = collision.mcCollision(); + if (verboseInfo) + LOGF(info, "GeneratorId %d (%d)", mccol.getGeneratorId(), generatorIds->size()); + + if (std::find(generatorIds->begin(), generatorIds->end(), mccol.getGeneratorId()) != generatorIds->end()) { + if (verboseInfo) + LOGF(info, "Event with good generatorId"); + processReco(std::string("MCreco"), collision, bcs, tracks, fwdtracks, fv0as, ft0s, fdds); + } + } + PROCESS_SWITCH(SGCandProducer, processMcData, "Produce UD tables with MC data", false); }; struct McSGCandProducer { From cf9ca4bf7b9e34be0f3a2174b03ddeeddf36bf4e Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Fri, 28 Feb 2025 17:46:06 +0100 Subject: [PATCH 0474/1650] [PWGLF] feat(lnnRecoTask): add pion TPC cluster cut (#10252) --- PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx b/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx index bb7bfc984d3..c84a4c95dcb 100644 --- a/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx +++ b/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx @@ -159,6 +159,7 @@ struct lnnRecoTask { Configurable nSigmaCutMinTPC{"nSigmaCutMinTPC", -5, "triton dEdx cut (n sigma)"}; Configurable nSigmaCutMaxTPC{"nSigmaCutMaxTPC", 5, "triton dEdx cut (n sigma)"}; Configurable nTPCClusMin3H{"nTPCClusMin3H", 80, "triton NTPC clusters cut"}; + Configurable nTPCClusMinPi{"nTPCClusMinPi", 60, "pion NTPC clusters cut"}; Configurable ptMinTOF{"ptMinTOF", 0.8, "minimum pt for TOF cut"}; Configurable TrTOFMass2Cut{"TrTOFMass2Cut", 5.5, "minimum Triton mass square to TOF"}; Configurable BetaTrTOF{"BetaTrTOF", 0.4, "minimum beta TOF cut"}; @@ -350,7 +351,8 @@ struct lnnRecoTask { auto posTrack = v0.posTrack_as(); auto negTrack = v0.negTrack_as(); - if (std::abs(posTrack.eta()) > etaMax || std::abs(negTrack.eta()) > etaMax) { + /// remove tracks wo TPC information, too much bkg for Lnn analysis + if (std::abs(posTrack.eta()) > etaMax || std::abs(negTrack.eta()) > etaMax || !posTrack.hasTPC() || !negTrack.hasTPC()) { continue; } @@ -369,8 +371,8 @@ struct lnnRecoTask { hdEdxTot->Fill(-negRigidity, negTrack.tpcSignal()); // ITS only tracks do not have TPC information. TPCnSigma: only lower cut to allow for triton reconstruction - bool is3H = posTrack.hasTPC() && nSigmaTPCpos > nSigmaCutMinTPC && nSigmaTPCpos < nSigmaCutMaxTPC; - bool isAnti3H = negTrack.hasTPC() && nSigmaTPCneg > nSigmaCutMinTPC && nSigmaTPCneg < nSigmaCutMaxTPC; + bool is3H = nSigmaTPCpos > nSigmaCutMinTPC && nSigmaTPCpos < nSigmaCutMaxTPC; + bool isAnti3H = nSigmaTPCneg > nSigmaCutMinTPC && nSigmaTPCneg < nSigmaCutMaxTPC; if (!is3H && !isAnti3H) // discard if both tracks are not 3H candidates continue; @@ -392,13 +394,15 @@ struct lnnRecoTask { continue; } auto& h3track = lnnCand.isMatter ? posTrack : negTrack; + auto& pitrack = lnnCand.isMatter ? negTrack : posTrack; auto& h3Rigidity = lnnCand.isMatter ? posRigidity : negRigidity; if (h3Rigidity < TPCRigidityMin3H || h3track.tpcNClsFound() < nTPCClusMin3H || h3track.tpcChi2NCl() < Chi2nClusTPCMin || h3track.tpcChi2NCl() > Chi2nClusTPCMax || - h3track.itsChi2NCl() > Chi2nClusITS) { + h3track.itsChi2NCl() > Chi2nClusITS || + pitrack.tpcNClsFound() < nTPCClusMinPi) { continue; } From ec2747e6684c9151ff7beb6aa96765b727c042d1 Mon Sep 17 00:00:00 2001 From: lauraser <45659867+lauraser@users.noreply.github.com> Date: Fri, 28 Feb 2025 19:17:21 +0100 Subject: [PATCH 0475/1650] [PWGCF] Additional QA histograms (#10255) Co-authored-by: Laura Serksnyte --- .../Tasks/femtoDreamTripletTaskTrackTrackTrack.cxx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackTrack.cxx b/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackTrack.cxx index 811deab4bb2..226eaa5c8fb 100644 --- a/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackTrack.cxx +++ b/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackTrack.cxx @@ -148,6 +148,8 @@ struct femtoDreamTripletTaskTrackTrackTrack { std::vector tmpVecMult = ConfMultBins; framework::AxisSpec multAxis = {tmpVecMult, "Multiplicity"}; ThreeBodyQARegistry.add("TripletTaskQA/hSEMultVSGoodTracks", ";Mult;GoodT", kTH2F, {multAxis, {100, 0, 100}}); + ThreeBodyQARegistry.add("TripletTaskQA/hTripletsPerEventBelow14", ";Triplets;Entries", kTH1F, {{10, 0, 10}}); + ThreeBodyQARegistry.add("TripletTaskQA/NumberOfTacksPassingSelection", ";Triplets;Entries", kTH1F, {{30, 0, 30}}); if (ConfIsMC) { ThreeBodyQARegistry.add("TrackMC_QA/hMazzachi", ";gen;(reco-gen)/gen", kTH2F, {{100, ConfMinpT, ConfMaxpT}, {300, -1, 1}}); } @@ -220,11 +222,15 @@ struct femtoDreamTripletTaskTrackTrackTrack { void doSameEvent(PartitionType groupSelectedParts, PartType parts, float magFieldTesla, int multCol, float centCol) { /// Histogramming same event + int numberOfTracksPassingSelection = 0; for (auto& part : groupSelectedParts) { + numberOfTracksPassingSelection = numberOfTracksPassingSelection + 1; trackHistoSelectedParts.fillQA(part, aod::femtodreamparticle::kPt, multCol, centCol); } + ThreeBodyQARegistry.fill(HIST("TripletTaskQA/NumberOfTacksPassingSelection"), numberOfTracksPassingSelection); /// Now build the combinations + int numberOfTriplets = 0; for (auto& [p1, p2, p3] : combinations(CombinationsStrictlyUpperIndexPolicy(groupSelectedParts, groupSelectedParts, groupSelectedParts))) { auto Q3 = FemtoDreamMath::getQ3(p1, mMassOne, p2, mMassTwo, p3, mMassThree); @@ -252,10 +258,14 @@ struct femtoDreamTripletTaskTrackTrackTrack { } // fill pT of all three particles as a function of Q3 for lambda calculations + if (Q3 < 1.4) { + numberOfTriplets = numberOfTriplets + 1; + } ThreeBodyQARegistry.fill(HIST("TripletTaskQA/particle_pT_in_Triplet_SE"), p1.pt(), p2.pt(), p3.pt(), Q3); sameEventCont.setTriplet(p1, p2, p3, multCol, Q3); ThreeBodyQARegistry.fill(HIST("TripletTaskQA/hCentrality"), centCol, Q3); } + ThreeBodyQARegistry.fill(HIST("TripletTaskQA/hTripletsPerEventBelow14"), numberOfTriplets); } /// process function to call doSameEvent with Data From 8f6b4f68df80b9cea3daccfc9033086c8906af38 Mon Sep 17 00:00:00 2001 From: rolavick Date: Fri, 28 Feb 2025 20:46:56 +0100 Subject: [PATCH 0476/1650] [PWGUD] personal task modification (#10256) Co-authored-by: ALICE Action Bot --- PWGUD/Tasks/upcTauRl.cxx | 843 +++++++++++++++++---------------------- 1 file changed, 355 insertions(+), 488 deletions(-) diff --git a/PWGUD/Tasks/upcTauRl.cxx b/PWGUD/Tasks/upcTauRl.cxx index f249a05834f..21f2a19d060 100644 --- a/PWGUD/Tasks/upcTauRl.cxx +++ b/PWGUD/Tasks/upcTauRl.cxx @@ -21,6 +21,7 @@ #include #include #include +#include // O2 headers #include "Framework/AnalysisTask.h" @@ -63,6 +64,7 @@ struct UpcTauRl { Configurable verboseInfo{"verboseInfo", false, {"Print general info to terminal; default it false."}}; Configurable doMainHistos{"doMainHistos", false, {"Fill main histos"}}; Configurable doPIDhistos{"doPIDhistos", false, {"Fill PID histos"}}; + Configurable doMixedEventsHistos{"doMixedEventsHistos", false, {"Fill mixed events histos"}}; Configurable doTruthHistos{"doTruthHistos", false, {"Do histograms specific for generated events/particles"}}; Configurable doMCtrueElectronCheck{"doMCtrueElectronCheck", false, {"Check if track hypothesis corresponds to MC truth. If no, it cuts."}}; Configurable oppositeMCtrueElectronCheck{"oppositeMCtrueElectronCheck", false, {"While doMCtrueElectronCheck is true, check if track hypothesis corresponds to MC truth. If yes, it cuts."}}; @@ -188,11 +190,15 @@ struct UpcTauRl { } confAxis; using FullUDTracks = soa::Join; - using FullUDCollision = soa::Join::iterator; - using FullSGUDCollision = soa::Join::iterator; + using FullUDCollisions = soa::Join; + using FullUDCollision = FullUDCollisions::iterator; + using FullSGUDCollisions = soa::Join; + using FullSGUDCollision = FullSGUDCollisions::iterator; using FullMCUDTracks = soa::Join; - using FullMCUDCollision = soa::Join::iterator; - using FullMCSGUDCollision = soa::Join::iterator; + using FullMCUDCollisions = soa::Join; + using FullMCUDCollision = FullMCUDCollisions::iterator; + using FullMCSGUDCollisions = soa::Join; + using FullMCSGUDCollision = FullMCSGUDCollisions::iterator; // init void init(InitContext&) @@ -413,6 +419,7 @@ struct UpcTauRl { histos.add("EventTwoTracks/TwoElectrons/hInvariantMassWide", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMassWide}); histos.add("EventTwoTracks/TwoElectrons/hInvariantMassWidePtCut", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMassWide}); histos.add("EventTwoTracks/TwoElectrons/hAcoplanarity", ";#Delta#phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisAcoplanarity}); + histos.add("EventTwoTracks/TwoElectrons/hCollinearity", ";#DeltaR (-);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisCollinearity}); histos.add("EventTwoTracks/TwoElectrons/hMotherP", ";Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMom}); histos.add("EventTwoTracks/TwoElectrons/hMotherPwide", ";Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMomWide}); histos.add("EventTwoTracks/TwoElectrons/hMotherPt", ";Mother #it{p_{T}} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPt}); @@ -451,97 +458,6 @@ struct UpcTauRl { histos.add("EventTwoTracks/TwoElectrons/PID/hTOFnSigmaVsLP", ";Leading #it{p} (GeV/c);n#sigma_{TOF} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisNsigma}); histos.add("EventTwoTracks/TwoElectrons/PID/hTOFnSigmaVsOP", ";Other #it{p} (GeV/c);n#sigma_{TOF} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisNsigma}); - histos.add("EventTwoTracks/TwoMuons/hInvariantMass", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMass}); - histos.add("EventTwoTracks/TwoMuons/hInvariantMassWide", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMassWide}); - histos.add("EventTwoTracks/TwoMuons/hInvariantMassWidePtCut", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMassWide}); - histos.add("EventTwoTracks/TwoMuons/hAcoplanarity", ";#Delta#phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisAcoplanarity}); - histos.add("EventTwoTracks/TwoMuons/hMotherP", ";Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMom}); - histos.add("EventTwoTracks/TwoMuons/hMotherPwide", ";Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMomWide}); - histos.add("EventTwoTracks/TwoMuons/hMotherPt", ";Mother #it{p_{T}} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPt}); - histos.add("EventTwoTracks/TwoMuons/hMotherPhi", ";Mother #phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPhi}); - histos.add("EventTwoTracks/TwoMuons/hMotherRapidity", ";Mother #it{y} (-);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisRap}); - histos.add("EventTwoTracks/TwoMuons/hMotherMassVsPt", ";Invariant mass (GeV/c^{2});Mother #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisInvMassWide, confAxis.zzAxisPt}); - histos.add("EventTwoTracks/TwoMuons/hDaughtersP", ";Daughter 1 #it{p} (GeV/c);Daughter 2 #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisMom}); - histos.add("EventTwoTracks/TwoMuons/hDaughtersPwide", ";Daughter 1 #it{p} (GeV/c);Daughter 2 #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMomWide, confAxis.zzAxisMomWide}); - histos.add("EventTwoTracks/TwoMuons/hDaughtersPt", ";Daughter 1 #it{p_{T}} (GeV/c);Daughter 2 #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisPt, confAxis.zzAxisPt}); - histos.add("EventTwoTracks/TwoMuons/hDaughtersPhi", ";Daughter 1 #phi (rad);Daughter 2 #phi (rad)", HistType::kTH2D, {confAxis.zzAxisPhi, confAxis.zzAxisPhi}); - histos.add("EventTwoTracks/TwoMuons/hDaughtersPtvsModPhi", ";Daughter #it{p_{T}} (GeV/c);Daughter fmod(#phi,#pi/9)", HistType::kTH2D, {confAxis.zzAxisPt, confAxis.zzAxisModPhi}); - histos.add("EventTwoTracks/TwoMuons/hDaughtersPtvsModPhiTOF", ";Daughter #it{p_{T}} (GeV/c);Daughter fmod(#phi,#pi/9)", HistType::kTH2D, {confAxis.zzAxisPt, confAxis.zzAxisModPhi}); - histos.add("EventTwoTracks/TwoMuons/hDaughtersPtvsModPhiPtCut", ";Daughter #it{p_{T}} (GeV/c);Daughter fmod(#phi,#pi/9)", HistType::kTH2D, {confAxis.zzAxisPt, confAxis.zzAxisModPhi}); - histos.add("EventTwoTracks/TwoMuons/hDaughtersPtvsModPhiPtCutTOF", ";Daughter #it{p_{T}} (GeV/c);Daughter fmod(#phi,#pi/9)", HistType::kTH2D, {confAxis.zzAxisPt, confAxis.zzAxisModPhi}); - histos.add("EventTwoTracks/TwoMuons/hDaughtersRapidity", ";Daughter 1 #it{y} (-);Daughter 2 #it{y} (-)", HistType::kTH2D, {confAxis.zzAxisRap, confAxis.zzAxisRap}); - histos.add("EventTwoTracks/TwoMuons/PID/hTPCsignalVsP", ";Track #it{p} (GeV/c);TPC d#it{E}/d#it{x} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisTPCdEdx}); - - histos.add("EventTwoTracks/TwoPions/hInvariantMass", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMass}); - histos.add("EventTwoTracks/TwoPions/hInvariantMassWide", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMassWide}); - histos.add("EventTwoTracks/TwoPions/hInvariantMassWidePtCut", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMassWide}); - histos.add("EventTwoTracks/TwoPions/hAcoplanarity", ";#Delta#phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisAcoplanarity}); - histos.add("EventTwoTracks/TwoPions/hMotherP", ";Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMom}); - histos.add("EventTwoTracks/TwoPions/hMotherPwide", ";Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMomWide}); - histos.add("EventTwoTracks/TwoPions/hMotherPt", ";Mother #it{p_{T}} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPt}); - histos.add("EventTwoTracks/TwoPions/hMotherPhi", ";Mother #phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPhi}); - histos.add("EventTwoTracks/TwoPions/hMotherRapidity", ";Mother #it{y} (-);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisRap}); - histos.add("EventTwoTracks/TwoPions/hDaughtersP", ";Daughter 1 #it{p} (GeV/c);Daughter 2 #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisMom}); - histos.add("EventTwoTracks/TwoPions/hDaughtersPwide", ";Daughter 1 #it{p} (GeV/c);Daughter 2 #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMomWide, confAxis.zzAxisMomWide}); - histos.add("EventTwoTracks/TwoPions/hDaughtersPt", ";Daughter 1 #it{p_{T}} (GeV/c);Daughter 2 #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisPt, confAxis.zzAxisPt}); - histos.add("EventTwoTracks/TwoPions/hDaughtersPhi", ";Daughter 1 #phi (rad);Daughter 2 #phi (rad)", HistType::kTH2D, {confAxis.zzAxisPhi, confAxis.zzAxisPhi}); - histos.add("EventTwoTracks/TwoPions/hMotherMassVsPt", ";Invariant mass (GeV/c^{2});Mother #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisInvMassWide, confAxis.zzAxisPt}); - histos.add("EventTwoTracks/TwoPions/hDaughtersPtvsModPhi", ";Daughter #it{p_{T}} (GeV/c);Daughter fmod(#phi,#pi/9)", HistType::kTH2D, {confAxis.zzAxisPt, confAxis.zzAxisModPhi}); - histos.add("EventTwoTracks/TwoPions/hDaughtersPtvsModPhiTOF", ";Daughter #it{p_{T}} (GeV/c);Daughter fmod(#phi,#pi/9)", HistType::kTH2D, {confAxis.zzAxisPt, confAxis.zzAxisModPhi}); - histos.add("EventTwoTracks/TwoPions/hDaughtersPtvsModPhiPtCut", ";Daughter #it{p_{T}} (GeV/c);Daughter fmod(#phi,#pi/9)", HistType::kTH2D, {confAxis.zzAxisPt, confAxis.zzAxisModPhi}); - histos.add("EventTwoTracks/TwoPions/hDaughtersPtvsModPhiPtCutTOF", ";Daughter #it{p_{T}} (GeV/c);Daughter fmod(#phi,#pi/9)", HistType::kTH2D, {confAxis.zzAxisPt, confAxis.zzAxisModPhi}); - histos.add("EventTwoTracks/TwoPions/hDaughtersRapidity", ";Daughter 1 #it{y} (-);Daughter 2 #it{y} (-)", HistType::kTH2D, {confAxis.zzAxisRap, confAxis.zzAxisRap}); - histos.add("EventTwoTracks/TwoPions/PID/hTPCsignalVsP", ";Track #it{p} (GeV/c);TPC d#it{E}/d#it{x} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisTPCdEdx}); - - histos.add("EventTwoTracks/ElectronMuon/hInvariantMass", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMass}); - histos.add("EventTwoTracks/ElectronMuon/hInvariantMassWide", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMassWide}); - histos.add("EventTwoTracks/ElectronMuon/hAcoplanarity", ";#Delta#phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisAcoplanarity}); - histos.add("EventTwoTracks/ElectronMuon/hMotherP", ";Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMom}); - histos.add("EventTwoTracks/ElectronMuon/hMotherPwide", ";Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMomWide}); - histos.add("EventTwoTracks/ElectronMuon/hMotherPt", ";Mother #it{p_{T}} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPt}); - histos.add("EventTwoTracks/ElectronMuon/hMotherPhi", ";Mother #phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPhi}); - histos.add("EventTwoTracks/ElectronMuon/hMotherRapidity", ";Mother #it{y} (-);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisRap}); - histos.add("EventTwoTracks/ElectronMuon/hMotherMassVsPt", ";Invariant mass (GeV/c^{2});Mother #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisInvMassWide, confAxis.zzAxisPt}); - histos.add("EventTwoTracks/ElectronMuon/hDaughtersP", ";Daughter 1 #it{p} (GeV/c);Daughter 2 #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisMom}); - histos.add("EventTwoTracks/ElectronMuon/hDaughtersPwide", ";Daughter 1 #it{p} (GeV/c);Daughter 2 #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMomWide, confAxis.zzAxisMomWide}); - histos.add("EventTwoTracks/ElectronMuon/hDaughtersPt", ";Daughter 1 #it{p_{T}} (GeV/c);Daughter 2 #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisPt, confAxis.zzAxisPt}); - histos.add("EventTwoTracks/ElectronMuon/hDaughtersPhi", ";Daughter 1 #phi (rad);Daughter 2 #phi (rad)", HistType::kTH2D, {confAxis.zzAxisPhi, confAxis.zzAxisPhi}); - histos.add("EventTwoTracks/ElectronMuon/hDaughtersRapidity", ";Daughter 1 #it{y} (-);Daughter 2 #it{y} (-)", HistType::kTH2D, {confAxis.zzAxisRap, confAxis.zzAxisRap}); - histos.add("EventTwoTracks/ElectronMuon/PID/hTPCsignalVsP", ";Track #it{p} (GeV/c);TPC d#it{E}/d#it{x} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisTPCdEdx}); - - histos.add("EventTwoTracks/ElectronPion/hInvariantMass", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMass}); - histos.add("EventTwoTracks/ElectronPion/hInvariantMassWide", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMassWide}); - histos.add("EventTwoTracks/ElectronPion/hAcoplanarity", ";#Delta#phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisAcoplanarity}); - histos.add("EventTwoTracks/ElectronPion/hMotherP", ";Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMom}); - histos.add("EventTwoTracks/ElectronPion/hMotherPwide", ";Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMomWide}); - histos.add("EventTwoTracks/ElectronPion/hMotherPt", ";Mother #it{p_{T}} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPt}); - histos.add("EventTwoTracks/ElectronPion/hMotherPhi", ";Mother #phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPhi}); - histos.add("EventTwoTracks/ElectronPion/hMotherRapidity", ";Mother #it{y} (-);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisRap}); - histos.add("EventTwoTracks/ElectronPion/hMotherMassVsPt", ";Invariant mass (GeV/c^{2});Mother #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisInvMassWide, confAxis.zzAxisPt}); - histos.add("EventTwoTracks/ElectronPion/hDaughtersP", ";Daughter 1 #it{p} (GeV/c);Daughter 2 #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisMom}); - histos.add("EventTwoTracks/ElectronPion/hDaughtersPwide", ";Daughter 1 #it{p} (GeV/c);Daughter 2 #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMomWide, confAxis.zzAxisMomWide}); - histos.add("EventTwoTracks/ElectronPion/hDaughtersPt", ";Daughter 1 #it{p_{T}} (GeV/c);Daughter 2 #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisPt, confAxis.zzAxisPt}); - histos.add("EventTwoTracks/ElectronPion/hDaughtersPhi", ";Daughter 1 #phi (rad);Daughter 2 #phi (rad)", HistType::kTH2D, {confAxis.zzAxisPhi, confAxis.zzAxisPhi}); - histos.add("EventTwoTracks/ElectronPion/hDaughtersRapidity", ";Daughter 1 #it{y} (-);Daughter 2 #it{y} (-)", HistType::kTH2D, {confAxis.zzAxisRap, confAxis.zzAxisRap}); - histos.add("EventTwoTracks/ElectronPion/PID/hTPCsignalVsP", ";Track #it{p} (GeV/c);TPC d#it{E}/d#it{x} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisTPCdEdx}); - - histos.add("EventTwoTracks/MuonPion/hInvariantMass", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMass}); - histos.add("EventTwoTracks/MuonPion/hInvariantMassWide", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMassWide}); - histos.add("EventTwoTracks/MuonPion/hInvariantMassWidePtCut", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMassWide}); - histos.add("EventTwoTracks/MuonPion/hAcoplanarity", ";#Delta#phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisAcoplanarity}); - histos.add("EventTwoTracks/MuonPion/hMotherP", ";Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMom}); - histos.add("EventTwoTracks/MuonPion/hMotherPwide", ";Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMomWide}); - histos.add("EventTwoTracks/MuonPion/hMotherPt", ";Mother #it{p_{T}} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPt}); - histos.add("EventTwoTracks/MuonPion/hMotherPhi", ";Mother #phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPhi}); - histos.add("EventTwoTracks/MuonPion/hMotherRapidity", ";Mother #it{y} (-);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisRap}); - histos.add("EventTwoTracks/MuonPion/hMotherMassVsPt", ";Invariant mass (GeV/c^{2});Mother #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisInvMassWide, confAxis.zzAxisPt}); - histos.add("EventTwoTracks/MuonPion/hDaughtersP", ";Daughter 1 #it{p} (GeV/c);Daughter 2 #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisMom}); - histos.add("EventTwoTracks/MuonPion/hDaughtersPwide", ";Daughter 1 #it{p} (GeV/c);Daughter 2 #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMomWide, confAxis.zzAxisMomWide}); - histos.add("EventTwoTracks/MuonPion/hDaughtersPt", ";Daughter 1 #it{p_{T}} (GeV/c);Daughter 2 #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisPt, confAxis.zzAxisPt}); - histos.add("EventTwoTracks/MuonPion/hDaughtersPhi", ";Daughter 1 #phi (rad);Daughter 2 #phi (rad)", HistType::kTH2D, {confAxis.zzAxisPhi, confAxis.zzAxisPhi}); - histos.add("EventTwoTracks/MuonPion/hDaughtersRapidity", ";Daughter 1 #it{y} (-);Daughter 2 #it{y} (-)", HistType::kTH2D, {confAxis.zzAxisRap, confAxis.zzAxisRap}); - histos.add("EventTwoTracks/MuonPion/PID/hTPCsignalVsP", ";Track #it{p} (GeV/c);TPC d#it{E}/d#it{x} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisTPCdEdx}); - histos.add("EventTwoTracks/ElectronMuPi/hNeventsPtCuts", ";Selection (-);Number of events (-)", HistType::kTH1D, {{20, -0.5, 19.5}}); histos.add("EventTwoTracks/ElectronMuPi/hInvariantMass", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMass}); histos.add("EventTwoTracks/ElectronMuPi/hInvariantMassWide", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMassWide}); @@ -617,42 +533,65 @@ struct UpcTauRl { histos.add("EventTwoTracks/ElectronMuPi/PID/hTOFnSigmaVsPPofO", ";Not-electron #it{p} (GeV/c);n#sigma^{#pi}_{TOF} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisNsigma}); histos.add("EventTwoTracks/ElectronMuPi/PID/hTOFnSigmaEvsnSigmaPofO", ";Not-electron n#sigma^{e}_{TOF} (arb. units);Not-electron n#sigma^{#pi}_{TOF} (arb. units)", HistType::kTH2D, {confAxis.zzAxisNsigma, confAxis.zzAxisNsigma}); - histos.add("EventTwoTracks/ElectronOther/hNeventsPtCuts", ";Selection (-);Number of events (-)", HistType::kTH1D, {{20, -0.5, 19.5}}); - histos.add("EventTwoTracks/ElectronOther/hInvariantMass", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMass}); - histos.add("EventTwoTracks/ElectronOther/hInvariantMassWide", ";Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMassWide}); - histos.add("EventTwoTracks/ElectronOther/hAcoplanarity", ";#Delta#phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisAcoplanarity}); - histos.add("EventTwoTracks/ElectronOther/hMotherP", ";Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMom}); - histos.add("EventTwoTracks/ElectronOther/hMotherPwide", ";Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMomWide}); - histos.add("EventTwoTracks/ElectronOther/hMotherPt", ";Mother #it{p_{T}} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPt}); - histos.add("EventTwoTracks/ElectronOther/hMotherPhi", ";Mother #phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPhi}); - histos.add("EventTwoTracks/ElectronOther/hMotherRapidity", ";Mother #it{y} (-);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisRap}); - histos.add("EventTwoTracks/ElectronOther/hMotherMassVsPt", ";Invariant mass (GeV/c^{2});Mother #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisInvMassWide, confAxis.zzAxisPt}); - histos.add("EventTwoTracks/ElectronOther/hElectronPt", ";Electron #it{p_{T}} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPt}); - histos.add("EventTwoTracks/ElectronOther/hElectronPtWide", ";Electron #it{p_{T}} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMomWide}); - histos.add("EventTwoTracks/ElectronOther/hDaughtersP", ";Daughter 1 #it{p} (GeV/c);Daughter 2 #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisMom}); - histos.add("EventTwoTracks/ElectronOther/hDaughtersPwide", ";Daughter 1 #it{p} (GeV/c);Daughter 2 #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMomWide, confAxis.zzAxisMomWide}); - histos.add("EventTwoTracks/ElectronOther/hDaughtersPt", ";Daughter 1 #it{p_{T}} (GeV/c);Daughter 2 #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisPt, confAxis.zzAxisPt}); - histos.add("EventTwoTracks/ElectronOther/hDaughtersPhi", ";Daughter 1 #phi (rad);Daughter 2 #phi (rad)", HistType::kTH2D, {confAxis.zzAxisPhi, confAxis.zzAxisPhi}); - histos.add("EventTwoTracks/ElectronOther/hDaughtersRapidity", ";Daughter 1 #it{y} (-);Daughter 2 #it{y} (-)", HistType::kTH2D, {confAxis.zzAxisRap, confAxis.zzAxisRap}); - histos.add("EventTwoTracks/ElectronOther/hElectronPvsOtherP", ";Electron #it{p} (GeV/c); Other #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisMom}); - histos.add("EventTwoTracks/ElectronOther/hElectronPwideVsOtherPwide", ";Electron #it{p} (GeV/c); Other #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMomWide, confAxis.zzAxisMomWide}); - histos.add("EventTwoTracks/ElectronOther/hElectronPtVsOtherPt", ";Electron #it{p_{T}} (GeV/c); Other #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisPt, confAxis.zzAxisPt}); - histos.add("EventTwoTracks/ElectronOther/hElectronPhiVsOtherPhi", ";Electron #phi (rad); Other #phi (rad)", HistType::kTH2D, {confAxis.zzAxisPhi, confAxis.zzAxisPhi}); - histos.add("EventTwoTracks/ElectronOther/hElectronRapVsOtherRap", ";Electron #it{y} (-); Other #it{y} (-)", HistType::kTH2D, {confAxis.zzAxisRap, confAxis.zzAxisRap}); - histos.add("EventTwoTracks/ElectronOther/PID/hTPCsignalVsP", ";Track #it{p} (GeV/c);TPC d#it{E}/d#it{x} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisTPCdEdx}); - histos.add("EventTwoTracks/ElectronOther/PID/hTPCsignalVsEP", ";Electron #it{p} (GeV/c);TPC d#it{E}/d#it{x} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisTPCdEdx}); - histos.add("EventTwoTracks/ElectronOther/PID/hTPCsignalVsOP", ";#it{e}/#mu/#pi #it{p} (GeV/c);TPC d#it{E}/d#it{x} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisTPCdEdx}); - histos.add("EventTwoTracks/ElectronOther/PID/hTOFsignalVsP", ";Track #it{p} (GeV/c);TOF signal (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisTOFsignal}); - histos.add("EventTwoTracks/ElectronOther/PID/hTOFsignalVsEP", ";Electron #it{p} (GeV/c);TOF signal (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisTOFsignal}); - histos.add("EventTwoTracks/ElectronOther/PID/hTOFsignalVsOP", ";Other #it{p} (GeV/c);TOF signal (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisTOFsignal}); - histos.add("EventTwoTracks/ElectronOther/PID/hTPCnSigmaVsP", ";Track #it{p} (GeV/c);n#sigma_{TPC} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisNsigma}); - histos.add("EventTwoTracks/ElectronOther/PID/hTPCnSigmaVsEP", ";Electron #it{p} (GeV/c);n#sigma_{TPC} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisNsigma}); - histos.add("EventTwoTracks/ElectronOther/PID/hTPCnSigmaVsMP", ";Muon #it{p} (GeV/c);n#sigma_{TPC} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisNsigma}); - histos.add("EventTwoTracks/ElectronOther/PID/hTPCnSigmaVsPP", ";Pion #it{p} (GeV/c);n#sigma_{TPC} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisNsigma}); - histos.add("EventTwoTracks/ElectronOther/PID/hTOFnSigmaVsP", ";Track #it{p} (GeV/c);n#sigma_{TOF} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisNsigma}); - histos.add("EventTwoTracks/ElectronOther/PID/hTOFnSigmaVsEP", ";Electron #it{p} (GeV/c);n#sigma_{TOF} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisNsigma}); - histos.add("EventTwoTracks/ElectronOther/PID/hTOFnSigmaVsMP", ";Muon #it{p} (GeV/c);n#sigma_{TOF} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisNsigma}); - histos.add("EventTwoTracks/ElectronOther/PID/hTOFnSigmaVsPP", ";Pion #it{p} (GeV/c);n#sigma_{TOF} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisNsigma}); + if (doMixedEventsHistos) { + histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hInvariantMass", "Mixed events;Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMass}); + histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hInvariantMassWide", "Mixed events;Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMassWide}); + histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hAcoplanarity", "Mixed events;#Delta#phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisAcoplanarity}); + histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hCollinearity", "Mixed events;#DeltaR (-);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisCollinearity}); + histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hMotherP", "Mixed events;Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMom}); + histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hMotherPwide", "Mixed events;Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMomWide}); + histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hMotherPt", "Mixed events;Mother #it{p_{T}} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPt}); + histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hMotherPhi", "Mixed events;Mother #phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPhi}); + histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hMotherRapidity", "Mixed events;Mother #it{y} (-);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisRap}); + histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hMotherMassVsPt", "Mixed events;Invariant mass (GeV/c^{2});Mother #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisInvMassWide, confAxis.zzAxisPt}); + histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hDaughtersP", "Mixed events;Daughter 1 #it{p} (GeV/c);Daughter 2 #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisMom}); + histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hDaughtersPwide", "Mixed events;Daughter 1 #it{p} (GeV/c);Daughter 2 #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMomWide, confAxis.zzAxisMomWide}); + histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hDaughtersPt", "Mixed events;Daughter 1 #it{p_{T}} (GeV/c);Daughter 2 #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisPt, confAxis.zzAxisPt}); + histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hDaughtersPhi", "Mixed events;Daughter 1 #phi (rad);Daughter 2 #phi (rad)", HistType::kTH2D, {confAxis.zzAxisPhi, confAxis.zzAxisPhi}); + histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hDaughtersPtvsModPhi", "Mixed events;Daughter #it{p_{T}} (GeV/c);Daughter fmod(#phi,#pi/9)", HistType::kTH2D, {confAxis.zzAxisPt, confAxis.zzAxisModPhi}); + histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hDaughtersRapidity", "Mixed events;Daughter 1 #it{y} (-);Daughter 2 #it{y} (-)", HistType::kTH2D, {confAxis.zzAxisRap, confAxis.zzAxisRap}); + histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingP", "Mixed events;Leading #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMom}); + histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPwide", "Mixed events;Leading #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMomWide}); + histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPt", "Mixed events;Leading #it{p_{T}} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPt}); + histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPhi", "Mixed events;Leading #phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPhi}); + histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingRapidity", "Mixed events;Leading #it{y} (-);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisRap}); + histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPvsOtherP", "Mixed events;Leading #it{p} (GeV/c); Other #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisMom}); + histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPwideVsOtherPwide", "Mixed events;Leading #it{p} (GeV/c); Other #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMomWide, confAxis.zzAxisMomWide}); + histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPtVsOtherPt", "Mixed events;Leading #it{p_{T}} (GeV/c); Other #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisPt, confAxis.zzAxisPt}); + histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPhiVsOtherPhi", "Mixed events;Leading #phi (rad); Other #phi (rad)", HistType::kTH2D, {confAxis.zzAxisPhi, confAxis.zzAxisPhi}); + histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingRapVsOtherRap", "Mixed events;Leading #it{y} (-); Other #it{y} (-)", HistType::kTH2D, {confAxis.zzAxisRap, confAxis.zzAxisRap}); + + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hInvariantMass", "Mixed events;Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMass}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hInvariantMassWide", "Mixed events;Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMassWide}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hAcoplanarity", "Mixed events;#Delta#phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisAcoplanarity}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hCollinearity", "Mixed events;#DeltaR (-);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisCollinearity}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherP", "Mixed events;Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMom}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherPwide", "Mixed events;Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMomWide}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherPt", "Mixed events;Mother #it{p_{T}} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPt}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherPhi", "Mixed events;Mother #phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPhi}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherRapidity", "Mixed events;Mother #it{y} (-);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisRap}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherMassVsPt", "Mixed events;Invariant mass (GeV/c^{2});Mother #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisInvMassWide, confAxis.zzAxisPt}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherMassVsElectronP", "Mixed events;Invariant mass (GeV/c^{2});Electron #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisInvMassWide, confAxis.zzAxisMomWide}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherMassVsAcoplanarity", "Mixed events;Invariant mass (GeV/c^{2});#Delta#phi (rad)", HistType::kTH2D, {confAxis.zzAxisInvMassWide, confAxis.zzAxisAcoplanarity}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPt", "Mixed events;Electron #it{p_{T}} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPt}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPtWide", "Mixed events;Electron #it{p_{T}} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMomWide}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersEnergyAsymmetry", "Mixed events;(E_{electron} - E_{#mu/#pi}) / (E_{electron} + E_{#mu/#pi});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMirrorFraction}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersMomentaAsymmetry", "Mixed events;(#it{p}_{electron} - #it{p}_{#mu/#pi}) / (#it{p}_{electron} + #it{p}_{#mu/#pi});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMirrorFraction}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersPtAsymmetry", "Mixed events;(#it{p_{T}}_{electron} - #it{p_{T}}_{#mu/#pi}) / (#it{p_{T}}_{electron} + #it{p_{T}}_{#mu/#pi});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMirrorFraction}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersP", "Mixed events;Daughter 1 #it{p} (GeV/c);Daughter 2 #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisMom}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersPwide", "Mixed events;Daughter 1 #it{p} (GeV/c);Daughter 2 #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMomWide, confAxis.zzAxisMomWide}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersPt", "Mixed events;Daughter 1 #it{p_{T}} (GeV/c);Daughter 2 #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisPt, confAxis.zzAxisPt}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersPhi", "Mixed events;Daughter 1 #phi (rad);Daughter 2 #phi (rad)", HistType::kTH2D, {confAxis.zzAxisPhi, confAxis.zzAxisPhi}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersRapidity", "Mixed events;Daughter 1 #it{y} (-);Daughter 2 #it{y} (-)", HistType::kTH2D, {confAxis.zzAxisRap, confAxis.zzAxisRap}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersEnergyFractions", "Mixed events;E_{electron} / E_{tot} (-);E_{#mu/#pi} / E_{tot} (-)", HistType::kTH2D, {confAxis.zzAxisFraction, confAxis.zzAxisFraction}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPvsOtherP", "Mixed events;Electron #it{p} (GeV/c); #mu/#pi #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisMom}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPwideVsOtherPwide", "Mixed events;Electron #it{p} (GeV/c); #mu/#pi #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMomWide, confAxis.zzAxisMomWide}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPvsAcoplanarity", "Mixed events;Electron #it{p} (GeV/c); #Delta#phi (rad)", HistType::kTH2D, {confAxis.zzAxisMomWide, confAxis.zzAxisAcoplanarity}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hOtherPvsAcoplanarity", "Mixed events;#mu/#pi #it{p} (GeV/c); #Delta#phi (rad)", HistType::kTH2D, {confAxis.zzAxisMomWide, confAxis.zzAxisAcoplanarity}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPtVsOtherPt", "Mixed events;Electron #it{p_{T}} (GeV/c); #mu/#pi #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisPt, confAxis.zzAxisPt}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPhiVsOtherPhi", "Mixed events;Electron #phi (rad); #mu/#pi #phi (rad)", HistType::kTH2D, {confAxis.zzAxisPhi, confAxis.zzAxisPhi}); + histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronRapVsOtherRap", "Mixed events;Electron #it{y} (-); #mu/#pi #it{y} (-)", HistType::kTH2D, {confAxis.zzAxisRap, confAxis.zzAxisRap}); + } } if (doTruthHistos) { @@ -1013,6 +952,10 @@ struct UpcTauRl { return true; } + // Define vectors to store info for mixed event analysis + std::vector> vecMixElEl; + std::vector> vecMixElMupion; + template void fillHistograms(Ts const& reconstructedBarrelTracks) { @@ -1124,10 +1067,28 @@ struct UpcTauRl { histos.get(HIST("Events/hNreconstructedPVGTothers"))->Fill(countPVGTothers); bool isTwoSelectedTracks = (cutTauEvent.useThresholdsPID ? countPVGTelmupiAlt == 2 : countPVGTselected == 2); + bool isElEl = (cutTauEvent.useThresholdsPID ? countPVGTelectronsAlt == 2 : countPVGTelectrons == 2); + bool isPiPi = (cutTauEvent.useThresholdsPID ? countPVGTmupionsAlt == 2 : (countPVGTmuons == 2 || (countPVGTmuons == 1 && countPVGTpions == 1) || countPVGTpions == 2)); + bool isFourPion = (cutTauEvent.useThresholdsPID ? countPVGTmupionsAlt == 4 : countPVGTpions == 4); + bool isElThreePion = (cutTauEvent.useThresholdsPID ? (countPVGTelectronsAlt == 1 && countPVGTmupionsAlt == 3) : (countPVGTelectrons == 1 && (countPVGTmuons == 3 || (countPVGTmuons == 2 && countPVGTpions == 1) || (countPVGTmuons == 1 && countPVGTpions == 2) || countPVGTpions == 3))); + bool isSixPion = (cutTauEvent.useThresholdsPID ? countPVGTmupionsAlt == 6 : countPVGTpions == 6); bool isElMuPion = (cutTauEvent.useThresholdsPID ? (countPVGTelectronsAlt == 1 && countPVGTmupionsAlt == 1) : ((countPVGTelectrons == 1 && countPVGTmuons == 1) || (countPVGTelectrons == 1 && countPVGTpions == 1))); + + if (isElEl) + histos.get(HIST("Events/hChannels"))->Fill(CH_EE); + if (isPiPi) + histos.get(HIST("Events/hChannels"))->Fill(CH_PIPI); + if (isFourPion) + histos.get(HIST("Events/hChannels"))->Fill(CH_FOURPI); + if (isElThreePion) + histos.get(HIST("Events/hChannels"))->Fill(CH_ETHREEPI); + if (isSixPion) + histos.get(HIST("Events/hChannels"))->Fill(CH_SIXPI); + if (isElMuPion) + histos.get(HIST("Events/hChannels"))->Fill(CH_EMUPI); + if (isTwoSelectedTracks && doTwoTracks) { TLorentzVector mother, daug[2], motherOfPions, pion[2], motherOfMuons, muon[2]; - const auto& trkDaug1 = reconstructedBarrelTracks.iteratorAt(cutTauEvent.useThresholdsPID ? vecPVnewPIDidx[0] : vecPVidx[0]); const auto& trkDaug2 = reconstructedBarrelTracks.iteratorAt(cutTauEvent.useThresholdsPID ? vecPVnewPIDidx[1] : vecPVidx[1]); daug[0].SetPxPyPzE(trkDaug1.px(), trkDaug1.py(), trkDaug1.pz(), energy(pdg->Mass(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)), trkDaug1.px(), trkDaug1.py(), trkDaug1.pz())); @@ -1154,7 +1115,6 @@ struct UpcTauRl { if (cutTauEvent.applyTauEventSelection && !selectedTauEvent(trkDaug1, trkDaug2)) { return; } - histos.get(HIST("EventTwoTracks/hInvariantMass"))->Fill(mother.M()); histos.get(HIST("EventTwoTracks/hInvariantMassWide"))->Fill(mother.M()); histos.get(HIST("EventTwoTracks/hInvariantMassWideAllPionMass"))->Fill(motherOfPions.M()); @@ -1186,12 +1146,12 @@ struct UpcTauRl { histos.get(HIST("EventTwoTracks/hDaughtersPvsITSclusterSizeXcos"))->Fill(getAvgITSClSize(trkDaug1) * getCosLambda(trkDaug1), trkDaug1.sign() * daug[0].P()); histos.get(HIST("EventTwoTracks/hDaughtersPvsITSclusterSizeXcos"))->Fill(getAvgITSClSize(trkDaug2) * getCosLambda(trkDaug2), trkDaug2.sign() * daug[1].P()); - // ee, mm, em, pp, ep, mp, pppp, eppp, mppp, pppppp - if (countPVGTelectrons == 2) { - histos.get(HIST("Events/hChannels"))->Fill(CH_EE); + if (isElEl) { + cutTauEvent.useThresholdsPID ? vecMixElEl.push_back(std::make_pair(vecPVnewPIDidx[0], vecPVnewPIDidx[1])) : vecMixElEl.push_back(std::make_pair(vecPVidx[0], vecPVidx[1])); histos.get(HIST("EventTwoTracks/TwoElectrons/hInvariantMass"))->Fill(mother.M()); histos.get(HIST("EventTwoTracks/TwoElectrons/hInvariantMassWide"))->Fill(mother.M()); histos.get(HIST("EventTwoTracks/TwoElectrons/hAcoplanarity"))->Fill(acoplanarity); + histos.get(HIST("EventTwoTracks/TwoElectrons/hCollinearity"))->Fill(collinearity); histos.get(HIST("EventTwoTracks/TwoElectrons/hMotherP"))->Fill(mother.P()); histos.get(HIST("EventTwoTracks/TwoElectrons/hMotherPwide"))->Fill(mother.P()); histos.get(HIST("EventTwoTracks/TwoElectrons/hMotherPt"))->Fill(mother.Pt()); @@ -1229,131 +1189,26 @@ struct UpcTauRl { histos.get(HIST("EventTwoTracks/TwoElectrons/hDaughtersPtvsModPhiTOF"))->Fill(daug[1].P(), getPhiModN(daug[1].Phi(), trkDaug2.sign(), 1)); } } - if (countPVGTmuons == 2) { - histos.get(HIST("Events/hChannels"))->Fill(CH_MUMU); - histos.get(HIST("EventTwoTracks/TwoMuons/hInvariantMass"))->Fill(mother.M()); - histos.get(HIST("EventTwoTracks/TwoMuons/hInvariantMassWide"))->Fill(mother.M()); - histos.get(HIST("EventTwoTracks/TwoMuons/hAcoplanarity"))->Fill(acoplanarity); - histos.get(HIST("EventTwoTracks/TwoMuons/hMotherP"))->Fill(mother.P()); - histos.get(HIST("EventTwoTracks/TwoMuons/hMotherPwide"))->Fill(mother.P()); - histos.get(HIST("EventTwoTracks/TwoMuons/hMotherPt"))->Fill(mother.Pt()); - histos.get(HIST("EventTwoTracks/TwoMuons/hMotherPhi"))->Fill(mother.Phi()); - histos.get(HIST("EventTwoTracks/TwoMuons/hMotherRapidity"))->Fill(mother.Rapidity()); - histos.get(HIST("EventTwoTracks/TwoMuons/hMotherMassVsPt"))->Fill(mother.M(), mother.Pt()); - histos.get(HIST("EventTwoTracks/TwoMuons/hDaughtersP"))->Fill(daug[0].P(), daug[1].P()); - histos.get(HIST("EventTwoTracks/TwoMuons/hDaughtersPwide"))->Fill(daug[0].P(), daug[1].P()); - histos.get(HIST("EventTwoTracks/TwoMuons/hDaughtersPt"))->Fill(daug[0].Pt(), daug[1].Pt()); - histos.get(HIST("EventTwoTracks/TwoMuons/hDaughtersPhi"))->Fill(daug[0].Phi(), daug[1].Phi()); - histos.get(HIST("EventTwoTracks/TwoMuons/hDaughtersRapidity"))->Fill(daug[0].Rapidity(), daug[1].Rapidity()); - histos.get(HIST("EventTwoTracks/TwoMuons/hDaughtersPtvsModPhi"))->Fill(daug[0].P(), getPhiModN(daug[0].Phi(), trkDaug1.sign(), 1)); - histos.get(HIST("EventTwoTracks/TwoMuons/hDaughtersPtvsModPhi"))->Fill(daug[1].P(), getPhiModN(daug[1].Phi(), trkDaug2.sign(), 1)); - if (mother.Pt() < 0.2) { - histos.get(HIST("EventTwoTracks/TwoMuons/hInvariantMassWidePtCut"))->Fill(mother.M()); - histos.get(HIST("EventTwoTracks/TwoMuons/hDaughtersPtvsModPhiPtCut"))->Fill(daug[0].P(), getPhiModN(daug[0].Phi(), trkDaug1.sign(), 1)); - histos.get(HIST("EventTwoTracks/TwoMuons/hDaughtersPtvsModPhiPtCut"))->Fill(daug[1].P(), getPhiModN(daug[1].Phi(), trkDaug2.sign(), 1)); - if (countTOFtracks == 2) { - histos.get(HIST("EventTwoTracks/TwoMuons/hDaughtersPtvsModPhiPtCutTOF"))->Fill(daug[0].P(), getPhiModN(daug[0].Phi(), trkDaug1.sign(), 1)); - histos.get(HIST("EventTwoTracks/TwoMuons/hDaughtersPtvsModPhiPtCutTOF"))->Fill(daug[1].P(), getPhiModN(daug[1].Phi(), trkDaug2.sign(), 1)); + if (isElMuPion) { + if (cutTauEvent.useThresholdsPID) { + if (isElectronCandidate(trkDaug1)) { + vecMixElMupion.push_back(std::make_pair(vecPVnewPIDidx[0], vecPVnewPIDidx[1])); // storing electron first + } else { + vecMixElMupion.push_back(std::make_pair(vecPVnewPIDidx[1], vecPVnewPIDidx[0])); } - } - if (countTOFtracks == 2) { - histos.get(HIST("EventTwoTracks/TwoMuons/hDaughtersPtvsModPhiTOF"))->Fill(daug[0].P(), getPhiModN(daug[0].Phi(), trkDaug1.sign(), 1)); - histos.get(HIST("EventTwoTracks/TwoMuons/hDaughtersPtvsModPhiTOF"))->Fill(daug[1].P(), getPhiModN(daug[1].Phi(), trkDaug2.sign(), 1)); - } - } - if (countPVGTelectrons == 1 && countPVGTmuons == 1) { - histos.get(HIST("Events/hChannels"))->Fill(CH_EMU); - histos.get(HIST("EventTwoTracks/ElectronMuon/hInvariantMass"))->Fill(mother.M()); - histos.get(HIST("EventTwoTracks/ElectronMuon/hInvariantMassWide"))->Fill(mother.M()); - histos.get(HIST("EventTwoTracks/ElectronMuon/hAcoplanarity"))->Fill(acoplanarity); - histos.get(HIST("EventTwoTracks/ElectronMuon/hMotherP"))->Fill(mother.P()); - histos.get(HIST("EventTwoTracks/ElectronMuon/hMotherPwide"))->Fill(mother.P()); - histos.get(HIST("EventTwoTracks/ElectronMuon/hMotherPt"))->Fill(mother.Pt()); - histos.get(HIST("EventTwoTracks/ElectronMuon/hMotherPhi"))->Fill(mother.Phi()); - histos.get(HIST("EventTwoTracks/ElectronMuon/hMotherRapidity"))->Fill(mother.Rapidity()); - histos.get(HIST("EventTwoTracks/ElectronMuon/hMotherMassVsPt"))->Fill(mother.M(), mother.Pt()); - histos.get(HIST("EventTwoTracks/ElectronMuon/hDaughtersP"))->Fill(daug[0].P(), daug[1].P()); - histos.get(HIST("EventTwoTracks/ElectronMuon/hDaughtersPwide"))->Fill(daug[0].P(), daug[1].P()); - histos.get(HIST("EventTwoTracks/ElectronMuon/hDaughtersPt"))->Fill(daug[0].Pt(), daug[1].Pt()); - histos.get(HIST("EventTwoTracks/ElectronMuon/hDaughtersPhi"))->Fill(daug[0].Phi(), daug[1].Phi()); - histos.get(HIST("EventTwoTracks/ElectronMuon/hDaughtersRapidity"))->Fill(daug[0].Rapidity(), daug[1].Rapidity()); - } - if (countPVGTpions == 2) { - histos.get(HIST("Events/hChannels"))->Fill(CH_PIPI); - histos.get(HIST("EventTwoTracks/TwoPions/hInvariantMass"))->Fill(mother.M()); - histos.get(HIST("EventTwoTracks/TwoPions/hInvariantMassWide"))->Fill(mother.M()); - histos.get(HIST("EventTwoTracks/TwoPions/hAcoplanarity"))->Fill(acoplanarity); - histos.get(HIST("EventTwoTracks/TwoPions/hMotherP"))->Fill(mother.P()); - histos.get(HIST("EventTwoTracks/TwoPions/hMotherPwide"))->Fill(mother.P()); - histos.get(HIST("EventTwoTracks/TwoPions/hMotherPt"))->Fill(mother.Pt()); - histos.get(HIST("EventTwoTracks/TwoPions/hMotherPhi"))->Fill(mother.Phi()); - histos.get(HIST("EventTwoTracks/TwoPions/hMotherRapidity"))->Fill(mother.Rapidity()); - histos.get(HIST("EventTwoTracks/TwoPions/hMotherMassVsPt"))->Fill(mother.M(), mother.Pt()); - histos.get(HIST("EventTwoTracks/TwoPions/hDaughtersP"))->Fill(daug[0].P(), daug[1].P()); - histos.get(HIST("EventTwoTracks/TwoPions/hDaughtersPwide"))->Fill(daug[0].P(), daug[1].P()); - histos.get(HIST("EventTwoTracks/TwoPions/hDaughtersPt"))->Fill(daug[0].Pt(), daug[1].Pt()); - histos.get(HIST("EventTwoTracks/TwoPions/hDaughtersPhi"))->Fill(daug[0].Phi(), daug[1].Phi()); - histos.get(HIST("EventTwoTracks/TwoPions/hDaughtersRapidity"))->Fill(daug[0].Rapidity(), daug[1].Rapidity()); - histos.get(HIST("EventTwoTracks/TwoPions/hDaughtersPtvsModPhi"))->Fill(daug[0].P(), getPhiModN(daug[0].Phi(), trkDaug1.sign(), 1)); - histos.get(HIST("EventTwoTracks/TwoPions/hDaughtersPtvsModPhi"))->Fill(daug[1].P(), getPhiModN(daug[1].Phi(), trkDaug2.sign(), 1)); - if (mother.Pt() < 0.2) { - histos.get(HIST("EventTwoTracks/TwoPions/hInvariantMassWidePtCut"))->Fill(mother.M()); - histos.get(HIST("EventTwoTracks/TwoPions/hDaughtersPtvsModPhiPtCut"))->Fill(daug[0].P(), getPhiModN(daug[0].Phi(), trkDaug1.sign(), 1)); - histos.get(HIST("EventTwoTracks/TwoPions/hDaughtersPtvsModPhiPtCut"))->Fill(daug[1].P(), getPhiModN(daug[1].Phi(), trkDaug2.sign(), 1)); - if (countTOFtracks == 2) { - histos.get(HIST("EventTwoTracks/TwoPions/hDaughtersPtvsModPhiPtCutTOF"))->Fill(daug[0].P(), getPhiModN(daug[0].Phi(), trkDaug1.sign(), 1)); - histos.get(HIST("EventTwoTracks/TwoPions/hDaughtersPtvsModPhiPtCutTOF"))->Fill(daug[1].P(), getPhiModN(daug[1].Phi(), trkDaug2.sign(), 1)); + } else { + if (enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) { + vecMixElMupion.push_back(std::make_pair(vecPVidx[0], vecPVidx[1])); // storing electron first + } else { + vecMixElMupion.push_back(std::make_pair(vecPVidx[1], vecPVidx[0])); } } - if (countTOFtracks == 2) { - histos.get(HIST("EventTwoTracks/TwoPions/hDaughtersPtvsModPhiTOF"))->Fill(daug[0].P(), getPhiModN(daug[0].Phi(), trkDaug1.sign(), 1)); - histos.get(HIST("EventTwoTracks/TwoPions/hDaughtersPtvsModPhiTOF"))->Fill(daug[1].P(), getPhiModN(daug[1].Phi(), trkDaug2.sign(), 1)); - } - } - if (countPVGTelectrons == 1 && countPVGTpions == 1) { - histos.get(HIST("Events/hChannels"))->Fill(CH_EPI); - histos.get(HIST("EventTwoTracks/ElectronPion/hInvariantMass"))->Fill(mother.M()); - histos.get(HIST("EventTwoTracks/ElectronPion/hInvariantMassWide"))->Fill(mother.M()); - histos.get(HIST("EventTwoTracks/ElectronPion/hAcoplanarity"))->Fill(acoplanarity); - histos.get(HIST("EventTwoTracks/ElectronPion/hMotherP"))->Fill(mother.P()); - histos.get(HIST("EventTwoTracks/ElectronPion/hMotherPwide"))->Fill(mother.P()); - histos.get(HIST("EventTwoTracks/ElectronPion/hMotherPt"))->Fill(mother.Pt()); - histos.get(HIST("EventTwoTracks/ElectronPion/hMotherPhi"))->Fill(mother.Phi()); - histos.get(HIST("EventTwoTracks/ElectronPion/hMotherRapidity"))->Fill(mother.Rapidity()); - histos.get(HIST("EventTwoTracks/ElectronPion/hMotherMassVsPt"))->Fill(mother.M(), mother.Pt()); - histos.get(HIST("EventTwoTracks/ElectronPion/hDaughtersP"))->Fill(daug[0].P(), daug[1].P()); - histos.get(HIST("EventTwoTracks/ElectronPion/hDaughtersPwide"))->Fill(daug[0].P(), daug[1].P()); - histos.get(HIST("EventTwoTracks/ElectronPion/hDaughtersPt"))->Fill(daug[0].Pt(), daug[1].Pt()); - histos.get(HIST("EventTwoTracks/ElectronPion/hDaughtersPhi"))->Fill(daug[0].Phi(), daug[1].Phi()); - histos.get(HIST("EventTwoTracks/ElectronPion/hDaughtersRapidity"))->Fill(daug[0].Rapidity(), daug[1].Rapidity()); - } - if (countPVGTpions == 1 && countPVGTmuons == 1) { - histos.get(HIST("Events/hChannels"))->Fill(CH_MUPI); - histos.get(HIST("EventTwoTracks/MuonPion/hInvariantMass"))->Fill(mother.M()); - histos.get(HIST("EventTwoTracks/MuonPion/hInvariantMassWide"))->Fill(mother.M()); - histos.get(HIST("EventTwoTracks/MuonPion/hAcoplanarity"))->Fill(acoplanarity); - histos.get(HIST("EventTwoTracks/MuonPion/hMotherP"))->Fill(mother.P()); - histos.get(HIST("EventTwoTracks/MuonPion/hMotherPwide"))->Fill(mother.P()); - histos.get(HIST("EventTwoTracks/MuonPion/hMotherPt"))->Fill(mother.Pt()); - histos.get(HIST("EventTwoTracks/MuonPion/hMotherPhi"))->Fill(mother.Phi()); - histos.get(HIST("EventTwoTracks/MuonPion/hMotherRapidity"))->Fill(mother.Rapidity()); - histos.get(HIST("EventTwoTracks/MuonPion/hMotherMassVsPt"))->Fill(mother.M(), mother.Pt()); - histos.get(HIST("EventTwoTracks/MuonPion/hDaughtersP"))->Fill(daug[0].P(), daug[1].P()); - histos.get(HIST("EventTwoTracks/MuonPion/hDaughtersPwide"))->Fill(daug[0].P(), daug[1].P()); - histos.get(HIST("EventTwoTracks/MuonPion/hDaughtersPt"))->Fill(daug[0].Pt(), daug[1].Pt()); - histos.get(HIST("EventTwoTracks/MuonPion/hDaughtersPhi"))->Fill(daug[0].Phi(), daug[1].Phi()); - histos.get(HIST("EventTwoTracks/MuonPion/hDaughtersRapidity"))->Fill(daug[0].Rapidity(), daug[1].Rapidity()); - if (mother.Pt() < 0.2) { - histos.get(HIST("EventTwoTracks/MuonPion/hInvariantMassWidePtCut"))->Fill(mother.M()); - } - } - if (isElMuPion) { - double electronPt = (cutTauEvent.useThresholdsPID ? isElectronCandidate(trkDaug1) : enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[0].Pt() : daug[1].Pt(); - double electronP = (cutTauEvent.useThresholdsPID ? isElectronCandidate(trkDaug1) : enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[0].P() : daug[1].P(); - double electronE = (cutTauEvent.useThresholdsPID ? isElectronCandidate(trkDaug1) : enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[0].E() : daug[1].E(); - double mupionPt = (cutTauEvent.useThresholdsPID ? isElectronCandidate(trkDaug1) : enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[1].Pt() : daug[0].Pt(); - double mupionP = (cutTauEvent.useThresholdsPID ? isElectronCandidate(trkDaug1) : enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[1].P() : daug[0].P(); - double mupionE = (cutTauEvent.useThresholdsPID ? isElectronCandidate(trkDaug1) : enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[1].E() : daug[0].E(); + const auto& electronPt = (cutTauEvent.useThresholdsPID ? isElectronCandidate(trkDaug1) : enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[0].Pt() : daug[1].Pt(); + const auto& electronP = (cutTauEvent.useThresholdsPID ? isElectronCandidate(trkDaug1) : enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[0].P() : daug[1].P(); + const auto& electronE = (cutTauEvent.useThresholdsPID ? isElectronCandidate(trkDaug1) : enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[0].E() : daug[1].E(); + const auto& mupionPt = (cutTauEvent.useThresholdsPID ? isElectronCandidate(trkDaug1) : enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[1].Pt() : daug[0].Pt(); + const auto& mupionP = (cutTauEvent.useThresholdsPID ? isElectronCandidate(trkDaug1) : enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[1].P() : daug[0].P(); + const auto& mupionE = (cutTauEvent.useThresholdsPID ? isElectronCandidate(trkDaug1) : enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[1].E() : daug[0].E(); TLorentzVector motherOfPiKaon, kaon; if (isElectronCandidate(trkDaug1)) { @@ -1363,7 +1218,6 @@ struct UpcTauRl { kaon.SetPxPyPzE(trkDaug2.px(), trkDaug2.py(), trkDaug2.pz(), energy(MassKaonCharged, trkDaug2.px(), trkDaug2.py(), trkDaug2.pz())); motherOfPiKaon = daug[0] + kaon; } - histos.get(HIST("Events/hChannels"))->Fill(CH_EMUPI); histos.get(HIST("EventTwoTracks/ElectronMuPi/hInvariantMass"))->Fill(mother.M()); histos.get(HIST("EventTwoTracks/ElectronMuPi/hInvariantMassWide"))->Fill(mother.M()); histos.get(HIST("EventTwoTracks/ElectronMuPi/PionsSelection/hInvariantMass"))->Fill(motherOfPions.M()); @@ -1440,65 +1294,6 @@ struct UpcTauRl { if (electronPt > 2. && electronPt < 100.) histos.get(HIST("EventTwoTracks/ElectronMuPi/hNeventsPtCuts"))->Fill(12); } - if ((countPVGTelectrons == 2) || (countPVGTelectrons == 1 && countPVGTmuons == 1) || (countPVGTelectrons == 1 && countPVGTpions == 1)) { - double electronPt = (enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[0].Pt() : daug[1].Pt(); - if (countPVGTelectrons == 2) - electronPt = (daug[0].Pt() > daug[1].Pt()) ? daug[0].Pt() : daug[1].Pt(); - histos.get(HIST("EventTwoTracks/ElectronOther/hInvariantMass"))->Fill(mother.M()); - histos.get(HIST("EventTwoTracks/ElectronOther/hInvariantMassWide"))->Fill(mother.M()); - histos.get(HIST("EventTwoTracks/ElectronOther/hAcoplanarity"))->Fill(acoplanarity); - histos.get(HIST("EventTwoTracks/ElectronOther/hMotherP"))->Fill(mother.P()); - histos.get(HIST("EventTwoTracks/ElectronOther/hMotherPwide"))->Fill(mother.P()); - histos.get(HIST("EventTwoTracks/ElectronOther/hMotherPt"))->Fill(mother.Pt()); - histos.get(HIST("EventTwoTracks/ElectronOther/hMotherPhi"))->Fill(mother.Phi()); - histos.get(HIST("EventTwoTracks/ElectronOther/hMotherRapidity"))->Fill(mother.Rapidity()); - histos.get(HIST("EventTwoTracks/ElectronOther/hMotherMassVsPt"))->Fill(mother.M(), mother.Pt()); - histos.get(HIST("EventTwoTracks/ElectronOther/hElectronPt"))->Fill(electronPt); - histos.get(HIST("EventTwoTracks/ElectronOther/hElectronPtWide"))->Fill(electronPt); - histos.get(HIST("EventTwoTracks/ElectronOther/hDaughtersP"))->Fill(daug[0].P(), daug[1].P()); - histos.get(HIST("EventTwoTracks/ElectronOther/hDaughtersPwide"))->Fill(daug[0].P(), daug[1].P()); - histos.get(HIST("EventTwoTracks/ElectronOther/hDaughtersPt"))->Fill(daug[0].Pt(), daug[1].Pt()); - histos.get(HIST("EventTwoTracks/ElectronOther/hDaughtersPhi"))->Fill(daug[0].Phi(), daug[1].Phi()); - histos.get(HIST("EventTwoTracks/ElectronOther/hDaughtersRapidity"))->Fill(daug[0].Rapidity(), daug[1].Rapidity()); - if (countPVGTelectrons == 2) { - histos.get(HIST("EventTwoTracks/ElectronOther/hElectronPvsOtherP"))->Fill(((daug[0].P() > daug[1].P()) ? daug[0].P() : daug[1].P()), ((daug[0].P() > daug[1].P()) ? daug[1].P() : daug[0].P())); - histos.get(HIST("EventTwoTracks/ElectronOther/hElectronPwideVsOtherPwide"))->Fill(((daug[0].P() > daug[1].P()) ? daug[0].P() : daug[1].P()), ((daug[0].P() > daug[1].P()) ? daug[1].P() : daug[0].P())); - histos.get(HIST("EventTwoTracks/ElectronOther/hElectronPtVsOtherPt"))->Fill(((daug[0].P() > daug[1].P()) ? daug[0].Pt() : daug[1].Pt()), ((daug[0].P() > daug[1].P()) ? daug[1].Pt() : daug[0].Pt())); - histos.get(HIST("EventTwoTracks/ElectronOther/hElectronPhiVsOtherPhi"))->Fill(((daug[0].P() > daug[1].P()) ? daug[0].Phi() : daug[1].Phi()), ((daug[0].P() > daug[1].P()) ? daug[1].Phi() : daug[0].Phi())); - histos.get(HIST("EventTwoTracks/ElectronOther/hElectronRapVsOtherRap"))->Fill(((daug[0].P() > daug[1].P()) ? daug[0].Rapidity() : daug[1].Rapidity()), ((daug[0].P() > daug[1].P()) ? daug[1].Rapidity() : daug[0].Rapidity())); - } else { - histos.get(HIST("EventTwoTracks/ElectronOther/hElectronPvsOtherP"))->Fill((enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[0].P() : daug[1].P(), (enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[1].P() : daug[0].P()); - histos.get(HIST("EventTwoTracks/ElectronOther/hElectronPwideVsOtherPwide"))->Fill((enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[0].P() : daug[1].P(), (enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[1].P() : daug[0].P()); - histos.get(HIST("EventTwoTracks/ElectronOther/hElectronPtVsOtherPt"))->Fill((enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[0].Pt() : daug[1].Pt(), (enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[1].Pt() : daug[0].Pt()); - histos.get(HIST("EventTwoTracks/ElectronOther/hElectronPhiVsOtherPhi"))->Fill((enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[0].Phi() : daug[1].Phi(), (enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[1].Phi() : daug[0].Phi()); - histos.get(HIST("EventTwoTracks/ElectronOther/hElectronRapVsOtherRap"))->Fill((enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[0].Rapidity() : daug[1].Rapidity(), (enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[1].Rapidity() : daug[0].Rapidity()); - } - histos.get(HIST("EventTwoTracks/ElectronOther/hNeventsPtCuts"))->Fill(0); - if (mother.Pt() < 9.) - histos.get(HIST("EventTwoTracks/ElectronOther/hNeventsPtCuts"))->Fill(1); - if (mother.Pt() < 8.) - histos.get(HIST("EventTwoTracks/ElectronOther/hNeventsPtCuts"))->Fill(2); - if (mother.Pt() < 7.) - histos.get(HIST("EventTwoTracks/ElectronOther/hNeventsPtCuts"))->Fill(3); - if (mother.Pt() < 6.) - histos.get(HIST("EventTwoTracks/ElectronOther/hNeventsPtCuts"))->Fill(4); - if (mother.Pt() < 5.) - histos.get(HIST("EventTwoTracks/ElectronOther/hNeventsPtCuts"))->Fill(5); - if (mother.Pt() < 4.) - histos.get(HIST("EventTwoTracks/ElectronOther/hNeventsPtCuts"))->Fill(6); - if (mother.Pt() < 3.) - histos.get(HIST("EventTwoTracks/ElectronOther/hNeventsPtCuts"))->Fill(7); - if (mother.Pt() < 2.) - histos.get(HIST("EventTwoTracks/ElectronOther/hNeventsPtCuts"))->Fill(8); - if (mother.Pt() < 1.) - histos.get(HIST("EventTwoTracks/ElectronOther/hNeventsPtCuts"))->Fill(9); - if (electronPt > 0.1 && electronPt < 1.) - histos.get(HIST("EventTwoTracks/ElectronOther/hNeventsPtCuts"))->Fill(10); - if (electronPt > 1. && electronPt < 2.) - histos.get(HIST("EventTwoTracks/ElectronOther/hNeventsPtCuts"))->Fill(11); - if (electronPt > 2. && electronPt < 100.) - histos.get(HIST("EventTwoTracks/ElectronOther/hNeventsPtCuts"))->Fill(12); - } } else { printDebugMessage("Other particles"); } @@ -1768,6 +1563,7 @@ struct UpcTauRl { } bool isTwoSelectedTracks = (cutTauEvent.useThresholdsPID ? countPVGTelmupiAlt == 2 : countPVGTselected == 2); + bool isElEl = (cutTauEvent.useThresholdsPID ? countPVGTelectronsAlt == 2 : countPVGTelectrons == 2); bool isElMuPion = (cutTauEvent.useThresholdsPID ? (countPVGTelectronsAlt == 1 && countPVGTmupionsAlt == 1) : ((countPVGTelectrons == 1 && countPVGTmuons == 1) || (countPVGTelectrons == 1 && countPVGTpions == 1))); if (isTwoSelectedTracks && doTwoTracks) { TLorentzVector daug[2], pion[2], muon[2]; @@ -1792,7 +1588,6 @@ struct UpcTauRl { if (isMuPionCandidate(trkDaug2)) daug[1].SetPxPyPzE(trkDaug2.px(), trkDaug2.py(), trkDaug2.pz(), energy(MassPionCharged, trkDaug2.px(), trkDaug2.py(), trkDaug2.pz())); } - if (trkDaug1.hasTPC()) { histos.get(HIST("EventTwoTracks/PID/hTPCsignalVsP"))->Fill(daug[0].P(), trkDaug1.tpcSignal()); histos.get(HIST("EventTwoTracks/PID/hTPCnSigmaElVsP"))->Fill(daug[0].P(), trkDaug1.tpcNSigmaEl()); @@ -1803,7 +1598,7 @@ struct UpcTauRl { if (trkDaug1.hasTOF()) { histos.get(HIST("EventTwoTracks/PID/hTOFsignalVsP"))->Fill(daug[0].P(), trkDaug1.tofSignal()); } - if (countPVGTelectrons == 2) { + if (isElEl) { histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTPCsignalVsP"))->Fill(daug[0].P(), trkDaug1.tpcSignal()); histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTPCnSigmaVsP"))->Fill(daug[0].P(), trkDaug1.tpcNSigmaEl()); if (trkDaug1.hasTOF()) { @@ -1811,16 +1606,6 @@ struct UpcTauRl { histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTOFnSigmaVsP"))->Fill(daug[0].P(), trkDaug1.tofNSigmaEl()); } } - if (countPVGTmuons == 2) - histos.get(HIST("EventTwoTracks/TwoMuons/PID/hTPCsignalVsP"))->Fill(daug[0].P(), trkDaug1.tpcSignal()); - if (countPVGTpions == 2) - histos.get(HIST("EventTwoTracks/TwoPions/PID/hTPCsignalVsP"))->Fill(daug[0].P(), trkDaug1.tpcSignal()); - if (countPVGTelectrons == 1 && countPVGTmuons == 1) - histos.get(HIST("EventTwoTracks/ElectronMuon/PID/hTPCsignalVsP"))->Fill(daug[0].P(), trkDaug1.tpcSignal()); - if (countPVGTelectrons == 1 && countPVGTpions == 1) - histos.get(HIST("EventTwoTracks/ElectronPion/PID/hTPCsignalVsP"))->Fill(daug[0].P(), trkDaug1.tpcSignal()); - if (countPVGTpions == 1 && countPVGTmuons == 1) - histos.get(HIST("EventTwoTracks/MuonPion/PID/hTPCsignalVsP"))->Fill(daug[0].P(), trkDaug1.tpcSignal()); if (isElMuPion) { histos.get(HIST("EventTwoTracks/ElectronMuPi/PID/hTPCsignalVsP"))->Fill(daug[0].P(), trkDaug1.tpcSignal()); histos.get(HIST("EventTwoTracks/ElectronMuPi/PID/hTPCnSigmaVsP"))->Fill(daug[0].P(), trkDaug1.tpcNSigmaEl()); @@ -1829,14 +1614,6 @@ struct UpcTauRl { histos.get(HIST("EventTwoTracks/ElectronMuPi/PID/hTOFnSigmaVsP"))->Fill(daug[0].P(), trkDaug1.tofNSigmaEl()); } } - if ((countPVGTelectrons == 2) || (countPVGTelectrons == 1 && countPVGTmuons == 1) || (countPVGTelectrons == 1 && countPVGTpions == 1)) { - histos.get(HIST("EventTwoTracks/ElectronOther/PID/hTPCsignalVsP"))->Fill(daug[0].P(), trkDaug1.tpcSignal()); - histos.get(HIST("EventTwoTracks/ElectronOther/PID/hTPCnSigmaVsP"))->Fill(daug[0].P(), trkDaug1.tpcNSigmaEl()); - if (trkDaug1.hasTOF()) { - histos.get(HIST("EventTwoTracks/ElectronOther/PID/hTOFsignalVsP"))->Fill(daug[0].P(), trkDaug1.tofSignal()); - histos.get(HIST("EventTwoTracks/ElectronOther/PID/hTOFnSigmaVsP"))->Fill(daug[0].P(), trkDaug1.tofNSigmaEl()); - } - } } if (trkDaug2.hasTPC()) { histos.get(HIST("EventTwoTracks/PID/hTPCsignalVsP"))->Fill(daug[1].P(), trkDaug2.tpcSignal()); @@ -1848,7 +1625,7 @@ struct UpcTauRl { if (trkDaug2.hasTOF()) { histos.get(HIST("EventTwoTracks/PID/hTOFsignalVsP"))->Fill(daug[1].P(), trkDaug2.tofSignal()); } - if (countPVGTelectrons == 2) { + if (isElEl) { histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTPCsignalVsP"))->Fill(daug[1].P(), trkDaug2.tpcSignal()); histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTPCnSigmaVsP"))->Fill(daug[1].P(), trkDaug2.tpcNSigmaEl()); if (trkDaug2.hasTOF()) { @@ -1856,16 +1633,6 @@ struct UpcTauRl { histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTOFnSigmaVsP"))->Fill(daug[1].P(), trkDaug2.tofNSigmaEl()); } } - if (countPVGTmuons == 2) - histos.get(HIST("EventTwoTracks/TwoMuons/PID/hTPCsignalVsP"))->Fill(daug[1].P(), trkDaug2.tpcSignal()); - if (countPVGTpions == 2) - histos.get(HIST("EventTwoTracks/TwoPions/PID/hTPCsignalVsP"))->Fill(daug[1].P(), trkDaug2.tpcSignal()); - if (countPVGTelectrons == 1 && countPVGTmuons == 1) - histos.get(HIST("EventTwoTracks/ElectronMuon/PID/hTPCsignalVsP"))->Fill(daug[1].P(), trkDaug2.tpcSignal()); - if (countPVGTelectrons == 1 && countPVGTpions == 1) - histos.get(HIST("EventTwoTracks/ElectronPion/PID/hTPCsignalVsP"))->Fill(daug[1].P(), trkDaug2.tpcSignal()); - if (countPVGTpions == 1 && countPVGTmuons == 1) - histos.get(HIST("EventTwoTracks/MuonPion/PID/hTPCsignalVsP"))->Fill(daug[1].P(), trkDaug2.tpcSignal()); if (isElMuPion) { histos.get(HIST("EventTwoTracks/ElectronMuPi/PID/hTPCsignalVsP"))->Fill(daug[1].P(), trkDaug2.tpcSignal()); histos.get(HIST("EventTwoTracks/ElectronMuPi/PID/hTPCnSigmaVsP"))->Fill(daug[1].P(), trkDaug2.tpcNSigmaEl()); @@ -1874,17 +1641,9 @@ struct UpcTauRl { histos.get(HIST("EventTwoTracks/ElectronMuPi/PID/hTOFnSigmaVsP"))->Fill(daug[1].P(), trkDaug2.tofNSigmaEl()); } } - if ((countPVGTelectrons == 2) || (countPVGTelectrons == 1 && countPVGTmuons == 1) || (countPVGTelectrons == 1 && countPVGTpions == 1)) { - histos.get(HIST("EventTwoTracks/ElectronOther/PID/hTPCsignalVsP"))->Fill(daug[1].P(), trkDaug2.tpcSignal()); - histos.get(HIST("EventTwoTracks/ElectronOther/PID/hTPCnSigmaVsP"))->Fill(daug[1].P(), trkDaug2.tpcNSigmaEl()); - if (trkDaug2.hasTOF()) { - histos.get(HIST("EventTwoTracks/ElectronOther/PID/hTOFsignalVsP"))->Fill(daug[1].P(), trkDaug2.tofSignal()); - histos.get(HIST("EventTwoTracks/ElectronOther/PID/hTOFnSigmaVsP"))->Fill(daug[1].P(), trkDaug2.tofNSigmaEl()); - } - } } if (trkDaug1.hasTPC() && trkDaug2.hasTPC()) { - if (countPVGTelectrons == 2) { + if (!isMC && isElEl) { if (daug[0].P() > daug[1].P()) { histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTPCsignalVsLP"))->Fill(daug[0].P(), trkDaug1.tpcSignal()); histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTPCsignalVsOP"))->Fill(daug[1].P(), trkDaug2.tpcSignal()); @@ -1951,49 +1710,6 @@ struct UpcTauRl { } } } - if ((countPVGTelectrons == 2) || (countPVGTelectrons == 1 && countPVGTmuons == 1) || (countPVGTelectrons == 1 && countPVGTpions == 1)) { - double electronPt = (enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[0].Pt() : daug[1].Pt(); - double electronPID = (enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? trkDaug1.tpcSignal() : trkDaug2.tpcSignal(); - double electronNsigmaEl = (enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? trkDaug1.tpcNSigmaEl() : trkDaug2.tpcNSigmaEl(); - double otherPt = (enumMyParticle(trackPDG(trkDaug2, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[0].Pt() : daug[1].Pt(); - double otherPID = (enumMyParticle(trackPDG(trkDaug2, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? trkDaug1.tpcSignal() : trkDaug2.tpcSignal(); - double otherNsigmaMu = (enumMyParticle(trackPDG(trkDaug2, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? trkDaug1.tpcNSigmaMu() : trkDaug2.tpcNSigmaMu(); - double otherNsigmaPi = (enumMyParticle(trackPDG(trkDaug2, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? trkDaug1.tpcNSigmaPi() : trkDaug2.tpcNSigmaPi(); - if (countPVGTelectrons == 2) { - electronPt = (daug[0].Pt() > daug[1].Pt()) ? daug[0].Pt() : daug[1].Pt(); - electronPID = (daug[0].Pt() > daug[1].Pt()) ? trkDaug1.tpcSignal() : trkDaug2.tpcSignal(); - electronNsigmaEl = (daug[0].Pt() > daug[1].Pt()) ? trkDaug1.tpcNSigmaEl() : trkDaug2.tpcNSigmaEl(); - otherPt = (daug[0].Pt() > daug[1].Pt()) ? daug[1].Pt() : daug[0].Pt(); - otherPID = (daug[0].Pt() > daug[1].Pt()) ? trkDaug2.tpcSignal() : trkDaug1.tpcSignal(); - otherNsigmaMu = (daug[0].Pt() > daug[1].Pt()) ? trkDaug2.tpcNSigmaMu() : trkDaug1.tpcNSigmaMu(); - otherNsigmaPi = (daug[0].Pt() > daug[1].Pt()) ? trkDaug2.tpcNSigmaPi() : trkDaug1.tpcNSigmaPi(); - } - histos.get(HIST("EventTwoTracks/ElectronOther/PID/hTPCsignalVsEP"))->Fill(electronPt, electronPID); - histos.get(HIST("EventTwoTracks/ElectronOther/PID/hTPCsignalVsOP"))->Fill(otherPt, otherPID); - histos.get(HIST("EventTwoTracks/ElectronOther/PID/hTPCnSigmaVsEP"))->Fill(electronPt, electronNsigmaEl); - histos.get(HIST("EventTwoTracks/ElectronOther/PID/hTPCnSigmaVsMP"))->Fill(otherPt, otherNsigmaMu); - histos.get(HIST("EventTwoTracks/ElectronOther/PID/hTPCnSigmaVsPP"))->Fill(otherPt, otherNsigmaPi); - if (trkDaug1.hasTOF()) { - if (enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) { - histos.get(HIST("EventTwoTracks/ElectronOther/PID/hTOFsignalVsEP"))->Fill(electronPt, trkDaug1.tofSignal()); - histos.get(HIST("EventTwoTracks/ElectronOther/PID/hTOFnSigmaVsEP"))->Fill(electronPt, trkDaug1.tofNSigmaEl()); - } else { - histos.get(HIST("EventTwoTracks/ElectronOther/PID/hTOFsignalVsOP"))->Fill(otherPt, trkDaug1.tofSignal()); - histos.get(HIST("EventTwoTracks/ElectronOther/PID/hTOFnSigmaVsMP"))->Fill(otherPt, trkDaug1.tofNSigmaMu()); - histos.get(HIST("EventTwoTracks/ElectronOther/PID/hTOFnSigmaVsPP"))->Fill(otherPt, trkDaug1.tofNSigmaPi()); - } - } - if (trkDaug2.hasTOF()) { - if (enumMyParticle(trackPDG(trkDaug2, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) { - histos.get(HIST("EventTwoTracks/ElectronOther/PID/hTOFsignalVsEP"))->Fill(electronPt, trkDaug2.tofSignal()); - histos.get(HIST("EventTwoTracks/ElectronOther/PID/hTOFnSigmaVsEP"))->Fill(electronPt, trkDaug2.tofNSigmaEl()); - } else { - histos.get(HIST("EventTwoTracks/ElectronOther/PID/hTOFsignalVsOP"))->Fill(otherPt, trkDaug2.tofSignal()); - histos.get(HIST("EventTwoTracks/ElectronOther/PID/hTOFnSigmaVsMP"))->Fill(otherPt, trkDaug2.tofNSigmaMu()); - histos.get(HIST("EventTwoTracks/ElectronOther/PID/hTOFnSigmaVsPP"))->Fill(otherPt, trkDaug2.tofNSigmaPi()); - } - } - } } } else { printDebugMessage("Other particles"); @@ -2048,6 +1764,7 @@ struct UpcTauRl { } // Loop over tracks with selections bool isTwoSelectedTracks = (cutTauEvent.useThresholdsPID ? countPVGTelmupiAlt == 2 : countPVGTselected == 2); + bool isElEl = (cutTauEvent.useThresholdsPID ? countPVGTelectronsAlt == 2 : countPVGTelectrons == 2); bool isElMuPion = (cutTauEvent.useThresholdsPID ? (countPVGTelectronsAlt == 1 && countPVGTmupionsAlt == 1) : ((countPVGTelectrons == 1 && countPVGTmuons == 1) || (countPVGTelectrons == 1 && countPVGTpions == 1))); if (isTwoSelectedTracks && doTwoTracks) { TLorentzVector daug[2]; @@ -2069,7 +1786,35 @@ struct UpcTauRl { daug[1].SetPxPyPzE(trkDaug2.px(), trkDaug2.py(), trkDaug2.pz(), energy(MassPionCharged, trkDaug2.px(), trkDaug2.py(), trkDaug2.pz())); } if (trkDaug1.hasTPC() && trkDaug2.hasTPC()) { - + if (isMC && isElEl) { + if (daug[0].P() > daug[1].P()) { + histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTPCsignalVsLP"))->Fill(daug[0].P(), trkDaug1.tpcSignal()); + histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTPCsignalVsOP"))->Fill(daug[1].P(), trkDaug2.tpcSignal()); + histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTPCnSigmaVsLP"))->Fill(daug[0].P(), trkDaug1.tpcNSigmaEl()); + histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTPCnSigmaVsOP"))->Fill(daug[1].P(), trkDaug2.tpcNSigmaEl()); + if (trkDaug1.hasTOF()) { + histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTOFsignalVsLP"))->Fill(daug[0].P(), trkDaug1.tofSignal()); + histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTOFnSigmaVsLP"))->Fill(daug[0].P(), trkDaug1.tofNSigmaEl()); + } + if (trkDaug2.hasTOF()) { + histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTOFsignalVsOP"))->Fill(daug[1].P(), trkDaug2.tofSignal()); + histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTOFnSigmaVsOP"))->Fill(daug[1].P(), trkDaug2.tofNSigmaEl()); + } + } else { + histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTPCsignalVsOP"))->Fill(daug[0].P(), trkDaug1.tpcSignal()); + histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTPCsignalVsLP"))->Fill(daug[1].P(), trkDaug2.tpcSignal()); + histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTPCnSigmaVsOP"))->Fill(daug[0].P(), trkDaug1.tpcNSigmaEl()); + histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTPCnSigmaVsLP"))->Fill(daug[1].P(), trkDaug2.tpcNSigmaEl()); + if (trkDaug1.hasTOF()) { + histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTOFsignalVsOP"))->Fill(daug[0].P(), trkDaug1.tofSignal()); + histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTOFnSigmaVsOP"))->Fill(daug[0].P(), trkDaug1.tofNSigmaEl()); + } + if (trkDaug2.hasTOF()) { + histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTOFsignalVsLP"))->Fill(daug[1].P(), trkDaug2.tofSignal()); + histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTOFnSigmaVsLP"))->Fill(daug[1].P(), trkDaug2.tofNSigmaEl()); + } + } + } if (isMC && isElMuPion) { int pid = 0; if (trkDaug1.has_udMcParticle()) { @@ -2263,146 +2008,268 @@ struct UpcTauRl { histos.get(HIST("Events/Truth/hChannels"))->Fill(CH_SIXPI); } - void processDataDG(FullUDCollision const& reconstructedCollision, + template + void fillMixedEventHistograms(Ts const& reconstructedBarrelTracks) + { + TLorentzVector mother, daug[2]; + for (int idx = 0; idx < static_cast(vecMixElEl.size()); idx++) { + for (int cnt = 0; cnt < 5; cnt++) { + std::random_device rand_dev; + std::mt19937 generator(rand_dev()); + std::uniform_int_distribution distr(0, static_cast(vecMixElEl.size())); + int idx2 = distr(generator); + while (idx == idx2) + idx2 = distr(generator); + const auto& trkDaug1 = reconstructedBarrelTracks.iteratorAt(vecMixElEl[idx].first); + const auto& trkDaug2 = reconstructedBarrelTracks.iteratorAt(vecMixElEl[idx2].second); + daug[0].SetPxPyPzE(trkDaug1.px(), trkDaug1.py(), trkDaug1.pz(), energy(MassElectron, trkDaug1.px(), trkDaug1.py(), trkDaug1.pz())); + daug[1].SetPxPyPzE(trkDaug2.px(), trkDaug2.py(), trkDaug2.pz(), energy(MassElectron, trkDaug2.px(), trkDaug2.py(), trkDaug2.pz())); + mother = daug[0] + daug[1]; + const auto acoplanarity = calculateAcoplanarity(daug[0].Phi(), daug[1].Phi()); + const auto collinearity = calculateCollinearity(daug[0].Eta(), daug[1].Eta(), daug[0].Phi(), daug[1].Phi()); + histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hInvariantMass"))->Fill(mother.M()); + histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hInvariantMassWide"))->Fill(mother.M()); + histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hAcoplanarity"))->Fill(acoplanarity); + histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hCollinearity"))->Fill(collinearity); + histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hMotherP"))->Fill(mother.P()); + histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hMotherPwide"))->Fill(mother.P()); + histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hMotherPt"))->Fill(mother.Pt()); + histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hMotherPhi"))->Fill(mother.Phi()); + histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hMotherRapidity"))->Fill(mother.Rapidity()); + histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hMotherMassVsPt"))->Fill(mother.M(), mother.Pt()); + histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hDaughtersP"))->Fill(daug[0].P(), daug[1].P()); + histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hDaughtersPwide"))->Fill(daug[0].P(), daug[1].P()); + histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hDaughtersPt"))->Fill(daug[0].Pt(), daug[1].Pt()); + histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hDaughtersPhi"))->Fill(daug[0].Phi(), daug[1].Phi()); + histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hDaughtersPtvsModPhi"))->Fill(daug[0].P(), getPhiModN(daug[0].Phi(), trkDaug1.sign(), 1)); + histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hDaughtersPtvsModPhi"))->Fill(daug[1].P(), getPhiModN(daug[1].Phi(), trkDaug2.sign(), 1)); + histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hDaughtersRapidity"))->Fill(daug[0].Rapidity(), daug[1].Rapidity()); + histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingP"))->Fill(((daug[0].P() > daug[1].P()) ? daug[0].P() : daug[1].P())); + histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPwide"))->Fill(((daug[0].P() > daug[1].P()) ? daug[0].P() : daug[1].P())); + histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPt"))->Fill(((daug[0].P() > daug[1].P()) ? daug[0].Pt() : daug[1].Pt())); + histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPhi"))->Fill(((daug[0].P() > daug[1].P()) ? daug[0].Phi() : daug[1].Phi())); + histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingRapidity"))->Fill(((daug[0].P() > daug[1].P()) ? daug[0].Rapidity() : daug[1].Rapidity())); + histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPvsOtherP"))->Fill(((daug[0].P() > daug[1].P()) ? daug[0].P() : daug[1].P()), ((daug[0].P() > daug[1].P()) ? daug[1].P() : daug[0].P())); + histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPwideVsOtherPwide"))->Fill(((daug[0].P() > daug[1].P()) ? daug[0].P() : daug[1].P()), ((daug[0].P() > daug[1].P()) ? daug[1].P() : daug[0].P())); + histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPtVsOtherPt"))->Fill(((daug[0].P() > daug[1].P()) ? daug[0].Pt() : daug[1].Pt()), ((daug[0].P() > daug[1].P()) ? daug[1].Pt() : daug[0].Pt())); + histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPhiVsOtherPhi"))->Fill(((daug[0].P() > daug[1].P()) ? daug[0].Phi() : daug[1].Phi()), ((daug[0].P() > daug[1].P()) ? daug[1].Phi() : daug[0].Phi())); + histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingRapVsOtherRap"))->Fill(((daug[0].P() > daug[1].P()) ? daug[0].Rapidity() : daug[1].Rapidity()), ((daug[0].P() > daug[1].P()) ? daug[1].Rapidity() : daug[0].Rapidity())); + } // cnt + } // idx + + for (int idx = 0; idx < static_cast(vecMixElMupion.size()); idx++) { + for (int cnt = 0; cnt < 5; cnt++) { + std::random_device rand_dev; + std::mt19937 generator(rand_dev()); + std::uniform_int_distribution distr(0, static_cast(vecMixElMupion.size())); + int idx2 = distr(generator); + while (idx == idx2) + idx2 = distr(generator); + const auto& trkDaug1 = reconstructedBarrelTracks.iteratorAt(vecMixElMupion[idx].first); + const auto& trkDaug2 = reconstructedBarrelTracks.iteratorAt(vecMixElMupion[idx2].second); + daug[0].SetPxPyPzE(trkDaug1.px(), trkDaug1.py(), trkDaug1.pz(), energy(MassElectron, trkDaug1.px(), trkDaug1.py(), trkDaug1.pz())); + daug[1].SetPxPyPzE(trkDaug2.px(), trkDaug2.py(), trkDaug2.pz(), energy(MassPionCharged, trkDaug2.px(), trkDaug2.py(), trkDaug2.pz())); + mother = daug[0] + daug[1]; + const auto acoplanarity = calculateAcoplanarity(daug[0].Phi(), daug[1].Phi()); + const auto collinearity = calculateCollinearity(daug[0].Eta(), daug[1].Eta(), daug[0].Phi(), daug[1].Phi()); + const auto& electronPt = daug[0].Pt(); + const auto& electronP = daug[0].P(); + const auto& electronE = daug[0].E(); + const auto& mupionPt = daug[1].Pt(); + const auto& mupionP = daug[1].P(); + const auto& mupionE = daug[1].E(); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hInvariantMass"))->Fill(mother.M()); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hInvariantMassWide"))->Fill(mother.M()); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hAcoplanarity"))->Fill(acoplanarity); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hCollinearity"))->Fill(collinearity); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherP"))->Fill(mother.P()); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherPwide"))->Fill(mother.P()); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherPt"))->Fill(mother.Pt()); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherPhi"))->Fill(mother.Phi()); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherRapidity"))->Fill(mother.Rapidity()); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherMassVsPt"))->Fill(mother.M(), mother.Pt()); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherMassVsElectronP"))->Fill(mother.M(), electronP); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherMassVsAcoplanarity"))->Fill(mother.M(), acoplanarity); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPt"))->Fill(electronPt); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPtWide"))->Fill(electronPt); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersEnergyAsymmetry"))->Fill((daug[0].E() - daug[1].E()) / (daug[0].E() + daug[1].E())); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersMomentaAsymmetry"))->Fill((daug[0].P() - daug[1].P()) / (daug[0].P() + daug[1].P())); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersPtAsymmetry"))->Fill((daug[0].Pt() - daug[1].Pt()) / (daug[0].Pt() + daug[1].Pt())); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersP"))->Fill(daug[0].P(), daug[1].P()); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersPwide"))->Fill(daug[0].P(), daug[1].P()); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersPt"))->Fill(daug[0].Pt(), daug[1].Pt()); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersPhi"))->Fill(daug[0].Phi(), daug[1].Phi()); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersRapidity"))->Fill(daug[0].Rapidity(), daug[1].Rapidity()); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersEnergyFractions"))->Fill(electronE / (electronE + mupionE), mupionE / (electronE + mupionE)); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPvsOtherP"))->Fill(electronP, mupionP); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPwideVsOtherPwide"))->Fill(electronP, mupionP); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPvsAcoplanarity"))->Fill(electronP, acoplanarity); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hOtherPvsAcoplanarity"))->Fill(mupionP, acoplanarity); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPtVsOtherPt"))->Fill(electronPt, mupionPt); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPhiVsOtherPhi"))->Fill(isElectronCandidate(trkDaug1) ? daug[0].Phi() : daug[1].Phi(), isElectronCandidate(trkDaug1) ? daug[1].Phi() : daug[0].Phi()); + histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronRapVsOtherRap"))->Fill(isElectronCandidate(trkDaug1) ? daug[0].Rapidity() : daug[1].Rapidity(), isElectronCandidate(trkDaug1) ? daug[1].Rapidity() : daug[0].Rapidity()); + } // cnt + } // idx + } // end fillMixedEventHistograms + + void processDataDG(FullUDCollisions const& reconstructedCollisions, FullUDTracks const& reconstructedBarrelTracks) { - if (!isGoodROFtime(reconstructedCollision)) - return; + for (const auto& reconstructedCollision : reconstructedCollisions) { + if (!isGoodROFtime(reconstructedCollision)) + return; - if (!isGoodFITtime(reconstructedCollision, cutSample.cutFITtime)) - return; + if (!isGoodFITtime(reconstructedCollision, cutSample.cutFITtime)) + return; - if (cutSample.useNumContribs && (reconstructedCollision.numContrib() != cutSample.cutNumContribs)) - return; + if (cutSample.useNumContribs && (reconstructedCollision.numContrib() != cutSample.cutNumContribs)) + return; - if (cutSample.useRecoFlag && (reconstructedCollision.flags() != cutSample.cutRecoFlag)) - return; + if (cutSample.useRecoFlag && (reconstructedCollision.flags() != cutSample.cutRecoFlag)) + return; - if (doMainHistos) { - fillHistograms(reconstructedBarrelTracks); - fillFIThistograms(reconstructedCollision); + if (doMainHistos) { + fillHistograms(reconstructedBarrelTracks); + fillFIThistograms(reconstructedCollision); + if (doMixedEventsHistos) + fillMixedEventHistograms(reconstructedBarrelTracks); + } + + if (doPIDhistos) + fillPIDhistograms(reconstructedCollision, reconstructedBarrelTracks); } - if (doPIDhistos) - fillPIDhistograms(reconstructedCollision, reconstructedBarrelTracks); } // end processDataDG - void processDataSG(FullSGUDCollision const& reconstructedCollision, + void processDataSG(FullSGUDCollisions const& reconstructedCollisions, FullUDTracks const& reconstructedBarrelTracks) { + for (const auto& reconstructedCollision : reconstructedCollisions) { - int gapSide = reconstructedCollision.gapSide(); - int trueGapSide = sgSelector.trueGap(reconstructedCollision, cutSample.cutTrueGapSideFV0, cutSample.cutTrueGapSideFT0A, cutSample.cutTrueGapSideFT0C, cutSample.cutTrueGapSideZDC); - histos.fill(HIST("Events/UDtableGapSide"), gapSide); - histos.fill(HIST("Events/TrueGapSideDiffToTableValue"), gapSide - trueGapSide); - if (cutSample.useTrueGap) - gapSide = trueGapSide; + int gapSide = reconstructedCollision.gapSide(); + int trueGapSide = sgSelector.trueGap(reconstructedCollision, cutSample.cutTrueGapSideFV0, cutSample.cutTrueGapSideFT0A, cutSample.cutTrueGapSideFT0C, cutSample.cutTrueGapSideZDC); + histos.fill(HIST("Events/UDtableGapSide"), gapSide); + histos.fill(HIST("Events/TrueGapSideDiffToTableValue"), gapSide - trueGapSide); + if (cutSample.useTrueGap) + gapSide = trueGapSide; + + if (!isGoodROFtime(reconstructedCollision)) + return; - if (!isGoodROFtime(reconstructedCollision)) - return; + if (gapSide != cutSample.whichGapSide) + return; - if (gapSide != cutSample.whichGapSide) - return; + if (!isGoodFITtime(reconstructedCollision, cutSample.cutFITtime)) + return; - if (!isGoodFITtime(reconstructedCollision, cutSample.cutFITtime)) - return; + if (cutSample.useNumContribs && (reconstructedCollision.numContrib() != cutSample.cutNumContribs)) + return; - if (cutSample.useNumContribs && (reconstructedCollision.numContrib() != cutSample.cutNumContribs)) - return; + if (cutSample.useRecoFlag && (reconstructedCollision.flags() != cutSample.cutRecoFlag)) + return; - if (cutSample.useRecoFlag && (reconstructedCollision.flags() != cutSample.cutRecoFlag)) - return; + if (doMainHistos) { + fillHistograms(reconstructedBarrelTracks); + fillFIThistograms(reconstructedCollision); + if (doMixedEventsHistos) + fillMixedEventHistograms(reconstructedBarrelTracks); + } - if (doMainHistos) { - fillHistograms(reconstructedBarrelTracks); - fillFIThistograms(reconstructedCollision); + if (doPIDhistos) + fillPIDhistograms(reconstructedCollision, reconstructedBarrelTracks); } - if (doPIDhistos) - fillPIDhistograms(reconstructedCollision, reconstructedBarrelTracks); } // end processDataSG - void processMCrecDG(FullMCUDCollision const& reconstructedCollision, + void processMCrecDG(FullMCUDCollisions const& reconstructedCollisions, FullMCUDTracks const& reconstructedBarrelTracks, aod::UDMcParticles const&) { isMC = true; + for (const auto& reconstructedCollision : reconstructedCollisions) { - if (!isGoodROFtime(reconstructedCollision)) - return; + if (!isGoodROFtime(reconstructedCollision)) + return; - if (!isGoodFITtime(reconstructedCollision, cutSample.cutFITtime)) - return; + if (!isGoodFITtime(reconstructedCollision, cutSample.cutFITtime)) + return; - if (cutSample.useNumContribs && (reconstructedCollision.numContrib() != cutSample.cutNumContribs)) - return; + if (cutSample.useNumContribs && (reconstructedCollision.numContrib() != cutSample.cutNumContribs)) + return; - if (cutSample.useRecoFlag && (reconstructedCollision.flags() != cutSample.cutRecoFlag)) - return; + if (cutSample.useRecoFlag && (reconstructedCollision.flags() != cutSample.cutRecoFlag)) + return; - if (cutSample.applyAcceptanceSelection) { - for (const auto& track : reconstructedBarrelTracks) { - if (!track.isPVContributor()) - continue; - if (std::abs(eta(track.px(), track.py(), track.py())) > cutSample.cutTrackEta) - return; + if (cutSample.applyAcceptanceSelection) { + for (const auto& track : reconstructedBarrelTracks) { + if (!track.isPVContributor()) + continue; + if (std::abs(eta(track.px(), track.py(), track.py())) > cutSample.cutTrackEta) + return; + } } - } - if (doMainHistos) { - fillHistograms(reconstructedBarrelTracks); - fillFIThistograms(reconstructedCollision); - } + if (doMainHistos) { + fillHistograms(reconstructedBarrelTracks); + fillFIThistograms(reconstructedCollision); + if (doMixedEventsHistos) + fillMixedEventHistograms(reconstructedBarrelTracks); + } - if (doPIDhistos) { - fillPIDhistograms(reconstructedCollision, reconstructedBarrelTracks); - fillMCPIDhistograms(reconstructedBarrelTracks); + if (doPIDhistos) { + fillPIDhistograms(reconstructedCollision, reconstructedBarrelTracks); + fillMCPIDhistograms(reconstructedBarrelTracks); + } } } // end processMCrecDG - void processMCrecSG(FullMCSGUDCollision const& reconstructedCollision, + void processMCrecSG(FullMCSGUDCollisions const& reconstructedCollisions, FullMCUDTracks const& reconstructedBarrelTracks, aod::UDMcParticles const&) { isMC = true; + for (const auto& reconstructedCollision : reconstructedCollisions) { - int gapSide = reconstructedCollision.gapSide(); - histos.fill(HIST("Events/UDtableGapSide"), gapSide); + int gapSide = reconstructedCollision.gapSide(); + histos.fill(HIST("Events/UDtableGapSide"), gapSide); - if (gapSide != cutSample.whichGapSide) - return; + if (gapSide != cutSample.whichGapSide) + return; - if (!isGoodROFtime(reconstructedCollision)) - return; + if (!isGoodROFtime(reconstructedCollision)) + return; - if (!isGoodFITtime(reconstructedCollision, cutSample.cutFITtime)) - return; + if (!isGoodFITtime(reconstructedCollision, cutSample.cutFITtime)) + return; - if (cutSample.useNumContribs && (reconstructedCollision.numContrib() != cutSample.cutNumContribs)) - return; + if (cutSample.useNumContribs && (reconstructedCollision.numContrib() != cutSample.cutNumContribs)) + return; - if (cutSample.useRecoFlag && (reconstructedCollision.flags() != cutSample.cutRecoFlag)) - return; + if (cutSample.useRecoFlag && (reconstructedCollision.flags() != cutSample.cutRecoFlag)) + return; - if (cutSample.applyAcceptanceSelection) { - for (const auto& track : reconstructedBarrelTracks) { - if (!track.isPVContributor()) - continue; - if (std::abs(eta(track.px(), track.py(), track.py())) > cutSample.cutTrackEta) - return; + if (cutSample.applyAcceptanceSelection) { + for (const auto& track : reconstructedBarrelTracks) { + if (!track.isPVContributor()) + continue; + if (std::abs(eta(track.px(), track.py(), track.py())) > cutSample.cutTrackEta) + return; + } } - } - if (doMainHistos) { - fillHistograms(reconstructedBarrelTracks); - fillFIThistograms(reconstructedCollision); - } + if (doMainHistos) { + fillHistograms(reconstructedBarrelTracks); + fillFIThistograms(reconstructedCollision); + if (doMixedEventsHistos) + fillMixedEventHistograms(reconstructedBarrelTracks); + } - if (doPIDhistos) { - fillPIDhistograms(reconstructedCollision, reconstructedBarrelTracks); - fillMCPIDhistograms(reconstructedBarrelTracks); + if (doPIDhistos) { + fillPIDhistograms(reconstructedCollision, reconstructedBarrelTracks); + fillMCPIDhistograms(reconstructedBarrelTracks); + } } } // end processMCrecDG From 47afb862c51a3754e59e417a6ed0ed5b69c122fc Mon Sep 17 00:00:00 2001 From: Chiara De Martin <39315597+ChiaraDeMartin95@users.noreply.github.com> Date: Fri, 28 Feb 2025 21:42:48 +0100 Subject: [PATCH 0477/1650] [PWGLF] Apply acceptance correction on the fly for polarization measurement in cascadeflow.cxx (#10258) Co-authored-by: Chiara De Martin --- .../TableProducer/Strangeness/cascadeflow.cxx | 132 +++++++++++++++--- 1 file changed, 112 insertions(+), 20 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/cascadeflow.cxx b/PWGLF/TableProducer/Strangeness/cascadeflow.cxx index bc1c3aa3516..b5c95085c22 100644 --- a/PWGLF/TableProducer/Strangeness/cascadeflow.cxx +++ b/PWGLF/TableProducer/Strangeness/cascadeflow.cxx @@ -30,6 +30,7 @@ #include "PWGLF/DataModel/LFStrangenessTables.h" #include "PWGLF/DataModel/LFStrangenessPIDTables.h" #include "Tools/ML/MlResponse.h" +#include "CCDB/BasicCCDBManager.h" using namespace o2; using namespace o2::framework; @@ -141,7 +142,9 @@ struct cascadeFlow { // THN axes ConfigurableAxis thnConfigAxisFT0C{"thnConfigAxisFT0C", {8, 0, 80}, "FT0C centrality (%)"}; + ConfigurableAxis thnConfigAxisEta{"thnConfigAxisEta", {8, -0.8, 0.8}, "pseudorapidity"}; ConfigurableAxis thnConfigAxisPt{"thnConfigAxisPt", {VARIABLE_WIDTH, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2, 2.25, 2.5, 2.75, 3, 3.5, 4, 5, 6, 8, 10}, "#it{p}_{T} (GeV/#it{c})"}; + ConfigurableAxis thnConfigAxisPtLambda{"thnConfigAxisPtLambda", {VARIABLE_WIDTH, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2, 2.25, 2.5, 2.75, 3, 3.5, 4, 5, 6, 8, 10, 20}, "#it{p}_{T} (GeV/#it{c})"}; ConfigurableAxis thnConfigAxisCharge{"thnConfigAxisCharge", {2, 0, 2}, ""}; ConfigurableAxis thnConfigAxisPsiDiff{"thnConfigAxisPsiDiff", {100, 0, 2 * TMath::Pi()}, ""}; ConfigurableAxis thnConfigAxisMassXi{"thnConfigAxisMassXi", {45, 1.300, 1.345}, ""}; @@ -153,6 +156,7 @@ struct cascadeFlow { ConfigurableAxis thnConfigAxisPzs2Omega{"thnConfigAxiPzs2Omega", {200, -70, 70}, ""}; ConfigurableAxis thnConfigAxisPzs2Lambda{"thnConfigAxiPzs2Lambda", {200, -2, 2}, ""}; ConfigurableAxis thnConfigAxisCos2Theta{"thnConfigAxiCos2Theta", {100, 0, 1}, ""}; + ConfigurableAxis thnConfigAxisCos2ThetaL{"thnConfigAxiCos2ThetaL", {100, 0, 1}, ""}; ConfigurableAxis thnConfigAxisCosThetaXiAlpha{"thnConfigAxisCosThetaXiAlpha", {200, -2.8, 2.8}, ""}; ConfigurableAxis thnConfigAxisCosThetaOmegaAlpha{"thnConfigAxisCosThetaOmegaAlpha", {200, -70, 70}, ""}; ConfigurableAxis thnConfigAxisCosThetaProtonAlpha{"thnConfigAxisCosThetaProtonAlpha", {200, -2, 2}, ""}; @@ -177,6 +181,8 @@ struct cascadeFlow { Configurable MinPt{"MinPt", 0.6, "Min pt of cascade"}; Configurable MaxPt{"MaxPt", 10, "Max pt of cascade"}; + Configurable MinPtLambda{"MinPtLambda", 0.4, "Min pt of daughter lambda"}; + Configurable MaxPtLambda{"MaxPtLambda", 10, "Max pt of daughter lambda"}; Configurable sideBandStart{"sideBandStart", 5, "Start of the sideband region in number of sigmas"}; Configurable sideBandEnd{"sideBandEnd", 7, "End of the sideband region in number of sigmas"}; Configurable downsample{"downsample", 1., "Downsample training output tree"}; @@ -186,6 +192,7 @@ struct cascadeFlow { Configurable mintpccrrows{"mintpccrrows", 70, "mintpccrrows"}; Configurable etaCascMCGen{"etaCascMCGen", 0.8, "etaCascMCGen"}; Configurable etaCasc{"etaCasc", 0.8, "etaCasc"}; + Configurable etaLambdaMax{"etaLambdaMax", 0.8, "etaLambdaMax"}; Configurable yCascMCGen{"yCascMCGen", 0.5, "yCascMCGen"}; Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; @@ -195,6 +202,11 @@ struct cascadeFlow { Configurable> onnxFileNamesOmega{"onnxFileNamesOmega", std::vector{"model_onnx.onnx"}, "ONNX file names for each pT bin (if not from CCDB full path)"}; Configurable timestampCCDB{"timestampCCDB", -1, "timestamp of the ONNX file for ML model used to query in CCDB"}; Configurable loadModelsFromCCDB{"loadModelsFromCCDB", true, "Flag to enable or disable the loading of models from CCDB"}; + Configurable acceptancePathsCCDBXi{"acceptancePathsCCDBXi", "Users/c/chdemart/AcceptanceXi", "Paths of Xi acceptance on CCDB"}; + Configurable acceptancePathsCCDBOmega{"acceptancePathsCCDBOmega", "Users/c/chdemart/AcceptanceOmega", "Paths of Omega acceptance on CCDB"}; + Configurable acceptancePathsCCDBLambda{"acceptancePathsCCDBLambda", "Users/c/chdemart/AcceptanceLambda", "Paths of Lambda acceptance on CCDB"}; + Configurable acceptanceHistoNameCasc{"acceptanceHistoNameCasc", "histoCos2ThetaNoFit2D", "Histo name of acceptance on CCDB"}; + Configurable acceptanceHistoNameLambda{"acceptanceHistoNameLambda", "histoCos2ThetaLambdaFromCNoFit2D", "Histo name of acceptance on CCDB"}; // ML inference Configurable isApplyML{"isApplyML", 1, "Flag to apply ML selections"}; @@ -203,7 +215,11 @@ struct cascadeFlow { Configurable> cutsMl{"cutsMl", {cascade_flow_cuts_ml::cuts[0], cascade_flow_cuts_ml::nBinsPt, cascade_flow_cuts_ml::nCutScores, cascade_flow_cuts_ml::labelsPt, cascade_flow_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; Configurable nClassesMl{"nClassesMl", static_cast(cascade_flow_cuts_ml::nCutScores), "Number of classes in ML model"}; + // acceptance crrection + Configurable applyAcceptanceCorrection{"applyAcceptanceCorrection", false, "apply acceptance correction"}; + o2::ccdb::CcdbApi ccdbApi; + Service ccdb; // Add objects needed for ML inference o2::analysis::MlResponse mlResponseXi; @@ -330,6 +346,11 @@ struct cascadeFlow { return phi; } + // objects to use for acceptance correction + TH2F* hAcceptanceXi; + TH2F* hAcceptanceOmega; + TH2F* hAcceptanceLambda; + HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; HistogramRegistry histosMCGen{"histosMCGen", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; HistogramRegistry resolution{"resolution", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; @@ -434,6 +455,35 @@ struct cascadeFlow { cosThetaStarProton, pdgCode); } + void initAcceptanceFromCCDB() + { + LOG(info) << "Loading acceptance from CCDB "; + TList* listAcceptanceXi = ccdb->get(acceptancePathsCCDBXi); + if (!listAcceptanceXi) + LOG(fatal) << "Problem getting TList object with acceptance for Xi!"; + TList* listAcceptanceOmega = ccdb->get(acceptancePathsCCDBOmega); + if (!listAcceptanceOmega) + LOG(fatal) << "Problem getting TList object with acceptance for Omega!"; + TList* listAcceptanceLambda = ccdb->get(acceptancePathsCCDBLambda); + if (!listAcceptanceLambda) + LOG(fatal) << "Problem getting TList object with acceptance for Lambda!"; + hAcceptanceXi = static_cast(listAcceptanceXi->FindObject(Form("%s", acceptanceHistoNameCasc->data()))); + if (!hAcceptanceXi) { + LOG(fatal) << "The histogram for Xi is not there!"; + } + hAcceptanceXi->SetName("hAcceptanceXi"); + hAcceptanceOmega = static_cast(listAcceptanceOmega->FindObject(Form("%s", acceptanceHistoNameCasc->data()))); + if (!hAcceptanceOmega) { + LOG(fatal) << "The histogram for omega is not there!"; + } + hAcceptanceOmega->SetName("hAcceptanceOmega"); + hAcceptanceLambda = static_cast(listAcceptanceLambda->FindObject(Form("%s", acceptanceHistoNameLambda->data()))); + if (!hAcceptanceLambda) { + LOG(fatal) << "The histogram for Lambda is not there!"; + } + hAcceptanceLambda->SetName("hAcceptanceLambda"); + LOG(info) << "Acceptance now loaded"; + } void init(InitContext const&) { @@ -494,7 +544,9 @@ struct cascadeFlow { histos.add("hv1SP_ZDCA_vs_ZDCC", "hv1SP_ZDCA_vs_ZDCC", HistType::kTH2F, {{100, -1, 1}, {100, -1, 1}}); const AxisSpec thnAxisFT0C{thnConfigAxisFT0C, "FT0C (%)"}; + const AxisSpec thnAxisEta{thnConfigAxisEta, "#eta"}; const AxisSpec thnAxisPt{thnConfigAxisPt, "p_{T}"}; + const AxisSpec thnAxisPtLambda{thnConfigAxisPtLambda, "p_{T, #Lambda}"}; const AxisSpec thnAxisCharge{thnConfigAxisCharge, "Charge"}; const AxisSpec thnAxisPsiDiff{thnConfigAxisPsiDiff, "2(phi-Psi)"}; const AxisSpec thnAxisMassXi{thnConfigAxisMassXi, "inv. mass (#Lambda #pi) (GeV/#it{c}^{2})"}; @@ -506,6 +558,7 @@ struct cascadeFlow { const AxisSpec thnAxisPzs2Omega{thnConfigAxisPzs2Omega, "Pzs2Omega"}; const AxisSpec thnAxisPzs2Lambda{thnConfigAxisPzs2Lambda, "Pzs2Lambda"}; const AxisSpec thnAxisCos2Theta{thnConfigAxisCos2Theta, "Cos2Theta"}; + const AxisSpec thnAxisCos2ThetaL{thnConfigAxisCos2ThetaL, "Cos2ThetaL"}; const AxisSpec thnAxisCosThetaXiAlpha{thnConfigAxisCosThetaXiAlpha, "CosThetaXiWithAlpha"}; const AxisSpec thnAxisCosThetaOmegaAlpha{thnConfigAxisCosThetaOmegaAlpha, "CosThetaOmegaWithAlpha"}; const AxisSpec thnAxisCosThetaProtonAlpha{thnConfigAxisCosThetaProtonAlpha, "CosThetaProtonWithAlpha"}; @@ -514,27 +567,31 @@ struct cascadeFlow { histos.add("hXiV2", "THn for v2 of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisV2}); histos.add("hXiPzs2", "THn for Pzs2 of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisPzs2Xi}); histos.add("hXiPzs2FromLambda", "THn for Pzs2 of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisPzs2Lambda}); - histos.add("hXiCos2Theta", "THn for Cos2Theta of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCos2Theta}); - histos.add("hXiCos2ThetaFromLambda", "THn for Cos2Theta of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCos2Theta}); + histos.add("hXiCos2Theta", "THn for Cos2Theta of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCos2Theta}); + histos.add("hXiCos2ThetaFromLambda", "THn for Cos2Theta of Lambda vs Xi mass and pt", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCos2Theta}); + histos.add("hXiCos2ThetaFromLambdaL", "THn for Cos2Theta of Lambda vs Lambda mass and pt", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPtLambda, thnAxisMassLambda, thnAxisBDTScore, thnAxisCos2ThetaL}); } if (isFillTHNXi_PzVsPsi) { histos.add("hXiPzVsPsi", "THn for cosTheta of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCosThetaXiAlpha, thnAxisPsiDiff}); histos.add("hXiPzVsPsiFromLambda", "THn for cosTheta of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCosThetaProtonAlpha, thnAxisPsiDiff}); - histos.add("hXiCos2ThetaVsPsi", "THn for cos2Theta of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCos2Theta, thnAxisPsiDiff}); - histos.add("hXiCos2ThetaVsPsiFromLambda", "THn for cos2Theta of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCos2Theta, thnAxisPsiDiff}); + histos.add("hXiCos2ThetaVsPsi", "THn for cos2Theta of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCos2Theta, thnAxisPsiDiff}); + histos.add("hXiCos2ThetaVsPsiFromLambda", "THn for cos2Theta of Lambda vs Xi mass and pt", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCos2Theta, thnAxisPsiDiff}); + histos.add("hXiCos2ThetaVsPsiFromLambdaL", "THn for cos2Theta of Lambda vs Lambda mass and pt", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPtLambda, thnAxisMassLambda, thnAxisBDTScore, thnAxisCos2ThetaL, thnAxisPsiDiff}); } if (isFillTHNOmega) { histos.add("hOmegaV2", "THn for v2 of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisV2}); histos.add("hOmegaPzs2", "THn for Pzs2 of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisPzs2Omega}); histos.add("hOmegaPzs2FromLambda", "THn for Pzs2 of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisPzs2Lambda}); - histos.add("hOmegaCos2Theta", "THn for Cos2Theta of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCos2Theta}); - histos.add("hOmegaCos2ThetaFromLambda", "THn for Cos2Theta of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCos2Theta}); + histos.add("hOmegaCos2Theta", "THn for Cos2Theta of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCos2Theta}); + histos.add("hOmegaCos2ThetaFromLambda", "THn for Cos2Theta of Lambda vs Omega mass and pt", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCos2Theta}); + histos.add("hOmegaCos2ThetaFromLambdaL", "THn for Cos2Theta of Lambda vs Lambda mass and pt", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPtLambda, thnAxisMassLambda, thnAxisBDTScore, thnAxisCos2ThetaL}); } if (isFillTHNOmega_PzVsPsi) { histos.add("hOmegaPzVsPsi", "THn for cosTheta of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCosThetaOmegaAlpha, thnAxisPsiDiff}); histos.add("hOmegaPzVsPsiFromLambda", "THn for cosTheta of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCosThetaProtonAlpha, thnAxisPsiDiff}); - histos.add("hOmegaCos2ThetaVsPsi", "THn for cos2Theta of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCos2Theta, thnAxisPsiDiff}); - histos.add("hOmegaCos2ThetaVsPsiFromLambda", "THn for cos2Theta of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCos2Theta, thnAxisPsiDiff}); + histos.add("hOmegaCos2ThetaVsPsi", "THn for cos2Theta of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCos2Theta, thnAxisPsiDiff}); + histos.add("hOmegaCos2ThetaVsPsiFromLambda", "THn for cos2Theta of Lambda vs Omega mass and pt", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCos2Theta, thnAxisPsiDiff}); + histos.add("hOmegaCos2ThetaVsPsiFromLambdaL", "THn for cos2Theta of Lambda vs Lambda mass and pt", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPtLambda, thnAxisMassLambda, thnAxisBDTScore, thnAxisCos2ThetaL, thnAxisPsiDiff}); } histosMCGen.add("h2DGenXiEta08", "h2DGenXiEta08", HistType::kTH2F, {{100, 0, 100}, {400, 0, 20}}); @@ -578,6 +635,13 @@ struct cascadeFlow { mlResponseXi.init(); mlResponseOmega.init(); } + if (applyAcceptanceCorrection) { + ccdb->setURL(ccdbUrl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setFatalWhenNull(false); + initAcceptanceFromCCDB(); + } } void processTrainingBackground(soa::Join::iterator const& coll, soa::Join const& Cascades, DauTracks const&) @@ -744,7 +808,7 @@ struct cascadeFlow { float massCasc[2]{casc.mXi(), casc.mOmega()}; - // inv mass loose cut + // pt cut if (casc.pt() < MinPt || casc.pt() > MaxPt) { continue; } @@ -805,14 +869,38 @@ struct cascadeFlow { auto boostedLambda{cascadeBoost(lambdaVector)}; cosThetaStarLambda[i] = boostedLambda.Pz() / boostedLambda.P(); } + + double ptLambda = sqrt(pow(casc.pxlambda(), 2) + pow(casc.pylambda(), 2)); + auto etaLambda = RecoDecay::eta(std::array{casc.pxlambda(), casc.pylambda(), casc.pzlambda()}); + + // acceptance values if requested + double MeanCos2ThetaLambdaFromXi = 1; + double MeanCos2ThetaLambdaFromOmega = 1; + double MeanCos2ThetaProtonFromLambda = 1; + if (applyAcceptanceCorrection) { + if (ptLambda < MinPtLambda || ptLambda > MaxPtLambda) { + continue; + } + if (std::abs(casc.eta()) > etaCasc) + continue; + if (std::abs(etaLambda) > etaLambdaMax) + continue; + int bin2DXi = hAcceptanceXi->FindBin(casc.pt(), casc.eta()); + int bin2DOmega = hAcceptanceOmega->FindBin(casc.pt(), casc.eta()); + int bin2DLambda = hAcceptanceXi->FindBin(ptLambda, etaLambda); + MeanCos2ThetaLambdaFromXi = hAcceptanceXi->GetBinContent(bin2DXi); + MeanCos2ThetaLambdaFromOmega = hAcceptanceOmega->GetBinContent(bin2DOmega); + MeanCos2ThetaProtonFromLambda = hAcceptanceLambda->GetBinContent(bin2DLambda); + } + int ChargeIndex = 0; if (casc.sign() > 0) ChargeIndex = 1; - double Pzs2Xi = cosThetaStarLambda[0] * std::sin(2 * (casc.phi() - PsiT0C)) / cascadev2::AlphaXi[ChargeIndex]; - double Pzs2Omega = cosThetaStarLambda[1] * std::sin(2 * (casc.phi() - PsiT0C)) / cascadev2::AlphaOmega[ChargeIndex]; + double Pzs2Xi = cosThetaStarLambda[0] * std::sin(2 * (casc.phi() - PsiT0C)) / cascadev2::AlphaXi[ChargeIndex] / MeanCos2ThetaLambdaFromXi; + double Pzs2Omega = cosThetaStarLambda[1] * std::sin(2 * (casc.phi() - PsiT0C)) / cascadev2::AlphaOmega[ChargeIndex] / MeanCos2ThetaLambdaFromOmega; double Cos2ThetaXi = cosThetaStarLambda[0] * cosThetaStarLambda[0]; double Cos2ThetaOmega = cosThetaStarLambda[1] * cosThetaStarLambda[1]; - double Pzs2LambdaFromCasc = cosThetaStarProton * std::sin(2 * (casc.phi() - PsiT0C)) / cascadev2::AlphaLambda[ChargeIndex]; + double Pzs2LambdaFromCasc = cosThetaStarProton * std::sin(2 * (casc.phi() - PsiT0C)) / cascadev2::AlphaLambda[ChargeIndex] / MeanCos2ThetaProtonFromLambda; double Cos2ThetaLambda = cosThetaStarProton * cosThetaStarProton; double CosThetaXiWithAlpha = cosThetaStarLambda[0] / cascadev2::AlphaXi[ChargeIndex]; @@ -846,27 +934,31 @@ struct cascadeFlow { histos.get(HIST("hXiV2"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], v2CEP); histos.get(HIST("hXiPzs2"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], Pzs2Xi); histos.get(HIST("hXiPzs2FromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], Pzs2LambdaFromCasc); - histos.get(HIST("hXiCos2Theta"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], Cos2ThetaXi); - histos.get(HIST("hXiCos2ThetaFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], Cos2ThetaLambda); + histos.get(HIST("hXiCos2Theta"))->Fill(coll.centFT0C(), ChargeIndex, casc.eta(), casc.pt(), casc.mXi(), BDTresponse[0], Cos2ThetaXi); + histos.get(HIST("hXiCos2ThetaFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.eta(), casc.pt(), casc.mXi(), BDTresponse[0], Cos2ThetaLambda); + histos.get(HIST("hXiCos2ThetaFromLambdaL"))->Fill(coll.centFT0C(), ChargeIndex, etaLambda, ptLambda, casc.mLambda(), BDTresponse[0], Cos2ThetaLambda); } if (isFillTHNXi_PzVsPsi) { histos.get(HIST("hXiPzVsPsi"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], CosThetaXiWithAlpha, 2 * cascminuspsiT0C); histos.get(HIST("hXiPzVsPsiFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], CosThetaProtonWithAlpha, 2 * cascminuspsiT0C); - histos.get(HIST("hXiCos2ThetaVsPsi"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], Cos2ThetaXi, 2 * cascminuspsiT0C); - histos.get(HIST("hXiCos2ThetaVsPsiFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], Cos2ThetaLambda, 2 * cascminuspsiT0C); + histos.get(HIST("hXiCos2ThetaVsPsi"))->Fill(coll.centFT0C(), ChargeIndex, casc.eta(), casc.pt(), casc.mXi(), BDTresponse[0], Cos2ThetaXi, 2 * cascminuspsiT0C); + histos.get(HIST("hXiCos2ThetaVsPsiFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.eta(), casc.pt(), casc.mXi(), BDTresponse[0], Cos2ThetaLambda, 2 * cascminuspsiT0C); + histos.get(HIST("hXiCos2ThetaVsPsiFromLambdaL"))->Fill(coll.centFT0C(), ChargeIndex, etaLambda, ptLambda, casc.mLambda(), BDTresponse[0], Cos2ThetaLambda, 2 * cascminuspsiT0C); } if (isFillTHNOmega) { histos.get(HIST("hOmegaV2"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[1], v2CEP); histos.get(HIST("hOmegaPzs2"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[1], Pzs2Omega); histos.get(HIST("hOmegaPzs2FromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[1], Pzs2LambdaFromCasc); - histos.get(HIST("hOmegaCos2Theta"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[1], Cos2ThetaOmega); - histos.get(HIST("hOmegaCos2ThetaFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[1], Cos2ThetaLambda); + histos.get(HIST("hOmegaCos2Theta"))->Fill(coll.centFT0C(), ChargeIndex, casc.eta(), casc.pt(), casc.mOmega(), BDTresponse[1], Cos2ThetaOmega); + histos.get(HIST("hOmegaCos2ThetaFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.eta(), casc.pt(), casc.mOmega(), BDTresponse[1], Cos2ThetaLambda); + histos.get(HIST("hOmegaCos2ThetaFromLambdaL"))->Fill(coll.centFT0C(), ChargeIndex, etaLambda, ptLambda, casc.mLambda(), BDTresponse[1], Cos2ThetaLambda); } if (isFillTHNOmega_PzVsPsi) { histos.get(HIST("hOmegaPzVsPsi"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[0], CosThetaOmegaWithAlpha, 2 * cascminuspsiT0C); histos.get(HIST("hOmegaPzVsPsiFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[0], CosThetaProtonWithAlpha, 2 * cascminuspsiT0C); - histos.get(HIST("hOmegaCos2ThetaVsPsi"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[0], Cos2ThetaOmega, 2 * cascminuspsiT0C); - histos.get(HIST("hOmegaCos2ThetaVsPsiFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[0], Cos2ThetaLambda, 2 * cascminuspsiT0C); + histos.get(HIST("hOmegaCos2ThetaVsPsi"))->Fill(coll.centFT0C(), ChargeIndex, casc.eta(), casc.pt(), casc.mOmega(), BDTresponse[0], Cos2ThetaOmega, 2 * cascminuspsiT0C); + histos.get(HIST("hOmegaCos2ThetaVsPsiFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.eta(), casc.pt(), casc.mOmega(), BDTresponse[0], Cos2ThetaLambda, 2 * cascminuspsiT0C); + histos.get(HIST("hOmegaCos2ThetaVsPsiFromLambdaL"))->Fill(coll.centFT0C(), ChargeIndex, etaLambda, ptLambda, casc.mLambda(), BDTresponse[0], Cos2ThetaLambda, 2 * cascminuspsiT0C); } } From a76a478a853c5e5db0cb87ce51eb5b4cea96b9f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Fri, 28 Feb 2025 22:33:02 +0100 Subject: [PATCH 0478/1650] [PWGCF] Linter fixes (#10245) --- PWGCF/Femto3D/Core/femto3dPairTask.h | 37 +++++++++++++++++++--------- 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/PWGCF/Femto3D/Core/femto3dPairTask.h b/PWGCF/Femto3D/Core/femto3dPairTask.h index 2b8941262a5..5627215ea55 100755 --- a/PWGCF/Femto3D/Core/femto3dPairTask.h +++ b/PWGCF/Femto3D/Core/femto3dPairTask.h @@ -16,7 +16,7 @@ #ifndef PWGCF_FEMTO3D_CORE_FEMTO3DPAIRTASK_H_ #define PWGCF_FEMTO3D_CORE_FEMTO3DPAIRTASK_H_ -#define THETA(eta) 2.0 * atan(exp(-eta)) +#define THETA(eta) 2.0 * std::atan(std::exp(-eta)) // #include "Framework/ASoA.h" // #include "Framework/DataTypes.h" // #include "Framework/AnalysisDataModel.h" @@ -30,15 +30,28 @@ #include "TVector3.h" #include "TDatabasePDG.h" +#include "CommonConstants/PhysicsConstants.h" #include "CommonConstants/MathConstants.h" -double particle_mass(int PDGcode) +double particle_mass(const int PDGcode) { - // if(PDGcode == 2212) return TDatabasePDG::Instance()->GetParticle(2212)->Mass(); - if (PDGcode == 1000010020) - return 1.87561294257; - else - return TDatabasePDG::Instance()->GetParticle(PDGcode)->Mass(); + switch (std::abs(PDGcode)) { + case o2::constants::physics::kDeuteron: + return o2::constants::physics::MassDeuteron; + case o2::constants::physics::kTriton: + return o2::constants::physics::MassTriton; + case o2::constants::physics::kHelium3: + return o2::constants::physics::MassHelium3; + case 211: + return o2::constants::physics::MassPionCharged; + case 321: + return o2::constants::physics::MassKaonCharged; + case 2212: + return o2::constants::physics::MassProton; + default: + break; + } + return TDatabasePDG::Instance()->GetParticle(PDGcode)->Mass(); } // for the variable binning in 3D DCA histos in the PairMC task @@ -72,7 +85,7 @@ inline std::unique_ptr calc_var_bins(const int& N, const float& xmax, bins[N - 1] = xmax; for (int i = 1; i < 0.5 * N - 1; i++) { - bin_edge += winit * pow(q, i); + bin_edge += winit * std::pow(q, i); bins[0.5 * N - 1 - i] = -bin_edge; bins[0.5 * N + i] = bin_edge; } @@ -295,9 +308,9 @@ float FemtoPair::GetAvgSep() const float res = 0.0; for (const auto& radius : TPCradii) { - const float dRtrans = 2.0 * radius * sin(0.5 * GetPhiStarDiff(radius)); - const float dRlong = 2.0 * radius * sin(0.5 * dtheta); - res += sqrt(dRtrans * dRtrans + dRlong * dRlong); + const float dRtrans = 2.0 * radius * std::sin(0.5 * GetPhiStarDiff(radius)); + const float dRlong = 2.0 * radius * std::sin(0.5 * dtheta); + res += std::sqrt(dRtrans * dRtrans + dRlong * dRlong); } return 100.0 * res / TPCradii.size(); @@ -315,7 +328,7 @@ float FemtoPair::GetAvgPhiStarDiff() const for (const auto& radius : TPCradii) { const float dphi = GetPhiStarDiff(radius); - res += fabs(dphi) > o2::constants::math::PI ? (1.0 - 2.0 * o2::constants::math::PI / fabs(dphi)) * dphi : dphi; + res += std::fabs(dphi) > o2::constants::math::PI ? (1.0 - 2.0 * o2::constants::math::PI / std::fabs(dphi)) * dphi : dphi; } return res / TPCradii.size(); From 7b971b2572bcb2802264161069b3b1c1e6a08fe7 Mon Sep 17 00:00:00 2001 From: Preet-Bhanjan Date: Fri, 28 Feb 2025 22:48:56 +0100 Subject: [PATCH 0479/1650] [PWGCF] Added weights for the particles and flow for the resonances (#10250) Co-authored-by: Preet Pati --- PWGCF/Flow/Tasks/flowPbpbPikp.cxx | 169 +++++++++++++++++++++---- PWGCF/Flow/Tasks/resonancesGfwFlow.cxx | 130 ++++++++++++++----- 2 files changed, 243 insertions(+), 56 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowPbpbPikp.cxx b/PWGCF/Flow/Tasks/flowPbpbPikp.cxx index 634dec537f4..e76754a837e 100644 --- a/PWGCF/Flow/Tasks/flowPbpbPikp.cxx +++ b/PWGCF/Flow/Tasks/flowPbpbPikp.cxx @@ -19,6 +19,7 @@ #include #include #include +#include #include "Math/Vector4D.h" @@ -75,7 +76,8 @@ struct FlowPbpbPikp { O2_DEFINE_CONFIGURABLE(cfgUseNch, bool, false, "Use Nch for flow observables") O2_DEFINE_CONFIGURABLE(cfgNbootstrap, int, 10, "Number of subsamples") O2_DEFINE_CONFIGURABLE(cfgFillWeights, bool, true, "Fill NUA weights") - O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeights, bool, false, "Fill and output NUA weights") + O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeights, bool, true, "Fill and output NUA weights") + O2_DEFINE_CONFIGURABLE(cfgOutputRunByRun, bool, true, "Fill and output NUA weights run by run") O2_DEFINE_CONFIGURABLE(cfgEfficiency, std::string, "", "CCDB path to efficiency object") O2_DEFINE_CONFIGURABLE(cfgAcceptance, std::string, "", "CCDB path to acceptance object") O2_DEFINE_CONFIGURABLE(cfgTpcNsigmaCut, float, 2.0f, "TPC N-sigma cut for pions, kaons, protons") @@ -107,6 +109,20 @@ struct FlowPbpbPikp { TAxis* fPtAxis; TRandom3* fRndm = new TRandom3(0); + std::map>> th3sList; + enum OutputSpecies { + hRef = 0, + hCharge, + hPion, + hKaon, + hProton, + kCount_OutputSpecies + }; + int lastRunNumer = -1; + std::vector runNumbers; + std::vector mAcceptance; + bool correctionsLoaded = false; + void init(InitContext const&) { ccdb->setURL(ccdbUrl.value); @@ -130,6 +146,13 @@ struct FlowPbpbPikp { histos.add("c24_gap08_pr", "", {HistType::kTProfile, {axisMultiplicity}}); histos.add("TofTpcNsigma", "", {HistType::kTHnSparseD, {{axisParticles, axisNsigmaTPC, axisNsigmaTOF, axisPt}}}); histos.add("partCount", "", {HistType::kTHnSparseD, {{axisParticles, axisMultiplicity, axisPt}}}); + if (cfgOutputNUAWeights && !cfgOutputRunByRun) { + histos.add("NUA/hPhiEtaVtxz_ref", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); + histos.add("NUA/hPhiEtaVtxz_ch", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); + histos.add("NUA/hPhiEtaVtxz_pi", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); + histos.add("NUA/hPhiEtaVtxz_ka", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); + histos.add("NUA/hPhiEtaVtxz_pr", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); + } o2::framework::AxisSpec axis = axisPt; int nPtBins = axis.binEdges.size() - 1; @@ -296,10 +319,10 @@ struct FlowPbpbPikp { void fillProfile(const GFW::CorrConfig& corrconf, const ConstStr& tarName, const double& cent) { double dnx, val; - dnx = fGFW->Calculate(corrconf, 0, kTRUE).real(); - if (dnx == 0) - return; if (!corrconf.pTDif) { + dnx = fGFW->Calculate(corrconf, 0, kTRUE).real(); + if (dnx == 0) + return; val = fGFW->Calculate(corrconf, 0, kFALSE).real() / dnx; if (std::fabs(val) < 1) histos.fill(tarName, cent, val, dnx); @@ -319,11 +342,11 @@ struct FlowPbpbPikp { void fillFC(const GFW::CorrConfig& corrconf, const double& cent, const double& rndm) { double dnx, val; - dnx = fGFW->Calculate(corrconf, 0, kTRUE).real(); - if (dnx == 0) { - return; - } if (!corrconf.pTDif) { + dnx = fGFW->Calculate(corrconf, 0, kTRUE).real(); + if (dnx == 0) { + return; + } val = fGFW->Calculate(corrconf, 0, kFALSE).real() / dnx; if (std::fabs(val) < 1) { fFC->FillProfile(corrconf.Head.c_str(), cent, val, dnx, rndm); @@ -341,6 +364,80 @@ struct FlowPbpbPikp { return; } + void createRunByRunHistos(int runNumber) + { + if (cfgOutputNUAWeights) { + std::vector> tH3s(kCount_OutputSpecies); + tH3s[hRef] = histos.add(Form("NUA/%d/hPhiEtaVtxz_ref", runNumber), ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); + tH3s[hCharge] = histos.add(Form("NUA/%d/hPhiEtaVtxz_ch", runNumber), ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); + tH3s[hPion] = histos.add(Form("NUA/%d/hPhiEtaVtxz_pi", runNumber), ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); + tH3s[hKaon] = histos.add(Form("NUA/%d/hPhiEtaVtxz_ka", runNumber), ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); + tH3s[hProton] = histos.add(Form("NUA/%d/hPhiEtaVtxz_pr", runNumber), ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); + th3sList.insert(std::make_pair(runNumber, tH3s)); + } + } + + void loadCorrections(aod::BCsWithTimestamps::iterator const& bc) + { + if (correctionsLoaded) + return; + if (!cfgAcceptance.value.empty()) { + uint64_t timestamp = bc.timestamp(); + mAcceptance.clear(); + mAcceptance.resize(kCount_OutputSpecies); + mAcceptance.push_back(ccdb->getForTimeStamp(cfgAcceptance.value + "_ref", timestamp)); + mAcceptance.push_back(ccdb->getForTimeStamp(cfgAcceptance.value + "_ch", timestamp)); + mAcceptance.push_back(ccdb->getForTimeStamp(cfgAcceptance.value + "_pi", timestamp)); + mAcceptance.push_back(ccdb->getForTimeStamp(cfgAcceptance.value + "_ka", timestamp)); + mAcceptance.push_back(ccdb->getForTimeStamp(cfgAcceptance.value + "_pr", timestamp)); + } + + correctionsLoaded = true; + } + + template + double getAcceptance(TTrack track, const double& vtxz, int index) + { // 0 ref, 1 ch, 2 pi, 3 ka, 4 pr + double wacc = 1; + if (!mAcceptance.empty()) + wacc = mAcceptance[index]->getNUA(track.phi(), track.eta(), vtxz); + return wacc; + } + + template + void fillWeights(const TTrack track, const double vtxz, const int& pid_index, const int& run) + { + double pt = track.pt(); + bool withinPtPOI = (cfgCutPtPOIMin < pt) && (pt < cfgCutPtPOIMax); // within POI pT range + bool withinPtRef = (cfgCutPtMin < pt) && (pt < cfgCutPtMax); // within RF pT range + + if (cfgOutputRunByRun) { + if (withinPtRef && !pid_index) + th3sList[run][hRef]->Fill(track.phi(), track.eta(), vtxz); // pt-subset of charged particles for ref flow + if (withinPtPOI) + th3sList[run][hCharge + pid_index]->Fill(track.phi(), track.eta(), vtxz); // charged and id'ed particle weights + } else { + if (withinPtRef && !pid_index) + histos.fill(HIST("NUA/hPhiEtaVtxz_ref"), track.phi(), track.eta(), vtxz); // pt-subset of charged particles for ref flow + if (withinPtPOI) { + switch (pid_index) { + case 0: + histos.fill(HIST("NUA/hPhiEtaVtxz_ch"), track.phi(), track.eta(), vtxz); // charged particle weights + break; + case 1: + histos.fill(HIST("NUA/hPhiEtaVtxz_pi"), track.phi(), track.eta(), vtxz); // pion weights + break; + case 2: + histos.fill(HIST("NUA/hPhiEtaVtxz_ka"), track.phi(), track.eta(), vtxz); // kaon weights + break; + case 3: + histos.fill(HIST("NUA/hPhiEtaVtxz_pr"), track.phi(), track.eta(), vtxz); // proton weights + break; + } + } + } + } + void process(AodCollisions::iterator const& collision, aod::BCsWithTimestamps const&, AodTracksWithoutBayes const& tracks) { int nTot = tracks.size(); @@ -352,13 +449,23 @@ struct FlowPbpbPikp { float lRandom = fRndm->Rndm(); float vtxz = collision.posZ(); const auto cent = collision.centFT0C(); + auto bc = collision.bc_as(); + int runNumber = bc.runNumber(); + if (cfgOutputRunByRun && runNumber != lastRunNumer) { + lastRunNumer = runNumber; + if (std::find(runNumbers.begin(), runNumbers.end(), runNumber) == runNumbers.end()) { + // if run number is not in the preconfigured list, create new output histograms for this run + createRunByRunHistos(runNumber); + runNumbers.push_back(runNumber); + } + } histos.fill(HIST("hVtxZ"), vtxz); histos.fill(HIST("hMult"), nTot); histos.fill(HIST("hCent"), collision.centFT0C()); fGFW->Clear(); - float weff = 1, wacc = 1; + float weff = 1; int pidIndex; for (auto const& track : tracks) { @@ -376,38 +483,48 @@ struct FlowPbpbPikp { // pidIndex = getBayesPIDIndex(track); pidIndex = getNsigmaPID(track); + if (cfgOutputNUAWeights) + fillWeights(track, vtxz, pidIndex, runNumber); + + if (!withinPtPOI && !withinPtRef) + return; + double waccRef = getAcceptance(track, vtxz, 0); + double waccPOI = withinPtPOI ? getAcceptance(track, vtxz, pidIndex + 1) : getAcceptance(track, vtxz, 0); + if (withinPtRef && withinPtPOI && pidIndex) + waccRef = waccPOI; // if particle is both (then it's overlap), override ref with POI + if (withinPtRef) { - fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), wacc * weff, 1); - fGFW->Fill(track.eta(), 1, track.phi(), wacc * weff, 512); + fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), waccRef * weff, 1); + fGFW->Fill(track.eta(), 1, track.phi(), waccRef * weff, 512); } if (withinPtPOI) { - fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), wacc * weff, 128); - fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), wacc * weff, 1024); + fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), waccPOI * weff, 128); + fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), waccPOI * weff, 1024); } if (withinPtPOI && withinPtRef) { - fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), wacc * weff, 256); - fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), wacc * weff, 2048); + fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), waccPOI * weff, 256); + fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), waccPOI * weff, 2048); } if (pidIndex) { histos.fill(HIST("partCount"), pidIndex - 1, cent, pt); if (withinPtPOI) - fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), wacc * weff, 1 << (pidIndex)); + fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), waccPOI * weff, 1 << (pidIndex)); if (withinPtPOI && withinPtRef) - fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), wacc * weff, 1 << (pidIndex + 3)); + fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), waccPOI * weff, 1 << (pidIndex + 3)); } } // track loop ends // Filling cumulants with ROOT TProfile - fillProfile(corrconfigs.at(0), HIST("c22_gap08"), cent); - fillProfile(corrconfigs.at(1), HIST("c22_gap08_pi"), cent); - fillProfile(corrconfigs.at(2), HIST("c22_gap08_ka"), cent); - fillProfile(corrconfigs.at(3), HIST("c22_gap08_pr"), cent); - fillProfile(corrconfigs.at(4), HIST("c24_full"), cent); - fillProfile(corrconfigs.at(5), HIST("c24_gap08"), cent); - fillProfile(corrconfigs.at(6), HIST("c24_gap08_pi"), cent); - fillProfile(corrconfigs.at(7), HIST("c24_gap08_ka"), cent); - fillProfile(corrconfigs.at(8), HIST("c24_gap08_pr"), cent); + fillProfile(corrconfigs.at(1), HIST("c22_gap08"), cent); + fillProfile(corrconfigs.at(2), HIST("c22_gap08_pi"), cent); + fillProfile(corrconfigs.at(3), HIST("c22_gap08_ka"), cent); + fillProfile(corrconfigs.at(4), HIST("c22_gap08_pr"), cent); + fillProfile(corrconfigs.at(5), HIST("c24_full"), cent); + fillProfile(corrconfigs.at(6), HIST("c24_gap08"), cent); + fillProfile(corrconfigs.at(7), HIST("c24_gap08_pi"), cent); + fillProfile(corrconfigs.at(8), HIST("c24_gap08_ka"), cent); + fillProfile(corrconfigs.at(9), HIST("c24_gap08_pr"), cent); for (uint l_ind = 0; l_ind < corrconfigs.size(); l_ind++) { fillFC(corrconfigs.at(l_ind), cent, lRandom); diff --git a/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx b/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx index 6662bd389e2..450830bd3e7 100644 --- a/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx +++ b/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx @@ -114,6 +114,10 @@ struct ResonancesGfwFlow { O2_DEFINE_CONFIGURABLE(cfgUseMCCLambda, bool, false, "Use mass cross check for lambda") O2_DEFINE_CONFIGURABLE(cfgUseMCCK0, bool, false, "Use mass cross check for K0") + O2_DEFINE_CONFIGURABLE(cfgNPhiMassBins, int, 70, "Invasriant mass bins for phi") + O2_DEFINE_CONFIGURABLE(cfgNK0MassBins, int, 120, "Invasriant mass bins for K0") + O2_DEFINE_CONFIGURABLE(cfgNLambdaMassBins, int, 70, "Invasriant mass bins for lambda") + // Defining configurable axis ConfigurableAxis axisVertex{"axisVertex", {20, -10, 10}, "vertex axis for histograms"}; ConfigurableAxis axisPhi{"axisPhi", {60, 0.0, constants::math::TwoPI}, "phi axis for histograms"}; @@ -197,29 +201,36 @@ struct ResonancesGfwFlow { histos.add("Phic22", "", {HistType::kTProfile, {axisMultiplicity}}); histos.add("Phic24", "", {HistType::kTProfile, {axisMultiplicity}}); - histos.add("Phiv22pt", "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); - histos.add("Phiv24pt", "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); + histos.add("Phiv22pt", "", {HistType::kTProfile3D, {{axisPt, axisPhiMass, axisMultiplicity}}}); + histos.add("Phiv24pt", "", {HistType::kTProfile3D, {{axisPt, axisPhiMass, axisMultiplicity}}}); + + histos.add("K0c22", "", {HistType::kTProfile, {axisMultiplicity}}); + histos.add("K0c24", "", {HistType::kTProfile, {axisMultiplicity}}); + histos.add("K0v22pt", "", {HistType::kTProfile3D, {{axisPt, axisK0Mass, axisMultiplicity}}}); + histos.add("K0v24pt", "", {HistType::kTProfile3D, {{axisPt, axisK0Mass, axisMultiplicity}}}); + + histos.add("Lambdac22", "", {HistType::kTProfile, {axisMultiplicity}}); + histos.add("Lambdac24", "", {HistType::kTProfile, {axisMultiplicity}}); + histos.add("Lambdav22pt", "", {HistType::kTProfile3D, {{axisPt, axisLambdaMass, axisMultiplicity}}}); + histos.add("Lambdav24pt", "", {HistType::kTProfile3D, {{axisPt, axisLambdaMass, axisMultiplicity}}}); + + histos.add("AnLambdac22", "", {HistType::kTProfile, {axisMultiplicity}}); + histos.add("AnLambdac24", "", {HistType::kTProfile, {axisMultiplicity}}); + histos.add("AnLambdav22pt", "", {HistType::kTProfile3D, {{axisPt, axisLambdaMass, axisMultiplicity}}}); + histos.add("AnLambdav24pt", "", {HistType::kTProfile3D, {{axisPt, axisLambdaMass, axisMultiplicity}}}); o2::framework::AxisSpec axis = axisPt; int nPtBins = axis.binEdges.size() - 1; double* ptBins = &(axis.binEdges)[0]; fPtAxis = new TAxis(nPtBins, ptBins); - o2::framework::AxisSpec axisPhisMass = axisPhiMass; - int nPhiMassBins = axisPhisMass.binEdges.size() - 1; - double* phiMassBins = &(axisPhisMass.binEdges)[0]; - fPhiMassAxis = new TAxis(nPhiMassBins, phiMassBins); - int nPhisPtMassBins = nPtBins * nPhiMassBins; + fPhiMassAxis = new TAxis(cfgNPhiMassBins, 0.99, 1.06); + fK0MassAxis = new TAxis(cfgNK0MassBins, 0.44, 0.56); + fLambdaMassAxis = new TAxis(cfgNLambdaMassBins, 1.08, 1.15); - o2::framework::AxisSpec axisK0sMass = axisK0Mass; - int nK0MassBins = axisK0sMass.binEdges.size() - 1; - double* k0MassBins = &(axisK0sMass.binEdges)[0]; - fK0MassAxis = new TAxis(nK0MassBins, k0MassBins); - - o2::framework::AxisSpec axisLambdasMass = axisLambdaMass; - int nLambdaMassBins = axisLambdasMass.binEdges.size() - 1; - double* lambdaMassBins = &(axisLambdasMass.binEdges)[0]; - fLambdaMassAxis = new TAxis(nLambdaMassBins, lambdaMassBins); + int nPhisPtMassBins = nPtBins * cfgNPhiMassBins; + int nK0sPtMassBins = nPtBins * cfgNK0MassBins; + int nLambdasPtMassBins = nPtBins * cfgNLambdaMassBins; //********** Defining the regions ********** // reference particles @@ -230,21 +241,44 @@ struct ResonancesGfwFlow { fGFW->AddRegion("poiNphi", -0.8, -0.4, 1 + nPhisPtMassBins, 2); fGFW->AddRegion("olNphi", -0.8, -0.4, 1 + nPhisPtMassBins, 32); + // kshort + fGFW->AddRegion("poiNk0", -0.8, -0.4, 1 + nK0sPtMassBins, 4); + fGFW->AddRegion("olNk0", -0.8, -0.4, 1 + nK0sPtMassBins, 64); + + // lambda + fGFW->AddRegion("poiNlam", -0.8, -0.4, 1 + nLambdasPtMassBins, 8); + fGFW->AddRegion("olNlam", -0.8, -0.4, 1 + nLambdasPtMassBins, 128); + + // antilambda + fGFW->AddRegion("poiNantilam", -0.8, -0.4, 1 + nLambdasPtMassBins, 16); + fGFW->AddRegion("olNantilam", -0.8, -0.4, 1 + nLambdasPtMassBins, 256); + //********** Defining the correlations ********** // reference particles corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Phi08Gap22", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Ks08Gap22", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Lam08Gap22", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "AnLam08Gap22", kFALSE)); corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2 2} refP08 {-2 -2}", "Phi08Gap24", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2 2} refP08 {-2 -2}", "Ks08Gap24", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2 2} refP08 {-2 -2}", "Lam08Gap24", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2 2} refP08 {-2 -2}", "AnLam08Gap24", kFALSE)); // pt differential pois corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2} refP08 {-2}", "Phi08Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2} refP08 {-2}", "Ks08Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2} refP08 {-2}", "Lam08Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2} refP08 {-2}", "AnLam08Gap22", kTRUE)); corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2 2} refP08 {-2 -2}", "Phi08Gap24", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2 2} refP08 {-2 -2}", "Ks08Gap24", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2 2} refP08 {-2 -2}", "Lam08Gap24", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2 2} refP08 {-2 -2}", "AnLam08Gap24", kTRUE)); fGFW->CreateRegions(); } - // This function is specific for Phi flow: will be made more generic in further iterations template - void fillResoProfile(const GFW::CorrConfig& corrconf, const ConstStr& tarName, const double& cent) + void fillResoProfile(const GFW::CorrConfig& corrconf, const ConstStr& tarName, const double& cent, TAxis* partaxis) { double dnx, val; if (!corrconf.pTDif) { @@ -257,13 +291,13 @@ struct ResonancesGfwFlow { return; } for (int i = 1; i <= fPtAxis->GetNbins(); i++) { - for (int j = 1; j <= fPhiMassAxis->GetNbins(); j++) { - dnx = fGFW->Calculate(corrconf, ((i - 1) * fPhiMassAxis->GetNbins()) + (j - 1), kTRUE).real(); + for (int j = 1; j <= partaxis->GetNbins(); j++) { + dnx = fGFW->Calculate(corrconf, ((i - 1) * partaxis->GetNbins()) + (j - 1), kTRUE).real(); if (dnx == 0) continue; - val = fGFW->Calculate(corrconf, ((i - 1) * fPhiMassAxis->GetNbins()) + (j - 1), kFALSE).real() / dnx; + val = fGFW->Calculate(corrconf, ((i - 1) * partaxis->GetNbins()) + (j - 1), kFALSE).real() / dnx; if (std::fabs(val) < 1) - histos.fill(tarName, fPtAxis->GetBinCenter(i), fPhiMassAxis->GetBinCenter(j), cent, val, dnx); + histos.fill(tarName, fPtAxis->GetBinCenter(i), partaxis->GetBinCenter(j), cent, val, dnx); } } return; @@ -336,7 +370,7 @@ struct ResonancesGfwFlow { } template - void resurrectPhi(TTrack trackplus, TTrack trackminus, vector plusdaug, vector minusdaug, vector mom, double plusmass, const ConstStr& hist, const double cent, float weff, float wacc) + void resurrectPhi(TTrack trackplus, TTrack trackminus, vector plusdaug, vector minusdaug, vector mom, double plusmass, const ConstStr& hist, const double cent) { for (auto const& [partplus, partminus] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(trackplus, trackminus))) { if (getNsigmaPID(partplus) != 2) @@ -370,9 +404,9 @@ struct ResonancesGfwFlow { histos.fill(HIST("hPhiEta"), mom.Eta()); if (withinPtPOI) - fGFW->Fill(mom.Eta(), ((fPtAxis->FindBin(pt) - 1) * fPhiMassAxis->GetNbins()) + (fPhiMassAxis->FindBin(invMass) - 1), mom.Phi(), wacc * weff, 2); + fGFW->Fill(mom.Eta(), ((fPtAxis->FindBin(pt) - 1) * fPhiMassAxis->GetNbins()) + (fPhiMassAxis->FindBin(invMass) - 1), mom.Phi(), 1.0, 2); if (withinPtPOI && withinPtRef) - fGFW->Fill(mom.Eta(), ((fPtAxis->FindBin(pt) - 1) * fPhiMassAxis->GetNbins()) + (fPhiMassAxis->FindBin(invMass) - 1), mom.Phi(), wacc * weff, 32); + fGFW->Fill(mom.Eta(), ((fPtAxis->FindBin(pt) - 1) * fPhiMassAxis->GetNbins()) + (fPhiMassAxis->FindBin(invMass) - 1), mom.Phi(), 1.0, 32); } } return; @@ -459,7 +493,15 @@ struct ResonancesGfwFlow { if (cfgUseMCCLambda && std::abs(massK0Short - 0.497614) < 0.01) return false; + bool withinPtPOI = (cfgCutPtPOIMin < candidate.pt()) && (candidate.pt() < cfgCutPtPOIMax); // within POI pT range + bool withinPtRef = (cfgCutPtMin < candidate.pt()) && (candidate.pt() < cfgCutPtMax); + if (isL) { + if (withinPtPOI) + fGFW->Fill(candidate.eta(), ((fPtAxis->FindBin(candidate.pt()) - 1) * fLambdaMassAxis->GetNbins()) + (fLambdaMassAxis->FindBin(mlambda) - 1), candidate.phi(), 1.0, 8); + if (withinPtPOI && withinPtRef) + fGFW->Fill(candidate.eta(), ((fPtAxis->FindBin(candidate.pt()) - 1) * fLambdaMassAxis->GetNbins()) + (fLambdaMassAxis->FindBin(mlambda) - 1), candidate.phi(), 1.0, 128); + histos.fill(HIST("hLambdaMass_sparse"), mlambda, candidate.pt(), collision.centFT0C()); histos.fill(HIST("hLambdaPhi"), candidate.phi()); histos.fill(HIST("hLambdaEta"), candidate.eta()); @@ -469,6 +511,11 @@ struct ResonancesGfwFlow { histos.fill(HIST("MinusTOF_L"), negtrack.pt(), negtrack.tofNSigmaKa()); } if (isAL) { + if (withinPtPOI) + fGFW->Fill(candidate.eta(), ((fPtAxis->FindBin(candidate.pt()) - 1) * fLambdaMassAxis->GetNbins()) + (fLambdaMassAxis->FindBin(mantilambda) - 1), candidate.phi(), 1.0, 16); + if (withinPtPOI && withinPtRef) + fGFW->Fill(candidate.eta(), ((fPtAxis->FindBin(candidate.pt()) - 1) * fLambdaMassAxis->GetNbins()) + (fLambdaMassAxis->FindBin(mantilambda) - 1), candidate.phi(), 1.0, 256); + histos.fill(HIST("hAntiLambdaMass_sparse"), mantilambda, candidate.pt(), collision.centFT0C()); histos.fill(HIST("hAntiLambdaPhi"), candidate.phi()); histos.fill(HIST("hAntiLambdaEta"), candidate.eta()); @@ -527,6 +574,14 @@ struct ResonancesGfwFlow { if (cfgUseMCCK0 && std::abs(massK0Short - 1.11568) < 0.005) return false; + bool withinPtPOI = (cfgCutPtPOIMin < candidate.pt()) && (candidate.pt() < cfgCutPtPOIMax); // within POI pT range + bool withinPtRef = (cfgCutPtMin < candidate.pt()) && (candidate.pt() < cfgCutPtMax); + + if (withinPtPOI) + fGFW->Fill(candidate.eta(), ((fPtAxis->FindBin(candidate.pt()) - 1) * fK0MassAxis->GetNbins()) + (fK0MassAxis->FindBin(mk0) - 1), candidate.phi(), 1.0, 4); + if (withinPtPOI && withinPtRef) + fGFW->Fill(candidate.eta(), ((fPtAxis->FindBin(candidate.pt()) - 1) * fK0MassAxis->GetNbins()) + (fK0MassAxis->FindBin(mk0) - 1), candidate.phi(), 1.0, 64); + histos.fill(HIST("hK0Mass_sparse"), mk0, candidate.pt(), collision.centFT0C()); histos.fill(HIST("hK0Phi"), candidate.phi()); histos.fill(HIST("hK0Eta"), candidate.eta()); @@ -575,7 +630,7 @@ struct ResonancesGfwFlow { auto posSlicedTracks = posTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); auto negSlicedTracks = negTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - resurrectPhi(posSlicedTracks, negSlicedTracks, kaonPlus, kaonMinus, phiMom, massKaPlus, HIST("hPhiMass_sparse"), cent, weff, wacc); + resurrectPhi(posSlicedTracks, negSlicedTracks, kaonPlus, kaonMinus, phiMom, massKaPlus, HIST("hPhiMass_sparse"), cent); for (auto const& v0s : V0s) { if (selectionLambda(collision, v0s) == true) @@ -585,10 +640,25 @@ struct ResonancesGfwFlow { } // End of v0 loop - fillResoProfile(corrconfigs.at(0), HIST("Phic22"), cent); - fillResoProfile(corrconfigs.at(1), HIST("Phic24"), cent); - fillResoProfile(corrconfigs.at(2), HIST("Phiv22pt"), cent); - fillResoProfile(corrconfigs.at(3), HIST("Phiv24pt"), cent); + fillResoProfile(corrconfigs.at(0), HIST("Phic22"), cent, fPhiMassAxis); + fillResoProfile(corrconfigs.at(1), HIST("K0c22"), cent, fK0MassAxis); + fillResoProfile(corrconfigs.at(2), HIST("Lambdac22"), cent, fLambdaMassAxis); + fillResoProfile(corrconfigs.at(3), HIST("AnLambdac22"), cent, fLambdaMassAxis); + + fillResoProfile(corrconfigs.at(4), HIST("Phic24"), cent, fPhiMassAxis); + fillResoProfile(corrconfigs.at(5), HIST("K0c24"), cent, fK0MassAxis); + fillResoProfile(corrconfigs.at(6), HIST("Lambdac24"), cent, fLambdaMassAxis); + fillResoProfile(corrconfigs.at(7), HIST("AnLambdac24"), cent, fLambdaMassAxis); + + fillResoProfile(corrconfigs.at(8), HIST("Phiv22pt"), cent, fPhiMassAxis); + fillResoProfile(corrconfigs.at(9), HIST("K0v22pt"), cent, fK0MassAxis); + fillResoProfile(corrconfigs.at(10), HIST("Lambdav22pt"), cent, fLambdaMassAxis); + fillResoProfile(corrconfigs.at(11), HIST("AnLambdav22pt"), cent, fLambdaMassAxis); + + fillResoProfile(corrconfigs.at(12), HIST("Phiv24pt"), cent, fPhiMassAxis); + fillResoProfile(corrconfigs.at(13), HIST("K0v24pt"), cent, fK0MassAxis); + fillResoProfile(corrconfigs.at(14), HIST("Lambdav24pt"), cent, fLambdaMassAxis); + fillResoProfile(corrconfigs.at(15), HIST("AnLambdav24pt"), cent, fLambdaMassAxis); } // end of process }; From cb7839d957792d04434993ecf128f16b80188845 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Fri, 28 Feb 2025 22:50:59 +0100 Subject: [PATCH 0480/1650] [PWGLF] Add THnsparse for MC related flow study (#10260) --- PWGLF/Tasks/Resonances/phipbpb.cxx | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/PWGLF/Tasks/Resonances/phipbpb.cxx b/PWGLF/Tasks/Resonances/phipbpb.cxx index 7782885a042..fe0d3f178e1 100644 --- a/PWGLF/Tasks/Resonances/phipbpb.cxx +++ b/PWGLF/Tasks/Resonances/phipbpb.cxx @@ -255,6 +255,9 @@ struct phipbpb { // weight histos.add("hSparsePhiMCGenWeight", "hSparsePhiMCGenWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, thnAxisPt, {8, -0.8, 0.8}}); histos.add("hSparsePhiMCRecWeight", "hSparsePhiMCRecWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, thnAxisPt, {8, -0.8, 0.8}}); + histos.add("hSparsePhiMCGenKaonWeight", "hSparsePhiMCGenKaonWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); + histos.add("hSparsePhiMCRecKaonWeight", "hSparsePhiMCRecKaonWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); + histos.add("hSparsePhiMCRecKaonMissMatchWeight", "hSparsePhiMCRecKaonMissMatchWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); histos.add("hImpactParameter", "Impact parameter", kTH1F, {{200, 0.0f, 20.0f}}); histos.add("hEventPlaneAngle", "hEventPlaneAngle", kTH1F, {{200, -2.0f * TMath::Pi(), 2.0f * TMath::Pi()}}); @@ -1038,13 +1041,15 @@ struct phipbpb { return; } for (auto& RecCollision : RecCollisions) { - auto psiFT0C = evPhi; - if (!RecCollision.sel8()) { + auto psiFT0C = TrueCollision.eventPlaneAngle(); + /* + if (!RecCollision.sel8()) { continue; } if (!RecCollision.selection_bit(aod::evsel::kNoITSROFrameBorder)) { - continue; + continue; } + */ if (TMath::Abs(RecCollision.posZ()) > cfgCutVertex) { continue; } @@ -1055,6 +1060,16 @@ struct phipbpb { if (!track1.has_mcParticle()) { continue; } + + const auto mctrack1 = track1.mcParticle(); + + if (selectionTrack(track1) && selectionPIDpTdependent(track1) && TMath::Abs(mctrack1.pdgCode()) == 321 && mctrack1.isPhysicalPrimary()) { + histos.fill(HIST("hSparsePhiMCRecKaonWeight"), centclass, GetPhiInRange(mctrack1.phi() - psiFT0C), TMath::Power(TMath::Cos(2.0 * GetPhiInRange(mctrack1.phi() - psiFT0C)), 2.0), mctrack1.pt(), mctrack1.eta()); + } + + if (selectionTrack(track1) && track1.pt() > 0.5 && track1.hasTOF() && TMath::Abs(track1.tofNSigmaKa()) > nsigmaCutTOF && TMath::Abs(track1.tpcNSigmaKa()) < nsigmaCutTPC && TMath::Abs(mctrack1.pdgCode()) == 321 && mctrack1.isPhysicalPrimary()) { + histos.fill(HIST("hSparsePhiMCRecKaonMissMatchWeight"), centclass, GetPhiInRange(mctrack1.phi() - psiFT0C), TMath::Power(TMath::Cos(2.0 * GetPhiInRange(mctrack1.phi() - psiFT0C)), 2.0), mctrack1.pt(), mctrack1.eta()); + } auto track1ID = track1.index(); for (auto track2 : Rectrackspart) { if (!track2.has_mcParticle()) { @@ -1064,7 +1079,6 @@ struct phipbpb { if (track2ID <= track1ID) { continue; } - const auto mctrack1 = track1.mcParticle(); const auto mctrack2 = track2.mcParticle(); int track1PDG = TMath::Abs(mctrack1.pdgCode()); int track2PDG = TMath::Abs(mctrack2.pdgCode()); @@ -1109,6 +1123,11 @@ struct phipbpb { } // loop over generated particle for (auto& mcParticle : GenParticles) { + if (TMath::Abs(mcParticle.eta()) > 0.8) // main acceptance + continue; + if (TMath::Abs(mcParticle.pdgCode()) == 321 && mcParticle.isPhysicalPrimary()) { + histos.fill(HIST("hSparsePhiMCGenKaonWeight"), centclass, GetPhiInRange(mcParticle.phi() - psiFT0C), TMath::Power(TMath::Cos(2.0 * GetPhiInRange(mcParticle.phi() - psiFT0C)), 2.0), mcParticle.pt(), mcParticle.eta()); + } if (TMath::Abs(mcParticle.y()) > confRapidity) { continue; } From 87c26fa281998abe5b0ea091b05e7656b36a6065 Mon Sep 17 00:00:00 2001 From: Lars <146946151+ljoergen@users.noreply.github.com> Date: Fri, 28 Feb 2025 22:58:00 +0100 Subject: [PATCH 0481/1650] [PWGLF] AngularCorrelationsInJets.cxx: added MC rec process using jet tables (#10254) Co-authored-by: ALICE Action Bot --- .../Nuspex/AngularCorrelationsInJets.cxx | 365 ++++++++++++------ 1 file changed, 241 insertions(+), 124 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/AngularCorrelationsInJets.cxx b/PWGLF/Tasks/Nuspex/AngularCorrelationsInJets.cxx index de3097a0e40..b70cc853e5c 100644 --- a/PWGLF/Tasks/Nuspex/AngularCorrelationsInJets.cxx +++ b/PWGLF/Tasks/Nuspex/AngularCorrelationsInJets.cxx @@ -32,6 +32,7 @@ #include "PWGJE/Core/JetDerivedDataUtilities.h" #include "PWGJE/DataModel/JetReducedData.h" #include "PWGJE/DataModel/Jet.h" +#include "PWGJE/Core/FastJetUtilities.h" #include "fastjet/PseudoJet.hh" #include "fastjet/AreaDefinition.hh" @@ -130,6 +131,8 @@ struct AngularCorrelationsInJets { Configurable useRejectionCut{"useRejectionCut", true, "use nsigmaRejection"}; Configurable nsigmaRejection{"nsigmaRejection", 1.0, "reject tracks with nsigma < nsigmaRejection for >1 species"}; Configurable deuteronAnalysis{"deuteronAnalysis", true, "true [false]: analyse (anti)deuterons [(anti)helium-3]"}; + Configurable measureYields{"measureYields", true, "measure yields"}; + Configurable measureCorrelations{"measureCorrelations", true, "measure correlations"}; Configurable trackBufferSize{"trackBufferSize", 200, "Number of mixed-event tracks being stored"}; @@ -142,13 +145,18 @@ struct AngularCorrelationsInJets { using FullTracksRun2 = soa::Join; + using FullTracksRun3old = soa::Join; using FullTracksRun3 = soa::Join; using McTracksRun2 = soa::Join; - using McTracksRun3 = soa::Join; - using JTracksRun3 = soa::Join; + using McTracksRun3old = soa::Join; + using McTracksRun3 = soa::Join; + using JetMcTracks = soa::Join; + using JetTracksRun3 = soa::Join; using BCsWithRun2Info = soa::Join; using McCollisions = soa::Join; @@ -159,14 +167,13 @@ struct AngularCorrelationsInJets { nabs(aod::track::eta) < maxEta && aod::track::pt > minTrackPt); // add more preliminary cuts to filter if possible Filter collisionFilter = (nabs(aod::jcollision::posZ) < zVtx); - Filter trackCuts = (nabs(aod::jtrack::eta) > maxEta && aod::jtrack::pt > minJetParticlePt); - // Filter partCuts = (aod::jmcparticle::pt >= trackPtMin && aod::jmcparticle::pt < trackPtMax); + Filter jetTrackCuts = (nabs(aod::jtrack::eta) > maxEta && aod::jtrack::pt > minJetParticlePt); Filter jetFilter = (aod::jet::pt >= minJetPt && nabs(aod::jet::eta) < nabs(maxEta - aod::jet::r / 100.f)); Preslice perCollisionFullTracksRun2 = o2::aod::track::collisionId; - Preslice perCollisionFullTracksRun3 = o2::aod::track::collisionId; + Preslice perCollisionFullTracksRun3 = o2::aod::track::collisionId; Preslice perCollisionMcTracksRun2 = o2::aod::track::collisionId; - Preslice perCollisionMcTracksRun3 = o2::aod::track::collisionId; + Preslice perCollisionMcTracksRun3 = o2::aod::track::collisionId; AxisSpecs axisSpecs; @@ -308,8 +315,8 @@ struct AngularCorrelationsInJets { registryQA.add("ptJetPlusUE", "ptJetPlusUE", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); registryQA.add("ptJet", "ptJet", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); registryQA.add("ptUE", "ptUE", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); - registryQA.add("deltaEtadeltaPhiJet", "deltaEtadeltaPhiJet", HistType::kTH2F, {{200, -0.5, 0.5, "#Delta#eta"}, {200, 0, 0.5 * TMath::Pi(), "#Delta#phi"}}); - registryQA.add("deltaEtadeltaPhiUE", "deltaEtadeltaPhiUE", HistType::kTH2F, {{200, -0.5, 0.5, "#Delta#eta"}, {200, 0, 0.5 * TMath::Pi(), "#Delta#phi"}}); + registryQA.add("deltaEtadeltaPhiJet", "deltaEtadeltaPhiJet", HistType::kTH2F, {{200, -0.5, 0.5, "#Delta#eta"}, {200, 0, 0.5 * M_PI, "#Delta#phi"}}); + registryQA.add("deltaEtadeltaPhiUE", "deltaEtadeltaPhiUE", HistType::kTH2F, {{200, -0.5, 0.5, "#Delta#eta"}, {200, 0, 0.5 * M_PI, "#Delta#phi"}}); registryQA.add("deltaJetPt", "deltaJetPt", HistType::kTH1F, {{200, -2, 2, "#Delta#it{p}_{T} (GeV/#it{c})"}}); registryQA.add("nParticlesClusteredInJet", "nParticlesClusteredInJet", HistType::kTH1F, {{50, 0, 50, "#it{N}_{ch}"}}); @@ -348,7 +355,7 @@ struct AngularCorrelationsInJets { track.itsNCls() < minReqClusterITS) { return false; } - if (doprocessRun2 || doprocessMCRun2) { + if (doprocessRun2old || doprocessMCRun2old) { if (!(track.trackType() & o2::aod::track::Run2Track) || !(track.flags() & o2::aod::track::TPCrefit) || !(track.flags() & o2::aod::track::ITSrefit)) { @@ -374,9 +381,9 @@ struct AngularCorrelationsInJets { if (tightCuts) { // for correlation function // DCA - if (TMath::Abs(track.dcaXY()) > protonDCAxyCF) + if (std::abs(track.dcaXY()) > protonDCAxyCF) return false; - if (TMath::Abs(track.dcaZ()) > protonDCAzCF) + if (std::abs(track.dcaZ()) > protonDCAzCF) return false; registryData.fill(HIST("tpcNSigmaProtonCF"), track.pt(), track.tpcNSigmaPr()); @@ -386,30 +393,30 @@ struct AngularCorrelationsInJets { // nsigma if (!track.hasTOF()) return false; - if ((track.pt() < protonTPCTOFpT && (TMath::Abs(track.tpcNSigmaPr()) > protonNsigma)) || - (track.pt() > protonTPCTOFpT && (TMath::Sqrt(track.tpcNSigmaPr() * track.tpcNSigmaPr() + track.tofNSigmaPr() * track.tofNSigmaPr()) > protonNsigma))) + if ((track.pt() < protonTPCTOFpT && (std::abs(track.tpcNSigmaPr()) > protonNsigma)) || + (track.pt() > protonTPCTOFpT && (std::abs(track.tpcNSigmaPr() * track.tpcNSigmaPr() + track.tofNSigmaPr() * track.tofNSigmaPr()) > protonNsigma))) return false; if (useRejectionCut && !singleSpeciesTPCNSigma(track)) return false; } else { // for yields // DCA - if (TMath::Abs(track.dcaXY()) > protonDCAxyYield) + if (std::abs(track.dcaXY()) > protonDCAxyYield) return false; - if (TMath::Abs(track.dcaZ()) > protonDCAzYield) + if (std::abs(track.dcaZ()) > protonDCAzYield) return false; registryData.fill(HIST("tpcNSigmaProton"), track.pt(), track.tpcNSigmaPr()); // TPC - if (track.pt() < protonTPCTOFpT && TMath::Abs(track.tpcNSigmaPr()) > protonTPCnsigmaLowPtYield) + if (track.pt() < protonTPCTOFpT && std::abs(track.tpcNSigmaPr()) > protonTPCnsigmaLowPtYield) return false; - if (track.pt() > protonTPCTOFpT && TMath::Abs(track.tpcNSigmaPr()) > protonTPCnsigmaHighPtYield) + if (track.pt() > protonTPCTOFpT && std::abs(track.tpcNSigmaPr()) > protonTPCnsigmaHighPtYield) return false; // TOF if (track.hasTOF()) { registryData.fill(HIST("tofNSigmaProton"), track.pt(), track.tofNSigmaPr()); - if (track.pt() > protonTPCTOFpT && TMath::Abs(track.tofNSigmaPr()) > protonTOFnsigmaHighPtYield) + if (track.pt() > protonTPCTOFpT && std::abs(track.tofNSigmaPr()) > protonTOFnsigmaHighPtYield) return false; } } @@ -425,9 +432,9 @@ struct AngularCorrelationsInJets { if (tightCuts) { // for correlation function // DCA - if (TMath::Abs(track.dcaXY()) > antiprotonDCAxyCF) + if (std::abs(track.dcaXY()) > antiprotonDCAxyCF) return false; - if (TMath::Abs(track.dcaZ()) > antiprotonDCAzCF) + if (std::abs(track.dcaZ()) > antiprotonDCAzCF) return false; registryData.fill(HIST("tpcNSigmaAntiprotonCF"), track.pt(), track.tpcNSigmaPr()); @@ -437,30 +444,30 @@ struct AngularCorrelationsInJets { // nsigma if (!track.hasTOF()) return false; - if ((track.pt() < antiprotonTPCTOFpT && (TMath::Abs(track.tpcNSigmaPr()) > antiprotonNsigma)) || - (track.pt() > antiprotonTPCTOFpT && (TMath::Sqrt(track.tpcNSigmaPr() * track.tpcNSigmaPr() + track.tofNSigmaPr() * track.tofNSigmaPr()) > antiprotonNsigma))) + if ((track.pt() < antiprotonTPCTOFpT && (std::abs(track.tpcNSigmaPr()) > antiprotonNsigma)) || + (track.pt() > antiprotonTPCTOFpT && (std::abs(track.tpcNSigmaPr() * track.tpcNSigmaPr() + track.tofNSigmaPr() * track.tofNSigmaPr()) > antiprotonNsigma))) return false; if (useRejectionCut && !singleSpeciesTPCNSigma(track)) return false; } else { // for yields // DCA - if (TMath::Abs(track.dcaXY()) > antiprotonDCAxyYield) + if (std::abs(track.dcaXY()) > antiprotonDCAxyYield) return false; - if (TMath::Abs(track.dcaZ()) > antiprotonDCAzYield) + if (std::abs(track.dcaZ()) > antiprotonDCAzYield) return false; registryData.fill(HIST("tpcNSigmaAntiproton"), track.pt(), track.tpcNSigmaPr()); // TPC - if (track.pt() < antiprotonTPCTOFpT && TMath::Abs(track.tpcNSigmaPr()) > antiprotonTPCnsigmaLowPtYield) + if (track.pt() < antiprotonTPCTOFpT && std::abs(track.tpcNSigmaPr()) > antiprotonTPCnsigmaLowPtYield) return false; - if (track.pt() > antiprotonTPCTOFpT && TMath::Abs(track.tpcNSigmaPr()) > antiprotonTPCnsigmaHighPtYield) + if (track.pt() > antiprotonTPCTOFpT && std::abs(track.tpcNSigmaPr()) > antiprotonTPCnsigmaHighPtYield) return false; // TOF if (track.hasTOF()) { registryData.fill(HIST("tofNSigmaAntiproton"), track.pt(), track.tofNSigmaPr()); - if (track.pt() > antiprotonTPCTOFpT && TMath::Abs(track.tofNSigmaPr()) > antiprotonTOFnsigmaHighPtYield) + if (track.pt() > antiprotonTPCTOFpT && std::abs(track.tofNSigmaPr()) > antiprotonTOFnsigmaHighPtYield) return false; } } @@ -475,44 +482,44 @@ struct AngularCorrelationsInJets { return false; if (deuteronAnalysis) { // DCA - if (TMath::Abs(track.dcaXY()) > nucleiDCAxyYield) + if (std::abs(track.dcaXY()) > nucleiDCAxyYield) return false; - if (TMath::Abs(track.dcaZ()) > nucleiDCAzYield) + if (std::abs(track.dcaZ()) > nucleiDCAzYield) return false; registryData.fill(HIST("tpcNSigmaNuclei"), track.pt(), track.tpcNSigmaDe()); // TPC - if (track.pt() < nucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaDe()) > nucleiTPCnsigmaLowPtYield) + if (track.pt() < nucleiTPCTOFpT && std::abs(track.tpcNSigmaDe()) > nucleiTPCnsigmaLowPtYield) return false; - if (track.pt() > nucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaDe()) > nucleiTPCnsigmaHighPtYield) + if (track.pt() > nucleiTPCTOFpT && std::abs(track.tpcNSigmaDe()) > nucleiTPCnsigmaHighPtYield) return false; // TOF if (track.hasTOF()) { registryData.fill(HIST("tofNSigmaNuclei"), track.pt(), track.tofNSigmaDe()); - if (track.pt() > nucleiTPCTOFpT && TMath::Abs(track.tofNSigmaDe()) > nucleiTOFnsigmaHighPtYield) + if (track.pt() > nucleiTPCTOFpT && std::abs(track.tofNSigmaDe()) > nucleiTOFnsigmaHighPtYield) return false; } } else { // DCA - if (TMath::Abs(track.dcaXY()) > nucleiDCAxyYield) + if (std::abs(track.dcaXY()) > nucleiDCAxyYield) return false; - if (TMath::Abs(track.dcaZ()) > nucleiDCAzYield) + if (std::abs(track.dcaZ()) > nucleiDCAzYield) return false; registryData.fill(HIST("tpcNSigmaNuclei"), track.pt(), track.tpcNSigmaHe()); // TPC - if (track.pt() < nucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaHe()) > nucleiTPCnsigmaLowPtYield) + if (track.pt() < nucleiTPCTOFpT && std::abs(track.tpcNSigmaHe()) > nucleiTPCnsigmaLowPtYield) return false; - if (track.pt() > nucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaHe()) > nucleiTPCnsigmaHighPtYield) + if (track.pt() > nucleiTPCTOFpT && std::abs(track.tpcNSigmaHe()) > nucleiTPCnsigmaHighPtYield) return false; // TOF if (track.hasTOF()) { registryData.fill(HIST("tofNSigmaNuclei"), track.pt(), track.tofNSigmaHe()); - if (track.pt() > nucleiTPCTOFpT && TMath::Abs(track.tofNSigmaHe()) > nucleiTOFnsigmaHighPtYield) + if (track.pt() > nucleiTPCTOFpT && std::abs(track.tofNSigmaHe()) > nucleiTOFnsigmaHighPtYield) return false; } } @@ -528,44 +535,44 @@ struct AngularCorrelationsInJets { if (deuteronAnalysis) { // DCA - if (TMath::Abs(track.dcaXY()) > antinucleiDCAxyYield) + if (std::abs(track.dcaXY()) > antinucleiDCAxyYield) return false; - if (TMath::Abs(track.dcaZ()) > antinucleiDCAzYield) + if (std::abs(track.dcaZ()) > antinucleiDCAzYield) return false; registryData.fill(HIST("tpcNSigmaAntinuclei"), track.pt(), track.tpcNSigmaDe()); // TPC - if (track.pt() < antinucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaDe()) > antinucleiTPCnsigmaLowPtYield) + if (track.pt() < antinucleiTPCTOFpT && std::abs(track.tpcNSigmaDe()) > antinucleiTPCnsigmaLowPtYield) return false; - if (track.pt() > antinucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaDe()) > antinucleiTPCnsigmaHighPtYield) + if (track.pt() > antinucleiTPCTOFpT && std::abs(track.tpcNSigmaDe()) > antinucleiTPCnsigmaHighPtYield) return false; // TOF if (track.hasTOF()) { registryData.fill(HIST("tofNSigmaAntinuclei"), track.pt(), track.tofNSigmaDe()); - if (track.pt() > antinucleiTPCTOFpT && TMath::Abs(track.tofNSigmaDe()) > antinucleiTOFnsigmaHighPtYield) + if (track.pt() > antinucleiTPCTOFpT && std::abs(track.tofNSigmaDe()) > antinucleiTOFnsigmaHighPtYield) return false; } } else { // DCA - if (TMath::Abs(track.dcaXY()) > antinucleiDCAxyYield) + if (std::abs(track.dcaXY()) > antinucleiDCAxyYield) return false; - if (TMath::Abs(track.dcaZ()) > antinucleiDCAzYield) + if (std::abs(track.dcaZ()) > antinucleiDCAzYield) return false; registryData.fill(HIST("tpcNSigmaAntinuclei"), track.pt(), track.tpcNSigmaHe()); // TPC - if (track.pt() < antinucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaHe()) > antinucleiTPCnsigmaLowPtYield) + if (track.pt() < antinucleiTPCTOFpT && std::abs(track.tpcNSigmaHe()) > antinucleiTPCnsigmaLowPtYield) return false; - if (track.pt() > antinucleiTPCTOFpT && TMath::Abs(track.tpcNSigmaHe()) > antinucleiTPCnsigmaHighPtYield) + if (track.pt() > antinucleiTPCTOFpT && std::abs(track.tpcNSigmaHe()) > antinucleiTPCnsigmaHighPtYield) return false; // TOF if (track.hasTOF()) { registryData.fill(HIST("tofNSigmaAntinuclei"), track.pt(), track.tofNSigmaHe()); - if (track.pt() > antinucleiTPCTOFpT && TMath::Abs(track.tofNSigmaHe()) > antinucleiTOFnsigmaHighPtYield) + if (track.pt() > antinucleiTPCTOFpT && std::abs(track.tofNSigmaHe()) > antinucleiTOFnsigmaHighPtYield) return false; } } @@ -577,23 +584,23 @@ struct AngularCorrelationsInJets { bool isPion(const T& track) { // DCA - if (TMath::Abs(track.dcaXY()) > pionDCAxy) + if (std::abs(track.dcaXY()) > pionDCAxy) return false; - if (TMath::Abs(track.dcaZ()) > pionDCAz) + if (std::abs(track.dcaZ()) > pionDCAz) return false; registryData.fill(HIST("tpcNSigmaPion"), track.pt(), track.tpcNSigmaStorePi()); // TPC - if (track.pt() < pionTPCTOFpT && TMath::Abs(track.tpcNSigmaStorePi()) > pionTPCnsigmaLowPt) + if (track.pt() < pionTPCTOFpT && std::abs(track.tpcNSigmaStorePi()) > pionTPCnsigmaLowPt) return false; - if (track.pt() > pionTPCTOFpT && TMath::Abs(track.tpcNSigmaStorePi()) > pionTPCnsigmaHighPt) + if (track.pt() > pionTPCTOFpT && std::abs(track.tpcNSigmaStorePi()) > pionTPCnsigmaHighPt) return false; // TOF if (track.hasTOF()) { registryData.fill(HIST("tofNSigmaPion"), track.pt(), track.tofNSigmaStorePi()); - if (track.pt() > pionTPCTOFpT && TMath::Abs(track.tofNSigmaStorePi()) > pionTOFnsigma) + if (track.pt() > pionTPCTOFpT && std::abs(track.tofNSigmaStorePi()) > pionTOFnsigma) return false; } @@ -604,23 +611,23 @@ struct AngularCorrelationsInJets { bool isKaon(const T& track) { // DCA - if (TMath::Abs(track.dcaXY()) > kaonDCAxy) + if (std::abs(track.dcaXY()) > kaonDCAxy) return false; - if (TMath::Abs(track.dcaZ()) > kaonDCAz) + if (std::abs(track.dcaZ()) > kaonDCAz) return false; registryData.fill(HIST("tpcNSigmaKaon"), track.pt(), track.tpcNSigmaStoreKa()); // TPC - if (track.pt() < kaonTPCTOFpT && TMath::Abs(track.tpcNSigmaStoreKa()) > kaonTPCnsigmaLowPt) + if (track.pt() < kaonTPCTOFpT && std::abs(track.tpcNSigmaStoreKa()) > kaonTPCnsigmaLowPt) return false; - if (track.pt() > kaonTPCTOFpT && TMath::Abs(track.tpcNSigmaStoreKa()) > kaonTPCnsigmaHighPt) + if (track.pt() > kaonTPCTOFpT && std::abs(track.tpcNSigmaStoreKa()) > kaonTPCnsigmaHighPt) return false; // TOF if (track.hasTOF()) { registryData.fill(HIST("tofNSigmaKaon"), track.pt(), track.tofNSigmaStoreKa()); - if (track.pt() > kaonTPCTOFpT && TMath::Abs(track.tofNSigmaStoreKa()) > kaonTOFnsigma) + if (track.pt() > kaonTPCTOFpT && std::abs(track.tofNSigmaStoreKa()) > kaonTOFnsigma) return false; } @@ -648,7 +655,7 @@ struct AngularCorrelationsInJets { for (int i = 0; i < static_cast(buffer.size()); i++) { // loop over tracks in buffer if (std::isnan(buffer.at(i).first)) continue; - if (buffer.at(i).first > 2 * TMath::Pi() || buffer.at(i).first < -2 * TMath::Pi()) { + if (buffer.at(i).first > 2 * M_PI || buffer.at(i).first < -2 * M_PI) { registryData.fill(HIST("trackProtocol"), 16); continue; } @@ -656,8 +663,8 @@ struct AngularCorrelationsInJets { double phiToAxis = TVector2::Phi_0_2pi(track.phi() - jetAxis.Phi()); double etaToAxis = track.eta() - jetAxis.Eta(); double DeltaPhi = TVector2::Phi_0_2pi(phiToAxis - buffer.at(i).first); - if (DeltaPhi > (1.5 * TMath::Pi())) { // ensure range of [-pi/2, 3/2 pi] - DeltaPhi = DeltaPhi - 2 * TMath::Pi(); + if (DeltaPhi > (1.5 * M_PI)) { // ensure range of [-pi/2, 3/2 pi] + DeltaPhi = DeltaPhi - 2 * M_PI; } double DeltaEta = etaToAxis - buffer.at(i).second; @@ -699,22 +706,22 @@ struct AngularCorrelationsInJets { continue; double phiToAxis = TVector2::Phi_0_2pi(particleVector.at(i).phi() - jetAxis.Phi()); double etaToAxis = particleVector.at(i).eta() - jetAxis.Eta(); - if (TMath::Abs(particleVector.at(i).phi()) > 2 * TMath::Pi()) { + if (std::abs(particleVector.at(i).phi()) > 2 * M_PI) { registryData.fill(HIST("trackProtocol"), 14); continue; } for (int j = i + 1; j < static_cast(particleVector.size()); j++) { if ((j == static_cast(particleVector.size())) || std::isnan(particleVector.at(j).phi())) continue; - if (TMath::Abs(particleVector.at(j).phi()) > 2 * TMath::Pi()) { + if (std::abs(particleVector.at(j).phi()) > 2 * M_PI) { registryData.fill(HIST("trackProtocol"), 15); continue; } double DeltaPhi = TVector2::Phi_0_2pi(particleVector.at(i).phi() - particleVector.at(j).phi()); double DeltaEta = particleVector.at(i).eta() - particleVector.at(j).eta(); - if (DeltaPhi > (1.5 * TMath::Pi())) { - DeltaPhi = DeltaPhi - 2 * TMath::Pi(); + if (DeltaPhi > (1.5 * M_PI)) { + DeltaPhi = DeltaPhi - 2 * M_PI; } switch (particleType) { case -1: @@ -744,7 +751,7 @@ struct AngularCorrelationsInJets { } } - void doCorrelationsAnti(const auto& particleVector, const auto& particleVectorAnti, const auto& bufferAnti, auto& tempBuffer, const TVector3 jetAxis) + void doCorrelationsAnti(const auto& particleVector, const auto& particleVectorAnti, const auto& bufferAnti, auto& tempBuffer, const TVector3 jetAxis) // correlations between particle/antiparticle { if (std::isnan(jetAxis.Phi())) return; @@ -753,22 +760,22 @@ struct AngularCorrelationsInJets { continue; double phiToAxis = TVector2::Phi_0_2pi(particleVector.at(i).phi() - jetAxis.Phi()); double etaToAxis = particleVector.at(i).eta() - jetAxis.Eta(); - if (TMath::Abs(particleVector.at(i).phi()) > 2 * TMath::Pi()) { + if (std::abs(particleVector.at(i).phi()) > 2 * M_PI) { registryData.fill(HIST("trackProtocol"), 14); continue; } for (int j = 0; j < static_cast(particleVectorAnti.size()); j++) { if (std::isnan(particleVectorAnti.at(j).phi())) continue; - if (TMath::Abs(particleVectorAnti.at(j).phi()) > 2 * TMath::Pi()) { + if (std::abs(particleVectorAnti.at(j).phi()) > 2 * M_PI) { registryData.fill(HIST("trackProtocol"), 15); continue; } double DeltaPhi = TVector2::Phi_0_2pi(particleVector.at(i).phi() - particleVectorAnti.at(j).phi()); double DeltaEta = particleVector.at(i).eta() - particleVectorAnti.at(j).eta(); - if (DeltaPhi > (1.5 * TMath::Pi())) { - DeltaPhi = DeltaPhi - 2 * TMath::Pi(); + if (DeltaPhi > (1.5 * M_PI)) { + DeltaPhi = DeltaPhi - 2 * M_PI; } registryData.fill(HIST("deltaPhiSEProtonAntiproton"), DeltaPhi); registryData.fill(HIST("deltaPhiEtaSEProtonAntiproton"), DeltaPhi, DeltaEta); @@ -786,12 +793,12 @@ struct AngularCorrelationsInJets { double deltaPhi(0); double phi1 = TVector2::Phi_0_2pi(a1); double phi2 = TVector2::Phi_0_2pi(a2); - double diff = TMath::Abs(phi1 - phi2); + double diff = std::abs(phi1 - phi2); - if (diff <= TMath::Pi()) + if (diff <= M_PI) deltaPhi = diff; - if (diff > TMath::Pi()) - deltaPhi = TMath::TwoPi() - diff; + if (diff > M_PI) + deltaPhi = 2 * M_PI - diff; return deltaPhi; } @@ -810,7 +817,7 @@ struct AngularCorrelationsInJets { if (px == 0 && py != 0) { uy = -(pz * pz) / py; - ux = sign * sqrt(py * py - (pz * pz * pz * pz) / (py * py)); + ux = sign * std::abs(py * py - (pz * pz * pz * pz) / (py * py)); uz = pz; u.SetXYZ(ux, uy, uz); return; @@ -820,7 +827,7 @@ struct AngularCorrelationsInJets { if (py == 0 && px != 0) { ux = -(pz * pz) / px; - uy = sign * sqrt(px * px - (pz * pz * pz * pz) / (px * px)); + uy = sign * std::abs(px * px - (pz * pz * pz * pz) / (px * px)); uz = pz; u.SetXYZ(ux, uy, uz); return; @@ -838,7 +845,7 @@ struct AngularCorrelationsInJets { } // Solutions - ux = (-b + sign * sqrt(delta)) / (2.0 * a); + ux = (-b + sign * std::abs(delta)) / (2.0 * a); uy = (-pz * pz - px * ux) / py; uz = pz; u.SetXYZ(ux, uy, uz); @@ -886,10 +893,10 @@ struct AngularCorrelationsInJets { if (std::isnan(constituent.phi()) || std::isnan(jet.phi())) // geometric jet cone continue; double DeltaPhi = TVector2::Phi_0_2pi(constituent.phi() - jet.phi()); - if (DeltaPhi > TMath::Pi()) - DeltaPhi = DeltaPhi - 2 * TMath::Pi(); + if (DeltaPhi > M_PI) + DeltaPhi = DeltaPhi - 2 * M_PI; double DeltaEta = constituent.eta() - jet.eta(); - double Delta = TMath::Sqrt(DeltaPhi * DeltaPhi + DeltaEta * DeltaEta); + double Delta = std::abs(DeltaPhi * DeltaPhi + DeltaEta * DeltaEta); registryQA.fill(HIST("jetConeRadius"), Delta); if (Delta > maxRadius) maxRadius = Delta; @@ -915,13 +922,13 @@ struct AngularCorrelationsInJets { TVector3 particleDir(track.px(), track.py(), track.pz()); double deltaEtaJet = particleDir.Eta() - pJet.Eta(); double deltaPhiJet = getDeltaPhi(particleDir.Phi(), pJet.Phi()); - double deltaRJet = sqrt(deltaEtaJet * deltaEtaJet + deltaPhiJet * deltaPhiJet); + double deltaRJet = std::abs(deltaEtaJet * deltaEtaJet + deltaPhiJet * deltaPhiJet); double deltaEtaUE1 = particleDir.Eta() - UEAxis1.Eta(); double deltaPhiUE1 = getDeltaPhi(particleDir.Phi(), UEAxis1.Phi()); - double deltaRUE1 = sqrt(deltaEtaUE1 * deltaEtaUE1 + deltaPhiUE1 * deltaPhiUE1); + double deltaRUE1 = std::abs(deltaEtaUE1 * deltaEtaUE1 + deltaPhiUE1 * deltaPhiUE1); double deltaEtaUE2 = particleDir.Eta() - UEAxis2.Eta(); double deltaPhiUE2 = getDeltaPhi(particleDir.Phi(), UEAxis2.Phi()); - double deltaRUE2 = sqrt(deltaEtaUE2 * deltaEtaUE2 + deltaPhiUE2 * deltaPhiUE2); + double deltaRUE2 = std::abs(deltaEtaUE2 * deltaEtaUE2 + deltaPhiUE2 * deltaPhiUE2); if (deltaRJet < Rmax) { if (deltaPhiJet != -999) @@ -1128,7 +1135,7 @@ struct AngularCorrelationsInJets { double ghost_area = 0.005; int ghost_repeat = 1; fastjet::JetDefinition jetDef(fastjet::antikt_algorithm, jetR); - fastjet::JetDefinition jetDefBkg(fastjet::kt_algorithm, 0.5); + fastjet::JetDefinition jetDefBkg(fastjet::kt_algorithm, jetR); fastjet::AreaDefinition areaDef(fastjet::active_area, fastjet::GhostedAreaSpec(ghost_maxrap, ghost_repeat, ghost_area)); fastjet::AreaDefinition areaDefBkg(fastjet::active_area_explicit_ghosts, fastjet::GhostedAreaSpec(ghost_maxrap)); fastjet::ClusterSequenceArea clusterSeq(jetInput, jetDef, areaDef); @@ -1218,7 +1225,7 @@ struct AngularCorrelationsInJets { double ghost_area = 0.005; int ghost_repeat = 1; fastjet::JetDefinition jetDef(fastjet::antikt_algorithm, jetR); - fastjet::JetDefinition jetDefBkg(fastjet::kt_algorithm, 0.5); + fastjet::JetDefinition jetDefBkg(fastjet::kt_algorithm, jetR); fastjet::AreaDefinition areaDef(fastjet::active_area, fastjet::GhostedAreaSpec(ghost_maxrap, ghost_repeat, ghost_area)); fastjet::AreaDefinition areaDefBkg(fastjet::active_area_explicit_ghosts, fastjet::GhostedAreaSpec(ghost_maxrap)); fastjet::ClusterSequenceArea clusterSeq(jetInput, jetDef, areaDef); @@ -1282,9 +1289,9 @@ struct AngularCorrelationsInJets { setTrackBuffer(fTempBufferFull, fBufferFull); } - void processRun2(soa::Join const& collisions, - soa::Filtered const& tracks, - BCsWithRun2Info const&) + void processRun2old(soa::Join const& collisions, + soa::Filtered const& tracks, + BCsWithRun2Info const&) { for (const auto& collision : collisions) { auto bc = collision.bc_as(); @@ -1301,10 +1308,10 @@ struct AngularCorrelationsInJets { fillHistograms(slicedTracks); } } - PROCESS_SWITCH(AngularCorrelationsInJets, processRun2, "process Run 2 data", false); + PROCESS_SWITCH(AngularCorrelationsInJets, processRun2old, "process Run 2 data w/o jet tables", false); - void processRun3(soa::Join const& collisions, - soa::Filtered const& tracks) + void processRun3old(soa::Join const& collisions, + soa::Filtered const& tracks) { for (const auto& collision : collisions) { registryData.fill(HIST("eventProtocol"), 0); @@ -1312,7 +1319,7 @@ struct AngularCorrelationsInJets { continue; registryData.fill(HIST("numberOfEvents"), 0); registryData.fill(HIST("eventProtocol"), 1); - if (TMath::Abs(collision.posZ()) > zVtx) + if (std::abs(collision.posZ()) > zVtx) continue; auto slicedTracks = tracks.sliceBy(perCollisionFullTracksRun3, collision.globalIndex()); @@ -1320,10 +1327,12 @@ struct AngularCorrelationsInJets { fillHistograms(slicedTracks); } } - PROCESS_SWITCH(AngularCorrelationsInJets, processRun3, "process Run 3 data", false); + PROCESS_SWITCH(AngularCorrelationsInJets, processRun3old, "process Run 3 data w/o jet tables", false); - // using JetTracksMCDwID = soa::Join; - void processRun3revised(soa::Filtered>::iterator const& collision, soa::Filtered> const& allJets, soa::Filtered const&) // check how to use bkg sub jets --- table or recluster + bkg sub? + void processRun3(soa::Filtered>::iterator const& collision, + soa::Filtered> const& allJets, + soa::Filtered const&, + soa::Filtered const&) { registryData.fill(HIST("eventProtocol"), 0); if (!jetderiveddatautilities::selectCollision(collision, eventSelection)) @@ -1333,6 +1342,8 @@ struct AngularCorrelationsInJets { int jetCounter = 0; for (const auto& jet : allJets) { // loop over jets in event + if (minJetPt < (jet.pt() - collision.rho() * jet.area())) + continue; jetCounter++; std::vector jetProtons; std::vector jetAntiprotons; @@ -1364,7 +1375,8 @@ struct AngularCorrelationsInJets { registryQA.fill(HIST("jetPtVsNumPart"), jet.pt(), jet.tracksIds().size()); registryQA.fill(HIST("maxRadiusVsPt"), jet.pt(), jet.r()); - for (const auto& track : jet.template tracks_as()) { // slice on jets? + for (const auto& jtrack : jet.template tracks_as()) { + const auto& track = jtrack.track_as(); if (!selectTrack(track)) continue; @@ -1386,10 +1398,10 @@ struct AngularCorrelationsInJets { if (!std::isnan(track.phi()) && !std::isnan(jet.phi())) { // geometric jet cone double DeltaPhi = TVector2::Phi_0_2pi(track.phi() - jet.phi()); - if (DeltaPhi > TMath::Pi()) - DeltaPhi = DeltaPhi - 2 * TMath::Pi(); + if (DeltaPhi > M_PI) + DeltaPhi = DeltaPhi - 2 * M_PI; double DeltaEta = track.eta() - jet.eta(); - double Delta = TMath::Sqrt(DeltaPhi * DeltaPhi + DeltaEta * DeltaEta); + double Delta = std::abs(DeltaPhi * DeltaPhi + DeltaEta * DeltaEta); registryQA.fill(HIST("jetConeRadius"), Delta); } @@ -1403,38 +1415,34 @@ struct AngularCorrelationsInJets { if (track.hasTOF()) { registryData.fill(HIST("tofSignal"), track.pt() * track.sign(), track.beta()); } - // double ptDiff = pseudoParticle.pt() - track.pt(); - // registryQA.fill(HIST("ptDiff"), ptDiff); - if (isProton(track, false)) { // collect protons in jet + if (measureYields && isProton(track, false)) { // collect protons in jet registryData.fill(HIST("ptJetProton"), track.pt()); registryQA.fill(HIST("ptJetProtonVsTotalJet"), track.pt(), jet.pt()); registryData.fill(HIST("trackProtocol"), 4); // # protons - if (isProton(track, true)) { - registryData.fill(HIST("trackProtocol"), 5); // # high purity protons - jetProtons.emplace_back(track); - registryData.fill(HIST("dcaZJetProton"), track.pt(), track.dcaZ()); - } - } else if (isAntiproton(track, false)) { // collect antiprotons in jet + } else if (measureCorrelations && isProton(track, true)) { + registryData.fill(HIST("trackProtocol"), 5); // # high purity protons + jetProtons.emplace_back(track); + registryData.fill(HIST("dcaZJetProton"), track.pt(), track.dcaZ()); + } else if (measureYields && isAntiproton(track, false)) { // collect antiprotons in jet registryData.fill(HIST("ptJetAntiproton"), track.pt()); registryQA.fill(HIST("ptJetAntiprotonVsTotalJet"), track.pt(), jet.pt()); registryData.fill(HIST("trackProtocol"), 6); // # antiprotons - if (isAntiproton(track, true)) { - registryData.fill(HIST("trackProtocol"), 7); // # high purity antiprotons - jetAntiprotons.emplace_back(track); - registryData.fill(HIST("dcaZJetAntiproton"), track.pt(), track.dcaZ()); - } - } else if (isNucleus(track)) { // collect nuclei in jet + } else if (measureCorrelations && isAntiproton(track, true)) { + registryData.fill(HIST("trackProtocol"), 7); // # high purity antiprotons + jetAntiprotons.emplace_back(track); + registryData.fill(HIST("dcaZJetAntiproton"), track.pt(), track.dcaZ()); + } else if (measureYields && isNucleus(track)) { // collect nuclei in jet registryData.fill(HIST("ptJetNuclei"), track.pt()); registryQA.fill(HIST("ptJetNucleiVsTotalJet"), track.pt(), jet.pt()); registryData.fill(HIST("trackProtocol"), 8); // # nuclei registryData.fill(HIST("dcaZJetNuclei"), track.pt(), track.dcaZ()); - } else if (isAntinucleus(track)) { + } else if (measureYields && isAntinucleus(track)) { registryData.fill(HIST("ptJetAntinuclei"), track.pt()); registryQA.fill(HIST("ptJetAntinucleiVsTotalJet"), track.pt(), jet.pt()); registryData.fill(HIST("trackProtocol"), 10); // # antinuclei registryData.fill(HIST("dcaZJetAntinuclei"), track.pt(), track.dcaZ()); - } else if (isPion(track)) { + } else if (measureCorrelations && isPion(track)) { registryQA.fill(HIST("ptJetPionVsTotalJet"), track.pt(), jet.pt()); registryData.fill(HIST("trackProtocol"), 11); // # antinuclei registryData.fill(HIST("dcaZJetPion"), track.pt(), track.dcaZ()); @@ -1443,18 +1451,21 @@ struct AngularCorrelationsInJets { } else if (track.sign() < 0) { jetPiMinus.emplace_back(track); } - } else if (isKaon(track)) { + } else if (measureCorrelations && isKaon(track)) { registryQA.fill(HIST("ptJetKaonVsTotalJet"), track.pt(), jet.pt()); registryData.fill(HIST("trackProtocol"), 12); // # antinuclei registryData.fill(HIST("dcaZJetKaon"), track.pt(), track.dcaZ()); } - } // for (const auto& jtrack : jtracks) + } // for (const auto& jtrack : jet.template tracks_as()) if (jetAll.size() > 1) { // general correlation function doCorrelations(jetAll, fBufferJet, fTempBufferJet, 0, pJet); setTrackBuffer(fTempBufferJet, fBufferJet); } + if (!measureCorrelations) + continue; + if ((jetProtons.size() > 0) && (jetAntiprotons.size() > 0)) { doCorrelationsAnti(jetProtons, jetAntiprotons, fBufferAntiproton, fTempBufferProton, pJet); doCorrelationsAnti(jetAntiprotons, jetProtons, fBufferProton, fTempBufferAntiproton, pJet); // divide SE distributions by 2 in post @@ -1483,9 +1494,115 @@ struct AngularCorrelationsInJets { registryData.fill(HIST("numJetsInEvent"), jetCounter); } - PROCESS_SWITCH(AngularCorrelationsInJets, processRun3revised, "process Run 3 data w jet tables", true); + PROCESS_SWITCH(AngularCorrelationsInJets, processRun3, "process Run 3 data", true); + + // mcd jets seems to be the issue, also mc coll labels ig + /// TODO: check if jets already have bkg subtracted + void processRun3MCReco(soa::Filtered>::iterator const& collision, soa::Filtered> const& allJets, JetMcTracks const&, soa::Filtered const&, aod::McParticles const&) + { + registryData.fill(HIST("eventProtocol"), 0); + if (!jetderiveddatautilities::selectCollision(collision, eventSelection)) + return registryData.fill(HIST("numberOfEvents"), 0); + registryData.fill(HIST("eventProtocol"), 1); + + int jetCounter = 0; + + for (const auto& jet : allJets) { // loop over jets in event + if (minJetPt < (jet.pt() - collision.rho() * jet.area())) + continue; + jetCounter++; + TVector3 pJet(0., 0., 0.); + pJet.SetXYZ(jet.px(), jet.py(), jet.pz()); + + registryData.fill(HIST("numberOfJets"), 0); + registryData.fill(HIST("ptTotalJet"), jet.pt()); + registryData.fill(HIST("jetRapidity"), jet.eta()); + registryData.fill(HIST("numPartInJet"), jet.tracksIds().size()); + registryQA.fill(HIST("jetPtVsNumPart"), jet.pt(), jet.tracksIds().size()); + registryQA.fill(HIST("maxRadiusVsPt"), jet.pt(), jet.r()); + + for (const auto& jtrack : jet.template tracks_as()) { + const auto& track = jtrack.track_as(); + if (!selectTrack(track)) + continue; + + if (track.tpcNClsFindable() != 0) { + registryQA.fill(HIST("ratioCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows() / track.tpcNClsFindable()); + } + registryQA.fill(HIST("ptJetParticle"), track.pt()); + registryQA.fill(HIST("crossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows()); + registryQA.fill(HIST("clusterITS"), track.pt(), track.itsNCls()); + registryQA.fill(HIST("clusterTPC"), track.pt(), track.tpcNClsFound()); + registryQA.fill(HIST("chi2ITS"), track.pt(), track.itsChi2NCl()); + registryQA.fill(HIST("chi2TPC"), track.pt(), track.tpcChi2NCl()); + registryQA.fill(HIST("dcaXYFullEvent"), track.pt(), track.dcaXY()); + registryQA.fill(HIST("dcaZFullEvent"), track.pt(), track.dcaZ()); + registryQA.fill(HIST("phiJet"), track.phi()); + registryQA.fill(HIST("phiPtJet"), track.pt(), track.phi()); + registryQA.fill(HIST("etaJet"), track.eta()); + registryQA.fill(HIST("etaPtJet"), track.pt(), track.eta()); + + if (!std::isnan(track.phi()) && !std::isnan(jet.phi())) { // geometric jet cone + double DeltaPhi = TVector2::Phi_0_2pi(track.phi() - jet.phi()); + if (DeltaPhi > M_PI) + DeltaPhi = DeltaPhi - 2 * M_PI; + double DeltaEta = track.eta() - jet.eta(); + double Delta = std::abs(DeltaPhi * DeltaPhi + DeltaEta * DeltaEta); + registryQA.fill(HIST("jetConeRadius"), Delta); + } + + // analyse jet constituents - this is where the magic happens + registryData.fill(HIST("trackProtocol"), 3); + registryData.fill(HIST("dcaXYFullJet"), track.pt() * track.sign(), track.dcaXY()); + registryData.fill(HIST("dcaZFullJet"), track.pt() * track.sign(), track.dcaZ()); + registryData.fill(HIST("tpcSignal"), track.pt() * track.sign(), track.tpcSignal()); + if (track.hasTOF()) { + registryData.fill(HIST("tofSignal"), track.pt() * track.sign(), track.beta()); + } + + // MC Truth Particles + if (!track.has_mcParticle()) + continue; + switch (track.mcParticle().pdgCode()) { + case 2212: + registryMC.fill(HIST("numberOfTruthParticles"), 0); + registryMC.fill(HIST("ptJetProtonMC"), track.pt()); + break; + case -2212: + registryMC.fill(HIST("numberOfTruthParticles"), 1); + registryMC.fill(HIST("ptJetAntiprotonMC"), track.pt()); + break; + case 1000010020: + registryMC.fill(HIST("numberOfTruthParticles"), 2); + if (deuteronAnalysis) + registryMC.fill(HIST("ptJetNucleiMC"), track.pt()); + break; + case -1000010020: + registryMC.fill(HIST("numberOfTruthParticles"), 3); + if (deuteronAnalysis) + registryMC.fill(HIST("ptJetAntinucleiMC"), track.pt()); + break; + case 1000020030: + registryMC.fill(HIST("numberOfTruthParticles"), 4); + if (!deuteronAnalysis) + registryMC.fill(HIST("ptJetNucleiMC"), track.pt()); + break; + case -1000020030: + registryMC.fill(HIST("numberOfTruthParticles"), 5); + if (!deuteronAnalysis) + registryMC.fill(HIST("ptJetAntinucleiMC"), track.pt()); + break; + default: + continue; + } + } // for (const auto& jtrack : jet.template tracks_as()) + } // for (const auto& jet : allJets) + + registryData.fill(HIST("numJetsInEvent"), jetCounter); + } + PROCESS_SWITCH(AngularCorrelationsInJets, processRun3MCReco, "process Run 3 MC", false); - void processMCRun2(McCollisions const& collisions, soa::Filtered const& tracks, BCsWithRun2Info const&, aod::McParticles&, aod::McCollisions const&) + void processMCRun2old(McCollisions const& collisions, soa::Filtered const& tracks, BCsWithRun2Info const&, aod::McParticles&, aod::McCollisions const&) { for (const auto& collision : collisions) { auto bc = collision.bc_as(); @@ -1502,9 +1619,9 @@ struct AngularCorrelationsInJets { fillHistogramsMC(slicedTracks); } } - PROCESS_SWITCH(AngularCorrelationsInJets, processMCRun2, "process Run 2 MC", false); + PROCESS_SWITCH(AngularCorrelationsInJets, processMCRun2old, "process Run 2 MC w/o jet tables", false); - void processMCRun3(McCollisions const& collisions, soa::Filtered const& tracks, aod::McParticles&, aod::McCollisions const&) + void processMCRun3old(McCollisions const& collisions, soa::Filtered const& tracks, aod::McParticles&, aod::McCollisions const&) { for (const auto& collision : collisions) { registryData.fill(HIST("eventProtocol"), 0); @@ -1512,7 +1629,7 @@ struct AngularCorrelationsInJets { continue; registryData.fill(HIST("numberOfEvents"), 0); registryData.fill(HIST("eventProtocol"), 1); - if (TMath::Abs(collision.posZ()) > zVtx) + if (std::abs(collision.posZ()) > zVtx) continue; auto slicedTracks = tracks.sliceBy(perCollisionMcTracksRun3, collision.globalIndex()); @@ -1520,7 +1637,7 @@ struct AngularCorrelationsInJets { fillHistogramsMC(slicedTracks); } } - PROCESS_SWITCH(AngularCorrelationsInJets, processMCRun3, "process Run 3 MC", false); + PROCESS_SWITCH(AngularCorrelationsInJets, processMCRun3old, "process Run 3 MC w/o jet tables", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 5c5a685983ea04fd2d4adc0c82066ac3518e6be3 Mon Sep 17 00:00:00 2001 From: Rashi gupta <167059733+rashigupt@users.noreply.github.com> Date: Sat, 1 Mar 2025 04:36:42 +0530 Subject: [PATCH 0482/1650] [PWGHF] add non Hfe selection and correlation (#10098) Co-authored-by: Rashi Gupta --- PWGHF/HFC/DataModel/CorrelationTables.h | 25 +- .../TableProducer/correlatorHfeHadrons.cxx | 230 +++++++++++-- PWGHF/HFC/Tasks/taskCorrelationHfeHadrons.cxx | 47 ++- PWGHF/HFL/DataModel/ElectronSelectionTable.h | 48 ++- PWGHF/HFL/TableProducer/CMakeLists.txt | 2 +- .../electronSelectionWithTpcEmcal.cxx | 313 +++++++++++++++--- 6 files changed, 580 insertions(+), 85 deletions(-) diff --git a/PWGHF/HFC/DataModel/CorrelationTables.h b/PWGHF/HFC/DataModel/CorrelationTables.h index 797d693e176..1602099abfa 100644 --- a/PWGHF/HFC/DataModel/CorrelationTables.h +++ b/PWGHF/HFC/DataModel/CorrelationTables.h @@ -475,13 +475,36 @@ DECLARE_SOA_COLUMN(DeltaEta, deltaEta, float); //! DeltaEta between Electron DECLARE_SOA_COLUMN(PtElectron, ptElectron, float); //! Transverse momentum of Electron DECLARE_SOA_COLUMN(PtHadron, ptHadron, float); //! Transverse momentum of Hadron; DECLARE_SOA_COLUMN(PoolBin, poolBin, int); //! Pool Bin of event defined using zvtx and multiplicity +DECLARE_SOA_COLUMN(IsLSEHCorr, isLSEHCorr, int); //! like sign Electron hadron coorelation +DECLARE_SOA_COLUMN(IsULSEHCorr, isULSEHCorr, int); //! unLike sign Electron hadron coorelation } // namespace hf_correlation_electron_hadron DECLARE_SOA_TABLE(HfEHadronPair, "AOD", "HFEHADRONPAIR", //! Hfe-Hadrons pairs Informations hf_correlation_electron_hadron::DeltaPhi, hf_correlation_electron_hadron::DeltaEta, hf_correlation_electron_hadron::PtElectron, hf_correlation_electron_hadron::PtHadron, - hf_correlation_electron_hadron::PoolBin); + hf_correlation_electron_hadron::PoolBin, + hf_correlation_electron_hadron::IsLSEHCorr, + hf_correlation_electron_hadron::IsULSEHCorr); + +// Note: definition of columns and tables for Electron Hadron correlation pairs for MC Gen +namespace hf_correlation_mcgenelectron_hadron +{ +DECLARE_SOA_COLUMN(DeltaPhi, deltaPhi, float); //! DeltaPhi between Electron and Hadrons +DECLARE_SOA_COLUMN(DeltaEta, deltaEta, float); //! DeltaEta between Electron and Hadrons +DECLARE_SOA_COLUMN(PtElectron, ptElectron, float); //! Transverse momentum of Electron +DECLARE_SOA_COLUMN(PtHadron, ptHadron, float); //! Transverse momentum of Hadron; +DECLARE_SOA_COLUMN(PoolBin, poolBin, int); //! Pool Bin of event defined using zvtx and multiplicity +DECLARE_SOA_COLUMN(IsNonHfEHCorr, isNonHfEHCorr, int); //! nonHeavy Flavour Electron hadron coorelation + +} // namespace hf_correlation_mcgenelectron_hadron +DECLARE_SOA_TABLE(HfEHadronMcPair, "AOD", "HFEHADRONMCPAIR", //! Hfe-Hadrons pairs Informations + hf_correlation_mcgenelectron_hadron::DeltaPhi, + hf_correlation_mcgenelectron_hadron::DeltaEta, + hf_correlation_mcgenelectron_hadron::PtElectron, + hf_correlation_mcgenelectron_hadron::PtHadron, + hf_correlation_mcgenelectron_hadron::PoolBin, + hf_correlation_mcgenelectron_hadron::IsNonHfEHCorr); } // namespace o2::aod #endif // PWGHF_HFC_DATAMODEL_CORRELATIONTABLES_H_ diff --git a/PWGHF/HFC/TableProducer/correlatorHfeHadrons.cxx b/PWGHF/HFC/TableProducer/correlatorHfeHadrons.cxx index 51ebf817683..fd16c4c82d6 100644 --- a/PWGHF/HFC/TableProducer/correlatorHfeHadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorHfeHadrons.cxx @@ -37,17 +37,16 @@ using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::soa; using namespace o2::aod::hf_sel_electron; - -// definition of ME variables and new types std::vector zBins{VARIABLE_WIDTH, -10.0, -2.5, 2.5, 10.0}; std::vector multBins{VARIABLE_WIDTH, 0., 200., 500.0, 5000.}; std::vector multBinsMcGen{VARIABLE_WIDTH, 0., 20., 50.0, 500.}; // In MCGen multiplicity is defined by counting primaries using BinningType = ColumnBinningPolicy>; BinningType corrBinning{{zBins, multBins}, true}; - +using BinningTypeMcGen = ColumnBinningPolicy; struct HfCorrelatorHfeHadrons { - SliceCache cache; + Produces entryElectronHadronPair; + Produces entryElectronHadronPairmcGen; // Configurables // Event Selection Configurable zPvPosMax{"zPvPosMax", 10., "Maximum z of the primary vertex (cm)"}; @@ -63,15 +62,17 @@ struct HfCorrelatorHfeHadrons { // Electron hadron correlation condition Configurable ptCondition{"ptCondition", true, "Electron pT should be greater than associate particle pT"}; + SliceCache cache; using TableCollisions = o2::soa::Filtered>; using TableCollision = TableCollisions::iterator; using TableTracks = o2::soa::Join; - + using McGenTableCollisions = soa::Join; + using McGenTableCollision = McGenTableCollisions::iterator; using McTableCollisions = o2::soa::Filtered>; using McTableCollision = McTableCollisions::iterator; using McTableTracks = soa::Join; - Filter CollisionFilter = nabs(aod::collision::posZ) < zPvPosMax && aod::collision::numContrib > static_cast(1); + Filter collisionFilter = nabs(aod::collision::posZ) < zPvPosMax && aod::collision::numContrib > static_cast(1); Preslice perCol = aod::track::collisionId; Preslice perCollision = aod::hf_sel_electron::collisionId; HistogramConfigSpec hCorrelSpec{HistType::kTHnSparseD, {{30, 0., 30.}, {20, 0., 20.}, {32, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {50, -1.8, 1.8}}}; @@ -79,13 +80,30 @@ struct HfCorrelatorHfeHadrons { HistogramRegistry registry{ "registry", {{"hInclusiveEHCorrel", "Sparse for Delta phi and Delta eta Inclusive Electron with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, + {"hLSEHCorrel", "Sparse for Delta phi and Delta eta Like sign Electron pair with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, + {"hULSEHCorrel", "Sparse for Delta phi and Delta eta UnLike sign Electron pair with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, + {"hMCgenNonHfEHCorrel", "Sparse for Delta phi and Delta eta Non Hf for McGen Inclusive Electron with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, + {"hMCgenInclusiveEHCorrl", "Sparse for Delta phi and Delta eta for McGen Electron pair with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, {"hptElectron", "hptElectron", {HistType::kTH1F, {{100, 0, 100}}}}, - {"hMixEventInclusiveEHCorrl", "Sparse for mix event Delta phi and Delta eta Inclusive Electron with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}}}; + + {"hMixEventInclusiveEHCorrl", "Sparse for mix event Delta phi and Delta eta Inclusive Electron with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, + {"hMixEventLSEHCorrel", "Sparse for mix event Delta phi and Delta eta Like sign Electron pair with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, + {"hMixEventULSEHCorrel", "Sparse for mix event Delta phi and Delta eta Unlike sign Electron pair with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, + {"hMixEventMcGenInclusiveEHCorrl", "Sparse for mix event Delta phi and Delta eta Mc gen Inclusive Electron with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, + {"hMixEventMcGenNonHfEHCorrl", "Sparse for mix event Delta phi and Delta eta Mc gen Inclusive Electron with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}}}; void init(InitContext&) { registry.get(HIST("hInclusiveEHCorrel"))->Sumw2(); + registry.get(HIST("hLSEHCorrel"))->Sumw2(); + registry.get(HIST("hULSEHCorrel"))->Sumw2(); + registry.get(HIST("hMCgenInclusiveEHCorrl"))->Sumw2(); + registry.get(HIST("hMCgenNonHfEHCorrel"))->Sumw2(); registry.get(HIST("hMixEventInclusiveEHCorrl"))->Sumw2(); + registry.get(HIST("hMixEventLSEHCorrel"))->Sumw2(); + registry.get(HIST("hMixEventULSEHCorrel"))->Sumw2(); + registry.get(HIST("hMixEventMcGenInclusiveEHCorrl"))->Sumw2(); + registry.get(HIST("hMixEventMcGenNonHfEHCorrl"))->Sumw2(); } // Associated Hadron Selection Cut @@ -132,27 +150,49 @@ struct HfCorrelatorHfeHadrons { double ptHadron = -999; double etaHadron = -999; double phiHadron = -999; - - if (!eTrack.isEmcal()) + if (!eTrack.isEmcal()) { continue; - + } registry.fill(HIST("hptElectron"), ptElectron); + for (const auto& hTrack : tracks) { - if (hTrack.globalIndex() == eTrack.trackId()) + if (hTrack.globalIndex() == eTrack.trackId()) { continue; + } + // Apply Hadron cut - if (!selAssoHadron(hTrack)) + if (!selAssoHadron(hTrack)) { continue; + } + ptHadron = hTrack.pt(); phiHadron = hTrack.phi(); etaHadron = hTrack.eta(); - if (ptCondition && (ptElectron < ptHadron)) + if (ptCondition && (ptElectron < ptHadron)) { continue; + } + deltaPhi = RecoDecay::constrainAngle(phiElectron - phiHadron, -o2::constants::math::PIHalf); deltaEta = etaElectron - etaHadron; registry.fill(HIST("hInclusiveEHCorrel"), ptElectron, ptHadron, deltaPhi, deltaEta); - entryElectronHadronPair(deltaPhi, deltaEta, ptElectron, ptHadron, poolBin); + int isLSElectroncorr = 0; + int isULSElectroncorr = 0; + if (eTrack.isLSElectron() > 0) { + for (int i = 0; i < eTrack.isLSElectron(); ++i) { + + registry.fill(HIST("hLSEHCorrel"), ptElectron, ptHadron, deltaPhi, deltaEta); + ++isLSElectroncorr; + } + } + if (eTrack.isULSElectron() > 0) { + for (int i = 0; i < eTrack.isULSElectron(); ++i) { + + registry.fill(HIST("hULSEHCorrel"), ptElectron, ptHadron, deltaPhi, deltaEta); + ++isULSElectroncorr; + } + } + entryElectronHadronPair(deltaPhi, deltaEta, ptElectron, ptHadron, poolBin, isLSElectroncorr, isULSElectroncorr); } } } @@ -173,42 +213,64 @@ struct HfCorrelatorHfeHadrons { double etaHadronMix = -999; double phiHadronMix = -999; int poolBin = corrBinning.getBin(std::make_tuple(c2.posZ(), c2.multFV0M())); - for (auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) { - if (!t1.isEmcal()) + for (const auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) { + if (!t1.isEmcal()) { continue; + } + ptHadronMix = t2.pt(); ptElectronMix = t1.ptTrack(); phiElectronMix = t1.phiTrack(); phiHadronMix = t2.phi(); etaElectronMix = t1.etaTrack(); etaHadronMix = t2.eta(); - if (!selAssoHadron(t2)) + if (!selAssoHadron(t2)) { continue; - if (ptCondition && (ptElectronMix < ptHadronMix)) + } + + if (ptCondition && (ptElectronMix < ptHadronMix)) { continue; + } + deltaPhiMix = RecoDecay::constrainAngle(phiElectronMix - phiHadronMix, -o2::constants::math::PIHalf); deltaEtaMix = etaElectronMix - etaHadronMix; registry.fill(HIST("hMixEventInclusiveEHCorrl"), ptElectronMix, ptHadronMix, deltaPhiMix, deltaEtaMix); - entryElectronHadronPair(deltaPhiMix, deltaEtaMix, ptElectronMix, ptHadronMix, poolBin); + int isLSElectroncorr = 0; + int isULSElectroncorr = 0; + if (t1.isLSElectron() > 0) { + for (int i = 0; i < t1.isLSElectron(); ++i) { + + registry.fill(HIST("hMixEventLSEHCorrel"), ptElectronMix, ptHadronMix, deltaPhiMix, deltaEtaMix); + ++isLSElectroncorr; + } + } + if (t1.isULSElectron() > 0) { + for (int i = 0; i < t1.isULSElectron(); ++i) { + + registry.fill(HIST("hMixEventULSEHCorrel"), ptElectronMix, ptHadronMix, deltaPhiMix, deltaEtaMix); + ++isULSElectroncorr; + } + } + entryElectronHadronPair(deltaPhiMix, deltaEtaMix, ptElectronMix, ptHadronMix, poolBin, isLSElectroncorr, isULSElectroncorr); } } // ======= Process starts for Data, Same event ============ void processData(TableCollision const& collision, - aod::HfSelEl const& electron, + aod::HfCorrSelEl const& electron, TableTracks const& tracks) { fillCorrelation(collision, electron, tracks); } - PROCESS_SWITCH(HfCorrelatorHfeHadrons, processData, "Process for Data", true); + PROCESS_SWITCH(HfCorrelatorHfeHadrons, processData, "Process for Data", false); // ======= Process starts for McRec, Same event ============ void processMcRec(McTableCollision const& mcCollision, - aod::HfSelEl const& mcElectron, + aod::HfCorrSelEl const& mcElectron, McTableTracks const& mcTracks) { fillCorrelation(mcCollision, mcElectron, mcTracks); @@ -216,15 +278,74 @@ struct HfCorrelatorHfeHadrons { PROCESS_SWITCH(HfCorrelatorHfeHadrons, processMcRec, "Process MC Reco mode", false); + void processMcGen(McGenTableCollision const& mcCollision, aod::McParticles const& mcParticles, aod::HfMcGenSelEl const& electron) + { + + BinningTypeMcGen corrBinningMcGen{{zBins, multBinsMcGen}, true}; + int poolBin = corrBinningMcGen.getBin(std::make_tuple(mcCollision.posZ(), mcCollision.multMCFT0A())); + + double ptElectron = 0; + double phiElectron = 0; + double etaElectron = 0; + for (const auto& electronMc : electron) { + double ptHadron = 0; + double phiHadron = 0; + double etaHadron = 0; + double deltaPhi = 0; + double deltaEta = 0; + ptElectron = electronMc.ptTrackMc(); + phiElectron = electronMc.phiTrackMc(); + etaElectron = electronMc.etaTrackMc(); + for (const auto& particleMc : mcParticles) { + if (particleMc.globalIndex() == electronMc.trackId()) { + + continue; + } + + // Associated hadron Selection ////// + if (!particleMc.isPhysicalPrimary()) { + continue; + } + + if (particleMc.eta() < etaTrackMin || particleMc.eta() > etaTrackMax) { + continue; + } + if (particleMc.pt() < ptTrackMin) { + continue; + } + ptHadron = particleMc.pt(); + phiHadron = particleMc.phi(); + etaHadron = particleMc.eta(); + if (ptCondition && (ptElectron < ptHadron)) { + return; // Apply pT condition + } + deltaPhi = RecoDecay::constrainAngle(phiElectron - phiHadron, -o2::constants::math::PIHalf); + deltaEta = etaElectron - etaHadron; + bool isNonHfeCorr = false; + if (electronMc.isNonHfeMc()) { + + registry.fill(HIST("hMCgenNonHfEHCorrel"), ptElectron, ptHadron, deltaPhi, deltaEta); + isNonHfeCorr = true; + } else { + + registry.fill(HIST("hMCgenInclusiveEHCorrl"), ptElectron, ptHadron, deltaPhi, deltaEta); + } + entryElectronHadronPairmcGen(deltaPhi, deltaEta, ptElectron, ptHadron, poolBin, isNonHfeCorr); + } + } + } + PROCESS_SWITCH(HfCorrelatorHfeHadrons, processMcGen, "Process MC Gen mode", true); + // ====================== Implement Event mixing on Data =============================== + // ====================== Implement Event mixing on Data =================================== - void processDataMixedEvent(TableCollisions const& collision, aod::HfSelEl const& electron, TableTracks const& tracks) + void processDataMixedEvent(TableCollisions const& collision, aod::HfCorrSelEl const& electron, TableTracks const& tracks) { auto tracksTuple = std::make_tuple(electron, tracks); - Pair pair{corrBinning, 5, -1, collision, tracksTuple, &cache}; + Pair pair{corrBinning, 5, -1, collision, tracksTuple, &cache}; // loop over the rows of the new table - for (auto& [c1, tracks1, c2, tracks2] : pair) { + for (const auto& [c1, tracks1, c2, tracks2] : pair) { fillMixCorrelation(c1, c2, tracks1, tracks2); } @@ -233,20 +354,71 @@ struct HfCorrelatorHfeHadrons { // ====================== Implement Event mixing on McRec =================================== - void processMcRecMixedEvent(McTableCollisions const& mccollision, aod::HfSelEl const& electron, McTableTracks const& mcTracks) + void processMcRecMixedEvent(McTableCollisions const& mccollision, aod::HfCorrSelEl const& electron, McTableTracks const& mcTracks) { auto tracksTuple = std::make_tuple(electron, mcTracks); - Pair pairMcRec{corrBinning, 5, -1, mccollision, tracksTuple, &cache}; + Pair pairMcRec{corrBinning, 5, -1, mccollision, tracksTuple, &cache}; // loop over the rows of the new table - for (auto& [c1, tracks1, c2, tracks2] : pairMcRec) { + for (const auto& [c1, tracks1, c2, tracks2] : pairMcRec) { fillMixCorrelation(c1, c2, tracks1, tracks2); } } PROCESS_SWITCH(HfCorrelatorHfeHadrons, processMcRecMixedEvent, "Process Mixed Event MC Reco mode", false); -}; + void processMcGenMixedEvent(McGenTableCollisions const& mcCollision, aod::HfMcGenSelEl const& electrons, aod::McParticles const& mcParticles) + { + + BinningTypeMcGen corrBinningMcGen{{zBins, multBinsMcGen}, true}; + + auto tracksTuple = std::make_tuple(electrons, mcParticles); + Pair pairMcGen{corrBinningMcGen, 5, -1, mcCollision, tracksTuple, &cache}; + // loop over the rows of the new table + double ptElectronMix = -999; + double phiElectronMix = -999; + double etaElectronMix = -999; + double deltaPhiMix = -999; + double deltaEtaMix = -999; + double ptHadronMix = -999; + double etaHadronMix = -999; + double phiHadronMix = -999; + for (const auto& [c1, tracks1, c2, tracks2] : pairMcGen) { + int poolBin = corrBinningMcGen.getBin(std::make_tuple(c1.posZ(), c1.multMCFT0A())); + for (const auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) { + ptHadronMix = t2.pt(); + ptElectronMix = t1.ptTrackMc(); + phiElectronMix = t1.phiTrackMc(); + phiHadronMix = t2.phi(); + etaElectronMix = t1.etaTrackMc(); + etaHadronMix = t2.eta(); + if (t2.eta() < etaTrackMin || t2.eta() > etaTrackMax) { + continue; + } + if (t2.pt() < ptTrackMin) { + continue; + } + if (ptCondition && (ptElectronMix < ptHadronMix)) { + continue; + } + + deltaPhiMix = RecoDecay::constrainAngle(phiElectronMix - phiHadronMix, -o2::constants::math::PIHalf); + deltaEtaMix = etaElectronMix - etaHadronMix; + bool isNonHfeCorr = false; + if (t1.isNonHfeMc()) { + isNonHfeCorr = true; + registry.fill(HIST("hMixEventMcGenNonHfEHCorrl"), ptElectronMix, ptHadronMix, deltaPhiMix, deltaEtaMix); + } else { + + registry.fill(HIST("hMixEventMcGenInclusiveEHCorrl"), ptElectronMix, ptHadronMix, deltaPhiMix, deltaEtaMix); + } + + entryElectronHadronPairmcGen(deltaPhiMix, deltaEtaMix, ptElectronMix, ptHadronMix, poolBin, isNonHfeCorr); + } + } + } + PROCESS_SWITCH(HfCorrelatorHfeHadrons, processMcGenMixedEvent, "Process Mixed Event MC Gen mode", false); +}; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ diff --git a/PWGHF/HFC/Tasks/taskCorrelationHfeHadrons.cxx b/PWGHF/HFC/Tasks/taskCorrelationHfeHadrons.cxx index 5f63948b769..44db8479632 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationHfeHadrons.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationHfeHadrons.cxx @@ -35,11 +35,19 @@ struct HfTaskCorrelationHfeHadrons { HistogramRegistry registry{ "registry", - {{"hInclusiveEHCorrel", "Sparse for Delta phi and Delta eta Hadron with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}}}; + {{"hInclusiveEHCorrel", "Sparse for Delta phi and Delta eta Inclusive Electron with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, + {"hLikeSignEHCorrel", "Sparse for Delta phi and Delta eta Likesign Electronpair with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, + {"hUnLikeSignEHCorrel", "Sparse for Delta phi and Delta eta UnlikeSign Electron pair with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, + {"hMcGenInclusiveEHCorrel", "Sparse for Delta phi and Delta eta McGen Inclusive Electron with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, + {"hMcGenNonHfEHCorrel", "Sparse for Delta phi and Delta eta McGen Non HF Electron with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}}}; void init(InitContext&) { registry.get(HIST("hInclusiveEHCorrel"))->Sumw2(); + registry.get(HIST("hLikeSignEHCorrel"))->Sumw2(); + registry.get(HIST("hUnLikeSignEHCorrel"))->Sumw2(); + registry.get(HIST("hMcGenInclusiveEHCorrel"))->Sumw2(); + registry.get(HIST("hMcGenNonHfEHCorrel"))->Sumw2(); } // correlation for electron hadron @@ -58,8 +66,45 @@ struct HfTaskCorrelationHfeHadrons { ptHadron = pairEntry.ptHadron(); registry.fill(HIST("hInclusiveEHCorrel"), ptElectron, ptHadron, deltaPhi, deltaEta); + if (pairEntry.isLSEHCorr() > 0) { + for (int i = 0; i < pairEntry.isLSEHCorr(); ++i) { + + registry.fill(HIST("hLikeSignEHCorrel"), ptElectron, ptHadron, deltaPhi, deltaEta); + } + } + if (pairEntry.isULSEHCorr() > 0) { + for (int i = 0; i < pairEntry.isULSEHCorr(); ++i) { + + registry.fill(HIST("hUnlikeSignEHCorrel"), ptElectron, ptHadron, deltaPhi, deltaEta); + } + } + } + } + + PROCESS_SWITCH(HfTaskCorrelationHfeHadrons, process, "Process ", false); + + void processMcGen(aod::HfEHadronMcPair const& McGenpairEntries) + { + double deltaPhi = -999; + double deltaEta = -999; + double ptHadron = -999; + double ptElectron = -999; + + for (const auto& pairEntry : McGenpairEntries) { + + deltaPhi = pairEntry.deltaPhi(); + deltaEta = pairEntry.deltaEta(); + ptElectron = pairEntry.ptElectron(); + ptHadron = pairEntry.ptHadron(); + + registry.fill(HIST("hMcGenInclusiveEHCorrel"), ptElectron, ptHadron, deltaPhi, deltaEta); + if (pairEntry.isNonHfEHCorr()) { + + registry.fill(HIST("hMcGenNonHfEHCorrel"), ptElectron, ptHadron, deltaPhi, deltaEta); + } } } + PROCESS_SWITCH(HfTaskCorrelationHfeHadrons, processMcGen, "Process for Mc Gen ", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) diff --git a/PWGHF/HFL/DataModel/ElectronSelectionTable.h b/PWGHF/HFL/DataModel/ElectronSelectionTable.h index bb8b57ef07c..0afb342831a 100644 --- a/PWGHF/HFL/DataModel/ElectronSelectionTable.h +++ b/PWGHF/HFL/DataModel/ElectronSelectionTable.h @@ -49,7 +49,6 @@ DECLARE_SOA_COLUMN(TimeEmcCluster, timeEmcCluster, float); //! time of the DECLARE_SOA_COLUMN(DeltaEtaMatch, deltaEtaMatch, float); //! dEta matched track to EMCal cluster DECLARE_SOA_COLUMN(DeltaPhiMatch, deltaPhiMatch, float); //! dPhi matched track to EMCal cluster DECLARE_SOA_COLUMN(IsEmcal, isEmcal, bool); //! electron information with Emcal - } // namespace hf_sel_electron DECLARE_SOA_TABLE(HfSelEl, "AOD", "HFSELEL", //! Electron Informations o2::soa::Index<>, @@ -74,7 +73,54 @@ DECLARE_SOA_TABLE(HfSelEl, "AOD", "HFSELEL", //! Electron Informations hf_sel_electron::DeltaEtaMatch, hf_sel_electron::DeltaPhiMatch, hf_sel_electron::IsEmcal); +// definition of columns and tables for HfcorrElectron Selection +namespace hf_corr_sel_electron +{ +DECLARE_SOA_INDEX_COLUMN(Collision, collision); //! collisioniD of the electron track +DECLARE_SOA_INDEX_COLUMN(Track, track); //! trackid of of the electron track +DECLARE_SOA_COLUMN(EtaTrack, etaTrack, float); //! pseudorapidity of the electron track +DECLARE_SOA_COLUMN(PhiTrack, phiTrack, float); //! azimuth of the electron track +DECLARE_SOA_COLUMN(PtTrack, ptTrack, float); //! transverse momentum of the electron track +DECLARE_SOA_COLUMN(TpcNSigmaElTrack, tpcNSigmaElTrack, float); //! tpcNSigma of the electron track(TPC PID) +DECLARE_SOA_COLUMN(TofNSigmaElTrack, tofNSigmaElTrack, float); //! tofNSigma of the electron track(TOF PID) +DECLARE_SOA_COLUMN(IsLSElectron, isLSElectron, int); //! Like sign electron information +DECLARE_SOA_COLUMN(IsULSElectron, isULSElectron, int); //! Unlike sign electron information +DECLARE_SOA_COLUMN(IsEmcal, isEmcal, bool); //! electron information +} // namespace hf_corr_sel_electron + +DECLARE_SOA_TABLE(HfCorrSelEl, "AOD", "HfCORRSELEL", //! Electron Informations + o2::soa::Index<>, + hf_corr_sel_electron::CollisionId, + hf_corr_sel_electron::TrackId, + hf_corr_sel_electron::EtaTrack, + hf_corr_sel_electron::PhiTrack, + hf_corr_sel_electron::PtTrack, + hf_corr_sel_electron::TpcNSigmaElTrack, + hf_corr_sel_electron::TofNSigmaElTrack, + hf_corr_sel_electron::IsLSElectron, + hf_corr_sel_electron::IsULSElectron, + hf_corr_sel_electron::IsEmcal); +// definition of columns and tables for Mc Gen HfElectron Selection +namespace hf_mcgen_sel_electron +{ +DECLARE_SOA_INDEX_COLUMN(McCollision, mcCollision); //! collisioniD of the electron track +DECLARE_SOA_INDEX_COLUMN(Track, track); //! trackid of of the electron track +DECLARE_SOA_COLUMN(EtaTrackMc, etaTrackMc, float); //! pseudorapidity of the electron track +DECLARE_SOA_COLUMN(PhiTrackMc, phiTrackMc, float); //! azimuth of the electron track +DECLARE_SOA_COLUMN(PtTrackMc, ptTrackMc, float); //! transverse momentum of the electron track +DECLARE_SOA_COLUMN(IsNonHfeMc, isNonHfeMc, bool); //! Non-Heavy flavour electron information + +} // namespace hf_mcgen_sel_electron + +DECLARE_SOA_TABLE(HfMcGenSelEl, "AOD", "HFMCGENSELEL", //! Electron Informations + o2::soa::Index<>, + hf_mcgen_sel_electron::McCollisionId, + hf_mcgen_sel_electron::TrackId, + hf_mcgen_sel_electron::EtaTrackMc, + hf_mcgen_sel_electron::PhiTrackMc, + hf_mcgen_sel_electron::PtTrackMc, + hf_mcgen_sel_electron::IsNonHfeMc); } // namespace o2::aod #endif // PWGHF_HFL_DATAMODEL_ELECTRONSELECTIONTABLE_H_ diff --git a/PWGHF/HFL/TableProducer/CMakeLists.txt b/PWGHF/HFL/TableProducer/CMakeLists.txt index 1fe472dbfe3..69f571377c8 100644 --- a/PWGHF/HFL/TableProducer/CMakeLists.txt +++ b/PWGHF/HFL/TableProducer/CMakeLists.txt @@ -11,7 +11,7 @@ o2physics_add_dpl_workflow(electron-selection-with-tpc-emcal SOURCES electronSelectionWithTpcEmcal.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore KFParticle::KFParticle COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(tree-creator-electron-d-c-a diff --git a/PWGHF/HFL/TableProducer/electronSelectionWithTpcEmcal.cxx b/PWGHF/HFL/TableProducer/electronSelectionWithTpcEmcal.cxx index 70a2184b574..86448f4582e 100644 --- a/PWGHF/HFL/TableProducer/electronSelectionWithTpcEmcal.cxx +++ b/PWGHF/HFL/TableProducer/electronSelectionWithTpcEmcal.cxx @@ -14,8 +14,8 @@ /// \author Rashi Gupta , IIT Indore /// \author Ravindra Singh , IIT Indore -#include #include "THnSparse.h" +#include "TPDGCode.h" #include "DataFormatsEMCAL/AnalysisCluster.h" #include "Framework/AnalysisTask.h" @@ -23,6 +23,7 @@ #include "Framework/runDataProcessing.h" #include "Common/Core/PID/TPCPIDResponse.h" +#include "Common/Core/trackUtilities.h" #include "Common/Core/TrackSelection.h" #include "Common/DataModel/Centrality.h" #include "Common/DataModel/EventSelection.h" @@ -30,6 +31,8 @@ #include "Common/DataModel/PIDResponse.h" #include "Common/DataModel/TrackSelectionTables.h" +#include "Tools/KFparticle/KFUtilities.h" + #include "PWGJE/DataModel/EMCALClusters.h" #include "PWGHF/HFL/DataModel/ElectronSelectionTable.h" @@ -67,12 +70,16 @@ const float nSigmaAxisMax = 15.; const int dEdxAxisBins = 480; const float dEdxAxisMin = 0.; const float dEdxAxisMax = 160.; +const int kEta = 221; + struct HfElectronSelectionWithTpcEmcal { Produces electronSel; + Produces hfElectronSelection; + Produces hfGenElectronSel; // Configurables // EMCal Cluster information - + KFParticle kfNonHfe; Configurable fillEmcClusterInfo{"fillEmcClusterInfo", true, "Fill histograms with EMCal cluster info before and after track match"}; // Event Selection @@ -86,6 +93,15 @@ struct HfElectronSelectionWithTpcEmcal { Configurable etaTrackMin{"etaTrackMin", -0.6f, "Eta range for electron tracks"}; Configurable ptTrackMin{"ptTrackMin", 3.0f, "Transverse MOmentum range for electron tracks"}; + // Associated electron selection cut + Configurable etaAssoTrackMax{"etaAssoTrackMax", 0.9f, "Eta range for Associatred electron tracks"}; + Configurable etaAssoTrackMin{"etaAssoTrackMin", -0.9f, "Eta range for Associatred electron tracks"}; + Configurable ptAssoTrackMin{"ptAssoTrackMin", 0.2f, "Transverse MOmentum range for Associatred electron tracks"}; + Configurable tpcNsigmaAssoElectronMin{"tpcNsigmaAssoElectronMin", -3.0f, "min Associated Electron TPCnsigma"}; + Configurable tpcNsigmaAssoElectronMax{"tpcNsigmaAssoElectronMax", 3.0f, "max Associated Electron TPCnsigma"}; + Configurable invariantMass{"invariantMass", 0.14f, "max Invariant Mass for Photonic electron"}; + Configurable chiSquareMax{"chiSquareMax", 3.0f, "chiSquare on the reconstructed parent particle"}; + // EMcal and Dcal selection cut Configurable etaTrackDCalNegativeMax{"etaTrackDCalNegativeMax", -0.22f, "Eta range for electron Dcal tracks"}; Configurable etaTrackDCalNegativeMin{"etaTrackDCalNegativeMin", -0.6f, "Eta range for electron tracks"}; @@ -113,32 +129,18 @@ struct HfElectronSelectionWithTpcEmcal { Configurable tpcNsigmaElectronMin{"tpcNsigmaElectronMin", -0.5f, "min Electron TPCnsigma"}; Configurable tpcNsigmaElectronMax{"tpcNsigmaElectronMax", 3.0f, "max Electron TPCnsigma"}; - // Track and EMCal Cluster matching cut for Mc Reco - Configurable mcRecDeltaEtaMatchMin{"mcRecDeltaEtaMatchMin", -0.013f, "McReco Min Eta distance of EMCAL cluster to its closest track"}; - Configurable mcRecDeltaEtaMatchMax{"mcRecDeltaEtaMatchMax", 0.0171f, "McReco Max Eta distance of EMCAL cluster to its closest track"}; - Configurable mcRecDeltaPhiMatchMin{"mcRecDeltaPhiMatchMin", -0.022f, "McReco Min Phi distance of EMCAL cluster to its closest track"}; - Configurable mcRecDeltaPhiMatchMax{"mcRecDeltaPhiMatchMax", 0.028f, "McReco Max Phi distance of EMCAL cluster to its closest track"}; - - Configurable mcRecTimeEmcClusterMax{"mcRecTimeEmcClusterMax", 50.f, "McReco EMCal Cluster time"}; - - // Inclusive electron selection cut for Mc Reco - Configurable mcRecM02EmcClusterElectronMax{"mcRecM02EmcClusterElectronMax", 0.9f, "MC Reco max Electron EMCal Cluster M02"}; - Configurable mcRecM02EmcClusterElectronMin{"mcRecM02EmcClusterElectronMin", 0.02f, "MC Reco min Electron EMCal Cluster M02"}; - Configurable mcRecM20EmcClusterElectronMax{"mcRecM20EmcClusterElectronMax", 1000.f, "MC Reco max Electron EMCal Cluster M20"}; - Configurable mcRecM20EmcClusterElectronMin{"mcRecM20EmcClusterElectronMin", 0.0f, "MC Reco min Electron EMCal Cluster M20"}; - Configurable mcRecTpcNsigmaElectronMin{"mcRecTpcNsigmaElectronMin", -0.5f, "MC Reco min Electron TPCnsigma"}; - Configurable mcRecTpcNsigmaElectronMax{"mcRecTpcNsigmaElectronMax", 3.0f, "MC Reco max Electron TPCnsigma"}; - using TableCollisions = o2::soa::Filtered>; using TableCollision = TableCollisions::iterator; using TableTracks = o2::soa::Join; using McTableCollisions = o2::soa::Filtered>; using McTableCollision = McTableCollisions::iterator; + using McGenTableCollisions = soa::Join; + using McGenTableCollision = McGenTableCollisions::iterator; using McTableTracks = soa::Join; using McTableEmcals = soa::Join; - Filter CollisionFilter = nabs(aod::collision::posZ) < zPvPosMax && aod::collision::numContrib > static_cast(1); + Filter collisionFilter = nabs(aod::collision::posZ) < zPvPosMax && aod::collision::numContrib > static_cast(1); PresliceUnsorted perClusterMatchedTracks = o2::aod::emcalmatchedtrack::trackId; HistogramConfigSpec hEmcClusterEnergySpec{HistType::kTH1F, {{300, 0.0, 30.0}}}; @@ -157,6 +159,16 @@ struct HfElectronSelectionWithTpcEmcal { "registry", {{"hNevents", "No of events", {HistType::kTH1F, {{3, 1, 4}}}}, {"hZvertex", "z vertex", {HistType::kTH1F, {{100, -100, 100}}}}, + {"hLikeMass", "Like mass", {HistType::kTH1F, {{1000, 0, 2.0}}}}, + {"hUnLikeMass", "unLike mass", {HistType::kTH1F, {{1000, 0, 1.0}}}}, + {"hLikeSignPt", "Like sign Momentum ", {HistType::kTH1F, {{pAxisBins, pAxisMin, pAxisMax}}}}, + {"hUnLikeSignPt", "UnLike sign Momentum", {HistType::kTH1F, {{pAxisBins, pAxisMin, pAxisMax}}}}, + {"hMcgenInElectron", "Mc Gen Inclusive Electron", {HistType::kTH1F, {{pAxisBins, pAxisMin, pAxisMax}}}}, + {"hMcgenAllNonHfeElectron", "Mc Gen All NonHf Electron", {HistType::kTH1F, {{pAxisBins, pAxisMin, pAxisMax}}}}, + {"hMcgenNonHfeElectron", "Mc Gen NonHf Electron with mother", {HistType::kTH1F, {{pAxisBins, pAxisMin, pAxisMax}}}}, + {"hPi0eEmbTrkPt", "Mc Gen Pi0 mother NonHf Electron", {HistType::kTH1F, {{pAxisBins, pAxisMin, pAxisMax}}}}, + + {"hEtaeEmbTrkPt", "Mc Gen Eta mother NonHf Electron", {HistType::kTH1F, {{pAxisBins, pAxisMin, pAxisMax}}}}, {"hEmcClusterM02", "m02", {HistType::kTH1F, {{m02AxisBins, m02AxisMin, m02AxisMax}}}}, {"hEmcClusterM20", "m20", {HistType::kTH1F, {{m20AxisBins, m20AxisMin, m20AxisMax}}}}, {"hTrackEtaPhi", "TPC EtaPhi Info; #eta;#varphi;passEMcal;", {HistType::kTH3F, {{etaAxisBins, trackEtaAxisMin, trackEtaAxisMax}, {phiAxisBins, trackPhiAxisMin, trackPhiAxisMax}, {passEMCalBins, passEMCalAxisMin, passEMCalAxisMax}}}}, @@ -211,7 +223,137 @@ struct HfElectronSelectionWithTpcEmcal { } return true; } + // Associated electron Selection Cut + template + bool selAssoTracks(T const& track) + { + if (!track.isGlobalTrackWoDCA()) { + return false; + } + if (std::abs(track.dcaXY()) > dcaXYTrackMax || std::abs(track.dcaZ()) > dcaZTrackMax) { + return false; + } + if (track.eta() < etaAssoTrackMin || track.eta() > etaAssoTrackMax) { + return false; + } + + if (track.pt() < ptAssoTrackMin) { + return false; + } + if (track.tpcNSigmaEl() < tpcNsigmaAssoElectronMin || track.tpcNSigmaEl() > tpcNsigmaAssoElectronMax) { + return false; + } + + return true; + } + + // mc gen particle selection cut + template + bool mcGensel(T const& track) + { + if (track.eta() < etaTrackMin || track.eta() > etaTrackMax) { + return false; + } + if ((track.phi() < phiTrackEMCalMin || track.phi() > phiTrackEMCalMax) && (track.phi() < phiTrackDCalMin || track.phi() > phiTrackDCalMax)) { + return false; + } + if (track.pt() < ptTrackMin) { + return false; + } + return true; + } + // nonHfe Identification + + template + void nonHfe(ElectronType const& electron, TracksType const& tracks, bool isEMcal) + { + int isLSElectronFound = 0; + int isULSElectronFound = 0; + bool isLSElectron = false; + bool isULSElectron = false; + float invMassElectron = 0.; + float massLike = 0; + float massUnLike = 0; + + for (const auto& pTrack : tracks) { + if (pTrack.globalIndex() == electron.globalIndex()) { + continue; + } + // Apply partner electron selection + + if (!selAssoTracks(pTrack)) { + continue; + } + if (electron.pt() <= pTrack.pt()) { + continue; + } + int pdgE1 = kElectron; + int pdgE2 = kElectron; + if (electron.sign() > 0) { + pdgE1 = kPositron; + } + + if (pTrack.sign() > 0) { + pdgE2 = kPositron; + } + + KFPTrack kfpTrack = createKFPTrackFromTrack(electron); + KFPTrack kfpAssociatedTrack = createKFPTrackFromTrack(pTrack); + KFParticle kfTrack(kfpTrack, pdgE1); + KFParticle kfAssociatedTrack(kfpAssociatedTrack, pdgE2); + const KFParticle* electronPairs[2] = {&kfTrack, &kfAssociatedTrack}; + kfNonHfe.SetConstructMethod(2); + kfNonHfe.Construct(electronPairs, 2); + + int ndf = kfNonHfe.GetNDF(); + double chi2recg = kfNonHfe.GetChi2() / ndf; + if (ndf < 1.0) { + continue; + } + if (std::sqrt(std::abs(chi2recg)) > chiSquareMax) { + continue; + } + + invMassElectron = RecoDecay::m(std::array{pTrack.pVector(), electron.pVector()}, std::array{MassElectron, MassElectron}); + + // for like charge + if (pTrack.sign() == electron.sign()) { + massLike = invMassElectron; + isLSElectron = true; + if (isEMcal) { + registry.fill(HIST("hLikeMass"), massLike); + } + } + // for unlike charge + if (pTrack.sign() != electron.sign()) { + massUnLike = invMassElectron; + isULSElectron = true; + if (isEMcal) { + registry.fill(HIST("hUnLikeMass"), massUnLike); + } + } + + // for like charge + if (isLSElectron && (invMassElectron <= invariantMass)) { + massLike = invMassElectron; + ++isLSElectronFound; + if (isEMcal) { + registry.fill(HIST("hLikeSignPt"), electron.pt()); + } + } + // for unlike charge + if (isULSElectron && (invMassElectron <= invariantMass)) { + massUnLike = invMassElectron; + ++isULSElectronFound; + if (isEMcal) { + registry.fill(HIST("hUnLikeSignPt"), electron.pt()); + } + } + } + // Pass multiplicities and other required parameters for this electron + hfElectronSelection(electron.collisionId(), electron.globalIndex(), electron.eta(), electron.phi(), electron.pt(), electron.tpcNSigmaEl(), electron.tofNSigmaEl(), isLSElectronFound, isULSElectronFound, isEMcal); + } // Electron Identification template void fillElectronTrack(CollisionType const& collision, TracksType const& tracks, EmcClusterType const& emcClusters, MatchType const& matchedTracks, ParticleType const& /*particlemc*/) @@ -243,7 +385,7 @@ struct HfElectronSelectionWithTpcEmcal { float dcaxyTrack = -999; float dcazTrack = -999; float tpcNsigmaTrack = -999; - int electronId = -999; + for (const auto& track : tracks) { phiTrack = track.phi(); etaTrack = track.eta(); @@ -252,7 +394,6 @@ struct HfElectronSelectionWithTpcEmcal { dcaxyTrack = track.dcaXY(); dcazTrack = track.dcaZ(); tpcNsigmaTrack = track.tpcNSigmaEl(); - electronId = track.globalIndex(); // Apply Track Selection if (!selTracks(track)) { continue; @@ -313,21 +454,11 @@ struct HfElectronSelectionWithTpcEmcal { deltaEtaMatch = matchTrack.trackEtaEmcal() - etaMatchEmcCluster; // Track and EMCal cluster Matching - - if constexpr (!isMc) { - if (std::abs(timeEmcCluster) > timeEmcClusterMax) { - continue; - } - if (deltaPhiMatch < deltaPhiMatchMin || deltaPhiMatch > deltaPhiMatchMax || deltaEtaMatch < deltaEtaMatchMin || deltaEtaMatch > deltaEtaMatchMax) { - continue; - } - } else { - if (std::abs(timeEmcCluster) > mcRecTimeEmcClusterMax) { - continue; - } - if (deltaPhiMatch < mcRecDeltaPhiMatchMin || deltaPhiMatch > mcRecDeltaPhiMatchMax || deltaEtaMatch < mcRecDeltaEtaMatchMin || deltaEtaMatch > mcRecDeltaEtaMatchMax) { - continue; - } + if (std::abs(timeEmcCluster) > timeEmcClusterMax) { + continue; + } + if (deltaPhiMatch < deltaPhiMatchMin || deltaPhiMatch > deltaPhiMatchMax || deltaEtaMatch < deltaEtaMatchMin || deltaEtaMatch > deltaEtaMatchMax) { + continue; } registry.fill(HIST("hEmcClsTrkEtaPhiDiffTimeEnergy"), deltaEtaMatch, deltaPhiMatch, timeEmcCluster); @@ -346,16 +477,10 @@ struct HfElectronSelectionWithTpcEmcal { registry.fill(HIST("hAfterMatchEtaPhi"), etaMatchTrack, phiMatchTrack); registry.fill(HIST("hAfterMatchEnergyLossVsP"), matchTrack.tpcSignal(), pMatchTrack); registry.fill(HIST("hAfterMatchEnergyLossVsPt"), matchTrack.tpcSignal(), ptMatchTrack); - // Apply Electron Identification cuts - if constexpr (!isMc) { - if ((tpcNsigmaMatchTrack < tpcNsigmaElectronMin || tpcNsigmaMatchTrack > tpcNsigmaElectronMax) || (m02MatchEmcCluster < m02EmcClusterElectronMin || m02MatchEmcCluster > m02EmcClusterElectronMax) || (m20MatchEmcCluster < m20EmcClusterElectronMin || m20MatchEmcCluster > m20EmcClusterElectronMax)) { - continue; - } - } else { - if ((tpcNsigmaMatchTrack < mcRecTpcNsigmaElectronMin || tpcNsigmaMatchTrack > mcRecTpcNsigmaElectronMax) || (m02MatchEmcCluster < mcRecM02EmcClusterElectronMin || m02MatchEmcCluster > mcRecM02EmcClusterElectronMax) || (m20MatchEmcCluster < mcRecM20EmcClusterElectronMin || m20MatchEmcCluster > mcRecM20EmcClusterElectronMax)) { - continue; - } + + if ((tpcNsigmaMatchTrack < tpcNsigmaElectronMin || tpcNsigmaMatchTrack > tpcNsigmaElectronMax) || (m02MatchEmcCluster < m02EmcClusterElectronMin || m02MatchEmcCluster > m02EmcClusterElectronMax) || (m20MatchEmcCluster < m20EmcClusterElectronMin || m20MatchEmcCluster > m20EmcClusterElectronMax)) { + continue; } registry.fill(HIST("hPIDAfterPIDCuts"), eop, ptMatchTrack, tpcNsigmaMatchTrack, m02MatchEmcCluster, m20MatchEmcCluster); @@ -365,17 +490,20 @@ struct HfElectronSelectionWithTpcEmcal { continue; } - isEMcal = true; - // std::cout << " electron id in selection" << electronId << std::endl; // FIXME: Use LOG - electronSel(matchTrack.collisionId(), electronId, etaMatchTrack, phiMatchTrack, ptMatchTrack, pMatchTrack, trackRapidity, matchTrack.dcaXY(), matchTrack.dcaZ(), matchTrack.tpcNSigmaEl(), matchTrack.tofNSigmaEl(), + ///////////////// NonHf electron Selection with Emcal //////////////////////// + + nonHfe(matchTrack, tracks, true); + + electronSel(track.collisionId(), matchTrack.globalIndex(), etaMatchTrack, phiMatchTrack, ptMatchTrack, pMatchTrack, trackRapidity, matchTrack.dcaXY(), matchTrack.dcaZ(), matchTrack.tpcNSigmaEl(), matchTrack.tofNSigmaEl(), eMatchEmcCluster, etaMatchEmcCluster, phiMatchEmcCluster, m02MatchEmcCluster, m20MatchEmcCluster, cellEmcCluster, timeEmcCluster, deltaEtaMatch, deltaPhiMatch, isEMcal); } - /// Electron information without Emcal and use TPC and TOF if (isEMcal) { continue; } - electronSel(track.collisionId(), electronId, etaTrack, phiTrack, ptTrack, pTrack, trackRapidity, dcaxyTrack, dcazTrack, track.tpcNSigmaEl(), track.tofNSigmaEl(), + nonHfe(track, tracks, false); + ///////////////// NonHf electron Selection without Emcal //////////////////////// + electronSel(track.collisionId(), track.globalIndex(), etaTrack, phiTrack, ptTrack, pTrack, trackRapidity, dcaxyTrack, dcazTrack, track.tpcNSigmaEl(), track.tofNSigmaEl(), eMatchEmcCluster, etaMatchEmcCluster, phiMatchEmcCluster, m02MatchEmcCluster, m20MatchEmcCluster, cellEmcCluster, timeEmcCluster, deltaEtaMatch, deltaPhiMatch, isEMcal); } } @@ -388,8 +516,7 @@ struct HfElectronSelectionWithTpcEmcal { { fillElectronTrack(collision, tracks, emcClusters, matchedTracks, 0); } - PROCESS_SWITCH(HfElectronSelectionWithTpcEmcal, processData, "process Data info only", true); - + PROCESS_SWITCH(HfElectronSelectionWithTpcEmcal, processData, "process Data info only", false); /// Electron selection - for MC reco-level analysis void processMcRec(McTableCollision const& mcCollision, McTableTracks const& mcTracks, @@ -400,6 +527,88 @@ struct HfElectronSelectionWithTpcEmcal { fillElectronTrack(mcCollision, mcTracks, mcEmcClusters, matchedTracks, mcParticles); } PROCESS_SWITCH(HfElectronSelectionWithTpcEmcal, processMcRec, "Process MC Reco mode", false); + + void processMcGen(McGenTableCollision const& mcCollision, aod::McParticles const& mcParticles) + { + + ///// electron identification + bool isNonHfe = false; + for (const auto& particleMc : mcParticles) { + + if (!particleMc.isPhysicalPrimary()) + continue; + if (!mcGensel(particleMc)) { + continue; + } + if (std::abs(particleMc.pdgCode()) == kElectron) { + + registry.fill(HIST("hMcgenInElectron"), particleMc.pt()); + bool isEmbEta = false; + bool isEmbPi0 = false; + + if (particleMc.has_mothers()) { + // Check first mother + auto const& mother = particleMc.mothers_first_as(); + + if (std::abs(mother.pdgCode()) == kEta || std::abs(mother.pdgCode()) == kPi0 || std::abs(mother.pdgCode()) == kGamma) { + registry.fill(HIST("hMcgenAllNonHfeElectron"), particleMc.pt()); + if (mother.has_mothers()) { + auto const& gmother = mother.mothers_first_as(); + if (gmother.has_mothers()) { + auto const& ggmother = gmother.mothers_first_as(); + + // cases to consider: eta->e, eta->pi0->e, eta->gamma->e, eta->pi0->gamma->e, pi0->e, pi0->gamma->e + + //================= eta->e ====================================== + if (std::abs(mother.pdgCode()) == kEta) { + isEmbEta = true; + } + //================= eta->pi0->e ====================================== + + if (std::abs(mother.pdgCode()) == kPi0) { + isEmbPi0 = true; // pi0 -> e + + if (std::abs(gmother.pdgCode()) == kEta) { + isEmbEta = true; // eta->pi0-> e + } + } + + /// ==================================== eta->gamma->e and eta->pi0->gamma->e============ + if (std::abs(mother.pdgCode()) == kGamma) { + if (std::abs(gmother.pdgCode()) == kEta) { + isEmbEta = true; // eta->gamma-> e + } + + if (std::abs(gmother.pdgCode()) == kPi0) { + isEmbPi0 = true; // pi0-> gamma-> e + + if (std::abs(ggmother.pdgCode()) == kEta) { + + isEmbEta = true; // eta->pi0->gamma-> e + } + } + } + } + } + } + } + if (isEmbPi0 || isEmbEta) { + registry.fill(HIST("hMcgenNonHfeElectron"), particleMc.pt()); + isNonHfe = true; + if (isEmbPi0) { + + registry.fill(HIST("hPi0eEmbTrkPt"), particleMc.pt()); + } + if (isEmbEta) { + registry.fill(HIST("hEtaeEmbTrkPt"), particleMc.pt()); + } + } + hfGenElectronSel(mcCollision.globalIndex(), particleMc.globalIndex(), particleMc.eta(), particleMc.phi(), particleMc.pt(), isNonHfe); + } + } + } + + PROCESS_SWITCH(HfElectronSelectionWithTpcEmcal, processMcGen, "Process MC Gen mode", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From cf4dd26279d2d572ceb7200fc7906baafabf4e44 Mon Sep 17 00:00:00 2001 From: omvazque Date: Sat, 1 Mar 2025 02:37:56 -0600 Subject: [PATCH 0483/1650] [PWGLF] Includes MC closure (#10261) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 441 +++++++++++++------ 1 file changed, 305 insertions(+), 136 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index 0518604c080..2c9d168231a 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -23,6 +23,7 @@ #include #include #include +#include #include #include "Common/CCDB/EventSelectionParams.h" @@ -96,7 +97,7 @@ struct UccZdc { Configurable minMeanpT{"minMeanpT", 0.5, "minimum [pT]"}; Configurable maxMeanpT{"maxMeanpT", 1.1, "maximum [pT]"}; Configurable nBinsMeanpT{"nBinsMeanpT", 160, "# bins [pT]"}; - ConfigurableAxis binsPt{"binsPt", {VARIABLE_WIDTH, 0.0, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8, 5.0}, "pT binning"}; + ConfigurableAxis binsPt{"binsPt", {VARIABLE_WIDTH, 0.0, 0.1, 0.12}, "pT binning"}; ConfigurableAxis binsCent{"binsCent", {VARIABLE_WIDTH, 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.}, "T0C binning"}; // Configurable event selectiond and flags ZDC @@ -145,6 +146,34 @@ struct UccZdc { Zem }; + // Histograms names + static constexpr std::string_view PtCorrNames[4] = { + "NchvsOneParCorr", "NchvsTwoParCorr", "NchvsThreeParCorr", + "NchvsFourParCorr"}; + static constexpr std::string_view PtCorrMCNchNames[4] = { + "NchvsOneParCorrMC", "NchvsTwoParCorrMC", "NchvsThreeParCorrMC", + "NchvsFourParCorrMC"}; + static constexpr std::string_view PtCorrMCNchMCNames[4] = { + "NchMCvsOneParCorrMC", "NchMCvsTwoParCorrMC", "NchMCvsThreeParCorrMC", + "NchMCvsFourParCorrMC"}; + static constexpr std::string_view PsTitles[4] = { + ";Nch;P_{1}=#Sigma_{evs} W^{(1)}_{e} [p_{T}^{(1)}]_{e};", + ";Nch;P_{2}=#Sigma_{evs} W^{(2)}_{e} [p_{T}^{(2)}]_{e};", + ";Nch;P_{3}=#Sigma_{evs} W^{(3)}_{e} [p_{T}^{(3)}]_{e};", + ";Nch;P_{4}=#Sigma_{evs} W^{(4)}_{e} [p_{T}^{(4)}]_{e};"}; + static constexpr std::string_view WsTitles[4] = { + ";Nch;W_{1}=#Sigma_{evs} W^{(1)}_{e};", + ";Nch;W_{2}=#Sigma_{evs} W^{(2)}_{e};", + ";Nch;W_{3}=#Sigma_{evs} W^{(3)}_{e};", + ";Nch;W_{4}=#Sigma_{evs} W^{(4)}_{e};"}; + static constexpr std::string_view PtCorrTitles[4] = { + ";Nch (|#eta|<0.8);[p_{T}]=(#Sigma w_{i} p_{T}^{i})/(#Sigma w_{i})", + ";Nch (|#eta|<0.8);[p_{T}^{2}]=(P_{1}^{2} - P_{2})/(W_{1}^{2} - " + "W_{2})", + ";Nch (|#eta|<0.8);[p_{T}^{3}]=(P_{1}^{3} - 3P_{2}P_{1} + " + "2P_{3})/(W_{1}^{3} - 3W_{2}W_{1} + 2W_{3})", + ";Nch (|#eta|<0.8);[p_{T}^{4}]"}; + // Filters // Filter collFilter = (nabs(aod::collision::posZ) < posZcut); // Filter trackFilter = (requireGlobalTrackInFilter()); @@ -216,17 +245,9 @@ struct UccZdc { registry.add("eta", ";;Entries;", kTH1F, {axisEta}); registry.add("pt", ";;Entries;", kTH1F, {axisPt}); registry.add("sigma1Pt", ";;#sigma(p_{T})/p_{T};", kTProfile, {axisPt}); - registry.add("pP1", ";Nch;P_{1}=#Sigma_{evs} W^{(1)}_{e} [p_{T}^{(1)}]_{e};", kTProfile, {{nBinsNch, -0.5, maxNch}}); - registry.add("pW1", ";Nch;W_{1}=#Sigma_{evs} W^{(1)}_{e};", kTProfile, {{nBinsNch, -0.5, maxNch}}); - registry.add("pP2", ";Nch;P_{2}=#Sigma_{evs} W^{(2)}_{e} [p_{T}^{(2)}]_{e};", kTProfile, {{nBinsNch, -0.5, maxNch}}); - registry.add("pW2", ";Nch;W_{2}=#Sigma_{evs} W^{(2)}_{e};", kTProfile, {{nBinsNch, -0.5, maxNch}}); - registry.add("pP3", " ;Nch;P_{3}=#Sigma_{evs} W^{(3)}_{e} [p_{T}^{(3)}]_{e};", kTProfile, {{nBinsNch, -0.5, maxNch}}); - registry.add("pW3", ";Nch;W_{3}=#Sigma_{evs} W^{(3)}_{e};", kTProfile, {{nBinsNch, -0.5, maxNch}}); - registry.add("pP4", ";Nch;P_{4}=#Sigma_{evs} W^{(4)}_{e} [p_{T}^{(4)}]_{e};", kTProfile, {{nBinsNch, -0.5, maxNch}}); - registry.add("pW4", ";Nch;W_{4}=#Sigma_{evs} W^{(4)}_{e};", kTProfile, {{nBinsNch, -0.5, maxNch}}); registry.add("dcaXYvspT", "", kTH2F, {{{50, -1., 1.}, {axisPt}}}); - registry.add("T0Ccent", ";T0C centrality;Entries", kTH1F, {axisCent}); - registry.add("Nch", ";Nch (|#eta|<0.8);", kTH1F, {{nBinsNch, -0.5, maxNch}}); + registry.add("Nch", ";Nch (|#eta|<0.8);", kTH1F, + {{nBinsNch, -0.5, maxNch}}); registry.add("ZN", "", kTH1F, {{nBinsZDC, -0.5, maxZN}}); registry.add("ZNA", "", kTH1F, {{nBinsZDC, -0.5, maxZN}}); registry.add("ZPA", "", kTH1F, {{nBinsZDC, -0.5, maxZP}}); @@ -271,47 +292,108 @@ struct UccZdc { {{{nBinsNch, -0.5, maxNch}, {nBinsZDC, -0.5, maxZN}}}); registry.add("ZNvsNch", ";Nch (|#eta|<0.8);ZNA+ZNC", kTH2F, {{{nBinsNch, -0.5, maxNch}, {nBinsZDC, -0.5, maxZN}}}); - registry.add("NchvsOneParCorr", ";Nch (|#eta|<0.8);[p_{T}]=(#Sigma w_{i} p_{T}^{i})/(#Sigma w_{i})", kTH2F, {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); - registry.add("NchvsTwoParCorr", ";Nch (|#eta|<0.8);[p_{T}^{2}]=(P_{1}^{2} - P_{2})/(W_{1}^{2} - W_{2})", kTH2F, {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); - registry.add("NchvsThreeParCorr", ";Nch (|#eta|<0.8);[p_{T}^{3}]=(P_{1}^{3} - 3P_{2}P_{1} + 2P_{3})/(W_{1}^{3} - 3W_{2}W_{1} + 2W_{3})", kTH2F, {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); - registry.add("NchvsFourParCorr", ";Nch (|#eta|<0.8);[p_{T}^{4}]", kTH2F, {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); + } + + if (doprocessMCclosure || doprocessZdcCollAss) { + registry.add("T0Ccent", ";;Entries", kTH1F, {axisCent}); + registry.add( + PtCorrNames[0].data(), PtCorrTitles[0].data(), kTH2F, + {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); + registry.add( + PtCorrNames[1].data(), PtCorrTitles[1].data(), kTH2F, + {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); + registry.add( + PtCorrNames[2].data(), PtCorrTitles[2].data(), kTH2F, + {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); + registry.add( + PtCorrNames[3].data(), PtCorrTitles[3].data(), kTH2F, + {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); + registry.add("pP1", PsTitles[0].data(), kTProfile, + {{nBinsNch, -0.5, maxNch}}); + registry.add("pW1", WsTitles[0].data(), kTProfile, + {{nBinsNch, -0.5, maxNch}}); + registry.add("pP2", PsTitles[1].data(), kTProfile, + {{nBinsNch, -0.5, maxNch}}); + registry.add("pW2", WsTitles[1].data(), kTProfile, + {{nBinsNch, -0.5, maxNch}}); + registry.add("pP3", PsTitles[2].data(), kTProfile, + {{nBinsNch, -0.5, maxNch}}); + registry.add("pW3", WsTitles[2].data(), kTProfile, + {{nBinsNch, -0.5, maxNch}}); + registry.add("pP4", PsTitles[3].data(), kTProfile, + {{nBinsNch, -0.5, maxNch}}); + registry.add("pW4", WsTitles[3].data(), kTProfile, + {{nBinsNch, -0.5, maxNch}}); } // MC Histograms - if (doprocessMC) { - registry.add("hT0C_cent_rec", ";T0C centrality;Entries", kTH1F, - {axisCent}); - registry.add("Pt_MC_rec_all_ch", ";;Entries;", kTH1F, {axisPt}); - registry.add("Pt_MC_rec_ch", ";;Entries;", kTH1F, {axisPt}); - registry.add("Pt_MC_rec_pi", ";;Entries;", kTH1F, {axisPt}); - registry.add("Pt_MC_rec_ka", ";;Entries;", kTH1F, {axisPt}); - registry.add("Pt_MC_rec_pr", ";;Entries;", kTH1F, {axisPt}); - registry.add("Pt_MC_rec_sigpos", ";;Entries;", kTH1F, {axisPt}); - registry.add("Pt_MC_rec_signeg", ";;Entries;", kTH1F, {axisPt}); - registry.add("Pt_MC_rec_re", ";;Entries;", kTH1F, {axisPt}); - registry.add("EtaVsPhi_MC_rec", ";;#varphi;", kTH2F, + if (doprocesspTEff) { + registry.add("T0Ccent", ";;Entries", kTH1F, {axisCent}); + registry.add("nRecColvsCent", "", kTH2F, {{6, -0.5, 5.5}, {{axisCent}}}); + registry.add("Pt_all_ch", "", kTH2F, {{axisCent}, {axisPt}}); + registry.add("Pt_ch", "", kTH2F, {{axisCent}, {axisPt}}); + registry.add("Pt_pi", "", kTH2F, {{axisCent}, {axisPt}}); + registry.add("Pt_ka", "", kTH2F, {{axisCent}, {axisPt}}); + registry.add("Pt_pr", "", kTH2F, {{axisCent}, {axisPt}}); + registry.add("Pt_sigpos", "", kTH2F, {{axisCent}, {axisPt}}); + registry.add("Pt_signeg", "", kTH2F, {{axisCent}, {axisPt}}); + registry.add("Pt_re", "", kTH2F, {{axisCent}, {axisPt}}); + registry.add("EtaVsPhi", ";;#varphi;", kTH2F, {{{axisEta}, {100, -0.1 * PI, +2.1 * PI}}}); + registry.add("hEventCounterMC", "Event counter", kTH1F, {axisEvent}); + registry.add("zPosMC", ";;Entries;", kTH1F, {axisZpos}); + registry.add("PtMC_ch", "", kTH2F, {{axisCent}, {axisPt}}); + registry.add("PtMC_pi", "", kTH2F, {{axisCent}, {axisPt}}); + registry.add("PtMC_ka", "", kTH2F, {{axisCent}, {axisPt}}); + registry.add("PtMC_pr", "", kTH2F, {{axisCent}, {axisPt}}); + registry.add("PtMC_sigpos", "", kTH2F, {{axisCent}, {axisPt}}); + registry.add("PtMC_signeg", "", kTH2F, {{axisCent}, {axisPt}}); + registry.add("PtMC_re", "", kTH2F, {{axisCent}, {axisPt}}); + } - // registry.add("numberOfRecoCollisions", "", - // {HistType::kTH1F, {{6, -0.5, 5.5}}}); - registry.add("hEventCounter_MC", "Event counter", kTH1F, {axisEvent}); - registry.add("zPos_MC", ";;Entries;", kTH1F, {axisZpos}); - registry.add("aV0Avsb", ";V0A amplitude;Impact parameter", kTH2F, - {{{nBinsAmpFV0, 0., maxAmpFV0}, {19, 0., 18.}}}); - registry.add("aT0Avsb", ";T0A amplitude; Impact parameter", kTH2F, - {{{nBinsAmpFT0, 0., maxAmpFT0}, {19, 0., 18.}}}); - registry.add("aT0Cvsb", ";T0C amplitude; Impact parameter", kTH2F, - {{{nBinsAmpFT0, 0., maxAmpFT0}, {19, -0.5, 18.5}}}); - registry.add("Pt_MC_tru_ch", ";p_{T};Entries;", kTH1F, {axisPt}); - registry.add("Pt_MC_tru_pi", ";p_{T};Entries;", kTH1F, {axisPt}); - registry.add("Pt_MC_tru_ka", ";p_{T};Entries;", kTH1F, {axisPt}); - registry.add("Pt_MC_tru_pr", ";p_{T};Entries;", kTH1F, {axisPt}); - registry.add("Pt_MC_tru_sigpos", "#Sigma^{+};p_{T};Entries;", kTH1F, - {axisPt}); - registry.add("Pt_MC_tru_signeg", "#Sigma^{-};p_{T};Entries;", kTH1F, - {axisPt}); - registry.add("Pt_MC_tru_re", "Remaining ch particles;p_{T};Entries;", - kTH1F, {axisPt}); + if (doprocessMCclosure) { + // registry.add("nRecColvsCent", "", kTH2F, {{6, -0.5, 5.5}, + // {{axisCent}}}); + registry.add( + PtCorrMCNchNames[0].data(), PtCorrTitles[0].data(), kTH2F, + {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); + registry.add( + PtCorrMCNchNames[1].data(), PtCorrTitles[1].data(), kTH2F, + {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); + registry.add( + PtCorrMCNchNames[2].data(), PtCorrTitles[2].data(), kTH2F, + {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); + registry.add( + PtCorrMCNchNames[3].data(), PtCorrTitles[3].data(), kTH2F, + {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); + registry.add("pP1MC", PsTitles[0].data(), kTProfile, + {{nBinsNch, -0.5, maxNch}}); + registry.add("pW1MC", WsTitles[0].data(), kTProfile, + {{nBinsNch, -0.5, maxNch}}); + registry.add("pP2MC", PsTitles[1].data(), kTProfile, + {{nBinsNch, -0.5, maxNch}}); + registry.add("pW2MC", WsTitles[1].data(), kTProfile, + {{nBinsNch, -0.5, maxNch}}); + registry.add("pP3MC", PsTitles[2].data(), kTProfile, + {{nBinsNch, -0.5, maxNch}}); + registry.add("pW3MC", WsTitles[2].data(), kTProfile, + {{nBinsNch, -0.5, maxNch}}); + registry.add("pP4MC", PsTitles[3].data(), kTProfile, + {{nBinsNch, -0.5, maxNch}}); + registry.add("pW4MC", WsTitles[3].data(), kTProfile, + {{nBinsNch, -0.5, maxNch}}); + registry.add( + PtCorrMCNchMCNames[0].data(), PtCorrTitles[0].data(), kTH2F, + {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); + registry.add( + PtCorrMCNchMCNames[1].data(), PtCorrTitles[1].data(), kTH2F, + {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); + registry.add( + PtCorrMCNchMCNames[2].data(), PtCorrTitles[2].data(), kTH2F, + {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); + registry.add( + PtCorrMCNchMCNames[3].data(), PtCorrTitles[3].data(), kTH2F, + {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); } ccdb->setURL(uRl.value); @@ -551,8 +633,8 @@ struct UccZdc { float pt{track.pt()}; double trkEff{efficiency->GetBinContent(efficiency->FindBin(pt))}; if (trkEff > 0.) { - pTs.push_back(pt); - wIs.push_back(trkEff); + pTs.emplace_back(pt); + wIs.emplace_back(trkEff); } } @@ -638,27 +720,70 @@ struct UccZdc { Preslice perMCCollision = aod::mcparticle::mcCollisionId; Preslice perCollision = aod::track::collisionId; - void processMC(aod::McCollisions const& mcCollisions, - o2::aod::BCsRun3 const& /*bcs*/, aod::Zdcs const& /*zdcs*/, - aod::FT0s const& /*ft0s*/, aod::FV0As const& /*fv0as*/, - o2::aod::SimCollisions const& collisions, - aod::McParticles const& mcParticles, - TheFilteredSimTracks const& simTracks) + void processpTEff(aod::McCollisions::iterator const& mccollision, + soa::SmallGroups const& collisions, + aod::McParticles const& mcParticles, + TheFilteredSimTracks const& simTracks) { - // Generated MC - for (const auto& mccollision : mcCollisions) { - registry.fill(HIST("hEventCounter_MC"), EvCutLabel::All); - // Z-vtx position cut - if (std::fabs(mccollision.posZ()) > posZcut) { + //----- MC reconstructed -----// + for (const auto& collision : collisions) { + // Event selection + if (!isEventSelected(collision)) + continue; + + // MC collision? + if (!collision.has_mcCollision()) continue; + + registry.fill(HIST("zPos"), collision.posZ()); + registry.fill(HIST("nRecColvsCent"), collisions.size(), + collision.centFT0C()); + + const auto& cent{collision.centFT0C()}; + registry.fill(HIST("T0Ccent"), cent); + + const auto& groupedTracks = + simTracks.sliceBy(perCollision, collision.globalIndex()); + for (const auto& track : groupedTracks) { + if (!track.has_mcParticle()) + continue; + + const auto& particle = track.mcParticle(); + registry.fill(HIST("Pt_all_ch"), cent, track.pt()); + registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); + + if (!particle.isPhysicalPrimary()) + continue; + + registry.fill(HIST("Pt_ch"), cent, track.pt()); + if (particle.pdgCode() == PDG_t::kPiPlus || + particle.pdgCode() == PDG_t::kPiMinus) { + registry.fill(HIST("Pt_pi"), cent, track.pt()); + } else if (particle.pdgCode() == PDG_t::kKPlus || + particle.pdgCode() == PDG_t::kKMinus) { + registry.fill(HIST("Pt_ka"), cent, track.pt()); + } else if (particle.pdgCode() == PDG_t::kProton || + particle.pdgCode() == PDG_t::kProtonBar) { + registry.fill(HIST("Pt_pr"), cent, track.pt()); + } else if (particle.pdgCode() == PDG_t::kSigmaPlus || + particle.pdgCode() == PDG_t::kSigmaBarMinus) { + registry.fill(HIST("Pt_sigpos"), cent, track.pt()); + } else if (particle.pdgCode() == PDG_t::kSigmaMinus || + particle.pdgCode() == PDG_t::kSigmaBarPlus) { + registry.fill(HIST("Pt_signeg"), cent, track.pt()); + } else { + registry.fill(HIST("Pt_re"), cent, track.pt()); + } } - registry.fill(HIST("zPos_MC"), mccollision.posZ()); - registry.fill(HIST("hEventCounter_MC"), EvCutLabel::VtxZ); - auto mcParticlesPerColl = - mcParticles.sliceBy(perMCCollision, mccollision.globalIndex()); + // Generated MC + registry.fill(HIST("hEventCounterMC"), EvCutLabel::All); + if (std::fabs(mccollision.posZ()) > posZcut) + continue; + registry.fill(HIST("zPosMC"), mccollision.posZ()); + registry.fill(HIST("hEventCounterMC"), EvCutLabel::VtxZ); - for (const auto& particle : mcParticlesPerColl) { + for (const auto& particle : mcParticles) { if (particle.eta() < minEta || particle.eta() > maxEta) { continue; } @@ -668,112 +793,156 @@ struct UccZdc { if (!particle.isPhysicalPrimary()) { continue; } - registry.fill(HIST("Pt_MC_tru_ch"), particle.pt()); + registry.fill(HIST("PtMC_ch"), cent, particle.pt()); if (particle.pdgCode() == PDG_t::kPiPlus || particle.pdgCode() == PDG_t::kPiMinus) { // pion - registry.fill(HIST("Pt_MC_tru_pi"), particle.pt()); + registry.fill(HIST("PtMC_pi"), cent, particle.pt()); } else if (particle.pdgCode() == PDG_t::kKPlus || particle.pdgCode() == PDG_t::kKMinus) { // kaon - registry.fill(HIST("Pt_MC_tru_ka"), particle.pt()); + registry.fill(HIST("PtMC_ka"), cent, particle.pt()); } else if (particle.pdgCode() == PDG_t::kProton || particle.pdgCode() == PDG_t::kProtonBar) { // proton - registry.fill(HIST("Pt_MC_tru_pr"), particle.pt()); + registry.fill(HIST("PtMC_pr"), cent, particle.pt()); } else if (particle.pdgCode() == PDG_t::kSigmaPlus || particle.pdgCode() == PDG_t::kSigmaBarMinus) { // positive sigma - registry.fill(HIST("Pt_MC_tru_sigpos"), particle.pt()); + registry.fill(HIST("PtMC_sigpos"), cent, particle.pt()); } else if (particle.pdgCode() == PDG_t::kSigmaMinus || particle.pdgCode() == PDG_t::kSigmaBarPlus) { // negative sigma - registry.fill(HIST("Pt_MC_tru_signeg"), particle.pt()); + registry.fill(HIST("PtMC_signeg"), cent, particle.pt()); } else { // rest - registry.fill(HIST("Pt_MC_tru_re"), particle.pt()); + registry.fill(HIST("PtMC_re"), cent, particle.pt()); } } } - // registry.fill(HIST("numberOfRecoCollisions"), collisions.size()); - // if (collisions.size() == 0 || collisions.size() > 1) { - // return; - // } + } + PROCESS_SWITCH(UccZdc, processpTEff, "Process pT Eff", false); + + void processMCclosure( + aod::McCollisions::iterator const& mccollision, + soa::SmallGroups const& collisions, + aod::McParticles const& mcParticles, + TheFilteredSimTracks const& simTracks) + { //----- MC reconstructed -----// for (const auto& collision : collisions) { // Event selection - if (!isEventSelected(collision)) { + if (!isEventSelected(collision)) continue; - } // MC collision? - if (!collision.has_mcCollision()) { + if (!collision.has_mcCollision()) continue; - } - const auto& mccollision = collision.mcCollision_as(); - const auto& foundBC = collision.foundBC_as(); - registry.fill(HIST("zPos"), collision.posZ()); - - float aT0A{0.0}; - float aT0C{0.0}; - float aV0A{0.0}; - float b{mccollision.impactParameter()}; - if (foundBC.has_ft0()) { - for (const auto& amplitude : foundBC.ft0().amplitudeA()) { - aT0A += amplitude; - } - for (const auto& amplitude : foundBC.ft0().amplitudeC()) { - aT0C += amplitude; - } - } else { - aT0A = aT0C = -999; - } - if (foundBC.has_fv0a()) { - for (const auto& amplitude : foundBC.fv0a().amplitude()) { - aV0A += amplitude; - } - } else { - aV0A = -999; - } - registry.fill(HIST("hT0C_cent_rec"), collision.centFT0C()); - registry.fill(HIST("aT0Avsb"), aT0A / 100., b); - registry.fill(HIST("aT0Cvsb"), aT0C / 100., b); - registry.fill(HIST("aV0Avsb"), aV0A / 100., b); + const auto& cent{collision.centFT0C()}; + registry.fill(HIST("T0Ccent"), cent); + registry.fill(HIST("zPos"), collision.posZ()); + // registry.fill(HIST("nRecColvsCent"), collisions.size(), cent); - const auto groupedTracks = + const auto& groupedTracks = simTracks.sliceBy(perCollision, collision.globalIndex()); + std::vector pTs; + std::vector wIs; + + // Calculates the event weight, W_k for (const auto& track : groupedTracks) { - if (!track.has_mcParticle()) { + // Track Selection + if (!track.isGlobalTrack()) continue; + + float pt{track.pt()}; + double trkEff{efficiency->GetBinContent(efficiency->FindBin(pt))}; + if (trkEff > 0.) { + pTs.emplace_back(pt); + wIs.emplace_back(trkEff); } - const auto particle = track.mcParticle(); + } - registry.fill(HIST("Pt_MC_rec_all_ch"), track.pt()); - if (!particle.isPhysicalPrimary()) { + const double nch{static_cast(pTs.size())}; + double p1, p2, p3, p4, w1, w2, w3, w4; + p1 = p2 = p3 = p4 = w1 = w2 = w3 = w4 = 0.0; + getMoments(pTs, wIs, p1, w1, p2, w2, p3, w3, p4, w4); + + double oneParCorr{p1 / w1}; + double twoParCorr{(std::pow(p1, 2.) - p2) / (std::pow(w1, 2.) - w2)}; + double threeParCorr{(std::pow(p1, 3.) - 3. * p2 * p1 + 2. * p3) / + (std::pow(w1, 3.) - 3. * w2 * w1 + 2. * w3)}; + double fourParCorr{(std::pow(p1, 4.) - 6. * p2 * std::pow(p1, 2.) + + 3. * std::pow(p2, 2.) + 8 * p3 * p1 - 6. * p4) / + (std::pow(w1, 4.) - 6. * w2 * std::pow(w1, 2.) + + 3. * std::pow(w2, 2.) + 8 * w3 * w1 - 6. * w4)}; + + registry.fill(HIST("NchvsOneParCorr"), nch, oneParCorr); + registry.fill(HIST("NchvsTwoParCorr"), nch, twoParCorr); + registry.fill(HIST("NchvsThreeParCorr"), nch, threeParCorr); + registry.fill(HIST("NchvsFourParCorr"), nch, fourParCorr); + registry.fill(HIST("pP1"), nch, w1 * oneParCorr); + registry.fill(HIST("pW1"), nch, w1); + registry.fill(HIST("pP2"), nch, w2 * twoParCorr); + registry.fill(HIST("pW2"), nch, w2); + registry.fill(HIST("pP3"), nch, w3 * threeParCorr); + registry.fill(HIST("pW3"), nch, w3); + registry.fill(HIST("pP4"), nch, w4 * fourParCorr); + registry.fill(HIST("pW4"), nch, w4); + + // Generated MC + if (std::fabs(mccollision.posZ()) > posZcut) + continue; + + std::vector pTsMC; + std::vector wIsMC; + + // Calculates the event weight, W_k + for (const auto& particle : mcParticles) { + if (particle.eta() < minEta || particle.eta() > maxEta) + continue; + if (particle.pt() < minPt || particle.pt() > maxPt) + continue; + if (!particle.isPhysicalPrimary()) continue; - } - registry.fill(HIST("EtaVsPhi_MC_rec"), track.eta(), track.phi()); - registry.fill(HIST("Pt_MC_rec_ch"), track.pt()); - if (particle.pdgCode() == PDG_t::kPiPlus || - particle.pdgCode() == PDG_t::kPiMinus) { - registry.fill(HIST("Pt_MC_rec_pi"), track.pt()); - } else if (particle.pdgCode() == PDG_t::kKPlus || - particle.pdgCode() == PDG_t::kKMinus) { - registry.fill(HIST("Pt_MC_rec_ka"), track.pt()); - } else if (particle.pdgCode() == PDG_t::kProton || - particle.pdgCode() == PDG_t::kProtonBar) { - registry.fill(HIST("Pt_MC_rec_pr"), track.pt()); - } else if (particle.pdgCode() == PDG_t::kSigmaPlus || - particle.pdgCode() == PDG_t::kSigmaBarMinus) { - registry.fill(HIST("Pt_MC_rec_sigpos"), track.pt()); - } else if (particle.pdgCode() == PDG_t::kSigmaMinus || - particle.pdgCode() == PDG_t::kSigmaBarPlus) { - registry.fill(HIST("Pt_MC_rec_signeg"), track.pt()); - } else { - registry.fill(HIST("Pt_MC_rec_re"), track.pt()); - } + float pt{particle.pt()}; + pTsMC.emplace_back(pt); + wIsMC.emplace_back(1.); } + + const double nchMC{static_cast(pTsMC.size())}; + double p1MC, p2MC, p3MC, p4MC, w1MC, w2MC, w3MC, w4MC; + p1MC = p2MC = p3MC = p4MC = w1MC = w2MC = w3MC = w4MC = 0.0; + getMoments(pTsMC, wIsMC, p1MC, w1MC, p2MC, w2MC, p3MC, w3MC, p4MC, w4MC); + + double oneParCorrMC{p1MC / w1MC}; + double twoParCorrMC{(std::pow(p1MC, 2.) - p2MC) / + (std::pow(w1MC, 2.) - w2MC)}; + double threeParCorrMC{ + (std::pow(p1MC, 3.) - 3. * p2MC * p1MC + 2. * p3MC) / + (std::pow(w1MC, 3.) - 3. * w2MC * w1MC + 2. * w3MC)}; + double fourParCorrMC{ + (std::pow(p1MC, 4.) - 6. * p2MC * std::pow(p1MC, 2.) + + 3. * std::pow(p2MC, 2.) + 8 * p3MC * p1MC - 6. * p4MC) / + (std::pow(w1MC, 4.) - 6. * w2MC * std::pow(w1MC, 2.) + + 3. * std::pow(w2MC, 2.) + 8 * w3MC * w1MC - 6. * w4MC)}; + + registry.fill(HIST("NchvsOneParCorrMC"), nch, oneParCorrMC); + registry.fill(HIST("NchvsTwoParCorrMC"), nch, twoParCorrMC); + registry.fill(HIST("NchvsThreeParCorrMC"), nch, threeParCorrMC); + registry.fill(HIST("NchvsFourParCorrMC"), nch, fourParCorrMC); + registry.fill(HIST("pP1MC"), nch, w1MC * oneParCorrMC); + registry.fill(HIST("pW1MC"), nch, w1MC); + registry.fill(HIST("pP2MC"), nch, w2MC * twoParCorrMC); + registry.fill(HIST("pW2MC"), nch, w2MC); + registry.fill(HIST("pP3MC"), nch, w3MC * threeParCorrMC); + registry.fill(HIST("pW3MC"), nch, w3MC); + registry.fill(HIST("pP4MC"), nch, w4MC * fourParCorrMC); + registry.fill(HIST("pW4MC"), nch, w4MC); + registry.fill(HIST("NchMCvsOneParCorrMC"), nchMC, oneParCorrMC); + registry.fill(HIST("NchMCvsTwoParCorrMC"), nchMC, twoParCorrMC); + registry.fill(HIST("NchMCvsThreeParCorrMC"), nchMC, threeParCorrMC); + registry.fill(HIST("NchMCvsFourParCorrMC"), nchMC, fourParCorrMC); } } - PROCESS_SWITCH(UccZdc, processMC, "Process MC", false); + PROCESS_SWITCH(UccZdc, processMCclosure, "Process MC closure", false); // Single-Track Selection // template From 4da2fefcea9e25c99b8017e0d6d01adf250b378d Mon Sep 17 00:00:00 2001 From: jaelpark Date: Sat, 1 Mar 2025 18:55:08 +0800 Subject: [PATCH 0484/1650] [PWGCF] Reduce correlations code duplication (#10205) --- PWGCF/TableProducer/filter2Prong.cxx | 86 ++++++++++++---------------- PWGCF/Tasks/correlations.cxx | 73 ++++++----------------- 2 files changed, 53 insertions(+), 106 deletions(-) diff --git a/PWGCF/TableProducer/filter2Prong.cxx b/PWGCF/TableProducer/filter2Prong.cxx index 240f49e504c..1adeb2bceac 100644 --- a/PWGCF/TableProducer/filter2Prong.cxx +++ b/PWGCF/TableProducer/filter2Prong.cxx @@ -8,6 +8,7 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +#include #include #include "Framework/runDataProcessing.h" @@ -39,10 +40,17 @@ struct Filter2Prong { Produces output2ProngTracks; Produces output2ProngTrackmls; + std::vector mlvecd{}; + std::vector mlvecdbar{}; + using HFCandidates = soa::Join; using HFCandidatesML = soa::Join; - void processDataML(aod::Collisions::iterator const&, aod::BCsWithTimestamps const&, aod::CFCollRefs const& cfcollisions, aod::CFTrackRefs const& cftracks, HFCandidatesML const& candidates) + template + using HasMLProb = decltype(std::declval().mlProbD0()); + + template + void processDataT(aod::Collisions::iterator const&, aod::BCsWithTimestamps const&, aod::CFCollRefs const& cfcollisions, aod::CFTrackRefs const& cftracks, HFCandidatesType const& candidates) { if (cfcollisions.size() <= 0 || cftracks.size() <= 0) return; // rejected collision @@ -68,71 +76,49 @@ struct Filter2Prong { if (cfgYMax >= 0.0f && std::abs(hfHelper.yD0(c)) > cfgYMax) continue; - std::vector mlvecd{}; - std::vector mlvecdbar{}; - if (c.isSelD0() > 0) { output2ProngTracks(cfcollisions.begin().globalIndex(), prongCFId[0], prongCFId[1], c.pt(), c.eta(), c.phi(), hfHelper.invMassD0ToPiK(c), aod::cf2prongtrack::D0ToPiK); - for (float val : c.mlProbD0()) { - mlvecd.push_back(val); + if constexpr (std::experimental::is_detected::value) { + mlvecd.clear(); + for (float val : c.mlProbD0()) { + mlvecd.push_back(val); + } + mlvecdbar.clear(); + for (float val : c.mlProbD0bar()) { + mlvecdbar.push_back(val); + } + output2ProngTrackmls(cfcollisions.begin().globalIndex(), mlvecd, mlvecdbar); } - for (float val : c.mlProbD0bar()) { - mlvecdbar.push_back(val); - } - output2ProngTrackmls(cfcollisions.begin().globalIndex(), mlvecd, mlvecdbar); } - mlvecd.clear(); - mlvecdbar.clear(); - if (c.isSelD0bar() > 0) { output2ProngTracks(cfcollisions.begin().globalIndex(), prongCFId[0], prongCFId[1], c.pt(), c.eta(), c.phi(), hfHelper.invMassD0barToKPi(c), aod::cf2prongtrack::D0barToKPi); - for (float val : c.mlProbD0()) { - mlvecd.push_back(val); + if constexpr (std::experimental::is_detected::value) { + mlvecd.clear(); + for (float val : c.mlProbD0()) { + mlvecd.push_back(val); + } + mlvecdbar.clear(); + for (float val : c.mlProbD0bar()) { + mlvecdbar.push_back(val); + } + output2ProngTrackmls(cfcollisions.begin().globalIndex(), mlvecd, mlvecdbar); } - for (float val : c.mlProbD0bar()) { - mlvecdbar.push_back(val); - } - output2ProngTrackmls(cfcollisions.begin().globalIndex(), mlvecd, mlvecdbar); } } } + + void processDataML(aod::Collisions::iterator const& cols, aod::BCsWithTimestamps const& bcs, aod::CFCollRefs const& cfcollisions, aod::CFTrackRefs const& cftracks, HFCandidatesML const& candidates) + { + processDataT(cols, bcs, cfcollisions, cftracks, candidates); + } PROCESS_SWITCH(Filter2Prong, processDataML, "Process data D0 candidates with ML", false); - void processData(aod::Collisions::iterator const&, aod::BCsWithTimestamps const&, aod::CFCollRefs const& cfcollisions, aod::CFTrackRefs const& cftracks, HFCandidates const& candidates) + void processData(aod::Collisions::iterator const& cols, aod::BCsWithTimestamps const& bcs, aod::CFCollRefs const& cfcollisions, aod::CFTrackRefs const& cftracks, HFCandidates const& candidates) { - if (cfcollisions.size() <= 0 || cftracks.size() <= 0) - return; // rejected collision - if (cfgVerbosity > 0 && candidates.size() > 0) - LOGF(info, "Candidates for collision: %lu, cfcollisions: %lu, CFTracks: %lu", candidates.size(), cfcollisions.size(), cftracks.size()); - for (auto& c : candidates) { - int prongCFId[2] = {-1, -1}; - for (auto& cftrack : cftracks) { - if (c.prong0Id() == cftrack.trackId()) { - prongCFId[0] = cftrack.globalIndex(); - break; - } - } - for (auto& cftrack : cftracks) { - if (c.prong1Id() == cftrack.trackId()) { - prongCFId[1] = cftrack.globalIndex(); - break; - } - } - // look-up the collision id - if ((c.hfflag() & (1 << aod::hf_cand_2prong::DecayType::D0ToPiK)) == 0) - continue; - if (cfgYMax >= 0.0f && std::abs(hfHelper.yD0(c)) > cfgYMax) - continue; - if (c.isSelD0() > 0) - output2ProngTracks(cfcollisions.begin().globalIndex(), - prongCFId[0], prongCFId[1], c.pt(), c.eta(), c.phi(), hfHelper.invMassD0ToPiK(c), aod::cf2prongtrack::D0ToPiK); - if (c.isSelD0bar() > 0) - output2ProngTracks(cfcollisions.begin().globalIndex(), - prongCFId[0], prongCFId[1], c.pt(), c.eta(), c.phi(), hfHelper.invMassD0barToKPi(c), aod::cf2prongtrack::D0barToKPi); - } + processDataT(cols, bcs, cfcollisions, cftracks, candidates); } PROCESS_SWITCH(Filter2Prong, processData, "Process data D0 candidates", true); }; // struct diff --git a/PWGCF/Tasks/correlations.cxx b/PWGCF/Tasks/correlations.cxx index 8cb9bc7f877..ad875af5ee5 100644 --- a/PWGCF/Tasks/correlations.cxx +++ b/PWGCF/Tasks/correlations.cxx @@ -675,7 +675,8 @@ struct CorrelationTask { } PROCESS_SWITCH(CorrelationTask, processSame2ProngDerived, "Process same event on derived data", false); - void processSame2Prong2Prong(DerivedCollisions::iterator const& collision, soa::Filtered const& p2tracks) + template + void processSame2Prong2ProngT(DerivedCollisions::iterator const& collision, p2type const& p2tracks) { BinningTypeDerived configurableBinningDerived{{axisVertex, axisMultiplicity}, true}; // true is for 'ignore overflows' (true by default). Underflows and overflows will have bin -1. if (cfgVerbosity > 0) { @@ -697,29 +698,16 @@ struct CorrelationTask { fillCorrelations(same, p2tracks, p2tracks, multiplicity, collision.posZ(), 0, 1.0f); } } + + void processSame2Prong2Prong(DerivedCollisions::iterator const& collision, soa::Filtered const& p2tracks) + { + processSame2Prong2ProngT(collision, p2tracks); + } PROCESS_SWITCH(CorrelationTask, processSame2Prong2Prong, "Process same event on derived data", false); void processSame2Prong2ProngML(DerivedCollisions::iterator const& collision, soa::Filtered> const& p2tracks) { - BinningTypeDerived configurableBinningDerived{{axisVertex, axisMultiplicity}, true}; // true is for 'ignore overflows' (true by default). Underflows and overflows will have bin -1. - if (cfgVerbosity > 0) { - LOGF(info, "processSame2ProngDerived: 2-prong candidates: %d | Vertex: %.1f | Multiplicity/Centrality: %.1f", p2tracks.size(), collision.posZ(), collision.multiplicity()); - } - loadEfficiency(collision.timestamp()); - - const auto multiplicity = collision.multiplicity(); - - int bin = configurableBinningDerived.getBin({collision.posZ(), collision.multiplicity()}); - registry.fill(HIST("eventcount_same"), bin); - fillQA(collision, multiplicity, p2tracks, p2tracks); - - same->fillEvent(multiplicity, CorrelationContainer::kCFStepReconstructed); - fillCorrelations(same, p2tracks, p2tracks, multiplicity, collision.posZ(), 0, 1.0f); - - if (cfg.mEfficiencyAssociated || cfg.mEfficiencyTrigger) { - same->fillEvent(multiplicity, CorrelationContainer::kCFStepCorrected); - fillCorrelations(same, p2tracks, p2tracks, multiplicity, collision.posZ(), 0, 1.0f); - } + processSame2Prong2ProngT(collision, p2tracks); } PROCESS_SWITCH(CorrelationTask, processSame2Prong2ProngML, "Process same event on derived data", false); @@ -847,12 +835,13 @@ struct CorrelationTask { } PROCESS_SWITCH(CorrelationTask, processMixed2ProngDerived, "Process mixed events on derived data", false); - void processMixed2Prong2Prong(DerivedCollisions const& collisions, soa::Filtered const& p2tracks) + template + void processMixed2Prong2ProngT(DerivedCollisions const& collisions, p2type const& p2tracks) { BinningTypeDerived configurableBinningDerived{{axisVertex, axisMultiplicity}, true}; // true is for 'ignore overflows' (true by default). Underflows and overflows will have bin -1. // Strictly upper categorised collisions, for cfgNoMixedEvents combinations per bin, skipping those in entry -1 auto tracksTuple = std::make_tuple(p2tracks); - SameKindPair, BinningTypeDerived> pairs{configurableBinningDerived, cfgNoMixedEvents, -1, collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip + SameKindPair pairs{configurableBinningDerived, cfgNoMixedEvents, -1, collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip for (auto it = pairs.begin(); it != pairs.end(); it++) { auto& [collision1, tracks1, collision2, tracks2] = *it; @@ -884,44 +873,16 @@ struct CorrelationTask { } } } + + void processMixed2Prong2Prong(DerivedCollisions const& collisions, soa::Filtered const& p2tracks) + { + processMixed2Prong2ProngT(collisions, p2tracks); + } PROCESS_SWITCH(CorrelationTask, processMixed2Prong2Prong, "Process mixed events on derived data", false); void processMixed2Prong2ProngML(DerivedCollisions const& collisions, soa::Filtered> const& p2tracks) { - BinningTypeDerived configurableBinningDerived{{axisVertex, axisMultiplicity}, true}; // true is for 'ignore overflows' (true by default). Underflows and overflows will have bin -1. - // Strictly upper categorised collisions, for cfgNoMixedEvents combinations per bin, skipping those in entry -1 - auto tracksTuple = std::make_tuple(p2tracks); - SameKindPair>, BinningTypeDerived> pairs{configurableBinningDerived, cfgNoMixedEvents, -1, collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip - - for (auto it = pairs.begin(); it != pairs.end(); it++) { - auto& [collision1, tracks1, collision2, tracks2] = *it; - int bin = configurableBinningDerived.getBin({collision1.posZ(), collision1.multiplicity()}); - float eventWeight = 1.0f / it.currentWindowNeighbours(); - int field = 0; - if (cfgTwoTrackCut > 0) { - field = getMagneticField(collision1.timestamp()); - } - - if (cfgVerbosity > 0) { - LOGF(info, "processMixedDerived: Mixed collisions bin: %d pair: [%d, %d] %d (%.3f, %.3f), %d (%.3f, %.3f)", bin, it.isNewWindow(), it.currentWindowNeighbours(), collision1.globalIndex(), collision1.posZ(), collision1.multiplicity(), collision2.globalIndex(), collision2.posZ(), collision2.multiplicity()); - } - - if (it.isNewWindow()) { - loadEfficiency(collision1.timestamp()); - mixed->fillEvent(collision1.multiplicity(), CorrelationContainer::kCFStepReconstructed); - } - - // LOGF(info, "Tracks: %d and %d entries", tracks1.size(), tracks2.size()); - - registry.fill(HIST("eventcount_mixed"), bin); - fillCorrelations(mixed, tracks1, tracks2, collision1.multiplicity(), collision1.posZ(), field, eventWeight); - if (cfg.mEfficiencyAssociated || cfg.mEfficiencyTrigger) { - if (it.isNewWindow()) { - mixed->fillEvent(collision1.multiplicity(), CorrelationContainer::kCFStepCorrected); - } - fillCorrelations(mixed, tracks1, tracks2, collision1.multiplicity(), collision1.posZ(), field, eventWeight); - } - } + processMixed2Prong2ProngT(collisions, p2tracks); } PROCESS_SWITCH(CorrelationTask, processMixed2Prong2ProngML, "Process mixed events on derived data", false); From 3c3185bac98b47ff0a081e1c3bfed382a8f92948 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Sat, 1 Mar 2025 20:01:39 +0900 Subject: [PATCH 0485/1650] [PWGEM/Photon] update prefilterPhoton.cxx (#10257) --- PWGEM/PhotonMeson/Core/DalitzEECut.cxx | 50 +-- PWGEM/PhotonMeson/Core/DalitzEECut.h | 34 +- PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h | 22 +- PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h | 22 +- PWGEM/PhotonMeson/DataModel/gammaTables.h | 3 +- .../skimmerPrimaryElectronFromDalitzEE.cxx | 27 +- .../Tasks/Pi0EtaToGammaGammaMCPCMPCM.cxx | 8 +- PWGEM/PhotonMeson/Tasks/pcmQC.cxx | 3 +- PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx | 3 +- PWGEM/PhotonMeson/Tasks/prefilterPhoton.cxx | 424 ++++++++++++++---- PWGEM/PhotonMeson/Utils/PairUtilities.h | 14 +- 11 files changed, 455 insertions(+), 155 deletions(-) diff --git a/PWGEM/PhotonMeson/Core/DalitzEECut.cxx b/PWGEM/PhotonMeson/Core/DalitzEECut.cxx index b82b7460dfc..c5a42fdad4f 100644 --- a/PWGEM/PhotonMeson/Core/DalitzEECut.cxx +++ b/PWGEM/PhotonMeson/Core/DalitzEECut.cxx @@ -13,6 +13,9 @@ // Class for dilepton Cut // +#include +#include + #include "Framework/Logger.h" #include "PWGEM/PhotonMeson/Core/DalitzEECut.h" @@ -138,6 +141,12 @@ void DalitzEECut::SetTPCNsigmaPiRange(float min, float max) LOG(info) << "DalitzEE Cut, set TPC n sigma Pi range: " << mMinTPCNsigmaPi << " - " << mMaxTPCNsigmaPi; } +void DalitzEECut::SetTOFNsigmaElRange(float min, float max) +{ + mMinTOFNsigmaEl = min; + mMaxTOFNsigmaEl = max; + LOG(info) << "DalitzEE Cut, set TOF n sigma El range: " << mMinTOFNsigmaEl << " - " << mMaxTOFNsigmaEl; +} void DalitzEECut::RequireITSibAny(bool flag) { mRequireITSibAny = flag; @@ -148,43 +157,14 @@ void DalitzEECut::RequireITSib1st(bool flag) mRequireITSib1st = flag; LOG(info) << "DalitzEE Cut, require ITS ib 1st: " << mRequireITSib1st; } +void DalitzEECut::SetChi2TOF(float min, float max) +{ + mMinChi2TOF = min; + mMaxChi2TOF = max; + LOG(info) << "Dielectron Cut, set chi2 TOF range: " << mMinChi2TOF << " - " << mMaxChi2TOF; +} void DalitzEECut::SetPIDScheme(int scheme) { mPIDScheme = scheme; LOG(info) << "DalitzEE Cut, PID scheme: " << static_cast(mPIDScheme); } - -// void DalitzEECut::print() const -//{ -// LOG(info) << "Dalitz EE Cut:"; -// for (int i = 0; i < static_cast(DalitzEECuts::kNCuts); i++) { -// switch (static_cast(i)) { -// case DalitzEECuts::kTrackPtRange: -// LOG(info) << mCutNames[i] << " in [" << mMinTrackPt << ", " << mMaxTrackPt << "]"; -// break; -// case DalitzEECuts::kTrackEtaRange: -// LOG(info) << mCutNames[i] << " in [" << mMinTrackEta << ", " << mMaxTrackEta << "]"; -// break; -// case DalitzEECuts::kTPCNCls: -// LOG(info) << mCutNames[i] << " > " << mMinNClustersTPC; -// break; -// case DalitzEECuts::kTPCCrossedRows: -// LOG(info) << mCutNames[i] << " > " << mMinNCrossedRowsTPC; -// break; -// case DalitzEECuts::kTPCCrossedRowsOverNCls: -// LOG(info) << mCutNames[i] << " > " << mMinNCrossedRowsOverFindableClustersTPC; -// break; -// case DalitzEECuts::kTPCChi2NDF: -// LOG(info) << mCutNames[i] << " < " << mMaxChi2PerClusterTPC; -// break; -// case DalitzEECuts::kDCAxy: -// LOG(info) << mCutNames[i] << " < " << mMaxDcaXY; -// break; -// case DalitzEECuts::kDCAz: -// LOG(info) << mCutNames[i] << " < " << mMaxDcaZ; -// break; -// default: -// LOG(fatal) << "Cut unknown!"; -// } -// } -// } diff --git a/PWGEM/PhotonMeson/Core/DalitzEECut.h b/PWGEM/PhotonMeson/Core/DalitzEECut.h index 5ac38396976..13851adc298 100644 --- a/PWGEM/PhotonMeson/Core/DalitzEECut.h +++ b/PWGEM/PhotonMeson/Core/DalitzEECut.h @@ -67,7 +67,8 @@ class DalitzEECut : public TNamed enum class PIDSchemes : int { kUnDef = -1, - kTPConly = 0, + kTOFif = 0, + kTPConly = 1, }; template @@ -184,6 +185,9 @@ class DalitzEECut : public TNamed case static_cast(PIDSchemes::kTPConly): return PassTPConly(track); + case static_cast(PIDSchemes::kTOFif): + return PassTOFif(track); + case static_cast(PIDSchemes::kUnDef): return true; @@ -200,6 +204,15 @@ class DalitzEECut : public TNamed return is_el_included_TPC && is_pi_excluded_TPC; } + template + bool PassTOFif(T const& track) const + { + bool is_el_included_TPC = mMinTPCNsigmaEl < track.tpcNSigmaEl() && track.tpcNSigmaEl() < mMaxTPCNsigmaEl; + bool is_pi_excluded_TPC = track.tpcNSigmaPi() < mMinTPCNsigmaPi || mMaxTPCNsigmaPi < track.tpcNSigmaPi(); + bool is_el_included_TOF = track.hasTOF() ? (mMinTOFNsigmaEl < track.tofNSigmaEl() && track.tofNSigmaEl() < mMaxTOFNsigmaEl && track.tofChi2() < mMaxChi2TOF) : true; + return is_el_included_TPC && is_pi_excluded_TPC && is_el_included_TOF; + } + template bool IsSelectedTrack(T const& track, const DalitzEECuts& cut) const { @@ -223,10 +236,10 @@ class DalitzEECut : public TNamed return mMinChi2PerClusterTPC < track.tpcChi2NCl() && track.tpcChi2NCl() < mMaxChi2PerClusterTPC; case DalitzEECuts::kDCAxy: - return abs(track.dcaXY()) <= ((mMaxDcaXYPtDep) ? mMaxDcaXYPtDep(track.pt()) : mMaxDcaXY); + return std::fabs(track.dcaXY()) <= ((mMaxDcaXYPtDep) ? mMaxDcaXYPtDep(track.pt()) : mMaxDcaXY); case DalitzEECuts::kDCAz: - return abs(track.dcaZ()) <= mMaxDcaZ; + return std::fabs(track.dcaZ()) <= mMaxDcaZ; case DalitzEECuts::kITSNCls: return mMinNClustersITS <= track.itsNCls() && track.itsNCls() <= mMaxNClustersITS; @@ -258,10 +271,12 @@ class DalitzEECut : public TNamed void SetNClustersITS(int min, int max); void SetChi2PerClusterITS(float min, float max); void SetMeanClusterSizeITS(float min, float max); + void SetChi2TOF(float min, float max); void SetPIDScheme(int scheme); - void SetTPCNsigmaElRange(float min = -1e+10, float max = 1e+10); - void SetTPCNsigmaPiRange(float min = -1e+10, float max = 1e+10); + void SetTPCNsigmaElRange(float min, float max); + void SetTPCNsigmaPiRange(float min, float max); + void SetTOFNsigmaElRange(float min, float max); void RequireITSibAny(bool flag); void RequireITSib1st(bool flag); @@ -274,9 +289,6 @@ class DalitzEECut : public TNamed // Getters bool IsPhotonConversionSelected() const { return mSelectPC; } - /// @brief Print the track selection - // void print() const; - private: static const std::pair> its_ib_any_Requirement; static const std::pair> its_ib_1st_Requirement; @@ -308,13 +320,13 @@ class DalitzEECut : public TNamed std::function mMaxDcaXYPtDep{}; // max dca in xy plane as function of pT bool mApplyPhiV{true}; float mMinMeanClusterSizeITS{-1e10f}, mMaxMeanClusterSizeITS{1e10f}; // max x cos(Lmabda) + float mMinChi2TOF{-1e10f}, mMaxChi2TOF{1e10f}; // max tof chi2 per // pid cuts int mPIDScheme{-1}; float mMinTPCNsigmaEl{-1e+10}, mMaxTPCNsigmaEl{+1e+10}; - float mMinTPCNsigmaPi{-1e+10}, mMaxTPCNsigmaPi{+1e+10}; - - o2::ml::OnnxModel* mPIDModel{nullptr}; + float mMinTPCNsigmaPi{0}, mMaxTPCNsigmaPi{0}; + float mMinTOFNsigmaEl{-1e+10}, mMaxTOFNsigmaEl{+1e+10}; ClassDef(DalitzEECut, 1); }; diff --git a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h index 17435a959d1..cab1f820e26 100644 --- a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h +++ b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h @@ -72,10 +72,10 @@ using namespace o2::aod::pwgem::dilepton::utils; using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; -using MyV0Photons = soa::Join; +using MyV0Photons = soa::Filtered>; using MyV0Photon = MyV0Photons::iterator; -using MyPrimaryElectrons = soa::Join; +using MyPrimaryElectrons = soa::Filtered>; using MyPrimaryElectron = MyPrimaryElectrons::iterator; using MyEMCClusters = soa::Join; @@ -133,6 +133,8 @@ struct Pi0EtaToGammaGamma { Configurable cfg_require_v0_with_tpconly{"cfg_require_v0_with_tpconly", false, "flag to select V0s with TPConly tracks"}; Configurable cfg_require_v0_on_wwire_ib{"cfg_require_v0_on_wwire_ib", false, "flag to select V0s on W wires ITSib"}; Configurable cfg_min_pt_v0{"cfg_min_pt_v0", 0.1, "min pT for v0 photons at PV"}; + Configurable cfg_max_pt_v0{"cfg_max_pt_v0", 1e+10, "max pT for v0 photons at PV"}; + Configurable cfg_min_eta_v0{"cfg_min_eta_v0", -0.8, "min eta for v0 photons at PV"}; Configurable cfg_max_eta_v0{"cfg_max_eta_v0", 0.8, "max eta for v0 photons at PV"}; Configurable cfg_min_v0radius{"cfg_min_v0radius", 4.0, "min v0 radius"}; Configurable cfg_max_v0radius{"cfg_max_v0radius", 90.0, "max v0 radius"}; @@ -143,6 +145,7 @@ struct Pi0EtaToGammaGamma { Configurable cfg_max_chi2kf{"cfg_max_chi2kf", 1e+10, "max chi2/ndf with KF"}; Configurable cfg_require_v0_with_correct_xz{"cfg_require_v0_with_correct_xz", true, "flag to select V0s with correct xz"}; Configurable cfg_reject_v0_on_itsib{"cfg_reject_v0_on_itsib", true, "flag to reject V0s on ITSib"}; + Configurable cfg_apply_cuts_from_prefilter_derived{"cfg_apply_cuts_from_prefilter_derived", false, "flag to apply prefilter to V0"}; Configurable cfg_min_ncluster_tpc{"cfg_min_ncluster_tpc", 10, "min ncluster tpc"}; Configurable cfg_min_ncrossedrows{"cfg_min_ncrossedrows", 40, "min ncrossed rows"}; @@ -160,7 +163,6 @@ struct Pi0EtaToGammaGamma { Configurable cfg_min_mass{"cfg_min_mass", 0.0, "min mass"}; Configurable cfg_max_mass{"cfg_max_mass", 0.1, "max mass"}; Configurable cfg_apply_phiv{"cfg_apply_phiv", true, "flag to apply phiv cut"}; - Configurable cfg_apply_pf{"cfg_apply_pf", false, "flag to apply phiv prefilter"}; Configurable cfg_require_itsib_any{"cfg_require_itsib_any", false, "flag to require ITS ib any hits"}; Configurable cfg_require_itsib_1st{"cfg_require_itsib_1st", true, "flag to require ITS ib 1st hit"}; Configurable cfg_phiv_slope{"cfg_phiv_slope", 0.0185, "slope for m vs. phiv"}; @@ -173,10 +175,11 @@ struct Pi0EtaToGammaGamma { Configurable cfg_min_ncrossedrows{"cfg_min_ncrossedrows", 70, "min ncrossed rows"}; Configurable cfg_max_chi2tpc{"cfg_max_chi2tpc", 4.0, "max chi2/NclsTPC"}; Configurable cfg_max_chi2its{"cfg_max_chi2its", 5.0, "max chi2/NclsITS"}; - Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 1.0, "max dca XY for single track in cm"}; - Configurable cfg_max_dcaz{"cfg_max_dcaz", 1.0, "max dca Z for single track in cm"}; + Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 0.05, "max dca XY for single track in cm"}; + Configurable cfg_max_dcaz{"cfg_max_dcaz", 0.05, "max dca Z for single track in cm"}; + Configurable cfg_apply_cuts_from_prefilter_derived{"cfg_apply_cuts_from_prefilter_derived", false, "flag to apply prefilter to electron"}; - Configurable cfg_pid_scheme{"cfg_pid_scheme", static_cast(DalitzEECut::PIDSchemes::kTPConly), "pid scheme [kTPConly : 0]"}; + Configurable cfg_pid_scheme{"cfg_pid_scheme", static_cast(DalitzEECut::PIDSchemes::kTOFif), "pid scheme [kTOFif : 0, kTPConly : 1]"}; Configurable cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -2.0, "min. TPC n sigma for electron inclusion"}; Configurable cfg_max_TPCNsigmaEl{"cfg_max_TPCNsigmaEl", +3.0, "max. TPC n sigma for electron inclusion"}; Configurable cfg_min_TPCNsigmaPi{"cfg_min_TPCNsigmaPi", -3.0, "min. TPC n sigma for pion exclusion"}; @@ -340,8 +343,8 @@ struct Pi0EtaToGammaGamma { fV0PhotonCut = V0PhotonCut("fV0PhotonCut", "fV0PhotonCut"); // for v0 - fV0PhotonCut.SetV0PtRange(pcmcuts.cfg_min_pt_v0, 1e10f); - fV0PhotonCut.SetV0EtaRange(-pcmcuts.cfg_max_eta_v0, +pcmcuts.cfg_max_eta_v0); + fV0PhotonCut.SetV0PtRange(pcmcuts.cfg_min_pt_v0, pcmcuts.cfg_max_pt_v0); + fV0PhotonCut.SetV0EtaRange(pcmcuts.cfg_min_eta_v0, pcmcuts.cfg_max_eta_v0); fV0PhotonCut.SetMinCosPA(pcmcuts.cfg_min_cospa); fV0PhotonCut.SetMaxPCA(pcmcuts.cfg_max_pca); fV0PhotonCut.SetMaxChi2KF(pcmcuts.cfg_max_chi2kf); @@ -873,6 +876,9 @@ struct Pi0EtaToGammaGamma { Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); using FilteredMyCollisions = soa::Filtered; + Filter prefilter_pcm = ifnode(pcmcuts.cfg_apply_cuts_from_prefilter_derived.node(), o2::aod::v0photonkf::pfbderived == static_cast(0), true); + Filter prefilter_primaryelectron = ifnode(dileptoncuts.cfg_apply_cuts_from_prefilter_derived.node(), o2::aod::emprimaryelectron::pfbderived == static_cast(0), true); + int ndf = 0; void processAnalysis(FilteredMyCollisions const& collisions, Types const&... args) { diff --git a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h index b273cc7bc65..b7b90e0f382 100644 --- a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h +++ b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h @@ -62,7 +62,7 @@ using MyCollision = MyCollisions::iterator; using MyMCCollisions = soa::Join; using MyMCCollision = MyMCCollisions::iterator; -using MyV0Photons = soa::Join; +using MyV0Photons = soa::Filtered>; using MyV0Photon = MyV0Photons::iterator; using MyEMCClusters = soa::Join; @@ -74,7 +74,7 @@ using MyPHOSCluster = MyEMCClusters::iterator; using MyMCV0Legs = soa::Join; using MyMCV0Leg = MyMCV0Legs::iterator; -using MyMCElectrons = soa::Join; +using MyMCElectrons = soa::Filtered>; using MyMCElectron = MyMCElectrons::iterator; template @@ -120,6 +120,8 @@ struct Pi0EtaToGammaGammaMC { Configurable cfg_require_v0_with_tpconly{"cfg_require_v0_with_tpconly", false, "flag to select V0s with TPConly tracks"}; Configurable cfg_require_v0_on_wwire_ib{"cfg_require_v0_on_wwire_ib", false, "flag to select V0s on W wires ITSib"}; Configurable cfg_min_pt_v0{"cfg_min_pt_v0", 0.1, "min pT for v0 photons at PV"}; + Configurable cfg_max_pt_v0{"cfg_max_pt_v0", 1e+10, "max pT for v0 photons at PV"}; + Configurable cfg_min_eta_v0{"cfg_min_eta_v0", -0.8, "min eta for v0 photons at PV"}; Configurable cfg_max_eta_v0{"cfg_max_eta_v0", 0.8, "max eta for v0 photons at PV"}; Configurable cfg_min_v0radius{"cfg_min_v0radius", 4.0, "min v0 radius"}; Configurable cfg_max_v0radius{"cfg_max_v0radius", 90.0, "max v0 radius"}; @@ -130,6 +132,7 @@ struct Pi0EtaToGammaGammaMC { Configurable cfg_max_chi2kf{"cfg_max_chi2kf", 1e+10, "max chi2/ndf with KF"}; Configurable cfg_require_v0_with_correct_xz{"cfg_require_v0_with_correct_xz", true, "flag to select V0s with correct xz"}; Configurable cfg_reject_v0_on_itsib{"cfg_reject_v0_on_itsib", true, "flag to reject V0s on ITSib"}; + Configurable cfg_apply_cuts_from_prefilter_derived{"cfg_apply_cuts_from_prefilter_derived", false, "flag to apply prefilter to V0"}; Configurable cfg_min_ncluster_tpc{"cfg_min_ncluster_tpc", 10, "min ncluster tpc"}; Configurable cfg_min_ncrossedrows{"cfg_min_ncrossedrows", 40, "min ncrossed rows"}; @@ -147,7 +150,6 @@ struct Pi0EtaToGammaGammaMC { Configurable cfg_min_mass{"cfg_min_mass", 0.0, "min mass"}; Configurable cfg_max_mass{"cfg_max_mass", 0.1, "max mass"}; Configurable cfg_apply_phiv{"cfg_apply_phiv", true, "flag to apply phiv cut"}; - Configurable cfg_apply_pf{"cfg_apply_pf", false, "flag to apply phiv prefilter"}; Configurable cfg_require_itsib_any{"cfg_require_itsib_any", false, "flag to require ITS ib any hits"}; Configurable cfg_require_itsib_1st{"cfg_require_itsib_1st", true, "flag to require ITS ib 1st hit"}; Configurable cfg_phiv_slope{"cfg_phiv_slope", 0.0185, "slope for m vs. phiv"}; @@ -160,10 +162,11 @@ struct Pi0EtaToGammaGammaMC { Configurable cfg_min_ncrossedrows{"cfg_min_ncrossedrows", 70, "min ncrossed rows"}; Configurable cfg_max_chi2tpc{"cfg_max_chi2tpc", 4.0, "max chi2/NclsTPC"}; Configurable cfg_max_chi2its{"cfg_max_chi2its", 5.0, "max chi2/NclsITS"}; - Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 1.0, "max dca XY for single track in cm"}; - Configurable cfg_max_dcaz{"cfg_max_dcaz", 1.0, "max dca Z for single track in cm"}; + Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 0.05, "max dca XY for single track in cm"}; + Configurable cfg_max_dcaz{"cfg_max_dcaz", 0.05, "max dca Z for single track in cm"}; + Configurable cfg_apply_cuts_from_prefilter_derived{"cfg_apply_cuts_from_prefilter_derived", false, "flag to apply prefilter to electron"}; - Configurable cfg_pid_scheme{"cfg_pid_scheme", static_cast(DalitzEECut::PIDSchemes::kTPConly), "pid scheme [kTPConly : 0]"}; + Configurable cfg_pid_scheme{"cfg_pid_scheme", static_cast(DalitzEECut::PIDSchemes::kTOFif), "pid scheme [kTOFif : 0, kTPConly : 1]"}; Configurable cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -2.0, "min. TPC n sigma for electron inclusion"}; Configurable cfg_max_TPCNsigmaEl{"cfg_max_TPCNsigmaEl", +3.0, "max. TPC n sigma for electron inclusion"}; Configurable cfg_min_TPCNsigmaPi{"cfg_min_TPCNsigmaPi", -3.0, "min. TPC n sigma for pion exclusion"}; @@ -302,8 +305,8 @@ struct Pi0EtaToGammaGammaMC { fV0PhotonCut = V0PhotonCut("fV0PhotonCut", "fV0PhotonCut"); // for v0 - fV0PhotonCut.SetV0PtRange(pcmcuts.cfg_min_pt_v0, 1e10f); - fV0PhotonCut.SetV0EtaRange(-pcmcuts.cfg_max_eta_v0, +pcmcuts.cfg_max_eta_v0); + fV0PhotonCut.SetV0PtRange(pcmcuts.cfg_min_pt_v0, pcmcuts.cfg_max_pt_v0); + fV0PhotonCut.SetV0EtaRange(pcmcuts.cfg_min_eta_v0, pcmcuts.cfg_max_eta_v0); fV0PhotonCut.SetMinCosPA(pcmcuts.cfg_min_cospa); fV0PhotonCut.SetMaxPCA(pcmcuts.cfg_max_pca); fV0PhotonCut.SetMaxChi2KF(pcmcuts.cfg_max_chi2kf); @@ -697,6 +700,9 @@ struct Pi0EtaToGammaGammaMC { Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); using FilteredMyCollisions = soa::Filtered; + Filter prefilter_pcm = ifnode(pcmcuts.cfg_apply_cuts_from_prefilter_derived.node(), o2::aod::v0photonkf::pfbderived == static_cast(0), true); + Filter prefilter_primaryelectron = ifnode(dileptoncuts.cfg_apply_cuts_from_prefilter_derived.node(), o2::aod::emprimaryelectron::pfbderived == static_cast(0), true); + void processAnalysis(FilteredMyCollisions const& collisions, MyMCCollisions const& mccollisions, aod::EMMCParticles const& mcparticles, Types const&... args) { if constexpr (pairtype == PairType::kPCMPCM) { diff --git a/PWGEM/PhotonMeson/DataModel/gammaTables.h b/PWGEM/PhotonMeson/DataModel/gammaTables.h index 1e2bca55e81..f86482794bf 100644 --- a/PWGEM/PhotonMeson/DataModel/gammaTables.h +++ b/PWGEM/PhotonMeson/DataModel/gammaTables.h @@ -286,7 +286,8 @@ DECLARE_SOA_TABLE(EMPrimaryElectronsFromDalitz, "AOD", "EMPRIMARYELDA", //! track::TPCNClsFindable, track::TPCNClsFindableMinusFound, track::TPCNClsFindableMinusCrossedRows, track::TPCChi2NCl, track::TPCInnerParam, track::TPCSignal, pidtpc::TPCNSigmaEl, pidtpc::TPCNSigmaPi, - track::ITSClusterSizes, track::ITSChi2NCl, track::DetectorMap, track::Tgl, + pidtofbeta::Beta, pidtof::TOFNSigmaEl, pidtof::TOFNSigmaPi, + track::ITSClusterSizes, track::ITSChi2NCl, track::TOFChi2, track::DetectorMap, track::Tgl, // dynamic column track::TPCNClsFound, diff --git a/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx b/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx index 575d5c88370..078cac30e70 100644 --- a/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx +++ b/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx @@ -41,7 +41,7 @@ using namespace o2::pwgem::photonmeson; using MyCollisions = soa::Join; using MyCollisionsMC = soa::Join; -using MyTracks = soa::Join; +using MyTracks = soa::Join; using MyTrack = MyTracks::iterator; using MyTracksMC = soa::Join; using MyTrackMC = MyTracksMC::iterator; @@ -69,13 +69,15 @@ struct skimmerPrimaryElectronFromDalitzEE { Configurable maxchi2tpc{"maxchi2tpc", 5.0, "max. chi2/NclsTPC"}; Configurable maxchi2its{"maxchi2its", 6.0, "max. chi2/NclsITS"}; Configurable minpt{"minpt", 0.05, "min pt for track"}; - Configurable maxeta{"maxeta", 0.9, "eta acceptance"}; + Configurable maxeta{"maxeta", 2.0, "max eta acceptance"}; Configurable dca_xy_max{"dca_xy_max", 0.05, "max DCAxy in cm"}; Configurable dca_z_max{"dca_z_max", 0.05, "max DCAz in cm"}; Configurable minTPCNsigmaEl{"minTPCNsigmaEl", -2.5, "min. TPC n sigma for electron inclusion"}; - Configurable maxTPCNsigmaEl{"maxTPCNsigmaEl", 3.5, "max. TPC n sigma for electron inclusion"}; + Configurable maxTPCNsigmaEl{"maxTPCNsigmaEl", +3.5, "max. TPC n sigma for electron inclusion"}; Configurable maxTPCNsigmaPi{"maxTPCNsigmaPi", 0.0, "max. TPC n sigma for pion exclusion"}; Configurable minTPCNsigmaPi{"minTPCNsigmaPi", 0.0, "min. TPC n sigma for pion exclusion"}; + Configurable minTOFNsigmaEl{"minTOFNsigmaEl", -3.5, "min. TOF n sigma for electron inclusion"}; + Configurable maxTOFNsigmaEl{"maxTOFNsigmaEl", +3.5, "max. TOF n sigma for electron inclusion"}; Configurable maxMee{"maxMee", 0.03, "max. mee to store dalitz ee pairs"}; Configurable fillLS{"fillLS", true, "flag to fill LS histograms for QA"}; @@ -98,7 +100,7 @@ struct skimmerPrimaryElectronFromDalitzEE { ccdb->setFatalWhenNull(false); fRegistry.add("Track/hPt", "pT;p_{T} (GeV/c)", kTH1F, {{1000, 0.0f, 10}}, false); - fRegistry.add("Track/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {40, -1.0f, 1.0f}}, false); + fRegistry.add("Track/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {400, -2.0f, 2.0f}}, false); fRegistry.add("Track/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{400, -20, 20}}, false); fRegistry.add("Track/hDCAxyz", "DCA xy vs. z;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -1.0f, 1.0f}, {200, -1.0f, 1.0f}}, false); fRegistry.add("Track/hDCAxy_Pt", "DCA_{xy} vs. pT;p_{T} (GeV/c);DCA_{xy} (cm)", kTH2F, {{200, 0, 10}, {200, -1, 1}}, false); @@ -124,6 +126,12 @@ struct skimmerPrimaryElectronFromDalitzEE { fRegistry.add("Track/hITSClusterMap", "ITS cluster map", kTH1F, {{128, -0.5, 127.5}}, false); fRegistry.add("Track/hMeanClusterSizeITS", "mean cluster size ITS;p_{pv} (GeV/c); on ITS #times cos(#lambda)", kTH2F, {{1000, 0, 10}, {150, 0, 15}}, false); + // TOF + fRegistry.add("Track/hChi2TOF", "chi2 of TOF", kTH1F, {{100, 0, 10}}, false); + fRegistry.add("Track/hTOFbeta", "TOF beta;p_{pv} (GeV/c);#beta", kTH2F, {{1000, 0, 10}, {240, 0, 1.2}}, false); + fRegistry.add("Track/hTOFNsigmaEl", "TOF n sigma el;p_{pv} (GeV/c);n #sigma_{e}^{TOF}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); + fRegistry.add("Track/hTOFNsigmaPi", "TOF n sigma pi;p_{pv} (GeV/c);n #sigma_{#pi}^{TOF}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); + // pair fRegistry.add("Pair/uls/hMvsPt", "m_{ee} vs. p_{T,ee};m_{ee} (GeV/c^{2});p_{T,ee} (GeV/c)", kTH2F, {{100, 0, 0.1}, {200, 0, 2}}, false); fRegistry.add("Pair/uls/hMvsPhiV", "m_{ee} vs. #varphi_{V};#varphi_{V} (rad.);m_{ee} (GeV/c^{2})", kTH2F, {{180, 0, M_PI}, {100, 0, 0.1}}, false); @@ -235,6 +243,9 @@ struct skimmerPrimaryElectronFromDalitzEE { if (minTPCNsigmaPi < track.tpcNSigmaPi() && track.tpcNSigmaPi() < maxTPCNsigmaPi) { return false; } + if (track.hasTOF() && (track.tofNSigmaEl() < minTOFNsigmaEl || maxTOFNsigmaEl < track.tofNSigmaEl())) { // TOFif + return false; + } return true; } @@ -247,7 +258,8 @@ struct skimmerPrimaryElectronFromDalitzEE { track.tpcNClsFindable(), track.tpcNClsFindableMinusFound(), track.tpcNClsFindableMinusCrossedRows(), track.tpcChi2NCl(), track.tpcInnerParam(), track.tpcSignal(), track.tpcNSigmaEl(), track.tpcNSigmaPi(), - track.itsClusterSizes(), track.itsChi2NCl(), track.detectorMap(), track.tgl()); + track.beta(), track.tofNSigmaEl(), track.tofNSigmaPi(), + track.itsClusterSizes(), track.itsChi2NCl(), track.tofChi2(), track.detectorMap(), track.tgl()); fRegistry.fill(HIST("Track/hPt"), track.pt()); fRegistry.fill(HIST("Track/hEtaPhi"), track.phi(), track.eta()); @@ -269,6 +281,11 @@ struct skimmerPrimaryElectronFromDalitzEE { fRegistry.fill(HIST("Track/hTPCNsigmaEl"), track.tpcInnerParam(), track.tpcNSigmaEl()); fRegistry.fill(HIST("Track/hTPCNsigmaPi"), track.tpcInnerParam(), track.tpcNSigmaPi()); + fRegistry.fill(HIST("Track/hChi2TOF"), track.tofChi2()); + fRegistry.fill(HIST("Track/hTOFbeta"), track.p(), track.beta()); + fRegistry.fill(HIST("Track/hTOFNsigmaEl"), track.p(), track.tofNSigmaEl()); + fRegistry.fill(HIST("Track/hTOFNsigmaPi"), track.p(), track.tofNSigmaPi()); + fRegistry.fill(HIST("Track/hNclsITS"), track.itsNCls()); fRegistry.fill(HIST("Track/hChi2ITS"), track.itsChi2NCl()); fRegistry.fill(HIST("Track/hITSClusterMap"), track.itsClusterMap()); diff --git a/PWGEM/PhotonMeson/Tasks/Pi0EtaToGammaGammaMCPCMPCM.cxx b/PWGEM/PhotonMeson/Tasks/Pi0EtaToGammaGammaMCPCMPCM.cxx index df8877d3ae8..9b79891739c 100644 --- a/PWGEM/PhotonMeson/Tasks/Pi0EtaToGammaGammaMCPCMPCM.cxx +++ b/PWGEM/PhotonMeson/Tasks/Pi0EtaToGammaGammaMCPCMPCM.cxx @@ -26,11 +26,11 @@ using namespace o2; using namespace o2::aod; -using MyV0Photons = soa::Join; -using MyV0Photon = MyV0Photons::iterator; +// using MyV0Photons = soa::Join; +// using MyV0Photon = MyV0Photons::iterator; -using MyMCV0Legs = soa::Join; -using MyMCV0Leg = MyMCV0Legs::iterator; +// using MyMCV0Legs = soa::Join; +// using MyMCV0Leg = MyMCV0Legs::iterator; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGEM/PhotonMeson/Tasks/pcmQC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQC.cxx index b5f0d91099d..6768e65bec3 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQC.cxx @@ -75,6 +75,7 @@ struct PCMQC { Configurable cfg_require_v0_with_tpconly{"cfg_require_v0_with_tpconly", false, "flag to select V0s with TPConly tracks"}; Configurable cfg_require_v0_on_wwire_ib{"cfg_require_v0_on_wwire_ib", false, "flag to select V0s on W wires ITSib"}; Configurable cfg_min_pt_v0{"cfg_min_pt_v0", 0.1, "min pT for v0 photons at PV"}; + Configurable cfg_max_pt_v0{"cfg_max_pt_v0", 1e+10, "max pT for v0 photons at PV"}; Configurable cfg_min_eta_v0{"cfg_min_eta_v0", -0.8, "min eta for v0 photons at PV"}; Configurable cfg_max_eta_v0{"cfg_max_eta_v0", +0.8, "max eta for v0 photons at PV"}; Configurable cfg_min_v0radius{"cfg_min_v0radius", 4.0, "min v0 radius"}; @@ -205,7 +206,7 @@ struct PCMQC { fV0PhotonCut = V0PhotonCut("fV0PhotonCut", "fV0PhotonCut"); // for v0 - fV0PhotonCut.SetV0PtRange(pcmcuts.cfg_min_pt_v0, 1e10f); + fV0PhotonCut.SetV0PtRange(pcmcuts.cfg_min_pt_v0, pcmcuts.cfg_max_pt_v0); fV0PhotonCut.SetV0EtaRange(pcmcuts.cfg_min_eta_v0, pcmcuts.cfg_max_eta_v0); fV0PhotonCut.SetMinCosPA(pcmcuts.cfg_min_cospa); fV0PhotonCut.SetMaxPCA(pcmcuts.cfg_max_pca); diff --git a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx index 6ee14e90931..227966bbacb 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx @@ -89,6 +89,7 @@ struct PCMQCMC { Configurable cfg_require_v0_with_tpconly{"cfg_require_v0_with_tpconly", false, "flag to select V0s with TPConly tracks"}; Configurable cfg_require_v0_on_wwire_ib{"cfg_require_v0_on_wwire_ib", false, "flag to select V0s on W wires ITSib"}; Configurable cfg_min_pt_v0{"cfg_min_pt_v0", 0.1, "min pT for v0 photons at PV"}; + Configurable cfg_max_pt_v0{"cfg_max_pt_v0", 1e+10, "max pT for v0 photons at PV"}; Configurable cfg_min_eta_v0{"cfg_min_eta_v0", -0.8, "min eta for v0 photons at PV"}; Configurable cfg_max_eta_v0{"cfg_max_eta_v0", +0.8, "max eta for v0 photons at PV"}; Configurable cfg_min_v0radius{"cfg_min_v0radius", 4.0, "min v0 radius"}; @@ -263,7 +264,7 @@ struct PCMQCMC { fV0PhotonCut = V0PhotonCut("fV0PhotonCut", "fV0PhotonCut"); // for v0 - fV0PhotonCut.SetV0PtRange(pcmcuts.cfg_min_pt_v0, 1e10f); + fV0PhotonCut.SetV0PtRange(pcmcuts.cfg_min_pt_v0, pcmcuts.cfg_max_pt_v0); fV0PhotonCut.SetV0EtaRange(pcmcuts.cfg_min_eta_v0, pcmcuts.cfg_max_eta_v0); fV0PhotonCut.SetMinCosPA(pcmcuts.cfg_min_cospa); fV0PhotonCut.SetMaxPCA(pcmcuts.cfg_max_pca); diff --git a/PWGEM/PhotonMeson/Tasks/prefilterPhoton.cxx b/PWGEM/PhotonMeson/Tasks/prefilterPhoton.cxx index 3063392e5f2..89b260728af 100644 --- a/PWGEM/PhotonMeson/Tasks/prefilterPhoton.cxx +++ b/PWGEM/PhotonMeson/Tasks/prefilterPhoton.cxx @@ -38,12 +38,14 @@ #include "PWGEM/PhotonMeson/Utils/PairUtilities.h" #include "PWGEM/PhotonMeson/Core/V0PhotonCut.h" #include "PWGEM/PhotonMeson/Core/EMPhotonEventCut.h" +#include "PWGEM/PhotonMeson/Core/DalitzEECut.h" using namespace o2; using namespace o2::aod; using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::soa; +using namespace o2::aod::pwgem::photonmeson::photonpair; using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; @@ -51,8 +53,12 @@ using MyCollision = MyCollisions::iterator; using MyV0Photons = soa::Join; using MyV0Photon = MyV0Photons::iterator; +using MyPrimaryElectrons = soa::Join; +using MyPrimaryElectron = MyPrimaryElectrons::iterator; + struct prefilterPhoton { - Produces pfb_derived; + Produces pfb_v0_derived; + Produces pfb_ele_derived; // Configurables Configurable cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"}; @@ -79,21 +85,18 @@ struct prefilterPhoton { struct : ConfigurableGroup { std::string prefix = "pcmcut_group"; - // for mgg prefilter - Configurable cfg_min_mass{"cfg_min_mass", 0.12, "min mass for prefilter"}; // region to be rejected - Configurable cfg_max_mass{"cfg_max_mass", 0.15, "max mass for prefilter"}; // region to be rejected - Configurable cfg_min_pt_v0{"cfg_min_pt_v0", 0.1, "min pT for v0 photons at PV"}; + Configurable cfg_max_pt_v0{"cfg_max_pt_v0", 1e+10, "max pT for v0 photons at PV"}; Configurable cfg_min_eta_v0{"cfg_min_eta_v0", -0.9, "min eta for v0 photons at PV"}; Configurable cfg_max_eta_v0{"cfg_max_eta_v0", +0.9, "max eta for v0 photons at PV"}; Configurable cfg_min_v0radius{"cfg_min_v0radius", 4.0, "min v0 radius"}; Configurable cfg_max_v0radius{"cfg_max_v0radius", 90.0, "max v0 radius"}; Configurable cfg_max_alpha_ap{"cfg_max_alpha_ap", 0.95, "max alpha for AP cut"}; Configurable cfg_max_qt_ap{"cfg_max_qt_ap", 0.01, "max qT for AP cut"}; - Configurable cfg_min_cospa{"cfg_min_cospa", 0.999, "min V0 CosPA"}; + Configurable cfg_min_cospa{"cfg_min_cospa", 0.99, "min V0 CosPA"}; Configurable cfg_max_pca{"cfg_max_pca", 1.5, "max distance btween 2 legs"}; Configurable cfg_max_chi2kf{"cfg_max_chi2kf", 1e+10, "max chi2/ndf with KF"}; - Configurable cfg_require_v0_with_correct_xz{"cfg_require_v0_with_correct_xz", true, "flag to select V0s with correct xz"}; + Configurable cfg_require_v0_with_correct_xz{"cfg_require_v0_with_correct_xz", false, "flag to select V0s with correct xz"}; Configurable cfg_reject_v0_on_itsib{"cfg_reject_v0_on_itsib", true, "flag to reject V0s on ITSib"}; Configurable cfg_min_ncluster_tpc{"cfg_min_ncluster_tpc", 0, "min ncluster tpc"}; Configurable cfg_min_ncrossedrows{"cfg_min_ncrossedrows", 40, "min ncrossed rows"}; @@ -106,6 +109,50 @@ struct prefilterPhoton { Configurable cfg_disable_tpconly_track{"cfg_disable_tpconly_track", false, "flag to disable TPConly tracks"}; } pcmcuts; + DalitzEECut fDileptonCut; + struct : ConfigurableGroup { + std::string prefix = "dileptoncut_group"; + + Configurable cfg_min_mee{"cfg_min_mee", 0.0, "min mass"}; + Configurable cfg_max_mee{"cfg_max_mee", 0.02, "max mass"}; + Configurable cfg_apply_phiv{"cfg_apply_phiv", false, "flag to apply phiv cut"}; + Configurable cfg_apply_pf{"cfg_apply_pf", false, "flag to apply phiv prefilter"}; + Configurable cfg_require_itsib_any{"cfg_require_itsib_any", false, "flag to require ITS ib any hits"}; + Configurable cfg_require_itsib_1st{"cfg_require_itsib_1st", true, "flag to require ITS ib 1st hit"}; + Configurable cfg_phiv_slope{"cfg_phiv_slope", 0.0185, "slope for m vs. phiv"}; + Configurable cfg_phiv_intercept{"cfg_phiv_intercept", -0.0280, "intercept for m vs. phiv"}; + + Configurable cfg_min_pt_track{"cfg_min_pt_track", 0.05, "min pT for single track"}; + Configurable cfg_max_pt_track{"cfg_max_pt_track", 1e+10, "max pT for single track"}; + Configurable cfg_min_eta_track{"cfg_min_eta_track", -2.0, "min eta for single track"}; + Configurable cfg_max_eta_track{"cfg_max_eta_track", 2.0, "max eta for single track"}; + Configurable cfg_min_ncluster_tpc{"cfg_min_ncluster_tpc", 40, "min ncluster tpc"}; + Configurable cfg_min_ncluster_its{"cfg_min_ncluster_its", 5, "min ncluster its"}; + Configurable cfg_min_ncrossedrows{"cfg_min_ncrossedrows", 0, "min ncrossed rows"}; + Configurable cfg_max_chi2tpc{"cfg_max_chi2tpc", 4.0, "max chi2/NclsTPC"}; + Configurable cfg_max_chi2its{"cfg_max_chi2its", 5.0, "max chi2/NclsITS"}; + Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 0.05, "max dca XY for single track in cm"}; + Configurable cfg_max_dcaz{"cfg_max_dcaz", 0.05, "max dca Z for single track in cm"}; + + Configurable cfg_pid_scheme{"cfg_pid_scheme", static_cast(DalitzEECut::PIDSchemes::kTOFif), "pid scheme [kTOFif : 0, kTPConly : 1]"}; + Configurable cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -2.0, "min. TPC n sigma for electron inclusion"}; + Configurable cfg_max_TPCNsigmaEl{"cfg_max_TPCNsigmaEl", +3.0, "max. TPC n sigma for electron inclusion"}; + Configurable cfg_min_TPCNsigmaPi{"cfg_min_TPCNsigmaPi", 0.0, "min. TPC n sigma for pion exclusion"}; + Configurable cfg_max_TPCNsigmaPi{"cfg_max_TPCNsigmaPi", 0.0, "max. TPC n sigma for pion exclusion"}; + } dileptoncuts; + + struct : ConfigurableGroup { + std::string prefix = "ggcut_group"; + Configurable cfg_min_mass{"cfg_min_mass", 0.10, "min mass for prefilter"}; // region to be rejected + Configurable cfg_max_mass{"cfg_max_mass", 0.15, "max mass for prefilter"}; // region to be rejected + } ggcuts; + + struct : ConfigurableGroup { + std::string prefix = "eegcut_group"; + Configurable cfg_min_mass{"cfg_min_mass", 0.10, "min mass for prefilter"}; // region to be rejected + Configurable cfg_max_mass{"cfg_max_mass", 0.15, "max mass for prefilter"}; // region to be rejected + } eegcuts; + HistogramRegistry fRegistry{"output", {}, OutputObjHandlingPolicy::AnalysisObject, false, false}; void init(InitContext& /*context*/) @@ -123,8 +170,9 @@ struct prefilterPhoton { const AxisSpec axis_pair_pt{100, 0, 10, "p_{T,#gamma#gamma} (GeV/c)"}; // for pair - fRegistry.add("Pair/before/hMvsPt", "m_{#gamma#gamma} vs. p_{T,#gamma#gamma}", kTH2D, {axis_mass, axis_pair_pt}, true); - fRegistry.addClone("Pair/before/", "Pair/after/"); + fRegistry.add("Pair/PCMPCM/before/hMvsPt", "m_{#gamma#gamma} vs. p_{T,#gamma#gamma}", kTH2D, {axis_mass, axis_pair_pt}, true); + fRegistry.addClone("Pair/PCMPCM/before/", "Pair/PCMPCM/after/"); + fRegistry.addClone("Pair/PCMPCM/", "Pair/PCMDalitzEE/"); } void DefineEMEventCut() @@ -144,7 +192,7 @@ struct prefilterPhoton { fV0PhotonCut = V0PhotonCut("fV0PhotonCut", "fV0PhotonCut"); // for v0 - fV0PhotonCut.SetV0PtRange(pcmcuts.cfg_min_pt_v0, 1e10f); + fV0PhotonCut.SetV0PtRange(pcmcuts.cfg_min_pt_v0, pcmcuts.cfg_max_pt_v0); fV0PhotonCut.SetV0EtaRange(pcmcuts.cfg_min_eta_v0, pcmcuts.cfg_max_eta_v0); fV0PhotonCut.SetMinCosPA(pcmcuts.cfg_min_cospa); fV0PhotonCut.SetMaxPCA(pcmcuts.cfg_max_pca); @@ -169,103 +217,323 @@ struct prefilterPhoton { fV0PhotonCut.SetIsWithinBeamPipe(pcmcuts.cfg_require_v0_with_correct_xz); } - std::unordered_map map_pfb; // map v0.globalIndex -> prefilter bit + void DefineDileptonCut() + { + fDileptonCut = DalitzEECut("fDileptonCut", "fDileptonCut"); - SliceCache cache; - Preslice perCollision_v0 = aod::v0photonkf::emeventId; + // for pair + fDileptonCut.SetMeeRange(dileptoncuts.cfg_min_mee, dileptoncuts.cfg_max_mee); + fDileptonCut.SetMaxPhivPairMeeDep([&](float mll) { return (mll - dileptoncuts.cfg_phiv_intercept) / dileptoncuts.cfg_phiv_slope; }); + fDileptonCut.ApplyPhiV(dileptoncuts.cfg_apply_phiv); + fDileptonCut.RequireITSibAny(dileptoncuts.cfg_require_itsib_any); + fDileptonCut.RequireITSib1st(dileptoncuts.cfg_require_itsib_1st); - Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); - Filter collisionFilter_occupancy_track = eventcuts.cfgTrackOccupancyMin <= o2::aod::evsel::trackOccupancyInTimeRange && o2::aod::evsel::trackOccupancyInTimeRange < eventcuts.cfgTrackOccupancyMax; - Filter collisionFilter_occupancy_ft0c = eventcuts.cfgFT0COccupancyMin <= o2::aod::evsel::ft0cOccupancyInTimeRange && o2::aod::evsel::ft0cOccupancyInTimeRange < eventcuts.cfgFT0COccupancyMax; - using FilteredMyCollisions = soa::Filtered; + // for track + fDileptonCut.SetTrackPtRange(dileptoncuts.cfg_min_pt_track, dileptoncuts.cfg_max_pt_track); + fDileptonCut.SetTrackEtaRange(-dileptoncuts.cfg_min_eta_track, +dileptoncuts.cfg_max_eta_track); + fDileptonCut.SetMinNClustersTPC(dileptoncuts.cfg_min_ncluster_tpc); + fDileptonCut.SetMinNCrossedRowsTPC(dileptoncuts.cfg_min_ncrossedrows); + fDileptonCut.SetMinNCrossedRowsOverFindableClustersTPC(0.8); + fDileptonCut.SetChi2PerClusterTPC(0.0, dileptoncuts.cfg_max_chi2tpc); + fDileptonCut.SetChi2PerClusterITS(0.0, dileptoncuts.cfg_max_chi2its); + fDileptonCut.SetNClustersITS(dileptoncuts.cfg_min_ncluster_its, 7); + fDileptonCut.SetMaxDcaXY(dileptoncuts.cfg_max_dcaxy); + fDileptonCut.SetMaxDcaZ(dileptoncuts.cfg_max_dcaz); + + // for eID + fDileptonCut.SetPIDScheme(dileptoncuts.cfg_pid_scheme); + fDileptonCut.SetTPCNsigmaElRange(dileptoncuts.cfg_min_TPCNsigmaEl, dileptoncuts.cfg_max_TPCNsigmaEl); + fDileptonCut.SetTPCNsigmaPiRange(dileptoncuts.cfg_min_TPCNsigmaPi, dileptoncuts.cfg_max_TPCNsigmaPi); + } - void processPFB(FilteredMyCollisions const& collisions, MyV0Photons const& v0s, aod::V0Legs const&) + template + void runPairing(TCollisions const& collisions, + TPhotons1 const& photons1, TPhotons2 const& photons2, + TSubInfos1 const&, TSubInfos2 const&, + TPreslice1 const& perCollision1, TPreslice2 const& perCollision2, + TCut1 const& cut1, TCut2 const& cut2) { + if constexpr (pairtype == PairType::kPCMPCM) { + for (const auto& photon1 : photons1) { + map_pfb_v0[photon1.globalIndex()] = 0; + } // end of v0 loop + } else if constexpr (pairtype == PairType::kPCMDalitzEE) { + for (const auto& photon1 : photons1) { + map_pfb_v0[photon1.globalIndex()] = 0; + } // end of v0 loop + for (const auto& photon2 : photons2) { + map_pfb_ele[photon2.globalIndex()] = 0; + } // end of electron loop + } - for (const auto& v0 : v0s) { - map_pfb[v0.globalIndex()] = 0; - } // end of v0 loop - - for (const auto& collision : collisions) { - // initCCDB(collision); - const float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; - bool is_cent_ok = true; - if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { - is_cent_ok = false; - } + if constexpr (pairtype == PairType::kPCMPCM) { + for (const auto& collision : collisions) { + const float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; + bool is_cent_ok = true; + if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { + is_cent_ok = false; + } - auto v0s_per_collision = v0s.sliceBy(perCollision_v0, collision.globalIndex()); + auto photons1_per_collision = photons1.sliceBy(perCollision1, collision.globalIndex()); + auto photons2_per_collision = photons2.sliceBy(perCollision2, collision.globalIndex()); - if (!fEMEventCut.IsSelected(collision) || !is_cent_ok) { - for (const auto& v0 : v0s_per_collision) { - map_pfb[v0.globalIndex()] = 0; + if (!fEMEventCut.IsSelected(collision) || !is_cent_ok) { + for (const auto& photon1 : photons1_per_collision) { + map_pfb_v0[photon1.globalIndex()] = 0; + } + continue; + } + for (const auto& [g1, g2] : combinations(CombinationsStrictlyUpperIndexPolicy(photons1_per_collision, photons2_per_collision))) { + if (!cut1.template IsSelected(g1) || !cut2.template IsSelected(g2)) { + continue; + } + // don't apply pair cut when you produce prefilter bit. + + ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.f); + ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.f); + ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; + fRegistry.fill(HIST("Pair/PCMPCM/before/hMvsPt"), v12.M(), v12.Pt()); + + if (ggcuts.cfg_min_mass < v12.M() && v12.M() < ggcuts.cfg_max_mass) { + map_pfb_v0[g1.globalIndex()] |= 1 << static_cast(o2::aod::pwgem::photonmeson::utils::pairutil::PhotonPrefilterBitDerived::kPhotonFromPi0ggDefault); + map_pfb_v0[g2.globalIndex()] |= 1 << static_cast(o2::aod::pwgem::photonmeson::utils::pairutil::PhotonPrefilterBitDerived::kPhotonFromPi0ggDefault); + } + } // end of 2photon pairing loop + } // end of collision loop + } else if constexpr (pairtype == PairType::kPCMDalitzEE) { + for (const auto& collision : collisions) { + const float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; + bool is_cent_ok = true; + if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { + is_cent_ok = false; } - continue; - } - for (const auto& [g1, g2] : combinations(CombinationsStrictlyUpperIndexPolicy(v0s_per_collision, v0s_per_collision))) { - if (!fV0PhotonCut.template IsSelected(g1) || !fV0PhotonCut.template IsSelected(g2)) { + auto photons1_per_collision = photons1.sliceBy(perCollision1, collision.globalIndex()); + auto positrons_per_collision = posTracks->sliceByCached(o2::aod::emprimaryelectron::emeventId, collision.globalIndex(), cache); + auto electrons_per_collision = negTracks->sliceByCached(o2::aod::emprimaryelectron::emeventId, collision.globalIndex(), cache); + + if (!fEMEventCut.IsSelected(collision) || !is_cent_ok) { + for (const auto& photon1 : photons1_per_collision) { + map_pfb_v0[photon1.globalIndex()] = 0; + } + for (const auto& pos : positrons_per_collision) { + map_pfb_ele[pos.globalIndex()] = 0; + } + for (const auto& ele : electrons_per_collision) { + map_pfb_ele[ele.globalIndex()] = 0; + } continue; } - // don't apply pair cut when you produce prefilter bit. - ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.f); - ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.f); - ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; + for (const auto& [g1, g2] : combinations(CombinationsStrictlyUpperIndexPolicy(photons1_per_collision, photons1_per_collision))) { // PCM-PCM // cut, and subinfo is different from kPCMPCM + if (!cut1.template IsSelected(g1) || !cut1.template IsSelected(g2)) { + continue; + } + // don't apply pair cut when you produce prefilter bit. + + ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.f); + ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.f); + ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; + fRegistry.fill(HIST("Pair/PCMPCM/before/hMvsPt"), v12.M(), v12.Pt()); + + if (ggcuts.cfg_min_mass < v12.M() && v12.M() < ggcuts.cfg_max_mass) { + map_pfb_v0[g1.globalIndex()] |= 1 << static_cast(o2::aod::pwgem::photonmeson::utils::pairutil::PhotonPrefilterBitDerived::kPhotonFromPi0ggDefault); + map_pfb_v0[g2.globalIndex()] |= 1 << static_cast(o2::aod::pwgem::photonmeson::utils::pairutil::PhotonPrefilterBitDerived::kPhotonFromPi0ggDefault); + } + } // end of 2photon pairing loop + + for (const auto& g1 : photons1_per_collision) { // PCM-DalitzEE + if (!cut1.template IsSelected(g1)) { + continue; + } + auto pos1 = g1.template posTrack_as(); + auto ele1 = g1.template negTrack_as(); + ROOT::Math::PtEtaPhiMVector v_gamma(g1.pt(), g1.eta(), g1.phi(), 0.); + + for (const auto& [pos2, ele2] : combinations(CombinationsFullIndexPolicy(positrons_per_collision, electrons_per_collision))) { + if (pos2.trackId() == ele2.trackId()) { // this is protection against pairing identical 2 tracks. + continue; + } + if (pos1.trackId() == pos2.trackId() || ele1.trackId() == ele2.trackId()) { + continue; + } + + if (!cut2.template IsSelectedTrack(pos2, collision) || !cut2.template IsSelectedTrack(ele2, collision)) { + continue; + } + + ROOT::Math::PtEtaPhiMVector v_pos(pos2.pt(), pos2.eta(), pos2.phi(), o2::constants::physics::MassElectron); + ROOT::Math::PtEtaPhiMVector v_ele(ele2.pt(), ele2.eta(), ele2.phi(), o2::constants::physics::MassElectron); + ROOT::Math::PtEtaPhiMVector v_ee = v_pos + v_ele; + if (!(dileptoncuts.cfg_min_mee < v_ee.M() && v_ee.M() < dileptoncuts.cfg_max_mee)) { + continue; + } + ROOT::Math::PtEtaPhiMVector veeg = v_gamma + v_pos + v_ele; + fRegistry.fill(HIST("Pair/PCMDalitzEE/before/hMvsPt"), veeg.M(), veeg.Pt()); + + if (eegcuts.cfg_min_mass < veeg.M() && veeg.M() < eegcuts.cfg_max_mass) { + map_pfb_v0[g1.globalIndex()] |= 1 << static_cast(o2::aod::pwgem::photonmeson::utils::pairutil::PhotonPrefilterBitDerived::kPhotonFromPi0eegDefault); + map_pfb_ele[pos2.globalIndex()] |= 1 << static_cast(o2::aod::pwgem::photonmeson::utils::pairutil::ElectronPrefilterBitDerived::kElectronFromPi0eegDefault); + map_pfb_ele[ele2.globalIndex()] |= 1 << static_cast(o2::aod::pwgem::photonmeson::utils::pairutil::ElectronPrefilterBitDerived::kElectronFromPi0eegDefault); + } + } // end of dielectron loop + } // end of g1 loop + } // end of collision loop + } - fRegistry.fill(HIST("Pair/before/hMvsPt"), v12.M(), v12.Pt()); + if constexpr (pairtype == PairType::kPCMPCM) { + for (const auto& photon1 : photons1) { + pfb_v0_derived(map_pfb_v0[photon1.globalIndex()]); + } // end of v0 loop + } else if constexpr (pairtype == PairType::kPCMDalitzEE) { + for (const auto& photon1 : photons1) { + pfb_v0_derived(map_pfb_v0[photon1.globalIndex()]); + } // end of v0 loop + for (const auto& photon2 : photons2) { + pfb_ele_derived(map_pfb_ele[photon2.globalIndex()]); + } // end of electron loop + } - if (pcmcuts.cfg_min_mass < v12.M() && v12.M() < pcmcuts.cfg_max_mass) { - map_pfb[g1.globalIndex()] |= 1 << static_cast(o2::aod::pwgem::photonmeson::utils::pairutil::PhotonPrefilterBitDerived::kPhotonFromPi0Default); - map_pfb[g2.globalIndex()] |= 1 << static_cast(o2::aod::pwgem::photonmeson::utils::pairutil::PhotonPrefilterBitDerived::kPhotonFromPi0Default); + // check pfb. + if constexpr (pairtype == PairType::kPCMPCM) { + for (auto& collision : collisions) { + const float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; + if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { + continue; } - } - } // end of collision loop - for (auto& v0 : v0s) { - // LOGF(info, "map_pfb[%d] = %d", v0.globalIndex(), map_pfb[v0.globalIndex()]); - pfb_derived(map_pfb[v0.globalIndex()]); - } // end of v0 loop + if (!fEMEventCut.IsSelected(collision)) { + continue; + } - // check pfb. - for (auto& collision : collisions) { - const float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; - if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { - continue; - } - - if (!fEMEventCut.IsSelected(collision)) { - continue; - } - auto v0s_per_collision = v0s.sliceBy(perCollision_v0, collision.globalIndex()); - - for (const auto& [g1, g2] : combinations(CombinationsStrictlyUpperIndexPolicy(v0s_per_collision, v0s_per_collision))) { - if (!fV0PhotonCut.template IsSelected(g1) || !fV0PhotonCut.template IsSelected(g2)) { + auto photons1_per_collision = photons1.sliceBy(perCollision1, collision.globalIndex()); + auto photons2_per_collision = photons2.sliceBy(perCollision2, collision.globalIndex()); + + for (const auto& [g1, g2] : combinations(CombinationsStrictlyUpperIndexPolicy(photons1_per_collision, photons2_per_collision))) { + if (!cut1.template IsSelected(g1) || !cut2.template IsSelected(g2)) { + continue; + } + if (map_pfb_v0[g1.globalIndex()] != 0 || map_pfb_v0[g2.globalIndex()] != 0) { + continue; + } + + ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.f); + ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.f); + ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; + fRegistry.fill(HIST("Pair/PCMPCM/after/hMvsPt"), v12.M(), v12.Pt()); + } + } // end of collision loop + } else if constexpr (pairtype == PairType::kPCMDalitzEE) { + for (auto& collision : collisions) { + const float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; + if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { continue; } - if (map_pfb[g1.globalIndex()] != 0 || map_pfb[g2.globalIndex()] != 0) { + + if (!fEMEventCut.IsSelected(collision)) { continue; } - ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.f); - ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.f); - ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - fRegistry.fill(HIST("Pair/after/hMvsPt"), v12.M(), v12.Pt()); - } - } // end of collision loop + auto photons1_per_collision = photons1.sliceBy(perCollision1, collision.globalIndex()); + auto positrons_per_collision = posTracks->sliceByCached(o2::aod::emprimaryelectron::emeventId, collision.globalIndex(), cache); + auto electrons_per_collision = negTracks->sliceByCached(o2::aod::emprimaryelectron::emeventId, collision.globalIndex(), cache); + + for (const auto& [g1, g2] : combinations(CombinationsStrictlyUpperIndexPolicy(photons1_per_collision, photons1_per_collision))) { + if (!cut1.template IsSelected(g1) || !cut1.template IsSelected(g2)) { + continue; + } + if (map_pfb_v0[g1.globalIndex()] != 0 || map_pfb_v0[g2.globalIndex()] != 0) { + continue; + } + + ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.f); + ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.f); + ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; + fRegistry.fill(HIST("Pair/PCMPCM/after/hMvsPt"), v12.M(), v12.Pt()); + } + + for (const auto& g1 : photons1_per_collision) { + if (!cut1.template IsSelected(g1)) { + continue; + } + auto pos1 = g1.template posTrack_as(); + auto ele1 = g1.template negTrack_as(); + ROOT::Math::PtEtaPhiMVector v_gamma(g1.pt(), g1.eta(), g1.phi(), 0.); + + for (const auto& [pos2, ele2] : combinations(CombinationsFullIndexPolicy(positrons_per_collision, electrons_per_collision))) { + if (pos2.trackId() == ele2.trackId()) { // this is protection against pairing identical 2 tracks. + continue; + } + if (pos1.trackId() == pos2.trackId() || ele1.trackId() == ele2.trackId()) { + continue; + } + + if (!cut2.template IsSelectedTrack(pos2, collision) || !cut2.template IsSelectedTrack(ele2, collision)) { + continue; + } + if (map_pfb_v0[g1.globalIndex()] != 0 || map_pfb_ele[pos2.globalIndex()] != 0 || map_pfb_ele[ele2.globalIndex()] != 0) { + continue; + } + + ROOT::Math::PtEtaPhiMVector v_pos(pos2.pt(), pos2.eta(), pos2.phi(), o2::constants::physics::MassElectron); + ROOT::Math::PtEtaPhiMVector v_ele(ele2.pt(), ele2.eta(), ele2.phi(), o2::constants::physics::MassElectron); + ROOT::Math::PtEtaPhiMVector v_ee = v_pos + v_ele; + if (!(dileptoncuts.cfg_min_mee < v_ee.M() && v_ee.M() < dileptoncuts.cfg_max_mee)) { + continue; + } + ROOT::Math::PtEtaPhiMVector veeg = v_gamma + v_pos + v_ele; + fRegistry.fill(HIST("Pair/PCMDalitzEE/after/hMvsPt"), veeg.M(), veeg.Pt()); + } // end of dielectron loop + } // end of g1 loop + } // end of collision loop + } + + map_pfb_v0.clear(); + map_pfb_ele.clear(); + } + + std::unordered_map map_pfb_v0; // map v0.globalIndex -> prefilter bit + std::unordered_map map_pfb_ele; // map ele.globalIndex -> prefilter bit + + SliceCache cache; + Preslice perCollision_v0 = aod::v0photonkf::emeventId; + Preslice perCollision_electron = aod::emprimaryelectron::emeventId; + + Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); + Filter collisionFilter_occupancy_track = eventcuts.cfgTrackOccupancyMin <= o2::aod::evsel::trackOccupancyInTimeRange && o2::aod::evsel::trackOccupancyInTimeRange < eventcuts.cfgTrackOccupancyMax; + Filter collisionFilter_occupancy_ft0c = eventcuts.cfgFT0COccupancyMin <= o2::aod::evsel::ft0cOccupancyInTimeRange && o2::aod::evsel::ft0cOccupancyInTimeRange < eventcuts.cfgFT0COccupancyMax; + using FilteredMyCollisions = soa::Filtered; - map_pfb.clear(); + Partition posTracks = o2::aod::emprimaryelectron::sign > int8_t(0); + Partition negTracks = o2::aod::emprimaryelectron::sign < int8_t(0); - } // end of process - PROCESS_SWITCH(prefilterPhoton, processPFB, "produce prefilter bit", false); + void processPCMPCM(FilteredMyCollisions const& collisions, MyV0Photons const& v0s, aod::V0Legs const& v0legs) + { + runPairing(collisions, v0s, v0s, v0legs, v0legs, perCollision_v0, perCollision_v0, fV0PhotonCut, fV0PhotonCut); // produces filter bit for both photons + } + PROCESS_SWITCH(prefilterPhoton, processPCMPCM, "produce prefilter bit for PCM-PCM", false); - void processDummy(MyV0Photons const& v0s) + void processPCMDalitzEE(FilteredMyCollisions const& collisions, MyV0Photons const& v0s, aod::V0Legs const& v0legs, MyPrimaryElectrons const& primaryelectrons) + { + runPairing(collisions, v0s, primaryelectrons, v0legs, primaryelectrons, perCollision_v0, perCollision_electron, fV0PhotonCut, fDileptonCut); // produces filter bit for both photons and electrons + } + PROCESS_SWITCH(prefilterPhoton, processPCMDalitzEE, "produce prefilter bit for PCM-DalitzEE", false); + + void processDummyV0(MyV0Photons const& v0s) { for (int i = 0; i < v0s.size(); i++) { - pfb_derived(0); + pfb_v0_derived(0); + } + } + PROCESS_SWITCH(prefilterPhoton, processDummyV0, "dummy for v0s", true); + + void processDummyElectron(MyPrimaryElectrons const& primaryelectrons) + { + for (int i = 0; i < primaryelectrons.size(); i++) { + pfb_ele_derived(0); } } - PROCESS_SWITCH(prefilterPhoton, processDummy, "dummy", true); + PROCESS_SWITCH(prefilterPhoton, processDummyElectron, "dummy for electrons", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) diff --git a/PWGEM/PhotonMeson/Utils/PairUtilities.h b/PWGEM/PhotonMeson/Utils/PairUtilities.h index 1f9cd8aa9dd..71e0e6a72e9 100644 --- a/PWGEM/PhotonMeson/Utils/PairUtilities.h +++ b/PWGEM/PhotonMeson/Utils/PairUtilities.h @@ -21,9 +21,17 @@ namespace o2::aod::pwgem::photonmeson::utils::pairutil { enum class PhotonPrefilterBitDerived : int { - kPhotonFromPi0Default = 0, // photon from pi0, default - kPhotonFromPi0Loose = 1, // photon from pi0, loose - kPhotonFromPi0Tight = 2, // photon from pi0, tight + kPhotonFromPi0ggDefault = 0, // photon from pi0->gg, default + kPhotonFromPi0ggLoose = 1, // photon from pi0->gg, loose + kPhotonFromPi0ggTight = 2, // photon from pi0->gg, tight + kPhotonFromPi0eegDefault = 3, // photon from pi0->eeg, default + kPhotonFromPi0eegLoose = 4, // photon from pi0->eeg, loose + kPhotonFromPi0eegTight = 5, // photon from pi0->eeg, tight +}; +enum class ElectronPrefilterBitDerived : int { + kElectronFromPi0eegDefault = 0, // electron from pi0->eeg, default + kElectronFromPi0eegLoose = 1, // electron from pi0->eeg, loose + kElectronFromPi0eegTight = 2, // electron from pi0->eeg, tight }; } // namespace o2::aod::pwgem::photonmeson::utils::pairutil namespace o2::aod::pwgem::photonmeson::photonpair From 19449aa966e7f60de3a7da888030c1fad48668a6 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Sat, 1 Mar 2025 21:18:09 +0900 Subject: [PATCH 0486/1650] [PWGEM/Dilepton] upadte dalitzEEQC (#10264) --- PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx | 22 ++++------------------ PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx | 22 ++++------------------ 2 files changed, 8 insertions(+), 36 deletions(-) diff --git a/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx b/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx index 5def3ca8e03..e2d13df4f40 100644 --- a/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx +++ b/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx @@ -82,7 +82,6 @@ struct DalitzEEQC { Configurable cfg_min_mass{"cfg_min_mass", 0.0, "min mass"}; Configurable cfg_max_mass{"cfg_max_mass", 0.5, "max mass"}; Configurable cfg_apply_phiv{"cfg_apply_phiv", true, "flag to apply phiv cut"}; - Configurable cfg_apply_pf{"cfg_apply_pf", false, "flag to apply phiv prefilter"}; Configurable cfg_require_itsib_any{"cfg_require_itsib_any", true, "flag to require ITS ib any hits"}; Configurable cfg_require_itsib_1st{"cfg_require_itsib_1st", false, "flag to require ITS ib 1st hit"}; Configurable cfg_phiv_slope{"cfg_phiv_slope", 0.0185, "slope for m vs. phiv"}; @@ -175,21 +174,8 @@ struct DalitzEEQC { o2::aod::pwgem::photonmeson::utils::eventhistogram::addEventHistograms(&fRegistry); // pair info - std::vector ptbins; - std::vector massbins; - - for (int i = 0; i < 51; i++) { - massbins.emplace_back(0.01 * (i - 0) + 0.0); // every 0.01 GeV/c2 from 0.0 to 0.5 GeV/c2 - } - const AxisSpec axis_mass{massbins, "m_{ee} (GeV/c^{2})"}; - - for (int i = 0; i < 50; i++) { - ptbins.emplace_back(0.1 * (i - 0) + 0.0); // every 0.1 GeV/c from 0.0 to 5.0 GeV/c - } - for (int i = 50; i < 61; i++) { - ptbins.emplace_back(0.5 * (i - 50) + 5.0); // every 0.5 GeV/c from 5.0 to 10 GeV/c - } - const AxisSpec axis_pt{ptbins, "p_{T,ee} (GeV/c)"}; + const AxisSpec axis_mass{200, 0, 0.2, "m_{ee} (GeV/c^{2})"}; + const AxisSpec axis_pt{200, 0, 2, "p_{T,ee} (GeV/c)"}; fRegistry.add("Pair/same/hMvsPt", "m_{ee} vs. p_{T,ee};m_{ee} (GeV/c^{2});p_{T,ee} (GeV/c)", kTH2F, {axis_mass, axis_pt}, true); fRegistry.add("Pair/same/hMvsPhiV", "m_{ee} vs. #varphi_{V};#varphi (rad.);m_{ee} (GeV/c^{2})", kTH2F, {{90, 0, M_PI}, {100, 0.0f, 0.1f}}, true); @@ -331,8 +317,8 @@ struct DalitzEEQC { SliceCache cache; Preslice perCollision_track = aod::emprimaryelectron::emeventId; - Filter trackFilter = static_cast(dileptoncuts.cfg_min_pt_track) < o2::aod::track::pt && nabs(o2::aod::track::eta) < static_cast(dileptoncuts.cfg_max_eta_track) && o2::aod::track::tpcChi2NCl < static_cast(dileptoncuts.cfg_max_chi2tpc) && o2::aod::track::itsChi2NCl < static_cast(dileptoncuts.cfg_max_chi2its) && nabs(o2::aod::track::dcaXY) < static_cast(dileptoncuts.cfg_max_dcaxy) && nabs(o2::aod::track::dcaZ) < static_cast(dileptoncuts.cfg_max_dcaz); - Filter pidFilter = (static_cast(dileptoncuts.cfg_min_TPCNsigmaEl) < o2::aod::pidtpc::tpcNSigmaEl && o2::aod::pidtpc::tpcNSigmaEl < static_cast(dileptoncuts.cfg_max_TPCNsigmaEl)) && (o2::aod::pidtpc::tpcNSigmaPi < static_cast(dileptoncuts.cfg_min_TPCNsigmaPi) || static_cast(dileptoncuts.cfg_max_TPCNsigmaPi) < o2::aod::pidtpc::tpcNSigmaPi); + Filter trackFilter = dileptoncuts.cfg_min_pt_track < o2::aod::track::pt && nabs(o2::aod::track::eta) < dileptoncuts.cfg_max_eta_track && o2::aod::track::tpcChi2NCl < dileptoncuts.cfg_max_chi2tpc && o2::aod::track::itsChi2NCl < dileptoncuts.cfg_max_chi2its && nabs(o2::aod::track::dcaXY) < dileptoncuts.cfg_max_dcaxy && nabs(o2::aod::track::dcaZ) < dileptoncuts.cfg_max_dcaz; + Filter pidFilter = dileptoncuts.cfg_min_TPCNsigmaEl < o2::aod::pidtpc::tpcNSigmaEl && o2::aod::pidtpc::tpcNSigmaEl < dileptoncuts.cfg_max_TPCNsigmaEl && (o2::aod::pidtpc::tpcNSigmaPi < dileptoncuts.cfg_min_TPCNsigmaPi || dileptoncuts.cfg_max_TPCNsigmaPi < o2::aod::pidtpc::tpcNSigmaPi); using FilteredMyTracks = soa::Filtered; Partition posTracks = o2::aod::emprimaryelectron::sign > int8_t(0); Partition negTracks = o2::aod::emprimaryelectron::sign < int8_t(0); diff --git a/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx b/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx index 0f8e539f323..a39ddabed0b 100644 --- a/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx @@ -86,7 +86,6 @@ struct DalitzEEQCMC { Configurable cfg_min_mass{"cfg_min_mass", 0.0, "min mass"}; Configurable cfg_max_mass{"cfg_max_mass", 1e+10, "max mass"}; Configurable cfg_apply_phiv{"cfg_apply_phiv", true, "flag to apply phiv cut"}; - Configurable cfg_apply_pf{"cfg_apply_pf", false, "flag to apply phiv prefilter"}; Configurable cfg_require_itsib_any{"cfg_require_itsib_any", true, "flag to require ITS ib any hits"}; Configurable cfg_require_itsib_1st{"cfg_require_itsib_1st", false, "flag to require ITS ib 1st hit"}; Configurable cfg_phiv_slope{"cfg_phiv_slope", 0.0185, "slope for m vs. phiv"}; @@ -131,21 +130,8 @@ struct DalitzEEQCMC { // event info o2::aod::pwgem::photonmeson::utils::eventhistogram::addEventHistograms(&fRegistry); - std::vector ptbins; - std::vector massbins; - - for (int i = 0; i < 51; i++) { - massbins.emplace_back(0.01 * (i - 0) + 0.0); // every 0.01 GeV/c2 from 0.0 to 0.5 GeV/c2 - } - const AxisSpec axis_mass{massbins, "m_{ee} (GeV/c^{2})"}; - - for (int i = 0; i < 50; i++) { - ptbins.emplace_back(0.1 * (i - 0) + 0.0); // every 0.1 GeV/c from 0.0 to 5.0 GeV/c - } - for (int i = 50; i < 61; i++) { - ptbins.emplace_back(0.5 * (i - 50) + 5.0); // every 0.5 GeV/c from 5.0 to 10 GeV/c - } - const AxisSpec axis_pt{ptbins, "p_{T,ee} (GeV/c)"}; + const AxisSpec axis_mass{200, 0, 0.2, "m_{ee} (GeV/c^{2})"}; + const AxisSpec axis_pt{200, 0, 2, "p_{T,ee} (GeV/c)"}; // generated info fRegistry.add("Generated/sm/Pi0/hMvsPt", "m_{ee} vs. p_{T,ee} ULS", kTH2F, {axis_mass, axis_pt}, true); @@ -431,8 +417,8 @@ struct DalitzEEQCMC { std::vector used_trackIds; SliceCache cache; Preslice perCollision_track = aod::emprimaryelectron::emeventId; - Filter trackFilter = static_cast(dileptoncuts.cfg_min_pt_track) < o2::aod::track::pt && nabs(o2::aod::track::eta) < static_cast(dileptoncuts.cfg_max_eta_track) && o2::aod::track::tpcChi2NCl < static_cast(dileptoncuts.cfg_max_chi2tpc) && o2::aod::track::itsChi2NCl < static_cast(dileptoncuts.cfg_max_chi2its) && nabs(o2::aod::track::dcaXY) < static_cast(dileptoncuts.cfg_max_dcaxy) && nabs(o2::aod::track::dcaZ) < static_cast(dileptoncuts.cfg_max_dcaz); - Filter pidFilter = (static_cast(dileptoncuts.cfg_min_TPCNsigmaEl) < o2::aod::pidtpc::tpcNSigmaEl && o2::aod::pidtpc::tpcNSigmaEl < static_cast(dileptoncuts.cfg_max_TPCNsigmaEl)) && (o2::aod::pidtpc::tpcNSigmaPi < static_cast(dileptoncuts.cfg_min_TPCNsigmaPi) || static_cast(dileptoncuts.cfg_max_TPCNsigmaPi) < o2::aod::pidtpc::tpcNSigmaPi); + Filter trackFilter = dileptoncuts.cfg_min_pt_track < o2::aod::track::pt && nabs(o2::aod::track::eta) < dileptoncuts.cfg_max_eta_track && o2::aod::track::tpcChi2NCl < dileptoncuts.cfg_max_chi2tpc && o2::aod::track::itsChi2NCl < dileptoncuts.cfg_max_chi2its && nabs(o2::aod::track::dcaXY) < dileptoncuts.cfg_max_dcaxy && nabs(o2::aod::track::dcaZ) < dileptoncuts.cfg_max_dcaz; + Filter pidFilter = dileptoncuts.cfg_min_TPCNsigmaEl < o2::aod::pidtpc::tpcNSigmaEl && o2::aod::pidtpc::tpcNSigmaEl < dileptoncuts.cfg_max_TPCNsigmaEl && (o2::aod::pidtpc::tpcNSigmaPi < dileptoncuts.cfg_min_TPCNsigmaPi || dileptoncuts.cfg_max_TPCNsigmaPi < o2::aod::pidtpc::tpcNSigmaPi); using FilteredMyMCTracks = soa::Filtered; Partition posTracks = o2::aod::emprimaryelectron::sign > int8_t(0); Partition negTracks = o2::aod::emprimaryelectron::sign < int8_t(0); From bde61be34ac6759b0641b79f1983edb7beed234d Mon Sep 17 00:00:00 2001 From: Joachim Carlo Kristian Bjerg Hansen <50103987+joachimckh@users.noreply.github.com> Date: Sat, 1 Mar 2025 15:48:10 +0100 Subject: [PATCH 0487/1650] [PWGJE] fixed rho local bug (#10263) --- PWGJE/Tasks/jetSpectraEseTask.cxx | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/PWGJE/Tasks/jetSpectraEseTask.cxx b/PWGJE/Tasks/jetSpectraEseTask.cxx index d708db35267..f7ef38c47fb 100644 --- a/PWGJE/Tasks/jetSpectraEseTask.cxx +++ b/PWGJE/Tasks/jetSpectraEseTask.cxx @@ -287,16 +287,18 @@ struct JetSpectraEseTask { auto rho = collision.rho(); std::unique_ptr rhoFit{nullptr}; - if (cfgrhoPhi) + if (cfgrhoPhi) { rhoFit = fitRho(collision, psi, tracks); + } registry.fill(HIST("hEventCounter"), counter++); registry.fill(HIST("hRho"), rho); registry.fill(HIST("hCentralityAnalyzed"), collision.centrality()); for (auto const& jet : jets) { - float jetpTbkgsub = jet.pt() - (rho * jet.area()); - if (cfgrhoPhi) + if (cfgrhoPhi) { rho = evalRho(rhoFit.get(), jet.phi(), rho); + } + float jetpTbkgsub = jet.pt() - (rho * jet.area()); registry.fill(HIST("hJetPt"), jet.pt()); registry.fill(HIST("hJetPt_bkgsub"), jetpTbkgsub); registry.fill(HIST("hJetEta"), jet.eta()); @@ -631,17 +633,12 @@ struct JetSpectraEseTask { hPhiPt->Fit(modulationFit.get(), "Q", "", 0, o2::constants::math::TwoPI); - std::array fitParams{}; - for (int i{0}; i < 5; ++i) { - fitParams[i] = modulationFit->GetParameter(i); - } - if constexpr (fillHist) { - registry.fill(HIST("hfitPar0"), col.centrality(), fitParams[0]); - registry.fill(HIST("hfitPar1"), col.centrality(), fitParams[1]); - registry.fill(HIST("hfitPar2"), col.centrality(), fitParams[2]); - registry.fill(HIST("hfitPar3"), col.centrality(), fitParams[3]); - registry.fill(HIST("hfitPar4"), col.centrality(), fitParams[4]); + registry.fill(HIST("hfitPar0"), col.centrality(), modulationFit->GetParameter(0)); + registry.fill(HIST("hfitPar1"), col.centrality(), modulationFit->GetParameter(1)); + registry.fill(HIST("hfitPar2"), col.centrality(), modulationFit->GetParameter(2)); + registry.fill(HIST("hfitPar3"), col.centrality(), modulationFit->GetParameter(3)); + registry.fill(HIST("hfitPar4"), col.centrality(), modulationFit->GetParameter(4)); } double chi2{0.}; From 6b0cd0c39a902e58b24212d7a778aff31765ba3e Mon Sep 17 00:00:00 2001 From: alcaliva <32872606+alcaliva@users.noreply.github.com> Date: Sat, 1 Mar 2025 16:39:11 +0100 Subject: [PATCH 0488/1650] [PWGLF] modified definition of ITS-TPC matching eff (#10265) --- .../QC/lfITSTPCMatchingSecondaryTracksQA.cxx | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx b/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx index 6322224f14f..4d59f6e9dea 100644 --- a/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx +++ b/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx @@ -61,7 +61,7 @@ struct LfITSTPCMatchingSecondaryTracksQA { Configurable zVtx{"zVtx", 10.0, "Maximum zVertex"}; // Track Parameters - Configurable minITSnCls{"minITSnCls", 3.0f, "min number of ITS clusters"}; + Configurable minITSnCls{"minITSnCls", 1.0f, "min number of ITS clusters"}; Configurable minNCrossedRowsTPC{"minNCrossedRowsTPC", 80.0f, "min number of TPC crossed rows"}; Configurable minNCrossedRowsOverFindable{"minNCrossedRowsOverFindable", 0.8f, "min number of TPC crossed rows/findable"}; Configurable maxChi2TPC{"maxChi2TPC", 4.0f, "max chi2 per cluster TPC"}; @@ -211,15 +211,27 @@ struct LfITSTPCMatchingSecondaryTracksQA { template bool passedTrackSelectionIts(const ItsTrack& track) { + /* if (!track.hasITS()) return false; if (track.itsNCls() < minITSnCls) return false; if (track.itsChi2NCl() > maxChi2ITS) return false; + */ - auto requiredItsHit = static_cast>(requiredHit); + if (track.itsNCls() < minITSnCls) + return false; + bool hasHitOnAnyLayer = false; + for (int i = 0; i < 7; i++) { + if (hasHitOnITSlayer(track.itsClusterMap(), i)) + hasHitOnAnyLayer = true; + } + if (!hasHitOnAnyLayer) + return false; + + auto requiredItsHit = static_cast>(requiredHit); if (requireItsHits) { for (int i = 0; i < 7; i++) { if (requiredItsHit[i] > 0 && !hasHitOnITSlayer(track.itsClusterMap(), i)) { @@ -250,7 +262,7 @@ struct LfITSTPCMatchingSecondaryTracksQA { // Secondary Tracks if (passedTrackSelectionTpcSecondary(track) && passedPionSelection(track)) registryData.fill(HIST("secPionTPC"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); - if (passedTrackSelectionTpcSecondary(track) && passedPionSelection(track) && track.hasITS()) + if (passedTrackSelectionTpcSecondary(track) && passedPionSelection(track) && passedTrackSelectionIts(track)) registryData.fill(HIST("secPionTPC_ITS"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); } @@ -265,9 +277,9 @@ struct LfITSTPCMatchingSecondaryTracksQA { registryData.fill(HIST("secPionV0TPC"), posTrack.pt(), posTrack.eta(), TVector2::Phi_0_2pi(posTrack.phi())); if (passedTrackSelectionV0daughTPC(negTrack) && passedPionSelection(negTrack)) registryData.fill(HIST("secPionV0TPC"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); - if (passedTrackSelectionV0daughTPC(posTrack) && passedPionSelection(posTrack) && posTrack.hasITS()) + if (passedTrackSelectionV0daughTPC(posTrack) && passedPionSelection(posTrack) && passedTrackSelectionIts(posTrack)) registryData.fill(HIST("secPionV0TPC_ITS"), posTrack.pt(), posTrack.eta(), TVector2::Phi_0_2pi(posTrack.phi())); - if (passedTrackSelectionV0daughTPC(negTrack) && passedPionSelection(negTrack) && negTrack.hasITS()) + if (passedTrackSelectionV0daughTPC(negTrack) && passedPionSelection(negTrack) && passedTrackSelectionIts(negTrack)) registryData.fill(HIST("secPionV0TPC_ITS"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); } } @@ -299,7 +311,7 @@ struct LfITSTPCMatchingSecondaryTracksQA { // Secondary Tracks if (passedTrackSelectionTpcSecondary(track) && passedPionSelection(track)) registryMC.fill(HIST("secPionTPC_MC"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); - if (passedTrackSelectionTpcSecondary(track) && passedPionSelection(track) && track.hasITS()) + if (passedTrackSelectionTpcSecondary(track) && passedPionSelection(track) && passedTrackSelectionIts(track)) registryMC.fill(HIST("secPionTPC_ITS_MC"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); } @@ -314,9 +326,9 @@ struct LfITSTPCMatchingSecondaryTracksQA { registryMC.fill(HIST("secPionV0TPC_MC"), posTrack.pt(), posTrack.eta(), TVector2::Phi_0_2pi(posTrack.phi())); if (passedTrackSelectionV0daughTPC(negTrack) && passedPionSelection(negTrack)) registryMC.fill(HIST("secPionV0TPC_MC"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); - if (passedTrackSelectionV0daughTPC(posTrack) && passedPionSelection(posTrack) && posTrack.hasITS()) + if (passedTrackSelectionV0daughTPC(posTrack) && passedPionSelection(posTrack) && passedTrackSelectionIts(posTrack)) registryMC.fill(HIST("secPionV0TPC_ITS_MC"), posTrack.pt(), posTrack.eta(), TVector2::Phi_0_2pi(posTrack.phi())); - if (passedTrackSelectionV0daughTPC(negTrack) && passedPionSelection(negTrack) && negTrack.hasITS()) + if (passedTrackSelectionV0daughTPC(negTrack) && passedPionSelection(negTrack) && passedTrackSelectionIts(negTrack)) registryMC.fill(HIST("secPionV0TPC_ITS_MC"), negTrack.pt(), negTrack.eta(), TVector2::Phi_0_2pi(negTrack.phi())); } } From f419a2f04efb794abfc89c88ea6cf975004f5585 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Sat, 1 Mar 2025 17:54:18 +0100 Subject: [PATCH 0489/1650] [PWGLF] Add fraction of TPC share cluster cut (#10268) --- PWGLF/Tasks/Resonances/phipbpb.cxx | 39 ++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/PWGLF/Tasks/Resonances/phipbpb.cxx b/PWGLF/Tasks/Resonances/phipbpb.cxx index fe0d3f178e1..b82bd15596a 100644 --- a/PWGLF/Tasks/Resonances/phipbpb.cxx +++ b/PWGLF/Tasks/Resonances/phipbpb.cxx @@ -109,6 +109,7 @@ struct phipbpb { Configurable cfgNoMixedEvents{"cfgNoMixedEvents", 1, "Number of mixed events per event"}; Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; Configurable cfgTPCcluster{"cfgTPCcluster", 70, "Number of TPC cluster"}; + Configurable cfgTPCSharedcluster{"cfgTPCSharedcluster", 0.4, "Maximum Number of TPC shared cluster"}; Configurable isDeepAngle{"isDeepAngle", false, "Deep Angle cut"}; Configurable ispTdepPID{"ispTdepPID", true, "pT dependent PID"}; Configurable checkAllCharge{"checkAllCharge", true, "check all charge for MC weight"}; @@ -173,6 +174,8 @@ struct phipbpb { const AxisSpec thnAxisRapidity{configThnAxisRapidity, "Rapidity"}; const AxisSpec thnAxisSA{configThnAxisSA, "SA"}; AxisSpec cumulantAxis = {200, -1, 1, "phi"}; + AxisSpec itsAxis = {8, -0.5, 7.5, "its"}; + AxisSpec tpcAxis = {130, 69.5, 199.5, "its"}; AxisSpec squareAxis = {200, 0, 1, "aossquare"}; AxisSpec phiAxis = {500, -6.28, 6.28, "phi"}; AxisSpec resAxis = {6000, -30, 30, "Res"}; @@ -189,6 +192,12 @@ struct phipbpb { histos.add("hEta", "Eta distribution", kTH1F, {{200, -1.0f, 1.0f}}); histos.add("hDcaxy", "Dcaxy distribution", kTH1F, {{200, -1.0f, 1.0f}}); histos.add("hDcaz", "Dcaz distribution", kTH1F, {{200, -1.0f, 1.0f}}); + + histos.add("hITS", "ITS cluster", kTH2F, {{10, -0.5f, 9.5f}, {200, -1.0, 1.0}}); + histos.add("hTPC", "TPC crossed rows", kTH2F, {{90, 69.5f, 159.5f}, {200, -1.0, 1.0}}); + histos.add("hTPCScls", "TPC Shared cluster", kTH2F, {{16, -0.5f, 159.5f}, {200, -1.0, 1.0}}); + histos.add("hTPCSclsFrac", "Fraction of TPC Shared cluster", kTH2F, {{100, -0.0f, 2.0f}, {200, -1.0, 1.0}}); + histos.add("hNsigmaKaonTPC", "NsigmaKaon TPC distribution", kTH1F, {{200, -10.0f, 10.0f}}); histos.add("hNsigmaKaonTOF", "NsigmaKaon TOF distribution", kTH1F, {{200, -10.0f, 10.0f}}); histos.add("hPsiFT0C", "PsiFT0C", kTH3F, {centAxis, occupancyAxis, phiAxis}); @@ -321,7 +330,7 @@ struct phipbpb { template bool selectionTrack(const T& candidate) { - if (useGlobalTrack && !(candidate.isGlobalTrack() && candidate.isPVContributor() && candidate.itsNCls() > cfgITScluster && candidate.tpcNClsFound() > cfgTPCcluster)) { + if (useGlobalTrack && !(candidate.isGlobalTrack() && candidate.isPVContributor() && candidate.itsNCls() > cfgITScluster && candidate.tpcNClsCrossedRows() > cfgTPCcluster && candidate.tpcFractionSharedCls() < cfgTPCSharedcluster)) { return false; } if (!useGlobalTrack && !(candidate.tpcNClsFound() > cfgTPCcluster)) { @@ -420,7 +429,10 @@ struct phipbpb { TH2D* hweight; void processSameEvent(EventCandidates::iterator const& collision, TrackCandidates const& /*tracks, aod::BCs const&*/, aod::BCsWithTimestamps const&) { - if (!collision.sel8() || !collision.triggereventep() || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(aod::evsel::kNoITSROFrameBorder) || !collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV) || !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + // if (!collision.sel8() || !collision.triggereventep() || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(aod::evsel::kNoITSROFrameBorder) || !collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV) || !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + // return; + // } + if (!collision.sel8() || !collision.triggereventep() || !collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { return; } auto centrality = collision.centFT0C(); @@ -444,7 +456,7 @@ struct phipbpb { return; } histos.fill(HIST("hFTOCvsTPC"), centrality, multTPC); - if (additionalEvsel && !eventSelected(collision, centrality)) { + if (additionalEvsel && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { return; } if (additionalEvselITS && !collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { @@ -505,6 +517,11 @@ struct phipbpb { histos.fill(HIST("hDcaz"), track1.dcaZ()); histos.fill(HIST("hNsigmaKaonTPC"), track1.tpcNSigmaKa()); histos.fill(HIST("hNsigmaKaonTOF"), track1.tofNSigmaKa()); + auto V2Track = TMath::Cos(2.0 * GetPhiInRange(track1.phi() - psiFT0C)); + histos.fill(HIST("hITS"), track1.itsNCls(), V2Track); + histos.fill(HIST("hTPC"), track1.tpcNClsCrossedRows(), V2Track); + histos.fill(HIST("hTPCScls"), track1.tpcNClsShared(), V2Track); + histos.fill(HIST("hTPCSclsFrac"), track1.tpcFractionSharedCls(), V2Track); auto track1ID = track1.globalIndex(); if (useWeight) { if (track1.pt() < 10.0 && track1.pt() > 0.15) { @@ -627,10 +644,16 @@ struct phipbpb { BinningTypeVertexContributor binningOnPositions{{axisVertex, axisMultiplicityClass, axisOccup}, true}; SameKindPair pair{binningOnPositions, cfgNoMixedEvents, -1, collisions, tracksTuple, &cache}; for (auto& [collision1, tracks1, collision2, tracks2] : pair) { - if (!collision1.sel8() || !collision1.triggereventep() || !collision1.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision1.selection_bit(aod::evsel::kNoITSROFrameBorder) || !collision1.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision1.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV) || !collision1.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + // if (!collision1.sel8() || !collision1.triggereventep() || !collision1.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision1.selection_bit(aod::evsel::kNoITSROFrameBorder) || !collision1.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision1.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV) || !collision1.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + // continue; + // } + // if (!collision2.sel8() || !collision2.triggereventep() || !collision2.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision2.selection_bit(aod::evsel::kNoITSROFrameBorder) || !collision2.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision2.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV) || !collision2.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + // continue; + // } + if (!collision1.sel8() || !collision1.triggereventep() || !collision1.selection_bit(aod::evsel::kNoSameBunchPileup)) { continue; } - if (!collision2.sel8() || !collision2.triggereventep() || !collision2.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision2.selection_bit(aod::evsel::kNoITSROFrameBorder) || !collision2.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision2.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV) || !collision2.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + if (!collision2.sel8() || !collision2.triggereventep() || !collision2.selection_bit(aod::evsel::kNoSameBunchPileup)) { continue; } if (collision1.bcId() == collision2.bcId()) { @@ -646,13 +669,13 @@ struct phipbpb { continue; } auto centrality = collision1.centFT0C(); - auto centrality2 = collision2.centFT0C(); + // auto centrality2 = collision2.centFT0C(); auto psiFT0C = collision1.psiFT0C(); auto QFT0C = collision1.qFT0C(); - if (additionalEvsel && !eventSelected(collision1, centrality)) { + if (additionalEvsel && !collision1.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { continue; } - if (additionalEvsel && !eventSelected(collision2, centrality2)) { + if (additionalEvsel && !collision2.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { continue; } if (additionalEvselITS && !collision1.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { From c10c48a8992a307c5889e90d2ff0cf10422a121e Mon Sep 17 00:00:00 2001 From: Junlee Kim Date: Sat, 1 Mar 2025 18:18:10 +0100 Subject: [PATCH 0490/1650] [PWGLF] weighting polarization (#10269) --- .../Tasks/Strangeness/lambdapolarization.cxx | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdapolarization.cxx b/PWGLF/Tasks/Strangeness/lambdapolarization.cxx index aae80763817..38e17ba338a 100644 --- a/PWGLF/Tasks/Strangeness/lambdapolarization.cxx +++ b/PWGLF/Tasks/Strangeness/lambdapolarization.cxx @@ -746,11 +746,11 @@ struct lambdapolarization { if (nmode == 2) { //////////// if (LambdaTag) { - histos.fill(HIST("psi2/h_lambda_cos"), v0.mLambda(), v0.pt(), angle, centrality, relphi, weight); - histos.fill(HIST("psi2/h_lambda_cos2"), v0.mLambda(), v0.pt(), angle * angle, centrality, relphi, weight); - histos.fill(HIST("psi2/h_lambda_cossin"), v0.mLambda(), v0.pt(), angle * TMath::Sin(relphi), centrality, weight); - histos.fill(HIST("psi2/h_lambda_vncos"), v0.mLambda(), v0.pt(), qvecMag * TMath::Cos(relphi), centrality, weight); - histos.fill(HIST("psi2/h_lambda_vnsin"), v0.mLambda(), v0.pt(), TMath::Sin(relphi), centrality, weight); + histos.fill(HIST("psi2/h_lambda_cos"), v0.mLambda(), v0.pt(), angle * weight, centrality, relphi); + histos.fill(HIST("psi2/h_lambda_cos2"), v0.mLambda(), v0.pt(), angle * angle, centrality, relphi); + histos.fill(HIST("psi2/h_lambda_cossin"), v0.mLambda(), v0.pt(), angle * TMath::Sin(relphi) * weight, centrality); + histos.fill(HIST("psi2/h_lambda_vncos"), v0.mLambda(), v0.pt(), qvecMag * TMath::Cos(relphi) * weight, centrality); + histos.fill(HIST("psi2/h_lambda_vnsin"), v0.mLambda(), v0.pt(), TMath::Sin(relphi), centrality); if (cfgRapidityDep) { histos.fill(HIST("psi2/h_lambda_cos2_rap"), v0.mLambda(), v0.pt(), angle * angle, centrality, v0.yLambda(), weight); @@ -795,11 +795,11 @@ struct lambdapolarization { } } if (aLambdaTag) { - histos.fill(HIST("psi2/h_alambda_cos"), v0.mAntiLambda(), v0.pt(), angle, centrality, relphi, weight); - histos.fill(HIST("psi2/h_alambda_cos2"), v0.mAntiLambda(), v0.pt(), angle * angle, centrality, relphi, weight); - histos.fill(HIST("psi2/h_alambda_cossin"), v0.mAntiLambda(), v0.pt(), angle * TMath::Sin(relphi), centrality, weight); - histos.fill(HIST("psi2/h_alambda_vncos"), v0.mAntiLambda(), v0.pt(), qvecMag * TMath::Cos(relphi), centrality, weight); - histos.fill(HIST("psi2/h_alambda_vnsin"), v0.mAntiLambda(), v0.pt(), TMath::Sin(relphi), centrality, weight); + histos.fill(HIST("psi2/h_alambda_cos"), v0.mAntiLambda(), v0.pt(), angle * weight, centrality, relphi); + histos.fill(HIST("psi2/h_alambda_cos2"), v0.mAntiLambda(), v0.pt(), angle * angle, centrality, relphi); + histos.fill(HIST("psi2/h_alambda_cossin"), v0.mAntiLambda(), v0.pt(), angle * TMath::Sin(relphi) * weight, centrality); + histos.fill(HIST("psi2/h_alambda_vncos"), v0.mAntiLambda(), v0.pt(), qvecMag * TMath::Cos(relphi) * weight, centrality); + histos.fill(HIST("psi2/h_alambda_vnsin"), v0.mAntiLambda(), v0.pt(), TMath::Sin(relphi), centrality); if (cfgRapidityDep) { histos.fill(HIST("psi2/h_alambda_cos2_rap"), v0.mAntiLambda(), v0.pt(), angle * angle, centrality, v0.yLambda(), weight); @@ -845,11 +845,11 @@ struct lambdapolarization { } } else if (nmode == 3) { if (LambdaTag) { - histos.fill(HIST("psi3/h_lambda_cos"), v0.mLambda(), v0.pt(), angle, centrality, relphi, weight); - histos.fill(HIST("psi3/h_lambda_cos2"), v0.mLambda(), v0.pt(), angle * angle, centrality, relphi, weight); - histos.fill(HIST("psi3/h_lambda_cossin"), v0.mLambda(), v0.pt(), angle * TMath::Sin(relphi), centrality, weight); - histos.fill(HIST("psi3/h_lambda_vncos"), v0.mLambda(), v0.pt(), qvecMag * TMath::Cos(relphi), centrality, weight); - histos.fill(HIST("psi3/h_lambda_vnsin"), v0.mLambda(), v0.pt(), TMath::Sin(relphi), centrality, weight); + histos.fill(HIST("psi3/h_lambda_cos"), v0.mLambda(), v0.pt(), angle * weight, centrality, relphi); + histos.fill(HIST("psi3/h_lambda_cos2"), v0.mLambda(), v0.pt(), angle * angle, centrality, relphi); + histos.fill(HIST("psi3/h_lambda_cossin"), v0.mLambda(), v0.pt(), angle * TMath::Sin(relphi) * weight, centrality); + histos.fill(HIST("psi3/h_lambda_vncos"), v0.mLambda(), v0.pt(), qvecMag * TMath::Cos(relphi) * weight, centrality); + histos.fill(HIST("psi3/h_lambda_vnsin"), v0.mLambda(), v0.pt(), TMath::Sin(relphi), centrality); if (cfgRapidityDep) { histos.fill(HIST("psi3/h_lambda_cos2_rap"), v0.mLambda(), v0.pt(), angle * angle, centrality, v0.yLambda(), weight); @@ -860,11 +860,11 @@ struct lambdapolarization { } } if (aLambdaTag) { - histos.fill(HIST("psi3/h_alambda_cos"), v0.mAntiLambda(), v0.pt(), angle, centrality, relphi, weight); + histos.fill(HIST("psi3/h_alambda_cos"), v0.mAntiLambda(), v0.pt(), angle * weight, centrality, relphi); histos.fill(HIST("psi3/h_alambda_cos2"), v0.mAntiLambda(), v0.pt(), angle * angle, centrality, relphi, weight); - histos.fill(HIST("psi3/h_alambda_cossin"), v0.mAntiLambda(), v0.pt(), angle * TMath::Sin(relphi), centrality, weight); - histos.fill(HIST("psi3/h_alambda_vncos"), v0.mAntiLambda(), v0.pt(), qvecMag * TMath::Cos(relphi), centrality, weight); - histos.fill(HIST("psi3/h_alambda_vnsin"), v0.mAntiLambda(), v0.pt(), TMath::Sin(relphi), centrality, weight); + histos.fill(HIST("psi3/h_alambda_cossin"), v0.mAntiLambda(), v0.pt(), angle * TMath::Sin(relphi) * weight, centrality); + histos.fill(HIST("psi3/h_alambda_vncos"), v0.mAntiLambda(), v0.pt(), qvecMag * TMath::Cos(relphi) * weight, centrality); + histos.fill(HIST("psi3/h_alambda_vnsin"), v0.mAntiLambda(), v0.pt(), TMath::Sin(relphi), centrality); if (cfgRapidityDep) { histos.fill(HIST("psi3/h_alambda_cos2_rap"), v0.mAntiLambda(), v0.pt(), angle * angle, centrality, v0.yLambda(), weight); @@ -876,11 +876,11 @@ struct lambdapolarization { } } else if (nmode == 4) { if (LambdaTag) { - histos.fill(HIST("psi4/h_lambda_cos"), v0.mLambda(), v0.pt(), angle, centrality, relphi, weight); - histos.fill(HIST("psi4/h_lambda_cos2"), v0.mLambda(), v0.pt(), angle * angle, centrality, relphi, weight); - histos.fill(HIST("psi4/h_lambda_cossin"), v0.mLambda(), v0.pt(), angle * TMath::Sin(relphi), centrality, weight); - histos.fill(HIST("psi4/h_lambda_vncos"), v0.mLambda(), v0.pt(), qvecMag * TMath::Cos(relphi), centrality, weight); - histos.fill(HIST("psi4/h_lambda_vnsin"), v0.mLambda(), v0.pt(), TMath::Sin(relphi), centrality, weight); + histos.fill(HIST("psi4/h_lambda_cos"), v0.mLambda(), v0.pt(), angle * weight, centrality, relphi); + histos.fill(HIST("psi4/h_lambda_cos2"), v0.mLambda(), v0.pt(), angle * angle, centrality, relphi); + histos.fill(HIST("psi4/h_lambda_cossin"), v0.mLambda(), v0.pt(), angle * TMath::Sin(relphi) * weight, centrality); + histos.fill(HIST("psi4/h_lambda_vncos"), v0.mLambda(), v0.pt(), qvecMag * TMath::Cos(relphi) * weight, centrality); + histos.fill(HIST("psi4/h_lambda_vnsin"), v0.mLambda(), v0.pt(), TMath::Sin(relphi), centrality); if (cfgRapidityDep) { histos.fill(HIST("psi4/h_lambda_cos2_rap"), v0.mLambda(), v0.pt(), angle * angle, centrality, v0.yLambda(), weight); @@ -891,11 +891,11 @@ struct lambdapolarization { } } if (aLambdaTag) { - histos.fill(HIST("psi4/h_alambda_cos"), v0.mAntiLambda(), v0.pt(), angle, centrality, relphi, weight); - histos.fill(HIST("psi4/h_alambda_cos2"), v0.mAntiLambda(), v0.pt(), angle * angle, centrality, relphi, weight); - histos.fill(HIST("psi4/h_alambda_cossin"), v0.mAntiLambda(), v0.pt(), angle * TMath::Sin(relphi), centrality, weight); - histos.fill(HIST("psi4/h_alambda_vncos"), v0.mAntiLambda(), v0.pt(), qvecMag * TMath::Cos(relphi), centrality, weight); - histos.fill(HIST("psi4/h_alambda_vnsin"), v0.mAntiLambda(), v0.pt(), TMath::Sin(relphi), centrality, weight); + histos.fill(HIST("psi4/h_alambda_cos"), v0.mAntiLambda(), v0.pt(), angle * weight, centrality, relphi); + histos.fill(HIST("psi4/h_alambda_cos2"), v0.mAntiLambda(), v0.pt(), angle * angle, centrality, relphi); + histos.fill(HIST("psi4/h_alambda_cossin"), v0.mAntiLambda(), v0.pt(), angle * TMath::Sin(relphi) * weight, centrality); + histos.fill(HIST("psi4/h_alambda_vncos"), v0.mAntiLambda(), v0.pt(), qvecMag * TMath::Cos(relphi) * weight, centrality); + histos.fill(HIST("psi4/h_alambda_vnsin"), v0.mAntiLambda(), v0.pt(), TMath::Sin(relphi), centrality); if (cfgRapidityDep) { histos.fill(HIST("psi4/h_alambda_cos2_rap"), v0.mAntiLambda(), v0.pt(), angle * angle, centrality, v0.yLambda(), weight); From 1ee0bbd057656f072631b0ca1dfab9751b3beeeb Mon Sep 17 00:00:00 2001 From: Tanu Gahlaut <154991749+TGahlaut1@users.noreply.github.com> Date: Sun, 2 Mar 2025 03:27:36 +0530 Subject: [PATCH 0491/1650] [PWGCF] update histograms (#10270) --- PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx | 48 +++++++++++-------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx b/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx index da9f23818d1..29f3280021a 100644 --- a/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx @@ -107,12 +107,12 @@ struct MeanPtFlucId { Configurable> etaBins{"etaBins", {-0.8, -0.75, -0.7, -0.65, -0.6, -0.55, -0.5, -0.45, -0.4, -0.35, -0.3, -0.25, -0.2, -0.15, -0.1, -0.05, 0.0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8}, "#eta bins"}; Configurable> rapBins{"rapBins", {-0.6, -0.55, -0.5, -0.45, -0.4, -0.35, -0.3, -0.25, -0.2, -0.15, -0.1, -0.05, 0.0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6}, "#rap bins"}; Configurable> effValuesCh{"effValuesCh", {0, 0.429014, 0.487349, 0.491862, 0.487173, 0.493464, 0.502531, 0.510066, 0.517214, 0.524902, 0.529725, 0.537065, 0.542265, 0.546103, 0.549713, 0.555139, 0.55158, 0.562156, 0.563038, 0.568055, 0.570847, 0.580461, 0.580406, 0.585776, 0.587068, 0.598144, 0.590378, 0.609363, 0.607307, 0.604931, 0.6011, 0.593467, 0.61525, 0.61393, 0.61495, 0.610359, 0.622616}, "effeciency values for Charged Particles"}; - Configurable> effPtValuesPi{"effPtValuesPi", {0, 0.408075, 0.473332, 0.48221, 0.469699, 0.472676, 0.482403, 0.478351, 0.38468, 0.249696, 0.244316, 0.235498, 0.236493, 0.241719, 0.245363, 0.248324, 0.251595, 0.254327, 0.257727, 0.260208, 0.263414, 0.267699, 0.270322, 0.275128, 0.280835, 0.284328, 0.288791, 0.294786, 0.292418, 0.299766, 0.299413, 0.301257, 0.305466, 0.304929, 0.316837, 0.317915, 0.316018}, "effeciency values for Pions"}; - Configurable> effPtRapValuesPi{"effPtRapValuesPi", {0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5520, 0.5331, 0.5201, 0.5140, 0.5135, 0.5271, 0.4378, 0.2341, 0.2668, 0.2606, 0.2484, 0.2553, 0.2533, 0.2606, 0.2621, 0.2645, 0.2651, 0.2785, 0.2767, 0.2867, 0.2927, 0.2862, 0.3046, 0.3050, 0.3078, 0.3025, 0.3156, 0.2991, 0.3137, 0.3093, 0.3210, 0.3300, 0.3207, 0.3356, 0.3495, 0.3475, 0.0000, 0.5487, 0.5299, 0.5228, 0.5152, 0.5165, 0.5260, 0.5123, 0.2426, 0.2604, 0.2523, 0.2404, 0.2459, 0.2472, 0.2482, 0.2519, 0.2541, 0.2563, 0.2577, 0.2620, 0.2598, 0.2636, 0.2791, 0.2770, 0.2866, 0.2798, 0.2887, 0.2969, 0.3003, 0.2947, 0.2927, 0.2917, 0.3183, 0.3067, 0.3099, 0.3234, 0.3285, 0.0000, 0.5350, 0.5276, 0.5192, 0.5150, 0.5209, 0.5296, 0.5339, 0.2891, 0.2645, 0.2591, 0.2535, 0.2577, 0.2597, 0.2652, 0.2697, 0.2695, 0.2754, 0.2892, 0.2815, 0.2849, 0.2885, 0.2946, 0.3080, 0.3094, 0.3208, 0.3174, 0.3211, 0.3239, 0.3231, 0.3332, 0.3319, 0.3381, 0.3369, 0.3325, 0.3442, 0.3663, 0.0000, 0.4808, 0.5197, 0.5194, 0.5159, 0.5217, 0.5304, 0.5366, 0.3708, 0.2952, 0.2832, 0.2743, 0.2762, 0.2824, 0.2870, 0.2895, 0.2874, 0.2922, 0.2953, 0.2996, 0.3024, 0.3084, 0.3159, 0.3138, 0.3305, 0.3309, 0.3366, 0.3340, 0.3404, 0.3292, 0.3403, 0.3279, 0.3486, 0.3729, 0.3447, 0.3603, 0.3566, 0.0000, 0.4303, 0.5043, 0.5166, 0.5174, 0.5203, 0.5282, 0.5341, 0.4151, 0.2868, 0.2790, 0.2662, 0.2682, 0.2718, 0.2771, 0.2761, 0.2790, 0.2824, 0.2820, 0.2873, 0.2869, 0.2835, 0.2888, 0.3004, 0.3002, 0.3143, 0.3159, 0.3056, 0.3083, 0.3197, 0.3315, 0.3146, 0.3280, 0.3207, 0.3138, 0.3467, 0.3454, 0.0000, 0.4125, 0.4794, 0.5124, 0.5108, 0.5186, 0.5265, 0.5342, 0.4518, 0.2585, 0.2503, 0.2408, 0.2399, 0.2449, 0.2506, 0.2588, 0.2568, 0.2575, 0.2597, 0.2636, 0.2693, 0.2664, 0.2763, 0.2773, 0.2808, 0.2902, 0.2899, 0.2872, 0.2968, 0.3056, 0.2918, 0.3007, 0.3048, 0.3077, 0.3041, 0.2981, 0.3222, 0.0000, 0.4042, 0.4703, 0.5100, 0.5087, 0.5131, 0.5238, 0.5280, 0.4796, 0.2243, 0.2254, 0.2157, 0.2245, 0.2249, 0.2374, 0.2325, 0.2372, 0.2463, 0.2433, 0.2444, 0.2506, 0.2525, 0.2526, 0.2661, 0.2605, 0.2831, 0.2841, 0.2878, 0.2874, 0.2964, 0.2937, 0.3050, 0.3100, 0.2976, 0.3073, 0.3083, 0.3122, 0.0000, 0.4036, 0.4928, 0.5121, 0.4988, 0.5041, 0.5162, 0.5238, 0.5000, 0.2092, 0.2117, 0.1977, 0.2032, 0.2100, 0.2097, 0.2180, 0.2140, 0.2196, 0.2170, 0.2174, 0.2269, 0.2259, 0.2318, 0.2318, 0.2415, 0.2447, 0.2391, 0.2604, 0.2516, 0.2619, 0.2569, 0.2600, 0.2573, 0.2637, 0.2717, 0.2740, 0.2681, 0.0000, 0.3452, 0.4427, 0.4595, 0.4499, 0.4631, 0.4782, 0.4818, 0.4794, 0.1810, 0.1763, 0.1678, 0.1683, 0.1725, 0.1760, 0.1765, 0.1788, 0.1778, 0.1792, 0.1834, 0.1799, 0.1872, 0.1882, 0.1866, 0.1915, 0.1917, 0.1996, 0.2100, 0.2097, 0.2089, 0.2145, 0.2168, 0.2099, 0.2127, 0.2073, 0.2149, 0.2060, 0.0000, 0.2717, 0.3686, 0.4011, 0.3970, 0.4118, 0.4221, 0.4316, 0.4357, 0.1215, 0.1172, 0.1120, 0.1131, 0.1175, 0.1202, 0.1243, 0.1230, 0.1247, 0.1276, 0.1210, 0.1237, 0.1244, 0.1311, 0.1279, 0.1349, 0.1413, 0.1449, 0.1452, 0.1355, 0.1478, 0.1471, 0.1443, 0.1558, 0.1395, 0.1451, 0.1489, 0.1403, 0.0000, 0.2701, 0.3727, 0.4013, 0.4013, 0.4164, 0.4267, 0.4355, 0.4404, 0.1342, 0.1344, 0.1293, 0.1253, 0.1289, 0.1308, 0.1340, 0.1330, 0.1395, 0.1402, 0.1358, 0.1421, 0.1385, 0.1481, 0.1470, 0.1513, 0.1497, 0.1598, 0.1516, 0.1558, 0.1605, 0.1635, 0.1601, 0.1610, 0.1599, 0.1601, 0.1727, 0.1671, 0.0000, 0.3255, 0.4427, 0.4688, 0.4548, 0.4695, 0.4819, 0.4880, 0.4857, 0.1827, 0.1819, 0.1737, 0.1721, 0.1753, 0.1782, 0.1812, 0.1846, 0.1798, 0.1907, 0.1844, 0.1904, 0.1916, 0.1968, 0.1888, 0.2013, 0.2075, 0.2080, 0.1968, 0.2124, 0.2114, 0.2100, 0.2169, 0.2154, 0.2192, 0.2189, 0.2242, 0.2097, 0.0000, 0.3559, 0.4877, 0.5037, 0.4938, 0.4998, 0.5092, 0.5187, 0.4925, 0.1932, 0.1911, 0.1847, 0.1877, 0.1948, 0.1948, 0.1996, 0.2005, 0.2017, 0.2029, 0.2009, 0.2049, 0.2076, 0.2177, 0.2211, 0.2158, 0.2359, 0.2317, 0.2399, 0.2390, 0.2345, 0.2436, 0.2378, 0.2438, 0.2376, 0.2495, 0.2477, 0.2544, 0.0000, 0.3632, 0.4649, 0.5039, 0.4997, 0.5064, 0.5164, 0.5270, 0.4722, 0.2336, 0.2317, 0.2199, 0.2248, 0.2287, 0.2334, 0.2378, 0.2367, 0.2405, 0.2390, 0.2434, 0.2463, 0.2497, 0.2564, 0.2580, 0.2573, 0.2702, 0.2775, 0.2865, 0.2808, 0.2899, 0.2966, 0.2892, 0.2826, 0.2860, 0.2987, 0.2915, 0.3188, 0.0000, 0.3912, 0.4740, 0.5051, 0.5038, 0.5093, 0.5205, 0.5300, 0.4531, 0.2901, 0.2830, 0.2754, 0.2772, 0.2822, 0.2859, 0.2954, 0.2940, 0.2955, 0.2977, 0.2976, 0.3012, 0.3065, 0.3059, 0.3208, 0.3244, 0.3326, 0.3296, 0.3297, 0.3454, 0.3402, 0.3265, 0.3414, 0.3474, 0.3438, 0.3496, 0.3428, 0.3895, 0.0000, 0.4220, 0.4939, 0.5100, 0.5090, 0.5090, 0.5183, 0.5215, 0.4323, 0.3189, 0.3098, 0.2970, 0.3009, 0.3036, 0.3102, 0.3106, 0.3132, 0.3145, 0.3170, 0.3242, 0.3323, 0.3320, 0.3308, 0.3345, 0.3471, 0.3511, 0.3423, 0.3487, 0.3591, 0.3691, 0.3523, 0.3801, 0.3492, 0.3678, 0.3793, 0.3818, 0.3993, 0.0000, 0.4704, 0.5064, 0.5109, 0.5062, 0.5106, 0.5219, 0.5250, 0.3847, 0.3256, 0.3213, 0.3061, 0.3100, 0.3152, 0.3253, 0.3235, 0.3294, 0.3316, 0.3300, 0.3438, 0.3404, 0.3513, 0.3530, 0.3572, 0.3688, 0.3709, 0.3792, 0.3676, 0.3775, 0.3744, 0.3786, 0.3887, 0.3953, 0.4057, 0.3939, 0.4099, 0.4465, 0.0000, 0.5253, 0.5212, 0.5124, 0.5030, 0.5088, 0.5185, 0.5247, 0.3098, 0.2995, 0.2949, 0.2843, 0.2866, 0.2991, 0.3002, 0.3030, 0.3063, 0.3106, 0.3176, 0.3178, 0.3224, 0.3323, 0.3324, 0.3369, 0.3503, 0.3554, 0.3458, 0.3615, 0.3689, 0.3563, 0.3619, 0.3656, 0.3689, 0.3717, 0.3991, 0.3880, 0.4147, 0.0000, 0.5410, 0.5214, 0.5112, 0.5068, 0.5073, 0.5173, 0.5006, 0.2571, 0.2815, 0.2729, 0.2671, 0.2652, 0.2720, 0.2758, 0.2746, 0.2820, 0.2832, 0.2870, 0.2906, 0.2963, 0.2961, 0.2997, 0.3028, 0.3165, 0.3137, 0.3139, 0.3317, 0.3318, 0.3241, 0.3317, 0.3324, 0.3305, 0.3340, 0.3501, 0.3671, 0.3516, 0.0000, 0.5411, 0.5255, 0.5099, 0.5021, 0.5054, 0.5161, 0.4317, 0.2497, 0.2792, 0.2713, 0.2659, 0.2699, 0.2748, 0.2805, 0.2782, 0.2890, 0.2846, 0.2897, 0.2942, 0.3005, 0.3039, 0.3034, 0.3167, 0.3165, 0.3181, 0.3328, 0.3217, 0.3308, 0.3305, 0.3281, 0.3323, 0.3493, 0.3511, 0.3402, 0.3450, 0.3665, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000}, "pT rap effeciency values for Pions"}; - Configurable> effPtValuesKa{"effPtValuesKa", {0, 0, 0, 0.312144, 0.369847, 0.38878, 0.413275, 0.393619, 0.315429, 0.1375, 0.146659, 0.147163, 0.155197, 0.163588, 0.168412, 0.177936, 0.17782, 0.186872, 0.190744, 0.199436, 0.197739, 0.192307, 0.198484, 0.19927, 0.218019, 0.221942, 0.237642, 0.235765, 0.249873, 0.251034, 0.259014, 0.268821, 0.275786, 0.280998, 0.29936, 0.304559, 0.312684}, "pT eta effeciency values for Kaons"}; - Configurable> effPtRapValuesKa{"effPtRapValuesKa", {0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1711, 0.4322, 0.4572, 0.4474, 0.1392, 0.1648, 0.1836, 0.1891, 0.1732, 0.1794, 0.1778, 0.1914, 0.2058, 0.2122, 0.2190, 0.2180, 0.2156, 0.2448, 0.2679, 0.2626, 0.2984, 0.2953, 0.3137, 0.3228, 0.3696, 0.3786, 0.3517, 0.4040, 0.3901, 0.4604, 0.5460, 0.5458, 0.4860, 0.5755, 0.0000, 0.0000, 0.0000, 0.4031, 0.4326, 0.4559, 0.4946, 0.2264, 0.1289, 0.1516, 0.1633, 0.1679, 0.1906, 0.2048, 0.2132, 0.2183, 0.2247, 0.2651, 0.2572, 0.2406, 0.2365, 0.2701, 0.2525, 0.2643, 0.2806, 0.3142, 0.3317, 0.3364, 0.3298, 0.3212, 0.3564, 0.3873, 0.3982, 0.4500, 0.4643, 0.5220, 0.6104, 0.0000, 0.0000, 0.0000, 0.3993, 0.4172, 0.4474, 0.4974, 0.3636, 0.1374, 0.1723, 0.1809, 0.1743, 0.1815, 0.1985, 0.2034, 0.2150, 0.2187, 0.2393, 0.2346, 0.2479, 0.2409, 0.2599, 0.2530, 0.2897, 0.2897, 0.2922, 0.3214, 0.3364, 0.3855, 0.4070, 0.4153, 0.3828, 0.4269, 0.4225, 0.5101, 0.5487, 0.5465, 0.0000, 0.0000, 0.0000, 0.4002, 0.4271, 0.4676, 0.4789, 0.4990, 0.1447, 0.1659, 0.1784, 0.1734, 0.1930, 0.2012, 0.2124, 0.2340, 0.2522, 0.2673, 0.2594, 0.2609, 0.2565, 0.2824, 0.2783, 0.2727, 0.2953, 0.3379, 0.3473, 0.3603, 0.3743, 0.4059, 0.3903, 0.4152, 0.4254, 0.4361, 0.4638, 0.5754, 0.5599, 0.0000, 0.0000, 0.0000, 0.4020, 0.4132, 0.4547, 0.4768, 0.5111, 0.2441, 0.1760, 0.1872, 0.1925, 0.2073, 0.2169, 0.2318, 0.2329, 0.2453, 0.2519, 0.2538, 0.2599, 0.2565, 0.2559, 0.2720, 0.2844, 0.2968, 0.3048, 0.3230, 0.3233, 0.3402, 0.3664, 0.3795, 0.4017, 0.3661, 0.3992, 0.4338, 0.4848, 0.5206, 0.0000, 0.0000, 0.0000, 0.3770, 0.4073, 0.4435, 0.4825, 0.5040, 0.3451, 0.1814, 0.1806, 0.1758, 0.1899, 0.1964, 0.1949, 0.2105, 0.2144, 0.2261, 0.2461, 0.2451, 0.2293, 0.2176, 0.2297, 0.2395, 0.2615, 0.2716, 0.2832, 0.2936, 0.3194, 0.3466, 0.3317, 0.3598, 0.3355, 0.4052, 0.3900, 0.4260, 0.4737, 0.0000, 0.0000, 0.0000, 0.3688, 0.4227, 0.4245, 0.4550, 0.4903, 0.4048, 0.1576, 0.1597, 0.1740, 0.1776, 0.1911, 0.2010, 0.2130, 0.1963, 0.2356, 0.2175, 0.2320, 0.2517, 0.2136, 0.2220, 0.2380, 0.2635, 0.2890, 0.2978, 0.3152, 0.3344, 0.3124, 0.3439, 0.3770, 0.3441, 0.3936, 0.3892, 0.4360, 0.4348, 0.0000, 0.0000, 0.0000, 0.3585, 0.4101, 0.4185, 0.4567, 0.4896, 0.4543, 0.1239, 0.1382, 0.1451, 0.1523, 0.1614, 0.1722, 0.1873, 0.1906, 0.2008, 0.2057, 0.2276, 0.2153, 0.1922, 0.2014, 0.2141, 0.2305, 0.2502, 0.2477, 0.2940, 0.2962, 0.2987, 0.3237, 0.3023, 0.3161, 0.3414, 0.3568, 0.3466, 0.3992, 0.0000, 0.0000, 0.0000, 0.3535, 0.3858, 0.3940, 0.4202, 0.4460, 0.4512, 0.1152, 0.1319, 0.1280, 0.1366, 0.1450, 0.1519, 0.1673, 0.1597, 0.1797, 0.1727, 0.1865, 0.1909, 0.1746, 0.1674, 0.1788, 0.1923, 0.2043, 0.2303, 0.2264, 0.2317, 0.2345, 0.2547, 0.2597, 0.2948, 0.3002, 0.2719, 0.3049, 0.2998, 0.0000, 0.0000, 0.0000, 0.2898, 0.3194, 0.3320, 0.3707, 0.3963, 0.4181, 0.0748, 0.0840, 0.0799, 0.0835, 0.0968, 0.0985, 0.1080, 0.1054, 0.1080, 0.1286, 0.1336, 0.1204, 0.1228, 0.1232, 0.1261, 0.1495, 0.1487, 0.1535, 0.1564, 0.1631, 0.1768, 0.1956, 0.1909, 0.1957, 0.1873, 0.2248, 0.2199, 0.2283, 0.0000, 0.0000, 0.0000, 0.1413, 0.1521, 0.1386, 0.1263, 0.1148, 0.1107, 0.0205, 0.0212, 0.0217, 0.0234, 0.0245, 0.0235, 0.0265, 0.0263, 0.0262, 0.0308, 0.0299, 0.0331, 0.0280, 0.0296, 0.0291, 0.0286, 0.0337, 0.0370, 0.0326, 0.0355, 0.0382, 0.0408, 0.0384, 0.0408, 0.0433, 0.0463, 0.0443, 0.0464, 0.0000, 0.0000, 0.0000, 0.3353, 0.3807, 0.3944, 0.4307, 0.4725, 0.4790, 0.1181, 0.1269, 0.1314, 0.1350, 0.1546, 0.1514, 0.1554, 0.1507, 0.1604, 0.1682, 0.1766, 0.1862, 0.1731, 0.1818, 0.1945, 0.2096, 0.2152, 0.2253, 0.2221, 0.2372, 0.2559, 0.2340, 0.2753, 0.2901, 0.2818, 0.2684, 0.2700, 0.3042, 0.0000, 0.0000, 0.0000, 0.3494, 0.4016, 0.4101, 0.4368, 0.4755, 0.4433, 0.1166, 0.1291, 0.1342, 0.1404, 0.1585, 0.1586, 0.1631, 0.1759, 0.1788, 0.1769, 0.2053, 0.2112, 0.1885, 0.1921, 0.2021, 0.2006, 0.2387, 0.2434, 0.2547, 0.2705, 0.2690, 0.2966, 0.2698, 0.2877, 0.3023, 0.3092, 0.3123, 0.3627, 0.0000, 0.0000, 0.0000, 0.3515, 0.4035, 0.4132, 0.4501, 0.4755, 0.3929, 0.1655, 0.1738, 0.1867, 0.1915, 0.2132, 0.2122, 0.2105, 0.2303, 0.2302, 0.2343, 0.2467, 0.2437, 0.2364, 0.2472, 0.2688, 0.2485, 0.2821, 0.3039, 0.3322, 0.3020, 0.3388, 0.3728, 0.3620, 0.3690, 0.3572, 0.4131, 0.4549, 0.4871, 0.0000, 0.0000, 0.0000, 0.3803, 0.4282, 0.4350, 0.4591, 0.4858, 0.3540, 0.1968, 0.2057, 0.2057, 0.2208, 0.2226, 0.2314, 0.2284, 0.2425, 0.2542, 0.2500, 0.2618, 0.2562, 0.2512, 0.2674, 0.2827, 0.3082, 0.2932, 0.3296, 0.3233, 0.3689, 0.3794, 0.4202, 0.4337, 0.4032, 0.4574, 0.4255, 0.4487, 0.6078, 0.0000, 0.0000, 0.0000, 0.3940, 0.4184, 0.4363, 0.4688, 0.5184, 0.2523, 0.1979, 0.2038, 0.2260, 0.2290, 0.2466, 0.2631, 0.2637, 0.2640, 0.2802, 0.3055, 0.3082, 0.2831, 0.2731, 0.2934, 0.2987, 0.3306, 0.3460, 0.3697, 0.3769, 0.3792, 0.4081, 0.4194, 0.4079, 0.4766, 0.4226, 0.4606, 0.5413, 0.5926, 0.0000, 0.0000, 0.0000, 0.4037, 0.4264, 0.4461, 0.4638, 0.4895, 0.1648, 0.1881, 0.1862, 0.1997, 0.2273, 0.2403, 0.2347, 0.2588, 0.2769, 0.2900, 0.3019, 0.3046, 0.2762, 0.2977, 0.3163, 0.3498, 0.3600, 0.3686, 0.3807, 0.4021, 0.4237, 0.4305, 0.4928, 0.4549, 0.4803, 0.4745, 0.5351, 0.6006, 0.6772, 0.0000, 0.0000, 0.0000, 0.4067, 0.4231, 0.4615, 0.4870, 0.3601, 0.1493, 0.1847, 0.1981, 0.2003, 0.1911, 0.2023, 0.2315, 0.2318, 0.2385, 0.2464, 0.2636, 0.2626, 0.2690, 0.2777, 0.2707, 0.3373, 0.2916, 0.3545, 0.3536, 0.4019, 0.4201, 0.3934, 0.4489, 0.4565, 0.4178, 0.5096, 0.5585, 0.5518, 0.6223, 0.0000, 0.0000, 0.0000, 0.4070, 0.4335, 0.4495, 0.4745, 0.2224, 0.1328, 0.1608, 0.1702, 0.1827, 0.1939, 0.2113, 0.2331, 0.2482, 0.2555, 0.2676, 0.2594, 0.2693, 0.2592, 0.2608, 0.2601, 0.3022, 0.3137, 0.3099, 0.3338, 0.3411, 0.3938, 0.3477, 0.3983, 0.3982, 0.3937, 0.4450, 0.4986, 0.5582, 0.5724, 0.0000, 0.0000, 0.0000, 0.1654, 0.4371, 0.4530, 0.4372, 0.1515, 0.1719, 0.2036, 0.1941, 0.1823, 0.1778, 0.1908, 0.1862, 0.2106, 0.2292, 0.2369, 0.2251, 0.2314, 0.2476, 0.2559, 0.2732, 0.2931, 0.3197, 0.3373, 0.3648, 0.3785, 0.3693, 0.4063, 0.4223, 0.4156, 0.4548, 0.5356, 0.5663, 0.5616, 0.5979, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000}, "pT rap effeciency values for Kaons"}; - Configurable> effPtValuesPr{"effPtValuesPr", {0, 0, 0, 0, 0, 0, 0, 0.394712, 0.425251, 0.458426, 0.489121, 0.509505, 0.516103, 0.517117, 0.491584, 0.450721, 0.379836, 0.253402, 0.257575, 0.261382, 0.260373, 0.269008, 0.266811, 0.265011, 0.272768, 0.269553, 0.276003, 0.279878, 0.284216, 0.276346, 0.293437, 0.294727, 0.281017, 0.287609, 0.292402, 0.28614, 0.307208}, "effeciency values for Kaons"}; - Configurable> effPtRapValuesPr{"effPtRapValuesPr", {0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0345, 0.3209, 0.6345, 0.7076, 0.6968, 0.3865, 0.3562, 0.3741, 0.3760, 0.3825, 0.3930, 0.3762, 0.3869, 0.3708, 0.3414, 0.3246, 0.3439, 0.3257, 0.3233, 0.3185, 0.3693, 0.3426, 0.3601, 0.3260, 0.3715, 0.3373, 0.4214, 0.3766, 0.3692, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.2474, 0.5755, 0.6398, 0.6618, 0.6986, 0.7487, 0.6339, 0.3570, 0.3286, 0.3126, 0.3066, 0.2918, 0.2906, 0.3151, 0.3293, 0.3585, 0.3321, 0.3348, 0.3798, 0.3705, 0.3326, 0.3756, 0.4221, 0.3602, 0.3791, 0.4167, 0.4121, 0.3948, 0.4191, 0.3476, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5490, 0.6266, 0.6415, 0.6566, 0.6976, 0.7392, 0.7155, 0.4702, 0.3043, 0.3034, 0.3037, 0.3458, 0.3393, 0.3188, 0.3545, 0.3541, 0.3383, 0.3254, 0.3477, 0.3959, 0.3584, 0.3581, 0.3751, 0.3855, 0.3655, 0.4074, 0.3771, 0.3188, 0.3816, 0.3437, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5701, 0.6201, 0.6612, 0.6533, 0.6684, 0.6916, 0.7126, 0.7208, 0.3838, 0.3316, 0.3169, 0.3159, 0.3281, 0.3361, 0.3345, 0.3542, 0.3535, 0.3339, 0.3527, 0.3803, 0.3599, 0.3745, 0.3810, 0.4013, 0.4036, 0.4118, 0.4016, 0.4161, 0.4036, 0.4198, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5860, 0.6117, 0.6459, 0.6697, 0.6637, 0.7082, 0.7381, 0.7367, 0.5968, 0.3374, 0.3051, 0.3492, 0.3423, 0.3498, 0.3690, 0.3573, 0.4151, 0.3900, 0.3929, 0.4092, 0.3775, 0.4070, 0.3861, 0.4141, 0.3865, 0.4036, 0.3960, 0.4424, 0.3997, 0.3739, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5673, 0.6094, 0.6451, 0.6705, 0.6427, 0.6821, 0.7109, 0.7315, 0.7319, 0.4056, 0.3433, 0.3316, 0.3208, 0.3931, 0.3721, 0.3669, 0.3688, 0.3418, 0.3440, 0.3496, 0.3414, 0.3877, 0.3804, 0.3131, 0.3899, 0.3649, 0.3495, 0.4038, 0.3501, 0.3558, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5497, 0.6281, 0.6455, 0.6752, 0.6818, 0.6935, 0.7480, 0.7510, 0.7712, 0.5599, 0.3500, 0.3410, 0.3289, 0.3403, 0.3424, 0.3240, 0.3404, 0.3540, 0.3268, 0.3331, 0.3636, 0.3601, 0.3469, 0.3593, 0.3637, 0.3669, 0.4036, 0.3625, 0.3350, 0.3712, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5518, 0.5855, 0.6229, 0.6740, 0.6720, 0.6969, 0.7505, 0.7625, 0.7747, 0.6585, 0.2959, 0.2823, 0.2930, 0.2922, 0.3070, 0.3106, 0.3171, 0.3162, 0.3181, 0.3020, 0.3095, 0.3160, 0.3324, 0.3606, 0.3356, 0.3447, 0.3284, 0.3208, 0.3748, 0.3126, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5482, 0.5687, 0.5996, 0.6375, 0.6556, 0.6755, 0.6978, 0.7299, 0.7756, 0.7260, 0.2638, 0.2749, 0.2854, 0.2523, 0.2516, 0.2650, 0.2604, 0.2451, 0.3007, 0.2926, 0.2598, 0.2695, 0.2873, 0.2964, 0.2977, 0.2946, 0.3014, 0.2974, 0.3122, 0.3164, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.4730, 0.5139, 0.5155, 0.5724, 0.6327, 0.6003, 0.6216, 0.6769, 0.7379, 0.6791, 0.1884, 0.1699, 0.1829, 0.1780, 0.1624, 0.1892, 0.1804, 0.1976, 0.1994, 0.1923, 0.1981, 0.1878, 0.1947, 0.2073, 0.2188, 0.2078, 0.1938, 0.1953, 0.2260, 0.1745, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1458, 0.1096, 0.1024, 0.0974, 0.0973, 0.0919, 0.0947, 0.1018, 0.1024, 0.1042, 0.0298, 0.0291, 0.0299, 0.0289, 0.0281, 0.0325, 0.0319, 0.0316, 0.0329, 0.0310, 0.0377, 0.0349, 0.0370, 0.0328, 0.0397, 0.0414, 0.0379, 0.0395, 0.0388, 0.0340, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5397, 0.5801, 0.5897, 0.6112, 0.6864, 0.6721, 0.6859, 0.7086, 0.7534, 0.7322, 0.2720, 0.2496, 0.2315, 0.2494, 0.2812, 0.2877, 0.2433, 0.2465, 0.2750, 0.2883, 0.2848, 0.2793, 0.2909, 0.2771, 0.2888, 0.2923, 0.2572, 0.2723, 0.2758, 0.2731, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5495, 0.5804, 0.6113, 0.6502, 0.6647, 0.6813, 0.7079, 0.7474, 0.7657, 0.6306, 0.2714, 0.2598, 0.2601, 0.2452, 0.2792, 0.2720, 0.2845, 0.2724, 0.2774, 0.2813, 0.2949, 0.2674, 0.2935, 0.2860, 0.3022, 0.2930, 0.2968, 0.3176, 0.3171, 0.2917, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5416, 0.5600, 0.6354, 0.6564, 0.6746, 0.6809, 0.6946, 0.7371, 0.7607, 0.5364, 0.3708, 0.3458, 0.3653, 0.3599, 0.3769, 0.3640, 0.3667, 0.3653, 0.3829, 0.3929, 0.3713, 0.3772, 0.3674, 0.3810, 0.4024, 0.3838, 0.4130, 0.4039, 0.3830, 0.4046, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5512, 0.5967, 0.6277, 0.6578, 0.6424, 0.6641, 0.7317, 0.7343, 0.7142, 0.4351, 0.3927, 0.4098, 0.3937, 0.4046, 0.3986, 0.4117, 0.4140, 0.4294, 0.4020, 0.4036, 0.3858, 0.3582, 0.4257, 0.3741, 0.3968, 0.4209, 0.4387, 0.4221, 0.4059, 0.4374, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5739, 0.6044, 0.6561, 0.6594, 0.6280, 0.6595, 0.6962, 0.7008, 0.5354, 0.3991, 0.3788, 0.3769, 0.3824, 0.4046, 0.4187, 0.4477, 0.4040, 0.4276, 0.4801, 0.4211, 0.4550, 0.4688, 0.4087, 0.4302, 0.4011, 0.4649, 0.4776, 0.4433, 0.4286, 0.5134, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.6076, 0.6062, 0.6302, 0.6758, 0.6457, 0.6936, 0.7342, 0.7175, 0.3698, 0.3439, 0.3499, 0.3405, 0.3785, 0.3427, 0.3453, 0.3833, 0.3716, 0.3945, 0.4290, 0.4172, 0.4177, 0.3970, 0.4051, 0.4350, 0.4395, 0.4208, 0.4605, 0.4489, 0.4315, 0.4499, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5830, 0.6400, 0.6661, 0.6551, 0.6424, 0.6899, 0.7067, 0.4596, 0.2994, 0.3129, 0.3194, 0.3341, 0.3655, 0.3699, 0.3448, 0.3879, 0.3518, 0.3476, 0.3879, 0.3961, 0.3959, 0.4016, 0.3773, 0.3704, 0.4236, 0.4153, 0.3890, 0.4157, 0.4405, 0.3765, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.2265, 0.5939, 0.6490, 0.6726, 0.6857, 0.7228, 0.6359, 0.3889, 0.3641, 0.3183, 0.2852, 0.2965, 0.2959, 0.2933, 0.3224, 0.3247, 0.3324, 0.3821, 0.3729, 0.3990, 0.3941, 0.3753, 0.3909, 0.3909, 0.3953, 0.3842, 0.4036, 0.4685, 0.4010, 0.4241, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0364, 0.3236, 0.6224, 0.6982, 0.6916, 0.4223, 0.3984, 0.3900, 0.4060, 0.3757, 0.3848, 0.3947, 0.3534, 0.3863, 0.3527, 0.3452, 0.3373, 0.3268, 0.3212, 0.3690, 0.3220, 0.3078, 0.3798, 0.3162, 0.3735, 0.3842, 0.4035, 0.4351, 0.4374, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000}, "pT rap effeciency values for Protons"}; + Configurable> effPtValuesPi{"effPtValuesPi", {0, 0.410663, 0.480289, 0.494895, 0.487076, 0.489786, 0.49886, 0.493927, 0.39043, 0.243861, 0.238888, 0.229684, 0.232042, 0.236374, 0.240662, 0.243322, 0.244936, 0.247454, 0.250458, 0.251617, 0.255598, 0.258227, 0.262528, 0.266772, 0.272183, 0.279049, 0.279705, 0.283223, 0.285635, 0.287154, 0.288375, 0.291491, 0.294697, 0.295954, 0.298417, 0.304913, 0.31268}, "effeciency values for Pions"}; + Configurable> effPtRapValuesPi{"effPtRapValuesPi", {0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5515, 0.5337, 0.5204, 0.5118, 0.5072, 0.5195, 0.4326, 0.2341, 0.2669, 0.2604, 0.2484, 0.2547, 0.2539, 0.2608, 0.2621, 0.2653, 0.2653, 0.2783, 0.2765, 0.2858, 0.2932, 0.2862, 0.3041, 0.3038, 0.3081, 0.3024, 0.3153, 0.2991, 0.3121, 0.3094, 0.3203, 0.3320, 0.3225, 0.3355, 0.3491, 0.3485, 0.0000, 0.5483, 0.5306, 0.5231, 0.5126, 0.5090, 0.5168, 0.5040, 0.2427, 0.2606, 0.2519, 0.2405, 0.2453, 0.2465, 0.2479, 0.2513, 0.2540, 0.2560, 0.2579, 0.2625, 0.2597, 0.2627, 0.2795, 0.2765, 0.2871, 0.2798, 0.2882, 0.2981, 0.2993, 0.2950, 0.2918, 0.2912, 0.3173, 0.3076, 0.3088, 0.3235, 0.3261, 0.0000, 0.5353, 0.5284, 0.5192, 0.5120, 0.5136, 0.5209, 0.5247, 0.2871, 0.2642, 0.2601, 0.2534, 0.2576, 0.2600, 0.2653, 0.2696, 0.2700, 0.2753, 0.2899, 0.2821, 0.2855, 0.2894, 0.2952, 0.3073, 0.3100, 0.3200, 0.3173, 0.3219, 0.3235, 0.3241, 0.3328, 0.3322, 0.3361, 0.3375, 0.3344, 0.3449, 0.3659, 0.0000, 0.4807, 0.5206, 0.5190, 0.5131, 0.5132, 0.5204, 0.5263, 0.3672, 0.2951, 0.2831, 0.2745, 0.2762, 0.2819, 0.2864, 0.2893, 0.2866, 0.2926, 0.2957, 0.2996, 0.3020, 0.3081, 0.3163, 0.3141, 0.3305, 0.3314, 0.3359, 0.3342, 0.3425, 0.3287, 0.3405, 0.3284, 0.3474, 0.3738, 0.3428, 0.3608, 0.3580, 0.0000, 0.4313, 0.5049, 0.5164, 0.5139, 0.5121, 0.5180, 0.5238, 0.4100, 0.2872, 0.2788, 0.2665, 0.2682, 0.2722, 0.2775, 0.2754, 0.2784, 0.2823, 0.2814, 0.2872, 0.2874, 0.2828, 0.2891, 0.2997, 0.2997, 0.3147, 0.3147, 0.3067, 0.3095, 0.3204, 0.3334, 0.3118, 0.3263, 0.3210, 0.3130, 0.3477, 0.3453, 0.0000, 0.4125, 0.4795, 0.5132, 0.5083, 0.5124, 0.5182, 0.5244, 0.4443, 0.2584, 0.2502, 0.2405, 0.2397, 0.2446, 0.2512, 0.2589, 0.2565, 0.2583, 0.2605, 0.2628, 0.2681, 0.2657, 0.2772, 0.2782, 0.2802, 0.2908, 0.2900, 0.2886, 0.2959, 0.3061, 0.2919, 0.3010, 0.3056, 0.3061, 0.3054, 0.2973, 0.3227, 0.0000, 0.4045, 0.4708, 0.5112, 0.5070, 0.5084, 0.5167, 0.5201, 0.4732, 0.2244, 0.2256, 0.2162, 0.2244, 0.2247, 0.2376, 0.2323, 0.2374, 0.2460, 0.2430, 0.2437, 0.2511, 0.2524, 0.2519, 0.2660, 0.2606, 0.2837, 0.2833, 0.2877, 0.2872, 0.2945, 0.2936, 0.3049, 0.3080, 0.2987, 0.3073, 0.3041, 0.3108, 0.0000, 0.4038, 0.4932, 0.5118, 0.4980, 0.4996, 0.5104, 0.5156, 0.4926, 0.2091, 0.2117, 0.1980, 0.2032, 0.2099, 0.2100, 0.2183, 0.2140, 0.2196, 0.2166, 0.2175, 0.2266, 0.2251, 0.2312, 0.2320, 0.2411, 0.2451, 0.2397, 0.2608, 0.2515, 0.2619, 0.2578, 0.2603, 0.2557, 0.2651, 0.2695, 0.2740, 0.2689, 0.0000, 0.3453, 0.4426, 0.4595, 0.4485, 0.4580, 0.4717, 0.4742, 0.4735, 0.1814, 0.1763, 0.1679, 0.1683, 0.1728, 0.1761, 0.1760, 0.1788, 0.1781, 0.1797, 0.1828, 0.1802, 0.1869, 0.1880, 0.1859, 0.1923, 0.1920, 0.1992, 0.2081, 0.2101, 0.2082, 0.2137, 0.2171, 0.2091, 0.2110, 0.2063, 0.2134, 0.2060, 0.0000, 0.2718, 0.3691, 0.4004, 0.3955, 0.4086, 0.4176, 0.4272, 0.4323, 0.1217, 0.1172, 0.1120, 0.1133, 0.1177, 0.1198, 0.1249, 0.1227, 0.1244, 0.1278, 0.1202, 0.1236, 0.1245, 0.1315, 0.1290, 0.1343, 0.1417, 0.1452, 0.1454, 0.1354, 0.1481, 0.1474, 0.1445, 0.1551, 0.1389, 0.1463, 0.1488, 0.1391, 0.0000, 0.2701, 0.3734, 0.4018, 0.4004, 0.4118, 0.4228, 0.4314, 0.4347, 0.1340, 0.1342, 0.1294, 0.1252, 0.1288, 0.1308, 0.1342, 0.1330, 0.1393, 0.1404, 0.1359, 0.1420, 0.1377, 0.1478, 0.1472, 0.1513, 0.1506, 0.1593, 0.1519, 0.1551, 0.1589, 0.1640, 0.1595, 0.1608, 0.1605, 0.1592, 0.1734, 0.1677, 0.0000, 0.3251, 0.4435, 0.4686, 0.4533, 0.4644, 0.4754, 0.4806, 0.4789, 0.1828, 0.1822, 0.1735, 0.1722, 0.1753, 0.1780, 0.1814, 0.1853, 0.1798, 0.1908, 0.1844, 0.1901, 0.1910, 0.1975, 0.1890, 0.2014, 0.2058, 0.2071, 0.1975, 0.2117, 0.2097, 0.2101, 0.2176, 0.2159, 0.2182, 0.2200, 0.2242, 0.2088, 0.0000, 0.3560, 0.4871, 0.5035, 0.4921, 0.4955, 0.5032, 0.5127, 0.4853, 0.1938, 0.1908, 0.1845, 0.1879, 0.1945, 0.1946, 0.1996, 0.2004, 0.2016, 0.2026, 0.2010, 0.2053, 0.2072, 0.2175, 0.2206, 0.2153, 0.2357, 0.2307, 0.2407, 0.2388, 0.2332, 0.2447, 0.2377, 0.2434, 0.2373, 0.2499, 0.2482, 0.2567, 0.0000, 0.3632, 0.4656, 0.5044, 0.4982, 0.5003, 0.5099, 0.5196, 0.4650, 0.2335, 0.2316, 0.2204, 0.2243, 0.2285, 0.2333, 0.2384, 0.2369, 0.2404, 0.2394, 0.2435, 0.2452, 0.2501, 0.2549, 0.2584, 0.2574, 0.2716, 0.2784, 0.2863, 0.2815, 0.2886, 0.2961, 0.2897, 0.2822, 0.2868, 0.3006, 0.2948, 0.3187, 0.0000, 0.3911, 0.4746, 0.5049, 0.4997, 0.5024, 0.5111, 0.5190, 0.4462, 0.2897, 0.2828, 0.2753, 0.2772, 0.2820, 0.2854, 0.2963, 0.2941, 0.2953, 0.2974, 0.2978, 0.3012, 0.3070, 0.3044, 0.3207, 0.3238, 0.3322, 0.3292, 0.3315, 0.3457, 0.3413, 0.3252, 0.3420, 0.3471, 0.3459, 0.3501, 0.3417, 0.3833, 0.0000, 0.4216, 0.4934, 0.5105, 0.5060, 0.5009, 0.5082, 0.5107, 0.4247, 0.3192, 0.3097, 0.2968, 0.3011, 0.3039, 0.3098, 0.3115, 0.3138, 0.3145, 0.3173, 0.3238, 0.3320, 0.3319, 0.3304, 0.3348, 0.3478, 0.3522, 0.3428, 0.3499, 0.3588, 0.3683, 0.3532, 0.3796, 0.3497, 0.3672, 0.3789, 0.3828, 0.3958, 0.0000, 0.4697, 0.5062, 0.5111, 0.5027, 0.5016, 0.5113, 0.5137, 0.3797, 0.3255, 0.3218, 0.3066, 0.3100, 0.3154, 0.3256, 0.3241, 0.3282, 0.3313, 0.3314, 0.3430, 0.3401, 0.3518, 0.3527, 0.3581, 0.3683, 0.3702, 0.3795, 0.3675, 0.3780, 0.3752, 0.3810, 0.3896, 0.3945, 0.4056, 0.3943, 0.4078, 0.4469, 0.0000, 0.5251, 0.5210, 0.5129, 0.5006, 0.5013, 0.5083, 0.5143, 0.3072, 0.2999, 0.2948, 0.2847, 0.2867, 0.2997, 0.2996, 0.3032, 0.3062, 0.3110, 0.3171, 0.3177, 0.3219, 0.3322, 0.3327, 0.3382, 0.3499, 0.3549, 0.3451, 0.3620, 0.3693, 0.3554, 0.3625, 0.3679, 0.3682, 0.3714, 0.4006, 0.3892, 0.4137, 0.0000, 0.5409, 0.5208, 0.5121, 0.5037, 0.4999, 0.5079, 0.4914, 0.2571, 0.2818, 0.2732, 0.2670, 0.2650, 0.2723, 0.2755, 0.2748, 0.2813, 0.2831, 0.2864, 0.2907, 0.2959, 0.2949, 0.2998, 0.3017, 0.3166, 0.3149, 0.3134, 0.3309, 0.3309, 0.3257, 0.3308, 0.3304, 0.3290, 0.3346, 0.3499, 0.3636, 0.3523, 0.0000, 0.5406, 0.5250, 0.5103, 0.5001, 0.4989, 0.5082, 0.4259, 0.2494, 0.2792, 0.2714, 0.2662, 0.2694, 0.2742, 0.2797, 0.2787, 0.2884, 0.2851, 0.2887, 0.2947, 0.3003, 0.3046, 0.3032, 0.3169, 0.3152, 0.3199, 0.3331, 0.3213, 0.3302, 0.3299, 0.3293, 0.3335, 0.3508, 0.3530, 0.3372, 0.3434, 0.3631, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000}, "pT rap effeciency values for Pions"}; + Configurable> effPtValuesKa{"effPtValuesKa", {0, 0, 0, 0.328845, 0.379771, 0.390088, 0.403074, 0.35504, 0.256438, 0.131726, 0.13796, 0.140295, 0.147229, 0.156968, 0.162245, 0.171312, 0.175851, 0.185823, 0.188763, 0.193965, 0.192999, 0.191121, 0.195547, 0.210082, 0.217502, 0.232456, 0.245035, 0.254051, 0.268206, 0.274664, 0.290428, 0.294979, 0.304817, 0.324206, 0.342578, 0.36466, 0.394134}, "effeciency values for Kaons"}; + Configurable> effPtRapValuesKa{"effPtRapValuesKa", {0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1710, 0.4333, 0.4561, 0.4428, 0.1393, 0.1635, 0.1836, 0.1883, 0.1719, 0.1795, 0.1780, 0.1907, 0.2059, 0.2126, 0.2202, 0.2160, 0.2130, 0.2434, 0.2642, 0.2601, 0.2988, 0.2967, 0.3087, 0.3210, 0.3659, 0.3808, 0.3560, 0.4011, 0.4004, 0.4507, 0.5358, 0.5475, 0.4919, 0.5736, 0.0000, 0.0000, 0.0000, 0.4064, 0.4340, 0.4523, 0.4884, 0.2246, 0.1275, 0.1524, 0.1638, 0.1678, 0.1899, 0.2055, 0.2134, 0.2186, 0.2245, 0.2655, 0.2590, 0.2420, 0.2367, 0.2698, 0.2533, 0.2606, 0.2782, 0.3164, 0.3342, 0.3403, 0.3238, 0.3297, 0.3572, 0.4031, 0.3991, 0.4431, 0.4791, 0.5160, 0.5619, 0.0000, 0.0000, 0.0000, 0.4011, 0.4186, 0.4499, 0.4929, 0.3641, 0.1376, 0.1716, 0.1813, 0.1748, 0.1816, 0.1987, 0.2031, 0.2157, 0.2189, 0.2383, 0.2336, 0.2463, 0.2388, 0.2608, 0.2532, 0.2906, 0.2875, 0.2858, 0.3218, 0.3383, 0.3852, 0.4082, 0.4257, 0.3886, 0.4276, 0.4136, 0.5055, 0.5401, 0.5559, 0.0000, 0.0000, 0.0000, 0.4018, 0.4292, 0.4693, 0.4800, 0.4941, 0.1452, 0.1656, 0.1789, 0.1754, 0.1932, 0.1992, 0.2124, 0.2334, 0.2529, 0.2683, 0.2569, 0.2610, 0.2560, 0.2817, 0.2783, 0.2701, 0.2927, 0.3348, 0.3479, 0.3598, 0.3752, 0.4069, 0.3838, 0.4251, 0.4384, 0.4489, 0.4720, 0.5712, 0.5559, 0.0000, 0.0000, 0.0000, 0.4044, 0.4158, 0.4518, 0.4736, 0.5041, 0.2438, 0.1757, 0.1872, 0.1927, 0.2077, 0.2163, 0.2303, 0.2333, 0.2466, 0.2500, 0.2546, 0.2598, 0.2597, 0.2549, 0.2765, 0.2824, 0.2953, 0.3066, 0.3252, 0.3230, 0.3371, 0.3696, 0.3785, 0.4025, 0.3631, 0.3894, 0.4227, 0.4968, 0.5269, 0.0000, 0.0000, 0.0000, 0.3772, 0.4052, 0.4427, 0.4735, 0.4973, 0.3424, 0.1813, 0.1817, 0.1755, 0.1913, 0.1964, 0.1931, 0.2108, 0.2139, 0.2267, 0.2449, 0.2446, 0.2306, 0.2203, 0.2281, 0.2395, 0.2564, 0.2729, 0.2793, 0.2971, 0.3204, 0.3486, 0.3403, 0.3598, 0.3336, 0.4031, 0.3827, 0.4153, 0.4825, 0.0000, 0.0000, 0.0000, 0.3692, 0.4236, 0.4238, 0.4535, 0.4874, 0.4023, 0.1581, 0.1600, 0.1752, 0.1779, 0.1921, 0.2002, 0.2115, 0.1938, 0.2353, 0.2190, 0.2317, 0.2499, 0.2108, 0.2228, 0.2372, 0.2598, 0.2897, 0.2968, 0.3133, 0.3346, 0.3145, 0.3446, 0.3797, 0.3506, 0.3971, 0.3812, 0.4328, 0.4627, 0.0000, 0.0000, 0.0000, 0.3574, 0.4078, 0.4161, 0.4555, 0.4859, 0.4549, 0.1234, 0.1394, 0.1447, 0.1518, 0.1617, 0.1720, 0.1870, 0.1899, 0.1990, 0.2060, 0.2290, 0.2154, 0.1940, 0.2001, 0.2104, 0.2297, 0.2476, 0.2475, 0.3002, 0.2997, 0.2965, 0.3335, 0.2995, 0.3265, 0.3485, 0.3586, 0.3593, 0.3895, 0.0000, 0.0000, 0.0000, 0.3515, 0.3866, 0.3904, 0.4175, 0.4436, 0.4482, 0.1154, 0.1325, 0.1284, 0.1375, 0.1461, 0.1515, 0.1668, 0.1598, 0.1779, 0.1718, 0.1851, 0.1923, 0.1751, 0.1677, 0.1788, 0.1905, 0.2016, 0.2277, 0.2293, 0.2357, 0.2365, 0.2547, 0.2547, 0.2904, 0.3060, 0.2770, 0.3024, 0.3044, 0.0000, 0.0000, 0.0000, 0.2892, 0.3182, 0.3325, 0.3723, 0.3948, 0.4164, 0.0746, 0.0849, 0.0802, 0.0831, 0.0977, 0.0977, 0.1076, 0.1055, 0.1078, 0.1292, 0.1338, 0.1203, 0.1220, 0.1222, 0.1269, 0.1520, 0.1471, 0.1481, 0.1551, 0.1632, 0.1747, 0.1881, 0.1929, 0.1952, 0.1882, 0.2317, 0.2041, 0.2184, 0.0000, 0.0000, 0.0000, 0.1412, 0.1523, 0.1380, 0.1249, 0.1134, 0.1096, 0.0206, 0.0215, 0.0217, 0.0234, 0.0245, 0.0235, 0.0264, 0.0260, 0.0259, 0.0306, 0.0301, 0.0329, 0.0278, 0.0293, 0.0291, 0.0285, 0.0338, 0.0367, 0.0327, 0.0347, 0.0379, 0.0398, 0.0394, 0.0415, 0.0432, 0.0459, 0.0455, 0.0448, 0.0000, 0.0000, 0.0000, 0.3380, 0.3800, 0.3929, 0.4257, 0.4659, 0.4770, 0.1180, 0.1269, 0.1332, 0.1331, 0.1554, 0.1509, 0.1550, 0.1511, 0.1614, 0.1707, 0.1756, 0.1879, 0.1745, 0.1814, 0.1935, 0.2082, 0.2145, 0.2267, 0.2253, 0.2399, 0.2584, 0.2321, 0.2688, 0.2835, 0.2905, 0.2703, 0.2646, 0.3305, 0.0000, 0.0000, 0.0000, 0.3511, 0.3996, 0.4104, 0.4351, 0.4728, 0.4420, 0.1167, 0.1296, 0.1344, 0.1395, 0.1582, 0.1586, 0.1630, 0.1761, 0.1778, 0.1758, 0.2058, 0.2141, 0.1884, 0.1912, 0.2007, 0.1999, 0.2372, 0.2419, 0.2498, 0.2777, 0.2696, 0.2919, 0.2636, 0.2878, 0.2997, 0.3078, 0.3120, 0.3634, 0.0000, 0.0000, 0.0000, 0.3515, 0.4008, 0.4128, 0.4487, 0.4714, 0.3919, 0.1661, 0.1741, 0.1862, 0.1905, 0.2126, 0.2116, 0.2105, 0.2297, 0.2320, 0.2338, 0.2458, 0.2438, 0.2333, 0.2475, 0.2702, 0.2490, 0.2799, 0.3052, 0.3312, 0.3008, 0.3384, 0.3727, 0.3729, 0.3636, 0.3633, 0.4090, 0.4434, 0.4768, 0.0000, 0.0000, 0.0000, 0.3819, 0.4277, 0.4347, 0.4577, 0.4789, 0.3477, 0.1967, 0.2060, 0.2049, 0.2209, 0.2227, 0.2315, 0.2301, 0.2438, 0.2524, 0.2502, 0.2623, 0.2576, 0.2564, 0.2699, 0.2855, 0.3143, 0.2979, 0.3263, 0.3232, 0.3717, 0.3753, 0.4165, 0.4346, 0.4080, 0.4615, 0.4266, 0.4392, 0.5890, 0.0000, 0.0000, 0.0000, 0.3925, 0.4204, 0.4355, 0.4655, 0.5137, 0.2522, 0.1977, 0.2036, 0.2264, 0.2299, 0.2466, 0.2628, 0.2639, 0.2634, 0.2815, 0.3062, 0.3054, 0.2843, 0.2735, 0.2903, 0.3024, 0.3271, 0.3474, 0.3701, 0.3710, 0.3882, 0.4187, 0.4192, 0.4064, 0.4700, 0.4275, 0.4634, 0.5384, 0.5804, 0.0000, 0.0000, 0.0000, 0.4013, 0.4256, 0.4442, 0.4596, 0.4860, 0.1637, 0.1880, 0.1854, 0.2001, 0.2260, 0.2395, 0.2359, 0.2605, 0.2761, 0.2912, 0.3005, 0.3060, 0.2783, 0.2967, 0.3172, 0.3477, 0.3610, 0.3755, 0.3853, 0.4036, 0.4232, 0.4345, 0.4714, 0.4609, 0.4807, 0.4760, 0.5307, 0.5920, 0.6667, 0.0000, 0.0000, 0.0000, 0.4080, 0.4225, 0.4587, 0.4873, 0.3585, 0.1490, 0.1847, 0.1978, 0.2024, 0.1907, 0.2021, 0.2301, 0.2312, 0.2396, 0.2437, 0.2615, 0.2626, 0.2670, 0.2763, 0.2692, 0.3377, 0.2918, 0.3532, 0.3584, 0.4009, 0.4231, 0.3914, 0.4495, 0.4513, 0.4265, 0.5075, 0.5419, 0.5530, 0.5991, 0.0000, 0.0000, 0.0000, 0.4028, 0.4344, 0.4443, 0.4706, 0.2189, 0.1332, 0.1607, 0.1688, 0.1826, 0.1941, 0.2104, 0.2330, 0.2464, 0.2556, 0.2657, 0.2593, 0.2694, 0.2570, 0.2585, 0.2601, 0.3015, 0.3106, 0.3096, 0.3325, 0.3396, 0.3926, 0.3547, 0.3922, 0.4017, 0.4041, 0.4452, 0.5183, 0.5656, 0.6020, 0.0000, 0.0000, 0.0000, 0.1668, 0.4392, 0.4493, 0.4341, 0.1520, 0.1720, 0.2046, 0.1954, 0.1838, 0.1763, 0.1911, 0.1864, 0.2099, 0.2275, 0.2336, 0.2244, 0.2312, 0.2482, 0.2544, 0.2762, 0.2956, 0.3206, 0.3364, 0.3618, 0.3787, 0.3705, 0.4065, 0.4193, 0.4130, 0.4612, 0.5291, 0.5680, 0.5802, 0.5690, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000}, "pT rap effeciency values for Kaons"}; + Configurable> effPtValuesPr{"effPtValuesPr", {0, 0, 0, 0, 0, 0, 0, 0.413799, 0.443597, 0.478144, 0.505512, 0.514127, 0.523279, 0.506121, 0.481129, 0.436858, 0.365426, 0.244158, 0.246106, 0.249133, 0.251019, 0.256516, 0.263027, 0.258241, 0.260814, 0.270519, 0.272534, 0.271853, 0.274523, 0.279029, 0.279756, 0.285479, 0.292531, 0.292348, 0.294704, 0.295867, 0.289818}, "effeciency values for Kaons"}; + Configurable> effPtRapValuesPr{"effPtRapValuesPr", {0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0339, 0.3198, 0.6225, 0.6961, 0.6865, 0.3870, 0.3603, 0.3747, 0.3765, 0.3812, 0.3860, 0.3793, 0.3897, 0.3713, 0.3408, 0.3204, 0.3505, 0.3313, 0.3189, 0.3179, 0.3714, 0.3450, 0.3659, 0.3303, 0.3727, 0.3353, 0.4124, 0.3755, 0.3680, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.2453, 0.5687, 0.6297, 0.6445, 0.6864, 0.7439, 0.6205, 0.3602, 0.3300, 0.3139, 0.3066, 0.2902, 0.2910, 0.3169, 0.3290, 0.3596, 0.3345, 0.3379, 0.3808, 0.3658, 0.3311, 0.3829, 0.4252, 0.3592, 0.3778, 0.4173, 0.4083, 0.3905, 0.4169, 0.3470, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5466, 0.6134, 0.6293, 0.6451, 0.6817, 0.7348, 0.6971, 0.4628, 0.3037, 0.3039, 0.3051, 0.3492, 0.3391, 0.3190, 0.3521, 0.3582, 0.3402, 0.3278, 0.3477, 0.3936, 0.3571, 0.3591, 0.3739, 0.3902, 0.3732, 0.4123, 0.3741, 0.3137, 0.3740, 0.3497, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5707, 0.6136, 0.6606, 0.6479, 0.6613, 0.6752, 0.6961, 0.7150, 0.3865, 0.3336, 0.3168, 0.3175, 0.3289, 0.3310, 0.3365, 0.3517, 0.3521, 0.3274, 0.3496, 0.3850, 0.3615, 0.3780, 0.3802, 0.4004, 0.4011, 0.4142, 0.4057, 0.4173, 0.4073, 0.4222, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5873, 0.6086, 0.6380, 0.6571, 0.6536, 0.7018, 0.7207, 0.7215, 0.5860, 0.3364, 0.3081, 0.3494, 0.3398, 0.3491, 0.3680, 0.3567, 0.4204, 0.3898, 0.3957, 0.4100, 0.3749, 0.4093, 0.3917, 0.4212, 0.3910, 0.4062, 0.4019, 0.4378, 0.3997, 0.3769, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5695, 0.5995, 0.6392, 0.6646, 0.6341, 0.6736, 0.7025, 0.7104, 0.7144, 0.4082, 0.3392, 0.3319, 0.3259, 0.3929, 0.3720, 0.3617, 0.3716, 0.3394, 0.3454, 0.3520, 0.3409, 0.3872, 0.3775, 0.3134, 0.3928, 0.3635, 0.3540, 0.4066, 0.3520, 0.3580, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5524, 0.6210, 0.6435, 0.6720, 0.6714, 0.6821, 0.7348, 0.7403, 0.7531, 0.5534, 0.3513, 0.3381, 0.3319, 0.3384, 0.3426, 0.3254, 0.3360, 0.3503, 0.3264, 0.3306, 0.3642, 0.3545, 0.3478, 0.3527, 0.3625, 0.3678, 0.4036, 0.3569, 0.3321, 0.3761, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5472, 0.5793, 0.6230, 0.6680, 0.6685, 0.6886, 0.7368, 0.7534, 0.7767, 0.6561, 0.2933, 0.2798, 0.2943, 0.2940, 0.3034, 0.3104, 0.3133, 0.3168, 0.3209, 0.3018, 0.3135, 0.3137, 0.3315, 0.3580, 0.3384, 0.3454, 0.3307, 0.3182, 0.3801, 0.3145, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5479, 0.5660, 0.5973, 0.6225, 0.6437, 0.6655, 0.6920, 0.7241, 0.7637, 0.7145, 0.2647, 0.2727, 0.2858, 0.2508, 0.2523, 0.2647, 0.2592, 0.2438, 0.3017, 0.2916, 0.2582, 0.2705, 0.2876, 0.2960, 0.2958, 0.2982, 0.3014, 0.2978, 0.3077, 0.3234, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.4692, 0.5078, 0.5095, 0.5695, 0.6257, 0.5869, 0.6149, 0.6597, 0.7159, 0.6730, 0.1877, 0.1686, 0.1809, 0.1793, 0.1636, 0.1880, 0.1822, 0.1980, 0.2000, 0.1931, 0.1960, 0.1895, 0.1921, 0.2056, 0.2194, 0.2048, 0.1942, 0.1944, 0.2267, 0.1756, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1458, 0.1090, 0.1011, 0.0956, 0.0961, 0.0920, 0.0934, 0.1006, 0.1015, 0.1028, 0.0299, 0.0291, 0.0298, 0.0290, 0.0285, 0.0326, 0.0318, 0.0316, 0.0335, 0.0307, 0.0370, 0.0346, 0.0373, 0.0330, 0.0404, 0.0409, 0.0379, 0.0393, 0.0384, 0.0347, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5459, 0.5794, 0.5870, 0.6118, 0.6806, 0.6603, 0.6685, 0.6983, 0.7300, 0.7229, 0.2701, 0.2476, 0.2332, 0.2516, 0.2832, 0.2878, 0.2401, 0.2429, 0.2737, 0.2909, 0.2821, 0.2739, 0.2935, 0.2763, 0.2905, 0.2901, 0.2624, 0.2743, 0.2765, 0.2768, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5492, 0.5688, 0.6025, 0.6438, 0.6553, 0.6753, 0.6955, 0.7401, 0.7443, 0.6152, 0.2739, 0.2595, 0.2627, 0.2448, 0.2755, 0.2661, 0.2868, 0.2728, 0.2766, 0.2822, 0.2971, 0.2699, 0.2906, 0.2847, 0.2991, 0.2922, 0.2971, 0.3115, 0.3190, 0.2911, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5386, 0.5562, 0.6265, 0.6461, 0.6657, 0.6662, 0.6788, 0.7231, 0.7452, 0.5331, 0.3690, 0.3522, 0.3639, 0.3608, 0.3767, 0.3659, 0.3698, 0.3622, 0.3835, 0.3945, 0.3727, 0.3756, 0.3696, 0.3793, 0.3974, 0.3849, 0.4076, 0.4034, 0.3830, 0.3997, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5549, 0.5906, 0.6211, 0.6459, 0.6337, 0.6527, 0.7139, 0.7135, 0.6978, 0.4328, 0.3874, 0.4117, 0.3946, 0.4086, 0.3969, 0.4171, 0.4177, 0.4252, 0.4013, 0.3983, 0.3879, 0.3580, 0.4246, 0.3776, 0.4004, 0.4148, 0.4322, 0.4258, 0.4097, 0.4332, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5714, 0.6016, 0.6489, 0.6461, 0.6212, 0.6422, 0.6781, 0.6867, 0.5264, 0.3990, 0.3788, 0.3841, 0.3841, 0.4045, 0.4228, 0.4481, 0.4041, 0.4295, 0.4772, 0.4250, 0.4547, 0.4662, 0.4123, 0.4281, 0.3978, 0.4676, 0.4783, 0.4357, 0.4261, 0.5097, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5979, 0.5975, 0.6258, 0.6617, 0.6368, 0.6823, 0.7199, 0.7093, 0.3680, 0.3414, 0.3514, 0.3390, 0.3770, 0.3479, 0.3471, 0.3840, 0.3779, 0.3988, 0.4329, 0.4114, 0.4216, 0.3994, 0.4046, 0.4322, 0.4386, 0.4179, 0.4636, 0.4501, 0.4376, 0.4547, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5787, 0.6295, 0.6553, 0.6404, 0.6299, 0.6723, 0.6928, 0.4525, 0.3031, 0.3146, 0.3160, 0.3328, 0.3610, 0.3694, 0.3414, 0.3894, 0.3549, 0.3514, 0.3854, 0.3937, 0.4015, 0.3991, 0.3783, 0.3765, 0.4228, 0.4194, 0.3932, 0.4179, 0.4323, 0.3799, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.2257, 0.5829, 0.6392, 0.6577, 0.6744, 0.7086, 0.6263, 0.3869, 0.3645, 0.3169, 0.2885, 0.2944, 0.2982, 0.2959, 0.3214, 0.3271, 0.3333, 0.3841, 0.3707, 0.4022, 0.3970, 0.3747, 0.3930, 0.3812, 0.3923, 0.3872, 0.4083, 0.4625, 0.4091, 0.4308, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0343, 0.3174, 0.6091, 0.6870, 0.6767, 0.4265, 0.4035, 0.3921, 0.4054, 0.3786, 0.3852, 0.3952, 0.3551, 0.3799, 0.3574, 0.3478, 0.3342, 0.3269, 0.3239, 0.3679, 0.3209, 0.3090, 0.3767, 0.3253, 0.3707, 0.3915, 0.4005, 0.4359, 0.4303, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000}, "pT rap effeciency values for Protons"}; using MyAllTracks = soa::Join 0) hist.fill(HIST("Gen/h_NSim"), nSim); @@ -1416,6 +1422,8 @@ struct MeanPtFlucId { // Before Collision and Track Cuts: fillBeforeQAHistos(col, tracks); + hist.fill(HIST("Gen/h_VtxZ_b"), col.mcCollision().posZ()); + // After Collision and Track Cuts: if (selRun3Col(col)) { fillHistos(col, tracks); From d7cf7407785cac908d5c8ce3be615551aa5f2807 Mon Sep 17 00:00:00 2001 From: Yash Patley <52608802+yashpatley@users.noreply.github.com> Date: Sun, 2 Mar 2025 03:29:24 +0530 Subject: [PATCH 0492/1650] [PWGCF] Update lambdaR2Correlation.cxx (#10271) --- .../Tasks/lambdaR2Correlation.cxx | 151 ++++++++++++++++-- 1 file changed, 134 insertions(+), 17 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx index e4bec628913..83a83531628 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx @@ -252,6 +252,7 @@ struct LambdaTableProducer { // V0s MC Configurable cHasMcFlag{"cHasMcFlag", true, "Has Mc Tag"}; Configurable cSelectTrueLambda{"cSelectTrueLambda", false, "Select True Lambda"}; + Configurable cSelectPrimaryV0{"cSelectPrimaryV0", true, "Select Primary V0"}; Configurable cRecPrimaryLambda{"cRecPrimaryLambda", false, "Primary Reconstructed Lambda"}; Configurable cRecSecondaryLambda{"cRecSecondaryLambda", false, "Secondary Reconstructed Lambda"}; Configurable cGenPrimaryLambda{"cGenPrimaryLambda", true, "Primary Generated Lambda"}; @@ -259,6 +260,10 @@ struct LambdaTableProducer { Configurable cGenDecayChannel{"cGenDecayChannel", true, "Gen Level Decay Channel Flag"}; Configurable cMcGenDauTrackKinCutFlag{"cMcGenDauTrackKinCutFlag", false, "Gen Level Daughter Track Kinematic Cut Flag"}; + // Mc Matching + Configurable cSelMcMatchValue{"cSelMcMatchValue", 0.4, "Mc Matching Percentage"}; + Configurable cDoMcMatching{"cDoMcMatching", true, "Do Mc Matching Flag"}; + // Efficiency Correction Configurable cCorrectionFlag{"cCorrectionFlag", false, "Efficiency Correction Flag"}; Configurable cCorrFactHist{"cCorrFactHist", 0, "Correction Factor Histogram"}; @@ -299,9 +304,9 @@ struct LambdaTableProducer { const AxisSpec axisPID(8000, -4000, 4000, "PdgCode"); const AxisSpec axisV0Mass(200, 1.09, 1.14, "M_{p#pi} (GeV/#it{c}^{2})"); - const AxisSpec axisV0Pt(38, 0.2, 4.0, "p_{T} (GeV/#it{c})"); - const AxisSpec axisV0Rap(24, -1.2, 1.2, "y"); - const AxisSpec axisV0Eta(24, -1.2, 1.2, "#eta"); + const AxisSpec axisV0Pt(84, 0.2, 4.4, "p_{T} (GeV/#it{c})"); + const AxisSpec axisV0Rap(48, -1.2, 1.2, "y"); + const AxisSpec axisV0Eta(48, -1.2, 1.2, "#eta"); const AxisSpec axisV0Phi(36, 0., TwoPI, "#phi (rad)"); const AxisSpec axisRadius(2000, 0, 200, "r(cm)"); @@ -343,6 +348,11 @@ struct LambdaTableProducer { histos.add("QA/Lambda/h1f_V0_ctau", "V_{0} c#tau", kTH1F, {axisCTau}); histos.add("QA/Lambda/h1f_V0_gctau", "V_{0} #gammac#tau", kTH1F, {axisGCTau}); + histos.add("QA/Lambda/h2f_V0_ptpt", "Rec vs Truth p_{T}", kTH2F, {axisV0Pt, axisV0Pt}); + histos.add("QA/Lambda/h2f_V0_etaeta", "Rec vs Truth #eta", kTH2F, {axisV0Eta, axisV0Eta}); + histos.add("QA/Lambda/h2f_V0_raprap", "Rec vs Truth y", kTH2F, {axisV0Rap, axisV0Rap}); + histos.add("QA/Lambda/h2f_V0_phiphi", "Rec vs Truth #phi", kTH2F, {axisV0Phi, axisV0Phi}); + histos.add("QA/Lambda/h1f_pos_prong_pt", "Pos-Prong p_{T}", kTH1F, {axisTrackPt}); histos.add("QA/Lambda/h1f_neg_prong_pt", "Neg-Prong p_{T}", kTH1F, {axisTrackPt}); histos.add("QA/Lambda/h1f_pos_prong_eta", "Pos-Prong #eta-distribution", kTH1F, {axisV0Eta}); @@ -694,15 +704,11 @@ struct LambdaTableProducer { return true; } - template - bool selTrueMcRecLambda(V const& v0, T const&) + template + bool selPrimaryV0(V const& v0) { auto mcpart = v0.template mcParticle_as(); - if (std::abs(mcpart.pdgCode()) != kLambda0) { - return false; - } - // check for primary/secondary lambda if (cRecPrimaryLambda && !mcpart.isPhysicalPrimary()) { histos.fill(HIST("Tracks/h1f_tracks_info"), kNotPrimaryLambda); @@ -712,6 +718,18 @@ struct LambdaTableProducer { return false; } + return true; + } + + template + bool selTrueMcRecLambda(V const& v0, T const&) + { + auto mcpart = v0.template mcParticle_as(); + + if (std::abs(mcpart.pdgCode()) != kLambda0) { + return false; + } + auto postrack = v0.template posTrack_as(); auto negtrack = v0.template negTrack_as(); @@ -751,6 +769,42 @@ struct LambdaTableProducer { return true; } + template + bool getMcMatch(T const& vrec, T const& vgen) + { + float v = std::abs(1. - (vrec / vgen)); + + if (v >= cSelMcMatchValue) { + return false; + } + + return true; + } + + template + bool passMcMatching(V const& v0) + { + auto mcpart = v0.template mcParticle_as(); + + if (!getMcMatch(v0.pt(), mcpart.pt())) { + return false; + } + + if (!getMcMatch(v0.eta(), mcpart.eta())) { + return false; + } + + if (!getMcMatch(v0.yLambda(), mcpart.y())) { + return false; + } + + if (!getMcMatch(v0.phi(), mcpart.phi())) { + return false; + } + + return true; + } + template float getCorrectionFactors(C const& col, V const& v0) { @@ -793,6 +847,18 @@ struct LambdaTableProducer { return retVal; } + template + void fillMCMatchingHistos(V const& v0) + { + static constexpr std::string_view SubDir[] = {"QA/Lambda/", "QA/AntiLambda/"}; + auto mcpart = v0.template mcParticle_as(); + + histos.fill(HIST(SubDir[part]) + HIST("h2f_V0_ptpt"), v0.pt(), mcpart.pt()); + histos.fill(HIST(SubDir[part]) + HIST("h2f_V0_etaeta"), v0.eta(), mcpart.eta()); + histos.fill(HIST(SubDir[part]) + HIST("h2f_V0_raprap"), v0.yLambda(), mcpart.y()); + histos.fill(HIST(SubDir[part]) + HIST("h2f_V0_phiphi"), v0.phi(), mcpart.phi()); + } + template void fillLambdaQAHistos(C const& col, V const& v0, T const&) { @@ -902,9 +968,21 @@ struct LambdaTableProducer { // do MC analysis if constexpr (dmc == kMC) { histos.fill(HIST("Tracks/h2f_tracks_pid_before_sel"), v0.mcParticle().pdgCode(), v0.pt()); - if (cSelectTrueLambda && !selTrueMcRecLambda(v0, tracks)) { + if (cSelectPrimaryV0 && !selPrimaryV0(v0)) { // check for Primary V0 + continue; + } + if (cSelectTrueLambda && !selTrueMcRecLambda(v0, tracks)) { // check for true Lambda/Anti-Lambda + continue; + } + if (cDoMcMatching && !passMcMatching(v0)) { // Do Mc Matching continue; } + // Fill MC Matching Histos (MC Matching Cuts to be implemented soon...) + if (v0Type == kLambda) { + fillMCMatchingHistos(v0); + } else { + fillMCMatchingHistos(v0); + } histos.fill(HIST("Tracks/h1f_tracks_info"), kPassTrueLambdaSel); histos.fill(HIST("Tracks/h2f_tracks_pid_after_sel"), v0.mcParticle().pdgCode(), v0.pt()); } @@ -1000,8 +1078,16 @@ struct LambdaTableProducer { if (cMcGenDauTrackKinCutFlag && !dauKinCutFlag) { // check daughter acceptance continue; } - if (cGenDecayChannel && (std::abs(daughterPDGs[0]) != kProton || std::abs(daughterPDGs[1]) != kPiPlus)) { // check decay channel - continue; + if (cGenDecayChannel) { // check decay channel + if (v0Type == kLambda) { + if (daughterPDGs[0] != kProton || daughterPDGs[1] != kPiMinus) { + continue; + } + } else if (v0Type == kAntiLambda) { + if (daughterPDGs[0] != kProtonBar || daughterPDGs[1] != kPiPlus) { + continue; + } + } } histos.fill(HIST("Tracks/h1f_tracks_info"), kGenLambdaToPrPi); @@ -1058,6 +1144,10 @@ struct LambdaTableProducer { if (!collisions.begin().has_mcCollision() || !selCollision(collisions.begin()) || collisions.begin().mcCollisionId() != mcCollision.globalIndex()) { return; } + // Mc Matching + if (cDoMcMatching && !getMcMatch(collisions.begin().posZ(), mcCollision.posZ())) { + return; + } histos.fill(HIST("McGen/h1f_collisions_info"), kPassSelCol); histos.fill(HIST("McGen/h2f_collision_posZ"), mcCollision.posZ(), collisions.begin().posZ()); auto v0Tracks = V0s.sliceBy(perCollision, collisions.begin().globalIndex()); @@ -1277,6 +1367,10 @@ struct LambdaR2Correlation { // Eta/Rap Analysis Configurable cDoEtaAnalysis{"cDoEtaAnalysis", false, "Eta/Rap Analysis Flag"}; + // Generator Level Particles + Configurable cGenParticleFlag{"cGenParticleFlag", true, "Generator Number Flag"}; + Configurable cGenParticles{"cGenParticles", 3, "Number of Truth Lambda to construct correlation"}; + // Rotation Angle Min/Max Configurable cRotAngleMin{"cRotAngleMin", -0.12, "Rotation Angle Minimum"}; Configurable cRotAngleMax{"cRotAngleMax", 0.12, "Rotation Angle Minimum"}; @@ -1367,6 +1461,10 @@ struct LambdaR2Correlation { histos.add("Reco/h2d_n1_rapphi_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH2D, {axisRap, axisPhi}); // rho2 for R2 Rap1Phi1Rap2Phi2 histograms + histos.add("Reco/h2d_n2_raprap_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisRap, axisRap}); + histos.add("Reco/h2d_n2_raprap_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisRap, axisRap}); + histos.add("Reco/h2d_n2_raprap_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisRap, axisRap}); + histos.add("Reco/h2d_n2_rapphi_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisRapPhi, axisRapPhi}); histos.add("Reco/h2d_n2_rapphi_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisRapPhi, axisRapPhi}); histos.add("Reco/h2d_n2_rapphi_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisRapPhi, axisRapPhi}); @@ -1520,11 +1618,30 @@ struct LambdaR2Correlation { auto lambdaMcGenTracks = partLambdaMcGenTracks->sliceByCached(aod::lambdamcgentrack::lambdaMcGenCollisionId, mcgencol.globalIndex(), cachemc); auto antiLambdaMcGenTracks = partAntiLambdaMcGenTracks->sliceByCached(aod::lambdamcgentrack::lambdaMcGenCollisionId, mcgencol.globalIndex(), cachemc); - analyzeSingles(mcgencol, lambdaMcGenTracks); - analyzeSingles(mcgencol, antiLambdaMcGenTracks); - analyzePairs(lambdaMcGenTracks, antiLambdaMcGenTracks); - analyzePairs(lambdaMcGenTracks, lambdaMcGenTracks); - analyzePairs(antiLambdaMcGenTracks, antiLambdaMcGenTracks); + bool lambdaFlag = true, antiLambdaFlag = true; + + if (cGenParticleFlag) { + if (lambdaMcGenTracks.size() > cGenParticles) { + lambdaFlag = false; + } + if (antiLambdaMcGenTracks.size() > cGenParticles) { + antiLambdaFlag = false; + } + } + + if (lambdaFlag) { + analyzeSingles(mcgencol, lambdaMcGenTracks); + analyzePairs(lambdaMcGenTracks, lambdaMcGenTracks); + } + + if (antiLambdaFlag) { + analyzeSingles(mcgencol, antiLambdaMcGenTracks); + analyzePairs(antiLambdaMcGenTracks, antiLambdaMcGenTracks); + } + + if (lambdaFlag && antiLambdaFlag) { + analyzePairs(lambdaMcGenTracks, antiLambdaMcGenTracks); + } } PROCESS_SWITCH(LambdaR2Correlation, processMCGen, "Process for MC Generated", false); From 5d85a3aa036c62faa585faff532e35d2830d14c2 Mon Sep 17 00:00:00 2001 From: Rahul Verma <110929992+rahulverma012@users.noreply.github.com> Date: Sun, 2 Mar 2025 03:42:11 +0530 Subject: [PATCH 0493/1650] [PWGCF] Kaon isospin fluctuation : Reco Level and Truth Level analysis added (#10249) --- PWGCF/EbyEFluctuations/Tasks/CMakeLists.txt | 5 + .../Tasks/kaonIsospinFluctuations.cxx | 1161 ++++++++++++----- 2 files changed, 845 insertions(+), 321 deletions(-) diff --git a/PWGCF/EbyEFluctuations/Tasks/CMakeLists.txt b/PWGCF/EbyEFluctuations/Tasks/CMakeLists.txt index e763f929e71..a55aa34e61c 100644 --- a/PWGCF/EbyEFluctuations/Tasks/CMakeLists.txt +++ b/PWGCF/EbyEFluctuations/Tasks/CMakeLists.txt @@ -49,6 +49,11 @@ o2physics_add_dpl_workflow(factorial-moments PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(kaon-isospin-fluctuations + SOURCES kaonIsospinFluctuations.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(netcharge-fluctuations SOURCES netchargeFluctuations.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore diff --git a/PWGCF/EbyEFluctuations/Tasks/kaonIsospinFluctuations.cxx b/PWGCF/EbyEFluctuations/Tasks/kaonIsospinFluctuations.cxx index 0534421cea2..b6a4eb5042b 100644 --- a/PWGCF/EbyEFluctuations/Tasks/kaonIsospinFluctuations.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/kaonIsospinFluctuations.cxx @@ -29,11 +29,32 @@ #include "PWGLF/DataModel/LFStrangenessTables.h" +#include "PWGLF/DataModel/mcCentrality.h" + using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::constants::physics; // for constants +#define ID_BIT_PI 0 // Identificationi bits for PID checks +#define ID_BIT_KA 1 +#define ID_BIT_PR 2 +#define ID_BIT_EL 3 +#define ID_BIT_DE 4 + +#define BIT_IS_K0S 0 +#define BIT_IS_LAMBDA 1 +#define BIT_IS_ANTILAMBDA 2 + +// #define kPAIRBIT_ISLAMBDA + +#define BIT_POS_DAU_HAS_SAME_COLL 0 +#define BIT_NEG_DAU_HAS_SAME_COLL 1 +#define BIT_BOTH_DAU_HAS_SAME_COLL 2 + +#define BITSET(mask, ithBit) ((mask) |= (1 << (ithBit))) // avoid name bitset as std::bitset is already there +#define BITCHECK(mask, ithBit) ((mask) & (1 << (ithBit))) // bit check will return int value, not bool, use BITCHECK != 0 in Analysi + struct KaonIsospinFluctuations { // Hisogram registry: HistogramRegistry recoV0s{"recoV0s", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -41,6 +62,7 @@ struct KaonIsospinFluctuations { HistogramRegistry recoK0s{"recoK0s", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry recoTracks{"recoTracks", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry recoAnalysis{"recoAnalysis", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry genAnalysis{"genAnalysis", {}, OutputObjHandlingPolicy::AnalysisObject}; // PDG data base Service pdgDB; @@ -60,6 +82,41 @@ struct KaonIsospinFluctuations { Configurable mLowK0s{"mLowK0s", 0.48, "mLowK0s"}; Configurable mHighK0s{"mHighK0s", 0.515, "mHighK0s"}; + // Histogram Configurables + Configurable centBins{"centBins", 1020, "No of bins in centrality axis"}; + Configurable centBinsxLow{"centBinsxLow", -1.0f, "centBinsxLow"}; + Configurable centBinsxUp{"centBinsxUp", 101.0, "centBinsxUp"}; + + Configurable centAxisType{"centAxisType", 0, "centAxisType"}; + + // configurable for process functions to reduce memory usage + Configurable cfgFillV0TableFull{"cfgFillV0TableFull", true, "cfgFillV0TableFull"}; + Configurable cfgFillV0TablePostK0sCheck{"cfgFillV0TablePostK0sCheck", false, "cfgFillV0TablePostK0sCheck"}; + Configurable cfgFillV0TablePostMassCut{"cfgFillV0TablePostMassCut", false, "cfgFillV0TablePostMassCut"}; + Configurable cfgFillV0TablePostSelectionCut{"cfgFillV0TablePostSelectionCut", true, "cfgFillV0TablePostSelectionCut"}; + + Configurable cfgFillRecoK0sPreSel{"cfgFillRecoK0sPreSel", false, "cfgFillRecoK0sPreSel"}; + Configurable cfgFillRecoK0sPostSel{"cfgFillRecoK0sPostSel", true, "cfgFillRecoK0sPostSel"}; + + Configurable cfgFillRecoTrackPreSel{"cfgFillRecoTrackPreSel", false, "cfgFillRecoTrackPreSel"}; + Configurable cfgFillRecoTrackPostSel{"cfgFillRecoTrackPostSel", true, "cfgFillRecoTrackPostSel"}; + + Configurable cfgFillPiQA{"cfgFillPiQA", true, "cfgFillPiQA"}; + Configurable cfgFillKaQA{"cfgFillKaQA", true, "cfgFillKaQA"}; + Configurable cfgFillPrQA{"cfgFillPrQA", true, "cfgFillPrQA"}; + Configurable cfgFillElQA{"cfgFillElQA", true, "cfgFillElQA"}; + Configurable cfgFillDeQA{"cfgFillDeQA", true, "cfgFillDeQA"}; + + Configurable cfgFillSparseFullK0sPiKa{"cfgFillSparseFullK0sPiKa", true, "cfgFillSparseFullK0sPiKa"}; + Configurable cfgFillSparseFullK0sPrDe{"cfgFillSparseFullK0sPrDe", true, "cfgFillSparseFullK0sPrDe"}; + Configurable cfgFillSparseFullK0sKaEl{"cfgFillSparseFullK0sKaEl", false, "cfgFillSparseFullK0sKaEl"}; + Configurable cfgFillSparseFullPiKaPr{"cfgFillSparseFullPiKaPr", false, "cfgFillSparseFullPiKaPr"}; + Configurable cfgFillSparseFullPiElDe{"cfgFillSparseFullPiElDe", false, "cfgFillSparseFullPiElDe"}; + Configurable cfgFillSparseFullKaPrDe{"cfgFillSparseFullKaPrDe", false, "cfgFillSparseFullKaPrDe"}; + Configurable cfgFillSparseFullPrElDe{"cfgFillSparseFullPrElDe", false, "cfgFillSparseFullPrElDe"}; + Configurable cfgFillSparsenewDynmK0sKa{"cfgFillSparsenewDynmK0sKa", true, "cfgFillSparsenewDynmK0sKa"}; + Configurable cfgFillSparsenewDynmKpKm{"cfgFillSparsenewDynmKpKm", true, "cfgFillSparsenewDynmKpKm"}; + void init(InitContext const&) { // Axes @@ -67,7 +124,16 @@ struct KaonIsospinFluctuations { const AxisSpec axisLambdaMass = {200, 1.f, 1.2f, "#it{M}_{inv} [GeV/#it{c}^{2}]"}; const AxisSpec axisVertexZ = {30, -15., 15., "vrtx_{Z} [cm]"}; - const AxisSpec axiscentFT0C = {1020, -1.0, 101.0, "centFT0C(percentile)"}; + AxisSpec axisCent = {centBins, centBinsxLow, centBinsxUp, "centFT0C(percentile)"}; + if (centAxisType == 1) { + axisCent = {centBins, centBinsxLow, centBinsxUp, "centFT0M(percentile)"}; + } + if (centAxisType == 2) { + axisCent = {centBins, centBinsxLow, centBinsxUp, "multFT0M"}; + } + if (centAxisType == 3) { + axisCent = {centBins, centBinsxLow, centBinsxUp, "multFT0C"}; + } const AxisSpec axisP = {200, 0.0f, 10.0f, "#it{p} (GeV/#it{c})"}; const AxisSpec axisPt = {200, 0.0f, 10.0f, "#it{p}_{T} (GeV/#it{c})"}; @@ -76,7 +142,7 @@ struct KaonIsospinFluctuations { const AxisSpec axisEta = {100, -5, 5, "#eta"}; const AxisSpec axisPhi = {90, -1, 8, "#phi (radians)"}; - const AxisSpec axisRapidity = {200, -10, 10, "Rapidity (y)"}; + const AxisSpec axisRapidity = {200, -5, 5, "Rapidity (y)"}; const AxisSpec axisDcaXY = {100, -5, 5, "dcaXY"}; const AxisSpec axisDcaZ = {100, -5, 5, "dcaZ"}; const AxisSpec axisDcaXYwide = {2000, -100, 100, "dcaXY"}; @@ -222,7 +288,7 @@ struct KaonIsospinFluctuations { recoEvent.add("recoEvent/h02_VertexXRec", "VertexXRec", {HistType::kTH1D, {{1000, -0.2, 0.2}}}); recoEvent.add("recoEvent/h03_VertexYRec", "VertexYRec", {HistType::kTH1D, {{1000, -0.2, 0.2}}}); recoEvent.add("recoEvent/h04_VertexZRec", "VertexZRec", {HistType::kTH1F, {axisVertexZ}}); - recoEvent.add("recoEvent/h05_Centrality", "Centrality", {HistType::kTH1F, {axiscentFT0C}}); + recoEvent.add("recoEvent/h05_Centrality", "Centrality", {HistType::kTH1F, {axisCent}}); recoEvent.add("recoEvent/h06_V0Size", "V0Size", {HistType::kTH1F, {{60, -10, 50}}}); recoEvent.add("recoEvent/h07_TracksSize", "TracksSize", {HistType::kTH1F, {axisParticleCount2}}); recoEvent.add("recoEvent/h08_nTrack", "nTrack", {HistType::kTH1F, {axisParticleCount2}}); @@ -309,7 +375,7 @@ struct KaonIsospinFluctuations { recoK0s.addClone("recoK0s/PreSel/", "recoK0s/PostSel/"); // for unidentified case // to observe and debug - recoK0s.add("recoK0s/PostSel/mK0s_vs_centFTOC", "mK0s_vs_centFTOC", kTH2F, {axiscentFT0C, axisK0sMass}); + recoK0s.add("recoK0s/PostSel/mK0s_vs_cent", "mK0s_vs_cent", kTH2F, {axisCent, axisK0sMass}); // Tracks reconstruction // FullTrack @@ -398,6 +464,7 @@ struct KaonIsospinFluctuations { recoAnalysis.add("recoAnalysis/Pi/tpcId/h37_tpcNSigma_tofNSigma", "tpcNSigma_tofNSigma", histTpcNSigmaTofNSigma); recoAnalysis.addClone("recoAnalysis/Pi/tpcId/", "recoAnalysis/Pi/tofId/"); + recoAnalysis.addClone("recoAnalysis/Pi/tpcId/", "recoAnalysis/Pi/NoId/"); recoAnalysis.addClone("recoAnalysis/Pi/", "recoAnalysis/Ka/"); // Kaon recoAnalysis.addClone("recoAnalysis/Pi/", "recoAnalysis/Pr/"); // Proton recoAnalysis.addClone("recoAnalysis/Pi/", "recoAnalysis/El/"); // Electron @@ -406,18 +473,30 @@ struct KaonIsospinFluctuations { recoAnalysis.add("recoAnalysis/SelectedTrack_IdentificationTag", "SelectedTrack_IdentificationTag", kTH1D, {{34, -1.5, 32.5, "trackTAG"}}); recoAnalysis.add("recoAnalysis/RejectedTrack_RejectionTag", "RejectedTrack_RejectionTag", kTH1D, {{16, -1.5, 6.5, "rejectionTAG"}}); - recoAnalysis.add("recoAnalysis/Sparse_Full_K0sPiKa", "Sparse_Full_K0sPiKa", kTHnSparseD, {axiscentFT0C, {2000, -1.5, 1998.5, "nTrack"}, {100, -1.5, 98.5, "nK0s"}, {100, -1.5, 98.5, "nRejectedPiPlus"}, {100, -1.5, 98.5, "nRejectedPiMinus"}, {500, -1.5, 498.5, "nPiPlus"}, {500, -1.5, 498.5, "nPiMinus"}, {500, -1.5, 498.5, "nKaPlus"}, {500, -1.5, 498.5, "nKaMinus"}}); - recoAnalysis.add("recoAnalysis/Sparse_Full_K0sPrDe", "Sparse_Full_K0sPrDe", kTHnSparseD, {axiscentFT0C, {2000, -1.5, 1998.5, "nTrack"}, {100, -1.5, 98.5, "nK0s"}, {100, -1.5, 98.5, "nRejectedPiPlus"}, {100, -1.5, 98.5, "nRejectedPiMinus"}, {500, -1.5, 498.5, "nProton"}, {500, -1.5, 498.5, "nPBar"}, {500, -1.5, 498.5, "nDePlus"}, {500, -1.5, 498.5, "nDeMinus"}}); - recoAnalysis.add("recoAnalysis/Sparse_Full_K0sKaEl", "Sparse_Full_K0sKaEl", kTHnSparseD, {axiscentFT0C, {2000, -1.5, 1998.5, "nTrack"}, {100, -1.5, 98.5, "nK0s"}, {100, -1.5, 98.5, "nRejectedPiPlus"}, {100, -1.5, 98.5, "nRejectedPiMinus"}, {500, -1.5, 498.5, "nKaPlus"}, {500, -1.5, 498.5, "nKaMinus"}, {500, -1.5, 498.5, "nElPlus"}, {500, -1.5, 498.5, "nElMinus"}}); - recoAnalysis.add("recoAnalysis/Sparse_Full_PiKaPr", "Sparse_Full_PiKaPr", kTHnSparseD, {axiscentFT0C, {2000, -1.5, 1998.5, "nTrack"}, {100, -1.5, 98.5, "nRejectedPiPlus"}, {100, -1.5, 98.5, "nRejectedPiMinus"}, {500, -1.5, 498.5, "nPiPlus"}, {500, -1.5, 498.5, "nPiMinus"}, {500, -1.5, 498.5, "nKaPlus"}, {500, -1.5, 498.5, "nKaMinus"}, {500, -1.5, 498.5, "nProton"}, {500, -1.5, 498.5, "nPBar"}}); - recoAnalysis.add("recoAnalysis/Sparse_Full_PiElDe", "Sparse_Full_PiElDe", kTHnSparseD, {axiscentFT0C, {2000, -1.5, 1998.5, "nTrack"}, {100, -1.5, 98.5, "nRejectedPiPlus"}, {100, -1.5, 98.5, "nRejectedPiMinus"}, {500, -1.5, 498.5, "nPiPlus"}, {500, -1.5, 498.5, "nPiMinus"}, {500, -1.5, 498.5, "nElPlus"}, {500, -1.5, 498.5, "nElMinus"}, {500, -1.5, 498.5, "nDePlus"}, {500, -1.5, 498.5, "nDeMinus"}}); - recoAnalysis.add("recoAnalysis/Sparse_Full_KaPrDe", "Sparse_Full_KaPrDe", kTHnSparseD, {axiscentFT0C, {2000, -1.5, 1998.5, "nTrack"}, {100, -1.5, 98.5, "nRejectedPiPlus"}, {100, -1.5, 98.5, "nRejectedPiMinus"}, {500, -1.5, 498.5, "nKaPlus"}, {500, -1.5, 498.5, "nKaMinus"}, {500, -1.5, 498.5, "nProton"}, {500, -1.5, 498.5, "nPBar"}, {500, -1.5, 498.5, "nDePlus"}, {500, -1.5, 498.5, "nDeMinus"}}); - recoAnalysis.add("recoAnalysis/Sparse_Full_PrElDe", "Sparse_Full_PrElDe", kTHnSparseD, {axiscentFT0C, {2000, -1.5, 1998.5, "nTrack"}, {100, -1.5, 98.5, "nRejectedPiPlus"}, {100, -1.5, 98.5, "nRejectedPiMinus"}, {500, -1.5, 498.5, "nProton"}, {500, -1.5, 498.5, "nPBar"}, {500, -1.5, 498.5, "nElPlus"}, {500, -1.5, 498.5, "nElMinus"}, {500, -1.5, 498.5, "nDePlus"}, {500, -1.5, 498.5, "nDeMinus"}}); + recoAnalysis.add("recoAnalysis/Sparse_Full_K0sPiKa", "Sparse_Full_K0sPiKa", kTHnSparseD, {axisCent, {2000, -1.5, 1998.5, "nTrack"}, {100, -1.5, 98.5, "nK0s"}, {100, -1.5, 98.5, "nRejectedPiPlus"}, {100, -1.5, 98.5, "nRejectedPiMinus"}, {500, -1.5, 498.5, "nPiPlus"}, {500, -1.5, 498.5, "nPiMinus"}, {500, -1.5, 498.5, "nKaPlus"}, {500, -1.5, 498.5, "nKaMinus"}}); + recoAnalysis.add("recoAnalysis/Sparse_Full_K0sPrDe", "Sparse_Full_K0sPrDe", kTHnSparseD, {axisCent, {2000, -1.5, 1998.5, "nTrack"}, {100, -1.5, 98.5, "nK0s"}, {100, -1.5, 98.5, "nRejectedPiPlus"}, {100, -1.5, 98.5, "nRejectedPiMinus"}, {500, -1.5, 498.5, "nProton"}, {500, -1.5, 498.5, "nPBar"}, {500, -1.5, 498.5, "nDePlus"}, {500, -1.5, 498.5, "nDeMinus"}}); + recoAnalysis.add("recoAnalysis/Sparse_Full_K0sKaEl", "Sparse_Full_K0sKaEl", kTHnSparseD, {axisCent, {2000, -1.5, 1998.5, "nTrack"}, {100, -1.5, 98.5, "nK0s"}, {100, -1.5, 98.5, "nRejectedPiPlus"}, {100, -1.5, 98.5, "nRejectedPiMinus"}, {500, -1.5, 498.5, "nKaPlus"}, {500, -1.5, 498.5, "nKaMinus"}, {500, -1.5, 498.5, "nElPlus"}, {500, -1.5, 498.5, "nElMinus"}}); + recoAnalysis.add("recoAnalysis/Sparse_Full_PiKaPr", "Sparse_Full_PiKaPr", kTHnSparseD, {axisCent, {2000, -1.5, 1998.5, "nTrack"}, {100, -1.5, 98.5, "nRejectedPiPlus"}, {100, -1.5, 98.5, "nRejectedPiMinus"}, {500, -1.5, 498.5, "nPiPlus"}, {500, -1.5, 498.5, "nPiMinus"}, {500, -1.5, 498.5, "nKaPlus"}, {500, -1.5, 498.5, "nKaMinus"}, {500, -1.5, 498.5, "nProton"}, {500, -1.5, 498.5, "nPBar"}}); + recoAnalysis.add("recoAnalysis/Sparse_Full_PiElDe", "Sparse_Full_PiElDe", kTHnSparseD, {axisCent, {2000, -1.5, 1998.5, "nTrack"}, {100, -1.5, 98.5, "nRejectedPiPlus"}, {100, -1.5, 98.5, "nRejectedPiMinus"}, {500, -1.5, 498.5, "nPiPlus"}, {500, -1.5, 498.5, "nPiMinus"}, {500, -1.5, 498.5, "nElPlus"}, {500, -1.5, 498.5, "nElMinus"}, {500, -1.5, 498.5, "nDePlus"}, {500, -1.5, 498.5, "nDeMinus"}}); + recoAnalysis.add("recoAnalysis/Sparse_Full_KaPrDe", "Sparse_Full_KaPrDe", kTHnSparseD, {axisCent, {2000, -1.5, 1998.5, "nTrack"}, {100, -1.5, 98.5, "nRejectedPiPlus"}, {100, -1.5, 98.5, "nRejectedPiMinus"}, {500, -1.5, 498.5, "nKaPlus"}, {500, -1.5, 498.5, "nKaMinus"}, {500, -1.5, 498.5, "nProton"}, {500, -1.5, 498.5, "nPBar"}, {500, -1.5, 498.5, "nDePlus"}, {500, -1.5, 498.5, "nDeMinus"}}); + recoAnalysis.add("recoAnalysis/Sparse_Full_PrElDe", "Sparse_Full_PrElDe", kTHnSparseD, {axisCent, {2000, -1.5, 1998.5, "nTrack"}, {100, -1.5, 98.5, "nRejectedPiPlus"}, {100, -1.5, 98.5, "nRejectedPiMinus"}, {500, -1.5, 498.5, "nProton"}, {500, -1.5, 498.5, "nPBar"}, {500, -1.5, 498.5, "nElPlus"}, {500, -1.5, 498.5, "nElMinus"}, {500, -1.5, 498.5, "nDePlus"}, {500, -1.5, 498.5, "nDeMinus"}}); - recoAnalysis.add("recoAnalysis/Sparse_newDynm_K0s_Ka", "Sparse_newDynm_K0s_Ka", kTHnSparseD, {axiscentFT0C, {2000, -1.5, 1998.5, "nTrack"}, {100, -1.5, 98.5, "nK0s"}, {500, -1.5, 498.5, "nKaon"}, {10000, -1.5, 9998.5, "(nK0s)^{2}"}, {250000, -1.5, 249998.5, "(nKaon)^{2}"}, {500, -1.5, 498.5, "(nK0s*nKaon)"}}); - recoAnalysis.add("recoAnalysis/Sparse_newDynm_Kp_Km", "Sparse_newDynm_Kp_Km", kTHnSparseD, {axiscentFT0C, {2000, -1.5, 1998.5, "nTrack"}, {500, -1.5, 498.5, "nKaPlus"}, {500, -1.5, 498.5, "nKaMinus"}, {250000, -1.5, 249998.5, "(nKaPlus)^{2}"}, {250000, -1.5, 249998.5, "(nKaMinus)^{2}"}, {250000, -1.5, 249998.5, "(nKaPlus*nKaMinus)"}}); + recoAnalysis.add("recoAnalysis/Sparse_newDynm_K0s_Ka", "Sparse_newDynm_K0s_Ka", kTHnSparseD, {axisCent, {2000, -1.5, 1998.5, "nTrack"}, {100, -1.5, 98.5, "nK0s"}, {500, -1.5, 498.5, "nKaon"}, {10000, -1.5, 9998.5, "(nK0s)^{2}"}, {250000, -1.5, 249998.5, "(nKaon)^{2}"}, {500, -1.5, 498.5, "(nK0s*nKaon)"}}); + recoAnalysis.add("recoAnalysis/Sparse_newDynm_Kp_Km", "Sparse_newDynm_Kp_Km", kTHnSparseD, {axisCent, {2000, -1.5, 1998.5, "nTrack"}, {500, -1.5, 498.5, "nKaPlus"}, {500, -1.5, 498.5, "nKaMinus"}, {250000, -1.5, 249998.5, "(nKaPlus)^{2}"}, {250000, -1.5, 249998.5, "(nKaMinus)^{2}"}, {250000, -1.5, 249998.5, "(nKaPlus*nKaMinus)"}}); // + genAnalysis.add("genAnalysis/K0s/h12_p", "p", kTH1F, {axisP}); + genAnalysis.add("genAnalysis/K0s/h13_pt", "pt", kTH1F, {axisPt}); + genAnalysis.add("genAnalysis/K0s/h14_eta", "eta", kTH1F, {axisEta}); + genAnalysis.add("genAnalysis/K0s/h15_phi", "phi", kTH1F, {axisPhi}); + genAnalysis.add("genAnalysis/K0s/h16_rapidity", "rapidity", kTH1F, {axisRapidity}); + + genAnalysis.addClone("genAnalysis/K0s/", "genAnalysis/Pi/"); + genAnalysis.addClone("genAnalysis/K0s/", "genAnalysis/Ka/"); + genAnalysis.addClone("genAnalysis/K0s/", "genAnalysis/Pr/"); + genAnalysis.addClone("genAnalysis/K0s/", "genAnalysis/El/"); + genAnalysis.addClone("genAnalysis/K0s/", "genAnalysis/De/"); + // Printing the Stored Registry information LOG(info) << "Printing Stored Registry Information"; LOG(info) << " DEBUG :: 01- recoV0s.print()"; @@ -430,8 +509,15 @@ struct KaonIsospinFluctuations { recoTracks.print(); LOG(info) << " DEBUG :: 05- recoAnalysis.print()"; recoAnalysis.print(); + LOG(info) << " DEBUG :: 06- genAnalysis.print()"; + genAnalysis.print(); } + enum IdentificationType { + kTPCidentified = 0, + kTOFidentified + }; + // tpc Selections template bool selPionTPCInnerParam(T track) @@ -583,19 +669,19 @@ struct KaonIsospinFluctuations { bool selPion(T track, int& IdMethod) { if (!track.hasTOF() && selPionTPCInnerParam(track)) { - IdMethod = 0; + IdMethod = kTPCidentified; return true; } if (track.hasTOF() && track.beta() < 0.0 && selPionTPCInnerParam(track)) { - IdMethod = 0; + IdMethod = kTPCidentified; return true; } if (track.hasTOF() && track.beta() > 0.0 && selPionTPCInnerParam(track)) { - IdMethod = 0; + IdMethod = kTPCidentified; return true; } if (track.hasTOF() && track.beta() > 0.0 && !selPionTPCInnerParam(track)) { - IdMethod = 1; + IdMethod = kTOFidentified; return selPionTOF(track); } return false; @@ -606,19 +692,19 @@ struct KaonIsospinFluctuations { bool selKaon(T track, int& IdMethod) { if (!track.hasTOF() && selKaonTPCInnerParam(track)) { - IdMethod = 0; + IdMethod = kTPCidentified; return true; } if (track.hasTOF() && track.beta() < 0.0 && selKaonTPCInnerParam(track)) { - IdMethod = 0; + IdMethod = kTPCidentified; return true; } if (track.hasTOF() && track.beta() > 0.0 && selKaonTPCInnerParam(track)) { - IdMethod = 0; + IdMethod = kTPCidentified; return true; } if (track.hasTOF() && track.beta() > 0.0 && !selKaonTPCInnerParam(track)) { - IdMethod = 1; + IdMethod = kTOFidentified; return selKaonTOF(track); } return false; @@ -629,19 +715,19 @@ struct KaonIsospinFluctuations { bool selProton(T track, int& IdMethod) { if (!track.hasTOF() && selProtonTPCInnerParam(track)) { - IdMethod = 0; + IdMethod = kTPCidentified; return true; } if (track.hasTOF() && track.beta() < 0.0 && selProtonTPCInnerParam(track)) { - IdMethod = 0; + IdMethod = kTPCidentified; return true; } if (track.hasTOF() && track.beta() > 0.0 && selProtonTPCInnerParam(track)) { - IdMethod = 0; + IdMethod = kTPCidentified; return true; } if (track.hasTOF() && track.beta() > 0.0 && !selProtonTPCInnerParam(track)) { - IdMethod = 1; + IdMethod = kTOFidentified; return selProtonTOF(track); } return false; @@ -652,19 +738,19 @@ struct KaonIsospinFluctuations { bool selDeuteron(T track, int& IdMethod) { if (!track.hasTOF() && selDeuteronTPCInnerParam(track)) { - IdMethod = 0; + IdMethod = kTPCidentified; return true; } if (track.hasTOF() && track.beta() < 0.0 && selDeuteronTPCInnerParam(track)) { - IdMethod = 0; + IdMethod = kTPCidentified; return true; } if (track.hasTOF() && track.beta() > 0.0 && selDeuteronTPCInnerParam(track)) { - IdMethod = 0; + IdMethod = kTPCidentified; return true; } if (track.hasTOF() && track.beta() > 0.0 && !selDeuteronTPCInnerParam(track)) { - IdMethod = 1; + IdMethod = kTOFidentified; return selDeuteronTOF(track); } return false; @@ -675,19 +761,19 @@ struct KaonIsospinFluctuations { bool selElectron(T track, int& IdMethod) { if (!track.hasTOF() && selElectronTPCInnerParam(track)) { - IdMethod = 0; + IdMethod = kTPCidentified; return true; } if (track.hasTOF() && track.beta() < 0.0 && selElectronTPCInnerParam(track)) { - IdMethod = 0; + IdMethod = kTPCidentified; return true; } if (track.hasTOF() && track.beta() > 0.0 && selElectronTPCInnerParam(track)) { - IdMethod = 0; + IdMethod = kTPCidentified; return true; } if (track.hasTOF() && track.beta() > 0.0 && !selElectronTPCInnerParam(track)) { - IdMethod = 1; + IdMethod = kTOFidentified; return selElectronTOF(track); } return false; @@ -714,13 +800,13 @@ struct KaonIsospinFluctuations { negIsProton = true; // Coming From AntiLambda -> PiPlus + AntiProton if (posIsPion && negIsPion) { - v0TagValue += 1; // It is K0s + BITSET(v0TagValue, BIT_IS_K0S); } if (posIsProton && negIsPion) { - v0TagValue += 2; // It is Lambda + BITSET(v0TagValue, BIT_IS_LAMBDA); } if (posIsPion && negIsProton) { - v0TagValue += 4; // It is AntiLambda + BITSET(v0TagValue, BIT_IS_ANTILAMBDA); } return v0TagValue; } @@ -730,13 +816,13 @@ struct KaonIsospinFluctuations { { int v0daughterCollisionIndexTag = 0; if (v0.collisionId() == posDaughterTrack.collisionId()) { - v0daughterCollisionIndexTag = +1; + BITSET(v0daughterCollisionIndexTag, BIT_POS_DAU_HAS_SAME_COLL); } if (v0.collisionId() == negDaughterTrack.collisionId()) { - v0daughterCollisionIndexTag = +2; + BITSET(v0daughterCollisionIndexTag, BIT_NEG_DAU_HAS_SAME_COLL); } if (posDaughterTrack.collisionId() == negDaughterTrack.collisionId()) { - v0daughterCollisionIndexTag = +4; + BITSET(v0daughterCollisionIndexTag, BIT_BOTH_DAU_HAS_SAME_COLL); } return v0daughterCollisionIndexTag; } @@ -800,6 +886,11 @@ struct KaonIsospinFluctuations { return true; } + enum ProcessTypeEnum { + doDataProcessing = 0, + doRecoProcessing + }; + enum HistRegEnum { v0TableFull = 0, v0TablePostK0sCheck, @@ -809,7 +900,8 @@ struct KaonIsospinFluctuations { recoK0sPostSel, recoTrackPreSel, recoTrackPostSel, - recoAnalysisDir + recoAnalysisDir, + genAnalysisDir }; static constexpr std::string_view HistRegDire[] = { @@ -821,14 +913,16 @@ struct KaonIsospinFluctuations { "recoK0s/PostSel/", "recoTracks/PreSel/", "recoTracks/PostSel/", - "recoAnalysis/"}; + "recoAnalysis/", + "genAnalysis/"}; enum PidEnum { kPi = 0, // dont use kPion, kKaon, as these enumeration kKa, // are already defined in $ROOTSYS/root/include/TPDGCode.h kPr, kEl, - kDe + kDe, + kK0s }; static constexpr std::string_view PidDire[] = { @@ -836,7 +930,8 @@ struct KaonIsospinFluctuations { "Ka/", "Pr/", "El/", - "De/"}; + "De/", + "K0s/"}; enum DetEnum { tpcId = 0, @@ -852,25 +947,36 @@ struct KaonIsospinFluctuations { template void fillIdentificationQA(H histReg, const T& track) { + float tpcNSigmaVal = -999, tofNSigmaVal = -999; switch (pidMode) { case kPi: + if (!cfgFillPiQA) + return; tpcNSigmaVal = track.tpcNSigmaPi(); tofNSigmaVal = track.tofNSigmaPi(); break; case kKa: + if (!cfgFillKaQA) + return; tpcNSigmaVal = track.tpcNSigmaKa(); tofNSigmaVal = track.tofNSigmaKa(); break; case kPr: + if (!cfgFillPrQA) + return; tpcNSigmaVal = track.tpcNSigmaPr(); tofNSigmaVal = track.tofNSigmaPr(); break; case kEl: + if (!cfgFillElQA) + return; tpcNSigmaVal = track.tpcNSigmaEl(); tofNSigmaVal = track.tofNSigmaEl(); break; case kDe: + if (!cfgFillDeQA) + return; tpcNSigmaVal = track.tpcNSigmaDe(); tofNSigmaVal = track.tofNSigmaDe(); break; @@ -1018,12 +1124,321 @@ struct KaonIsospinFluctuations { } } + template + void fillGenTrackQA(H& histReg, const T& mcTrack) + { + histReg.fill(HIST(HistRegDire[Mode]) + HIST(PidDire[pidMode]) + HIST("h12_p"), mcTrack.p()); + histReg.fill(HIST(HistRegDire[Mode]) + HIST(PidDire[pidMode]) + HIST("h13_pt"), mcTrack.pt()); + histReg.fill(HIST(HistRegDire[Mode]) + HIST(PidDire[pidMode]) + HIST("h14_eta"), mcTrack.eta()); + histReg.fill(HIST(HistRegDire[Mode]) + HIST(PidDire[pidMode]) + HIST("h15_phi"), mcTrack.phi()); + histReg.fill(HIST(HistRegDire[Mode]) + HIST(PidDire[pidMode]) + HIST("h16_rapidity"), mcTrack.y()); + } + + template + void executeV0loop(const T& posDaughterTrack, const T& negDaughterTrack, const U& v0, H& recoV0s, + int& posPiIdMethod, int& posPrIdMethod, int& negPiIdMethod, int& negPrIdMethod, + int& v0Tag, int& trueV0TagValue, bool& isK0s, int& v0DauCollisionIndexTag, + auto& k0sPosDauList, auto& k0sNegDauList) + { + posPiIdMethod = -1; + posPrIdMethod = -1; + negPiIdMethod = -1; + negPrIdMethod = -1; + v0Tag = findV0Tag(posDaughterTrack, negDaughterTrack, posPiIdMethod, posPrIdMethod, negPiIdMethod, negPrIdMethod); + v0DauCollisionIndexTag = findCollisionIndexTag(v0, posDaughterTrack, negDaughterTrack); + + isK0s = false; + if (BITCHECK(v0Tag, BIT_IS_K0S) != 0) + isK0s = true; + trueV0TagValue = 0; + if (cfgFillV0TableFull) { + fillV0QA(recoV0s, v0, posDaughterTrack, negDaughterTrack, v0Tag, v0DauCollisionIndexTag, posPiIdMethod, negPiIdMethod); + } + // cut on dynamic columns for v0 particles + if (v0.v0cosPA() < v0settingCosPA) + return; // in place of continue; + if (v0.v0radius() < v0settingRadius) + return; // in place of continue; + + // K0s Analysis + if (isK0s) { + if (cfgFillV0TablePostK0sCheck) { + fillV0QA(recoV0s, v0, posDaughterTrack, negDaughterTrack, v0Tag, v0DauCollisionIndexTag, posPiIdMethod, negPiIdMethod); + } + // K0s mass cut + if (cfgFillV0TablePostMassCut) { + if (mLowK0s < v0.mK0Short() && v0.mK0Short() < mHighK0s) { + fillV0QA(recoV0s, v0, posDaughterTrack, negDaughterTrack, v0Tag, v0DauCollisionIndexTag, posPiIdMethod, negPiIdMethod); + } + } + // Final K0s Selection. + if (selK0s(v0)) { + if (cfgFillV0TablePostSelectionCut) { + fillV0QA(recoV0s, v0, posDaughterTrack, negDaughterTrack, v0Tag, v0DauCollisionIndexTag, posPiIdMethod, negPiIdMethod); + } + trueV0TagValue += 1; + k0sPosDauList.push_back(posDaughterTrack.globalIndex()); + k0sNegDauList.push_back(negDaughterTrack.globalIndex()); + } + recoV0s.fill(HIST(HistRegDire[v0TablePostSelectionCut]) + HIST("hTrueV0TagCount"), trueV0TagValue); // 001 = Kaon, 010 = Lambda, 100 = AnitLambda + } // End of K0s block + } + + void executeSortK0sDaughters(const auto& k0sPosDauList, const auto& k0sNegDauList, auto& fullDauList) + { + findRepeatedEntries(k0sPosDauList, recoV0s.get(HIST(HistRegDire[v0TablePostSelectionCut]) + HIST("nCommonPionOfDifferentK0s"))); + findRepeatedEntries(k0sNegDauList, recoV0s.get(HIST(HistRegDire[v0TablePostSelectionCut]) + HIST("nCommonPionOfDifferentK0s"))); + + // Obtain one single new daughter vector to remove double counting + fullDauList.insert(fullDauList.end(), k0sPosDauList.begin(), k0sPosDauList.end()); + fullDauList.insert(fullDauList.end(), k0sNegDauList.begin(), k0sNegDauList.end()); + + // Sort and Remove repeated entries + std::sort(fullDauList.begin(), fullDauList.end()); + auto last = std::unique(fullDauList.begin(), fullDauList.end()); // std::unique only moves duplicates to end of the vector + fullDauList.erase(last, fullDauList.end()); // last is the iterator position from where duplicate entries start + + // Check sorting + if (!std::is_sorted(fullDauList.begin(), fullDauList.end())) { + LOG(error) << "fullDauList is unsorted, will give wrong results when v0 and collisions will be checked"; + } + } + + template //, typename H> + void executeV0InCollisionloop(const T& posDaughterTrack, const T& negDaughterTrack, const U& v0, + int& posPiIdMethod, int& posPrIdMethod, int& negPiIdMethod, int& negPrIdMethod, + int& v0Tag, bool& isK0s, int& v0DauCollisionIndexTag, int& nK0s, const float& centrality) + { + if (v0.v0cosPA() < v0settingCosPA) + return; // for continue; // cut on dynamic columns for v0 particles + if (v0.v0radius() < v0settingRadius) + return; // for continue; + isK0s = false; + + posPiIdMethod = -1; + posPrIdMethod = -1; + negPiIdMethod = -1; + negPrIdMethod = -1; + v0Tag = findV0Tag(posDaughterTrack, negDaughterTrack, posPiIdMethod, posPrIdMethod, negPiIdMethod, negPrIdMethod); + v0DauCollisionIndexTag = findCollisionIndexTag(v0, posDaughterTrack, negDaughterTrack); + + if (BITCHECK(v0Tag, BIT_IS_K0S) != 0) + isK0s = true; + if (cfgFillRecoK0sPreSel) { + fillV0QA(recoK0s, v0, posDaughterTrack, negDaughterTrack, v0Tag, v0DauCollisionIndexTag, posPiIdMethod, negPiIdMethod); + } + // K0s Analysis + if (isK0s && selK0s(v0)) { + if (cfgFillRecoK0sPostSel) { + fillV0QA(recoK0s, v0, posDaughterTrack, negDaughterTrack, v0Tag, v0DauCollisionIndexTag, posPiIdMethod, negPiIdMethod); + } + recoK0s.fill(HIST(HistRegDire[recoK0sPostSel]) + HIST("mK0s_vs_cent"), centrality, v0.mK0Short()); // centrality dependent mass + nK0s++; + } // End of K0s block + } + + template + void executeTrackQAPart(const T& track, const auto& fullDauList, int& rejectionTag, uint& skippingPosition, int& nRejectedPiMinus, int& nRejectedPiPlus, int& nTrack, bool& isAcceptedTrack) + { + if (cfgFillRecoTrackPreSel) { + fillTrackQA(track); + } + rejectionTag = 0; + if (!checkTrackSelection(track, fullDauList, skippingPosition, rejectionTag)) { + if (rejectionTag == 4) { + if (track.sign() > 0) { + nRejectedPiPlus++; + } + if (track.sign() < 0) { + nRejectedPiMinus++; + } + } + recoAnalysis.fill(HIST("recoAnalysis/RejectedTrack_RejectionTag"), rejectionTag); + isAcceptedTrack = false; + return; // for continue; + } + isAcceptedTrack = true; + if (cfgFillRecoTrackPostSel) { + fillTrackQA(track); + } + nTrack++; + } + + template + void executeTrackAnalysisPart(const T& track, const int& trackIdTag, + const int& idMethodPi, const bool& trackIsPion, int& nPiMinus, int& nPiPlus, + const int& idMethodKa, const bool& trackIsKaon, int& nKaMinus, int& nKaPlus, + const int& idMethodPr, const bool& trackIsProton, int& nProton, int& nPBar, + const int& idMethodEl, const bool& trackIsElectron, int& nElPlus, int& nElMinus, + const int& idMethodDe, const bool& trackIsDeuteron, int& nDePlus, int& nDeMinus) + { + if (trackIsPion) { + if (idMethodPi == -1) + fillIdentificationQA(recoAnalysis, track); + if (idMethodPi == 0) + fillIdentificationQA(recoAnalysis, track); + if (idMethodPi == 1) + fillIdentificationQA(recoAnalysis, track); + if (track.sign() > 0) { + nPiPlus++; + } + if (track.sign() < 0) { + nPiMinus++; + } + } + if (trackIsKaon) { + if (idMethodKa == -1) + fillIdentificationQA(recoAnalysis, track); + if (idMethodKa == 0) + fillIdentificationQA(recoAnalysis, track); + if (idMethodKa == 1) + fillIdentificationQA(recoAnalysis, track); + if (track.sign() > 0) { + nKaPlus++; + } + if (track.sign() < 0) { + nKaMinus++; + } + } + if (trackIsProton) { + if (idMethodPr == -1) + fillIdentificationQA(recoAnalysis, track); + if (idMethodPr == 0) + fillIdentificationQA(recoAnalysis, track); + if (idMethodPr == 1) + fillIdentificationQA(recoAnalysis, track); + if (track.sign() > 0) { + nProton++; + } + if (track.sign() < 0) { + nPBar++; + } + } + if (trackIsElectron) { + if (idMethodEl == -1) + fillIdentificationQA(recoAnalysis, track); + if (idMethodEl == 0) + fillIdentificationQA(recoAnalysis, track); + if (idMethodEl == 1) + fillIdentificationQA(recoAnalysis, track); + if (track.sign() > 0) { + nElPlus++; + } + if (track.sign() < 0) { + nElMinus++; + } + } + if (trackIsDeuteron) { + if (idMethodDe == -1) + fillIdentificationQA(recoAnalysis, track); + if (idMethodDe == 0) + fillIdentificationQA(recoAnalysis, track); + if (idMethodDe == 1) + fillIdentificationQA(recoAnalysis, track); + if (track.sign() > 0) { + nDePlus++; + } + if (track.sign() < 0) { + nDeMinus++; + } + } + recoAnalysis.fill(HIST("recoAnalysis/SelectedTrack_IdentificationTag"), trackIdTag); + } + + void executeSparseAnalysisPart(const float& centFT0C, const int& nTrack, const int& nK0s, + const int& nRejectedPiPlus, const int& nRejectedPiMinus, int& nKaon, + const int& nPiPlus, const int& nKaPlus, const int& nProton, const int& nElPlus, const int& nDePlus, + const int& nPiMinus, const int& nKaMinus, const int& nPBar, const int& nElMinus, const int& nDeMinus) + { + nKaon = nKaPlus + nKaMinus; + if (cfgFillSparseFullK0sPiKa) { + recoAnalysis.fill(HIST("recoAnalysis/Sparse_Full_K0sPiKa"), + centFT0C, nTrack, nK0s, + nRejectedPiPlus, nRejectedPiMinus, + nPiPlus, nPiMinus, nKaPlus, nKaMinus); + } + if (cfgFillSparseFullK0sPrDe) { + recoAnalysis.fill(HIST("recoAnalysis/Sparse_Full_K0sPrDe"), + centFT0C, nTrack, nK0s, + nRejectedPiPlus, nRejectedPiMinus, + nProton, nPBar, nDePlus, nDeMinus); + } + if (cfgFillSparseFullK0sKaEl) { + recoAnalysis.fill(HIST("recoAnalysis/Sparse_Full_K0sKaEl"), + centFT0C, nTrack, nK0s, nRejectedPiPlus, nRejectedPiMinus, + nKaPlus, nKaMinus, nElPlus, nElMinus); + } + if (cfgFillSparseFullPiKaPr) { + recoAnalysis.fill(HIST("recoAnalysis/Sparse_Full_PiKaPr"), + centFT0C, nTrack, + nRejectedPiPlus, nRejectedPiMinus, + nPiPlus, nPiMinus, nKaPlus, nKaMinus, nProton, nPBar); + } + if (cfgFillSparseFullPiElDe) { + recoAnalysis.fill(HIST("recoAnalysis/Sparse_Full_PiElDe"), + centFT0C, nTrack, + nRejectedPiPlus, nRejectedPiMinus, + nPiPlus, nPiMinus, nElPlus, nElMinus, nDePlus, nDeMinus); + } + if (cfgFillSparseFullKaPrDe) { + recoAnalysis.fill(HIST("recoAnalysis/Sparse_Full_KaPrDe"), + centFT0C, nTrack, + nRejectedPiPlus, nRejectedPiMinus, + nKaPlus, nKaMinus, nProton, nPBar, nDePlus, nDeMinus); + } + if (cfgFillSparseFullPrElDe) { + recoAnalysis.fill(HIST("recoAnalysis/Sparse_Full_PrElDe"), + centFT0C, nTrack, + nRejectedPiPlus, nRejectedPiMinus, + nProton, nPBar, nElPlus, nElMinus, nDePlus, nDeMinus); + } + if (cfgFillSparsenewDynmK0sKa) { + recoAnalysis.fill(HIST("recoAnalysis/Sparse_newDynm_K0s_Ka"), + centFT0C, nTrack, nK0s, nKaon, + nK0s * nK0s, nKaon * nKaon, nK0s * nKaon); + } + if (cfgFillSparsenewDynmKpKm) { + recoAnalysis.fill(HIST("recoAnalysis/Sparse_newDynm_Kp_Km"), + centFT0C, nTrack, nKaPlus, nKaMinus, + nKaPlus * nKaPlus, nKaMinus * nKaMinus, nKaPlus * nKaMinus); + } + } + + template + void executeEventInfoPart(const C& collision, const float& centrality, const int v0TableSize, const T& tracksTablePerColl, + const int& nTrack, const int& nK0s, + const int& nPiPlus, const int& nKaPlus, const int& nProton, const int& nElPlus, const int& nDePlus, + const int& nPiMinus, const int& nKaMinus, const int& nPBar, const int& nElMinus, const int& nDeMinus) + { + // Collisions QA + recoEvent.fill(HIST("recoEvent/h01_CollisionCount"), 0.5); + recoEvent.fill(HIST("recoEvent/h02_VertexXRec"), collision.posX()); + recoEvent.fill(HIST("recoEvent/h03_VertexYRec"), collision.posY()); + recoEvent.fill(HIST("recoEvent/h04_VertexZRec"), collision.posZ()); + recoEvent.fill(HIST("recoEvent/h05_Centrality"), centrality); + recoEvent.fill(HIST("recoEvent/h06_V0Size"), v0TableSize); + recoEvent.fill(HIST("recoEvent/h07_TracksSize"), tracksTablePerColl.size()); + recoEvent.fill(HIST("recoEvent/h08_nTrack"), nTrack); + recoEvent.fill(HIST("recoEvent/h09_nK0s"), nK0s); + recoEvent.fill(HIST("recoEvent/h10_nPiPlus"), nPiPlus); + recoEvent.fill(HIST("recoEvent/h11_nPiMinus"), nPiMinus); + recoEvent.fill(HIST("recoEvent/h12_nKaPlus"), nKaPlus); + recoEvent.fill(HIST("recoEvent/h13_nKaMinus"), nKaMinus); + recoEvent.fill(HIST("recoEvent/h14_nProton"), nProton); + recoEvent.fill(HIST("recoEvent/h15_nPBar"), nPBar); + recoEvent.fill(HIST("recoEvent/h16_nElPlus"), nElPlus); + recoEvent.fill(HIST("recoEvent/h17_nElMinus"), nElMinus); + recoEvent.fill(HIST("recoEvent/h18_nDePlus"), nDePlus); + recoEvent.fill(HIST("recoEvent/h19_nDeMinus"), nDeMinus); + } + // Event Filter Filter eventFilter = (o2::aod::evsel::sel8 == true); Filter posZFilter = (nabs(o2::aod::collision::posZ) < cutZvertex); // Track Filter Filter ptFilter = (o2::aod::track::pt) > 0.15f && (o2::aod::track::pt) < 2.0f; + Filter etaFilter = (nabs(o2::aod::track::eta) < 0.8f); // Filters on V0s Filter preFilterv0 = (nabs(aod::v0data::dcapostopv) > v0settingDcaPosToPV && @@ -1033,7 +1448,10 @@ struct KaonIsospinFluctuations { using MyCollisions = soa::Filtered>; - using MyTracks = soa::Filtered>; + using MyTracks = soa::Filtered>; using MyV0s = soa::Filtered; @@ -1041,18 +1459,25 @@ struct KaonIsospinFluctuations { Preslice tracksPerCollisionPreslice = o2::aod::track::collisionId; Preslice v0sPerCollisionPreslice = o2::aod::track::collisionId; + using MyCollisionsWithMcLabels = soa::Filtered>; + + using MyTracksWithMcLabels = soa::Filtered>; + + using MyV0sWithMcLabels = soa::Filtered>; + // Declaring vectors outside the process to avoid slight overhead for stack allocation and deallocation during each iteration. std::vector k0sPosDauList; std::vector k0sNegDauList; - - // fullDauList std::vector fullDauList; - void process(MyCollisions const& collisions, - MyV0s const& V0s, - MyTracks const& tracks) + // template + template + void executeAnalysis(const C& collisions, const V& V0s, const T& tracks) { - k0sPosDauList.clear(); k0sNegDauList.clear(); fullDauList.clear(); @@ -1068,66 +1493,6 @@ struct KaonIsospinFluctuations { int trueV0TagValue = 0; int v0DauCollisionIndexTag = 0; - for (const auto& v0 : V0s) { - const auto& posDaughterTrack = v0.posTrack_as(); - const auto& negDaughterTrack = v0.negTrack_as(); - - posPiIdMethod = -1; - posPrIdMethod = -1; - negPiIdMethod = -1; - negPrIdMethod = -1; - v0Tag = findV0Tag(posDaughterTrack, negDaughterTrack, posPiIdMethod, posPrIdMethod, negPiIdMethod, negPrIdMethod); - v0DauCollisionIndexTag = findCollisionIndexTag(v0, posDaughterTrack, negDaughterTrack); - - isK0s = false; - if ((v0Tag & 1) == 1) - isK0s = true; - trueV0TagValue = 0; - - fillV0QA(recoV0s, v0, posDaughterTrack, negDaughterTrack, v0Tag, v0DauCollisionIndexTag, posPiIdMethod, negPiIdMethod); - - // cut on dynamic columns for v0 particles - if (v0.v0cosPA() < v0settingCosPA) - continue; - if (v0.v0radius() < v0settingRadius) - continue; - - // K0s Analysis - if (isK0s) { - fillV0QA(recoV0s, v0, posDaughterTrack, negDaughterTrack, v0Tag, v0DauCollisionIndexTag, posPiIdMethod, negPiIdMethod); - // K0s mass cut - if (mLowK0s < v0.mK0Short() && v0.mK0Short() < mHighK0s) { - fillV0QA(recoV0s, v0, posDaughterTrack, negDaughterTrack, v0Tag, v0DauCollisionIndexTag, posPiIdMethod, negPiIdMethod); - } - - // Final K0s Selection. - if (selK0s(v0)) { - fillV0QA(recoV0s, v0, posDaughterTrack, negDaughterTrack, v0Tag, v0DauCollisionIndexTag, posPiIdMethod, negPiIdMethod); - trueV0TagValue += 1; - k0sPosDauList.push_back(posDaughterTrack.globalIndex()); - k0sNegDauList.push_back(negDaughterTrack.globalIndex()); - } - recoV0s.fill(HIST(HistRegDire[v0TablePostSelectionCut]) + HIST("hTrueV0TagCount"), trueV0TagValue); // 001 = Kaon, 010 = Lambda, 100 = AnitLambda - } // End of K0s block - } // End of V0s Loop - - findRepeatedEntries(k0sPosDauList, recoV0s.get(HIST(HistRegDire[v0TablePostSelectionCut]) + HIST("nCommonPionOfDifferentK0s"))); - findRepeatedEntries(k0sNegDauList, recoV0s.get(HIST(HistRegDire[v0TablePostSelectionCut]) + HIST("nCommonPionOfDifferentK0s"))); - - // Obtain one single new daughter vector to remove double counting - fullDauList.insert(fullDauList.end(), k0sPosDauList.begin(), k0sPosDauList.end()); - fullDauList.insert(fullDauList.end(), k0sNegDauList.begin(), k0sNegDauList.end()); - - // Sort and Remove repeated entries - std::sort(fullDauList.begin(), fullDauList.end()); - auto last = std::unique(fullDauList.begin(), fullDauList.end()); // std::unique only moves duplicates to end of the vector - fullDauList.erase(last, fullDauList.end()); // last is the iterator position from where duplicate entries start - - // Check sorting - if (!std::is_sorted(fullDauList.begin(), fullDauList.end())) { - LOG(error) << "fullDauList is unsorted, will give wrong results when v0 and collisions will be checked"; - } - // Declaring variables outside the loop to avoid slight overhead for stack allocation and deallocation during each iteration. uint skippingPosition = 0; int nK0s = 0; @@ -1144,7 +1509,7 @@ struct KaonIsospinFluctuations { int nTrack = 0; int nKaon = 0; - double centFT0C = 0; + float centrality = 0; int nRejectedPiPlus = 0; int nRejectedPiMinus = 0; @@ -1163,244 +1528,398 @@ struct KaonIsospinFluctuations { int idMethodEl = -1; int idMethodDe = -1; - for (const auto& collision : collisions) { + // if(doData) {} + if constexpr (analysisType == doDataProcessing) { + for (const auto& v0 : V0s) { + const auto& posDaughterTrack = v0.template posTrack_as(); + const auto& negDaughterTrack = v0.template negTrack_as(); - nK0s = 0; - nPiPlus = 0; - nPiMinus = 0; - nKaPlus = 0; - nKaMinus = 0; - nProton = 0; - nPBar = 0; - nElPlus = 0; - nElMinus = 0; - nDePlus = 0; - nDeMinus = 0; - nTrack = 0; - nKaon = 0; - - centFT0C = collision.centFT0C(); - - // group tracks, v0s manually - const uint64_t collIdx = collision.globalIndex(); - const auto tracksTablePerColl = tracks.sliceBy(tracksPerCollisionPreslice, collIdx); - const auto v0sTablePerColl = V0s.sliceBy(v0sPerCollisionPreslice, collIdx); - - for (const auto& v0 : v0sTablePerColl) { - if (v0.v0cosPA() < v0settingCosPA) - continue; // cut on dynamic columns for v0 particles - if (v0.v0radius() < v0settingRadius) - continue; + executeV0loop(posDaughterTrack, negDaughterTrack, v0, recoV0s, + posPiIdMethod, posPrIdMethod, negPiIdMethod, negPrIdMethod, + v0Tag, trueV0TagValue, isK0s, v0DauCollisionIndexTag, + k0sPosDauList, k0sNegDauList); + } // End of V0s Loop - const auto& posDaughterTrack = v0.posTrack_as(); - const auto& negDaughterTrack = v0.negTrack_as(); + executeSortK0sDaughters(k0sPosDauList, k0sNegDauList, fullDauList); + + for (const auto& collision : collisions) { + + nK0s = 0; + nPiPlus = 0; + nPiMinus = 0; + nKaPlus = 0; + nKaMinus = 0; + nProton = 0; + nPBar = 0; + nElPlus = 0; + nElMinus = 0; + nDePlus = 0; + nDeMinus = 0; + nTrack = 0; + nKaon = 0; + + centrality = collision.centFT0C(); + if (centAxisType == 1) { + centrality = collision.centFT0M(); + } else if (centAxisType == 2) { + centrality = collision.multFT0M(); + } else if (centAxisType == 3) { + centrality = collision.multFT0C(); + } - bool isK0s = false; + // group tracks, v0s manually + const uint64_t collIdx = collision.globalIndex(); + const auto tracksTablePerColl = tracks.sliceBy(tracksPerCollisionPreslice, collIdx); + const auto v0sTablePerColl = V0s.sliceBy(v0sPerCollisionPreslice, collIdx); + + for (const auto& v0 : v0sTablePerColl) { + const auto& posDaughterTrack = v0.template posTrack_as(); + const auto& negDaughterTrack = v0.template negTrack_as(); + + executeV0InCollisionloop(posDaughterTrack, negDaughterTrack, v0, + posPiIdMethod, posPrIdMethod, negPiIdMethod, negPrIdMethod, + v0Tag, isK0s, v0DauCollisionIndexTag, nK0s, centrality); + + } // End of V0s Loop + + nTrack = 0; + nRejectedPiPlus = 0; + nRejectedPiMinus = 0; + for (const auto& track : tracksTablePerColl) { + bool isAcceptedTrack = true; + executeTrackQAPart(track, fullDauList, rejectionTag, skippingPosition, nRejectedPiMinus, nRejectedPiPlus, nTrack, isAcceptedTrack); + if (!isAcceptedTrack) { + continue; + } - posPiIdMethod = -1; - posPrIdMethod = -1; - negPiIdMethod = -1; - negPrIdMethod = -1; - v0Tag = findV0Tag(posDaughterTrack, negDaughterTrack, posPiIdMethod, posPrIdMethod, negPiIdMethod, negPrIdMethod); - v0DauCollisionIndexTag = findCollisionIndexTag(v0, posDaughterTrack, negDaughterTrack); + // Do Proper Track Identification + trackIsPion = false; + trackIsKaon = false; + trackIsProton = false; + trackIsElectron = false; + trackIsDeuteron = false; + + trackIdTag = 0; + idMethodPi = -1; + idMethodKa = -1; + idMethodPr = -1; + idMethodEl = -1; + idMethodDe = -1; + + if (selPion(track, idMethodPi)) { + trackIsPion = true; + BITSET(trackIdTag, ID_BIT_PI); + } + if (selKaon(track, idMethodKa)) { + trackIsKaon = true; + BITSET(trackIdTag, ID_BIT_KA); + } + if (selProton(track, idMethodPr)) { + trackIsProton = true; + BITSET(trackIdTag, ID_BIT_PR); + } + if (selElectron(track, idMethodEl)) { + trackIsElectron = true; + BITSET(trackIdTag, ID_BIT_EL); + } + if (selDeuteron(track, idMethodDe)) { + trackIsDeuteron = true; + BITSET(trackIdTag, ID_BIT_DE); + } - if ((v0Tag & 1) == 1) - isK0s = true; + executeTrackAnalysisPart(track, trackIdTag, + idMethodPi, trackIsPion, nPiMinus, nPiPlus, + idMethodKa, trackIsKaon, nKaMinus, nKaPlus, + idMethodPr, trackIsProton, nProton, nPBar, + idMethodEl, trackIsElectron, nElPlus, nElMinus, + idMethodDe, trackIsDeuteron, nDePlus, nDeMinus); + } // track loop ends + + executeSparseAnalysisPart(centrality, nTrack, nK0s, + nRejectedPiPlus, nRejectedPiMinus, nKaon, + nPiPlus, nKaPlus, nProton, nElPlus, nDePlus, + nPiMinus, nKaMinus, nPBar, nElMinus, nDeMinus); + + executeEventInfoPart(collision, centrality, v0sTablePerColl.size(), tracksTablePerColl, + nTrack, nK0s, + nPiPlus, nKaPlus, nProton, nElPlus, nDePlus, + nPiMinus, nKaMinus, nPBar, nElMinus, nDeMinus); + } // collision loop ends + } else if constexpr (analysisType == doRecoProcessing) { + for (const auto& v0 : V0s) { + const auto& posDaughterTrack = v0.template posTrack_as(); + const auto& negDaughterTrack = v0.template negTrack_as(); + + //__________________________Reco Level ____________________________________________________ + if (!v0.has_mcParticle() || !posDaughterTrack.has_mcParticle() || !negDaughterTrack.has_mcParticle()) { + continue; + } - fillV0QA(recoK0s, v0, posDaughterTrack, negDaughterTrack, v0Tag, v0DauCollisionIndexTag, posPiIdMethod, negPiIdMethod); + auto v0mcparticle = v0.mcParticle(); // if (v0mcparticle.pdgCode() != 310 || !v0mcparticle.isPhysicalPrimary()) + if (!v0mcparticle.isPhysicalPrimary()) + continue; - // K0s Analysis - if (isK0s && selK0s(v0)) { - fillV0QA(recoK0s, v0, posDaughterTrack, negDaughterTrack, v0Tag, v0DauCollisionIndexTag, posPiIdMethod, negPiIdMethod); - recoK0s.fill(HIST(HistRegDire[recoK0sPostSel]) + HIST("mK0s_vs_centFTOC"), collision.centFT0C(), v0.mK0Short()); // centrality dependent mass - nK0s++; - } // End of K0s block + // should i check daugter tracks as physical primary as well. is it needed? // because my daughter must be seconday particle for it + + executeV0loop(posDaughterTrack, negDaughterTrack, v0, recoV0s, + posPiIdMethod, posPrIdMethod, negPiIdMethod, negPrIdMethod, + v0Tag, trueV0TagValue, isK0s, v0DauCollisionIndexTag, + k0sPosDauList, k0sNegDauList); } // End of V0s Loop + executeSortK0sDaughters(k0sPosDauList, k0sNegDauList, fullDauList); - nTrack = 0; - nRejectedPiPlus = 0; - nRejectedPiMinus = 0; - for (const auto& track : tracksTablePerColl) { - - fillTrackQA(track); - rejectionTag = 0; - if (!checkTrackSelection(track, fullDauList, skippingPosition, rejectionTag)) { - if (rejectionTag == 4) { - if (track.sign() > 0) { - nRejectedPiPlus++; - } - if (track.sign() < 0) { - nRejectedPiMinus++; - } - } - recoAnalysis.fill(HIST("recoAnalysis/RejectedTrack_RejectionTag"), rejectionTag); + for (const auto& collision : collisions) { + if (!collision.has_mcCollision()) { + LOG(warning) << "No MC collision for this collision, skip..."; continue; } - fillTrackQA(track); - - nTrack++; - // Do Proper Track Identification - trackIsPion = false; - trackIsKaon = false; - trackIsProton = false; - trackIsElectron = false; - trackIsDeuteron = false; - - trackIdTag = 0; - idMethodPi = -1; - idMethodKa = -1; - idMethodPr = -1; - idMethodEl = -1; - idMethodDe = -1; - - if (selPion(track, idMethodPi)) { - trackIsPion = true; - trackIdTag += 1; - } - if (selKaon(track, idMethodKa)) { - trackIsKaon = true; - trackIdTag += 2; - } - if (selProton(track, idMethodPr)) { - trackIsProton = true; - trackIdTag += 4; - } - if (selElectron(track, idMethodEl)) { - trackIsElectron = true; - trackIdTag += 8; - } - if (selDeuteron(track, idMethodDe)) { - trackIsDeuteron = true; - trackIdTag += 16; + nK0s = 0; + nPiPlus = 0; + nPiMinus = 0; + nKaPlus = 0; + nKaMinus = 0; + nProton = 0; + nPBar = 0; + nElPlus = 0; + nElMinus = 0; + nDePlus = 0; + nDeMinus = 0; + nTrack = 0; + nKaon = 0; + + centrality = collision.centFT0C(); + if (centAxisType == 1) { + centrality = collision.centFT0M(); + } else if (centAxisType == 2) { + centrality = collision.multFT0M(); + } else if (centAxisType == 3) { + centrality = collision.multFT0C(); } - if (trackIsPion) { - if (idMethodPi == 0) - fillIdentificationQA(recoAnalysis, track); - if (idMethodPi == 1) - fillIdentificationQA(recoAnalysis, track); - if (track.sign() > 0) { - nPiPlus++; - } - if (track.sign() < 0) { - nPiMinus++; + // group tracks, v0s manually + const uint64_t collIdx = collision.globalIndex(); + const auto tracksTablePerColl = tracks.sliceBy(tracksPerCollisionPreslice, collIdx); + const auto v0sTablePerColl = V0s.sliceBy(v0sPerCollisionPreslice, collIdx); + + for (const auto& v0 : v0sTablePerColl) { + const auto& posDaughterTrack = v0.template posTrack_as(); + const auto& negDaughterTrack = v0.template negTrack_as(); + + //__________________________Reco Level ____________________________________________________ + if (!v0.has_mcParticle() || !posDaughterTrack.has_mcParticle() || !negDaughterTrack.has_mcParticle()) { + continue; } - } - if (trackIsKaon) { - if (idMethodKa == 0) - fillIdentificationQA(recoAnalysis, track); - if (idMethodKa == 1) - fillIdentificationQA(recoAnalysis, track); - - if (track.sign() > 0) { - nKaPlus++; + + auto v0mcparticle = v0.mcParticle(); + if (!v0mcparticle.isPhysicalPrimary()) + continue; + + executeV0InCollisionloop(posDaughterTrack, negDaughterTrack, v0, + posPiIdMethod, posPrIdMethod, negPiIdMethod, negPrIdMethod, + v0Tag, isK0s, v0DauCollisionIndexTag, nK0s, centrality); + } // End of V0s Loop + + nTrack = 0; + nRejectedPiPlus = 0; + nRejectedPiMinus = 0; + for (const auto& track : tracksTablePerColl) { + if (!track.has_mcParticle()) { + LOG(warning) << "No MC Particle for this track, skip..."; + continue; } - if (track.sign() < 0) { - nKaMinus++; + + auto mcPart = track.mcParticle(); + if (!mcPart.isPhysicalPrimary()) { + continue; } - } - if (trackIsProton) { - if (idMethodPr == 0) - fillIdentificationQA(recoAnalysis, track); - if (idMethodPr == 1) - fillIdentificationQA(recoAnalysis, track); - - if (track.sign() > 0) { - nProton++; + + bool isAcceptedTrack = true; + executeTrackQAPart(track, fullDauList, rejectionTag, skippingPosition, nRejectedPiMinus, nRejectedPiPlus, nTrack, isAcceptedTrack); + if (!isAcceptedTrack) { + continue; } - if (track.sign() < 0) { - nPBar++; + + // Do Proper Track Identification + trackIsPion = false; + trackIsKaon = false; + trackIsProton = false; + trackIsElectron = false; + trackIsDeuteron = false; + + trackIdTag = 0; + idMethodPi = -1; + idMethodKa = -1; + idMethodPr = -1; + idMethodEl = -1; + idMethodDe = -1; + + if (selPion(track, idMethodPi)) { + trackIsPion = true; + BITSET(trackIdTag, ID_BIT_PI); } - } - if (trackIsElectron) { - if (idMethodEl == 0) - fillIdentificationQA(recoAnalysis, track); - if (idMethodEl == 1) - fillIdentificationQA(recoAnalysis, track); - - if (track.sign() > 0) { - nElPlus++; + if (selKaon(track, idMethodKa)) { + trackIsKaon = true; + BITSET(trackIdTag, ID_BIT_KA); } - if (track.sign() < 0) { - nElMinus++; + if (selProton(track, idMethodPr)) { + trackIsProton = true; + BITSET(trackIdTag, ID_BIT_PR); } - } - if (trackIsDeuteron) { - if (idMethodDe == 0) - fillIdentificationQA(recoAnalysis, track); - if (idMethodDe == 1) - fillIdentificationQA(recoAnalysis, track); - - if (track.sign() > 0) { - nDePlus++; + if (selElectron(track, idMethodEl)) { + trackIsElectron = true; + BITSET(trackIdTag, ID_BIT_EL); } - if (track.sign() < 0) { - nDeMinus++; + if (selDeuteron(track, idMethodDe)) { + trackIsDeuteron = true; + BITSET(trackIdTag, ID_BIT_DE); } - } - recoAnalysis.fill(HIST("recoAnalysis/SelectedTrack_IdentificationTag"), trackIdTag); - } // track loop ends - nKaon = nKaPlus + nKaMinus; + executeTrackAnalysisPart(track, trackIdTag, + idMethodPi, trackIsPion, nPiMinus, nPiPlus, + idMethodKa, trackIsKaon, nKaMinus, nKaPlus, + idMethodPr, trackIsProton, nProton, nPBar, + idMethodEl, trackIsElectron, nElPlus, nElMinus, + idMethodDe, trackIsDeuteron, nDePlus, nDeMinus); + } // track loop ends + + executeSparseAnalysisPart(centrality, nTrack, nK0s, + nRejectedPiPlus, nRejectedPiMinus, nKaon, + nPiPlus, nKaPlus, nProton, nElPlus, nDePlus, + nPiMinus, nKaMinus, nPBar, nElMinus, nDeMinus); + + executeEventInfoPart(collision, centrality, v0sTablePerColl.size(), tracksTablePerColl, + nTrack, nK0s, + nPiPlus, nKaPlus, nProton, nElPlus, nDePlus, + nPiMinus, nKaMinus, nPBar, nElMinus, nDeMinus); + } // collision loop ends + } + } // - recoAnalysis.fill(HIST("recoAnalysis/Sparse_Full_K0sPiKa"), - centFT0C, nTrack, nK0s, - nRejectedPiPlus, nRejectedPiMinus, - nPiPlus, nPiMinus, nKaPlus, nKaMinus); - recoAnalysis.fill(HIST("recoAnalysis/Sparse_Full_K0sPrDe"), - centFT0C, nTrack, nK0s, - nRejectedPiPlus, nRejectedPiMinus, - nProton, nPBar, nDePlus, nDeMinus); - recoAnalysis.fill(HIST("recoAnalysis/Sparse_Full_K0sKaEl"), - centFT0C, nTrack, nK0s, nRejectedPiPlus, nRejectedPiMinus, - nKaPlus, nKaMinus, nElPlus, nElMinus); - recoAnalysis.fill(HIST("recoAnalysis/Sparse_Full_PiKaPr"), - centFT0C, nTrack, - nRejectedPiPlus, nRejectedPiMinus, - nPiPlus, nPiMinus, nKaPlus, nKaMinus, nProton, nPBar); - recoAnalysis.fill(HIST("recoAnalysis/Sparse_Full_PiElDe"), - centFT0C, nTrack, - nRejectedPiPlus, nRejectedPiMinus, - nPiPlus, nPiMinus, nElPlus, nElMinus, nDePlus, nDeMinus); - recoAnalysis.fill(HIST("recoAnalysis/Sparse_Full_KaPrDe"), - centFT0C, nTrack, - nRejectedPiPlus, nRejectedPiMinus, - nKaPlus, nKaMinus, nProton, nPBar, nDePlus, nDeMinus); - recoAnalysis.fill(HIST("recoAnalysis/Sparse_Full_PrElDe"), - centFT0C, nTrack, - nRejectedPiPlus, nRejectedPiMinus, - nProton, nPBar, nElPlus, nElMinus, nDePlus, nDeMinus); + //____________________________________Process Funtion For Analysis Starts Here____________________________________// - recoAnalysis.fill(HIST("recoAnalysis/Sparse_newDynm_K0s_Ka"), - centFT0C, nTrack, nK0s, nKaon, - nK0s * nK0s, nKaon * nKaon, nK0s * nKaon); - recoAnalysis.fill(HIST("recoAnalysis/Sparse_newDynm_Kp_Km"), - centFT0C, nTrack, nKaPlus, nKaMinus, - nKaPlus * nKaPlus, nKaMinus * nKaMinus, nKaPlus * nKaMinus); + void processData(MyCollisions const& collisions, + MyV0s const& V0s, + MyTracks const& tracks) + { + executeAnalysis(collisions, V0s, tracks); - // Collisions QA - recoEvent.fill(HIST("recoEvent/h01_CollisionCount"), 0.5); - recoEvent.fill(HIST("recoEvent/h02_VertexXRec"), collision.posX()); - recoEvent.fill(HIST("recoEvent/h03_VertexYRec"), collision.posY()); - recoEvent.fill(HIST("recoEvent/h04_VertexZRec"), collision.posZ()); - recoEvent.fill(HIST("recoEvent/h05_Centrality"), collision.centFT0C()); - recoEvent.fill(HIST("recoEvent/h06_V0Size"), v0sTablePerColl.size()); - recoEvent.fill(HIST("recoEvent/h07_TracksSize"), tracksTablePerColl.size()); - recoEvent.fill(HIST("recoEvent/h08_nTrack"), nTrack); - recoEvent.fill(HIST("recoEvent/h09_nK0s"), nK0s); - recoEvent.fill(HIST("recoEvent/h10_nPiPlus"), nPiPlus); - recoEvent.fill(HIST("recoEvent/h11_nPiMinus"), nPiMinus); - recoEvent.fill(HIST("recoEvent/h12_nKaPlus"), nKaPlus); - recoEvent.fill(HIST("recoEvent/h13_nKaMinus"), nKaMinus); - recoEvent.fill(HIST("recoEvent/h14_nProton"), nProton); - recoEvent.fill(HIST("recoEvent/h15_nPBar"), nPBar); - recoEvent.fill(HIST("recoEvent/h16_nElPlus"), nElPlus); - recoEvent.fill(HIST("recoEvent/h17_nElMinus"), nElMinus); - recoEvent.fill(HIST("recoEvent/h18_nDePlus"), nDePlus); - recoEvent.fill(HIST("recoEvent/h19_nDeMinus"), nDeMinus); - } // collision loop ends } // Process Function Ends + PROCESS_SWITCH(KaonIsospinFluctuations, processData, "Process for Data", true); + + void processReco(MyCollisionsWithMcLabels const& collisions, MyV0sWithMcLabels const& V0s, MyTracksWithMcLabels const& tracks, aod::McParticles const&) + { + + executeAnalysis(collisions, V0s, tracks); + + } // Process function is over + PROCESS_SWITCH(KaonIsospinFluctuations, processReco, "Process for Reco", false); + + Preslice mcTracksPerMcCollisionPreslice = o2::aod::mcparticle::mcCollisionId; + + using MyMcCollisions = aod::McCollisions; + void processGen(MyMcCollisions const&, MyCollisionsWithMcLabels const& collisions, aod::McParticles const& mcParticles) + { + float centrality = -1; + for (const auto& collision : collisions) { + if (!collision.has_mcCollision()) { + continue; + } + centrality = -1; + const auto& mcColl = collision.mcCollision(); + + centrality = collision.centFT0C(); + if (centAxisType == 1) { + centrality = collision.centFT0M(); + } else if (centAxisType == 2) { + centrality = collision.multFT0M(); + } else if (centAxisType == 3) { + centrality = collision.multFT0C(); + } + + // group over mcParticles + const auto mcTracksTablePerMcColl = mcParticles.sliceBy(mcTracksPerMcCollisionPreslice, mcColl.globalIndex()); + + int nRejectedPiPlus = 0; + int nRejectedPiMinus = 0; + + int nK0s = 0; + int nPiPlus = 0; + int nPiMinus = 0; + int nKaPlus = 0; + int nKaMinus = 0; + int nProton = 0; + int nPBar = 0; + int nElPlus = 0; + int nElMinus = 0; + int nDePlus = 0; + int nDeMinus = 0; + int nTrack = 0; + int nKaon = 0; + + for (const auto& mcTrack : mcTracksTablePerMcColl) { + if (!mcTrack.isPhysicalPrimary()) { + continue; + } + + if (mcTrack.pdgCode() == 310 && + 0.1 < mcTrack.pt() && mcTrack.pt() < 1.5 && + std::abs(mcTrack.y()) < 0.5) { + nK0s++; + fillGenTrackQA(genAnalysis, mcTrack); + } + + if (mcTrack.pt() <= 0.15 || mcTrack.pt() >= 2.0 || std::abs(mcTrack.eta()) >= 0.8) { + continue; + } + + if (mcTrack.pdgCode() == 211) { + fillGenTrackQA(genAnalysis, mcTrack); + nPiPlus++; + } else if (mcTrack.pdgCode() == -211) { + fillGenTrackQA(genAnalysis, mcTrack); + nPiMinus++; + } else if (mcTrack.pdgCode() == 321) { + fillGenTrackQA(genAnalysis, mcTrack); + nKaPlus++; + } else if (mcTrack.pdgCode() == -321) { + fillGenTrackQA(genAnalysis, mcTrack); + nKaMinus++; + } else if (mcTrack.pdgCode() == 2212) { + fillGenTrackQA(genAnalysis, mcTrack); + nProton++; + } else if (mcTrack.pdgCode() == -2212) { + fillGenTrackQA(genAnalysis, mcTrack); + nPBar++; + } else if (mcTrack.pdgCode() == 11) { + fillGenTrackQA(genAnalysis, mcTrack); + nElPlus++; + } else if (mcTrack.pdgCode() == -11) { + fillGenTrackQA(genAnalysis, mcTrack); + nElMinus++; + } else if (mcTrack.pdgCode() == 1000010020) { + fillGenTrackQA(genAnalysis, mcTrack); + nDePlus++; + } else if (mcTrack.pdgCode() == -1000010020) { + fillGenTrackQA(genAnalysis, mcTrack); + nDeMinus++; + } + + nTrack++; + } // mcTrack loop is over + nKaon = nKaPlus + nKaMinus; + executeSparseAnalysisPart(centrality, nTrack, nK0s, + nRejectedPiPlus, nRejectedPiMinus, nKaon, + nPiPlus, nKaPlus, nProton, nElPlus, nDePlus, + nPiMinus, nKaMinus, nPBar, nElMinus, nDeMinus); + + executeEventInfoPart(mcColl, centrality, 0, mcTracksTablePerMcColl, + nTrack, nK0s, + nPiPlus, nKaPlus, nProton, nElPlus, nDePlus, + nPiMinus, nKaMinus, nPBar, nElMinus, nDeMinus); + } // collision loop is over + } + PROCESS_SWITCH(KaonIsospinFluctuations, processGen, "Process for Gen", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 9d7718c18dcd39ade09e6b997f7f650629b08c24 Mon Sep 17 00:00:00 2001 From: nzardosh Date: Sat, 1 Mar 2025 22:27:18 +0000 Subject: [PATCH 0494/1650] [PWGJE] Adding the ability to match subjets (#10267) --- PWGJE/Core/JetCandidateUtilities.h | 18 + PWGJE/Core/JetDQUtilities.h | 16 + PWGJE/Core/JetHFUtilities.h | 23 + PWGJE/Core/JetMatchingUtilities.h | 231 +++++++++- PWGJE/DataModel/Jet.h | 10 +- PWGJE/DataModel/JetSubstructure.h | 200 +++++++-- PWGJE/TableProducer/Matching/CMakeLists.txt | 1 + .../Duplicates/jetMatchingDuplicates.cxx | 4 +- .../Matching/Substructure/CMakeLists.txt | 75 ++++ .../Substructure/jetSubstructureMatching.cxx | 250 +++++++++++ .../jetSubstructureMatchingMCBplusCharged.cxx | 40 ++ .../jetSubstructureMatchingMCCharged.cxx | 40 ++ .../jetSubstructureMatchingMCD0Charged.cxx | 40 ++ ...ubstructureMatchingMCDielectronCharged.cxx | 40 ++ .../jetSubstructureMatchingMCDplusCharged.cxx | 40 ++ .../jetSubstructureMatchingMCLcCharged.cxx | 40 ++ .../jetSubstructureMatchingSub.cxx | 252 +++++++++++ ...jetSubstructureMatchingSubBplusCharged.cxx | 39 ++ .../jetSubstructureMatchingSubCharged.cxx | 39 ++ .../jetSubstructureMatchingSubD0Charged.cxx | 39 ++ ...bstructureMatchingSubDielectronCharged.cxx | 39 ++ ...jetSubstructureMatchingSubDplusCharged.cxx | 39 ++ .../jetSubstructureMatchingSubLcCharged.cxx | 39 ++ .../TableProducer/Matching/jetMatchingMC.cxx | 3 +- .../Matching/jetMatchingMCSub.cxx | 2 +- .../TableProducer/Matching/jetMatchingSub.cxx | 2 +- PWGJE/Tasks/jetSubstructure.cxx | 164 ++++++-- PWGJE/Tasks/jetSubstructureBplus.cxx | 3 +- PWGJE/Tasks/jetSubstructureBplusOutput.cxx | 3 +- PWGJE/Tasks/jetSubstructureD0.cxx | 3 +- PWGJE/Tasks/jetSubstructureD0Output.cxx | 3 +- PWGJE/Tasks/jetSubstructureDielectron.cxx | 3 +- .../Tasks/jetSubstructureDielectronOutput.cxx | 3 +- PWGJE/Tasks/jetSubstructureDplus.cxx | 3 +- PWGJE/Tasks/jetSubstructureDplusOutput.cxx | 3 +- PWGJE/Tasks/jetSubstructureHF.cxx | 227 ++++++++-- PWGJE/Tasks/jetSubstructureHFOutput.cxx | 396 +++++++++++++----- PWGJE/Tasks/jetSubstructureLc.cxx | 3 +- PWGJE/Tasks/jetSubstructureLcOutput.cxx | 3 +- PWGJE/Tasks/jetSubstructureOutput.cxx | 221 ++++++++-- 40 files changed, 2332 insertions(+), 267 deletions(-) create mode 100644 PWGJE/TableProducer/Matching/Substructure/CMakeLists.txt create mode 100644 PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatching.cxx create mode 100644 PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingMCBplusCharged.cxx create mode 100644 PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingMCCharged.cxx create mode 100644 PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingMCD0Charged.cxx create mode 100644 PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingMCDielectronCharged.cxx create mode 100644 PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingMCDplusCharged.cxx create mode 100644 PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingMCLcCharged.cxx create mode 100644 PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSub.cxx create mode 100644 PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSubBplusCharged.cxx create mode 100644 PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSubCharged.cxx create mode 100644 PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSubD0Charged.cxx create mode 100644 PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSubDielectronCharged.cxx create mode 100644 PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSubDplusCharged.cxx create mode 100644 PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSubLcCharged.cxx diff --git a/PWGJE/Core/JetCandidateUtilities.h b/PWGJE/Core/JetCandidateUtilities.h index 8c83d4da4cd..148e6b4567f 100644 --- a/PWGJE/Core/JetCandidateUtilities.h +++ b/PWGJE/Core/JetCandidateUtilities.h @@ -255,6 +255,24 @@ auto slicedPerCandidateCollision(T const& table, U const& candidates, V const& c } } +/** + * returns a slice of the table depending on the index of the candidate + * @param CandidateTable candidtae table type + * @param jet jet that the slice is based on + * @param table the table to be sliced + */ +template +auto slicedPerJet(T const& table, U const& jet, V const& perD0Jet, M const& perDplusJet, N const& perLcJet, O const& perBplusJet, P const& perDielectronJet) +{ + if constexpr (jethfutilities::isHFTable() || jethfutilities::isHFMcTable()) { + return jethfutilities::slicedPerHFJet(table, jet, perD0Jet, perDplusJet, perLcJet, perBplusJet); + } else if constexpr (jetdqutilities::isDielectronTable() || jetdqutilities::isDielectronMcTable()) { + return jetdqutilities::slicedPerDielectronJet(table, jet, perDielectronJet); + } else { + return table; + } +} + /** * returns the candidate collision Id of candidate based on type of candidate * diff --git a/PWGJE/Core/JetDQUtilities.h b/PWGJE/Core/JetDQUtilities.h index cc26582ca53..4282e00e37c 100644 --- a/PWGJE/Core/JetDQUtilities.h +++ b/PWGJE/Core/JetDQUtilities.h @@ -180,6 +180,22 @@ auto slicedPerDielectronCollision(T const& table, U const& /*candidates*/, V con } } +/** + * returns a slice of the table depending on the index of the Dielectron jet + * @param DielectronTable dielectron table type + * @param jet jet that the slice is based on + * @param table the table to be sliced + */ +template +auto slicedPerDielectronJet(T const& table, U const& jet, V const& perDielectronJet) +{ + if constexpr (isDielectronTable() || isDielectronMcTable()) { + return table.sliceBy(perDielectronJet, jet.globalIndex()); + } else { + return table; + } +} + /** * returns the Dielectron collision Id of candidate based on type of Dielectron candidate * diff --git a/PWGJE/Core/JetHFUtilities.h b/PWGJE/Core/JetHFUtilities.h index 509c1d22b5c..9c3892b538c 100644 --- a/PWGJE/Core/JetHFUtilities.h +++ b/PWGJE/Core/JetHFUtilities.h @@ -440,6 +440,29 @@ auto slicedPerHFCollision(T const& table, U const& /*candidates*/, V const& coll } } +/** + * returns a slice of the table depending on the index of the HF candidate + * + * @param HFTable HF table type + * @param jet jet that is being sliced based on + * @param table the table to be sliced + */ +template +auto slicedPerHFJet(T const& table, U const& jet, V const& perD0Jet, M const& perDplusJet, N const& perLcJet, O const& perBplusJet) +{ + if constexpr (isD0Table() || isD0McTable()) { + return table.sliceBy(perD0Jet, jet.globalIndex()); + } else if constexpr (isDplusTable() || isDplusMcTable()) { + return table.sliceBy(perDplusJet, jet.globalIndex()); + } else if constexpr (isLcTable() || isLcMcTable()) { + return table.sliceBy(perLcJet, jet.globalIndex()); + } else if constexpr (isBplusTable() || isBplusMcTable()) { + return table.sliceBy(perBplusJet, jet.globalIndex()); + } else { + return table; + } +} + /** * returns the HF collision Id of candidate based on type of HF candidate * diff --git a/PWGJE/Core/JetMatchingUtilities.h b/PWGJE/Core/JetMatchingUtilities.h index 3fb58d0128a..012efc1939d 100644 --- a/PWGJE/Core/JetMatchingUtilities.h +++ b/PWGJE/Core/JetMatchingUtilities.h @@ -40,6 +40,7 @@ #include "PWGJE/DataModel/EMCALClusters.h" #include "PWGJE/DataModel/Jet.h" #include "PWGJE/Core/JetCandidateUtilities.h" +#include "PWGJE/Core/JetFindingUtilities.h" namespace jetmatchingutilities { @@ -406,8 +407,8 @@ auto constexpr getConstituentId(T const& track) } } -template -float getPtSum(T const& tracksBase, U const& clustersBase, V const& tracksTag, O const& clustersTag) +template +float getPtSum(T const& tracksBase, U const& candidatesBase, V const& clustersBase, O const& tracksTag, P const& candidatesTag, Q const& clustersTag, R const& fullTracksBase, S const& fullTracksTag) { std::vector particleTracker; float ptSum = 0.; @@ -464,6 +465,47 @@ float getPtSum(T const& tracksBase, U const& clustersBase, V const& tracksTag, O } } } + if constexpr (isCandidate) { + if constexpr (jetsTagIsMc) { + for (auto const& candidateBase : candidatesBase) { + if (jetcandidateutilities::isMatchedCandidate(candidateBase)) { + const auto candidateBaseMcId = jetcandidateutilities::matchedParticleId(candidateBase, fullTracksBase, fullTracksTag); + for (auto const& candidateTag : candidatesTag) { + const auto candidateTagId = candidateTag.mcParticleId(); + if (candidateBaseMcId == candidateTagId) { + ptSum += candidateBase.pt(); + } + break; // should only be one + } + } + break; + } + } else if constexpr (jetsBaseIsMc) { + for (auto const& candidateTag : candidatesTag) { + if (jetcandidateutilities::isMatchedCandidate(candidateTag)) { + const auto candidateTagMcId = jetcandidateutilities::matchedParticleId(candidateTag, fullTracksTag, fullTracksBase); + for (auto const& candidateBase : candidatesBase) { + const auto candidateBaseId = candidateBase.mcParticleId(); + if (candidateTagMcId == candidateBaseId) { + ptSum += candidateTag.pt(); + } + break; // should only be one + } + } + break; + } + } else { + for (auto const& candidateBase : candidatesBase) { + for (auto const& candidateTag : candidatesTag) { + if (candidateBase.globalIndex() == candidateTag.globalIndex()) { + ptSum += candidateBase.pt(); + } + break; // should only be one + } + break; + } + } + } return ptSum; } @@ -472,30 +514,34 @@ auto getConstituents(T const& jet, U const& /*constituents*/) { if constexpr (jetfindingutilities::isEMCALClusterTable()) { return jet.template clusters_as(); - } else if constexpr (jetfindingutilities::isDummyTable()) { // this is for the case where EMCal clusters are tested but no clusters exist, like in the case of charged jet analyses + } else if constexpr (jetcandidateutilities::isCandidateTable() || jetcandidateutilities::isCandidateMcTable()) { + return jet.template candidates_as(); + } else if constexpr (jetfindingutilities::isDummyTable() || std::is_same_v || std::is_same_v) { // this is for the case where EMCal clusters or candidates are tested but no clusters or candidates exist and dummy tables are used, like in the case of charged jet analyses return nullptr; } else { return jet.template tracks_as(); } } -template -void MatchPt(T const& jetsBasePerCollision, U const& jetsTagPerCollision, std::vector>& baseToTagMatchingPt, std::vector>& tagToBaseMatchingPt, V const& tracksBase, M const& clustersBase, N const& tracksTag, O const& clustersTag, float minPtFraction) +template +void MatchPt(T const& jetsBasePerCollision, U const& jetsTagPerCollision, std::vector>& baseToTagMatchingPt, std::vector>& tagToBaseMatchingPt, V const& tracksBase, M const& candidatesBase, N const& clustersBase, O const& tracksTag, P const& candidatesTag, Q const& clustersTag, float minPtFraction) { float ptSumBase; float ptSumTag; for (const auto& jetBase : jetsBasePerCollision) { auto jetBaseTracks = getConstituents(jetBase, tracksBase); auto jetBaseClusters = getConstituents(jetBase, clustersBase); + auto jetBaseCandidates = getConstituents(jetBase, candidatesBase); for (const auto& jetTag : jetsTagPerCollision) { if (std::round(jetBase.r()) != std::round(jetTag.r())) { continue; } auto jetTagTracks = getConstituents(jetTag, tracksTag); auto jetTagClusters = getConstituents(jetTag, clustersTag); + auto jetTagCandidates = getConstituents(jetTag, candidatesTag); - ptSumBase = getPtSum < jetfindingutilities::isEMCALClusterTable() || jetfindingutilities::isEMCALClusterTable(), jetsBaseIsMc, jetsTagIsMc > (jetBaseTracks, jetBaseClusters, jetTagTracks, jetTagClusters); - ptSumTag = getPtSum < jetfindingutilities::isEMCALClusterTable() || jetfindingutilities::isEMCALClusterTable(), jetsTagIsMc, jetsBaseIsMc > (jetTagTracks, jetTagClusters, jetBaseTracks, jetBaseClusters); + ptSumBase = getPtSum < jetfindingutilities::isEMCALClusterTable() || jetfindingutilities::isEMCALClusterTable(), (jetcandidateutilities::isCandidateTable() || jetcandidateutilities::isCandidateMcTable()) && (jetcandidateutilities::isCandidateTable

() || jetcandidateutilities::isCandidateMcTable

()), jetsBaseIsMc, jetsTagIsMc > (jetBaseTracks, jetBaseCandidates, jetBaseClusters, jetTagTracks, jetTagCandidates, jetTagClusters, tracksBase, tracksTag); + ptSumTag = getPtSum < jetfindingutilities::isEMCALClusterTable() || jetfindingutilities::isEMCALClusterTable(), (jetcandidateutilities::isCandidateTable() || jetcandidateutilities::isCandidateMcTable()) && (jetcandidateutilities::isCandidateTable

() || jetcandidateutilities::isCandidateMcTable

()), jetsTagIsMc, jetsBaseIsMc > (jetTagTracks, jetTagCandidates, jetTagClusters, jetBaseTracks, jetBaseCandidates, jetBaseClusters, tracksTag, tracksBase); if (ptSumBase > jetBase.pt() * minPtFraction) { baseToTagMatchingPt[jetBase.globalIndex()].push_back(jetTag.globalIndex()); } @@ -508,7 +554,7 @@ void MatchPt(T const& jetsBasePerCollision, U const& jetsTagPerCollision, std::v // function that calls all the Match functions template -void doAllMatching(T const& jetsBasePerCollision, U const& jetsTagPerCollision, std::vector>& baseToTagMatchingGeo, std::vector>& baseToTagMatchingPt, std::vector>& baseToTagMatchingHF, std::vector>& tagToBaseMatchingGeo, std::vector>& tagToBaseMatchingPt, std::vector>& tagToBaseMatchingHF, V const& candidatesBase, M const& candidatesTag, N const& tracksBase, O const& clustersBase, P const& tracksTag, R const& clustersTag, bool doMatchingGeo, bool doMatchingHf, bool doMatchingPt, float maxMatchingDistance, float minPtFraction) +void doAllMatching(T const& jetsBasePerCollision, U const& jetsTagPerCollision, std::vector>& baseToTagMatchingGeo, std::vector>& baseToTagMatchingPt, std::vector>& baseToTagMatchingHF, std::vector>& tagToBaseMatchingGeo, std::vector>& tagToBaseMatchingPt, std::vector>& tagToBaseMatchingHF, V const& candidatesBase, M const& tracksBase, N const& clustersBase, O const& candidatesTag, P const& tracksTag, R const& clustersTag, bool doMatchingGeo, bool doMatchingHf, bool doMatchingPt, float maxMatchingDistance, float minPtFraction) { // geometric matching if (doMatchingGeo) { @@ -516,14 +562,179 @@ void doAllMatching(T const& jetsBasePerCollision, U const& jetsTagPerCollision, } // pt matching if (doMatchingPt) { - MatchPt(jetsBasePerCollision, jetsTagPerCollision, baseToTagMatchingPt, tagToBaseMatchingPt, tracksBase, clustersBase, tracksTag, clustersTag, minPtFraction); + MatchPt(jetsBasePerCollision, jetsTagPerCollision, baseToTagMatchingPt, tagToBaseMatchingPt, tracksBase, candidatesBase, clustersBase, tracksTag, candidatesTag, clustersTag, minPtFraction); } // HF matching - if constexpr (jetcandidateutilities::isCandidateTable()) { + if constexpr (jetcandidateutilities::isCandidateTable() || jetcandidateutilities::isCandidateMcTable()) { if (doMatchingHf) { MatchHF(jetsBasePerCollision, jetsTagPerCollision, baseToTagMatchingHF, tagToBaseMatchingHF, candidatesBase, candidatesTag, tracksBase, tracksTag); } } } + +// function that does pair matching +template +void doPairMatching(T const& pairsBase, U const& pairsTag, std::vector>& baseToTagMatching, std::vector>& tagToBaseMatching, V const& /*candidatesBase*/, M const& tracksBase, N const& /*candidatesTag*/, O const& tracksTag) +{ + bool hasTrackBase1 = false; + bool hasTrackBase2 = false; + bool hasCandidateBase1 = false; + bool hasCandidateBase2 = false; + std::vector pairsTagIndices; + for (auto i = 0; i < pairsTag.size(); i++) { + pairsTagIndices.push_back(i); + } + for (const auto& pairBase : pairsBase) { + if (pairBase.has_track1()) { + hasTrackBase1 = true; + } + if (pairBase.has_track2()) { + hasTrackBase2 = true; + } + if (pairBase.has_candidate1()) { + hasCandidateBase1 = true; + } + if (pairBase.has_candidate2()) { + hasCandidateBase2 = true; + } + int matchedPairTagIndex = -1; + for (auto pairTagIndex : pairsTagIndices) { + const auto& pairTag = pairsTag.iteratorAt(pairTagIndex); + if (hasTrackBase1 && !pairTag.has_track1()) { + continue; + } + if (hasTrackBase2 && !pairTag.has_track2()) { + continue; + } + if (hasCandidateBase1 && !pairTag.has_candidate1()) { + continue; + } + if (hasCandidateBase2 && !pairTag.has_candidate2()) { + continue; + } + int nMatched = 0; + bool isMatched = false; + if (hasTrackBase1) { + const auto& trackBase1 = pairBase.template track1_as(); + const auto& trackTag1 = pairTag.template track1_as(); + if constexpr (jetsTagIsMc) { + if (trackBase1.mcParticleId() == trackTag1.globalIndex()) { + nMatched++; + isMatched = true; + } + } else if constexpr (jetsBaseIsMc) { + if (trackBase1.globalIndex() == trackTag1.mcParticleId()) { + nMatched++; + isMatched = true; + } + } else { + if (trackBase1.globalIndex() == trackTag1.globalIndex()) { + nMatched++; + isMatched = true; + } + } + if (!isMatched) { + continue; + } + } + isMatched = false; + + if (hasTrackBase2) { + const auto& trackBase2 = pairBase.template track2_as(); + const auto& trackTag2 = pairTag.template track2_as(); + if constexpr (jetsTagIsMc) { + if (trackBase2.mcParticleId() == trackTag2.globalIndex()) { + nMatched++; + isMatched = true; + } + } else if constexpr (jetsBaseIsMc) { + if (trackBase2.globalIndex() == trackTag2.mcParticleId()) { + nMatched++; + isMatched = true; + } + } else { + if (trackBase2.globalIndex() == trackTag2.globalIndex()) { + nMatched++; + isMatched = true; + } + } + if (!isMatched) { + continue; + } + } + isMatched = false; + if (hasCandidateBase1) { + const auto& candidateBase1 = pairBase.template candidate1_as(); + const auto& candidateTag1 = pairTag.template candidate1_as(); + if constexpr (jetsTagIsMc) { + if (jetcandidateutilities::isMatchedCandidate(candidateBase1)) { + const auto candidateBaseMcId = jetcandidateutilities::matchedParticleId(candidateBase1, tracksBase, tracksTag); + if (candidateBaseMcId == candidateTag1.globalIndex()) { + nMatched++; + isMatched = true; + } + } + } else if constexpr (jetsBaseIsMc) { + if (jetcandidateutilities::isMatchedCandidate(candidateTag1)) { + const auto candidateTagMcId = jetcandidateutilities::matchedParticleId(candidateTag1, tracksTag, tracksBase); + if (candidateTagMcId == candidateBase1.globalIndex()) { + nMatched++; + isMatched = true; + } + } + } else { + if (candidateBase1.globalIndex() == candidateTag1.globalIndex()) { + nMatched++; + isMatched = true; + } + } + if (!isMatched) { + continue; + } + } + isMatched = false; + if (hasCandidateBase2) { + const auto& candidateBase2 = pairBase.template candidate2_as(); + const auto& candidateTag2 = pairTag.template candidate2_as(); + if constexpr (jetsTagIsMc) { + if (jetcandidateutilities::isMatchedCandidate(candidateBase2)) { + const auto candidateBaseMcId = jetcandidateutilities::matchedParticleId(candidateBase2, tracksBase, tracksTag); + if (candidateBaseMcId == candidateTag2.globalIndex()) { + nMatched++; + isMatched = true; + } + } + } else if constexpr (jetsBaseIsMc) { + if (jetcandidateutilities::isMatchedCandidate(candidateTag2)) { + const auto candidateTagMcId = jetcandidateutilities::matchedParticleId(candidateTag2, tracksTag, tracksBase); + if (candidateTagMcId == candidateBase2.globalIndex()) { + nMatched++; + isMatched = true; + } + } + } else { + if (candidateBase2.globalIndex() == candidateTag2.globalIndex()) { + nMatched++; + isMatched = true; + } + } + if (!isMatched) { + continue; + } + } + + if (nMatched == 2) { + baseToTagMatching[pairBase.globalIndex()].push_back(pairTag.globalIndex()); + tagToBaseMatching[pairTag.globalIndex()].push_back(pairBase.globalIndex()); + matchedPairTagIndex = pairTagIndex; + break; // can only be one match per jet + } + } + if (matchedPairTagIndex != -1) { + pairsTagIndices.erase(std::find(pairsTagIndices.begin(), pairsTagIndices.end(), matchedPairTagIndex)); + } + } +} + }; // namespace jetmatchingutilities #endif // PWGJE_CORE_JETMATCHINGUTILITIES_H_ diff --git a/PWGJE/DataModel/Jet.h b/PWGJE/DataModel/Jet.h index a623f25775b..8db401ffc48 100644 --- a/PWGJE/DataModel/Jet.h +++ b/PWGJE/DataModel/Jet.h @@ -152,14 +152,14 @@ DECLARE_SOA_DYNAMIC_COLUMN(P, p, //! absolute p DECLARE_JETMATCHING_TABLE(_jet_type_##MCParticleLevel, _jet_type_##MCDetectorLevel, _shortname_ "JETP2D") \ DECLARE_MCEVENTWEIGHT_TABLE(_jet_type_##MCDetectorLevel, _jet_type_##MCDetectorLevel, _shortname_ "DJETMW") \ DECLARE_MCEVENTWEIGHT_TABLE(_jet_type_##MCParticleLevel, _jet_type_##MCParticleLevel, _shortname_ "PETMPW") \ - DECLARE_JET_TABLES(JCollision, _jet_type_##EventWiseSubtracted, _subtracted_track_type_, _hfcand_type_, _shortname_ "JETEWS") \ + DECLARE_JET_TABLES(JCollision, _jet_type_##EventWiseSubtracted, _subtracted_track_type_, _hfcand_type_, _shortname_ "EWSJET") \ DECLARE_JETMATCHING_TABLE(_jet_type_, _jet_type_##EventWiseSubtracted, _shortname_ "JET2EWS") \ - DECLARE_JETMATCHING_TABLE(_jet_type_##EventWiseSubtracted, _jet_type_, _shortname_ "JETEWS2") \ - DECLARE_JET_TABLES(JCollision, _jet_type_##MCDetectorLevelEventWiseSubtracted, _subtracted_track_type_, _hfcand_type_, _shortname_ "DJETEWS") \ + DECLARE_JETMATCHING_TABLE(_jet_type_##EventWiseSubtracted, _jet_type_, _shortname_ "EWSJET2") \ + DECLARE_JET_TABLES(JCollision, _jet_type_##MCDetectorLevelEventWiseSubtracted, _subtracted_track_type_, _hfcand_type_, _shortname_ "DEWSJET") \ DECLARE_MCEVENTWEIGHT_TABLE(_jet_type_##MCDetectorLevelEventWiseSubtracted, _jet_type_##MCDetectorLevelEventWiseSubtracted, _shortname_ "DJETEWSW") \ DECLARE_JETMATCHING_TABLE(_jet_type_##MCDetectorLevel, _jet_type_##MCDetectorLevelEventWiseSubtracted, _shortname_ "DJET2DEWS") \ - DECLARE_JETMATCHING_TABLE(_jet_type_##MCDetectorLevelEventWiseSubtracted, _jet_type_##MCDetectorLevel, _shortname_ "JETDEWS2D") \ - DECLARE_JET_TABLES(JMcCollision, _jet_type_##MCParticleLevelEventWiseSubtracted, _subtracted_track_type_, _hfparticle_type_, _shortname_ "PJETEWS") + DECLARE_JETMATCHING_TABLE(_jet_type_##MCDetectorLevelEventWiseSubtracted, _jet_type_##MCDetectorLevel, _shortname_ "DEWSJET2D") \ + DECLARE_JET_TABLES(JMcCollision, _jet_type_##MCParticleLevelEventWiseSubtracted, _subtracted_track_type_, _hfparticle_type_, _shortname_ "PEWSJET") #define STRINGIFY(x) #x diff --git a/PWGJE/DataModel/JetSubstructure.h b/PWGJE/DataModel/JetSubstructure.h index 660ef03cb47..f459c9592f4 100644 --- a/PWGJE/DataModel/JetSubstructure.h +++ b/PWGJE/DataModel/JetSubstructure.h @@ -23,6 +23,7 @@ #include "PWGJE/DataModel/EMCALClusters.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGJE/DataModel/Jet.h" +#include "PWGJE/DataModel/JetReducedData.h" namespace o2::aod { @@ -44,13 +45,101 @@ DECLARE_SOA_COLUMN(Theta, theta, std::vector); //! DECLARE_SOA_COLUMN(NSub2DR, nSub2DR, float); //! DECLARE_SOA_COLUMN(NSub1, nSub1, float); //! DECLARE_SOA_COLUMN(NSub2, nSub2, float); //! -DECLARE_SOA_COLUMN(PairPt, pairPt, std::vector); //! -DECLARE_SOA_COLUMN(PairEnergy, pairEnergy, std::vector); //! -DECLARE_SOA_COLUMN(PairTheta, pairTheta, std::vector); //! +DECLARE_SOA_COLUMN(PairJetPt, pairJetPt, std::vector); //! +DECLARE_SOA_COLUMN(PairJetEnergy, pairJetEnergy, std::vector); //! +DECLARE_SOA_COLUMN(PairJetTheta, pairJetTheta, std::vector); //! +DECLARE_SOA_COLUMN(PairJetPerpCone1Pt, pairJetPerpCone1Pt, std::vector); //! +DECLARE_SOA_COLUMN(PairJetPerpCone1Energy, pairJetPerpCone1Energy, std::vector); //! +DECLARE_SOA_COLUMN(PairJetPerpCone1Theta, pairJetPerpCone1Theta, std::vector); //! +DECLARE_SOA_COLUMN(PairPerpCone1PerpCone1Pt, pairPerpCone1PerpCone1Pt, std::vector); //! +DECLARE_SOA_COLUMN(PairPerpCone1PerpCone1Energy, pairPerpCone1PerpCone1Energy, std::vector); //! +DECLARE_SOA_COLUMN(PairPerpCone1PerpCone1Theta, pairPerpCone1PerpCone1Theta, std::vector); //! +DECLARE_SOA_COLUMN(PairPerpCone1PerpCone2Pt, pairPerpCone1PerpCone2Pt, std::vector); //! +DECLARE_SOA_COLUMN(PairPerpCone1PerpCone2Energy, pairPerpCone1PerpCone2Energy, std::vector); //! +DECLARE_SOA_COLUMN(PairPerpCone1PerpCone2Theta, pairPerpCone1PerpCone2Theta, std::vector); //! DECLARE_SOA_COLUMN(Angularity, angularity, float); //! DECLARE_SOA_COLUMN(PtLeadingConstituent, ptLeadingConstituent, float); //! +DECLARE_SOA_COLUMN(PerpConeRho, perpConeRho, float); //! +DECLARE_SOA_COLUMN(SplittingMatchingGeo, splittingMatchingGeo, std::vector); //! +DECLARE_SOA_COLUMN(SplittingMatchingPt, splittingMatchingPt, std::vector); //! +DECLARE_SOA_COLUMN(SplittingMatchingHF, splittingMatchingHF, std::vector); //! +DECLARE_SOA_COLUMN(PairMatching, pairMatching, std::vector); //! } // namespace jetsubstructure +namespace splitting +{ //! +DECLARE_SOA_COLUMN(Pt, pt, float); //! +DECLARE_SOA_COLUMN(Eta, eta, float); //! +DECLARE_SOA_COLUMN(Phi, phi, float); //! +DECLARE_SOA_COLUMN(R, r, int); //! +DECLARE_SOA_COLUMN(SplittingMatchingGeo, splittingMatchingGeo, std::vector); //! +DECLARE_SOA_COLUMN(SplittingMatchingPt, splittingMatchingPt, std::vector); //! +DECLARE_SOA_COLUMN(SplittingMatchingHF, splittingMatchingHF, std::vector); //! +} // namespace splitting + +// Defines the jet table definition +#define JETSPLITTING_TABLE_DEF(_jet_type_, _jet_description_, _name_, _track_type_, _cand_type_) \ + \ + namespace _name_##splitting \ + { \ + DECLARE_SOA_INDEX_COLUMN(_jet_type_##Jet, jet); \ + } \ + namespace _name_##splittingconstituents \ + { \ + DECLARE_SOA_ARRAY_INDEX_COLUMN_FULL(Tracks, tracks, int32_t, _track_type_, "_tracks"); \ + DECLARE_SOA_ARRAY_INDEX_COLUMN_FULL(Clusters, clusters, int32_t, JClusters, "_clusters"); \ + DECLARE_SOA_ARRAY_INDEX_COLUMN_FULL(Candidates, candidates, int32_t, _cand_type_, "_cand"); \ + } \ + DECLARE_SOA_TABLE(_jet_type_##SPs, "AOD", _jet_description_ "SP", \ + o2::soa::Index<>, \ + _name_##splitting::_jet_type_##JetId, \ + _name_##splittingconstituents::TracksIds, \ + _name_##splittingconstituents::ClustersIds, \ + _name_##splittingconstituents::CandidatesIds, \ + splitting::Pt, \ + splitting::Eta, \ + splitting::Phi, \ + splitting::R); + +#define JETSPLITTINGMATCHING_TABLE_DEF(_jet_type_base_, _jet_type_tag_, _description_) \ + \ + DECLARE_SOA_TABLE(_jet_type_base_##SPsMatchedTo##_jet_type_tag_##SPs, "AOD", _description_ "SP", \ + splitting::SplittingMatchingGeo, \ + splitting::SplittingMatchingPt, \ + splitting::SplittingMatchingHF); + +namespace pair +{ //! +DECLARE_SOA_COLUMN(PairMatching, pairMatching, std::vector); //! +} // namespace pair + +// Defines the jet table definition +#define JETPAIR_TABLE_DEF(_jet_type_, _jet_description_, _name_, _track_type_, _cand_type_) \ + \ + namespace _name_##pair \ + { \ + DECLARE_SOA_INDEX_COLUMN(_jet_type_##Jet, jet); \ + } \ + namespace _name_##pairconstituents \ + { \ + DECLARE_SOA_INDEX_COLUMN_FULL(Track1, track1, int32_t, _track_type_, "_track1"); \ + DECLARE_SOA_INDEX_COLUMN_FULL(Track2, track2, int32_t, _track_type_, "_track2"); \ + DECLARE_SOA_INDEX_COLUMN_FULL(Candidate1, candidate1, int32_t, _cand_type_, "_cand1"); \ + DECLARE_SOA_INDEX_COLUMN_FULL(Candidate2, candidate2, int32_t, _cand_type_, "_cand2"); \ + } \ + DECLARE_SOA_TABLE(_jet_type_##PRs, "AOD", _jet_description_ "PR", \ + o2::soa::Index<>, \ + _name_##pair::_jet_type_##JetId, \ + _name_##pairconstituents::Track1Id, \ + _name_##pairconstituents::Track2Id, \ + _name_##pairconstituents::Candidate1Id, \ + _name_##pairconstituents::Candidate2Id); + +#define JETPAIRMATCHING_TABLE_DEF(_jet_type_base_, _jet_type_tag_, _description_) \ + \ + DECLARE_SOA_TABLE(_jet_type_base_##PRsMatchedTo##_jet_type_tag_##PRs, "AOD", _description_ "PR", \ + pair::PairMatching); + namespace jetoutput { DECLARE_SOA_COLUMN(JetPt, jetPt, float); //! @@ -58,37 +147,40 @@ DECLARE_SOA_COLUMN(JetPhi, jetPhi, float); //! DECLARE_SOA_COLUMN(JetEta, jetEta, float); //! DECLARE_SOA_COLUMN(JetY, jetY, float); //! DECLARE_SOA_COLUMN(JetR, jetR, float); //! +DECLARE_SOA_COLUMN(JetArea, jetArea, float); //! +DECLARE_SOA_COLUMN(JetRho, jetRho, float); //! +DECLARE_SOA_COLUMN(JetPerpConeRho, jetPerpConeRho, float); //! DECLARE_SOA_COLUMN(JetNConstituents, jetNConstituents, int); //! } // namespace jetoutput // Defines the jet substrcuture table definition -#define JETSUBSTRUCTURE_TABLE_DEF(_jet_type_, _jet_description_, _name_, _cand_type_, _cand_description_) \ - \ - namespace _name_##collisionoutput \ - { \ - DECLARE_SOA_DYNAMIC_COLUMN(Dummy##_jet_type_, dummy##_jet_type_, []() -> int { return 0; }); \ - } \ - \ - DECLARE_SOA_TABLE(_jet_type_##COs, "AOD", _jet_description_ "CO", jetcollision::PosZ, jetcollision::Centrality, jetcollision::EventSel, jetcollision::EventWeight, _name_##collisionoutput::Dummy##_jet_type_<>); \ - using _jet_type_##CO = _jet_type_##COs::iterator; \ - \ - namespace _name_##jetoutput \ - { \ - DECLARE_SOA_INDEX_COLUMN_CUSTOM(_jet_type_##CO, collision, _jet_description_ "COS"); \ - DECLARE_SOA_INDEX_COLUMN_FULL_CUSTOM(Candidate, candidate, int, _cand_type_, _cand_description_ "S", "_0"); \ - } \ - DECLARE_SOA_TABLE(_jet_type_##Os, "AOD", _jet_description_ "O", _name_##jetoutput::_jet_type_##COId, _name_##jetoutput::CandidateId, jetoutput::JetPt, jetoutput::JetPhi, jetoutput::JetEta, jetoutput::JetY, jetoutput::JetR, jetoutput::JetNConstituents); \ - using _jet_type_##O = _jet_type_##Os::iterator; \ - namespace _name_##substructure \ - { \ - DECLARE_SOA_INDEX_COLUMN_CUSTOM(_jet_type_##O, outputTable, _jet_description_ "OS"); \ - DECLARE_SOA_DYNAMIC_COLUMN(Dummy##_jet_type_, dummy##_jet_type_, []() -> int { return 0; }); \ - } \ - \ - DECLARE_SOA_TABLE(_jet_type_##SSs, "AOD", _jet_description_ "SS", jetsubstructure::EnergyMother, jetsubstructure::PtLeading, jetsubstructure::PtSubLeading, jetsubstructure::Theta, jetsubstructure::NSub2DR, jetsubstructure::NSub1, jetsubstructure::NSub2, jetsubstructure::PairPt, jetsubstructure::PairEnergy, jetsubstructure::PairTheta, jetsubstructure::Angularity, jetsubstructure::PtLeadingConstituent, _name_##substructure::Dummy##_jet_type_<>); \ - DECLARE_SOA_TABLE(_jet_type_##SSOs, "AOD", _jet_description_ "SSO", _name_##substructure::_jet_type_##OId, jetsubstructure::EnergyMother, jetsubstructure::PtLeading, jetsubstructure::PtSubLeading, jetsubstructure::Theta, jetsubstructure::NSub2DR, jetsubstructure::NSub1, jetsubstructure::NSub2, jetsubstructure::PairPt, jetsubstructure::PairEnergy, jetsubstructure::PairTheta, jetsubstructure::Angularity, jetsubstructure::PtLeadingConstituent); \ - \ - using _jet_type_##O = _jet_type_##Os::iterator; \ +#define JETSUBSTRUCTURE_TABLE_DEF(_jet_type_, _jet_description_, _name_, _cand_type_, _cand_description_) \ + \ + namespace _name_##collisionoutput \ + { \ + DECLARE_SOA_DYNAMIC_COLUMN(Dummy##_jet_type_, dummy##_jet_type_, []() -> int { return 0; }); \ + } \ + \ + DECLARE_SOA_TABLE(_jet_type_##COs, "AOD", _jet_description_ "CO", jetcollision::PosZ, jetcollision::Centrality, jetcollision::EventSel, jetcollision::EventWeight, _name_##collisionoutput::Dummy##_jet_type_<>); \ + using _jet_type_##CO = _jet_type_##COs::iterator; \ + \ + namespace _name_##jetoutput \ + { \ + DECLARE_SOA_INDEX_COLUMN_CUSTOM(_jet_type_##CO, collision, _jet_description_ "COS"); \ + DECLARE_SOA_INDEX_COLUMN_FULL_CUSTOM(Candidate, candidate, int, _cand_type_, _cand_description_ "S", "_0"); \ + } \ + DECLARE_SOA_TABLE(_jet_type_##Os, "AOD", _jet_description_ "O", _name_##jetoutput::_jet_type_##COId, _name_##jetoutput::CandidateId, jetoutput::JetPt, jetoutput::JetPhi, jetoutput::JetEta, jetoutput::JetY, jetoutput::JetR, jetoutput::JetArea, jetoutput::JetRho, jetoutput::JetPerpConeRho, jetoutput::JetNConstituents); \ + using _jet_type_##O = _jet_type_##Os::iterator; \ + namespace _name_##substructure \ + { \ + DECLARE_SOA_INDEX_COLUMN_CUSTOM(_jet_type_##O, outputTable, _jet_description_ "OS"); \ + DECLARE_SOA_DYNAMIC_COLUMN(Dummy##_jet_type_, dummy##_jet_type_, []() -> int { return 0; }); \ + } \ + \ + DECLARE_SOA_TABLE(_jet_type_##SSs, "AOD", _jet_description_ "SS", jetsubstructure::EnergyMother, jetsubstructure::PtLeading, jetsubstructure::PtSubLeading, jetsubstructure::Theta, jetsubstructure::NSub2DR, jetsubstructure::NSub1, jetsubstructure::NSub2, jetsubstructure::PairJetPt, jetsubstructure::PairJetEnergy, jetsubstructure::PairJetTheta, jetsubstructure::PairJetPerpCone1Pt, jetsubstructure::PairJetPerpCone1Energy, jetsubstructure::PairJetPerpCone1Theta, jetsubstructure::PairPerpCone1PerpCone1Pt, jetsubstructure::PairPerpCone1PerpCone1Energy, jetsubstructure::PairPerpCone1PerpCone1Theta, jetsubstructure::PairPerpCone1PerpCone2Pt, jetsubstructure::PairPerpCone1PerpCone2Energy, jetsubstructure::PairPerpCone1PerpCone2Theta, jetsubstructure::Angularity, jetsubstructure::PtLeadingConstituent, jetsubstructure::PerpConeRho, _name_##substructure::Dummy##_jet_type_<>); \ + DECLARE_SOA_TABLE(_jet_type_##SSOs, "AOD", _jet_description_ "SSO", _name_##substructure::_jet_type_##OId, jetsubstructure::EnergyMother, jetsubstructure::PtLeading, jetsubstructure::PtSubLeading, jetsubstructure::Theta, jetsubstructure::NSub2DR, jetsubstructure::NSub1, jetsubstructure::NSub2, jetsubstructure::PairJetPt, jetsubstructure::PairJetEnergy, jetsubstructure::PairJetTheta, jetsubstructure::PairJetPerpCone1Pt, jetsubstructure::PairJetPerpCone1Energy, jetsubstructure::PairJetPerpCone1Theta, jetsubstructure::PairPerpCone1PerpCone1Pt, jetsubstructure::PairPerpCone1PerpCone1Energy, jetsubstructure::PairPerpCone1PerpCone1Theta, jetsubstructure::PairPerpCone1PerpCone2Pt, jetsubstructure::PairPerpCone1PerpCone2Energy, jetsubstructure::PairPerpCone1PerpCone2Theta, jetsubstructure::Angularity, jetsubstructure::PtLeadingConstituent, jetsubstructure::SplittingMatchingGeo, jetsubstructure::SplittingMatchingPt, jetsubstructure::SplittingMatchingHF, jetsubstructure::PairMatching); \ + \ + using _jet_type_##O = _jet_type_##Os::iterator; \ using _jet_type_##SSO = _jet_type_##SSOs::iterator; // define the mathcing table definition @@ -110,22 +202,38 @@ DECLARE_SOA_COLUMN(JetNConstituents, jetNConstituents, int); //! DECLARE_SOA_TABLE(_jet_type_##MOs, "AOD", _description_ "MO", _name_##substructure::_jet_type_##OId, _name_##geomatched::_matched_jet_type_##Ids, _name_##ptmatched::_matched_jet_type_##Ids, _name_##candmatched::_matched_jet_type_##Ids); \ using _jet_type_##MO = _jet_type_##MOs::iterator; -#define JETSUBSTRUCTURE_TABLES_DEF(_jet_type_, _jet_description_, _cand_type_data_, _cand_description_data_, _cand_type_ewsdata_, _cand_description_ewsdata_, _cand_type_mcd_, _cand_description_mcd_, _hfparticle_type_, _hfparticle_description_) \ - JETSUBSTRUCTURE_TABLE_DEF(_jet_type_##Jet, _jet_description_ "JET", _jet_type_##jet, _cand_type_data_, _cand_description_data_) \ - JETSUBSTRUCTURE_TABLE_DEF(_jet_type_##EWSJet, _jet_description_ "EWSJET", _jet_type_##ewsjet, _cand_type_ewsdata_, _cand_description_ewsdata_) \ - JETMATCHING_TABLE_DEF(_jet_type_##Jet, _jet_type_##EWSJet, _jet_description_ "EWSJET", _jet_type_##jet, _jet_description_ "JET") \ - JETMATCHING_TABLE_DEF(_jet_type_##EWSJet, _jet_type_##Jet, _jet_description_ "JET", _jet_type_##ewsjet, _jet_description_ "EWSJET") \ - JETSUBSTRUCTURE_TABLE_DEF(_jet_type_##MCDJet, _jet_description_ "MCDJET", _jet_type_##mcdjet, _cand_type_mcd_, _cand_description_mcd_) \ - JETSUBSTRUCTURE_TABLE_DEF(_jet_type_##MCPJet, _jet_description_ "MCPJET", _jet_type_##mcpjet, _hfparticle_type_, _hfparticle_description_) \ - JETMATCHING_TABLE_DEF(_jet_type_##MCDJet, _jet_type_##MCPJet, _jet_description_ "MCPJET", _jet_type_##mcdjet, _jet_description_ "MCDJET") \ - JETMATCHING_TABLE_DEF(_jet_type_##MCPJet, _jet_type_##MCDJet, _jet_description_ "MCDJET", _jet_type_##mcpjet, _jet_description_ "MCPJET") - -JETSUBSTRUCTURE_TABLES_DEF(C, "C", CJetCOs, "CJETCO", CEWSJetCOs, "CEWSJETCO", CMCDJetCOs, "CMCDJETCO", CMCPJetCOs, "CMCPJETCO"); -JETSUBSTRUCTURE_TABLES_DEF(D0C, "D0C", HfD0Bases, "HFD0BASE", HfD0Bases, "HFD0BASE", HfD0Bases, "HFD0BASE", HfD0PBases, "HFD0PBASE"); -JETSUBSTRUCTURE_TABLES_DEF(DplusC, "DPC", HfDplusBases, "HFDPBASE", HfDplusBases, "HFDPBASE", HfDplusBases, "HFDPBASE", HfDplusPBases, "HFDPPBASE"); -JETSUBSTRUCTURE_TABLES_DEF(LcC, "LCC", HfLcBases, "HFLCBASE", HfLcBases, "HFLCBASE", HfLcBases, "HFLCBASE", HfLcPBases, "HFLCPBASE"); -JETSUBSTRUCTURE_TABLES_DEF(BplusC, "BPC", HfBplusBases, "HFBPBASE", HfBplusBases, "HFBPBASE", HfBplusBases, "HFBPBASE", HfBplusPBases, "HFBPPBASE"); -JETSUBSTRUCTURE_TABLES_DEF(DielectronC, "DIELC", Dielectrons, "RTDIELECTRON", Dielectrons, "RTDIELECTRON", Dielectrons, "RTDIELECTRON", JDielectronMcs, "JDIELMC"); +#define JETSUBSTRUCTURE_TABLES_DEF(_jet_type_, _jet_description_, _jet_type_full_, _jet_full_description_, _track_type_data_, _cand_type_data_, _cand_description_data_, _track_type_ewsdata_, _cand_type_ewsdata_, _cand_description_ewsdata_, _track_type_mcd_, _cand_type_mcd_, _cand_description_mcd_, _particle_type_, _hfparticle_type_, _hfparticle_description_) \ + JETSUBSTRUCTURE_TABLE_DEF(_jet_type_##Jet, _jet_description_ "JET", _jet_type_##jet, _cand_type_data_, _cand_description_data_) \ + JETSUBSTRUCTURE_TABLE_DEF(_jet_type_##EWSJet, _jet_description_ "EWSJET", _jet_type_##ewsjet, _cand_type_ewsdata_, _cand_description_ewsdata_) \ + JETMATCHING_TABLE_DEF(_jet_type_##Jet, _jet_type_##EWSJet, _jet_description_ "EWSJET", _jet_type_##jet, _jet_description_ "JET") \ + JETMATCHING_TABLE_DEF(_jet_type_##EWSJet, _jet_type_##Jet, _jet_description_ "JET", _jet_type_##ewsjet, _jet_description_ "EWSJET") \ + JETSPLITTING_TABLE_DEF(_jet_type_full_, _jet_description_, _jet_full_description_, _track_type_data_, _cand_type_data_) \ + JETSPLITTING_TABLE_DEF(_jet_type_full_##EventWiseSubtracted, _jet_description_ "EWS", _jet_full_description_##eventwisesubtracted, _cand_type_ewsdata_, _cand_type_ewsdata_) \ + JETSPLITTINGMATCHING_TABLE_DEF(_jet_type_full_, _jet_type_full_##EventWiseSubtracted, _jet_description_ "SP2EWS") \ + JETSPLITTINGMATCHING_TABLE_DEF(_jet_type_full_##EventWiseSubtracted, _jet_type_full_, _jet_description_ "EWSSP2") \ + JETPAIR_TABLE_DEF(_jet_type_full_, _jet_description_, _jet_full_description_, _track_type_data_, _cand_type_data_) \ + JETPAIR_TABLE_DEF(_jet_type_full_##EventWiseSubtracted, _jet_description_ "EWS", _jet_full_description_##eventwisesubtracted, _cand_type_ewsdata_, _cand_type_ewsdata_) \ + JETPAIRMATCHING_TABLE_DEF(_jet_type_full_, _jet_type_full_##EventWiseSubtracted, _jet_description_ "SP2EWS") \ + JETPAIRMATCHING_TABLE_DEF(_jet_type_full_##EventWiseSubtracted, _jet_type_full_, _jet_description_ "EWSSP2") \ + JETSUBSTRUCTURE_TABLE_DEF(_jet_type_##MCDJet, _jet_description_ "MCDJET", _jet_type_##mcdjet, _cand_type_mcd_, _cand_description_mcd_) \ + JETSUBSTRUCTURE_TABLE_DEF(_jet_type_##MCPJet, _jet_description_ "MCPJET", _jet_type_##mcpjet, _hfparticle_type_, _hfparticle_description_) \ + JETMATCHING_TABLE_DEF(_jet_type_##MCDJet, _jet_type_##MCPJet, _jet_description_ "MCPJET", _jet_type_##mcdjet, _jet_description_ "MCDJET") \ + JETMATCHING_TABLE_DEF(_jet_type_##MCPJet, _jet_type_##MCDJet, _jet_description_ "MCDJET", _jet_type_##mcpjet, _jet_description_ "MCPJET") \ + JETSPLITTING_TABLE_DEF(_jet_type_full_##MCDetectorLevel, _jet_description_ "D", _jet_full_description_##mcdetectorlevel, _track_type_mcd_, _cand_type_mcd_) \ + JETSPLITTING_TABLE_DEF(_jet_type_full_##MCParticleLevel, _jet_description_ "P", _jet_full_description_##mcparticlelevel, _particle_type_, _hfparticle_type_) \ + JETSPLITTINGMATCHING_TABLE_DEF(_jet_type_full_##MCDetectorLevel, _jet_type_full_##MCParticleLevel, _jet_description_ "DSP2P") \ + JETSPLITTINGMATCHING_TABLE_DEF(_jet_type_full_##MCParticleLevel, _jet_type_full_##MCDetectorLevel, _jet_description_ "PSP2D") \ + JETPAIR_TABLE_DEF(_jet_type_full_##MCDetectorLevel, _jet_description_ "D", _jet_full_description_##mcdetectorlevel, _track_type_mcd_, _cand_type_mcd_) \ + JETPAIR_TABLE_DEF(_jet_type_full_##MCParticleLevel, _jet_description_ "P", _jet_full_description_##mcparticlelevel, _particle_type_, _hfparticle_type_) \ + JETPAIRMATCHING_TABLE_DEF(_jet_type_full_##MCDetectorLevel, _jet_type_full_##MCParticleLevel, _jet_description_ "DSP2P") \ + JETPAIRMATCHING_TABLE_DEF(_jet_type_full_##MCParticleLevel, _jet_type_full_##MCDetectorLevel, _jet_description_ "PSP2D") + +JETSUBSTRUCTURE_TABLES_DEF(C, "C", Charged, charged, JTracks, CJetCOs, "CJETCO", JTrackSubs, CEWSJetCOs, "CEWSJETCO", JTracks, CMCDJetCOs, "CMCDJETCO", JMcParticles, CMCPJetCOs, "CMCPJETCO"); +JETSUBSTRUCTURE_TABLES_DEF(D0C, "D0C", D0Charged, d0charged, JTracks, HfD0Bases, "HFD0BASE", JTrackD0Subs, HfD0Bases, "HFD0BASE", JTracks, HfD0Bases, "HFD0BASE", JMcParticles, HfD0PBases, "HFD0PBASE"); +JETSUBSTRUCTURE_TABLES_DEF(DplusC, "DPC", DplusCharged, dpluscharged, JTracks, HfDplusBases, "HFDPBASE", JTrackDplusSubs, HfDplusBases, "HFDPBASE", JTracks, HfDplusBases, "HFDPBASE", JMcParticles, HfDplusPBases, "HFDPPBASE"); +JETSUBSTRUCTURE_TABLES_DEF(LcC, "LCC", LcCharged, lccharged, JTracks, HfLcBases, "HFLCBASE", JTrackLcSubs, HfLcBases, "HFLCBASE", JTracks, HfLcBases, "HFLCBASE", JMcParticles, HfLcPBases, "HFLCPBASE"); +JETSUBSTRUCTURE_TABLES_DEF(BplusC, "BPC", BplusCharged, bpluscharged, JTracks, HfBplusBases, "HFBPBASE", JTrackBplusSubs, HfBplusBases, "HFBPBASE", JTracks, HfBplusBases, "HFBPBASE", JMcParticles, HfBplusPBases, "HFBPPBASE"); +JETSUBSTRUCTURE_TABLES_DEF(DielectronC, "DIELC", DielectronCharged, dielectroncharged, JTracks, Dielectrons, "RTDIELECTRON", JTrackDielectronSubs, Dielectrons, "RTDIELECTRON", JTracks, Dielectrons, "RTDIELECTRON", JMcParticles, JDielectronMcs, "JDIELMC"); } // namespace o2::aod diff --git a/PWGJE/TableProducer/Matching/CMakeLists.txt b/PWGJE/TableProducer/Matching/CMakeLists.txt index 9c904afcdd1..beab5a4fdd6 100644 --- a/PWGJE/TableProducer/Matching/CMakeLists.txt +++ b/PWGJE/TableProducer/Matching/CMakeLists.txt @@ -10,6 +10,7 @@ # or submit itself to any jurisdiction. add_subdirectory(Duplicates) +add_subdirectory(Substructure) if(FastJet_FOUND) diff --git a/PWGJE/TableProducer/Matching/Duplicates/jetMatchingDuplicates.cxx b/PWGJE/TableProducer/Matching/Duplicates/jetMatchingDuplicates.cxx index bc4711efae3..1155c169f55 100644 --- a/PWGJE/TableProducer/Matching/Duplicates/jetMatchingDuplicates.cxx +++ b/PWGJE/TableProducer/Matching/Duplicates/jetMatchingDuplicates.cxx @@ -13,6 +13,8 @@ /// \brief matching duplicate jets /// \author Nima Zardoshti +#include + #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "Framework/ASoA.h" @@ -74,7 +76,7 @@ struct JetMatchingDuplicates { const auto jetsBasePerColl = jetsBase.sliceBy(baseJetsPerCollision, collision.globalIndex()); const auto jetsTagPerColl = jetsTag.sliceBy(tagJetsPerCollision, collision.globalIndex()); // initialise template parameters as false since even if they are Mc we are not matching between detector and particle level - jetmatchingutilities::doAllMatching(jetsBasePerColl, jetsTagPerColl, jetsBasetoTagMatchingGeo, jetsBasetoTagMatchingPt, jetsBasetoTagMatchingHF, jetsTagtoBaseMatchingGeo, jetsTagtoBaseMatchingPt, jetsTagtoBaseMatchingHF, candidates, candidates, tracks, tracks, tracks, tracks, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction); + jetmatchingutilities::doAllMatching(jetsBasePerColl, jetsTagPerColl, jetsBasetoTagMatchingGeo, jetsBasetoTagMatchingPt, jetsBasetoTagMatchingHF, jetsTagtoBaseMatchingGeo, jetsTagtoBaseMatchingPt, jetsTagtoBaseMatchingHF, candidates, tracks, tracks, candidates, tracks, tracks, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction); } for (auto i = 0; i < jetsBase.size(); ++i) { diff --git a/PWGJE/TableProducer/Matching/Substructure/CMakeLists.txt b/PWGJE/TableProducer/Matching/Substructure/CMakeLists.txt new file mode 100644 index 00000000000..c507c8995ef --- /dev/null +++ b/PWGJE/TableProducer/Matching/Substructure/CMakeLists.txt @@ -0,0 +1,75 @@ +# Copyright 2019-2020 CERN and copyright holders of ALICE O2. +# See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +# All rights not expressly granted are reserved. +# +# This software is distributed under the terms of the GNU General Public +# License v3 (GPL Version 3), copied verbatim in the file "COPYING". +# +# In applying this license CERN does not waive the privileges and immunities +# granted to it by virtue of its status as an Intergovernmental Organization +# or submit itself to any jurisdiction. + + +if(FastJet_FOUND) + +o2physics_add_dpl_workflow(jet-substructure-matching-mc-ch + SOURCES jetSubstructureMatchingMCCharged.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2::FrameworkPhysicsSupport + COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(jet-substructure-matching-mc-d0-ch + SOURCES jetSubstructureMatchingMCD0Charged.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2::FrameworkPhysicsSupport + COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(jet-substructure-matching-mc-dplus-ch + SOURCES jetSubstructureMatchingMCDplusCharged.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2::FrameworkPhysicsSupport + COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(jet-substructure-matching-mc-lc-ch + SOURCES jetSubstructureMatchingMCLcCharged.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2::FrameworkPhysicsSupport + COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(jet-substructure-matching-mc-bplus-ch + SOURCES jetSubstructureMatchingMCBplusCharged.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2::FrameworkPhysicsSupport + COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(jet-substructure-matching-mc-dielectron-ch + SOURCES jetSubstructureMatchingMCDielectronCharged.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2::FrameworkPhysicsSupport + COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(jet-substructure-matching-sub-ch + SOURCES jetSubstructureMatchingSubCharged.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2::FrameworkPhysicsSupport + COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(jet-substructure-matching-sub-d0-ch + SOURCES jetSubstructureMatchingSubD0Charged.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2::FrameworkPhysicsSupport + COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(jet-substructure-matching-sub-dplus-ch + SOURCES jetSubstructureMatchingSubDplusCharged.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2::FrameworkPhysicsSupport + COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(jet-substructure-matching-sub-lc-ch + SOURCES jetSubstructureMatchingSubLcCharged.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2::FrameworkPhysicsSupport + COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(jet-substructure-matching-sub-bplus-ch + SOURCES jetSubstructureMatchingSubBplusCharged.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2::FrameworkPhysicsSupport + COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(jet-substructure-matching-sub-dielectron-ch + SOURCES jetSubstructureMatchingSubDielectronCharged.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2::FrameworkPhysicsSupport + COMPONENT_NAME Analysis) + +endif() diff --git a/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatching.cxx b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatching.cxx new file mode 100644 index 00000000000..1fee274e703 --- /dev/null +++ b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatching.cxx @@ -0,0 +1,250 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// jet analysis tasks (subscribing to jet finder task) +// +/// \author Nima Zardoshti +// + +#include + +#include "fastjet/PseudoJet.hh" +#include "fastjet/ClusterSequenceArea.hh" + +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/ASoA.h" +#include "Framework/O2DatabasePDGPlugin.h" +#include "Framework/HistogramRegistry.h" + +#include "Common/Core/TrackSelection.h" +#include "Common/Core/TrackSelectionDefaults.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/TrackSelectionTables.h" + +#include "PWGJE/DataModel/Jet.h" +#include "PWGJE/DataModel/JetSubstructure.h" +#include "PWGJE/Core/JetFinder.h" +#include "PWGJE/Core/FastJetUtilities.h" +#include "PWGJE/Core/JetUtilities.h" +#include "PWGJE/Core/JetSubstructureUtilities.h" +#include "PWGJE/Core/JetMatchingUtilities.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +#include "Framework/runDataProcessing.h" + +template +struct JetSubstructureMatching { + + Produces splittingsBasetoTagMatchingTable; + Produces splittingsTagtoBaseMatchingTable; + + Produces pairsBasetoTagMatchingTable; + Produces pairsTagtoBaseMatchingTable; + + Configurable doMatchingGeo{"doMatchingGeo", true, "Enable geometric matching"}; + Configurable doMatchingPt{"doMatchingPt", true, "Enable pt matching"}; + Configurable doMatchingHf{"doMatchingHf", false, "Enable HF matching"}; + Configurable maxMatchingDistance{"maxMatchingDistance", 0.24f, "Max matching distance"}; + Configurable minPtFraction{"minPtFraction", 0.5f, "Minimum pt fraction for pt matching"}; + Configurable requirePtMatchedJets{"requirePtMatchedJets", false, "require jets are pT matched as well"}; + Configurable requireHFMatchedJets{"requireHFMatchedJets", false, "require jets are HF matched as well"}; + + static constexpr bool jetsBaseIsMc = o2::soa::relatedByIndex(); + static constexpr bool jetsTagIsMc = o2::soa::relatedByIndex(); + + void init(InitContext const&) + { + } + + PresliceOptional BaseSplittingsPerBaseJetInclusive = aod::chargedmcdetectorlevelsplitting::jetId; + PresliceOptional TagSplittingsPerTagJetInclusive = aod::chargedmcparticlelevelsplitting::jetId; + PresliceOptional BaseSplittingsPerBaseJetD0 = aod::d0chargedmcdetectorlevelsplitting::jetId; + PresliceOptional TagSplittingsPerTagJetD0 = aod::d0chargedmcparticlelevelsplitting::jetId; + PresliceOptional BaseSplittingsPerBaseJetDplus = aod::dpluschargedmcdetectorlevelsplitting::jetId; + PresliceOptional TagSplittingsPerTagJetDplus = aod::dpluschargedmcparticlelevelsplitting::jetId; + PresliceOptional BaseSplittingsPerBaseJetLc = aod::lcchargedmcdetectorlevelsplitting::jetId; + PresliceOptional TagSplittingsPerTagJetLc = aod::lcchargedmcparticlelevelsplitting::jetId; + PresliceOptional BaseSplittingsPerBaseJetBplus = aod::bpluschargedmcdetectorlevelsplitting::jetId; + PresliceOptional TagSplittingsPerTagJetBplus = aod::bpluschargedmcparticlelevelsplitting::jetId; + PresliceOptional BaseSplittingsPerBaseJetDielectron = aod::dielectronchargedmcdetectorlevelsplitting::jetId; + PresliceOptional TagSplittingsPerTagJetDielectron = aod::dielectronchargedmcparticlelevelsplitting::jetId; + + PresliceOptional BasePairsPerBaseJetInclusive = aod::chargedmcdetectorlevelpair::jetId; + PresliceOptional TagPairsPerTagJetInclusive = aod::chargedmcparticlelevelpair::jetId; + PresliceOptional BasePairsPerBaseJetD0 = aod::d0chargedmcdetectorlevelpair::jetId; + PresliceOptional TagPairsPerTagJetD0 = aod::d0chargedmcparticlelevelpair::jetId; + PresliceOptional BasePairsPerBaseJetDplus = aod::dpluschargedmcdetectorlevelpair::jetId; + PresliceOptional TagPairsPerTagJetDplus = aod::dpluschargedmcparticlelevelpair::jetId; + PresliceOptional BasePairsPerBaseJetLc = aod::lcchargedmcdetectorlevelpair::jetId; + PresliceOptional TagPairsPerTagJetLc = aod::lcchargedmcparticlelevelpair::jetId; + PresliceOptional BasePairsPerBaseJetBplus = aod::bpluschargedmcdetectorlevelpair::jetId; + PresliceOptional TagPairsPerTagJetBplus = aod::bpluschargedmcparticlelevelpair::jetId; + PresliceOptional BasePairsPerBaseJetDielectron = aod::dielectronchargedmcdetectorlevelpair::jetId; + PresliceOptional TagPairsPerTagJetDielectron = aod::dielectronchargedmcparticlelevelpair::jetId; + + // workaround till binding nodes can be passed as template arguments + template + auto slicedPerJetForMatching(T const& table, U const& jet, V const& perIncluisveJet, M const& perD0Jet, N const& perDplusJet, O const& perLcJet, P const& perBplusJet, Q const& perDielectronJet) + { + if constexpr (jethfutilities::isHFTable() || jethfutilities::isHFMcTable()) { + return jethfutilities::slicedPerHFJet(table, jet, perD0Jet, perDplusJet, perLcJet, perBplusJet); + } else if constexpr (jetdqutilities::isDielectronTable() || jetdqutilities::isDielectronMcTable()) { + return jetdqutilities::slicedPerDielectronJet(table, jet, perDielectronJet); + } else { + return table.sliceBy(perIncluisveJet, jet.globalIndex()); + } + } + + void processData(JetsTag const& jetsTag, + JetsBase const&, + SplittingsBase const& jetsBaseSplittings, + SplittingsTag const& jetsTagSplittings, + PairsBase const& jetsBasePairs, + PairsTag const& jetsTagPairs, + CandidatesBase const& candidatesBase, + CandidatesTag const& candidatesTag, + ClustersBase const& clustersBase, + TracksBase const& tracksBase, TracksTag const& tracksTag) + { + std::vector> jetsBasetoTagSplittingsMatchingGeo, jetsBasetoTagSplittingsMatchingPt, jetsBasetoTagSplittingsMatchingHF; + jetsBasetoTagSplittingsMatchingGeo.assign(jetsBaseSplittings.size(), {}); + jetsBasetoTagSplittingsMatchingPt.assign(jetsBaseSplittings.size(), {}); + jetsBasetoTagSplittingsMatchingHF.assign(jetsBaseSplittings.size(), {}); + + std::vector> jetsTagtoBaseSplittingsMatchingGeo, jetsTagtoBaseSplittingsMatchingPt, jetsTagtoBaseSplittingsMatchingHF; + jetsTagtoBaseSplittingsMatchingGeo.assign(jetsTagSplittings.size(), {}); + jetsTagtoBaseSplittingsMatchingPt.assign(jetsTagSplittings.size(), {}); + jetsTagtoBaseSplittingsMatchingHF.assign(jetsTagSplittings.size(), {}); + + std::vector jetTagSplittingsMap; + std::vector jetBaseSplittingsMap; + jetTagSplittingsMap.resize(jetsTagSplittings.size(), -1); + jetBaseSplittingsMap.resize(jetsBaseSplittings.size(), -1); + + std::vector> jetsBasetoTagPairsMatching; + std::vector> jetsTagtoBasePairsMatching; + jetsBasetoTagPairsMatching.assign(jetsBasePairs.size(), {}); + jetsTagtoBasePairsMatching.assign(jetsTagPairs.size(), {}); + + std::vector jetTagPairsMap; + std::vector jetBasePairsMap; + jetTagPairsMap.resize(jetsTagPairs.size(), -1); + jetBasePairsMap.resize(jetsBasePairs.size(), -1); + + for (auto jetTag : jetsTag) { + if (jetTag.has_matchedJetGeo()) { + // auto const& jetTagSplittings = jetsTagSplittings.sliceBy(TagSplittingsPerTagJet, jetTag.globalIndex()); + auto const& jetTagSplittings = slicedPerJetForMatching(jetsTagSplittings, jetTag, TagSplittingsPerTagJetInclusive, TagSplittingsPerTagJetD0, TagSplittingsPerTagJetDplus, TagSplittingsPerTagJetLc, TagSplittingsPerTagJetBplus, TagSplittingsPerTagJetDielectron); + int tagSplittingIndex = 0; + for (auto const& jetTagSplitting : jetTagSplittings) { + jetTagSplittingsMap[jetTagSplitting.globalIndex()] = tagSplittingIndex; + tagSplittingIndex++; + } + // auto const& jetTagPairs = jetsTagPairs.sliceBy(TagPairsPerTagJet, jetTag.globalIndex()); + auto const& jetTagPairs = slicedPerJetForMatching(jetsTagPairs, jetTag, TagPairsPerTagJetInclusive, TagPairsPerTagJetD0, TagPairsPerTagJetDplus, TagPairsPerTagJetLc, TagPairsPerTagJetBplus, TagPairsPerTagJetDielectron); + int tagPairIndex = 0; + for (auto const& jetTagPair : jetTagPairs) { + jetTagPairsMap[jetTagPair.globalIndex()] = tagPairIndex; + tagPairIndex++; + } + for (auto& jetBase : jetTag.template matchedJetGeo_as()) { + if (requirePtMatchedJets) { + bool jetsMatchedWithPt = false; + for (auto& jetBaseForMatchPt : jetTag.template matchedJetPt_as()) { + if (jetBaseForMatchPt.globalIndex() == jetBase.globalIndex()) { + jetsMatchedWithPt = true; + } + } + if (!jetsMatchedWithPt) { + continue; + } + } + if (requireHFMatchedJets) { + bool jetsMatchedWithHF = false; + for (auto& jetBaseForMatchHF : jetTag.template matchedJetCand_as()) { + if (jetBaseForMatchHF.globalIndex() == jetBase.globalIndex()) { + jetsMatchedWithHF = true; + } + } + if (!jetsMatchedWithHF) { + continue; + } + } + // auto const& jetBaseSplittings = jetsBaseSplittings.sliceBy(BaseSplittingsPerBaseJet, jetBase.globalIndex()); + auto const& jetBaseSplittings = slicedPerJetForMatching(jetsBaseSplittings, jetBase, BaseSplittingsPerBaseJetInclusive, BaseSplittingsPerBaseJetD0, BaseSplittingsPerBaseJetDplus, BaseSplittingsPerBaseJetLc, BaseSplittingsPerBaseJetBplus, BaseSplittingsPerBaseJetDielectron); + int baseSplittingIndex = 0; + for (auto const& jetBaseSplitting : jetBaseSplittings) { + jetBaseSplittingsMap[jetBaseSplitting.globalIndex()] = baseSplittingIndex; + baseSplittingIndex++; + } + jetmatchingutilities::doAllMatching(jetBaseSplittings, jetTagSplittings, jetsBasetoTagSplittingsMatchingGeo, jetsBasetoTagSplittingsMatchingPt, jetsBasetoTagSplittingsMatchingHF, jetsTagtoBaseSplittingsMatchingGeo, jetsTagtoBaseSplittingsMatchingPt, jetsTagtoBaseSplittingsMatchingHF, candidatesBase, tracksBase, clustersBase, candidatesTag, tracksTag, tracksTag, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction); + // auto const& jetBasePairs = jetsBasePairs.sliceBy(BasePairsPerBaseJet, jetBase.globalIndex()); + auto const& jetBasePairs = slicedPerJetForMatching(jetsBasePairs, jetBase, BasePairsPerBaseJetInclusive, BasePairsPerBaseJetD0, BasePairsPerBaseJetDplus, BasePairsPerBaseJetLc, BasePairsPerBaseJetBplus, BasePairsPerBaseJetDielectron); + int basePairIndex = 0; + for (auto const& jetBasePair : jetBasePairs) { + jetBasePairsMap[jetBasePair.globalIndex()] = basePairIndex; + basePairIndex++; + } + jetmatchingutilities::doPairMatching(jetBasePairs, jetTagPairs, jetsBasetoTagPairsMatching, jetsTagtoBasePairsMatching, candidatesBase, tracksBase, candidatesTag, tracksTag); + } + } + } + for (auto jetsTagSplitting : jetsTagSplittings) { + std::vector tagToBaseMatchingGeoIndex; + std::vector tagToBaseMatchingPtIndex; + std::vector tagToBaseMatchingHFIndex; + for (auto jetBaseSplittingIndex : jetsTagtoBaseSplittingsMatchingGeo[jetsTagSplitting.globalIndex()]) { + tagToBaseMatchingGeoIndex.push_back(jetBaseSplittingsMap[jetBaseSplittingIndex]); + } + for (auto jetBaseSplittingIndex : jetsTagtoBaseSplittingsMatchingPt[jetsTagSplitting.globalIndex()]) { + tagToBaseMatchingPtIndex.push_back(jetBaseSplittingsMap[jetBaseSplittingIndex]); + } + for (auto jetBaseSplittingIndex : jetsTagtoBaseSplittingsMatchingHF[jetsTagSplitting.globalIndex()]) { + tagToBaseMatchingHFIndex.push_back(jetBaseSplittingsMap[jetBaseSplittingIndex]); + } + splittingsTagtoBaseMatchingTable(tagToBaseMatchingGeoIndex, tagToBaseMatchingPtIndex, tagToBaseMatchingHFIndex); + } + for (auto jetsBaseSplitting : jetsBaseSplittings) { + std::vector baseToTagMatchingGeoIndex; + std::vector baseToTagMatchingPtIndex; + std::vector baseToTagMatchingHFIndex; + for (auto jetTagSplittingIndex : jetsBasetoTagSplittingsMatchingGeo[jetsBaseSplitting.globalIndex()]) { + baseToTagMatchingGeoIndex.push_back(jetTagSplittingsMap[jetTagSplittingIndex]); + } + for (auto jetTagSplittingIndex : jetsBasetoTagSplittingsMatchingPt[jetsBaseSplitting.globalIndex()]) { + baseToTagMatchingPtIndex.push_back(jetTagSplittingsMap[jetTagSplittingIndex]); + } + for (auto jetTagSplittingIndex : jetsBasetoTagSplittingsMatchingHF[jetsBaseSplitting.globalIndex()]) { + baseToTagMatchingHFIndex.push_back(jetTagSplittingsMap[jetTagSplittingIndex]); + } + splittingsBasetoTagMatchingTable(baseToTagMatchingGeoIndex, baseToTagMatchingPtIndex, baseToTagMatchingHFIndex); + } + for (auto jetsTagPair : jetsTagPairs) { + std::vector tagToBaseMatchingIndex; + for (auto jetBasePairIndex : jetsTagtoBasePairsMatching[jetsTagPair.globalIndex()]) { + tagToBaseMatchingIndex.push_back(jetBasePairsMap[jetBasePairIndex]); + } + pairsTagtoBaseMatchingTable(tagToBaseMatchingIndex); + } + for (auto jetsBasePair : jetsBasePairs) { + std::vector baseToTagMatchingIndex; + for (auto jetTagPairIndex : jetsBasetoTagPairsMatching[jetsBasePair.globalIndex()]) { + baseToTagMatchingIndex.push_back(jetTagPairsMap[jetTagPairIndex]); + } + pairsBasetoTagMatchingTable(baseToTagMatchingIndex); + } + } + PROCESS_SWITCH(JetSubstructureMatching, processData, "charged jet substructure", true); +}; diff --git a/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingMCBplusCharged.cxx b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingMCBplusCharged.cxx new file mode 100644 index 00000000000..06e1fe45729 --- /dev/null +++ b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingMCBplusCharged.cxx @@ -0,0 +1,40 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// Bplus substructure matching mc charged task +// +/// \author Nima Zardoshti + +#include +#include "PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatching.cxx" + +using BplusChargedJetSubstructureMatchingMC = JetSubstructureMatching, + soa::Join, + aod::BplusChargedMCDetectorLevelSPsMatchedToBplusChargedMCParticleLevelSPs, + aod::BplusChargedMCParticleLevelSPsMatchedToBplusChargedMCDetectorLevelSPs, + aod::BplusChargedMCDetectorLevelPRsMatchedToBplusChargedMCParticleLevelPRs, + aod::BplusChargedMCParticleLevelPRsMatchedToBplusChargedMCDetectorLevelPRs, + aod::BplusChargedMCDetectorLevelSPs, + aod::BplusChargedMCParticleLevelSPs, + aod::BplusChargedMCDetectorLevelPRs, + aod::BplusChargedMCParticleLevelPRs, + aod::CandidatesBplusMCD, + aod::CandidatesBplusMCP, + aod::JetTracksMCD, + aod::JetParticles, + aod::JDummys>; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + std::vector tasks; + tasks.emplace_back(adaptAnalysisTask(cfgc, TaskName{"jet-substructure-matching-mc-bplus-ch"})); + return WorkflowSpec{tasks}; +} diff --git a/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingMCCharged.cxx b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingMCCharged.cxx new file mode 100644 index 00000000000..42df0f0bb10 --- /dev/null +++ b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingMCCharged.cxx @@ -0,0 +1,40 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// substructure matching mc charged task +// +/// \author Nima Zardoshti + +#include +#include "PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatching.cxx" + +using ChargedJetSubstructureMatchingMC = JetSubstructureMatching, + soa::Join, + aod::ChargedMCDetectorLevelSPsMatchedToChargedMCParticleLevelSPs, + aod::ChargedMCParticleLevelSPsMatchedToChargedMCDetectorLevelSPs, + aod::ChargedMCDetectorLevelPRsMatchedToChargedMCParticleLevelPRs, + aod::ChargedMCParticleLevelPRsMatchedToChargedMCDetectorLevelPRs, + aod::ChargedMCDetectorLevelSPs, + aod::ChargedMCParticleLevelSPs, + aod::ChargedMCDetectorLevelPRs, + aod::ChargedMCParticleLevelPRs, + aod::JCollisions, + aod::JMcCollisions, + aod::JetTracksMCD, + aod::JetParticles, + aod::JDummys>; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + std::vector tasks; + tasks.emplace_back(adaptAnalysisTask(cfgc, TaskName{"jet-substructure-matching-mc-ch"})); + return WorkflowSpec{tasks}; +} diff --git a/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingMCD0Charged.cxx b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingMCD0Charged.cxx new file mode 100644 index 00000000000..1781ed34392 --- /dev/null +++ b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingMCD0Charged.cxx @@ -0,0 +1,40 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// D0 substructure matching mc charged task +// +/// \author Nima Zardoshti + +#include +#include "PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatching.cxx" + +using D0ChargedJetSubstructureMatchingMC = JetSubstructureMatching, + soa::Join, + aod::D0ChargedMCDetectorLevelSPsMatchedToD0ChargedMCParticleLevelSPs, + aod::D0ChargedMCParticleLevelSPsMatchedToD0ChargedMCDetectorLevelSPs, + aod::D0ChargedMCDetectorLevelPRsMatchedToD0ChargedMCParticleLevelPRs, + aod::D0ChargedMCParticleLevelPRsMatchedToD0ChargedMCDetectorLevelPRs, + aod::D0ChargedMCDetectorLevelSPs, + aod::D0ChargedMCParticleLevelSPs, + aod::D0ChargedMCDetectorLevelPRs, + aod::D0ChargedMCParticleLevelPRs, + aod::CandidatesD0MCD, + aod::CandidatesD0MCP, + aod::JetTracksMCD, + aod::JetParticles, + aod::JDummys>; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + std::vector tasks; + tasks.emplace_back(adaptAnalysisTask(cfgc, TaskName{"jet-substructure-matching-mc-d0-ch"})); + return WorkflowSpec{tasks}; +} diff --git a/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingMCDielectronCharged.cxx b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingMCDielectronCharged.cxx new file mode 100644 index 00000000000..f063d263478 --- /dev/null +++ b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingMCDielectronCharged.cxx @@ -0,0 +1,40 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// Dielectron substructure matching mc charged task +// +/// \author Nima Zardoshti + +#include +#include "PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatching.cxx" + +using DielectronChargedJetSubstructureMatchingMC = JetSubstructureMatching, + soa::Join, + aod::DielectronChargedMCDetectorLevelSPsMatchedToDielectronChargedMCParticleLevelSPs, + aod::DielectronChargedMCParticleLevelSPsMatchedToDielectronChargedMCDetectorLevelSPs, + aod::DielectronChargedMCDetectorLevelPRsMatchedToDielectronChargedMCParticleLevelPRs, + aod::DielectronChargedMCParticleLevelPRsMatchedToDielectronChargedMCDetectorLevelPRs, + aod::DielectronChargedMCDetectorLevelSPs, + aod::DielectronChargedMCParticleLevelSPs, + aod::DielectronChargedMCDetectorLevelPRs, + aod::DielectronChargedMCParticleLevelPRs, + aod::CandidatesDielectronMCD, + aod::CandidatesDielectronMCP, + aod::JetTracksMCD, + aod::JetParticles, + aod::JDummys>; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + std::vector tasks; + tasks.emplace_back(adaptAnalysisTask(cfgc, TaskName{"jet-substructure-matching-mc-dielectron-ch"})); + return WorkflowSpec{tasks}; +} diff --git a/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingMCDplusCharged.cxx b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingMCDplusCharged.cxx new file mode 100644 index 00000000000..34f4f145f13 --- /dev/null +++ b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingMCDplusCharged.cxx @@ -0,0 +1,40 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// Dplus substructure matching mc charged task +// +/// \author Nima Zardoshti + +#include +#include "PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatching.cxx" + +using DplusChargedJetSubstructureMatchingMC = JetSubstructureMatching, + soa::Join, + aod::DplusChargedMCDetectorLevelSPsMatchedToDplusChargedMCParticleLevelSPs, + aod::DplusChargedMCParticleLevelSPsMatchedToDplusChargedMCDetectorLevelSPs, + aod::DplusChargedMCDetectorLevelPRsMatchedToDplusChargedMCParticleLevelPRs, + aod::DplusChargedMCParticleLevelPRsMatchedToDplusChargedMCDetectorLevelPRs, + aod::DplusChargedMCDetectorLevelSPs, + aod::DplusChargedMCParticleLevelSPs, + aod::DplusChargedMCDetectorLevelPRs, + aod::DplusChargedMCParticleLevelPRs, + aod::CandidatesDplusMCD, + aod::CandidatesDplusMCP, + aod::JetTracksMCD, + aod::JetParticles, + aod::JDummys>; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + std::vector tasks; + tasks.emplace_back(adaptAnalysisTask(cfgc, TaskName{"jet-substructure-matching-mc-dplus-ch"})); + return WorkflowSpec{tasks}; +} diff --git a/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingMCLcCharged.cxx b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingMCLcCharged.cxx new file mode 100644 index 00000000000..b5b5bb302a5 --- /dev/null +++ b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingMCLcCharged.cxx @@ -0,0 +1,40 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// Lc substructure matching mc charged task +// +/// \author Nima Zardoshti + +#include +#include "PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatching.cxx" + +using LcChargedJetSubstructureMatchingMC = JetSubstructureMatching, + soa::Join, + aod::LcChargedMCDetectorLevelSPsMatchedToLcChargedMCParticleLevelSPs, + aod::LcChargedMCParticleLevelSPsMatchedToLcChargedMCDetectorLevelSPs, + aod::LcChargedMCDetectorLevelPRsMatchedToLcChargedMCParticleLevelPRs, + aod::LcChargedMCParticleLevelPRsMatchedToLcChargedMCDetectorLevelPRs, + aod::LcChargedMCDetectorLevelSPs, + aod::LcChargedMCParticleLevelSPs, + aod::LcChargedMCDetectorLevelPRs, + aod::LcChargedMCParticleLevelPRs, + aod::CandidatesLcMCD, + aod::CandidatesLcMCP, + aod::JetTracksMCD, + aod::JetParticles, + aod::JDummys>; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + std::vector tasks; + tasks.emplace_back(adaptAnalysisTask(cfgc, TaskName{"jet-substructure-matching-mc-lc-ch"})); + return WorkflowSpec{tasks}; +} diff --git a/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSub.cxx b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSub.cxx new file mode 100644 index 00000000000..456e546ceb9 --- /dev/null +++ b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSub.cxx @@ -0,0 +1,252 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// jet analysis tasks (subscribing to jet finder task) +// this file should be removed once we can pass coloumns as templates!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +// +/// \author Nima Zardoshti +// + +#include + +#include "fastjet/PseudoJet.hh" +#include "fastjet/ClusterSequenceArea.hh" + +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/ASoA.h" +#include "Framework/O2DatabasePDGPlugin.h" +#include "Framework/HistogramRegistry.h" + +#include "Common/Core/TrackSelection.h" +#include "Common/Core/TrackSelectionDefaults.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/TrackSelectionTables.h" + +#include "PWGJE/DataModel/Jet.h" +#include "PWGJE/DataModel/JetSubstructure.h" +#include "PWGJE/Core/JetFinder.h" +#include "PWGJE/Core/FastJetUtilities.h" +#include "PWGJE/Core/JetUtilities.h" +#include "PWGJE/Core/JetSubstructureUtilities.h" +#include "PWGJE/Core/JetMatchingUtilities.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +#include "Framework/runDataProcessing.h" + +template +struct JetSubstructureMatchingSub { + + Produces splittingsBasetoTagMatchingTable; + Produces splittingsTagtoBaseMatchingTable; + + Produces pairsBasetoTagMatchingTable; + Produces pairsTagtoBaseMatchingTable; + + Configurable doMatchingGeo{"doMatchingGeo", true, "Enable geometric matching"}; + Configurable doMatchingPt{"doMatchingPt", true, "Enable pt matching"}; + Configurable doMatchingHf{"doMatchingHf", false, "Enable HF matching"}; + Configurable maxMatchingDistance{"maxMatchingDistance", 0.24f, "Max matching distance"}; + Configurable minPtFraction{"minPtFraction", 0.5f, "Minimum pt fraction for pt matching"}; + Configurable requirePtMatchedJets{"requirePtMatchedJets", false, "require jets are pT matched as well"}; + Configurable requireHFMatchedJets{"requireHFMatchedJets", false, "require jets are HF matched as well"}; + + static constexpr bool jetsBaseIsMc = o2::soa::relatedByIndex(); + static constexpr bool jetsTagIsMc = o2::soa::relatedByIndex(); + + void init(InitContext const&) + { + } + + PresliceOptional BaseSplittingsPerBaseJetInclusive = aod::chargedsplitting::jetId; + PresliceOptional TagSplittingsPerTagJetInclusive = aod::chargedeventwisesubtractedsplitting::jetId; + PresliceOptional BaseSplittingsPerBaseJetD0 = aod::d0chargedsplitting::jetId; + PresliceOptional TagSplittingsPerTagJetD0 = aod::d0chargedeventwisesubtractedsplitting::jetId; + PresliceOptional BaseSplittingsPerBaseJetDplus = aod::dpluschargedsplitting::jetId; + PresliceOptional TagSplittingsPerTagJetDplus = aod::dpluschargedeventwisesubtractedsplitting::jetId; + PresliceOptional BaseSplittingsPerBaseJetLc = aod::lcchargedsplitting::jetId; + PresliceOptional TagSplittingsPerTagJetLc = aod::lcchargedeventwisesubtractedsplitting::jetId; + PresliceOptional BaseSplittingsPerBaseJetBplus = aod::bpluschargedsplitting::jetId; + PresliceOptional TagSplittingsPerTagJetBplus = aod::bpluschargedeventwisesubtractedsplitting::jetId; + PresliceOptional BaseSplittingsPerBaseJetDielectron = aod::dielectronchargedsplitting::jetId; + PresliceOptional TagSplittingsPerTagJetDielectron = aod::dielectronchargedeventwisesubtractedsplitting::jetId; + + PresliceOptional BasePairsPerBaseJetInclusive = aod::chargedpair::jetId; + PresliceOptional TagPairsPerTagJetInclusive = aod::chargedeventwisesubtractedpair::jetId; + PresliceOptional BasePairsPerBaseJetD0 = aod::d0chargedpair::jetId; + PresliceOptional TagPairsPerTagJetD0 = aod::d0chargedeventwisesubtractedpair::jetId; + PresliceOptional BasePairsPerBaseJetDplus = aod::dpluschargedpair::jetId; + PresliceOptional TagPairsPerTagJetDplus = aod::dpluschargedeventwisesubtractedpair::jetId; + PresliceOptional BasePairsPerBaseJetLc = aod::lcchargedpair::jetId; + PresliceOptional TagPairsPerTagJetLc = aod::lcchargedeventwisesubtractedpair::jetId; + PresliceOptional BasePairsPerBaseJetBplus = aod::bpluschargedpair::jetId; + PresliceOptional TagPairsPerTagJetBplus = aod::bpluschargedeventwisesubtractedpair::jetId; + PresliceOptional BasePairsPerBaseJetDielectron = aod::dielectronchargedpair::jetId; + PresliceOptional TagPairsPerTagJetDielectron = aod::dielectronchargedeventwisesubtractedpair::jetId; + + // workaround till binding nodes can be passed as template arguments + template + auto slicedPerJetForMatching(T const& table, U const& jet, V const& perIncluisveJet, M const& perD0Jet, N const& perDplusJet, O const& perLcJet, P const& perBplusJet, Q const& perDielectronJet) + { + if constexpr (jethfutilities::isHFTable() || jethfutilities::isHFMcTable()) { + return jethfutilities::slicedPerHFJet(table, jet, perD0Jet, perDplusJet, perLcJet, perBplusJet); + } else if constexpr (jetdqutilities::isDielectronTable() || jetdqutilities::isDielectronMcTable()) { + return jetdqutilities::slicedPerDielectronJet(table, jet, perDielectronJet); + } else { + return table.sliceBy(perIncluisveJet, jet.globalIndex()); + } + } + + void processData(JetsTag const& jetsTag, + JetsBase const&, + SplittingsBase const& jetsBaseSplittings, + SplittingsTag const& jetsTagSplittings, + PairsBase const& jetsBasePairs, + PairsTag const& jetsTagPairs, + Candidates const& candidates, + ClustersBase const& clustersBase, + TracksBase const& tracksBase, TracksTag const& tracksTag) + { + + std::vector> jetsBasetoTagSplittingsMatchingGeo, jetsBasetoTagSplittingsMatchingPt, jetsBasetoTagSplittingsMatchingHF; + jetsBasetoTagSplittingsMatchingGeo.assign(jetsBaseSplittings.size(), {}); + jetsBasetoTagSplittingsMatchingPt.assign(jetsBaseSplittings.size(), {}); + jetsBasetoTagSplittingsMatchingHF.assign(jetsBaseSplittings.size(), {}); + + std::vector> jetsTagtoBaseSplittingsMatchingGeo, jetsTagtoBaseSplittingsMatchingPt, jetsTagtoBaseSplittingsMatchingHF; + jetsTagtoBaseSplittingsMatchingGeo.assign(jetsTagSplittings.size(), {}); + jetsTagtoBaseSplittingsMatchingPt.assign(jetsTagSplittings.size(), {}); + jetsTagtoBaseSplittingsMatchingHF.assign(jetsTagSplittings.size(), {}); + + std::vector jetTagSplittingsMap; + std::vector jetBaseSplittingsMap; + jetTagSplittingsMap.resize(jetsTagSplittings.size(), -1); + jetBaseSplittingsMap.resize(jetsBaseSplittings.size(), -1); + + std::vector> jetsBasetoTagPairsMatching; + std::vector> jetsTagtoBasePairsMatching; + jetsBasetoTagPairsMatching.assign(jetsBasePairs.size(), {}); + jetsTagtoBasePairsMatching.assign(jetsTagPairs.size(), {}); + + std::vector jetTagPairsMap; + std::vector jetBasePairsMap; + jetTagPairsMap.resize(jetsTagPairs.size(), -1); + jetBasePairsMap.resize(jetsBasePairs.size(), -1); + + for (auto jetTag : jetsTag) { + if (jetTag.has_matchedJetGeo()) { + // auto const& jetTagSplittings = jetsTagSplittings.sliceBy(TagSplittingsPerTagJet, jetTag.globalIndex()); + auto const& jetTagSplittings = slicedPerJetForMatching(jetsTagSplittings, jetTag, TagSplittingsPerTagJetInclusive, TagSplittingsPerTagJetD0, TagSplittingsPerTagJetDplus, TagSplittingsPerTagJetLc, TagSplittingsPerTagJetBplus, TagSplittingsPerTagJetDielectron); + int tagSplittingIndex = 0; + for (auto const& jetTagSplitting : jetTagSplittings) { + jetTagSplittingsMap[jetTagSplitting.globalIndex()] = tagSplittingIndex; + tagSplittingIndex++; + } + // auto const& jetTagPairs = jetsTagPairs.sliceBy(TagPairsPerTagJet, jetTag.globalIndex()); + auto const& jetTagPairs = slicedPerJetForMatching(jetsTagPairs, jetTag, TagPairsPerTagJetInclusive, TagPairsPerTagJetD0, TagPairsPerTagJetDplus, TagPairsPerTagJetLc, TagPairsPerTagJetBplus, TagPairsPerTagJetDielectron); + int tagPairIndex = 0; + for (auto const& jetTagPair : jetTagPairs) { + jetTagPairsMap[jetTagPair.globalIndex()] = tagPairIndex; + tagPairIndex++; + } + for (auto& jetBase : jetTag.template matchedJetGeo_as()) { + if (requirePtMatchedJets) { + bool jetsMatchedWithPt = false; + for (auto& jetBaseForMatchPt : jetTag.template matchedJetPt_as()) { + if (jetBaseForMatchPt.globalIndex() == jetBase.globalIndex()) { + jetsMatchedWithPt = true; + } + } + if (!jetsMatchedWithPt) { + continue; + } + } + if (requireHFMatchedJets) { + bool jetsMatchedWithHF = false; + for (auto& jetBaseForMatchHF : jetTag.template matchedJetCand_as()) { + if (jetBaseForMatchHF.globalIndex() == jetBase.globalIndex()) { + jetsMatchedWithHF = true; + } + } + if (!jetsMatchedWithHF) { + continue; + } + } + // auto const& jetBaseSplittings = jetsBaseSplittings.sliceBy(BaseSplittingsPerBaseJet, jetBase.globalIndex()); + auto const& jetBaseSplittings = slicedPerJetForMatching(jetsBaseSplittings, jetBase, BaseSplittingsPerBaseJetInclusive, BaseSplittingsPerBaseJetD0, BaseSplittingsPerBaseJetDplus, BaseSplittingsPerBaseJetLc, BaseSplittingsPerBaseJetBplus, BaseSplittingsPerBaseJetDielectron); + int baseSplittingIndex = 0; + for (auto const& jetBaseSplitting : jetBaseSplittings) { + jetBaseSplittingsMap[jetBaseSplitting.globalIndex()] = baseSplittingIndex; + baseSplittingIndex++; + } + jetmatchingutilities::doAllMatching(jetBaseSplittings, jetTagSplittings, jetsBasetoTagSplittingsMatchingGeo, jetsBasetoTagSplittingsMatchingPt, jetsBasetoTagSplittingsMatchingHF, jetsTagtoBaseSplittingsMatchingGeo, jetsTagtoBaseSplittingsMatchingPt, jetsTagtoBaseSplittingsMatchingHF, candidates, tracksBase, clustersBase, candidates, tracksTag, tracksTag, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction); + // auto const& jetBasePairs = jetsBasePairs.sliceBy(BasePairsPerBaseJet, jetBase.globalIndex()); + auto const& jetBasePairs = slicedPerJetForMatching(jetsBasePairs, jetBase, BasePairsPerBaseJetInclusive, BasePairsPerBaseJetD0, BasePairsPerBaseJetDplus, BasePairsPerBaseJetLc, BasePairsPerBaseJetBplus, BasePairsPerBaseJetDielectron); + int basePairIndex = 0; + for (auto const& jetBasePair : jetBasePairs) { + jetBasePairsMap[jetBasePair.globalIndex()] = basePairIndex; + basePairIndex++; + } + jetmatchingutilities::doPairMatching(jetBasePairs, jetTagPairs, jetsBasetoTagPairsMatching, jetsTagtoBasePairsMatching, candidates, tracksBase, candidates, tracksTag); + } + } + } + + for (auto jetsTagSplitting : jetsTagSplittings) { + std::vector tagToBaseMatchingGeoIndex; + std::vector tagToBaseMatchingPtIndex; + std::vector tagToBaseMatchingHFIndex; + for (auto jetBaseSplittingIndex : jetsTagtoBaseSplittingsMatchingGeo[jetsTagSplitting.globalIndex()]) { + tagToBaseMatchingGeoIndex.push_back(jetBaseSplittingsMap[jetBaseSplittingIndex]); + } + for (auto jetBaseSplittingIndex : jetsTagtoBaseSplittingsMatchingPt[jetsTagSplitting.globalIndex()]) { + tagToBaseMatchingPtIndex.push_back(jetBaseSplittingsMap[jetBaseSplittingIndex]); + } + for (auto jetBaseSplittingIndex : jetsTagtoBaseSplittingsMatchingHF[jetsTagSplitting.globalIndex()]) { + tagToBaseMatchingHFIndex.push_back(jetBaseSplittingsMap[jetBaseSplittingIndex]); + } + splittingsTagtoBaseMatchingTable(tagToBaseMatchingGeoIndex, tagToBaseMatchingPtIndex, tagToBaseMatchingHFIndex); + } + for (auto jetsBaseSplitting : jetsBaseSplittings) { + std::vector baseToTagMatchingGeoIndex; + std::vector baseToTagMatchingPtIndex; + std::vector baseToTagMatchingHFIndex; + for (auto jetTagSplittingIndex : jetsBasetoTagSplittingsMatchingGeo[jetsBaseSplitting.globalIndex()]) { + baseToTagMatchingGeoIndex.push_back(jetTagSplittingsMap[jetTagSplittingIndex]); + } + for (auto jetTagSplittingIndex : jetsBasetoTagSplittingsMatchingPt[jetsBaseSplitting.globalIndex()]) { + baseToTagMatchingPtIndex.push_back(jetTagSplittingsMap[jetTagSplittingIndex]); + } + for (auto jetTagSplittingIndex : jetsBasetoTagSplittingsMatchingHF[jetsBaseSplitting.globalIndex()]) { + baseToTagMatchingHFIndex.push_back(jetTagSplittingsMap[jetTagSplittingIndex]); + } + splittingsBasetoTagMatchingTable(baseToTagMatchingGeoIndex, baseToTagMatchingPtIndex, baseToTagMatchingHFIndex); + } + for (auto jetsTagPair : jetsTagPairs) { + std::vector tagToBaseMatchingIndex; + for (auto jetBasePairIndex : jetsTagtoBasePairsMatching[jetsTagPair.globalIndex()]) { + tagToBaseMatchingIndex.push_back(jetBasePairsMap[jetBasePairIndex]); + } + pairsTagtoBaseMatchingTable(tagToBaseMatchingIndex); + } + for (auto jetsBasePair : jetsBasePairs) { + std::vector baseToTagMatchingIndex; + for (auto jetTagPairIndex : jetsBasetoTagPairsMatching[jetsBasePair.globalIndex()]) { + baseToTagMatchingIndex.push_back(jetTagPairsMap[jetTagPairIndex]); + } + pairsBasetoTagMatchingTable(baseToTagMatchingIndex); + } + } + PROCESS_SWITCH(JetSubstructureMatchingSub, processData, "charged jet substructure", true); +}; diff --git a/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSubBplusCharged.cxx b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSubBplusCharged.cxx new file mode 100644 index 00000000000..901ff6226a3 --- /dev/null +++ b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSubBplusCharged.cxx @@ -0,0 +1,39 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// substructure matching event-wise subtracted Bplus charged task +// +/// \author Nima Zardoshti + +#include +#include "PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSub.cxx" + +using BplusChargedJetSubstructureMatchingSub = JetSubstructureMatchingSub, + soa::Join, + aod::BplusChargedSPsMatchedToBplusChargedEventWiseSubtractedSPs, + aod::BplusChargedEventWiseSubtractedSPsMatchedToBplusChargedSPs, + aod::BplusChargedPRsMatchedToBplusChargedEventWiseSubtractedPRs, + aod::BplusChargedEventWiseSubtractedPRsMatchedToBplusChargedPRs, + aod::BplusChargedSPs, + aod::BplusChargedEventWiseSubtractedSPs, + aod::BplusChargedPRs, + aod::BplusChargedEventWiseSubtractedPRs, + aod::CandidatesBplusData, + aod::JetTracks, + aod::JetTracksSubBplus, + aod::JDummys>; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + std::vector tasks; + tasks.emplace_back(adaptAnalysisTask(cfgc, TaskName{"jet-substructure-matching-sub-bplus-ch"})); + return WorkflowSpec{tasks}; +} diff --git a/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSubCharged.cxx b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSubCharged.cxx new file mode 100644 index 00000000000..618d55d7c5b --- /dev/null +++ b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSubCharged.cxx @@ -0,0 +1,39 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// substructure matching event-wise subtracted charged task +// +/// \author Nima Zardoshti + +#include +#include "PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSub.cxx" + +using ChargedJetSubstructureMatchingSub = JetSubstructureMatchingSub, + soa::Join, + aod::ChargedSPsMatchedToChargedEventWiseSubtractedSPs, + aod::ChargedEventWiseSubtractedSPsMatchedToChargedSPs, + aod::ChargedPRsMatchedToChargedEventWiseSubtractedPRs, + aod::ChargedEventWiseSubtractedPRsMatchedToChargedPRs, + aod::ChargedSPs, + aod::ChargedEventWiseSubtractedSPs, + aod::ChargedPRs, + aod::ChargedEventWiseSubtractedPRs, + aod::JCollisions, + aod::JetTracks, + aod::JetTracksSub, + aod::JDummys>; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + std::vector tasks; + tasks.emplace_back(adaptAnalysisTask(cfgc, TaskName{"jet-substructure-matching-sub-ch"})); + return WorkflowSpec{tasks}; +} diff --git a/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSubD0Charged.cxx b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSubD0Charged.cxx new file mode 100644 index 00000000000..f53ebf3ae39 --- /dev/null +++ b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSubD0Charged.cxx @@ -0,0 +1,39 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// substructure matching event-wise subtracted D0 charged task +// +/// \author Nima Zardoshti + +#include +#include "PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSub.cxx" + +using D0ChargedJetSubstructureMatchingSub = JetSubstructureMatchingSub, + soa::Join, + aod::D0ChargedSPsMatchedToD0ChargedEventWiseSubtractedSPs, + aod::D0ChargedEventWiseSubtractedSPsMatchedToD0ChargedSPs, + aod::D0ChargedPRsMatchedToD0ChargedEventWiseSubtractedPRs, + aod::D0ChargedEventWiseSubtractedPRsMatchedToD0ChargedPRs, + aod::D0ChargedSPs, + aod::D0ChargedEventWiseSubtractedSPs, + aod::D0ChargedPRs, + aod::D0ChargedEventWiseSubtractedPRs, + aod::CandidatesD0Data, + aod::JetTracks, + aod::JetTracksSubD0, + aod::JDummys>; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + std::vector tasks; + tasks.emplace_back(adaptAnalysisTask(cfgc, TaskName{"jet-substructure-matching-sub-d0-ch"})); + return WorkflowSpec{tasks}; +} diff --git a/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSubDielectronCharged.cxx b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSubDielectronCharged.cxx new file mode 100644 index 00000000000..71fad02021d --- /dev/null +++ b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSubDielectronCharged.cxx @@ -0,0 +1,39 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// substructure matching event-wise subtracted Dielectron charged task +// +/// \author Nima Zardoshti + +#include +#include "PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSub.cxx" + +using DielectronChargedJetSubstructureMatchingSub = JetSubstructureMatchingSub, + soa::Join, + aod::DielectronChargedSPsMatchedToDielectronChargedEventWiseSubtractedSPs, + aod::DielectronChargedEventWiseSubtractedSPsMatchedToDielectronChargedSPs, + aod::DielectronChargedPRsMatchedToDielectronChargedEventWiseSubtractedPRs, + aod::DielectronChargedEventWiseSubtractedPRsMatchedToDielectronChargedPRs, + aod::DielectronChargedSPs, + aod::DielectronChargedEventWiseSubtractedSPs, + aod::DielectronChargedPRs, + aod::DielectronChargedEventWiseSubtractedPRs, + aod::CandidatesDielectronData, + aod::JetTracks, + aod::JetTracksSubDielectron, + aod::JDummys>; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + std::vector tasks; + tasks.emplace_back(adaptAnalysisTask(cfgc, TaskName{"jet-substructure-matching-sub-dielectron-ch"})); + return WorkflowSpec{tasks}; +} diff --git a/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSubDplusCharged.cxx b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSubDplusCharged.cxx new file mode 100644 index 00000000000..662b227b08a --- /dev/null +++ b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSubDplusCharged.cxx @@ -0,0 +1,39 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// substructure matching event-wise subtracted Dplus charged task +// +/// \author Nima Zardoshti + +#include +#include "PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSub.cxx" + +using DplusChargedJetSubstructureMatchingSub = JetSubstructureMatchingSub, + soa::Join, + aod::DplusChargedSPsMatchedToDplusChargedEventWiseSubtractedSPs, + aod::DplusChargedEventWiseSubtractedSPsMatchedToDplusChargedSPs, + aod::DplusChargedPRsMatchedToDplusChargedEventWiseSubtractedPRs, + aod::DplusChargedEventWiseSubtractedPRsMatchedToDplusChargedPRs, + aod::DplusChargedSPs, + aod::DplusChargedEventWiseSubtractedSPs, + aod::DplusChargedPRs, + aod::DplusChargedEventWiseSubtractedPRs, + aod::CandidatesDplusData, + aod::JetTracks, + aod::JetTracksSubDplus, + aod::JDummys>; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + std::vector tasks; + tasks.emplace_back(adaptAnalysisTask(cfgc, TaskName{"jet-substructure-matching-sub-dplus-ch"})); + return WorkflowSpec{tasks}; +} diff --git a/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSubLcCharged.cxx b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSubLcCharged.cxx new file mode 100644 index 00000000000..9ab84673b9c --- /dev/null +++ b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSubLcCharged.cxx @@ -0,0 +1,39 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +// substructure matching event-wise subtracted Lc charged task +// +/// \author Nima Zardoshti + +#include +#include "PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSub.cxx" + +using LcChargedJetSubstructureMatchingSub = JetSubstructureMatchingSub, + soa::Join, + aod::LcChargedSPsMatchedToLcChargedEventWiseSubtractedSPs, + aod::LcChargedEventWiseSubtractedSPsMatchedToLcChargedSPs, + aod::LcChargedPRsMatchedToLcChargedEventWiseSubtractedPRs, + aod::LcChargedEventWiseSubtractedPRsMatchedToLcChargedPRs, + aod::LcChargedSPs, + aod::LcChargedEventWiseSubtractedSPs, + aod::LcChargedPRs, + aod::LcChargedEventWiseSubtractedPRs, + aod::CandidatesLcData, + aod::JetTracks, + aod::JetTracksSubLc, + aod::JDummys>; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + std::vector tasks; + tasks.emplace_back(adaptAnalysisTask(cfgc, TaskName{"jet-substructure-matching-sub-lc-ch"})); + return WorkflowSpec{tasks}; +} diff --git a/PWGJE/TableProducer/Matching/jetMatchingMC.cxx b/PWGJE/TableProducer/Matching/jetMatchingMC.cxx index ef56702af09..72206247c50 100644 --- a/PWGJE/TableProducer/Matching/jetMatchingMC.cxx +++ b/PWGJE/TableProducer/Matching/jetMatchingMC.cxx @@ -69,7 +69,6 @@ struct JetMatchingMc { CandidatesBase const& candidatesBase, CandidatesTag const& candidatesTag) { - // initialise objects used to store the matching index arrays (array in case a mcCollision is split) before filling the matching tables std::vector> jetsBasetoTagMatchingGeo, jetsBasetoTagMatchingPt, jetsBasetoTagMatchingHF; std::vector> jetsTagtoBaseMatchingGeo, jetsTagtoBaseMatchingPt, jetsTagtoBaseMatchingHF; @@ -90,7 +89,7 @@ struct JetMatchingMc { const auto jetsBasePerColl = jetsBase.sliceBy(baseJetsPerCollision, jetsBaseIsMc ? mcCollision.globalIndex() : collision.globalIndex()); const auto jetsTagPerColl = jetsTag.sliceBy(tagJetsPerCollision, jetsTagIsMc ? mcCollision.globalIndex() : collision.globalIndex()); - jetmatchingutilities::doAllMatching(jetsBasePerColl, jetsTagPerColl, jetsBasetoTagMatchingGeo, jetsBasetoTagMatchingPt, jetsBasetoTagMatchingHF, jetsTagtoBaseMatchingGeo, jetsTagtoBaseMatchingPt, jetsTagtoBaseMatchingHF, candidatesBase, candidatesTag, tracks, clusters, particles, particles, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction); + jetmatchingutilities::doAllMatching(jetsBasePerColl, jetsTagPerColl, jetsBasetoTagMatchingGeo, jetsBasetoTagMatchingPt, jetsBasetoTagMatchingHF, jetsTagtoBaseMatchingGeo, jetsTagtoBaseMatchingPt, jetsTagtoBaseMatchingHF, candidatesBase, tracks, clusters, candidatesTag, particles, particles, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction); } } for (auto i = 0; i < jetsBase.size(); ++i) { diff --git a/PWGJE/TableProducer/Matching/jetMatchingMCSub.cxx b/PWGJE/TableProducer/Matching/jetMatchingMCSub.cxx index 9db070ec7b6..45e57923721 100644 --- a/PWGJE/TableProducer/Matching/jetMatchingMCSub.cxx +++ b/PWGJE/TableProducer/Matching/jetMatchingMCSub.cxx @@ -78,7 +78,7 @@ struct JetMatchingMcSub { const auto jetsBasePerColl = jetsBase.sliceBy(baseJetsPerCollision, collision.globalIndex()); const auto jetsTagPerColl = jetsTag.sliceBy(tagJetsPerCollision, collision.globalIndex()); - jetmatchingutilities::doAllMatching(jetsBasePerColl, jetsTagPerColl, jetsBasetoTagMatchingGeo, jetsBasetoTagMatchingPt, jetsBasetoTagMatchingHF, jetsTagtoBaseMatchingGeo, jetsTagtoBaseMatchingPt, jetsTagtoBaseMatchingHF, candidates, candidates, tracks, tracks, tracksSub, tracksSub, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction); + jetmatchingutilities::doAllMatching(jetsBasePerColl, jetsTagPerColl, jetsBasetoTagMatchingGeo, jetsBasetoTagMatchingPt, jetsBasetoTagMatchingHF, jetsTagtoBaseMatchingGeo, jetsTagtoBaseMatchingPt, jetsTagtoBaseMatchingHF, candidates, tracks, tracks, candidates, tracksSub, tracksSub, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction); } for (auto i = 0; i < jetsBase.size(); ++i) { diff --git a/PWGJE/TableProducer/Matching/jetMatchingSub.cxx b/PWGJE/TableProducer/Matching/jetMatchingSub.cxx index 36e809b5129..002fedd3a0d 100644 --- a/PWGJE/TableProducer/Matching/jetMatchingSub.cxx +++ b/PWGJE/TableProducer/Matching/jetMatchingSub.cxx @@ -76,7 +76,7 @@ struct JetMatchingSub { const auto jetsBasePerColl = jetsBase.sliceBy(baseJetsPerCollision, collision.globalIndex()); const auto jetsTagPerColl = jetsTag.sliceBy(tagJetsPerCollision, collision.globalIndex()); - jetmatchingutilities::doAllMatching(jetsBasePerColl, jetsTagPerColl, jetsBasetoTagMatchingGeo, jetsBasetoTagMatchingPt, jetsBasetoTagMatchingHF, jetsTagtoBaseMatchingGeo, jetsTagtoBaseMatchingPt, jetsTagtoBaseMatchingHF, candidates, candidates, tracks, tracks, tracksSub, tracksSub, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction); + jetmatchingutilities::doAllMatching(jetsBasePerColl, jetsTagPerColl, jetsBasetoTagMatchingGeo, jetsBasetoTagMatchingPt, jetsBasetoTagMatchingHF, jetsTagtoBaseMatchingGeo, jetsTagtoBaseMatchingPt, jetsTagtoBaseMatchingHF, candidates, tracks, tracks, candidates, tracksSub, tracksSub, doMatchingGeo, doMatchingHf, doMatchingPt, maxMatchingDistance, minPtFraction); } for (auto i = 0; i < jetsBase.size(); ++i) { diff --git a/PWGJE/Tasks/jetSubstructure.cxx b/PWGJE/Tasks/jetSubstructure.cxx index c0ac272ac5c..74ae9314b77 100644 --- a/PWGJE/Tasks/jetSubstructure.cxx +++ b/PWGJE/Tasks/jetSubstructure.cxx @@ -14,6 +14,9 @@ /// \author Nima Zardoshti // +#include +#include + #include "fastjet/PseudoJet.hh" #include "fastjet/ClusterSequenceArea.hh" @@ -47,6 +50,16 @@ struct JetSubstructureTask { Produces jetSubstructureMCPTable; Produces jetSubstructureDataSubTable; + Produces jetSplittingsDataTable; + Produces jetSplittingsMCDTable; + Produces jetSplittingsMCPTable; + Produces jetSplittingsDataSubTable; + + Produces jetPairsDataTable; + Produces jetPairsMCDTable; + Produces jetPairsMCPTable; + Produces jetPairsDataSubTable; + Configurable zCut{"zCut", 0.1, "soft drop z cut"}; Configurable beta{"beta", 0.0, "soft drop beta"}; Configurable kappa{"kappa", 1.0, "angularity kappa"}; @@ -63,11 +76,21 @@ struct JetSubstructureTask { std::vector ptSubLeadingVec; std::vector thetaVec; std::vector nSub; - std::vector pairPtVec; - std::vector pairEnergyVec; - std::vector pairThetaVec; + std::vector pairJetPtVec; + std::vector pairJetEnergyVec; + std::vector pairJetThetaVec; + std::vector pairJetPerpCone1PtVec; + std::vector pairJetPerpCone1EnergyVec; + std::vector pairJetPerpCone1ThetaVec; + std::vector pairPerpCone1PerpCone1PtVec; + std::vector pairPerpCone1PerpCone1EnergyVec; + std::vector pairPerpCone1PerpCone1ThetaVec; + std::vector pairPerpCone1PerpCone2PtVec; + std::vector pairPerpCone1PerpCone2EnergyVec; + std::vector pairPerpCone1PerpCone2ThetaVec; float angularity; float leadingConstituentPt; + float perpConeRho; HistogramRegistry registry; @@ -89,8 +112,12 @@ struct JetSubstructureTask { jetReclusterer.algorithm = fastjet::JetAlgorithm::cambridge_algorithm; } - template - void jetReclustering(T const& jet) + Preslice TracksPerCollision = aod::jtrack::collisionId; + Preslice TracksPerCollisionDataSub = aod::bkgcharged::collisionId; + Preslice ParticlesPerMcCollision = aod::jmcparticle::mcCollisionId; + + template + void jetReclustering(T const& jet, U& splittingTable) { energyMotherVec.clear(); ptLeadingVec.clear(); @@ -111,6 +138,15 @@ struct JetSubstructureTask { if (parentSubJet1.perp() < parentSubJet2.perp()) { std::swap(parentSubJet1, parentSubJet2); } + std::vector tracks; + std::vector candidates; + std::vector clusters; + for (const auto& constituent : sorted_by_pt(parentSubJet2.constituents())) { + if (constituent.template user_info().getStatus() == static_cast(JetConstituentStatus::track)) { + tracks.push_back(constituent.template user_info().getIndex()); + } + } + splittingTable(jet.globalIndex(), tracks, clusters, candidates, parentSubJet2.perp(), parentSubJet2.eta(), parentSubJet2.phi(), 0); auto z = parentSubJet2.perp() / (parentSubJet1.perp() + parentSubJet2.perp()); auto theta = parentSubJet1.delta_R(parentSubJet2); energyMotherVec.push_back(daughterSubJet.e()); @@ -151,24 +187,102 @@ struct JetSubstructureTask { } } - template - void jetPairing(T const& jet, U const& /*tracks*/) + template + void jetPairing(T const& jet, U const& tracks, V const& slicer, M& pairTable) { - pairPtVec.clear(); - pairEnergyVec.clear(); - pairThetaVec.clear(); + pairJetPtVec.clear(); + pairJetEnergyVec.clear(); + pairJetThetaVec.clear(); std::vector tracksVec; + std::vector tracksVecIds; for (auto const& constituent : jet.template tracks_as()) { if (constituent.pt() >= pairConstituentPtMin) { tracksVec.push_back(constituent); + tracksVecIds.push_back(constituent.globalIndex()); } } if (tracksVec.size() >= 1) { for (typename std::vector::size_type track1Index = 0; track1Index < tracksVec.size(); track1Index++) { - for (typename std::vector::size_type track2Index = 0; track2Index < tracksVec.size(); track2Index++) { - pairPtVec.push_back(tracksVec.at(track1Index).pt() * tracksVec.at(track2Index).pt()); - pairEnergyVec.push_back(tracksVec.at(track1Index).energy() * tracksVec.at(track2Index).energy()); - pairThetaVec.push_back(jetutilities::deltaR(tracksVec.at(track1Index), tracksVec.at(track2Index))); + for (typename std::vector::size_type track2Index = track1Index + 1; track2Index < tracksVec.size(); track2Index++) { + pairJetPtVec.push_back(tracksVec.at(track1Index).pt() * tracksVec.at(track2Index).pt()); + pairJetEnergyVec.push_back(2.0 * tracksVec.at(track1Index).energy() * tracksVec.at(track2Index).energy()); + pairJetThetaVec.push_back(jetutilities::deltaR(tracksVec.at(track1Index), tracksVec.at(track2Index))); + pairTable(jet.globalIndex(), tracksVecIds.at(track1Index), tracksVecIds.at(track2Index), -1, -1); + } + } + } + + pairJetPerpCone1PtVec.clear(); + pairJetPerpCone1EnergyVec.clear(); + pairJetPerpCone1ThetaVec.clear(); + pairPerpCone1PerpCone1PtVec.clear(); + pairPerpCone1PerpCone1EnergyVec.clear(); + pairPerpCone1PerpCone1ThetaVec.clear(); + pairPerpCone1PerpCone2PtVec.clear(); + pairPerpCone1PerpCone2EnergyVec.clear(); + pairPerpCone1PerpCone2ThetaVec.clear(); + int32_t collisionId = -1; + if constexpr (!isMC) { + collisionId = jet.collisionId(); + } else { + collisionId = jet.mcCollisionId(); + } + auto tracksPerCollision = tracks.sliceBy(slicer, collisionId); + + float perpCone1Phi = RecoDecay::constrainAngle(jet.phi() + (M_PI / 2.)); + float perpCone2Phi = RecoDecay::constrainAngle(jet.phi() - (M_PI / 2.)); + float perpCone1Pt = 0.0; + float perpCone2Pt = 0.0; + std::vector tracksPerpCone1Vec; + std::vector tracksPerpCone2Vec; + for (auto const& track : tracksPerCollision) { + float deltaPhi1 = track.phi() - perpCone1Phi; + deltaPhi1 = RecoDecay::constrainAngle(deltaPhi1, -M_PI); + float deltaPhi2 = track.phi() - perpCone2Phi; + deltaPhi2 = RecoDecay::constrainAngle(deltaPhi2, -M_PI); + float deltaEta = jet.eta() - track.eta(); + + if (TMath::Sqrt((deltaPhi1 * deltaPhi1) + (deltaEta * deltaEta)) <= jet.r() / 100.0) { + tracksPerpCone1Vec.push_back(track); + perpCone1Pt += track.pt(); + } + if (TMath::Sqrt((deltaPhi2 * deltaPhi2) + (deltaEta * deltaEta)) <= jet.r() / 100.0) { + tracksPerpCone2Vec.push_back(track); + perpCone2Pt += track.pt(); + } + } + perpConeRho = (perpCone1Pt + perpCone2Pt) / (2 * M_PI * (jet.r() / 100.0) * (jet.r() / 100.0)); // currently done per jet - could be better to do for leading jet if pushing to very low pT + + if (tracksVec.size() >= 1 && tracksPerpCone1Vec.size() >= 1) { + for (typename std::vector::size_type track1Index = 0; track1Index < tracksVec.size(); track1Index++) { + for (typename std::vector::size_type track2Index = 0; track2Index < tracksPerpCone1Vec.size(); track2Index++) { + pairJetPerpCone1PtVec.push_back(tracksVec.at(track1Index).pt() * tracksPerpCone1Vec.at(track2Index).pt()); + pairJetPerpCone1EnergyVec.push_back(2.0 * tracksVec.at(track1Index).energy() * tracksPerpCone1Vec.at(track2Index).energy()); + float dPhi = RecoDecay::constrainAngle(tracksVec.at(track1Index).phi() - (tracksPerpCone1Vec.at(track2Index).phi() - (M_PI / 2.)), -M_PI); + float dEta = tracksVec.at(track1Index).eta() - tracksPerpCone1Vec.at(track2Index).eta(); + pairJetPerpCone1ThetaVec.push_back(std::sqrt(dEta * dEta + dPhi * dPhi)); + } + } + } + + if (tracksPerpCone1Vec.size() >= 1) { + for (typename std::vector::size_type track1Index = 0; track1Index < tracksPerpCone1Vec.size(); track1Index++) { + for (typename std::vector::size_type track2Index = track1Index + 1; track2Index < tracksPerpCone1Vec.size(); track2Index++) { + pairPerpCone1PerpCone1PtVec.push_back(tracksPerpCone1Vec.at(track1Index).pt() * tracksPerpCone1Vec.at(track2Index).pt()); + pairPerpCone1PerpCone1EnergyVec.push_back(2.0 * tracksPerpCone1Vec.at(track1Index).energy() * tracksPerpCone1Vec.at(track2Index).energy()); + pairPerpCone1PerpCone1ThetaVec.push_back(jetutilities::deltaR(tracksPerpCone1Vec.at(track1Index), tracksPerpCone1Vec.at(track2Index))); + } + } + } + + if (tracksPerpCone1Vec.size() >= 1 && tracksPerpCone2Vec.size() >= 1) { + for (typename std::vector::size_type track1Index = 0; track1Index < tracksPerpCone1Vec.size(); track1Index++) { + for (typename std::vector::size_type track2Index = 0; track2Index < tracksPerpCone2Vec.size(); track2Index++) { + pairPerpCone1PerpCone2PtVec.push_back(tracksPerpCone1Vec.at(track1Index).pt() * tracksPerpCone2Vec.at(track2Index).pt()); + pairPerpCone1PerpCone2EnergyVec.push_back(2.0 * tracksPerpCone1Vec.at(track1Index).energy() * tracksPerpCone2Vec.at(track2Index).energy()); + float dPhi = RecoDecay::constrainAngle((tracksPerpCone1Vec.at(track1Index).phi() - (M_PI / 2.)) - (tracksPerpCone2Vec.at(track2Index).phi() + (M_PI / 2.)), -M_PI); + float dEta = tracksPerpCone1Vec.at(track1Index).eta() - tracksPerpCone2Vec.at(track2Index).eta(); + pairPerpCone1PerpCone2ThetaVec.push_back(std::sqrt(dEta * dEta + dPhi * dPhi)); } } } @@ -188,18 +302,18 @@ struct JetSubstructureTask { angularity /= (jet.pt() * (jet.r() / 100.f)); } - template - void analyseCharged(T const& jet, U const& tracks, V& outputTable) + template + void analyseCharged(T const& jet, U const& tracks, V const& trackSlicer, M& outputTable, N& splittingTable, O& pairTable) { jetConstituents.clear(); for (auto& jetConstituent : jet.template tracks_as()) { fastjetutilities::fillTracks(jetConstituent, jetConstituents, jetConstituent.globalIndex()); } nSub = jetsubstructureutilities::getNSubjettiness(jet, tracks, tracks, tracks, 2, fastjet::contrib::CA_Axes(), true, zCut, beta); - jetReclustering(jet); - jetPairing(jet, tracks); + jetReclustering(jet, splittingTable); + jetPairing(jet, tracks, trackSlicer, pairTable); jetSubstructureSimple(jet, tracks); - outputTable(energyMotherVec, ptLeadingVec, ptSubLeadingVec, thetaVec, nSub[0], nSub[1], nSub[2], pairPtVec, pairEnergyVec, pairThetaVec, angularity, leadingConstituentPt); + outputTable(energyMotherVec, ptLeadingVec, ptSubLeadingVec, thetaVec, nSub[0], nSub[1], nSub[2], pairJetPtVec, pairJetEnergyVec, pairJetThetaVec, pairJetPerpCone1PtVec, pairJetPerpCone1EnergyVec, pairJetPerpCone1ThetaVec, pairPerpCone1PerpCone1PtVec, pairPerpCone1PerpCone1EnergyVec, pairPerpCone1PerpCone1ThetaVec, pairPerpCone1PerpCone2PtVec, pairPerpCone1PerpCone2EnergyVec, pairPerpCone1PerpCone2ThetaVec, angularity, leadingConstituentPt, perpConeRho); } void processDummy(aod::JetTracks const&) @@ -210,21 +324,21 @@ struct JetSubstructureTask { void processChargedJetsData(soa::Join::iterator const& jet, aod::JetTracks const& tracks) { - analyseCharged(jet, tracks, jetSubstructureDataTable); + analyseCharged(jet, tracks, TracksPerCollision, jetSubstructureDataTable, jetSplittingsDataTable, jetPairsDataTable); } PROCESS_SWITCH(JetSubstructureTask, processChargedJetsData, "charged jet substructure", false); void processChargedJetsEventWiseSubData(soa::Join::iterator const& jet, aod::JetTracksSub const& tracks) { - analyseCharged(jet, tracks, jetSubstructureDataSubTable); + analyseCharged(jet, tracks, TracksPerCollisionDataSub, jetSubstructureDataSubTable, jetSplittingsDataSubTable, jetPairsDataSubTable); } PROCESS_SWITCH(JetSubstructureTask, processChargedJetsEventWiseSubData, "eventwise-constituent subtracted charged jet substructure", false); void processChargedJetsMCD(typename soa::Join::iterator const& jet, aod::JetTracks const& tracks) { - analyseCharged(jet, tracks, jetSubstructureMCDTable); + analyseCharged(jet, tracks, TracksPerCollision, jetSubstructureMCDTable, jetSplittingsMCDTable, jetPairsMCDTable); } PROCESS_SWITCH(JetSubstructureTask, processChargedJetsMCD, "charged jet substructure", false); @@ -236,10 +350,10 @@ struct JetSubstructureTask { fastjetutilities::fillTracks(jetConstituent, jetConstituents, jetConstituent.globalIndex(), static_cast(JetConstituentStatus::track), pdg->Mass(jetConstituent.pdgCode())); } nSub = jetsubstructureutilities::getNSubjettiness(jet, particles, particles, particles, 2, fastjet::contrib::CA_Axes(), true, zCut, beta); - jetReclustering(jet); - jetPairing(jet, particles); + jetReclustering(jet, jetSplittingsMCPTable); + jetPairing(jet, particles, ParticlesPerMcCollision, jetPairsMCPTable); jetSubstructureSimple(jet, particles); - jetSubstructureMCPTable(energyMotherVec, ptLeadingVec, ptSubLeadingVec, thetaVec, nSub[0], nSub[1], nSub[2], pairPtVec, pairEnergyVec, pairThetaVec, angularity, leadingConstituentPt); + jetSubstructureMCPTable(energyMotherVec, ptLeadingVec, ptSubLeadingVec, thetaVec, nSub[0], nSub[1], nSub[2], pairJetPtVec, pairJetEnergyVec, pairJetThetaVec, pairJetPerpCone1PtVec, pairJetPerpCone1EnergyVec, pairJetPerpCone1ThetaVec, pairPerpCone1PerpCone1PtVec, pairPerpCone1PerpCone1EnergyVec, pairPerpCone1PerpCone1ThetaVec, pairPerpCone1PerpCone2PtVec, pairPerpCone1PerpCone2EnergyVec, pairPerpCone1PerpCone2ThetaVec, angularity, leadingConstituentPt, perpConeRho); } PROCESS_SWITCH(JetSubstructureTask, processChargedJetsMCP, "charged jet substructure on MC particle level", false); }; diff --git a/PWGJE/Tasks/jetSubstructureBplus.cxx b/PWGJE/Tasks/jetSubstructureBplus.cxx index 61228fe5b19..2d6d60f3d5a 100644 --- a/PWGJE/Tasks/jetSubstructureBplus.cxx +++ b/PWGJE/Tasks/jetSubstructureBplus.cxx @@ -13,9 +13,10 @@ // /// \author Nima Zardoshti +#include #include "PWGJE/Tasks/jetSubstructureHF.cxx" -using JetSubstructureBplus = JetSubstructureHFTask, soa::Join, soa::Join, soa::Join, aod::CandidatesBplusData, aod::CandidatesBplusMCP, aod::BplusCJetSSs, aod::BplusCMCDJetSSs, aod::BplusCMCPJetSSs, aod::BplusCEWSJetSSs, aod::JTrackBplusSubs>; +using JetSubstructureBplus = JetSubstructureHFTask, soa::Join, soa::Join, soa::Join, aod::CandidatesBplusData, aod::CandidatesBplusMCP, aod::BplusCJetSSs, aod::BplusChargedSPs, aod::BplusChargedPRs, aod::BplusCMCDJetSSs, aod::BplusChargedMCDetectorLevelSPs, aod::BplusChargedMCDetectorLevelPRs, aod::BplusCMCPJetSSs, aod::BplusChargedMCParticleLevelSPs, aod::BplusChargedMCParticleLevelPRs, aod::BplusCEWSJetSSs, aod::BplusChargedEventWiseSubtractedSPs, aod::BplusChargedEventWiseSubtractedPRs, aod::JTrackBplusSubs>; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGJE/Tasks/jetSubstructureBplusOutput.cxx b/PWGJE/Tasks/jetSubstructureBplusOutput.cxx index 9647a64c1b4..148e8b9e669 100644 --- a/PWGJE/Tasks/jetSubstructureBplusOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureBplusOutput.cxx @@ -13,9 +13,10 @@ // /// \author Nima Zardoshti +#include #include "PWGJE/Tasks/jetSubstructureHFOutput.cxx" -using JetSubstructureOutputBplus = JetSubstructureHFOutputTask, aod::CandidatesBplusData, aod::CandidatesBplusMCD, aod::CandidatesBplusMCP, aod::JTrackBplusSubs, soa::Join, soa::Join, aod::BplusCJetCOs, aod::BplusCJetOs, aod::BplusCJetSSOs, aod::BplusCJetMOs, soa::Join, aod::BplusCMCDJetCOs, aod::BplusCMCDJetOs, aod::BplusCMCDJetSSOs, aod::BplusCMCDJetMOs, soa::Join, soa::Join, aod::BplusCMCPJetCOs, aod::BplusCMCPJetOs, aod::BplusCMCPJetSSOs, aod::BplusCMCPJetMOs, soa::Join, aod::BplusCEWSJetCOs, aod::BplusCEWSJetOs, aod::BplusCEWSJetSSOs, aod::BplusCEWSJetMOs, aod::StoredHfBplusCollBase, aod::StoredHfBplusBases, aod::StoredHfBplusPars, aod::StoredHfBplusParEs, aod::StoredHfBplusParD0s, aod::StoredHfBplusSels, aod::StoredHfBplusMls, aod::StoredHfBplusMlD0s, aod::StoredHfBplusMcs, aod::StoredHfBplusMcCollBases, aod::StoredHfBplusMcRCollIds, aod::StoredHfBplusPBases>; // all the 3P tables have been made into Bplus but they might be made common +using JetSubstructureOutputBplus = JetSubstructureHFOutputTask, aod::CandidatesBplusData, aod::CandidatesBplusMCD, aod::CandidatesBplusMCP, aod::BkgBplusRhos, aod::BkgBplusMcRhos, aod::JTrackBplusSubs, soa::Join, soa::Join, soa::Join, soa::Join, aod::BplusCJetCOs, aod::BplusCJetOs, aod::BplusCJetSSOs, aod::BplusCJetMOs, soa::Join, soa::Join, soa::Join, aod::BplusCMCDJetCOs, aod::BplusCMCDJetOs, aod::BplusCMCDJetSSOs, aod::BplusCMCDJetMOs, soa::Join, soa::Join, soa::Join, soa::Join, aod::BplusCMCPJetCOs, aod::BplusCMCPJetOs, aod::BplusCMCPJetSSOs, aod::BplusCMCPJetMOs, soa::Join, soa::Join, soa::Join, aod::BplusCEWSJetCOs, aod::BplusCEWSJetOs, aod::BplusCEWSJetSSOs, aod::BplusCEWSJetMOs, aod::StoredHfBplusCollBase, aod::StoredHfBplusBases, aod::StoredHfBplusPars, aod::StoredHfBplusParEs, aod::StoredHfBplusParD0s, aod::StoredHfBplusSels, aod::StoredHfBplusMls, aod::StoredHfBplusMlD0s, aod::StoredHfBplusMcs, aod::StoredHfBplusMcCollBases, aod::StoredHfBplusMcRCollIds, aod::StoredHfBplusPBases>; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGJE/Tasks/jetSubstructureD0.cxx b/PWGJE/Tasks/jetSubstructureD0.cxx index 96760654a3a..593c5294a9c 100644 --- a/PWGJE/Tasks/jetSubstructureD0.cxx +++ b/PWGJE/Tasks/jetSubstructureD0.cxx @@ -13,9 +13,10 @@ // /// \author Nima Zardoshti +#include #include "PWGJE/Tasks/jetSubstructureHF.cxx" -using JetSubstructureD0 = JetSubstructureHFTask, soa::Join, soa::Join, soa::Join, aod::CandidatesD0Data, aod::CandidatesD0MCP, aod::D0CJetSSs, aod::D0CMCDJetSSs, aod::D0CMCPJetSSs, aod::D0CEWSJetSSs, aod::JTrackD0Subs>; +using JetSubstructureD0 = JetSubstructureHFTask, soa::Join, soa::Join, soa::Join, aod::CandidatesD0Data, aod::CandidatesD0MCP, aod::D0CJetSSs, aod::D0ChargedSPs, aod::D0ChargedPRs, aod::D0CMCDJetSSs, aod::D0ChargedMCDetectorLevelSPs, aod::D0ChargedMCDetectorLevelPRs, aod::D0CMCPJetSSs, aod::D0ChargedMCParticleLevelSPs, aod::D0ChargedMCParticleLevelPRs, aod::D0CEWSJetSSs, aod::D0ChargedEventWiseSubtractedSPs, aod::D0ChargedEventWiseSubtractedPRs, aod::JTrackD0Subs>; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGJE/Tasks/jetSubstructureD0Output.cxx b/PWGJE/Tasks/jetSubstructureD0Output.cxx index 5a436b70eba..ca6d9856b62 100644 --- a/PWGJE/Tasks/jetSubstructureD0Output.cxx +++ b/PWGJE/Tasks/jetSubstructureD0Output.cxx @@ -13,9 +13,10 @@ // /// \author Nima Zardoshti +#include #include "PWGJE/Tasks/jetSubstructureHFOutput.cxx" -using JetSubstructureOutputD0 = JetSubstructureHFOutputTask, aod::CandidatesD0Data, aod::CandidatesD0MCD, aod::CandidatesD0MCP, aod::JTrackD0Subs, soa::Join, soa::Join, aod::D0CJetCOs, aod::D0CJetOs, aod::D0CJetSSOs, aod::D0CJetMOs, soa::Join, aod::D0CMCDJetCOs, aod::D0CMCDJetOs, aod::D0CMCDJetSSOs, aod::D0CMCDJetMOs, soa::Join, soa::Join, aod::D0CMCPJetCOs, aod::D0CMCPJetOs, aod::D0CMCPJetSSOs, aod::D0CMCPJetMOs, soa::Join, aod::D0CEWSJetCOs, aod::D0CEWSJetOs, aod::D0CEWSJetSSOs, aod::D0CEWSJetMOs, aod::StoredHfD0CollBase, aod::StoredHfD0Bases, aod::StoredHfD0Pars, aod::StoredHfD0ParEs, aod::JDumD0ParDaus, aod::StoredHfD0Sels, aod::StoredHfD0Mls, aod::JDumD0MlDaus, aod::StoredHfD0Mcs, aod::StoredHfD0McCollBases, aod::StoredHfD0McRCollIds, aod::StoredHfD0PBases>; +using JetSubstructureOutputD0 = JetSubstructureHFOutputTask, aod::CandidatesD0Data, aod::CandidatesD0MCD, aod::CandidatesD0MCP, aod::BkgD0Rhos, aod::BkgD0McRhos, aod::JTrackD0Subs, soa::Join, soa::Join, soa::Join, soa::Join, aod::D0CJetCOs, aod::D0CJetOs, aod::D0CJetSSOs, aod::D0CJetMOs, soa::Join, soa::Join, soa::Join, aod::D0CMCDJetCOs, aod::D0CMCDJetOs, aod::D0CMCDJetSSOs, aod::D0CMCDJetMOs, soa::Join, soa::Join, soa::Join, soa::Join, aod::D0CMCPJetCOs, aod::D0CMCPJetOs, aod::D0CMCPJetSSOs, aod::D0CMCPJetMOs, soa::Join, soa::Join, soa::Join, aod::D0CEWSJetCOs, aod::D0CEWSJetOs, aod::D0CEWSJetSSOs, aod::D0CEWSJetMOs, aod::StoredHfD0CollBase, aod::StoredHfD0Bases, aod::StoredHfD0Pars, aod::StoredHfD0ParEs, aod::JDumD0ParDaus, aod::StoredHfD0Sels, aod::StoredHfD0Mls, aod::JDumD0MlDaus, aod::StoredHfD0Mcs, aod::StoredHfD0McCollBases, aod::StoredHfD0McRCollIds, aod::StoredHfD0PBases>; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGJE/Tasks/jetSubstructureDielectron.cxx b/PWGJE/Tasks/jetSubstructureDielectron.cxx index e5532cce52e..665d0f2f636 100644 --- a/PWGJE/Tasks/jetSubstructureDielectron.cxx +++ b/PWGJE/Tasks/jetSubstructureDielectron.cxx @@ -13,9 +13,10 @@ // /// \author Nima Zardoshti +#include #include "PWGJE/Tasks/jetSubstructureHF.cxx" -using JetSubstructureDielectron = JetSubstructureHFTask, soa::Join, soa::Join, soa::Join, aod::CandidatesDielectronData, aod::CandidatesDielectronMCP, aod::DielectronCJetSSs, aod::DielectronCMCDJetSSs, aod::DielectronCMCPJetSSs, aod::DielectronCEWSJetSSs, aod::JTrackDielectronSubs>; +using JetSubstructureDielectron = JetSubstructureHFTask, soa::Join, soa::Join, soa::Join, aod::CandidatesDielectronData, aod::CandidatesDielectronMCP, aod::DielectronCJetSSs, aod::DielectronChargedSPs, aod::DielectronChargedPRs, aod::DielectronCMCDJetSSs, aod::DielectronChargedMCDetectorLevelSPs, aod::DielectronChargedMCDetectorLevelPRs, aod::DielectronCMCPJetSSs, aod::DielectronChargedMCParticleLevelSPs, aod::DielectronChargedMCParticleLevelPRs, aod::DielectronCEWSJetSSs, aod::DielectronChargedEventWiseSubtractedSPs, aod::DielectronChargedEventWiseSubtractedPRs, aod::JTrackDielectronSubs>; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGJE/Tasks/jetSubstructureDielectronOutput.cxx b/PWGJE/Tasks/jetSubstructureDielectronOutput.cxx index 683fad5a292..384c2c3343c 100644 --- a/PWGJE/Tasks/jetSubstructureDielectronOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureDielectronOutput.cxx @@ -13,9 +13,10 @@ // /// \author Nima Zardoshti +#include #include "PWGJE/Tasks/jetSubstructureHFOutput.cxx" -using JetSubstructureOutputDielectron = JetSubstructureHFOutputTask, soa::Join, aod::DielectronCJetCOs, aod::DielectronCJetOs, aod::DielectronCJetSSOs, aod::DielectronCJetMOs, soa::Join, aod::DielectronCMCDJetCOs, aod::DielectronCMCDJetOs, aod::DielectronCMCDJetSSOs, aod::DielectronCMCDJetMOs, soa::Join, soa::Join, aod::DielectronCMCPJetCOs, aod::DielectronCMCPJetOs, aod::DielectronCMCPJetSSOs, aod::DielectronCMCPJetMOs, soa::Join, aod::DielectronCEWSJetCOs, aod::DielectronCEWSJetOs, aod::DielectronCEWSJetSSOs, aod::DielectronCEWSJetMOs, aod::StoredReducedEvents, aod::StoredDielectrons, aod::JDielectron1Dummys, aod::JDielectron2Dummys, aod::JDielectron3Dummys, aod::JDielectron4Dummys, aod::JDielectron5Dummys, aod::JDielectron6Dummys, aod::JDielectron7Dummys, aod::StoredJDielectronMcCollisions, aod::JDielectron8Dummys, aod::StoredJDielectronMcs>; +using JetSubstructureOutputDielectron = JetSubstructureHFOutputTask, soa::Join, soa::Join, soa::Join, aod::DielectronCJetCOs, aod::DielectronCJetOs, aod::DielectronCJetSSOs, aod::DielectronCJetMOs, soa::Join, soa::Join, soa::Join, aod::DielectronCMCDJetCOs, aod::DielectronCMCDJetOs, aod::DielectronCMCDJetSSOs, aod::DielectronCMCDJetMOs, soa::Join, soa::Join, soa::Join, soa::Join, aod::DielectronCMCPJetCOs, aod::DielectronCMCPJetOs, aod::DielectronCMCPJetSSOs, aod::DielectronCMCPJetMOs, soa::Join, soa::Join, soa::Join, aod::DielectronCEWSJetCOs, aod::DielectronCEWSJetOs, aod::DielectronCEWSJetSSOs, aod::DielectronCEWSJetMOs, aod::StoredReducedEvents, aod::StoredDielectrons, aod::JDielectron1Dummys, aod::JDielectron2Dummys, aod::JDielectron3Dummys, aod::JDielectron4Dummys, aod::JDielectron5Dummys, aod::JDielectron6Dummys, aod::JDielectron7Dummys, aod::StoredJDielectronMcCollisions, aod::JDielectron8Dummys, aod::StoredJDielectronMcs>; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGJE/Tasks/jetSubstructureDplus.cxx b/PWGJE/Tasks/jetSubstructureDplus.cxx index ecf1b714b50..1aee6336c8d 100644 --- a/PWGJE/Tasks/jetSubstructureDplus.cxx +++ b/PWGJE/Tasks/jetSubstructureDplus.cxx @@ -13,9 +13,10 @@ // /// \author Nima Zardoshti +#include #include "PWGJE/Tasks/jetSubstructureHF.cxx" -using JetSubstructureDplus = JetSubstructureHFTask, soa::Join, soa::Join, soa::Join, aod::CandidatesDplusData, aod::CandidatesDplusMCP, aod::DplusCJetSSs, aod::DplusCMCDJetSSs, aod::DplusCMCPJetSSs, aod::DplusCEWSJetSSs, aod::JTrackDplusSubs>; +using JetSubstructureDplus = JetSubstructureHFTask, soa::Join, soa::Join, soa::Join, aod::CandidatesDplusData, aod::CandidatesDplusMCP, aod::DplusCJetSSs, aod::DplusChargedSPs, aod::DplusChargedPRs, aod::DplusCMCDJetSSs, aod::DplusChargedMCDetectorLevelSPs, aod::DplusChargedMCDetectorLevelPRs, aod::DplusCMCPJetSSs, aod::DplusChargedMCParticleLevelSPs, aod::DplusChargedMCParticleLevelPRs, aod::DplusCEWSJetSSs, aod::DplusChargedEventWiseSubtractedSPs, aod::DplusChargedEventWiseSubtractedPRs, aod::JTrackDplusSubs>; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGJE/Tasks/jetSubstructureDplusOutput.cxx b/PWGJE/Tasks/jetSubstructureDplusOutput.cxx index fdeb356993c..f271c96ca9c 100644 --- a/PWGJE/Tasks/jetSubstructureDplusOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureDplusOutput.cxx @@ -13,9 +13,10 @@ // /// \author Nima Zardoshti +#include #include "PWGJE/Tasks/jetSubstructureHFOutput.cxx" -using JetSubstructureOutputDplus = JetSubstructureHFOutputTask, aod::CandidatesDplusData, aod::CandidatesDplusMCD, aod::CandidatesDplusMCP, aod::JTrackDplusSubs, soa::Join, soa::Join, aod::DplusCJetCOs, aod::DplusCJetOs, aod::DplusCJetSSOs, aod::DplusCJetMOs, soa::Join, aod::DplusCMCDJetCOs, aod::DplusCMCDJetOs, aod::DplusCMCDJetSSOs, aod::DplusCMCDJetMOs, soa::Join, soa::Join, aod::DplusCMCPJetCOs, aod::DplusCMCPJetOs, aod::DplusCMCPJetSSOs, aod::DplusCMCPJetMOs, soa::Join, aod::DplusCEWSJetCOs, aod::DplusCEWSJetOs, aod::DplusCEWSJetSSOs, aod::DplusCEWSJetMOs, aod::StoredHfDplusCollBase, aod::StoredHfDplusBases, aod::StoredHfDplusPars, aod::StoredHfDplusParEs, aod::JDumDplusParDaus, aod::StoredHfDplusSels, aod::StoredHfDplusMls, aod::JDumDplusMlDaus, aod::StoredHfDplusMcs, aod::StoredHfDplusMcCollBases, aod::StoredHfDplusMcRCollIds, aod::StoredHfDplusPBases>; +using JetSubstructureOutputDplus = JetSubstructureHFOutputTask, aod::CandidatesDplusData, aod::CandidatesDplusMCD, aod::CandidatesDplusMCP, aod::BkgDplusRhos, aod::BkgDplusMcRhos, aod::JTrackDplusSubs, soa::Join, soa::Join, soa::Join, soa::Join, aod::DplusCJetCOs, aod::DplusCJetOs, aod::DplusCJetSSOs, aod::DplusCJetMOs, soa::Join, soa::Join, soa::Join, aod::DplusCMCDJetCOs, aod::DplusCMCDJetOs, aod::DplusCMCDJetSSOs, aod::DplusCMCDJetMOs, soa::Join, soa::Join, soa::Join, soa::Join, aod::DplusCMCPJetCOs, aod::DplusCMCPJetOs, aod::DplusCMCPJetSSOs, aod::DplusCMCPJetMOs, soa::Join, soa::Join, soa::Join, aod::DplusCEWSJetCOs, aod::DplusCEWSJetOs, aod::DplusCEWSJetSSOs, aod::DplusCEWSJetMOs, aod::StoredHfDplusCollBase, aod::StoredHfDplusBases, aod::StoredHfDplusPars, aod::StoredHfDplusParEs, aod::JDumDplusParDaus, aod::StoredHfDplusSels, aod::StoredHfDplusMls, aod::JDumDplusMlDaus, aod::StoredHfDplusMcs, aod::StoredHfDplusMcCollBases, aod::StoredHfDplusMcRCollIds, aod::StoredHfDplusPBases>; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGJE/Tasks/jetSubstructureHF.cxx b/PWGJE/Tasks/jetSubstructureHF.cxx index 1e6c2c41d4c..edcf381e335 100644 --- a/PWGJE/Tasks/jetSubstructureHF.cxx +++ b/PWGJE/Tasks/jetSubstructureHF.cxx @@ -15,6 +15,7 @@ // #include +#include #include "fastjet/PseudoJet.hh" #include "fastjet/ClusterSequenceArea.hh" @@ -36,6 +37,8 @@ #include "PWGJE/Core/JetFinder.h" #include "PWGJE/Core/FastJetUtilities.h" #include "PWGJE/Core/JetUtilities.h" +#include "PWGJE/Core/JetHFUtilities.h" +#include "PWGJE/Core/JetDQUtilities.h" #include "PWGJE/Core/JetSubstructureUtilities.h" using namespace o2; @@ -45,13 +48,23 @@ using namespace o2::framework::expressions; // NB: runDataProcessing.h must be included after customize! #include "Framework/runDataProcessing.h" -template +template struct JetSubstructureHFTask { Produces jetSubstructureDataTable; Produces jetSubstructureMCDTable; Produces jetSubstructureMCPTable; Produces jetSubstructureDataSubTable; + Produces jetSplittingsDataTable; + Produces jetSplittingsMCDTable; + Produces jetSplittingsMCPTable; + Produces jetSplittingsDataSubTable; + + Produces jetPairsDataTable; + Produces jetPairsMCDTable; + Produces jetPairsMCPTable; + Produces jetPairsDataSubTable; + // Jet level configurables Configurable zCut{"zCut", 0.1, "soft drop z cut"}; Configurable beta{"beta", 0.0, "soft drop beta"}; @@ -71,11 +84,21 @@ struct JetSubstructureHFTask { std::vector ptSubLeadingVec; std::vector thetaVec; std::vector nSub; - std::vector pairPtVec; - std::vector pairEnergyVec; - std::vector pairThetaVec; + std::vector pairJetPtVec; + std::vector pairJetEnergyVec; + std::vector pairJetThetaVec; + std::vector pairJetPerpCone1PtVec; + std::vector pairJetPerpCone1EnergyVec; + std::vector pairJetPerpCone1ThetaVec; + std::vector pairPerpCone1PerpCone1PtVec; + std::vector pairPerpCone1PerpCone1EnergyVec; + std::vector pairPerpCone1PerpCone1ThetaVec; + std::vector pairPerpCone1PerpCone2PtVec; + std::vector pairPerpCone1PerpCone2EnergyVec; + std::vector pairPerpCone1PerpCone2ThetaVec; float angularity; float leadingConstituentPt; + float perpConeRho; HistogramRegistry registry; void init(InitContext const&) @@ -98,8 +121,34 @@ struct JetSubstructureHFTask { candMass = jetcandidateutilities::getTablePDGMass(); } - template - void jetReclustering(T const& jet) + Preslice TracksPerCollision = aod::jtrack::collisionId; + PresliceOptional TracksPerD0DataSub = aod::bkgd0::candidateId; + PresliceOptional TracksPerDplusDataSub = aod::bkgdplus::candidateId; + PresliceOptional TracksPerLcDataSub = aod::bkglc::candidateId; + PresliceOptional TracksPerBplusDataSub = aod::bkgbplus::candidateId; + PresliceOptional TracksPerDielectronDataSub = aod::bkgdielectron::candidateId; + Preslice ParticlesPerMcCollision = aod::jmcparticle::mcCollisionId; + + template + auto selectSlicer(T const& D0Slicer, U const& DplusSlicer, V const& LcSlicer, M const& BplusSlicer, N const& DielectronSlicer) + { + if constexpr (jethfutilities::isD0Table()) { + return D0Slicer; + } else if constexpr (jethfutilities::isDplusTable()) { + return DplusSlicer; + } else if constexpr (jethfutilities::isLcTable()) { + return LcSlicer; + } else if constexpr (jethfutilities::isBplusTable()) { + return BplusSlicer; + } else if constexpr (jetdqutilities::isDielectronTable()) { + return DielectronSlicer; + } else { + return D0Slicer; + } + } + + template + void jetReclustering(T const& jet, U& splittingTable) { energyMotherVec.clear(); ptLeadingVec.clear(); @@ -127,6 +176,18 @@ struct JetSubstructureHFTask { if (!isHFInSubjet1) { std::swap(parentSubJet1, parentSubJet2); } + std::vector tracks; + std::vector candidates; + std::vector clusters; + for (const auto& constituent : sorted_by_pt(parentSubJet2.constituents())) { + if (constituent.template user_info().getStatus() == static_cast(JetConstituentStatus::track)) { + tracks.push_back(constituent.template user_info().getIndex()); + } + if (constituent.template user_info().getStatus() == static_cast(JetConstituentStatus::candidate)) { + candidates.push_back(constituent.template user_info().getIndex()); + } + } + splittingTable(jet.globalIndex(), tracks, clusters, candidates, parentSubJet2.perp(), parentSubJet2.eta(), parentSubJet2.phi(), 0); auto z = parentSubJet2.perp() / (parentSubJet1.perp() + parentSubJet2.perp()); auto theta = parentSubJet1.delta_R(parentSubJet2); energyMotherVec.push_back(daughterSubJet.e()); @@ -166,49 +227,149 @@ struct JetSubstructureHFTask { } } - template - void jetPairing(T const& jet, U const& /*tracks*/, V const& /*candidates*/) + template + void jetPairing(T const& jet, U const& tracks, V const& /*candidates*/, M const& slicer, N& pairTable) { - pairPtVec.clear(); - pairEnergyVec.clear(); - pairThetaVec.clear(); + pairJetPtVec.clear(); + pairJetEnergyVec.clear(); + pairJetThetaVec.clear(); std::vector> tracksVec; std::vector> candidatesVec; + std::vector tracksVecIds; + std::vector candidatesVecIds; for (auto& constituent : jet.template tracks_as()) { if (constituent.pt() >= pairConstituentPtMin) { tracksVec.push_back(constituent); + tracksVecIds.push_back(constituent.globalIndex()); } } for (auto& candidate : jet.template candidates_as()) { candidatesVec.push_back(candidate); + candidatesVecIds.push_back(candidate.globalIndex()); } if (tracksVec.size() >= 1) { for (typename std::vector>::size_type track1Index = 0; track1Index < tracksVec.size(); track1Index++) { - for (typename std::vector>::size_type track2Index = 0; track2Index < tracksVec.size(); track2Index++) { - pairPtVec.push_back(tracksVec.at(track1Index).pt() * tracksVec.at(track2Index).pt()); - pairEnergyVec.push_back(tracksVec.at(track1Index).energy() * tracksVec.at(track2Index).energy()); - pairThetaVec.push_back(jetutilities::deltaR(tracksVec.at(track1Index), tracksVec.at(track2Index))); + for (typename std::vector>::size_type track2Index = track1Index + 1; track2Index < tracksVec.size(); track2Index++) { + pairJetPtVec.push_back(tracksVec.at(track1Index).pt() * tracksVec.at(track2Index).pt()); + pairJetEnergyVec.push_back(2.0 * tracksVec.at(track1Index).energy() * tracksVec.at(track2Index).energy()); + pairJetThetaVec.push_back(jetutilities::deltaR(tracksVec.at(track1Index), tracksVec.at(track2Index))); + pairTable(jet.globalIndex(), tracksVecIds.at(track1Index), tracksVecIds.at(track2Index), -1, -1); } } } if (candidatesVec.size() >= 1) { for (typename std::vector>::size_type candidate1Index = 0; candidate1Index < candidatesVec.size(); candidate1Index++) { - for (typename std::vector>::size_type candidate2Index = 0; candidate2Index < candidatesVec.size(); candidate2Index++) { - pairPtVec.push_back(candidatesVec.at(candidate1Index).pt() * candidatesVec.at(candidate2Index).pt()); + for (typename std::vector>::size_type candidate2Index = candidate1Index + 1; candidate2Index < candidatesVec.size(); candidate2Index++) { + pairJetPtVec.push_back(candidatesVec.at(candidate1Index).pt() * candidatesVec.at(candidate2Index).pt()); auto candidate1Energy = std::sqrt((candidatesVec.at(candidate1Index).p() * candidatesVec.at(candidate1Index).p()) + (candMass * candMass)); auto candidate2Energy = std::sqrt((candidatesVec.at(candidate2Index).p() * candidatesVec.at(candidate2Index).p()) + (candMass * candMass)); - pairEnergyVec.push_back(candidate1Energy * candidate2Energy); - pairThetaVec.push_back(jetutilities::deltaR(candidatesVec.at(candidate1Index), candidatesVec.at(candidate2Index))); + pairJetEnergyVec.push_back(2.0 * candidate1Energy * candidate2Energy); + pairJetThetaVec.push_back(jetutilities::deltaR(candidatesVec.at(candidate1Index), candidatesVec.at(candidate2Index))); + pairTable(jet.globalIndex(), -1, -1, candidatesVecIds.at(candidate1Index), candidatesVecIds.at(candidate2Index)); } } } if (candidatesVec.size() >= 1 && tracksVec.size() >= 1) { for (typename std::vector>::size_type candidateIndex = 0; candidateIndex < candidatesVec.size(); candidateIndex++) { // could just directly get the candidate and tracks here but keeping it consistent with above for (typename std::vector>::size_type trackIndex = 0; trackIndex < tracksVec.size(); trackIndex++) { - pairPtVec.push_back(candidatesVec.at(candidateIndex).pt() * tracksVec.at(trackIndex).pt()); + pairJetPtVec.push_back(candidatesVec.at(candidateIndex).pt() * tracksVec.at(trackIndex).pt()); auto candidateEnergy = std::sqrt((candidatesVec.at(candidateIndex).p() * candidatesVec.at(candidateIndex).p()) + (candMass * candMass)); - pairEnergyVec.push_back(candidateEnergy * tracksVec.at(trackIndex).energy()); - pairThetaVec.push_back(jetutilities::deltaR(candidatesVec.at(candidateIndex), tracksVec.at(trackIndex))); + pairJetEnergyVec.push_back(2.0 * candidateEnergy * tracksVec.at(trackIndex).energy()); + pairJetThetaVec.push_back(jetutilities::deltaR(candidatesVec.at(candidateIndex), tracksVec.at(trackIndex))); + pairTable(jet.globalIndex(), tracksVecIds.at(trackIndex), -1, candidatesVecIds.at(candidateIndex), -1); + } + } + } + + pairJetPerpCone1PtVec.clear(); + pairJetPerpCone1EnergyVec.clear(); + pairJetPerpCone1ThetaVec.clear(); + pairPerpCone1PerpCone1PtVec.clear(); + pairPerpCone1PerpCone1EnergyVec.clear(); + pairPerpCone1PerpCone1ThetaVec.clear(); + pairPerpCone1PerpCone2PtVec.clear(); + pairPerpCone1PerpCone2EnergyVec.clear(); + pairPerpCone1PerpCone2ThetaVec.clear(); + int32_t slicerId = -1; + if constexpr (isSubtracted) { + auto const& candidate = jet.template candidates_first_as(); + slicerId = candidate.globalIndex(); + } else { + if constexpr (!isMC) { + slicerId = jet.collisionId(); + } else { + slicerId = jet.mcCollisionId(); + } + } + auto tracksPerCollision = tracks.sliceBy(slicer, slicerId); + + float perpCone1Phi = RecoDecay::constrainAngle(jet.phi() + (M_PI / 2.)); + float perpCone2Phi = RecoDecay::constrainAngle(jet.phi() - (M_PI / 2.)); + float perpCone1Pt = 0.0; + float perpCone2Pt = 0.0; + std::vector tracksPerpCone1Vec; + std::vector tracksPerpCone2Vec; + for (auto const& track : tracksPerCollision) { + float deltaPhi1 = track.phi() - perpCone1Phi; + deltaPhi1 = RecoDecay::constrainAngle(deltaPhi1, -M_PI); + float deltaPhi2 = track.phi() - perpCone2Phi; + deltaPhi2 = RecoDecay::constrainAngle(deltaPhi2, -M_PI); + float deltaEta = jet.eta() - track.eta(); + + if (TMath::Sqrt((deltaPhi1 * deltaPhi1) + (deltaEta * deltaEta)) <= jet.r() / 100.0) { + tracksPerpCone1Vec.push_back(track); + perpCone1Pt += track.pt(); + } + if (TMath::Sqrt((deltaPhi2 * deltaPhi2) + (deltaEta * deltaEta)) <= jet.r() / 100.0) { + tracksPerpCone2Vec.push_back(track); + perpCone2Pt += track.pt(); + } + } + perpConeRho = (perpCone1Pt + perpCone2Pt) / (2 * M_PI * (jet.r() / 100.0) * (jet.r() / 100.0)); // currently done per jet - could be better to do for leading jet if pushing to very low pT + + if (tracksVec.size() >= 1 && tracksPerpCone1Vec.size() >= 1) { + for (typename std::vector::size_type track1Index = 0; track1Index < tracksVec.size(); track1Index++) { + for (typename std::vector::size_type track2Index = 0; track2Index < tracksPerpCone1Vec.size(); track2Index++) { + pairJetPerpCone1PtVec.push_back(tracksVec.at(track1Index).pt() * tracksPerpCone1Vec.at(track2Index).pt()); + pairJetPerpCone1EnergyVec.push_back(2.0 * tracksVec.at(track1Index).energy() * tracksPerpCone1Vec.at(track2Index).energy()); + float dPhi = RecoDecay::constrainAngle(tracksVec.at(track1Index).phi() - (tracksPerpCone1Vec.at(track2Index).phi() - (M_PI / 2.)), -M_PI); + float dEta = tracksVec.at(track1Index).eta() - tracksPerpCone1Vec.at(track2Index).eta(); + pairJetPerpCone1ThetaVec.push_back(std::sqrt(dEta * dEta + dPhi * dPhi)); + } + } + } + + if (candidatesVec.size() >= 1 && tracksPerpCone1Vec.size() >= 1) { + for (typename std::vector>::size_type candidate1Index = 0; candidate1Index < candidatesVec.size(); candidate1Index++) { + for (typename std::vector::size_type track2Index = 0; track2Index < tracksPerpCone1Vec.size(); track2Index++) { + pairJetPerpCone1PtVec.push_back(candidatesVec.at(candidate1Index).pt() * tracksPerpCone1Vec.at(track2Index).pt()); + auto candidate1Energy = std::sqrt((candidatesVec.at(candidate1Index).p() * candidatesVec.at(candidate1Index).p()) + (candMass * candMass)); + pairJetPerpCone1EnergyVec.push_back(2.0 * candidate1Energy * tracksPerpCone1Vec.at(track2Index).energy()); + float dPhi = RecoDecay::constrainAngle(candidatesVec.at(candidate1Index).phi() - (tracksPerpCone1Vec.at(track2Index).phi() - (M_PI / 2.)), -M_PI); + float dEta = candidatesVec.at(candidate1Index).eta() - tracksPerpCone1Vec.at(track2Index).eta(); + pairJetPerpCone1ThetaVec.push_back(std::sqrt(dEta * dEta + dPhi * dPhi)); + } + } + } + + if (tracksPerpCone1Vec.size() >= 1) { + for (typename std::vector::size_type track1Index = 0; track1Index < tracksPerpCone1Vec.size(); track1Index++) { + for (typename std::vector::size_type track2Index = track1Index + 1; track2Index < tracksPerpCone1Vec.size(); track2Index++) { + pairPerpCone1PerpCone1PtVec.push_back(tracksPerpCone1Vec.at(track1Index).pt() * tracksPerpCone1Vec.at(track2Index).pt()); + pairPerpCone1PerpCone1EnergyVec.push_back(2.0 * tracksPerpCone1Vec.at(track1Index).energy() * tracksPerpCone1Vec.at(track2Index).energy()); + pairPerpCone1PerpCone1ThetaVec.push_back(jetutilities::deltaR(tracksPerpCone1Vec.at(track1Index), tracksPerpCone1Vec.at(track2Index))); + } + } + } + + if (tracksPerpCone1Vec.size() >= 1 && tracksPerpCone2Vec.size() >= 1) { + for (typename std::vector::size_type track1Index = 0; track1Index < tracksPerpCone1Vec.size(); track1Index++) { + for (typename std::vector::size_type track2Index = 0; track2Index < tracksPerpCone2Vec.size(); track2Index++) { + pairPerpCone1PerpCone2PtVec.push_back(tracksPerpCone1Vec.at(track1Index).pt() * tracksPerpCone2Vec.at(track2Index).pt()); + pairPerpCone1PerpCone2EnergyVec.push_back(2.0 * tracksPerpCone1Vec.at(track1Index).energy() * tracksPerpCone2Vec.at(track2Index).energy()); + float dPhi = RecoDecay::constrainAngle((tracksPerpCone1Vec.at(track1Index).phi() - (M_PI / 2.)) - (tracksPerpCone2Vec.at(track2Index).phi() + (M_PI / 2.)), -M_PI); + float dEta = tracksPerpCone1Vec.at(track1Index).eta() - tracksPerpCone2Vec.at(track2Index).eta(); + pairPerpCone1PerpCone2ThetaVec.push_back(std::sqrt(dEta * dEta + dPhi * dPhi)); } } } @@ -234,8 +395,8 @@ struct JetSubstructureHFTask { angularity /= (jet.pt() * (jet.r() / 100.f)); } - template - void analyseCharged(T const& jet, U const& tracks, V const& candidates, M& outputTable) + template + void analyseCharged(T const& jet, U const& tracks, V const& candidates, M const& trackSlicer, N& outputTable, O& splittingTable, P& pairTable) { jetConstituents.clear(); for (auto& jetConstituent : jet.template tracks_as()) { @@ -245,17 +406,17 @@ struct JetSubstructureHFTask { fastjetutilities::fillTracks(jetHFCandidate, jetConstituents, jetHFCandidate.globalIndex(), static_cast(JetConstituentStatus::candidate), candMass); } nSub = jetsubstructureutilities::getNSubjettiness(jet, tracks, tracks, candidates, 2, fastjet::contrib::CA_Axes(), true, zCut, beta); - jetReclustering(jet); - jetPairing(jet, tracks, candidates); + jetReclustering(jet, splittingTable); + jetPairing(jet, tracks, candidates, trackSlicer, pairTable); jetSubstructureSimple(jet, tracks, candidates); - outputTable(energyMotherVec, ptLeadingVec, ptSubLeadingVec, thetaVec, nSub[0], nSub[1], nSub[2], pairPtVec, pairEnergyVec, pairThetaVec, angularity, leadingConstituentPt); + outputTable(energyMotherVec, ptLeadingVec, ptSubLeadingVec, thetaVec, nSub[0], nSub[1], nSub[2], pairJetPtVec, pairJetEnergyVec, pairJetThetaVec, pairJetPerpCone1PtVec, pairJetPerpCone1EnergyVec, pairJetPerpCone1ThetaVec, pairPerpCone1PerpCone1PtVec, pairPerpCone1PerpCone1EnergyVec, pairPerpCone1PerpCone1ThetaVec, pairPerpCone1PerpCone2PtVec, pairPerpCone1PerpCone2EnergyVec, pairPerpCone1PerpCone2ThetaVec, angularity, leadingConstituentPt, perpConeRho); } void processChargedJetsData(typename JetTableData::iterator const& jet, CandidateTable const& candidates, aod::JetTracks const& tracks) { - analyseCharged(jet, tracks, candidates, jetSubstructureDataTable); + analyseCharged(jet, tracks, candidates, TracksPerCollision, jetSubstructureDataTable, jetSplittingsDataTable, jetPairsDataTable); } PROCESS_SWITCH(JetSubstructureHFTask, processChargedJetsData, "HF jet substructure on data", false); @@ -263,7 +424,7 @@ struct JetSubstructureHFTask { CandidateTable const& candidates, TracksSub const& tracks) { - analyseCharged(jet, tracks, candidates, jetSubstructureDataSubTable); + analyseCharged(jet, tracks, candidates, selectSlicer(TracksPerD0DataSub, TracksPerDplusDataSub, TracksPerLcDataSub, TracksPerBplusDataSub, TracksPerDielectronDataSub), jetSubstructureDataSubTable, jetSplittingsDataSubTable, jetPairsDataSubTable); } PROCESS_SWITCH(JetSubstructureHFTask, processChargedJetsDataSub, "HF jet substructure on data", false); @@ -271,7 +432,7 @@ struct JetSubstructureHFTask { CandidateTable const& candidates, aod::JetTracks const& tracks) { - analyseCharged(jet, tracks, candidates, jetSubstructureMCDTable); + analyseCharged(jet, tracks, candidates, TracksPerCollision, jetSubstructureMCDTable, jetSplittingsMCDTable, jetPairsMCDTable); } PROCESS_SWITCH(JetSubstructureHFTask, processChargedJetsMCD, "HF jet substructure on data", false); @@ -287,10 +448,10 @@ struct JetSubstructureHFTask { fastjetutilities::fillTracks(jetHFCandidate, jetConstituents, jetHFCandidate.globalIndex(), static_cast(JetConstituentStatus::candidate), candMass); } nSub = jetsubstructureutilities::getNSubjettiness(jet, particles, particles, candidates, 2, fastjet::contrib::CA_Axes(), true, zCut, beta); - jetReclustering(jet); - jetPairing(jet, particles, candidates); + jetReclustering(jet, jetSplittingsMCPTable); + jetPairing(jet, particles, candidates, ParticlesPerMcCollision, jetPairsMCPTable); jetSubstructureSimple(jet, particles, candidates); - jetSubstructureMCPTable(energyMotherVec, ptLeadingVec, ptSubLeadingVec, thetaVec, nSub[0], nSub[1], nSub[2], pairPtVec, pairEnergyVec, pairThetaVec, angularity, leadingConstituentPt); + jetSubstructureMCPTable(energyMotherVec, ptLeadingVec, ptSubLeadingVec, thetaVec, nSub[0], nSub[1], nSub[2], pairJetPtVec, pairJetEnergyVec, pairJetThetaVec, pairJetPerpCone1PtVec, pairJetPerpCone1EnergyVec, pairJetPerpCone1ThetaVec, pairPerpCone1PerpCone1PtVec, pairPerpCone1PerpCone1EnergyVec, pairPerpCone1PerpCone1ThetaVec, pairPerpCone1PerpCone2PtVec, pairPerpCone1PerpCone2EnergyVec, pairPerpCone1PerpCone2ThetaVec, angularity, leadingConstituentPt, perpConeRho); } PROCESS_SWITCH(JetSubstructureHFTask, processChargedJetsMCP, "HF jet substructure on MC particle level", false); }; diff --git a/PWGJE/Tasks/jetSubstructureHFOutput.cxx b/PWGJE/Tasks/jetSubstructureHFOutput.cxx index bf39e45ca95..d9caeed7ede 100644 --- a/PWGJE/Tasks/jetSubstructureHFOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureHFOutput.cxx @@ -45,48 +45,51 @@ using namespace o2::framework::expressions; // NB: runDataProcessing.h must be included after customize! #include "Framework/runDataProcessing.h" -template +template struct JetSubstructureHFOutputTask { - Produces collisionOutputTableData; - Produces jetOutputTableData; - Produces jetSubstructureOutputTableData; - Produces jetMatchingOutputTableData; - Produces collisionOutputTableDataSub; - Produces jetOutputTableDataSub; - Produces jetSubstructureOutputTableDataSub; - Produces jetMatchingOutputTableDataSub; - Produces collisionOutputTableMCD; - Produces jetOutputTableMCD; - Produces jetSubstructureOutputTableMCD; - Produces jetMatchingOutputTableMCD; - Produces collisionOutputTableMCP; - Produces jetOutputTableMCP; - Produces jetSubstructureOutputTableMCP; - Produces jetMatchingOutputTableMCP; - Produces hfCollisionsTable; - Produces candidateTable; - Produces candidateParsTable; - Produces candidateParExtrasTable; - Produces candidateParsDaughterTable; - Produces candidateSelsTable; - Produces candidateMlsTable; - Produces candidateMlsDaughterTable; - Produces candidateMcsTable; - Produces hfMcCollisionsTable; - Produces hfMcCollisionsMatchingTable; - Produces hfParticlesTable; - - Configurable jetPtMinData{"jetPtMinData", 0.0, "minimum jet pT cut for data jets"}; - Configurable jetPtMinDataSub{"jetPtMinDataSub", 0.0, "minimum jet pT cut for eventwise constituent subtracted data jets"}; - Configurable jetPtMinMCD{"jetPtMinMCD", 0.0, "minimum jet pT cut for mcd jets"}; - Configurable jetPtMinMCP{"jetPtMinMCP", 0.0, "minimum jet pT cut for mcp jets"}; - Configurable> jetRadii{"jetRadii", std::vector{0.4}, "jet resolution parameters"}; - Configurable jetEtaMin{"jetEtaMin", -99.0, "minimum jet pseudorapidity"}; - Configurable jetEtaMax{"jetEtaMax", 99.0, "maximum jet pseudorapidity"}; - - Configurable trackEtaMin{"trackEtaMin", -0.9, "minimum track pseudorapidity"}; - Configurable trackEtaMax{"trackEtaMax", 0.9, "maximum track pseudorapidity"}; + struct : ProducesGroup { + Produces collisionOutputTableData; + Produces jetOutputTableData; + Produces jetSubstructureOutputTableData; + Produces jetMatchingOutputTableData; + Produces collisionOutputTableDataSub; + Produces jetOutputTableDataSub; + Produces jetSubstructureOutputTableDataSub; + Produces jetMatchingOutputTableDataSub; + Produces collisionOutputTableMCD; + Produces jetOutputTableMCD; + Produces jetSubstructureOutputTableMCD; + Produces jetMatchingOutputTableMCD; + Produces collisionOutputTableMCP; + Produces jetOutputTableMCP; + Produces jetSubstructureOutputTableMCP; + Produces jetMatchingOutputTableMCP; + Produces hfCollisionsTable; + Produces candidateTable; + Produces candidateParsTable; + Produces candidateParExtrasTable; + Produces candidateParsDaughterTable; + Produces candidateSelsTable; + Produces candidateMlsTable; + Produces candidateMlsDaughterTable; + Produces candidateMcsTable; + Produces hfMcCollisionsTable; + Produces hfMcCollisionsMatchingTable; + Produces hfParticlesTable; + } products; + + struct : ConfigurableGroup { + Configurable jetPtMinData{"jetPtMinData", 0.0, "minimum jet pT cut for data jets"}; + Configurable jetPtMinDataSub{"jetPtMinDataSub", 0.0, "minimum jet pT cut for eventwise constituent subtracted data jets"}; + Configurable jetPtMinMCD{"jetPtMinMCD", 0.0, "minimum jet pT cut for mcd jets"}; + Configurable jetPtMinMCP{"jetPtMinMCP", 0.0, "minimum jet pT cut for mcp jets"}; + Configurable> jetRadii{"jetRadii", std::vector{0.4}, "jet resolution parameters"}; + Configurable jetEtaMin{"jetEtaMin", -99.0, "minimum jet pseudorapidity"}; + Configurable jetEtaMax{"jetEtaMax", 99.0, "maximum jet pseudorapidity"}; + Configurable trackEtaMin{"trackEtaMin", -0.9, "minimum track pseudorapidity"}; + Configurable trackEtaMax{"trackEtaMax", 0.9, "maximum track pseudorapidity"}; + } configs; // need to add selection on pThat to post processing @@ -99,11 +102,34 @@ struct JetSubstructureHFOutputTask { std::map candidateCollisionMapping; std::map candidateMcCollisionMapping; + std::vector> splittingMatchesGeoVecVecData; + std::vector> splittingMatchesPtVecVecData; + std::vector> splittingMatchesHFVecVecData; + std::vector> splittingMatchesGeoVecVecDataSub; + std::vector> splittingMatchesPtVecVecDataSub; + std::vector> splittingMatchesHFVecVecDataSub; + std::vector> splittingMatchesGeoVecVecMCD; + std::vector> splittingMatchesPtVecVecMCD; + std::vector> splittingMatchesHFVecVecMCD; + std::vector> splittingMatchesGeoVecVecMCP; + std::vector> splittingMatchesPtVecVecMCP; + std::vector> splittingMatchesHFVecVecMCP; + + std::vector> pairMatchesVecVecData; + std::vector> pairMatchesVecVecDataSub; + std::vector> pairMatchesVecVecMCD; + std::vector> pairMatchesVecVecMCP; + std::vector jetRadiiValues; std::vector collisionFlag; std::vector mcCollisionFlag; + void init(InitContext const&) + { + jetRadiiValues = (std::vector)configs.jetRadii; + } + PresliceUnsorted> CollisionsPerMcCollision = aod::jmccollisionlb::mcCollisionId; PresliceOptional D0CollisionsPerCollision = aod::jd0indices::collisionId; PresliceOptional DplusCollisionsPerCollision = aod::jdplusindices::collisionId; @@ -116,42 +142,150 @@ struct JetSubstructureHFOutputTask { PresliceOptional> BplusMcCollisionsPerMcCollision = aod::jbplusindices::mcCollisionId; PresliceOptional DielectronMcCollisionsPerMcCollision = aod::jdielectronindices::mcCollisionId; - void init(InitContext const&) + PresliceOptional> D0SplittingsPerJetData = aod::d0chargedsplitting::jetId; + PresliceOptional> D0SplittingsPerJetDataSub = aod::d0chargedeventwisesubtractedsplitting::jetId; + PresliceOptional> D0SplittingsPerJetMCD = aod::d0chargedmcdetectorlevelsplitting::jetId; + PresliceOptional> D0SplittingsPerJetMCP = aod::d0chargedmcparticlelevelsplitting::jetId; + + PresliceOptional> D0PairsPerJetData = aod::d0chargedpair::jetId; + PresliceOptional> D0PairsPerJetDataSub = aod::d0chargedeventwisesubtractedpair::jetId; + PresliceOptional> D0PairsPerJetMCD = aod::d0chargedmcdetectorlevelpair::jetId; + PresliceOptional> D0PairsPerJetMCP = aod::d0chargedmcparticlelevelpair::jetId; + + PresliceOptional> DplusSplittingsPerJetData = aod::dpluschargedsplitting::jetId; + PresliceOptional> DplusSplittingsPerJetDataSub = aod::dpluschargedeventwisesubtractedsplitting::jetId; + PresliceOptional> DplusSplittingsPerJetMCD = aod::dpluschargedmcdetectorlevelsplitting::jetId; + PresliceOptional> DplusSplittingsPerJetMCP = aod::dpluschargedmcparticlelevelsplitting::jetId; + + PresliceOptional> DplusPairsPerJetData = aod::dpluschargedpair::jetId; + PresliceOptional> DplusPairsPerJetDataSub = aod::dpluschargedeventwisesubtractedpair::jetId; + PresliceOptional> DplusPairsPerJetMCD = aod::dpluschargedmcdetectorlevelpair::jetId; + PresliceOptional> DplusPairsPerJetMCP = aod::dpluschargedmcparticlelevelpair::jetId; + + PresliceOptional> LcSplittingsPerJetData = aod::lcchargedsplitting::jetId; + PresliceOptional> LcSplittingsPerJetDataSub = aod::lcchargedeventwisesubtractedsplitting::jetId; + PresliceOptional> LcSplittingsPerJetMCD = aod::lcchargedmcdetectorlevelsplitting::jetId; + PresliceOptional> LcSplittingsPerJetMCP = aod::lcchargedmcparticlelevelsplitting::jetId; + + PresliceOptional> LcPairsPerJetData = aod::lcchargedpair::jetId; + PresliceOptional> LcPairsPerJetDataSub = aod::lcchargedeventwisesubtractedpair::jetId; + PresliceOptional> LcPairsPerJetMCD = aod::lcchargedmcdetectorlevelpair::jetId; + PresliceOptional> LcPairsPerJetMCP = aod::lcchargedmcparticlelevelpair::jetId; + + PresliceOptional> BplusSplittingsPerJetData = aod::bpluschargedsplitting::jetId; + PresliceOptional> BplusSplittingsPerJetDataSub = aod::bpluschargedeventwisesubtractedsplitting::jetId; + PresliceOptional> BplusSplittingsPerJetMCD = aod::bpluschargedmcdetectorlevelsplitting::jetId; + PresliceOptional> BplusSplittingsPerJetMCP = aod::bpluschargedmcparticlelevelsplitting::jetId; + + PresliceOptional> BplusPairsPerJetData = aod::bpluschargedpair::jetId; + PresliceOptional> BplusPairsPerJetDataSub = aod::bpluschargedeventwisesubtractedpair::jetId; + PresliceOptional> BplusPairsPerJetMCD = aod::bpluschargedmcdetectorlevelpair::jetId; + PresliceOptional> BplusPairsPerJetMCP = aod::bpluschargedmcparticlelevelpair::jetId; + + PresliceOptional> DielectronSplittingsPerJetData = aod::dielectronchargedsplitting::jetId; + PresliceOptional> DielectronSplittingsPerJetDataSub = aod::dielectronchargedeventwisesubtractedsplitting::jetId; + PresliceOptional> DielectronSplittingsPerJetMCD = aod::dielectronchargedmcdetectorlevelsplitting::jetId; + PresliceOptional> DielectronSplittingsPerJetMCP = aod::dielectronchargedmcparticlelevelsplitting::jetId; + + PresliceOptional> DielectronPairsPerJetData = aod::dielectronchargedpair::jetId; + PresliceOptional> DielectronPairsPerJetDataSub = aod::dielectronchargedeventwisesubtractedpair::jetId; + PresliceOptional> DielectronPairsPerJetMCD = aod::dielectronchargedmcdetectorlevelpair::jetId; + PresliceOptional> DielectronPairsPerJetMCP = aod::dielectronchargedmcparticlelevelpair::jetId; + + template + void fillSplittingMatchingVectors(T const& splittingsMatches, int jetIndex, std::vector>& splittingMatchesGeoVecVec, std::vector>& splittingMatchesPtVecVec, std::vector>& splittingMatchesHFVecVec) { - jetRadiiValues = (std::vector)jetRadii; + for (auto const& splittingMatches : splittingsMatches) { + auto splittingMatchesGeoSpan = splittingMatches.splittingMatchingGeo(); + auto splittingMatchesPtSpan = splittingMatches.splittingMatchingPt(); + auto splittingMatchesHFSpan = splittingMatches.splittingMatchingHF(); + std::copy(splittingMatchesGeoSpan.begin(), splittingMatchesGeoSpan.end(), std::back_inserter(splittingMatchesGeoVecVec[jetIndex])); + std::copy(splittingMatchesPtSpan.begin(), splittingMatchesPtSpan.end(), std::back_inserter(splittingMatchesPtVecVec[jetIndex])); + std::copy(splittingMatchesHFSpan.begin(), splittingMatchesHFSpan.end(), std::back_inserter(splittingMatchesHFVecVec[jetIndex])); + } + } + + template + void fillPairMatchingVectors(T const& pairsMatches, int jetIndex, std::vector>& pairMatchesVecVec) + { + for (auto const& pairMatches : pairsMatches) { + auto pairMatchesSpan = pairMatches.pairMatching(); + std::copy(pairMatchesSpan.begin(), pairMatchesSpan.end(), std::back_inserter(pairMatchesVecVec[jetIndex])); + } } template - void fillJetTables(T const& jet, U const& /*cand*/, int32_t collisionIndex, int32_t candidateIndex, V& jetOutputTable, M& jetSubstructureOutputTable, std::map& jetMap) + void fillJetTables(T const& jet, U const& /*cand*/, int32_t collisionIndex, int32_t candidateIndex, V& jetOutputTable, M& jetSubstructureOutputTable, std::vector>& splittingMatchesGeoVecVec, std::vector>& splittingMatchesPtVecVec, std::vector>& splittingMatchesHFVecVec, std::vector>& pairMatchesVecVec, float rho, std::map& jetMap) { std::vector energyMotherVec; std::vector ptLeadingVec; std::vector ptSubLeadingVec; std::vector thetaVec; - std::vector pairPtVec; - std::vector pairEnergyVec; - std::vector pairThetaVec; + std::vector pairJetPtVec; + std::vector pairJetEnergyVec; + std::vector pairJetThetaVec; + std::vector pairJetPerpCone1PtVec; + std::vector pairJetPerpCone1EnergyVec; + std::vector pairJetPerpCone1ThetaVec; + std::vector pairPerpCone1PerpCone1PtVec; + std::vector pairPerpCone1PerpCone1EnergyVec; + std::vector pairPerpCone1PerpCone1ThetaVec; + std::vector pairPerpCone1PerpCone2PtVec; + std::vector pairPerpCone1PerpCone2EnergyVec; + std::vector pairPerpCone1PerpCone2ThetaVec; + auto energyMotherSpan = jet.energyMother(); auto ptLeadingSpan = jet.ptLeading(); auto ptSubLeadingSpan = jet.ptSubLeading(); auto thetaSpan = jet.theta(); - auto pairPtSpan = jet.pairPt(); - auto pairEnergySpan = jet.pairEnergy(); - auto pairThetaSpan = jet.pairTheta(); + auto pairJetPtSpan = jet.pairJetPt(); + auto pairJetEnergySpan = jet.pairJetEnergy(); + auto pairJetThetaSpan = jet.pairJetTheta(); + auto pairJetPerpCone1PtSpan = jet.pairJetPerpCone1Pt(); + auto pairJetPerpCone1EnergySpan = jet.pairJetPerpCone1Energy(); + auto pairJetPerpCone1ThetaSpan = jet.pairJetPerpCone1Theta(); + auto pairPerpCone1PerpCone1PtSpan = jet.pairPerpCone1PerpCone1Pt(); + auto pairPerpCone1PerpCone1EnergySpan = jet.pairPerpCone1PerpCone1Energy(); + auto pairPerpCone1PerpCone1ThetaSpan = jet.pairPerpCone1PerpCone1Theta(); + auto pairPerpCone1PerpCone2PtSpan = jet.pairPerpCone1PerpCone2Pt(); + auto pairPerpCone1PerpCone2EnergySpan = jet.pairPerpCone1PerpCone2Energy(); + auto pairPerpCone1PerpCone2ThetaSpan = jet.pairPerpCone1PerpCone2Theta(); + std::copy(energyMotherSpan.begin(), energyMotherSpan.end(), std::back_inserter(energyMotherVec)); std::copy(ptLeadingSpan.begin(), ptLeadingSpan.end(), std::back_inserter(ptLeadingVec)); std::copy(ptSubLeadingSpan.begin(), ptSubLeadingSpan.end(), std::back_inserter(ptSubLeadingVec)); std::copy(thetaSpan.begin(), thetaSpan.end(), std::back_inserter(thetaVec)); - std::copy(pairPtSpan.begin(), pairPtSpan.end(), std::back_inserter(pairPtVec)); - std::copy(pairEnergySpan.begin(), pairEnergySpan.end(), std::back_inserter(pairEnergyVec)); - std::copy(pairThetaSpan.begin(), pairThetaSpan.end(), std::back_inserter(pairThetaVec)); - jetOutputTable(collisionIndex, candidateIndex, jet.pt(), jet.phi(), jet.eta(), jet.y(), jet.r(), jet.tracksIds().size() + jet.candidatesIds().size()); // here we take the decision to keep the collision index consistent with the JE framework in case it is later needed to join to other tables. The candidate Index however can be linked to the HF tables - jetSubstructureOutputTable(jetOutputTable.lastIndex(), energyMotherVec, ptLeadingVec, ptSubLeadingVec, thetaVec, jet.nSub2DR(), jet.nSub1(), jet.nSub2(), pairPtVec, pairEnergyVec, pairThetaVec, jet.angularity(), jet.ptLeadingConstituent()); + std::copy(pairJetPtSpan.begin(), pairJetPtSpan.end(), std::back_inserter(pairJetPtVec)); + std::copy(pairJetEnergySpan.begin(), pairJetEnergySpan.end(), std::back_inserter(pairJetEnergyVec)); + std::copy(pairJetThetaSpan.begin(), pairJetThetaSpan.end(), std::back_inserter(pairJetThetaVec)); + std::copy(pairJetPerpCone1PtSpan.begin(), pairJetPerpCone1PtSpan.end(), std::back_inserter(pairJetPerpCone1PtVec)); + std::copy(pairJetPerpCone1EnergySpan.begin(), pairJetPerpCone1EnergySpan.end(), std::back_inserter(pairJetPerpCone1EnergyVec)); + std::copy(pairJetPerpCone1ThetaSpan.begin(), pairJetPerpCone1ThetaSpan.end(), std::back_inserter(pairJetPerpCone1ThetaVec)); + std::copy(pairPerpCone1PerpCone1PtSpan.begin(), pairPerpCone1PerpCone1PtSpan.end(), std::back_inserter(pairPerpCone1PerpCone1PtVec)); + std::copy(pairPerpCone1PerpCone1EnergySpan.begin(), pairPerpCone1PerpCone1EnergySpan.end(), std::back_inserter(pairPerpCone1PerpCone1EnergyVec)); + std::copy(pairPerpCone1PerpCone1ThetaSpan.begin(), pairPerpCone1PerpCone1ThetaSpan.end(), std::back_inserter(pairPerpCone1PerpCone1ThetaVec)); + std::copy(pairPerpCone1PerpCone2PtSpan.begin(), pairPerpCone1PerpCone2PtSpan.end(), std::back_inserter(pairPerpCone1PerpCone2PtVec)); + std::copy(pairPerpCone1PerpCone2EnergySpan.begin(), pairPerpCone1PerpCone2EnergySpan.end(), std::back_inserter(pairPerpCone1PerpCone2EnergyVec)); + std::copy(pairPerpCone1PerpCone2ThetaSpan.begin(), pairPerpCone1PerpCone2ThetaSpan.end(), std::back_inserter(pairPerpCone1PerpCone2ThetaVec)); + + std::vector splittingMatchesGeoVec; + std::vector splittingMatchesPtVec; + std::vector splittingMatchesHFVec; + std::vector pairMatchesVec; + if (doprocessOutputSubstructureMatchingData || doprocessOutputSubstructureMatchingMC) { + splittingMatchesGeoVec = splittingMatchesGeoVecVec[jet.globalIndex()]; + splittingMatchesPtVec = splittingMatchesPtVecVec[jet.globalIndex()]; + splittingMatchesHFVec = splittingMatchesHFVecVec[jet.globalIndex()]; + pairMatchesVec = pairMatchesVecVec[jet.globalIndex()]; + } + + jetOutputTable(collisionIndex, candidateIndex, jet.pt(), jet.phi(), jet.eta(), jet.y(), jet.r(), jet.area(), rho, jet.perpConeRho(), jet.tracksIds().size() + jet.candidatesIds().size()); // here we take the decision to keep the collision index consistent with the JE framework in case it is later needed to join to other tables. The candidate Index however can be linked to the HF tables + jetSubstructureOutputTable(jetOutputTable.lastIndex(), energyMotherVec, ptLeadingVec, ptSubLeadingVec, thetaVec, jet.nSub2DR(), jet.nSub1(), jet.nSub2(), pairJetPtVec, pairJetEnergyVec, pairJetThetaVec, pairJetPerpCone1PtVec, pairJetPerpCone1EnergyVec, pairJetPerpCone1ThetaVec, pairPerpCone1PerpCone1PtVec, pairPerpCone1PerpCone1EnergyVec, pairPerpCone1PerpCone1ThetaVec, pairPerpCone1PerpCone2PtVec, pairPerpCone1PerpCone2EnergyVec, pairPerpCone1PerpCone2ThetaVec, jet.angularity(), jet.ptLeadingConstituent(), splittingMatchesGeoVec, splittingMatchesPtVec, splittingMatchesHFVec, pairMatchesVec); jetMap.insert(std::make_pair(jet.globalIndex(), jetOutputTable.lastIndex())); } template - void analyseCharged(T const& collision, U const& jets, V const& /*candidates*/, M& collisionOutputTable, N& jetOutputTable, O& jetSubstructureOutputTable, std::map& jetMap, std::map& candidateMap, float jetPtMin, float eventWeight) + void analyseCharged(T const& collision, U const& jets, V const& /*candidates*/, M& collisionOutputTable, N& jetOutputTable, O& jetSubstructureOutputTable, std::vector>& splittingMatchesGeoVecVec, std::vector>& splittingMatchesPtVecVec, std::vector>& splittingMatchesHFVecVec, std::vector>& pairMatchesVecVec, std::map& jetMap, std::map& candidateMap, float jetPtMin, float eventWeight) { int nJetInCollision = 0; @@ -160,7 +294,7 @@ struct JetSubstructureHFOutputTask { if (jet.pt() < jetPtMin) { continue; } - if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + if (!jetfindingutilities::isInEtaAcceptance(jet, configs.jetEtaMin, configs.jetEtaMax, configs.trackEtaMin, configs.trackEtaMax)) { continue; } for (const auto& jetRadiiValue : jetRadiiValues) { @@ -182,7 +316,7 @@ struct JetSubstructureHFOutputTask { collisionIndex = collisionOutputTable.lastIndex(); } nJetInCollision++; - fillJetTables(jet, candidate, collisionIndex, candidateIndex, jetOutputTable, jetSubstructureOutputTable, jetMap); + fillJetTables(jet, candidate, collisionIndex, candidateIndex, jetOutputTable, jetSubstructureOutputTable, splittingMatchesGeoVecVec, splittingMatchesPtVecVec, splittingMatchesHFVecVec, pairMatchesVecVec, candidate.rho(), jetMap); } } } @@ -195,7 +329,7 @@ struct JetSubstructureHFOutputTask { if (jet.pt() < jetPtMin) { continue; } - if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + if (!jetfindingutilities::isInEtaAcceptance(jet, configs.jetEtaMin, configs.jetEtaMax, configs.trackEtaMin, configs.trackEtaMax)) { continue; } for (const auto& jetRadiiValue : jetRadiiValues) { @@ -213,29 +347,50 @@ struct JetSubstructureHFOutputTask { if (hfMcCollisionIndex != candidateMcCollisionMapping.end()) { candidateCollisionIndex = hfMcCollisionIndex->second; } - jetcandidateutilities::fillCandidateMcTable(candidate, candidateCollisionIndex, hfParticlesTable); - candidateMap.insert(std::make_pair(candidate.globalIndex(), hfParticlesTable.lastIndex())); + jetcandidateutilities::fillCandidateMcTable(candidate, candidateCollisionIndex, products.hfParticlesTable); + candidateMap.insert(std::make_pair(candidate.globalIndex(), products.hfParticlesTable.lastIndex())); } else { auto hfCollisionIndex = candidateCollisionMapping.find(jetcandidateutilities::getCandidateCollisionId(candidate)); if (hfCollisionIndex != candidateCollisionMapping.end()) { candidateCollisionIndex = hfCollisionIndex->second; } - jetcandidateutilities::fillCandidateTable(candidate, candidateCollisionIndex, candidateTable, candidateParsTable, candidateParExtrasTable, candidateParsDaughterTable, candidateSelsTable, candidateMlsTable, candidateMlsDaughterTable, candidateMcsTable); - candidateMap.insert(std::make_pair(candidate.globalIndex(), candidateTable.lastIndex())); + jetcandidateutilities::fillCandidateTable(candidate, candidateCollisionIndex, products.candidateTable, products.candidateParsTable, products.candidateParExtrasTable, products.candidateParsDaughterTable, products.candidateSelsTable, products.candidateMlsTable, products.candidateMlsDaughterTable, products.candidateMcsTable); + candidateMap.insert(std::make_pair(candidate.globalIndex(), products.candidateTable.lastIndex())); } } } } } - template - void analyseMatched(T const& jets, U const& /*jetsTag*/, std::map& jetMapping, std::map& jetTagMapping, V& matchingOutputTable, float jetPtMin) + template + void analyseSubstructureMatched(T const& jets, U const& allSplittings, V const& allPairs, M const& D0SplittingsPerJet, N const DplusSplittingsPerJet, O const& LcSplittingsPerJet, P const& BplusSplittingsPerJet, Q const& DielectronSplittingsPerJet, R const& D0PairsPerJet, S const DplusPairsPerJet, A const& LcPairsPerJet, B const& BplusPairsPerJet, C const& DielectronPairsPerJet, std::vector>& splittingMatchesGeoVecVec, std::vector>& splittingMatchesPtVecVec, std::vector>& splittingMatchesHFVecVec, std::vector>& pairMatchesVecVec, float jetPtMin) + { + for (const auto& jet : jets) { + if (jet.pt() < jetPtMin) { + continue; + } + if (!jetfindingutilities::isInEtaAcceptance(jet, configs.jetEtaMin, configs.jetEtaMax, configs.trackEtaMin, configs.trackEtaMax)) { + continue; + } + for (const auto& jetRadiiValue : jetRadiiValues) { + if (jet.r() == round(jetRadiiValue * 100.0f)) { + auto splittings = jetcandidateutilities::slicedPerJet(allSplittings, jet, D0SplittingsPerJet, DplusSplittingsPerJet, LcSplittingsPerJet, BplusSplittingsPerJet, DielectronSplittingsPerJet); + fillSplittingMatchingVectors(splittings, jet.globalIndex(), splittingMatchesGeoVecVec, splittingMatchesPtVecVec, splittingMatchesHFVecVec); + auto pairs = jetcandidateutilities::slicedPerJet(allPairs, jet, D0PairsPerJet, DplusPairsPerJet, LcPairsPerJet, BplusPairsPerJet, DielectronPairsPerJet); + fillPairMatchingVectors(pairs, jet.globalIndex(), pairMatchesVecVec); + } + } + } + } + + template + void analyseJetMatched(T const& jets, std::map& jetMapping, std::map& jetTagMapping, U& matchingOutputTable, float jetPtMin) { for (const auto& jet : jets) { if (jet.pt() < jetPtMin) { continue; } - if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + if (!jetfindingutilities::isInEtaAcceptance(jet, configs.jetEtaMin, configs.jetEtaMax, configs.trackEtaMin, configs.trackEtaMax)) { continue; } for (const auto& jetRadiiValue : jetRadiiValues) { @@ -294,7 +449,7 @@ struct JetSubstructureHFOutputTask { if (jet.pt() < jetPtMin) { continue; } - if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + if (!jetfindingutilities::isInEtaAcceptance(jet, configs.jetEtaMin, configs.jetEtaMax, configs.trackEtaMin, configs.trackEtaMax)) { continue; } for (const auto& jetRadiiValue : jetRadiiValues) { @@ -315,7 +470,7 @@ struct JetSubstructureHFOutputTask { if (jetMCP.pt() < jetPtMinMCP) { continue; } - if (!jetfindingutilities::isInEtaAcceptance(jetMCP, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + if (!jetfindingutilities::isInEtaAcceptance(jetMCP, configs.jetEtaMin, configs.jetEtaMax, configs.trackEtaMin, configs.trackEtaMax)) { continue; } for (const auto& jetRadiiValue : jetRadiiValues) { @@ -335,14 +490,14 @@ struct JetSubstructureHFOutputTask { if constexpr (!isMCPOnly) { for (const auto& collision : collisions) { if (collisionFlag[collision.globalIndex()]) { - const auto hfCollisionsPerCollision = jetcandidateutilities::slicedPerCandidateCollision(hfCollisions, candidates, collision, D0CollisionsPerCollision, DplusCollisionsPerCollision, LcCollisionsPerCollision, BplusCollisionsPerCollision, DielectronCollisionsPerCollision); // add Bplus later + const auto hfCollisionsPerCollision = jetcandidateutilities::slicedPerCandidateCollision(hfCollisions, candidates, collision, D0CollisionsPerCollision, DplusCollisionsPerCollision, LcCollisionsPerCollision, BplusCollisionsPerCollision, DielectronCollisionsPerCollision); for (const auto& hfCollisionPerCollision : hfCollisionsPerCollision) { // should only ever be one auto hfCollisionTableIndex = candidateCollisionMapping.find(hfCollisionPerCollision.globalIndex()); if (hfCollisionTableIndex != candidateCollisionMapping.end()) { continue; } - jetcandidateutilities::fillCandidateCollisionTable(hfCollisionPerCollision, candidates, hfCollisionsTable); - candidateCollisionMapping.insert(std::make_pair(hfCollisionPerCollision.globalIndex(), hfCollisionsTable.lastIndex())); + jetcandidateutilities::fillCandidateCollisionTable(hfCollisionPerCollision, candidates, products.hfCollisionsTable); + candidateCollisionMapping.insert(std::make_pair(hfCollisionPerCollision.globalIndex(), products.hfCollisionsTable.lastIndex())); } } } @@ -356,8 +511,8 @@ struct JetSubstructureHFOutputTask { if (hfMcCollisionTableIndex != candidateMcCollisionMapping.end()) { continue; } - jetcandidateutilities::fillCandidateMcCollisionTable(hfMcCollisionPerMcCollision, candidatesMCP, hfMcCollisionsTable); - candidateMcCollisionMapping.insert(std::make_pair(hfMcCollisionPerMcCollision.globalIndex(), hfMcCollisionsTable.lastIndex())); + jetcandidateutilities::fillCandidateMcCollisionTable(hfMcCollisionPerMcCollision, candidatesMCP, products.hfMcCollisionsTable); + candidateMcCollisionMapping.insert(std::make_pair(hfMcCollisionPerMcCollision.globalIndex(), products.hfMcCollisionsTable.lastIndex())); if constexpr (!isMCPOnly && (jethfutilities::isHFTable

() || jethfutilities::isHFMcTable())) { // the matching of mcCollision to Collision is only done for HF tables std::vector hfCollisionIDs; for (auto const& hfCollisionPerMcCollision : hfMcCollisionPerMcCollision.template hfCollBases_as()) { // if added for others this line needs to be templated per type @@ -366,7 +521,7 @@ struct JetSubstructureHFOutputTask { hfCollisionIDs.push_back(hfCollisionIndex->second); } } - hfMcCollisionsMatchingTable(hfCollisionIDs); + products.hfMcCollisionsMatchingTable(hfCollisionIDs); } } } @@ -397,7 +552,7 @@ struct JetSubstructureHFOutputTask { CandidateCollisionTable const& canidateCollisions, CandidateTable const& candidates) { - analyseHFCollisions(collisions, collisions, canidateCollisions, canidateCollisions, jets, jets, candidates, candidates, jetPtMinData); + analyseHFCollisions(collisions, collisions, canidateCollisions, canidateCollisions, jets, jets, candidates, candidates, configs.jetPtMinData); } PROCESS_SWITCH(JetSubstructureHFOutputTask, processOutputCollisionsData, "hf collision output data", false); @@ -406,7 +561,7 @@ struct JetSubstructureHFOutputTask { CandidateCollisionTable const& canidateCollisions, CandidateTable const& candidates) { - analyseHFCollisions(collisions, collisions, canidateCollisions, canidateCollisions, jets, jets, candidates, candidates, jetPtMinDataSub); + analyseHFCollisions(collisions, collisions, canidateCollisions, canidateCollisions, jets, jets, candidates, candidates, configs.jetPtMinDataSub); } PROCESS_SWITCH(JetSubstructureHFOutputTask, processOutputCollisionsDataSub, "hf collision output data eventwise constituent subtracted", false); @@ -419,7 +574,7 @@ struct JetSubstructureHFOutputTask { CandidateTableMCD const& candidatesMCD, CandidateTableMCP const& candidatesMCP) { - analyseHFCollisions(collisions, mcCollisions, canidateCollisions, canidateMcCollisions, jetsMCD, jetsMCP, candidatesMCD, candidatesMCP, jetPtMinMCD, jetPtMinMCP); + analyseHFCollisions(collisions, mcCollisions, canidateCollisions, canidateMcCollisions, jetsMCD, jetsMCP, candidatesMCD, candidatesMCP, configs.jetPtMinMCD, configs.jetPtMinMCP); } PROCESS_SWITCH(JetSubstructureHFOutputTask, processOutputCollisionsMc, "hf collision output MC", false); @@ -428,7 +583,7 @@ struct JetSubstructureHFOutputTask { CandidateMcCollisionTable const& canidateMcCollisions, CandidateTableMCP const& candidatesMCP) { - analyseHFCollisions(mcCollisions, mcCollisions, canidateMcCollisions, canidateMcCollisions, jetsMCP, jetsMCP, candidatesMCP, candidatesMCP, 0.0, jetPtMinMCP); + analyseHFCollisions(mcCollisions, mcCollisions, canidateMcCollisions, canidateMcCollisions, jetsMCP, jetsMCP, candidatesMCP, candidatesMCP, 0.0, configs.jetPtMinMCP); } PROCESS_SWITCH(JetSubstructureHFOutputTask, processOutputCollisionsMCPOnly, "hf collision output MCP only", false); @@ -436,7 +591,7 @@ struct JetSubstructureHFOutputTask { JetTableData const& jets, CandidateTable const& candidates) { - analyseCandidates(jets, candidates, candidateMapping, jetPtMinData); + analyseCandidates(jets, candidates, candidateMapping, configs.jetPtMinData); } PROCESS_SWITCH(JetSubstructureHFOutputTask, processOutputCandidatesData, "hf candidate output data", false); @@ -444,7 +599,7 @@ struct JetSubstructureHFOutputTask { JetTableDataSub const& jets, CandidateTable const& candidates) { - analyseCandidates(jets, candidates, candidateMapping, jetPtMinDataSub); + analyseCandidates(jets, candidates, candidateMapping, configs.jetPtMinDataSub); } PROCESS_SWITCH(JetSubstructureHFOutputTask, processOutputCandidatesDataSub, "hf candidate output data eventwise constituent subtracted", false); @@ -453,7 +608,7 @@ struct JetSubstructureHFOutputTask { CandidateTableMCD const& candidates) { - analyseCandidates(jets, candidates, candidateMapping, jetPtMinMCD); + analyseCandidates(jets, candidates, candidateMapping, configs.jetPtMinMCD); } PROCESS_SWITCH(JetSubstructureHFOutputTask, processOutputCandidatesMCD, "hf candidate output MCD", false); @@ -461,56 +616,99 @@ struct JetSubstructureHFOutputTask { JetTableMCP const& jets, CandidateTableMCP const& candidates) { - analyseCandidates(jets, candidates, candidateMappingMCP, jetPtMinMCP); + analyseCandidates(jets, candidates, candidateMappingMCP, configs.jetPtMinMCP); } PROCESS_SWITCH(JetSubstructureHFOutputTask, processOutputCandidatesMCP, "hf candidate output MCP", false); + void processOutputSubstructureMatchingData(JetMatchedTableData const& jets, + JetTableDataSub const& jetsSub, + CandidateTable const&, + SplittingTableData const& splittingsData, + SplittingTableDataSub const& splittingsDataSub, + PairTableData const& pairsData, + PairTableDataSub const& pairsDataSub) + { + splittingMatchesGeoVecVecData.assign(jets.size(), {}); + splittingMatchesPtVecVecData.assign(jets.size(), {}); + splittingMatchesHFVecVecData.assign(jets.size(), {}); + pairMatchesVecVecData.assign(jets.size(), {}); + analyseSubstructureMatched(jets, splittingsData, pairsData, D0SplittingsPerJetData, DplusSplittingsPerJetData, LcSplittingsPerJetData, BplusSplittingsPerJetData, DielectronSplittingsPerJetData, D0PairsPerJetData, DplusPairsPerJetData, LcPairsPerJetData, BplusPairsPerJetData, DielectronPairsPerJetData, splittingMatchesGeoVecVecData, splittingMatchesPtVecVecData, splittingMatchesHFVecVecData, pairMatchesVecVecData, configs.jetPtMinData); + splittingMatchesGeoVecVecDataSub.assign(jetsSub.size(), {}); + splittingMatchesPtVecVecDataSub.assign(jetsSub.size(), {}); + splittingMatchesHFVecVecDataSub.assign(jetsSub.size(), {}); + pairMatchesVecVecDataSub.assign(jetsSub.size(), {}); + analyseSubstructureMatched(jetsSub, splittingsDataSub, pairsDataSub, D0SplittingsPerJetDataSub, DplusSplittingsPerJetDataSub, LcSplittingsPerJetDataSub, BplusSplittingsPerJetDataSub, DielectronSplittingsPerJetDataSub, D0PairsPerJetDataSub, DplusPairsPerJetDataSub, LcPairsPerJetDataSub, BplusPairsPerJetDataSub, DielectronPairsPerJetDataSub, splittingMatchesGeoVecVecDataSub, splittingMatchesPtVecVecDataSub, splittingMatchesHFVecVecDataSub, pairMatchesVecVecDataSub, configs.jetPtMinDataSub); + } + PROCESS_SWITCH(JetSubstructureHFOutputTask, processOutputSubstructureMatchingData, "jet substructure matching output Data", false); + void processOutputJetsData(aod::JetCollision const& collision, JetTableData const& jets, - CandidateTable const& candidates) + soa::Join const& candidates) { - analyseCharged(collision, jets, candidates, collisionOutputTableData, jetOutputTableData, jetSubstructureOutputTableData, jetMappingData, candidateMapping, jetPtMinData, 1.0); + analyseCharged(collision, jets, candidates, products.collisionOutputTableData, products.jetOutputTableData, products.jetSubstructureOutputTableData, splittingMatchesGeoVecVecData, splittingMatchesPtVecVecData, splittingMatchesHFVecVecData, pairMatchesVecVecData, jetMappingData, candidateMapping, configs.jetPtMinData, 1.0); } PROCESS_SWITCH(JetSubstructureHFOutputTask, processOutputJetsData, "hf jet substructure output Data", false); void processOutputJetsDataSub(aod::JetCollision const& collision, JetTableDataSub const& jets, - CandidateTable const& candidates) + soa::Join const& candidates) { - analyseCharged(collision, jets, candidates, collisionOutputTableDataSub, jetOutputTableDataSub, jetSubstructureOutputTableDataSub, jetMappingDataSub, candidateMapping, jetPtMinDataSub, 1.0); + analyseCharged(collision, jets, candidates, products.collisionOutputTableDataSub, products.jetOutputTableDataSub, products.jetSubstructureOutputTableDataSub, splittingMatchesGeoVecVecDataSub, splittingMatchesPtVecVecDataSub, splittingMatchesHFVecVecDataSub, pairMatchesVecVecDataSub, jetMappingDataSub, candidateMapping, configs.jetPtMinDataSub, 1.0); } PROCESS_SWITCH(JetSubstructureHFOutputTask, processOutputJetsDataSub, "hf jet substructure output event-wise subtracted Data", false); - void processOutputMatchingData(JetMatchedTableData const& jets, - JetTableDataSub const& jetsSub) + void processOutputJetMatchingData(JetMatchedTableData const& jets, + JetTableDataSub const& jetsSub) + { + analyseJetMatched(jets, jetMappingData, jetMappingDataSub, products.jetMatchingOutputTableData, configs.jetPtMinData); + analyseJetMatched(jetsSub, jetMappingDataSub, jetMappingData, products.jetMatchingOutputTableDataSub, configs.jetPtMinDataSub); + } + PROCESS_SWITCH(JetSubstructureHFOutputTask, processOutputJetMatchingData, "jet matching output Data", false); + + void processOutputSubstructureMatchingMC(JetTableMCD const& jetsMCD, + JetTableMatchedMCP const& jetsMCP, + CandidateTableMCD const&, + CandidateTableMCP const&, + SplittingTableMCD const& splittingsMCD, + SplittingTableMCP const& splittingsMCP, + PairTableMCD const& pairsMCD, + PairTableMCP const& pairsMCP) { - analyseMatched(jets, jetsSub, jetMappingData, jetMappingDataSub, jetMatchingOutputTableData, jetPtMinData); - analyseMatched(jetsSub, jets, jetMappingDataSub, jetMappingData, jetMatchingOutputTableDataSub, jetPtMinDataSub); + splittingMatchesGeoVecVecMCD.assign(jetsMCD.size(), {}); + splittingMatchesPtVecVecMCD.assign(jetsMCD.size(), {}); + splittingMatchesHFVecVecMCD.assign(jetsMCD.size(), {}); + pairMatchesVecVecMCD.assign(jetsMCD.size(), {}); + analyseSubstructureMatched(jetsMCD, splittingsMCD, pairsMCD, D0SplittingsPerJetMCD, DplusSplittingsPerJetMCD, LcSplittingsPerJetMCD, BplusSplittingsPerJetMCD, DielectronSplittingsPerJetMCD, D0PairsPerJetMCD, DplusPairsPerJetMCD, LcPairsPerJetMCD, BplusPairsPerJetMCD, DielectronPairsPerJetMCD, splittingMatchesGeoVecVecMCD, splittingMatchesPtVecVecMCD, splittingMatchesHFVecVecMCD, pairMatchesVecVecMCD, configs.jetPtMinMCD); + splittingMatchesGeoVecVecMCP.assign(jetsMCP.size(), {}); + splittingMatchesPtVecVecMCP.assign(jetsMCP.size(), {}); + splittingMatchesHFVecVecMCP.assign(jetsMCP.size(), {}); + pairMatchesVecVecMCP.assign(jetsMCP.size(), {}); + analyseSubstructureMatched(jetsMCP, splittingsMCP, pairsMCP, D0SplittingsPerJetMCP, DplusSplittingsPerJetMCP, LcSplittingsPerJetMCP, BplusSplittingsPerJetMCP, DielectronSplittingsPerJetMCP, D0PairsPerJetMCP, DplusPairsPerJetMCP, LcPairsPerJetMCP, BplusPairsPerJetMCP, DielectronPairsPerJetMCP, splittingMatchesGeoVecVecMCP, splittingMatchesPtVecVecMCP, splittingMatchesHFVecVecMCP, pairMatchesVecVecMCP, configs.jetPtMinMCP); } - PROCESS_SWITCH(JetSubstructureHFOutputTask, processOutputMatchingData, "jet matching output Data", false); + PROCESS_SWITCH(JetSubstructureHFOutputTask, processOutputSubstructureMatchingMC, "jet substructure matching output MC", false); void processOutputJetsMCD(aod::JetCollisionMCD const& collision, aod::JetMcCollisions const&, JetTableMCD const& jets, - CandidateTableMCD const& candidates) + soa::Join const& candidates) { - analyseCharged(collision, jets, candidates, collisionOutputTableMCD, jetOutputTableMCD, jetSubstructureOutputTableMCD, jetMappingMCD, candidateMapping, jetPtMinMCD, collision.mcCollision().weight()); + analyseCharged(collision, jets, candidates, products.collisionOutputTableMCD, products.jetOutputTableMCD, products.jetSubstructureOutputTableMCD, splittingMatchesGeoVecVecMCD, splittingMatchesPtVecVecMCD, splittingMatchesHFVecVecMCD, pairMatchesVecVecMCD, jetMappingMCD, candidateMapping, configs.jetPtMinMCD, collision.mcCollision().weight()); } PROCESS_SWITCH(JetSubstructureHFOutputTask, processOutputJetsMCD, "hf jet substructure output MCD", false); void processOutputJetsMCP(aod::JetMcCollision const& collision, JetTableMCP const& jets, - CandidateTableMCP const& candidates) + soa::Join const& candidates) { - analyseCharged(collision, jets, candidates, collisionOutputTableMCP, jetOutputTableMCP, jetSubstructureOutputTableMCP, jetMappingMCP, candidateMappingMCP, jetPtMinMCP, collision.weight()); + analyseCharged(collision, jets, candidates, products.collisionOutputTableMCP, products.jetOutputTableMCP, products.jetSubstructureOutputTableMCP, splittingMatchesGeoVecVecMCP, splittingMatchesPtVecVecMCP, splittingMatchesHFVecVecMCP, pairMatchesVecVecMCP, jetMappingMCP, candidateMappingMCP, configs.jetPtMinMCP, collision.weight()); } PROCESS_SWITCH(JetSubstructureHFOutputTask, processOutputJetsMCP, "hf jet substructure output MCP", false); - void processOutputMatchingMC(JetTableMCD const& jetsMCD, - JetTableMatchedMCP const& jetsMCP) + void processOutputJetMatchingMC(JetTableMCD const& jetsMCD, + JetTableMatchedMCP const& jetsMCP) { - analyseMatched(jetsMCD, jetsMCP, jetMappingMCD, jetMappingMCP, jetMatchingOutputTableMCD, jetPtMinMCD); - analyseMatched(jetsMCP, jetsMCD, jetMappingMCP, jetMappingMCD, jetMatchingOutputTableMCP, jetPtMinMCP); + analyseJetMatched(jetsMCD, jetMappingMCD, jetMappingMCP, products.jetMatchingOutputTableMCD, configs.jetPtMinMCD); + analyseJetMatched(jetsMCP, jetMappingMCP, jetMappingMCD, products.jetMatchingOutputTableMCP, configs.jetPtMinMCP); } - PROCESS_SWITCH(JetSubstructureHFOutputTask, processOutputMatchingMC, "jet matching output MC", false); + PROCESS_SWITCH(JetSubstructureHFOutputTask, processOutputJetMatchingMC, "jet matching output MC", false); }; diff --git a/PWGJE/Tasks/jetSubstructureLc.cxx b/PWGJE/Tasks/jetSubstructureLc.cxx index dc985515164..4f2350bb0a6 100644 --- a/PWGJE/Tasks/jetSubstructureLc.cxx +++ b/PWGJE/Tasks/jetSubstructureLc.cxx @@ -13,9 +13,10 @@ // /// \author Nima Zardoshti +#include #include "PWGJE/Tasks/jetSubstructureHF.cxx" -using JetSubstructureLc = JetSubstructureHFTask, soa::Join, soa::Join, soa::Join, aod::CandidatesLcData, aod::CandidatesLcMCP, aod::LcCJetSSs, aod::LcCMCDJetSSs, aod::LcCMCPJetSSs, aod::LcCEWSJetSSs, aod::JTrackLcSubs>; +using JetSubstructureLc = JetSubstructureHFTask, soa::Join, soa::Join, soa::Join, aod::CandidatesLcData, aod::CandidatesLcMCP, aod::LcCJetSSs, aod::LcChargedSPs, aod::LcChargedPRs, aod::LcCMCDJetSSs, aod::LcChargedMCDetectorLevelSPs, aod::LcChargedMCDetectorLevelPRs, aod::LcCMCPJetSSs, aod::LcChargedMCParticleLevelSPs, aod::LcChargedMCParticleLevelPRs, aod::LcCEWSJetSSs, aod::LcChargedEventWiseSubtractedSPs, aod::LcChargedEventWiseSubtractedPRs, aod::JTrackLcSubs>; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGJE/Tasks/jetSubstructureLcOutput.cxx b/PWGJE/Tasks/jetSubstructureLcOutput.cxx index e64e8efc286..3f8cc65919b 100644 --- a/PWGJE/Tasks/jetSubstructureLcOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureLcOutput.cxx @@ -13,9 +13,10 @@ // /// \author Nima Zardoshti +#include #include "PWGJE/Tasks/jetSubstructureHFOutput.cxx" -using JetSubstructureOutputLc = JetSubstructureHFOutputTask, aod::CandidatesLcData, aod::CandidatesLcMCD, aod::CandidatesLcMCP, aod::JTrackLcSubs, soa::Join, soa::Join, aod::LcCJetCOs, aod::LcCJetOs, aod::LcCJetSSOs, aod::LcCJetMOs, soa::Join, aod::LcCMCDJetCOs, aod::LcCMCDJetOs, aod::LcCMCDJetSSOs, aod::LcCMCDJetMOs, soa::Join, soa::Join, aod::LcCMCPJetCOs, aod::LcCMCPJetOs, aod::LcCMCPJetSSOs, aod::LcCMCPJetMOs, soa::Join, aod::LcCEWSJetCOs, aod::LcCEWSJetOs, aod::LcCEWSJetSSOs, aod::LcCEWSJetMOs, aod::StoredHfLcCollBase, aod::StoredHfLcBases, aod::StoredHfLcPars, aod::StoredHfLcParEs, aod::JDumLcParDaus, aod::StoredHfLcSels, aod::StoredHfLcMls, aod::JDumLcMlDaus, aod::StoredHfLcMcs, aod::StoredHfLcMcCollBases, aod::StoredHfLcMcRCollIds, aod::StoredHfLcPBases>; +using JetSubstructureOutputLc = JetSubstructureHFOutputTask, aod::CandidatesLcData, aod::CandidatesLcMCD, aod::CandidatesLcMCP, aod::BkgLcRhos, aod::BkgLcMcRhos, aod::JTrackLcSubs, soa::Join, soa::Join, soa::Join, soa::Join, aod::LcCJetCOs, aod::LcCJetOs, aod::LcCJetSSOs, aod::LcCJetMOs, soa::Join, soa::Join, soa::Join, aod::LcCMCDJetCOs, aod::LcCMCDJetOs, aod::LcCMCDJetSSOs, aod::LcCMCDJetMOs, soa::Join, soa::Join, soa::Join, soa::Join, aod::LcCMCPJetCOs, aod::LcCMCPJetOs, aod::LcCMCPJetSSOs, aod::LcCMCPJetMOs, soa::Join, soa::Join, soa::Join, aod::LcCEWSJetCOs, aod::LcCEWSJetOs, aod::LcCEWSJetSSOs, aod::LcCEWSJetMOs, aod::StoredHfLcCollBase, aod::StoredHfLcBases, aod::StoredHfLcPars, aod::StoredHfLcParEs, aod::JDumLcParDaus, aod::StoredHfLcSels, aod::StoredHfLcMls, aod::JDumLcMlDaus, aod::StoredHfLcMcs, aod::StoredHfLcMcCollBases, aod::StoredHfLcMcRCollIds, aod::StoredHfLcPBases>; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGJE/Tasks/jetSubstructureOutput.cxx b/PWGJE/Tasks/jetSubstructureOutput.cxx index c4899b7a8af..a1790f1bfb7 100644 --- a/PWGJE/Tasks/jetSubstructureOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureOutput.cxx @@ -79,6 +79,24 @@ struct JetSubstructureOutputTask { std::map jetMappingMCD; std::map jetMappingMCP; + std::vector> splittingMatchesGeoVecVecData; + std::vector> splittingMatchesPtVecVecData; + std::vector> splittingMatchesHFVecVecData; + std::vector> splittingMatchesGeoVecVecDataSub; + std::vector> splittingMatchesPtVecVecDataSub; + std::vector> splittingMatchesHFVecVecDataSub; + std::vector> splittingMatchesGeoVecVecMCD; + std::vector> splittingMatchesPtVecVecMCD; + std::vector> splittingMatchesHFVecVecMCD; + std::vector> splittingMatchesGeoVecVecMCP; + std::vector> splittingMatchesPtVecVecMCP; + std::vector> splittingMatchesHFVecVecMCP; + + std::vector> pairMatchesVecVecData; + std::vector> pairMatchesVecVecDataSub; + std::vector> pairMatchesVecVecMCD; + std::vector> pairMatchesVecVecMCP; + std::vector jetRadiiValues; void init(InitContext const&) @@ -86,37 +104,109 @@ struct JetSubstructureOutputTask { jetRadiiValues = (std::vector)jetRadii; } + Preslice> splittingsPerJetData = aod::chargedsplitting::jetId; + Preslice> splittingsPerJetDataSub = aod::chargedeventwisesubtractedsplitting::jetId; + Preslice> splittingsPerJetMCD = aod::chargedmcdetectorlevelsplitting::jetId; + Preslice> splittingsPerJetMCP = aod::chargedmcparticlelevelsplitting::jetId; + + Preslice> pairsPerJetData = aod::chargedpair::jetId; + Preslice> pairsPerJetDataSub = aod::chargedeventwisesubtractedpair::jetId; + Preslice> pairsPerJetMCD = aod::chargedmcdetectorlevelpair::jetId; + Preslice> pairsPerJetMCP = aod::chargedmcparticlelevelpair::jetId; + + template + void fillSplittingMatchingVectors(T const& splittingsMatches, int jetIndex, std::vector>& splittingMatchesGeoVecVec, std::vector>& splittingMatchesPtVecVec, std::vector>& splittingMatchesHFVecVec) + { + for (auto const& splittingMatches : splittingsMatches) { + auto splittingMatchesGeoSpan = splittingMatches.splittingMatchingGeo(); + auto splittingMatchesPtSpan = splittingMatches.splittingMatchingPt(); + auto splittingMatchesHFSpan = splittingMatches.splittingMatchingHF(); + std::copy(splittingMatchesGeoSpan.begin(), splittingMatchesGeoSpan.end(), std::back_inserter(splittingMatchesGeoVecVec[jetIndex])); + std::copy(splittingMatchesPtSpan.begin(), splittingMatchesPtSpan.end(), std::back_inserter(splittingMatchesPtVecVec[jetIndex])); + std::copy(splittingMatchesHFSpan.begin(), splittingMatchesHFSpan.end(), std::back_inserter(splittingMatchesHFVecVec[jetIndex])); + } + } + + template + void fillPairMatchingVectors(T const& pairsMatches, int jetIndex, std::vector>& pairMatchesVecVec) + { + for (auto const& pairMatches : pairsMatches) { + auto pairMatchesSpan = pairMatches.pairMatching(); + std::copy(pairMatchesSpan.begin(), pairMatchesSpan.end(), std::back_inserter(pairMatchesVecVec[jetIndex])); + } + } + template - void fillJetTables(T const& jet, int32_t collisionIndex, U& jetOutputTable, V& jetSubstructureOutputTable, std::map& jetMapping) + void fillJetTables(T const& jet, int32_t collisionIndex, U& jetOutputTable, V& jetSubstructureOutputTable, std::vector>& splittingMatchesGeoVecVec, std::vector>& splittingMatchesPtVecVec, std::vector>& splittingMatchesHFVecVec, std::vector>& pairMatchesVecVec, float rho, std::map& jetMapping) { std::vector energyMotherVec; std::vector ptLeadingVec; std::vector ptSubLeadingVec; std::vector thetaVec; - std::vector pairPtVec; - std::vector pairEnergyVec; - std::vector pairThetaVec; + std::vector pairJetPtVec; + std::vector pairJetEnergyVec; + std::vector pairJetThetaVec; + std::vector pairJetPerpCone1PtVec; + std::vector pairJetPerpCone1EnergyVec; + std::vector pairJetPerpCone1ThetaVec; + std::vector pairPerpCone1PerpCone1PtVec; + std::vector pairPerpCone1PerpCone1EnergyVec; + std::vector pairPerpCone1PerpCone1ThetaVec; + std::vector pairPerpCone1PerpCone2PtVec; + std::vector pairPerpCone1PerpCone2EnergyVec; + std::vector pairPerpCone1PerpCone2ThetaVec; + auto energyMotherSpan = jet.energyMother(); auto ptLeadingSpan = jet.ptLeading(); auto ptSubLeadingSpan = jet.ptSubLeading(); auto thetaSpan = jet.theta(); - auto pairPtSpan = jet.pairPt(); - auto pairEnergySpan = jet.pairEnergy(); - auto pairThetaSpan = jet.pairTheta(); + auto pairJetPtSpan = jet.pairJetPt(); + auto pairJetEnergySpan = jet.pairJetEnergy(); + auto pairJetThetaSpan = jet.pairJetTheta(); + auto pairJetPerpCone1PtSpan = jet.pairJetPerpCone1Pt(); + auto pairJetPerpCone1EnergySpan = jet.pairJetPerpCone1Energy(); + auto pairJetPerpCone1ThetaSpan = jet.pairJetPerpCone1Theta(); + auto pairPerpCone1PerpCone1PtSpan = jet.pairPerpCone1PerpCone1Pt(); + auto pairPerpCone1PerpCone1EnergySpan = jet.pairPerpCone1PerpCone1Energy(); + auto pairPerpCone1PerpCone1ThetaSpan = jet.pairPerpCone1PerpCone1Theta(); + auto pairPerpCone1PerpCone2PtSpan = jet.pairPerpCone1PerpCone2Pt(); + auto pairPerpCone1PerpCone2EnergySpan = jet.pairPerpCone1PerpCone2Energy(); + auto pairPerpCone1PerpCone2ThetaSpan = jet.pairPerpCone1PerpCone2Theta(); + std::copy(energyMotherSpan.begin(), energyMotherSpan.end(), std::back_inserter(energyMotherVec)); std::copy(ptLeadingSpan.begin(), ptLeadingSpan.end(), std::back_inserter(ptLeadingVec)); std::copy(ptSubLeadingSpan.begin(), ptSubLeadingSpan.end(), std::back_inserter(ptSubLeadingVec)); std::copy(thetaSpan.begin(), thetaSpan.end(), std::back_inserter(thetaVec)); - std::copy(pairPtSpan.begin(), pairPtSpan.end(), std::back_inserter(pairPtVec)); - std::copy(pairEnergySpan.begin(), pairEnergySpan.end(), std::back_inserter(pairEnergyVec)); - std::copy(pairThetaSpan.begin(), pairThetaSpan.end(), std::back_inserter(pairThetaVec)); - jetOutputTable(collisionIndex, collisionIndex, jet.pt(), jet.phi(), jet.eta(), jet.y(), jet.r(), jet.tracksIds().size()); // second collision index is a dummy coloumn mirroring the hf candidate - jetSubstructureOutputTable(jetOutputTable.lastIndex(), energyMotherVec, ptLeadingVec, ptSubLeadingVec, thetaVec, jet.nSub2DR(), jet.nSub1(), jet.nSub2(), pairPtVec, pairEnergyVec, pairThetaVec, jet.angularity(), jet.ptLeadingConstituent()); + std::copy(pairJetPtSpan.begin(), pairJetPtSpan.end(), std::back_inserter(pairJetPtVec)); + std::copy(pairJetEnergySpan.begin(), pairJetEnergySpan.end(), std::back_inserter(pairJetEnergyVec)); + std::copy(pairJetThetaSpan.begin(), pairJetThetaSpan.end(), std::back_inserter(pairJetThetaVec)); + std::copy(pairJetPerpCone1PtSpan.begin(), pairJetPerpCone1PtSpan.end(), std::back_inserter(pairJetPerpCone1PtVec)); + std::copy(pairJetPerpCone1EnergySpan.begin(), pairJetPerpCone1EnergySpan.end(), std::back_inserter(pairJetPerpCone1EnergyVec)); + std::copy(pairJetPerpCone1ThetaSpan.begin(), pairJetPerpCone1ThetaSpan.end(), std::back_inserter(pairJetPerpCone1ThetaVec)); + std::copy(pairPerpCone1PerpCone1PtSpan.begin(), pairPerpCone1PerpCone1PtSpan.end(), std::back_inserter(pairPerpCone1PerpCone1PtVec)); + std::copy(pairPerpCone1PerpCone1EnergySpan.begin(), pairPerpCone1PerpCone1EnergySpan.end(), std::back_inserter(pairPerpCone1PerpCone1EnergyVec)); + std::copy(pairPerpCone1PerpCone1ThetaSpan.begin(), pairPerpCone1PerpCone1ThetaSpan.end(), std::back_inserter(pairPerpCone1PerpCone1ThetaVec)); + std::copy(pairPerpCone1PerpCone2PtSpan.begin(), pairPerpCone1PerpCone2PtSpan.end(), std::back_inserter(pairPerpCone1PerpCone2PtVec)); + std::copy(pairPerpCone1PerpCone2EnergySpan.begin(), pairPerpCone1PerpCone2EnergySpan.end(), std::back_inserter(pairPerpCone1PerpCone2EnergyVec)); + std::copy(pairPerpCone1PerpCone2ThetaSpan.begin(), pairPerpCone1PerpCone2ThetaSpan.end(), std::back_inserter(pairPerpCone1PerpCone2ThetaVec)); + + std::vector splittingMatchesGeoVec; + std::vector splittingMatchesPtVec; + std::vector splittingMatchesHFVec; + std::vector pairMatchesVec; + if (doprocessOutputSubstructureMatchingData || doprocessOutputSubstructureMatchingMC) { + splittingMatchesGeoVec = splittingMatchesGeoVecVec[jet.globalIndex()]; + splittingMatchesPtVec = splittingMatchesPtVecVec[jet.globalIndex()]; + splittingMatchesHFVec = splittingMatchesHFVecVec[jet.globalIndex()]; + pairMatchesVec = pairMatchesVecVec[jet.globalIndex()]; + } + jetOutputTable(collisionIndex, collisionIndex, jet.pt(), jet.phi(), jet.eta(), jet.y(), jet.r(), jet.area(), rho, jet.perpConeRho(), jet.tracksIds().size()); // second collision index is a dummy coloumn mirroring the hf candidate + jetSubstructureOutputTable(jetOutputTable.lastIndex(), energyMotherVec, ptLeadingVec, ptSubLeadingVec, thetaVec, jet.nSub2DR(), jet.nSub1(), jet.nSub2(), pairJetPtVec, pairJetEnergyVec, pairJetThetaVec, pairJetPerpCone1PtVec, pairJetPerpCone1EnergyVec, pairJetPerpCone1ThetaVec, pairPerpCone1PerpCone1PtVec, pairPerpCone1PerpCone1EnergyVec, pairPerpCone1PerpCone1ThetaVec, pairPerpCone1PerpCone2PtVec, pairPerpCone1PerpCone2EnergyVec, pairPerpCone1PerpCone2ThetaVec, jet.angularity(), jet.ptLeadingConstituent(), splittingMatchesGeoVec, splittingMatchesPtVec, splittingMatchesHFVec, pairMatchesVec); jetMapping.insert(std::make_pair(jet.globalIndex(), jetOutputTable.lastIndex())); } template - void analyseCharged(T const& collision, U const& jets, V& collisionOutputTable, M& jetOutputTable, N& jetSubstructureOutputTable, std::map& jetMapping, float jetPtMin, float eventWeight) + void analyseCharged(T const& collision, U const& jets, V& collisionOutputTable, M& jetOutputTable, N& jetSubstructureOutputTable, std::vector>& splittingMatchesGeoVecVec, std::vector>& splittingMatchesPtVecVec, std::vector>& splittingMatchesHFVecVec, std::vector>& pairMatchesVecVec, std::map& jetMapping, float jetPtMin, float eventWeight) { int nJetInCollision = 0; int32_t collisionIndex = -1; @@ -140,14 +230,37 @@ struct JetSubstructureOutputTask { collisionIndex = collisionOutputTable.lastIndex(); } nJetInCollision++; - fillJetTables(jet, collisionIndex, jetOutputTable, jetSubstructureOutputTable, jetMapping); + fillJetTables(jet, collisionIndex, jetOutputTable, jetSubstructureOutputTable, splittingMatchesGeoVecVec, splittingMatchesPtVecVec, splittingMatchesHFVecVec, pairMatchesVecVec, collision.rho(), jetMapping); } } } } - template - void analyseMatched(T const& jets, U const& /*jetsTag*/, std::map& jetMapping, std::map& jetTagMapping, V& matchingOutputTable, float jetPtMin) + template + void analyseSubstructureMatched(T const& jets, U const& allSplittings, V const& allPairs, M const& splittingsSlicer, N const& pairsSlicer, std::vector>& splittingMatchesGeoVecVec, std::vector>& splittingMatchesPtVecVec, std::vector>& splittingMatchesHFVecVec, std::vector>& pairMatchesVecVec, float jetPtMin) + { + for (const auto& jet : jets) { + if (jet.pt() < jetPtMin) { + continue; + } + if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + for (const auto& jetRadiiValue : jetRadiiValues) { + if (jet.r() == round(jetRadiiValue * 100.0f)) { + + auto splittings = allSplittings.sliceBy(splittingsSlicer, jet.globalIndex()); + fillSplittingMatchingVectors(splittings, jet.globalIndex(), splittingMatchesGeoVecVec, splittingMatchesPtVecVec, splittingMatchesHFVecVec); + + auto pairs = allPairs.sliceBy(pairsSlicer, jet.globalIndex()); + fillPairMatchingVectors(pairs, jet.globalIndex(), pairMatchesVecVec); + } + } + } + } + + template + void analyseJetMatched(T const& jets, std::map& jetMapping, std::map& jetTagMapping, U& matchingOutputTable, float jetPtMin) { std::vector candMatching; for (const auto& jet : jets) { @@ -202,49 +315,89 @@ struct JetSubstructureOutputTask { } PROCESS_SWITCH(JetSubstructureOutputTask, processClearMapsMCP, "process function that clears all the mcp maps in each dataframe", true); - void processOutputData(aod::JetCollision const& collision, + void processOutputSubstructureMatchingData(soa::Join const& jets, + soa::Join const& jetsSub, + soa::Join const& splittingsData, + soa::Join const& splittingsDataSub, + soa::Join const& pairsData, + soa::Join const& pairsDataSub) + { + splittingMatchesGeoVecVecData.assign(jets.size(), {}); + splittingMatchesPtVecVecData.assign(jets.size(), {}); + splittingMatchesHFVecVecData.assign(jets.size(), {}); + pairMatchesVecVecData.assign(jets.size(), {}); + analyseSubstructureMatched(jets, splittingsData, pairsData, splittingsPerJetData, pairsPerJetData, splittingMatchesGeoVecVecData, splittingMatchesPtVecVecData, splittingMatchesHFVecVecData, pairMatchesVecVecData, jetPtMinData); + splittingMatchesGeoVecVecDataSub.assign(jetsSub.size(), {}); + splittingMatchesPtVecVecDataSub.assign(jetsSub.size(), {}); + splittingMatchesHFVecVecDataSub.assign(jetsSub.size(), {}); + pairMatchesVecVecDataSub.assign(jetsSub.size(), {}); + analyseSubstructureMatched(jetsSub, splittingsDataSub, pairsDataSub, splittingsPerJetDataSub, pairsPerJetDataSub, splittingMatchesGeoVecVecDataSub, splittingMatchesPtVecVecDataSub, splittingMatchesHFVecVecDataSub, pairMatchesVecVecDataSub, jetPtMinDataSub); + } + PROCESS_SWITCH(JetSubstructureOutputTask, processOutputSubstructureMatchingData, "substructure matching output Data", false); + + void processOutputData(soa::Join::iterator const& collision, soa::Join const& jets) { - analyseCharged(collision, jets, collisionOutputTableData, jetOutputTableData, jetSubstructureOutputTableData, jetMappingData, jetPtMinData, 1.0); + analyseCharged(collision, jets, collisionOutputTableData, jetOutputTableData, jetSubstructureOutputTableData, splittingMatchesGeoVecVecData, splittingMatchesPtVecVecData, splittingMatchesHFVecVecData, pairMatchesVecVecData, jetMappingData, jetPtMinData, 1.0); } PROCESS_SWITCH(JetSubstructureOutputTask, processOutputData, "jet substructure output Data", false); - void processOutputDataSub(aod::JetCollision const& collision, + void processOutputDataSub(soa::Join::iterator const& collision, soa::Join const& jets) { - analyseCharged(collision, jets, collisionOutputTableDataSub, jetOutputTableDataSub, jetSubstructureOutputTableDataSub, jetMappingDataSub, jetPtMinDataSub, 1.0); + analyseCharged(collision, jets, collisionOutputTableDataSub, jetOutputTableDataSub, jetSubstructureOutputTableDataSub, splittingMatchesGeoVecVecDataSub, splittingMatchesPtVecVecDataSub, splittingMatchesHFVecVecDataSub, pairMatchesVecVecDataSub, jetMappingDataSub, jetPtMinDataSub, 1.0); } PROCESS_SWITCH(JetSubstructureOutputTask, processOutputDataSub, "jet substructure output event-wise subtracted Data", false); - void processOutputMatchingData(soa::Join const& jets, - soa::Join const& jetsSub) + void processOutputJetMatchingData(soa::Join const& jets, + soa::Join const& jetsSub) + { + analyseJetMatched(jets, jetMappingData, jetMappingDataSub, jetMatchingOutputTableData, jetPtMinData); + analyseJetMatched(jetsSub, jetMappingDataSub, jetMappingData, jetMatchingOutputTableDataSub, jetPtMinDataSub); + } + PROCESS_SWITCH(JetSubstructureOutputTask, processOutputJetMatchingData, "jet matching output Data", false); + + void processOutputSubstructureMatchingMC(soa::Join const& jetsMCD, + soa::Join const& jetsMCP, + soa::Join const& splittingsMCD, + soa::Join const& splittingsMCP, + soa::Join const& pairsMCD, + soa::Join const& pairsMCP) { - analyseMatched(jets, jetsSub, jetMappingData, jetMappingDataSub, jetMatchingOutputTableData, jetPtMinData); - analyseMatched(jetsSub, jets, jetMappingDataSub, jetMappingData, jetMatchingOutputTableDataSub, jetPtMinDataSub); + splittingMatchesGeoVecVecMCD.assign(jetsMCD.size(), {}); + splittingMatchesPtVecVecMCD.assign(jetsMCD.size(), {}); + splittingMatchesHFVecVecMCD.assign(jetsMCD.size(), {}); + pairMatchesVecVecMCD.assign(jetsMCD.size(), {}); + analyseSubstructureMatched(jetsMCD, splittingsMCD, pairsMCD, splittingsPerJetMCD, pairsPerJetMCD, splittingMatchesGeoVecVecMCD, splittingMatchesPtVecVecMCD, splittingMatchesHFVecVecMCD, pairMatchesVecVecMCD, jetPtMinMCD); + splittingMatchesGeoVecVecMCP.assign(jetsMCP.size(), {}); + splittingMatchesPtVecVecMCP.assign(jetsMCP.size(), {}); + splittingMatchesHFVecVecMCP.assign(jetsMCP.size(), {}); + pairMatchesVecVecMCP.assign(jetsMCP.size(), {}); + analyseSubstructureMatched(jetsMCP, splittingsMCP, pairsMCP, splittingsPerJetMCP, pairsPerJetMCP, splittingMatchesGeoVecVecMCP, splittingMatchesPtVecVecMCP, splittingMatchesHFVecVecMCP, pairMatchesVecVecMCP, jetPtMinMCP); } - PROCESS_SWITCH(JetSubstructureOutputTask, processOutputMatchingData, "jet matching output Data", false); + PROCESS_SWITCH(JetSubstructureOutputTask, processOutputSubstructureMatchingMC, "substructure matching output MC", false); - void processOutputMCD(aod::JetCollisionMCD const& collision, aod::JetMcCollisions const&, + void processOutputMCD(soa::Join::iterator const& collision, aod::JetMcCollisions const&, soa::Join const& jets) { - analyseCharged(collision, jets, collisionOutputTableMCD, jetOutputTableMCD, jetSubstructureOutputTableMCD, jetMappingMCD, jetPtMinMCD, collision.mcCollision().weight()); + analyseCharged(collision, jets, collisionOutputTableMCD, jetOutputTableMCD, jetSubstructureOutputTableMCD, splittingMatchesGeoVecVecMCD, splittingMatchesPtVecVecMCD, splittingMatchesHFVecVecMCD, pairMatchesVecVecMCD, jetMappingMCD, jetPtMinMCD, collision.mcCollision().weight()); } PROCESS_SWITCH(JetSubstructureOutputTask, processOutputMCD, "jet substructure output MCD", false); - void processOutputMCP(aod::JetMcCollision const& collision, + void processOutputMCP(soa::Join::iterator const& collision, soa::Join const& jets) { - analyseCharged(collision, jets, collisionOutputTableMCP, jetOutputTableMCP, jetSubstructureOutputTableMCP, jetMappingMCP, jetPtMinMCP, collision.weight()); + analyseCharged(collision, jets, collisionOutputTableMCP, jetOutputTableMCP, jetSubstructureOutputTableMCP, splittingMatchesGeoVecVecMCP, splittingMatchesPtVecVecMCP, splittingMatchesHFVecVecMCP, pairMatchesVecVecMCP, jetMappingMCP, jetPtMinMCP, collision.weight()); } PROCESS_SWITCH(JetSubstructureOutputTask, processOutputMCP, "jet substructure output MCP", false); - void processOutputMatchingMC(soa::Join const& jetsMCD, - soa::Join const& jetsMCP) + void processOutputJetMatchingMC(soa::Join const& jetsMCD, + soa::Join const& jetsMCP) { - analyseMatched(jetsMCD, jetsMCP, jetMappingMCD, jetMappingMCP, jetMatchingOutputTableMCD, jetPtMinMCD); - analyseMatched(jetsMCP, jetsMCD, jetMappingMCP, jetMappingMCD, jetMatchingOutputTableMCP, jetPtMinMCP); + analyseJetMatched(jetsMCD, jetMappingMCD, jetMappingMCP, jetMatchingOutputTableMCD, jetPtMinMCD); + analyseJetMatched(jetsMCP, jetMappingMCP, jetMappingMCD, jetMatchingOutputTableMCP, jetPtMinMCP); } - PROCESS_SWITCH(JetSubstructureOutputTask, processOutputMatchingMC, "jet matching output MC", false); + PROCESS_SWITCH(JetSubstructureOutputTask, processOutputJetMatchingMC, "jet matching output MC", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From c6cd118cb104fb3b08e9c03a86b8975d86da1223 Mon Sep 17 00:00:00 2001 From: choich08365 <157435123+choich08365@users.noreply.github.com> Date: Sun, 2 Mar 2025 07:28:48 +0900 Subject: [PATCH 0495/1650] [PWGJE] Added THnSparse::Sumw2() call option for error calculation, Fixed bugs. (#10223) Co-authored-by: Changhwan Choi --- PWGJE/Tasks/CMakeLists.txt | 2 +- ...{bjetTaggingGNN.cxx => bjetTaggingGnn.cxx} | 99 ++++++++----------- 2 files changed, 42 insertions(+), 59 deletions(-) rename PWGJE/Tasks/{bjetTaggingGNN.cxx => bjetTaggingGnn.cxx} (84%) diff --git a/PWGJE/Tasks/CMakeLists.txt b/PWGJE/Tasks/CMakeLists.txt index 7bd3a82114b..0b8443531f8 100644 --- a/PWGJE/Tasks/CMakeLists.txt +++ b/PWGJE/Tasks/CMakeLists.txt @@ -262,7 +262,7 @@ if(FastJet_FOUND) PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(bjet-tagging-gnn - SOURCES bjetTaggingGNN.cxx + SOURCES bjetTaggingGnn.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(jet-shape diff --git a/PWGJE/Tasks/bjetTaggingGNN.cxx b/PWGJE/Tasks/bjetTaggingGnn.cxx similarity index 84% rename from PWGJE/Tasks/bjetTaggingGNN.cxx rename to PWGJE/Tasks/bjetTaggingGnn.cxx index a3e453435db..9cc4e89088a 100644 --- a/PWGJE/Tasks/bjetTaggingGNN.cxx +++ b/PWGJE/Tasks/bjetTaggingGnn.cxx @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file bjetTaggingGNN.cxx +/// \file bjetTaggingGnn.cxx /// \brief b-jet tagging using GNN /// /// \author Changhwan Choi , Pusan National University @@ -43,7 +43,7 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; -struct BjetTaggingGNN { +struct BjetTaggingGnn { HistogramRegistry registry; @@ -67,13 +67,6 @@ struct BjetTaggingGNN { // track level configurables Configurable svPtMin{"svPtMin", 0.5, "minimum SV pT"}; - // Configurable prongsigmaLxyMax{"prongsigmaLxyMax", 100, "maximum sigma of decay length of prongs on xy plane"}; - // // Configurable prongsigmaLxyzMax{"prongsigmaLxyzMax", 100, "maximum sigma of decay length of prongs on xyz plane"}; - // Configurable prongIPxyMin{"prongIPxyMin", 0.008, "minimum impact paramter of prongs on xy plane [cm]"}; - // Configurable prongIPxyMax{"prongIPxyMax", 1, "maximum impact parmeter of prongs on xy plane [cm]"}; - // Configurable prongChi2PCAMin{"prongChi2PCAMin", 4, "minimum Chi2 PCA of decay length of prongs"}; - // Configurable prongChi2PCAMax{"prongChi2PCAMax", 100, "maximum Chi2 PCA of decay length of prongs"}; - // jet level configurables Configurable jetPtMin{"jetPtMin", 5.0, "minimum jet pT"}; Configurable jetPtMax{"jetPtMax", 1000.0, "maximum jet pT"}; @@ -83,6 +76,7 @@ struct BjetTaggingGNN { Configurable> jetRadii{"jetRadii", std::vector{0.4}, "jet resolution parameters"}; Configurable doDataDriven{"doDataDriven", false, "Flag whether to use fill THnSpase for data driven methods"}; + Configurable callSumw2{"callSumw2", false, "Flag whether to call THnSparse::Sumw2() for error calculation"}; std::vector eventSelectionBits; @@ -110,15 +104,10 @@ struct BjetTaggingGNN { registry.add("h_Db", "", {HistType::kTH1F, {axisDbFine}}); registry.add("h2_jetpT_Db", "", {HistType::kTH2F, {axisJetpT, axisDb}}); registry.add("h2_jetpT_SVMass", "", {HistType::kTH2F, {axisJetpT, axisSVMass}}); - registry.add("h2_jetpT_SVEnergy", "", {HistType::kTH2F, {axisJetpT, axisSVEnergy}}); - registry.add("h2_jetpT_SLxy", "", {HistType::kTH2F, {axisJetpT, axisSLxy}}); registry.add("h2_jetpT_jetMass", "", {HistType::kTH2F, {axisJetpT, axisJetMass}}); registry.add("h2_jetpT_jetProb", "", {HistType::kTH2F, {axisJetpT, axisJetProb}}); registry.add("h2_jetpT_nTracks", "", {HistType::kTH2F, {axisJetpT, axisNTracks}}); - registry.add("h3_jetpT_nTracks_Db", "", {HistType::kTH3F, {axisJetpT, axisNTracks, axisDb}}); - registry.add("h3_mSV_eSV_slXY", ";m_{SV};E_{SV};SL_{XY}", {HistType::kTH3F, {{110, -2., 20.}, {110, -2., 20.}, {102, -2., 100.}}}); - if (doprocessMCJets) { registry.add("h_jetpT_b", "b-jet", {HistType::kTH1F, {axisJetpT}}); registry.add("h_jetpT_c", "c-jet", {HistType::kTH1F, {axisJetpT}}); @@ -132,12 +121,6 @@ struct BjetTaggingGNN { registry.add("h2_jetpT_SVMass_b", "b-jet", {HistType::kTH2F, {axisJetpT, axisSVMass}}); registry.add("h2_jetpT_SVMass_c", "c-jet", {HistType::kTH2F, {axisJetpT, axisSVMass}}); registry.add("h2_jetpT_SVMass_lf", "lf-jet", {HistType::kTH2F, {axisJetpT, axisSVMass}}); - registry.add("h2_jetpT_SVEnergy_b", "b-jet", {HistType::kTH2F, {axisJetpT, axisSVEnergy}}); - registry.add("h2_jetpT_SVEnergy_c", "c-jet", {HistType::kTH2F, {axisJetpT, axisSVEnergy}}); - registry.add("h2_jetpT_SVEnergy_lf", "lf-jet", {HistType::kTH2F, {axisJetpT, axisSVEnergy}}); - registry.add("h2_jetpT_SLxy_b", "b-jet", {HistType::kTH2F, {axisJetpT, axisSLxy}}); - registry.add("h2_jetpT_SLxy_c", "c-jet", {HistType::kTH2F, {axisJetpT, axisSLxy}}); - registry.add("h2_jetpT_SLxy_lf", "lf-jet", {HistType::kTH2F, {axisJetpT, axisSLxy}}); registry.add("h2_jetpT_jetMass_b", "b-jet", {HistType::kTH2F, {axisJetpT, axisJetMass}}); registry.add("h2_jetpT_jetMass_c", "c-jet", {HistType::kTH2F, {axisJetpT, axisJetMass}}); registry.add("h2_jetpT_jetMass_lf", "lf-jet", {HistType::kTH2F, {axisJetpT, axisJetMass}}); @@ -161,6 +144,10 @@ struct BjetTaggingGNN { registry.add("h_Db_npp_b", "NotPhysPrim b-jet", {HistType::kTH1F, {axisDbFine}}); registry.add("h_Db_npp_c", "NotPhysPrim c-jet", {HistType::kTH1F, {axisDbFine}}); registry.add("h_Db_npp_lf", "NotPhysPrim lf-jet", {HistType::kTH1F, {axisDbFine}}); + // registry.add("h2_pT_dcaXY_pp", "tracks", {HistType::kTH2F, {axisJetpT, {200, 0., 1.}}}); + // registry.add("h2_pT_dcaXY_npp", "NotPhysPrim tracks", {HistType::kTH2F, {axisJetpT, {200, 0., 1.}}}); + // registry.add("h2_pT_dcaZ_pp", "tracks", {HistType::kTH2F, {axisJetpT, {200, 0., 2.}}}); + // registry.add("h2_pT_dcaZ_npp", "NotPhysPrim tracks", {HistType::kTH2F, {axisJetpT, {200, 0., 2.}}}); } if (doprocessMCTruthJets) { @@ -171,13 +158,13 @@ struct BjetTaggingGNN { } if (doDataDriven) { - registry.add("hSparse_Incljets", "", {HistType::kTHnSparseF, {axisJetpT, axisDbFine, axisSVMass, axisJetMass, axisNTracks}}); + registry.add("hSparse_Incljets", "", {HistType::kTHnSparseF, {axisJetpT, axisDbFine, axisSVMass, axisJetMass, axisNTracks}}, callSumw2); if (doprocessMCJets) { - registry.add("hSparse_bjets", "", {HistType::kTHnSparseF, {axisJetpT, axisDbFine, axisSVMass, axisJetMass, axisNTracks}}); - registry.add("hSparse_cjets", "", {HistType::kTHnSparseF, {axisJetpT, axisDbFine, axisSVMass, axisJetMass, axisNTracks}}); - registry.add("hSparse_lfjets", "", {HistType::kTHnSparseF, {axisJetpT, axisDbFine, axisSVMass, axisJetMass, axisNTracks}}); - registry.add("hSparse_lfjets_none", "", {HistType::kTHnSparseF, {axisJetpT, axisDbFine, axisSVMass, axisJetMass, axisNTracks}}); - registry.add("hSparse_lfjets_matched", "", {HistType::kTHnSparseF, {axisJetpT, axisDbFine, axisSVMass, axisJetMass, axisNTracks}}); + registry.add("hSparse_bjets", "", {HistType::kTHnSparseF, {axisJetpT, axisDbFine, axisSVMass, axisJetMass, axisNTracks}}, callSumw2); + registry.add("hSparse_cjets", "", {HistType::kTHnSparseF, {axisJetpT, axisDbFine, axisSVMass, axisJetMass, axisNTracks}}, callSumw2); + registry.add("hSparse_lfjets", "", {HistType::kTHnSparseF, {axisJetpT, axisDbFine, axisSVMass, axisJetMass, axisNTracks}}, callSumw2); + registry.add("hSparse_lfjets_none", "", {HistType::kTHnSparseF, {axisJetpT, axisDbFine, axisSVMass, axisJetMass, axisNTracks}}, callSumw2); + registry.add("hSparse_lfjets_matched", "", {HistType::kTHnSparseF, {axisJetpT, axisDbFine, axisSVMass, axisJetMass, axisNTracks}}, callSumw2); } } } @@ -197,7 +184,7 @@ struct BjetTaggingGNN { int analyzeJetTrackInfo(AnyCollision const& /*collision*/, AnalysisJet const& analysisJet, AnyTracks const& /*allTracks*/ /*, int8_t jetFlavor = 0, double weight = 1.0*/) { int nTracks = 0; - for (auto& constituent : analysisJet.template tracks_as()) { + for (const auto& constituent : analysisJet.template tracks_as()) { if (constituent.pt() < trackPtMin) { continue; @@ -241,7 +228,7 @@ struct BjetTaggingGNN { void processDummy(FilteredCollision::iterator const& /*collision*/) { } - PROCESS_SWITCH(BjetTaggingGNN, processDummy, "Dummy process function turned on by default", true); + PROCESS_SWITCH(BjetTaggingGnn, processDummy, "Dummy process function turned on by default", true); void processDataJets(FilteredCollision::iterator const& collision, DataJets const& alljets, JetTrackswID const& allTracks, SVTable const& allSVs) { @@ -268,8 +255,8 @@ struct BjetTaggingGNN { int nTracks = analyzeJetTrackInfo(collision, analysisJet, allTracks); float mSV = -1.f; - float eSV = -1.f; - float slXY = -1.f; + // float eSV = -1.f; + // float slXY = -1.f; bool checkSV; // auto sv = jettaggingutilities::jetFromProngMaxDecayLength(analysisJet, prongChi2PCAMin, prongChi2PCAMax, prongsigmaLxyMax, prongIPxyMin, prongIPxyMax, false, &checkSV); @@ -277,16 +264,14 @@ struct BjetTaggingGNN { if (checkSV) { mSV = sv.m(); - eSV = sv.e(); - slXY = sv.decayLengthXY() / sv.errorDecayLengthXY(); + // eSV = sv.e(); + // slXY = sv.decayLengthXY() / sv.errorDecayLengthXY(); } registry.fill(HIST("h_jetpT"), analysisJet.pt()); registry.fill(HIST("h_Db"), analysisJet.scoreML()); registry.fill(HIST("h2_jetpT_Db"), analysisJet.pt(), analysisJet.scoreML()); registry.fill(HIST("h2_jetpT_SVMass"), analysisJet.pt(), mSV); - registry.fill(HIST("h2_jetpT_SVEnergy"), analysisJet.pt(), eSV); - registry.fill(HIST("h2_jetpT_SLxy"), analysisJet.pt(), slXY); registry.fill(HIST("h2_jetpT_jetMass"), analysisJet.pt(), analysisJet.mass()); registry.fill(HIST("h2_jetpT_jetProb"), analysisJet.pt(), analysisJet.jetProb()); registry.fill(HIST("h2_jetpT_nTracks"), analysisJet.pt(), nTracks); @@ -296,13 +281,13 @@ struct BjetTaggingGNN { } } } - PROCESS_SWITCH(BjetTaggingGNN, processDataJets, "jet information in Data", false); + PROCESS_SWITCH(BjetTaggingGnn, processDataJets, "jet information in Data", false); using MCDJetTable = soa::Filtered>; using MCPJetTable = soa::Filtered>; using FilteredCollisionMCD = soa::Filtered>; - void processMCJets(FilteredCollisionMCD::iterator const& collision, MCDJetTable const& MCDjets, MCPJetTable const& /*MCPjets*/, JetTracksMCDwID const& allTracks, MCDSVTable const& allSVs, aod::JetParticles const& /*MCParticles*/) + void processMCJets(FilteredCollisionMCD::iterator const& collision, MCDJetTable const& MCDjets, MCPJetTable const& /*MCPjets*/, JetTracksMCDwID const& /*allTracks*/, MCDSVTable const& allSVs, aod::JetParticles const& /*MCParticles*/) { if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { return; @@ -332,49 +317,51 @@ struct BjetTaggingGNN { int8_t jetFlavor = analysisJet.origin(); - int nTracks = analyzeJetTrackInfo(collision, analysisJet, allTracks /*, jetFlavor, weight*/); + // int nTracks = analyzeJetTrackInfo(collision, analysisJet, allTracks /*, jetFlavor, weight*/); + int nTracks = 0; int nNppTracks = 0; - for (auto& constituent : analysisJet.template tracks_as()) { - if (!constituent.has_mcParticle() || !constituent.template mcParticle_as().isPhysicalPrimary() || constituent.pt() < trackPtMin) { + for (const auto& constituent : analysisJet.template tracks_as()) { + if (constituent.pt() < trackPtMin) { + continue; + } + if (!constituent.has_mcParticle() || !constituent.template mcParticle_as().isPhysicalPrimary()) { + // registry.fill(HIST("h2_pT_dcaXY_npp"), constituent.pt(), constituent.dcaXY()); + // registry.fill(HIST("h2_pT_dcaZ_npp"), constituent.pt(), constituent.dcaZ()); ++nNppTracks; + } else { + // registry.fill(HIST("h2_pT_dcaXY_pp"), constituent.pt(), constituent.dcaXY()); + // registry.fill(HIST("h2_pT_dcaZ_pp"), constituent.pt(), constituent.dcaZ()); } + ++nTracks; } float mSV = -1.f; - float eSV = -1.f; - float slXY = -1.f; + // float eSV = -1.f; + // float slXY = -1.f; bool checkSV; - // auto sv = jettaggingutilities::jetFromProngMaxDecayLength(analysisJet, prongChi2PCAMin, prongChi2PCAMax, prongsigmaLxyMax, prongIPxyMin, prongIPxyMax, false, &checkSV); auto sv = analyzeJetSVInfo(analysisJet, allSVs, checkSV /*, jetFlavor, weight*/); if (checkSV) { mSV = sv.m(); - eSV = sv.e(); - slXY = sv.decayLengthXY() / sv.errorDecayLengthXY(); - registry.fill(HIST("h3_mSV_eSV_slXY"), mSV, eSV, slXY, weight); + // eSV = sv.e(); + // slXY = sv.decayLengthXY() / sv.errorDecayLengthXY(); } registry.fill(HIST("h_jetpT"), analysisJet.pt(), weight); registry.fill(HIST("h_Db"), analysisJet.scoreML(), weight); registry.fill(HIST("h2_jetpT_Db"), analysisJet.pt(), analysisJet.scoreML(), weight); registry.fill(HIST("h2_jetpT_SVMass"), analysisJet.pt(), mSV, weight); - registry.fill(HIST("h2_jetpT_SVEnergy"), analysisJet.pt(), eSV, weight); - registry.fill(HIST("h2_jetpT_SLxy"), analysisJet.pt(), slXY, weight); registry.fill(HIST("h2_jetpT_jetMass"), analysisJet.pt(), analysisJet.mass(), weight); registry.fill(HIST("h2_jetpT_jetProb"), analysisJet.pt(), analysisJet.jetProb(), weight); registry.fill(HIST("h2_jetpT_nTracks"), analysisJet.pt(), nTracks, weight); - registry.fill(HIST("h3_jetpT_nTracks_Db"), analysisJet.pt(), nTracks, analysisJet.scoreML(), weight); - if (jetFlavor == JetTaggingSpecies::beauty) { registry.fill(HIST("h_jetpT_b"), analysisJet.pt(), weight); registry.fill(HIST("h_Db_b"), analysisJet.scoreML(), weight); registry.fill(HIST("h2_jetpT_Db_b"), analysisJet.pt(), analysisJet.scoreML(), weight); registry.fill(HIST("h2_jetpT_SVMass_b"), analysisJet.pt(), mSV, weight); - registry.fill(HIST("h2_jetpT_SVEnergy_b"), analysisJet.pt(), eSV, weight); - registry.fill(HIST("h2_jetpT_SLxy_b"), analysisJet.pt(), slXY, weight); registry.fill(HIST("h2_jetpT_jetMass_b"), analysisJet.pt(), analysisJet.mass(), weight); registry.fill(HIST("h2_jetpT_jetProb_b"), analysisJet.pt(), analysisJet.jetProb(), weight); registry.fill(HIST("h2_jetpT_nTracks_b"), analysisJet.pt(), nTracks, weight); @@ -383,8 +370,6 @@ struct BjetTaggingGNN { registry.fill(HIST("h_Db_c"), analysisJet.scoreML(), weight); registry.fill(HIST("h2_jetpT_Db_c"), analysisJet.pt(), analysisJet.scoreML(), weight); registry.fill(HIST("h2_jetpT_SVMass_c"), analysisJet.pt(), mSV, weight); - registry.fill(HIST("h2_jetpT_SVEnergy_c"), analysisJet.pt(), eSV, weight); - registry.fill(HIST("h2_jetpT_SLxy_c"), analysisJet.pt(), slXY, weight); registry.fill(HIST("h2_jetpT_jetMass_c"), analysisJet.pt(), analysisJet.mass(), weight); registry.fill(HIST("h2_jetpT_jetProb_c"), analysisJet.pt(), analysisJet.jetProb(), weight); registry.fill(HIST("h2_jetpT_nTracks_c"), analysisJet.pt(), nTracks, weight); @@ -393,8 +378,6 @@ struct BjetTaggingGNN { registry.fill(HIST("h_Db_lf"), analysisJet.scoreML(), weight); registry.fill(HIST("h2_jetpT_Db_lf"), analysisJet.pt(), analysisJet.scoreML(), weight); registry.fill(HIST("h2_jetpT_SVMass_lf"), analysisJet.pt(), mSV, weight); - registry.fill(HIST("h2_jetpT_SVEnergy_lf"), analysisJet.pt(), eSV, weight); - registry.fill(HIST("h2_jetpT_SLxy_lf"), analysisJet.pt(), slXY, weight); registry.fill(HIST("h2_jetpT_jetMass_lf"), analysisJet.pt(), analysisJet.mass(), weight); registry.fill(HIST("h2_jetpT_jetProb_lf"), analysisJet.pt(), analysisJet.jetProb(), weight); registry.fill(HIST("h2_jetpT_nTracks_lf"), analysisJet.pt(), nTracks, weight); @@ -452,7 +435,7 @@ struct BjetTaggingGNN { } } } - PROCESS_SWITCH(BjetTaggingGNN, processMCJets, "jet information in MC", false); + PROCESS_SWITCH(BjetTaggingGnn, processMCJets, "jet information in MC", false); Filter mccollisionFilter = nabs(aod::jmccollision::posZ) < vertexZCut; using FilteredCollisionMCP = soa::Filtered; @@ -493,11 +476,11 @@ struct BjetTaggingGNN { } } } - PROCESS_SWITCH(BjetTaggingGNN, processMCTruthJets, "truth jet information", false); + PROCESS_SWITCH(BjetTaggingGnn, processMCTruthJets, "truth jet information", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"bjet-tagging-gnn"})}; + adaptAnalysisTask(cfgc)}; } From b980fcea7cea9654b8c633a07f9b65c8ef3dcd31 Mon Sep 17 00:00:00 2001 From: JimunLee Date: Sun, 2 Mar 2025 08:17:35 +0900 Subject: [PATCH 0496/1650] [PWGJE] Added functionality for M_inv closure tests (#10217) Co-authored-by: Jimun Lee Co-authored-by: jimun_lee --- PWGJE/Tasks/phiInJets.cxx | 282 +++++++++++++++++--------------------- 1 file changed, 123 insertions(+), 159 deletions(-) diff --git a/PWGJE/Tasks/phiInJets.cxx b/PWGJE/Tasks/phiInJets.cxx index 26c381492b2..3776cf284c1 100644 --- a/PWGJE/Tasks/phiInJets.cxx +++ b/PWGJE/Tasks/phiInJets.cxx @@ -19,6 +19,8 @@ #include #include #include +#include +#include #include "Framework/ASoA.h" #include "Framework/AnalysisDataModel.h" @@ -102,7 +104,6 @@ struct phiInJets { if (cfgDataHists) { JEhistos.add("nEvents", "nEvents", kTH1F, {{4, 0.0, 4.0}}); - JEhistos.add("hDCArToPv", "DCArToPv", kTH1F, {{300, 0.0, 3.0}}); JEhistos.add("hDCAzToPv", "DCAzToPv", kTH1F, {{300, 0.0, 3.0}}); JEhistos.add("rawpT", "rawpT", kTH1F, {{1000, 0.0, 10.0}}); @@ -163,6 +164,33 @@ struct phiInJets { JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE_pt_v_eta", "hMCRec_nonmatch_hUSS_INSIDE_pt_v_eta", kTH2F, {PtAxis, axisEta}); JEhistos.add("JetVsPhi_REC", "JetVsPhi_REC", kTH2F, {{4000, 0., 200.}, {200, 0, 20.0}}); + JEhistos.add("hMCRecTrue_hUSS", "hMCRecTrue_hUSS", kTH3F, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRecTrue_hLSS", "hMCRecTrue_hLSS", kTH3F, {dRAxis, PtAxis, MinvAxis}); + + JEhistos.add("hMCRec_hUSS", "hMCRec_hUSS", kTH3F, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRec_hUSS_1D", "hMCRec_hUSS_1D", kTH1F, {MinvAxis}); + JEhistos.add("hMCRec_hUSS_1D_2_3", "hMCRec_hUSS_1D_2_3", kTH1F, {MinvAxis}); + + JEhistos.add("hMCRec_hLSS", "hMCRec_hLSS", kTH3F, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRec_hLSS_1D", "hMCRec_hLSS_1D", kTH1F, {MinvAxis}); + JEhistos.add("hMCRec_hLSS_1D_2_3", "hMCRec_hLSS_1D_2_3", kTH1F, {MinvAxis}); + + JEhistos.add("hMCRec_hUSS_INSIDE", "hMCRec_hUSS_INSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRec_hUSS_INSIDE_1D", "hMCRec_hUSS_INSIDE_1D", kTH1F, {MinvAxis}); + JEhistos.add("hMCRec_hUSS_INSIDE_1D_2_3", "hMCRec_hUSS_INSIDE_1D_2_3", kTH1F, {MinvAxis}); + + JEhistos.add("hMCRec_hLSS_INSIDE", "hMCRec_hLSS_INSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRec_hLSS_INSIDE_1D", "hMCRec_hLSS_INSIDE_1D", kTH1F, {MinvAxis}); + JEhistos.add("hMCRec_hLSS_INSIDE_1D_2_3", "hMCRec_hLSS_INSIDE_1D_2_3", kTH1F, {MinvAxis}); + + JEhistos.add("hMCRecTrue_hUSS_INSIDE", "hMCRecTrue_hUSS_INSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRecTrue_hUSS_INSIDE_1D", "hMCRecTrue_hUSS_INSIDE_1D", kTH1F, {MinvAxis}); + JEhistos.add("hMCRecTrue_hUSS_INSIDE_1D_2_3", "hMCRecTrue_hUSS_INSIDE_1D_2_3", kTH1F, {MinvAxis}); + + JEhistos.add("hMCRecTrue_hLSS_INSIDE", "hMCRecTrue_hLSS_INSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRecTrue_hLSS_INSIDE_1D", "hMCRecTrue_hLSS_INSIDE_1D", kTH1F, {MinvAxis}); + JEhistos.add("hMCRecTrue_hLSS_INSIDE_1D_2_3", "hMCRecTrue_hLSS_INSIDE_1D_2_3", kTH1F, {MinvAxis}); + JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE", "hMCRec_nonmatch_hUSS_INSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE_1D", "hMCRec_nonmatch_hUSS_INSIDE_1D", kTH1F, {MinvAxis}); JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE_1D_2_3", "hMCRec_nonmatch_hUSS_INSIDE_1D_2_3", kTH1F, {MinvAxis}); @@ -229,49 +257,6 @@ struct phiInJets { JEhistos.add("hMCRec_hUSS_INSIDE_1D", "hMCRec_hUSS_INSIDE_1D", kTH1F, {MinvAxis}); JEhistos.add("hMCRec_hUSS_INSIDE_1D_2_3", "hMCRec_hUSS_INSIDE_1D_2_3", kTH1F, {MinvAxis}); } - // JEhistos.add("FJetaHistogram_MCRec", "FJetaHistogram_MCRec", kTH1F, {axisEta}); - // JEhistos.add("FJphiHistogram_MCRec", "FJphiHistogram_MCRec", kTH1F, {axisPhi}); - // JEhistos.add("FJptHistogram_MCRec", "FJptHistogram_MCRec", kTH1F, {axisPt}); - // JEhistos.add("FJetaHistogram_MCTrue", "FJetaHistogram_MCTrue", kTH1F, {axisEta}); - // JEhistos.add("FJphiHistogram_MCTrue", "FJphiHistogram_MCTrue", kTH1F, {axisPhi}); - // JEhistos.add("FJptHistogram_MCTrue", "FJptHistogram_MCTrue", kTH1F, {axisPt}); - // JEhistos.add("hUSS_OUTSIDE", "hUSS_OUTSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); - // JEhistos.add("hUSS_OUTSIDE_1D", "hUSS_OUTSIDE_1D", kTH1F, {MinvAxis}); - // JEhistos.add("hUSS_OUTSIDE_1D_2_3", "hUSS_OUTSIDE_1D_2_3", kTH1F, {MinvAxis}); - // JEhistos.add("hLSS_OUTSIDE", "hLSS_OUTSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); - // JEhistos.add("hLSS_OUTSIDE_1D", "hLSS_OUTSIDE_1D", kTH1F, {MinvAxis}); - // JEhistos.add("hLSS_OUTSIDE_1D_2_3", "hLSS_OUTSIDE_1D_2_3", kTH1F, {MinvAxis}); - // JEhistos.add("hMCTrue_hUSS_OUTSIDE", "hMCTrue_hUSS_OUTSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); - // JEhistos.add("hMCTrue_hUSS_OUTSIDE_1D", "hMCTrue_hUSS_OUTSIDE_1D", kTH1F, {MinvAxis}); - // JEhistos.add("hMCTrue_hUSS_OUTSIDE_1D_2_3", "hMCTrue_hUSS_OUTSIDE_1D_2_3", kTH1F, {MinvAxis}); - // JEhistos.add("hMCTrue_hUSS_OUTSIDE_TRIG", "hMCTrue_hUSS_OUTSIDE_TRIG", kTH3F, {dRAxis, PtAxis, MinvAxis}); - // JEhistos.add("hMCTrue_hUSS_OUTSIDE_TRIG_1D", "hMCTrue_hUSS_OUTSIDE_TRIG_1D", kTH1F, {MinvAxis}); - // JEhistos.add("hMCTrue_hUSS_OUTSIDE_TRIG_1D_2_3", "hMCTrue_hUSS_OUTSIDE_TRIG_1D_2_3", kTH1F, {MinvAxis}); - // JEhistos.add("hMCTrue_nonmatch_hUSS_OUTSIDE", "hMCTrue_nonmatch_hUSS_OUTSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); - // JEhistos.add("hMCTrue_nonmatch_hUSS_OUTSIDE_1D", "hMCTrue_nonmatch_hUSS_OUTSIDE_1D", kTH1F, {MinvAxis}); - // JEhistos.add("hMCTrue_nonmatch_hUSS_OUTSIDE_1D_2_3", "hMCTrue_nonmatch_hUSS_OUTSIDE_1D_2_3", kTH1F, {MinvAxis}); - // JEhistos.add("hMCTrue_nonmatch_hUSS_OUTSIDE_TRIG", "hMCTrue_nonmatch_hUSS_OUTSIDE_TRIG", kTH3F, {dRAxis, PtAxis, MinvAxis}); - // JEhistos.add("hMCTrue_nonmatch_hUSS_OUTSIDE_TRIG_1D", "hMCTrue_nonmatch_hUSS_OUTSIDE_TRIG_1D", kTH1F, {MinvAxis}); - // JEhistos.add("hMCTrue_nonmatch_hUSS_OUTSIDE_TRIG_1D_2_3", "hMCTrue_nonmatch_hUSS_OUTSIDE_TRIG_1D_2_3", kTH1F, {MinvAxis}); - // JEhistos.add("hMCRec_hUSS", "hMCRec_hUSS", kTH3F, {dRAxis, PtAxis, MinvAxis}); - // JEhistos.add("hMCRec_hUSS_1D", "hMCRec_hUSS_1D", kTH1F, {MinvAxis}); - // JEhistos.add("hMCRec_hUSS_1D_2_3", "hMCRec_hUSS_1D_2_3", kTH1F, {MinvAxis}); - // JEhistos.add("hMCRec_hUSS_OUTSIDE", "hMCRec_hUSS_OUTSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); - // JEhistos.add("hMCRec_hUSS_OUTSIDE_1D", "hMCRec_hUSS_OUTSIDE_1D", kTH1F, {MinvAxis}); - // JEhistos.add("hMCRec_hUSS_OUTSIDE_1D_2_3", "hMCRec_hUSS_OUTSIDE_1D_2_3", kTH1F, {MinvAxis}); - // JEhistos.add("hMCRec_hUSS_OUTSIDE_TRIG", "hMCRec_hUSS_OUTSIDE_TRIG", kTH3F, {dRAxis, PtAxis, MinvAxis}); - // JEhistos.add("hMCRec_hUSS_OUTSIDE_TRIG_1D", "hMCRec_hUSS_OUTSIDE_TRIG_1D", kTH1F, {MinvAxis}); - // JEhistos.add("hMCRec_hUSS_OUTSIDE_TRIG_1D_2_3", "hMCRec_hUSS_OUTSIDE_TRIG_1D_2_3", kTH1F, {MinvAxis}); - // JEhistos.add("hMCRec_nonmatch_hUSS", "hMCRec_nonmatch_hUSS", kTH3F, {dRAxis, PtAxis, MinvAxis}); - // JEhistos.add("hMCRec_nonmatch_hUSS_1D", "hMCRec_nonmatch_hUSS_1D", kTH1F, {MinvAxis}); - // JEhistos.add("hMCRec_nonmatch_hUSS_1D_2_3", "hMCRec_nonmatch_hUSS_1D_2_3", kTH1F, {MinvAxis}); - // JEhistos.add("hMCRec_nonmatch_hUSS_OUTSIDE", "hMCRec_nonmatch_hUSS_OUTSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); - // JEhistos.add("hMCRec_nonmatch_hUSS_OUTSIDE_1D", "hMCRec_nonmatch_hUSS_OUTSIDE_1D", kTH1F, {MinvAxis}); - // JEhistos.add("hMCRec_nonmatch_hUSS_OUTSIDE_1D_2_3", "hMCRec_nonmatch_hUSS_OUTSIDE_1D_2_3", kTH1F, {MinvAxis}); - // JEhistos.add("hMCRec_nonmatch_hUSS_OUTSIDE_TRIG", "hMCRec_nonmatch_hUSS_OUTSIDE_TRIG", kTH3F, {dRAxis, PtAxis, MinvAxis}); - // JEhistos.add("hMCRec_nonmatch_hUSS_OUTSIDE_TRIG_1D", "hMCRec_nonmatch_hUSS_OUTSIDE_TRIG_1D", kTH1F, {MinvAxis}); - // JEhistos.add("hMCRec_nonmatch_hUSS_OUTSIDE_TRIG_1D_2_3", "hMCRec_nonmatch_hUSS_OUTSIDE_TRIG_1D_2_3", kTH1F, {MinvAxis}); - // EVENT SELECTION eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast(cfgeventSelections)); @@ -522,33 +507,6 @@ struct phiInJets { } // jetflag ///////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////////////// - // Fill outside Jet - // if (!jetFlag) { - // if (trk1.sign() * trk2.sign() < 0) { - // if (!IsMC) { - // JEhistos.fill(HIST("hUSS_OUTSIDE_1D"), lResonance.M()); - // if (lResonance.Pt() > 2.0 && lResonance.Pt() < 3) - // JEhistos.fill(HIST("hUSS_OUTSIDE_1D_2_3"), lResonance.M()); - // JEhistos.fill(HIST("hUSS_OUTSIDE"), jetpt, lResonance.Pt(), lResonance.M()); - // } - - // if (IsMC) { - // JEhistos.fill(HIST("hMCRec_hUSS_OUTSIDE_1D"), lResonance.M()); - // if (lResonance.Pt() > 2.0 && lResonance.Pt() < 3) - // JEhistos.fill(HIST("hMCRec_hUSS_OUTSIDE_1D_2_3"), lResonance.M()); - // JEhistos.fill(HIST("hMCRec_hUSS_OUTSIDE"), jetpt, lResonance.Pt(), lResonance.M()); - // } - - // } else if (trk1.sign() * trk2.sign() > 0) { - - // JEhistos.fill(HIST("hLSS_OUTSIDE_1D"), lResonance.M()); - // if (lResonance.Pt() > 2.0 && lResonance.Pt() < 3) - // JEhistos.fill(HIST("hLSS_OUTSIDE_1D_2_3"), lResonance.M()); - // JEhistos.fill(HIST("hLSS_OUTSIDE"), jetpt, lResonance.Pt(), lResonance.M()); - // } - // } //! jetflag - ///////////////////////////////////////////////////////////////////////////// if (!cfgIsKstar) { if (lResonance.M() > 1.005 && lResonance.M() < 1.035) { if (jetFlag) @@ -580,9 +538,6 @@ struct phiInJets { if (cDebugLevel > 0) { nEvents++; if ((nEvents + 1) % 10000 == 0) { - std::cout << "Ay Lmao" << std::endl; - double histmem = JEhistos.getSize(); - std::cout << histmem << std::endl; std::cout << "Processed Data Events: " << nEvents << std::endl; } } @@ -670,7 +625,9 @@ struct phiInJets { std::cout << "processRec: " << nprocessRecEvents << std::endl; } } - + //================= + // # of Events + //================= JEhistos.fill(HIST("nEvents_MCRec"), 0.5); if (fabs(collision.posZ()) > cfgVtxCut) return; @@ -710,6 +667,7 @@ struct phiInJets { double RealPhiCand = 0; double RealPhiCandWithJet = 0; double RealPhiCandInJet = 0; + //============ // Track Eff for (const auto& track : tracks) { auto originalTrack = track.track_as(); @@ -762,6 +720,60 @@ struct phiInJets { if (lResonance.M() > 1.005 && lResonance.M() < 1.035) PhiCand++; + //================== + // 1.MB REC Closure + //================== + if (originalTrack.sign() * originalTrack2.sign() < 0) { + JEhistos.fill(HIST("hMCRec_hUSS"), 1.0, lResonance.Pt(), lResonance.M()); + } else if (originalTrack.sign() * originalTrack2.sign() > 0) { + JEhistos.fill(HIST("hMCRec_hLSS"), 1.0, lResonance.Pt(), lResonance.M()); + } + //============================================ + // 2.Check if particle is inside a jet or not + //============================================ + bool jetFlag = false; + int goodjets = 0; + double jetpt = 0; + + for (std::size_t i = 0; i < mcd_pt.size(); i++) { + if (i == 0) { + if (lResonance.M() > 1.005 && lResonance.M() < 1.035) { + RealPhiCandWithJet++; + } + } + double phidiff = TVector2::Phi_mpi_pi(mcd_phi[i] - lResonance.Phi()); + double etadiff = mcd_eta[i] - lResonance.Eta(); + double R = TMath::Sqrt((etadiff * etadiff) + (phidiff * phidiff)); + + double phidiff_K1 = TVector2::Phi_mpi_pi(mcd_phi[i] - lDecayDaughter1.Phi()); + double etadiff_K1 = mcd_eta[i] - lDecayDaughter1.Eta(); + double R_K1 = TMath::Sqrt((etadiff_K1 * etadiff_K1) + (phidiff_K1 * phidiff_K1)); + + double phidiff_K2 = TVector2::Phi_mpi_pi(mcd_phi[i] - lDecayDaughter2.Phi()); + double etadiff_K2 = mcd_eta[i] - lDecayDaughter2.Eta(); + double R_K2 = TMath::Sqrt((etadiff_K2 * etadiff_K2) + (phidiff_K2 * phidiff_K2)); + if (R < cfgjetR) { + JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_Kangle_v_pt"), R_K1, lResonance.Pt()); + JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_Kangle_v_pt"), R_K2, lResonance.Pt()); + } + if (R < cfgjetR) { + jetFlag = true; + jetpt = mcd_pt[i]; + goodjets++; + } + } // R check for jets + + //====================== + // 3.INSIDE REC Closure + //====================== + if (jetFlag) { + if (originalTrack.sign() * originalTrack2.sign() < 0) { + JEhistos.fill(HIST("hMCRec_hUSS_INSIDE"), 1.0, lResonance.Pt(), lResonance.M()); + } else if (originalTrack.sign() * originalTrack2.sign() > 0) { + JEhistos.fill(HIST("hMCRec_hLSS_INSIDE"), 1.0, lResonance.Pt(), lResonance.M()); + } + } + // check PID if (track.has_mcParticle() && track2.has_mcParticle()) { auto part1 = track.mcParticle(); @@ -815,41 +827,30 @@ struct phiInJets { JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_KtoKangle_v_pt"), R_Kaons, lResonance.Pt()); JEhistos.fill(HIST("ptJEHistogramPhi"), lResonance.Pt()); - if (lResonance.M() > 1.005 && lResonance.M() < 1.035) - RealPhiCand++; - - // Now we do jets - bool jetFlag = false; - int goodjets = 0; - double jetpt = 0; + //===================== + // 4.MB True Closure + //===================== + if (originalTrack.sign() * originalTrack2.sign() < 0) { + JEhistos.fill(HIST("hMCRecTrue_hUSS"), 1.0, lResonance.Pt(), lResonance.M()); + } else if (originalTrack.sign() * originalTrack2.sign() > 0) { + JEhistos.fill(HIST("hMCRecTrue_hLSS"), 1.0, lResonance.Pt(), lResonance.M()); + } - for (std::size_t i = 0; i < mcd_pt.size(); i++) { - if (i == 0) { - if (lResonance.M() > 1.005 && lResonance.M() < 1.035) { - RealPhiCandWithJet++; - } + //=========================== + // 5.INSIDE REC True Closure + //=========================== + if (jetFlag) { + if (originalTrack.sign() * originalTrack2.sign() < 0) { + JEhistos.fill(HIST("hMCRecTrue_hUSS_INSIDE"), 1.0, lResonance.Pt(), lResonance.M()); + } else if (originalTrack.sign() * originalTrack2.sign() > 0) { + JEhistos.fill(HIST("hMCRecTrue_hLSS_INSIDE"), 1.0, lResonance.Pt(), lResonance.M()); } - double phidiff = TVector2::Phi_mpi_pi(mcd_phi[i] - lResonance.Phi()); - double etadiff = mcd_eta[i] - lResonance.Eta(); - double R = TMath::Sqrt((etadiff * etadiff) + (phidiff * phidiff)); + } - double phidiff_K1 = TVector2::Phi_mpi_pi(mcd_phi[i] - lDecayDaughter1.Phi()); - double etadiff_K1 = mcd_eta[i] - lDecayDaughter1.Eta(); - double R_K1 = TMath::Sqrt((etadiff_K1 * etadiff_K1) + (phidiff_K1 * phidiff_K1)); - double phidiff_K2 = TVector2::Phi_mpi_pi(mcd_phi[i] - lDecayDaughter2.Phi()); - double etadiff_K2 = mcd_eta[i] - lDecayDaughter2.Eta(); - double R_K2 = TMath::Sqrt((etadiff_K2 * etadiff_K2) + (phidiff_K2 * phidiff_K2)); - if (R < cfgjetR) { - JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_Kangle_v_pt"), R_K1, lResonance.Pt()); - JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_Kangle_v_pt"), R_K2, lResonance.Pt()); - } - if (R < cfgjetR) { - jetFlag = true; - jetpt = mcd_pt[i]; - goodjets++; - } - } // R check for jets + if (lResonance.M() > 1.005 && lResonance.M() < 1.035) + RealPhiCand++; + // Now we do jets if (cfgSingleJet) if (goodjets > 1) jetpt = DistinguishJetsMC(mcd_pt, mcd_phi, mcd_eta, lResonance); @@ -872,8 +873,8 @@ struct phiInJets { } JEhistos.fill(HIST("minvJEHistogramPhi"), lResonance.M()); } // mcpart check - } // tracks2 - } // tracks1 + } // tracks2 + } // tracks1 JEhistos.fill(HIST("hNRealPhiVPhiCand"), PhiCand, RealPhiCand); JEhistos.fill(HIST("hNRealPhiWithJetVPhiCand"), PhiCand, RealPhiCandWithJet); JEhistos.fill(HIST("hNRealPhiInJetVPhiCand"), PhiCand, RealPhiCandInJet); @@ -1020,23 +1021,6 @@ struct phiInJets { JEhistos.fill(HIST("hMCTrue_nonmatch_hUSS_INSIDE_1D_2_3"), lResonance.M()); JEhistos.fill(HIST("hMCTrue_nonmatch_hUSS_INSIDE"), jetpt, lResonance.Pt(), lResonance.M()); } - // else if (!jetFlag && mcp_pt.size() > 0) { - // JEhistos.fill(HIST("hMCTrue_nonmatch_hUSS_OUTSIDE_TRIG_1D"), lResonance.M()); - - // if (lResonance.Pt() > 2.0 && lResonance.Pt() < 3) - // JEhistos.fill(HIST("hMCTrue_nonmatch_hUSS_OUTSIDE_TRIG_1D_2_3"), lResonance.M()); - - // JEhistos.fill(HIST("hMCTrue_nonmatch_hUSS_OUTSIDE_TRIG"), jetpt, lResonance.Pt(), lResonance.M()); - - // } else if (!jetFlag) { - // JEhistos.fill(HIST("hMCTrue_nonmatch_hUSS_OUTSIDE_1D"), lResonance.M()); - - // if (lResonance.Pt() > 2.0 && lResonance.Pt() < 3) - // JEhistos.fill(HIST("hMCTrue_nonmatch_hUSS_OUTSIDE_1D_2_3"), lResonance.M()); - - // JEhistos.fill(HIST("hMCTrue_nonmatch_hUSS_OUTSIDE"), jetpt, lResonance.Pt(), lResonance.M()); - - // } //! jetflag ////////////////////////////Phi found if (hasJets) { @@ -1047,9 +1031,9 @@ struct phiInJets { } // check for jets } // check for phi - } // check for rapidity - } // loop over particles - } // process switch + } // check for rapidity + } // loop over particles + } // process switch PROCESS_SWITCH(phiInJets, processSim, "pikp particle level MC", true); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1130,7 +1114,7 @@ struct phiInJets { mcp_eta.push_back(mcpjet.eta()); mcp_phi.push_back(mcpjet.phi()); } // mcpjets - } // mcdjets + } // mcdjets if (hasJets) JEhistos.fill(HIST("nEvents_MCGen_MATCHED"), 2.5); @@ -1196,10 +1180,10 @@ struct phiInJets { break; } } // index check - } // track loop + } // track loop } // mc daughter loop - } // check if particle has daughters - } else { // check for kstar + } // check if particle has daughters + } else { // check for kstar if (mcParticle.has_daughters()) for (auto& dgth : mcParticle.daughters_as()) if (fabs(dgth.pdgCode()) != 321 || fabs(dgth.pdgCode()) != 211) @@ -1220,9 +1204,6 @@ struct phiInJets { lDecayDaughter1_REC.SetXYZM(phi_dgth_px[0], phi_dgth_py[0], phi_dgth_pz[0], massKa); lDecayDaughter2_REC.SetXYZM(phi_dgth_px[1], phi_dgth_py[1], phi_dgth_pz[1], massKa); lResonance_REC = lDecayDaughter1_REC + lDecayDaughter2_REC; - // if (cDebugLevel > 0) - // if (good_daughter[0] && good_daughter[1]) - // std::cout << "Reconstructed level phi pT: " << lResonance_REC.Pt() << std::endl; bool jetFlag = false; for (std::vector::size_type i = 0; i < mcp_pt.size(); i++) { @@ -1274,26 +1255,9 @@ struct phiInJets { JEhistos.fill(HIST("hMCTrue_hUSS_INSIDE_1D_2_3"), lResonance.M()); JEhistos.fill(HIST("hMCTrue_hUSS_INSIDE"), jetpt_mcp, lResonance.Pt(), lResonance.M()); } - // else if (!jetFlag && mcp_pt.size() > 0) { - // JEhistos.fill(HIST("hMCTrue_hUSS_OUTSIDE_TRIG_1D"), lResonance.M()); - - // if (lResonance.Pt() > 2.0 && lResonance.Pt() < 3) - // JEhistos.fill(HIST("hMCTrue_hUSS_OUTSIDE_TRIG_1D_2_3"), lResonance.M()); - - // JEhistos.fill(HIST("hMCTrue_hUSS_OUTSIDE_TRIG"), jetpt_mcp, lResonance.Pt(), lResonance.M()); - - // } else if (!jetFlag) { - // JEhistos.fill(HIST("hMCTrue_hUSS_OUTSIDE_1D"), lResonance.M()); - - // if (lResonance.Pt() > 2.0 && lResonance.Pt() < 3) - // JEhistos.fill(HIST("hMCTrue_hUSS_OUTSIDE_1D_2_3"), lResonance.M()); - - // JEhistos.fill(HIST("hMCTrue_hUSS_OUTSIDE"), jetpt_mcp, lResonance.Pt(), lResonance.M()); - - // } //! jetflag - } // chech for phi - } // MC Particles - } // main fcn + } // chech for phi + } // MC Particles + } // main fcn PROCESS_SWITCH(phiInJets, processMatchedGen, "phi matched level MC", true); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1361,7 +1325,7 @@ struct phiInJets { mcp_eta.push_back(mcpjet.eta()); mcp_phi.push_back(mcpjet.phi()); } // mcpjets - } // mcdjets + } // mcdjets // Now we do REC part if (hasJets) JEhistos.fill(HIST("nEvents_MCRec_MATCHED"), 2.5); @@ -1519,12 +1483,12 @@ struct phiInJets { // } //! jetflag } // pass track cut - } // has mc particle + } // has mc particle } // tracks 2 - } // tracks 1 + } // tracks 1 // } // tracks - } // main fcn + } // main fcn PROCESS_SWITCH(phiInJets, processMatchedRec, "phi matched Rec level MC", true); }; // end of main struct From eca332d49194865518efd39d66d26052df5eda1e Mon Sep 17 00:00:00 2001 From: alcaliva <32872606+alcaliva@users.noreply.github.com> Date: Sun, 2 Mar 2025 10:32:23 +0100 Subject: [PATCH 0497/1650] [PWGLF] decoupling dcaxy and dcaz selections (#10274) --- .../QC/lfITSTPCMatchingSecondaryTracksQA.cxx | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx b/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx index 4d59f6e9dea..66bfce80997 100644 --- a/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx +++ b/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx @@ -74,7 +74,8 @@ struct LfITSTPCMatchingSecondaryTracksQA { Configurable nsigmaTOFmax{"nsigmaTOFmax", +3.0f, "Maximum nsigma TOF"}; Configurable dcaxyMax{"dcaxyMax", 0.1f, "dcaxy max"}; Configurable dcazMax{"dcazMax", 0.1f, "dcaz max"}; - Configurable dcaMin{"dcaMin", 0.1f, "dca min"}; + Configurable dcaxyMin{"dcaxyMin", 0.1f, "dcaxy min"}; + Configurable dcazMin{"dcazMin", 0.1f, "dcaz min"}; Configurable requireTOF{"requireTOF", false, "require TOF hit"}; Configurable requireItsHits{"requireItsHits", false, "require ITS hits"}; Configurable> requiredHit{"requiredHit", {0, 0, 0, 0, 0, 0, 0}, "required ITS Hits (1=required, 0=not required)"}; @@ -152,7 +153,9 @@ struct LfITSTPCMatchingSecondaryTracksQA { return false; if (track.eta() < etaMin || track.eta() > etaMax) return false; - if (std::sqrt(track.dcaXY() * track.dcaXY() + track.dcaZ() * track.dcaZ()) < dcaMin) + if (std::fabs(track.dcaXY()) < dcaxyMin) + return false; + if (std::fabs(track.dcaZ()) < dcazMin) return false; return true; } @@ -223,14 +226,6 @@ struct LfITSTPCMatchingSecondaryTracksQA { if (track.itsNCls() < minITSnCls) return false; - bool hasHitOnAnyLayer = false; - for (int i = 0; i < 7; i++) { - if (hasHitOnITSlayer(track.itsClusterMap(), i)) - hasHitOnAnyLayer = true; - } - if (!hasHitOnAnyLayer) - return false; - auto requiredItsHit = static_cast>(requiredHit); if (requireItsHits) { for (int i = 0; i < 7; i++) { From af6a248c28601372084ff7fbebb773837cb8437c Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Sun, 2 Mar 2025 22:34:52 +0900 Subject: [PATCH 0498/1650] [PWGEM/Photon] update prefilterPhoton.cxx (#10275) --- PWGEM/PhotonMeson/Tasks/prefilterPhoton.cxx | 115 ++++++++++++++++++-- PWGEM/PhotonMeson/Utils/PairUtilities.h | 13 +-- 2 files changed, 107 insertions(+), 21 deletions(-) diff --git a/PWGEM/PhotonMeson/Tasks/prefilterPhoton.cxx b/PWGEM/PhotonMeson/Tasks/prefilterPhoton.cxx index 89b260728af..2727cb631bb 100644 --- a/PWGEM/PhotonMeson/Tasks/prefilterPhoton.cxx +++ b/PWGEM/PhotonMeson/Tasks/prefilterPhoton.cxx @@ -20,12 +20,12 @@ #include #include -#include "TString.h" +// #include "TString.h" #include "Math/Vector4D.h" #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/ASoAHelpers.h" -#include "Common/Core/RecoDecay.h" +// #include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" #include "DetectorsBase/Propagator.h" @@ -39,6 +39,7 @@ #include "PWGEM/PhotonMeson/Core/V0PhotonCut.h" #include "PWGEM/PhotonMeson/Core/EMPhotonEventCut.h" #include "PWGEM/PhotonMeson/Core/DalitzEECut.h" +#include "PWGEM/Dilepton/Utils/PairUtilities.h" using namespace o2; using namespace o2::aod; @@ -61,6 +62,12 @@ struct prefilterPhoton { Produces pfb_ele_derived; // Configurables + Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; + Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + Configurable skipGRPOquery{"skipGRPOquery", true, "skip grpo query"}; + Configurable d_bz_input{"d_bz_input", -999, "bz field in kG, -999 is automatic"}; + Configurable cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"}; Configurable cfgCentMin{"cfgCentMin", -1, "min. centrality"}; Configurable cfgCentMax{"cfgCentMax", 999.f, "max. centrality"}; @@ -115,7 +122,7 @@ struct prefilterPhoton { Configurable cfg_min_mee{"cfg_min_mee", 0.0, "min mass"}; Configurable cfg_max_mee{"cfg_max_mee", 0.02, "max mass"}; - Configurable cfg_apply_phiv{"cfg_apply_phiv", false, "flag to apply phiv cut"}; + // Configurable cfg_apply_phiv{"cfg_apply_phiv", false, "flag to apply phiv cut"}; Configurable cfg_apply_pf{"cfg_apply_pf", false, "flag to apply phiv prefilter"}; Configurable cfg_require_itsib_any{"cfg_require_itsib_any", false, "flag to require ITS ib any hits"}; Configurable cfg_require_itsib_1st{"cfg_require_itsib_1st", true, "flag to require ITS ib 1st hit"}; @@ -139,6 +146,8 @@ struct prefilterPhoton { Configurable cfg_max_TPCNsigmaEl{"cfg_max_TPCNsigmaEl", +3.0, "max. TPC n sigma for electron inclusion"}; Configurable cfg_min_TPCNsigmaPi{"cfg_min_TPCNsigmaPi", 0.0, "min. TPC n sigma for pion exclusion"}; Configurable cfg_max_TPCNsigmaPi{"cfg_max_TPCNsigmaPi", 0.0, "max. TPC n sigma for pion exclusion"}; + Configurable cfg_min_TOFNsigmaEl{"cfg_min_TOFNsigmaEl", -3.0, "min. TOF n sigma for electron inclusion"}; + Configurable cfg_max_TOFNsigmaEl{"cfg_max_TOFNsigmaEl", +3.0, "max. TOF n sigma for electron inclusion"}; } dileptoncuts; struct : ConfigurableGroup { @@ -155,24 +164,79 @@ struct prefilterPhoton { HistogramRegistry fRegistry{"output", {}, OutputObjHandlingPolicy::AnalysisObject, false, false}; + o2::ccdb::CcdbApi ccdbApi; + Service ccdb; + int mRunNumber; + float d_bz; + void init(InitContext& /*context*/) { DefineEMEventCut(); DefinePCMCut(); addhistograms(); + + mRunNumber = 0; + d_bz = 0; + + ccdb->setURL(ccdburl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setFatalWhenNull(false); } ~prefilterPhoton() {} + template + void initCCDB(TCollision const& collision) + { + if (mRunNumber == collision.runNumber()) { + return; + } + + // In case override, don't proceed, please - no CCDB access required + if (d_bz_input > -990) { + d_bz = d_bz_input; + o2::parameters::GRPMagField grpmag; + if (fabs(d_bz) > 1e-5) { + grpmag.setL3Current(30000.f / (d_bz / 5.0f)); + } + mRunNumber = collision.runNumber(); + return; + } + + auto run3grp_timestamp = collision.timestamp(); + o2::parameters::GRPObject* grpo = 0x0; + o2::parameters::GRPMagField* grpmag = 0x0; + if (!skipGRPOquery) + grpo = ccdb->getForTimeStamp(grpPath, run3grp_timestamp); + if (grpo) { + // Fetch magnetic field from ccdb for current collision + d_bz = grpo->getNominalL3Field(); + LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; + } else { + grpmag = ccdb->getForTimeStamp(grpmagPath, run3grp_timestamp); + if (!grpmag) { + LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for timestamp " << run3grp_timestamp; + } + // Fetch magnetic field from ccdb for current collision + d_bz = std::lround(5.f * grpmag->getL3Current() / 30000.f); + LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; + } + mRunNumber = collision.runNumber(); + } + void addhistograms() { const AxisSpec axis_mass{200, 0, 0.8, "m_{#gamma#gamma} (GeV/c^{2})"}; const AxisSpec axis_pair_pt{100, 0, 10, "p_{T,#gamma#gamma} (GeV/c)"}; + const AxisSpec axis_phiv{180, 0, M_PI, "#varphi_{V} (rad.)"}; // for pair fRegistry.add("Pair/PCMPCM/before/hMvsPt", "m_{#gamma#gamma} vs. p_{T,#gamma#gamma}", kTH2D, {axis_mass, axis_pair_pt}, true); + fRegistry.add("Pair/PCMDalitzEE/before/hMvsPt", "m_{ee#gamma} vs. p_{T,ee#gamma}", kTH2D, {axis_mass, axis_pair_pt}, true); + fRegistry.add("Pair/PCMDalitzEE/before/hMvsPhiV", "m_{ee} vs. #varphi_{V}", kTH2D, {{180, 0, M_PI}, {100, 0, 0.1}}, true); fRegistry.addClone("Pair/PCMPCM/before/", "Pair/PCMPCM/after/"); - fRegistry.addClone("Pair/PCMPCM/", "Pair/PCMDalitzEE/"); + fRegistry.addClone("Pair/PCMDalitzEE/before/", "Pair/PCMDalitzEE/after/"); } void DefineEMEventCut() @@ -224,7 +288,7 @@ struct prefilterPhoton { // for pair fDileptonCut.SetMeeRange(dileptoncuts.cfg_min_mee, dileptoncuts.cfg_max_mee); fDileptonCut.SetMaxPhivPairMeeDep([&](float mll) { return (mll - dileptoncuts.cfg_phiv_intercept) / dileptoncuts.cfg_phiv_slope; }); - fDileptonCut.ApplyPhiV(dileptoncuts.cfg_apply_phiv); + fDileptonCut.ApplyPhiV(false); fDileptonCut.RequireITSibAny(dileptoncuts.cfg_require_itsib_any); fDileptonCut.RequireITSib1st(dileptoncuts.cfg_require_itsib_1st); @@ -244,6 +308,7 @@ struct prefilterPhoton { fDileptonCut.SetPIDScheme(dileptoncuts.cfg_pid_scheme); fDileptonCut.SetTPCNsigmaElRange(dileptoncuts.cfg_min_TPCNsigmaEl, dileptoncuts.cfg_max_TPCNsigmaEl); fDileptonCut.SetTPCNsigmaPiRange(dileptoncuts.cfg_min_TPCNsigmaPi, dileptoncuts.cfg_max_TPCNsigmaPi); + fDileptonCut.SetTOFNsigmaElRange(dileptoncuts.cfg_min_TOFNsigmaEl, dileptoncuts.cfg_max_TOFNsigmaEl); } template @@ -268,6 +333,7 @@ struct prefilterPhoton { if constexpr (pairtype == PairType::kPCMPCM) { for (const auto& collision : collisions) { + initCCDB(collision); const float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; bool is_cent_ok = true; if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { @@ -295,13 +361,14 @@ struct prefilterPhoton { fRegistry.fill(HIST("Pair/PCMPCM/before/hMvsPt"), v12.M(), v12.Pt()); if (ggcuts.cfg_min_mass < v12.M() && v12.M() < ggcuts.cfg_max_mass) { - map_pfb_v0[g1.globalIndex()] |= 1 << static_cast(o2::aod::pwgem::photonmeson::utils::pairutil::PhotonPrefilterBitDerived::kPhotonFromPi0ggDefault); - map_pfb_v0[g2.globalIndex()] |= 1 << static_cast(o2::aod::pwgem::photonmeson::utils::pairutil::PhotonPrefilterBitDerived::kPhotonFromPi0ggDefault); + map_pfb_v0[g1.globalIndex()] |= 1 << static_cast(o2::aod::pwgem::photonmeson::utils::pairutil::PhotonPrefilterBitDerived::kPhotonFromPi0gg); + map_pfb_v0[g2.globalIndex()] |= 1 << static_cast(o2::aod::pwgem::photonmeson::utils::pairutil::PhotonPrefilterBitDerived::kPhotonFromPi0gg); } } // end of 2photon pairing loop } // end of collision loop } else if constexpr (pairtype == PairType::kPCMDalitzEE) { for (const auto& collision : collisions) { + initCCDB(collision); const float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; bool is_cent_ok = true; if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { @@ -337,8 +404,8 @@ struct prefilterPhoton { fRegistry.fill(HIST("Pair/PCMPCM/before/hMvsPt"), v12.M(), v12.Pt()); if (ggcuts.cfg_min_mass < v12.M() && v12.M() < ggcuts.cfg_max_mass) { - map_pfb_v0[g1.globalIndex()] |= 1 << static_cast(o2::aod::pwgem::photonmeson::utils::pairutil::PhotonPrefilterBitDerived::kPhotonFromPi0ggDefault); - map_pfb_v0[g2.globalIndex()] |= 1 << static_cast(o2::aod::pwgem::photonmeson::utils::pairutil::PhotonPrefilterBitDerived::kPhotonFromPi0ggDefault); + map_pfb_v0[g1.globalIndex()] |= 1 << static_cast(o2::aod::pwgem::photonmeson::utils::pairutil::PhotonPrefilterBitDerived::kPhotonFromPi0gg); + map_pfb_v0[g2.globalIndex()] |= 1 << static_cast(o2::aod::pwgem::photonmeson::utils::pairutil::PhotonPrefilterBitDerived::kPhotonFromPi0gg); } } // end of 2photon pairing loop @@ -372,12 +439,33 @@ struct prefilterPhoton { fRegistry.fill(HIST("Pair/PCMDalitzEE/before/hMvsPt"), veeg.M(), veeg.Pt()); if (eegcuts.cfg_min_mass < veeg.M() && veeg.M() < eegcuts.cfg_max_mass) { - map_pfb_v0[g1.globalIndex()] |= 1 << static_cast(o2::aod::pwgem::photonmeson::utils::pairutil::PhotonPrefilterBitDerived::kPhotonFromPi0eegDefault); - map_pfb_ele[pos2.globalIndex()] |= 1 << static_cast(o2::aod::pwgem::photonmeson::utils::pairutil::ElectronPrefilterBitDerived::kElectronFromPi0eegDefault); - map_pfb_ele[ele2.globalIndex()] |= 1 << static_cast(o2::aod::pwgem::photonmeson::utils::pairutil::ElectronPrefilterBitDerived::kElectronFromPi0eegDefault); + map_pfb_v0[g1.globalIndex()] |= 1 << static_cast(o2::aod::pwgem::photonmeson::utils::pairutil::PhotonPrefilterBitDerived::kPhotonFromPi0eeg); + map_pfb_ele[pos2.globalIndex()] |= 1 << static_cast(o2::aod::pwgem::photonmeson::utils::pairutil::ElectronPrefilterBitDerived::kElectronFromPi0eeg); + map_pfb_ele[ele2.globalIndex()] |= 1 << static_cast(o2::aod::pwgem::photonmeson::utils::pairutil::ElectronPrefilterBitDerived::kElectronFromPi0eeg); } } // end of dielectron loop } // end of g1 loop + + for (const auto& [pos2, ele2] : combinations(CombinationsFullIndexPolicy(positrons_per_collision, electrons_per_collision))) { + if (pos2.trackId() == ele2.trackId()) { // this is protection against pairing identical 2 tracks. + continue; + } + + if (!cut2.template IsSelectedTrack(pos2, collision) || !cut2.template IsSelectedTrack(ele2, collision)) { + continue; + } + + ROOT::Math::PtEtaPhiMVector v_pos(pos2.pt(), pos2.eta(), pos2.phi(), o2::constants::physics::MassElectron); + ROOT::Math::PtEtaPhiMVector v_ele(ele2.pt(), ele2.eta(), ele2.phi(), o2::constants::physics::MassElectron); + ROOT::Math::PtEtaPhiMVector v_ee = v_pos + v_ele; + float phiv = o2::aod::pwgem::dilepton::utils::pairutil::getPhivPair(pos2.px(), pos2.py(), pos2.pz(), ele2.px(), ele2.py(), ele2.pz(), pos2.sign(), ele2.sign(), d_bz); + fRegistry.fill(HIST("Pair/PCMDalitzEE/before/hMvsPhiV"), phiv, v_ee.M()); + + if (v_ee.M() < phiv * dileptoncuts.cfg_phiv_slope + dileptoncuts.cfg_phiv_intercept) { + map_pfb_ele[pos2.globalIndex()] |= 1 << static_cast(o2::aod::pwgem::photonmeson::utils::pairutil::ElectronPrefilterBitDerived::kElectronFromFakePC); + map_pfb_ele[ele2.globalIndex()] |= 1 << static_cast(o2::aod::pwgem::photonmeson::utils::pairutil::ElectronPrefilterBitDerived::kElectronFromFakePC); + } + } // end of dielectron loop to reject photon conversion } // end of collision loop } @@ -425,6 +513,7 @@ struct prefilterPhoton { } // end of collision loop } else if constexpr (pairtype == PairType::kPCMDalitzEE) { for (auto& collision : collisions) { + initCCDB(collision); const float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { continue; @@ -478,11 +567,13 @@ struct prefilterPhoton { ROOT::Math::PtEtaPhiMVector v_pos(pos2.pt(), pos2.eta(), pos2.phi(), o2::constants::physics::MassElectron); ROOT::Math::PtEtaPhiMVector v_ele(ele2.pt(), ele2.eta(), ele2.phi(), o2::constants::physics::MassElectron); ROOT::Math::PtEtaPhiMVector v_ee = v_pos + v_ele; + float phiv = o2::aod::pwgem::dilepton::utils::pairutil::getPhivPair(pos2.px(), pos2.py(), pos2.pz(), ele2.px(), ele2.py(), ele2.pz(), pos2.sign(), ele2.sign(), d_bz); if (!(dileptoncuts.cfg_min_mee < v_ee.M() && v_ee.M() < dileptoncuts.cfg_max_mee)) { continue; } ROOT::Math::PtEtaPhiMVector veeg = v_gamma + v_pos + v_ele; fRegistry.fill(HIST("Pair/PCMDalitzEE/after/hMvsPt"), veeg.M(), veeg.Pt()); + fRegistry.fill(HIST("Pair/PCMDalitzEE/after/hMvsPhiV"), phiv, v_ee.M()); } // end of dielectron loop } // end of g1 loop } // end of collision loop diff --git a/PWGEM/PhotonMeson/Utils/PairUtilities.h b/PWGEM/PhotonMeson/Utils/PairUtilities.h index 71e0e6a72e9..86ac4f0eb16 100644 --- a/PWGEM/PhotonMeson/Utils/PairUtilities.h +++ b/PWGEM/PhotonMeson/Utils/PairUtilities.h @@ -21,17 +21,12 @@ namespace o2::aod::pwgem::photonmeson::utils::pairutil { enum class PhotonPrefilterBitDerived : int { - kPhotonFromPi0ggDefault = 0, // photon from pi0->gg, default - kPhotonFromPi0ggLoose = 1, // photon from pi0->gg, loose - kPhotonFromPi0ggTight = 2, // photon from pi0->gg, tight - kPhotonFromPi0eegDefault = 3, // photon from pi0->eeg, default - kPhotonFromPi0eegLoose = 4, // photon from pi0->eeg, loose - kPhotonFromPi0eegTight = 5, // photon from pi0->eeg, tight + kPhotonFromPi0gg = 0, // photon from pi0->gg + kPhotonFromPi0eeg = 1, // photon from pi0->eeg }; enum class ElectronPrefilterBitDerived : int { - kElectronFromPi0eegDefault = 0, // electron from pi0->eeg, default - kElectronFromPi0eegLoose = 1, // electron from pi0->eeg, loose - kElectronFromPi0eegTight = 2, // electron from pi0->eeg, tight + kElectronFromPi0eeg = 0, // electron from pi0->eeg + kElectronFromFakePC = 1, // electron from photon->ee, misidentified photon conversion as virtual photon }; } // namespace o2::aod::pwgem::photonmeson::utils::pairutil namespace o2::aod::pwgem::photonmeson::photonpair From 631f93ea8fe44670d6b669f4bb82a0a1092034e9 Mon Sep 17 00:00:00 2001 From: tutripat <73981392+tutripat@users.noreply.github.com> Date: Sun, 2 Mar 2025 16:50:56 +0100 Subject: [PATCH 0499/1650] [PWGLF] New changes in MC truth (#10277) Co-authored-by: Tulika Tripathy --- PWGLF/Tasks/GlobalEventProperties/dndeta-mft-pp.cxx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/PWGLF/Tasks/GlobalEventProperties/dndeta-mft-pp.cxx b/PWGLF/Tasks/GlobalEventProperties/dndeta-mft-pp.cxx index 7a2f4887a7b..6c0ece4adba 100644 --- a/PWGLF/Tasks/GlobalEventProperties/dndeta-mft-pp.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/dndeta-mft-pp.cxx @@ -190,6 +190,12 @@ struct PseudorapidityDensityMFT { registry.add({"TracksPhiEtaGen", "; #varphi; #eta; tracks", {HistType::kTH2F, {PhiAxis, EtaAxis}}}); + registry.add({"TracksPhiEtaGen_gt0", + "; #varphi; #eta; tracks", + {HistType::kTH2F, {PhiAxis, EtaAxis}}}); + registry.add({"TracksPhiEtaGen_gt0t", + "; #varphi; #eta; tracks", + {HistType::kTH2F, {PhiAxis, EtaAxis}}}); registry.add({"TracksPhiZvtxGen", "; #varphi; #it{z}_{vtx} (cm); tracks", {HistType::kTH2F, {PhiAxis, ZAxis}}}); // @@ -842,6 +848,7 @@ struct PseudorapidityDensityMFT { if (perCollisionMCSampleCentral.size() > 0) { registry.fill(HIST("TracksEtaZvtxGen_gt0t"), particle.eta(), mcCollision.posZ()); + registry.fill(HIST("TracksPhiEtaGen_gt0t"), particle.phi(), particle.eta()); } if (atLeastOne) { registry.fill(HIST("TracksEtaZvtxGen"), particle.eta(), @@ -850,6 +857,7 @@ struct PseudorapidityDensityMFT { if (atLeastOne_gt0) { registry.fill(HIST("TracksEtaZvtxGen_gt0"), particle.eta(), mcCollision.posZ()); + registry.fill(HIST("TracksPhiEtaGen_gt0"), particle.phi(), particle.eta()); } } From 060c2888880135267daadafc24163c2ec5aa6d09 Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Sun, 2 Mar 2025 17:07:27 +0100 Subject: [PATCH 0500/1650] [PWGLF] ResonanceMergeDF - Add cascade (#10272) --- PWGLF/DataModel/LFResonanceTables.h | 49 ++++++++++ PWGLF/TableProducer/Resonances/CMakeLists.txt | 4 +- ...onanceMergeDF.cxx => resonanceMergeDF.cxx} | 91 +++++++++++++++---- 3 files changed, 126 insertions(+), 18 deletions(-) rename PWGLF/TableProducer/Resonances/{LFResonanceMergeDF.cxx => resonanceMergeDF.cxx} (77%) diff --git a/PWGLF/DataModel/LFResonanceTables.h b/PWGLF/DataModel/LFResonanceTables.h index 10b84d7d02c..7961d46c24e 100644 --- a/PWGLF/DataModel/LFResonanceTables.h +++ b/PWGLF/DataModel/LFResonanceTables.h @@ -380,6 +380,55 @@ DECLARE_SOA_TABLE(ResoCascades, "AOD", "RESOCASCADES", resodaughter::DecayVtxZ); using ResoCascade = ResoCascades::iterator; +DECLARE_SOA_TABLE(ResoCascadeDFs, "AOD", "RESOCASCADEDFS", + o2::soa::Index<>, + resodaughter::ResoCollisionDFId, + // resodaughter::CascadeId, + resodaughter::Pt, + resodaughter::Px, + resodaughter::Py, + resodaughter::Pz, + resodaughter::Eta, + resodaughter::Phi, + resodaughter::CascadeIndices, + resodaughter::DaughterTPCNSigmaPosPi, + resodaughter::DaughterTPCNSigmaPosKa, + resodaughter::DaughterTPCNSigmaPosPr, + resodaughter::DaughterTPCNSigmaNegPi, + resodaughter::DaughterTPCNSigmaNegKa, + resodaughter::DaughterTPCNSigmaNegPr, + resodaughter::DaughterTPCNSigmaBachPi, + resodaughter::DaughterTPCNSigmaBachKa, + resodaughter::DaughterTPCNSigmaBachPr, + resodaughter::DaughterTOFNSigmaPosPi, + resodaughter::DaughterTOFNSigmaPosKa, + resodaughter::DaughterTOFNSigmaPosPr, + resodaughter::DaughterTOFNSigmaNegPi, + resodaughter::DaughterTOFNSigmaNegKa, + resodaughter::DaughterTOFNSigmaNegPr, + resodaughter::DaughterTOFNSigmaBachPi, + resodaughter::DaughterTOFNSigmaBachKa, + resodaughter::DaughterTOFNSigmaBachPr, + resodaughter::V0CosPA, + resodaughter::CascCosPA, + resodaughter::DaughDCA, + resodaughter::CascDaughDCA, + cascdata::DCAPosToPV, + cascdata::DCANegToPV, + cascdata::DCABachToPV, + v0data::DCAV0ToPV, + cascdata::DCAXYCascToPV, + cascdata::DCAZCascToPV, + cascdata::Sign, + resodaughter::MLambda, + resodaughter::MXi, + resodaughter::TransRadius, + resodaughter::CascTransRadius, + resodaughter::DecayVtxX, + resodaughter::DecayVtxY, + resodaughter::DecayVtxZ); +using ResoCascadeDF = ResoCascadeDFs::iterator; + DECLARE_SOA_TABLE(ResoMCTracks, "AOD", "RESOMCTRACKS", mcparticle::PdgCode, resodaughter::MotherId, diff --git a/PWGLF/TableProducer/Resonances/CMakeLists.txt b/PWGLF/TableProducer/Resonances/CMakeLists.txt index a914e69a3f7..79b69b5b071 100644 --- a/PWGLF/TableProducer/Resonances/CMakeLists.txt +++ b/PWGLF/TableProducer/Resonances/CMakeLists.txt @@ -40,8 +40,8 @@ o2physics_add_dpl_workflow(resonance-module-initializer PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DetectorsBase COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(reso2mergedf - SOURCES LFResonanceMergeDF.cxx +o2physics_add_dpl_workflow(resonance-merge-df + SOURCES resonanceMergeDF.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DetectorsBase COMPONENT_NAME Analysis) diff --git a/PWGLF/TableProducer/Resonances/LFResonanceMergeDF.cxx b/PWGLF/TableProducer/Resonances/resonanceMergeDF.cxx similarity index 77% rename from PWGLF/TableProducer/Resonances/LFResonanceMergeDF.cxx rename to PWGLF/TableProducer/Resonances/resonanceMergeDF.cxx index 97013ea7d44..b31fe6bcead 100644 --- a/PWGLF/TableProducer/Resonances/LFResonanceMergeDF.cxx +++ b/PWGLF/TableProducer/Resonances/resonanceMergeDF.cxx @@ -8,9 +8,9 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. - -/// \file LFResonanceInitializer.cxx -/// \brief Initializes variables for the resonance candidate producers +/// +/// \file resonanceMergeDF.cxx +/// \brief Merges multiple dataframes into a single dataframe /// /// /// In typical dataframes (DF), we usually observe a range of 200 to 300 collisions. @@ -24,7 +24,8 @@ /// /// /// /// \author Bong-Hwi Lim -/// Nasir Mehdi Malik +/// Nasir Mehdi Malik +/// Min-jae Kim #include #include "Common/DataModel/PIDResponse.h" @@ -58,7 +59,7 @@ using namespace o2::soa; /// Initializer for the resonance candidate producers -struct reso2dfmerged { +struct ResonanceMergeDF { // SliceCache cache; Configurable nDF{"nDF", 1, "no of combination of collision"}; Configurable cpidCut{"cpidCut", 0, "pid cut"}; @@ -75,17 +76,16 @@ struct reso2dfmerged { HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; - using resoCols = aod::ResoCollisions; - using resoTracks = aod::ResoTracks; - void init(InitContext const&) { const AxisSpec axisCent(110, 0, 110, "FT0 (%)"); histos.add("Event/h1d_ft0_mult_percentile", "FT0 (%)", kTH1F, {axisCent}); + histos.add("Event/h1d_ft0_mult_percentile_CASC", "FT0 (%)", kTH1F, {axisCent}); } Produces resoCollisionsdf; Produces reso2trksdf; + Produces reso2cascadesdf; int df = 0; std::vector> vecOfTuples; @@ -97,7 +97,7 @@ struct reso2dfmerged { float, float, bool, bool, bool, bool, bool, bool, float, float, float>>> vecOfVecOfTuples; - void processTrackDataDF(resoCols::iterator const& collision, resoTracks const& tracks) + void processTrackDataDF(aod::ResoCollisions::iterator const& collision, aod::ResoTracks const& tracks) { int nCollisions = nDF; @@ -110,7 +110,7 @@ struct reso2dfmerged { float, float, bool, bool, bool, bool, bool, bool, float, float, float>> innerVector; - for (auto& track : tracks) { + for (const auto& track : tracks) { if (cpidCut) { if (!track.hasTOF()) { if (std::abs(track.tpcNSigmaPr()) > nsigmaPr && std::abs(track.tpcNSigmaKa()) > nsigmaKa) @@ -175,6 +175,7 @@ struct reso2dfmerged { vecOfVecOfTuples.push_back(innerVector); innerVector.clear(); df++; + LOGF(info, "collisions: df = %i", df); if (df < nCollisions) return; df = 0; @@ -231,10 +232,9 @@ struct reso2dfmerged { vecOfVecOfTuples.clear(); // } - PROCESS_SWITCH(reso2dfmerged, processTrackDataDF, "Process for data merged DF", true); + PROCESS_SWITCH(ResonanceMergeDF, processTrackDataDF, "Process for data merged DF", true); - void processLambdaStarCandidate(resoCols::iterator const& collision, resoTracks const& - tracks) + void processLambdaStarCandidate(aod::ResoCollisions::iterator const& collision, aod::ResoTracks const& tracks) { if (doprocessTrackDataDF) @@ -244,7 +244,7 @@ struct reso2dfmerged { resoCollisionsdf(0, collision.posX(), collision.posY(), collision.posZ(), collision.cent(), collision.spherocity(), collision.evtPl(), 0., 0., 0., 0., 0, collision.trackOccupancyInTimeRange()); - for (auto& track : tracks) { + for (const auto& track : tracks) { if (isPrimary && !track.isPrimaryTrack()) continue; if (isGlobal && !track.isGlobalTrack()) @@ -308,10 +308,69 @@ struct reso2dfmerged { track.tpcChi2NCl()); } } - PROCESS_SWITCH(reso2dfmerged, processLambdaStarCandidate, "Process for lambda star candidate", false); + PROCESS_SWITCH(ResonanceMergeDF, processLambdaStarCandidate, "Process for lambda star candidate", false); + + void processCascadesCandidate(aod::ResoCollisions::iterator const& collision, aod::ResoCascades const& resocasctracks) + { + histos.fill(HIST("Event/h1d_ft0_mult_percentile_CASC"), collision.cent()); + + resoCollisionsdf(0, collision.posX(), collision.posY(), collision.posZ(), collision.cent(), collision.spherocity(), collision.evtPl(), 0., 0., 0., 0., 0, collision.trackOccupancyInTimeRange()); + + for (const auto& track : resocasctracks) { + reso2cascadesdf(resoCollisionsdf.lastIndex(), + // casc.globalIndex(), + track.pt(), + track.px(), + track.py(), + track.pz(), + track.eta(), + track.phi(), + const_cast(track.cascadeIndices()), + track.daughterTPCNSigmaPosPi(), + track.daughterTPCNSigmaPosKa(), + track.daughterTPCNSigmaPosPr(), + track.daughterTPCNSigmaNegPi(), + track.daughterTPCNSigmaNegKa(), + track.daughterTPCNSigmaNegPr(), + track.daughterTPCNSigmaBachPi(), + track.daughterTPCNSigmaBachKa(), + track.daughterTPCNSigmaBachPr(), + track.daughterTOFNSigmaPosPi(), + track.daughterTOFNSigmaPosKa(), + track.daughterTOFNSigmaPosPr(), + track.daughterTOFNSigmaNegPi(), + track.daughterTOFNSigmaNegKa(), + track.daughterTOFNSigmaNegPr(), + track.daughterTOFNSigmaBachPi(), + track.daughterTOFNSigmaBachKa(), + track.daughterTOFNSigmaBachPr(), + track.v0CosPA(), + track.cascCosPA(), + track.daughDCA(), + track.cascDaughDCA(), + track.dcapostopv(), + track.dcanegtopv(), + track.dcabachtopv(), + track.dcav0topv(), + track.dcaXYCascToPV(), + track.dcaZCascToPV(), + track.sign(), + track.mLambda(), + track.mXi(), + track.transRadius(), track.cascTransRadius(), track.decayVtxX(), track.decayVtxY(), track.decayVtxZ()); + } + } + + PROCESS_SWITCH(ResonanceMergeDF, processCascadesCandidate, "Process for Cascade candidate", true); + + void processXiStarCandidate(aod::ResoCollisions::iterator const& /*collision*/, aod::ResoTracks const& /*tracks*/) + { + // TODO: Implement Xi star candidate processing + } + PROCESS_SWITCH(ResonanceMergeDF, processXiStarCandidate, "Process for Xi star candidate", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{adaptAnalysisTask(cfgc)}; + return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From 9084ef3680df8ac1fc1dd6f5dc568d18fa104d21 Mon Sep 17 00:00:00 2001 From: Lucia Anna Tarasovicova Date: Sun, 2 Mar 2025 17:08:05 +0100 Subject: [PATCH 0501/1650] [PWGLF] change in derivedcascadeanalysis.cxx (#10221) Co-authored-by: Lucia Anna Tarasovicova --- .../Strangeness/derivedcascadeanalysis.cxx | 1384 ++++++++--------- 1 file changed, 652 insertions(+), 732 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/derivedcascadeanalysis.cxx b/PWGLF/Tasks/Strangeness/derivedcascadeanalysis.cxx index 951a0ea525e..95a25f589e3 100644 --- a/PWGLF/Tasks/Strangeness/derivedcascadeanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/derivedcascadeanalysis.cxx @@ -101,11 +101,9 @@ struct Derivedcascadeanalysis { } qaFlags; struct : ConfigurableGroup { - std::string prefix = "evSelection"; + std::string prefix = "evSelectionRun3"; Configurable doTFeventCut{"doTFeventCut", false, "Enable TF event Cut"}; Configurable doITSFrameBorderCut{"doITSFrameBorderCut", false, "Enable ITSFrame event cut"}; - Configurable doTriggerTVXEventCut{"doTriggerTVXEventCut", false, "Minimal MB event selection, for MC"}; - Configurable doTriggerSel8EventCut{"doTriggerSel8EventCut", true, "Standard MB event selection"}; Configurable doGoodPVFT0EventCut{"doGoodPVFT0EventCut", true, "check for the PV position diffrence when estimated from tracks and FT0"}; Configurable doITSTPCvertexEventCut{"doITSTPCvertexEventCut", true, "checks the presence of at least one ITS-TPC track"}; Configurable doSameBunchPileUpEventCut{"doSameBunchPileUpEventCut", true, "removes events associated with the same \"found-by-T0\" bunch crossing"}; @@ -116,18 +114,42 @@ struct Derivedcascadeanalysis { Configurable doNoCollInRofStrictCut{"doNoCollInRofStrictCut", false, "Enable an evevnt selection which rejects a collision if there are other events within the same ITS ROF"}; Configurable doNoCollInRofStandardCut{"doNoCollInRofStandardCut", true, "Enable an evevnt selection which rejects a collision if there are other events within the same ITS ROF with mult above threshold"}; Configurable doMultiplicityCorrCut{"doMultiplicityCorrCut", false, "Enable multiplicity vs centrality correlation cut"}; - Configurable doInel0{"doInel0", true, "Enable INEL > 0 selection"}; Configurable doITSallLayersCut{"doITSallLayersCut", false, "Enable event selection which rejects collisions when ITS was rebooting."}; - Configurable doInel0MCGen{"doInel0MCGen", true, "Enable INEL > 0 selection for MC gen events"}; - Configurable applyZVtxSelOnMCPV{"applyZVtxSelOnMCPV", false, "Enable z vertex cut selection on generated events"}; - Configurable zVertexCut{"zVertexCut", 10, "Cut on PV position"}; - Configurable centMin{"centMin", 0, "Minimal accepted centrality"}; - Configurable centMax{"centMax", 100, "Maximal accepted centrality"}; Configurable minOccupancy{"minOccupancy", -1, "Minimal occupancy"}; Configurable maxOccupancy{"maxOccupancy", -1, "Maximal occupancy"}; Configurable minOccupancyFT0{"minOccupancyFT0", -1, "Minimal occupancy"}; Configurable maxOccupancyFT0{"maxOccupancyFT0", -1, "Maximal occupancy"}; - } eventSelectionFlags; + } eventSelectionRun3Flags; + + struct : ConfigurableGroup { + std::string prefix = "evSelectionCommon"; + Configurable doTriggerSel8EventCut{"doTriggerSel8EventCut", true, "Standard MB event selection"}; + Configurable doTriggerTVXEventCut{"doTriggerTVXEventCut", false, "Minimal MB event selection, for MC"}; + Configurable doInel0{"doInel0", true, "Enable INEL > 0 selection"}; + Configurable zVertexCut{"zVertexCut", 10, "Cut on PV position"}; + Configurable centMin{"centMin", 0, "Minimal accepted centrality"}; + Configurable centMax{"centMax", 100, "Maximal accepted centrality"}; + Configurable doInel0MCGen{"doInel0MCGen", true, "Enable INEL > 0 selection for MC gen events"}; + Configurable applyZVtxSelOnMCPV{"applyZVtxSelOnMCPV", false, "Enable z vertex cut selection on generated events"}; + } eventSelectionCommonFlags; + + struct : ConfigurableGroup { + std::string prefix = "evSelectionRun2"; + Configurable doSel7{"doSel7", true, "require sel7 event selection (Run 2 only: event selection decision based on V0A & V0C)"}; + Configurable doINT7{"doINT7", true, "require INT7 trigger selection (Run 2 only)"}; + Configurable doIncompleteDAQCut{"doIncompleteDAQCut", true, "reject events with incomplete DAQ (Run 2 only)"}; + Configurable doConsistentSPDAndTrackVtx{"doConsistentSPDAndTrackVtx", true, "reject events with inconsistent in SPD and Track vertices (Run 2 only)"}; + Configurable doPileupFromSPDCut{"doPileupFromSPDCut", true, "reject events with pileup according to SPD vertexer (Run 2 only)"}; + Configurable doV0PFPileupCut{"doV0PFPileupCut", false, "reject events tagged as OOB pileup according to V0 past-future info (Run 2 only)"}; + Configurable doPileupInMultBinsCut{"doPileupInMultBinsCut", true, "reject events tagged as pileup according to multiplicity-differential pileup checks (Run 2 only)"}; + Configurable doPileupMVCut{"doPileupMVCut", true, "reject events tagged as pileup according to according to multi-vertexer (Run 2 only)"}; + Configurable doTPCPileupCut{"doTPCPileupCut", false, "reject events tagged as pileup according to pileup in TPC (Run 2 only)"}; + Configurable doNoV0MOnVsOffPileup{"doNoV0MOnVsOffPileup", false, "reject events tagged as OOB pileup according to online-vs-offline VOM correlation (Run 2 only)"}; + Configurable doNoSPDOnVsOffPileup{"doNoSPDOnVsOffPileup", false, "reject events tagged as pileup according to online-vs-offline SPD correlation (Run 2 only)"}; + Configurable doNoSPDClsVsTklBG{"doNoSPDClsVsTklBG", true, "reject events tagged as beam-gas and pileup according to cluster-vs-tracklet correlation (Run 2 only)"}; + + Configurable useSPDTrackletsCent{"useSPDTrackletsCent", false, "Use SPD tracklets for estimating centrality? If not, use V0M-based centrality (Run 2 only)"}; + } eventSelectionRun2Flags; struct : ConfigurableGroup { std::string prefix = "candidateSelFlag"; @@ -136,7 +158,9 @@ struct Derivedcascadeanalysis { Configurable doPtDepV0RadiusCut{"doPtDepV0RadiusCut", false, "Enable pt dependent V0 radius cut"}; Configurable doPtDepV0CosPaCut{"doPtDepV0CosPaCut", false, "Enable pt dependent cos PA cut of the V0 daughter"}; Configurable doPtDepDCAcascDauCut{"doPtDepDCAcascDauCut", false, "Enable pt dependent DCA cascade daughter cut"}; - Configurable doDCAdauToPVCut{"doDCAdauToPVCut", true, "Enable cut DCA daughter track to PV"}; + Configurable doDCAbachToPVCut{"doDCAbachToPVCut", true, "Enable cut DCA daughter track to PV"}; + Configurable doDCAmesonToPVCut{"doDCAmesonToPVCut", true, "Enable cut DCA daughter track to PV"}; + Configurable doDCAbaryonToPVCut{"doDCAbaryonToPVCut", true, "Enable cut DCA daughter track to PV"}; Configurable doCascadeCosPaCut{"doCascadeCosPaCut", true, "Enable cos PA cut"}; Configurable doV0CosPaCut{"doV0CosPaCut", true, "Enable cos PA cut for the V0 daughter"}; Configurable doDCACascadeDauCut{"doDCACascadeDauCut", true, "Enable cut DCA betweenn daughter tracks"}; @@ -205,7 +229,10 @@ struct Derivedcascadeanalysis { Service pdgDB; - static constexpr std::string_view Index[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"}; + uint16_t selectionCheckMask; + double selectionCheck; + + static constexpr std::string_view kCentIndex[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"}; static constexpr float kCentralityIntervals[11] = {0., 5., 10., 20., 30., 40., 50., 60., 70., 80., 90.}; static constexpr std::string_view kCharge[] = {"Positive", "Negative"}; static constexpr std::string_view kSelectionNames[] = {"BachelorBaryonDCA", "DCAV0ToPV", "V0Radius", "CascadeRadius", "DCAV0Daughters", "DCACascDaughters", "V0pa", "CascPA", "DCABachelorToPV", "DCAMesonToPV", "DCABaryonToPV", "CascadeProperLifeTime"}; @@ -213,18 +240,62 @@ struct Derivedcascadeanalysis { // For manual sliceBy // Preslice> perMcCollision = aod::v0data::straMCCollisionId; PresliceUnsorted> perMcCollision = aod::v0data::straMCCollisionId; + PresliceUnsorted> perMcCollisionRun2 = aod::v0data::straMCCollisionId; void init(InitContext const&) { + if ((doprocessCascades || doprocessCascadesMCrec || doprocessCascadesMCforEff) && (doprocessCascadesRun2 || doprocessCascadesMCrecRun2 || doprocessCascadesMCforEffRun2)) { + LOGF(fatal, "Cannot enable Run2 and Run3 processes at the same time. Please choose one."); + } + // setting CCDB service ccdb->setURL(ccdburl); ccdb->setCaching(true); ccdb->setFatalWhenNull(false); + selectionCheck = -1; + selectionCheckMask = 0; + if (!candidateSelectionFlags.doBachelorBaryonCut) + SETBIT(selectionCheckMask, 0); + if (!candidateSelectionFlags.doDCAV0ToPVCut) + SETBIT(selectionCheckMask, 1); + if (!candidateSelectionFlags.doV0RadiusCut) + SETBIT(selectionCheckMask, 2); + if (!candidateSelectionFlags.doCascadeRadiusCut) + SETBIT(selectionCheckMask, 3); + if (!candidateSelectionFlags.doDCAV0DauCut) + SETBIT(selectionCheckMask, 4); + if (!candidateSelectionFlags.doDCACascadeDauCut) + SETBIT(selectionCheckMask, 5); + if (!candidateSelectionFlags.doV0CosPaCut) + SETBIT(selectionCheckMask, 6); + if (!candidateSelectionFlags.doCascadeCosPaCut) + SETBIT(selectionCheckMask, 7); + if (!candidateSelectionFlags.doDCAbachToPVCut) + SETBIT(selectionCheckMask, 8); + if (!candidateSelectionFlags.doDCAmesonToPVCut) + SETBIT(selectionCheckMask, 9); + if (!candidateSelectionFlags.doDCAbaryonToPVCut) + SETBIT(selectionCheckMask, 10); + if (!candidateSelectionFlags.doProperLifeTimeCut) + SETBIT(selectionCheckMask, 11); + histos.add("hEventVertexZ", "hEventVertexZ", kTH1F, {vertexZ}); histos.add("hEventMultFt0C", "", kTH1F, {{500, 0, 5000}}); histos.add("hEventCentrality", "hEventCentrality", kTH1F, {{101, 0, 101}}); + histos.add("hEventSelection", "hEventSelection", kTH1F, {{22, 0, 22}}); + // TODO adjust labels + TString eventSelLabelRun3[22] = {"all", "sel8", "TVX", "PV_{z}", "cent", "kNoSameBunchPileup", "kIsGoodZvtxFT0vsPV", "kIsVertexITSTPC", "kIsVertexTOFmatched", "kIsVertexTRDmatched", "kNoITSROFrameBorder", "kNoTimeFrameBorder", "MultCorrCut", "kNoCollInTimeRangeStrict", "kNoCollInTimeRangeStandard", "min Occup", "mxOccup", "kNoCollInRofStrict", "kNoCollInRofStandard", "kIsGoodITSLayersAll", "occupFt0", "-"}; + TString eventSelLabelRun2[22] = {"all", "sel8", "TVX", "PV_{z}", "cent", "sel7", "kINT7", "kNoIncompleteDAQ", "kNoInconsistentVtx", "kNoPileupFromSPD", "kNoV0PFPileup", "kNoPileupInMultBins", "kNoPileupMV", "kNoPileupTPC", "kNoV0MOnVsOfPileup", "kNoSPDOnVsOfPileup", "kNoSPDClsVsTklBG", "INEL0", "-", "-", "-", "-"}; + for (int i = 1; i <= histos.get(HIST("hEventSelection"))->GetNbinsX(); i++) { + if (doprocessCascades || doprocessCascadesMCrec || doprocessCascadesMCforEff) { + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(i, eventSelLabelRun3[i - 1]); + } else { + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(i, eventSelLabelRun2[i - 1]); + } + } + histos.add("hOccupancyVsOccupFt0VsCentrality", "", kTH3F, {axisOccupancy, axisOccupancyFt0, {100, 0, 100}}); histos.add("hNCrossedRowsNegative", "", kTH1F, {{400, -200, 200}}); @@ -281,7 +352,7 @@ struct Derivedcascadeanalysis { if (qaFlags.doOccupancyCheck) { histos.add("InvMassAfterSelCent1/hNegativeCascade", "hNegativeCascade", HistType::kTH3F, {axisPt, axisMass, axisOccupancy}); histos.add("InvMassAfterSelCent1/hPositiveCascade", "hPositiveCascade", HistType::kTH3F, {axisPt, axisMass, axisOccupancy}); - if (doprocessCascadesMCrec) { + if (doprocessCascadesMCrec || doprocessCascadesMCrecRun2) { histos.add("InvMassAfterSelCent1/hNegativeCascadeMCTruth", "hNegativeCascadeMCTruth", HistType::kTH3F, {axisPt, axisMass, axisOccupancy}); histos.add("InvMassAfterSelCent1/hPositiveCascadeMCTruth", "hPositiveCascadeMCTruth", HistType::kTH3F, {axisPt, axisMass, axisOccupancy}); } @@ -301,7 +372,7 @@ struct Derivedcascadeanalysis { if (qaFlags.doIRCheck) { histos.add("InvMassAfterSelCent1/hNegativeCascadeIR", "hNegativeCascadeIR", HistType::kTH3F, {axisPt, axisMass, axisIR}); histos.add("InvMassAfterSelCent1/hPositiveCascadeIR", "hPositiveCascadeIR", HistType::kTH3F, {axisPt, axisMass, axisIR}); - if (doprocessCascadesMCrec) { + if (doprocessCascadesMCrec || doprocessCascadesMCrecRun2) { histos.add("InvMassAfterSelCent1/hNegativeCascadeMCTruthIR", "hNegativeCascadeMCTruthIR", HistType::kTH3F, {axisPt, axisMass, axisIR}); histos.add("InvMassAfterSelCent1/hPositiveCascadeMCTruthIR", "hPositiveCascadeMCTruthIR", HistType::kTH3F, {axisPt, axisMass, axisIR}); } @@ -322,7 +393,7 @@ struct Derivedcascadeanalysis { if (qaFlags.doBefSelCheck) histos.addClone("InvMassAfterSel/", "InvMassBefSel/"); - if (doprocessCascadesMCrec) + if (doprocessCascadesMCrec || doprocessCascadesMCrecRun2) histos.addClone("InvMassAfterSel/", "InvMassAfterSelMCrecTruth/"); if (qaFlags.doPtDepCutStudy && !candidateSelectionFlags.doProperLifeTimeCut) { @@ -360,14 +431,18 @@ struct Derivedcascadeanalysis { histos.add("PtDepCutStudy/hNegativeV0pa", "hNegativeV0pa", HistType::kTH3F, {axisPt, axisMass, {40, 0, 0.4}}); histos.add("PtDepCutStudy/hPositiveV0pa", "hPositiveV0pa", {HistType::kTH3F, {axisPt, axisMass, {40, 0, 0.4}}}); } - if (qaFlags.doPtDepCutStudy && !candidateSelectionFlags.doDCAdauToPVCut) { + if (qaFlags.doPtDepCutStudy && !candidateSelectionFlags.doDCAbachToPVCut) { histos.add("PtDepCutStudy/hNegativeDCABachelorToPV", "hNegativeDCABachelorToPV", HistType::kTH3F, {axisPt, axisMass, {50, 0, 0.5}}); - histos.add("PtDepCutStudy/hNegativeDCABaryonToPV", "hNegativeDCABaryonToPV", HistType::kTH3F, {axisPt, axisMass, {50, 0, 0.5}}); - histos.add("PtDepCutStudy/hNegativeDCAMesonToPV", "hNegativeDCAMesonToPV", HistType::kTH3F, {axisPt, axisMass, {50, 0, 0.5}}); histos.add("PtDepCutStudy/hPositiveDCABachelorToPV", "hPositiveDCABachelorToPV", {HistType::kTH3F, {axisPt, axisMass, {50, 0, 0.5}}}); - histos.add("PtDepCutStudy/hPositiveDCABaryonToPV", "hPositiveDCABaryonToPV", HistType::kTH3F, {axisPt, axisMass, {50, 0, 0.5}}); + } + if (qaFlags.doPtDepCutStudy && !candidateSelectionFlags.doDCAmesonToPVCut) { + histos.add("PtDepCutStudy/hNegativeDCAMesonToPV", "hNegativeDCAMesonToPV", HistType::kTH3F, {axisPt, axisMass, {50, 0, 0.5}}); histos.add("PtDepCutStudy/hPositiveDCAMesonToPV", "hPositiveDCAMesonToPV", HistType::kTH3F, {axisPt, axisMass, {50, 0, 0.5}}); } + if (qaFlags.doPtDepCutStudy && !candidateSelectionFlags.doDCAbaryonToPVCut) { + histos.add("PtDepCutStudy/hNegativeDCABaryonToPV", "hNegativeDCABaryonToPV", HistType::kTH3F, {axisPt, axisMass, {50, 0, 0.5}}); + histos.add("PtDepCutStudy/hPositiveDCABaryonToPV", "hPositiveDCABaryonToPV", HistType::kTH3F, {axisPt, axisMass, {50, 0, 0.5}}); + } if (qaFlags.doPtDepCutStudy && !candidateSelectionFlags.doCascadeCosPaCut) { histos.add("PtDepCutStudy/hNegativeCascPA", "hNegativeCascPA", HistType::kTH3F, {axisPt, axisMass, {40, 0, 0.4}}); @@ -379,19 +454,21 @@ struct Derivedcascadeanalysis { histos.add("histITSTPCmatchBachTrack", "", HistType::kTH3F, {axisPt, {101, 0, 101}, {3, 0, 3}}); } - if (doprocessCascadesMCrec) { + if (doprocessCascadesMCrec || doprocessCascadesMCrecRun2) { histos.addClone("PtDepCutStudy/", "PtDepCutStudyMCTruth/"); histos.add("hNegativeCascadePtForEfficiency", "hNegativeCascadePtForEfficiency", HistType::kTH3F, {axisPt, axisMass, {101, 0, 101}}); histos.add("hPositiveCascadePtForEfficiency", "hPositiveCascadePtForEfficiency", {HistType::kTH3F, {axisPt, axisMass, {101, 0, 101}}}); - histos.add("hNegativeCascadePtForEfficiencyBefSel", "hNegativeCascadePtForEfficiencyBefSel", HistType::kTH3F, {axisPt, axisMass, {101, 0, 101}}); - histos.add("hPositiveCascadePtForEfficiencyBefSel", "hPositiveCascadePtForEfficiencyBefSel", {HistType::kTH3F, {axisPt, axisMass, {101, 0, 101}}}); histos.add("hNegativeCascadePtForEfficiencyVsNch", "hNegativeCascadePtForEfficiencyVsNch", HistType::kTH3F, {axisPt, axisMass, axisNch}); histos.add("hPositiveCascadePtForEfficiencyVsNch", "hPositiveCascadePtForEfficiencyVsNch", {HistType::kTH3F, {axisPt, axisMass, axisNch}}); - histos.add("hNegativeCascadePtForEfficiencyVsNchBefSel", "hNegativeCascadePtForEfficiencyVsNchBefSel", HistType::kTH3F, {axisPt, axisMass, axisNch}); - histos.add("hPositiveCascadePtForEfficiencyVsNchBefSel", "hPositiveCascadePtForEfficiencyVsNchBefSel", {HistType::kTH3F, {axisPt, axisMass, axisNch}}); + if (qaFlags.doBefSelCheck) { + histos.add("hNegativeCascadePtForEfficiencyBefSel", "hNegativeCascadePtForEfficiencyBefSel", HistType::kTH3F, {axisPt, axisMass, {101, 0, 101}}); + histos.add("hPositiveCascadePtForEfficiencyBefSel", "hPositiveCascadePtForEfficiencyBefSel", {HistType::kTH3F, {axisPt, axisMass, {101, 0, 101}}}); + histos.add("hNegativeCascadePtForEfficiencyVsNchBefSel", "hNegativeCascadePtForEfficiencyVsNchBefSel", HistType::kTH3F, {axisPt, axisMass, axisNch}); + histos.add("hPositiveCascadePtForEfficiencyVsNchBefSel", "hPositiveCascadePtForEfficiencyVsNchBefSel", {HistType::kTH3F, {axisPt, axisMass, axisNch}}); + } } - if (doprocessCascadesMCforEff) { + if (doprocessCascadesMCforEff || doprocessCascadesMCforEffRun2) { histos.add("hGenEvents", "", HistType::kTH2F, {{axisNch}, {4, 0, 4}}); histos.add("hCentralityVsMultMC", "", kTH2F, {{101, 0.0f, 101.0f}, axisNch}); histos.add("hRecMultVsMultMC", "", kTH2F, {axisNch, axisNch}); @@ -403,50 +480,55 @@ struct Derivedcascadeanalysis { histos.add("hCentralityVsNcoll_beforeEvSel", "", kTH2F, {{101, 0.0f, 101.0f}, {50, 0.f, 50.f}}); histos.add("hCentralityVsNcoll_afterEvSel", "", kTH2F, {{101, 0.0f, 101.0f}, {50, 0.f, 50.f}}); - histos.add("h2dGenXiMinusEta", "", kTH1F, {{30, -2, 2}}); - histos.add("h2dGenXiMinusEtaPosDaughter", "", kTH1F, {{30, -2, 2}}); - histos.add("h2dGenXiMinusEtaNegDaughter", "", kTH1F, {{30, -2, 2}}); - histos.add("h2dGenXiMinusEtaBach", "", kTH1F, {{30, -2, 2}}); - - histos.add("h2dGenOmegaMinusEta", "", kTH1F, {{30, -2, 2}}); - histos.add("h2dGenOmegaMinusEtaPosDaughter", "", kTH1F, {{30, -2, 2}}); - histos.add("h2dGenOmegaMinusEtaNegDaughter", "", kTH1F, {{30, -2, 2}}); - histos.add("h2dGenOmegaMinusEtaBach", "", kTH1F, {{30, -2, 2}}); - - histos.add("h2dGenXiMinus", "h2dGenXiMinus", kTH2D, {{101, 0.0f, 101.0f}, axisPt}); - histos.add("h2dGenXiPlus", "h2dGenXiPlus", kTH2D, {{101, 0.0f, 101.0f}, axisPt}); - histos.add("h2dGenOmegaMinus", "h2dGenOmegaMinus", kTH2D, {{101, 0.0f, 101.0f}, axisPt}); - histos.add("h2dGenOmegaPlus", "h2dGenOmegaPlus", kTH2D, {{101, 0.0f, 101.0f}, axisPt}); - - histos.add("h2dGenXiMinusVsNch", "h2dGenXiMinusVsNch", kTH2D, {axisNch, axisPt}); - histos.add("h2dGenXiPlusVsNch", "h2dGenXiPlusVsNch", kTH2D, {axisNch, axisPt}); - histos.add("h2dGenOmegaMinusVsNch", "h2dGenOmegaMinusVsNch", kTH2D, {axisNch, axisPt}); - histos.add("h2dGenOmegaPlusVsNch", "h2dGenOmegaPlusVsNch", kTH2D, {axisNch, axisPt}); - - histos.add("h2dGenXiMinusVsCentOccupancy", "h2dGenXiMinusVsCentOccupancy", kTH3D, {axisPt, {101, 0.0f, 101.0f}, axisOccupancy}); - histos.add("h2dGenXiPlusVsCentOccupancy", "h2dGenXiPlusVsCentOccupancy", kTH3D, {axisPt, {101, 0.0f, 101.0f}, axisOccupancy}); - histos.add("h2dGenOmegaMinusVsCentOccupancy", "h2dGenOmegaMinusVsCentOccupancy", kTH3D, {axisPt, {101, 0.0f, 101.0f}, axisOccupancy}); - histos.add("h2dGenOmegaPlusVsCentOccupancy", "h2dGenOmegaPlusVsCentOccupancy", kTH3D, {axisPt, {101, 0.0f, 101.0f}, axisOccupancy}); - - histos.add("h2dGenXiMinusVsNchVsOccupancy", "h2dGenXiMinusVsNchVsOccupancy", kTH3D, {axisPt, axisNch, axisOccupancy}); - histos.add("h2dGenXiPlusVsNchVsOccupancy", "h2dGenXiPlusVsNchVsOccupancy", kTH3D, {axisPt, axisNch, axisOccupancy}); - histos.add("h2dGenOmegaMinusVsNchVsOccupancy", "h2dGenOmegaMinusVsNchVsOccupancy", kTH3D, {axisPt, axisNch, axisOccupancy}); - histos.add("h2dGenOmegaPlusVsNchVsOccupancy", "h2dGenOmegaPlusVsNchVsOccupancy", kTH3D, {axisPt, axisNch, axisOccupancy}); - - histos.add("h2dGenXiMinusVsMultMCVsCentrality", "h2dGenXiMinusVsMultMCVsCentrality", kTH3D, {axisNch, {101, 0.0f, 101.0f}, axisPt}); - histos.add("h2dGenXiPlusVsMultMCVsCentrality", "h2dGenXiPlusVsMultMCVsCentrality", kTH3D, {axisNch, {101, 0.0f, 101.0f}, axisPt}); - histos.add("h2dGenOmegaMinusVsMultMCVsCentrality", "h2dGenOmegaMinusVsMultMCVsCentrality", kTH3D, {axisNch, {101, 0.0f, 101.0f}, axisPt}); - histos.add("h2dGenOmegaPlusVsMultMCVsCentrality", "h2dGenOmegaPlusVsMultMCVsCentrality", kTH3D, {axisNch, {101, 0.0f, 101.0f}, axisPt}); - - histos.add("h2dGenXiMinusVsCentIR", "h2dGenXiMinusVsCentIR", kTH3D, {axisPt, {101, 0.0f, 101.0f}, axisIR}); - histos.add("h2dGenXiPlusVsCentIR", "h2dGenXiPlusVsCentIR", kTH3D, {axisPt, {101, 0.0f, 101.0f}, axisIR}); - histos.add("h2dGenOmegaMinusVsCentIR", "h2dGenOmegaMinusVsCentIR", kTH3D, {axisPt, {101, 0.0f, 101.0f}, axisIR}); - histos.add("h2dGenOmegaPlusVsCentIR", "h2dGenOmegaPlusVsCentIR", kTH3D, {axisPt, {101, 0.0f, 101.0f}, axisIR}); - - histos.add("h2dGenXiMinusVsMultMCVsIR", "h2dGenXiMinusVsMultMCVsIR", kTH3D, {axisNch, axisIR, axisPt}); - histos.add("h2dGenXiPlusVsMultMCVsIR", "h2dGenXiPlusVsMultMCVsIR", kTH3D, {axisNch, axisIR, axisPt}); - histos.add("h2dGenOmegaMinusVsMultMCVsIR", "h2dGenOmegaMinusVsMultMCVsIR", kTH3D, {axisNch, axisIR, axisPt}); - histos.add("h2dGenOmegaPlusVsMultMCVsIR", "h2dGenOmegaPlusVsMultMCVsIR", kTH3D, {axisNch, axisIR, axisPt}); + if (isXi) { + histos.add("h2dGenXiMinusEta", "", kTH1F, {{30, -2, 2}}); + histos.add("h2dGenXiMinusEtaPosDaughter", "", kTH1F, {{30, -2, 2}}); + histos.add("h2dGenXiMinusEtaNegDaughter", "", kTH1F, {{30, -2, 2}}); + histos.add("h2dGenXiMinusEtaBach", "", kTH1F, {{30, -2, 2}}); + histos.add("h2dGenXiMinus", "h2dGenXiMinus", kTH2D, {{101, 0.0f, 101.0f}, axisPt}); + histos.add("h2dGenXiPlus", "h2dGenXiPlus", kTH2D, {{101, 0.0f, 101.0f}, axisPt}); + histos.add("h2dGenXiMinusVsNch", "h2dGenXiMinusVsNch", kTH2D, {axisNch, axisPt}); + histos.add("h2dGenXiPlusVsNch", "h2dGenXiPlusVsNch", kTH2D, {axisNch, axisPt}); + histos.add("h2dGenXiMinusVsCentOccupancy", "h2dGenXiMinusVsCentOccupancy", kTH3D, {axisPt, {101, 0.0f, 101.0f}, axisOccupancy}); + histos.add("h2dGenXiPlusVsCentOccupancy", "h2dGenXiPlusVsCentOccupancy", kTH3D, {axisPt, {101, 0.0f, 101.0f}, axisOccupancy}); + histos.add("h2dGenXiMinusVsNchVsOccupancy", "h2dGenXiMinusVsNchVsOccupancy", kTH3D, {axisPt, axisNch, axisOccupancy}); + histos.add("h2dGenXiPlusVsNchVsOccupancy", "h2dGenXiPlusVsNchVsOccupancy", kTH3D, {axisPt, axisNch, axisOccupancy}); + histos.add("h2dGenXiMinusVsMultMCVsCentrality", "h2dGenXiMinusVsMultMCVsCentrality", kTH3D, {axisNch, {101, 0.0f, 101.0f}, axisPt}); + histos.add("h2dGenXiPlusVsMultMCVsCentrality", "h2dGenXiPlusVsMultMCVsCentrality", kTH3D, {axisNch, {101, 0.0f, 101.0f}, axisPt}); + histos.add("h2dGenXiMinusVsCentIR", "h2dGenXiMinusVsCentIR", kTH3D, {axisPt, {101, 0.0f, 101.0f}, axisIR}); + histos.add("h2dGenXiPlusVsCentIR", "h2dGenXiPlusVsCentIR", kTH3D, {axisPt, {101, 0.0f, 101.0f}, axisIR}); + histos.add("h2dGenXiMinusVsMultMCVsIR", "h2dGenXiMinusVsMultMCVsIR", kTH3D, {axisNch, axisIR, axisPt}); + histos.add("h2dGenXiPlusVsMultMCVsIR", "h2dGenXiPlusVsMultMCVsIR", kTH3D, {axisNch, axisIR, axisPt}); + } else { + histos.add("h2dGenOmegaMinusEta", "", kTH1F, {{30, -2, 2}}); + histos.add("h2dGenOmegaMinusEtaPosDaughter", "", kTH1F, {{30, -2, 2}}); + histos.add("h2dGenOmegaMinusEtaNegDaughter", "", kTH1F, {{30, -2, 2}}); + histos.add("h2dGenOmegaMinusEtaBach", "", kTH1F, {{30, -2, 2}}); + histos.add("h2dGenOmegaMinus", "h2dGenOmegaMinus", kTH2D, {{101, 0.0f, 101.0f}, axisPt}); + histos.add("h2dGenOmegaPlus", "h2dGenOmegaPlus", kTH2D, {{101, 0.0f, 101.0f}, axisPt}); + histos.add("h2dGenOmegaMinusVsNch", "h2dGenOmegaMinusVsNch", kTH2D, {axisNch, axisPt}); + histos.add("h2dGenOmegaPlusVsNch", "h2dGenOmegaPlusVsNch", kTH2D, {axisNch, axisPt}); + histos.add("h2dGenOmegaMinusVsCentOccupancy", "h2dGenOmegaMinusVsCentOccupancy", kTH3D, {axisPt, {101, 0.0f, 101.0f}, axisOccupancy}); + histos.add("h2dGenOmegaPlusVsCentOccupancy", "h2dGenOmegaPlusVsCentOccupancy", kTH3D, {axisPt, {101, 0.0f, 101.0f}, axisOccupancy}); + histos.add("h2dGenOmegaMinusVsNchVsOccupancy", "h2dGenOmegaMinusVsNchVsOccupancy", kTH3D, {axisPt, axisNch, axisOccupancy}); + histos.add("h2dGenOmegaPlusVsNchVsOccupancy", "h2dGenOmegaPlusVsNchVsOccupancy", kTH3D, {axisPt, axisNch, axisOccupancy}); + histos.add("h2dGenOmegaMinusVsMultMCVsCentrality", "h2dGenOmegaMinusVsMultMCVsCentrality", kTH3D, {axisNch, {101, 0.0f, 101.0f}, axisPt}); + histos.add("h2dGenOmegaPlusVsMultMCVsCentrality", "h2dGenOmegaPlusVsMultMCVsCentrality", kTH3D, {axisNch, {101, 0.0f, 101.0f}, axisPt}); + histos.add("h2dGenOmegaMinusVsCentIR", "h2dGenOmegaMinusVsCentIR", kTH3D, {axisPt, {101, 0.0f, 101.0f}, axisIR}); + histos.add("h2dGenOmegaPlusVsCentIR", "h2dGenOmegaPlusVsCentIR", kTH3D, {axisPt, {101, 0.0f, 101.0f}, axisIR}); + histos.add("h2dGenOmegaMinusVsMultMCVsIR", "h2dGenOmegaMinusVsMultMCVsIR", kTH3D, {axisNch, axisIR, axisPt}); + histos.add("h2dGenOmegaPlusVsMultMCVsIR", "h2dGenOmegaPlusVsMultMCVsIR", kTH3D, {axisNch, axisIR, axisPt}); + } + } + } + // Return slicing output + template + auto getGroupedCollisions(TCollisions const& collisions, int globalIndex) + { + if constexpr (run3) { // check if we are in Run 3 + return collisions.sliceBy(perMcCollision, globalIndex); + } else { // we are in Run2 + return collisions.sliceBy(perMcCollisionRun2, globalIndex); } } template @@ -493,154 +575,235 @@ struct Derivedcascadeanalysis { if (fillHists) histos.fill(HIST("hEventSelection"), 0.5 /* all collisions */); - float centrality = coll.centFT0C(); - if (useCentralityFT0M) - centrality = coll.centFT0M(); - if (useCentralityFT0A) - centrality = coll.centFV0A(); - if (useCentralityFT0Cvar1) - centrality = coll.centFT0CVariant1(); - - if (qaFlags.doBefSelEventMultCorr) { - histos.fill(HIST("hEventNchCorrelationBefCuts"), coll.multNTracksPVeta1(), coll.multNTracksGlobal()); - histos.fill(HIST("hEventPVcontributorsVsCentralityBefCuts"), centrality, coll.multNTracksPVeta1()); - histos.fill(HIST("hEventGlobalTracksVsCentralityBefCuts"), centrality, coll.multNTracksGlobal()); - } - - if (eventSelectionFlags.doTriggerTVXEventCut && !coll.selection_bit(aod::evsel::kIsTriggerTVX)) { + if (eventSelectionCommonFlags.doTriggerSel8EventCut && !coll.sel8()) { return false; } if (fillHists) - histos.fill(HIST("hEventSelection"), 1.5 /* collisions after sel*/); + histos.fill(HIST("hEventSelection"), 1.5 /* collisions after sel8*/); - if (eventSelectionFlags.doTriggerSel8EventCut && !coll.sel8()) { + if (eventSelectionCommonFlags.doTriggerTVXEventCut && !coll.selection_bit(aod::evsel::kIsTriggerTVX)) { return false; } if (fillHists) - histos.fill(HIST("hEventSelection"), 2.5 /* collisions after sel*/); - - if (std::abs(coll.posZ()) > eventSelectionFlags.zVertexCut) { + histos.fill(HIST("hEventSelection"), 2.5 /* collisions after TVX cut*/); + if (std::abs(coll.posZ()) > eventSelectionCommonFlags.zVertexCut) { return false; } if (fillHists) histos.fill(HIST("hEventSelection"), 3.5 /* collisions after sel pvz sel*/); + float centrality = -10; + double interactionRate = -10; + int occupancy = -2; + float occupancyFT0 = -2; + + if constexpr (requires { coll.centFT0C(); }) { + centrality = coll.centFT0C(); + if (useCentralityFT0M) + centrality = coll.centFT0M(); + if (useCentralityFT0A) + centrality = coll.centFV0A(); + if (useCentralityFT0Cvar1) + centrality = coll.centFT0CVariant1(); + + if (qaFlags.doBefSelEventMultCorr) { + histos.fill(HIST("hEventNchCorrelationBefCuts"), coll.multNTracksPVeta1(), coll.multNTracksGlobal()); + histos.fill(HIST("hEventPVcontributorsVsCentralityBefCuts"), centrality, coll.multNTracksPVeta1()); + histos.fill(HIST("hEventGlobalTracksVsCentralityBefCuts"), centrality, coll.multNTracksGlobal()); + } - if (centrality > eventSelectionFlags.centMax || centrality < eventSelectionFlags.centMin) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 4.5 /* collisions after centrality sel*/); + if (centrality > eventSelectionCommonFlags.centMax || centrality < eventSelectionCommonFlags.centMin) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 4.5 /* collisions after centrality sel*/); - if (eventSelectionFlags.doSameBunchPileUpEventCut && !coll.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 5.5 /* Not same Bunch pile up */); + if (eventSelectionRun3Flags.doSameBunchPileUpEventCut && !coll.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 5.5 /* Not same Bunch pile up */); - if (eventSelectionFlags.doGoodPVFT0EventCut && !coll.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 6.5 /* No large vertexZ difference from tracks and FT0*/); + if (eventSelectionRun3Flags.doGoodPVFT0EventCut && !coll.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 6.5 /* No large vertexZ difference from tracks and FT0*/); - if (eventSelectionFlags.doITSTPCvertexEventCut && !coll.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 7.5 /* At least one ITS-TPC track in the event*/); + if (eventSelectionRun3Flags.doITSTPCvertexEventCut && !coll.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 7.5 /* At least one ITS-TPC track in the event*/); - if (eventSelectionFlags.doVertexTOFmatch && !coll.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 8.5 /* At least one of vertex contributors is matched to TOF*/); + if (eventSelectionRun3Flags.doVertexTOFmatch && !coll.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 8.5 /* At least one of vertex contributors is matched to TOF*/); - if (eventSelectionFlags.doVertexTRDmatch && !coll.selection_bit(o2::aod::evsel::kIsVertexTRDmatched)) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 9.5 /* At least one of vertex contributors is matched to TRD*/); + if (eventSelectionRun3Flags.doVertexTRDmatch && !coll.selection_bit(o2::aod::evsel::kIsVertexTRDmatched)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 9.5 /* At least one of vertex contributors is matched to TRD*/); - if (eventSelectionFlags.doITSFrameBorderCut && !coll.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 10.5 /* Not at ITS ROF border */); + if (eventSelectionRun3Flags.doITSFrameBorderCut && !coll.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 10.5 /* Not at ITS ROF border */); - if (eventSelectionFlags.doTFeventCut && !coll.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 11.5 /* Not at TF border */); + if (eventSelectionRun3Flags.doTFeventCut && !coll.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 11.5 /* Not at TF border */); + + if (eventSelectionRun3Flags.doMultiplicityCorrCut) { + if (coll.multNTracksGlobal() < (1343.3 * std::exp(-0.0443259 * centrality) - 50) || coll.multNTracksGlobal() > (2098.9 * std::exp(-0.0332444 * centrality))) + return false; + if (coll.multNTracksPVeta1() < (3703 * std::exp(-0.0455483 * centrality) - 150) || coll.multNTracksPVeta1() > (4937.33 * std::exp(-0.0372668 * centrality) + 20)) + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 12.5 /* Remove outlyers */); - if (eventSelectionFlags.doMultiplicityCorrCut) { - if (coll.multNTracksGlobal() < (1343.3 * std::exp(-0.0443259 * centrality) - 50) || coll.multNTracksGlobal() > (2098.9 * std::exp(-0.0332444 * centrality))) + if (eventSelectionRun3Flags.doTimeRangeStrictCut && !coll.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStrict)) { return false; - if (coll.multNTracksPVeta1() < (3703 * std::exp(-0.0455483 * centrality) - 150) || coll.multNTracksPVeta1() > (4937.33 * std::exp(-0.0372668 * centrality) + 20)) + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 13.5 /* Rejection of events too close in time, dtime +/- 10 μs */); + + if (eventSelectionRun3Flags.doTimeRangeStandardCut && !coll.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 12.5 /* Remove outlyers */); + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 14.5 /* No other collision within +/- 2 μs, or mult above some threshold in -4..-2 μs */); - if (eventSelectionFlags.doTimeRangeStrictCut && !coll.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStrict)) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 13.5 /* Rejection of events too close in time, dtime +/- 10 μs */); + occupancy = coll.trackOccupancyInTimeRange(); + if (eventSelectionRun3Flags.minOccupancy > 0 && occupancy < eventSelectionRun3Flags.minOccupancy) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 15.5 /* Below min occupancy */); + if (eventSelectionRun3Flags.maxOccupancy > 0 && occupancy > eventSelectionRun3Flags.maxOccupancy) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 16.5 /* Above max occupancy */); - if (eventSelectionFlags.doTimeRangeStandardCut && !coll.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 14.5 /* No other collision within +/- 2 μs, or mult above some threshold in -4..-2 μs */); + if (eventSelectionRun3Flags.doNoCollInRofStrictCut && !coll.selection_bit(o2::aod::evsel::kNoCollInRofStrict)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 17.5 /*rejects a collision if there are other events within the same ITS ROF*/); - int occupancy = coll.trackOccupancyInTimeRange(); - if (eventSelectionFlags.minOccupancy > 0 && occupancy < eventSelectionFlags.minOccupancy) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 15.5 /* Below min occupancy */); - if (eventSelectionFlags.maxOccupancy > 0 && occupancy > eventSelectionFlags.maxOccupancy) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 16.5 /* Above max occupancy */); + if (eventSelectionRun3Flags.doNoCollInRofStandardCut && !coll.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 18.5 /*rejects a collision if there are other events within the same ITS ROF above mult threshold*/); - if (eventSelectionFlags.doNoCollInRofStrictCut && !coll.selection_bit(o2::aod::evsel::kNoCollInRofStrict)) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 17.5 /*rejects a collision if there are other events within the same ITS ROF*/); + if (eventSelectionRun3Flags.doITSallLayersCut && !coll.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 19.5 /*rejects collisions if ITS was in rebooting stage*/); - if (eventSelectionFlags.doNoCollInRofStandardCut && !coll.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 18.5 /*rejects a collision if there are other events within the same ITS ROF above mult threshold*/); + occupancyFT0 = coll.ft0cOccupancyInTimeRange(); + if (eventSelectionRun3Flags.minOccupancyFT0 > -1 && occupancyFT0 < eventSelectionRun3Flags.minOccupancyFT0) { + return false; + } + if (eventSelectionRun3Flags.maxOccupancyFT0 > -1 && occupancyFT0 > eventSelectionRun3Flags.maxOccupancyFT0) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 20.5 /* Occupancy FT0 selection */); - if (eventSelectionFlags.doITSallLayersCut && !coll.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 19.5 /*rejects collisions if ITS was in rebooting stage*/); + interactionRate = rateFetcher.fetch(ccdb.service, coll.timestamp(), coll.runNumber(), irSource) * 1.e-3; + } else { + centrality = eventSelectionRun2Flags.useSPDTrackletsCent ? coll.centRun2SPDTracklets() : coll.centRun2V0M(); - float occupancyFT0 = coll.ft0cOccupancyInTimeRange(); - if (eventSelectionFlags.minOccupancyFT0 > 0 && occupancyFT0 < eventSelectionFlags.minOccupancyFT0) { - return false; - } - if (eventSelectionFlags.maxOccupancyFT0 > 0 && occupancyFT0 > eventSelectionFlags.maxOccupancyFT0) { - return false; - } - if (fillHists) - histos.fill(HIST("hEventSelection"), 20.5 /* Occupancy FT0 selection */); + if (centrality > eventSelectionCommonFlags.centMax || centrality < eventSelectionCommonFlags.centMin) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 4.5 /* collisions after centrality sel*/); + + if (eventSelectionRun2Flags.doSel7 && !coll.sel7()) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 5.5 /* sel7 selection */); + + if (eventSelectionRun2Flags.doINT7 && !coll.alias_bit(kINT7)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 6.5 /* INT7-triggered collisions */); + if (eventSelectionRun2Flags.doIncompleteDAQCut && !coll.selection_bit(o2::aod::evsel::kNoIncompleteDAQ)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 7.5 /* Complete events according to DAQ flags */); + + if (eventSelectionRun2Flags.doConsistentSPDAndTrackVtx && !coll.selection_bit(o2::aod::evsel::kNoInconsistentVtx)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 8.5 /* No inconsistency in SPD and Track vertices */); + if (eventSelectionRun2Flags.doPileupFromSPDCut && !coll.selection_bit(o2::aod::evsel::kNoPileupFromSPD)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 9.5 /* No pileup according to SPD vertexer */); + if (eventSelectionRun2Flags.doV0PFPileupCut && !coll.selection_bit(o2::aod::evsel::kNoV0PFPileup)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 10.5 /* No out-of-bunch pileup according to V0 past-future info */); + + if (eventSelectionRun2Flags.doPileupInMultBinsCut && !coll.selection_bit(o2::aod::evsel::kNoPileupInMultBins)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 11.5 /* No pileup according to multiplicity-differential pileup checks */); + + if (eventSelectionRun2Flags.doPileupMVCut && !coll.selection_bit(o2::aod::evsel::kNoPileupMV)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 12.5 /* No pileup according to multi-vertexer */); + + if (eventSelectionRun2Flags.doTPCPileupCut && !coll.selection_bit(o2::aod::evsel::kNoPileupTPC)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 13.5 /* No pileup in TPC */); + + if (eventSelectionRun2Flags.doNoV0MOnVsOffPileup && !coll.selection_bit(o2::aod::evsel::kNoV0MOnVsOfPileup)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 14.5 /* No out-of-bunch pileup according to online-vs-offline VOM correlation */); + + if (eventSelectionRun2Flags.doNoSPDOnVsOffPileup && !coll.selection_bit(o2::aod::evsel::kNoSPDOnVsOfPileup)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 15.5 /* No out-of-bunch pileup according to online-vs-offline SPD correlation */); - if (eventSelectionFlags.doInel0 && coll.multNTracksPVeta1() < 1) { + if (eventSelectionRun2Flags.doNoSPDClsVsTklBG && !coll.selection_bit(o2::aod::evsel::kNoSPDClsVsTklBG)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 16.5 /* No beam-gas according to cluster-vs-tracklet correlation */); + } + if (eventSelectionCommonFlags.doInel0 && coll.multNTracksPVeta1() < 1) { return false; } if (fillHists) - histos.fill(HIST("hEventSelection"), 21.5 /* INEL > 0 selection */); - - double interactionRate = rateFetcher.fetch(ccdb.service, coll.timestamp(), coll.runNumber(), irSource) * 1.e-3; + histos.fill(HIST("hEventSelection"), 27.5 /* INEL > 0 selection */); if (fillHists) { histos.fill(HIST("hInteractionRate"), interactionRate); @@ -700,6 +863,8 @@ struct Derivedcascadeanalysis { } histos.fill(HIST("hCandidate"), ++counter); } else { + if (qaFlags.doPtDepCutStudy) + selectionCheck = casc.dcacascdaughters(); ++counter; } @@ -710,6 +875,8 @@ struct Derivedcascadeanalysis { return false; histos.fill(HIST("hCandidate"), ++counter); } else { + if (qaFlags.doPtDepCutStudy) + selectionCheck = casc.dcaV0daughters(); ++counter; } @@ -731,6 +898,8 @@ struct Derivedcascadeanalysis { return false; histos.fill(HIST("hCandidate"), ++counter); } else { + if (qaFlags.doPtDepCutStudy) + selectionCheck = casc.cascradius(); counter += 2; } @@ -751,6 +920,8 @@ struct Derivedcascadeanalysis { return false; histos.fill(HIST("hCandidate"), ++counter); } else { + if (qaFlags.doPtDepCutStudy) + selectionCheck = casc.v0radius(); counter += 2; } @@ -768,6 +939,8 @@ struct Derivedcascadeanalysis { } histos.fill(HIST("hCandidate"), ++counter); } else { + if (qaFlags.doPtDepCutStudy) + selectionCheck = casc.bachBaryonDCAxyToPV(); ++counter; } @@ -776,6 +949,8 @@ struct Derivedcascadeanalysis { return false; histos.fill(HIST("hCandidate"), ++counter); } else { + if (qaFlags.doPtDepCutStudy) + selectionCheck = std::acos(casc.v0cosPA(casc.x(), casc.y(), casc.z())); ++counter; } @@ -797,40 +972,123 @@ struct Derivedcascadeanalysis { histos.fill(HIST("hCutValue"), 13, cut); cut = candidateSelectionValues.dcaBaryonToPV; histos.fill(HIST("hCutValue"), 13, cut); - if (candidateSelectionFlags.doDCAdauToPVCut) { - if (std::abs(casc.dcabachtopv()) < candidateSelectionValues.dcaBachToPV) + if (candidateSelectionFlags.doDCAbachToPVCut || candidateSelectionFlags.doDCAmesonToPVCut || candidateSelectionFlags.doDCAbaryonToPVCut) { + if (candidateSelectionFlags.doDCAbachToPVCut && std::abs(casc.dcabachtopv()) < candidateSelectionValues.dcaBachToPV) return false; - if (casc.sign() > 0 && (std::abs(casc.dcanegtopv()) < candidateSelectionValues.dcaBaryonToPV || std::abs(casc.dcapostopv()) < candidateSelectionValues.dcaMesonToPV)) + if (casc.sign() > 0 && ((std::abs(casc.dcanegtopv()) < candidateSelectionValues.dcaBaryonToPV && candidateSelectionFlags.doDCAbaryonToPVCut) || (std::abs(casc.dcapostopv()) < candidateSelectionValues.dcaMesonToPV && candidateSelectionFlags.doDCAmesonToPVCut))) return false; - if (casc.sign() < 0 && (std::abs(casc.dcapostopv()) < candidateSelectionValues.dcaBaryonToPV || std::abs(casc.dcanegtopv()) < candidateSelectionValues.dcaMesonToPV)) + if (casc.sign() < 0 && ((std::abs(casc.dcapostopv()) < candidateSelectionValues.dcaBaryonToPV && candidateSelectionFlags.doDCAbaryonToPVCut) || (std::abs(casc.dcanegtopv()) < candidateSelectionValues.dcaMesonToPV && candidateSelectionFlags.doDCAmesonToPVCut))) return false; histos.fill(HIST("hCandidate"), ++counter); } else { + if (qaFlags.doPtDepCutStudy) { + if (!candidateSelectionFlags.doDCAbachToPVCut) + selectionCheck = std::abs(casc.dcabachtopv()); + if (!candidateSelectionFlags.doDCAbaryonToPVCut && casc.sign() > 0) + selectionCheck = std::abs(casc.dcanegtopv()); + if (!candidateSelectionFlags.doDCAbaryonToPVCut && casc.sign() < 0) + selectionCheck = std::abs(casc.dcapostopv()); + if (!candidateSelectionFlags.doDCAmesonToPVCut && casc.sign() > 0) + selectionCheck = std::abs(casc.dcapostopv()); + if (!candidateSelectionFlags.doDCAmesonToPVCut && casc.sign() < 0) + selectionCheck = std::abs(casc.dcanegtopv()); + } ++counter; } return true; } - - void processCascades(soa::Join::iterator const& coll, soa::Join const& Cascades, soa::Join const&) + void fillHistOccupancyCheck(double pt, double mass, float occup, float centrality, bool isPos) + { + static_for<0, 9>([&](auto i) { + constexpr int In = i.value; + if (centrality < kCentralityIntervals[In + 1] && centrality > kCentralityIntervals[In]) { + if (isPos) + histos.fill(HIST("InvMassAfterSelCent") + HIST(kCentIndex[In]) + HIST("/hPositiveCascade"), pt, mass, occup); + else + histos.fill(HIST("InvMassAfterSelCent") + HIST(kCentIndex[In]) + HIST("/hNegativeCascade"), pt, mass, occup); + } + }); + } + void fillHistIRCheckData(double pt, double mass, double ir, float centrality, bool isPos) + { + static_for<0, 9>([&](auto i) { + constexpr int In = i.value; + if (centrality < kCentralityIntervals[In + 1] && centrality > kCentralityIntervals[In]) { + if (isPos) + histos.fill(HIST("InvMassAfterSelCent") + HIST(kCentIndex[In]) + HIST("/hPositiveCascadeIR"), pt, mass, ir); + else + histos.fill(HIST("InvMassAfterSelCent") + HIST(kCentIndex[In]) + HIST("/hNegativeCascadeIR"), pt, mass, ir); + } + }); + } + void fillHistIRCheckMC(double pt, double mass, double ir, float centrality, bool isPos) + { + static_for<0, 9>([&](auto i) { + constexpr int In = i.value; + if (centrality < kCentralityIntervals[In + 1] && centrality > kCentralityIntervals[In]) { + if (isPos) + histos.fill(HIST("InvMassAfterSelCent") + HIST(kCentIndex[In]) + HIST("/hPositiveCascadeMCTruthIR"), pt, mass, ir); + else + histos.fill(HIST("InvMassAfterSelCent") + HIST(kCentIndex[In]) + HIST("/hNegativeCascadeMCTruthIR"), pt, mass, ir); + } + }); + } + void fillHistPtDepSelectionStudy(double pt, double mass, double sel, uint64_t selectionCheckMask, bool isPos) + { + static_for<0, 11>([&](auto i) { + constexpr int In = i.value; + if (TESTBIT(selectionCheckMask, In)) { + if (isPos) + histos.fill(HIST("PtDepCutStudy/hPositive") + HIST(kSelectionNames[In]), pt, mass, sel); + else + histos.fill(HIST("PtDepCutStudy/hNegative") + HIST(kSelectionNames[In]), pt, mass, sel); + } + }); + } + void fillHistPtDepSelectionStudyMC(double pt, double mass, double sel, uint64_t selectionCheckMask, bool isPos) + { + static_for<0, 11>([&](auto i) { + constexpr int In = i.value; + if (TESTBIT(selectionCheckMask, In)) { + if (isPos) + histos.fill(HIST("PtDepCutStudyMCTruth/hPositive") + HIST(kSelectionNames[In]), pt, mass, sel); + else + histos.fill(HIST("PtDepCutStudyMCTruth/hNegative") + HIST(kSelectionNames[In]), pt, mass, sel); + } + }); + } + template + void analyseCascades(TCollision const& coll, TCascade const& Cascades) //(soa::Join::iterator const& coll, soa::Join const& Cascades, DauTracks const&)//(TCollision const& coll, TCascade const& Cascades) { if (!isEventAccepted(coll, true)) return; - - float centrality = coll.centFT0C(); - if (useCentralityFT0M) - centrality = coll.centFT0M(); - if (useCentralityFT0A) - centrality = coll.centFV0A(); - if (useCentralityFT0Cvar1) - centrality = coll.centFT0CVariant1(); + float centrality = -1; + float nChEta1 = -1; + float occupancy = -2; + + if constexpr (requires { coll.centFT0C(); }) { + nChEta1 = coll.multNTracksPVeta1(); + centrality = coll.centFT0C(); + if (useCentralityFT0M) + centrality = coll.centFT0M(); + if (useCentralityFT0A) + centrality = coll.centFV0A(); + if (useCentralityFT0Cvar1) + centrality = coll.centFT0CVariant1(); + occupancy = useTrackOccupancyDef ? coll.trackOccupancyInTimeRange() : coll.ft0cOccupancyInTimeRange(); + } else { + centrality = eventSelectionRun2Flags.useSPDTrackletsCent ? coll.centRun2SPDTracklets() : coll.centRun2V0M(); + } for (const auto& casc : Cascades) { int counter = -1; histos.fill(HIST("hCandidate"), ++counter); + double recoPt = casc.pt(); + bool isNegative = false; bool isPositive = false; if (casc.sign() > 0) @@ -840,27 +1098,54 @@ struct Derivedcascadeanalysis { if (!isNegative && !isPositive) continue; - double invmass; - if (isXi) - invmass = casc.mXi(); - else - invmass = casc.mOmega(); + double invmass = -10; + invmass = isXi ? casc.mXi() : casc.mOmega(); // To have trace of how it was before selections - if (qaFlags.doBefSelCheck) { if (isPositive) - histos.fill(HIST("InvMassBefSel/h") + HIST(kCharge[0]) + HIST("Cascade"), casc.pt(), invmass, centrality); + histos.fill(HIST("InvMassBefSel/hPositiveCascade"), recoPt, invmass, centrality); if (isNegative) - histos.fill(HIST("InvMassBefSel/h") + HIST(kCharge[1]) + HIST("Cascade"), casc.pt(), invmass, centrality); + histos.fill(HIST("InvMassBefSel/hNegativeCascade"), recoPt, invmass, centrality); + } + + bool isTrueMCCascade = false; + bool isTrueMCCascadeDecay = false; + bool isCorrectLambdaDecay = false; + float ptmc = -1; + + // MC part + if constexpr (requires { casc.has_cascMCCore(); }) { + if (!casc.has_cascMCCore()) + continue; + auto cascMC = casc.template cascMCCore_as>(); + ptmc = RecoDecay::sqrtSumOfSquares(cascMC.pxMC(), cascMC.pyMC()); + + if (cascMC.isPhysicalPrimary() && ((isXi && std::abs(cascMC.pdgCode()) == 3312) || (!isXi && std::abs(cascMC.pdgCode()) == 3334))) + isTrueMCCascade = true; + if (isTrueMCCascade && ((isPositive && cascMC.pdgCodePositive() == 211 && cascMC.pdgCodeNegative() == -2212) || (isNegative && cascMC.pdgCodePositive() == 2212 && cascMC.pdgCodeNegative() == -211))) + isCorrectLambdaDecay = true; + if (isTrueMCCascade && isCorrectLambdaDecay && ((isXi && std::abs(cascMC.pdgCodeBachelor()) == 211) || (!isXi && std::abs(cascMC.pdgCodeBachelor()) == 321))) + isTrueMCCascadeDecay = true; + + if (qaFlags.doBefSelCheck && isTrueMCCascade) { + if (isPositive) { + histos.fill(HIST("InvMassBefSel/hPositiveCascadePtForEfficiencyVsNchBefSel"), ptmc, invmass, nChEta1); + histos.fill(HIST("InvMassBefSel/hPositiveCascadePtForEfficiencyBefSel"), ptmc, invmass, centrality); + } + if (isNegative) { + histos.fill(HIST("InvMassBefSel/hNegativeCascadePtForEfficiencyVsNchBefSel"), ptmc, invmass, nChEta1); + histos.fill(HIST("InvMassBefSel/hNegativeCascadePtForEfficiencyBefSel"), ptmc, invmass, centrality); + } + } } if (!isCascadeCandidateAccepted(casc, counter, centrality)) continue; counter += 13; - auto negExtra = casc.negTrackExtra_as>(); - auto posExtra = casc.posTrackExtra_as>(); - auto bachExtra = casc.bachTrackExtra_as>(); + auto negExtra = casc.template negTrackExtra_as>(); + auto posExtra = casc.template posTrackExtra_as>(); + auto bachExtra = casc.template bachTrackExtra_as>(); auto poseta = RecoDecay::eta(std::array{casc.pxpos(), casc.pypos(), casc.pzpos()}); auto negeta = RecoDecay::eta(std::array{casc.pxneg(), casc.pyneg(), casc.pzneg()}); @@ -881,6 +1166,8 @@ struct Derivedcascadeanalysis { continue; histos.fill(HIST("hCandidate"), ++counter); } else { + if (qaFlags.doPtDepCutStudy) + selectionCheck = std::acos(casc.v0cosPA(coll.posX(), coll.posY(), coll.posZ())); ++counter; } @@ -891,10 +1178,12 @@ struct Derivedcascadeanalysis { continue; histos.fill(HIST("hCandidate"), ++counter); } else { + if (qaFlags.doPtDepCutStudy) + selectionCheck = std::abs(casc.dcav0topv(coll.posX(), coll.posY(), coll.posZ())); ++counter; } - if (casc.sign() < 0) { + if (isNegative) { if (qaFlags.doFillNsigmaTPCHistProton) histos.fill(HIST("hNsigmaProton"), posExtra.tpcNSigmaPr(), fullMomentumPosDaugh, centrality); if (qaFlags.doFillNsigmaTPCHistV0Pion) @@ -904,7 +1193,7 @@ struct Derivedcascadeanalysis { if (qaFlags.doFillNsigmaTPCHistPionBach && !isXi) histos.fill(HIST("hNsigmaKaon"), bachExtra.tpcNSigmaPi(), fullmomentumBachelor, centrality); - } else if (casc.sign() > 0) { + } else { if (qaFlags.doFillNsigmaTPCHistV0Pion) histos.fill(HIST("hNsigmaPionPos"), posExtra.tpcNSigmaPi(), fullMomentumPosDaugh, centrality); if (qaFlags.doFillNsigmaTPCHistProton) @@ -915,7 +1204,7 @@ struct Derivedcascadeanalysis { histos.fill(HIST("hNsigmaKaon"), bachExtra.tpcNSigmaPi(), fullmomentumBachelor, centrality); } - if (casc.sign() < 0) { + if (isNegative) { if (candidateSelectionFlags.doNTPCSigmaCut) { if (std::abs(posExtra.tpcNSigmaPr()) > candidateSelectionValues.nsigmatpcPr || std::abs(negExtra.tpcNSigmaPi()) > candidateSelectionValues.nsigmatpcPi) continue; @@ -923,7 +1212,7 @@ struct Derivedcascadeanalysis { } else { ++counter; } - } else if (casc.sign() > 0) { + } else { if (candidateSelectionFlags.doNTPCSigmaCut) { if (std::abs(posExtra.tpcNSigmaPi()) > candidateSelectionValues.nsigmatpcPi || std::abs(negExtra.tpcNSigmaPr()) > candidateSelectionValues.nsigmatpcPr) continue; @@ -937,6 +1226,37 @@ struct Derivedcascadeanalysis { histos.fill(HIST("hNCrossedRowsNegative"), negExtra.tpcCrossedRows()); histos.fill(HIST("hNCrossedRowsPositive"), posExtra.tpcCrossedRows()); + if (qaFlags.doITSTPCmatchingCheck) { + auto ptPosDaugh = std::sqrt(std::pow(casc.pxpos(), 2) + std::pow(casc.pypos(), 2)); + auto ptNegDaugh = std::sqrt(std::pow(casc.pxneg(), 2) + std::pow(casc.pyneg(), 2)); + auto ptBachelor = std::sqrt(std::pow(casc.pxbach(), 2) + std::pow(casc.pybach(), 2)); + + histos.fill(HIST("histITSTPCmatchPosTrack"), ptPosDaugh, centrality, 0.5); + histos.fill(HIST("histITSTPCmatchNegTrack"), ptNegDaugh, centrality, 0.5); + histos.fill(HIST("histITSTPCmatchBachTrack"), ptBachelor, centrality, 0.5); + if (candidateSelectionFlags.doAllTracksMinITSClusters) { + if (posExtra.hasITS() && posExtra.itsNCls() >= candidateSelectionValues.minITSclusters) + histos.fill(HIST("histITSTPCmatchPosTrack"), ptPosDaugh, centrality, 1.5); + if (negExtra.hasITS() && negExtra.itsNCls() >= candidateSelectionValues.minITSclusters) + histos.fill(HIST("histITSTPCmatchNegTrack"), ptNegDaugh, centrality, 1.5); + if (bachExtra.hasITS() && bachExtra.itsNCls() >= candidateSelectionValues.minITSclusters) + histos.fill(HIST("histITSTPCmatchBachTrack"), ptBachelor, centrality, 1.5); + if (posExtra.hasITS() && posExtra.itsNCls() >= candidateSelectionValues.minITSclusters && posExtra.hasTPC() && std::abs(posExtra.tpcCrossedRows()) >= candidateSelectionValues.mintpccrrows) + histos.fill(HIST("histITSTPCmatchPosTrack"), ptPosDaugh, centrality, 2.5); + if (negExtra.hasITS() && negExtra.itsNCls() >= candidateSelectionValues.minITSclusters && negExtra.hasTPC() && std::abs(negExtra.tpcCrossedRows()) >= candidateSelectionValues.mintpccrrows) + histos.fill(HIST("histITSTPCmatchNegTrack"), ptNegDaugh, centrality, 2.5); + if (bachExtra.hasITS() && bachExtra.itsNCls() >= candidateSelectionValues.minITSclusters && bachExtra.hasTPC() && std::abs(bachExtra.tpcCrossedRows()) >= candidateSelectionValues.mintpccrrows) + histos.fill(HIST("histITSTPCmatchBachTrack"), ptBachelor, centrality, 2.5); + } else { + if (posExtra.hasTPC() && std::abs(posExtra.tpcCrossedRows()) >= candidateSelectionValues.mintpccrrows) + histos.fill(HIST("histITSTPCmatchPosTrack"), ptPosDaugh, centrality, 2.5); + if (negExtra.hasTPC() && std::abs(negExtra.tpcCrossedRows()) >= candidateSelectionValues.mintpccrrows) + histos.fill(HIST("histITSTPCmatchNegTrack"), ptNegDaugh, centrality, 2.5); + if (bachExtra.hasTPC() && std::abs(bachExtra.tpcCrossedRows()) >= candidateSelectionValues.mintpccrrows) + histos.fill(HIST("histITSTPCmatchBachTrack"), ptBachelor, centrality, 2.5); + } + } + if (std::abs(posExtra.tpcCrossedRows()) < candidateSelectionValues.mintpccrrows || std::abs(negExtra.tpcCrossedRows()) < candidateSelectionValues.mintpccrrows || std::abs(bachExtra.tpcCrossedRows()) < candidateSelectionValues.mintpccrrows) continue; histos.fill(HIST("hCandidate"), ++counter); @@ -1025,6 +1345,8 @@ struct Derivedcascadeanalysis { continue; histos.fill(HIST("hCandidate"), ++counter); } else { + if (qaFlags.doPtDepCutStudy) + selectionCheck = ctau; ++counter; } } else { @@ -1048,496 +1370,55 @@ struct Derivedcascadeanalysis { continue; histos.fill(HIST("hCandidate"), ++counter); } else { + if (qaFlags.doPtDepCutStudy) + selectionCheck = ctau; ++counter; } } - if (qaFlags.doITSTPCmatchingCheck) { - auto ptPosDaugh = std::sqrt(std::pow(casc.pxpos(), 2) + std::pow(casc.pypos(), 2)); - auto ptNegDaugh = std::sqrt(std::pow(casc.pxneg(), 2) + std::pow(casc.pyneg(), 2)); - auto ptBachelor = std::sqrt(std::pow(casc.pxbach(), 2) + std::pow(casc.pybach(), 2)); - - histos.fill(HIST("histITSTPCmatchPosTrack"), ptPosDaugh, centrality, 0.5); - histos.fill(HIST("histITSTPCmatchNegTrack"), ptNegDaugh, centrality, 0.5); - histos.fill(HIST("histITSTPCmatchBachTrack"), ptBachelor, centrality, 0.5); - if (posExtra.hasITS()) - histos.fill(HIST("histITSTPCmatchPosTrack"), ptPosDaugh, centrality, 1.5); - if (negExtra.hasITS()) - histos.fill(HIST("histITSTPCmatchNegTrack"), ptNegDaugh, centrality, 1.5); - if (bachExtra.hasITS()) - histos.fill(HIST("histITSTPCmatchBachTrack"), ptBachelor, centrality, 1.5); - if (posExtra.hasITS() && posExtra.hasTPC()) - histos.fill(HIST("histITSTPCmatchPosTrack"), ptPosDaugh, centrality, 2.5); - if (negExtra.hasITS() && negExtra.hasTPC()) - histos.fill(HIST("histITSTPCmatchNegTrack"), ptNegDaugh, centrality, 2.5); - if (bachExtra.hasITS() && bachExtra.hasTPC()) - histos.fill(HIST("histITSTPCmatchBachTrack"), ptBachelor, centrality, 2.5); - } - - if (isPositive) - histos.fill(HIST("InvMassAfterSel/h") + HIST(kCharge[0]) + HIST("Cascade"), casc.pt(), invmass, centrality); - if (isNegative) - histos.fill(HIST("InvMassAfterSel/h") + HIST(kCharge[1]) + HIST("Cascade"), casc.pt(), invmass, centrality); if (qaFlags.doOccupancyCheck) { - float occupancy = -1; - if (useTrackOccupancyDef) - occupancy = coll.trackOccupancyInTimeRange(); - if (useFT0OccupancyDef) - occupancy = coll.ft0cOccupancyInTimeRange(); - static_for<0, 9>([&](auto i) { - constexpr int In = i.value; - if (centrality < kCentralityIntervals[In + 1] && centrality > kCentralityIntervals[In]) { - if (isPositive) - histos.fill(HIST("InvMassAfterSelCent") + HIST(Index[In]) + HIST("/h") + HIST(kCharge[0]) + HIST("Cascade"), casc.pt(), invmass, occupancy); - if (isNegative) - histos.fill(HIST("InvMassAfterSelCent") + HIST(Index[In]) + HIST("/h") + HIST(kCharge[1]) + HIST("Cascade"), casc.pt(), invmass, occupancy); - } - }); + fillHistOccupancyCheck(recoPt, invmass, occupancy, centrality, isPositive); } - - if (qaFlags.doIRCheck) { - double interactionRate = rateFetcher.fetch(ccdb.service, coll.timestamp(), coll.runNumber(), irSource) * 1.e-3; - static_for<0, 9>([&](auto i) { - constexpr int In = i.value; - if (centrality < kCentralityIntervals[In + 1] && centrality > kCentralityIntervals[In]) { - if (isPositive) - histos.fill(HIST("InvMassAfterSelCent") + HIST(Index[In]) + HIST("/h") + HIST(kCharge[0]) + HIST("CascadeIR"), casc.pt(), invmass, interactionRate); - if (isNegative) - histos.fill(HIST("InvMassAfterSelCent") + HIST(Index[In]) + HIST("/h") + HIST(kCharge[1]) + HIST("CascadeIR"), casc.pt(), invmass, interactionRate); - } - }); + if (isPositive) { + histos.fill(HIST("InvMassAfterSel/hPositiveCascade"), recoPt, invmass, centrality); + if (isTrueMCCascadeDecay) { + histos.fill(HIST("hPositiveCascadePtForEfficiency"), ptmc, invmass, centrality); + histos.fill(HIST("hPositiveCascadePtForEfficiencyVsNch"), ptmc, invmass, nChEta1); + } + if (isTrueMCCascadeDecay) + histos.fill(HIST("InvMassAfterSelMCrecTruth/hPositiveCascade"), ptmc, invmass, centrality); + } else { + histos.fill(HIST("InvMassAfterSel/hNegativeCascade"), recoPt, invmass, centrality); + if (isTrueMCCascadeDecay) { + histos.fill(HIST("hNegativeCascadePtForEfficiency"), ptmc, invmass, centrality); + histos.fill(HIST("hNegativeCascadePtForEfficiencyVsNch"), ptmc, invmass, nChEta1); + } + if (isTrueMCCascadeDecay) + histos.fill(HIST("InvMassAfterSelMCrecTruth/hNegativeCascade"), ptmc, invmass, centrality); } - float dcaMesonToPV = -10; - float dcaBaryonToPV = -10; - if (isPositive) { - dcaMesonToPV = casc.dcanegtopv(); - dcaBaryonToPV = casc.dcapostopv(); + if (qaFlags.doIRCheck) { + double interactionRate = -2; + if constexpr (requires { coll.trackOccupancyInTimeRange(); }) { + interactionRate = rateFetcher.fetch(ccdb.service, coll.timestamp(), coll.runNumber(), irSource) * 1.e-3; + fillHistIRCheckData(recoPt, invmass, interactionRate, centrality, isPositive); + if (isTrueMCCascadeDecay) + fillHistIRCheckMC(ptmc, invmass, interactionRate, centrality, isPositive); + } } - if (isNegative) { - dcaBaryonToPV = casc.dcanegtopv(); - dcaMesonToPV = casc.dcapostopv(); - } - double selections[] = {casc.bachBaryonDCAxyToPV(), - std::abs(casc.dcav0topv(casc.x(), casc.y(), casc.z())), - casc.v0radius(), - casc.cascradius(), - casc.dcaV0daughters(), - casc.dcacascdaughters(), - std::acos(casc.v0cosPA(casc.x(), casc.y(), casc.z())), - casc.dcabachtopv(), - dcaMesonToPV, - dcaBaryonToPV, - ctau}; - bool selectionToBeTested[] = {candidateSelectionFlags.doBachelorBaryonCut, - candidateSelectionFlags.doDCAV0ToPVCut, - candidateSelectionFlags.doV0RadiusCut, - candidateSelectionFlags.doCascadeRadiusCut, - candidateSelectionFlags.doDCAV0DauCut, - candidateSelectionFlags.doDCACascadeDauCut, - candidateSelectionFlags.doV0CosPaCut, - candidateSelectionFlags.doCascadeCosPaCut, - candidateSelectionFlags.doDCAdauToPVCut, - candidateSelectionFlags.doDCAdauToPVCut, - candidateSelectionFlags.doDCAdauToPVCut, - candidateSelectionFlags.doProperLifeTimeCut}; - if (qaFlags.doPtDepCutStudy) { - static_for<0, 10>([&](auto i) { - constexpr int In = i.value; - if (!selectionToBeTested[In]) { - if (isPositive) - histos.fill(HIST("PtDepCutStudy/h") + HIST(kCharge[0]) + HIST(kSelectionNames[In]), casc.pt(), invmass, selections[In]); - if (isNegative) - histos.fill(HIST("PtDepCutStudy/h") + HIST(kCharge[1]) + HIST(kSelectionNames[In]), casc.pt(), invmass, selections[In]); - } - }); + if (qaFlags.doPtDepCutStudy && selectionCheck != -1) { + fillHistPtDepSelectionStudy(recoPt, invmass, selectionCheck, selectionCheckMask, isPositive); + if (isTrueMCCascade) + fillHistPtDepSelectionStudyMC(ptmc, invmass, selectionCheck, selectionCheckMask, isPositive); } } } - void processCascadesMCrec(soa::Join::iterator const& coll, CascMCCandidates const& Cascades, DauTracks const&, soa::Join const&) //, , , soa::Join const& /*mccollisions*/, soa::Join const&) - // soa::Join const& Cascades, soa::Join const&) + template + void analyseCascadesMCforEff(TMCCollisions const& mcCollisions, TCascMCs const& Cascades, TCollisions const& collisions) { - if (!isEventAccepted(coll, true)) - return; - float centrality = coll.centFT0C(); - if (useCentralityFT0M) - centrality = coll.centFT0M(); - if (useCentralityFT0A) - centrality = coll.centFV0A(); - if (useCentralityFT0Cvar1) - centrality = coll.centFT0CVariant1(); - - float nChEta05 = coll.multNTracksPVeta1(); - for (const auto& casc : Cascades) { - float mass = -1; - if (isXi) - mass = casc.mXi(); - else - mass = casc.mOmega(); - int counter = -1; - histos.fill(HIST("hCandidate"), ++counter); - - bool isNegative = false; - bool isPositive = false; - if (casc.sign() > 0) - isPositive = true; - if (casc.sign() < 0) - isNegative = true; - if (!isNegative && !isPositive) - continue; - // To have trace of how it was before selections - if (!casc.has_cascMCCore()) - continue; - auto cascMC = casc.cascMCCore_as>(); - float ptmc = RecoDecay::sqrtSumOfSquares(cascMC.pxMC(), cascMC.pyMC()); - - bool isTrueMCCascade = false; - bool isTrueMCCascadeDecay = false; - bool isCorrectLambdaDecay = false; - if (cascMC.isPhysicalPrimary() && ((isXi && std::abs(cascMC.pdgCode()) == 3312) || (!isXi && std::abs(cascMC.pdgCode()) == 3334))) - isTrueMCCascade = true; - if (isTrueMCCascade && ((isPositive && cascMC.pdgCodePositive() == 211 && cascMC.pdgCodeNegative() == -2212) || (isNegative && cascMC.pdgCodePositive() == 2212 && cascMC.pdgCodeNegative() == -211))) - isCorrectLambdaDecay = true; - if (isTrueMCCascade && isCorrectLambdaDecay && ((isXi && std::abs(cascMC.pdgCodeBachelor()) == 211) || (!isXi && std::abs(cascMC.pdgCodeBachelor()) == 321))) - isTrueMCCascadeDecay = true; - - if (qaFlags.doBefSelCheck) { - - if (isPositive) { - histos.fill(HIST("InvMassBefSel/h") + HIST(kCharge[0]) + HIST("Cascade"), casc.pt(), mass, centrality); - if (isTrueMCCascade) { - histos.fill(HIST("hPositiveCascadePtForEfficiencyVsNchBefSel"), ptmc, mass, nChEta05); - histos.fill(HIST("hPositiveCascadePtForEfficiencyBefSel"), ptmc, mass, centrality); - } - } - if (isNegative) { - histos.fill(HIST("InvMassBefSel/h") + HIST(kCharge[1]) + HIST("Cascade"), casc.pt(), mass, centrality); - if (isTrueMCCascade) { - histos.fill(HIST("hNegativeCascadePtForEfficiencyVsNchBefSel"), ptmc, mass, nChEta05); - histos.fill(HIST("hNegativeCascadePtForEfficiencyBefSel"), ptmc, mass, centrality); - } - } - } - - if (!isCascadeCandidateAccepted(casc, counter, centrality)) - continue; - counter += 13; - - auto negExtra = casc.negTrackExtra_as>(); - auto posExtra = casc.posTrackExtra_as>(); - auto bachExtra = casc.bachTrackExtra_as>(); - - auto poseta = RecoDecay::eta(std::array{casc.pxpos(), casc.pypos(), casc.pzpos()}); - auto negeta = RecoDecay::eta(std::array{casc.pxneg(), casc.pyneg(), casc.pzneg()}); - auto bacheta = RecoDecay::eta(std::array{casc.pxbach(), casc.pybach(), casc.pzbach()}); - - auto fullMomentumPosDaugh = std::sqrt(std::pow(casc.pxpos(), 2) + std::pow(casc.pypos(), 2) + std::pow(casc.pzpos(), 2)); - auto fullmomentumNegDaugh = std::sqrt(std::pow(casc.pxneg(), 2) + std::pow(casc.pyneg(), 2) + std::pow(casc.pzneg(), 2)); - auto fullmomentumBachelor = std::sqrt(std::pow(casc.pxbach(), 2) + std::pow(casc.pybach(), 2) + std::pow(casc.pzbach(), 2)); - - if (std::abs(poseta) > candidateSelectionValues.etaDauCut || std::abs(negeta) > candidateSelectionValues.etaDauCut || std::abs(bacheta) > candidateSelectionValues.etaDauCut) - continue; - histos.fill(HIST("hCandidate"), ++counter); - - if (candidateSelectionFlags.doCascadeCosPaCut) { - if (!isCosPAAccepted(casc, coll.posX(), coll.posY(), coll.posZ(), candidateSelectionFlags.doPtDepCosPaCut, true)) - continue; - histos.fill(HIST("hCandidate"), ++counter); - } else { - ++counter; - } - - if (candidateSelectionFlags.doDCAV0ToPVCut) { - if (std::abs(casc.dcav0topv(coll.posX(), coll.posY(), coll.posZ())) < candidateSelectionValues.dcaV0ToPV) - continue; - histos.fill(HIST("hCandidate"), ++counter); - } else { - ++counter; - } - - if (isNegative) { - if (qaFlags.doFillNsigmaTPCHistProton) - histos.fill(HIST("hNsigmaProton"), posExtra.tpcNSigmaPr(), fullMomentumPosDaugh, centrality); - if (qaFlags.doFillNsigmaTPCHistV0Pion) - histos.fill(HIST("hNsigmaPionNeg"), negExtra.tpcNSigmaPi(), fullmomentumNegDaugh, centrality); - if (qaFlags.doFillNsigmaTPCHistPionBach && isXi) - histos.fill(HIST("hNsigmaPionNegBach"), bachExtra.tpcNSigmaPi(), fullmomentumBachelor, centrality); - if (qaFlags.doFillNsigmaTPCHistPionBach && !isXi) - histos.fill(HIST("hNsigmaKaon"), bachExtra.tpcNSigmaPi(), fullmomentumBachelor, centrality); - - if (candidateSelectionFlags.doNTPCSigmaCut) { - if (std::abs(posExtra.tpcNSigmaPr()) > candidateSelectionValues.nsigmatpcPr || std::abs(negExtra.tpcNSigmaPi()) > candidateSelectionValues.nsigmatpcPi) - continue; - histos.fill(HIST("hCandidate"), ++counter); - } else { - ++counter; - } - } - if (isPositive) { - if (qaFlags.doFillNsigmaTPCHistV0Pion) - histos.fill(HIST("hNsigmaPionPos"), posExtra.tpcNSigmaPi(), fullMomentumPosDaugh, centrality); - if (qaFlags.doFillNsigmaTPCHistProton) - histos.fill(HIST("hNsigmaProtonNeg"), negExtra.tpcNSigmaPr(), fullmomentumNegDaugh, centrality); - if (qaFlags.doFillNsigmaTPCHistPionBach && isXi) - histos.fill(HIST("hNsigmaPionPosBach"), bachExtra.tpcNSigmaPi(), fullmomentumBachelor, centrality); - if (qaFlags.doFillNsigmaTPCHistPionBach && !isXi) - histos.fill(HIST("hNsigmaKaon"), bachExtra.tpcNSigmaPi(), fullmomentumBachelor, centrality); - - if (candidateSelectionFlags.doNTPCSigmaCut) { - if (std::abs(posExtra.tpcNSigmaPi()) > candidateSelectionValues.nsigmatpcPi || std::abs(negExtra.tpcNSigmaPr()) > candidateSelectionValues.nsigmatpcPr) - continue; - histos.fill(HIST("hCandidate"), ++counter); - } else { - ++counter; - } - } - - if (std::abs(posExtra.tpcCrossedRows()) < candidateSelectionValues.mintpccrrows || std::abs(negExtra.tpcCrossedRows()) < candidateSelectionValues.mintpccrrows || std::abs(bachExtra.tpcCrossedRows()) < candidateSelectionValues.mintpccrrows) - continue; - histos.fill(HIST("hCandidate"), ++counter); - - bool kHasTOF = (posExtra.hasTOF() || negExtra.hasTOF() || bachExtra.hasTOF()); - bool kHasITS = (posExtra.hasITS() || negExtra.hasITS() || bachExtra.hasITS()); - if (candidateSelectionFlags.dooobrej == 1) { - if (!kHasTOF && !kHasITS) - continue; - histos.fill(HIST("hCandidate"), ++counter); - } else if (candidateSelectionFlags.dooobrej == 2) { - if (!kHasTOF && (casc.pt() > candidateSelectionValues.ptthrtof)) - continue; - histos.fill(HIST("hCandidate"), ++counter); - } else { - ++counter; - } - - float cascpos = std::hypot(casc.x() - coll.posX(), casc.y() - coll.posY(), casc.z() - coll.posZ()); - float cascptotmom = std::hypot(casc.px(), casc.py(), casc.pz()); - float ctau = -10; - - if (posExtra.hasTOF()) { - if (candidateSelectionFlags.doNTOFSigmaProtonCut && isNegative) { - histos.fill(HIST("hNsigmaTOFProton"), casc.tofNSigmaXiLaPr(), fullMomentumPosDaugh, centrality); - if (std::abs(casc.tofNSigmaXiLaPr()) > candidateSelectionValues.nsigmatofPr && fullMomentumPosDaugh > 0.6) - continue; - } - if (candidateSelectionFlags.doNTOFSigmaV0PionCut && isPositive) { - histos.fill(HIST("hNsigmaTOFV0Pion"), casc.tofNSigmaXiLaPi(), fullMomentumPosDaugh, centrality); - if (std::abs(casc.tofNSigmaXiLaPi()) > candidateSelectionValues.nsigmatofPion) - continue; - } - } - - if (negExtra.hasTOF()) { - if (candidateSelectionFlags.doNTOFSigmaProtonCut && isPositive) { - histos.fill(HIST("hNsigmaTOFProton"), casc.tofNSigmaXiLaPr(), fullmomentumNegDaugh, centrality); - if (std::abs(casc.tofNSigmaXiLaPr()) > candidateSelectionValues.nsigmatofPr && fullmomentumNegDaugh > 0.6) - continue; - } - if (candidateSelectionFlags.doNTOFSigmaV0PionCut && isNegative) { - histos.fill(HIST("hNsigmaTOFV0Pion"), casc.tofNSigmaXiLaPi(), fullmomentumNegDaugh, centrality); - if (std::abs(casc.tofNSigmaXiLaPi()) > candidateSelectionValues.nsigmatofPion) - continue; - } - } - - if (candidateSelectionFlags.doAtLeastOneTrackAB) { - if (bachExtra.hasITSTracker() && negExtra.hasITSTracker() && posExtra.hasITSTracker()) - continue; - } - if (candidateSelectionFlags.doBachelorITSTracking) { - if (!bachExtra.hasITSTracker()) - continue; - } - if (candidateSelectionFlags.doAllTracksMinITSClusters) { - if (bachExtra.itsNCls() < candidateSelectionValues.minITSclusters || posExtra.itsNCls() < candidateSelectionValues.minITSclusters || negExtra.itsNCls() < candidateSelectionValues.minITSclusters) - continue; - } - - if (isXi) { - if (candidateSelectionFlags.doNTPCSigmaCut) { - if (std::abs(bachExtra.tpcNSigmaPi()) > candidateSelectionValues.nsigmatpcPi) - continue; - histos.fill(HIST("hCandidate"), ++counter); - } else { - ++counter; - } - - if (bachExtra.hasTOF() && candidateSelectionFlags.doNTOFSigmaBachelorCut) { - histos.fill(HIST("hNsigmaTOFBachelorPion"), casc.tofNSigmaXiPi(), fullmomentumBachelor, centrality); - if (std::abs(casc.tofNSigmaXiPi()) > candidateSelectionValues.nsigmatofBachPion) - continue; - } - - ctau = o2::constants::physics::MassXiMinus * cascpos / ((cascptotmom + 1e-13) * ctauxiPDG); - } else { - if (candidateSelectionFlags.doNTPCSigmaCut) { - if (std::abs(bachExtra.tpcNSigmaKa()) > candidateSelectionValues.nsigmatpcKa) - continue; - histos.fill(HIST("hCandidate"), ++counter); - } else { - ++counter; - } - - if (bachExtra.hasTOF() && candidateSelectionFlags.doNTOFSigmaBachelorCut) { - histos.fill(HIST("hNsigmaTOFBachelorKaon"), casc.tofNSigmaOmKa(), fullmomentumBachelor, centrality); - if (std::abs(casc.tofNSigmaOmKa()) > candidateSelectionValues.nsigmatofBachKaon) - continue; - } - - ctau = o2::constants::physics::MassOmegaMinus * cascpos / ((cascptotmom + 1e-13) * ctauomegaPDG); - } - - if (candidateSelectionFlags.doProperLifeTimeCut) { - if (ctau > candidateSelectionValues.proplifetime) - continue; - histos.fill(HIST("hCandidate"), ++counter); - } else { - ++counter; - } - - if (qaFlags.doITSTPCmatchingCheck) { - auto ptPosDaugh = std::sqrt(std::pow(casc.pxpos(), 2) + std::pow(casc.pypos(), 2)); - auto ptNegDaugh = std::sqrt(std::pow(casc.pxneg(), 2) + std::pow(casc.pyneg(), 2)); - auto ptBachelor = std::sqrt(std::pow(casc.pxbach(), 2) + std::pow(casc.pybach(), 2)); - - histos.fill(HIST("histITSTPCmatchPosTrack"), ptPosDaugh, centrality, 0.5); - histos.fill(HIST("histITSTPCmatchNegTrack"), ptNegDaugh, centrality, 0.5); - histos.fill(HIST("histITSTPCmatchBachTrack"), ptBachelor, centrality, 0.5); - if (posExtra.hasITS()) - histos.fill(HIST("histITSTPCmatchPosTrack"), ptPosDaugh, centrality, 1.5); - if (negExtra.hasITS()) - histos.fill(HIST("histITSTPCmatchNegTrack"), ptNegDaugh, centrality, 1.5); - if (bachExtra.hasITS()) - histos.fill(HIST("histITSTPCmatchBachTrack"), ptBachelor, centrality, 1.5); - if (posExtra.hasITS() && posExtra.hasTPC()) - histos.fill(HIST("histITSTPCmatchPosTrack"), ptPosDaugh, centrality, 2.5); - if (negExtra.hasITS() && negExtra.hasTPC()) - histos.fill(HIST("histITSTPCmatchNegTrack"), ptNegDaugh, centrality, 2.5); - if (bachExtra.hasITS() && bachExtra.hasTPC()) - histos.fill(HIST("histITSTPCmatchBachTrack"), ptBachelor, centrality, 2.5); - } - - if (isPositive) { - histos.fill(HIST("InvMassAfterSel/h") + HIST(kCharge[0]) + HIST("Cascade"), casc.pt(), mass, centrality); - if (isTrueMCCascadeDecay) { - histos.fill(HIST("hPositiveCascadePtForEfficiency"), ptmc, mass, centrality); - histos.fill(HIST("hPositiveCascadePtForEfficiencyVsNch"), ptmc, mass, nChEta05); - } - } - if (isNegative) { - histos.fill(HIST("InvMassAfterSel/h") + HIST(kCharge[1]) + HIST("Cascade"), casc.pt(), mass, centrality); - if (isTrueMCCascadeDecay) { - histos.fill(HIST("hNegativeCascadePtForEfficiency"), ptmc, mass, centrality); - histos.fill(HIST("hNegativeCascadePtForEfficiencyVsNch"), ptmc, mass, nChEta05); - } - } - if (isTrueMCCascade) { - if (isPositive) - histos.fill(HIST("InvMassAfterSelMCrecTruth/h") + HIST(kCharge[0]) + HIST("Cascade"), ptmc, mass, centrality); - if (isNegative) - histos.fill(HIST("InvMassAfterSelMCrecTruth/h") + HIST(kCharge[1]) + HIST("Cascade"), ptmc, mass, centrality); - } - if (qaFlags.doOccupancyCheck) { - float occupancy = -1; - if (useTrackOccupancyDef) - occupancy = coll.trackOccupancyInTimeRange(); - if (useFT0OccupancyDef) - occupancy = coll.ft0cOccupancyInTimeRange(); - static_for<0, 9>([&](auto i) { - constexpr int In = i.value; - if (centrality < kCentralityIntervals[In + 1] && centrality > kCentralityIntervals[In]) { - if (isPositive) { - histos.fill(HIST("InvMassAfterSelCent") + HIST(Index[In]) + HIST("/h") + HIST(kCharge[0]) + HIST("Cascade"), casc.pt(), mass, occupancy); - if (isTrueMCCascadeDecay) - histos.fill(HIST("InvMassAfterSelCent") + HIST(Index[In]) + HIST("/h") + HIST(kCharge[0]) + HIST("CascadeMCTruth"), casc.pt(), mass, occupancy); - } - if (isNegative) { - histos.fill(HIST("InvMassAfterSelCent") + HIST(Index[In]) + HIST("/h") + HIST(kCharge[1]) + HIST("Cascade"), casc.pt(), mass, occupancy); - if (isTrueMCCascadeDecay) - histos.fill(HIST("InvMassAfterSelCent") + HIST(Index[In]) + HIST("/h") + HIST(kCharge[1]) + HIST("CascadeMCTruth"), casc.pt(), mass, occupancy); - } - } - }); - } - - if (qaFlags.doIRCheck) { - double interactionRate = rateFetcher.fetch(ccdb.service, coll.timestamp(), coll.runNumber(), irSource) * 1.e-3; - static_for<0, 9>([&](auto i) { - constexpr int In = i.value; - if (centrality < kCentralityIntervals[In + 1] && centrality > kCentralityIntervals[In]) { - if (isPositive) { - histos.fill(HIST("InvMassAfterSelCent") + HIST(Index[In]) + HIST("/h") + HIST(kCharge[0]) + HIST("CascadeIR"), casc.pt(), mass, interactionRate); - if (isTrueMCCascadeDecay) - histos.fill(HIST("InvMassAfterSelCent") + HIST(Index[In]) + HIST("/h") + HIST(kCharge[0]) + HIST("CascadeMCTruthIR"), casc.pt(), mass, interactionRate); - } - if (isNegative) { - histos.fill(HIST("InvMassAfterSelCent") + HIST(Index[In]) + HIST("/h") + HIST(kCharge[1]) + HIST("CascadeIR"), casc.pt(), mass, interactionRate); - if (isTrueMCCascadeDecay) - histos.fill(HIST("InvMassAfterSelCent") + HIST(Index[In]) + HIST("/h") + HIST(kCharge[1]) + HIST("CascadeMCTruthIR"), casc.pt(), mass, interactionRate); - } - } - }); - } - - float dcaMesonToPV = -10; - float dcaBaryonToPV = -10; - if (isPositive) { - dcaMesonToPV = casc.dcanegtopv(); - dcaBaryonToPV = casc.dcapostopv(); - } - if (isNegative) { - dcaBaryonToPV = casc.dcanegtopv(); - dcaMesonToPV = casc.dcapostopv(); - } - double selections[] = {casc.bachBaryonDCAxyToPV(), - std::abs(casc.dcav0topv(casc.x(), casc.y(), casc.z())), - casc.v0radius(), - casc.cascradius(), - casc.dcaV0daughters(), - casc.dcacascdaughters(), - std::acos(casc.v0cosPA(casc.x(), casc.y(), casc.z())), - casc.dcabachtopv(), - dcaMesonToPV, - dcaBaryonToPV, - ctau}; - bool selectionToBeTested[] = {candidateSelectionFlags.doBachelorBaryonCut, - candidateSelectionFlags.doDCAV0ToPVCut, - candidateSelectionFlags.doV0RadiusCut, - candidateSelectionFlags.doCascadeRadiusCut, - candidateSelectionFlags.doDCAV0DauCut, - candidateSelectionFlags.doDCACascadeDauCut, - candidateSelectionFlags.doV0CosPaCut, - candidateSelectionFlags.doCascadeCosPaCut, - candidateSelectionFlags.doDCAdauToPVCut, - candidateSelectionFlags.doDCAdauToPVCut, - candidateSelectionFlags.doDCAdauToPVCut, - candidateSelectionFlags.doProperLifeTimeCut}; - - if (qaFlags.doPtDepCutStudy) { - static_for<0, 10>([&](auto i) { - constexpr int In = i.value; - if (!selectionToBeTested[In]) { - if (isPositive) - histos.fill(HIST("PtDepCutStudy/h") + HIST(kCharge[0]) + HIST(kSelectionNames[In]), casc.pt(), mass, selections[In]); - if (isNegative) - histos.fill(HIST("PtDepCutStudy/h") + HIST(kCharge[1]) + HIST(kSelectionNames[In]), casc.pt(), mass, selections[In]); - if (isTrueMCCascade) { - if (isPositive) - histos.fill(HIST("PtDepCutStudyMCTruth/h") + HIST(kCharge[0]) + HIST(kSelectionNames[In]), ptmc, mass, selections[In]); - if (isNegative) - histos.fill(HIST("PtDepCutStudyMCTruth/h") + HIST(kCharge[1]) + HIST(kSelectionNames[In]), ptmc, mass, selections[In]); - } - } - }); - } - } - } - void processCascadesMCforEff(soa::Join const& mcCollisions, soa::Join const& Cascades, soa::Join const& collisions) - { - - std::vector listBestCollisionIdx = fillGenEventHist(mcCollisions, collisions); + std::vector listBestCollisionIdx = fillGenEventHist(mcCollisions, collisions); for (auto const& cascMC : Cascades) { if (!cascMC.has_straMCCollision()) @@ -1556,39 +1437,43 @@ struct Derivedcascadeanalysis { if (std::abs(ymc) > candidateSelectionValues.rapCut) continue; - auto mcCollision = cascMC.straMCCollision_as>(); - if (eventSelectionFlags.applyZVtxSelOnMCPV && std::abs(mcCollision.posZ()) > eventSelectionFlags.zVertexCut) { + auto mcCollision = cascMC.template straMCCollision_as>(); + if (eventSelectionCommonFlags.applyZVtxSelOnMCPV && std::abs(mcCollision.posZ()) > eventSelectionCommonFlags.zVertexCut) { continue; } - if (eventSelectionFlags.doInel0MCGen && mcCollision.multMCNParticlesEta10() < 1) { + if (eventSelectionCommonFlags.doInel0MCGen && mcCollision.multMCNParticlesEta10() < 1) { continue; } float centrality = 100.5f; - float occupancy = 49000; - float nChEta05 = -1; + float occupancy = -2; + float nChEta1 = -1; double intRate = -1; if (listBestCollisionIdx[mcCollision.globalIndex()] > -1) { auto collision = collisions.iteratorAt(listBestCollisionIdx[mcCollision.globalIndex()]); - centrality = collision.centFT0C(); - intRate = rateFetcher.fetch(ccdb.service, collision.timestamp(), collision.runNumber(), irSource) * 1.e-3; - if (useCentralityFT0M) - centrality = collision.centFT0M(); - if (useCentralityFT0A) - centrality = collision.centFV0A(); - if (useCentralityFT0Cvar1) - centrality = collision.centFT0CVariant1(); - if (useTrackOccupancyDef) - occupancy = collision.trackOccupancyInTimeRange(); - if (useFT0OccupancyDef) - occupancy = collision.ft0cOccupancyInTimeRange(); - nChEta05 = collision.multNTracksPVeta1(); - } - - if (cascMC.pdgCode() == 3312) { + if constexpr (requires { collision.centFT0C(); }) { + intRate = rateFetcher.fetch(ccdb.service, collision.timestamp(), collision.runNumber(), irSource) * 1.e-3; + centrality = collision.centFT0C(); + if (useCentralityFT0M) + centrality = collision.centFT0M(); + if (useCentralityFT0A) + centrality = collision.centFV0A(); + if (useCentralityFT0Cvar1) + centrality = collision.centFT0CVariant1(); + if (useTrackOccupancyDef) + occupancy = collision.trackOccupancyInTimeRange(); + if (useFT0OccupancyDef) + occupancy = collision.ft0cOccupancyInTimeRange(); + } else { + centrality = eventSelectionRun2Flags.useSPDTrackletsCent ? collision.centRun2SPDTracklets() : collision.centRun2V0M(); + } + nChEta1 = collision.multNTracksPVeta1(); + } + + if (cascMC.pdgCode() == 3312 && isXi) { histos.fill(HIST("h2dGenXiMinus"), centrality, ptmc); - histos.fill(HIST("h2dGenXiMinusVsNch"), nChEta05, ptmc); + histos.fill(HIST("h2dGenXiMinusVsNch"), nChEta1, ptmc); histos.fill(HIST("h2dGenXiMinusEta"), RecoDecay::eta(std::array{cascMC.pxMC(), cascMC.pyMC(), cascMC.pzMC()})); histos.fill(HIST("h2dGenXiMinusEtaPosDaughter"), RecoDecay::eta(std::array{cascMC.pxPosMC(), cascMC.pyPosMC(), cascMC.pzPosMC()})); histos.fill(HIST("h2dGenXiMinusEtaNegDaughter"), RecoDecay::eta(std::array{cascMC.pxNegMC(), cascMC.pyNegMC(), cascMC.pzNegMC()})); @@ -1597,20 +1482,20 @@ struct Derivedcascadeanalysis { histos.fill(HIST("h2dGenXiMinusVsMultMCVsIR"), mcCollision.multMCNParticlesEta05(), intRate, ptmc); histos.fill(HIST("h2dGenXiMinusVsCentOccupancy"), ptmc, centrality, occupancy); histos.fill(HIST("h2dGenXiMinusVsCentIR"), ptmc, centrality, intRate); - histos.fill(HIST("h2dGenXiMinusVsNchVsOccupancy"), ptmc, nChEta05, occupancy); + histos.fill(HIST("h2dGenXiMinusVsNchVsOccupancy"), ptmc, nChEta1, occupancy); } - if (cascMC.pdgCode() == -3312) { + if (cascMC.pdgCode() == -3312 && isXi) { histos.fill(HIST("h2dGenXiPlus"), centrality, ptmc); - histos.fill(HIST("h2dGenXiPlusVsNch"), nChEta05, ptmc); + histos.fill(HIST("h2dGenXiPlusVsNch"), nChEta1, ptmc); histos.fill(HIST("h2dGenXiPlusVsMultMCVsCentrality"), mcCollision.multMCNParticlesEta05(), centrality, ptmc); histos.fill(HIST("h2dGenXiPlusVsMultMCVsIR"), mcCollision.multMCNParticlesEta05(), intRate, ptmc); histos.fill(HIST("h2dGenXiPlusVsCentOccupancy"), ptmc, centrality, occupancy); - histos.fill(HIST("h2dGenXiPlusVsNchVsOccupancy"), ptmc, nChEta05, occupancy); + histos.fill(HIST("h2dGenXiPlusVsNchVsOccupancy"), ptmc, nChEta1, occupancy); histos.fill(HIST("h2dGenXiPlusVsCentIR"), ptmc, centrality, intRate); } - if (cascMC.pdgCode() == 3334) { + if (cascMC.pdgCode() == 3334 && !isXi) { histos.fill(HIST("h2dGenOmegaMinus"), centrality, ptmc); - histos.fill(HIST("h2dGenOmegaMinusVsNch"), nChEta05, ptmc); + histos.fill(HIST("h2dGenOmegaMinusVsNch"), nChEta1, ptmc); histos.fill(HIST("h2dGenOmegaMinusEta"), RecoDecay::eta(std::array{cascMC.pxMC(), cascMC.pyMC(), cascMC.pzMC()})); histos.fill(HIST("h2dGenOmegaMinusEtaPosDaughter"), RecoDecay::eta(std::array{cascMC.pxPosMC(), cascMC.pyPosMC(), cascMC.pzPosMC()})); histos.fill(HIST("h2dGenOmegaMinusEtaNegDaughter"), RecoDecay::eta(std::array{cascMC.pxNegMC(), cascMC.pyNegMC(), cascMC.pzNegMC()})); @@ -1618,16 +1503,16 @@ struct Derivedcascadeanalysis { histos.fill(HIST("h2dGenOmegaMinusVsMultMCVsCentrality"), mcCollision.multMCNParticlesEta05(), centrality, ptmc); histos.fill(HIST("h2dGenOmegaMinusVsMultMCVsIR"), mcCollision.multMCNParticlesEta05(), intRate, ptmc); histos.fill(HIST("h2dGenOmegaMinusVsCentOccupancy"), ptmc, centrality, occupancy); - histos.fill(HIST("h2dGenOmegaMinusVsNchVsOccupancy"), ptmc, nChEta05, occupancy); + histos.fill(HIST("h2dGenOmegaMinusVsNchVsOccupancy"), ptmc, nChEta1, occupancy); histos.fill(HIST("h2dGenOmegaMinusVsCentIR"), ptmc, centrality, intRate); } - if (cascMC.pdgCode() == -3334) { + if (cascMC.pdgCode() == -3334 && !isXi) { histos.fill(HIST("h2dGenOmegaPlus"), centrality, ptmc); - histos.fill(HIST("h2dGenOmegaPlusVsNch"), nChEta05, ptmc); + histos.fill(HIST("h2dGenOmegaPlusVsNch"), nChEta1, ptmc); histos.fill(HIST("h2dGenOmegaPlusVsMultMCVsCentrality"), mcCollision.multMCNParticlesEta05(), centrality, ptmc); histos.fill(HIST("h2dGenOmegaPlusVsMultMCVsIR"), mcCollision.multMCNParticlesEta05(), intRate, ptmc); histos.fill(HIST("h2dGenOmegaPlusVsCentOccupancy"), ptmc, centrality, occupancy); - histos.fill(HIST("h2dGenOmegaPlusVsNchVsOccupancy"), ptmc, nChEta05, occupancy); + histos.fill(HIST("h2dGenOmegaPlusVsNchVsOccupancy"), ptmc, nChEta1, occupancy); histos.fill(HIST("h2dGenOmegaPlusVsCentIR"), ptmc, centrality, intRate); } } @@ -1635,23 +1520,24 @@ struct Derivedcascadeanalysis { // ______________________________________________________ // Simulated processing // Fill event information (for event loss estimation) and return the index to the recoed collision associated to a given MC collision. - std::vector fillGenEventHist(soa::Join const& mcCollisions, soa::Join const& collisions) + template + std::vector fillGenEventHist(TMCCollisions const& mcCollisions, TCollisions const& collisions) { std::vector listBestCollisionIdx(mcCollisions.size()); for (auto const& mcCollision : mcCollisions) { histos.fill(HIST("hGenEvents"), mcCollision.multMCNParticlesEta05(), 0.5 /* all gen. events*/); - if (eventSelectionFlags.applyZVtxSelOnMCPV && std::abs(mcCollision.posZ()) > eventSelectionFlags.zVertexCut) { + if (eventSelectionCommonFlags.applyZVtxSelOnMCPV && std::abs(mcCollision.posZ()) > eventSelectionCommonFlags.zVertexCut) { continue; } histos.fill(HIST("hGenEvents"), mcCollision.multMCNParticlesEta05(), 1.5 /* gen. events with vertex cut*/); - if (eventSelectionFlags.doInel0MCGen && mcCollision.multMCNParticlesEta10() < 1) { + if (eventSelectionCommonFlags.doInel0MCGen && mcCollision.multMCNParticlesEta10() < 1) { continue; } histos.fill(HIST("hGenEvents"), mcCollision.multMCNParticlesEta05(), 2.5 /* gen. events with INEL>0t*/); - auto groupedCollisions = collisions.sliceBy(perMcCollision, mcCollision.globalIndex()); + auto groupedCollisions = getGroupedCollisions(collisions, mcCollision.globalIndex()); // Check if there is at least one of the reconstructed collisions associated to this MC collision // If so, we consider it bool atLeastOne = false; @@ -1669,14 +1555,18 @@ struct Derivedcascadeanalysis { if (biggestNContribs < collision.multPVTotalContributors()) { biggestNContribs = collision.multPVTotalContributors(); bestCollisionIndex = collision.globalIndex(); - centrality = collision.centFT0C(); - intRate = rateFetcher.fetch(ccdb.service, collision.timestamp(), collision.runNumber(), irSource) * 1.e-3; - if (useCentralityFT0M) - centrality = collision.centFT0M(); - if (useCentralityFT0A) - centrality = collision.centFV0A(); - if (useCentralityFT0Cvar1) - centrality = collision.centFT0CVariant1(); + if constexpr (requires { collision.centFT0C(); }) { + centrality = collision.centFT0C(); + intRate = rateFetcher.fetch(ccdb.service, collision.timestamp(), collision.runNumber(), irSource) * 1.e-3; + if (useCentralityFT0M) + centrality = collision.centFT0M(); + if (useCentralityFT0A) + centrality = collision.centFV0A(); + if (useCentralityFT0Cvar1) + centrality = collision.centFT0CVariant1(); + } else { + centrality = eventSelectionRun2Flags.useSPDTrackletsCent ? collision.centRun2SPDTracklets() : collision.centRun2V0M(); + } } nCollisions++; @@ -1702,9 +1592,39 @@ struct Derivedcascadeanalysis { } return listBestCollisionIdx; } + + void processCascades(soa::Join::iterator const& coll, soa::Join const& Cascades, DauTracks const&) + { + analyseCascades(coll, Cascades); + } + void processCascadesRun2(soa::Join::iterator const& coll, soa::Join const& Cascades, DauTracks const&) + { + analyseCascades(coll, Cascades); + } + + void processCascadesMCrec(soa::Join::iterator const& coll, CascMCCandidates const& Cascades, DauTracks const&, soa::Join const&) + { + analyseCascades(coll, Cascades); + } + void processCascadesMCrecRun2(soa::Join::iterator const& coll, CascMCCandidates const& Cascades, DauTracks const&, soa::Join const&) + { + analyseCascades(coll, Cascades); + } + + void processCascadesMCforEff(soa::Join const& mcCollisions, soa::Join const& Cascades, soa::Join const& collisions) + { + analyseCascadesMCforEff(mcCollisions, Cascades, collisions); + } + void processCascadesMCforEffRun2(soa::Join const& mcCollisions, soa::Join const& Cascades, soa::Join const& collisions) + { + analyseCascadesMCforEff(mcCollisions, Cascades, collisions); + } PROCESS_SWITCH(Derivedcascadeanalysis, processCascades, "cascade analysis, run3 data ", true); + PROCESS_SWITCH(Derivedcascadeanalysis, processCascadesRun2, "cascade analysis, run2 data ", false); PROCESS_SWITCH(Derivedcascadeanalysis, processCascadesMCrec, "cascade analysis, run3 rec MC", false); + PROCESS_SWITCH(Derivedcascadeanalysis, processCascadesMCrecRun2, "cascade analysis, run2 rec MC", false); PROCESS_SWITCH(Derivedcascadeanalysis, processCascadesMCforEff, "cascade analysis, run3 rec MC", false); + PROCESS_SWITCH(Derivedcascadeanalysis, processCascadesMCforEffRun2, "cascade analysis, run2 rec MC", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 94a6dd58f79c9d0cd38f581c17a0841a764ce4b4 Mon Sep 17 00:00:00 2001 From: Suraj Prasad Date: Sun, 2 Mar 2025 21:39:04 +0530 Subject: [PATCH 0502/1650] [PWGLF] Bug fix in bachBaryonDCAxyToPV cut for Xi versus flattenicity (#10253) --- PWGLF/Tasks/Strangeness/lambdak0sflattenicity.cxx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdak0sflattenicity.cxx b/PWGLF/Tasks/Strangeness/lambdak0sflattenicity.cxx index 2cc264499f2..4841ede993d 100755 --- a/PWGLF/Tasks/Strangeness/lambdak0sflattenicity.cxx +++ b/PWGLF/Tasks/Strangeness/lambdak0sflattenicity.cxx @@ -1892,6 +1892,7 @@ struct Lambdak0sflattenicity { float cosPAcasc = casc.casccosPA(collision.posX(), collision.posY(), collision.posZ()); float cosPAv0 = casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ()); float massXi = casc.mXi(); + rXi.fill(HIST("hMassXi"), massXi); // Cascade if (posDaughterTrack.tpcNSigmaPi() < nSigmaTPCPion && negDaughterTrack.tpcNSigmaPi() < nSigmaTPCPion && bacDaughterTrack.tpcNSigmaPi() < nSigmaTPCPion && posDaughterTrack.tpcNSigmaKa() < nSigmaTPCKaon && negDaughterTrack.tpcNSigmaKa() < nSigmaTPCKaon && bacDaughterTrack.tpcNSigmaKa() < nSigmaTPCKaon && @@ -1899,7 +1900,7 @@ struct Lambdak0sflattenicity { posDaughterTrack.tpcNClsCrossedRows() > nTPCcrossedRows && negDaughterTrack.tpcNClsCrossedRows() > nTPCcrossedRows && bacDaughterTrack.tpcNClsCrossedRows() > nTPCcrossedRows && std::abs(posDaughterTrack.eta()) < cfgTrkEtaCut && std::abs(negDaughterTrack.eta()) < cfgTrkEtaCut && std::abs(bacDaughterTrack.eta()) < cfgTrkEtaCut && casc.dcapostopv() > v0settingDCApostopv && casc.dcanegtopv() > v0settingDCAnegtopv && casc.dcabachtopv() > v0settingDCAbactopv && casc.dcaV0daughters() < v0settingDCAv0dau && dcav0pv > cascsettingDCAv0toPV && - casc.dcacascdaughters() < cascsettingDCAv0bach && casc.bachBaryonDCAxyToPV() > cascsettingDCAxybaryonbach && cosPAcasc > cascsettingCosPAcascPV && cosPAv0 > cascsettingCosPAv0PV && + casc.dcacascdaughters() < cascsettingDCAv0bach && casc.bachBaryonDCAxyToPV() < cascsettingDCAxybaryonbach && cosPAcasc > cascsettingCosPAcascPV && cosPAv0 > cascsettingCosPAv0PV && casc.cascradius() > cascsettingcascradius && casc.v0radius() > cascsettingv0radius && std::abs(casc.yXi()) < cascsettingRapidity && ctauXi < ctauxiPDG * cascsettingproplifetime && std::abs(casc.mLambda() - pdgmassLambda) < cascsettingMassRejectionLambdaXi && std::abs(casc.mOmega() - pdgmassOmega) > cascsettingMassRejectioOmegaXi) { @@ -1958,6 +1959,7 @@ struct Lambdak0sflattenicity { float cosPAcasc = casc.casccosPA(collision.posX(), collision.posY(), collision.posZ()); float cosPAv0 = casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ()); float massXi = casc.mXi(); + rXi.fill(HIST("hMassXi"), massXi); // Cascade if (posDaughterTrack.tpcNSigmaPi() < nSigmaTPCPion && negDaughterTrack.tpcNSigmaPi() < nSigmaTPCPion && bacDaughterTrack.tpcNSigmaPi() < nSigmaTPCPion && posDaughterTrack.tpcNSigmaKa() < nSigmaTPCKaon && negDaughterTrack.tpcNSigmaKa() < nSigmaTPCKaon && bacDaughterTrack.tpcNSigmaKa() < nSigmaTPCKaon && @@ -1965,7 +1967,7 @@ struct Lambdak0sflattenicity { posDaughterTrack.tpcNClsCrossedRows() > nTPCcrossedRows && negDaughterTrack.tpcNClsCrossedRows() > nTPCcrossedRows && bacDaughterTrack.tpcNClsCrossedRows() > nTPCcrossedRows && std::abs(posDaughterTrack.eta()) < cfgTrkEtaCut && std::abs(negDaughterTrack.eta()) < cfgTrkEtaCut && std::abs(bacDaughterTrack.eta()) < cfgTrkEtaCut && casc.dcapostopv() > v0settingDCApostopv && casc.dcanegtopv() > v0settingDCAnegtopv && casc.dcabachtopv() > v0settingDCAbactopv && casc.dcaV0daughters() < v0settingDCAv0dau && dcav0pv > cascsettingDCAv0toPV && - casc.dcacascdaughters() < cascsettingDCAv0bach && casc.bachBaryonDCAxyToPV() > cascsettingDCAxybaryonbach && cosPAcasc > cascsettingCosPAcascPV && cosPAv0 > cascsettingCosPAv0PV && + casc.dcacascdaughters() < cascsettingDCAv0bach && casc.bachBaryonDCAxyToPV() < cascsettingDCAxybaryonbach && cosPAcasc > cascsettingCosPAcascPV && cosPAv0 > cascsettingCosPAv0PV && casc.cascradius() > cascsettingcascradius && casc.v0radius() > cascsettingv0radius && std::abs(casc.yXi()) < cascsettingRapidity && ctauXi < ctauxiPDG * cascsettingproplifetime && std::abs(casc.mLambda() - pdgmassLambda) < cascsettingMassRejectionLambdaXi && std::abs(casc.mOmega() - pdgmassOmega) > cascsettingMassRejectioOmegaXi) { From 5ae9c43f5deb8c3c2573960fb79572a6370f4ce7 Mon Sep 17 00:00:00 2001 From: nzardosh Date: Sun, 2 Mar 2025 16:50:59 +0000 Subject: [PATCH 0503/1650] [PWGJE] reducing cpu of rho estimator (#10278) --- PWGJE/Core/JetMatchingUtilities.h | 6 + .../Substructure/jetSubstructureMatching.cxx | 32 ++- .../jetSubstructureMatchingSub.cxx | 32 ++- PWGJE/TableProducer/rhoEstimator.cxx | 270 +++++++++++++----- PWGJE/Tasks/jetSubstructure.cxx | 8 +- PWGJE/Tasks/jetSubstructureHF.cxx | 8 +- 6 files changed, 271 insertions(+), 85 deletions(-) diff --git a/PWGJE/Core/JetMatchingUtilities.h b/PWGJE/Core/JetMatchingUtilities.h index 012efc1939d..1c499686638 100644 --- a/PWGJE/Core/JetMatchingUtilities.h +++ b/PWGJE/Core/JetMatchingUtilities.h @@ -365,8 +365,14 @@ template >& baseToTagMatchingHF, std::vector>& tagToBaseMatchingHF, V const& /*candidatesBase*/, M const& /*candidatesTag*/, N const& tracksBase, O const& tracksTag) { for (const auto& jetBase : jetsBasePerCollision) { + if (jetBase.candidatesIds().size() == 0) { + continue; + } const auto candidateBase = jetBase.template candidates_first_as(); for (const auto& jetTag : jetsTagPerCollision) { + if (jetTag.candidatesIds().size() == 0) { + continue; + } if (std::round(jetBase.r()) != std::round(jetTag.r())) { continue; } diff --git a/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatching.cxx b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatching.cxx index 1fee274e703..6d72dbf880f 100644 --- a/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatching.cxx +++ b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatching.cxx @@ -58,6 +58,7 @@ struct JetSubstructureMatching { Configurable doMatchingHf{"doMatchingHf", false, "Enable HF matching"}; Configurable maxMatchingDistance{"maxMatchingDistance", 0.24f, "Max matching distance"}; Configurable minPtFraction{"minPtFraction", 0.5f, "Minimum pt fraction for pt matching"}; + Configurable requireGeoMatchedJets{"requireGeoMatchedJets", false, "require jets are geo matched as well"}; Configurable requirePtMatchedJets{"requirePtMatchedJets", false, "require jets are pT matched as well"}; Configurable requireHFMatchedJets{"requireHFMatchedJets", false, "require jets are HF matched as well"}; @@ -107,6 +108,16 @@ struct JetSubstructureMatching { } } + template + auto defaultMatchedJets(T const& jetTag) + { + if constexpr (jetcandidateutilities::isCandidateTable()) { + return jetTag.template matchedJetCand_as(); + } else { + return jetTag.template matchedJetGeo_as(); + } + } + void processData(JetsTag const& jetsTag, JetsBase const&, SplittingsBase const& jetsBaseSplittings, @@ -144,7 +155,13 @@ struct JetSubstructureMatching { jetBasePairsMap.resize(jetsBasePairs.size(), -1); for (auto jetTag : jetsTag) { - if (jetTag.has_matchedJetGeo()) { + bool hasMatchedJet = false; + if constexpr (jetcandidateutilities::isCandidateTable()) { + hasMatchedJet = jetTag.has_matchedJetCand(); + } else { + hasMatchedJet = jetTag.has_matchedJetGeo(); + } + if (hasMatchedJet) { // auto const& jetTagSplittings = jetsTagSplittings.sliceBy(TagSplittingsPerTagJet, jetTag.globalIndex()); auto const& jetTagSplittings = slicedPerJetForMatching(jetsTagSplittings, jetTag, TagSplittingsPerTagJetInclusive, TagSplittingsPerTagJetD0, TagSplittingsPerTagJetDplus, TagSplittingsPerTagJetLc, TagSplittingsPerTagJetBplus, TagSplittingsPerTagJetDielectron); int tagSplittingIndex = 0; @@ -159,7 +176,18 @@ struct JetSubstructureMatching { jetTagPairsMap[jetTagPair.globalIndex()] = tagPairIndex; tagPairIndex++; } - for (auto& jetBase : jetTag.template matchedJetGeo_as()) { + for (auto& jetBase : defaultMatchedJets(jetTag)) { + if (requireGeoMatchedJets) { + bool jetsMatchedWithGeo = false; + for (auto& jetBaseForMatchGeo : jetTag.template matchedJetGeo_as()) { + if (jetBaseForMatchGeo.globalIndex() == jetBase.globalIndex()) { + jetsMatchedWithGeo = true; + } + } + if (!jetsMatchedWithGeo) { + continue; + } + } if (requirePtMatchedJets) { bool jetsMatchedWithPt = false; for (auto& jetBaseForMatchPt : jetTag.template matchedJetPt_as()) { diff --git a/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSub.cxx b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSub.cxx index 456e546ceb9..5c1382671d2 100644 --- a/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSub.cxx +++ b/PWGJE/TableProducer/Matching/Substructure/jetSubstructureMatchingSub.cxx @@ -59,6 +59,7 @@ struct JetSubstructureMatchingSub { Configurable doMatchingHf{"doMatchingHf", false, "Enable HF matching"}; Configurable maxMatchingDistance{"maxMatchingDistance", 0.24f, "Max matching distance"}; Configurable minPtFraction{"minPtFraction", 0.5f, "Minimum pt fraction for pt matching"}; + Configurable requireGeoMatchedJets{"requireGeoMatchedJets", false, "require jets are geo matched as well"}; Configurable requirePtMatchedJets{"requirePtMatchedJets", false, "require jets are pT matched as well"}; Configurable requireHFMatchedJets{"requireHFMatchedJets", false, "require jets are HF matched as well"}; @@ -108,6 +109,16 @@ struct JetSubstructureMatchingSub { } } + template + auto defaultMatchedJets(T const& jetTag) + { + if constexpr (jetcandidateutilities::isCandidateTable()) { + return jetTag.template matchedJetCand_as(); + } else { + return jetTag.template matchedJetGeo_as(); + } + } + void processData(JetsTag const& jetsTag, JetsBase const&, SplittingsBase const& jetsBaseSplittings, @@ -145,7 +156,13 @@ struct JetSubstructureMatchingSub { jetBasePairsMap.resize(jetsBasePairs.size(), -1); for (auto jetTag : jetsTag) { - if (jetTag.has_matchedJetGeo()) { + bool hasMatchedJet = false; + if constexpr (jetcandidateutilities::isCandidateTable()) { + hasMatchedJet = jetTag.has_matchedJetCand(); + } else { + hasMatchedJet = jetTag.has_matchedJetGeo(); + } + if (hasMatchedJet) { // auto const& jetTagSplittings = jetsTagSplittings.sliceBy(TagSplittingsPerTagJet, jetTag.globalIndex()); auto const& jetTagSplittings = slicedPerJetForMatching(jetsTagSplittings, jetTag, TagSplittingsPerTagJetInclusive, TagSplittingsPerTagJetD0, TagSplittingsPerTagJetDplus, TagSplittingsPerTagJetLc, TagSplittingsPerTagJetBplus, TagSplittingsPerTagJetDielectron); int tagSplittingIndex = 0; @@ -160,7 +177,18 @@ struct JetSubstructureMatchingSub { jetTagPairsMap[jetTagPair.globalIndex()] = tagPairIndex; tagPairIndex++; } - for (auto& jetBase : jetTag.template matchedJetGeo_as()) { + for (auto& jetBase : defaultMatchedJets(jetTag)) { + if (requireGeoMatchedJets) { + bool jetsMatchedWithGeo = false; + for (auto& jetBaseForMatchGeo : jetTag.template matchedJetGeo_as()) { + if (jetBaseForMatchGeo.globalIndex() == jetBase.globalIndex()) { + jetsMatchedWithGeo = true; + } + } + if (!jetsMatchedWithGeo) { + continue; + } + } if (requirePtMatchedJets) { bool jetsMatchedWithPt = false; for (auto& jetBaseForMatchPt : jetTag.template matchedJetPt_as()) { diff --git a/PWGJE/TableProducer/rhoEstimator.cxx b/PWGJE/TableProducer/rhoEstimator.cxx index cea195df69f..6e96a6e7825 100644 --- a/PWGJE/TableProducer/rhoEstimator.cxx +++ b/PWGJE/TableProducer/rhoEstimator.cxx @@ -13,6 +13,9 @@ // /// \author Nima Zardoshti +#include +#include + #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "Framework/ASoA.h" @@ -43,87 +46,193 @@ struct RhoEstimatorTask { Produces rhoDielectronTable; Produces rhoDielectronMcTable; - Configurable skipMBGapEvents{"skipMBGapEvents", true, "decide to run over MB gap events or not"}; - - Configurable trackPtMin{"trackPtMin", 0.15, "minimum track pT"}; - Configurable trackPtMax{"trackPtMax", 1000.0, "maximum track pT"}; - Configurable trackEtaMin{"trackEtaMin", -0.9, "minimum track eta"}; - Configurable trackEtaMax{"trackEtaMax", 0.9, "maximum track eta"}; - Configurable trackPhiMin{"trackPhiMin", -99.0, "minimum track phi"}; - Configurable trackPhiMax{"trackPhiMax", 99.0, "maximum track phi"}; - Configurable trackingEfficiency{"trackingEfficiency", 1.0, "tracking efficiency applied to jet finding"}; - Configurable trackSelections{"trackSelections", "globalTracks", "set track selections"}; - - Configurable particleSelections{"particleSelections", "PhysicalPrimary", "set particle selections"}; - - Configurable jetAlgorithm{"jetAlgorithm", 0, "jet clustering algorithm. 0 = kT, 1 = C/A, 2 = Anti-kT"}; - Configurable jetRecombScheme{"jetRecombScheme", 0, "jet recombination scheme. 0 = E-scheme, 1 = pT-scheme, 2 = pT2-scheme"}; - Configurable bkgjetR{"bkgjetR", 0.2, "jet resolution parameter for determining background density"}; - Configurable bkgEtaMin{"bkgEtaMin", -0.7, "minimim pseudorapidity for determining background density"}; - Configurable bkgEtaMax{"bkgEtaMax", 0.7, "maximum pseudorapidity for determining background density"}; - Configurable bkgPhiMin{"bkgPhiMin", -99.0, "minimim phi for determining background density"}; - Configurable bkgPhiMax{"bkgPhiMax", 99.0, "maximum phi for determining background density"}; - Configurable doSparse{"doSparse", false, "perfom sparse estimation"}; + struct : ConfigurableGroup { + + Configurable skipMBGapEvents{"skipMBGapEvents", true, "decide to run over MB gap events or not"}; + + Configurable trackPtMin{"trackPtMin", 0.15, "minimum track pT"}; + Configurable trackPtMax{"trackPtMax", 1000.0, "maximum track pT"}; + Configurable trackEtaMin{"trackEtaMin", -0.9, "minimum track eta"}; + Configurable trackEtaMax{"trackEtaMax", 0.9, "maximum track eta"}; + Configurable trackPhiMin{"trackPhiMin", -99.0, "minimum track phi"}; + Configurable trackPhiMax{"trackPhiMax", 99.0, "maximum track phi"}; + Configurable trackingEfficiency{"trackingEfficiency", 1.0, "tracking efficiency applied to jet finding"}; + Configurable trackSelections{"trackSelections", "globalTracks", "set track selections"}; + + Configurable particleSelections{"particleSelections", "PhysicalPrimary", "set particle selections"}; + + Configurable jetAlgorithm{"jetAlgorithm", 0, "jet clustering algorithm. 0 = kT, 1 = C/A, 2 = Anti-kT"}; + Configurable jetRecombScheme{"jetRecombScheme", 0, "jet recombination scheme. 0 = E-scheme, 1 = pT-scheme, 2 = pT2-scheme"}; + Configurable bkgjetR{"bkgjetR", 0.2, "jet resolution parameter for determining background density"}; + Configurable bkgEtaMin{"bkgEtaMin", -0.7, "minimim pseudorapidity for determining background density"}; + Configurable bkgEtaMax{"bkgEtaMax", 0.7, "maximum pseudorapidity for determining background density"}; + Configurable bkgPhiMin{"bkgPhiMin", -99., "minimim phi for determining background density"}; + Configurable bkgPhiMax{"bkgPhiMax", 99., "maximum phi for determining background density"}; + Configurable doSparse{"doSparse", false, "perfom sparse estimation"}; + + Configurable thresholdChargedJetPtMin{"thresholdChargedJetPtMin", 0.0, "Minimum charged jet pt to accept event"}; + Configurable thresholdNeutralJetPtMin{"thresholdNeutralJetPtMin", 0.0, "Minimum neutral jet pt to accept event"}; + Configurable thresholdFullJetPtMin{"thresholdFullJetPtMin", 0.0, "Minimum full jet pt to accept event"}; + Configurable thresholdTriggerTrackPtMin{"thresholdTriggerTrackPtMin", 0.0, "Minimum trigger track pt to accept event"}; + Configurable thresholdClusterEnergyMin{"thresholdClusterEnergyMin", 0.0, "Minimum cluster energy to accept event"}; + Configurable performTriggerTrackSelection{"performTriggerTrackSelection", false, "only accept trigger tracks that pass one of the track selections"}; + Configurable triggerTrackPtSelectionMin{"triggerTrackPtSelectionMin", 0.15, "only accept trigger tracks that have a pT larger than this pT"}; + Configurable triggerTrackEtaSelectionMax{"triggerTrackEtaSelectionMax", 0.9, "only accept trigger tracks that have an eta smaller than this eta"}; + + Configurable vertexZCut{"vertexZCut", 10.0, "z-vertex cut on event"}; + Configurable eventSelections{"eventSelections", "", "choose event selection"}; + Configurable centralityMin{"centralityMin", -999.0, "minimum centrality"}; + Configurable centralityMax{"centralityMax", 999.0, "maximum centrality"}; + Configurable trackOccupancyInTimeRangeMax{"trackOccupancyInTimeRangeMax", 999999, "maximum occupancy of tracks in neighbouring collisions in a given time range"}; + + Configurable triggerMasks{"triggerMasks", "", "possible JE Trigger masks: fJetChLowPt,fJetChHighPt,fTrackLowPt,fTrackHighPt,fJetD0ChLowPt,fJetD0ChHighPt,fJetLcChLowPt,fJetLcChHighPt,fEMCALReadout,fJetFullHighPt,fJetFullLowPt,fJetNeutralHighPt,fJetNeutralLowPt,fGammaVeryHighPtEMCAL,fGammaVeryHighPtDCAL,fGammaHighPtEMCAL,fGammaHighPtDCAL,fGammaLowPtEMCAL,fGammaLowPtDCAL,fGammaVeryLowPtEMCAL,fGammaVeryLowPtDCAL"}; + } config; JetBkgSubUtils bkgSub; float bkgPhiMax_; + float bkgPhiMin_; std::vector inputParticles; int trackSelection = -1; std::string particleSelection; - Service pdgDatabase; + std::vector collisionFlag; + Service pdgDatabase; + std::vector eventSelectionBits; + std::vector triggerMaskBits; void init(o2::framework::InitContext&) { - trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast(trackSelections)); - particleSelection = static_cast(particleSelections); - - bkgSub.setJetAlgorithmAndScheme(static_cast(static_cast(jetAlgorithm)), static_cast(static_cast(jetRecombScheme))); - bkgSub.setJetBkgR(bkgjetR); - bkgSub.setEtaMinMax(bkgEtaMin, bkgEtaMax); - if (bkgPhiMax > 98.0) { + trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast(config.trackSelections)); + particleSelection = static_cast(config.particleSelections); + + bkgSub.setJetAlgorithmAndScheme(static_cast(static_cast(config.jetAlgorithm)), static_cast(static_cast(config.jetRecombScheme))); + bkgSub.setJetBkgR(config.bkgjetR); + bkgSub.setEtaMinMax(config.bkgEtaMin, config.bkgEtaMax); + bkgPhiMax_ = config.bkgPhiMax; + bkgPhiMin_ = config.bkgPhiMin; + if (config.bkgPhiMax > 98.0) { bkgPhiMax_ = 2.0 * M_PI; } - bkgSub.setPhiMinMax(bkgPhiMin, bkgPhiMax_); + if (config.bkgPhiMin < -98.0) { + bkgPhiMin_ = -2.0 * M_PI; + } + bkgSub.setPhiMinMax(bkgPhiMin_, bkgPhiMax_); + eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast(config.eventSelections)); + triggerMaskBits = jetderiveddatautilities::initialiseTriggerMaskBits(config.triggerMasks); + } + + Filter trackCuts = (aod::jtrack::pt >= config.trackPtMin && aod::jtrack::pt < config.trackPtMax && aod::jtrack::eta > config.trackEtaMin && aod::jtrack::eta < config.trackEtaMax && aod::jtrack::phi >= config.trackPhiMin && aod::jtrack::phi <= config.trackPhiMax); + Filter partCuts = (aod::jmcparticle::pt >= config.trackPtMin && aod::jmcparticle::pt < config.trackPtMax && aod::jmcparticle::eta >= config.trackEtaMin && aod::jmcparticle::eta <= config.trackEtaMax && aod::jmcparticle::phi >= config.trackPhiMin && aod::jmcparticle::phi <= config.trackPhiMax); + + void processSetupCollisionSelection(aod::JCollisions const& collisions) + { + collisionFlag.clear(); + collisionFlag.resize(collisions.size(), false); + } + + void processSetupEventTriggering(aod::JCollision const& collision) + { + if (jetderiveddatautilities::selectTrigger(collision, triggerMaskBits)) { + collisionFlag[collision.globalIndex()] = true; + } } - Filter trackCuts = (aod::jtrack::pt >= trackPtMin && aod::jtrack::pt < trackPtMax && aod::jtrack::eta > trackEtaMin && aod::jtrack::eta < trackEtaMax && aod::jtrack::phi >= trackPhiMin && aod::jtrack::phi <= trackPhiMax); - Filter partCuts = (aod::jmcparticle::pt >= trackPtMin && aod::jmcparticle::pt < trackPtMax && aod::jmcparticle::eta >= trackEtaMin && aod::jmcparticle::eta <= trackEtaMax && aod::jmcparticle::phi >= trackPhiMin && aod::jmcparticle::phi <= trackPhiMax); + template + void processSelectionObjects(T& selectionObjects) + { + float selectionObjectPtMin = 0.0; + if constexpr (std::is_same_v, aod::ChargedJets>) { + selectionObjectPtMin = config.thresholdChargedJetPtMin; + } else if constexpr (std::is_same_v, aod::NeutralJets>) { + selectionObjectPtMin = config.thresholdNeutralJetPtMin; + } else if constexpr (std::is_same_v, aod::FullJets>) { + selectionObjectPtMin = config.thresholdFullJetPtMin; + } else if constexpr (std::is_same_v, aod::JTracks>) { + selectionObjectPtMin = config.thresholdTriggerTrackPtMin; + } else if constexpr (std::is_same_v, aod::JClusters>) { + selectionObjectPtMin = config.thresholdClusterEnergyMin; + } else { + selectionObjectPtMin = 0.0; + } + for (const auto& selectionObject : selectionObjects) { + bool isTriggerObject = false; + if constexpr (std::is_same_v, aod::JClusters>) { + if (selectionObject.energy() >= selectionObjectPtMin) { + isTriggerObject = true; + } + } else { + if constexpr (std::is_same_v, aod::JTracks>) { + if (config.performTriggerTrackSelection && !(selectionObject.trackSel() & ~(1 << jetderiveddatautilities::JTrackSel::trackSign))) { + continue; + } + if (selectionObject.pt() < config.triggerTrackPtSelectionMin || std::abs(selectionObject.eta()) > config.triggerTrackEtaSelectionMax) { + continue; + } + } + if (selectionObject.pt() >= selectionObjectPtMin) { + isTriggerObject = true; + } + } + if (isTriggerObject) { + if (selectionObject.collisionId() >= 0) { + collisionFlag[selectionObject.collisionId()] = true; + } + } + } + } + PROCESS_SWITCH(RhoEstimatorTask, processSetupCollisionSelection, "setup the writing for data based on collisions", false); + PROCESS_SWITCH(RhoEstimatorTask, processSetupEventTriggering, "process software triggers", false); + PROCESS_SWITCH_FULL(RhoEstimatorTask, processSelectionObjects, processSelectingChargedJets, "process charged jets", false); + PROCESS_SWITCH_FULL(RhoEstimatorTask, processSelectionObjects, processSelectingNeutralJets, "process neutral jets", false); + PROCESS_SWITCH_FULL(RhoEstimatorTask, processSelectionObjects, processSelectingFullJets, "process full jets", false); + PROCESS_SWITCH_FULL(RhoEstimatorTask, processSelectionObjects, processSelectingClusters, "process EMCal clusters", false); + PROCESS_SWITCH_FULL(RhoEstimatorTask, processSelectionObjects, processSelectingTracks, "process high pt tracks", false); void processChargedCollisions(aod::JetCollision const& collision, soa::Filtered const& tracks) { - if (skipMBGapEvents && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits) || collision.centrality() < config.centralityMin || collision.centrality() >= config.centralityMax || collision.trackOccupancyInTimeRange() > config.trackOccupancyInTimeRangeMax || std::abs(collision.posZ()) > config.vertexZCut) { + rhoChargedTable(0.0, 0.0); + return; + } + if (collisionFlag.size() != 0 && !collisionFlag[collision.globalIndex()]) { + rhoChargedTable(0.0, 0.0); + return; + } + if (config.skipMBGapEvents && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { rhoChargedTable(-1., -1.); return; } inputParticles.clear(); - jetfindingutilities::analyseTracks, soa::Filtered::iterator>(inputParticles, tracks, trackSelection, trackingEfficiency); - auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, doSparse); + jetfindingutilities::analyseTracks, soa::Filtered::iterator>(inputParticles, tracks, trackSelection, config.trackingEfficiency); + auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, config.doSparse); rhoChargedTable(rho, rhoM); } PROCESS_SWITCH(RhoEstimatorTask, processChargedCollisions, "Fill rho tables for collisions using charged tracks", true); void processChargedMcCollisions(aod::JetMcCollision const& mcCollision, soa::Filtered const& particles) { - if (skipMBGapEvents && mcCollision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { - rhoChargedTable(-1., -1.); + if (config.skipMBGapEvents && mcCollision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + rhoChargedMcTable(-1., -1.); return; } inputParticles.clear(); jetfindingutilities::analyseParticles, soa::Filtered::iterator>(inputParticles, particleSelection, 1, particles, pdgDatabase); - auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, doSparse); + auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, config.doSparse); rhoChargedMcTable(rho, rhoM); } PROCESS_SWITCH(RhoEstimatorTask, processChargedMcCollisions, "Fill rho tables for MC collisions using charged tracks", false); - void processD0Collisions(aod::JetCollision const&, soa::Filtered const& tracks, aod::CandidatesD0Data const& candidates) + void processD0Collisions(aod::JetCollision const& collision, soa::Filtered const& tracks, aod::CandidatesD0Data const& candidates) { - inputParticles.clear(); for (auto& candidate : candidates) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits) || collision.centrality() < config.centralityMin || collision.centrality() >= config.centralityMax || collision.trackOccupancyInTimeRange() > config.trackOccupancyInTimeRangeMax || std::abs(collision.posZ()) > config.vertexZCut) { + rhoD0Table(0.0, 0.0); + continue; + } inputParticles.clear(); - jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, trackingEfficiency, std::optional{candidate}); + jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, config.trackingEfficiency, std::optional{candidate}); - auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, doSparse); + auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, config.doSparse); rhoD0Table(rho, rhoM); } } @@ -131,25 +240,27 @@ struct RhoEstimatorTask { void processD0McCollisions(aod::JetMcCollision const&, soa::Filtered const& particles, aod::CandidatesD0MCP const& candidates) { - inputParticles.clear(); for (auto& candidate : candidates) { inputParticles.clear(); jetfindingutilities::analyseParticles(inputParticles, particleSelection, 1, particles, pdgDatabase, std::optional{candidate}); - auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, doSparse); + auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, config.doSparse); rhoD0McTable(rho, rhoM); } } PROCESS_SWITCH(RhoEstimatorTask, processD0McCollisions, "Fill rho tables for collisions with D0 MCP candidates", false); - void processDplusCollisions(aod::JetCollision const&, soa::Filtered const& tracks, aod::CandidatesDplusData const& candidates) + void processDplusCollisions(aod::JetCollision const& collision, soa::Filtered const& tracks, aod::CandidatesDplusData const& candidates) { - inputParticles.clear(); for (auto& candidate : candidates) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits) || collision.centrality() < config.centralityMin || collision.centrality() >= config.centralityMax || collision.trackOccupancyInTimeRange() > config.trackOccupancyInTimeRangeMax || std::abs(collision.posZ()) > config.vertexZCut) { + rhoDplusTable(0.0, 0.0); + continue; + } inputParticles.clear(); - jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, trackingEfficiency, std::optional{candidate}); + jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, config.trackingEfficiency, std::optional{candidate}); - auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, doSparse); + auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, config.doSparse); rhoDplusTable(rho, rhoM); } } @@ -157,25 +268,27 @@ struct RhoEstimatorTask { void processDplusMcCollisions(aod::JetMcCollision const&, soa::Filtered const& particles, aod::CandidatesDplusMCP const& candidates) { - inputParticles.clear(); for (auto& candidate : candidates) { inputParticles.clear(); jetfindingutilities::analyseParticles(inputParticles, particleSelection, 1, particles, pdgDatabase, std::optional{candidate}); - auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, doSparse); + auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, config.doSparse); rhoDplusMcTable(rho, rhoM); } } PROCESS_SWITCH(RhoEstimatorTask, processDplusMcCollisions, "Fill rho tables for collisions with Dplus MCP candidates", false); - void processLcCollisions(aod::JetCollision const&, soa::Filtered const& tracks, aod::CandidatesLcData const& candidates) + void processLcCollisions(aod::JetCollision const& collision, soa::Filtered const& tracks, aod::CandidatesLcData const& candidates) { - inputParticles.clear(); for (auto& candidate : candidates) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits) || collision.centrality() < config.centralityMin || collision.centrality() >= config.centralityMax || collision.trackOccupancyInTimeRange() > config.trackOccupancyInTimeRangeMax || std::abs(collision.posZ()) > config.vertexZCut) { + rhoLcTable(0.0, 0.0); + continue; + } inputParticles.clear(); - jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, trackingEfficiency, std::optional{candidate}); + jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, config.trackingEfficiency, std::optional{candidate}); - auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, doSparse); + auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, config.doSparse); rhoLcTable(rho, rhoM); } } @@ -183,64 +296,67 @@ struct RhoEstimatorTask { void processLcMcCollisions(aod::JetMcCollision const&, soa::Filtered const& particles, aod::CandidatesLcMCP const& candidates) { - inputParticles.clear(); for (auto& candidate : candidates) { inputParticles.clear(); jetfindingutilities::analyseParticles(inputParticles, particleSelection, 1, particles, pdgDatabase, std::optional{candidate}); - auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, doSparse); + auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, config.doSparse); rhoLcMcTable(rho, rhoM); } } PROCESS_SWITCH(RhoEstimatorTask, processLcMcCollisions, "Fill rho tables for collisions with Lc MCP candidates", false); - void processBplusCollisions(aod::JetCollision const&, soa::Filtered const& tracks, aod::CandidatesBplusData const& candidates) - { + void processBplusCollisions(aod::JetCollision const& collision, soa::Filtered const& tracks, aod::CandidatesBplusData const& candidates) + { + for (auto& candidate : candidates) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits) || collision.centrality() < config.centralityMin || collision.centrality() >= config.centralityMax || collision.trackOccupancyInTimeRange() > config.trackOccupancyInTimeRangeMax || std::abs(collision.posZ()) > config.vertexZCut) { + rhoBplusTable(0.0, 0.0); + continue; + } inputParticles.clear(); - for (auto& candidate : candidates) { - inputParticles.clear(); - jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, trackingEfficiency, std::optional{candidate}); + jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, config.trackingEfficiency, std::optional{candidate}); - auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, doSparse); - rhoBplusTable(rho, rhoM); - } + auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, config.doSparse); + rhoBplusTable(rho, rhoM); } + } PROCESS_SWITCH(RhoEstimatorTask, processBplusCollisions, "Fill rho tables for collisions with Bplus candidates", false); void processBplusMcCollisions(aod::JetMcCollision const&, soa::Filtered const& particles, aod::CandidatesBplusMCP const& candidates) { - inputParticles.clear(); for (auto& candidate : candidates) { inputParticles.clear(); jetfindingutilities::analyseParticles(inputParticles, particleSelection, 1, particles, pdgDatabase, std::optional{candidate}); - auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, doSparse); + auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, config.doSparse); rhoBplusMcTable(rho, rhoM); } } PROCESS_SWITCH(RhoEstimatorTask, processBplusMcCollisions, "Fill rho tables for collisions with Bplus MCP candidates", false); - void processDielectronCollisions(aod::JetCollision const&, soa::Filtered const& tracks, aod::CandidatesDielectronData const& candidates) - { - inputParticles.clear(); - for (auto& candidate : candidates) { - inputParticles.clear(); - jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, trackingEfficiency, std::optional{candidate}); + void processDielectronCollisions(aod::JetCollision const& collision, soa::Filtered const& tracks, aod::CandidatesDielectronData const& candidates) + { + for (auto& candidate : candidates) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits) || collision.centrality() < config.centralityMin || collision.centrality() >= config.centralityMax || collision.trackOccupancyInTimeRange() > config.trackOccupancyInTimeRangeMax || std::abs(collision.posZ()) > config.vertexZCut) { + rhoDielectronTable(0.0, 0.0); + continue; + } + inputParticles.clear(); + jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, config.trackingEfficiency, std::optional{candidate}); - auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, doSparse); - rhoDielectronTable(rho, rhoM); + auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, config.doSparse); + rhoDielectronTable(rho, rhoM); + } } - } PROCESS_SWITCH(RhoEstimatorTask, processDielectronCollisions, "Fill rho tables for collisions with Dielectron candidates", false); void processDielectronMcCollisions(aod::JetMcCollision const&, soa::Filtered const& particles, aod::CandidatesDielectronMCP const& candidates) { - inputParticles.clear(); for (auto& candidate : candidates) { inputParticles.clear(); jetfindingutilities::analyseParticles(inputParticles, particleSelection, 1, particles, pdgDatabase, std::optional{candidate}); - auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, doSparse); + auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, config.doSparse); rhoDielectronMcTable(rho, rhoM); } } diff --git a/PWGJE/Tasks/jetSubstructure.cxx b/PWGJE/Tasks/jetSubstructure.cxx index 74ae9314b77..f2aae92180a 100644 --- a/PWGJE/Tasks/jetSubstructure.cxx +++ b/PWGJE/Tasks/jetSubstructure.cxx @@ -243,11 +243,15 @@ struct JetSubstructureTask { float deltaEta = jet.eta() - track.eta(); if (TMath::Sqrt((deltaPhi1 * deltaPhi1) + (deltaEta * deltaEta)) <= jet.r() / 100.0) { - tracksPerpCone1Vec.push_back(track); + if (track.pt() >= pairConstituentPtMin) { + tracksPerpCone1Vec.push_back(track); + } perpCone1Pt += track.pt(); } if (TMath::Sqrt((deltaPhi2 * deltaPhi2) + (deltaEta * deltaEta)) <= jet.r() / 100.0) { - tracksPerpCone2Vec.push_back(track); + if (track.pt() >= pairConstituentPtMin) { + tracksPerpCone2Vec.push_back(track); + } perpCone2Pt += track.pt(); } } diff --git a/PWGJE/Tasks/jetSubstructureHF.cxx b/PWGJE/Tasks/jetSubstructureHF.cxx index edcf381e335..ef217af2600 100644 --- a/PWGJE/Tasks/jetSubstructureHF.cxx +++ b/PWGJE/Tasks/jetSubstructureHF.cxx @@ -317,11 +317,15 @@ struct JetSubstructureHFTask { float deltaEta = jet.eta() - track.eta(); if (TMath::Sqrt((deltaPhi1 * deltaPhi1) + (deltaEta * deltaEta)) <= jet.r() / 100.0) { - tracksPerpCone1Vec.push_back(track); + if (track.pt() >= pairConstituentPtMin) { + tracksPerpCone1Vec.push_back(track); + } perpCone1Pt += track.pt(); } if (TMath::Sqrt((deltaPhi2 * deltaPhi2) + (deltaEta * deltaEta)) <= jet.r() / 100.0) { - tracksPerpCone2Vec.push_back(track); + if (track.pt() >= pairConstituentPtMin) { + tracksPerpCone2Vec.push_back(track); + } perpCone2Pt += track.pt(); } } From 98a473b68e7c570e31f994bd368e3414b8851203 Mon Sep 17 00:00:00 2001 From: sawan <124118453+sawankumawat@users.noreply.github.com> Date: Sun, 2 Mar 2025 23:09:15 +0530 Subject: [PATCH 0504/1650] [PWGLF] Corrected the angular cut condition (#10279) --- PWGLF/Tasks/Resonances/higherMassResonances.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Resonances/higherMassResonances.cxx b/PWGLF/Tasks/Resonances/higherMassResonances.cxx index 4112e41ff2e..65039924462 100644 --- a/PWGLF/Tasks/Resonances/higherMassResonances.cxx +++ b/PWGLF/Tasks/Resonances/higherMassResonances.cxx @@ -544,7 +544,7 @@ struct HigherMassResonances { double angle = std::sqrt(std::pow(eta1 - eta2, 2) + std::pow(phi1 - phi2, 2)); rKzeroShort.fill(HIST("angularSeparation"), angle); - if (config.applyAngSepCut && angle < config.angSepCut) { + if (config.applyAngSepCut && angle > config.angSepCut) { return false; } return true; From 7d0ebb0e4d333f22a372e02a406add87d1831608 Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Mon, 3 Mar 2025 02:29:48 +0800 Subject: [PATCH 0505/1650] [PWGCF] cross check v2 and efficiency (#10276) --- PWGCF/Flow/Tasks/flowMc.cxx | 242 +++++++++++++++++--------- PWGCF/Flow/Tasks/flowPtEfficiency.cxx | 12 +- 2 files changed, 173 insertions(+), 81 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowMc.cxx b/PWGCF/Flow/Tasks/flowMc.cxx index 1fa0744e479..cbc205b9ff3 100644 --- a/PWGCF/Flow/Tasks/flowMc.cxx +++ b/PWGCF/Flow/Tasks/flowMc.cxx @@ -15,6 +15,7 @@ /// \brief QC of synthetic flow exercise #include +#include #include #include "Framework/AnalysisDataModel.h" #include "Framework/AnalysisTask.h" @@ -23,6 +24,7 @@ #include "Framework/ASoAHelpers.h" #include "Framework/RunningWorkflowInfo.h" #include "Common/DataModel/TrackSelectionTables.h" +#include "Common/Core/RecoDecay.h" #include "Common/Core/TrackSelection.h" #include "Common/Core/TrackSelectionDefaults.h" #include "Common/Core/trackUtilities.h" @@ -35,6 +37,9 @@ #include "GFW.h" #include "GFWCumulant.h" #include "GFWWeights.h" +#include "FlowContainer.h" +#include +#include #include using namespace o2; @@ -51,15 +56,25 @@ struct FlowMc { O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeights, bool, false, "Fill and output NUA weights") O2_DEFINE_CONFIGURABLE(cfgCutPtRefMin, float, 0.2f, "Minimal pT for ref tracks") O2_DEFINE_CONFIGURABLE(cfgCutPtRefMax, float, 3.0f, "Maximal pT for ref tracks") + O2_DEFINE_CONFIGURABLE(cfgCutPtPOIMin, float, 0.2f, "Minimal pT for poi tracks") + O2_DEFINE_CONFIGURABLE(cfgCutPtPOIMax, float, 10.0f, "Maximal pT for poi tracks") O2_DEFINE_CONFIGURABLE(cfgFlowAcceptance, std::string, "", "CCDB path to acceptance object") O2_DEFINE_CONFIGURABLE(cfgFlowEfficiency, std::string, "", "CCDB path to efficiency object") + O2_DEFINE_CONFIGURABLE(cfgCentVsIPTruth, std::string, "", "CCDB path to centrality vs IP truth") + O2_DEFINE_CONFIGURABLE(cfgFlowCumulantEnabled, bool, false, "switch of calculating flow") + O2_DEFINE_CONFIGURABLE(cfgFlowCumulantNbootstrap, int, 30, "Number of subsamples") ConfigurableAxis axisB{"axisB", {100, 0.0f, 20.0f}, ""}; + ConfigurableAxis axisCentrality{"axisCentrality", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90}, "X axis for histograms"}; ConfigurableAxis axisPhi{"axisPhi", {100, 0.0f, constants::math::TwoPI}, ""}; ConfigurableAxis axisNch{"axisNch", {300, 0.0f, 3000.0f}, "Nch in |eta|<0.8"}; ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.2f, 2.4f, 2.6f, 2.8f, 3.0f, 3.2f, 3.4f, 3.6f, 3.8f, 4.0f, 4.4f, 4.8f, 5.2f, 5.6f, 6.0f, 6.5f, 7.0f, 7.5f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f}, "pt axis"}; + // Cent vs IP + TH1D* mCentVsIPTruth = nullptr; + bool centVsIPTruthLoaded = false; + // Corrections TH1D* mEfficiency = nullptr; GFWWeights* mAcceptance = nullptr; @@ -71,6 +86,14 @@ struct FlowMc { Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; OutputObj fWeights{GFWWeights("weights")}; + OutputObj fFCTrue{FlowContainer("FlowContainerTrue")}; + OutputObj fFCReco{FlowContainer("FlowContainerReco")}; + GFW* fGFWTrue = new GFW(); + GFW* fGFWReco = new GFW(); + TAxis* fPtAxis; + std::vector corrconfigsTruth; + std::vector corrconfigsReco; + TRandom3* fRndm = new TRandom3(0); void init(InitContext&) { @@ -103,15 +126,61 @@ struct FlowMc { histos.add("hEPVsPhi", "hEPVsPhi;Event Plane Angle; #varphi", HistType::kTH2D, {axisPhi, axisPhi}); histos.add("hPtNchGenerated", "Reco production; pT (GeV/c); multiplicity", HistType::kTH2D, {axisPt, axisNch}); histos.add("hPtNchGlobal", "Global production; pT (GeV/c); multiplicity", HistType::kTH2D, {axisPt, axisNch}); + histos.add("hPtMCGen", "Monte Carlo Truth; pT (GeV/c);", {HistType::kTH1D, {axisPt}}); + histos.add("hPtMCGlobal", "Monte Carlo Global; pT (GeV/c);", {HistType::kTH1D, {axisPt}}); - if (cfgOutputNUAWeights) { - o2::framework::AxisSpec axis = axisPt; - int nPtBins = axis.binEdges.size() - 1; - double* ptBins = &(axis.binEdges)[0]; + o2::framework::AxisSpec axis = axisPt; + int nPtBins = axis.binEdges.size() - 1; + double* ptBins = &(axis.binEdges)[0]; + fPtAxis = new TAxis(nPtBins, ptBins); + if (cfgOutputNUAWeights) { fWeights->setPtBins(nPtBins, ptBins); fWeights->init(true, false); } + + if (cfgFlowCumulantEnabled) { + TObjArray* oba = new TObjArray(); + oba->Add(new TNamed("ChFull22", "ChFull22")); + for (auto i = 0; i < fPtAxis->GetNbins(); i++) + oba->Add(new TNamed(Form("ChFull22_pt_%i", i + 1), "ChFull22_pTDiff")); + oba->Add(new TNamed("Ch10Gap22", "Ch10Gap22")); + for (auto i = 0; i < fPtAxis->GetNbins(); i++) + oba->Add(new TNamed(Form("Ch10Gap22_pt_%i", i + 1), "Ch10Gap22_pTDiff")); + fFCTrue->SetName("FlowContainerTrue"); + fFCTrue->SetXAxis(fPtAxis); + fFCTrue->Initialize(oba, axisCentrality, cfgFlowCumulantNbootstrap); + fFCReco->SetName("FlowContainerReco"); + fFCReco->SetXAxis(fPtAxis); + fFCReco->Initialize(oba, axisCentrality, cfgFlowCumulantNbootstrap); + delete oba; + + fGFWTrue->AddRegion("full", -0.8, 0.8, 1, 1); + fGFWTrue->AddRegion("refN10", -0.8, -0.5, 1, 1); + fGFWTrue->AddRegion("refP10", 0.5, 0.8, 1, 1); + fGFWTrue->AddRegion("poiN10", -0.8, -0.5, 1 + fPtAxis->GetNbins(), 2); + fGFWTrue->AddRegion("poifull", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 2); + fGFWTrue->AddRegion("olN10", -0.8, -0.5, 1 + fPtAxis->GetNbins(), 4); + fGFWTrue->AddRegion("olfull", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 4); + corrconfigsTruth.push_back(fGFWTrue->GetCorrelatorConfig("full {2 -2}", "ChFull22", kFALSE)); + corrconfigsTruth.push_back(fGFWTrue->GetCorrelatorConfig("poifull full | olfull {2 -2}", "ChFull22", kTRUE)); + corrconfigsTruth.push_back(fGFWTrue->GetCorrelatorConfig("refN10 {2} refP10 {-2}", "Ch10Gap22", kFALSE)); + corrconfigsTruth.push_back(fGFWTrue->GetCorrelatorConfig("poiN10 refN10 | olN10 {2} refP10 {-2}", "Ch10Gap22", kTRUE)); + fGFWTrue->CreateRegions(); + + fGFWReco->AddRegion("full", -0.8, 0.8, 1, 1); + fGFWReco->AddRegion("refN10", -0.8, -0.5, 1, 1); + fGFWReco->AddRegion("refP10", 0.5, 0.8, 1, 1); + fGFWReco->AddRegion("poiN10", -0.8, -0.5, 1 + fPtAxis->GetNbins(), 2); + fGFWReco->AddRegion("poifull", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 2); + fGFWReco->AddRegion("olN10", -0.8, -0.5, 1 + fPtAxis->GetNbins(), 4); + fGFWReco->AddRegion("olfull", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 4); + corrconfigsReco.push_back(fGFWReco->GetCorrelatorConfig("full {2 -2}", "ChFull22", kFALSE)); + corrconfigsReco.push_back(fGFWReco->GetCorrelatorConfig("poifull full | olfull {2 -2}", "ChFull22", kTRUE)); + corrconfigsReco.push_back(fGFWReco->GetCorrelatorConfig("refN10 {2} refP10 {-2}", "Ch10Gap22", kFALSE)); + corrconfigsReco.push_back(fGFWReco->GetCorrelatorConfig("poiN10 refN10 | olN10 {2} refP10 {-2}", "Ch10Gap22", kTRUE)); + fGFWReco->CreateRegions(); + } } void loadCorrections(uint64_t timestamp) @@ -152,6 +221,54 @@ struct FlowMc { return true; } + void fillFC(GFW* fGFW, bool isMCTruth, const GFW::CorrConfig& corrconf, const double& cent, const double& rndm) + { + double dnx, val; + dnx = fGFW->Calculate(corrconf, 0, kTRUE).real(); + if (!corrconf.pTDif) { + if (dnx == 0) + return; + val = fGFW->Calculate(corrconf, 0, kFALSE).real() / dnx; + if (std::fabs(val) < 1) { + if (isMCTruth) + fFCTrue->FillProfile(corrconf.Head.c_str(), cent, val, dnx, rndm); + else + fFCReco->FillProfile(corrconf.Head.c_str(), cent, val, dnx, rndm); + } + return; + } + for (auto i = 1; i <= fPtAxis->GetNbins(); i++) { + dnx = fGFW->Calculate(corrconf, i - 1, kTRUE).real(); + if (dnx == 0) + continue; + val = fGFW->Calculate(corrconf, i - 1, kFALSE).real() / dnx; + if (std::fabs(val) < 1) { + if (isMCTruth) + fFCTrue->FillProfile(Form("%s_pt_%i", corrconf.Head.c_str(), i), cent, val, dnx, rndm); + else + fFCReco->FillProfile(Form("%s_pt_%i", corrconf.Head.c_str(), i), cent, val, dnx, rndm); + } + } + return; + } + + void loadCentVsIPTruth(uint64_t timestamp) + { + if (centVsIPTruthLoaded) + return; + if (cfgCentVsIPTruth.value.empty() == false) { + mCentVsIPTruth = ccdb->getForTimeStamp(cfgCentVsIPTruth, timestamp); + if (mCentVsIPTruth) + LOGF(info, "Loaded CentVsIPTruth weights from %s (%p)", cfgCentVsIPTruth.value.c_str(), (void*)mCentVsIPTruth); + else + LOGF(fatal, "Failed to load CentVsIPTruth weights from %s", cfgCentVsIPTruth.value.c_str()); + + centVsIPTruthLoaded = true; + } else { + LOGF(fatal, "when calculate flow, Cent Vs IP distribution must be provided"); + } + } + using RecoTracks = soa::Join; void process(aod::McCollision const& mcCollision, aod::BCsWithTimestamps const&, soa::Join const& mcParticles, RecoTracks const&) @@ -160,11 +277,12 @@ struct FlowMc { float imp = mcCollision.impactParameter(); float evPhi = mcCollision.eventPlaneAngle(); float vtxz = mcCollision.posZ(); - if (evPhi < 0) - evPhi += constants::math::TwoPI; + evPhi = RecoDecay::constrainAngle(evPhi); int64_t nCh = 0; int64_t nChGlobal = 0; + float centrality = 0; + float lRandom = fRndm->Rndm(); float weff = 1.; float wacc = 1.; auto bc = mcCollision.bc_as(); @@ -174,6 +292,12 @@ struct FlowMc { // event within range histos.fill(HIST("hImpactParameter"), imp); histos.fill(HIST("hEventPlaneAngle"), evPhi); + if (cfgFlowCumulantEnabled) { + loadCentVsIPTruth(bc.timestamp()); + centrality = mCentVsIPTruth->GetBinContent(mCentVsIPTruth->GetXaxis()->FindBin(imp)); + fGFWTrue->Clear(); + fGFWReco->Clear(); + } for (auto const& mcParticle : mcParticles) { int pdgCode = std::abs(mcParticle.pdgCode()); @@ -204,13 +328,11 @@ struct FlowMc { continue; float deltaPhi = mcParticle.phi() - mcCollision.eventPlaneAngle(); - if (deltaPhi < 0) - deltaPhi += constants::math::TwoPI; - if (deltaPhi > constants::math::TwoPI) - deltaPhi -= constants::math::TwoPI; + deltaPhi = RecoDecay::constrainAngle(deltaPhi); histos.fill(HIST("hPtVsPhiGenerated"), deltaPhi, mcParticle.pt()); histos.fill(HIST("hBVsPtVsPhiGenerated"), imp, deltaPhi, mcParticle.pt()); histos.fill(HIST("hPtNchGenerated"), mcParticle.pt(), nChGlobal); + histos.fill(HIST("hPtMCGen"), mcParticle.pt()); nCh++; @@ -241,10 +363,30 @@ struct FlowMc { } bool withinPtRef = (cfgCutPtRefMin < mcParticle.pt()) && (mcParticle.pt() < cfgCutPtRefMax); // within RF pT range + bool withinPtPOI = (cfgCutPtPOIMin < mcParticle.pt()) && (mcParticle.pt() < cfgCutPtPOIMax); // within POI pT range if (cfgOutputNUAWeights && withinPtRef) fWeights->fill(mcParticle.phi(), mcParticle.eta(), vtxz, mcParticle.pt(), 0, 0); if (!setCurrentParticleWeights(weff, wacc, mcParticle.phi(), mcParticle.eta(), mcParticle.pt(), vtxz)) continue; + + if (cfgFlowCumulantEnabled) { + if (withinPtRef) + fGFWTrue->Fill(mcParticle.eta(), fPtAxis->FindBin(mcParticle.pt()) - 1, mcParticle.phi(), wacc * weff, 1); + if (withinPtPOI) + fGFWTrue->Fill(mcParticle.eta(), fPtAxis->FindBin(mcParticle.pt()) - 1, mcParticle.phi(), wacc * weff, 2); + if (withinPtPOI && withinPtRef) + fGFWTrue->Fill(mcParticle.eta(), fPtAxis->FindBin(mcParticle.pt()) - 1, mcParticle.phi(), wacc * weff, 4); + + if (validGlobal) { + if (withinPtRef) + fGFWReco->Fill(mcParticle.eta(), fPtAxis->FindBin(mcParticle.pt()) - 1, mcParticle.phi(), wacc * weff, 1); + if (withinPtPOI) + fGFWReco->Fill(mcParticle.eta(), fPtAxis->FindBin(mcParticle.pt()) - 1, mcParticle.phi(), wacc * weff, 2); + if (withinPtPOI && withinPtRef) + fGFWReco->Fill(mcParticle.eta(), fPtAxis->FindBin(mcParticle.pt()) - 1, mcParticle.phi(), wacc * weff, 4); + } + } + if (withinPtRef) { histos.fill(HIST("hEPVsPhiMC"), evPhi, mcParticle.phi()); } @@ -260,6 +402,7 @@ struct FlowMc { histos.fill(HIST("hPtVsPhiGlobal"), deltaPhi, mcParticle.pt(), wacc * weff); histos.fill(HIST("hBVsPtVsPhiGlobal"), imp, deltaPhi, mcParticle.pt(), wacc * weff); histos.fill(HIST("hPtNchGlobal"), mcParticle.pt(), nChGlobal); + histos.fill(HIST("hPtMCGlobal"), mcParticle.pt()); } // if any track present, fill if (validTrack) @@ -271,79 +414,18 @@ struct FlowMc { if (validITSABTrack) histos.fill(HIST("hBVsPtVsPhiITSABTrack"), imp, deltaPhi, mcParticle.pt(), wacc * weff); } - } - histos.fill(HIST("hNchVsImpactParameter"), imp, nCh); - } - - using LabeledCascades = soa::Join; - - void processCascade(aod::McParticle const& mcParticle, soa::SmallGroups const& cascades, RecoTracks const&, aod::McCollisions const&) - { - auto mcCollision = mcParticle.mcCollision(); - float imp = mcCollision.impactParameter(); - - int pdgCode = std::abs(mcParticle.pdgCode()); - if (pdgCode != PDG_t::kXiMinus && pdgCode != PDG_t::kOmegaMinus) - return; - - if (!mcParticle.isPhysicalPrimary()) - return; - if (std::fabs(mcParticle.eta()) > 0.8) - return; - - float deltaPhi = mcParticle.phi() - mcCollision.eventPlaneAngle(); - if (deltaPhi < 0) - deltaPhi += constants::math::TwoPI; - if (deltaPhi > constants::math::TwoPI) - deltaPhi -= constants::math::TwoPI; - if (pdgCode == PDG_t::kXiMinus) - histos.fill(HIST("hBVsPtVsPhiGeneratedXi"), imp, deltaPhi, mcParticle.pt()); - if (pdgCode == PDG_t::kOmegaMinus) - histos.fill(HIST("hBVsPtVsPhiGeneratedOmega"), imp, deltaPhi, mcParticle.pt()); - - if (cascades.size() > 0) { - if (pdgCode == PDG_t::kXiMinus) - histos.fill(HIST("hBVsPtVsPhiGlobalXi"), imp, deltaPhi, mcParticle.pt()); - if (pdgCode == PDG_t::kOmegaMinus) - histos.fill(HIST("hBVsPtVsPhiGlobalOmega"), imp, deltaPhi, mcParticle.pt()); - } - } - PROCESS_SWITCH(FlowMc, processCascade, "Process cascades", true); - using LabeledV0s = soa::Join; - - void processV0s(aod::McParticle const& mcParticle, soa::SmallGroups const& v0s, RecoTracks const&, aod::McCollisions const&) - { - auto mcCollision = mcParticle.mcCollision(); - float imp = mcCollision.impactParameter(); - - int pdgCode = std::abs(mcParticle.pdgCode()); - if (pdgCode != PDG_t::kK0Short && pdgCode != PDG_t::kLambda0) - return; - - if (!mcParticle.isPhysicalPrimary()) - return; - if (std::fabs(mcParticle.eta()) > 0.8) - return; - - float deltaPhi = mcParticle.phi() - mcCollision.eventPlaneAngle(); - if (deltaPhi < 0) - deltaPhi += constants::math::TwoPI; - if (deltaPhi > constants::math::TwoPI) - deltaPhi -= constants::math::TwoPI; - if (pdgCode == PDG_t::kK0Short) - histos.fill(HIST("hBVsPtVsPhiGeneratedK0Short"), imp, deltaPhi, mcParticle.pt()); - if (pdgCode == PDG_t::kLambda0) - histos.fill(HIST("hBVsPtVsPhiGeneratedLambda"), imp, deltaPhi, mcParticle.pt()); - - if (v0s.size() > 0) { - if (pdgCode == PDG_t::kK0Short) - histos.fill(HIST("hBVsPtVsPhiGlobalK0Short"), imp, deltaPhi, mcParticle.pt()); - if (pdgCode == PDG_t::kLambda0) - histos.fill(HIST("hBVsPtVsPhiGlobalLambda"), imp, deltaPhi, mcParticle.pt()); + if (cfgFlowCumulantEnabled) { + for (uint l_ind = 0; l_ind < corrconfigsTruth.size(); l_ind++) { + fillFC(fGFWTrue, true, corrconfigsTruth.at(l_ind), centrality, lRandom); + } + for (uint l_ind = 0; l_ind < corrconfigsReco.size(); l_ind++) { + fillFC(fGFWReco, false, corrconfigsReco.at(l_ind), centrality, lRandom); + } + } } + histos.fill(HIST("hNchVsImpactParameter"), imp, nCh); } - PROCESS_SWITCH(FlowMc, processV0s, "Process V0s", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) diff --git a/PWGCF/Flow/Tasks/flowPtEfficiency.cxx b/PWGCF/Flow/Tasks/flowPtEfficiency.cxx index 267caecfc07..0e272eb78a1 100644 --- a/PWGCF/Flow/Tasks/flowPtEfficiency.cxx +++ b/PWGCF/Flow/Tasks/flowPtEfficiency.cxx @@ -23,6 +23,7 @@ #include "Framework/RunningWorkflowInfo.h" #include "Framework/HistogramRegistry.h" +#include "Common/Core/RecoDecay.h" #include "Common/DataModel/EventSelection.h" #include "Common/Core/TrackSelection.h" #include "Common/Core/TrackSelectionDefaults.h" @@ -149,11 +150,13 @@ struct FlowPtEfficiency { registry.add("eventCounter", "eventCounter", kTH1F, {axisCounter}); registry.add("hPtMCRec", "Monte Carlo Reco", {HistType::kTH1D, {axisPt}}); registry.add("hPtNchMCRec", "Reco production; pT (GeV/c); multiplicity", {HistType::kTH2D, {axisPt, axisNch}}); + registry.add("hBVsPtVsPhiRec", "hBVsPtVsPhiRec", HistType::kTH3D, {axisB, axisPhi, axisPt}); registry.add("mcEventCounter", "Monte Carlo Truth EventCounter", kTH1F, {axisCounter}); registry.add("hPtMCGen", "Monte Carlo Truth", {HistType::kTH1D, {axisPt}}); registry.add("hPtNchMCGen", "Truth production; pT (GeV/c); multiplicity", {HistType::kTH2D, {axisPt, axisNch}}); registry.add("numberOfRecoCollisions", "numberOfRecoCollisions", kTH1F, {{10, -0.5f, 9.5f}}); + registry.add("hBVsPtVsPhiTrue", "hBVsPtVsPhiTrue", HistType::kTH3D, {axisB, axisPhi, axisPt}); if (cfgFlowEnabled) { registry.add("hImpactParameterReco", "hImpactParameterReco", {HistType::kTH1D, {axisB}}); @@ -372,8 +375,9 @@ struct FlowPtEfficiency { return; } - float imp; + float imp = 0; bool impFetched = false; + float evPhi = 0; float centrality = 0.; float lRandom = fRndm->Rndm(); float vtxz = collision.posZ(); @@ -396,6 +400,7 @@ struct FlowPtEfficiency { imp = mcCollision.impactParameter(); registry.fill(HIST("hImpactParameterReco"), imp); centrality = mCentVsIPReco->GetBinContent(mCentVsIPReco->GetXaxis()->FindBin(imp)); + evPhi = RecoDecay::constrainAngle(mcCollision.eventPlaneAngle()); impFetched = true; } if (isStable(mcParticle.pdgCode())) { @@ -403,6 +408,8 @@ struct FlowPtEfficiency { registry.fill(HIST("hPtNchMCRec"), track.pt(), tracks.size()); if (cfgFlowEnabled) { + float deltaPhi = RecoDecay::constrainAngle(track.phi() - evPhi); + registry.fill(HIST("hBVsPtVsPhiRec"), imp, deltaPhi, track.pt()); bool withinPtPOI = (cfgFlowCutPtPOIMin < track.pt()) && (track.pt() < cfgFlowCutPtPOIMax); // within POI pT range bool withinPtRef = (cfgFlowCutPtRefMin < track.pt()) && (track.pt() < cfgFlowCutPtRefMax); // within RF pT range if (withinPtRef) @@ -442,6 +449,7 @@ struct FlowPtEfficiency { } float imp = mcCollision.impactParameter(); + float evPhi = RecoDecay::constrainAngle(mcCollision.eventPlaneAngle()); float centrality = 0.; if (cfgFlowEnabled) { registry.fill(HIST("hImpactParameterTruth"), imp); @@ -473,6 +481,8 @@ struct FlowPtEfficiency { registry.fill(HIST("hPtNchMCGen"), mcParticle.pt(), numberOfTracks[0]); if (cfgFlowEnabled) { + float deltaPhi = RecoDecay::constrainAngle(mcParticle.phi() - evPhi); + registry.fill(HIST("hBVsPtVsPhiTrue"), imp, deltaPhi, mcParticle.pt()); bool withinPtPOI = (cfgFlowCutPtPOIMin < mcParticle.pt()) && (mcParticle.pt() < cfgFlowCutPtPOIMax); // within POI pT range bool withinPtRef = (cfgFlowCutPtRefMin < mcParticle.pt()) && (mcParticle.pt() < cfgFlowCutPtRefMax); // within RF pT range if (withinPtRef) { From 97da5e66c08a572019be7d84ed0c471b91144087 Mon Sep 17 00:00:00 2001 From: ilikmeta <152337132+ilikmeta@users.noreply.github.com> Date: Sun, 2 Mar 2025 12:31:23 -0600 Subject: [PATCH 0506/1650] [PWGCF] Fix ITS track selection (#10273) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/flowGfwTask.cxx | 103 +++++++++++++++++++------------ 1 file changed, 62 insertions(+), 41 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowGfwTask.cxx b/PWGCF/Flow/Tasks/flowGfwTask.cxx index 75bdf52e6f4..a7cd60e2653 100644 --- a/PWGCF/Flow/Tasks/flowGfwTask.cxx +++ b/PWGCF/Flow/Tasks/flowGfwTask.cxx @@ -61,6 +61,7 @@ struct FlowGfwTask { O2_DEFINE_CONFIGURABLE(cfgCutChi2prTPCcls, float, 2.5, "Chi2 per TPC clusters") O2_DEFINE_CONFIGURABLE(cfgCutTPCclu, float, 70.0f, "minimum TPC clusters") O2_DEFINE_CONFIGURABLE(cfgCutITSclu, float, 5.0f, "minimum ITS clusters") + O2_DEFINE_CONFIGURABLE(cfgTrackSel, bool, false, "ITS and TPC cluster selection") O2_DEFINE_CONFIGURABLE(cfgMinCentFT0C, float, 0.0f, "Minimum FT0C Centrality") O2_DEFINE_CONFIGURABLE(cfgMaxCentFT0C, float, 100.0f, "Maximum FT0C Centrality") O2_DEFINE_CONFIGURABLE(cfgcentEstFt0c, bool, false, "Centrality estimator based on FT0C signal") @@ -70,6 +71,7 @@ struct FlowGfwTask { O2_DEFINE_CONFIGURABLE(cfgcentEstFt0cVariant1, bool, false, "A variant of FT0C") O2_DEFINE_CONFIGURABLE(cfgUseAdditionalEventCut, bool, false, "Use additional event cut on mult correlations") O2_DEFINE_CONFIGURABLE(cfgUseAdditionalTrackCut, bool, false, "Use additional track cut on phi") + O2_DEFINE_CONFIGURABLE(cfgTrackSelRun3ITSMatch, bool, false, "Track selection for ITS matches") O2_DEFINE_CONFIGURABLE(cfgUseNch, bool, false, "Use Nch for flow observables") O2_DEFINE_CONFIGURABLE(cfgNbootstrap, int, 10, "Number of subsamples") O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeights, bool, false, "Fill and output NUA weights") @@ -80,20 +82,21 @@ struct FlowGfwTask { O2_DEFINE_CONFIGURABLE(cfgCutOccupancyLow, int, 0, "Low cut on TPC occupancy") O2_DEFINE_CONFIGURABLE(cfgCutDCAz, float, 2, "Custom DCA Z cut") O2_DEFINE_CONFIGURABLE(cfgCutDCAxy, float, 0.2f, "Custom DCA XY cut") + O2_DEFINE_CONFIGURABLE(cfgDCAzPt, bool, false, "switch for DCAz pt dependent") O2_DEFINE_CONFIGURABLE(cfgNoTimeFrameBorder, bool, false, "kNoTimeFrameBorder"); O2_DEFINE_CONFIGURABLE(cfgNoITSROFrameBorder, bool, false, "kNoITSROFrameBorder"); O2_DEFINE_CONFIGURABLE(cfgNoSameBunchPileup, bool, false, "kNoSameBunchPileup"); O2_DEFINE_CONFIGURABLE(cfgIsGoodZvtxFT0vsPV, bool, false, "kIsGoodZvtxFT0vsPV"); + O2_DEFINE_CONFIGURABLE(cfgIsVertexITSTPC, bool, false, "kIsVertexITSTPC"); O2_DEFINE_CONFIGURABLE(cfgNoCollInTimeRangeStandard, bool, false, "kNoCollInTimeRangeStandard"); O2_DEFINE_CONFIGURABLE(cfgEvSelkIsGoodITSLayersAll, bool, false, "kIsGoodITSLayersAll") O2_DEFINE_CONFIGURABLE(cfgOccupancy, bool, false, "Bool for event selection on detector occupancy"); O2_DEFINE_CONFIGURABLE(cfgMultCut, bool, false, "Use additional event cut on mult correlations"); + O2_DEFINE_CONFIGURABLE(cfgV0AT0A5Sigma, bool, true, "V0A T0A 5 sigma cut") O2_DEFINE_CONFIGURABLE(cfgGlobalplusITS, bool, false, "Global and ITS tracks") O2_DEFINE_CONFIGURABLE(cfgGlobalonly, bool, false, "Global only tracks") O2_DEFINE_CONFIGURABLE(cfgITSonly, bool, false, "ITS only tracks") O2_DEFINE_CONFIGURABLE(cfgFineBinning, bool, false, "Manually change to fine binning") - O2_DEFINE_CONFIGURABLE(cfgTrackSelRun3ITSMatch, bool, false, "System check: Run3ITSMatch") - O2_DEFINE_CONFIGURABLE(cfgTrackSel, bool, false, "System check: track selection") ConfigurableAxis axisVertex{"axisVertex", {20, -10, 10}, "vertex axis for histograms"}; ConfigurableAxis axisPhi{"axisPhi", {60, 0.0, constants::math::TwoPI}, "phi axis for histograms"}; @@ -184,6 +187,7 @@ struct FlowGfwTask { kNOITSROFRAMEBORDER, kNOPSAMEBUNCHPILEUP, kISGOODZVTXFT0VSPV, + kISVERTEXITSTPC, kNOCOLLINTIMERANGESTANDART, kISGOODITSLAYERSALL, kAFTERMULTCUTS, @@ -240,6 +244,7 @@ struct FlowGfwTask { registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kNOITSROFRAMEBORDER + 1, "kNoITSROFrameBorder"); registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kNOPSAMEBUNCHPILEUP + 1, "kNoSameBunchPileup"); registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kISGOODZVTXFT0VSPV + 1, "kIsGoodZvtxFT0vsPV"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kISVERTEXITSTPC + 1, "kIsVertexITSTPC"); registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kNOCOLLINTIMERANGESTANDART + 1, "kNoCollInTimeRangeStandard"); registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kISGOODITSLAYERSALL + 1, "kIsGoodITSLayersAll"); registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kAFTERMULTCUTS + 1, "After Mult cuts"); @@ -604,49 +609,57 @@ struct FlowGfwTask { } registry.fill(HIST("hEventCount"), kISGOODZVTXFT0VSPV); } - if (cfgNoCollInTimeRangeStandard) { - if (!collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { - // no collisions in specified time range + if (cfgIsVertexITSTPC) { + if (!collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) { + // removes collisions without vertex match between ITS-TPC return false; } - registry.fill(HIST("hEventCount"), kNOCOLLINTIMERANGESTANDART); - } - if (cfgEvSelkIsGoodITSLayersAll) { - if (cfgEvSelkIsGoodITSLayersAll && !collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { - // removes dead staves of ITS - return false; + registry.fill(HIST("hEventCount"), kISVERTEXITSTPC); + if (cfgNoCollInTimeRangeStandard) { + if (!collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + // no collisions in specified time range + return false; + } + registry.fill(HIST("hEventCount"), kNOCOLLINTIMERANGESTANDART); + } + if (cfgEvSelkIsGoodITSLayersAll) { + if (cfgEvSelkIsGoodITSLayersAll && !collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + // removes dead staves of ITS + return false; + } + registry.fill(HIST("hEventCount"), kISGOODITSLAYERSALL); } - registry.fill(HIST("hEventCount"), kISGOODITSLAYERSALL); - } - - float vtxz = -999; - if (collision.numContrib() > 1) { - vtxz = collision.posZ(); - float zRes = std::sqrt(collision.covZZ()); - if (zRes > 0.25 && collision.numContrib() < 20) - vtxz = -999; - } - auto multNTracksPV = collision.multNTracksPV(); + float vtxz = -999; + if (collision.numContrib() > 1) { + vtxz = collision.posZ(); + float zRes = std::sqrt(collision.covZZ()); + if (zRes > 0.25 && collision.numContrib() < 20) + vtxz = -999; + } - if (std::abs(vtxz) > cfgCutVertex) - return false; + auto multNTracksPV = collision.multNTracksPV(); - if (cfgMultCut) { - if (multNTracksPV < fMultPVCutLow->Eval(centrality)) - return false; - if (multNTracksPV > fMultPVCutHigh->Eval(centrality)) - return false; - if (multTrk < fMultCutLow->Eval(centrality)) - return false; - if (multTrk > fMultCutHigh->Eval(centrality)) + if (std::abs(vtxz) > cfgCutVertex) return false; - registry.fill(HIST("hEventCount"), kAFTERMULTCUTS); - } - // V0A T0A 5 sigma cut - if (std::abs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > 5 * fT0AV0ASigma->Eval(collision.multFT0A())) - return false; + if (cfgMultCut) { + if (multNTracksPV < fMultPVCutLow->Eval(centrality)) + return false; + if (multNTracksPV > fMultPVCutHigh->Eval(centrality)) + return false; + if (multTrk < fMultCutLow->Eval(centrality)) + return false; + if (multTrk > fMultCutHigh->Eval(centrality)) + return false; + registry.fill(HIST("hEventCount"), kAFTERMULTCUTS); + } + + // V0A T0A 5 sigma cut + if (cfgV0AT0A5Sigma) + if (std::abs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > 5 * fT0AV0ASigma->Eval(collision.multFT0A())) + return false; + } return true; } @@ -688,11 +701,19 @@ struct FlowGfwTask { template bool trackSelected(TTrack track) { + if (cfgDCAzPt && (std::fabs(track.dcaZ()) > (0.004f + 0.013f / track.pt()))) + return false; if (cfgTrackSel) { return myTrackSel.IsSelected(track); + } else if (cfgGlobalplusITS) { + return ((track.tpcNClsFound() >= cfgCutTPCclu) && (track.itsNCls() >= cfgCutITSclu)); + } else if (cfgGlobalonly) { + return ((track.tpcNClsFound() >= cfgCutTPCclu)); + } else if (cfgITSonly) { + return ((track.itsNCls() >= cfgCutITSclu)); } else { - return (track.tpcNClsFound() >= cfgCutTPCclu); + return false; } } @@ -900,30 +921,30 @@ struct FlowGfwTask { if (cfgGlobalplusITS) { if (withinPtRef) { - fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), wacc * weff, 1); globalTracksNch++; registry.fill(HIST("GlobalplusITS"), centrality, globalTracksNch); + fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), wacc * weff, 1); } } if (track.hasTPC()) { if (cfgGlobalonly) { if (withinPtRef) { - fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), wacc * weff, 1); globalTracksNch++; registry.fill(HIST("Globalonly"), centrality, globalTracksNch); registry.fill(HIST("pt_Cen_GlobalOnly"), centrality, track.pt()); registry.fill(HIST("phi_Cen_GlobalOnly"), centrality, track.phi()); + fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), wacc * weff, 1); } } } else { if (cfgITSonly) { if (withinPtRef) { - fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), wacc * weff, 1); globalTracksNch++; registry.fill(HIST("ITSonly"), centrality, globalTracksNch); registry.fill(HIST("pt_Cen_ITSOnly"), centrality, track.pt()); registry.fill(HIST("phi_Cen_ITSOnly"), centrality, track.phi()); + fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), wacc * weff, 1); } } } From d7def93a0abda44d48d07e01c8ceb75bd87b8706 Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Sun, 2 Mar 2025 21:59:11 +0100 Subject: [PATCH 0507/1650] [PWGLF,PWGCF] jFlucEfficiencyTask - Add normal data mc process (#10281) --- PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx | 273 +++++++++++++++----- PWGLF/Utils/collisionCuts.h | 8 +- 2 files changed, 215 insertions(+), 66 deletions(-) diff --git a/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx b/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx index ba46a4c227a..b1de011c2de 100644 --- a/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx +++ b/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx @@ -18,6 +18,7 @@ #include "Framework/AnalysisTask.h" #include "Framework/HistogramRegistry.h" #include "Framework/runDataProcessing.h" +#include "Framework/O2DatabasePDGPlugin.h" #include "Common/Core/TrackSelection.h" #include "Common/DataModel/Centrality.h" #include "Common/DataModel/EventSelection.h" @@ -25,12 +26,14 @@ #include "Common/DataModel/PIDResponse.h" #include "Common/DataModel/TrackSelectionTables.h" #include "PWGCF/DataModel/CorrelationsDerived.h" +#include "PWGLF/Utils/collisionCuts.h" using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; struct JFlucEfficiencyTask { + Service pdg; // Add the pT binning array as a static member static constexpr std::array PttJacek = { 0.0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, @@ -47,6 +50,24 @@ struct JFlucEfficiencyTask { // Update the axisPt configuration with proper vector initialization ConfigurableAxis axisPt{"axisPt", std::vector(PttJacek.begin(), PttJacek.end()), "pT axis"}; + // Event cuts + Configurable cfgAcceptSplitCollisions{"cfgAcceptSplitCollisions", 0, "0: only look at mcCollisions that are not split; 1: accept split mcCollisions, 2: accept split mcCollisions but only look at the first reco collision associated with it"}; + o2::analysis::CollisonCuts colCuts; + struct : ConfigurableGroup { + Configurable cfgEvtZvtx{"cfgEvtZvtx", 10.f, "Evt sel: Max. z-Vertex (cm)"}; + Configurable cfgEvtOccupancyInTimeRangeMax{"cfgEvtOccupancyInTimeRangeMax", -1, "Evt sel: maximum track occupancy"}; + Configurable cfgEvtOccupancyInTimeRangeMin{"cfgEvtOccupancyInTimeRangeMin", -1, "Evt sel: minimum track occupancy"}; + Configurable cfgEvtTriggerCheck{"cfgEvtTriggerCheck", false, "Evt sel: check for trigger"}; + Configurable cfgEvtOfflineCheck{"cfgEvtOfflineCheck", true, "Evt sel: check for offline selection"}; + Configurable cfgEvtTriggerTVXSel{"cfgEvtTriggerTVXSel", false, "Evt sel: triggerTVX selection (MB)"}; + Configurable cfgEvtTFBorderCut{"cfgEvtTFBorderCut", false, "Evt sel: apply TF border cut"}; + Configurable cfgEvtUseITSTPCvertex{"cfgEvtUseITSTPCvertex", false, "Evt sel: use at lease on ITS-TPC track for vertexing"}; + Configurable cfgEvtZvertexTimedifference{"cfgEvtZvertexTimedifference", true, "Evt sel: apply Z-vertex time difference"}; + Configurable cfgEvtPileupRejection{"cfgEvtPileupRejection", true, "Evt sel: apply pileup rejection"}; + Configurable cfgEvtNoITSROBorderCut{"cfgEvtNoITSROBorderCut", false, "Evt sel: apply NoITSRO border cut"}; + Configurable cfgEvtCollInTimeRangeStandard{"cfgEvtCollInTimeRangeStandard", true, "Evt sel: apply NoCollInTimeRangeStandard"}; + } EventCuts; + // Configurable for track selection Configurable cfgPtMin{"cfgPtMin", 0.2f, "Minimum transverse momentum"}; Configurable cfgPtMax{"cfgPtMax", 300.0f, "Maximum transverse momentum"}; @@ -56,34 +77,34 @@ struct JFlucEfficiencyTask { Configurable cfgCentMin{"cfgCentMin", 0.0f, "Min centrality"}; Configurable cfgCentMax{"cfgCentMax", 100.0f, "Max centrality"}; Configurable cfgTrackBitMask{"cfgTrackBitMask", 0, "BitMask for track selection systematics"}; + Configurable trackSelection{"trackSelection", 0, "Track selection: 0 -> No Cut, 1 -> kGlobalTrack, 2 -> kGlobalTrackWoPtEta, 3 -> kGlobalTrackWoDCA, 4 -> kQualityTracks, 5 -> kInAcceptanceTracks"}; // Configurable axes ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100}, "multiplicity / centrality axis"}; // Filter declarations - Filter cfCollisionFilter = (nabs(aod::collision::posZ) < cfgCutVertex) && - (aod::cfcollision::multiplicity > cfgCentMin) && - (aod::cfcollision::multiplicity < cfgCentMax); - Filter cfMCCollisionFilter = (nabs(aod::mccollision::posZ) < cfgCutVertex) && - (aod::cfmccollision::multiplicity > cfgCentMin) && - (aod::cfmccollision::multiplicity < cfgCentMax); - Filter cfMCParticleFilter = (aod::cfmcparticle::pt >= cfgPtMin) && - (aod::cfmcparticle::pt <= cfgPtMax) && - (aod::cfmcparticle::eta >= cfgEtaMin) && - (aod::cfmcparticle::eta <= cfgEtaMax); + Filter cfCollisionFilter = (nabs(aod::collision::posZ) < cfgCutVertex); Filter cfTrackFilter = (aod::cftrack::pt >= cfgPtMin) && (aod::cftrack::pt <= cfgPtMax) && (aod::cftrack::eta >= cfgEtaMin) && - (aod::cftrack::eta <= cfgEtaMax) && - ((aod::track::trackType & (uint8_t)cfgTrackBitMask) == (uint8_t)cfgTrackBitMask); - - Filter trackFilter = (nabs(aod::track::eta) < cfgEtaMax) && - (aod::track::pt > cfgPtMin) && - ((requireGlobalTrackInFilter()) || - (aod::track::isGlobalTrackSDD == (uint8_t) true)); - - Configurable cfgEfficiencyFromData{"cfgEfficiencyFromData", false, "Calculate efficiency using data events as reference"}; - Configurable cfgVerbosity{"cfgVerbosity", 0, "Verbosity level"}; + (aod::cftrack::eta <= cfgEtaMax); + // Filter collisionFilter = (nabs(aod::collision::posZ) < cfgCutVertex); + // Filter trackFilter = (aod::track::pt >= cfgPtMin) && + // (aod::track::pt <= cfgPtMax) && + // (aod::track::eta >= cfgEtaMin) && + // (aod::track::eta <= cfgEtaMax); + Filter trackSelectionFilter = (trackSelection.node() == 0) || // from tpcSkimsTableCreator + ((trackSelection.node() == 1) && requireGlobalTrackInFilter()) || + ((trackSelection.node() == 2) && requireGlobalTrackWoPtEtaInFilter()) || + ((trackSelection.node() == 3) && requireGlobalTrackWoDCAInFilter()) || + ((trackSelection.node() == 4) && requireQualityTracksInFilter()) || + ((trackSelection.node() == 5) && requireTrackCutInFilter(TrackSelectionFlags::kInAcceptanceTracks)); + + Configurable cfgCentBinsForMC{"cfgCentBinsForMC", 1, "Centrality bins for MC, 0: off, 1: on"}; + using CollisionCandidates = soa::Join; + using TrackCandidates = soa::Join; + using MCCollisionCandidates = soa::Join; + using MCTrackCandidates = soa::Join; // Histogram Registry HistogramRegistry registry{ @@ -103,33 +124,48 @@ struct JFlucEfficiencyTask { LOGF(info, "Initializing JFlucEfficiencyTask"); } - if (doprocessMC) { + colCuts.setCuts(EventCuts.cfgEvtZvtx, EventCuts.cfgEvtTriggerCheck, EventCuts.cfgEvtOfflineCheck, /*checkRun3*/ true, /*triggerTVXsel*/ false, EventCuts.cfgEvtOccupancyInTimeRangeMax, EventCuts.cfgEvtOccupancyInTimeRangeMin); + colCuts.init(®istry); + colCuts.setTriggerTVX(EventCuts.cfgEvtTriggerTVXSel); + colCuts.setApplyTFBorderCut(EventCuts.cfgEvtTFBorderCut); + colCuts.setApplyITSTPCvertex(EventCuts.cfgEvtUseITSTPCvertex); + colCuts.setApplyZvertexTimedifference(EventCuts.cfgEvtZvertexTimedifference); + colCuts.setApplyPileupRejection(EventCuts.cfgEvtPileupRejection); + colCuts.setApplyNoITSROBorderCut(EventCuts.cfgEvtNoITSROBorderCut); + colCuts.setApplyCollInTimeRangeStandard(EventCuts.cfgEvtCollInTimeRangeStandard); + colCuts.printCuts(); + + if (doprocessDerivedMC || doprocessMC) { registry.add("hPtGen", "Generated p_{T} (all);p_{T} (GeV/c);Centrality (%);Counts", o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); registry.add("hEtaGen", "Generated #eta (all);#eta;Centrality (%);Counts", o2::framework::HistType::kTH2F, {AxisSpec(100, -1, 1), AxisSpec(axisMultiplicity)}); registry.add("hPtGenPos", "Generated p_{T} (positive);p_{T} (GeV/c);Centrality (%);Counts", o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); - registry.add("hPtGenNeg", "Generated p_{T} (negative);p_{T} (GeV/c);Centrality (%);Counts", o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); + registry.add("hPtGenParticle", "Generated p_{T} (all);p_{T} (GeV/c);Centrality (%);Counts", + o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); + registry.add("hEtaGenParticle", "Generated #eta (all);#eta;Centrality (%);Counts", + o2::framework::HistType::kTH2F, {AxisSpec(100, -1, 1), AxisSpec(axisMultiplicity)}); + registry.add("hPtGenParticlePos", "Generated p_{T} (positive);p_{T} (GeV/c);Centrality (%);Counts", + o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); + registry.add("hPtGenParticleNeg", "Generated p_{T} (negative);p_{T} (GeV/c);Centrality (%);Counts", + o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); } - if (doprocessData) { + if (doprocessData || doprocessDerivedData) { registry.add("hPtRec", "Reconstructed p_{T} (all);p_{T} (GeV/c);Centrality (%);Counts", o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); - registry.add("hEtaRec", "Reconstructed #eta (all);#eta;Centrality (%);Counts", o2::framework::HistType::kTH2F, {AxisSpec(100, -1, 1), AxisSpec(axisMultiplicity)}); - registry.add("hPtRecPos", "Reconstructed p_{T} (positive);p_{T} (GeV/c);Centrality (%);Counts", o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); - registry.add("hPtRecNeg", "Reconstructed p_{T} (negative);p_{T} (GeV/c);Centrality (%);Counts", o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); } - if (cfgEfficiencyFromData) { + if (doprocessEfficiency) { registry.add("hPtGenData", "Generated p_{T} from data events (all);p_{T} (GeV/c);Centrality (%);Counts", {HistType::kTH2F, {axisPt, axisMultiplicity}}); registry.add("hEtaGenData", "Generated #eta from data events (all);#eta;Centrality (%);Counts", @@ -165,9 +201,30 @@ struct JFlucEfficiencyTask { } } - void processMC(soa::Filtered::iterator const& mcCollision, soa::Filtered const& mcParticles) + template + double getCharge(ParticleType const& particle) { - float centrality = mcCollision.multiplicity(); + auto pdgParticle = pdg->GetParticle(particle.pdgCode()); + if (!pdgParticle) { + return 10.f; + } + return pdgParticle->Charge(); + } + bool isChargedParticle(int code) + { + auto p = pdg->GetParticle(code); + auto charge = 0.; + if (p != nullptr) { + charge = p->Charge(); + } + return std::abs(charge) >= 3.; + } + + void processDerivedMC(soa::Filtered::iterator const& mcCollision, soa::Filtered const& mcParticles) + { + float centrality = mcCollision.multiplicity(); // multiplicity: number of primary particles TODO: apply percentiles + registry.fill(HIST("hEventCounterMC"), 0); + registry.fill(HIST("hZVertexMC"), mcCollision.posZ(), centrality); for (const auto& particle : mcParticles) { if (!particle.isPhysicalPrimary()) { @@ -185,7 +242,7 @@ struct JFlucEfficiencyTask { } } - void processData(soa::Filtered::iterator const& cfCollision, soa::Filtered const& cfTracks) + void processDerivedData(soa::Filtered::iterator const& cfCollision, soa::Filtered const& cfTracks) { float centrality = cfCollision.multiplicity(); @@ -205,18 +262,103 @@ struct JFlucEfficiencyTask { } } - template - void fillQA(const TCollision& /*collision*/, float multiplicity, const TTracks& tracks) + Preslice perCollision = aod::track::collisionId; + void processMC(aod::McCollisions::iterator const& mcCollision, + soa::SmallGroups const& collisions, + MCTrackCandidates const& mcTracks, + aod::McParticles const& mcParticles) + { + registry.fill(HIST("hEventCounterMC"), 0); + if (!(std::abs(mcCollision.posZ()) < cfgCutVertex)) { + return; + } + if (collisions.size() < 1) { + return; + } + if (cfgAcceptSplitCollisions == 0 && collisions.size() > 1) { + return; + } + float centrality = -999; + for (const auto& collision : collisions) { // Anayway only 1 collision per mcCollision will be selected + if (!colCuts.isSelected(collision)) // Default event selection + return; + colCuts.fillQA(collision); + centrality = collision.centFT0C(); + } + registry.fill(HIST("hEventCounterMC"), 1); + registry.fill(HIST("hZVertexMC"), mcCollision.posZ(), centrality); + if (centrality < cfgCentMin || centrality > cfgCentMax) { + return; + } + for (const auto& particle : mcParticles) { + auto charge = getCharge(particle); + if ((!particle.isPhysicalPrimary()) || !isChargedParticle(particle.pdgCode())) { + continue; + } + // pT and eta selections + if (particle.pt() < cfgPtMin || particle.pt() > cfgPtMax || particle.eta() < cfgEtaMin || particle.eta() > cfgEtaMax) { + continue; + } + registry.fill(HIST("hPtGenParticle"), particle.pt(), centrality); + registry.fill(HIST("hEtaGenParticle"), particle.eta(), centrality); + if (charge > 0) { // Positive particles + registry.fill(HIST("hPtGenParticlePos"), particle.pt(), centrality); + } else if (charge < 0) { // Negative particles + registry.fill(HIST("hPtGenParticleNeg"), particle.pt(), centrality); + } + } + // Reconstruct tracks from MC particles + for (const auto& collision : collisions) { + auto tracks = mcTracks.sliceBy(perCollision, collision.globalIndex()); + for (const auto& track : tracks) { + if (!track.has_mcParticle()) { + continue; + } + auto mcPart = track.mcParticle(); + if (!mcPart.isPhysicalPrimary() || !isChargedParticle(mcPart.pdgCode())) { + continue; + } + // pT and eta selections + if (track.pt() < cfgPtMin || track.pt() > cfgPtMax || track.eta() < cfgEtaMin || track.eta() > cfgEtaMax) { + continue; + } + registry.fill(HIST("hPtGen"), track.pt(), centrality); + registry.fill(HIST("hEtaGen"), track.eta(), centrality); + if (track.sign() > 0) { // Positive tracks + registry.fill(HIST("hPtGenPos"), track.pt(), centrality); + } else if (track.sign() < 0) { // Negative tracks + registry.fill(HIST("hPtGenNeg"), track.pt(), centrality); + } + } + } + } + + void processData(CollisionCandidates::iterator const& collision, TrackCandidates const& tracks) { - registry.fill(HIST("multiplicity"), multiplicity); + if (!colCuts.isSelected(collision)) // Default event selection + return; + colCuts.fillQA(collision); + auto centrality = collision.centFT0C(); + if (centrality < cfgCentMin || centrality > cfgCentMax) { + return; + } for (const auto& track : tracks) { - registry.fill(HIST("yields"), multiplicity, track.pt(), track.eta()); - registry.fill(HIST("etaphi"), track.eta(), track.phi()); + // pT and eta selections + if (track.pt() < cfgPtMin || track.pt() > cfgPtMax || track.eta() < cfgEtaMin || track.eta() > cfgEtaMax) { + continue; + } + registry.fill(HIST("hPtRec"), track.pt(), centrality); + registry.fill(HIST("hEtaRec"), track.eta(), centrality); + if (track.sign() > 0) { // Positive tracks + registry.fill(HIST("hPtRecPos"), track.pt(), centrality); + } else if (track.sign() < 0) { // Negative tracks + registry.fill(HIST("hPtRecNeg"), track.pt(), centrality); + } } } // NOTE SmallGroups includes soa::Filtered always - Preslice perCollision = aod::cftrack::cfCollisionId; + Preslice perCFCollision = aod::cftrack::cfCollisionId; void processEfficiency(soa::Filtered::iterator const& mcCollision, aod::CFMcParticles const& mcParticles, soa::SmallGroups const& collisions, @@ -224,39 +366,40 @@ struct JFlucEfficiencyTask { { try { // Count MC events and fill MC z-vertex with centrality + if (debugMode) { + LOGF(info, "MC collision at vtx-z = %f with %d mc particles and %d reconstructed collisions", mcCollision.posZ(), mcParticles.size(), collisions.size()); + } + auto multiplicity = mcCollision.multiplicity(); + if (cfgCentBinsForMC > 0) { + if (collisions.size() == 0) { + return; + } + for (const auto& collision : collisions) { + multiplicity = collision.multiplicity(); + } + } + if (debugMode) { + LOGF(info, "MC collision multiplicity: %f", multiplicity); + } registry.fill(HIST("hEventCounterMC"), 0); - registry.fill(HIST("hZVertexMC"), mcCollision.posZ(), mcCollision.multiplicity()); - + registry.fill(HIST("hZVertexMC"), mcCollision.posZ(), multiplicity); if (debugMode) { LOGF(info, "Processing MC collision %d at z = %.3f", mcCollision.globalIndex(), mcCollision.posZ()); } // Fill MC particle histograms for (const auto& mcParticle : mcParticles) { - if (!mcParticle.isPhysicalPrimary()) + if (!mcParticle.isPhysicalPrimary() || mcParticle.sign() == 0) { continue; - - // Fill generated particle histograms - registry.fill(HIST("hPtGen"), mcParticle.pt(), mcCollision.multiplicity()); - registry.fill(HIST("hEtaGen"), mcParticle.eta(), mcCollision.multiplicity()); - + } + registry.fill(HIST("hPtGenData"), mcParticle.pt(), multiplicity); + registry.fill(HIST("hEtaGenData"), mcParticle.eta(), multiplicity); if (mcParticle.sign() > 0) { - registry.fill(HIST("hPtGenPos"), mcParticle.pt(), mcCollision.multiplicity()); + registry.fill(HIST("hPtGenDataPos"), mcParticle.pt(), multiplicity); } else if (mcParticle.sign() < 0) { - registry.fill(HIST("hPtGenNeg"), mcParticle.pt(), mcCollision.multiplicity()); - } - - if (cfgEfficiencyFromData) { - registry.fill(HIST("hPtGenData"), mcParticle.pt(), mcCollision.multiplicity()); - registry.fill(HIST("hEtaGenData"), mcParticle.eta(), mcCollision.multiplicity()); - if (mcParticle.sign() > 0) { - registry.fill(HIST("hPtGenDataPos"), mcParticle.pt(), mcCollision.multiplicity()); - } else if (mcParticle.sign() < 0) { - registry.fill(HIST("hPtGenDataNeg"), mcParticle.pt(), mcCollision.multiplicity()); - } + registry.fill(HIST("hPtGenDataNeg"), mcParticle.pt(), multiplicity); } } - registry.fill(HIST("hEventCounterMC"), 1); // Check reconstructed collisions @@ -277,9 +420,13 @@ struct JFlucEfficiencyTask { LOGF(info, "Processing reconstructed collision %d at z = %.3f", collision.globalIndex(), collision.posZ()); } + registry.fill(HIST("hEventCounterReco"), 1); // Fill track histograms - auto groupedTracks = tracks.sliceBy(perCollision, collision.globalIndex()); + auto groupedTracks = tracks.sliceBy(perCFCollision, collision.globalIndex()); + if (debugMode) { + LOGF(info, "Reconstructed collision %d has %d tracks", collision.globalIndex(), groupedTracks.size()); + } for (const auto& track : groupedTracks) { if (!track.has_cfMCParticle()) { if (debugMode) { @@ -287,10 +434,13 @@ struct JFlucEfficiencyTask { } continue; } - + // primary particles only + const auto& mcParticle = track.cfMCParticle(); + if (!mcParticle.isPhysicalPrimary()) { + continue; + } registry.fill(HIST("hPtRecData"), track.pt(), collision.multiplicity()); registry.fill(HIST("hEtaRecData"), track.eta(), collision.multiplicity()); - if (track.sign() > 0) { registry.fill(HIST("hPtRecDataPos"), track.pt(), collision.multiplicity()); } else if (track.sign() < 0) { @@ -299,7 +449,6 @@ struct JFlucEfficiencyTask { } // Count selected and analyzed events - registry.fill(HIST("hEventCounterReco"), 1); registry.fill(HIST("hEventCounterReco"), 2); } @@ -314,6 +463,8 @@ struct JFlucEfficiencyTask { PROCESS_SWITCH(JFlucEfficiencyTask, processMC, "Process MC only", false); PROCESS_SWITCH(JFlucEfficiencyTask, processData, "Process data only", false); + PROCESS_SWITCH(JFlucEfficiencyTask, processDerivedMC, "Process derived MC only", false); + PROCESS_SWITCH(JFlucEfficiencyTask, processDerivedData, "Process derived data only", false); PROCESS_SWITCH(JFlucEfficiencyTask, processEfficiency, "Process efficiency task", true); }; diff --git a/PWGLF/Utils/collisionCuts.h b/PWGLF/Utils/collisionCuts.h index 676a5a16511..399454e9368 100644 --- a/PWGLF/Utils/collisionCuts.h +++ b/PWGLF/Utils/collisionCuts.h @@ -88,13 +88,12 @@ class CollisonCuts LOGF(error, "Event selection not set - quitting!"); } for (int i = 0; i < kNaliases; i++) { - bit_list.push_back(1 << i); // BIT(i) + bitList.push_back(1 << i); // BIT(i) } mHistogramRegistry = registry; mHistogramRegistry->add("Event/posZ", "; vtx_{z} (cm); Entries", o2::framework::kTH1F, {{250, -12.5, 12.5}}); // z-vertex histogram after event selections mHistogramRegistry->add("Event/posZ_noCut", "; vtx_{z} (cm); Entries", o2::framework::kTH1F, {{250, -12.5, 12.5}}); // z-vertex histogram before all selections if (mCheckIsRun3) { - mHistogramRegistry->add("Event/CentFV0A", "; vCentV0A; Entries", o2::framework::kTH1F, {{110, 0, 110}}); mHistogramRegistry->add("Event/CentFT0M", "; vCentT0M; Entries", o2::framework::kTH1F, {{110, 0, 110}}); mHistogramRegistry->add("Event/CentFT0C", "; vCentT0C; Entries", o2::framework::kTH1F, {{110, 0, 110}}); mHistogramRegistry->add("Event/CentFT0A", "; vCentT0A; Entries", o2::framework::kTH1F, {{110, 0, 110}}); @@ -198,7 +197,7 @@ class CollisonCuts return false; } if (mInitialColBitScan) { - for (int bit : bit_list) { + for (const auto& bit : bitList) { if (col.selection_bit(bit)) { LOGF(info, "Trigger %d fired", bit); } @@ -295,7 +294,6 @@ class CollisonCuts } else { mHistogramRegistry->fill(HIST("Event/posZ_ITSTPC"), col.posZ()); } - mHistogramRegistry->fill(HIST("Event/CentFV0A"), col.centFV0A()); mHistogramRegistry->fill(HIST("Event/CentFT0M"), col.centFT0M()); mHistogramRegistry->fill(HIST("Event/CentFT0C"), col.centFT0C()); mHistogramRegistry->fill(HIST("Event/CentFT0A"), col.centFT0A()); @@ -317,7 +315,7 @@ class CollisonCuts private: using BCsWithRun2Info = soa::Join; o2::framework::HistogramRegistry* mHistogramRegistry = nullptr; ///< For QA output - std::vector bit_list; + std::vector bitList; bool mCutsSet = false; ///< Protection against running without cuts bool mInitialColBitScan = true; ///< Scan for collision bit bool mCheckTrigger = false; ///< Check for trigger From 4971517e80d68fc8539b906c9e963a550307b952 Mon Sep 17 00:00:00 2001 From: Victor Gonzalez Date: Sun, 2 Mar 2025 22:47:03 +0100 Subject: [PATCH 0508/1650] [PWGCF] DptDpt - Tracking delta eta and delta phi (#10280) Co-authored-by: Victor --- .../Tasks/dptDptEfficiencyAndQc.cxx | 117 +++++++++++++++++- 1 file changed, 116 insertions(+), 1 deletion(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx index af1645ba36f..0040d44c8f8 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx @@ -70,6 +70,7 @@ enum KindOfData { /// \brief The kind of processing for templating the procedures and produce histograms enum KindOfProcess { kBASIC, ///< produce the basic histograms + kEXTRA, ///< produce the extra pair based histograms kPID, ///< produce the basic PID histograms kPIDEXTRA ///< produce the extra PID histograms }; @@ -569,6 +570,73 @@ struct QADataCollectingEngine { } }; +/* the QA extra data, pairs, collecting engine */ +struct QAExtraDataCollectingEngine { + uint nsp = static_cast(efficiencyandqatask::tnames.size()); + uint nmainsp = static_cast(efficiencyandqatask::mainspnames.size()); + uint nallmainsp = static_cast(efficiencyandqatask::allmainspnames.size()); + + //=================================================== + // The QA output objects + //=================================================== + /* pairs histograms */ + std::vector>>> fhPhiPhiA{2, {nsp, {nsp, nullptr}}}; + std::vector>>> fhDeltaPhiVsPhiPhiA{2, {nsp, {nsp, nullptr}}}; + std::vector>>> fhEtaEtaA{2, {nsp, {nsp, nullptr}}}; + std::vector>>> fhDeltaEtaVsEtaEtaA{2, {nsp, {nsp, nullptr}}}; + + template + void init(HistogramRegistry& registry, const char* dirname) + { + using namespace efficiencyandqatask; + using namespace analysis::dptdptfilter; + + AxisSpec phiAxis = {72, 0.0f, constants::math::TwoPI, "#varphi"}; + AxisSpec deltaPhiAxis = {72, 0.0f, constants::math::TwoPI, "#Delta#varphi"}; + AxisSpec etaAxis = {etabins, etalow, etaup, "#eta"}; + AxisSpec deltaEta = {2 * etabins - 1, etalow - etaup, etaup - etalow, "#DeltaEta"}; + + /* the reconstructed and generated levels histograms */ + std::string recogen = (kindOfData == kReco) ? "Reco" : "Gen"; + for (uint isp = 0; isp < nsp; ++isp) { + for (uint jsp = 0; jsp < nsp; ++jsp) { + fhPhiPhiA[kindOfData][isp][jsp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("PhiPhi_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), + HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTH2F, {phiAxis, phiAxis}); + fhDeltaPhiVsPhiPhiA[kindOfData][isp][jsp] = ADDHISTOGRAM(TH3, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("deltaPhiVsPhiPhi_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), + HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTH3F, {phiAxis, phiAxis, deltaPhiAxis}); + fhEtaEtaA[kindOfData][isp][jsp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("EtaEta_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), + HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTH2F, {etaAxis, etaAxis}); + fhDeltaEtaVsEtaEtaA[kindOfData][isp][jsp] = ADDHISTOGRAM(TH3, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("deltaPhiVsEtaEta_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), + HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTH3F, {phiAxis, phiAxis, deltaPhiAxis}); + } + } + } + + template + void processTrackPairs(TracksObject const& tracks1, TracksObject const& tracks2) + { + using namespace efficiencyandqatask; + using namespace analysis::dptdptfilter; + + /* we should only receive accepted tracks */ + for (auto const& track1 : tracks1) { + for (auto const& track2 : tracks2) { + /* checking the same track id condition */ + if (track1 == track2) { + /* exclude autocorrelations */ + continue; + } + float deltaPhi = RecoDecay::constrainAngle(track1.phi() - track2.phi()); + float deltaEta = track1.eta() - track2.eta(); + fhPhiPhiA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(track1.phi(), track2.phi()); + fhDeltaPhiVsPhiPhiA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(track1.phi(), track2.phi(), deltaPhi); + fhEtaEtaA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(track1.eta(), track2.eta()); + fhDeltaEtaVsEtaEtaA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(track1.eta(), track2.eta(), deltaEta); + } + } + } +}; + /* the PID data collecting engine */ struct PidDataCollectingEngine { uint nsp = static_cast(efficiencyandqatask::tnames.size()); @@ -850,6 +918,7 @@ struct DptDptEfficiencyAndQc { /* the data collecting engine instances */ QADataCollectingEngine** qaDataCE; + QAExtraDataCollectingEngine** qaExtraDataCE; PidDataCollectingEngine** pidDataCE; PidExtraDataCollectingEngine** pidExtraDataCE; @@ -892,11 +961,13 @@ struct DptDptEfficiencyAndQc { /* do nothing if not active */ if (!doprocessDetectorLevelNotStored && + !doprocessExtraDetectorLevelNotStored && !doprocessDetectorLevelNotStoredPID && !doprocessDetectorLevelNotStoredTunedOnDataPID && !doprocessDetectorLevelNotStoredPIDExtra && !doprocessDetectorLevelNotStoredTunedOnDataPIDExtra && !doprocessGeneratorLevelNotStored && + !doprocessExtraGeneratorLevelNotStored && !doprocessReconstructedNotStored && !doprocessReconstructedNotStoredPID && !doprocessReconstructedNotStoredPIDExtra) { @@ -982,13 +1053,17 @@ struct DptDptEfficiencyAndQc { widthNSigmaBin = cfgWidthNSigmaBin.value; noOfNSigmaBins = static_cast((maxNSigma - minNSigma) / widthNSigmaBin); - bool doBasicAnalysis = doprocessDetectorLevelNotStored || doprocessReconstructedNotStored; + bool doBasicAnalysis = doprocessDetectorLevelNotStored || doprocessReconstructedNotStored || doprocessGeneratorLevelNotStored; + bool doExtraAnalysis = doprocessExtraDetectorLevelNotStored || doprocessExtraReconstructedNotStored || doprocessExtraGeneratorLevelNotStored; bool doPidAnalysis = doprocessDetectorLevelNotStoredPID || doprocessDetectorLevelNotStoredTunedOnDataPID || doprocessReconstructedNotStoredPID; bool doPidExtraAnalysis = doprocessDetectorLevelNotStoredPIDExtra || doprocessDetectorLevelNotStoredTunedOnDataPIDExtra || doprocessReconstructedNotStoredPIDExtra; if (doBasicAnalysis) { qaDataCE = new QADataCollectingEngine*[ncmranges]; } + if (doExtraAnalysis) { + qaExtraDataCE = new QAExtraDataCollectingEngine*[ncmranges]; + } if (doPidAnalysis) { pidDataCE = new PidDataCollectingEngine*[ncmranges]; } @@ -1014,6 +1089,11 @@ struct DptDptEfficiencyAndQc { initializeCEInstance(dce, TString::Format("EfficiencyAndQaData-%d-%d", static_cast(min), static_cast(max)), *registrybank[i]); return dce; }; + auto buildQACEExtraInstance = [&](float min, float max) { + auto* dce = new QAExtraDataCollectingEngine(); + initializeCEInstance(dce, TString::Format("EfficiencyAndQaExtraData-%d-%d", static_cast(min), static_cast(max)), *registrybank[i]); + return dce; + }; auto buildPidCEInstance = [&](float min, float max) { auto* dce = new PidDataCollectingEngine(); initializeCEInstance(dce, TString::Format("EfficiencyAndPidData-%d-%d", static_cast(min), static_cast(max)), *pidregistrybank[i]); @@ -1028,6 +1108,9 @@ struct DptDptEfficiencyAndQc { if (doBasicAnalysis) { qaDataCE[ncmranges - i - 1] = buildQACEInstance(fCentMultMin[ncmranges - i - 1], fCentMultMax[ncmranges - i - 1]); } + if (doExtraAnalysis) { + qaExtraDataCE[ncmranges - i - 1] = buildQACEExtraInstance(fCentMultMin[ncmranges - i - 1], fCentMultMax[ncmranges - i - 1]); + } if (doPidAnalysis) { pidDataCE[ncmranges - i - 1] = buildPidCEInstance(fCentMultMin[ncmranges - i - 1], fCentMultMax[ncmranges - i - 1]); } @@ -1075,6 +1158,9 @@ struct DptDptEfficiencyAndQc { if constexpr (kindOfProcess == kBASIC) { qaDataCE[ixDCE]->newCollision(); } + if constexpr (kindOfProcess == kEXTRA) { + qaExtraDataCE[ixDCE]->processTrackPairs(tracks, tracks); + } for (auto const& track : tracks) { float tpcmom = track.p(); float tofmom = track.p(); @@ -1109,6 +1195,7 @@ struct DptDptEfficiencyAndQc { using TofPID = soa::Join; Filter onlyacceptedcollisions = (aod::dptdptfilter::collisionaccepted == uint8_t(true)); + Filter onlyacceptedtracks = (aod::dptdptfilter::trackacceptedid >= int8_t(0)); void processReconstructedNotStored(soa::Filtered>::iterator const& collision, soa::Join const& tracks) @@ -1138,6 +1225,34 @@ struct DptDptEfficiencyAndQc { } PROCESS_SWITCH(DptDptEfficiencyAndQc, processGeneratorLevelNotStored, "Process MC generator level efficiency and QA for not stored derived data", true); + void processExtraReconstructedNotStored(soa::Filtered>::iterator const& collision, + soa::Filtered> const& tracks) + { + using namespace efficiencyandqatask; + + processTracks>, kEXTRA, kReco>(collision, tracks); + } + PROCESS_SWITCH(DptDptEfficiencyAndQc, processExtraReconstructedNotStored, "Process reconstructed extra efficiency and QA for not stored derived data", false); + + void processExtraDetectorLevelNotStored(soa::Filtered>::iterator const& collision, + soa::Filtered> const& tracks, + soa::Join const&) + { + using namespace efficiencyandqatask; + + processTracks>, kEXTRA, kReco>(collision, tracks); + } + PROCESS_SWITCH(DptDptEfficiencyAndQc, processExtraDetectorLevelNotStored, "Process MC detector level extra efficiency and QA for not stored derived data", false); + + void processExtraGeneratorLevelNotStored(soa::Filtered>::iterator const& collision, + soa::Filtered> const& particles) + { + using namespace efficiencyandqatask; + + processTracks>, kEXTRA, kGen>(collision, particles); + } + PROCESS_SWITCH(DptDptEfficiencyAndQc, processExtraGeneratorLevelNotStored, "Process MC generator level extra efficiency and QA for not stored derived data", true); + void processReconstructedNotStoredPID(soa::Filtered>::iterator const& collision, soa::Join const& tracks) { From e128a770b3ac9fe026bc952c36df09f7ee34204b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Mon, 3 Mar 2025 02:50:52 +0100 Subject: [PATCH 0509/1650] [PWGHF] Fix linter issues (#10229) --- .../TableProducer/candidateCreator2Prong.cxx | 33 ++++---- .../TableProducer/candidateCreator3Prong.cxx | 56 ++++++------- PWGHF/TableProducer/candidateCreatorB0.cxx | 6 +- PWGHF/TableProducer/candidateCreatorBplus.cxx | 6 +- PWGHF/TableProducer/candidateCreatorBs.cxx | 6 +- .../TableProducer/candidateCreatorCascade.cxx | 20 ++--- PWGHF/TableProducer/candidateCreatorDstar.cxx | 14 ++-- PWGHF/TableProducer/candidateCreatorLb.cxx | 21 +++-- ...candidateCreatorSigmac0plusplusCascade.cxx | 9 ++- .../candidateCreatorXic0Omegac0.cxx | 13 +-- .../candidateCreatorXicToXiPiPi.cxx | 2 +- .../candidateSelectorBplusToD0Pi.cxx | 4 +- .../candidateSelectorBsToDsPi.cxx | 2 +- .../candidateSelectorOmegac0ToOmegaKa.cxx | 30 +++---- .../candidateSelectorOmegac0ToOmegaPi.cxx | 30 +++---- .../TableProducer/candidateSelectorToXiPi.cxx | 28 +++---- .../candidateSelectorXic0ToXiPiKf.cxx | 24 +++--- .../candidateSelectorXicToPKPi.cxx | 4 +- PWGHF/TableProducer/mcPidTof.cxx | 4 +- PWGHF/TableProducer/pidCreator.cxx | 10 +-- PWGHF/TableProducer/trackIndexSkimCreator.cxx | 79 +++++++++---------- PWGHF/TableProducer/treeCreatorB0ToDPi.cxx | 2 +- PWGHF/TableProducer/treeCreatorToXiPi.cxx | 3 +- 23 files changed, 206 insertions(+), 200 deletions(-) diff --git a/PWGHF/TableProducer/candidateCreator2Prong.cxx b/PWGHF/TableProducer/candidateCreator2Prong.cxx index 63f8589733d..576e5413c11 100644 --- a/PWGHF/TableProducer/candidateCreator2Prong.cxx +++ b/PWGHF/TableProducer/candidateCreator2Prong.cxx @@ -17,7 +17,7 @@ /// \author Pengzhong Lu , GSI Darmstadt, USTC #ifndef HomogeneousField -#define HomogeneousField +#define HomogeneousField // o2-linter: disable=name/macro (required by KFParticle) #endif #include @@ -372,7 +372,7 @@ struct HfCandidateCreator2Prong { kfpVertex.SetCovarianceMatrix(rowTrackIndexProng2.pvRefitSigmaX2(), rowTrackIndexProng2.pvRefitSigmaXY(), rowTrackIndexProng2.pvRefitSigmaY2(), rowTrackIndexProng2.pvRefitSigmaXZ(), rowTrackIndexProng2.pvRefitSigmaYZ(), rowTrackIndexProng2.pvRefitSigmaZ2()); } kfpVertex.GetCovarianceMatrix(covMatrixPV); - KFParticle KFPV(kfpVertex); + KFParticle kfpV(kfpVertex); registry.fill(HIST("hCovPVXX"), covMatrixPV[0]); registry.fill(HIST("hCovPVYY"), covMatrixPV[2]); registry.fill(HIST("hCovPVXZ"), covMatrixPV[3]); @@ -387,16 +387,16 @@ struct HfCandidateCreator2Prong { KFParticle kfNegKaon(kfpTrack1, kKPlus); float impactParameter0XY = 0., errImpactParameter0XY = 0., impactParameter1XY = 0., errImpactParameter1XY = 0.; - if (!kfPosPion.GetDistanceFromVertexXY(KFPV, impactParameter0XY, errImpactParameter0XY)) { + if (!kfPosPion.GetDistanceFromVertexXY(kfpV, impactParameter0XY, errImpactParameter0XY)) { registry.fill(HIST("hDcaXYProngs"), track0.pt(), impactParameter0XY * toMicrometers); - registry.fill(HIST("hDcaZProngs"), track0.pt(), std::sqrt(kfPosPion.GetDistanceFromVertex(KFPV) * kfPosPion.GetDistanceFromVertex(KFPV) - impactParameter0XY * impactParameter0XY) * toMicrometers); + registry.fill(HIST("hDcaZProngs"), track0.pt(), std::sqrt(kfPosPion.GetDistanceFromVertex(kfpV) * kfPosPion.GetDistanceFromVertex(kfpV) - impactParameter0XY * impactParameter0XY) * toMicrometers); } else { registry.fill(HIST("hDcaXYProngs"), track0.pt(), -999.f); registry.fill(HIST("hDcaZProngs"), track0.pt(), -999.f); } - if (!kfNegPion.GetDistanceFromVertexXY(KFPV, impactParameter1XY, errImpactParameter1XY)) { + if (!kfNegPion.GetDistanceFromVertexXY(kfpV, impactParameter1XY, errImpactParameter1XY)) { registry.fill(HIST("hDcaXYProngs"), track1.pt(), impactParameter1XY * toMicrometers); - registry.fill(HIST("hDcaZProngs"), track1.pt(), std::sqrt(kfNegPion.GetDistanceFromVertex(KFPV) * kfNegPion.GetDistanceFromVertex(KFPV) - impactParameter1XY * impactParameter1XY) * toMicrometers); + registry.fill(HIST("hDcaZProngs"), track1.pt(), std::sqrt(kfNegPion.GetDistanceFromVertex(kfpV) * kfNegPion.GetDistanceFromVertex(kfpV) - impactParameter1XY * impactParameter1XY) * toMicrometers); } else { registry.fill(HIST("hDcaXYProngs"), track1.pt(), -999.f); registry.fill(HIST("hDcaZProngs"), track1.pt(), -999.f); @@ -422,7 +422,7 @@ struct HfCandidateCreator2Prong { auto covMatrixSV = kfCandD0.CovarianceMatrix(); double phi, theta; - getPointDirection(std::array{KFPV.GetX(), KFPV.GetY(), KFPV.GetZ()}, std::array{kfCandD0.GetX(), kfCandD0.GetY(), kfCandD0.GetZ()}, phi, theta); + getPointDirection(std::array{kfpV.GetX(), kfpV.GetY(), kfpV.GetZ()}, std::array{kfCandD0.GetX(), kfCandD0.GetY(), kfCandD0.GetZ()}, phi, theta); auto errorDecayLength = std::sqrt(getRotatedCovMatrixXX(covMatrixPV, phi, theta) + getRotatedCovMatrixXX(covMatrixSV, phi, theta)); auto errorDecayLengthXY = std::sqrt(getRotatedCovMatrixXX(covMatrixPV, phi, 0.) + getRotatedCovMatrixXX(covMatrixSV, phi, 0.)); @@ -430,7 +430,7 @@ struct HfCandidateCreator2Prong { KFParticle kfCandD0Topol2PV; if (constrainKfToPv) { kfCandD0Topol2PV = kfCandD0; - kfCandD0Topol2PV.SetProductionVertex(KFPV); + kfCandD0Topol2PV.SetProductionVertex(kfpV); topolChi2PerNdfD0 = kfCandD0Topol2PV.GetChi2() / kfCandD0Topol2PV.GetNDF(); } @@ -446,7 +446,7 @@ struct HfCandidateCreator2Prong { // fill candidate table rows rowCandidateBase(indexCollision, - KFPV.GetX(), KFPV.GetY(), KFPV.GetZ(), + kfpV.GetX(), kfpV.GetY(), kfpV.GetZ(), kfCandD0.GetX(), kfCandD0.GetY(), kfCandD0.GetZ(), errorDecayLength, errorDecayLengthXY, // TODO: much different from the DCAFitterN one kfCandD0.GetChi2() / kfCandD0.GetNDF(), // TODO: to make sure it should be chi2 only or chi2/ndf, much different from the DCAFitterN one @@ -683,9 +683,9 @@ struct HfCandidateCreator2ProngExpressions { Produces rowMcMatchGen; // Configuration - o2::framework::Configurable rejectBackground{"rejectBackground", true, "Reject particles from background events"}; - o2::framework::Configurable matchKinkedDecayTopology{"matchKinkedDecayTopology", false, "Match also candidates with tracks that decay with kinked topology"}; - o2::framework::Configurable matchInteractionsWithMaterial{"matchInteractionsWithMaterial", false, "Match also candidates with tracks that interact with material"}; + Configurable rejectBackground{"rejectBackground", true, "Reject particles from background events"}; + Configurable matchKinkedDecayTopology{"matchKinkedDecayTopology", false, "Match also candidates with tracks that decay with kinked topology"}; + Configurable matchInteractionsWithMaterial{"matchInteractionsWithMaterial", false, "Match also candidates with tracks that interact with material"}; HfEventSelectionMc hfEvSelMc; // mc event selection and monitoring @@ -693,12 +693,13 @@ struct HfCandidateCreator2ProngExpressions { using McCollisionsFT0Cs = soa::Join; using McCollisionsFT0Ms = soa::Join; using McCollisionsCentFT0Ms = soa::Join; + using BCsInfo = soa::Join; + + Preslice mcParticlesPerMcCollision = aod::mcparticle::mcCollisionId; PresliceUnsorted colPerMcCollision = aod::mccollisionlabel::mcCollisionId; PresliceUnsorted colPerMcCollisionFT0C = aod::mccollisionlabel::mcCollisionId; PresliceUnsorted colPerMcCollisionFT0M = aod::mccollisionlabel::mcCollisionId; - Preslice mcParticlesPerMcCollision = aod::mcparticle::mcCollisionId; - using BCsInfo = soa::Join; HistogramRegistry registry{"registry"}; // inspect for which zPvPosMax cut was set for reconstructed @@ -878,6 +879,6 @@ struct HfCandidateCreator2ProngExpressions { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"hf-candidate-creator-2prong"}), - adaptAnalysisTask(cfgc, TaskName{"hf-candidate-creator-2prong-expressions"})}; + adaptAnalysisTask(cfgc, TaskName{"hf-candidate-creator-2prong"}), // o2-linter: disable=name/o2-task (wrong hyphenation) + adaptAnalysisTask(cfgc, TaskName{"hf-candidate-creator-2prong-expressions"})}; // o2-linter: disable=name/o2-task (wrong hyphenation) } diff --git a/PWGHF/TableProducer/candidateCreator3Prong.cxx b/PWGHF/TableProducer/candidateCreator3Prong.cxx index 3918752570c..234ca475cbc 100644 --- a/PWGHF/TableProducer/candidateCreator3Prong.cxx +++ b/PWGHF/TableProducer/candidateCreator3Prong.cxx @@ -16,7 +16,7 @@ /// \author Vít Kučera , CERN #ifndef HomogeneousField -#define HomogeneousField +#define HomogeneousField // o2-linter: disable=name/macro (required by KFParticle) #endif #include @@ -404,7 +404,7 @@ struct HfCandidateCreator3Prong { kfpVertex.SetCovarianceMatrix(rowTrackIndexProng3.pvRefitSigmaX2(), rowTrackIndexProng3.pvRefitSigmaXY(), rowTrackIndexProng3.pvRefitSigmaY2(), rowTrackIndexProng3.pvRefitSigmaXZ(), rowTrackIndexProng3.pvRefitSigmaYZ(), rowTrackIndexProng3.pvRefitSigmaZ2()); } kfpVertex.GetCovarianceMatrix(covMatrixPV); - KFParticle KFPV(kfpVertex); + KFParticle kfpV(kfpVertex); registry.fill(HIST("hCovPVXX"), covMatrixPV[0]); registry.fill(HIST("hCovPVYY"), covMatrixPV[2]); registry.fill(HIST("hCovPVXZ"), covMatrixPV[3]); @@ -423,35 +423,35 @@ struct HfCandidateCreator3Prong { KFParticle kfThirdKaon(kfpTrack2, kKPlus); float impactParameter0XY = 0., errImpactParameter0XY = 0., impactParameter1XY = 0., errImpactParameter1XY = 0., impactParameter2XY = 0., errImpactParameter2XY = 0.; - if (!kfFirstProton.GetDistanceFromVertexXY(KFPV, impactParameter0XY, errImpactParameter0XY)) { + if (!kfFirstProton.GetDistanceFromVertexXY(kfpV, impactParameter0XY, errImpactParameter0XY)) { registry.fill(HIST("hDcaXYProngs"), track0.pt(), impactParameter0XY * toMicrometers); - registry.fill(HIST("hDcaZProngs"), track0.pt(), std::sqrt(kfFirstProton.GetDistanceFromVertex(KFPV) * kfFirstProton.GetDistanceFromVertex(KFPV) - impactParameter0XY * impactParameter0XY) * toMicrometers); + registry.fill(HIST("hDcaZProngs"), track0.pt(), std::sqrt(kfFirstProton.GetDistanceFromVertex(kfpV) * kfFirstProton.GetDistanceFromVertex(kfpV) - impactParameter0XY * impactParameter0XY) * toMicrometers); } else { registry.fill(HIST("hDcaXYProngs"), track0.pt(), UndefValueFloat); registry.fill(HIST("hDcaZProngs"), track0.pt(), UndefValueFloat); } - if (!kfSecondKaon.GetDistanceFromVertexXY(KFPV, impactParameter1XY, errImpactParameter1XY)) { + if (!kfSecondKaon.GetDistanceFromVertexXY(kfpV, impactParameter1XY, errImpactParameter1XY)) { registry.fill(HIST("hDcaXYProngs"), track1.pt(), impactParameter1XY * toMicrometers); - registry.fill(HIST("hDcaZProngs"), track1.pt(), std::sqrt(kfSecondKaon.GetDistanceFromVertex(KFPV) * kfSecondKaon.GetDistanceFromVertex(KFPV) - impactParameter1XY * impactParameter1XY) * toMicrometers); + registry.fill(HIST("hDcaZProngs"), track1.pt(), std::sqrt(kfSecondKaon.GetDistanceFromVertex(kfpV) * kfSecondKaon.GetDistanceFromVertex(kfpV) - impactParameter1XY * impactParameter1XY) * toMicrometers); } else { registry.fill(HIST("hDcaXYProngs"), track1.pt(), UndefValueFloat); registry.fill(HIST("hDcaZProngs"), track1.pt(), UndefValueFloat); } - if (!kfThirdProton.GetDistanceFromVertexXY(KFPV, impactParameter2XY, errImpactParameter2XY)) { + if (!kfThirdProton.GetDistanceFromVertexXY(kfpV, impactParameter2XY, errImpactParameter2XY)) { registry.fill(HIST("hDcaXYProngs"), track2.pt(), impactParameter2XY * toMicrometers); - registry.fill(HIST("hDcaZProngs"), track2.pt(), std::sqrt(kfThirdProton.GetDistanceFromVertex(KFPV) * kfThirdProton.GetDistanceFromVertex(KFPV) - impactParameter2XY * impactParameter2XY) * toMicrometers); + registry.fill(HIST("hDcaZProngs"), track2.pt(), std::sqrt(kfThirdProton.GetDistanceFromVertex(kfpV) * kfThirdProton.GetDistanceFromVertex(kfpV) - impactParameter2XY * impactParameter2XY) * toMicrometers); } else { registry.fill(HIST("hDcaXYProngs"), track2.pt(), UndefValueFloat); registry.fill(HIST("hDcaZProngs"), track2.pt(), UndefValueFloat); } - auto [impactParameter0Z, errImpactParameter0Z] = kfCalculateImpactParameterZ(kfFirstProton, KFPV); - auto [impactParameter1Z, errImpactParameter1Z] = kfCalculateImpactParameterZ(kfSecondKaon, KFPV); - auto [impactParameter2Z, errImpactParameter2Z] = kfCalculateImpactParameterZ(kfThirdProton, KFPV); + auto [impactParameter0Z, errImpactParameter0Z] = kfCalculateImpactParameterZ(kfFirstProton, kfpV); + auto [impactParameter1Z, errImpactParameter1Z] = kfCalculateImpactParameterZ(kfSecondKaon, kfpV); + auto [impactParameter2Z, errImpactParameter2Z] = kfCalculateImpactParameterZ(kfThirdProton, kfpV); - const float chi2primFirst = kfCalculateChi2ToPrimaryVertex(kfFirstProton, KFPV); - const float chi2primSecond = kfCalculateChi2ToPrimaryVertex(kfSecondKaon, KFPV); - const float chi2primThird = kfCalculateChi2ToPrimaryVertex(kfThirdPion, KFPV); + const float chi2primFirst = kfCalculateChi2ToPrimaryVertex(kfFirstProton, kfpV); + const float chi2primSecond = kfCalculateChi2ToPrimaryVertex(kfSecondKaon, kfpV); + const float chi2primThird = kfCalculateChi2ToPrimaryVertex(kfThirdPion, kfpV); const float dcaSecondThird = kfCalculateDistanceBetweenParticles(kfSecondKaon, kfThirdPion); const float dcaFirstThird = kfCalculateDistanceBetweenParticles(kfFirstProton, kfThirdPion); @@ -506,8 +506,8 @@ struct HfCandidateCreator3Prong { const float massPiK = kfPairPiK.GetMass(); const float chi2geo = kfCandPKPi.Chi2() / kfCandPKPi.NDF(); - const float chi2topo = kfCalculateChi2ToPrimaryVertex(kfCandPKPi, KFPV); - const std::pair ldl = kfCalculateLdL(kfCandPKPi, KFPV); + const float chi2topo = kfCalculateChi2ToPrimaryVertex(kfCandPKPi, kfpV); + const std::pair ldl = kfCalculateLdL(kfCandPKPi, kfpV); std::array pProng0 = kfCalculateProngMomentumInSecondaryVertex(kfFirstProton, kfCandPiKP); std::array pProng1 = kfCalculateProngMomentumInSecondaryVertex(kfSecondKaon, kfCandPiKP); @@ -520,7 +520,7 @@ struct HfCandidateCreator3Prong { auto covMatrixSV = kfCandPKPi.CovarianceMatrix(); double phi, theta; - getPointDirection(std::array{KFPV.GetX(), KFPV.GetY(), KFPV.GetZ()}, std::array{kfCandPKPi.GetX(), kfCandPKPi.GetY(), kfCandPKPi.GetZ()}, phi, theta); + getPointDirection(std::array{kfpV.GetX(), kfpV.GetY(), kfpV.GetZ()}, std::array{kfCandPKPi.GetX(), kfCandPKPi.GetY(), kfCandPKPi.GetZ()}, phi, theta); auto errorDecayLength = std::sqrt(getRotatedCovMatrixXX(covMatrixPV, phi, theta) + getRotatedCovMatrixXX(covMatrixSV, phi, theta)); auto errorDecayLengthXY = std::sqrt(getRotatedCovMatrixXX(covMatrixPV, phi, 0.) + getRotatedCovMatrixXX(covMatrixSV, phi, 0.)); @@ -539,7 +539,7 @@ struct HfCandidateCreator3Prong { // fill candidate table rows rowCandidateBase(indexCollision, - KFPV.GetX(), KFPV.GetY(), KFPV.GetZ(), + kfpV.GetX(), kfpV.GetY(), kfpV.GetZ(), kfCandPKPi.GetX(), kfCandPKPi.GetY(), kfCandPKPi.GetZ(), errorDecayLength, errorDecayLengthXY, kfCandPKPi.GetChi2() / kfCandPKPi.GetNDF(), @@ -555,7 +555,7 @@ struct HfCandidateCreator3Prong { // fill KF info rowCandidateKF(kfCandPKPi.GetErrX(), kfCandPKPi.GetErrY(), kfCandPKPi.GetErrZ(), - std::sqrt(KFPV.Covariance(0, 0)), std::sqrt(KFPV.Covariance(1, 1)), std::sqrt(KFPV.Covariance(2, 2)), + std::sqrt(kfpV.Covariance(0, 0)), std::sqrt(kfpV.Covariance(1, 1)), std::sqrt(kfpV.Covariance(2, 2)), massPKPi, massPiKP, massPiKPi, massKKPi, massPiKK, massKPi, massPiK, kfCandPKPi.GetPx(), kfCandPKPi.GetPy(), kfCandPKPi.GetPz(), kfCandPKPi.GetErrPx(), kfCandPKPi.GetErrPy(), kfCandPKPi.GetErrPz(), @@ -783,22 +783,24 @@ struct HfCandidateCreator3ProngExpressions { Produces rowMcMatchGen; // Configuration - o2::framework::Configurable rejectBackground{"rejectBackground", true, "Reject particles from background events"}; - o2::framework::Configurable matchKinkedDecayTopology{"matchKinkedDecayTopology", false, "Match also candidates with tracks that decay with kinked topology"}; - o2::framework::Configurable matchInteractionsWithMaterial{"matchInteractionsWithMaterial", false, "Match also candidates with tracks that interact with material"}; + Configurable rejectBackground{"rejectBackground", true, "Reject particles from background events"}; + Configurable matchKinkedDecayTopology{"matchKinkedDecayTopology", false, "Match also candidates with tracks that decay with kinked topology"}; + Configurable matchInteractionsWithMaterial{"matchInteractionsWithMaterial", false, "Match also candidates with tracks that interact with material"}; HfEventSelectionMc hfEvSelMc; // mc event selection and monitoring - using BCsInfo = soa::Join; - HistogramRegistry registry{"registry"}; + using BCsInfo = soa::Join; using McCollisionsNoCents = soa::Join; using McCollisionsFT0Cs = soa::Join; using McCollisionsFT0Ms = soa::Join; using McCollisionsCentFT0Ms = soa::Join; + + Preslice mcParticlesPerMcCollision = aod::mcparticle::mcCollisionId; PresliceUnsorted colPerMcCollision = aod::mccollisionlabel::mcCollisionId; PresliceUnsorted colPerMcCollisionFT0C = aod::mccollisionlabel::mcCollisionId; PresliceUnsorted colPerMcCollisionFT0M = aod::mccollisionlabel::mcCollisionId; - Preslice mcParticlesPerMcCollision = aod::mcparticle::mcCollisionId; + + HistogramRegistry registry{"registry"}; void init(InitContext& initContext) { @@ -1078,6 +1080,6 @@ struct HfCandidateCreator3ProngExpressions { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"hf-candidate-creator-3prong"}), - adaptAnalysisTask(cfgc, TaskName{"hf-candidate-creator-3prong-expressions"})}; + adaptAnalysisTask(cfgc, TaskName{"hf-candidate-creator-3prong"}), // o2-linter: disable=name/o2-task (wrong hyphenation) + adaptAnalysisTask(cfgc, TaskName{"hf-candidate-creator-3prong-expressions"})}; // o2-linter: disable=name/o2-task (wrong hyphenation) } diff --git a/PWGHF/TableProducer/candidateCreatorB0.cxx b/PWGHF/TableProducer/candidateCreatorB0.cxx index fa80f8a287b..6caca925a2d 100644 --- a/PWGHF/TableProducer/candidateCreatorB0.cxx +++ b/PWGHF/TableProducer/candidateCreatorB0.cxx @@ -98,6 +98,9 @@ struct HfCandidateCreatorB0 { Preslice candsDPerCollision = aod::track_association::collisionId; Preslice trackIndicesPerCollision = aod::track_association::collisionId; + std::shared_ptr hCandidatesD, hCandidatesB; + HistogramRegistry registry{"registry"}; + OutputObj hMassDToPiKPi{TH1F("hMassDToPiKPi", "D^{#minus} candidates;inv. mass (p^{#minus} K^{#plus} #pi^{#minus}) (GeV/#it{c}^{2});entries", 500, 0., 5.)}; OutputObj hPtD{TH1F("hPtD", "D^{#minus} candidates;D^{#minus} candidate #it{p}_{T} (GeV/#it{c});entries", 100, 0., 10.)}; OutputObj hPtPion{TH1F("hPtPion", "#pi^{#plus} candidates;#pi^{#plus} candidate #it{p}_{T} (GeV/#it{c});entries", 100, 0., 10.)}; @@ -106,9 +109,6 @@ struct HfCandidateCreatorB0 { OutputObj hCovPVXX{TH1F("hCovPVXX", "2-prong candidates;XX element of cov. matrix of prim. vtx. position (cm^{2});entries", 100, 0., 1.e-4)}; OutputObj hCovSVXX{TH1F("hCovSVXX", "2-prong candidates;XX element of cov. matrix of sec. vtx. position (cm^{2});entries", 100, 0., 0.2)}; - std::shared_ptr hCandidatesD, hCandidatesB; - HistogramRegistry registry{"registry"}; - void init(InitContext const&) { // invariant-mass window cut diff --git a/PWGHF/TableProducer/candidateCreatorBplus.cxx b/PWGHF/TableProducer/candidateCreatorBplus.cxx index aa5704c31a2..f1d306cad12 100644 --- a/PWGHF/TableProducer/candidateCreatorBplus.cxx +++ b/PWGHF/TableProducer/candidateCreatorBplus.cxx @@ -100,15 +100,15 @@ struct HfCandidateCreatorBplus { Preslice candsDPerCollision = aod::track_association::collisionId; Preslice trackIndicesPerCollision = aod::track_association::collisionId; + std::shared_ptr hCandidatesD, hCandidatesB; + HistogramRegistry registry{"registry"}; + OutputObj hCovPVXX{TH1F("hCovPVXX", "2-prong candidates;XX element of cov. matrix of prim. vtx. position (cm^{2});entries", 100, 0., 1.e-4)}; OutputObj hCovSVXX{TH1F("hCovSVXX", "2-prong candidates;XX element of cov. matrix of sec. vtx. position (cm^{2});entries", 100, 0., 0.2)}; OutputObj hRapidityD0{TH1F("hRapidityD0", "D0 candidates;#it{y};entries", 100, -2, 2)}; OutputObj hEtaPi{TH1F("hEtaPi", "Pion track;#it{#eta};entries", 400, -2., 2.)}; OutputObj hMassBplusToD0Pi{TH1F("hMassBplusToD0Pi", "2-prong candidates;inv. mass (B^{+} #rightarrow #bar{D^{0}}#pi^{+}) (GeV/#it{c}^{2});entries", 500, 3., 8.)}; - std::shared_ptr hCandidatesD, hCandidatesB; - HistogramRegistry registry{"registry"}; - void init(InitContext const&) { // invariant-mass window cut diff --git a/PWGHF/TableProducer/candidateCreatorBs.cxx b/PWGHF/TableProducer/candidateCreatorBs.cxx index 4184498c7db..5ce38797762 100644 --- a/PWGHF/TableProducer/candidateCreatorBs.cxx +++ b/PWGHF/TableProducer/candidateCreatorBs.cxx @@ -93,6 +93,9 @@ struct HfCandidateCreatorBs { Preslice candsDsPerCollision = aod::track_association::collisionId; Preslice trackIndicesPerCollision = aod::track_association::collisionId; + std::shared_ptr hCandidatesD, hCandidatesB; + HistogramRegistry registry{"registry"}; + OutputObj hMassDsToKKPi{TH1F("hMassDsToKKPi", "D_{s} candidates;inv. mass (K K #pi) (GeV/#it{c}^{2});entries", 500, 0., 5.)}; OutputObj hPtDs{TH1F("hPtDs", "D_{s} candidates;D_{s} candidate #it{p}_{T} (GeV/#it{c});entries", 100, 0., 10.)}; OutputObj hPtPion{TH1F("hPtPion", "#pi candidates;#pi candidate #it{p}_{T} (GeV/#it{c});entries", 100, 0., 10.)}; @@ -101,9 +104,6 @@ struct HfCandidateCreatorBs { OutputObj hCovPVXX{TH1F("hCovPVXX", "2-prong candidates;XX element of cov. matrix of prim. vtx. position (cm^{2});entries", 100, 0., 1.e-4)}; OutputObj hCovSVXX{TH1F("hCovSVXX", "2-prong candidates;XX element of cov. matrix of sec. vtx. position (cm^{2});entries", 100, 0., 0.2)}; - std::shared_ptr hCandidatesD, hCandidatesB; - HistogramRegistry registry{"registry"}; - void init(InitContext const&) { massPi = MassPiPlus; diff --git a/PWGHF/TableProducer/candidateCreatorCascade.cxx b/PWGHF/TableProducer/candidateCreatorCascade.cxx index a4b138039e6..23c26f7ae7c 100644 --- a/PWGHF/TableProducer/candidateCreatorCascade.cxx +++ b/PWGHF/TableProducer/candidateCreatorCascade.cxx @@ -83,6 +83,9 @@ struct HfCandidateCreatorCascade { double mass2K0sP{0.}; double bz = 0.; + using V0full = soa::Join; + using V0fCfull = soa::Join; + std::shared_ptr hCandidates; HistogramRegistry registry{"registry"}; @@ -141,9 +144,6 @@ struct HfCandidateCreatorCascade { setLabelHistoCands(hCandidates); } - using V0full = soa::Join; - using V0fCfull = soa::Join; - template void runCreatorCascade(Coll const&, aod::HfCascades const& rowsTrackIndexCasc, @@ -441,22 +441,24 @@ struct HfCandidateCreatorCascadeMc { Produces rowMcMatchRec; Produces rowMcMatchGen; + // Configuration + Configurable rejectBackground{"rejectBackground", true, "Reject particles from background events"}; + HfEventSelectionMc hfEvSelMc; // mc event selection and monitoring + using MyTracksWMc = soa::Join; using BCsInfo = soa::Join; - HistogramRegistry registry{"registry"}; - - // Configuration - o2::framework::Configurable rejectBackground{"rejectBackground", true, "Reject particles from background events"}; - using McCollisionsNoCents = soa::Join; using McCollisionsFT0Cs = soa::Join; using McCollisionsFT0Ms = soa::Join; using McCollisionsCentFT0Ms = soa::Join; + + Preslice mcParticlesPerMcCollision = aod::mcparticle::mcCollisionId; PresliceUnsorted colPerMcCollision = aod::mccollisionlabel::mcCollisionId; PresliceUnsorted colPerMcCollisionFT0C = aod::mccollisionlabel::mcCollisionId; PresliceUnsorted colPerMcCollisionFT0M = aod::mccollisionlabel::mcCollisionId; - Preslice mcParticlesPerMcCollision = aod::mcparticle::mcCollisionId; + + HistogramRegistry registry{"registry"}; // inspect for which zPvPosMax cut was set for reconstructed void init(InitContext& initContext) diff --git a/PWGHF/TableProducer/candidateCreatorDstar.cxx b/PWGHF/TableProducer/candidateCreatorDstar.cxx index d549a53b81e..323794bed1b 100644 --- a/PWGHF/TableProducer/candidateCreatorDstar.cxx +++ b/PWGHF/TableProducer/candidateCreatorDstar.cxx @@ -500,29 +500,29 @@ struct HfCandidateCreatorDstar { struct HfCandidateCreatorDstarExpressions { Spawns rowsCandidateD0; + Spawns rowsCandidateDstar; Produces rowsMcMatchRecD0; Produces rowsMcMatchGenD0; - - Spawns rowsCandidateDstar; Produces rowsMcMatchRecDstar; Produces rowsMcMatchGenDstar; // Configuration - o2::framework::Configurable rejectBackground{"rejectBackground", true, "Reject particles from background events"}; - o2::framework::Configurable matchKinkedDecayTopology{"matchKinkedDecayTopology", false, "Match also candidates with tracks that decay with kinked topology"}; - o2::framework::Configurable matchInteractionsWithMaterial{"matchInteractionsWithMaterial", false, "Match also candidates with tracks that interact with material"}; + Configurable rejectBackground{"rejectBackground", true, "Reject particles from background events"}; + Configurable matchKinkedDecayTopology{"matchKinkedDecayTopology", false, "Match also candidates with tracks that decay with kinked topology"}; + Configurable matchInteractionsWithMaterial{"matchInteractionsWithMaterial", false, "Match also candidates with tracks that interact with material"}; using McCollisionsNoCents = soa::Join; using McCollisionsFT0Cs = soa::Join; using McCollisionsFT0Ms = soa::Join; using McCollisionsCentFT0Ms = soa::Join; + using BCsInfo = soa::Join; + + Preslice mcParticlesPerMcCollision = aod::mcparticle::mcCollisionId; PresliceUnsorted colPerMcCollision = aod::mccollisionlabel::mcCollisionId; PresliceUnsorted colPerMcCollisionFT0C = aod::mccollisionlabel::mcCollisionId; PresliceUnsorted colPerMcCollisionFT0M = aod::mccollisionlabel::mcCollisionId; - Preslice mcParticlesPerMcCollision = aod::mcparticle::mcCollisionId; HfEventSelectionMc hfEvSelMc; // mc event selection and monitoring - using BCsInfo = soa::Join; HistogramRegistry registry{"registry"}; // inspect for which zPvPosMax cut was set for reconstructed diff --git a/PWGHF/TableProducer/candidateCreatorLb.cxx b/PWGHF/TableProducer/candidateCreatorLb.cxx index ff44b194d39..44062fca4f5 100644 --- a/PWGHF/TableProducer/candidateCreatorLb.cxx +++ b/PWGHF/TableProducer/candidateCreatorLb.cxx @@ -68,6 +68,9 @@ struct HfCandidateCreatorLb { Filter filterSelectCandidates = (aod::hf_sel_candidate_lc::isSelLcToPKPi >= selectionFlagLc || aod::hf_sel_candidate_lc::isSelLcToPiKP >= selectionFlagLc); + std::shared_ptr hCandidatesLc, hCandidatesLb; + HistogramRegistry registry{"registry"}; + OutputObj hMassLcToPKPi{TH1F("hMassLcToPKPi", "#Lambda_{c}^{#plus} candidates;inv. mass (pK^{#minus} #pi^{#plus}) (GeV/#it{c}^{2});entries", 500, 0., 5.)}; OutputObj hPtLc{TH1F("hPtLc", "#Lambda_{c}^{#plus} candidates;#Lambda_{c}^{#plus} candidate #it{p}_{T} (GeV/#it{c});entries", 100, 0., 10.)}; OutputObj hPtPion{TH1F("hPtPion", "#pi^{#minus} candidates;#pi^{#minus} candidate #it{p}_{T} (GeV/#it{c});entries", 100, 0., 10.)}; @@ -76,9 +79,6 @@ struct HfCandidateCreatorLb { OutputObj hCovPVXX{TH1F("hCovPVXX", "2-prong candidates;XX element of cov. matrix of prim. vtx. position (cm^{2});entries", 100, 0., 1.e-4)}; OutputObj hCovSVXX{TH1F("hCovSVXX", "2-prong candidates;XX element of cov. matrix of sec. vtx. position (cm^{2});entries", 100, 0., 0.2)}; - std::shared_ptr hCandidatesLc, hCandidatesLb; - HistogramRegistry registry{"registry"}; - void init(InitContext const&) { massPi = MassPiMinus; @@ -242,19 +242,18 @@ struct HfCandidateCreatorLb { hMassLbToLcPi->Fill(massLcPi); } } // pi- loop - } // Lc loop - } // process -}; // struct + } // Lc loop + } // process +}; // struct /// Extends the base table with expression columns. struct HfCandidateCreatorLbExpressions { Spawns rowCandidateLb; - - void init(InitContext const&) {} - Produces rowMcMatchRec; Produces rowMcMatchGen; + void init(InitContext const&) {} + /// @brief dummy process function, to be run on data void process(aod::Tracks const&) {} @@ -306,8 +305,8 @@ struct HfCandidateCreatorLbExpressions { // Λb → Λc+ π- if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kLambdaB0, std::array{static_cast(Pdg::kLambdaCPlus), -kPiPlus}, true)) { // Λc+ → p K- π+ - auto LcCandMC = mcParticles.rawIteratorAt(particle.daughtersIds().front()); - if (RecoDecay::isMatchedMCGen(mcParticles, LcCandMC, static_cast(Pdg::kLambdaCPlus), std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign)) { + auto candLcMc = mcParticles.rawIteratorAt(particle.daughtersIds().front()); + if (RecoDecay::isMatchedMCGen(mcParticles, candLcMc, static_cast(Pdg::kLambdaCPlus), std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign)) { flag = sign * (1 << hf_cand_lb::DecayType::LbToLcPi); } } diff --git a/PWGHF/TableProducer/candidateCreatorSigmac0plusplusCascade.cxx b/PWGHF/TableProducer/candidateCreatorSigmac0plusplusCascade.cxx index 082216d86e8..857e8b68bf9 100644 --- a/PWGHF/TableProducer/candidateCreatorSigmac0plusplusCascade.cxx +++ b/PWGHF/TableProducer/candidateCreatorSigmac0plusplusCascade.cxx @@ -68,6 +68,8 @@ struct HfCandidateCreatorSigmac0plusplusCascade { Configurable softPiDcaZMax{"softPiDcaZMax", 0.065, "Soft pion max dcaZ (cm)"}; Configurable addQA{"addQA", true, "Switch for the qa PLOTS"}; + HfHelper hfHelper; + using TracksWithPID = soa::Join; /// Filter the candidate Λc+ used for the Σc0,++ creation @@ -78,7 +80,6 @@ struct HfCandidateCreatorSigmac0plusplusCascade { Preslice trackIndicesPerCollision = aod::track::collisionId; HistogramRegistry registry; - HfHelper hfHelper; void init(InitContext&) { @@ -290,9 +291,9 @@ struct HfCandidateCreatorSigmac0plusplusCascade { continue; } registry.fill(HIST("candidateStat"), 1); - auto K0short = candidateLc.v0_as(); // get the soft pions for the given collId - auto pos = K0short.template posTrack_as(); - auto neg = K0short.template negTrack_as(); + auto k0Short = candidateLc.v0_as(); // get the soft pions for the given collId + auto pos = k0Short.template posTrack_as(); + auto neg = k0Short.template negTrack_as(); for (const auto& trackSoftPi : tracksInThisCollision) { int chargeSoftPi = trackSoftPi.sign(); if (chargeSoftPi == pos.sign() && trackSoftPi.globalIndex() == pos.globalIndex()) { diff --git a/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx b/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx index 385bd90586d..f05479d03da 100644 --- a/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx +++ b/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx @@ -16,7 +16,7 @@ /// \author Yunfan Liu , China University of Geosciences #ifndef HomogeneousField -#define HomogeneousField +#define HomogeneousField // o2-linter: disable=name/macro (required by KFParticle) #endif #include @@ -797,7 +797,7 @@ struct HfCandidateCreatorXic0Omegac0 { // mass window cut on lambda before mass constraint float massLam, sigLam; kfV0.GetMass(massLam, sigLam); - if (TMath::Abs(massLam - MassLambda0) > lambdaMassWindow) + if (std::abs(massLam - MassLambda0) > lambdaMassWindow) continue; // err_mass>0 of Lambda if (sigLam <= 0) @@ -1264,7 +1264,7 @@ struct HfCandidateCreatorXic0Omegac0 { // mass window cut on lambda before mass constraint float massLam, sigLam; kfV0.GetMass(massLam, sigLam); - if (TMath::Abs(massLam - MassLambda0) > lambdaMassWindow) + if (std::abs(massLam - MassLambda0) > lambdaMassWindow) continue; // err_mass>0 of Lambda @@ -1819,20 +1819,21 @@ struct HfCandidateCreatorXic0Omegac0Mc { Produces rowMCMatchGenToOmegaK; // Configuration - o2::framework::Configurable rejectBackground{"rejectBackground", true, "Reject particles from background events"}; + Configurable rejectBackground{"rejectBackground", true, "Reject particles from background events"}; using MyTracksWMc = soa::Join; using McCollisionsNoCents = soa::Join; using McCollisionsFT0Cs = soa::Join; using McCollisionsFT0Ms = soa::Join; using McCollisionsCentFT0Ms = soa::Join; + using BCsInfo = soa::Join; + + Preslice mcParticlesPerMcCollision = aod::mcparticle::mcCollisionId; PresliceUnsorted colPerMcCollision = aod::mccollisionlabel::mcCollisionId; PresliceUnsorted colPerMcCollisionFT0C = aod::mccollisionlabel::mcCollisionId; PresliceUnsorted colPerMcCollisionFT0M = aod::mccollisionlabel::mcCollisionId; - Preslice mcParticlesPerMcCollision = aod::mcparticle::mcCollisionId; HfEventSelectionMc hfEvSelMc; // mc event selection and monitoring - using BCsInfo = soa::Join; std::shared_ptr hGenCharmBaryonPtRapidityTightXicToXiPi, hGenCharmBaryonPtRapidityLooseXicToXiPi, hGenCharmBaryonPtRapidityTightOmegacToXiPi, hGenCharmBaryonPtRapidityLooseOmegacToXiPi, hGenCharmBaryonPtRapidityTightOmegacToOmegaPi, hGenCharmBaryonPtRapidityLooseOmegacToOmegaPi, hGenCharmBaryonPtRapidityTightOmegacToOmegaK, hGenCharmBaryonPtRapidityLooseOmegacToOmegaK; diff --git a/PWGHF/TableProducer/candidateCreatorXicToXiPiPi.cxx b/PWGHF/TableProducer/candidateCreatorXicToXiPiPi.cxx index ffe671328ab..7d87dcd5888 100644 --- a/PWGHF/TableProducer/candidateCreatorXicToXiPiPi.cxx +++ b/PWGHF/TableProducer/candidateCreatorXicToXiPiPi.cxx @@ -18,7 +18,7 @@ /// \author Jinjoo Seo , Heidelberg University #ifndef HomogeneousField -#define HomogeneousField // o2-linter: disable=name/macro +#define HomogeneousField // o2-linter: disable=name/macro (required by KFParticle) #endif #include diff --git a/PWGHF/TableProducer/candidateSelectorBplusToD0Pi.cxx b/PWGHF/TableProducer/candidateSelectorBplusToD0Pi.cxx index add94de2553..fb520f85b21 100644 --- a/PWGHF/TableProducer/candidateSelectorBplusToD0Pi.cxx +++ b/PWGHF/TableProducer/candidateSelectorBplusToD0Pi.cxx @@ -86,10 +86,10 @@ struct HfCandidateSelectorBplusToD0Pi { HfHelper hfHelper; TrackSelectorPi selectorPion; - HistogramRegistry registry{"registry"}; - using TracksPion = soa::Join; + HistogramRegistry registry{"registry"}; + void init(InitContext const&) { std::array doprocess{doprocessSelection, doprocessSelectionWithDmesMl}; diff --git a/PWGHF/TableProducer/candidateSelectorBsToDsPi.cxx b/PWGHF/TableProducer/candidateSelectorBsToDsPi.cxx index e85be935a89..cfd8f418e0e 100644 --- a/PWGHF/TableProducer/candidateSelectorBsToDsPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorBsToDsPi.cxx @@ -66,7 +66,7 @@ struct HfCandidateSelectorBsToDsPi { // CCDB configuration Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Configurable> modelPathsCCDB{"modelPathsCCDB", std::vector{"EventFiltering/PWGHF/BDTBs"}, "Paths of models on CCDB"}; - Configurable> onnxFileNames{"onnxFilesCCDB", std::vector{"ModelHandler_onnx_BsToDsPi.onnx"}, "ONNX file names on CCDB for each pT bin (if not from CCDB full path)"}; + Configurable> onnxFileNames{"onnxFileNames", std::vector{"ModelHandler_onnx_BsToDsPi.onnx"}, "ONNX file names on CCDB for each pT bin (if not from CCDB full path)"}; Configurable timestampCCDB{"timestampCCDB", -1, "timestamp of the ONNX file for ML model used to query in CCDB"}; Configurable loadModelsFromCCDB{"loadModelsFromCCDB", false, "Flag to enable or disable the loading of models from CCDB"}; diff --git a/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaKa.cxx b/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaKa.cxx index b523f8bd7a4..ce5787b730a 100644 --- a/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaKa.cxx +++ b/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaKa.cxx @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file candidateSelectorToOmegaKa.cxx +/// \file candidateSelectorOmegac0ToOmegaKa.cxx /// \brief Omegac0 → Omega Ka selection task /// \author Federica Zanone , Heidelberg University @@ -29,11 +29,11 @@ using namespace o2::aod; using namespace o2::framework; using namespace o2::analysis; -enum pidInfoStored { - kPiFromLam = 0, - kPrFromLam, - kKaFromCasc, - kKaFromCharm +enum PidInfoStored { + PiFromLam = 0, + PrFromLam, + KaFromCasc, + KaFromCharm }; /// Struct for applying Omegac0 -> Omega pi selection cuts @@ -423,28 +423,28 @@ struct HfCandidateSelectorToOmegaKa { } if (trackPiFromLam.hasTPC()) { - SETBIT(infoTpcStored, kPiFromLam); + SETBIT(infoTpcStored, PiFromLam); } if (trackPrFromLam.hasTPC()) { - SETBIT(infoTpcStored, kPrFromLam); + SETBIT(infoTpcStored, PrFromLam); } if (trackKaFromCasc.hasTPC()) { - SETBIT(infoTpcStored, kKaFromCasc); + SETBIT(infoTpcStored, KaFromCasc); } if (trackKaFromCharm.hasTPC()) { - SETBIT(infoTpcStored, kKaFromCharm); + SETBIT(infoTpcStored, KaFromCharm); } if (trackPiFromLam.hasTOF()) { - SETBIT(infoTofStored, kPiFromLam); + SETBIT(infoTofStored, PiFromLam); } if (trackPrFromLam.hasTOF()) { - SETBIT(infoTofStored, kPrFromLam); + SETBIT(infoTofStored, PrFromLam); } if (trackKaFromCasc.hasTOF()) { - SETBIT(infoTofStored, kKaFromCasc); + SETBIT(infoTofStored, KaFromCasc); } if (trackKaFromCharm.hasTOF()) { - SETBIT(infoTofStored, kKaFromCharm); + SETBIT(infoTofStored, KaFromCharm); } if (usePidTpcOnly) { @@ -567,7 +567,7 @@ struct HfCandidateSelectorToOmegaKa { } } } // end process -}; // end struct +}; // end struct WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx b/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx index 26b297ba8bd..4ebe3a080fd 100644 --- a/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file candidateSelectorToOmegaPi.cxx +/// \file candidateSelectorOmegac0ToOmegaPi.cxx /// \brief Omegac0 → Omega Pi selection task /// \author Federica Zanone , Heidelberg University /// \author Ruiqi Yin , Fudan University @@ -37,11 +37,11 @@ using namespace o2::aod; using namespace o2::framework; using namespace o2::analysis; -enum pidInfoStored { - kPiFromLam = 0, - kPrFromLam, - kKaFromCasc, - kPiFromCharm +enum PidInfoStored { + PiFromLam = 0, + PrFromLam, + KaFromCasc, + PiFromCharm }; /// Struct for applying Omegac0 -> Omega pi selection cuts @@ -164,7 +164,7 @@ struct HfCandidateSelectorToOmegaPi { Configurable> cutDirMl{"cutDirMl", std::vector{hf_cuts_ml::vecCutDir}, "Whether to reject score values greater or smaller than the threshold"}; Configurable> cutsMl{"cutsMl", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; Configurable nClassesMl{"nClassesMl", static_cast(hf_cuts_ml::NCutScores), "Number of classes in ML model"}; - Configurable> namesInputFeatures{"namesInputFeaturesW", std::vector{"feature1", "feature2"}, "Names of ML model input features"}; + Configurable> namesInputFeatures{"namesInputFeatures", std::vector{"feature1", "feature2"}, "Names of ML model input features"}; // CCDB configuration Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Configurable> modelPathsCCDB{"modelPathsCCDB", std::vector{"EventFiltering/PWGHF/BDTOmegac0"}, "Paths of models on CCDB"}; @@ -640,28 +640,28 @@ struct HfCandidateSelectorToOmegaPi { } if (trackPiFromLam.hasTPC()) { - SETBIT(infoTpcStored, kPiFromLam); + SETBIT(infoTpcStored, PiFromLam); } if (trackPrFromLam.hasTPC()) { - SETBIT(infoTpcStored, kPrFromLam); + SETBIT(infoTpcStored, PrFromLam); } if (trackKaFromCasc.hasTPC()) { - SETBIT(infoTpcStored, kKaFromCasc); + SETBIT(infoTpcStored, KaFromCasc); } if (trackPiFromCharm.hasTPC()) { - SETBIT(infoTpcStored, kPiFromCharm); + SETBIT(infoTpcStored, PiFromCharm); } if (trackPiFromLam.hasTOF()) { - SETBIT(infoTofStored, kPiFromLam); + SETBIT(infoTofStored, PiFromLam); } if (trackPrFromLam.hasTOF()) { - SETBIT(infoTofStored, kPrFromLam); + SETBIT(infoTofStored, PrFromLam); } if (trackKaFromCasc.hasTOF()) { - SETBIT(infoTofStored, kKaFromCasc); + SETBIT(infoTofStored, KaFromCasc); } if (trackPiFromCharm.hasTOF()) { - SETBIT(infoTofStored, kPiFromCharm); + SETBIT(infoTofStored, PiFromCharm); } if (usePidTpcOnly) { diff --git a/PWGHF/TableProducer/candidateSelectorToXiPi.cxx b/PWGHF/TableProducer/candidateSelectorToXiPi.cxx index 20fb96ece0b..8f118058f3e 100644 --- a/PWGHF/TableProducer/candidateSelectorToXiPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorToXiPi.cxx @@ -29,11 +29,11 @@ using namespace o2::aod; using namespace o2::framework; using namespace o2::analysis; -enum pidInfoStored { - kPiFromLam = 0, - kPrFromLam, - kPiFromCasc, - kPiFromCharm +enum PidInfoStored { + PiFromLam = 0, + PrFromLam, + PiFromCasc, + PiFromCharm }; /// Struct for applying Omegac0/Xic0 selection cuts @@ -408,28 +408,28 @@ struct HfCandidateSelectorToXiPi { } if (trackPiFromLam.hasTPC()) { - SETBIT(infoTpcStored, kPiFromLam); + SETBIT(infoTpcStored, PiFromLam); } if (trackPrFromLam.hasTPC()) { - SETBIT(infoTpcStored, kPrFromLam); + SETBIT(infoTpcStored, PrFromLam); } if (trackPiFromCasc.hasTPC()) { - SETBIT(infoTpcStored, kPiFromCasc); + SETBIT(infoTpcStored, PiFromCasc); } if (trackPiFromCharm.hasTPC()) { - SETBIT(infoTpcStored, kPiFromCharm); + SETBIT(infoTpcStored, PiFromCharm); } if (trackPiFromLam.hasTOF()) { - SETBIT(infoTofStored, kPiFromLam); + SETBIT(infoTofStored, PiFromLam); } if (trackPrFromLam.hasTOF()) { - SETBIT(infoTofStored, kPrFromLam); + SETBIT(infoTofStored, PrFromLam); } if (trackPiFromCasc.hasTOF()) { - SETBIT(infoTofStored, kPiFromCasc); + SETBIT(infoTofStored, PiFromCasc); } if (trackPiFromCharm.hasTOF()) { - SETBIT(infoTofStored, kPiFromCharm); + SETBIT(infoTofStored, PiFromCharm); } if (usePidTpcOnly) { @@ -552,7 +552,7 @@ struct HfCandidateSelectorToXiPi { } } } // end process -}; // end struct +}; // end struct WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGHF/TableProducer/candidateSelectorXic0ToXiPiKf.cxx b/PWGHF/TableProducer/candidateSelectorXic0ToXiPiKf.cxx index 46b4169d564..904b8c86b5b 100644 --- a/PWGHF/TableProducer/candidateSelectorXic0ToXiPiKf.cxx +++ b/PWGHF/TableProducer/candidateSelectorXic0ToXiPiKf.cxx @@ -30,10 +30,10 @@ using namespace o2::framework; using namespace o2::analysis; enum PidInfoStored { - KPiFromLam = 0, - KPrFromLam, - KPiFromCasc, - KPiFromCharm + PiFromLam = 0, + PrFromLam, + PiFromCasc, + PiFromCharm }; /// Struct for applying Xic0 -> Xi pi selection cuts @@ -407,28 +407,28 @@ struct HfCandidateSelectorXic0ToXiPiKf { } if (trackPiFromLam.hasTPC()) { - SETBIT(infoTpcStored, KPiFromLam); + SETBIT(infoTpcStored, PiFromLam); } if (trackPrFromLam.hasTPC()) { - SETBIT(infoTpcStored, KPiFromLam); + SETBIT(infoTpcStored, PiFromLam); } if (trackPiFromCasc.hasTPC()) { - SETBIT(infoTpcStored, KPiFromCasc); + SETBIT(infoTpcStored, PiFromCasc); } if (trackPiFromCharm.hasTPC()) { - SETBIT(infoTpcStored, KPiFromCharm); + SETBIT(infoTpcStored, PiFromCharm); } if (trackPiFromLam.hasTOF()) { - SETBIT(infoTofStored, KPiFromLam); + SETBIT(infoTofStored, PiFromLam); } if (trackPrFromLam.hasTOF()) { - SETBIT(infoTofStored, KPiFromLam); + SETBIT(infoTofStored, PiFromLam); } if (trackPiFromCasc.hasTOF()) { - SETBIT(infoTofStored, KPiFromCasc); + SETBIT(infoTofStored, PiFromCasc); } if (trackPiFromCharm.hasTOF()) { - SETBIT(infoTofStored, KPiFromCharm); + SETBIT(infoTofStored, PiFromCharm); } if (usePidTpcOnly) { diff --git a/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx b/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx index 1b005b89d4e..f9bd95d6aa7 100644 --- a/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx @@ -76,8 +76,6 @@ struct HfCandidateSelectorXicToPKPi { // QA switch Configurable activateQA{"activateQA", true, "Flag to enable QA histogram"}; - HistogramRegistry registry{"registry"}; - o2::analysis::HfMlResponseXicToPKPi hfMlResponse; std::vector outputMlXicToPKPi = {}; std::vector outputMlXicToPiKP = {}; @@ -89,6 +87,8 @@ struct HfCandidateSelectorXicToPKPi { using TracksSel = soa::Join; + HistogramRegistry registry{"registry"}; + void init(InitContext const&) { selectorPion.setRangePtTpc(ptPidTpcMin, ptPidTpcMax); diff --git a/PWGHF/TableProducer/mcPidTof.cxx b/PWGHF/TableProducer/mcPidTof.cxx index cdba1ab70c5..52ae2e2ebf4 100644 --- a/PWGHF/TableProducer/mcPidTof.cxx +++ b/PWGHF/TableProducer/mcPidTof.cxx @@ -395,7 +395,7 @@ struct tofSignal { if (enableTablepidTOFFlags) { tableFlags.reserve(tracks.size()); } - for (auto& trk : tracks) { + for (auto const& trk : tracks) { const float& sig = o2::pid::tof::TOFSignal::GetTOFSignal(trk); if (enableQaHistograms) { histos.fill(HIST("tofSignal"), sig); @@ -514,7 +514,7 @@ struct tofEventTime { Preslice perCollision = aod::track::collisionId; template using ResponseImplementationEvTime = o2::pid::tof::ExpTimes; - void process(TrksWtof& tracks, + void process(TrksWtof const& tracks, aod::FT0s const&, EvTimeCollisionsFT0 const&, aod::BCsWithTimestamps const& bcs) diff --git a/PWGHF/TableProducer/pidCreator.cxx b/PWGHF/TableProducer/pidCreator.cxx index 6b917d6664d..57da53a0d30 100644 --- a/PWGHF/TableProducer/pidCreator.cxx +++ b/PWGHF/TableProducer/pidCreator.cxx @@ -39,8 +39,8 @@ struct HfPidCreator { Produces trackPidFullPr; Produces trackPidTinyPr; - static constexpr float defaultNSigmaTolerance = .1f; - static constexpr float defaultNSigma = -999.f + defaultNSigmaTolerance; // -999.f is the default value set in TPCPIDResponse.h and PIDTOF.h + static constexpr float NSigmaToleranceDefault = .1f; + static constexpr float NSigmaDefault = -999.f + NSigmaToleranceDefault; // -999.f is the default value set in TPCPIDResponse.h and PIDTOF.h /// Function to check whether the process function flag matches the need for filling the table /// \param initContext workflow context (argument of the init function) @@ -87,13 +87,13 @@ struct HfPidCreator { tpcNSigma *= aod::pidtpc_tiny::binning::bin_width; tofNSigma *= aod::pidtof_tiny::binning::bin_width; } - if ((tpcNSigma > defaultNSigma) && (tofNSigma > defaultNSigma)) { // TPC and TOF + if ((tpcNSigma > NSigmaDefault) && (tofNSigma > NSigmaDefault)) { // TPC and TOF return std::sqrt(.5f * (tpcNSigma * tpcNSigma + tofNSigma * tofNSigma)); } - if (tpcNSigma > defaultNSigma) { // only TPC + if (tpcNSigma > NSigmaDefault) { // only TPC return std::abs(tpcNSigma); } - if (tofNSigma > defaultNSigma) { // only TOF + if (tofNSigma > NSigmaDefault) { // only TOF return std::abs(tofNSigma); } return tofNSigma; // no TPC nor TOF diff --git a/PWGHF/TableProducer/trackIndexSkimCreator.cxx b/PWGHF/TableProducer/trackIndexSkimCreator.cxx index cd696ccac09..29aab0c1a6d 100644 --- a/PWGHF/TableProducer/trackIndexSkimCreator.cxx +++ b/PWGHF/TableProducer/trackIndexSkimCreator.cxx @@ -91,7 +91,7 @@ enum ChannelsProtonPid { NChannelsProtonPid }; // kaon PID (opposite-sign track in 3-prong decays) -constexpr int channelKaonPid = ChannelsProtonPid::NChannelsProtonPid; +constexpr int ChannelKaonPid = ChannelsProtonPid::NChannelsProtonPid; /// Event selection struct HfTrackIndexSkimCreatorTagSelCollisions { @@ -198,9 +198,6 @@ struct HfTrackIndexSkimCreatorTagSelCollisions { /// Track selection struct HfTrackIndexSkimCreatorTagSelTracks { - SliceCache cache; - Preslice perCol = aod::track::collisionId; - Produces rowSelectedTrack; Produces tabPvRefitTrack; @@ -257,12 +254,22 @@ struct HfTrackIndexSkimCreatorTagSelTracks { Configurable ccdbPathGrpMag{"ccdbPathGrpMag", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object (Run 3)"}; } config; + SliceCache cache; + // Needed for PV refitting Service ccdb; o2::base::MatLayerCylSet* lut; o2::base::Propagator::MatCorrType noMatCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; int runNumber; + using TracksWithSelAndDca = soa::Join; + using TracksWithSelAndDcaAndPidTpc = soa::Join; + using TracksWithSelAndDcaAndPidTof = soa::Join; + using TracksWithSelAndDcaAndPidTpcTof = soa::Join; + + Preslice perCol = aod::track::collisionId; + Preslice trackIndicesPerCollision = aod::track_association::collisionId; + // single-track cuts static const int nCuts = 4; // array of 2-prong and 3-prong cuts @@ -271,13 +278,6 @@ struct HfTrackIndexSkimCreatorTagSelTracks { std::array selectorProton; TrackSelectorKa selectorKaon; - using TracksWithSelAndDca = soa::Join; - using TracksWithSelAndDcaAndPidTpc = soa::Join; - using TracksWithSelAndDcaAndPidTof = soa::Join; - using TracksWithSelAndDcaAndPidTpcTof = soa::Join; - - Preslice trackIndicesPerCollision = aod::track_association::collisionId; - Partition pvContributors = ((aod::track::flags & static_cast(aod::track::PVContributor)) == static_cast(aod::track::PVContributor)); Partition pvContributorsWithPidTpc = ((aod::track::flags & static_cast(aod::track::PVContributor)) == static_cast(aod::track::PVContributor)); Partition pvContributorsWithPidTof = ((aod::track::flags & static_cast(aod::track::PVContributor)) == static_cast(aod::track::PVContributor)); @@ -395,10 +395,10 @@ struct HfTrackIndexSkimCreatorTagSelTracks { selectorProton[iChannel].setRangeNSigmaTof(-config.selectionsPid->get(iChannel, 5u), config.selectionsPid->get(iChannel, 5u)); // 5u == "nSigmaMaxTof" } // after the proton PID we have the kaon PID - selectorKaon.setRangePtTpc(config.selectionsPid->get(channelKaonPid, 0u), config.selectionsPid->get(channelKaonPid, 1u)); // 0u == "minPtTpc", 1u == "maxPtTpc" - selectorKaon.setRangePtTof(config.selectionsPid->get(channelKaonPid, 3u), config.selectionsPid->get(channelKaonPid, 4u)); // 3u == "minPtTof, 4u == "maxPtTof" - selectorKaon.setRangeNSigmaTpc(-config.selectionsPid->get(channelKaonPid, 2u), config.selectionsPid->get(channelKaonPid, 2u)); // 2u == "nSigmaMaxTpc" - selectorKaon.setRangeNSigmaTof(-config.selectionsPid->get(channelKaonPid, 5u), config.selectionsPid->get(channelKaonPid, 5u)); // 5u == "nSigmaMaxTof" + selectorKaon.setRangePtTpc(config.selectionsPid->get(ChannelKaonPid, 0u), config.selectionsPid->get(ChannelKaonPid, 1u)); // 0u == "minPtTpc", 1u == "maxPtTpc" + selectorKaon.setRangePtTof(config.selectionsPid->get(ChannelKaonPid, 3u), config.selectionsPid->get(ChannelKaonPid, 4u)); // 3u == "minPtTof, 4u == "maxPtTof" + selectorKaon.setRangeNSigmaTpc(-config.selectionsPid->get(ChannelKaonPid, 2u), config.selectionsPid->get(ChannelKaonPid, 2u)); // 2u == "nSigmaMaxTpc" + selectorKaon.setRangeNSigmaTof(-config.selectionsPid->get(ChannelKaonPid, 5u), config.selectionsPid->get(ChannelKaonPid, 5u)); // 5u == "nSigmaMaxTof" } /// PID track cuts (for proton only) @@ -413,7 +413,7 @@ struct HfTrackIndexSkimCreatorTagSelTracks { for (auto iChannel{0u}; iChannel < ChannelsProtonPid::NChannelsProtonPid; ++iChannel) { statusPid[iChannel] = selectorProton[iChannel].statusTof(hfTrack); } - statusPid[channelKaonPid] = selectorKaon.statusTof(hfTrack); + statusPid[ChannelKaonPid] = selectorKaon.statusTof(hfTrack); } } if constexpr (pidStrategy == ProtonPidStrategy::PidTpcOnly) { @@ -421,20 +421,20 @@ struct HfTrackIndexSkimCreatorTagSelTracks { for (auto iChannel{0u}; iChannel < ChannelsProtonPid::NChannelsProtonPid; ++iChannel) { statusPid[iChannel] = selectorProton[iChannel].statusTpc(hfTrack); } - statusPid[channelKaonPid] = selectorKaon.statusTpc(hfTrack); + statusPid[ChannelKaonPid] = selectorKaon.statusTpc(hfTrack); } } if constexpr (pidStrategy == ProtonPidStrategy::PidTpcOrTof) { for (auto iChannel{0u}; iChannel < ChannelsProtonPid::NChannelsProtonPid; ++iChannel) { statusPid[iChannel] = selectorProton[iChannel].statusTpcOrTof(hfTrack); } - statusPid[channelKaonPid] = selectorKaon.statusTpcOrTof(hfTrack); + statusPid[ChannelKaonPid] = selectorKaon.statusTpcOrTof(hfTrack); } if constexpr (pidStrategy == ProtonPidStrategy::PidTpcAndTof) { for (auto iChannel{0u}; iChannel < ChannelsProtonPid::NChannelsProtonPid; ++iChannel) { statusPid[iChannel] = selectorProton[iChannel].statusTpcAndTof(hfTrack); } - statusPid[channelKaonPid] = selectorKaon.statusTpcAndTof(hfTrack); + statusPid[ChannelKaonPid] = selectorKaon.statusTpcAndTof(hfTrack); } int8_t flag = BIT(ChannelsProtonPid::NChannelsProtonPid + 1) - 1; // all bits on (including the kaon one) @@ -1246,13 +1246,12 @@ struct HfTrackIndexSkimCreator { // filter collisions Filter filterSelectCollisions = (aod::hf_sel_collision::whyRejectColl == static_cast(0)); - - // define slice of track indices per collisions - Preslice tracksPerCollision = aod::track::collisionId; // needed for PV refit - // filter track indices Filter filterSelectTrackIds = ((aod::hf_sel_track::isSelProng & static_cast(BIT(CandidateType::Cand2Prong))) != 0u) || ((aod::hf_sel_track::isSelProng & static_cast(BIT(CandidateType::Cand3Prong))) != 0u) || ((aod::hf_sel_track::isSelProng & static_cast(BIT(CandidateType::CandDstar))) != 0u); + Preslice trackIndicesPerCollision = aod::track_association::collisionId; + // define slice of track indices per collisions + Preslice tracksPerCollision = aod::track::collisionId; // needed for PV refit // define partitions Partition positiveFor2And3Prongs = aod::hf_sel_track::isPositive == true && (((aod::hf_sel_track::isSelProng & static_cast(BIT(CandidateType::Cand2Prong))) != 0u) || ((aod::hf_sel_track::isSelProng & static_cast(BIT(CandidateType::Cand3Prong))) != 0u)); @@ -1920,7 +1919,7 @@ struct HfTrackIndexSkimCreator { } recalcPvRefit = true; int nCandContr = 0; - for (uint64_t myGlobalID : vecCandPvContributorGlobId) { + for (uint64_t myGlobalID : vecCandPvContributorGlobId) { // o2-linter: disable=const-ref-in-for-loop (small type) auto trackIterator = std::find(vecPvContributorGlobId.begin(), vecPvContributorGlobId.end(), myGlobalID); /// track global index if (trackIterator != vecPvContributorGlobId.end()) { /// this is a contributor, let's remove it for the PV refit @@ -2270,16 +2269,16 @@ struct HfTrackIndexSkimCreator { } if (config.debug) { - int Prong2CutStatus[kN2ProngDecays]; + int prong2CutStatus[kN2ProngDecays]; for (int iDecay2P = 0; iDecay2P < kN2ProngDecays; iDecay2P++) { - Prong2CutStatus[iDecay2P] = nCutStatus2ProngBit[iDecay2P]; + prong2CutStatus[iDecay2P] = nCutStatus2ProngBit[iDecay2P]; for (int iCut = 0; iCut < kNCuts2Prong[iDecay2P]; iCut++) { if (!cutStatus2Prong[iDecay2P][iCut]) { - CLRBIT(Prong2CutStatus[iDecay2P], iCut); + CLRBIT(prong2CutStatus[iDecay2P], iCut); } } } - rowProng2CutStatus(Prong2CutStatus[0], Prong2CutStatus[1], Prong2CutStatus[2]); // FIXME when we can do this by looping over kN2ProngDecays + rowProng2CutStatus(prong2CutStatus[0], prong2CutStatus[1], prong2CutStatus[2]); // FIXME when we can do this by looping over kN2ProngDecays } // fill histograms @@ -2350,7 +2349,7 @@ struct HfTrackIndexSkimCreator { } } - if (config.applyKaonPidIn3Prongs && !TESTBIT(trackIndexNeg1.isIdentifiedPid(), channelKaonPid)) { // continue immediately if kaon PID enabled and opposite-sign track not a kaon + if (config.applyKaonPidIn3Prongs && !TESTBIT(trackIndexNeg1.isIdentifiedPid(), ChannelKaonPid)) { // continue immediately if kaon PID enabled and opposite-sign track not a kaon if (!config.debug) { continue; } else { @@ -2526,16 +2525,16 @@ struct HfTrackIndexSkimCreator { } if (config.debug) { - int Prong3CutStatus[kN3ProngDecays]; + int prong3CutStatus[kN3ProngDecays]; for (int iDecay3P = 0; iDecay3P < kN3ProngDecays; iDecay3P++) { - Prong3CutStatus[iDecay3P] = nCutStatus3ProngBit[iDecay3P]; + prong3CutStatus[iDecay3P] = nCutStatus3ProngBit[iDecay3P]; for (int iCut = 0; iCut < kNCuts3Prong[iDecay3P]; iCut++) { if (!cutStatus3Prong[iDecay3P][iCut]) { - CLRBIT(Prong3CutStatus[iDecay3P], iCut); + CLRBIT(prong3CutStatus[iDecay3P], iCut); } } } - rowProng3CutStatus(Prong3CutStatus[0], Prong3CutStatus[1], Prong3CutStatus[2], Prong3CutStatus[3]); // FIXME when we can do this by looping over kN3ProngDecays + rowProng3CutStatus(prong3CutStatus[0], prong3CutStatus[1], prong3CutStatus[2], prong3CutStatus[3]); // FIXME when we can do this by looping over kN3ProngDecays } // fill histograms @@ -2594,7 +2593,7 @@ struct HfTrackIndexSkimCreator { } } - if (config.applyKaonPidIn3Prongs && !TESTBIT(trackIndexPos1.isIdentifiedPid(), channelKaonPid)) { // continue immediately if kaon PID enabled and opposite-sign track not a kaon + if (config.applyKaonPidIn3Prongs && !TESTBIT(trackIndexPos1.isIdentifiedPid(), ChannelKaonPid)) { // continue immediately if kaon PID enabled and opposite-sign track not a kaon if (!config.debug) { continue; } else { @@ -2771,16 +2770,16 @@ struct HfTrackIndexSkimCreator { } if (config.debug) { - int Prong3CutStatus[kN3ProngDecays]; + int prong3CutStatus[kN3ProngDecays]; for (int iDecay3P = 0; iDecay3P < kN3ProngDecays; iDecay3P++) { - Prong3CutStatus[iDecay3P] = nCutStatus3ProngBit[iDecay3P]; + prong3CutStatus[iDecay3P] = nCutStatus3ProngBit[iDecay3P]; for (int iCut = 0; iCut < kNCuts3Prong[iDecay3P]; iCut++) { if (!cutStatus3Prong[iDecay3P][iCut]) { - CLRBIT(Prong3CutStatus[iDecay3P], iCut); + CLRBIT(prong3CutStatus[iDecay3P], iCut); } } } - rowProng3CutStatus(Prong3CutStatus[0], Prong3CutStatus[1], Prong3CutStatus[2], Prong3CutStatus[3]); // FIXME when we can do this by looping over kN3ProngDecays + rowProng3CutStatus(prong3CutStatus[0], prong3CutStatus[1], prong3CutStatus[2], prong3CutStatus[3]); // FIXME when we can do this by looping over kN3ProngDecays } // fill histograms @@ -2830,7 +2829,7 @@ struct HfTrackIndexSkimCreator { if (config.doDstar && TESTBIT(isSelected2ProngCand, hf_cand_2prong::DecayType::D0ToPiK) && (pt2Prong + config.ptTolerance) * 1.2 > config.binsPtDstarToD0Pi->at(0) && whichHypo2Prong[kN2ProngDecays] != 0) { // if D* enabled and pt of the D0 is larger than the minimum of the D* one within 20% (D* and D0 momenta are very similar, always within 20% according to PYTHIA8) // second loop over positive tracks - if (TESTBIT(whichHypo2Prong[kN2ProngDecays], 0) && (!config.applyKaonPidIn3Prongs || TESTBIT(trackIndexNeg1.isIdentifiedPid(), channelKaonPid))) { // only for D0 candidates; moreover if kaon PID enabled, apply to the negative track + if (TESTBIT(whichHypo2Prong[kN2ProngDecays], 0) && (!config.applyKaonPidIn3Prongs || TESTBIT(trackIndexNeg1.isIdentifiedPid(), ChannelKaonPid))) { // only for D0 candidates; moreover if kaon PID enabled, apply to the negative track auto groupedTrackIndicesSoftPionsPos = positiveSoftPions->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); for (auto trackIndexPos2 = groupedTrackIndicesSoftPionsPos.begin(); trackIndexPos2 != groupedTrackIndicesSoftPionsPos.end(); ++trackIndexPos2) { if (trackIndexPos2 == trackIndexPos1) { @@ -2867,7 +2866,7 @@ struct HfTrackIndexSkimCreator { } // second loop over negative tracks - if (TESTBIT(whichHypo2Prong[kN2ProngDecays], 1) && (!config.applyKaonPidIn3Prongs || TESTBIT(trackIndexPos1.isIdentifiedPid(), channelKaonPid))) { // only for D0bar candidates; moreover if kaon PID enabled, apply to the positive track + if (TESTBIT(whichHypo2Prong[kN2ProngDecays], 1) && (!config.applyKaonPidIn3Prongs || TESTBIT(trackIndexPos1.isIdentifiedPid(), ChannelKaonPid))) { // only for D0bar candidates; moreover if kaon PID enabled, apply to the positive track auto groupedTrackIndicesSoftPionsNeg = negativeSoftPions->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); for (auto trackIndexNeg2 = groupedTrackIndicesSoftPionsNeg.begin(); trackIndexNeg2 != groupedTrackIndicesSoftPionsNeg.end(); ++trackIndexNeg2) { if (trackIndexNeg1 == trackIndexNeg2) { diff --git a/PWGHF/TableProducer/treeCreatorB0ToDPi.cxx b/PWGHF/TableProducer/treeCreatorB0ToDPi.cxx index e46f2494d14..0288f19cac9 100644 --- a/PWGHF/TableProducer/treeCreatorB0ToDPi.cxx +++ b/PWGHF/TableProducer/treeCreatorB0ToDPi.cxx @@ -162,7 +162,7 @@ struct HfTreeCreatorB0ToDPi { Produces rowCandidateFullParticles; Produces rowCandidateLite; - Configurable selectionFlagB0{"selectionB0", 1, "Selection Flag for B0"}; + Configurable selectionFlagB0{"selectionFlagB0", 1, "Selection Flag for B0"}; Configurable fillCandidateLiteTable{"fillCandidateLiteTable", false, "Switch to fill lite table with candidate properties"}; // parameters for production of training samples Configurable fillOnlySignal{"fillOnlySignal", false, "Flag to fill derived tables with signal for ML trainings"}; diff --git a/PWGHF/TableProducer/treeCreatorToXiPi.cxx b/PWGHF/TableProducer/treeCreatorToXiPi.cxx index e583b4f2253..22beaa2d202 100644 --- a/PWGHF/TableProducer/treeCreatorToXiPi.cxx +++ b/PWGHF/TableProducer/treeCreatorToXiPi.cxx @@ -249,13 +249,14 @@ struct HfTreeCreatorToXiPi { Configurable zPvCut{"zPvCut", 10., "Cut on absolute value of primary vertex z coordinate"}; SliceCache cache; - Preslice candXicPerCollision = aod::hf_cand_xic0_omegac0::collisionId; using Cents = soa::Join; using MyTrackTable = soa::Join; using MyEventTable = soa::Join; using MyEventTableWithCent = soa::Join; + Preslice candXicPerCollision = aod::hf_cand_xic0_omegac0::collisionId; + void init(InitContext const&) { if ((doprocessMcLiteXic0 && doprocessMcLiteOmegac0) || (doprocessMcFullXic0 && doprocessMcFullOmegac0)) { From e8b0095599bedb38c2b659532e0288b45c91cc16 Mon Sep 17 00:00:00 2001 From: Antonio Palasciano <52152842+apalasciano@users.noreply.github.com> Date: Mon, 3 Mar 2025 10:07:24 +0100 Subject: [PATCH 0510/1650] [PWGHF] Add daughters and collision infos to charm hadrons QA (#10248) --- PWGHF/Tasks/taskCharmHadImpactPar.cxx | 131 +++++++++++++++++++++----- 1 file changed, 106 insertions(+), 25 deletions(-) diff --git a/PWGHF/Tasks/taskCharmHadImpactPar.cxx b/PWGHF/Tasks/taskCharmHadImpactPar.cxx index 13dad0d2d4d..e999dbdd575 100644 --- a/PWGHF/Tasks/taskCharmHadImpactPar.cxx +++ b/PWGHF/Tasks/taskCharmHadImpactPar.cxx @@ -13,22 +13,30 @@ /// \brief Analysis task to produce impact-parameter distributions of charm hadrons /// /// \author Fabrizio Grosa , CERN +/// \author Antonio Palasciano , INFN Bari #include +#include +#include "Common/Core/RecoDecay.h" #include "Framework/AnalysisTask.h" #include "Framework/HistogramRegistry.h" #include "Framework/runDataProcessing.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/CentralityEstimation.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" +#include "PWGHF/Utils/utilsEvSelHf.h" using namespace o2; +using namespace o2::aod; using namespace o2::analysis; using namespace o2::constants::math; using namespace o2::framework; using namespace o2::framework::expressions; +using namespace o2::hf_centrality; +using namespace o2::hf_occupancy; enum Channel : uint8_t { DplusToKPiPi = 0, @@ -40,6 +48,8 @@ namespace o2::aod { namespace hf_charm_cand_lite { +DECLARE_SOA_COLUMN(Centrality, centrality, float); //! Centrality (or multiplicity) percentile +DECLARE_SOA_COLUMN(Occupancy, occupancy, float); //! Occupancy DECLARE_SOA_COLUMN(M, m, float); //! Invariant mass of candidate (GeV/c2) DECLARE_SOA_COLUMN(Pt, pt, float); //! Transverse momentum of candidate (GeV/c) DECLARE_SOA_COLUMN(Y, y, float); //! Rapidity of candidate @@ -48,9 +58,28 @@ DECLARE_SOA_COLUMN(ImpactParameterXY, impactParameterXY, float); //! Dca XY of c DECLARE_SOA_COLUMN(MlScoreBkg, mlScoreBkg, float); //! ML score for background class DECLARE_SOA_COLUMN(MlScorePrompt, mlScorePrompt, float); //! ML Prompt score for prompt class DECLARE_SOA_COLUMN(MlScoreNonPrompt, mlScoreNonPrompt, float); //! ML Non Prompt score for non prompt class +DECLARE_SOA_COLUMN(PtProng0, ptProng0, float); //! Pt of the 1st daughter +DECLARE_SOA_COLUMN(PtProng1, ptProng1, float); //! Pt of the 2nd daughter +DECLARE_SOA_COLUMN(PtProng2, ptProng2, float); //! Pt of the 3rd daughter (if present) +DECLARE_SOA_COLUMN(PhiProng0, phiProng0, float); //! Phi of the 1st daughter +DECLARE_SOA_COLUMN(PhiProng1, phiProng1, float); //! Phi of the 2nd daughter +DECLARE_SOA_COLUMN(PhiProng2, phiProng2, float); //! Phi of the 3rd daughter (if present) +DECLARE_SOA_COLUMN(EtaProng0, etaProng0, float); //! Eta of the 1st daughter +DECLARE_SOA_COLUMN(EtaProng1, etaProng1, float); //! Eta of the 2nd daughter +DECLARE_SOA_COLUMN(EtaProng2, etaProng2, float); //! Eta of the 3rd daughter (if present) } // namespace hf_charm_cand_lite -DECLARE_SOA_TABLE(HfCharmCandLites, "AOD", "HFCHARMCANDLITE", //! Table with some B+ properties +DECLARE_SOA_TABLE(HfCharmCandLites, "AOD", "HFCHARMCANDLITE", //! Table with some charm hadron properties + collision::BCId, + collision::NumContrib, + collision::PosX, + collision::PosY, + collision::PosZ, + hf_charm_cand_lite::Centrality, + hf_charm_cand_lite::Occupancy, + hf_cand::XSecondaryVertex, + hf_cand::YSecondaryVertex, + hf_cand::ZSecondaryVertex, hf_charm_cand_lite::M, hf_charm_cand_lite::Pt, hf_charm_cand_lite::Y, @@ -58,7 +87,16 @@ DECLARE_SOA_TABLE(HfCharmCandLites, "AOD", "HFCHARMCANDLITE", //! Table with som hf_charm_cand_lite::ImpactParameterXY, hf_charm_cand_lite::MlScoreBkg, hf_charm_cand_lite::MlScorePrompt, - hf_charm_cand_lite::MlScoreNonPrompt); + hf_charm_cand_lite::MlScoreNonPrompt, + hf_charm_cand_lite::PtProng0, + hf_charm_cand_lite::PtProng1, + hf_charm_cand_lite::PtProng2, + hf_charm_cand_lite::PhiProng0, + hf_charm_cand_lite::PhiProng1, + hf_charm_cand_lite::PhiProng2, + hf_charm_cand_lite::EtaProng0, + hf_charm_cand_lite::EtaProng1, + hf_charm_cand_lite::EtaProng2); } // namespace o2::aod struct HfTaskCharmHadImpactPar { @@ -66,17 +104,13 @@ struct HfTaskCharmHadImpactPar { Configurable selectionFlag{"selectionFlag", 15, "Selection Flag for the considered charm hadron"}; Configurable fillLightTreeCandidate{"fillLightTreeCandidate", 0, "Flag to store charm hadron features"}; - ConfigurableAxis axisPt{"axisPt", {0.f, 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 8.f, 10.f, 12.f, 16.f, 24.f, 36.f, 50.f}, "axis for pT of charm hadron"}; - ConfigurableAxis axisMass{"axisMass", {250, 1.65f, 2.15f}, "axis for mass of charm hadron"}; - ConfigurableAxis axisPhi{"axisPhi", {180, 0.f, 2 * PI}, "axis for azimuthal angle of charm hadron"}; - ConfigurableAxis axisY{"axisY", {20, -1.f, 1.f}, "axis for rapidity of charm hadron"}; - ConfigurableAxis axisImpPar{"axisImpPar", {2000, -500.f, 500.f}, "axis for impact-parameter of charm hadron"}; - ConfigurableAxis axisMlScore0{"axisMlScore0", {100, 0.f, 1.f}, "axis for ML output score 0"}; - ConfigurableAxis axisMlScore1{"axisMlScore1", {100, 0.f, 1.f}, "axis for ML output score 1"}; - ConfigurableAxis axisMlScore2{"axisMlScore2", {100, 0.f, 1.f}, "axis for ML output score 2"}; + Configurable centEstimator{"centEstimator", 0, "Centrality estimation (None: 0, FT0C: 2, FT0M: 3)"}; + Configurable occEstimator{"occEstimator", 0, "Occupancy estimation (None: 0, ITS: 1, FT0C: 2)"}; HfHelper hfHelper; + using Collisions = soa::Join; + using CollisionsCent = soa::Join; using CandDplusData = soa::Filtered>; using CandDplusDataWithMl = soa::Filtered>; using CandDzeroData = soa::Filtered>; @@ -85,6 +119,15 @@ struct HfTaskCharmHadImpactPar { Filter filterDplusFlag = aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlag; Filter filterDzeroFlag = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlag || aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlag; + ConfigurableAxis axisPt{"axisPt", {0.f, 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 8.f, 10.f, 12.f, 16.f, 24.f, 36.f, 50.f}, "axis for pT of charm hadron"}; + ConfigurableAxis axisMass{"axisMass", {250, 1.65f, 2.15f}, "axis for mass of charm hadron"}; + ConfigurableAxis axisPhi{"axisPhi", {180, 0.f, TwoPI}, "axis for azimuthal angle of charm hadron"}; + ConfigurableAxis axisY{"axisY", {20, -1.f, 1.f}, "axis for rapidity of charm hadron"}; + ConfigurableAxis axisImpPar{"axisImpPar", {2000, -500.f, 500.f}, "axis for impact-parameter of charm hadron"}; + ConfigurableAxis axisMlScore0{"axisMlScore0", {100, 0.f, 1.f}, "axis for ML output score 0"}; + ConfigurableAxis axisMlScore1{"axisMlScore1", {100, 0.f, 1.f}, "axis for ML output score 1"}; + ConfigurableAxis axisMlScore2{"axisMlScore2", {100, 0.f, 1.f}, "axis for ML output score 2"}; + HistogramRegistry registry{"registry"}; void init(InitContext&) @@ -147,17 +190,24 @@ struct HfTaskCharmHadImpactPar { } } - // Fill THnSparses for the ML analysis + // Fill the TTree with both event and candidate properties /// \param candidate is a particle candidate - template - void fillTree(const CCands& candidate) + /// \param collision is the respective collision + template + void fillTree(const CCands& candidate, const CollType& collision) { std::vector outputMl = {-999., -999., -999.}; float invMass{-1.f}; float yCand{-999.f}; + std::array ptProngs = {candidate.ptProng0(), candidate.ptProng1(), -1.}; + std::array phiProngs = {RecoDecay::phi(std::array{candidate.pxProng0(), candidate.pyProng0()}), RecoDecay::phi(std::array{candidate.pxProng1(), candidate.pyProng1()}), 99.}; + std::array etaProngs = {RecoDecay::eta(std::array{candidate.pxProng0(), candidate.pyProng0(), candidate.pzProng0()}), RecoDecay::eta(std::array{candidate.pxProng1(), candidate.pyProng1(), candidate.pzProng1()}), 99.}; if constexpr (channel == Channel::DplusToKPiPi) { // D+ -> Kpipi invMass = hfHelper.invMassDplusToPiKPi(candidate); yCand = hfHelper.yDplus(candidate); + ptProngs[2] = candidate.ptProng2(); + phiProngs[2] = RecoDecay::phi(candidate.pxProng2(), candidate.pyProng2()); + etaProngs[2] = RecoDecay::eta(std::array{candidate.pxProng2(), candidate.pyProng2(), candidate.pzProng2()}); if constexpr (withMl) { for (auto iScore{0u}; iScore < candidate.mlProbDplusToPiKPi().size(); ++iScore) { outputMl[iScore] = candidate.mlProbDplusToPiKPi()[iScore]; @@ -183,8 +233,28 @@ struct HfTaskCharmHadImpactPar { } } } + float centrality = 0.; + float occupancy = 0.; + if (centEstimator != CentralityEstimator::None) { + centrality = getCentralityColl(collision, centEstimator); + } + if (occEstimator != OccupancyEstimator::None) { + occupancy = getOccupancyColl(collision, occEstimator); + } + hfCharmCandLite( - // Charm candidate meson features + // Event features + collision.bcId(), + collision.numContrib(), + collision.posX(), + collision.posY(), + collision.posZ(), + centrality, + occupancy, + // Charm candidate features + candidate.xSecondaryVertex(), + candidate.ySecondaryVertex(), + candidate.zSecondaryVertex(), invMass, candidate.pt(), yCand, @@ -192,43 +262,54 @@ struct HfTaskCharmHadImpactPar { candidate.impactParameterXY(), outputMl[0], outputMl[1], - outputMl[2]); + outputMl[2], + // Daughter features + ptProngs[0], + ptProngs[1], + ptProngs[2], + phiProngs[0], + phiProngs[1], + phiProngs[2], + etaProngs[0], + etaProngs[1], + etaProngs[2]); } /// \param candidates are reconstructed candidates template - void runAnalysis(const CCands& candidates) + void runAnalysis(const CCands& candidates, CollisionsCent const&) { for (auto const& candidate : candidates) { + auto collision = candidate.template collision_as(); fillSparse(candidate); if (fillLightTreeCandidate) { - fillTree(candidate); + fillTree(candidate, collision); } } } // process functions - void processDplus(CandDplusData const& candidates) + void processDplus(CandDplusData const& candidates, CollisionsCent const& collisions) { - runAnalysis(candidates); + runAnalysis(candidates, collisions); } PROCESS_SWITCH(HfTaskCharmHadImpactPar, processDplus, "Process D+ w/o ML", false); - void processDplusWithMl(CandDplusDataWithMl const& candidates) + void processDplusWithMl(CandDplusDataWithMl const& candidates, CollisionsCent const& collisions) { - runAnalysis(candidates); + runAnalysis(candidates, collisions); } PROCESS_SWITCH(HfTaskCharmHadImpactPar, processDplusWithMl, "Process D+ with ML", true); - void processDzero(CandDzeroData const& candidates) + void processDzero(CandDzeroData const& candidates, CollisionsCent const& collisions) { - runAnalysis(candidates); + runAnalysis(candidates, collisions); } PROCESS_SWITCH(HfTaskCharmHadImpactPar, processDzero, "Process D0 w/o ML", false); - void processDzeroWithMl(CandDzeroDataWithMl const& candidates) + void processDzeroWithMl(CandDzeroDataWithMl const& candidates, CollisionsCent const& collisions) { - runAnalysis(candidates); + runAnalysis(candidates, collisions); } PROCESS_SWITCH(HfTaskCharmHadImpactPar, processDzeroWithMl, "Process D0 with ML", false); }; From b090b49b422295b6b237fd759a117fd6e4fcc6a9 Mon Sep 17 00:00:00 2001 From: alicja-pp <101565842+alicja-pp@users.noreply.github.com> Date: Mon, 3 Mar 2025 10:37:39 +0100 Subject: [PATCH 0511/1650] [PWGCF] FemtoUniverse: add invariant mass vs pT and centrality histograms (#10259) --- .../Core/FemtoUniverseParticleHisto.h | 22 +++++++++++-------- .../femtoUniversePairTaskTrackV0Extended.cxx | 8 +++++++ 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h index d54876cee27..284cba6df83 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h @@ -107,7 +107,9 @@ class FemtoUniverseParticleHisto mHistogramRegistry->add((folderName + folderSuffix + "/hDecayVtxY").c_str(), "; #it{Vtx}_{y} (cm)); Entries", kTH1F, {{2000, 0, 200}}); mHistogramRegistry->add((folderName + folderSuffix + "/hDecayVtxZ").c_str(), "; #it{Vtx}_{z} (cm); Entries", kTH1F, {{2000, 0, 200}}); mHistogramRegistry->add((folderName + folderSuffix + "/hInvMassLambda").c_str(), "; M_{#Lambda}; Entries", kTH1F, {{2000, 1.f, 3.f}}); + mHistogramRegistry->add((folderName + folderSuffix + "/hInvMassLambdaVsPt").c_str(), "; #it{p}_{T} (GeV/#it{c}); M_{#Lambda}; Entries", kTH2F, {{240, 0, 6}, {2000, 1.f, 3.f}}); mHistogramRegistry->add((folderName + folderSuffix + "/hInvMassAntiLambda").c_str(), "; M_{#bar{#Lambda}}; Entries", kTH1F, {{2000, 1.f, 3.f}}); + mHistogramRegistry->add((folderName + folderSuffix + "/hInvMassAntiLambdaVsPt").c_str(), "; #it{p}_{T} (GeV/#it{c}); M_{#Lambda}; Entries", kTH2F, {{240, 0, 6}, {2000, 1.f, 3.f}}); mHistogramRegistry->add((folderName + folderSuffix + "/hInvMassLambdaAntiLambda").c_str(), "; M_{#Lambda}; M_{#bar{#Lambda}}", kTH2F, {{2000, 1.f, 3.f}, {2000, 1.f, 3.f}}); } else if constexpr (mParticleType == o2::aod::femtouniverseparticle::ParticleType::kCascade) { mHistogramRegistry->add((folderName + folderSuffix + "/hDaughDCA").c_str(), "; DCA^{daugh} (cm); Entries", kTH1F, {{1000, 0, 10}}); @@ -282,7 +284,9 @@ class FemtoUniverseParticleHisto mHistogramRegistry->fill(histFolder + HIST(o2::aod::femtouniverse_mc_particle::MCTypeName[mc]) + HIST("/hDecayVtxY"), part.decayVtxY()); mHistogramRegistry->fill(histFolder + HIST(o2::aod::femtouniverse_mc_particle::MCTypeName[mc]) + HIST("/hDecayVtxZ"), part.decayVtxZ()); mHistogramRegistry->fill(histFolder + HIST(o2::aod::femtouniverse_mc_particle::MCTypeName[mc]) + HIST("/hInvMassLambda"), part.mLambda()); + mHistogramRegistry->fill(histFolder + HIST(o2::aod::femtouniverse_mc_particle::MCTypeName[mc]) + HIST("/hInvMassLambdaVsPt"), part.pt(), part.mLambda()); mHistogramRegistry->fill(histFolder + HIST(o2::aod::femtouniverse_mc_particle::MCTypeName[mc]) + HIST("/hInvMassAntiLambda"), part.mAntiLambda()); + mHistogramRegistry->fill(histFolder + HIST(o2::aod::femtouniverse_mc_particle::MCTypeName[mc]) + HIST("/hInvMassAntiLambdaVsPt"), part.pt(), part.mAntiLambda()); mHistogramRegistry->fill(histFolder + HIST(o2::aod::femtouniverse_mc_particle::MCTypeName[mc]) + HIST("/hInvMassLambdaAntiLambda"), part.mLambda(), part.mAntiLambda()); } else if constexpr (mParticleType == o2::aod::femtouniverseparticle::ParticleType::kCascade) { mHistogramRegistry->fill(histFolder + HIST(o2::aod::femtouniverse_mc_particle::MCTypeName[mc]) + HIST("/hDaughDCA"), part.daughDCA()); @@ -367,26 +371,26 @@ class FemtoUniverseParticleHisto if (mHistogramRegistry) { if constexpr (mParticleType == o2::aod::femtouniverseparticle::ParticleType::kTrack) { if (confPDG == mConfPDGCodePart[0]) { - PDGbin = 0; + binPDG = 0; } else if (confPDG == mConfPDGCodePart[1]) { - PDGbin = 1; + binPDG = 1; } else if (confPDG == mConfPDGCodePart[2]) { - PDGbin = 2; + binPDG = 2; // o2-linter: disable=pdg/explicit-code } else { - PDGbin = 3; + binPDG = 3; // o2-linter: disable=pdg/explicit-code } if (std::abs(pdgcode) == 211) { mHistogramRegistry->fill(histFolder + HIST("_MC/hMisidentification"), - PDGbin, 0, part.pt()); + binPDG, 0, part.pt()); } else if (std::abs(pdgcode) == 321) { mHistogramRegistry->fill(histFolder + HIST("_MC/hMisidentification"), - PDGbin, 1, part.pt()); + binPDG, 1, part.pt()); } else if (std::abs(pdgcode) == 2212) { mHistogramRegistry->fill(histFolder + HIST("_MC/hMisidentification"), - PDGbin, 2, part.pt()); + binPDG, 2, part.pt()); } else { mHistogramRegistry->fill(histFolder + HIST("_MC/hMisidentification"), - PDGbin, 3, part.pt()); + binPDG, 3, part.pt()); } } } else { @@ -458,7 +462,7 @@ class FemtoUniverseParticleHisto static constexpr std::string_view mFolderSuffix[5] = {"", "_one", "_two", "_pos", "_neg"}; ///< Suffix for the folder name in case of analyses of pairs of the same kind (T-T, V-V, C-C) // o2-linter: disable=name/constexpr-constant int mConfPDGCodePart[4] = {211, 321, 2212, 9999}; ///< PDG code as per analysis int mPDG = 0; ///< PDG code of the selected particle - int PDGbin = 0; + int binPDG = 0; }; } // namespace o2::analysis::femto_universe diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx index 2b61f46291d..13f66eb53cb 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx @@ -219,6 +219,10 @@ struct FemtoUniversePairTaskTrackV0Extended { posChildHistos.init(&qaRegistry, confChildTempFitVarpTBins, confChildTempFitVarBins, false, 0, true); negChildHistos.init(&qaRegistry, confChildTempFitVarpTBins, confChildTempFitVarBins, false, 0, true); + qaRegistry.add("V0Type1/hInvMassLambdaVsCent", "; Centrality; M_{#Lambda}; Entries", kTH2F, {confMultBins, {2000, 1.f, 3.f}}); + qaRegistry.add("V0Type2/hInvMassLambdaVsCent", "; Centrality; M_{#Lambda}; Entries", kTH2F, {confMultBins, {2000, 1.f, 3.f}}); + qaRegistry.add("V0Type1/hInvMassAntiLambdaVsCent", "; Centrality; M_{#Lambda}; Entries", kTH2F, {confMultBins, {2000, 1.f, 3.f}}); + qaRegistry.add("V0Type2/hInvMassAntiLambdaVsCent", "; Centrality; M_{#Lambda}; Entries", kTH2F, {confMultBins, {2000, 1.f, 3.f}}); trackHistoV0Type1.init(&qaRegistry, confV0TempFitVarpTBins, confV0TempFitVarBins, confIsMC, confV0PDGCodePartTwo, true, "V0Type1"); posChildV0Type1.init(&qaRegistry, confChildTempFitVarpTBins, confChildTempFitVarBins, false, 0, true, "posChildV0Type1"); negChildV0Type1.init(&qaRegistry, confChildTempFitVarpTBins, confChildTempFitVarBins, false, 0, true, "negChildV0Type1"); @@ -410,12 +414,16 @@ struct FemtoUniversePairTaskTrackV0Extended { trackHistoV0Type1.fillQABase(part, HIST("V0Type1")); posChildV0Type1.fillQABase(posChild, HIST("posChildV0Type1")); negChildV0Type1.fillQABase(negChild, HIST("negChildV0Type1")); + qaRegistry.fill(HIST("V0Type1/hInvMassLambdaVsCent"), multCol, part.mLambda()); + qaRegistry.fill(HIST("V0Type1/hInvMassAntiLambdaVsCent"), multCol, part.mAntiLambda()); } /// Check daughters of second V0 particle if (isParticleTPC(posChild, V0ChildTable[confV0Type2][0]) && isParticleTPC(negChild, V0ChildTable[confV0Type2][1])) { trackHistoV0Type2.fillQABase(part, HIST("V0Type2")); posChildV0Type2.fillQABase(posChild, HIST("posChildV0Type2")); negChildV0Type2.fillQABase(negChild, HIST("negChildV0Type2")); + qaRegistry.fill(HIST("V0Type2/hInvMassLambdaVsCent"), multCol, part.mLambda()); + qaRegistry.fill(HIST("V0Type2/hInvMassAntiLambdaVsCent"), multCol, part.mAntiLambda()); } } From 490327c8daf5c76f292d93954bfb69b30ddcd0b6 Mon Sep 17 00:00:00 2001 From: sawan <124118453+sawankumawat@users.noreply.github.com> Date: Mon, 3 Mar 2025 16:31:37 +0530 Subject: [PATCH 0512/1650] [PWGLF] Corrected mass correlation plot (#10284) --- PWGLF/Tasks/Resonances/higherMassResonances.cxx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Resonances/higherMassResonances.cxx b/PWGLF/Tasks/Resonances/higherMassResonances.cxx index 65039924462..252fdd6d658 100644 --- a/PWGLF/Tasks/Resonances/higherMassResonances.cxx +++ b/PWGLF/Tasks/Resonances/higherMassResonances.cxx @@ -360,7 +360,6 @@ struct HigherMassResonances { if (config.qAv0) { rKzeroShort.fill(HIST("hMassK0Shortbefore"), candidate.mK0Short(), candidate.pt()); - rKzeroShort.fill(HIST("hMasscorrelationbefore"), candidate.mK0Short(), candidate.mK0Short()); rKzeroShort.fill(HIST("hLT"), ctauK0s); rKzeroShort.fill(HIST("hDCAV0Daughters"), candidate.dcaV0daughters()); rKzeroShort.fill(HIST("hV0CosPA"), candidate.v0cosPA()); @@ -731,6 +730,9 @@ struct HigherMassResonances { continue; } + if (config.qAv0) { + rKzeroShort.fill(HIST("hMasscorrelationbefore"), v1.mK0Short(), v2.mK0Short()); + } allConditionsMet = 1; daughter1 = ROOT::Math::PxPyPzMVector(v1.px(), v1.py(), v1.pz(), o2::constants::physics::MassK0Short); // Kshort From fafadb6eec022822126218afa947703e3e6357db Mon Sep 17 00:00:00 2001 From: eloviyo <38348689+Eloviyo@users.noreply.github.com> Date: Mon, 3 Mar 2025 12:39:14 +0100 Subject: [PATCH 0513/1650] [PWGCF] FemtoUniverse cascade task -- implemented TOF cut for bachelor tracks with TOF (#10285) Co-authored-by: Shirajum Monira --- PWGCF/FemtoUniverse/Core/FemtoUniverseCascadeSelection.h | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseCascadeSelection.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseCascadeSelection.h index 193d3a32f13..26bad42b780 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseCascadeSelection.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseCascadeSelection.h @@ -23,18 +23,16 @@ #include #include - #include "PWGCF/FemtoUniverse/Core/FemtoUniverseObjectSelection.h" #include "PWGCF/FemtoUniverse/Core/FemtoUniverseSelection.h" #include "PWGCF/FemtoUniverse/Core/FemtoUniverseTrackSelection.h" - #include "Common/Core/RecoDecay.h" #include "Framework/HistogramRegistry.h" #include "ReconstructionDataFormats/PID.h" -namespace o2::analysis::femto_universe // o2-linter: disable=name/namespace +namespace o2::analysis::femto_universe { -namespace femto_universe_cascade_selection // o2-linter: disable=name/namespace +namespace femto_universe_cascade_selection { /// The different selections this task is capable of doing enum CascadeSel { @@ -430,6 +428,7 @@ bool FemtoUniverseCascadeSelection::isSelectedMinimal(Col const& col, Casc const const float dcav0topv = cascade.dcav0topv(col.posX(), col.posY(), col.posZ()); const float invMassLambda = cascade.mLambda(); const float invMass = isCascOmega ? cascade.mOmega() : cascade.mXi(); + const float nSigmaPIDMax = bachTrackSel.getSigmaPIDMax(); if (invMassLambda < fV0InvMassLowLimit || invMassLambda > fV0InvMassUpLimit) { return false; @@ -501,7 +500,7 @@ bool FemtoUniverseCascadeSelection::isSelectedMinimal(Col const& col, Casc const if (!negDaughTrack.isSelectedMinimal(negTrack)) { return false; } - if (!bachTrack.hasTOF()) { + if (bachTrack.hasTOF() && ((isCascOmega && bachTrack.tofNSigmaKa() > nSigmaPIDMax) || (!isCascOmega && bachTrack.tofNSigmaPi() > nSigmaPIDMax))) { return false; } if (!bachTrackSel.isSelectedMinimal(bachTrack)) { From 5b29e0725ebe45a8b17ece8abd2a7e8898bf5288 Mon Sep 17 00:00:00 2001 From: Samuele Cattaruzzi <124249902+scattaru@users.noreply.github.com> Date: Mon, 3 Mar 2025 13:53:13 +0100 Subject: [PATCH 0514/1650] [PWGHF] Add Ds prong info and offline processes (#10286) --- .../DataModel/DerivedDataCorrelationTables.h | 13 ++- .../HFC/TableProducer/correlatorDsHadrons.cxx | 8 +- .../correlatorDsHadronsReduced.cxx | 95 +++++++++++++++++-- 3 files changed, 101 insertions(+), 15 deletions(-) diff --git a/PWGHF/HFC/DataModel/DerivedDataCorrelationTables.h b/PWGHF/HFC/DataModel/DerivedDataCorrelationTables.h index c43bb12a2a2..9e99e6ab011 100644 --- a/PWGHF/HFC/DataModel/DerivedDataCorrelationTables.h +++ b/PWGHF/HFC/DataModel/DerivedDataCorrelationTables.h @@ -40,6 +40,9 @@ using HfcRedCollision = HfcRedCollisions::iterator; namespace hf_candidate_reduced { DECLARE_SOA_INDEX_COLUMN(HfcRedCollision, hfcRedCollision); //! ReducedCollision index +DECLARE_SOA_COLUMN(Prong0Id, prong0Id, int); //! Prong 0 index +DECLARE_SOA_COLUMN(Prong1Id, prong1Id, int); //! Prong 1 index +DECLARE_SOA_COLUMN(Prong2Id, prong2Id, int); //! Prong2 index DECLARE_SOA_COLUMN(PhiCand, phiCand, float); //! Phi of the candidate DECLARE_SOA_COLUMN(EtaCand, etaCand, float); //! Eta of the candidate DECLARE_SOA_COLUMN(PtCand, ptCand, float); //! Pt of the candidate @@ -53,7 +56,10 @@ DECLARE_SOA_TABLE(DsCandReduceds, "AOD", "DSCANDREDUCED", //! Table with Ds cand aod::hf_candidate_reduced::PhiCand, aod::hf_candidate_reduced::EtaCand, aod::hf_candidate_reduced::PtCand, - aod::hf_candidate_reduced::InvMassDs); + aod::hf_candidate_reduced::InvMassDs, + aod::hf_candidate_reduced::Prong0Id, + aod::hf_candidate_reduced::Prong1Id, + aod::hf_candidate_reduced::Prong2Id); DECLARE_SOA_TABLE(DsCandSelInfos, "AOD", "DSCANDSELINFO", //! Table with Ds candidate selection info soa::Index<>, @@ -63,7 +69,7 @@ DECLARE_SOA_TABLE(DsCandSelInfos, "AOD", "DSCANDSELINFO", //! Table with Ds cand namespace hf_assoc_track_reduced { -DECLARE_SOA_COLUMN(TrackId, trackId, int); //! Original track index +DECLARE_SOA_COLUMN(OriginTrackId, originTrackId, int); //! Original track index DECLARE_SOA_COLUMN(NTpcCrossedRows, nTpcCrossedRows, int); //! Number of crossed TPC Rows DECLARE_SOA_COLUMN(ItsClusterMap, itsClusterMap, int); //! ITS cluster map, one bit per a layer, starting from the innermost DECLARE_SOA_COLUMN(ItsNCls, itsNCls, int); //! Number of ITS clusters @@ -76,11 +82,12 @@ DECLARE_SOA_COLUMN(DcaZ, dcaZ, float); //! Impact parameter DECLARE_SOA_TABLE(AssocTrackReds, "AOD", "ASSOCTRACKRED", //! Table with associated track info soa::Index<>, aod::hf_candidate_reduced::HfcRedCollisionId, + aod::hf_assoc_track_reduced::OriginTrackId, aod::hf_assoc_track_reduced::PhiAssocTrack, aod::hf_assoc_track_reduced::EtaAssocTrack, aod::hf_assoc_track_reduced::PtAssocTrack); -DECLARE_SOA_TABLE(AssocTrackSelInfos, "AOD", "ASSOCTRACKSELINFO", //! Table with associated track info +DECLARE_SOA_TABLE(AssocTrackSels, "AOD", "ASSOCTRACKSEL", //! Table with associated track info soa::Index<>, aod::hf_candidate_reduced::HfcRedCollisionId, aod::hf_assoc_track_reduced::NTpcCrossedRows, diff --git a/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx b/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx index bff26133d96..50881aad9d2 100644 --- a/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx @@ -145,7 +145,7 @@ struct HfCorrelatorDsHadrons { Produces candReduced; Produces candSelInfo; Produces assocTrackReduced; - Produces assocTrackSelInfo; + Produces assocTrackSelInfo; Configurable fillHistoData{"fillHistoData", true, "Flag for filling histograms in data processes"}; Configurable fillHistoMcRec{"fillHistoMcRec", true, "Flag for filling histograms in MC Rec processes"}; @@ -717,13 +717,13 @@ struct HfCorrelatorDsHadrons { for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { outputMl[iclass] = candidate.mlProbDsToKKPi()[classMl->at(iclass)]; } - candReduced(indexHfcReducedCollision, candidate.phi(), candidate.eta(), candidate.pt(), hfHelper.invMassDsToKKPi(candidate)); + candReduced(indexHfcReducedCollision, candidate.phi(), candidate.eta(), candidate.pt(), hfHelper.invMassDsToKKPi(candidate), candidate.prong0Id(), candidate.prong1Id(), candidate.prong2Id()); candSelInfo(indexHfcReducedCollision, outputMl[0], outputMl[2]); } else if (candidate.isSelDsToPiKK() >= selectionFlagDs) { for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { outputMl[iclass] = candidate.mlProbDsToPiKK()[classMl->at(iclass)]; } - candReduced(indexHfcReducedCollision, candidate.phi(), candidate.eta(), candidate.pt(), hfHelper.invMassDsToPiKK(candidate)); + candReduced(indexHfcReducedCollision, candidate.phi(), candidate.eta(), candidate.pt(), hfHelper.invMassDsToPiKK(candidate), candidate.prong0Id(), candidate.prong1Id(), candidate.prong2Id()); candSelInfo(indexHfcReducedCollision, outputMl[0], outputMl[2]); } } @@ -733,7 +733,7 @@ struct HfCorrelatorDsHadrons { if (!track.isGlobalTrackWoDCA()) { continue; } - assocTrackReduced(indexHfcReducedCollision, track.phi(), track.eta(), track.pt()); + assocTrackReduced(indexHfcReducedCollision, track.globalIndex(), track.phi(), track.eta(), track.pt()); assocTrackSelInfo(indexHfcReducedCollision, track.tpcNClsCrossedRows(), track.itsClusterMap(), track.itsNCls(), track.dcaXY(), track.dcaZ()); } diff --git a/PWGHF/HFC/TableProducer/correlatorDsHadronsReduced.cxx b/PWGHF/HFC/TableProducer/correlatorDsHadronsReduced.cxx index 78e05a61ec1..f24bc1d5880 100644 --- a/PWGHF/HFC/TableProducer/correlatorDsHadronsReduced.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDsHadronsReduced.cxx @@ -10,7 +10,7 @@ // or submit itself to any jurisdiction. /// \file correlatorDsHadronsReduced.cxx -/// \brief Ds-Hadrons correlator task for ME offline +/// \brief Ds-Hadrons correlator task for offline analysis /// \author Samuele Cattaruzzi #include @@ -43,10 +43,15 @@ using BinningTypeDerived = ColumnBinningPolicy entryDsHadronPair; Produces entryDsHadronRecoInfo; + Produces entryDsHadronMlInfo; + Produces entryDsCandRecoInfo; + Produces entryTrackRecoInfo; // Produces entryDsHadronGenInfo; Configurable fillHistoData{"fillHistoData", true, "Flag for filling histograms in data processes"}; Configurable numberEventsMixed{"numberEventsMixed", 5, "Number of events mixed in ME process"}; + Configurable> binsPtD{"binsPtD", std::vector{1., 3., 5., 8., 16., 36.}, "pT bin limits for candidate mass plots"}; + Configurable> binsPtHadron{"binsPtHadron", std::vector{0.3, 1., 2., 50.}, "pT bin limits for assoc particle"}; SliceCache cache; @@ -56,9 +61,11 @@ struct HfCorrelatorDsHadronsReduced { ConfigurableAxis zPoolBins{"zPoolBins", {VARIABLE_WIDTH, -10.0, -2.5, 2.5, 10.0}, "z vertex position pools"}; ConfigurableAxis multPoolBins{"multPoolBins", {VARIABLE_WIDTH, 0., 900., 1800., 6000.}, "event multiplicity pools (FT0M)"}; - ConfigurableAxis binsMultFT0M{"binsMultFT0M", {600, 0., 6000.}, "Multiplicity as FT0M signal amplitude"}; + ConfigurableAxis binsMultFT0M{"binsMultFT0M", {100, 0., 10000.}, "Multiplicity as FT0M signal amplitude"}; ConfigurableAxis binsPosZ{"binsPosZ", {100, -10., 10.}, "primary vertex z coordinate"}; ConfigurableAxis binsPoolBin{"binsPoolBin", {9, 0., 9.}, "PoolBin"}; + ConfigurableAxis binsEta{"binsEta", {50, -2., 2.}, "#it{#eta}"}; + ConfigurableAxis binsPhi{"binsPhi", {64, -PIHalf, 3. * PIHalf}, "#it{#varphi}"}; HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -67,16 +74,66 @@ struct HfCorrelatorDsHadronsReduced { AxisSpec axisMultFT0M = {binsMultFT0M, "MultiplicityFT0M"}; AxisSpec axisPosZ = {binsPosZ, "PosZ"}; AxisSpec axisPoolBin = {binsPoolBin, "PoolBin"}; + AxisSpec axisEta = {binsEta, "#it{#eta}"}; + AxisSpec axisPhi = {binsPhi, "#it{#varphi}"}; + AxisSpec axisPtD = {(std::vector)binsPtD, "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec axisPtHadron = {(std::vector)binsPtHadron, "#it{p}_{T} Hadron (GeV/#it{c})"}; // Histograms for data analysis if (fillHistoData) { registry.add("hMultFT0M", "Multiplicity FT0M", {HistType::kTH1F, {axisMultFT0M}}); registry.add("hZVtx", "z vertex", {HistType::kTH1F, {axisPosZ}}); + registry.add("hCollisionPoolBin", "Collision pool bin", {HistType::kTH1F, {axisPoolBin}}); registry.add("hDsPoolBin", "Ds candidates pool bin", {HistType::kTH1F, {axisPoolBin}}); + registry.add("hPhiVsPtCand", "Ds candidates phiVsPt", {HistType::kTH2F, {{axisPhi}, {axisPtD}}}); + registry.add("hPhiVsPtPartAssoc", "Particles associated phiVsPt", {HistType::kTH3F, {{axisPhi}, {axisPtD}, {axisPtHadron}}}); + registry.add("hEtaVsPtCand", "Ds candidates etaVsPt", {HistType::kTH2F, {{axisEta}, {axisPtD}}}); + registry.add("hEtaVsPtPartAssoc", "Particles associated etaVsPt", {HistType::kTH3F, {{axisEta}, {axisPtD}, {axisPtHadron}}}); registry.add("hTracksPoolBin", "Particles associated pool bin", {HistType::kTH1F, {axisPoolBin}}); } } + void processDerivedData(aod::HfcRedCollisions const& collisions, + soa::Join const& candidates, + soa::Join const& tracks) + { + + BinningTypeDerived corrBinning{{zPoolBins, multPoolBins}, true}; + + for (const auto& collision : collisions) { + int poolBin = corrBinning.getBin(std::make_tuple(collision.posZ(), collision.multiplicity())); + registry.fill(HIST("hCollisionPoolBin"), poolBin); + registry.fill(HIST("hMultFT0M"), collision.multiplicity()); + registry.fill(HIST("hZVtx"), collision.posZ()); + + auto thisCollId = collision.globalIndex(); + auto candsDsThisColl = candidates.sliceBy(candPerCol, thisCollId); + auto tracksThisColl = tracks.sliceBy(tracksPerCol, thisCollId); + + for (const auto& candidate : candsDsThisColl) { + registry.fill(HIST("hDsPoolBin"), poolBin); + registry.fill(HIST("hPhiVsPtCand"), RecoDecay::constrainAngle(candidate.phiCand(), -PIHalf), candidate.ptCand()); + registry.fill(HIST("hEtaVsPtCand"), candidate.etaCand(), candidate.ptCand()); + entryDsCandRecoInfo(candidate.invMassDs(), candidate.ptCand(), candidate.bdtScorePrompt(), candidate.bdtScoreBkg()); + for (const auto& track : tracksThisColl) { + registry.fill(HIST("hTracksPoolBin"), poolBin); + registry.fill(HIST("hPhiVsPtPartAssoc"), RecoDecay::constrainAngle(track.phiAssocTrack(), -PIHalf), candidate.ptCand(), track.ptAssocTrack()); + registry.fill(HIST("hEtaVsPtPartAssoc"), track.etaAssocTrack(), candidate.ptCand(), track.ptAssocTrack()); + + entryDsHadronPair(getDeltaPhi(track.phiAssocTrack(), candidate.phiCand()), + track.etaAssocTrack() - candidate.etaCand(), + candidate.ptCand(), + track.ptAssocTrack(), + poolBin); + entryDsHadronRecoInfo(candidate.invMassDs(), false, false); + entryDsHadronMlInfo(candidate.bdtScorePrompt(), candidate.bdtScoreBkg()); + entryTrackRecoInfo(track.dcaXY(), track.dcaZ(), track.nTpcCrossedRows()); + } + } + } + } + PROCESS_SWITCH(HfCorrelatorDsHadronsReduced, processDerivedData, "Process Derived Data", true); + void processDerivedDataME(aod::HfcRedCollisions const& collisions, aod::DsCandReduceds const& candidates, aod::AssocTrackReds const& tracks) @@ -84,6 +141,28 @@ struct HfCorrelatorDsHadronsReduced { BinningTypeDerived corrBinning{{zPoolBins, multPoolBins}, true}; + for (const auto& collision : collisions) { + int poolBin = corrBinning.getBin(std::make_tuple(collision.posZ(), collision.multiplicity())); + registry.fill(HIST("hCollisionPoolBin"), poolBin); + registry.fill(HIST("hMultFT0M"), collision.multiplicity()); + registry.fill(HIST("hZVtx"), collision.posZ()); + + auto thisCollId = collision.globalIndex(); + auto candsDsThisColl = candidates.sliceBy(candPerCol, thisCollId); + auto tracksThisColl = tracks.sliceBy(tracksPerCol, thisCollId); + + for (const auto& candidate : candsDsThisColl) { + registry.fill(HIST("hDsPoolBin"), poolBin); + registry.fill(HIST("hPhiVsPtCand"), RecoDecay::constrainAngle(candidate.phiCand(), -PIHalf), candidate.ptCand()); + registry.fill(HIST("hEtaVsPtCand"), candidate.etaCand(), candidate.ptCand()); + for (const auto& track : tracksThisColl) { + registry.fill(HIST("hTracksPoolBin"), poolBin); + registry.fill(HIST("hPhiVsPtPartAssoc"), RecoDecay::constrainAngle(track.phiAssocTrack(), -PIHalf), candidate.ptCand(), track.ptAssocTrack()); + registry.fill(HIST("hEtaVsPtPartAssoc"), track.etaAssocTrack(), candidate.ptCand(), track.ptAssocTrack()); + } + } + } + auto tracksTuple = std::make_tuple(candidates, tracks); Pair pairData{corrBinning, numberEventsMixed, -1, collisions, tracksTuple, &cache}; @@ -95,13 +174,13 @@ struct HfCorrelatorDsHadronsReduced { int poolBin = corrBinning.getBin(std::make_tuple(c2.posZ(), c2.multiplicity())); int poolBinDs = corrBinning.getBin(std::make_tuple(c1.posZ(), c1.multiplicity())); - registry.fill(HIST("hMultFT0M"), c1.multiplicity()); - registry.fill(HIST("hZVtx"), c1.posZ()); - registry.fill(HIST("hTracksPoolBin"), poolBin); - registry.fill(HIST("hDsPoolBin"), poolBinDs); + + if (poolBin != poolBinDs) { + LOGF(info, "Error, poolBins are diffrent"); + } for (const auto& [cand, pAssoc] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { - LOGF(info, "Mixed event tracks pair: (%d, %d) from events (%d, %d), track event: (%d, %d)", cand.index(), pAssoc.index(), c1.index(), c2.index(), cand.hfcRedCollisionId(), pAssoc.hfcRedCollisionId()); + // LOGF(info, "Mixed event tracks pair: (%d, %d) from events (%d, %d), track event: (%d, %d)", cand.index(), pAssoc.index(), c1.index(), c2.index(), cand.hfcRedCollisionId(), pAssoc.hfcRedCollisionId()); entryDsHadronPair(getDeltaPhi(pAssoc.phiAssocTrack(), cand.phiCand()), pAssoc.etaAssocTrack() - cand.etaCand(), @@ -113,7 +192,7 @@ struct HfCorrelatorDsHadronsReduced { } } } - PROCESS_SWITCH(HfCorrelatorDsHadronsReduced, processDerivedDataME, "Process Mixed Event Derived Data", true); + PROCESS_SWITCH(HfCorrelatorDsHadronsReduced, processDerivedDataME, "Process Mixed Event Derived Data", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 10375b890f4c87a45af6d44d2509cc1b6f562361 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Mon, 3 Mar 2025 23:06:21 +0900 Subject: [PATCH 0515/1650] [PWGEM/Dilepton] update studyMCTruth.cxx (#10288) --- PWGEM/Dilepton/Tasks/studyMCTruth.cxx | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/PWGEM/Dilepton/Tasks/studyMCTruth.cxx b/PWGEM/Dilepton/Tasks/studyMCTruth.cxx index 58bed22b8d3..08fc371ff98 100644 --- a/PWGEM/Dilepton/Tasks/studyMCTruth.cxx +++ b/PWGEM/Dilepton/Tasks/studyMCTruth.cxx @@ -82,9 +82,9 @@ struct studyMCTruth { const AxisSpec axis_mll{ConfMllBins, "m_{ll} (GeV/c^{2})"}; const AxisSpec axis_ptll{ConfPtllBins, "p_{T,ll} (GeV/c)"}; - fRegistry.add("Event/hReccollsPerMCcoll", "Rec. colls per MC coll;Rec. colls per MC coll;Number of MC collisions", kTH1D, {{21, -0.5, 20.5}}, false); - fRegistry.add("Event/hSelReccollsPerMCcoll", "Selected Rec. colls per MC coll;Selected Rec. colls per MC coll;Number of MC collisions", kTH1D, {{21, -0.5, 20.5}}, false); fRegistry.add("Event/hDiffBC", "diffrence in BC;BC_{rec. coll.} - BC_{mc coll.}", kTH1D, {{101, -50.5, +50.5}}, false); + fRegistry.add("Event/allMC/hReccollsPerMCcoll", "Rec. colls per MC coll;Rec. colls per MC coll;Number of MC collisions", kTH1D, {{21, -0.5, 20.5}}, false); + fRegistry.add("Event/allMC/hSelReccollsPerMCcoll", "Selected Rec. colls per MC coll;Selected Rec. colls per MC coll;Number of MC collisions", kTH1D, {{21, -0.5, 20.5}}, false); fRegistry.add("Event/allMC/hZvtx", "MC Zvtx;Z_{vtx} (cm)", kTH1D, {{100, -50, +50}}, false); fRegistry.add("Event/allMC/hImpactParameter", "impact parameter;impact parameter b (fm)", kTH1D, {{200, 0, 20}}, false); fRegistry.addClone("Event/allMC/", "Event/selectedMC/"); @@ -240,15 +240,15 @@ struct studyMCTruth { const auto& bc_from_mcCollision = mcCollision.template bc_as(); bool isSelectedMC = isSelectedCollision(mcCollision, bc_from_mcCollision); - auto reccolls_per_mccoll = collisions.sliceBy(recColperMcCollision, mcCollision.globalIndex()); - fRegistry.fill(HIST("Event/hReccollsPerMCcoll"), reccolls_per_mccoll.size()); + const auto& reccolls_per_mccoll = collisions.sliceBy(recColperMcCollision, mcCollision.globalIndex()); int nselreccolls_per_mccoll = 0; for (const auto& rec_col : reccolls_per_mccoll) { if (isSelectedCollision(rec_col, rec_col.template foundBC_as())) { nselreccolls_per_mccoll++; } } // end of reconstructed collision - fRegistry.fill(HIST("Event/hSelReccollsPerMCcoll"), nselreccolls_per_mccoll); + fRegistry.fill(HIST("Event/allMC/hReccollsPerMCcoll"), reccolls_per_mccoll.size()); + fRegistry.fill(HIST("Event/allMC/hSelReccollsPerMCcoll"), nselreccolls_per_mccoll); bool isSelectedRec = false; bool hasRecCollision = false; @@ -259,16 +259,22 @@ struct studyMCTruth { isSelectedRec = isSelectedCollision(collision, bc_from_collision); fRegistry.fill(HIST("Event/hDiffBC"), bc_from_collision.globalBC() - bc_from_mcCollision.globalBC()); } - fRegistry.fill(HIST("Event/allMC/hZvtx"), mcCollision.posZ()); fRegistry.fill(HIST("Event/allMC/hImpactParameter"), mcCollision.impactParameter()); + if (isSelectedMC) { + fRegistry.fill(HIST("Event/selectedMC/hReccollsPerMCcoll"), reccolls_per_mccoll.size()); + fRegistry.fill(HIST("Event/selectedMC/hSelReccollsPerMCcoll"), nselreccolls_per_mccoll); fRegistry.fill(HIST("Event/selectedMC/hZvtx"), mcCollision.posZ()); fRegistry.fill(HIST("Event/selectedMC/hImpactParameter"), mcCollision.impactParameter()); if (hasRecCollision) { + fRegistry.fill(HIST("Event/selectedMC_and_Rec/hReccollsPerMCcoll"), reccolls_per_mccoll.size()); + fRegistry.fill(HIST("Event/selectedMC_and_Rec/hSelReccollsPerMCcoll"), nselreccolls_per_mccoll); fRegistry.fill(HIST("Event/selectedMC_and_Rec/hZvtx"), mcCollision.posZ()); fRegistry.fill(HIST("Event/selectedMC_and_Rec/hImpactParameter"), mcCollision.impactParameter()); if (isSelectedRec) { + fRegistry.fill(HIST("Event/selectedMC_and_selectedRec/hReccollsPerMCcoll"), reccolls_per_mccoll.size()); + fRegistry.fill(HIST("Event/selectedMC_and_selectedRec/hSelReccollsPerMCcoll"), nselreccolls_per_mccoll); fRegistry.fill(HIST("Event/selectedMC_and_selectedRec/hZvtx"), mcCollision.posZ()); fRegistry.fill(HIST("Event/selectedMC_and_selectedRec/hImpactParameter"), mcCollision.impactParameter()); } From 0c6b433c53bfb783d9927335b3db66b1f1a2a173 Mon Sep 17 00:00:00 2001 From: Debadatta3337 Date: Mon, 3 Mar 2025 21:07:26 +0530 Subject: [PATCH 0516/1650] [PWGDQ] Updating VtxZ_VtxNcontribReal histogram (#10283) Co-authored-by: Debadatta3337 --- PWGDQ/Core/HistogramsLibrary.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 34002a83acd..42cd0c55037 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -112,6 +112,7 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "VtxZ_MultTPCWithPV", "VtxZ vs MultTPCWithPV", false, 240, -12.0, 12.0, VarManager::kVtxZ, 400, 0, 400.0, VarManager::kMultNTracksHasTPC); hm->AddHistogram(histClass, "VtxZ_MultITSTPCWithPV", "VtxZ vs MultITSTPCWithPV", false, 240, -12.0, 12.0, VarManager::kVtxZ, 400, 0, 400.0, VarManager::kMultNTracksITSTPC); hm->AddHistogram(histClass, "VtxZ_MultITSOnly", "VtxZ vs MultITSOnly", false, 240, -12.0, 12.0, VarManager::kVtxZ, 400, 0, 400.0, VarManager::kMultNTracksITSOnly); + hm->AddHistogram(histClass, "VtxZ_VtxNcontribReal", "VtxZ vs VtxNcontribReal", false, 240, -12.0, 12.0, VarManager::kVtxZ, 200, 0, 200.0, VarManager::kVtxNcontribReal); } else { hm->AddHistogram(histClass, "MultTPC", "MultTPC", false, 200, 0.0, 50000.0, VarManager::kMultTPC); From f42e75ed3b1d0436203e36f7de08436a112817aa Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Mon, 3 Mar 2025 16:51:05 +0100 Subject: [PATCH 0517/1650] [PWGLF] ResonanceMergeDF - Add derived dataset candidates for Xi1530 study (#10292) --- PWGLF/DataModel/LFResonanceTables.h | 12 +-- .../Resonances/resonanceMergeDF.cxx | 98 ++++++++++++++++--- 2 files changed, 92 insertions(+), 18 deletions(-) diff --git a/PWGLF/DataModel/LFResonanceTables.h b/PWGLF/DataModel/LFResonanceTables.h index 7961d46c24e..78deaa0ab4e 100644 --- a/PWGLF/DataModel/LFResonanceTables.h +++ b/PWGLF/DataModel/LFResonanceTables.h @@ -72,7 +72,7 @@ DECLARE_SOA_COLUMN(IsInAfterAllCuts, isInAfterAllCuts, bool); //! InAfterAllCuts DECLARE_SOA_COLUMN(ImpactParameter, impactParameter, float); //! ImpactParameter } // namespace resocollision -DECLARE_SOA_TABLE(ResoCollisions, "AOD", "RESOCOLLISION", +DECLARE_SOA_TABLE(ResoCollisions, "AOD", "RESOCOLLISIONS", o2::soa::Index<>, resocollision::CollisionId, o2::aod::mult::MultNTracksPV, @@ -90,7 +90,7 @@ DECLARE_SOA_TABLE(ResoCollisions, "AOD", "RESOCOLLISION", evsel::NumTracksInTimeRange); using ResoCollision = ResoCollisions::iterator; -DECLARE_SOA_TABLE(ResoMCCollisions, "AOD", "RESOMCCOL", +DECLARE_SOA_TABLE(ResoMCCollisions, "AOD", "RESOMCCOLLISIONS", o2::soa::Index<>, resocollision::IsVtxIn10, resocollision::IsINELgt0, @@ -100,13 +100,13 @@ DECLARE_SOA_TABLE(ResoMCCollisions, "AOD", "RESOMCCOL", resocollision::ImpactParameter); using ResoMCCollision = ResoMCCollisions::iterator; -DECLARE_SOA_TABLE(ResoSpheroCollisions, "AOD", "RESOSPHEROCOLL", +DECLARE_SOA_TABLE(ResoSpheroCollisions, "AOD", "RESOSPHEROCOLLISIONS", o2::soa::Index<>, resocollision::CollisionId, resocollision::Spherocity); using ResoSpheroCollision = ResoSpheroCollisions::iterator; -DECLARE_SOA_TABLE(ResoEvtPlCollisions, "AOD", "RESOEVTPLCOLL", +DECLARE_SOA_TABLE(ResoEvtPlCollisions, "AOD", "RESOEVTPLCOLLISIONS", o2::soa::Index<>, resocollision::CollisionId, resocollision::EvtPl, @@ -116,7 +116,7 @@ DECLARE_SOA_TABLE(ResoEvtPlCollisions, "AOD", "RESOEVTPLCOLL", using ResoEvtPlCollision = ResoEvtPlCollisions::iterator; // For DF mixing study -DECLARE_SOA_TABLE(ResoCollisionDFs, "AOD", "RESOCOLLISIONDF", +DECLARE_SOA_TABLE(ResoCollisionDFs, "AOD", "RESOCOLLISIONDFS", o2::soa::Index<>, // resocollision::CollisionId, o2::aod::mult::MultNTracksPV, @@ -253,7 +253,7 @@ DECLARE_SOA_TABLE(ResoTracks, "AOD", "RESOTRACKS", using ResoTrack = ResoTracks::iterator; // For DF mixing study -DECLARE_SOA_TABLE(ResoTrackDFs, "AOD", "RESOTRACKDFs", +DECLARE_SOA_TABLE(ResoTrackDFs, "AOD", "RESOTRACKDFS", o2::soa::Index<>, resodaughter::ResoCollisionDFId, // resodaughter::TrackId, diff --git a/PWGLF/TableProducer/Resonances/resonanceMergeDF.cxx b/PWGLF/TableProducer/Resonances/resonanceMergeDF.cxx index b31fe6bcead..f63a2d339aa 100644 --- a/PWGLF/TableProducer/Resonances/resonanceMergeDF.cxx +++ b/PWGLF/TableProducer/Resonances/resonanceMergeDF.cxx @@ -74,6 +74,14 @@ struct ResonanceMergeDF { Configurable nsigmatofPr{"nsigmatofPr", 6., "nsigma value for tof prot"}; Configurable nsigmatofKa{"nsigmatofKa", 6., "nsigma value for tof kaon"}; + // Xi1530 candidate cuts + Configurable trackSelection{"trackSelection", 0, "Track selection: 0 -> No Cut, 1 -> kGlobalTrack, 2 -> kGlobalTrackWoDCA"}; + Configurable requireTOF{"requireTOF", false, "Require TOF"}; + Configurable applyTOFveto{"applyTOFveto", 999, "Apply TOF veto with value, 999 for passing all"}; + Configurable nsigmaPi{"nsigmaPi", 5., "nsigma value for pion"}; + Configurable minCent{"minCent", 0., "Minimum centrality"}; + Configurable maxCent{"maxCent", 100., "Maximum centrality"}; + HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; void init(InitContext const&) @@ -263,12 +271,10 @@ struct ResonanceMergeDF { if (crejtof && ((std::abs(track.tofNSigmaPr()) > std::abs(track.tofNSigmaEl()) && std::abs(track.tofNSigmaKa()) > std::abs(track.tofNSigmaEl())) || (std::abs(track.tofNSigmaPr()) > std::abs(track.tofNSigmaPi()) && std::abs(track.tofNSigmaKa()) > std::abs(track.tofNSigmaPi())))) continue; } - if (std::abs(track.dcaXY()) > cDCAXY) continue; if (std::abs(track.dcaZ()) > cDCAZ) continue; - reso2trksdf(resoCollisionsdf.lastIndex(), // track.trackId(), track.pt(), @@ -310,13 +316,88 @@ struct ResonanceMergeDF { } PROCESS_SWITCH(ResonanceMergeDF, processLambdaStarCandidate, "Process for lambda star candidate", false); - void processCascadesCandidate(aod::ResoCollisions::iterator const& collision, aod::ResoCascades const& resocasctracks) + void processXi1530Candidate(aod::ResoCollisions::iterator const& collision, aod::ResoTracks const& tracks, aod::ResoCascades const& resocasctracks) { - histos.fill(HIST("Event/h1d_ft0_mult_percentile_CASC"), collision.cent()); + if (doprocessTrackDataDF) + LOG(fatal) << "Disable processTrackDataDF first!"; + if (doprocessLambdaStarCandidate) + LOG(fatal) << "Disable processLambdaStarCandidate first!"; + + if (collision.cent() < minCent || collision.cent() > maxCent) + return; resoCollisionsdf(0, collision.posX(), collision.posY(), collision.posZ(), collision.cent(), collision.spherocity(), collision.evtPl(), 0., 0., 0., 0., 0, collision.trackOccupancyInTimeRange()); + histos.fill(HIST("Event/h1d_ft0_mult_percentile"), collision.cent()); + + for (const auto& track : tracks) { + if (trackSelection == 1) { + if (!track.isGlobalTrack()) + continue; + } else if (trackSelection == 2) { + if (!track.isGlobalTrackWoDCA()) + continue; + } + if (!track.hasTOF()) { + if (requireTOF) { + continue; + } + // TPC selection + if (std::abs(track.tpcNSigmaPi()) > nsigmaPi) + continue; + } else { + if (applyTOFveto > 998 && std::abs(track.tofNSigmaPi()) > applyTOFveto) + continue; + // TPC selection + if (std::abs(track.tpcNSigmaPi()) > nsigmaPi) + continue; + } + + if (std::abs(track.dcaXY()) > cDCAXY) + continue; + if (std::abs(track.dcaZ()) > cDCAZ) + continue; + reso2trksdf(resoCollisionsdf.lastIndex(), + // track.trackId(), + track.pt(), + track.px(), + track.py(), + track.pz(), + track.eta(), + track.phi(), + track.sign(), + (uint8_t)track.tpcNClsCrossedRows(), + (uint8_t)track.tpcNClsFound(), + (uint8_t)track.itsNCls(), + track.dcaXY(), + track.dcaZ(), + track.x(), + track.alpha(), + track.hasITS(), + track.hasTPC(), + track.hasTOF(), + track.tpcNSigmaPi(), + track.tpcNSigmaKa(), + track.tpcNSigmaPr(), + track.tpcNSigmaEl(), + track.tofNSigmaPi(), + track.tofNSigmaKa(), + track.tofNSigmaPr(), + track.tofNSigmaEl(), + track.tpcSignal(), + track.passedITSRefit(), + track.passedTPCRefit(), + track.isGlobalTrackWoDCA(), + track.isGlobalTrack(), + track.isPrimaryTrack(), + track.isPVContributor(), + track.tpcCrossedRowsOverFindableCls(), + track.itsChi2NCl(), + track.tpcChi2NCl()); + } + // Cascade candidate for (const auto& track : resocasctracks) { + // TODO: add cascade cuts reso2cascadesdf(resoCollisionsdf.lastIndex(), // casc.globalIndex(), track.pt(), @@ -360,14 +441,7 @@ struct ResonanceMergeDF { track.transRadius(), track.cascTransRadius(), track.decayVtxX(), track.decayVtxY(), track.decayVtxZ()); } } - - PROCESS_SWITCH(ResonanceMergeDF, processCascadesCandidate, "Process for Cascade candidate", true); - - void processXiStarCandidate(aod::ResoCollisions::iterator const& /*collision*/, aod::ResoTracks const& /*tracks*/) - { - // TODO: Implement Xi star candidate processing - } - PROCESS_SWITCH(ResonanceMergeDF, processXiStarCandidate, "Process for Xi star candidate", false); + PROCESS_SWITCH(ResonanceMergeDF, processXi1530Candidate, "Process for Xi(1530) candidate", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 2b37e7f42374c9f3856e6c1765192561043e3331 Mon Sep 17 00:00:00 2001 From: lucamicheletti93 <38209984+lucamicheletti93@users.noreply.github.com> Date: Mon, 3 Mar 2025 17:52:20 +0100 Subject: [PATCH 0518/1650] [PWGDQ] Adding new cuts and histograms (#10293) Co-authored-by: Lucamicheletti93 --- PWGDQ/Core/CutsLibrary.cxx | 15 +++++++++++++++ PWGDQ/Core/HistogramsLibrary.cxx | 8 ++++++++ 2 files changed, 23 insertions(+) diff --git a/PWGDQ/Core/CutsLibrary.cxx b/PWGDQ/Core/CutsLibrary.cxx index b5d8c35ffa9..da618c7b1a5 100644 --- a/PWGDQ/Core/CutsLibrary.cxx +++ b/PWGDQ/Core/CutsLibrary.cxx @@ -3848,6 +3848,21 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) } } + for (size_t icase = 0; icase < vecOccupancies.size() - 1; icase++) { + if (!nameStr.compare(Form("eventStandardSel8PbPbQualityTrackOccupancySlice_0_%lu", icase))) { + cut->AddCut(VarManager::kVtxZ, -10.0, 10.0); + cut->AddCut(VarManager::kIsSel8, 0.5, 1.5); + cut->AddCut(VarManager::kIsNoTFBorder, 0.5, 1.5); + cut->AddCut(VarManager::kIsNoITSROFBorder, 0.5, 1.5); + cut->AddCut(VarManager::kIsNoSameBunch, 0.5, 1.5); + cut->AddCut(VarManager::kIsGoodZvtxFT0vsPV, 0.5, 1.5); + cut->AddCut(VarManager::kCentFT0C, 0.0, 90.0); + cut->AddCut(VarManager::kTrackOccupancyInTimeRange, 0, vecOccupancies[icase]); + + return cut; + } + } + if (!nameStr.compare("eventStandardSel8ppQuality")) { cut->AddCut(VarManager::kVtxZ, -10.0, 10.0); cut->AddCut(VarManager::kIsSel8, 0.5, 1.5); diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 42cd0c55037..c1430efe05d 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -1299,6 +1299,14 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_V2", "", 6, varV2, bins, minBins, maxBins, 0, -1, kTRUE); // hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_V3", "", 6, varV3, bins, minBins, maxBins, 0, -1, kTRUE); // removed temporarily } + if (subGroupStr.Contains("flow-dimuon-high-mass")) { + int varV2[6] = {VarManager::kMass, VarManager::kPt, VarManager::kRap, VarManager::kCentFT0C, VarManager::kU2Q2, VarManager::kCos2DeltaPhi}; + + int bins[6] = {50, 30, 6, 18, 200, 40}; + double minBins[6] = {7.0, 0.0, 2.5, 0.0, -10.0, -2.0}; + double maxBins[6] = {12.0, 30.0, 4.0, 90.0, 10.0, 2.0}; + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_V2", "", 6, varV2, bins, minBins, maxBins, 0, -1, kTRUE); + } if (subGroupStr.Contains("flow-ccdb")) { hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V2SPwR", "Mass_Pt_CentFT0C_V2SPwR", true, 250, 0.0, 5.0, VarManager::kMass, 200, 0.0, 20.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV2SP, VarManager::kWV2SP); hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V2EPwR", "Mass_Pt_CentFT0C_V2EPwR", true, 250, 0.0, 5.0, VarManager::kMass, 200, 0.0, 20.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV2EP, VarManager::kWV2EP); From 1a5bd21dc1e732d2750534cdc685566a7a19b1de Mon Sep 17 00:00:00 2001 From: Stefano Cannito <143754257+scannito@users.noreply.github.com> Date: Mon, 3 Mar 2025 17:54:45 +0100 Subject: [PATCH 0519/1650] [PWGLF] Fixed bug in rapidity-gap class ordering (#10294) --- .../Tasks/Strangeness/phik0shortanalysis.cxx | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx index 7eae15e2134..b9bb7ba3f9b 100644 --- a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx @@ -1048,6 +1048,9 @@ struct Phik0shortanalysis { if (fillMethodSingleWeight) phiPurity = getPhiPurity(multiplicity, recPhi); + if (fillMethodMultipleWeights) + listrecPhi.push_back(recPhi); + counts.at(0)++; weights.at(0) *= (1 - phiPurity); if (std::abs(v0.yK0Short() - recPhi.Rapidity()) > cfgFCutOnDeltaY) @@ -1058,9 +1061,6 @@ struct Phik0shortanalysis { continue; counts.at(2)++; weights.at(2) *= (1 - phiPurity); - - if (fillMethodMultipleWeights) - listrecPhi.push_back(std::move(recPhi)); } } @@ -1137,6 +1137,9 @@ struct Phik0shortanalysis { if (fillMethodSingleWeight) phiPurity = getPhiPurity(multiplicity, recPhi); + if (fillMethodMultipleWeights) + listrecPhi.push_back(recPhi); + counts.at(0)++; weights.at(0) *= (1 - phiPurity); if (std::abs(track.rapidity(massPi) - recPhi.Rapidity()) > cfgFCutOnDeltaY) @@ -1147,9 +1150,6 @@ struct Phik0shortanalysis { continue; counts.at(2)++; weights.at(2) *= (1 - phiPurity); - - if (fillMethodMultipleWeights) - listrecPhi.push_back(std::move(recPhi)); } } @@ -1755,6 +1755,9 @@ struct Phik0shortanalysis { if (fillMethodSingleWeight) phiPurity = getPhiPurity(genmultiplicity, recPhi); + if (fillMethodMultipleWeights) + listrecPhi.push_back(recPhi); + counts.at(0)++; weights.at(0) *= (1 - phiPurity); if (std::abs(v0.yK0Short() - recPhi.Rapidity()) > cfgFCutOnDeltaY) @@ -1765,9 +1768,6 @@ struct Phik0shortanalysis { continue; counts.at(2)++; weights.at(2) *= (1 - phiPurity); - - if (fillMethodMultipleWeights) - listrecPhi.push_back(std::move(recPhi)); } } @@ -1879,6 +1879,9 @@ struct Phik0shortanalysis { if (fillMethodSingleWeight) phiPurity = getPhiPurity(genmultiplicity, recPhi); + if (fillMethodMultipleWeights) + listrecPhi.push_back(recPhi); + counts.at(0)++; weights.at(0) *= (1 - phiPurity); if (std::abs(track.rapidity(massPi) - recPhi.Rapidity()) > cfgFCutOnDeltaY) @@ -1889,9 +1892,6 @@ struct Phik0shortanalysis { continue; counts.at(2)++; weights.at(2) *= (1 - phiPurity); - - if (fillMethodMultipleWeights) - listrecPhi.push_back(std::move(recPhi)); } } From 2c5e2f85d9d9a7de87e5ebaa119ed97258530cba Mon Sep 17 00:00:00 2001 From: Swati <69241911+SwatiSaha-1997@users.noreply.github.com> Date: Mon, 3 Mar 2025 23:01:23 +0530 Subject: [PATCH 0520/1650] [PWGCF] add event-selection cut TOFmatched (#10295) --- .../EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx b/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx index 61491113bae..91070889b55 100644 --- a/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx @@ -154,7 +154,7 @@ struct NetprotonCumulantsMc { Configurable cfgUseGoodITSLayerAllCut{"cfgUseGoodITSLayerAllCut", true, "Remove time interval with dead ITS zone"}; Configurable cfgIfRejectElectron{"cfgIfRejectElectron", true, "Remove electrons"}; Configurable cfgIfMandatoryTOF{"cfgIfMandatoryTOF", true, "Mandatory TOF requirement to remove pileup"}; - + Configurable cfgEvSelkIsVertexTOFmatched{"cfgEvSelkIsVertexTOFmatched", true, "If matched with TOF, for pileup"}; ConfigurableAxis cfgCentralityBins{"cfgCentralityBins", {90, 0., 90.}, "Centrality/Multiplicity percentile bining"}; // Connect to ccdb @@ -1025,6 +1025,9 @@ struct NetprotonCumulantsMc { if (cfgEvSelkNoSameBunchPileup && !(collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup))) { continue; } + if (cfgEvSelkIsVertexTOFmatched && !(collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched))) { + continue; + } cent = collision.centFT0M(); @@ -1134,6 +1137,9 @@ struct NetprotonCumulantsMc { } if (cfgEvSelkNoSameBunchPileup && !(collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup))) { return; + } + if (cfgEvSelkIsVertexTOFmatched && !(collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched))) { + return; ; } @@ -2076,6 +2082,11 @@ struct NetprotonCumulantsMc { return; } + if (cfgEvSelkIsVertexTOFmatched && !(coll.selection_bit(o2::aod::evsel::kIsVertexTOFmatched))) { + return; + ; + } + histos.fill(HIST("hZvtx_after_sel"), coll.posZ()); // variables auto cent = coll.centFT0M(); From 7a55829a7d7dd7b3d215db94aa5a008f4bbef7b7 Mon Sep 17 00:00:00 2001 From: Chiara De Martin <39315597+ChiaraDeMartin95@users.noreply.github.com> Date: Mon, 3 Mar 2025 18:45:44 +0100 Subject: [PATCH 0521/1650] [PWGLF] Add booleans to store thns and apply mass cut (#10296) Co-authored-by: Chiara De Martin --- .../TableProducer/Strangeness/cascadeflow.cxx | 233 ++++++++++++------ 1 file changed, 159 insertions(+), 74 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/cascadeflow.cxx b/PWGLF/TableProducer/Strangeness/cascadeflow.cxx index b5c95085c22..1be468344d4 100644 --- a/PWGLF/TableProducer/Strangeness/cascadeflow.cxx +++ b/PWGLF/TableProducer/Strangeness/cascadeflow.cxx @@ -130,11 +130,19 @@ static const std::vector labelsCutScore = {"Background score", "Sig struct cascadeFlow { // Output filling criteria - Configurable isFillTree{"isFillTree", 1, ""}; - Configurable isFillTHNXi{"isFillTHNXi", 1, ""}; - Configurable isFillTHNXi_PzVsPsi{"isFillTHNXi_PzVsPsi", 1, ""}; - Configurable isFillTHNOmega{"isFillTHNOmega", 1, ""}; - Configurable isFillTHNOmega_PzVsPsi{"isFillTHNOmega_PzVsPsi", 1, ""}; + struct : ConfigurableGroup { + Configurable isFillTree{"isFillTree", 1, ""}; + Configurable isFillTHNXi{"isFillTHNXi", 1, ""}; + Configurable isFillTHNXi_PzVsPsi{"isFillTHNXi_PzVsPsi", 1, ""}; + Configurable isFillTHNOmega{"isFillTHNOmega", 1, ""}; + Configurable isFillTHNOmega_PzVsPsi{"isFillTHNOmega_PzVsPsi", 1, ""}; + Configurable isFillTHN_V2{"isFillTHN_V2", 1, ""}; + Configurable isFillTHN_Pz{"isFillTHN_Pz", 1, ""}; + Configurable isFillTHN_PzFromLambda{"isFillTHN_PzFromLambda", 1, ""}; + Configurable isFillTHN_Acc{"isFillTHN_Acc", 1, ""}; + Configurable isFillTHN_AccFromLambdaVsCasc{"isFillTHN_AccFromLambdaVsCasc", 1, ""}; + Configurable isFillTHN_AccFromLambdaVsLambda{"isFillTHN_AccFromLambdaVsLambda", 1, ""}; + } fillingConfigs; // axes ConfigurableAxis axisQVs{"axisQVs", {500, -10.f, 10.f}, "axisQVs"}; @@ -162,7 +170,6 @@ struct cascadeFlow { ConfigurableAxis thnConfigAxisCosThetaProtonAlpha{"thnConfigAxisCosThetaProtonAlpha", {200, -2, 2}, ""}; // Event selection criteria - Configurable isStoreTrueCascOnly{"isStoreTrueCascOnly", 1, ""}; Configurable cutzvertex{"cutzvertex", 10.0f, "Accepted z-vertex range (cm)"}; Configurable sel8{"sel8", 1, "Apply sel8 event selection"}; Configurable isNoSameBunchPileupCut{"isNoSameBunchPileupCut", 1, "Same found-by-T0 bunch crossing rejection"}; @@ -179,10 +186,21 @@ struct cascadeFlow { Configurable isNoCollInRofStandard{"isNoCollInRofStandard", 0, "To remove collisions in the same ITS ROF and with a multiplicity above a certain threshold"}; Configurable isNoTVXinTRD{"isNoTVXinTRD", 0, "To remove collisions with trigger in TRD"}; - Configurable MinPt{"MinPt", 0.6, "Min pt of cascade"}; - Configurable MaxPt{"MaxPt", 10, "Max pt of cascade"}; - Configurable MinPtLambda{"MinPtLambda", 0.4, "Min pt of daughter lambda"}; - Configurable MaxPtLambda{"MaxPtLambda", 10, "Max pt of daughter lambda"}; + struct : ConfigurableGroup { + Configurable MinPt{"MinPt", 0.6, "Min pt of cascade"}; + Configurable MaxPt{"MaxPt", 10, "Max pt of cascade"}; + Configurable MinPtLambda{"MinPtLambda", 0.4, "Min pt of daughter lambda"}; + Configurable MaxPtLambda{"MaxPtLambda", 10, "Max pt of daughter lambda"}; + Configurable etaCasc{"etaCasc", 0.8, "etaCasc"}; + Configurable etaLambdaMax{"etaLambdaMax", 0.8, "etaLambdaMax"}; + Configurable MinLambdaMass{"MinLambdaMass", 1.1, ""}; + Configurable MaxLambdaMass{"MaxLambdaMass", 1.13, ""}; + Configurable MinXiMass{"MinXiMass", 1.300, ""}; + Configurable MaxXiMass{"MaxXiMass", 1.345, ""}; + Configurable MinOmegaMass{"MinOmegaMass", 1.655, ""}; + Configurable MaxOmegaMass{"MaxOmegaMass", 1.690, ""}; + } CandidateConfigs; + Configurable sideBandStart{"sideBandStart", 5, "Start of the sideband region in number of sigmas"}; Configurable sideBandEnd{"sideBandEnd", 7, "End of the sideband region in number of sigmas"}; Configurable downsample{"downsample", 1., "Downsample training output tree"}; @@ -190,9 +208,9 @@ struct cascadeFlow { Configurable nsigmatpcPr{"nsigmatpcPr", 5, "nsigmatpcPr"}; Configurable nsigmatpcPi{"nsigmatpcPi", 5, "nsigmatpcPi"}; Configurable mintpccrrows{"mintpccrrows", 70, "mintpccrrows"}; + + Configurable isStoreTrueCascOnly{"isStoreTrueCascOnly", 1, ""}; Configurable etaCascMCGen{"etaCascMCGen", 0.8, "etaCascMCGen"}; - Configurable etaCasc{"etaCasc", 0.8, "etaCasc"}; - Configurable etaLambdaMax{"etaLambdaMax", 0.8, "etaLambdaMax"}; Configurable yCascMCGen{"yCascMCGen", 0.5, "yCascMCGen"}; Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; @@ -492,7 +510,7 @@ struct cascadeFlow { float maxMass[2]{1.36, 1.73}; const AxisSpec massCascAxis[2]{{static_cast((maxMass[0] - minMass[0]) / 0.001f), minMass[0], maxMass[0], "#Xi candidate mass (GeV/c^{2})"}, {static_cast((maxMass[1] - minMass[1]) / 0.001f), minMass[1], maxMass[1], "#Omega candidate mass (GeV/c^{2})"}}; - const AxisSpec ptAxis{static_cast((MaxPt - MinPt) / 0.2), MinPt, MaxPt, "#it{p}_{T} (GeV/#it{c})"}; + const AxisSpec ptAxis{static_cast((CandidateConfigs.MaxPt - CandidateConfigs.MinPt) / 0.2), CandidateConfigs.MinPt, CandidateConfigs.MaxPt, "#it{p}_{T} (GeV/#it{c})"}; const AxisSpec v2Axis{200, -1., 1., "#it{v}_{2}"}; const AxisSpec CentAxis{18, 0., 90., "FT0C centrality percentile"}; TString hNEventsLabels[10] = {"All", "sel8", "z vrtx", "kNoSameBunchPileup", "kIsGoodZvtxFT0vsPV", "trackOccupancyInTimeRange", "kNoCollInTimeRange", "kNoCollInROF", "kTVXinTRD", "kIsGoodEventEP"}; @@ -563,35 +581,60 @@ struct cascadeFlow { const AxisSpec thnAxisCosThetaOmegaAlpha{thnConfigAxisCosThetaOmegaAlpha, "CosThetaOmegaWithAlpha"}; const AxisSpec thnAxisCosThetaProtonAlpha{thnConfigAxisCosThetaProtonAlpha, "CosThetaProtonWithAlpha"}; - if (isFillTHNXi) { - histos.add("hXiV2", "THn for v2 of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisV2}); - histos.add("hXiPzs2", "THn for Pzs2 of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisPzs2Xi}); - histos.add("hXiPzs2FromLambda", "THn for Pzs2 of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisPzs2Lambda}); - histos.add("hXiCos2Theta", "THn for Cos2Theta of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCos2Theta}); - histos.add("hXiCos2ThetaFromLambda", "THn for Cos2Theta of Lambda vs Xi mass and pt", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCos2Theta}); - histos.add("hXiCos2ThetaFromLambdaL", "THn for Cos2Theta of Lambda vs Lambda mass and pt", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPtLambda, thnAxisMassLambda, thnAxisBDTScore, thnAxisCos2ThetaL}); + histos.add("massXi_ProtonAcc", "massXi", HistType::kTH1F, {thnAxisMassXi}); + histos.add("massOmega_ProtonAcc", "massOmega", HistType::kTH1F, {thnAxisMassOmega}); + + if (fillingConfigs.isFillTHNXi) { + if (fillingConfigs.isFillTHN_V2) + histos.add("hXiV2", "THn for v2 of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisV2}); + if (fillingConfigs.isFillTHN_Pz) + histos.add("hXiPzs2", "THn for Pzs2 of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisPzs2Xi}); + if (fillingConfigs.isFillTHN_PzFromLambda) + histos.add("hXiPzs2FromLambda", "THn for Pzs2 of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisPzs2Lambda}); + if (fillingConfigs.isFillTHN_Acc) + histos.add("hXiCos2Theta", "THn for Cos2Theta of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCos2Theta}); + if (fillingConfigs.isFillTHN_AccFromLambdaVsCasc) + histos.add("hXiCos2ThetaFromLambda", "THn for Cos2Theta of Lambda vs Xi mass and pt", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCos2Theta}); + if (fillingConfigs.isFillTHN_AccFromLambdaVsLambda) + histos.add("hXiCos2ThetaFromLambdaL", "THn for Cos2Theta of Lambda vs Lambda mass and pt", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPtLambda, thnAxisMassLambda, thnAxisBDTScore, thnAxisCos2ThetaL}); } - if (isFillTHNXi_PzVsPsi) { - histos.add("hXiPzVsPsi", "THn for cosTheta of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCosThetaXiAlpha, thnAxisPsiDiff}); - histos.add("hXiPzVsPsiFromLambda", "THn for cosTheta of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCosThetaProtonAlpha, thnAxisPsiDiff}); - histos.add("hXiCos2ThetaVsPsi", "THn for cos2Theta of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCos2Theta, thnAxisPsiDiff}); - histos.add("hXiCos2ThetaVsPsiFromLambda", "THn for cos2Theta of Lambda vs Xi mass and pt", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCos2Theta, thnAxisPsiDiff}); - histos.add("hXiCos2ThetaVsPsiFromLambdaL", "THn for cos2Theta of Lambda vs Lambda mass and pt", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPtLambda, thnAxisMassLambda, thnAxisBDTScore, thnAxisCos2ThetaL, thnAxisPsiDiff}); + if (fillingConfigs.isFillTHNXi_PzVsPsi) { + if (fillingConfigs.isFillTHN_Pz) + histos.add("hXiPzVsPsi", "THn for cosTheta of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCosThetaXiAlpha, thnAxisPsiDiff}); + if (fillingConfigs.isFillTHN_PzFromLambda) + histos.add("hXiPzVsPsiFromLambda", "THn for cosTheta of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCosThetaProtonAlpha, thnAxisPsiDiff}); + if (fillingConfigs.isFillTHN_Acc) + histos.add("hXiCos2ThetaVsPsi", "THn for cos2Theta of Xi", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCos2Theta, thnAxisPsiDiff}); + if (fillingConfigs.isFillTHN_AccFromLambdaVsCasc) + histos.add("hXiCos2ThetaVsPsiFromLambda", "THn for cos2Theta of Lambda vs Xi mass and pt", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPt, thnAxisMassXi, thnAxisBDTScore, thnAxisCos2Theta, thnAxisPsiDiff}); + if (fillingConfigs.isFillTHN_AccFromLambdaVsLambda) + histos.add("hXiCos2ThetaVsPsiFromLambdaL", "THn for cos2Theta of Lambda vs Lambda mass and pt", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPtLambda, thnAxisMassLambda, thnAxisBDTScore, thnAxisCos2ThetaL, thnAxisPsiDiff}); } - if (isFillTHNOmega) { - histos.add("hOmegaV2", "THn for v2 of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisV2}); - histos.add("hOmegaPzs2", "THn for Pzs2 of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisPzs2Omega}); - histos.add("hOmegaPzs2FromLambda", "THn for Pzs2 of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisPzs2Lambda}); - histos.add("hOmegaCos2Theta", "THn for Cos2Theta of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCos2Theta}); - histos.add("hOmegaCos2ThetaFromLambda", "THn for Cos2Theta of Lambda vs Omega mass and pt", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCos2Theta}); - histos.add("hOmegaCos2ThetaFromLambdaL", "THn for Cos2Theta of Lambda vs Lambda mass and pt", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPtLambda, thnAxisMassLambda, thnAxisBDTScore, thnAxisCos2ThetaL}); + if (fillingConfigs.isFillTHNOmega) { + if (fillingConfigs.isFillTHN_V2) + histos.add("hOmegaV2", "THn for v2 of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisV2}); + if (fillingConfigs.isFillTHN_Pz) + histos.add("hOmegaPzs2", "THn for Pzs2 of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisPzs2Omega}); + if (fillingConfigs.isFillTHN_PzFromLambda) + histos.add("hOmegaPzs2FromLambda", "THn for Pzs2 of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisPzs2Lambda}); + if (fillingConfigs.isFillTHN_Acc) + histos.add("hOmegaCos2Theta", "THn for Cos2Theta of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCos2Theta}); + if (fillingConfigs.isFillTHN_AccFromLambdaVsCasc) + histos.add("hOmegaCos2ThetaFromLambda", "THn for Cos2Theta of Lambda vs Omega mass and pt", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCos2Theta}); + if (fillingConfigs.isFillTHN_AccFromLambdaVsLambda) + histos.add("hOmegaCos2ThetaFromLambdaL", "THn for Cos2Theta of Lambda vs Lambda mass and pt", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPtLambda, thnAxisMassLambda, thnAxisBDTScore, thnAxisCos2ThetaL}); } - if (isFillTHNOmega_PzVsPsi) { - histos.add("hOmegaPzVsPsi", "THn for cosTheta of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCosThetaOmegaAlpha, thnAxisPsiDiff}); - histos.add("hOmegaPzVsPsiFromLambda", "THn for cosTheta of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCosThetaProtonAlpha, thnAxisPsiDiff}); - histos.add("hOmegaCos2ThetaVsPsi", "THn for cos2Theta of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCos2Theta, thnAxisPsiDiff}); - histos.add("hOmegaCos2ThetaVsPsiFromLambda", "THn for cos2Theta of Lambda vs Omega mass and pt", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCos2Theta, thnAxisPsiDiff}); - histos.add("hOmegaCos2ThetaVsPsiFromLambdaL", "THn for cos2Theta of Lambda vs Lambda mass and pt", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPtLambda, thnAxisMassLambda, thnAxisBDTScore, thnAxisCos2ThetaL, thnAxisPsiDiff}); + if (fillingConfigs.isFillTHNOmega_PzVsPsi) { + if (fillingConfigs.isFillTHN_Pz) + histos.add("hOmegaPzVsPsi", "THn for cosTheta of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCosThetaOmegaAlpha, thnAxisPsiDiff}); + if (fillingConfigs.isFillTHN_PzFromLambda) + histos.add("hOmegaPzVsPsiFromLambda", "THn for cosTheta of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCosThetaProtonAlpha, thnAxisPsiDiff}); + if (fillingConfigs.isFillTHN_Acc) + histos.add("hOmegaCos2ThetaVsPsi", "THn for cos2Theta of Omega", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCos2Theta, thnAxisPsiDiff}); + if (fillingConfigs.isFillTHN_AccFromLambdaVsCasc) + histos.add("hOmegaCos2ThetaVsPsiFromLambda", "THn for cos2Theta of Lambda vs Omega mass and pt", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPt, thnAxisMassOmega, thnAxisBDTScore, thnAxisCos2Theta, thnAxisPsiDiff}); + if (fillingConfigs.isFillTHN_AccFromLambdaVsLambda) + histos.add("hOmegaCos2ThetaVsPsiFromLambdaL", "THn for cos2Theta of Lambda vs Lambda mass and pt", HistType::kTHnF, {thnAxisFT0C, thnAxisCharge, thnAxisEta, thnAxisPtLambda, thnAxisMassLambda, thnAxisBDTScore, thnAxisCos2ThetaL, thnAxisPsiDiff}); } histosMCGen.add("h2DGenXiEta08", "h2DGenXiEta08", HistType::kTH2F, {{100, 0, 100}, {400, 0, 20}}); @@ -809,7 +852,7 @@ struct cascadeFlow { float massCasc[2]{casc.mXi(), casc.mOmega()}; // pt cut - if (casc.pt() < MinPt || casc.pt() > MaxPt) { + if (casc.pt() < CandidateConfigs.MinPt || casc.pt() > CandidateConfigs.MaxPt) { continue; } @@ -878,12 +921,12 @@ struct cascadeFlow { double MeanCos2ThetaLambdaFromOmega = 1; double MeanCos2ThetaProtonFromLambda = 1; if (applyAcceptanceCorrection) { - if (ptLambda < MinPtLambda || ptLambda > MaxPtLambda) { + if (ptLambda < CandidateConfigs.MinPtLambda || ptLambda > CandidateConfigs.MaxPtLambda) { continue; } - if (std::abs(casc.eta()) > etaCasc) + if (std::abs(casc.eta()) > CandidateConfigs.etaCasc) continue; - if (std::abs(etaLambda) > etaLambdaMax) + if (std::abs(etaLambda) > CandidateConfigs.etaLambdaMax) continue; int bin2DXi = hAcceptanceXi->FindBin(casc.pt(), casc.eta()); int bin2DOmega = hAcceptanceOmega->FindBin(casc.pt(), casc.eta()); @@ -929,41 +972,83 @@ struct cascadeFlow { BDTresponse[1] = bdtScore[1][1]; } - if (std::abs(casc.eta()) < etaCasc) { - if (isFillTHNXi) { - histos.get(HIST("hXiV2"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], v2CEP); - histos.get(HIST("hXiPzs2"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], Pzs2Xi); - histos.get(HIST("hXiPzs2FromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], Pzs2LambdaFromCasc); - histos.get(HIST("hXiCos2Theta"))->Fill(coll.centFT0C(), ChargeIndex, casc.eta(), casc.pt(), casc.mXi(), BDTresponse[0], Cos2ThetaXi); - histos.get(HIST("hXiCos2ThetaFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.eta(), casc.pt(), casc.mXi(), BDTresponse[0], Cos2ThetaLambda); - histos.get(HIST("hXiCos2ThetaFromLambdaL"))->Fill(coll.centFT0C(), ChargeIndex, etaLambda, ptLambda, casc.mLambda(), BDTresponse[0], Cos2ThetaLambda); + if (std::abs(casc.eta()) < CandidateConfigs.etaCasc) { + if (fillingConfigs.isFillTHNXi) { + if (fillingConfigs.isFillTHN_V2) + histos.get(HIST("hXiV2"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], v2CEP); + if (fillingConfigs.isFillTHN_Pz) + histos.get(HIST("hXiPzs2"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], Pzs2Xi); + if (casc.mLambda() > CandidateConfigs.MinLambdaMass && casc.mLambda() < CandidateConfigs.MaxLambdaMass) { + if (fillingConfigs.isFillTHN_PzFromLambda) + histos.get(HIST("hXiPzs2FromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], Pzs2LambdaFromCasc); + } + if (fillingConfigs.isFillTHN_Acc) + histos.get(HIST("hXiCos2Theta"))->Fill(coll.centFT0C(), ChargeIndex, casc.eta(), casc.pt(), casc.mXi(), BDTresponse[0], Cos2ThetaXi); + if (fillingConfigs.isFillTHN_AccFromLambdaVsCasc) + histos.get(HIST("hXiCos2ThetaFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.eta(), casc.pt(), casc.mXi(), BDTresponse[0], Cos2ThetaLambda); + if (casc.mXi() > CandidateConfigs.MinXiMass && casc.mXi() < CandidateConfigs.MaxXiMass) { + if (fillingConfigs.isFillTHN_AccFromLambdaVsLambda) + histos.get(HIST("hXiCos2ThetaFromLambdaL"))->Fill(coll.centFT0C(), ChargeIndex, etaLambda, ptLambda, casc.mLambda(), BDTresponse[0], Cos2ThetaLambda); + histos.get(HIST("massXi_ProtonAcc"))->Fill(casc.mXi()); + } } - if (isFillTHNXi_PzVsPsi) { - histos.get(HIST("hXiPzVsPsi"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], CosThetaXiWithAlpha, 2 * cascminuspsiT0C); - histos.get(HIST("hXiPzVsPsiFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], CosThetaProtonWithAlpha, 2 * cascminuspsiT0C); - histos.get(HIST("hXiCos2ThetaVsPsi"))->Fill(coll.centFT0C(), ChargeIndex, casc.eta(), casc.pt(), casc.mXi(), BDTresponse[0], Cos2ThetaXi, 2 * cascminuspsiT0C); - histos.get(HIST("hXiCos2ThetaVsPsiFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.eta(), casc.pt(), casc.mXi(), BDTresponse[0], Cos2ThetaLambda, 2 * cascminuspsiT0C); - histos.get(HIST("hXiCos2ThetaVsPsiFromLambdaL"))->Fill(coll.centFT0C(), ChargeIndex, etaLambda, ptLambda, casc.mLambda(), BDTresponse[0], Cos2ThetaLambda, 2 * cascminuspsiT0C); + if (fillingConfigs.isFillTHNXi_PzVsPsi) { + if (fillingConfigs.isFillTHN_Pz) + histos.get(HIST("hXiPzVsPsi"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], CosThetaXiWithAlpha, 2 * cascminuspsiT0C); + if (fillingConfigs.isFillTHN_PzFromLambda) + histos.get(HIST("hXiPzVsPsiFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mXi(), BDTresponse[0], CosThetaProtonWithAlpha, 2 * cascminuspsiT0C); + if (casc.mLambda() > CandidateConfigs.MinLambdaMass && casc.mLambda() < CandidateConfigs.MaxLambdaMass) { + if (fillingConfigs.isFillTHN_Acc) + histos.get(HIST("hXiCos2ThetaVsPsi"))->Fill(coll.centFT0C(), ChargeIndex, casc.eta(), casc.pt(), casc.mXi(), BDTresponse[0], Cos2ThetaXi, 2 * cascminuspsiT0C); + } + if (fillingConfigs.isFillTHN_AccFromLambdaVsCasc) + histos.get(HIST("hXiCos2ThetaVsPsiFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.eta(), casc.pt(), casc.mXi(), BDTresponse[0], Cos2ThetaLambda, 2 * cascminuspsiT0C); + if (casc.mXi() > CandidateConfigs.MinXiMass && casc.mXi() < CandidateConfigs.MaxXiMass) { + if (fillingConfigs.isFillTHN_AccFromLambdaVsLambda) + histos.get(HIST("hXiCos2ThetaVsPsiFromLambdaL"))->Fill(coll.centFT0C(), ChargeIndex, etaLambda, ptLambda, casc.mLambda(), BDTresponse[0], Cos2ThetaLambda, 2 * cascminuspsiT0C); + histos.get(HIST("massXi_ProtonAcc"))->Fill(casc.mXi()); + } } - if (isFillTHNOmega) { - histos.get(HIST("hOmegaV2"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[1], v2CEP); - histos.get(HIST("hOmegaPzs2"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[1], Pzs2Omega); - histos.get(HIST("hOmegaPzs2FromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[1], Pzs2LambdaFromCasc); - histos.get(HIST("hOmegaCos2Theta"))->Fill(coll.centFT0C(), ChargeIndex, casc.eta(), casc.pt(), casc.mOmega(), BDTresponse[1], Cos2ThetaOmega); - histos.get(HIST("hOmegaCos2ThetaFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.eta(), casc.pt(), casc.mOmega(), BDTresponse[1], Cos2ThetaLambda); - histos.get(HIST("hOmegaCos2ThetaFromLambdaL"))->Fill(coll.centFT0C(), ChargeIndex, etaLambda, ptLambda, casc.mLambda(), BDTresponse[1], Cos2ThetaLambda); + if (fillingConfigs.isFillTHNOmega) { + if (fillingConfigs.isFillTHN_V2) + histos.get(HIST("hOmegaV2"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[1], v2CEP); + if (fillingConfigs.isFillTHN_Pz) + histos.get(HIST("hOmegaPzs2"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[1], Pzs2Omega); + if (casc.mLambda() > CandidateConfigs.MinLambdaMass && casc.mLambda() < CandidateConfigs.MaxLambdaMass) { + if (fillingConfigs.isFillTHN_PzFromLambda) + histos.get(HIST("hOmegaPzs2FromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[1], Pzs2LambdaFromCasc); + } + if (fillingConfigs.isFillTHN_Acc) + histos.get(HIST("hOmegaCos2Theta"))->Fill(coll.centFT0C(), ChargeIndex, casc.eta(), casc.pt(), casc.mOmega(), BDTresponse[1], Cos2ThetaOmega); + if (fillingConfigs.isFillTHN_AccFromLambdaVsCasc) + histos.get(HIST("hOmegaCos2ThetaFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.eta(), casc.pt(), casc.mOmega(), BDTresponse[1], Cos2ThetaLambda); + if (casc.mOmega() > CandidateConfigs.MinOmegaMass && casc.mOmega() < CandidateConfigs.MaxOmegaMass) { + if (fillingConfigs.isFillTHN_AccFromLambdaVsLambda) + histos.get(HIST("hOmegaCos2ThetaFromLambdaL"))->Fill(coll.centFT0C(), ChargeIndex, etaLambda, ptLambda, casc.mLambda(), BDTresponse[1], Cos2ThetaLambda); + histos.get(HIST("massOmega_ProtonAcc"))->Fill(casc.mOmega()); + } } - if (isFillTHNOmega_PzVsPsi) { - histos.get(HIST("hOmegaPzVsPsi"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[0], CosThetaOmegaWithAlpha, 2 * cascminuspsiT0C); - histos.get(HIST("hOmegaPzVsPsiFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[0], CosThetaProtonWithAlpha, 2 * cascminuspsiT0C); - histos.get(HIST("hOmegaCos2ThetaVsPsi"))->Fill(coll.centFT0C(), ChargeIndex, casc.eta(), casc.pt(), casc.mOmega(), BDTresponse[0], Cos2ThetaOmega, 2 * cascminuspsiT0C); - histos.get(HIST("hOmegaCos2ThetaVsPsiFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.eta(), casc.pt(), casc.mOmega(), BDTresponse[0], Cos2ThetaLambda, 2 * cascminuspsiT0C); - histos.get(HIST("hOmegaCos2ThetaVsPsiFromLambdaL"))->Fill(coll.centFT0C(), ChargeIndex, etaLambda, ptLambda, casc.mLambda(), BDTresponse[0], Cos2ThetaLambda, 2 * cascminuspsiT0C); + if (fillingConfigs.isFillTHNOmega_PzVsPsi) { + if (fillingConfigs.isFillTHN_Pz) + histos.get(HIST("hOmegaPzVsPsi"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[1], CosThetaOmegaWithAlpha, 2 * cascminuspsiT0C); + if (fillingConfigs.isFillTHN_PzFromLambda) + histos.get(HIST("hOmegaPzVsPsiFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.pt(), casc.mOmega(), BDTresponse[1], CosThetaProtonWithAlpha, 2 * cascminuspsiT0C); + if (casc.mLambda() > CandidateConfigs.MinLambdaMass && casc.mLambda() < CandidateConfigs.MaxLambdaMass) { + if (fillingConfigs.isFillTHN_Acc) + histos.get(HIST("hOmegaCos2ThetaVsPsi"))->Fill(coll.centFT0C(), ChargeIndex, casc.eta(), casc.pt(), casc.mOmega(), BDTresponse[1], Cos2ThetaOmega, 2 * cascminuspsiT0C); + } + if (fillingConfigs.isFillTHN_AccFromLambdaVsCasc) + histos.get(HIST("hOmegaCos2ThetaVsPsiFromLambda"))->Fill(coll.centFT0C(), ChargeIndex, casc.eta(), casc.pt(), casc.mOmega(), BDTresponse[1], Cos2ThetaLambda, 2 * cascminuspsiT0C); + if (casc.mOmega() > CandidateConfigs.MinOmegaMass && casc.mOmega() < CandidateConfigs.MaxOmegaMass) { + if (fillingConfigs.isFillTHN_AccFromLambdaVsLambda) + histos.get(HIST("hOmegaCos2ThetaVsPsiFromLambdaL"))->Fill(coll.centFT0C(), ChargeIndex, etaLambda, ptLambda, casc.mLambda(), BDTresponse[1], Cos2ThetaLambda, 2 * cascminuspsiT0C); + histos.get(HIST("massOmega_ProtonAcc"))->Fill(casc.mOmega()); + } } } if (isSelectedCasc[0] || isSelectedCasc[1]) { - if (isFillTree) + if (fillingConfigs.isFillTree) fillAnalysedTable(coll, hasEventPlane, hasSpectatorPlane, casc, v2CSP, v2CEP, v1SP_ZDCA, v1SP_ZDCC, PsiT0C, BDTresponse[0], BDTresponse[1], 0); } } @@ -1054,7 +1139,7 @@ struct cascadeFlow { float massCasc[2]{casc.mXi(), casc.mOmega()}; // inv mass loose cut - if (casc.pt() < MinPt || casc.pt() > MaxPt) { + if (casc.pt() < CandidateConfigs.MinPt || casc.pt() > CandidateConfigs.MaxPt) { continue; } @@ -1116,7 +1201,7 @@ struct cascadeFlow { BDTresponse[1] = bdtScore[1][1]; } if (isSelectedCasc[0] || isSelectedCasc[1]) - if (isFillTree) + if (fillingConfigs.isFillTree) fillAnalysedTable(coll, hasEventPlane, hasSpectatorPlane, casc, v2CSP, v2CEP, v1SP_ZDCA, v1SP_ZDCC, PsiT0C, BDTresponse[0], BDTresponse[1], 0); } } @@ -1199,7 +1284,7 @@ struct cascadeFlow { float massCasc[2]{casc.mXi(), casc.mOmega()}; - if (casc.pt() < MinPt || casc.pt() > MaxPt) { + if (casc.pt() < CandidateConfigs.MinPt || casc.pt() > CandidateConfigs.MaxPt) { continue; } From 6e89b81465a6bd09d4529ceb38f1fe0e3c6f94cd Mon Sep 17 00:00:00 2001 From: nzardosh Date: Mon, 3 Mar 2025 19:52:14 +0100 Subject: [PATCH 0522/1650] [PWGJE] making pair bkg optional (#10299) --- PWGJE/Tasks/jetSubstructure.cxx | 53 ++++++++++++----------- PWGJE/Tasks/jetSubstructureHF.cxx | 72 ++++++++++++++++--------------- 2 files changed, 65 insertions(+), 60 deletions(-) diff --git a/PWGJE/Tasks/jetSubstructure.cxx b/PWGJE/Tasks/jetSubstructure.cxx index f2aae92180a..f6cd4c9dd72 100644 --- a/PWGJE/Tasks/jetSubstructure.cxx +++ b/PWGJE/Tasks/jetSubstructure.cxx @@ -64,6 +64,7 @@ struct JetSubstructureTask { Configurable beta{"beta", 0.0, "soft drop beta"}; Configurable kappa{"kappa", 1.0, "angularity kappa"}; Configurable alpha{"alpha", 1.0, "angularity alpha"}; + Configurable doPairBkg{"doPairBkg", true, "save bkg pairs"}; Configurable pairConstituentPtMin{"pairConstituentPtMin", 1.0, "pt cut off for constituents going into pairs"}; Service pdg; @@ -221,6 +222,7 @@ struct JetSubstructureTask { pairPerpCone1PerpCone2PtVec.clear(); pairPerpCone1PerpCone2EnergyVec.clear(); pairPerpCone1PerpCone2ThetaVec.clear(); + int32_t collisionId = -1; if constexpr (!isMC) { collisionId = jet.collisionId(); @@ -256,37 +258,38 @@ struct JetSubstructureTask { } } perpConeRho = (perpCone1Pt + perpCone2Pt) / (2 * M_PI * (jet.r() / 100.0) * (jet.r() / 100.0)); // currently done per jet - could be better to do for leading jet if pushing to very low pT - - if (tracksVec.size() >= 1 && tracksPerpCone1Vec.size() >= 1) { - for (typename std::vector::size_type track1Index = 0; track1Index < tracksVec.size(); track1Index++) { - for (typename std::vector::size_type track2Index = 0; track2Index < tracksPerpCone1Vec.size(); track2Index++) { - pairJetPerpCone1PtVec.push_back(tracksVec.at(track1Index).pt() * tracksPerpCone1Vec.at(track2Index).pt()); - pairJetPerpCone1EnergyVec.push_back(2.0 * tracksVec.at(track1Index).energy() * tracksPerpCone1Vec.at(track2Index).energy()); - float dPhi = RecoDecay::constrainAngle(tracksVec.at(track1Index).phi() - (tracksPerpCone1Vec.at(track2Index).phi() - (M_PI / 2.)), -M_PI); - float dEta = tracksVec.at(track1Index).eta() - tracksPerpCone1Vec.at(track2Index).eta(); - pairJetPerpCone1ThetaVec.push_back(std::sqrt(dEta * dEta + dPhi * dPhi)); + if (doPairBkg) { + if (tracksVec.size() >= 1 && tracksPerpCone1Vec.size() >= 1) { + for (typename std::vector::size_type track1Index = 0; track1Index < tracksVec.size(); track1Index++) { + for (typename std::vector::size_type track2Index = 0; track2Index < tracksPerpCone1Vec.size(); track2Index++) { + pairJetPerpCone1PtVec.push_back(tracksVec.at(track1Index).pt() * tracksPerpCone1Vec.at(track2Index).pt()); + pairJetPerpCone1EnergyVec.push_back(2.0 * tracksVec.at(track1Index).energy() * tracksPerpCone1Vec.at(track2Index).energy()); + float dPhi = RecoDecay::constrainAngle(tracksVec.at(track1Index).phi() - (tracksPerpCone1Vec.at(track2Index).phi() - (M_PI / 2.)), -M_PI); + float dEta = tracksVec.at(track1Index).eta() - tracksPerpCone1Vec.at(track2Index).eta(); + pairJetPerpCone1ThetaVec.push_back(std::sqrt(dEta * dEta + dPhi * dPhi)); + } } } - } - if (tracksPerpCone1Vec.size() >= 1) { - for (typename std::vector::size_type track1Index = 0; track1Index < tracksPerpCone1Vec.size(); track1Index++) { - for (typename std::vector::size_type track2Index = track1Index + 1; track2Index < tracksPerpCone1Vec.size(); track2Index++) { - pairPerpCone1PerpCone1PtVec.push_back(tracksPerpCone1Vec.at(track1Index).pt() * tracksPerpCone1Vec.at(track2Index).pt()); - pairPerpCone1PerpCone1EnergyVec.push_back(2.0 * tracksPerpCone1Vec.at(track1Index).energy() * tracksPerpCone1Vec.at(track2Index).energy()); - pairPerpCone1PerpCone1ThetaVec.push_back(jetutilities::deltaR(tracksPerpCone1Vec.at(track1Index), tracksPerpCone1Vec.at(track2Index))); + if (tracksPerpCone1Vec.size() >= 1) { + for (typename std::vector::size_type track1Index = 0; track1Index < tracksPerpCone1Vec.size(); track1Index++) { + for (typename std::vector::size_type track2Index = track1Index + 1; track2Index < tracksPerpCone1Vec.size(); track2Index++) { + pairPerpCone1PerpCone1PtVec.push_back(tracksPerpCone1Vec.at(track1Index).pt() * tracksPerpCone1Vec.at(track2Index).pt()); + pairPerpCone1PerpCone1EnergyVec.push_back(2.0 * tracksPerpCone1Vec.at(track1Index).energy() * tracksPerpCone1Vec.at(track2Index).energy()); + pairPerpCone1PerpCone1ThetaVec.push_back(jetutilities::deltaR(tracksPerpCone1Vec.at(track1Index), tracksPerpCone1Vec.at(track2Index))); + } } } - } - if (tracksPerpCone1Vec.size() >= 1 && tracksPerpCone2Vec.size() >= 1) { - for (typename std::vector::size_type track1Index = 0; track1Index < tracksPerpCone1Vec.size(); track1Index++) { - for (typename std::vector::size_type track2Index = 0; track2Index < tracksPerpCone2Vec.size(); track2Index++) { - pairPerpCone1PerpCone2PtVec.push_back(tracksPerpCone1Vec.at(track1Index).pt() * tracksPerpCone2Vec.at(track2Index).pt()); - pairPerpCone1PerpCone2EnergyVec.push_back(2.0 * tracksPerpCone1Vec.at(track1Index).energy() * tracksPerpCone2Vec.at(track2Index).energy()); - float dPhi = RecoDecay::constrainAngle((tracksPerpCone1Vec.at(track1Index).phi() - (M_PI / 2.)) - (tracksPerpCone2Vec.at(track2Index).phi() + (M_PI / 2.)), -M_PI); - float dEta = tracksPerpCone1Vec.at(track1Index).eta() - tracksPerpCone2Vec.at(track2Index).eta(); - pairPerpCone1PerpCone2ThetaVec.push_back(std::sqrt(dEta * dEta + dPhi * dPhi)); + if (tracksPerpCone1Vec.size() >= 1 && tracksPerpCone2Vec.size() >= 1) { + for (typename std::vector::size_type track1Index = 0; track1Index < tracksPerpCone1Vec.size(); track1Index++) { + for (typename std::vector::size_type track2Index = 0; track2Index < tracksPerpCone2Vec.size(); track2Index++) { + pairPerpCone1PerpCone2PtVec.push_back(tracksPerpCone1Vec.at(track1Index).pt() * tracksPerpCone2Vec.at(track2Index).pt()); + pairPerpCone1PerpCone2EnergyVec.push_back(2.0 * tracksPerpCone1Vec.at(track1Index).energy() * tracksPerpCone2Vec.at(track2Index).energy()); + float dPhi = RecoDecay::constrainAngle((tracksPerpCone1Vec.at(track1Index).phi() - (M_PI / 2.)) - (tracksPerpCone2Vec.at(track2Index).phi() + (M_PI / 2.)), -M_PI); + float dEta = tracksPerpCone1Vec.at(track1Index).eta() - tracksPerpCone2Vec.at(track2Index).eta(); + pairPerpCone1PerpCone2ThetaVec.push_back(std::sqrt(dEta * dEta + dPhi * dPhi)); + } } } } diff --git a/PWGJE/Tasks/jetSubstructureHF.cxx b/PWGJE/Tasks/jetSubstructureHF.cxx index ef217af2600..3cbdbf6fd34 100644 --- a/PWGJE/Tasks/jetSubstructureHF.cxx +++ b/PWGJE/Tasks/jetSubstructureHF.cxx @@ -70,6 +70,7 @@ struct JetSubstructureHFTask { Configurable beta{"beta", 0.0, "soft drop beta"}; Configurable kappa{"kappa", 1.0, "angularity kappa"}; Configurable alpha{"alpha", 1.0, "angularity alpha"}; + Configurable doPairBkg{"doPairBkg", true, "save bkg pairs"}; Configurable pairConstituentPtMin{"pairConstituentPtMin", 1.0, "pt cut off for constituents going into pairs"}; Service pdg; @@ -330,50 +331,51 @@ struct JetSubstructureHFTask { } } perpConeRho = (perpCone1Pt + perpCone2Pt) / (2 * M_PI * (jet.r() / 100.0) * (jet.r() / 100.0)); // currently done per jet - could be better to do for leading jet if pushing to very low pT - - if (tracksVec.size() >= 1 && tracksPerpCone1Vec.size() >= 1) { - for (typename std::vector::size_type track1Index = 0; track1Index < tracksVec.size(); track1Index++) { - for (typename std::vector::size_type track2Index = 0; track2Index < tracksPerpCone1Vec.size(); track2Index++) { - pairJetPerpCone1PtVec.push_back(tracksVec.at(track1Index).pt() * tracksPerpCone1Vec.at(track2Index).pt()); - pairJetPerpCone1EnergyVec.push_back(2.0 * tracksVec.at(track1Index).energy() * tracksPerpCone1Vec.at(track2Index).energy()); - float dPhi = RecoDecay::constrainAngle(tracksVec.at(track1Index).phi() - (tracksPerpCone1Vec.at(track2Index).phi() - (M_PI / 2.)), -M_PI); - float dEta = tracksVec.at(track1Index).eta() - tracksPerpCone1Vec.at(track2Index).eta(); - pairJetPerpCone1ThetaVec.push_back(std::sqrt(dEta * dEta + dPhi * dPhi)); + if (doPairBkg) { + if (tracksVec.size() >= 1 && tracksPerpCone1Vec.size() >= 1) { + for (typename std::vector::size_type track1Index = 0; track1Index < tracksVec.size(); track1Index++) { + for (typename std::vector::size_type track2Index = 0; track2Index < tracksPerpCone1Vec.size(); track2Index++) { + pairJetPerpCone1PtVec.push_back(tracksVec.at(track1Index).pt() * tracksPerpCone1Vec.at(track2Index).pt()); + pairJetPerpCone1EnergyVec.push_back(2.0 * tracksVec.at(track1Index).energy() * tracksPerpCone1Vec.at(track2Index).energy()); + float dPhi = RecoDecay::constrainAngle(tracksVec.at(track1Index).phi() - (tracksPerpCone1Vec.at(track2Index).phi() - (M_PI / 2.)), -M_PI); + float dEta = tracksVec.at(track1Index).eta() - tracksPerpCone1Vec.at(track2Index).eta(); + pairJetPerpCone1ThetaVec.push_back(std::sqrt(dEta * dEta + dPhi * dPhi)); + } } } - } - if (candidatesVec.size() >= 1 && tracksPerpCone1Vec.size() >= 1) { - for (typename std::vector>::size_type candidate1Index = 0; candidate1Index < candidatesVec.size(); candidate1Index++) { - for (typename std::vector::size_type track2Index = 0; track2Index < tracksPerpCone1Vec.size(); track2Index++) { - pairJetPerpCone1PtVec.push_back(candidatesVec.at(candidate1Index).pt() * tracksPerpCone1Vec.at(track2Index).pt()); - auto candidate1Energy = std::sqrt((candidatesVec.at(candidate1Index).p() * candidatesVec.at(candidate1Index).p()) + (candMass * candMass)); - pairJetPerpCone1EnergyVec.push_back(2.0 * candidate1Energy * tracksPerpCone1Vec.at(track2Index).energy()); - float dPhi = RecoDecay::constrainAngle(candidatesVec.at(candidate1Index).phi() - (tracksPerpCone1Vec.at(track2Index).phi() - (M_PI / 2.)), -M_PI); - float dEta = candidatesVec.at(candidate1Index).eta() - tracksPerpCone1Vec.at(track2Index).eta(); - pairJetPerpCone1ThetaVec.push_back(std::sqrt(dEta * dEta + dPhi * dPhi)); + if (candidatesVec.size() >= 1 && tracksPerpCone1Vec.size() >= 1) { + for (typename std::vector>::size_type candidate1Index = 0; candidate1Index < candidatesVec.size(); candidate1Index++) { + for (typename std::vector::size_type track2Index = 0; track2Index < tracksPerpCone1Vec.size(); track2Index++) { + pairJetPerpCone1PtVec.push_back(candidatesVec.at(candidate1Index).pt() * tracksPerpCone1Vec.at(track2Index).pt()); + auto candidate1Energy = std::sqrt((candidatesVec.at(candidate1Index).p() * candidatesVec.at(candidate1Index).p()) + (candMass * candMass)); + pairJetPerpCone1EnergyVec.push_back(2.0 * candidate1Energy * tracksPerpCone1Vec.at(track2Index).energy()); + float dPhi = RecoDecay::constrainAngle(candidatesVec.at(candidate1Index).phi() - (tracksPerpCone1Vec.at(track2Index).phi() - (M_PI / 2.)), -M_PI); + float dEta = candidatesVec.at(candidate1Index).eta() - tracksPerpCone1Vec.at(track2Index).eta(); + pairJetPerpCone1ThetaVec.push_back(std::sqrt(dEta * dEta + dPhi * dPhi)); + } } } - } - if (tracksPerpCone1Vec.size() >= 1) { - for (typename std::vector::size_type track1Index = 0; track1Index < tracksPerpCone1Vec.size(); track1Index++) { - for (typename std::vector::size_type track2Index = track1Index + 1; track2Index < tracksPerpCone1Vec.size(); track2Index++) { - pairPerpCone1PerpCone1PtVec.push_back(tracksPerpCone1Vec.at(track1Index).pt() * tracksPerpCone1Vec.at(track2Index).pt()); - pairPerpCone1PerpCone1EnergyVec.push_back(2.0 * tracksPerpCone1Vec.at(track1Index).energy() * tracksPerpCone1Vec.at(track2Index).energy()); - pairPerpCone1PerpCone1ThetaVec.push_back(jetutilities::deltaR(tracksPerpCone1Vec.at(track1Index), tracksPerpCone1Vec.at(track2Index))); + if (tracksPerpCone1Vec.size() >= 1) { + for (typename std::vector::size_type track1Index = 0; track1Index < tracksPerpCone1Vec.size(); track1Index++) { + for (typename std::vector::size_type track2Index = track1Index + 1; track2Index < tracksPerpCone1Vec.size(); track2Index++) { + pairPerpCone1PerpCone1PtVec.push_back(tracksPerpCone1Vec.at(track1Index).pt() * tracksPerpCone1Vec.at(track2Index).pt()); + pairPerpCone1PerpCone1EnergyVec.push_back(2.0 * tracksPerpCone1Vec.at(track1Index).energy() * tracksPerpCone1Vec.at(track2Index).energy()); + pairPerpCone1PerpCone1ThetaVec.push_back(jetutilities::deltaR(tracksPerpCone1Vec.at(track1Index), tracksPerpCone1Vec.at(track2Index))); + } } } - } - if (tracksPerpCone1Vec.size() >= 1 && tracksPerpCone2Vec.size() >= 1) { - for (typename std::vector::size_type track1Index = 0; track1Index < tracksPerpCone1Vec.size(); track1Index++) { - for (typename std::vector::size_type track2Index = 0; track2Index < tracksPerpCone2Vec.size(); track2Index++) { - pairPerpCone1PerpCone2PtVec.push_back(tracksPerpCone1Vec.at(track1Index).pt() * tracksPerpCone2Vec.at(track2Index).pt()); - pairPerpCone1PerpCone2EnergyVec.push_back(2.0 * tracksPerpCone1Vec.at(track1Index).energy() * tracksPerpCone2Vec.at(track2Index).energy()); - float dPhi = RecoDecay::constrainAngle((tracksPerpCone1Vec.at(track1Index).phi() - (M_PI / 2.)) - (tracksPerpCone2Vec.at(track2Index).phi() + (M_PI / 2.)), -M_PI); - float dEta = tracksPerpCone1Vec.at(track1Index).eta() - tracksPerpCone2Vec.at(track2Index).eta(); - pairPerpCone1PerpCone2ThetaVec.push_back(std::sqrt(dEta * dEta + dPhi * dPhi)); + if (tracksPerpCone1Vec.size() >= 1 && tracksPerpCone2Vec.size() >= 1) { + for (typename std::vector::size_type track1Index = 0; track1Index < tracksPerpCone1Vec.size(); track1Index++) { + for (typename std::vector::size_type track2Index = 0; track2Index < tracksPerpCone2Vec.size(); track2Index++) { + pairPerpCone1PerpCone2PtVec.push_back(tracksPerpCone1Vec.at(track1Index).pt() * tracksPerpCone2Vec.at(track2Index).pt()); + pairPerpCone1PerpCone2EnergyVec.push_back(2.0 * tracksPerpCone1Vec.at(track1Index).energy() * tracksPerpCone2Vec.at(track2Index).energy()); + float dPhi = RecoDecay::constrainAngle((tracksPerpCone1Vec.at(track1Index).phi() - (M_PI / 2.)) - (tracksPerpCone2Vec.at(track2Index).phi() + (M_PI / 2.)), -M_PI); + float dEta = tracksPerpCone1Vec.at(track1Index).eta() - tracksPerpCone2Vec.at(track2Index).eta(); + pairPerpCone1PerpCone2ThetaVec.push_back(std::sqrt(dEta * dEta + dPhi * dPhi)); + } } } } From 8b687cd3f627b8d9d7edfa07cb336421828256c4 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Mon, 3 Mar 2025 20:07:26 +0100 Subject: [PATCH 0523/1650] [PWGLF] Add TOF only PID for kaon daughter (#10298) --- PWGLF/Tasks/Resonances/phipbpb.cxx | 43 +++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/PWGLF/Tasks/Resonances/phipbpb.cxx b/PWGLF/Tasks/Resonances/phipbpb.cxx index b82bd15596a..53af1c98534 100644 --- a/PWGLF/Tasks/Resonances/phipbpb.cxx +++ b/PWGLF/Tasks/Resonances/phipbpb.cxx @@ -112,6 +112,7 @@ struct phipbpb { Configurable cfgTPCSharedcluster{"cfgTPCSharedcluster", 0.4, "Maximum Number of TPC shared cluster"}; Configurable isDeepAngle{"isDeepAngle", false, "Deep Angle cut"}; Configurable ispTdepPID{"ispTdepPID", true, "pT dependent PID"}; + Configurable isTOFOnly{"isTOFOnly", false, "use TOF only PID"}; Configurable checkAllCharge{"checkAllCharge", true, "check all charge for MC weight"}; Configurable cfgDeepAngle{"cfgDeepAngle", 0.04, "Deep Angle cut value"}; Configurable confRapidity{"confRapidity", 0.5, "Rapidity cut"}; @@ -363,6 +364,15 @@ struct phipbpb { } return false; } + + template + bool selectionPID2(const T& candidate) + { + if (candidate.hasTOF() && candidate.beta() > cfgCutTOFBeta && TMath::Abs(candidate.tofNSigmaKa()) < nsigmaCutTOF) { + return true; + } + return false; + } // deep angle cut on pair to remove photon conversion template bool selectionPair(const T1& candidate1, const T2& candidate2) @@ -502,10 +512,13 @@ struct phipbpb { continue; } // PID check - if (ispTdepPID && !selectionPIDpTdependent(track1)) { + if (ispTdepPID && !isTOFOnly && !selectionPIDpTdependent(track1)) { continue; } - if (!ispTdepPID && !selectionPID(track1)) { + if (!ispTdepPID && !isTOFOnly && !selectionPID(track1)) { + continue; + } + if (isTOFOnly && !selectionPID2(track1)) { continue; } if (useGlobalTrack && track1.p() < 1.0 && !(itsResponse.nSigmaITS(track1) > -2.5 && itsResponse.nSigmaITS(track1) < 2.5)) { @@ -537,10 +550,13 @@ struct phipbpb { continue; } // PID check - if (ispTdepPID && !selectionPIDpTdependent(track2)) { + if (ispTdepPID && !isTOFOnly && !selectionPIDpTdependent(track2)) { continue; } - if (!ispTdepPID && !selectionPID(track2)) { + if (!ispTdepPID && !isTOFOnly && !selectionPID(track2)) { + continue; + } + if (isTOFOnly && !selectionPID2(track2)) { continue; } auto track2ID = track2.globalIndex(); @@ -698,10 +714,13 @@ struct phipbpb { continue; } // PID check - if (ispTdepPID && (!selectionPIDpTdependent(track1) || !selectionPIDpTdependent(track2))) { + if (ispTdepPID && !isTOFOnly && (!selectionPIDpTdependent(track1) || !selectionPIDpTdependent(track2))) { + continue; + } + if (!ispTdepPID && !isTOFOnly && (!selectionPID(track1) || !selectionPID(track2))) { continue; } - if (!ispTdepPID && (!selectionPID(track1) || !selectionPID(track2))) { + if (isTOFOnly && (!selectionPID2(track1) || !selectionPID2(track2))) { continue; } if (!selectionPair(track1, track2)) { @@ -1114,7 +1133,17 @@ struct phipbpb { if (!(track1PDG == 321 && track2PDG == 321)) { continue; } - if (!selectionTrack(track1) || !selectionTrack(track2) || !selectionPIDpTdependent(track1) || !selectionPIDpTdependent(track2) || track1.sign() * track2.sign() > 0) { + if (!selectionTrack(track1) || !selectionTrack(track2) || track1.sign() * track2.sign() > 0) { + continue; + } + // PID check + if (ispTdepPID && !isTOFOnly && (!selectionPIDpTdependent(track1) || !selectionPIDpTdependent(track2))) { + continue; + } + if (!ispTdepPID && !isTOFOnly && (!selectionPID(track1) || !selectionPID(track2))) { + continue; + } + if (isTOFOnly && (!selectionPID2(track1) || !selectionPID2(track2))) { continue; } for (auto& mothertrack1 : mctrack1.mothers_as()) { From 02aa48f07d431dc042900aadece61e494b67abb8 Mon Sep 17 00:00:00 2001 From: Victor Gonzalez Date: Mon, 3 Mar 2025 21:40:44 +0100 Subject: [PATCH 0524/1650] [PWGCF] DptDpt - Remove tracking the ITS dead chips (#10300) Co-authored-by: Victor --- .../Tasks/dptDptEfficiencyAndQc.cxx | 63 ++++++++++++------- .../Tasks/dptDptPerRunQc.cxx | 33 +--------- 2 files changed, 43 insertions(+), 53 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx index 0040d44c8f8..7110f748837 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx @@ -279,10 +279,10 @@ struct QADataCollectingEngine { int nPhiSectorBins = fhNchVsPhiVsPtPosB->GetNbinsY(); float phiSectorLow = fhNchVsPhiVsPtNegB->GetYaxis()->GetBinLowEdge(1); float phiSectorHigh = fhNchVsPhiVsPtNegB->GetYaxis()->GetBinUpEdge(nPhiSectorBins); - fhPerColNchVsPhiVsPtPosB = new TH2F("PerColNchVsPhiVsPtPosB", "", nPtBins, ptLow, ptHigh, nPhiSectorBins, phiSectorLow, phiSectorHigh); - fhPerColNchVsPhiVsInnerWallMomPosB = new TH2F("PerColNchVsPhiVsInnerWallMomPosB", "", nTpcIwMomBins, tpcIwMomLow, tpcIwMomHigh, nPhiSectorBins, phiSectorLow, phiSectorHigh); - fhPerColNchVsPhiVsPtNegB = new TH2F("PerColNchVsPhiVsPtNegB", "", nPtBins, ptLow, ptHigh, nPhiSectorBins, phiSectorLow, phiSectorHigh); - fhPerColNchVsPhiVsInnerWallMomNegB = new TH2F("PerColNchVsPhiVsInnerWallMomNegB", "", nTpcIwMomBins, tpcIwMomLow, tpcIwMomHigh, nPhiSectorBins, phiSectorLow, phiSectorHigh); + fhPerColNchVsPhiVsPtPosB = new TH2F(TString::Format("%s_PerColNchVsPhiVsPtPosB", dirname), "", nPtBins, ptLow, ptHigh, nPhiSectorBins, phiSectorLow, phiSectorHigh); + fhPerColNchVsPhiVsInnerWallMomPosB = new TH2F(TString::Format("%s_PerColNchVsPhiVsInnerWallMomPosB", dirname), "", nTpcIwMomBins, tpcIwMomLow, tpcIwMomHigh, nPhiSectorBins, phiSectorLow, phiSectorHigh); + fhPerColNchVsPhiVsPtNegB = new TH2F(TString::Format("%s_PerColNchVsPhiVsPtNegB", dirname), "", nPtBins, ptLow, ptHigh, nPhiSectorBins, phiSectorLow, phiSectorHigh); + fhPerColNchVsPhiVsInnerWallMomNegB = new TH2F(TString::Format("%s_PerColNchVsPhiVsInnerWallMomNegB", dirname), "", nTpcIwMomBins, tpcIwMomLow, tpcIwMomHigh, nPhiSectorBins, phiSectorLow, phiSectorHigh); for (uint isp = 0; isp < nsp; ++isp) { fhPhiVsPtA[isp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "After"), HNAMESTRING("PhiVsPt_%s", tnames[isp].c_str()), HTITLESTRING("#varphi %s (mod(2#pi/18))", tnames[isp].c_str()), kTH2F, {pidPtAxis, phiSectorAxis}); fhNchVsPhiVsPtA[isp] = ADDHISTOGRAM(TH3, DIRECTORYSTRING("%s/%s/%s", dirname, "Reco", "After"), HNAMESTRING("NchVsPhiVsPt_%s", tnames[isp].c_str()), HTITLESTRING("#it{N}_{ch}^{%s} #varphi (mod(2#pi/18))", tnames[isp].c_str()), kTH3F, {pidPtAxisReduced, phiSectorAxisReduced, nChargeAxis}); @@ -307,8 +307,8 @@ struct QADataCollectingEngine { fhPtVsEtaTpcTofA[isp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "Efficiency", "Reco"), HNAMESTRING("ptTpcTof_%s", tnames[isp].c_str()), HTITLESTRING("TPC&TOF %s tracks", tnames[isp].c_str()), kTH2F, {etaAxis, ptAxis}); fhPtVsEtaItsTpcTofA[isp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "Efficiency", "Reco"), HNAMESTRING("ptItsTpcTof_%s", tnames[isp].c_str()), HTITLESTRING("ITS&TPC&TOF %s tracks", tnames[isp].c_str()), kTH2F, {etaAxis, ptAxis}); /* per collision histograms not going to the results file */ - fhPerColNchVsPhiVsPtA[isp] = new TH2F(HNAMESTRING("PerColNchVsPhiVsPt_%s", tnames[isp].c_str()), "", nPtBins, ptLow, ptHigh, nPhiSectorBins, phiSectorLow, phiSectorHigh); - fhPerColNchVsPhiVsInnerWallMomA[isp] = new TH2F(HNAMESTRING("PerColNchVsPhiVsInnerWallMom_%s", tnames[isp].c_str()), "", nTpcIwMomBins, tpcIwMomLow, tpcIwMomHigh, nPhiSectorBins, phiSectorLow, phiSectorHigh); + fhPerColNchVsPhiVsPtA[isp] = new TH2F(HNAMESTRING("%s_PerColNchVsPhiVsPt_%s", dirname, tnames[isp].c_str()), "", nPtBins, ptLow, ptHigh, nPhiSectorBins, phiSectorLow, phiSectorHigh); + fhPerColNchVsPhiVsInnerWallMomA[isp] = new TH2F(HNAMESTRING("%s_PerColNchVsPhiVsInnerWallMom_%s", dirname, tnames[isp].c_str()), "", nTpcIwMomBins, tpcIwMomLow, tpcIwMomHigh, nPhiSectorBins, phiSectorLow, phiSectorHigh); } } else { AxisSpec recoSpecies{static_cast(nsp) + 1, -0.5, nsp - 0.5, "reco species"}; @@ -582,8 +582,10 @@ struct QAExtraDataCollectingEngine { /* pairs histograms */ std::vector>>> fhPhiPhiA{2, {nsp, {nsp, nullptr}}}; std::vector>>> fhDeltaPhiVsPhiPhiA{2, {nsp, {nsp, nullptr}}}; + std::vector>>> fhDeltaPhiVsEtaEtaA{2, {nsp, {nsp, nullptr}}}; std::vector>>> fhEtaEtaA{2, {nsp, {nsp, nullptr}}}; std::vector>>> fhDeltaEtaVsEtaEtaA{2, {nsp, {nsp, nullptr}}}; + std::vector>>> fhDeltaEtaVsPhiPhiA{2, {nsp, {nsp, nullptr}}}; template void init(HistogramRegistry& registry, const char* dirname) @@ -591,10 +593,10 @@ struct QAExtraDataCollectingEngine { using namespace efficiencyandqatask; using namespace analysis::dptdptfilter; - AxisSpec phiAxis = {72, 0.0f, constants::math::TwoPI, "#varphi"}; - AxisSpec deltaPhiAxis = {72, 0.0f, constants::math::TwoPI, "#Delta#varphi"}; + AxisSpec phiAxis = {phibins, 0.0f, constants::math::TwoPI, "#varphi"}; + AxisSpec deltaPhiAxis = {phibins, 0.0f, constants::math::TwoPI, "#Delta#varphi"}; AxisSpec etaAxis = {etabins, etalow, etaup, "#eta"}; - AxisSpec deltaEta = {2 * etabins - 1, etalow - etaup, etaup - etalow, "#DeltaEta"}; + AxisSpec deltaEtaAxis = {2 * etabins - 1, etalow - etaup, etaup - etalow, "#DeltaEta"}; /* the reconstructed and generated levels histograms */ std::string recogen = (kindOfData == kReco) ? "Reco" : "Gen"; @@ -602,12 +604,16 @@ struct QAExtraDataCollectingEngine { for (uint jsp = 0; jsp < nsp; ++jsp) { fhPhiPhiA[kindOfData][isp][jsp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("PhiPhi_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTH2F, {phiAxis, phiAxis}); - fhDeltaPhiVsPhiPhiA[kindOfData][isp][jsp] = ADDHISTOGRAM(TH3, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("deltaPhiVsPhiPhi_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), + fhDeltaPhiVsPhiPhiA[kindOfData][isp][jsp] = ADDHISTOGRAM(TH3, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("DeltaPhiVsPhiPhi_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTH3F, {phiAxis, phiAxis, deltaPhiAxis}); + fhDeltaEtaVsPhiPhiA[kindOfData][isp][jsp] = ADDHISTOGRAM(TH3, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("DeltaEtaVsPhiPhi_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), + HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTH3F, {phiAxis, phiAxis, deltaEtaAxis}); fhEtaEtaA[kindOfData][isp][jsp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("EtaEta_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTH2F, {etaAxis, etaAxis}); - fhDeltaEtaVsEtaEtaA[kindOfData][isp][jsp] = ADDHISTOGRAM(TH3, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("deltaPhiVsEtaEta_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), - HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTH3F, {phiAxis, phiAxis, deltaPhiAxis}); + fhDeltaEtaVsEtaEtaA[kindOfData][isp][jsp] = ADDHISTOGRAM(TH3, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("DeltaEtaVsEtaEta_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), + HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTH3F, {etaAxis, etaAxis, deltaEtaAxis}); + fhDeltaPhiVsEtaEtaA[kindOfData][isp][jsp] = ADDHISTOGRAM(TH3, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("DeltaPhiVsEtaEta_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), + HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTH3F, {etaAxis, etaAxis, deltaPhiAxis}); } } } @@ -630,8 +636,10 @@ struct QAExtraDataCollectingEngine { float deltaEta = track1.eta() - track2.eta(); fhPhiPhiA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(track1.phi(), track2.phi()); fhDeltaPhiVsPhiPhiA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(track1.phi(), track2.phi(), deltaPhi); + fhDeltaEtaVsPhiPhiA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(track1.phi(), track2.phi(), deltaEta); fhEtaEtaA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(track1.eta(), track2.eta()); fhDeltaEtaVsEtaEtaA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(track1.eta(), track2.eta(), deltaEta); + fhDeltaPhiVsEtaEtaA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(track1.eta(), track2.eta(), deltaPhi); } } } @@ -933,6 +941,16 @@ struct DptDptEfficiencyAndQc { HistogramRegistry registryEight{"registryEight", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry registryNine{"registryNine", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry registryTen{"registryTen", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry registryExtraOne{"extraregistryOne", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry registryExtraTwo{"extraregistryTwo", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry registryExtraThree{"extraregistryThree", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry registryExtraFour{"extraregistryFour", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry registryExtraFive{"extraregistryFive", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry registryExtraSix{"extraregistrySix", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry registryExtraSeven{"extraregistrySeven", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry registryExtraEight{"extraregistryEight", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry registryExtraNine{"extraregistryNine", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry registryExtraTen{"extraregistryTen", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry registryPidOne{"pidregistryOne", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry registryPidTwo{"pidregistryTwo", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry registryPidThree{"pidregistryThree", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -943,9 +961,11 @@ struct DptDptEfficiencyAndQc { HistogramRegistry registryPidEight{"pidregistryEight", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry registryPidNine{"pidregistryNine", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry registryPidTen{"pidregistryTen", {}, OutputObjHandlingPolicy::AnalysisObject}; - std::vector registrybank{®istryOne, ®istryTwo, ®istryThree, ®istryFour, ®istryFive, + std::vector registryBank{®istryOne, ®istryTwo, ®istryThree, ®istryFour, ®istryFive, ®istrySix, ®istrySeven, ®istryEight, ®istryNine, ®istryTen}; - std::vector pidregistrybank{®istryPidOne, ®istryPidTwo, ®istryPidThree, ®istryPidFour, ®istryPidFive, + std::vector extraRegistryBank{®istryExtraOne, ®istryExtraTwo, ®istryExtraThree, ®istryExtraFour, ®istryExtraFive, + ®istryExtraSix, ®istryExtraSeven, ®istryExtraEight, ®istryExtraNine, ®istryExtraTen}; + std::vector pidRegistryBank{®istryPidOne, ®istryPidTwo, ®istryPidThree, ®istryPidFour, ®istryPidFive, ®istryPidSix, ®istryPidSeven, ®istryPidEight, ®istryPidNine, ®istryPidTen}; Configurable useCentrality{"useCentrality", false, "Perform the task using centrality/multiplicity classes. Default value: false"}; @@ -987,6 +1007,7 @@ struct DptDptEfficiencyAndQc { getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mEtabins", etabins, false); getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mEtamin", etalow, false); getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mEtamax", etaup, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mPhibins", phibins, false); /* configuring the involved species */ std::vector cfgnames = {"elpidsel", "mupidsel", "pipidsel", "kapidsel", "prpidsel"}; @@ -1071,37 +1092,37 @@ struct DptDptEfficiencyAndQc { pidExtraDataCE = new PidExtraDataCollectingEngine*[ncmranges]; } std::string recogen; - if (ncmranges > registrybank.size()) { + if (ncmranges > registryBank.size()) { LOGF(fatal, "There are more centrality ranges configured than registries in the bank. Please fix it!"); } /* in reverse order for proper order in results file */ for (uint i = 0; i < ncmranges; ++i) { - auto initializeCEInstance = [&](auto dce, auto name, auto& registry) { + auto initializeCEInstance = [&](auto dce, auto name, auto& registry, bool genlevel) { /* crete the output list for the passed centrality/multiplicity range */ /* init the data collection instance */ dce->template init(registry, name.Data()); - if (doprocessGeneratorLevelNotStored) { + if (genlevel) { dce->template init(registry, name.Data()); } }; auto buildQACEInstance = [&](float min, float max) { auto* dce = new QADataCollectingEngine(); - initializeCEInstance(dce, TString::Format("EfficiencyAndQaData-%d-%d", static_cast(min), static_cast(max)), *registrybank[i]); + initializeCEInstance(dce, TString::Format("EfficiencyAndQaData-%d-%d", static_cast(min), static_cast(max)), *registryBank[i], doprocessGeneratorLevelNotStored); return dce; }; auto buildQACEExtraInstance = [&](float min, float max) { auto* dce = new QAExtraDataCollectingEngine(); - initializeCEInstance(dce, TString::Format("EfficiencyAndQaExtraData-%d-%d", static_cast(min), static_cast(max)), *registrybank[i]); + initializeCEInstance(dce, TString::Format("EfficiencyAndQaExtraData-%d-%d", static_cast(min), static_cast(max)), *extraRegistryBank[i], doprocessExtraGeneratorLevelNotStored); return dce; }; auto buildPidCEInstance = [&](float min, float max) { auto* dce = new PidDataCollectingEngine(); - initializeCEInstance(dce, TString::Format("EfficiencyAndPidData-%d-%d", static_cast(min), static_cast(max)), *pidregistrybank[i]); + initializeCEInstance(dce, TString::Format("EfficiencyAndPidData-%d-%d", static_cast(min), static_cast(max)), *pidRegistryBank[i], doprocessGeneratorLevelNotStored); return dce; }; auto buildPidExtraCEInstance = [&](float min, float max) { auto* dce = new PidExtraDataCollectingEngine(); - initializeCEInstance(dce, TString::Format("EfficiencyAndPidData-%d-%d", static_cast(min), static_cast(max)), *pidregistrybank[i]); + initializeCEInstance(dce, TString::Format("EfficiencyAndPidData-%d-%d", static_cast(min), static_cast(max)), *pidRegistryBank[i], doprocessGeneratorLevelNotStored); return dce; }; /* in reverse order for proper order in results file */ diff --git a/PWGCF/TwoParticleCorrelations/Tasks/dptDptPerRunQc.cxx b/PWGCF/TwoParticleCorrelations/Tasks/dptDptPerRunQc.cxx index 1065d4a74fa..dd95686113e 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/dptDptPerRunQc.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/dptDptPerRunQc.cxx @@ -46,7 +46,6 @@ namespace perrunqctask { static const int32_t nBCsPerOrbit = o2::constants::lhc::LHCMaxBunches; std::unordered_map gHadronicRate; -std::unordered_map>> gDeadChipsVsOrbitInLayer; std::unordered_map> gCollisionOrbitBefore; std::unordered_map> gCollisionOrbitAfter; @@ -82,7 +81,7 @@ struct DptDptPerRunQc { const AxisSpec axisSeconds{static_cast(maxSec - mMinSeconds), 0, maxSec - mMinSeconds, "Seconds since SOR"}; gHadronicRate[mRunNumber] = mHistos.add(Form("%i/hadronicRate", mRunNumber), ";Time since SOR (s);Hadronic rate (kHz)", kTH2D, {{static_cast((maxSec - mMinSeconds) / 20.f), 0, maxSec - mMinSeconds, "Seconds since SOR"}, {1010, 0., 1010.}}).get(); - /* initializing the ITS chips dead map*/ + /* initializing the ITS chips dead map orbit axis*/ /* inspired in DPG/Tasks/AOTEvent/eventSelectionQa.cxx */ auto runInfo = o2::parameters::AggregatedRunInfo::buildAggregatedRunInfo(o2::ccdb::BasicCCDBManager::instance(), mRunNumber); int64_t tsSOR = runInfo.sor; @@ -92,38 +91,8 @@ struct DptDptPerRunQc { if (itsDeadMapOrbits.size() > 0) { std::vector itsDeadMapOrbitsDouble(itsDeadMapOrbits.begin(), itsDeadMapOrbits.end()); const AxisSpec axisItsDeadMapOrbits{itsDeadMapOrbitsDouble}; - gDeadChipsVsOrbitInLayer[mRunNumber] = std::vector>(o2::itsmft::ChipMappingITS::NLayers, nullptr); - for (int layer = 0; layer < o2::itsmft::ChipMappingITS::NLayers; ++layer) { - int nChips = o2::itsmft::ChipMappingITS::getNChipsOnLayer(layer); - double idFirstChip = o2::itsmft::ChipMappingITS::getFirstChipsOnLayer(layer); - gDeadChipsVsOrbitInLayer[mRunNumber][layer] = mHistos.add(TString::Format("%d/Before/hDeadChipsVsOrbitInLayer%d", mRunNumber, layer), - TString::Format("Dead chips in ITS layer %d, before;orbit; chip", layer), - kTH2C, {axisItsDeadMapOrbits, {nChips, idFirstChip, idFirstChip + nChips}}); - } gCollisionOrbitBefore[mRunNumber] = mHistos.add(TString::Format("%d/Before/hCollisionOrbitB", mRunNumber), "Collision orbit before; orbit", kTH1I, {axisItsDeadMapOrbits}); gCollisionOrbitAfter[mRunNumber] = mHistos.add(TString::Format("%d/After/hCollisionOrbitA", mRunNumber), "Collision orbit; orbit", kTH1I, {axisItsDeadMapOrbits}); - LOGF(info, "Created the histograms"); - - std::vector vClosest; - for (const auto& orbit : itsDeadMapOrbits) { - itsDeadMap->getMapAtOrbit(orbit, vClosest); - for (size_t iel = 0; iel < vClosest.size(); iel++) { - // dead chips are stored as ranges - // vClosest contains first and last chip ids in the range - // last chip id in the range is marked with 0x8000 bit set to 1 - uint16_t w1 = vClosest[iel]; - bool isLastInSequence = (w1 & 0x8000) == 0; - uint16_t w2 = isLastInSequence ? w1 + 1 : vClosest[iel + 1]; - uint16_t chipId1 = w1 & 0x7FFF; - uint16_t chipId2 = w2 & 0x7FFF; - for (int chipId = chipId1; chipId < chipId2; chipId++) { - for (int layer = 0; layer < o2::itsmft::ChipMappingITS::NLayers; ++layer) { - gDeadChipsVsOrbitInLayer[mRunNumber][layer]->Fill(orbit, chipId, 1); - } - } - } - } - LOGF(info, "Initializing the current ones"); gCurrentCollisionOrbitBefore = gCollisionOrbitBefore[mRunNumber]; gCurrentCollisionOrbitAfter = gCollisionOrbitAfter[mRunNumber]; } else { From f8fccf8f155cd232eaf6601529db8f34c58fa7dc Mon Sep 17 00:00:00 2001 From: Rahul Verma <110929992+rahulverma012@users.noreply.github.com> Date: Tue, 4 Mar 2025 13:00:06 +0530 Subject: [PATCH 0525/1650] [Common] Added QA histograms and increased arraySize (#10218) --- .../TableProducer/occupancyTableProducer.cxx | 604 ++++++++++++++++-- 1 file changed, 539 insertions(+), 65 deletions(-) diff --git a/Common/TableProducer/occupancyTableProducer.cxx b/Common/TableProducer/occupancyTableProducer.cxx index c26b69dd0b3..ce56bfda149 100644 --- a/Common/TableProducer/occupancyTableProducer.cxx +++ b/Common/TableProducer/occupancyTableProducer.cxx @@ -9,6 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. /// +/// \file occupancyTableProducer.cxx /// \brief Occupancy Table Producer : TPC PID - Calibration /// Occupancy calculater using tracks which have entry for collision and trackQA tables /// Ambg tracks were not used @@ -17,6 +18,7 @@ #include #include #include +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -48,7 +50,7 @@ int32_t nBCsPerOrbit = o2::constants::lhc::LHCMaxBunches; // for 128 => nBCsPerTF = 456192 , for 32 => nBCsPerTF = 114048 const int nBCinTF = 114048; /// CCDB value // to be obtained from CCDB in future const int nBCinDrift = 114048 / 32; /// to get from ccdb in future -const int arraySize = 3; // Max no timeframes that can be present in a dataframe +const int arraySize = 10; // Max no timeframes that can be present in a dataframe struct OccupancyTableProducer { @@ -88,6 +90,7 @@ struct OccupancyTableProducer { // Histogram registry; HistogramRegistry recoEvent{"recoEvent", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry occupancyQA{"occupancyQA", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; // Data Structures for Occupancy estimation std::array tfList; @@ -722,6 +725,8 @@ struct TrackMeanOccTableProducer { Service ccdb; + HistogramRegistry occupancyQA{"occupancyQA", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + // Configurables Configurable customOrbitOffset{"customOrbitOffset", 0, "customOrbitOffset for MC"}; @@ -734,6 +739,9 @@ struct TrackMeanOccTableProducer { Configurable buildTrackMeanOccs7{"buildTrackMeanOccs7", true, "builder TrackMeanOccs7"}; Configurable buildTrackMeanOccs8{"buildTrackMeanOccs8", true, "builder TrackMeanOccs8"}; + Configurable fillQA1{"fillQA1", false, "fill QA LOG Ratios"}; + Configurable fillQA2{"fillQA2", false, "fill QA condition dependent QAs"}; + // vectors to be used for occupancy estimation std::vector occPrimUnfm80; std::vector occFV0AUnfm80; @@ -803,8 +811,220 @@ struct TrackMeanOccTableProducer { occRobustFDDT0V0PrimUnfm80.resize(nBCinTF / 80); occRobustNtrackDetUnfm80.resize(nBCinTF / 80); occRobustMultTableUnfm80.resize(nBCinTF / 80); + + const AxisSpec axisQA1 = {500, 0, 50000}; + const AxisSpec axisQA2 = {200, -2, 2}; + const AxisSpec axisQA3 = {200, -20, 20}; + + occupancyQA.add("occTrackQA/Mean/OccPrimUnfm80", "OccPrimUnfm80", kTH1F, {axisQA1}); + occupancyQA.add("occTrackQA/Mean/OccFV0AUnfm80", "OccFV0AUnfm80", kTH1F, {axisQA1}); + occupancyQA.add("occTrackQA/Mean/OccFV0CUnfm80", "OccFV0CUnfm80", kTH1F, {axisQA1}); + occupancyQA.add("occTrackQA/Mean/OccFT0AUnfm80", "OccFT0AUnfm80", kTH1F, {axisQA1}); + occupancyQA.add("occTrackQA/Mean/OccFT0CUnfm80", "OccFT0CUnfm80", kTH1F, {axisQA1}); + occupancyQA.add("occTrackQA/Mean/OccFDDAUnfm80", "OccFDDAUnfm80", kTH1F, {axisQA1}); + occupancyQA.add("occTrackQA/Mean/OccFDDCUnfm80", "OccFDDCUnfm80", kTH1F, {axisQA1}); + + occupancyQA.add("occTrackQA/Mean/OccNTrackITSUnfm80", "OccNTrackITSUnfm80", kTH1F, {axisQA1}); + occupancyQA.add("occTrackQA/Mean/OccNTrackTPCUnfm80", "OccNTrackTPCUnfm80", kTH1F, {axisQA1}); + occupancyQA.add("occTrackQA/Mean/OccNTrackTRDUnfm80", "OccNTrackTRDUnfm80", kTH1F, {axisQA1}); + occupancyQA.add("occTrackQA/Mean/OccNTrackTOFUnfm80", "OccNTrackTOFUnfm80", kTH1F, {axisQA1}); + occupancyQA.add("occTrackQA/Mean/OccNTrackSizeUnfm80", "OccNTrackSizeUnfm80", kTH1F, {axisQA1}); + occupancyQA.add("occTrackQA/Mean/OccNTrackTPCAUnfm80", "OccNTrackTPCAUnfm80", kTH1F, {axisQA1}); + occupancyQA.add("occTrackQA/Mean/OccNTrackTPCCUnfm80", "OccNTrackTPCCUnfm80", kTH1F, {axisQA1}); + occupancyQA.add("occTrackQA/Mean/OccNTrackITSTPCUnfm80", "OccNTrackITSTPCUnfm80", kTH1F, {axisQA1}); + occupancyQA.add("occTrackQA/Mean/OccNTrackITSTPCAUnfm80", "OccNTrackITSTPCAUnfm80", kTH1F, {axisQA1}); + occupancyQA.add("occTrackQA/Mean/OccNTrackITSTPCCUnfm80", "OccNTrackITSTPCCUnfm80", kTH1F, {axisQA1}); + + occupancyQA.add("occTrackQA/Mean/OccMultNTracksHasITSUnfm80", "OccMultNTracksHasITSUnfm80", kTH1F, {axisQA1}); + occupancyQA.add("occTrackQA/Mean/OccMultNTracksHasTPCUnfm80", "OccMultNTracksHasTPCUnfm80", kTH1F, {axisQA1}); + occupancyQA.add("occTrackQA/Mean/OccMultNTracksHasTOFUnfm80", "OccMultNTracksHasTOFUnfm80", kTH1F, {axisQA1}); + occupancyQA.add("occTrackQA/Mean/OccMultNTracksHasTRDUnfm80", "OccMultNTracksHasTRDUnfm80", kTH1F, {axisQA1}); + occupancyQA.add("occTrackQA/Mean/OccMultNTracksITSOnlyUnfm80", "OccMultNTracksITSOnlyUnfm80", kTH1F, {axisQA1}); + occupancyQA.add("occTrackQA/Mean/OccMultNTracksTPCOnlyUnfm80", "OccMultNTracksTPCOnlyUnfm80", kTH1F, {axisQA1}); + occupancyQA.add("occTrackQA/Mean/OccMultNTracksITSTPCUnfm80", "OccMultNTracksITSTPCUnfm80", kTH1F, {axisQA1}); + occupancyQA.add("occTrackQA/Mean/OccMultAllTracksTPCOnlyUnfm80", "OccMultAllTracksTPCOnlyUnfm80", kTH1F, {axisQA1}); + + occupancyQA.add("occTrackQA/Mean/OccRobustT0V0PrimUnfm80", "OccRobustT0V0PrimUnfm80", kTH1F, {axisQA1}); + occupancyQA.add("occTrackQA/Mean/OccRobustFDDT0V0PrimUnfm80", "OccRobustFDDT0V0PrimUnfm80", kTH1F, {axisQA1}); + occupancyQA.add("occTrackQA/Mean/OccRobustNtrackDetUnfm80", "OccRobustNtrackDetUnfm80", kTH1F, {axisQA1}); + occupancyQA.add("occTrackQA/Mean/OccRobustMultExtraTableUnfm80", "OccRobustMultExtraTableUnfm80", kTH1F, {axisQA1}); + + occupancyQA.addClone("occTrackQA/Mean/", "occTrackQA/WeightMean/"); + + if (fillQA1) { + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccPrimUnfm80", "OccPrimUnfm80", kTH1F, {axisQA2}); + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccFV0AUnfm80", "OccFV0AUnfm80", kTH1F, {axisQA2}); + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccFV0CUnfm80", "OccFV0CUnfm80", kTH1F, {axisQA2}); + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccFT0AUnfm80", "OccFT0AUnfm80", kTH1F, {axisQA2}); + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccFT0CUnfm80", "OccFT0CUnfm80", kTH1F, {axisQA2}); + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccFDDAUnfm80", "OccFDDAUnfm80", kTH1F, {axisQA2}); + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccFDDCUnfm80", "OccFDDCUnfm80", kTH1F, {axisQA2}); + + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccNTrackITSUnfm80", "OccNTrackITSUnfm80", kTH1F, {axisQA2}); + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccNTrackTPCUnfm80", "OccNTrackTPCUnfm80", kTH1F, {axisQA2}); + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccNTrackTRDUnfm80", "OccNTrackTRDUnfm80", kTH1F, {axisQA2}); + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccNTrackTOFUnfm80", "OccNTrackTOFUnfm80", kTH1F, {axisQA2}); + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccNTrackSizeUnfm80", "OccNTrackSizeUnfm80", kTH1F, {axisQA2}); + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccNTrackTPCAUnfm80", "OccNTrackTPCAUnfm80", kTH1F, {axisQA2}); + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccNTrackTPCCUnfm80", "OccNTrackTPCCUnfm80", kTH1F, {axisQA2}); + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccNTrackITSTPCUnfm80", "OccNTrackITSTPCUnfm80", kTH1F, {axisQA2}); + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccNTrackITSTPCAUnfm80", "OccNTrackITSTPCAUnfm80", kTH1F, {axisQA2}); + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccNTrackITSTPCCUnfm80", "OccNTrackITSTPCCUnfm80", kTH1F, {axisQA2}); + + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccMultNTracksHasITSUnfm80", "OccMultNTracksHasITSUnfm80", kTH1F, {axisQA2}); + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccMultNTracksHasTPCUnfm80", "OccMultNTracksHasTPCUnfm80", kTH1F, {axisQA2}); + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccMultNTracksHasTOFUnfm80", "OccMultNTracksHasTOFUnfm80", kTH1F, {axisQA2}); + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccMultNTracksHasTRDUnfm80", "OccMultNTracksHasTRDUnfm80", kTH1F, {axisQA2}); + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccMultNTracksITSOnlyUnfm80", "OccMultNTracksITSOnlyUnfm80", kTH1F, {axisQA2}); + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccMultNTracksTPCOnlyUnfm80", "OccMultNTracksTPCOnlyUnfm80", kTH1F, {axisQA2}); + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccMultNTracksITSTPCUnfm80", "OccMultNTracksITSTPCUnfm80", kTH1F, {axisQA2}); + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccMultAllTracksTPCOnlyUnfm80", "OccMultAllTracksTPCOnlyUnfm80", kTH1F, {axisQA2}); + + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccRobustT0V0PrimUnfm80", "OccRobustT0V0PrimUnfm80", kTH1F, {axisQA2}); + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccRobustFDDT0V0PrimUnfm80", "OccRobustFDDT0V0PrimUnfm80", kTH1F, {axisQA2}); + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccRobustNtrackDetUnfm80", "OccRobustNtrackDetUnfm80", kTH1F, {axisQA2}); + occupancyQA.add("occTrackQA/LogRatio/RobustT0V0Prim/Mean/OccRobustMultExtraTableUnfm80", "OccRobustMultExtraTableUnfm80", kTH1F, {axisQA2}); + + occupancyQA.addClone("occTrackQA/LogRatio/RobustT0V0Prim/Mean/", "occTrackQA/LogRatio/RobustT0V0Prim/WeightMean/"); + occupancyQA.addClone("occTrackQA/LogRatio/RobustT0V0Prim/WeightMean/", "occTrackQA/LogRatio/weightRobustT0V0Prim/WeightMean/"); + } + + if (fillQA2) { + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccPrimUnfm80", "OccPrimUnfm80", kTH1F, {axisQA3}); + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccFV0AUnfm80", "OccFV0AUnfm80", kTH1F, {axisQA3}); + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccFV0CUnfm80", "OccFV0CUnfm80", kTH1F, {axisQA3}); + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccFT0AUnfm80", "OccFT0AUnfm80", kTH1F, {axisQA3}); + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccFT0CUnfm80", "OccFT0CUnfm80", kTH1F, {axisQA3}); + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccFDDAUnfm80", "OccFDDAUnfm80", kTH1F, {axisQA3}); + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccFDDCUnfm80", "OccFDDCUnfm80", kTH1F, {axisQA3}); + + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccNTrackITSUnfm80", "OccNTrackITSUnfm80", kTH1F, {axisQA3}); + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccNTrackTPCUnfm80", "OccNTrackTPCUnfm80", kTH1F, {axisQA3}); + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccNTrackTRDUnfm80", "OccNTrackTRDUnfm80", kTH1F, {axisQA3}); + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccNTrackTOFUnfm80", "OccNTrackTOFUnfm80", kTH1F, {axisQA3}); + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccNTrackSizeUnfm80", "OccNTrackSizeUnfm80", kTH1F, {axisQA3}); + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccNTrackTPCAUnfm80", "OccNTrackTPCAUnfm80", kTH1F, {axisQA3}); + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccNTrackTPCCUnfm80", "OccNTrackTPCCUnfm80", kTH1F, {axisQA3}); + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccNTrackITSTPCUnfm80", "OccNTrackITSTPCUnfm80", kTH1F, {axisQA3}); + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccNTrackITSTPCAUnfm80", "OccNTrackITSTPCAUnfm80", kTH1F, {axisQA3}); + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccNTrackITSTPCCUnfm80", "OccNTrackITSTPCCUnfm80", kTH1F, {axisQA3}); + + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccMultNTracksHasITSUnfm80", "OccMultNTracksHasITSUnfm80", kTH1F, {axisQA3}); + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccMultNTracksHasTPCUnfm80", "OccMultNTracksHasTPCUnfm80", kTH1F, {axisQA3}); + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccMultNTracksHasTOFUnfm80", "OccMultNTracksHasTOFUnfm80", kTH1F, {axisQA3}); + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccMultNTracksHasTRDUnfm80", "OccMultNTracksHasTRDUnfm80", kTH1F, {axisQA3}); + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccMultNTracksITSOnlyUnfm80", "OccMultNTracksITSOnlyUnfm80", kTH1F, {axisQA3}); + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccMultNTracksTPCOnlyUnfm80", "OccMultNTracksTPCOnlyUnfm80", kTH1F, {axisQA3}); + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccMultNTracksITSTPCUnfm80", "OccMultNTracksITSTPCUnfm80", kTH1F, {axisQA3}); + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccMultAllTracksTPCOnlyUnfm80", "OccMultAllTracksTPCOnlyUnfm80", kTH1F, {axisQA3}); + + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccRobustT0V0PrimUnfm80", "OccRobustT0V0PrimUnfm80", kTH1F, {axisQA3}); + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccRobustFDDT0V0PrimUnfm80", "OccRobustFDDT0V0PrimUnfm80", kTH1F, {axisQA3}); + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccRobustNtrackDetUnfm80", "OccRobustNtrackDetUnfm80", kTH1F, {axisQA3}); + occupancyQA.add("occTrackQA/Condition1/RobustT0V0Prim/Mean/OccRobustMultExtraTableUnfm80", "OccRobustMultExtraTableUnfm80", kTH1F, {axisQA3}); + + occupancyQA.addClone("occTrackQA/Condition1/RobustT0V0Prim/Mean/", "occTrackQA/Condition1/RobustT0V0Prim/WeightMean/"); + occupancyQA.addClone("occTrackQA/Condition1/RobustT0V0Prim/WeightMean/", "occTrackQA/Condition1/weightRobustT0V0Prim/WeightMean/"); + + occupancyQA.addClone("occTrackQA/Condition1/", "occTrackQA/Condition2/"); + occupancyQA.addClone("occTrackQA/Condition1/", "occTrackQA/Condition3/"); + occupancyQA.addClone("occTrackQA/Condition1/", "occTrackQA/Condition4/"); + } + occupancyQA.print(); } + enum OccNamesEnum { + kOccPrimUnfm80 = 0, + kOccFV0AUnfm80, + kOccFV0CUnfm80, + kOccFT0AUnfm80, + kOccFT0CUnfm80, + kOccFDDAUnfm80, + kOccFDDCUnfm80, + + kOccNTrackITSUnfm80, + kOccNTrackTPCUnfm80, + kOccNTrackTRDUnfm80, + kOccNTrackTOFUnfm80, + kOccNTrackSizeUnfm80, + kOccNTrackTPCAUnfm80, + kOccNTrackTPCCUnfm80, + kOccNTrackITSTPCUnfm80, + kOccNTrackITSTPCAUnfm80, + kOccNTrackITSTPCCUnfm80, + + kOccMultNTracksHasITSUnfm80, + kOccMultNTracksHasTPCUnfm80, + kOccMultNTracksHasTOFUnfm80, + kOccMultNTracksHasTRDUnfm80, + kOccMultNTracksITSOnlyUnfm80, + kOccMultNTracksTPCOnlyUnfm80, + kOccMultNTracksITSTPCUnfm80, + kOccMultAllTracksTPCOnlyUnfm80, + + kOccRobustT0V0PrimUnfm80, + kOccRobustFDDT0V0PrimUnfm80, + kOccRobustNtrackDetUnfm80, + kOccRobustMultTableUnfm80 + }; + + static constexpr std::string_view OccNames[]{ + "OccPrimUnfm80", + "OccFV0AUnfm80", + "OccFV0CUnfm80", + "OccFT0AUnfm80", + "OccFT0CUnfm80", + "OccFDDAUnfm80", + "OccFDDCUnfm80", + + "OccNTrackITSUnfm80", + "OccNTrackTPCUnfm80", + "OccNTrackTRDUnfm80", + "OccNTrackTOFUnfm80", + "OccNTrackSizeUnfm80", + "OccNTrackTPCAUnfm80", + "OccNTrackTPCCUnfm80", + "OccNTrackITSTPCUnfm80", + "OccNTrackITSTPCAUnfm80", + "OccNTrackITSTPCCUnfm80", + + "OccMultNTracksHasITSUnfm80", + "OccMultNTracksHasTPCUnfm80", + "OccMultNTracksHasTOFUnfm80", + "OccMultNTracksHasTRDUnfm80", + "OccMultNTracksITSOnlyUnfm80", + "OccMultNTracksTPCOnlyUnfm80", + "OccMultNTracksITSTPCUnfm80", + "OccMultAllTracksTPCOnlyUnfm80", + + "OccRobustT0V0PrimUnfm80", + "OccRobustFDDT0V0PrimUnfm80", + "OccRobustNtrackDetUnfm80", + "OccRobustMultExtraTableUnfm80"}; + + enum OccDirEnum { + kMean = 0, + kWeightMean, + kLogRatio, + kRobustT0V0Prim, + kWeightRobustT0V0Prim, + kCondition1, + kCondition2, + kCondition3, + kCondition4 + }; + + static constexpr std::string_view OccDire[] = { + "Mean/", + "WeightMean/", + "LogRatio/", + "RobustT0V0Prim/", + "weightRobustT0V0Prim/", + "Condition1/", + "Condition2/", + "Condition3/", + "Condition4/"}; + void getRunInfo(const int& run, int& nBCsPerTF, int64_t& bcSOR) { auto runDuration = ccdb->getRunDuration(run, true); @@ -893,9 +1113,33 @@ struct TrackMeanOccTableProducer { return meanOccupancy; } + template + void fillQAInfo(const float& occValue, const float& occRobustValue) + { + occupancyQA.fill(HIST("occTrackQA/") + HIST(OccDire[occMode]) + HIST(OccNames[occName]), occValue); + if (fillQA1) { + occupancyQA.fill(HIST("occTrackQA/LogRatio/") + HIST(OccDire[occRobustMode]) + HIST(OccDire[occMode]) + HIST(OccNames[occName]), std::log(std::abs(occValue / occRobustValue))); + if (fillQA2) { + if (std::abs(std::log(occValue / occRobustValue)) < 2) { // conditional filling start + occupancyQA.fill(HIST("occTrackQA/Condition1/") + HIST(OccDire[occRobustMode]) + HIST(OccDire[occMode]) + HIST(OccNames[occName]), (std::log(occValue / occRobustValue)) * std::sqrt(occValue + occRobustValue)); + if (std::abs(occRobustValue + occValue) > 200) { + occupancyQA.fill(HIST("occTrackQA/Condition4/") + HIST(OccDire[occRobustMode]) + HIST(OccDire[occMode]) + HIST(OccNames[occName]), (std::log(occValue / occRobustValue)) * std::sqrt(occValue + occRobustValue)); + occupancyQA.fill(HIST("occTrackQA/Condition3/") + HIST(OccDire[occRobustMode]) + HIST(OccDire[occMode]) + HIST(OccNames[occName]), (std::log(occValue / occRobustValue)) * std::sqrt(occValue + occRobustValue)); + occupancyQA.fill(HIST("occTrackQA/Condition2/") + HIST(OccDire[occRobustMode]) + HIST(OccDire[occMode]) + HIST(OccNames[occName]), (std::log(occValue / occRobustValue)) * std::sqrt(occValue + occRobustValue)); + } else if (std::abs(occRobustValue + occValue) > 50) { + occupancyQA.fill(HIST("occTrackQA/Condition3/") + HIST(OccDire[occRobustMode]) + HIST(OccDire[occMode]) + HIST(OccNames[occName]), (std::log(occValue / occRobustValue)) * std::sqrt(occValue + occRobustValue)); + occupancyQA.fill(HIST("occTrackQA/Condition2/") + HIST(OccDire[occRobustMode]) + HIST(OccDire[occMode]) + HIST(OccNames[occName]), (std::log(occValue / occRobustValue)) * std::sqrt(occValue + occRobustValue)); + } else if (std::abs(occRobustValue + occValue) > 20) { + occupancyQA.fill(HIST("occTrackQA/Condition2/") + HIST(OccDire[occRobustMode]) + HIST(OccDire[occMode]) + HIST(OccNames[occName]), (std::log(occValue / occRobustValue)) * std::sqrt(occValue + occRobustValue)); + } + } // conditional filling end + } + } + } + using MyCollisions = soa::Join; using MyTracks = soa::Join; - using MyTracksQA = aod::TracksQA_000; // aod::TracksQAVersion; //aod::TracksQA + using MyTracksQA = aod::TracksQA_002; using MyBCTable = soa::Join; using MyOccsDet = soa::Join; @@ -959,6 +1203,73 @@ struct TrackMeanOccTableProducer { int binBCbegin; int binBCend; + + float meanOccPrimUnfm80 = 0; + float meanOccFV0AUnfm80 = 0; + float meanOccFV0CUnfm80 = 0; + float meanOccFT0AUnfm80 = 0; + float meanOccFT0CUnfm80 = 0; + float meanOccFDDAUnfm80 = 0; + float meanOccFDDCUnfm80 = 0; + + float meanOccNTrackITSUnfm80 = 0; + float meanOccNTrackTPCUnfm80 = 0; + float meanOccNTrackTRDUnfm80 = 0; + float meanOccNTrackTOFUnfm80 = 0; + float meanOccNTrackSizeUnfm80 = 0; + float meanOccNTrackTPCAUnfm80 = 0; + float meanOccNTrackTPCCUnfm80 = 0; + float meanOccNTrackITSTPCUnfm80 = 0; + float meanOccNTrackITSTPCAUnfm80 = 0; + float meanOccNTrackITSTPCCUnfm80 = 0; + + float meanOccMultNTracksHasITSUnfm80 = 0; + float meanOccMultNTracksHasTPCUnfm80 = 0; + float meanOccMultNTracksHasTOFUnfm80 = 0; + float meanOccMultNTracksHasTRDUnfm80 = 0; + float meanOccMultNTracksITSOnlyUnfm80 = 0; + float meanOccMultNTracksTPCOnlyUnfm80 = 0; + float meanOccMultNTracksITSTPCUnfm80 = 0; + float meanOccMultAllTracksTPCOnlyUnfm80 = 0; + + float meanOccRobustT0V0PrimUnfm80 = 0; + float meanOccRobustFDDT0V0PrimUnfm80 = 0; + float meanOccRobustNtrackDetUnfm80 = 0; + float meanOccRobustMultTableUnfm80 = 0; + + float weightMeanOccPrimUnfm80 = 0; + float weightMeanOccFV0AUnfm80 = 0; + float weightMeanOccFV0CUnfm80 = 0; + float weightMeanOccFT0AUnfm80 = 0; + float weightMeanOccFT0CUnfm80 = 0; + float weightMeanOccFDDAUnfm80 = 0; + float weightMeanOccFDDCUnfm80 = 0; + + float weightMeanOccNTrackITSUnfm80 = 0; + float weightMeanOccNTrackTPCUnfm80 = 0; + float weightMeanOccNTrackTRDUnfm80 = 0; + float weightMeanOccNTrackTOFUnfm80 = 0; + float weightMeanOccNTrackSizeUnfm80 = 0; + float weightMeanOccNTrackTPCAUnfm80 = 0; + float weightMeanOccNTrackTPCCUnfm80 = 0; + float weightMeanOccNTrackITSTPCUnfm80 = 0; + float weightMeanOccNTrackITSTPCAUnfm80 = 0; + float weightMeanOccNTrackITSTPCCUnfm80 = 0; + + float weightMeanOccMultNTracksHasITSUnfm80 = 0; + float weightMeanOccMultNTracksHasTPCUnfm80 = 0; + float weightMeanOccMultNTracksHasTOFUnfm80 = 0; + float weightMeanOccMultNTracksHasTRDUnfm80 = 0; + float weightMeanOccMultNTracksITSOnlyUnfm80 = 0; + float weightMeanOccMultNTracksTPCOnlyUnfm80 = 0; + float weightMeanOccMultNTracksITSTPCUnfm80 = 0; + float weightMeanOccMultAllTracksTPCOnlyUnfm80 = 0; + + float weightMeanOccRobustT0V0PrimUnfm80 = 0; + float weightMeanOccRobustFDDT0V0PrimUnfm80 = 0; + float weightMeanOccRobustNtrackDetUnfm80 = 0; + float weightMeanOccRobustMultTableUnfm80 = 0; + for (const auto& trackQA : tracksQA) { auto const& track = trackQA.track_as(); auto collision = collisions.begin(); @@ -1071,9 +1382,9 @@ struct TrackMeanOccTableProducer { std::copy(listOccsMultExtra.occMultAllTracksTPCOnlyUnfm80().begin(), listOccsMultExtra.occMultAllTracksTPCOnlyUnfm80().end(), occMultAllTracksTPCOnlyUnfm80.begin()); } + auto listOccsRobust = occsRobust.iteratorAt(bc.occId()); + std::copy(listOccsRobust.occRobustT0V0PrimUnfm80().begin(), listOccsRobust.occRobustT0V0PrimUnfm80().end(), occRobustT0V0PrimUnfm80.begin()); if (buildTrackMeanOccs4 || buildTrackMeanOccs8) { - auto listOccsRobust = occsRobust.iteratorAt(bc.occId()); - std::copy(listOccsRobust.occRobustT0V0PrimUnfm80().begin(), listOccsRobust.occRobustT0V0PrimUnfm80().end(), occRobustT0V0PrimUnfm80.begin()); std::copy(listOccsRobust.occRobustFDDT0V0PrimUnfm80().begin(), listOccsRobust.occRobustFDDT0V0PrimUnfm80().end(), occRobustFDDT0V0PrimUnfm80.begin()); std::copy(listOccsRobust.occRobustNtrackDetUnfm80().begin(), listOccsRobust.occRobustNtrackDetUnfm80().end(), occRobustNtrackDetUnfm80.begin()); std::copy(listOccsRobust.occRobustMultExtraTableUnfm80().begin(), listOccsRobust.occRobustMultExtraTableUnfm80().end(), occRobustMultTableUnfm80.begin()); @@ -1114,86 +1425,249 @@ struct TrackMeanOccTableProducer { genTrackMeanOccs0(track.globalIndex()); + meanOccRobustT0V0PrimUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occRobustT0V0PrimUnfm80); + weightMeanOccRobustT0V0PrimUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occRobustT0V0PrimUnfm80); + if (buildTrackMeanOccs1) { - genTrackMeanOccs1(getMeanOccupancy(binBCbegin, binBCend, occPrimUnfm80), - getMeanOccupancy(binBCbegin, binBCend, occFV0AUnfm80), - getMeanOccupancy(binBCbegin, binBCend, occFV0CUnfm80), - getMeanOccupancy(binBCbegin, binBCend, occFT0AUnfm80), - getMeanOccupancy(binBCbegin, binBCend, occFT0CUnfm80), - getMeanOccupancy(binBCbegin, binBCend, occFDDAUnfm80), - getMeanOccupancy(binBCbegin, binBCend, occFDDCUnfm80)); + meanOccPrimUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occPrimUnfm80); + meanOccFV0AUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occFV0AUnfm80); + meanOccFV0CUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occFV0CUnfm80); + meanOccFT0AUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occFT0AUnfm80); + meanOccFT0CUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occFT0CUnfm80); + meanOccFDDAUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occFDDAUnfm80); + meanOccFDDCUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occFDDCUnfm80); + + genTrackMeanOccs1(meanOccPrimUnfm80, + meanOccFV0AUnfm80, + meanOccFV0CUnfm80, + meanOccFT0AUnfm80, + meanOccFT0CUnfm80, + meanOccFDDAUnfm80, + meanOccFDDCUnfm80); + + fillQAInfo(meanOccPrimUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccFV0AUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccFV0CUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccFT0AUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccFT0CUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccFDDAUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccFDDCUnfm80, meanOccRobustT0V0PrimUnfm80); } if (buildTrackMeanOccs2) { - genTrackMeanOccs2( - getMeanOccupancy(binBCbegin, binBCend, occNTrackITSUnfm80), - getMeanOccupancy(binBCbegin, binBCend, occNTrackTPCUnfm80), - getMeanOccupancy(binBCbegin, binBCend, occNTrackTRDUnfm80), - getMeanOccupancy(binBCbegin, binBCend, occNTrackTOFUnfm80), - getMeanOccupancy(binBCbegin, binBCend, occNTrackSizeUnfm80), - getMeanOccupancy(binBCbegin, binBCend, occNTrackTPCAUnfm80), - getMeanOccupancy(binBCbegin, binBCend, occNTrackTPCCUnfm80), - getMeanOccupancy(binBCbegin, binBCend, occNTrackITSTPCUnfm80), - getMeanOccupancy(binBCbegin, binBCend, occNTrackITSTPCAUnfm80), - getMeanOccupancy(binBCbegin, binBCend, occNTrackITSTPCCUnfm80)); + meanOccNTrackITSUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackITSUnfm80); + meanOccNTrackTPCUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackTPCUnfm80); + meanOccNTrackTRDUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackTRDUnfm80); + meanOccNTrackTOFUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackTOFUnfm80); + meanOccNTrackSizeUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackSizeUnfm80); + meanOccNTrackTPCAUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackTPCAUnfm80); + meanOccNTrackTPCCUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackTPCCUnfm80); + meanOccNTrackITSTPCUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackITSTPCUnfm80); + meanOccNTrackITSTPCAUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackITSTPCAUnfm80); + meanOccNTrackITSTPCCUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackITSTPCCUnfm80); + + genTrackMeanOccs2(meanOccNTrackITSUnfm80, + meanOccNTrackTPCUnfm80, + meanOccNTrackTRDUnfm80, + meanOccNTrackTOFUnfm80, + meanOccNTrackSizeUnfm80, + meanOccNTrackTPCAUnfm80, + meanOccNTrackTPCCUnfm80, + meanOccNTrackITSTPCUnfm80, + meanOccNTrackITSTPCAUnfm80, + meanOccNTrackITSTPCCUnfm80); + + fillQAInfo(meanOccNTrackITSUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccNTrackTPCUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccNTrackTRDUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccNTrackTOFUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccNTrackSizeUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccNTrackTPCAUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccNTrackTPCCUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccNTrackITSTPCUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccNTrackITSTPCAUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccNTrackITSTPCCUnfm80, meanOccRobustT0V0PrimUnfm80); } if (buildTrackMeanOccs3) { - genTrackMeanOccs3(getMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasITSUnfm80), - getMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasTPCUnfm80), - getMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasTOFUnfm80), - getMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasTRDUnfm80), - getMeanOccupancy(binBCbegin, binBCend, occMultNTracksITSOnlyUnfm80), - getMeanOccupancy(binBCbegin, binBCend, occMultNTracksTPCOnlyUnfm80), - getMeanOccupancy(binBCbegin, binBCend, occMultNTracksITSTPCUnfm80), - getMeanOccupancy(binBCbegin, binBCend, occMultAllTracksTPCOnlyUnfm80)); + meanOccMultNTracksHasITSUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasITSUnfm80); + meanOccMultNTracksHasTPCUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasTPCUnfm80); + meanOccMultNTracksHasTOFUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasTOFUnfm80); + meanOccMultNTracksHasTRDUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasTRDUnfm80); + meanOccMultNTracksITSOnlyUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occMultNTracksITSOnlyUnfm80); + meanOccMultNTracksTPCOnlyUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occMultNTracksTPCOnlyUnfm80); + meanOccMultNTracksITSTPCUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occMultNTracksITSTPCUnfm80); + meanOccMultAllTracksTPCOnlyUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occMultAllTracksTPCOnlyUnfm80); + + genTrackMeanOccs3(meanOccMultNTracksHasITSUnfm80, + meanOccMultNTracksHasTPCUnfm80, + meanOccMultNTracksHasTOFUnfm80, + meanOccMultNTracksHasTRDUnfm80, + meanOccMultNTracksITSOnlyUnfm80, + meanOccMultNTracksTPCOnlyUnfm80, + meanOccMultNTracksITSTPCUnfm80, + meanOccMultAllTracksTPCOnlyUnfm80); + + fillQAInfo(meanOccMultNTracksHasITSUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccMultNTracksHasTPCUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccMultNTracksHasTOFUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccMultNTracksHasTRDUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccMultNTracksITSOnlyUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccMultNTracksTPCOnlyUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccMultNTracksITSTPCUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccMultAllTracksTPCOnlyUnfm80, meanOccRobustT0V0PrimUnfm80); } if (buildTrackMeanOccs4) { - genTrackMeanOccs4(getMeanOccupancy(binBCbegin, binBCend, occRobustT0V0PrimUnfm80), - getMeanOccupancy(binBCbegin, binBCend, occRobustFDDT0V0PrimUnfm80), - getMeanOccupancy(binBCbegin, binBCend, occRobustNtrackDetUnfm80), - getMeanOccupancy(binBCbegin, binBCend, occRobustMultTableUnfm80)); + meanOccRobustFDDT0V0PrimUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occRobustFDDT0V0PrimUnfm80); + meanOccRobustNtrackDetUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occRobustNtrackDetUnfm80); + meanOccRobustMultTableUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occRobustMultTableUnfm80); + + genTrackMeanOccs4(meanOccRobustT0V0PrimUnfm80, + meanOccRobustFDDT0V0PrimUnfm80, + meanOccRobustNtrackDetUnfm80, + meanOccRobustMultTableUnfm80); + + fillQAInfo(meanOccRobustT0V0PrimUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccRobustFDDT0V0PrimUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccRobustNtrackDetUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccRobustMultTableUnfm80, meanOccRobustT0V0PrimUnfm80); } if (buildTrackMeanOccs5) { - genTrackMeanOccs5(getWeightedMeanOccupancy(binBCbegin, binBCend, occPrimUnfm80), - getWeightedMeanOccupancy(binBCbegin, binBCend, occFV0AUnfm80), - getWeightedMeanOccupancy(binBCbegin, binBCend, occFV0CUnfm80), - getWeightedMeanOccupancy(binBCbegin, binBCend, occFT0AUnfm80), - getWeightedMeanOccupancy(binBCbegin, binBCend, occFT0CUnfm80), - getWeightedMeanOccupancy(binBCbegin, binBCend, occFDDAUnfm80), - getWeightedMeanOccupancy(binBCbegin, binBCend, occFDDCUnfm80)); + weightMeanOccPrimUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occPrimUnfm80); + weightMeanOccFV0AUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occFV0AUnfm80); + weightMeanOccFV0CUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occFV0CUnfm80); + weightMeanOccFT0AUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occFT0AUnfm80); + weightMeanOccFT0CUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occFT0CUnfm80); + weightMeanOccFDDAUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occFDDAUnfm80); + weightMeanOccFDDCUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occFDDCUnfm80); + + genTrackMeanOccs5(weightMeanOccPrimUnfm80, + weightMeanOccFV0AUnfm80, + weightMeanOccFV0CUnfm80, + weightMeanOccFT0AUnfm80, + weightMeanOccFT0CUnfm80, + weightMeanOccFDDAUnfm80, + weightMeanOccFDDCUnfm80); + + fillQAInfo(weightMeanOccPrimUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccFV0AUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccFV0CUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccFT0AUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccFT0CUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccFDDAUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccFDDCUnfm80, meanOccRobustT0V0PrimUnfm80); + + fillQAInfo(weightMeanOccPrimUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccFV0AUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccFV0CUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccFT0AUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccFT0CUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccFDDAUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccFDDCUnfm80, weightMeanOccRobustT0V0PrimUnfm80); } if (buildTrackMeanOccs6) { - genTrackMeanOccs6( - getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackITSUnfm80), - getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackTPCUnfm80), - getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackTRDUnfm80), - getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackTOFUnfm80), - getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackSizeUnfm80), - getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackTPCAUnfm80), - getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackTPCCUnfm80), - getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackITSTPCUnfm80), - getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackITSTPCAUnfm80), - getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackITSTPCCUnfm80)); + weightMeanOccNTrackITSUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackITSUnfm80); + weightMeanOccNTrackTPCUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackTPCUnfm80); + weightMeanOccNTrackTRDUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackTRDUnfm80); + weightMeanOccNTrackTOFUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackTOFUnfm80); + weightMeanOccNTrackSizeUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackSizeUnfm80); + weightMeanOccNTrackTPCAUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackTPCAUnfm80); + weightMeanOccNTrackTPCCUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackTPCCUnfm80); + weightMeanOccNTrackITSTPCUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackITSTPCUnfm80); + weightMeanOccNTrackITSTPCAUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackITSTPCAUnfm80); + weightMeanOccNTrackITSTPCCUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackITSTPCCUnfm80); + + genTrackMeanOccs6(weightMeanOccNTrackITSUnfm80, + weightMeanOccNTrackTPCUnfm80, + weightMeanOccNTrackTRDUnfm80, + weightMeanOccNTrackTOFUnfm80, + weightMeanOccNTrackSizeUnfm80, + weightMeanOccNTrackTPCAUnfm80, + weightMeanOccNTrackTPCCUnfm80, + weightMeanOccNTrackITSTPCUnfm80, + weightMeanOccNTrackITSTPCAUnfm80, + weightMeanOccNTrackITSTPCCUnfm80); + + fillQAInfo(weightMeanOccNTrackITSUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackTPCUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackTRDUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackTOFUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackSizeUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackTPCAUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackTPCCUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackITSTPCUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackITSTPCAUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackITSTPCCUnfm80, meanOccRobustT0V0PrimUnfm80); + + fillQAInfo(weightMeanOccNTrackITSUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackTPCUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackTRDUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackTOFUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackSizeUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackTPCAUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackTPCCUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackITSTPCUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackITSTPCAUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackITSTPCCUnfm80, weightMeanOccRobustT0V0PrimUnfm80); } if (buildTrackMeanOccs7) { - genTrackMeanOccs7( - getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasITSUnfm80), - getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasTPCUnfm80), - getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasTOFUnfm80), - getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasTRDUnfm80), - getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksITSOnlyUnfm80), - getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksTPCOnlyUnfm80), - getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksITSTPCUnfm80), - getWeightedMeanOccupancy(binBCbegin, binBCend, occMultAllTracksTPCOnlyUnfm80)); + weightMeanOccMultNTracksHasITSUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasITSUnfm80); + weightMeanOccMultNTracksHasTPCUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasTPCUnfm80); + weightMeanOccMultNTracksHasTOFUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasTOFUnfm80); + weightMeanOccMultNTracksHasTRDUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasTRDUnfm80); + weightMeanOccMultNTracksITSOnlyUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksITSOnlyUnfm80); + weightMeanOccMultNTracksTPCOnlyUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksTPCOnlyUnfm80); + weightMeanOccMultNTracksITSTPCUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksITSTPCUnfm80); + weightMeanOccMultAllTracksTPCOnlyUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occMultAllTracksTPCOnlyUnfm80); + + genTrackMeanOccs7(weightMeanOccMultNTracksHasITSUnfm80, + weightMeanOccMultNTracksHasTPCUnfm80, + weightMeanOccMultNTracksHasTOFUnfm80, + weightMeanOccMultNTracksHasTRDUnfm80, + weightMeanOccMultNTracksITSOnlyUnfm80, + weightMeanOccMultNTracksTPCOnlyUnfm80, + weightMeanOccMultNTracksITSTPCUnfm80, + weightMeanOccMultAllTracksTPCOnlyUnfm80); + + fillQAInfo(weightMeanOccMultNTracksHasITSUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultNTracksHasTPCUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultNTracksHasTOFUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultNTracksHasTRDUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultNTracksITSOnlyUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultNTracksTPCOnlyUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultNTracksITSTPCUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultAllTracksTPCOnlyUnfm80, meanOccRobustT0V0PrimUnfm80); + + fillQAInfo(weightMeanOccMultNTracksHasITSUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultNTracksHasTPCUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultNTracksHasTOFUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultNTracksHasTRDUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultNTracksITSOnlyUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultNTracksTPCOnlyUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultNTracksITSTPCUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultAllTracksTPCOnlyUnfm80, weightMeanOccRobustT0V0PrimUnfm80); } if (buildTrackMeanOccs8) { - genTrackMeanOccs8(getWeightedMeanOccupancy(binBCbegin, binBCend, occRobustT0V0PrimUnfm80), - getWeightedMeanOccupancy(binBCbegin, binBCend, occRobustFDDT0V0PrimUnfm80), - getWeightedMeanOccupancy(binBCbegin, binBCend, occRobustNtrackDetUnfm80), - getWeightedMeanOccupancy(binBCbegin, binBCend, occRobustMultTableUnfm80)); + weightMeanOccRobustFDDT0V0PrimUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occRobustFDDT0V0PrimUnfm80); + weightMeanOccRobustNtrackDetUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occRobustNtrackDetUnfm80); + weightMeanOccRobustMultTableUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occRobustMultTableUnfm80); + + genTrackMeanOccs8(weightMeanOccRobustT0V0PrimUnfm80, + weightMeanOccRobustFDDT0V0PrimUnfm80, + weightMeanOccRobustNtrackDetUnfm80, + weightMeanOccRobustMultTableUnfm80); + + fillQAInfo(weightMeanOccRobustT0V0PrimUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccRobustFDDT0V0PrimUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccRobustNtrackDetUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccRobustMultTableUnfm80, meanOccRobustT0V0PrimUnfm80); + + fillQAInfo(weightMeanOccRobustT0V0PrimUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccRobustFDDT0V0PrimUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccRobustNtrackDetUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccRobustMultTableUnfm80, weightMeanOccRobustT0V0PrimUnfm80); } } // end of trackQA loop } // Process function ends From e1a5be56891c6b866c94e74e815c7942a35bb9bb Mon Sep 17 00:00:00 2001 From: Zhengqing Wang Date: Tue, 4 Mar 2025 15:59:16 +0800 Subject: [PATCH 0526/1650] [PWGCF] updates on cme signal and TOF QA (#10302) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/pidcme.cxx | 2455 +++++++++++++++++++++++++---------- 1 file changed, 1764 insertions(+), 691 deletions(-) diff --git a/PWGCF/Flow/Tasks/pidcme.cxx b/PWGCF/Flow/Tasks/pidcme.cxx index 30ec8b6a455..b21a1ee6ce8 100644 --- a/PWGCF/Flow/Tasks/pidcme.cxx +++ b/PWGCF/Flow/Tasks/pidcme.cxx @@ -67,8 +67,12 @@ DECLARE_SOA_COLUMN(NSigmaPrITS, nSigmaPrITS, float); DECLARE_SOA_COLUMN(NSigmaPiTPC, nSigmaPiTPC, float); DECLARE_SOA_COLUMN(NSigmaKaTPC, nSigmaKaTPC, float); DECLARE_SOA_COLUMN(NSigmaPrTPC, nSigmaPrTPC, float); +DECLARE_SOA_COLUMN(NSigmaPiTOF, nSigmaPiTOF, float); +DECLARE_SOA_COLUMN(NSigmaKaTOF, nSigmaKaTOF, float); +DECLARE_SOA_COLUMN(NSigmaPrTOF, nSigmaPrTOF, float); } // namespace cme_track_pid_columns -DECLARE_SOA_TABLE(Flags, "AOD", "Flags", cme_track_pid_columns::NPidFlag, cme_track_pid_columns::AverClusterSizeCosl, cme_track_pid_columns::NSigmaPiITS, cme_track_pid_columns::NSigmaKaITS, cme_track_pid_columns::NSigmaPrITS, cme_track_pid_columns::NSigmaPiTPC, cme_track_pid_columns::NSigmaKaTPC, cme_track_pid_columns::NSigmaPrTPC); +DECLARE_SOA_TABLE(Flags, "AOD", "Flags", cme_track_pid_columns::NPidFlag); +DECLARE_SOA_TABLE(PidInfo, "AOD", "PidInfo", cme_track_pid_columns::AverClusterSizeCosl, cme_track_pid_columns::NSigmaPiITS, cme_track_pid_columns::NSigmaKaITS, cme_track_pid_columns::NSigmaPrITS, cme_track_pid_columns::NSigmaPiTPC, cme_track_pid_columns::NSigmaKaTPC, cme_track_pid_columns::NSigmaPrTPC, cme_track_pid_columns::NSigmaPiTOF, cme_track_pid_columns::NSigmaKaTOF, cme_track_pid_columns::NSigmaPrTOF); } // namespace o2::aod using TracksPID = soa::Join; @@ -76,7 +80,12 @@ using CollisionPID = soa::Join; struct FillPIDcolums { Configurable cfgPtMaxforTPCOnlyPID{"cfgPtMaxforTPCOnlyPID", 0.4, "Maxmium track pt for TPC only PID,only when onlyTOF and onlyTOFHIT closed"}; Configurable cfgMinPtPID{"cfgMinPtPID", 0.15, "Minimum track #P_{t} for PID"}; + Configurable cfgMaxPtPID{"cfgMaxPtPID", 99.9, "Maximum track #P_{t} for PID"}; Configurable cfgMaxEtaPID{"cfgMaxEtaPID", 0.8, "Maximum track #eta for PID"}; + Configurable cfgMaxTPCChi2NCl{"cfgMaxTPCChi2NCl", 2.5, "Maximum chi2 per cluster TPC for PID if not use costom track cuts"}; + Configurable cfgMaxChi2NClITS{"cfgMaxChi2NClITS", 2.5, "Maximum chi2 per cluster ITS for PID if not use costom track cuts"}; + Configurable cfgMinTPCCls{"cfgMinTPCCls", 70, "Minimum TPC clusters for PID if not use costom track cuts"}; + Configurable cfgMinITSCls{"cfgMinITSCls", 5, "Minimum ITS clusters for PID if not use costom track cuts"}; Configurable cfgAveClusSizeCoslMinPi{"cfgAveClusSizeCoslMinPi", 0, "Base line for minmum ITS cluster size x cos(#lambda) for Pions"}; Configurable cfgAveClusSizeCoslMaxPi{"cfgAveClusSizeCoslMaxPi", 1e9, "Base line for maxmum ITS cluster size x cos(#lambda) for Pions"}; Configurable cfgAveClusSizeCoslMinKa{"cfgAveClusSizeCoslMinKa", 0, "Base line for minmum ITS cluster size x cos(#lambda) for Kaons"}; @@ -96,17 +105,48 @@ struct FillPIDcolums { ConfigurableAxis cfgaxisAverClusterCoslnSigma{"cfgaxisAverClusterCoslnSigma", {50, 0, 5}, "Binning for average cluster size x cos(#lambda) vs nSigam"}; ConfigurableAxis cfgaxisetaPID{"cfgaxisetaPID", {90, -0.9, 0.9}, "Binning for Pt QA"}; + Configurable cfgQuietMode{"cfgQuietMode", false, "open quiet mode for saving cpu cost and only do some basic QA plots"}; + Configurable cfgOpenPlotnSigmaTOFITSPt{"cfgOpenPlotnSigmaTOFITSPt", true, "plot nSigmaTOF vs nSigmaITS vs Pt"}; + Configurable cfgOpenPlotnSigmaITSTPCPt{"cfgOpenPlotnSigmaITSTPCPt", true, "plot nSigmaITS vs nSigmaTOF vs Pt"}; + Configurable cfgOpenPlotnSigmaTOFTPCPt{"cfgOpenPlotnSigmaTOFTPCPt", true, "plot nSigmaTOF vs nSigmaTPC vs Pt"}; + Configurable cfgOpenPlotAverClus{"cfgOpenPlotAverClus", true, "plot average cluster size x cos(#lambda)"}; + Configurable cfgOpenPlotAverClusP{"cfgOpenPlotAverClusP", true, "plot average cluster size x cos(#lambda) vs p"}; + Configurable cfgOpenPlotAverClusnSigmaTPC{"cfgOpenPlotAverClusnSigmaTPC", true, "plot average cluster size x cos(#lambda) vs nSigmaTPC"}; + Configurable cfgOpenPlotPhiDis{"cfgOpenPlotPhiDis", true, "plot phi distribution QA"}; + Configurable cfgOpenPlotPhiDisPtEta{"cfgOpenPlotPhiDisPtEta", true, "plot phi pt eta distribution QA"}; Configurable cfgOpenITSCut{"cfgOpenITSCut", true, "open ITSnsigma cut"}; - Configurable cfgOpenDetailPlots{"cfgOpenDetailPlots", true, "open detail TH3D plots for nSigmaTPC-ITS Pt-eta-Phi nSigmaITS-clustersize"}; + Configurable cfgOpenDetailPlotsTPCITSContaimination{"cfgOpenDetailPlotsTPCITSContaimination", false, "open detail TH3D plots for nSigmaTPC-ITS Pt-eta-Phi nSigmaITS-clustersize"}; Configurable cfgOpenAllowCrossTrack{"cfgOpenAllowCrossTrack", false, "Allow one track to be identified as different kind of PID particles"}; Configurable cfgOpenCrossTrackQAPlots{"cfgOpenCrossTrackQAPlots", true, "open cross pid track QA plots"}; Configurable cfgOpenTOFOnlyPID{"cfgOpenTOFOnlyPID", true, "only accept tracks who has TOF infomation and use TOFnsigma for PID(priority greater than TPConly and combined)"}; Configurable cfgOpenTPCOnlyPID{"cfgOpenTPCOnlyPID", false, "only use TPCnsigma for PID(priority grater than combined less than TOFOnly)"}; + Configurable cfgUseCostomTrackCuts{"cfgUseCostomTrackCuts", true, "use track cuts from default track selection table producer"}; + Configurable cfgOpenPtRangedTOFnSigmacutPi{"cfgOpenPtRangedTOFnSigmacutPi", false, "use nSigma TOF cut for different pt Pion"}; + Configurable cfgOpenPtRangedTPCnSigmacutPi{"cfgOpenPtRangedTPCnSigmacutPi", false, "use nSigma TPC cut for different pt Pion"}; + Configurable cfgOpenPtRangedITSnSigmacutPi{"cfgOpenPtRangedITSnSigmacutPi", false, "use nSigma ITS cut for different pt Pion"}; + Configurable cfgOpenPtRangedTOFnSigmacutKa{"cfgOpenPtRangedTOFnSigmacutKa", false, "use nSigma TOF cut for different pt Kaon"}; + Configurable cfgOpenPtRangedTPCnSigmacutKa{"cfgOpenPtRangedTPCnSigmacutKa", false, "use nSigma TPC cut for different pt Kaon"}; + Configurable cfgOpenPtRangedITSnSigmacutKa{"cfgOpenPtRangedITSnSigmacutKa", false, "use nSigma ITS cut for different pt Kaon"}; + Configurable cfgOpenPtRangedTOFnSigmacutPr{"cfgOpenPtRangedTOFnSigmacutPr", false, "use nSigma TOF cut for different pt Proton"}; + Configurable cfgOpenPtRangedTPCnSigmacutPr{"cfgOpenPtRangedTPCnSigmacutPr", false, "use nSigma TPC cut for different pt Proton"}; + Configurable cfgOpenPtRangedITSnSigmacutPr{"cfgOpenPtRangedITSnSigmacutPr", false, "use nSigma ITS cut for different pt Proton"}; Configurable> cfgnSigmaCutTPC{"cfgnSigmaCutTPC", {3, 3, 3}, "TPC nsigma cut for pi k p respectively at low pt and for the TPCOnly case"}; Configurable> cfgnSigmaCutTOF{"cfgnSigmaCutTOF", {1.5, 1.5, 1.5}, "TOF nsigma cut for pi k p respectively for the TOFonly case"}; Configurable> cfgnSigmaCutRMS{"cfgnSigmaCutRMS", {3, 3, 3}, "TPC_TOF combined cut for pi k p respectively at high pt"}; - Configurable> cfgnSigmaCutITS{"cfgnSigmaCutITS", {3, 2.5, 2}, "TPC_TOF combined cut for pi k p respectively at high pt"}; + Configurable> cfgnSigmaCutITS{"cfgnSigmaCutITS", {3, 2.5, 2}, "ITS nSigma cut for pi k p"}; + Configurable> cfgPtBinPionPID{"cfgPtBinPionPID", {0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 3.0, 3.5, 4.0, 5.0, 6.0, 8.0, 10.0}, "pt bin for pion PIDnsigma"}; + Configurable> cfgPtBinKaonPID{"cfgPtBinKaonPID", {0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 3.0, 3.5, 4.0, 5.0, 6.0}, "pt bin for pion PIDnsigma"}; + Configurable> cfgPtBinProtonPID{"cfgPtBinProtonPID", {0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 3.0, 3.5, 4.0, 5.0, 6.0}, "pt bin for pion PIDnsigma"}; + Configurable> cfgnSigmaTPCPionPt{"cfgnSigmaTPCPionPt", {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, "nSigmaTPC cut anchored to pion pt bins"}; + Configurable> cfgnSigmaTOFPionPt{"cfgnSigmaTOFPionPt", {1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5}, "nSigmaTOF cut anchored to pion pt bins"}; + Configurable> cfgnSigmaITSPionPt{"cfgnSigmaITSPionPt", {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, "nSigmaITS cut anchored to pion pt bins"}; + Configurable> cfgnSigmaTPCKaonPt{"cfgnSigmaTPCKaonPt", {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, "nSigmaTPC cut anchored to kaon pt bins"}; + Configurable> cfgnSigmaTOFKaonPt{"cfgnSigmaTOFKaonPt", {1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5}, "nSigmaTOF cut anchored to kaon pt bins"}; + Configurable> cfgnSigmaITSKaonPt{"cfgnSigmaITSKaonPt", {2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5}, "nSigmaITS cut anchored to kaon pt bins"}; + Configurable> cfgnSigmaTPCProtonPt{"cfgnSigmaTPCProtonPt", {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, "nSigmaTPC cut anchored to proton pt bins"}; + Configurable> cfgnSigmaTOFProtonPt{"cfgnSigmaTOFProtonPt", {1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5}, "nSigmaTOF cut anchored to proton pt bins"}; + Configurable> cfgnSigmaITSProtonPt{"cfgnSigmaITSProtonPt", {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, "nSigmaITS cut anchored to proton pt bins"}; static float averageClusterSizeCosl(uint32_t itsClusterSizes, float eta) { @@ -129,20 +169,31 @@ struct FillPIDcolums { template bool selTrackPid(const TrackType track) { - if (!(track.pt() > cfgMinPtPID)) - return false; - if (!(std::abs(track.eta()) < cfgMaxEtaPID)) - return false; - if (!track.passedITSNCls()) + if ((track.pt() < cfgMinPtPID) || (track.pt() > cfgMaxPtPID)) return false; - if (!track.passedITSChi2NDF()) - return false; - if (!track.passedITSHits()) + if (std::abs(track.eta()) > cfgMaxEtaPID) return false; + if (cfgUseCostomTrackCuts) { + if (!track.passedITSNCls()) + return false; + if (!track.passedITSChi2NDF()) + return false; + if (!track.passedITSHits()) + return false; + if (!track.passedTPCChi2NDF()) + return false; + } else { + if (track.tpcChi2NCl() > cfgMaxTPCChi2NCl) + return false; + if (track.tpcNClsFound() < cfgMinTPCCls) + return false; + if (track.itsChi2NCl() < cfgMaxChi2NClITS) + return false; + if (track.itsNCls() < cfgMinITSCls) + return false; + } if (!track.passedTPCCrossedRowsOverNCls()) return false; - if (!track.passedTPCChi2NDF()) - return false; if (!track.passedDCAxy()) return false; if (!track.passedDCAz()) @@ -160,24 +211,56 @@ struct FillPIDcolums { std::array nSigmaCombined = {std::hypot(candidate.tpcNSigmaPi(), candidate.tofNSigmaPi()), std::hypot(candidate.tpcNSigmaKa(), candidate.tofNSigmaKa()), std::hypot(candidate.tpcNSigmaPr(), candidate.tofNSigmaPr())}; std::array nSigmaToUse; std::vector pidVector; + std::vector pidVectorTOFPt; + std::vector pidVectorTPCPt; int pid = -1; bool kIsPi = false, kIsKa = false, kIsPr = false; - /*int currentPtBin = 0; - for (int i = 0; i < static_cast(cfgPtPIDCut.value.size()) - 1; ++i) { - if (candidate.pt() >= cfgPtPIDCut.value[i] && candidate.pt() < cfgPtPIDCut.value[i + 1]) { - currentPtBin = i; + int currentPtBinPi = -1, currentPtBinKa = -1, currentPtBinPr = -1; + if (cfgOpenPtRangedTOFnSigmacutPi || cfgOpenPtRangedTPCnSigmacutPi) { + for (int i = 0; i < static_cast(cfgPtBinPionPID.value.size()) - 1; ++i) { + if (candidate.pt() >= cfgPtBinPionPID.value[i] && candidate.pt() < cfgPtBinPionPID.value[i + 1]) { + currentPtBinPi = i; + break; + } + } + } + if (cfgOpenPtRangedTOFnSigmacutKa || cfgOpenPtRangedTPCnSigmacutKa) { + for (int i = 0; i < static_cast(cfgPtBinKaonPID.value.size()) - 1; ++i) { + if (candidate.pt() >= cfgPtBinKaonPID.value[i] && candidate.pt() < cfgPtBinKaonPID.value[i + 1]) { + currentPtBinKa = i; + break; + } + } + } + if (cfgOpenPtRangedTOFnSigmacutPr || cfgOpenPtRangedTPCnSigmacutPr) { + for (int i = 0; i < static_cast(cfgPtBinProtonPID.value.size()) - 1; ++i) { + if (candidate.pt() >= cfgPtBinProtonPID.value[i] && candidate.pt() < cfgPtBinProtonPID.value[i + 1]) { + currentPtBinPr = i; break; } - }*/ + } + } + float nSigmaTOFCutPiPt = (currentPtBinPi == -1) ? cfgnSigmaCutTOF.value[0] : cfgnSigmaTOFPionPt.value[currentPtBinPi]; + float nSigmaTOFCutKaPt = (currentPtBinKa == -1) ? cfgnSigmaCutTOF.value[1] : cfgnSigmaTOFKaonPt.value[currentPtBinKa]; + float nSigmaTOFCutPrPt = (currentPtBinPr == -1) ? cfgnSigmaCutTOF.value[2] : cfgnSigmaTOFProtonPt.value[currentPtBinPr]; + float nSigmaTPCCutPiPt = (currentPtBinPi == -1) ? cfgnSigmaCutTPC.value[0] : cfgnSigmaTPCPionPt.value[currentPtBinPi]; + float nSigmaTPCCutKaPt = (currentPtBinKa == -1) ? cfgnSigmaCutTPC.value[1] : cfgnSigmaTPCKaonPt.value[currentPtBinKa]; + float nSigmaTPCCutPrPt = (currentPtBinPr == -1) ? cfgnSigmaCutTPC.value[2] : cfgnSigmaTPCProtonPt.value[currentPtBinPr]; + pidVectorTOFPt.push_back(nSigmaTOFCutPiPt); + pidVectorTOFPt.push_back(nSigmaTOFCutKaPt); + pidVectorTOFPt.push_back(nSigmaTOFCutPrPt); + pidVectorTPCPt.push_back(nSigmaTPCCutPiPt); + pidVectorTPCPt.push_back(nSigmaTPCCutKaPt); + pidVectorTPCPt.push_back(nSigmaTPCCutPrPt); // Choose which nSigma array and PIDcut array to use if (cfgOpenTOFOnlyPID) { if (!candidate.hasTOF()) return -1; nSigmaToUse = nSigmaTOF; - pidVector = cfgnSigmaCutTOF.value; + pidVector = pidVectorTOFPt; } else if (cfgOpenTPCOnlyPID) { nSigmaToUse = nSigmaTPC; - pidVector = cfgnSigmaCutTPC.value; + pidVector = pidVectorTPCPt; } else { nSigmaToUse = (candidate.pt() > cfgPtMaxforTPCOnlyPID && candidate.hasTOF()) ? nSigmaCombined : nSigmaTPC; pidVector = (candidate.pt() > cfgPtMaxforTPCOnlyPID && candidate.hasTOF()) ? cfgnSigmaCutRMS.value : cfgnSigmaCutTPC.value; @@ -188,53 +271,125 @@ struct FillPIDcolums { if (std::abs(nSigmaToUse[i]) < pidVector[i]) { if (i == 0) { kIsPi = true; - if (cfgOpenCrossTrackQAPlots) { - histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_cross_Pi"), candidate.tpcNSigmaPi(), candidate.tofNSigmaPi(), candidate.pt()); - histosQA.fill(HIST("QA/PID/histdEdxTPC_cross_Pi"), candidate.sign() * candidate.tpcInnerParam(), candidate.tpcSignal()); - histosQA.fill(HIST("QA/PID/histnSigma_cross_Pi"), candidate.tpcNSigmaPi()); - histosQA.fill(HIST("QA/PID/histnSigma_Pt_cross_Pi"), candidate.pt(), candidate.tpcNSigmaPi()); - histosQA.fill(HIST("QA/PID/histnSigma_ITS_cross_Pi"), candidate.itsNSigmaPi()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_cross_Pi"), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_cross_Pi"), candidate.p(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_cross_Pi"), candidate.tpcNSigmaPi(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histPhi_Dis_cross_Pi"), candidate.phi()); - histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_cross_Pi"), candidate.tpcNSigmaPi(), candidate.itsNSigmaPi()); - histosQA.fill(HIST("QA/PID/histnSigma_TOF_cross_Pi"), candidate.tofNSigmaPi()); - histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_cross_Pi"), candidate.pt(), candidate.tofNSigmaPi()); + if (!cfgQuietMode) { + if (cfgOpenCrossTrackQAPlots) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_cross_Pi"), candidate.itsNSigmaPi(), candidate.tpcNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaITS_cross_Pi"), candidate.tofNSigmaPi(), candidate.itsNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaTPC_cross_Pi"), candidate.tofNSigmaPi(), candidate.tpcNSigmaPi()); + histosQA.fill(HIST("QA/PID/histdEdxTPC_cross_Pi"), candidate.sign() * candidate.tpcInnerParam(), candidate.tpcSignal()); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_cross_Pi"), candidate.tofNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_cross_Pi"), candidate.pt(), candidate.tofNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_cross_Pi"), candidate.tpcNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_Pt_cross_Pi"), candidate.pt(), candidate.tpcNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_cross_Pi"), candidate.itsNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pt_cross_Pi"), candidate.pt(), candidate.itsNSigmaPi()); + if (cfgOpenPlotnSigmaTOFITSPt) { + histosQA.fill(HIST("QA/PID/histnSigma_TOF_ITS_Pt_cross_Pi"), candidate.pt(), candidate.tofNSigmaPi(), candidate.itsNSigmaPi()); + } + if (cfgOpenPlotnSigmaTOFTPCPt) { + histosQA.fill(HIST("QA/PID/histnSigma_TOF_TPC_Pt_cross_Pi"), candidate.pt(), candidate.tofNSigmaPi(), candidate.tpcNSigmaPi()); + } + if (cfgOpenPlotnSigmaITSTPCPt) { + histosQA.fill(HIST("QA/PID/histnSigma_ITS_TPC_Pt_cross_Pi"), candidate.pt(), candidate.itsNSigmaPi(), candidate.tpcNSigmaPi()); + } + if (cfgOpenPlotAverClus) { + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_cross_Pi"), averClusSizeCosl); + } + if (cfgOpenPlotAverClusP) { + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_cross_Pi"), candidate.p(), averClusSizeCosl); + } + if (cfgOpenPlotAverClusnSigmaTPC) { + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_cross_Pi"), candidate.tpcNSigmaPi(), averClusSizeCosl); + } + if (cfgOpenPlotPhiDis) { + histosQA.fill(HIST("QA/PID/histPhi_Dis_cross_Pi"), candidate.phi()); + } + if (cfgOpenPlotPhiDisPtEta) { + histosQA.fill(HIST("QA/PID/histPhi_Dis_Pt_Eta_cross_Pi"), candidate.phi(), candidate.pt(), candidate.eta()); + } + } } } if (i == 1) { kIsKa = true; - if (cfgOpenCrossTrackQAPlots) { - histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_cross_Ka"), candidate.tpcNSigmaKa(), candidate.tofNSigmaKa(), candidate.pt()); - histosQA.fill(HIST("QA/PID/histdEdxTPC_cross_Ka"), candidate.sign() * candidate.tpcInnerParam(), candidate.tpcSignal()); - histosQA.fill(HIST("QA/PID/histnSigma_cross_Ka"), candidate.tpcNSigmaKa()); - histosQA.fill(HIST("QA/PID/histnSigma_Pt_cross_Ka"), candidate.pt(), candidate.tpcNSigmaKa()); - histosQA.fill(HIST("QA/PID/histnSigma_ITS_cross_Ka"), candidate.itsNSigmaKa()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_cross_Ka"), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_cross_Ka"), candidate.p(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_cross_Ka"), candidate.tpcNSigmaKa(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histPhi_Dis_cross_Ka"), candidate.phi()); - histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_cross_Ka"), candidate.tpcNSigmaKa(), candidate.itsNSigmaKa()); - histosQA.fill(HIST("QA/PID/histnSigma_TOF_cross_Ka"), candidate.tofNSigmaKa()); - histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_cross_Ka"), candidate.pt(), candidate.tofNSigmaKa()); + if (!cfgQuietMode) { + if (cfgOpenCrossTrackQAPlots) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_cross_Ka"), candidate.itsNSigmaKa(), candidate.tpcNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaITS_cross_Ka"), candidate.tofNSigmaKa(), candidate.itsNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaTPC_cross_Ka"), candidate.tofNSigmaKa(), candidate.tpcNSigmaKa()); + histosQA.fill(HIST("QA/PID/histdEdxTPC_cross_Ka"), candidate.sign() * candidate.tpcInnerParam(), candidate.tpcSignal()); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_cross_Ka"), candidate.tofNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_cross_Ka"), candidate.pt(), candidate.tofNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_cross_Ka"), candidate.tpcNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_Pt_cross_Ka"), candidate.pt(), candidate.tpcNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_cross_Ka"), candidate.itsNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pt_cross_Ka"), candidate.pt(), candidate.itsNSigmaKa()); + if (cfgOpenPlotnSigmaTOFITSPt) { + histosQA.fill(HIST("QA/PID/histnSigma_TOF_ITS_Pt_cross_Ka"), candidate.pt(), candidate.tofNSigmaKa(), candidate.itsNSigmaKa()); + } + if (cfgOpenPlotnSigmaTOFTPCPt) { + histosQA.fill(HIST("QA/PID/histnSigma_TOF_TPC_Pt_cross_Ka"), candidate.pt(), candidate.tofNSigmaKa(), candidate.tpcNSigmaKa()); + } + if (cfgOpenPlotnSigmaITSTPCPt) { + histosQA.fill(HIST("QA/PID/histnSigma_ITS_TPC_Pt_cross_Ka"), candidate.pt(), candidate.itsNSigmaKa(), candidate.tpcNSigmaKa()); + } + if (cfgOpenPlotAverClus) { + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_cross_Ka"), averClusSizeCosl); + } + if (cfgOpenPlotAverClusP) { + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_cross_Ka"), candidate.p(), averClusSizeCosl); + } + if (cfgOpenPlotAverClusnSigmaTPC) { + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_cross_Ka"), candidate.tpcNSigmaKa(), averClusSizeCosl); + } + if (cfgOpenPlotPhiDis) { + histosQA.fill(HIST("QA/PID/histPhi_Dis_cross_Ka"), candidate.phi()); + } + if (cfgOpenPlotPhiDisPtEta) { + histosQA.fill(HIST("QA/PID/histPhi_Dis_Pt_Eta_cross_Ka"), candidate.phi(), candidate.pt(), candidate.eta()); + } + } } } if (i == 2) { kIsPr = true; - if (cfgOpenCrossTrackQAPlots) { - histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_cross_Pr"), candidate.tpcNSigmaPr(), candidate.tofNSigmaPr(), candidate.pt()); - histosQA.fill(HIST("QA/PID/histdEdxTPC_cross_Pr"), candidate.sign() * candidate.tpcInnerParam(), candidate.tpcSignal()); - histosQA.fill(HIST("QA/PID/histnSigma_cross_Pr"), candidate.tpcNSigmaPr()); - histosQA.fill(HIST("QA/PID/histnSigma_Pt_cross_Pr"), candidate.pt(), candidate.tpcNSigmaPr()); - histosQA.fill(HIST("QA/PID/histnSigma_ITS_cross_Pr"), candidate.itsNSigmaPr()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_cross_Pr"), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_cross_Pr"), candidate.p(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_cross_Pr"), candidate.tpcNSigmaKa(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histPhi_Dis_cross_Pr"), candidate.phi()); - histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_cross_Pr"), candidate.tpcNSigmaPr(), candidate.itsNSigmaPr()); - histosQA.fill(HIST("QA/PID/histnSigma_TOF_cross_Pr"), candidate.tofNSigmaPr()); - histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_cross_Pr"), candidate.pt(), candidate.tofNSigmaPr()); + if (!cfgQuietMode) { + if (cfgOpenCrossTrackQAPlots) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_cross_Pr"), candidate.itsNSigmaPr(), candidate.tpcNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaITS_cross_Pr"), candidate.tofNSigmaPr(), candidate.itsNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaTPC_cross_Pr"), candidate.tofNSigmaPr(), candidate.tpcNSigmaPr()); + histosQA.fill(HIST("QA/PID/histdEdxTPC_cross_Pr"), candidate.sign() * candidate.tpcInnerParam(), candidate.tpcSignal()); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_cross_Pr"), candidate.tofNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_cross_Pr"), candidate.pt(), candidate.tofNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_cross_Pr"), candidate.tpcNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_Pt_cross_Pr"), candidate.pt(), candidate.tpcNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_cross_Pr"), candidate.itsNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pt_cross_Pr"), candidate.pt(), candidate.itsNSigmaPr()); + if (cfgOpenPlotnSigmaTOFITSPt) { + histosQA.fill(HIST("QA/PID/histnSigma_TOF_ITS_Pt_cross_Pr"), candidate.pt(), candidate.tofNSigmaPr(), candidate.itsNSigmaPr()); + } + if (cfgOpenPlotnSigmaTOFTPCPt) { + histosQA.fill(HIST("QA/PID/histnSigma_TOF_TPC_Pt_cross_Pr"), candidate.pt(), candidate.tofNSigmaPr(), candidate.tpcNSigmaPr()); + } + if (cfgOpenPlotnSigmaITSTPCPt) { + histosQA.fill(HIST("QA/PID/histnSigma_ITS_TPC_Pt_cross_Pr"), candidate.pt(), candidate.itsNSigmaPr(), candidate.tpcNSigmaPr()); + } + if (cfgOpenPlotAverClus) { + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_cross_Pr"), averClusSizeCosl); + } + if (cfgOpenPlotAverClusP) { + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_cross_Pr"), candidate.p(), averClusSizeCosl); + } + if (cfgOpenPlotAverClusnSigmaTPC) { + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_cross_Pr"), candidate.tpcNSigmaPr(), averClusSizeCosl); + } + if (cfgOpenPlotPhiDis) { + histosQA.fill(HIST("QA/PID/histPhi_Dis_cross_Pr"), candidate.phi()); + } + if (cfgOpenPlotPhiDisPtEta) { + histosQA.fill(HIST("QA/PID/histPhi_Dis_Pt_Eta_cross_Pr"), candidate.phi(), candidate.pt(), candidate.eta()); + } + } } } } @@ -254,21 +409,47 @@ struct FillPIDcolums { } return pid + 1; // shift the pid by 1, 1 = pion, 2 = kaon, 3 = proton } + // Clear the vectors + std::vector().swap(pidVector); + std::vector().swap(pidVectorTOFPt); + std::vector().swap(pidVectorTPCPt); } template bool selectionITS(const T& candidate, int mode, float avgclssize) { - /*int currentPtBin = 0; - for (int i = 0; i < static_cast(cfgPtPIDCut.value.size()) - 1; ++i) { - if (candidate.pt() >= cfgPtPIDCut.value[i] && candidate.pt() < cfgPtPIDCut.value[i + 1]) { - currentPtBin = i; + std::array nSigmaITSToUse; + int currentPtBinPi = -1, currentPtBinKa = -1, currentPtBinPr = -1; + if (cfgOpenPtRangedITSnSigmacutPi) { + for (int i = 0; i < static_cast(cfgPtBinPionPID.value.size()) - 1; ++i) { + if (candidate.pt() >= cfgPtBinPionPID.value[i] && candidate.pt() < cfgPtBinPionPID.value[i + 1]) { + currentPtBinPi = i; break; } - }*/ + } + } + if (cfgOpenPtRangedITSnSigmacutKa) { + for (int i = 0; i < static_cast(cfgPtBinKaonPID.value.size()) - 1; ++i) { + if (candidate.pt() >= cfgPtBinKaonPID.value[i] && candidate.pt() < cfgPtBinKaonPID.value[i + 1]) { + currentPtBinKa = i; + break; + } + } + } + if (cfgOpenPtRangedITSnSigmacutPr) { + for (int i = 0; i < static_cast(cfgPtBinProtonPID.value.size()) - 1; ++i) { + if (candidate.pt() >= cfgPtBinProtonPID.value[i] && candidate.pt() < cfgPtBinProtonPID.value[i + 1]) { + currentPtBinPr = i; + break; + } + } + } + nSigmaITSToUse[0] = (currentPtBinPi == -1) ? cfgnSigmaCutITS.value[0] : cfgnSigmaITSPionPt.value[currentPtBinPi]; + nSigmaITSToUse[1] = (currentPtBinKa == -1) ? cfgnSigmaCutITS.value[1] : cfgnSigmaITSKaonPt.value[currentPtBinKa]; + nSigmaITSToUse[2] = (currentPtBinPr == -1) ? cfgnSigmaCutITS.value[2] : cfgnSigmaITSProtonPt.value[currentPtBinPr]; switch (mode) { case 1: // For Pion - if (!(std::abs(candidate.itsNSigmaPi()) < cfgnSigmaCutITS.value[0] && avgclssize > cfgAveClusSizeCoslMinPi && avgclssize < cfgAveClusSizeCoslMaxPi)) { + if (!(std::abs(candidate.itsNSigmaPi()) < nSigmaITSToUse[0] && avgclssize > cfgAveClusSizeCoslMinPi && avgclssize < cfgAveClusSizeCoslMaxPi)) { return false; } else { return true; @@ -276,7 +457,7 @@ struct FillPIDcolums { break; case 2: // For Kaon - if (!(std::abs(candidate.itsNSigmaKa()) < cfgnSigmaCutITS.value[1] && avgclssize > cfgAveClusSizeCoslMinKa && avgclssize < cfgAveClusSizeCoslMaxKa)) { + if (!(std::abs(candidate.itsNSigmaKa()) < nSigmaITSToUse[1] && avgclssize > cfgAveClusSizeCoslMinKa && avgclssize < cfgAveClusSizeCoslMaxKa)) { return false; } else { return true; @@ -284,7 +465,7 @@ struct FillPIDcolums { break; case 3: // For Proton - if (!(std::abs(candidate.itsNSigmaPr()) < cfgnSigmaCutITS.value[2] && avgclssize > cfgAveClusSizeCoslMinPr && avgclssize < cfgAveClusSizeCoslMaxPr)) { + if (!(std::abs(candidate.itsNSigmaPr()) < nSigmaITSToUse[2] && avgclssize > cfgAveClusSizeCoslMinPr && avgclssize < cfgAveClusSizeCoslMaxPr)) { return false; } else { return true; @@ -307,164 +488,258 @@ struct FillPIDcolums { AxisSpec axisnSigmaCom{cfgnSigmaBinsCom, "hypot(n_{#sigma}TPC,TOF)"}; AxisSpec axisPtPID{cfgaxisptPID, "#it{p}_{T}"}; AxisSpec axisPPID{cfgaxispPID, "#it{p}"}; + AxisSpec axisEtaPID{cfgaxisetaPID, "#it{#eta}"}; AxisSpec axisClusterSize{cfgaxisAverClusterCosl, " x "}; AxisSpec axisClusterSizenSigma{cfgaxisAverClusterCoslnSigma, " x "}; AxisSpec axisPhi = {100, 0, 2.1 * constants::math::PI, "#phi"}; - // TH3D NSigmaTPC,NSigmaTOF,pt - histosQA.add(Form("QA/PID/histnSigma_TPC_TOF_Pi"), "", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaTOF, axisPtPID}}); - histosQA.add(Form("QA/PID/histnSigma_TPC_TOF_Ka"), "", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaTOF, axisPtPID}}); - histosQA.add(Form("QA/PID/histnSigma_TPC_TOF_Pr"), "", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaTOF, axisPtPID}}); - histosQA.add(Form("QA/PID/histnSigma_TPC_TOF_cross_Pi"), "", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaTOF, axisPtPID}}); - histosQA.add(Form("QA/PID/histnSigma_TPC_TOF_cross_Ka"), "", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaTOF, axisPtPID}}); - histosQA.add(Form("QA/PID/histnSigma_TPC_TOF_cross_Pr"), "", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaTOF, axisPtPID}}); - if (cfgOpenITSCut) { - histosQA.add(Form("QA/PID/histnSigma_TPC_TOF_AfterITS_Pi"), "", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaTOF, axisPtPID}}); - histosQA.add(Form("QA/PID/histnSigma_TPC_TOF_AfterITS_Ka"), "", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaTOF, axisPtPID}}); - histosQA.add(Form("QA/PID/histnSigma_TPC_TOF_AfterITS_Pr"), "", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaTOF, axisPtPID}}); - } - // Hist for PID Averge Cluster Size ITS related - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_Pi"), "", {HistType::kTH1F, {axisClusterSize}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_Ka"), "", {HistType::kTH1F, {axisClusterSize}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_Pr"), "", {HistType::kTH1F, {axisClusterSize}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_cross_Pi"), "", {HistType::kTH1F, {axisClusterSize}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_cross_Ka"), "", {HistType::kTH1F, {axisClusterSize}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_cross_Pr"), "", {HistType::kTH1F, {axisClusterSize}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_Pi"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_Ka"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_Pr"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_cross_Pi"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_cross_Ka"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_cross_Pr"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pi"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Ka"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pr"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_cross_Pi"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_cross_Ka"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_cross_Pr"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); - histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_Pi"), "", {HistType::kTH2F, {axisnSigmaTPC, axisnSigmaITS}}); - histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_Ka"), "", {HistType::kTH2F, {axisnSigmaTPC, axisnSigmaITS}}); - histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_Pr"), "", {HistType::kTH2F, {axisnSigmaTPC, axisnSigmaITS}}); - histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_cross_Pi"), "", {HistType::kTH2F, {axisnSigmaTPC, axisnSigmaITS}}); - histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_cross_Ka"), "", {HistType::kTH2F, {axisnSigmaTPC, axisnSigmaITS}}); - histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_cross_Pr"), "", {HistType::kTH2F, {axisnSigmaTPC, axisnSigmaITS}}); - if (cfgOpenITSCut) { - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_AfterITS_Pi"), "", {HistType::kTH1F, {axisClusterSize}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_AfterITS_Ka"), "", {HistType::kTH1F, {axisClusterSize}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_AfterITS_Pr"), "", {HistType::kTH1F, {axisClusterSize}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_AfterITS_Pi"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_AfterITS_Ka"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_AfterITS_Pr"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Pi"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Ka"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Pr"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); - histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Pi"), "", {HistType::kTH2F, {axisnSigmaTPC, axisnSigmaITS}}); - histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Ka"), "", {HistType::kTH2F, {axisnSigmaTPC, axisnSigmaITS}}); - histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Pr"), "", {HistType::kTH2F, {axisnSigmaTPC, axisnSigmaITS}}); - } - // Hist for Nsigma TPC TOF - histosQA.add(Form("QA/PID/histdEdxTPC_All"), "", {HistType::kTH2F, {axisRigidity, axisdEdx}}); - histosQA.add(Form("QA/PID/histdEdxTPC_Pi"), "", {HistType::kTH2F, {axisRigidity, axisdEdx}}); - histosQA.add(Form("QA/PID/histnSigma_TPC_Pi"), "", {HistType::kTH1F, {axisnSigmaTPC}}); - histosQA.add(Form("QA/PID/histnSigma_TPC_Pt_Pi"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); - histosQA.add(Form("QA/PID/histdEdxTPC_Ka"), "", {HistType::kTH2F, {axisRigidity, axisdEdx}}); - histosQA.add(Form("QA/PID/histnSigma_TPC_Ka"), "", {HistType::kTH1F, {axisnSigmaTPC}}); - histosQA.add(Form("QA/PID/histnSigma_TPC_Pt_Ka"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); - histosQA.add(Form("QA/PID/histdEdxTPC_Pr"), "", {HistType::kTH2F, {axisRigidity, axisdEdx}}); - histosQA.add(Form("QA/PID/histnSigma_TPC_Pr"), "", {HistType::kTH1F, {axisnSigmaTPC}}); - histosQA.add(Form("QA/PID/histnSigma_TPC_Pt_Pr"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); - histosQA.add(Form("QA/PID/histnSigma_com_Pi"), "", {HistType::kTH1F, {axisnSigmaCom}}); - histosQA.add(Form("QA/PID/histnSigma_com_Ka"), "", {HistType::kTH1F, {axisnSigmaCom}}); - histosQA.add(Form("QA/PID/histnSigma_com_Pr"), "", {HistType::kTH1F, {axisnSigmaCom}}); - histosQA.add(Form("QA/PID/histnSigma_TOF_Pi"), "", {HistType::kTH1F, {axisnSigmaTOF}}); - histosQA.add(Form("QA/PID/histnSigma_TOF_Ka"), "", {HistType::kTH1F, {axisnSigmaTOF}}); - histosQA.add(Form("QA/PID/histnSigma_TOF_Pr"), "", {HistType::kTH1F, {axisnSigmaTOF}}); - histosQA.add(Form("QA/PID/histnSigma_TOF_cross_Pi"), "", {HistType::kTH1F, {axisnSigmaTOF}}); - histosQA.add(Form("QA/PID/histnSigma_TOF_cross_Ka"), "", {HistType::kTH1F, {axisnSigmaTOF}}); - histosQA.add(Form("QA/PID/histnSigma_TOF_cross_Pr"), "", {HistType::kTH1F, {axisnSigmaTOF}}); - histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_Pi"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); - histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_Ka"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); - histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_Pr"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); - histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_cross_Pi"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); - histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_cross_Ka"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); - histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_cross_Pr"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); - histosQA.add(Form("QA/PID/histdEdxTPC_cross_Pi"), "", {HistType::kTH2F, {axisRigidity, axisdEdx}}); - histosQA.add(Form("QA/PID/histnSigma_cross_Pi"), "", {HistType::kTH1F, {axisnSigmaTPC}}); - histosQA.add(Form("QA/PID/histnSigma_Pt_cross_Pi"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); - histosQA.add(Form("QA/PID/histdEdxTPC_cross_Ka"), "", {HistType::kTH2F, {axisRigidity, axisdEdx}}); - histosQA.add(Form("QA/PID/histnSigma_cross_Ka"), "", {HistType::kTH1F, {axisnSigmaTPC}}); - histosQA.add(Form("QA/PID/histnSigma_Pt_cross_Ka"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); - histosQA.add(Form("QA/PID/histdEdxTPC_cross_Pr"), "", {HistType::kTH2F, {axisRigidity, axisdEdx}}); - histosQA.add(Form("QA/PID/histnSigma_cross_Pr"), "", {HistType::kTH1F, {axisnSigmaTPC}}); - histosQA.add(Form("QA/PID/histnSigma_Pt_cross_Pr"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); - if (cfgOpenITSCut) { - histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_AfterITS_Pi"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); - histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_AfterITS_Ka"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); - histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_AfterITS_Pr"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); - histosQA.add(Form("QA/PID/histnSigma_TPC_Pt_AfterITS_Pi"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); - histosQA.add(Form("QA/PID/histnSigma_TPC_Pt_AfterITS_Ka"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); - histosQA.add(Form("QA/PID/histnSigma_TPC_Pt_AfterITS_Pr"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); - } - // Hist for nSigma ITS - histosQA.add(Form("QA/PID/histnSigma_ITS_Pi"), "", {HistType::kTH1F, {axisnSigmaITS}}); - histosQA.add(Form("QA/PID/histnSigma_ITS_Ka"), "", {HistType::kTH1F, {axisnSigmaITS}}); - histosQA.add(Form("QA/PID/histnSigma_ITS_Pr"), "", {HistType::kTH1F, {axisnSigmaITS}}); - histosQA.add(Form("QA/PID/histnSigma_ITS_cross_Pi"), "", {HistType::kTH1F, {axisnSigmaITS}}); - histosQA.add(Form("QA/PID/histnSigma_ITS_cross_Ka"), "", {HistType::kTH1F, {axisnSigmaITS}}); - histosQA.add(Form("QA/PID/histnSigma_ITS_cross_Pr"), "", {HistType::kTH1F, {axisnSigmaITS}}); - if (cfgOpenITSCut) { - histosQA.add(Form("QA/PID/histnSigma_ITS_AfterITS_Pi"), "", {HistType::kTH1F, {axisnSigmaITS}}); - histosQA.add(Form("QA/PID/histnSigma_ITS_AfterITS_Ka"), "", {HistType::kTH1F, {axisnSigmaITS}}); - histosQA.add(Form("QA/PID/histnSigma_ITS_AfterITS_Pr"), "", {HistType::kTH1F, {axisnSigmaITS}}); - } - // Hist for checking the PID phi distribution - histosQA.add(Form("QA/PID/histPhi_Dis_Pi"), "", {HistType::kTH1F, {axisPhi}}); - histosQA.add(Form("QA/PID/histPhi_Dis_Ka"), "", {HistType::kTH1F, {axisPhi}}); - histosQA.add(Form("QA/PID/histPhi_Dis_Pr"), "", {HistType::kTH1F, {axisPhi}}); - histosQA.add(Form("QA/PID/histPhi_Dis_cross_Pi"), "", {HistType::kTH1F, {axisPhi}}); - histosQA.add(Form("QA/PID/histPhi_Dis_cross_Ka"), "", {HistType::kTH1F, {axisPhi}}); - histosQA.add(Form("QA/PID/histPhi_Dis_cross_Pr"), "", {HistType::kTH1F, {axisPhi}}); - if (cfgOpenITSCut) { - histosQA.add(Form("QA/PID/histPhi_Dis_AfterITS_Pi"), "", {HistType::kTH1F, {axisPhi}}); - histosQA.add(Form("QA/PID/histPhi_Dis_AfterITS_Ka"), "", {HistType::kTH1F, {axisPhi}}); - histosQA.add(Form("QA/PID/histPhi_Dis_AfterITS_Pr"), "", {HistType::kTH1F, {axisPhi}}); - } - // Hist 3D for PID check - if (cfgOpenDetailPlots) { - histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosPi_Before"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); - histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosKa_Before"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); - histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosPr_Before"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); - histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegPi_Before"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); - histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegKa_Before"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); - histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegPr_Before"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPi_Before"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosKa_Before"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPr_Before"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPi_Before"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegKa_Before"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPr_Before"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); + if (!cfgQuietMode) { + // TH3D NSigmaTPC,NSigmaTOF,NSigmaITS combo vs pt(if necessary for whole centrality) + if (cfgOpenPlotnSigmaTOFITSPt) { + histosQA.add(Form("QA/PID/histnSigma_TOF_ITS_Pt_Pi"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaITS, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_ITS_Pt_Ka"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaITS, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_ITS_Pt_Pr"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaITS, axisPtPID}}); + if (cfgOpenCrossTrackQAPlots) { + histosQA.add(Form("QA/PID/histnSigma_TOF_ITS_Pt_cross_Pi"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaITS, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_ITS_Pt_cross_Ka"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaITS, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_ITS_Pt_cross_Pr"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaITS, axisPtPID}}); + } + if (cfgOpenITSCut) { + histosQA.add(Form("QA/PID/histnSigma_TOF_ITS_Pt_AfterITS_Pi"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaITS, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_ITS_Pt_AfterITS_Ka"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaITS, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_ITS_Pt_AfterITS_Pr"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaITS, axisPtPID}}); + } + } + if (cfgOpenPlotnSigmaTOFTPCPt) { + histosQA.add(Form("QA/PID/histnSigma_TOF_TPC_Pt_Pi"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaTPC, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_TPC_Pt_Ka"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaTPC, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_TPC_Pt_Pr"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaTPC, axisPtPID}}); + if (cfgOpenCrossTrackQAPlots) { + histosQA.add(Form("QA/PID/histnSigma_TOF_TPC_Pt_cross_Pi"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaTPC, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_TPC_Pt_cross_Ka"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaTPC, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_TPC_Pt_cross_Pr"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaTPC, axisPtPID}}); + } + if (cfgOpenITSCut) { + histosQA.add(Form("QA/PID/histnSigma_TOF_TPC_Pt_AfterITS_Pi"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaTPC, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_TPC_Pt_AfterITS_Ka"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaTPC, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_TPC_Pt_AfterITS_Pr"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaTPC, axisPtPID}}); + } + } + if (cfgOpenPlotnSigmaITSTPCPt) { + histosQA.add(Form("QA/PID/histnSigma_ITS_TPC_Pt_Pi"), "", {HistType::kTH3F, {axisnSigmaITS, axisnSigmaTPC, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigma_ITS_TPC_Pt_Ka"), "", {HistType::kTH3F, {axisnSigmaITS, axisnSigmaTPC, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigma_ITS_TPC_Pt_Pr"), "", {HistType::kTH3F, {axisnSigmaITS, axisnSigmaTPC, axisPtPID}}); + if (cfgOpenCrossTrackQAPlots) { + histosQA.add(Form("QA/PID/histnSigma_ITS_TPC_Pt_cross_Pi"), "", {HistType::kTH3F, {axisnSigmaITS, axisnSigmaTPC, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigma_ITS_TPC_Pt_cross_Ka"), "", {HistType::kTH3F, {axisnSigmaITS, axisnSigmaTPC, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigma_ITS_TPC_Pt_cross_Pr"), "", {HistType::kTH3F, {axisnSigmaITS, axisnSigmaTPC, axisPtPID}}); + } + if (cfgOpenITSCut) { + histosQA.add(Form("QA/PID/histnSigma_ITS_TPC_Pt_AfterITS_Pi"), "", {HistType::kTH3F, {axisnSigmaITS, axisnSigmaTPC, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigma_ITS_TPC_Pt_AfterITS_Ka"), "", {HistType::kTH3F, {axisnSigmaITS, axisnSigmaTPC, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigma_ITS_TPC_Pt_AfterITS_Pr"), "", {HistType::kTH3F, {axisnSigmaITS, axisnSigmaTPC, axisPtPID}}); + } + } + if (cfgOpenPlotAverClus) { + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_Pi"), "", {HistType::kTH1F, {axisClusterSize}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_Ka"), "", {HistType::kTH1F, {axisClusterSize}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_Pr"), "", {HistType::kTH1F, {axisClusterSize}}); + if (cfgOpenCrossTrackQAPlots) { + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_cross_Pi"), "", {HistType::kTH1F, {axisClusterSize}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_cross_Ka"), "", {HistType::kTH1F, {axisClusterSize}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_cross_Pr"), "", {HistType::kTH1F, {axisClusterSize}}); + } + if (cfgOpenITSCut) { + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_AfterITS_Pi"), "", {HistType::kTH1F, {axisClusterSize}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_AfterITS_Ka"), "", {HistType::kTH1F, {axisClusterSize}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_AfterITS_Pr"), "", {HistType::kTH1F, {axisClusterSize}}); + } + } + if (cfgOpenPlotAverClusP) { + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_Pi"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_Ka"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_Pr"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); + if (cfgOpenCrossTrackQAPlots) { + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_cross_Pi"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_cross_Ka"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_cross_Pr"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); + } + if (cfgOpenITSCut) { + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_AfterITS_Pi"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_AfterITS_Ka"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_AfterITS_Pr"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); + } + } + if (cfgOpenPlotAverClusnSigmaTPC) { + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pi"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Ka"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pr"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); + if (cfgOpenCrossTrackQAPlots) { + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_cross_Pi"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_cross_Ka"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_cross_Pr"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); + } + if (cfgOpenITSCut) { + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Pi"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Ka"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Pr"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); + } + } + if (cfgOpenPlotPhiDis) { + histosQA.add(Form("QA/PID/histPhi_Dis_Pi"), "", {HistType::kTH1F, {axisPhi}}); + histosQA.add(Form("QA/PID/histPhi_Dis_Ka"), "", {HistType::kTH1F, {axisPhi}}); + histosQA.add(Form("QA/PID/histPhi_Dis_Pr"), "", {HistType::kTH1F, {axisPhi}}); + if (cfgOpenCrossTrackQAPlots) { + histosQA.add(Form("QA/PID/histPhi_Dis_cross_Pi"), "", {HistType::kTH1F, {axisPhi}}); + histosQA.add(Form("QA/PID/histPhi_Dis_cross_Ka"), "", {HistType::kTH1F, {axisPhi}}); + histosQA.add(Form("QA/PID/histPhi_Dis_cross_Pr"), "", {HistType::kTH1F, {axisPhi}}); + } + if (cfgOpenITSCut) { + histosQA.add(Form("QA/PID/histPhi_Dis_AfterITS_Pi"), "", {HistType::kTH1F, {axisPhi}}); + histosQA.add(Form("QA/PID/histPhi_Dis_AfterITS_Ka"), "", {HistType::kTH1F, {axisPhi}}); + histosQA.add(Form("QA/PID/histPhi_Dis_AfterITS_Pr"), "", {HistType::kTH1F, {axisPhi}}); + } + } + if (cfgOpenPlotPhiDisPtEta) { + histosQA.add(Form("QA/PID/histPhi_Dis_Pt_Eta_Pi"), "", {HistType::kTH3F, {axisPhi, axisPtPID, axisEtaPID}}); + histosQA.add(Form("QA/PID/histPhi_Dis_Pt_Eta_Ka"), "", {HistType::kTH3F, {axisPhi, axisPtPID, axisEtaPID}}); + histosQA.add(Form("QA/PID/histPhi_Dis_Pt_Eta_Pr"), "", {HistType::kTH3F, {axisPhi, axisPtPID, axisEtaPID}}); + if (cfgOpenCrossTrackQAPlots) { + histosQA.add(Form("QA/PID/histPhi_Dis_Pt_Eta_cross_Pi"), "", {HistType::kTH3F, {axisPhi, axisPtPID, axisEtaPID}}); + histosQA.add(Form("QA/PID/histPhi_Dis_Pt_Eta_cross_Ka"), "", {HistType::kTH3F, {axisPhi, axisPtPID, axisEtaPID}}); + histosQA.add(Form("QA/PID/histPhi_Dis_Pt_Eta_cross_Pr"), "", {HistType::kTH3F, {axisPhi, axisPtPID, axisEtaPID}}); + } + if (cfgOpenITSCut) { + histosQA.add(Form("QA/PID/histPhi_Dis_Pt_Eta_AfterITS_Pi"), "", {HistType::kTH3F, {axisPhi, axisPtPID, axisEtaPID}}); + histosQA.add(Form("QA/PID/histPhi_Dis_Pt_Eta_AfterITS_Ka"), "", {HistType::kTH3F, {axisPhi, axisPtPID, axisEtaPID}}); + histosQA.add(Form("QA/PID/histPhi_Dis_Pt_Eta_AfterITS_Pr"), "", {HistType::kTH3F, {axisPhi, axisPtPID, axisEtaPID}}); + } + } + // some basic plots should be ploted (except for the quite mode) + // nSigma TPC TOF ITS combo plots + histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_Pi"), "", {HistType::kTH2F, {axisnSigmaITS, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_Ka"), "", {HistType::kTH2F, {axisnSigmaITS, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_Pr"), "", {HistType::kTH2F, {axisnSigmaITS, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigmaTOF_nSigmaITS_Pi"), "", {HistType::kTH2F, {axisnSigmaTOF, axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigmaTOF_nSigmaITS_Ka"), "", {HistType::kTH2F, {axisnSigmaTOF, axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigmaTOF_nSigmaITS_Pr"), "", {HistType::kTH2F, {axisnSigmaTOF, axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigmaTOF_nSigmaTPC_Pi"), "", {HistType::kTH2F, {axisnSigmaTOF, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigmaTOF_nSigmaTPC_Ka"), "", {HistType::kTH2F, {axisnSigmaTOF, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigmaTOF_nSigmaTPC_Pr"), "", {HistType::kTH2F, {axisnSigmaTOF, axisnSigmaTPC}}); + if (cfgOpenCrossTrackQAPlots) { + histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_cross_Pi"), "", {HistType::kTH2F, {axisnSigmaITS, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_cross_Ka"), "", {HistType::kTH2F, {axisnSigmaITS, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_cross_Pr"), "", {HistType::kTH2F, {axisnSigmaITS, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigmaTOF_nSigmaITS_cross_Pi"), "", {HistType::kTH2F, {axisnSigmaTOF, axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigmaTOF_nSigmaITS_cross_Ka"), "", {HistType::kTH2F, {axisnSigmaTOF, axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigmaTOF_nSigmaITS_cross_Pr"), "", {HistType::kTH2F, {axisnSigmaTOF, axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigmaTOF_nSigmaTPC_cross_Pi"), "", {HistType::kTH2F, {axisnSigmaTOF, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigmaTOF_nSigmaTPC_cross_Ka"), "", {HistType::kTH2F, {axisnSigmaTOF, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigmaTOF_nSigmaTPC_cross_Pr"), "", {HistType::kTH2F, {axisnSigmaTOF, axisnSigmaTPC}}); + } if (cfgOpenITSCut) { - histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosPi_After"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); - histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosKa_After"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); - histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosPr_After"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); - histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegPi_After"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); - histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegKa_After"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); - histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegPr_After"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPi_After"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosKa_After"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPr_After"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPi_After"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegKa_After"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); - histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPr_After"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); - histosQA.add(Form("QA/PID/histPhi_Pt_Eta_PosPi"), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhi, axisPtPID, cfgaxisetaPID}}); - histosQA.add(Form("QA/PID/histPhi_Pt_Eta_NegPi"), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhi, axisPtPID, cfgaxisetaPID}}); - histosQA.add(Form("QA/PID/histPhi_Pt_Eta_PosKa"), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhi, axisPtPID, cfgaxisetaPID}}); - histosQA.add(Form("QA/PID/histPhi_Pt_Eta_NegKa"), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhi, axisPtPID, cfgaxisetaPID}}); - histosQA.add(Form("QA/PID/histPhi_Pt_Eta_PosPr"), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhi, axisPtPID, cfgaxisetaPID}}); - histosQA.add(Form("QA/PID/histPhi_Pt_Eta_NegPr"), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhi, axisPtPID, cfgaxisetaPID}}); + histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Pi"), "", {HistType::kTH2F, {axisnSigmaITS, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Ka"), "", {HistType::kTH2F, {axisnSigmaITS, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Pr"), "", {HistType::kTH2F, {axisnSigmaITS, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigmaTOF_nSigmaITS_AfterITS_Pi"), "", {HistType::kTH2F, {axisnSigmaTOF, axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigmaTOF_nSigmaITS_AfterITS_Ka"), "", {HistType::kTH2F, {axisnSigmaTOF, axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigmaTOF_nSigmaITS_AfterITS_Pr"), "", {HistType::kTH2F, {axisnSigmaTOF, axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigmaTOF_nSigmaTPC_AfterITS_Pi"), "", {HistType::kTH2F, {axisnSigmaTOF, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigmaTOF_nSigmaTPC_AfterITS_Ka"), "", {HistType::kTH2F, {axisnSigmaTOF, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigmaTOF_nSigmaTPC_AfterITS_Pr"), "", {HistType::kTH2F, {axisnSigmaTOF, axisnSigmaTPC}}); + } + // nSigma TPC TOF ITS signle and some simple QA plots + histosQA.add(Form("QA/PID/histdEdxTPC_All"), "", {HistType::kTH2F, {axisRigidity, axisdEdx}}); + histosQA.add(Form("QA/PID/histdEdxTPC_Pi"), "", {HistType::kTH2F, {axisRigidity, axisdEdx}}); + histosQA.add(Form("QA/PID/histdEdxTPC_Ka"), "", {HistType::kTH2F, {axisRigidity, axisdEdx}}); + histosQA.add(Form("QA/PID/histdEdxTPC_Pr"), "", {HistType::kTH2F, {axisRigidity, axisdEdx}}); + histosQA.add(Form("QA/PID/histnSigma_TPC_Pi"), "", {HistType::kTH1F, {axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_TPC_Ka"), "", {HistType::kTH1F, {axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_TPC_Pr"), "", {HistType::kTH1F, {axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_TPC_Pt_Pi"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_TPC_Pt_Ka"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_TPC_Pt_Pr"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_com_Pi"), "", {HistType::kTH1F, {axisnSigmaCom}}); + histosQA.add(Form("QA/PID/histnSigma_com_Ka"), "", {HistType::kTH1F, {axisnSigmaCom}}); + histosQA.add(Form("QA/PID/histnSigma_com_Pr"), "", {HistType::kTH1F, {axisnSigmaCom}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_Pi"), "", {HistType::kTH1F, {axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_Ka"), "", {HistType::kTH1F, {axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_Pr"), "", {HistType::kTH1F, {axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_Pi"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_Ka"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_Pr"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_ITS_Pi"), "", {HistType::kTH1F, {axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigma_ITS_Ka"), "", {HistType::kTH1F, {axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigma_ITS_Pr"), "", {HistType::kTH1F, {axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigma_ITS_Pt_Pi"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigma_ITS_Pt_Ka"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigma_ITS_Pt_Pr"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaITS}}); + if (cfgOpenCrossTrackQAPlots) { + histosQA.add(Form("QA/PID/histdEdxTPC_cross_Pi"), "", {HistType::kTH2F, {axisRigidity, axisdEdx}}); + histosQA.add(Form("QA/PID/histdEdxTPC_cross_Ka"), "", {HistType::kTH2F, {axisRigidity, axisdEdx}}); + histosQA.add(Form("QA/PID/histdEdxTPC_cross_Pr"), "", {HistType::kTH2F, {axisRigidity, axisdEdx}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_cross_Pi"), "", {HistType::kTH1F, {axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_cross_Ka"), "", {HistType::kTH1F, {axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_cross_Pr"), "", {HistType::kTH1F, {axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_cross_Pi"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_cross_Ka"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_cross_Pr"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_cross_Pi"), "", {HistType::kTH1F, {axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_cross_Ka"), "", {HistType::kTH1F, {axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_cross_Pr"), "", {HistType::kTH1F, {axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_Pt_cross_Pi"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_Pt_cross_Ka"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_Pt_cross_Pr"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_ITS_cross_Pi"), "", {HistType::kTH1F, {axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigma_ITS_cross_Ka"), "", {HistType::kTH1F, {axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigma_ITS_cross_Pr"), "", {HistType::kTH1F, {axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigma_ITS_Pt_cross_Pi"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigma_ITS_Pt_cross_Ka"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigma_ITS_Pt_cross_Pr"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaITS}}); + } + if (cfgOpenITSCut) { + histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_AfterITS_Pi"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_AfterITS_Ka"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_AfterITS_Pr"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_TPC_Pt_AfterITS_Pi"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_TPC_Pt_AfterITS_Ka"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_TPC_Pt_AfterITS_Pr"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_ITS_Pt_AfterITS_Pi"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigma_ITS_Pt_AfterITS_Ka"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigma_ITS_Pt_AfterITS_Pr"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaITS}}); + } + // plots for TPC-ITS contamination (whole centrality) + if (cfgOpenDetailPlotsTPCITSContaimination) { + histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosPi_Before"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosKa_Before"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosPr_Before"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegPi_Before"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegKa_Before"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegPr_Before"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_PosPi_Before"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_PosKa_Before"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_PosPr_Before"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_NegPi_Before"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_NegKa_Before"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_NegPr_Before"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); + if (cfgOpenITSCut) { + histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosPi_After"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosKa_After"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosPr_After"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegPi_After"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegKa_After"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegPr_After"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPi_After"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosKa_After"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPr_After"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPi_After"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegKa_After"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); + histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPr_After"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); + } } } } Produces pidCmeTable; + Produces pidInfoTable; void process(TracksPID const& tracks) { auto tracksWithITSPid = soa::Attach 0) { - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosPi_Before"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPi_Before"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); - } else if (track.sign() < 0) { - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegPi_Before"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPi_Before"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); + // First fill ITS uncut plots + if (!cfgQuietMode) { + if ((pidFlag == 1) || (pidFlag == 7) || (pidFlag == 8) || (pidFlag == 10)) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_Pi"), track.itsNSigmaPi(), track.tpcNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaITS_Pi"), track.tofNSigmaPi(), track.itsNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaTPC_Pi"), track.tofNSigmaPi(), track.tpcNSigmaPi()); + histosQA.fill(HIST("QA/PID/histdEdxTPC_Pi"), track.sign() * track.tpcInnerParam(), track.tpcSignal()); + histosQA.fill(HIST("QA/PID/histnSigma_TPC_Pi"), track.tpcNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_TPC_Pt_Pi"), track.pt(), track.tpcNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_com_Pi"), std::hypot(track.tpcNSigmaPi(), track.tofNSigmaPi())); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pi"), track.tofNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_Pi"), track.pt(), track.tofNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pi"), track.itsNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pt_Pi"), track.pt(), track.itsNSigmaPi()); + if (cfgOpenPlotnSigmaTOFITSPt) { + histosQA.fill(HIST("QA/PID/histnSigma_TOF_ITS_Pt_Pi"), track.tofNSigmaPi(), track.itsNSigmaPi(), track.pt()); + } + if (cfgOpenPlotnSigmaTOFTPCPt) { + histosQA.fill(HIST("QA/PID/histnSigma_TOF_TPC_Pt_Pi"), track.tofNSigmaPi(), track.tpcNSigmaPi(), track.pt()); + } + if (cfgOpenPlotnSigmaITSTPCPt) { + histosQA.fill(HIST("QA/PID/histnSigma_ITS_TPC_Pt_Pi"), track.itsNSigmaPi(), track.tpcNSigmaPi(), track.pt()); + } + if (cfgOpenPlotAverClus) { + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_Pi"), averClusSizeCosl); + } + if (cfgOpenPlotAverClusP) { + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_Pi"), track.p(), averClusSizeCosl); + } + if (cfgOpenPlotAverClusnSigmaTPC) { + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pi"), track.tpcNSigmaPi(), averClusSizeCosl); + } + if (cfgOpenPlotPhiDis) { + histosQA.fill(HIST("QA/PID/histPhi_Dis_Pi"), track.phi()); + } + if (cfgOpenPlotPhiDisPtEta) { + histosQA.fill(HIST("QA/PID/histPhi_Dis_Pt_Eta_Pi"), track.phi(), track.pt(), track.eta()); + } + if (cfgOpenDetailPlotsTPCITSContaimination) { + if (track.sign() > 0) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosPi_Before"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_PosPi_Before"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); + } else if (track.sign() < 0) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegPi_Before"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_NegPi_Before"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); + } } } - } - if ((pidFlag == 2) || (pidFlag == 7) || (pidFlag == 9) || (pidFlag == 10)) { - histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_Ka"), track.tpcNSigmaKa(), track.tofNSigmaKa(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_Ka"), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_Ka"), track.p(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Ka"), track.tpcNSigmaKa(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_Ka"), track.tpcNSigmaKa(), track.itsNSigmaKa()); - histosQA.fill(HIST("QA/PID/histdEdxTPC_Ka"), track.sign() * track.tpcInnerParam(), track.tpcSignal()); - histosQA.fill(HIST("QA/PID/histnSigma_TPC_Ka"), track.tpcNSigmaKa()); - histosQA.fill(HIST("QA/PID/histnSigma_TPC_Pt_Ka"), track.pt(), track.tpcNSigmaKa()); - histosQA.fill(HIST("QA/PID/histnSigma_com_Ka"), std::hypot(track.tpcNSigmaKa(), track.tofNSigmaKa())); - histosQA.fill(HIST("QA/PID/histnSigma_TOF_Ka"), track.tofNSigmaKa()); - histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_Ka"), track.pt(), track.tofNSigmaKa()); - histosQA.fill(HIST("QA/PID/histnSigma_ITS_Ka"), track.itsNSigmaKa()); - histosQA.fill(HIST("QA/PID/histPhi_Dis_Ka"), track.phi()); - if (cfgOpenDetailPlots) { - if (track.sign() > 0) { - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosKa_Before"), track.tpcNSigmaKa(), track.itsNSigmaKa(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosKa_Before"), track.tpcNSigmaKa(), averClusSizeCosl, track.pt()); - } else if (track.sign() < 0) { - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegKa_Before"), track.tpcNSigmaKa(), track.itsNSigmaKa(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegKa_Before"), track.tpcNSigmaKa(), averClusSizeCosl, track.pt()); + if ((pidFlag == 2) || (pidFlag == 7) || (pidFlag == 9) || (pidFlag == 10)) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_Ka"), track.itsNSigmaKa(), track.tpcNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaITS_Ka"), track.tofNSigmaKa(), track.itsNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaTPC_Ka"), track.tofNSigmaKa(), track.tpcNSigmaKa()); + histosQA.fill(HIST("QA/PID/histdEdxTPC_Ka"), track.sign() * track.tpcInnerParam(), track.tpcSignal()); + histosQA.fill(HIST("QA/PID/histnSigma_TPC_Ka"), track.tpcNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_TPC_Pt_Ka"), track.pt(), track.tpcNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_com_Ka"), std::hypot(track.tpcNSigmaKa(), track.tofNSigmaKa())); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_Ka"), track.tofNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_Ka"), track.pt(), track.tofNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_Ka"), track.itsNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pt_Ka"), track.pt(), track.itsNSigmaKa()); + if (cfgOpenPlotnSigmaTOFITSPt) { + histosQA.fill(HIST("QA/PID/histnSigma_TOF_ITS_Pt_Ka"), track.tofNSigmaKa(), track.itsNSigmaKa(), track.pt()); + } + if (cfgOpenPlotnSigmaTOFTPCPt) { + histosQA.fill(HIST("QA/PID/histnSigma_TOF_TPC_Pt_Ka"), track.tofNSigmaKa(), track.tpcNSigmaKa(), track.pt()); + } + if (cfgOpenPlotnSigmaITSTPCPt) { + histosQA.fill(HIST("QA/PID/histnSigma_ITS_TPC_Pt_Ka"), track.itsNSigmaKa(), track.tpcNSigmaKa(), track.pt()); + } + if (cfgOpenPlotAverClus) { + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_Ka"), averClusSizeCosl); + } + if (cfgOpenPlotAverClusP) { + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_Ka"), track.p(), averClusSizeCosl); + } + if (cfgOpenPlotAverClusnSigmaTPC) { + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Ka"), track.tpcNSigmaKa(), averClusSizeCosl); + } + if (cfgOpenPlotPhiDis) { + histosQA.fill(HIST("QA/PID/histPhi_Dis_Ka"), track.phi()); + } + if (cfgOpenPlotPhiDisPtEta) { + histosQA.fill(HIST("QA/PID/histPhi_Dis_Pt_Eta_Ka"), track.phi(), track.pt(), track.eta()); + } + if (cfgOpenDetailPlotsTPCITSContaimination) { + if (track.sign() > 0) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosKa_Before"), track.tpcNSigmaKa(), track.itsNSigmaKa(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_PosKa_Before"), track.tpcNSigmaKa(), averClusSizeCosl, track.pt()); + } else if (track.sign() < 0) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegKa_Before"), track.tpcNSigmaKa(), track.itsNSigmaKa(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_NegKa_Before"), track.tpcNSigmaKa(), averClusSizeCosl, track.pt()); + } } } - } - if ((pidFlag == 3) || (pidFlag == 8) || (pidFlag == 9) || (pidFlag == 10)) { - histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_Pr"), track.tpcNSigmaPr(), track.tofNSigmaPr(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_Pr"), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_Pr"), track.p(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pr"), track.tpcNSigmaPr(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_Pr"), track.tpcNSigmaPr(), track.itsNSigmaPr()); - histosQA.fill(HIST("QA/PID/histdEdxTPC_Pr"), track.sign() * track.tpcInnerParam(), track.tpcSignal()); - histosQA.fill(HIST("QA/PID/histnSigma_TPC_Pr"), track.tpcNSigmaPr()); - histosQA.fill(HIST("QA/PID/histnSigma_TPC_Pt_Pr"), track.pt(), track.tpcNSigmaPr()); - histosQA.fill(HIST("QA/PID/histnSigma_com_Pr"), std::hypot(track.tpcNSigmaPr(), track.tofNSigmaPr())); - histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pr"), track.tofNSigmaPr()); - histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_Pr"), track.pt(), track.tofNSigmaPr()); - histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pr"), track.itsNSigmaPr()); - histosQA.fill(HIST("QA/PID/histPhi_Dis_Pr"), track.phi()); - if (cfgOpenDetailPlots) { - if (track.sign() > 0) { - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosPr_Before"), track.tpcNSigmaPr(), track.itsNSigmaPr(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPr_Before"), track.tpcNSigmaPr(), averClusSizeCosl, track.pt()); - } else if (track.sign() < 0) { - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegPr_Before"), track.tpcNSigmaPr(), track.itsNSigmaPr(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPr_Before"), track.tpcNSigmaPr(), averClusSizeCosl, track.pt()); + if ((pidFlag == 3) || (pidFlag == 8) || (pidFlag == 9) || (pidFlag == 10)) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_Pr"), track.itsNSigmaPr(), track.tpcNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaITS_Pr"), track.tofNSigmaPr(), track.itsNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaTPC_Pr"), track.tofNSigmaPr(), track.tpcNSigmaPr()); + histosQA.fill(HIST("QA/PID/histdEdxTPC_Pr"), track.sign() * track.tpcInnerParam(), track.tpcSignal()); + histosQA.fill(HIST("QA/PID/histnSigma_TPC_Pr"), track.tpcNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_TPC_Pt_Pr"), track.pt(), track.tpcNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_com_Pr"), std::hypot(track.tpcNSigmaPr(), track.tofNSigmaPr())); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pr"), track.tofNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_Pr"), track.pt(), track.tofNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pr"), track.itsNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pt_Pr"), track.pt(), track.itsNSigmaPr()); + if (cfgOpenPlotnSigmaTOFITSPt) { + histosQA.fill(HIST("QA/PID/histnSigma_TOF_ITS_Pt_Pr"), track.tofNSigmaPr(), track.itsNSigmaPr(), track.pt()); + } + if (cfgOpenPlotnSigmaTOFTPCPt) { + histosQA.fill(HIST("QA/PID/histnSigma_TOF_TPC_Pt_Pr"), track.tofNSigmaPr(), track.tpcNSigmaPr(), track.pt()); + } + if (cfgOpenPlotnSigmaITSTPCPt) { + histosQA.fill(HIST("QA/PID/histnSigma_ITS_TPC_Pt_Pr"), track.itsNSigmaPr(), track.tpcNSigmaPr(), track.pt()); + } + if (cfgOpenPlotAverClus) { + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_Pr"), averClusSizeCosl); + } + if (cfgOpenPlotAverClusP) { + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_Pr"), track.p(), averClusSizeCosl); + } + if (cfgOpenPlotAverClusnSigmaTPC) { + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pr"), track.tpcNSigmaPr(), averClusSizeCosl); + } + if (cfgOpenPlotPhiDis) { + histosQA.fill(HIST("QA/PID/histPhi_Dis_Pr"), track.phi()); + } + if (cfgOpenPlotPhiDisPtEta) { + histosQA.fill(HIST("QA/PID/histPhi_Dis_Pt_Eta_Pr"), track.phi(), track.pt(), track.eta()); + } + if (cfgOpenDetailPlotsTPCITSContaimination) { + if (track.sign() > 0) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosPr_Before"), track.tpcNSigmaPr(), track.itsNSigmaPr(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_PosPr_Before"), track.tpcNSigmaPr(), averClusSizeCosl, track.pt()); + } else if (track.sign() < 0) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegPr_Before"), track.tpcNSigmaPr(), track.itsNSigmaPr(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_NegPr_Before"), track.tpcNSigmaPr(), averClusSizeCosl, track.pt()); + } } } } @@ -656,76 +1001,136 @@ struct FillPIDcolums { } // Third Fill ITS cut plots if (cfgOpenITSCut) { - if ((pidFlag == 1) || (pidFlag == 7) || (pidFlag == 8) || (pidFlag == 10)) { - histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_AfterITS_Pi"), track.tpcNSigmaPi(), track.tofNSigmaPi(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_AfterITS_Pi"), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_AfterITS_Pi"), track.p(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Pi"), track.tpcNSigmaPi(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Pi"), track.tpcNSigmaPi(), track.itsNSigmaPi()); - histosQA.fill(HIST("QA/PID/histnSigma_ITS_AfterITS_Pi"), track.itsNSigmaPi()); - histosQA.fill(HIST("QA/PID/histPhi_Dis_AfterITS_Pi"), track.phi()); - histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_AfterITS_Pi"), track.pt(), track.tofNSigmaPi()); - histosQA.fill(HIST("QA/PID/histnSigma_TPC_Pt_AfterITS_Pi"), track.pt(), track.tpcNSigmaPi()); - if (cfgOpenDetailPlots) { - if (track.sign() > 0) { - histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_PosPi"), track.phi(), track.pt(), track.eta()); - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosPi_After"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPi_After"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); - } else if (track.sign() < 0) { - histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_NegPi"), track.phi(), track.pt(), track.eta()); - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegPi_After"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPi_After"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); + if (!cfgQuietMode) { + if ((pidFlag == 1) || (pidFlag == 7) || (pidFlag == 8) || (pidFlag == 10)) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Pi"), track.itsNSigmaPi(), track.tpcNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaITS_AfterITS_Pi"), track.tofNSigmaPi(), track.itsNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaTPC_AfterITS_Pi"), track.tofNSigmaPi(), track.tpcNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_TPC_Pt_AfterITS_Pi"), track.pt(), track.tpcNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_AfterITS_Pi"), track.pt(), track.tofNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pt_AfterITS_Pi"), track.pt(), track.itsNSigmaPi()); + if (cfgOpenPlotnSigmaTOFITSPt) { + histosQA.fill(HIST("QA/PID/histnSigma_TOF_ITS_Pt_AfterITS_Pi"), track.tofNSigmaPi(), track.itsNSigmaPi(), track.pt()); + } + if (cfgOpenPlotnSigmaTOFTPCPt) { + histosQA.fill(HIST("QA/PID/histnSigma_TOF_TPC_Pt_AfterITS_Pi"), track.tofNSigmaPi(), track.tpcNSigmaPi(), track.pt()); + } + if (cfgOpenPlotnSigmaITSTPCPt) { + histosQA.fill(HIST("QA/PID/histnSigma_ITS_TPC_Pt_AfterITS_Pi"), track.itsNSigmaPi(), track.tpcNSigmaPi(), track.pt()); + } + if (cfgOpenPlotAverClus) { + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_AfterITS_Pi"), averClusSizeCosl); + } + if (cfgOpenPlotAverClusP) { + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_AfterITS_Pi"), track.p(), averClusSizeCosl); + } + if (cfgOpenPlotAverClusnSigmaTPC) { + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Pi"), track.tpcNSigmaPi(), averClusSizeCosl); + } + if (cfgOpenPlotPhiDis) { + histosQA.fill(HIST("QA/PID/histPhi_Dis_AfterITS_Pi"), track.phi()); + } + if (cfgOpenPlotPhiDisPtEta) { + histosQA.fill(HIST("QA/PID/histPhi_Dis_Pt_Eta_AfterITS_Pi"), track.phi(), track.pt(), track.eta()); + } + if (cfgOpenDetailPlotsTPCITSContaimination) { + if (track.sign() > 0) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosPi_After"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_PosPi_After"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); + } else if (track.sign() < 0) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegPi_After"), track.tpcNSigmaPi(), track.itsNSigmaPi(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_NegPi_After"), track.tpcNSigmaPi(), averClusSizeCosl, track.pt()); + } } } - } - if ((pidFlag == 2) || (pidFlag == 7) || (pidFlag == 9) || (pidFlag == 10)) { - histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_AfterITS_Ka"), track.tpcNSigmaKa(), track.tofNSigmaKa(), track.pt()); - histosQA.fill(HIST("QA/PID/histnSigma_ITS_AfterITS_Ka"), track.itsNSigmaKa()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_AfterITS_Ka"), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_AfterITS_Ka"), track.p(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Ka"), track.tpcNSigmaKa(), track.itsNSigmaKa()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Ka"), track.tpcNSigmaKa(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histPhi_Dis_AfterITS_Ka"), track.phi()); - histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_AfterITS_Ka"), track.pt(), track.tofNSigmaKa()); - histosQA.fill(HIST("QA/PID/histnSigma_TPC_Pt_AfterITS_Ka"), track.pt(), track.tpcNSigmaKa()); - if (cfgOpenDetailPlots) { - if (track.sign() > 0) { - histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_PosKa"), track.phi(), track.pt(), track.eta()); - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosKa_After"), track.tpcNSigmaKa(), track.itsNSigmaKa(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosKa_After"), track.tpcNSigmaKa(), averClusSizeCosl, track.pt()); - } else if (track.sign() < 0) { - histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_NegKa"), track.phi(), track.pt(), track.eta()); - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegKa_After"), track.tpcNSigmaKa(), track.itsNSigmaKa(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegKa_After"), track.tpcNSigmaKa(), averClusSizeCosl, track.pt()); + if ((pidFlag == 2) || (pidFlag == 7) || (pidFlag == 9) || (pidFlag == 10)) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Ka"), track.itsNSigmaKa(), track.tpcNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaITS_AfterITS_Ka"), track.tofNSigmaKa(), track.itsNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaTPC_AfterITS_Ka"), track.tofNSigmaKa(), track.tpcNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_TPC_Pt_AfterITS_Ka"), track.pt(), track.tpcNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_AfterITS_Ka"), track.pt(), track.tofNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pt_AfterITS_Ka"), track.pt(), track.itsNSigmaKa()); + if (cfgOpenPlotnSigmaTOFITSPt) { + histosQA.fill(HIST("QA/PID/histnSigma_TOF_ITS_Pt_AfterITS_Ka"), track.tofNSigmaKa(), track.itsNSigmaKa(), track.pt()); + } + if (cfgOpenPlotnSigmaTOFTPCPt) { + histosQA.fill(HIST("QA/PID/histnSigma_TOF_TPC_Pt_AfterITS_Ka"), track.tofNSigmaKa(), track.tpcNSigmaKa(), track.pt()); + } + if (cfgOpenPlotnSigmaITSTPCPt) { + histosQA.fill(HIST("QA/PID/histnSigma_ITS_TPC_Pt_AfterITS_Ka"), track.itsNSigmaKa(), track.tpcNSigmaKa(), track.pt()); + } + if (cfgOpenPlotAverClus) { + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_AfterITS_Ka"), averClusSizeCosl); + } + if (cfgOpenPlotAverClusP) { + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_AfterITS_Ka"), track.p(), averClusSizeCosl); + } + if (cfgOpenPlotAverClusnSigmaTPC) { + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Ka"), track.tpcNSigmaKa(), averClusSizeCosl); + } + if (cfgOpenPlotPhiDis) { + histosQA.fill(HIST("QA/PID/histPhi_Dis_AfterITS_Ka"), track.phi()); + } + if (cfgOpenPlotPhiDisPtEta) { + histosQA.fill(HIST("QA/PID/histPhi_Dis_Pt_Eta_AfterITS_Ka"), track.phi(), track.pt(), track.eta()); + } + if (cfgOpenDetailPlotsTPCITSContaimination) { + if (track.sign() > 0) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosKa_After"), track.tpcNSigmaKa(), track.itsNSigmaKa(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_PosKa_After"), track.tpcNSigmaKa(), averClusSizeCosl, track.pt()); + } else if (track.sign() < 0) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegKa_After"), track.tpcNSigmaKa(), track.itsNSigmaKa(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_NegKa_After"), track.tpcNSigmaKa(), averClusSizeCosl, track.pt()); + } } } - } - if ((pidFlag == 3) || (pidFlag == 8) || (pidFlag == 9) || (pidFlag == 10)) { - histosQA.fill(HIST("QA/PID/histnSigma_TPC_TOF_AfterITS_Pr"), track.tpcNSigmaPr(), track.tofNSigmaPr(), track.pt()); - histosQA.fill(HIST("QA/PID/histnSigma_ITS_AfterITS_Pr"), track.itsNSigmaPr()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_AfterITS_Pr"), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_AfterITS_Pr"), track.p(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Pr"), track.tpcNSigmaPr(), track.itsNSigmaPr()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Pr"), track.tpcNSigmaPr(), averClusSizeCosl); - histosQA.fill(HIST("QA/PID/histPhi_Dis_AfterITS_Pr"), track.phi()); - histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_AfterITS_Pr"), track.pt(), track.tofNSigmaPr()); - histosQA.fill(HIST("QA/PID/histnSigma_TPC_Pt_AfterITS_Pr"), track.pt(), track.tpcNSigmaPr()); - if (cfgOpenDetailPlots) { - if (track.sign() > 0) { - histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_PosPr"), track.phi(), track.pt(), track.eta()); - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosPr_After"), track.tpcNSigmaPr(), track.itsNSigmaPr(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_PosPr_After"), track.tpcNSigmaPr(), averClusSizeCosl, track.pt()); - } else if (track.sign() < 0) { - histosQA.fill(HIST("QA/PID/histPhi_Pt_Eta_NegPr"), track.phi(), track.pt(), track.eta()); - histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegPr_After"), track.tpcNSigmaPr(), track.itsNSigmaPr(), track.pt()); - histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSIgmaTPC_Pt_NegPr_After"), track.tpcNSigmaPr(), averClusSizeCosl, track.pt()); + if ((pidFlag == 3) || (pidFlag == 8) || (pidFlag == 9) || (pidFlag == 10)) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Pr"), track.itsNSigmaPr(), track.tpcNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaITS_AfterITS_Pr"), track.tofNSigmaPr(), track.itsNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaTPC_AfterITS_Pr"), track.tofNSigmaPr(), track.tpcNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_TPC_Pt_AfterITS_Pr"), track.pt(), track.tpcNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_AfterITS_Pr"), track.pt(), track.tofNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pt_AfterITS_Pr"), track.pt(), track.itsNSigmaPr()); + if (cfgOpenPlotnSigmaTOFITSPt) { + histosQA.fill(HIST("QA/PID/histnSigma_TOF_ITS_Pt_AfterITS_Pr"), track.tofNSigmaPr(), track.itsNSigmaPr(), track.pt()); + } + if (cfgOpenPlotnSigmaTOFTPCPt) { + histosQA.fill(HIST("QA/PID/histnSigma_TOF_TPC_Pt_AfterITS_Pr"), track.tofNSigmaPr(), track.tpcNSigmaPr(), track.pt()); + } + if (cfgOpenPlotnSigmaITSTPCPt) { + histosQA.fill(HIST("QA/PID/histnSigma_ITS_TPC_Pt_AfterITS_Pr"), track.itsNSigmaPr(), track.tpcNSigmaPr(), track.pt()); + } + if (cfgOpenPlotAverClus) { + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_AfterITS_Pr"), averClusSizeCosl); + } + if (cfgOpenPlotAverClusP) { + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_P_AfterITS_Pr"), track.p(), averClusSizeCosl); + } + if (cfgOpenPlotAverClusnSigmaTPC) { + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Pr"), track.tpcNSigmaPr(), averClusSizeCosl); + } + if (cfgOpenPlotPhiDis) { + histosQA.fill(HIST("QA/PID/histPhi_Dis_AfterITS_Pr"), track.phi()); + } + if (cfgOpenPlotPhiDisPtEta) { + histosQA.fill(HIST("QA/PID/histPhi_Dis_Pt_Eta_AfterITS_Pr"), track.phi(), track.pt(), track.eta()); + } + if (cfgOpenDetailPlotsTPCITSContaimination) { + if (track.sign() > 0) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_PosPr_After"), track.tpcNSigmaPr(), track.itsNSigmaPr(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_PosPr_After"), track.tpcNSigmaPr(), averClusSizeCosl, track.pt()); + } else if (track.sign() < 0) { + histosQA.fill(HIST("QA/PID/histnSigmaITS_TPC_Pt_NegPr_After"), track.tpcNSigmaPr(), track.itsNSigmaPr(), track.pt()); + histosQA.fill(HIST("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_NegPr_After"), track.tpcNSigmaPr(), averClusSizeCosl, track.pt()); + } } } } } } } - pidCmeTable(pidFlag, averClusSizeCosl, track.itsNSigmaPi(), track.itsNSigmaKa(), track.itsNSigmaPr(), track.tpcNSigmaPi(), track.tpcNSigmaKa(), track.tpcNSigmaPr()); + pidCmeTable(pidFlag); + pidInfoTable(averClusSizeCosl, track.itsNSigmaPi(), track.itsNSigmaKa(), track.itsNSigmaPr(), track.tpcNSigmaPi(), track.tpcNSigmaKa(), track.tpcNSigmaPr(), track.tofNSigmaPi(), track.tofNSigmaKa(), track.tofNSigmaPr()); } } }; @@ -733,18 +1138,22 @@ struct FillPIDcolums { struct QAProcessCent { HistogramRegistry histosQA{"histosQAwithcent", {}, OutputObjHandlingPolicy::AnalysisObject}; Configurable> cfgCentralitybinsforQA{"cfgCentralitybinsforQA", {0, 30, 60}, "Centrality bins for track phi and TPC_ITS matching check"}; - Configurable cfgOpenDetailPlotscme{"cfgOpenDetailPlotscme", true, "open detail TH3D plots for nSigmaTPC-ITS Pt-eta-Phi nSigmaITS-clustersize"}; + Configurable cfgOpenDetailPlots{"cfgOpenDetailPlots", true, "open detail TH3D plots for nSigmaTPC-ITS Pt-eta-Phi nSigmaITS-clustersize"}; + Configurable cfgOpenITSafter{"cfgOpenITSafter", true, "open check for after ITS cut check(if used ITScut in table producer it need else close to save cpu usage)"}; Configurable cfgOpenPtEtaPhi{"cfgOpenPtEtaPhi", true, "open pt-#eta-#phi PID QA (Optional for limited memory usage)"}; Configurable cfgOpenITSTPCnSigma{"cfgOpenITSTPCnSigma", true, "open ITS-TPC nSigma QA (Optional for limited memory usage)"}; Configurable cfgOpenClusSizenSigmaTPC{"cfgOpenClusSizenSigmaTPC", true, "open ITSClustersize-TPCnsigma QA (Optional for limited memory usage)"}; Configurable cfgOpenPi{"cfgOpenPi", true, "open Pion QA (Optional for limited memory usage)"}; Configurable cfgOpenKa{"cfgOpenKa", true, "open Kaon QA (Optional for limited memory usage)"}; Configurable cfgOpenPr{"cfgOpenPr", true, "open Proton QA (Optional for limited memory usage)"}; - ConfigurableAxis cfgaxisetaPIDcme{"cfgaxisetaPIDcme", {90, -0.9, 0.9}, "Binning for Pt QA"}; - ConfigurableAxis cfgaxisptPIDcme{"cfgaxisptPIDcme", {120, 0, 12}, "Binning for P_{t} PID"}; - ConfigurableAxis cfgnSigmaBinsTPCcme{"cfgnSigmaBinsTPCcme", {200, -5.f, 5.f}, "Binning for n sigma TPC"}; - ConfigurableAxis cfgnSigmaBinsITScme{"cfgnSigmaBinsITScme", {200, -5.f, 5.f}, "Binning for n sigma TPC"}; - ConfigurableAxis cfgaxisAverClusterCoslnSigmacme{"cfgaxisAverClusterCoslnSigmacme", {50, 0, 5}, "Binning for average cluster size x cos(#lambda) vs nSigam"}; + Configurable cfgOpenTOFITSnSigma{"cfgOpenTOFITSnSigma", false, "open TOF-ITS nsigma 2D plots vs pt at a certain centrality"}; + Configurable cfgOpenTOFTPCnSigma{"cfgOpenTOFTPCnSigma", false, "open TOF-TPC nsigma 2D plots vs pt at a certain centrality"}; + ConfigurableAxis cfgaxisetaPID{"cfgaxisetaPID", {90, -0.9, 0.9}, "Binning for Pt QA"}; + ConfigurableAxis cfgaxisptPID{"cfgaxisptPID", {120, 0, 12}, "Binning for P_{t} PID"}; + ConfigurableAxis cfgnSigmaBinsTPC{"cfgnSigmaBinsTPC", {200, -5.f, 5.f}, "Binning for n sigma TPC"}; + ConfigurableAxis cfgnSigmaBinsITS{"cfgnSigmaBinsITS", {200, -5.f, 5.f}, "Binning for n sigma ITS"}; + ConfigurableAxis cfgnSigmaBinsTOF{"cfgnSigmaBinsTOF", {200, -5.f, 5.f}, "Binning for n sigma TOF"}; + ConfigurableAxis cfgaxisAverClusterCoslnSigma{"cfgaxisAverClusterCoslnSigma", {50, 0, 5}, "Binning for average cluster size x cos(#lambda) vs nSigam"}; std::vector> vhistPhiPtEtaPosPiCen; std::vector> vhistPhiPtEtaNegPiCen; @@ -776,103 +1185,215 @@ struct QAProcessCent { std::vector> vhistAverClusterSizeCoslnSigmaTPCPtNegKaAfterCen; std::vector> vhistAverClusterSizeCoslnSigmaTPCPtPosPrAfterCen; std::vector> vhistAverClusterSizeCoslnSigmaTPCPtNegPrAfterCen; + std::vector> vhistnSigmaTOFITSPtPosPiBeforeCen; + std::vector> vhistnSigmaTOFITSPtNegPiBeforeCen; + std::vector> vhistnSigmaTOFITSPtPosKaBeforeCen; + std::vector> vhistnSigmaTOFITSPtNegKaBeforeCen; + std::vector> vhistnSigmaTOFITSPtPosPrBeforeCen; + std::vector> vhistnSigmaTOFITSPtNegPrBeforeCen; + std::vector> vhistnSigmaTOFITSPtPosPiAfterCen; + std::vector> vhistnSigmaTOFITSPtNegPiAfterCen; + std::vector> vhistnSigmaTOFITSPtPosKaAfterCen; + std::vector> vhistnSigmaTOFITSPtNegKaAfterCen; + std::vector> vhistnSigmaTOFITSPtPosPrAfterCen; + std::vector> vhistnSigmaTOFITSPtNegPrAfterCen; + std::vector> vhistnSigmaTOFTPCPtPosPiBeforeCen; + std::vector> vhistnSigmaTOFTPCPtNegPiBeforeCen; + std::vector> vhistnSigmaTOFTPCPtPosKaBeforeCen; + std::vector> vhistnSigmaTOFTPCPtNegKaBeforeCen; + std::vector> vhistnSigmaTOFTPCPtPosPrBeforeCen; + std::vector> vhistnSigmaTOFTPCPtNegPrBeforeCen; + std::vector> vhistnSigmaTOFTPCPtPosPiAfterCen; + std::vector> vhistnSigmaTOFTPCPtNegPiAfterCen; + std::vector> vhistnSigmaTOFTPCPtPosKaAfterCen; + std::vector> vhistnSigmaTOFTPCPtNegKaAfterCen; + std::vector> vhistnSigmaTOFTPCPtPosPrAfterCen; + std::vector> vhistnSigmaTOFTPCPtNegPrAfterCen; Filter trackPIDfilter = aod::cme_track_pid_columns::nPidFlag > (int8_t)0; void init(InitContext const&) { AxisSpec axisPhicme = {100, 0, 2.1 * constants::math::PI, "#phi"}; // Additional QA histograms for PID - if (cfgOpenDetailPlotscme) { + if (cfgOpenDetailPlots) { for (int i = 0; i < static_cast(cfgCentralitybinsforQA.value.size()) - 1; ++i) { if (cfgOpenPtEtaPhi) { if (cfgOpenPi) { - auto hPhiPtEtaPosPi = histosQA.add(Form("QA/PID/histPhi_Pt_Eta_PosPi_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhicme, cfgaxisptPIDcme, cfgaxisetaPIDcme}}); - auto hPhiPtEtaNegPi = histosQA.add(Form("QA/PID/histPhi_Pt_Eta_NegPi_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhicme, cfgaxisptPIDcme, cfgaxisetaPIDcme}}); + auto hPhiPtEtaPosPi = histosQA.add(Form("QA/PID/histPhi_Pt_Eta_PosPi_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhicme, cfgaxisptPID, cfgaxisetaPID}}); + auto hPhiPtEtaNegPi = histosQA.add(Form("QA/PID/histPhi_Pt_Eta_NegPi_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhicme, cfgaxisptPID, cfgaxisetaPID}}); vhistPhiPtEtaPosPiCen.push_back(std::move(hPhiPtEtaPosPi)); vhistPhiPtEtaNegPiCen.push_back(std::move(hPhiPtEtaNegPi)); } if (cfgOpenKa) { - auto hPhiPtEtaPosKa = histosQA.add(Form("QA/PID/histPhi_Pt_Eta_PosKa_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhicme, cfgaxisptPIDcme, cfgaxisetaPIDcme}}); - auto hPhiPtEtaNegKa = histosQA.add(Form("QA/PID/histPhi_Pt_Eta_NegKa_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhicme, cfgaxisptPIDcme, cfgaxisetaPIDcme}}); + auto hPhiPtEtaPosKa = histosQA.add(Form("QA/PID/histPhi_Pt_Eta_PosKa_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhicme, cfgaxisptPID, cfgaxisetaPID}}); + auto hPhiPtEtaNegKa = histosQA.add(Form("QA/PID/histPhi_Pt_Eta_NegKa_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhicme, cfgaxisptPID, cfgaxisetaPID}}); vhistPhiPtEtaPosKaCen.push_back(std::move(hPhiPtEtaPosKa)); vhistPhiPtEtaNegKaCen.push_back(std::move(hPhiPtEtaNegKa)); } if (cfgOpenPr) { - auto hPhiPtEtaPosPr = histosQA.add(Form("QA/PID/histPhi_Pt_Eta_PosPr_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhicme, cfgaxisptPIDcme, cfgaxisetaPIDcme}}); - auto hPhiPtEtaNegPr = histosQA.add(Form("QA/PID/histPhi_Pt_Eta_NegPr_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhicme, cfgaxisptPIDcme, cfgaxisetaPIDcme}}); + auto hPhiPtEtaPosPr = histosQA.add(Form("QA/PID/histPhi_Pt_Eta_PosPr_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhicme, cfgaxisptPID, cfgaxisetaPID}}); + auto hPhiPtEtaNegPr = histosQA.add(Form("QA/PID/histPhi_Pt_Eta_NegPr_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";#phi;#p_{t};#eta", {HistType::kTH3F, {axisPhicme, cfgaxisptPID, cfgaxisetaPID}}); vhistPhiPtEtaPosPrCen.push_back(std::move(hPhiPtEtaPosPr)); vhistPhiPtEtaNegPrCen.push_back(std::move(hPhiPtEtaNegPr)); } } if (cfgOpenITSTPCnSigma) { if (cfgOpenPi) { - auto hnSigmaITSTPCPtPosPiBefore = histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosPi_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgnSigmaBinsITScme, cfgaxisptPIDcme}}); - auto hnSigmaITSTPCPtPosPiAfter = histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosPi_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgnSigmaBinsITScme, cfgaxisptPIDcme}}); - auto hnSigmaITSTPCPtNegPiBefore = histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegPi_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgnSigmaBinsITScme, cfgaxisptPIDcme}}); - auto hnSigmaITSTPCPtNegPiAfter = histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegPi_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgnSigmaBinsITScme, cfgaxisptPIDcme}}); + auto hnSigmaITSTPCPtPosPiBefore = histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosPi_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPC, cfgnSigmaBinsITS, cfgaxisptPID}}); + auto hnSigmaITSTPCPtNegPiBefore = histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegPi_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPC, cfgnSigmaBinsITS, cfgaxisptPID}}); vhistnSigmaITSTPCPtPosPiBeforeCen.push_back(std::move(hnSigmaITSTPCPtPosPiBefore)); vhistnSigmaITSTPCPtNegPiBeforeCen.push_back(std::move(hnSigmaITSTPCPtNegPiBefore)); - vhistnSigmaITSTPCPtPosPiAfterCen.push_back(std::move(hnSigmaITSTPCPtPosPiAfter)); - vhistnSigmaITSTPCPtNegPiAfterCen.push_back(std::move(hnSigmaITSTPCPtNegPiAfter)); + if (cfgOpenITSafter) { + auto hnSigmaITSTPCPtPosPiAfter = histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosPi_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPC, cfgnSigmaBinsITS, cfgaxisptPID}}); + auto hnSigmaITSTPCPtNegPiAfter = histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegPi_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPC, cfgnSigmaBinsITS, cfgaxisptPID}}); + vhistnSigmaITSTPCPtPosPiAfterCen.push_back(std::move(hnSigmaITSTPCPtPosPiAfter)); + vhistnSigmaITSTPCPtNegPiAfterCen.push_back(std::move(hnSigmaITSTPCPtNegPiAfter)); + } } if (cfgOpenKa) { - auto hnSigmaITSTPCPtPosKaBefore = histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosKa_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgnSigmaBinsITScme, cfgaxisptPIDcme}}); - auto hnSigmaITSTPCPtPosKaAfter = histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosKa_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgnSigmaBinsITScme, cfgaxisptPIDcme}}); - auto hnSigmaITSTPCPtNegKaBefore = histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegKa_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgnSigmaBinsITScme, cfgaxisptPIDcme}}); - auto hnSigmaITSTPCPtNegKaAfter = histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegKa_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgnSigmaBinsITScme, cfgaxisptPIDcme}}); + auto hnSigmaITSTPCPtPosKaBefore = histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosKa_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPC, cfgnSigmaBinsITS, cfgaxisptPID}}); + auto hnSigmaITSTPCPtNegKaBefore = histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegKa_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPC, cfgnSigmaBinsITS, cfgaxisptPID}}); vhistnSigmaITSTPCPtPosKaBeforeCen.push_back(std::move(hnSigmaITSTPCPtPosKaBefore)); vhistnSigmaITSTPCPtNegKaBeforeCen.push_back(std::move(hnSigmaITSTPCPtNegKaBefore)); - vhistnSigmaITSTPCPtPosKaAfterCen.push_back(std::move(hnSigmaITSTPCPtPosKaAfter)); - vhistnSigmaITSTPCPtNegKaAfterCen.push_back(std::move(hnSigmaITSTPCPtNegKaAfter)); + if (cfgOpenITSafter) { + auto hnSigmaITSTPCPtPosKaAfter = histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosKa_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPC, cfgnSigmaBinsITS, cfgaxisptPID}}); + auto hnSigmaITSTPCPtNegKaAfter = histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegKa_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPC, cfgnSigmaBinsITS, cfgaxisptPID}}); + vhistnSigmaITSTPCPtPosKaAfterCen.push_back(std::move(hnSigmaITSTPCPtPosKaAfter)); + vhistnSigmaITSTPCPtNegKaAfterCen.push_back(std::move(hnSigmaITSTPCPtNegKaAfter)); + } } if (cfgOpenPr) { - auto hnSigmaITSTPCPtPosPrBefore = histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosPr_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgnSigmaBinsITScme, cfgaxisptPIDcme}}); - auto hnSigmaITSTPCPtPosPrAfter = histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosPr_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgnSigmaBinsITScme, cfgaxisptPIDcme}}); - auto hnSigmaITSTPCPtNegPrBefore = histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegPr_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgnSigmaBinsITScme, cfgaxisptPIDcme}}); - auto hnSigmaITSTPCPtNegPrAfter = histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegPr_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgnSigmaBinsITScme, cfgaxisptPIDcme}}); + auto hnSigmaITSTPCPtPosPrBefore = histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosPr_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPC, cfgnSigmaBinsITS, cfgaxisptPID}}); + auto hnSigmaITSTPCPtNegPrBefore = histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegPr_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPC, cfgnSigmaBinsITS, cfgaxisptPID}}); vhistnSigmaITSTPCPtPosPrBeforeCen.push_back(std::move(hnSigmaITSTPCPtPosPrBefore)); vhistnSigmaITSTPCPtNegPrBeforeCen.push_back(std::move(hnSigmaITSTPCPtNegPrBefore)); - vhistnSigmaITSTPCPtPosPrAfterCen.push_back(std::move(hnSigmaITSTPCPtPosPrAfter)); - vhistnSigmaITSTPCPtNegPrAfterCen.push_back(std::move(hnSigmaITSTPCPtNegPrAfter)); + if (cfgOpenITSafter) { + auto hnSigmaITSTPCPtPosPrAfter = histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosPr_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPC, cfgnSigmaBinsITS, cfgaxisptPID}}); + auto hnSigmaITSTPCPtNegPrAfter = histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_NegPr_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPC, cfgnSigmaBinsITS, cfgaxisptPID}}); + vhistnSigmaITSTPCPtPosPrAfterCen.push_back(std::move(hnSigmaITSTPCPtPosPrAfter)); + vhistnSigmaITSTPCPtNegPrAfterCen.push_back(std::move(hnSigmaITSTPCPtNegPrAfter)); + } } } if (cfgOpenClusSizenSigmaTPC) { if (cfgOpenPi) { - auto hAverClusterSizeCoslnSigmaTPCPtPosPiBefore = histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_PosPi_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgaxisAverClusterCoslnSigmacme, cfgaxisptPIDcme}}); - auto hAverClusterSizeCoslnSigmaTPCPtPosPiAfter = histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_PosPi_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgaxisAverClusterCoslnSigmacme, cfgaxisptPIDcme}}); - auto hAverClusterSizeCoslnSigmaTPCPtNegPiBefore = histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_NegPi_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgaxisAverClusterCoslnSigmacme, cfgaxisptPIDcme}}); - auto hAverClusterSizeCoslnSigmaTPCPtNegPiAfter = histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_NegPi_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgaxisAverClusterCoslnSigmacme, cfgaxisptPIDcme}}); + auto hAverClusterSizeCoslnSigmaTPCPtPosPiBefore = histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_PosPi_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPC, cfgaxisAverClusterCoslnSigma, cfgaxisptPID}}); + auto hAverClusterSizeCoslnSigmaTPCPtNegPiBefore = histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_NegPi_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPC, cfgaxisAverClusterCoslnSigma, cfgaxisptPID}}); vhistAverClusterSizeCoslnSigmaTPCPtPosPiBeforeCen.push_back(std::move(hAverClusterSizeCoslnSigmaTPCPtPosPiBefore)); vhistAverClusterSizeCoslnSigmaTPCPtNegPiBeforeCen.push_back(std::move(hAverClusterSizeCoslnSigmaTPCPtNegPiBefore)); - vhistAverClusterSizeCoslnSigmaTPCPtPosPiAfterCen.push_back(std::move(hAverClusterSizeCoslnSigmaTPCPtPosPiAfter)); - vhistAverClusterSizeCoslnSigmaTPCPtNegPiAfterCen.push_back(std::move(hAverClusterSizeCoslnSigmaTPCPtNegPiAfter)); + if (cfgOpenITSafter) { + auto hAverClusterSizeCoslnSigmaTPCPtPosPiAfter = histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_PosPi_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPC, cfgaxisAverClusterCoslnSigma, cfgaxisptPID}}); + auto hAverClusterSizeCoslnSigmaTPCPtNegPiAfter = histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_NegPi_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPC, cfgaxisAverClusterCoslnSigma, cfgaxisptPID}}); + vhistAverClusterSizeCoslnSigmaTPCPtPosPiAfterCen.push_back(std::move(hAverClusterSizeCoslnSigmaTPCPtPosPiAfter)); + vhistAverClusterSizeCoslnSigmaTPCPtNegPiAfterCen.push_back(std::move(hAverClusterSizeCoslnSigmaTPCPtNegPiAfter)); + } } if (cfgOpenKa) { - auto hAverClusterSizeCoslnSigmaTPCPtPosKaBefore = histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_PosKa_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgaxisAverClusterCoslnSigmacme, cfgaxisptPIDcme}}); - auto hAverClusterSizeCoslnSigmaTPCPtPosKaAfter = histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_PosKa_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgaxisAverClusterCoslnSigmacme, cfgaxisptPIDcme}}); - auto hAverClusterSizeCoslnSigmaTPCPtNegKaBefore = histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_NegKa_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgaxisAverClusterCoslnSigmacme, cfgaxisptPIDcme}}); - auto hAverClusterSizeCoslnSigmaTPCPtNegKaAfter = histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_NegKa_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgaxisAverClusterCoslnSigmacme, cfgaxisptPIDcme}}); + auto hAverClusterSizeCoslnSigmaTPCPtPosKaBefore = histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_PosKa_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPC, cfgaxisAverClusterCoslnSigma, cfgaxisptPID}}); + auto hAverClusterSizeCoslnSigmaTPCPtNegKaBefore = histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_NegKa_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPC, cfgaxisAverClusterCoslnSigma, cfgaxisptPID}}); vhistAverClusterSizeCoslnSigmaTPCPtPosKaBeforeCen.push_back(std::move(hAverClusterSizeCoslnSigmaTPCPtPosKaBefore)); vhistAverClusterSizeCoslnSigmaTPCPtNegKaBeforeCen.push_back(std::move(hAverClusterSizeCoslnSigmaTPCPtNegKaBefore)); - vhistAverClusterSizeCoslnSigmaTPCPtPosKaAfterCen.push_back(std::move(hAverClusterSizeCoslnSigmaTPCPtPosKaAfter)); - vhistAverClusterSizeCoslnSigmaTPCPtNegKaAfterCen.push_back(std::move(hAverClusterSizeCoslnSigmaTPCPtNegKaAfter)); + if (cfgOpenITSafter) { + auto hAverClusterSizeCoslnSigmaTPCPtPosKaAfter = histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_PosKa_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPC, cfgaxisAverClusterCoslnSigma, cfgaxisptPID}}); + auto hAverClusterSizeCoslnSigmaTPCPtNegKaAfter = histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_NegKa_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPC, cfgaxisAverClusterCoslnSigma, cfgaxisptPID}}); + vhistAverClusterSizeCoslnSigmaTPCPtPosKaAfterCen.push_back(std::move(hAverClusterSizeCoslnSigmaTPCPtPosKaAfter)); + vhistAverClusterSizeCoslnSigmaTPCPtNegKaAfterCen.push_back(std::move(hAverClusterSizeCoslnSigmaTPCPtNegKaAfter)); + } } if (cfgOpenPr) { - auto hAverClusterSizeCoslnSigmaTPCPtPosPrBefore = histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_PosPr_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgaxisAverClusterCoslnSigmacme, cfgaxisptPIDcme}}); - auto hAverClusterSizeCoslnSigmaTPCPtPosPrAfter = histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_PosPr_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgaxisAverClusterCoslnSigmacme, cfgaxisptPIDcme}}); - auto hAverClusterSizeCoslnSigmaTPCPtNegPrBefore = histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_NegPr_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgaxisAverClusterCoslnSigmacme, cfgaxisptPIDcme}}); - auto hAverClusterSizeCoslnSigmaTPCPtNegPrAfter = histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_NegPr_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgaxisAverClusterCoslnSigmacme, cfgaxisptPIDcme}}); + auto hAverClusterSizeCoslnSigmaTPCPtPosPrBefore = histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_PosPr_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPC, cfgaxisAverClusterCoslnSigma, cfgaxisptPID}}); + auto hAverClusterSizeCoslnSigmaTPCPtNegPrBefore = histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_NegPr_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPC, cfgaxisAverClusterCoslnSigma, cfgaxisptPID}}); vhistAverClusterSizeCoslnSigmaTPCPtPosPrBeforeCen.push_back(std::move(hAverClusterSizeCoslnSigmaTPCPtPosPrBefore)); vhistAverClusterSizeCoslnSigmaTPCPtNegPrBeforeCen.push_back(std::move(hAverClusterSizeCoslnSigmaTPCPtNegPrBefore)); - vhistAverClusterSizeCoslnSigmaTPCPtPosPrAfterCen.push_back(std::move(hAverClusterSizeCoslnSigmaTPCPtPosPrAfter)); - vhistAverClusterSizeCoslnSigmaTPCPtNegPrAfterCen.push_back(std::move(hAverClusterSizeCoslnSigmaTPCPtNegPrAfter)); + if (cfgOpenITSafter) { + auto hAverClusterSizeCoslnSigmaTPCPtPosPrAfter = histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_PosPr_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPC, cfgaxisAverClusterCoslnSigma, cfgaxisptPID}}); + auto hAverClusterSizeCoslnSigmaTPCPtNegPrAfter = histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_NegPr_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPC, cfgaxisAverClusterCoslnSigma, cfgaxisptPID}}); + vhistAverClusterSizeCoslnSigmaTPCPtPosPrAfterCen.push_back(std::move(hAverClusterSizeCoslnSigmaTPCPtPosPrAfter)); + vhistAverClusterSizeCoslnSigmaTPCPtNegPrAfterCen.push_back(std::move(hAverClusterSizeCoslnSigmaTPCPtNegPrAfter)); + } + } + } + if (cfgOpenTOFITSnSigma) { + if (cfgOpenPi) { + auto hnSigmaTOFITSPtPosPiBefore = histosQA.add(Form("QA/PID/histnSigmaTOF_ITS_Pt_PosPi_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TOF};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsITS, cfgaxisptPID}}); + auto hnSigmaTOFITSPtNegPiBefore = histosQA.add(Form("QA/PID/histnSigmaTOF_ITS_Pt_NegPi_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TOF};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsITS, cfgaxisptPID}}); + vhistnSigmaTOFITSPtPosPiBeforeCen.push_back(std::move(hnSigmaTOFITSPtPosPiBefore)); + vhistnSigmaTOFITSPtNegPiBeforeCen.push_back(std::move(hnSigmaTOFITSPtNegPiBefore)); + if (cfgOpenITSafter) { + auto hnSigmaTOFITSPtPosPiAfter = histosQA.add(Form("QA/PID/histnSigmaTOF_ITS_Pt_PosPi_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TOF};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsITS, cfgaxisptPID}}); + auto hnSigmaTOFITSPtNegPiAfter = histosQA.add(Form("QA/PID/histnSigmaTOF_ITS_Pt_NegPi_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TOF};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsITS, cfgaxisptPID}}); + vhistnSigmaTOFITSPtPosPiAfterCen.push_back(std::move(hnSigmaTOFITSPtPosPiAfter)); + vhistnSigmaTOFITSPtNegPiAfterCen.push_back(std::move(hnSigmaTOFITSPtNegPiAfter)); + } + } + if (cfgOpenKa) { + auto hnSigmaTOFITSPtPosKaBefore = histosQA.add(Form("QA/PID/histnSigmaTOF_ITS_Pt_PosKa_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TOF};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsITS, cfgaxisptPID}}); + auto hnSigmaTOFITSPtNegKaBefore = histosQA.add(Form("QA/PID/histnSigmaTOF_ITS_Pt_NegKa_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TOF};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsITS, cfgaxisptPID}}); + vhistnSigmaTOFITSPtPosKaBeforeCen.push_back(std::move(hnSigmaTOFITSPtPosKaBefore)); + vhistnSigmaTOFITSPtNegKaBeforeCen.push_back(std::move(hnSigmaTOFITSPtNegKaBefore)); + if (cfgOpenITSafter) { + auto hnSigmaTOFITSPtPosKaAfter = histosQA.add(Form("QA/PID/histnSigmaTOF_ITS_Pt_PosKa_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TOF};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsITS, cfgaxisptPID}}); + auto hnSigmaTOFITSPtNegKaAfter = histosQA.add(Form("QA/PID/histnSigmaTOF_ITS_Pt_NegKa_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TOF};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsITS, cfgaxisptPID}}); + vhistnSigmaTOFITSPtPosKaAfterCen.push_back(std::move(hnSigmaTOFITSPtPosKaAfter)); + vhistnSigmaTOFITSPtNegKaAfterCen.push_back(std::move(hnSigmaTOFITSPtNegKaAfter)); + } + } + if (cfgOpenPr) { + auto hnSigmaTOFITSPtPosPrBefore = histosQA.add(Form("QA/PID/histnSigmaTOF_ITS_Pt_PosPr_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TOF};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsITS, cfgaxisptPID}}); + auto hnSigmaTOFITSPtNegPrBefore = histosQA.add(Form("QA/PID/histnSigmaTOF_ITS_Pt_NegPr_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TOF};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsITS, cfgaxisptPID}}); + vhistnSigmaTOFITSPtPosPrBeforeCen.push_back(std::move(hnSigmaTOFITSPtPosPrBefore)); + vhistnSigmaTOFITSPtNegPrBeforeCen.push_back(std::move(hnSigmaTOFITSPtNegPrBefore)); + if (cfgOpenITSafter) { + auto hnSigmaTOFITSPtPosPrAfter = histosQA.add(Form("QA/PID/histnSigmaTOF_ITS_Pt_PosPr_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TOF};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsITS, cfgaxisptPID}}); + auto hnSigmaTOFITSPtNegPrAfter = histosQA.add(Form("QA/PID/histnSigmaTOF_ITS_Pt_NegPr_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TOF};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsITS, cfgaxisptPID}}); + vhistnSigmaTOFITSPtPosPrAfterCen.push_back(std::move(hnSigmaTOFITSPtPosPrAfter)); + vhistnSigmaTOFITSPtNegPrAfterCen.push_back(std::move(hnSigmaTOFITSPtNegPrAfter)); + } + } + } + if (cfgOpenTOFTPCnSigma) { + if (cfgOpenPi) { + auto hnSigmaTOFTPCPtPosPiBefore = histosQA.add(Form("QA/PID/histnSigmaTOF_TPC_Pt_PosPi_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TOF};n#sigma_{TPC};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsTPC, cfgaxisptPID}}); + auto hnSigmaTOFTPCPtNegPiBefore = histosQA.add(Form("QA/PID/histnSigmaTOF_TPC_Pt_NegPi_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TOF};n#sigma_{TPC};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsTPC, cfgaxisptPID}}); + vhistnSigmaTOFTPCPtPosPiBeforeCen.push_back(std::move(hnSigmaTOFTPCPtPosPiBefore)); + vhistnSigmaTOFTPCPtNegPiBeforeCen.push_back(std::move(hnSigmaTOFTPCPtNegPiBefore)); + if (cfgOpenITSafter) { + auto hnSigmaTOFTPCPtPosPiAfter = histosQA.add(Form("QA/PID/histnSigmaTOF_TPC_Pt_PosPi_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TOF};n#sigma_{TPC};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsTPC, cfgaxisptPID}}); + auto hnSigmaTOFTPCPtNegPiAfter = histosQA.add(Form("QA/PID/histnSigmaTOF_TPC_Pt_NegPi_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TOF};n#sigma_{TPC};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsTPC, cfgaxisptPID}}); + vhistnSigmaTOFTPCPtPosPiAfterCen.push_back(std::move(hnSigmaTOFTPCPtPosPiAfter)); + vhistnSigmaTOFTPCPtNegPiAfterCen.push_back(std::move(hnSigmaTOFTPCPtNegPiAfter)); + } + } + if (cfgOpenKa) { + auto hnSigmaTOFTPCPtPosKaBefore = histosQA.add(Form("QA/PID/histnSigmaTOF_TPC_Pt_PosKa_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TOF};n#sigma_{TPC};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsTPC, cfgaxisptPID}}); + auto hnSigmaTOFTPCPtNegKaBefore = histosQA.add(Form("QA/PID/histnSigmaTOF_TPC_Pt_NegKa_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TOF};n#sigma_{TPC};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsTPC, cfgaxisptPID}}); + vhistnSigmaTOFTPCPtPosKaBeforeCen.push_back(std::move(hnSigmaTOFTPCPtPosKaBefore)); + vhistnSigmaTOFTPCPtNegKaBeforeCen.push_back(std::move(hnSigmaTOFTPCPtNegKaBefore)); + if (cfgOpenITSafter) { + auto hnSigmaTOFTPCPtPosKaAfter = histosQA.add(Form("QA/PID/histnSigmaTOF_TPC_Pt_PosKa_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TOF};n#sigma_{TPC};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsTPC, cfgaxisptPID}}); + auto hnSigmaTOFTPCPtNegKaAfter = histosQA.add(Form("QA/PID/histnSigmaTOF_TPC_Pt_NegKa_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TOF};n#sigma_{TPC};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsTPC, cfgaxisptPID}}); + vhistnSigmaTOFTPCPtPosKaAfterCen.push_back(std::move(hnSigmaTOFTPCPtPosKaAfter)); + vhistnSigmaTOFTPCPtNegKaAfterCen.push_back(std::move(hnSigmaTOFTPCPtNegKaAfter)); + } + } + if (cfgOpenPr) { + auto hnSigmaTOFTPCPtPosPrBefore = histosQA.add(Form("QA/PID/histnSigmaTOF_TPC_Pt_PosPr_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TOF};n#sigma_{TPC};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsTPC, cfgaxisptPID}}); + auto hnSigmaTOFTPCPtNegPrBefore = histosQA.add(Form("QA/PID/histnSigmaTOF_TPC_Pt_NegPr_Before_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TOF};n#sigma_{TPC};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsTPC, cfgaxisptPID}}); + vhistnSigmaTOFTPCPtPosPrBeforeCen.push_back(std::move(hnSigmaTOFTPCPtPosPrBefore)); + vhistnSigmaTOFTPCPtNegPrBeforeCen.push_back(std::move(hnSigmaTOFTPCPtNegPrBefore)); + if (cfgOpenITSafter) { + auto hnSigmaTOFTPCPtPosPrAfter = histosQA.add(Form("QA/PID/histnSigmaTOF_TPC_Pt_PosPr_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TOF};n#sigma_{TPC};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsTPC, cfgaxisptPID}}); + auto hnSigmaTOFTPCPtNegPrAfter = histosQA.add(Form("QA/PID/histnSigmaTOF_TPC_Pt_NegPr_After_Cen_%d_%d", cfgCentralitybinsforQA.value[i], cfgCentralitybinsforQA.value[i + 1]), ";n#sigma_{TOF};n#sigma_{TPC};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsTPC, cfgaxisptPID}}); + vhistnSigmaTOFTPCPtPosPrAfterCen.push_back(std::move(hnSigmaTOFTPCPtPosPrAfter)); + vhistnSigmaTOFTPCPtNegPrAfterCen.push_back(std::move(hnSigmaTOFTPCPtNegPrAfter)); + } } } } } } - void process(CollisionPID::iterator const& collision, soa::Filtered> const& tracks) + void process(CollisionPID::iterator const& collision, soa::Filtered> const& tracks) { - if (cfgOpenDetailPlotscme) { + if (cfgOpenDetailPlots) { const auto cent = collision.centFT0C(); int currentBin = -1; for (int i = 0; i < static_cast(cfgCentralitybinsforQA.value.size()) - 1; ++i) { @@ -887,123 +1408,207 @@ struct QAProcessCent { if (cfgOpenPi) { if ((pidFlag == 1) || (pidFlag == 4) || (pidFlag == 7) || (pidFlag == 8) || (pidFlag == 10) || (pidFlag == 11) || (pidFlag == 12) || (pidFlag == 14)) { if (trk.sign() > 0) { - if (cfgOpenPtEtaPhi) { - if (!((pidFlag == 4) || (pidFlag == 11) || (pidFlag == 12) || (pidFlag == 14))) { + if (!((pidFlag == 4) || (pidFlag == 11) || (pidFlag == 12) || (pidFlag == 14))) { + if (cfgOpenPtEtaPhi) { vhistPhiPtEtaPosPiCen[currentBin]->Fill(trk.phi(), trk.pt(), trk.eta()); } + if (cfgOpenITSafter) { + if (cfgOpenITSTPCnSigma) { + vhistnSigmaITSTPCPtPosPiAfterCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.nSigmaPiITS(), trk.pt()); + } + if (cfgOpenClusSizenSigmaTPC) { + vhistAverClusterSizeCoslnSigmaTPCPtPosPiAfterCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.averClusterSizeCosl(), trk.pt()); + } + if (cfgOpenTOFITSnSigma) { + vhistnSigmaTOFITSPtPosPiAfterCen[currentBin]->Fill(trk.nSigmaPiTOF(), trk.nSigmaPiITS(), trk.pt()); + } + if (cfgOpenTOFTPCnSigma) { + vhistnSigmaTOFTPCPtPosPiAfterCen[currentBin]->Fill(trk.nSigmaPiTOF(), trk.nSigmaPiTPC(), trk.pt()); + } + } } if (cfgOpenITSTPCnSigma) { - if (!((pidFlag == 4) || (pidFlag == 11) || (pidFlag == 12) || (pidFlag == 14))) { - vhistnSigmaITSTPCPtPosPiAfterCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.nSigmaPiITS(), trk.pt()); - } vhistnSigmaITSTPCPtPosPiBeforeCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.nSigmaPiITS(), trk.pt()); } if (cfgOpenClusSizenSigmaTPC) { - if (!((pidFlag == 4) || (pidFlag == 11) || (pidFlag == 12) || (pidFlag == 14))) { - vhistAverClusterSizeCoslnSigmaTPCPtPosPiAfterCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.averClusterSizeCosl(), trk.pt()); - } vhistAverClusterSizeCoslnSigmaTPCPtPosPiBeforeCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.averClusterSizeCosl(), trk.pt()); } + if (cfgOpenTOFITSnSigma) { + vhistnSigmaTOFITSPtPosPiBeforeCen[currentBin]->Fill(trk.nSigmaPiTOF(), trk.nSigmaPiITS(), trk.pt()); + } + if (cfgOpenTOFTPCnSigma) { + vhistnSigmaTOFTPCPtPosPiBeforeCen[currentBin]->Fill(trk.nSigmaPiTOF(), trk.nSigmaPiTPC(), trk.pt()); + } } else if (trk.sign() < 0) { - if (cfgOpenPtEtaPhi) { - if (!((pidFlag == 4) || (pidFlag == 11) || (pidFlag == 12) || (pidFlag == 14))) { + if (!((pidFlag == 4) || (pidFlag == 11) || (pidFlag == 12) || (pidFlag == 14))) { + if (cfgOpenPtEtaPhi) { vhistPhiPtEtaNegPiCen[currentBin]->Fill(trk.phi(), trk.pt(), trk.eta()); } + if (cfgOpenITSafter) { + if (cfgOpenITSTPCnSigma) { + vhistnSigmaITSTPCPtNegPiAfterCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.nSigmaPiITS(), trk.pt()); + } + if (cfgOpenClusSizenSigmaTPC) { + vhistAverClusterSizeCoslnSigmaTPCPtNegPiAfterCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.averClusterSizeCosl(), trk.pt()); + } + if (cfgOpenTOFITSnSigma) { + vhistnSigmaTOFITSPtNegPiAfterCen[currentBin]->Fill(trk.nSigmaPiTOF(), trk.nSigmaPiITS(), trk.pt()); + } + if (cfgOpenTOFTPCnSigma) { + vhistnSigmaTOFTPCPtNegPiAfterCen[currentBin]->Fill(trk.nSigmaPiTOF(), trk.nSigmaPiTPC(), trk.pt()); + } + } } if (cfgOpenITSTPCnSigma) { - if (!((pidFlag == 4) || (pidFlag == 11) || (pidFlag == 12) || (pidFlag == 14))) { - vhistnSigmaITSTPCPtNegPiAfterCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.nSigmaPiITS(), trk.pt()); - } vhistnSigmaITSTPCPtNegPiBeforeCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.nSigmaPiITS(), trk.pt()); } if (cfgOpenClusSizenSigmaTPC) { - if (!((pidFlag == 4) || (pidFlag == 11) || (pidFlag == 12) || (pidFlag == 14))) { - vhistAverClusterSizeCoslnSigmaTPCPtNegPiAfterCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.averClusterSizeCosl(), trk.pt()); - } vhistAverClusterSizeCoslnSigmaTPCPtNegPiBeforeCen[currentBin]->Fill(trk.nSigmaPiTPC(), trk.averClusterSizeCosl(), trk.pt()); } + if (cfgOpenTOFITSnSigma) { + vhistnSigmaTOFITSPtNegPiBeforeCen[currentBin]->Fill(trk.nSigmaPiTOF(), trk.nSigmaPiITS(), trk.pt()); + } + if (cfgOpenTOFTPCnSigma) { + vhistnSigmaTOFTPCPtNegPiBeforeCen[currentBin]->Fill(trk.nSigmaPiTOF(), trk.nSigmaPiTPC(), trk.pt()); + } } } } if (cfgOpenKa) { if ((pidFlag == 2) || (pidFlag == 5) || (pidFlag == 7) || (pidFlag == 9) || (pidFlag == 10) || (pidFlag == 11) || (pidFlag == 13) || (pidFlag == 14)) { if (trk.sign() > 0) { - if (cfgOpenPtEtaPhi) { - if (!((pidFlag == 5) || (pidFlag == 11) || (pidFlag == 13) || (pidFlag == 14))) { + if (!((pidFlag == 5) || (pidFlag == 11) || (pidFlag == 13) || (pidFlag == 14))) { + if (cfgOpenPtEtaPhi) { vhistPhiPtEtaPosKaCen[currentBin]->Fill(trk.phi(), trk.pt(), trk.eta()); } + if (cfgOpenITSafter) { + if (cfgOpenITSTPCnSigma) { + vhistnSigmaITSTPCPtPosKaAfterCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.nSigmaKaITS(), trk.pt()); + } + if (cfgOpenClusSizenSigmaTPC) { + vhistAverClusterSizeCoslnSigmaTPCPtPosKaAfterCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.averClusterSizeCosl(), trk.pt()); + } + if (cfgOpenTOFITSnSigma) { + vhistnSigmaTOFITSPtPosKaAfterCen[currentBin]->Fill(trk.nSigmaKaTOF(), trk.nSigmaKaITS(), trk.pt()); + } + if (cfgOpenTOFTPCnSigma) { + vhistnSigmaTOFTPCPtPosKaAfterCen[currentBin]->Fill(trk.nSigmaKaTOF(), trk.nSigmaKaTPC(), trk.pt()); + } + } } if (cfgOpenITSTPCnSigma) { - if (!((pidFlag == 5) || (pidFlag == 11) || (pidFlag == 13) || (pidFlag == 14))) { - vhistnSigmaITSTPCPtPosKaAfterCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.nSigmaKaITS(), trk.pt()); - } vhistnSigmaITSTPCPtPosKaBeforeCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.nSigmaKaITS(), trk.pt()); } if (cfgOpenClusSizenSigmaTPC) { - if (!((pidFlag == 5) || (pidFlag == 11) || (pidFlag == 13) || (pidFlag == 14))) { - vhistAverClusterSizeCoslnSigmaTPCPtPosKaAfterCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.averClusterSizeCosl(), trk.pt()); - } vhistAverClusterSizeCoslnSigmaTPCPtPosKaBeforeCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.averClusterSizeCosl(), trk.pt()); } + if (cfgOpenTOFITSnSigma) { + vhistnSigmaTOFITSPtPosKaBeforeCen[currentBin]->Fill(trk.nSigmaKaTOF(), trk.nSigmaKaITS(), trk.pt()); + } + if (cfgOpenTOFTPCnSigma) { + vhistnSigmaTOFTPCPtPosKaBeforeCen[currentBin]->Fill(trk.nSigmaKaTOF(), trk.nSigmaKaTPC(), trk.pt()); + } } else if (trk.sign() < 0) { - if (cfgOpenPtEtaPhi) { - if (!((pidFlag == 5) || (pidFlag == 11) || (pidFlag == 13) || (pidFlag == 14))) { + if (!((pidFlag == 5) || (pidFlag == 11) || (pidFlag == 13) || (pidFlag == 14))) { + if (cfgOpenPtEtaPhi) { vhistPhiPtEtaNegKaCen[currentBin]->Fill(trk.phi(), trk.pt(), trk.eta()); } + if (cfgOpenITSafter) { + if (cfgOpenITSTPCnSigma) { + vhistnSigmaITSTPCPtNegKaAfterCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.nSigmaKaITS(), trk.pt()); + } + if (cfgOpenClusSizenSigmaTPC) { + vhistAverClusterSizeCoslnSigmaTPCPtNegKaAfterCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.averClusterSizeCosl(), trk.pt()); + } + if (cfgOpenTOFITSnSigma) { + vhistnSigmaTOFITSPtNegKaAfterCen[currentBin]->Fill(trk.nSigmaKaTOF(), trk.nSigmaKaITS(), trk.pt()); + } + if (cfgOpenTOFTPCnSigma) { + vhistnSigmaTOFTPCPtNegKaAfterCen[currentBin]->Fill(trk.nSigmaKaTOF(), trk.nSigmaKaTPC(), trk.pt()); + } + } } if (cfgOpenITSTPCnSigma) { - if (!((pidFlag == 5) || (pidFlag == 11) || (pidFlag == 13) || (pidFlag == 14))) { - vhistnSigmaITSTPCPtNegKaAfterCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.nSigmaKaITS(), trk.pt()); - } vhistnSigmaITSTPCPtNegKaBeforeCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.nSigmaKaITS(), trk.pt()); } if (cfgOpenClusSizenSigmaTPC) { - if (!((pidFlag == 5) || (pidFlag == 11) || (pidFlag == 13) || (pidFlag == 14))) { - vhistAverClusterSizeCoslnSigmaTPCPtNegKaAfterCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.averClusterSizeCosl(), trk.pt()); - } vhistAverClusterSizeCoslnSigmaTPCPtNegKaBeforeCen[currentBin]->Fill(trk.nSigmaKaTPC(), trk.averClusterSizeCosl(), trk.pt()); } + if (cfgOpenTOFITSnSigma) { + vhistnSigmaTOFITSPtNegKaBeforeCen[currentBin]->Fill(trk.nSigmaKaTOF(), trk.nSigmaKaITS(), trk.pt()); + } + if (cfgOpenTOFTPCnSigma) { + vhistnSigmaTOFTPCPtNegKaBeforeCen[currentBin]->Fill(trk.nSigmaKaTOF(), trk.nSigmaKaTPC(), trk.pt()); + } } } } if (cfgOpenPr) { if ((pidFlag == 3) || (pidFlag == 6) || (pidFlag == 8) || (pidFlag == 9) || (pidFlag == 10) || (pidFlag == 12) || (pidFlag == 13) || (pidFlag == 14)) { if (trk.sign() > 0) { - if (cfgOpenPtEtaPhi) { - if (!((pidFlag == 6) || (pidFlag == 12) || (pidFlag == 13) || (pidFlag == 14))) { + if (!((pidFlag == 6) || (pidFlag == 12) || (pidFlag == 13) || (pidFlag == 14))) { + if (cfgOpenPtEtaPhi) { vhistPhiPtEtaPosPrCen[currentBin]->Fill(trk.phi(), trk.pt(), trk.eta()); } + if (cfgOpenITSafter) { + if (cfgOpenITSTPCnSigma) { + vhistnSigmaITSTPCPtPosPrAfterCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.nSigmaPrITS(), trk.pt()); + } + if (cfgOpenClusSizenSigmaTPC) { + vhistAverClusterSizeCoslnSigmaTPCPtPosPrAfterCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.averClusterSizeCosl(), trk.pt()); + } + if (cfgOpenTOFITSnSigma) { + vhistnSigmaTOFITSPtPosPrAfterCen[currentBin]->Fill(trk.nSigmaPrTOF(), trk.nSigmaPrITS(), trk.pt()); + } + if (cfgOpenTOFTPCnSigma) { + vhistnSigmaTOFTPCPtPosPrAfterCen[currentBin]->Fill(trk.nSigmaPrTOF(), trk.nSigmaPrTPC(), trk.pt()); + } + } } if (cfgOpenITSTPCnSigma) { - if (!((pidFlag == 6) || (pidFlag == 12) || (pidFlag == 13) || (pidFlag == 14))) { - vhistnSigmaITSTPCPtPosPrAfterCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.nSigmaPrITS(), trk.pt()); - } vhistnSigmaITSTPCPtPosPrBeforeCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.nSigmaPrITS(), trk.pt()); } if (cfgOpenClusSizenSigmaTPC) { - if (!((pidFlag == 6) || (pidFlag == 12) || (pidFlag == 13) || (pidFlag == 14))) { - vhistAverClusterSizeCoslnSigmaTPCPtPosPrAfterCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.averClusterSizeCosl(), trk.pt()); - } vhistAverClusterSizeCoslnSigmaTPCPtPosPrBeforeCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.averClusterSizeCosl(), trk.pt()); } + if (cfgOpenTOFITSnSigma) { + vhistnSigmaTOFITSPtPosPrBeforeCen[currentBin]->Fill(trk.nSigmaPrTOF(), trk.nSigmaPrITS(), trk.pt()); + } + if (cfgOpenTOFTPCnSigma) { + vhistnSigmaTOFTPCPtPosPrBeforeCen[currentBin]->Fill(trk.nSigmaPrTOF(), trk.nSigmaPrTPC(), trk.pt()); + } } else if (trk.sign() < 0) { - if (cfgOpenPtEtaPhi) { - if (!((pidFlag == 6) || (pidFlag == 12) || (pidFlag == 13) || (pidFlag == 14))) { + if (!((pidFlag == 6) || (pidFlag == 12) || (pidFlag == 13) || (pidFlag == 14))) { + if (cfgOpenPtEtaPhi) { vhistPhiPtEtaNegPrCen[currentBin]->Fill(trk.phi(), trk.pt(), trk.eta()); } + if (cfgOpenITSafter) { + if (cfgOpenITSTPCnSigma) { + vhistnSigmaITSTPCPtNegPrAfterCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.nSigmaPrITS(), trk.pt()); + } + if (cfgOpenClusSizenSigmaTPC) { + vhistAverClusterSizeCoslnSigmaTPCPtNegPrAfterCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.averClusterSizeCosl(), trk.pt()); + } + if (cfgOpenTOFITSnSigma) { + vhistnSigmaTOFITSPtNegPrAfterCen[currentBin]->Fill(trk.nSigmaPrTOF(), trk.nSigmaPrITS(), trk.pt()); + } + if (cfgOpenTOFTPCnSigma) { + vhistnSigmaTOFTPCPtNegPrAfterCen[currentBin]->Fill(trk.nSigmaPrTOF(), trk.nSigmaPrTPC(), trk.pt()); + } + } } if (cfgOpenITSTPCnSigma) { - if (!((pidFlag == 6) || (pidFlag == 12) || (pidFlag == 13) || (pidFlag == 14))) { - vhistnSigmaITSTPCPtNegPrAfterCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.nSigmaPrITS(), trk.pt()); - } vhistnSigmaITSTPCPtNegPrBeforeCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.nSigmaPrITS(), trk.pt()); } if (cfgOpenClusSizenSigmaTPC) { - if (!((pidFlag == 6) || (pidFlag == 12) || (pidFlag == 13) || (pidFlag == 14))) { - vhistAverClusterSizeCoslnSigmaTPCPtNegPrAfterCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.averClusterSizeCosl(), trk.pt()); - } vhistAverClusterSizeCoslnSigmaTPCPtNegPrBeforeCen[currentBin]->Fill(trk.nSigmaPrTPC(), trk.averClusterSizeCosl(), trk.pt()); } + if (cfgOpenTOFITSnSigma) { + vhistnSigmaTOFITSPtNegPrBeforeCen[currentBin]->Fill(trk.nSigmaPrTOF(), trk.nSigmaPrITS(), trk.pt()); + } + if (cfgOpenTOFTPCnSigma) { + vhistnSigmaTOFTPCPtNegPrBeforeCen[currentBin]->Fill(trk.nSigmaPrTOF(), trk.nSigmaPrTPC(), trk.pt()); + } } } } @@ -1045,12 +1650,13 @@ struct pidcme { // o2-linter: disable=name/struct ConfigurableAxis cfgaxisT0C{"cfgaxisT0C", {70, 0, 70000}, "N_{ch} (T0C)"}; ConfigurableAxis cfgaxisT0A{"cfgaxisT0A", {200, 0, 200000}, "N_{ch} (T0A)"}; ConfigurableAxis cfgaxisNchPV{"cfgaxisNchPV", {4000, 0, 4000}, "N_{ch} (PV)"}; - ConfigurableAxis cfgaxisptPIDcme{"cfgaxisptPIDcme", {120, 0, 12}, "Binning for P_{t} PID"}; - ConfigurableAxis cfgnSigmaBinsTPCcme{"cfgnSigmaBinsTPCcme", {200, -5.f, 5.f}, "Binning for n sigma TPC"}; - ConfigurableAxis cfgnSigmaBinsITScme{"cfgnSigmaBinsITScme", {200, -5.f, 5.f}, "Binning for n sigma TPC"}; + ConfigurableAxis cfgaxisptPID{"cfgaxisptPID", {120, 0, 12}, "Binning for P_{t} PID"}; + ConfigurableAxis cfgnSigmaBinsTPC{"cfgnSigmaBinsTPC", {200, -5.f, 5.f}, "Binning for n sigma TPC"}; + ConfigurableAxis cfgnSigmaBinsITS{"cfgnSigmaBinsITS", {200, -5.f, 5.f}, "Binning for n sigma TPC"}; - ConfigurableAxis cfgaxissumpt{"cfgaxissumpt", {7, 1, 8}, "Binning for #gamma and #delta pt(particle1 + particle2)"}; - ConfigurableAxis cfgaxisdeltaeta{"cfgaxisdeltaeta", {5, 0, 1}, "Binning for #gamma and #delta |#eta(particle1 - particle2)|"}; + ConfigurableAxis cfgaxissumpt{"cfgaxissumpt", {16, 0, 16}, "Binning for #gamma and #delta sum p_{t}(particle1 + particle2)"}; + ConfigurableAxis cfgaxisdeltaeta{"cfgaxisdeltaeta", {16, -1.6, 1.6}, "Binning for #gamma and #delta #eta(particle1 - particle2)"}; + ConfigurableAxis cfgaxisdeltapt{"cfgaxisdeltapt", {16, -8, 8}, "Binning for #gamma and #delta p_{t}(particle1 - particle2)"}; Configurable cfgUseAdditionalEventCut{"cfgUseAdditionalEventCut", true, "Use additional event cut beyond sel8"}; Configurable cfgOpenEvSelkIsGoodZvtxFT0vsPV{"cfgOpenEvSelkIsGoodZvtxFT0vsPV", true, "removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference, use this cut at low multiplicities with caution"}; @@ -1060,10 +1666,16 @@ struct pidcme { // o2-linter: disable=name/struct Configurable cfgOpenEvSelkNoCollInRofStandard{"cfgOpenEvSelkNoCollInRofStandard", true, "no other collisions in this Readout Frame with per-collision multiplicity above threshold"}; Configurable cfgOpenEvSelkNoHighMultCollInPrevRof{"cfgOpenEvSelkNoHighMultCollInPrevRof", true, "veto an event if FT0C amplitude in previous ITS ROF is above threshold"}; Configurable cfgOpenEvSelOccupancy{"cfgOpenEvSelOccupancy", true, "Occupancy cut"}; - Configurable cfgOpenEvSelMultCorrelation{"cfgOpenEvSelMultCorrelation", true, "Multiplicity correlation cut"}; + Configurable cfgOpenEvSelMultCorrelationPVTracks{"cfgOpenEvSelMultCorrelationPVTracks", true, "Multiplicity correlation cut for PVtracks vs centrality(FT0C)"}; + Configurable cfgOpenEvSelMultCorrelationGlobalTracks{"cfgOpenEvSelMultCorrelationGlobalTracks", false, "Multiplicity correlation cut for Globaltracks vs centrality(FT0C)"}; Configurable cfgOpenEvSelV0AT0ACut{"cfgOpenEvSelV0AT0ACut", true, "V0A T0A 5 sigma cut"}; Configurable cfgOpenFullEventQA{"cfgOpenFullEventQA", true, "Open full QA plots for event QA"}; - Configurable cfgkOpenCME{"cfgkOpenCME", false, "open PID CME"}; + Configurable cfgkOpenV2{"cfgkOpenV2", true, "open V2 plots"}; + Configurable cfgkOpenCME{"cfgkOpenCME", true, "open PID CME"}; + Configurable cfgkOpenCMEDifferential{"cfgkOpenCMEDifferential", true, "open Differential plot(#delta pt, #delta eta, #average pt) for cme #delta and #gamma"}; + Configurable cfgkOpenDeltaPt{"cfgkOpenDeltaPt", true, "open CME Differential #Delta Pt"}; + Configurable cfgkOpenDeltaEta{"cfgkOpenDeltaEta", true, "open CME Differential #Delta Eta"}; + Configurable cfgkOpenAveragePt{"cfgkOpenAveragePt", true, "open CME Differential #Average Pt"}; Configurable cfgkOpenPiPi{"cfgkOpenPiPi", true, "open Pi-Pi"}; Configurable cfgkOpenKaKa{"cfgkOpenKaKa", true, "open Ka-Ka"}; Configurable cfgkOpenPrPr{"cfgkOpenPrPr", true, "open Pr-Pr"}; @@ -1075,6 +1687,11 @@ struct pidcme { // o2-linter: disable=name/struct Configurable cfgkOpenTPCITSPurityCut{"cfgkOpenTPCITSPurityCut", true, "open ITS-TPC purity cut"}; Configurable cfgkOpenTPCITSPurityCutQA{"cfgkOpenTPCITSPurityCutQA", true, "open ITS-TPC purity cut QA plots"}; Configurable cfgkOpenDebugPIDCME{"cfgkOpenDebugPIDCME", false, "open pidcme workflow debug mode"}; + Configurable cfgOpenPlotITSNcls{"cfgOpenPlotITSNcls", true, "open QA for overall ITSNcls distribution"}; + Configurable cfgOpenPlotITSNclsPtCent{"cfgOpenPlotITSNclsPtCent", false, "open QA for ITSNcls distribution vs centality and pt"}; + Configurable cfgOpenTPCNcls{"cfgOpenTPCNcls", true, "open QA for overall TPCNcls distribution"}; + Configurable cfgOpenTPCNclsPtCent{"cfgOpenTPCNclsPtCent", false, "open QA for TPCNcls distribution vs centality and pt"}; + Configurable cfgOpenCustomTrackCutAssurance{"cfgOpenCustomTrackCutAssurance", true, "Assure track using for v2 and cme pass the custom track cuts"}; Configurable> cfgITSPurityCen{"cfgITSPurityCen", {20, 30}, "ITS purity cut centrality"}; Configurable> cfgPtPrCut{"cfgPtPrCut", {0.5, 0.6, 0.7, 0.8, 0.9}, "pt binings for proton ITS purity cut"}; @@ -1132,9 +1749,9 @@ struct pidcme { // o2-linter: disable=name/struct Filter etafilter = aod::track::eta < cfgMaxEta; Filter properPIDfilter = aod::cme_track_pid_columns::nPidFlag >= (int8_t)0; - Partition>> tracksSet1 = ((aod::cme_track_pid_columns::nPidFlag == 1) || (aod::cme_track_pid_columns::nPidFlag == 7) || (aod::cme_track_pid_columns::nPidFlag == 8) || (aod::cme_track_pid_columns::nPidFlag == 10)); - Partition>> tracksSet2 = ((aod::cme_track_pid_columns::nPidFlag == 2) || (aod::cme_track_pid_columns::nPidFlag == 7) || (aod::cme_track_pid_columns::nPidFlag == 9) || (aod::cme_track_pid_columns::nPidFlag == 10)); - Partition>> tracksSet3 = ((aod::cme_track_pid_columns::nPidFlag == 3) || (aod::cme_track_pid_columns::nPidFlag == 8) || (aod::cme_track_pid_columns::nPidFlag == 9) || (aod::cme_track_pid_columns::nPidFlag == 10)); + Partition>> tracksSet1 = ((aod::cme_track_pid_columns::nPidFlag == 1) || (aod::cme_track_pid_columns::nPidFlag == 7) || (aod::cme_track_pid_columns::nPidFlag == 8) || (aod::cme_track_pid_columns::nPidFlag == 10)); + Partition>> tracksSet2 = ((aod::cme_track_pid_columns::nPidFlag == 2) || (aod::cme_track_pid_columns::nPidFlag == 7) || (aod::cme_track_pid_columns::nPidFlag == 9) || (aod::cme_track_pid_columns::nPidFlag == 10)); + Partition>> tracksSet3 = ((aod::cme_track_pid_columns::nPidFlag == 3) || (aod::cme_track_pid_columns::nPidFlag == 8) || (aod::cme_track_pid_columns::nPidFlag == 9) || (aod::cme_track_pid_columns::nPidFlag == 10)); void init(InitContext const&) { @@ -1181,16 +1798,19 @@ struct pidcme { // o2-linter: disable=name/struct AxisSpec axisPt{cfgaxispt, "trasverse momentum"}; AxisSpec axisCentMerged{cfgaxisCentMerged, "merged centrality for cme and PID v2"}; - AxisSpec axissumpt{cfgaxissumpt, "#it{p}_{T}^{sum}}"}; + AxisSpec axissumpt{cfgaxissumpt, "#it{p}_{T}^{sum}"}; AxisSpec axisdeltaeta{cfgaxisdeltaeta, "#Delta#eta"}; + AxisSpec axisdeltapt{cfgaxisdeltapt, "#Delta#it{p}_{T}"}; AxisSpec axisvertexz = {100, -15., 15., "vrtx_{Z} [cm]"}; + AxisSpec axisITSNcls = {10, -0.5, 9.5, "ITSNcls"}; + AxisSpec axisTPCNcls = {160, 0, 160, "TPCNcls"}; histosQA.add(Form("QA/histEventCount"), "", {HistType::kTH1F, {{3, 0.0, 3.0}}}); histosQA.get(HIST("QA/histEventCount"))->GetXaxis()->SetBinLabel(1, "Filtered event"); histosQA.get(HIST("QA/histEventCount"))->GetXaxis()->SetBinLabel(2, "after sel8"); histosQA.get(HIST("QA/histEventCount"))->GetXaxis()->SetBinLabel(3, "after additional event cut"); if (cfgUseAdditionalEventCut) { - histosQA.add(Form("QA/histEventCountDetail"), "Number of Event;; Count", {HistType::kTH1F, {{10, 0, 10}}}); + histosQA.add(Form("QA/histEventCountDetail"), "Number of Event;; Count", {HistType::kTH1F, {{11, 0, 11}}}); histosQA.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(1, "after sel8"); histosQA.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(2, "kIsGoodZvtxFT0vsPV"); histosQA.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(3, "kNoSameBunchPileup"); @@ -1199,8 +1819,9 @@ struct pidcme { // o2-linter: disable=name/struct histosQA.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(6, "kNoCollInRofStandard"); histosQA.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(7, "kNoHighMultCollInPrevRof"); histosQA.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(8, "occupancy"); - histosQA.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(9, "MultCorrelation"); - histosQA.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(10, "cfgEvSelV0AT0ACut"); + histosQA.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(9, "MultCorrelationPVTracks"); + histosQA.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(10, "MultCorrelationGlobalTracks"); + histosQA.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(11, "cfgEvSelV0AT0ACut"); } if (cfgOpenFullEventQA) { histosQA.add("QA/hist_globalTracks_centT0C_before", "before cut;Centrality T0C;mulplicity global tracks", {HistType::kTH2D, {cfgaxisCentForQA, cfgaxisNch}}); @@ -1232,36 +1853,85 @@ struct pidcme { // o2-linter: disable=name/struct histosQA.add(Form("QA/histQvecRes_SigRefBV2"), "", {HistType::kTH2F, {axisQvecF, axisCent}}); histosQA.add(Form("QA/histQvecRes_RefARefBV2"), "", {HistType::kTH2F, {axisQvecF, axisCent}}); - histosQA.add(Form("V2/histCosDetV2"), "", {HistType::kTH3F, {axisCentMerged, axisPt, axisCos}}); - histosQA.add(Form("V2/histSinDetV2"), "", {HistType::kTH3F, {axisCentMerged, axisPt, axisCos}}); - - histosQA.add(Form("V2/PID/histCosDetV2_Pi"), "", {HistType::kTH3F, {axisCentMerged, axisPt, axisCos}}); - histosQA.add(Form("V2/PID/histCosDetV2_Ka"), "", {HistType::kTH3F, {axisCentMerged, axisPt, axisCos}}); - histosQA.add(Form("V2/PID/histCosDetV2_Pr"), "", {HistType::kTH3F, {axisCentMerged, axisPt, axisCos}}); - histosQA.add(Form("V2/PID/histCosDetV2_Pi_Neg"), "", {HistType::kTH3F, {axisCentMerged, axisPt, axisCos}}); - histosQA.add(Form("V2/PID/histCosDetV2_Ka_Neg"), "", {HistType::kTH3F, {axisCentMerged, axisPt, axisCos}}); - histosQA.add(Form("V2/PID/histCosDetV2_Pr_Neg"), "", {HistType::kTH3F, {axisCentMerged, axisPt, axisCos}}); + if (cfgkOpenV2) { + histosQA.add(Form("V2/histCosDetV2"), "", {HistType::kTH3F, {axisCentMerged, axisPt, axisCos}}); + histosQA.add(Form("V2/histSinDetV2"), "", {HistType::kTH3F, {axisCentMerged, axisPt, axisCos}}); + histosQA.add(Form("V2/PID/histCosDetV2_Pi"), "", {HistType::kTH3F, {axisCentMerged, axisPt, axisCos}}); + histosQA.add(Form("V2/PID/histCosDetV2_Ka"), "", {HistType::kTH3F, {axisCentMerged, axisPt, axisCos}}); + histosQA.add(Form("V2/PID/histCosDetV2_Pr"), "", {HistType::kTH3F, {axisCentMerged, axisPt, axisCos}}); + histosQA.add(Form("V2/PID/histCosDetV2_Pi_Neg"), "", {HistType::kTH3F, {axisCentMerged, axisPt, axisCos}}); + histosQA.add(Form("V2/PID/histCosDetV2_Ka_Neg"), "", {HistType::kTH3F, {axisCentMerged, axisPt, axisCos}}); + histosQA.add(Form("V2/PID/histCosDetV2_Pr_Neg"), "", {HistType::kTH3F, {axisCentMerged, axisPt, axisCos}}); + } if (cfgkOpenTPCITSPurityCut && cfgkOpenTPCITSPurityCutQA) { - histosQA.add(Form("QA/histITSPuritycheck_Pr_Pos_Cen_20_30"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgnSigmaBinsITScme, cfgaxisptPIDcme}}); - histosQA.add(Form("QA/histITSPuritycheck_Pr_Neg_Cen_20_30"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPCcme, cfgnSigmaBinsITScme, cfgaxisptPIDcme}}); + histosQA.add(Form("QA/histITSPuritycheck_Pr_Pos_Cen_20_30"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPC, cfgnSigmaBinsITS, cfgaxisptPID}}); + histosQA.add(Form("QA/histITSPuritycheck_Pr_Neg_Cen_20_30"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {cfgnSigmaBinsTPC, cfgnSigmaBinsITS, cfgaxisptPID}}); + } + if (cfgOpenPlotITSNcls) { + histosQA.add(Form("QA/histITSNcls_PosPi"), ";ITSNcls;counts", {HistType::kTH1F, {axisITSNcls}}); + histosQA.add(Form("QA/histITSNcls_NegPi"), ";ITSNcls;counts", {HistType::kTH1F, {axisITSNcls}}); + histosQA.add(Form("QA/histITSNcls_PosKa"), ";ITSNcls;counts", {HistType::kTH1F, {axisITSNcls}}); + histosQA.add(Form("QA/histITSNcls_NegKa"), ";ITSNcls;counts", {HistType::kTH1F, {axisITSNcls}}); + histosQA.add(Form("QA/histITSNcls_PosPr"), ";ITSNcls;counts", {HistType::kTH1F, {axisITSNcls}}); + histosQA.add(Form("QA/histITSNcls_NegPr"), ";ITSNcls;counts", {HistType::kTH1F, {axisITSNcls}}); + } + if (cfgOpenPlotITSNclsPtCent) { + histosQA.add(Form("QA/histITSNclsPtCent_PosPi"), ";ITSNcls;Pt;Centrality", {HistType::kTH3F, {axisITSNcls, axisPt, axisCentMerged}}); + histosQA.add(Form("QA/histITSNclsPtCent_NegPi"), ";ITSNcls;Pt;Centrality", {HistType::kTH3F, {axisITSNcls, axisPt, axisCentMerged}}); + histosQA.add(Form("QA/histITSNclsPtCent_PosKa"), ";ITSNcls;Pt;Centrality", {HistType::kTH3F, {axisITSNcls, axisPt, axisCentMerged}}); + histosQA.add(Form("QA/histITSNclsPtCent_NegKa"), ";ITSNcls;Pt;Centrality", {HistType::kTH3F, {axisITSNcls, axisPt, axisCentMerged}}); + histosQA.add(Form("QA/histITSNclsPtCent_PosPr"), ";ITSNcls;Pt;Centrality", {HistType::kTH3F, {axisITSNcls, axisPt, axisCentMerged}}); + histosQA.add(Form("QA/histITSNclsPtCent_NegPr"), ";ITSNcls;Pt;Centrality", {HistType::kTH3F, {axisITSNcls, axisPt, axisCentMerged}}); + } + if (cfgOpenTPCNcls) { + histosQA.add(Form("QA/histTPCNcls_PosPi"), ";TPCNcls;counts", {HistType::kTH1F, {axisTPCNcls}}); + histosQA.add(Form("QA/histTPCNcls_NegPi"), ";TPCNcls;counts", {HistType::kTH1F, {axisTPCNcls}}); + histosQA.add(Form("QA/histTPCNcls_PosKa"), ";TPCNcls;counts", {HistType::kTH1F, {axisTPCNcls}}); + histosQA.add(Form("QA/histTPCNcls_NegKa"), ";TPCNcls;counts", {HistType::kTH1F, {axisTPCNcls}}); + histosQA.add(Form("QA/histTPCNcls_PosPr"), ";TPCNcls;counts", {HistType::kTH1F, {axisTPCNcls}}); + histosQA.add(Form("QA/histTPCNcls_NegPr"), ";TPCNcls;counts", {HistType::kTH1F, {axisTPCNcls}}); + } + if (cfgOpenTPCNclsPtCent) { + histosQA.add(Form("QA/histTPCNclsPtCent_PosPi"), ";TPCNcls;Pt;Centrality", {HistType::kTH3F, {axisTPCNcls, axisPt, axisCentMerged}}); + histosQA.add(Form("QA/histTPCNclsPtCent_NegPi"), ";TPCNcls;Pt;Centrality", {HistType::kTH3F, {axisTPCNcls, axisPt, axisCentMerged}}); + histosQA.add(Form("QA/histTPCNclsPtCent_PosKa"), ";TPCNcls;Pt;Centrality", {HistType::kTH3F, {axisTPCNcls, axisPt, axisCentMerged}}); + histosQA.add(Form("QA/histTPCNclsPtCent_NegKa"), ";TPCNcls;Pt;Centrality", {HistType::kTH3F, {axisTPCNcls, axisPt, axisCentMerged}}); + histosQA.add(Form("QA/histTPCNclsPtCent_PosPr"), ";TPCNcls;Pt;Centrality", {HistType::kTH3F, {axisTPCNcls, axisPt, axisCentMerged}}); + histosQA.add(Form("QA/histTPCNclsPtCent_NegPr"), ";TPCNcls;Pt;Centrality", {HistType::kTH3F, {axisTPCNcls, axisPt, axisCentMerged}}); } if (cfgkOpenCME) { if (cfgkOpenPiPi) { - histosQA.add(Form("PIDCME/histgamama_PiPi_ss"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_PiPi_os"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_PiPi_ss"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_PiPi_os"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_PiPi_ss"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_PiPi_os"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/Differential/histgamama_PiPi_ss_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); - histosQA.add(Form("PIDCME/Differential/histgamama_PiPi_os_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); - histosQA.add(Form("PIDCME/Differential/histdelta_PiPi_ss_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); - histosQA.add(Form("PIDCME/Differential/histdelta_PiPi_os_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); + if (cfgkOpenCMEDifferential) { + if (cfgkOpenDeltaPt) { + histosQA.add("PIDCME/Differential/histgamma_PiPi_ss_DPt", ";centrality;#Delta #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + histosQA.add("PIDCME/Differential/histgamma_PiPi_os_DPt", ";centrality;#Delta #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + histosQA.add("PIDCME/Differential/histdelta_PiPi_ss_DPt", ";centrality;#Delta #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + histosQA.add("PIDCME/Differential/histdelta_PiPi_os_DPt", ";centrality;#Delta #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + } + if (cfgkOpenDeltaEta) { + histosQA.add("PIDCME/Differential/histgamma_PiPi_ss_DEt", ";centrality;#Delta #eta;#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + histosQA.add("PIDCME/Differential/histgamma_PiPi_os_DEt", ";centrality;#Delta #eta;#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + histosQA.add("PIDCME/Differential/histdelta_PiPi_ss_DEt", ";centrality;#Delta #eta;#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + histosQA.add("PIDCME/Differential/histdelta_PiPi_os_DEt", ";centrality;#Delta #eta;#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + } + if (cfgkOpenAveragePt) { + histosQA.add("PIDCME/Differential/histgamma_PiPi_ss_SPt", ";centrality;Sum #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + histosQA.add("PIDCME/Differential/histgamma_PiPi_os_SPt", ";centrality;Sum #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + histosQA.add("PIDCME/Differential/histdelta_PiPi_ss_SPt", ";centrality;Sum #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + histosQA.add("PIDCME/Differential/histdelta_PiPi_os_SPt", ";centrality;Sum #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + } + } if (cfgkOpenSsOsCrossCheck) { - histosQA.add(Form("PIDCME/histgamama_PiPi_PP"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_PiPi_NN"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_PiPi_PN"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_PiPi_NP"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_PiPi_PP"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_PiPi_NN"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_PiPi_PN"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_PiPi_NP"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_PiPi_PP"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_PiPi_NN"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_PiPi_PN"), "", {HistType::kTProfile, {axisCentMerged}}); @@ -1269,19 +1939,35 @@ struct pidcme { // o2-linter: disable=name/struct } } if (cfgkOpenKaKa) { - histosQA.add(Form("PIDCME/histgamama_KaKa_ss"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_KaKa_os"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_KaKa_ss"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_KaKa_os"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_KaKa_ss"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_KaKa_os"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/Differential/histgamama_KaKa_ss_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); - histosQA.add(Form("PIDCME/Differential/histgamama_KaKa_os_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); - histosQA.add(Form("PIDCME/Differential/histdelta_KaKa_ss_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); - histosQA.add(Form("PIDCME/Differential/histdelta_KaKa_os_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); + if (cfgkOpenCMEDifferential) { + if (cfgkOpenDeltaPt) { + histosQA.add("PIDCME/Differential/histgamma_KaKa_ss_DPt", ";centrality;#Delta #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + histosQA.add("PIDCME/Differential/histgamma_KaKa_os_DPt", ";centrality;#Delta #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + histosQA.add("PIDCME/Differential/histdelta_KaKa_ss_DPt", ";centrality;#Delta #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + histosQA.add("PIDCME/Differential/histdelta_KaKa_os_DPt", ";centrality;#Delta #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + } + if (cfgkOpenDeltaEta) { + histosQA.add("PIDCME/Differential/histgamma_KaKa_ss_DEt", ";centrality;#Delta #eta;#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + histosQA.add("PIDCME/Differential/histgamma_KaKa_os_DEt", ";centrality;#Delta #eta;#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + histosQA.add("PIDCME/Differential/histdelta_KaKa_ss_DEt", ";centrality;#Delta #eta;#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + histosQA.add("PIDCME/Differential/histdelta_KaKa_os_DEt", ";centrality;#Delta #eta;#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + } + if (cfgkOpenAveragePt) { + histosQA.add("PIDCME/Differential/histgamma_KaKa_ss_SPt", ";centrality;Sum #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + histosQA.add("PIDCME/Differential/histgamma_KaKa_os_SPt", ";centrality;Sum #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + histosQA.add("PIDCME/Differential/histdelta_KaKa_ss_SPt", ";centrality;Sum #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + histosQA.add("PIDCME/Differential/histdelta_KaKa_os_SPt", ";centrality;Sum #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + } + } if (cfgkOpenSsOsCrossCheck) { - histosQA.add(Form("PIDCME/histgamama_KaKa_PP"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_KaKa_NN"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_KaKa_PN"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_KaKa_NP"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_KaKa_PP"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_KaKa_NN"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_KaKa_PN"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_KaKa_NP"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_KaKa_PP"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_KaKa_NN"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_KaKa_PN"), "", {HistType::kTProfile, {axisCentMerged}}); @@ -1289,19 +1975,35 @@ struct pidcme { // o2-linter: disable=name/struct } } if (cfgkOpenPrPr) { - histosQA.add(Form("PIDCME/histgamama_PrPr_ss"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_PrPr_os"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_PrPr_ss"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_PrPr_os"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_PrPr_ss"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_PrPr_os"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/Differential/histgamama_PrPr_ss_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); - histosQA.add(Form("PIDCME/Differential/histgamama_PrPr_os_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); - histosQA.add(Form("PIDCME/Differential/histdelta_PrPr_ss_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); - histosQA.add(Form("PIDCME/Differential/histdelta_PrPr_os_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); + if (cfgkOpenCMEDifferential) { + if (cfgkOpenDeltaPt) { + histosQA.add("PIDCME/Differential/histgamma_PrPr_ss_DPt", ";centrality;#Delta #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + histosQA.add("PIDCME/Differential/histgamma_PrPr_os_DPt", ";centrality;#Delta #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + histosQA.add("PIDCME/Differential/histdelta_PrPr_ss_DPt", ";centrality;#Delta #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + histosQA.add("PIDCME/Differential/histdelta_PrPr_os_DPt", ";centrality;#Delta #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + } + if (cfgkOpenDeltaEta) { + histosQA.add("PIDCME/Differential/histgamma_PrPr_ss_DEt", ";centrality;#Delta #eta;#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + histosQA.add("PIDCME/Differential/histgamma_PrPr_os_DEt", ";centrality;#Delta #eta;#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + histosQA.add("PIDCME/Differential/histdelta_PrPr_ss_DEt", ";centrality;#Delta #eta;#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + histosQA.add("PIDCME/Differential/histdelta_PrPr_os_DEt", ";centrality;#Delta #eta;#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + } + if (cfgkOpenAveragePt) { + histosQA.add("PIDCME/Differential/histgamma_PrPr_ss_SPt", ";centrality;Sum #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + histosQA.add("PIDCME/Differential/histgamma_PrPr_os_SPt", ";centrality;Sum #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + histosQA.add("PIDCME/Differential/histdelta_PrPr_ss_SPt", ";centrality;Sum #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + histosQA.add("PIDCME/Differential/histdelta_PrPr_os_SPt", ";centrality;Sum #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + } + } if (cfgkOpenSsOsCrossCheck) { - histosQA.add(Form("PIDCME/histgamama_PrPr_PP"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_PrPr_NN"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_PrPr_PN"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_PrPr_NP"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_PrPr_PP"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_PrPr_NN"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_PrPr_PN"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_PrPr_NP"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_PrPr_PP"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_PrPr_NN"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_PrPr_PN"), "", {HistType::kTProfile, {axisCentMerged}}); @@ -1309,19 +2011,35 @@ struct pidcme { // o2-linter: disable=name/struct } } if (cfgkOpenPiKa) { - histosQA.add(Form("PIDCME/histgamama_PiKa_ss"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_PiKa_os"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_PiKa_ss"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_PiKa_os"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_PiKa_ss"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_PiKa_os"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/Differential/histgamama_PiKa_ss_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); - histosQA.add(Form("PIDCME/Differential/histgamama_PiKa_os_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); - histosQA.add(Form("PIDCME/Differential/histdelta_PiKa_ss_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); - histosQA.add(Form("PIDCME/Differential/histdelta_PiKa_os_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); + if (cfgkOpenCMEDifferential) { + if (cfgkOpenDeltaPt) { + histosQA.add("PIDCME/Differential/histgamma_PiKa_ss_DPt", ";centrality;#Delta #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + histosQA.add("PIDCME/Differential/histgamma_PiKa_os_DPt", ";centrality;#Delta #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + histosQA.add("PIDCME/Differential/histdelta_PiKa_ss_DPt", ";centrality;#Delta #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + histosQA.add("PIDCME/Differential/histdelta_PiKa_os_DPt", ";centrality;#Delta #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + } + if (cfgkOpenDeltaEta) { + histosQA.add("PIDCME/Differential/histgamma_PiKa_ss_DEt", ";centrality;#Delta #eta;#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + histosQA.add("PIDCME/Differential/histgamma_PiKa_os_DEt", ";centrality;#Delta #eta;#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + histosQA.add("PIDCME/Differential/histdelta_PiKa_ss_DEt", ";centrality;#Delta #eta;#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + histosQA.add("PIDCME/Differential/histdelta_PiKa_os_DEt", ";centrality;#Delta #eta;#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + } + if (cfgkOpenAveragePt) { + histosQA.add("PIDCME/Differential/histgamma_PiKa_ss_SPt", ";centrality;Sum #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + histosQA.add("PIDCME/Differential/histgamma_PiKa_os_SPt", ";centrality;Sum #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + histosQA.add("PIDCME/Differential/histdelta_PiKa_ss_SPt", ";centrality;Sum #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + histosQA.add("PIDCME/Differential/histdelta_PiKa_os_SPt", ";centrality;Sum #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + } + } if (cfgkOpenSsOsCrossCheck) { - histosQA.add(Form("PIDCME/histgamama_PiKa_PP"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_PiKa_NN"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_PiKa_PN"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_PiKa_NP"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_PiKa_PP"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_PiKa_NN"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_PiKa_PN"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_PiKa_NP"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_PiKa_PP"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_PiKa_NN"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_PiKa_PN"), "", {HistType::kTProfile, {axisCentMerged}}); @@ -1329,19 +2047,35 @@ struct pidcme { // o2-linter: disable=name/struct } } if (cfgkOpenPiPr) { - histosQA.add(Form("PIDCME/histgamama_PiPr_ss"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_PiPr_os"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_PiPr_ss"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_PiPr_os"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_PiPr_ss"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_PiPr_os"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/Differential/histgamama_PiPr_ss_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); - histosQA.add(Form("PIDCME/Differential/histgamama_PiPr_os_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); - histosQA.add(Form("PIDCME/Differential/histdelta_PiPr_ss_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); - histosQA.add(Form("PIDCME/Differential/histdelta_PiPr_os_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); + if (cfgkOpenCMEDifferential) { + if (cfgkOpenDeltaPt) { + histosQA.add("PIDCME/Differential/histgamma_PiPr_ss_DPt", ";centrality;#Delta #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + histosQA.add("PIDCME/Differential/histgamma_PiPr_os_DPt", ";centrality;#Delta #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + histosQA.add("PIDCME/Differential/histdelta_PiPr_ss_DPt", ";centrality;#Delta #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + histosQA.add("PIDCME/Differential/histdelta_PiPr_os_DPt", ";centrality;#Delta #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + } + if (cfgkOpenDeltaEta) { + histosQA.add("PIDCME/Differential/histgamma_PiPr_ss_DEt", ";centrality;#Delta #eta;#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + histosQA.add("PIDCME/Differential/histgamma_PiPr_os_DEt", ";centrality;#Delta #eta;#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + histosQA.add("PIDCME/Differential/histdelta_PiPr_ss_DEt", ";centrality;#Delta #eta;#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + histosQA.add("PIDCME/Differential/histdelta_PiPr_os_DEt", ";centrality;#Delta #eta;#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + } + if (cfgkOpenAveragePt) { + histosQA.add("PIDCME/Differential/histgamma_PiPr_ss_SPt", ";centrality;Sum #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + histosQA.add("PIDCME/Differential/histgamma_PiPr_os_SPt", ";centrality;Sum #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + histosQA.add("PIDCME/Differential/histdelta_PiPr_ss_SPt", ";centrality;Sum #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + histosQA.add("PIDCME/Differential/histdelta_PiPr_os_SPt", ";centrality;Sum #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + } + } if (cfgkOpenSsOsCrossCheck) { - histosQA.add(Form("PIDCME/histgamama_PiPr_PP"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_PiPr_NN"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_PiPr_PN"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_PiPr_NP"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_PiPr_PP"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_PiPr_NN"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_PiPr_PN"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_PiPr_NP"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_PiPr_PP"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_PiPr_NN"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_PiPr_PN"), "", {HistType::kTProfile, {axisCentMerged}}); @@ -1349,19 +2083,35 @@ struct pidcme { // o2-linter: disable=name/struct } } if (cfgkOpenKaPr) { - histosQA.add(Form("PIDCME/histgamama_KaPr_ss"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_KaPr_os"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_KaPr_ss"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_KaPr_os"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_KaPr_ss"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_KaPr_os"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/Differential/histgamama_KaPr_ss_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); - histosQA.add(Form("PIDCME/Differential/histgamama_KaPr_os_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); - histosQA.add(Form("PIDCME/Differential/histdelta_KaPr_ss_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); - histosQA.add(Form("PIDCME/Differential/histdelta_KaPr_os_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); + if (cfgkOpenCMEDifferential) { + if (cfgkOpenDeltaPt) { + histosQA.add("PIDCME/Differential/histgamma_KaPr_ss_DPt", ";centrality;#Delta #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + histosQA.add("PIDCME/Differential/histgamma_KaPr_os_DPt", ";centrality;#Delta #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + histosQA.add("PIDCME/Differential/histdelta_KaPr_ss_DPt", ";centrality;#Delta #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + histosQA.add("PIDCME/Differential/histdelta_KaPr_os_DPt", ";centrality;#Delta #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + } + if (cfgkOpenDeltaEta) { + histosQA.add("PIDCME/Differential/histgamma_KaPr_ss_DEt", ";centrality;#Delta #eta;#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + histosQA.add("PIDCME/Differential/histgamma_KaPr_os_DEt", ";centrality;#Delta #eta;#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + histosQA.add("PIDCME/Differential/histdelta_KaPr_ss_DEt", ";centrality;#Delta #eta;#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + histosQA.add("PIDCME/Differential/histdelta_KaPr_os_DEt", ";centrality;#Delta #eta;#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + } + if (cfgkOpenAveragePt) { + histosQA.add("PIDCME/Differential/histgamma_KaPr_ss_SPt", ";centrality;Sum #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + histosQA.add("PIDCME/Differential/histgamma_KaPr_os_SPt", ";centrality;Sum #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + histosQA.add("PIDCME/Differential/histdelta_KaPr_ss_SPt", ";centrality;Sum #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + histosQA.add("PIDCME/Differential/histdelta_KaPr_os_SPt", ";centrality;Sum #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + } + } if (cfgkOpenSsOsCrossCheck) { - histosQA.add(Form("PIDCME/histgamama_KaPr_PP"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_KaPr_NN"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_KaPr_PN"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_KaPr_NP"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_KaPr_PP"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_KaPr_NN"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_KaPr_PN"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_KaPr_NP"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_KaPr_PP"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_KaPr_NN"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_KaPr_PN"), "", {HistType::kTProfile, {axisCentMerged}}); @@ -1369,19 +2119,35 @@ struct pidcme { // o2-linter: disable=name/struct } } if (cfgkOpenHaHa) { - histosQA.add(Form("PIDCME/histgamama_HaHa_ss"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_HaHa_os"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_HaHa_ss"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_HaHa_os"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_HaHa_ss"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_HaHa_os"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/Differential/histgamama_HaHa_ss_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); - histosQA.add(Form("PIDCME/Differential/histgamama_HaHa_os_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); - histosQA.add(Form("PIDCME/Differential/histdelta_HaHa_ss_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); - histosQA.add(Form("PIDCME/Differential/histdelta_HaHa_os_Dif"), "", {HistType::kTProfile3D, {axisCentMerged, axissumpt, axisdeltaeta}}); + if (cfgkOpenCMEDifferential) { + if (cfgkOpenDeltaPt) { + histosQA.add("PIDCME/Differential/histgamma_HaHa_ss_DPt", ";centrality;#Delta #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + histosQA.add("PIDCME/Differential/histgamma_HaHa_os_DPt", ";centrality;#Delta #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + histosQA.add("PIDCME/Differential/histdelta_HaHa_ss_DPt", ";centrality;#Delta #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + histosQA.add("PIDCME/Differential/histdelta_HaHa_os_DPt", ";centrality;#Delta #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltapt}}); + } + if (cfgkOpenDeltaEta) { + histosQA.add("PIDCME/Differential/histgamma_HaHa_ss_DEt", ";centrality;#Delta #eta;#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + histosQA.add("PIDCME/Differential/histgamma_HaHa_os_DEt", ";centrality;#Delta #eta;#gamma", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + histosQA.add("PIDCME/Differential/histdelta_HaHa_ss_DEt", ";centrality;#Delta #eta;#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + histosQA.add("PIDCME/Differential/histdelta_HaHa_os_DEt", ";centrality;#Delta #eta;#delta", {HistType::kTProfile2D, {axisCentMerged, axisdeltaeta}}); + } + if (cfgkOpenAveragePt) { + histosQA.add("PIDCME/Differential/histgamma_HaHa_ss_SPt", ";centrality;Sum #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + histosQA.add("PIDCME/Differential/histgamma_HaHa_os_SPt", ";centrality;Sum #p_{T};#gamma", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + histosQA.add("PIDCME/Differential/histdelta_HaHa_ss_SPt", ";centrality;Sum #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + histosQA.add("PIDCME/Differential/histdelta_HaHa_os_SPt", ";centrality;Sum #p_{T};#delta", {HistType::kTProfile2D, {axisCentMerged, axissumpt}}); + } + } if (cfgkOpenSsOsCrossCheck) { - histosQA.add(Form("PIDCME/histgamama_HaHa_PP"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_HaHa_NN"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_HaHa_PN"), "", {HistType::kTProfile, {axisCentMerged}}); - histosQA.add(Form("PIDCME/histgamama_HaHa_NP"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_HaHa_PP"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_HaHa_NN"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_HaHa_PN"), "", {HistType::kTProfile, {axisCentMerged}}); + histosQA.add(Form("PIDCME/histgamma_HaHa_NP"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_HaHa_PP"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_HaHa_NN"), "", {HistType::kTProfile, {axisCentMerged}}); histosQA.add(Form("PIDCME/histdelta_HaHa_PN"), "", {HistType::kTProfile, {axisCentMerged}}); @@ -1471,24 +2237,29 @@ struct pidcme { // o2-linter: disable=name/struct if (cfgOpenEvSelOccupancy) { histosQA.fill(HIST("QA/histEventCountDetail"), 7.5); } - if (cfgOpenEvSelMultCorrelation) { + if (cfgOpenEvSelMultCorrelationPVTracks) { if (multNTracksPV < fMultPVCutLow->Eval(centrality)) return 0; if (multNTracksPV > fMultPVCutHigh->Eval(centrality)) return 0; + } + if (cfgOpenEvSelMultCorrelationPVTracks) { + histosQA.fill(HIST("QA/histEventCountDetail"), 8.5); + } + if (cfgOpenEvSelMultCorrelationGlobalTracks) { if (multTrk < fMultCutLow->Eval(centrality)) return 0; if (multTrk > fMultCutHigh->Eval(centrality)) return 0; } - if (cfgOpenEvSelMultCorrelation) { - histosQA.fill(HIST("QA/histEventCountDetail"), 8.5); + if (cfgOpenEvSelMultCorrelationGlobalTracks) { + histosQA.fill(HIST("QA/histEventCountDetail"), 9.5); } if (cfgOpenEvSelV0AT0ACut && (std::fabs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > 5 * fT0AV0ASigma->Eval(collision.multFT0A()))) { return 0; } if (cfgOpenEvSelV0AT0ACut) { - histosQA.fill(HIST("QA/histEventCountDetail"), 9.5); + histosQA.fill(HIST("QA/histEventCountDetail"), 10.5); } return 1; } @@ -1499,20 +2270,22 @@ struct pidcme { // o2-linter: disable=name/struct if (cfgkOpenDebugPIDCME) { LOGF(info, "====================Entering track selection============================="); } - if (!track.passedITSNCls()) - return false; - if (!track.passedITSChi2NDF()) - return false; - if (!track.passedITSHits()) - return false; - if (!track.passedTPCCrossedRowsOverNCls()) - return false; - if (!track.passedTPCChi2NDF()) - return false; - if (!track.passedDCAxy()) - return false; - if (!track.passedDCAz()) - return false; + if (cfgOpenCustomTrackCutAssurance) { + if (!track.passedITSNCls()) + return false; + if (!track.passedITSChi2NDF()) + return false; + if (!track.passedITSHits()) + return false; + if (!track.passedTPCCrossedRowsOverNCls()) + return false; + if (!track.passedTPCChi2NDF()) + return false; + if (!track.passedDCAxy()) + return false; + if (!track.passedDCAz()) + return false; + } if (cfgkOpenTPCITSPurityCut) { int cenBin = -1; int ptBin = -1; @@ -1595,42 +2368,116 @@ struct pidcme { // o2-linter: disable=name/struct auto cent = collision.centFT0C(); int detInd = detId * 4 + cfgnTotalSystem * 4 * (nmode - 2); float psiN = helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode); - for (const auto& trk : track1) { - if (!selTrack(trk, cent)) - continue; - if (nmode == 2) { - if (trk.sign() > 0) { - histosQA.fill(HIST("V2/PID/histCosDetV2_Pi"), cent, trk.pt(), - std::cos(static_cast(nmode) * (trk.phi() - psiN))); - } else if (trk.sign() < 0) { - histosQA.fill(HIST("V2/PID/histCosDetV2_Pi_Neg"), cent, trk.pt(), - std::cos(static_cast(nmode) * (trk.phi() - psiN))); + if (cfgkOpenV2) { + for (const auto& trk : track1) { + if (!selTrack(trk, cent)) + continue; + if (nmode == 2) { + if (trk.sign() > 0) { + histosQA.fill(HIST("V2/PID/histCosDetV2_Pi"), cent, trk.pt(), + std::cos(static_cast(nmode) * (trk.phi() - psiN))); + if (cfgOpenPlotITSNcls) { + histosQA.fill(HIST("QA/histITSNcls_PosPi"), trk.itsNCls()); + } + if (cfgOpenPlotITSNclsPtCent) { + histosQA.fill(HIST("QA/histITSNclsPtCent_PosPi"), trk.itsNCls(), trk.pt(), cent); + } + if (cfgOpenTPCNcls) { + histosQA.fill(HIST("QA/histTPCNcls_PosPi"), trk.tpcNClsFound()); + } + if (cfgOpenTPCNclsPtCent) { + histosQA.fill(HIST("QA/histTPCNclsPtCent_PosPi"), trk.tpcNClsFound(), trk.pt(), cent); + } + } else if (trk.sign() < 0) { + histosQA.fill(HIST("V2/PID/histCosDetV2_Pi_Neg"), cent, trk.pt(), + std::cos(static_cast(nmode) * (trk.phi() - psiN))); + if (cfgOpenPlotITSNcls) { + histosQA.fill(HIST("QA/histITSNcls_NegPi"), trk.itsNCls()); + } + if (cfgOpenPlotITSNclsPtCent) { + histosQA.fill(HIST("QA/histITSNclsPtCent_NegPi"), trk.itsNCls(), trk.pt(), cent); + } + if (cfgOpenTPCNcls) { + histosQA.fill(HIST("QA/histTPCNcls_NegPi"), trk.tpcNClsFound()); + } + if (cfgOpenTPCNclsPtCent) { + histosQA.fill(HIST("QA/histTPCNclsPtCent_NegPi"), trk.tpcNClsFound(), trk.pt(), cent); + } + } } } - } - for (const auto& trk : track2) { - if (!selTrack(trk, cent)) - continue; - if (nmode == 2) { - if (trk.sign() > 0) { - histosQA.fill(HIST("V2/PID/histCosDetV2_Ka"), cent, trk.pt(), - std::cos(static_cast(nmode) * (trk.phi() - psiN))); - } else if (trk.sign() < 0) { - histosQA.fill(HIST("V2/PID/histCosDetV2_Ka_Neg"), cent, trk.pt(), - std::cos(static_cast(nmode) * (trk.phi() - psiN))); + for (const auto& trk : track2) { + if (!selTrack(trk, cent)) + continue; + if (nmode == 2) { + if (trk.sign() > 0) { + histosQA.fill(HIST("V2/PID/histCosDetV2_Ka"), cent, trk.pt(), + std::cos(static_cast(nmode) * (trk.phi() - psiN))); + if (cfgOpenPlotITSNcls) { + histosQA.fill(HIST("QA/histITSNcls_PosKa"), trk.itsNCls()); + } + if (cfgOpenPlotITSNclsPtCent) { + histosQA.fill(HIST("QA/histITSNclsPtCent_PosKa"), trk.itsNCls(), trk.pt(), cent); + } + if (cfgOpenTPCNcls) { + histosQA.fill(HIST("QA/histTPCNcls_PosKa"), trk.tpcNClsFound()); + } + if (cfgOpenTPCNclsPtCent) { + histosQA.fill(HIST("QA/histTPCNclsPtCent_PosKa"), trk.tpcNClsFound(), trk.pt(), cent); + } + } else if (trk.sign() < 0) { + histosQA.fill(HIST("V2/PID/histCosDetV2_Ka_Neg"), cent, trk.pt(), + std::cos(static_cast(nmode) * (trk.phi() - psiN))); + if (cfgOpenPlotITSNcls) { + histosQA.fill(HIST("QA/histITSNcls_NegKa"), trk.itsNCls()); + } + if (cfgOpenPlotITSNclsPtCent) { + histosQA.fill(HIST("QA/histITSNclsPtCent_NegKa"), trk.itsNCls(), trk.pt(), cent); + } + if (cfgOpenTPCNcls) { + histosQA.fill(HIST("QA/histTPCNcls_NegKa"), trk.tpcNClsFound()); + } + if (cfgOpenTPCNclsPtCent) { + histosQA.fill(HIST("QA/histTPCNclsPtCent_NegKa"), trk.tpcNClsFound(), trk.pt(), cent); + } + } } } - } - for (const auto& trk : track3) { - if (!selTrack(trk, cent)) - continue; - if (nmode == 2) { - if (trk.sign() > 0) { - histosQA.fill(HIST("V2/PID/histCosDetV2_Pr"), cent, trk.pt(), - std::cos(static_cast(nmode) * (trk.phi() - psiN))); - } else if (trk.sign() < 0) { - histosQA.fill(HIST("V2/PID/histCosDetV2_Pr_Neg"), cent, trk.pt(), - std::cos(static_cast(nmode) * (trk.phi() - psiN))); + for (const auto& trk : track3) { + if (!selTrack(trk, cent)) + continue; + if (nmode == 2) { + if (trk.sign() > 0) { + histosQA.fill(HIST("V2/PID/histCosDetV2_Pr"), cent, trk.pt(), + std::cos(static_cast(nmode) * (trk.phi() - psiN))); + if (cfgOpenPlotITSNcls) { + histosQA.fill(HIST("QA/histITSNcls_PosPr"), trk.itsNCls()); + } + if (cfgOpenPlotITSNclsPtCent) { + histosQA.fill(HIST("QA/histITSNclsPtCent_PosPr"), trk.itsNCls(), trk.pt(), cent); + } + if (cfgOpenTPCNcls) { + histosQA.fill(HIST("QA/histTPCNcls_PosPr"), trk.tpcNClsFound()); + } + if (cfgOpenTPCNclsPtCent) { + histosQA.fill(HIST("QA/histTPCNclsPtCent_PosPr"), trk.tpcNClsFound(), trk.pt(), cent); + } + } else if (trk.sign() < 0) { + histosQA.fill(HIST("V2/PID/histCosDetV2_Pr_Neg"), cent, trk.pt(), + std::cos(static_cast(nmode) * (trk.phi() - psiN))); + if (cfgOpenPlotITSNcls) { + histosQA.fill(HIST("QA/histITSNcls_NegPr"), trk.itsNCls()); + } + if (cfgOpenPlotITSNclsPtCent) { + histosQA.fill(HIST("QA/histITSNclsPtCent_NegPr"), trk.itsNCls(), trk.pt(), cent); + } + if (cfgOpenTPCNcls) { + histosQA.fill(HIST("QA/histTPCNcls_NegPr"), trk.tpcNClsFound()); + } + if (cfgOpenTPCNclsPtCent) { + histosQA.fill(HIST("QA/histTPCNclsPtCent_NegPr"), trk.tpcNClsFound(), trk.pt(), cent); + } + } } } } @@ -1646,34 +2493,66 @@ struct pidcme { // o2-linter: disable=name/struct continue; if (nmode == 2) { if (trk1.sign() == trk2.sign()) { - histosQA.fill(HIST("PIDCME/histgamama_PiPi_ss"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_PiPi_ss"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PiPi_ss"), cent, std::cos((trk1.phi() - trk2.phi()))); - histosQA.fill(HIST("PIDCME/Differential/histgamama_PiPi_ss_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), - std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_PiPi_ss_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), - std::cos((trk1.phi() - trk2.phi()))); + if (cfgkOpenCMEDifferential) { + if (cfgkOpenDeltaPt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_PiPi_ss_DPt"), cent, trk1.pt() - trk2.pt(), + std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_PiPi_ss_DPt"), cent, trk1.pt() - trk2.pt(), + std::cos((trk1.phi() - trk2.phi()))); + } + if (cfgkOpenDeltaEta) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_PiPi_ss_DEt"), cent, trk1.eta() - trk2.eta(), + std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_PiPi_ss_DEt"), cent, trk1.eta() - trk2.eta(), + std::cos((trk1.phi() - trk2.phi()))); + } + if (cfgkOpenAveragePt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_PiPi_ss_SPt"), cent, trk1.pt() + trk2.pt(), + std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_PiPi_ss_SPt"), cent, trk1.pt() + trk2.pt(), + std::cos((trk1.phi() - trk2.phi()))); + } + } if (cfgkOpenSsOsCrossCheck) { if (trk1.sign() > 0 && trk2.sign() > 0) { - histosQA.fill(HIST("PIDCME/histgamama_PiPi_PP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_PiPi_PP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PiPi_PP"), cent, std::cos((trk1.phi() - trk2.phi()))); } else { - histosQA.fill(HIST("PIDCME/histgamama_PiPi_NN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_PiPi_NN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PiPi_NN"), cent, std::cos((trk1.phi() - trk2.phi()))); } } } else { - histosQA.fill(HIST("PIDCME/histgamama_PiPi_os"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_PiPi_os"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PiPi_os"), cent, std::cos((trk1.phi() - trk2.phi()))); - histosQA.fill(HIST("PIDCME/Differential/histgamama_PiPi_os_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), - std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_PiPi_os_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), - std::cos((trk1.phi() - trk2.phi()))); + if (cfgkOpenCMEDifferential) { + if (cfgkOpenDeltaPt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_PiPi_os_DPt"), cent, trk1.pt() - trk2.pt(), + std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_PiPi_os_DPt"), cent, trk1.pt() - trk2.pt(), + std::cos((trk1.phi() - trk2.phi()))); + } + if (cfgkOpenDeltaEta) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_PiPi_os_DEt"), cent, trk1.eta() - trk2.eta(), + std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_PiPi_os_DEt"), cent, trk1.eta() - trk2.eta(), + std::cos((trk1.phi() - trk2.phi()))); + } + if (cfgkOpenAveragePt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_PiPi_os_SPt"), cent, trk1.pt() + trk2.pt(), + std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_PiPi_os_SPt"), cent, trk1.pt() + trk2.pt(), + std::cos((trk1.phi() - trk2.phi()))); + } + } if (cfgkOpenSsOsCrossCheck) { if (trk1.sign() > 0 && trk2.sign() < 0) { - histosQA.fill(HIST("PIDCME/histgamama_PiPi_PN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_PiPi_PN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PiPi_PN"), cent, std::cos((trk1.phi() - trk2.phi()))); } else { - histosQA.fill(HIST("PIDCME/histgamama_PiPi_NP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_PiPi_NP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PiPi_NP"), cent, std::cos((trk1.phi() - trk2.phi()))); } } @@ -1693,34 +2572,66 @@ struct pidcme { // o2-linter: disable=name/struct continue; if (nmode == 2) { if (trk1.sign() == trk2.sign()) { - histosQA.fill(HIST("PIDCME/histgamama_KaKa_ss"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_KaKa_ss"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_KaKa_ss"), cent, std::cos((trk1.phi() - trk2.phi()))); - histosQA.fill(HIST("PIDCME/Differential/histgamama_KaKa_ss_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), - std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_KaKa_ss_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), - std::cos((trk1.phi() - trk2.phi()))); + if (cfgkOpenCMEDifferential) { + if (cfgkOpenDeltaPt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_KaKa_ss_DPt"), cent, trk1.pt() - trk2.pt(), + std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_KaKa_ss_DPt"), cent, trk1.pt() - trk2.pt(), + std::cos((trk1.phi() - trk2.phi()))); + } + if (cfgkOpenDeltaEta) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_KaKa_ss_DEt"), cent, trk1.eta() - trk2.eta(), + std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_KaKa_ss_DEt"), cent, trk1.eta() - trk2.eta(), + std::cos((trk1.phi() - trk2.phi()))); + } + if (cfgkOpenAveragePt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_KaKa_ss_SPt"), cent, trk1.pt() + trk2.pt(), + std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_KaKa_ss_SPt"), cent, trk1.pt() + trk2.pt(), + std::cos((trk1.phi() - trk2.phi()))); + } + } if (cfgkOpenSsOsCrossCheck) { if (trk1.sign() > 0 && trk2.sign() > 0) { - histosQA.fill(HIST("PIDCME/histgamama_KaKa_PP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_KaKa_PP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_KaKa_PP"), cent, std::cos((trk1.phi() - trk2.phi()))); } else { - histosQA.fill(HIST("PIDCME/histgamama_KaKa_NN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_KaKa_NN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_KaKa_NN"), cent, std::cos((trk1.phi() - trk2.phi()))); } } } else { - histosQA.fill(HIST("PIDCME/histgamama_KaKa_os"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_KaKa_os"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_KaKa_os"), cent, std::cos((trk1.phi() - trk2.phi()))); - histosQA.fill(HIST("PIDCME/Differential/histgamama_KaKa_os_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), - std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_KaKa_os_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), - std::cos((trk1.phi() - trk2.phi()))); + if (cfgkOpenCMEDifferential) { + if (cfgkOpenDeltaPt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_KaKa_os_DPt"), cent, trk1.pt() - trk2.pt(), + std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_KaKa_os_DPt"), cent, trk1.pt() - trk2.pt(), + std::cos((trk1.phi() - trk2.phi()))); + } + if (cfgkOpenDeltaEta) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_KaKa_os_DEt"), cent, trk1.eta() - trk2.eta(), + std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_KaKa_os_DEt"), cent, trk1.eta() - trk2.eta(), + std::cos((trk1.phi() - trk2.phi()))); + } + if (cfgkOpenAveragePt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_KaKa_os_SPt"), cent, trk1.pt() + trk2.pt(), + std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_KaKa_os_SPt"), cent, trk1.pt() + trk2.pt(), + std::cos((trk1.phi() - trk2.phi()))); + } + } if (cfgkOpenSsOsCrossCheck) { if (trk1.sign() > 0 && trk2.sign() < 0) { - histosQA.fill(HIST("PIDCME/histgamama_KaKa_PN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_KaKa_PN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_KaKa_PN"), cent, std::cos((trk1.phi() - trk2.phi()))); } else { - histosQA.fill(HIST("PIDCME/histgamama_KaKa_NP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_KaKa_NP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_KaKa_NP"), cent, std::cos((trk1.phi() - trk2.phi()))); } } @@ -1740,34 +2651,66 @@ struct pidcme { // o2-linter: disable=name/struct continue; if (nmode == 2) { if (trk1.sign() == trk2.sign()) { - histosQA.fill(HIST("PIDCME/histgamama_PrPr_ss"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_PrPr_ss"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PrPr_ss"), cent, std::cos((trk1.phi() - trk2.phi()))); - histosQA.fill(HIST("PIDCME/Differential/histgamama_PrPr_ss_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), - std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_PrPr_ss_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), - std::cos((trk1.phi() - trk2.phi()))); + if (cfgkOpenCMEDifferential) { + if (cfgkOpenDeltaPt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_PrPr_ss_DPt"), cent, trk1.pt() - trk2.pt(), + std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_PrPr_ss_DPt"), cent, trk1.pt() - trk2.pt(), + std::cos((trk1.phi() - trk2.phi()))); + } + if (cfgkOpenDeltaEta) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_PrPr_ss_DEt"), cent, trk1.eta() - trk2.eta(), + std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_PrPr_ss_DEt"), cent, trk1.eta() - trk2.eta(), + std::cos((trk1.phi() - trk2.phi()))); + } + if (cfgkOpenAveragePt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_PrPr_ss_SPt"), cent, trk1.pt() + trk2.pt(), + std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_PrPr_ss_SPt"), cent, trk1.pt() + trk2.pt(), + std::cos((trk1.phi() - trk2.phi()))); + } + } if (cfgkOpenSsOsCrossCheck) { if (trk1.sign() > 0 && trk2.sign() > 0) { - histosQA.fill(HIST("PIDCME/histgamama_PrPr_PP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_PrPr_PP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PrPr_PP"), cent, std::cos((trk1.phi() - trk2.phi()))); } else { - histosQA.fill(HIST("PIDCME/histgamama_PrPr_NN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_PrPr_NN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PrPr_NN"), cent, std::cos((trk1.phi() - trk2.phi()))); } } } else { - histosQA.fill(HIST("PIDCME/histgamama_PrPr_os"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_PrPr_os"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PrPr_os"), cent, std::cos((trk1.phi() - trk2.phi()))); - histosQA.fill(HIST("PIDCME/Differential/histgamama_PrPr_os_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), - std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_PrPr_os_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), - std::cos((trk1.phi() - trk2.phi()))); + if (cfgkOpenCMEDifferential) { + if (cfgkOpenDeltaPt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_PrPr_os_DPt"), cent, trk1.pt() - trk2.pt(), + std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_PrPr_os_DPt"), cent, trk1.pt() - trk2.pt(), + std::cos((trk1.phi() - trk2.phi()))); + } + if (cfgkOpenDeltaEta) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_PrPr_os_DEt"), cent, trk1.eta() - trk2.eta(), + std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_PrPr_os_DEt"), cent, trk1.eta() - trk2.eta(), + std::cos((trk1.phi() - trk2.phi()))); + } + if (cfgkOpenAveragePt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_PrPr_os_SPt"), cent, trk1.pt() + trk2.pt(), + std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_PrPr_os_SPt"), cent, trk1.pt() + trk2.pt(), + std::cos((trk1.phi() - trk2.phi()))); + } + } if (cfgkOpenSsOsCrossCheck) { if (trk1.sign() > 0 && trk2.sign() < 0) { - histosQA.fill(HIST("PIDCME/histgamama_PrPr_PN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_PrPr_PN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PrPr_PN"), cent, std::cos((trk1.phi() - trk2.phi()))); } else { - histosQA.fill(HIST("PIDCME/histgamama_PrPr_NP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_PrPr_NP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PrPr_NP"), cent, std::cos((trk1.phi() - trk2.phi()))); } } @@ -1787,34 +2730,66 @@ struct pidcme { // o2-linter: disable=name/struct continue; if (nmode == 2) { if (trk1.sign() == trk2.sign()) { - histosQA.fill(HIST("PIDCME/histgamama_PiKa_ss"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_PiKa_ss"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PiKa_ss"), cent, std::cos((trk1.phi() - trk2.phi()))); - histosQA.fill(HIST("PIDCME/Differential/histgamama_PiKa_ss_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), - std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_PiKa_ss_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), - std::cos((trk1.phi() - trk2.phi()))); + if (cfgkOpenCMEDifferential) { + if (cfgkOpenDeltaPt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_PiKa_ss_DPt"), cent, trk1.pt() - trk2.pt(), + std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_PiKa_ss_DPt"), cent, trk1.pt() - trk2.pt(), + std::cos((trk1.phi() - trk2.phi()))); + } + if (cfgkOpenDeltaEta) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_PiKa_ss_DEt"), cent, trk1.eta() - trk2.eta(), + std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_PiKa_ss_DEt"), cent, trk1.eta() - trk2.eta(), + std::cos((trk1.phi() - trk2.phi()))); + } + if (cfgkOpenAveragePt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_PiKa_ss_SPt"), cent, trk1.pt() + trk2.pt(), + std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_PiKa_ss_SPt"), cent, trk1.pt() + trk2.pt(), + std::cos((trk1.phi() - trk2.phi()))); + } + } if (cfgkOpenSsOsCrossCheck) { if (trk1.sign() > 0 && trk2.sign() > 0) { - histosQA.fill(HIST("PIDCME/histgamama_PiKa_PP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_PiKa_PP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PiKa_PP"), cent, std::cos((trk1.phi() - trk2.phi()))); } else { - histosQA.fill(HIST("PIDCME/histgamama_PiKa_NN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_PiKa_NN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PiKa_NN"), cent, std::cos((trk1.phi() - trk2.phi()))); } } } else { - histosQA.fill(HIST("PIDCME/histgamama_PiKa_os"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_PiKa_os"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PiKa_os"), cent, std::cos((trk1.phi() - trk2.phi()))); - histosQA.fill(HIST("PIDCME/Differential/histgamama_PiKa_os_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), - std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_PiKa_os_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), - std::cos((trk1.phi() - trk2.phi()))); + if (cfgkOpenCMEDifferential) { + if (cfgkOpenDeltaPt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_PiKa_os_DPt"), cent, trk1.pt() - trk2.pt(), + std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_PiKa_os_DPt"), cent, trk1.pt() - trk2.pt(), + std::cos((trk1.phi() - trk2.phi()))); + } + if (cfgkOpenDeltaEta) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_PiKa_os_DEt"), cent, trk1.eta() - trk2.eta(), + std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_PiKa_os_DEt"), cent, trk1.eta() - trk2.eta(), + std::cos((trk1.phi() - trk2.phi()))); + } + if (cfgkOpenAveragePt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_PiKa_os_SPt"), cent, trk1.pt() + trk2.pt(), + std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_PiKa_os_SPt"), cent, trk1.pt() + trk2.pt(), + std::cos((trk1.phi() - trk2.phi()))); + } + } if (cfgkOpenSsOsCrossCheck) { if (trk1.sign() > 0 && trk2.sign() < 0) { - histosQA.fill(HIST("PIDCME/histgamama_PiKa_PN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_PiKa_PN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PiKa_PN"), cent, std::cos((trk1.phi() - trk2.phi()))); } else { - histosQA.fill(HIST("PIDCME/histgamama_PiKa_NP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_PiKa_NP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PiKa_NP"), cent, std::cos((trk1.phi() - trk2.phi()))); } } @@ -1834,34 +2809,66 @@ struct pidcme { // o2-linter: disable=name/struct continue; if (nmode == 2) { if (trk1.sign() == trk3.sign()) { - histosQA.fill(HIST("PIDCME/histgamama_PiPr_ss"), cent, std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_PiPr_ss"), cent, std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PiPr_ss"), cent, std::cos((trk1.phi() - trk3.phi()))); - histosQA.fill(HIST("PIDCME/Differential/histgamama_PiPr_ss_Dif"), cent, trk1.pt() + trk3.pt(), std::abs(trk1.eta() - trk3.eta()), - std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_PiPr_ss_Dif"), cent, trk1.pt() + trk3.pt(), std::abs(trk1.eta() - trk3.eta()), - std::cos((trk1.phi() - trk3.phi()))); + if (cfgkOpenCMEDifferential) { + if (cfgkOpenDeltaPt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_PiPr_ss_DPt"), cent, trk1.pt() - trk3.pt(), + std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_PiPr_ss_DPt"), cent, trk1.pt() - trk3.pt(), + std::cos((trk1.phi() - trk3.phi()))); + } + if (cfgkOpenDeltaEta) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_PiPr_ss_DEt"), cent, trk1.eta() - trk3.eta(), + std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_PiPr_ss_DEt"), cent, trk1.eta() - trk3.eta(), + std::cos((trk1.phi() - trk3.phi()))); + } + if (cfgkOpenAveragePt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_PiPr_ss_SPt"), cent, trk1.pt() + trk3.pt(), + std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_PiPr_ss_SPt"), cent, trk1.pt() + trk3.pt(), + std::cos((trk1.phi() - trk3.phi()))); + } + } if (cfgkOpenSsOsCrossCheck) { if (trk1.sign() > 0 && trk3.sign() > 0) { - histosQA.fill(HIST("PIDCME/histgamama_PiPr_PP"), cent, std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_PiPr_PP"), cent, std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PiPr_PP"), cent, std::cos((trk1.phi() - trk3.phi()))); } else { - histosQA.fill(HIST("PIDCME/histgamama_PiPr_NN"), cent, std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_PiPr_NN"), cent, std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PiPr_NN"), cent, std::cos((trk1.phi() - trk3.phi()))); } } } else { - histosQA.fill(HIST("PIDCME/histgamama_PiPr_os"), cent, std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_PiPr_os"), cent, std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PiPr_os"), cent, std::cos((trk1.phi() - trk3.phi()))); - histosQA.fill(HIST("PIDCME/Differential/histgamama_PiPr_os_Dif"), cent, trk1.pt() + trk3.pt(), std::abs(trk1.eta() - trk3.eta()), - std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_PiPr_os_Dif"), cent, trk1.pt() + trk3.pt(), std::abs(trk1.eta() - trk3.eta()), - std::cos((trk1.phi() - trk3.phi()))); + if (cfgkOpenCMEDifferential) { + if (cfgkOpenDeltaPt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_PiPr_os_DPt"), cent, trk1.pt() - trk3.pt(), + std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_PiPr_os_DPt"), cent, trk1.pt() - trk3.pt(), + std::cos((trk1.phi() - trk3.phi()))); + } + if (cfgkOpenDeltaEta) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_PiPr_os_DEt"), cent, trk1.eta() - trk3.eta(), + std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_PiPr_os_DEt"), cent, trk1.eta() - trk3.eta(), + std::cos((trk1.phi() - trk3.phi()))); + } + if (cfgkOpenAveragePt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_PiPr_os_SPt"), cent, trk1.pt() + trk3.pt(), + std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_PiPr_os_SPt"), cent, trk1.pt() + trk3.pt(), + std::cos((trk1.phi() - trk3.phi()))); + } + } if (cfgkOpenSsOsCrossCheck) { if (trk1.sign() > 0 && trk3.sign() < 0) { - histosQA.fill(HIST("PIDCME/histgamama_PiPr_PN"), cent, std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_PiPr_PN"), cent, std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PiPr_PN"), cent, std::cos((trk1.phi() - trk3.phi()))); } else { - histosQA.fill(HIST("PIDCME/histgamama_PiPr_NP"), cent, std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_PiPr_NP"), cent, std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PiPr_NP"), cent, std::cos((trk1.phi() - trk3.phi()))); } } @@ -1881,34 +2888,66 @@ struct pidcme { // o2-linter: disable=name/struct continue; if (nmode == 2) { if (trk2.sign() == trk3.sign()) { - histosQA.fill(HIST("PIDCME/histgamama_KaPr_ss"), cent, std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_KaPr_ss"), cent, std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_KaPr_ss"), cent, std::cos((trk2.phi() - trk3.phi()))); - histosQA.fill(HIST("PIDCME/Differential/histgamama_KaPr_ss_Dif"), cent, trk2.pt() + trk3.pt(), std::abs(trk2.eta() - trk3.eta()), - std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_KaPr_ss_Dif"), cent, trk2.pt() + trk3.pt(), std::abs(trk2.eta() - trk3.eta()), - std::cos((trk2.phi() - trk3.phi()))); + if (cfgkOpenCMEDifferential) { + if (cfgkOpenDeltaPt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_KaPr_ss_DPt"), cent, trk2.pt() - trk3.pt(), + std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_KaPr_ss_DPt"), cent, trk2.pt() - trk3.pt(), + std::cos((trk2.phi() - trk3.phi()))); + } + if (cfgkOpenDeltaEta) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_KaPr_ss_DEt"), cent, trk2.eta() - trk3.eta(), + std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_KaPr_ss_DEt"), cent, trk2.eta() - trk3.eta(), + std::cos((trk2.phi() - trk3.phi()))); + } + if (cfgkOpenAveragePt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_KaPr_ss_SPt"), cent, trk2.pt() + trk3.pt(), + std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_KaPr_ss_SPt"), cent, trk2.pt() + trk3.pt(), + std::cos((trk2.phi() - trk3.phi()))); + } + } if (cfgkOpenSsOsCrossCheck) { if (trk2.sign() > 0 && trk3.sign() > 0) { - histosQA.fill(HIST("PIDCME/histgamama_KaPr_PP"), cent, std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_KaPr_PP"), cent, std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_KaPr_PP"), cent, std::cos((trk2.phi() - trk3.phi()))); } else { - histosQA.fill(HIST("PIDCME/histgamama_KaPr_NN"), cent, std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_KaPr_NN"), cent, std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_KaPr_NN"), cent, std::cos((trk2.phi() - trk3.phi()))); } } } else { - histosQA.fill(HIST("PIDCME/histgamama_KaPr_os"), cent, std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_KaPr_os"), cent, std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_KaPr_os"), cent, std::cos((trk2.phi() - trk3.phi()))); - histosQA.fill(HIST("PIDCME/Differential/histgamama_KaPr_os_Dif"), cent, trk2.pt() + trk3.pt(), std::abs(trk2.eta() - trk3.eta()), - std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_KaPr_os_Dif"), cent, trk2.pt() + trk3.pt(), std::abs(trk2.eta() - trk3.eta()), - std::cos((trk2.phi() - trk3.phi()))); + if (cfgkOpenCMEDifferential) { + if (cfgkOpenDeltaPt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_KaPr_os_DPt"), cent, trk2.pt() - trk3.pt(), + std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_KaPr_os_DPt"), cent, trk2.pt() - trk3.pt(), + std::cos((trk2.phi() - trk3.phi()))); + } + if (cfgkOpenDeltaEta) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_KaPr_os_DEt"), cent, trk2.eta() - trk3.eta(), + std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_KaPr_os_DEt"), cent, trk2.eta() - trk3.eta(), + std::cos((trk2.phi() - trk3.phi()))); + } + if (cfgkOpenAveragePt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_KaPr_os_SPt"), cent, trk2.pt() + trk3.pt(), + std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_KaPr_os_SPt"), cent, trk2.pt() + trk3.pt(), + std::cos((trk2.phi() - trk3.phi()))); + } + } if (cfgkOpenSsOsCrossCheck) { if (trk2.sign() > 0 && trk3.sign() < 0) { - histosQA.fill(HIST("PIDCME/histgamama_KaPr_PN"), cent, std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_KaPr_PN"), cent, std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_KaPr_PN"), cent, std::cos((trk2.phi() - trk3.phi()))); } else { - histosQA.fill(HIST("PIDCME/histgamama_KaPr_NP"), cent, std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); + histosQA.fill(HIST("PIDCME/histgamma_KaPr_NP"), cent, std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_KaPr_NP"), cent, std::cos((trk2.phi() - trk3.phi()))); } } @@ -1920,7 +2959,7 @@ struct pidcme { // o2-linter: disable=name/struct } } - void process(soa::Filtered>::iterator const& collision, aod::BCsWithTimestamps const&, soa::Filtered> const& tracks) + void process(soa::Filtered>::iterator const& collision, aod::BCsWithTimestamps const&, soa::Filtered> const& tracks) { auto bc = collision.bc_as(); if ((hPosPrCut.empty()) || (hNegPrCut.empty())) { @@ -1989,10 +3028,12 @@ struct pidcme { // o2-linter: disable=name/struct } } } - histosQA.fill(HIST("V2/histSinDetV2"), cent, trk.pt(), - std::sin(static_cast(cfgnMods->at(i)) * (trk.phi() - psiNGlobal))); - histosQA.fill(HIST("V2/histCosDetV2"), cent, trk.pt(), - std::cos(static_cast(cfgnMods->at(i)) * (trk.phi() - psiNGlobal))); + if (cfgkOpenV2) { + histosQA.fill(HIST("V2/histSinDetV2"), cent, trk.pt(), + std::sin(static_cast(cfgnMods->at(i)) * (trk.phi() - psiNGlobal))); + histosQA.fill(HIST("V2/histCosDetV2"), cent, trk.pt(), + std::cos(static_cast(cfgnMods->at(i)) * (trk.phi() - psiNGlobal))); + } } if (cfgkOpenCME && cfgkOpenHaHa && cfgnMods->at(i) == 2) { for (const auto& trk1 : tracks) { @@ -2004,34 +3045,66 @@ struct pidcme { // o2-linter: disable=name/struct if (!selTrack(trk2, cent)) continue; if (trk1.sign() == trk2.sign()) { - histosQA.fill(HIST("PIDCME/histgamama_HaHa_ss"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); + histosQA.fill(HIST("PIDCME/histgamma_HaHa_ss"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); histosQA.fill(HIST("PIDCME/histdelta_HaHa_ss"), cent, std::cos((trk1.phi() - trk2.phi()))); - histosQA.fill(HIST("PIDCME/Differential/histgamama_HaHa_ss_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), - std::cos((trk1.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_HaHa_ss_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), - std::cos((trk1.phi() - trk2.phi()))); + if (cfgkOpenCMEDifferential) { + if (cfgkOpenDeltaPt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_HaHa_ss_DPt"), cent, trk2.pt() - trk2.pt(), + std::cos((trk2.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_HaHa_ss_DPt"), cent, trk2.pt() - trk2.pt(), + std::cos((trk2.phi() - trk2.phi()))); + } + if (cfgkOpenDeltaEta) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_HaHa_ss_DEt"), cent, trk2.eta() - trk2.eta(), + std::cos((trk2.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_HaHa_ss_DEt"), cent, trk2.eta() - trk2.eta(), + std::cos((trk2.phi() - trk2.phi()))); + } + if (cfgkOpenAveragePt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_HaHa_ss_SPt"), cent, trk2.pt() + trk2.pt(), + std::cos((trk2.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_HaHa_ss_SPt"), cent, trk2.pt() + trk2.pt(), + std::cos((trk2.phi() - trk2.phi()))); + } + } if (cfgkOpenSsOsCrossCheck) { if (trk1.sign() > 0 && trk2.sign() > 0) { - histosQA.fill(HIST("PIDCME/histgamama_HaHa_PP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); + histosQA.fill(HIST("PIDCME/histgamma_HaHa_PP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); histosQA.fill(HIST("PIDCME/histdelta_HaHa_PP"), cent, std::cos((trk1.phi() - trk2.phi()))); } else { - histosQA.fill(HIST("PIDCME/histgamama_HaHa_NN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); + histosQA.fill(HIST("PIDCME/histgamma_HaHa_NN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); histosQA.fill(HIST("PIDCME/histdelta_HaHa_NN"), cent, std::cos((trk1.phi() - trk2.phi()))); } } } else { - histosQA.fill(HIST("PIDCME/histgamama_HaHa_os"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); + histosQA.fill(HIST("PIDCME/histgamma_HaHa_os"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); histosQA.fill(HIST("PIDCME/histdelta_HaHa_os"), cent, std::cos((trk1.phi() - trk2.phi()))); - histosQA.fill(HIST("PIDCME/Differential/histgamama_HaHa_os_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), - std::cos((trk1.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_HaHa_os_Dif"), cent, trk1.pt() + trk2.pt(), std::abs(trk1.eta() - trk2.eta()), - std::cos((trk1.phi() - trk2.phi()))); + if (cfgkOpenCMEDifferential) { + if (cfgkOpenDeltaPt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_HaHa_os_DPt"), cent, trk2.pt() - trk2.pt(), + std::cos((trk2.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_HaHa_os_DPt"), cent, trk2.pt() - trk2.pt(), + std::cos((trk2.phi() - trk2.phi()))); + } + if (cfgkOpenDeltaEta) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_HaHa_os_DEt"), cent, trk2.eta() - trk2.eta(), + std::cos((trk2.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_HaHa_os_DEt"), cent, trk2.eta() - trk2.eta(), + std::cos((trk2.phi() - trk2.phi()))); + } + if (cfgkOpenAveragePt) { + histosQA.fill(HIST("PIDCME/Differential/histgamma_HaHa_os_SPt"), cent, trk2.pt() + trk2.pt(), + std::cos((trk2.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_HaHa_os_SPt"), cent, trk2.pt() + trk2.pt(), + std::cos((trk2.phi() - trk2.phi()))); + } + } if (cfgkOpenSsOsCrossCheck) { if (trk1.sign() > 0 && trk2.sign() < 0) { - histosQA.fill(HIST("PIDCME/histgamama_HaHa_PN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); + histosQA.fill(HIST("PIDCME/histgamma_HaHa_PN"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); histosQA.fill(HIST("PIDCME/histdelta_HaHa_PN"), cent, std::cos((trk1.phi() - trk2.phi()))); } else { - histosQA.fill(HIST("PIDCME/histgamama_HaHa_NP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); + histosQA.fill(HIST("PIDCME/histgamma_HaHa_NP"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); histosQA.fill(HIST("PIDCME/histdelta_HaHa_NP"), cent, std::cos((trk1.phi() - trk2.phi()))); } } From 014e40e4a1109533a5eadcaa6203cf72b8c95519 Mon Sep 17 00:00:00 2001 From: dajones2 <140733426+dajones2@users.noreply.github.com> Date: Tue, 4 Mar 2025 14:44:45 +0000 Subject: [PATCH 0527/1650] [PWGJE] Adding potential fixes to track and jet level cuts (#10289) --- PWGJE/Tasks/jetHadronRecoil.cxx | 92 ++++++++++++++------------------- 1 file changed, 39 insertions(+), 53 deletions(-) diff --git a/PWGJE/Tasks/jetHadronRecoil.cxx b/PWGJE/Tasks/jetHadronRecoil.cxx index 7eaca5774c0..c9a7ec8a91b 100644 --- a/PWGJE/Tasks/jetHadronRecoil.cxx +++ b/PWGJE/Tasks/jetHadronRecoil.cxx @@ -75,6 +75,7 @@ struct JetHadronRecoil { Filter jetCuts = aod::jet::r == nround(jetR.node() * 100.0f); Filter trackCuts = (aod::jtrack::pt >= trackPtMin && aod::jtrack::pt < trackPtMax && aod::jtrack::eta > trackEtaMin && aod::jtrack::eta < trackEtaMax); + Filter particleCuts = (aod::jmcparticle::pt >= trackPtMin && aod::jmcparticle::pt < trackPtMax && aod::jmcparticle::eta > trackEtaMin && aod::jmcparticle::eta < trackEtaMax); Filter eventCuts = (nabs(aod::jcollision::posZ) < vertexZCut && aod::jcollision::centrality >= centralityMin && aod::jcollision::centrality < centralityMax); std::vector ptBinningPart = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, @@ -86,13 +87,24 @@ struct JetHadronRecoil { 15.0, 20.0, 25.0, 30.0, 35.0, 40.0, 45.0, 50.0, 55.0, 60.0, 65.0, 70.0, 75.0, 80.0, 90.0, 100.0, 110.0, 120.0, 130.0, 140.0, 150.0, 160.0, 180.0, 200.0}; + std::vector dRBinning = {0.0, 1.0e-9, 0.003, 0.006, 0.009, 0.012, 0.015, 0.018, 0.021, 0.024, + 0.027, 0.03, 0.033, 0.036, 0.039, 0.042, 0.045, 0.048, 0.051, 0.054, + 0.057, 0.06, 0.063, 0.066, 0.069, 0.072, 0.075, 0.078, 0.081, 0.084, + 0.087, 0.09, 0.093, 0.096, 0.099, 0.102, 0.105, 0.108, 0.111, 0.114, + 0.117, 0.12, 0.123, 0.126, 0.129, 0.132, 0.135, 0.138, 0.141, 0.144, + 0.147, 0.15, 0.153, 0.156, 0.159, 0.162, 0.165, 0.168, 0.171, 0.174, + 0.177, 0.18, 0.183, 0.186, 0.189, 0.192, 0.195, 0.198, 0.201, 0.204, + 0.207, 0.21, 0.213, 0.216, 0.219, 0.222, 0.225, 0.228, 0.231, 0.234, + 0.237, 0.24}; + + AxisSpec dRAxis = {dRBinning, "#Delta R"}; AxisSpec ptAxisDet = {ptBinningDet, "#it{p}_{T,det} (GeV/c)"}; AxisSpec ptAxisPart = {ptBinningPart, "#it{p}_{T,part} (GeV/c)"}; AxisSpec phiAxisDet = {100, 0.0, o2::constants::math::TwoPI, "#phi_{det}"}; AxisSpec phiAxisPart = {100, 0.0, o2::constants::math::TwoPI, "#phi_{part}"}; - AxisSpec dRAxisDet = {80, 0.0, 0.24, "#Delta R_{det}"}; - AxisSpec dRAxisPart = {80, 0.0, 0.24, "#Delta R_{part}"}; + AxisSpec dRAxisDet = {dRBinning, "#Delta R_{det}"}; + AxisSpec dRAxisPart = {dRBinning, "#Delta R_{part}"}; HistogramRegistry registry{"registry", {{"hNtrig", "number of triggers;trigger type;entries", {HistType::kTH1F, {{2, 0, 2}}}}, @@ -114,29 +126,29 @@ struct JetHadronRecoil { {"hPtPart", "Particle p_{T};p_{T};entries", {HistType::kTH1F, {{200, 0, 200}}}}, {"hEtaPart", "Particle #eta;#eta;entries", {HistType::kTH1F, {{100, -1.0, 1.0}}}}, {"hPhiPart", "Particle #phi;#phi;entries", {HistType::kTH1F, {{100, 0.0, o2::constants::math::TwoPI}}}}, - {"hDeltaR", "#DeltaR;#DeltaR;#frac{dN_{jets}}{d#DeltaR}", {HistType::kTH1F, {{80, 0.0, 0.24}}}}, - {"hDeltaRPart", "Particle #DeltaR;#DeltaR;#frac{1}{N_{jets}}#frac{dN_{jets}}{d#DeltaR}", {HistType::kTH1F, {{80, 0.0, 0.24}}}}, - {"hDeltaRpT", "jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{300, -100, 200}, {80, 0.0, 0.24}}}}, - {"hDeltaRpTPart", "Particle jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{200, 0, 200}, {80, 0.0, 0.24}}}}, + {"hDeltaR", "#DeltaR;#DeltaR;#frac{dN_{jets}}{d#DeltaR}", {HistType::kTH1F, {dRAxis}}}, + {"hDeltaRPart", "Particle #DeltaR;#DeltaR;#frac{1}{N_{jets}}#frac{dN_{jets}}{d#DeltaR}", {HistType::kTH1F, {dRAxis}}}, + {"hDeltaRpT", "jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{300, -100, 200}, dRAxis}}}, + {"hDeltaRpTPart", "Particle jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{200, 0, 200}, dRAxis}}}, {"hRhoSignal", "Signal Rho bkg;#rho;entries", {HistType::kTH1F, {{220, 0, 220}}}}, {"hRhoReference", "Reference Rho bkg;#rho;entries", {HistType::kTH1F, {{220, 0, 220}}}}, - {"hDeltaRSignal", "#DeltaR;#DeltaR;#frac{dN_{jets}}{d#DeltaR}", {HistType::kTH1F, {{80, 0.0, 0.24}}}}, - {"hDeltaRSignalPart", "Particle #DeltaR;#DeltaR;#frac{1}{N_{jets}}#frac{dN_{jets}}{d#DeltaR}", {HistType::kTH1F, {{80, 0.0, 0.24}}}}, - {"hDeltaRpTSignal", "jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{300, -100, 200}, {80, 0.0, 0.24}}}}, - {"hDeltaRpTSignalPart", "Particle jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{200, 0, 200}, {80, 0.0, 0.24}}}}, - {"hDeltaRpTDPhiSignal", "jet p_{T} vs #DeltaR vs #Delta#phi;p_{T,jet};#Delta#phi;#DeltaR", {HistType::kTH3F, {{300, -100, 200}, {100, 0, o2::constants::math::TwoPI}, {80, 0.0, 0.24}}}}, - {"hDeltaRpTDPhiSignalPart", "Particle jet p_{T} vs #DeltaR vs #Delta#phi;p_{T,jet};#Delta#phi;#DeltaR", {HistType::kTH3F, {{200, 0, 200}, {100, 0, o2::constants::math::TwoPI}, {80, 0.0, 0.24}}}}, - {"hDeltaRReference", "#DeltaR;#DeltaR;#frac{dN_{jets}}{d#DeltaR}", {HistType::kTH1F, {{80, 0.0, 0.24}}}}, - {"hDeltaRPartReference", "Particle #DeltaR;#DeltaR;#frac{1}{N_{jets}}#frac{dN_{jets}}{d#DeltaR}", {HistType::kTH1F, {{80, 0.0, 0.24}}}}, - {"hDeltaRpTReference", "jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{300, -100, 200}, {80, 0.0, 0.24}}}}, - {"hDeltaRpTPartReference", "Particle jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{200, 0, 200}, {80, 0.0, 0.24}}}}, - {"hDeltaRpTDPhiReference", "jet p_{T} vs #DeltaR vs #Delta#phi;p_{T,jet};#Delta#phi;#DeltaR", {HistType::kTH3F, {{300, -100, 200}, {100, 0, o2::constants::math::TwoPI}, {80, 0.0, 0.24}}}}, - {"hDeltaRpTDPhiReferencePart", "jet p_{T} vs #DeltaR vs #Delta#phi;p_{T,jet};#Delta#phi;#DeltaR", {HistType::kTH3F, {{200, 0, 200}, {100, 0, o2::constants::math::TwoPI}, {80, 0.0, 0.24}}}}, + {"hDeltaRSignal", "#DeltaR;#DeltaR;#frac{dN_{jets}}{d#DeltaR}", {HistType::kTH1F, {dRAxis}}}, + {"hDeltaRSignalPart", "Particle #DeltaR;#DeltaR;#frac{1}{N_{jets}}#frac{dN_{jets}}{d#DeltaR}", {HistType::kTH1F, {dRAxis}}}, + {"hDeltaRpTSignal", "jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{300, -100, 200}, dRAxis}}}, + {"hDeltaRpTSignalPart", "Particle jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{200, 0, 200}, dRAxis}}}, + {"hDeltaRpTDPhiSignal", "jet p_{T} vs #DeltaR vs #Delta#phi;p_{T,jet};#Delta#phi;#DeltaR", {HistType::kTH3F, {{300, -100, 200}, {100, 0, o2::constants::math::TwoPI}, dRAxis}}}, + {"hDeltaRpTDPhiSignalPart", "Particle jet p_{T} vs #DeltaR vs #Delta#phi;p_{T,jet};#Delta#phi;#DeltaR", {HistType::kTH3F, {{200, 0, 200}, {100, 0, o2::constants::math::TwoPI}, dRAxis}}}, + {"hDeltaRReference", "#DeltaR;#DeltaR;#frac{dN_{jets}}{d#DeltaR}", {HistType::kTH1F, {dRAxis}}}, + {"hDeltaRPartReference", "Particle #DeltaR;#DeltaR;#frac{1}{N_{jets}}#frac{dN_{jets}}{d#DeltaR}", {HistType::kTH1F, {dRAxis}}}, + {"hDeltaRpTReference", "jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{300, -100, 200}, dRAxis}}}, + {"hDeltaRpTPartReference", "Particle jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{200, 0, 200}, dRAxis}}}, + {"hDeltaRpTDPhiReference", "jet p_{T} vs #DeltaR vs #Delta#phi;p_{T,jet};#Delta#phi;#DeltaR", {HistType::kTH3F, {{300, -100, 200}, {100, 0, o2::constants::math::TwoPI}, dRAxis}}}, + {"hDeltaRpTDPhiReferencePart", "jet p_{T} vs #DeltaR vs #Delta#phi;p_{T,jet};#Delta#phi;#DeltaR", {HistType::kTH3F, {{200, 0, 200}, {100, 0, o2::constants::math::TwoPI}, dRAxis}}}, {"hPtMatched", "p_{T} matching;p_{T,det};p_{T,part}", {HistType::kTH2F, {{300, -100, 200}, {200, 0, 200}}}}, {"hPhiMatched", "#phi matching;#phi_{det};#phi_{part}", {HistType::kTH2F, {{100, 0.0, o2::constants::math::TwoPI}, {100, 0.0, o2::constants::math::TwoPI}}}}, - {"hDeltaRMatched", "#DeltaR matching;#DeltaR_{det};#DeltaR_{part}", {HistType::kTH2F, {{80, 0.0, 0.24}, {80, 0.0, 0.24}}}}, + {"hDeltaRMatched", "#DeltaR matching;#DeltaR_{det};#DeltaR_{part}", {HistType::kTH2F, {dRAxisDet, dRAxisPart}}}, {"hPtMatched1d", "p_{T} matching 1d;p_{T,part}", {HistType::kTH1F, {{200, 0, 200}}}}, - {"hDeltaRMatched1d", "#DeltaR matching 1d;#DeltaR_{part}", {HistType::kTH1F, {{80, 0.0, 0.24}}}}, + {"hDeltaRMatched1d", "#DeltaR matching 1d;#DeltaR_{part}", {HistType::kTH1F, {dRAxisPart}}}, {"hPtResolution", "p_{T} resolution;p_{T,part};Relative Resolution", {HistType::kTH2F, {{200, 0, 200}, {1000, -5.0, 5.0}}}}, {"hPhiResolution", "#phi resolution;#p{T,part};Resolution", {HistType::kTH2F, {{200, 0, 200}, {1000, -7.0, 7.0}}}}, {"hDeltaRResolution", "#DeltaR Resolution;p_{T,part};Resolution", {HistType::kTH2F, {{200, 0, 200}, {1000, -0.15, 0.15}}}}, @@ -156,6 +168,7 @@ struct JetHadronRecoil { Filter jetCuts = aod::jet::r == nround(jetR.node() * 100.0f); Filter trackCuts = (aod::jtrack::pt >= trackPtMin && aod::jtrack::pt < trackPtMax && aod::jtrack::eta > trackEtaMin && aod::jtrack::eta < trackEtaMax); + Filter particleCuts = (aod::jmcparticle::pt >= trackPtMin && aod::jmcparticle::pt < trackPtMax && aod::jmcparticle::eta > trackEtaMin && aod::jmcparticle::eta < trackEtaMax); Filter eventTrackLevelCuts = nabs(aod::jcollision::posZ) < vertexZCut; } @@ -211,9 +224,6 @@ struct JetHadronRecoil { } for (const auto& jet : jets) { - if (jet.tracksIds().size() == 1) { - continue; - } if (jet.pt() > pTHatMaxMCD * pTHat) { continue; } @@ -224,9 +234,6 @@ struct JetHadronRecoil { double deltaPhi = RecoDecay::constrainAngle(jetWTA.phi() - jet.phi(), -o2::constants::math::PI); double deltaEta = jetWTA.eta() - jet.eta(); double dR = RecoDecay::sqrtSumOfSquares(deltaPhi, deltaEta); - if (dR == 0) { - return; - } registry.fill(HIST("hDeltaR"), dR, weight); registry.fill(HIST("hDeltaRpT"), jet.pt() - (rho * jet.area()), dR, weight); } @@ -319,9 +326,6 @@ struct JetHadronRecoil { } for (const auto& jet : jets) { - if (jet.tracksIds().size() == 1) { - continue; - } if (jet.pt() > pTHatMaxMCP * pTHat) { continue; } @@ -332,9 +336,6 @@ struct JetHadronRecoil { double deltaPhi = RecoDecay::constrainAngle(jetWTA.phi() - jet.phi(), -o2::constants::math::PI); double deltaEta = jetWTA.eta() - jet.eta(); double dR = RecoDecay::sqrtSumOfSquares(deltaPhi, deltaEta); - if (dR == 0) { - return; - } registry.fill(HIST("hDeltaRPart"), dR, weight); registry.fill(HIST("hDeltaRpTPart"), jet.pt(), dR, weight); } @@ -383,18 +384,12 @@ struct JetHadronRecoil { double dRp = 0; float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); - if (jetBase.tracksIds().size() == 1) { - return; - } if (jetBase.pt() > pTHatMaxMCD * pTHat) { return; } for (const auto& mcdjetWTA : mcdjetsWTA) { double djet = RecoDecay::sqrtSumOfSquares(RecoDecay::constrainAngle(jetBase.phi() - mcdjetWTA.phi(), -o2::constants::math::PI), jetBase.eta() - mcdjetWTA.eta()); - if (mcdjetWTA.tracksIds().size() == 1) { - continue; - } if (mcdjetWTA.pt() > pTHatMaxMCD * pTHat) { continue; } @@ -406,17 +401,11 @@ struct JetHadronRecoil { if (jetBase.has_matchedJetGeo()) { for (const auto& jetTag : jetBase.template matchedJetGeo_as>()) { - if (jetTag.tracksIds().size() == 1) { - continue; - } if (jetTag.pt() > pTHatMaxMCP * pTHat) { continue; } for (const auto& mcpjetWTA : mcpjetsWTA) { double djetp = RecoDecay::sqrtSumOfSquares(RecoDecay::constrainAngle(jetTag.phi() - mcpjetWTA.phi(), -o2::constants::math::PI), jetTag.eta() - mcpjetWTA.eta()); - if (mcpjetWTA.tracksIds().size() == 1) { - continue; - } if (mcpjetWTA.pt() > pTHatMaxMCP * pTHat) { continue; } @@ -425,9 +414,6 @@ struct JetHadronRecoil { break; } } - if (dR == 0 || dRp == 0) { - return; - } registry.fill(HIST("hPtMatched"), jetBase.pt() - (rho * jetBase.area()), jetTag.pt(), weight); registry.fill(HIST("hPhiMatched"), jetBase.phi(), jetTag.phi(), weight); registry.fill(HIST("hPtResolution"), jetTag.pt(), (jetTag.pt() - (jetBase.pt() - (rho * jetBase.area()))) / jetTag.pt(), weight); @@ -554,7 +540,7 @@ struct JetHadronRecoil { void processMCP(aod::JetMcCollision const& collision, soa::Filtered> const& jets, soa::Filtered> const& jetsWTA, - aod::JetParticles const& particles) + soa::Filtered const& particles) { if (std::abs(collision.posZ()) > vertexZCut) { return; @@ -570,7 +556,7 @@ struct JetHadronRecoil { void processMCPWeighted(aod::JetMcCollision const& collision, soa::Filtered> const& jets, soa::Filtered> const& jetsWTA, - aod::JetParticles const& particles) + soa::Filtered const& particles) { if (std::abs(collision.posZ()) > vertexZCut) { return; @@ -679,8 +665,8 @@ struct JetHadronRecoil { soa::Filtered> const& mcdjets, soa::Filtered> const& mcdjetsWTA, soa::Filtered> const& mcpjetsWTA, - aod::JetTracks const& tracks, - aod::JetParticles const&, + soa::Filtered const& tracks, + soa::Filtered const&, aod::JetMcCollisions const&, soa::Filtered> const& mcpjets) { @@ -711,8 +697,8 @@ struct JetHadronRecoil { soa::Filtered> const& mcdjets, soa::Filtered> const& mcdjetsWTA, soa::Filtered> const& mcpjetsWTA, - aod::JetTracks const& tracks, - aod::JetParticles const&, + soa::Filtered const& tracks, + soa::Filtered const&, aod::JetMcCollisions const&, soa::Filtered> const& mcpjets) { From c6b1db4b0cdcc0556db0c200b7d498ec8bc21c2e Mon Sep 17 00:00:00 2001 From: jaelpark Date: Tue, 4 Mar 2025 23:01:39 +0800 Subject: [PATCH 0528/1650] [PWGCF] correlations task 2-prong track efficiency (#10307) --- PWGCF/DataModel/CorrelationsDerived.h | 23 ++++++++ PWGCF/JCorran/Tasks/jflucWeightsLoader.cxx | 4 +- PWGCF/TableProducer/filter2Prong.cxx | 45 +++++++++++---- PWGCF/TableProducer/filterCorrelations.cxx | 43 +++++++++----- PWGCF/Tasks/correlations.cxx | 66 ++++++++++++++++++++-- 5 files changed, 148 insertions(+), 33 deletions(-) diff --git a/PWGCF/DataModel/CorrelationsDerived.h b/PWGCF/DataModel/CorrelationsDerived.h index d563b2b7c16..46153889a0b 100644 --- a/PWGCF/DataModel/CorrelationsDerived.h +++ b/PWGCF/DataModel/CorrelationsDerived.h @@ -85,6 +85,8 @@ using CFTrackWithLabel = CFTracksWithLabel::iterator; //------transient CF-filter to CF-2prong-filter DECLARE_SOA_TABLE(CFCollRefs, "AOD", "CFCOLLREF", o2::soa::Index<>, track::CollisionId); //! Transient cf collision index table +// Reco + using CFCollRef = CFCollRefs::iterator; namespace cftrackref @@ -94,6 +96,16 @@ DECLARE_SOA_INDEX_COLUMN(Track, track); DECLARE_SOA_TABLE(CFTrackRefs, "AOD", "CFTRACKREF", o2::soa::Index<>, track::CollisionId, cftrackref::TrackId); //! Transient cf track index table using CFTrackRef = CFTrackRefs::iterator; + +// MC + +namespace cfmcparticleref +{ +DECLARE_SOA_INDEX_COLUMN(McParticle, mcParticle); +} // namespace cfmcparticleref +DECLARE_SOA_TABLE(CFMcParticleRefs, "AOD", "CFMCPARTICLEREF", o2::soa::Index<>, mcparticle::McCollisionId, cfmcparticleref::McParticleId); //! Transient cf track index table + +using CFMcParticleRef = CFMcParticleRefs::iterator; //------ namespace cf2prongtrack @@ -133,6 +145,17 @@ DECLARE_SOA_TABLE(CF2ProngTrackmls, "AOD", "CF2PRONGTRACKML", //! Reduced track using CF2ProngTrackml = CF2ProngTrackmls::iterator; //------ +namespace cf2prongmcpart +{ +DECLARE_SOA_INDEX_COLUMN_FULL(CFParticleDaugh0, cfParticleDaugh0, int, CFMcParticles, "_0"); //! Index to prong 1 CFMcParticle +DECLARE_SOA_INDEX_COLUMN_FULL(CFParticleDaugh1, cfParticleDaugh1, int, CFMcParticles, "_1"); //! Index to prong 2 CFMcParticle +} // namespace cf2prongmcpart +DECLARE_SOA_TABLE(CF2ProngMcParts, "AOD", "CF2PRONGMCPART", //! Table for the daughter particles of a 2-prong particle, to be joined with CFMcParticles + o2::soa::Index<>, + cf2prongmcpart::CFParticleDaugh0Id, + cf2prongmcpart::CFParticleDaugh1Id) +using CF2ProngMcPart = CF2ProngMcParts::iterator; + } // namespace o2::aod #endif // PWGCF_DATAMODEL_CORRELATIONSDERIVED_H_ diff --git a/PWGCF/JCorran/Tasks/jflucWeightsLoader.cxx b/PWGCF/JCorran/Tasks/jflucWeightsLoader.cxx index 0abacd31dca..244035fd310 100644 --- a/PWGCF/JCorran/Tasks/jflucWeightsLoader.cxx +++ b/PWGCF/JCorran/Tasks/jflucWeightsLoader.cxx @@ -50,7 +50,7 @@ struct JflucWeightsLoader { THnF* ph = 0; TFile* pf = 0; - THnF* pheff = 0; + THnD* pheff = 0; TFile* pfeff = 0; int runNumber = 0; int timestamp = 0; @@ -120,7 +120,7 @@ struct JflucWeightsLoader { LOGF(fatal, "Efficiency correction weights file not found: %s", cfgPathEffWeights.value.substr(8).c_str()); } // - if (!(pheff = pfeff->Get("ccdb_object"))) { + if (!(pheff = pfeff->Get("ccdb_object"))) { LOGF(warning, "Efficiency correction histogram not found."); } else { LOGF(info, "Loaded efficiency correction histogram locally."); diff --git a/PWGCF/TableProducer/filter2Prong.cxx b/PWGCF/TableProducer/filter2Prong.cxx index 1adeb2bceac..86c708f6ebd 100644 --- a/PWGCF/TableProducer/filter2Prong.cxx +++ b/PWGCF/TableProducer/filter2Prong.cxx @@ -40,6 +40,8 @@ struct Filter2Prong { Produces output2ProngTracks; Produces output2ProngTrackmls; + Produces output2ProngMcParts; + std::vector mlvecd{}; std::vector mlvecdbar{}; @@ -81,13 +83,11 @@ struct Filter2Prong { prongCFId[0], prongCFId[1], c.pt(), c.eta(), c.phi(), hfHelper.invMassD0ToPiK(c), aod::cf2prongtrack::D0ToPiK); if constexpr (std::experimental::is_detected::value) { mlvecd.clear(); - for (float val : c.mlProbD0()) { + for (float val : c.mlProbD0()) mlvecd.push_back(val); - } mlvecdbar.clear(); - for (float val : c.mlProbD0bar()) { + for (float val : c.mlProbD0bar()) mlvecdbar.push_back(val); - } output2ProngTrackmls(cfcollisions.begin().globalIndex(), mlvecd, mlvecdbar); } } @@ -97,30 +97,51 @@ struct Filter2Prong { prongCFId[0], prongCFId[1], c.pt(), c.eta(), c.phi(), hfHelper.invMassD0barToKPi(c), aod::cf2prongtrack::D0barToKPi); if constexpr (std::experimental::is_detected::value) { mlvecd.clear(); - for (float val : c.mlProbD0()) { + for (float val : c.mlProbD0()) mlvecd.push_back(val); - } mlvecdbar.clear(); - for (float val : c.mlProbD0bar()) { + for (float val : c.mlProbD0bar()) mlvecdbar.push_back(val); - } output2ProngTrackmls(cfcollisions.begin().globalIndex(), mlvecd, mlvecdbar); } } } } - void processDataML(aod::Collisions::iterator const& cols, aod::BCsWithTimestamps const& bcs, aod::CFCollRefs const& cfcollisions, aod::CFTrackRefs const& cftracks, HFCandidatesML const& candidates) + void processDataML(aod::Collisions::iterator const& col, aod::BCsWithTimestamps const& bcs, aod::CFCollRefs const& cfcollisions, aod::CFTrackRefs const& cftracks, HFCandidatesML const& candidates) { - processDataT(cols, bcs, cfcollisions, cftracks, candidates); + processDataT(col, bcs, cfcollisions, cftracks, candidates); } PROCESS_SWITCH(Filter2Prong, processDataML, "Process data D0 candidates with ML", false); - void processData(aod::Collisions::iterator const& cols, aod::BCsWithTimestamps const& bcs, aod::CFCollRefs const& cfcollisions, aod::CFTrackRefs const& cftracks, HFCandidates const& candidates) + void processData(aod::Collisions::iterator const& col, aod::BCsWithTimestamps const& bcs, aod::CFCollRefs const& cfcollisions, aod::CFTrackRefs const& cftracks, HFCandidates const& candidates) { - processDataT(cols, bcs, cfcollisions, cftracks, candidates); + processDataT(col, bcs, cfcollisions, cftracks, candidates); } PROCESS_SWITCH(Filter2Prong, processData, "Process data D0 candidates", true); + + void processMC(aod::McCollisions::iterator const&, aod::CFMcParticleRefs const& cfmcparticles, aod::McParticles const& mcparticles) + { + // The main filter outputs the primary MC particles. Here we just resolve the daughter indices that are needed for the efficiency matching. + for (auto& r : cfmcparticles) { + const auto& mcParticle = mcparticles.iteratorAt(r.mcParticleId()); + if (mcParticle.daughtersIds().size() != 2) { + output2ProngMcParts(-1, -1); + continue; + } + int prongCFId[2] = {-1, -1}; + for (uint i = 0; i < 2; ++i) { + for (auto& cfmcpart : cfmcparticles) { + if (mcParticle.daughtersIds()[i] == cfmcpart.mcParticleId()) { + prongCFId[i] = cfmcpart.globalIndex(); + break; + } + } + } + output2ProngMcParts(prongCFId[0], prongCFId[1]); + } + } + PROCESS_SWITCH(Filter2Prong, processMC, "Process MC 2-prong daughters", false); }; // struct WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) diff --git a/PWGCF/TableProducer/filterCorrelations.cxx b/PWGCF/TableProducer/filterCorrelations.cxx index 6b27e27dcd6..7d5e0b17c38 100644 --- a/PWGCF/TableProducer/filterCorrelations.cxx +++ b/PWGCF/TableProducer/filterCorrelations.cxx @@ -8,6 +8,8 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +#include + #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" @@ -62,9 +64,10 @@ struct FilterCF { O2_DEFINE_CONFIGURABLE(cfgMinOcc, int, 0, "minimum occupancy selection") O2_DEFINE_CONFIGURABLE(cfgMaxOcc, int, 3000, "maximum occupancy selection") O2_DEFINE_CONFIGURABLE(cfgCollisionFlags, uint16_t, aod::collision::CollisionFlagsRun2::Run2VertexerTracks, "Request collision flags if non-zero (0 = off, 1 = Run2VertexerTracks)") - O2_DEFINE_CONFIGURABLE(cfgTransientTables, bool, false, "Output transient tables for collision and track IDs") + O2_DEFINE_CONFIGURABLE(cfgTransientTables, bool, false, "Output transient tables for collision and track IDs to enable successive filtering tasks") O2_DEFINE_CONFIGURABLE(cfgTrackSelection, int, 0, "Type of track selection (0 = Run 2/3 without systematics | 1 = Run 3 with systematics)") O2_DEFINE_CONFIGURABLE(cfgMinMultiplicity, float, -1, "Minimum multiplicity considered for filtering (if value positive)") + O2_DEFINE_CONFIGURABLE(cfgMcSpecialPDGs, std::vector, {}, "Special MC PDG codes to include in the MC primary particle output (additional to charged particles). Empty = charged particles only.") // needed for some neutral particles // Filters and input definitions Filter collisionZVtxFilter = nabs(aod::collision::posZ) < cfgCutVertex; @@ -90,6 +93,11 @@ struct FilterCF { Produces outputCollRefs; Produces outputTrackRefs; + Produces outputMcParticleRefs; + + // persistent caches + std::vector mcReconstructedCache; + std::vector mcParticleLabelsCache; template bool keepCollision(TCollision& collision) @@ -182,11 +190,13 @@ struct FilterCF { soa::Filtered> const& tracks, aod::BCsWithTimestamps const&) { - bool* reconstructed = new bool[allParticles.size()]; - int* mcParticleLabels = new int[allParticles.size()]; + mcReconstructedCache.reserve(allParticles.size()); + mcParticleLabelsCache.reserve(allParticles.size()); + mcReconstructedCache.clear(); + mcParticleLabelsCache.clear(); for (int i = 0; i < allParticles.size(); i++) { - reconstructed[i] = false; - mcParticleLabels[i] = -1; + mcReconstructedCache.push_back(false); + mcParticleLabelsCache.push_back(-1); } // PASS 1 on collisions: check which particles are kept @@ -202,7 +212,7 @@ struct FilterCF { for (auto& track : groupedTracks) { if (track.has_mcParticle()) { - reconstructed[track.mcParticleId()] = true; + mcReconstructedCache[track.mcParticleId()] = true; } } } @@ -222,25 +232,29 @@ struct FilterCF { if (pdgparticle != nullptr) { sign = (pdgparticle->Charge() > 0) ? 1.0 : ((pdgparticle->Charge() < 0) ? -1.0 : 0.0); } + + bool special = !cfgMcSpecialPDGs->empty() && std::find(cfgMcSpecialPDGs->begin(), cfgMcSpecialPDGs->end(), particle.pdgCode()) != cfgMcSpecialPDGs->end(); bool primary = particle.isPhysicalPrimary() && sign != 0 && std::abs(particle.eta()) < cfgCutMCEta && particle.pt() > cfgCutMCPt; if (primary) { multiplicity++; } - if (reconstructed[particle.globalIndex()] || primary) { + if (mcReconstructedCache[particle.globalIndex()] || primary || special) { // keep particle // use highest bit to flag if it is reconstructed uint8_t flags = particle.flags() & ~aod::cfmcparticle::kReconstructed; // clear bit in case of clashes in the future - if (reconstructed[particle.globalIndex()]) { + if (mcReconstructedCache[particle.globalIndex()]) { flags |= aod::cfmcparticle::kReconstructed; } // NOTE using "outputMcCollisions.lastIndex()+1" here to allow filling of outputMcCollisions *after* the loop outputMcParticles(outputMcCollisions.lastIndex() + 1, truncateFloatFraction(particle.pt(), FLOAT_PRECISION), truncateFloatFraction(particle.eta(), FLOAT_PRECISION), truncateFloatFraction(particle.phi(), FLOAT_PRECISION), sign, particle.pdgCode(), flags); + if (cfgTransientTables) + outputMcParticleRefs(outputMcCollisions.lastIndex() + 1, particle.globalIndex()); // relabeling array - mcParticleLabels[particle.globalIndex()] = outputMcParticles.lastIndex(); + mcParticleLabelsCache[particle.globalIndex()] = outputMcParticles.lastIndex(); } } outputMcCollisions(mcCollision.posZ(), multiplicity); @@ -261,26 +275,27 @@ struct FilterCF { // NOTE works only when we store all MC collisions (as we do here) outputCollisions(bc.runNumber(), collision.posZ(), collision.multiplicity(), bc.timestamp()); outputMcCollisionLabels(collision.mcCollisionId()); + if (cfgTransientTables) + outputCollRefs(collision.globalIndex()); for (auto& track : groupedTracks) { int mcParticleId = track.mcParticleId(); if (mcParticleId >= 0) { - mcParticleId = mcParticleLabels[track.mcParticleId()]; + mcParticleId = mcParticleLabelsCache[track.mcParticleId()]; if (mcParticleId < 0) { - LOGP(fatal, "processMC: Track {} is referring to a MC particle which we do not store {} {} (reco flag {})", track.index(), track.mcParticleId(), mcParticleId, reconstructed[track.mcParticleId()]); + LOGP(fatal, "processMC: Track {} is referring to a MC particle which we do not store {} {} (reco flag {})", track.index(), track.mcParticleId(), mcParticleId, static_cast(mcReconstructedCache[track.mcParticleId()])); } } outputTracks(outputCollisions.lastIndex(), truncateFloatFraction(track.pt()), truncateFloatFraction(track.eta()), truncateFloatFraction(track.phi()), track.sign(), getTrackType(track)); outputTrackLabels(mcParticleId); + if (cfgTransientTables) + outputTrackRefs(collision.globalIndex(), track.globalIndex()); yields->Fill(collision.multiplicity(), track.pt(), track.eta()); etaphi->Fill(collision.multiplicity(), track.eta(), track.phi()); } } - - delete[] reconstructed; - delete[] mcParticleLabels; } PROCESS_SWITCH(FilterCF, processMC, "Process MC", false); diff --git a/PWGCF/Tasks/correlations.cxx b/PWGCF/Tasks/correlations.cxx index ad875af5ee5..b901eaa61be 100644 --- a/PWGCF/Tasks/correlations.cxx +++ b/PWGCF/Tasks/correlations.cxx @@ -133,7 +133,9 @@ struct CorrelationTask { OutputObj same{"sameEvent"}; OutputObj mixed{"mixedEvent"}; + // persistent caches std::vector efficiencyAssociatedCache; + std::vector p2indexCache; struct Config { bool mPairCuts = false; @@ -215,7 +217,13 @@ struct CorrelationTask { same->setTrackEtaCut(cfgCutEta); mixed->setTrackEtaCut(cfgCutEta); - efficiencyAssociatedCache.reserve(512); + if (!cfgEfficiencyAssociated.value.empty()) + efficiencyAssociatedCache.reserve(512); + if (doprocessMCEfficiency2Prong) { + p2indexCache.reserve(16); + if (cfgMcTriggerPDGs->empty()) + LOGF(fatal, "At least one PDG code in {} is to be selected to process 2-prong efficiency.", cfgMcTriggerPDGs.name); + } // o2-ccdb-upload -p Users/jgrosseo/correlations/LHC15o -f /tmp/correction_2011_global.root -k correction @@ -949,11 +957,8 @@ struct CorrelationTask { case 2212: // proton case -2212: return 2; - case 421: // D0 - case -421: + default: // NOTE. The efficiency histogram is hardcoded to contain 4 species. Anything special will have the last slot. return 3; - default: - return 4; } } @@ -1004,6 +1009,57 @@ struct CorrelationTask { } PROCESS_SWITCH(CorrelationTask, processMCEfficiency, "MC: Extract efficiencies", false); + Preslice perCollision2Prong = aod::cftrack::cfCollisionId; + void processMCEfficiency2Prong(soa::Filtered::iterator const& mcCollision, soa::Join const& mcParticles, soa::SmallGroups const& collisions, aod::CFTracksWithLabel const&, aod::CF2ProngTracks const& p2tracks) + { + auto multiplicity = mcCollision.multiplicity(); + if (cfgCentBinsForMC > 0) { + if (collisions.size() == 0) { + return; + } + for (const auto& collision : collisions) { + multiplicity = collision.multiplicity(); + } + } + // Primaries + p2indexCache.clear(); + for (const auto& mcParticle : mcParticles) { + if (mcParticle.isPhysicalPrimary() && std::find(cfgMcTriggerPDGs->begin(), cfgMcTriggerPDGs->end(), mcParticle.pdgCode()) != cfgMcTriggerPDGs->end()) { + same->getTrackHistEfficiency()->Fill(CorrelationContainer::MC, mcParticle.eta(), mcParticle.pt(), getSpecies(mcParticle.pdgCode()), multiplicity, mcCollision.posZ()); + if (mcParticle.cfParticleDaugh0Id() < 0 || mcParticle.cfParticleDaugh1Id() < 0) + continue; + p2indexCache.push_back(mcParticle.globalIndex()); + } + } + for (const auto& collision : collisions) { + auto grouped2ProngTracks = p2tracks.sliceBy(perCollision2Prong, collision.globalIndex()); + + for (const auto& p2track : grouped2ProngTracks) { + // Check if the mc particles of the prongs are found. + const auto& p0 = p2track.cfTrackProng0_as(); + const auto& p1 = p2track.cfTrackProng1_as(); + if (p0.has_cfMCParticle() && p1.has_cfMCParticle()) { + // find the 2-prong MC particle by the daughter MC particle IDs + auto m = std::find_if(p2indexCache.begin(), p2indexCache.end(), [&](const auto& t) -> bool { + const auto& mcParticle = mcParticles.iteratorAt(t); + return p0.cfMCParticleId() == mcParticle.cfParticleDaugh0Id() && p1.cfMCParticleId() == mcParticle.cfParticleDaugh1Id(); + }); + if (m == p2indexCache.end()) + continue; + const auto& mcParticle = mcParticles.iteratorAt(*m); + if (mcParticle.isPhysicalPrimary()) { + same->getTrackHistEfficiency()->Fill(CorrelationContainer::RecoPrimaries, mcParticle.eta(), mcParticle.pt(), getSpecies(mcParticle.pdgCode()), multiplicity, mcCollision.posZ()); + } + same->getTrackHistEfficiency()->Fill(CorrelationContainer::RecoAll, mcParticle.eta(), mcParticle.pt(), getSpecies(mcParticle.pdgCode()), multiplicity, mcCollision.posZ()); + } else { + // fake track + same->getTrackHistEfficiency()->Fill(CorrelationContainer::Fake, p2track.eta(), p2track.pt(), 0, multiplicity, mcCollision.posZ()); + } + } + } + } + PROCESS_SWITCH(CorrelationTask, processMCEfficiency2Prong, "MC: Extract efficiencies for 2-prong particles", false); + // NOTE SmallGroups includes soa::Filtered always void processMCSameDerived(soa::Filtered::iterator const& mcCollision, soa::Filtered const& mcParticles, soa::SmallGroups const& collisions) { From 672f047e68c0083716359e6b8de9526cd1910e10 Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Tue, 4 Mar 2025 16:12:03 +0100 Subject: [PATCH 0529/1650] [PWGCF] jFlucEfficiencyTask - Add QA histo (#10308) --- PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx b/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx index b1de011c2de..352747c3054 100644 --- a/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx +++ b/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx @@ -249,6 +249,7 @@ struct JFlucEfficiencyTask { if (centrality < cfgCentMin || centrality > cfgCentMax) { return; } + registry.fill(HIST("hZVertexReco"), cfCollision.posZ(), centrality); for (const auto& track : cfTracks) { registry.fill(HIST("hPtRec"), track.pt(), centrality); @@ -342,6 +343,7 @@ struct JFlucEfficiencyTask { if (centrality < cfgCentMin || centrality > cfgCentMax) { return; } + registry.fill(HIST("hZVertexReco"), collision.posZ(), centrality); for (const auto& track : tracks) { // pT and eta selections if (track.pt() < cfgPtMin || track.pt() > cfgPtMax || track.eta() < cfgEtaMin || track.eta() > cfgEtaMax) { From 1ee4f6df2ebe64cebf2e730e21923dcc59eacc1a Mon Sep 17 00:00:00 2001 From: Rohaan Deb <67634136+RD0407@users.noreply.github.com> Date: Tue, 4 Mar 2025 16:38:32 +0100 Subject: [PATCH 0530/1650] [PWGLF] Update PWGLF/Taska/Nuspex/spectraTOF.cxx (#10305) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Nuspex/spectraTOF.cxx | 308 ++++++++++++++++++------------ 1 file changed, 189 insertions(+), 119 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/spectraTOF.cxx b/PWGLF/Tasks/Nuspex/spectraTOF.cxx index 27b73e9bcd3..ef8209d99f7 100644 --- a/PWGLF/Tasks/Nuspex/spectraTOF.cxx +++ b/PWGLF/Tasks/Nuspex/spectraTOF.cxx @@ -69,9 +69,7 @@ std::array, NpCharge> hDecayLengthMCCharm; // Decay Length std::array, NpCharge> hDecayLengthMCBeauty; // Decay Length in the MC for particles from charm std::array, NpCharge> hDecayLengthMCNotHF; // Decay Length in the MC for particles from not a HF -std::array, NpCharge> hPtNumTOFMatchWithPIDSignalPrm; // Pt distribution of particles with a hit in the TOF and a compatible signal - -// Spectra task +// Spectra tas struct tofSpectra { struct : ConfigurableGroup { Configurable cfgCutVertex{"cfgCutVertex", 10.0f, "Accepted z-vertex range"}; @@ -140,8 +138,10 @@ struct tofSpectra { Configurable enableTPCTOFvsEtaHistograms{"enableTPCTOFvsEtaHistograms", false, "choose if produce TPC tof vs Eta"}; Configurable includeCentralityMC{"includeCentralityMC", false, "choose if include Centrality to MC"}; Configurable isImpactParam{"isImpactParam", false, "choose if include impactparam to MC"}; + Configurable usePDGcode{"usePDGcode", false, "choose if include PDG code for MC closure test"}; Configurable enableTPCTOFVsMult{"enableTPCTOFVsMult", false, "Produce TPC-TOF plots vs multiplicity"}; Configurable includeCentralityToTracks{"includeCentralityToTracks", false, "choose if include Centrality to tracks"}; + Configurable min_ITS_nClusters{"min_ITS_nClusters", 5, "minimum number of found ITS clusters"}; // Histograms HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -217,15 +217,17 @@ struct tofSpectra { LOG(info) << "\tmaxChi2PerClusterTPC=" << maxChi2PerClusterTPC.value; LOG(info) << "\tminChi2PerClusterTPC=" << minChi2PerClusterTPC.value; LOG(info) << "\tminNCrossedRowsTPC=" << minNCrossedRowsTPC.value; - LOG(info) << "\tminTPCNClsFound=" << minTPCNClsFound.value; + LOG(info) << "\tmin_ITS_nClusters=" << min_ITS_nClusters.value; LOG(info) << "\tmaxChi2PerClusterITS=" << maxChi2PerClusterITS.value; LOG(info) << "\tmaxDcaZ=" << maxDcaZ.value; + LOG(info) << "\tmaxDcaZ=" << maxDcaZ.value; LOG(info) << "\tmakeTHnSparseChoice=" << makeTHnSparseChoice.value; customTrackCuts = getGlobalTrackSelectionRun3ITSMatch(itsPattern.value); LOG(info) << "Customizing track cuts:"; customTrackCuts.SetRequireITSRefit(requireITS.value); customTrackCuts.SetRequireTPCRefit(requireTPC.value); + customTrackCuts.SetMinNClustersITS(min_ITS_nClusters.value); customTrackCuts.SetRequireGoldenChi2(requireGoldenChi2.value); customTrackCuts.SetMaxChi2PerClusterTPC(maxChi2PerClusterTPC.value); customTrackCuts.SetMaxChi2PerClusterITS(maxChi2PerClusterITS.value); @@ -437,9 +439,23 @@ struct tofSpectra { histos.add("Data/cent/pos/pt/its_tof", "pos ITS-TOF", kTH3D, {ptAxis, multAxis, occupancyAxis}); histos.add("Data/cent/neg/pt/its_tof", "neg ITS-TOF", kTH3D, {ptAxis, multAxis, occupancyAxis}); } + const AxisSpec nsigmaTPCAxisOccupancy{binsOptions.binsnsigmaTPC, "nsigmaTPC"}; + histos.add("nsigmatpc/mc_closure/pos/pi", "mc_closure dependent pion", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); + histos.add("nsigmatpc/mc_closure/neg/pi", "mc_closure dependent pion", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); + histos.add("nsigmatof/mc_closure/pos/pi", "mc_closure dependent pion", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); + histos.add("nsigmatof/mc_closure/neg/pi", "mc_closure dependent pion", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); + + histos.add("nsigmatpc/mc_closure/pos/ka", "mc_closure dependent kaon", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); + histos.add("nsigmatpc/mc_closure/neg/ka", "mc_closure dependent kaon", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); + histos.add("nsigmatof/mc_closure/pos/ka", "mc_closure dependent kaon", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); + histos.add("nsigmatof/mc_closure/neg/ka", "mc_closure dependent kaon", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); + + histos.add("nsigmatpc/mc_closure/pos/pr", "mc_closure dependent proton", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); + histos.add("nsigmatpc/mc_closure/neg/pr", "mc_closure dependent proton", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); + histos.add("nsigmatof/mc_closure/pos/pr", "mc_closure dependent proton", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); + histos.add("nsigmatof/mc_closure/neg/pr", "mc_closure dependent proton", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); if (doprocessOccupancy) { - const AxisSpec nsigmaTPCAxisOccupancy{binsOptions.binsnsigmaTPC, "nsigmaTPC"}; histos.add("nsigmatpc/test_occupancy/Mult_vs_Occupancy", "occuppancy vs Multiplicity", kTHnSparseD, {multAxis, occupancyAxis}); histos.add("nsigmatpc/test_occupancy/pos/pi", "occuppancy dependent pion", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis, occupancyAxis}); histos.add("nsigmatpc/test_occupancy/neg/pi", "occuppancy dependent pion", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis, occupancyAxis}); @@ -486,12 +502,6 @@ struct tofSpectra { histos.add("MC/withPID/ka/neg/prm/pt/numtof", "recons. MC K^{-}", kTHnSparseD, {ptAxis, impParamAxis}); histos.add("MC/withPID/pr/pos/prm/pt/numtof", "recons. MC p", kTHnSparseD, {ptAxis, impParamAxis}); histos.add("MC/withPID/pr/neg/prm/pt/numtof", "recons. MC #bar{p}", kTHnSparseD, {ptAxis, impParamAxis}); - histos.add("MC/withPID/pi/pos/prm/pt/numtof_matched", "recons. MC #pi^{+}", kTHnSparseD, {ptAxis, impParamAxis}); - histos.add("MC/withPID/pi/neg/prm/pt/numtof_matched", "recons. MC #pi^{-}", kTHnSparseD, {ptAxis, impParamAxis}); - histos.add("MC/withPID/ka/pos/prm/pt/numtof_matched", "recons. MC K^{+}", kTHnSparseD, {ptAxis, impParamAxis}); - histos.add("MC/withPID/ka/neg/prm/pt/numtof_matched", "recons. MC K^{-}", kTHnSparseD, {ptAxis, impParamAxis}); - histos.add("MC/withPID/pr/pos/prm/pt/numtof_matched", "recons. MC p", kTHnSparseD, {ptAxis, impParamAxis}); - histos.add("MC/withPID/pr/neg/prm/pt/numtof_matched", "recons. MC #bar{p}", kTHnSparseD, {ptAxis, impParamAxis}); } else { histos.add("MC/withPID/pi/pos/prm/pt/num", "recons. MC #pi^{+}", kTHnSparseD, {ptAxis, multAxis}); histos.add("MC/withPID/pi/neg/prm/pt/num", "recons. MC #pi^{-}", kTHnSparseD, {ptAxis, multAxis}); @@ -517,12 +527,6 @@ struct tofSpectra { histos.add("MC/withPID/ka/neg/prm/pt/numtof", "recons. MC K^{-}", kTHnSparseD, {ptAxis, multAxis}); histos.add("MC/withPID/pr/pos/prm/pt/numtof", "recons. MC p", kTHnSparseD, {ptAxis, multAxis}); histos.add("MC/withPID/pr/neg/prm/pt/numtof", "recons. MC #bar{p}", kTHnSparseD, {ptAxis, multAxis}); - histos.add("MC/withPID/pi/pos/prm/pt/numtof_matched", "recons. MC #pi^{+}", kTHnSparseD, {ptAxis, multAxis}); - histos.add("MC/withPID/pi/neg/prm/pt/numtof_matched", "recons. MC #pi^{-}", kTHnSparseD, {ptAxis, multAxis}); - histos.add("MC/withPID/ka/pos/prm/pt/numtof_matched", "recons. MC K^{+}", kTHnSparseD, {ptAxis, multAxis}); - histos.add("MC/withPID/ka/neg/prm/pt/numtof_matched", "recons. MC K^{-}", kTHnSparseD, {ptAxis, multAxis}); - histos.add("MC/withPID/pr/pos/prm/pt/numtof_matched", "recons. MC p", kTHnSparseD, {ptAxis, multAxis}); - histos.add("MC/withPID/pr/neg/prm/pt/numtof_matched", "recons. MC #bar{p}", kTHnSparseD, {ptAxis, multAxis}); } if (doprocessMCgen) { histos.add("MC/test/pi/pos/prm/pt/den", "generated MC #pi^{+}", kTHnSparseD, {ptAxis, impParamAxis}); @@ -674,7 +678,6 @@ struct tofSpectra { histos.add(hdcaz[i].data(), pTCharge[i], kTH2D, {ptAxis, dcaZAxis}); } - const std::string cpName = Form("/%s", pNCharge[i]); if (doprocessMC) { if (includeCentralityMC) { //*************************************RD********************************************** @@ -717,7 +720,6 @@ struct tofSpectra { histos.add(hpt_numtof_mat[i].data(), pTCharge[i], kTH2D, {ptAxis, multAxis}); histos.add(hpt_numtofgoodmatch_prm[i].data(), pTCharge[i], kTH2D, {ptAxis, multAxis}); - hPtNumTOFMatchWithPIDSignalPrm[i] = histos.add("MC" + cpName + "/prm/pt/numtofwithpid", pTCharge[i], kTH2D, {ptAxis, multAxis}); histos.add(hpt_den_prm[i].data(), pTCharge[i], kTH2D, {ptAxis, multAxis}); histos.add(hpt_den_str[i].data(), pTCharge[i], kTH2D, {ptAxis, multAxis}); @@ -729,6 +731,7 @@ struct tofSpectra { } histos.add(hpt_den_prm_mcgoodev[i].data(), pTCharge[i], kTH2D, {ptAxis, multAxis}); histos.add(hpt_den_prm_mcbadev[i].data(), pTCharge[i], kTH2D, {ptAxis, multAxis}); + const std::string cpName = Form("/%s/%s", (i < Np) ? "pos" : "neg", pN[i % Np]); if (enableDCAxyzHistograms) { hDcaXYZPrm[i] = histos.add("dcaprm" + cpName, pTCharge[i], kTH3D, {ptAxis, dcaXyAxis, dcaZAxis}); hDcaXYZStr[i] = histos.add("dcastr" + cpName, pTCharge[i], kTH3D, {ptAxis, dcaXyAxis, dcaZAxis}); @@ -1417,7 +1420,136 @@ struct tofSpectra { aod::CentFV0As, aod::CentFT0Ms, aod::CentFT0As, aod::CentFT0Cs>; using TrackCandidates = soa::Join; + void processMCclosure(CollisionCandidates::iterator const& collisions, + soa::Join const& tracks, + aod::McTrackLabels const& mcTrackLabels, aod::McParticles const& mcParticles) + { + const float multiplicity = getMultiplicity(collisions); + // int trackwoCut = 0; int trackwCut = 0; + + for (const auto& track : tracks) { + if (!track.has_collision()) { + continue; + } + const auto& collision = track.collision_as(); + if (!isEventSelected(collision)) { + continue; + } + if (!isTrackSelected(track, collision)) { + continue; + } + // trackwoCut++; + if (std::abs(track.dcaXY()) > 0.05) { // Skipping tracks that don't pass the standard cuts + return; + } + + // trackwCut++; + const auto& mcLabel = mcTrackLabels.iteratorAt(track.globalIndex()); + const auto& mcParticle = mcParticles.iteratorAt(mcLabel.mcParticleId()); + int pdgCode = mcParticle.pdgCode(); + const auto& nsigmaTPCPi = o2::aod::pidutils::tpcNSigma<2>(track); + const auto& nsigmaTPCKa = o2::aod::pidutils::tpcNSigma<3>(track); + const auto& nsigmaTPCPr = o2::aod::pidutils::tpcNSigma<4>(track); + + bool isTPCPion = std::abs(nsigmaTPCPi) < trkselOptions.cfgCutNsigma; + bool isTPCKaon = std::abs(nsigmaTPCKa) < trkselOptions.cfgCutNsigma; + bool isTPCProton = std::abs(nsigmaTPCPr) < trkselOptions.cfgCutNsigma; + const auto& nsigmaTOFPi = o2::aod::pidutils::tofNSigma<2>(track); + const auto& nsigmaTOFKa = o2::aod::pidutils::tofNSigma<3>(track); + const auto& nsigmaTOFPr = o2::aod::pidutils::tofNSigma<4>(track); + + bool isTOFPion = track.hasTOF() && std::abs(nsigmaTOFPi) < trkselOptions.cfgCutNsigma; + bool isTOFKaon = track.hasTOF() && std::abs(nsigmaTOFKa) < trkselOptions.cfgCutNsigma; + bool isTOFProton = track.hasTOF() && std::abs(nsigmaTOFPr) < trkselOptions.cfgCutNsigma; + // Precompute rapidity values to avoid redundant calculations + double rapidityPi = std::abs(track.rapidity(PID::getMass(2))); + double rapidityKa = std::abs(track.rapidity(PID::getMass(3))); + double rapidityPr = std::abs(track.rapidity(PID::getMass(4))); + if (track.eta() < trkselOptions.cfgCutEtaMin || track.eta() > trkselOptions.cfgCutEtaMax) { + return; + } + if (mcParticle.isPhysicalPrimary()) { + if (isTPCPion && rapidityPi <= trkselOptions.cfgCutY) { + if (usePDGcode) { + if (pdgCode == 211) { + histos.fill(HIST("nsigmatpc/mc_closure/pos/pi"), track.pt(), nsigmaTPCPi, multiplicity); + } else if (pdgCode == -211) { + histos.fill(HIST("nsigmatpc/mc_closure/neg/pi"), track.pt(), nsigmaTPCPi, multiplicity); + } + } else { + histos.fill(HIST("nsigmatpc/mc_closure/pos/pi"), track.pt(), nsigmaTPCPi, multiplicity); + histos.fill(HIST("nsigmatpc/mc_closure/neg/pi"), track.pt(), nsigmaTPCPi, multiplicity); + } + } + if (isTPCKaon && rapidityKa <= trkselOptions.cfgCutY) { + if (usePDGcode) { + if (pdgCode == 321) { + histos.fill(HIST("nsigmatpc/mc_closure/pos/ka"), track.pt(), nsigmaTPCKa, multiplicity); + } else if (pdgCode == -321) { + histos.fill(HIST("nsigmatpc/mc_closure/neg/ka"), track.pt(), nsigmaTPCKa, multiplicity); + } + } else { + histos.fill(HIST("nsigmatpc/mc_closure/pos/ka"), track.pt(), nsigmaTPCKa, multiplicity); + histos.fill(HIST("nsigmatpc/mc_closure/neg/ka"), track.pt(), nsigmaTPCKa, multiplicity); + } + } + if (isTPCProton && rapidityPr <= trkselOptions.cfgCutY) { + if (usePDGcode) { + if (pdgCode == 2212) { + histos.fill(HIST("nsigmatpc/mc_closure/pos/pr"), track.pt(), nsigmaTPCPr, multiplicity); + } else if (pdgCode == -2212) { + histos.fill(HIST("nsigmatpc/mc_closure/neg/pr"), track.pt(), nsigmaTPCPr, multiplicity); + } + } else { + histos.fill(HIST("nsigmatpc/mc_closure/pos/pr"), track.pt(), nsigmaTPCPr, multiplicity); + histos.fill(HIST("nsigmatpc/mc_closure/neg/pr"), track.pt(), nsigmaTPCPr, multiplicity); + } + } + + // TOF Selection and Histogram Filling + if (isTOFPion && rapidityPi <= trkselOptions.cfgCutY) { + if (usePDGcode) { + if (pdgCode == 211) { + histos.fill(HIST("nsigmatof/mc_closure/pos/pi"), track.pt(), nsigmaTOFPi, multiplicity); + } else if (pdgCode == -211) { + histos.fill(HIST("nsigmatof/mc_closure/neg/pi"), track.pt(), nsigmaTOFPi, multiplicity); + } + } else { + histos.fill(HIST("nsigmatof/mc_closure/pos/pi"), track.pt(), nsigmaTOFPi, multiplicity); + histos.fill(HIST("nsigmatof/mc_closure/neg/pi"), track.pt(), nsigmaTOFPi, multiplicity); + } + } + if (isTOFKaon && rapidityKa <= trkselOptions.cfgCutY) { + if (usePDGcode) { + if (pdgCode == 321) { + histos.fill(HIST("nsigmatof/mc_closure/pos/ka"), track.pt(), nsigmaTOFKa, multiplicity); + } else if (pdgCode == -321) { + histos.fill(HIST("nsigmatof/mc_closure/neg/ka"), track.pt(), nsigmaTOFKa, multiplicity); + } + } else { + histos.fill(HIST("nsigmatof/mc_closure/pos/ka"), track.pt(), nsigmaTOFKa, multiplicity); + histos.fill(HIST("nsigmatof/mc_closure/neg/ka"), track.pt(), nsigmaTOFKa, multiplicity); + } + } + if (isTOFProton && rapidityPr <= trkselOptions.cfgCutY) { + if (usePDGcode) { + if (pdgCode == 2212) { + histos.fill(HIST("nsigmatof/mc_closure/pos/pr"), track.pt(), nsigmaTOFPr, multiplicity); + } else if (pdgCode == -2212) { + histos.fill(HIST("nsigmatof/mc_closure/neg/pr"), track.pt(), nsigmaTOFPr, multiplicity); + } + } else { + histos.fill(HIST("nsigmatof/mc_closure/pos/pr"), track.pt(), nsigmaTOFPr, multiplicity); + histos.fill(HIST("nsigmatof/mc_closure/neg/pr"), track.pt(), nsigmaTOFPr, multiplicity); + } + } + } + } + } + PROCESS_SWITCH(tofSpectra, processMCclosure, "MC closure test", true); void processOccupancy(CollisionCandidates::iterator const& collision, soa::Join(track); + ; const auto& nsigmaTPCKa = o2::aod::pidutils::tpcNSigma<3>(track); const auto& nsigmaTPCPr = o2::aod::pidutils::tpcNSigma<4>(track); - const bool isTPCPion = std::abs(nsigmaTPCPi) < trkselOptions.cfgCutNsigma; - const bool isTPCKaon = std::abs(nsigmaTPCKa) < trkselOptions.cfgCutNsigma; - const bool isTPCProton = std::abs(nsigmaTPCPr) < trkselOptions.cfgCutNsigma; + bool isTPCPion = std::abs(nsigmaTPCPi) < trkselOptions.cfgCutNsigma; + bool isTPCKaon = std::abs(nsigmaTPCKa) < trkselOptions.cfgCutNsigma; + bool isTPCProton = std::abs(nsigmaTPCPr) < trkselOptions.cfgCutNsigma; const auto& nsigmaTOFPi = o2::aod::pidutils::tofNSigma<2>(track); const auto& nsigmaTOFKa = o2::aod::pidutils::tofNSigma<3>(track); const auto& nsigmaTOFPr = o2::aod::pidutils::tofNSigma<4>(track); - const bool isTOFPion = track.hasTOF() && std::abs(nsigmaTOFPi) < trkselOptions.cfgCutNsigma; - const bool isTOFKaon = track.hasTOF() && std::abs(nsigmaTOFKa) < trkselOptions.cfgCutNsigma; - const bool isTOFProton = track.hasTOF() && std::abs(nsigmaTOFPr) < trkselOptions.cfgCutNsigma; + bool isTOFPion = track.hasTOF() && std::abs(nsigmaTOFPi) < trkselOptions.cfgCutNsigma; + bool isTOFKaon = track.hasTOF() && std::abs(nsigmaTOFKa) < trkselOptions.cfgCutNsigma; + bool isTOFProton = track.hasTOF() && std::abs(nsigmaTOFPr) < trkselOptions.cfgCutNsigma; // Apply rapidity cut for identified particles if (isTPCPion && std::abs(track.rapidity(PID::getMass(2))) < trkselOptions.cfgCutY) { @@ -1740,8 +1873,10 @@ struct tofSpectra { const auto& mcCollision = collision.mcCollision_as(); const float multiplicity = getMultiplicityMC(mcCollision); - const int occupancy = collision.trackOccupancyInTimeRange(); + int occupancy = collision.trackOccupancyInTimeRange(); + //************************************RD************************************************** const float impParam = mcCollision.impactParameter(); + //************************************RD************************************************** if (mcParticle.pdgCode() != PDGs[i]) { return; @@ -1749,15 +1884,18 @@ struct tofSpectra { if (track.eta() < trkselOptions.cfgCutEtaMin || track.eta() > trkselOptions.cfgCutEtaMax) { return; } + if (std::abs(mcParticle.y()) > trkselOptions.cfgCutY) { return; } const auto& nsigmaTPCKa = o2::aod::pidutils::tpcNSigma<3>(track); - const bool isKaonTPC = std::abs(nsigmaTPCKa) < trkselOptions.cfgCutNsigma; + + bool isKaonTPC = std::abs(nsigmaTPCKa) < trkselOptions.cfgCutNsigma; const auto& nsigmaTOFKa = o2::aod::pidutils::tofNSigma<3>(track); - const bool isKaonTOF = std::abs(nsigmaTOFKa) < trkselOptions.cfgCutNsigma; + + bool isKaonTOF = std::abs(nsigmaTOFKa) < trkselOptions.cfgCutNsigma; // Filling DCA info with the TPC+TOF PID bool isDCAPureSample = (std::sqrt(nsigmaTOFKa * nsigmaTOFKa + nsigmaTPCKa * nsigmaTPCKa) < 2.f); @@ -1772,7 +1910,7 @@ struct tofSpectra { } if (!mcParticle.isPhysicalPrimary()) { // Secondaries (weak decays and material) - if (mcParticle.getProcess() == 4) { // Particles from decay + if (mcParticle.getProcess() == 4) { if (enableDCAxyzHistograms) { hDcaXYZStr[i]->Fill(track.pt(), track.dcaXY(), track.dcaZ()); } else { @@ -1789,7 +1927,7 @@ struct tofSpectra { hDecayLengthStr[i]->Fill(track.pt(), decayLength); } } - } else { // Particles from the material + } else { if (enableDCAxyzHistograms) { hDcaXYZMat[i]->Fill(track.pt(), track.dcaXY(), track.dcaZ()); } else { @@ -1893,21 +2031,21 @@ struct tofSpectra { if (!passesDCAxyCut(track)) { // Skipping tracks that don't pass the standard cuts return; } - const int pdgCode = mcParticle.pdgCode(); + int pdgCode = mcParticle.pdgCode(); const auto& nsigmaTPCPi = o2::aod::pidutils::tpcNSigma<2>(track); const auto& nsigmaTPCPr = o2::aod::pidutils::tpcNSigma<4>(track); - const bool isPionTPC = std::abs(nsigmaTPCPi) < trkselOptions.cfgCutNsigma; - const bool isProtonTPC = std::abs(nsigmaTPCPr) < trkselOptions.cfgCutNsigma; + bool isPionTPC = std::abs(nsigmaTPCPi) < trkselOptions.cfgCutNsigma; + bool isProtonTPC = std::abs(nsigmaTPCPr) < trkselOptions.cfgCutNsigma; const auto& nsigmaTOFPi = o2::aod::pidutils::tofNSigma<2>(track); const auto& nsigmaTOFPr = o2::aod::pidutils::tofNSigma<4>(track); - const bool isPionTOF = std::abs(nsigmaTOFPi) < trkselOptions.cfgCutNsigma; - const bool isProtonTOF = std::abs(nsigmaTOFPr) < trkselOptions.cfgCutNsigma; + bool isPionTOF = std::abs(nsigmaTOFPi) < trkselOptions.cfgCutNsigma; + bool isProtonTOF = std::abs(nsigmaTOFPr) < trkselOptions.cfgCutNsigma; - if (!mcParticle.isPhysicalPrimary()) { // Is not physical primary - if (mcParticle.getProcess() == 4) { // Is from decay + if (!mcParticle.isPhysicalPrimary()) { + if (mcParticle.getProcess() == 4) { if (includeCentralityMC) { if (includeCentralityMC) { histos.fill(HIST(hpt_num_str[i]), track.pt(), multiplicity, track.dcaXY()); @@ -1935,7 +2073,7 @@ struct tofSpectra { } } } - } else { // Is physical primary + } else { if (includeCentralityMC) { if (isImpactParam) { histos.fill(HIST(hpt_num_prm[i]), track.pt(), impParam, track.dcaXY(), occupancy); @@ -2082,90 +2220,42 @@ struct tofSpectra { } if (track.hasTOF()) { if (isPionTOF || isKaonTOF || isProtonTOF) { - // Proton (positive) if (pdgCode == 2212) { if (isImpactParam) { histos.fill(HIST("MC/withPID/pr/pos/prm/pt/numtof"), track.pt(), impParam); } else { histos.fill(HIST("MC/withPID/pr/pos/prm/pt/numtof"), track.pt(), multiplicity); } - // Matched proton condition - if (!(track.mcMask() & (1 << 11))) { - if (isImpactParam) { - histos.fill(HIST("MC/withPID/pr/pos/prm/pt/numtof_matched"), track.pt(), impParam); - } else { - histos.fill(HIST("MC/withPID/pr/pos/prm/pt/numtof_matched"), track.pt(), multiplicity); - } - } } else if (pdgCode == -2212) { if (isImpactParam) { histos.fill(HIST("MC/withPID/pr/neg/prm/pt/numtof"), track.pt(), impParam); } else { histos.fill(HIST("MC/withPID/pr/neg/prm/pt/numtof"), track.pt(), multiplicity); } - if (!(track.mcMask() & (1 << 11))) { - if (isImpactParam) { - histos.fill(HIST("MC/withPID/pr/neg/prm/pt/numtof_matched"), track.pt(), impParam); - } else { - histos.fill(HIST("MC/withPID/pr/neg/prm/pt/numtof_matched"), track.pt(), multiplicity); - } - } } else if (pdgCode == 211) { if (isImpactParam) { histos.fill(HIST("MC/withPID/pi/pos/prm/pt/numtof"), track.pt(), impParam); } else { histos.fill(HIST("MC/withPID/pi/pos/prm/pt/numtof"), track.pt(), multiplicity); } - // Matched pion condition - if (!(track.mcMask() & (1 << 11))) { - if (isImpactParam) { - histos.fill(HIST("MC/withPID/pi/pos/prm/pt/numtof_matched"), track.pt(), impParam); - } else { - histos.fill(HIST("MC/withPID/pi/pos/prm/pt/numtof_matched"), track.pt(), multiplicity); - } - } } else if (pdgCode == -211) { if (isImpactParam) { histos.fill(HIST("MC/withPID/pi/neg/prm/pt/numtof"), track.pt(), impParam); } else { histos.fill(HIST("MC/withPID/pi/neg/prm/pt/numtof"), track.pt(), multiplicity); } - // Matched pion condition - if (!(track.mcMask() & (1 << 11))) { - if (isImpactParam) { - histos.fill(HIST("MC/withPID/pi/neg/prm/pt/numtof_matched"), track.pt(), impParam); - } else { - histos.fill(HIST("MC/withPID/pi/neg/prm/pt/numtof_matched"), track.pt(), multiplicity); - } - } } else if (pdgCode == 321) { if (isImpactParam) { histos.fill(HIST("MC/withPID/ka/pos/prm/pt/numtof"), track.pt(), impParam); } else { histos.fill(HIST("MC/withPID/ka/pos/prm/pt/numtof"), track.pt(), multiplicity); } - // Matched kaon condition - if (!(track.mcMask() & (1 << 11))) { - if (isImpactParam) { - histos.fill(HIST("MC/withPID/ka/pos/prm/pt/numtof_matched"), track.pt(), impParam); - } else { - histos.fill(HIST("MC/withPID/ka/pos/prm/pt/numtof_matched"), track.pt(), multiplicity); - } - } } else if (pdgCode == -321) { if (isImpactParam) { histos.fill(HIST("MC/withPID/ka/neg/prm/pt/numtof"), track.pt(), impParam); } else { histos.fill(HIST("MC/withPID/ka/neg/prm/pt/numtof"), track.pt(), multiplicity); } - // Matched kaon condition - if (!(track.mcMask() & (1 << 11))) { - if (isImpactParam) { - histos.fill(HIST("MC/withPID/ka/neg/prm/pt/numtof_matched"), track.pt(), impParam); - } else { - histos.fill(HIST("MC/withPID/ka/neg/prm/pt/numtof_matched"), track.pt(), multiplicity); - } - } } } if (includeCentralityMC) { @@ -2184,27 +2274,6 @@ struct tofSpectra { histos.fill(HIST(hpt_numtofgoodmatch_prm[i]), track.pt(), multiplicity); } } - // Check if the signal is compatible with the PID hypothesis - float nsigma = 0.f; - switch (i) { - case 2: - case Np + 2: - nsigma = track.tofNSigmaPi(); - break; - case 3: - case Np + 3: - nsigma = track.tofNSigmaKa(); - break; - case 4: - case Np + 4: - nsigma = track.tofNSigmaPr(); - break; - default: - break; - } - if (std::abs(nsigma) <= trkselOptions.cfgCutNsigma) { - hPtNumTOFMatchWithPIDSignalPrm[i]->Fill(track.pt(), multiplicity); - } } // Filling mismatched info for primary tracks @@ -2467,12 +2536,12 @@ struct tofSpectra { fillParticleHistograms_MCGenEvs(mcParticle, mcCollision); }); } - // if (mcCollision.isInelGt0()) { - // histos.fill(HIST("MC/GenRecoCollisions"), 3.f); - // } - // if (mcCollision.isInelGt1()) { - // histos.fill(HIST("MC/GenRecoCollisions"), 4.f); - // } + if (mcCollision.isInelGt0()) { + histos.fill(HIST("MC/GenRecoCollisions"), 3.f); + } + if (mcCollision.isInelGt1()) { + histos.fill(HIST("MC/GenRecoCollisions"), 4.f); + } if (hasParticleInFT0C && hasParticleInFT0A) { histos.fill(HIST("MC/GenRecoCollisions"), 5.f); } @@ -2560,20 +2629,21 @@ struct tofSpectra { } const auto& nsigmaTPCPi = o2::aod::pidutils::tpcNSigma<2>(track); + ; const auto& nsigmaTPCKa = o2::aod::pidutils::tpcNSigma<3>(track); const auto& nsigmaTPCPr = o2::aod::pidutils::tpcNSigma<4>(track); - const bool isPionTPC = std::abs(nsigmaTPCPi) < trkselOptions.cfgCutNsigma; - const bool isKaonTPC = std::abs(nsigmaTPCKa) < trkselOptions.cfgCutNsigma; - const bool isProtonTPC = std::abs(nsigmaTPCPr) < trkselOptions.cfgCutNsigma; + bool isPionTPC = std::abs(nsigmaTPCPi) < trkselOptions.cfgCutNsigma; + bool isKaonTPC = std::abs(nsigmaTPCKa) < trkselOptions.cfgCutNsigma; + bool isProtonTPC = std::abs(nsigmaTPCPr) < trkselOptions.cfgCutNsigma; const auto& nsigmaTOFPi = o2::aod::pidutils::tofNSigma<2>(track); const auto& nsigmaTOFKa = o2::aod::pidutils::tofNSigma<3>(track); const auto& nsigmaTOFPr = o2::aod::pidutils::tofNSigma<4>(track); - const bool isPionTOF = track.hasTOF() && std::abs(nsigmaTOFPi) < trkselOptions.cfgCutNsigma; - const bool isKaonTOF = track.hasTOF() && std::abs(nsigmaTOFKa) < trkselOptions.cfgCutNsigma; - const bool isProtonTOF = track.hasTOF() && std::abs(nsigmaTOFPr) < trkselOptions.cfgCutNsigma; + bool isPionTOF = track.hasTOF() && std::abs(nsigmaTOFPi) < trkselOptions.cfgCutNsigma; + bool isKaonTOF = track.hasTOF() && std::abs(nsigmaTOFKa) < trkselOptions.cfgCutNsigma; + bool isProtonTOF = track.hasTOF() && std::abs(nsigmaTOFPr) < trkselOptions.cfgCutNsigma; if (isPionTPC || isKaonTPC || isProtonTPC) { if (pdgCode == 2212) { From 87c5900b77999c2bb974419c8dc1cc065b1a6f1a Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Wed, 5 Mar 2025 00:50:45 +0900 Subject: [PATCH 0531/1650] [PWGEM/Dilepton] update createResolutionMap.cxx and studyMCTruth.cxx (#10310) --- PWGEM/Dilepton/Tasks/createResolutionMap.cxx | 107 +++++++++++-- PWGEM/Dilepton/Tasks/studyMCTruth.cxx | 154 +++++++++++++++---- 2 files changed, 217 insertions(+), 44 deletions(-) diff --git a/PWGEM/Dilepton/Tasks/createResolutionMap.cxx b/PWGEM/Dilepton/Tasks/createResolutionMap.cxx index b4a43b5aed7..8070c41ac61 100644 --- a/PWGEM/Dilepton/Tasks/createResolutionMap.cxx +++ b/PWGEM/Dilepton/Tasks/createResolutionMap.cxx @@ -35,6 +35,7 @@ #include "CCDB/BasicCCDBManager.h" #include "DataFormatsParameters/GRPMagField.h" +#include "DataFormatsCalibration/MeanVertexObject.h" #include "TGeoGlobalMagField.h" #include "Field/MagneticField.h" @@ -66,6 +67,11 @@ struct CreateResolutionMap { Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; + Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; + Configurable mVtxPath{"mVtxPath", "GLO/Calib/MeanVertex", "Path of the mean vertex file"}; + Configurable d_bz_input{"d_bz_input", -999, "bz field in kG, -999 is automatic"}; + Configurable skipGRPOquery{"skipGRPOquery", true, "skip grpo query"}; + Configurable cfgEventGeneratorType{"cfgEventGeneratorType", -1, "if positive, select event generator type. i.e. gap or signal"}; Configurable cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"}; Configurable cfg_require_true_mc_collision_association{"cfg_require_true_mc_collision_association", true, "flag to require true mc collision association"}; @@ -148,7 +154,12 @@ struct CreateResolutionMap { Service ccdb; o2::globaltracking::MatchGlobalFwd mMatching; int mRunNumber = 0; - o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; + float d_bz; + // o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; + o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT; + o2::dataformats::VertexBase mVtx; + const o2::dataformats::MeanVertexObject* mMeanVtx = nullptr; + o2::base::MatLayerCylSet* lut = nullptr; void init(o2::framework::InitContext&) { @@ -166,6 +177,9 @@ struct CreateResolutionMap { ccdb->setFatalWhenNull(false); ccdbApi.init(ccdburl); + mRunNumber = 0; + d_bz = 0; + const AxisSpec axis_cent{ConfCentBins, "centrality (%)"}; const AxisSpec axis_pt_gen{ConfPtGenBins, "p_{T,l}^{gen} (GeV/c)"}; const AxisSpec axis_eta_cb_gen{ConfEtaCBGenBins, "#eta_{l}^{gen}"}; @@ -199,12 +213,67 @@ struct CreateResolutionMap { return; } + // load matLUT for this timestamp + if (!lut) { + LOG(info) << "Loading material look-up table for timestamp: " << bc.timestamp(); + lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->getForTimeStamp(lutPath, bc.timestamp())); + } else { + LOG(info) << "Material look-up table already in place. Not reloading."; + } + + // In case override, don't proceed, please - no CCDB access required + if (d_bz_input > -990) { + d_bz = d_bz_input; + o2::parameters::GRPMagField grpmag; + if (std::fabs(d_bz) > 1e-5) { + grpmag.setL3Current(30000.f / (d_bz / 5.0f)); + } + o2::base::Propagator::initFieldFromGRP(&grpmag); + o2::base::Propagator::Instance()->setMatLUT(lut); + mMeanVtx = ccdb->getForTimeStamp(mVtxPath, bc.timestamp()); + mRunNumber = bc.runNumber(); + + if (!o2::base::GeometryManager::isGeometryLoaded()) { + ccdb->get(geoPath); + } + o2::mch::TrackExtrap::setField(); + return; + } + + auto run3grp_timestamp = bc.timestamp(); + o2::parameters::GRPObject* grpo = 0x0; + o2::parameters::GRPMagField* grpmag = 0x0; + if (!skipGRPOquery) { + grpo = ccdb->getForTimeStamp(grpPath, run3grp_timestamp); + } + if (grpo) { + o2::base::Propagator::initFieldFromGRP(grpo); + o2::base::Propagator::Instance()->setMatLUT(lut); + mMeanVtx = ccdb->getForTimeStamp(mVtxPath, bc.timestamp()); + // Fetch magnetic field from ccdb for current collision + d_bz = grpo->getNominalL3Field(); + LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; + } else { + grpmag = ccdb->getForTimeStamp(grpmagPath, run3grp_timestamp); + if (!grpmag) { + LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for timestamp " << run3grp_timestamp; + } + o2::base::Propagator::initFieldFromGRP(grpmag); + o2::base::Propagator::Instance()->setMatLUT(lut); + mMeanVtx = ccdb->getForTimeStamp(mVtxPath, bc.timestamp()); + + // Fetch magnetic field from ccdb for current collision + d_bz = std::lround(5.f * grpmag->getL3Current() / 30000.f); + LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; + } mRunNumber = bc.runNumber(); - std::map metadata; - auto soreor = o2::ccdb::BasicCCDBManager::getRunDuration(ccdbApi, mRunNumber); - auto ts = soreor.first; - auto grpmag = ccdbApi.retrieveFromTFileAny(grpmagPath, metadata, ts); - o2::base::Propagator::initFieldFromGRP(grpmag); + + // std::map metadata; + // auto soreor = o2::ccdb::BasicCCDBManager::getRunDuration(ccdbApi, mRunNumber); + // auto ts = soreor.first; + // auto grpmag = ccdbApi.retrieveFromTFileAny(grpmagPath, metadata, ts); + // o2::base::Propagator::initFieldFromGRP(grpmag); + if (!o2::base::GeometryManager::isGeometryLoaded()) { ccdb->get(geoPath); } @@ -337,16 +406,19 @@ struct CreateResolutionMap { return false; } - gpu::gpustd::array dcaInfo; + o2::dataformats::DCA mDcaInfoCov; + mDcaInfoCov.set(999, 999, 999, 999, 999); auto track_par_cov_recalc = getTrackParCov(track); track_par_cov_recalc.setPID(o2::track::PID::Electron); - std::array pVec_recalc = {0, 0, 0}; // px, py, pz - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, track_par_cov_recalc, 2.f, matCorr, &dcaInfo); - getPxPyPz(track_par_cov_recalc, pVec_recalc); + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc, 2.f, matCorr, &mDcaInfoCov); + float dcaXY = mDcaInfoCov.getY(); + float dcaZ = mDcaInfoCov.getZ(); // LOGF(info, "collision.globalIndex() = %d, track.collisionId() = %d, track.pt() = %.16f, track_par_cov_recalc.getPt() = %.16f", collision.globalIndex(), track.collisionId(), track.pt(), track_par_cov_recalc.getPt()); - if (std::fabs(dcaInfo[0]) > electroncuts.cfg_max_dcaxy || std::fabs(dcaInfo[1]) > electroncuts.cfg_max_dcaz) { + if (std::fabs(dcaXY) > electroncuts.cfg_max_dcaxy || std::fabs(dcaZ) > electroncuts.cfg_max_dcaz) { return false; } @@ -412,7 +484,7 @@ struct CreateResolutionMap { void fillMuon(TCollision const& collision, TMuon const& muon, const float centrality) { auto mcparticle = muon.template mcParticle_as(); - if (abs(mcparticle.pdgCode()) != 13 || !(mcparticle.isPhysicalPrimary() || mcparticle.producedByGenerator())) { + if (std::abs(mcparticle.pdgCode()) != 13 || !(mcparticle.isPhysicalPrimary() || mcparticle.producedByGenerator())) { return; } if (cfg_require_true_mc_collision_association && mcparticle.mcCollisionId() != collision.mcCollisionId()) { @@ -527,12 +599,15 @@ struct CreateResolutionMap { return; } - gpu::gpustd::array dcaInfo; + o2::dataformats::DCA mDcaInfoCov; + mDcaInfoCov.set(999, 999, 999, 999, 999); auto track_par_cov_recalc = getTrackParCov(track); track_par_cov_recalc.setPID(o2::track::PID::Electron); - // std::array pVec_recalc = {0, 0, 0}; // px, py, pz - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, track_par_cov_recalc, 2.f, matCorr, &dcaInfo); - // getPxPyPz(track_par_cov_recalc, pVec_recalc); + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc, 2.f, matCorr, &mDcaInfoCov); + // float dcaXY = mDcaInfoCov.getY(); + // float dcaZ = mDcaInfoCov.getZ(); float pt = track_par_cov_recalc.getPt(); float eta = track_par_cov_recalc.getEta(); diff --git a/PWGEM/Dilepton/Tasks/studyMCTruth.cxx b/PWGEM/Dilepton/Tasks/studyMCTruth.cxx index 08fc371ff98..a4340007ce3 100644 --- a/PWGEM/Dilepton/Tasks/studyMCTruth.cxx +++ b/PWGEM/Dilepton/Tasks/studyMCTruth.cxx @@ -11,7 +11,7 @@ // // ======================== // -// This code is to study MC truth. e.g. S/B +// This code is to study MC truth. e.g. evet selection bias // Please write to: daiki.sekihata@cern.ch #include @@ -38,11 +38,18 @@ struct studyMCTruth { struct : ConfigurableGroup { std::string prefix = "mccut_group"; + Configurable cfgEventGeneratorType{"cfgEventGeneratorType", -1, "if positive, select event generator type. i.e. gap or signal"}; Configurable cfgPdgCodeLepton{"cfgPdgCodeLepton", 11, "pdg code for desired lepton"}; - Configurable cfgMinPtGen{"cfgMinPtGen", 0.1, "min. pT of single lepton"}; + Configurable cfgMinPtGen{"cfgMinPtGen", 0.2, "min. pT of single lepton"}; Configurable cfgMaxPtGen{"cfgMaxPtGen", 1e+10f, "max. pT of single lepton"}; Configurable cfgMinEtaGen{"cfgMinEtaGen", -0.8, "min. eta of for single lepton"}; Configurable cfgMaxEtaGen{"cfgMaxEtaGen", +0.8, "max. eta of for single lepton"}; + Configurable cfgMinPtGenWide{"cfgMinPtGenWide", 0.01, "min. pT of single lepton in wide acceptance"}; // this is only to speed up pairing loop + Configurable cfgMaxPtGenWide{"cfgMaxPtGenWide", 1e+10f, "max. pT of single lepton in wide acceptance"}; // this is only to speed up pairing loop + Configurable cfgMinEtaGenWide{"cfgMinEtaGenWide", -1.5, "min. eta of for single lepton in wide acceptance"}; // this is only to speed up pairing loop + Configurable cfgMaxEtaGenWide{"cfgMaxEtaGenWide", +1.5, "max. eta of for single lepton in wide acceptance"}; // this is only to speed up pairing loop + + Configurable cfgMuonTrackType{"cfgMuonTrackType", 3, "muon track type [0: MFT-MCH-MID, 3: MCH-MID]"}; } mccuts; struct : ConfigurableGroup { @@ -128,7 +135,7 @@ struct studyMCTruth { return max; } - template + template bool isSelectedMCParticle(TMCParticle const& mcparticle) { if (std::abs(mcparticle.pdgCode()) != mccuts.cfgPdgCodeLepton) { @@ -137,11 +144,45 @@ struct studyMCTruth { if (!mcparticle.has_mothers()) { return false; } - if (mcparticle.isPhysicalPrimary() || mcparticle.producedByGenerator()) { - return true; - } else { + if (!(mcparticle.isPhysicalPrimary() || mcparticle.producedByGenerator())) { return false; } + + if constexpr (isSmeared) { + if (std::abs(mccuts.cfgPdgCodeLepton) == 11) { + if (mcparticle.ptSmeared() < mccuts.cfgMinPtGen || mccuts.cfgMaxPtGen < mcparticle.ptSmeared()) { + return false; + } + if (mcparticle.etaSmeared() < mccuts.cfgMinEtaGen || mccuts.cfgMaxEtaGen < mcparticle.etaSmeared()) { + return false; + } + } else if (std::abs(mccuts.cfgPdgCodeLepton) == 13) { + if (mccuts.cfgMuonTrackType == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { + if (mcparticle.ptSmeared_sa_muon() < mccuts.cfgMinPtGen || mccuts.cfgMaxPtGen < mcparticle.ptSmeared_sa_muon()) { + return false; + } + if (mcparticle.etaSmeared_sa_muon() < mccuts.cfgMinEtaGen || mccuts.cfgMaxEtaGen < mcparticle.etaSmeared_sa_muon()) { + return false; + } + } else if (mccuts.cfgMuonTrackType == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack)) { + if (mcparticle.ptSmeared_gl_muon() < mccuts.cfgMinPtGen || mccuts.cfgMaxPtGen < mcparticle.ptSmeared_gl_muon()) { + return false; + } + if (mcparticle.etaSmeared_gl_muon() < mccuts.cfgMinEtaGen || mccuts.cfgMaxEtaGen < mcparticle.etaSmeared_gl_muon()) { + return false; + } + } + } + } else { + if (mcparticle.pt() < mccuts.cfgMinPtGen || mccuts.cfgMaxPtGen < mcparticle.pt()) { + return false; + } + if (mcparticle.eta() < mccuts.cfgMinEtaGen || mccuts.cfgMaxEtaGen < mcparticle.eta()) { + return false; + } + } + + return true; } template @@ -163,15 +204,57 @@ struct studyMCTruth { return true; } - template + template void fillTrueInfo(TMCLepton const& t1, TMCLepton const& t2, TMCParticles const& mcParticles) { - if (!isSelectedMCParticle(t1) || !isSelectedMCParticle(t2)) { + if (!isSelectedMCParticle(t1) || !isSelectedMCParticle(t2)) { return; } - ROOT::Math::PtEtaPhiMVector v1(t1.pt(), t1.eta(), t1.phi(), leptonMass); - ROOT::Math::PtEtaPhiMVector v2(t2.pt(), t2.eta(), t2.phi(), leptonMass); + float pt1 = 0.f, eta1 = 0.f, phi1 = 0.f, pt2 = 0.f, eta2 = 0.f, phi2 = 0.f; + if constexpr (isSmeared) { + if (std::abs(mccuts.cfgPdgCodeLepton) == 11) { + pt1 = t1.ptSmeared(); + eta1 = t1.etaSmeared(); + phi1 = t1.phiSmeared(); + pt2 = t2.ptSmeared(); + eta2 = t2.etaSmeared(); + phi2 = t2.phiSmeared(); + } else if (std::abs(mccuts.cfgPdgCodeLepton) == 13) { + if (mccuts.cfgMuonTrackType == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { + pt1 = t1.ptSmeared_sa_muon(); + eta1 = t1.etaSmeared_sa_muon(); + phi1 = t1.phiSmeared_sa_muon(); + pt2 = t2.ptSmeared_sa_muon(); + eta2 = t2.etaSmeared_sa_muon(); + phi2 = t2.phiSmeared_sa_muon(); + } else if (mccuts.cfgMuonTrackType == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack)) { + pt1 = t1.ptSmeared_gl_muon(); + eta1 = t1.etaSmeared_gl_muon(); + phi1 = t1.phiSmeared_gl_muon(); + pt2 = t2.ptSmeared_gl_muon(); + eta2 = t2.etaSmeared_gl_muon(); + phi2 = t2.phiSmeared_gl_muon(); + } else { + pt1 = t1.pt(); + eta1 = t1.eta(); + phi1 = t1.phi(); + pt2 = t2.pt(); + eta2 = t2.eta(); + phi2 = t2.phi(); + } + } + } else { + pt1 = t1.pt(); + eta1 = t1.eta(); + phi1 = t1.phi(); + pt2 = t2.pt(); + eta2 = t2.eta(); + phi2 = t2.phi(); + } + + ROOT::Math::PtEtaPhiMVector v1(pt1, eta1, phi1, leptonMass); + ROOT::Math::PtEtaPhiMVector v2(pt2, eta2, phi2, leptonMass); ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; if (v12.Rapidity() < mccuts.cfgMinEtaGen || mccuts.cfgMaxEtaGen < v12.Rapidity()) { @@ -233,10 +316,15 @@ struct studyMCTruth { } } - template - void runMC(TMCCollisions const& mcCollisions, TMCParticles const& mcParticles, TBCs const&, TCollisions const& collisions) + template + void runMC(TMCCollisions const& mcCollisions, TMCParticles const& mcParticles, TBCs const&, TCollisions const& collisions, TMCPosLeptons const& mcPosLeptons, TMCNegLeptons const& mcNegLeptons) { for (const auto& mcCollision : mcCollisions) { + + if (mccuts.cfgEventGeneratorType >= 0 && mcCollision.getSubGeneratorId() != mccuts.cfgEventGeneratorType) { + continue; + } + const auto& bc_from_mcCollision = mcCollision.template bc_as(); bool isSelectedMC = isSelectedCollision(mcCollision, bc_from_mcCollision); @@ -286,39 +374,39 @@ struct studyMCTruth { auto negLeptons_per_mccollision = mcNegLeptons.sliceBy(perMcCollision, mcCollision.globalIndex()); for (const auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posLeptons_per_mccollision, negLeptons_per_mccollision))) { // ULS - fillTrueInfo<0, 0>(pos, neg, mcParticles); + fillTrueInfo<0, 0, isSmeared>(pos, neg, mcParticles); if (isSelectedMC) { - fillTrueInfo<1, 0>(pos, neg, mcParticles); + fillTrueInfo<1, 0, isSmeared>(pos, neg, mcParticles); if (hasRecCollision) { - fillTrueInfo<2, 0>(pos, neg, mcParticles); + fillTrueInfo<2, 0, isSmeared>(pos, neg, mcParticles); if (isSelectedRec) { - fillTrueInfo<3, 0>(pos, neg, mcParticles); + fillTrueInfo<3, 0, isSmeared>(pos, neg, mcParticles); } } } } // end of ULS pair loop for (auto& [pos1, pos2] : combinations(CombinationsStrictlyUpperIndexPolicy(posLeptons_per_mccollision, posLeptons_per_mccollision))) { // LS++ - fillTrueInfo<0, 1>(pos1, pos2, mcParticles); + fillTrueInfo<0, 1, isSmeared>(pos1, pos2, mcParticles); if (isSelectedMC) { - fillTrueInfo<1, 1>(pos1, pos2, mcParticles); + fillTrueInfo<1, 1, isSmeared>(pos1, pos2, mcParticles); if (hasRecCollision) { - fillTrueInfo<2, 1>(pos1, pos2, mcParticles); + fillTrueInfo<2, 1, isSmeared>(pos1, pos2, mcParticles); if (isSelectedRec) { - fillTrueInfo<3, 1>(pos1, pos2, mcParticles); + fillTrueInfo<3, 1, isSmeared>(pos1, pos2, mcParticles); } } } } // end of LS++ pair loop for (auto& [neg1, neg2] : combinations(CombinationsStrictlyUpperIndexPolicy(negLeptons_per_mccollision, negLeptons_per_mccollision))) { // LS-- - fillTrueInfo<0, 2>(neg1, neg2, mcParticles); + fillTrueInfo<0, 2, isSmeared>(neg1, neg2, mcParticles); if (isSelectedMC) { - fillTrueInfo<1, 2>(neg1, neg2, mcParticles); + fillTrueInfo<1, 2, isSmeared>(neg1, neg2, mcParticles); if (hasRecCollision) { - fillTrueInfo<2, 2>(neg1, neg2, mcParticles); + fillTrueInfo<2, 2, isSmeared>(neg1, neg2, mcParticles); if (isSelectedRec) { - fillTrueInfo<3, 2>(neg1, neg2, mcParticles); + fillTrueInfo<3, 2, isSmeared>(neg1, neg2, mcParticles); } } } @@ -337,14 +425,24 @@ struct studyMCTruth { Filter collisionFilter = eventcuts.cfgMinImpPar < o2::aod::mccollision::impactParameter && o2::aod::mccollision::impactParameter < eventcuts.cfgMaxImpPar; using FilteredMyMcCollisions = soa::Filtered; - Partition mcPosLeptons = o2::aod::mcparticle::pdgCode == -mccuts.cfgPdgCodeLepton && (mccuts.cfgMinPtGen < o2::aod::mcparticle::pt && o2::aod::mcparticle::pt < mccuts.cfgMaxPtGen) && (mccuts.cfgMinEtaGen < o2::aod::mcparticle::eta && o2::aod::mcparticle::eta < mccuts.cfgMaxEtaGen); - Partition mcNegLeptons = o2::aod::mcparticle::pdgCode == mccuts.cfgPdgCodeLepton && (mccuts.cfgMinPtGen < o2::aod::mcparticle::pt && o2::aod::mcparticle::pt < mccuts.cfgMaxPtGen) && (mccuts.cfgMinEtaGen < o2::aod::mcparticle::eta && o2::aod::mcparticle::eta < mccuts.cfgMaxEtaGen); + Partition McPosLeptons = o2::aod::mcparticle::pdgCode == -mccuts.cfgPdgCodeLepton && (mccuts.cfgMinPtGen < o2::aod::mcparticle::pt && o2::aod::mcparticle::pt < mccuts.cfgMaxPtGen) && (mccuts.cfgMinEtaGen < o2::aod::mcparticle::eta && o2::aod::mcparticle::eta < mccuts.cfgMaxEtaGen); + Partition McNegLeptons = o2::aod::mcparticle::pdgCode == mccuts.cfgPdgCodeLepton && (mccuts.cfgMinPtGen < o2::aod::mcparticle::pt && o2::aod::mcparticle::pt < mccuts.cfgMaxPtGen) && (mccuts.cfgMinEtaGen < o2::aod::mcparticle::eta && o2::aod::mcparticle::eta < mccuts.cfgMaxEtaGen); + + using SmearedMcParticles = soa::Join; + Partition McPosLeptonsSmeared = o2::aod::mcparticle::pdgCode == -mccuts.cfgPdgCodeLepton && ifnode(mccuts.cfgPdgCodeLepton.node() == 11, (mccuts.cfgMinPtGen.node() < o2::aod::smearedtrack::ptSmeared && o2::aod::smearedtrack::ptSmeared < mccuts.cfgMaxPtGen.node()) && (mccuts.cfgMinEtaGen.node() < o2::aod::smearedtrack::etaSmeared && o2::aod::smearedtrack::etaSmeared < mccuts.cfgMaxEtaGen.node()), ifnode(mccuts.cfgMuonTrackType.node() == uint8_t(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack), (mccuts.cfgMinPtGen.node() < o2::aod::smearedtrack::ptSmeared_gl_muon && o2::aod::smearedtrack::ptSmeared_gl_muon < mccuts.cfgMaxPtGen.node()) && (mccuts.cfgMinEtaGen.node() < o2::aod::smearedtrack::etaSmeared_gl_muon && o2::aod::smearedtrack::etaSmeared_gl_muon < mccuts.cfgMaxEtaGen.node()), (mccuts.cfgMinPtGen.node() < o2::aod::smearedtrack::ptSmeared_sa_muon && o2::aod::smearedtrack::ptSmeared_sa_muon < mccuts.cfgMaxPtGen.node()) && (mccuts.cfgMinEtaGen.node() < o2::aod::smearedtrack::etaSmeared_sa_muon && o2::aod::smearedtrack::etaSmeared_sa_muon < mccuts.cfgMaxEtaGen.node()))); + Partition McNegLeptonsSmeared = o2::aod::mcparticle::pdgCode == mccuts.cfgPdgCodeLepton && ifnode(mccuts.cfgPdgCodeLepton.node() == 11, (mccuts.cfgMinPtGen.node() < o2::aod::smearedtrack::ptSmeared && o2::aod::smearedtrack::ptSmeared < mccuts.cfgMaxPtGen.node()) && (mccuts.cfgMinEtaGen.node() < o2::aod::smearedtrack::etaSmeared && o2::aod::smearedtrack::etaSmeared < mccuts.cfgMaxEtaGen.node()), ifnode(mccuts.cfgMuonTrackType.node() == uint8_t(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack), (mccuts.cfgMinPtGen.node() < o2::aod::smearedtrack::ptSmeared_gl_muon && o2::aod::smearedtrack::ptSmeared_gl_muon < mccuts.cfgMaxPtGen.node()) && (mccuts.cfgMinEtaGen.node() < o2::aod::smearedtrack::etaSmeared_gl_muon && o2::aod::smearedtrack::etaSmeared_gl_muon < mccuts.cfgMaxEtaGen.node()), (mccuts.cfgMinPtGen.node() < o2::aod::smearedtrack::ptSmeared_sa_muon && o2::aod::smearedtrack::ptSmeared_sa_muon < mccuts.cfgMaxPtGen.node()) && (mccuts.cfgMinEtaGen.node() < o2::aod::smearedtrack::etaSmeared_sa_muon && o2::aod::smearedtrack::etaSmeared_sa_muon < mccuts.cfgMaxEtaGen.node()))); void processMC(FilteredMyMcCollisions const& mcCollisions, aod::McParticles const& mcParticles, soa::Join const& bcs, soa::Join const& collisions) { - runMC(mcCollisions, mcParticles, bcs, collisions); + runMC(mcCollisions, mcParticles, bcs, collisions, McPosLeptons, McNegLeptons); + } + PROCESS_SWITCH(studyMCTruth, processMC, "process MC", true); + + void processMCSmeared(FilteredMyMcCollisions const& mcCollisions, SmearedMcParticles const& mcParticles, soa::Join const& bcs, soa::Join const& collisions) + { + runMC(mcCollisions, mcParticles, bcs, collisions, McPosLeptonsSmeared, McNegLeptonsSmeared); } - PROCESS_SWITCH(studyMCTruth, processMC, "process", true); + PROCESS_SWITCH(studyMCTruth, processMCSmeared, "processMC with smeared values", false); void processDummy(FilteredMyMcCollisions const&) {} PROCESS_SWITCH(studyMCTruth, processDummy, "process Dummy", false); From 556a9377f12f41911ae51c0726acc47f5c579ec0 Mon Sep 17 00:00:00 2001 From: suyoupeng <109774812+15071832337@users.noreply.github.com> Date: Wed, 5 Mar 2025 00:46:06 +0800 Subject: [PATCH 0532/1650] [PWGLF] PWGLF:Lambda local polarization induced by jet in pp collision 13.6 TeV (#10311) --- .../lambdaJetpolarizationbuilder.cxx | 67 ++++++++++++++++--- .../Strangeness/lambdaJetpolarization.cxx | 26 +++---- 2 files changed, 70 insertions(+), 23 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/lambdaJetpolarizationbuilder.cxx b/PWGLF/TableProducer/Strangeness/lambdaJetpolarizationbuilder.cxx index b079721e181..b28936d609c 100644 --- a/PWGLF/TableProducer/Strangeness/lambdaJetpolarizationbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/lambdaJetpolarizationbuilder.cxx @@ -57,7 +57,6 @@ struct myAnalysis { Configurable cfgDataHists{"cfgDataHists", true, "Enables DataHists"}; Configurable trackSelections{"trackSelections", "globalTracks", "set track selections"}; // Others configure - Configurable cDebugLevel{"cDebugLevel", 1, "Resolution of Debug"}; Configurable cfgVtxCut{"cfgVtxCut", 10.0, "V_z cut selection"}; Configurable cfgjetPtMin{"cfgjetPtMin", 0.0, "minimum jet pT cut"}; Configurable cfgjetR{"cfgjetR", 0.4, "jet resolution parameter"}; @@ -86,14 +85,7 @@ struct myAnalysis { Configurable maxChi2ITS{"maxChi2ITS", 36.0f, "max chi2 per cluster ITS"}; Configurable etaMin{"etaMin", -0.8f, "eta min track"}; Configurable etaMax{"etaMax", +0.8f, "eta max track"}; - Configurable ptMin_V0_proton{"ptMin_V0_proton", 0.3f, "pt min of proton from V0"}; - Configurable ptMax_V0_proton{"ptMax_V0_proton", 10.0f, "pt max of proton from V0"}; - Configurable ptMin_V0_pion{"ptMin_V0_pion", 0.1f, "pt min of pion from V0"}; - Configurable ptMax_V0_pion{"ptMax_V0_pion", 1.5f, "pt max of pion from V0"}; - Configurable ptMin_K0_pion{"ptMin_K0_pion", 0.3f, "pt min of pion from K0"}; - Configurable ptMax_K0_pion{"ptMax_K0_pion", 10.0f, "pt max of pion from K0"}; Configurable minimumV0Radius{"minimumV0Radius", 0.2f, "Minimum V0 Radius"}; - Configurable maximumV0Radius{"maximumV0Radius", 40.0f, "Maximum V0 Radius"}; Configurable nsigmaTPCmin{"nsigmaTPCmin", -5.0f, "Minimum nsigma TPC"}; Configurable nsigmaTPCmax{"nsigmaTPCmax", +5.0f, "Maximum nsigma TPC"}; Configurable nsigmaTOFmin{"nsigmaTOFmin", -5.0f, "Minimum nsigma TOF"}; @@ -102,6 +94,8 @@ struct myAnalysis { Configurable yMax{"yMax", +0.5f, "maximum y"}; Configurable v0rejLambda{"v0rejLambda", 0.01, "V0 rej K0s"}; Configurable CtauLambda{"ctauLambda", 30, "C tau Lambda (cm)"}; + Configurable ifpasslambda{"passedLambdaSelection", 1, "passedLambdaSelection"}; + Configurable ifpassantilambda{"passedANtiLambdaSelection", 1, "passedAntiLambdaSelection"}; // Event Selection///////////////////////////////// Configurable cutzvertex{"cutzvertex", 10.0f, "Accepted z-vertex range (cm)"}; Configurable sel8{"sel8", 0, "Apply sel8 event selection"}; @@ -322,6 +316,30 @@ struct myAnalysis { return false; return true; } + + // init Selection + template + bool passedInitLambdaSelection(const Lambda& v0, const TrackPos& ptrack, const TrackNeg& ntrack) + { + if (v0.v0radius() < minimumV0Radius || v0.v0cosPA() < v0cospa || + TMath::Abs(ptrack.eta()) > etaMax || + TMath::Abs(ntrack.eta()) > etaMax) { + return false; + } + if (v0.dcaV0daughters() > dcav0dau) { + return false; + } + + if (TMath::Abs(v0.dcanegtopv()) < dcanegtopv) { + return false; + } + + if (TMath::Abs(v0.dcapostopv()) < dcapostopv) { + return false; + } + return true; + } + // Lambda Selections template bool passedLambdaSelection(const Lambda& v0, const TrackPos& ptrack, const TrackNeg& ntrack) @@ -575,7 +593,14 @@ struct myAnalysis { const auto& pos = v0.posTrack_as(); const auto& neg = v0.negTrack_as(); V0NumbersPerEvent = V0NumbersPerEvent + 1; - if (passedLambdaSelection(v0, pos, neg) && ctauLambda < CtauLambda) { + if (passedLambdaSelection(v0, pos, neg) && ctauLambda < CtauLambda && ifpasslambda) { + JEhistos.fill(HIST("hPt"), v0.pt()); + JEhistos.fill(HIST("V0Radius"), v0.v0radius()); + JEhistos.fill(HIST("CosPA"), v0.v0cosPA()); + JEhistos.fill(HIST("V0DCANegToPV"), v0.dcanegtopv()); + JEhistos.fill(HIST("V0DCAPosToPV"), v0.dcapostopv()); + JEhistos.fill(HIST("V0DCAV0Daughters"), v0.dcaV0daughters()); + } else if (passedInitLambdaSelection(v0, pos, neg)) { JEhistos.fill(HIST("hPt"), v0.pt()); JEhistos.fill(HIST("V0Radius"), v0.v0radius()); JEhistos.fill(HIST("CosPA"), v0.v0cosPA()); @@ -583,7 +608,7 @@ struct myAnalysis { JEhistos.fill(HIST("V0DCAPosToPV"), v0.dcapostopv()); JEhistos.fill(HIST("V0DCAV0Daughters"), v0.dcaV0daughters()); } - if (passedLambdaSelection(v0, pos, neg) && ctauAntiLambda < CtauLambda) { + if (passedLambdaSelection(v0, pos, neg) && ctauAntiLambda < CtauLambda && ifpasslambda) { V0LambdaNumbers = V0LambdaNumbers + 1; JEhistos.fill(HIST("hMassVsPtLambda"), v0.pt(), v0.mLambda()); @@ -591,15 +616,35 @@ struct myAnalysis { JEhistos.fill(HIST("TPCNSigmaPosPr"), pos.tpcNSigmaPr()); JEhistos.fill(HIST("TPCNSigmaNegPi"), neg.tpcNSigmaPi()); + JEhistos.fill(HIST("v0Lambdapx"), v0.px()); + JEhistos.fill(HIST("v0Lambdapy"), v0.py()); + JEhistos.fill(HIST("v0Lambdapz"), v0.pz()); + myTable(outputCollisionsV0.lastIndex(), v0.collisionId(), v0.px(), v0.py(), v0.pz(), v0.pt(), v0.mLambda(), pos.px(), pos.py(), pos.pz()); + JEhistos.fill(HIST("hV0Lambda"), nEventsV0, v0.px(), v0.py(), v0.pz(), v0.mLambda(), pos.px(), pos.py(), pos.pz()); + } else if (passedInitLambdaSelection(v0, pos, neg)) { + V0LambdaNumbers = V0LambdaNumbers + 1; + JEhistos.fill(HIST("hMassVsPtLambda"), v0.pt(), v0.mLambda()); + JEhistos.fill(HIST("hMassLambda"), v0.mLambda()); + JEhistos.fill(HIST("TPCNSigmaPosPr"), pos.tpcNSigmaPr()); + JEhistos.fill(HIST("TPCNSigmaNegPi"), neg.tpcNSigmaPi()); + JEhistos.fill(HIST("v0Lambdapx"), v0.px()); JEhistos.fill(HIST("v0Lambdapy"), v0.py()); JEhistos.fill(HIST("v0Lambdapz"), v0.pz()); myTable(outputCollisionsV0.lastIndex(), v0.collisionId(), v0.px(), v0.py(), v0.pz(), v0.pt(), v0.mLambda(), pos.px(), pos.py(), pos.pz()); JEhistos.fill(HIST("hV0Lambda"), nEventsV0, v0.px(), v0.py(), v0.pz(), v0.mLambda(), pos.px(), pos.py(), pos.pz()); } + if (passedAntiLambdaSelection(v0, pos, neg) && ifpassantilambda) { - if (passedAntiLambdaSelection(v0, pos, neg)) { + JEhistos.fill(HIST("hMassVsPtAntiLambda"), v0.pt(), v0.mAntiLambda()); + JEhistos.fill(HIST("hMassAntiLambda"), v0.mAntiLambda()); + JEhistos.fill(HIST("TPCNSigmaPosPi"), pos.tpcNSigmaPi()); + JEhistos.fill(HIST("TPCNSigmaNegPr"), neg.tpcNSigmaPr()); + JEhistos.fill(HIST("v0AntiLambdapx"), v0.px()); + JEhistos.fill(HIST("v0AntiLambdapy"), v0.py()); + JEhistos.fill(HIST("v0AntiLambdapz"), v0.pz()); + } else if (passedInitLambdaSelection(v0, pos, neg)) { JEhistos.fill(HIST("hMassVsPtAntiLambda"), v0.pt(), v0.mAntiLambda()); JEhistos.fill(HIST("hMassAntiLambda"), v0.mAntiLambda()); JEhistos.fill(HIST("TPCNSigmaPosPi"), pos.tpcNSigmaPi()); diff --git a/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx b/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx index 6927a9df7ce..fbb866af8d4 100644 --- a/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx +++ b/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx @@ -158,10 +158,8 @@ struct LfMyV0s { registry.fill(HIST("V0protonpxInLab"), candidate.v0protonpx()); registry.fill(HIST("V0protonpyInLab"), candidate.v0protonpy()); registry.fill(HIST("V0protonpzInLab"), candidate.v0protonpz()); - double protonsinPhiInLab = candidate.v0protonpy() / sqrt(candidate.v0protonpx() * candidate.v0protonpx() + candidate.v0protonpy() * candidate.v0protonpy()); registry.fill(HIST("V0protonphiInLab"), protonsinPhiInLab); - double PLambda = sqrt(candidate.v0px() * candidate.v0px() + candidate.v0py() * candidate.v0py() + candidate.v0pz() * candidate.v0pz()); double ELambda = sqrt(candidate.v0Lambdamass() * candidate.v0Lambdamass() + PLambda * PLambda); TMatrixD pLabV0(4, 1); @@ -176,7 +174,6 @@ struct LfMyV0s { registry.fill(HIST("V0pzInRest_frame"), V0InV0(3, 0)); } for (auto& candidate : myv0s) { - double PLambda = sqrt(candidate.v0px() * candidate.v0px() + candidate.v0py() * candidate.v0py() + candidate.v0pz() * candidate.v0pz()); double ELambda = sqrt(candidate.v0Lambdamass() * candidate.v0Lambdamass() + PLambda * PLambda); TMatrixD pLabproton(4, 1); @@ -201,15 +198,16 @@ struct LfMyV0s { registry.fill(HIST("JetpTInLab"), Jet.jetpt()); } } - PROCESS_SWITCH(LfMyV0s, processJetV0Analysis, "processJetV0Analysis", true); - // aod::MyTableJet - // aod::MyCollision const& collision, void processLeadingJetV0Analysis(aod::MyTable const& myv0s, aod::MyTableLeadingJet const& myleadingJets) { - for (auto& candidate : myv0s) { - for (auto& LeadingJet : myleadingJets) { + // + for (auto& LeadingJet : myleadingJets) { + int V0Numbers = 0; + double protonsinPhiInJetV0frame = 0; + for (auto& candidate : myv0s) { if (candidate.mycollisionv0() == LeadingJet.mycollisionleadingjet()) { + V0Numbers = V0Numbers + 1; double PLambda = sqrt(candidate.v0px() * candidate.v0px() + candidate.v0py() * candidate.v0py() + candidate.v0pz() * candidate.v0pz()); double ELambda = sqrt(candidate.v0Lambdamass() * candidate.v0Lambdamass() + PLambda * PLambda); TMatrixD pLabproton(4, 1); @@ -223,10 +221,14 @@ struct LfMyV0s { registry.fill(HIST("V0protonpxInJetV0frame"), protonInJetV0(1, 0)); registry.fill(HIST("V0protonpyInJetV0frame"), protonInJetV0(2, 0)); registry.fill(HIST("V0protonpzInJetV0frame"), protonInJetV0(3, 0)); - double protonsinPhiInJetV0frame = protonInJetV0(2, 0) / sqrt(protonInJetV0(1, 0) * protonInJetV0(1, 0) + protonInJetV0(2, 0) * protonInJetV0(2, 0)); - registry.fill(HIST("V0protonphiInJetV0frame"), protonsinPhiInJetV0frame); - registry.fill(HIST("hLambdamassandSinPhi"), candidate.v0Lambdamass(), protonsinPhiInJetV0frame); - registry.fill(HIST("profile"), candidate.v0Lambdamass(), protonsinPhiInJetV0frame); + protonsinPhiInJetV0frame = protonsinPhiInJetV0frame + protonInJetV0(2, 0) / sqrt(protonInJetV0(1, 0) * protonInJetV0(1, 0) + protonInJetV0(2, 0) * protonInJetV0(2, 0)); + } + } + for (auto& candidate : myv0s) { + if (candidate.mycollisionv0() == LeadingJet.mycollisionleadingjet()) { + registry.fill(HIST("V0protonphiInJetV0frame"), protonsinPhiInJetV0frame / V0Numbers); + registry.fill(HIST("hLambdamassandSinPhi"), candidate.v0Lambdamass(), protonsinPhiInJetV0frame / V0Numbers); + registry.fill(HIST("profile"), candidate.v0Lambdamass(), protonsinPhiInJetV0frame / V0Numbers); } } } From 250118993e528de78b122fd2c52041feb6e7654a Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Tue, 4 Mar 2025 19:38:12 +0100 Subject: [PATCH 0533/1650] [PWGLF] Resonance Framework - Reduce the reduction factor for derived dataset (#10301) --- PWGLF/DataModel/LFResonanceTables.h | 138 ++++++----- .../Resonances/resonanceInitializer.cxx | 222 ++++++++++++++---- .../Resonances/resonanceMergeDF.cxx | 116 +++------ .../Resonances/resonanceModuleInitializer.cxx | 24 +- .../Tasks/Resonances/chargedkstaranalysis.cxx | 3 - PWGLF/Tasks/Resonances/f0980analysis.cxx | 21 +- PWGLF/Tasks/Resonances/k1analysis.cxx | 19 +- PWGLF/Tasks/Resonances/k892analysis.cxx | 152 ++++++------ PWGLF/Tasks/Resonances/kstar892analysis.cxx | 9 - PWGLF/Tasks/Resonances/lambda1520_PbPb.cxx | 33 +-- PWGLF/Tasks/Resonances/lambda1520analysis.cxx | 18 -- PWGLF/Tasks/Resonances/phianalysis.cxx | 4 - PWGLF/Tasks/Resonances/rho770analysis.cxx | 18 -- PWGLF/Tasks/Resonances/xi1530Analysisqa.cxx | 19 -- 14 files changed, 383 insertions(+), 413 deletions(-) diff --git a/PWGLF/DataModel/LFResonanceTables.h b/PWGLF/DataModel/LFResonanceTables.h index 78deaa0ab4e..177f8789a4a 100644 --- a/PWGLF/DataModel/LFResonanceTables.h +++ b/PWGLF/DataModel/LFResonanceTables.h @@ -141,31 +141,33 @@ namespace resodaughter DECLARE_SOA_INDEX_COLUMN(ResoCollision, resoCollision); DECLARE_SOA_INDEX_COLUMN(ResoCollisionDF, resoCollisionDF); -DECLARE_SOA_INDEX_COLUMN_FULL(Track, track, int, Tracks, "_Trk"); //! -DECLARE_SOA_INDEX_COLUMN_FULL(V0, v0, int, V0s, "_V0"); //! -DECLARE_SOA_INDEX_COLUMN_FULL(Cascade, cascade, int, Cascades, "_Cas"); //! -DECLARE_SOA_COLUMN(Pt, pt, float); //! p_T (GeV/c) -DECLARE_SOA_COLUMN(Px, px, float); //! p_x (GeV/c) -DECLARE_SOA_COLUMN(Py, py, float); //! p_y (GeV/c) -DECLARE_SOA_COLUMN(Pz, pz, float); //! p_z (GeV/c) -DECLARE_SOA_COLUMN(Eta, eta, float); //! Eta -DECLARE_SOA_COLUMN(Phi, phi, float); //! Phi -DECLARE_SOA_COLUMN(PartType, partType, uint8_t); //! Type of the particle, according to resodaughter::ParticleType -DECLARE_SOA_COLUMN(TempFitVar, tempFitVar, float); //! Observable for the template fitting (Track: DCA_xy, V0: CPA) -DECLARE_SOA_COLUMN(Indices, indices, int[2]); //! Field for the track indices to remove auto-correlations -DECLARE_SOA_COLUMN(CascadeIndices, cascadeIndices, int[3]); //! Field for the track indices to remove auto-correlations (ordered: positive, negative, bachelor) -DECLARE_SOA_COLUMN(Sign, sign, int8_t); //! Sign of the track charge -DECLARE_SOA_COLUMN(TPCNClsCrossedRows, tpcNClsCrossedRows, uint8_t); //! Number of TPC crossed rows -DECLARE_SOA_COLUMN(TPCNClsFound, tpcNClsFound, uint8_t); //! Number of TPC clusters found -DECLARE_SOA_COLUMN(ITSNCls, itsNCls, uint8_t); //! Number of ITS clusters found -DECLARE_SOA_COLUMN(IsGlobalTrackWoDCA, isGlobalTrackWoDCA, bool); //! Is global track without DCA -DECLARE_SOA_COLUMN(IsGlobalTrack, isGlobalTrack, bool); //! Is global track -DECLARE_SOA_COLUMN(IsPrimaryTrack, isPrimaryTrack, bool); //! Is primary track -DECLARE_SOA_COLUMN(IsPVContributor, isPVContributor, bool); //! Is primary vertex contributor -DECLARE_SOA_COLUMN(HasITS, hasITS, bool); //! Has ITS -DECLARE_SOA_COLUMN(HasTPC, hasTPC, bool); //! Has TPC -DECLARE_SOA_COLUMN(HasTOF, hasTOF, bool); //! Has TOF -DECLARE_SOA_COLUMN(TPCCrossedRowsOverFindableCls, tpcCrossedRowsOverFindableCls, float); +DECLARE_SOA_INDEX_COLUMN_FULL(Track, track, int, Tracks, "_Trk"); //! +DECLARE_SOA_INDEX_COLUMN_FULL(V0, v0, int, V0s, "_V0"); //! +DECLARE_SOA_INDEX_COLUMN_FULL(Cascade, cascade, int, Cascades, "_Cas"); //! +DECLARE_SOA_COLUMN(Pt, pt, float); //! p_T (GeV/c) +DECLARE_SOA_COLUMN(Px, px, float); //! p_x (GeV/c) +DECLARE_SOA_COLUMN(Py, py, float); //! p_y (GeV/c) +DECLARE_SOA_COLUMN(Pz, pz, float); //! p_z (GeV/c) +DECLARE_SOA_COLUMN(Eta, eta, float); //! Eta +DECLARE_SOA_COLUMN(Phi, phi, float); //! Phi +DECLARE_SOA_COLUMN(PartType, partType, uint8_t); //! Type of the particle, according to resodaughter::ParticleType +DECLARE_SOA_COLUMN(TempFitVar, tempFitVar, float); //! Observable for the template fitting (Track: DCA_xy, V0: CPA) +DECLARE_SOA_COLUMN(Indices, indices, int[2]); //! Field for the track indices to remove auto-correlations +DECLARE_SOA_COLUMN(CascadeIndices, cascadeIndices, int[3]); //! Field for the track indices to remove auto-correlations (ordered: positive, negative, bachelor) +DECLARE_SOA_COLUMN(Sign, sign, int8_t); //! Sign of the track charge +DECLARE_SOA_COLUMN(TPCNClsCrossedRows, tpcNClsCrossedRows, uint8_t); //! Number of TPC crossed rows +DECLARE_SOA_COLUMN(TPCNClsFound, tpcNClsFound, uint8_t); //! Number of TPC clusters found +DECLARE_SOA_COLUMN(IsGlobalTrackWoDCA, isGlobalTrackWoDCA, bool); //! Is global track without DCA +DECLARE_SOA_COLUMN(IsGlobalTrack, isGlobalTrack, bool); //! Is global track +DECLARE_SOA_COLUMN(IsPrimaryTrack, isPrimaryTrack, bool); //! Is primary track +DECLARE_SOA_COLUMN(IsPVContributor, isPVContributor, bool); //! Is primary vertex contributor +DECLARE_SOA_COLUMN(HasTOF, hasTOF, bool); //! Has TOF +DECLARE_SOA_COLUMN(TpcNSigmaPi10, tpcNSigmaPi10, int8_t); //! TPC PID x10 of the track as Pion +DECLARE_SOA_COLUMN(TpcNSigmaKa10, tpcNSigmaKa10, int8_t); //! TPC PID x10 of the track as Kaon +DECLARE_SOA_COLUMN(TpcNSigmaPr10, tpcNSigmaPr10, int8_t); //! TPC PID x10 of the track as Proton +DECLARE_SOA_COLUMN(TofNSigmaPi10, tofNSigmaPi10, int8_t); //! TOF PID x10 of the track as Pion +DECLARE_SOA_COLUMN(TofNSigmaKa10, tofNSigmaKa10, int8_t); //! TOF PID x10 of the track as Kaon +DECLARE_SOA_COLUMN(TofNSigmaPr10, tofNSigmaPr10, int8_t); //! TOF PID x10 of the track as Proton DECLARE_SOA_COLUMN(DaughDCA, daughDCA, float); //! DCA between daughters DECLARE_SOA_COLUMN(CascDaughDCA, cascDaughDCA, float); //! DCA between daughters from cascade DECLARE_SOA_COLUMN(V0CosPA, v0CosPA, float); //! V0 Cosine of Pointing Angle @@ -210,6 +212,32 @@ DECLARE_SOA_COLUMN(DaughterID2, daughterID2, int); //! Id of the second Daught DECLARE_SOA_COLUMN(SiblingIds, siblingIds, int[2]); //! Index of the particles with the same mother DECLARE_SOA_COLUMN(BachTrkID, bachTrkID, int); //! Id of the bach track from cascade DECLARE_SOA_COLUMN(V0ID, v0ID, int); //! Id of the V0 from cascade +// Dynamic columns +// TPC PID return value/10 +DECLARE_SOA_DYNAMIC_COLUMN(TpcNSigmaPi, tpcNSigmaPi, + [](int8_t tpcNSigmaPi10) { + return (float)tpcNSigmaPi10 / 10.f; + }); +DECLARE_SOA_DYNAMIC_COLUMN(TpcNSigmaKa, tpcNSigmaKa, + [](int8_t tpcNSigmaKa10) { + return (float)tpcNSigmaKa10 / 10.f; + }); +DECLARE_SOA_DYNAMIC_COLUMN(TpcNSigmaPr, tpcNSigmaPr, + [](int8_t tpcNSigmaPr10) { + return (float)tpcNSigmaPr10 / 10.f; + }); +DECLARE_SOA_DYNAMIC_COLUMN(TofNSigmaPi, tofNSigmaPi, + [](int8_t tofNSigmaPi10) { + return (float)tofNSigmaPi10 / 10.f; + }); +DECLARE_SOA_DYNAMIC_COLUMN(TofNSigmaKa, tofNSigmaKa, + [](int8_t tofNSigmaKa10) { + return (float)tofNSigmaKa10 / 10.f; + }); +DECLARE_SOA_DYNAMIC_COLUMN(TofNSigmaPr, tofNSigmaPr, + [](int8_t tofNSigmaPr10) { + return (float)tofNSigmaPr10 / 10.f; + }); } // namespace resodaughter DECLARE_SOA_TABLE(ResoTracks, "AOD", "RESOTRACKS", o2::soa::Index<>, @@ -224,22 +252,15 @@ DECLARE_SOA_TABLE(ResoTracks, "AOD", "RESOTRACKS", resodaughter::Sign, resodaughter::TPCNClsCrossedRows, resodaughter::TPCNClsFound, - resodaughter::ITSNCls, o2::aod::track::DcaXY, o2::aod::track::DcaZ, - o2::aod::track::X, - o2::aod::track::Alpha, - resodaughter::HasITS, - resodaughter::HasTPC, resodaughter::HasTOF, - o2::aod::pidtpc::TPCNSigmaPi, - o2::aod::pidtpc::TPCNSigmaKa, - o2::aod::pidtpc::TPCNSigmaPr, - o2::aod::pidtpc::TPCNSigmaEl, - o2::aod::pidtof::TOFNSigmaPi, - o2::aod::pidtof::TOFNSigmaKa, - o2::aod::pidtof::TOFNSigmaPr, - o2::aod::pidtof::TOFNSigmaEl, + resodaughter::TpcNSigmaPi10, + resodaughter::TpcNSigmaKa10, + resodaughter::TpcNSigmaPr10, + resodaughter::TofNSigmaPi10, + resodaughter::TofNSigmaKa10, + resodaughter::TofNSigmaPr10, o2::aod::track::TPCSignal, o2::aod::track::PassedITSRefit, o2::aod::track::PassedTPCRefit, @@ -247,9 +268,13 @@ DECLARE_SOA_TABLE(ResoTracks, "AOD", "RESOTRACKS", resodaughter::IsGlobalTrack, resodaughter::IsPrimaryTrack, resodaughter::IsPVContributor, - resodaughter::TPCCrossedRowsOverFindableCls, - o2::aod::track::ITSChi2NCl, - o2::aod::track::TPCChi2NCl); + // Dynamic columns + resodaughter::TpcNSigmaPi, + resodaughter::TpcNSigmaKa, + resodaughter::TpcNSigmaPr, + resodaughter::TofNSigmaPi, + resodaughter::TofNSigmaKa, + resodaughter::TofNSigmaPr); using ResoTrack = ResoTracks::iterator; // For DF mixing study @@ -266,22 +291,15 @@ DECLARE_SOA_TABLE(ResoTrackDFs, "AOD", "RESOTRACKDFS", resodaughter::Sign, resodaughter::TPCNClsCrossedRows, resodaughter::TPCNClsFound, - resodaughter::ITSNCls, o2::aod::track::DcaXY, o2::aod::track::DcaZ, - o2::aod::track::X, - o2::aod::track::Alpha, - resodaughter::HasITS, - resodaughter::HasTPC, resodaughter::HasTOF, - o2::aod::pidtpc::TPCNSigmaPi, - o2::aod::pidtpc::TPCNSigmaKa, - o2::aod::pidtpc::TPCNSigmaPr, - o2::aod::pidtpc::TPCNSigmaEl, - o2::aod::pidtof::TOFNSigmaPi, - o2::aod::pidtof::TOFNSigmaKa, - o2::aod::pidtof::TOFNSigmaPr, - o2::aod::pidtof::TOFNSigmaEl, + resodaughter::TpcNSigmaPi10, + resodaughter::TpcNSigmaKa10, + resodaughter::TpcNSigmaPr10, + resodaughter::TofNSigmaPi10, + resodaughter::TofNSigmaKa10, + resodaughter::TofNSigmaPr10, o2::aod::track::TPCSignal, o2::aod::track::PassedITSRefit, o2::aod::track::PassedTPCRefit, @@ -289,9 +307,13 @@ DECLARE_SOA_TABLE(ResoTrackDFs, "AOD", "RESOTRACKDFS", resodaughter::IsGlobalTrack, resodaughter::IsPrimaryTrack, resodaughter::IsPVContributor, - resodaughter::TPCCrossedRowsOverFindableCls, - o2::aod::track::ITSChi2NCl, - o2::aod::track::TPCChi2NCl); + // Dynamic columns + resodaughter::TpcNSigmaPi, + resodaughter::TpcNSigmaKa, + resodaughter::TpcNSigmaPr, + resodaughter::TofNSigmaPi, + resodaughter::TofNSigmaKa, + resodaughter::TofNSigmaPr); using ResoTrackDF = ResoTrackDFs::iterator; DECLARE_SOA_TABLE(ResoV0s, "AOD", "RESOV0S", @@ -484,7 +506,7 @@ using ResoMCParent = ResoMCParents::iterator; using Reso2TracksExt = soa::Join; // without Extra using Reso2TracksMC = soa::Join; -using Reso2TracksPID = soa::Join; +using Reso2TracksPID = soa::Join; using Reso2TracksPIDExt = soa::Join; // Without Extra using ResoCollisionCandidates = soa::Join; diff --git a/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx b/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx index 374296d0a76..e08ec4fe8f3 100644 --- a/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx +++ b/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx @@ -91,19 +91,22 @@ struct ResonanceInitializer { /// Event cuts o2::analysis::CollisonCuts colCuts; - Configurable cfgEvtZvtx{"cfgEvtZvtx", 10.f, "Evt sel: Max. z-Vertex (cm)"}; - Configurable cfgEvtOccupancyInTimeRange{"cfgEvtOccupancyInTimeRange", -1, "Evt sel: maximum track occupancy"}; - Configurable cfgEvtTriggerCheck{"cfgEvtTriggerCheck", false, "Evt sel: check for trigger"}; - Configurable cfgEvtOfflineCheck{"cfgEvtOfflineCheck", true, "Evt sel: check for offline selection"}; - Configurable cfgEvtTriggerTVXSel{"cfgEvtTriggerTVXSel", false, "Evt sel: triggerTVX selection (MB)"}; - Configurable cfgEvtTFBorderCut{"cfgEvtTFBorderCut", false, "Evt sel: apply TF border cut"}; - Configurable cfgEvtUseITSTPCvertex{"cfgEvtUseITSTPCvertex", false, "Evt sel: use at lease on ITS-TPC track for vertexing"}; - Configurable cfgEvtCollInTimeRangeNarrow{"cfgEvtCollInTimeRangeNarrow", false, "Evt sel: apply NoCollInTimeRangeNarrow"}; - Configurable cfgEvtZvertexTimedifference{"cfgEvtZvertexTimedifference", false, "Evt sel: apply Z-vertex time difference"}; - Configurable cfgEvtPileupRejection{"cfgEvtPileupRejection", false, "Evt sel: apply pileup rejection"}; - Configurable cfgEvtNoITSROBorderCut{"cfgEvtNoITSROBorderCut", false, "Evt sel: apply NoITSRO border cut"}; - Configurable cfgEvtRun2AliEventCuts{"cfgEvtRun2AliEventCuts", true, "Evt sel: apply Run2 AliEventCuts"}; - Configurable cfgEvtRun2INELgtZERO{"cfgEvtRun2INELgtZERO", false, "Evt sel: apply Run2 INELgtZERO"}; + struct : ConfigurableGroup { + Configurable cfgEvtZvtx{"cfgEvtZvtx", 10.f, "Evt sel: Max. z-Vertex (cm)"}; + Configurable cfgEvtOccupancyInTimeRangeMax{"cfgEvtOccupancyInTimeRangeMax", -1, "Evt sel: maximum track occupancy"}; + Configurable cfgEvtOccupancyInTimeRangeMin{"cfgEvtOccupancyInTimeRangeMin", -1, "Evt sel: minimum track occupancy"}; + Configurable cfgEvtTriggerCheck{"cfgEvtTriggerCheck", false, "Evt sel: check for trigger"}; + Configurable cfgEvtOfflineCheck{"cfgEvtOfflineCheck", true, "Evt sel: check for offline selection"}; + Configurable cfgEvtTriggerTVXSel{"cfgEvtTriggerTVXSel", false, "Evt sel: triggerTVX selection (MB)"}; + Configurable cfgEvtTFBorderCut{"cfgEvtTFBorderCut", false, "Evt sel: apply TF border cut"}; + Configurable cfgEvtUseITSTPCvertex{"cfgEvtUseITSTPCvertex", false, "Evt sel: use at lease on ITS-TPC track for vertexing"}; + Configurable cfgEvtZvertexTimedifference{"cfgEvtZvertexTimedifference", false, "Evt sel: apply Z-vertex time difference"}; + Configurable cfgEvtPileupRejection{"cfgEvtPileupRejection", false, "Evt sel: apply pileup rejection"}; + Configurable cfgEvtNoITSROBorderCut{"cfgEvtNoITSROBorderCut", false, "Evt sel: apply NoITSRO border cut"}; + Configurable cfgEvtCollInTimeRangeStandard{"cfgEvtCollInTimeRangeStandard", false, "Evt sel: apply NoCollInTimeRangeStandard"}; + Configurable cfgEvtRun2AliEventCuts{"cfgEvtRun2AliEventCuts", true, "Evt sel: apply Run2 AliEventCuts"}; + Configurable cfgEvtRun2INELgtZERO{"cfgEvtRun2INELgtZERO", false, "Evt sel: apply Run2 INELgtZERO"}; + } EventCuts; Configurable cfgMultName{"cfgMultName", "FT0M", "The name of multiplicity estimator"}; @@ -143,6 +146,41 @@ struct ResonanceInitializer { Configurable cMinCascRadius{"cMinCascRadius", 0.0, "Minimum Cascade radius from PV"}; Configurable cCascMassResol{"cCascMassResol", 999, "Cascade mass resolution"}; + // Derived dataset selections + struct : ConfigurableGroup { + Configurable cfgFillPionTracks{"cfgFillPionTracks", false, "Fill pion tracks"}; + Configurable cfgFillKaonTracks{"cfgFillKaonTracks", false, "Fill kaon tracks"}; + Configurable cfgFillProtonTracks{"cfgFillProtonTracks", false, "Fill proton tracks"}; + Configurable cfgFillK0s{"cfgFillK0s", false, "Fill K0s"}; + Configurable cfgFillLambda0{"cfgFillLambda0", false, "Fill Lambda0"}; + Configurable cfgFillXi0{"cfgFillXi0", false, "Fill Xi0"}; + Configurable cfgFillOmega0{"cfgFillOmega0", false, "Fill Omega0"}; + } FilterForDerivedTables; + + // Secondary cuts + // Secondary Selection for K0s + struct : ConfigurableGroup { + Configurable cfgSecondaryRequire{"cfgSecondaryRequire", true, "Secondary cuts on/off"}; + Configurable cfgSecondaryArmenterosCut{"cfgSecondaryArmenterosCut", true, "cut on Armenteros-Podolanski graph"}; + Configurable cfgSecondaryCrossMassHypothesisCut{"cfgSecondaryCrossMassHypothesisCut", false, "Apply cut based on the lambda mass hypothesis"}; + + Configurable cfgByPassDauPIDSelection{"cfgByPassDauPIDSelection", true, "Bypass Daughters PID selection"}; + Configurable cfgSecondaryDauDCAMax{"cfgSecondaryDauDCAMax", 0.2, "Maximum DCA Secondary daughters to PV"}; + Configurable cfgSecondaryDauPosDCAtoPVMin{"cfgSecondaryDauPosDCAtoPVMin", 0.0, "Minimum DCA Secondary positive daughters to PV"}; + Configurable cfgSecondaryDauNegDCAtoPVMin{"cfgSecondaryDauNegDCAtoPVMin", 0.0, "Minimum DCA Secondary negative daughters to PV"}; + + Configurable cfgSecondaryPtMin{"cfgSecondaryPtMin", 0.f, "Minimum transverse momentum of Secondary"}; + Configurable cfgSecondaryRapidityMax{"cfgSecondaryRapidityMax", 0.5, "Maximum rapidity of Secondary"}; + Configurable cfgSecondaryRadiusMin{"cfgSecondaryRadiusMin", 0.0, "Minimum transverse radius of Secondary"}; + Configurable cfgSecondaryRadiusMax{"cfgSecondaryRadiusMax", 999.9, "Maximum transverse radius of Secondary"}; + Configurable cfgSecondaryCosPAMin{"cfgSecondaryCosPAMin", 0.998, "Mininum cosine pointing angle of Secondary"}; + Configurable cfgSecondaryDCAtoPVMax{"cfgSecondaryDCAtoPVMax", 0.4, "Maximum DCA Secondary to PV"}; + Configurable cfgSecondaryProperLifetimeMax{"cfgSecondaryProperLifetimeMax", 20., "Maximum Secondary Lifetime"}; + Configurable cfgSecondaryparamArmenterosCut{"cfgSecondaryparamArmenterosCut", 0.2, "parameter for Armenteros Cut"}; + Configurable cfgSecondaryMassWindow{"cfgSecondaryMassWindow", 0.03, "Secondary inv mass selection window"}; + Configurable cfgSecondaryCrossMassCutWindow{"cfgSecondaryCrossMassCutWindow", 0.05, "Secondary inv mass selection window with (anti)lambda hypothesis"}; + } SecondaryCuts; + HistogramRegistry qaRegistry{"QAHistos", {}, OutputObjHandlingPolicy::AnalysisObject}; // Pre-filters for efficient process @@ -194,6 +232,111 @@ struct ResonanceInitializer { using ResoCascadesMC = soa::Join; using BCsWithRun2Info = soa::Join; + template + bool filterTrack(T const& track) + { + // if no selection is requested, return true + if (!FilterForDerivedTables.cfgFillPionTracks && !FilterForDerivedTables.cfgFillKaonTracks && !FilterForDerivedTables.cfgFillProtonTracks) + return true; + if (FilterForDerivedTables.cfgFillPionTracks) { + if (std::abs(track.tpcNSigmaPi()) < pidnSigmaPreSelectionCut) + return true; + } + if (FilterForDerivedTables.cfgFillKaonTracks) { + if (std::abs(track.tpcNSigmaKa()) < pidnSigmaPreSelectionCut) + return true; + } + if (FilterForDerivedTables.cfgFillProtonTracks) { + if (std::abs(track.tpcNSigmaPr()) < pidnSigmaPreSelectionCut) + return true; + } + return false; + } + + template + bool filterV0(CollisionType const& collision, V0Type const& v0) + { + // if no selection is requested, return true + if (!FilterForDerivedTables.cfgFillK0s && !FilterForDerivedTables.cfgFillLambda0) + return true; + if (FilterForDerivedTables.cfgFillK0s) { + if (!SecondaryCuts.cfgSecondaryRequire) + return true; + if (v0.dcaV0daughters() > SecondaryCuts.cfgSecondaryDauDCAMax) + return false; + if (std::abs(v0.dcapostopv()) < SecondaryCuts.cfgSecondaryDauPosDCAtoPVMin) + return false; + if (std::abs(v0.dcanegtopv()) < SecondaryCuts.cfgSecondaryDauNegDCAtoPVMin) + return false; + if (v0.pt() < SecondaryCuts.cfgSecondaryPtMin) + return false; + if (std::fabs(v0.yK0Short()) > SecondaryCuts.cfgSecondaryRapidityMax) + return false; + if (v0.v0radius() < SecondaryCuts.cfgSecondaryRadiusMin || v0.v0radius() > SecondaryCuts.cfgSecondaryRadiusMax) + return false; + if (v0.dcav0topv() > SecondaryCuts.cfgSecondaryDCAtoPVMax) + return false; + if (v0.v0cosPA() < SecondaryCuts.cfgSecondaryCosPAMin) + return false; + if (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * MassK0Short > SecondaryCuts.cfgSecondaryProperLifetimeMax) + return false; + if (v0.qtarm() < SecondaryCuts.cfgSecondaryparamArmenterosCut * std::abs(v0.alpha())) + return false; + if (std::fabs(v0.mK0Short() - MassK0Short) > SecondaryCuts.cfgSecondaryMassWindow) + return false; + if (SecondaryCuts.cfgSecondaryCrossMassHypothesisCut && + ((std::fabs(v0.mLambda() - MassLambda0) < SecondaryCuts.cfgSecondaryCrossMassCutWindow) || (std::fabs(v0.mAntiLambda() - MassLambda0Bar) < SecondaryCuts.cfgSecondaryCrossMassCutWindow))) + return false; + return true; + } + if (FilterForDerivedTables.cfgFillLambda0) { + if (!SecondaryCuts.cfgSecondaryRequire) + return true; + if (v0.dcaV0daughters() > SecondaryCuts.cfgSecondaryDauDCAMax) + return false; + if (std::abs(v0.dcapostopv()) < SecondaryCuts.cfgSecondaryDauPosDCAtoPVMin) + return false; + if (std::abs(v0.dcanegtopv()) < SecondaryCuts.cfgSecondaryDauNegDCAtoPVMin) + return false; + if (v0.pt() < SecondaryCuts.cfgSecondaryPtMin) + return false; + if (std::fabs(v0.yLambda()) > SecondaryCuts.cfgSecondaryRapidityMax) + return false; + if (v0.v0radius() < SecondaryCuts.cfgSecondaryRadiusMin || v0.v0radius() > SecondaryCuts.cfgSecondaryRadiusMax) + return false; + if (v0.dcav0topv() > SecondaryCuts.cfgSecondaryDCAtoPVMax) + return false; + if (v0.v0cosPA() < SecondaryCuts.cfgSecondaryCosPAMin) + return false; + if (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * MassLambda0 > SecondaryCuts.cfgSecondaryProperLifetimeMax) + return false; + if (v0.qtarm() < SecondaryCuts.cfgSecondaryparamArmenterosCut * std::abs(v0.alpha())) + return false; + if (std::fabs(v0.mLambda() - MassLambda0) < SecondaryCuts.cfgSecondaryMassWindow) + return false; + if (SecondaryCuts.cfgSecondaryCrossMassHypothesisCut && (std::fabs(v0.mK0Short() - MassK0Short) < SecondaryCuts.cfgSecondaryCrossMassCutWindow)) + return false; + return true; + } + return false; + } + + template + bool filterCasc(T const& /*casc*/) + { + // if no selection is requested, return true + if (!FilterForDerivedTables.cfgFillXi0 && !FilterForDerivedTables.cfgFillOmega0) + return true; + if (FilterForDerivedTables.cfgFillXi0) { + // TODO: Implement, but cascades are very rare, do we need this? + return true; + } + if (FilterForDerivedTables.cfgFillOmega0) { + // TODO: Implement, but cascades are very rare, do we need this? + return true; + } + return false; + } template bool isTrackSelected(CollisionType const&, TrackType const& track) { @@ -457,6 +600,8 @@ struct ResonanceInitializer { for (auto const& track : tracks) { if (!isTrackSelected(collision, track)) continue; + if (!filterTrack(track)) + continue; reso2trks(resoCollisions.lastIndex(), track.globalIndex(), track.pt(), @@ -468,32 +613,22 @@ struct ResonanceInitializer { track.sign(), (uint8_t)track.tpcNClsCrossedRows(), (uint8_t)track.tpcNClsFound(), - (uint8_t)track.itsNCls(), track.dcaXY(), track.dcaZ(), - track.x(), - track.alpha(), - track.hasITS(), - track.hasTPC(), track.hasTOF(), - track.tpcNSigmaPi(), - track.tpcNSigmaKa(), - track.tpcNSigmaPr(), - track.tpcNSigmaEl(), - track.tofNSigmaPi(), - track.tofNSigmaKa(), - track.tofNSigmaPr(), - track.tofNSigmaEl(), + (int8_t)(track.tpcNSigmaPi() * 10), + (int8_t)(track.tpcNSigmaKa() * 10), + (int8_t)(track.tpcNSigmaPr() * 10), + (int8_t)(track.tofNSigmaPi() * 10), + (int8_t)(track.tofNSigmaKa() * 10), + (int8_t)(track.tofNSigmaPr() * 10), track.tpcSignal(), track.passedITSRefit(), track.passedTPCRefit(), track.isGlobalTrackWoDCA(), track.isGlobalTrack(), track.isPrimaryTrack(), - track.isPVContributor(), - track.tpcCrossedRowsOverFindableCls(), - track.itsChi2NCl(), - track.tpcChi2NCl()); + track.isPVContributor()); if constexpr (isMC) { fillMCTrack(track); } @@ -510,6 +645,8 @@ struct ResonanceInitializer { continue; childIDs[0] = v0.posTrackId(); childIDs[1] = v0.negTrackId(); + if (!filterV0(collision, v0)) + continue; reso2v0s(resoCollisions.lastIndex(), v0.globalIndex(), v0.pt(), @@ -557,6 +694,8 @@ struct ResonanceInitializer { childIDs[0] = casc.posTrackId(); childIDs[1] = casc.negTrackId(); childIDs[2] = casc.bachelorId(); + if (!filterCasc(casc)) + continue; reso2cascades(resoCollisions.lastIndex(), casc.globalIndex(), casc.pt(), @@ -963,20 +1102,21 @@ struct ResonanceInitializer { // Case selector based on the process. if (doprocessTrackDataRun2 || doprocessTrackV0DataRun2 || doprocessTrackV0CascDataRun2 || doprocessTrackMCRun2 || doprocessTrackV0MCRun2 || doprocessTrackV0CascMCRun2) { - colCuts.setCuts(cfgEvtZvtx, cfgEvtTriggerCheck, cfgEvtOfflineCheck, false); + colCuts.setCuts(EventCuts.cfgEvtZvtx, EventCuts.cfgEvtTriggerCheck, EventCuts.cfgEvtOfflineCheck, false); } else if (doprocessTrackData || doprocessTrackV0Data || doprocessTrackV0CascData || doprocessTrackMC || doprocessTrackV0MC || doprocessTrackV0CascMC || doprocessTrackEPData) { - colCuts.setCuts(cfgEvtZvtx, cfgEvtTriggerCheck, cfgEvtOfflineCheck, true, false, cfgEvtOccupancyInTimeRange); + colCuts.setCuts(EventCuts.cfgEvtZvtx, EventCuts.cfgEvtTriggerCheck, EventCuts.cfgEvtOfflineCheck, /*checkRun3*/ true, /*triggerTVXsel*/ false, EventCuts.cfgEvtOccupancyInTimeRangeMax, EventCuts.cfgEvtOccupancyInTimeRangeMin); } colCuts.init(&qaRegistry); - colCuts.setTriggerTVX(cfgEvtTriggerTVXSel); - colCuts.setApplyTFBorderCut(cfgEvtTFBorderCut); - colCuts.setApplyITSTPCvertex(cfgEvtUseITSTPCvertex); - colCuts.setApplyCollInTimeRangeNarrow(cfgEvtCollInTimeRangeNarrow); - colCuts.setApplyZvertexTimedifference(cfgEvtZvertexTimedifference); - colCuts.setApplyPileupRejection(cfgEvtPileupRejection); - colCuts.setApplyNoITSROBorderCut(cfgEvtNoITSROBorderCut); - colCuts.setApplyRun2AliEventCuts(cfgEvtRun2AliEventCuts); - colCuts.setApplyRun2INELgtZERO(cfgEvtRun2INELgtZERO); + colCuts.setTriggerTVX(EventCuts.cfgEvtTriggerTVXSel); + colCuts.setApplyTFBorderCut(EventCuts.cfgEvtTFBorderCut); + colCuts.setApplyITSTPCvertex(EventCuts.cfgEvtUseITSTPCvertex); + colCuts.setApplyZvertexTimedifference(EventCuts.cfgEvtZvertexTimedifference); + colCuts.setApplyPileupRejection(EventCuts.cfgEvtPileupRejection); + colCuts.setApplyNoITSROBorderCut(EventCuts.cfgEvtNoITSROBorderCut); + colCuts.setApplyCollInTimeRangeStandard(EventCuts.cfgEvtCollInTimeRangeStandard); + colCuts.setApplyRun2AliEventCuts(EventCuts.cfgEvtRun2AliEventCuts); + colCuts.setApplyRun2INELgtZERO(EventCuts.cfgEvtRun2INELgtZERO); + colCuts.printCuts(); if (!cfgBypassCCDB) { ccdb->setURL(ccdbURL.value); ccdb->setCaching(true); diff --git a/PWGLF/TableProducer/Resonances/resonanceMergeDF.cxx b/PWGLF/TableProducer/Resonances/resonanceMergeDF.cxx index f63a2d339aa..e193dff7f31 100644 --- a/PWGLF/TableProducer/Resonances/resonanceMergeDF.cxx +++ b/PWGLF/TableProducer/Resonances/resonanceMergeDF.cxx @@ -98,12 +98,12 @@ struct ResonanceMergeDF { std::vector> vecOfTuples; std::vector>> + float, float, signed char, unsigned char, unsigned char, + float, float, + bool, int8_t, int8_t, int8_t, + int8_t, int8_t, int8_t, float, + bool, bool, + bool, bool, bool, bool>>> vecOfVecOfTuples; void processTrackDataDF(aod::ResoCollisions::iterator const& collision, aod::ResoTracks const& tracks) { @@ -111,12 +111,12 @@ struct ResonanceMergeDF { int nCollisions = nDF; vecOfTuples.push_back(std::make_tuple(collision.posX(), collision.posY(), collision.posZ(), collision.cent(), collision.spherocity(), collision.evtPl(), collision.trackOccupancyInTimeRange())); std::vector> + float, float, signed char, unsigned char, unsigned char, + float, float, + bool, int8_t, int8_t, int8_t, + int8_t, int8_t, int8_t, float, + bool, bool, + bool, bool, bool, bool>> innerVector; for (const auto& track : tracks) { if (cpidCut) { @@ -124,14 +124,14 @@ struct ResonanceMergeDF { if (std::abs(track.tpcNSigmaPr()) > nsigmaPr && std::abs(track.tpcNSigmaKa()) > nsigmaKa) continue; - if (crejtpc && ((std::abs(track.tpcNSigmaPr()) > std::abs(track.tpcNSigmaEl()) && std::abs(track.tpcNSigmaKa()) > std::abs(track.tpcNSigmaEl())) || (std::abs(track.tpcNSigmaPr()) > std::abs(track.tpcNSigmaPi()) && std::abs(track.tpcNSigmaKa()) > std::abs(track.tpcNSigmaPi())))) + if (crejtpc && (std::abs(track.tpcNSigmaPr()) > std::abs(track.tpcNSigmaPi()) && std::abs(track.tpcNSigmaKa()) > std::abs(track.tpcNSigmaPi()))) continue; } else { if (std::abs(track.tofNSigmaPr()) > nsigmatofPr && std::abs(track.tofNSigmaKa()) > nsigmatofKa) continue; - if (crejtof && ((std::abs(track.tofNSigmaPr()) > std::abs(track.tofNSigmaEl()) && std::abs(track.tofNSigmaKa()) > std::abs(track.tofNSigmaEl())) || (std::abs(track.tofNSigmaPr()) > std::abs(track.tofNSigmaPi()) && std::abs(track.tofNSigmaKa()) > std::abs(track.tofNSigmaPi())))) + if (crejtof && (std::abs(track.tofNSigmaPr()) > std::abs(track.tofNSigmaPi()) && std::abs(track.tofNSigmaKa()) > std::abs(track.tofNSigmaPi()))) continue; } @@ -152,32 +152,22 @@ struct ResonanceMergeDF { track.sign(), (uint8_t)track.tpcNClsCrossedRows(), (uint8_t)track.tpcNClsFound(), - (uint8_t)track.itsNCls(), track.dcaXY(), track.dcaZ(), - track.x(), - track.alpha(), - track.hasITS(), - track.hasTPC(), track.hasTOF(), - track.tpcNSigmaPi(), - track.tpcNSigmaKa(), - track.tpcNSigmaPr(), - track.tpcNSigmaEl(), - track.tofNSigmaPi(), - track.tofNSigmaKa(), - track.tofNSigmaPr(), - track.tofNSigmaEl(), + (int8_t)(track.tpcNSigmaPi() * 10), + (int8_t)(track.tpcNSigmaKa() * 10), + (int8_t)(track.tpcNSigmaPr() * 10), + (int8_t)(track.tofNSigmaPi() * 10), + (int8_t)(track.tofNSigmaKa() * 10), + (int8_t)(track.tofNSigmaPr() * 10), track.tpcSignal(), track.passedITSRefit(), track.passedTPCRefit(), track.isGlobalTrackWoDCA(), track.isGlobalTrack(), track.isPrimaryTrack(), - track.isPVContributor(), - track.tpcCrossedRowsOverFindableCls(), - track.itsChi2NCl(), - track.tpcChi2NCl())); + track.isPVContributor())); } vecOfVecOfTuples.push_back(innerVector); @@ -222,17 +212,7 @@ struct ResonanceMergeDF { std::get<21>(tuple), std::get<22>(tuple), std::get<23>(tuple), - std::get<24>(tuple), - std::get<25>(tuple), - std::get<26>(tuple), - std::get<27>(tuple), - std::get<28>(tuple), - std::get<29>(tuple), - std::get<30>(tuple), - std::get<31>(tuple), - std::get<32>(tuple), - std::get<33>(tuple), - std::get<34>(tuple)); + std::get<24>(tuple)); } } @@ -261,14 +241,14 @@ struct ResonanceMergeDF { if (std::abs(track.tpcNSigmaPr()) > nsigmaPr && std::abs(track.tpcNSigmaKa()) > nsigmaKa) continue; - if (crejtpc && ((std::abs(track.tpcNSigmaPr()) > std::abs(track.tpcNSigmaEl()) && std::abs(track.tpcNSigmaKa()) > std::abs(track.tpcNSigmaEl())) || (std::abs(track.tpcNSigmaPr()) > std::abs(track.tpcNSigmaPi()) && std::abs(track.tpcNSigmaKa()) > std::abs(track.tpcNSigmaPi())))) + if (crejtpc && (std::abs(track.tpcNSigmaPr()) > std::abs(track.tpcNSigmaPi()) && std::abs(track.tpcNSigmaKa()) > std::abs(track.tpcNSigmaPi()))) continue; } else { if (std::abs(track.tofNSigmaPr()) > nsigmatofPr && std::abs(track.tofNSigmaKa()) > nsigmatofKa) continue; - if (crejtof && ((std::abs(track.tofNSigmaPr()) > std::abs(track.tofNSigmaEl()) && std::abs(track.tofNSigmaKa()) > std::abs(track.tofNSigmaEl())) || (std::abs(track.tofNSigmaPr()) > std::abs(track.tofNSigmaPi()) && std::abs(track.tofNSigmaKa()) > std::abs(track.tofNSigmaPi())))) + if (crejtof && (std::abs(track.tofNSigmaPr()) > std::abs(track.tofNSigmaPi()) && std::abs(track.tofNSigmaKa()) > std::abs(track.tofNSigmaPi()))) continue; } if (std::abs(track.dcaXY()) > cDCAXY) @@ -286,32 +266,22 @@ struct ResonanceMergeDF { track.sign(), (uint8_t)track.tpcNClsCrossedRows(), (uint8_t)track.tpcNClsFound(), - (uint8_t)track.itsNCls(), track.dcaXY(), track.dcaZ(), - track.x(), - track.alpha(), - track.hasITS(), - track.hasTPC(), track.hasTOF(), - track.tpcNSigmaPi(), - track.tpcNSigmaKa(), - track.tpcNSigmaPr(), - track.tpcNSigmaEl(), - track.tofNSigmaPi(), - track.tofNSigmaKa(), - track.tofNSigmaPr(), - track.tofNSigmaEl(), + (int8_t)(track.tpcNSigmaPi() * 10), + (int8_t)(track.tpcNSigmaKa() * 10), + (int8_t)(track.tpcNSigmaPr() * 10), + (int8_t)(track.tofNSigmaPi() * 10), + (int8_t)(track.tofNSigmaKa() * 10), + (int8_t)(track.tofNSigmaPr() * 10), track.tpcSignal(), track.passedITSRefit(), track.passedTPCRefit(), track.isGlobalTrackWoDCA(), track.isGlobalTrack(), track.isPrimaryTrack(), - track.isPVContributor(), - track.tpcCrossedRowsOverFindableCls(), - track.itsChi2NCl(), - track.tpcChi2NCl()); + track.isPVContributor()); } } PROCESS_SWITCH(ResonanceMergeDF, processLambdaStarCandidate, "Process for lambda star candidate", false); @@ -368,32 +338,22 @@ struct ResonanceMergeDF { track.sign(), (uint8_t)track.tpcNClsCrossedRows(), (uint8_t)track.tpcNClsFound(), - (uint8_t)track.itsNCls(), track.dcaXY(), track.dcaZ(), - track.x(), - track.alpha(), - track.hasITS(), - track.hasTPC(), track.hasTOF(), - track.tpcNSigmaPi(), - track.tpcNSigmaKa(), - track.tpcNSigmaPr(), - track.tpcNSigmaEl(), - track.tofNSigmaPi(), - track.tofNSigmaKa(), - track.tofNSigmaPr(), - track.tofNSigmaEl(), + (int8_t)(track.tpcNSigmaPi() * 10), + (int8_t)(track.tpcNSigmaKa() * 10), + (int8_t)(track.tpcNSigmaPr() * 10), + (int8_t)(track.tofNSigmaPi() * 10), + (int8_t)(track.tofNSigmaKa() * 10), + (int8_t)(track.tofNSigmaPr() * 10), track.tpcSignal(), track.passedITSRefit(), track.passedTPCRefit(), track.isGlobalTrackWoDCA(), track.isGlobalTrack(), track.isPrimaryTrack(), - track.isPVContributor(), - track.tpcCrossedRowsOverFindableCls(), - track.itsChi2NCl(), - track.tpcChi2NCl()); + track.isPVContributor()); } // Cascade candidate for (const auto& track : resocasctracks) { diff --git a/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx b/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx index e5473d75870..6b1033b77b2 100644 --- a/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx +++ b/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx @@ -762,32 +762,22 @@ struct ResonanceDaughterInitializer { track.sign(), (uint8_t)track.tpcNClsCrossedRows(), (uint8_t)track.tpcNClsFound(), - (uint8_t)track.itsNCls(), track.dcaXY(), track.dcaZ(), - track.x(), - track.alpha(), - track.hasITS(), - track.hasTPC(), track.hasTOF(), - track.tpcNSigmaPi(), - track.tpcNSigmaKa(), - track.tpcNSigmaPr(), - track.tpcNSigmaEl(), - track.tofNSigmaPi(), - track.tofNSigmaKa(), - track.tofNSigmaPr(), - track.tofNSigmaEl(), + (int8_t)(track.tpcNSigmaPi() * 10), + (int8_t)(track.tpcNSigmaKa() * 10), + (int8_t)(track.tpcNSigmaPr() * 10), + (int8_t)(track.tofNSigmaPi() * 10), + (int8_t)(track.tofNSigmaKa() * 10), + (int8_t)(track.tofNSigmaPr() * 10), track.tpcSignal(), track.passedITSRefit(), track.passedTPCRefit(), track.isGlobalTrackWoDCA(), track.isGlobalTrack(), track.isPrimaryTrack(), - track.isPVContributor(), - track.tpcCrossedRowsOverFindableCls(), - track.itsChi2NCl(), - track.tpcChi2NCl()); + track.isPVContributor()); if constexpr (isMC) { fillMCTrack(track); } diff --git a/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx b/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx index 9085a7b4368..bfc62a3841a 100644 --- a/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx +++ b/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx @@ -92,7 +92,6 @@ struct chargedkstaranalysis { /// PID Selections Configurable nsigmaCutCombinedPion{"nsigmaCutCombinedPion", -999, "Combined nSigma cut for Pion"}; // Combined - Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; // DCAr to PV Configurable cMaxDCArToPVcut{"cMaxDCArToPVcut", 0.5, @@ -349,8 +348,6 @@ struct chargedkstaranalysis { return false; if (std::abs(track.eta()) > confdaugheta) return false; - if (track.itsNCls() < cfgITScluster) - return false; if (std::abs(track.dcaXY()) > cMaxDCArToPVcut) return false; if (std::abs(track.dcaZ()) > cMaxDCAzToPVcut) diff --git a/PWGLF/Tasks/Resonances/f0980analysis.cxx b/PWGLF/Tasks/Resonances/f0980analysis.cxx index 3353fbebbab..d7b944e2ef6 100644 --- a/PWGLF/Tasks/Resonances/f0980analysis.cxx +++ b/PWGLF/Tasks/Resonances/f0980analysis.cxx @@ -14,6 +14,7 @@ #include #include #include "TVector2.h" +#include #include "Common/DataModel/Centrality.h" #include "Common/DataModel/EventSelection.h" @@ -72,17 +73,9 @@ struct f0980analysis { Configurable cfgGlobalTrack{ "cfgGlobalTrack", false, "Global track selection"}; // kGoldenChi2 | kDCAxy | kDCAz - Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; Configurable cfgTPCcluster{"cfgTPCcluster", 0, "Number of TPC cluster"}; - Configurable cfgRatioTPCRowsOverFindableCls{ - "cfgRatioTPCRowsOverFindableCls", 0.0f, - "TPC Crossed Rows to Findable Clusters"}; - Configurable cfgITSChi2NCl{"cfgITSChi2NCl", 999.0, "ITS Chi2/NCl"}; - Configurable cfgTPCChi2NCl{"cfgTPCChi2NCl", 999.0, "TPC Chi2/NCl"}; Configurable cfgUseTPCRefit{"cfgUseTPCRefit", false, "Require TPC Refit"}; Configurable cfgUseITSRefit{"cfgUseITSRefit", false, "Require ITS Refit"}; - Configurable cfgHasITS{"cfgHasITS", false, "Require ITS"}; - Configurable cfgHasTPC{"cfgHasTPC", false, "Require TPC"}; Configurable cfgHasTOF{"cfgHasTOF", false, "Require TOF"}; // PID @@ -171,20 +164,8 @@ struct f0980analysis { return false; if (std::abs(track.dcaZ()) > cfgMaxDCAzToPVcut) return false; - if (track.itsNCls() < cfgITScluster) - return false; if (track.tpcNClsFound() < cfgTPCcluster) return false; - if (track.tpcCrossedRowsOverFindableCls() < cfgRatioTPCRowsOverFindableCls) - return false; - if (track.itsChi2NCl() >= cfgITSChi2NCl) - return false; - if (track.tpcChi2NCl() >= cfgTPCChi2NCl) - return false; - if (cfgHasITS && !track.hasITS()) - return false; - if (cfgHasTPC && !track.hasTPC()) - return false; if (cfgHasTOF && !track.hasTOF()) return false; if (cfgUseITSRefit && !track.passedITSRefit()) diff --git a/PWGLF/Tasks/Resonances/k1analysis.cxx b/PWGLF/Tasks/Resonances/k1analysis.cxx index 7d145eff641..601227b666e 100644 --- a/PWGLF/Tasks/Resonances/k1analysis.cxx +++ b/PWGLF/Tasks/Resonances/k1analysis.cxx @@ -15,6 +15,7 @@ /// /// \author Bong-Hwi Lim +#include #include #include // FIXME #include // FIXME @@ -99,15 +100,9 @@ struct k1analysis { Configurable additionalQAplots{"additionalQAplots", true, "Additional QA plots"}; Configurable tof_at_high_pt{"tof_at_high_pt", false, "Use TOF at high pT"}; Configurable additionalEvsel{"additionalEvsel", true, "Additional event selcection"}; - Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; Configurable cfgTPCcluster{"cfgTPCcluster", 0, "Number of TPC cluster"}; - Configurable cfgRatioTPCRowsOverFindableCls{"cfgRatioTPCRowsOverFindableCls", 0.0f, "TPC Crossed Rows to Findable Clusters"}; - Configurable cfgITSChi2NCl{"cfgITSChi2NCl", 999.0, "ITS Chi2/NCl"}; - Configurable cfgTPCChi2NCl{"cfgTPCChi2NCl", 999.0, "TPC Chi2/NCl"}; Configurable cfgUseTPCRefit{"cfgUseTPCRefit", false, "Require TPC Refit"}; Configurable cfgUseITSRefit{"cfgUseITSRefit", false, "Require ITS Refit"}; - Configurable cfgHasITS{"cfgHasITS", false, "Require ITS"}; - Configurable cfgHasTPC{"cfgHasTPC", false, "Require TPC"}; Configurable cfgHasTOF{"cfgHasTOF", false, "Require TOF"}; // Secondary selection @@ -272,20 +267,8 @@ struct k1analysis { return false; if (std::abs(track.dcaZ()) > cMaxDCAzToPVcut) return false; - if (track.itsNCls() < cfgITScluster) - return false; if (track.tpcNClsFound() < cfgTPCcluster) return false; - if (track.tpcCrossedRowsOverFindableCls() < cfgRatioTPCRowsOverFindableCls) - return false; - if (track.itsChi2NCl() >= cfgITSChi2NCl) - return false; - if (track.tpcChi2NCl() >= cfgTPCChi2NCl) - return false; - if (cfgHasITS && !track.hasITS()) - return false; - if (cfgHasTPC && !track.hasTPC()) - return false; if (cfgHasTOF && !track.hasTOF()) return false; if (cfgUseITSRefit && !track.passedITSRefit()) diff --git a/PWGLF/Tasks/Resonances/k892analysis.cxx b/PWGLF/Tasks/Resonances/k892analysis.cxx index 2a980b3ffcd..f36263f93f2 100644 --- a/PWGLF/Tasks/Resonances/k892analysis.cxx +++ b/PWGLF/Tasks/Resonances/k892analysis.cxx @@ -8,7 +8,7 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. - +/// /// \file k892analysis.cxx /// \brief Reconstruction of track-track decay resonance candidates /// @@ -35,7 +35,7 @@ using namespace o2::framework::expressions; using namespace o2::soa; using namespace o2::constants::physics; -struct k892analysis { +struct K892analysis { SliceCache cache; Preslice perRCol = aod::resodaughter::resoCollisionId; Preslice perCollision = aod::track::collisionId; @@ -48,7 +48,7 @@ struct k892analysis { ConfigurableAxis binsPt{"binsPt", {VARIABLE_WIDTH, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5.0, 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 6.0, 6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 6.7, 6.8, 6.9, 7.0, 7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 7.7, 7.8, 7.9, 8.0, 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9, 9.0, 9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7, 9.8, 9.9, 10.0, 10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8, 10.9, 11.0, 11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7, 11.8, 11.9, 12.0, 12.1, 12.2, 12.3, 12.4, 12.5, 12.6, 12.7, 12.8, 12.9, 13.0, 13.1, 13.2, 13.3, 13.4, 13.5, 13.6, 13.7, 13.8, 13.9, 14.0, 14.1, 14.2, 14.3, 14.4, 14.5, 14.6, 14.7, 14.8, 14.9, 15.0}, "Binning of the pT axis"}; ConfigurableAxis binsPtQA{"binsPtQA", {VARIABLE_WIDTH, 0.0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8, 5.0, 5.2, 5.4, 5.6, 5.8, 6.0, 6.2, 6.4, 6.6, 6.8, 7.0, 7.2, 7.4, 7.6, 7.8, 8.0, 8.2, 8.4, 8.6, 8.8, 9.0, 9.2, 9.4, 9.6, 9.8, 10.0}, "Binning of the pT axis"}; ConfigurableAxis binsCent{"binsCent", {VARIABLE_WIDTH, 0.0, 1.0, 5.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0, 110.0}, "Binning of the centrality axis"}; - ConfigurableAxis occupancy_bins{"occupancy_bins", {VARIABLE_WIDTH, 0.0, 100, 500, 600, 1000, 1100, 1500, 1600, 2000, 2100, 2500, 2600, 3000, 3100, 3500, 3600, 4000, 4100, 4500, 4600, 5000, 5100, 9999}, "Binning of the occupancy axis"}; + ConfigurableAxis occupancyBins{"occupancyBins", {VARIABLE_WIDTH, 0.0, 100, 500, 600, 1000, 1100, 1500, 1600, 2000, 2100, 2500, 2600, 3000, 3100, 3500, 3600, 4000, 4100, 4500, 4600, 5000, 5100, 9999}, "Binning of the occupancy axis"}; // ConfigurableAxis binsCent{"binsCent", {200, 0.0f, 200.0f}, "Binning of the centrality axis"}; Configurable cInvMassStart{"cInvMassStart", 0.6, "Invariant mass start"}; Configurable cInvMassEnd{"cInvMassEnd", 1.5, "Invariant mass end"}; @@ -57,15 +57,15 @@ struct k892analysis { Configurable cPIDQALimit{"cPIDQALimit", 6.5, "PID QA limit"}; Configurable cDCABins{"cDCABins", 150, "DCA binning"}; Configurable invmass1D{"invmass1D", false, "Invariant mass 1D"}; - Configurable study_antiparticle{"study_antiparticle", false, "Study anti-particles separately"}; - Configurable PIDplots{"PIDplots", false, "Make TPC and TOF PID plots"}; + Configurable studyAntiparticle{"studyAntiparticle", false, "Study anti-particles separately"}; + Configurable fillPidPlots{"fillPidPlots", false, "Make TPC and TOF PID plots"}; Configurable applyOccupancyCut{"applyOccupancyCut", false, "Apply occupancy cut"}; - Configurable OccupancyCut{"OccupancyCut", 1000, "Mimimum Occupancy cut"}; + Configurable occupancyCut{"occupancyCut", 1000, "Mimimum Occupancy cut"}; /// Event Mixing Configurable nEvtMixing{"nEvtMixing", 5, "Number of events to mix"}; - ConfigurableAxis CfgVtxBins{"CfgVtxBins", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; - ConfigurableAxis CfgMultBins{"CfgMultBins", {VARIABLE_WIDTH, 0.0f, 1.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f, 110.0f}, "Mixing bins - z-vertex"}; + ConfigurableAxis cfgVtxBins{"cfgVtxBins", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; + ConfigurableAxis cfgMultBins{"cfgMultBins", {VARIABLE_WIDTH, 0.0f, 1.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f, 110.0f}, "Mixing bins - z-vertex"}; /// Pre-selection cuts Configurable cMinPtcut{"cMinPtcut", 0.15, "Track minium pt cut"}; @@ -95,23 +95,17 @@ struct k892analysis { Configurable additionalQAeventPlots{"additionalQAeventPlots", false, "Additional QA event plots"}; Configurable additionalMEPlots{"additionalMEPlots", false, "Additional Mixed event plots"}; - Configurable tof_at_high_pt{"tof_at_high_pt", false, "Use TOF at high pT"}; + Configurable tofAtHighPt{"tofAtHighPt", false, "Use TOF at high pT"}; Configurable additionalEvsel{"additionalEvsel", true, "Additional event selcection"}; - Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; Configurable cfgTPCcluster{"cfgTPCcluster", 0, "Number of TPC cluster"}; - Configurable cfgRatioTPCRowsOverFindableCls{"cfgRatioTPCRowsOverFindableCls", 0.0f, "TPC Crossed Rows to Findable Clusters"}; - Configurable cfgITSChi2NCl{"cfgITSChi2NCl", 999.0, "ITS Chi2/NCl"}; - Configurable cfgTPCChi2NCl{"cfgTPCChi2NCl", 999.0, "TPC Chi2/NCl"}; Configurable cfgUseTPCRefit{"cfgUseTPCRefit", false, "Require TPC Refit"}; Configurable cfgUseITSRefit{"cfgUseITSRefit", false, "Require ITS Refit"}; - Configurable cfgHasITS{"cfgHasITS", false, "Require ITS"}; - Configurable cfgHasTPC{"cfgHasTPC", false, "Require TPC"}; Configurable cfgHasTOF{"cfgHasTOF", false, "Require TOF"}; // Rotational background - Configurable IsCalcRotBkg{"IsCalcRotBkg", true, "Calculate rotational background"}; - Configurable rotational_cut{"rotational_cut", 10, "Cut value (Rotation angle pi - pi/cut and pi + pi/cut)"}; - Configurable c_nof_rotations{"c_nof_rotations", 3, "Number of random rotations in the rotational background"}; + Configurable isCalcRotBkg{"isCalcRotBkg", true, "Calculate rotational background"}; + Configurable rotationalCut{"rotationalCut", 10, "Cut value (Rotation angle pi - pi/cut and pi + pi/cut)"}; + Configurable cNofRotations{"cNofRotations", 3, "Number of random rotations in the rotational background"}; // MC Event selection Configurable cZvertCutMC{"cZvertCutMC", 10.0, "MC Z-vertex cut"}; @@ -143,7 +137,7 @@ struct k892analysis { AxisSpec ptAxisQA = {binsPtQA, "#it{p}_{T} (GeV/#it{c})"}; AxisSpec invMassAxis = {cInvMassBins, cInvMassStart, cInvMassEnd, "Invariant Mass (GeV/#it{c}^2)"}; AxisSpec pidQAAxis = {cPIDBins, -cPIDQALimit, cPIDQALimit}; - AxisSpec occupancy_axis = {occupancy_bins, "Occupancy [-40,100]"}; + AxisSpec occupancyAxis = {occupancyBins, "Occupancy [-40,100]"}; if (additionalQAeventPlots) { // Test on Mixed event @@ -169,7 +163,7 @@ struct k892analysis { histos.add("k892invmassDS", "Invariant mass of K(892)0 differnt sign", kTH1F, {invMassAxis}); histos.add("k892invmassLS", "Invariant mass of K(892)0 like sign", kTH1F, {invMassAxis}); histos.add("k892invmassME", "Invariant mass of K(892)0 mixed event", kTH1F, {invMassAxis}); - if (study_antiparticle) { + if (studyAntiparticle) { histos.add("k892invmassDSAnti", "Invariant mass of Anti-K(892)0 differnt sign", kTH1F, {invMassAxis}); histos.add("k892invmassLSAnti", "Invariant mass of Anti-K(892)0 like sign", kTH1F, {invMassAxis}); } @@ -214,7 +208,7 @@ struct k892analysis { histos.add("QAafter/trkpT_pi", "pT distribution of pion track candidates", kTH1F, {ptAxis}); histos.add("QAafter/trkpT_ka", "pT distribution of kaon track candidates", kTH1F, {ptAxis}); // PID QA before cuts - if (PIDplots) { + if (fillPidPlots) { histos.add("QAbefore/TOF_TPC_Map_pi_all", "TOF + TPC Combined PID for Pion;#sigma_{TOF}^{Pion};#sigma_{TPC}^{Pion}", {HistType::kTH2F, {pidQAAxis, pidQAAxis}}); histos.add("QAbefore/TOF_Nsigma_pi_all", "TOF NSigma for Pion;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Pion};", {HistType::kTH3F, {centAxis, ptAxisQA, pidQAAxis}}); histos.add("QAbefore/TPC_Nsigma_pi_all", "TPC NSigma for Pion;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Pion};", {HistType::kTH3F, {centAxis, ptAxisQA, pidQAAxis}}); @@ -253,17 +247,17 @@ struct k892analysis { } // 3d histogram - histos.add("h3k892invmassDS", "Invariant mass of K(892)0 differnt sign", kTHnSparseF, {centAxis, ptAxis, invMassAxis, occupancy_axis}); - histos.add("h3k892invmassLS", "Invariant mass of K(892)0 same sign", kTHnSparseF, {centAxis, ptAxis, invMassAxis, occupancy_axis}); - histos.add("h3k892invmassME", "Invariant mass of K(892)0 mixed event", kTHnSparseF, {centAxis, ptAxis, invMassAxis, occupancy_axis}); - histos.add("h3k892invmassLSAnti", "Invariant mass of Anti-K(892)0 same sign", kTHnSparseF, {centAxis, ptAxis, invMassAxis, occupancy_axis}); + histos.add("h3k892invmassDS", "Invariant mass of K(892)0 differnt sign", kTHnSparseF, {centAxis, ptAxis, invMassAxis, occupancyAxis}); + histos.add("h3k892invmassLS", "Invariant mass of K(892)0 same sign", kTHnSparseF, {centAxis, ptAxis, invMassAxis, occupancyAxis}); + histos.add("h3k892invmassME", "Invariant mass of K(892)0 mixed event", kTHnSparseF, {centAxis, ptAxis, invMassAxis, occupancyAxis}); + histos.add("h3k892invmassLSAnti", "Invariant mass of Anti-K(892)0 same sign", kTHnSparseF, {centAxis, ptAxis, invMassAxis, occupancyAxis}); - if (study_antiparticle) { - histos.add("h3k892invmassDSAnti", "Invariant mass of Anti-K(892)0 differnt sign", kTHnSparseF, {centAxis, ptAxis, invMassAxis, occupancy_axis}); + if (studyAntiparticle) { + histos.add("h3k892invmassDSAnti", "Invariant mass of Anti-K(892)0 differnt sign", kTHnSparseF, {centAxis, ptAxis, invMassAxis, occupancyAxis}); } - if (IsCalcRotBkg) { - histos.add("h3K892InvMassRotation", "Invariant mass of K(892)0 rotation", kTHnSparseF, {centAxis, ptAxis, invMassAxis, occupancy_axis}); + if (isCalcRotBkg) { + histos.add("h3K892InvMassRotation", "Invariant mass of K(892)0 rotation", kTHnSparseF, {centAxis, ptAxis, invMassAxis, occupancyAxis}); } if (additionalMEPlots) { @@ -277,7 +271,7 @@ struct k892analysis { histos.add("QAMCTrue/trkDCAxy_ka", "DCAxy distribution of kaon track candidates", HistType::kTH1F, {dcaxyAxis}); histos.add("QAMCTrue/trkDCAz_pi", "DCAz distribution of pion track candidates", HistType::kTH1F, {dcazAxis}); histos.add("QAMCTrue/trkDCAz_ka", "DCAz distribution of kaon track candidates", HistType::kTH1F, {dcazAxis}); - if (PIDplots) { + if (fillPidPlots) { histos.add("QAMCTrue/TOF_Nsigma_pi_all", "TOF NSigma for Pion;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Pion};", {HistType::kTH3F, {centAxis, ptAxisQA, pidQAAxis}}); histos.add("QAMCTrue/TPC_Nsigma_pi_all", "TPC NSigma for Pion;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Pion};", {HistType::kTH3F, {centAxis, ptAxisQA, pidQAAxis}}); histos.add("QAMCTrue/TOF_Nsigma_ka_all", "TOF NSigma for Pion;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Kaon};", {HistType::kTH3F, {centAxis, ptAxisQA, pidQAAxis}}); @@ -343,20 +337,8 @@ struct k892analysis { return false; if (std::abs(track.dcaZ()) > cMaxDCAzToPVcut) return false; - if (track.itsNCls() < cfgITScluster) - return false; if (track.tpcNClsFound() < cfgTPCcluster) return false; - if (track.tpcCrossedRowsOverFindableCls() < cfgRatioTPCRowsOverFindableCls) - return false; - if (track.itsChi2NCl() >= cfgITSChi2NCl) - return false; - if (track.tpcChi2NCl() >= cfgTPCChi2NCl) - return false; - if (cfgHasITS && !track.hasITS()) - return false; - if (cfgHasTPC && !track.hasTPC()) - return false; if (cfgHasTOF && !track.hasTOF()) return false; if (cfgUseITSRefit && !track.passedITSRefit()) @@ -378,7 +360,7 @@ struct k892analysis { template bool selectionPIDPion(const T& candidate) { - if (tof_at_high_pt) { + if (tofAtHighPt) { if (candidate.hasTOF() && (std::abs(candidate.tofNSigmaPi()) < cMaxTOFnSigmaPion)) { return true; } @@ -412,7 +394,7 @@ struct k892analysis { template bool selectionPIDKaon(const T& candidate) { - if (tof_at_high_pt) { + if (tofAtHighPt) { if (candidate.hasTOF() && (std::abs(candidate.tofNSigmaKa()) < cMaxTOFnSigmaKaon)) { return true; } @@ -452,8 +434,8 @@ struct k892analysis { if (additionalEvsel && !eventSelected(collision, multiplicity)) { return; } - auto occupancy_no = collision.trackOccupancyInTimeRange(); - if (applyOccupancyCut && occupancy_no < OccupancyCut) { + auto occupancyNo = collision.trackOccupancyInTimeRange(); + if (applyOccupancyCut && occupancyNo < occupancyCut) { return; } @@ -481,8 +463,8 @@ struct k892analysis { histos.fill(HIST("MultCalib/GloPVpi_after"), dTracks1.size(), collision.multNTracksPV()); // global tracks vs PV tracks after the multiplicity calibration cuts } - TLorentzVector lDecayDaughter1, lDecayDaughter2, lResonance, ldaughter_rot, lresonance_rot; - for (auto& [trk1, trk2] : combinations(CombinationsFullIndexPolicy(dTracks1, dTracks2))) { + TLorentzVector lDecayDaughter1, lDecayDaughter2, lResonance, ldaughterRot, lresonanceRot; + for (const auto& [trk1, trk2] : combinations(CombinationsFullIndexPolicy(dTracks1, dTracks2))) { // Full index policy is needed to consider all possible combinations if (trk1.index() == trk2.index()) @@ -511,14 +493,14 @@ struct k892analysis { auto trk2NSigmaKaTPC = trk2.tpcNSigmaKa(); auto trk2NSigmaKaTOF = (isTrk2hasTOF) ? trk2.tofNSigmaKa() : -999.; - auto deltaEta = TMath::Abs(trk1.eta() - trk2.eta()); - auto deltaPhi = TMath::Abs(trk1.phi() - trk2.phi()); - deltaPhi = (deltaPhi > TMath::Pi()) ? (2 * TMath::Pi() - deltaPhi) : deltaPhi; + auto deltaEta = std::abs(trk1.eta() - trk2.eta()); + auto deltaPhi = std::abs(trk1.phi() - trk2.phi()); + deltaPhi = (deltaPhi > constants::math::PI) ? (constants::math::TwoPI - deltaPhi) : deltaPhi; if constexpr (!IsMix) { //// QA plots before the selection // --- PID QA Pion - if (PIDplots) { + if (fillPidPlots) { histos.fill(HIST("QAbefore/TPC_Nsigma_pi_all"), multiplicity, trk1ptPi, trk1NSigmaPiTPC); if (isTrk1hasTOF) { histos.fill(HIST("QAbefore/TOF_Nsigma_pi_all"), multiplicity, trk1ptPi, trk1NSigmaPiTOF); @@ -565,7 +547,7 @@ struct k892analysis { if constexpr (!IsMix) { //// QA plots after the selection // --- PID QA Pion - if (PIDplots) { + if (fillPidPlots) { histos.fill(HIST("QAafter/TPC_Nsigma_pi_all"), multiplicity, trk1ptPi, trk1NSigmaPiTPC); if (isTrk1hasTOF) { histos.fill(HIST("QAafter/TOF_Nsigma_pi_all"), multiplicity, trk1ptPi, trk1NSigmaPiTOF); @@ -601,7 +583,7 @@ struct k892analysis { lDecayDaughter2.SetPtEtaPhiM(trk2.pt(), trk2.eta(), trk2.phi(), massKa); lResonance = lDecayDaughter1 + lDecayDaughter2; // Rapidity cut - if (abs(lResonance.Rapidity()) >= 0.5) + if (std::abs(lResonance.Rapidity()) >= 0.5) continue; if (cfgCutsOnMother) { if (lResonance.Pt() >= cMaxPtMotherCut) // excluding candidates in overflow @@ -629,33 +611,33 @@ struct k892analysis { //// Un-like sign pair only if (trk1.sign() * trk2.sign() < 0) { if constexpr (!IsMix) { - if (IsCalcRotBkg) { - for (int i = 0; i < c_nof_rotations; i++) { - float theta2 = rn->Uniform(TMath::Pi() - TMath::Pi() / rotational_cut, TMath::Pi() + TMath::Pi() / rotational_cut); - ldaughter_rot.SetPtEtaPhiM(trk2.pt(), trk2.eta(), trk2.phi() + theta2, massKa); // for rotated background - lresonance_rot = lDecayDaughter1 + ldaughter_rot; - histos.fill(HIST("h3K892InvMassRotation"), multiplicity, lresonance_rot.Pt(), lresonance_rot.M(), occupancy_no); + if (isCalcRotBkg) { + for (int i = 0; i < cNofRotations; i++) { + float theta2 = rn->Uniform(constants::math::PI - constants::math::PI / rotationalCut, constants::math::PI + constants::math::PI / rotationalCut); + ldaughterRot.SetPtEtaPhiM(trk2.pt(), trk2.eta(), trk2.phi() + theta2, massKa); // for rotated background + lresonanceRot = lDecayDaughter1 + ldaughterRot; + histos.fill(HIST("h3K892InvMassRotation"), multiplicity, lresonanceRot.Pt(), lresonanceRot.M(), occupancyNo); } } - if (study_antiparticle) { + if (studyAntiparticle) { if (trk1.sign() < 0) { if (invmass1D) histos.fill(HIST("k892invmassDS"), lResonance.M()); - histos.fill(HIST("h3k892invmassDS"), multiplicity, lResonance.Pt(), lResonance.M(), occupancy_no); + histos.fill(HIST("h3k892invmassDS"), multiplicity, lResonance.Pt(), lResonance.M(), occupancyNo); } else if (trk1.sign() > 0) { if (invmass1D) histos.fill(HIST("k892invmassDSAnti"), lResonance.M()); - histos.fill(HIST("h3k892invmassDSAnti"), multiplicity, lResonance.Pt(), lResonance.M(), occupancy_no); + histos.fill(HIST("h3k892invmassDSAnti"), multiplicity, lResonance.Pt(), lResonance.M(), occupancyNo); } } else { if (invmass1D) histos.fill(HIST("k892invmassDS"), lResonance.M()); - histos.fill(HIST("h3k892invmassDS"), multiplicity, lResonance.Pt(), lResonance.M(), occupancy_no); + histos.fill(HIST("h3k892invmassDS"), multiplicity, lResonance.Pt(), lResonance.M(), occupancyNo); } } else { if (invmass1D) histos.fill(HIST("k892invmassME"), lResonance.M()); - histos.fill(HIST("h3k892invmassME"), multiplicity, lResonance.Pt(), lResonance.M(), occupancy_no); + histos.fill(HIST("h3k892invmassME"), multiplicity, lResonance.Pt(), lResonance.M(), occupancyNo); if (additionalMEPlots) { if (trk1.sign() < 0) { if (invmass1D) @@ -671,11 +653,11 @@ struct k892analysis { // MC if constexpr (IsMC) { - if (abs(trk1.pdgCode()) != 211 || abs(trk2.pdgCode()) != 321) + if (std::abs(trk1.pdgCode()) != 211 || std::abs(trk2.pdgCode()) != 321) continue; if (trk1.motherId() != trk2.motherId()) // Same mother continue; - if (abs(trk1.motherPDG()) != 313) + if (std::abs(trk1.motherPDG()) != 313) continue; // Track selection check. @@ -683,7 +665,7 @@ struct k892analysis { histos.fill(HIST("QAMCTrue/trkDCAxy_ka"), trk2.dcaXY()); histos.fill(HIST("QAMCTrue/trkDCAz_pi"), trk1.dcaZ()); histos.fill(HIST("QAMCTrue/trkDCAz_ka"), trk2.dcaZ()); - if (PIDplots) { + if (fillPidPlots) { histos.fill(HIST("QAMCTrue/TPC_Nsigma_pi_all"), multiplicity, trk1ptPi, trk1NSigmaPiTPC); if (isTrk1hasTOF) { histos.fill(HIST("QAMCTrue/TOF_Nsigma_pi_all"), multiplicity, trk1ptPi, trk1NSigmaPiTOF); @@ -710,18 +692,18 @@ struct k892analysis { if (trk1.sign() < 0) { if (invmass1D) histos.fill(HIST("k892invmassLS"), lResonance.M()); - histos.fill(HIST("h3k892invmassLS"), multiplicity, lResonance.Pt(), lResonance.M(), occupancy_no); + histos.fill(HIST("h3k892invmassLS"), multiplicity, lResonance.Pt(), lResonance.M(), occupancyNo); } else if (trk1.sign() > 0) { if (invmass1D) histos.fill(HIST("k892invmassLSAnti"), lResonance.M()); - histos.fill(HIST("h3k892invmassLSAnti"), multiplicity, lResonance.Pt(), lResonance.M(), occupancy_no); + histos.fill(HIST("h3k892invmassLSAnti"), multiplicity, lResonance.Pt(), lResonance.M(), occupancyNo); } } } } } - void processDataLight(aod::ResoCollision& collision, + void processDataLight(aod::ResoCollision const& collision, aod::ResoTracks const& resotracks) { // LOG(info) << "new collision, zvtx: " << collision.posZ(); @@ -729,25 +711,25 @@ struct k892analysis { histos.fill(HIST("QAevent/hEvtCounterSameE"), 1.0); fillHistograms(collision, resotracks, resotracks); } - PROCESS_SWITCH(k892analysis, processDataLight, "Process Event for data", false); + PROCESS_SWITCH(K892analysis, processDataLight, "Process Event for data", false); void processMCLight(ResoMCCols::iterator const& collision, soa::Join const& resotracks) { - if (!collision.isInAfterAllCuts() || (abs(collision.posZ()) > cZvertCutMC)) // MC event selection, all cuts missing vtx cut + if (!collision.isInAfterAllCuts() || (std::abs(collision.posZ()) > cZvertCutMC)) // MC event selection, all cuts missing vtx cut return; fillHistograms(collision, resotracks, resotracks); } - PROCESS_SWITCH(k892analysis, processMCLight, "Process Event for MC (Reconstructed)", false); + PROCESS_SWITCH(K892analysis, processMCLight, "Process Event for MC (Reconstructed)", false); - void processMCTrue(ResoMCCols::iterator const& collision, aod::ResoMCParents& resoParents) + void processMCTrue(ResoMCCols::iterator const& collision, aod::ResoMCParents const& resoParents) { auto multiplicity = collision.cent(); - for (auto& part : resoParents) { // loop over all pre-filtered MC particles - if (abs(part.pdgCode()) != 313 || abs(part.y()) >= 0.5) + for (const auto& part : resoParents) { // loop over all pre-filtered MC particles + if (std::abs(part.pdgCode()) != 313 || std::abs(part.y()) >= 0.5) continue; - bool pass1 = abs(part.daughterPDG1()) == 211 || abs(part.daughterPDG2()) == 211; - bool pass2 = abs(part.daughterPDG1()) == 321 || abs(part.daughterPDG2()) == 321; + bool pass1 = std::abs(part.daughterPDG1()) == 211 || std::abs(part.daughterPDG2()) == 211; + bool pass2 = std::abs(part.daughterPDG1()) == 321 || std::abs(part.daughterPDG2()) == 321; if (!pass1 || !pass2) continue; @@ -782,26 +764,26 @@ struct k892analysis { } } } - PROCESS_SWITCH(k892analysis, processMCTrue, "Process Event for MC (Generated)", false); + PROCESS_SWITCH(K892analysis, processMCTrue, "Process Event for MC (Generated)", false); // Processing Event Mixing using BinningTypeVtxZT0M = ColumnBinningPolicy; - void processMELight(o2::aod::ResoCollisions& collisions, aod::ResoTracks const& resotracks) + void processMELight(o2::aod::ResoCollisions const& collisions, aod::ResoTracks const& resotracks) { auto tracksTuple = std::make_tuple(resotracks); - BinningTypeVtxZT0M colBinning{{CfgVtxBins, CfgMultBins}, true}; + BinningTypeVtxZT0M colBinning{{cfgVtxBins, cfgMultBins}, true}; SameKindPair pairs{colBinning, nEvtMixing, -1, collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip - for (auto& [collision1, tracks1, collision2, tracks2] : pairs) { + for (const auto& [collision1, tracks1, collision2, tracks2] : pairs) { if (additionalQAeventPlots) histos.fill(HIST("QAevent/hEvtCounterMixedE"), 1.0); fillHistograms(collision1, tracks1, tracks2); } }; - PROCESS_SWITCH(k892analysis, processMELight, "Process EventMixing light without partition", false); + PROCESS_SWITCH(K892analysis, processMELight, "Process EventMixing light without partition", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{adaptAnalysisTask(cfgc, TaskName{"lf-k892analysis"})}; + return WorkflowSpec{adaptAnalysisTask(cfgc)}; } diff --git a/PWGLF/Tasks/Resonances/kstar892analysis.cxx b/PWGLF/Tasks/Resonances/kstar892analysis.cxx index eb75690babd..ec843051f40 100644 --- a/PWGLF/Tasks/Resonances/kstar892analysis.cxx +++ b/PWGLF/Tasks/Resonances/kstar892analysis.cxx @@ -88,11 +88,7 @@ struct kstar892analysis { Configurable additionalMEPlots{"additionalMEPlots", false, "Additional Mixed event plots"}; Configurable tof_at_high_pt{"tof_at_high_pt", false, "Use TOF at high pT"}; - Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; Configurable cfgTPCcluster{"cfgTPCcluster", 0, "Number of TPC cluster"}; - Configurable cfgRatioTPCRowsOverFindableCls{"cfgRatioTPCRowsOverFindableCls", 0.0f, "TPC Crossed Rows to Findable Clusters"}; - Configurable cfgITSChi2NCl{"cfgITSChi2NCl", 999.0, "ITS Chi2/NCl"}; - Configurable cfgTPCChi2NCl{"cfgTPCChi2NCl", 999.0, "TPC Chi2/NCl"}; Configurable cfgUseTPCRefit{"cfgUseTPCRefit", false, "Require TPC Refit"}; Configurable cfgUseITSRefit{"cfgUseITSRefit", false, "Require ITS Refit"}; @@ -111,7 +107,6 @@ struct kstar892analysis { void init(o2::framework::InitContext&) { - // LOG(info) << "\n cfgITScluster ============>"<< static_cast(cfgITScluster); // LOG(info)<< "\n cfgTPCcluster ============>"<< static_cast(cfgTPCcluster); AxisSpec centAxis = {binsCent, "V0M (%)"}; @@ -248,9 +243,7 @@ struct kstar892analysis { // Filters Filter acceptanceFilter = nabs(aod::resodaughter::pt) >= cMinPtcut; - Filter qualityFilter = (aod::track::itsChi2NCl <= cfgITSChi2NCl) && (aod::track::tpcChi2NCl <= cfgTPCChi2NCl) && (aod::resodaughter::tpcCrossedRowsOverFindableCls >= cfgRatioTPCRowsOverFindableCls); Filter DCAcutFilter = (nabs(aod::track::dcaXY) <= cMaxDCArToPVcut) && (nabs(aod::track::dcaZ) <= cMaxDCAzToPVcut); - Filter hasTPCfilter = aod::resodaughter::hasTPC == true; Filter primarytrackFilter = aod::resodaughter::isPVContributor && aod::resodaughter::isPrimaryTrack && aod::resodaughter::isGlobalTrackWoDCA; // partitions for data @@ -283,8 +276,6 @@ struct kstar892analysis { template bool trackCut(const TrackType track) { - if (track.itsNCls() < cfgITScluster) - return false; if (track.tpcNClsFound() < cfgTPCcluster) return false; diff --git a/PWGLF/Tasks/Resonances/lambda1520_PbPb.cxx b/PWGLF/Tasks/Resonances/lambda1520_PbPb.cxx index ab86710e333..64084d6f4e2 100644 --- a/PWGLF/Tasks/Resonances/lambda1520_PbPb.cxx +++ b/PWGLF/Tasks/Resonances/lambda1520_PbPb.cxx @@ -71,10 +71,8 @@ struct lambdaAnalysis_pb { Configurable cRejNsigmaTpcPi{"cRejNsigmaTpcPi", 3.0, "Reject tracks to improve purity of TPC PID"}; // TPC And TOF tracks // Configurable cRejNsigmaTpcPr{"cRejNsigmaTpcPr", 3.0, "Reject tracks to improve purity of TPC PID"}; Configurable cRejNsigmaTpcKa{"cRejNsigmaTpcKa", 3.0, "Reject tracks to improve purity of TPC PID"}; - Configurable cRejNsigmaTpcEl{"cRejNsigmaTpcEl", 3.0, "Reject tracks to improve purity of TPC PID"}; Configurable cRejNsigmakTpcPi{"cRejNsigmakTpcPi", 3.0, "Reject tracks to improve purity of TPC PID"}; Configurable cRejNsigmakTpcPr{"cRejNsigmakTpcPr", 3.0, "Reject tracks to improve purity of TPC PID"}; - Configurable cRejNsigmakTpcEl{"cRejNsigmakTpcEl", 3.0, "Reject tracks to improve purity of TPC PID"}; Configurable minnsigmatpcKa{"minnsigmatpcKa", -6.0, "Reject tracks to improve purity of TPC PID"}; Configurable minnsigmatpcPr{"minnsigmatpcPr", -6.0, "Reject tracks to improve purity of TPC PID"}; Configurable minnsigmatofKa{"minnsigmatofKa", -6.0, "Reject tracks to improve purity of TofPID"}; @@ -148,13 +146,11 @@ struct lambdaAnalysis_pb { histos.add("QAafter/Proton/h2d_pr_nsigma_tpc_pt", " Protons", kTH2F, {axisPt_pid, axisTPCNsigma}); histos.add("QAafter/Proton/h2d_Prpi_nsigma_tpc_p", " Protons pion", kTH2F, {axisPt_pid, axisTPCNsigma}); histos.add("QAafter/Proton/h2d_Prka_nsigma_tpc_p", " Protons kaon", kTH2F, {axisPt_pid, axisTPCNsigma}); - histos.add("QAafter/Proton/h2d_Prel_nsigma_tpc_p", " Protons electron", kTH2F, {axisPt_pid, axisTPCNsigma}); histos.add("QAafter/Proton/h2d_pr_nsigma_tpc_p", " Protons", kTH2F, {axisP_pid, axisTPCNsigma}); histos.add("QAafter/Proton/h2d_pr_nsigma_tof_pt", " Protons", kTH2F, {axisPt_pid, axisTOFNsigma}); histos.add("QAafter/Proton/h2d_pr_nsigma_tof_p", " Protons", kTH2F, {axisP_pid, axisTOFNsigma}); histos.add("QAafter/Proton/h2d_Prpi_nsigma_tof_p", " Protons pion", kTH2F, {axisP_pid, axisTOFNsigma}); histos.add("QAafter/Proton/h2d_Prka_nsigma_tof_p", " Protons kaon", kTH2F, {axisP_pid, axisTOFNsigma}); - histos.add("QAafter/Proton/h2d_Prel_nsigma_tof_p", " Protons electron", kTH2F, {axisP_pid, axisTOFNsigma}); histos.add("QAafter/Proton/h2d_pr_nsigma_tof_vs_tpc", "n#sigma(TOF) vs n#sigma(TPC) Protons", kTH2F, {axisTPCNsigma, axisTOFNsigma}); histos.add("QAafter/Kaon/hd_ka_pt", "p_{T}-spectra Kaons", kTH2F, {axisPt_pid, axisCent}); histos.add("QAafter/Kaon/h2d_ka_dca_z", "dca_{z} Kaons", kTH2F, {axisPt_pid, axisDCAz}); @@ -162,14 +158,12 @@ struct lambdaAnalysis_pb { histos.add("QAafter/Kaon/h2d_ka_dEdx_p", "TPC Signal Kaon", kTH2F, {axisP_pid, axisdEdx}); histos.add("QAafter/Kaon/h2d_Kapi_nsigma_tpc_p", " Kaons pion", kTH2F, {axisPt_pid, axisTPCNsigma}); histos.add("QAafter/Kaon/h2d_Kapr_nsigma_tpc_p", " Kaons proton", kTH2F, {axisP_pid, axisTPCNsigma}); - histos.add("QAafter/Kaon/h2d_Kael_nsigma_tpc_p", " Kaons electron", kTH2F, {axisP_pid, axisTPCNsigma}); histos.add("QAafter/Kaon/h2d_ka_nsigma_tpc_pt", " Kaons", kTH2F, {axisPt_pid, axisTPCNsigma}); histos.add("QAafter/Kaon/h2d_ka_nsigma_tpc_p", " Kaons", kTH2F, {axisP_pid, axisTPCNsigma}); histos.add("QAafter/Kaon/h2d_ka_nsigma_tof_pt", " Kaons", kTH2F, {axisPt_pid, axisTOFNsigma}); histos.add("QAafter/Kaon/h2d_ka_nsigma_tof_p", " Kaons", kTH2F, {axisP_pid, axisTOFNsigma}); histos.add("QAafter/Kaon/h2d_Kapi_nsigma_tof_p", " Kaons pion", kTH2F, {axisP_pid, axisTOFNsigma}); histos.add("QAafter/Kaon/h2d_Kapr_nsigma_tof_p", " Kaons proton", kTH2F, {axisP_pid, axisTOFNsigma}); - histos.add("QAafter/Kaon/h2d_Kael_nsigma_tof_p", " Kaons electron", kTH2F, {axisP_pid, axisTOFNsigma}); histos.add("QAafter/Kaon/h2d_ka_nsigma_tof_vs_tpc", "n#sigma(TOF) vs n#sigma(TPC) Kaons", kTH2F, {axisTPCNsigma, axisTOFNsigma}); // Analysis @@ -242,16 +236,13 @@ struct lambdaAnalysis_pb { float tpcNsigmaPi = std::abs(candidate.tpcNSigmaPi()); float tpcNsigmaKa = std::abs(candidate.tpcNSigmaKa()); float tpcNsigmaPr = std::abs(candidate.tpcNSigmaPr()); - float tpcNsigmaEl = std::abs(candidate.tpcNSigmaEl()); float tofNsigmaPi = std::abs(candidate.tofNSigmaPi()); float tofNsigmaKa = std::abs(candidate.tofNSigmaKa()); float tofNsigmaPr = std::abs(candidate.tofNSigmaPr()); - float tofNsigmaEl = std::abs(candidate.tofNSigmaEl()); float tpcTofNsigmaPi = tpcNsigmaPi * tpcNsigmaPi + tofNsigmaPi * tofNsigmaPi; float tpcTofNsigmaKa = tpcNsigmaKa * tpcNsigmaKa + tofNsigmaKa * tofNsigmaKa; float tpcTofNsigmaPr = tpcNsigmaPr * tpcNsigmaPr + tofNsigmaPr * tofNsigmaPr; - float tpcTofNsigmaEl = tpcNsigmaEl * tpcNsigmaEl + tofNsigmaEl * tofNsigmaEl; float combinedCut = nsigmaCutCombinedProton * nsigmaCutCombinedProton; float combinedRejCut = cRejNsigmaTof * cRejNsigmaTpc; @@ -261,17 +252,17 @@ struct lambdaAnalysis_pb { if (nsigmaCutCombinedProton < 0 && p >= cPMin) { for (int i = 0; i < nitrtof - 1; ++i) { - if (p >= tofPIDp[i] && p < tofPIDp[i + 1] && (tofNsigmaPr < tofPIDcut[i] && tofNsigmaPi > cRejNsigmaTof && tofNsigmaKa > cRejNsigmaTof && tofNsigmaEl > cRejNsigmaTof)) + if (p >= tofPIDp[i] && p < tofPIDp[i + 1] && (tofNsigmaPr < tofPIDcut[i] && tofNsigmaPi > cRejNsigmaTof && tofNsigmaKa > cRejNsigmaTof)) tofPIDPassed = true; } if (candidate.tpcNSigmaPr() < minnsigmatpctofPr) return false; - if (tpcNsigmaPr < cMaxTPCnSigmaProton && tpcNsigmaPi > cRejNsigmaTpcVeto && tpcNsigmaKa > cRejNsigmaTpcVeto && tpcNsigmaEl > cRejNsigmaTpcVeto) + if (tpcNsigmaPr < cMaxTPCnSigmaProton && tpcNsigmaPi > cRejNsigmaTpcVeto && tpcNsigmaKa > cRejNsigmaTpcVeto) tpcPIDPassed = true; } // circular cut - if ((nsigmaCutCombinedProton > 0) && p >= cPMin && (tpcTofNsigmaPr < combinedCut && tpcTofNsigmaPi > combinedRejCut && tpcTofNsigmaKa > combinedRejCut && tpcTofNsigmaEl > combinedRejCut)) { + if ((nsigmaCutCombinedProton > 0) && p >= cPMin && (tpcTofNsigmaPr < combinedCut && tpcTofNsigmaPi > combinedRejCut && tpcTofNsigmaKa > combinedRejCut)) { tofPIDPassed = true; tpcPIDPassed = true; } @@ -286,7 +277,7 @@ struct lambdaAnalysis_pb { if (candidate.tpcNSigmaPr() < minnsigmatpcPr) return false; for (int i = 0; i < nitr - 1; ++i) { - if (p >= tpcPIDp[i] && p < tpcPIDp[i + 1] && (tpcNsigmaPr < tpcPIDcut[i] && tpcNsigmaPi > cRejNsigmaTpcPi && tpcNsigmaKa > cRejNsigmaTpcKa && tpcNsigmaEl > cRejNsigmaTpcEl)) { + if (p >= tpcPIDp[i] && p < tpcPIDp[i + 1] && (tpcNsigmaPr < tpcPIDcut[i] && tpcNsigmaPi > cRejNsigmaTpcPi && tpcNsigmaKa > cRejNsigmaTpcKa)) { tpcPIDPassed = true; } } @@ -310,16 +301,13 @@ struct lambdaAnalysis_pb { float tpcNsigmaPi = std::abs(candidate.tpcNSigmaPi()); float tpcNsigmaKa = std::abs(candidate.tpcNSigmaKa()); float tpcNsigmaPr = std::abs(candidate.tpcNSigmaPr()); - float tpcNsigmaEl = std::abs(candidate.tpcNSigmaEl()); float tofNsigmaPi = std::abs(candidate.tofNSigmaPi()); float tofNsigmaKa = std::abs(candidate.tofNSigmaKa()); float tofNsigmaPr = std::abs(candidate.tofNSigmaPr()); - float tofNsigmaEl = std::abs(candidate.tofNSigmaEl()); float tpcTofNsigmaPi = tpcNsigmaPi * tpcNsigmaPi + tofNsigmaPi * tofNsigmaPi; float tpcTofNsigmaKa = tpcNsigmaKa * tpcNsigmaKa + tofNsigmaKa * tofNsigmaKa; float tpcTofNsigmaPr = tpcNsigmaPr * tpcNsigmaPr + tofNsigmaPr * tofNsigmaPr; - float tpcTofNsigmaEl = tpcNsigmaEl * tpcNsigmaEl + tofNsigmaEl * tofNsigmaEl; float combinedCut = nsigmaCutCombinedKaon * nsigmaCutCombinedKaon; float combinedRejCut = cRejNsigmaTpc * cRejNsigmaTof; @@ -329,17 +317,17 @@ struct lambdaAnalysis_pb { if (nsigmaCutCombinedKaon < 0 && p >= cPMin) { for (int i = 0; i < nitrtof - 1; ++i) { - if (p >= tofPIDp[i] && p < tofPIDp[i + 1] && (tofNsigmaKa < tofPIDcut[i] && tofNsigmaPi > cRejNsigmaTof && tofNsigmaPr > cRejNsigmaTof && tofNsigmaEl > cRejNsigmaTof)) + if (p >= tofPIDp[i] && p < tofPIDp[i + 1] && (tofNsigmaKa < tofPIDcut[i] && tofNsigmaPi > cRejNsigmaTof && tofNsigmaPr > cRejNsigmaTof)) tofPIDPassed = true; } if (candidate.tpcNSigmaKa() < minnsigmatpctofKa) return false; - if (tpcNsigmaKa < cMaxTPCnSigmaKaon && tpcNsigmaPi > cRejNsigmaTpcVeto && tpcNsigmaPr > cRejNsigmaTpcVeto && tpcNsigmaEl > cRejNsigmaTpcVeto) + if (tpcNsigmaKa < cMaxTPCnSigmaKaon && tpcNsigmaPi > cRejNsigmaTpcVeto && tpcNsigmaPr > cRejNsigmaTpcVeto) tpcPIDPassed = true; } // circular - if ((nsigmaCutCombinedKaon > 0) && p >= cPMin && (tpcTofNsigmaKa < combinedCut && tpcTofNsigmaPi > combinedRejCut && tpcTofNsigmaPr > combinedRejCut && tpcTofNsigmaEl > combinedRejCut)) { + if ((nsigmaCutCombinedKaon > 0) && p >= cPMin && (tpcTofNsigmaKa < combinedCut && tpcTofNsigmaPi > combinedRejCut && tpcTofNsigmaPr > combinedRejCut)) { tofPIDPassed = true; tpcPIDPassed = true; } @@ -355,7 +343,7 @@ struct lambdaAnalysis_pb { if (candidate.tpcNSigmaKa() < minnsigmatpcKa) return false; for (int i = 0; i < nitr - 1; ++i) { - if (p >= tpcPIDp[i] && p < tpcPIDp[i + 1] && (tpcNsigmaKa < tpcPIDcut[i] && tpcNsigmaPi > cRejNsigmakTpcPi && tpcNsigmaPr > cRejNsigmakTpcPr && tpcNsigmaEl > cRejNsigmakTpcEl)) { + if (p >= tpcPIDp[i] && p < tpcPIDp[i + 1] && (tpcNsigmaKa < tpcPIDcut[i] && tpcNsigmaPi > cRejNsigmakTpcPi && tpcNsigmaPr > cRejNsigmakTpcPr)) { tpcPIDPassed = true; } } @@ -399,7 +387,6 @@ struct lambdaAnalysis_pb { auto _tpcnsigmaPr = trkPr.tpcNSigmaPr(); histos.fill(HIST("QAbefore/Proton/h2d_pr_nsigma_tpc_p"), p_ptot, _tpcnsigmaPr); - // histos.fill(HIST("QAbefore/Proton/h2d_prel_nsigma_tpc_p"), p_ptot, trkPr.tpcNSigmaEl()); if (trkPr.hasTOF()) { auto _tofnsigmaPr = trkPr.tofNSigmaPr(); histos.fill(HIST("QAbefore/Proton/h2d_pr_nsigma_tof_p"), p_ptot, _tofnsigmaPr); @@ -436,7 +423,6 @@ struct lambdaAnalysis_pb { histos.fill(HIST("QAafter/Proton/h2d_pr_dEdx_p"), p_ptot, trkPr.tpcSignal()); histos.fill(HIST("QAafter/Proton/h2d_Prpi_nsigma_tpc_p"), p_ptot, trkPr.tpcNSigmaPi()); histos.fill(HIST("QAafter/Proton/h2d_Prka_nsigma_tpc_p"), p_ptot, trkPr.tpcNSigmaKa()); - histos.fill(HIST("QAafter/Proton/h2d_Prel_nsigma_tpc_p"), p_ptot, trkPr.tpcNSigmaEl()); histos.fill(HIST("QAafter/Proton/h2d_pr_nsigma_tpc_p"), p_ptot, _tpcnsigmaPr); histos.fill(HIST("QAafter/Proton/h2d_pr_nsigma_tpc_pt"), _ptPr, _tpcnsigmaPr); if (!cUseTpcOnly && trkPr.hasTOF()) { @@ -445,7 +431,6 @@ struct lambdaAnalysis_pb { histos.fill(HIST("QAafter/Proton/h2d_pr_nsigma_tof_pt"), _ptPr, _tofnsigmaPr); histos.fill(HIST("QAafter/Proton/h2d_Prpi_nsigma_tof_p"), p_ptot, trkPr.tofNSigmaPi()); histos.fill(HIST("QAafter/Proton/h2d_Prka_nsigma_tof_p"), p_ptot, trkPr.tofNSigmaKa()); - histos.fill(HIST("QAafter/Proton/h2d_Prel_nsigma_tof_p"), p_ptot, trkPr.tofNSigmaEl()); histos.fill(HIST("QAafter/Proton/h2d_pr_nsigma_tof_vs_tpc"), _tpcnsigmaPr, _tofnsigmaPr); } auto _ptKa = trkKa.pt(); @@ -458,7 +443,6 @@ struct lambdaAnalysis_pb { histos.fill(HIST("QAafter/Kaon/h2d_ka_dEdx_p"), k_ptot, trkKa.tpcSignal()); histos.fill(HIST("QAafter/Kaon/h2d_Kapi_nsigma_tpc_p"), k_ptot, trkKa.tpcNSigmaPi()); histos.fill(HIST("QAafter/Kaon/h2d_Kapr_nsigma_tpc_p"), k_ptot, trkKa.tpcNSigmaPr()); - histos.fill(HIST("QAafter/Kaon/h2d_Kael_nsigma_tpc_p"), k_ptot, trkKa.tpcNSigmaEl()); histos.fill(HIST("QAafter/Kaon/h2d_ka_nsigma_tpc_p"), k_ptot, _tpcnsigmaKa); histos.fill(HIST("QAafter/Kaon/h2d_ka_nsigma_tpc_pt"), _ptKa, _tpcnsigmaKa); if (!cUseTpcOnly && trkKa.hasTOF()) { @@ -467,7 +451,6 @@ struct lambdaAnalysis_pb { histos.fill(HIST("QAafter/Kaon/h2d_ka_nsigma_tof_pt"), _ptKa, _tofnsigmaKa); histos.fill(HIST("QAafter/Kaon/h2d_Kapi_nsigma_tof_p"), k_ptot, trkKa.tofNSigmaPi()); histos.fill(HIST("QAafter/Kaon/h2d_Kapr_nsigma_tof_p"), k_ptot, trkKa.tofNSigmaPr()); - histos.fill(HIST("QAafter/Kaon/h2d_Kael_nsigma_tof_p"), k_ptot, trkKa.tofNSigmaEl()); histos.fill(HIST("QAafter/Kaon/h2d_ka_nsigma_tof_vs_tpc"), _tpcnsigmaKa, _tofnsigmaKa); } } diff --git a/PWGLF/Tasks/Resonances/lambda1520analysis.cxx b/PWGLF/Tasks/Resonances/lambda1520analysis.cxx index 0d9ec896036..22645dcf998 100644 --- a/PWGLF/Tasks/Resonances/lambda1520analysis.cxx +++ b/PWGLF/Tasks/Resonances/lambda1520analysis.cxx @@ -51,11 +51,7 @@ struct Lambda1520analysis { // Pre-selection Track cuts Configurable cMinPtcut{"cMinPtcut", 0.15f, "Minimal pT for tracks"}; - Configurable cfgRatioTPCRowsOverFindableCls{"cfgRatioTPCRowsOverFindableCls", 0.8f, "minimum ratio of number of Xrows to findable clusters in TPC"}; - Configurable cMaxChi2ITScut{"cMaxChi2ITScut", 36.0f, "Maximal pT for Chi2/cluster for ITS"}; - Configurable cMaxChi2TPCcut{"cMaxChi2TPCcut", 4.0f, "Maximal pT for Chi2/cluster for TPC"}; Configurable cMinTPCNClsFound{"cMinTPCNClsFound", 120, "minimum TPCNClsFound value for good track"}; - Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; Configurable cMinTPCncr{"cMinTPCncr", 70, "Minimum number of TPC X rows"}; // DCA Selections @@ -69,8 +65,6 @@ struct Lambda1520analysis { Configurable cfgGlobalWoDCATrack{"cfgGlobalWoDCATrack", true, "Global track selection without DCA"}; // kQualityTracks (kTrackType | kTPCNCls | kTPCCrossedRows | kTPCCrossedRowsOverNCls | kTPCChi2NDF | kTPCRefit | kITSNCls | kITSChi2NDF | kITSRefit | kITSHits) | kInAcceptanceTracks (kPtRange | kEtaRange) Configurable cfgGlobalTrack{"cfgGlobalTrack", false, "Global track selection"}; // kGoldenChi2 | kDCAxy | kDCAz Configurable cfgPVContributor{"cfgPVContributor", false, "PV contributor track selection"}; // PV Contriuibutor - Configurable cfgHasITS{"cfgHasITS", false, "Require ITS"}; - Configurable cfgHasTPC{"cfgHasTPC", false, "Require TPC"}; Configurable cfgHasTOF{"cfgHasTOF", false, "Require TOF"}; Configurable cfgUseTPCRefit{"cfgUseTPCRefit", false, "Require TPC Refit"}; Configurable cfgUseITSRefit{"cfgUseITSRefit", false, "Require ITS Refit"}; @@ -359,20 +353,8 @@ struct Lambda1520analysis { } if (std::abs(track.dcaZ()) > cMaxDCAzToPVcut) return false; - if (track.itsNCls() < cfgITScluster) - return false; if (cTPCNClsFound && (track.tpcNClsFound() < cMinTPCNClsFound)) return false; - if (track.tpcCrossedRowsOverFindableCls() < cfgRatioTPCRowsOverFindableCls) - return false; - if (track.itsChi2NCl() > cMaxChi2ITScut) - return false; - if (track.tpcChi2NCl() > cMaxChi2TPCcut) - return false; - if (cfgHasITS && !track.hasITS()) - return false; - if (cfgHasTPC && !track.hasTPC()) - return false; if (cfgHasTOF && !track.hasTOF()) return false; if (cfgPrimaryTrack && !track.isPrimaryTrack()) diff --git a/PWGLF/Tasks/Resonances/phianalysis.cxx b/PWGLF/Tasks/Resonances/phianalysis.cxx index 57d4d24fad6..b529cc1fb81 100644 --- a/PWGLF/Tasks/Resonances/phianalysis.cxx +++ b/PWGLF/Tasks/Resonances/phianalysis.cxx @@ -66,8 +66,6 @@ struct phianalysis { Configurable cUseOnlyTOFTrackKa{"cUseOnlyTOFTrackKa", false, "Use only TOF track for PID selection"}; // Use only TOF track for PID selection /// TPC nCluster cut Configurable cMinTPCNclsFound{"cMinTPCNclsFound", 70, "Minimum TPC cluster found"}; - /// ITS nCluster cut - Configurable cMinITSNcls{"cMinITSNcls", 0, "Minimum ITS nCluster"}; // Kaon Configurable cMaxTPCnSigmaKaon{"cMaxTPCnSigmaKaon", 3.0, "TPC nSigma cut for Kaon"}; // TPC Configurable cMaxTOFnSigmaKaon{"cMaxTOFnSigmaKaon", 3.0, "TOF nSigma cut for Kaon"}; // TOF @@ -142,8 +140,6 @@ struct phianalysis { return false; if (track.tpcNClsFound() < cMinTPCNclsFound) return false; - if (track.itsNCls() < cMinITSNcls) - return false; if (cfgPrimaryTrack && !track.isPrimaryTrack()) return false; if (cfgGlobalWoDCATrack && !track.isGlobalTrackWoDCA()) diff --git a/PWGLF/Tasks/Resonances/rho770analysis.cxx b/PWGLF/Tasks/Resonances/rho770analysis.cxx index 607e20e9c51..ddda2ad25ac 100644 --- a/PWGLF/Tasks/Resonances/rho770analysis.cxx +++ b/PWGLF/Tasks/Resonances/rho770analysis.cxx @@ -61,15 +61,9 @@ struct rho770analysis { // kEtaRange) Configurable cfgPVContributor{"cfgPVContributor", true, "PV contributor track selection"}; // PV Contriuibutor Configurable cfgGlobalTrack{"cfgGlobalTrack", false, "Global track selection"}; // kGoldenChi2 | kDCAxy | kDCAz - Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; Configurable cfgTPCcluster{"cfgTPCcluster", 0, "Number of TPC cluster"}; - Configurable cfgRatioTPCRowsOverFindableCls{"cfgRatioTPCRowsOverFindableCls", 0.0f, "TPC Crossed Rows to Findable Clusters"}; - Configurable cfgITSChi2NCl{"cfgITSChi2NCl", 999.0, "ITS Chi2/NCl"}; - Configurable cfgTPCChi2NCl{"cfgTPCChi2NCl", 999.0, "TPC Chi2/NCl"}; Configurable cfgUseTPCRefit{"cfgUseTPCRefit", false, "Require TPC Refit"}; Configurable cfgUseITSRefit{"cfgUseITSRefit", false, "Require ITS Refit"}; - Configurable cfgHasITS{"cfgHasITS", false, "Require ITS"}; - Configurable cfgHasTPC{"cfgHasTPC", false, "Require TPC"}; Configurable cfgHasTOF{"cfgHasTOF", false, "Require TOF"}; // PID @@ -134,20 +128,8 @@ struct rho770analysis { return false; if (std::abs(track.dcaZ()) > cfgMaxDCAzToPVcut) return false; - if (track.itsNCls() < cfgITScluster) - return false; if (track.tpcNClsFound() < cfgTPCcluster) return false; - if (track.tpcCrossedRowsOverFindableCls() < cfgRatioTPCRowsOverFindableCls) - return false; - if (track.itsChi2NCl() >= cfgITSChi2NCl) - return false; - if (track.tpcChi2NCl() >= cfgTPCChi2NCl) - return false; - if (cfgHasITS && !track.hasITS()) - return false; - if (cfgHasTPC && !track.hasTPC()) - return false; if (cfgHasTOF && !track.hasTOF()) return false; if (cfgUseITSRefit && !track.passedITSRefit()) diff --git a/PWGLF/Tasks/Resonances/xi1530Analysisqa.cxx b/PWGLF/Tasks/Resonances/xi1530Analysisqa.cxx index 0e90a84101e..c4d69a8b3e5 100644 --- a/PWGLF/Tasks/Resonances/xi1530Analysisqa.cxx +++ b/PWGLF/Tasks/Resonances/xi1530Analysisqa.cxx @@ -106,20 +106,13 @@ struct xi1530analysisqa { Configurable tof_at_high_pt{"tof_at_high_pt", false, "Use TOF at high pT"}; - Configurable cfgITScluster{"cfgITScluster", 1, "Minimum Number of ITS cluster"}; // Minmimum Configurable cfgTPCcluster{"cfgTPCcluster", 1, "Minimum Number of TPC cluster"}; // Minmimum Configurable cfgTPCRows{"cfgTPCRows", 70, "Minimum Number of TPC Crossed Rows "}; - Configurable cfgRatioTPCRowsOverFindableCls{"cfgRatioTPCRowsOverFindableCls", 0.8, "Minimum of TPC Crossed Rows to Findable Clusters"}; // Minmimum - - Configurable cfgITSChi2NCl{"cfgITSChi2NCl", 4.0, "Maximum ITS Chi2/NCl"}; // Maximum - Configurable cfgTPCChi2NCl{"cfgTPCChi2NCl", 4.0, "Maximum TPC Chi2/NCl"}; // Maximum Configurable cfgUseTPCRefit{"cfgUseTPCRefit", false, "Require TPC Refit"}; Configurable cfgUseITSRefit{"cfgUseITSRefit", false, "Require ITS Refit"}; - Configurable cfgHasITS{"cfgHasITS", true, "Require ITS"}; - Configurable cfgHasTPC{"cfgHasTPC", true, "Require TPC"}; Configurable cfgHasTOF{"cfgHasTOF", false, "Require TOF"}; //*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*// @@ -404,22 +397,10 @@ struct xi1530analysisqa { return false; if (std::abs(track.dcaZ()) > cMaxDCAzToPVcut) return false; - if (track.itsNCls() < cfgITScluster) - return false; if (track.tpcNClsFound() < cfgTPCcluster) return false; if (track.tpcNClsCrossedRows() < cfgTPCRows) return false; - if (track.tpcCrossedRowsOverFindableCls() < cfgRatioTPCRowsOverFindableCls) - return false; - if (track.itsChi2NCl() >= cfgITSChi2NCl) - return false; - if (track.tpcChi2NCl() >= cfgTPCChi2NCl) - return false; - if (cfgHasITS && !track.hasITS()) - return false; - if (cfgHasTPC && !track.hasTPC()) - return false; if (cfgHasTOF && !track.hasTOF()) return false; if (cfgUseITSRefit && !track.passedITSRefit()) From 1659f4dc73fedcd8451aa830e911622c3724c7d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Tue, 4 Mar 2025 19:47:44 +0100 Subject: [PATCH 0534/1650] [Common] TOF: allow non existing CCDB time shift objects (#10262) --- Common/Core/PID/PIDTOF.cxx | 58 ++++++++++++++++++++++++ Common/Core/PID/PIDTOF.h | 56 ++--------------------- Common/TableProducer/PID/pidTOFMerge.cxx | 4 ++ 3 files changed, 66 insertions(+), 52 deletions(-) diff --git a/Common/Core/PID/PIDTOF.cxx b/Common/Core/PID/PIDTOF.cxx index 091aa31c7d6..bec41fafc43 100644 --- a/Common/Core/PID/PIDTOF.cxx +++ b/Common/Core/PID/PIDTOF.cxx @@ -43,4 +43,62 @@ void TOFResoParamsV3::setResolutionParametrizationRun2(std::unordered_map const& pars, const bool positive) +{ + std::string baseOpt = positive ? "TimeShift.Pos." : "TimeShift.Neg."; + + if (pars.count(baseOpt + "GetN") == 0) { // If the map does not contain the number of eta bins, we assume that no correction has to be applied + return; + } + const int nPoints = static_cast(pars.at(baseOpt + "GetN")); + if (nPoints <= 0) { + LOG(fatal) << "TOFResoParamsV3 shift: time must be positive"; + } + TGraph graph; + for (int i = 0; i < nPoints; ++i) { + graph.AddPoint(pars.at(Form("TimeShift.eta%i", i)), pars.at(Form("TimeShift.cor%i", i))); + } + setTimeShiftParameters(&graph, positive); +} +void TOFResoParamsV3::setTimeShiftParameters(std::string const& filename, std::string const& objname, const bool positive) +{ + TFile f(filename.c_str(), "READ"); + if (f.IsOpen()) { + if (positive) { + f.GetObject(objname.c_str(), gPosEtaTimeCorr); + } else { + f.GetObject(objname.c_str(), gNegEtaTimeCorr); + } + f.Close(); + } + LOG(info) << "Set the Time Shift parameters from file " << filename << " and object " << objname << " for " << (positive ? "positive" : "negative"); +} +void TOFResoParamsV3::setTimeShiftParameters(TGraph* g, const bool positive) +{ + if (!g) { + LOG(info) << "No Time Shift parameter is passed for " << (positive ? "positive" : "negative"); + return; + } + if (positive) { + gPosEtaTimeCorr = g; + } else { + gNegEtaTimeCorr = g; + } + LOG(info) << "Set the Time Shift parameters from object " << g->GetName() << " " << g->GetTitle() << " for " << (positive ? "positive" : "negative"); +} +float TOFResoParamsV3::getTimeShift(float eta, int16_t sign) const +{ + if (sign > 0) { + if (!gPosEtaTimeCorr) { + return 0.f; + } + return gPosEtaTimeCorr->Eval(eta); + } + if (!gNegEtaTimeCorr) { + return 0.f; + } + return gNegEtaTimeCorr->Eval(eta); +} + } // namespace o2::pid::tof diff --git a/Common/Core/PID/PIDTOF.h b/Common/Core/PID/PIDTOF.h index abcd49a41da..ad16716916c 100644 --- a/Common/Core/PID/PIDTOF.h +++ b/Common/Core/PID/PIDTOF.h @@ -237,58 +237,10 @@ class TOFResoParamsV3 : public o2::tof::Parameters<13> } // Time shift for post calibration to realign as a function of eta - void setTimeShiftParameters(std::unordered_map const& pars, bool positive) - { - std::string baseOpt = positive ? "TimeShift.Pos." : "TimeShift.Neg."; - - if (pars.count(baseOpt + "GetN") == 0) { // If the map does not contain the number of eta bins, we assume that no correction has to be applied - return; - } - const int nPoints = static_cast(pars.at(baseOpt + "GetN")); - if (nPoints <= 0) { - LOG(fatal) << "TOFResoParamsV3 shift: time must be positive"; - } - TGraph graph; - for (int i = 0; i < nPoints; ++i) { - graph.AddPoint(pars.at(Form("TimeShift.eta%i", i)), pars.at(Form("TimeShift.cor%i", i))); - } - setTimeShiftParameters(&graph, positive); - } - void setTimeShiftParameters(std::string const& filename, std::string const& objname, bool positive) - { - TFile f(filename.c_str(), "READ"); - if (f.IsOpen()) { - if (positive) { - f.GetObject(objname.c_str(), gPosEtaTimeCorr); - } else { - f.GetObject(objname.c_str(), gNegEtaTimeCorr); - } - f.Close(); - } - LOG(info) << "Set the Time Shift parameters from file " << filename << " and object " << objname << " for " << (positive ? "positive" : "negative"); - } - void setTimeShiftParameters(TGraph* g, bool positive) - { - if (positive) { - gPosEtaTimeCorr = g; - } else { - gNegEtaTimeCorr = g; - } - LOG(info) << "Set the Time Shift parameters from object " << g->GetName() << " " << g->GetTitle() << " for " << (positive ? "positive" : "negative"); - } - float getTimeShift(float eta, int16_t sign) const - { - if (sign > 0) { - if (!gPosEtaTimeCorr) { - return 0.f; - } - return gPosEtaTimeCorr->Eval(eta); - } - if (!gNegEtaTimeCorr) { - return 0.f; - } - return gNegEtaTimeCorr->Eval(eta); - } + void setTimeShiftParameters(std::unordered_map const& pars, const bool positive); + void setTimeShiftParameters(std::string const& filename, std::string const& objname, const bool positive); + void setTimeShiftParameters(TGraph* g, const bool positive); + float getTimeShift(float eta, int16_t sign) const; void printTimeShiftParameters() const { diff --git a/Common/TableProducer/PID/pidTOFMerge.cxx b/Common/TableProducer/PID/pidTOFMerge.cxx index 83b4546e81f..2d2fd282bfd 100644 --- a/Common/TableProducer/PID/pidTOFMerge.cxx +++ b/Common/TableProducer/PID/pidTOFMerge.cxx @@ -212,7 +212,9 @@ struct TOFCalibConfig { LOG(info) << "Initializing the time shift for " << (isPositive ? "positive" : "negative") << " from ccdb '" << nameShift << "' and timestamp " << mTimestamp << " and pass '" << mReconstructionPass << "'"; + ccdb->setFatalWhenNull(false); mRespParamsV3.setTimeShiftParameters(ccdb->template getSpecific(nameShift, mTimestamp, metadata), isPositive); + ccdb->setFatalWhenNull(true); } LOG(info) << " test getTimeShift at 0 " << (isPositive ? "pos" : "neg") << ": " << mRespParamsV3.getTimeShift(0, isPositive); @@ -302,7 +304,9 @@ struct TOFCalibConfig { LOG(info) << "Updating the time shift for " << (isPositive ? "positive" : "negative") << " from ccdb '" << nameShift << "' and timestamp " << mTimestamp << " and pass '" << mReconstructionPass << "'"; + ccdb->setFatalWhenNull(false); mRespParamsV3.setTimeShiftParameters(ccdb->template getSpecific(nameShift, mTimestamp, metadata), isPositive); + ccdb->setFatalWhenNull(true); LOG(info) << " test getTimeShift at 0 " << (isPositive ? "pos" : "neg") << ": " << mRespParamsV3.getTimeShift(0, isPositive); }; From 0bff5df284cddb2bff1b2c6d6de0a014113ec952 Mon Sep 17 00:00:00 2001 From: Zuzanna Chochulska <87480906+zchochul@users.noreply.github.com> Date: Tue, 4 Mar 2025 20:19:03 +0100 Subject: [PATCH 0535/1650] [PWGCF] FemotUniverse -- pT plots + same and mixed events for MC (#10321) Co-authored-by: Zuzanna <01150674@pw.edu.pl> --- .../Tasks/femtoUniversePairTaskTrackPhi.cxx | 379 +++++++++--------- 1 file changed, 197 insertions(+), 182 deletions(-) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx index d596aeb493e..c9b85e0cd92 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx @@ -66,6 +66,12 @@ struct FemtoUniversePairTaskTrackPhi { using FemtoRecoParticles = soa::Join; Preslice perColMC = aod::femtouniverseparticle::fdCollisionId; + Configurable ConfZVertexCut{"ConfZVertexCut", 10.f, "Event sel: Maximum z-Vertex (cm)"}; + Configurable ConfNEventsMix{"ConfNEventsMix", 5, "Number of events for mixing"}; + Filter collisionFilter = (nabs(aod::collision::posZ) < ConfZVertexCut); + using FilteredFDCollisions = soa::Filtered; + using FilteredFDCollision = FilteredFDCollisions::iterator; + Configurable ConfCPRIsEnabled{"ConfCPRIsEnabled", false, "Close Pair Rejection"}; Configurable ConfCPRPlotPerRadii{"ConfCPRPlotPerRadii", false, "Plot CPR per radii"}; Configurable ConfCPRdeltaPhiCutMax{"ConfCPRdeltaPhiCutMax", 0.0, "Delta Phi max cut for Close Pair Rejection"}; @@ -104,6 +110,11 @@ struct FemtoUniversePairTaskTrackPhi { (aod::femtouniverseparticle::pt > ConfTrackPtLow) && (aod::femtouniverseparticle::pt < ConfTrackPtHigh); + Partition partsTrackMCReco = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kTrack)) && + (aod::femtouniverseparticle::sign == ConfTrackSign) && + (aod::femtouniverseparticle::pt > ConfTrackPtLow) && + (aod::femtouniverseparticle::pt < ConfTrackPtHigh); + /// Particle 2 --- PHI MESON Configurable ConfPhiPtLow{"ConfPhiPtLow", 0.8, "Lower limit of the Phi pT."}; Configurable ConfPhiPtHigh{"ConfPhiPtHigh", 4.0, "Higher limit of the Phi pT."}; @@ -113,6 +124,10 @@ struct FemtoUniversePairTaskTrackPhi { (aod::femtouniverseparticle::pt > ConfPhiPtLow) && (aod::femtouniverseparticle::pt < ConfPhiPtHigh); + Partition partsPhiMCReco = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kPhi)) && + (aod::femtouniverseparticle::pt > ConfPhiPtLow) && + (aod::femtouniverseparticle::pt < ConfPhiPtHigh); + /// Partitions for Phi daughters kPhiChild Partition partsPhiDaugh = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kPhiChild)); Partition> partsPhiDaughMC = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kPhiChild)); @@ -146,8 +161,6 @@ struct FemtoUniversePairTaskTrackPhi { ConfigurableAxis ConfBins3DmT{"ConfBins3DmT", {VARIABLE_WIDTH, 1.02f, 1.14f, 1.20f, 1.26f, 1.38f, 1.56f, 1.86f, 4.50f}, "mT Binning for the 3Dimensional plot: k* vs multiplicity vs mT (set <> to true in order to use)"}; ConfigurableAxis ConfBins3Dmult{"ConfBins3Dmult", {VARIABLE_WIDTH, 0.0f, 20.0f, 30.0f, 40.0f, 99999.0f}, "multiplicity Binning for the 3Dimensional plot: k* vs multiplicity vs mT (set <> to true in order to use)"}; - ColumnBinningPolicy colBinning{{ConfBinsVtx, ConfBinsMult}, true}; - ConfigurableAxis ConfBinskstar{"ConfBinskstar", {1500, 0., 6.}, "binning kstar"}; ConfigurableAxis ConfBinskT{"ConfBinskT", {150, 0., 9.}, "binning kT"}; ConfigurableAxis ConfBinsmT{"ConfBinsmT", {225, 0., 7.5}, "binning mT"}; @@ -166,13 +179,11 @@ struct FemtoUniversePairTaskTrackPhi { HistogramRegistry registryMCreco{"registryMCreco", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; HistogramRegistry registryPhiMinvBackground{"registryPhiMinvBackground", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; HistogramRegistry registryDCA{"registryDCA", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; + HistogramRegistry registryMCpT{"registryMCpT", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; EfficiencyConfigurableGroup effConfGroup; EfficiencyCalculator efficiencyCalculator{&effConfGroup}; - /// @brief Counter for particle swapping - int fNeventsProcessed = 0; - bool swpart = 0; float weight = 1; // PID for protons @@ -361,6 +372,14 @@ struct FemtoUniversePairTaskTrackPhi { hMCTruth1.init(&qaRegistry, ConfBinsTempFitVarpT, ConfBinsTempFitVarPDG, false, ConfTrackPDGCode, false); hMCTruth2.init(&qaRegistry, ConfBinsTempFitVarpT, ConfBinsTempFitVarPDG, false, 333, false); hTrackDCA.init(®istryDCA, ConfBinsTempFitVarpT, ConfBinsTempFitVarDCA, true, ConfTrackPDGCode, true); + + registryMCpT.add("MCReco/C_phi_pT", "; #it{p_T} (GeV/#it{c}); Counts", kTH1F, {{100, 0, 10}}); + registryMCpT.add("MCReco/Correction_phi", "; #it{p_T} (GeV/#it{c}); Counts", kTH1F, {{100, 0, 10}}); + registryMCpT.add("MCReco/NC_phi_pT", "; #it{p_T} (GeV/#it{c}); Counts", kTH1F, {{100, 0, 10}}); + + registryMCpT.add("MCReco/C_p_pT", "; #it{p_T} (GeV/#it{c}); Counts", kTH1F, {{100, 0, 10}}); + registryMCpT.add("MCReco/Correction_p", "; #it{p_T} (GeV/#it{c}); Counts", kTH1F, {{100, 0, 10}}); + registryMCpT.add("MCReco/NC_p_pT", "; #it{p_T} (GeV/#it{c}); Counts", kTH1F, {{100, 0, 10}}); } efficiencyCalculator.init(); @@ -382,12 +401,19 @@ struct FemtoUniversePairTaskTrackPhi { registryPhiMinvBackground.add("InvariantMassKpKp", "; invariant mass K+K+; Counts", kTH1F, {{6000, 0.9, 4.0}}); registryPhiMinvBackground.add("InvariantMassKmKm", "; invariant mass K-K-; Counts", kTH1F, {{6000, 0.9, 4.0}}); - qaRegistry.add("Hadron/nSigmaTPCPr", "; #it{p} (GeV/#it{c}); n#sigma_{TPCPr}", kTH2F, {{100, 0, 10}, {200, -4.975, 5.025}}); - qaRegistry.add("Hadron/nSigmaTOFPr", "; #it{p} (GeV/#it{c}); n#sigma_{TOFPr}", kTH2F, {{100, 0, 10}, {200, -4.975, 5.025}}); - qaRegistry.add("Hadron/nSigmaTPCPi", "; #it{p} (GeV/#it{c}); n#sigma_{TPCPi}", kTH2F, {{100, 0, 10}, {200, -4.975, 5.025}}); - qaRegistry.add("Hadron/nSigmaTOFPi", "; #it{p} (GeV/#it{c}); n#sigma_{TOFPi}", kTH2F, {{100, 0, 10}, {200, -4.975, 5.025}}); - qaRegistry.add("Hadron/nSigmaTPCKa", "; #it{p} (GeV/#it{c}); n#sigma_{TPCKa}", kTH2F, {{100, 0, 10}, {200, -4.975, 5.025}}); - qaRegistry.add("Hadron/nSigmaTOFKa", "; #it{p} (GeV/#it{c}); n#sigma_{TOFKa}", kTH2F, {{100, 0, 10}, {200, -4.975, 5.025}}); + qaRegistry.add("Hadron_pos/nSigmaTPCPr", "; #it{p} (GeV/#it{c}); n#sigma_{TPCPr}", kTH2F, {{100, 0, 10}, {200, -4.975, 5.025}}); + qaRegistry.add("Hadron_pos/nSigmaTOFPr", "; #it{p} (GeV/#it{c}); n#sigma_{TOFPr}", kTH2F, {{100, 0, 10}, {200, -4.975, 5.025}}); + qaRegistry.add("Hadron_pos/nSigmaTPCPi", "; #it{p} (GeV/#it{c}); n#sigma_{TPCPi}", kTH2F, {{100, 0, 10}, {200, -4.975, 5.025}}); + qaRegistry.add("Hadron_pos/nSigmaTOFPi", "; #it{p} (GeV/#it{c}); n#sigma_{TOFPi}", kTH2F, {{100, 0, 10}, {200, -4.975, 5.025}}); + qaRegistry.add("Hadron_pos/nSigmaTPCKa", "; #it{p} (GeV/#it{c}); n#sigma_{TPCKa}", kTH2F, {{100, 0, 10}, {200, -4.975, 5.025}}); + qaRegistry.add("Hadron_pos/nSigmaTOFKa", "; #it{p} (GeV/#it{c}); n#sigma_{TOFKa}", kTH2F, {{100, 0, 10}, {200, -4.975, 5.025}}); + + qaRegistry.add("Hadron_neg/nSigmaTPCPr", "; #it{p} (GeV/#it{c}); n#sigma_{TPCPr}", kTH2F, {{100, 0, 10}, {200, -4.975, 5.025}}); + qaRegistry.add("Hadron_neg/nSigmaTOFPr", "; #it{p} (GeV/#it{c}); n#sigma_{TOFPr}", kTH2F, {{100, 0, 10}, {200, -4.975, 5.025}}); + qaRegistry.add("Hadron_neg/nSigmaTPCPi", "; #it{p} (GeV/#it{c}); n#sigma_{TPCPi}", kTH2F, {{100, 0, 10}, {200, -4.975, 5.025}}); + qaRegistry.add("Hadron_neg/nSigmaTOFPi", "; #it{p} (GeV/#it{c}); n#sigma_{TOFPi}", kTH2F, {{100, 0, 10}, {200, -4.975, 5.025}}); + qaRegistry.add("Hadron_neg/nSigmaTPCKa", "; #it{p} (GeV/#it{c}); n#sigma_{TPCKa}", kTH2F, {{100, 0, 10}, {200, -4.975, 5.025}}); + qaRegistry.add("Hadron_neg/nSigmaTOFKa", "; #it{p} (GeV/#it{c}); n#sigma_{TOFKa}", kTH2F, {{100, 0, 10}, {200, -4.975, 5.025}}); // MC truth registryMCtruth.add("MCtruthAllPositivePt", "MC truth all positive;#it{p}_{T} (GeV/c); #eta", {HistType::kTH1F, {{500, 0, 5}}}); @@ -439,94 +465,79 @@ struct FemtoUniversePairTaskTrackPhi { } } - template - void fillCollision(CollisionType col) - { - mixQaRegistry.fill(HIST("MixingQA/hSECollisionBins"), colBinning.getBin({col.posZ(), col.multNtr()})); - eventHisto.fillQA(col); - } - - /// This function processes the same event and takes care of all the histogramming - /// \todo the trivial loops over the tracks should be factored out since they will be common to all combinations of T-T, T-V0, V0-V0, ... - /// @tparam PartitionType - /// @tparam PartType - /// @tparam isMC: enables Monte Carlo truth specific histograms - /// @param groupPartsTrack partition for the first particle passed by the process function - /// @param groupPartsPhi partition for the second particle passed by the process function - /// @param parts femtoUniverseParticles table (in case of Monte Carlo joined with FemtoUniverseMCLabels) - /// @param magFieldTesla magnetic field of the collision - /// @param multCol multiplicity of the collision - template - void doSameEvent(PartitionType groupPartsTrack, PartitionType groupPartsPhi, PartitionType groupPartsPhiDaugh, PartitionType groupPartsKaons, PartType parts, float magFieldTesla, int multCol) + template + void doSameEvent(FilteredFDCollision const& col, PartType const& parts, PartitionType& groupPartsOne, PartitionType& groupPartsTwo, [[maybe_unused]] MCParticles mcParts = nullptr) { - // variables for particle swapping - swpart = fNeventsProcessed % 2; - fNeventsProcessed++; + const auto& magFieldTesla = col.magField(); + const int multCol = col.multNtr(); - /// Histogramming same event - for (auto const& phicandidate : groupPartsPhi) { - trackHistoPartPhi.fillQA(phicandidate); - } + eventHisto.fillQA(col); - float tpcNSigma; - float tofNSigma; - for (auto const& phidaugh : groupPartsPhiDaugh) { - if (phidaugh.mAntiLambda() == 1) { // workaround - tpcNSigma = trackCuts.getNsigmaTPC(phidaugh, o2::track::PID::Kaon); - tofNSigma = trackCuts.getNsigmaTOF(phidaugh, o2::track::PID::Kaon); - - qaRegistry.fill(HIST("PhiDaugh_pos/nSigmaTPC"), phidaugh.p(), tpcNSigma); - qaRegistry.fill(HIST("PhiDaugh_pos/nSigmaTOF"), phidaugh.p(), tofNSigma); - qaRegistry.fill(HIST("PhiDaugh_pos/hDCAxy"), phidaugh.p(), phidaugh.tempFitVar()); - qaRegistry.fill(HIST("PhiDaugh_pos/pt"), phidaugh.pt()); - qaRegistry.fill(HIST("PhiDaugh_pos/eta"), phidaugh.eta()); - qaRegistry.fill(HIST("PhiDaugh_pos/phi"), phidaugh.phi()); - } else if (phidaugh.mAntiLambda() == -1) { // workaround - tpcNSigma = trackCuts.getNsigmaTPC(phidaugh, o2::track::PID::Kaon); - tofNSigma = trackCuts.getNsigmaTOF(phidaugh, o2::track::PID::Kaon); - - qaRegistry.fill(HIST("PhiDaugh_neg/nSigmaTPC"), phidaugh.p(), tpcNSigma); - qaRegistry.fill(HIST("PhiDaugh_neg/nSigmaTOF"), phidaugh.p(), tofNSigma); - qaRegistry.fill(HIST("PhiDaugh_neg/pt"), phidaugh.pt()); - qaRegistry.fill(HIST("PhiDaugh_neg/eta"), phidaugh.eta()); - qaRegistry.fill(HIST("PhiDaugh_neg/phi"), phidaugh.phi()); - qaRegistry.fill(HIST("PhiDaugh_neg/hDCAxy"), phidaugh.p(), phidaugh.tempFitVar()); - } + for (auto const& phicandidate : groupPartsTwo) { + // TODO: add phi meson minv cut here + const auto& posChild = parts.iteratorAt(phicandidate.index() - 2); + float tpcNSigmaKp = trackCuts.getNsigmaTPC(posChild, o2::track::PID::Kaon); + float tofNSigmaKp = trackCuts.getNsigmaTOF(posChild, o2::track::PID::Kaon); + qaRegistry.fill(HIST("PhiDaugh_pos/nSigmaTPC"), posChild.p(), tpcNSigmaKp); + qaRegistry.fill(HIST("PhiDaugh_pos/nSigmaTOF"), posChild.p(), tofNSigmaKp); + qaRegistry.fill(HIST("PhiDaugh_pos/hDCAxy"), posChild.p(), posChild.tempFitVar()); + qaRegistry.fill(HIST("PhiDaugh_pos/pt"), posChild.pt()); + qaRegistry.fill(HIST("PhiDaugh_pos/eta"), posChild.eta()); + qaRegistry.fill(HIST("PhiDaugh_pos/phi"), posChild.phi()); + + const auto& negChild = parts.iteratorAt(phicandidate.index() - 1); + float tpcNSigmaKm = trackCuts.getNsigmaTPC(negChild, o2::track::PID::Kaon); + float tofNSigmaKm = trackCuts.getNsigmaTOF(negChild, o2::track::PID::Kaon); + qaRegistry.fill(HIST("PhiDaugh_neg/nSigmaTPC"), negChild.p(), tpcNSigmaKm); + qaRegistry.fill(HIST("PhiDaugh_neg/nSigmaTOF"), negChild.p(), tofNSigmaKm); + qaRegistry.fill(HIST("PhiDaugh_neg/pt"), negChild.pt()); + qaRegistry.fill(HIST("PhiDaugh_neg/eta"), negChild.eta()); + qaRegistry.fill(HIST("PhiDaugh_neg/phi"), negChild.phi()); + qaRegistry.fill(HIST("PhiDaugh_neg/hDCAxy"), negChild.p(), negChild.tempFitVar()); + + trackHistoPartPhi.fillQA(phicandidate); } - float tpcNSigmaPr, tofNSigmaPr, tpcNSigmaPi, tofNSigmaPi, tpcNSigmaKa, tofNSigmaKa; - for (auto const& track : groupPartsTrack) { - tpcNSigmaPi = trackCuts.getNsigmaTPC(track, o2::track::PID::Pion); - tofNSigmaPi = trackCuts.getNsigmaTOF(track, o2::track::PID::Pion); - tpcNSigmaKa = trackCuts.getNsigmaTPC(track, o2::track::PID::Kaon); - tofNSigmaKa = trackCuts.getNsigmaTOF(track, o2::track::PID::Kaon); - tpcNSigmaPr = trackCuts.getNsigmaTPC(track, o2::track::PID::Proton); - tofNSigmaPr = trackCuts.getNsigmaTOF(track, o2::track::PID::Proton); + for (auto const& track : groupPartsOne) { + float tpcNSigmaPi = trackCuts.getNsigmaTPC(track, o2::track::PID::Pion); + float tofNSigmaPi = trackCuts.getNsigmaTOF(track, o2::track::PID::Pion); + float tpcNSigmaKa = trackCuts.getNsigmaTPC(track, o2::track::PID::Kaon); + float tofNSigmaKa = trackCuts.getNsigmaTOF(track, o2::track::PID::Kaon); + float tpcNSigmaPr = trackCuts.getNsigmaTPC(track, o2::track::PID::Proton); + float tofNSigmaPr = trackCuts.getNsigmaTOF(track, o2::track::PID::Proton); if (ConfTrackIsIdentified) { if (!isParticleNSigmaAccepted(track.p(), tpcNSigmaPr, tofNSigmaPr, tpcNSigmaPi, tofNSigmaPi, tpcNSigmaKa, tofNSigmaKa)) { continue; } - } - - if (ConfTrackIsRejected) { - if (isParticleNSigmaRejected(track.p(), tpcNSigmaPr, tofNSigmaPr, tpcNSigmaPi, tofNSigmaPi, tpcNSigmaKa, tofNSigmaKa)) { - continue; + if (ConfTrackIsRejected) { + if (isParticleNSigmaRejected(track.p(), tpcNSigmaPr, tofNSigmaPr, tpcNSigmaPi, tofNSigmaPi, tpcNSigmaKa, tofNSigmaKa)) { + continue; + } } } - - trackHistoPartTrack.fillQA(track); - - qaRegistry.fill(HIST("Hadron/nSigmaTPCPi"), track.p(), tpcNSigmaPi); - qaRegistry.fill(HIST("Hadron/nSigmaTOFPi"), track.p(), tofNSigmaPi); - qaRegistry.fill(HIST("Hadron/nSigmaTPCKa"), track.p(), tpcNSigmaKa); - qaRegistry.fill(HIST("Hadron/nSigmaTOFKa"), track.p(), tofNSigmaKa); - qaRegistry.fill(HIST("Hadron/nSigmaTPCPr"), track.p(), tpcNSigmaPr); - qaRegistry.fill(HIST("Hadron/nSigmaTOFPr"), track.p(), tofNSigmaPr); + if (track.sign() > 0) { + qaRegistry.fill(HIST("Hadron_pos/nSigmaTPCPi"), track.p(), tpcNSigmaPi); + qaRegistry.fill(HIST("Hadron_pos/nSigmaTOFPi"), track.p(), tofNSigmaPi); + qaRegistry.fill(HIST("Hadron_pos/nSigmaTPCKa"), track.p(), tpcNSigmaKa); + qaRegistry.fill(HIST("Hadron_pos/nSigmaTOFKa"), track.p(), tofNSigmaKa); + qaRegistry.fill(HIST("Hadron_pos/nSigmaTPCPr"), track.p(), tpcNSigmaPr); + qaRegistry.fill(HIST("Hadron_pos/nSigmaTOFPr"), track.p(), tofNSigmaPr); + } else if (track.sign() < 0) { + qaRegistry.fill(HIST("Hadron_neg/nSigmaTPCPi"), track.p(), tpcNSigmaPi); + qaRegistry.fill(HIST("Hadron_neg/nSigmaTOFPi"), track.p(), tofNSigmaPi); + qaRegistry.fill(HIST("Hadron_neg/nSigmaTPCKa"), track.p(), tpcNSigmaKa); + qaRegistry.fill(HIST("Hadron_neg/nSigmaTOFKa"), track.p(), tofNSigmaKa); + qaRegistry.fill(HIST("Hadron_neg/nSigmaTPCPr"), track.p(), tpcNSigmaPr); + qaRegistry.fill(HIST("Hadron_neg/nSigmaTOFPr"), track.p(), tofNSigmaPr); + } + trackHistoPartTrack.fillQA(track); } /// Now build the combinations - for (auto const& [track, phicandidate] : combinations(CombinationsFullIndexPolicy(groupPartsTrack, groupPartsPhi))) { + for (auto const& [track, phicandidate] : combinations(CombinationsFullIndexPolicy(groupPartsOne, groupPartsTwo))) { + // TODO: add phi inv mass cut here + if (ConfTrackIsIdentified) { if (!isParticleNSigmaAccepted(track.p(), trackCuts.getNsigmaTPC(track, o2::track::PID::Proton), trackCuts.getNsigmaTOF(track, o2::track::PID::Proton), trackCuts.getNsigmaTPC(track, o2::track::PID::Pion), trackCuts.getNsigmaTOF(track, o2::track::PID::Pion), trackCuts.getNsigmaTPC(track, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(track, o2::track::PID::Kaon))) { continue; @@ -553,134 +564,126 @@ struct FemtoUniversePairTaskTrackPhi { weight = efficiencyCalculator.getWeight(ParticleNo::ONE, phicandidate.pt()) * efficiencyCalculator.getWeight(ParticleNo::TWO, track.pt()); - if (swpart) - sameEventCont.setPair(track, phicandidate, multCol, ConfUse3D, weight); + if constexpr (std::is_same::value) + sameEventCont.setPair(track, phicandidate, multCol, ConfUse3D, weight); else - sameEventCont.setPair(phicandidate, track, multCol, ConfUse3D, weight); - - swpart = !swpart; + sameEventCont.setPair(track, phicandidate, multCol, ConfUse3D, weight); } - // Used for better fitting of invariant mass background. - - TLorentzVector part1Vec; - TLorentzVector part2Vec; - - float mMassOne = o2::constants::physics::MassKPlus; - float mMassTwo = o2::constants::physics::MassKMinus; - - for (auto const& [kaon1, kaon2] : combinations(CombinationsStrictlyUpperIndexPolicy(groupPartsKaons, groupPartsKaons))) { - if ((kaon1.mAntiLambda() == 1) && (kaon2.mAntiLambda() == 1)) { - part1Vec.SetPtEtaPhiM(kaon1.pt(), kaon1.eta(), kaon1.phi(), mMassOne); - part2Vec.SetPtEtaPhiM(kaon2.pt(), kaon2.eta(), kaon2.phi(), mMassOne); - TLorentzVector sumVec(part1Vec); - sumVec += part2Vec; - registryPhiMinvBackground.fill(HIST("InvariantMassKpKp"), sumVec.M()); - } - if ((kaon1.mAntiLambda() == -1) && (kaon2.mAntiLambda() == -1)) { - part1Vec.SetPtEtaPhiM(kaon1.pt(), kaon1.eta(), kaon1.phi(), mMassTwo); - part2Vec.SetPtEtaPhiM(kaon2.pt(), kaon2.eta(), kaon2.phi(), mMassTwo); - - TLorentzVector sumVec(part1Vec); - sumVec += part2Vec; - registryPhiMinvBackground.fill(HIST("InvariantMassKmKm"), sumVec.M()); - } - } + // // Used for better fitting of invariant mass background. + + // TLorentzVector part1Vec; + // TLorentzVector part2Vec; + + // float mMassOne = o2::constants::physics::MassKPlus; + // float mMassTwo = o2::constants::physics::MassKMinus; + + // for (auto const& [kaon1, kaon2] : combinations(CombinationsStrictlyUpperIndexPolicy(groupPartsKaons, groupPartsKaons))) { + // if ((kaon1.mAntiLambda() == 1) && (kaon2.mAntiLambda() == 1)) { + // part1Vec.SetPtEtaPhiM(kaon1.pt(), kaon1.eta(), kaon1.phi(), mMassOne); + // part2Vec.SetPtEtaPhiM(kaon2.pt(), kaon2.eta(), kaon2.phi(), mMassOne); + // TLorentzVector sumVec(part1Vec); + // sumVec += part2Vec; + // registryPhiMinvBackground.fill(HIST("InvariantMassKpKp"), sumVec.M()); + // } + // if ((kaon1.mAntiLambda() == -1) && (kaon2.mAntiLambda() == -1)) { + // part1Vec.SetPtEtaPhiM(kaon1.pt(), kaon1.eta(), kaon1.phi(), mMassTwo); + // part2Vec.SetPtEtaPhiM(kaon2.pt(), kaon2.eta(), kaon2.phi(), mMassTwo); + + // TLorentzVector sumVec(part1Vec); + // sumVec += part2Vec; + // registryPhiMinvBackground.fill(HIST("InvariantMassKmKm"), sumVec.M()); + // } + // } } - /// process function for to call doSameEvent with Data - /// \param col subscribe to the collision table (Data) - /// \param parts subscribe to the femtoUniverseParticleTable - void processSameEvent(o2::aod::FdCollision const& col, - FilteredFemtoFullParticles const& parts) + void processSameEvent(FilteredFDCollision const& col, FilteredFemtoFullParticles const& parts) { - fillCollision(col); - auto thegroupPartsTrack = partsTrack->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); auto thegroupPartsPhi = partsPhi->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - auto thegroupPartsPhiDaugh = partsPhiDaugh->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - auto thegroupPartsKaons = partsKaons->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + // auto thegroupPartsPhiDaugh = partsPhiDaugh->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + // auto thegroupPartsKaons = partsKaons->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - doSameEvent(thegroupPartsTrack, thegroupPartsPhi, thegroupPartsPhiDaugh, thegroupPartsKaons, parts, col.magField(), col.multNtr()); + doSameEvent(col, parts, thegroupPartsTrack, thegroupPartsPhi); } PROCESS_SWITCH(FemtoUniversePairTaskTrackPhi, processSameEvent, "Enable processing same event", true); - /// This function processes the mixed event - /// \todo the trivial loops over the collisions and tracks should be factored out since they will be common to all combinations of T-T, T-V0, V0-V0, ... - /// \tparam PartitionType - /// \tparam PartType - /// \tparam isMC: enables Monte Carlo truth specific histograms - /// \param groupPartsTrack partition for the identified passed by the process function - /// \param groupPartsPhi partition for Phi meson passed by the process function - /// \param parts femtoUniverseParticles table (in case of Monte Carlo joined with FemtoUniverseMCLabels) - /// \param magFieldTesla magnetic field of the collision - /// \param multCol multiplicity of the collision - template - void doMixedEvent(PartitionType groupPartsTrack, PartitionType groupPartsPhi, PartType parts, float magFieldTesla, int multCol) + template + void doMixedEvent(FilteredFDCollisions const& cols, PartType const& parts, PartitionType& partitionPhi, PartitionType& partitionTrack, [[maybe_unused]] MCParticles mcParts = nullptr) { - // variables for particle swapping - bool swpart = fNeventsProcessed % 2; - fNeventsProcessed++; + ColumnBinningPolicy colBinning{{ConfBinsVtx, ConfBinsMult}, true}; - for (auto const& [track, phicandidate] : combinations(CombinationsFullIndexPolicy(groupPartsTrack, groupPartsPhi))) { - if (ConfTrackIsIdentified) { - if (!isParticleNSigmaAccepted(track.p(), trackCuts.getNsigmaTPC(track, o2::track::PID::Proton), trackCuts.getNsigmaTOF(track, o2::track::PID::Proton), trackCuts.getNsigmaTPC(track, o2::track::PID::Pion), trackCuts.getNsigmaTOF(track, o2::track::PID::Pion), trackCuts.getNsigmaTPC(track, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(track, o2::track::PID::Kaon))) { - continue; - } + auto mixedCollProcessFunc = [&](auto& collision1, auto& collision2) -> void { + const int multCol = collision1.multNtr(); + + auto groupPartsPhi = partitionPhi->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex(), cache); + auto groupPartsTrack = partitionTrack->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex(), cache); + + const auto& magFieldTesla1 = collision1.magField(); + const auto& magFieldTesla2 = collision2.magField(); + + if (magFieldTesla1 != magFieldTesla2) { + return; } - if (ConfTrackIsRejected) { - if (isParticleNSigmaRejected(track.p(), trackCuts.getNsigmaTPC(track, o2::track::PID::Proton), trackCuts.getNsigmaTOF(track, o2::track::PID::Proton), trackCuts.getNsigmaTPC(track, o2::track::PID::Pion), trackCuts.getNsigmaTOF(track, o2::track::PID::Pion), trackCuts.getNsigmaTPC(track, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(track, o2::track::PID::Kaon))) { - continue; + for (const auto& [phicandidate, track] : combinations(CombinationsFullIndexPolicy(groupPartsPhi, groupPartsTrack))) { + // TODO: move here phi meson mass cut + + if (ConfTrackIsIdentified) { + if (!isParticleNSigmaAccepted(track.p(), trackCuts.getNsigmaTPC(track, o2::track::PID::Proton), trackCuts.getNsigmaTOF(track, o2::track::PID::Proton), trackCuts.getNsigmaTPC(track, o2::track::PID::Pion), trackCuts.getNsigmaTOF(track, o2::track::PID::Pion), trackCuts.getNsigmaTPC(track, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(track, o2::track::PID::Kaon))) { + continue; + } + if (ConfTrackIsRejected) { + if (isParticleNSigmaRejected(track.p(), trackCuts.getNsigmaTPC(track, o2::track::PID::Proton), trackCuts.getNsigmaTOF(track, o2::track::PID::Proton), trackCuts.getNsigmaTPC(track, o2::track::PID::Pion), trackCuts.getNsigmaTOF(track, o2::track::PID::Pion), trackCuts.getNsigmaTPC(track, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(track, o2::track::PID::Kaon))) { + continue; + } + } } - } - if (ConfCPRIsEnabled) { - if (pairCloseRejection.isClosePair(track, phicandidate, parts, magFieldTesla, femto_universe_container::EventType::mixed)) { - continue; + if (ConfCPRIsEnabled) { + if (pairCloseRejection.isClosePair(track, phicandidate, parts, magFieldTesla1, femto_universe_container::EventType::mixed)) { + continue; + } } - } - weight = efficiencyCalculator.getWeight(ParticleNo::ONE, phicandidate.pt()) * efficiencyCalculator.getWeight(ParticleNo::TWO, track.pt()); + weight = efficiencyCalculator.getWeight(ParticleNo::ONE, phicandidate.pt()) * efficiencyCalculator.getWeight(ParticleNo::TWO, track.pt()); - if (swpart) - mixedEventCont.setPair(track, phicandidate, multCol, ConfUse3D, weight); - else - mixedEventCont.setPair(phicandidate, track, multCol, ConfUse3D, weight); + if constexpr (std::is_same::value) + mixedEventCont.setPair(track, phicandidate, multCol, ConfUse3D, weight); + else + mixedEventCont.setPair(track, phicandidate, multCol, ConfUse3D, weight); + } + }; - swpart = !swpart; + for (const auto& [collision1, collision2] : soa::selfCombinations(colBinning, ConfNEventsMix, -1, cols, cols)) { + mixedCollProcessFunc(collision1, collision2); + mixQaRegistry.fill(HIST("MixingQA/hMECollisionBins"), colBinning.getBin({collision1.posZ(), collision1.multNtr()})); } } - /// process function for to call doMixedEvent with Data - /// @param cols subscribe to the collisions table (Data) - /// @param parts subscribe to the femtoUniverseParticleTable - void processMixedEvent(o2::aod::FdCollisions const& cols, - FilteredFemtoFullParticles const& parts) + void processMixedEvent(FilteredFDCollisions const& cols, FilteredFemtoFullParticles const& parts) { - for (auto const& [collision1, collision2] : soa::selfCombinations(colBinning, 5, -1, cols, cols)) { - - const int multiplicityCol = collision1.multNtr(); - mixQaRegistry.fill(HIST("MixingQA/hMECollisionBins"), colBinning.getBin({collision1.posZ(), multiplicityCol})); - - auto groupPartsTrack = partsTrack->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision2.globalIndex(), cache); - auto groupPartsPhi = partsPhi->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex(), cache); - - const auto& magFieldTesla1 = collision1.magField(); - const auto& magFieldTesla2 = collision2.magField(); - - if (magFieldTesla1 != magFieldTesla2) { - continue; - } - /// \todo before mixing we should check whether both collisions contain a pair of particles! - // if (partsPhi.size() == 0 || NPart2Evt1 == 0 || NPart1Evt2 == 0 || partsTrack.size() == 0 ) continue; - - doMixedEvent(groupPartsTrack, groupPartsPhi, parts, magFieldTesla1, multiplicityCol); - } + doMixedEvent(cols, parts, partsPhi, partsTrack); } PROCESS_SWITCH(FemtoUniversePairTaskTrackPhi, processMixedEvent, "Enable processing mixed events", true); ///--------------------------------------------MC-------------------------------------------------/// + void processSameEventMCReco(FilteredFDCollision const& col, FemtoRecoParticles const& parts, aod::FdMCParticles const& mcparts) + { + auto thegroupPartsTrack = partsTrackMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + auto thegroupPartsPhi = partsPhiMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + // auto thegroupPartsPhiDaugh = partsPhiDaugh->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + // auto thegroupPartsKaons = partsKaons->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + + doSameEvent(col, parts, thegroupPartsTrack, thegroupPartsPhi, mcparts); + } + PROCESS_SWITCH(FemtoUniversePairTaskTrackPhi, processSameEventMCReco, "Enable processing same event for MC Reco", true); + + void processMixedEventMCReco(FilteredFDCollisions const& cols, FemtoRecoParticles const& parts, aod::FdMCParticles const& mcparts) + { + doMixedEvent(cols, parts, partsPhiMCReco, partsTrackMCReco, mcparts); + } + PROCESS_SWITCH(FemtoUniversePairTaskTrackPhi, processMixedEventMCReco, "Enable processing mixed events for MC Reco", false); /// This function fills MC truth particles from derived MC table void processMCTruth(aod::FDParticles const& parts) @@ -740,6 +743,18 @@ struct FemtoUniversePairTaskTrackPhi { if (mcPartId == -1) continue; // no MC particle const auto& mcpart = mcparts.iteratorAt(mcPartId); + + if (mcpart.pdgMCTruth() == ConfTrackPDGCode && (part.pt() > ConfTrackPtLow) && (part.pt() < ConfTrackPtHigh) && isParticleNSigmaAccepted(part.p(), trackCuts.getNsigmaTPC(part, o2::track::PID::Proton), trackCuts.getNsigmaTOF(part, o2::track::PID::Proton), trackCuts.getNsigmaTPC(part, o2::track::PID::Pion), trackCuts.getNsigmaTOF(part, o2::track::PID::Pion), trackCuts.getNsigmaTPC(part, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(part, o2::track::PID::Kaon))) { + registryMCpT.fill(HIST("MCReco/NC_p_pT"), part.pt()); + float weightTrack = efficiencyCalculator.getWeight(ParticleNo::TWO, part.pt()); + registryMCpT.fill(HIST("MCReco/C_p_pT"), part.pt(), weightTrack); + } + if ((mcpart.pdgMCTruth() == 333) && (part.partType() == aod::femtouniverseparticle::ParticleType::kPhi) && (part.pt() > ConfPhiPtLow) && (part.pt() < ConfPhiPtHigh)) { + registryMCpT.fill(HIST("MCReco/NC_phi_pT"), part.pt()); + float weightPhi = efficiencyCalculator.getWeight(ParticleNo::ONE, part.pt()); + registryMCpT.fill(HIST("MCReco/C_phi_pT"), part.pt(), weightPhi); + } + if (isParticleNSigmaAccepted(part.p(), trackCuts.getNsigmaTPC(part, o2::track::PID::Proton), trackCuts.getNsigmaTOF(part, o2::track::PID::Proton), trackCuts.getNsigmaTPC(part, o2::track::PID::Pion), trackCuts.getNsigmaTOF(part, o2::track::PID::Pion), trackCuts.getNsigmaTPC(part, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(part, o2::track::PID::Kaon))) hTrackDCA.fillQA(part); if ((part.partType() == aod::femtouniverseparticle::ParticleType::kPhi) && (mcpart.pdgMCTruth() == 333) && (mcpart.partOriginMCTruth() == aod::femtouniverse_mc_particle::ParticleOriginMCTruth::kPrimary)) { From f2e70118aba24903dffd5b0751764bc1c3b9feeb Mon Sep 17 00:00:00 2001 From: bghanley1995 Date: Tue, 4 Mar 2025 14:24:43 -0500 Subject: [PATCH 0536/1650] [PWGCF] IdentifiedBfFilter: Added histograms for calculating efficiencies (#10316) Co-authored-by: ALICE Action Bot --- .../TableProducer/identifiedBfFilter.cxx | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx b/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx index dae2decf997..673dc11760f 100644 --- a/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx +++ b/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx @@ -99,6 +99,9 @@ TH1F* fhPtNegA[kIdBfNoOfSpecies + 1] = {nullptr}; TH2F* fhNPosNegA[kIdBfNoOfSpecies + 1] = {nullptr}; TH1F* fhDeltaNA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH2F* fhPtEtaPosA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH2F* fhPtEtaNegA[kIdBfNoOfSpecies + 1] = {nullptr}; + TH1I* fhNClustersB = nullptr; TH2F* fhPhiYB = nullptr; TH2F* fhPtYB = nullptr; @@ -167,6 +170,9 @@ TH1F* fhTruePtNegA[kIdBfNoOfSpecies + 1] = {nullptr}; TH2F* fhTrueNPosNegA[kIdBfNoOfSpecies + 1] = {nullptr}; TH1F* fhTrueDeltaNA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH2F* fhTruePtEtaPosA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH2F* fhTruePtEtaNegA[kIdBfNoOfSpecies + 1] = {nullptr}; + TH2F* fhTruePhiYB = nullptr; TH2F* fhTruePtYB = nullptr; @@ -854,6 +860,14 @@ struct IdentifiedBfFilterTracks { fhPtNegA[sp] = new TH1F(TString::Format("fHistPtNegA_%s", speciesName[sp]), TString::Format("P_{T} distribution for reconstructed %s^{#minus};P_{T} (GeV/c);dN/dP_{T} (c/GeV)", speciesTitle[sp]).Data(), ptbins, ptlow, ptup); + fhPtEtaPosA[sp] = new TH2F(TString::Format("fHistPtEtaPosA_%s", speciesName[sp]), + TString::Format("P_{T} vs #eta distribution for reconstructed %s^{#plus};P_{T} (GeV/c);#eta;dN/dP_{T} (c/GeV)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup, + etabins, etalow, etaup); + fhPtEtaNegA[sp] = new TH2F(TString::Format("fHistPtEtaNegA_%s", speciesName[sp]), + TString::Format("P_{T} vs #eta distribution for reconstructed %s^{#minus};P_{T} (GeV/c);#eta;dN/dP_{T} (c/GeV)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup, + etabins, etalow, etaup); fhNPosNegA[sp] = new TH2F(TString::Format("fhNPosNegA_%s", speciesName[sp]).Data(), TString::Format("N(%s^{#plus}) N(%s^{#minus}) distribution for reconstructed;N(%s^{#plus});N(%s^{#minus})", speciesTitle[sp], speciesTitle[sp], speciesTitle[sp], speciesTitle[sp]).Data(), 40, -0.5, 39.5, 40, -0.5, 39.5); @@ -929,6 +943,8 @@ struct IdentifiedBfFilterTracks { fOutputList->Add(fhPtA[sp]); fOutputList->Add(fhPtPosA[sp]); fOutputList->Add(fhPtNegA[sp]); + fOutputList->Add(fhPtEtaPosA[sp]); + fOutputList->Add(fhPtEtaNegA[sp]); fOutputList->Add(fhNPosNegA[sp]); fOutputList->Add(fhDeltaNA[sp]); fOutputList->Add(fhdEdxA[sp]); @@ -984,6 +1000,14 @@ struct IdentifiedBfFilterTracks { fhTruePtNegA[sp] = new TH1F(TString::Format("fTrueHistPtNegA_%s", speciesName[sp]), TString::Format("P_{T} distribution %s^{#minus} (truth);P_{T} (GeV/c);dN/dP_{T} (c/GeV)", speciesTitle[sp]).Data(), ptbins, ptlow, ptup); + fhTruePtEtaPosA[sp] = new TH2F(TString::Format("fTrueHistPtEtaPosA_%s", speciesName[sp]), + TString::Format("P_{T} vs #eta distribution %s^{#plus} (truth);P_{T} (GeV/c);#eta;dN/dP_{T} (c/GeV)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup, + etabins, etalow, etaup); + fhTruePtEtaNegA[sp] = new TH2F(TString::Format("fTrueHistPtEtaNegA_%s", speciesName[sp]), + TString::Format("P_{T} vs #eta distribution %s^{#minus} (truth);P_{T} (GeV/c);#eta;dN/dP_{T} (c/GeV)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup, + etabins, etalow, etaup); fhTrueNPosNegA[sp] = new TH2F(TString::Format("fhTrueNPosNegA_%s", speciesName[sp]).Data(), TString::Format("N(%s^{#plus}) N(%s^{#minus}) distribution (truth);N(%s^{#plus});N(%s^{#minus})", speciesTitle[sp], speciesTitle[sp], speciesTitle[sp], speciesTitle[sp]).Data(), 40, -0.5, 39.5, 40, -0.5, 39.5); @@ -1021,6 +1045,8 @@ struct IdentifiedBfFilterTracks { fOutputList->Add(fhTruePtA[sp]); fOutputList->Add(fhTruePtPosA[sp]); fOutputList->Add(fhTruePtNegA[sp]); + fOutputList->Add(fhTruePtEtaPosA[sp]); + fOutputList->Add(fhTruePtEtaNegA[sp]); fOutputList->Add(fhTrueNPosNegA[sp]); fOutputList->Add(fhTrueDeltaNA[sp]); } @@ -1658,8 +1684,10 @@ void IdentifiedBfFilterTracks::fillTrackHistosAfterSelection(TrackObject const& fhdEdxIPTPCA[sp]->Fill(track.tpcInnerParam(), track.tpcSignal()); if (track.sign() > 0) { fhPtPosA[sp]->Fill(track.pt()); + fhPtEtaPosA[sp]->Fill(track.pt(), track.eta()); } else { fhPtNegA[sp]->Fill(track.pt()); + fhPtEtaNegA[sp]->Fill(track.pt(), track.eta()); } } @@ -1720,8 +1748,10 @@ void IdentifiedBfFilterTracks::fillParticleHistosAfterSelection(ParticleObject c fhTruePtA[sp]->Fill(particle.pt()); if (charge > 0) { fhTruePtPosA[sp]->Fill(particle.pt()); + fhTruePtEtaPosA[sp]->Fill(particle.pt(), particle.eta()); } else { fhTruePtNegA[sp]->Fill(particle.pt()); + fhTruePtEtaNegA[sp]->Fill(particle.pt(), particle.eta()); } } From 1a70da42b08af501466f8981776fc6cfcbd75a46 Mon Sep 17 00:00:00 2001 From: lucamicheletti93 <38209984+lucamicheletti93@users.noreply.github.com> Date: Tue, 4 Mar 2025 21:01:39 +0100 Subject: [PATCH 0537/1650] [PWGDQ] Fixing issue in the filling of histograms for Upsilon (#10317) Co-authored-by: Lucamicheletti93 --- PWGDQ/Core/HistogramsLibrary.cxx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index c1430efe05d..050b5113616 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -1289,6 +1289,14 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "Mass_Lxyz", "", false, 250, 0.0, 5.0, VarManager::kMass, 1000, 0.0, 5, VarManager::kVertexingLxyz); hm->AddHistogram(histClass, "Mass_OpeningAngle", "", false, 250, 0.0, 5.0, VarManager::kMass, 800, 0, 0.8, VarManager::kOpeningAngle); } + if (subGroupStr.Contains("flow-dimuon-high-mass")) { + int varV2[6] = {VarManager::kMass, VarManager::kPt, VarManager::kRap, VarManager::kCentFT0C, VarManager::kU2Q2, VarManager::kCos2DeltaPhi}; + + int bins[6] = {50, 30, 6, 18, 200, 40}; + double minBins[6] = {7.0, 0.0, 2.5, 0.0, -10.0, -2.0}; + double maxBins[6] = {12.0, 30.0, 4.0, 90.0, 10.0, 2.0}; + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_V2", "", 6, varV2, bins, minBins, maxBins, 0, -1, kTRUE); + } if (subGroupStr.Contains("flow-dimuon")) { int varV2[6] = {VarManager::kMass, VarManager::kPt, VarManager::kRap, VarManager::kCentFT0C, VarManager::kU2Q2, VarManager::kCos2DeltaPhi}; // int varV3[6] = {VarManager::kMass, VarManager::kPt, VarManager::kRap, VarManager::kCentFT0C, VarManager::kU3Q3, VarManager::kCos3DeltaPhi}; // removed temporarily @@ -1299,14 +1307,6 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_V2", "", 6, varV2, bins, minBins, maxBins, 0, -1, kTRUE); // hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_V3", "", 6, varV3, bins, minBins, maxBins, 0, -1, kTRUE); // removed temporarily } - if (subGroupStr.Contains("flow-dimuon-high-mass")) { - int varV2[6] = {VarManager::kMass, VarManager::kPt, VarManager::kRap, VarManager::kCentFT0C, VarManager::kU2Q2, VarManager::kCos2DeltaPhi}; - - int bins[6] = {50, 30, 6, 18, 200, 40}; - double minBins[6] = {7.0, 0.0, 2.5, 0.0, -10.0, -2.0}; - double maxBins[6] = {12.0, 30.0, 4.0, 90.0, 10.0, 2.0}; - hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_V2", "", 6, varV2, bins, minBins, maxBins, 0, -1, kTRUE); - } if (subGroupStr.Contains("flow-ccdb")) { hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V2SPwR", "Mass_Pt_CentFT0C_V2SPwR", true, 250, 0.0, 5.0, VarManager::kMass, 200, 0.0, 20.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV2SP, VarManager::kWV2SP); hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V2EPwR", "Mass_Pt_CentFT0C_V2EPwR", true, 250, 0.0, 5.0, VarManager::kMass, 200, 0.0, 20.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV2EP, VarManager::kWV2EP); From 80926a33e8c1d9f86665d1f2a44bb2fb26849d64 Mon Sep 17 00:00:00 2001 From: Stefano Cannito <143754257+scannito@users.noreply.github.com> Date: Tue, 4 Mar 2025 21:38:27 +0100 Subject: [PATCH 0538/1650] [PWGLF] Try pt-dependent parametrisation of pion DCAz (#10315) --- .../Tasks/Strangeness/phik0shortanalysis.cxx | 35 +++++++++++++------ 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx index b9bb7ba3f9b..712278be785 100644 --- a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx @@ -89,11 +89,19 @@ struct Phik0shortanalysis { Configurable cfgGlobalWoDCATrack{"cfgGlobalWoDCATrack", true, "Global track selection without DCA"}; Configurable cfgPVContributor{"cfgPVContributor", true, "PV contributor track selection"}; Configurable cMinKaonPtcut{"cMinKaonPtcut", 0.15f, "Track minimum pt cut"}; - Configurable cMaxDCAzToPVcut{"cMaxDCAzToPVcut", 2.0f, "Track DCAz cut to PV Maximum"}; - Configurable cMaxDCArToPV1{"cMaxDCArToPV1", 0.004f, "Track DCAr cut to PV config 1"}; - Configurable cMaxDCArToPV2{"cMaxDCArToPV2", 0.013f, "Track DCAr cut to PV config 2"}; - Configurable cMaxDCArToPV3{"cMaxDCArToPV3", 1.0f, "Track DCAr cut to PV config 3"}; Configurable etaMax{"etaMax", 0.8f, "eta max"}; + Configurable cMaxDCAzToPVcut{"cMaxDCAzToPVcut", 2.0f, "Track DCAz cut to PV Maximum"}; + Configurable cMaxDCArToPV1Phi{"cMaxDCArToPV1Phi", 0.004f, "Track DCAr cut to PV config 1 for Phi"}; + Configurable cMaxDCArToPV2Phi{"cMaxDCArToPV2Phi", 0.013f, "Track DCAr cut to PV config 2 for Phi"}; + Configurable cMaxDCArToPV3Phi{"cMaxDCArToPV3Phi", 1.0f, "Track DCAr cut to PV config 3 for Phi"}; + Configurable cMaxDCArToPV1Pion{"cMaxDCArToPV1Pion", 0.004f, "Track DCAr cut to PV config 1 for Pions"}; + Configurable cMaxDCArToPV2Pion{"cMaxDCArToPV2Pion", 0.013f, "Track DCAr cut to PV config 2 for Pions"}; + Configurable cMaxDCArToPV3Pion{"cMaxDCArToPV3Pion", 1.0f, "Track DCAr cut to PV config 3 for Pions"}; + + Configurable cfgIsDCAzParameterized{"cfgIsDCAzParameterized", false, "IsDCAzParameterized"}; + Configurable cMaxDCAzToPV1Pion{"cMaxDCAzToPV1Pion", 0.004f, "Track DCAz cut to PV config 1 for Pion"}; + Configurable cMaxDCAzToPV2Pion{"cMaxDCAzToPV2Pion", 0.013f, "Track DCAz cut to PV config 2 for Pion"}; + Configurable cMaxDCAzToPV3Pion{"cMaxDCAzToPV3Pion", 1.0f, "Track DCAz cut to PV config 3 for Pion"}; Configurable isNoTOF{"isNoTOF", false, "isNoTOF"}; Configurable nSigmaCutTPCKa{"nSigmaCutTPCKa", 3.0f, "Value of the TPC Nsigma cut for Kaons"}; @@ -415,9 +423,9 @@ struct Phik0shortanalysis { closureMCPhiPionHist.add("h5ClosureMCPhiPiSESCut", "Phi Invariant mass vs Pion nSigma TPC/TOF for Deltay < SecondCut for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); // Phi mass vs Pion NSigma dE/dx for Closure Test - closureMCPhiPionHist.add("h4ClosureMCPhiPiSEIncNew", "Pion nSigma TPC/TOF for Inclusive for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); - closureMCPhiPionHist.add("h4ClosureMCPhiPiSEFCutNew", "Pion nSigma TPC/TOF for Deltay < FirstCut for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); - closureMCPhiPionHist.add("h4ClosureMCPhiPiSESCutNew", "Pion nSigma TPC/TOF for Deltay < SecondCut for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); + closureMCPhiPionHist.add("h4ClosureMCPhiPiSEIncNew", "Pion nSigma TPC/TOF for Inclusive for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}}); + closureMCPhiPionHist.add("h4ClosureMCPhiPiSEFCutNew", "Pion nSigma TPC/TOF for Deltay < FirstCut for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}}); + closureMCPhiPionHist.add("h4ClosureMCPhiPiSESCutNew", "Pion nSigma TPC/TOF for Deltay < SecondCut for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}}); // MCPhi invariant mass for computing efficiencies and MCnormalisation mcPhiHist.add("h2PhieffInvMass", "Invariant mass of Phi for Efficiency (no K0S/Pi)", kTH2F, {binnedmultAxis, massPhiAxis}); @@ -620,7 +628,7 @@ struct Phik0shortanalysis { mcPhiHist.fill(HIST("h2DauTracksPhiDCAzPreCutMCReco"), track.pt(), track.dcaZ()); } } - if (std::abs(track.dcaXY()) > trackConfigs.cMaxDCArToPV1 + (trackConfigs.cMaxDCArToPV2 / std::pow(track.pt(), trackConfigs.cMaxDCArToPV3))) + if (std::abs(track.dcaXY()) > trackConfigs.cMaxDCArToPV1Phi + (trackConfigs.cMaxDCArToPV2Phi / std::pow(track.pt(), trackConfigs.cMaxDCArToPV3Phi))) return false; if (isQA) { if constexpr (!isMC) { @@ -709,7 +717,7 @@ struct Phik0shortanalysis { mcPionHist.fill(HIST("h2TracksPiDCAzPreCutMCReco"), track.pt(), track.dcaZ()); } } - if (std::abs(track.dcaXY()) > trackConfigs.cMaxDCArToPV1 + (trackConfigs.cMaxDCArToPV2 / std::pow(track.pt(), trackConfigs.cMaxDCArToPV3))) + if (std::abs(track.dcaXY()) > trackConfigs.cMaxDCArToPV1Pion + (trackConfigs.cMaxDCArToPV2Pion / std::pow(track.pt(), trackConfigs.cMaxDCArToPV3Pion))) return false; if (isQA) { if constexpr (!isMC) { @@ -720,8 +728,13 @@ struct Phik0shortanalysis { mcPionHist.fill(HIST("h2TracksPiDCAzPostCutMCReco"), track.pt(), track.dcaZ()); } } - if (std::abs(track.dcaZ()) > trackConfigs.cMaxDCAzToPVcut) - return false; + if (trackConfigs.cfgIsDCAzParameterized) { + if (std::abs(track.dcaZ()) > trackConfigs.cMaxDCAzToPV1Pion + (trackConfigs.cMaxDCAzToPV2Pion / std::pow(track.pt(), trackConfigs.cMaxDCAzToPV3Pion))) + return false; + } else { + if (std::abs(track.dcaZ()) > trackConfigs.cMaxDCAzToPVcut) + return false; + } return true; } From 999d5510707bf4606bb18d9a5e821efe24a7b6ca Mon Sep 17 00:00:00 2001 From: Chiara De Martin <39315597+ChiaraDeMartin95@users.noreply.github.com> Date: Tue, 4 Mar 2025 22:22:35 +0100 Subject: [PATCH 0539/1650] [PWGLF] Fix of small bug (#10319) Co-authored-by: Chiara De Martin --- PWGLF/TableProducer/Strangeness/cascadeflow.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGLF/TableProducer/Strangeness/cascadeflow.cxx b/PWGLF/TableProducer/Strangeness/cascadeflow.cxx index 1be468344d4..c66a1db16fd 100644 --- a/PWGLF/TableProducer/Strangeness/cascadeflow.cxx +++ b/PWGLF/TableProducer/Strangeness/cascadeflow.cxx @@ -930,7 +930,7 @@ struct cascadeFlow { continue; int bin2DXi = hAcceptanceXi->FindBin(casc.pt(), casc.eta()); int bin2DOmega = hAcceptanceOmega->FindBin(casc.pt(), casc.eta()); - int bin2DLambda = hAcceptanceXi->FindBin(ptLambda, etaLambda); + int bin2DLambda = hAcceptanceLambda->FindBin(ptLambda, etaLambda); MeanCos2ThetaLambdaFromXi = hAcceptanceXi->GetBinContent(bin2DXi); MeanCos2ThetaLambdaFromOmega = hAcceptanceOmega->GetBinContent(bin2DOmega); MeanCos2ThetaProtonFromLambda = hAcceptanceLambda->GetBinContent(bin2DLambda); From 226ef64693fa86b24176b772059a16002c2bdd6d Mon Sep 17 00:00:00 2001 From: alcaliva <32872606+alcaliva@users.noreply.github.com> Date: Tue, 4 Mar 2025 23:35:28 +0100 Subject: [PATCH 0540/1650] [PWGLF] added dca distributions in data and mc (#10318) --- .../QC/lfITSTPCMatchingSecondaryTracksQA.cxx | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx b/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx index 66bfce80997..14aebdb354a 100644 --- a/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx +++ b/PWGLF/Tasks/QC/lfITSTPCMatchingSecondaryTracksQA.cxx @@ -63,7 +63,6 @@ struct LfITSTPCMatchingSecondaryTracksQA { // Track Parameters Configurable minITSnCls{"minITSnCls", 1.0f, "min number of ITS clusters"}; Configurable minNCrossedRowsTPC{"minNCrossedRowsTPC", 80.0f, "min number of TPC crossed rows"}; - Configurable minNCrossedRowsOverFindable{"minNCrossedRowsOverFindable", 0.8f, "min number of TPC crossed rows/findable"}; Configurable maxChi2TPC{"maxChi2TPC", 4.0f, "max chi2 per cluster TPC"}; Configurable maxChi2ITS{"maxChi2ITS", 36.0f, "max chi2 per cluster ITS"}; Configurable etaMin{"etaMin", -0.8f, "eta min"}; @@ -74,8 +73,7 @@ struct LfITSTPCMatchingSecondaryTracksQA { Configurable nsigmaTOFmax{"nsigmaTOFmax", +3.0f, "Maximum nsigma TOF"}; Configurable dcaxyMax{"dcaxyMax", 0.1f, "dcaxy max"}; Configurable dcazMax{"dcazMax", 0.1f, "dcaz max"}; - Configurable dcaxyMin{"dcaxyMin", 0.1f, "dcaxy min"}; - Configurable dcazMin{"dcazMin", 0.1f, "dcaz min"}; + Configurable dcaMin{"dcaMin", 0.1f, "dca min"}; Configurable requireTOF{"requireTOF", false, "require TOF hit"}; Configurable requireItsHits{"requireItsHits", false, "require ITS hits"}; Configurable> requiredHit{"requiredHit", {0, 0, 0, 0, 0, 0, 0}, "required ITS Hits (1=required, 0=not required)"}; @@ -95,6 +93,8 @@ struct LfITSTPCMatchingSecondaryTracksQA { // Event Counters if (doprocessData) { registryData.add("number_of_events_data", "number of events in data", HistType::kTH1D, {{20, 0, 20, "Event Cuts"}}); + registryData.add("dcaxyDatavspt", "dcaxyDatavspt", HistType::kTH2D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {400, -2, 2, "DCA_{xy} (cm)"}}); + registryData.add("dcazDatavspt", "dcazDatavspt", HistType::kTH2D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {400, -2, 2, "DCA_{z} (cm)"}}); registryData.add("primPionTPC", "primPionTPC", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); registryData.add("primPionTPC_ITS", "primPionTPC_ITS", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); registryData.add("secPionTPC", "secPionTPC", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); @@ -105,6 +105,8 @@ struct LfITSTPCMatchingSecondaryTracksQA { if (doprocessMC) { registryMC.add("number_of_events_mc", "number of events in mc", HistType::kTH1D, {{20, 0, 20, "Event Cuts"}}); + registryMC.add("dcaxyMCvspt", "dcaxyMCvspt", HistType::kTH2D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {400, -2, 2, "DCA_{xy} (cm)"}}); + registryMC.add("dcazMCvspt", "dcazMCvspt", HistType::kTH2D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {400, -2, 2, "DCA_{z} (cm)"}}); registryMC.add("primPionTPC_MC", "primPionTPC_MC", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); registryMC.add("primPionTPC_ITS_MC", "primPionTPC_ITS_MC", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); registryMC.add("secPionTPC_MC", "secPionTPC_MC", HistType::kTH3D, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#eta"}, {100, 0, TwoPI, "#phi"}}); @@ -127,8 +129,6 @@ struct LfITSTPCMatchingSecondaryTracksQA { return false; if (track.tpcNClsCrossedRows() < minNCrossedRowsTPC) return false; - if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < minNCrossedRowsOverFindable) - return false; if (track.tpcChi2NCl() > maxChi2TPC) return false; if (track.eta() < etaMin || track.eta() > etaMax) @@ -147,15 +147,11 @@ struct LfITSTPCMatchingSecondaryTracksQA { return false; if (track.tpcNClsCrossedRows() < minNCrossedRowsTPC) return false; - if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < minNCrossedRowsOverFindable) - return false; if (track.tpcChi2NCl() > maxChi2TPC) return false; if (track.eta() < etaMin || track.eta() > etaMax) return false; - if (std::fabs(track.dcaXY()) < dcaxyMin) - return false; - if (std::fabs(track.dcaZ()) < dcazMin) + if (std::sqrt(track.dcaXY() * track.dcaXY() + track.dcaZ() * track.dcaZ()) < dcaMin) return false; return true; } @@ -167,8 +163,6 @@ struct LfITSTPCMatchingSecondaryTracksQA { return false; if (track.tpcNClsCrossedRows() < minNCrossedRowsTPC) return false; - if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < minNCrossedRowsOverFindable) - return false; if (track.tpcChi2NCl() > maxChi2TPC) return false; if (track.eta() < etaMin || track.eta() > etaMax) @@ -248,6 +242,12 @@ struct LfITSTPCMatchingSecondaryTracksQA { for (const auto& track : tracks) { + // DCA distributions + if (passedTrackSelectionV0daughTPC(track) && passedPionSelection(track)) { + registryData.fill(HIST("dcaxyDatavspt"), track.pt(), track.dcaXY()); + registryData.fill(HIST("dcazDatavspt"), track.pt(), track.dcaZ()); + } + // Primary Tracks if (passedTrackSelectionTpcPrimary(track) && passedPionSelection(track)) registryData.fill(HIST("primPionTPC"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); @@ -297,6 +297,12 @@ struct LfITSTPCMatchingSecondaryTracksQA { for (const auto& track : tracksPerColl) { + // DCA distributions + if (passedTrackSelectionV0daughTPC(track) && passedPionSelection(track)) { + registryMC.fill(HIST("dcaxyMCvspt"), track.pt(), track.dcaXY()); + registryMC.fill(HIST("dcazMCvspt"), track.pt(), track.dcaZ()); + } + // Primary Tracks if (passedTrackSelectionTpcPrimary(track) && passedPionSelection(track)) registryMC.fill(HIST("primPionTPC_MC"), track.pt(), track.eta(), TVector2::Phi_0_2pi(track.phi())); From e82d21656096bfb4b2af3b5886601fa3b692dc4b Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Wed, 5 Mar 2025 00:16:47 +0100 Subject: [PATCH 0541/1650] [PWGCF] jFlucEfficiencyTask.cxx - Apply track filter (#10322) --- PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx | 53 +++++++++------------ 1 file changed, 22 insertions(+), 31 deletions(-) diff --git a/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx b/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx index 352747c3054..2e4b443ae66 100644 --- a/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx +++ b/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx @@ -95,7 +95,7 @@ struct JFlucEfficiencyTask { // (aod::track::eta <= cfgEtaMax); Filter trackSelectionFilter = (trackSelection.node() == 0) || // from tpcSkimsTableCreator ((trackSelection.node() == 1) && requireGlobalTrackInFilter()) || - ((trackSelection.node() == 2) && requireGlobalTrackWoPtEtaInFilter()) || + ((trackSelection.node() == 2) && requirePrimaryTracksInFilter()) || ((trackSelection.node() == 3) && requireGlobalTrackWoDCAInFilter()) || ((trackSelection.node() == 4) && requireQualityTracksInFilter()) || ((trackSelection.node() == 5) && requireTrackCutInFilter(TrackSelectionFlags::kInAcceptanceTracks)); @@ -144,26 +144,15 @@ struct JFlucEfficiencyTask { o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); registry.add("hPtGenNeg", "Generated p_{T} (negative);p_{T} (GeV/c);Centrality (%);Counts", o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); - registry.add("hPtGenParticle", "Generated p_{T} (all);p_{T} (GeV/c);Centrality (%);Counts", - o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); - registry.add("hEtaGenParticle", "Generated #eta (all);#eta;Centrality (%);Counts", - o2::framework::HistType::kTH2F, {AxisSpec(100, -1, 1), AxisSpec(axisMultiplicity)}); - registry.add("hPtGenParticlePos", "Generated p_{T} (positive);p_{T} (GeV/c);Centrality (%);Counts", - o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); - registry.add("hPtGenParticleNeg", "Generated p_{T} (negative);p_{T} (GeV/c);Centrality (%);Counts", - o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); - } - - if (doprocessData || doprocessDerivedData) { - registry.add("hPtRec", "Reconstructed p_{T} (all);p_{T} (GeV/c);Centrality (%);Counts", - o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); - registry.add("hEtaRec", "Reconstructed #eta (all);#eta;Centrality (%);Counts", - o2::framework::HistType::kTH2F, {AxisSpec(100, -1, 1), AxisSpec(axisMultiplicity)}); - registry.add("hPtRecPos", "Reconstructed p_{T} (positive);p_{T} (GeV/c);Centrality (%);Counts", - o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); - registry.add("hPtRecNeg", "Reconstructed p_{T} (negative);p_{T} (GeV/c);Centrality (%);Counts", - o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); } + registry.add("hPtRec", "Reconstructed p_{T} (all);p_{T} (GeV/c);Centrality (%);Counts", + o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); + registry.add("hEtaRec", "Reconstructed #eta (all);#eta;Centrality (%);Counts", + o2::framework::HistType::kTH2F, {AxisSpec(100, -1, 1), AxisSpec(axisMultiplicity)}); + registry.add("hPtRecPos", "Reconstructed p_{T} (positive);p_{T} (GeV/c);Centrality (%);Counts", + o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); + registry.add("hPtRecNeg", "Reconstructed p_{T} (negative);p_{T} (GeV/c);Centrality (%);Counts", + o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); if (doprocessEfficiency) { registry.add("hPtGenData", "Generated p_{T} from data events (all);p_{T} (GeV/c);Centrality (%);Counts", @@ -266,7 +255,7 @@ struct JFlucEfficiencyTask { Preslice perCollision = aod::track::collisionId; void processMC(aod::McCollisions::iterator const& mcCollision, soa::SmallGroups const& collisions, - MCTrackCandidates const& mcTracks, + soa::Filtered const& mcTracks, aod::McParticles const& mcParticles) { registry.fill(HIST("hEventCounterMC"), 0); @@ -300,16 +289,18 @@ struct JFlucEfficiencyTask { if (particle.pt() < cfgPtMin || particle.pt() > cfgPtMax || particle.eta() < cfgEtaMin || particle.eta() > cfgEtaMax) { continue; } - registry.fill(HIST("hPtGenParticle"), particle.pt(), centrality); - registry.fill(HIST("hEtaGenParticle"), particle.eta(), centrality); + registry.fill(HIST("hPtGen"), particle.pt(), centrality); + registry.fill(HIST("hEtaGen"), particle.eta(), centrality); if (charge > 0) { // Positive particles - registry.fill(HIST("hPtGenParticlePos"), particle.pt(), centrality); + registry.fill(HIST("hPtGenPos"), particle.pt(), centrality); } else if (charge < 0) { // Negative particles - registry.fill(HIST("hPtGenParticleNeg"), particle.pt(), centrality); + registry.fill(HIST("hPtGenNeg"), particle.pt(), centrality); } } // Reconstruct tracks from MC particles for (const auto& collision : collisions) { + registry.fill(HIST("hZVertexReco"), collision.posZ(), centrality); + registry.fill(HIST("hZVertexCorrelation"), mcCollision.posZ(), collision.posZ()); auto tracks = mcTracks.sliceBy(perCollision, collision.globalIndex()); for (const auto& track : tracks) { if (!track.has_mcParticle()) { @@ -323,18 +314,18 @@ struct JFlucEfficiencyTask { if (track.pt() < cfgPtMin || track.pt() > cfgPtMax || track.eta() < cfgEtaMin || track.eta() > cfgEtaMax) { continue; } - registry.fill(HIST("hPtGen"), track.pt(), centrality); - registry.fill(HIST("hEtaGen"), track.eta(), centrality); + registry.fill(HIST("hPtRec"), track.pt(), centrality); + registry.fill(HIST("hEtaRec"), track.eta(), centrality); if (track.sign() > 0) { // Positive tracks - registry.fill(HIST("hPtGenPos"), track.pt(), centrality); + registry.fill(HIST("hPtRecPos"), track.pt(), centrality); } else if (track.sign() < 0) { // Negative tracks - registry.fill(HIST("hPtGenNeg"), track.pt(), centrality); + registry.fill(HIST("hPtRecNeg"), track.pt(), centrality); } } } } - void processData(CollisionCandidates::iterator const& collision, TrackCandidates const& tracks) + void processData(CollisionCandidates::iterator const& collision, soa::Filtered const& tracks) { if (!colCuts.isSelected(collision)) // Default event selection return; @@ -364,7 +355,7 @@ struct JFlucEfficiencyTask { void processEfficiency(soa::Filtered::iterator const& mcCollision, aod::CFMcParticles const& mcParticles, soa::SmallGroups const& collisions, - aod::CFTracksWithLabel const& tracks) + soa::Filtered const& tracks) { try { // Count MC events and fill MC z-vertex with centrality From fe250e08502af8ca6a1adfd010fef5463d1633db Mon Sep 17 00:00:00 2001 From: hernasab Date: Tue, 4 Mar 2025 17:18:07 -0600 Subject: [PATCH 0542/1650] [PWGCF] added histogram and removed obsolete objects (#10324) Co-authored-by: Sabrina Hernandez --- PWGCF/Flow/Tasks/flowZdcTask.cxx | 89 +++++++++++++++++--------------- 1 file changed, 46 insertions(+), 43 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowZdcTask.cxx b/PWGCF/Flow/Tasks/flowZdcTask.cxx index 53e84155958..7c368aa1818 100644 --- a/PWGCF/Flow/Tasks/flowZdcTask.cxx +++ b/PWGCF/Flow/Tasks/flowZdcTask.cxx @@ -64,15 +64,9 @@ struct FlowZdcTask { Configurable nBinsPt{"nBinsPt", 500, "N bins in pT histo"}; Configurable eventSelection{"eventSelection", 1, "event selection"}; Configurable maxZp{"maxZp", 3099.5, "Max ZP signal"}; - Configurable vtxCut{"vtxCut", 10.0, "Z vertex cut"}; - Configurable etaCut{"etaCut", 0.8, "Eta cut"}; - Configurable etaGap{"etaGap", 0.5, "Eta gap"}; - Configurable minPt{"minPt", 0.2, "Minimum pt"}; - Configurable maxPt{"maxPt", 20.0, "Maximum pt"}; Configurable minTpcNcrossedRows{"minTpcNcrossedRows", 20, "minTpcNcrossedRows"}; Configurable maxZem{"maxZem", 3099.5, "Max ZEM signal"}; // for ZDC info and analysis - Configurable nBinsADC{"nBinsADC", 1000, "nbinsADC"}; Configurable nBinsAmp{"nBinsAmp", 1025, "nbinsAmp"}; Configurable nBinsFT0Amp{"nBinsFT0Amp", 250000, "nbinsAmp"}; Configurable maxZn{"maxZn", 4099.5, "Max ZN signal"}; @@ -82,7 +76,12 @@ struct FlowZdcTask { Configurable acceptanceZpc{"acceptanceZpc", 0.50, "ZPC acceptance factor"}; Configurable vtxRange{"vtxRange", 10.0f, "Vertex Z range to consider"}; Configurable etaRange{"etaRange", 1.0f, "Eta range to consider"}; + Configurable maxNch{"maxNch", 2500, "Max Nch (|eta|<0.8)"}; Configurable npvTracksCut{"npvTracksCut", 1.0f, "Apply extra NPVtracks cut"}; + Configurable nBinsTDC{"nBinsTDC", 150, "nbinsTDC"}; + Configurable minTdc{"minTdc", -15.0, "minimum TDC"}; + Configurable maxTdc{"maxTdc", 15.0, "maximum TDC"}; + Configurable nBinsNch{"nBinsNch", 2501, "N bins Nch (|eta|<0.8)"}; // event selection Configurable isApplySameBunchPileup{"isApplySameBunchPileup", true, "Enable SameBunchPileup cut"}; Configurable isApplyGoodZvtxFT0vsPV{"isApplyGoodZvtxFT0vsPV", true, "Enable GoodZvtxFT0vsPV cut"}; @@ -90,22 +89,15 @@ struct FlowZdcTask { Configurable isApplyVertexTOFmatched{"isApplyVertexTOFmatched", false, "Enable VertexTOFmatched cut"}; Configurable isApplyVertexTRDmatched{"isApplyVertexTRDmatched", false, "Enable VertexTRDmatched cut"}; Configurable isApplyExtraCorrCut{"isApplyExtraCorrCut", false, "Enable extra NPVtracks vs FTOC correlation cut"}; - Configurable isApplyExtraPhiCut{"isApplyExtraPhiCut", false, "Enable extra phi cut"}; - Configurable isApplyNoCollInTimeRangeStandard{"isApplyNoCollInTimeRangeStandard", false, "Enable NoCollInTimeRangeStandard cut"}; - Configurable isApplyNoCollInRofStandard{"isApplyNoCollInRofStandard", false, "Enable NoCollInRofStandard cut"}; - Configurable isApplyNoHighMultCollInPrevRof{"isApplyNoHighMultCollInPrevRof", false, "Enable NoHighMultCollInPrevRof cut"}; Configurable isApplyFT0CbasedOccupancy{"isApplyFT0CbasedOccupancy", false, "Enable FT0CbasedOccupancy cut"}; - Configurable isApplyCentFT0C{"isApplyCentFT0C", false, "Centrality based on FT0C"}; - Configurable isApplyCentFT0CVariant1{"isApplyCentFT0CVariant1", false, "Centrality based on FT0C variant1"}; - Configurable isApplyCentFT0M{"isApplyCentFT0M", false, "Centrality based on FT0A + FT0C"}; - Configurable isApplyCentNGlobal{"isApplyCentNGlobal", false, "Centrality based on global tracks"}; - Configurable isApplyCentMFT{"isApplyCentMFT", false, "Centrality based on MFT tracks"}; Configurable isGoodITSLayersAll{"isGoodITSLayersAll", false, "Centrality based on no other collisions in this Readout Frame with per-collision multiplicity above threshold tracks"}; Configurable isOccupancyCut{"isOccupancyCut", true, "Occupancy cut?"}; + Configurable isZEMcut{"isZEMcut", true, "Use ZEM cut?"}; Configurable ft0cCut{"ft0cCut", 1.0f, "Apply extra FT0C cut"}; Configurable minOccCut{"minOccCut", 0, "min Occu cut"}; Configurable maxOccCut{"maxOccCut", 500, "max Occu cut"}; Configurable posZcut{"posZcut", +10.0, "z-vertex position cut"}; + Configurable zemCut{"zemCut", 1000., "ZEM cut"}; ConfigurableAxis axisVertex{"axisVertex", {20, -10, 10}, "vertex axis for histograms"}; ConfigurableAxis axisPhi{"axisPhi", {60, 0.0, constants::math::TwoPI}, "phi axis for histograms"}; @@ -141,17 +133,6 @@ struct FlowZdcTask { // Begin Histogram Registry HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; - OutputObj q2RealMean{TProfile("q2_real_mean", "q2 real vs centrality", 10, 0, 100.)}; - OutputObj q2ImagMean{TProfile("q2_imag_mean", "q2 imag vs centrality", 10, 0, 100.)}; - OutputObj q2After{TProfile("q2after", "q2 recentered vs centrality", 10, 0, 100.)}; - OutputObj q2Before{TProfile("q2before", "q2 re vs imag", 10, 0, 100.)}; - OutputObj q2ZnaReal{TProfile("Q2_ZNA_real", "q2_ZNA real vs centrality", 10, 0, 100.)}; - OutputObj q2ZnaImag{TProfile("Q2_ZNA_imag", "q2_ZNA imag vs centrality", 10, 0, 100.)}; - OutputObj q2ZncReal{TProfile("Q2_ZNC_real", "q2_ZNC real vs centrality", 10, 0, 100.)}; - OutputObj qZncImag{TProfile("Q2_ZNC_imag", "q2_ZNC imag vs centrality", 10, 0, 100.)}; - OutputObj avgQ2TPCRe{TProfile("avgQ2TPCRe", "Average Q2 Real part vs Centrality", 10, 0, 100)}; - OutputObj avgQ2TPCIm{TProfile("avgQ2TPCIm", "Average Q2 Imaginary part vs Centrality", 10, 0, 100)}; - OutputObj zdcZemEnergy{TProfile("ZDC_ZEM_Energy", "ZDC vs ZEM Energy", 10, 0, 1000)}; OutputObj pCosPsiDifferences{TProfile("pCosPsiDifferences", "Differences in cos(psi) vs Centrality;Centrality;Mean cos(psi) Difference", 200, 0, 100, -1, 1)}; OutputObj pSinPsiDifferences{TProfile("pSinPsiDifferences", "Differences in sin(psi) vs Centrality;Centrality;Mean sin(psi) Difference", 200, 0, 100, -1, 1)}; OutputObj pZNvsFT0Ccent{TProfile("pZNvsFT0Ccent", "ZN Energy vs FT0C Centrality", 100, 0, 100, 0, 500)}; @@ -165,24 +146,14 @@ struct FlowZdcTask { void init(InitContext const&) { // define axes - const AxisSpec axisEta{30, -1.5, +1.5, "#eta"}; - const AxisSpec axispt{100, 0, 2, "#pt"}; - - const AxisSpec axisPt{nBinsPt, 0, 10, "p_{T} (GeV/c)"}; const AxisSpec axisCounter{1, 0, +1, ""}; - const AxisSpec axisPhi{100, 0, o2::constants::math::TwoPI, "#phi"}; const AxisSpec axisQ{100, -1, 1, "Q"}; - const AxisSpec axisZNA{100, 0, 200, "energy"}; const AxisSpec axisQZNA{100, -1, 1, "Q"}; const AxisSpec axisREQ{100, -1, 1, "real Q"}; const AxisSpec axisIMQ{100, -1, 1, "imag Q"}; - AxisSpec axisVtxcounts{2, -0.5f, 1.5f, "Vtx info (0=no, 1=yes)"}; AxisSpec axisVtxZ{40, -20, 20, "Vertex Z", "VzAxis"}; - AxisSpec axisZvert{120, -30.f, 30.f, "Vtx z (cm)"}; - AxisSpec axisCentBins{{0, 5., 10., 20., 30., 40., 50., 60., 70., 80.}, "centrality percentile"}; - AxisSpec axisPtBins{{0., 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.25, 2.5, 2.75, 3.0, 3.5, 4.0, 4.5, 5.0, 6.0, 8.0, 10., 13., 16., 20.}, "p_{T} (GeV/c)"}; - AxisSpec axisEvent{11, 0.5, 11.5, "#Event", "EventAxis"}; + AxisSpec axisEvent{12, 0.5, 12.5, "#Event", "EventAxis"}; AxisSpec axisMult = {multHistBin, "Mult", "MultAxis"}; AxisSpec axisFT0CMult = {ft0cMultHistBin, "ft0c", "FT0CMultAxis"}; @@ -218,9 +189,13 @@ struct FlowZdcTask { "ZP Energy vs FT0C Centrality;Centrality [%];ZP Energy", kTH2F, {axisCent, axisZP}); + histos.add("hNchvsNPV", ";NPVTracks (|#eta|<1);N_{ch} (|#eta|<0.8);", + kTH2F, + {{{nBinsNch, -0.5, maxNch}, {nBinsNch, -0.5, maxNch}}}); histos.add("revsimag", "revsimag", kTH2F, {axisREQ, axisIMQ}); // for q vector recentering histos.add("hYield", "Nch vs pT", kTH2F, {axisMultiplicity, axisPt}); histos.add("hGlobalTracks", "hGlobalTracks", kTH1F, {axisMultiplicity}); + // event selection steps histos.add("eventSelectionSteps", "eventSelectionSteps", kTH1D, {axisEvent}); auto hstat = histos.get(HIST("eventSelectionSteps")); auto* xAxis = hstat->GetXaxis(); @@ -230,6 +205,13 @@ struct FlowZdcTask { xAxis->SetBinLabel(4, "kIsGoodZvtxFT0vsPV"); // small difference between z-vertex from PV and from FT0 xAxis->SetBinLabel(5, "kIsVertexITSTPC"); // at least one ITS-TPC track (reject vertices built from ITS-only tracks) xAxis->SetBinLabel(6, "kIsApplyVertexTOFmatched"); //"Centrality based on no other collisions in this Readout Frame with per-collision multiplicity above threshold tracks" + xAxis->SetBinLabel(7, "Occupancy Cuts"); + xAxis->SetBinLabel(8, "kITSLayersAll"); + xAxis->SetBinLabel(9, "kTRDVertexMatched"); + xAxis->SetBinLabel(10, "Centrality cut"); + xAxis->SetBinLabel(11, "Vertex Z cut"); + xAxis->SetBinLabel(12, "Extra Correlation Cut"); + histos.add("GlobalMult_vs_FT0C", "GlobalMult_vs_FT0C", kTH2F, {axisMult, axisFT0CMult}); histos.add("VtxZHist", "VtxZHist", kTH1D, {axisVtxZ}); @@ -254,7 +236,6 @@ struct FlowZdcTask { histos.add("CosPsiDifferences", "Differences in cos(psi);cos(psiZNC) - cos(psiZNA);Entries", {HistType::kTH1F, {{100, -2, 2}}}); histos.add("hSinDifferences", "Differences in sin(psi);sin(psiZNC) - sin(psiZNA);Entries", {HistType::kTH1F, {{100, -2, 2}}}); - histos.add("CosPsiDifferencesAvg", "Differences in cos(psi);cos(psiZNC) - cos(psiZNA);Entries", {HistType::kTH2F, {{axisCent}, {100, -2, 2}}}); histos.add("ZDC_energy_vs_ZEM", "ZDCvsZEM; ZEM; ZNA+ZNC+ZPA+ZPC", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZem}, {nBinsAmp, -0.5, 2. * maxZn}}}}); // common energies information for ZDC histos.add("ZNCenergy", "ZN energy side c", kTH1F, {axisEnergy}); @@ -266,13 +247,11 @@ struct FlowZdcTask { histos.add("hFT0CAmp", ";Amplitude;counts", kTH1F, {axisFT0CAmp}); histos.add("hFT0AAmp", ";Amplitude;counts", kTH1F, {axisFT0AAmp}); histos.add("hFT0MAmp", ";Amplitude;counts", kTH1F, {axisFT0MAmp}); - histos.add("hMultT0A", ";Amplitude;counts", kTH1F, {{nBinsFT0Amp, 0, 250000}}); - histos.add("hMultT0C", ";Amplitude;counts", kTH1F, {{nBinsFT0Amp, 0, 250000}}); - histos.add("hMultT0M", ";Amplitude;counts", kTH1F, {{nBinsFT0Amp, 0, 250000}}); histos.add("hZNvsFT0CAmp", "ZN Energy vs FT0C Amplitude", kTH2F, {axisFT0CAmp, axisZN}); histos.add("hZPvsFT0CAmp", "ZP Energy vs FT0C Amplitude", kTH2F, {axisFT0CAmp, axisZP}); histos.add("hZNvsMult", "ZN Energy vs Multiplicity", kTH2F, {axisMultiplicity, axisZN}); histos.add("hZPvsMult", "ZP Energy vs Multiplicity", kTH2F, {axisMultiplicity, axisZP}); + histos.add("debunch", ";t_{ZDC}-t_{ZDA};t_{ZDC}+t_{ZDA}", kTH2F, {{{nBinsTDC, minTdc, maxTdc}, {nBinsTDC, minTdc, maxTdc}}}); } } template @@ -313,22 +292,27 @@ struct FlowZdcTask { if (occuValue < minOccCut || occuValue > maxOccCut) return false; } + histos.fill(HIST("eventSelectionSteps"), 7); if (isGoodITSLayersAll && !col.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { return false; } + histos.fill(HIST("eventSelectionSteps"), 8); if (isApplyVertexTRDmatched && !col.selection_bit(o2::aod::evsel::kIsVertexTRDmatched)) { return false; } + histos.fill(HIST("eventSelectionSteps"), 9); if (col.centFT0C() < 0. || col.centFT0C() > 100.) { return false; } - + histos.fill(HIST("eventSelectionSteps"), 10); if (std::fabs(col.posZ()) > posZcut) { return false; } + histos.fill(HIST("eventSelectionSteps"), 11); if (isApplyExtraCorrCut && col.multNTracksPV() > npvTracksCut && col.multFT0C() < (10 * col.multNTracksPV() - ft0cCut)) { return false; } + histos.fill(HIST("eventSelectionSteps"), 12); return true; } @@ -397,6 +381,12 @@ struct FlowZdcTask { int countEvents = 0; // initialize Counter for the number of events processed double ft0aAmp = 0; double ft0cAmp = 0; + float tZNA{0.0}; + float tZNC{0.0}; + float tZPA{0.0}; + float tZPC{0.0}; + float tZDCdif{0.0}; + float tZDCsum{0.0}; const auto& foundBC = collision.foundBC_as(); if (collision.has_foundFT0()) { auto ft0 = collision.foundFT0(); @@ -423,6 +413,12 @@ struct FlowZdcTask { histos.get(HIST("ZEM1coll"))->Fill(zdcread.amplitudeZEM1()); histos.get(HIST("ZEM2coll"))->Fill(zdcread.amplitudeZEM2()); + tZNA = foundBC.zdc().timeZNA(); + tZNC = foundBC.zdc().timeZNC(); + tZPA = foundBC.zdc().timeZPA(); + tZPC = foundBC.zdc().timeZPC(); + tZDCdif = tZNC + tZPC - tZNA - tZPA; + tZDCsum = tZNC + tZPC + tZNA + tZPA; float sumZNC = (zdcread.energySectorZNC())[0] + (zdcread.energySectorZNC())[1] + (zdcread.energySectorZNC())[2] + (zdcread.energySectorZNC())[3]; float sumZNA = (zdcread.energySectorZNA())[0] + (zdcread.energySectorZNA())[1] + (zdcread.energySectorZNA())[2] + (zdcread.energySectorZNA())[3]; @@ -430,7 +426,12 @@ struct FlowZdcTask { float sumZPA = (zdcread.energySectorZPA())[0] + (zdcread.energySectorZPA())[1] + (zdcread.energySectorZPA())[2] + (zdcread.energySectorZPA())[3]; float sumZDC = sumZPA + sumZPC + sumZNA + sumZNC; float sumZEM = zdcread.amplitudeZEM1() + zdcread.amplitudeZEM2(); - + // ZEM cut + if (isZEMcut) { + if (sumZEM < zemCut) { + return; + } + } // common energies float commonSumZnc = (zdcread.energyCommonZNC()) / acceptanceZnc; float commonSumZna = (zdcread.energyCommonZNA()) / acceptanceZna; @@ -451,6 +452,8 @@ struct FlowZdcTask { histos.fill(HIST("hZPvsFT0CAmp"), ft0cAmp, sumZP); histos.fill(HIST("hZNvsMult"), nTot, sumZN); histos.fill(HIST("hZPvsMult"), nTot, sumZP); + histos.fill(HIST("debunch"), tZDCdif, tZDCsum); + histos.fill(HIST("hNchvsNPV"), collision.multNTracksPVeta1(), nTot); float ratioZN = sumZNC / sumZNA; float ratioZP = sumZPC / sumZPA; From d5db01558c9364d362cc1abb2fe7cdf9f9532af3 Mon Sep 17 00:00:00 2001 From: Anantha Padmanabhan M Nair <82643666+ananthapadmanabhan18@users.noreply.github.com> Date: Wed, 5 Mar 2025 13:53:54 +0530 Subject: [PATCH 0543/1650] [PWGUD] Added my own tables (#10323) --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 166 +++++++++++++++++++++++++----- 1 file changed, 141 insertions(+), 25 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index d363c9b356f..bda827daccb 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -39,9 +39,52 @@ using namespace o2::aod; using namespace o2::framework; using namespace o2::framework::expressions; +namespace o2::aod +{ +namespace zero_charge_events +{ + +DECLARE_SOA_COLUMN(Dcaxy, dcaxy, std::vector); +DECLARE_SOA_COLUMN(Dcaz, dcaz, std::vector); + +DECLARE_SOA_COLUMN(PionPt, pionPt, std::vector); +DECLARE_SOA_COLUMN(PionEta, pionEta, std::vector); +DECLARE_SOA_COLUMN(PionRapidity, pionRapidity, std::vector); + +DECLARE_SOA_COLUMN(FourPionPt, fourPionPt, double); +DECLARE_SOA_COLUMN(FourPionEta, fourPionEta, double); +DECLARE_SOA_COLUMN(FourPionRapidity, fourPionRapidity, double); +DECLARE_SOA_COLUMN(FourPionMass, fourPionMass, double); + +DECLARE_SOA_COLUMN(FourPionPhiPair1, fourPionPhiPair1, double); +DECLARE_SOA_COLUMN(FourPionPhiPair2, fourPionPhiPair2, double); +DECLARE_SOA_COLUMN(FourPionCosThetaPair1, fourPionCosThetaPair1, double); +DECLARE_SOA_COLUMN(FourPionCosThetaPair2, fourPionCosThetaPair2, double); +} // namespace zero_charge_events +DECLARE_SOA_TABLE(TREE, "AOD", "Tree", + + zero_charge_events::Dcaxy, + zero_charge_events::Dcaz, + + zero_charge_events::PionPt, + zero_charge_events::PionEta, + zero_charge_events::PionRapidity, + + zero_charge_events::FourPionPt, + zero_charge_events::FourPionEta, + zero_charge_events::FourPionRapidity, + zero_charge_events::FourPionMass, + + zero_charge_events::FourPionPhiPair1, + zero_charge_events::FourPionPhiPair2, + zero_charge_events::FourPionCosThetaPair1, + zero_charge_events::FourPionCosThetaPair2); +} // namespace o2::aod + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct SGSelector sgSelector; + Produces zeroChargeEvents; HistogramRegistry histosData{"histosData", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry histosMCgen{"histosMCgen", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; @@ -67,8 +110,6 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct Configurable nSigmaTPCcut{"nSigmaTPCcut", 3, "TPC cut"}; Configurable nSigmaTOFcut{"nSigmaTOFcut", 3, "TOF cut"}; Configurable strictEventSelection{"strictEventSelection", true, "Event Selection"}; - // Configurable ifDataAnalysis{"ifDataAnalysis", true, "Data Analysis"}; - // Configurable ifMCAnalysis{"ifMCAnalysis", false, "MC Analysis"}; Configurable nBinsPt{"nBinsPt", 1000, "Number of bins for pT"}; Configurable nBinsInvariantMass{"nBinsInvariantMass", 1000, "Number of bins for Invariant Mass"}; @@ -88,6 +129,13 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosData.add("TrueGapSide", "Gap Side; Events", kTH1F, {{4, -1.5, 2.5}}); histosData.add("EventCounts", "Total Events; Events", kTH1F, {{10, 0, 10}}); + histosData.add("vertexZ", "Vertex Z; Vertex Z [cm]; Counts", kTH1F, {{1000, -20, 20}}); + histosData.add("dcaXY", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{10000, -5, 5}}); + histosData.add("dcaZ", "dcaZ; dcaZ [cm]; Counts", kTH1F, {{10000, -10, 10}}); + histosData.add("tpcChi2NCl", "TPC Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{200, 0, 200}}); + histosData.add("itsChi2NCl", "ITS Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{200, 0, 200}}); + histosData.add("tpcNClsFindable", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); + // TPC nSigma histosData.add("tpcNSigmaPi_WOTS", "TPC nSigma Pion without track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); histosData.add("tpcNSigmaPi_WTS", "TPC nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); @@ -163,8 +211,8 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosData.add("tofBeta_Pi", "TOF beta vs p for pions; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); // Other signals - histosData.add("FT0A", "T0A amplitude", kTH1F, {{200, 0.0, 500.0}}); - histosData.add("FT0C", "T0C amplitude", kTH1F, {{200, 0.0, 500.0}}); + histosData.add("FT0A", "T0A amplitude", kTH1F, {{2000, 0.0, 500.0}}); + histosData.add("FT0C", "T0C amplitude", kTH1F, {{2000, 0.0, 500.0}}); histosData.add("ZDC_A", "ZDC amplitude", kTH1F, {{1000, 0.0, 15}}); histosData.add("ZDC_C", "ZDC amplitude", kTH1F, {{1000, 0.0, 15}}); histosData.add("V0A", "V0A amplitude", kTH1F, {{1000, 0.0, 100}}); @@ -210,6 +258,13 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct // MC Reco Stuff + histosMCreco.add("vertexZ", "Vertex Z; Vertex Z [cm]; Counts", kTH1F, {{1000, -20, 20}}); + histosMCreco.add("dcaXY", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{10000, -5, 5}}); + histosMCreco.add("dcaZ", "dcaZ; dcaZ [cm]; Counts", kTH1F, {{10000, -10, 10}}); + histosMCreco.add("tpcChi2NCl", "TPC Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{200, 0, 200}}); + histosMCreco.add("itsChi2NCl", "ITS Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{200, 0, 200}}); + histosMCreco.add("tpcNClsFindable", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); + histosMCreco.add("GapSide", "Gap Side; Events", kTH1F, {{4, -1.5, 2.5}}); histosMCreco.add("TrueGapSide", "Gap Side; Events", kTH1F, {{4, -1.5, 2.5}}); histosMCreco.add("EventCounts", "Total Events; Events", kTH1F, {{10, 0, 10}}); @@ -289,8 +344,8 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosMCreco.add("tofBeta_Pi", "TOF beta vs p for pions; p [GeV/c]; #beta", kTH2F, {{500, 0, 10}, {500, 0.0, 1.0}}); // Other signals - histosMCreco.add("FT0A", "T0A amplitude", kTH1F, {{200, 0.0, 500.0}}); - histosMCreco.add("FT0C", "T0C amplitude", kTH1F, {{200, 0.0, 500.0}}); + histosMCreco.add("FT0A", "T0A amplitude", kTH1F, {{2000, 0.0, 500.0}}); + histosMCreco.add("FT0C", "T0C amplitude", kTH1F, {{2000, 0.0, 500.0}}); histosMCreco.add("ZDC_A", "ZDC amplitude", kTH1F, {{1000, 0.0, 15}}); histosMCreco.add("ZDC_C", "ZDC amplitude", kTH1F, {{1000, 0.0, 15}}); histosMCreco.add("V0A", "V0A amplitude", kTH1F, {{1000, 0.0, 100}}); @@ -389,7 +444,7 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct if ((gapSide != 2)) { return; } - + histosData.fill(HIST("vertexZ"), collision.posZ()); histosData.fill(HIST("V0A"), collision.totalFV0AmplitudeA()); histosData.fill(HIST("FT0A"), collision.totalFT0AmplitudeA()); histosData.fill(HIST("FT0C"), collision.totalFT0AmplitudeC()); @@ -457,6 +512,13 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosData.fill(HIST("tofNSigmaPi_WTS"), WTS_tracks[i].tofNSigmaPi(), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py())); histosData.fill(HIST("pT_track_WTS"), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py())); histosData.fill(HIST("rapidity_track_WTS"), tempWTS.Rapidity()); + + histosData.fill(HIST("itsChi2NCl"), WTS_tracks[i].itsChi2NCl()); + histosData.fill(HIST("tpcChi2NCl"), WTS_tracks[i].tpcChi2NCl()); + histosData.fill(HIST("tpcNClsFindable"), WTS_tracks[i].tpcNClsFindable()); + histosData.fill(HIST("dcaXY"), WTS_tracks[i].dcaXY()); + histosData.fill(HIST("dcaZ"), WTS_tracks[i].dcaZ()); + } // End of loop over tracks with selection only TLorentzVector tempWTSPIDPi; @@ -487,6 +549,18 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct return; } + std::vector pidcaXY; + std::vector pidcaZ; + + std::vector piPt; + std::vector piEta; + std::vector piRapidity; + + double fourPiPhiPair1 = 0; + double fourPiPhiPair2 = 0; + double fourPiCosThetaPair1 = 0; + double fourPiCosThetaPair2 = 0; + // Selecting Events with net charge = 0 if (numPionMinusTRacks == 2 && numPiPlusTracks == 2) { @@ -498,6 +572,31 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct p3.SetXYZM(Pi_minus_tracks[0].px(), Pi_minus_tracks[0].py(), Pi_minus_tracks[0].pz(), o2::constants::physics::MassPionCharged); p4.SetXYZM(Pi_minus_tracks[1].px(), Pi_minus_tracks[1].py(), Pi_minus_tracks[1].pz(), o2::constants::physics::MassPionCharged); + pidcaXY.push_back(Pi_plus_tracks[0].dcaXY()); + pidcaXY.push_back(Pi_plus_tracks[1].dcaXY()); + pidcaXY.push_back(Pi_minus_tracks[0].dcaXY()); + pidcaXY.push_back(Pi_minus_tracks[1].dcaXY()); + + pidcaZ.push_back(Pi_plus_tracks[0].dcaZ()); + pidcaZ.push_back(Pi_plus_tracks[1].dcaZ()); + pidcaZ.push_back(Pi_minus_tracks[0].dcaZ()); + pidcaZ.push_back(Pi_minus_tracks[1].dcaZ()); + + piPt.push_back(p1.Pt()); + piPt.push_back(p2.Pt()); + piPt.push_back(p3.Pt()); + piPt.push_back(p4.Pt()); + + piEta.push_back(p1.Eta()); + piEta.push_back(p2.Eta()); + piEta.push_back(p3.Eta()); + piEta.push_back(p4.Eta()); + + piRapidity.push_back(p1.Rapidity()); + piRapidity.push_back(p2.Rapidity()); + piRapidity.push_back(p3.Rapidity()); + piRapidity.push_back(p4.Rapidity()); + histosData.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p1.Pt()); histosData.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p2.Pt()); histosData.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p3.Pt()); @@ -521,6 +620,17 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct k23 = k2 + k3; k24 = k2 + k4; + fourPiPhiPair1 = phiCollinsSoperFrame(k13, k24, k1234); + fourPiPhiPair2 = phiCollinsSoperFrame(k14, k23, k1234); + fourPiCosThetaPair1 = cosThetaCollinsSoperFrame(k13, k24, k1234); + fourPiCosThetaPair2 = cosThetaCollinsSoperFrame(k14, k23, k1234); + + zeroChargeEvents( + pidcaXY, pidcaZ, + piPt, piEta, piRapidity, + p1234.Pt(), p1234.Eta(), p1234.Rapidity(), p1234.M(), + fourPiPhiPair1, fourPiPhiPair2, fourPiCosThetaPair1, fourPiCosThetaPair2); + if (std::fabs(p1234.Rapidity()) < 0.5) { histosData.fill(HIST("pT_event_0charge_WTS_PID_Pi"), p1234.Pt()); if (p1234.Pt() < 0.15) { @@ -532,18 +642,13 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosData.fill(HIST("invMass_pair_3"), (p2 + p3).M()); histosData.fill(HIST("invMass_pair_4"), (p2 + p4).M()); - auto phiPair1 = phiCollinsSoperFrame(k13, k24, k1234); - auto phiPair2 = phiCollinsSoperFrame(k14, k23, k1234); - auto cosThetaPair1 = cosThetaCollinsSoperFrame(k13, k24, k1234); - auto cosThetaPair2 = cosThetaCollinsSoperFrame(k14, k23, k1234); - - histosData.fill(HIST("CS_phi_pair_1"), phiPair1); - histosData.fill(HIST("CS_phi_pair_2"), phiPair2); - histosData.fill(HIST("CS_costheta_pair_1"), cosThetaPair1); - histosData.fill(HIST("CS_costheta_pair_2"), cosThetaPair2); + histosData.fill(HIST("CS_phi_pair_1"), fourPiPhiPair1); + histosData.fill(HIST("CS_phi_pair_2"), fourPiPhiPair2); + histosData.fill(HIST("CS_costheta_pair_1"), fourPiCosThetaPair1); + histosData.fill(HIST("CS_costheta_pair_2"), fourPiCosThetaPair2); - histosData.fill(HIST("phi_cosTheta_pair_1"), phiPair1, cosThetaPair1); - histosData.fill(HIST("phi_cosTheta_pair_2"), phiPair2, cosThetaPair2); + histosData.fill(HIST("phi_cosTheta_pair_1"), fourPiPhiPair1, fourPiCosThetaPair1); + histosData.fill(HIST("phi_cosTheta_pair_2"), fourPiPhiPair2, fourPiCosThetaPair2); } if (p1234.Pt() > 0.15 && p1234.Pt() < 0.80) { histosData.fill(HIST("rapidity_event_0charge_WTS_PID_Pi_domainB"), p1234.Rapidity()); @@ -607,8 +712,9 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct if (!particle.has_mothers()) { continue; } - for (const auto& mother : particle.mothers_as()) { + // LOGF(info, "Mother ID: %d", mother.pdgCode()); + if (mother.pdgCode() == 30113) { motherVector.SetXYZM(mother.px(), mother.py(), mother.pz(), o2::constants::physics::MassPionCharged); histosMCgen.fill(HIST("MCgen_rhoPrime_pT"), motherVector.Pt()); @@ -620,16 +726,16 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct if (particle.pdgCode() == 211) { histosMCgen.fill(HIST("MCgen_particle_pT"), tempVector.Pt()); histosMCgen.fill(HIST("MCgen_particle_rapidity"), tempVector.Rapidity()); - // if(std::abs(tempVector.Rapidity()) < 0.9){ - piPlusvectors.push_back(tempVector); - // } + if (std::abs(tempVector.Eta()) < 0.9) { + piPlusvectors.push_back(tempVector); + } } if (particle.pdgCode() == -211) { histosMCgen.fill(HIST("MCgen_particle_pT"), tempVector.Pt()); histosMCgen.fill(HIST("MCgen_particle_rapidity"), tempVector.Rapidity()); - // if(std::abs(tempVector.Rapidity()) < 0.9){ - piMinusvectors.push_back(tempVector); - // } + if (std::abs(tempVector.Eta()) < 0.9) { + piMinusvectors.push_back(tempVector); + } } } // End of Mother ID 30113 rho prime } // End of loop over mothers @@ -717,11 +823,14 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct return; } + histosMCreco.fill(HIST("vertexZ"), collision.posZ()); histosMCreco.fill(HIST("V0A"), collision.totalFV0AmplitudeA()); histosMCreco.fill(HIST("FT0A"), collision.totalFT0AmplitudeA()); histosMCreco.fill(HIST("FT0C"), collision.totalFT0AmplitudeC()); histosMCreco.fill(HIST("ZDC_A"), collision.energyCommonZNA()); + LOGF(info, "ZDC_A: %f", collision.energyCommonZNA()); histosMCreco.fill(HIST("ZDC_C"), collision.energyCommonZNC()); + LOGF(info, "ZDC_C: %f", collision.energyCommonZNC()); if (strictEventSelection) { if (collision.numContrib() != 4) { @@ -773,6 +882,7 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosMCreco.fill(HIST("tofNSigmaPi_WOTS"), WOTS_tracks[i].tofNSigmaPi(), std::sqrt(WOTS_tracks[i].px() * WOTS_tracks[i].px() + WOTS_tracks[i].py() * WOTS_tracks[i].py())); histosMCreco.fill(HIST("pT_track_WOTS"), std::sqrt(WOTS_tracks[i].px() * WOTS_tracks[i].px() + WOTS_tracks[i].py() * WOTS_tracks[i].py())); histosMCreco.fill(HIST("rapidity_track_WOTS"), tempWOTS.Rapidity()); + } // End of loop over tracks without selection TLorentzVector tempWTS; @@ -784,6 +894,12 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosMCreco.fill(HIST("tofNSigmaPi_WTS"), WTS_tracks[i].tofNSigmaPi(), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py())); histosMCreco.fill(HIST("pT_track_WTS"), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py())); histosMCreco.fill(HIST("rapidity_track_WTS"), tempWTS.Rapidity()); + + histosMCreco.fill(HIST("itsChi2NCl"), WTS_tracks[i].itsChi2NCl()); + histosMCreco.fill(HIST("tpcChi2NCl"), WTS_tracks[i].tpcChi2NCl()); + histosMCreco.fill(HIST("tpcNClsFindable"), WTS_tracks[i].tpcNClsFindable()); + histosMCreco.fill(HIST("dcaXY"), WTS_tracks[i].dcaXY()); + histosMCreco.fill(HIST("dcaZ"), WTS_tracks[i].dcaZ()); } // End of loop over tracks with selection only TLorentzVector tempWTSPIDPi; From 9ac2a5d82b9cbfdba9fe18ef1a2109302df1cdee Mon Sep 17 00:00:00 2001 From: rbailhac Date: Wed, 5 Mar 2025 10:58:07 +0100 Subject: [PATCH 0544/1650] [PWGEM] No weights for quarks (#10326) --- PWGEM/Dilepton/Tasks/lmeeHFCocktail.cxx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/PWGEM/Dilepton/Tasks/lmeeHFCocktail.cxx b/PWGEM/Dilepton/Tasks/lmeeHFCocktail.cxx index 8e11295c810..d26c22c409a 100644 --- a/PWGEM/Dilepton/Tasks/lmeeHFCocktail.cxx +++ b/PWGEM/Dilepton/Tasks/lmeeHFCocktail.cxx @@ -76,7 +76,6 @@ const char* stageNames[Nstages] = {"gen", "meas", "meas_and_acc"}; template void doQuark(T& p, std::vector> hRapQuark, float ptMin, float etaMax, int pdg) { - float weight[Nstages] = {p.weight(), p.efficiency() * p.weight(), p.efficiency() * p.weight()}; float pt[Nstages] = {p.pt(), p.ptSmeared(), p.ptSmeared()}; float eta[Nstages] = {p.eta(), p.etaSmeared(), p.etaSmeared()}; float cut_pt[Nstages] = {0., 0., ptMin}; @@ -84,11 +83,11 @@ void doQuark(T& p, std::vector> hRapQuark, float ptMin, flo for (int i = 0; i < Nstages; i++) { if (pt[i] > cut_pt[i] && fabs(eta[i]) < cut_eta[i]) { if (pdg == 4) - hRapQuark[i]->Fill(p.cQuarkRap(), weight[i]); + hRapQuark[i]->Fill(p.cQuarkRap()); else if (pdg == 5) - hRapQuark[i]->Fill(p.bQuarkRap(), weight[i]); + hRapQuark[i]->Fill(p.bQuarkRap()); else - hRapQuark[i]->Fill(999., weight[i]); + hRapQuark[i]->Fill(999.); } } } From e6529bab4107465d739b9d303dd8959b5a11e758 Mon Sep 17 00:00:00 2001 From: czhang Date: Wed, 5 Mar 2025 11:32:49 +0100 Subject: [PATCH 0545/1650] [PWGDQ] Improve binning for flow analysis (#10314) --- PWGDQ/Core/HistogramsLibrary.cxx | 46 +++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 050b5113616..ff35c2f2b6f 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -1086,8 +1086,27 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "U2Q2_CentFT0C_ev2", "mass vs. centrality vs. U2Q2_event2", false, 125, 0.0, 5.0, VarManager::kMass, 9, 0.0, 90.0, VarManager::kCentFT0C, 100, -10.0, 10.0, VarManager::kU2Q2Ev2); } if (subGroupStr.Contains("metest")) { - hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V2ME_SP", "Mass_Pt_CentFT0C_V2ME_SP", true, 250, 0.0, 5.0, VarManager::kMass, 200, 0.0, 20.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV2ME_SP, VarManager::kWV2ME_SP); - hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V2ME_EP", "Mass_Pt_CentFT0C_V2ME_EP", true, 250, 0.0, 5.0, VarManager::kMass, 200, 0.0, 20.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV2ME_EP, VarManager::kWV2ME_EP); + double MassBinEdges[251]; // 0-5GeV/c2 + for (int i = 0; i < 251; i++) { + MassBinEdges[i] = i * 0.02; + } + + double PtBinEdges[49]; // 0-20GeV/c + for (int i = 0; i < 49; i++) { + if (i <= 9) { + PtBinEdges[i] = i / 10.; + } else { + PtBinEdges[i] = (i - 10) * 0.5 + 1.; + } + } + + double CentBinEdges[19]; // 0-90% + for (int i = 0; i < 19; i++) { + CentBinEdges[i] = i * 5; + } + + hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V2ME_SP", "Mass_Pt_CentFT0C_V2ME_SP", true, 250, MassBinEdges, VarManager::kMass, 48, PtBinEdges, VarManager::kPt, 18, CentBinEdges, VarManager::kCentFT0C, "", "", "", VarManager::kV2ME_SP, VarManager::kWV2ME_SP); + hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V2ME_EP", "Mass_Pt_CentFT0C_V2ME_EP", true, 250, MassBinEdges, VarManager::kMass, 48, PtBinEdges, VarManager::kPt, 18, CentBinEdges, VarManager::kCentFT0C, "", "", "", VarManager::kV2ME_EP, VarManager::kWV2ME_EP); } if (subGroupStr.Contains("cumulantme")) { hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_M11REFoverMpME", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 9, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kM11REFoverMpME); @@ -1308,8 +1327,27 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h // hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_V3", "", 6, varV3, bins, minBins, maxBins, 0, -1, kTRUE); // removed temporarily } if (subGroupStr.Contains("flow-ccdb")) { - hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V2SPwR", "Mass_Pt_CentFT0C_V2SPwR", true, 250, 0.0, 5.0, VarManager::kMass, 200, 0.0, 20.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV2SP, VarManager::kWV2SP); - hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V2EPwR", "Mass_Pt_CentFT0C_V2EPwR", true, 250, 0.0, 5.0, VarManager::kMass, 200, 0.0, 20.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV2EP, VarManager::kWV2EP); + double MassBinEdges[251]; // 0-5GeV/c2 + for (int i = 0; i < 251; i++) { + MassBinEdges[i] = i * 0.02; + } + + double PtBinEdges[49]; // 0-20GeV/c + for (int i = 0; i < 49; i++) { + if (i <= 9) { + PtBinEdges[i] = i / 10.; + } else { + PtBinEdges[i] = (i - 10) * 0.5 + 1.; + } + } + + double CentBinEdges[19]; // 0-90% + for (int i = 0; i < 19; i++) { + CentBinEdges[i] = i * 5; + } + + hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V2SPwR", "Mass_Pt_CentFT0C_V2SPwR", true, 250, MassBinEdges, VarManager::kMass, 48, PtBinEdges, VarManager::kPt, 18, CentBinEdges, VarManager::kCentFT0C, "", "", "", VarManager::kV2SP, VarManager::kWV2SP); + hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V2EPwR", "Mass_Pt_CentFT0C_V2EPwR", true, 250, MassBinEdges, VarManager::kMass, 48, PtBinEdges, VarManager::kPt, 18, CentBinEdges, VarManager::kCentFT0C, "", "", "", VarManager::kV2EP, VarManager::kWV2EP); } if (subGroupStr.Contains("cumulant")) { int var[4] = {VarManager::kMass, VarManager::kPt, VarManager::kRap, VarManager::kCentFT0C}; From 163a4f1a5ee812973d231025165482ff5eccd888 Mon Sep 17 00:00:00 2001 From: czhang Date: Wed, 5 Mar 2025 11:33:46 +0100 Subject: [PATCH 0546/1650] [PWGDQ] Couple of updates regarding muon (re-)alignment (#10313) --- PWGDQ/TableProducer/tableMaker.cxx | 19 ++++++++++++++++++- PWGDQ/Tasks/mchAlignRecord.cxx | 15 +++++++-------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/PWGDQ/TableProducer/tableMaker.cxx b/PWGDQ/TableProducer/tableMaker.cxx index 3abfcb317e7..1922ab6e1ab 100644 --- a/PWGDQ/TableProducer/tableMaker.cxx +++ b/PWGDQ/TableProducer/tableMaker.cxx @@ -1123,7 +1123,24 @@ struct TableMaker { for (const auto& muonId : fwdtrackIndices) { // start loop over tracks auto muon = muonId.template fwdtrack_as(); trackFilteringTag = static_cast(0); - VarManager::FillTrack(muon); + if constexpr (static_cast(TMuonRealignFillMap)) { + // Update muon information using realigned tracks + if (static_cast(muon.trackType()) > 2) { + // Update only MCH or MCH-MID tracks with realigned information + auto muonRealignSelected = tracksMuonRealign.select(aod::fwdtrackrealign::fwdtrackId == muonId.fwdtrackId() && aod::fwdtrackrealign::collisionId == collision.globalIndex()); + if (muonRealignSelected.size() == 1) { + for (const auto& muonRealign : muonRealignSelected) { + VarManager::FillTrack(muonRealign); + } + } else { + LOGF(fatal, "Inconsistent size of realigned muon track candidates."); + } + } else { + VarManager::FillTrack(muon); + } + } else { + VarManager::FillTrack(muon); + } if (muon.index() > idxPrev + 1) { // checks if some muons are filtered even before the skimming function nDel += muon.index() - (idxPrev + 1); diff --git a/PWGDQ/Tasks/mchAlignRecord.cxx b/PWGDQ/Tasks/mchAlignRecord.cxx index f1339c5d4a1..2f612493b6e 100644 --- a/PWGDQ/Tasks/mchAlignRecord.cxx +++ b/PWGDQ/Tasks/mchAlignRecord.cxx @@ -20,6 +20,7 @@ #include #include #include +#include #include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" @@ -117,8 +118,8 @@ struct mchAlignRecordTask { Configurable fAllowedVarZ{"variation-z", 2.0, "Allowed variation for z axis in cm"}; Configurable cfgSigmaX{"cfgSigmaX", 1000., "Sigma cut along X"}; Configurable cfgSigmaY{"cfgSigmaY", 1000., "Sigma cut along Y"}; - Configurable cfgChamberResolutionX{"cfgChamberResolutionX", 0.04, "Chamber resolution along X configuration for refit"}; // 0.4cm pp, 0.2cm PbPb - Configurable cfgChamberResolutionY{"cfgChamberResolutionY", 0.04, "Chamber resolution along Y configuration for refit"}; // 0.4cm pp, 0.2cm PbPb + Configurable cfgChamberResolutionX{"cfgChamberResolutionX", 0.4, "Chamber resolution along X configuration for refit"}; // 0.4cm pp, 0.2cm PbPb + Configurable cfgChamberResolutionY{"cfgChamberResolutionY", 0.4, "Chamber resolution along Y configuration for refit"}; // 0.4cm pp, 0.2cm PbPb Configurable cfgSigmaCutImprove{"cfgSigmaCutImprove", 6., "Sigma cut for track improvement"}; struct : ConfigurableGroup { Configurable> cfgDetElem{"cfgDetElem", @@ -129,6 +130,8 @@ struct mchAlignRecordTask { "List of param mask for d.o.f to be fixed"}; } fFixDetElem; + Preslice perMuon = aod::fwdtrkcl::fwdtrackId; + void init(InitContext& ic) { @@ -335,13 +338,9 @@ struct mchAlignRecordTask { continue; } + auto clustersSliced = clusters.sliceBy(perMuon, track.globalIndex()); // Slice clusters by muon id // Loop over attached clusters - for (auto const& cluster : clusters) { - - if (cluster.template fwdtrack_as() != track) { - continue; - } - + for (auto const& cluster : clustersSliced) { clIndex += 1; mch::Cluster* mch_cluster = new mch::Cluster(); From e5baf95ccca744c5c94edac9453ea560e0c3958d Mon Sep 17 00:00:00 2001 From: Luca Barioglio Date: Wed, 5 Mar 2025 12:30:30 +0100 Subject: [PATCH 0547/1650] [PWGLF] Fix histogram type (#10328) --- PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx index aad2ff9afe4..edcce86ae1a 100644 --- a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx +++ b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx @@ -494,7 +494,7 @@ struct nucleiSpectra { {cfgDCAxyBinsAlpha, "DCA_{z} (cm)"}}; const AxisSpec etaAxis{40, -1., 1., "#eta"}; - spectra.add("hEventSelections", "hEventSelections", {HistType::kTH1I, {{nuclei::evSel::kNevSels + 1, -0.5f, float(nuclei::evSel::kNevSels) + 0.5f}}}); + spectra.add("hEventSelections", "hEventSelections", {HistType::kTH1D, {{nuclei::evSel::kNevSels + 1, -0.5f, float(nuclei::evSel::kNevSels) + 0.5f}}}); spectra.get(HIST("hEventSelections"))->GetXaxis()->SetBinLabel(1, "all"); spectra.get(HIST("hEventSelections"))->GetXaxis()->SetBinLabel(nuclei::evSel::kTVX + 2, "TVX"); spectra.get(HIST("hEventSelections"))->GetXaxis()->SetBinLabel(nuclei::evSel::kZvtx + 2, "Zvtx"); From 9659729693ca4fdb2cb227ef2623054393fdb6b9 Mon Sep 17 00:00:00 2001 From: rolavick Date: Wed, 5 Mar 2025 13:43:40 +0100 Subject: [PATCH 0548/1650] [PWGUD] UDtables modification to store eventselection bits (#10309) Co-authored-by: ALICE Action Bot --- PWGUD/DataModel/UDTables.h | 30 +- PWGUD/TableProducer/Converters/CMakeLists.txt | 5 + .../UDCollisionSelExtrasV002Converter.cxx | 98 ++++ PWGUD/TableProducer/DGCandProducer.cxx | 31 +- PWGUD/TableProducer/SGCandProducer.cxx | 30 +- PWGUD/TableProducer/UPCCandidateProducer.cxx | 53 +- PWGUD/Tasks/upcTauRl.cxx | 536 ++++++++---------- 7 files changed, 412 insertions(+), 371 deletions(-) create mode 100644 PWGUD/TableProducer/Converters/UDCollisionSelExtrasV002Converter.cxx diff --git a/PWGUD/DataModel/UDTables.h b/PWGUD/DataModel/UDTables.h index b3f1f2354a2..b84f6cd26e7 100644 --- a/PWGUD/DataModel/UDTables.h +++ b/PWGUD/DataModel/UDTables.h @@ -106,6 +106,11 @@ DECLARE_SOA_COLUMN(HadronicRate, hadronicRate, double); DECLARE_SOA_COLUMN(Trs, trs, int); DECLARE_SOA_COLUMN(Trofs, trofs, int); DECLARE_SOA_COLUMN(Hmpr, hmpr, int); +DECLARE_SOA_COLUMN(TFb, tfb, int); +DECLARE_SOA_COLUMN(ITSROFb, itsROFb, int); +DECLARE_SOA_COLUMN(Sbp, sbp, int); +DECLARE_SOA_COLUMN(ZvtxFT0vPV, zVtxFT0vPV, int); +DECLARE_SOA_COLUMN(VtxITSTPC, vtxITSTPC, int); // Gap Side Information DECLARE_SOA_COLUMN(GapSide, gapSide, uint8_t); // 0 for side A, 1 for side C, 2 for both sides (or use an enum for better readability) // FIT selection flags @@ -223,9 +228,26 @@ DECLARE_SOA_TABLE_VERSIONED(UDCollisionSelExtras_001, "AOD", "UDCOLSELEXTRA", 1, udcollision::ChFV0A, //! number of active channels in FV0A udcollision::OccupancyInTime, //! Occupancy udcollision::HadronicRate, //! Interaction Rate - udcollision::Trs, - udcollision::Trofs, - udcollision::Hmpr); + udcollision::Trs, //! kNoCollInTimeRangeStandard + udcollision::Trofs, //! kNoCollInRofStandard + udcollision::Hmpr); //! kNoHighMultCollInPrevRof + +DECLARE_SOA_TABLE_VERSIONED(UDCollisionSelExtras_002, "AOD", "UDCOLSELEXTRA", 2, + udcollision::ChFT0A, //! number of active channels in FT0A + udcollision::ChFT0C, //! number of active channels in FT0C + udcollision::ChFDDA, //! number of active channels in FDDA + udcollision::ChFDDC, //! number of active channels in FDDC + udcollision::ChFV0A, //! number of active channels in FV0A + udcollision::OccupancyInTime, //! Occupancy + udcollision::HadronicRate, //! Interaction Rate + udcollision::Trs, //! kNoCollInTimeRangeStandard + udcollision::Trofs, //! kNoCollInRofStandard + udcollision::Hmpr, //! kNoHighMultCollInPrevRof + udcollision::TFb, //! kNoTimeFrameBorder + udcollision::ITSROFb, //! kNoITSROFrameBorder + udcollision::Sbp, //! kNoSameBunchPileup + udcollision::ZvtxFT0vPV, //! kIsGoodZvtxFT0vsPV + udcollision::VtxITSTPC); //! kIsVertexITSTPC // central barrel-specific selections DECLARE_SOA_TABLE(UDCollisionsSelsCent, "AOD", "UDCOLSELCNT", @@ -250,7 +272,7 @@ DECLARE_SOA_TABLE(UDMcCollsLabels, "AOD", "UDMCCOLLSLABEL", udcollision::UDMcCollisionId); using UDCollisions = UDCollisions_001; -using UDCollisionSelExtras = UDCollisionSelExtras_001; +using UDCollisionSelExtras = UDCollisionSelExtras_002; using UDCollision = UDCollisions::iterator; using SGCollision = SGCollisions::iterator; diff --git a/PWGUD/TableProducer/Converters/CMakeLists.txt b/PWGUD/TableProducer/Converters/CMakeLists.txt index 55267c0785b..8230278b45c 100644 --- a/PWGUD/TableProducer/Converters/CMakeLists.txt +++ b/PWGUD/TableProducer/Converters/CMakeLists.txt @@ -24,3 +24,8 @@ o2physics_add_dpl_workflow(collisionselextras-converter SOURCES UDCollisionSelExtrasConverter.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(collisionselextras-converter-v002 + SOURCES UDCollisionSelExtrasV002Converter.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + COMPONENT_NAME Analysis) diff --git a/PWGUD/TableProducer/Converters/UDCollisionSelExtrasV002Converter.cxx b/PWGUD/TableProducer/Converters/UDCollisionSelExtrasV002Converter.cxx new file mode 100644 index 00000000000..b10b467ec4d --- /dev/null +++ b/PWGUD/TableProducer/Converters/UDCollisionSelExtrasV002Converter.cxx @@ -0,0 +1,98 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file UDCollisionSelExtrasV002Converter.cxx +/// \brief Converts UDCollisionSelExtras table from version 000 to 002 and 001 to 002 +/// \author Roman Lavicka + +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "PWGUD/DataModel/UDTables.h" + +using namespace o2; +using namespace o2::framework; + +// Converts UDCollisions for version 000 to 002 and 001 to 002 +struct UDCollisionSelExtrasV002Converter { + Produces udCollisionSelExtras_002; + + void init(InitContext const&) + { + if (!doprocessV000ToV002 && !doprocessV001ToV002) { + LOGF(fatal, "Neither processV000ToV002 nor processV001ToV002 is enabled. Please choose one!"); + } + if (doprocessV000ToV002 && doprocessV001ToV002) { + LOGF(fatal, "Both processV000ToV002 and processV001ToV002 are enabled. Please choose only one!"); + } + } + + void processV000ToV002(o2::aod::UDCollisionSelExtras_000 const& collisions) + { + + for (const auto& collision : collisions) { + + udCollisionSelExtras_002(collision.chFT0A(), + collision.chFT0C(), + collision.chFDDA(), + collision.chFDDC(), + collision.chFV0A(), + 0, // dummy occupancy + 0.0f, // dummy rate + 0, // dummy trs + 0, // dummy trofs + 0, // dummy hmpr + 0, // dummy tfb + 0, // dummy itsROFb + 0, // dummy sbp + 0, // dummy zVtxFT0vPV + 0); // dummy vtxITSTPC + } + } + PROCESS_SWITCH(UDCollisionSelExtrasV002Converter, processV000ToV002, "process v000-to-v002 conversion", false); + + void processV001ToV002(o2::aod::UDCollisionSelExtras_001 const& collisions) + { + + for (const auto& collision : collisions) { + + udCollisionSelExtras_002(collision.chFT0A(), + collision.chFT0C(), + collision.chFDDA(), + collision.chFDDC(), + collision.chFV0A(), + collision.occupancyInTime(), + collision.hadronicRate(), + collision.trs(), + collision.trofs(), + collision.hmpr(), + 0, // dummy tfb + 0, // dummy itsROFb + 0, // dummy sbp + 0, // dummy zVtxFT0vPV + 0); // dummy vtxITSTPC + } + } + PROCESS_SWITCH(UDCollisionSelExtrasV002Converter, processV001ToV002, "process v001-to-v002 conversion", true); +}; + +/// Spawn the extended table for UDCollisionSelExtras002 to avoid the call to the internal spawner and a consequent circular dependency +// struct UDCollisionSelExtrasSpawner { +// Spawns udCollisionSelExtras_002; +// }; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc), + // adaptAnalysisTask(cfgc), + }; +} diff --git a/PWGUD/TableProducer/DGCandProducer.cxx b/PWGUD/TableProducer/DGCandProducer.cxx index a33ae48bb33..9aa418d8573 100644 --- a/PWGUD/TableProducer/DGCandProducer.cxx +++ b/PWGUD/TableProducer/DGCandProducer.cxx @@ -283,19 +283,14 @@ struct DGCandProducer { LOGF(debug, " BC id %d", bc.globalBC()); const uint64_t ts = bc.timestamp(); const int runnumber = bc.runNumber(); - - int trs = 0; - if (collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { - trs = 1; - } - int trofs = 0; - if (collision.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { - trofs = 1; - } - int hmpr = 0; - if (collision.selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof)) { - hmpr = 1; - } + int trs = collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard) ? 1 : 0; + int trofs = collision.selection_bit(o2::aod::evsel::kNoCollInRofStandard) ? 1 : 0; + int hmpr = collision.selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof) ? 1 : 0; + int tfb = collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder) ? 1 : 0; + int itsROFb = collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder) ? 1 : 0; + int sbp = collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup) ? 1 : 0; + int zVtxFT0vPv = collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV) ? 1 : 0; + int vtxITSTPC = collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC) ? 1 : 0; double ir = 0.; if (bc.has_zdc()) { ir = mRateFetcher.fetch(ccdb.service, ts, runnumber, "ZNC hadronic") * 1.e-3; @@ -305,8 +300,7 @@ struct DGCandProducer { uint8_t chFDDA = 0; uint8_t chFDDC = 0; uint8_t chFV0A = 0; - int occ = 0; - occ = collision.trackOccupancyInTimeRange(); + int occ = collision.trackOccupancyInTimeRange(); if (cfgSkimmedProcessing) { // update ccdb setting for zorro @@ -347,10 +341,7 @@ struct DGCandProducer { // update DG candidates tables auto rtrwTOF = udhelpers::rPVtrwTOF(tracks, collision.numContrib()); - int upc_flag = 0; - ushort flags = collision.flags(); - if (flags & dataformats::Vertex>::Flags::UPCMode) - upc_flag = 1; + int upc_flag = (collision.flags() & dataformats::Vertex>::Flags::UPCMode) ? 1 : 0; outputCollisions(bc.globalBC(), bc.runNumber(), collision.posX(), collision.posY(), collision.posZ(), upc_flag, collision.numContrib(), udhelpers::netCharge(tracks), @@ -363,7 +354,7 @@ struct DGCandProducer { fitInfo.BBFT0Apf, fitInfo.BBFT0Cpf, fitInfo.BGFT0Apf, fitInfo.BGFT0Cpf, fitInfo.BBFV0Apf, fitInfo.BGFV0Apf, fitInfo.BBFDDApf, fitInfo.BBFDDCpf, fitInfo.BGFDDApf, fitInfo.BGFDDCpf); - outputCollisionSelExtras(chFT0A, chFT0C, chFDDA, chFDDC, chFV0A, occ, ir, trs, trofs, hmpr); + outputCollisionSelExtras(chFT0A, chFT0C, chFDDA, chFDDC, chFV0A, occ, ir, trs, trofs, hmpr, tfb, itsROFb, sbp, zVtxFT0vPv, vtxITSTPC); outputCollsLabels(collision.globalIndex()); // update DGTracks tables diff --git a/PWGUD/TableProducer/SGCandProducer.cxx b/PWGUD/TableProducer/SGCandProducer.cxx index 98fe249dfe6..07eaa7891b7 100644 --- a/PWGUD/TableProducer/SGCandProducer.cxx +++ b/PWGUD/TableProducer/SGCandProducer.cxx @@ -219,18 +219,14 @@ struct SGCandProducer { return; } getHist(TH1, histdir + "/Stat")->Fill(6., 1.); - int trs = 0; - if (collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { - trs = 1; - } - int trofs = 0; - if (collision.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { - trofs = 1; - } - int hmpr = 0; - if (collision.selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof)) { - hmpr = 1; - } + int trs = collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard) ? 1 : 0; + int trofs = collision.selection_bit(o2::aod::evsel::kNoCollInRofStandard) ? 1 : 0; + int hmpr = collision.selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof) ? 1 : 0; + int tfb = collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder) ? 1 : 0; + int itsROFb = collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder) ? 1 : 0; + int sbp = collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup) ? 1 : 0; + int zVtxFT0vPv = collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV) ? 1 : 0; + int vtxITSTPC = collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC) ? 1 : 0; auto bc = collision.template foundBC_as(); double ir = 0.; const uint64_t ts = bc.timestamp(); @@ -265,14 +261,10 @@ struct SGCandProducer { uint8_t chFDDA = 0; uint8_t chFDDC = 0; uint8_t chFV0A = 0; - int occ = 0; - occ = collision.trackOccupancyInTimeRange(); + int occ = collision.trackOccupancyInTimeRange(); udhelpers::getFITinfo(fitInfo, newbc, bcs, ft0s, fv0as, fdds); + int upc_flag = (collision.flags() & dataformats::Vertex>::Flags::UPCMode) ? 1 : 0; // update SG candidates tables - int upc_flag = 0; - ushort flags = collision.flags(); - if (flags & dataformats::Vertex>::Flags::UPCMode) - upc_flag = 1; outputCollisions(bc.globalBC(), bc.runNumber(), collision.posX(), collision.posY(), collision.posZ(), upc_flag, collision.numContrib(), udhelpers::netCharge(tracks), @@ -287,7 +279,7 @@ struct SGCandProducer { fitInfo.BBFT0Apf, fitInfo.BBFT0Cpf, fitInfo.BGFT0Apf, fitInfo.BGFT0Cpf, fitInfo.BBFV0Apf, fitInfo.BGFV0Apf, fitInfo.BBFDDApf, fitInfo.BBFDDCpf, fitInfo.BGFDDApf, fitInfo.BGFDDCpf); - outputCollisionSelExtras(chFT0A, chFT0C, chFDDA, chFDDC, chFV0A, occ, ir, trs, trofs, hmpr); + outputCollisionSelExtras(chFT0A, chFT0C, chFDDA, chFDDC, chFV0A, occ, ir, trs, trofs, hmpr, tfb, itsROFb, sbp, zVtxFT0vPv, vtxITSTPC); outputCollsLabels(collision.globalIndex()); if (newbc.has_zdc()) { auto zdc = newbc.zdc(); diff --git a/PWGUD/TableProducer/UPCCandidateProducer.cxx b/PWGUD/TableProducer/UPCCandidateProducer.cxx index 4694458b6fb..e7f029ae91d 100644 --- a/PWGUD/TableProducer/UPCCandidateProducer.cxx +++ b/PWGUD/TableProducer/UPCCandidateProducer.cxx @@ -704,10 +704,7 @@ struct UpcCandProducer { o2::aod::Collisions const& /*collisions*/, ForwardTracks const& fwdTracks, o2::aod::AmbiguousFwdTracks const& /*ambFwdTracks*/, - std::unordered_map& ambFwdTrBCs, - std::unordered_map& bcTRS, - std::unordered_map& bcTROFS, - std::unordered_map& bcHMPR) + std::unordered_map& ambFwdTrBCs) { for (const auto& trk : fwdTracks) { if (trk.trackType() != typeFilter) @@ -717,27 +714,12 @@ struct UpcCandProducer { int64_t trkId = trk.globalIndex(); int32_t nContrib = -1; uint64_t trackBC = 0; - int64_t trs = 0; // for kNoCollInTimeRangeStandard - int64_t trofs = 0; // for kNoCollInRofStandard - int64_t hmpr = 0; // for kNoHighMultCollInPrevRof auto ambIter = ambFwdTrBCs.find(trkId); if (ambIter == ambFwdTrBCs.end()) { const auto& col = trk.collision(); nContrib = col.numContrib(); trackBC = col.bc_as().globalBC(); const auto& bc = col.bc_as(); - if (bc.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { - trs = 1; - } - if (bc.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { - trofs = 1; - } - if (bc.selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof)) { - hmpr = 1; - } - bcTRS[trackBC] = trs; - bcTROFS[trackBC] = trofs; - bcHMPR[trackBC] = hmpr; if (fRequireNoTimeFrameBorder && !bc.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { continue; // skip this track if the kNoTimeFrameBorder bit is required but not set } @@ -1530,7 +1512,7 @@ struct UpcCandProducer { fitInfo.BBFT0Apf, fitInfo.BBFT0Cpf, fitInfo.BGFT0Apf, fitInfo.BGFT0Cpf, fitInfo.BBFV0Apf, fitInfo.BGFV0Apf, fitInfo.BBFDDApf, fitInfo.BBFDDCpf, fitInfo.BGFDDApf, fitInfo.BGFDDCpf); - eventCandidatesSelExtras(chFT0A, chFT0C, chFDDA, chFDDC, chFV0A, 0, 0, 0, 0, 0); + eventCandidatesSelExtras(chFT0A, chFT0C, chFDDA, chFDDC, chFV0A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); eventCandidatesSelsFwd(fitInfo.distClosestBcV0A, fitInfo.distClosestBcT0A, amplitudesT0A, @@ -1569,11 +1551,6 @@ struct UpcCandProducer { std::vector bcsMatchedTrIdsMCH; std::vector bcsMatchedTrIdsGlobal; - // to store selection bits - std::unordered_map bcTRS; - std::unordered_map bcTROFS; - std::unordered_map bcHMPR; - // trackID -> index in amb. track table std::unordered_map ambFwdTrBCs; collectAmbTrackBCs<1, BCsWithBcSels>(ambFwdTrBCs, ambFwdTracks); @@ -1591,8 +1568,7 @@ struct UpcCandProducer { collectForwardGlobalTracks(bcsMatchedTrIdsGlobal, o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack, bcs, collisions, - fwdTracks, ambFwdTracks, ambFwdTrBCs, - bcTRS, bcTROFS, bcHMPR); + fwdTracks, ambFwdTracks, ambFwdTrBCs); std::sort(bcsMatchedTrIdsMID.begin(), bcsMatchedTrIdsMID.end(), [](const auto& left, const auto& right) { return left.first < right.first; }); @@ -1747,6 +1723,14 @@ struct UpcCandProducer { std::vector relBCsV0A{}; uint8_t chFT0A = 0; uint8_t chFT0C = 0; + int trs = 0; + int trofs = 0; + int hmpr = 0; + int tfb = 0; + int itsROFb = 0; + int sbp = 0; + int zVtxFT0vPv = 0; + int vtxITSTPC = 0; if (nFT0s > 0) { uint64_t closestBcT0A = findClosestBC(globalBC, mapGlobalBcWithT0A); int64_t distClosestBcT0A = globalBC - static_cast(closestBcT0A); @@ -1763,6 +1747,15 @@ struct UpcCandProducer { fitInfo.ampFT0C = std::accumulate(t0AmpsC.begin(), t0AmpsC.end(), 0.f); chFT0A = ft0.amplitudeA().size(); chFT0C = ft0.amplitudeC().size(); + // get selection flags per BC + trs = ft0.bc_as().selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard) ? 1 : 0; + trofs = ft0.bc_as().selection_bit(o2::aod::evsel::kNoCollInRofStandard) ? 1 : 0; + hmpr = ft0.bc_as().selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof) ? 1 : 0; + tfb = ft0.bc_as().selection_bit(o2::aod::evsel::kNoTimeFrameBorder) ? 1 : 0; + itsROFb = ft0.bc_as().selection_bit(o2::aod::evsel::kNoITSROFrameBorder) ? 1 : 0; + sbp = ft0.bc_as().selection_bit(o2::aod::evsel::kNoSameBunchPileup) ? 1 : 0; + zVtxFT0vPv = ft0.bc_as().selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV) ? 1 : 0; + vtxITSTPC = ft0.bc_as().selection_bit(o2::aod::evsel::kIsVertexITSTPC) ? 1 : 0; fillAmplitudes(ft0s, mapGlobalBcWithT0A, amplitudesT0A, relBCsT0A, globalBC); } uint8_t chFV0A = 0; @@ -1835,11 +1828,7 @@ struct UpcCandProducer { fitInfo.BBFT0Apf, fitInfo.BBFT0Cpf, fitInfo.BGFT0Apf, fitInfo.BGFT0Cpf, fitInfo.BBFV0Apf, fitInfo.BGFV0Apf, fitInfo.BBFDDApf, fitInfo.BBFDDCpf, fitInfo.BGFDDApf, fitInfo.BGFDDCpf); - // get selection flags per BC - int trsVal = bcTRS.count(globalBC) ? bcTRS[globalBC] : 0; - int trofsVal = bcTROFS.count(globalBC) ? bcTROFS[globalBC] : 0; - int hmprVal = bcHMPR.count(globalBC) ? bcHMPR[globalBC] : 0; - eventCandidatesSelExtras(chFT0A, chFT0C, chFDDA, chFDDC, chFV0A, 0, 0, trsVal, trofsVal, hmprVal); + eventCandidatesSelExtras(chFT0A, chFT0C, chFDDA, chFDDC, chFV0A, 0, 0, trs, trofs, hmpr, tfb, itsROFb, sbp, zVtxFT0vPv, vtxITSTPC); eventCandidatesSelsFwd(fitInfo.distClosestBcV0A, fitInfo.distClosestBcT0A, amplitudesT0A, diff --git a/PWGUD/Tasks/upcTauRl.cxx b/PWGUD/Tasks/upcTauRl.cxx index 21f2a19d060..adf85fa8629 100644 --- a/PWGUD/Tasks/upcTauRl.cxx +++ b/PWGUD/Tasks/upcTauRl.cxx @@ -51,7 +51,72 @@ using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::constants::physics; +namespace o2::aod +{ +namespace tau_tree +{ +// event info +DECLARE_SOA_COLUMN(RunNumber, runNumber, int32_t); +DECLARE_SOA_COLUMN(Bc, bc, int); +DECLARE_SOA_COLUMN(TotalTracks, totalTracks, int); +DECLARE_SOA_COLUMN(NumContrib, numContrib, int); +DECLARE_SOA_COLUMN(GlobalNonPVtracks, globalNonPVtracks, int); +DECLARE_SOA_COLUMN(PosX, posX, float); +DECLARE_SOA_COLUMN(PosY, posY, float); +DECLARE_SOA_COLUMN(PosZ, posZ, float); +DECLARE_SOA_COLUMN(RecoMode, recoMode, int); +DECLARE_SOA_COLUMN(OccupancyInTime, occupancyInTime, int); +DECLARE_SOA_COLUMN(HadronicRate, hadronicRate, double); +DECLARE_SOA_COLUMN(Trs, trs, int); +DECLARE_SOA_COLUMN(Trofs, trofs, int); +DECLARE_SOA_COLUMN(Hmpr, hmpr, int); +DECLARE_SOA_COLUMN(TFb, tfb, int); +DECLARE_SOA_COLUMN(ITSROFb, itsROFb, int); +DECLARE_SOA_COLUMN(Sbp, sbp, int); +DECLARE_SOA_COLUMN(ZvtxFT0vPV, zVtxFT0vPV, int); +DECLARE_SOA_COLUMN(VtxITSTPC, vtxITSTPC, int); +// FIT info +DECLARE_SOA_COLUMN(TotalFT0AmplitudeA, totalFT0AmplitudeA, float); +DECLARE_SOA_COLUMN(TotalFT0AmplitudeC, totalFT0AmplitudeC, float); +DECLARE_SOA_COLUMN(TotalFV0AmplitudeA, totalFV0AmplitudeA, float); +DECLARE_SOA_COLUMN(TimeFT0A, timeFT0A, float); +DECLARE_SOA_COLUMN(TimeFT0C, timeFT0C, float); +DECLARE_SOA_COLUMN(TimeFV0A, timeFV0A, float); +// tracks +DECLARE_SOA_COLUMN(TrkPx, trkPx, float[2]); +DECLARE_SOA_COLUMN(TrkPy, trkPy, float[2]); +DECLARE_SOA_COLUMN(TrkPz, trkPz, float[2]); +DECLARE_SOA_COLUMN(TrkSign, trkSign, int[2]); +DECLARE_SOA_COLUMN(TrkDCAxy, trkDCAxy, float[2]); +DECLARE_SOA_COLUMN(TrkDCAz, trkDCAz, float[2]); +DECLARE_SOA_COLUMN(TrkTPCsignal, trkTPCsignal, float[2]); +DECLARE_SOA_COLUMN(TrkTPCnSigmaEl, trkTPCnSigmaEl, float[2]); +DECLARE_SOA_COLUMN(TrkTPCnSigmaMu, trkTPCnSigmaMu, float[2]); +DECLARE_SOA_COLUMN(TrkTPCnSigmaPi, trkTPCnSigmaPi, float[2]); +DECLARE_SOA_COLUMN(TrkTPCnSigmaKa, trkTPCnSigmaKa, float[2]); +DECLARE_SOA_COLUMN(TrkTPCnSigmaPr, trkTPCnSigmaPr, float[2]); +DECLARE_SOA_COLUMN(TrkTOFsignal, trkTOFsignal, float[2]); +DECLARE_SOA_COLUMN(TrkTOFnSigmaEl, trkTOFnSigmaEl, float[2]); +DECLARE_SOA_COLUMN(TrkTOFnSigmaMu, trkTOFnSigmaMu, float[2]); +DECLARE_SOA_COLUMN(TrkTOFnSigmaPi, trkTOFnSigmaPi, float[2]); +DECLARE_SOA_COLUMN(TrkTOFnSigmaKa, trkTOFnSigmaKa, float[2]); +DECLARE_SOA_COLUMN(TrkTOFnSigmaPr, trkTOFnSigmaPr, float[2]); + +} // namespace tau_tree +DECLARE_SOA_TABLE(TauTwoTracks, "AOD", "TAUTWOTRACK", + tau_tree::RunNumber, tau_tree::Bc, tau_tree::TotalTracks, tau_tree::NumContrib, tau_tree::GlobalNonPVtracks, tau_tree::PosX, tau_tree::PosY, tau_tree::PosZ, + tau_tree::RecoMode, tau_tree::OccupancyInTime, tau_tree::HadronicRate, + tau_tree::Trs, tau_tree::Trofs, tau_tree::Hmpr, tau_tree::TFb, tau_tree::ITSROFb, tau_tree::Sbp, tau_tree::ZvtxFT0vPV, tau_tree::VtxITSTPC, + tau_tree::TotalFT0AmplitudeA, tau_tree::TotalFT0AmplitudeC, tau_tree::TotalFV0AmplitudeA, + tau_tree::TimeFT0A, tau_tree::TimeFT0C, tau_tree::TimeFV0A, + tau_tree::TrkPx, tau_tree::TrkPy, tau_tree::TrkPz, tau_tree::TrkSign, tau_tree::TrkDCAxy, tau_tree::TrkDCAz, + tau_tree::TrkTPCsignal, tau_tree::TrkTPCnSigmaEl, tau_tree::TrkTPCnSigmaMu, tau_tree::TrkTPCnSigmaPi, tau_tree::TrkTPCnSigmaKa, tau_tree::TrkTPCnSigmaPr, + tau_tree::TrkTOFsignal, tau_tree::TrkTOFnSigmaEl, tau_tree::TrkTOFnSigmaMu, tau_tree::TrkTOFnSigmaPi, tau_tree::TrkTOFnSigmaKa, tau_tree::TrkTOFnSigmaPr); + +} // namespace o2::aod + struct UpcTauRl { + Produces tauTwoTracks; // Global varialbes bool isMC = false; @@ -64,11 +129,11 @@ struct UpcTauRl { Configurable verboseInfo{"verboseInfo", false, {"Print general info to terminal; default it false."}}; Configurable doMainHistos{"doMainHistos", false, {"Fill main histos"}}; Configurable doPIDhistos{"doPIDhistos", false, {"Fill PID histos"}}; - Configurable doMixedEventsHistos{"doMixedEventsHistos", false, {"Fill mixed events histos"}}; Configurable doTruthHistos{"doTruthHistos", false, {"Do histograms specific for generated events/particles"}}; Configurable doMCtrueElectronCheck{"doMCtrueElectronCheck", false, {"Check if track hypothesis corresponds to MC truth. If no, it cuts."}}; Configurable oppositeMCtrueElectronCheck{"oppositeMCtrueElectronCheck", false, {"While doMCtrueElectronCheck is true, check if track hypothesis corresponds to MC truth. If yes, it cuts."}}; Configurable doTwoTracks{"doTwoTracks", false, {"Define histos for two tracks and allow to fill them"}}; + Configurable doOutputTauEvents{"doOutputTauEvents", false, {"Select tau two-tracks events under loose criteria and stores them to root tree"}}; struct : ConfigurableGroup { Configurable whichGapSide{"whichGapSide", 2, {"0 for side A, 1 for side C, 2 for both sides"}}; @@ -200,6 +265,9 @@ struct UpcTauRl { using FullMCSGUDCollisions = soa::Join; using FullMCSGUDCollision = FullMCSGUDCollisions::iterator; + Preslice perCollision = aod::udtrack::udCollisionId; + Preslice perCollisionMC = aod::udtrack::udCollisionId; + // init void init(InitContext&) { @@ -532,66 +600,6 @@ struct UpcTauRl { histos.add("EventTwoTracks/ElectronMuPi/PID/hTOFnSigmaVsMPofO", ";Not-electron #it{p} (GeV/c);n#sigma^{#mu}_{TOF} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisNsigma}); histos.add("EventTwoTracks/ElectronMuPi/PID/hTOFnSigmaVsPPofO", ";Not-electron #it{p} (GeV/c);n#sigma^{#pi}_{TOF} (arb. units)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisNsigma}); histos.add("EventTwoTracks/ElectronMuPi/PID/hTOFnSigmaEvsnSigmaPofO", ";Not-electron n#sigma^{e}_{TOF} (arb. units);Not-electron n#sigma^{#pi}_{TOF} (arb. units)", HistType::kTH2D, {confAxis.zzAxisNsigma, confAxis.zzAxisNsigma}); - - if (doMixedEventsHistos) { - histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hInvariantMass", "Mixed events;Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMass}); - histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hInvariantMassWide", "Mixed events;Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMassWide}); - histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hAcoplanarity", "Mixed events;#Delta#phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisAcoplanarity}); - histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hCollinearity", "Mixed events;#DeltaR (-);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisCollinearity}); - histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hMotherP", "Mixed events;Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMom}); - histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hMotherPwide", "Mixed events;Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMomWide}); - histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hMotherPt", "Mixed events;Mother #it{p_{T}} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPt}); - histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hMotherPhi", "Mixed events;Mother #phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPhi}); - histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hMotherRapidity", "Mixed events;Mother #it{y} (-);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisRap}); - histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hMotherMassVsPt", "Mixed events;Invariant mass (GeV/c^{2});Mother #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisInvMassWide, confAxis.zzAxisPt}); - histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hDaughtersP", "Mixed events;Daughter 1 #it{p} (GeV/c);Daughter 2 #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisMom}); - histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hDaughtersPwide", "Mixed events;Daughter 1 #it{p} (GeV/c);Daughter 2 #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMomWide, confAxis.zzAxisMomWide}); - histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hDaughtersPt", "Mixed events;Daughter 1 #it{p_{T}} (GeV/c);Daughter 2 #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisPt, confAxis.zzAxisPt}); - histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hDaughtersPhi", "Mixed events;Daughter 1 #phi (rad);Daughter 2 #phi (rad)", HistType::kTH2D, {confAxis.zzAxisPhi, confAxis.zzAxisPhi}); - histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hDaughtersPtvsModPhi", "Mixed events;Daughter #it{p_{T}} (GeV/c);Daughter fmod(#phi,#pi/9)", HistType::kTH2D, {confAxis.zzAxisPt, confAxis.zzAxisModPhi}); - histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hDaughtersRapidity", "Mixed events;Daughter 1 #it{y} (-);Daughter 2 #it{y} (-)", HistType::kTH2D, {confAxis.zzAxisRap, confAxis.zzAxisRap}); - histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingP", "Mixed events;Leading #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMom}); - histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPwide", "Mixed events;Leading #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMomWide}); - histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPt", "Mixed events;Leading #it{p_{T}} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPt}); - histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPhi", "Mixed events;Leading #phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPhi}); - histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingRapidity", "Mixed events;Leading #it{y} (-);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisRap}); - histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPvsOtherP", "Mixed events;Leading #it{p} (GeV/c); Other #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisMom}); - histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPwideVsOtherPwide", "Mixed events;Leading #it{p} (GeV/c); Other #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMomWide, confAxis.zzAxisMomWide}); - histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPtVsOtherPt", "Mixed events;Leading #it{p_{T}} (GeV/c); Other #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisPt, confAxis.zzAxisPt}); - histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPhiVsOtherPhi", "Mixed events;Leading #phi (rad); Other #phi (rad)", HistType::kTH2D, {confAxis.zzAxisPhi, confAxis.zzAxisPhi}); - histos.add("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingRapVsOtherRap", "Mixed events;Leading #it{y} (-); Other #it{y} (-)", HistType::kTH2D, {confAxis.zzAxisRap, confAxis.zzAxisRap}); - - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hInvariantMass", "Mixed events;Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMass}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hInvariantMassWide", "Mixed events;Invariant mass (GeV/c^{2});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisInvMassWide}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hAcoplanarity", "Mixed events;#Delta#phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisAcoplanarity}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hCollinearity", "Mixed events;#DeltaR (-);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisCollinearity}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherP", "Mixed events;Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMom}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherPwide", "Mixed events;Mother #it{p} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMomWide}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherPt", "Mixed events;Mother #it{p_{T}} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPt}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherPhi", "Mixed events;Mother #phi (rad);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPhi}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherRapidity", "Mixed events;Mother #it{y} (-);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisRap}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherMassVsPt", "Mixed events;Invariant mass (GeV/c^{2});Mother #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisInvMassWide, confAxis.zzAxisPt}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherMassVsElectronP", "Mixed events;Invariant mass (GeV/c^{2});Electron #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisInvMassWide, confAxis.zzAxisMomWide}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherMassVsAcoplanarity", "Mixed events;Invariant mass (GeV/c^{2});#Delta#phi (rad)", HistType::kTH2D, {confAxis.zzAxisInvMassWide, confAxis.zzAxisAcoplanarity}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPt", "Mixed events;Electron #it{p_{T}} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisPt}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPtWide", "Mixed events;Electron #it{p_{T}} (GeV/c);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMomWide}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersEnergyAsymmetry", "Mixed events;(E_{electron} - E_{#mu/#pi}) / (E_{electron} + E_{#mu/#pi});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMirrorFraction}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersMomentaAsymmetry", "Mixed events;(#it{p}_{electron} - #it{p}_{#mu/#pi}) / (#it{p}_{electron} + #it{p}_{#mu/#pi});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMirrorFraction}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersPtAsymmetry", "Mixed events;(#it{p_{T}}_{electron} - #it{p_{T}}_{#mu/#pi}) / (#it{p_{T}}_{electron} + #it{p_{T}}_{#mu/#pi});Number of events (-)", HistType::kTH1D, {confAxis.zzAxisMirrorFraction}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersP", "Mixed events;Daughter 1 #it{p} (GeV/c);Daughter 2 #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisMom}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersPwide", "Mixed events;Daughter 1 #it{p} (GeV/c);Daughter 2 #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMomWide, confAxis.zzAxisMomWide}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersPt", "Mixed events;Daughter 1 #it{p_{T}} (GeV/c);Daughter 2 #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisPt, confAxis.zzAxisPt}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersPhi", "Mixed events;Daughter 1 #phi (rad);Daughter 2 #phi (rad)", HistType::kTH2D, {confAxis.zzAxisPhi, confAxis.zzAxisPhi}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersRapidity", "Mixed events;Daughter 1 #it{y} (-);Daughter 2 #it{y} (-)", HistType::kTH2D, {confAxis.zzAxisRap, confAxis.zzAxisRap}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersEnergyFractions", "Mixed events;E_{electron} / E_{tot} (-);E_{#mu/#pi} / E_{tot} (-)", HistType::kTH2D, {confAxis.zzAxisFraction, confAxis.zzAxisFraction}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPvsOtherP", "Mixed events;Electron #it{p} (GeV/c); #mu/#pi #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMom, confAxis.zzAxisMom}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPwideVsOtherPwide", "Mixed events;Electron #it{p} (GeV/c); #mu/#pi #it{p} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisMomWide, confAxis.zzAxisMomWide}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPvsAcoplanarity", "Mixed events;Electron #it{p} (GeV/c); #Delta#phi (rad)", HistType::kTH2D, {confAxis.zzAxisMomWide, confAxis.zzAxisAcoplanarity}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hOtherPvsAcoplanarity", "Mixed events;#mu/#pi #it{p} (GeV/c); #Delta#phi (rad)", HistType::kTH2D, {confAxis.zzAxisMomWide, confAxis.zzAxisAcoplanarity}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPtVsOtherPt", "Mixed events;Electron #it{p_{T}} (GeV/c); #mu/#pi #it{p_{T}} (GeV/c)", HistType::kTH2D, {confAxis.zzAxisPt, confAxis.zzAxisPt}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPhiVsOtherPhi", "Mixed events;Electron #phi (rad); #mu/#pi #phi (rad)", HistType::kTH2D, {confAxis.zzAxisPhi, confAxis.zzAxisPhi}); - histos.add("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronRapVsOtherRap", "Mixed events;Electron #it{y} (-); #mu/#pi #it{y} (-)", HistType::kTH2D, {confAxis.zzAxisRap, confAxis.zzAxisRap}); - } } if (doTruthHistos) { @@ -844,7 +852,7 @@ struct UpcTauRl { template bool isElectronCandidate(T const& electronCandidate) // Loose criterium to find electron-like particle - // Requiring TOF to avoid double-counting pions/electrons + // Requiring TOF to avoid double-counting pions/electrons and for better timing { if (electronCandidate.tpcNSigmaEl() < -2.0 || electronCandidate.tpcNSigmaEl() > 4.0) return false; @@ -856,11 +864,14 @@ struct UpcTauRl { template bool isMuPionCandidate(T const& muPionCandidate) // Loose criterium to find muon/pion-like particle + // Requiring TOF for better timing { if (muPionCandidate.tpcNSigmaMu() < -5.0 || muPionCandidate.tpcNSigmaMu() > 5.0) return false; if (muPionCandidate.tpcNSigmaPi() < -5.0 || muPionCandidate.tpcNSigmaPi() > 5.0) return false; + if (!muPionCandidate.hasTOF()) + return false; return true; } @@ -952,10 +963,6 @@ struct UpcTauRl { return true; } - // Define vectors to store info for mixed event analysis - std::vector> vecMixElEl; - std::vector> vecMixElMupion; - template void fillHistograms(Ts const& reconstructedBarrelTracks) { @@ -1004,10 +1011,8 @@ struct UpcTauRl { for (const auto& track : reconstructedBarrelTracks) { if (!track.isPVContributor()) continue; - if (cutGlobalTrack.applyGlobalTrackSelection) { - if (isGlobalTrackReinstatement(track) != 1) - continue; - } + if (cutGlobalTrack.applyGlobalTrackSelection && !isGlobalTrackReinstatement(track)) + continue; countPVGT++; float trkPx = track.px(); float trkPy = track.py(); @@ -1147,7 +1152,6 @@ struct UpcTauRl { histos.get(HIST("EventTwoTracks/hDaughtersPvsITSclusterSizeXcos"))->Fill(getAvgITSClSize(trkDaug2) * getCosLambda(trkDaug2), trkDaug2.sign() * daug[1].P()); if (isElEl) { - cutTauEvent.useThresholdsPID ? vecMixElEl.push_back(std::make_pair(vecPVnewPIDidx[0], vecPVnewPIDidx[1])) : vecMixElEl.push_back(std::make_pair(vecPVidx[0], vecPVidx[1])); histos.get(HIST("EventTwoTracks/TwoElectrons/hInvariantMass"))->Fill(mother.M()); histos.get(HIST("EventTwoTracks/TwoElectrons/hInvariantMassWide"))->Fill(mother.M()); histos.get(HIST("EventTwoTracks/TwoElectrons/hAcoplanarity"))->Fill(acoplanarity); @@ -1190,19 +1194,6 @@ struct UpcTauRl { } } if (isElMuPion) { - if (cutTauEvent.useThresholdsPID) { - if (isElectronCandidate(trkDaug1)) { - vecMixElMupion.push_back(std::make_pair(vecPVnewPIDidx[0], vecPVnewPIDidx[1])); // storing electron first - } else { - vecMixElMupion.push_back(std::make_pair(vecPVnewPIDidx[1], vecPVnewPIDidx[0])); - } - } else { - if (enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) { - vecMixElMupion.push_back(std::make_pair(vecPVidx[0], vecPVidx[1])); // storing electron first - } else { - vecMixElMupion.push_back(std::make_pair(vecPVidx[1], vecPVidx[0])); - } - } const auto& electronPt = (cutTauEvent.useThresholdsPID ? isElectronCandidate(trkDaug1) : enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[0].Pt() : daug[1].Pt(); const auto& electronP = (cutTauEvent.useThresholdsPID ? isElectronCandidate(trkDaug1) : enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[0].P() : daug[1].P(); const auto& electronE = (cutTauEvent.useThresholdsPID ? isElectronCandidate(trkDaug1) : enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[0].E() : daug[1].E(); @@ -1359,9 +1350,8 @@ struct UpcTauRl { for (const auto& track : reconstructedBarrelTracks) { if (!track.isPVContributor()) continue; - if (cutGlobalTrack.applyGlobalTrackSelection && !isGlobalTrackReinstatement(track)) { + if (cutGlobalTrack.applyGlobalTrackSelection && !isGlobalTrackReinstatement(track)) continue; - } countPVGT++; vecPVnoPIDidx.push_back(track.index()); float trkPx = track.px(); @@ -1733,10 +1723,8 @@ struct UpcTauRl { for (const auto& track : reconstructedBarrelTracks) { if (!track.isPVContributor()) continue; - if (cutGlobalTrack.applyGlobalTrackSelection) { - if (isGlobalTrackReinstatement(track) != 1) - continue; - } + if (cutGlobalTrack.applyGlobalTrackSelection && !isGlobalTrackReinstatement(track)) + continue; int hypothesisID = testPIDhypothesis(track, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC); if (hypothesisID == P_ELECTRON || hypothesisID == P_MUON || hypothesisID == P_PION) { countPVGTselected++; @@ -2008,270 +1996,226 @@ struct UpcTauRl { histos.get(HIST("Events/Truth/hChannels"))->Fill(CH_SIXPI); } - template - void fillMixedEventHistograms(Ts const& reconstructedBarrelTracks) + template + void outputTauEventCandidates(C const& collision, Ts const& tracks) { - TLorentzVector mother, daug[2]; - for (int idx = 0; idx < static_cast(vecMixElEl.size()); idx++) { - for (int cnt = 0; cnt < 5; cnt++) { - std::random_device rand_dev; - std::mt19937 generator(rand_dev()); - std::uniform_int_distribution distr(0, static_cast(vecMixElEl.size())); - int idx2 = distr(generator); - while (idx == idx2) - idx2 = distr(generator); - const auto& trkDaug1 = reconstructedBarrelTracks.iteratorAt(vecMixElEl[idx].first); - const auto& trkDaug2 = reconstructedBarrelTracks.iteratorAt(vecMixElEl[idx2].second); - daug[0].SetPxPyPzE(trkDaug1.px(), trkDaug1.py(), trkDaug1.pz(), energy(MassElectron, trkDaug1.px(), trkDaug1.py(), trkDaug1.pz())); - daug[1].SetPxPyPzE(trkDaug2.px(), trkDaug2.py(), trkDaug2.pz(), energy(MassElectron, trkDaug2.px(), trkDaug2.py(), trkDaug2.pz())); - mother = daug[0] + daug[1]; - const auto acoplanarity = calculateAcoplanarity(daug[0].Phi(), daug[1].Phi()); - const auto collinearity = calculateCollinearity(daug[0].Eta(), daug[1].Eta(), daug[0].Phi(), daug[1].Phi()); - histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hInvariantMass"))->Fill(mother.M()); - histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hInvariantMassWide"))->Fill(mother.M()); - histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hAcoplanarity"))->Fill(acoplanarity); - histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hCollinearity"))->Fill(collinearity); - histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hMotherP"))->Fill(mother.P()); - histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hMotherPwide"))->Fill(mother.P()); - histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hMotherPt"))->Fill(mother.Pt()); - histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hMotherPhi"))->Fill(mother.Phi()); - histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hMotherRapidity"))->Fill(mother.Rapidity()); - histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hMotherMassVsPt"))->Fill(mother.M(), mother.Pt()); - histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hDaughtersP"))->Fill(daug[0].P(), daug[1].P()); - histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hDaughtersPwide"))->Fill(daug[0].P(), daug[1].P()); - histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hDaughtersPt"))->Fill(daug[0].Pt(), daug[1].Pt()); - histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hDaughtersPhi"))->Fill(daug[0].Phi(), daug[1].Phi()); - histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hDaughtersPtvsModPhi"))->Fill(daug[0].P(), getPhiModN(daug[0].Phi(), trkDaug1.sign(), 1)); - histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hDaughtersPtvsModPhi"))->Fill(daug[1].P(), getPhiModN(daug[1].Phi(), trkDaug2.sign(), 1)); - histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hDaughtersRapidity"))->Fill(daug[0].Rapidity(), daug[1].Rapidity()); - histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingP"))->Fill(((daug[0].P() > daug[1].P()) ? daug[0].P() : daug[1].P())); - histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPwide"))->Fill(((daug[0].P() > daug[1].P()) ? daug[0].P() : daug[1].P())); - histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPt"))->Fill(((daug[0].P() > daug[1].P()) ? daug[0].Pt() : daug[1].Pt())); - histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPhi"))->Fill(((daug[0].P() > daug[1].P()) ? daug[0].Phi() : daug[1].Phi())); - histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingRapidity"))->Fill(((daug[0].P() > daug[1].P()) ? daug[0].Rapidity() : daug[1].Rapidity())); - histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPvsOtherP"))->Fill(((daug[0].P() > daug[1].P()) ? daug[0].P() : daug[1].P()), ((daug[0].P() > daug[1].P()) ? daug[1].P() : daug[0].P())); - histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPwideVsOtherPwide"))->Fill(((daug[0].P() > daug[1].P()) ? daug[0].P() : daug[1].P()), ((daug[0].P() > daug[1].P()) ? daug[1].P() : daug[0].P())); - histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPtVsOtherPt"))->Fill(((daug[0].P() > daug[1].P()) ? daug[0].Pt() : daug[1].Pt()), ((daug[0].P() > daug[1].P()) ? daug[1].Pt() : daug[0].Pt())); - histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingPhiVsOtherPhi"))->Fill(((daug[0].P() > daug[1].P()) ? daug[0].Phi() : daug[1].Phi()), ((daug[0].P() > daug[1].P()) ? daug[1].Phi() : daug[0].Phi())); - histos.get(HIST("EventTwoTracks/MixedEvents/TwoElectrons/hLeadingRapVsOtherRap"))->Fill(((daug[0].P() > daug[1].P()) ? daug[0].Rapidity() : daug[1].Rapidity()), ((daug[0].P() > daug[1].P()) ? daug[1].Rapidity() : daug[0].Rapidity())); - } // cnt - } // idx - - for (int idx = 0; idx < static_cast(vecMixElMupion.size()); idx++) { - for (int cnt = 0; cnt < 5; cnt++) { - std::random_device rand_dev; - std::mt19937 generator(rand_dev()); - std::uniform_int_distribution distr(0, static_cast(vecMixElMupion.size())); - int idx2 = distr(generator); - while (idx == idx2) - idx2 = distr(generator); - const auto& trkDaug1 = reconstructedBarrelTracks.iteratorAt(vecMixElMupion[idx].first); - const auto& trkDaug2 = reconstructedBarrelTracks.iteratorAt(vecMixElMupion[idx2].second); - daug[0].SetPxPyPzE(trkDaug1.px(), trkDaug1.py(), trkDaug1.pz(), energy(MassElectron, trkDaug1.px(), trkDaug1.py(), trkDaug1.pz())); - daug[1].SetPxPyPzE(trkDaug2.px(), trkDaug2.py(), trkDaug2.pz(), energy(MassPionCharged, trkDaug2.px(), trkDaug2.py(), trkDaug2.pz())); - mother = daug[0] + daug[1]; - const auto acoplanarity = calculateAcoplanarity(daug[0].Phi(), daug[1].Phi()); - const auto collinearity = calculateCollinearity(daug[0].Eta(), daug[1].Eta(), daug[0].Phi(), daug[1].Phi()); - const auto& electronPt = daug[0].Pt(); - const auto& electronP = daug[0].P(); - const auto& electronE = daug[0].E(); - const auto& mupionPt = daug[1].Pt(); - const auto& mupionP = daug[1].P(); - const auto& mupionE = daug[1].E(); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hInvariantMass"))->Fill(mother.M()); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hInvariantMassWide"))->Fill(mother.M()); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hAcoplanarity"))->Fill(acoplanarity); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hCollinearity"))->Fill(collinearity); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherP"))->Fill(mother.P()); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherPwide"))->Fill(mother.P()); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherPt"))->Fill(mother.Pt()); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherPhi"))->Fill(mother.Phi()); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherRapidity"))->Fill(mother.Rapidity()); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherMassVsPt"))->Fill(mother.M(), mother.Pt()); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherMassVsElectronP"))->Fill(mother.M(), electronP); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hMotherMassVsAcoplanarity"))->Fill(mother.M(), acoplanarity); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPt"))->Fill(electronPt); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPtWide"))->Fill(electronPt); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersEnergyAsymmetry"))->Fill((daug[0].E() - daug[1].E()) / (daug[0].E() + daug[1].E())); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersMomentaAsymmetry"))->Fill((daug[0].P() - daug[1].P()) / (daug[0].P() + daug[1].P())); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersPtAsymmetry"))->Fill((daug[0].Pt() - daug[1].Pt()) / (daug[0].Pt() + daug[1].Pt())); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersP"))->Fill(daug[0].P(), daug[1].P()); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersPwide"))->Fill(daug[0].P(), daug[1].P()); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersPt"))->Fill(daug[0].Pt(), daug[1].Pt()); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersPhi"))->Fill(daug[0].Phi(), daug[1].Phi()); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersRapidity"))->Fill(daug[0].Rapidity(), daug[1].Rapidity()); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hDaughtersEnergyFractions"))->Fill(electronE / (electronE + mupionE), mupionE / (electronE + mupionE)); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPvsOtherP"))->Fill(electronP, mupionP); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPwideVsOtherPwide"))->Fill(electronP, mupionP); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPvsAcoplanarity"))->Fill(electronP, acoplanarity); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hOtherPvsAcoplanarity"))->Fill(mupionP, acoplanarity); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPtVsOtherPt"))->Fill(electronPt, mupionPt); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronPhiVsOtherPhi"))->Fill(isElectronCandidate(trkDaug1) ? daug[0].Phi() : daug[1].Phi(), isElectronCandidate(trkDaug1) ? daug[1].Phi() : daug[0].Phi()); - histos.get(HIST("EventTwoTracks/MixedEvents/ElectronMuPi/hElectronRapVsOtherRap"))->Fill(isElectronCandidate(trkDaug1) ? daug[0].Rapidity() : daug[1].Rapidity(), isElectronCandidate(trkDaug1) ? daug[1].Rapidity() : daug[0].Rapidity()); - } // cnt - } // idx - } // end fillMixedEventHistograms - - void processDataDG(FullUDCollisions const& reconstructedCollisions, + + int countTracksPerCollision = 0; + int countGoodNonPVtracks = 0; + int countPVGTel = 0; + int countPVGTmupi = 0; + std::vector vecTrkIdx; + // Loop over tracks with selections + for (const auto& track : tracks) { + countTracksPerCollision++; + if (!isGlobalTrackReinstatement(track)) + continue; + if (!track.isPVContributor()) { + countGoodNonPVtracks++; + continue; + } + // alternative selection + if (isElectronCandidate(track)) { + countPVGTel++; + vecTrkIdx.push_back(track.index()); + } + if (isMuPionCandidate(track)) { + countPVGTmupi++; + vecTrkIdx.push_back(track.index()); + } + } // Loop over tracks with selections + + if (countPVGTel == 2 || (countPVGTel == 1 && countPVGTmupi == 1)) { + const auto& trk1 = tracks.iteratorAt(vecTrkIdx[0]); + const auto& trk2 = tracks.iteratorAt(vecTrkIdx[1]); + + float px[2] = {trk1.px(), trk2.px()}; + float py[2] = {trk1.py(), trk2.py()}; + float pz[2] = {trk1.pz(), trk2.pz()}; + int sign[2] = {trk1.sign(), trk2.sign()}; + float dcaxy[2] = {trk1.dcaXY(), trk2.dcaXY()}; + float dcaz[2] = {trk1.dcaZ(), trk2.dcaZ()}; + float tpcSignal[2] = {trk1.tpcSignal(), trk2.tpcSignal()}; + float tpcEl[2] = {trk1.tpcNSigmaEl(), trk2.tpcNSigmaEl()}; + float tpcMu[2] = {trk1.tpcNSigmaMu(), trk2.tpcNSigmaMu()}; + float tpcPi[2] = {trk1.tpcNSigmaPi(), trk2.tpcNSigmaPi()}; + float tpcKa[2] = {trk1.tpcNSigmaKa(), trk2.tpcNSigmaKa()}; + float tpcPr[2] = {trk1.tpcNSigmaPr(), trk2.tpcNSigmaPr()}; + float tofSignal[2] = {trk1.tofSignal(), trk2.tofSignal()}; + float tofEl[2] = {trk1.tofNSigmaEl(), trk2.tofNSigmaEl()}; + float tofMu[2] = {trk1.tofNSigmaMu(), trk2.tofNSigmaMu()}; + float tofPi[2] = {trk1.tofNSigmaPi(), trk2.tofNSigmaPi()}; + float tofKa[2] = {trk1.tofNSigmaKa(), trk2.tofNSigmaKa()}; + float tofPr[2] = {trk1.tofNSigmaPr(), trk2.tofNSigmaPr()}; + + tauTwoTracks(collision.runNumber(), collision.globalBC(), countTracksPerCollision, collision.numContrib(), countGoodNonPVtracks, collision.posX(), collision.posY(), collision.posZ(), + collision.flags(), collision.occupancyInTime(), collision.hadronicRate(), collision.trs(), collision.hmpr(), collision.hmpr(), + collision.tfb(), collision.itsROFb(), collision.sbp(), collision.zVtxFT0vPV(), collision.vtxITSTPC(), + collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFV0AmplitudeA(), + collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), + px, py, pz, sign, dcaxy, dcaz, + tpcSignal, tpcEl, tpcMu, tpcPi, tpcKa, tpcPr, + tofSignal, tofEl, tofMu, tofPi, tofKa, tofPr); + } + } + + void processDataDG(FullUDCollision const& reconstructedCollision, FullUDTracks const& reconstructedBarrelTracks) { - for (const auto& reconstructedCollision : reconstructedCollisions) { - if (!isGoodROFtime(reconstructedCollision)) - return; - - if (!isGoodFITtime(reconstructedCollision, cutSample.cutFITtime)) - return; + if (!isGoodROFtime(reconstructedCollision)) + return; - if (cutSample.useNumContribs && (reconstructedCollision.numContrib() != cutSample.cutNumContribs)) - return; + if (!isGoodFITtime(reconstructedCollision, cutSample.cutFITtime)) + return; - if (cutSample.useRecoFlag && (reconstructedCollision.flags() != cutSample.cutRecoFlag)) - return; + if (cutSample.useNumContribs && (reconstructedCollision.numContrib() != cutSample.cutNumContribs)) + return; - if (doMainHistos) { - fillHistograms(reconstructedBarrelTracks); - fillFIThistograms(reconstructedCollision); - if (doMixedEventsHistos) - fillMixedEventHistograms(reconstructedBarrelTracks); - } + if (cutSample.useRecoFlag && (reconstructedCollision.flags() != cutSample.cutRecoFlag)) + return; - if (doPIDhistos) - fillPIDhistograms(reconstructedCollision, reconstructedBarrelTracks); + if (doMainHistos) { + fillHistograms(reconstructedBarrelTracks); + fillFIThistograms(reconstructedCollision); } + if (doPIDhistos) + fillPIDhistograms(reconstructedCollision, reconstructedBarrelTracks); + + if (doOutputTauEvents) + outputTauEventCandidates(reconstructedCollision, reconstructedBarrelTracks); + } // end processDataDG - void processDataSG(FullSGUDCollisions const& reconstructedCollisions, + void processDataSG(FullSGUDCollision const& reconstructedCollision, FullUDTracks const& reconstructedBarrelTracks) { - for (const auto& reconstructedCollision : reconstructedCollisions) { - int gapSide = reconstructedCollision.gapSide(); - int trueGapSide = sgSelector.trueGap(reconstructedCollision, cutSample.cutTrueGapSideFV0, cutSample.cutTrueGapSideFT0A, cutSample.cutTrueGapSideFT0C, cutSample.cutTrueGapSideZDC); - histos.fill(HIST("Events/UDtableGapSide"), gapSide); - histos.fill(HIST("Events/TrueGapSideDiffToTableValue"), gapSide - trueGapSide); - if (cutSample.useTrueGap) - gapSide = trueGapSide; + int gapSide = reconstructedCollision.gapSide(); + int trueGapSide = sgSelector.trueGap(reconstructedCollision, cutSample.cutTrueGapSideFV0, cutSample.cutTrueGapSideFT0A, cutSample.cutTrueGapSideFT0C, cutSample.cutTrueGapSideZDC); - if (!isGoodROFtime(reconstructedCollision)) - return; + if (cutSample.useTrueGap) + gapSide = trueGapSide; - if (gapSide != cutSample.whichGapSide) - return; + if (!isGoodROFtime(reconstructedCollision)) + return; - if (!isGoodFITtime(reconstructedCollision, cutSample.cutFITtime)) - return; + if (gapSide != cutSample.whichGapSide) + return; - if (cutSample.useNumContribs && (reconstructedCollision.numContrib() != cutSample.cutNumContribs)) - return; + if (!isGoodFITtime(reconstructedCollision, cutSample.cutFITtime)) + return; - if (cutSample.useRecoFlag && (reconstructedCollision.flags() != cutSample.cutRecoFlag)) - return; + if (cutSample.useNumContribs && (reconstructedCollision.numContrib() != cutSample.cutNumContribs)) + return; - if (doMainHistos) { - fillHistograms(reconstructedBarrelTracks); - fillFIThistograms(reconstructedCollision); - if (doMixedEventsHistos) - fillMixedEventHistograms(reconstructedBarrelTracks); - } + if (cutSample.useRecoFlag && (reconstructedCollision.flags() != cutSample.cutRecoFlag)) + return; - if (doPIDhistos) - fillPIDhistograms(reconstructedCollision, reconstructedBarrelTracks); + if (doMainHistos) { + histos.fill(HIST("Events/UDtableGapSide"), gapSide); + histos.fill(HIST("Events/TrueGapSideDiffToTableValue"), gapSide - trueGapSide); + fillHistograms(reconstructedBarrelTracks); + fillFIThistograms(reconstructedCollision); } + if (doPIDhistos) + fillPIDhistograms(reconstructedCollision, reconstructedBarrelTracks); + + if (doOutputTauEvents) + outputTauEventCandidates(reconstructedCollision, reconstructedBarrelTracks); + } // end processDataSG - void processMCrecDG(FullMCUDCollisions const& reconstructedCollisions, + void processMCrecDG(FullMCUDCollision const& reconstructedCollision, FullMCUDTracks const& reconstructedBarrelTracks, aod::UDMcParticles const&) { isMC = true; - for (const auto& reconstructedCollision : reconstructedCollisions) { - if (!isGoodROFtime(reconstructedCollision)) - return; + if (!isGoodROFtime(reconstructedCollision)) + return; - if (!isGoodFITtime(reconstructedCollision, cutSample.cutFITtime)) - return; + if (!isGoodFITtime(reconstructedCollision, cutSample.cutFITtime)) + return; - if (cutSample.useNumContribs && (reconstructedCollision.numContrib() != cutSample.cutNumContribs)) - return; + if (cutSample.useNumContribs && (reconstructedCollision.numContrib() != cutSample.cutNumContribs)) + return; - if (cutSample.useRecoFlag && (reconstructedCollision.flags() != cutSample.cutRecoFlag)) - return; + if (cutSample.useRecoFlag && (reconstructedCollision.flags() != cutSample.cutRecoFlag)) + return; - if (cutSample.applyAcceptanceSelection) { - for (const auto& track : reconstructedBarrelTracks) { - if (!track.isPVContributor()) - continue; - if (std::abs(eta(track.px(), track.py(), track.py())) > cutSample.cutTrackEta) - return; - } + if (cutSample.applyAcceptanceSelection) { + for (const auto& track : reconstructedBarrelTracks) { + if (!track.isPVContributor()) + continue; + if (std::abs(eta(track.px(), track.py(), track.py())) > cutSample.cutTrackEta) + return; } + } - if (doMainHistos) { - fillHistograms(reconstructedBarrelTracks); - fillFIThistograms(reconstructedCollision); - if (doMixedEventsHistos) - fillMixedEventHistograms(reconstructedBarrelTracks); - } + if (doMainHistos) { + fillHistograms(reconstructedBarrelTracks); + fillFIThistograms(reconstructedCollision); + } - if (doPIDhistos) { - fillPIDhistograms(reconstructedCollision, reconstructedBarrelTracks); - fillMCPIDhistograms(reconstructedBarrelTracks); - } + if (doPIDhistos) { + fillPIDhistograms(reconstructedCollision, reconstructedBarrelTracks); + fillMCPIDhistograms(reconstructedBarrelTracks); } + if (doOutputTauEvents) + outputTauEventCandidates(reconstructedCollision, reconstructedBarrelTracks); + } // end processMCrecDG - void processMCrecSG(FullMCSGUDCollisions const& reconstructedCollisions, + void processMCrecSG(FullMCSGUDCollision const& reconstructedCollision, FullMCUDTracks const& reconstructedBarrelTracks, aod::UDMcParticles const&) { isMC = true; - for (const auto& reconstructedCollision : reconstructedCollisions) { - int gapSide = reconstructedCollision.gapSide(); - histos.fill(HIST("Events/UDtableGapSide"), gapSide); + int gapSide = reconstructedCollision.gapSide(); - if (gapSide != cutSample.whichGapSide) - return; + if (gapSide != cutSample.whichGapSide) + return; - if (!isGoodROFtime(reconstructedCollision)) - return; + if (!isGoodROFtime(reconstructedCollision)) + return; - if (!isGoodFITtime(reconstructedCollision, cutSample.cutFITtime)) - return; + if (!isGoodFITtime(reconstructedCollision, cutSample.cutFITtime)) + return; - if (cutSample.useNumContribs && (reconstructedCollision.numContrib() != cutSample.cutNumContribs)) - return; + if (cutSample.useNumContribs && (reconstructedCollision.numContrib() != cutSample.cutNumContribs)) + return; - if (cutSample.useRecoFlag && (reconstructedCollision.flags() != cutSample.cutRecoFlag)) - return; + if (cutSample.useRecoFlag && (reconstructedCollision.flags() != cutSample.cutRecoFlag)) + return; - if (cutSample.applyAcceptanceSelection) { - for (const auto& track : reconstructedBarrelTracks) { - if (!track.isPVContributor()) - continue; - if (std::abs(eta(track.px(), track.py(), track.py())) > cutSample.cutTrackEta) - return; - } + if (cutSample.applyAcceptanceSelection) { + for (const auto& track : reconstructedBarrelTracks) { + if (!track.isPVContributor()) + continue; + if (std::abs(eta(track.px(), track.py(), track.py())) > cutSample.cutTrackEta) + return; } + } - if (doMainHistos) { - fillHistograms(reconstructedBarrelTracks); - fillFIThistograms(reconstructedCollision); - if (doMixedEventsHistos) - fillMixedEventHistograms(reconstructedBarrelTracks); - } + if (doMainHistos) { + histos.fill(HIST("Events/UDtableGapSide"), gapSide); + fillHistograms(reconstructedBarrelTracks); + fillFIThistograms(reconstructedCollision); + } - if (doPIDhistos) { - fillPIDhistograms(reconstructedCollision, reconstructedBarrelTracks); - fillMCPIDhistograms(reconstructedBarrelTracks); - } + if (doPIDhistos) { + fillPIDhistograms(reconstructedCollision, reconstructedBarrelTracks); + fillMCPIDhistograms(reconstructedBarrelTracks); } + if (doOutputTauEvents) + outputTauEventCandidates(reconstructedCollision, reconstructedBarrelTracks); + } // end processMCrecDG void processMCgen(aod::UDMcCollision const& /*generatedCollision*/, From 406c2bed95152f60c4b98995ba18f642ef6eb916 Mon Sep 17 00:00:00 2001 From: Joachim Carlo Kristian Bjerg Hansen <50103987+joachimckh@users.noreply.github.com> Date: Wed, 5 Mar 2025 14:12:54 +0100 Subject: [PATCH 0549/1650] [PWGJE] Attempt at fixing rho(phi_jet), added some delta pt hists, move the EP histograms to separate process (#10330) --- PWGJE/Tasks/jetSpectraEseTask.cxx | 248 ++++++++++++++++++++++-------- 1 file changed, 185 insertions(+), 63 deletions(-) diff --git a/PWGJE/Tasks/jetSpectraEseTask.cxx b/PWGJE/Tasks/jetSpectraEseTask.cxx index f7ef38c47fb..05a8d2f011f 100644 --- a/PWGJE/Tasks/jetSpectraEseTask.cxx +++ b/PWGJE/Tasks/jetSpectraEseTask.cxx @@ -35,6 +35,7 @@ #include "PWGJE/Core/FastJetUtilities.h" #include "PWGJE/Core/JetDerivedDataUtilities.h" +#include "PWGJE/Core/JetFindingUtilities.h" #include "PWGJE/DataModel/Jet.h" #include "Common/DataModel/EseTable.h" @@ -47,7 +48,7 @@ using namespace o2::framework::expressions; #include "Framework/runDataProcessing.h" struct JetSpectraEseTask { - ConfigurableAxis binJetPt{"binJetPt", {200, 0., 200.}, ""}; + ConfigurableAxis binJetPt{"binJetPt", {250, -50., 200.}, ""}; ConfigurableAxis bindPhi{"bindPhi", {180, -o2::constants::math::PI, o2::constants::math::PI}, ""}; ConfigurableAxis binESE{"binESE", {100, 0, 100}, ""}; ConfigurableAxis binCos{"binCos", {100, -1.05, 1.05}, ""}; @@ -55,22 +56,30 @@ struct JetSpectraEseTask { ConfigurableAxis binQVec{"binQVec", {500, -3, 3}, ""}; ConfigurableAxis binCentrality{"binCentrality", {100, 0, 100}, ""}; ConfigurableAxis binPhi{"binPhi", {60, -1.0, 7.0}, ""}; - ConfigurableAxis binEta{"binEta", {80, -0.9, 0, 9}, ""}; - ConfigurableAxis binFit{"binFit", {100, 0, 50}, ""}; + ConfigurableAxis binEta{"binEta", {80, -0.9, 0.9}, ""}; + ConfigurableAxis binFit0{"binFit0", {100, 0, 50}, ""}; + ConfigurableAxis binFit13{"binFit13", {100, 0, 1.4}, ""}; + ConfigurableAxis binFit24{"binFit24", {100, 0, 10}, ""}; Configurable jetPtMin{"jetPtMin", 5.0, "minimum jet pT cut"}; Configurable jetR{"jetR", 0.2, "jet resolution parameter"}; Configurable randomConeR{"randomConeR", 0.4, "size of random Cone for estimating background fluctuations"}; Configurable randomConeLeadJetDeltaR{"randomConeLeadJetDeltaR", -99.0, "min distance between leading jet axis and random cone (RC) axis; if negative, min distance is set to automatic value of R_leadJet+R_RC "}; Configurable vertexZCut{"vertexZCut", 10.0, "vertex z cut"}; - Configurable> centRange{"centRange", {30, 50}, "centrality region of interest"}; - Configurable leadingJetPtCut{"leadingJetPtCut", 5.0, "leading jet pT cut"}; + Configurable> centRange{"centRange", {0, 90}, "centrality region of interest"}; + Configurable cfgSelCentrality{"cfgSelCentrality", true, "Flag for centrality selection"}; + Configurable leadingTrackPtCut{"leadingTrackPtCut", 5.0, "leading jet pT cut"}; + Configurable jetAreaFractionMin{"jetAreaFractionMin", 0.56, "used to make a cut on the jet areas"}; + Configurable fjetAreaCut{"fjetAreaCut", true, "Flag for jet area cut"}; Configurable trackEtaMin{"trackEtaMin", -0.9, "minimum eta acceptance for tracks"}; Configurable trackEtaMax{"trackEtaMax", 0.9, "maximum eta acceptance for tracks"}; Configurable trackPtMin{"trackPtMin", 0.15, "minimum pT acceptance for tracks"}; Configurable trackPtMax{"trackPtMax", 100.0, "maximum pT acceptance for tracks"}; + Configurable jetEtaMin{"jetEtaMin", -0.7, "minimum jet pseudorapidity"}; + Configurable jetEtaMax{"jetEtaMax", 0.7, "maximum jet pseudorapidity"}; + Configurable eventSelections{"eventSelections", "sel8FullPbPb", "choose event selection"}; Configurable trackSelections{"trackSelections", "globalTracks", "set track selections"}; @@ -97,7 +106,9 @@ struct JetSpectraEseTask { AxisSpec centAxis = {binCentrality, "Centrality"}; AxisSpec phiAxis = {binPhi, "#phi"}; AxisSpec etaAxis = {binEta, "#eta"}; - AxisSpec fitAxis = {binFit, "Fit"}; + AxisSpec fitAxis0 = {binFit0, "Fit0"}; + AxisSpec fitAxis13 = {binFit13, "Fit13"}; + AxisSpec fitAxis24 = {binFit24, "Fit24"}; HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject, false, false}; @@ -128,8 +139,8 @@ struct JetSpectraEseTask { bool hist; }; - static constexpr EventPlaneFiller PsiFillerEse = {true, true}; - static constexpr EventPlaneFiller PsiFillerBkg = {true, false}; + static constexpr EventPlaneFiller PsiFillerEP = {true, true}; + static constexpr EventPlaneFiller PsiFillerEse = {true, false}; static constexpr EventPlaneFiller PsiFillerOcc = {false, false}; void init(o2::framework::InitContext&) @@ -140,18 +151,42 @@ struct JetSpectraEseTask { LOGF(info, "jetSpectraEse::init()"); if (doprocessESEDataCharged) { - LOGF(info, "JetSpectraEseTask::init() - processESEDataCharged"); + LOGF(info, "JetSpectraEseTask::init() - ESE Data Process"); registry.add("hEventCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); registry.add("hCentralitySel", ";Centrality;entries", {HistType::kTH1F, {{centAxis}}}); registry.add("hCentralityAnalyzed", ";Centrality;entries", {HistType::kTH1F, {{centAxis}}}); + registry.add("hTrackCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); registry.add("hJetPt", "jet pT;#it{p}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {{jetPtAxis}}}); registry.add("hJetPt_bkgsub", "jet pT background sub;#it{p}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {{jetPtAxis}}}); registry.add("hJetEta", "jet #eta;#eta_{jet};entries", {HistType::kTH1F, {{etaAxis}}}); registry.add("hJetPhi", "jet #phi;#phi_{jet};entries", {HistType::kTH1F, {{phiAxis}}}); - registry.add("hRho", ";#rho;entries", {HistType::kTH1F, {{100, 0, 200.}}}); + registry.add("hRho", ";#rho;entries", {HistType::kTH2F, {{centAxis}, {100, 0, 200.}}}); + registry.add("hRhoPhi", ";#rho;entries", {HistType::kTH2F, {{centAxis}, {100, 0, 200.}}}); registry.add("hJetArea", ";area_{jet};entries", {HistType::kTH1F, {{80, 0, 10.}}}); - registry.add("hdPhi", "#Delta#phi;entries;", {HistType::kTH1F, {{dPhiAxis}}}); registry.add("hCentJetPtdPhiq2", "", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {dPhiAxis}, {eseAxis}}}); + registry.add("hCentJetPtdPhiq2RhoPhi", "", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {dPhiAxis}, {eseAxis}}}); + + registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(1, "Input event"); + registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(2, "Event selection"); + registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(3, "Occupancy cut"); + registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(4, "ESE available"); + registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(5, "Lead track"); + registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(6, "Jet loop"); + registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(7, "Centrality analyzed"); + + registry.add("hPhiPtsum", "jet sumpt;sum p_{T};entries", {HistType::kTH1F, {{40, 0., o2::constants::math::TwoPI}}}); + registry.add("hfitPar0", "", {HistType::kTH2F, {{centAxis}, {fitAxis0}}}); + registry.add("hfitPar1", "", {HistType::kTH2F, {{centAxis}, {fitAxis13}}}); + registry.add("hfitPar2", "", {HistType::kTH2F, {{centAxis}, {fitAxis24}}}); + registry.add("hfitPar3", "", {HistType::kTH2F, {{centAxis}, {fitAxis13}}}); + registry.add("hfitPar4", "", {HistType::kTH2F, {{centAxis}, {fitAxis24}}}); + registry.add("hPValueCentCDF", "p-value cDF vs centrality; centrality; p-value", {HistType::kTH2F, {{centAxis}, {40, 0, 1}}}); + registry.add("hCentChi2Ndf", "Chi2 vs centrality; centrality; #tilde{#chi^{2}}", {HistType::kTH2F, {{centAxis}, {100, 0, 5}}}); + registry.add("hCentPhi", "centrality vs #rho(#varphi); centrality; #rho(#varphi) ", {HistType::kTH2F, {{centAxis}, {210, -10.0, 200.0}}}); + registry.add("hdPhiRhoPhi", "#varphi vs #rho(#varphi); #varphi - #Psi_{EP,2}; #rho(#varphi) ", {HistType::kTH2F, {{40, -o2::constants::math::PI, o2::constants::math::PI}, {210, -10.0, 200.0}}}); + } + if (doprocessESEEPData) { + LOGF(info, "JetSpectraEseTask::init() - Event Plane Process"); registry.add("hPsi2FT0C", ";Centrality; #Psi_{2}", {HistType::kTH2F, {{centAxis}, {150, -2.5, 2.5}}}); registry.addClone("hPsi2FT0C", "hPsi2FT0A"); registry.addClone("hPsi2FT0C", "hPsi2FV0A"); @@ -167,31 +202,17 @@ struct JetSpectraEseTask { registry.addClone("hPsi2FT0C", "hEPUncorV2"); registry.addClone("hPsi2FT0C", "hEPRectrV2"); registry.addClone("hPsi2FT0C", "hEPTwistV2"); - - registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(1, "Input event"); - registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(2, "Event selection"); - registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(3, "Occupancy cut"); - registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(4, "ESE available"); - registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(5, "Lead track"); - registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(6, "Jet loop"); - registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(7, "Centrality analyzed"); - - registry.add("hPhiPtsum", "jet sumpt;sum p_{T};entries", {HistType::kTH1F, {{40, 0., o2::constants::math::TwoPI}}}); - registry.add("hfitPar0", "", {HistType::kTH2F, {{centAxis}, {fitAxis}}}); - registry.add("hfitPar1", "", {HistType::kTH2F, {{centAxis}, {fitAxis}}}); - registry.add("hfitPar2", "", {HistType::kTH2F, {{centAxis}, {fitAxis}}}); - registry.add("hfitPar3", "", {HistType::kTH2F, {{centAxis}, {fitAxis}}}); - registry.add("hfitPar4", "", {HistType::kTH2F, {{centAxis}, {fitAxis}}}); - registry.add("hPValueCentCDF", "p-value cDF vs centrality; centrality; p-value", {HistType::kTH2F, {{centAxis}, {40, 0, 1}}}); - registry.add("hCentChi2Ndf", "Chi2 vs centrality; centrality; #tilde{#chi^{2}}", {HistType::kTH2F, {{centAxis}, {100, 0, 5}}}); } if (doprocessESEBackground) { + LOGF(info, "JetSpectraEseTask::init() - Background Process"); registry.add("hCentRhoRandomCone", "; centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho} (GeV/c);", {HistType::kTH2F, {{1100, 0., 110.}, {800, -400.0, 400.0}}}); registry.add("hCentRhoRandomConeRandomTrackDir", "; centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho} (GeV/c);", {HistType::kTH2F, {{1100, 0., 110.}, {800, -400.0, 400.0}}}); registry.add("hCentRhoRandomConewoLeadingJet", "; centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho} (GeV/c);", {HistType::kTHnSparseF, {{centAxis}, {800, -400.0, 400.0}, {dPhiAxis}, {eseAxis}}}); + registry.add("hCentRhoRandomConeRndTrackDirwoOneLeadingJet", "; centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho} (GeV/c);", {HistType::kTHnSparseF, {{centAxis}, {800, -400.0, 400.0}, {dPhiAxis}, {eseAxis}}}); + registry.add("hCentRhoRandomConeRndTrackDirwoTwoLeadingJet", "; centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho} (GeV/c);", {HistType::kTHnSparseF, {{centAxis}, {800, -400.0, 400.0}, {dPhiAxis}, {eseAxis}}}); } if (doprocessMCParticleLevel) { - LOGF(info, "JetSpectraEseTask::init() - processMCParticleLevel"); + LOGF(info, "JetSpectraEseTask::init() - MC Particle level"); registry.add("hMCPartEventCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); registry.add("hPartCentralitySel", ";centr;entries", {HistType::kTH1F, {{centAxis}}}); registry.add("hPartJetPt", "particle level jet pT;#it{p}_{T,jet part} (GeV/#it{c});entries", {HistType::kTH1F, {{jetPtAxis}}}); @@ -205,7 +226,7 @@ struct JetSpectraEseTask { registry.get(HIST("hMCPartEventCounter"))->GetXaxis()->SetBinLabel(3, "MCD size != 1"); } if (doprocessMCDetectorLevel) { - LOGF(info, "JetSpectraEseTask::init() - processMCDetectorLevel"); + LOGF(info, "JetSpectraEseTask::init() - MC Detector level"); registry.add("hMCDetEventCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); registry.add("hDetCentralitySel", ";centr;entries", {HistType::kTH1F, {{100, 0.0, 100.0}}}); registry.add("hDetJetPt", "particle level jet pT;#it{p}_{T,jet part} (GeV/#it{c});entries", {HistType::kTH1F, {{jetPtAxis}}}); @@ -218,7 +239,7 @@ struct JetSpectraEseTask { registry.get(HIST("hMCDetEventCounter"))->GetXaxis()->SetBinLabel(3, "Occupancy cut"); } if (doprocessMCChargedMatched) { - LOGF(info, "JetSpectraEseTask::init() - processMCChargedMatched"); + LOGF(info, "JetSpectraEseTask::init() - MC Charged Matched"); registry.add("hMCEventCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); registry.add("hMCDMatchedEventCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); registry.add("hCentralityAnalyzed", ";Centrality;entries", {HistType::kTH1F, {{centAxis}}}); @@ -251,7 +272,7 @@ struct JetSpectraEseTask { registry.get(HIST("hMCDMatchedEventCounter"))->GetXaxis()->SetBinLabel(6, "After analysis"); } if (doprocessESEOccupancy) { - LOGF(info, "JetSpectraEseTask::init() - processESEOccupancy"); + LOGF(info, "JetSpectraEseTask::init() - Occupancy QA"); registry.add("hEventCounterOcc", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); registry.add("hTrackPt", "track pT;#it{p}_{T,track} (GeV/#it{c});entries", {HistType::kTHnSparseF, {{centAxis}, {100, 0, 100}, {eseAxis}, {occAxis}}}); registry.add("hTrackEta", "track #eta;#eta_{track};entries", {HistType::kTH3F, {{centAxis}, {etaAxis}, {occAxis}}}); @@ -274,6 +295,9 @@ struct JetSpectraEseTask { if (cfgEvSelOccupancy && !isOccupancyWithin(collision)) return; registry.fill(HIST("hEventCounter"), counter++); + + if (cfgSelCentrality && !isCentralitySelected(collision.centrality())) + return; registry.fill(HIST("hCentralitySel"), collision.centrality()); const auto psi{procEP(collision)}; @@ -285,38 +309,61 @@ struct JetSpectraEseTask { if (!isAcceptedLeadTrack(tracks)) return; - auto rho = collision.rho(); std::unique_ptr rhoFit{nullptr}; if (cfgrhoPhi) { - rhoFit = fitRho(collision, psi, tracks); + rhoFit = fitRho(collision, psi, tracks, jets); + if (!rhoFit) + return; } registry.fill(HIST("hEventCounter"), counter++); - registry.fill(HIST("hRho"), rho); + registry.fill(HIST("hRho"), collision.centrality(), collision.rho()); registry.fill(HIST("hCentralityAnalyzed"), collision.centrality()); for (auto const& jet : jets) { - if (cfgrhoPhi) { - rho = evalRho(rhoFit.get(), jet.phi(), rho); - } - float jetpTbkgsub = jet.pt() - (rho * jet.area()); + if (fjetAreaCut && !isJetAreaAccepted(jet)) + continue; + if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) + continue; registry.fill(HIST("hJetPt"), jet.pt()); - registry.fill(HIST("hJetPt_bkgsub"), jetpTbkgsub); + registry.fill(HIST("hJetPt_bkgsub"), jet.pt() - collision.rho() * jet.area()); registry.fill(HIST("hJetEta"), jet.eta()); registry.fill(HIST("hJetPhi"), jet.phi()); registry.fill(HIST("hJetArea"), jet.area()); float dPhi{RecoDecay::constrainAngle(jet.phi() - psi.psi2, -o2::constants::math::PI)}; - registry.fill(HIST("hdPhi"), dPhi); - registry.fill(HIST("hCentJetPtdPhiq2"), collision.centrality(), jetpTbkgsub, dPhi, qPerc[0]); + registry.fill(HIST("hCentJetPtdPhiq2"), collision.centrality(), jet.pt() - (collision.rho() * jet.area()), dPhi, qPerc[0]); + + if (cfgrhoPhi) { + auto rhoLocal = evalRho(rhoFit.get(), jetR, jet.phi(), collision.rho()); + registry.fill(HIST("hRhoPhi"), collision.centrality(), rhoLocal); + registry.fill(HIST("hCentJetPtdPhiq2RhoPhi"), collision.centrality(), jet.pt() - (rhoLocal * jet.area()), dPhi, qPerc[0]); + registry.fill(HIST("hCentPhi"), collision.centrality(), rhoFit->Eval(jet.phi())); + registry.fill(HIST("hdPhiRhoPhi"), dPhi, rhoFit->Eval(jet.phi())); + } } registry.fill(HIST("hEventCounter"), counter++); - if (collision.centrality() < centRange->at(0) || collision.centrality() > centRange->at(1)) + if (collision.centrality() < 30 || collision.centrality() > 50) return; registry.fill(HIST("hEventCounter"), counter++); } PROCESS_SWITCH(JetSpectraEseTask, processESEDataCharged, "process ese collisions", true); + void processESEEPData(soa::Join::iterator const& collision, + soa::Filtered const&, + aod::JetTracks const&) + { + + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) + return; + + if (cfgEvSelOccupancy && !isOccupancyWithin(collision)) + return; + + [[maybe_unused]] const auto psi{procEP(collision)}; + } + PROCESS_SWITCH(JetSpectraEseTask, processESEEPData, "process ese collisions for filling EP and EPR", false); + void processESEBackground(soa::Filtered>::iterator const& collision, soa::Join const& jets, aod::JetTracks const& tracks) @@ -481,15 +528,23 @@ struct JetSpectraEseTask { template bool isAcceptedLeadTrack(T const& tracks) { - double leadingTrackpT{0.0}; + double leadingTrackPt = 0.0; for (const auto& track : tracks) { - if (track.pt() > leadingJetPtCut) { - if (track.pt() > leadingTrackpT) { - leadingTrackpT = track.pt(); + if (track.pt() > leadingTrackPtCut) { + if (track.pt() > leadingTrackPt) { + leadingTrackPt = track.pt(); } } } - if (leadingTrackpT == 0.0) + if (leadingTrackPt == 0.0) + return false; + else + return true; + } + template + bool isJetAreaAccepted(const Jet& jet) + { + if (jet.area() < jetAreaFractionMin * o2::constants::math::PI * (jet.r() / 100.0) * (jet.r() / 100.0)) return false; else return true; @@ -610,19 +665,52 @@ struct JetSpectraEseTask { return true; } - template - std::unique_ptr fitRho(const C& col, const EventPlane& ep, T const& tracks) + template + bool isCentralitySelected(const Cent& centrality) + { + if (centrality < centRange->at(0) || centrality > centRange->at(1)) + return false; + else + return true; + } + + template + std::unique_ptr fitRho(const C& col, const EventPlane& ep, T const& tracks, J const& jets) { - auto hPhiPt = std::unique_ptr(new TH1F("h_ptsum_sumpt_fit", "h_ptsum_sumpt fit use", TMath::CeilNint(std::sqrt(tracks.size())), 0., o2::constants::math::TwoPI)); + float leadingJetPt = 0.0; + float leadingJetEta = 0.0; + // float leadingJetPhi = 0.0; + for (const auto& jet : jets) { + if (jet.pt() > leadingJetPt) { + leadingJetPt = jet.pt(); + leadingJetEta = jet.eta(); + // leadingJetPhi = jet.phi(); + } + } + + int nTrk{0}; + if (jets.size() > 0) { + for (const auto& track : tracks) { + registry.fill(HIST("hTrackCounter"), 0.5); + if (jetderiveddatautilities::selectTrack(track, trackSelection) && (std::fabs(track.eta() - leadingJetEta) > jetR) && track.pt() >= 0.2 && track.pt() <= 5) { + nTrk++; + registry.fill(HIST("hTrackCounter"), 1.5); + } + } + } + if (nTrk < 1) + return nullptr; + auto hPhiPt = std::unique_ptr(new TH1F("h_ptsum_sumpt_fit", "h_ptsum_sumpt fit use", TMath::CeilNint(std::sqrt(nTrk)), 0., o2::constants::math::TwoPI)); for (const auto& track : tracks) { - if (jetderiveddatautilities::selectTrack(track, trackSelection)) { + if (jetderiveddatautilities::selectTrack(track, trackSelection) && (std::fabs(track.eta() - leadingJetEta) > jetR) && track.pt() >= 0.2 && track.pt() <= 5) { hPhiPt->Fill(track.phi(), track.pt()); + registry.fill(HIST("hTrackCounter"), 2.5); if constexpr (fillHist) registry.fill(HIST("hPhiPtsum"), track.phi(), track.pt()); } } - auto modulationFit = std::unique_ptr(new TF1("fit_rholoc", "[0] * (1. + 2. * ([1] * cos(2. * (x - [2])) + [3] * cos(3. * (x - [4]))))", 0, o2::constants::math::TwoPI)); + auto modulationFit = std::unique_ptr(new TF1("fit_rholoc", "[0] * (1. + 2. * ([1] * std::cos(2. * (x - [2])) + [3] * std::cos(3. * (x - [4]))))", 0, o2::constants::math::TwoPI)); modulationFit->SetParameter(0, 1.0); modulationFit->SetParameter(1, 0.01); @@ -641,6 +729,9 @@ struct JetSpectraEseTask { registry.fill(HIST("hfitPar4"), col.centrality(), modulationFit->GetParameter(4)); } + if (modulationFit->GetParameter(0) <= 0) + return nullptr; + double chi2{0.}; for (int i{0}; i < hPhiPt->GetXaxis()->GetNbins(); i++) { if (hPhiPt->GetBinContent(i + 1) <= 0.) @@ -651,8 +742,8 @@ struct JetSpectraEseTask { int nDF{1}; int numParams{2}; nDF = static_cast(modulationFit->GetXaxis()->GetNbins()) - numParams; - if (nDF == 0 || static_cast(nDF) <= 0.) - nDF = 1; + if (nDF <= 0) + return nullptr; auto cDF = 1. - TMath::Gamma(nDF, chi2); @@ -665,12 +756,10 @@ struct JetSpectraEseTask { } template - double evalRho(TF1* fit, phiT const& jetPhi, rhoT const& colRho) + double evalRho(TF1* fit, const float& radius, phiT const& jetPhi, rhoT const& colRho) { - double integralValue{fit->Integral(jetPhi - jetR, jetPhi + jetR)}; - if (fit->GetParameter(0) < 0) - return colRho; - double rhoLocal{colRho / (2 * jetR * fit->GetParameter(0)) * integralValue}; + double integralValue{fit->Integral(jetPhi - radius, jetPhi + radius)}; + double rhoLocal{colRho / (2 * radius * fit->GetParameter(0)) * integralValue}; return rhoLocal; } @@ -683,7 +772,7 @@ struct JetSpectraEseTask { if (cfgEvSelOccupancy && !isOccupancyWithin(collision)) return; - const auto psi{procEP(collision)}; + const auto psi{procEP(collision)}; auto qPerc{collision.qPERCFT0C()}; if (qPerc[0] < 0) return; @@ -743,11 +832,44 @@ struct JetSpectraEseTask { auto rho = collision.rho(); std::unique_ptr rhoFit{nullptr}; if (cfgrhoPhi) { - rhoFit = fitRho(collision, psi, tracks); - rho = evalRho(rhoFit.get(), randomConePhi, rho); + rhoFit = fitRho(collision, psi, tracks, jets); + if (!rhoFit) + return; + rho = evalRho(rhoFit.get(), randomConeR, randomConePhi, rho); } float dPhi{RecoDecay::constrainAngle(randomConePhi - psi.psi2, -o2::constants::math::PI)}; registry.fill(HIST("hCentRhoRandomConewoLeadingJet"), collision.centrality(), randomConePt - o2::constants::math::PI * randomConeR * randomConeR * rho, dPhi, qPerc[0]); + + double randomConePtWithoutOneLeadJet = 0; + double randomConePtWithoutTwoLeadJet = 0; + if (jets.size() > 1) { // if there are no jets, or just one, in the acceptance (from the jetfinder cuts) then one cannot find 2 leading jets + for (auto const& track : tracks) { + if (jetderiveddatautilities::selectTrack(track, trackSelection)) { + float dPhi = RecoDecay::constrainAngle(randomNumber.Uniform(0.0, o2::constants::math::TwoPI) - randomConePhi, -o2::constants::math::PI); + float dEta = randomNumber.Uniform(trackEtaMin, trackEtaMax) - randomConeEta; + if (std::sqrt(dEta * dEta + dPhi * dPhi) < randomConeR) { + if (!isTrackInJet(track, jets.iteratorAt(0))) { + randomConePtWithoutOneLeadJet += track.pt(); + if (!isTrackInJet(track, jets.iteratorAt(1))) { + randomConePtWithoutTwoLeadJet += track.pt(); + } + } + } + } + } + } + registry.fill(HIST("hCentRhoRandomConeRndTrackDirwoOneLeadingJet"), collision.centrality(), randomConePtWithoutOneLeadJet - o2::constants::math::PI * randomConeR * randomConeR * rho, dPhi, qPerc[0]); + registry.fill(HIST("hCentRhoRandomConeRndTrackDirwoTwoLeadingJet"), collision.centrality(), randomConePtWithoutTwoLeadJet - o2::constants::math::PI * randomConeR * randomConeR * rho, dPhi, qPerc[0]); + } + template + bool isTrackInJet(TTracks const& track, TJets const& jet) + { + for (auto const& constituentId : jet.tracksIds()) { + if (constituentId == track.globalIndex()) { + return true; + } + } + return false; } }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From 0f4005abc53c88b3915967c567f08af76ca2567b Mon Sep 17 00:00:00 2001 From: sashingo Date: Wed, 5 Mar 2025 22:32:11 +0900 Subject: [PATCH 0550/1650] [PWGHF/HFL] Calculate mass of Zee (#10153) --- PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx | 72 +++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx b/PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx index cb04265fd4b..b966b1a1c36 100644 --- a/PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx +++ b/PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx @@ -12,6 +12,7 @@ /// \file taskElectronWeakBoson.cxx /// \brief task for WeakBoson (W/Z) based on electron in mid-rapidity /// \author S. Sakai & S. Ito (Univ. of Tsukuba) +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -30,6 +31,7 @@ #include "Common/DataModel/PIDResponse.h" #include "PWGJE/DataModel/EMCALClusters.h" +#include "PWGHF/Core/HfHelper.h" using namespace o2; using namespace o2::framework; @@ -54,6 +56,7 @@ struct HfTaskElectronWeakBoson { Configurable nclItsMin{"nclItsMin", 2.0f, "its # of cluster cut"}; Configurable nclTpcMin{"nclTpcMin", 100.0f, "tpc # if cluster cut"}; Configurable nclcrossTpcMin{"nclcrossTpcMin", 100.0f, "tpc # of crossedRows cut"}; + Configurable nsigTpcMinLose{"nsigTpcMinLose", -3.0, "tpc Nsig lose lower cut"}; Configurable nsigTpcMin{"nsigTpcMin", -1.0, "tpc Nsig lower cut"}; Configurable nsigTpcMax{"nsigTpcMax", 3.0, "tpc Nsig upper cut"}; @@ -72,6 +75,17 @@ struct HfTaskElectronWeakBoson { Configurable energyIsolationMax{"energyIsolationMax", 0.1, "isolation cut on energy"}; Configurable trackIsolationMax{"trackIsolationMax", 3, "Maximum number of tracks in isolation cone"}; + struct HfElectronCandidate { + float pt, eta, phi, energy; + int charge; + HfElectronCandidate(float ptr, float e, float ph, float en, int ch) + : pt(ptr), eta(e), phi(ph), energy(en), charge(ch) {} + + int sign() const { return charge; } + }; + std::vector selectedElectronsIso; + std::vector selectedElectronsAss; + using SelectedClusters = o2::aod::EMCALClusters; // PbPb using TrackEle = o2::soa::Join; @@ -118,6 +132,8 @@ struct HfTaskElectronWeakBoson { const AxisSpec axisEMCtime{200, -100.0, 100, "EMC time"}; const AxisSpec axisIsoEnergy{100, 0, 1, "Isolation energy(GeV/C)"}; const AxisSpec axisIsoTrack{20, -0.5, 19.5, "Isolation Track"}; + const AxisSpec axisInvMassZ{200, 0, 200, "M_{ee} (GeV/c^{2})"}; + const AxisSpec axisInvMassDy{200, 0, 2, "M_{ee} (GeV/c^{2})"}; // create registrygrams registry.add("hZvtx", "Z vertex", kTH1F, {axisZvtx}); @@ -144,6 +160,10 @@ struct HfTaskElectronWeakBoson { registry.add("hEMCtime", "EMC timing", kTH1F, {axisEMCtime}); registry.add("hIsolationEnergy", "Isolation Energy", kTH2F, {{axisE}, {axisIsoEnergy}}); registry.add("hIsolationTrack", "Isolation Track", kTH2F, {{axisE}, {axisIsoTrack}}); + registry.add("hInvMassZeeLs", "invariant mass for Z LS pair", kTH2F, {{axisPt}, {axisInvMassZ}}); + registry.add("hInvMassZeeUls", "invariant mass for Z ULS pair", kTH2F, {{axisPt}, {axisInvMassZ}}); + registry.add("hInvMassDyLs", "invariant mass for DY LS pair", kTH2F, {{axisPt}, {axisInvMassDy}}); + registry.add("hInvMassDyUls", "invariant mass for DY ULS pair", kTH2F, {{axisPt}, {axisInvMassDy}}); } bool isIsolatedCluster(const o2::aod::EMCALCluster& cluster, const SelectedClusters& clusters) @@ -247,6 +267,17 @@ struct HfTaskElectronWeakBoson { registry.fill(HIST("hPt"), track.pt()); registry.fill(HIST("hTPCNsigma"), track.p(), track.tpcNSigmaEl()); + float energyTrk = 0.0; + + if (track.tpcNSigmaEl() > nsigTpcMinLose && track.tpcNSigmaEl() < nsigTpcMax) { + selectedElectronsAss.emplace_back( + track.pt(), + track.eta(), + track.phi(), + energyTrk, + track.sign()); + } + // track - match // continue; @@ -279,6 +310,7 @@ struct HfTaskElectronWeakBoson { // LOG(info) << "tr phi0 = " << match.track_as().phi(); // LOG(info) << "tr phi1 = " << track.phi(); // LOG(info) << "emc phi = " << phiEmc; + if (nMatch == 0) { double dEta = match.track_as().trackEtaEmcal() - etaEmc; double dPhi = match.track_as().trackPhiEmcal() - phiEmc; @@ -303,6 +335,7 @@ struct HfTaskElectronWeakBoson { const auto& cluster = match.emcalcluster_as(); double eop = energyEmc / match.track_as().p(); + // LOG(info) << "E/p" << eop; registry.fill(HIST("hEopNsigTPC"), match.track_as().tpcNSigmaEl(), eop); registry.fill(HIST("hM02"), match.track_as().tpcNSigmaEl(), m02Emc); @@ -317,6 +350,13 @@ struct HfTaskElectronWeakBoson { if (isIsolated) { registry.fill(HIST("hEopIsolation"), match.track_as().pt(), eop); + + selectedElectronsIso.emplace_back( + match.track_as().pt(), + match.track_as().eta(), + match.track_as().phi(), + energyEmc, + match.track_as().sign()); } if (isIsolatedTr) { @@ -335,6 +375,38 @@ struct HfTaskElectronWeakBoson { } } // end of track loop + + // calculate inv. mass + if (selectedElectronsIso.size() > 1) { + for (size_t i = 0; i < selectedElectronsIso.size(); i++) { + const auto& e1 = selectedElectronsIso[i]; + for (size_t j = 0; j < selectedElectronsAss.size(); j++) { + const auto& e2 = selectedElectronsAss[j]; + + float ptIso = e1.pt; + float ptAss = e2.pt; + if (ptIso == ptAss) + continue; + auto arr1 = RecoDecayPtEtaPhi::pVector(e1.pt, e1.eta, e1.phi); + auto arr2 = RecoDecayPtEtaPhi::pVector(e2.pt, e2.eta, e2.phi); + double mass = RecoDecay::m(std::array{arr1, arr2}, std::array{o2::constants::physics::MassElectron, o2::constants::physics::MassElectron}); + if (e1.sign() * e2.sign() > 0) { + registry.fill(HIST("hInvMassDyLs"), ptIso, mass); + } else { + registry.fill(HIST("hInvMassDyUls"), ptIso, mass); + } + + if (ptAss < 20.0 && ptIso < 20.0) + continue; + + if (e1.sign() * e2.sign() > 0) { + registry.fill(HIST("hInvMassZeeLs"), ptIso, mass); + } else { + registry.fill(HIST("hInvMassZeeUls"), ptIso, mass); + } + } + } + } // end of inv. mass calculation } }; From 9d39bb98ce83498119303c1e1b5bc7c0bf862b75 Mon Sep 17 00:00:00 2001 From: lucamicheletti93 <38209984+lucamicheletti93@users.noreply.github.com> Date: Wed, 5 Mar 2025 15:21:11 +0100 Subject: [PATCH 0551/1650] [PWGDQ] Filling CosDeltaPhi in ME as in the past (#10332) Co-authored-by: Lucamicheletti93 --- PWGDQ/Core/VarManager.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 4f3d57282e3..8f28042c7d6 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -3121,8 +3121,10 @@ void VarManager::FillPairME(T1 const& t1, T2 const& t2, float* values) // Compute the scalar product UQ for two muon from different event using Q-vector from A, for second and third harmonic float Psi2A1 = getEventPlane(2, values[kQ2X0A1], values[kQ2Y0A1]); float Psi2A2 = getEventPlane(2, values[kQ2X0A2], values[kQ2Y0A2]); + values[kCos2DeltaPhi] = TMath::Cos(2 * (v12.Phi() - Psi2A1)); // WARNING: using the first event EP values[kCos2DeltaPhiEv1] = TMath::Cos(2 * (v1.Phi() - Psi2A1)); values[kCos2DeltaPhiEv2] = TMath::Cos(2 * (v2.Phi() - Psi2A2)); + values[kU2Q2] = values[kQ2X0A1] * TMath::Cos(2 * v12.Phi()) + values[kQ2Y0A1] * TMath::Sin(2 * v12.Phi()); // WARNING: using the first event EP values[kU2Q2Ev1] = values[kQ2X0A1] * TMath::Cos(2 * v1.Phi()) + values[kQ2Y0A1] * TMath::Sin(2 * v1.Phi()); values[kU2Q2Ev2] = values[kQ2X0A2] * TMath::Cos(2 * v2.Phi()) + values[kQ2Y0A2] * TMath::Sin(2 * v2.Phi()); From bcf9933a55f5684bd44e16389074d87a96c8961a Mon Sep 17 00:00:00 2001 From: YubiaoWang Date: Wed, 5 Mar 2025 22:33:46 +0800 Subject: [PATCH 0552/1650] [PWGJE] fixed delta pt distribution, add check plots with rho_local vs phi and centrality (#10329) --- PWGJE/Tasks/jetChargedV2.cxx | 294 ++++++++++++++++++----------------- 1 file changed, 153 insertions(+), 141 deletions(-) diff --git a/PWGJE/Tasks/jetChargedV2.cxx b/PWGJE/Tasks/jetChargedV2.cxx index 339941e001c..4468afdd727 100644 --- a/PWGJE/Tasks/jetChargedV2.cxx +++ b/PWGJE/Tasks/jetChargedV2.cxx @@ -145,7 +145,7 @@ struct JetChargedV2 { } //=====================< evt pln | end >=====================// - Configurable selectedJetsRadius{"selectedJetsRadius", 0.4, "resolution parameter for histograms without radius"}; + Configurable selectedJetsRadius{"selectedJetsRadius", 0.2, "resolution parameter for histograms without radius"}; std::vector jetPtBins; std::vector jetPtBinsRhoAreaSub; @@ -242,8 +242,13 @@ struct JetChargedV2 { registry.add("h_fitparav2obs_evtnum", "fitparameter v2obs vs evtnum ; #eventnumber", {HistType::kTH1F, {{1000, 0.0, 1000}}}); registry.add("h_fitparav3obs_evtnum", "fitparameter v3obs vs evtnum ; #eventnumber", {HistType::kTH1F, {{1000, 0.0, 1000}}}); - registry.add("h2_centrality_rhophi", "centrality vs #rho(#varphi); centrality; #rho(#varphi) ", {HistType::kTH2F, {{120, -10.0, 110.0}, {210, -10.0, 200.0}}}); - registry.add("h2_phi_rhophi", "#varphi vs #rho(#varphi); #varphi - #Psi_{EP,2}; #rho(#varphi) ", {HistType::kTH2F, {{40, 0., o2::constants::math::TwoPI}, {210, -10.0, 200.0}}}); + registry.add("h2_phi_rhophi", "#varphi vs #rho(#varphi); #varphi - #Psi_{EP,2}; #rho_{ch}(#varphi) ", {HistType::kTH2F, {{40, 0., o2::constants::math::TwoPI}, {210, -10.0, 200.0}}}); + registry.add("h2_phi_rholocal", "#varphi vs #rho(#varphi); #varphi - #Psi_{EP,2}; #rho(#varphi) ", {HistType::kTH2F, {{40, 0., o2::constants::math::TwoPI}, {210, -10.0, 200.0}}}); + registry.add("h2_phi_rhomedian", "#varphi vs #rho(#varphi); #varphi - #Psi_{EP,2}; #rho_{median} ", {HistType::kTH2F, {{40, 0., o2::constants::math::TwoPI}, {210, -10.0, 200.0}}}); + + registry.add("h2_fitParaZero_cent", "#varphi vs #rho(#varphi); #cent; #fitParameter[0] ", {HistType::kTH2F, {{100, 0., 100}, {210, -10.0, 200.0}}}); + registry.add("h2_phi_rholocal_cent", "#varphi vs #rho(#varphi); #cent; #rho(#varphi) ", {HistType::kTH2F, {{100, 0., 100}, {210, -10.0, 200.0}}}); + registry.add("h2_phi_rhomedian_cent", "#varphi vs #rho(#varphi); #cent; #rho_{median} ", {HistType::kTH2F, {{100, 0., 100}, {210, -10.0, 200.0}}}); registry.add("h3_centrality_rhovsphi_phi", "centrality; #rho(#varphi); #Delta#varphi_{jet}", {HistType::kTH3F, {{120, -10.0, 110.0}, {200, 0.0, 200.0}, {40, 0., o2::constants::math::TwoPI}}}); //< \sigma p_T at local rho test plot | end > @@ -255,18 +260,22 @@ struct JetChargedV2 { registry.add("h_jet_pt_rhoareasubtracted", "jet pT rhoareasubtracted;#it{p}_{T,jet} (GeV/#it{c}); entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); registry.add("h_jet_pt_rholocal", "jet pT rholocal;#it{p}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); + registry.add("h2_centrality_jet_pt_rhoareasubtracted", "centrality vs #it{p}_{T,jet}; centrality; #it{p}_{T,jet} (GeV/#it{c})", {HistType::kTH2F, {{1200, -10.0, 110.0}, jetPtAxisRhoAreaSub}}); + registry.add("leadJetPt", "leadJet Pt ", {HistType::kTH1F, {{200, 0., 200.0}}}); registry.add("leadJetPhi", "leadJet constituent #phi ", {HistType::kTH1F, {{80, -1.0, 7.}}}); registry.add("leadJetEta", "leadJet constituent #eta ", {HistType::kTH1F, {{100, -1.0, 1.0}}}); //< RC test plots >// - registry.add("h3_centrality_deltapT_RandomCornPhi_rhorandomconewithoutleadingjet", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}; #Delta#varphi_{jet}", {HistType::kTH3F, {{120, -10.0, 110.0}, {800, -400.0, 400.0}, {160, 0., o2::constants::math::TwoPI}}}); - registry.add("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithoutleadingjet", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}(#varphi); #Delta#varphi_{jet}", {HistType::kTH3F, {{120, -10.0, 110.0}, {800, -400.0, 400.0}, {160, 0., o2::constants::math::TwoPI}}}); - registry.add("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithoutoneleadingjet", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}(#varphi); #Delta#varphi_{jet}", {HistType::kTH3F, {{120, -10.0, 110.0}, {800, -400.0, 400.0}, {160, 0., o2::constants::math::TwoPI}}}); - registry.add("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithouttwoleadingjet", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}(#varphi); #Delta#varphi_{jet}", {HistType::kTH3F, {{120, -10.0, 110.0}, {800, -400.0, 400.0}, {160, 0., o2::constants::math::TwoPI}}}); + registry.add("h3_centrality_deltapT_RandomCornPhi_rhorandomconewithoutleadingjet", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}; #Delta#varphi_{jet}", {HistType::kTH3F, {{100, 0.0, 100.0}, {400, -200.0, 200.0}, {100, 0., o2::constants::math::TwoPI}}}); + registry.add("h3_centrality_deltapT_RandomCornPhi_localrhovsphi", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}; #Delta#varphi_{jet}", {HistType::kTH3F, {{100, 0.0, 100.0}, {400, -200.0, 200.0}, {100, 0., o2::constants::math::TwoPI}}}); + registry.add("h3_centrality_deltapT_RandomCornPhi_RCprocess_rhorandomconewithoutleadingjet", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}; #Delta#varphi_{jet}", {HistType::kTH3F, {{100, 0.0, 100.0}, {400, -200.0, 200.0}, {100, 0., o2::constants::math::TwoPI}}}); + + registry.add("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithoutleadingjet", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}(#varphi); #Delta#varphi_{jet}", {HistType::kTH3F, {{100, 0.0, 100.0}, {400, -200.0, 200.0}, {100, 0., o2::constants::math::TwoPI}}}); + registry.add("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithoutoneleadingjet", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}(#varphi); #Delta#varphi_{jet}", {HistType::kTH3F, {{100, 0.0, 100.0}, {400, -200.0, 200.0}, {100, 0., o2::constants::math::TwoPI}}}); + registry.add("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithouttwoleadingjet", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}(#varphi); #Delta#varphi_{jet}", {HistType::kTH3F, {{100, 0.0, 100.0}, {400, -200.0, 200.0}, {100, 0., o2::constants::math::TwoPI}}}); //< bkg sub plot | end >// //< median rho >// - registry.add("h_jet_pt_in_out_plane_v2", "jet pT;#it{p}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); registry.add("h_jet_pt_in_plane_v2", "jet pT;#it{p}^{in-plane}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); registry.add("h_jet_pt_out_of_plane_v2", "jet pT;#it{p}^{out-of-plane}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); registry.add("h_jet_pt_in_plane_v3", "jet pT;#it{p}^{in-plane}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); @@ -277,7 +286,7 @@ struct JetChargedV2 { registry.add("h2_centrality_jet_pt_in_plane_v3", "centrality vs #it{p}^{in-plane}_{T,jet}; centrality; #it{p}_{T,jet} (GeV/#it{c})", {HistType::kTH2F, {{120, -10.0, 110.0}, jetPtAxisRhoAreaSub}}); registry.add("h2_centrality_jet_pt_out_of_plane_v3", "centrality vs #it{p}^{out-of-plane}_{T,jet}; centrality; #it{p}_{T,jet} (GeV/#it{c})", {HistType::kTH2F, {{120, -10.0, 110.0}, jetPtAxisRhoAreaSub}}); //< rho(phi) >// - registry.add("h_jet_pt_in_out_plane_v2_rho", "jet pT;#it{p}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); + registry.add("h_jet_pt_inclusive_v2_rho", "jet pT;#it{p}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); registry.add("h_jet_pt_in_plane_v2_rho", "jet pT;#it{p}^{in-plane}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); registry.add("h_jet_pt_out_of_plane_v2_rho", "jet pT;#it{p}^{out-of-plane}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); registry.add("h_jet_pt_in_plane_v3_rho", "jet pT;#it{p}^{in-plane}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); @@ -419,7 +428,7 @@ struct JetChargedV2 { if (collision.qvecAmp()[detId] < 1e-8) { continue; } - float evtPl2 = helperEP.GetEventPlane(collision.qvecRe()[detInd], collision.qvecIm()[detInd], nmode); + float ep2 = helperEP.GetEventPlane(collision.qvecRe()[detInd], collision.qvecIm()[detInd], nmode); for (auto const& jet : jets) { if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { continue; @@ -427,11 +436,13 @@ struct JetChargedV2 { if (!isAcceptedJet(jet)) { continue; } - registry.fill(HIST("h_jet_pt_rhoareasubtracted"), jet.pt() - (collision.rho() * jet.area()), 1); - if (jet.r() == round(selectedJetsRadius * 100.0f)) { - registry.fill(HIST("h_jet_pt_in_out_plane_v2"), jet.pt() - (collision.rho() * jet.area()), 1.0); + if (jet.r() != round(selectedJetsRadius * 100.0f)) { + continue; } - phiMinusPsi2 = jet.phi() - evtPl2; + registry.fill(HIST("h_jet_pt_rhoareasubtracted"), jet.pt() - (collision.rho() * jet.area()), 1.0); + registry.fill(HIST("h2_centrality_jet_pt_rhoareasubtracted"), collision.centrality(), jet.pt() - (collision.rho() * jet.area()), 1.0); + + phiMinusPsi2 = jet.phi() - ep2; if ((phiMinusPsi2 < o2::constants::math::PIQuarter) || (phiMinusPsi2 >= 7 * o2::constants::math::PIQuarter) || (phiMinusPsi2 >= 3 * o2::constants::math::PIQuarter && phiMinusPsi2 < 5 * o2::constants::math::PIQuarter)) { registry.fill(HIST("h_jet_pt_in_plane_v2"), jet.pt() - (collision.rho() * jet.area()), 1.0); @@ -443,7 +454,7 @@ struct JetChargedV2 { } } else if (nmode == 3) { double phiMinusPsi3; - float evtPl3 = helperEP.GetEventPlane(collision.qvecRe()[detInd], collision.qvecIm()[detInd], nmode); + float ep3 = helperEP.GetEventPlane(collision.qvecRe()[detInd], collision.qvecIm()[detInd], nmode); for (auto const& jet : jets) { if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { continue; @@ -451,7 +462,10 @@ struct JetChargedV2 { if (!isAcceptedJet(jet)) { continue; } - phiMinusPsi3 = jet.phi() - evtPl3; + if (jet.r() != round(selectedJetsRadius * 100.0f)) { + continue; + } + phiMinusPsi3 = jet.phi() - ep3; if ((phiMinusPsi3 < o2::constants::math::PIQuarter) || (phiMinusPsi3 >= 7 * o2::constants::math::PIQuarter) || (phiMinusPsi3 >= 3 * o2::constants::math::PIQuarter && phiMinusPsi3 < 5 * o2::constants::math::PIQuarter)) { registry.fill(HIST("h_jet_pt_in_plane_v3"), jet.pt() - (collision.rho() * jet.area()), 1.0); @@ -594,13 +608,12 @@ struct JetChargedV2 { registry.fill(HIST("h_v2obs_centrality"), collision.centrality(), temppara[1]); registry.fill(HIST("h_v3obs_centrality"), collision.centrality(), temppara[3]); + registry.fill(HIST("h_evtnum_centrlity"), evtnum, collision.centrality()); - for (auto const& jet : jets) { - if ((std::fabs(jet.eta() - leadingJetEta) > jetRadius) && jet.pt() >= 0.2 && jet.pt() <= 5.) { - registry.fill(HIST("h2_centrality_rhophi"), collision.centrality(), fFitModulationV2v3->Eval(jet.phi()), 1.0); - } + if (temppara[0] == 0) { + return; } - registry.fill(HIST("h_evtnum_centrlity"), evtnum, collision.centrality()); + registry.fill(HIST("h2_fitParaZero_cent"), collision.centrality(), temppara[0], 1.0); int nDF = 1; int numOfFreePara = 2; @@ -631,33 +644,37 @@ struct JetChargedV2 { } else if (evtcent >= 30 && evtcent <= 50) { registry.fill(HIST("h2_PChi2_CombinFitB"), cDF, chiSqr / (static_cast(nDF))); } - for (uint i = 0; i < cfgnMods->size(); i++) { int nmode = cfgnMods->at(i); int detInd = detId * 4 + cfgnTotalSystem * 4 * (nmode - 2); + for (auto const& jet : jets) { + if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + if (!isAcceptedJet(jet)) { + continue; + } + if (jet.r() != round(selectedJetsRadius * 100.0f)) { + continue; + } + double integralValue = fFitModulationV2v3->Integral(jet.phi() - jetRadius, jet.phi() + jetRadius); double rholocal = collision.rho() / (2 * jetRadius * temppara[0]) * integralValue; - - registry.fill(HIST("h_jet_pt_rholocal"), jet.pt() - (rholocal * jet.area()), 1.0); + registry.fill(HIST("h2_phi_rholocal_cent"), collision.centrality(), rholocal, 1.0); + registry.fill(HIST("h2_phi_rhomedian_cent"), collision.centrality(), collision.rho(), 1.0); if (nmode == 2) { + registry.fill(HIST("h_jet_pt_rholocal"), jet.pt() - (rholocal * jet.area()), 1.0); + double phiMinusPsi2; if (collision.qvecAmp()[detId] < 1e-8) { continue; } - float evtPl2 = helperEP.GetEventPlane(collision.qvecRe()[detInd], collision.qvecIm()[detInd], nmode); - if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { - continue; - } - if (!isAcceptedJet(jet)) { - continue; - } + phiMinusPsi2 = jet.phi() - ep2; - if (jet.r() == round(selectedJetsRadius * 100.0f)) { - registry.fill(HIST("h_jet_pt_in_out_plane_v2_rho"), jet.pt() - (rholocal * jet.area()), 1.0); - } - phiMinusPsi2 = jet.phi() - evtPl2; + registry.fill(HIST("h2_phi_rholocal"), jet.phi() - ep2, rholocal, 1.0); + registry.fill(HIST("h_jet_pt_inclusive_v2_rho"), jet.pt() - (rholocal * jet.area()), 1.0); if ((phiMinusPsi2 < o2::constants::math::PIQuarter) || (phiMinusPsi2 >= 7 * o2::constants::math::PIQuarter) || (phiMinusPsi2 >= 3 * o2::constants::math::PIQuarter && phiMinusPsi2 < 5 * o2::constants::math::PIQuarter)) { registry.fill(HIST("h_jet_pt_in_plane_v2_rho"), jet.pt() - (rholocal * jet.area()), 1.0); @@ -666,17 +683,13 @@ struct JetChargedV2 { registry.fill(HIST("h_jet_pt_out_of_plane_v2_rho"), jet.pt() - (rholocal * jet.area()), 1.0); registry.fill(HIST("h2_centrality_jet_pt_out_of_plane_v2_rho"), collision.centrality(), jet.pt() - (rholocal * jet.area()), 1.0); } - } else if (nmode == 3) { double phiMinusPsi3; - float evtPl3 = helperEP.GetEventPlane(collision.qvecRe()[detInd], collision.qvecIm()[detInd], nmode); - if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { - continue; - } - if (!isAcceptedJet(jet)) { + if (collision.qvecAmp()[detId] < 1e-8) { continue; } - phiMinusPsi3 = jet.phi() - evtPl3; + ep3 = helperEP.GetEventPlane(collision.qvecRe()[detInd], collision.qvecIm()[detInd], nmode); + phiMinusPsi3 = jet.phi() - ep3; if ((phiMinusPsi3 < o2::constants::math::PIQuarter) || (phiMinusPsi3 >= 7 * o2::constants::math::PIQuarter) || (phiMinusPsi3 >= 3 * o2::constants::math::PIQuarter && phiMinusPsi3 < 5 * o2::constants::math::PIQuarter)) { registry.fill(HIST("h_jet_pt_in_plane_v3_rho"), jet.pt() - (rholocal * jet.area()), 1.0); @@ -695,86 +708,81 @@ struct JetChargedV2 { float randomConePhi = randomNumber.Uniform(0.0, o2::constants::math::TwoPI); float randomConePt = 0; - int nmode = cfgnMods->at(i); - int detInd = detId * 4 + cfgnTotalSystem * 4 * (nmode - 2); + double integralValueRC = fFitModulationV2v3->Integral(randomConePhi - randomConeR, randomConePhi + randomConeR); + double rholocalRC = collision.rho() / (2 * randomConeR * temppara[0]) * integralValueRC; - double rcPhiPsi2; - float evtPl2 = helperEP.GetEventPlane(collision.qvecRe()[detInd], collision.qvecIm()[detInd], nmode); - rcPhiPsi2 = randomConePhi - evtPl2; + int nmode = cfgnMods->at(i); + if (nmode == 2) { + double rcPhiPsi2; + rcPhiPsi2 = randomConePhi - ep2; - for (auto const& jet : jets) { - registry.fill(HIST("h2_phi_rhophi"), jet.phi() - evtPl2, fFitModulationV2v3->Eval(jet.phi()), 1.0); - registry.fill(HIST("h3_centrality_rhovsphi_phi"), collision.centrality(), fFitModulationV2v3->Eval(jet.phi()), jet.phi() - evtPl2); - } + for (auto const& jet : jets) { + registry.fill(HIST("h2_phi_rhophi"), jet.phi() - ep2, fFitModulationV2v3->Eval(jet.phi()), 1.0); + registry.fill(HIST("h3_centrality_rhovsphi_phi"), collision.centrality(), fFitModulationV2v3->Eval(jet.phi()), jet.phi() - ep2); + } - for (auto const& track : tracks) { - if (jetderiveddatautilities::selectTrack(track, trackSelection)) { - float dPhi = RecoDecay::constrainAngle(track.phi() - randomConePhi, static_cast(-o2::constants::math::PI)); - float dEta = track.eta() - randomConeEta; - if (std::sqrt(dEta * dEta + dPhi * dPhi) < randomConeR) { - randomConePt += track.pt(); + for (auto const& track : tracks) { + if (jetderiveddatautilities::selectTrack(track, trackSelection)) { + float dPhi = RecoDecay::constrainAngle(track.phi() - randomConePhi, static_cast(-o2::constants::math::PI)); + float dEta = track.eta() - randomConeEta; + if (std::sqrt(dEta * dEta + dPhi * dPhi) < randomConeR) { + randomConePt += track.pt(); + } } } - } - double integralValue = 0; - double rholocal = 0; - for (auto const& jet : jets) { - if (temppara[0] == 0) { - break; - } - integralValue = fFitModulationV2v3->Integral(jet.phi() - jetRadius, jet.phi() + jetRadius); - rholocal = collision.rho() / (2 * jetRadius * temppara[0]) * integralValue; - } - // removing the leading jet from the random cone - if (jets.size() > 0) { // if there are no jets in the acceptance (from the jetfinder cuts) then there can be no leading jet - float dPhiLeadingJet = RecoDecay::constrainAngle(jets.iteratorAt(0).phi() - randomConePhi, static_cast(-o2::constants::math::PI)); - float dEtaLeadingJet = jets.iteratorAt(0).eta() - randomConeEta; - - bool jetWasInCone = false; - while (std::sqrt(dEtaLeadingJet * dEtaLeadingJet + dPhiLeadingJet * dPhiLeadingJet) < jets.iteratorAt(0).r() / 100.0 + randomConeR) { - jetWasInCone = true; - randomConeEta = randomNumber.Uniform(trackEtaMin + randomConeR, trackEtaMax - randomConeR); - randomConePhi = randomNumber.Uniform(0.0, o2::constants::math::TwoPI); - dPhiLeadingJet = RecoDecay::constrainAngle(jets.iteratorAt(0).phi() - randomConePhi, static_cast(-o2::constants::math::PI)); - dEtaLeadingJet = jets.iteratorAt(0).eta() - randomConeEta; - } - if (jetWasInCone) { - randomConePt = 0.0; - for (auto const& track : tracks) { - if (jetderiveddatautilities::selectTrack(track, trackSelection)) { // if track selection is uniformTrack, dcaXY and dcaZ cuts need to be added as they aren't in the selection so that they can be studied here - float dPhi = RecoDecay::constrainAngle(track.phi() - randomConePhi, static_cast(-o2::constants::math::PI)); - float dEta = track.eta() - randomConeEta; - if (std::sqrt(dEta * dEta + dPhi * dPhi) < randomConeR) { - randomConePt += track.pt(); + registry.fill(HIST("h3_centrality_deltapT_RandomCornPhi_localrhovsphi"), collision.centrality(), randomConePt - o2::constants::math::PI * randomConeR * randomConeR * rholocalRC, rcPhiPsi2, 1.0); + + // removing the leading jet from the random cone + if (jets.size() > 0) { // if there are no jets in the acceptance (from the jetfinder cuts) then there can be no leading jet + float dPhiLeadingJet = RecoDecay::constrainAngle(jets.iteratorAt(0).phi() - randomConePhi, static_cast(-o2::constants::math::PI)); + float dEtaLeadingJet = jets.iteratorAt(0).eta() - randomConeEta; + + bool jetWasInCone = false; + while (std::sqrt(dEtaLeadingJet * dEtaLeadingJet + dPhiLeadingJet * dPhiLeadingJet) < jets.iteratorAt(0).r() / 100.0 + randomConeR) { + jetWasInCone = true; + randomConeEta = randomNumber.Uniform(trackEtaMin + randomConeR, trackEtaMax - randomConeR); + randomConePhi = randomNumber.Uniform(0.0, o2::constants::math::TwoPI); + dPhiLeadingJet = RecoDecay::constrainAngle(jets.iteratorAt(0).phi() - randomConePhi, static_cast(-o2::constants::math::PI)); + dEtaLeadingJet = jets.iteratorAt(0).eta() - randomConeEta; + } + if (jetWasInCone) { + randomConePt = 0.0; + for (auto const& track : tracks) { + if (jetderiveddatautilities::selectTrack(track, trackSelection)) { // if track selection is uniformTrack, dcaXY and dcaZ cuts need to be added as they aren't in the selection so that they can be studied here + float dPhi = RecoDecay::constrainAngle(track.phi() - randomConePhi, static_cast(-o2::constants::math::PI)); + float dEta = track.eta() - randomConeEta; + if (std::sqrt(dEta * dEta + dPhi * dPhi) < randomConeR) { + randomConePt += track.pt(); + } } } } } - } - if (temppara[0] == 0) { - break; - } - registry.fill(HIST("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithoutleadingjet"), collision.centrality(), randomConePt - o2::constants::math::PI * randomConeR * randomConeR * rholocal, rcPhiPsi2, 1.0); - - // randomised eta,phi for tracks, to assess part of fluctuations coming from statistically independently emitted particles, removing tracks from 2 leading jets - double randomConePtWithoutOneLeadJet = 0; - double randomConePtWithoutTwoLeadJet = 0; - for (auto const& track : tracks) { - if (jetderiveddatautilities::selectTrack(track, trackSelection)) { - float dPhi = RecoDecay::constrainAngle(randomNumber.Uniform(0.0, o2::constants::math::TwoPI) - randomConePhi, static_cast(-o2::constants::math::PI)); - float dEta = randomNumber.Uniform(trackEtaMin, trackEtaMax) - randomConeEta; - if (std::sqrt(dEta * dEta + dPhi * dPhi) < randomConeR) { - if (!trackIsInJet(track, jets.iteratorAt(0))) { - randomConePtWithoutOneLeadJet += track.pt(); - if (!trackIsInJet(track, jets.iteratorAt(1))) { - randomConePtWithoutTwoLeadJet += track.pt(); + registry.fill(HIST("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithoutleadingjet"), collision.centrality(), randomConePt - o2::constants::math::PI * randomConeR * randomConeR * rholocalRC, rcPhiPsi2, 1.0); + registry.fill(HIST("h3_centrality_deltapT_RandomCornPhi_rhorandomconewithoutleadingjet"), collision.centrality(), randomConePt - o2::constants::math::PI * randomConeR * randomConeR * collision.rho(), rcPhiPsi2, 1.0); + + // randomised eta,phi for tracks, to assess part of fluctuations coming from statistically independently emitted particles, removing tracks from 2 leading jets + double randomConePtWithoutOneLeadJet = 0; + double randomConePtWithoutTwoLeadJet = 0; + for (auto const& track : tracks) { + if (jetderiveddatautilities::selectTrack(track, trackSelection)) { + float dPhi = RecoDecay::constrainAngle(randomNumber.Uniform(0.0, o2::constants::math::TwoPI) - randomConePhi, static_cast(-o2::constants::math::PI)); + float dEta = randomNumber.Uniform(trackEtaMin, trackEtaMax) - randomConeEta; + if (std::sqrt(dEta * dEta + dPhi * dPhi) < randomConeR) { + if (!trackIsInJet(track, jets.iteratorAt(0))) { + randomConePtWithoutOneLeadJet += track.pt(); + if (!trackIsInJet(track, jets.iteratorAt(1))) { + randomConePtWithoutTwoLeadJet += track.pt(); + } } } } } + registry.fill(HIST("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithoutoneleadingjet"), collision.centrality(), randomConePtWithoutOneLeadJet - o2::constants::math::PI * randomConeR * randomConeR * rholocalRC, rcPhiPsi2, 1.0); + registry.fill(HIST("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithouttwoleadingjet"), collision.centrality(), randomConePtWithoutTwoLeadJet - o2::constants::math::PI * randomConeR * randomConeR * rholocalRC, rcPhiPsi2, 1.0); + } else if (nmode == 3) { + continue; } - registry.fill(HIST("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithoutoneleadingjet"), collision.centrality(), randomConePtWithoutOneLeadJet - o2::constants::math::PI * randomConeR * randomConeR * rholocal, rcPhiPsi2, 1.0); - registry.fill(HIST("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithouttwoleadingjet"), collision.centrality(), randomConePtWithoutTwoLeadJet - o2::constants::math::PI * randomConeR * randomConeR * rholocal, rcPhiPsi2, 1.0); } delete hPtsumSumptFit; evtnum += 1; @@ -801,46 +809,50 @@ struct JetChargedV2 { int nmode = cfgnMods->at(i); int detInd = detId * 4 + cfgnTotalSystem * 4 * (nmode - 2); - double rcPhiPsi2; - float evtPl2 = helperEP.GetEventPlane(collision.qvecRe()[detInd], collision.qvecIm()[detInd], nmode); - rcPhiPsi2 = randomConePhi - evtPl2; - - for (auto const& track : tracks) { - if (jetderiveddatautilities::selectTrack(track, trackSelection)) { - float dPhi = RecoDecay::constrainAngle(track.phi() - randomConePhi, static_cast(-o2::constants::math::PI)); - float dEta = track.eta() - randomConeEta; - if (std::sqrt(dEta * dEta + dPhi * dPhi) < randomConeR) { - randomConePt += track.pt(); + if (nmode == 2) { + double rcPhiPsi2; + float evtPl2 = helperEP.GetEventPlane(collision.qvecRe()[detInd], collision.qvecIm()[detInd], nmode); + rcPhiPsi2 = randomConePhi - evtPl2; + + for (auto const& track : tracks) { + if (jetderiveddatautilities::selectTrack(track, trackSelection)) { + float dPhi = RecoDecay::constrainAngle(track.phi() - randomConePhi, static_cast(-o2::constants::math::PI)); + float dEta = track.eta() - randomConeEta; + if (std::sqrt(dEta * dEta + dPhi * dPhi) < randomConeR) { + randomConePt += track.pt(); + } } } - } - // removing the leading jet from the random cone - if (jets.size() > 0) { // if there are no jets in the acceptance (from the jetfinder cuts) then there can be no leading jet - float dPhiLeadingJet = RecoDecay::constrainAngle(jets.iteratorAt(0).phi() - randomConePhi, static_cast(-o2::constants::math::PI)); - float dEtaLeadingJet = jets.iteratorAt(0).eta() - randomConeEta; - - bool jetWasInCone = false; - while (std::sqrt(dEtaLeadingJet * dEtaLeadingJet + dPhiLeadingJet * dPhiLeadingJet) < jets.iteratorAt(0).r() / 100.0 + randomConeR) { - jetWasInCone = true; - randomConeEta = randomNumber.Uniform(trackEtaMin + randomConeR, trackEtaMax - randomConeR); - randomConePhi = randomNumber.Uniform(0.0, o2::constants::math::TwoPI); - dPhiLeadingJet = RecoDecay::constrainAngle(jets.iteratorAt(0).phi() - randomConePhi, static_cast(-o2::constants::math::PI)); - dEtaLeadingJet = jets.iteratorAt(0).eta() - randomConeEta; - } - if (jetWasInCone) { - randomConePt = 0.0; - for (auto const& track : tracks) { - if (jetderiveddatautilities::selectTrack(track, trackSelection)) { - float dPhi = RecoDecay::constrainAngle(track.phi() - randomConePhi, static_cast(-o2::constants::math::PI)); - float dEta = track.eta() - randomConeEta; - if (std::sqrt(dEta * dEta + dPhi * dPhi) < randomConeR) { - randomConePt += track.pt(); + // removing the leading jet from the random cone + if (jets.size() > 0) { // if there are no jets in the acceptance (from the jetfinder cuts) then there can be no leading jet + float dPhiLeadingJet = RecoDecay::constrainAngle(jets.iteratorAt(0).phi() - randomConePhi, static_cast(-o2::constants::math::PI)); + float dEtaLeadingJet = jets.iteratorAt(0).eta() - randomConeEta; + + bool jetWasInCone = false; + while (std::sqrt(dEtaLeadingJet * dEtaLeadingJet + dPhiLeadingJet * dPhiLeadingJet) < jets.iteratorAt(0).r() / 100.0 + randomConeR) { + jetWasInCone = true; + randomConeEta = randomNumber.Uniform(trackEtaMin + randomConeR, trackEtaMax - randomConeR); + randomConePhi = randomNumber.Uniform(0.0, o2::constants::math::TwoPI); + dPhiLeadingJet = RecoDecay::constrainAngle(jets.iteratorAt(0).phi() - randomConePhi, static_cast(-o2::constants::math::PI)); + dEtaLeadingJet = jets.iteratorAt(0).eta() - randomConeEta; + } + if (jetWasInCone) { + randomConePt = 0.0; + for (auto const& track : tracks) { + if (jetderiveddatautilities::selectTrack(track, trackSelection)) { + float dPhi = RecoDecay::constrainAngle(track.phi() - randomConePhi, static_cast(-o2::constants::math::PI)); + float dEta = track.eta() - randomConeEta; + if (std::sqrt(dEta * dEta + dPhi * dPhi) < randomConeR) { + randomConePt += track.pt(); + } } } } } + registry.fill(HIST("h3_centrality_deltapT_RandomCornPhi_RCprocess_rhorandomconewithoutleadingjet"), collision.centrality(), randomConePt - o2::constants::math::PI * randomConeR * randomConeR * collision.rho(), rcPhiPsi2, 1.0); + } else if (nmode == 3) { + continue; } - registry.fill(HIST("h3_centrality_deltapT_RandomCornPhi_rhorandomconewithoutleadingjet"), collision.centrality(), randomConePt - o2::constants::math::PI * randomConeR * randomConeR * collision.rho(), rcPhiPsi2, 1.0); } } PROCESS_SWITCH(JetChargedV2, processRandomConeDataV2, "QA for random cone estimation of background fluctuations in data", true); From 98cf998a50f563d8c80136784e01e52eb9005c02 Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Wed, 5 Mar 2025 15:53:16 +0100 Subject: [PATCH 0553/1650] [PWGLF] Resonance Table - Update table descriptions (#10335) --- PWGLF/DataModel/LFResonanceTables.h | 43 ++++++++++--------- .../Resonances/resonanceInitializer.cxx | 5 +-- .../Resonances/resonanceModuleInitializer.cxx | 12 +----- 3 files changed, 24 insertions(+), 36 deletions(-) diff --git a/PWGLF/DataModel/LFResonanceTables.h b/PWGLF/DataModel/LFResonanceTables.h index 177f8789a4a..2f2a041f324 100644 --- a/PWGLF/DataModel/LFResonanceTables.h +++ b/PWGLF/DataModel/LFResonanceTables.h @@ -16,6 +16,7 @@ /// /// \author Bong-Hwi Lim /// \author Nasir Mehdi Malik +/// \author Minjae Kim /// #ifndef PWGLF_DATAMODEL_LFRESONANCETABLES_H_ @@ -72,7 +73,7 @@ DECLARE_SOA_COLUMN(IsInAfterAllCuts, isInAfterAllCuts, bool); //! InAfterAllCuts DECLARE_SOA_COLUMN(ImpactParameter, impactParameter, float); //! ImpactParameter } // namespace resocollision -DECLARE_SOA_TABLE(ResoCollisions, "AOD", "RESOCOLLISIONS", +DECLARE_SOA_TABLE(ResoCollisions, "AOD", "RESOCOLLISION", o2::soa::Index<>, resocollision::CollisionId, o2::aod::mult::MultNTracksPV, @@ -90,7 +91,7 @@ DECLARE_SOA_TABLE(ResoCollisions, "AOD", "RESOCOLLISIONS", evsel::NumTracksInTimeRange); using ResoCollision = ResoCollisions::iterator; -DECLARE_SOA_TABLE(ResoMCCollisions, "AOD", "RESOMCCOLLISIONS", +DECLARE_SOA_TABLE(ResoMCCollisions, "AOD", "RESOMCCOLLISION", o2::soa::Index<>, resocollision::IsVtxIn10, resocollision::IsINELgt0, @@ -100,13 +101,13 @@ DECLARE_SOA_TABLE(ResoMCCollisions, "AOD", "RESOMCCOLLISIONS", resocollision::ImpactParameter); using ResoMCCollision = ResoMCCollisions::iterator; -DECLARE_SOA_TABLE(ResoSpheroCollisions, "AOD", "RESOSPHEROCOLLISIONS", +DECLARE_SOA_TABLE(ResoSpheroCollisions, "AOD", "RESOSPHEROCOLLISION", o2::soa::Index<>, resocollision::CollisionId, resocollision::Spherocity); using ResoSpheroCollision = ResoSpheroCollisions::iterator; -DECLARE_SOA_TABLE(ResoEvtPlCollisions, "AOD", "RESOEVTPLCOLLISIONS", +DECLARE_SOA_TABLE(ResoEvtPlCollisions, "AOD", "RESOEVTPLCOLLISION", o2::soa::Index<>, resocollision::CollisionId, resocollision::EvtPl, @@ -116,7 +117,7 @@ DECLARE_SOA_TABLE(ResoEvtPlCollisions, "AOD", "RESOEVTPLCOLLISIONS", using ResoEvtPlCollision = ResoEvtPlCollisions::iterator; // For DF mixing study -DECLARE_SOA_TABLE(ResoCollisionDFs, "AOD", "RESOCOLLISIONDFS", +DECLARE_SOA_TABLE(ResoCollisionDFs, "AOD", "RESOCOLLISIONDF", o2::soa::Index<>, // resocollision::CollisionId, o2::aod::mult::MultNTracksPV, @@ -155,8 +156,8 @@ DECLARE_SOA_COLUMN(TempFitVar, tempFitVar, float); //! DECLARE_SOA_COLUMN(Indices, indices, int[2]); //! Field for the track indices to remove auto-correlations DECLARE_SOA_COLUMN(CascadeIndices, cascadeIndices, int[3]); //! Field for the track indices to remove auto-correlations (ordered: positive, negative, bachelor) DECLARE_SOA_COLUMN(Sign, sign, int8_t); //! Sign of the track charge -DECLARE_SOA_COLUMN(TPCNClsCrossedRows, tpcNClsCrossedRows, uint8_t); //! Number of TPC crossed rows -DECLARE_SOA_COLUMN(TPCNClsFound, tpcNClsFound, uint8_t); //! Number of TPC clusters found +DECLARE_SOA_COLUMN(TpcNClsCrossedRows, tpcNClsCrossedRows, uint8_t); //! Number of TPC crossed rows +DECLARE_SOA_COLUMN(TpcNClsFound, tpcNClsFound, uint8_t); //! Number of TPC clusters found DECLARE_SOA_COLUMN(IsGlobalTrackWoDCA, isGlobalTrackWoDCA, bool); //! Is global track without DCA DECLARE_SOA_COLUMN(IsGlobalTrack, isGlobalTrack, bool); //! Is global track DECLARE_SOA_COLUMN(IsPrimaryTrack, isPrimaryTrack, bool); //! Is primary track @@ -239,7 +240,7 @@ DECLARE_SOA_DYNAMIC_COLUMN(TofNSigmaPr, tofNSigmaPr, return (float)tofNSigmaPr10 / 10.f; }); } // namespace resodaughter -DECLARE_SOA_TABLE(ResoTracks, "AOD", "RESOTRACKS", +DECLARE_SOA_TABLE(ResoTracks, "AOD", "RESOTRACK", o2::soa::Index<>, resodaughter::ResoCollisionId, resodaughter::TrackId, @@ -250,8 +251,8 @@ DECLARE_SOA_TABLE(ResoTracks, "AOD", "RESOTRACKS", resodaughter::Eta, resodaughter::Phi, resodaughter::Sign, - resodaughter::TPCNClsCrossedRows, - resodaughter::TPCNClsFound, + resodaughter::TpcNClsCrossedRows, + resodaughter::TpcNClsFound, o2::aod::track::DcaXY, o2::aod::track::DcaZ, resodaughter::HasTOF, @@ -278,7 +279,7 @@ DECLARE_SOA_TABLE(ResoTracks, "AOD", "RESOTRACKS", using ResoTrack = ResoTracks::iterator; // For DF mixing study -DECLARE_SOA_TABLE(ResoTrackDFs, "AOD", "RESOTRACKDFS", +DECLARE_SOA_TABLE(ResoTrackDFs, "AOD", "RESOTRACKDF", o2::soa::Index<>, resodaughter::ResoCollisionDFId, // resodaughter::TrackId, @@ -289,8 +290,8 @@ DECLARE_SOA_TABLE(ResoTrackDFs, "AOD", "RESOTRACKDFS", resodaughter::Eta, resodaughter::Phi, resodaughter::Sign, - resodaughter::TPCNClsCrossedRows, - resodaughter::TPCNClsFound, + resodaughter::TpcNClsCrossedRows, + resodaughter::TpcNClsFound, o2::aod::track::DcaXY, o2::aod::track::DcaZ, resodaughter::HasTOF, @@ -316,7 +317,7 @@ DECLARE_SOA_TABLE(ResoTrackDFs, "AOD", "RESOTRACKDFS", resodaughter::TofNSigmaPr); using ResoTrackDF = ResoTrackDFs::iterator; -DECLARE_SOA_TABLE(ResoV0s, "AOD", "RESOV0S", +DECLARE_SOA_TABLE(ResoV0s, "AOD", "RESOV0", o2::soa::Index<>, resodaughter::ResoCollisionId, resodaughter::V0Id, @@ -353,7 +354,7 @@ DECLARE_SOA_TABLE(ResoV0s, "AOD", "RESOV0S", resodaughter::DecayVtxZ); using ResoV0 = ResoV0s::iterator; -DECLARE_SOA_TABLE(ResoCascades, "AOD", "RESOCASCADES", +DECLARE_SOA_TABLE(ResoCascades, "AOD", "RESOCASCADE", o2::soa::Index<>, resodaughter::ResoCollisionId, resodaughter::CascadeId, @@ -402,7 +403,7 @@ DECLARE_SOA_TABLE(ResoCascades, "AOD", "RESOCASCADES", resodaughter::DecayVtxZ); using ResoCascade = ResoCascades::iterator; -DECLARE_SOA_TABLE(ResoCascadeDFs, "AOD", "RESOCASCADEDFS", +DECLARE_SOA_TABLE(ResoCascadeDFs, "AOD", "RESOCASCADEDF", o2::soa::Index<>, resodaughter::ResoCollisionDFId, // resodaughter::CascadeId, @@ -451,7 +452,7 @@ DECLARE_SOA_TABLE(ResoCascadeDFs, "AOD", "RESOCASCADEDFS", resodaughter::DecayVtxZ); using ResoCascadeDF = ResoCascadeDFs::iterator; -DECLARE_SOA_TABLE(ResoMCTracks, "AOD", "RESOMCTRACKS", +DECLARE_SOA_TABLE(ResoMCTracks, "AOD", "RESOMCTRACK", mcparticle::PdgCode, resodaughter::MotherId, resodaughter::MotherPDG, @@ -460,7 +461,7 @@ DECLARE_SOA_TABLE(ResoMCTracks, "AOD", "RESOMCTRACKS", resodaughter::ProducedByGenerator); using ResoMCTrack = ResoMCTracks::iterator; -DECLARE_SOA_TABLE(ResoMCV0s, "AOD", "RESOMCV0S", +DECLARE_SOA_TABLE(ResoMCV0s, "AOD", "RESOMCV0", mcparticle::PdgCode, resodaughter::MotherId, resodaughter::MotherPDG, @@ -472,7 +473,7 @@ DECLARE_SOA_TABLE(ResoMCV0s, "AOD", "RESOMCV0S", resodaughter::ProducedByGenerator); using ResoMCV0 = ResoMCV0s::iterator; -DECLARE_SOA_TABLE(ResoMCCascades, "AOD", "RESOMCCASCADES", +DECLARE_SOA_TABLE(ResoMCCascades, "AOD", "RESOMCCASCADE", mcparticle::PdgCode, resodaughter::MotherId, resodaughter::MotherPDG, @@ -484,7 +485,7 @@ DECLARE_SOA_TABLE(ResoMCCascades, "AOD", "RESOMCCASCADES", resodaughter::ProducedByGenerator); using ResoMCCascade = ResoMCCascades::iterator; -DECLARE_SOA_TABLE(ResoMCParents, "AOD", "RESOMCPARENTS", +DECLARE_SOA_TABLE(ResoMCParents, "AOD", "RESOMCPARENT", o2::soa::Index<>, resodaughter::ResoCollisionId, resodaughter::McParticleId, @@ -509,7 +510,7 @@ using Reso2TracksMC = soa::Join; using Reso2TracksPID = soa::Join; using Reso2TracksPIDExt = soa::Join; // Without Extra -using ResoCollisionCandidates = soa::Join; +using ResoCollisionCandidates = soa::Join; using ResoRun2CollisionCandidates = soa::Join; using ResoCollisionCandidatesMC = soa::Join; using ResoRun2CollisionCandidatesMC = soa::Join; diff --git a/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx b/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx index e08ec4fe8f3..f6102d736dd 100644 --- a/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx +++ b/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx @@ -220,7 +220,7 @@ struct ResonanceInitializer { || (nabs(aod::mcparticle::pdgCode) == 123314) // Xi(1820)0 || (nabs(aod::mcparticle::pdgCode) == 123324); // Xi(1820)-0 - using ResoEvents = soa::Join; + using ResoEvents = soa::Join; using ResoRun2Events = soa::Join; using ResoEventsMC = soa::Join; using ResoRun2EventsMC = soa::Join; @@ -510,9 +510,6 @@ struct ResonanceInitializer { case 2: returnValue = ResoEvents.centFT0A(); break; - case 99: - returnValue = ResoEvents.centFV0A(); - break; default: returnValue = ResoEvents.centFT0M(); break; diff --git a/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx b/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx index 6b1033b77b2..fbfcb0c0a40 100644 --- a/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx +++ b/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx @@ -139,8 +139,6 @@ struct ResonanceModuleInitializer { multEstimator = 1; } else if (cfgMultName.value == "FT0A") { multEstimator = 2; - } else if (cfgMultName.value == "FV0A") { - multEstimator = 99; } LOGF(info, "Mult estimator: %d, %s", multEstimator, cfgMultName.value.c_str()); @@ -278,7 +276,7 @@ struct ResonanceModuleInitializer { break; case 1: if constexpr (isMC) { - LOG(fatal) << "CentFV0A is not available for MC"; + LOG(fatal) << "CentFT0C is not available for MC"; return returnValue; } else { returnValue = ResoEvents.centFT0C(); @@ -292,14 +290,6 @@ struct ResonanceModuleInitializer { returnValue = ResoEvents.centFT0A(); break; } - case 99: - if constexpr (isMC) { - LOG(fatal) << "CentFV0A is not available for MC"; - return returnValue; - } else { - returnValue = ResoEvents.centFV0A(); - break; - } default: returnValue = ResoEvents.centFT0M(); break; From 6d73081ef6b1919442cdcad1175de2e4f470a994 Mon Sep 17 00:00:00 2001 From: Luca Barioglio Date: Wed, 5 Mar 2025 17:33:13 +0100 Subject: [PATCH 0554/1650] Fix scalar product involving FT0C (#10337) --- PWGLF/TableProducer/QC/flowQC.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGLF/TableProducer/QC/flowQC.cxx b/PWGLF/TableProducer/QC/flowQC.cxx index b5fa4586f71..f5dfa06f9d7 100644 --- a/PWGLF/TableProducer/QC/flowQC.cxx +++ b/PWGLF/TableProducer/QC/flowQC.cxx @@ -293,7 +293,7 @@ struct flowQC { float QxFT0C_Qvec = collision.qvecFT0CRe(); float QyFT0C_Qvec = collision.qvecFT0CIm(); float QmodFT0C_Qvec = std::hypot(QxFT0C_Qvec, QyFT0C_Qvec); - float psiFT0C_Qvec = computeEventPlane(QyFT0C_Qvec, QxFT0A_Qvec); + float psiFT0C_Qvec = computeEventPlane(QyFT0C_Qvec, QxFT0C_Qvec); float QxTPCl_Qvec = collision.qvecBNegRe(); float QyTPCl_Qvec = collision.qvecBNegIm(); From fab2ca07896c91276f79f3ab3fce08ecfb9d229f Mon Sep 17 00:00:00 2001 From: Ionut Cristian Arsene Date: Wed, 5 Mar 2025 19:40:42 +0100 Subject: [PATCH 0555/1650] [PWGDQ] Added posibility to run with multiple associated hadron cuts in the dilepton-track analysis task (#10339) Co-authored-by: Ionut Cristian Arsene --- PWGDQ/Tasks/dqEfficiency_withAssoc.cxx | 509 +++++++++++++++---------- PWGDQ/Tasks/tableReader_withAssoc.cxx | 405 +++++++++++++------- 2 files changed, 568 insertions(+), 346 deletions(-) diff --git a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx index a1834f5b58c..9e50ca50be6 100644 --- a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx +++ b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx @@ -23,6 +23,7 @@ #include #include #include +#include #include "CCDB/BasicCCDBManager.h" #include "DataFormatsParameters/GRPObject.h" #include "Framework/runDataProcessing.h" @@ -83,6 +84,7 @@ DECLARE_SOA_COLUMN(CosPBcandidate, cosPBcandidate, float); DECLARE_SOA_COLUMN(Chi2Bcandidate, chi2Bcandidate, float); DECLARE_SOA_COLUMN(DCAxyzBetweenProngs, dcaxyzBetweenProngs, float); DECLARE_SOA_COLUMN(McFlag, mcFlag, int8_t); +DECLARE_SOA_BITMAP_COLUMN(IsJpsiFromBSelected, isJpsiFromBSelected, 32); // Candidate columns for prompt-non-prompt JPsi separation DECLARE_SOA_COLUMN(Massee, massee, float); DECLARE_SOA_COLUMN(Ptee, ptee, float); @@ -100,7 +102,12 @@ DECLARE_SOA_TABLE(BarrelAmbiguities, "AOD", "DQBARRELAMB", dqanalysisflags::Barr DECLARE_SOA_TABLE(MuonTrackCuts, "AOD", "DQANAMUONCUTS", dqanalysisflags::IsMuonSelected); //! joinable to ReducedMuonsAssoc DECLARE_SOA_TABLE(MuonAmbiguities, "AOD", "DQMUONAMB", dqanalysisflags::MuonAmbiguityInBunch, dqanalysisflags::MuonAmbiguityOutOfBunch); //! joinable to ReducedMuonTracks DECLARE_SOA_TABLE(Prefilter, "AOD", "DQPREFILTER", dqanalysisflags::IsBarrelSelectedPrefilter); //! joinable to ReducedTracksAssoc -DECLARE_SOA_TABLE(BmesonCandidates, "AOD", "DQBMESONS", dqanalysisflags::massBcandidate, dqanalysisflags::deltaMassBcandidate, dqanalysisflags::pTBcandidate, dqanalysisflags::LxyBcandidate, dqanalysisflags::LxyzBcandidate, dqanalysisflags::LzBcandidate, dqanalysisflags::TauxyBcandidate, dqanalysisflags::TauzBcandidate, dqanalysisflags::DCAxyzBetweenProngs, dqanalysisflags::CosPBcandidate, dqanalysisflags::Chi2Bcandidate, dqanalysisflags::McFlag); +DECLARE_SOA_TABLE(BmesonCandidates, "AOD", "DQBMESONS", + dqanalysisflags::massBcandidate, dqanalysisflags::deltaMassBcandidate, dqanalysisflags::pTBcandidate, + dqanalysisflags::LxyBcandidate, dqanalysisflags::LxyzBcandidate, dqanalysisflags::LzBcandidate, + dqanalysisflags::TauxyBcandidate, dqanalysisflags::TauzBcandidate, dqanalysisflags::DCAxyzBetweenProngs, + dqanalysisflags::CosPBcandidate, dqanalysisflags::Chi2Bcandidate, + dqanalysisflags::IsJpsiFromBSelected, dqanalysisflags::IsBarrelSelected, dqanalysisflags::McFlag); DECLARE_SOA_TABLE(JPsieeCandidates, "AOD", "DQPSEUDOPROPER", dqanalysisflags::Massee, dqanalysisflags::Ptee, dqanalysisflags::Lxyee, dqanalysisflags::LxyeePoleMass, dqanalysisflags::Lzee, dqanalysisflags::AmbiguousInBunchPairs, dqanalysisflags::AmbiguousOutOfBunchPairs, dqanalysisflags::Corrassoc); } // namespace o2::aod @@ -3092,7 +3099,7 @@ struct AnalysisDileptonTrack { Produces BmesonsTable; OutputObj fOutputList{"output"}; - Configurable fConfigTrackCut{"cfgTrackCut", "kaonPID", "Cut for the track to be correlated with the dileptons"}; + Configurable fConfigTrackCuts{"cfgTrackCuts", "kaonPID", "Comma separated list of track cuts to be correlated with the dileptons"}; Configurable fConfigDileptonLowMass{"cfgDileptonLowMass", 2.8, "Low mass cut for the dileptons used in analysis"}; Configurable fConfigDileptonHighMass{"cfgDileptonHighMass", 3.2, "High mass cut for the dileptons used in analysis"}; Configurable fConfigDileptonpTCut{"cfgDileptonpTCut", 0.0, "pT cut for dileptons used in the triplet vertexing"}; @@ -3106,20 +3113,22 @@ struct AnalysisDileptonTrack { Configurable fConfigGRPmagPath{"cfgGrpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; Configurable fConfigMagField{"cfgMagField", 5.0f, "Manually set magnetic field"}; - Configurable fConfigMCRecSignals{"cfgBarrelMCRecSignals", "", "Comma separated list of MC signals (reconstructed)"}; - Configurable fConfigMCGenSignals{"cfgBarrelMCGenSignals", "", "Comma separated list of MC signals (generated)"}; + Configurable fConfigMCRecSignals{"cfgMCRecSignals", "", "Comma separated list of MC signals (reconstructed)"}; + Configurable fConfigMCGenSignals{"cfgMCGenSignals", "", "Comma separated list of MC signals (generated)"}; + Configurable fConfigMCRecSignalsJSON{"cfgMCRecSignalsJSON", "", "Additional list of MC signals (reconstructed) via JSON"}; + Configurable fConfigMCGenSignalsJSON{"cfgMCGenSignalsJSON", "", "Comma separated list of MC signals (generated) via JSON"}; int fCurrentRun; // needed to detect if the run changed and trigger update of calibrations etc. int fNCuts; int fNPairCuts; int fNCommonTrackCuts; std::map fCommonTrackCutMap; - int fTrackCutBit; - std::map fHistNamesDileptonTrack; - // std::map fHistNamesDileptonTrackMCmatched; - std::map> fHistNamesDileptonTrackMCmatched; - std::vector fHistNamesMCgen; - std::map fHistNamesDileptons; + uint32_t fTrackCutBitMap; // track cut bit mask to be used in the selection of tracks associated with dileptons + // vector for single-lepton and track cut names for easy access when calling FillHistogramList() + std::vector fTrackCutNames; + // vector for pair cut names, used mainly for pairs built via the asymmetric pairing task + std::vector fPairCutNames; + std::vector fCommonPairCutNames; Service fCCDB; @@ -3136,23 +3145,20 @@ struct AnalysisDileptonTrack { float* fValuesHadron; HistogramManager* fHistMan; - std::vector fRecMCSignals; - std::vector fGenMCSignals; + std::vector fRecMCSignals; + std::vector fGenMCSignals; void init(o2::framework::InitContext& context) { - if (context.mOptions.get("processDummy")) { - return; - } - bool isBarrel = context.mOptions.get("processBarrelSkimmed"); bool isBarrelAsymmetric = context.mOptions.get("processDstarToD0Pi"); bool isMuon = context.mOptions.get("processMuonSkimmed"); - bool isAnyProcessEnabled = isBarrel || isMuon || isBarrelAsymmetric; + bool isMCGen = context.mOptions.get("processMCGen"); bool isDummy = context.mOptions.get("processDummy"); + if (isDummy) { - if (isAnyProcessEnabled) { - LOG(warning) << "Dummy function is enabled even if there are normal process functions running! Fix your config!" << endl; + if (isBarrel || isMuon || isBarrelAsymmetric || isMCGen) { + LOG(fatal) << "Dummy function is enabled even if there are normal process functions running! Fix your config!" << endl; } else { LOG(info) << "Dummy function is enabled. Skipping the rest of the init function" << endl; return; @@ -3162,10 +3168,10 @@ struct AnalysisDileptonTrack { fCurrentRun = 0; fValuesDilepton = new float[VarManager::kNVars]; fValuesHadron = new float[VarManager::kNVars]; - fTrackCutBit = -1; + fTrackCutBitMap = 0; VarManager::SetDefaultVarNames(); fHistMan = new HistogramManager("analysisHistos", "aa", VarManager::kNVars); - fHistMan->SetUseDefaultVariableNames(kTRUE); + fHistMan->SetUseDefaultVariableNames(true); fHistMan->SetDefaultVarNames(VarManager::fgVariableNames, VarManager::fgVariableUnits); TString sigNamesStr = fConfigMCRecSignals.value; @@ -3175,153 +3181,225 @@ struct AnalysisDileptonTrack { MCSignal* sig = o2::aod::dqmcsignals::GetMCSignal(objRecSigArray->At(isig)->GetName()); if (sig) { if (sig->GetNProngs() != 3) { - continue; + LOG(fatal) << "Signal at reconstructed level requested (" << sig->GetName() << ") " << "does not have 3 prongs! Fix it"; } - fRecMCSignals.push_back(*sig); + fRecMCSignals.push_back(sig); + } else { + LOG(fatal) << "Signal at reconstructed level requested (" << objRecSigArray->At(isig)->GetName() << ") " << "could not be retrieved from the library! -> skipped"; + } + } + } + + // Add the reco MCSignals from the JSON config + TString addMCSignalsStr = fConfigMCRecSignalsJSON.value; + if (addMCSignalsStr != "") { + std::vector addMCSignals = dqmcsignals::GetMCSignalsFromJSON(addMCSignalsStr.Data()); + for (auto& mcIt : addMCSignals) { + if (mcIt->GetNProngs() != 3) { + LOG(fatal) << "Signal at reconstructed level requested (" << mcIt->GetName() << ") " << "does not have 3 prongs! Fix it"; + } + fRecMCSignals.push_back(mcIt); + } + } + + // Add histogram classes for each specified MCsignal at the generator level + // TODO: create a std::vector of hist classes to be used at Fill time, to avoid using Form in the process function + TString sigGenNamesStr = fConfigMCGenSignals.value; + std::unique_ptr objGenSigArray(sigGenNamesStr.Tokenize(",")); + for (int isig = 0; isig < objGenSigArray->GetEntries(); isig++) { + MCSignal* sig = o2::aod::dqmcsignals::GetMCSignal(objGenSigArray->At(isig)->GetName()); + if (sig) { + if (sig->GetNProngs() == 1) { // NOTE: 1-prong signals required + fGenMCSignals.push_back(sig); + } + } + } + + // Add the gen MCSignals from the JSON config + addMCSignalsStr = fConfigMCGenSignalsJSON.value; + if (addMCSignalsStr != "") { + std::vector addMCSignals = dqmcsignals::GetMCSignalsFromJSON(addMCSignalsStr.Data()); + for (auto& mcIt : addMCSignals) { + if (mcIt->GetNProngs() == 1) { + fGenMCSignals.push_back(mcIt); } } } // For each track/muon selection used to produce dileptons, create a separate histogram directory using the // name of the track/muon cut. - // Also, create a map which will hold the name of the histogram directories so they can be accessed directly in the pairing loop - if (isBarrel || isMuon || isBarrelAsymmetric) { - // get the list of single track and muon cuts computed in the dedicated tasks upstream - string tempCutsSingle; - if (isBarrel || isBarrelAsymmetric) { - getTaskOptionValue(context, "analysis-track-selection", "cfgTrackCuts", tempCutsSingle, false); - } else { - getTaskOptionValue(context, "analysis-muon-selection", "cfgMuonCuts", tempCutsSingle, false); - } - TString tempCutsSingleStr = tempCutsSingle; - TObjArray* objArraySingleCuts = nullptr; - if (!tempCutsSingleStr.IsNull()) { - objArraySingleCuts = tempCutsSingleStr.Tokenize(","); - } - if (objArraySingleCuts->FindObject(fConfigTrackCut.value.data()) == nullptr) { - LOG(fatal) << " Track cut chosen for the correlation task was not computed in the single-track task! Check it out!"; - } - // Loop over single-track/muon task cuts and find the cuts used for the track to be combined with dileptons - for (int icut = 0; icut < objArraySingleCuts->GetEntries(); ++icut) { - TString tempStr = objArraySingleCuts->At(icut)->GetName(); - if (tempStr.CompareTo(fConfigTrackCut.value.data()) == 0) { - fTrackCutBit = icut; // the bit corresponding to the track to be combined with dileptons - } - } - // get the cuts employed for same-event pairing - string tempCutsPair; - string tempCutsAsymPair; - string tempCutsAsymCommon; - if (isBarrel) { - getTaskOptionValue(context, "analysis-same-event-pairing", "cfgTrackCuts", tempCutsPair, false); - } else if (isMuon) { - getTaskOptionValue(context, "analysis-same-event-pairing", "cfgMuonCuts", tempCutsPair, false); - } else if (isBarrelAsymmetric) { - getTaskOptionValue(context, "analysis-asymmetric-pairing", "cfgLegCuts", tempCutsPair, false); - getTaskOptionValue(context, "analysis-asymmetric-pairing", "cfgPairCuts", tempCutsAsymPair, false); - getTaskOptionValue(context, "analysis-asymmetric-pairing", "cfgCommonTrackCuts", tempCutsAsymCommon, false); - } - - // If asymmetric pair is used, it may have common track cuts - TString tempCutsAsymCommonStr = tempCutsAsymCommon; - if (!tempCutsAsymCommonStr.IsNull()) { // if common track cuts - std::unique_ptr objArrayCommon(tempCutsAsymCommonStr.Tokenize(",")); - fNCommonTrackCuts = objArrayCommon->GetEntries(); - for (int icut = 0; icut < fNCommonTrackCuts; ++icut) { - for (int iicut = 0; iicut < objArraySingleCuts->GetEntries(); ++iicut) { - if (std::strcmp(objArrayCommon->At(icut)->GetName(), objArraySingleCuts->At(iicut)->GetName()) == 0) { - fCommonTrackCutMap[icut] = iicut; - } + + // Get the list of single track and muon cuts computed in the dedicated tasks upstream + // We need this to know the order in which they were computed, and also to make sure that in this task we do not ask + // for cuts which were not computed (in which case this will trigger a fatal) + string cfgTrackSelection_TrackCuts; + if (isBarrel || isBarrelAsymmetric) { + getTaskOptionValue(context, "analysis-track-selection", "cfgTrackCuts", cfgTrackSelection_TrackCuts, false); + } else { + getTaskOptionValue(context, "analysis-muon-selection", "cfgMuonCuts", cfgTrackSelection_TrackCuts, false); + } + TObjArray* cfgTrackSelection_objArrayTrackCuts = nullptr; + if (!cfgTrackSelection_TrackCuts.empty()) { + cfgTrackSelection_objArrayTrackCuts = TString(cfgTrackSelection_TrackCuts).Tokenize(","); + } + // get also the list of cuts specified via the JSON parameters + if (isBarrel || isBarrelAsymmetric) { + getTaskOptionValue(context, "analysis-track-selection", "cfgBarrelTrackCutsJSON", cfgTrackSelection_TrackCuts, false); + } else { + getTaskOptionValue(context, "analysis-muon-selection", "cfgMuonCutsJSON", cfgTrackSelection_TrackCuts, false); + } + if (!cfgTrackSelection_TrackCuts.empty()) { + if (cfgTrackSelection_objArrayTrackCuts == nullptr) { + cfgTrackSelection_objArrayTrackCuts = new TObjArray(); + } + std::vector addTrackCuts = dqcuts::GetCutsFromJSON(cfgTrackSelection_TrackCuts.data()); + for (auto& t : addTrackCuts) { + TObjString* tempObjStr = new TObjString(t->GetName()); + cfgTrackSelection_objArrayTrackCuts->Add(tempObjStr); + } + } + if (cfgTrackSelection_objArrayTrackCuts->GetEntries() == 0) { + LOG(fatal) << " No track cuts found in the barrel or muon upstream tasks"; + } + // store all the computed track cut names in a vector + for (int icut = 0; icut < cfgTrackSelection_objArrayTrackCuts->GetEntries(); icut++) { + fTrackCutNames.push_back(cfgTrackSelection_objArrayTrackCuts->At(icut)->GetName()); + } + // get the list of associated track cuts to be combined with the dileptons, + // check that these were computed upstream, and create a bit mask + TObjArray* cfgDileptonTrack_objArrayTrackCuts = nullptr; + if (!fConfigTrackCuts.value.empty()) { + cfgDileptonTrack_objArrayTrackCuts = TString(fConfigTrackCuts.value).Tokenize(","); + } else { + LOG(fatal) << " No track cuts specified! Check it out!"; + } + // loop over these cuts and check they were computed upstream (otherwise trigger a fatal) + for (int icut = 0; icut < cfgDileptonTrack_objArrayTrackCuts->GetEntries(); icut++) { + if (!cfgTrackSelection_objArrayTrackCuts->FindObject(cfgDileptonTrack_objArrayTrackCuts->At(icut)->GetName())) { + LOG(fatal) << "Specified track cut (" << cfgDileptonTrack_objArrayTrackCuts->At(icut)->GetName() << ") not found in the list of computed cuts by the single barrel / muon selection tasks"; + } + } + // loop over all the upstream cuts and make a bit mask for the track cuts specified in this task + for (int icut = 0; icut < cfgTrackSelection_objArrayTrackCuts->GetEntries(); icut++) { + if (cfgDileptonTrack_objArrayTrackCuts->FindObject(cfgTrackSelection_objArrayTrackCuts->At(icut)->GetName())) { + fTrackCutBitMap |= (uint32_t(1) << icut); + } + } + // finally, store the total number of upstream tasks, for easy access + fNCuts = fTrackCutNames.size(); + + // get the cuts employed for same-event pairing + // NOTE: The track/muon cuts in analysis-same-event-pairing are used to select electrons/muons to build dielectrons/dimuons + // NOTE: The cfgPairCuts in analysis-same-event-pairing are used to apply an additional selection on top of the already produced dileptons + // but this is only used for histograms, not for the produced dilepton tables + string cfgPairing_TrackCuts; + string cfgPairing_PairCuts; + string cfgPairing_CommonTrackCuts; + if (isBarrel) { + getTaskOptionValue(context, "analysis-same-event-pairing", "cfgTrackCuts", cfgPairing_TrackCuts, false); + getTaskOptionValue(context, "analysis-same-event-pairing", "cfgPairCuts", cfgPairing_PairCuts, false); + } else if (isMuon) { + getTaskOptionValue(context, "analysis-same-event-pairing", "cfgMuonCuts", cfgPairing_TrackCuts, false); + getTaskOptionValue(context, "analysis-same-event-pairing", "cfgPairCuts", cfgPairing_PairCuts, false); + } else if (isBarrelAsymmetric) { + getTaskOptionValue(context, "analysis-asymmetric-pairing", "cfgLegCuts", cfgPairing_TrackCuts, false); + getTaskOptionValue(context, "analysis-asymmetric-pairing", "cfgPairCuts", cfgPairing_PairCuts, false); + getTaskOptionValue(context, "analysis-asymmetric-pairing", "cfgCommonTrackCuts", cfgPairing_CommonTrackCuts, false); + } + if (cfgPairing_TrackCuts.empty()) { + LOG(fatal) << "There are no dilepton cuts specified in the upstream in the same-event-pairing or assymmetric-pairing"; + } + + // If asymmetric pair is used, it may have common track cuts + TString cfgPairing_strCommonTrackCuts = cfgPairing_CommonTrackCuts; + if (!cfgPairing_strCommonTrackCuts.IsNull()) { // if common track cuts + std::unique_ptr objArrayCommon(cfgPairing_strCommonTrackCuts.Tokenize(",")); + fNCommonTrackCuts = objArrayCommon->GetEntries(); + for (int icut = 0; icut < fNCommonTrackCuts; ++icut) { + for (int iicut = 0; iicut < cfgTrackSelection_objArrayTrackCuts->GetEntries(); iicut++) { + if (std::strcmp(cfgTrackSelection_objArrayTrackCuts->At(iicut)->GetName(), objArrayCommon->At(icut)->GetName()) == 0) { + fCommonTrackCutMap[icut] = iicut; + fCommonPairCutNames.push_back(objArrayCommon->At(icut)->GetName()); } } } + } // end if (common cuts) + + std::unique_ptr objArrayPairCuts(TString(cfgPairing_PairCuts).Tokenize(",")); + fNPairCuts = objArrayPairCuts->GetEntries(); + for (int j = 0; j < fNPairCuts; j++) { + fPairCutNames.push_back(objArrayPairCuts->At(j)->GetName()); + } + + // array of single lepton cuts specified in the same-analysis-pairing task + std::unique_ptr cfgPairing_objArrayTrackCuts(TString(cfgPairing_TrackCuts).Tokenize(",")); + + // loop over single lepton cuts + if (isBarrel || isBarrelAsymmetric || isMuon) { + for (int icut = 0; icut < fNCuts; ++icut) { + + // here we check that this cut is one of those used for building the dileptons + if (!cfgPairing_objArrayTrackCuts->FindObject(fTrackCutNames[icut].Data())) { + continue; + } - TString tempCutsPairStr = tempCutsPair; - if (!tempCutsSingleStr.IsNull() && !tempCutsPairStr.IsNull()) { - std::unique_ptr objArray(tempCutsPairStr.Tokenize(",")); - fNCuts = objArray->GetEntries(); - for (int icut = 0; icut < fNCuts; ++icut) { - TString tempStr = objArray->At(icut)->GetName(); - fHistNamesDileptonTrack[icut] = Form("DileptonTrack_%s_%s", tempStr.Data(), fConfigTrackCut.value.data()); - fHistNamesDileptons[icut] = Form("DileptonsSelected_%s", tempStr.Data()); - DefineHistograms(fHistMan, fHistNamesDileptonTrack[icut], fConfigHistogramSubgroups.value.data()); // define dilepton-track histograms - DefineHistograms(fHistMan, fHistNamesDileptons[icut], "barrel,vertexing"); // define dilepton histograms - if (!tempCutsAsymCommonStr.IsNull()) { - std::unique_ptr objArrayCommon(tempCutsAsymCommonStr.Tokenize(",")); + TString pairLegCutName = fTrackCutNames[icut].Data(); + // define dilepton histograms + DefineHistograms(fHistMan, Form("DileptonsSelected_%s", pairLegCutName.Data()), "barrel,vertexing"); + // loop over track cuts and create dilepton - track histogram directories + for (int iCutTrack = 0; iCutTrack < fNCuts; iCutTrack++) { + + // here we check that this track cut is one of those required to associate with the dileptons + if (!(fTrackCutBitMap & (uint32_t(1) << iCutTrack))) { + continue; + } + + DefineHistograms(fHistMan, Form("DileptonTrack_%s_%s", pairLegCutName.Data(), fTrackCutNames[iCutTrack].Data()), fConfigHistogramSubgroups.value.data()); + for (auto& sig : fRecMCSignals) { + DefineHistograms(fHistMan, Form("DileptonTrackMCMatched_%s_%s_%s", pairLegCutName.Data(), fTrackCutNames[iCutTrack].Data(), sig->GetName()), fConfigHistogramSubgroups.value.data()); + } + + if (!cfgPairing_strCommonTrackCuts.IsNull()) { + std::unique_ptr objArrayCommon(cfgPairing_strCommonTrackCuts.Tokenize(",")); for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { - fHistNamesDileptonTrack[fNCuts + icut * fNCommonTrackCuts + iCommonCut] = Form("DileptonTrack_%s_%s_%s", tempStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), fConfigTrackCut.value.data()); - fHistNamesDileptons[fNCuts + icut * fNCommonTrackCuts + iCommonCut] = Form("DileptonsSelected_%s_%s", tempStr.Data(), objArrayCommon->At(iCommonCut)->GetName()); - DefineHistograms(fHistMan, fHistNamesDileptonTrack[fNCuts + icut * fNCommonTrackCuts + iCommonCut], fConfigHistogramSubgroups.value.data()); // define dilepton-track histograms - DefineHistograms(fHistMan, fHistNamesDileptons[fNCuts + icut * fNCommonTrackCuts + iCommonCut], "barrel,vertexing"); // define dilepton histograms + DefineHistograms(fHistMan, Form("DileptonTrack_%s_%s_%s", pairLegCutName.Data(), fCommonPairCutNames[iCommonCut].Data(), fTrackCutNames[iCutTrack].Data()), fConfigHistogramSubgroups.value.data()); + for (auto& sig : fRecMCSignals) { + DefineHistograms(fHistMan, Form("DileptonTrackMCMatched_%s_%s_%s_%s", pairLegCutName.Data(), fCommonPairCutNames[iCommonCut].Data(), fTrackCutNames[iCutTrack].Data(), sig->GetName()), fConfigHistogramSubgroups.value.data()); + } + DefineHistograms(fHistMan, Form("DileptonsSelected_%s_%s", pairLegCutName.Data(), fCommonPairCutNames[iCommonCut].Data()), "barrel,vertexing"); } } - TString tempCutsAsymPairStr = tempCutsAsymPair; - if (!tempCutsAsymPairStr.IsNull()) { - std::unique_ptr objArrayPairCuts(tempCutsAsymPairStr.Tokenize(",")); - fNPairCuts = objArrayPairCuts->GetEntries(); + + if (fNPairCuts != 0) { + for (int iPairCut = 0; iPairCut < fNPairCuts; ++iPairCut) { - fHistNamesDileptonTrack[fNCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut] = Form("DileptonTrack_%s_%s_%s", tempStr.Data(), objArrayPairCuts->At(iPairCut)->GetName(), fConfigTrackCut.value.data()); - fHistNamesDileptons[fNCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut] = Form("DileptonsSelected_%s_%s", tempStr.Data(), objArrayPairCuts->At(iPairCut)->GetName()); - DefineHistograms(fHistMan, fHistNamesDileptonTrack[fNCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut], fConfigHistogramSubgroups.value.data()); // define dilepton-track histograms - DefineHistograms(fHistMan, fHistNamesDileptons[fNCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut], "barrel,vertexing"); // define dilepton histograms - if (!tempCutsAsymCommonStr.IsNull()) { - std::unique_ptr objArrayCommon(tempCutsAsymCommonStr.Tokenize(",")); + DefineHistograms(fHistMan, Form("DileptonTrack_%s_%s_%s", pairLegCutName.Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iCutTrack].Data()), fConfigHistogramSubgroups.value.data()); + for (auto& sig : fRecMCSignals) { + DefineHistograms(fHistMan, Form("DileptonTrackMCMatched_%s_%s_%s_%s", pairLegCutName.Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iCutTrack].Data(), sig->GetName()), fConfigHistogramSubgroups.value.data()); + } + DefineHistograms(fHistMan, Form("DileptonsSelected_%s_%s", pairLegCutName.Data(), fPairCutNames[iPairCut].Data()), "barrel,vertexing"); + + if (!cfgPairing_strCommonTrackCuts.IsNull()) { + std::unique_ptr objArrayCommon(cfgPairing_strCommonTrackCuts.Tokenize(",")); for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { - fHistNamesDileptonTrack[(fNCuts * (fNCommonTrackCuts + 1) + fNCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * fNPairCuts + iPairCut] = Form("DileptonTrack_%s_%s_%s_%s", tempStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), objArrayPairCuts->At(iPairCut)->GetName(), fConfigTrackCut.value.data()); - fHistNamesDileptons[(fNCuts * (fNCommonTrackCuts + 1) + fNCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * fNPairCuts + iPairCut] = Form("DileptonsSelected_%s_%s_%s", tempStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), objArrayPairCuts->At(iPairCut)->GetName()); - DefineHistograms(fHistMan, fHistNamesDileptonTrack[(fNCuts * (fNCommonTrackCuts + 1) + fNCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * fNPairCuts + iPairCut], fConfigHistogramSubgroups.value.data()); // define dilepton-track histograms - DefineHistograms(fHistMan, fHistNamesDileptons[(fNCuts * (fNCommonTrackCuts + 1) + fNCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * fNPairCuts + iPairCut], "barrel,vertexing"); // define dilepton histograms + DefineHistograms(fHistMan, Form("DileptonTrack_%s_%s_%s_%s", pairLegCutName.Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iCutTrack].Data()), fConfigHistogramSubgroups.value.data()); + for (auto& sig : fRecMCSignals) { + DefineHistograms(fHistMan, Form("DileptonTrack_%s_%s_%s_%s_%s", pairLegCutName.Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iCutTrack].Data(), sig->GetName()), fConfigHistogramSubgroups.value.data()); + } + DefineHistograms(fHistMan, Form("DileptonsSelected_%s_%s_%s", pairLegCutName.Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data()), "barrel,vertexing"); } } - } // end loop (pair cuts) - } - for (unsigned int isig = 0; isig < fRecMCSignals.size(); isig++) { - auto sig = fRecMCSignals.at(isig); - fHistNamesDileptonTrackMCmatched[icut].push_back(Form("DileptonTrackMCMatched_%s_%s_%s", tempStr.Data(), fConfigTrackCut.value.data(), sig.GetName())); - DefineHistograms(fHistMan, fHistNamesDileptonTrackMCmatched[icut].back(), fConfigHistogramSubgroups.value.data()); - if (!tempCutsAsymCommonStr.IsNull()) { - std::unique_ptr objArrayCommon(tempCutsAsymCommonStr.Tokenize(",")); - for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { - fHistNamesDileptonTrackMCmatched[fNCuts + icut * fNCommonTrackCuts + iCommonCut].push_back(Form("DileptonTrackMCMatched_%s_%s_%s_%s", tempStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), fConfigTrackCut.value.data(), sig.GetName())); - DefineHistograms(fHistMan, fHistNamesDileptonTrackMCmatched[fNCuts + icut * fNCommonTrackCuts + iCommonCut].back(), fConfigHistogramSubgroups.value.data()); // define dilepton-track histograms - } - } - if (!tempCutsAsymPairStr.IsNull()) { - std::unique_ptr objArrayPairCuts(tempCutsAsymPairStr.Tokenize(",")); - fNPairCuts = objArrayPairCuts->GetEntries(); - for (int iPairCut = 0; iPairCut < fNPairCuts; ++iPairCut) { - fHistNamesDileptonTrackMCmatched[fNCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut].push_back(Form("DileptonTrackMCMatched_%s_%s_%s_%s", tempStr.Data(), objArrayPairCuts->At(iPairCut)->GetName(), fConfigTrackCut.value.data(), sig.GetName())); - DefineHistograms(fHistMan, fHistNamesDileptonTrackMCmatched[fNCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut].back(), fConfigHistogramSubgroups.value.data()); // define dilepton-track histograms - if (!tempCutsAsymCommonStr.IsNull()) { - std::unique_ptr objArrayCommon(tempCutsAsymCommonStr.Tokenize(",")); - for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { - fHistNamesDileptonTrackMCmatched[(fNCuts * (fNCommonTrackCuts + 1) + fNCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * fNPairCuts + iPairCut].push_back(Form("DileptonTrackMCMatched_%s_%s_%s_%s_%s", tempStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), objArrayPairCuts->At(iPairCut)->GetName(), fConfigTrackCut.value.data(), sig.GetName())); - DefineHistograms(fHistMan, fHistNamesDileptonTrackMCmatched[(fNCuts * (fNCommonTrackCuts + 1) + fNCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * fNPairCuts + iPairCut].back(), fConfigHistogramSubgroups.value.data()); // define dilepton-track histograms - } // end loop (common cuts) - } - } // end loop (pair cuts) } - } // end loop (MC signals) - } // end loop (leg defining cuts) - } - // Add histogram classes for each specified MCsignal at the generator level - // TODO: create a std::vector of hist classes to be used at Fill time, to avoid using Form in the process function - TString sigGenNamesStr = fConfigMCGenSignals.value; - std::unique_ptr objGenSigArray(sigGenNamesStr.Tokenize(",")); - for (int isig = 0; isig < objGenSigArray->GetEntries(); isig++) { - MCSignal* sig = o2::aod::dqmcsignals::GetMCSignal(objGenSigArray->At(isig)->GetName()); - if (sig) { - if (sig->GetNProngs() == 1) { // NOTE: 1-prong signals required - fGenMCSignals.push_back(*sig); - fHistNamesMCgen.push_back(Form("MCTruthGen_%s", sig->GetName())); - DefineHistograms(fHistMan, fHistNamesMCgen[fHistNamesMCgen.size() - 1], ""); } - } + } // end loop over track cuts to be combined with dileptons / di-tracks + } // end loop over pair leg track cuts + } // end if (isBarrel || isBarrelAsymmetric || isMuon) + + if (isMCGen) { + for (auto& sig : fGenMCSignals) { + DefineHistograms(fHistMan, Form("MCTruthGen_%s", sig->GetName()), ""); } } - if (fHistNamesDileptons.size() == 0) { - LOG(fatal) << " No valid dilepton cuts "; - } TString addHistsStr = fConfigAddJSONHistograms.value; if (addHistsStr != "") { @@ -3382,22 +3460,30 @@ struct AnalysisDileptonTrack { } VarManager::FillTrack(dilepton, fValuesDilepton); + + // fill selected dilepton histograms for each specified selection for (int icut = 0; icut < fNCuts; icut++) { - if (dilepton.filterMap_bit(icut)) { - fHistMan->FillHistClass(fHistNamesDileptons[icut].Data(), fValuesDilepton); - if constexpr (TCandidateType == VarManager::kDstarToD0KPiPi) { // Dielectrons and Dimuons don't have the PairFilterMap column - for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; iCommonCut++) { - if (dilepton.commonFilterMap_bit(fCommonTrackCutMap[iCommonCut])) { - fHistMan->FillHistClass(fHistNamesDileptons[fNCuts + icut * fNCommonTrackCuts + iCommonCut].Data(), fValuesDilepton); - } + + if (!dilepton.filterMap_bit(icut)) { + continue; + } + + // regular dileptons + fHistMan->FillHistClass(Form("DileptonsSelected_%s", fTrackCutNames[icut].Data()), fValuesDilepton); + + // other pairs, e.g.: D0s + if constexpr (TCandidateType == VarManager::kDstarToD0KPiPi) { // Dielectrons and Dimuons don't have the PairFilterMap column + for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; iCommonCut++) { + if (dilepton.commonFilterMap_bit(fCommonTrackCutMap[iCommonCut])) { + fHistMan->FillHistClass(Form("DileptonsSelected_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data()), fValuesDilepton); } - for (int iPairCut = 0; iPairCut < fNPairCuts; iPairCut++) { - if (dilepton.pairFilterMap_bit(iPairCut)) { - fHistMan->FillHistClass(fHistNamesDileptons[fNCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut].Data(), fValuesDilepton); - for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; iCommonCut++) { - if (dilepton.commonFilterMap_bit(fCommonTrackCutMap[iCommonCut])) { - fHistMan->FillHistClass(fHistNamesDileptons[(fNCuts * (fNCommonTrackCuts + 1) + fNCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * fNPairCuts + iPairCut].Data(), fValuesDilepton); - } + } + for (int iPairCut = 0; iPairCut < fNPairCuts; iPairCut++) { + if (dilepton.pairFilterMap_bit(iPairCut)) { + fHistMan->FillHistClass(Form("DileptonsSelected_%s_%s", fTrackCutNames[icut].Data(), fPairCutNames[icut].Data()), fValuesDilepton); + for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; iCommonCut++) { + if (dilepton.commonFilterMap_bit(fCommonTrackCutMap[iCommonCut])) { + fHistMan->FillHistClass(Form("DileptonsSelected_%s_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[icut].Data()), fValuesDilepton); } } } @@ -3405,16 +3491,23 @@ struct AnalysisDileptonTrack { } } - // loop over hadrons + // loop over track associations for (auto& assoc : assocs) { + + uint32_t trackSelection = 0; if constexpr (TCandidateType == VarManager::kBtoJpsiEEK) { - if (!assoc.isBarrelSelected_bit(fTrackCutBit)) { + // check the cuts fulfilled by this candidate track; if none just continue + trackSelection = (assoc.isBarrelSelected_raw() & fTrackCutBitMap); + if (!trackSelection) { continue; } + // get the track from this association auto track = assoc.template reducedtrack_as(); + // check that this track is not included in the current dilepton if (track.globalIndex() == dilepton.index0Id() || track.globalIndex() == dilepton.index1Id()) { continue; } + // compute needed quantities VarManager::FillDileptonHadron(dilepton, track, fValuesHadron); VarManager::FillDileptonTrackVertexing(event, lepton1, lepton2, track, fValuesHadron); @@ -3422,15 +3515,18 @@ struct AnalysisDileptonTrack { mcDecision = 0; isig = 0; for (auto sig = fRecMCSignals.begin(); sig != fRecMCSignals.end(); sig++, isig++) { - if ((*sig).CheckSignal(true, lepton1MC, lepton2MC, trackMC)) { + if ((*sig)->CheckSignal(true, lepton1MC, lepton2MC, trackMC)) { mcDecision |= (static_cast(1) << isig); } } } + if constexpr (TCandidateType == VarManager::kDstarToD0KPiPi) { - if (!assoc.isBarrelSelected_bit(fTrackCutBit)) { + trackSelection = (assoc.isBarrelSelected_raw() & fTrackCutBitMap); + if (!trackSelection) { continue; } + auto track = assoc.template reducedtrack_as(); if (track.globalIndex() == dilepton.index0Id() || track.globalIndex() == dilepton.index1Id()) { continue; @@ -3446,15 +3542,18 @@ struct AnalysisDileptonTrack { mcDecision = 0; isig = 0; for (auto sig = fRecMCSignals.begin(); sig != fRecMCSignals.end(); sig++, isig++) { - if ((*sig).CheckSignal(true, lepton1MC, lepton2MC, trackMC)) { + if ((*sig)->CheckSignal(true, lepton1MC, lepton2MC, trackMC)) { mcDecision |= (static_cast(1) << isig); } } } + if constexpr (TCandidateType == VarManager::kBcToThreeMuons) { - if (!assoc.isMuonSelected_bit(fTrackCutBit)) { + trackSelection = (assoc.isMuonSelected_raw() & fTrackCutBitMap); + if (!trackSelection) { continue; } + auto track = assoc.template reducedmuon_as(); if (track.globalIndex() == dilepton.index0Id() || track.globalIndex() == dilepton.index1Id()) { continue; @@ -3467,58 +3566,74 @@ struct AnalysisDileptonTrack { mcDecision = 0; isig = 0; for (auto sig = fRecMCSignals.begin(); sig != fRecMCSignals.end(); sig++, isig++) { - if ((*sig).CheckSignal(true, lepton1MC, lepton2MC, trackMC)) { + if ((*sig)->CheckSignal(true, lepton1MC, lepton2MC, trackMC)) { mcDecision |= (static_cast(1) << isig); } } } + // Fill histograms for the triplets + // loop over dilepton / ditrack cuts and MC signals for (int icut = 0; icut < fNCuts; icut++) { - if (dilepton.filterMap_bit(icut)) { - fHistMan->FillHistClass(fHistNamesDileptonTrack[icut].Data(), fValuesHadron); - for (isig = 0; isig < fRecMCSignals.size(); isig++) { - if (mcDecision & (static_cast(1) << isig)) { - // TODO: check also whether the collision association is correct (add dedicated histogram dirs) - fHistMan->FillHistClass(fHistNamesDileptonTrackMCmatched[icut][isig], fValuesHadron); + + if (!dilepton.filterMap_bit(icut)) { + continue; + } + + // loop over specified track cuts (the tracks to be combined with the dileptons) + for (int iTrackCut = 0; iTrackCut < fNCuts; iTrackCut++) { + + if (!(trackSelection & (uint32_t(1) << iTrackCut))) { + continue; + } + + fHistMan->FillHistClass(Form("DileptonTrack_%s_%s", fTrackCutNames[icut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); + for (uint32_t isig = 0; isig < fRecMCSignals.size(); isig++) { + if (mcDecision & (uint32_t(1) << isig)) { + fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s", fTrackCutNames[icut].Data(), fTrackCutNames[iTrackCut].Data(), fRecMCSignals[isig]->GetName()), fValuesHadron); } } + if constexpr (TCandidateType == VarManager::kDstarToD0KPiPi) { // Dielectrons and Dimuons don't have the PairFilterMap column for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; iCommonCut++) { if (dilepton.commonFilterMap_bit(fCommonTrackCutMap[iCommonCut])) { - fHistMan->FillHistClass(fHistNamesDileptonTrack[fNCuts + icut * fNCommonTrackCuts + iCommonCut].Data(), fValuesHadron); - for (isig = 0; isig < fRecMCSignals.size(); isig++) { - if (mcDecision & (static_cast(1) << isig)) { - fHistMan->FillHistClass(fHistNamesDileptonTrackMCmatched[fNCuts + icut * fNCommonTrackCuts + iCommonCut][isig], fValuesHadron); + fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); + for (uint32_t isig = 0; isig < fRecMCSignals.size(); isig++) { + if (mcDecision & (uint32_t(1) << isig)) { + fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fTrackCutNames[iTrackCut].Data(), fRecMCSignals[isig]->GetName()), fValuesHadron); } - } // end loop (MC signals) + } } - } // end loop (common track cuts) + } for (int iPairCut = 0; iPairCut < fNPairCuts; iPairCut++) { if (dilepton.pairFilterMap_bit(iPairCut)) { - fHistMan->FillHistClass(fHistNamesDileptonTrack[fNCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut].Data(), fValuesHadron); - for (isig = 0; isig < fRecMCSignals.size(); isig++) { - if (mcDecision & (static_cast(1) << isig)) { - fHistMan->FillHistClass(fHistNamesDileptonTrackMCmatched[fNCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut][isig], fValuesHadron); + fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s", fTrackCutNames[icut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); + for (uint32_t isig = 0; isig < fRecMCSignals.size(); isig++) { + if (mcDecision & (uint32_t(1) << isig)) { + fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s_%s", fTrackCutNames[icut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data(), fRecMCSignals[isig]->GetName()), fValuesHadron); } } for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; iCommonCut++) { if (dilepton.commonFilterMap_bit(fCommonTrackCutMap[iCommonCut])) { - fHistMan->FillHistClass(fHistNamesDileptonTrack[(fNCuts * (fNCommonTrackCuts + 1) + fNCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * fNPairCuts + iPairCut].Data(), fValuesHadron); - for (isig = 0; isig < fRecMCSignals.size(); isig++) { - if (mcDecision & (static_cast(1) << isig)) { - fHistMan->FillHistClass(fHistNamesDileptonTrackMCmatched[(fNCuts * (fNCommonTrackCuts + 1) + fNCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * fNPairCuts + iPairCut][isig], fValuesHadron); + fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); + for (uint32_t isig = 0; isig < fRecMCSignals.size(); isig++) { + if (mcDecision & (uint32_t(1) << isig)) { + fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data(), fRecMCSignals[isig]->GetName()), fValuesHadron); } - } // end loop (MC signals) + } } - } // end loop (common track cuts) + } } - } // end loop (pair cuts) + } } - } // end loop (cuts) - } + } // end loop over track cuts + } // end loop over dilepton cuts // table to be written out for ML analysis - BmesonsTable(fValuesHadron[VarManager::kPairMass], fValuesHadron[VarManager::kDeltaMass], fValuesHadron[VarManager::kPairPt], fValuesHadron[VarManager::kVertexingLxy], fValuesHadron[VarManager::kVertexingLxyz], fValuesHadron[VarManager::kVertexingLz], fValuesHadron[VarManager::kVertexingTauxy], fValuesHadron[VarManager::kVertexingTauz], fValuesHadron[VarManager::kKFDCAxyzBetweenProngs], fValuesHadron[VarManager::kCosPointingAngle], fValuesHadron[VarManager::kVertexingChi2PCA], mcDecision); - } + BmesonsTable(fValuesHadron[VarManager::kPairMass], fValuesHadron[VarManager::kDeltaMass], fValuesHadron[VarManager::kPairPt], + fValuesHadron[VarManager::kVertexingLxy], fValuesHadron[VarManager::kVertexingLxyz], fValuesHadron[VarManager::kVertexingLz], + fValuesHadron[VarManager::kVertexingTauxy], fValuesHadron[VarManager::kVertexingTauz], fValuesHadron[VarManager::kKFDCAxyzBetweenProngs], + fValuesHadron[VarManager::kCosPointingAngle], fValuesHadron[VarManager::kVertexingChi2PCA], dilepton.filterMap_raw(), trackSelection, mcDecision); + } // end loop over associations } // end loop over dileptons } @@ -3600,16 +3715,14 @@ struct AnalysisDileptonTrack { // loop over mc stack and fill histograms for pure MC truth signals // group all the MC tracks which belong to the MC event corresponding to the current reconstructed event // auto groupedMCTracks = tracksMC.sliceBy(aod::reducedtrackMC::reducedMCeventId, event.reducedMCevent().globalIndex()); - int isig = 0; for (auto& track : mcTracks) { VarManager::FillTrackMC(mcTracks, track); // NOTE: Signals are checked here mostly based on the skimmed MC stack, so depending on the requested signal, the stack could be incomplete. // NOTE: However, the working model is that the decisions on MC signals are precomputed during skimming and are stored in the mcReducedFlags member. // TODO: Use the mcReducedFlags to select signals - isig = 0; for (auto& sig : fGenMCSignals) { - if (sig.CheckSignal(true, track)) { - fHistMan->FillHistClass(fHistNamesMCgen[isig++], VarManager::fgValues); + if (sig->CheckSignal(true, track)) { + fHistMan->FillHistClass(Form("MCTruthGen_%s", sig->GetName()), VarManager::fgValues); } } } diff --git a/PWGDQ/Tasks/tableReader_withAssoc.cxx b/PWGDQ/Tasks/tableReader_withAssoc.cxx index 9a745f61ea2..e457acb6f7d 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.cxx +++ b/PWGDQ/Tasks/tableReader_withAssoc.cxx @@ -28,6 +28,7 @@ #include #include #include +#include #include "CCDB/BasicCCDBManager.h" #include "DataFormatsParameters/GRPObject.h" #include "Framework/AnalysisHelpers.h" @@ -89,6 +90,7 @@ DECLARE_SOA_COLUMN(TauxyBcandidate, tauxyBcandidate, float); DECLARE_SOA_COLUMN(TauzBcandidate, tauzBcandidate, float); DECLARE_SOA_COLUMN(CosPBcandidate, cosPBcandidate, float); DECLARE_SOA_COLUMN(Chi2Bcandidate, chi2Bcandidate, float); +DECLARE_SOA_BITMAP_COLUMN(IsJpsiFromBSelected, isJpsiFromBSelected, 32); // Candidate columns for prompt-non-prompt JPsi separation DECLARE_SOA_COLUMN(Massee, massJPsi2ee, float); DECLARE_SOA_COLUMN(Ptee, ptJPsi2ee, float); @@ -106,7 +108,11 @@ DECLARE_SOA_TABLE(BarrelAmbiguities, "AOD", "DQBARRELAMBA", dqanalysisflags::Bar DECLARE_SOA_TABLE(MuonTrackCuts, "AOD", "DQANAMUONCUTSA", dqanalysisflags::IsMuonSelected); //! joinable to ReducedMuonsAssoc DECLARE_SOA_TABLE(MuonAmbiguities, "AOD", "DQMUONAMBA", dqanalysisflags::MuonAmbiguityInBunch, dqanalysisflags::MuonAmbiguityOutOfBunch); //! joinable to ReducedMuonTracks DECLARE_SOA_TABLE(Prefilter, "AOD", "DQPREFILTERA", dqanalysisflags::IsBarrelSelectedPrefilter); //! joinable to ReducedTracksAssoc -DECLARE_SOA_TABLE(BmesonCandidates, "AOD", "DQBMESONSA", dqanalysisflags::massBcandidate, dqanalysisflags::deltamassBcandidate, dqanalysisflags::pTBcandidate, dqanalysisflags::LxyBcandidate, dqanalysisflags::LxyzBcandidate, dqanalysisflags::LzBcandidate, dqanalysisflags::TauxyBcandidate, dqanalysisflags::TauzBcandidate, dqanalysisflags::CosPBcandidate, dqanalysisflags::Chi2Bcandidate); +DECLARE_SOA_TABLE(BmesonCandidates, "AOD", "DQBMESONSA", + dqanalysisflags::massBcandidate, dqanalysisflags::deltamassBcandidate, dqanalysisflags::pTBcandidate, + dqanalysisflags::LxyBcandidate, dqanalysisflags::LxyzBcandidate, dqanalysisflags::LzBcandidate, + dqanalysisflags::TauxyBcandidate, dqanalysisflags::TauzBcandidate, dqanalysisflags::CosPBcandidate, dqanalysisflags::Chi2Bcandidate, + dqanalysisflags::IsJpsiFromBSelected, dqanalysisflags::IsBarrelSelected); DECLARE_SOA_TABLE(JPsieeCandidates, "AOD", "DQPSEUDOPROPER", dqanalysisflags::Massee, dqanalysisflags::Ptee, dqanalysisflags::Lxyee, dqanalysisflags::LxyeePoleMass, dqanalysisflags::Lzee, dqanalysisflags::AmbiguousInBunchPairs, dqanalysisflags::AmbiguousOutOfBunchPairs); } // namespace o2::aod @@ -1183,20 +1189,25 @@ struct AnalysisSameEventPairing { void init(o2::framework::InitContext& context) { - if (context.mOptions.get("processDummy")) { - return; - } - VarManager::SetDefaultVarNames(); fEnableBarrelHistos = context.mOptions.get("processAllSkimmed") || context.mOptions.get("processBarrelOnlySkimmed") || context.mOptions.get("processBarrelOnlyWithCollSkimmed") || context.mOptions.get("processBarrelOnlySkimmedNoCov"); fEnableBarrelMixingHistos = context.mOptions.get("processMixingAllSkimmed") || context.mOptions.get("processMixingBarrelSkimmed"); fEnableMuonHistos = context.mOptions.get("processAllSkimmed") || context.mOptions.get("processMuonOnlySkimmed") || context.mOptions.get("processMuonOnlySkimmedMultExtra") || context.mOptions.get("processMixingMuonSkimmed"); fEnableMuonMixingHistos = context.mOptions.get("processMixingAllSkimmed") || context.mOptions.get("processMixingMuonSkimmed"); + if (context.mOptions.get("processDummy")) { + if (fEnableBarrelHistos || fEnableBarrelMixingHistos || fEnableMuonHistos || fEnableMuonMixingHistos) { + LOG(fatal) << "No other processing tasks should be enabled if the processDummy is enabled!!"; + } + return; + } + VarManager::SetDefaultVarNames(); + // Keep track of all the histogram class names to avoid composing strings in the pairing loop TString histNames = ""; std::vector names; + // NOTE: Pair cuts are only applied on the histogram output. The produced pair tables do not have these cuts applied TString cutNamesStr = fConfigCuts.pair.value; if (!cutNamesStr.IsNull()) { std::unique_ptr objArray(cutNamesStr.Tokenize(",")); @@ -1278,6 +1289,7 @@ struct AnalysisSameEventPairing { } } } + // get the muon track selection cuts getTaskOptionValue(context, "analysis-muon-selection", "cfgMuonCuts", tempCuts, false); tempCutsStr = tempCuts; @@ -1290,6 +1302,7 @@ struct AnalysisSameEventPairing { tempCutsStr += Form(",%s", t->GetName()); } } + if (!muonCutsStr.IsNull()) { std::unique_ptr objArray(tempCutsStr.Tokenize(",")); fNCutsMuon = objArray->GetEntries(); @@ -2767,7 +2780,7 @@ struct AnalysisDileptonTrack { Produces BmesonsTable; OutputObj fOutputList{"output"}; - Configurable fConfigTrackCut{"cfgTrackCut", "kaonPID", "Cut for the track to be correlated with the dileptons"}; + Configurable fConfigTrackCuts{"cfgTrackCuts", "kaonPID", "Comma separated list of cuts for the track to be correlated with the dileptons"}; Configurable fConfigDileptonLowMass{"cfgDileptonLowMass", 2.8, "Low mass cut for the dileptons used in analysis"}; Configurable fConfigDileptonHighMass{"cfgDileptonHighMass", 3.2, "High mass cut for the dileptons used in analysis"}; Configurable fConfigDileptonpTCut{"cfgDileptonpTCut", 0.0, "pT cut for dileptons used in the triplet vertexing"}; @@ -2783,14 +2796,16 @@ struct AnalysisDileptonTrack { Configurable fConfigMagField{"cfgMagField", 5.0f, "Manually set magnetic field"}; int fCurrentRun; // needed to detect if the run changed and trigger update of calibrations etc. - int fNCuts; - int fNPairCuts; + int fNCuts; // number of dilepton leg cuts + int fNPairCuts; // number of pair cuts int fNCommonTrackCuts; std::map fCommonTrackCutMap; - int fTrackCutBit; - std::map fHistNamesDileptonTrack; - std::map fHistNamesDileptons; - std::map fHistNamesME; + uint32_t fTrackCutBitMap; // track cut bit mask to be used in the selection of tracks associated with dileptons + // vector for single-lepton and track cut names for easy access when calling FillHistogramList() + std::vector fTrackCutNames; + // vector for pair cut names, used mainly for pairs built via the asymmetric pairing task + std::vector fPairCutNames; + std::vector fCommonPairCutNames; Service fCCDB; @@ -2811,155 +2826,190 @@ struct AnalysisDileptonTrack { void init(o2::framework::InitContext& context) { - if (context.mOptions.get("processDummy")) { - return; - } - bool isBarrel = context.mOptions.get("processBarrelSkimmed"); bool isBarrelME = context.mOptions.get("processBarrelMixedEvent"); bool isBarrelAsymmetric = context.mOptions.get("processDstarToD0Pi"); bool isMuon = context.mOptions.get("processMuonSkimmed"); bool isMuonME = context.mOptions.get("processMuonMixedEvent"); + // If the dummy process is enabled, skip the entire init + if (context.mOptions.get("processDummy")) { + if (isBarrel || isBarrelME || isBarrelAsymmetric || isMuon || isMuonME) { + LOG(fatal) << "If processDummy is enabled, no other process functions should be enabled! Or switch off the processDummy!"; + } + return; + } + fCurrentRun = 0; + fTrackCutBitMap = 0; fValuesDilepton = new float[VarManager::kNVars]; fValuesHadron = new float[VarManager::kNVars]; - fTrackCutBit = -1; VarManager::SetDefaultVarNames(); fHistMan = new HistogramManager("analysisHistos", "aa", VarManager::kNVars); - fHistMan->SetUseDefaultVariableNames(kTRUE); + fHistMan->SetUseDefaultVariableNames(true); fHistMan->SetDefaultVarNames(VarManager::fgVariableNames, VarManager::fgVariableUnits); TString histNames = ""; // For each track/muon selection used to produce dileptons, create a separate histogram directory using the // name of the track/muon cut. - // Also, create a map which will hold the name of the histogram directories so they can be accessed directly in the pairing loop if (isBarrel || isMuon || isBarrelAsymmetric) { - // get the list of single track and muon cuts computed in the dedicated tasks upstream - string tempCutsSingle; + // Get the list of single track and muon cuts computed in the dedicated tasks upstream + // We need this to know the order in which they were computed, and also to make sure that in this task we do not ask + // for cuts which were not computed (in which case this will trigger a fatal) + string cfgTrackSelection_TrackCuts; + if (isBarrel || isBarrelAsymmetric) { + getTaskOptionValue(context, "analysis-track-selection", "cfgTrackCuts", cfgTrackSelection_TrackCuts, false); + } else { + getTaskOptionValue(context, "analysis-muon-selection", "cfgMuonCuts", cfgTrackSelection_TrackCuts, false); + } + + TObjArray* cfgTrackSelection_objArrayTrackCuts = nullptr; + if (!cfgTrackSelection_TrackCuts.empty()) { + cfgTrackSelection_objArrayTrackCuts = TString(cfgTrackSelection_TrackCuts).Tokenize(","); + } + // get also the list of cuts specified via the JSON parameters if (isBarrel || isBarrelAsymmetric) { - getTaskOptionValue(context, "analysis-track-selection", "cfgTrackCuts", tempCutsSingle, false); + getTaskOptionValue(context, "analysis-track-selection", "cfgBarrelTrackCutsJSON", cfgTrackSelection_TrackCuts, false); } else { - getTaskOptionValue(context, "analysis-muon-selection", "cfgMuonCuts", tempCutsSingle, false); + getTaskOptionValue(context, "analysis-muon-selection", "cfgMuonCutsJSON", cfgTrackSelection_TrackCuts, false); + } + if (!cfgTrackSelection_TrackCuts.empty()) { + if (cfgTrackSelection_objArrayTrackCuts == nullptr) { + cfgTrackSelection_objArrayTrackCuts = new TObjArray(); + } + std::vector addTrackCuts = dqcuts::GetCutsFromJSON(cfgTrackSelection_TrackCuts.data()); + for (auto& t : addTrackCuts) { + TObjString* tempObjStr = new TObjString(t->GetName()); + cfgTrackSelection_objArrayTrackCuts->Add(tempObjStr); + } + } + if (cfgTrackSelection_objArrayTrackCuts->GetEntries() == 0) { + LOG(fatal) << " No track cuts found in the barrel or muon upstream tasks"; } - TString tempCutsSingleStr = tempCutsSingle; - TObjArray* objArraySingleCuts = nullptr; - if (!tempCutsSingleStr.IsNull()) { - objArraySingleCuts = tempCutsSingleStr.Tokenize(","); + // store all the computed track cut names in a vector + for (int icut = 0; icut < cfgTrackSelection_objArrayTrackCuts->GetEntries(); icut++) { + fTrackCutNames.push_back(cfgTrackSelection_objArrayTrackCuts->At(icut)->GetName()); } - if (objArraySingleCuts->FindObject(fConfigTrackCut.value.data()) == nullptr) { - LOG(fatal) << " Track cut chosen for the correlation task was not computed in the single-track task! Check it out!"; + + // get the list of associated track cuts to be combined with the dileptons and + // check that these were computed upstream and create a bit mask + TObjArray* cfgDileptonTrack_objArrayTrackCuts = nullptr; + if (!fConfigTrackCuts.value.empty()) { + cfgDileptonTrack_objArrayTrackCuts = TString(fConfigTrackCuts.value).Tokenize(","); + } else { + LOG(fatal) << " No track cuts specified! Check it out!"; + } + for (int icut = 0; icut < cfgDileptonTrack_objArrayTrackCuts->GetEntries(); icut++) { + if (!cfgTrackSelection_objArrayTrackCuts->FindObject(cfgDileptonTrack_objArrayTrackCuts->At(icut)->GetName())) { + LOG(fatal) << "Specified track cut (" << cfgDileptonTrack_objArrayTrackCuts->At(icut)->GetName() << ") not found in the list of computed cuts by the single barrel / muon selection tasks"; + } + } + for (int icut = 0; icut < cfgTrackSelection_objArrayTrackCuts->GetEntries(); icut++) { + if (cfgDileptonTrack_objArrayTrackCuts->FindObject(cfgTrackSelection_objArrayTrackCuts->At(icut)->GetName())) { + fTrackCutBitMap |= (uint32_t(1) << icut); + } } + fNCuts = fTrackCutNames.size(); + // get the cuts employed for same-event pairing - string tempCutsSinglePair; - string pairCuts; - string pairCommonCuts; - string tempCutsTrack; + // NOTE: The track/muon cuts in analysis-same-event-pairing are used to select electrons/muons to build dielectrons/dimuons + // NOTE: The cfgPairCuts in analysis-same-event-pairing are used to apply an additional selection on top of the already produced dileptons + // but this is only used for histograms, not for the produced dilepton tables + string cfgPairing_TrackCuts; + string cfgPairing_PairCuts; + string cfgPairing_CommonTrackCuts; if (isBarrel) { - getTaskOptionValue(context, "analysis-same-event-pairing", "cfgTrackCuts", tempCutsSinglePair, false); - getTaskOptionValue(context, "analysis-same-event-pairing", "cfgPairCuts", pairCuts, false); + getTaskOptionValue(context, "analysis-same-event-pairing", "cfgTrackCuts", cfgPairing_TrackCuts, false); + getTaskOptionValue(context, "analysis-same-event-pairing", "cfgPairCuts", cfgPairing_PairCuts, false); } else if (isMuon) { - getTaskOptionValue(context, "analysis-same-event-pairing", "cfgMuonCuts", tempCutsSinglePair, false); - getTaskOptionValue(context, "analysis-same-event-pairing", "cfgPairCuts", pairCuts, false); + getTaskOptionValue(context, "analysis-same-event-pairing", "cfgMuonCuts", cfgPairing_TrackCuts, false); + getTaskOptionValue(context, "analysis-same-event-pairing", "cfgPairCuts", cfgPairing_PairCuts, false); } else if (isBarrelAsymmetric) { - getTaskOptionValue(context, "analysis-track-selection", "cfgTrackCuts", tempCutsTrack, false); - getTaskOptionValue(context, "analysis-asymmetric-pairing", "cfgLegCuts", tempCutsSinglePair, false); - getTaskOptionValue(context, "analysis-asymmetric-pairing", "cfgPairCuts", pairCuts, false); - getTaskOptionValue(context, "analysis-asymmetric-pairing", "cfgCommonTrackCuts", pairCommonCuts, false); + getTaskOptionValue(context, "analysis-asymmetric-pairing", "cfgLegCuts", cfgPairing_TrackCuts, false); + getTaskOptionValue(context, "analysis-asymmetric-pairing", "cfgPairCuts", cfgPairing_PairCuts, false); + getTaskOptionValue(context, "analysis-asymmetric-pairing", "cfgCommonTrackCuts", cfgPairing_CommonTrackCuts, false); + } + + if (cfgPairing_TrackCuts.empty()) { + LOG(fatal) << "There are no dilepton cuts specified in the upstream in the same-event-pairing or assymmetric-pairing"; } // If asymmetric pair is used, it may have common track cuts - TString pairCommonCutsStr = pairCommonCuts; - if (!pairCommonCutsStr.IsNull()) { // if common track cuts - TString tempCutsTrackStr = tempCutsTrack; - std::unique_ptr objArrayTempTrack(tempCutsTrackStr.Tokenize(",")); - int fNTempTrackCuts = objArrayTempTrack->GetEntries(); - std::unique_ptr objArrayCommon(pairCommonCutsStr.Tokenize(",")); + TString cfgPairing_strCommonTrackCuts = cfgPairing_CommonTrackCuts; + if (!cfgPairing_strCommonTrackCuts.IsNull()) { // if common track cuts + std::unique_ptr objArrayCommon(cfgPairing_strCommonTrackCuts.Tokenize(",")); fNCommonTrackCuts = objArrayCommon->GetEntries(); for (int icut = 0; icut < fNCommonTrackCuts; ++icut) { - for (int iicut = 0; iicut < fNTempTrackCuts; ++iicut) { - if (std::strcmp(objArrayCommon->At(icut)->GetName(), objArrayTempTrack->At(iicut)->GetName()) == 0) { + for (int iicut = 0; iicut < cfgTrackSelection_objArrayTrackCuts->GetEntries(); iicut++) { + if (std::strcmp(cfgTrackSelection_objArrayTrackCuts->At(iicut)->GetName(), objArrayCommon->At(icut)->GetName()) == 0) { fCommonTrackCutMap[icut] = iicut; + fCommonPairCutNames.push_back(objArrayCommon->At(icut)->GetName()); } } } + } // end if (common cuts) + + std::unique_ptr objArrayPairCuts(TString(cfgPairing_PairCuts).Tokenize(",")); + fNPairCuts = objArrayPairCuts->GetEntries(); + for (int j = 0; j < fNPairCuts; j++) { + fPairCutNames.push_back(objArrayPairCuts->At(j)->GetName()); } - TString tempCutsSinglePairStr = tempCutsSinglePair; - bool cutFound; - if (!tempCutsSingleStr.IsNull() && !tempCutsSinglePairStr.IsNull()) { - std::unique_ptr objArray(tempCutsSinglePairStr.Tokenize(",")); - fNCuts = objArray->GetEntries(); - for (int icut = 0; icut < fNCuts; ++icut) { - TString tempStr = objArray->At(icut)->GetName(); - if (!isBarrelAsymmetric) { - cutFound = objArraySingleCuts->FindObject(tempStr.Data()) != nullptr; - } else { - std::unique_ptr legObjArray(tempStr.Tokenize(":")); - cutFound = true; - for (int iicut = 0; iicut < legObjArray->GetEntries(); ++iicut) { - TString tempLegStr = legObjArray->At(iicut)->GetName(); - if (objArraySingleCuts->FindObject(tempLegStr.Data()) == nullptr) { - cutFound = false; - } - } + // array of single lepton cuts specified in the same-analysis-pairing task + std::unique_ptr cfgPairing_objArrayTrackCuts(TString(cfgPairing_TrackCuts).Tokenize(",")); + + // loop over single lepton cuts + for (int icut = 0; icut < fNCuts; ++icut) { + + // here we check that this cut is one of those used for building the dileptons + if (!cfgPairing_objArrayTrackCuts->FindObject(fTrackCutNames[icut].Data())) { + continue; + } + + TString pairLegCutName = fTrackCutNames[icut].Data(); + // define dilepton histograms + DefineHistograms(fHistMan, Form("DileptonsSelected_%s", pairLegCutName.Data()), "barrel,vertexing"); + // loop over track cuts and create dilepton - track histogram directories + for (int iCutTrack = 0; iCutTrack < fNCuts; iCutTrack++) { + + // here we check that this track cut is one of those required to associate with the dileptons + if (!(fTrackCutBitMap & (uint32_t(1) << iCutTrack))) { + continue; } - if (cutFound) { - fHistNamesDileptonTrack[icut] = Form("DileptonTrack_%s_%s", tempStr.Data(), fConfigTrackCut.value.data()); - fHistNamesDileptons[icut] = Form("DileptonsSelected_%s", tempStr.Data()); - TString pairCutsStr = pairCuts; - DefineHistograms(fHistMan, fHistNamesDileptonTrack[icut], fConfigHistogramSubgroups.value.data()); // define dilepton-track histograms - DefineHistograms(fHistMan, fHistNamesDileptons[icut], "barrel,vertexing"); // define dilepton histograms - if (!pairCommonCutsStr.IsNull()) { - std::unique_ptr objArrayCommon(pairCommonCutsStr.Tokenize(",")); - for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { - // fTrackHistNames[fNLegCuts + icut * fNCommonTrackCuts + iCommonCut] = names; - fHistNamesDileptonTrack[fNCuts + icut * fNCommonTrackCuts + iCommonCut] = Form("DileptonTrack_%s_%s_%s", tempStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), fConfigTrackCut.value.data()); - fHistNamesDileptons[fNCuts + icut * fNCommonTrackCuts + iCommonCut] = Form("DileptonsSelected_%s_%s", tempStr.Data(), objArrayCommon->At(iCommonCut)->GetName()); - DefineHistograms(fHistMan, fHistNamesDileptonTrack[fNCuts + icut * fNCommonTrackCuts + iCommonCut], fConfigHistogramSubgroups.value.data()); // define dilepton-track histograms - DefineHistograms(fHistMan, fHistNamesDileptons[fNCuts + icut * fNCommonTrackCuts + iCommonCut], "barrel,vertexing"); // define dilepton histograms - } + + DefineHistograms(fHistMan, Form("DileptonTrack_%s_%s", pairLegCutName.Data(), fTrackCutNames[iCutTrack].Data()), fConfigHistogramSubgroups.value.data()); + + if (!cfgPairing_strCommonTrackCuts.IsNull()) { + std::unique_ptr objArrayCommon(cfgPairing_strCommonTrackCuts.Tokenize(",")); + for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { + DefineHistograms(fHistMan, Form("DileptonTrack_%s_%s_%s", pairLegCutName.Data(), fCommonPairCutNames[iCommonCut].Data(), fTrackCutNames[iCutTrack].Data()), fConfigHistogramSubgroups.value.data()); + DefineHistograms(fHistMan, Form("DileptonsSelected_%s_%s", pairLegCutName.Data(), fCommonPairCutNames[iCommonCut].Data()), "barrel,vertexing"); } - if (!pairCutsStr.IsNull()) { - std::unique_ptr objArrayPairCuts(pairCutsStr.Tokenize(",")); - fNPairCuts = objArrayPairCuts->GetEntries(); - for (int iPairCut = 0; iPairCut < fNPairCuts; ++iPairCut) { - fHistNamesDileptonTrack[fNCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut] = Form("DileptonTrack_%s_%s_%s", tempStr.Data(), objArrayPairCuts->At(iPairCut)->GetName(), fConfigTrackCut.value.data()); - fHistNamesDileptons[fNCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut] = Form("DileptonsSelected_%s_%s", tempStr.Data(), objArrayPairCuts->At(iPairCut)->GetName()); - DefineHistograms(fHistMan, fHistNamesDileptonTrack[fNCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut], fConfigHistogramSubgroups.value.data()); // define dilepton-track histograms - DefineHistograms(fHistMan, fHistNamesDileptons[fNCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut], "barrel,vertexing"); // define dilepton histograms - if (!pairCommonCutsStr.IsNull()) { - std::unique_ptr objArrayCommon(pairCommonCutsStr.Tokenize(",")); - for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { - fHistNamesDileptonTrack[(fNCuts * (fNCommonTrackCuts + 1) + fNCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts + 1) + iCommonCut * (1 + fNPairCuts) + iPairCut] = Form("DileptonTrack_%s_%s_%s_%s", tempStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), objArrayPairCuts->At(iPairCut)->GetName(), fConfigTrackCut.value.data()); - fHistNamesDileptons[(fNCuts * (fNCommonTrackCuts + 1) + fNCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts + 1) + iCommonCut * (1 + fNPairCuts) + iPairCut] = Form("DileptonsSelected_%s_%s_%s", tempStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), objArrayPairCuts->At(iPairCut)->GetName()); - DefineHistograms(fHistMan, fHistNamesDileptonTrack[(fNCuts * (fNCommonTrackCuts + 1) + fNCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts + 1) + iCommonCut * (1 + fNPairCuts) + iPairCut], fConfigHistogramSubgroups.value.data()); // define dilepton-track histograms - DefineHistograms(fHistMan, fHistNamesDileptons[(fNCuts * (fNCommonTrackCuts + 1) + fNCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts + 1) + iCommonCut * (1 + fNPairCuts) + iPairCut], "barrel,vertexing"); // define dilepton histograms - } + } + + if (fNPairCuts != 0) { + + for (int iPairCut = 0; iPairCut < fNPairCuts; ++iPairCut) { + DefineHistograms(fHistMan, Form("DileptonTrack_%s_%s_%s", pairLegCutName.Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iCutTrack].Data()), fConfigHistogramSubgroups.value.data()); + DefineHistograms(fHistMan, Form("DileptonsSelected_%s_%s", pairLegCutName.Data(), fPairCutNames[iPairCut].Data()), "barrel,vertexing"); + + if (!cfgPairing_strCommonTrackCuts.IsNull()) { + std::unique_ptr objArrayCommon(cfgPairing_strCommonTrackCuts.Tokenize(",")); + for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { + DefineHistograms(fHistMan, Form("DileptonTrack_%s_%s_%s_%s", pairLegCutName.Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iCutTrack].Data()), fConfigHistogramSubgroups.value.data()); + DefineHistograms(fHistMan, Form("DileptonsSelected_%s_%s_%s", pairLegCutName.Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data()), "barrel,vertexing"); } } } - if (isBarrelME || isMuonME) { - fHistNamesME[icut] = Form("DileptonTrackME_%s", tempStr.Data()); - DefineHistograms(fHistMan, fHistNamesME[icut], "mixedevent"); // define ME histograms - } } - } - for (int icut = 0; icut < objArraySingleCuts->GetEntries(); ++icut) { - TString tempStr = objArraySingleCuts->At(icut)->GetName(); - if (tempStr.CompareTo(fConfigTrackCut.value.data()) == 0) { - fTrackCutBit = icut; // the bit correspoding to the track to be combined with dileptons + + if (isBarrelME || isMuonME) { + DefineHistograms(fHistMan, Form("DileptonTrackME_%s_%s", pairLegCutName.Data(), fTrackCutNames[iCutTrack].Data()), "mixedevent"); // define ME histograms } - } - } - } - if (fHistNamesDileptons.size() == 0) { - LOG(fatal) << " No valid dilepton cuts "; + } // end loop over track cuts to be combined with dileptons / di-tracks + } // end loop over pair leg track cuts } - if (context.mOptions.get("processBarrelMixedEvent")) { - DefineHistograms(fHistMan, "DileptonTrackME", "mixedevent"); // define all histograms - } dqhistograms::AddHistogramsFromJSON(fHistMan, fConfigAddJSONHistograms.value.c_str()); // ad-hoc histograms via JSON VarManager::SetUseVars(fHistMan->GetUsedVars()); @@ -3008,46 +3058,62 @@ struct AnalysisDileptonTrack { if (dilepton.sign() != 0) { continue; } - VarManager::FillTrack(dilepton, fValuesDilepton); + + // loop over existing dilepton leg cuts (e.g. electron1, electron2, etc) for (int icut = 0; icut < fNCuts; icut++) { - if (dilepton.filterMap_bit(icut)) { - fHistMan->FillHistClass(fHistNamesDileptons[icut].Data(), fValuesDilepton); - if constexpr (TCandidateType == VarManager::kDstarToD0KPiPi) { // Dielectrons and Dimuons don't have the PairFilterMap column - for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; iCommonCut++) { - if (dilepton.commonFilterMap_bit(fCommonTrackCutMap[iCommonCut])) { - fHistMan->FillHistClass(fHistNamesDileptons[fNCuts + icut * fNCommonTrackCuts + iCommonCut].Data(), fValuesDilepton); - } + + if (!dilepton.filterMap_bit(icut)) { + continue; + } + + // regular dileptons + fHistMan->FillHistClass(Form("DileptonsSelected_%s", fTrackCutNames[icut].Data()), fValuesDilepton); + + // other pairs, e.g.: D0s + if constexpr (TCandidateType == VarManager::kDstarToD0KPiPi) { // Dielectrons and Dimuons don't have the PairFilterMap column + for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; iCommonCut++) { + if (dilepton.commonFilterMap_bit(fCommonTrackCutMap[iCommonCut])) { + fHistMan->FillHistClass(Form("DileptonsSelected_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data()), fValuesDilepton); } - for (int iPairCut = 0; iPairCut < fNPairCuts; iPairCut++) { - if (dilepton.pairFilterMap_bit(iPairCut)) { - fHistMan->FillHistClass(fHistNamesDileptons[fNCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut].Data(), fValuesDilepton); - for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; iCommonCut++) { - if (dilepton.commonFilterMap_bit(fCommonTrackCutMap[iCommonCut])) { - fHistMan->FillHistClass(fHistNamesDileptons[(fNCuts * (fNCommonTrackCuts + 1) + fNCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts + 1) + iCommonCut * (1 + fNPairCuts) + iPairCut].Data(), fValuesDilepton); - } + } + for (int iPairCut = 0; iPairCut < fNPairCuts; iPairCut++) { + if (dilepton.pairFilterMap_bit(iPairCut)) { + fHistMan->FillHistClass(Form("DileptonsSelected_%s_%s", fTrackCutNames[icut].Data(), fPairCutNames[icut].Data()), fValuesDilepton); + for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; iCommonCut++) { + if (dilepton.commonFilterMap_bit(fCommonTrackCutMap[iCommonCut])) { + fHistMan->FillHistClass(Form("DileptonsSelected_%s_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[icut].Data()), fValuesDilepton); } } } } } - } + } // end loop over single lepton selections // loop over hadrons for (auto& assoc : assocs) { + + uint32_t trackSelection = 0; if constexpr (TCandidateType == VarManager::kBtoJpsiEEK) { - if (!assoc.isBarrelSelected_bit(fTrackCutBit)) { + // check the cuts fulfilled by this candidate track; if none just continue + trackSelection = (assoc.isBarrelSelected_raw() & fTrackCutBitMap); + if (!trackSelection) { continue; } + + // get the track from this association auto track = assoc.template reducedtrack_as(); + // check that this track is not included in the current dilepton if (track.globalIndex() == dilepton.index0Id() || track.globalIndex() == dilepton.index1Id()) { continue; } + // compute needed quantities VarManager::FillDileptonHadron(dilepton, track, fValuesHadron); VarManager::FillDileptonTrackVertexing(event, lepton1, lepton2, track, fValuesHadron); } if constexpr (TCandidateType == VarManager::kDstarToD0KPiPi) { - if (!assoc.isBarrelSelected_bit(fTrackCutBit)) { + trackSelection = (assoc.isBarrelSelected_raw() & fTrackCutBitMap); + if (!trackSelection) { continue; } auto track = assoc.template reducedtrack_as(); @@ -3062,7 +3128,8 @@ struct AnalysisDileptonTrack { VarManager::FillDileptonTrackVertexing(event, lepton1, lepton2, track, fValuesHadron); } if constexpr (TCandidateType == VarManager::kBcToThreeMuons) { - if (!assoc.isMuonSelected_bit(fTrackCutBit)) { + trackSelection = (assoc.isMuonSelected_raw() & fTrackCutBitMap); + if (!trackSelection) { continue; } auto track = assoc.template reducedmuon_as(); @@ -3074,30 +3141,46 @@ struct AnalysisDileptonTrack { VarManager::FillDileptonTrackVertexing(event, lepton1, lepton2, track, fValuesHadron); } + // Fill histograms for the triplets + // loop over dilepton / ditrack cuts for (int icut = 0; icut < fNCuts; icut++) { - if (dilepton.filterMap_bit(icut)) { - fHistMan->FillHistClass(fHistNamesDileptonTrack[icut].Data(), fValuesHadron); + + if (!dilepton.filterMap_bit(icut)) { + continue; + } + + // loop over specified track cuts (the tracks to be combined with the dileptons) + for (int iTrackCut = 0; iTrackCut < fNCuts; iTrackCut++) { + + if (!(trackSelection & (uint32_t(1) << iTrackCut))) { + continue; + } + fHistMan->FillHistClass(Form("DileptonTrack_%s_%s", fTrackCutNames[icut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); + if constexpr (TCandidateType == VarManager::kDstarToD0KPiPi) { // Dielectrons and Dimuons don't have the PairFilterMap column for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; iCommonCut++) { if (dilepton.commonFilterMap_bit(fCommonTrackCutMap[iCommonCut])) { - fHistMan->FillHistClass(fHistNamesDileptonTrack[fNCuts + icut * fNCommonTrackCuts + iCommonCut].Data(), fValuesHadron); + fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); } } for (int iPairCut = 0; iPairCut < fNPairCuts; iPairCut++) { if (dilepton.pairFilterMap_bit(iPairCut)) { - fHistMan->FillHistClass(fHistNamesDileptonTrack[fNCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut].Data(), fValuesHadron); + fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s", fTrackCutNames[icut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; iCommonCut++) { if (dilepton.commonFilterMap_bit(fCommonTrackCutMap[iCommonCut])) { - fHistMan->FillHistClass(fHistNamesDileptonTrack[(fNCuts * (fNCommonTrackCuts + 1) + fNCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts + 1) + iCommonCut * (1 + fNPairCuts) + iPairCut].Data(), fValuesHadron); + fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); } } } } } - } - } + } // end loop over track cuts + } // end loop over dilepton cuts // table to be written out for ML analysis - BmesonsTable(fValuesHadron[VarManager::kPairMass], fValuesHadron[VarManager::kDeltaMass], fValuesHadron[VarManager::kPairPt], fValuesHadron[VarManager::kVertexingLxy], fValuesHadron[VarManager::kVertexingLxyz], fValuesHadron[VarManager::kVertexingLz], fValuesHadron[VarManager::kVertexingTauxy], fValuesHadron[VarManager::kVertexingTauz], fValuesHadron[VarManager::kCosPointingAngle], fValuesHadron[VarManager::kVertexingChi2PCA]); + BmesonsTable(fValuesHadron[VarManager::kPairMass], fValuesHadron[VarManager::kDeltaMass], fValuesHadron[VarManager::kPairPt], + fValuesHadron[VarManager::kVertexingLxy], fValuesHadron[VarManager::kVertexingLxyz], fValuesHadron[VarManager::kVertexingLz], + fValuesHadron[VarManager::kVertexingTauxy], fValuesHadron[VarManager::kVertexingTauz], fValuesHadron[VarManager::kCosPointingAngle], + fValuesHadron[VarManager::kVertexingChi2PCA], dilepton.filterMap_raw(), trackSelection); } } } @@ -3176,27 +3259,47 @@ struct AnalysisDileptonTrack { events.bindExternalIndices(&dileptons); events.bindExternalIndices(&assocs); + // loop over two event comibnations for (auto& [event1, event2] : selfCombinations(fHashBin, fConfigMixingDepth.value, -1, events, events)) { + // fill event quantities VarManager::ResetValues(0, VarManager::kNVars); VarManager::FillEvent(event1, VarManager::fgValues); + // get the dilepton slice for event1 auto evDileptons = dileptons.sliceBy(dielectronsPerCollision, event1.globalIndex()); evDileptons.bindExternalIndices(&events); + // get the track associations slice for event2 auto evAssocs = assocs.sliceBy(trackAssocsPerCollision, event2.globalIndex()); evAssocs.bindExternalIndices(&events); + // loop over associations for (auto& assoc : evAssocs) { - if (!assoc.isBarrelSelected_bit(fTrackCutBit)) { + + // check that this track fulfills at least one of the specified cuts + uint32_t trackSelection = (assoc.isBarrelSelected_raw() & fTrackCutBitMap); + if (!trackSelection) { continue; } + + // get the track from this association auto track = assoc.template reducedtrack_as(); + // loop over dileptons for (auto dilepton : evDileptons) { + + // compute dilepton - track quantities VarManager::FillDileptonHadron(dilepton, track, VarManager::fgValues); + + // loop over dilepton leg cuts and track cuts and fill histograms separately for each combination for (int icut = 0; icut < fNCuts; icut++) { - if (dilepton.filterMap_bit(icut)) { - fHistMan->FillHistClass(fHistNamesME[icut].Data(), VarManager::fgValues); + if (!dilepton.filterMap_bit(icut)) { + continue; + } + for (uint32_t iTrackCut = 0; iTrackCut < fTrackCutNames.size(); iTrackCut++) { + if (trackSelection & (uint32_t(1) << iTrackCut)) { + fHistMan->FillHistClass(Form("DileptonTrackME_%s_%s", fTrackCutNames[icut].Data(), fTrackCutNames[iTrackCut].Data()), VarManager::fgValues); + } } } } // end for (dileptons) @@ -3226,7 +3329,8 @@ struct AnalysisDileptonTrack { for (auto& assoc : evAssocs) { - if (!assoc.isMuonSelected_bit(fTrackCutBit)) { + uint32_t muonSelection = assoc.isMuonSelected_raw() & fTrackCutBitMap; + if (!muonSelection) { continue; } auto track = assoc.template reducedmuon_as(); @@ -3234,8 +3338,13 @@ struct AnalysisDileptonTrack { for (auto dilepton : evDileptons) { VarManager::FillDileptonHadron(dilepton, track, VarManager::fgValues); for (int icut = 0; icut < fNCuts; icut++) { - if (dilepton.filterMap_bit(icut)) { - fHistMan->FillHistClass(fHistNamesME[icut].Data(), VarManager::fgValues); + if (!dilepton.filterMap_bit(icut)) { + continue; + } + for (uint32_t iTrackCut = 0; iTrackCut < fTrackCutNames.size(); iTrackCut++) { + if (muonSelection & (uint32_t(1) << iTrackCut)) { + fHistMan->FillHistClass(Form("DileptonTrackME_%s_%s", fTrackCutNames[icut].Data(), fTrackCutNames[iTrackCut].Data()), VarManager::fgValues); + } } } } // end for (dileptons) From cacf8c68199f585ad025bef9c14dae6cbdf16a1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrea=20Tavira=20Garc=C3=ADa?= <118979672+atavirag@users.noreply.github.com> Date: Wed, 5 Mar 2025 20:18:24 +0100 Subject: [PATCH 0556/1650] [PWGHF] Add sparse to compute the BDT selection systematic in correlatorDMesonPairs.cxx (#10334) --- .../TableProducer/correlatorDMesonPairs.cxx | 54 ++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx b/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx index 4f1fcd2f049..ef5791fadc8 100644 --- a/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx @@ -108,6 +108,16 @@ struct HfCorrelatorDMesonPairs { Partition> selectedD0Candidates = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlagD0 || aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlagD0bar; Partition> selectedD0CandidatesMc = aod::hf_sel_candidate_d0::isRecoHfFlag >= selectionFlagHf; + // ThnSparse for ML outputScores and Vars + ConfigurableAxis thnConfigAxisBkgScore{"thnConfigAxisBkgScore", {100, 0, 1}, "Bkg score bins"}; + ConfigurableAxis thnConfigAxisSignalScore{"thnConfigAxisSignalScore", {100, 0, 1}, "Signal score bins"}; + ConfigurableAxis thnConfigAxisMass{"thnConfigAxisMass", {120, 1.5848, 2.1848}, "Cand. inv-mass bins"}; + ConfigurableAxis thnConfigAxisPt{"thnConfigAxisPt", {500, 0, 50}, "Cand. pT bins"}; + ConfigurableAxis thnConfigAxisY{"thnConfigAxisY", {20, -1, 1}, "Cand. rapidity bins"}; + ConfigurableAxis thnConfigAxisOrigin{"thnConfigAxisOrigin", {3, -0.5, 2.5}, "Cand. origin type"}; + ConfigurableAxis thnConfigAxisCandType{"thnConfigAxisCandType", {6, -0.5, 5.5}, "D0 type"}; + ConfigurableAxis thnConfigAxisNumPvContr{"thnConfigAxisNumPvContr", {200, -0.5, 199.5}, "Number of PV contributors"}; + HistogramConfigSpec hTH1Pt{HistType::kTH1F, {{180, 0., 36.}}}; HistogramConfigSpec hTH1Y{HistType::kTH1F, {{100, -5., 5.}}}; HistogramConfigSpec hTH1NContrib{HistType::kTH1F, {{200, -0.5, 199.5}}}; @@ -261,6 +271,28 @@ struct HfCorrelatorDMesonPairs { registry.add("hMassMcRecPrompt", "D Meson pair candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{120, 1.5848, 2.1848}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("hMassMcRecNonPrompt", "D Meson pair candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{120, 1.5848, 2.1848}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("hMassMcRecReflections", "D Meson pair candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{120, 1.5848, 2.1848}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + + const AxisSpec thnAxisMass{thnConfigAxisMass, "inv. mass (#pi K) (GeV/#it{c}^{2})"}; + const AxisSpec thnAxisPt{thnConfigAxisPt, "#it{p}_{T} (GeV/#it{c})"}; + const AxisSpec thnAxisY{thnConfigAxisY, "y"}; + const AxisSpec thnAxisOrigin{thnConfigAxisOrigin, "Origin"}; + const AxisSpec thnAxisCandType{thnConfigAxisCandType, "D0 type"}; + const AxisSpec thnAxisNumPvContr{thnConfigAxisNumPvContr, "Number of PV contributors"}; + + std::vector axes = {thnAxisMass, thnAxisPt, thnAxisY, thnAxisNumPvContr, thnAxisOrigin, thnAxisCandType}; + if (applyMl) { + const AxisSpec thnAxisBkgScore{thnConfigAxisBkgScore, "BDT score bkg"}; + const AxisSpec thnAxisSignalScore{thnConfigAxisSignalScore, "BDT score signal"}; + + axes.insert(axes.begin(), thnAxisSignalScore); + axes.insert(axes.begin(), thnAxisBkgScore); + + registry.add("hnDMesonMl", "THn for D Meson candidates", HistType::kTHnSparseD, axes); + registry.get(HIST("hnDMesonMl"))->Sumw2(); + } else { + registry.add("hnDMeson", "Thn for D0 candidates", HistType::kTHnSparseD, axes); + registry.get(HIST("hnDMeson"))->Sumw2(); + } } /// Sets bits to select candidate type for D0 @@ -593,9 +625,19 @@ struct HfCorrelatorDMesonPairs { if (isDCand1) { registry.fill(HIST("hMass"), hfHelper.invMassD0ToPiK(candidate1), candidate1.pt()); + if (applyMl) { + registry.fill(HIST("hnDMesonMl"), outputMlD0Cand1[0], outputMlD0Cand1[1], hfHelper.invMassD0ToPiK(candidate1), candidate1.pt(), candidate1.y(MassD0), collision.numContrib(), 0, candidateType1); + } else { + registry.fill(HIST("hnDMeson"), hfHelper.invMassD0ToPiK(candidate1), candidate1.pt(), candidate1.y(MassD0), collision.numContrib(), 0, candidateType1); + } } if (isDbarCand1) { registry.fill(HIST("hMass"), hfHelper.invMassD0barToKPi(candidate1), candidate1.pt()); + if (applyMl) { + registry.fill(HIST("hnDMesonMl"), outputMlD0barCand1[0], outputMlD0barCand1[1], hfHelper.invMassD0barToKPi(candidate1), candidate1.pt(), candidate1.y(MassD0), collision.numContrib(), 0, candidateType1); + } else { + registry.fill(HIST("hnDMeson"), hfHelper.invMassD0barToKPi(candidate1), candidate1.pt(), candidate1.y(MassD0), collision.numContrib(), 0, candidateType1); + } } for (auto candidate2 = candidate1 + 1; candidate2 != selectedD0CandidatesGrouped.end(); ++candidate2) { @@ -649,7 +691,7 @@ struct HfCorrelatorDMesonPairs { } fillEntry(isDCand1, isDbarCand1, isDCand2, isDbarCand2, candidateType1, candidateType2, hfHelper.yD0(candidate1), hfHelper.yD0(candidate2), - candidate1.pt(), candidate2.pt(), candidate1.phi(), candidate2.phi(), hfHelper.invMassD0ToPiK(candidate1), hfHelper.invMassD0barToKPi(candidate1), + candidate1.phi(), candidate2.phi(), candidate1.pt(), candidate2.pt(), hfHelper.invMassD0ToPiK(candidate1), hfHelper.invMassD0barToKPi(candidate1), hfHelper.invMassD0ToPiK(candidate2), hfHelper.invMassD0barToKPi(candidate2)); entryD0PairMl(outputMlD0Cand1, outputMlD0barCand1, outputMlD0Cand2, outputMlD0barCand2); @@ -751,6 +793,11 @@ struct HfCorrelatorDMesonPairs { registry.fill(HIST("hPtCandAfterCut"), candidate1.pt()); if (isDCand1) { + if (applyMl) { + registry.fill(HIST("hnDMesonMl"), outputMlD0Cand1[0], outputMlD0Cand1[1], hfHelper.invMassD0ToPiK(candidate1), candidate1.pt(), candidate1.y(MassD0), collision.numContrib(), originRec1, candidateType1); + } else { + registry.fill(HIST("hnDMeson"), hfHelper.invMassD0ToPiK(candidate1), candidate1.pt(), candidate1.y(MassD0), collision.numContrib(), originRec1, candidateType1); + } if (isTrueDCand1) { registry.fill(HIST("hMass"), hfHelper.invMassD0ToPiK(candidate1), candidate1.pt()); registry.fill(HIST("hPtVsYVsNContribMcRec"), candidate1.pt(), hfHelper.yD0(candidate1), collision.numContrib()); @@ -767,6 +814,11 @@ struct HfCorrelatorDMesonPairs { } } if (isDbarCand1) { + if (applyMl) { + registry.fill(HIST("hnDMesonMl"), outputMlD0barCand1[0], outputMlD0barCand1[1], hfHelper.invMassD0barToKPi(candidate1), candidate1.pt(), candidate1.y(MassD0), collision.numContrib(), originRec1, candidateType1); + } else { + registry.fill(HIST("hnDMeson"), hfHelper.invMassD0barToKPi(candidate1), candidate1.pt(), candidate1.y(MassD0), collision.numContrib(), originRec1, candidateType1); + } if (isTrueDbarCand1) { registry.fill(HIST("hMass"), hfHelper.invMassD0barToKPi(candidate1), candidate1.pt()); registry.fill(HIST("hPtVsYVsNContribMcRec"), candidate1.pt(), hfHelper.yD0(candidate1), collision.numContrib()); From 68b7dd9fa1b2fc6b416b973a6daa3d2e8d169150 Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Wed, 5 Mar 2025 21:01:45 +0100 Subject: [PATCH 0557/1650] [PWGLF] Resonance Framework - Reduce track table size (#10348) --- PWGLF/DataModel/LFResonanceTables.h | 420 +++++++++++------- .../Resonances/resonanceInitializer.cxx | 87 ++-- .../Resonances/resonanceMergeDF.cxx | 103 ++--- .../Resonances/resonanceModuleInitializer.cxx | 85 ++-- PWGLF/Tasks/Resonances/kstar892analysis.cxx | 99 ++++- 5 files changed, 453 insertions(+), 341 deletions(-) diff --git a/PWGLF/DataModel/LFResonanceTables.h b/PWGLF/DataModel/LFResonanceTables.h index 2f2a041f324..dc8389e0a63 100644 --- a/PWGLF/DataModel/LFResonanceTables.h +++ b/PWGLF/DataModel/LFResonanceTables.h @@ -142,64 +142,58 @@ namespace resodaughter DECLARE_SOA_INDEX_COLUMN(ResoCollision, resoCollision); DECLARE_SOA_INDEX_COLUMN(ResoCollisionDF, resoCollisionDF); -DECLARE_SOA_INDEX_COLUMN_FULL(Track, track, int, Tracks, "_Trk"); //! -DECLARE_SOA_INDEX_COLUMN_FULL(V0, v0, int, V0s, "_V0"); //! -DECLARE_SOA_INDEX_COLUMN_FULL(Cascade, cascade, int, Cascades, "_Cas"); //! -DECLARE_SOA_COLUMN(Pt, pt, float); //! p_T (GeV/c) -DECLARE_SOA_COLUMN(Px, px, float); //! p_x (GeV/c) -DECLARE_SOA_COLUMN(Py, py, float); //! p_y (GeV/c) -DECLARE_SOA_COLUMN(Pz, pz, float); //! p_z (GeV/c) -DECLARE_SOA_COLUMN(Eta, eta, float); //! Eta -DECLARE_SOA_COLUMN(Phi, phi, float); //! Phi -DECLARE_SOA_COLUMN(PartType, partType, uint8_t); //! Type of the particle, according to resodaughter::ParticleType -DECLARE_SOA_COLUMN(TempFitVar, tempFitVar, float); //! Observable for the template fitting (Track: DCA_xy, V0: CPA) -DECLARE_SOA_COLUMN(Indices, indices, int[2]); //! Field for the track indices to remove auto-correlations -DECLARE_SOA_COLUMN(CascadeIndices, cascadeIndices, int[3]); //! Field for the track indices to remove auto-correlations (ordered: positive, negative, bachelor) -DECLARE_SOA_COLUMN(Sign, sign, int8_t); //! Sign of the track charge -DECLARE_SOA_COLUMN(TpcNClsCrossedRows, tpcNClsCrossedRows, uint8_t); //! Number of TPC crossed rows -DECLARE_SOA_COLUMN(TpcNClsFound, tpcNClsFound, uint8_t); //! Number of TPC clusters found -DECLARE_SOA_COLUMN(IsGlobalTrackWoDCA, isGlobalTrackWoDCA, bool); //! Is global track without DCA -DECLARE_SOA_COLUMN(IsGlobalTrack, isGlobalTrack, bool); //! Is global track -DECLARE_SOA_COLUMN(IsPrimaryTrack, isPrimaryTrack, bool); //! Is primary track -DECLARE_SOA_COLUMN(IsPVContributor, isPVContributor, bool); //! Is primary vertex contributor -DECLARE_SOA_COLUMN(HasTOF, hasTOF, bool); //! Has TOF -DECLARE_SOA_COLUMN(TpcNSigmaPi10, tpcNSigmaPi10, int8_t); //! TPC PID x10 of the track as Pion -DECLARE_SOA_COLUMN(TpcNSigmaKa10, tpcNSigmaKa10, int8_t); //! TPC PID x10 of the track as Kaon -DECLARE_SOA_COLUMN(TpcNSigmaPr10, tpcNSigmaPr10, int8_t); //! TPC PID x10 of the track as Proton -DECLARE_SOA_COLUMN(TofNSigmaPi10, tofNSigmaPi10, int8_t); //! TOF PID x10 of the track as Pion -DECLARE_SOA_COLUMN(TofNSigmaKa10, tofNSigmaKa10, int8_t); //! TOF PID x10 of the track as Kaon -DECLARE_SOA_COLUMN(TofNSigmaPr10, tofNSigmaPr10, int8_t); //! TOF PID x10 of the track as Proton -DECLARE_SOA_COLUMN(DaughDCA, daughDCA, float); //! DCA between daughters -DECLARE_SOA_COLUMN(CascDaughDCA, cascDaughDCA, float); //! DCA between daughters from cascade -DECLARE_SOA_COLUMN(V0CosPA, v0CosPA, float); //! V0 Cosine of Pointing Angle -DECLARE_SOA_COLUMN(CascCosPA, cascCosPA, float); //! Cascade Cosine of Pointing Angle -DECLARE_SOA_COLUMN(MLambda, mLambda, float); //! The invariant mass of V0 candidate, assuming lambda -DECLARE_SOA_COLUMN(MAntiLambda, mAntiLambda, float); //! The invariant mass of V0 candidate, assuming antilambda -DECLARE_SOA_COLUMN(MK0Short, mK0Short, float); //! The invariant mass of V0 candidate, assuming k0s -DECLARE_SOA_COLUMN(MXi, mXi, float); //! The invariant mass of Xi candidate -DECLARE_SOA_COLUMN(TransRadius, transRadius, float); //! Transverse radius of the decay vertex -DECLARE_SOA_COLUMN(CascTransRadius, cascTransRadius, float); //! Transverse radius of the decay vertex from cascade -DECLARE_SOA_COLUMN(DecayVtxX, decayVtxX, float); //! X position of the decay vertex -DECLARE_SOA_COLUMN(DecayVtxY, decayVtxY, float); //! Y position of the decay vertex -DECLARE_SOA_COLUMN(DecayVtxZ, decayVtxZ, float); //! Z position of the decay vertex -DECLARE_SOA_COLUMN(DaughterTPCNSigmaPosPi, daughterTPCNSigmaPosPi, float); //! TPC PID of the positive daughter as Pion -DECLARE_SOA_COLUMN(DaughterTPCNSigmaPosKa, daughterTPCNSigmaPosKa, float); //! TPC PID of the positive daughter as Kaon -DECLARE_SOA_COLUMN(DaughterTPCNSigmaPosPr, daughterTPCNSigmaPosPr, float); //! TPC PID of the positive daughter as Proton -DECLARE_SOA_COLUMN(DaughterTPCNSigmaNegPi, daughterTPCNSigmaNegPi, float); //! TPC PID of the negative daughter as Pion -DECLARE_SOA_COLUMN(DaughterTPCNSigmaNegKa, daughterTPCNSigmaNegKa, float); //! TPC PID of the negative daughter as Kaon -DECLARE_SOA_COLUMN(DaughterTPCNSigmaNegPr, daughterTPCNSigmaNegPr, float); //! TPC PID of the negative daughter as Proton -DECLARE_SOA_COLUMN(DaughterTPCNSigmaBachPi, daughterTPCNSigmaBachPi, float); //! TPC PID of the bachelor daughter as Pion -DECLARE_SOA_COLUMN(DaughterTPCNSigmaBachKa, daughterTPCNSigmaBachKa, float); //! TPC PID of the bachelor daughter as Kaon -DECLARE_SOA_COLUMN(DaughterTPCNSigmaBachPr, daughterTPCNSigmaBachPr, float); //! TPC PID of the bachelor daughter as Proton -DECLARE_SOA_COLUMN(DaughterTOFNSigmaPosPi, daughterTOFNSigmaPosPi, float); //! TOF PID of the positive daughter as Pion -DECLARE_SOA_COLUMN(DaughterTOFNSigmaPosKa, daughterTOFNSigmaPosKa, float); //! TOF PID of the positive daughter as Kaon -DECLARE_SOA_COLUMN(DaughterTOFNSigmaPosPr, daughterTOFNSigmaPosPr, float); //! TOF PID of the positive daughter as Proton -DECLARE_SOA_COLUMN(DaughterTOFNSigmaNegPi, daughterTOFNSigmaNegPi, float); //! TOF PID of the negative daughter as Pion -DECLARE_SOA_COLUMN(DaughterTOFNSigmaNegKa, daughterTOFNSigmaNegKa, float); //! TOF PID of the negative daughter as Kaon -DECLARE_SOA_COLUMN(DaughterTOFNSigmaNegPr, daughterTOFNSigmaNegPr, float); //! TOF PID of the negative daughter as Proton -DECLARE_SOA_COLUMN(DaughterTOFNSigmaBachPi, daughterTOFNSigmaBachPi, float); //! TOF PID of the bachelor daughter as Pion -DECLARE_SOA_COLUMN(DaughterTOFNSigmaBachKa, daughterTOFNSigmaBachKa, float); //! TOF PID of the bachelor daughter as Kaon -DECLARE_SOA_COLUMN(DaughterTOFNSigmaBachPr, daughterTOFNSigmaBachPr, float); //! TOF PID of the bachelor daughter as Proton +DECLARE_SOA_INDEX_COLUMN_FULL(Track, track, int, Tracks, "_Trk"); //! +DECLARE_SOA_INDEX_COLUMN_FULL(V0, v0, int, V0s, "_V0"); //! +DECLARE_SOA_INDEX_COLUMN_FULL(Cascade, cascade, int, Cascades, "_Cas"); //! +DECLARE_SOA_COLUMN(Pt, pt, float); //! p_t (GeV/c) +DECLARE_SOA_COLUMN(Px, px, float); //! p_x (GeV/c) +DECLARE_SOA_COLUMN(Py, py, float); //! p_y (GeV/c) +DECLARE_SOA_COLUMN(Pz, pz, float); //! p_z (GeV/c) +DECLARE_SOA_COLUMN(PartType, partType, uint8_t); //! Type of the particle, according to resodaughter::ParticleType +DECLARE_SOA_COLUMN(TempFitVar, tempFitVar, float); //! Observable for the template fitting (Track: DCA_xy, V0: CPA) +DECLARE_SOA_COLUMN(Indices, indices, int[2]); //! Field for the track indices to remove auto-correlations +DECLARE_SOA_COLUMN(CascadeIndices, cascadeIndices, int[3]); //! Field for the track indices to remove auto-correlations (ordered: positive, negative, bachelor) +DECLARE_SOA_COLUMN(TpcNClsCrossedRows, tpcNClsCrossedRows, uint8_t); //! Number of TPC crossed rows +DECLARE_SOA_COLUMN(TpcNClsFound, tpcNClsFound, uint8_t); //! Number of TPC clusters found +DECLARE_SOA_COLUMN(TrackFlags, trackFlags, uint8_t); //! Track flags +DECLARE_SOA_COLUMN(TpcNSigmaPi10, tpcNSigmaPi10, int8_t); //! TPC PID x10 of the track as Pion +DECLARE_SOA_COLUMN(TpcNSigmaKa10, tpcNSigmaKa10, int8_t); //! TPC PID x10 of the track as Kaon +DECLARE_SOA_COLUMN(TpcNSigmaPr10, tpcNSigmaPr10, int8_t); //! TPC PID x10 of the track as Proton +DECLARE_SOA_COLUMN(TofNSigmaPi10, tofNSigmaPi10, int8_t); //! TOF PID x10 of the track as Pion +DECLARE_SOA_COLUMN(TofNSigmaKa10, tofNSigmaKa10, int8_t); //! TOF PID x10 of the track as Kaon +DECLARE_SOA_COLUMN(TofNSigmaPr10, tofNSigmaPr10, int8_t); //! TOF PID x10 of the track as Proton +DECLARE_SOA_COLUMN(DaughDCA, daughDCA, float); //! DCA between daughters +DECLARE_SOA_COLUMN(CascDaughDCA, cascDaughDCA, float); //! DCA between daughters from cascade +DECLARE_SOA_COLUMN(V0CosPA, v0CosPA, float); //! V0 Cosine of Pointing Angle +DECLARE_SOA_COLUMN(CascCosPA, cascCosPA, float); //! Cascade Cosine of Pointing Angle +DECLARE_SOA_COLUMN(MLambda, mLambda, float); //! The invariant mass of V0 candidate, assuming lambda +DECLARE_SOA_COLUMN(MAntiLambda, mAntiLambda, float); //! The invariant mass of V0 candidate, assuming antilambda +DECLARE_SOA_COLUMN(MK0Short, mK0Short, float); //! The invariant mass of V0 candidate, assuming k0s +DECLARE_SOA_COLUMN(MXi, mXi, float); //! The invariant mass of Xi candidate +DECLARE_SOA_COLUMN(TransRadius, transRadius, float); //! Transverse radius of the decay vertex +DECLARE_SOA_COLUMN(CascTransRadius, cascTransRadius, float); //! Transverse radius of the decay vertex from cascade +DECLARE_SOA_COLUMN(DecayVtxX, decayVtxX, float); //! X position of the decay vertex +DECLARE_SOA_COLUMN(DecayVtxY, decayVtxY, float); //! Y position of the decay vertex +DECLARE_SOA_COLUMN(DecayVtxZ, decayVtxZ, float); //! Z position of the decay vertex +DECLARE_SOA_COLUMN(TpcSignal10, tpcSignal10, int8_t); //! TPC signal of the track x10 +DECLARE_SOA_COLUMN(DaughterTPCNSigmaPosPi10, daughterTPCNSigmaPosPi10, int8_t); //! TPC PID x10 of the positive daughter as Pion +DECLARE_SOA_COLUMN(DaughterTPCNSigmaPosKa10, daughterTPCNSigmaPosKa10, int8_t); //! TPC PID x10 of the positive daughter as Kaon +DECLARE_SOA_COLUMN(DaughterTPCNSigmaPosPr10, daughterTPCNSigmaPosPr10, int8_t); //! TPC PID x10 of the positive daughter as Proton +DECLARE_SOA_COLUMN(DaughterTPCNSigmaNegPi10, daughterTPCNSigmaNegPi10, int8_t); //! TPC PID x10 of the negative daughter as Pion +DECLARE_SOA_COLUMN(DaughterTPCNSigmaNegKa10, daughterTPCNSigmaNegKa10, int8_t); //! TPC PID x10 of the negative daughter as Kaon +DECLARE_SOA_COLUMN(DaughterTPCNSigmaNegPr10, daughterTPCNSigmaNegPr10, int8_t); //! TPC PID x10 of the negative daughter as Proton +DECLARE_SOA_COLUMN(DaughterTPCNSigmaBachPi10, daughterTPCNSigmaBachPi10, int8_t); //! TPC PID x10 of the bachelor daughter as Pion +DECLARE_SOA_COLUMN(DaughterTPCNSigmaBachKa10, daughterTPCNSigmaBachKa10, int8_t); //! TPC PID x10 of the bachelor daughter as Kaon +DECLARE_SOA_COLUMN(DaughterTPCNSigmaBachPr10, daughterTPCNSigmaBachPr10, int8_t); //! TPC PID x10 of the bachelor daughter as Proton +DECLARE_SOA_COLUMN(DaughterTOFNSigmaPosPi10, daughterTOFNSigmaPosPi10, int8_t); //! TOF PID x10 of the positive daughter as Pion +DECLARE_SOA_COLUMN(DaughterTOFNSigmaPosKa10, daughterTOFNSigmaPosKa10, int8_t); //! TOF PID x10 of the positive daughter as Kaon +DECLARE_SOA_COLUMN(DaughterTOFNSigmaPosPr10, daughterTOFNSigmaPosPr10, int8_t); //! TOF PID x10 of the positive daughter as Proton +DECLARE_SOA_COLUMN(DaughterTOFNSigmaNegPi10, daughterTOFNSigmaNegPi10, int8_t); //! TOF PID x10 of the negative daughter as Pion +DECLARE_SOA_COLUMN(DaughterTOFNSigmaNegKa10, daughterTOFNSigmaNegKa10, int8_t); //! TOF PID x10 of the negative daughter as Kaon +DECLARE_SOA_COLUMN(DaughterTOFNSigmaNegPr10, daughterTOFNSigmaNegPr10, int8_t); //! TOF PID x10 of the negative daughter as Proton +DECLARE_SOA_COLUMN(DaughterTOFNSigmaBachPi10, daughterTOFNSigmaBachPi10, int8_t); //! TOF PID x10 of the bachelor daughter as Pion +DECLARE_SOA_COLUMN(DaughterTOFNSigmaBachKa10, daughterTOFNSigmaBachKa10, int8_t); //! TOF PID x10 of the bachelor daughter as Kaon +DECLARE_SOA_COLUMN(DaughterTOFNSigmaBachPr10, daughterTOFNSigmaBachPr10, int8_t); //! TOF PID x10 of the bachelor daughter as Proton // For MC DECLARE_SOA_INDEX_COLUMN(McParticle, mcParticle); //! Index of the corresponding MC particle DECLARE_SOA_COLUMN(IsPhysicalPrimary, isPhysicalPrimary, bool); @@ -216,29 +210,77 @@ DECLARE_SOA_COLUMN(V0ID, v0ID, int); //! Id of the V0 from casca // Dynamic columns // TPC PID return value/10 DECLARE_SOA_DYNAMIC_COLUMN(TpcNSigmaPi, tpcNSigmaPi, - [](int8_t tpcNSigmaPi10) { - return (float)tpcNSigmaPi10 / 10.f; - }); + [](int8_t tpcNSigmaPi10) { return (float)tpcNSigmaPi10 / 10.f; }); DECLARE_SOA_DYNAMIC_COLUMN(TpcNSigmaKa, tpcNSigmaKa, - [](int8_t tpcNSigmaKa10) { - return (float)tpcNSigmaKa10 / 10.f; - }); + [](int8_t tpcNSigmaKa10) { return (float)tpcNSigmaKa10 / 10.f; }); DECLARE_SOA_DYNAMIC_COLUMN(TpcNSigmaPr, tpcNSigmaPr, - [](int8_t tpcNSigmaPr10) { - return (float)tpcNSigmaPr10 / 10.f; - }); + [](int8_t tpcNSigmaPr10) { return (float)tpcNSigmaPr10 / 10.f; }); DECLARE_SOA_DYNAMIC_COLUMN(TofNSigmaPi, tofNSigmaPi, - [](int8_t tofNSigmaPi10) { - return (float)tofNSigmaPi10 / 10.f; - }); + [](int8_t tofNSigmaPi10) { return (float)tofNSigmaPi10 / 10.f; }); DECLARE_SOA_DYNAMIC_COLUMN(TofNSigmaKa, tofNSigmaKa, - [](int8_t tofNSigmaKa10) { - return (float)tofNSigmaKa10 / 10.f; - }); + [](int8_t tofNSigmaKa10) { return (float)tofNSigmaKa10 / 10.f; }); DECLARE_SOA_DYNAMIC_COLUMN(TofNSigmaPr, tofNSigmaPr, - [](int8_t tofNSigmaPr10) { - return (float)tofNSigmaPr10 / 10.f; - }); + [](int8_t tofNSigmaPr10) { return (float)tofNSigmaPr10 / 10.f; }); +DECLARE_SOA_DYNAMIC_COLUMN(DaughterTPCNSigmaPosPi, daughterTPCNSigmaPosPi, + [](int8_t daughterTPCNSigmaPosPi10) { return (float)daughterTPCNSigmaPosPi10 / 10.f; }); +DECLARE_SOA_DYNAMIC_COLUMN(DaughterTPCNSigmaPosKa, daughterTPCNSigmaPosKa, + [](int8_t daughterTPCNSigmaPosKa10) { return (float)daughterTPCNSigmaPosKa10 / 10.f; }); +DECLARE_SOA_DYNAMIC_COLUMN(DaughterTPCNSigmaPosPr, daughterTPCNSigmaPosPr, + [](int8_t daughterTPCNSigmaPosPr10) { return (float)daughterTPCNSigmaPosPr10 / 10.f; }); +DECLARE_SOA_DYNAMIC_COLUMN(DaughterTPCNSigmaNegPi, daughterTPCNSigmaNegPi, + [](int8_t daughterTPCNSigmaNegPi10) { return (float)daughterTPCNSigmaNegPi10 / 10.f; }); +DECLARE_SOA_DYNAMIC_COLUMN(DaughterTPCNSigmaNegKa, daughterTPCNSigmaNegKa, + [](int8_t daughterTPCNSigmaNegKa10) { return (float)daughterTPCNSigmaNegKa10 / 10.f; }); +DECLARE_SOA_DYNAMIC_COLUMN(DaughterTPCNSigmaNegPr, daughterTPCNSigmaNegPr, + [](int8_t daughterTPCNSigmaNegPr10) { return (float)daughterTPCNSigmaNegPr10 / 10.f; }); +DECLARE_SOA_DYNAMIC_COLUMN(DaughterTPCNSigmaBachPi, daughterTPCNSigmaBachPi, + [](int8_t daughterTPCNSigmaBachPi10) { return (float)daughterTPCNSigmaBachPi10 / 10.f; }); +DECLARE_SOA_DYNAMIC_COLUMN(DaughterTPCNSigmaBachKa, daughterTPCNSigmaBachKa, + [](int8_t daughterTPCNSigmaBachKa10) { return (float)daughterTPCNSigmaBachKa10 / 10.f; }); +DECLARE_SOA_DYNAMIC_COLUMN(DaughterTPCNSigmaBachPr, daughterTPCNSigmaBachPr, + [](int8_t daughterTPCNSigmaBachPr10) { return (float)daughterTPCNSigmaBachPr10 / 10.f; }); +DECLARE_SOA_DYNAMIC_COLUMN(DaughterTOFNSigmaPosPi, daughterTOFNSigmaPosPi, + [](int8_t daughterTOFNSigmaPosPi10) { return (float)daughterTOFNSigmaPosPi10 / 10.f; }); +DECLARE_SOA_DYNAMIC_COLUMN(DaughterTOFNSigmaPosKa, daughterTOFNSigmaPosKa, + [](int8_t daughterTOFNSigmaPosKa10) { return (float)daughterTOFNSigmaPosKa10 / 10.f; }); +DECLARE_SOA_DYNAMIC_COLUMN(DaughterTOFNSigmaPosPr, daughterTOFNSigmaPosPr, + [](int8_t daughterTOFNSigmaPosPr10) { return (float)daughterTOFNSigmaPosPr10 / 10.f; }); +DECLARE_SOA_DYNAMIC_COLUMN(DaughterTOFNSigmaNegPi, daughterTOFNSigmaNegPi, + [](int8_t daughterTOFNSigmaNegPi10) { return (float)daughterTOFNSigmaNegPi10 / 10.f; }); +DECLARE_SOA_DYNAMIC_COLUMN(DaughterTOFNSigmaNegKa, daughterTOFNSigmaNegKa, + [](int8_t daughterTOFNSigmaNegKa10) { return (float)daughterTOFNSigmaNegKa10 / 10.f; }); +DECLARE_SOA_DYNAMIC_COLUMN(DaughterTOFNSigmaNegPr, daughterTOFNSigmaNegPr, + [](int8_t daughterTOFNSigmaNegPr10) { return (float)daughterTOFNSigmaNegPr10 / 10.f; }); +DECLARE_SOA_DYNAMIC_COLUMN(DaughterTOFNSigmaBachPi, daughterTOFNSigmaBachPi, + [](int8_t daughterTOFNSigmaBachPi10) { return (float)daughterTOFNSigmaBachPi10 / 10.f; }); +DECLARE_SOA_DYNAMIC_COLUMN(DaughterTOFNSigmaBachKa, daughterTOFNSigmaBachKa, + [](int8_t daughterTOFNSigmaBachKa10) { return (float)daughterTOFNSigmaBachKa10 / 10.f; }); +DECLARE_SOA_DYNAMIC_COLUMN(DaughterTOFNSigmaBachPr, daughterTOFNSigmaBachPr, + [](int8_t daughterTOFNSigmaBachPr10) { return (float)daughterTOFNSigmaBachPr10 / 10.f; }); +// TPC signal x10 +DECLARE_SOA_DYNAMIC_COLUMN(TpcSignal, tpcSignal, + [](int8_t tpcSignal10) { return (float)tpcSignal10 / 10.f; }); +// pT, Eta, Phi +// DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, [](float px, float py) -> float { return RecoDecay::sqrtSumOfSquares(px, py); }); +DECLARE_SOA_DYNAMIC_COLUMN(Eta, eta, [](float px, float py, float pz) -> float { return RecoDecay::eta(std::array{px, py, pz}); }); +DECLARE_SOA_DYNAMIC_COLUMN(Phi, phi, [](float px, float py) -> float { return RecoDecay::phi(px, py); }); +// Track flags +DECLARE_SOA_DYNAMIC_COLUMN(PassedITSRefit, passedITSRefit, + [](uint8_t trackFlags) -> bool { return (trackFlags & (1 << 0)) != 0; }); +DECLARE_SOA_DYNAMIC_COLUMN(PassedTPCRefit, passedTPCRefit, + [](uint8_t trackFlags) -> bool { return (trackFlags & (1 << 1)) != 0; }); +DECLARE_SOA_DYNAMIC_COLUMN(IsGlobalTrackWoDCA, isGlobalTrackWoDCA, + [](uint8_t trackFlags) -> bool { return (trackFlags & (1 << 2)) != 0; }); +DECLARE_SOA_DYNAMIC_COLUMN(IsGlobalTrack, isGlobalTrack, + [](uint8_t trackFlags) -> bool { return (trackFlags & (1 << 3)) != 0; }); +DECLARE_SOA_DYNAMIC_COLUMN(IsPrimaryTrack, isPrimaryTrack, + [](uint8_t trackFlags) -> bool { return (trackFlags & (1 << 4)) != 0; }); +DECLARE_SOA_DYNAMIC_COLUMN(IsPVContributor, isPVContributor, + [](uint8_t trackFlags) -> bool { return (trackFlags & (1 << 5)) != 0; }); +DECLARE_SOA_DYNAMIC_COLUMN(HasTOF, hasTOF, + [](uint8_t trackFlags) -> bool { return (trackFlags & (1 << 6)) != 0; }); +DECLARE_SOA_DYNAMIC_COLUMN(Sign, sign, + [](uint8_t trackFlags) -> int8_t { return (trackFlags & (1 << 7)) ? 1 : -1; }); } // namespace resodaughter DECLARE_SOA_TABLE(ResoTracks, "AOD", "RESOTRACK", o2::soa::Index<>, @@ -248,34 +290,37 @@ DECLARE_SOA_TABLE(ResoTracks, "AOD", "RESOTRACK", resodaughter::Px, resodaughter::Py, resodaughter::Pz, - resodaughter::Eta, - resodaughter::Phi, - resodaughter::Sign, resodaughter::TpcNClsCrossedRows, resodaughter::TpcNClsFound, o2::aod::track::DcaXY, o2::aod::track::DcaZ, - resodaughter::HasTOF, resodaughter::TpcNSigmaPi10, resodaughter::TpcNSigmaKa10, resodaughter::TpcNSigmaPr10, resodaughter::TofNSigmaPi10, resodaughter::TofNSigmaKa10, resodaughter::TofNSigmaPr10, - o2::aod::track::TPCSignal, - o2::aod::track::PassedITSRefit, - o2::aod::track::PassedTPCRefit, - resodaughter::IsGlobalTrackWoDCA, - resodaughter::IsGlobalTrack, - resodaughter::IsPrimaryTrack, - resodaughter::IsPVContributor, + resodaughter::TpcSignal10, + resodaughter::TrackFlags, // Dynamic columns resodaughter::TpcNSigmaPi, resodaughter::TpcNSigmaKa, resodaughter::TpcNSigmaPr, resodaughter::TofNSigmaPi, resodaughter::TofNSigmaKa, - resodaughter::TofNSigmaPr); + resodaughter::TofNSigmaPr, + resodaughter::TpcSignal, + // resodaughter::Pt, + resodaughter::Eta, + resodaughter::Phi, + resodaughter::PassedITSRefit, + resodaughter::PassedTPCRefit, + resodaughter::IsGlobalTrackWoDCA, + resodaughter::IsGlobalTrack, + resodaughter::IsPrimaryTrack, + resodaughter::IsPVContributor, + resodaughter::HasTOF, + resodaughter::Sign); using ResoTrack = ResoTracks::iterator; // For DF mixing study @@ -287,34 +332,37 @@ DECLARE_SOA_TABLE(ResoTrackDFs, "AOD", "RESOTRACKDF", resodaughter::Px, resodaughter::Py, resodaughter::Pz, - resodaughter::Eta, - resodaughter::Phi, - resodaughter::Sign, resodaughter::TpcNClsCrossedRows, resodaughter::TpcNClsFound, o2::aod::track::DcaXY, o2::aod::track::DcaZ, - resodaughter::HasTOF, resodaughter::TpcNSigmaPi10, resodaughter::TpcNSigmaKa10, resodaughter::TpcNSigmaPr10, resodaughter::TofNSigmaPi10, resodaughter::TofNSigmaKa10, resodaughter::TofNSigmaPr10, - o2::aod::track::TPCSignal, - o2::aod::track::PassedITSRefit, - o2::aod::track::PassedTPCRefit, - resodaughter::IsGlobalTrackWoDCA, - resodaughter::IsGlobalTrack, - resodaughter::IsPrimaryTrack, - resodaughter::IsPVContributor, + resodaughter::TpcSignal10, + resodaughter::TrackFlags, // Dynamic columns resodaughter::TpcNSigmaPi, resodaughter::TpcNSigmaKa, resodaughter::TpcNSigmaPr, resodaughter::TofNSigmaPi, resodaughter::TofNSigmaKa, - resodaughter::TofNSigmaPr); + resodaughter::TofNSigmaPr, + resodaughter::TpcSignal, + // resodaughter::Pt, + resodaughter::Eta, + resodaughter::Phi, + resodaughter::PassedITSRefit, + resodaughter::PassedTPCRefit, + resodaughter::IsGlobalTrackWoDCA, + resodaughter::IsGlobalTrack, + resodaughter::IsPrimaryTrack, + resodaughter::IsPVContributor, + resodaughter::HasTOF, + resodaughter::Sign); using ResoTrackDF = ResoTrackDFs::iterator; DECLARE_SOA_TABLE(ResoV0s, "AOD", "RESOV0", @@ -325,21 +373,19 @@ DECLARE_SOA_TABLE(ResoV0s, "AOD", "RESOV0", resodaughter::Px, resodaughter::Py, resodaughter::Pz, - resodaughter::Eta, - resodaughter::Phi, resodaughter::Indices, - resodaughter::DaughterTPCNSigmaPosPi, - resodaughter::DaughterTPCNSigmaPosKa, - resodaughter::DaughterTPCNSigmaPosPr, - resodaughter::DaughterTPCNSigmaNegPi, - resodaughter::DaughterTPCNSigmaNegKa, - resodaughter::DaughterTPCNSigmaNegPr, - resodaughter::DaughterTOFNSigmaPosPi, - resodaughter::DaughterTOFNSigmaPosKa, - resodaughter::DaughterTOFNSigmaPosPr, - resodaughter::DaughterTOFNSigmaNegPi, - resodaughter::DaughterTOFNSigmaNegKa, - resodaughter::DaughterTOFNSigmaNegPr, + resodaughter::DaughterTPCNSigmaPosPi10, + resodaughter::DaughterTPCNSigmaPosKa10, + resodaughter::DaughterTPCNSigmaPosPr10, + resodaughter::DaughterTPCNSigmaNegPi10, + resodaughter::DaughterTPCNSigmaNegKa10, + resodaughter::DaughterTPCNSigmaNegPr10, + resodaughter::DaughterTOFNSigmaPosPi10, + resodaughter::DaughterTOFNSigmaPosKa10, + resodaughter::DaughterTOFNSigmaPosPr10, + resodaughter::DaughterTOFNSigmaNegPi10, + resodaughter::DaughterTOFNSigmaNegKa10, + resodaughter::DaughterTOFNSigmaNegPr10, resodaughter::V0CosPA, resodaughter::DaughDCA, v0data::DCAPosToPV, @@ -351,7 +397,22 @@ DECLARE_SOA_TABLE(ResoV0s, "AOD", "RESOV0", resodaughter::TransRadius, resodaughter::DecayVtxX, resodaughter::DecayVtxY, - resodaughter::DecayVtxZ); + resodaughter::DecayVtxZ, + // resodaughter::Pt, + resodaughter::Eta, + resodaughter::Phi, + resodaughter::DaughterTPCNSigmaPosPi, + resodaughter::DaughterTPCNSigmaPosKa, + resodaughter::DaughterTPCNSigmaPosPr, + resodaughter::DaughterTPCNSigmaNegPi, + resodaughter::DaughterTPCNSigmaNegKa, + resodaughter::DaughterTPCNSigmaNegPr, + resodaughter::DaughterTOFNSigmaPosPi, + resodaughter::DaughterTOFNSigmaPosKa, + resodaughter::DaughterTOFNSigmaPosPr, + resodaughter::DaughterTOFNSigmaNegPi, + resodaughter::DaughterTOFNSigmaNegKa, + resodaughter::DaughterTOFNSigmaNegPr); using ResoV0 = ResoV0s::iterator; DECLARE_SOA_TABLE(ResoCascades, "AOD", "RESOCASCADE", @@ -362,27 +423,25 @@ DECLARE_SOA_TABLE(ResoCascades, "AOD", "RESOCASCADE", resodaughter::Px, resodaughter::Py, resodaughter::Pz, - resodaughter::Eta, - resodaughter::Phi, resodaughter::CascadeIndices, - resodaughter::DaughterTPCNSigmaPosPi, - resodaughter::DaughterTPCNSigmaPosKa, - resodaughter::DaughterTPCNSigmaPosPr, - resodaughter::DaughterTPCNSigmaNegPi, - resodaughter::DaughterTPCNSigmaNegKa, - resodaughter::DaughterTPCNSigmaNegPr, - resodaughter::DaughterTPCNSigmaBachPi, - resodaughter::DaughterTPCNSigmaBachKa, - resodaughter::DaughterTPCNSigmaBachPr, - resodaughter::DaughterTOFNSigmaPosPi, - resodaughter::DaughterTOFNSigmaPosKa, - resodaughter::DaughterTOFNSigmaPosPr, - resodaughter::DaughterTOFNSigmaNegPi, - resodaughter::DaughterTOFNSigmaNegKa, - resodaughter::DaughterTOFNSigmaNegPr, - resodaughter::DaughterTOFNSigmaBachPi, - resodaughter::DaughterTOFNSigmaBachKa, - resodaughter::DaughterTOFNSigmaBachPr, + resodaughter::DaughterTPCNSigmaPosPi10, + resodaughter::DaughterTPCNSigmaPosKa10, + resodaughter::DaughterTPCNSigmaPosPr10, + resodaughter::DaughterTPCNSigmaNegPi10, + resodaughter::DaughterTPCNSigmaNegKa10, + resodaughter::DaughterTPCNSigmaNegPr10, + resodaughter::DaughterTPCNSigmaBachPi10, + resodaughter::DaughterTPCNSigmaBachKa10, + resodaughter::DaughterTPCNSigmaBachPr10, + resodaughter::DaughterTOFNSigmaPosPi10, + resodaughter::DaughterTOFNSigmaPosKa10, + resodaughter::DaughterTOFNSigmaPosPr10, + resodaughter::DaughterTOFNSigmaNegPi10, + resodaughter::DaughterTOFNSigmaNegKa10, + resodaughter::DaughterTOFNSigmaNegPr10, + resodaughter::DaughterTOFNSigmaBachPi10, + resodaughter::DaughterTOFNSigmaBachKa10, + resodaughter::DaughterTOFNSigmaBachPr10, resodaughter::V0CosPA, resodaughter::CascCosPA, resodaughter::DaughDCA, @@ -400,7 +459,28 @@ DECLARE_SOA_TABLE(ResoCascades, "AOD", "RESOCASCADE", resodaughter::CascTransRadius, resodaughter::DecayVtxX, resodaughter::DecayVtxY, - resodaughter::DecayVtxZ); + resodaughter::DecayVtxZ, + // resodaughter::Pt, + resodaughter::Eta, + resodaughter::Phi, + resodaughter::DaughterTPCNSigmaPosPi, + resodaughter::DaughterTPCNSigmaPosKa, + resodaughter::DaughterTPCNSigmaPosPr, + resodaughter::DaughterTPCNSigmaNegPi, + resodaughter::DaughterTPCNSigmaNegKa, + resodaughter::DaughterTPCNSigmaNegPr, + resodaughter::DaughterTPCNSigmaBachPi, + resodaughter::DaughterTPCNSigmaBachKa, + resodaughter::DaughterTPCNSigmaBachPr, + resodaughter::DaughterTOFNSigmaPosPi, + resodaughter::DaughterTOFNSigmaPosKa, + resodaughter::DaughterTOFNSigmaPosPr, + resodaughter::DaughterTOFNSigmaNegPi, + resodaughter::DaughterTOFNSigmaNegKa, + resodaughter::DaughterTOFNSigmaNegPr, + resodaughter::DaughterTOFNSigmaBachPi, + resodaughter::DaughterTOFNSigmaBachKa, + resodaughter::DaughterTOFNSigmaBachPr); using ResoCascade = ResoCascades::iterator; DECLARE_SOA_TABLE(ResoCascadeDFs, "AOD", "RESOCASCADEDF", @@ -411,27 +491,25 @@ DECLARE_SOA_TABLE(ResoCascadeDFs, "AOD", "RESOCASCADEDF", resodaughter::Px, resodaughter::Py, resodaughter::Pz, - resodaughter::Eta, - resodaughter::Phi, resodaughter::CascadeIndices, - resodaughter::DaughterTPCNSigmaPosPi, - resodaughter::DaughterTPCNSigmaPosKa, - resodaughter::DaughterTPCNSigmaPosPr, - resodaughter::DaughterTPCNSigmaNegPi, - resodaughter::DaughterTPCNSigmaNegKa, - resodaughter::DaughterTPCNSigmaNegPr, - resodaughter::DaughterTPCNSigmaBachPi, - resodaughter::DaughterTPCNSigmaBachKa, - resodaughter::DaughterTPCNSigmaBachPr, - resodaughter::DaughterTOFNSigmaPosPi, - resodaughter::DaughterTOFNSigmaPosKa, - resodaughter::DaughterTOFNSigmaPosPr, - resodaughter::DaughterTOFNSigmaNegPi, - resodaughter::DaughterTOFNSigmaNegKa, - resodaughter::DaughterTOFNSigmaNegPr, - resodaughter::DaughterTOFNSigmaBachPi, - resodaughter::DaughterTOFNSigmaBachKa, - resodaughter::DaughterTOFNSigmaBachPr, + resodaughter::DaughterTPCNSigmaPosPi10, + resodaughter::DaughterTPCNSigmaPosKa10, + resodaughter::DaughterTPCNSigmaPosPr10, + resodaughter::DaughterTPCNSigmaNegPi10, + resodaughter::DaughterTPCNSigmaNegKa10, + resodaughter::DaughterTPCNSigmaNegPr10, + resodaughter::DaughterTPCNSigmaBachPi10, + resodaughter::DaughterTPCNSigmaBachKa10, + resodaughter::DaughterTPCNSigmaBachPr10, + resodaughter::DaughterTOFNSigmaPosPi10, + resodaughter::DaughterTOFNSigmaPosKa10, + resodaughter::DaughterTOFNSigmaPosPr10, + resodaughter::DaughterTOFNSigmaNegPi10, + resodaughter::DaughterTOFNSigmaNegKa10, + resodaughter::DaughterTOFNSigmaNegPr10, + resodaughter::DaughterTOFNSigmaBachPi10, + resodaughter::DaughterTOFNSigmaBachKa10, + resodaughter::DaughterTOFNSigmaBachPr10, resodaughter::V0CosPA, resodaughter::CascCosPA, resodaughter::DaughDCA, @@ -449,7 +527,28 @@ DECLARE_SOA_TABLE(ResoCascadeDFs, "AOD", "RESOCASCADEDF", resodaughter::CascTransRadius, resodaughter::DecayVtxX, resodaughter::DecayVtxY, - resodaughter::DecayVtxZ); + resodaughter::DecayVtxZ, + // resodaughter::Pt, + resodaughter::Eta, + resodaughter::Phi, + resodaughter::DaughterTPCNSigmaPosPi, + resodaughter::DaughterTPCNSigmaPosKa, + resodaughter::DaughterTPCNSigmaPosPr, + resodaughter::DaughterTPCNSigmaNegPi, + resodaughter::DaughterTPCNSigmaNegKa, + resodaughter::DaughterTPCNSigmaNegPr, + resodaughter::DaughterTPCNSigmaBachPi, + resodaughter::DaughterTPCNSigmaBachKa, + resodaughter::DaughterTPCNSigmaBachPr, + resodaughter::DaughterTOFNSigmaPosPi, + resodaughter::DaughterTOFNSigmaPosKa, + resodaughter::DaughterTOFNSigmaPosPr, + resodaughter::DaughterTOFNSigmaNegPi, + resodaughter::DaughterTOFNSigmaNegKa, + resodaughter::DaughterTOFNSigmaNegPr, + resodaughter::DaughterTOFNSigmaBachPi, + resodaughter::DaughterTOFNSigmaBachKa, + resodaughter::DaughterTOFNSigmaBachPr); using ResoCascadeDF = ResoCascadeDFs::iterator; DECLARE_SOA_TABLE(ResoMCTracks, "AOD", "RESOMCTRACK", @@ -498,11 +597,12 @@ DECLARE_SOA_TABLE(ResoMCParents, "AOD", "RESOMCPARENT", resodaughter::Px, resodaughter::Py, resodaughter::Pz, - resodaughter::Eta, - resodaughter::Phi, mcparticle::Y, mcparticle::E, - mcparticle::StatusCode); + mcparticle::StatusCode, + // resodaughter::Pt, + resodaughter::Eta, + resodaughter::Phi); using ResoMCParent = ResoMCParents::iterator; using Reso2TracksExt = soa::Join; // without Extra diff --git a/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx b/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx index f6102d736dd..2c8662d1dc1 100644 --- a/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx +++ b/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx @@ -599,33 +599,32 @@ struct ResonanceInitializer { continue; if (!filterTrack(track)) continue; + uint8_t trackFlags = (track.passedITSRefit() << 0) | + (track.passedTPCRefit() << 1) | + (track.isGlobalTrackWoDCA() << 2) | + (track.isGlobalTrack() << 3) | + (track.isPrimaryTrack() << 4) | + (track.isPVContributor() << 5) | + (track.hasTOF() << 6) | + ((track.sign() > 0) << 7); // sign +1: 1, -1: 0 reso2trks(resoCollisions.lastIndex(), track.globalIndex(), track.pt(), track.px(), track.py(), track.pz(), - track.eta(), - track.phi(), - track.sign(), (uint8_t)track.tpcNClsCrossedRows(), (uint8_t)track.tpcNClsFound(), track.dcaXY(), track.dcaZ(), - track.hasTOF(), (int8_t)(track.tpcNSigmaPi() * 10), (int8_t)(track.tpcNSigmaKa() * 10), (int8_t)(track.tpcNSigmaPr() * 10), (int8_t)(track.tofNSigmaPi() * 10), (int8_t)(track.tofNSigmaKa() * 10), (int8_t)(track.tofNSigmaPr() * 10), - track.tpcSignal(), - track.passedITSRefit(), - track.passedTPCRefit(), - track.isGlobalTrackWoDCA(), - track.isGlobalTrack(), - track.isPrimaryTrack(), - track.isPVContributor()); + (int8_t)(track.tpcSignal() * 10), + trackFlags); if constexpr (isMC) { fillMCTrack(track); } @@ -650,21 +649,19 @@ struct ResonanceInitializer { v0.px(), v0.py(), v0.pz(), - v0.eta(), - v0.phi(), childIDs, - v0.template posTrack_as().tpcNSigmaPi(), - v0.template posTrack_as().tpcNSigmaKa(), - v0.template posTrack_as().tpcNSigmaPr(), - v0.template negTrack_as().tpcNSigmaPi(), - v0.template negTrack_as().tpcNSigmaKa(), - v0.template negTrack_as().tpcNSigmaPr(), - v0.template negTrack_as().tofNSigmaPi(), - v0.template negTrack_as().tofNSigmaKa(), - v0.template negTrack_as().tofNSigmaPr(), - v0.template posTrack_as().tofNSigmaPi(), - v0.template posTrack_as().tofNSigmaKa(), - v0.template posTrack_as().tofNSigmaPr(), + (int8_t)(v0.template posTrack_as().tpcNSigmaPi() * 10), + (int8_t)(v0.template posTrack_as().tpcNSigmaKa() * 10), + (int8_t)(v0.template posTrack_as().tpcNSigmaPr() * 10), + (int8_t)(v0.template negTrack_as().tpcNSigmaPi() * 10), + (int8_t)(v0.template negTrack_as().tpcNSigmaKa() * 10), + (int8_t)(v0.template negTrack_as().tpcNSigmaPr() * 10), + (int8_t)(v0.template negTrack_as().tofNSigmaPi() * 10), + (int8_t)(v0.template negTrack_as().tofNSigmaKa() * 10), + (int8_t)(v0.template negTrack_as().tofNSigmaPr() * 10), + (int8_t)(v0.template posTrack_as().tofNSigmaPi() * 10), + (int8_t)(v0.template posTrack_as().tofNSigmaKa() * 10), + (int8_t)(v0.template posTrack_as().tofNSigmaPr() * 10), v0.v0cosPA(), v0.dcaV0daughters(), v0.dcapostopv(), @@ -699,27 +696,25 @@ struct ResonanceInitializer { casc.px(), casc.py(), casc.pz(), - casc.eta(), - casc.phi(), childIDs, - casc.template posTrack_as().tpcNSigmaPi(), - casc.template posTrack_as().tpcNSigmaKa(), - casc.template posTrack_as().tpcNSigmaPr(), - casc.template negTrack_as().tpcNSigmaPi(), - casc.template negTrack_as().tpcNSigmaKa(), - casc.template negTrack_as().tpcNSigmaPr(), - casc.template bachelor_as().tpcNSigmaPi(), - casc.template bachelor_as().tpcNSigmaKa(), - casc.template bachelor_as().tpcNSigmaPr(), - casc.template posTrack_as().tofNSigmaPi(), - casc.template posTrack_as().tofNSigmaKa(), - casc.template posTrack_as().tofNSigmaPr(), - casc.template negTrack_as().tofNSigmaPi(), - casc.template negTrack_as().tofNSigmaKa(), - casc.template negTrack_as().tofNSigmaPr(), - casc.template bachelor_as().tofNSigmaPi(), - casc.template bachelor_as().tofNSigmaKa(), - casc.template bachelor_as().tofNSigmaPr(), + (int8_t)(casc.template posTrack_as().tpcNSigmaPi() * 10), + (int8_t)(casc.template posTrack_as().tpcNSigmaKa() * 10), + (int8_t)(casc.template posTrack_as().tpcNSigmaPr() * 10), + (int8_t)(casc.template negTrack_as().tpcNSigmaPi() * 10), + (int8_t)(casc.template negTrack_as().tpcNSigmaKa() * 10), + (int8_t)(casc.template negTrack_as().tpcNSigmaPr() * 10), + (int8_t)(casc.template bachelor_as().tpcNSigmaPi() * 10), + (int8_t)(casc.template bachelor_as().tpcNSigmaKa() * 10), + (int8_t)(casc.template bachelor_as().tpcNSigmaPr() * 10), + (int8_t)(casc.template posTrack_as().tofNSigmaPi() * 10), + (int8_t)(casc.template posTrack_as().tofNSigmaKa() * 10), + (int8_t)(casc.template posTrack_as().tofNSigmaPr() * 10), + (int8_t)(casc.template negTrack_as().tofNSigmaPi() * 10), + (int8_t)(casc.template negTrack_as().tofNSigmaKa() * 10), + (int8_t)(casc.template negTrack_as().tofNSigmaPr() * 10), + (int8_t)(casc.template bachelor_as().tofNSigmaPi() * 10), + (int8_t)(casc.template bachelor_as().tofNSigmaKa() * 10), + (int8_t)(casc.template bachelor_as().tofNSigmaPr() * 10), casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ()), casc.casccosPA(collision.posX(), collision.posY(), collision.posZ()), casc.dcaV0daughters(), @@ -1006,8 +1001,6 @@ struct ResonanceInitializer { mcPart.px(), mcPart.py(), mcPart.pz(), - mcPart.eta(), - mcPart.phi(), mcPart.y(), mcPart.e(), mcPart.statusCode()); diff --git a/PWGLF/TableProducer/Resonances/resonanceMergeDF.cxx b/PWGLF/TableProducer/Resonances/resonanceMergeDF.cxx index e193dff7f31..9bc266020a6 100644 --- a/PWGLF/TableProducer/Resonances/resonanceMergeDF.cxx +++ b/PWGLF/TableProducer/Resonances/resonanceMergeDF.cxx @@ -98,12 +98,10 @@ struct ResonanceMergeDF { std::vector> vecOfTuples; std::vector>> + uint8_t>>> vecOfVecOfTuples; void processTrackDataDF(aod::ResoCollisions::iterator const& collision, aod::ResoTracks const& tracks) { @@ -111,12 +109,10 @@ struct ResonanceMergeDF { int nCollisions = nDF; vecOfTuples.push_back(std::make_tuple(collision.posX(), collision.posY(), collision.posZ(), collision.cent(), collision.spherocity(), collision.evtPl(), collision.trackOccupancyInTimeRange())); std::vector> + uint8_t>> innerVector; for (const auto& track : tracks) { if (cpidCut) { @@ -147,27 +143,19 @@ struct ResonanceMergeDF { track.px(), track.py(), track.pz(), - track.eta(), - track.phi(), track.sign(), (uint8_t)track.tpcNClsCrossedRows(), (uint8_t)track.tpcNClsFound(), track.dcaXY(), track.dcaZ(), - track.hasTOF(), (int8_t)(track.tpcNSigmaPi() * 10), (int8_t)(track.tpcNSigmaKa() * 10), (int8_t)(track.tpcNSigmaPr() * 10), (int8_t)(track.tofNSigmaPi() * 10), (int8_t)(track.tofNSigmaKa() * 10), (int8_t)(track.tofNSigmaPr() * 10), - track.tpcSignal(), - track.passedITSRefit(), - track.passedTPCRefit(), - track.isGlobalTrackWoDCA(), - track.isGlobalTrack(), - track.isPrimaryTrack(), - track.isPVContributor())); + (int8_t)(track.tpcSignal() * 10), + track.trackFlags())); } vecOfVecOfTuples.push_back(innerVector); @@ -203,16 +191,7 @@ struct ResonanceMergeDF { std::get<12>(tuple), std::get<13>(tuple), std::get<14>(tuple), - std::get<15>(tuple), - std::get<16>(tuple), - std::get<17>(tuple), - std::get<18>(tuple), - std::get<19>(tuple), - std::get<20>(tuple), - std::get<21>(tuple), - std::get<22>(tuple), - std::get<23>(tuple), - std::get<24>(tuple)); + std::get<15>(tuple)); } } @@ -261,27 +240,18 @@ struct ResonanceMergeDF { track.px(), track.py(), track.pz(), - track.eta(), - track.phi(), - track.sign(), (uint8_t)track.tpcNClsCrossedRows(), (uint8_t)track.tpcNClsFound(), track.dcaXY(), track.dcaZ(), - track.hasTOF(), (int8_t)(track.tpcNSigmaPi() * 10), (int8_t)(track.tpcNSigmaKa() * 10), (int8_t)(track.tpcNSigmaPr() * 10), (int8_t)(track.tofNSigmaPi() * 10), (int8_t)(track.tofNSigmaKa() * 10), (int8_t)(track.tofNSigmaPr() * 10), - track.tpcSignal(), - track.passedITSRefit(), - track.passedTPCRefit(), - track.isGlobalTrackWoDCA(), - track.isGlobalTrack(), - track.isPrimaryTrack(), - track.isPVContributor()); + (int8_t)(track.tpcSignal() * 10), + track.trackFlags()); } } PROCESS_SWITCH(ResonanceMergeDF, processLambdaStarCandidate, "Process for lambda star candidate", false); @@ -333,27 +303,18 @@ struct ResonanceMergeDF { track.px(), track.py(), track.pz(), - track.eta(), - track.phi(), - track.sign(), (uint8_t)track.tpcNClsCrossedRows(), (uint8_t)track.tpcNClsFound(), track.dcaXY(), track.dcaZ(), - track.hasTOF(), (int8_t)(track.tpcNSigmaPi() * 10), (int8_t)(track.tpcNSigmaKa() * 10), (int8_t)(track.tpcNSigmaPr() * 10), (int8_t)(track.tofNSigmaPi() * 10), (int8_t)(track.tofNSigmaKa() * 10), (int8_t)(track.tofNSigmaPr() * 10), - track.tpcSignal(), - track.passedITSRefit(), - track.passedTPCRefit(), - track.isGlobalTrackWoDCA(), - track.isGlobalTrack(), - track.isPrimaryTrack(), - track.isPVContributor()); + (int8_t)(track.tpcSignal() * 10), + track.trackFlags()); } // Cascade candidate for (const auto& track : resocasctracks) { @@ -364,27 +325,25 @@ struct ResonanceMergeDF { track.px(), track.py(), track.pz(), - track.eta(), - track.phi(), const_cast(track.cascadeIndices()), - track.daughterTPCNSigmaPosPi(), - track.daughterTPCNSigmaPosKa(), - track.daughterTPCNSigmaPosPr(), - track.daughterTPCNSigmaNegPi(), - track.daughterTPCNSigmaNegKa(), - track.daughterTPCNSigmaNegPr(), - track.daughterTPCNSigmaBachPi(), - track.daughterTPCNSigmaBachKa(), - track.daughterTPCNSigmaBachPr(), - track.daughterTOFNSigmaPosPi(), - track.daughterTOFNSigmaPosKa(), - track.daughterTOFNSigmaPosPr(), - track.daughterTOFNSigmaNegPi(), - track.daughterTOFNSigmaNegKa(), - track.daughterTOFNSigmaNegPr(), - track.daughterTOFNSigmaBachPi(), - track.daughterTOFNSigmaBachKa(), - track.daughterTOFNSigmaBachPr(), + (int8_t)(track.daughterTPCNSigmaPosPi() * 10), + (int8_t)(track.daughterTPCNSigmaPosKa() * 10), + (int8_t)(track.daughterTPCNSigmaPosPr() * 10), + (int8_t)(track.daughterTPCNSigmaNegPi() * 10), + (int8_t)(track.daughterTPCNSigmaNegKa() * 10), + (int8_t)(track.daughterTPCNSigmaNegPr() * 10), + (int8_t)(track.daughterTPCNSigmaBachPi() * 10), + (int8_t)(track.daughterTPCNSigmaBachKa() * 10), + (int8_t)(track.daughterTPCNSigmaBachPr() * 10), + (int8_t)(track.daughterTOFNSigmaPosPi() * 10), + (int8_t)(track.daughterTOFNSigmaPosKa() * 10), + (int8_t)(track.daughterTOFNSigmaPosPr() * 10), + (int8_t)(track.daughterTOFNSigmaNegPi() * 10), + (int8_t)(track.daughterTOFNSigmaNegKa() * 10), + (int8_t)(track.daughterTOFNSigmaNegPr() * 10), + (int8_t)(track.daughterTOFNSigmaBachPi() * 10), + (int8_t)(track.daughterTOFNSigmaBachKa() * 10), + (int8_t)(track.daughterTOFNSigmaBachPr() * 10), track.v0CosPA(), track.cascCosPA(), track.daughDCA(), diff --git a/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx b/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx index fbfcb0c0a40..89ad777a59a 100644 --- a/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx +++ b/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx @@ -741,33 +741,32 @@ struct ResonanceDaughterInitializer { qaRegistry.fill(HIST("QA/hTrackEta"), track.eta()); qaRegistry.fill(HIST("QA/hTrackPhi"), track.phi()); } + uint8_t trackFlags = (track.passedITSRefit() << 0) | + (track.passedTPCRefit() << 1) | + (track.isGlobalTrackWoDCA() << 2) | + (track.isGlobalTrack() << 3) | + (track.isPrimaryTrack() << 4) | + (track.isPVContributor() << 5) | + (track.hasTOF() << 6) | + ((track.sign() > 0) << 7); // sign +1: 1, -1: 0 reso2trks(collision.globalIndex(), track.globalIndex(), track.pt(), track.px(), track.py(), track.pz(), - track.eta(), - track.phi(), - track.sign(), (uint8_t)track.tpcNClsCrossedRows(), (uint8_t)track.tpcNClsFound(), track.dcaXY(), track.dcaZ(), - track.hasTOF(), (int8_t)(track.tpcNSigmaPi() * 10), (int8_t)(track.tpcNSigmaKa() * 10), (int8_t)(track.tpcNSigmaPr() * 10), (int8_t)(track.tofNSigmaPi() * 10), (int8_t)(track.tofNSigmaKa() * 10), (int8_t)(track.tofNSigmaPr() * 10), - track.tpcSignal(), - track.passedITSRefit(), - track.passedTPCRefit(), - track.isGlobalTrackWoDCA(), - track.isGlobalTrack(), - track.isPrimaryTrack(), - track.isPVContributor()); + (int8_t)(track.tpcSignal() * 10), + trackFlags); if constexpr (isMC) { fillMCTrack(track); } @@ -883,21 +882,19 @@ struct ResonanceDaughterInitializer { v0.px(), v0.py(), v0.pz(), - v0.eta(), - v0.phi(), childIDs, - v0.template posTrack_as().tpcNSigmaPi(), - v0.template posTrack_as().tpcNSigmaKa(), - v0.template posTrack_as().tpcNSigmaPr(), - v0.template negTrack_as().tpcNSigmaPi(), - v0.template negTrack_as().tpcNSigmaKa(), - v0.template negTrack_as().tpcNSigmaPr(), - v0.template negTrack_as().tofNSigmaPi(), - v0.template negTrack_as().tofNSigmaKa(), - v0.template negTrack_as().tofNSigmaPr(), - v0.template posTrack_as().tofNSigmaPi(), - v0.template posTrack_as().tofNSigmaKa(), - v0.template posTrack_as().tofNSigmaPr(), + (int8_t)(v0.template posTrack_as().tpcNSigmaPi() * 10), + (int8_t)(v0.template posTrack_as().tpcNSigmaKa() * 10), + (int8_t)(v0.template posTrack_as().tpcNSigmaPr() * 10), + (int8_t)(v0.template negTrack_as().tpcNSigmaPi() * 10), + (int8_t)(v0.template negTrack_as().tpcNSigmaKa() * 10), + (int8_t)(v0.template negTrack_as().tpcNSigmaPr() * 10), + (int8_t)(v0.template negTrack_as().tofNSigmaPi() * 10), + (int8_t)(v0.template negTrack_as().tofNSigmaKa() * 10), + (int8_t)(v0.template negTrack_as().tofNSigmaPr() * 10), + (int8_t)(v0.template posTrack_as().tofNSigmaPi() * 10), + (int8_t)(v0.template posTrack_as().tofNSigmaKa() * 10), + (int8_t)(v0.template posTrack_as().tofNSigmaPr() * 10), v0.v0cosPA(), v0.dcaV0daughters(), v0.dcapostopv(), @@ -1038,27 +1035,25 @@ struct ResonanceDaughterInitializer { casc.px(), casc.py(), casc.pz(), - casc.eta(), - casc.phi(), childIDs, - casc.template posTrack_as().tpcNSigmaPi(), - casc.template posTrack_as().tpcNSigmaKa(), - casc.template posTrack_as().tpcNSigmaPr(), - casc.template negTrack_as().tpcNSigmaPi(), - casc.template negTrack_as().tpcNSigmaKa(), - casc.template negTrack_as().tpcNSigmaPr(), - casc.template bachelor_as().tpcNSigmaPi(), - casc.template bachelor_as().tpcNSigmaKa(), - casc.template bachelor_as().tpcNSigmaPr(), - casc.template posTrack_as().tofNSigmaPi(), - casc.template posTrack_as().tofNSigmaKa(), - casc.template posTrack_as().tofNSigmaPr(), - casc.template negTrack_as().tofNSigmaPi(), - casc.template negTrack_as().tofNSigmaKa(), - casc.template negTrack_as().tofNSigmaPr(), - casc.template bachelor_as().tofNSigmaPi(), - casc.template bachelor_as().tofNSigmaKa(), - casc.template bachelor_as().tofNSigmaPr(), + (int8_t)(casc.template posTrack_as().tpcNSigmaPi() * 10), + (int8_t)(casc.template posTrack_as().tpcNSigmaKa() * 10), + (int8_t)(casc.template posTrack_as().tpcNSigmaPr() * 10), + (int8_t)(casc.template negTrack_as().tpcNSigmaPi() * 10), + (int8_t)(casc.template negTrack_as().tpcNSigmaKa() * 10), + (int8_t)(casc.template negTrack_as().tpcNSigmaPr() * 10), + (int8_t)(casc.template bachelor_as().tpcNSigmaPi() * 10), + (int8_t)(casc.template bachelor_as().tpcNSigmaKa() * 10), + (int8_t)(casc.template bachelor_as().tpcNSigmaPr() * 10), + (int8_t)(casc.template posTrack_as().tofNSigmaPi() * 10), + (int8_t)(casc.template posTrack_as().tofNSigmaKa() * 10), + (int8_t)(casc.template posTrack_as().tofNSigmaPr() * 10), + (int8_t)(casc.template negTrack_as().tofNSigmaPi() * 10), + (int8_t)(casc.template negTrack_as().tofNSigmaKa() * 10), + (int8_t)(casc.template negTrack_as().tofNSigmaPr() * 10), + (int8_t)(casc.template bachelor_as().tofNSigmaPi() * 10), + (int8_t)(casc.template bachelor_as().tofNSigmaKa() * 10), + (int8_t)(casc.template bachelor_as().tofNSigmaPr() * 10), casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ()), casc.casccosPA(collision.posX(), collision.posY(), collision.posZ()), casc.dcaV0daughters(), diff --git a/PWGLF/Tasks/Resonances/kstar892analysis.cxx b/PWGLF/Tasks/Resonances/kstar892analysis.cxx index ec843051f40..1fa20f8cfa4 100644 --- a/PWGLF/Tasks/Resonances/kstar892analysis.cxx +++ b/PWGLF/Tasks/Resonances/kstar892analysis.cxx @@ -244,27 +244,74 @@ struct kstar892analysis { // Filters Filter acceptanceFilter = nabs(aod::resodaughter::pt) >= cMinPtcut; Filter DCAcutFilter = (nabs(aod::track::dcaXY) <= cMaxDCArToPVcut) && (nabs(aod::track::dcaZ) <= cMaxDCAzToPVcut); - Filter primarytrackFilter = aod::resodaughter::isPVContributor && aod::resodaughter::isPrimaryTrack && aod::resodaughter::isGlobalTrackWoDCA; + // Filter primarytrackFilter = aod::resodaughter::isPVContributor && aod::resodaughter::isPrimaryTrack && aod::resodaughter::isGlobalTrackWoDCA; + Filter primarytrackFilter = ((aod::resodaughter::trackFlags & ((1 << 5) | (1 << 4) | (1 << 2))) == ((1 << 5) | (1 << 4) | (1 << 2))); // partitions for data - Partition> resoKaWithTof = (nabs(aod::pidtof::tofNSigmaKa) <= cMaxTOFnSigmaKaon) && (aod::resodaughter::hasTOF == true); - Partition> resoPiWithTof = (nabs(aod::pidtof::tofNSigmaPi) <= cMaxTOFnSigmaPion) && (aod::resodaughter::hasTOF == true); - Partition> resoKa = (nabs(aod::pidtpc::tpcNSigmaKa) <= cMaxTPCnSigmaKaon); - Partition> resoPi = (nabs(aod::pidtpc::tpcNSigmaPi) <= cMaxTPCnSigmaPion); - Partition> resoKaTPClowPt = (nabs(aod::pidtpc::tpcNSigmaKa) <= cMaxTPCnSigmaKaon) && (nabs(aod::resodaughter::pt) < cMaxPtTPC); - Partition> resoPiTPClowPt = (nabs(aod::pidtpc::tpcNSigmaPi) <= cMaxTPCnSigmaPion) && (nabs(aod::resodaughter::pt) < cMaxPtTPC); - Partition> resoKaTOFhighPt = (nabs(aod::pidtof::tofNSigmaKa) <= cMaxTOFnSigmaKaon) && (aod::resodaughter::hasTOF == true) && (nabs(aod::resodaughter::pt) >= cMinPtTOF); - Partition> resoPiTOFhighPt = (nabs(aod::pidtof::tofNSigmaPi) <= cMaxTOFnSigmaPion) && (aod::resodaughter::hasTOF == true) && (nabs(aod::resodaughter::pt) >= cMinPtTOF); + Partition resoKaWithTof = + (nabs(aod::resodaughter::tofNSigmaKa10) <= 10 * cMaxTOFnSigmaKaon) && + ((aod::resodaughter::trackFlags & (1 << 6)) != 0); + + Partition resoPiWithTof = + (nabs(aod::resodaughter::tofNSigmaPi10) <= 10 * cMaxTOFnSigmaPion) && + ((aod::resodaughter::trackFlags & (1 << 6)) != 0); + + Partition resoKa = + (nabs(aod::resodaughter::tpcNSigmaKa10) <= 10 * cMaxTPCnSigmaKaon); + + Partition resoPi = + (nabs(aod::resodaughter::tpcNSigmaPi10) <= 10 * cMaxTPCnSigmaPion); + + Partition resoKaTPClowPt = + (nabs(aod::resodaughter::tpcNSigmaKa10) <= 10 * cMaxTPCnSigmaKaon) && + (nabs(aod::resodaughter::pt) < cMaxPtTPC); + + Partition resoPiTPClowPt = + (nabs(aod::resodaughter::tpcNSigmaPi10) <= 10 * cMaxTPCnSigmaPion) && + (nabs(aod::resodaughter::pt) < cMaxPtTPC); + + Partition resoKaTOFhighPt = + (nabs(aod::resodaughter::tofNSigmaKa10) <= 10 * cMaxTOFnSigmaKaon) && + ((aod::resodaughter::trackFlags & (1 << 6)) != 0) && + (nabs(aod::resodaughter::pt) >= cMinPtTOF); + + Partition resoPiTOFhighPt = + (nabs(aod::resodaughter::tofNSigmaPi10) <= 10 * cMaxTOFnSigmaPion) && + ((aod::resodaughter::trackFlags & (1 << 6)) != 0) && + (nabs(aod::resodaughter::pt) >= cMinPtTOF); // Partitions for mc - Partition>> resoMCrecKaWithTof = (nabs(aod::pidtof::tofNSigmaKa) <= cMaxTOFnSigmaKaon) && (aod::resodaughter::hasTOF == true); - Partition>> resoMCrecPiWithTof = (nabs(aod::pidtof::tofNSigmaPi) <= cMaxTOFnSigmaPion) && (aod::resodaughter::hasTOF == true); - Partition>> resoMCrecKa = (nabs(aod::pidtpc::tpcNSigmaKa) <= cMaxTPCnSigmaKaon); - Partition>> resoMCrecPi = (nabs(aod::pidtpc::tpcNSigmaPi) <= cMaxTPCnSigmaPion); - Partition>> resoMCrecKaTPClowPt = (nabs(aod::pidtpc::tpcNSigmaKa) <= cMaxTPCnSigmaKaon) && (nabs(aod::resodaughter::pt) < cMaxPtTPC); - Partition>> resoMCrecPiTPClowPt = (nabs(aod::pidtpc::tpcNSigmaPi) <= cMaxTPCnSigmaPion) && (nabs(aod::resodaughter::pt) < cMaxPtTPC); - Partition>> resoMCrecKaTOFhighPt = (nabs(aod::pidtof::tofNSigmaKa) <= cMaxTOFnSigmaKaon) && (aod::resodaughter::hasTOF == true) && (nabs(aod::resodaughter::pt) >= cMinPtTOF); - Partition>> resoMCrecPiTOFhighPt = (nabs(aod::pidtof::tofNSigmaPi) <= cMaxTOFnSigmaPion) && (aod::resodaughter::hasTOF == true) && (nabs(aod::resodaughter::pt) >= cMinPtTOF); + Partition> resoMCrecKaWithTof = + (nabs(aod::resodaughter::tofNSigmaKa10) <= 10 * cMaxTOFnSigmaKaon) && + ((aod::resodaughter::trackFlags & (1 << 6)) != 0); + + Partition> resoMCrecPiWithTof = + (nabs(aod::resodaughter::tofNSigmaPi10) <= 10 * cMaxTOFnSigmaPion) && + ((aod::resodaughter::trackFlags & (1 << 6)) != 0); + + Partition> resoMCrecKa = + (nabs(aod::resodaughter::tpcNSigmaKa10) <= 10 * cMaxTPCnSigmaKaon); + + Partition> resoMCrecPi = + (nabs(aod::resodaughter::tpcNSigmaPi10) <= 10 * cMaxTPCnSigmaPion); + + Partition> resoMCrecKaTPClowPt = + (nabs(aod::resodaughter::tpcNSigmaKa10) <= 10 * cMaxTPCnSigmaKaon) && + (nabs(aod::resodaughter::pt) < cMaxPtTPC); + + Partition> resoMCrecPiTPClowPt = + (nabs(aod::resodaughter::tpcNSigmaPi10) <= 10 * cMaxTPCnSigmaPion) && + (nabs(aod::resodaughter::pt) < cMaxPtTPC); + + Partition> resoMCrecKaTOFhighPt = + (nabs(aod::resodaughter::tofNSigmaKa10) <= 10 * cMaxTOFnSigmaKaon) && + ((aod::resodaughter::trackFlags & (1 << 6)) != 0) && + (nabs(aod::resodaughter::pt) >= cMinPtTOF); + + Partition> resoMCrecPiTOFhighPt = + (nabs(aod::resodaughter::tofNSigmaPi10) <= 10 * cMaxTOFnSigmaPion) && + ((aod::resodaughter::trackFlags & (1 << 6)) != 0) && + (nabs(aod::resodaughter::pt) >= cMinPtTOF); using ResoMCCols = soa::Join; @@ -276,8 +323,26 @@ struct kstar892analysis { template bool trackCut(const TrackType track) { + // pT + if (track.pt() < cMinPtcut) + return false; + // DCA + if (track.dcaXY() > cMaxDCArToPVcut) + return false; + if (track.dcaZ() > cMaxDCAzToPVcut) + return false; + // Primary filters + if (!track.isPrimaryTrack()) + return false; + if (!track.isGlobalTrackWoDCA()) + return false; + // PV contributor + if (!track.isPVContributor()) + return false; + // TPC if (track.tpcNClsFound() < cfgTPCcluster) return false; + // ITS if (cfgUseITSRefit && !track.passedITSRefit()) return false; From 22de3c2021240047fa442fc37cb3ab85562d0e2d Mon Sep 17 00:00:00 2001 From: Marvin Hemmer <53471402+mhemmer-cern@users.noreply.github.com> Date: Wed, 5 Mar 2025 21:32:54 +0100 Subject: [PATCH 0558/1650] [PWGJE,EMCAL-670] EMCal correction task: Adjust NonLin default value (#10303) --- PWGJE/TableProducer/emcalCorrectionTask.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGJE/TableProducer/emcalCorrectionTask.cxx b/PWGJE/TableProducer/emcalCorrectionTask.cxx index 138ac06fe3e..2b121530d5d 100644 --- a/PWGJE/TableProducer/emcalCorrectionTask.cxx +++ b/PWGJE/TableProducer/emcalCorrectionTask.cxx @@ -82,7 +82,7 @@ struct EmcalCorrectionTask { Configurable selectedCellType{"selectedCellType", 1, "EMCAL Cell type"}; Configurable clusterDefinitions{"clusterDefinitions", "kV3Default", "cluster definition to be selected, e.g. V3Default. Multiple definitions can be specified separated by comma"}; Configurable maxMatchingDistance{"maxMatchingDistance", 0.4f, "Max matching distance track-cluster"}; - Configurable nonlinearityFunction{"nonlinearityFunction", "DATA_TestbeamFinal", "Nonlinearity correction at cluster level"}; + Configurable nonlinearityFunction{"nonlinearityFunction", "DATA_TestbeamFinal_NoScale", "Nonlinearity correction at cluster level. Default for data should be DATA_TestbeamFinal_NoScale. Default for MC should be MC_TestbeamFinal."}; Configurable disableNonLin{"disableNonLin", false, "Disable NonLin correction if set to true"}; Configurable hasShaperCorrection{"hasShaperCorrection", true, "Apply correction for shaper saturation"}; Configurable applyCellAbsScale{"applyCellAbsScale", 0, "Enable absolute cell energy scale to correct for energy loss in material in front of EMCal"}; @@ -94,7 +94,7 @@ struct EmcalCorrectionTask { Configurable exoticCellInCrossMinAmplitude{"exoticCellInCrossMinAmplitude", 0.1, "Minimum energy of cells in cross, if lower not considered in cross"}; Configurable useWeightExotic{"useWeightExotic", false, "States if weights should be used for exotic cell cut"}; Configurable isMC{"isMC", false, "States if run over MC"}; - Configurable applyCellTimeCorrection{"applyCellTimeCorrection", true, "apply a correction to the cell time for data and MC: Shift both average cell times to 0 and smear MC time distribution to fit data better"}; + Configurable applyCellTimeCorrection{"applyCellTimeCorrection", true, "apply a correction to the cell time for data and MC: Shift both average cell times to 0 and smear MC time distribution to fit data better. For MC requires isMC to be true"}; Configurable trackMinPt{"trackMinPt", 0.3, "Minimum pT for tracks to perform track matching, to reduce computing time. Tracks below a certain pT will be loopers anyway."}; // Require EMCAL cells (CALO type 1) From 66729e6d85c0a4b54cc8d75be0b4690879c88ddb Mon Sep 17 00:00:00 2001 From: Zuzanna Chochulska <87480906+zchochul@users.noreply.github.com> Date: Wed, 5 Mar 2025 21:36:56 +0100 Subject: [PATCH 0559/1650] [PWGCF] FemtoUniverse -- Move minv cut to the task (#10342) Co-authored-by: Zuzanna <01150674@pw.edu.pl> --- .../TableProducer/femtoUniverseProducerTask.cxx | 6 ------ .../Tasks/femtoUniversePairTaskTrackPhi.cxx | 12 ++++++++---- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx index 2f1a915cec4..7ec37221f64 100644 --- a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx +++ b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx @@ -287,8 +287,6 @@ struct FemtoUniverseProducerTask { FemtoUniversePhiSelection phiCuts; struct : o2::framework::ConfigurableGroup { /// Phi meson - Configurable confInvMassLowLimitPhi{"confInvMassLowLimitPhi", 1.011, "Lower limit of the Phi invariant mass"}; // change that to do invariant mass cut - Configurable confInvMassUpLimitPhi{"confInvMassUpLimitPhi", 1.027, "Upper limit of the Phi invariant mass"}; Configurable confPtLowLimitPhi{"confPtLowLimitPhi", 0.8, "Lower limit of the Phi pT."}; Configurable confPtHighLimitPhi{"confPtHighLimitPhi", 4.0, "Higher limit of the Phi pT."}; // Phi meson daughters @@ -1633,10 +1631,6 @@ struct FemtoUniverseProducerTask { float phiPhi = RecoDecay::constrainAngle(sumVec.Phi(), 0); float phiM = sumVec.M(); - if (((phiM < ConfPhiSelection.confInvMassLowLimitPhi.value) || (phiM > ConfPhiSelection.confInvMassUpLimitPhi.value))) { - continue; - } - phiCuts.fillQA(col, p1, p1, p2, 321, -321); ///\todo fill QA also for daughters int postrackID = p1.globalIndex(); diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx index c9b85e0cd92..f29ae2a882b 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx @@ -118,15 +118,21 @@ struct FemtoUniversePairTaskTrackPhi { /// Particle 2 --- PHI MESON Configurable ConfPhiPtLow{"ConfPhiPtLow", 0.8, "Lower limit of the Phi pT."}; Configurable ConfPhiPtHigh{"ConfPhiPtHigh", 4.0, "Higher limit of the Phi pT."}; + Configurable confInvMassLowLimitPhi{"confInvMassLowLimitPhi", 1.011, "Lower limit of the Phi invariant mass"}; // change that to do invariant mass cut + Configurable confInvMassUpLimitPhi{"confInvMassUpLimitPhi", 1.027, "Upper limit of the Phi invariant mass"}; /// Partitions for the Phi meson (particle 2) Partition partsPhi = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kPhi)) && (aod::femtouniverseparticle::pt > ConfPhiPtLow) && - (aod::femtouniverseparticle::pt < ConfPhiPtHigh); + (aod::femtouniverseparticle::pt < ConfPhiPtHigh) && + (aod::femtouniverseparticle::tempFitVar > confInvMassLowLimitPhi) && + (aod::femtouniverseparticle::tempFitVar < confInvMassUpLimitPhi); Partition partsPhiMCReco = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kPhi)) && (aod::femtouniverseparticle::pt > ConfPhiPtLow) && - (aod::femtouniverseparticle::pt < ConfPhiPtHigh); + (aod::femtouniverseparticle::pt < ConfPhiPtHigh) && + (aod::femtouniverseparticle::tempFitVar > confInvMassLowLimitPhi) && + (aod::femtouniverseparticle::tempFitVar < confInvMassUpLimitPhi); /// Partitions for Phi daughters kPhiChild Partition partsPhiDaugh = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kPhiChild)); @@ -374,11 +380,9 @@ struct FemtoUniversePairTaskTrackPhi { hTrackDCA.init(®istryDCA, ConfBinsTempFitVarpT, ConfBinsTempFitVarDCA, true, ConfTrackPDGCode, true); registryMCpT.add("MCReco/C_phi_pT", "; #it{p_T} (GeV/#it{c}); Counts", kTH1F, {{100, 0, 10}}); - registryMCpT.add("MCReco/Correction_phi", "; #it{p_T} (GeV/#it{c}); Counts", kTH1F, {{100, 0, 10}}); registryMCpT.add("MCReco/NC_phi_pT", "; #it{p_T} (GeV/#it{c}); Counts", kTH1F, {{100, 0, 10}}); registryMCpT.add("MCReco/C_p_pT", "; #it{p_T} (GeV/#it{c}); Counts", kTH1F, {{100, 0, 10}}); - registryMCpT.add("MCReco/Correction_p", "; #it{p_T} (GeV/#it{c}); Counts", kTH1F, {{100, 0, 10}}); registryMCpT.add("MCReco/NC_p_pT", "; #it{p_T} (GeV/#it{c}); Counts", kTH1F, {{100, 0, 10}}); } efficiencyCalculator.init(); From becf7038a77a6debb01de0a208a2586bbc54178c Mon Sep 17 00:00:00 2001 From: prottayCMT <61418725+prottayCMT@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:15:17 +0100 Subject: [PATCH 0560/1650] [PWGLF] updated derived data process function (#10343) Co-authored-by: Prottay Das --- PWGLF/Tasks/Strangeness/lambdapolsp.cxx | 34 ++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdapolsp.cxx b/PWGLF/Tasks/Strangeness/lambdapolsp.cxx index 2a3e6f06975..995f178b097 100644 --- a/PWGLF/Tasks/Strangeness/lambdapolsp.cxx +++ b/PWGLF/Tasks/Strangeness/lambdapolsp.cxx @@ -466,6 +466,13 @@ struct lambdapolsp { return false; } + if (pid == 0 && (TMath::Abs(v0.dcapostopv()) < cMinV0DCAPr || TMath::Abs(v0.dcanegtopv()) < cMinV0DCAPi)) { + return false; + } + if (pid == 1 && (TMath::Abs(v0.dcapostopv()) < cMinV0DCAPi || TMath::Abs(v0.dcanegtopv()) < cMinV0DCAPr)) { + return false; + } + // if we made it this far, it's good return true; } @@ -919,14 +926,30 @@ struct lambdapolsp { //___________________________________________________________________________________________________ // retrieve further info provided by StraZDCSP - /*auto qxZDCA = collision.qxZDCA(); + auto qxZDCA = collision.qxZDCA(); auto qxZDCC = collision.qxZDCC(); auto qyZDCA = collision.qyZDCA(); - auto qyZDCC = collision.qyZDCC();*/ + auto qyZDCC = collision.qyZDCC(); auto psiZDCC = collision.psiZDCC(); auto psiZDCA = collision.psiZDCA(); - // auto psiZDC=TMath::ATan2((qyZDCC-qyZDCA),(qxZDCC-qxZDCA)); //full event plane - auto psiZDC = psiZDCC - psiZDCA; + double modqxZDCA; + double modqyZDCA; + double modqxZDCC; + double modqyZDCC; + + if (cqvas) { + modqxZDCA = TMath::Sqrt((qxZDCA * qxZDCA) + (qyZDCA * qyZDCA)) * TMath::Cos(psiZDCA); + modqyZDCA = TMath::Sqrt((qxZDCA * qxZDCA) + (qyZDCA * qyZDCA)) * TMath::Sin(psiZDCA); + modqxZDCC = TMath::Sqrt((qxZDCC * qxZDCC) + (qyZDCC * qyZDCC)) * TMath::Cos(psiZDCC); + modqyZDCC = TMath::Sqrt((qxZDCC * qxZDCC) + (qyZDCC * qyZDCC)) * TMath::Sin(psiZDCC); + } else { + modqxZDCA = qxZDCA; + modqyZDCA = qyZDCA; + modqxZDCC = qxZDCC; + modqyZDCC = qyZDCC; + } + + auto psiZDC = TMath::ATan2((modqyZDCC - modqyZDCA), (modqxZDCC - modqxZDCA)); // full event plane // fill histograms histos.fill(HIST("hCentrality"), centrality); @@ -970,6 +993,9 @@ struct lambdapolsp { continue; } + if (TMath::Abs(v0.eta()) > 0.8) + continue; + int taga = LambdaTag; int tagb = aLambdaTag; From 43dc43b8fd7fab68512fd7ba8bf333fb6a570387 Mon Sep 17 00:00:00 2001 From: Luca Barioglio Date: Wed, 5 Mar 2025 22:53:42 +0100 Subject: [PATCH 0561/1650] Change amplitude definition (#10344) --- PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx index edcce86ae1a..c921b72bba6 100644 --- a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx +++ b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx @@ -800,11 +800,11 @@ struct nucleiSpectra { computeEventPlane(collision.qvecBTotIm(), collision.qvecBTotRe()), computeEventPlane(collision.qvecBNegIm(), collision.qvecBNegRe()), computeEventPlane(collision.qvecBPosIm(), collision.qvecBPosRe()), - collision.sumAmplFT0A(), - collision.sumAmplFT0C(), - static_cast(collision.nTrkBTot()), - static_cast(collision.nTrkBNeg()), - static_cast(collision.nTrkBPos())}); + std::hypot(collision.qvecFT0AIm(), collision.qvecFT0ARe()), + std::hypot(collision.qvecFT0CIm(), collision.qvecFT0CRe()), + std::hypot(collision.qvecBTotIm(), collision.qvecBTotRe()), + std::hypot(collision.qvecBNegIm(), collision.qvecBNegRe()), + std::hypot(collision.qvecBPosIm(), collision.qvecBPosRe())}); } if (fillTree) { if (flag & BIT(2)) { From 09a18bd57fbe4a0257b8384d736f9b263e155f02 Mon Sep 17 00:00:00 2001 From: Thorkj <154221526+Thorkj@users.noreply.github.com> Date: Wed, 5 Mar 2025 23:06:02 +0100 Subject: [PATCH 0562/1650] =?UTF-8?q?[PWGCF]=20Significant=20update=20wher?= =?UTF-8?q?e=20event=20mixing=20is=20changed=20as=20well=20as=20changed=20?= =?UTF-8?q?f=E2=80=A6=20(#10251)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ALICE Action Bot --- .../Tasks/corrSparse.cxx | 105 +++++++++++++++--- 1 file changed, 88 insertions(+), 17 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx b/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx index a41644270b2..3bb184708da 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx @@ -14,33 +14,85 @@ /// \author Thor Jensen (thor.kjaersgaard.jensen@cern.ch) and Debojit Sarkar (debojit.sarkar@cern.ch) #include + #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "Framework/ASoAHelpers.h" +#include "Framework/ASoA.h" #include "Framework/HistogramRegistry.h" #include "Framework/RunningWorkflowInfo.h" #include "CommonConstants/MathConstants.h" +#include "CCDB/BasicCCDBManager.h" +#include "Common/Core/RecoDecay.h" + #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/Centrality.h" #include "Common/DataModel/Multiplicity.h" +#include "PWGCF/DataModel/CorrelationsDerived.h" #include "PWGCF/Core/CorrelationContainer.h" #include "PWGCF/Core/PairCuts.h" -#include "Common/Core/RecoDecay.h" + +namespace o2::aod +{ +namespace corrsparse +{ +DECLARE_SOA_COLUMN(Multiplicity, multiplicity, int); +} +DECLARE_SOA_TABLE(Multiplicity, "AOD", "MULTIPLICITY", + corrsparse::Multiplicity); + +} // namespace o2::aod using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; +// define the filtered collisions and tracks #define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable NAME{#NAME, DEFAULT, HELP}; +struct CalcNch { + O2_DEFINE_CONFIGURABLE(cfgZVtxCut, float, 10.0f, "Accepted z-vertex range") + O2_DEFINE_CONFIGURABLE(cfgPtCutMin, float, 0.2f, "minimum accepted track pT") + O2_DEFINE_CONFIGURABLE(cfgPtCutMax, float, 10.0f, "maximum accepted track pT") + O2_DEFINE_CONFIGURABLE(cfgEtaCut, float, 0.8f, "Eta cut") + O2_DEFINE_CONFIGURABLE(cfgMinMixEventNum, int, 5, "Minimum number of events to mix") + + Filter trackFilter = (nabs(aod::track::eta) < cfgEtaCut) && (aod::track::pt > cfgPtCutMin) && (aod::track::pt < cfgPtCutMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)); + + using AodCollisions = soa::Join; // aod::CentFT0Cs + using AodTracks = soa::Filtered>; + + Produces multiplicityNch; + + HistogramRegistry registry{"registry"}; + + void init(InitContext&) + { + AxisSpec axisNch = {100, 0, 100}; + AxisSpec axisVrtx = {10, -10, 10}; + + registry.add("Ncharge", "N_{charge}", {HistType::kTH1D, {axisNch}}); + registry.add("zVtx_all", "zVtx_all", {HistType::kTH1D, {axisVrtx}}); + } + + void process(AodCollisions::iterator const& collision, AodTracks const& tracks) + { + multiplicityNch(tracks.size()); + registry.fill(HIST("Ncharge"), tracks.size()); + registry.fill(HIST("zVtx_all"), collision.posZ()); + } +}; + struct CorrSparse { O2_DEFINE_CONFIGURABLE(cfgZVtxCut, float, 10.0f, "Accepted z-vertex range") O2_DEFINE_CONFIGURABLE(cfgPtCutMin, float, 0.2f, "minimum accepted track pT") O2_DEFINE_CONFIGURABLE(cfgPtCutMax, float, 10.0f, "maximum accepted track pT") O2_DEFINE_CONFIGURABLE(cfgEtaCut, float, 0.8f, "Eta cut") O2_DEFINE_CONFIGURABLE(cfgMinMixEventNum, int, 5, "Minimum number of events to mix") + O2_DEFINE_CONFIGURABLE(cfgMinMult, int, 0, "Minimum multiplicity for collision") + O2_DEFINE_CONFIGURABLE(cfgMaxMult, int, 10, "Maximum multiplicity for collision") ConfigurableAxis axisVertex{"axisVertex", {10, -10, 10}, "vertex axis for histograms"}; ConfigurableAxis axisEta{"axisEta", {40, -1., 1.}, "eta axis for histograms"}; @@ -54,17 +106,21 @@ struct CorrSparse { ConfigurableAxis vtxMix{"vtxMix", {VARIABLE_WIDTH, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "vertex axis for mixed event histograms"}; ConfigurableAxis multMix{"multMix", {VARIABLE_WIDTH, 0, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100}, "multiplicity / centrality axis for mixed event histograms"}; - // make the filters and cuts. - - Filter collisionFilter = nabs(aod::collision::posZ) < cfgZVtxCut && (aod::evsel::sel8) == true; + ConfigurableAxis axisVertexEfficiency{"axisVertexEfficiency", {10, -10, 10}, "vertex axis for efficiency histograms"}; + ConfigurableAxis axisEtaEfficiency{"axisEtaEfficiency", {20, -1.0, 1.0}, "eta axis for efficiency histograms"}; + ConfigurableAxis axisPtEfficiency{"axisPtEfficiency", {VARIABLE_WIDTH, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0}, "pt axis for efficiency histograms"}; + // make the filters and cuts. + Filter collisionFilter = (nabs(aod::collision::posZ) < cfgZVtxCut) && (aod::corrsparse::multiplicity) > cfgMinMult && (aod::corrsparse::multiplicity) < cfgMaxMult && (aod::evsel::sel8) == true; Filter trackFilter = (nabs(aod::track::eta) < cfgEtaCut) && (aod::track::pt > cfgPtCutMin) && (aod::track::pt < cfgPtCutMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)); - // define the filtered collisions and tracks - - using AodCollisions = soa::Filtered>; // aod::CentFT0Cs + using AodCollisions = soa::Filtered>; // aod::CentFT0Cs using AodTracks = soa::Filtered>; + // Define the outputs + OutputObj same{Form("sameEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult))}; + OutputObj mixed{Form("mixedEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult))}; + HistogramRegistry registry{"registry"}; void init(InitContext&) @@ -79,11 +135,25 @@ struct CorrSparse { registry.add("Nch", "N_{ch}", {HistType::kTH1D, {axisMultiplicity}}); registry.add("zVtx", "zVtx", {HistType::kTH1D, {axisVertex}}); - registry.add("Sparse_mixed", "", {HistType::kTHnSparseF, {{axisMultiplicity, axisVertex, axisPtTrigger, axisPtAssoc, axisDeltaPhi, axisDeltaEta}}}); // Make the output sparse - registry.add("Sparse_same", "", {HistType::kTHnSparseF, {{axisMultiplicity, axisVertex, axisPtTrigger, axisPtAssoc, axisDeltaPhi, axisDeltaEta}}}); - registry.add("Trig_Hist", "", {HistType::kTHnSparseF, {{axisMultiplicity, axisVertex, axisPtTrigger}}}); + registry.add("Trig_hist", "", {HistType::kTHnSparseF, {{axisMultiplicity, axisVertex, axisPtTrigger}}}); registry.add("eventcount", "bin", {HistType::kTH1F, {{3, 0, 3, "bin"}}}); // histogram to see how many events are in the same and mixed event + + std::vector corrAxis = {{axisMultiplicity, "Nch"}, + {axisVertex, "z-vtx (cm)"}, + {axisPtTrigger, "p_{T} (GeV/c)"}, + {axisPtAssoc, "p_{T} (GeV/c)"}, + {axisDeltaPhi, "#Delta#varphi (rad)"}, + {axisDeltaEta, "#Delta#eta"}}; + std::vector effAxis = { + {axisVertexEfficiency, "z-vtx (cm)"}, + {axisPtEfficiency, "p_{T} (GeV/c)"}, + {axisEtaEfficiency, "#eta"}, + }; + std::vector userAxis; + + same.setObject(new CorrelationContainer(Form("sameEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult)), Form("sameEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult)), corrAxis, effAxis, userAxis)); + mixed.setObject(new CorrelationContainer(Form("mixedEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult)), Form("mixedEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult)), corrAxis, effAxis, userAxis)); } enum EventType { SameEvent = 1, @@ -104,14 +174,14 @@ struct CorrSparse { } } - template + template void fillCorrelations(TTracks tracks1, TTracks tracks2, float posZ, int system, float Nch) // function to fill the Output functions (sparse) and the delta eta and delta phi histograms { // loop over all tracks for (auto const& track1 : tracks1) { if (system == SameEvent) { - registry.fill(HIST("Trig_Hist"), Nch, posZ, track1.pt()); + registry.fill(HIST("Trig_hist"), Nch, posZ, track1.pt()); } for (auto const& track2 : tracks2) { @@ -124,11 +194,11 @@ struct CorrSparse { // fill the right sparse and histograms if (system == SameEvent) { + same->getPairHist()->Fill(step, Nch, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta); registry.fill(HIST("deltaEta_deltaPhi_same"), deltaPhi, deltaEta); - registry.fill(HIST("Sparse_same"), Nch, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta); } else if (system == MixedEvent) { + mixed->getPairHist()->Fill(step, Nch, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta); registry.fill(HIST("deltaEta_deltaPhi_mixed"), deltaPhi, deltaEta); - registry.fill(HIST("Sparse_mixed"), Nch, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta); } } } @@ -139,14 +209,14 @@ struct CorrSparse { registry.fill(HIST("eventcount"), SameEvent); // because its same event i put it in the 1 bin fillYield(collision, tracks); - fillCorrelations(tracks, tracks, collision.posZ(), SameEvent, tracks.size()); // fill the SE histogram and Sparse + fillCorrelations(tracks, tracks, collision.posZ(), SameEvent, tracks.size()); // fill the SE histogram and Sparse } PROCESS_SWITCH(CorrSparse, processSame, "Process same event", true); // event mixing SliceCache cache; - using MixedBinning = ColumnBinningPolicy; + using MixedBinning = ColumnBinningPolicy; // the process for filling the mixed events void processMixed(AodCollisions const& collisions, AodTracks const& tracks) @@ -157,7 +227,7 @@ struct CorrSparse { for (auto const& [collision1, tracks1, collision2, tracks2] : pairs) { registry.fill(HIST("eventcount"), MixedEvent); // fill the mixed event in the 3 bin - fillCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent, tracks1.size()); + fillCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent, tracks1.size()); } } PROCESS_SWITCH(CorrSparse, processMixed, "Process mixed events", true); @@ -166,6 +236,7 @@ struct CorrSparse { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ + adaptAnalysisTask(cfgc), adaptAnalysisTask(cfgc), }; } From 4284c704b9226c0b9c894d0c5f76fb1b34836824 Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Thu, 6 Mar 2025 06:08:05 +0800 Subject: [PATCH 0563/1650] [PWGCF] try EbE EP correction (#10333) --- PWGCF/Flow/Tasks/flowQa.cxx | 67 +++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/PWGCF/Flow/Tasks/flowQa.cxx b/PWGCF/Flow/Tasks/flowQa.cxx index b12450a8d3d..dc46198edba 100644 --- a/PWGCF/Flow/Tasks/flowQa.cxx +++ b/PWGCF/Flow/Tasks/flowQa.cxx @@ -95,6 +95,7 @@ struct FlowQa { O2_DEFINE_CONFIGURABLE(cfgCutOccupancyHigh, int, 500, "High cut on TPC occupancy") O2_DEFINE_CONFIGURABLE(cfgCutOccupancyLow, int, 0, "Low cut on TPC occupancy") O2_DEFINE_CONFIGURABLE(cfgUseSmallMemory, bool, false, "Use small memory mode") + O2_DEFINE_CONFIGURABLE(cfgUseEPcorrection, bool, false, "Use event plane efficiency correction") Configurable> cfgUserDefineGFWCorr{"cfgUserDefineGFWCorr", std::vector{"refN02 {2} refP02 {-2}", "refN12 {2} refP12 {-2}"}, "User defined GFW CorrelatorConfig"}; Configurable> cfgUserDefineGFWName{"cfgUserDefineGFWName", std::vector{"Ch02Gap22", "Ch12Gap22"}, "User defined GFW Name"}; Configurable> cfgRunRemoveList{"cfgRunRemoveList", std::vector{-1}, "excluded run numbers"}; @@ -157,6 +158,12 @@ struct FlowQa { ctpRateFetcher mRateFetcher; TH2* gCurrentHadronicRate; + std::vector funcEff; + TH1D* hFindPtBin; + TF1* funcV2; + TF1* funcV3; + TF1* funcV4; + using AodCollisions = soa::Filtered>; using AodTracks = soa::Filtered>; @@ -355,6 +362,31 @@ struct FlowQa { } } fGFW->CreateRegions(); + + if (cfgUseEPcorrection) { + hFindPtBin = new TH1D("hFindPtBin", "hFindPtBin", 7, 0.2, 3.0); + funcEff.resize(7); + funcEff[0] = new TF1("funcEff0", "[0]+[1]*x+[2]*(2*x*x - 1)+[3]*(4*x*x*x - 3*x)+[4]*(8*x*x*x*x - 8*x*x + 1)", 0, 3000); + funcEff[0]->SetParameters(0.7366162408, -2.11923e-05, 1.5258e-09, -2.23824e-12, 4.53824e-16); + funcEff[1] = new TF1("funcEff1", "[0]+[1]*x+[2]*(2*x*x - 1)+[3]*(4*x*x*x - 3*x)+[4]*(8*x*x*x*x - 8*x*x + 1)", 0, 3000); + funcEff[1]->SetParameters(0.7742102264, -2.50337e-05, -1.12602e-09, -1.38765e-12, 3.86733e-16); + funcEff[2] = new TF1("funcEff2", "[0]+[1]*x+[2]*(2*x*x - 1)+[3]*(4*x*x*x - 3*x)+[4]*(8*x*x*x*x - 8*x*x + 1)", 0, 3000); + funcEff[2]->SetParameters(0.7933082148, -2.24092e-05, -2.55079e-09, -8.59327e-13, 3.1966e-16); + funcEff[3] = new TF1("funcEff3", "[0]+[1]*x+[2]*(2*x*x - 1)+[3]*(4*x*x*x - 3*x)+[4]*(8*x*x*x*x - 8*x*x + 1)", 0, 3000); + funcEff[3]->SetParameters(0.8084143879, -1.88185e-05, -3.26378e-09, -6.57021e-13, 2.92597e-16); + funcEff[4] = new TF1("funcEff4", "[0]+[1]*x+[2]*(2*x*x - 1)+[3]*(4*x*x*x - 3*x)+[4]*(8*x*x*x*x - 8*x*x + 1)", 0, 3000); + funcEff[4]->SetParameters(0.8160584679, -4.0401e-06, -1.5118e-08, 3.22423e-12, -1.21729e-16); + funcEff[5] = new TF1("funcEff5", "[0]+[1]*x+[2]*(2*x*x - 1)+[3]*(4*x*x*x - 3*x)+[4]*(8*x*x*x*x - 8*x*x + 1)", 0, 3000); + funcEff[5]->SetParameters(0.8245747952, -1.88827e-05, 9.88837e-10, -2.23894e-12, 4.62594e-16); + funcEff[6] = new TF1("funcEff6", "[0]+[1]*x+[2]*(2*x*x - 1)+[3]*(4*x*x*x - 3*x)+[4]*(8*x*x*x*x - 8*x*x + 1)", 0, 3000); + funcEff[6]->SetParameters(0.8277255051, -1.07687e-05, -3.9408e-09, -8.7277e-13, 3.3104e-16); + funcV2 = new TF1("funcV2", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); + funcV2->SetParameters(0.0186111, 0.00351907, -4.38264e-05, 1.35383e-07, -3.96266e-10); + funcV3 = new TF1("funcV3", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); + funcV3->SetParameters(0.0174056, 0.000703329, -1.45044e-05, 1.91991e-07, -1.62137e-09); + funcV4 = new TF1("funcV4", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); + funcV4->SetParameters(0.008845, 0.000259668, -3.24435e-06, 4.54837e-08, -6.01825e-10); + } } template @@ -670,6 +702,32 @@ struct FlowQa { if (cfgUseNch) independent = static_cast(tracks.size()); + double psi2Est = 0, psi3Est = 0, psi4Est = 0; + float wEPeff = 1; + double v2 = 0, v3 = 0, v4 = 0; + if (cfgUseEPcorrection) { + double q2x = 0, q2y = 0; + double q3x = 0, q3y = 0; + double q4x = 0, q4y = 0; + for (const auto& track : tracks) { + bool withinPtRef = (cfgCutPtRefMin < track.pt()) && (track.pt() < cfgCutPtRefMax); // within RF pT rang + if (withinPtRef) { + q2x += std::cos(2 * track.phi()); + q2y += std::sin(2 * track.phi()); + q3x += std::cos(3 * track.phi()); + q3y += std::sin(3 * track.phi()); + q4x += std::cos(4 * track.phi()); + q4y += std::sin(4 * track.phi()); + } + } + psi2Est = std::atan2(q2y, q2x) / 2.; + psi3Est = std::atan2(q3y, q3x) / 3.; + psi4Est = std::atan2(q4y, q4x) / 4.; + v2 = funcV2->Eval(cent); + v3 = funcV3->Eval(cent); + v4 = funcV4->Eval(cent); + } + for (const auto& track : tracks) { if (!trackSelected(track)) continue; @@ -685,6 +743,15 @@ struct FlowQa { } if (!setCurrentParticleWeights(weff, wacc, track.phi(), track.eta(), track.pt(), vtxz)) continue; + if (cfgUseEPcorrection && withinPtRef) { + double fphi = v2 * std::cos(2 * (track.phi() - psi2Est)) + v3 * std::cos(3 * (track.phi() - psi3Est)) + v4 * std::cos(4 * (track.phi() - psi4Est)); + fphi = (1 + 2 * fphi); + int pTBinForEff = hFindPtBin->FindBin(track.pt()); + if (pTBinForEff >= 1 && pTBinForEff <= 7) { + wEPeff = funcEff[pTBinForEff - 1]->Eval(fphi * tracks.size()); + weff *= wEPeff; + } + } registry.fill(HIST("hPt"), track.pt()); if (withinPtRef) { registry.fill(HIST("hPhi"), track.phi()); From ace656a0273aa03b7ee29a30436b9d9a551704be Mon Sep 17 00:00:00 2001 From: ldellost <47105254+DelloStritto@users.noreply.github.com> Date: Wed, 5 Mar 2025 23:32:29 +0100 Subject: [PATCH 0564/1650] [PWGHF,PWGJE] add Dp correlated bkg flag in derived data tables (#10345) Co-authored-by: Luigi Dello Stritto --- PWGHF/DataModel/DerivedTables.h | 1 + PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx | 10 ++++++---- PWGJE/Core/JetHFUtilities.h | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/PWGHF/DataModel/DerivedTables.h b/PWGHF/DataModel/DerivedTables.h index beceaf3233a..6900ef25039 100644 --- a/PWGHF/DataModel/DerivedTables.h +++ b/PWGHF/DataModel/DerivedTables.h @@ -728,6 +728,7 @@ DECLARE_SOA_TABLE_STAGED(HfDplusMcs, "HFDPMC", //! Table with MC candidate info hf_cand_mc::FlagMcMatchRec, hf_cand_mc::OriginMcRec, hf_cand_mc::IsCandidateSwapped, // useless + hf_cand_mc::FlagMcDecayChanRec, o2::soa::Marker); } // namespace o2::aod diff --git a/PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx b/PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx index 722700cd0ef..cf4f828b498 100644 --- a/PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx +++ b/PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx @@ -117,7 +117,7 @@ struct HfDerivedDataCreatorDplusToPiKPi { template void fillTablesCandidate(const T& candidate, const U& prong0, const U& prong1, const U& prong2, int candFlag, double invMass, - double ct, double y, int8_t flagMc, int8_t origin, int8_t swapping, const std::vector& mlScores) + double ct, double y, int8_t flagMc, int8_t origin, int8_t swapping, int8_t flagDecayChan, const std::vector& mlScores) { rowsCommon.fillTablesCandidate(candidate, invMass, y); if (fillCandidatePar) { @@ -193,7 +193,8 @@ struct HfDerivedDataCreatorDplusToPiKPi { rowCandidateMc( flagMc, origin, - swapping); + swapping, + flagDecayChan); } } @@ -239,7 +240,7 @@ struct HfDerivedDataCreatorDplusToPiKPi { if constexpr (isMc) { reserveTable(rowCandidateMc, fillCandidateMc, sizeTableCand); } - int8_t flagMcRec = 0, origin = 0, swapping = 0; + int8_t flagMcRec = 0, origin = 0, swapping = 0, flagDecayChanRec = 0; for (const auto& candidate : candidatesThisColl) { if constexpr (isMl) { if (!TESTBIT(candidate.isSelDplusToPiKPi(), aod::SelectionStep::RecoMl)) { @@ -250,6 +251,7 @@ struct HfDerivedDataCreatorDplusToPiKPi { flagMcRec = candidate.flagMcMatchRec(); origin = candidate.originMcRec(); swapping = candidate.isCandidateSwapped(); + flagDecayChanRec = candidate.flagMcDecayChanRec(); if constexpr (onlyBkg) { if (TESTBIT(std::abs(flagMcRec), aod::hf_cand_3prong::DecayType::DplusToPiKPi)) { continue; @@ -277,7 +279,7 @@ struct HfDerivedDataCreatorDplusToPiKPi { if constexpr (isMl) { std::copy(candidate.mlProbDplusToPiKPi().begin(), candidate.mlProbDplusToPiKPi().end(), std::back_inserter(mlScoresDplusToPiKPi)); } - fillTablesCandidate(candidate, prong0, prong1, prong2, 0, massDplusToPiKPi, ct, y, flagMcRec, origin, swapping, mlScoresDplusToPiKPi); + fillTablesCandidate(candidate, prong0, prong1, prong2, 0, massDplusToPiKPi, ct, y, flagMcRec, origin, swapping, flagDecayChanRec, mlScoresDplusToPiKPi); } } } diff --git a/PWGJE/Core/JetHFUtilities.h b/PWGJE/Core/JetHFUtilities.h index 9c3892b538c..3038086354e 100644 --- a/PWGJE/Core/JetHFUtilities.h +++ b/PWGJE/Core/JetHFUtilities.h @@ -714,7 +714,7 @@ void fillDplusCandidateTable(T const& candidate, U& DplusParTable, V& DplusParET DplusMlTable(mlScoresVector); if constexpr (isMc) { - DplusMCDTable(candidate.flagMcMatchRec(), candidate.originMcRec(), candidate.isCandidateSwapped()); + DplusMCDTable(candidate.flagMcMatchRec(), candidate.originMcRec(), candidate.isCandidateSwapped(), candidate.flagMcDecayChanRec()); } } From fadc224d0b435a31605dd6eeb3d6c2a5b9942eb7 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Thu, 6 Mar 2025 08:11:12 +0900 Subject: [PATCH 0565/1650] [PWGEM/PhotonMeson] fix process function names (#10346) --- .../TableProducer/associateMCinfoPhoton.cxx | 43 ++++++++----- .../TableProducer/createEMEventPhoton.cxx | 64 ++++++++----------- 2 files changed, 53 insertions(+), 54 deletions(-) diff --git a/PWGEM/PhotonMeson/TableProducer/associateMCinfoPhoton.cxx b/PWGEM/PhotonMeson/TableProducer/associateMCinfoPhoton.cxx index b69972767d5..3f06fd2fb60 100644 --- a/PWGEM/PhotonMeson/TableProducer/associateMCinfoPhoton.cxx +++ b/PWGEM/PhotonMeson/TableProducer/associateMCinfoPhoton.cxx @@ -65,7 +65,7 @@ struct AssociateMCInfoPhoton { void init(o2::framework::InitContext&) { - auto hEventCounter = registry.add("hEventCounter", "hEventCounter", kTH1I, {{6, 0.5f, 6.5f}}); + auto hEventCounter = registry.add("hEventCounter", "hEventCounter", kTH1F, {{6, 0.5f, 6.5f}}); hEventCounter->GetXaxis()->SetBinLabel(1, "all"); hEventCounter->GetXaxis()->SetBinLabel(2, "has mc collision"); @@ -113,7 +113,7 @@ struct AssociateMCInfoPhoton { std::vector genEta; // primary, pt, y template - void skimmingMC(MyCollisionsMC const& collisions, aod::BCs const&, aod::McCollisions const&, aod::McParticles const& mcParticles, TTracks const& o2tracks, TFwdTracks const&, TPCMs const& v0photons, TPCMLegs const& /*v0legs*/, TPHOSs const& /*phosclusters*/, TEMCs const& emcclusters, TEMPrimaryElectrons const& emprimaryelectrons) + void skimmingMC(MyCollisionsMC const& collisions, aod::BCs const&, aod::McCollisions const&, aod::McParticles const& mcParticles, TTracks const& o2tracks, TFwdTracks const&, TPCMs const& v0photons, TPCMLegs const&, TPHOSs const&, TEMCs const& emcclusters, TEMPrimaryElectrons const& emprimaryelectrons) { // temporary variables used for the indexing of the skimmed MC stack std::map fNewLabels; @@ -180,6 +180,7 @@ struct AssociateMCInfoPhoton { binnedGenPt(genGamma, genPi0, genEta); } + // LOGF(info, "collision.globalIndex() = %d , mceventlabels.lastIndex() = %d", collision.globalIndex(), mceventlabels.lastIndex()); mceventlabels(fEventLabels.find(mcCollision.globalIndex())->second, collision.mcMask()); for (const auto& mcParticle : groupedMcParticles) { // store necessary information for denominator of efficiency @@ -447,80 +448,90 @@ struct AssociateMCInfoPhoton { fEventLabels.clear(); fCounters[0] = 0; fCounters[1] = 0; - } // end of skimmingMC + } // end of skimmingMC void processMC_PCM(MyCollisionsMC const& collisions, aod::BCs const& bcs, aod::McCollisions const& mccollisions, aod::McParticles const& mcParticles, TracksMC const& o2tracks, aod::V0PhotonsKF const& v0photons, aod::V0Legs const& v0legs) { skimmingMC(collisions, bcs, mccollisions, mcParticles, o2tracks, nullptr, v0photons, v0legs, nullptr, nullptr, nullptr); } + PROCESS_SWITCH(AssociateMCInfoPhoton, processMC_PCM, "create em mc event table for PCM", false); + void processMC_PCM_Electron(MyCollisionsMC const& collisions, aod::BCs const& bcs, aod::McCollisions const& mccollisions, aod::McParticles const& mcParticles, TracksMC const& o2tracks, aod::V0PhotonsKF const& v0photons, aod::V0Legs const& v0legs, aod::EMPrimaryElectronsFromDalitz const& emprimaryelectrons) { const uint8_t sysflag = kPCM | kElectron; skimmingMC(collisions, bcs, mccollisions, mcParticles, o2tracks, nullptr, v0photons, v0legs, nullptr, nullptr, emprimaryelectrons); } + PROCESS_SWITCH(AssociateMCInfoPhoton, processMC_PCM_Electron, "create em mc event table for PCM, Electron", false); + void processMC_Electron(MyCollisionsMC const& collisions, aod::BCs const& bcs, aod::McCollisions const& mccollisions, aod::McParticles const& mcParticles, TracksMC const& o2tracks, aod::EMPrimaryElectronsFromDalitz const& emprimaryelectrons) { const uint8_t sysflag = kElectron; skimmingMC(collisions, bcs, mccollisions, mcParticles, o2tracks, nullptr, nullptr, nullptr, nullptr, nullptr, emprimaryelectrons); } + PROCESS_SWITCH(AssociateMCInfoPhoton, processMC_Electron, "create em mc event table for Electron", false); + void processMC_PHOS(MyCollisionsMC const& collisions, aod::BCs const& bcs, aod::McCollisions const& mccollisions, aod::McParticles const& mcParticles, aod::PHOSClusters const& phosclusters) { skimmingMC(collisions, bcs, mccollisions, mcParticles, nullptr, nullptr, nullptr, nullptr, phosclusters, nullptr, nullptr); } + PROCESS_SWITCH(AssociateMCInfoPhoton, processMC_PHOS, "create em mc event table for PHOS", false); + void processMC_EMC(MyCollisionsMC const& collisions, aod::BCs const& bcs, aod::McCollisions const& mccollisions, aod::McParticles const& mcParticles, MyEMCClusters const& emcclusters) { skimmingMC(collisions, bcs, mccollisions, mcParticles, nullptr, nullptr, nullptr, nullptr, nullptr, emcclusters, nullptr); } + PROCESS_SWITCH(AssociateMCInfoPhoton, processMC_EMC, "create em mc event table for EMCal", false); + void processMC_PCM_PHOS(MyCollisionsMC const& collisions, aod::BCs const& bcs, aod::McCollisions const& mccollisions, aod::McParticles const& mcParticles, TracksMC const& o2tracks, aod::V0PhotonsKF const& v0photons, aod::V0Legs const& v0legs, aod::PHOSClusters const& phosclusters) { const uint8_t sysflag = kPCM | kPHOS; skimmingMC(collisions, bcs, mccollisions, mcParticles, o2tracks, nullptr, v0photons, v0legs, phosclusters, nullptr, nullptr); } + PROCESS_SWITCH(AssociateMCInfoPhoton, processMC_PCM_PHOS, "create em mc event table for PCM, PHOS", false); + void processMC_PCM_PHOS_Electron(MyCollisionsMC const& collisions, aod::BCs const& bcs, aod::McCollisions const& mccollisions, aod::McParticles const& mcParticles, TracksMC const& o2tracks, aod::V0PhotonsKF const& v0photons, aod::V0Legs const& v0legs, aod::PHOSClusters const& phosclusters, aod::EMPrimaryElectronsFromDalitz const& emprimaryelectrons) { const uint8_t sysflag = kPCM | kPHOS | kElectron; skimmingMC(collisions, bcs, mccollisions, mcParticles, o2tracks, nullptr, v0photons, v0legs, phosclusters, nullptr, emprimaryelectrons); } + PROCESS_SWITCH(AssociateMCInfoPhoton, processMC_PCM_PHOS_Electron, "create em mc event table for PCM, PHOS, Electron", false); + void processMC_PCM_EMC(MyCollisionsMC const& collisions, aod::BCs const& bcs, aod::McCollisions const& mccollisions, aod::McParticles const& mcParticles, TracksMC const& o2tracks, aod::V0PhotonsKF const& v0photons, aod::V0Legs const& v0legs, MyEMCClusters const& emcclusters) { const uint8_t sysflag = kPCM | kEMC; skimmingMC(collisions, bcs, mccollisions, mcParticles, o2tracks, nullptr, v0photons, v0legs, nullptr, emcclusters, nullptr); } + PROCESS_SWITCH(AssociateMCInfoPhoton, processMC_PCM_EMC, "create em mc event table for PCM, EMCal", false); + void processMC_PCM_EMC_Electron(MyCollisionsMC const& collisions, aod::BCs const& bcs, aod::McCollisions const& mccollisions, aod::McParticles const& mcParticles, TracksMC const& o2tracks, aod::V0PhotonsKF const& v0photons, aod::V0Legs const& v0legs, MyEMCClusters const& emcclusters, aod::EMPrimaryElectronsFromDalitz const& emprimaryelectrons) { const uint8_t sysflag = kPCM | kEMC | kElectron; skimmingMC(collisions, bcs, mccollisions, mcParticles, o2tracks, nullptr, v0photons, v0legs, nullptr, emcclusters, emprimaryelectrons); } + PROCESS_SWITCH(AssociateMCInfoPhoton, processMC_PCM_EMC_Electron, "create em mc event table for PCM, EMCal, Electron", false); + void processMC_PHOS_EMC(MyCollisionsMC const& collisions, aod::BCs const& bcs, aod::McCollisions const& mccollisions, aod::McParticles const& mcParticles, aod::PHOSClusters const& phosclusters, MyEMCClusters const& emcclusters) { const uint8_t sysflag = kPHOS | kEMC; skimmingMC(collisions, bcs, mccollisions, mcParticles, nullptr, nullptr, nullptr, nullptr, phosclusters, emcclusters, nullptr); } + PROCESS_SWITCH(AssociateMCInfoPhoton, processMC_PHOS_EMC, "create em mc event table for PHOS, EMCal", false); + void processMC_PCM_PHOS_EMC(MyCollisionsMC const& collisions, aod::BCs const& bcs, aod::McCollisions const& mccollisions, aod::McParticles const& mcParticles, TracksMC const& o2tracks, aod::V0PhotonsKF const& v0photons, aod::V0Legs const& v0legs, aod::PHOSClusters const& phosclusters, MyEMCClusters const& emcclusters) { const uint8_t sysflag = kPCM | kPHOS | kEMC; skimmingMC(collisions, bcs, mccollisions, mcParticles, o2tracks, nullptr, v0photons, v0legs, phosclusters, emcclusters, nullptr); } + PROCESS_SWITCH(AssociateMCInfoPhoton, processMC_PCM_PHOS_EMC, "create em mc event table for PCM, PHOS, EMCal", false); + void processMC_PCM_PHOS_EMC_Electron(MyCollisionsMC const& collisions, aod::BCs const& bcs, aod::McCollisions const& mccollisions, aod::McParticles const& mcParticles, TracksMC const& o2tracks, aod::V0PhotonsKF const& v0photons, aod::V0Legs const& v0legs, aod::PHOSClusters const& phosclusters, MyEMCClusters const& emcclusters, aod::EMPrimaryElectronsFromDalitz const& emprimaryelectrons) { const uint8_t sysflag = kPCM | kPHOS | kEMC | kElectron; skimmingMC(collisions, bcs, mccollisions, mcParticles, o2tracks, nullptr, v0photons, v0legs, phosclusters, emcclusters, emprimaryelectrons); } + PROCESS_SWITCH(AssociateMCInfoPhoton, processMC_PCM_PHOS_EMC_Electron, "create em mc event table for PCM, PHOS, EMCal, Electron", false); void processDummy(MyCollisionsMC const&) {} - - PROCESS_SWITCH(AssociateMCInfoPhoton, processMC_PCM, "create em mc event table for PCM", false); - PROCESS_SWITCH(AssociateMCInfoPhoton, processMC_PCM_Electron, "create em mc event table for PCM, Electron", false); - PROCESS_SWITCH(AssociateMCInfoPhoton, processMC_Electron, "create em mc event table for Electron", false); - PROCESS_SWITCH(AssociateMCInfoPhoton, processMC_PHOS, "create em mc event table for PHOS", false); - PROCESS_SWITCH(AssociateMCInfoPhoton, processMC_EMC, "create em mc event table for EMCal", false); - PROCESS_SWITCH(AssociateMCInfoPhoton, processMC_PCM_PHOS, "create em mc event table for PCM, PHOS", false); - PROCESS_SWITCH(AssociateMCInfoPhoton, processMC_PCM_PHOS_Electron, "create em mc event table for PCM, PHOS, Electron", false); - PROCESS_SWITCH(AssociateMCInfoPhoton, processMC_PCM_EMC, "create em mc event table for PCM, EMCal", false); - PROCESS_SWITCH(AssociateMCInfoPhoton, processMC_PCM_EMC_Electron, "create em mc event table for PCM, EMCal, Electron", false); - PROCESS_SWITCH(AssociateMCInfoPhoton, processMC_PHOS_EMC, "create em mc event table for PHOS, EMCal", false); - PROCESS_SWITCH(AssociateMCInfoPhoton, processMC_PCM_PHOS_EMC, "create em mc event table for PCM, PHOS, EMCal", false); - PROCESS_SWITCH(AssociateMCInfoPhoton, processMC_PCM_PHOS_EMC_Electron, "create em mc event table for PCM, PHOS, EMCal, Electron", false); PROCESS_SWITCH(AssociateMCInfoPhoton, processDummy, "processDummy", true); }; diff --git a/PWGEM/PhotonMeson/TableProducer/createEMEventPhoton.cxx b/PWGEM/PhotonMeson/TableProducer/createEMEventPhoton.cxx index a8ee8209a51..25f1c73533e 100644 --- a/PWGEM/PhotonMeson/TableProducer/createEMEventPhoton.cxx +++ b/PWGEM/PhotonMeson/TableProducer/createEMEventPhoton.cxx @@ -46,9 +46,9 @@ using MyCollisionsMC = soa::Join; using MyCollisionsMCCent = soa::Join; // centrality table has dependency on multiplicity table. using MyCollisionsMCCentQvec = soa::Join; -struct CreateEMEvent { +struct CreateEMEventPhoton { Produces event; - Produces eventCov; + // Produces eventCov; Produces eventMult; Produces eventCent; Produces eventQvec; @@ -56,8 +56,8 @@ struct CreateEMEvent { enum class EMEventType : int { kEvent = 0, - keventCent = 1, - keventCent_Qvec = 2, + kEventCent = 1, + kEventCent_Qvec = 2, kEvent_JJ = 3, }; @@ -122,19 +122,9 @@ struct CreateEMEvent { mRunNumber = bc.runNumber(); } - // PresliceUnsorted preslice_collisions_per_bc = o2::aod::evsel::foundBCId; - // std::unordered_map map_ncolls_per_bc; - template void skimEvent(TCollisions const& collisions, TBCs const&) { - // first count the number of collisions per bc - // for (const auto& bc : bcs) { - // auto collisions_per_bc = collisions.sliceBy(preslice_collisions_per_bc, bc.globalIndex()); - // map_ncolls_per_bc[bc.globalIndex()] = collisions_per_bc.size(); - // // LOGF(info, "bc-loop | bc.globalIndex() = %d , collisions_per_bc.size() = %d", bc.globalIndex(), collisions_per_bc.size()); - // } - for (const auto& collision : collisions) { if constexpr (isMC) { if (!collision.has_mcCollision()) { @@ -142,7 +132,7 @@ struct CreateEMEvent { } } - auto bc = collision.template foundBC_as(); + const auto& bc = collision.template foundBC_as(); initCCDB(bc); if (applyEveSelAtSkimming && (!collision.selection_bit(o2::aod::evsel::kIsTriggerTVX) || !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder))) { @@ -155,21 +145,19 @@ struct CreateEMEvent { continue; } - float qDefault = 999.f; // default value for q vectors if not obtained + const float qDefault = 999.f; // default value for q vectors if not obtained - // LOGF(info, "collision-loop | bc.globalIndex() = %d, ncolls_per_bc = %d", bc.globalIndex(), map_ncolls_per_bc[bc.globalIndex()]); registry.fill(HIST("hEventCounter"), 1); if (collision.sel8()) { registry.fill(HIST("hEventCounter"), 2); } - // uint64_t tag = collision.selection_raw(); event(collision.globalIndex(), bc.runNumber(), bc.globalBC(), collision.alias_raw(), collision.selection_raw(), bc.timestamp(), collision.posX(), collision.posY(), collision.posZ(), collision.numContrib(), collision.trackOccupancyInTimeRange(), collision.ft0cOccupancyInTimeRange()); - eventCov(collision.covXX(), collision.covXY(), collision.covXZ(), collision.covYY(), collision.covYZ(), collision.covZZ(), collision.chi2()); + // eventCov(collision.covXX(), collision.covXY(), collision.covXZ(), collision.covYY(), collision.covYZ(), collision.covZZ(), collision.chi2()); eventMult(collision.multFT0A(), collision.multFT0C(), collision.multNTracksPV(), collision.multNTracksPVeta1(), collision.multNTracksPVetaHalf()); @@ -181,11 +169,11 @@ struct CreateEMEvent { eventCent(105.f, 105.f, 105.f); eventQvec(qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault); - } else if constexpr (eventype == EMEventType::keventCent) { + } else if constexpr (eventype == EMEventType::kEventCent) { eventCent(collision.centFT0M(), collision.centFT0A(), collision.centFT0C()); eventQvec(qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault); - } else if constexpr (eventype == EMEventType::keventCent_Qvec) { + } else if constexpr (eventype == EMEventType::kEventCent_Qvec) { eventCent(collision.centFT0M(), collision.centFT0A(), collision.centFT0C()); const size_t qvecSize = collision.qvecFT0CReVec().size(); if (qvecSize >= 2) { // harmonics 2,3 @@ -201,7 +189,7 @@ struct CreateEMEvent { qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault, qDefault); } } // end of collision loop - // map_ncolls_per_bc.clear(); + } // end of skimEvent void fillEventWeights(MyCollisionsMC const& collisions, aod::McCollisions const&, MyBCs const&) @@ -226,47 +214,47 @@ struct CreateEMEvent { { skimEvent(collisions, bcs); } - PROCESS_SWITCH(CreateEMEvent, processEvent, "process event info", false); + PROCESS_SWITCH(CreateEMEventPhoton, processEvent, "process event info", false); void processEventMC(MyCollisionsMC const& collisions, MyBCs const& bcs) { skimEvent(collisions, bcs); } - PROCESS_SWITCH(CreateEMEvent, processEventMC, "process event info", false); + PROCESS_SWITCH(CreateEMEventPhoton, processEventMC, "process event info", false); void processEventJJMC(MyCollisionsMC const& collisions, aod::McCollisions const& mcCollisions, MyBCs const& bcs) { skimEvent(collisions, bcs); fillEventWeights(collisions, mcCollisions, bcs); } - PROCESS_SWITCH(CreateEMEvent, processEventJJMC, "process event info", false); + PROCESS_SWITCH(CreateEMEventPhoton, processEventJJMC, "process event info", false); - void processeventCent(MyCollisionsCent const& collisions, MyBCs const& bcs) + void procesEeventCent(MyCollisionsCent const& collisions, MyBCs const& bcs) { - skimEvent(collisions, bcs); + skimEvent(collisions, bcs); } - PROCESS_SWITCH(CreateEMEvent, processeventCent, "process event info", false); + PROCESS_SWITCH(CreateEMEventPhoton, procesEeventCent, "process event info", false); - void processeventCent_Qvec(MyCollisionsCentQvec const& collisions, MyBCs const& bcs) + void processEventCent_Qvec(MyCollisionsCentQvec const& collisions, MyBCs const& bcs) { - skimEvent(collisions, bcs); + skimEvent(collisions, bcs); } - PROCESS_SWITCH(CreateEMEvent, processeventCent_Qvec, "process event info", false); + PROCESS_SWITCH(CreateEMEventPhoton, processEventCent_Qvec, "process event info", false); void processEventMC_Cent(MyCollisionsMCCent const& collisions, MyBCs const& bcs) { - skimEvent(collisions, bcs); + skimEvent(collisions, bcs); } - PROCESS_SWITCH(CreateEMEvent, processEventMC_Cent, "process event info", false); + PROCESS_SWITCH(CreateEMEventPhoton, processEventMC_Cent, "process event info", false); void processEventMC_Cent_Qvec(MyCollisionsMCCentQvec const& collisions, MyBCs const& bcs) { - skimEvent(collisions, bcs); + skimEvent(collisions, bcs); } - PROCESS_SWITCH(CreateEMEvent, processEventMC_Cent_Qvec, "process event info", false); + PROCESS_SWITCH(CreateEMEventPhoton, processEventMC_Cent_Qvec, "process event info", false); void processDummy(aod::Collisions const&) {} - PROCESS_SWITCH(CreateEMEvent, processDummy, "processDummy", true); + PROCESS_SWITCH(CreateEMEventPhoton, processDummy, "processDummy", true); }; struct AssociatePhotonToEMEvent { Produces v0kfeventid; @@ -295,7 +283,7 @@ struct AssociatePhotonToEMEvent { } // This struct is for both data and MC. - // Note that reconstructed collisions without mc collisions are already rejected in CreateEMEvent in MC. + // Note that reconstructed collisions without mc collisions are already rejected in CreateEMEventPhoton in MC. void processPCM(aod::EMEvents const& collisions, aod::V0PhotonsKF const& photons) { @@ -328,7 +316,7 @@ struct AssociatePhotonToEMEvent { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"create-emevent-photon"}), + adaptAnalysisTask(cfgc, TaskName{"create-emevent-photon"}), adaptAnalysisTask(cfgc, TaskName{"associate-photon-to-emevent"}), }; } From 1464d443a106891e408404bab681752add89249a Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Thu, 6 Mar 2025 08:50:27 +0900 Subject: [PATCH 0566/1650] [PWGEM/Dilepton] fix uint8_t and uint32_t (#10347) --- PWGEM/Dilepton/Tasks/smearing.cxx | 15 ++++++++------- PWGEM/Dilepton/Tasks/studyMCTruth.cxx | 13 ++++--------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/PWGEM/Dilepton/Tasks/smearing.cxx b/PWGEM/Dilepton/Tasks/smearing.cxx index bcd8cbeffa1..7d2404645ca 100644 --- a/PWGEM/Dilepton/Tasks/smearing.cxx +++ b/PWGEM/Dilepton/Tasks/smearing.cxx @@ -218,7 +218,7 @@ struct ApplySmearing { } int pdgCode = mctrack.pdgCode(); - if (abs(pdgCode) == 11) { + if (std::abs(pdgCode) == 11) { int ch = -1; if (pdgCode < 0) { ch = 1; @@ -232,7 +232,7 @@ struct ApplySmearing { // fill the table smearedelectron(ptsmeared, etasmeared, phismeared, efficiency, dca); smearedmuon(ptgen, etagen, phigen, 1.f, 0.f, ptgen, etagen, phigen, 1.f, 0.f); - } else if (abs(pdgCode) == 13) { + } else if (std::abs(pdgCode) == 13) { int ch = -1; if (pdgCode < 0) { ch = 1; @@ -249,7 +249,6 @@ struct ApplySmearing { efficiency_gl = smearer_GlobalMuon.getEfficiency(ptgen, etagen, phigen); dca_gl = smearer_GlobalMuon.getDCA(ptsmeared_gl); smearedmuon(ptsmeared_sa, etasmeared_sa, phismeared_sa, efficiency_sa, dca_sa, ptsmeared_gl, etasmeared_gl, phismeared_gl, efficiency_gl, dca_gl); - smearedelectron(ptgen, etagen, phigen, 1.f, 0.f); } else { // don't apply smearing @@ -279,12 +278,14 @@ struct ApplySmearing { // don't apply smearing for (auto& mctrack : tracksMC) { int pdgCode = mctrack.pdgCode(); - if (abs(pdgCode) == 11) { + if (std::abs(pdgCode) == 11) { + smearedelectron(mctrack.pt(), mctrack.eta(), mctrack.phi(), 1.0, 0.0); + smearedmuon(mctrack.pt(), mctrack.eta(), mctrack.phi(), 1.0, 0.0, mctrack.pt(), mctrack.eta(), mctrack.phi(), 1.0, 0.0); + } else if (std::abs(pdgCode) == 13) { smearedelectron(mctrack.pt(), mctrack.eta(), mctrack.phi(), 1.0, 0.0); - } else if (abs(pdgCode) == 13) { smearedmuon(mctrack.pt(), mctrack.eta(), mctrack.phi(), 1.0, 0.0, mctrack.pt(), mctrack.eta(), mctrack.phi(), 1.0, 0.0); } else { - smearedelectron(mctrack.pt(), mctrack.eta(), mctrack.eta(), 1.0, 0.0); + smearedelectron(mctrack.pt(), mctrack.eta(), mctrack.phi(), 1.0, 0.0); smearedmuon(mctrack.pt(), mctrack.eta(), mctrack.phi(), 1.0, 0.0, mctrack.pt(), mctrack.eta(), mctrack.phi(), 1.0, 0.0); } } @@ -348,7 +349,7 @@ struct CheckSmearing { void Check(TTracksMC const& tracksMC, TMCCollisions const&) { for (auto& mctrack : tracksMC) { - if (abs(mctrack.pdgCode()) != fPdgCode) { + if (std::abs(mctrack.pdgCode()) != fPdgCode) { continue; } diff --git a/PWGEM/Dilepton/Tasks/studyMCTruth.cxx b/PWGEM/Dilepton/Tasks/studyMCTruth.cxx index a4340007ce3..4204a95a9c4 100644 --- a/PWGEM/Dilepton/Tasks/studyMCTruth.cxx +++ b/PWGEM/Dilepton/Tasks/studyMCTruth.cxx @@ -44,11 +44,6 @@ struct studyMCTruth { Configurable cfgMaxPtGen{"cfgMaxPtGen", 1e+10f, "max. pT of single lepton"}; Configurable cfgMinEtaGen{"cfgMinEtaGen", -0.8, "min. eta of for single lepton"}; Configurable cfgMaxEtaGen{"cfgMaxEtaGen", +0.8, "max. eta of for single lepton"}; - Configurable cfgMinPtGenWide{"cfgMinPtGenWide", 0.01, "min. pT of single lepton in wide acceptance"}; // this is only to speed up pairing loop - Configurable cfgMaxPtGenWide{"cfgMaxPtGenWide", 1e+10f, "max. pT of single lepton in wide acceptance"}; // this is only to speed up pairing loop - Configurable cfgMinEtaGenWide{"cfgMinEtaGenWide", -1.5, "min. eta of for single lepton in wide acceptance"}; // this is only to speed up pairing loop - Configurable cfgMaxEtaGenWide{"cfgMaxEtaGenWide", +1.5, "max. eta of for single lepton in wide acceptance"}; // this is only to speed up pairing loop - Configurable cfgMuonTrackType{"cfgMuonTrackType", 3, "muon track type [0: MFT-MCH-MID, 3: MCH-MID]"}; } mccuts; @@ -370,8 +365,8 @@ struct studyMCTruth { } // store MC true information - auto posLeptons_per_mccollision = mcPosLeptons.sliceBy(perMcCollision, mcCollision.globalIndex()); - auto negLeptons_per_mccollision = mcNegLeptons.sliceBy(perMcCollision, mcCollision.globalIndex()); + const auto& posLeptons_per_mccollision = mcPosLeptons.sliceBy(perMcCollision, mcCollision.globalIndex()); + const auto& negLeptons_per_mccollision = mcNegLeptons.sliceBy(perMcCollision, mcCollision.globalIndex()); for (const auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posLeptons_per_mccollision, negLeptons_per_mccollision))) { // ULS fillTrueInfo<0, 0, isSmeared>(pos, neg, mcParticles); @@ -429,8 +424,8 @@ struct studyMCTruth { Partition McNegLeptons = o2::aod::mcparticle::pdgCode == mccuts.cfgPdgCodeLepton && (mccuts.cfgMinPtGen < o2::aod::mcparticle::pt && o2::aod::mcparticle::pt < mccuts.cfgMaxPtGen) && (mccuts.cfgMinEtaGen < o2::aod::mcparticle::eta && o2::aod::mcparticle::eta < mccuts.cfgMaxEtaGen); using SmearedMcParticles = soa::Join; - Partition McPosLeptonsSmeared = o2::aod::mcparticle::pdgCode == -mccuts.cfgPdgCodeLepton && ifnode(mccuts.cfgPdgCodeLepton.node() == 11, (mccuts.cfgMinPtGen.node() < o2::aod::smearedtrack::ptSmeared && o2::aod::smearedtrack::ptSmeared < mccuts.cfgMaxPtGen.node()) && (mccuts.cfgMinEtaGen.node() < o2::aod::smearedtrack::etaSmeared && o2::aod::smearedtrack::etaSmeared < mccuts.cfgMaxEtaGen.node()), ifnode(mccuts.cfgMuonTrackType.node() == uint8_t(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack), (mccuts.cfgMinPtGen.node() < o2::aod::smearedtrack::ptSmeared_gl_muon && o2::aod::smearedtrack::ptSmeared_gl_muon < mccuts.cfgMaxPtGen.node()) && (mccuts.cfgMinEtaGen.node() < o2::aod::smearedtrack::etaSmeared_gl_muon && o2::aod::smearedtrack::etaSmeared_gl_muon < mccuts.cfgMaxEtaGen.node()), (mccuts.cfgMinPtGen.node() < o2::aod::smearedtrack::ptSmeared_sa_muon && o2::aod::smearedtrack::ptSmeared_sa_muon < mccuts.cfgMaxPtGen.node()) && (mccuts.cfgMinEtaGen.node() < o2::aod::smearedtrack::etaSmeared_sa_muon && o2::aod::smearedtrack::etaSmeared_sa_muon < mccuts.cfgMaxEtaGen.node()))); - Partition McNegLeptonsSmeared = o2::aod::mcparticle::pdgCode == mccuts.cfgPdgCodeLepton && ifnode(mccuts.cfgPdgCodeLepton.node() == 11, (mccuts.cfgMinPtGen.node() < o2::aod::smearedtrack::ptSmeared && o2::aod::smearedtrack::ptSmeared < mccuts.cfgMaxPtGen.node()) && (mccuts.cfgMinEtaGen.node() < o2::aod::smearedtrack::etaSmeared && o2::aod::smearedtrack::etaSmeared < mccuts.cfgMaxEtaGen.node()), ifnode(mccuts.cfgMuonTrackType.node() == uint8_t(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack), (mccuts.cfgMinPtGen.node() < o2::aod::smearedtrack::ptSmeared_gl_muon && o2::aod::smearedtrack::ptSmeared_gl_muon < mccuts.cfgMaxPtGen.node()) && (mccuts.cfgMinEtaGen.node() < o2::aod::smearedtrack::etaSmeared_gl_muon && o2::aod::smearedtrack::etaSmeared_gl_muon < mccuts.cfgMaxEtaGen.node()), (mccuts.cfgMinPtGen.node() < o2::aod::smearedtrack::ptSmeared_sa_muon && o2::aod::smearedtrack::ptSmeared_sa_muon < mccuts.cfgMaxPtGen.node()) && (mccuts.cfgMinEtaGen.node() < o2::aod::smearedtrack::etaSmeared_sa_muon && o2::aod::smearedtrack::etaSmeared_sa_muon < mccuts.cfgMaxEtaGen.node()))); + Partition McPosLeptonsSmeared = o2::aod::mcparticle::pdgCode == -mccuts.cfgPdgCodeLepton && ifnode(mccuts.cfgPdgCodeLepton.node() == 11, (mccuts.cfgMinPtGen.node() < o2::aod::smearedtrack::ptSmeared && o2::aod::smearedtrack::ptSmeared < mccuts.cfgMaxPtGen.node()) && (mccuts.cfgMinEtaGen.node() < o2::aod::smearedtrack::etaSmeared && o2::aod::smearedtrack::etaSmeared < mccuts.cfgMaxEtaGen.node()), ifnode(mccuts.cfgMuonTrackType.node() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack), (mccuts.cfgMinPtGen.node() < o2::aod::smearedtrack::ptSmeared_gl_muon && o2::aod::smearedtrack::ptSmeared_gl_muon < mccuts.cfgMaxPtGen.node()) && (mccuts.cfgMinEtaGen.node() < o2::aod::smearedtrack::etaSmeared_gl_muon && o2::aod::smearedtrack::etaSmeared_gl_muon < mccuts.cfgMaxEtaGen.node()), (mccuts.cfgMinPtGen.node() < o2::aod::smearedtrack::ptSmeared_sa_muon && o2::aod::smearedtrack::ptSmeared_sa_muon < mccuts.cfgMaxPtGen.node()) && (mccuts.cfgMinEtaGen.node() < o2::aod::smearedtrack::etaSmeared_sa_muon && o2::aod::smearedtrack::etaSmeared_sa_muon < mccuts.cfgMaxEtaGen.node()))); + Partition McNegLeptonsSmeared = o2::aod::mcparticle::pdgCode == mccuts.cfgPdgCodeLepton && ifnode(mccuts.cfgPdgCodeLepton.node() == 11, (mccuts.cfgMinPtGen.node() < o2::aod::smearedtrack::ptSmeared && o2::aod::smearedtrack::ptSmeared < mccuts.cfgMaxPtGen.node()) && (mccuts.cfgMinEtaGen.node() < o2::aod::smearedtrack::etaSmeared && o2::aod::smearedtrack::etaSmeared < mccuts.cfgMaxEtaGen.node()), ifnode(mccuts.cfgMuonTrackType.node() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack), (mccuts.cfgMinPtGen.node() < o2::aod::smearedtrack::ptSmeared_gl_muon && o2::aod::smearedtrack::ptSmeared_gl_muon < mccuts.cfgMaxPtGen.node()) && (mccuts.cfgMinEtaGen.node() < o2::aod::smearedtrack::etaSmeared_gl_muon && o2::aod::smearedtrack::etaSmeared_gl_muon < mccuts.cfgMaxEtaGen.node()), (mccuts.cfgMinPtGen.node() < o2::aod::smearedtrack::ptSmeared_sa_muon && o2::aod::smearedtrack::ptSmeared_sa_muon < mccuts.cfgMaxPtGen.node()) && (mccuts.cfgMinEtaGen.node() < o2::aod::smearedtrack::etaSmeared_sa_muon && o2::aod::smearedtrack::etaSmeared_sa_muon < mccuts.cfgMaxEtaGen.node()))); void processMC(FilteredMyMcCollisions const& mcCollisions, aod::McParticles const& mcParticles, soa::Join const& bcs, soa::Join const& collisions) { From 97a2f864f6fe8dadbdcc737adb5294ce54d5b7af Mon Sep 17 00:00:00 2001 From: sarjeetagami <162087855+sarjeetagami@users.noreply.github.com> Date: Thu, 6 Mar 2025 05:59:56 +0530 Subject: [PATCH 0567/1650] [PWGLF] : added only TOF PID selection for kstar flow task (#10349) Co-authored-by: sarjeeta gami --- PWGLF/Tasks/Resonances/kstarpbpb.cxx | 112 ++++++++++++++++++++++----- 1 file changed, 92 insertions(+), 20 deletions(-) diff --git a/PWGLF/Tasks/Resonances/kstarpbpb.cxx b/PWGLF/Tasks/Resonances/kstarpbpb.cxx index f18b0e3e607..03f5819c6f9 100644 --- a/PWGLF/Tasks/Resonances/kstarpbpb.cxx +++ b/PWGLF/Tasks/Resonances/kstarpbpb.cxx @@ -114,7 +114,7 @@ struct kstarpbpb { Configurable timFrameEvsel{"timFrameEvsel", false, "TPC Time frame boundary cut"}; Configurable additionalEvselITS{"additionalEvselITS", true, "Additional event selcection for ITS"}; Configurable ispTdepPID{"ispTdepPID", true, "pT dependent PID"}; - Configurable isNoTOF{"isNoTOF", true, "isNoTOF"}; + Configurable isTOFOnly{"isTOFOnly", false, "use TOF only PID"}; Configurable PDGcheck{"PDGcheck", true, "PDGcheck"}; Configurable strategyPID{"strategyPID", 2, "PID strategy"}; Configurable cfgCutTOFBeta{"cfgCutTOFBeta", 0.0, "cut TOF beta"}; @@ -125,6 +125,7 @@ struct kstarpbpb { Configurable nBkgRotations{"nBkgRotations", 9, "Number of rotated copies (background) per each original candidate"}; Configurable fillRotation{"fillRotation", true, "fill rotation"}; Configurable same{"same", true, "same event"}; + Configurable isNoTOF{"isNoTOF", true, "isNoTOF"}; Configurable like{"like", false, "like-sign"}; Configurable fillOccupancy{"fillOccupancy", false, "fill Occupancy"}; Configurable cfgOccupancyCut{"cfgOccupancyCut", 500, "Occupancy cut"}; @@ -421,7 +422,21 @@ struct kstarpbpb { } return false; } - + template + bool selectionPID2(const T& candidate, int PID) + { + if (PID == 0) { + if (candidate.hasTOF() && candidate.beta() > cfgCutTOFBeta && TMath::Abs(candidate.tofNSigmaKa()) < nsigmaCutTOF) { + return true; + } + } + if (PID == 1) { + if (candidate.hasTOF() && candidate.beta() > cfgCutTOFBeta && TMath::Abs(candidate.tofNSigmaPi()) < nsigmaCutTOF) { + return true; + } + } + return false; + } double GetPhiInRange(double phi) { double result = phi; @@ -506,7 +521,10 @@ struct kstarpbpb { } bool track1kaon = false; auto track1ID = track1.globalIndex(); - if (!strategySelectionPID(track1, 0, strategyPID)) { + if (!isTOFOnly && !strategySelectionPID(track1, 0, strategyPID)) { + continue; + } + if (isTOFOnly && !selectionPID2(track1, 0)) { continue; } track1kaon = true; @@ -523,7 +541,10 @@ struct kstarpbpb { } bool track2pion = false; auto track2ID = track2.globalIndex(); - if (!strategySelectionPID(track2, 1, strategyPID)) { + if (!isTOFOnly && !strategySelectionPID(track2, 1, strategyPID)) { + continue; + } + if (isTOFOnly && !selectionPID2(track2, 1)) { continue; } track2pion = true; @@ -670,10 +691,13 @@ struct kstarpbpb { bool track1pion = false; bool track1kaon = false; - if (ispTdepPID && !(selectionPIDNew(track1, 0) || selectionPIDNew(track1, 1))) { + if (ispTdepPID && !isTOFOnly && !(selectionPIDNew(track1, 0) || selectionPIDNew(track1, 1))) { continue; } - if (!ispTdepPID && !(selectionPID(track1, 0) || selectionPID(track1, 1))) { + if (!ispTdepPID && !isTOFOnly && !(selectionPID(track1, 0) || selectionPID(track1, 1))) { + continue; + } + if (isTOFOnly && !(selectionPID2(track1, 0) || selectionPID2(track1, 1))) { continue; } auto track1ID = track1.globalIndex(); @@ -690,10 +714,13 @@ struct kstarpbpb { histos.fill(HIST("QAbefore/trkDCAxypi"), track2.dcaXY()); histos.fill(HIST("QAbefore/trkDCAzpi"), track2.dcaZ()); } - if (ispTdepPID && !(selectionPIDNew(track2, 0) || selectionPIDNew(track2, 1))) { + if (ispTdepPID && !isTOFOnly && !(selectionPIDNew(track2, 0) || selectionPIDNew(track2, 1))) { + continue; + } + if (!ispTdepPID && !isTOFOnly && !(selectionPID(track2, 0) || selectionPID(track2, 1))) { continue; } - if (!ispTdepPID && !(selectionPID(track2, 0) || selectionPID(track2, 1))) { + if (isTOFOnly && !(selectionPID2(track2, 0) || selectionPID2(track2, 1))) { continue; } auto track2ID = track2.globalIndex(); @@ -704,7 +731,7 @@ struct kstarpbpb { continue; } - if (ispTdepPID) { + if (ispTdepPID && !isTOFOnly) { if (selectionPIDNew(track1, 1) && selectionPIDNew(track2, 0)) { track1pion = true; track2kaon = true; @@ -720,7 +747,7 @@ struct kstarpbpb { } } } - if (!ispTdepPID) { + if (!ispTdepPID && !isTOFOnly) { if (selectionPID(track1, 1) && selectionPID(track2, 0)) { track1pion = true; track2kaon = true; @@ -736,6 +763,22 @@ struct kstarpbpb { } } } + if (isTOFOnly) { + if (selectionPID2(track1, 1) && selectionPID2(track2, 0)) { + track1pion = true; + track2kaon = true; + if (removefaketrak && isFakeKaon(track2, 0)) { + continue; + } + } + if (selectionPID2(track2, 1) && selectionPID2(track1, 0)) { + track2pion = true; + track1kaon = true; + if (removefaketrak && isFakeKaon(track1, 0)) { + continue; + } + } + } if (same) { if (track1kaon && track2pion) { if (additionalQAplots) { @@ -852,10 +895,13 @@ struct kstarpbpb { } bool track1pion = false; bool track1kaon = false; - if (ispTdepPID && !(selectionPIDNew(track1, 0) || selectionPIDNew(track1, 1))) { + if (ispTdepPID && !isTOFOnly && !(selectionPIDNew(track1, 0) || selectionPIDNew(track1, 1))) { + continue; + } + if (!ispTdepPID && !isTOFOnly && !(selectionPID(track1, 0) || selectionPID(track1, 1))) { continue; } - if (!ispTdepPID && !(selectionPID(track1, 0) || selectionPID(track1, 1))) { + if (isTOFOnly && !(selectionPID2(track1, 0) || selectionPID2(track1, 1))) { continue; } for (auto track2 : tracks) { @@ -864,17 +910,20 @@ struct kstarpbpb { if (!selectionTrack(track2)) { continue; } - if (ispTdepPID && !(selectionPIDNew(track2, 0) || selectionPIDNew(track2, 1))) { + if (ispTdepPID && !isTOFOnly && !(selectionPIDNew(track2, 0) || selectionPIDNew(track2, 1))) { continue; } - if (!ispTdepPID && !(selectionPID(track2, 0) || selectionPID(track2, 1))) { + if (!ispTdepPID && !isTOFOnly && !(selectionPID(track2, 0) || selectionPID(track2, 1))) { + continue; + } + if (isTOFOnly && !(selectionPID2(track2, 0) || selectionPID2(track2, 1))) { continue; } if (track1.sign() * track2.sign() < 0) { continue; } - if (ispTdepPID) { + if (ispTdepPID && !isTOFOnly) { if (selectionPIDNew(track1, 1) && selectionPIDNew(track2, 0)) { track1pion = true; track2kaon = true; @@ -890,7 +939,7 @@ struct kstarpbpb { } } } - if (!ispTdepPID) { + if (!ispTdepPID && !isTOFOnly) { if (selectionPID(track1, 1) && selectionPID(track2, 0)) { track1pion = true; track2kaon = true; @@ -906,6 +955,22 @@ struct kstarpbpb { } } } + if (isTOFOnly) { + if (selectionPID2(track1, 1) && selectionPID2(track2, 0)) { + track1pion = true; + track2kaon = true; + if (removefaketrak && isFakeKaon(track2, 0)) { + continue; + } + } + if (selectionPID2(track2, 1) && selectionPID2(track1, 0)) { + track2pion = true; + track1kaon = true; + if (removefaketrak && isFakeKaon(track1, 0)) { + continue; + } + } + } if (track1kaon && track2pion) { if (track1.sign() < 0 && track2.sign() < 0) { @@ -1001,18 +1066,25 @@ struct kstarpbpb { if (track2ID == track1ID) { continue; } - if (ispTdepPID && !(selectionPIDNew(track1, 0))) { + if (ispTdepPID && !isTOFOnly && !(selectionPIDNew(track1, 0))) { continue; } - if (ispTdepPID && !(selectionPIDNew(track2, 1))) { + if (ispTdepPID && !isTOFOnly && !(selectionPIDNew(track2, 1))) { continue; } - if (!ispTdepPID && !(selectionPID(track1, 0))) { + if (!ispTdepPID && !isTOFOnly && !(selectionPID(track1, 0))) { + continue; + } + if (!ispTdepPID && !isTOFOnly && !(selectionPID(track2, 1))) { continue; } - if (!ispTdepPID && !(selectionPID(track2, 1))) { + if (isTOFOnly && !selectionPID2(track1, 0)) { continue; } + if (isTOFOnly && !selectionPID2(track2, 1)) { + continue; + } + daughter1 = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); daughter2 = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massPi); KstarMother = daughter1 + daughter2; From aa2115181ab7fdb91450229eb8aa88aabe7f8c20 Mon Sep 17 00:00:00 2001 From: jaimenorman Date: Thu, 6 Mar 2025 01:33:07 +0000 Subject: [PATCH 0568/1650] [PWGJE] add leading track response and fix phi and eta resolution (#10350) --- PWGJE/Tasks/jetFinderQA.cxx | 93 ++++++++++++++++++++++++++++++------- 1 file changed, 77 insertions(+), 16 deletions(-) diff --git a/PWGJE/Tasks/jetFinderQA.cxx b/PWGJE/Tasks/jetFinderQA.cxx index b5b2e24e15b..a43b1cd3414 100644 --- a/PWGJE/Tasks/jetFinderQA.cxx +++ b/PWGJE/Tasks/jetFinderQA.cxx @@ -243,33 +243,45 @@ struct JetFinderQATask { registry.add("h3_jet_r_jet_phi_tag_jet_phi_base_matchedgeo", "#it{R}_{jet};#varphi_{jet}^{tag};#varphi_{jet}^{base}", {HistType::kTH3F, {{jetRadiiBins, ""}, {160, -1.0, 7.}, {160, -1.0, 7.}}}); registry.add("h3_jet_r_jet_ntracks_tag_jet_ntracks_base_matchedgeo", "#it{R}_{jet};N_{jet tracks}^{tag};N_{jet tracks}^{base}", {HistType::kTH3F, {{jetRadiiBins, ""}, {200, -0.5, 199.5}, {200, -0.5, 199.5}}}); registry.add("h3_jet_r_jet_pt_tag_jet_pt_base_diff_matchedgeo", "#it{R}_{jet};#it{p}_{T,jet}^{tag} (GeV/#it{c}); (#it{p}_{T,jet}^{tag} (GeV/#it{c}) - #it{p}_{T,jet}^{base} (GeV/#it{c})) / #it{p}_{T,jet}^{tag} (GeV/#it{c})", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxis, {1000, -5.0, 2.0}}}); - registry.add("h3_jet_r_jet_pt_tag_jet_eta_base_diff_matchedgeo", "#it{R}_{jet};#it{p}_{T,jet}^{tag} (GeV/#it{c}); (#eta_{jet}^{tag} - #eta_{jet}^{base}) / #eta_{jet}^{tag}", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxis, {1000, -5.0, 5.0}}}); - registry.add("h3_jet_r_jet_pt_tag_jet_phi_base_diff_matchedgeo", "#it{R}_{jet};#it{p}_{T,jet}^{tag} (GeV/#it{c}); (#varphi_{jet}^{tag} - #varphi_{jet}^{base}) / #varphi_{jet}^{tag}", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxis, {1000, -5.0, 5.0}}}); + registry.add("h3_jet_r_jet_pt_tag_jet_eta_base_diff_matchedgeo", "#it{R}_{jet};#it{p}_{T,jet}^{tag} (GeV/#it{c}); #eta_{jet}^{tag} - #eta_{jet}^{base}", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxis, {100, -1.0, 1.0}}}); + registry.add("h3_jet_r_jet_pt_tag_jet_phi_base_diff_matchedgeo", "#it{R}_{jet};#it{p}_{T,jet}^{tag} (GeV/#it{c}); #varphi_{jet}^{tag} - #varphi_{jet}^{base}", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxis, {100, -1.0, 1.0}}}); + registry.add("h3_jet_r_jet_pt_tag_leadingtrack_pt_diff_matchedgeo", "#it{R}_{jet};#it{p}_{T,jet}^{tag} (GeV/#it{c}); (#it{p}{T,LT}^{tag} - #it{p}{T,LT}^{base}) / #it{p}{T,LT}^{base}", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxis, {100, -1.0, 1.0}}}); + registry.add("h3_jet_r_jet_pt_tag_leadingtrack_fraction_diff_matchedgeo", "#it{R}_{jet};#it{p}_{T,jet}^{tag} (GeV/#it{c}); (#it{p}{T,LT}^{tag} - #it{p}{T,LT}^{base}) / #it{p}{T,LT}^{base}", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxis, {100, -1.0, 1.0}}}); registry.add("h3_jet_pt_tag_jet_eta_tag_jet_eta_base_matchedgeo", ";#it{p}_{T,jet}^{tag} (GeV/#it{c}); #eta_{jet}^{tag}; #eta_{jet}^{base}", {HistType::kTH3F, {jetPtAxis, jetEtaAxis, jetEtaAxis}}); registry.add("h3_jet_pt_tag_jet_phi_tag_jet_phi_base_matchedgeo", ";#it{p}_{T,jet}^{tag} (GeV/#it{c}); #varphi_{jet}^{tag}; #varphi_{jet}^{base}", {HistType::kTH3F, {jetPtAxis, {160, -1.0, 7.}, {160, -1.0, 7.}}}); registry.add("h3_jet_pt_tag_jet_ntracks_tag_jet_ntracks_base_matchedgeo", ";#it{p}_{T,jet}^{tag} (GeV/#it{c}); N_{jet tracks}^{tag}; N_{jet tracks}^{base}", {HistType::kTH3F, {jetPtAxis, {200, -0.5, 199.5}, {200, -0.5, 199.5}}}); + registry.add("h3_jet_pt_tag_jet_leadingtrack_pt_tag_jet_leadingtrack_pt_base_matchedgeo", ";#it{p}_{T,jet}^{tag} (GeV/#it{c}); #it{p}_{T,LT}^{tag}; #it{p}_{T,LT}^{tag}", {HistType::kTH3F, {jetPtAxis, {200, 0., 100.}, {200, 0., 100.}}}); + registry.add("h3_jet_pt_tag_jet_leadingtrack_fraction_tag_jet_leadingtrack_fraction_base_matchedgeo", ";#it{p}_{T,jet}^{tag} (GeV/#it{c});#it{p}_{T,LT}^{tag} / #it{p}_{T,jet}^{tag} ; #it{p}_{T,LT}^{tag} / #it{p}_{T,jet}^{base}", {HistType::kTH3F, {jetPtAxis, {50, 0., 1.}, {50, 0., 1.}}}); registry.add("h3_jet_r_jet_pt_tag_jet_pt_base_matchedpt", "#it{R}_{jet};#it{p}_{T,jet}^{tag} (GeV/#it{c});#it{p}_{T,jet}^{base} (GeV/#it{c})", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxis, jetPtAxis}}); registry.add("h3_jet_r_jet_eta_tag_jet_eta_base_matchedpt", "#it{R}_{jet};#eta_{jet}^{tag};#eta_{jet}^{base}", {HistType::kTH3F, {{jetRadiiBins, ""}, jetEtaAxis, jetEtaAxis}}); registry.add("h3_jet_r_jet_phi_tag_jet_phi_base_matchedpt", "#it{R}_{jet};#varphi_{jet}^{tag};#varphi_{jet}^{base}", {HistType::kTH3F, {{jetRadiiBins, ""}, {160, -1.0, 7.}, {160, -1.0, 7.}}}); registry.add("h3_jet_r_jet_ntracks_tag_jet_ntracks_base_matchedpt", "#it{R}_{jet};N_{jet tracks}^{tag};N_{jet tracks}^{base}", {HistType::kTH3F, {{jetRadiiBins, ""}, {200, -0.5, 199.5}, {200, -0.5, 199.5}}}); registry.add("h3_jet_r_jet_pt_tag_jet_pt_base_diff_matchedpt", "#it{R}_{jet};#it{p}_{T,jet}^{tag} (GeV/#it{c}); (#it{p}_{T,jet}^{tag} (GeV/#it{c}) - #it{p}_{T,jet}^{base} (GeV/#it{c})) / #it{p}_{T,jet}^{tag} (GeV/#it{c})", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxis, {1000, -5.0, 5.0}}}); - registry.add("h3_jet_r_jet_pt_tag_jet_eta_base_diff_matchedpt", "#it{R}_{jet};#it{p}_{T,jet}^{tag} (GeV/#it{c}); (#eta_{jet}^{tag} - #eta_{jet}^{base}) / #eta_{jet}^{tag}", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxis, {1000, -5.0, 5.0}}}); - registry.add("h3_jet_r_jet_pt_tag_jet_phi_base_diff_matchedpt", "#it{R}_{jet};#it{p}_{T,jet}^{tag} (GeV/#it{c}); (#varphi_{jet}^{tag} - #varphi_{jet}^{base}) / #varphi_{jet}^{tag}", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxis, {1000, -5.0, 5.0}}}); + registry.add("h3_jet_r_jet_pt_tag_jet_eta_base_diff_matchedpt", "#it{R}_{jet};#it{p}_{T,jet}^{tag} (GeV/#it{c}); #eta_{jet}^{tag} - #eta_{jet}^{base}", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxis, {100, -1.0, 1.0}}}); + registry.add("h3_jet_r_jet_pt_tag_jet_phi_base_diff_matchedpt", "#it{R}_{jet};#it{p}_{T,jet}^{tag} (GeV/#it{c}); #varphi_{jet}^{tag} - #varphi_{jet}^{base}", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxis, {100, -1.0, 1.0}}}); + registry.add("h3_jet_r_jet_pt_tag_leadingtrack_pt_diff_matchedpt", "#it{R}_{jet};#it{p}_{T,jet}^{tag} (GeV/#it{c}); (#it{p}{T,LT}^{tag} - #it{p}{T,LT}^{base}) / #it{p}{T,LT}^{base}", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxis, {500, -5.0, 5.0}}}); + registry.add("h3_jet_r_jet_pt_tag_leadingtrack_fraction_diff_matchedpt", "#it{R}_{jet};#it{p}_{T,jet}^{tag} (GeV/#it{c}); (#it{p}{T,LT}^{tag} - #it{p}{T,LT}^{base}) / #it{p}{T,LT}^{base}", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxis, {100, -1.0, 1.0}}}); registry.add("h3_jet_pt_tag_jet_eta_tag_jet_eta_base_matchedpt", ";#it{p}_{T,jet}^{tag} (GeV/#it{c}); #eta_{jet}^{tag}; #eta_{jet}^{base}", {HistType::kTH3F, {jetPtAxis, jetEtaAxis, jetEtaAxis}}); registry.add("h3_jet_pt_tag_jet_phi_tag_jet_phi_base_matchedpt", ";#it{p}_{T,jet}^{tag} (GeV/#it{c}); #varphi_{jet}^{tag}; #varphi_{jet}^{base}", {HistType::kTH3F, {jetPtAxis, {160, -1.0, 7.}, {160, -1.0, 7.}}}); registry.add("h3_jet_pt_tag_jet_ntracks_tag_jet_ntracks_base_matchedpt", ";#it{p}_{T,jet}^{tag} (GeV/#it{c}); N_{jet tracks}^{tag}; N_{jet tracks}^{base}", {HistType::kTH3F, {jetPtAxis, {200, -0.5, 199.5}, {200, -0.5, 199.5}}}); + registry.add("h3_jet_pt_tag_jet_leadingtrack_pt_tag_jet_leadingtrack_pt_base_matchedpt", ";#it{p}_{T,jet}^{tag} (GeV/#it{c}); #it{p}_{T,LT}^{tag}; #it{p}_{T,LT}^{tag}", {HistType::kTH3F, {jetPtAxis, {200, 0., 100.}, {200, 0., 100.}}}); + registry.add("h3_jet_pt_tag_jet_leadingtrack_fraction_tag_jet_leadingtrack_fraction_base_matchedpt", ";#it{p}_{T,jet}^{tag} (GeV/#it{c});#it{p}_{T,LT}^{tag} / #it{p}_{T,jet}^{tag} ; #it{p}_{T,LT}^{tag} / #it{p}_{T,jet}^{base}", {HistType::kTH3F, {jetPtAxis, {50, 0., 1.}, {50, 0., 1.}}}); registry.add("h3_jet_r_jet_pt_tag_jet_pt_base_matchedgeopt", "#it{R}_{jet};#it{p}_{T,jet}^{tag} (GeV/#it{c});#it{p}_{T,jet}^{base} (GeV/#it{c})", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxis, jetPtAxis}}); registry.add("h3_jet_r_jet_eta_tag_jet_eta_base_matchedgeopt", "#it{R}_{jet};#eta_{jet}^{tag};#eta_{jet}^{base}", {HistType::kTH3F, {{jetRadiiBins, ""}, jetEtaAxis, jetEtaAxis}}); registry.add("h3_jet_r_jet_phi_tag_jet_phi_base_matchedgeopt", "#it{R}_{jet};#varphi_{jet}^{tag};#varphi_{jet}^{base}", {HistType::kTH3F, {{jetRadiiBins, ""}, {160, -1.0, 7.}, {160, -1.0, 7.}}}); registry.add("h3_jet_r_jet_ntracks_tag_jet_ntracks_base_matchedgeopt", "#it{R}_{jet};N_{jet tracks}^{tag};N_{jet tracks}^{base}", {HistType::kTH3F, {{jetRadiiBins, ""}, {200, -0.5, 199.5}, {200, -0.5, 199.5}}}); registry.add("h3_jet_r_jet_pt_tag_jet_pt_base_diff_matchedgeopt", "#it{R}_{jet};#it{p}_{T,jet}^{tag} (GeV/#it{c}); (#it{p}_{T,jet}^{tag} (GeV/#it{c}) - #it{p}_{T,jet}^{base} (GeV/#it{c})) / #it{p}_{T,jet}^{tag} (GeV/#it{c})", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxis, {1000, -5.0, 5.0}}}); - registry.add("h3_jet_r_jet_pt_tag_jet_eta_base_diff_matchedgeopt", "#it{R}_{jet};#it{p}_{T,jet}^{tag} (GeV/#it{c}); (#eta_{jet}^{tag} - #eta_{jet}^{base}) / #eta_{jet}^{tag}", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxis, {1000, -5.0, 5.0}}}); - registry.add("h3_jet_r_jet_pt_tag_jet_phi_base_diff_matchedgeopt", "#it{R}_{jet};#it{p}_{T,jet}^{tag} (GeV/#it{c}); (#varphi_{jet}^{tag} - #varphi_{jet}^{base}) / #varphi_{jet}^{tag}", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxis, {1000, -5.0, 5.0}}}); + registry.add("h3_jet_r_jet_pt_tag_jet_eta_base_diff_matchedgeopt", "#it{R}_{jet};#it{p}_{T,jet}^{tag} (GeV/#it{c}); #eta_{jet}^{tag} - #eta_{jet}^{base}", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxis, {100, -1.0, 1.0}}}); + registry.add("h3_jet_r_jet_pt_tag_jet_phi_base_diff_matchedgeopt", "#it{R}_{jet};#it{p}_{T,jet}^{tag} (GeV/#it{c}); #varphi_{jet}^{tag} - #varphi_{jet}^{base}", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxis, {100, -1.0, 1.0}}}); + registry.add("h3_jet_r_jet_pt_tag_leadingtrack_pt_diff_matchedgeopt", "#it{R}_{jet};#it{p}_{T,jet}^{tag} (GeV/#it{c}); (#it{p}{T,LT}^{tag} - #it{p}{T,LT}^{base}) / #it{p}{T,LT}^{base}", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxis, {500, -5.0, 5.0}}}); + registry.add("h3_jet_r_jet_pt_tag_leadingtrack_fraction_diff_matchedgeopt", "#it{R}_{jet};#it{p}_{T,jet}^{tag} (GeV/#it{c}); (#it{p}{T,LT}^{tag} - #it{p}{T,LT}^{base}) / #it{p}{T,LT}^{base}", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxis, {100, -1.0, 1.0}}}); registry.add("h3_jet_pt_tag_jet_eta_tag_jet_eta_base_matchedgeopt", ";#it{p}_{T,jet}^{tag} (GeV/#it{c}); #eta_{jet}^{tag}; #eta_{jet}^{base}", {HistType::kTH3F, {jetPtAxis, jetEtaAxis, jetEtaAxis}}); registry.add("h3_jet_pt_tag_jet_phi_tag_jet_phi_base_matchedgeopt", ";#it{p}_{T,jet}^{tag} (GeV/#it{c}); #varphi_{jet}^{tag}; #varphi_{jet}^{base}", {HistType::kTH3F, {jetPtAxis, {160, -1.0, 7.}, {160, -1.0, 7.}}}); registry.add("h3_jet_pt_tag_jet_ntracks_tag_jet_ntracks_base_matchedgeopt", ";#it{p}_{T,jet}^{tag} (GeV/#it{c}); N_{jet tracks}^{tag}; N_{jet tracks}^{base}", {HistType::kTH3F, {jetPtAxis, {200, -0.5, 199.5}, {200, -0.5, 199.5}}}); + registry.add("h3_jet_pt_tag_jet_leadingtrack_pt_tag_jet_leadingtrack_pt_base_matchedgeopt", ";#it{p}_{T,jet}^{tag} (GeV/#it{c}); #it{p}_{T,LT}^{tag}; #it{p}_{T,LT}^{tag}", {HistType::kTH3F, {jetPtAxis, {200, 0., 100.}, {200, 0., 100.}}}); + registry.add("h3_jet_pt_tag_jet_leadingtrack_fraction_tag_jet_leadingtrack_fraction_base_matchedgeopt", ";#it{p}_{T,jet}^{tag} (GeV/#it{c});#it{p}_{T,LT}^{tag} / #it{p}_{T,jet}^{tag} ; #it{p}_{T,LT}^{tag} / #it{p}_{T,jet}^{base}", {HistType::kTH3F, {jetPtAxis, {50, 0., 1.}, {50, 0., 1.}}}); registry.add("h3_ptcut_jet_pt_tag_jet_pt_base_matchedgeo", "N;#it{p}_{T,jet}^{tag} (GeV/#it{c});#it{p}_{T,jet}^{base} (GeV/#it{c})", {HistType::kTH3F, {{20, 0., 5.}, {300, 0., 300.}, {300, 0., 300.}}}); } @@ -533,7 +545,7 @@ struct JetFinderQATask { } template - void fillMatchedHistograms(T const& jetBase, float weight = 1.0) + void fillMatchedHistograms(T const& jetBase, float leadingTrackPtBase, float weight = 1.0) { float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); if (jetBase.pt() > pTHatMaxMCD * pTHat || pTHat < pTHatAbsoluteMin) { @@ -549,9 +561,18 @@ struct JetFinderQATask { registry.fill(HIST("h3_jet_r_jet_eta_tag_jet_eta_base_matchedgeo"), jetBase.r() / 100.0, jetTag.eta(), jetBase.eta(), weight); registry.fill(HIST("h3_jet_r_jet_phi_tag_jet_phi_base_matchedgeo"), jetBase.r() / 100.0, jetTag.phi(), jetBase.phi(), weight); registry.fill(HIST("h3_jet_r_jet_ntracks_tag_jet_ntracks_base_matchedgeo"), jetBase.r() / 100.0, jetTag.tracksIds().size(), jetBase.tracksIds().size(), weight); + registry.fill(HIST("h3_jet_r_jet_pt_tag_jet_pt_base_matchedgeo"), jetBase.r() / 100.0, jetTag.pt(), jetBase.pt(), weight); registry.fill(HIST("h3_jet_r_jet_pt_tag_jet_pt_base_diff_matchedgeo"), jetBase.r() / 100.0, jetTag.pt(), (jetTag.pt() - jetBase.pt()) / jetTag.pt(), weight); - registry.fill(HIST("h3_jet_r_jet_pt_tag_jet_eta_base_diff_matchedgeo"), jetBase.r() / 100.0, jetTag.pt(), (jetTag.eta() - jetBase.eta()) / jetTag.eta(), weight); - registry.fill(HIST("h3_jet_r_jet_pt_tag_jet_phi_base_diff_matchedgeo"), jetBase.r() / 100.0, jetTag.pt(), (jetTag.phi() - jetBase.phi()) / jetTag.phi(), weight); + registry.fill(HIST("h3_jet_r_jet_pt_tag_jet_eta_base_diff_matchedgeo"), jetBase.r() / 100.0, jetTag.pt(), jetTag.eta() - jetBase.eta(), weight); + registry.fill(HIST("h3_jet_r_jet_pt_tag_jet_phi_base_diff_matchedgeo"), jetBase.r() / 100.0, jetTag.pt(), jetTag.phi() - jetBase.phi(), weight); + float leadingTrackPtTag = 0.; + for (auto& constituent : jetTag.template tracks_as()) { + if (constituent.pt() > leadingTrackPtTag) { + leadingTrackPtTag = constituent.pt(); + } + } + registry.fill(HIST("h3_jet_r_jet_pt_tag_leadingtrack_pt_diff_matchedgeo"), jetBase.r() / 100.0, jetTag.pt(), (leadingTrackPtTag - leadingTrackPtBase) / leadingTrackPtTag, weight); + registry.fill(HIST("h3_jet_r_jet_pt_tag_leadingtrack_fraction_diff_matchedgeo"), jetBase.r() / 100.0, jetTag.pt(), (leadingTrackPtTag / jetTag.pt()) - (leadingTrackPtBase / jetBase.pt()), weight); for (int N = 1; N < 21; N++) { if (jetBase.pt() < N * 0.25 * pTHat && jetTag.pt() < N * 0.25 * pTHat) { @@ -563,6 +584,8 @@ struct JetFinderQATask { registry.fill(HIST("h3_jet_pt_tag_jet_eta_tag_jet_eta_base_matchedgeo"), jetTag.pt(), jetTag.eta(), jetBase.eta(), weight); registry.fill(HIST("h3_jet_pt_tag_jet_phi_tag_jet_phi_base_matchedgeo"), jetTag.pt(), jetTag.phi(), jetBase.phi(), weight); registry.fill(HIST("h3_jet_pt_tag_jet_ntracks_tag_jet_ntracks_base_matchedgeo"), jetTag.pt(), jetTag.tracksIds().size(), jetBase.tracksIds().size(), weight); + registry.fill(HIST("h3_jet_pt_tag_jet_leadingtrack_pt_tag_jet_leadingtrack_pt_base_matchedgeo"), jetTag.pt(), leadingTrackPtTag, leadingTrackPtBase, weight); + registry.fill(HIST("h3_jet_pt_tag_jet_leadingtrack_fraction_tag_jet_leadingtrack_fraction_base_matchedgeo"), jetTag.pt(), leadingTrackPtTag / jetTag.pt(), leadingTrackPtBase / jetBase.pt(), weight); } } } @@ -576,13 +599,23 @@ struct JetFinderQATask { registry.fill(HIST("h3_jet_r_jet_phi_tag_jet_phi_base_matchedpt"), jetBase.r() / 100.0, jetTag.phi(), jetBase.phi(), weight); registry.fill(HIST("h3_jet_r_jet_ntracks_tag_jet_ntracks_base_matchedpt"), jetBase.r() / 100.0, jetTag.tracksIds().size(), jetBase.tracksIds().size(), weight); registry.fill(HIST("h3_jet_r_jet_pt_tag_jet_pt_base_diff_matchedpt"), jetBase.r() / 100.0, jetTag.pt(), (jetTag.pt() - jetBase.pt()) / jetTag.pt(), weight); - registry.fill(HIST("h3_jet_r_jet_pt_tag_jet_eta_base_diff_matchedpt"), jetBase.r() / 100.0, jetTag.pt(), (jetTag.eta() - jetBase.eta()) / jetTag.eta(), weight); - registry.fill(HIST("h3_jet_r_jet_pt_tag_jet_phi_base_diff_matchedpt"), jetBase.r() / 100.0, jetTag.pt(), (jetTag.phi() - jetBase.phi()) / jetTag.phi(), weight); + registry.fill(HIST("h3_jet_r_jet_pt_tag_jet_eta_base_diff_matchedpt"), jetBase.r() / 100.0, jetTag.pt(), jetTag.eta() - jetBase.eta(), weight); + registry.fill(HIST("h3_jet_r_jet_pt_tag_jet_phi_base_diff_matchedpt"), jetBase.r() / 100.0, jetTag.pt(), jetTag.phi() - jetBase.phi(), weight); + float leadingTrackPtTag = 0.; + for (auto& constituent : jetTag.template tracks_as()) { + if (constituent.pt() > leadingTrackPtTag) { + leadingTrackPtTag = constituent.pt(); + } + } + registry.fill(HIST("h3_jet_r_jet_pt_tag_leadingtrack_pt_diff_matchedpt"), jetBase.r() / 100.0, jetTag.pt(), (leadingTrackPtTag - leadingTrackPtBase) / leadingTrackPtTag, weight); + registry.fill(HIST("h3_jet_r_jet_pt_tag_leadingtrack_fraction_diff_matchedpt"), jetBase.r() / 100.0, jetTag.pt(), (leadingTrackPtTag / jetTag.pt()) - (leadingTrackPtBase / jetBase.pt()), weight); if (jetBase.r() == round(selectedJetsRadius * 100.0f)) { registry.fill(HIST("h3_jet_pt_tag_jet_eta_tag_jet_eta_base_matchedpt"), jetTag.pt(), jetTag.eta(), jetBase.eta(), weight); registry.fill(HIST("h3_jet_pt_tag_jet_phi_tag_jet_phi_base_matchedpt"), jetTag.pt(), jetTag.phi(), jetBase.phi(), weight); registry.fill(HIST("h3_jet_pt_tag_jet_ntracks_tag_jet_ntracks_base_matchedpt"), jetTag.pt(), jetTag.tracksIds().size(), jetBase.tracksIds().size(), weight); + registry.fill(HIST("h3_jet_pt_tag_jet_leadingtrack_pt_tag_jet_leadingtrack_pt_base_matchedpt"), jetTag.pt(), leadingTrackPtTag, leadingTrackPtBase, weight); + registry.fill(HIST("h3_jet_pt_tag_jet_leadingtrack_fraction_tag_jet_leadingtrack_fraction_base_matchedpt"), jetTag.pt(), leadingTrackPtTag / jetTag.pt(), leadingTrackPtBase / jetBase.pt(), weight); } } } @@ -600,13 +633,23 @@ struct JetFinderQATask { registry.fill(HIST("h3_jet_r_jet_phi_tag_jet_phi_base_matchedgeopt"), jetBase.r() / 100.0, jetTag.phi(), jetBase.phi(), weight); registry.fill(HIST("h3_jet_r_jet_ntracks_tag_jet_ntracks_base_matchedgeopt"), jetBase.r() / 100.0, jetTag.tracksIds().size(), jetBase.tracksIds().size(), weight); registry.fill(HIST("h3_jet_r_jet_pt_tag_jet_pt_base_diff_matchedgeopt"), jetBase.r() / 100.0, jetTag.pt(), (jetTag.pt() - jetBase.pt()) / jetTag.pt(), weight); - registry.fill(HIST("h3_jet_r_jet_pt_tag_jet_eta_base_diff_matchedgeopt"), jetBase.r() / 100.0, jetTag.pt(), (jetTag.eta() - jetBase.eta()) / jetTag.eta(), weight); - registry.fill(HIST("h3_jet_r_jet_pt_tag_jet_phi_base_diff_matchedgeopt"), jetBase.r() / 100.0, jetTag.pt(), (jetTag.phi() - jetBase.phi()) / jetTag.phi(), weight); + registry.fill(HIST("h3_jet_r_jet_pt_tag_jet_eta_base_diff_matchedgeopt"), jetBase.r() / 100.0, jetTag.pt(), jetTag.eta() - jetBase.eta(), weight); + registry.fill(HIST("h3_jet_r_jet_pt_tag_jet_phi_base_diff_matchedgeopt"), jetBase.r() / 100.0, jetTag.pt(), jetTag.phi() - jetBase.phi(), weight); + float leadingTrackPtTag = 0.; + for (auto& constituent : jetTag.template tracks_as()) { + if (constituent.pt() > leadingTrackPtTag) { + leadingTrackPtTag = constituent.pt(); + } + } + registry.fill(HIST("h3_jet_r_jet_pt_tag_leadingtrack_pt_diff_matchedgeopt"), jetBase.r() / 100.0, jetTag.pt(), (leadingTrackPtTag - leadingTrackPtBase) / leadingTrackPtTag, weight); + registry.fill(HIST("h3_jet_r_jet_pt_tag_leadingtrack_fraction_diff_matchedgeopt"), jetBase.r() / 100.0, jetTag.pt(), (leadingTrackPtTag / jetTag.pt()) - (leadingTrackPtBase / jetBase.pt()), weight); if (jetBase.r() == round(selectedJetsRadius * 100.0f)) { registry.fill(HIST("h3_jet_pt_tag_jet_eta_tag_jet_eta_base_matchedgeopt"), jetTag.pt(), jetTag.eta(), jetBase.eta(), weight); registry.fill(HIST("h3_jet_pt_tag_jet_phi_tag_jet_phi_base_matchedgeopt"), jetTag.pt(), jetTag.phi(), jetBase.phi(), weight); registry.fill(HIST("h3_jet_pt_tag_jet_ntracks_tag_jet_ntracks_base_matchedgeopt"), jetTag.pt(), jetTag.tracksIds().size(), jetBase.tracksIds().size(), weight); + registry.fill(HIST("h3_jet_pt_tag_jet_leadingtrack_pt_tag_jet_leadingtrack_pt_base_matchedgeopt"), jetTag.pt(), leadingTrackPtTag, leadingTrackPtBase, weight); + registry.fill(HIST("h3_jet_pt_tag_jet_leadingtrack_fraction_tag_jet_leadingtrack_fraction_base_matchedgeopt"), jetTag.pt(), leadingTrackPtTag / jetTag.pt(), leadingTrackPtBase / jetBase.pt(), weight); } } } @@ -822,7 +865,13 @@ struct JetFinderQATask { if (!isAcceptedJet(jet)) { continue; } - fillMatchedHistograms::iterator, soa::Join>(jet); + float leadingTrackPtBase = 0.; + for (auto& constituent : jet.template tracks_as()) { + if (constituent.pt() > leadingTrackPtBase) { + leadingTrackPtBase = constituent.pt(); + } + } + fillMatchedHistograms::iterator, soa::Join>(jet, leadingTrackPtBase); } } PROCESS_SWITCH(JetFinderQATask, processJetsSubMatched, "jet finder QA matched unsubtracted and constituent subtracted jets", false); @@ -926,7 +975,13 @@ struct JetFinderQATask { if (!isAcceptedJet(mcdjet)) { continue; } - fillMatchedHistograms::iterator, soa::Join>(mcdjet); + float leadingTrackPtBase = 0.; + for (auto& constituent : mcdjet.template tracks_as()) { + if (constituent.pt() > leadingTrackPtBase) { + leadingTrackPtBase = constituent.pt(); + } + } + fillMatchedHistograms::iterator, soa::Join>(mcdjet, leadingTrackPtBase); } } PROCESS_SWITCH(JetFinderQATask, processJetsMCPMCDMatched, "jet finder QA matched mcp and mcd", false); @@ -946,7 +1001,13 @@ struct JetFinderQATask { if (!isAcceptedJet(mcdjet)) { continue; } - fillMatchedHistograms::iterator, soa::Join>(mcdjet, mcdjet.eventWeight()); + float leadingTrackPtBase = 0.; + for (auto& constituent : mcdjet.template tracks_as()) { + if (constituent.pt() > leadingTrackPtBase) { + leadingTrackPtBase = constituent.pt(); + } + } + fillMatchedHistograms::iterator, soa::Join>(mcdjet, leadingTrackPtBase, mcdjet.eventWeight()); } } PROCESS_SWITCH(JetFinderQATask, processJetsMCPMCDMatchedWeighted, "jet finder QA matched mcp and mcd with weighted events", false); From e20a5bd272b455b4acbe8fb8d1810cf9a8b8d89c Mon Sep 17 00:00:00 2001 From: nzardosh Date: Thu, 6 Mar 2025 03:06:06 +0100 Subject: [PATCH 0569/1650] [PWGJE] Fixing MCD dependency in MCP only process functions for HF substructure (#10352) --- PWGJE/Core/JetCandidateUtilities.h | 18 ----- PWGJE/Core/JetDQUtilities.h | 16 ---- PWGJE/Core/JetHFUtilities.h | 22 ------ PWGJE/DataModel/JetReducedDataDQ.h | 26 ++++--- PWGJE/DataModel/JetReducedDataHF.h | 77 +++++++++++-------- PWGJE/TableProducer/derivedDataProducer.cxx | 2 + PWGJE/TableProducer/derivedDataWriter.cxx | 23 +++--- PWGJE/Tasks/jetSubstructureBplusOutput.cxx | 2 +- PWGJE/Tasks/jetSubstructureD0Output.cxx | 2 +- .../Tasks/jetSubstructureDielectronOutput.cxx | 2 +- PWGJE/Tasks/jetSubstructureDplusOutput.cxx | 2 +- PWGJE/Tasks/jetSubstructureHFOutput.cxx | 31 ++++---- PWGJE/Tasks/jetSubstructureLcOutput.cxx | 2 +- 13 files changed, 98 insertions(+), 127 deletions(-) diff --git a/PWGJE/Core/JetCandidateUtilities.h b/PWGJE/Core/JetCandidateUtilities.h index 148e6b4567f..7a958fff88f 100644 --- a/PWGJE/Core/JetCandidateUtilities.h +++ b/PWGJE/Core/JetCandidateUtilities.h @@ -237,24 +237,6 @@ auto slicedPerCandidate(T const& table, U const& candidate, V const& perD0Candid } } -/** - * returns a slice of the table depending on the type of the candidate and index of the collision - * - * @param candidate candidate that is being checked - * @param table the table to be sliced - */ -template -auto slicedPerCandidateCollision(T const& table, U const& candidates, V const& collision, M const& D0CollisionPerCollision, N const& DplusCollisionPerCollision, O const& LcCollisionPerCollision, P const& BplusCollisionPerCollision, Q const& DielectronCollisionPerCollision) -{ - if constexpr (jethfutilities::isHFTable() || jethfutilities::isHFMcTable()) { - return jethfutilities::slicedPerHFCollision(table, candidates, collision, D0CollisionPerCollision, DplusCollisionPerCollision, LcCollisionPerCollision, BplusCollisionPerCollision); - } else if constexpr (jetdqutilities::isDielectronTable() || jetdqutilities::isDielectronMcTable()) { - return jetdqutilities::slicedPerDielectronCollision(table, candidates, collision, DielectronCollisionPerCollision); - } else { - return table; - } -} - /** * returns a slice of the table depending on the index of the candidate * @param CandidateTable candidtae table type diff --git a/PWGJE/Core/JetDQUtilities.h b/PWGJE/Core/JetDQUtilities.h index 4282e00e37c..c5fb2117e81 100644 --- a/PWGJE/Core/JetDQUtilities.h +++ b/PWGJE/Core/JetDQUtilities.h @@ -164,22 +164,6 @@ auto slicedPerDielectronCandidate(T const& table, U const& candidate, V const& p } } -/** - * returns a slice of the table depending on the type of the Dielectron candidate and index of the collision - * - * @param candidate dielectron candidate that is being checked - * @param table the table to be sliced - */ -template -auto slicedPerDielectronCollision(T const& table, U const& /*candidates*/, V const& collision, M const& DielectronCollisionPerCollision) -{ - if constexpr (isDielectronTable() || isDielectronMcTable()) { - return table.sliceBy(DielectronCollisionPerCollision, collision.globalIndex()); - } else { - return table; - } -} - /** * returns a slice of the table depending on the index of the Dielectron jet * @param DielectronTable dielectron table type diff --git a/PWGJE/Core/JetHFUtilities.h b/PWGJE/Core/JetHFUtilities.h index 3038086354e..97394dd6a70 100644 --- a/PWGJE/Core/JetHFUtilities.h +++ b/PWGJE/Core/JetHFUtilities.h @@ -418,28 +418,6 @@ auto slicedPerHFCandidate(T const& table, U const& candidate, V const& perD0Cand } } -/** - * returns a slice of the table depending on the type of the HF candidate and index of the collision - * - * @param candidate HF candidate that is being checked - * @param table the table to be sliced - */ -template -auto slicedPerHFCollision(T const& table, U const& /*candidates*/, V const& collision, M const& D0CollisionPerCollision, N const& DplusCollisionPerCollision, O const& LcCollisionPerCollision, P const& BplusCollisionPerCollision) -{ - if constexpr (isD0Table() || isD0McTable()) { - return table.sliceBy(D0CollisionPerCollision, collision.globalIndex()); - } else if constexpr (isDplusTable() || isDplusMcTable()) { - return table.sliceBy(DplusCollisionPerCollision, collision.globalIndex()); - } else if constexpr (isLcTable() || isLcMcTable()) { - return table.sliceBy(LcCollisionPerCollision, collision.globalIndex()); - } else if constexpr (isBplusTable() || isBplusMcTable()) { - return table.sliceBy(BplusCollisionPerCollision, collision.globalIndex()); - } else { - return table; - } -} - /** * returns a slice of the table depending on the index of the HF candidate * diff --git a/PWGJE/DataModel/JetReducedDataDQ.h b/PWGJE/DataModel/JetReducedDataDQ.h index a5779ebd3b4..bbf2e464cf9 100644 --- a/PWGJE/DataModel/JetReducedDataDQ.h +++ b/PWGJE/DataModel/JetReducedDataDQ.h @@ -22,9 +22,14 @@ #include "Framework/AnalysisDataModel.h" #include "PWGDQ/DataModel/ReducedInfoTables.h" #include "PWGJE/DataModel/JetReducedData.h" +#include "PWGJE/DataModel/JetReducedDataHF.h" namespace o2::aod { +namespace jdielectronmccollision +{ +DECLARE_SOA_COLUMN(DummyDQ, dummyDQ, bool); +} // namespace jdielectronmccollision DECLARE_SOA_TABLE_STAGED(JDielectronMcCollisions, "JDIELMCCOLL", o2::soa::Index<>, @@ -32,26 +37,29 @@ DECLARE_SOA_TABLE_STAGED(JDielectronMcCollisions, "JDIELMCCOLL", jmccollision::PosY, jmccollision::PosZ); +DECLARE_SOA_TABLE_STAGED(JDielectronMcRCollDummys, "JDIELMCRCOLLDUM", + jdielectronmccollision::DummyDQ); + namespace jdielectronindices { -DECLARE_SOA_INDEX_COLUMN(JCollision, collision); DECLARE_SOA_INDEX_COLUMN_CUSTOM(JDielectronMcCollision, dielectronmccollision, "JDIELMCCOLLS"); DECLARE_SOA_INDEX_COLUMN_FULL(Prong0, prong0, int, JTracks, "_0"); DECLARE_SOA_INDEX_COLUMN_FULL(Prong1, prong1, int, JTracks, "_1"); -DECLARE_SOA_INDEX_COLUMN(JMcCollision, mcCollision); -DECLARE_SOA_INDEX_COLUMN(JMcParticle, mcParticle); } // namespace jdielectronindices DECLARE_SOA_TABLE_STAGED(JDielectronCollisionIds, "JDIELCOLLID", - jdielectronindices::JCollisionId); + jcandidateindices::JCollisionId, + o2::soa::Marker); DECLARE_SOA_TABLE_STAGED(JDielectronMcCollisionIds, "JDIELMCCOLLID", - jdielectronindices::JMcCollisionId); + jcandidateindices::JMcCollisionId, + o2::soa::Marker); DECLARE_SOA_TABLE_STAGED(JDielectronIds, "JDIELID", - jdielectronindices::JCollisionId, + jcandidateindices::JCollisionId, jdielectronindices::Prong0Id, - jdielectronindices::Prong1Id); + jdielectronindices::Prong1Id, + o2::soa::Marker); namespace jdielectronmc { @@ -103,8 +111,8 @@ using JDielectronMc = JDielectronMcs::iterator; using StoredJDielectronMc = StoredJDielectronMcs::iterator; DECLARE_SOA_TABLE_STAGED(JDielectronMcIds, "JDIELMCID", - jdielectronindices::JMcCollisionId, - jdielectronindices::JMcParticleId, + jcandidateindices::JMcCollisionId, + jcandidateindices::JMcParticleId, jdielectronmc::MothersIds, jdielectronmc::DaughtersIdSlice); diff --git a/PWGJE/DataModel/JetReducedDataHF.h b/PWGJE/DataModel/JetReducedDataHF.h index fe8b9270f7e..cdb2a933d20 100644 --- a/PWGJE/DataModel/JetReducedDataHF.h +++ b/PWGJE/DataModel/JetReducedDataHF.h @@ -26,29 +26,42 @@ namespace o2::aod { -namespace jd0indices +constexpr uint JMarkerD0 = 1; +constexpr uint JMarkerDplus = 2; +constexpr uint JMarkerLc = 3; +constexpr uint JMarkerBplus = 4; +constexpr uint JMarkerDielectron = 5; + +namespace jcandidateindices { DECLARE_SOA_INDEX_COLUMN(JCollision, collision); -DECLARE_SOA_INDEX_COLUMN_FULL(Prong0, prong0, int, JTracks, "_0"); -DECLARE_SOA_INDEX_COLUMN_FULL(Prong1, prong1, int, JTracks, "_1"); DECLARE_SOA_INDEX_COLUMN(JMcCollision, mcCollision); DECLARE_SOA_INDEX_COLUMN(JMcParticle, mcParticle); +} // namespace jcandidateindices + +namespace jd0indices +{ +DECLARE_SOA_INDEX_COLUMN_FULL(Prong0, prong0, int, JTracks, "_0"); +DECLARE_SOA_INDEX_COLUMN_FULL(Prong1, prong1, int, JTracks, "_1"); } // namespace jd0indices DECLARE_SOA_TABLE_STAGED(JD0CollisionIds, "JD0COLLID", - jd0indices::JCollisionId); + jcandidateindices::JCollisionId, + o2::soa::Marker); DECLARE_SOA_TABLE_STAGED(JD0McCollisionIds, "JD0MCCOLLID", - jd0indices::JMcCollisionId); + jcandidateindices::JMcCollisionId, + o2::soa::Marker); DECLARE_SOA_TABLE_STAGED(JD0Ids, "JD0ID", - jd0indices::JCollisionId, + jcandidateindices::JCollisionId, jd0indices::Prong0Id, jd0indices::Prong1Id); DECLARE_SOA_TABLE_STAGED(JD0PIds, "JD0PID", - jd0indices::JMcCollisionId, - jd0indices::JMcParticleId); + jcandidateindices::JMcCollisionId, + jcandidateindices::JMcParticleId, + o2::soa::Marker); namespace jdummyd0 { @@ -65,29 +78,29 @@ DECLARE_SOA_TABLE(JDumD0MlDaus, "AOD", "JDumD0MLDAU", namespace jdplusindices { -DECLARE_SOA_INDEX_COLUMN(JCollision, collision); DECLARE_SOA_INDEX_COLUMN_FULL(Prong0, prong0, int, JTracks, "_0"); DECLARE_SOA_INDEX_COLUMN_FULL(Prong1, prong1, int, JTracks, "_1"); DECLARE_SOA_INDEX_COLUMN_FULL(Prong2, prong2, int, JTracks, "_2"); -DECLARE_SOA_INDEX_COLUMN(JMcCollision, mcCollision); -DECLARE_SOA_INDEX_COLUMN(JMcParticle, mcParticle); } // namespace jdplusindices DECLARE_SOA_TABLE_STAGED(JDplusCollisionIds, "JDPCOLLID", - jdplusindices::JCollisionId); + jcandidateindices::JCollisionId, + o2::soa::Marker); DECLARE_SOA_TABLE_STAGED(JDplusMcCollisionIds, "JDPMCCOLLID", - jdplusindices::JMcCollisionId); + jcandidateindices::JMcCollisionId, + o2::soa::Marker); DECLARE_SOA_TABLE_STAGED(JDplusIds, "JDPID", - jdplusindices::JCollisionId, + jcandidateindices::JCollisionId, jdplusindices::Prong0Id, jdplusindices::Prong1Id, jdplusindices::Prong2Id); DECLARE_SOA_TABLE_STAGED(JDplusPIds, "JDPPID", - jdplusindices::JMcCollisionId, - jdplusindices::JMcParticleId); + jcandidateindices::JMcCollisionId, + jcandidateindices::JMcParticleId, + o2::soa::Marker); namespace jdummydplus { @@ -105,29 +118,29 @@ DECLARE_SOA_TABLE(JDumDplusMlDaus, "AOD", "JDUMDPMLDAU", namespace jlcindices { -DECLARE_SOA_INDEX_COLUMN(JCollision, collision); DECLARE_SOA_INDEX_COLUMN_FULL(Prong0, prong0, int, JTracks, "_0"); DECLARE_SOA_INDEX_COLUMN_FULL(Prong1, prong1, int, JTracks, "_1"); DECLARE_SOA_INDEX_COLUMN_FULL(Prong2, prong2, int, JTracks, "_2"); -DECLARE_SOA_INDEX_COLUMN(JMcCollision, mcCollision); -DECLARE_SOA_INDEX_COLUMN(JMcParticle, mcParticle); } // namespace jlcindices DECLARE_SOA_TABLE_STAGED(JLcCollisionIds, "JLCCOLLID", - jlcindices::JCollisionId); + jcandidateindices::JCollisionId, + o2::soa::Marker); DECLARE_SOA_TABLE_STAGED(JLcMcCollisionIds, "JLCMCCOLLID", - jlcindices::JMcCollisionId); + jcandidateindices::JMcCollisionId, + o2::soa::Marker); DECLARE_SOA_TABLE_STAGED(JLcIds, "JLCID", - jlcindices::JCollisionId, + jcandidateindices::JCollisionId, jlcindices::Prong0Id, jlcindices::Prong1Id, jlcindices::Prong2Id); DECLARE_SOA_TABLE_STAGED(JLcPIds, "JLCPID", - jlcindices::JMcCollisionId, - jlcindices::JMcParticleId); + jcandidateindices::JMcCollisionId, + jcandidateindices::JMcParticleId, + o2::soa::Marker); namespace jdummylc { @@ -145,29 +158,29 @@ DECLARE_SOA_TABLE(JDumLcMlDaus, "AOD", "JDUMLCMLDAU", namespace jbplusindices { -DECLARE_SOA_INDEX_COLUMN(JCollision, collision); DECLARE_SOA_INDEX_COLUMN_FULL(Prong0, prong0, int, JTracks, "_0"); DECLARE_SOA_INDEX_COLUMN_FULL(Prong1, prong1, int, JTracks, "_1"); DECLARE_SOA_INDEX_COLUMN_FULL(Prong2, prong2, int, JTracks, "_2"); -DECLARE_SOA_INDEX_COLUMN(JMcCollision, mcCollision); -DECLARE_SOA_INDEX_COLUMN(JMcParticle, mcParticle); } // namespace jbplusindices DECLARE_SOA_TABLE_STAGED(JBplusCollisionIds, "JBPCOLLID", - jbplusindices::JCollisionId); + jcandidateindices::JCollisionId, + o2::soa::Marker); DECLARE_SOA_TABLE_STAGED(JBplusMcCollisionIds, "JBPMCCOLLID", - jbplusindices::JMcCollisionId); + jcandidateindices::JMcCollisionId, + o2::soa::Marker); DECLARE_SOA_TABLE_STAGED(JBplusIds, "JBPID", - jbplusindices::JCollisionId, + jcandidateindices::JCollisionId, jbplusindices::Prong0Id, jbplusindices::Prong1Id, jbplusindices::Prong2Id); DECLARE_SOA_TABLE_STAGED(JBplusPIds, "JBPPID", - jbplusindices::JMcCollisionId, - jbplusindices::JMcParticleId); + jcandidateindices::JMcCollisionId, + jcandidateindices::JMcParticleId, + o2::soa::Marker); } // namespace o2::aod diff --git a/PWGJE/TableProducer/derivedDataProducer.cxx b/PWGJE/TableProducer/derivedDataProducer.cxx index 01274c11a34..931bd91aaff 100644 --- a/PWGJE/TableProducer/derivedDataProducer.cxx +++ b/PWGJE/TableProducer/derivedDataProducer.cxx @@ -108,6 +108,7 @@ struct JetDerivedDataProducerTask { Produces jDielectronIdsTable; Produces jDielectronMcCollisionsTable; Produces jDielectronMcCollisionIdsTable; + Produces JDielectronMcRCollDummysTable; Produces jDielectronMcsTable; Produces jDielectronMcIdsTable; } products; @@ -646,6 +647,7 @@ struct JetDerivedDataProducerTask { auto pdgParticle = pdgDatabase->GetParticle(particle.pdgCode()); products.jDielectronMcsTable(products.jDielectronMcCollisionsTable.lastIndex(), particle.pt(), particle.eta(), particle.phi(), particle.y(), particle.e(), pdgParticle->Mass(), particle.pdgCode(), particle.getGenStatusCode(), particle.getHepMCStatusCode(), particle.isPhysicalPrimary(), jetdqutilities::setDielectronParticleDecayBit(particles, particle), RecoDecay::getCharmHadronOrigin(particles, particle, false)); // Todo: should the last thing be false? products.jDielectronMcIdsTable(mcCollision.globalIndex(), particle.globalIndex(), mothersId, daughtersId); + products.JDielectronMcRCollDummysTable(false); } } } diff --git a/PWGJE/TableProducer/derivedDataWriter.cxx b/PWGJE/TableProducer/derivedDataWriter.cxx index 9100a7fbc5e..2b2cabbf2e2 100644 --- a/PWGJE/TableProducer/derivedDataWriter.cxx +++ b/PWGJE/TableProducer/derivedDataWriter.cxx @@ -145,7 +145,7 @@ struct JetDerivedDataWriter { Produces storedDielectronIdsTable; Produces storedDielectronMcCollisionsTable; Produces storedDielectronMcCollisionIdsTable; - // Produces storedD0McCollisionsMatchingTable; //this doesnt exist for Dileptons yet + Produces storedDielectronMcRCollDummysTable; Produces storedDielectronParticlesTable; Produces storedDielectronParticleIdsTable; } products; @@ -154,15 +154,15 @@ struct JetDerivedDataWriter { Preslice> ParticlesPerMcCollision = aod::jmcparticle::mcCollisionId; Preslice> TracksPerCollision = aod::jtrack::collisionId; - Preslice D0McCollisionsPerMcCollision = aod::jd0indices::mcCollisionId; - Preslice DplusMcCollisionsPerMcCollision = aod::jdplusindices::mcCollisionId; - Preslice LcMcCollisionsPerMcCollision = aod::jlcindices::mcCollisionId; - Preslice BplusMcCollisionsPerMcCollision = aod::jbplusindices::mcCollisionId; - Preslice DielectronMcCollisionsPerMcCollision = aod::jdielectronindices::mcCollisionId; - Preslice D0ParticlesPerMcCollision = aod::jd0indices::mcCollisionId; - Preslice DplusParticlesPerMcCollision = aod::jdplusindices::mcCollisionId; - Preslice LcParticlesPerMcCollision = aod::jlcindices::mcCollisionId; - Preslice BplusParticlesPerMcCollision = aod::jbplusindices::mcCollisionId; + Preslice D0McCollisionsPerMcCollision = aod::jcandidateindices::mcCollisionId; + Preslice DplusMcCollisionsPerMcCollision = aod::jcandidateindices::mcCollisionId; + Preslice LcMcCollisionsPerMcCollision = aod::jcandidateindices::mcCollisionId; + Preslice BplusMcCollisionsPerMcCollision = aod::jcandidateindices::mcCollisionId; + Preslice DielectronMcCollisionsPerMcCollision = aod::jcandidateindices::mcCollisionId; + Preslice D0ParticlesPerMcCollision = aod::jcandidateindices::mcCollisionId; + Preslice DplusParticlesPerMcCollision = aod::jcandidateindices::mcCollisionId; + Preslice LcParticlesPerMcCollision = aod::jcandidateindices::mcCollisionId; + Preslice BplusParticlesPerMcCollision = aod::jcandidateindices::mcCollisionId; PresliceUnsorted EMCTrackPerTrack = aod::jemctrack::trackId; uint32_t precisionPositionMask; @@ -561,7 +561,7 @@ struct JetDerivedDataWriter { } PROCESS_SWITCH(JetDerivedDataWriter, processBplusMCP, "write out Bplus mcp output tables", false); - void processDielectronMCP(soa::Join::iterator const& mcCollision, aod::JMcParticles const&, aod::McCollisionsDielectron const& DielectronMcCollisions, aod::CandidatesDielectronMCP const& DielectronParticles) + void processDielectronMCP(soa::Join::iterator const& mcCollision, aod::JMcParticles const&, soa::Join const& DielectronMcCollisions, aod::CandidatesDielectronMCP const& DielectronParticles) { if (mcCollision.isMcCollisionSelected()) { @@ -569,6 +569,7 @@ struct JetDerivedDataWriter { for (const auto& dielectronMcCollisionPerMcCollision : dielectronMcCollisionsPerMcCollision) { // should only ever be one jetdqutilities::fillDielectronMcCollisionTable(dielectronMcCollisionPerMcCollision, products.storedDielectronMcCollisionsTable); products.storedDielectronMcCollisionIdsTable(mcCollisionMapping[mcCollision.globalIndex()]); + products.storedDielectronMcRCollDummysTable(dielectronMcCollisionPerMcCollision.dummyDQ()); } for (const auto& DielectronParticle : DielectronParticles) { jetdqutilities::fillDielectronCandidateMcTable(DielectronParticle, products.storedDielectronMcCollisionsTable.lastIndex(), products.storedDielectronParticlesTable); diff --git a/PWGJE/Tasks/jetSubstructureBplusOutput.cxx b/PWGJE/Tasks/jetSubstructureBplusOutput.cxx index 148e8b9e669..0e2880bfe48 100644 --- a/PWGJE/Tasks/jetSubstructureBplusOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureBplusOutput.cxx @@ -16,7 +16,7 @@ #include #include "PWGJE/Tasks/jetSubstructureHFOutput.cxx" -using JetSubstructureOutputBplus = JetSubstructureHFOutputTask, aod::CandidatesBplusData, aod::CandidatesBplusMCD, aod::CandidatesBplusMCP, aod::BkgBplusRhos, aod::BkgBplusMcRhos, aod::JTrackBplusSubs, soa::Join, soa::Join, soa::Join, soa::Join, aod::BplusCJetCOs, aod::BplusCJetOs, aod::BplusCJetSSOs, aod::BplusCJetMOs, soa::Join, soa::Join, soa::Join, aod::BplusCMCDJetCOs, aod::BplusCMCDJetOs, aod::BplusCMCDJetSSOs, aod::BplusCMCDJetMOs, soa::Join, soa::Join, soa::Join, soa::Join, aod::BplusCMCPJetCOs, aod::BplusCMCPJetOs, aod::BplusCMCPJetSSOs, aod::BplusCMCPJetMOs, soa::Join, soa::Join, soa::Join, aod::BplusCEWSJetCOs, aod::BplusCEWSJetOs, aod::BplusCEWSJetSSOs, aod::BplusCEWSJetMOs, aod::StoredHfBplusCollBase, aod::StoredHfBplusBases, aod::StoredHfBplusPars, aod::StoredHfBplusParEs, aod::StoredHfBplusParD0s, aod::StoredHfBplusSels, aod::StoredHfBplusMls, aod::StoredHfBplusMlD0s, aod::StoredHfBplusMcs, aod::StoredHfBplusMcCollBases, aod::StoredHfBplusMcRCollIds, aod::StoredHfBplusPBases>; +using JetSubstructureOutputBplus = JetSubstructureHFOutputTask, aod::McCollisionsBplus, aod::CandidatesBplusData, aod::CandidatesBplusMCD, aod::CandidatesBplusMCP, aod::BkgBplusRhos, aod::BkgBplusMcRhos, aod::JTrackBplusSubs, soa::Join, soa::Join, soa::Join, soa::Join, aod::BplusCJetCOs, aod::BplusCJetOs, aod::BplusCJetSSOs, aod::BplusCJetMOs, soa::Join, soa::Join, soa::Join, aod::BplusCMCDJetCOs, aod::BplusCMCDJetOs, aod::BplusCMCDJetSSOs, aod::BplusCMCDJetMOs, soa::Join, soa::Join, soa::Join, soa::Join, aod::BplusCMCPJetCOs, aod::BplusCMCPJetOs, aod::BplusCMCPJetSSOs, aod::BplusCMCPJetMOs, soa::Join, soa::Join, soa::Join, aod::BplusCEWSJetCOs, aod::BplusCEWSJetOs, aod::BplusCEWSJetSSOs, aod::BplusCEWSJetMOs, aod::StoredHfBplusCollBase, aod::StoredHfBplusBases, aod::StoredHfBplusPars, aod::StoredHfBplusParEs, aod::StoredHfBplusParD0s, aod::StoredHfBplusSels, aod::StoredHfBplusMls, aod::StoredHfBplusMlD0s, aod::StoredHfBplusMcs, aod::StoredHfBplusMcCollBases, aod::StoredHfBplusMcRCollIds, aod::StoredHfBplusPBases>; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGJE/Tasks/jetSubstructureD0Output.cxx b/PWGJE/Tasks/jetSubstructureD0Output.cxx index ca6d9856b62..571055851c1 100644 --- a/PWGJE/Tasks/jetSubstructureD0Output.cxx +++ b/PWGJE/Tasks/jetSubstructureD0Output.cxx @@ -16,7 +16,7 @@ #include #include "PWGJE/Tasks/jetSubstructureHFOutput.cxx" -using JetSubstructureOutputD0 = JetSubstructureHFOutputTask, aod::CandidatesD0Data, aod::CandidatesD0MCD, aod::CandidatesD0MCP, aod::BkgD0Rhos, aod::BkgD0McRhos, aod::JTrackD0Subs, soa::Join, soa::Join, soa::Join, soa::Join, aod::D0CJetCOs, aod::D0CJetOs, aod::D0CJetSSOs, aod::D0CJetMOs, soa::Join, soa::Join, soa::Join, aod::D0CMCDJetCOs, aod::D0CMCDJetOs, aod::D0CMCDJetSSOs, aod::D0CMCDJetMOs, soa::Join, soa::Join, soa::Join, soa::Join, aod::D0CMCPJetCOs, aod::D0CMCPJetOs, aod::D0CMCPJetSSOs, aod::D0CMCPJetMOs, soa::Join, soa::Join, soa::Join, aod::D0CEWSJetCOs, aod::D0CEWSJetOs, aod::D0CEWSJetSSOs, aod::D0CEWSJetMOs, aod::StoredHfD0CollBase, aod::StoredHfD0Bases, aod::StoredHfD0Pars, aod::StoredHfD0ParEs, aod::JDumD0ParDaus, aod::StoredHfD0Sels, aod::StoredHfD0Mls, aod::JDumD0MlDaus, aod::StoredHfD0Mcs, aod::StoredHfD0McCollBases, aod::StoredHfD0McRCollIds, aod::StoredHfD0PBases>; +using JetSubstructureOutputD0 = JetSubstructureHFOutputTask, aod::McCollisionsD0, aod::CandidatesD0Data, aod::CandidatesD0MCD, aod::CandidatesD0MCP, aod::BkgD0Rhos, aod::BkgD0McRhos, aod::JTrackD0Subs, soa::Join, soa::Join, soa::Join, soa::Join, aod::D0CJetCOs, aod::D0CJetOs, aod::D0CJetSSOs, aod::D0CJetMOs, soa::Join, soa::Join, soa::Join, aod::D0CMCDJetCOs, aod::D0CMCDJetOs, aod::D0CMCDJetSSOs, aod::D0CMCDJetMOs, soa::Join, soa::Join, soa::Join, soa::Join, aod::D0CMCPJetCOs, aod::D0CMCPJetOs, aod::D0CMCPJetSSOs, aod::D0CMCPJetMOs, soa::Join, soa::Join, soa::Join, aod::D0CEWSJetCOs, aod::D0CEWSJetOs, aod::D0CEWSJetSSOs, aod::D0CEWSJetMOs, aod::StoredHfD0CollBase, aod::StoredHfD0Bases, aod::StoredHfD0Pars, aod::StoredHfD0ParEs, aod::JDumD0ParDaus, aod::StoredHfD0Sels, aod::StoredHfD0Mls, aod::JDumD0MlDaus, aod::StoredHfD0Mcs, aod::StoredHfD0McCollBases, aod::StoredHfD0McRCollIds, aod::StoredHfD0PBases>; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGJE/Tasks/jetSubstructureDielectronOutput.cxx b/PWGJE/Tasks/jetSubstructureDielectronOutput.cxx index 384c2c3343c..1d3ab203a00 100644 --- a/PWGJE/Tasks/jetSubstructureDielectronOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureDielectronOutput.cxx @@ -16,7 +16,7 @@ #include #include "PWGJE/Tasks/jetSubstructureHFOutput.cxx" -using JetSubstructureOutputDielectron = JetSubstructureHFOutputTask, soa::Join, soa::Join, soa::Join, aod::DielectronCJetCOs, aod::DielectronCJetOs, aod::DielectronCJetSSOs, aod::DielectronCJetMOs, soa::Join, soa::Join, soa::Join, aod::DielectronCMCDJetCOs, aod::DielectronCMCDJetOs, aod::DielectronCMCDJetSSOs, aod::DielectronCMCDJetMOs, soa::Join, soa::Join, soa::Join, soa::Join, aod::DielectronCMCPJetCOs, aod::DielectronCMCPJetOs, aod::DielectronCMCPJetSSOs, aod::DielectronCMCPJetMOs, soa::Join, soa::Join, soa::Join, aod::DielectronCEWSJetCOs, aod::DielectronCEWSJetOs, aod::DielectronCEWSJetSSOs, aod::DielectronCEWSJetMOs, aod::StoredReducedEvents, aod::StoredDielectrons, aod::JDielectron1Dummys, aod::JDielectron2Dummys, aod::JDielectron3Dummys, aod::JDielectron4Dummys, aod::JDielectron5Dummys, aod::JDielectron6Dummys, aod::JDielectron7Dummys, aod::StoredJDielectronMcCollisions, aod::JDielectron8Dummys, aod::StoredJDielectronMcs>; +using JetSubstructureOutputDielectron = JetSubstructureHFOutputTask, aod::McCollisionsDielectron, aod::CandidatesDielectronData, aod::CandidatesDielectronMCD, aod::CandidatesDielectronMCP, aod::BkgDielectronRhos, aod::BkgDielectronMcRhos, aod::JTrackDielectronSubs, soa::Join, soa::Join, soa::Join, soa::Join, aod::DielectronCJetCOs, aod::DielectronCJetOs, aod::DielectronCJetSSOs, aod::DielectronCJetMOs, soa::Join, soa::Join, soa::Join, aod::DielectronCMCDJetCOs, aod::DielectronCMCDJetOs, aod::DielectronCMCDJetSSOs, aod::DielectronCMCDJetMOs, soa::Join, soa::Join, soa::Join, soa::Join, aod::DielectronCMCPJetCOs, aod::DielectronCMCPJetOs, aod::DielectronCMCPJetSSOs, aod::DielectronCMCPJetMOs, soa::Join, soa::Join, soa::Join, aod::DielectronCEWSJetCOs, aod::DielectronCEWSJetOs, aod::DielectronCEWSJetSSOs, aod::DielectronCEWSJetMOs, aod::StoredReducedEvents, aod::StoredDielectrons, aod::JDielectron1Dummys, aod::JDielectron2Dummys, aod::JDielectron3Dummys, aod::JDielectron4Dummys, aod::JDielectron5Dummys, aod::JDielectron6Dummys, aod::JDielectron7Dummys, aod::StoredJDielectronMcCollisions, aod::JDielectronMcRCollDummys, aod::StoredJDielectronMcs>; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGJE/Tasks/jetSubstructureDplusOutput.cxx b/PWGJE/Tasks/jetSubstructureDplusOutput.cxx index f271c96ca9c..7aa35616fc0 100644 --- a/PWGJE/Tasks/jetSubstructureDplusOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureDplusOutput.cxx @@ -16,7 +16,7 @@ #include #include "PWGJE/Tasks/jetSubstructureHFOutput.cxx" -using JetSubstructureOutputDplus = JetSubstructureHFOutputTask, aod::CandidatesDplusData, aod::CandidatesDplusMCD, aod::CandidatesDplusMCP, aod::BkgDplusRhos, aod::BkgDplusMcRhos, aod::JTrackDplusSubs, soa::Join, soa::Join, soa::Join, soa::Join, aod::DplusCJetCOs, aod::DplusCJetOs, aod::DplusCJetSSOs, aod::DplusCJetMOs, soa::Join, soa::Join, soa::Join, aod::DplusCMCDJetCOs, aod::DplusCMCDJetOs, aod::DplusCMCDJetSSOs, aod::DplusCMCDJetMOs, soa::Join, soa::Join, soa::Join, soa::Join, aod::DplusCMCPJetCOs, aod::DplusCMCPJetOs, aod::DplusCMCPJetSSOs, aod::DplusCMCPJetMOs, soa::Join, soa::Join, soa::Join, aod::DplusCEWSJetCOs, aod::DplusCEWSJetOs, aod::DplusCEWSJetSSOs, aod::DplusCEWSJetMOs, aod::StoredHfDplusCollBase, aod::StoredHfDplusBases, aod::StoredHfDplusPars, aod::StoredHfDplusParEs, aod::JDumDplusParDaus, aod::StoredHfDplusSels, aod::StoredHfDplusMls, aod::JDumDplusMlDaus, aod::StoredHfDplusMcs, aod::StoredHfDplusMcCollBases, aod::StoredHfDplusMcRCollIds, aod::StoredHfDplusPBases>; +using JetSubstructureOutputDplus = JetSubstructureHFOutputTask, aod::McCollisionsDplus, aod::CandidatesDplusData, aod::CandidatesDplusMCD, aod::CandidatesDplusMCP, aod::BkgDplusRhos, aod::BkgDplusMcRhos, aod::JTrackDplusSubs, soa::Join, soa::Join, soa::Join, soa::Join, aod::DplusCJetCOs, aod::DplusCJetOs, aod::DplusCJetSSOs, aod::DplusCJetMOs, soa::Join, soa::Join, soa::Join, aod::DplusCMCDJetCOs, aod::DplusCMCDJetOs, aod::DplusCMCDJetSSOs, aod::DplusCMCDJetMOs, soa::Join, soa::Join, soa::Join, soa::Join, aod::DplusCMCPJetCOs, aod::DplusCMCPJetOs, aod::DplusCMCPJetSSOs, aod::DplusCMCPJetMOs, soa::Join, soa::Join, soa::Join, aod::DplusCEWSJetCOs, aod::DplusCEWSJetOs, aod::DplusCEWSJetSSOs, aod::DplusCEWSJetMOs, aod::StoredHfDplusCollBase, aod::StoredHfDplusBases, aod::StoredHfDplusPars, aod::StoredHfDplusParEs, aod::JDumDplusParDaus, aod::StoredHfDplusSels, aod::StoredHfDplusMls, aod::JDumDplusMlDaus, aod::StoredHfDplusMcs, aod::StoredHfDplusMcCollBases, aod::StoredHfDplusMcRCollIds, aod::StoredHfDplusPBases>; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGJE/Tasks/jetSubstructureHFOutput.cxx b/PWGJE/Tasks/jetSubstructureHFOutput.cxx index d9caeed7ede..14755a98226 100644 --- a/PWGJE/Tasks/jetSubstructureHFOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureHFOutput.cxx @@ -45,7 +45,7 @@ using namespace o2::framework::expressions; // NB: runDataProcessing.h must be included after customize! #include "Framework/runDataProcessing.h" -template +template struct JetSubstructureHFOutputTask { struct : ProducesGroup { @@ -131,16 +131,9 @@ struct JetSubstructureHFOutputTask { } PresliceUnsorted> CollisionsPerMcCollision = aod::jmccollisionlb::mcCollisionId; - PresliceOptional D0CollisionsPerCollision = aod::jd0indices::collisionId; - PresliceOptional DplusCollisionsPerCollision = aod::jdplusindices::collisionId; - PresliceOptional LcCollisionsPerCollision = aod::jlcindices::collisionId; - PresliceOptional BplusCollisionsPerCollision = aod::jbplusindices::collisionId; - PresliceOptional DielectronCollisionsPerCollision = aod::jdielectronindices::collisionId; - PresliceOptional> D0McCollisionsPerMcCollision = aod::jd0indices::mcCollisionId; - PresliceOptional> DplusMcCollisionsPerMcCollision = aod::jdplusindices::mcCollisionId; - PresliceOptional> LcMcCollisionsPerMcCollision = aod::jlcindices::mcCollisionId; - PresliceOptional> BplusMcCollisionsPerMcCollision = aod::jbplusindices::mcCollisionId; - PresliceOptional DielectronMcCollisionsPerMcCollision = aod::jdielectronindices::mcCollisionId; + PresliceOptional CandidateCollisionsPerCollision = aod::jcandidateindices::collisionId; + PresliceOptional CandidateMcCollisionsPerMcCollision = aod::jcandidateindices::mcCollisionId; + PresliceOptional CandidateMcCollisionsPerMcCollisionMCPOnly = aod::jcandidateindices::mcCollisionId; PresliceOptional> D0SplittingsPerJetData = aod::d0chargedsplitting::jetId; PresliceOptional> D0SplittingsPerJetDataSub = aod::d0chargedeventwisesubtractedsplitting::jetId; @@ -192,6 +185,16 @@ struct JetSubstructureHFOutputTask { PresliceOptional> DielectronPairsPerJetMCD = aod::dielectronchargedmcdetectorlevelpair::jetId; PresliceOptional> DielectronPairsPerJetMCP = aod::dielectronchargedmcparticlelevelpair::jetId; + template + auto candidateMCCollisionSlicer(T const& McCollisionsPerMcCollision, U const& McCollisionsPerMcCollisionMCPOnly) + { + if constexpr (isMCP) { + return McCollisionsPerMcCollisionMCPOnly; + } else { + return McCollisionsPerMcCollision; + } + } + template void fillSplittingMatchingVectors(T const& splittingsMatches, int jetIndex, std::vector>& splittingMatchesGeoVecVec, std::vector>& splittingMatchesPtVecVec, std::vector>& splittingMatchesHFVecVec) { @@ -490,7 +493,7 @@ struct JetSubstructureHFOutputTask { if constexpr (!isMCPOnly) { for (const auto& collision : collisions) { if (collisionFlag[collision.globalIndex()]) { - const auto hfCollisionsPerCollision = jetcandidateutilities::slicedPerCandidateCollision(hfCollisions, candidates, collision, D0CollisionsPerCollision, DplusCollisionsPerCollision, LcCollisionsPerCollision, BplusCollisionsPerCollision, DielectronCollisionsPerCollision); + const auto hfCollisionsPerCollision = hfCollisions.sliceBy(CandidateCollisionsPerCollision, collision.globalIndex()); for (const auto& hfCollisionPerCollision : hfCollisionsPerCollision) { // should only ever be one auto hfCollisionTableIndex = candidateCollisionMapping.find(hfCollisionPerCollision.globalIndex()); if (hfCollisionTableIndex != candidateCollisionMapping.end()) { @@ -505,7 +508,7 @@ struct JetSubstructureHFOutputTask { if constexpr (isMC) { for (const auto& mcCollision : mcCollisions) { if (mcCollisionFlag[mcCollision.globalIndex()]) { - const auto hfMcCollisionsPerMcCollision = jetcandidateutilities::slicedPerCandidateCollision(hfMcCollisions, candidatesMCP, mcCollision, D0McCollisionsPerMcCollision, DplusMcCollisionsPerMcCollision, LcMcCollisionsPerMcCollision, BplusMcCollisionsPerMcCollision, DielectronMcCollisionsPerMcCollision); // add Bplus later + const auto hfMcCollisionsPerMcCollision = hfMcCollisions.sliceBy(candidateMCCollisionSlicer(CandidateMcCollisionsPerMcCollision, CandidateMcCollisionsPerMcCollisionMCPOnly), mcCollision.globalIndex()); for (const auto& hfMcCollisionPerMcCollision : hfMcCollisionsPerMcCollision) { // should only ever be one auto hfMcCollisionTableIndex = candidateMcCollisionMapping.find(hfMcCollisionPerMcCollision.globalIndex()); if (hfMcCollisionTableIndex != candidateMcCollisionMapping.end()) { @@ -580,7 +583,7 @@ struct JetSubstructureHFOutputTask { void processOutputCollisionsMCPOnly(aod::JetMcCollisions const& mcCollisions, JetTableMCP const& jetsMCP, - CandidateMcCollisionTable const& canidateMcCollisions, + CandidateMcOnlyCollisionTable const& canidateMcCollisions, CandidateTableMCP const& candidatesMCP) { analyseHFCollisions(mcCollisions, mcCollisions, canidateMcCollisions, canidateMcCollisions, jetsMCP, jetsMCP, candidatesMCP, candidatesMCP, 0.0, configs.jetPtMinMCP); diff --git a/PWGJE/Tasks/jetSubstructureLcOutput.cxx b/PWGJE/Tasks/jetSubstructureLcOutput.cxx index 3f8cc65919b..dcc5b6b9f80 100644 --- a/PWGJE/Tasks/jetSubstructureLcOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureLcOutput.cxx @@ -16,7 +16,7 @@ #include #include "PWGJE/Tasks/jetSubstructureHFOutput.cxx" -using JetSubstructureOutputLc = JetSubstructureHFOutputTask, aod::CandidatesLcData, aod::CandidatesLcMCD, aod::CandidatesLcMCP, aod::BkgLcRhos, aod::BkgLcMcRhos, aod::JTrackLcSubs, soa::Join, soa::Join, soa::Join, soa::Join, aod::LcCJetCOs, aod::LcCJetOs, aod::LcCJetSSOs, aod::LcCJetMOs, soa::Join, soa::Join, soa::Join, aod::LcCMCDJetCOs, aod::LcCMCDJetOs, aod::LcCMCDJetSSOs, aod::LcCMCDJetMOs, soa::Join, soa::Join, soa::Join, soa::Join, aod::LcCMCPJetCOs, aod::LcCMCPJetOs, aod::LcCMCPJetSSOs, aod::LcCMCPJetMOs, soa::Join, soa::Join, soa::Join, aod::LcCEWSJetCOs, aod::LcCEWSJetOs, aod::LcCEWSJetSSOs, aod::LcCEWSJetMOs, aod::StoredHfLcCollBase, aod::StoredHfLcBases, aod::StoredHfLcPars, aod::StoredHfLcParEs, aod::JDumLcParDaus, aod::StoredHfLcSels, aod::StoredHfLcMls, aod::JDumLcMlDaus, aod::StoredHfLcMcs, aod::StoredHfLcMcCollBases, aod::StoredHfLcMcRCollIds, aod::StoredHfLcPBases>; +using JetSubstructureOutputLc = JetSubstructureHFOutputTask, aod::McCollisionsLc, aod::CandidatesLcData, aod::CandidatesLcMCD, aod::CandidatesLcMCP, aod::BkgLcRhos, aod::BkgLcMcRhos, aod::JTrackLcSubs, soa::Join, soa::Join, soa::Join, soa::Join, aod::LcCJetCOs, aod::LcCJetOs, aod::LcCJetSSOs, aod::LcCJetMOs, soa::Join, soa::Join, soa::Join, aod::LcCMCDJetCOs, aod::LcCMCDJetOs, aod::LcCMCDJetSSOs, aod::LcCMCDJetMOs, soa::Join, soa::Join, soa::Join, soa::Join, aod::LcCMCPJetCOs, aod::LcCMCPJetOs, aod::LcCMCPJetSSOs, aod::LcCMCPJetMOs, soa::Join, soa::Join, soa::Join, aod::LcCEWSJetCOs, aod::LcCEWSJetOs, aod::LcCEWSJetSSOs, aod::LcCEWSJetMOs, aod::StoredHfLcCollBase, aod::StoredHfLcBases, aod::StoredHfLcPars, aod::StoredHfLcParEs, aod::JDumLcParDaus, aod::StoredHfLcSels, aod::StoredHfLcMls, aod::JDumLcMlDaus, aod::StoredHfLcMcs, aod::StoredHfLcMcCollBases, aod::StoredHfLcMcRCollIds, aod::StoredHfLcPBases>; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { From 188c065f9ff3b7fb916276c515dff148904c028f Mon Sep 17 00:00:00 2001 From: victorvalenciatorres <118812999+victorvalenciatorres@users.noreply.github.com> Date: Thu, 6 Mar 2025 08:38:53 +0100 Subject: [PATCH 0570/1650] [PWGDQ] Adding histograms + new process for cumulants (#10336) --- PWGDQ/Core/HistogramsLibrary.cxx | 37 ++++++++++++++++++++++++++++++++ PWGDQ/Tasks/tableReader.cxx | 6 ++++++ 2 files changed, 43 insertions(+) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index ff35c2f2b6f..4bcd02f88a0 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -1120,6 +1120,20 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V22ME", "Mass_Pt_CentFT0C_V22ME", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV22ME, VarManager::kWV22ME); hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V24ME", "Mass_Pt_CentFT0C_V24ME", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV24ME, VarManager::kWV24ME); } + if (subGroupStr.Contains("cumulantme1")) { + hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V22ME", "Mass_Pt_CentFT0C_V22ME", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV22ME, VarManager::kWV22ME); + hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V24ME", "Mass_Pt_CentFT0C_V24ME", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV24ME, VarManager::kWV24ME); + } + if (subGroupStr.Contains("cumulantme2")) { + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_M11REFoverMpME", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 9, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kM11REFoverMpME); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_M1111REFoverMpME", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 9, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kM1111REFoverMpME); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_M01POIoverMpME", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 9, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kM01POIoverMpME); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_M0111POIoverMpME", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 9, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kM0111POIoverMpME); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2REFME", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 9, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR2REFbydimuonsME, VarManager::kM11REFoverMpME); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr4REFME", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 9, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR4REFbydimuonsME, VarManager::kM1111REFoverMpME); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2POIME", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 9, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR2POIME, VarManager::kM01POIoverMpME); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr4POIME", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 9, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR4POIME, VarManager::kM0111POIoverMpME); + } if (subGroupStr.Contains("dimuon-polarization-he")) { int varspTHE[4] = {VarManager::kMass, VarManager::kPt, VarManager::kCosThetaHE, VarManager::kPhiHE}; int varsrapHE[4] = {VarManager::kMass, VarManager::kRap, VarManager::kCosThetaHE, VarManager::kPhiHE}; @@ -1378,6 +1392,29 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2REFCorr4POI", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR2REFCORR4POI, VarManager::kM11M0111overMp); hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2REFCorr2POI", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR2REFCORR2POI, VarManager::kM11M01overMp); } + if (subGroupStr.Contains("cumulant1")) { + int var[4] = {VarManager::kMass, VarManager::kPt, VarManager::kRap, VarManager::kCentFT0C}; + int bins[4] = {250, 60, 6, 18}; + double minBins[4] = {0.0, 0.0, 2.5, 0.0}; + double maxBins[4] = {5.0, 30.0, 4.0, 90.0}; + hm->AddHistogram(histClass, "Mass_Pt_Rapidity_CentFT0C", "", 4, var, bins, minBins, maxBins, 0, -1, kTRUE); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2REF", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR2REFbydimuons, VarManager::kM11REFoverMp); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr4REF", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR4REFbydimuons, VarManager::kM1111REFoverMp); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2POI", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR2POI, VarManager::kM01POIoverMp); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr4POI", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR4POI, VarManager::kM0111POIoverMp); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2REFCorr4REF", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR2CORR4REF, VarManager::kM11M1111REFoverMp); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2POICorr4POI", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR2POICORR4POI, VarManager::kM01M0111overMp); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2REFCorr4POI", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR2REFCORR4POI, VarManager::kM11M0111overMp); + hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2REFCorr2POI", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 18, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kCORR2REFCORR2POI, VarManager::kM11M01overMp); + } + if (subGroupStr.Contains("cumulant2")) { + hm->AddHistogram(histClass, "centrFT0C_M11REFoverMp_ev", "", true, 100, 0.0, 100.0, VarManager::kCentFT0C, 1000, 0.0, 1000000.0, VarManager::kM11REFoverMp); + hm->AddHistogram(histClass, "centrFT0C_M1111REFoverMp_ev", "", true, 100, 0.0, 100.0, VarManager::kCentFT0C, 1000, 0.0, 100000000000000.0, VarManager::kM1111REFoverMp); + hm->AddHistogram(histClass, "centrFT0C_M11M1111REFoverMp_ev", "", true, 100, 0.0, 100.0, VarManager::kCentFT0C, 1000, 0.0, 10000000000000000.0, VarManager::kM11M1111REFoverMp); + hm->AddHistogram(histClass, "centrFT0C_Corr2REF_ev", "", true, 100, 0.0, 100.0, VarManager::kCentFT0C, 250, -1.0, 1.0, VarManager::kCORR2REFbydimuons, VarManager::kM11REFoverMp); + hm->AddHistogram(histClass, "centrFT0C_Corr4REF_ev", "", true, 100, 0.0, 100.0, VarManager::kCentFT0C, 250, -1.0, 1.0, VarManager::kCORR4REFbydimuons, VarManager::kM1111REFoverMp); + hm->AddHistogram(histClass, "centrFT0C_Corr2Corr4REF_ev", "", true, 100, 0.0, 100.0, VarManager::kCentFT0C, 250, -1.0, 1.0, VarManager::kCORR2CORR4REF, VarManager::kM11M1111REFoverMp); + } if (subGroupStr.Contains("singlecumulant")) { int var[4] = {VarManager::kMass, VarManager::kPt, VarManager::kRap, VarManager::kCentFT0C}; int bins[4] = {250, 60, 6, 18}; diff --git a/PWGDQ/Tasks/tableReader.cxx b/PWGDQ/Tasks/tableReader.cxx index f3fb74552be..109227ddb55 100644 --- a/PWGDQ/Tasks/tableReader.cxx +++ b/PWGDQ/Tasks/tableReader.cxx @@ -109,6 +109,7 @@ using MyEventsQvectorExtra = soa::Join; using MyEventsHashSelectedQvectorExtra = soa::Join; using MyEventsHashSelectedQvectorCentr = soa::Join; +using MyEventsVtxCovQvectorMultExtraWithRefFlow = soa::Join; using MyBarrelTracks = soa::Join; using MyBarrelTracksWithCov = soa::Join; @@ -134,6 +135,7 @@ constexpr static uint32_t gkEventFillMapWithQvectorCentr = VarManager::ObjTypes: constexpr static uint32_t gkEventFillMapWithQvectorCentrMultExtra = VarManager::ObjTypes::ReducedEvent | VarManager::ObjTypes::ReducedEventExtended | VarManager::ObjTypes::CollisionQvect | VarManager::ObjTypes::ReducedEventMultExtra; constexpr static uint32_t gkEventFillMapWithCovQvector = VarManager::ObjTypes::ReducedEvent | VarManager::ObjTypes::ReducedEventExtended | VarManager::ObjTypes::ReducedEventVtxCov | VarManager::ObjTypes::ReducedEventQvector; constexpr static uint32_t gkEventFillMapWithCovQvectorExtraWithRefFlow = VarManager::ObjTypes::ReducedEvent | VarManager::ObjTypes::ReducedEventExtended | VarManager::ObjTypes::ReducedEventVtxCov | VarManager::ObjTypes::ReducedEventQvector | VarManager::ObjTypes::ReducedEventQvectorExtra | VarManager::ObjTypes::ReducedEventRefFlow; +constexpr static uint32_t gkEventFillMapWithCovQvectorMultExtraWithRefFlow = VarManager::ObjTypes::ReducedEvent | VarManager::ObjTypes::ReducedEventExtended | VarManager::ObjTypes::ReducedEventVtxCov | VarManager::ObjTypes::ReducedEventQvector | VarManager::ObjTypes::ReducedEventQvectorExtra | VarManager::ObjTypes::ReducedEventRefFlow | VarManager::ObjTypes::ReducedEventMultExtra; constexpr static uint32_t gkEventFillMapWithCovQvectorCentr = VarManager::ObjTypes::ReducedEvent | VarManager::ObjTypes::ReducedEventExtended | VarManager::ObjTypes::ReducedEventVtxCov | VarManager::ObjTypes::CollisionQvect; constexpr static uint32_t gkTrackFillMap = VarManager::ObjTypes::ReducedTrack | VarManager::ObjTypes::ReducedTrackBarrel | VarManager::ObjTypes::ReducedTrackBarrelPID; constexpr static uint32_t gkTrackFillMapWithCov = VarManager::ObjTypes::ReducedTrack | VarManager::ObjTypes::ReducedTrackBarrel | VarManager::ObjTypes::ReducedTrackBarrelCov | VarManager::ObjTypes::ReducedTrackBarrelPID; @@ -287,6 +289,10 @@ struct AnalysisEventSelection { { runEventSelection(event); } + void processSkimmedQVectorMultExtraRef(MyEventsVtxCovQvectorMultExtraWithRefFlow::iterator const& event) + { + runEventSelection(event); + } void processDummy(MyEvents&) { // do nothing From dd39e849a27762c543211c653ff216623ed728c2 Mon Sep 17 00:00:00 2001 From: feisenhu <53603353+feisenhu@users.noreply.github.com> Date: Thu, 6 Mar 2025 09:33:25 +0100 Subject: [PATCH 0571/1650] [PWGEM] adding labels to single track histograms (#10353) --- PWGEM/Dilepton/Core/SingleTrackQC.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/PWGEM/Dilepton/Core/SingleTrackQC.h b/PWGEM/Dilepton/Core/SingleTrackQC.h index 0df90356a80..a6943a656e0 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQC.h @@ -227,17 +227,17 @@ struct SingleTrackQC { fRegistry.add("Track/positive/hDCAxyzSigma", "DCA xy vs. z;DCA_{xy} (#sigma);DCA_{z} (#sigma)", kTH2F, {{200, -10.0f, 10.0f}, {200, -10.0f, 10.0f}}, false); fRegistry.add("Track/positive/hDCAxyRes_Pt", "DCA_{xy} resolution vs. pT;p_{T} (GeV/c);DCA_{xy} resolution (#mum)", kTH2F, {{200, 0, 10}, {200, 0., 400}}, false); fRegistry.add("Track/positive/hDCAzRes_Pt", "DCA_{z} resolution vs. pT;p_{T} (GeV/c);DCA_{z} resolution (#mum)", kTH2F, {{200, 0, 10}, {200, 0., 400}}, false); - fRegistry.add("Track/positive/hNclsTPC", "number of TPC clusters", kTH1F, {{161, -0.5, 160.5}}, false); - fRegistry.add("Track/positive/hNcrTPC", "number of TPC crossed rows", kTH1F, {{161, -0.5, 160.5}}, false); - fRegistry.add("Track/positive/hChi2TPC", "chi2/number of TPC clusters", kTH1F, {{100, 0, 10}}, false); + fRegistry.add("Track/positive/hNclsTPC", "number of TPC clusters;TPC N_{cls}", kTH1F, {{161, -0.5, 160.5}}, false); + fRegistry.add("Track/positive/hNcrTPC", "number of TPC crossed rows;TPC N_{CR}", kTH1F, {{161, -0.5, 160.5}}, false); + fRegistry.add("Track/positive/hChi2TPC", "chi2/number of TPC clusters;TPC #chi^{2}/N_{CR}", kTH1F, {{100, 0, 10}}, false); fRegistry.add("Track/positive/hDeltaPin", "p_{in} vs. p_{pv};p_{pv} (GeV/c);(p_{in} - p_{pv})/p_{pv}", kTH2F, {{1000, 0, 10}, {200, -1, +1}}, false); - fRegistry.add("Track/positive/hTPCNcr2Nf", "TPC Ncr/Nfindable", kTH1F, {{200, 0, 2}}, false); - fRegistry.add("Track/positive/hTPCNcls2Nf", "TPC Ncls/Nfindable", kTH1F, {{200, 0, 2}}, false); + fRegistry.add("Track/positive/hTPCNcr2Nf", "TPC Ncr/Nfindable;TPC N_{CR}/N_{cls}^{findable}", kTH1F, {{200, 0, 2}}, false); + fRegistry.add("Track/positive/hTPCNcls2Nf", "TPC Ncls/Nfindable;TPC N_{cls}/N_{cls}^{findable}", kTH1F, {{200, 0, 2}}, false); fRegistry.add("Track/positive/hTPCNclsShared", "TPC Ncls shared/Ncls;p_{T} (GeV/c);N_{cls}^{shared}/N_{cls} in TPC", kTH2F, {{1000, 0, 10}, {100, 0, 1}}, false); - fRegistry.add("Track/positive/hNclsITS", "number of ITS clusters", kTH1F, {{8, -0.5, 7.5}}, false); - fRegistry.add("Track/positive/hChi2ITS", "chi2/number of ITS clusters", kTH1F, {{100, 0, 10}}, false); + fRegistry.add("Track/positive/hNclsITS", "number of ITS clusters;ITS N_{cls}", kTH1F, {{8, -0.5, 7.5}}, false); + fRegistry.add("Track/positive/hChi2ITS", "chi2/number of ITS clusters;ITS #chi^{2}/N_{cls}", kTH1F, {{100, 0, 10}}, false); fRegistry.add("Track/positive/hITSClusterMap", "ITS cluster map", kTH1F, {{128, -0.5, 127.5}}, false); - fRegistry.add("Track/positive/hChi2TOF", "TOF Chi2;p_{pv} (GeV/c);chi2", kTH2F, {{1000, 0, 10}, {100, 0, 10}}, false); + fRegistry.add("Track/positive/hChi2TOF", "TOF Chi2;p_{pv} (GeV/c);TOF #chi^{2}", kTH2F, {{1000, 0, 10}, {100, 0, 10}}, false); fRegistry.add("Track/positive/hTPCdEdx", "TPC dE/dx;p_{in} (GeV/c);TPC dE/dx (a.u.)", kTH2F, {{1000, 0, 10}, {200, 0, 200}}, false); fRegistry.add("Track/positive/hTPCNsigmaEl", "TPC n sigma el;p_{in} (GeV/c);n #sigma_{e}^{TPC}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); From e0f46dc508ca64e041866cf9ec9959090b07e882 Mon Sep 17 00:00:00 2001 From: peressounko Date: Thu, 6 Mar 2025 12:10:16 +0300 Subject: [PATCH 0572/1650] [Common] Final non-linarity fix (#10320) Co-authored-by: peressounko --- Common/TableProducer/caloClusterProducer.cxx | 37 ++++++++++---------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/Common/TableProducer/caloClusterProducer.cxx b/Common/TableProducer/caloClusterProducer.cxx index c9766ffeac5..086885beb4c 100644 --- a/Common/TableProducer/caloClusterProducer.cxx +++ b/Common/TableProducer/caloClusterProducer.cxx @@ -1728,27 +1728,28 @@ struct CaloClusterProducer { case 0: return en; case 1: { // Data Run3 - const double a = 0.892787; - const double b = 0.004053; - const double c = 0.074652; - const double d = -0.016306; - const double f = 7.616314; - const double g = -104.409; - const double h = 1837.17; - const double k = 0.000091; - double eMin = std::max(static_cast(0.1), en); // Parameterization valid down to 100 MeV + const double a = 0.885621; + const double b = 0.003864; + const double c = 0.143948; + const double d = -0.034200; + const double f = -0.038992; + const double g = 0.436003; + const double h = 0.642263; + const double k = 0.000523; + double eMin = std::max(static_cast(0.25), en); // Parameterization valid down to 250 MeV return en * (a + b * eMin + c / eMin + d / (eMin * eMin) + f / ((eMin - g) * (eMin - g) + h * h) + k / std::pow(eMin, 4)); } case 2: { // MC - const double a = 1.14875; - const double b = -1.24286e-04; - const double c = -0.0498217; - const double d = -0.00215362; - const double f = 0.886539; - const double g = -1.98282; - const double h = 0.0178562; - const double k = 5.03164e-04; - double eMin = std::max(static_cast(0.1), en); // Parameterization valid down to 100 MeV + const double a = 1.2428430; + const double b = -0.0001866; + const double c = -0.0299751; + const double d = -0.0003103; + const double f = 0.4053021; + const double g = -0.139670; + const double h = 1.909846; + const double k = 0.00028866050; + + double eMin = std::max(static_cast(0.25), en); // Parameterization valid down to 250 MeV return en * (a + b * eMin + c / eMin + d / (eMin * eMin) + f / ((eMin - g) * (eMin - g) + h * h) + k / std::pow(eMin, 4)); } case 3: { // Obsolete data Run3 From 80a30da5c70496edab03fa42e038dd7be99aea0c Mon Sep 17 00:00:00 2001 From: amatyja Date: Thu, 6 Mar 2025 13:17:52 +0100 Subject: [PATCH 0573/1650] [PWGUD] Added MC part based on UD tables, section cuts order changed (#10331) --- PWGUD/Tasks/upcTauTau13topo.cxx | 3776 +++++++++++++++++++++++++------ 1 file changed, 3145 insertions(+), 631 deletions(-) diff --git a/PWGUD/Tasks/upcTauTau13topo.cxx b/PWGUD/Tasks/upcTauTau13topo.cxx index c7d3e870316..efdd3257c71 100644 --- a/PWGUD/Tasks/upcTauTau13topo.cxx +++ b/PWGUD/Tasks/upcTauTau13topo.cxx @@ -9,9 +9,10 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. // -// \brief tau tau analysis 1e+3pi topology -// \author Adam Matyja, adam.tomasz.matyja@cern.ch, adam.matryja@ifj.edu.pl -// \since January 2024 +/// \file upcTauTau13topo.cxx +/// \brief tau tau analysis 1e+3pi topology +/// \author Adam Matyja, adam.tomasz.matyja@cern.ch, adam.matryja@ifj.edu.pl +/// \since January 2024 // to run it execute: // copts="--configuration json://tautauConfig.json -b" // o2-analysis-ud-tautau13topo $copts > output.log @@ -33,33 +34,38 @@ #include "PWGUD/Core/DGPIDSelector.h" #include "PWGUD/Core/SGSelector.h" +#include "Common/Core/RecoDecay.h" +// #include +#include "TPDGCode.h" + using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; +using namespace o2::constants::physics; struct TauTau13topo { SGSelector sgSelector; // configurables - Configurable FV0_cut{"FV0", 1000., "FV0A threshold"}; - Configurable FT0A_cut{"FT0A", 150., "FT0A threshold"}; - Configurable FT0C_cut{"FT0C", 50., "FT0C threshold"}; - Configurable ZDC_cut{"ZDC", 100., "ZDC threshold"}; - Configurable gap_Side{"gap", 2, "gap selection"}; + Configurable cutFV0{"cutFV0", 10000., "FV0A threshold"}; + Configurable cutFT0A{"cutFT0A", 150., "FT0A threshold"}; + Configurable cutFT0C{"cutFT0C", 50., "FT0C threshold"}; + Configurable cutZDC{"cutZDC", 10000., "ZDC threshold"}; + Configurable mGapSide{"mGapSide", 2, "gap selection"}; // ConfigurableAxis ptAxis{"pAxis", {100, 0., 5.}, "#it{p} (GeV/#it{c})"}; ConfigurableAxis ptAxis{"ptAxis", {120, 0., 4.}, "#it{p} (GeV/#it{c})"}; // ConfigurableAxis etaAxis{"etaAxis", {100, -2., 2.}, "#eta"}; ConfigurableAxis dedxAxis{"dedxAxis", {100, 20., 160.}, "dE/dx"}; - ConfigurableAxis minvAxis{"MinvAxis", {100, 0.4, 3.5}, "M_{inv} (GeV/#it{c}^{2})"}; + ConfigurableAxis minvAxis{"minvAxis", {100, 0.4, 3.5}, "M_{inv} (GeV/#it{c}^{2})"}; ConfigurableAxis phiAxis{"phiAxis", {120, 0., 3.2}, "#phi"}; // ConfigurableAxis vectorAxis{"vectorAxis", {100, 0., 2.}, "A_{V}"}; // ConfigurableAxis scalarAxis{"scalarAxis", {100, -1., 1.}, "A_{S}"}; - Configurable verbose{"Verbose", {}, "Additional print outs"}; + Configurable verbose{"verbose", {}, "Additional print outs"}; // cut selection configurables - Configurable zvertexcut{"Zvertexcut", 15., "Z vertex cut"}; - Configurable trkEtacut{"TrkEtacut", 1.5, "max track eta cut"}; + Configurable zvertexcut{"zvertexcut", 10., "Z vertex cut"}; + Configurable trkEtacut{"trkEtacut", 0.9, "max track eta cut"}; Configurable sameSign{"sameSign", {}, "Switch: same(true) or opposite(false) sign"}; - Configurable ptTotcut{"PtTotcut", 0.15, "min pt of all 4 tracks cut"}; + Configurable ptTotcut{"ptTotcut", 0.15, "min pt of all 4 tracks cut"}; Configurable minAnglecut{"minAnglecut", 0.05, "min angle between tracks cut"}; Configurable minNsigmaElcut{"minNsigmaElcut", -2., "min Nsigma for Electrons cut"}; Configurable maxNsigmaElcut{"maxNsigmaElcut", 3., "max Nsigma for Electrons cut"}; @@ -67,31 +73,40 @@ struct TauTau13topo { Configurable maxNsigmaPrVetocut{"maxNsigmaPrVetocut", 3., "max Nsigma for Proton veto cut"}; Configurable maxNsigmaKaVetocut{"maxNsigmaKaVetocut", 3., "max Nsigma for Kaon veto cut"}; Configurable minPtEtrkcut{"minPtEtrkcut", 0.25, "min Pt for El track cut"}; - Configurable FITvetoFlag{"FITvetoFlag", {}, "To apply FIT veto"}; - Configurable FITvetoWindow{"FITvetoWindow", 1, "FIT veto window"}; + Configurable mFITvetoFlag{"mFITvetoFlag", {}, "To apply FIT veto"}; + Configurable mFITvetoWindow{"mFITvetoWindow", 6, "FIT veto window"}; Configurable useFV0ForVeto{"useFV0ForVeto", 0, "use FV0 for veto"}; Configurable useFDDAForVeto{"useFDDAForVeto", 0, "use FDDA for veto"}; Configurable useFDDCForVeto{"useFDDCForVeto", 0, "use FDDC for veto"}; - Configurable nTofTrkMinCut{"nTofTrkMinCut", 0, "min TOF tracks"}; + Configurable nTofTrkMinCut{"nTofTrkMinCut", 1, "min TOF tracks"}; Configurable invMass3piSignalRegion{"invMass3piSignalRegion", 1, "1-use inv mass 3pi in signal region, 0-in background region"}; - Configurable invMass3piMaxcut{"invMass3piMaxcut", 20., "Z invariant mass of 3 pi cut"}; + Configurable invMass3piMaxcut{"invMass3piMaxcut", 1.8, "Z invariant mass of 3 pi cut"}; Configurable deltaPhiMincut{"deltaPhiMincut", 0., "delta phi electron - 3 pi direction cut"}; Configurable nTPCcrossedRowsMinCut{"nTPCcrossedRowsMinCut", 50, "min N_crossed TPC rows for electron candidate"}; - Configurable nSigma3piMaxCut{"nSigma3piMaxCut", 20., "n sigma 3 pi max cut"}; + Configurable nSigma3piMaxCut{"nSigma3piMaxCut", 5., "n sigma 3 pi max cut"}; + + Configurable generatorIDMC{"generatorIDMC", -1, "MC generator ID"}; // Configurable DGactive{"DGactive", false, "Switch on DGproducer"}; // Configurable SGactive{"SGactive", true, "Switch on SGproducer"}; // a pdg object // TDatabasePDG* pdg = nullptr; //not recommended - Service pdg; + // Service pdg; // initialize histogram registry HistogramRegistry registry{ "registry", {}}; + HistogramRegistry registryMC{ + "registryMC", + {}}; + HistogramRegistry registry1MC{ + "registry1MC", + {}}; + void init(InitContext&) { // pdg = TDatabasePDG::Instance(); @@ -109,7 +124,9 @@ struct TauTau13topo { const AxisSpec vectorAxis{100, 0., 2., "A_{V}"}; const AxisSpec scalarAxis{100, -1., 1., "A_{S}"}; const AxisSpec axisZDC{50, -1., 14., "#it{E} (TeV)"}; + const AxisSpec axisInvMass4trk{160, 0.5, 8.5, "#it{M}^{4trk}_{inv} (GeV/#it{c}^{2})"}; + registry.add("global/RunNumber", "Run number; Run; Collisions", {HistType::kTH1F, {{150, 544013, 545367}}}); registry.add("global/GapSide", "Associated gap side; gap index; Collisions", {HistType::kTH1F, {{5, -1, 4}}}); registry.add("global/GapSideTrue", "Recalculated gap side; gap index; Collisions", {HistType::kTH1F, {{5, -1, 4}}}); @@ -119,8 +136,6 @@ struct TauTau13topo { registry.add("global/hVertexXY", "Vertex position in x and y direction; #it{V}_{x} (cm); #it{V}_{y} (cm); Collisions", {HistType::kTH2F, {{50, -0.05, 0.05}, {50, -0.02, 0.02}}}); registry.add("global/hVertexZ", "Vertex position in z direction; #it{V}_{z} (cm); Collisions", {HistType::kTH1F, {{100, -25., 25.}}}); - // registry.add("global/hVertexZ15", "Vertex position in z direction; #it{V}_{z} (cm); Collisions", {HistType::kTH1F, {{100, -25., 25.}}}); - // registry.add("global/hVertexZ10", "Vertex position in z direction; #it{V}_{z} (cm); Collisions", {HistType::kTH1F, {{100, -25., 25.}}}); registry.add("global/hNTracks", ";N_{tracks};events", {HistType::kTH1D, {{20, 0., 20.}}}); // registry.add("global/hNTracksGlobal", ";N_{tracks,global};events", {HistType::kTH1D, {{20, 0., 20.}}}); registry.add("global/hNTracksPV", ";N_{tracks,PV};events", {HistType::kTH1D, {{20, 0., 20.}}}); @@ -134,12 +149,15 @@ struct TauTau13topo { registry.add("global/hITSbitPVtrk", "ITS bit for PV tracks; Layer hit;Entries", {HistType::kTH1F, {{10, 0., 10.}}}); registry.add("global/hITSnbitsVsEtaPVtrk", "n ITS bits vs #eta for PV tracks; #eta;Layer hit;Entries", {HistType::kTH2F, {axiseta, {8, -1., 7.}}}); registry.add("global/hITSbitVsEtaPVtrk", "ITS bit vs #eta for PV tracks; #eta;Layer hit;Entries", {HistType::kTH2F, {axiseta, {8, 0., 8.}}}); - registry.add("global/hEventEff", "Event cut efficiency: 0-All,1-PV=4,2-Qtot=0,3-El;Cut;entries", {HistType::kTH1F, {{25, 0., 25.}}}); + registry.add("global/hEventEff", "Event cut efficiency: 0-All,1-PV=4,2-Qtot=0,3-El;Cut;entries", {HistType::kTH1F, {{27, -2., 25.}}}); registry.add("global/hNCombAfterCut", "Combinations after cut: 0-All,5-M3pi,10-Dphi,15-N_{e},20-N_{v#pi},25-Pt,30-Vcal,35-N_{vp},40-N_{vK},45-Tot;N_{comb};entries", {HistType::kTH1F, {{60, 0., 60.}}}); // registry.add("global/hInvMassElTrack", ";M_{inv}^{2};entries", {HistType::kTH1F, {{100, -0.01, 0.49}}}); registry.add("global/hDeltaAngleTrackPV", ";#Delta#alpha;entries", {HistType::kTH1F, {{136, 0., 3.2}}}); // 0.49 registry.add("global/hTrkCheck", ";track type;entries", {HistType::kTH1F, {{16, -1, 15}}}); + registry.add("global/hRecFlag", ";Reconstruction Flag;events", {HistType::kTH1F, {{10, 0., 10.}}}); + registry.add("global/hOccupancyInTime", ";Occupancy;events", {HistType::kTH1F, {{100, 0., 10000.}}}); + registry.add("global1/hVertexZ", "Vertex position in z direction; #it{V}_{z} (cm); Collisions", {HistType::kTH1F, {{100, -25., 25.}}}); registry.add("global1/hNTracks", ";N_{tracks};events", {HistType::kTH1D, {{20, 0., 20.}}}); registry.add("global1/hNTracksPV", ";N_{tracks,PV};events", {HistType::kTH1D, {{20, 0., 20.}}}); @@ -164,6 +182,8 @@ struct TauTau13topo { registry.add("control/cut0/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); registry.add("control/cut0/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); registry.add("control/cut0/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registry.add("control/cut0/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {{40, 0., 5.}}}); + registry.add("control/cut0/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); registry.add("control/cut0/hInvMass2ElAll", "Inv Mass of 2 Electrons from coherent peak;M_{inv}^{2e};entries", {HistType::kTH1F, {{150, -0.1, 9.}}}); registry.add("control/cut0/hInvMass2ElCoh", "Inv Mass of 2 Electrons from coherent peak;M_{inv}^{2e};entries", {HistType::kTH1F, {{150, -0.1, 4.}}}); @@ -175,28 +195,31 @@ struct TauTau13topo { registry.add("control/cut0/hInvMass2GamCoh", "Inv Mass of 2 Gamma from coherent peak;M_{inv}^{2#gamma};entries", {HistType::kTH1F, {{160, 0.5, 4.5}}}); registry.add("control/cut0/hDeltaPhi2GamCoh", "Delta Phi of 2 Gamma from coherent peak;#Delta#phi^{2#gamma};entries", {HistType::kTH1F, {phiAxis}}); - // cut1 - registry.add("control/cut1/h3piMassComb", "3#pi mass, 1 entry per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registry.add("control/cut1/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registry.add("control/cut1/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registry.add("control/cut1/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registry.add("control/cut1/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registry.add("control/cut1/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - // registry.add("control/cut1/h13EtaSum", ";#eta^{1-prong}+#eta^{3-prong};entries", {HistType::kTH1F, {{100, -4., 4.}}}); - registry.add("control/cut1/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registry.add("control/cut1/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry.add("control/cut1/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry.add("control/cut1/h3piMassVsPt", "3#pi mass vs Pt, 1 entry per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); - registry.add("control/cut1/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); - registry.add("control/cut1/hDcaZ", "All 4 tracks dca ;dca_{Z};entries", {HistType::kTH1F, {{100, -0.05, 0.05}}}); - registry.add("control/cut1/hDcaXY", "All 4 tracks dca ;dca_{XY};entries", {HistType::kTH1F, {{100, -0.05, 0.05}}}); - registry.add("control/cut1/hChi2TPC", "All 4 tracks Chi2 ;Chi2_{TPC};entries", {HistType::kTH1F, {{48, -2, 10.}}}); - registry.add("control/cut1/hChi2ITS", "All 4 tracks Chi2 ;Chi2_{ITS};entries", {HistType::kTH1F, {{44, -2, 20.}}}); - registry.add("control/cut1/hTPCnclsFindable", "All 4 tracks NclFind ;N_{TPC,cl,findable};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registry.add("control/cut1/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry.add("control/cut1/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); - registry.add("control/cut1/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registry.add("control/cut1/hZNACenergy", "ZNA vs ZNC energy; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + // // cut1 + // registry.add("control/cut1/h3piMassComb", "3#pi mass, 1 entry per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + // registry.add("control/cut1/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + // registry.add("control/cut1/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + // registry.add("control/cut1/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + // registry.add("control/cut1/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + // registry.add("control/cut1/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + // // registry.add("control/cut1/h13EtaSum", ";#eta^{1-prong}+#eta^{3-prong};entries", {HistType::kTH1F, {{100, -4., 4.}}}); + // registry.add("control/cut1/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + // registry.add("control/cut1/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registry.add("control/cut1/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registry.add("control/cut1/h3piMassVsPt", "3#pi mass vs Pt, 1 entry per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + // registry.add("control/cut1/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + // registry.add("control/cut1/hDcaZ", "All 4 tracks dca ;dca_{Z};entries", {HistType::kTH1F, {{100, -0.05, 0.05}}}); + // registry.add("control/cut1/hDcaXY", "All 4 tracks dca ;dca_{XY};entries", {HistType::kTH1F, {{100, -0.05, 0.05}}}); + // registry.add("control/cut1/hChi2TPC", "All 4 tracks Chi2 ;Chi2_{TPC};entries", {HistType::kTH1F, {{48, -2, 10.}}}); + // registry.add("control/cut1/hChi2ITS", "All 4 tracks Chi2 ;Chi2_{ITS};entries", {HistType::kTH1F, {{44, -2, 20.}}}); + // registry.add("control/cut1/hChi2TOF", "All 4 tracks Chi2 ;Chi2_{TOF};entries", {HistType::kTH1F, {{48, -2, 10.}}}); + // registry.add("control/cut1/hTPCnclsFindable", "All 4 tracks NclFind ;N_{TPC,cl,findable};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + // registry.add("control/cut1/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registry.add("control/cut1/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registry.add("control/cut1/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + // registry.add("control/cut1/hZNACenergy", "ZNA vs ZNC energy; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + // registry.add("control/cut1/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {{40, 0., 5.}}}); + // registry.add("control/cut1/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); // // cut1a for 20 + registryMC.add("globalMCrec/hPtSpectrumElRec9", "Rec9;#it{p}_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); // effiEl = 23, FIT empty + + // global1 when we require SGProducer + double gap + nPVtracks=4 + registryMC.add("global1MCrec/hVertexZ", "Vertex position in z direction; #it{V}_{z} (cm); Collisions", {HistType::kTH1F, {{100, -25., 25.}}}); + registryMC.add("global1MCrec/hNTracks", ";N_{tracks};events", {HistType::kTH1D, {{20, 0., 20.}}}); + registryMC.add("global1MCrec/hNTracksPV", ";N_{tracks,PV};events", {HistType::kTH1D, {{20, 0., 20.}}}); + registryMC.add("global1MCrec/hTrackPtPV", ";p_T^{trk}; Entries", {HistType::kTH1F, {axispt}}); + registryMC.add("global1MCrec/hTrackEtaPhiPV", ";Eta;Phi;", {HistType::kTH2D, {axiseta, {128, -0.05, 6.35}}}); + registryMC.add("global1MCrec/hTrackPVTotCharge", "Q_{Tot};Q_{Tot}; Entries", {HistType::kTH1F, {{11, -5, 6}}}); + + registryMC.add("global1MCrec/hpTGenRecTracksPV", ";p_{T}^{Rec. tracks,PV} (GeV/c);p_{T}^{Gen} (GeV/c);events", {HistType::kTH2D, {{100, 0., 4.}, {100, 0., 4.}}}); + registryMC.add("global1MCrec/hDeltapTGenRecVsRecpTTracksPV", ";#Delta p_{T}^{Rec.-Gen. tracks,PV} (GeV/c);p_{T}^{Rec. tracks,PV} (GeV/c);events", {HistType::kTH2D, {{100, -4., 4.}, {100, 0., 4.}}}); + registryMC.add("global1MCrec/hEtaGenRecTracksPV", ";#eta^{Rec. tracks,PV} (GeV/c);#eta^{Gen} (GeV/c);events", {HistType::kTH2D, {{100, -2., 2.}, {100, -2., 2.}}}); + registryMC.add("global1MCrec/hDeltaEtaGenRecVsRecpTTracksPV", ";#Delta #eta^{Rec.-Gen. tracks,PV} (GeV/c);p_{T}^{Rec. tracks,PV} (GeV/c);events", {HistType::kTH2D, {{100, -0.25, 0.25}, {100, 0., 4.}}}); + registryMC.add("global1MCrec/hPhiGenRecTracksPV", ";#phi^{Rec. tracks,PV} (GeV/c);#phi^{Gen} (GeV/c);events", {HistType::kTH2D, {{100, 0., 6.4}, {100, 0., 6.4}}}); + registryMC.add("global1MCrec/hDeltaPhiGenRecVsRecpTTracksPV", ";#Delta #phi^{Rec.-Gen. tracks,PV} (GeV/c);p_{T}^{Rec. tracks,PV} (GeV/c);events", {HistType::kTH2D, {{100, -0.5, 0.5}, {100, 0., 4.}}}); + + // pid El in MC true + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut0", "In hip ;#it{p}_{trk}(GeV/#it{c});dE/dx_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut1", "All hip;#it{p}_{trk}(GeV/#it{c});dE/dx_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + // pid separately for each cut (what we reject) + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut2", "rejected, IM hip; #it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut3", "rejected, DP hip; #it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut4", "rejected, El hip; #it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut5", "rejected, vPi hip;#it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut6", "rejected, Pt hip; #it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut7", "rejected, vVc hip;#it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut8", "rejected, pTot hip;#it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut9", "rejected, vPr hip;#it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut10", "rejected, vKa hip;#it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut11", "rejected, nCR hip;#it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut12", "rejected, s3pi hip;#it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + // pid sequentialy + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut20", "El hip; #it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut33", "eTOF+20 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut21", "vPi+33 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut24", "vPr+21 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut25", "vKa+24 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut28", "CR+25 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut22", "vVc+28 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + // registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut23", "Pt+22 hip; #it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut29", "s3pi+22 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut26", "IM+29 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut34", "piTOF+26 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut30", "ptTot+34 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut27", "DP+30 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + // registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut31", "FIT+27 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + // registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut32", "TOF+31 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut35", "ZDC+27 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + + // pid Pi in MC true + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut0", "In hip ;#it{p}_{trk}(GeV/#it{c});dE/dx_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut20", "El hip; #it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut33", "eTOF+20 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut21", "vPi+33 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut24", "vPr+21 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut25", "vKa+24 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut28", "CR+25 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut22", "vVc+28 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + // registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut23", "Pt+22 hip; #it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut29", "s3pi+22 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut26", "IM+29 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut34", "piTOF+26 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut30", "ptTot+34 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut27", "DP+30 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + // registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut31", "FIT+27 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + // registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut32", "TOF+31 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut35", "ZDC+27 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + + // El PID in TOF MC true + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut0", "In hip ;#it{p}_{trk}(GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut20", "El hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut33", "eTOF+20 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut21", "vPi+33 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut24", "vPr+21 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut25", "vKa+24 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut28", "CR+25 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut22", "vVc+28 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut29", "s3pi+22 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut26", "IM+29 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut34", "piTOF+26 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut30", "ptTot+34 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut27", "DP+30 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut35", "ZDC+27 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + + // cut0 + registryMC.add("controlMCtrue/cut0/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut0/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut0/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut0/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut0/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut0/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut0/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut0/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut0/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut0/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut0/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut0/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut0/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + registryMC.add("controlMCtrue/cut0/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut0/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registry1MC.add("controlMCtrue/cut0/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut0/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut0/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut0/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut0/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut0/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut0/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut0/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCcomb/cut0/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registry1MC.add("controlMCcomb/cut0/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // cut20 MC + registryMC.add("controlMCtrue/cut20/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut20/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut20/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut20/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut20/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut20/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut20/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut20/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut20/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut20/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut20/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut20/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut20/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut20/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut20/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut20/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut20/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut20/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut20/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut20/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut20/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut20/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut20/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut20/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut20/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // cut21 MC + registryMC.add("controlMCtrue/cut21/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut21/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut21/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut21/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut21/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut21/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut21/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut21/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut21/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut21/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut21/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut21/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut21/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut21/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut21/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut21/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut21/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut21/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut21/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut21/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut21/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut21/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut21/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut21/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut21/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // cut24 MC + registryMC.add("controlMCtrue/cut24/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut24/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut24/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut24/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut24/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut24/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut24/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut24/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut24/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut24/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut24/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut24/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut24/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut24/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut24/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut24/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut24/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut24/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut24/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut24/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut24/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut24/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut24/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut24/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut24/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // cut25 MC + registryMC.add("controlMCtrue/cut25/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut25/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut25/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut25/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut25/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut25/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut25/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut25/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut25/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut25/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut25/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut25/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut25/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut25/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut25/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut25/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut25/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut25/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut25/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut25/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut25/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut25/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut25/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut25/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut25/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // cut28 MC + registryMC.add("controlMCtrue/cut28/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut28/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut28/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut28/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut28/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut28/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut28/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut28/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut28/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut28/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut28/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut28/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut28/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut28/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut28/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut28/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut28/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut28/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut28/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut28/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut28/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut28/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut28/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut28/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut28/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // cut22 MC + registryMC.add("controlMCtrue/cut22/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut22/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut22/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut22/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut22/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut22/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut22/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut22/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut22/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut22/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut22/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut22/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut22/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut22/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut22/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut22/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut22/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut22/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut22/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut22/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut22/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut22/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut22/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut22/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut22/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // //cut23 MC + // registryMC.add("controlMCtrue/cut23/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut23/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + // registryMC.add("controlMCtrue/cut23/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + // registryMC.add("controlMCtrue/cut23/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + // registryMC.add("controlMCtrue/cut23/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + // registryMC.add("controlMCtrue/cut23/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + // registryMC.add("controlMCtrue/cut23/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + // registryMC.add("controlMCtrue/cut23/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + // registryMC.add("controlMCtrue/cut23/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + // registryMC.add("controlMCtrue/cut23/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + // registryMC.add("controlMCtrue/cut23/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + // registryMC.add("controlMCtrue/cut23/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + // registryMC.add("controlMCtrue/cut23/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registry1MC.add("controlMCtrue/cut23/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // // registryMC.add("controlMCtrue/cut23/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // // registryMC.add("controlMCtrue/cut23/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // // + // registryMC.add("controlMCcomb/cut23/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + // registryMC.add("controlMCcomb/cut23/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + // registryMC.add("controlMCcomb/cut23/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + // registryMC.add("controlMCcomb/cut23/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + // registryMC.add("controlMCcomb/cut23/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + // registryMC.add("controlMCcomb/cut23/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + // registryMC.add("controlMCcomb/cut23/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + // registryMC.add("controlMCcomb/cut23/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registry1MC.add("controlMCcomb/cut23/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // cut29 MC + registryMC.add("controlMCtrue/cut29/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut29/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut29/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut29/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut29/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut29/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut29/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut29/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut29/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut29/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut29/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut29/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut29/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut29/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut29/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut29/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut29/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut29/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut29/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut29/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut29/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut29/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut29/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut29/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut29/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // cut26 MC + registryMC.add("controlMCtrue/cut26/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut26/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut26/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut26/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut26/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut26/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut26/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut26/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut26/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut26/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut26/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut26/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut26/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut26/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut26/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut26/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut26/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut26/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut26/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut26/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut26/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut26/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut26/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut26/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut26/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // cut30 MC + registryMC.add("controlMCtrue/cut30/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut30/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut30/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut30/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut30/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut30/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut30/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut30/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut30/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut30/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut30/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut30/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut30/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut30/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut30/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut30/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut30/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut30/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut30/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut30/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut30/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut30/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut30/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut30/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut30/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // cut27 MC + registryMC.add("controlMCtrue/cut27/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut27/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut27/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut27/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut27/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut27/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut27/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut27/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut27/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut27/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut27/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut27/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut27/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut27/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut27/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut27/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut27/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut27/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut27/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut27/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut27/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut27/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut27/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut27/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut27/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // //cut31 MC + // registryMC.add("controlMCtrue/cut31/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut31/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + // registryMC.add("controlMCtrue/cut31/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + // registryMC.add("controlMCtrue/cut31/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + // registryMC.add("controlMCtrue/cut31/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + // registryMC.add("controlMCtrue/cut31/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + // registryMC.add("controlMCtrue/cut31/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + // registryMC.add("controlMCtrue/cut31/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + // registryMC.add("controlMCtrue/cut31/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + // registryMC.add("controlMCtrue/cut31/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + // registryMC.add("controlMCtrue/cut31/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + // registryMC.add("controlMCtrue/cut31/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + // registryMC.add("controlMCtrue/cut31/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registry1MC.add("controlMCtrue/cut31/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // // registryMC.add("controlMCtrue/cut31/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // // registryMC.add("controlMCtrue/cut31/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // // + // registryMC.add("controlMCcomb/cut31/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + // registryMC.add("controlMCcomb/cut31/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + // registryMC.add("controlMCcomb/cut31/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + // registryMC.add("controlMCcomb/cut31/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + // registryMC.add("controlMCcomb/cut31/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + // registryMC.add("controlMCcomb/cut31/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + // registryMC.add("controlMCcomb/cut31/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + // registryMC.add("controlMCcomb/cut31/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registry1MC.add("controlMCcomb/cut31/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // //cut32 MC + // registryMC.add("controlMCtrue/cut32/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut32/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + // registryMC.add("controlMCtrue/cut32/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + // registryMC.add("controlMCtrue/cut32/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + // registryMC.add("controlMCtrue/cut32/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + // registryMC.add("controlMCtrue/cut32/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + // registryMC.add("controlMCtrue/cut32/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + // registryMC.add("controlMCtrue/cut32/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + // registryMC.add("controlMCtrue/cut32/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + // registryMC.add("controlMCtrue/cut32/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + // registryMC.add("controlMCtrue/cut32/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + // registryMC.add("controlMCtrue/cut32/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + // registryMC.add("controlMCtrue/cut32/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registry1MC.add("controlMCtrue/cut32/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // // registryMC.add("controlMCtrue/cut32/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // // registryMC.add("controlMCtrue/cut32/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // // + // registryMC.add("controlMCcomb/cut32/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + // registryMC.add("controlMCcomb/cut32/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + // registryMC.add("controlMCcomb/cut32/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + // registryMC.add("controlMCcomb/cut32/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + // registryMC.add("controlMCcomb/cut32/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + // registryMC.add("controlMCcomb/cut32/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + // registryMC.add("controlMCcomb/cut32/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + // registryMC.add("controlMCcomb/cut32/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registry1MC.add("controlMCcomb/cut32/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // cut33 MC + registryMC.add("controlMCtrue/cut33/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut33/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut33/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut33/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut33/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut33/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut33/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut33/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut33/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut33/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut33/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut33/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut33/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut33/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut33/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut33/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut33/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut33/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut33/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut33/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut33/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut33/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut33/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut33/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut33/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // cut34 MC + // registryMC.add("controlMCtrue/cut34/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut34/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {axisInvMass4trk}}); + registryMC.add("controlMCtrue/cut34/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut34/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut34/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut34/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut34/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut34/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut34/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut34/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut34/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut34/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut34/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut34/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut34/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut34/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut34/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut34/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut34/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut34/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut34/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut34/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut34/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut34/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut34/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut34/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // cut35 MC + // registryMC.add("controlMCtrue/cut34/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut35/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {axisInvMass4trk}}); + registryMC.add("controlMCtrue/cut35/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut35/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut35/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut35/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut35/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut35/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut35/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut35/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut35/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut35/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut35/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut35/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut35/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut35/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut35/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut35/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut35/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut35/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut35/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut35/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut35/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut35/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut35/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut35/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // ptSpectrum of electron for MC true and combinatorics + registryMC.add("controlMCtrue/cut0/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut20/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut21/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut22/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut23/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut24/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut25/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut26/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut27/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut28/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut29/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut30/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut31/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + // registryMC.add("controlMCtrue/cut32/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut33/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut34/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut35/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + + registryMC.add("controlMCcomb/cut0/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut20/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut21/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut22/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut23/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut24/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut25/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut26/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut27/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut28/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut29/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut30/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut31/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut32/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut33/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut34/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut35/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + // zrobic hpTspectrumEl dla cut 0,20-35: registry.get(HIST("global/hFinalPtSpectrumEl"))->Fill(tmpPt[i]); + + // tau + registryMC.add("tauMC/hMCeta", ";#eta^{#tau};N^{#tau} ", {HistType::kTH1F, {{100, -5., 5.}}}); + registryMC.add("tauMC/hMCy", ";y^{#tau};N^{#tau}", {HistType::kTH1F, {{100, -5., 5.}}}); + registryMC.add("tauMC/hMCphi", ";#phi^{#tau};N^{#tau}", {HistType::kTH1F, {{100, 0., 6.4}}}); + registryMC.add("tauMC/hMCpt", ";#it{p}_{T}^{#tau};N^{#tau}", {HistType::kTH1F, {{100, 0., 10.}}}); + + registryMC.add("tauMC/hMCdeltaeta", ";#Delta#eta^{#tau};events ", {HistType::kTH1F, {{100, -5., 5.}}}); + registryMC.add("tauMC/hMCdeltaphi", ";#Delta#phi^{#tau}(deg.);events", {HistType::kTH1F, {{100, 131., 181}}}); + + // electron + registryMC.add("electronMC/hMCeta", ";#eta^{e};N^{e}", {HistType::kTH1F, {{100, -5., 5.}}}); + registryMC.add("electronMC/hMCy", ";y^{e};N^{e}", {HistType::kTH1F, {{100, -5., 5.}}}); + registryMC.add("electronMC/hMCphi", ";#phi^{e};N^{e}", {HistType::kTH1F, {{100, 0., 6.4}}}); + registryMC.add("electronMC/hMCpt", ";#it{p}_{T}^{e};N^{e}", {HistType::kTH1F, {{400, 0., 10.}}}); + + // efficiency mu + registryMC.add("efficiencyMCMu/effiMu", ";Efficiency #mu3#pi;events", {HistType::kTH1F, {{20, 0., 20.}}}); + registryMC.add("efficiencyMCMu/hpTmuon", ";p_{T}^{#mu, gen} (GeV/c);events", {HistType::kTH1F, {{200, 0., 5.}}}); + + // efficiency pi + registryMC.add("efficiencyMCPi/effiPi", ";Efficiency #pi3#pi;events", {HistType::kTH1F, {{20, 0., 20.}}}); + registryMC.add("efficiencyMCPi/hpTpi", ";p_{T}^{#pi, gen} (GeV/c);events", {HistType::kTH1F, {{200, 0., 5.}}}); + + // efficiency el + registryMC.add("efficiencyMCEl/effiEl", ";Efficiency e3#pi;events", {HistType::kTH1F, {{70, 0., 70.}}}); + registryMC.add("efficiencyMCEl/hpTelec", ";p_{T}^{e, gen} (GeV/c);events", {HistType::kTH1F, {axispt}}); + + // efficiency el + registryMC.add("efficiencyMCEl/hMCdeltaAlphaEpi", ";#Delta#alpha^{e-#pi(3x), gen} (rad);events", {HistType::kTH1F, {{100, -0.1, 3.2}}}); + registryMC.add("efficiencyMCEl/hMCdeltaAlphaPiPi", ";#Delta#alpha^{#pi-#pi(3x), gen} (rad);events", {HistType::kTH1F, {{100, -0.1, 3.2}}}); + registryMC.add("efficiencyMCEl/hMCdeltaPhiEpi", ";#Delta#phi^{e-#pi(3x), gen} (rad);events", {HistType::kTH1F, {{100, -0.1, 3.2}}}); + registryMC.add("efficiencyMCEl/hMCdeltaPhiPipi", ";#Delta#phi^{#pi-#pi(3x), gen} (rad);events", {HistType::kTH1F, {{100, -0.1, 3.2}}}); + registryMC.add("efficiencyMCEl/hMCvirtCal", ";virt Cal. #Delta #alpha^{#pi-#pi(3x), gen} (rad);events", {HistType::kTH1F, {{100, 0., 2.}}}); + registryMC.add("efficiencyMCEl/hMCScalar", ";A_{S}^{#pi-#pi(3x), gen};events", {HistType::kTH1F, {{100, 0., 1.}}}); + registryMC.add("efficiencyMCEl/hMCVector", ";A_{V}^{#pi-#pi(3x), gen};events", {HistType::kTH1F, {{100, 0., 2.}}}); + + // missing eta vs phi + registryMC.add("efficiencyMCEl/hMCptEl", ";p_{T}^{e, true} (GeV/c) ;events", {HistType::kTH1F, {{200, 0., 5.}}}); + // registryMC.add("efficiencyMCEl/hMCpt4trk",";p_{T}^{4 MC part.} (GeV/c) ;events",{HistType::kTH1F,{{100, 0., 5.}}}); + registryMC.add("efficiencyMCEl/hMCpt4trk", ";p_{T}^{4 MC part.} (GeV/c) ;events", {HistType::kTH1F, {axispt}}); + // registryMC.add("efficiencyMCEl/hMCinvmass4pi",";M_{inv}^{4#pi true} (GeV/c^{2}) ;events",{HistType::kTH1F,{{100, 0.4, 5.4}}}); + registryMC.add("efficiencyMCEl/hMCinvmass4pi", ";M_{inv}^{4#pi true} (GeV/c^{2}) ;events", {HistType::kTH1F, {axisInvMass4trk}}); + registryMC.add("efficiencyMCEl/hMCinvmass3pi", ";M_{inv}^{3#pi true} (GeV/c^{2}) ;events", {HistType::kTH1F, {{100, 0.4, 2.4}}}); + registryMC.add("efficiencyMCEl/hMCdeltaphi13", ";#Delta#phi^{1-3 true} ;events", {HistType::kTH1F, {{100, 0., 3.2}}}); + } + + float eta(float px, float py, float pz) + // Just a simple function to return pseudorapidity + { + float arg = -2.; // outside valid range for std::atanh + float mom = std::sqrt(px * px + py * py + pz * pz); + if (mom != 0) + arg = pz / mom; + if (-1. < arg && arg < 1.) + return std::atanh(arg); // definition of eta + return -999.; } - float CalculateDeltaPhi(TLorentzVector p, TLorentzVector p1) + float phi(float px, float py) + // Just a simple function to return azimuthal angle from 0 to 2pi { - float delta = p.Phi(); - if (delta < 0) - delta += o2::constants::math::TwoPI; - if (p1.Phi() < 0) - delta -= (p1.Phi() + o2::constants::math::TwoPI); - else - delta -= p1.Phi(); - if (delta < 0) - delta += o2::constants::math::TwoPI; + if (px != 0) + return (std::atan2(py, px) + o2::constants::math::PI); + return -999.; + } + + float pt(float px, float py) + // Just a simple function to return pt + { + return std::sqrt(px * px + py * py); + } + + float rapidity(float energy, float pz) + // Just a simple function to return track rapidity + { + return 0.5 * std::log((energy + pz) / (energy - pz)); + } + + // helper function to calculate delta alpha + float deltaAlpha(auto particle1, auto particle2) + { + + TVector3 vtmp(particle1.px(), particle1.py(), particle1.pz()); + TVector3 v1(particle2.px(), particle2.py(), particle2.pz()); + auto angle = v1.Angle(vtmp); + + return angle; + } + + float invariantMass(float E, float px, float py, float pz) + // Just a simple function to return invariant mass + { + return std::sqrt(E * E - px * px - py * py - pz * pz); + } + + float calculateDeltaPhi(TLorentzVector p, TLorentzVector p1) + { + // float delta = p.Phi(); + float delta = RecoDecay::constrainAngle(p.Phi()); + // if (delta < 0) + // delta += o2::constants::math::TwoPI; + // if (p1.Phi() < 0) + // delta -= (p1.Phi() + o2::constants::math::TwoPI); + // else + delta -= RecoDecay::constrainAngle(p1.Phi()); + delta = RecoDecay::constrainAngle(delta); + // if (delta < 0) + // delta += o2::constants::math::TwoPI; + if (delta > o2::constants::math::PI) + delta = o2::constants::math::TwoPI - delta; + return delta; + } + + float calculateDeltaPhi(float p, float p1) + { + float delta = RecoDecay::constrainAngle(p); + // if (delta < 0) + // delta += o2::constants::math::TwoPI; + // if (p1 < 0) + // delta -= (p1 + o2::constants::math::TwoPI); + // else + delta -= RecoDecay::constrainAngle(p1); + delta = RecoDecay::constrainAngle(delta); + // if (delta < 0) + // delta += o2::constants::math::TwoPI; if (delta > o2::constants::math::PI) delta = o2::constants::math::TwoPI - delta; return delta; } + // // helper function to calculate scalar asymmetry + // float scalarAsym(auto particle1, auto particle2){ + // auto delta = particle1.pt() - particle2.pt(); + // return TMath::Abs(delta)/(particle1.pt() + particle2.pt()); + // } + // + // // helper function to calculate vector asymmetry + // float vectorAsym(auto particle1, auto particle2){ + // auto delta = TMath::Sqrt((particle1.px() - particle2.px()) * (particle1.px() - particle2.px()) + + // (particle1.py() - particle2.py()) * (particle1.py() - particle2.py())); + // auto sum = TMath::Sqrt((particle1.px() + particle2.px()) * (particle1.px() + particle2.px()) + + // (particle1.py() + particle2.py()) * (particle1.py() + particle2.py())); + // return sum/delta; + // } + + // helper function to calculate scalar asymmetry + float scalarAsymMC(auto particle1, auto particle2) + { + auto pt1 = pt(particle1.px(), particle1.py()); + auto pt2 = pt(particle2.px(), particle2.py()); + auto delta = pt1 - pt2; + return std::abs(delta) / (pt1 + pt2); + } + + // helper function to calculate vector asymmetry + float vectorAsym(auto particle1, auto particle2) + { + auto delta = std::sqrt((particle1.px() - particle2.px()) * (particle1.px() - particle2.px()) + + (particle1.py() - particle2.py()) * (particle1.py() - particle2.py())); + auto sum = std::sqrt((particle1.px() + particle2.px()) * (particle1.px() + particle2.px()) + + (particle1.py() + particle2.py()) * (particle1.py() + particle2.py())); + return sum / delta; + } + // fill control histograms per track template - // void FillControlHistos(T pi3invMass, float pi3pt, float pi3deltaPhi, float pi3assymav, float pi3vector, float pi3scalar, float pi3etasum, float nCRtpc) - void FillControlHistos(T pi3invMass, float pi3pt, float pi3deltaPhi, float pi3assymav, float pi3vector, float pi3scalar, float nCRtpc) + // void fillControlHistos(T pi3invMass, float pi3pt, float pi3deltaPhi, float pi3assymav, float pi3vector, float pi3scalar, float pi3etasum, float nCRtpc) + void fillControlHistos(T pi3invMass, float pi3pt, float pi3deltaPhi, float pi3assymav, float pi3vector, float pi3scalar, float nCRtpc, float ptelec, float tofchi2) { - static constexpr std::string_view histoname[] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", - "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", - "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", - "30", "31", "32", "33", "34", "35", "36", "37", "38", "39"}; - registry.get(HIST("control/cut") + HIST(histoname[mode]) + HIST("/h3piMassComb"))->Fill(pi3invMass); - registry.get(HIST("control/cut") + HIST(histoname[mode]) + HIST("/h3trkPtTot"))->Fill(pi3pt); - registry.get(HIST("control/cut") + HIST(histoname[mode]) + HIST("/hDeltaPhi13topo"))->Fill(pi3deltaPhi); - registry.get(HIST("control/cut") + HIST(histoname[mode]) + HIST("/h13AssymPt1ProngAver"))->Fill(pi3assymav); - registry.get(HIST("control/cut") + HIST(histoname[mode]) + HIST("/h13Vector"))->Fill(pi3vector); - registry.get(HIST("control/cut") + HIST(histoname[mode]) + HIST("/h13Scalar"))->Fill(pi3scalar); - // registry.get(HIST("control/cut") + HIST(histoname[mode]) + HIST("/h13EtaSum"))->Fill(pi3etasum); - registry.get(HIST("control/cut") + HIST(histoname[mode]) + HIST("/hTPCnCrossedRows"))->Fill(nCRtpc); + static constexpr std::string_view kHistoname[] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", + "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", + "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", + "30", "31", "32", "33", "34", "35", "36", "37", "38", "39"}; + registry.get(HIST("control/cut") + HIST(kHistoname[mode]) + HIST("/h3piMassComb"))->Fill(pi3invMass); + registry.get(HIST("control/cut") + HIST(kHistoname[mode]) + HIST("/h3trkPtTot"))->Fill(pi3pt); + registry.get(HIST("control/cut") + HIST(kHistoname[mode]) + HIST("/hDeltaPhi13topo"))->Fill(pi3deltaPhi); + registry.get(HIST("control/cut") + HIST(kHistoname[mode]) + HIST("/h13AssymPt1ProngAver"))->Fill(pi3assymav); + registry.get(HIST("control/cut") + HIST(kHistoname[mode]) + HIST("/h13Vector"))->Fill(pi3vector); + registry.get(HIST("control/cut") + HIST(kHistoname[mode]) + HIST("/h13Scalar"))->Fill(pi3scalar); + // registry.get(HIST("control/cut") + HIST(kHistoname[mode]) + HIST("/h13EtaSum"))->Fill(pi3etasum); + registry.get(HIST("control/cut") + HIST(kHistoname[mode]) + HIST("/hTPCnCrossedRows"))->Fill(nCRtpc); + registry.get(HIST("control/cut") + HIST(kHistoname[mode]) + HIST("/hPtSpectrumEl"))->Fill(ptelec); + registry.get(HIST("control/cut") + HIST(kHistoname[mode]) + HIST("/hTofChi2El"))->Fill(tofchi2); + } + + // fill control histograms per track in MC true + template + void fillControlHistosMCtrue(T pi3invMass, float pi3pt, float pi3deltaPhi, float pi3assymav, float pi3vector, float pi3scalar, float nCRtpc, float ptelec, float tofchi2) + { + static constexpr std::string_view kHistoname[] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", + "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", + "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", + "30", "31", "32", "33", "34", "35", "36", "37", "38", "39"}; + registryMC.get(HIST("controlMCtrue/cut") + HIST(kHistoname[mode]) + HIST("/h3piMass"))->Fill(pi3invMass); + registryMC.get(HIST("controlMCtrue/cut") + HIST(kHistoname[mode]) + HIST("/h3trkPtTot"))->Fill(pi3pt); + registryMC.get(HIST("controlMCtrue/cut") + HIST(kHistoname[mode]) + HIST("/hDeltaPhi13topo"))->Fill(pi3deltaPhi); + registryMC.get(HIST("controlMCtrue/cut") + HIST(kHistoname[mode]) + HIST("/h13AssymPt1ProngAver"))->Fill(pi3assymav); + registryMC.get(HIST("controlMCtrue/cut") + HIST(kHistoname[mode]) + HIST("/h13Vector"))->Fill(pi3vector); + registryMC.get(HIST("controlMCtrue/cut") + HIST(kHistoname[mode]) + HIST("/h13Scalar"))->Fill(pi3scalar); + registryMC.get(HIST("controlMCtrue/cut") + HIST(kHistoname[mode]) + HIST("/hTPCnCrossedRows"))->Fill(nCRtpc); + registryMC.get(HIST("controlMCtrue/cut") + HIST(kHistoname[mode]) + HIST("/hPtSpectrumEl"))->Fill(ptelec); + // registryMC.get(HIST("controlMCtrue/cut") + HIST(kHistoname[mode]) + HIST("/h13EtaSum"))->Fill(pi3etasum); + registry1MC.get(HIST("controlMCtrue/cut") + HIST(kHistoname[mode]) + HIST("/hTofChi2El"))->Fill(tofchi2); + } + + // fill control histograms per track in MC true + template + void fillControlHistosMCcomb(T pi3invMass, float pi3pt, float pi3deltaPhi, float pi3assymav, float pi3vector, float pi3scalar, float nCRtpc, float ptelec, float tofchi2) + { + static constexpr std::string_view kHistoname[] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", + "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", + "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", + "30", "31", "32", "33", "34", "35", "36", "37", "38", "39"}; + registryMC.get(HIST("controlMCcomb/cut") + HIST(kHistoname[mode]) + HIST("/h3piMass"))->Fill(pi3invMass); + registryMC.get(HIST("controlMCcomb/cut") + HIST(kHistoname[mode]) + HIST("/h3trkPtTot"))->Fill(pi3pt); + registryMC.get(HIST("controlMCcomb/cut") + HIST(kHistoname[mode]) + HIST("/hDeltaPhi13topo"))->Fill(pi3deltaPhi); + registryMC.get(HIST("controlMCcomb/cut") + HIST(kHistoname[mode]) + HIST("/h13AssymPt1ProngAver"))->Fill(pi3assymav); + registryMC.get(HIST("controlMCcomb/cut") + HIST(kHistoname[mode]) + HIST("/h13Vector"))->Fill(pi3vector); + registryMC.get(HIST("controlMCcomb/cut") + HIST(kHistoname[mode]) + HIST("/h13Scalar"))->Fill(pi3scalar); + registryMC.get(HIST("controlMCcomb/cut") + HIST(kHistoname[mode]) + HIST("/hTPCnCrossedRows"))->Fill(nCRtpc); + registryMC.get(HIST("controlMCcomb/cut") + HIST(kHistoname[mode]) + HIST("/hPtSpectrumEl"))->Fill(ptelec); + // registryMC.get(HIST("controlMCtrue/cut") + HIST(kHistoname[mode]) + HIST("/h13EtaSum"))->Fill(pi3etasum); + registry1MC.get(HIST("controlMCcomb/cut") + HIST(kHistoname[mode]) + HIST("/hTofChi2El"))->Fill(tofchi2); } template - int TrackCheck(T track) + int trackCheck(T track) { // 1 if (track.hasITS() && !track.hasTPC() && !track.hasTRD() && !track.hasTOF()) @@ -653,9 +1559,16 @@ struct TauTau13topo { using UDCollisionFull2 = UDCollisionsFull2::iterator; // PVContributors - Filter PVContributorFilter = aod::udtrack::isPVContributor == true; + Filter pVContributorFilter = aod::udtrack::isPVContributor == true; using PVTracks = soa::Filtered; + // using LabeledTracks = soa::Join; + using LabeledTracks = soa::Join; + Preslice perCollision = aod::udtrack::udCollisionId; + // PVContributors in MC handling + Filter pVContributorFilterMC = aod::udtrack::isPVContributor == true; + using PVTracksMC = soa::Filtered; + // void processDG(UDCollisionFull const& dgcand, UDTracksFull const& dgtracks) // { // int gapSide = 2; @@ -664,10 +1577,15 @@ struct TauTau13topo { // PROCESS_SWITCH(TauTau13topo, processDG, "Process DG data", DGactive); // void processSG(UDCollisionFull2 const& dgcand, UDTracksFull const& dgtracks) - void process(UDCollisionFull2 const& dgcand, UDTracksFull const& dgtracks, PVTracks const& PVContributors) + void processDataSG(UDCollisionFull2 const& dgcand, UDTracksFull const& dgtracks, PVTracks const& PVContributors) { + registry.get(HIST("global/hEventEff"))->Fill(0., 1.); + registry.get(HIST("global/RunNumber"))->Fill(dgcand.runNumber()); + registry.get(HIST("global/hRecFlag"))->Fill(dgcand.flags()); // reconstruction with upc settings flag + // registry.get(HIST("global/hOccupancyInTime"))->Fill(dgcand.occupancyInTime()); + int gapSide = dgcand.gapSide(); - int truegapSide = sgSelector.trueGap(dgcand, FV0_cut, FT0A_cut, FT0C_cut, ZDC_cut); + int truegapSide = sgSelector.trueGap(dgcand, cutFV0, cutFT0A, cutFT0C, cutZDC); registry.fill(HIST("global/GapSide"), gapSide); registry.fill(HIST("global/GapSideTrue"), truegapSide); if (gapSide < 0 || gapSide > 2) @@ -679,7 +1597,8 @@ struct TauTau13topo { // // void mainTask(int gapSide, UDTracksFull const& dgtracks) // { - if (gapSide != gap_Side) + registry.get(HIST("global/hEventEff"))->Fill(1., 1.); + if (gapSide != mGapSide) return; // global checks registry.get(HIST("global/hVertexXY"))->Fill(dgcand.posX(), dgcand.posY()); @@ -696,15 +1615,15 @@ struct TauTau13topo { registry.get(HIST("global/hNTracksPV"))->Fill(PVContributors.size()); // zdc information - float ZNAenergy = dgcand.energyCommonZNA(); - float ZNCenergy = dgcand.energyCommonZNC(); - // if (ZNAenergy < 0) registry.get(HIST("global/hZNACenergyTest"))->Fill(ZNAenergy); - // if (ZNCenergy < 0) registry.get(HIST("global/hZNACenergyTest"))->Fill(ZNCenergy); - if (ZNAenergy < 0) - ZNAenergy = -1.; - if (ZNCenergy < 0) - ZNCenergy = -1.; - registry.get(HIST("global/hZNACenergy"))->Fill(ZNAenergy, ZNCenergy); + float energyZNA = dgcand.energyCommonZNA(); + float energyZNC = dgcand.energyCommonZNC(); + // if (energyZNA < 0) registry.get(HIST("global/hZNACenergyTest"))->Fill(energyZNA); + // if (energyZNC < 0) registry.get(HIST("global/hZNACenergyTest"))->Fill(energyZNC); + if (energyZNA < 0) + energyZNA = -1.; + if (energyZNC < 0) + energyZNC = -1.; + registry.get(HIST("global/hZNACenergy"))->Fill(energyZNA, energyZNC); registry.get(HIST("global/hZNACtime"))->Fill(dgcand.timeZNA(), dgcand.timeZNC()); uint32_t clusterSizes; @@ -715,17 +1634,15 @@ struct TauTau13topo { int nITSbits = -1; int npT100 = 0; TLorentzVector p; - auto pionMass = pdg->Mass(211); - auto electronMass = pdg->Mass(11); - // TParticlePDG* pion = pdg->GetParticle(211); - // TParticlePDG* electron = pdg->GetParticle(11); + // auto const pionMass = MassPiPlus; + // auto const electronMass = MassElectron; bool flagGlobalCheck = true; bool isGlobalTrack = true; int qtot = 0; // loop over PV contributors for (const auto& trk : PVContributors) { qtot += trk.sign(); - p.SetXYZM(trk.px(), trk.py(), trk.pz(), pionMass); + p.SetXYZM(trk.px(), trk.py(), trk.pz(), MassPiPlus); registry.get(HIST("global/hTrackPtPV"))->Fill(p.Pt()); if (std::abs(p.Eta()) < trkEtacut) nEtaIn15++; // 1.5 is a default @@ -855,7 +1772,7 @@ struct TauTau13topo { // // selection // - registry.get(HIST("global/hEventEff"))->Fill(0., 1.); + registry.get(HIST("global/hEventEff"))->Fill(2., 1.); // skip events with too few/many tracks // if (PVContributors.size() != 4 || dgcand.numContrib() != 4) { @@ -873,35 +1790,44 @@ struct TauTau13topo { // return; // } - registry.get(HIST("global/hEventEff"))->Fill(1., 1.); + registry.get(HIST("global/hEventEff"))->Fill(3., 1.); // registry.get(HIST("global1/hTrackPVTotCharge"))->Fill(dgcand.netCharge()); registry.get(HIST("global1/hTrackPVTotCharge"))->Fill(qtot); registry.get(HIST("global1/hVertexZ"))->Fill(dgcand.posZ()); registry.get(HIST("global1/hNTracks"))->Fill(dgtracks.size()); registry.get(HIST("global1/hNTracksPV"))->Fill(PVContributors.size()); for (const auto& trk : PVContributors) { - p.SetXYZM(trk.px(), trk.py(), trk.pz(), pionMass); + p.SetXYZM(trk.px(), trk.py(), trk.pz(), MassPiPlus); registry.get(HIST("global1/hTrackPtPV"))->Fill(p.Pt()); registry.get(HIST("global1/hTrackEtaPhiPV"))->Fill(p.Eta(), p.Phi()); } - // if vz < 15 - if (std::abs(dgcand.posZ()) >= zvertexcut) { // default = 15 + // if vz < 10 + if (std::abs(dgcand.posZ()) >= zvertexcut) { // default = 10 if (verbose) { LOGF(info, " Candidate rejected: VertexZ is %f", dgcand.posZ()); } return; } - registry.get(HIST("global/hEventEff"))->Fill(2., 1.); + registry.get(HIST("global/hEventEff"))->Fill(4., 1.); // if eta tracks <1.5 if (nEtaIn15 != 4) { if (verbose) { - LOGF(info, " Candidate rejected: Ntrk inside |eta|<1.5 is %d", nEtaIn15); + LOGF(info, " Candidate rejected: Ntrk inside |eta|<0.9 is %d", nEtaIn15); } return; } - registry.get(HIST("global/hEventEff"))->Fill(3., 1.); + registry.get(HIST("global/hEventEff"))->Fill(5., 1.); + + // if pt tracks >0.100 GeV/c + if (npT100 != 4) { + if (verbose) { + LOGF(info, " Candidate rejected: number of tracks with pT>0.1GeV/c is %d", npT100); + } + return; + } + registry.get(HIST("global/hEventEff"))->Fill(6., 1.); // skip events with net charge != 0 if (!sameSign) { // opposite sign is signal @@ -921,7 +1847,7 @@ struct TauTau13topo { return; } } - registry.get(HIST("global/hEventEff"))->Fill(4., 1.); + registry.get(HIST("global/hEventEff"))->Fill(7., 1.); // // skip events with out-of-range rgtrwTOF (fraction-of-good-tracks-with-TOF-hit) // auto rtrwTOF = udhelpers::rPVtrwTOF(dgtracks, PVContributors.size()); @@ -931,8 +1857,36 @@ struct TauTau13topo { // } // return; // } + + // n TOF tracks cut + if (nTofTrk < nTofTrkMinCut) { + if (verbose) { + LOGF(info, " Candidate rejected: nTOFtracks is %d", nTofTrk); + } + return; + } + registry.get(HIST("global/hEventEff"))->Fill(8., 1.); + // // FIT informaton + // + auto bitMin = 16 - mFITvetoWindow; // default is +- 1 bc (1 bit) + auto bitMax = 16 + mFITvetoWindow; + bool flagFITveto = false; + // check FIT information + for (auto bit = bitMin; bit <= bitMax; bit++) { + if (TESTBIT(dgcand.bbFT0Apf(), bit)) + flagFITveto = true; + if (TESTBIT(dgcand.bbFT0Cpf(), bit)) + flagFITveto = true; + if (useFV0ForVeto && TESTBIT(dgcand.bbFV0Apf(), bit)) + flagFITveto = true; + if (useFDDAForVeto && TESTBIT(dgcand.bbFDDApf(), bit)) + flagFITveto = true; + if (useFDDCForVeto && TESTBIT(dgcand.bbFDDCpf(), bit)) + flagFITveto = true; + } // end of loop over FIT bits + // FIT histos for (auto bit = 0; bit <= 32; bit++) { registry.get(HIST("fit/bbFT0Abit"))->Fill(bit, TESTBIT(dgcand.bbFT0Apf(), bit)); registry.get(HIST("fit/bbFT0Cbit"))->Fill(bit, TESTBIT(dgcand.bbFT0Cpf(), bit)); @@ -951,28 +1905,14 @@ struct TauTau13topo { registry.get(HIST("fit/timeFT0"))->Fill(dgcand.timeFT0A(), dgcand.timeFT0C()); registry.get(HIST("fit/timeFDD"))->Fill(dgcand.timeFDDA(), dgcand.timeFDDC()); - // check FIT information - // auto bitMin = -1 + 16; - // auto bitMax = 1 + 16; - // for (auto bit = bitMin; bit <= bitMax; bit++) { - // if (TESTBIT(dgcand.bbFT0Apf(), bit) || - // TESTBIT(dgcand.bbFT0Cpf(), bit) || - // TESTBIT(dgcand.bbFV0Apf(), bit) || - // TESTBIT(dgcand.bbFDDApf(), bit) || - // TESTBIT(dgcand.bbFDDCpf(), bit)) { - // return; - // } - // } - // registry.get(HIST("global/hEventEff"))->Fill(5., 1.); - - // if pt tracks >0.100 GeV/c - if (npT100 != 4) { + // FIT empty + if (mFITvetoFlag && flagFITveto) { if (verbose) { - LOGF(info, " Candidate rejected: number of tracks with pT>0.1GeV/c is %d", npT100); + LOGF(info, " Candidate rejected: FIT is not empty"); } return; } - registry.get(HIST("global/hEventEff"))->Fill(5., 1.); + registry.get(HIST("global/hEventEff"))->Fill(9., 1.); // // here PID from TPC starts to be @@ -981,6 +1921,7 @@ struct TauTau13topo { float tmpMomentum[4]; float tmpPt[4]; float tmpDedx[4]; + float tmpTofNsigmaEl[4]; float pi3invMass[4]; float pi3pt[4]; float pi3deltaPhi[4]; @@ -995,13 +1936,14 @@ struct TauTau13topo { float nSigma3Pi[4] = {0., 0., 0., 0.}; float nSigmaPr[4]; float nSigmaKa[4]; - float dcaZ[4]; - float dcaXY[4]; - float chi2TPC[4]; - float chi2ITS[4]; - float nclTPCfind[4]; + // float dcaZ[4]; + // float dcaXY[4]; + // float chi2TPC[4]; + // float chi2ITS[4]; + float chi2TOF[4]; + // float nclTPCfind[4]; float nclTPCcrossedRows[4]; - bool tmpHasTOF[4]; + bool trkHasTof[4]; float mass3pi1e[4]; double trkTime[4]; float trkTimeRes[4]; @@ -1019,11 +1961,11 @@ struct TauTau13topo { bool flagIMGam2ePV[4] = {true, true, true, true}; for (const auto& trk : PVContributors) { - p.SetXYZM(trk.px(), trk.py(), trk.pz(), electronMass); + p.SetXYZM(trk.px(), trk.py(), trk.pz(), MassElectron); for (const auto& trk1 : PVContributors) { if (trk.index() >= trk1.index()) continue; - p1.SetXYZM(trk1.px(), trk1.py(), trk1.pz(), electronMass); + p1.SetXYZM(trk1.px(), trk1.py(), trk1.pz(), MassElectron); invMass2El[(counterTmp < 3 ? counterTmp : 5 - counterTmp)][(counterTmp < 3 ? 0 : 1)] = (p + p1).Mag2(); gammaPair[(counterTmp < 3 ? counterTmp : 5 - counterTmp)][(counterTmp < 3 ? 0 : 1)] = (p + p1); registry.get(HIST("control/cut0/hInvMass2ElAll"))->Fill((p + p1).Mag2()); @@ -1038,7 +1980,7 @@ struct TauTau13topo { // first loop to add all the tracks together p = TLorentzVector(0., 0., 0., 0.); for (const auto& trk : PVContributors) { - p1.SetXYZM(trk.px(), trk.py(), trk.pz(), pionMass); + p1.SetXYZM(trk.px(), trk.py(), trk.pz(), MassPiPlus); p += p1; scalarPtsum += trk.pt(); } // end of loop over PVContributors @@ -1056,12 +1998,12 @@ struct TauTau13topo { counterTmp = 0; int tmpTrkCheck = -1; for (const auto& trk : PVContributors) { - tmpTrkCheck = TrackCheck(trk); // check detectors associated to track + tmpTrkCheck = trackCheck(trk); // check detectors associated to track registry.get(HIST("global/hTrkCheck"))->Fill(tmpTrkCheck); // inv mass of 3pi + 1e - p1.SetXYZM(trk.px(), trk.py(), trk.pz(), pionMass); - p2.SetXYZM(trk.px(), trk.py(), trk.pz(), electronMass); + p1.SetXYZM(trk.px(), trk.py(), trk.pz(), MassPiPlus); + p2.SetXYZM(trk.px(), trk.py(), trk.pz(), MassElectron); mass3pi1e[counterTmp] = (p - p1 + p2).Mag(); v1.SetXYZ(trk.px(), trk.py(), trk.pz()); @@ -1078,31 +2020,36 @@ struct TauTau13topo { nSigmaEl[counterTmp] = trk.tpcNSigmaEl(); nSigmaPi[counterTmp] = trk.tpcNSigmaPi(); nSigma3Pi[3] += (nSigmaPi[counterTmp] * nSigmaPi[counterTmp]); - nSigmaPr[counterTmp] = trk.tpcNSigmaPr(); - nSigmaKa[counterTmp] = trk.tpcNSigmaKa(); - dcaZ[counterTmp] = trk.dcaZ(); - dcaXY[counterTmp] = trk.dcaXY(); - chi2TPC[counterTmp] = trk.tpcChi2NCl(); - chi2ITS[counterTmp] = trk.itsChi2NCl(); - nclTPCfind[counterTmp] = trk.tpcNClsFindable(); + // nSigmaPr[counterTmp] = trk.tpcNSigmaPr(); + nSigmaPr[counterTmp] = std::sqrt(trk.tofNSigmaPr() * trk.tofNSigmaPr() + trk.tpcNSigmaPr() * trk.tpcNSigmaPr()); + // nSigmaKa[counterTmp] = trk.tpcNSigmaKa(); + nSigmaKa[counterTmp] = std::sqrt(trk.tofNSigmaKa() * trk.tofNSigmaKa() + trk.tpcNSigmaKa() * trk.tpcNSigmaKa()); + // dcaZ[counterTmp] = trk.dcaZ(); + // dcaXY[counterTmp] = trk.dcaXY(); + // chi2TPC[counterTmp] = trk.tpcChi2NCl(); + // chi2ITS[counterTmp] = trk.itsChi2NCl(); + chi2TOF[counterTmp] = trk.tofChi2(); + // nclTPCfind[counterTmp] = trk.tpcNClsFindable(); nclTPCcrossedRows[counterTmp] = trk.tpcNClsCrossedRows(); - tmpHasTOF[counterTmp] = trk.hasTOF(); + trkHasTof[counterTmp] = trk.hasTOF(); trkTime[counterTmp] = trk.trackTime(); trkTimeRes[counterTmp] = trk.trackTimeRes(); - p1.SetXYZM(trk.px(), trk.py(), trk.pz(), pionMass); + p1.SetXYZM(trk.px(), trk.py(), trk.pz(), MassPiPlus); tmpMomentum[counterTmp] = p1.P(); tmpPt[counterTmp] = p1.Pt(); tmpDedx[counterTmp] = trk.tpcSignal(); + tmpTofNsigmaEl[counterTmp] = trk.tofNSigmaEl(); - deltaPhiTmp = CalculateDeltaPhi(p - p1, p1); + deltaPhiTmp = calculateDeltaPhi(p - p1, p1); pi3invMass[counterTmp] = (p - p1).Mag(); pi3pt[counterTmp] = (p - p1).Pt(); pi3deltaPhi[counterTmp] = deltaPhiTmp; pi3assymav[counterTmp] = (p1.Pt() - (scalarPtsum - p1.Pt()) / 3.) / (p1.Pt() + (scalarPtsum - p1.Pt()) / 3.); - pi3vector[counterTmp] = (p + p1).Pt() / (p - p1).Pt(); - pi3scalar[counterTmp] = (p.Pt() - p1.Pt()) / (p.Pt() + p1.Pt()); - // pi3etasum[counterTmp] = (p - p1).Eta() + p1.Eta(); + // pi3vector[counterTmp] = (p + p1).Pt() / (p - p1).Pt(); + pi3vector[counterTmp] = p.Pt() / (p - p1 - p1).Pt(); + // pi3scalar[counterTmp] = (p.Pt() - p1.Pt()) / (p.Pt() + p1.Pt()); + pi3scalar[counterTmp] = ((p - p1).Pt() - p1.Pt()) / ((p - p1).Pt() + p1.Pt()); counterTmp++; } // end of loop over PVContributors @@ -1120,7 +2067,7 @@ struct TauTau13topo { for (int i = 0; i < 4; i++) { if (i == iTmpBest) continue; - trkTimeTot += fabs(trkTime[iTmpBest] - trkTime[i]); + trkTimeTot += std::abs(trkTime[iTmpBest] - trkTime[i]); } trkTimeResTot = std::sqrt(trkTimeRes[0] * trkTimeRes[0] + trkTimeRes[1] * trkTimeRes[1] + @@ -1129,9 +2076,10 @@ struct TauTau13topo { // control histos, max 4 per event, cut0 for (int i = 0; i < 4; i++) { - FillControlHistos<0>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i]); + fillControlHistos<0>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); registry.get(HIST("control/cut0/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); registry.get(HIST("pidTPC/hpvsdedxElHipCut0"))->Fill(tmpMomentum[i], tmpDedx[i]); + registry.get(HIST("pidTOF/hpvsNsigmaElHipCut0"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); // nsigma3Pi calculation nSigma3Pi[i] = nSigma3Pi[3] - (nSigmaPi[i] * nSigmaPi[i]); nSigma3Pi[i] = std::sqrt(nSigma3Pi[i]); @@ -1144,7 +2092,7 @@ struct TauTau13topo { registry.get(HIST("control/cut0/h4piMass"))->Fill(mass4pi); registry.get(HIST("control/cut0/h4trkMassVsPt"))->Fill(mass4pi, pttot); registry.get(HIST("control/cut0/hNtofTrk"))->Fill(nTofTrk); - registry.get(HIST("control/cut0/hZNACenergy"))->Fill(ZNAenergy, ZNCenergy); + registry.get(HIST("control/cut0/hZNACenergy"))->Fill(energyZNA, energyZNC); if (pttot < 0.150) { // give all the gg combinations @@ -1189,7 +2137,7 @@ struct TauTau13topo { registry.get(HIST("control/cut0/hGamAS"))->Fill(scalarAsym); registry.get(HIST("control/cut0/hGamAV"))->Fill(vectorAsym); registry.get(HIST("control/cut0/hInvMass2GamCoh"))->Fill((gammaPair[whichPair][1] + gammaPair[whichPair][0]).M()); - registry.get(HIST("control/cut0/hDeltaPhi2GamCoh"))->Fill(CalculateDeltaPhi(gammaPair[whichPair][1], gammaPair[whichPair][0])); + registry.get(HIST("control/cut0/hDeltaPhi2GamCoh"))->Fill(calculateDeltaPhi(gammaPair[whichPair][1], gammaPair[whichPair][0])); for (int j = 0; j < 4; j++) registry.get(HIST("pidTPC/hpvsdedxElHipCut40"))->Fill(tmpMomentum[j], tmpDedx[j]); if ((gammaPair[whichPair][1] + gammaPair[whichPair][0]).M() > 3. && @@ -1206,7 +2154,7 @@ struct TauTau13topo { registry.get(HIST("control/cut20/hGamAS"))->Fill(scalarAsym); registry.get(HIST("control/cut20/hGamAV"))->Fill(vectorAsym); registry.get(HIST("control/cut20/hInvMass2GamCoh"))->Fill((gammaPair[whichPair][1] + gammaPair[whichPair][0]).M()); - registry.get(HIST("control/cut20/hDeltaPhi2GamCoh"))->Fill(CalculateDeltaPhi(gammaPair[whichPair][1], gammaPair[whichPair][0])); + registry.get(HIST("control/cut20/hDeltaPhi2GamCoh"))->Fill(calculateDeltaPhi(gammaPair[whichPair][1], gammaPair[whichPair][0])); } } // ngam = 1 @@ -1327,508 +2275,2074 @@ struct TauTau13topo { registry.get(HIST("global/hNCombAfterCut"))->Fill(55. + counterTotal, 1.); // draw PID histograms + // + // electron + // if (counterEl > 0) { // Nelectrons>0, cut20 - registry.get(HIST("global/hEventEff"))->Fill(6., 1.); + registry.get(HIST("global/hEventEff"))->Fill(10., 1.); registry.get(HIST("control/cut20/h4trkPtTot"))->Fill(pttot); registry.get(HIST("control/cut20/h4piMass"))->Fill(mass4pi); registry.get(HIST("control/cut20/h4trkMassVsPt"))->Fill(mass4pi, pttot); registry.get(HIST("control/cut20/hNtofTrk"))->Fill(nTofTrk); - registry.get(HIST("control/cut20/hZNACenergy"))->Fill(ZNAenergy, ZNCenergy); + registry.get(HIST("control/cut20/hZNACenergy"))->Fill(energyZNA, energyZNC); for (int i = 0; i < 4; i++) { if (flagEl[i]) { registry.get(HIST("pidTPC/hpvsdedxElHipCut20"))->Fill(tmpMomentum[i], tmpDedx[i]); + registry.get(HIST("pidTOF/hpvsNsigmaElHipCut20"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); // for (int j = 0; j < 4; j++) { // if (i == j) continue; // registry.get(HIST("pidTPC3pi/hpvsdedxElHipCut20"))->Fill(tmpMomentum[j], tmpDedx[j]); // } - FillControlHistos<20>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i]); + fillControlHistos<20>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); registry.get(HIST("control/cut20/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); registry.get(HIST("control/cut20/hsigma3Pi"))->Fill(nSigma3Pi[i]); registry.get(HIST("control/cut20/h3pi1eMass"))->Fill(mass3pi1e[i]); } } + } else { + // no electron + if (verbose) { + LOGF(debug, " Candidate rejected: no electron PID among 4 tracks"); + } + return; + } // end of Nelectrons check - if (flagEl[0] * flagPi[0] + flagEl[1] * flagPi[1] + flagEl[2] * flagPi[2] + flagEl[3] * flagPi[3] > 0) { // pi veto, cut21 - registry.get(HIST("global/hEventEff"))->Fill(7., 1.); - registry.get(HIST("control/cut21/h4trkPtTot"))->Fill(pttot); - registry.get(HIST("control/cut21/h4piMass"))->Fill(mass4pi); - registry.get(HIST("control/cut21/h4trkMassVsPt"))->Fill(mass4pi, pttot); - registry.get(HIST("control/cut21/hNtofTrk"))->Fill(nTofTrk); - registry.get(HIST("control/cut21/hZNACenergy"))->Fill(ZNAenergy, ZNCenergy); - for (int i = 0; i < 4; i++) { - if (flagEl[i] && flagPi[i]) { - registry.get(HIST("pidTPC/hpvsdedxElHipCut21"))->Fill(tmpMomentum[i], tmpDedx[i]); - // for (int j = 0; j < 4; j++) { - // if (i == j) continue; - // registry.get(HIST("pidTPC3pi/hpvsdedxElHipCut21"))->Fill(tmpMomentum[j], tmpDedx[j]); - // } - FillControlHistos<21>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i]); - registry.get(HIST("control/cut21/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); - registry.get(HIST("control/cut21/hsigma3Pi"))->Fill(nSigma3Pi[i]); - registry.get(HIST("control/cut21/h3pi1eMass"))->Fill(mass3pi1e[i]); - } + // + // electron with tof hit (cut33) + // + if (flagEl[0] * trkHasTof[0] + + flagEl[1] * trkHasTof[1] + + flagEl[2] * trkHasTof[2] + + flagEl[3] * trkHasTof[3] > + 0) { // electron has tof hit cut 33 + registry.get(HIST("global/hEventEff"))->Fill(11., 1.); + // registry.get(HIST("control/cut33/hDcaZ"))->Fill(dcaZ[i]); + // registry.get(HIST("control/cut33/hDcaXY"))->Fill(dcaXY[i]); + // registry.get(HIST("control/cut33/hChi2TPC"))->Fill(chi2TPC[i]); + // registry.get(HIST("control/cut33/hChi2ITS"))->Fill(chi2ITS[i]); + registry.get(HIST("control/cut33/h4trkPtTot"))->Fill(pttot); + registry.get(HIST("control/cut33/h4piMass"))->Fill(mass4pi); + registry.get(HIST("control/cut33/h4trkMassVsPt"))->Fill(mass4pi, pttot); + registry.get(HIST("control/cut33/hNtofTrk"))->Fill(nTofTrk); + registry.get(HIST("control/cut33/hZNACenergy"))->Fill(energyZNA, energyZNC); + for (int i = 0; i < 4; i++) { + if (flagEl[i] && trkHasTof[i]) { + fillControlHistos<33>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registry.get(HIST("control/cut33/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + registry.get(HIST("pidTPC/hpvsdedxElHipCut33"))->Fill(tmpMomentum[i], tmpDedx[i]); + registry.get(HIST("pidTOF/hpvsNsigmaElHipCut33"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + registry.get(HIST("control/cut33/hsigma3Pi"))->Fill(nSigma3Pi[i]); + registry.get(HIST("control/cut33/h3pi1eMass"))->Fill(mass3pi1e[i]); + // registry.get(HIST("control/cut33/hPtSpectrumEl"))->Fill(tmpPt[i]); + } // only for electron + } + } else { + if (verbose) { + LOGF(info, "cut33 trackTime %f, %f, %f, %f Res %f, %f, %f, %f", trkTime[0], trkTime[1], trkTime[2], trkTime[3], trkTimeRes[0], trkTimeRes[1], trkTimeRes[2], trkTimeRes[3]); + LOGF(debug, " Candidate rejected: no TOF hit for electron"); + } + return; + } // end of tof hit for electron + + // + // pi veto cut21 + // + if (flagEl[0] * trkHasTof[0] * flagPi[0] + + flagEl[1] * trkHasTof[1] * flagPi[1] + + flagEl[2] * trkHasTof[2] * flagPi[2] + + flagEl[3] * trkHasTof[3] * flagPi[3] > + 0) { // pi veto, cut21 + registry.get(HIST("global/hEventEff"))->Fill(12., 1.); + registry.get(HIST("control/cut21/h4trkPtTot"))->Fill(pttot); + registry.get(HIST("control/cut21/h4piMass"))->Fill(mass4pi); + registry.get(HIST("control/cut21/h4trkMassVsPt"))->Fill(mass4pi, pttot); + registry.get(HIST("control/cut21/hNtofTrk"))->Fill(nTofTrk); + registry.get(HIST("control/cut21/hZNACenergy"))->Fill(energyZNA, energyZNC); + for (int i = 0; i < 4; i++) { + if (flagEl[i] && trkHasTof[i] && flagPi[i]) { + registry.get(HIST("pidTPC/hpvsdedxElHipCut21"))->Fill(tmpMomentum[i], tmpDedx[i]); + registry.get(HIST("pidTOF/hpvsNsigmaElHipCut21"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + fillControlHistos<21>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registry.get(HIST("control/cut21/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + registry.get(HIST("control/cut21/hsigma3Pi"))->Fill(nSigma3Pi[i]); + registry.get(HIST("control/cut21/h3pi1eMass"))->Fill(mass3pi1e[i]); } + } + } else { + if (verbose) { + LOGF(debug, " Candidate rejected: all electrons vetoed by pi PID"); + } + return; + } // end of pi veto - if (flagEl[0] * flagPi[0] * !flagVcalPV[0] + - flagEl[1] * flagPi[1] * !flagVcalPV[1] + - flagEl[2] * flagPi[2] * !flagVcalPV[2] + - flagEl[3] * flagPi[3] * !flagVcalPV[3] > - 0) { // vcal veto, cut22 - registry.get(HIST("global/hEventEff"))->Fill(8., 1.); - registry.get(HIST("control/cut22/h4trkPtTot"))->Fill(pttot); - registry.get(HIST("control/cut22/h4piMass"))->Fill(mass4pi); - registry.get(HIST("control/cut22/h4trkMassVsPt"))->Fill(mass4pi, pttot); - registry.get(HIST("control/cut22/hNtofTrk"))->Fill(nTofTrk); - registry.get(HIST("control/cut22/hZNACenergy"))->Fill(ZNAenergy, ZNCenergy); - for (int i = 0; i < 4; i++) { - if (flagEl[i] && flagPi[i] && !flagVcalPV[i]) { - registry.get(HIST("pidTPC/hpvsdedxElHipCut22"))->Fill(tmpMomentum[i], tmpDedx[i]); - // for (int j = 0; j < 4; j++) { - // if (i == j) continue; - // registry.get(HIST("pidTPC3pi/hpvsdedxElHipCut22"))->Fill(tmpMomentum[j], tmpDedx[j]); - // } - FillControlHistos<22>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i]); - registry.get(HIST("control/cut22/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); - registry.get(HIST("control/cut22/hsigma3Pi"))->Fill(nSigma3Pi[i]); - registry.get(HIST("control/cut22/h3pi1eMass"))->Fill(mass3pi1e[i]); - } - } + // + // proton veto + // + if (flagEl[0] * trkHasTof[0] * flagPi[0] * flagPr[0] + + flagEl[1] * trkHasTof[1] * flagPi[1] * flagPr[1] + + flagEl[2] * trkHasTof[2] * flagPi[2] * flagPr[2] + + flagEl[3] * trkHasTof[3] * flagPi[3] * flagPr[3] > + 0) { // proton veto, cut24 + registry.get(HIST("global/hEventEff"))->Fill(13., 1.); + registry.get(HIST("control/cut24/h4trkPtTot"))->Fill(pttot); + registry.get(HIST("control/cut24/h4piMass"))->Fill(mass4pi); + registry.get(HIST("control/cut24/h4trkMassVsPt"))->Fill(mass4pi, pttot); + registry.get(HIST("control/cut24/hNtofTrk"))->Fill(nTofTrk); + registry.get(HIST("control/cut24/hZNACenergy"))->Fill(energyZNA, energyZNC); + for (int i = 0; i < 4; i++) { + if (flagEl[i] && trkHasTof[i] && flagPi[i] && flagPr[i]) { + registry.get(HIST("pidTPC/hpvsdedxElHipCut24"))->Fill(tmpMomentum[i], tmpDedx[i]); + registry.get(HIST("pidTOF/hpvsNsigmaElHipCut24"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + // for (int j = 0; j < 4; j++) { + // if (i == j) continue; + // registry.get(HIST("pidTPC3pi/hpvsdedxElHipCut24"))->Fill(tmpMomentum[j], tmpDedx[j]); + // } + fillControlHistos<24>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registry.get(HIST("control/cut24/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + registry.get(HIST("control/cut24/hsigma3Pi"))->Fill(nSigma3Pi[i]); + registry.get(HIST("control/cut24/h3pi1eMass"))->Fill(mass3pi1e[i]); + } + } + } else { + if (verbose) { + LOGF(debug, " Candidate rejected: all electrons vetoed by piPID+Vcal+pT+prPID"); + } + return; + } // end of proton veto - if (flagEl[0] * flagPi[0] * !flagVcalPV[0] * flagPt[0] + - flagEl[1] * flagPi[1] * !flagVcalPV[1] * flagPt[1] + - flagEl[2] * flagPi[2] * !flagVcalPV[2] * flagPt[2] + - flagEl[3] * flagPi[3] * !flagVcalPV[3] * flagPt[3] > - 0) { // pT veto, cut23 - registry.get(HIST("global/hEventEff"))->Fill(9., 1.); - registry.get(HIST("control/cut23/h4trkPtTot"))->Fill(pttot); - registry.get(HIST("control/cut23/h4piMass"))->Fill(mass4pi); - registry.get(HIST("control/cut23/h4trkMassVsPt"))->Fill(mass4pi, pttot); - registry.get(HIST("control/cut23/hNtofTrk"))->Fill(nTofTrk); - registry.get(HIST("control/cut23/hZNACenergy"))->Fill(ZNAenergy, ZNCenergy); - for (int i = 0; i < 4; i++) { - if (flagEl[i] && flagPi[i] && !flagVcalPV[i] && flagPt[i]) { - registry.get(HIST("pidTPC/hpvsdedxElHipCut23"))->Fill(tmpMomentum[i], tmpDedx[i]); - // for (int j = 0; j < 4; j++) { - // if (i == j) continue; - // registry.get(HIST("pidTPC3pi/hpvsdedxElHipCut23"))->Fill(tmpMomentum[j], tmpDedx[j]); - // } - FillControlHistos<23>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i]); - registry.get(HIST("control/cut23/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); - registry.get(HIST("control/cut23/hsigma3Pi"))->Fill(nSigma3Pi[i]); - registry.get(HIST("control/cut23/h3pi1eMass"))->Fill(mass3pi1e[i]); - } - } + // + // kaon veto + // + if (flagEl[0] * trkHasTof[0] * flagPi[0] * flagPr[0] * flagKa[0] + + flagEl[1] * trkHasTof[1] * flagPi[1] * flagPr[1] * flagKa[1] + + flagEl[2] * trkHasTof[2] * flagPi[2] * flagPr[2] * flagKa[2] + + flagEl[3] * trkHasTof[3] * flagPi[3] * flagPr[3] * flagKa[3] > + 0) { // kaon veto, cut25 + registry.get(HIST("global/hEventEff"))->Fill(14., 1.); + registry.get(HIST("control/cut25/h4trkPtTot"))->Fill(pttot); + registry.get(HIST("control/cut25/h4piMass"))->Fill(mass4pi); + registry.get(HIST("control/cut25/h4trkMassVsPt"))->Fill(mass4pi, pttot); + registry.get(HIST("control/cut25/hNtofTrk"))->Fill(nTofTrk); + registry.get(HIST("control/cut25/hZNACenergy"))->Fill(energyZNA, energyZNC); + for (int i = 0; i < 4; i++) { + if (flagEl[i] && trkHasTof[i] && flagPi[i] && flagPr[i] && flagKa[i]) { + registry.get(HIST("pidTPC/hpvsdedxElHipCut25"))->Fill(tmpMomentum[i], tmpDedx[i]); + registry.get(HIST("pidTOF/hpvsNsigmaElHipCut25"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + // for (int j = 0; j < 4; j++) { + // if (i == j) continue; + // registry.get(HIST("pidTPC3pi/hpvsdedxElHipCut25"))->Fill(tmpMomentum[j], tmpDedx[j]); + // } + fillControlHistos<25>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registry.get(HIST("control/cut25/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + registry.get(HIST("control/cut25/hsigma3Pi"))->Fill(nSigma3Pi[i]); + registry.get(HIST("control/cut25/h3pi1eMass"))->Fill(mass3pi1e[i]); + } + } + } else { + if (verbose) { + LOGF(debug, " Candidate rejected: all electrons vetoed by KaPID"); + } + return; + } // end of kaon veto - if (flagEl[0] * flagPi[0] * !flagVcalPV[0] * flagPt[0] * flagPr[0] + - flagEl[1] * flagPi[1] * !flagVcalPV[1] * flagPt[1] * flagPr[1] + - flagEl[2] * flagPi[2] * !flagVcalPV[2] * flagPt[2] * flagPr[2] + - flagEl[3] * flagPi[3] * !flagVcalPV[3] * flagPt[3] * flagPr[3] > - 0) { // proton veto, cut24 - registry.get(HIST("global/hEventEff"))->Fill(10., 1.); - registry.get(HIST("control/cut24/h4trkPtTot"))->Fill(pttot); - registry.get(HIST("control/cut24/h4piMass"))->Fill(mass4pi); - registry.get(HIST("control/cut24/h4trkMassVsPt"))->Fill(mass4pi, pttot); - registry.get(HIST("control/cut24/hNtofTrk"))->Fill(nTofTrk); - registry.get(HIST("control/cut24/hZNACenergy"))->Fill(ZNAenergy, ZNCenergy); - for (int i = 0; i < 4; i++) { - if (flagEl[i] && flagPi[i] && !flagVcalPV[i] && flagPt[i] && flagPr[i]) { - registry.get(HIST("pidTPC/hpvsdedxElHipCut24"))->Fill(tmpMomentum[i], tmpDedx[i]); - // for (int j = 0; j < 4; j++) { - // if (i == j) continue; - // registry.get(HIST("pidTPC3pi/hpvsdedxElHipCut24"))->Fill(tmpMomentum[j], tmpDedx[j]); - // } - FillControlHistos<24>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i]); - registry.get(HIST("control/cut24/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); - registry.get(HIST("control/cut24/hsigma3Pi"))->Fill(nSigma3Pi[i]); - registry.get(HIST("control/cut24/h3pi1eMass"))->Fill(mass3pi1e[i]); - } - } + // + // number of crossed rows in TPC for electron + // + if (flagEl[0] * trkHasTof[0] * flagPi[0] * flagPr[0] * flagKa[0] * flagCR[0] + + flagEl[1] * trkHasTof[1] * flagPi[1] * flagPr[1] * flagKa[1] * flagCR[1] + + flagEl[2] * trkHasTof[2] * flagPi[2] * flagPr[2] * flagKa[2] * flagCR[2] + + flagEl[3] * trkHasTof[3] * flagPi[3] * flagPr[3] * flagKa[3] * flagCR[3] > + 0) { // Nc-rTPC cut, cut28 + registry.get(HIST("global/hEventEff"))->Fill(15., 1.); + registry.get(HIST("control/cut28/h4trkPtTot"))->Fill(pttot); + registry.get(HIST("control/cut28/h4piMass"))->Fill(mass4pi); + registry.get(HIST("control/cut28/h4trkMassVsPt"))->Fill(mass4pi, pttot); + registry.get(HIST("control/cut28/hNtofTrk"))->Fill(nTofTrk); + registry.get(HIST("control/cut28/hZNACenergy"))->Fill(energyZNA, energyZNC); + for (int i = 0; i < 4; i++) { + if (flagEl[i] && trkHasTof[i] && flagPi[i] && flagPr[i] && flagKa[i] && flagCR[i]) { + registry.get(HIST("pidTPC/hpvsdedxElHipCut28"))->Fill(tmpMomentum[i], tmpDedx[i]); + registry.get(HIST("pidTOF/hpvsNsigmaElHipCut28"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + fillControlHistos<28>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registry.get(HIST("control/cut28/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + registry.get(HIST("control/cut28/hsigma3Pi"))->Fill(nSigma3Pi[i]); + registry.get(HIST("control/cut28/h3pi1eMass"))->Fill(mass3pi1e[i]); + } + } + } else { + if (verbose) { + LOGF(debug, " Candidate rejected: all electrons vetoed by CR"); + } + return; + } // end of TPC crossed rows for electron cut - if (flagEl[0] * flagPi[0] * !flagVcalPV[0] * flagPt[0] * flagPr[0] * flagKa[0] + - flagEl[1] * flagPi[1] * !flagVcalPV[1] * flagPt[1] * flagPr[1] * flagKa[1] + - flagEl[2] * flagPi[2] * !flagVcalPV[2] * flagPt[2] * flagPr[2] * flagKa[2] + - flagEl[3] * flagPi[3] * !flagVcalPV[3] * flagPt[3] * flagPr[3] * flagKa[3] > - 0) { // kaon veto, cut25 - registry.get(HIST("global/hEventEff"))->Fill(11., 1.); - registry.get(HIST("control/cut25/h4trkPtTot"))->Fill(pttot); - registry.get(HIST("control/cut25/h4piMass"))->Fill(mass4pi); - registry.get(HIST("control/cut25/h4trkMassVsPt"))->Fill(mass4pi, pttot); - registry.get(HIST("control/cut25/hNtofTrk"))->Fill(nTofTrk); - registry.get(HIST("control/cut25/hZNACenergy"))->Fill(ZNAenergy, ZNCenergy); - for (int i = 0; i < 4; i++) { - if (flagEl[i] && flagPi[i] && !flagVcalPV[i] && flagPt[i] && flagPr[i] && flagKa[i]) { - registry.get(HIST("pidTPC/hpvsdedxElHipCut25"))->Fill(tmpMomentum[i], tmpDedx[i]); - // for (int j = 0; j < 4; j++) { - // if (i == j) continue; - // registry.get(HIST("pidTPC3pi/hpvsdedxElHipCut25"))->Fill(tmpMomentum[j], tmpDedx[j]); - // } - FillControlHistos<25>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i]); - registry.get(HIST("control/cut25/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); - registry.get(HIST("control/cut25/hsigma3Pi"))->Fill(nSigma3Pi[i]); - registry.get(HIST("control/cut25/h3pi1eMass"))->Fill(mass3pi1e[i]); - } - } + // + // virtal calorimeter + // + if (flagEl[0] * trkHasTof[0] * flagPi[0] * flagPr[0] * flagKa[0] * flagCR[0] * !flagVcalPV[0] + + flagEl[1] * trkHasTof[1] * flagPi[1] * flagPr[1] * flagKa[1] * flagCR[1] * !flagVcalPV[1] + + flagEl[2] * trkHasTof[2] * flagPi[2] * flagPr[2] * flagKa[2] * flagCR[2] * !flagVcalPV[2] + + flagEl[3] * trkHasTof[3] * flagPi[3] * flagPr[3] * flagKa[3] * flagCR[3] * !flagVcalPV[3] > + 0) { // vcal veto, cut22 + registry.get(HIST("global/hEventEff"))->Fill(16., 1.); + registry.get(HIST("control/cut22/h4trkPtTot"))->Fill(pttot); + registry.get(HIST("control/cut22/h4piMass"))->Fill(mass4pi); + registry.get(HIST("control/cut22/h4trkMassVsPt"))->Fill(mass4pi, pttot); + registry.get(HIST("control/cut22/hNtofTrk"))->Fill(nTofTrk); + registry.get(HIST("control/cut22/hZNACenergy"))->Fill(energyZNA, energyZNC); + for (int i = 0; i < 4; i++) { + if (flagEl[i] && trkHasTof[i] && flagPi[i] && flagPr[i] && flagKa[i] && flagCR[i] && !flagVcalPV[i]) { + registry.get(HIST("pidTPC/hpvsdedxElHipCut22"))->Fill(tmpMomentum[i], tmpDedx[i]); + registry.get(HIST("pidTOF/hpvsNsigmaElHipCut22"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + // for (int j = 0; j < 4; j++) { + // if (i == j) continue; + // registry.get(HIST("pidTPC3pi/hpvsdedxElHipCut22"))->Fill(tmpMomentum[j], tmpDedx[j]); + // } + fillControlHistos<22>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registry.get(HIST("control/cut22/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + registry.get(HIST("control/cut22/hsigma3Pi"))->Fill(nSigma3Pi[i]); + registry.get(HIST("control/cut22/h3pi1eMass"))->Fill(mass3pi1e[i]); + } + } + } else { + if (verbose) { + LOGF(debug, " Candidate rejected: all electrons vetoed by Vcal"); + } + return; + } // end of vcal veto - if (flagEl[0] * flagPi[0] * !flagVcalPV[0] * flagPt[0] * flagPr[0] * flagKa[0] * flagIM[0] + - flagEl[1] * flagPi[1] * !flagVcalPV[1] * flagPt[1] * flagPr[1] * flagKa[1] * flagIM[1] + - flagEl[2] * flagPi[2] * !flagVcalPV[2] * flagPt[2] * flagPr[2] * flagKa[2] * flagIM[2] + - flagEl[3] * flagPi[3] * !flagVcalPV[3] * flagPt[3] * flagPr[3] * flagKa[3] * flagIM[3] > - 0) { // 3pi cut, cut26 - registry.get(HIST("global/hEventEff"))->Fill(12., 1.); - registry.get(HIST("control/cut26/h4trkPtTot"))->Fill(pttot); - registry.get(HIST("control/cut26/h4piMass"))->Fill(mass4pi); - registry.get(HIST("control/cut26/h4trkMassVsPt"))->Fill(mass4pi, pttot); - registry.get(HIST("control/cut26/hNtofTrk"))->Fill(nTofTrk); - registry.get(HIST("control/cut26/hZNACenergy"))->Fill(ZNAenergy, ZNCenergy); - for (int i = 0; i < 4; i++) { - if (flagEl[i] && flagPi[i] && !flagVcalPV[i] && flagPt[i] && flagPr[i] && flagKa[i] && flagIM[i]) { - registry.get(HIST("pidTPC/hpvsdedxElHipCut26"))->Fill(tmpMomentum[i], tmpDedx[i]); - // for (int j = 0; j < 4; j++) { - // if (i == j) continue; - // registry.get(HIST("pidTPC3pi/hpvsdedxElHipCut26"))->Fill(tmpMomentum[j], tmpDedx[j]); - // } - FillControlHistos<26>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i]); - registry.get(HIST("control/cut26/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); - registry.get(HIST("control/cut26/hsigma3Pi"))->Fill(nSigma3Pi[i]); - registry.get(HIST("control/cut26/h3pi1eMass"))->Fill(mass3pi1e[i]); - } - } - - if (flagEl[0] * flagPi[0] * !flagVcalPV[0] * flagPt[0] * flagPr[0] * flagKa[0] * flagIM[0] * flagDP[0] + - flagEl[1] * flagPi[1] * !flagVcalPV[1] * flagPt[1] * flagPr[1] * flagKa[1] * flagIM[1] * flagDP[1] + - flagEl[2] * flagPi[2] * !flagVcalPV[2] * flagPt[2] * flagPr[2] * flagKa[2] * flagIM[2] * flagDP[2] + - flagEl[3] * flagPi[3] * !flagVcalPV[3] * flagPt[3] * flagPr[3] * flagKa[3] * flagIM[3] * flagDP[3] > - 0) { // delta phi cut, cut27 - registry.get(HIST("global/hEventEff"))->Fill(13., 1.); - registry.get(HIST("control/cut27/h4trkPtTot"))->Fill(pttot); - registry.get(HIST("control/cut27/h4piMass"))->Fill(mass4pi); - registry.get(HIST("control/cut27/h4trkMassVsPt"))->Fill(mass4pi, pttot); - registry.get(HIST("control/cut27/hNtofTrk"))->Fill(nTofTrk); - registry.get(HIST("control/cut27/hZNACenergy"))->Fill(ZNAenergy, ZNCenergy); - for (int i = 0; i < 4; i++) { - if (flagEl[i] && flagPi[i] && !flagVcalPV[i] && flagPt[i] && flagPr[i] && flagKa[i] && flagIM[i] && flagDP[i]) { - registry.get(HIST("pidTPC/hpvsdedxElHipCut27"))->Fill(tmpMomentum[i], tmpDedx[i]); - // for (int j = 0; j < 4; j++) { - // if (i == j) continue; - // registry.get(HIST("pidTPC3pi/hpvsdedxElHipCut27"))->Fill(tmpMomentum[j], tmpDedx[j]); - // } - FillControlHistos<27>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i]); - registry.get(HIST("control/cut27/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); - registry.get(HIST("control/cut27/hsigma3Pi"))->Fill(nSigma3Pi[i]); - registry.get(HIST("control/cut27/h3pi1eMass"))->Fill(mass3pi1e[i]); - } - } - - if (flagEl[0] * flagPi[0] * !flagVcalPV[0] * flagPt[0] * flagPr[0] * flagKa[0] * flagIM[0] * flagDP[0] * flagCR[0] + - flagEl[1] * flagPi[1] * !flagVcalPV[1] * flagPt[1] * flagPr[1] * flagKa[1] * flagIM[1] * flagDP[1] * flagCR[1] + - flagEl[2] * flagPi[2] * !flagVcalPV[2] * flagPt[2] * flagPr[2] * flagKa[2] * flagIM[2] * flagDP[2] * flagCR[2] + - flagEl[3] * flagPi[3] * !flagVcalPV[3] * flagPt[3] * flagPr[3] * flagKa[3] * flagIM[3] * flagDP[3] * flagCR[3] > - 0) { // Nc-rTPC cut, cut28 - registry.get(HIST("global/hEventEff"))->Fill(14., 1.); - registry.get(HIST("control/cut28/h4trkPtTot"))->Fill(pttot); - registry.get(HIST("control/cut28/h4piMass"))->Fill(mass4pi); - registry.get(HIST("control/cut28/h4trkMassVsPt"))->Fill(mass4pi, pttot); - registry.get(HIST("control/cut28/hNtofTrk"))->Fill(nTofTrk); - registry.get(HIST("control/cut28/hZNACenergy"))->Fill(ZNAenergy, ZNCenergy); - for (int i = 0; i < 4; i++) { - if (flagEl[i] && flagPi[i] && !flagVcalPV[i] && flagPt[i] && flagPr[i] && flagKa[i] && flagIM[i] && flagDP[i] && flagCR[i]) { - registry.get(HIST("pidTPC/hpvsdedxElHipCut28"))->Fill(tmpMomentum[i], tmpDedx[i]); - FillControlHistos<28>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i]); - registry.get(HIST("control/cut28/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); - registry.get(HIST("control/cut28/hsigma3Pi"))->Fill(nSigma3Pi[i]); - registry.get(HIST("control/cut28/h3pi1eMass"))->Fill(mass3pi1e[i]); - } - } - - if (flagEl[0] * flagPi[0] * !flagVcalPV[0] * flagPt[0] * flagPr[0] * flagKa[0] * flagIM[0] * flagDP[0] * flagCR[0] * flagS3pi[0] + - flagEl[1] * flagPi[1] * !flagVcalPV[1] * flagPt[1] * flagPr[1] * flagKa[1] * flagIM[1] * flagDP[1] * flagCR[1] * flagS3pi[1] + - flagEl[2] * flagPi[2] * !flagVcalPV[2] * flagPt[2] * flagPr[2] * flagKa[2] * flagIM[2] * flagDP[2] * flagCR[2] * flagS3pi[2] + - flagEl[3] * flagPi[3] * !flagVcalPV[3] * flagPt[3] * flagPr[3] * flagKa[3] * flagIM[3] * flagDP[3] * flagCR[3] * flagS3pi[3] > - 0) { // nsigma 3pi cut, cut29 - registry.get(HIST("global/hEventEff"))->Fill(15., 1.); - registry.get(HIST("control/cut29/h4trkPtTot"))->Fill(pttot); - registry.get(HIST("control/cut29/h4piMass"))->Fill(mass4pi); - registry.get(HIST("control/cut29/h4trkMassVsPt"))->Fill(mass4pi, pttot); - registry.get(HIST("control/cut29/hNtofTrk"))->Fill(nTofTrk); - registry.get(HIST("control/cut29/hZNACenergy"))->Fill(ZNAenergy, ZNCenergy); - for (int i = 0; i < 4; i++) { - if (flagEl[i] && flagPi[i] && !flagVcalPV[i] && flagPt[i] && flagPr[i] && flagKa[i] && flagIM[i] && flagDP[i] && flagCR[i] && flagS3pi[i]) { - registry.get(HIST("pidTPC/hpvsdedxElHipCut29"))->Fill(tmpMomentum[i], tmpDedx[i]); - FillControlHistos<29>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i]); - registry.get(HIST("control/cut29/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); - registry.get(HIST("control/cut29/hsigma3Pi"))->Fill(nSigma3Pi[i]); - registry.get(HIST("control/cut29/h3pi1eMass"))->Fill(mass3pi1e[i]); - if (verbose) { - LOGF(info, "cut29 timeTot %f, resTot %f, trackTime %f, %f, %f, %f Res %f, %f, %f, %f", trkTimeTot, trkTimeResTot, trkTime[0], trkTime[1], trkTime[2], trkTime[3], trkTimeRes[0], trkTimeRes[1], trkTimeRes[2], trkTimeRes[3]); - } - } - } - - } else { - if (verbose) { - LOGF(debug, " Candidate rejected: all electrons vetoed by piPID+Vcal+pT+prPID+KaPID+Dphi+IM+CR"); - } - } // end of nsigma 3pi cut - } else { - if (verbose) { - LOGF(debug, " Candidate rejected: all electrons vetoed by piPID+Vcal+pT+prPID+KaPID+Dphi+IM+CR"); - } - } // end of TPC crossed rows for electron cut - } else { - if (verbose) { - LOGF(debug, " Candidate rejected: all electrons vetoed by piPID+Vcal+pT+prPID+KaPID+Dphi+IM"); - } - } // end of delta phi cut - } else { - if (verbose) { - LOGF(debug, " Candidate rejected: all electrons vetoed by piPID+Vcal+pT+prPID+KaPID+Dphi"); - } - } // end of inv mass 3 pi cut - } else { - if (verbose) { - LOGF(debug, " Candidate rejected: all electrons vetoed by piPID+Vcal+pT+prPID+KaPID"); - } - } // end of kaon veto - } else { - if (verbose) { - LOGF(debug, " Candidate rejected: all electrons vetoed by piPID+Vcal+pT+prPID"); - } - } // end of proton veto - } else { - if (verbose) { - LOGF(debug, " Candidate rejected: all electrons vetoed by piPID+Vcal+pT"); - } - } // end of pT veto - } else { + // + // 3pi nsigma cut29 + // + if (flagEl[0] * trkHasTof[0] * flagPi[0] * flagPr[0] * flagKa[0] * flagCR[0] * !flagVcalPV[0] * flagS3pi[0] + + flagEl[1] * trkHasTof[1] * flagPi[1] * flagPr[1] * flagKa[1] * flagCR[1] * !flagVcalPV[1] * flagS3pi[1] + + flagEl[2] * trkHasTof[2] * flagPi[2] * flagPr[2] * flagKa[2] * flagCR[2] * !flagVcalPV[2] * flagS3pi[2] + + flagEl[3] * trkHasTof[3] * flagPi[3] * flagPr[3] * flagKa[3] * flagCR[3] * !flagVcalPV[3] * flagS3pi[3] > + 0) { // nsigma 3pi cut, cut29 + registry.get(HIST("global/hEventEff"))->Fill(17., 1.); + registry.get(HIST("control/cut29/h4trkPtTot"))->Fill(pttot); + registry.get(HIST("control/cut29/h4piMass"))->Fill(mass4pi); + registry.get(HIST("control/cut29/h4trkMassVsPt"))->Fill(mass4pi, pttot); + registry.get(HIST("control/cut29/hNtofTrk"))->Fill(nTofTrk); + registry.get(HIST("control/cut29/hZNACenergy"))->Fill(energyZNA, energyZNC); + for (int i = 0; i < 4; i++) { + if (flagEl[i] && trkHasTof[i] && flagPi[i] && flagPr[i] && flagKa[i] && flagCR[i] && !flagVcalPV[i] && flagS3pi[i]) { + registry.get(HIST("pidTPC/hpvsdedxElHipCut29"))->Fill(tmpMomentum[i], tmpDedx[i]); + registry.get(HIST("pidTOF/hpvsNsigmaElHipCut29"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + fillControlHistos<29>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registry.get(HIST("control/cut29/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + registry.get(HIST("control/cut29/hsigma3Pi"))->Fill(nSigma3Pi[i]); + registry.get(HIST("control/cut29/h3pi1eMass"))->Fill(mass3pi1e[i]); if (verbose) { - LOGF(debug, " Candidate rejected: all electrons vetoed by piPID+Vcal"); + LOGF(info, "cut29 timeTot %f, resTot %f, trackTime %f, %f, %f, %f Res %f, %f, %f, %f", trkTimeTot, trkTimeResTot, trkTime[0], trkTime[1], trkTime[2], trkTime[3], trkTimeRes[0], trkTimeRes[1], trkTimeRes[2], trkTimeRes[3]); } - } // end of vcal veto - } else { - if (verbose) { - LOGF(debug, " Candidate rejected: all electrons vetoed by pi PID"); } - } // end of pi veto - } else { // no electron + } + } else { if (verbose) { - LOGF(debug, " Candidate rejected: no electron PID among 4 tracks"); + LOGF(debug, " Candidate rejected: all electrons vetoed by 3piPID"); } - } // end of Nelectrons check + return; + } // end of nsigma 3pi cut + + // + // IM cut + // + if (flagEl[0] * trkHasTof[0] * flagPi[0] * flagPr[0] * flagKa[0] * flagCR[0] * !flagVcalPV[0] * flagS3pi[0] * flagIM[0] + + flagEl[1] * trkHasTof[1] * flagPi[1] * flagPr[1] * flagKa[1] * flagCR[1] * !flagVcalPV[1] * flagS3pi[1] * flagIM[1] + + flagEl[2] * trkHasTof[2] * flagPi[2] * flagPr[2] * flagKa[2] * flagCR[2] * !flagVcalPV[2] * flagS3pi[2] * flagIM[2] + + flagEl[3] * trkHasTof[3] * flagPi[3] * flagPr[3] * flagKa[3] * flagCR[3] * !flagVcalPV[3] * flagS3pi[3] * flagIM[3] > + 0) { // 3pi cut, cut26 + registry.get(HIST("global/hEventEff"))->Fill(18., 1.); + registry.get(HIST("control/cut26/h4trkPtTot"))->Fill(pttot); + registry.get(HIST("control/cut26/h4piMass"))->Fill(mass4pi); + registry.get(HIST("control/cut26/h4trkMassVsPt"))->Fill(mass4pi, pttot); + registry.get(HIST("control/cut26/hNtofTrk"))->Fill(nTofTrk); + registry.get(HIST("control/cut26/hZNACenergy"))->Fill(energyZNA, energyZNC); + for (int i = 0; i < 4; i++) { + if (flagEl[i] && trkHasTof[i] && flagPi[i] && flagPr[i] && flagKa[i] && flagCR[i] && !flagVcalPV[i] && flagS3pi[i] && flagIM[i]) { + registry.get(HIST("pidTPC/hpvsdedxElHipCut26"))->Fill(tmpMomentum[i], tmpDedx[i]); + registry.get(HIST("pidTOF/hpvsNsigmaElHipCut26"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + // for (int j = 0; j < 4; j++) { + // if (i == j) continue; + // registry.get(HIST("pidTPC3pi/hpvsdedxElHipCut26"))->Fill(tmpMomentum[j], tmpDedx[j]); + // } + fillControlHistos<26>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registry.get(HIST("control/cut26/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + registry.get(HIST("control/cut26/hsigma3Pi"))->Fill(nSigma3Pi[i]); + registry.get(HIST("control/cut26/h3pi1eMass"))->Fill(mass3pi1e[i]); + } + } + } else { + if (verbose) { + LOGF(debug, " Candidate rejected: all electrons vetoed by IM"); + } + return; + } // end of inv mass 3 pi cut + + // + // at least one pion with tof hit (cut34) + // + int otherTOFtracks[4]; + for (int i = 0; i < 4; i++) { + otherTOFtracks[i] = 0; + if (flagEl[i] && trkHasTof[i]) { + for (int j = 0; j < 4; j++) { + if (i == j) + continue; + if (trkHasTof[j]) { + otherTOFtracks[i]++; + registry.get(HIST("pidTOF/h3piTOFchi2"))->Fill(chi2TOF[j]); + } + } // second loop over tracks + } + } // first loop over tracks + // + if (flagEl[0] * trkHasTof[0] * flagPi[0] * flagPr[0] * flagKa[0] * flagCR[0] * !flagVcalPV[0] * flagS3pi[0] * flagIM[0] * (otherTOFtracks[0] >= 1) + + flagEl[1] * trkHasTof[1] * flagPi[1] * flagPr[1] * flagKa[1] * flagCR[1] * !flagVcalPV[1] * flagS3pi[1] * flagIM[1] * (otherTOFtracks[1] >= 1) + + flagEl[2] * trkHasTof[2] * flagPi[2] * flagPr[2] * flagKa[2] * flagCR[2] * !flagVcalPV[2] * flagS3pi[2] * flagIM[2] * (otherTOFtracks[2] >= 1) + + flagEl[3] * trkHasTof[3] * flagPi[3] * flagPr[3] * flagKa[3] * flagCR[3] * !flagVcalPV[3] * flagS3pi[3] * flagIM[3] * (otherTOFtracks[3] >= 1) > + 0) { // at lest 1 pi with tof hit, cut34 + registry.get(HIST("global/hRecFlag"))->Fill(5 + dgcand.flags()); // reconstruction with upc settings flag + registry.get(HIST("global/hEventEff"))->Fill(19., 1.); + // registry.get(HIST("control/cut34/hDcaZ"))->Fill(dcaZ[i]); + // registry.get(HIST("control/cut34/hDcaXY"))->Fill(dcaXY[i]); + // registry.get(HIST("control/cut34/hChi2TPC"))->Fill(chi2TPC[i]); + // registry.get(HIST("control/cut34/hChi2ITS"))->Fill(chi2ITS[i]); + registry.get(HIST("control/cut34/h4trkPtTot"))->Fill(pttot); + registry.get(HIST("control/cut34/h4piMass"))->Fill(mass4pi); + registry.get(HIST("control/cut34/h4trkMassVsPt"))->Fill(mass4pi, pttot); + registry.get(HIST("control/cut34/hNtofTrk"))->Fill(nTofTrk); + registry.get(HIST("control/cut34/hZNACenergy"))->Fill(energyZNA, energyZNC); + for (int i = 0; i < 4; i++) { + if (flagEl[i] && trkHasTof[i] && flagPi[i] && flagPr[i] && flagKa[i] && flagCR[i] && !flagVcalPV[i] && flagS3pi[i] && flagIM[i] && (otherTOFtracks[i] >= 1)) { + fillControlHistos<34>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registry.get(HIST("control/cut34/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + registry.get(HIST("pidTPC/hpvsdedxElHipCut34"))->Fill(tmpMomentum[i], tmpDedx[i]); + registry.get(HIST("pidTOF/hpvsNsigmaElHipCut34"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + registry.get(HIST("control/cut34/hsigma3Pi"))->Fill(nSigma3Pi[i]); + registry.get(HIST("control/cut34/h3pi1eMass"))->Fill(mass3pi1e[i]); + // registry.get(HIST("control/cut34/hPtSpectrumEl"))->Fill(tmpPt[i]); + } else if (!flagEl[i] && trkHasTof[i]) { + registry.get(HIST("pidTOF/h3piTOFchi2Cut34"))->Fill(chi2TOF[i]); + } + } + } else { + if (verbose) { + LOGF(debug, " Candidate rejected: all electrons vetoed by lack of TOF hit in 3pi"); + } + return; + } // end of at least one pion with tof hit (cut34) + // // skip events with pttot<0.15 + // if (pttot < ptTotcut) { if (verbose) { LOGF(info, " Candidate rejected: pt tot is %f", pttot); } return; - } - if (counterTotal > 0) { - registry.get(HIST("global/hEventEff"))->Fill(16., 1.); + } else { + registry.get(HIST("global/hEventEff"))->Fill(20., 1.); registry.get(HIST("control/cut30/h4trkPtTot"))->Fill(pttot); registry.get(HIST("control/cut30/h4piMass"))->Fill(mass4pi); registry.get(HIST("control/cut30/h4trkMassVsPt"))->Fill(mass4pi, pttot); registry.get(HIST("control/cut30/hNtofTrk"))->Fill(nTofTrk); - registry.get(HIST("control/cut30/hZNACenergy"))->Fill(ZNAenergy, ZNCenergy); + registry.get(HIST("control/cut30/hZNACenergy"))->Fill(energyZNA, energyZNC); for (int i = 0; i < 4; i++) { - if (flagTotal[i]) { + if (flagEl[i] && trkHasTof[i] && flagPi[i] && flagPr[i] && flagKa[i] && flagCR[i] && !flagVcalPV[i] && flagS3pi[i] && flagIM[i] && (otherTOFtracks[i] >= 1)) { registry.get(HIST("pidTPC/hpvsdedxElHipCut30"))->Fill(tmpMomentum[i], tmpDedx[i]); - FillControlHistos<30>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i]); + registry.get(HIST("pidTOF/hpvsNsigmaElHipCut30"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + fillControlHistos<30>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); registry.get(HIST("control/cut30/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); registry.get(HIST("control/cut30/hsigma3Pi"))->Fill(nSigma3Pi[i]); registry.get(HIST("control/cut30/h3pi1eMass"))->Fill(mass3pi1e[i]); + } else if (!flagEl[i] && trkHasTof[i]) { + registry.get(HIST("pidTOF/h3piTOFchi2Cut30"))->Fill(chi2TOF[i]); } } - } + } // end of pttot<0.15 cut30 - // check FIT information - if (FITvetoFlag) { - auto bitMin = 16 - FITvetoWindow; // default is +- 1 bc (1 bit) - auto bitMax = 16 + FITvetoWindow; - for (auto bit = bitMin; bit <= bitMax; bit++) { - if (TESTBIT(dgcand.bbFT0Apf(), bit)) - return; - if (TESTBIT(dgcand.bbFT0Cpf(), bit)) - return; - if (useFV0ForVeto && TESTBIT(dgcand.bbFV0Apf(), bit)) - return; - if (useFDDAForVeto && TESTBIT(dgcand.bbFDDApf(), bit)) - return; - if (useFDDCForVeto && TESTBIT(dgcand.bbFDDCpf(), bit)) - return; - } // end of loop over bits - } // end of check emptyness around given BC in FIT detectors - if (counterTotal > 0) { - registry.get(HIST("global/hEventEff"))->Fill(17., 1.); - registry.get(HIST("control/cut31/h4trkPtTot"))->Fill(pttot); - registry.get(HIST("control/cut31/h4piMass"))->Fill(mass4pi); - registry.get(HIST("control/cut31/h4trkMassVsPt"))->Fill(mass4pi, pttot); - registry.get(HIST("control/cut31/hNtofTrk"))->Fill(nTofTrk); - registry.get(HIST("control/cut31/hZNACenergy"))->Fill(ZNAenergy, ZNCenergy); + // + // delta phi + // + if (flagEl[0] * trkHasTof[0] * flagPi[0] * flagPr[0] * flagKa[0] * flagCR[0] * !flagVcalPV[0] * flagS3pi[0] * flagIM[0] * (otherTOFtracks[0] >= 1) * flagDP[0] + + flagEl[1] * trkHasTof[1] * flagPi[1] * flagPr[1] * flagKa[1] * flagCR[1] * !flagVcalPV[1] * flagS3pi[1] * flagIM[1] * (otherTOFtracks[1] >= 1) * flagDP[1] + + flagEl[2] * trkHasTof[2] * flagPi[2] * flagPr[2] * flagKa[2] * flagCR[2] * !flagVcalPV[2] * flagS3pi[2] * flagIM[2] * (otherTOFtracks[2] >= 1) * flagDP[2] + + flagEl[3] * trkHasTof[3] * flagPi[3] * flagPr[3] * flagKa[3] * flagCR[3] * !flagVcalPV[3] * flagS3pi[3] * flagIM[3] * (otherTOFtracks[3] >= 1) * flagDP[3] > + 0) { // delta phi cut, cut27 + registry.get(HIST("global/hEventEff"))->Fill(21., 1.); + registry.get(HIST("control/cut27/h4trkPtTot"))->Fill(pttot); + registry.get(HIST("control/cut27/h4piMass"))->Fill(mass4pi); + registry.get(HIST("control/cut27/h4trkMassVsPt"))->Fill(mass4pi, pttot); + registry.get(HIST("control/cut27/hNtofTrk"))->Fill(nTofTrk); + registry.get(HIST("control/cut27/hZNACenergy"))->Fill(energyZNA, energyZNC); for (int i = 0; i < 4; i++) { - if (flagTotal[i]) { - registry.get(HIST("pidTPC/hpvsdedxElHipCut31"))->Fill(tmpMomentum[i], tmpDedx[i]); - FillControlHistos<31>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i]); - registry.get(HIST("control/cut31/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); - registry.get(HIST("control/cut31/hsigma3Pi"))->Fill(nSigma3Pi[i]); - registry.get(HIST("control/cut31/h3pi1eMass"))->Fill(mass3pi1e[i]); + if (flagEl[i] && trkHasTof[i] && flagPi[i] && flagPr[i] && flagKa[i] && flagCR[i] && !flagVcalPV[i] && flagS3pi[i] && flagIM[i] && (otherTOFtracks[i] >= 1) && flagDP[i]) { + registry.get(HIST("pidTPC/hpvsdedxElHipCut27"))->Fill(tmpMomentum[i], tmpDedx[i]); + registry.get(HIST("pidTOF/hpvsNsigmaElHipCut27"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + // for (int j = 0; j < 4; j++) { + // if (i == j) continue; + // registry.get(HIST("pidTPC3pi/hpvsdedxElHipCut27"))->Fill(tmpMomentum[j], tmpDedx[j]); + // } + fillControlHistos<27>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registry.get(HIST("control/cut27/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + registry.get(HIST("control/cut27/hsigma3Pi"))->Fill(nSigma3Pi[i]); + registry.get(HIST("control/cut27/h3pi1eMass"))->Fill(mass3pi1e[i]); + } else if (!flagEl[i] && trkHasTof[i]) { + registry.get(HIST("pidTOF/h3piTOFchi2Cut27"))->Fill(chi2TOF[i]); + // LOGF(info, " chi2TOF %f", chi2TOF[i]); } } - } - - // n TOF tracks cut - if (nTofTrk < nTofTrkMinCut) { + } else { if (verbose) { - LOGF(info, " Candidate rejected: nTOFtracks is %d", nTofTrk); + LOGF(debug, " Candidate rejected: all electrons vetoed by Dphi"); } return; - } - if (counterTotal > 0) { - registry.get(HIST("global/hEventEff"))->Fill(18., 1.); - registry.get(HIST("control/cut32/h4trkPtTot"))->Fill(pttot); - registry.get(HIST("control/cut32/h4piMass"))->Fill(mass4pi); - registry.get(HIST("control/cut32/h4trkMassVsPt"))->Fill(mass4pi, pttot); - registry.get(HIST("control/cut32/hNtofTrk"))->Fill(nTofTrk); - registry.get(HIST("control/cut32/hZNACenergy"))->Fill(ZNAenergy, ZNCenergy); - for (int i = 0; i < 4; i++) { - if (flagTotal[i]) { - registry.get(HIST("pidTPC/hpvsdedxElHipCut32"))->Fill(tmpMomentum[i], tmpDedx[i]); - FillControlHistos<32>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i]); - registry.get(HIST("control/cut32/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); - registry.get(HIST("control/cut32/hsigma3Pi"))->Fill(nSigma3Pi[i]); - registry.get(HIST("control/cut32/h3pi1eMass"))->Fill(mass3pi1e[i]); - registry.get(HIST("control/cut32/hPtSpectrumEl"))->Fill(tmpPt[i]); - if (verbose) { - LOGF(info, "cut32 trackTime %f, %f, %f, %f Res %f, %f, %f, %f", trkTime[0], trkTime[1], trkTime[2], trkTime[3], trkTimeRes[0], trkTimeRes[1], trkTimeRes[2], trkTimeRes[3]); - } + } // end of Dphi + + // // only 1 electron + // if (counterTotal == 1) { + // registry.get(HIST("global/hEventEff"))->Fill(19., 1.); + // for (int i = 0; i < 4; i++) { + // registry.get(HIST("control/cut1/hDcaZ"))->Fill(dcaZ[i]); + // registry.get(HIST("control/cut1/hDcaXY"))->Fill(dcaXY[i]); + // registry.get(HIST("control/cut1/hChi2TPC"))->Fill(chi2TPC[i]); + // registry.get(HIST("control/cut1/hChi2ITS"))->Fill(chi2ITS[i]); + // registry.get(HIST("control/cut1/hChi2TOF"))->Fill(chi2TOF[i]); + // if (flagTotal[i]) { + // fillControlHistos<1>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + // registry.get(HIST("control/cut1/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + // registry.get(HIST("pidTPC/hpvsdedxElHipCut1"))->Fill(tmpMomentum[i], tmpDedx[i]); + // for (int j = 0; j < 4; j++) { + // if (i == j) + // continue; + // registry.get(HIST("pidTPC3pi/hpvsdedxElHipCut1"))->Fill(tmpMomentum[j], tmpDedx[j]); + // } + // registry.get(HIST("global/hFinalPtSpectrumEl"))->Fill(tmpPt[i]); + // registry.get(HIST("control/cut1/hTPCnclsFindable"))->Fill(nclTPCfind[i]); + // registry.get(HIST("control/cut1/hsigma3Pi"))->Fill(nSigma3Pi[i]); + // registry.get(HIST("control/cut1/h3pi1eMass"))->Fill(mass3pi1e[i]); + // if (verbose) { + // LOGF(info, "cut1 trackTime %f, %f, %f, %f Res %f, %f, %f, %f", trkTime[0], trkTime[1], trkTime[2], trkTime[3], trkTimeRes[0], trkTimeRes[1], trkTimeRes[2], trkTimeRes[3]); + // } + // } + // } // end of loop over 4 tracks + // registry.get(HIST("control/cut1/h4trkPtTot"))->Fill(pttot); + // registry.get(HIST("control/cut1/h4piMass"))->Fill(mass4pi); + // registry.get(HIST("control/cut1/h4trkMassVsPt"))->Fill(mass4pi, pttot); + // registry.get(HIST("control/cut1/hNtofTrk"))->Fill(nTofTrk); + // registry.get(HIST("control/cut1/hZNACenergy"))->Fill(energyZNA, energyZNC); + // // special case invmass 4pi (2,2.3) + // // if (mass4pi<2.3 && mass4pi>2) { + // // for (int i = 0; i < 4; i++) { + // // registry.get(HIST("control/cut1/cut1a/hDcaZ"))->Fill(dcaZ[i]); + // // registry.get(HIST("control/cut1/cut1a/hDcaXY"))->Fill(dcaXY[i]); + // // registry.get(HIST("control/cut1/cut1a/hChi2TPC"))->Fill(chi2TPC[i]); + // // registry.get(HIST("control/cut1/cut1a/hChi2ITS"))->Fill(chi2ITS[i]); + // // + // // if (flagTotal[i]) { + // // registry.get(HIST("control/cut1/cut1a/h3piMassComb"))->Fill(pi3invMass[i]); + // // registry.get(HIST("control/cut1/cut1a/h3trkPtTot"))->Fill(pi3pt[i]); + // // registry.get(HIST("control/cut1/cut1a/hDeltaPhi13topo"))->Fill(pi3deltaPhi[i]); + // // registry.get(HIST("control/cut1/cut1a/h13AssymPt1ProngAver"))->Fill(pi3assymav[i]); + // // registry.get(HIST("control/cut1/cut1a/h13Vector"))->Fill(pi3vector[i]); + // // registry.get(HIST("control/cut1/cut1a/h13Scalar"))->Fill(pi3scalar[i]); + // // registry.get(HIST("control/cut1/cut1a/h13EtaSum"))->Fill(pi3etasum[i]); + // // registry.get(HIST("control/cut1/cut1a/hTPCnCrossedRows"))->Fill(nclTPCcrossedRows[i]); + // // + // // registry.get(HIST("control/cut1/cut1a/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + // // registry.get(HIST("control/cut1/cut1a/hTPCnclsFindable"))->Fill(nclTPCfind[i]); + // // registry.get(HIST("control/cut1/cut1a/hsigma3Pi"))->Fill(nSigma3Pi[i]); + // // } + // // } + // // registry.get(HIST("control/cut1/cut1a/h4trkPtTot"))->Fill(pttot); + // // registry.get(HIST("control/cut1/cut1a/h4piMass"))->Fill(mass4pi); + // // registry.get(HIST("control/cut1/cut1a/h4trkMassVsPt"))->Fill(mass4pi, pttot); + // // registry.get(HIST("control/cut1/cut1a/hNtofTrk"))->Fill(nTofTrk); + // // } // end of mass window for 4pi case + // + // } else { // more than 1 electron candidate + // if (verbose) { + // LOGF(debug, " Candidate rejected: more than one electron candidate"); + // } + // } // end of 1electrons check + } // end of processDataSG + // check ntracks-4PVtracks + // check pt of remaining (ntracks-4PVtracks) tracks + + // + // basic distributions from MC related to tau, electron and MC particles + // + void processSimpleMCSG(aod::McCollision const& mcCollision, aod::McParticles const& mcParticles) + { + registryMC.get(HIST("globalMC/hMCZvertex"))->Fill(mcCollision.posZ()); + registryMC.get(HIST("globalMC/hMCefficiency"))->Fill(0., 1.); + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(0., 1.); + registryMC.get(HIST("efficiencyMCMu/effiMu"))->Fill(0., 1.); + registryMC.get(HIST("efficiencyMCPi/effiPi"))->Fill(0., 1.); + + // check how many physical primaries + // int countPrim = 0; + int countGen = 0; + int countBoth = 0; + int countCharged = 0; + int countChargedFromTau = 0; + int countTau = 0; + + float etaTau[2]; + float phiTau[2]; + + int pionCounter = 0; + int singlePionIndex = -1; + int tmpPionIndex = -1; + // int tmpPionGlobalIndex=-1; + // int singlePionGlobalIndex=-1; + // int singleElectronGlobalIndex=-1; + // int threePionGlobalIndex[3]={-1,-1,-1}; + // int threePionIndex[3]={-1,-1,-1}; + // int motherOfSinglePionIndex=-1; + // int motherOfThreePionIndex=-1; + bool electronFound = false; + bool muonFound = false; + bool threePionsFound = false; + bool singlePionFound = false; + bool tauInRapidity = true; + bool partFromTauInEta = true; + float partPt = 0.; + // bool flagE3pi = false; + // bool flagMu3pi = false; + // bool flagPi3pi = false; + bool flagElPlusElMinus = false; // e+ = 0, e- =1 + bool flagMuPlusMuMinus = false; // mu+ = 0, mu- =1 + bool flagPiPlusPiMinus = false; // pi+ = 0, pi- =1 + + // loop over MC particles + for (const auto& mcParticle : mcParticles) { + // primaries + // if (mcParticle.isPhysicalPrimary()) { + // countPrim++; + // } + // + // MC particles produced by generator only + // + if (mcParticle.producedByGenerator()) { + countGen++; + if (mcParticle.isPhysicalPrimary()) { + countBoth++; + if (mcParticle.pdgCode() != 22 && std::abs(mcParticle.pdgCode()) != 12 && std::abs(mcParticle.pdgCode()) != 14 && std::abs(mcParticle.pdgCode()) != 16 && mcParticle.pdgCode() != 130 && mcParticle.pdgCode() != 111) { + countCharged++; + + registryMC.get(HIST("globalMC/hMCetaGen"))->Fill(mcParticle.eta()); + registryMC.get(HIST("globalMC/hMCphiGen"))->Fill(mcParticle.phi()); + registryMC.get(HIST("globalMC/hMCyGen"))->Fill(mcParticle.y()); + registryMC.get(HIST("globalMC/hMCptGen"))->Fill(mcParticle.pt()); + + if (mcParticle.has_mothers()) { + auto const& mother = mcParticle.mothers_first_as(); + if (std::abs(mother.pdgCode()) == 15) { + countChargedFromTau++; + } // mother is tau + } // mc particle has mother + } // veto neutral particles + } // physicsl primary + } // generator produced by + + // + // tau+/- + // + if (std::abs(mcParticle.pdgCode()) == 15) { // tau+/- + countTau++; + if (countTau <= 2) { + etaTau[countTau - 1] = mcParticle.eta(); + phiTau[countTau - 1] = mcParticle.phi(); } - } + + registryMC.get(HIST("tauMC/hMCeta"))->Fill(mcParticle.eta()); + registryMC.get(HIST("tauMC/hMCphi"))->Fill(mcParticle.phi()); + registryMC.get(HIST("tauMC/hMCy"))->Fill(mcParticle.y()); + registryMC.get(HIST("tauMC/hMCpt"))->Fill(mcParticle.pt()); + if (std::abs(mcParticle.y()) > 0.9) + tauInRapidity = false; + pionCounter = 0; + if (mcParticle.has_daughters()) { + for (const auto& daughter : mcParticle.daughters_as()) { + // pions from tau + if (std::abs(daughter.pdgCode()) == 211) { // 211 = pi+ + pionCounter++; + tmpPionIndex = daughter.index(); // returns index of daughter of tau, not in the event, not in the MC particles + if (std::abs(daughter.eta()) > 0.9) + partFromTauInEta = false; + } // end of pion check + // electron from tau + if (std::abs(daughter.pdgCode()) == 11) { // 11 = electron + if (daughter.pdgCode() == 11) + flagElPlusElMinus = true; + registryMC.get(HIST("electronMC/hMCeta"))->Fill(daughter.eta()); + registryMC.get(HIST("electronMC/hMCphi"))->Fill(daughter.phi()); + registryMC.get(HIST("electronMC/hMCy"))->Fill(daughter.y()); + registryMC.get(HIST("electronMC/hMCpt"))->Fill(daughter.pt()); + + electronFound = !electronFound; + partPt = static_cast(daughter.pt()); + // singleElectronGlobalIndex = daughter.globalIndex(); + // LOGF(info,"e pt %f",daughter.pt()); + if (std::abs(daughter.eta()) > 0.9) + partFromTauInEta = false; + } // end of electron check + // muon from tau + if (std::abs(daughter.pdgCode()) == 13) { + if (daughter.pdgCode() == 13) + flagMuPlusMuMinus = true; + muonFound = !muonFound; + partPt = static_cast(daughter.pt()); + // LOGF(info,"mu pt %f",daughter.pt()); + if (std::abs(daughter.eta()) > 0.9) + partFromTauInEta = false; + } // end of muon check + } // end of loop over daughters + if (pionCounter == 3) { + threePionsFound = true; + } // end of 3pi check + if (pionCounter == 1) { + singlePionFound = true; + singlePionIndex = tmpPionIndex; + auto mcPartTmp = mcParticle.daughters_as().begin() + singlePionIndex; + if (mcPartTmp.pdgCode() == -211) + flagPiPlusPiMinus = true; + partPt = static_cast(mcPartTmp.pt()); + // motherOfSinglePionIndex = mcParticle.index(); + if (std::abs(mcPartTmp.eta()) > 0.9) + partFromTauInEta = false; + // LOGF(info,"size %d; tau ID %d GID %d (pdg %d); pi ID %d LID %d GID %d, pt %f", mcParticle.size(), motherOfSinglePionIndex, mcParticle.globalIndex(), mcParticle.pdgCode(),singlePionIndex, mcPartTmp.index(), mcPartTmp.globalIndex(), mcPartTmp.pt()); + } // end of 1 pi check + } // end check tau has daughter + } // end of tau + } // end of loop over MC particles + // LOGF(info,"pt after %f",partPt); + + // tau related things + if (countTau == 2) { + registryMC.get(HIST("tauMC/hMCdeltaeta"))->Fill(etaTau[0] - etaTau[1]); + registryMC.get(HIST("tauMC/hMCdeltaphi"))->Fill(calculateDeltaPhi(phiTau[0], phiTau[1]) * 180. / o2::constants::math::PI); } - // electron has TOF hit + if (threePionsFound && electronFound) { + // LOGF(info,"3pi + e found"); + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(1., 1.); + if (tauInRapidity) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(2., 1.); + if (partFromTauInEta) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(3., 1.); + registryMC.get(HIST("efficiencyMCEl/hpTelec"))->Fill(partPt, 1.); + // flagE3pi = true; + } // particles from tau in eta + } // tau in y + } // el + 3pi + + if (threePionsFound && muonFound) { + // LOGF(info,"3pi + mu found"); + registryMC.get(HIST("efficiencyMCMu/effiMu"))->Fill(1., 1.); + if (tauInRapidity) { + registryMC.get(HIST("efficiencyMCMu/effiMu"))->Fill(2., 1.); + if (partFromTauInEta) { + registryMC.get(HIST("efficiencyMCMu/effiMu"))->Fill(3., 1.); + registryMC.get(HIST("efficiencyMCMu/hpTmuon"))->Fill(partPt, 1.); + // flagMu3pi = true; + } // particles from tau in eta + } // tau in y + } // el + 3pi + + if (singlePionFound && threePionsFound) { + // LOGF(info,"3pi + pi found in MC"); + // flagPi3pi = true; + registryMC.get(HIST("efficiencyMCPi/effiPi"))->Fill(1., 1.); + if (tauInRapidity) { + registryMC.get(HIST("efficiencyMCPi/effiPi"))->Fill(2., 1.); + if (partFromTauInEta) { + registryMC.get(HIST("efficiencyMCPi/effiPi"))->Fill(3., 1.); + registryMC.get(HIST("efficiencyMCPi/hpTpi"))->Fill(partPt, 1.); + } // particles from tau in eta + } // tau in y + } // el + 3pi + + registryMC.get(HIST("globalMC/hMCnPart"))->Fill(mcParticles.size(), 0); + registryMC.get(HIST("globalMC/hMCnPart"))->Fill(countGen, 1); + registryMC.get(HIST("globalMC/hMCnPart"))->Fill(countBoth, 2); + registryMC.get(HIST("globalMC/hMCnPart"))->Fill(countCharged, 3); + registryMC.get(HIST("globalMC/hMCnPart"))->Fill(countChargedFromTau, 4); + if (countChargedFromTau != 4) + return; + registryMC.get(HIST("globalMC/hMCefficiency"))->Fill(1., 1.); + if (electronFound && flagElPlusElMinus) + registryMC.get(HIST("globalMC/hMCefficiency"))->Fill(2., 1.); // e- + else if (electronFound && !flagElPlusElMinus) + registryMC.get(HIST("globalMC/hMCefficiency"))->Fill(3., 1.); // e+ + if (muonFound && flagMuPlusMuMinus) + registryMC.get(HIST("globalMC/hMCefficiency"))->Fill(4., 1.); // mu- + else if (muonFound && !flagMuPlusMuMinus) + registryMC.get(HIST("globalMC/hMCefficiency"))->Fill(5., 1.); // mu+ + if (singlePionFound && flagPiPlusPiMinus) + registryMC.get(HIST("globalMC/hMCefficiency"))->Fill(6., 1.); // pi- + else if (singlePionFound && !flagPiPlusPiMinus) + registryMC.get(HIST("globalMC/hMCefficiency"))->Fill(7., 1.); // pi+ + + if (!tauInRapidity) + return; + registryMC.get(HIST("globalMC/hMCefficiency"))->Fill(8., 1.); + if (!partFromTauInEta) + return; + registryMC.get(HIST("globalMC/hMCefficiency"))->Fill(9., 1.); - // only 1 electron - if (counterTotal == 1) { - registry.get(HIST("global/hEventEff"))->Fill(19., 1.); + } // end of processSimpleMCSG + + void processEfficiencyMCSG(aod::UDMcCollision const& mcCollision, + soa::SmallGroups> const& collisions, + LabeledTracks const& tracks, + aod::UDMcParticles const& mcParticles) + { + if (verbose) { + LOGF(info, " GeneratorIDtot %d", mcCollision.generatorsID()); + // below is not implemented in UDMcCollisions + // LOGF(info," GeneratorIDtot %d, GenID %d, subGenID %d, source %d", mcCollision.generatorsID(), mcCollision.getGeneratorId(), mcCollision.getSubGeneratorId(), mcCollision.getSourceId()); + } + registry1MC.get(HIST("globalMC/hGeneratorID"))->Fill(mcCollision.generatorsID()); + if (!(generatorIDMC < 0)) { // do not check generatorsID process if generatorIDMC < 0 + if (mcCollision.generatorsID() != generatorIDMC) + return; + } + + int indexProngMC[4]; + int index1ProngMC = -1; + bool is1ProngElectronMC = false; + // bool is1ProngMuonMC = false; + // bool is1ProngPionMC = false; + bool is3prong3PiMC = false; + int motherIndex[4]; + + int count = 0; + + bool tauInRapidity = true; + bool partFromTauInEta = true; + + for (const auto& mcParticle : mcParticles) { + if (mcParticle.isPhysicalPrimary()) { + if (mcParticle.pdgCode() != 22 && std::abs(mcParticle.pdgCode()) != 12 && std::abs(mcParticle.pdgCode()) != 14 && std::abs(mcParticle.pdgCode()) != 16 && mcParticle.pdgCode() != 130 && mcParticle.pdgCode() != 111) { + if (mcParticle.has_mothers()) { + auto const& mother = mcParticle.mothers_first_as(); + if (std::abs(mother.pdgCode()) == 15) { + if (std::abs(rapidity(mother.e(), mother.pz())) > 0.9) + tauInRapidity = false; + if (std::abs(eta(mcParticle.px(), mcParticle.py(), mcParticle.pz())) > 0.9) + partFromTauInEta = false; + + if (std::abs(mcParticle.pdgCode()) == 11) { + index1ProngMC = mcParticle.index(); + is1ProngElectronMC = true; + } else if (std::abs(mcParticle.pdgCode()) == 13) { + index1ProngMC = mcParticle.index(); + // is1ProngMuonMC = true; + } + + if (count < 4) { + indexProngMC[count] = mcParticle.index(); + motherIndex[count] = mother.globalIndex(); + } else { + indexProngMC[3] = mcParticle.index(); + motherIndex[3] = mother.globalIndex(); + } + count++; + if (collisions.size() > 0) { + registryMC.get(HIST("globalMCrec/hMCetaGenCol"))->Fill(eta(mcParticle.px(), mcParticle.py(), mcParticle.pz())); + registryMC.get(HIST("globalMCrec/hMCphiGenCol"))->Fill(phi(mcParticle.px(), mcParticle.py())); + registryMC.get(HIST("globalMCrec/hMCyGenCol"))->Fill(rapidity(mcParticle.e(), mcParticle.pz())); + registryMC.get(HIST("globalMCrec/hMCptGenCol"))->Fill(pt(mcParticle.px(), mcParticle.py())); + } + } // mother is tau + } // has mothers + } // charged particles + } // end if isPhysicalPrimary + + } // end loop over mcParticle + + if (count != 4) + return; + if (!tauInRapidity) + return; + if (!partFromTauInEta) + return; + registryMC.get(HIST("globalMC/hMCefficiency"))->Fill(10., 1.); // just to confirm there is exactly the same selection + + if (index1ProngMC < 0) { // pion case + 3pi + // bool onlyPi = true; + // // int motherIndex[4]; + // for (int i = 0; i < 4; i++) { + // auto const& tmpMC = mcParticles.begin() + indexProngMC[i]; + // if (std::abs(tmpMC.pdgCode()) != 211) onlyPi = false; + // // // mother's check already done in a loop before + // // // auto const& mother = tmpMC.mothers_first_as(); + // // // motherIndex[i] = mother.globalIndex(); + // // motherIndex[i] = (tmpMC.mothers_first_as()).globalIndex(); + // } + int motherIndex1Pi = motherIndex[0]; + int motherIndexNew = -1; + int nDifferences = 0; + for (int i = 1; i < 4; i++) { + if (motherIndex1Pi != motherIndex[i]) { // the same mother index + nDifferences++; + motherIndexNew = i; + } + } + if (nDifferences == 3) + index1ProngMC = indexProngMC[0]; + else + index1ProngMC = indexProngMC[motherIndexNew]; + // is1ProngPionMC = true; + // if (!onlyPi) LOGF(info, "ERROR: should be 4 pions, but they are not!"); + } // end of special check for pi + 3pi + + int index3ProngMC[3]; + if (index1ProngMC > 0) { // electron or muon case + 3pi + int index3pi = 0; for (int i = 0; i < 4; i++) { - registry.get(HIST("control/cut1/hDcaZ"))->Fill(dcaZ[i]); - registry.get(HIST("control/cut1/hDcaXY"))->Fill(dcaXY[i]); - registry.get(HIST("control/cut1/hChi2TPC"))->Fill(chi2TPC[i]); - registry.get(HIST("control/cut1/hChi2ITS"))->Fill(chi2ITS[i]); - - if (flagTotal[i]) { - FillControlHistos<1>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i]); - registry.get(HIST("control/cut1/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); - registry.get(HIST("pidTPC/hpvsdedxElHipCut1"))->Fill(tmpMomentum[i], tmpDedx[i]); + if (index1ProngMC == indexProngMC[i]) + continue; + index3ProngMC[index3pi] = indexProngMC[i]; + index3pi++; + } + } + + // create 1 prong and 3 prong MC references + auto const& tmp1ProngMC = mcParticles.begin() + index1ProngMC; + // LOGF(info,"tmp1ProngMC ID %d, GID %d", tmp1ProngMC.index(), tmp1ProngMC.globalIndex()); + + auto const& tmpPion1MC = mcParticles.begin() + index3ProngMC[0]; + auto const& tmpPion2MC = mcParticles.begin() + index3ProngMC[1]; + auto const& tmpPion3MC = mcParticles.begin() + index3ProngMC[2]; + + if (std::abs(tmpPion1MC.pdgCode()) == 211 && std::abs(tmpPion2MC.pdgCode()) == 211 && std::abs(tmpPion3MC.pdgCode()) == 211) + is3prong3PiMC = true; + + // + // here it comes e+3pi topology in MC + // + if (!(is1ProngElectronMC && is3prong3PiMC)) + return; + + // LOGF(info,"ID3pi1 %d, GID3pi1 %d",tmpPion1MC.index(),tmpPion1MC.globalIndex()); + // LOGF(info,"ID3pi2 %d, GID3pi2 %d",tmpPion2MC.index(),tmpPion2MC.globalIndex()); + // LOGF(info,"ID3pi3 %d, GID3pi3 %d",tmpPion3MC.index(),tmpPion3MC.globalIndex()); + + auto deltaAlpha1 = deltaAlpha(tmp1ProngMC, tmpPion1MC); + auto deltaAlpha2 = deltaAlpha(tmp1ProngMC, tmpPion2MC); + auto deltaAlpha3 = deltaAlpha(tmp1ProngMC, tmpPion3MC); + registryMC.get(HIST("efficiencyMCEl/hMCdeltaAlphaEpi"))->Fill(deltaAlpha1); + registryMC.get(HIST("efficiencyMCEl/hMCdeltaAlphaEpi"))->Fill(deltaAlpha2); + registryMC.get(HIST("efficiencyMCEl/hMCdeltaAlphaEpi"))->Fill(deltaAlpha3); + // + registryMC.get(HIST("efficiencyMCEl/hMCdeltaPhiEpi"))->Fill(calculateDeltaPhi(phi(tmp1ProngMC.px(), tmp1ProngMC.py()), phi(tmpPion1MC.px(), tmpPion1MC.py()))); + registryMC.get(HIST("efficiencyMCEl/hMCdeltaPhiEpi"))->Fill(calculateDeltaPhi(phi(tmp1ProngMC.px(), tmp1ProngMC.py()), phi(tmpPion2MC.px(), tmpPion2MC.py()))); + registryMC.get(HIST("efficiencyMCEl/hMCdeltaPhiEpi"))->Fill(calculateDeltaPhi(phi(tmp1ProngMC.px(), tmp1ProngMC.py()), phi(tmpPion3MC.px(), tmpPion3MC.py()))); + // + registryMC.get(HIST("efficiencyMCEl/hMCdeltaPhiPipi"))->Fill(calculateDeltaPhi(phi(tmpPion1MC.px(), tmpPion1MC.py()), phi(tmpPion2MC.px(), tmpPion2MC.py()))); + registryMC.get(HIST("efficiencyMCEl/hMCdeltaPhiPipi"))->Fill(calculateDeltaPhi(phi(tmpPion1MC.px(), tmpPion1MC.py()), phi(tmpPion3MC.px(), tmpPion3MC.py()))); + registryMC.get(HIST("efficiencyMCEl/hMCdeltaPhiPipi"))->Fill(calculateDeltaPhi(phi(tmpPion2MC.px(), tmpPion2MC.py()), phi(tmpPion3MC.px(), tmpPion3MC.py()))); + + // + auto deltaAlphaPi1 = deltaAlpha(tmpPion1MC, tmpPion2MC); + auto deltaAlphaPi2 = deltaAlpha(tmpPion1MC, tmpPion3MC); + auto deltaAlphaPi3 = deltaAlpha(tmpPion2MC, tmpPion3MC); + registryMC.get(HIST("efficiencyMCEl/hMCdeltaAlphaPiPi"))->Fill(deltaAlphaPi1); + registryMC.get(HIST("efficiencyMCEl/hMCdeltaAlphaPiPi"))->Fill(deltaAlphaPi2); + registryMC.get(HIST("efficiencyMCEl/hMCdeltaAlphaPiPi"))->Fill(deltaAlphaPi3); + // + float energyInCone = 0; + float angleLimit = 0.5; + if (deltaAlpha1 < angleLimit) { + energyInCone += pt(tmpPion1MC.px(), tmpPion1MC.py()); + } + if (deltaAlpha2 < angleLimit) { + energyInCone += pt(tmpPion2MC.px(), tmpPion2MC.py()); + } + if (deltaAlpha3 < angleLimit) { + energyInCone += pt(tmpPion3MC.px(), tmpPion3MC.py()); + } + registryMC.get(HIST("efficiencyMCEl/hMCvirtCal"))->Fill(energyInCone); + // + registryMC.get(HIST("efficiencyMCEl/hMCScalar"))->Fill(scalarAsymMC(tmp1ProngMC, tmpPion1MC)); + registryMC.get(HIST("efficiencyMCEl/hMCScalar"))->Fill(scalarAsymMC(tmp1ProngMC, tmpPion2MC)); + registryMC.get(HIST("efficiencyMCEl/hMCScalar"))->Fill(scalarAsymMC(tmp1ProngMC, tmpPion3MC)); + // + registryMC.get(HIST("efficiencyMCEl/hMCVector"))->Fill(vectorAsym(tmp1ProngMC, tmpPion1MC)); + registryMC.get(HIST("efficiencyMCEl/hMCVector"))->Fill(vectorAsym(tmp1ProngMC, tmpPion2MC)); + registryMC.get(HIST("efficiencyMCEl/hMCVector"))->Fill(vectorAsym(tmp1ProngMC, tmpPion3MC)); + + // add eta phi + registryMC.get(HIST("efficiencyMCEl/hMCptEl"))->Fill(pt(tmp1ProngMC.px(), tmp1ProngMC.py())); + + float px3pi = tmpPion1MC.px() + tmpPion2MC.px() + tmpPion3MC.px(); + float py3pi = tmpPion1MC.py() + tmpPion2MC.py() + tmpPion3MC.py(); + float pz3pi = tmpPion1MC.pz() + tmpPion2MC.pz() + tmpPion3MC.pz(); + float en3pi = tmpPion1MC.e() + tmpPion2MC.e() + tmpPion3MC.e(); + + registryMC.get(HIST("efficiencyMCEl/hMCpt4trk"))->Fill(pt(tmp1ProngMC.px() + px3pi, tmp1ProngMC.py() + py3pi)); + registryMC.get(HIST("efficiencyMCEl/hMCinvmass4pi"))->Fill(invariantMass(tmp1ProngMC.e() + en3pi, tmp1ProngMC.px() + px3pi, tmp1ProngMC.py() + py3pi, tmp1ProngMC.pz() + pz3pi)); + registryMC.get(HIST("efficiencyMCEl/hMCinvmass3pi"))->Fill(invariantMass(en3pi, px3pi, py3pi, pz3pi)); + registryMC.get(HIST("efficiencyMCEl/hMCdeltaphi13"))->Fill(calculateDeltaPhi(phi(tmp1ProngMC.px(), tmp1ProngMC.py()), phi(px3pi, py3pi))); + + // reconstructed event + if (collisions.size() < 1) + return; + registryMC.get(HIST("globalMC/hMCefficiency"))->Fill(11., 1.); // there is at least 1 collision associated to MC collision + if (is1ProngElectronMC && is3prong3PiMC) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(4., 1.); + if (collisions.size() == 1) + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(5., 1.); + + // event selection flags + bool zVertexFlag = false; + bool allInEtaAcceptance = false; + int nTrkInEtaRange = 0; + // bool allAbovePtThreshold = false; + int nTrkAbovePtThreshold = 0; + + int nPVTracks = 0; + int nGhostTracks = 0; + int nGhostPVTracks = 0; + + // int nGenTracks=0; + // int nGenPrimTracks=0; + // int nGenPVTracks=0; + // int nGenPrimPVTracks=0; + + int trackId[4]; // local index in collision + int trackCharge = 0; + bool trackToMCmatch[4]; // match between data track and corresponding MC particle; true = match, false = track not found in this collision + int trackMCId[4]; // when MC found, the global index from MC Particle is stored here + + int matchedElIndexToData = -1; + int gapSide = -2; + int truegapSide = -2; + float reconstructedPtElMatchedToMC = -1; + + bool flagGapSideSGP = false; + bool flagDoubleGap = false; + bool tracksMatchedToMC = false; + + // FIT checks + auto bitMin = 16 - mFITvetoWindow; // default is +- 1 bc (1 bit) + auto bitMax = 16 + mFITvetoWindow; + bool flagFITveto = false; + + for (const auto& collision : collisions) { + // FIT flag set + flagFITveto = false; + for (auto bit = bitMin; bit <= bitMax; bit++) { + if (TESTBIT(collision.bbFT0Apf(), bit)) + flagFITveto = true; + if (TESTBIT(collision.bbFT0Cpf(), bit)) + flagFITveto = true; + if (useFV0ForVeto && TESTBIT(collision.bbFV0Apf(), bit)) + flagFITveto = true; + if (useFDDAForVeto && TESTBIT(collision.bbFDDApf(), bit)) + flagFITveto = true; + if (useFDDCForVeto && TESTBIT(collision.bbFDDCpf(), bit)) + flagFITveto = true; + } // end of loop over FIT bits + + registry1MC.get(HIST("globalMCrec/hRecFlag"))->Fill(collision.flags()); // reconstruction with upc settings flag + // registry1MC.get(HIST("globalMCrec/hOccupancyInTime"))->Fill(collision.occupancyInTime()); + + matchedElIndexToData = -1; + reconstructedPtElMatchedToMC = -1; + gapSide = collision.gapSide(); + truegapSide = sgSelector.trueGap(collision, cutFV0, cutFT0A, cutFT0C, cutZDC); + registryMC.fill(HIST("globalMCrec/GapSide"), gapSide); + registryMC.fill(HIST("globalMCrec/GapSideTrue"), truegapSide); + // if (gapSide < 0 || gapSide > 2) continue; //old way + if (gapSide >= 0 && gapSide <= 2) + flagGapSideSGP = true; + + gapSide = truegapSide; + // if (flagGapSideSGP) registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(6., 1./collisions.size()); + // if (flagGapSideSGP && tracksMatchedToMC) registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(7., 1./collisions.size()); // with true information + + // if (gapSide != mGapSide) continue; //old way + if (gapSide == mGapSide) + flagDoubleGap = true; + // if (flagDoubleGap) registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(8., 1./collisions.size()); + // if (flagDoubleGap && tracksMatchedToMC) registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(9., 1./collisions.size()); // with true information + registryMC.get(HIST("globalMCrec/hVertexXY"))->Fill(collision.posX(), collision.posY()); + registryMC.get(HIST("globalMCrec/hVertexZ"))->Fill(collision.posZ()); + + zVertexFlag = true; + if (std::abs(collision.posZ()) >= zvertexcut) + zVertexFlag = false; + + auto groupedTracks = tracks.sliceBy(perCollision, collision.globalIndex()); + registryMC.get(HIST("globalMCrec/hNTracks"))->Fill(groupedTracks.size()); + nPVTracks = 0; + nGhostTracks = 0; + nGhostPVTracks = 0; + + for (int i = 0; i < 4; i++) { + trackToMCmatch[i] = false; + trackMCId[i] = -1; + } + + // nGenTracks=0; + // nGenPrimTracks=0; + // nGenPVTracks=0; + // nGenPrimPVTracks=0; + + trackCharge = 0; + allInEtaAcceptance = false; + nTrkInEtaRange = 0; + // allAbovePtThreshold = false; + nTrkAbovePtThreshold = 0; + + // + // first loop over grouped Tracks + // + for (auto const& track : groupedTracks) { + // ghost track + if (!track.has_udMcParticle()) { + nGhostTracks++; + } + + if (track.isPVContributor()) { + if (nPVTracks < 4) { + trackId[nPVTracks] = track.index(); + } + nPVTracks++; + trackCharge += track.sign(); + // if (std::abs(eta(track.px(),track.py(),track.pz())) >= trkEtacut) allInEtaAcceptance = false; + if (std::abs(eta(track.px(), track.py(), track.pz())) < trkEtacut) + nTrkInEtaRange++; + if (track.pt() > 0.1) + nTrkAbovePtThreshold++; + // // if (track.tpcNSigmaEl() > -2 && track.tpcNSigmaEl() < 3) atLeast1ElectronPID = true; + // ptmp.SetXYZM(track.px(), track.py(), track.pz(), mpion); + // // hPt->Fill(p.Pt()); + // ptot += ptmp; + + if (track.has_udMcParticle()) { + // LOGF(info, "track ID %d match to MC (1p,3p0,3p1,3p2) (%d, %d, %d, %d)", track.udMcParticle().globalIndex(), tmp1ProngMC.globalIndex(), tmpPion1MC.globalIndex(), tmpPion2MC.globalIndex(), tmpPion3MC.globalIndex()); + if (nPVTracks < 5) { + trackMCId[nPVTracks - 1] = track.udMcParticle().globalIndex(); + if (trackMCId[nPVTracks - 1] == tmp1ProngMC.globalIndex()) { + matchedElIndexToData = nPVTracks - 1; + reconstructedPtElMatchedToMC = track.pt(); + } + + if (trackMCId[nPVTracks - 1] == tmp1ProngMC.globalIndex() || + trackMCId[nPVTracks - 1] == tmpPion1MC.globalIndex() || + trackMCId[nPVTracks - 1] == tmpPion2MC.globalIndex() || + trackMCId[nPVTracks - 1] == tmpPion3MC.globalIndex()) + trackToMCmatch[nPVTracks - 1] = true; // flag, we have a match data <=> MC + } + + } else { // end of case where track has MC Particle associated + // ghost PV track + nGhostPVTracks++; + } + } else { // PV contributor + if (track.has_udMcParticle()) { + // LOGF(info,"non-PV trk: pid %4.0d (%f, %f, %f) gid %d pt %f",track.udMcParticle().pdgCode(), track.udMcParticle().vx(),track.udMcParticle().vy(),track.udMcParticle().vz(),track.udMcParticle().globalIndex(),track.pt()); + if (verbose) { + LOGF(info, "non-PV trk: pid %4.0d gid %d", track.udMcParticle().pdgCode(), track.udMcParticle().globalIndex()); + } + } + } + // if (track.isGlobalTrack()) nGlobalTracks++; + } // end of loop over tracks + registryMC.get(HIST("globalMCrec/hNTracksPV"))->Fill(nPVTracks); + registryMC.get(HIST("globalMCrec/hNGhostTracks"))->Fill(nGhostTracks); + registryMC.get(HIST("globalMCrec/hNGhostTracksPV"))->Fill(nGhostPVTracks); + registryMC.get(HIST("globalMCrec/hQtot"))->Fill(trackCharge); + + // check whether tracks match to MC particles + if (trackToMCmatch[0] && trackToMCmatch[1] && trackToMCmatch[2] && trackToMCmatch[3]) + tracksMatchedToMC = true; + registryMC.get(HIST("globalMCrec/hTrackToMCMatch"))->Fill(tracksMatchedToMC); + + if (nTrkInEtaRange >= 4) + allInEtaAcceptance = true; + if (nTrkAbovePtThreshold >= 4) + nTrkAbovePtThreshold = true; + + // zdc information + float energyZNA = collision.energyCommonZNA(); + float energyZNC = collision.energyCommonZNC(); + // if (energyZNA < 0) registry.get(HIST("global/hZNACenergyTest"))->Fill(energyZNA); + // if (energyZNC < 0) registry.get(HIST("global/hZNACenergyTest"))->Fill(energyZNC); + if (energyZNA < 0) + energyZNA = -1.; + if (energyZNC < 0) + energyZNC = -1.; + registryMC.get(HIST("globalMCrec/hZNACenergy"))->Fill(energyZNA, energyZNC); + registryMC.get(HIST("globalMCrec/hZNACtime"))->Fill(collision.timeZNA(), collision.timeZNC()); + + // + // here analysis event selection comes and track eta phi, pt comparison after that + // + // SG producer: flagGapSideSGP ok + // Double gap: flagDoubleGap ok + // npvtracks: nPVTracks ok + // Zvertex: zVertexFlag + // tracks in eta: allInEtaAcceptance + // tracks charge : trackCharge + // MC to data matching: tracksMatchedToMC + + // it is after reconstruction + if (tracksMatchedToMC) { + registryMC.get(HIST("globalMCrec/hPtSpectrumElRec0"))->Fill(reconstructedPtElMatchedToMC); // pt El confirmed with true information + } + + // skip events wrongly reconstructed by SG producernot + if (!flagGapSideSGP) { + if (verbose) { + LOGF(info, " Candidate rejected: DGproducer flag is %d", gapSide); + } + return; + } + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(6., 1. / collisions.size()); + if (tracksMatchedToMC) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(7., 1. / collisions.size()); // with true information + registryMC.get(HIST("globalMCrec/hPtSpectrumElRec1"))->Fill(reconstructedPtElMatchedToMC); // pt El confirmed with true information + } + + // skip not Double Gap events + if (!flagDoubleGap) { + if (verbose) { + LOGF(info, " Candidate rejected: not double gapevent, gap value is %d", gapSide); + } + return; + } + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(8., 1. / collisions.size()); + if (tracksMatchedToMC) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(9., 1. / collisions.size()); // with true information + registryMC.get(HIST("globalMCrec/hPtSpectrumElRec2"))->Fill(reconstructedPtElMatchedToMC); // pt El confirmed with true information + } + + // // skip events with too few/many tracks + if (nPVTracks != 4) { + if (verbose) { + LOGF(info, " Candidate rejected: Number of PV contributors is %d", nPVTracks); + } + return; + } + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(10., 1.); + if (tracksMatchedToMC) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(11., 1.); // with true information + registryMC.get(HIST("globalMCrec/hPtSpectrumElRec3"))->Fill(reconstructedPtElMatchedToMC); // pt El confirmed with true information + } + + // //four reconstructed track with MC track link + // auto const track1 = groupedTracks.begin()+trackId[0]; + // auto const track2 = groupedTracks.begin()+trackId[1]; + // auto const track3 = groupedTracks.begin()+trackId[2]; + // auto const track4 = groupedTracks.begin()+trackId[3]; + + // here comes histos of global1 but in MC + registryMC.get(HIST("global1MCrec/hTrackPVTotCharge"))->Fill(trackCharge); + registryMC.get(HIST("global1MCrec/hVertexZ"))->Fill(collision.posZ()); + registryMC.get(HIST("global1MCrec/hNTracks"))->Fill(groupedTracks.size()); + registryMC.get(HIST("global1MCrec/hNTracksPV"))->Fill(nPVTracks); + + TLorentzVector p, p1; + p.SetXYZM(0., 0., 0., 0.); + TVector3 v1(0, 0, 0); + TVector3 v2(0, 0, 0); + float scalarPtsum = 0; + bool flagVcalPV[4] = {false, false, false, false}; + float deltaphi = 0; + bool trkHasTof[4] = {false, false, false, false}; + + // + // second loop, only over PV tracks + // + for (int i = 0; i < 4; i++) { + auto const tmptrack = groupedTracks.begin() + trackId[i]; + if (tmptrack.hasTOF()) + trkHasTof[i] = true; + v1.SetXYZ(tmptrack.px(), tmptrack.py(), tmptrack.pz()); + // second loop to calculate virtual calorimeter for (int j = 0; j < 4; j++) { if (i == j) continue; - registry.get(HIST("pidTPC3pi/hpvsdedxElHipCut1"))->Fill(tmpMomentum[j], tmpDedx[j]); + auto const tmptrack2 = groupedTracks.begin() + trackId[j]; + v2.SetXYZ(tmptrack2.px(), tmptrack2.py(), tmptrack2.pz()); + deltaphi = v1.Angle(v2); + if (deltaphi < minAnglecut) { // default 0.05 + flagVcalPV[i] = true; + } + } // end of second loop + float tmpEtaData = eta(tmptrack.px(), tmptrack.py(), tmptrack.pz()); + float tmpPhiData = phi(tmptrack.px(), tmptrack.py()); + registryMC.get(HIST("global1MCrec/hTrackEtaPhiPV"))->Fill(tmpEtaData, tmpPhiData); + registryMC.get(HIST("global1MCrec/hTrackPtPV"))->Fill(tmptrack.pt()); + p1.SetXYZM(v1.X(), v1.Y(), v1.Z(), MassPiPlus); // in case of ghost + + if (trackMCId[i] >= 0) { + p1.SetXYZM(v1.X(), v1.Y(), v1.Z(), (std::abs(tmptrack.udMcParticle().pdgCode()) == 211 ? MassPiPlus : MassElectron)); + float tmpPt = pt(tmptrack.udMcParticle().px(), tmptrack.udMcParticle().py()); + float tmpEta = eta(tmptrack.udMcParticle().px(), tmptrack.udMcParticle().py(), tmptrack.udMcParticle().pz()); + float tmpPhi = phi(tmptrack.udMcParticle().px(), tmptrack.udMcParticle().py()); + registryMC.get(HIST("global1MCrec/hpTGenRecTracksPV"))->Fill(tmptrack.pt(), tmpPt); + registryMC.get(HIST("global1MCrec/hDeltapTGenRecVsRecpTTracksPV"))->Fill(tmptrack.pt() - tmpPt, tmptrack.pt()); + registryMC.get(HIST("global1MCrec/hEtaGenRecTracksPV"))->Fill(tmpEtaData, tmpEta); + registryMC.get(HIST("global1MCrec/hDeltaEtaGenRecVsRecpTTracksPV"))->Fill(tmpEtaData - tmpEta, tmptrack.pt()); + registryMC.get(HIST("global1MCrec/hPhiGenRecTracksPV"))->Fill(tmpPhiData, tmpPhi); + registryMC.get(HIST("global1MCrec/hDeltaPhiGenRecVsRecpTTracksPV"))->Fill(calculateDeltaPhi(tmpPhiData, tmpPhi), tmptrack.pt()); + } // MC infor exists + p += p1; + scalarPtsum += p1.Pt(); + } // end of short loop over tracks + + int nTofTracks = trkHasTof[0] + trkHasTof[1] + trkHasTof[2] + trkHasTof[3]; + + // if vz < 10 + if (!zVertexFlag) { // default = 10 + if (verbose) { + LOGF(info, " Candidate rejected: VertexZ is %f", collision.posZ()); + } + return; + } + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(12., 1.); + if (tracksMatchedToMC) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(13., 1.); // with true information + registryMC.get(HIST("globalMCrec/hPtSpectrumElRec4"))->Fill(reconstructedPtElMatchedToMC); // pt El confirmed with true information + } + + // if eta tracks <0.9 default + if (!allInEtaAcceptance) { + if (verbose) { + LOGF(info, " Candidate rejected: Ntrk inside |eta|<0.9 is %d", nTrkInEtaRange); } - registry.get(HIST("global/hFinalPtSpectrumEl"))->Fill(tmpPt[i]); - registry.get(HIST("control/cut1/hTPCnclsFindable"))->Fill(nclTPCfind[i]); - registry.get(HIST("control/cut1/hsigma3Pi"))->Fill(nSigma3Pi[i]); - registry.get(HIST("control/cut1/h3pi1eMass"))->Fill(mass3pi1e[i]); + return; + } + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(14., 1.); + if (tracksMatchedToMC) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(15., 1.); // with true information + registryMC.get(HIST("globalMCrec/hPtSpectrumElRec5"))->Fill(reconstructedPtElMatchedToMC); // pt El confirmed with true information + } + + // if pt of tracks >100 MeV/c + if (!nTrkAbovePtThreshold) { if (verbose) { - LOGF(info, "cut1 trackTime %f, %f, %f, %f Res %f, %f, %f, %f", trkTime[0], trkTime[1], trkTime[2], trkTime[3], trkTimeRes[0], trkTimeRes[1], trkTimeRes[2], trkTimeRes[3]); + LOGF(info, " Candidate rejected: Ntrk with pT >100 MeV/c is %d", nTrkAbovePtThreshold); } + return; + } + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(16., 1.); + if (tracksMatchedToMC) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(17., 1.); // with true information + registryMC.get(HIST("globalMCrec/hPtSpectrumElRec6"))->Fill(reconstructedPtElMatchedToMC); // pt El confirmed with true information + } - // one electron with tof hit (cut33) - if (tmpHasTOF[i]) { - registry.get(HIST("global/hEventEff"))->Fill(20., 1.); - // registry.get(HIST("control/cut33/hDcaZ"))->Fill(dcaZ[i]); - // registry.get(HIST("control/cut33/hDcaXY"))->Fill(dcaXY[i]); - // registry.get(HIST("control/cut33/hChi2TPC"))->Fill(chi2TPC[i]); - // registry.get(HIST("control/cut33/hChi2ITS"))->Fill(chi2ITS[i]); - FillControlHistos<33>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i]); - registry.get(HIST("control/cut33/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); - registry.get(HIST("pidTPC/hpvsdedxElHipCut33"))->Fill(tmpMomentum[i], tmpDedx[i]); - registry.get(HIST("control/cut33/h4trkPtTot"))->Fill(pttot); - registry.get(HIST("control/cut33/h4piMass"))->Fill(mass4pi); - registry.get(HIST("control/cut33/h4trkMassVsPt"))->Fill(mass4pi, pttot); - registry.get(HIST("control/cut33/hNtofTrk"))->Fill(nTofTrk); - registry.get(HIST("control/cut33/hZNACenergy"))->Fill(ZNAenergy, ZNCenergy); - registry.get(HIST("control/cut33/hsigma3Pi"))->Fill(nSigma3Pi[i]); - registry.get(HIST("control/cut33/h3pi1eMass"))->Fill(mass3pi1e[i]); - registry.get(HIST("control/cut33/hPtSpectrumEl"))->Fill(tmpPt[i]); + // skip events with net charge != 0 + if (!sameSign) { // opposite sign is signal + if (trackCharge != 0) { if (verbose) { - LOGF(info, "cut33 trackTime %f, %f, %f, %f Res %f, %f, %f, %f", trkTime[0], trkTime[1], trkTime[2], trkTime[3], trkTimeRes[0], trkTimeRes[1], trkTimeRes[2], trkTimeRes[3]); + LOGF(info, " Candidate rejected: Net charge is %d (dgcand %d), while should be 0", trackCharge, collision.netCharge()); } + return; + } + } else { // same sign is background + if (trackCharge == 0) { + if (verbose) { + LOGF(info, " Candidate rejected: Net charge is %d (dgcand %d), while should be not 0", trackCharge, collision.netCharge()); + } + return; + } + } + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(18., 1.); + if (tracksMatchedToMC) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(19., 1.); // with true information + registryMC.get(HIST("globalMCrec/hPtSpectrumElRec7"))->Fill(reconstructedPtElMatchedToMC); // pt El confirmed with true information + } - int otherTOFtracks = 0; - for (int j = 0; j < 4; j++) { - if (i == j) - continue; - if (tmpHasTOF[j]) - otherTOFtracks++; + // + // n TOF tracks cut 32 + // + if (nTofTracks < nTofTrkMinCut) { + if (verbose) { + LOGF(info, " Candidate rejected: nTOFtracks is %d", nTofTracks); + } + return; + } + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(56., 1.); // TOF tracks > Ntoftracks + if (tracksMatchedToMC) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(57., 1.); // electron identified, tracks match to MC Particles + registryMC.get(HIST("globalMCrec/hPtSpectrumElRec8"))->Fill(reconstructedPtElMatchedToMC); // pt El confirmed with true information + } + + // + // check FIT information + // + if (mFITvetoFlag) { + if (flagFITveto) { + if (verbose) { + LOGF(info, " Candidate rejected: FIT not empty"); } - // at least one pion with tof hit (cut34) - if (otherTOFtracks >= 1) { - registry.get(HIST("global/hEventEff"))->Fill(21., 1.); - // registry.get(HIST("control/cut34/hDcaZ"))->Fill(dcaZ[i]); - // registry.get(HIST("control/cut34/hDcaXY"))->Fill(dcaXY[i]); - // registry.get(HIST("control/cut34/hChi2TPC"))->Fill(chi2TPC[i]); - // registry.get(HIST("control/cut34/hChi2ITS"))->Fill(chi2ITS[i]); - FillControlHistos<34>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i]); - registry.get(HIST("control/cut34/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); - registry.get(HIST("pidTPC/hpvsdedxElHipCut34"))->Fill(tmpMomentum[i], tmpDedx[i]); - registry.get(HIST("control/cut34/h4trkPtTot"))->Fill(pttot); - registry.get(HIST("control/cut34/h4piMass"))->Fill(mass4pi); - registry.get(HIST("control/cut34/h4trkMassVsPt"))->Fill(mass4pi, pttot); - registry.get(HIST("control/cut34/hNtofTrk"))->Fill(nTofTrk); - registry.get(HIST("control/cut34/hZNACenergy"))->Fill(ZNAenergy, ZNCenergy); - registry.get(HIST("control/cut34/hsigma3Pi"))->Fill(nSigma3Pi[i]); - registry.get(HIST("control/cut34/h3pi1eMass"))->Fill(mass3pi1e[i]); - registry.get(HIST("control/cut34/hPtSpectrumEl"))->Fill(tmpPt[i]); - if (verbose) { - LOGF(info, "cut34 trackTime %f, %f, %f, %f Res %f, %f, %f, %f", trkTime[0], trkTime[1], trkTime[2], trkTime[3], trkTimeRes[0], trkTimeRes[1], trkTimeRes[2], trkTimeRes[3]); - } - } // end of at least one pion with tof hit (cut34) + return; + } + } // end of check emptiness around given BC in FIT detectors + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(53., 1.); // electron identified + if (tracksMatchedToMC) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(54., 1.); // electron identified, tracks match to MC Particles + registryMC.get(HIST("globalMCrec/hPtSpectrumElRec9"))->Fill(reconstructedPtElMatchedToMC); // pt El confirmed with true information + } + + // + // here PID from TPC starts to be + // + // temporary control variables per event with combinatorics + float pttot = p.Pt(); + float mass4pi = p.Mag(); + int counterTmp = 0; + + float nSigmaEl[4]; + float nSigmaPi[4]; + float nSigma3Pi[4] = {0., 0., 0., 0.}; + float nSigmaPr[4]; + float nSigmaKa[4]; + // float dcaZ[4]; + // float dcaXY[4]; + // float chi2TPC[4]; + // float chi2ITS[4]; + float chi2TOF[4]; + // float nclTPCfind[4]; + float nclTPCcrossedRows[4]; + // bool tmpHasTOF[4]; + // double trkTime[4]; + // float trkTimeRes[4]; + + float tmpMomentum[4]; + float tmpPt[4]; + float tmpDedx[4]; + float tmpTofNsigmaEl[4]; + + float deltaPhiTmp = 0; + float pi3invMass[4]; + float pi3pt[4]; + float pi3deltaPhi[4]; + float pi3assymav[4]; + float pi3vector[4]; + float pi3scalar[4]; + + // bool trkHasTof[4] = {false, false, false, false}; + + // float mass3pi1e[4]; + // double trkTimeTot = 0.; + // float trkTimeResTot = 10000.; + for (int i = 0; i < 4; i++) { + auto const tmptrack = groupedTracks.begin() + trackId[i]; + // if (tmptrack.hasTOF()) trkHasTof[i] = true; + v1.SetXYZ(tmptrack.px(), tmptrack.py(), tmptrack.pz()); + p1.SetXYZM(v1.X(), v1.Y(), v1.Z(), MassPiPlus); // in case of ghost + if (trackMCId[i] >= 0) { + p1.SetXYZM(v1.X(), v1.Y(), v1.Z(), (i == matchedElIndexToData ? MassElectron : MassPiPlus)); + } + + nSigmaEl[counterTmp] = tmptrack.tpcNSigmaEl(); + nSigmaPi[counterTmp] = tmptrack.tpcNSigmaPi(); + nSigma3Pi[3] += (nSigmaPi[counterTmp] * nSigmaPi[counterTmp]); + // nSigmaPr[counterTmp] = tmptrack.tpcNSigmaPr(); + // nSigmaPr[counterTmp] = (tmptrack.pt() < 1.5 ? tmptrack.tofNSigmaPr() : tmptrack.tpcNSigmaPr() ); + nSigmaPr[counterTmp] = std::sqrt(tmptrack.tofNSigmaPr() * tmptrack.tofNSigmaPr() + tmptrack.tpcNSigmaPr() * tmptrack.tpcNSigmaPr()); + // nSigmaKa[counterTmp] = tmptrack.tpcNSigmaKa(); + // nSigmaKa[counterTmp] = (tmptrack.pt() < 1.3 ? tmptrack.tofNSigmaKa() : tmptrack.tpcNSigmaKa() ); + nSigmaKa[counterTmp] = std::sqrt(tmptrack.tofNSigmaKa() * tmptrack.tofNSigmaKa() + tmptrack.tpcNSigmaKa() * tmptrack.tpcNSigmaKa()); + + // dcaZ[counterTmp] = tmptrack.dcaZ(); + // dcaXY[counterTmp] = tmptrack.dcaXY(); + // chi2TPC[counterTmp] = tmptrack.tpcChi2NCl(); + // chi2ITS[counterTmp] = tmptrack.itsChi2NCl(); + chi2TOF[counterTmp] = tmptrack.tofChi2(); + // nclTPCfind[counterTmp] = tmptrack.tpcNClsFindable(); + nclTPCcrossedRows[counterTmp] = tmptrack.tpcNClsCrossedRows(); + + // tmpHasTOF[counterTmp] = tmptrack.hasTOF(); + // trkTime[counterTmp] = tmptrack.trackTime(); + // trkTimeRes[counterTmp] = tmptrack.trackTimeRes(); + + tmpMomentum[counterTmp] = p1.P(); + tmpPt[counterTmp] = p1.Pt(); + tmpDedx[counterTmp] = tmptrack.tpcSignal(); + tmpTofNsigmaEl[counterTmp] = tmptrack.tofNSigmaEl(); + + deltaPhiTmp = calculateDeltaPhi(p - p1, p1); + pi3invMass[counterTmp] = (p - p1).Mag(); + pi3pt[counterTmp] = (p - p1).Pt(); + pi3deltaPhi[counterTmp] = deltaPhiTmp; + pi3assymav[counterTmp] = (p1.Pt() - (scalarPtsum - p1.Pt()) / 3.) / (p1.Pt() + (scalarPtsum - p1.Pt()) / 3.); + pi3vector[counterTmp] = p.Pt() / (p - p1 - p1).Pt(); + pi3scalar[counterTmp] = ((p - p1).Pt() - p1.Pt()) / ((p - p1).Pt() + p1.Pt()); + + counterTmp++; + } // end of second loop over PVtracks + + // fill the histograms with true information + for (int i = 0; i < 4; i++) { + nSigma3Pi[i] = nSigma3Pi[3] - (nSigmaPi[i] * nSigmaPi[i]); + nSigma3Pi[i] = std::sqrt(nSigma3Pi[i]); + if (i == matchedElIndexToData) { + fillControlHistosMCtrue<0>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("controlMCtrue/cut0/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + registryMC.get(HIST("pidTPCMCEltrue/hpvsdedxElHipCut0"))->Fill(tmpMomentum[i], tmpDedx[i]); + registryMC.get(HIST("controlMCtrue/cut0/hsigma3Pi"))->Fill(nSigma3Pi[i]); + registry1MC.get(HIST("pidTOFMCEltrue/hpvsNsigmaElHipCut0"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + // registryMC.get(HIST("control/cut0/h3pi1eMass"))->Fill(mass3pi1e[i]); + } else { // only for 1prong = electron true + fillControlHistosMCcomb<0>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("pidTPCMCPitrue/hpvsdedxElHipCut0"))->Fill(tmpMomentum[i], tmpDedx[i]); + registryMC.get(HIST("controlMCcomb/cut0/hsigma3Pi"))->Fill(nSigma3Pi[i]); + } + } // end of loop over PV tracks' informations + // global variables + registryMC.get(HIST("controlMCtrue/cut0/h3pi1eMass"))->Fill(mass4pi); // 3pi + 1e mass + registryMC.get(HIST("controlMCtrue/cut0/h4trkPtTot"))->Fill(pttot); + registryMC.get(HIST("controlMCtrue/cut0/h4piMass"))->Fill(mass4pi); + registryMC.get(HIST("controlMCtrue/cut0/h4trkMassVsPt"))->Fill(mass4pi, pttot); + // registryMC.get(HIST("controlMCtrue/cut0/hNtofTrk"))->Fill(nTofTrk); + registryMC.get(HIST("controlMCtrue/cut0/hZNACenergy"))->Fill(energyZNA, energyZNC); + + // remove combinatorics + // bool flagTotal[4] = {false, false, false, false}; + bool flagIM[4] = {false, false, false, false}; + bool flagDP[4] = {false, false, false, false}; + bool flagEl[4] = {false, false, false, false}; + bool flagPi[4] = {false, false, false, false}; + bool flagPr[4] = {false, false, false, false}; + bool flagKa[4] = {false, false, false, false}; + bool flagCR[4] = {false, false, false, false}; + bool flagS3pi[4] = {false, false, false, false}; + + for (int i = 0; i < 4; i++) { + if (pi3invMass[i] < invMass3piMaxcut) { // default should be 1.8 + if (invMass3piSignalRegion) { + flagIM[i] = true; + } else { + flagIM[i] = false; + } + } else { + registryMC.get(HIST("pidTPCMCEltrue/hpvsdedxElHipCut2"))->Fill(tmpMomentum[i], tmpDedx[i]); + } + + if (pi3deltaPhi[i] > deltaPhiMincut) { // default should be 1.5 + flagDP[i] = true; + } else { + registryMC.get(HIST("pidTPCMCEltrue/hpvsdedxElHipCut3"))->Fill(tmpMomentum[i], tmpDedx[i]); + } + + if (minNsigmaElcut < nSigmaEl[i] && nSigmaEl[i] < maxNsigmaElcut) { // default (-2,3) + flagEl[i] = true; + } else { + registryMC.get(HIST("pidTPCMCEltrue/hpvsdedxElHipCut4"))->Fill(tmpMomentum[i], tmpDedx[i]); + } + + if (std::abs(nSigmaPi[i]) > maxNsigmaPiVetocut) { // default is 4 + flagPi[i] = true; + } else { + registryMC.get(HIST("pidTPCMCEltrue/hpvsdedxElHipCut5"))->Fill(tmpMomentum[i], tmpDedx[i]); + } + + // if (tmpPt[i] > minPtEtrkcut) { // 0.25 + // flagPt[i] = true; + // } else { + // registryMC.get(HIST("pidTPCMCEltrue/hpvsdedxElHipCut6"))->Fill(tmpMomentum[i], tmpDedx[i]); + // } + + if (flagVcalPV[i]) { + registryMC.get(HIST("pidTPCMCEltrue/hpvsdedxElHipCut7"))->Fill(tmpMomentum[i], tmpDedx[i]); + } + + if (pttot < 0.15) { + registryMC.get(HIST("pidTPCMCEltrue/hpvsdedxElHipCut8"))->Fill(tmpMomentum[i], tmpDedx[i]); + } + + if (std::abs(nSigmaPr[i]) > maxNsigmaPrVetocut) { // default is 3 + flagPr[i] = true; + } else { + registryMC.get(HIST("pidTPCMCEltrue/hpvsdedxElHipCut9"))->Fill(tmpMomentum[i], tmpDedx[i]); + } + + if (std::abs(nSigmaKa[i]) > maxNsigmaKaVetocut) { // default is 3 + flagKa[i] = true; + } else { + registryMC.get(HIST("pidTPCMCEltrue/hpvsdedxElHipCut10"))->Fill(tmpMomentum[i], tmpDedx[i]); + } + + if (nclTPCcrossedRows[i] > nTPCcrossedRowsMinCut) { // default is 50 + flagCR[i] = true; + } else { + registryMC.get(HIST("pidTPCMCEltrue/hpvsdedxElHipCut11"))->Fill(tmpMomentum[i], tmpDedx[i]); + } - } // end of one electron with tof hit (cut33) + if (nSigma3Pi[i] < nSigma3piMaxCut) { // default is 5 + flagS3pi[i] = true; + } else { + registryMC.get(HIST("pidTPCMCEltrue/hpvsdedxElHipCut12"))->Fill(tmpMomentum[i], tmpDedx[i]); + } + + // flagTotal[i] = flagEl[i] && flagPi[i] && flagPt[i] && !flagVcalPV[i] && flagPr[i] && flagKa[i] && flagIM[i] && flagDP[i] && flagCR[i] && flagS3pi[i]; + } // end of loop over 4 tracks + + int counterEl = flagEl[0] + flagEl[1] + flagEl[2] + flagEl[3]; + + // + // draw PID and control histograms + // + + // + // Nelectrons in TPC PID nsigma > 0, cut20 + // + if (counterEl > 0) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(20., 1.); // at least 1 electron identified + if (tracksMatchedToMC) + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(21., 1.); // electron identified, tracks match to MC Particles + if (tracksMatchedToMC && flagEl[matchedElIndexToData]) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(22., 1.); // electron identified, tracks match to MC Particles, El is MC El true + + registryMC.get(HIST("controlMCtrue/cut20/h4piMass"))->Fill(mass4pi); + registryMC.get(HIST("controlMCtrue/cut20/h4trkPtTot"))->Fill(pttot); + registryMC.get(HIST("controlMCtrue/cut20/h4trkMassVsPt"))->Fill(mass4pi, pttot); + registryMC.get(HIST("controlMCtrue/cut20/hZNACenergy"))->Fill(energyZNA, energyZNC); + // registryMC.get(HIST("controlMCtrue/cut20/hNtofTrk"))->Fill(nTofTrk); + } + for (int i = 0; i < 4; i++) { + if (flagEl[i] && tracksMatchedToMC && (i == matchedElIndexToData)) { // only for 1prong = electron true + registryMC.get(HIST("pidTPCMCEltrue/hpvsdedxElHipCut20"))->Fill(tmpMomentum[i], tmpDedx[i]); + fillControlHistosMCtrue<20>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("controlMCtrue/cut20/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + registryMC.get(HIST("controlMCtrue/cut20/hsigma3Pi"))->Fill(nSigma3Pi[i]); + registry1MC.get(HIST("pidTOFMCEltrue/hpvsNsigmaElHipCut20"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + // registry1MC.get(HIST("controlMCtrue/cut20/hTofChi2El"))->Fill(chi2TOF[i]); + } else if (tracksMatchedToMC && (i != matchedElIndexToData)) { + fillControlHistosMCcomb<20>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("pidTPCMCPitrue/hpvsdedxElHipCut20"))->Fill(tmpMomentum[i], tmpDedx[i]); + registryMC.get(HIST("controlMCcomb/cut20/hsigma3Pi"))->Fill(nSigma3Pi[i]); + // registry1MC.get(HIST("controlMCcomb/cut20/hTofChi2El"))->Fill(chi2TOF[i]); + } + } // end of loop over 4 PV tracks + // end of electron found cut20 + } else { // no electron + if (verbose) { + LOGF(debug, " Candidate rejected: no electron PID among 4 tracks"); + } + return; + } // end of Nelectrons check + + // + // electron has TOF hit + // + if (flagEl[0] * trkHasTof[0] + + flagEl[1] * trkHasTof[1] + + flagEl[2] * trkHasTof[2] + + flagEl[3] * trkHasTof[3] > + 0) { // electron has tof hit cut 33 + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(59., 1.); // electron identified + TOF hit + if (tracksMatchedToMC) + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(60., 1.); // electron identified, tracks match to MC Particles + if (tracksMatchedToMC && flagEl[matchedElIndexToData] && + trkHasTof[matchedElIndexToData]) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(61., 1.); // El PID +TOF, tracks match to MC Particles, El is MC El true + + registryMC.get(HIST("controlMCtrue/cut33/h4piMass"))->Fill(mass4pi); + registryMC.get(HIST("controlMCtrue/cut33/h4trkPtTot"))->Fill(pttot); + registryMC.get(HIST("controlMCtrue/cut33/h4trkMassVsPt"))->Fill(mass4pi, pttot); + registryMC.get(HIST("controlMCtrue/cut33/hZNACenergy"))->Fill(energyZNA, energyZNC); + // registryMC.get(HIST("controlMCtrue/cut33/hNtofTrk"))->Fill(nTofTrk); + } + for (int i = 0; i < 4; i++) { + if (tracksMatchedToMC && flagEl[i] && + trkHasTof[i] && (i == matchedElIndexToData)) { // only for 1prong = electron true + registryMC.get(HIST("pidTPCMCEltrue/hpvsdedxElHipCut33"))->Fill(tmpMomentum[i], tmpDedx[i]); + fillControlHistosMCtrue<33>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("controlMCtrue/cut33/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + registryMC.get(HIST("controlMCtrue/cut33/hsigma3Pi"))->Fill(nSigma3Pi[i]); + registry1MC.get(HIST("pidTOFMCEltrue/hpvsNsigmaElHipCut33"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + } else if (tracksMatchedToMC && (i != matchedElIndexToData)) { + fillControlHistosMCcomb<33>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("pidTPCMCPitrue/hpvsdedxElHipCut33"))->Fill(tmpMomentum[i], tmpDedx[i]); + registryMC.get(HIST("controlMCcomb/cut33/hsigma3Pi"))->Fill(nSigma3Pi[i]); + } + } // end of loop over 4 PV tracks + } else { + if (verbose) { + LOGF(debug, " Candidate rejected: electron has no tof hit "); + } + return; + } // end of electron has tof hit cut 33 + + // + // electron survived pi veto, cut21 + // + if (flagEl[0] * trkHasTof[0] * flagPi[0] + + flagEl[1] * trkHasTof[1] * flagPi[1] + + flagEl[2] * trkHasTof[2] * flagPi[2] + + flagEl[3] * trkHasTof[3] * flagPi[3] > + 0) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(23., 1.); // electron identified + if (tracksMatchedToMC) + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(24., 1.); // electron identified, tracks match to MC Particles + if (tracksMatchedToMC && flagEl[matchedElIndexToData] && + trkHasTof[matchedElIndexToData] && flagPi[matchedElIndexToData]) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(25., 1.); // pion veto, tracks match to MC Particles, El is MC El true + + registryMC.get(HIST("controlMCtrue/cut21/h4piMass"))->Fill(mass4pi); + registryMC.get(HIST("controlMCtrue/cut21/h4trkPtTot"))->Fill(pttot); + registryMC.get(HIST("controlMCtrue/cut21/h4trkMassVsPt"))->Fill(mass4pi, pttot); + registryMC.get(HIST("controlMCtrue/cut21/hZNACenergy"))->Fill(energyZNA, energyZNC); + // registryMC.get(HIST("controlMCtrue/cut21/hNtofTrk"))->Fill(nTofTrk); + } + for (int i = 0; i < 4; i++) { + if (tracksMatchedToMC && flagEl[i] && trkHasTof[i] && flagPi[i] && (i == matchedElIndexToData)) { // only for 1prong = electron true + registryMC.get(HIST("pidTPCMCEltrue/hpvsdedxElHipCut21"))->Fill(tmpMomentum[i], tmpDedx[i]); + fillControlHistosMCtrue<21>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("controlMCtrue/cut21/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + registryMC.get(HIST("controlMCtrue/cut21/hsigma3Pi"))->Fill(nSigma3Pi[i]); + registry1MC.get(HIST("pidTOFMCEltrue/hpvsNsigmaElHipCut21"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + } else if (tracksMatchedToMC && (i != matchedElIndexToData)) { + fillControlHistosMCcomb<21>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("pidTPCMCPitrue/hpvsdedxElHipCut21"))->Fill(tmpMomentum[i], tmpDedx[i]); + registryMC.get(HIST("controlMCcomb/cut21/hsigma3Pi"))->Fill(nSigma3Pi[i]); + } + } // end of loop over 4 PV tracks + } else { + if (verbose) { + LOGF(debug, " Candidate rejected: all electrons vetoed by pi PID"); + } + return; + } // end of pi veto, cut21 + + // + // additional proton veto on electron, cut24 + // + if (flagEl[0] * trkHasTof[0] * flagPi[0] * flagPr[0] + + flagEl[1] * trkHasTof[1] * flagPi[1] * flagPr[1] + + flagEl[2] * trkHasTof[2] * flagPi[2] * flagPr[2] + + flagEl[3] * trkHasTof[3] * flagPi[3] * flagPr[3] > + 0) { // proton veto, cut24 + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(26., 1.); // electron identified + if (tracksMatchedToMC) + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(27., 1.); // electron identified, tracks match to MC Particles + if (tracksMatchedToMC && flagEl[matchedElIndexToData] && trkHasTof[matchedElIndexToData] && flagPi[matchedElIndexToData] && flagPr[matchedElIndexToData]) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(28., 1.); // proton veto, tracks match to MC Particles, El is MC El true + + registryMC.get(HIST("controlMCtrue/cut24/h4piMass"))->Fill(mass4pi); + registryMC.get(HIST("controlMCtrue/cut24/h4trkPtTot"))->Fill(pttot); + registryMC.get(HIST("controlMCtrue/cut24/h4trkMassVsPt"))->Fill(mass4pi, pttot); + registryMC.get(HIST("controlMCtrue/cut24/hZNACenergy"))->Fill(energyZNA, energyZNC); + // registryMC.get(HIST("controlMCtrue/cut24/hNtofTrk"))->Fill(nTofTrk); + } + for (int i = 0; i < 4; i++) { + if (tracksMatchedToMC && flagEl[i] && flagEl[i] && flagPi[i] && flagPr[i] && (i == matchedElIndexToData)) { // only for 1prong = electron true + registryMC.get(HIST("pidTPCMCEltrue/hpvsdedxElHipCut24"))->Fill(tmpMomentum[i], tmpDedx[i]); + fillControlHistosMCtrue<24>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("controlMCtrue/cut24/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + registryMC.get(HIST("controlMCtrue/cut24/hsigma3Pi"))->Fill(nSigma3Pi[i]); + registry1MC.get(HIST("pidTOFMCEltrue/hpvsNsigmaElHipCut24"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + } else if (tracksMatchedToMC && (i != matchedElIndexToData)) { + fillControlHistosMCcomb<24>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("pidTPCMCPitrue/hpvsdedxElHipCut24"))->Fill(tmpMomentum[i], tmpDedx[i]); + registryMC.get(HIST("controlMCcomb/cut24/hsigma3Pi"))->Fill(nSigma3Pi[i]); + } + } // end of loop over 4 PV tracks + } else { + if (verbose) { + LOGF(debug, " Candidate rejected: all electrons vetoed by proton PID"); + } + return; + } // end of proton veto, cut24 + + // + // additional kaon veto on electron, cut25 + // + if (flagEl[0] * trkHasTof[0] * flagPi[0] * flagPr[0] * flagKa[0] + + flagEl[1] * trkHasTof[1] * flagPi[1] * flagPr[1] * flagKa[1] + + flagEl[2] * trkHasTof[2] * flagPi[2] * flagPr[2] * flagKa[2] + + flagEl[3] * trkHasTof[3] * flagPi[3] * flagPr[3] * flagKa[3] > + 0) { // kaon veto, cut25 + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(29., 1.); // electron identified + if (tracksMatchedToMC) + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(30., 1.); // electron identified, tracks match to MC Particles + if (tracksMatchedToMC && flagEl[matchedElIndexToData] && + trkHasTof[matchedElIndexToData] && flagPi[matchedElIndexToData] && flagPr[matchedElIndexToData] && flagKa[matchedElIndexToData]) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(31., 1.); // kaon veto, tracks match to MC Particles, El is MC El true + + registryMC.get(HIST("controlMCtrue/cut25/h4piMass"))->Fill(mass4pi); + registryMC.get(HIST("controlMCtrue/cut25/h4trkPtTot"))->Fill(pttot); + registryMC.get(HIST("controlMCtrue/cut25/h4trkMassVsPt"))->Fill(mass4pi, pttot); + registryMC.get(HIST("controlMCtrue/cut25/hZNACenergy"))->Fill(energyZNA, energyZNC); + // registryMC.get(HIST("controlMCtrue/cut25/hNtofTrk"))->Fill(nTofTrk); + } + for (int i = 0; i < 4; i++) { + if (tracksMatchedToMC && flagEl[i] && trkHasTof[i] && flagPi[i] && flagPr[i] && flagKa[i] && (i == matchedElIndexToData)) { + registryMC.get(HIST("pidTPCMCEltrue/hpvsdedxElHipCut25"))->Fill(tmpMomentum[i], tmpDedx[i]); + fillControlHistosMCtrue<25>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("controlMCtrue/cut25/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + registryMC.get(HIST("controlMCtrue/cut25/hsigma3Pi"))->Fill(nSigma3Pi[i]); + registry1MC.get(HIST("pidTOFMCEltrue/hpvsNsigmaElHipCut25"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + } else if (tracksMatchedToMC && (i != matchedElIndexToData)) { + fillControlHistosMCcomb<25>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("pidTPCMCPitrue/hpvsdedxElHipCut25"))->Fill(tmpMomentum[i], tmpDedx[i]); + registryMC.get(HIST("controlMCcomb/cut25/hsigma3Pi"))->Fill(nSigma3Pi[i]); + } + } // end of loop over 4 PV tracks + } else { + if (verbose) { + LOGF(debug, " Candidate rejected: all electrons vetoed by K PID"); + } + return; + } // end of proton veto, cut25 + + // + // crossd rows in TPC + // + if (flagEl[0] * trkHasTof[0] * flagPi[0] * flagPr[0] * flagKa[0] * flagCR[0] + + flagEl[1] * trkHasTof[1] * flagPi[1] * flagPr[1] * flagKa[1] * flagCR[1] + + flagEl[2] * trkHasTof[2] * flagPi[2] * flagPr[2] * flagKa[2] * flagCR[2] + + flagEl[3] * trkHasTof[3] * flagPi[3] * flagPr[3] * flagKa[3] * flagCR[3] > + 0) { // Nc-rTPC cut, cut28 + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(32., 1.); // electron identified + if (tracksMatchedToMC) + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(33., 1.); // electron identified, tracks match to MC Particles + if (tracksMatchedToMC && trkHasTof[matchedElIndexToData] && + flagEl[matchedElIndexToData] && flagPi[matchedElIndexToData] && flagPr[matchedElIndexToData] && flagKa[matchedElIndexToData] && flagCR[matchedElIndexToData]) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(34., 1.); // CR, tracks match to MC Particles, El is MC El true + + registryMC.get(HIST("controlMCtrue/cut28/h4piMass"))->Fill(mass4pi); + registryMC.get(HIST("controlMCtrue/cut28/h4trkPtTot"))->Fill(pttot); + registryMC.get(HIST("controlMCtrue/cut28/h4trkMassVsPt"))->Fill(mass4pi, pttot); + registryMC.get(HIST("controlMCtrue/cut28/hZNACenergy"))->Fill(energyZNA, energyZNC); + // registryMC.get(HIST("controlMCtrue/cut28/hNtofTrk"))->Fill(nTofTrk); + } + for (int i = 0; i < 4; i++) { + if (tracksMatchedToMC && flagEl[i] && trkHasTof[i] && flagPi[i] && flagPr[i] && flagKa[i] && flagCR[i] && (i == matchedElIndexToData)) { + registryMC.get(HIST("pidTPCMCEltrue/hpvsdedxElHipCut28"))->Fill(tmpMomentum[i], tmpDedx[i]); + fillControlHistosMCtrue<28>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("controlMCtrue/cut28/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + registryMC.get(HIST("controlMCtrue/cut28/hsigma3Pi"))->Fill(nSigma3Pi[i]); + registry1MC.get(HIST("pidTOFMCEltrue/hpvsNsigmaElHipCut28"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + } else if (tracksMatchedToMC && (i != matchedElIndexToData)) { + fillControlHistosMCcomb<28>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("pidTPCMCPitrue/hpvsdedxElHipCut28"))->Fill(tmpMomentum[i], tmpDedx[i]); + registryMC.get(HIST("controlMCcomb/cut28/hsigma3Pi"))->Fill(nSigma3Pi[i]); + } + } // end of loop over 4 PV tracks + } else { + if (verbose) { + LOGF(debug, " Candidate rejected: all electrons vetoed by CR in TPC"); + } + return; + } // end of TPC crossed rows for electron cut, cut28 + + // + // virtual calorimeter for electron + // + if (flagEl[0] * trkHasTof[0] * flagPi[0] * flagPr[0] * flagKa[0] * flagCR[0] * !flagVcalPV[0] + + flagEl[1] * trkHasTof[1] * flagPi[1] * flagPr[1] * flagKa[1] * flagCR[1] * !flagVcalPV[1] + + flagEl[2] * trkHasTof[2] * flagPi[2] * flagPr[2] * flagKa[2] * flagCR[2] * !flagVcalPV[2] + + flagEl[3] * trkHasTof[3] * flagPi[3] * flagPr[3] * flagKa[3] * flagCR[3] * !flagVcalPV[3] > + 0) { // vcal veto on electron, cut22 + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(35., 1.); // electron identified + if (tracksMatchedToMC) + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(36., 1.); // electron identified, tracks match to MC Particles + if (tracksMatchedToMC && flagEl[matchedElIndexToData] && trkHasTof[matchedElIndexToData] && flagPi[matchedElIndexToData] && + flagPr[matchedElIndexToData] && flagKa[matchedElIndexToData] && flagCR[matchedElIndexToData] && + !flagVcalPV[matchedElIndexToData]) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(37., 1.); // kaon veto, tracks match to MC Particles, El is MC El true + + registryMC.get(HIST("controlMCtrue/cut22/h4piMass"))->Fill(mass4pi); + registryMC.get(HIST("controlMCtrue/cut22/h4trkPtTot"))->Fill(pttot); + registryMC.get(HIST("controlMCtrue/cut22/h4trkMassVsPt"))->Fill(mass4pi, pttot); + registryMC.get(HIST("controlMCtrue/cut22/hZNACenergy"))->Fill(energyZNA, energyZNC); + // registryMC.get(HIST("controlMCtrue/cut22/hNtofTrk"))->Fill(nTofTrk); + } + for (int i = 0; i < 4; i++) { + if (tracksMatchedToMC && flagEl[i] && trkHasTof[i] && flagPi[i] && flagPr[i] && flagKa[i] && flagCR[i] && !flagVcalPV[i] && (i == matchedElIndexToData)) { + registryMC.get(HIST("pidTPCMCEltrue/hpvsdedxElHipCut22"))->Fill(tmpMomentum[i], tmpDedx[i]); + fillControlHistosMCtrue<22>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("controlMCtrue/cut22/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + registryMC.get(HIST("controlMCtrue/cut22/hsigma3Pi"))->Fill(nSigma3Pi[i]); + registry1MC.get(HIST("pidTOFMCEltrue/hpvsNsigmaElHipCut22"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + } else if (tracksMatchedToMC && (i != matchedElIndexToData)) { + fillControlHistosMCcomb<22>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("pidTPCMCPitrue/hpvsdedxElHipCut22"))->Fill(tmpMomentum[i], tmpDedx[i]); + registryMC.get(HIST("controlMCcomb/cut22/hsigma3Pi"))->Fill(nSigma3Pi[i]); + } + } // end of loop over 4 PV tracks + } else { + if (verbose) { + LOGF(debug, " Candidate rejected: all electrons vetoed by Vcal"); + } + return; + } // end of vcal cut on electron, cut22 + + // + // nsigma 3pi cut, cut29 + // + if (flagEl[0] * trkHasTof[0] * flagPi[0] * flagPr[0] * flagKa[0] * flagCR[0] * !flagVcalPV[0] * flagS3pi[0] + + flagEl[1] * trkHasTof[1] * flagPi[1] * flagPr[1] * flagKa[1] * flagCR[1] * !flagVcalPV[1] * flagS3pi[1] + + flagEl[2] * trkHasTof[2] * flagPi[2] * flagPr[2] * flagKa[2] * flagCR[2] * !flagVcalPV[2] * flagS3pi[2] + + flagEl[3] * trkHasTof[3] * flagPi[3] * flagPr[3] * flagKa[3] * flagCR[3] * !flagVcalPV[3] * flagS3pi[3] > + 0) { // nsigma 3pi cut, cut29 + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(41., 1.); // electron identified + if (tracksMatchedToMC) + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(42., 1.); // electron identified, tracks match to MC Particles + if (tracksMatchedToMC && flagEl[matchedElIndexToData] && trkHasTof[matchedElIndexToData] && flagPi[matchedElIndexToData] && + flagPr[matchedElIndexToData] && flagKa[matchedElIndexToData] && flagCR[matchedElIndexToData] && + !flagVcalPV[matchedElIndexToData] && flagS3pi[matchedElIndexToData]) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(43., 1.); // kaon veto, tracks match to MC Particles, El is MC El true + + registryMC.get(HIST("controlMCtrue/cut29/h4piMass"))->Fill(mass4pi); + registryMC.get(HIST("controlMCtrue/cut29/h4trkPtTot"))->Fill(pttot); + registryMC.get(HIST("controlMCtrue/cut29/h4trkMassVsPt"))->Fill(mass4pi, pttot); + registryMC.get(HIST("controlMCtrue/cut29/hZNACenergy"))->Fill(energyZNA, energyZNC); + // registryMC.get(HIST("controlMCtrue/cut29/hNtofTrk"))->Fill(nTofTrk); + } + for (int i = 0; i < 4; i++) { + if (tracksMatchedToMC && flagEl[i] && trkHasTof[i] && flagPi[i] && flagPr[i] && flagKa[i] && flagCR[i] && !flagVcalPV[i] && flagS3pi[i] && (i == matchedElIndexToData)) { + registryMC.get(HIST("pidTPCMCEltrue/hpvsdedxElHipCut29"))->Fill(tmpMomentum[i], tmpDedx[i]); + fillControlHistosMCtrue<29>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("controlMCtrue/cut29/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + registryMC.get(HIST("controlMCtrue/cut29/hsigma3Pi"))->Fill(nSigma3Pi[i]); + registry1MC.get(HIST("pidTOFMCEltrue/hpvsNsigmaElHipCut29"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + } else if (tracksMatchedToMC && (i != matchedElIndexToData)) { + fillControlHistosMCcomb<29>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("pidTPCMCPitrue/hpvsdedxElHipCut29"))->Fill(tmpMomentum[i], tmpDedx[i]); + registryMC.get(HIST("controlMCcomb/cut29/hsigma3Pi"))->Fill(nSigma3Pi[i]); + } + } // end of loop over 4 PV tracks + } else { + if (verbose) { + LOGF(debug, " Candidate rejected: all electrons vetoed by 3piSigma"); + } + return; + } // end of sigma 3pi cut, cut29 + + // + // invariant mass of 3 pi <1.8 + // + if (flagEl[0] * trkHasTof[0] * flagPi[0] * flagPr[0] * flagKa[0] * flagCR[0] * !flagVcalPV[0] * flagS3pi[0] * flagIM[0] + + flagEl[1] * trkHasTof[1] * flagPi[1] * flagPr[1] * flagKa[1] * flagCR[1] * !flagVcalPV[1] * flagS3pi[1] * flagIM[1] + + flagEl[2] * trkHasTof[2] * flagPi[2] * flagPr[2] * flagKa[2] * flagCR[2] * !flagVcalPV[2] * flagS3pi[2] * flagIM[2] + + flagEl[3] * trkHasTof[3] * flagPi[3] * flagPr[3] * flagKa[3] * flagCR[3] * !flagVcalPV[3] * flagS3pi[3] * flagIM[3] > + 0) { // IM 3pi cut, cut26 + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(44., 1.); // electron identified + if (tracksMatchedToMC) + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(45., 1.); // electron identified, tracks match to MC Particles + if (tracksMatchedToMC && flagEl[matchedElIndexToData] && trkHasTof[matchedElIndexToData] && flagPi[matchedElIndexToData] && + flagPr[matchedElIndexToData] && flagKa[matchedElIndexToData] && flagCR[matchedElIndexToData] && + !flagVcalPV[matchedElIndexToData] && flagS3pi[matchedElIndexToData] && + flagIM[matchedElIndexToData]) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(46., 1.); // IM 3pi, tracks match to MC Particles, El is MC El true + + registryMC.get(HIST("controlMCtrue/cut26/h4piMass"))->Fill(mass4pi); + registryMC.get(HIST("controlMCtrue/cut26/h4trkPtTot"))->Fill(pttot); + registryMC.get(HIST("controlMCtrue/cut26/h4trkMassVsPt"))->Fill(mass4pi, pttot); + registryMC.get(HIST("controlMCtrue/cut26/hZNACenergy"))->Fill(energyZNA, energyZNC); + // registryMC.get(HIST("controlMCtrue/cut26/hNtofTrk"))->Fill(nTofTrk); + } + for (int i = 0; i < 4; i++) { + if (tracksMatchedToMC && flagEl[i] && trkHasTof[i] && flagPi[i] && flagPr[i] && flagKa[i] && flagCR[i] && !flagVcalPV[i] && flagS3pi[i] && flagIM[i] && (i == matchedElIndexToData)) { + registryMC.get(HIST("pidTPCMCEltrue/hpvsdedxElHipCut26"))->Fill(tmpMomentum[i], tmpDedx[i]); + fillControlHistosMCtrue<26>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("controlMCtrue/cut26/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + registryMC.get(HIST("controlMCtrue/cut26/hsigma3Pi"))->Fill(nSigma3Pi[i]); + registry1MC.get(HIST("pidTOFMCEltrue/hpvsNsigmaElHipCut26"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + } else if (tracksMatchedToMC && (i != matchedElIndexToData)) { + fillControlHistosMCcomb<26>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("pidTPCMCPitrue/hpvsdedxElHipCut26"))->Fill(tmpMomentum[i], tmpDedx[i]); + registryMC.get(HIST("controlMCcomb/cut26/hsigma3Pi"))->Fill(nSigma3Pi[i]); + } + } // end of loop over 4 PV tracks + } else { + if (verbose) { + LOGF(debug, " Candidate rejected: all electrons vetoed by IM"); + } + return; + } // end of IM 3pi cut, cut26 + + // + // at least one pion with tof hit (cut34) + // + int otherTOFtracks = 0; + for (int j = 0; j < 4; j++) { + if (j == matchedElIndexToData) + continue; + otherTOFtracks += trkHasTof[j]; } - } // end of loop over 4 tracks - registry.get(HIST("control/cut1/h4trkPtTot"))->Fill(pttot); - registry.get(HIST("control/cut1/h4piMass"))->Fill(mass4pi); - registry.get(HIST("control/cut1/h4trkMassVsPt"))->Fill(mass4pi, pttot); - registry.get(HIST("control/cut1/hNtofTrk"))->Fill(nTofTrk); - registry.get(HIST("control/cut1/hZNACenergy"))->Fill(ZNAenergy, ZNCenergy); - // special case invmass 4pi (2,2.3) - // if (mass4pi<2.3 && mass4pi>2) { - // for (int i = 0; i < 4; i++) { - // registry.get(HIST("control/cut1/cut1a/hDcaZ"))->Fill(dcaZ[i]); - // registry.get(HIST("control/cut1/cut1a/hDcaXY"))->Fill(dcaXY[i]); - // registry.get(HIST("control/cut1/cut1a/hChi2TPC"))->Fill(chi2TPC[i]); - // registry.get(HIST("control/cut1/cut1a/hChi2ITS"))->Fill(chi2ITS[i]); - // - // if (flagTotal[i]) { - // registry.get(HIST("control/cut1/cut1a/h3piMassComb"))->Fill(pi3invMass[i]); - // registry.get(HIST("control/cut1/cut1a/h3trkPtTot"))->Fill(pi3pt[i]); - // registry.get(HIST("control/cut1/cut1a/hDeltaPhi13topo"))->Fill(pi3deltaPhi[i]); - // registry.get(HIST("control/cut1/cut1a/h13AssymPt1ProngAver"))->Fill(pi3assymav[i]); - // registry.get(HIST("control/cut1/cut1a/h13Vector"))->Fill(pi3vector[i]); - // registry.get(HIST("control/cut1/cut1a/h13Scalar"))->Fill(pi3scalar[i]); - // registry.get(HIST("control/cut1/cut1a/h13EtaSum"))->Fill(pi3etasum[i]); - // registry.get(HIST("control/cut1/cut1a/hTPCnCrossedRows"))->Fill(nclTPCcrossedRows[i]); - // - // registry.get(HIST("control/cut1/cut1a/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); - // registry.get(HIST("control/cut1/cut1a/hTPCnclsFindable"))->Fill(nclTPCfind[i]); - // registry.get(HIST("control/cut1/cut1a/hsigma3Pi"))->Fill(nSigma3Pi[i]); - // } - // } - // registry.get(HIST("control/cut1/cut1a/h4trkPtTot"))->Fill(pttot); - // registry.get(HIST("control/cut1/cut1a/h4piMass"))->Fill(mass4pi); - // registry.get(HIST("control/cut1/cut1a/h4trkMassVsPt"))->Fill(mass4pi, pttot); - // registry.get(HIST("control/cut1/cut1a/hNtofTrk"))->Fill(nTofTrk); - // } // end of mass window for 4pi case - } else { // more than 1 electron candidate - if (verbose) { - LOGF(debug, " Candidate rejected: more than one electron candidate"); - } - } // end of 1electrons check - } // end of process - // check ntracks-4PVtracks - // check pt of remaining (ntracks-4PVtracks) tracks + if (otherTOFtracks >= 1) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(62., 1.); // electron identified + if (tracksMatchedToMC) + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(63., 1.); // electron identified, tracks match to MC Particles + if (tracksMatchedToMC && flagEl[matchedElIndexToData] && trkHasTof[matchedElIndexToData] && flagPi[matchedElIndexToData] && + flagPr[matchedElIndexToData] && flagKa[matchedElIndexToData] && flagCR[matchedElIndexToData] && + !flagVcalPV[matchedElIndexToData] && flagS3pi[matchedElIndexToData] && + flagIM[matchedElIndexToData] && trkHasTof[matchedElIndexToData]) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(64., 1.); // 1tof hit in 3pi, tracks match to MC Particles, El is MC El true + + registryMC.get(HIST("controlMCtrue/cut34/h4piMass"))->Fill(mass4pi); + registryMC.get(HIST("controlMCtrue/cut34/h4trkPtTot"))->Fill(pttot); + registryMC.get(HIST("controlMCtrue/cut34/h4trkMassVsPt"))->Fill(mass4pi, pttot); + registryMC.get(HIST("controlMCtrue/cut34/hZNACenergy"))->Fill(energyZNA, energyZNC); + registry1MC.get(HIST("globalMCrec/hRecFlag"))->Fill(5 + collision.flags()); // reconstruction with upc settings flag + // registryMC.get(HIST("controlMCtrue/cut34/hNtofTrk"))->Fill(nTofTrk); + } + for (int i = 0; i < 4; i++) { + if (tracksMatchedToMC && flagEl[i] && trkHasTof[i] && flagPi[i] && flagPr[i] && flagKa[i] && flagCR[i] && !flagVcalPV[i] && flagS3pi[i] && flagIM[i] && (i == matchedElIndexToData)) { + registryMC.get(HIST("pidTPCMCEltrue/hpvsdedxElHipCut34"))->Fill(tmpMomentum[i], tmpDedx[i]); + fillControlHistosMCtrue<34>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("controlMCtrue/cut34/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + registryMC.get(HIST("controlMCtrue/cut34/hsigma3Pi"))->Fill(nSigma3Pi[i]); + registry1MC.get(HIST("pidTOFMCEltrue/hpvsNsigmaElHipCut34"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + } else if (tracksMatchedToMC && (i != matchedElIndexToData)) { + fillControlHistosMCcomb<34>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("pidTPCMCPitrue/hpvsdedxElHipCut34"))->Fill(tmpMomentum[i], tmpDedx[i]); + registryMC.get(HIST("controlMCcomb/cut34/hsigma3Pi"))->Fill(nSigma3Pi[i]); + } + } // end of loop over 4 PV tracks + } else { + if (verbose) { + LOGF(debug, " Candidate rejected: none of 3pi has no tof hit "); + } + return; + } // end of at least one tof hit in 3pi, cut34 + + // + // skip events with pttot<0.15 + // + if (pttot >= ptTotcut) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(47., 1.); // electron identified + if (tracksMatchedToMC) + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(48., 1.); // electron identified, tracks match to MC Particles + if (tracksMatchedToMC && flagEl[matchedElIndexToData] && trkHasTof[matchedElIndexToData] && flagPi[matchedElIndexToData] && + flagPr[matchedElIndexToData] && flagKa[matchedElIndexToData] && flagCR[matchedElIndexToData] && + !flagVcalPV[matchedElIndexToData] && flagS3pi[matchedElIndexToData] && + flagIM[matchedElIndexToData]) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(49., 1.); // IM 3pi, tracks match to MC Particles, El is MC El true + + registryMC.get(HIST("controlMCtrue/cut30/h4piMass"))->Fill(mass4pi); + registryMC.get(HIST("controlMCtrue/cut30/h4trkPtTot"))->Fill(pttot); + registryMC.get(HIST("controlMCtrue/cut30/h4trkMassVsPt"))->Fill(mass4pi, pttot); + registryMC.get(HIST("controlMCtrue/cut30/hZNACenergy"))->Fill(energyZNA, energyZNC); + // registryMC.get(HIST("controlMCtrue/cut30/hNtofTrk"))->Fill(nTofTrk); + } + for (int i = 0; i < 4; i++) { + if (tracksMatchedToMC && flagEl[i] && trkHasTof[i] && flagPi[i] && flagPr[i] && flagKa[i] && flagCR[i] && !flagVcalPV[i] && flagS3pi[i] && flagIM[i] && (i == matchedElIndexToData)) { + registryMC.get(HIST("pidTPCMCEltrue/hpvsdedxElHipCut30"))->Fill(tmpMomentum[i], tmpDedx[i]); + fillControlHistosMCtrue<30>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("controlMCtrue/cut30/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + registryMC.get(HIST("controlMCtrue/cut30/hsigma3Pi"))->Fill(nSigma3Pi[i]); + registry1MC.get(HIST("pidTOFMCEltrue/hpvsNsigmaElHipCut30"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + } else if (tracksMatchedToMC && (i != matchedElIndexToData)) { + fillControlHistosMCcomb<30>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("pidTPCMCPitrue/hpvsdedxElHipCut30"))->Fill(tmpMomentum[i], tmpDedx[i]); + registryMC.get(HIST("controlMCcomb/cut30/hsigma3Pi"))->Fill(nSigma3Pi[i]); + } + } // end of loop over 4 PV tracks + } else { + if (verbose) { + LOGF(info, " Candidate rejected: pt tot is %f", pttot); + } + return; + } // end of pttot cut, cut30 + + // + // delta phi cut, cut27 + // + if (flagEl[0] * trkHasTof[0] * flagPi[0] * flagPr[0] * flagKa[0] * flagCR[0] * !flagVcalPV[0] * flagS3pi[0] * flagIM[0] * flagDP[0] + + flagEl[1] * trkHasTof[1] * flagPi[1] * flagPr[1] * flagKa[1] * flagCR[1] * !flagVcalPV[1] * flagS3pi[1] * flagIM[1] * flagDP[1] + + flagEl[2] * trkHasTof[2] * flagPi[2] * flagPr[2] * flagKa[2] * flagCR[2] * !flagVcalPV[2] * flagS3pi[2] * flagIM[2] * flagDP[2] + + flagEl[3] * trkHasTof[3] * flagPi[3] * flagPr[3] * flagKa[3] * flagCR[3] * !flagVcalPV[3] * flagS3pi[3] * flagIM[3] * flagDP[3] > + 0) { // delta phi cut, cut27 + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(50., 1.); // electron identified + if (tracksMatchedToMC) + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(51., 1.); // electron identified, tracks match to MC Particles + if (tracksMatchedToMC && flagEl[matchedElIndexToData] && trkHasTof[matchedElIndexToData] && flagPi[matchedElIndexToData] && + flagPr[matchedElIndexToData] && flagKa[matchedElIndexToData] && flagCR[matchedElIndexToData] && + !flagVcalPV[matchedElIndexToData] && flagS3pi[matchedElIndexToData] && + flagIM[matchedElIndexToData] && flagDP[matchedElIndexToData]) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(52., 1.); // IM 3pi, tracks match to MC Particles, El is MC El true + + registryMC.get(HIST("controlMCtrue/cut27/h4piMass"))->Fill(mass4pi); + registryMC.get(HIST("controlMCtrue/cut27/h4trkPtTot"))->Fill(pttot); + registryMC.get(HIST("controlMCtrue/cut27/h4trkMassVsPt"))->Fill(mass4pi, pttot); + registryMC.get(HIST("controlMCtrue/cut27/hZNACenergy"))->Fill(energyZNA, energyZNC); + // registryMC.get(HIST("controlMCtrue/cut27/hNtofTrk"))->Fill(nTofTrk); + } + for (int i = 0; i < 4; i++) { + if (tracksMatchedToMC && flagEl[i] && trkHasTof[i] && flagPi[i] && flagPr[i] && flagKa[i] && flagCR[i] && !flagVcalPV[i] && flagS3pi[i] && flagIM[i] && flagDP[i] && (i == matchedElIndexToData)) { + registryMC.get(HIST("pidTPCMCEltrue/hpvsdedxElHipCut27"))->Fill(tmpMomentum[i], tmpDedx[i]); + fillControlHistosMCtrue<27>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("controlMCtrue/cut27/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + registryMC.get(HIST("controlMCtrue/cut27/hsigma3Pi"))->Fill(nSigma3Pi[i]); + registry1MC.get(HIST("pidTOFMCEltrue/hpvsNsigmaElHipCut27"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + } else if (tracksMatchedToMC && (i != matchedElIndexToData)) { + fillControlHistosMCcomb<27>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("pidTPCMCPitrue/hpvsdedxElHipCut27"))->Fill(tmpMomentum[i], tmpDedx[i]); + registryMC.get(HIST("controlMCcomb/cut27/hsigma3Pi"))->Fill(nSigma3Pi[i]); + } + } // end of loop over 4 PV tracks + } else { + if (verbose) { + LOGF(debug, " Candidate rejected: all electrons vetoed by piPID+Vcal+pT+prPID+KaPID+IM"); + } + return; + } // end of dphi 3pi-e cut, cut27 + + // + // ZDC cut Energy < 1 TeV on both sides + // + if (energyZNA < 1. && energyZNC < 1.) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(65., 1.); // electron identified + if (tracksMatchedToMC) + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(66., 1.); // electron identified, tracks match to MC Particles + if (tracksMatchedToMC && flagEl[matchedElIndexToData] && flagPi[matchedElIndexToData] && + flagPr[matchedElIndexToData] && flagKa[matchedElIndexToData] && flagCR[matchedElIndexToData] && + !flagVcalPV[matchedElIndexToData] && flagS3pi[matchedElIndexToData] && + flagIM[matchedElIndexToData] && flagDP[matchedElIndexToData] && trkHasTof[matchedElIndexToData]) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(67., 1.); // zdc cut, tracks match to MC Particles, El is MC El true + + registryMC.get(HIST("controlMCtrue/cut35/h4piMass"))->Fill(mass4pi); + registryMC.get(HIST("controlMCtrue/cut35/h4trkPtTot"))->Fill(pttot); + registryMC.get(HIST("controlMCtrue/cut35/h4trkMassVsPt"))->Fill(mass4pi, pttot); + registryMC.get(HIST("controlMCtrue/cut35/hZNACenergy"))->Fill(energyZNA, energyZNC); + // registryMC.get(HIST("controlMCtrue/cut35/hNtofTrk"))->Fill(nTofTrk); + } + for (int i = 0; i < 4; i++) { + if (tracksMatchedToMC && flagEl[i] && flagPi[i] && flagPr[i] && flagKa[i] && flagCR[i] && !flagVcalPV[i] && flagS3pi[i] && flagIM[i] && flagDP[i] && trkHasTof[i] && (i == matchedElIndexToData)) { + registryMC.get(HIST("pidTPCMCEltrue/hpvsdedxElHipCut35"))->Fill(tmpMomentum[i], tmpDedx[i]); + fillControlHistosMCtrue<35>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("controlMCtrue/cut35/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + registryMC.get(HIST("controlMCtrue/cut35/hsigma3Pi"))->Fill(nSigma3Pi[i]); + registry1MC.get(HIST("pidTOFMCEltrue/hpvsNsigmaElHipCut35"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + } else if (tracksMatchedToMC && (i != matchedElIndexToData)) { + fillControlHistosMCcomb<35>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("pidTPCMCPitrue/hpvsdedxElHipCut35"))->Fill(tmpMomentum[i], tmpDedx[i]); + registryMC.get(HIST("controlMCcomb/cut35/hsigma3Pi"))->Fill(nSigma3Pi[i]); + } + } // end of loop over 4 PV tracks + } else { + if (verbose) { + LOGF(debug, " Candidate rejected: zdc cut "); + } + return; + } // end of zdc, cut35 + + } // end of loop over collisions + } // end of electron + 3pi + + } // end of processEfficiencyMCSG + + PROCESS_SWITCH(TauTau13topo, processDataSG, "Run over SG Producer tables in reco level (reconstructed data or MC)", true); + PROCESS_SWITCH(TauTau13topo, processSimpleMCSG, "Run over SG Producer tables in true level (MC true only)", false); + PROCESS_SWITCH(TauTau13topo, processEfficiencyMCSG, "Run over SG Producer tables in true and reco level (MC true and reconstructed)", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From b37ae42f3ea7ee6cc9475d83586179e56bb2405a Mon Sep 17 00:00:00 2001 From: Giovanni Malfattore <89481844+giovannimalfattore@users.noreply.github.com> Date: Thu, 6 Mar 2025 13:41:33 +0100 Subject: [PATCH 0574/1650] [PWGLF] NucleiTask - DCA plots optimization (#10356) please fix linter with the next PRs --- PWGLF/Tasks/Nuspex/LFNucleiBATask.cxx | 558 ++++++++++++++------------ 1 file changed, 311 insertions(+), 247 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/LFNucleiBATask.cxx b/PWGLF/Tasks/Nuspex/LFNucleiBATask.cxx index 3e235378b5d..22f1e5dcea2 100644 --- a/PWGLF/Tasks/Nuspex/LFNucleiBATask.cxx +++ b/PWGLF/Tasks/Nuspex/LFNucleiBATask.cxx @@ -91,11 +91,16 @@ struct LFNucleiBATask { Configurable cfgLowCutVertex{"cfgLowCutVertex", -10.0f, "Accepted z-vertex lower limit"}; // Set the quality cuts for tracks - Configurable rejectFakeTracks{"rejectFakeTracks", false, "Flag to reject ITS-TPC fake tracks (for MC)"}; - Configurable cfgCutITSClusters{"cfgCutITSClusters", -1.f, "Minimum number of ITS clusters"}; - Configurable cfgCutTPCXRows{"cfgCutTPCXRows", -1.f, "Minimum number of crossed TPC rows"}; - Configurable cfgCutTPCClusters{"cfgCutTPCClusters", -1.f, "Minimum number of found TPC clusters"}; - Configurable nITSLayer{"nITSLayer", 0, "ITS Layer (0-6)"}; + struct : ConfigurableGroup { + Configurable rejectFakeTracks{"rejectFakeTracks", false, "Flag to reject ITS-TPC fake tracks (for MC)"}; + Configurable cfgCutITSClusters{"cfgCutITSClusters", -1.f, "Minimum number of ITS clusters"}; + Configurable cfgCutTPCXRows{"cfgCutTPCXRows", -1.f, "Minimum number of crossed TPC rows"}; + Configurable cfgCutTPCClusters{"cfgCutTPCClusters", -1.f, "Minimum number of found TPC clusters"}; + Configurable cfgCutTPCCROFnd{"cfgCutTPCCROFnd", 0.8, "Minimum ratio of crossed TPC clusters over findable"}; + Configurable> tpcChi2NclCuts{"tpcChi2NclCuts", {0.5, 4}, "Range of accepted of Chi2/TPC clusters"}; + Configurable> itsChi2NclCuts{"itsChi2NclCuts", {0.f, 36}, "Range of accepted of Chi2/ITS clusters"}; + Configurable nITSLayer{"nITSLayer", 0, "ITS Layer (0-6)"}; + } trkqcOptions; // Set the kinematic and PID cuts for tracks struct : ConfigurableGroup { @@ -116,8 +121,6 @@ struct LFNucleiBATask { } nsigmaTPCvar; struct : ConfigurableGroup { - // Configurable useITSTrCut{"useITSTrCut", false, "Select Helium if NOT compatible with triton hypothesis (via SigmaITS)"}; - // Configurable nsigmaITSTr{"nsigmaITSTr", 3.f, "Value of the Nsigma ITS cut for tritons ( > nSigmaITSTr)"}; Configurable useITSHeCut{"useITSHeCut", false, "Select Helium if compatible with helium hypothesis (via SigmaITS)"}; Configurable nsigmaITSHe{"nsigmaITSHe", -1.f, "Value of the Nsigma ITS cut for helium-3 ( > nSigmaITSHe)"}; Configurable showAverageClusterSize{"showAverageClusterSize", false, "Show average cluster size"}; @@ -165,6 +168,8 @@ struct LFNucleiBATask { struct : ConfigurableGroup { Configurable makeDCABeforeCutPlots{"makeDCABeforeCutPlots", false, "Flag to enable plots of DCA before cuts"}; Configurable makeDCAAfterCutPlots{"makeDCAAfterCutPlots", false, "Flag to enable plots of DCA after cuts"}; + Configurable makeFakeTracksPlots{"makeFakeTracksPlots", false, "Flag to enable plots of misidentified particles"}; + Configurable makeWrongEventPlots{"makeWrongEventPlots", false, "Flag to enable plots of particles from wrong event"}; Configurable doTOFplots{"doTOFplots", true, "Flag to export plots of tracks with 1 hit on TOF."}; Configurable enableExpSignalTPC{"enableExpSignalTPC", true, "Flag to export dEdX - dEdX(exp) plots."}; Configurable enableExpSignalTOF{"enableExpSignalTOF", false, "Flag to export T - T(exp) plots."}; @@ -847,12 +852,14 @@ struct LFNucleiBATask { histos.add("tracks/proton/dca/before/hDCAxyVsPtProtonTruePrim", "DCAxy vs Pt (p); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/proton/dca/before/hDCAxyVsPtProtonTrueSec", "DCAxy vs Pt (p); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/proton/dca/before/hDCAxyVsPtProtonTrueMaterial", "DCAxy vs Pt (p); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/proton/dca/before/hDCAxyVsPtProtonTrueTransport", "DCAxy vs Pt (p); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/proton/dca/before/hDCAxyVsPtantiProtonTrue", "DCAxy vs Pt (#bar{p}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/proton/dca/before/hDCAxyVsPtantiProtonTruePrim", "DCAxy vs Pt (#bar{p}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/proton/dca/before/hDCAxyVsPtantiProtonTrueSec", "DCAxy vs Pt (#bar{p}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/proton/dca/before/hDCAxyVsPtantiProtonTrueMaterial", "DCAxy vs Pt (#bar{p}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/proton/dca/before/hDCAxyVsPtantiProtonTrueTransport", "DCAxy vs Pt (#bar{p}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); if (outFlagOptions.doTOFplots) { @@ -860,24 +867,28 @@ struct LFNucleiBATask { histos.add("tracks/proton/dca/before/TOF/hDCAxyVsPtProtonTruePrim", "DCAxy vs Pt (p); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/proton/dca/before/TOF/hDCAxyVsPtProtonTrueSec", "DCAxy vs Pt (p); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/proton/dca/before/TOF/hDCAxyVsPtProtonTrueMaterial", "DCAxy vs Pt (p); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/proton/dca/before/TOF/hDCAxyVsPtProtonTrueTransport", "DCAxy vs Pt (p); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/proton/dca/before/TOF/hDCAxyVsPtantiProtonTrue", "DCAxy vs Pt (#bar{p}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/proton/dca/before/TOF/hDCAxyVsPtantiProtonTruePrim", "DCAxy vs Pt (#bar{p}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/proton/dca/before/TOF/hDCAxyVsPtantiProtonTrueSec", "DCAxy vs Pt (#bar{p}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/proton/dca/before/TOF/hDCAxyVsPtantiProtonTrueMaterial", "DCAxy vs Pt (#bar{p}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/proton/dca/before/TOF/hDCAxyVsPtantiProtonTrueTransport", "DCAxy vs Pt (#bar{p}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/proton/dca/before/TOF/hDCAzVsPtProtonTrue", "DCAz vs Pt (p); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/proton/dca/before/TOF/hDCAzVsPtProtonTruePrim", "DCAz vs Pt (p); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/proton/dca/before/TOF/hDCAzVsPtProtonTrueSec", "DCAz vs Pt (p); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/proton/dca/before/TOF/hDCAzVsPtProtonTrueMaterial", "DCAz vs Pt (p); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/proton/dca/before/TOF/hDCAzVsPtProtonTrueTransport", "DCAz vs Pt (p); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/proton/dca/before/TOF/hDCAzVsPtantiProtonTrue", "DCAz vs Pt (#bar{p}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/proton/dca/before/TOF/hDCAzVsPtantiProtonTruePrim", "DCAz vs Pt (#bar{p}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/proton/dca/before/TOF/hDCAzVsPtantiProtonTrueSec", "DCAz vs Pt (#bar{p}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/proton/dca/before/TOF/hDCAzVsPtantiProtonTrueMaterial", "DCAz vs Pt (#bar{p}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/proton/dca/before/TOF/hDCAzVsPtantiProtonTrueTransport", "DCAz vs Pt (#bar{p}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); } } @@ -902,111 +913,85 @@ struct LFNucleiBATask { histos.add("tracks/deuteron/dca/before/hDCAxyVsPtDeuteronTruePrim", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/deuteron/dca/before/hDCAxyVsPtDeuteronTrueSec", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/deuteron/dca/before/hDCAxyVsPtDeuteronTrueMaterial", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/deuteron/dca/before/hDCAxyVsPtDeuteronTrueTransport", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/deuteron/dca/before/hDCAxyVsPtantiDeuteronTrue", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/deuteron/dca/before/hDCAxyVsPtantiDeuteronTruePrim", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/deuteron/dca/before/hDCAxyVsPtantiDeuteronTrueSec", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/deuteron/dca/before/hDCAxyVsPtantiDeuteronTrueMaterial", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/deuteron/dca/before/hDCAxyVsPtantiDeuteronTrueTransport", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); // Fake & wrong histos - histos.add("tracks/deuteron/dca/before/fake/hDCAxyVsPtDeuteronTrue", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - - histos.add("tracks/deuteron/dca/before/fake/hDCAxyVsPtDeuteronTruePrim", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - histos.add("tracks/deuteron/dca/before/fake/hDCAxyVsPtDeuteronTrueSec", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - histos.add("tracks/deuteron/dca/before/fake/hDCAxyVsPtDeuteronTrueTransport", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - - histos.add("tracks/deuteron/dca/before/fake/hDCAxyVsPtantiDeuteronTrue", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - - histos.add("tracks/deuteron/dca/before/fake/hDCAxyVsPtantiDeuteronTruePrim", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - histos.add("tracks/deuteron/dca/before/fake/hDCAxyVsPtantiDeuteronTrueSec", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - histos.add("tracks/deuteron/dca/before/fake/hDCAxyVsPtantiDeuteronTrueTransport", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + if (outFlagOptions.makeFakeTracksPlots) { + histos.add("tracks/deuteron/dca/before/fake/hDCAxyVsPtDeuteronTrue", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - // histos.add("tracks/deuteron/dca/before/wrong/hDCAxyVsPtDeuteronTrue", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/deuteron/dca/before/fake/hDCAxyVsPtDeuteronTruePrim", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/deuteron/dca/before/fake/hDCAxyVsPtDeuteronTrueSec", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/deuteron/dca/before/fake/hDCAxyVsPtDeuteronTrueTransport", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - // histos.add("tracks/deuteron/dca/before/wrong/hDCAxyVsPtDeuteronTruePrim", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - // histos.add("tracks/deuteron/dca/before/wrong/hDCAxyVsPtDeuteronTrueSec", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - // histos.add("tracks/deuteron/dca/before/wrong/hDCAxyVsPtDeuteronTrueTransport", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/deuteron/dca/before/fake/hDCAxyVsPtantiDeuteronTrue", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - // histos.add("tracks/deuteron/dca/before/wrong/hDCAxyVsPtantiDeuteronTrue", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - - // histos.add("tracks/deuteron/dca/before/wrong/hDCAxyVsPtantiDeuteronTruePrim", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - // histos.add("tracks/deuteron/dca/before/wrong/hDCAxyVsPtantiDeuteronTrueSec", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - // histos.add("tracks/deuteron/dca/before/wrong/hDCAxyVsPtantiDeuteronTrueTransport", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/deuteron/dca/before/fake/hDCAxyVsPtantiDeuteronTruePrim", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/deuteron/dca/before/fake/hDCAxyVsPtantiDeuteronTrueSec", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/deuteron/dca/before/fake/hDCAxyVsPtantiDeuteronTrueTransport", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + } if (outFlagOptions.doTOFplots) { histos.add("tracks/deuteron/dca/before/TOF/hDCAxyVsPtDeuteronTrue", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/deuteron/dca/before/TOF/hDCAxyVsPtDeuteronTruePrim", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/deuteron/dca/before/TOF/hDCAxyVsPtDeuteronTrueSec", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/deuteron/dca/before/TOF/hDCAxyVsPtDeuteronTrueMaterial", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/deuteron/dca/before/TOF/hDCAxyVsPtDeuteronTrueTransport", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/deuteron/dca/before/TOF/hDCAxyVsPtantiDeuteronTrue", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/deuteron/dca/before/TOF/hDCAxyVsPtantiDeuteronTruePrim", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/deuteron/dca/before/TOF/hDCAxyVsPtantiDeuteronTrueSec", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/deuteron/dca/before/TOF/hDCAxyVsPtantiDeuteronTrueMaterial", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/deuteron/dca/before/TOF/hDCAxyVsPtantiDeuteronTrueTransport", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/deuteron/dca/before/TOF/hDCAzVsPtDeuteronTrue", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/deuteron/dca/before/TOF/hDCAzVsPtDeuteronTruePrim", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/deuteron/dca/before/TOF/hDCAzVsPtDeuteronTrueSec", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/deuteron/dca/before/TOF/hDCAzVsPtDeuteronTrueMaterial", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/deuteron/dca/before/TOF/hDCAzVsPtDeuteronTrueTransport", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/deuteron/dca/before/TOF/hDCAzVsPtantiDeuteronTrue", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/deuteron/dca/before/TOF/hDCAzVsPtantiDeuteronTruePrim", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/deuteron/dca/before/TOF/hDCAzVsPtantiDeuteronTrueSec", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/deuteron/dca/before/TOF/hDCAzVsPtantiDeuteronTrueMaterial", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/deuteron/dca/before/TOF/hDCAzVsPtantiDeuteronTrueTransport", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAxyVsPtDeuteronTrue", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - - histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAxyVsPtDeuteronTruePrim", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAxyVsPtDeuteronTrueSec", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAxyVsPtDeuteronTrueTransport", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - - histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAxyVsPtantiDeuteronTrue", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + if (outFlagOptions.makeFakeTracksPlots) { + histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAxyVsPtDeuteronTrue", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAxyVsPtantiDeuteronTruePrim", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAxyVsPtantiDeuteronTrueSec", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAxyVsPtantiDeuteronTrueTransport", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAxyVsPtDeuteronTruePrim", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAxyVsPtDeuteronTrueSec", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAxyVsPtDeuteronTrueTransport", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAzVsPtDeuteronTrue", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAxyVsPtantiDeuteronTrue", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAzVsPtDeuteronTruePrim", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAzVsPtDeuteronTrueSec", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAzVsPtDeuteronTrueTransport", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAxyVsPtantiDeuteronTruePrim", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAxyVsPtantiDeuteronTrueSec", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAxyVsPtantiDeuteronTrueTransport", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAzVsPtantiDeuteronTrue", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAzVsPtDeuteronTrue", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAzVsPtantiDeuteronTruePrim", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAzVsPtantiDeuteronTrueSec", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAzVsPtantiDeuteronTrueTransport", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAzVsPtDeuteronTruePrim", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAzVsPtDeuteronTrueSec", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAzVsPtDeuteronTrueTransport", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - // histos.add("tracks/deuteron/dca/before/wrong/TOF/hDCAxyVsPtDeuteronTrue", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAzVsPtantiDeuteronTrue", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - // histos.add("tracks/deuteron/dca/before/wrong/TOF/hDCAxyVsPtDeuteronTruePrim", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - // histos.add("tracks/deuteron/dca/before/wrong/TOF/hDCAxyVsPtDeuteronTrueSec", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - // histos.add("tracks/deuteron/dca/before/wrong/TOF/hDCAxyVsPtDeuteronTrueTransport", "DCAxy vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - - // histos.add("tracks/deuteron/dca/before/wrong/TOF/hDCAxyVsPtantiDeuteronTrue", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - - // histos.add("tracks/deuteron/dca/before/wrong/TOF/hDCAxyVsPtantiDeuteronTruePrim", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - // histos.add("tracks/deuteron/dca/before/wrong/TOF/hDCAxyVsPtantiDeuteronTrueSec", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - // histos.add("tracks/deuteron/dca/before/wrong/TOF/hDCAxyVsPtantiDeuteronTrueTransport", "DCAxy vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - - // histos.add("tracks/deuteron/dca/before/wrong/TOF/hDCAzVsPtDeuteronTrue", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - - // histos.add("tracks/deuteron/dca/before/wrong/TOF/hDCAzVsPtDeuteronTruePrim", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - // histos.add("tracks/deuteron/dca/before/wrong/TOF/hDCAzVsPtDeuteronTrueSec", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - // histos.add("tracks/deuteron/dca/before/wrong/TOF/hDCAzVsPtDeuteronTrueTransport", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - - // histos.add("tracks/deuteron/dca/before/wrong/TOF/hDCAzVsPtantiDeuteronTrue", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - - // histos.add("tracks/deuteron/dca/before/wrong/TOF/hDCAzVsPtantiDeuteronTruePrim", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - // histos.add("tracks/deuteron/dca/before/wrong/TOF/hDCAzVsPtantiDeuteronTrueSec", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - // histos.add("tracks/deuteron/dca/before/wrong/TOF/hDCAzVsPtantiDeuteronTrueTransport", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAzVsPtantiDeuteronTruePrim", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAzVsPtantiDeuteronTrueSec", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/deuteron/dca/before/fake/TOF/hDCAzVsPtantiDeuteronTrueTransport", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + } } } @@ -1032,37 +1017,43 @@ struct LFNucleiBATask { histos.add("tracks/triton/dca/before/hDCAxyVsPtTritonTruePrim", "DCAxy vs Pt (t); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/triton/dca/before/hDCAxyVsPtTritonTrueSec", "DCAxy vs Pt (t); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/triton/dca/before/hDCAxyVsPtTritonTrueMaterial", "DCAxy vs Pt (t); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/triton/dca/before/hDCAxyVsPtTritonTrueTransport", "DCAxy vs Pt (t); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/triton/dca/before/hDCAxyVsPtantiTritonTrue", "DCAxy vs Pt (#bar{t}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/triton/dca/before/hDCAxyVsPtantiTritonTruePrim", "DCAxy vs Pt (#bar{t}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/triton/dca/before/hDCAxyVsPtantiTritonTrueSec", "DCAxy vs Pt (#bar{t}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); - histos.add("tracks/triton/dca/before/hDCAxyVsPtantiTritonTrueTransport", "DCAxy vs Pt (#bar{t}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/triton/dca/before/hDCAxyVsPtTritonTrueMaterial", "DCAxy vs Pt (t); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/triton/dca/before/hDCAxyVsPtTritonTrueTransport", "DCAxy vs Pt (t); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); if (outFlagOptions.doTOFplots) { histos.add("tracks/triton/dca/before/TOF/hDCAxyVsPtTritonTrue", "DCAxy vs Pt (t); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/triton/dca/before/TOF/hDCAxyVsPtTritonTruePrim", "DCAxy vs Pt (t); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/triton/dca/before/TOF/hDCAxyVsPtTritonTrueSec", "DCAxy vs Pt (t); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/triton/dca/before/TOF/hDCAxyVsPtTritonTrueMaterial", "DCAxy vs Pt (t); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/triton/dca/before/TOF/hDCAxyVsPtTritonTrueTransport", "DCAxy vs Pt (t); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/triton/dca/before/TOF/hDCAxyVsPtantiTritonTrue", "DCAxy vs Pt (#bar{t}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/triton/dca/before/TOF/hDCAxyVsPtantiTritonTruePrim", "DCAxy vs Pt (#bar{t}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/triton/dca/before/TOF/hDCAxyVsPtantiTritonTrueSec", "DCAxy vs Pt (#bar{t}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/triton/dca/before/TOF/hDCAxyVsPtantiTritonTrueMaterial", "DCAxy vs Pt (#bar{t}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/triton/dca/before/TOF/hDCAxyVsPtantiTritonTrueTransport", "DCAxy vs Pt (#bar{t}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/triton/dca/before/TOF/hDCAzVsPtTritonTrue", "DCAz vs Pt (t); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/triton/dca/before/TOF/hDCAzVsPtTritonTruePrim", "DCAz vs Pt (t); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/triton/dca/before/TOF/hDCAzVsPtTritonTrueSec", "DCAz vs Pt (t); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/triton/dca/before/TOF/hDCAzVsPtTritonTrueMaterial", "DCAz vs Pt (t); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/triton/dca/before/TOF/hDCAzVsPtTritonTrueTransport", "DCAz vs Pt (t); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/triton/dca/before/TOF/hDCAzVsPtantiTritonTrue", "DCAz vs Pt (#bar{t}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/triton/dca/before/TOF/hDCAzVsPtantiTritonTruePrim", "DCAz vs Pt (#bar{t}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/triton/dca/before/TOF/hDCAzVsPtantiTritonTrueSec", "DCAz vs Pt (#bar{t}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/triton/dca/before/TOF/hDCAzVsPtantiTritonTrueMaterial", "DCAz vs Pt (#bar{t}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/triton/dca/before/TOF/hDCAzVsPtantiTritonTrueTransport", "DCAz vs Pt (#bar{t}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); } } @@ -1114,24 +1105,28 @@ struct LFNucleiBATask { histos.add("tracks/helium/dca/before/hDCAxyVsPtHeliumTruePrim", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); histos.add("tracks/helium/dca/before/hDCAxyVsPtHeliumTrueSec", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/hDCAxyVsPtHeliumTrueMaterial", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); histos.add("tracks/helium/dca/before/hDCAxyVsPtHeliumTrueTransport", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); histos.add("tracks/helium/dca/before/hDCAxyVsPtantiHeliumTrue", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); histos.add("tracks/helium/dca/before/hDCAxyVsPtantiHeliumTruePrim", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); histos.add("tracks/helium/dca/before/hDCAxyVsPtantiHeliumTrueSec", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/hDCAxyVsPtantiHeliumTrueMaterial", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); histos.add("tracks/helium/dca/before/hDCAxyVsPtantiHeliumTrueTransport", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); histos.add("tracks/helium/dca/before/hDCAzVsPtHeliumTrue", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); histos.add("tracks/helium/dca/before/hDCAzVsPtHeliumTruePrim", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); histos.add("tracks/helium/dca/before/hDCAzVsPtHeliumTrueSec", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/hDCAzVsPtHeliumTrueMaterial", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); histos.add("tracks/helium/dca/before/hDCAzVsPtHeliumTrueTransport", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); histos.add("tracks/helium/dca/before/hDCAzVsPtantiHeliumTrue", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); histos.add("tracks/helium/dca/before/hDCAzVsPtantiHeliumTruePrim", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); histos.add("tracks/helium/dca/before/hDCAzVsPtantiHeliumTrueSec", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/hDCAzVsPtantiHeliumTrueMaterial", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); histos.add("tracks/helium/dca/before/hDCAzVsPtantiHeliumTrueTransport", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); if (outFlagOptions.doTOFplots) { @@ -1139,123 +1134,135 @@ struct LFNucleiBATask { histos.add("tracks/helium/dca/before/TOF/hDCAxyVsPtHeliumTruePrim", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); histos.add("tracks/helium/dca/before/TOF/hDCAxyVsPtHeliumTrueSec", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/TOF/hDCAxyVsPtHeliumTrueMaterial", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); histos.add("tracks/helium/dca/before/TOF/hDCAxyVsPtHeliumTrueTransport", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); histos.add("tracks/helium/dca/before/TOF/hDCAxyVsPtantiHeliumTrue", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); histos.add("tracks/helium/dca/before/TOF/hDCAxyVsPtantiHeliumTruePrim", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); histos.add("tracks/helium/dca/before/TOF/hDCAxyVsPtantiHeliumTrueSec", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/TOF/hDCAxyVsPtantiHeliumTrueMaterial", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); histos.add("tracks/helium/dca/before/TOF/hDCAxyVsPtantiHeliumTrueTransport", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); histos.add("tracks/helium/dca/before/TOF/hDCAzVsPtHeliumTrue", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); histos.add("tracks/helium/dca/before/TOF/hDCAzVsPtHeliumTruePrim", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); histos.add("tracks/helium/dca/before/TOF/hDCAzVsPtHeliumTrueSec", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/TOF/hDCAzVsPtHeliumTrueMaterial", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); histos.add("tracks/helium/dca/before/TOF/hDCAzVsPtHeliumTrueTransport", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); histos.add("tracks/helium/dca/before/TOF/hDCAzVsPtantiHeliumTrue", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); histos.add("tracks/helium/dca/before/TOF/hDCAzVsPtantiHeliumTruePrim", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); histos.add("tracks/helium/dca/before/TOF/hDCAzVsPtantiHeliumTrueSec", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/TOF/hDCAzVsPtantiHeliumTrueMaterial", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); histos.add("tracks/helium/dca/before/TOF/hDCAzVsPtantiHeliumTrueTransport", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); } // Fake & wrong histos - histos.add("tracks/helium/dca/before/fake/hDCAxyVsPtHeliumTrue", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + if (outFlagOptions.makeFakeTracksPlots) { + histos.add("tracks/helium/dca/before/fake/hDCAxyVsPtHeliumTrue", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/fake/hDCAxyVsPtHeliumTruePrim", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/fake/hDCAxyVsPtHeliumTrueSec", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/fake/hDCAxyVsPtHeliumTrueTransport", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/fake/hDCAxyVsPtHeliumTruePrim", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/fake/hDCAxyVsPtHeliumTrueSec", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/fake/hDCAxyVsPtHeliumTrueTransport", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/fake/hDCAxyVsPtantiHeliumTrue", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/fake/hDCAxyVsPtantiHeliumTrue", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/fake/hDCAxyVsPtantiHeliumTruePrim", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/fake/hDCAxyVsPtantiHeliumTrueSec", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/fake/hDCAxyVsPtantiHeliumTrueTransport", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/fake/hDCAxyVsPtantiHeliumTruePrim", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/fake/hDCAxyVsPtantiHeliumTrueSec", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/fake/hDCAxyVsPtantiHeliumTrueTransport", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/fake/hDCAzVsPtHeliumTrue", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/fake/hDCAzVsPtHeliumTrue", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/fake/hDCAzVsPtHeliumTruePrim", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/fake/hDCAzVsPtHeliumTrueSec", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/fake/hDCAzVsPtHeliumTrueTransport", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/fake/hDCAzVsPtHeliumTruePrim", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/fake/hDCAzVsPtHeliumTrueSec", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/fake/hDCAzVsPtHeliumTrueTransport", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/fake/hDCAzVsPtantiHeliumTrue", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/fake/hDCAzVsPtantiHeliumTrue", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/fake/hDCAzVsPtantiHeliumTruePrim", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/fake/hDCAzVsPtantiHeliumTrueSec", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/fake/hDCAzVsPtantiHeliumTrueTransport", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/fake/hDCAzVsPtantiHeliumTruePrim", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/fake/hDCAzVsPtantiHeliumTrueSec", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/fake/hDCAzVsPtantiHeliumTrueTransport", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + } - histos.add("tracks/helium/dca/before/wrong/hDCAxyVsPtHeliumTrue", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + if (outFlagOptions.makeWrongEventPlots) { + histos.add("tracks/helium/dca/before/wrong/hDCAxyVsPtHeliumTrue", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/wrong/hDCAxyVsPtHeliumTruePrim", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/wrong/hDCAxyVsPtHeliumTrueSec", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/wrong/hDCAxyVsPtHeliumTrueTransport", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/wrong/hDCAxyVsPtHeliumTruePrim", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/wrong/hDCAxyVsPtHeliumTrueSec", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/wrong/hDCAxyVsPtHeliumTrueTransport", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/wrong/hDCAxyVsPtantiHeliumTrue", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/wrong/hDCAxyVsPtantiHeliumTrue", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/wrong/hDCAxyVsPtantiHeliumTruePrim", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/wrong/hDCAxyVsPtantiHeliumTrueSec", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/wrong/hDCAxyVsPtantiHeliumTrueTransport", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/wrong/hDCAxyVsPtantiHeliumTruePrim", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/wrong/hDCAxyVsPtantiHeliumTrueSec", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/wrong/hDCAxyVsPtantiHeliumTrueTransport", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/wrong/hDCAzVsPtHeliumTrue", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/wrong/hDCAzVsPtHeliumTrue", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/wrong/hDCAzVsPtHeliumTruePrim", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/wrong/hDCAzVsPtHeliumTrueSec", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/wrong/hDCAzVsPtHeliumTrueTransport", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/wrong/hDCAzVsPtHeliumTruePrim", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/wrong/hDCAzVsPtHeliumTrueSec", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/wrong/hDCAzVsPtHeliumTrueTransport", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/wrong/hDCAzVsPtantiHeliumTrue", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/wrong/hDCAzVsPtantiHeliumTrue", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/wrong/hDCAzVsPtantiHeliumTruePrim", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/wrong/hDCAzVsPtantiHeliumTrueSec", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/wrong/hDCAzVsPtantiHeliumTrueTransport", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/wrong/hDCAzVsPtantiHeliumTruePrim", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/wrong/hDCAzVsPtantiHeliumTrueSec", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/wrong/hDCAzVsPtantiHeliumTrueTransport", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + } if (outFlagOptions.doTOFplots) { - histos.add("tracks/helium/dca/before/fake/TOF/hDCAxyVsPtHeliumTrue", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + if (outFlagOptions.makeFakeTracksPlots) { + histos.add("tracks/helium/dca/before/fake/TOF/hDCAxyVsPtHeliumTrue", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/fake/TOF/hDCAxyVsPtHeliumTruePrim", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/fake/TOF/hDCAxyVsPtHeliumTrueSec", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/fake/TOF/hDCAxyVsPtHeliumTrueTransport", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/fake/TOF/hDCAxyVsPtHeliumTruePrim", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/fake/TOF/hDCAxyVsPtHeliumTrueSec", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/fake/TOF/hDCAxyVsPtHeliumTrueTransport", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/fake/TOF/hDCAxyVsPtantiHeliumTrue", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/fake/TOF/hDCAxyVsPtantiHeliumTrue", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/fake/TOF/hDCAxyVsPtantiHeliumTruePrim", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/fake/TOF/hDCAxyVsPtantiHeliumTrueSec", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/fake/TOF/hDCAxyVsPtantiHeliumTrueTransport", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/fake/TOF/hDCAxyVsPtantiHeliumTruePrim", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/fake/TOF/hDCAxyVsPtantiHeliumTrueSec", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/fake/TOF/hDCAxyVsPtantiHeliumTrueTransport", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/fake/TOF/hDCAzVsPtHeliumTrue", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/fake/TOF/hDCAzVsPtHeliumTrue", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/fake/TOF/hDCAzVsPtHeliumTruePrim", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/fake/TOF/hDCAzVsPtHeliumTrueSec", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/fake/TOF/hDCAzVsPtHeliumTrueTransport", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/fake/TOF/hDCAzVsPtHeliumTruePrim", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/fake/TOF/hDCAzVsPtHeliumTrueSec", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/fake/TOF/hDCAzVsPtHeliumTrueTransport", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/fake/TOF/hDCAzVsPtantiHeliumTrue", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/fake/TOF/hDCAzVsPtantiHeliumTrue", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/fake/TOF/hDCAzVsPtantiHeliumTruePrim", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/fake/TOF/hDCAzVsPtantiHeliumTrueSec", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/fake/TOF/hDCAzVsPtantiHeliumTrueTransport", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/fake/TOF/hDCAzVsPtantiHeliumTruePrim", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/fake/TOF/hDCAzVsPtantiHeliumTrueSec", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/fake/TOF/hDCAzVsPtantiHeliumTrueTransport", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + } - histos.add("tracks/helium/dca/before/wrong/TOF/hDCAxyVsPtHeliumTrue", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + if (outFlagOptions.makeWrongEventPlots) { + histos.add("tracks/helium/dca/before/wrong/TOF/hDCAxyVsPtHeliumTrue", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/wrong/TOF/hDCAxyVsPtHeliumTruePrim", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/wrong/TOF/hDCAxyVsPtHeliumTrueSec", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/wrong/TOF/hDCAxyVsPtHeliumTrueTransport", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/wrong/TOF/hDCAxyVsPtHeliumTruePrim", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/wrong/TOF/hDCAxyVsPtHeliumTrueSec", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/wrong/TOF/hDCAxyVsPtHeliumTrueTransport", "DCAxy vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/wrong/TOF/hDCAxyVsPtantiHeliumTrue", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/wrong/TOF/hDCAxyVsPtantiHeliumTrue", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/wrong/TOF/hDCAxyVsPtantiHeliumTruePrim", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/wrong/TOF/hDCAxyVsPtantiHeliumTrueSec", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/wrong/TOF/hDCAxyVsPtantiHeliumTrueTransport", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/wrong/TOF/hDCAxyVsPtantiHeliumTruePrim", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/wrong/TOF/hDCAxyVsPtantiHeliumTrueSec", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); + histos.add("tracks/helium/dca/before/wrong/TOF/hDCAxyVsPtantiHeliumTrueTransport", "DCAxy vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcaxyAxis}}); - histos.add("tracks/helium/dca/before/wrong/TOF/hDCAzVsPtHeliumTrue", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/wrong/TOF/hDCAzVsPtHeliumTrue", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/wrong/TOF/hDCAzVsPtHeliumTruePrim", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/wrong/TOF/hDCAzVsPtHeliumTrueSec", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/wrong/TOF/hDCAzVsPtHeliumTrueTransport", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/wrong/TOF/hDCAzVsPtHeliumTruePrim", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/wrong/TOF/hDCAzVsPtHeliumTrueSec", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/wrong/TOF/hDCAzVsPtHeliumTrueTransport", "DCAz vs Pt (He); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/wrong/TOF/hDCAzVsPtantiHeliumTrue", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/wrong/TOF/hDCAzVsPtantiHeliumTrue", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/wrong/TOF/hDCAzVsPtantiHeliumTruePrim", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/wrong/TOF/hDCAzVsPtantiHeliumTrueSec", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); - histos.add("tracks/helium/dca/before/wrong/TOF/hDCAzVsPtantiHeliumTrueTransport", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/wrong/TOF/hDCAzVsPtantiHeliumTruePrim", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/wrong/TOF/hDCAzVsPtantiHeliumTrueSec", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + histos.add("tracks/helium/dca/before/wrong/TOF/hDCAzVsPtantiHeliumTrueTransport", "DCAz vs Pt (#bar{He}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptZHeAxis}, {dcazAxis}}); + } } } @@ -1317,12 +1324,14 @@ struct LFNucleiBATask { histos.add("tracks/alpha/dca/before/hDCAxyVsPtAlphaTruePrim", "DCAxy vs Pt (#alpha); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/alpha/dca/before/hDCAxyVsPtAlphaTrueSec", "DCAxy vs Pt (#alpha); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/alpha/dca/before/hDCAxyVsPtAlphaTrueMaterial", "DCAxy vs Pt (#alpha); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/alpha/dca/before/hDCAxyVsPtAlphaTrueTransport", "DCAxy vs Pt (#alpha); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/alpha/dca/before/hDCAxyVsPtantiAlphaTrue", "DCAxy vs Pt (#bar{#alpha}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/alpha/dca/before/hDCAxyVsPtantiAlphaTruePrim", "DCAxy vs Pt (#bar{#alpha}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/alpha/dca/before/hDCAxyVsPtantiAlphaTrueSec", "DCAxy vs Pt (#bar{#alpha}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/alpha/dca/before/hDCAxyVsPtantiAlphaTrueMaterial", "DCAxy vs Pt (#bar{#alpha}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/alpha/dca/before/hDCAxyVsPtantiAlphaTrueTransport", "DCAxy vs Pt (#bar{#alpha}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); } @@ -1331,12 +1340,14 @@ struct LFNucleiBATask { histos.add("tracks/alpha/dca/after/hDCAxyVsPtAlphaTruePrim", "DCAxy vs Pt (#alpha); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/alpha/dca/after/hDCAxyVsPtAlphaTrueSec", "DCAxy vs Pt (#alpha); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/alpha/dca/after/hDCAxyVsPtAlphaTrueMaterial", "DCAxy vs Pt (#alpha); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/alpha/dca/after/hDCAxyVsPtAlphaTrueTransport", "DCAxy vs Pt (#alpha); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/alpha/dca/after/hDCAxyVsPtantiAlphaTrue", "DCAxy vs Pt (#bar{#alpha}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/alpha/dca/after/hDCAxyVsPtantiAlphaTruePrim", "DCAxy vs Pt (#bar{#alpha}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/alpha/dca/after/hDCAxyVsPtantiAlphaTrueSec", "DCAxy vs Pt (#bar{#alpha}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); + histos.add("tracks/alpha/dca/after/hDCAxyVsPtantiAlphaTrueMaterial", "DCAxy vs Pt (#bar{#alpha}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); histos.add("tracks/alpha/dca/after/hDCAxyVsPtantiAlphaTrueTransport", "DCAxy vs Pt (#bar{#alpha}); #it{p}_{T} (GeV/#it{c}); DCAxy (cm)", HistType::kTH2F, {{ptAxis}, {dcaxyAxis}}); } } @@ -1347,12 +1358,14 @@ struct LFNucleiBATask { histos.add("tracks/proton/dca/before/hDCAzVsPtProtonTruePrim", "DCAz vs Pt (p); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/proton/dca/before/hDCAzVsPtProtonTrueSec", "DCAz vs Pt (p); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/proton/dca/before/hDCAzVsPtProtonTrueMaterial", "DCAz vs Pt (p); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/proton/dca/before/hDCAzVsPtProtonTrueTransport", "DCAz vs Pt (p); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/proton/dca/before/hDCAzVsPtantiProtonTrue", "DCAz vs Pt (#bar{p}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/proton/dca/before/hDCAzVsPtantiProtonTruePrim", "DCAz vs Pt (#bar{p}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/proton/dca/before/hDCAzVsPtantiProtonTrueSec", "DCAz vs Pt (#bar{p}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/proton/dca/before/hDCAzVsPtantiProtonTrueMaterial", "DCAz vs Pt (#bar{p}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/proton/dca/before/hDCAzVsPtantiProtonTrueTransport", "DCAz vs Pt (#bar{p}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); } if (outFlagOptions.makeDCAAfterCutPlots) { @@ -1375,37 +1388,29 @@ struct LFNucleiBATask { histos.add("tracks/deuteron/dca/before/hDCAzVsPtDeuteronTruePrim", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/deuteron/dca/before/hDCAzVsPtDeuteronTrueSec", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/deuteron/dca/before/hDCAzVsPtDeuteronTrueMaterial", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/deuteron/dca/before/hDCAzVsPtDeuteronTrueTransport", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/deuteron/dca/before/hDCAzVsPtantiDeuteronTrue", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/deuteron/dca/before/hDCAzVsPtantiDeuteronTruePrim", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/deuteron/dca/before/hDCAzVsPtantiDeuteronTrueSec", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/deuteron/dca/before/hDCAzVsPtantiDeuteronTrueMaterial", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/deuteron/dca/before/hDCAzVsPtantiDeuteronTrueTransport", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - histos.add("tracks/deuteron/dca/before/fake/hDCAzVsPtDeuteronTrue", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - - histos.add("tracks/deuteron/dca/before/fake/hDCAzVsPtDeuteronTruePrim", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - histos.add("tracks/deuteron/dca/before/fake/hDCAzVsPtDeuteronTrueSec", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - histos.add("tracks/deuteron/dca/before/fake/hDCAzVsPtDeuteronTrueTransport", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - - histos.add("tracks/deuteron/dca/before/fake/hDCAzVsPtantiDeuteronTrue", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - - histos.add("tracks/deuteron/dca/before/fake/hDCAzVsPtantiDeuteronTruePrim", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - histos.add("tracks/deuteron/dca/before/fake/hDCAzVsPtantiDeuteronTrueSec", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - histos.add("tracks/deuteron/dca/before/fake/hDCAzVsPtantiDeuteronTrueTransport", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - - // histos.add("tracks/deuteron/dca/before/wrong/hDCAzVsPtDeuteronTrue", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + if (outFlagOptions.makeFakeTracksPlots) { + histos.add("tracks/deuteron/dca/before/fake/hDCAzVsPtDeuteronTrue", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - // histos.add("tracks/deuteron/dca/before/wrong/hDCAzVsPtDeuteronTruePrim", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - // histos.add("tracks/deuteron/dca/before/wrong/hDCAzVsPtDeuteronTrueSec", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - // histos.add("tracks/deuteron/dca/before/wrong/hDCAzVsPtDeuteronTrueTransport", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/deuteron/dca/before/fake/hDCAzVsPtDeuteronTruePrim", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/deuteron/dca/before/fake/hDCAzVsPtDeuteronTrueSec", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/deuteron/dca/before/fake/hDCAzVsPtDeuteronTrueTransport", "DCAz vs Pt (d); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - // histos.add("tracks/deuteron/dca/before/wrong/hDCAzVsPtantiDeuteronTrue", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/deuteron/dca/before/fake/hDCAzVsPtantiDeuteronTrue", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - // histos.add("tracks/deuteron/dca/before/wrong/hDCAzVsPtantiDeuteronTruePrim", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - // histos.add("tracks/deuteron/dca/before/wrong/hDCAzVsPtantiDeuteronTrueSec", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); - // histos.add("tracks/deuteron/dca/before/wrong/hDCAzVsPtantiDeuteronTrueTransport", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/deuteron/dca/before/fake/hDCAzVsPtantiDeuteronTruePrim", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/deuteron/dca/before/fake/hDCAzVsPtantiDeuteronTrueSec", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/deuteron/dca/before/fake/hDCAzVsPtantiDeuteronTrueTransport", "DCAz vs Pt (#bar{d}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + } } if (outFlagOptions.makeDCAAfterCutPlots) { @@ -1430,12 +1435,14 @@ struct LFNucleiBATask { histos.add("tracks/triton/dca/before/hDCAzVsPtTritonTruePrim", "DCAz vs Pt (t); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/triton/dca/before/hDCAzVsPtTritonTrueSec", "DCAz vs Pt (t); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/triton/dca/before/hDCAzVsPtTritonTrueMaterial", "DCAz vs Pt (t); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/triton/dca/before/hDCAzVsPtTritonTrueTransport", "DCAz vs Pt (t); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/triton/dca/before/hDCAzVsPtantiTritonTrue", "DCAz vs Pt (#bar{t}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/triton/dca/before/hDCAzVsPtantiTritonTruePrim", "DCAz vs Pt (#bar{t}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/triton/dca/before/hDCAzVsPtantiTritonTrueSec", "DCAz vs Pt (#bar{t}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/triton/dca/before/hDCAzVsPtantiTritonTrueMaterial", "DCAz vs Pt (#bar{t}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/triton/dca/before/hDCAzVsPtantiTritonTrueTransport", "DCAz vs Pt (#bar{t}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); } @@ -1460,12 +1467,14 @@ struct LFNucleiBATask { histos.add("tracks/alpha/dca/before/hDCAzVsPtAlphaTruePrim", "DCAz vs Pt (#alpha); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/alpha/dca/before/hDCAzVsPtAlphaTrueSec", "DCAz vs Pt (#alpha); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/alpha/dca/before/hDCAzVsPtAlphaTrueMaterial", "DCAz vs Pt (#alpha); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/alpha/dca/before/hDCAzVsPtAlphaTrueTransport", "DCAz vs Pt (#alpha); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/alpha/dca/before/hDCAzVsPtantiAlphaTrue", "DCAz vs Pt (#bar{#alpha}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/alpha/dca/before/hDCAzVsPtantiAlphaTruePrim", "DCAz vs Pt (#bar{#alpha}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/alpha/dca/before/hDCAzVsPtantiAlphaTrueSec", "DCAz vs Pt (#bar{#alpha}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); + histos.add("tracks/alpha/dca/before/hDCAzVsPtantiAlphaTrueMaterial", "DCAz vs Pt (#bar{#alpha}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); histos.add("tracks/alpha/dca/before/hDCAzVsPtantiAlphaTrueTransport", "DCAz vs Pt (#bar{#alpha}); #it{p}_{T} (GeV/#it{c}); DCAz (cm)", HistType::kTH2F, {{ptAxis}, {dcazAxis}}); } @@ -2166,11 +2175,19 @@ struct LFNucleiBATask { } } std::bitset<8> itsClusterMap = track.itsClusterMap(); - if (track.itsNCls() < cfgCutITSClusters) + if (track.itsNCls() < trkqcOptions.cfgCutITSClusters) + continue; + if (track.tpcNClsCrossedRows() < trkqcOptions.cfgCutTPCXRows) + continue; + if (track.tpcNClsFound() < trkqcOptions.cfgCutTPCClusters) + continue; + if (track.tpcCrossedRowsOverFindableCls() < trkqcOptions.cfgCutTPCCROFnd) continue; - if (track.tpcNClsCrossedRows() < cfgCutTPCXRows) + auto tpcChi2NclRange = (std::vector)trkqcOptions.tpcChi2NclCuts; + if ((track.tpcChi2NCl() < tpcChi2NclRange[0]) || (track.tpcChi2NCl() > tpcChi2NclRange[1])) continue; - if (track.tpcNClsFound() < cfgCutTPCClusters) + auto itsChi2NclRange = (std::vector)trkqcOptions.itsChi2NclCuts; + if ((track.itsChi2NCl() < itsChi2NclRange[0]) || (track.itsChi2NCl() > itsChi2NclRange[1])) continue; if (enablePIDplot) { @@ -2578,14 +2595,16 @@ struct LFNucleiBATask { } if (!isPhysPrim && !isProdByGen) { histos.fill(HIST("tracks/proton/dca/before/hDCAzVsPtProtonTrueTransport"), track.pt(), track.dcaZ()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/proton/dca/before/hDCAzVsPtProtonTrueSec"), track.pt(), track.dcaZ()); - } + else + histos.fill(HIST("tracks/proton/dca/before/hDCAzVsPtProtonTrueMaterial"), track.pt(), track.dcaZ()); if (track.hasTOF() && outFlagOptions.doTOFplots) { histos.fill(HIST("tracks/proton/dca/before/TOF/hDCAzVsPtProtonTrueTransport"), track.pt(), track.dcaZ()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/proton/dca/before/TOF/hDCAzVsPtProtonTrueSec"), track.pt(), track.dcaZ()); - } + else + histos.fill(HIST("tracks/proton/dca/before/TOF/hDCAzVsPtProtonTrueMaterial"), track.pt(), track.dcaZ()); } } } @@ -2604,14 +2623,16 @@ struct LFNucleiBATask { } if (!isPhysPrim && !isProdByGen) { histos.fill(HIST("tracks/proton/dca/before/hDCAzVsPtantiProtonTrueTransport"), track.pt(), track.dcaZ()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/proton/dca/before/hDCAzVsPtantiProtonTrueSec"), track.pt(), track.dcaZ()); - } + else + histos.fill(HIST("tracks/proton/dca/before/hDCAzVsPtantiProtonTrueMaterial"), track.pt(), track.dcaZ()); if (track.hasTOF() && outFlagOptions.doTOFplots) { histos.fill(HIST("tracks/proton/dca/before/TOF/hDCAzVsPtantiProtonTrueTransport"), hePt, track.dcaZ()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/proton/dca/before/TOF/hDCAzVsPtantiProtonTrueSec"), hePt, track.dcaZ()); - } + else + histos.fill(HIST("tracks/proton/dca/before/TOF/hDCAzVsPtantiProtonTrueMaterial"), hePt, track.dcaZ()); } } } @@ -2630,14 +2651,16 @@ struct LFNucleiBATask { } if (!isPhysPrim && !isProdByGen) { histos.fill(HIST("tracks/deuteron/dca/before/hDCAzVsPtDeuteronTrueTransport"), DPt, track.dcaZ()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/deuteron/dca/before/hDCAzVsPtDeuteronTrueSec"), DPt, track.dcaZ()); - } + else + histos.fill(HIST("tracks/deuteron/dca/before/hDCAzVsPtDeuteronTrueMaterial"), DPt, track.dcaZ()); if (track.hasTOF() && outFlagOptions.doTOFplots) { histos.fill(HIST("tracks/deuteron/dca/before/TOF/hDCAzVsPtDeuteronTrueTransport"), DPt, track.dcaZ()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/deuteron/dca/before/TOF/hDCAzVsPtDeuteronTrueSec"), DPt, track.dcaZ()); - } + else + histos.fill(HIST("tracks/deuteron/dca/before/TOF/hDCAzVsPtDeuteronTrueMaterial"), DPt, track.dcaZ()); } } } @@ -2656,14 +2679,16 @@ struct LFNucleiBATask { } if (!isPhysPrim && !isProdByGen) { histos.fill(HIST("tracks/deuteron/dca/before/hDCAzVsPtantiDeuteronTrueTransport"), antiDPt, track.dcaZ()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/deuteron/dca/before/hDCAzVsPtantiDeuteronTrueSec"), antiDPt, track.dcaZ()); - } + else + histos.fill(HIST("tracks/deuteron/dca/before/hDCAzVsPtantiDeuteronTrueMaterial"), antiDPt, track.dcaZ()); if (track.hasTOF() && outFlagOptions.doTOFplots) { histos.fill(HIST("tracks/deuteron/dca/before/TOF/hDCAzVsPtantiDeuteronTrueTransport"), antiDPt, track.dcaZ()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/deuteron/dca/before/TOF/hDCAzVsPtantiDeuteronTrueSec"), antiDPt, track.dcaZ()); - } + else + histos.fill(HIST("tracks/deuteron/dca/before/TOF/hDCAzVsPtantiDeuteronTrueMaterial"), antiDPt, track.dcaZ()); } } } @@ -2676,9 +2701,10 @@ struct LFNucleiBATask { } if (!isPhysPrim && !isProdByGen) { histos.fill(HIST("tracks/triton/dca/before/hDCAzVsPtTritonTrueTransport"), track.pt(), track.dcaZ()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/triton/dca/before/hDCAzVsPtTritonTrueSec"), track.pt(), track.dcaZ()); - } + else + histos.fill(HIST("tracks/triton/dca/before/hDCAzVsPtTritonTrueMaterial"), track.pt(), track.dcaZ()); } } break; @@ -2690,9 +2716,10 @@ struct LFNucleiBATask { } if (!isPhysPrim && !isProdByGen) { histos.fill(HIST("tracks/triton/dca/before/hDCAzVsPtantiTritonTrueTransport"), track.pt(), track.dcaZ()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/triton/dca/before/hDCAzVsPtantiTritonTrueSec"), track.pt(), track.dcaZ()); - } + else + histos.fill(HIST("tracks/triton/dca/before/hDCAzVsPtantiTritonTrueMaterial"), track.pt(), track.dcaZ()); } } break; @@ -2710,20 +2737,22 @@ struct LFNucleiBATask { } if (!isPhysPrim && !isProdByGen) { histos.fill(HIST("tracks/helium/dca/before/hDCAzVsPtHeliumTrueTransport"), hePt, track.dcaZ()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/helium/dca/before/hDCAzVsPtHeliumTrueSec"), hePt, track.dcaZ()); - } + else + histos.fill(HIST("tracks/helium/dca/before/hDCAzVsPtHeliumTrueMaterial"), hePt, track.dcaZ()); if (track.hasTOF() && outFlagOptions.doTOFplots) { histos.fill(HIST("tracks/helium/dca/before/TOF/hDCAzVsPtHeliumTrueTransport"), hePt, track.dcaZ()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/helium/dca/before/TOF/hDCAzVsPtHeliumTrueSec"), hePt, track.dcaZ()); - } + else + histos.fill(HIST("tracks/helium/dca/before/TOF/hDCAzVsPtHeliumTrueMaterial"), hePt, track.dcaZ()); } } } if constexpr (!IsFilteredData) { if ((event.has_mcCollision() && (track.mcParticle().mcCollisionId() != event.mcCollisionId())) || !event.has_mcCollision()) { - if (isHeWoDCAz) { + if (isHeWoDCAz && outFlagOptions.makeWrongEventPlots) { histos.fill(HIST("tracks/helium/dca/before/wrong/hDCAzVsPtHeliumTrue"), hePt, track.dcaZ()); if (track.hasTOF() && outFlagOptions.doTOFplots) { histos.fill(HIST("tracks/helium/dca/before/wrong/TOF/hDCAzVsPtHeliumTrue"), hePt, track.dcaZ()); @@ -2764,20 +2793,22 @@ struct LFNucleiBATask { } if (!isPhysPrim && !isProdByGen) { histos.fill(HIST("tracks/helium/dca/before/hDCAzVsPtantiHeliumTrueTransport"), antihePt, track.dcaZ()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/helium/dca/before/hDCAzVsPtantiHeliumTrueSec"), antihePt, track.dcaZ()); - } + else + histos.fill(HIST("tracks/helium/dca/before/hDCAzVsPtantiHeliumTrueMaterial"), antihePt, track.dcaZ()); if (track.hasTOF() && outFlagOptions.doTOFplots) { histos.fill(HIST("tracks/helium/dca/before/TOF/hDCAzVsPtantiHeliumTrueTransport"), antihePt, track.dcaZ()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/helium/dca/before/TOF/hDCAzVsPtantiHeliumTrueSec"), antihePt, track.dcaZ()); - } + else + histos.fill(HIST("tracks/helium/dca/before/TOF/hDCAzVsPtantiHeliumTrueMaterial"), antihePt, track.dcaZ()); } } } if constexpr (!IsFilteredData) { if ((event.has_mcCollision() && (track.mcParticle().mcCollisionId() != event.mcCollisionId())) || !event.has_mcCollision()) { - if (isAntiHeWoDCAz) { + if (isAntiHeWoDCAz && outFlagOptions.makeWrongEventPlots) { histos.fill(HIST("tracks/helium/dca/before/wrong/hDCAzVsPtantiHeliumTrue"), antihePt, track.dcaZ()); if (track.hasTOF() && outFlagOptions.doTOFplots) { histos.fill(HIST("tracks/helium/dca/before/wrong/TOF/hDCAzVsPtantiHeliumTrue"), antihePt, track.dcaZ()); @@ -2813,9 +2844,10 @@ struct LFNucleiBATask { } if (!isPhysPrim && !isProdByGen) { histos.fill(HIST("tracks/alpha/dca/before/hDCAzVsPtAlphaTrueTransport"), track.pt(), track.dcaZ()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/alpha/dca/before/hDCAzVsPtAlphaTrueSec"), track.pt(), track.dcaZ()); - } + else + histos.fill(HIST("tracks/alpha/dca/before/hDCAzVsPtAlphaTrueMaterial"), track.pt(), track.dcaZ()); } } break; @@ -2827,9 +2859,10 @@ struct LFNucleiBATask { } if (!isPhysPrim && !isProdByGen) { histos.fill(HIST("tracks/alpha/dca/before/hDCAzVsPtantiAlphaTrueTransport"), track.pt(), track.dcaZ()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/alpha/dca/before/hDCAzVsPtantiAlphaTrueSec"), track.pt(), track.dcaZ()); - } + else + histos.fill(HIST("tracks/alpha/dca/before/hDCAzVsPtantiAlphaTrueMaterial"), track.pt(), track.dcaZ()); } } break; @@ -2841,7 +2874,7 @@ struct LFNucleiBATask { // break; default: - if (isDeWoDCAzWTPCpid) { + if (isDeWoDCAzWTPCpid && outFlagOptions.makeFakeTracksPlots) { histos.fill(HIST("tracks/deuteron/dca/before/fake/hDCAzVsPtDeuteronTrue"), DPt, track.dcaZ()); if (track.hasTOF() && outFlagOptions.doTOFplots) { histos.fill(HIST("tracks/deuteron/dca/before/fake/TOF/hDCAzVsPtDeuteronTrue"), DPt, track.dcaZ()); @@ -2864,7 +2897,7 @@ struct LFNucleiBATask { } } } - } else if (isAntiDeWoDCAzWTPCpid) { + } else if (isAntiDeWoDCAzWTPCpid && outFlagOptions.makeFakeTracksPlots) { histos.fill(HIST("tracks/deuteron/dca/before/fake/hDCAzVsPtantiDeuteronTrue"), antiDPt, track.dcaZ()); if (track.hasTOF() && outFlagOptions.doTOFplots) { histos.fill(HIST("tracks/deuteron/dca/before/fake/TOF/hDCAzVsPtantiDeuteronTrue"), antiDPt, track.dcaZ()); @@ -2896,7 +2929,7 @@ struct LFNucleiBATask { // break; default: - if (isHeWoDCAzWTPCpid) { + if (isHeWoDCAzWTPCpid && outFlagOptions.makeFakeTracksPlots) { histos.fill(HIST("tracks/helium/dca/before/fake/hDCAzVsPtHeliumTrue"), hePt, track.dcaZ()); if (track.hasTOF() && outFlagOptions.doTOFplots) { histos.fill(HIST("tracks/helium/dca/before/fake/TOF/hDCAzVsPtHeliumTrue"), hePt, track.dcaZ()); @@ -2920,7 +2953,7 @@ struct LFNucleiBATask { } } } - if (isAntiHeWoDCAzWTPCpid) { + if (isAntiHeWoDCAzWTPCpid && outFlagOptions.makeFakeTracksPlots) { histos.fill(HIST("tracks/helium/dca/before/fake/hDCAzVsPtantiHeliumTrue"), antihePt, track.dcaZ()); if (track.hasTOF() && outFlagOptions.doTOFplots) { histos.fill(HIST("tracks/helium/dca/before/fake/TOF/hDCAzVsPtantiHeliumTrue"), antihePt, track.dcaZ()); @@ -2985,7 +3018,7 @@ struct LFNucleiBATask { } if (isDeWoDCAxyWTPCpid) { - if (usenITSLayer && !itsClusterMap.test(nITSLayer)) + if (usenITSLayer && !itsClusterMap.test(trkqcOptions.nITSLayer)) continue; if (enableCentrality) histos.fill(HIST("tracks/deuteron/dca/before/hDCAxyVsPtDeuteronVsMult"), DPt, track.dcaXY(), event.centFT0M()); @@ -2995,7 +3028,7 @@ struct LFNucleiBATask { histos.fill(HIST("tracks/deuteron/dca/before/hDCAxyVsPtDeuteronNoTOF"), DPt, track.dcaXY()); } if (isAntiDeWoDCAxyWTPCpid) { - if (usenITSLayer && !itsClusterMap.test(nITSLayer)) + if (usenITSLayer && !itsClusterMap.test(trkqcOptions.nITSLayer)) continue; if (enableCentrality) histos.fill(HIST("tracks/deuteron/dca/before/hDCAxyVsPtantiDeuteronVsMult"), antiDPt, track.dcaXY(), event.centFT0M()); @@ -3075,14 +3108,16 @@ struct LFNucleiBATask { } if (!isPhysPrim && !isProdByGen) { histos.fill(HIST("tracks/proton/dca/before/hDCAxyVsPtProtonTrueTransport"), track.pt(), track.dcaXY()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/proton/dca/before/hDCAxyVsPtProtonTrueSec"), track.pt(), track.dcaXY()); - } + else + histos.fill(HIST("tracks/proton/dca/before/hDCAxyVsPtProtonTrueMaterial"), track.pt(), track.dcaXY()); if (track.hasTOF() && outFlagOptions.doTOFplots) { histos.fill(HIST("tracks/proton/dca/before/TOF/hDCAxyVsPtProtonTrueTransport"), track.pt(), track.dcaXY()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/proton/dca/before/TOF/hDCAxyVsPtProtonTrueSec"), track.pt(), track.dcaXY()); - } + else + histos.fill(HIST("tracks/proton/dca/before/TOF/hDCAxyVsPtProtonTrueMaterial"), track.pt(), track.dcaXY()); } } } @@ -3101,14 +3136,16 @@ struct LFNucleiBATask { } if (!isPhysPrim && !isProdByGen) { histos.fill(HIST("tracks/proton/dca/before/hDCAxyVsPtantiProtonTrueTransport"), track.pt(), track.dcaXY()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/proton/dca/before/hDCAxyVsPtantiProtonTrueSec"), track.pt(), track.dcaXY()); - } + else + histos.fill(HIST("tracks/proton/dca/before/hDCAxyVsPtantiProtonTrueMaterial"), track.pt(), track.dcaXY()); if (track.hasTOF() && outFlagOptions.doTOFplots) { histos.fill(HIST("tracks/proton/dca/before/TOF/hDCAxyVsPtantiProtonTrueTransport"), track.pt(), track.dcaXY()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/proton/dca/before/TOF/hDCAxyVsPtantiProtonTrueSec"), track.pt(), track.dcaXY()); - } + else + histos.fill(HIST("tracks/proton/dca/before/TOF/hDCAxyVsPtantiProtonTrueMaterial"), track.pt(), track.dcaXY()); } } } @@ -3147,16 +3184,16 @@ struct LFNucleiBATask { if (!isPhysPrim && !isProdByGen) { if (outFlagOptions.makeDCABeforeCutPlots) { histos.fill(HIST("tracks/deuteron/dca/before/hDCAxyVsPtDeuteronTrueTransport"), DPt, track.dcaXY()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/deuteron/dca/before/hDCAxyVsPtDeuteronTrueSec"), DPt, track.dcaXY()); - } else { - // LOG(info) << " PID: "<< pdgCode << " Prod. by Gen: "<< isProdByGen << " Process: " << track.mcParticle().getProcess() << " HasMothers: " << track.mcParticle().has_mothers() << " and MomIs: "<< mother.pdgCode(); - } + else + histos.fill(HIST("tracks/deuteron/dca/before/hDCAxyVsPtDeuteronTrueMaterial"), DPt, track.dcaXY()); if (track.hasTOF() && outFlagOptions.doTOFplots) { histos.fill(HIST("tracks/deuteron/dca/before/TOF/hDCAxyVsPtDeuteronTrueTransport"), DPt, track.dcaXY()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/deuteron/dca/before/TOF/hDCAxyVsPtDeuteronTrueSec"), DPt, track.dcaXY()); - } + else + histos.fill(HIST("tracks/deuteron/dca/before/TOF/hDCAxyVsPtDeuteronTrueMaterial"), DPt, track.dcaXY()); } } } @@ -3196,14 +3233,16 @@ struct LFNucleiBATask { if (!isPhysPrim && !isProdByGen) { if (outFlagOptions.makeDCABeforeCutPlots) { histos.fill(HIST("tracks/deuteron/dca/before/hDCAxyVsPtantiDeuteronTrueTransport"), antiDPt, track.dcaXY()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/deuteron/dca/before/hDCAxyVsPtantiDeuteronTrueSec"), antiDPt, track.dcaXY()); - } + else + histos.fill(HIST("tracks/deuteron/dca/before/hDCAxyVsPtantiDeuteronTrueMaterial"), antiDPt, track.dcaXY()); if (track.hasTOF() && outFlagOptions.doTOFplots) { histos.fill(HIST("tracks/deuteron/dca/before/TOF/hDCAxyVsPtantiDeuteronTrueTransport"), antiDPt, track.dcaXY()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/deuteron/dca/before/TOF/hDCAxyVsPtantiDeuteronTrueSec"), antiDPt, track.dcaXY()); - } + else + histos.fill(HIST("tracks/deuteron/dca/before/TOF/hDCAxyVsPtantiDeuteronTrueMaterial"), antiDPt, track.dcaXY()); } } } @@ -3231,6 +3270,11 @@ struct LFNucleiBATask { if (track.hasTOF() && outFlagOptions.doTOFplots) { histos.fill(HIST("tracks/triton/dca/before/TOF/hDCAxyVsPtTritonTrueSec"), track.pt(), track.dcaXY()); } + } else { + histos.fill(HIST("tracks/triton/dca/before/hDCAxyVsPtTritonTrueMaterial"), track.pt(), track.dcaXY()); + if (track.hasTOF() && outFlagOptions.doTOFplots) { + histos.fill(HIST("tracks/triton/dca/before/TOF/hDCAxyVsPtTritonTrueMaterial"), track.pt(), track.dcaXY()); + } } } } @@ -3261,6 +3305,11 @@ struct LFNucleiBATask { if (track.hasTOF() && outFlagOptions.doTOFplots) { histos.fill(HIST("tracks/triton/dca/before/TOF/hDCAxyVsPtantiTritonTrueSec"), track.pt(), track.dcaXY()); } + } else { + histos.fill(HIST("tracks/triton/dca/before/hDCAxyVsPtantiTritonTrueMaterial"), track.pt(), track.dcaXY()); + if (track.hasTOF() && outFlagOptions.doTOFplots) { + histos.fill(HIST("tracks/triton/dca/before/TOF/hDCAxyVsPtantiTritonTrueMaterial"), track.pt(), track.dcaXY()); + } } } } @@ -3294,20 +3343,22 @@ struct LFNucleiBATask { } if (!isPhysPrim && !isProdByGen && outFlagOptions.makeDCABeforeCutPlots) { histos.fill(HIST("tracks/helium/dca/before/hDCAxyVsPtHeliumTrueTransport"), hePt, track.dcaXY()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/helium/dca/before/hDCAxyVsPtHeliumTrueSec"), hePt, track.dcaXY()); - } + else + histos.fill(HIST("tracks/helium/dca/before/hDCAxyVsPtHeliumTrueMaterial"), hePt, track.dcaXY()); if (track.hasTOF() && outFlagOptions.doTOFplots) { histos.fill(HIST("tracks/helium/dca/before/TOF/hDCAxyVsPtHeliumTrueTransport"), hePt, track.dcaXY()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/helium/dca/before/TOF/hDCAxyVsPtHeliumTrueSec"), hePt, track.dcaXY()); - } + else + histos.fill(HIST("tracks/helium/dca/before/TOF/hDCAxyVsPtHeliumTrueMaterial"), hePt, track.dcaXY()); } } } if constexpr (!IsFilteredData) { if ((event.has_mcCollision() && (track.mcParticle().mcCollisionId() != event.mcCollisionId())) || !event.has_mcCollision()) { - if (isHeWoDCAxy && outFlagOptions.makeDCABeforeCutPlots) { + if (isHeWoDCAxy && outFlagOptions.makeDCABeforeCutPlots && outFlagOptions.makeWrongEventPlots) { histos.fill(HIST("tracks/helium/dca/before/wrong/hDCAxyVsPtHeliumTrue"), hePt, track.dcaXY()); if (track.hasTOF() && outFlagOptions.doTOFplots) { histos.fill(HIST("tracks/helium/dca/before/wrong/TOF/hDCAxyVsPtHeliumTrue"), hePt, track.dcaXY()); @@ -3363,21 +3414,23 @@ struct LFNucleiBATask { } if (!isPhysPrim && !isProdByGen && outFlagOptions.makeDCABeforeCutPlots) { histos.fill(HIST("tracks/helium/dca/before/hDCAxyVsPtantiHeliumTrueTransport"), antihePt, track.dcaXY()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/helium/dca/before/hDCAxyVsPtantiHeliumTrueSec"), antihePt, track.dcaXY()); - } + else + histos.fill(HIST("tracks/helium/dca/before/hDCAxyVsPtantiHeliumTrueMaterial"), antihePt, track.dcaXY()); if (track.hasTOF() && outFlagOptions.doTOFplots) { histos.fill(HIST("tracks/helium/dca/before/TOF/hDCAxyVsPtantiHeliumTrueTransport"), antihePt, track.dcaXY()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/helium/dca/before/TOF/hDCAxyVsPtantiHeliumTrueSec"), antihePt, track.dcaXY()); - } + else + histos.fill(HIST("tracks/helium/dca/before/TOF/hDCAxyVsPtantiHeliumTrueMaterial"), antihePt, track.dcaXY()); } } } if constexpr (!IsFilteredData) { if ((event.has_mcCollision() && (track.mcParticle().mcCollisionId() != event.mcCollisionId())) || !event.has_mcCollision()) { - if (isAntiHeWoDCAxy && outFlagOptions.makeDCABeforeCutPlots) { + if (isAntiHeWoDCAxy && outFlagOptions.makeDCABeforeCutPlots && outFlagOptions.makeWrongEventPlots) { histos.fill(HIST("tracks/helium/dca/before/wrong/hDCAxyVsPtantiHeliumTrue"), antihePt, track.dcaXY()); if (track.hasTOF() && outFlagOptions.doTOFplots) { histos.fill(HIST("tracks/helium/dca/before/wrong/TOF/hDCAxyVsPtantiHeliumTrue"), antihePt, track.dcaXY()); @@ -3412,9 +3465,10 @@ struct LFNucleiBATask { } if (!isPhysPrim && !isProdByGen) { histos.fill(HIST("tracks/alpha/dca/before/hDCAxyVsPtAlphaTrueTransport"), track.pt(), track.dcaXY()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/alpha/dca/before/hDCAxyVsPtAlphaTrueSec"), track.pt(), track.dcaXY()); - } + else + histos.fill(HIST("tracks/alpha/dca/before/hDCAxyVsPtAlphaTrueMaterial"), track.pt(), track.dcaXY()); } } break; @@ -3426,9 +3480,10 @@ struct LFNucleiBATask { } if (!isPhysPrim && !isProdByGen) { histos.fill(HIST("tracks/alpha/dca/before/hDCAxyVsPtantiAlphaTrueTransport"), track.pt(), track.dcaXY()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/alpha/dca/before/hDCAxyVsPtantiAlphaTrueSec"), track.pt(), track.dcaXY()); - } + else + histos.fill(HIST("tracks/alpha/dca/before/hDCAxyVsPtantiAlphaTrueMaterial"), track.pt(), track.dcaXY()); } } break; @@ -3440,7 +3495,7 @@ struct LFNucleiBATask { // break; default: - if (isDeWoDCAxyWTPCpid) { + if (isDeWoDCAxyWTPCpid && outFlagOptions.makeFakeTracksPlots) { if (outFlagOptions.makeDCABeforeCutPlots) { histos.fill(HIST("tracks/deuteron/dca/before/fake/hDCAxyVsPtDeuteronTrue"), DPt, track.dcaXY()); if (track.hasTOF() && outFlagOptions.doTOFplots) { @@ -3460,16 +3515,19 @@ struct LFNucleiBATask { histos.fill(HIST("tracks/deuteron/dca/before/fake/hDCAxyVsPtDeuteronTrueTransport"), DPt, track.dcaXY()); if (isWeakDecay) histos.fill(HIST("tracks/deuteron/dca/before/fake/hDCAxyVsPtDeuteronTrueSec"), DPt, track.dcaXY()); + else + histos.fill(HIST("tracks/deuteron/dca/before/fake/hDCAxyVsPtDeuteronTrueMaterial"), DPt, track.dcaXY()); if (track.hasTOF() && outFlagOptions.doTOFplots) { histos.fill(HIST("tracks/deuteron/dca/before/fake/TOF/hDCAxyVsPtDeuteronTrueTransport"), DPt, track.dcaXY()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/deuteron/dca/before/fake/TOF/hDCAxyVsPtDeuteronTrueSec"), DPt, track.dcaXY()); - } + else + histos.fill(HIST("tracks/deuteron/dca/before/fake/TOF/hDCAxyVsPtDeuteronTrueMaterial"), DPt, track.dcaXY()); } } } } - if (isAntiDeWoDCAxyWTPCpid) { + if (isAntiDeWoDCAxyWTPCpid && outFlagOptions.makeFakeTracksPlots) { if (outFlagOptions.makeDCABeforeCutPlots) { histos.fill(HIST("tracks/deuteron/dca/before/fake/hDCAxyVsPtantiDeuteronTrue"), antiDPt, track.dcaXY()); if (track.hasTOF() && outFlagOptions.doTOFplots) { @@ -3487,14 +3545,16 @@ struct LFNucleiBATask { if (!isPhysPrim && !isProdByGen) { if (outFlagOptions.makeDCABeforeCutPlots) { histos.fill(HIST("tracks/deuteron/dca/before/fake/hDCAxyVsPtantiDeuteronTrueTransport"), antiDPt, track.dcaXY()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/deuteron/dca/before/fake/hDCAxyVsPtantiDeuteronTrueSec"), antiDPt, track.dcaXY()); - } + else + histos.fill(HIST("tracks/deuteron/dca/before/fake/hDCAxyVsPtantiDeuteronTrueMaterial"), antiDPt, track.dcaXY()); if (track.hasTOF() && outFlagOptions.doTOFplots) { histos.fill(HIST("tracks/deuteron/dca/before/fake/TOF/hDCAxyVsPtantiDeuteronTrueTransport"), antiDPt, track.dcaXY()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/deuteron/dca/before/fake/TOF/hDCAxyVsPtantiDeuteronTrueSec"), antiDPt, track.dcaXY()); - } + else + histos.fill(HIST("tracks/deuteron/dca/before/fake/TOF/hDCAxyVsPtantiDeuteronTrueMaterial"), antiDPt, track.dcaXY()); } } } @@ -3507,7 +3567,7 @@ struct LFNucleiBATask { // break; default: - if (isHeWoDCAxyWTPCpid) { + if (isHeWoDCAxyWTPCpid && outFlagOptions.makeFakeTracksPlots) { if (outFlagOptions.makeDCABeforeCutPlots) { histos.fill(HIST("tracks/helium/dca/before/fake/hDCAxyVsPtHeliumTrue"), hePt, track.dcaXY()); if (track.hasTOF() && outFlagOptions.doTOFplots) { @@ -3521,19 +3581,21 @@ struct LFNucleiBATask { } if (!isPhysPrim && !isProdByGen) { histos.fill(HIST("tracks/helium/dca/before/fake/hDCAxyVsPtHeliumTrueTransport"), hePt, track.dcaXY()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/helium/dca/before/fake/hDCAxyVsPtHeliumTrueSec"), hePt, track.dcaXY()); - } + else + histos.fill(HIST("tracks/helium/dca/before/fake/hDCAxyVsPtHeliumTrueMaterial"), hePt, track.dcaXY()); if (track.hasTOF() && outFlagOptions.doTOFplots) { histos.fill(HIST("tracks/helium/dca/before/fake/TOF/hDCAxyVsPtHeliumTrueTransport"), hePt, track.dcaXY()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/helium/dca/before/fake/TOF/hDCAxyVsPtHeliumTrueSec"), hePt, track.dcaXY()); - } + else + histos.fill(HIST("tracks/helium/dca/before/fake/TOF/hDCAxyVsPtHeliumTrueMaterial"), hePt, track.dcaXY()); } } } } - if (isAntiHeWoDCAxyWTPCpid) { + if (isAntiHeWoDCAxyWTPCpid && outFlagOptions.makeFakeTracksPlots) { if (outFlagOptions.makeDCABeforeCutPlots) { histos.fill(HIST("tracks/helium/dca/before/fake/hDCAxyVsPtantiHeliumTrue"), antihePt, track.dcaXY()); if (track.hasTOF() && outFlagOptions.doTOFplots) { @@ -3547,14 +3609,16 @@ struct LFNucleiBATask { } if (!isPhysPrim && !isProdByGen) { histos.fill(HIST("tracks/helium/dca/before/fake/hDCAxyVsPtantiHeliumTrueTransport"), antihePt, track.dcaXY()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/helium/dca/before/fake/hDCAxyVsPtantiHeliumTrueSec"), antihePt, track.dcaXY()); - } + else + histos.fill(HIST("tracks/helium/dca/before/fake/hDCAxyVsPtantiHeliumTrueMaterial"), antihePt, track.dcaXY()); if (track.hasTOF() && outFlagOptions.doTOFplots) { histos.fill(HIST("tracks/helium/dca/before/fake/TOF/hDCAxyVsPtantiHeliumTrueTransport"), antihePt, track.dcaXY()); - if (isWeakDecay) { + if (isWeakDecay) histos.fill(HIST("tracks/helium/dca/before/fake/TOF/hDCAxyVsPtantiHeliumTrueSec"), antihePt, track.dcaXY()); - } + else + histos.fill(HIST("tracks/helium/dca/before/fake/TOF/hDCAxyVsPtantiHeliumTrueMaterial"), antihePt, track.dcaXY()); } } } @@ -3636,13 +3700,13 @@ struct LFNucleiBATask { } } if (isDeWTPCpid) { - if (usenITSLayer && !itsClusterMap.test(nITSLayer)) + if (usenITSLayer && !itsClusterMap.test(trkqcOptions.nITSLayer)) continue; histos.fill(HIST("tracks/deuteron/dca/after/hDCAxyVsPtDeuteron"), DPt, track.dcaXY()); histos.fill(HIST("tracks/deuteron/dca/after/hDCAzVsPtDeuteron"), DPt, track.dcaZ()); } if (isAntiDeWTPCpid) { - if (usenITSLayer && !itsClusterMap.test(nITSLayer)) + if (usenITSLayer && !itsClusterMap.test(trkqcOptions.nITSLayer)) continue; histos.fill(HIST("tracks/deuteron/dca/after/hDCAxyVsPtantiDeuteron"), antiDPt, track.dcaXY()); histos.fill(HIST("tracks/deuteron/dca/after/hDCAzVsPtantiDeuteron"), antiDPt, track.dcaZ()); From 66547efe3cb41efafb60acc50a86eeac4f16d21a Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Thu, 6 Mar 2025 23:47:02 +0900 Subject: [PATCH 0575/1650] [PWGEM/PhotonMeson] update PCM tasks (#10355) --- PWGEM/Dilepton/Core/PhotonHBT.h | 284 +++++++++--------- PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h | 43 +-- PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h | 52 ++-- PWGEM/PhotonMeson/DataModel/gammaTables.h | 29 +- PWGEM/PhotonMeson/Tasks/pcmQC.cxx | 61 ++-- PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx | 111 ++++--- 6 files changed, 274 insertions(+), 306 deletions(-) diff --git a/PWGEM/Dilepton/Core/PhotonHBT.h b/PWGEM/Dilepton/Core/PhotonHBT.h index a0084fa92b2..54e2bfed037 100644 --- a/PWGEM/Dilepton/Core/PhotonHBT.h +++ b/PWGEM/Dilepton/Core/PhotonHBT.h @@ -253,17 +253,17 @@ struct PhotonHBT { struct : ConfigurableGroup { std::string prefix = "ggpaircut_group"; - Configurable applydRdZ{"applydRdZ", false, "apply dr-dz cut to avoid track splitting/merging only for kPCMPCM"}; - Configurable cfgMinDeltaR{"cfgMinDeltaR", 20.f, "min. delta-r between 2 conversion points only for kPCMPCM"}; - Configurable cfgMinDeltaZ{"cfgMinDeltaZ", 20.f, "min. delta-z between 2 conversion points only for kPCMPCM"}; + // Configurable applydRdZ{"applydRdZ", false, "apply dr-dz cut to avoid track splitting/merging only for kPCMPCM"}; + // Configurable cfgMinDeltaR{"cfgMinDeltaR", 20.f, "min. delta-r between 2 conversion points only for kPCMPCM"}; + // Configurable cfgMinDeltaZ{"cfgMinDeltaZ", 20.f, "min. delta-z between 2 conversion points only for kPCMPCM"}; Configurable applydEtadPhi_Photon{"applydEtadPhi_Photon", false, "apply deta-dphi cut to avoid track splitting/merging"}; Configurable cfgMinDeltaEta_Photon{"cfgMinDeltaEta_Photon", 0.1f, "min. delta-eta between 2 photons"}; Configurable cfgMinDeltaPhi_Photon{"cfgMinDeltaPhi_Photon", 0.3f, "min. delta-phi between 2 photons"}; - Configurable applydEtadPhi_Leg{"applydEtadPhi_Leg", false, "apply deta-dphi cut to avoid track splitting/merging"}; - Configurable cfgMinDeltaEta_Leg{"cfgMinDeltaEta_Leg", 0.1f, "min. delta-eta between 2 LS tracks"}; - Configurable cfgMinDeltaPhi_Leg{"cfgMinDeltaPhi_Leg", 0.3f, "min. delta-phi between 2 LS tracks"}; + // Configurable applydEtadPhi_Leg{"applydEtadPhi_Leg", false, "apply deta-dphi cut to avoid track splitting/merging"}; + // Configurable cfgMinDeltaEta_Leg{"cfgMinDeltaEta_Leg", 0.1f, "min. delta-eta between 2 LS tracks"}; + // Configurable cfgMinDeltaPhi_Leg{"cfgMinDeltaPhi_Leg", 0.3f, "min. delta-phi between 2 LS tracks"}; } ggpaircuts; ~PhotonHBT() @@ -478,10 +478,10 @@ struct PhotonHBT { } fRegistry.add("Pair/same/hDeltaEtaDeltaPhi_Photon", "distance between 2 photons in #eta-#varphi plane;#Delta#varphi (rad.);#Delta#eta", kTH2D, {{180, -M_PI, M_PI}, {400, -2, +2}}, true); // deta, dphi of photon momentum - fRegistry.add("Pair/same/hDeltaEtaDeltaPhi_Leg", "distance between 2 LS tracks in #eta-#varphi plane;#Delta#varphi (rad.);#Delta#eta", kTH2D, {{180, -M_PI, M_PI}, {400, -2, +2}}, true); // deta, dphi of track momentum - if constexpr (pairtype == ggHBTPairType::kPCMPCM) { - fRegistry.add("Pair/same/hDeltaRDeltaZ", "diphoton distance in RZ;#Deltar = #sqrt{(#Deltax)^{2} + (#Deltay)^{2}} (cm);|#Deltaz| (cm)", kTH2D, {{100, 0, 50}, {100, 0, 50}}, true); // dr, dz of conversion points - } + // fRegistry.add("Pair/same/hDeltaEtaDeltaPhi_Leg", "distance between 2 LS tracks in #eta-#varphi plane;#Delta#varphi (rad.);#Delta#eta", kTH2D, {{180, -M_PI, M_PI}, {400, -2, +2}}, true); // deta, dphi of track momentum + // if constexpr (pairtype == ggHBTPairType::kPCMPCM) { + // fRegistry.add("Pair/same/hDeltaRDeltaZ", "diphoton distance in RZ;#Deltar = #sqrt{(#Deltax)^{2} + (#Deltay)^{2}} (cm);|#Deltaz| (cm)", kTH2D, {{100, 0, 50}, {100, 0, 50}}, true); // dr, dz of conversion points + // } fRegistry.addClone("Pair/same/", "Pair/mix/"); } @@ -795,24 +795,24 @@ struct PhotonHBT { ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.); ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.); - float dz = g1.vz() - g2.vz(); - float dr = std::sqrt(std::pow(g1.vx() - g2.vx(), 2) + std::pow(g1.vy() - g2.vy(), 2)); - if (ggpaircuts.applydRdZ && std::pow(dz / ggpaircuts.cfgMinDeltaZ, 2) + std::pow(dr / ggpaircuts.cfgMinDeltaR, 2) < 1.f) { - continue; - } - - float deta_pos = pos1.sign() * pos1.pt() > pos2.sign() * pos2.pt() ? pos1.eta() - pos2.eta() : pos2.eta() - pos1.eta(); - float dphi_pos = pos1.sign() * pos1.pt() > pos2.sign() * pos2.pt() ? pos1.phi() - pos2.phi() : pos2.phi() - pos1.phi(); - o2::math_utils::bringToPMPi(dphi_pos); - float deta_ele = ele1.sign() * ele1.pt() > ele2.sign() * ele2.pt() ? ele1.eta() - ele2.eta() : ele2.eta() - ele1.eta(); - float dphi_ele = ele1.sign() * ele1.pt() > ele2.sign() * ele2.pt() ? ele1.phi() - ele2.phi() : ele2.phi() - ele1.phi(); - o2::math_utils::bringToPMPi(dphi_ele); - if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_pos / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_pos / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { - continue; - } - if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_ele / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_ele / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { - continue; - } + // float dz = g1.vz() - g2.vz(); + // float dr = std::sqrt(std::pow(g1.vx() - g2.vx(), 2) + std::pow(g1.vy() - g2.vy(), 2)); + // if (ggpaircuts.applydRdZ && std::pow(dz / ggpaircuts.cfgMinDeltaZ, 2) + std::pow(dr / ggpaircuts.cfgMinDeltaR, 2) < 1.f) { + // continue; + // } + + // float deta_pos = pos1.sign() * pos1.pt() > pos2.sign() * pos2.pt() ? pos1.eta() - pos2.eta() : pos2.eta() - pos1.eta(); + // float dphi_pos = pos1.sign() * pos1.pt() > pos2.sign() * pos2.pt() ? pos1.phi() - pos2.phi() : pos2.phi() - pos1.phi(); + // o2::math_utils::bringToPMPi(dphi_pos); + // float deta_ele = ele1.sign() * ele1.pt() > ele2.sign() * ele2.pt() ? ele1.eta() - ele2.eta() : ele2.eta() - ele1.eta(); + // float dphi_ele = ele1.sign() * ele1.pt() > ele2.sign() * ele2.pt() ? ele1.phi() - ele2.phi() : ele2.phi() - ele1.phi(); + // o2::math_utils::bringToPMPi(dphi_ele); + // if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_pos / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_pos / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { + // continue; + // } + // if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_ele / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_ele / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { + // continue; + // } float deta_photon = v1.Pt() > v2.Pt() ? v1.Eta() - v2.Eta() : v2.Eta() - v1.Eta(); float dphi_photon = v1.Pt() > v2.Pt() ? v1.Phi() - v2.Phi() : v2.Phi() - v1.Phi(); @@ -821,9 +821,9 @@ struct PhotonHBT { } fRegistry.fill(HIST("Pair/same/hDeltaEtaDeltaPhi_Photon"), dphi_photon, deta_photon, 1.f); // distance between 2 photons - fRegistry.fill(HIST("Pair/same/hDeltaRDeltaZ"), dr, fabs(dz), 1.f); - fRegistry.fill(HIST("Pair/same/hDeltaEtaDeltaPhi_Leg"), pos1.phi() - pos2.phi(), pos1.eta() - pos2.eta(), 1.f); // distance between 2 LS tracks - fRegistry.fill(HIST("Pair/same/hDeltaEtaDeltaPhi_Leg"), ele1.phi() - ele2.phi(), ele1.eta() - ele2.eta(), 1.f); // distance between 2 LS tracks + // fRegistry.fill(HIST("Pair/same/hDeltaRDeltaZ"), dr, fabs(dz), 1.f); + // fRegistry.fill(HIST("Pair/same/hDeltaEtaDeltaPhi_Leg"), pos1.phi() - pos2.phi(), pos1.eta() - pos2.eta(), 1.f); // distance between 2 LS tracks + // fRegistry.fill(HIST("Pair/same/hDeltaEtaDeltaPhi_Leg"), ele1.phi() - ele2.phi(), ele1.eta() - ele2.eta(), 1.f); // distance between 2 LS tracks fillPairHistogram<0>(collision, v1, v2, 1.f); ndiphoton++; @@ -918,18 +918,18 @@ struct PhotonHBT { std::pair pair_tmp = std::make_pair(std::make_pair(pos1.trackId(), ele1.trackId()), std::make_pair(pos2.trackId(), ele2.trackId())); if (std::find(used_pairs_per_collision.begin(), used_pairs_per_collision.end(), pair_tmp) == used_pairs_per_collision.end()) { - float deta_pos = pos1.sign() * pos1.pt() > pos2.sign() * pos2.pt() ? pos1.eta() - pos2.eta() : pos2.eta() - pos1.eta(); - float dphi_pos = pos1.sign() * pos1.pt() > pos2.sign() * pos2.pt() ? pos1.phi() - pos2.phi() : pos2.phi() - pos1.phi(); - o2::math_utils::bringToPMPi(dphi_pos); - float deta_ele = ele1.sign() * ele1.pt() > ele2.sign() * ele2.pt() ? ele1.eta() - ele2.eta() : ele2.eta() - ele1.eta(); - float dphi_ele = ele1.sign() * ele1.pt() > ele2.sign() * ele2.pt() ? ele1.phi() - ele2.phi() : ele2.phi() - ele1.phi(); - o2::math_utils::bringToPMPi(dphi_ele); - if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_pos / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_pos / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { - continue; - } - if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_ele / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_ele / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { - continue; - } + // float deta_pos = pos1.sign() * pos1.pt() > pos2.sign() * pos2.pt() ? pos1.eta() - pos2.eta() : pos2.eta() - pos1.eta(); + // float dphi_pos = pos1.sign() * pos1.pt() > pos2.sign() * pos2.pt() ? pos1.phi() - pos2.phi() : pos2.phi() - pos1.phi(); + // o2::math_utils::bringToPMPi(dphi_pos); + // float deta_ele = ele1.sign() * ele1.pt() > ele2.sign() * ele2.pt() ? ele1.eta() - ele2.eta() : ele2.eta() - ele1.eta(); + // float dphi_ele = ele1.sign() * ele1.pt() > ele2.sign() * ele2.pt() ? ele1.phi() - ele2.phi() : ele2.phi() - ele1.phi(); + // o2::math_utils::bringToPMPi(dphi_ele); + // if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_pos / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_pos / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { + // continue; + // } + // if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_ele / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_ele / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { + // continue; + // } float deta_photon = v1_ee.Pt() > v2_ee.Pt() ? v1_ee.Eta() - v2_ee.Eta() : v2_ee.Eta() - v1_ee.Eta(); float dphi_photon = v1_ee.Pt() > v2_ee.Pt() ? v1_ee.Phi() - v2_ee.Phi() : v2_ee.Phi() - v1_ee.Phi(); @@ -938,8 +938,8 @@ struct PhotonHBT { } fRegistry.fill(HIST("Pair/same/hDeltaEtaDeltaPhi_Photon"), dphi_photon, deta_photon, weight1 * weight2); // distance between 2 photons - fRegistry.fill(HIST("Pair/same/hDeltaEtaDeltaPhi_Leg"), dphi_pos, deta_pos, weight1 * weight2); // distance between 2 LS tracks - fRegistry.fill(HIST("Pair/same/hDeltaEtaDeltaPhi_Leg"), dphi_ele, deta_ele, weight1 * weight2); // distance between 2 LS tracks + // fRegistry.fill(HIST("Pair/same/hDeltaEtaDeltaPhi_Leg"), dphi_pos, deta_pos, weight1 * weight2); // distance between 2 LS tracks + // fRegistry.fill(HIST("Pair/same/hDeltaEtaDeltaPhi_Leg"), dphi_ele, deta_ele, weight1 * weight2); // distance between 2 LS tracks fillPairHistogram<0>(collision, v1_ee, v2_ee, weight1 * weight2); ndiphoton++; used_pairs_per_collision.emplace_back(std::make_pair(pair_tmp.first, pair_tmp.second)); @@ -1035,18 +1035,18 @@ struct PhotonHBT { ROOT::Math::PtEtaPhiMVector v_ele2(ele2.pt(), ele2.eta(), ele2.phi(), o2::constants::physics::MassElectron); ROOT::Math::PtEtaPhiMVector v2_ee = v_pos2 + v_ele2; - float deta_pos = pos1.sign() * pos1.pt() > pos2.sign() * pos2.pt() ? pos1.eta() - pos2.eta() : pos2.eta() - pos1.eta(); - float dphi_pos = pos1.sign() * pos1.pt() > pos2.sign() * pos2.pt() ? pos1.phi() - pos2.phi() : pos2.phi() - pos1.phi(); - o2::math_utils::bringToPMPi(dphi_pos); - float deta_ele = ele1.sign() * ele1.pt() > ele2.sign() * ele2.pt() ? ele1.eta() - ele2.eta() : ele2.eta() - ele1.eta(); - float dphi_ele = ele1.sign() * ele1.pt() > ele2.sign() * ele2.pt() ? ele1.phi() - ele2.phi() : ele2.phi() - ele1.phi(); - o2::math_utils::bringToPMPi(dphi_ele); - if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_pos / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_pos / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { - continue; - } - if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_ele / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_ele / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { - continue; - } + // float deta_pos = pos1.sign() * pos1.pt() > pos2.sign() * pos2.pt() ? pos1.eta() - pos2.eta() : pos2.eta() - pos1.eta(); + // float dphi_pos = pos1.sign() * pos1.pt() > pos2.sign() * pos2.pt() ? pos1.phi() - pos2.phi() : pos2.phi() - pos1.phi(); + // o2::math_utils::bringToPMPi(dphi_pos); + // float deta_ele = ele1.sign() * ele1.pt() > ele2.sign() * ele2.pt() ? ele1.eta() - ele2.eta() : ele2.eta() - ele1.eta(); + // float dphi_ele = ele1.sign() * ele1.pt() > ele2.sign() * ele2.pt() ? ele1.phi() - ele2.phi() : ele2.phi() - ele1.phi(); + // o2::math_utils::bringToPMPi(dphi_ele); + // if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_pos / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_pos / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { + // continue; + // } + // if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_ele / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_ele / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { + // continue; + // } float deta_photon = v1_gamma.Pt() > v2_ee.Pt() ? v1_gamma.Eta() - v2_ee.Eta() : v2_ee.Eta() - v1_gamma.Eta(); float dphi_photon = v1_gamma.Pt() > v2_ee.Pt() ? v1_gamma.Phi() - v2_ee.Phi() : v2_ee.Phi() - v1_gamma.Phi(); @@ -1055,8 +1055,8 @@ struct PhotonHBT { } fRegistry.fill(HIST("Pair/same/hDeltaEtaDeltaPhi_Photon"), dphi_photon, deta_photon, weight); // distance between 2 photons - fRegistry.fill(HIST("Pair/same/hDeltaEtaDeltaPhi_Leg"), dphi_pos, deta_pos, weight); - fRegistry.fill(HIST("Pair/same/hDeltaEtaDeltaPhi_Leg"), dphi_ele, deta_ele, weight); + // fRegistry.fill(HIST("Pair/same/hDeltaEtaDeltaPhi_Leg"), dphi_pos, deta_pos, weight); + // fRegistry.fill(HIST("Pair/same/hDeltaEtaDeltaPhi_Leg"), dphi_ele, deta_ele, weight); fillPairHistogram<0>(collision, v1_gamma, v2_ee, weight); ndiphoton++; @@ -1118,29 +1118,29 @@ struct PhotonHBT { ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.); ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.); - auto pos1 = g1.getPositiveLeg(); - auto ele1 = g1.getNegativeLeg(); - auto pos2 = g2.getPositiveLeg(); - auto ele2 = g2.getNegativeLeg(); - - float dz = g1.vz() - g2.vz(); - float dr = std::sqrt(std::pow(g1.vx() - g2.vx(), 2) + std::pow(g1.vy() - g2.vy(), 2)); - if (ggpaircuts.applydRdZ && std::pow(dz / ggpaircuts.cfgMinDeltaZ, 2) + std::pow(dr / ggpaircuts.cfgMinDeltaR, 2) < 1.f) { - continue; - } - - float deta_pos = pos1.Pt() > pos2.Pt() ? pos1.Eta() - pos2.Eta() : pos2.Eta() - pos1.Eta(); - float dphi_pos = pos1.Pt() > pos2.Pt() ? pos1.Phi() - pos2.Phi() : pos2.Phi() - pos1.Phi(); - o2::math_utils::bringToPMPi(dphi_pos); - float deta_ele = ele1.Pt() < ele2.Pt() ? ele1.Eta() - ele2.Eta() : ele2.Eta() - ele1.Eta(); // flipped - float dphi_ele = ele1.Pt() < ele2.Pt() ? ele1.Phi() - ele2.Phi() : ele2.Phi() - ele1.Phi(); // flipped - o2::math_utils::bringToPMPi(dphi_ele); - if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_pos / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_pos / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { - continue; - } - if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_ele / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_ele / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { - continue; - } + // auto pos1 = g1.getPositiveLeg(); + // auto ele1 = g1.getNegativeLeg(); + // auto pos2 = g2.getPositiveLeg(); + // auto ele2 = g2.getNegativeLeg(); + + // float dz = g1.vz() - g2.vz(); + // float dr = std::sqrt(std::pow(g1.vx() - g2.vx(), 2) + std::pow(g1.vy() - g2.vy(), 2)); + // if (ggpaircuts.applydRdZ && std::pow(dz / ggpaircuts.cfgMinDeltaZ, 2) + std::pow(dr / ggpaircuts.cfgMinDeltaR, 2) < 1.f) { + // continue; + // } + + // float deta_pos = pos1.Pt() > pos2.Pt() ? pos1.Eta() - pos2.Eta() : pos2.Eta() - pos1.Eta(); + // float dphi_pos = pos1.Pt() > pos2.Pt() ? pos1.Phi() - pos2.Phi() : pos2.Phi() - pos1.Phi(); + // o2::math_utils::bringToPMPi(dphi_pos); + // float deta_ele = ele1.Pt() < ele2.Pt() ? ele1.Eta() - ele2.Eta() : ele2.Eta() - ele1.Eta(); // flipped + // float dphi_ele = ele1.Pt() < ele2.Pt() ? ele1.Phi() - ele2.Phi() : ele2.Phi() - ele1.Phi(); // flipped + // o2::math_utils::bringToPMPi(dphi_ele); + // if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_pos / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_pos / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { + // continue; + // } + // if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_ele / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_ele / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { + // continue; + // } float deta_photon = v1.Pt() > v2.Pt() ? v1.Eta() - v2.Eta() : v2.Eta() - v1.Eta(); float dphi_photon = v1.Pt() > v2.Pt() ? v1.Phi() - v2.Phi() : v2.Phi() - v1.Phi(); @@ -1149,9 +1149,9 @@ struct PhotonHBT { } fRegistry.fill(HIST("Pair/mix/hDeltaEtaDeltaPhi_Photon"), dphi_photon, deta_photon, 1.f); // distance between 2 photons - fRegistry.fill(HIST("Pair/mix/hDeltaRDeltaZ"), dr, fabs(dz), 1.f); - fRegistry.fill(HIST("Pair/mix/hDeltaEtaDeltaPhi_Leg"), dphi_pos, deta_pos, 1.f); // distance between 2 LS tracks - fRegistry.fill(HIST("Pair/mix/hDeltaEtaDeltaPhi_Leg"), dphi_ele, deta_ele, 1.f); // distance between 2 LS tracks + // fRegistry.fill(HIST("Pair/mix/hDeltaRDeltaZ"), dr, fabs(dz), 1.f); + // fRegistry.fill(HIST("Pair/mix/hDeltaEtaDeltaPhi_Leg"), dphi_pos, deta_pos, 1.f); // distance between 2 LS tracks + // fRegistry.fill(HIST("Pair/mix/hDeltaEtaDeltaPhi_Leg"), dphi_ele, deta_ele, 1.f); // distance between 2 LS tracks fillPairHistogram<1>(collision, v1, v2, 1.f); } } @@ -1187,10 +1187,10 @@ struct PhotonHBT { bool is_found_neg2 = std::find(v1amb_neg_Ids.begin(), v1amb_neg_Ids.end(), g2.globalIndexPos()) != v1amb_neg_Ids.end(); // LOGF(info, "is_found_pos1 = %d, is_found_neg1 = %d, is_found_pos2 = %d, is_found_neg2 = %d", is_found_pos1, is_found_neg1, is_found_pos2, is_found_neg2); - auto pos1 = g1.getPositiveLeg(); - auto ele1 = g1.getNegativeLeg(); - auto pos2 = g2.getPositiveLeg(); - auto ele2 = g2.getNegativeLeg(); + // auto pos1 = g1.getPositiveLeg(); + // auto ele1 = g1.getNegativeLeg(); + // auto pos2 = g2.getPositiveLeg(); + // auto ele2 = g2.getNegativeLeg(); if ((g1.dfId() == g2.dfId()) && ((is_found_pos1 && is_found_pos2) || (is_found_neg1 && is_found_neg2))) { // LOGF(info, "event id = %d: same track is found. t1.globalIndex() = %d, t1.sign() = %d, t1.pt() = %f, t1.eta() = %f, t1.phi() = %f, t2.globalIndex() = %d, t2.sign() = %d, t2.pt() = %f, t2.eta() = %f, t2.phi() = %f, deta = %f, dphi = %f (rad.)", ev_id, t1.globalIndex(), t1.sign(), t1.pt(), t1.eta(), t1.phi(), t2.globalIndex(), t2.sign(), t2.pt(), t2.eta(), t2.phi(), t1.eta() - t2.eta(), t1.phi() - t2.phi()); @@ -1200,26 +1200,27 @@ struct PhotonHBT { ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), g1.mass()); ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), g2.mass()); - float deta_pos = pos1.Eta() - pos2.Eta(); - float dphi_pos = pos1.Phi() - pos2.Phi(); - o2::math_utils::bringToPMPi(dphi_pos); - float deta_ele = ele1.Eta() - ele2.Eta(); - float dphi_ele = ele1.Phi() - ele2.Phi(); - o2::math_utils::bringToPMPi(dphi_ele); - if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_pos / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_pos / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { - continue; - } - if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_ele / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_ele / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { - continue; - } + // float deta_pos = pos1.Eta() - pos2.Eta(); + // float dphi_pos = pos1.Phi() - pos2.Phi(); + // o2::math_utils::bringToPMPi(dphi_pos); + // float deta_ele = ele1.Eta() - ele2.Eta(); + // float dphi_ele = ele1.Phi() - ele2.Phi(); + // o2::math_utils::bringToPMPi(dphi_ele); + // if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_pos / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_pos / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { + // continue; + // } + // if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_ele / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_ele / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { + // continue; + // } + float deta_photon = v1.Pt() > v2.Pt() ? v1.Eta() - v2.Eta() : v2.Eta() - v1.Eta(); float dphi_photon = v1.Pt() > v2.Pt() ? v1.Phi() - v2.Phi() : v2.Phi() - v1.Phi(); if (ggpaircuts.applydEtadPhi_Photon && std::pow(deta_photon / ggpaircuts.cfgMinDeltaEta_Photon, 2) + std::pow(dphi_photon / ggpaircuts.cfgMinDeltaPhi_Photon, 2) < 1.f) { continue; } fRegistry.fill(HIST("Pair/mix/hDeltaEtaDeltaPhi_Photon"), dphi_photon, deta_photon, 1.f); // distance between 2 photons - fRegistry.fill(HIST("Pair/mix/hDeltaEtaDeltaPhi_Leg"), dphi_pos, deta_pos, 1.f); // distance between 2 LS tracks - fRegistry.fill(HIST("Pair/mix/hDeltaEtaDeltaPhi_Leg"), dphi_ele, deta_ele, 1.f); // distance between 2 LS tracks + // fRegistry.fill(HIST("Pair/mix/hDeltaEtaDeltaPhi_Leg"), dphi_pos, deta_pos, 1.f); // distance between 2 LS tracks + // fRegistry.fill(HIST("Pair/mix/hDeltaEtaDeltaPhi_Leg"), dphi_ele, deta_ele, 1.f); // distance between 2 LS tracks fillPairHistogram<1>(collision, v1, v2, 1.f); } } @@ -1247,23 +1248,23 @@ struct PhotonHBT { ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.0); // keep v1 for PCM ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), g2.mass()); - auto pos1 = g1.getPositiveLeg(); - auto ele1 = g1.getNegativeLeg(); - auto pos2 = g2.getPositiveLeg(); - auto ele2 = g2.getNegativeLeg(); - - float deta_pos = pos1.Eta() - pos2.Eta(); - float dphi_pos = pos1.Phi() - pos2.Phi(); - o2::math_utils::bringToPMPi(dphi_pos); - float deta_ele = ele1.Eta() - ele2.Eta(); - float dphi_ele = ele1.Phi() - ele2.Phi(); - o2::math_utils::bringToPMPi(dphi_ele); - if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_pos / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_pos / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { - continue; - } - if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_ele / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_ele / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { - continue; - } + // auto pos1 = g1.getPositiveLeg(); + // auto ele1 = g1.getNegativeLeg(); + // auto pos2 = g2.getPositiveLeg(); + // auto ele2 = g2.getNegativeLeg(); + + // float deta_pos = pos1.Eta() - pos2.Eta(); + // float dphi_pos = pos1.Phi() - pos2.Phi(); + // o2::math_utils::bringToPMPi(dphi_pos); + // float deta_ele = ele1.Eta() - ele2.Eta(); + // float dphi_ele = ele1.Phi() - ele2.Phi(); + // o2::math_utils::bringToPMPi(dphi_ele); + // if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_pos / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_pos / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { + // continue; + // } + // if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_ele / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_ele / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { + // continue; + // } float deta_photon = v1.Pt() > v2.Pt() ? v1.Eta() - v2.Eta() : v2.Eta() - v1.Eta(); float dphi_photon = v1.Pt() > v2.Pt() ? v1.Phi() - v2.Phi() : v2.Phi() - v1.Phi(); @@ -1271,8 +1272,8 @@ struct PhotonHBT { continue; } fRegistry.fill(HIST("Pair/mix/hDeltaEtaDeltaPhi_Photon"), dphi_photon, deta_photon, 1.f); // distance between 2 photons - fRegistry.fill(HIST("Pair/mix/hDeltaEtaDeltaPhi_Leg"), dphi_pos, deta_pos, 1.f); // distance between 2 LS tracks - fRegistry.fill(HIST("Pair/mix/hDeltaEtaDeltaPhi_Leg"), dphi_ele, deta_ele, 1.f); // distance between 2 LS tracks + // fRegistry.fill(HIST("Pair/mix/hDeltaEtaDeltaPhi_Leg"), dphi_pos, deta_pos, 1.f); // distance between 2 LS tracks + // fRegistry.fill(HIST("Pair/mix/hDeltaEtaDeltaPhi_Leg"), dphi_ele, deta_ele, 1.f); // distance between 2 LS tracks fillPairHistogram<1>(collision, v1, v2, 1.f); } } @@ -1300,32 +1301,31 @@ struct PhotonHBT { ROOT::Math::PtEtaPhiMVector v1(g2.pt(), g2.eta(), g2.phi(), 0.0); // keep v1 for PCM ROOT::Math::PtEtaPhiMVector v2(g1.pt(), g1.eta(), g1.phi(), g1.mass()); - auto pos1 = g1.getPositiveLeg(); - auto ele1 = g1.getNegativeLeg(); - auto pos2 = g2.getPositiveLeg(); - auto ele2 = g2.getNegativeLeg(); - - float deta_pos = pos1.Eta() - pos2.Eta(); - float dphi_pos = pos1.Phi() - pos2.Phi(); - o2::math_utils::bringToPMPi(dphi_pos); - float deta_ele = ele1.Eta() - ele2.Eta(); - float dphi_ele = ele1.Phi() - ele2.Phi(); - o2::math_utils::bringToPMPi(dphi_ele); - if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_pos / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_pos / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { - continue; - } - if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_ele / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_ele / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { - continue; - } + // auto pos1 = g1.getPositiveLeg(); + // auto ele1 = g1.getNegativeLeg(); + // auto pos2 = g2.getPositiveLeg(); + // auto ele2 = g2.getNegativeLeg(); + + // float deta_pos = pos1.Eta() - pos2.Eta(); + // float dphi_pos = pos1.Phi() - pos2.Phi(); + // o2::math_utils::bringToPMPi(dphi_pos); + // float deta_ele = ele1.Eta() - ele2.Eta(); + // float dphi_ele = ele1.Phi() - ele2.Phi(); + // o2::math_utils::bringToPMPi(dphi_ele); + // if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_pos / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_pos / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { + // continue; + // } + // if (ggpaircuts.applydEtadPhi_Leg && std::pow(deta_ele / ggpaircuts.cfgMinDeltaEta_Leg, 2) + std::pow(dphi_ele / ggpaircuts.cfgMinDeltaPhi_Leg, 2) < 1.f) { + // continue; + // } float deta_photon = v1.Pt() > v2.Pt() ? v1.Eta() - v2.Eta() : v2.Eta() - v1.Eta(); float dphi_photon = v1.Pt() > v2.Pt() ? v1.Phi() - v2.Phi() : v2.Phi() - v1.Phi(); if (ggpaircuts.applydEtadPhi_Photon && std::pow(deta_photon / ggpaircuts.cfgMinDeltaEta_Photon, 2) + std::pow(dphi_photon / ggpaircuts.cfgMinDeltaPhi_Photon, 2) < 1.f) { continue; } fRegistry.fill(HIST("Pair/mix/hDeltaEtaDeltaPhi_Photon"), dphi_photon, deta_photon, 1.f); // distance between 2 photons - - fRegistry.fill(HIST("Pair/mix/hDeltaEtaDeltaPhi_Leg"), dphi_pos, deta_pos, 1.f); // distance between 2 LS tracks - fRegistry.fill(HIST("Pair/mix/hDeltaEtaDeltaPhi_Leg"), dphi_ele, deta_ele, 1.f); // distance between 2 LS tracks + // fRegistry.fill(HIST("Pair/mix/hDeltaEtaDeltaPhi_Leg"), dphi_pos, deta_pos, 1.f); // distance between 2 LS tracks + // fRegistry.fill(HIST("Pair/mix/hDeltaEtaDeltaPhi_Leg"), dphi_ele, deta_ele, 1.f); // distance between 2 LS tracks fillPairHistogram<1>(collision, v1, v2, 1.f); } } diff --git a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h index cab1f820e26..11ea121ccfa 100644 --- a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h +++ b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h @@ -131,7 +131,6 @@ struct Pi0EtaToGammaGamma { Configurable cfg_require_v0_with_itstpc{"cfg_require_v0_with_itstpc", false, "flag to select V0s with ITS-TPC matched tracks"}; Configurable cfg_require_v0_with_itsonly{"cfg_require_v0_with_itsonly", false, "flag to select V0s with ITSonly tracks"}; Configurable cfg_require_v0_with_tpconly{"cfg_require_v0_with_tpconly", false, "flag to select V0s with TPConly tracks"}; - Configurable cfg_require_v0_on_wwire_ib{"cfg_require_v0_on_wwire_ib", false, "flag to select V0s on W wires ITSib"}; Configurable cfg_min_pt_v0{"cfg_min_pt_v0", 0.1, "min pT for v0 photons at PV"}; Configurable cfg_max_pt_v0{"cfg_max_pt_v0", 1e+10, "max pT for v0 photons at PV"}; Configurable cfg_min_eta_v0{"cfg_min_eta_v0", -0.8, "min eta for v0 photons at PV"}; @@ -246,8 +245,6 @@ struct Pi0EtaToGammaGamma { o2::aod::pwgem::photonmeson::utils::eventhistogram::addEventHistograms(&fRegistry); if constexpr (pairtype == PairType::kPCMDalitzEE) { o2::aod::pwgem::photonmeson::utils::nmhistogram::addNMHistograms(&fRegistry, false, "ee#gamma"); - } else if constexpr (pairtype == PairType::kPCMDalitzMuMu) { - o2::aod::pwgem::photonmeson::utils::nmhistogram::addNMHistograms(&fRegistry, false, "#mu#mu#gamma"); } else { o2::aod::pwgem::photonmeson::utils::nmhistogram::addNMHistograms(&fRegistry, false, "#gamma#gamma"); } @@ -361,38 +358,14 @@ struct Pi0EtaToGammaGamma { fV0PhotonCut.SetChi2PerClusterTPC(0.0, pcmcuts.cfg_max_chi2tpc); fV0PhotonCut.SetTPCNsigmaElRange(pcmcuts.cfg_min_TPCNsigmaEl, pcmcuts.cfg_max_TPCNsigmaEl); fV0PhotonCut.SetChi2PerClusterITS(-1e+10, pcmcuts.cfg_max_chi2its); - fV0PhotonCut.SetDisableITSonly(pcmcuts.cfg_disable_itsonly_track); - fV0PhotonCut.SetDisableTPConly(pcmcuts.cfg_disable_tpconly_track); - - if (pcmcuts.cfg_reject_v0_on_itsib) { - fV0PhotonCut.SetNClustersITS(2, 4); - } else { - fV0PhotonCut.SetNClustersITS(0, 7); - } + fV0PhotonCut.SetNClustersITS(0, 7); fV0PhotonCut.SetMeanClusterSizeITSob(0.0, 16.0); fV0PhotonCut.SetIsWithinBeamPipe(pcmcuts.cfg_require_v0_with_correct_xz); - - if (pcmcuts.cfg_require_v0_with_itstpc) { - fV0PhotonCut.SetRequireITSTPC(true); - fV0PhotonCut.SetMaxPCA(1.0); - fV0PhotonCut.SetRxyRange(4, 40); - } - if (pcmcuts.cfg_require_v0_with_itsonly) { - fV0PhotonCut.SetRequireITSonly(true); - fV0PhotonCut.SetMaxPCA(1.0); - fV0PhotonCut.SetRxyRange(4, 24); - } - if (pcmcuts.cfg_require_v0_with_tpconly) { - fV0PhotonCut.SetRequireTPConly(true); - fV0PhotonCut.SetMaxPCA(3.0); - fV0PhotonCut.SetRxyRange(36, 90); - } - if (pcmcuts.cfg_require_v0_on_wwire_ib) { - fV0PhotonCut.SetMaxPCA(0.3); - fV0PhotonCut.SetOnWwireIB(true); - fV0PhotonCut.SetOnWwireOB(false); - fV0PhotonCut.SetRxyRange(7, 14); - } + fV0PhotonCut.SetDisableITSonly(pcmcuts.cfg_disable_itsonly_track); + fV0PhotonCut.SetDisableTPConly(pcmcuts.cfg_disable_tpconly_track); + fV0PhotonCut.SetRequireITSTPC(pcmcuts.cfg_require_v0_with_itstpc); + fV0PhotonCut.SetRequireITSonly(pcmcuts.cfg_require_v0_with_itsonly); + fV0PhotonCut.SetRequireTPConly(pcmcuts.cfg_require_v0_with_tpconly); } void DefineDileptonCut() @@ -824,7 +797,7 @@ struct Pi0EtaToGammaGamma { for (const auto& g2 : photons2_from_event_pool) { ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.); ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.); - if constexpr (pairtype == PairType::kPCMDalitzEE || pairtype == PairType::kPCMDalitzMuMu) { //[photon from event1, dilepton from event2] and [photon from event2, dilepton from event1] + if constexpr (pairtype == PairType::kPCMDalitzEE) { //[photon from event1, dilepton from event2] and [photon from event2, dilepton from event1] v2.SetM(g2.mass()); } ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; @@ -850,7 +823,7 @@ struct Pi0EtaToGammaGamma { for (const auto& g2 : photons1_from_event_pool) { ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.); ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.); - if constexpr (pairtype == PairType::kPCMDalitzEE || pairtype == PairType::kPCMDalitzMuMu) { //[photon from event1, dilepton from event2] and [photon from event2, dilepton from event1] + if constexpr (pairtype == PairType::kPCMDalitzEE) { //[photon from event1, dilepton from event2] and [photon from event2, dilepton from event1] v1.SetM(g1.mass()); } ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; diff --git a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h index b7b90e0f382..4b71ae8265f 100644 --- a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h +++ b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h @@ -91,6 +91,7 @@ struct Pi0EtaToGammaGammaMC { Configurable cfgCentMax{"cfgCentMax", 999, "max. centrality"}; Configurable maxY_rec{"maxY_rec", 0.9, "maximum rapidity for reconstructed particles"}; Configurable fd_k0s_to_pi0{"fd_k0s_pi0", "1.0", "feed down correction to pi0"}; + Configurable cfgRequireTrueAssociation{"cfgRequireTrueAssociation", false, "flag to require true mc collision association"}; EMPhotonEventCut fEMEventCut; struct : ConfigurableGroup { @@ -118,7 +119,6 @@ struct Pi0EtaToGammaGammaMC { Configurable cfg_require_v0_with_itstpc{"cfg_require_v0_with_itstpc", false, "flag to select V0s with ITS-TPC matched tracks"}; Configurable cfg_require_v0_with_itsonly{"cfg_require_v0_with_itsonly", false, "flag to select V0s with ITSonly tracks"}; Configurable cfg_require_v0_with_tpconly{"cfg_require_v0_with_tpconly", false, "flag to select V0s with TPConly tracks"}; - Configurable cfg_require_v0_on_wwire_ib{"cfg_require_v0_on_wwire_ib", false, "flag to select V0s on W wires ITSib"}; Configurable cfg_min_pt_v0{"cfg_min_pt_v0", 0.1, "min pT for v0 photons at PV"}; Configurable cfg_max_pt_v0{"cfg_max_pt_v0", 1e+10, "max pT for v0 photons at PV"}; Configurable cfg_min_eta_v0{"cfg_min_eta_v0", -0.8, "min eta for v0 photons at PV"}; @@ -216,8 +216,6 @@ struct Pi0EtaToGammaGammaMC { o2::aod::pwgem::photonmeson::utils::eventhistogram::addEventHistograms(&fRegistry); if constexpr (pairtype == PairType::kPCMDalitzEE) { o2::aod::pwgem::photonmeson::utils::nmhistogram::addNMHistograms(&fRegistry, true, "ee#gamma"); - } else if constexpr (pairtype == PairType::kPCMDalitzMuMu) { - o2::aod::pwgem::photonmeson::utils::nmhistogram::addNMHistograms(&fRegistry, true, "#mu#mu#gamma"); } else { o2::aod::pwgem::photonmeson::utils::nmhistogram::addNMHistograms(&fRegistry, true, "#gamma#gamma"); } @@ -322,38 +320,14 @@ struct Pi0EtaToGammaGammaMC { fV0PhotonCut.SetChi2PerClusterTPC(0.0, pcmcuts.cfg_max_chi2tpc); fV0PhotonCut.SetTPCNsigmaElRange(pcmcuts.cfg_min_TPCNsigmaEl, pcmcuts.cfg_max_TPCNsigmaEl); fV0PhotonCut.SetChi2PerClusterITS(-1e+10, pcmcuts.cfg_max_chi2its); - fV0PhotonCut.SetDisableITSonly(pcmcuts.cfg_disable_itsonly_track); - fV0PhotonCut.SetDisableTPConly(pcmcuts.cfg_disable_tpconly_track); - - if (pcmcuts.cfg_reject_v0_on_itsib) { - fV0PhotonCut.SetNClustersITS(2, 4); - } else { - fV0PhotonCut.SetNClustersITS(0, 7); - } + fV0PhotonCut.SetNClustersITS(0, 7); fV0PhotonCut.SetMeanClusterSizeITSob(0.0, 16.0); fV0PhotonCut.SetIsWithinBeamPipe(pcmcuts.cfg_require_v0_with_correct_xz); - - if (pcmcuts.cfg_require_v0_with_itstpc) { - fV0PhotonCut.SetRequireITSTPC(true); - fV0PhotonCut.SetMaxPCA(1.0); - fV0PhotonCut.SetRxyRange(4, 40); - } - if (pcmcuts.cfg_require_v0_with_itsonly) { - fV0PhotonCut.SetRequireITSonly(true); - fV0PhotonCut.SetMaxPCA(1.0); - fV0PhotonCut.SetRxyRange(4, 24); - } - if (pcmcuts.cfg_require_v0_with_tpconly) { - fV0PhotonCut.SetRequireTPConly(true); - fV0PhotonCut.SetMaxPCA(3.0); - fV0PhotonCut.SetRxyRange(36, 90); - } - if (pcmcuts.cfg_require_v0_on_wwire_ib) { - fV0PhotonCut.SetMaxPCA(0.3); - fV0PhotonCut.SetOnWwireIB(true); - fV0PhotonCut.SetOnWwireOB(false); - fV0PhotonCut.SetRxyRange(7, 14); - } + fV0PhotonCut.SetDisableITSonly(pcmcuts.cfg_disable_itsonly_track); + fV0PhotonCut.SetDisableTPConly(pcmcuts.cfg_disable_tpconly_track); + fV0PhotonCut.SetRequireITSTPC(pcmcuts.cfg_require_v0_with_itstpc); + fV0PhotonCut.SetRequireITSonly(pcmcuts.cfg_require_v0_with_itsonly); + fV0PhotonCut.SetRequireTPConly(pcmcuts.cfg_require_v0_with_tpconly); } void DefineDileptonCut() @@ -538,9 +512,15 @@ struct Pi0EtaToGammaGammaMC { if (pi0id > 0) { auto pi0mc = mcparticles.iteratorAt(pi0id); + if (cfgRequireTrueAssociation && (pi0mc.emmceventId() != collision.emmceventId())) { + continue; + } o2::aod::pwgem::photonmeson::utils::nmhistogram::fillTruePairInfo(&fRegistry, v12, pi0mc, mcparticles, mccollisions, f1fd_k0s_to_pi0, collision.weight()); } else if (etaid > 0) { auto etamc = mcparticles.iteratorAt(etaid); + if (cfgRequireTrueAssociation && (etamc.emmceventId() != collision.emmceventId())) { + continue; + } o2::aod::pwgem::photonmeson::utils::nmhistogram::fillTruePairInfo(&fRegistry, v12, etamc, mcparticles, mccollisions, f1fd_k0s_to_pi0, collision.weight()); } } // end of pairing loop @@ -598,9 +578,15 @@ struct Pi0EtaToGammaGammaMC { } if (pi0id > 0) { auto pi0mc = mcparticles.iteratorAt(pi0id); + if (cfgRequireTrueAssociation && (pi0mc.emmceventId() != collision.emmceventId())) { + continue; + } o2::aod::pwgem::photonmeson::utils::nmhistogram::fillTruePairInfo(&fRegistry, veeg, pi0mc, mcparticles, mccollisions, f1fd_k0s_to_pi0, collision.weight()); } else if (etaid > 0) { auto etamc = mcparticles.iteratorAt(etaid); + if (cfgRequireTrueAssociation && (etamc.emmceventId() != collision.emmceventId())) { + continue; + } o2::aod::pwgem::photonmeson::utils::nmhistogram::fillTruePairInfo(&fRegistry, veeg, etamc, mcparticles, mccollisions, f1fd_k0s_to_pi0, collision.weight()); } } // end of dielectron loop diff --git a/PWGEM/PhotonMeson/DataModel/gammaTables.h b/PWGEM/PhotonMeson/DataModel/gammaTables.h index f86482794bf..0453e71814a 100644 --- a/PWGEM/PhotonMeson/DataModel/gammaTables.h +++ b/PWGEM/PhotonMeson/DataModel/gammaTables.h @@ -245,6 +245,31 @@ DECLARE_SOA_DYNAMIC_COLUMN(Eta, eta, [](float px, float py, float pz) -> float { DECLARE_SOA_DYNAMIC_COLUMN(Phi, phi, [](float px, float py) -> float { return RecoDecay::phi(px, py); }); DECLARE_SOA_DYNAMIC_COLUMN(P, p, [](float px, float py, float pz) -> float { return RecoDecay::sqrtSumOfSquares(px, py, pz); }); DECLARE_SOA_DYNAMIC_COLUMN(V0Radius, v0radius, [](float vx, float vy) -> float { return RecoDecay::sqrtSumOfSquares(vx, vy); }); +DECLARE_SOA_DYNAMIC_COLUMN(CosPAXY, cosPAXY, [](float px, float py, float vx, float vy, float pvx, float pvy) -> float { + float lx = vx - pvx; // flight length X + float ly = vy - pvy; // flight length Y + float cospaXY = RecoDecay::dotProd(std::array{lx, ly}, std::array{px, py}) / (RecoDecay::sqrtSumOfSquares(lx, ly) * RecoDecay::sqrtSumOfSquares(px, py)); + if (cospaXY < -1.) { + return -1.; + } else if (cospaXY > 1.) { + return 1.; + } + return cospaXY; +}); +DECLARE_SOA_DYNAMIC_COLUMN(CosPARZ, cosPARZ, [](float px, float py, float pz, float vx, float vy, float vz, float pvx, float pvy, float pvz) -> float { + float lx = vx - pvx; // flight length X + float ly = vy - pvy; // flight length Y + float lz = vz - pvz; // flight length Z + float lt = RecoDecay::sqrtSumOfSquares(lx, ly); // flight length R, i.e. transverse plane. + float pt = RecoDecay::sqrtSumOfSquares(px, py); + float cospaRZ = RecoDecay::dotProd(std::array{lt, lz}, std::array{pt, pz}) / (RecoDecay::sqrtSumOfSquares(lt, lz) * RecoDecay::sqrtSumOfSquares(pt, pz)); + if (cospaRZ < -1.) { + return -1.; + } else if (cospaRZ > 1.) { + return 1.; + } + return cospaRZ; +}); } // namespace v0photonkf DECLARE_SOA_TABLE(V0PhotonsKF, "AOD", "V0PHOTONKF", //! o2::soa::Index<>, v0photonkf::CollisionId, v0photonkf::V0Id, v0photonkf::PosTrackId, v0photonkf::NegTrackId, @@ -262,7 +287,9 @@ DECLARE_SOA_TABLE(V0PhotonsKF, "AOD", "V0PHOTONKF", //! v0photonkf::Eta, v0photonkf::Phi, v0photonkf::P, - v0photonkf::V0Radius); + v0photonkf::V0Radius, + v0photonkf::CosPAXY, + v0photonkf::CosPARZ); // iterators using V0PhotonKF = V0PhotonsKF::iterator; diff --git a/PWGEM/PhotonMeson/Tasks/pcmQC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQC.cxx index 6768e65bec3..ccc28ed652e 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQC.cxx @@ -73,7 +73,6 @@ struct PCMQC { Configurable cfg_require_v0_with_itstpc{"cfg_require_v0_with_itstpc", false, "flag to select V0s with ITS-TPC matched tracks"}; Configurable cfg_require_v0_with_itsonly{"cfg_require_v0_with_itsonly", false, "flag to select V0s with ITSonly tracks"}; Configurable cfg_require_v0_with_tpconly{"cfg_require_v0_with_tpconly", false, "flag to select V0s with TPConly tracks"}; - Configurable cfg_require_v0_on_wwire_ib{"cfg_require_v0_on_wwire_ib", false, "flag to select V0s on W wires ITSib"}; Configurable cfg_min_pt_v0{"cfg_min_pt_v0", 0.1, "min pT for v0 photons at PV"}; Configurable cfg_max_pt_v0{"cfg_max_pt_v0", 1e+10, "max pT for v0 photons at PV"}; Configurable cfg_min_eta_v0{"cfg_min_eta_v0", -0.8, "min eta for v0 photons at PV"}; @@ -138,12 +137,12 @@ struct PCMQC { fRegistry.add("V0/hPt", "pT;p_{T,#gamma} (GeV/c)", kTH1F, {{2000, 0.0f, 20}}, false); fRegistry.add("V0/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{90, 0, 2 * M_PI}, {200, -1.0f, 1.0f}}, false); fRegistry.add("V0/hRadius", "V0Radius; radius in Z (cm);radius in XY (cm)", kTH2F, {{200, -100, 100}, {200, 0.0f, 100.0f}}, false); - fRegistry.add("V0/hCosPA", "V0CosPA;cosine pointing angle", kTH1F, {{100, 0.99f, 1.0f}}, false); - fRegistry.add("V0/hCosPA_Rxy", "cos PA vs. R_{xy};R_{xy} (cm);cosine pointing angle", kTH2F, {{200, 0.f, 100.f}, {100, 0.99f, 1.0f}}, false); + fRegistry.add("V0/hCosPA", "V0CosPA;cosine pointing angle in 3D", kTH1F, {{100, 0.99f, 1.0f}}, false); + fRegistry.add("V0/hCosPAXY", "V0CosPA;cosine pointing angle in XY", kTH1F, {{100, 0.99f, 1.0f}}, false); + fRegistry.add("V0/hCosPARZ", "V0CosPA;cosine pointing angle in RZ", kTH1F, {{100, 0.99f, 1.0f}}, false); fRegistry.add("V0/hPCA", "distance between 2 legs;PCA (cm)", kTH1F, {{500, 0.0f, 5.0f}}, false); - fRegistry.add("V0/hPCA_Rxy", "distance between 2 legs vs. R_{xy};R_{xy} (cm);PCA (cm)", kTH2F, {{200, 0.f, 100.f}, {500, 0.0f, 5.0f}}, false); - fRegistry.add("V0/hPCA_CosPA", "distance between 2 legs vs. cosPA;cosine of pointing angle;PCA (cm)", kTH2F, {{100, 0.99f, 1.f}, {500, 0.0f, 5.0f}}, false); fRegistry.add("V0/hDCAxyz", "DCA to PV;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -5.f, +5.f}, {200, -5.f, +5.f}}, false); + fRegistry.add("V0/hDCAz_Pt", "DCA_{z} to PV vs. p_{T};DCA_{z} (cm);p_{T} (GeV/c)", kTH2F, {{200, -5.f, +5.f}, {2000, 0.0f, 20}}, false); fRegistry.add("V0/hAPplot", "AP plot;#alpha;q_{T} (GeV/c)", kTH2F, {{200, -1.0f, +1.0f}, {250, 0.0f, 0.25f}}, false); fRegistry.add("V0/hMassGamma", "hMassGamma;R_{xy} (cm);m_{ee} (GeV/c^{2})", kTH2F, {{200, 0.0f, 100.0f}, {100, 0.0f, 0.1f}}, false); fRegistry.add("V0/hGammaRxy", "conversion point in XY;V_{x} (cm);V_{y} (cm)", kTH2F, {{400, -100.0f, 100.0f}, {400, -100.0f, 100.0f}}, false); @@ -157,8 +156,8 @@ struct PCMQC { fRegistry.add("V0/hEtaResolution", "#eta resolution;p_{#gamma} (GeV/c);#Delta#eta", kTH2F, {{1000, 0.0f, 10}, {100, 0, 0.01}}, false); fRegistry.add("V0/hThetaResolution", "#theta resolution;p_{#gamma} (GeV/c);#Delta#theta (rad.)", kTH2F, {{1000, 0.0f, 10}, {100, 0, 0.01}}, false); fRegistry.add("V0/hPhiResolution", "#varphi resolution;p_{#gamma} (GeV/c);#Delta#varphi (rad.)", kTH2F, {{1000, 0.0f, 10}, {100, 0, 0.01}}, false); + fRegistry.add("V0/hsConvPoint", "photon conversion point;r_{xy} (cm);#varphi (rad.);#eta;", kTHnSparseF, {{100, 0.0f, 100}, {90, 0, 2 * M_PI}, {40, -2, +2}}, false); fRegistry.add("V0/hNgamma", "Number of #gamma candidates per collision", kTH1F, {{101, -0.5f, 100.5f}}); - fRegistry.add("V0/hDCAz_Pt", "DCA to PV vs. p_{T} (GeV/c);DCA_{z} (cm);p_{T} (GeV/c)", kTH2F, {{200, -5.f, +5.f}, {1000, 0.0f, 10}}, false); // v0leg info fRegistry.add("V0Leg/hPt", "pT;p_{T,e} (GeV/c)", kTH1F, {{1000, 0.0f, 10}}, false); @@ -225,34 +224,14 @@ struct PCMQC { fV0PhotonCut.SetChi2PerClusterTPC(0.0, pcmcuts.cfg_max_chi2tpc); fV0PhotonCut.SetTPCNsigmaElRange(pcmcuts.cfg_min_TPCNsigmaEl, pcmcuts.cfg_max_TPCNsigmaEl); fV0PhotonCut.SetChi2PerClusterITS(-1e+10, pcmcuts.cfg_max_chi2its); - fV0PhotonCut.SetDisableITSonly(pcmcuts.cfg_disable_itsonly_track); - fV0PhotonCut.SetDisableTPConly(pcmcuts.cfg_disable_tpconly_track); - - if (pcmcuts.cfg_reject_v0_on_itsib) { - fV0PhotonCut.SetNClustersITS(2, 4); - } else { - fV0PhotonCut.SetNClustersITS(0, 7); - } + fV0PhotonCut.SetNClustersITS(0, 7); fV0PhotonCut.SetMeanClusterSizeITSob(0.0, 16.0); fV0PhotonCut.SetIsWithinBeamPipe(pcmcuts.cfg_require_v0_with_correct_xz); - - if (pcmcuts.cfg_require_v0_with_itstpc) { - fV0PhotonCut.SetRequireITSTPC(true); - fV0PhotonCut.SetRxyRange(4, 40); - } - if (pcmcuts.cfg_require_v0_with_itsonly) { - fV0PhotonCut.SetRequireITSonly(true); - fV0PhotonCut.SetRxyRange(4, 24); - } - if (pcmcuts.cfg_require_v0_with_tpconly) { - fV0PhotonCut.SetRequireTPConly(true); - fV0PhotonCut.SetRxyRange(32, 90); - } - if (pcmcuts.cfg_require_v0_on_wwire_ib) { - fV0PhotonCut.SetOnWwireIB(true); - fV0PhotonCut.SetOnWwireOB(false); - fV0PhotonCut.SetRxyRange(7, 14); - } + fV0PhotonCut.SetDisableITSonly(pcmcuts.cfg_disable_itsonly_track); + fV0PhotonCut.SetDisableTPConly(pcmcuts.cfg_disable_tpconly_track); + fV0PhotonCut.SetRequireITSTPC(pcmcuts.cfg_require_v0_with_itstpc); + fV0PhotonCut.SetRequireITSonly(pcmcuts.cfg_require_v0_with_itsonly); + fV0PhotonCut.SetRequireTPConly(pcmcuts.cfg_require_v0_with_tpconly); } template @@ -295,18 +274,18 @@ struct PCMQC { fRegistry.fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hMultFT0MvsMultNTracksPV"), collision.multFT0A() + collision.multFT0C(), collision.multNTracksPV()); } - template - void fillV0Info(TV0 const& v0) + template + void fillV0Info(TCollision const& collision, TV0 const& v0) { fRegistry.fill(HIST("V0/hPt"), v0.pt()); fRegistry.fill(HIST("V0/hEtaPhi"), v0.phi(), v0.eta()); fRegistry.fill(HIST("V0/hRadius"), v0.vz(), v0.v0radius()); fRegistry.fill(HIST("V0/hCosPA"), v0.cospa()); - fRegistry.fill(HIST("V0/hCosPA_Rxy"), v0.v0radius(), v0.cospa()); + fRegistry.fill(HIST("V0/hCosPAXY"), v0.cosPAXY(collision.posX(), collision.posY())); + fRegistry.fill(HIST("V0/hCosPARZ"), v0.cosPARZ(collision.posX(), collision.posY(), collision.posZ())); fRegistry.fill(HIST("V0/hPCA"), v0.pca()); - fRegistry.fill(HIST("V0/hPCA_CosPA"), v0.cospa(), v0.pca()); - fRegistry.fill(HIST("V0/hPCA_Rxy"), v0.v0radius(), v0.pca()); fRegistry.fill(HIST("V0/hDCAxyz"), v0.dcaXYtopv(), v0.dcaZtopv()); + fRegistry.fill(HIST("V0/hDCAz_Pt"), v0.dcaZtopv(), v0.pt()); fRegistry.fill(HIST("V0/hAPplot"), v0.alpha(), v0.qtarm()); fRegistry.fill(HIST("V0/hMassGamma"), v0.v0radius(), v0.mGamma()); fRegistry.fill(HIST("V0/hGammaRxy"), v0.vx(), v0.vy()); @@ -320,7 +299,11 @@ struct PCMQC { fRegistry.fill(HIST("V0/hEtaResolution"), v0.p(), getEtaResolution(v0)); fRegistry.fill(HIST("V0/hThetaResolution"), v0.p(), getThetaResolution(v0)); fRegistry.fill(HIST("V0/hPhiResolution"), v0.p(), getPhiResolution(v0)); - fRegistry.fill(HIST("V0/hDCAz_Pt"), v0.dcaZtopv(), v0.pt()); + + float phi_cp = atan2(v0.vy(), v0.vx()); + o2::math_utils::bringTo02Pi(phi_cp); + float eta_cp = std::atanh(v0.vz() / std::sqrt(std::pow(v0.vx(), 2) + std::pow(v0.vy(), 2) + std::pow(v0.vz(), 2))); + fRegistry.fill(HIST("V0/hsConvPoint"), v0.v0radius(), phi_cp, eta_cp); } template @@ -381,7 +364,7 @@ struct PCMQC { if (!fV0PhotonCut.IsSelected(v0)) { continue; } - fillV0Info(v0); + fillV0Info(collision, v0); for (auto& leg : {pos, ele}) { fillV0LegInfo(leg); } diff --git a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx index 227966bbacb..e3f7ab23b56 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx @@ -58,6 +58,7 @@ struct PCMQCMC { Configurable maxRgen{"maxRgen", 90.f, "maximum radius for generated particles"}; Configurable margin_z_mc{"margin_z_mc", 7.0, "margin for z cut in cm for MC"}; + Configurable cfgRequireTrueAssociation{"cfgRequireTrueAssociation", false, "flag to require true mc collision association"}; EMPhotonEventCut fEMEventCut; struct : ConfigurableGroup { @@ -87,7 +88,6 @@ struct PCMQCMC { Configurable cfg_require_v0_with_itstpc{"cfg_require_v0_with_itstpc", false, "flag to select V0s with ITS-TPC matched tracks"}; Configurable cfg_require_v0_with_itsonly{"cfg_require_v0_with_itsonly", false, "flag to select V0s with ITSonly tracks"}; Configurable cfg_require_v0_with_tpconly{"cfg_require_v0_with_tpconly", false, "flag to select V0s with TPConly tracks"}; - Configurable cfg_require_v0_on_wwire_ib{"cfg_require_v0_on_wwire_ib", false, "flag to select V0s on W wires ITSib"}; Configurable cfg_min_pt_v0{"cfg_min_pt_v0", 0.1, "min pT for v0 photons at PV"}; Configurable cfg_max_pt_v0{"cfg_max_pt_v0", 1e+10, "max pT for v0 photons at PV"}; Configurable cfg_min_eta_v0{"cfg_min_eta_v0", -0.8, "min eta for v0 photons at PV"}; @@ -144,12 +144,13 @@ struct PCMQCMC { if (doprocessGen) { fRegistry.add("Generated/hPt", "pT;p_{T} (GeV/c)", kTH1F, {axis_pt}, true); fRegistry.add("Generated/hPtY", "Generated info", kTH2F, {axis_pt, axis_rapidity}, true); - fRegistry.add("Generated/hPt_ConvertedPhoton", "converted photon pT;p_{T} (GeV/c)", kTH1F, {axis_pt}, true); - fRegistry.add("Generated/hY_ConvertedPhoton", "converted photon y;rapidity y", kTH1F, {{40, -2.0f, 2.0f}}, true); - fRegistry.add("Generated/hPhi_ConvertedPhoton", "converted photon #varphi;#varphi (rad.)", kTH1F, {{180, 0, 2 * M_PI}}, true); - fRegistry.add("Generated/hPhotonRxy", "conversion point in XY MC;V_{x} (cm);V_{y} (cm)", kTH2F, {{800, -100.0f, 100.0f}, {800, -100.0f, 100.0f}}, true); - fRegistry.add("Generated/hPhotonRZ", "conversion point in RZ MC;V_{z} (cm);R_{xy} (cm)", kTH2F, {{400, -100.0f, 100.0f}, {400, 0.f, 100.0f}}, true); - fRegistry.add("Generated/hPhotonPhivsRxy", "conversion point of #varphi vs. R_{xy} MC;#varphi (rad.);R_{xy} (cm);N_{e}", kTH2F, {{360, 0.0f, 2 * M_PI}, {400, 0, 100}}, true); + fRegistry.add("Generated/hPt_ConversionPhoton", "converted photon pT;p_{T} (GeV/c)", kTH1F, {axis_pt}, true); + fRegistry.add("Generated/hY_ConversionPhoton", "converted photon y;rapidity y", kTH1F, {{40, -2.0f, 2.0f}}, true); + fRegistry.add("Generated/hPhi_ConversionPhoton", "converted photon #varphi;#varphi (rad.)", kTH1F, {{180, 0, 2 * M_PI}}, true); + fRegistry.add("Generated/hXY", "conversion point in XY MC;V_{x} (cm);V_{y} (cm)", kTH2F, {{800, -100.0f, 100.0f}, {800, -100.0f, 100.0f}}, true); + fRegistry.add("Generated/hRZ", "conversion point in RZ MC;V_{z} (cm);R_{xy} (cm)", kTH2F, {{400, -100.0f, 100.0f}, {400, 0.f, 100.0f}}, true); + fRegistry.add("Generated/hRPhi", "conversion point of #varphi vs. R_{xy} MC;#varphi (rad.);R_{xy} (cm);N_{e}", kTH2F, {{360, 0.0f, 2 * M_PI}, {400, 0, 100}}, true); + fRegistry.add("Generated/hsConvPoint", "photon conversion point;r_{xy} (cm);#varphi (rad.);#eta;", kTHnSparseF, {{100, 0.0f, 100}, {90, 0, 2 * M_PI}, {40, -2, +2}}, true); } // event info @@ -180,12 +181,12 @@ struct PCMQCMC { fRegistry.add("V0/primary/hPt", "pT;p_{T,#gamma} (GeV/c)", kTH1F, {{2000, 0.0f, 20}}, false); fRegistry.add("V0/primary/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{90, 0, 2 * M_PI}, {200, -1.0f, 1.0f}}, false); fRegistry.add("V0/primary/hRadius", "V0Radius; radius in Z (cm);radius in XY (cm)", kTH2F, {{200, -100, 100}, {200, 0.0f, 100.0f}}, false); - fRegistry.add("V0/primary/hCosPA", "V0CosPA;cosine pointing angle", kTH1F, {{100, 0.99f, 1.0f}}, false); - fRegistry.add("V0/primary/hCosPA_Rxy", "cos PA vs. R_{xy};R_{xy} (cm);cosine pointing angle", kTH2F, {{200, 0.f, 100.f}, {100, 0.99f, 1.0f}}, false); + fRegistry.add("V0/primary/hCosPA", "V0CosPA;cosine pointing angle in 3D", kTH1F, {{100, 0.99f, 1.0f}}, false); + fRegistry.add("V0/primary/hCosPAXY", "V0CosPA;cosine pointing angle in XY", kTH1F, {{100, 0.99f, 1.0f}}, false); + fRegistry.add("V0/primary/hCosPARZ", "V0CosPA;cosine pointing angle in RZ", kTH1F, {{100, 0.99f, 1.0f}}, false); fRegistry.add("V0/primary/hPCA", "distance between 2 legs;PCA (cm)", kTH1F, {{500, 0.0f, 5.0f}}, false); - fRegistry.add("V0/primary/hPCA_Rxy", "distance between 2 legs vs. R_{xy};R_{xy} (cm);PCA (cm)", kTH2F, {{200, 0.f, 100.f}, {500, 0.0f, 5.0f}}, false); - fRegistry.add("V0/primary/hPCA_CosPA", "distance between 2 legs vs. cosPA;cosine of pointing angle;PCA (cm)", kTH2F, {{100, 0.99f, 1.f}, {500, 0.0f, 5.0f}}, false); fRegistry.add("V0/primary/hDCAxyz", "DCA to PV;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -5.f, +5.f}, {200, -5.f, +5.f}}, false); + fRegistry.add("V0/primary/hDCAz_Pt", "DCA_{z} to PV vs. p_{T};DCA_{z} (cm);p_{T} (GeV/c)", kTH2F, {{200, -5.f, +5.f}, {2000, 0.0f, 20}}, false); fRegistry.add("V0/primary/hAPplot", "AP plot;#alpha;q_{T} (GeV/c)", kTH2F, {{200, -1.0f, +1.0f}, {250, 0.0f, 0.25f}}, false); fRegistry.add("V0/primary/hMassGamma", "hMassGamma;R_{xy} (cm);m_{ee} (GeV/c^{2})", kTH2F, {{200, 0.0f, 100.0f}, {100, 0.0f, 0.1f}}, false); fRegistry.add("V0/primary/hGammaRxy", "conversion point in XY;V_{x} (cm);V_{y} (cm)", kTH2F, {{400, -100.0f, 100.0f}, {400, -100.0f, 100.0f}}, false); @@ -208,8 +209,7 @@ struct PCMQCMC { fRegistry.add("V0/primary/hPtGen_DeltaPhi", "photon #varphi resolution;p_{T}^{gen} (GeV/c);#varphi^{rec} - #varphi^{gen} (rad.)", kTH2F, {{1000, 0, 10}, {400, -1.0f, 1.0f}}, true); fRegistry.add("V0/primary/hXY_Photon_MC", "X vs. Y of true photon conversion point.;X (cm);Y (cm)", kTH2F, {{400, -100.0f, +100}, {400, -100, +100}}, true); fRegistry.add("V0/primary/hRZ_Photon_MC", "R vs. Z of true photon conversion point;Z (cm);R_{xy} (cm)", kTH2F, {{200, -100.0f, +100}, {200, 0, 100}}, true); - fRegistry.add("V0/primary/hDCAz_Pt_collType", "DCA to PV vs. p_{T} (GeV/c) vs. validated collision;DCA_{z} (cm);p_{T} (GeV/c)", kTHnSparseF, {{200, -5.f, +5.f}, {1000, 0.0f, 20}, {2, -0.5f, 1.5f}}, false); - fRegistry.add("V0/primary/hPt_DeltaColID", "V0 pT vs. delta collision Id; p_{T,#gamma} (GeV/c); v0CollId - mcGammaCollId ", kTH2F, {{200, 0.0f, 20}, {101, -50.5f, 50.5f}}, false); + fRegistry.add("V0/primary/hsConvPoint", "photon conversion point;r_{xy} (cm);#varphi (rad.);#eta;", kTHnSparseF, {{100, 0.0f, 100}, {90, 0, 2 * M_PI}, {40, -2, +2}}, false); fRegistry.addClone("V0/primary/", "V0/fromWD/"); // from weak decay fRegistry.addClone("V0/primary/", "V0/fromHS/"); // from hadronic shower in detector materials @@ -283,34 +283,14 @@ struct PCMQCMC { fV0PhotonCut.SetChi2PerClusterTPC(0.0, pcmcuts.cfg_max_chi2tpc); fV0PhotonCut.SetTPCNsigmaElRange(pcmcuts.cfg_min_TPCNsigmaEl, pcmcuts.cfg_max_TPCNsigmaEl); fV0PhotonCut.SetChi2PerClusterITS(-1e+10, pcmcuts.cfg_max_chi2its); - fV0PhotonCut.SetDisableITSonly(pcmcuts.cfg_disable_itsonly_track); - fV0PhotonCut.SetDisableTPConly(pcmcuts.cfg_disable_tpconly_track); - - if (pcmcuts.cfg_reject_v0_on_itsib) { - fV0PhotonCut.SetNClustersITS(2, 4); - } else { - fV0PhotonCut.SetNClustersITS(0, 7); - } + fV0PhotonCut.SetNClustersITS(0, 7); fV0PhotonCut.SetMeanClusterSizeITSob(0.0, 16.0); fV0PhotonCut.SetIsWithinBeamPipe(pcmcuts.cfg_require_v0_with_correct_xz); - - if (pcmcuts.cfg_require_v0_with_itstpc) { - fV0PhotonCut.SetRequireITSTPC(true); - fV0PhotonCut.SetRxyRange(4, 40); - } - if (pcmcuts.cfg_require_v0_with_itsonly) { - fV0PhotonCut.SetRequireITSonly(true); - fV0PhotonCut.SetRxyRange(4, 24); - } - if (pcmcuts.cfg_require_v0_with_tpconly) { - fV0PhotonCut.SetRequireTPConly(true); - fV0PhotonCut.SetRxyRange(32, 90); - } - if (pcmcuts.cfg_require_v0_on_wwire_ib) { - fV0PhotonCut.SetOnWwireIB(true); - fV0PhotonCut.SetOnWwireOB(false); - fV0PhotonCut.SetRxyRange(7, 14); - } + fV0PhotonCut.SetDisableITSonly(pcmcuts.cfg_disable_itsonly_track); + fV0PhotonCut.SetDisableTPConly(pcmcuts.cfg_disable_tpconly_track); + fV0PhotonCut.SetRequireITSTPC(pcmcuts.cfg_require_v0_with_itstpc); + fV0PhotonCut.SetRequireITSonly(pcmcuts.cfg_require_v0_with_itsonly); + fV0PhotonCut.SetRequireTPConly(pcmcuts.cfg_require_v0_with_tpconly); } template @@ -354,18 +334,18 @@ struct PCMQCMC { fRegistry.fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hMultFT0MvsMultNTracksPV"), collision.multFT0A() + collision.multFT0C(), collision.multNTracksPV()); } - template - void fillV0Info(TV0 const& v0, TMCV0 const& mcphoton, TMCLeg const& mcleg) + template + void fillV0Info(TCollision const& collision, TV0 const& v0, TMCV0 const& mcphoton, TMCLeg const& mcleg) { fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hPt"), v0.pt()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hEtaPhi"), v0.phi(), v0.eta()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hRadius"), v0.vz(), v0.v0radius()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hCosPA"), v0.cospa()); - fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hCosPA_Rxy"), v0.v0radius(), v0.cospa()); + fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hCosPAXY"), v0.cosPAXY(collision.posX(), collision.posY())); + fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hCosPARZ"), v0.cosPARZ(collision.posX(), collision.posY(), collision.posZ())); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hPCA"), v0.pca()); - fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hPCA_CosPA"), v0.cospa(), v0.pca()); - fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hPCA_Rxy"), v0.v0radius(), v0.pca()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hDCAxyz"), v0.dcaXYtopv(), v0.dcaZtopv()); + fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hDCAz_Pt"), v0.dcaZtopv(), v0.pt()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hAPplot"), v0.alpha(), v0.qtarm()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hMassGamma"), v0.v0radius(), v0.mGamma()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hGammaRxy"), v0.vx(), v0.vy()); @@ -387,6 +367,11 @@ struct PCMQCMC { fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hConvPoint_diffZ"), mcleg.vz(), v0.vz() - mcleg.vz()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hXY_Photon_MC"), mcleg.vx(), mcleg.vy()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hRZ_Photon_MC"), mcleg.vz(), std::sqrt(std::pow(mcleg.vx(), 2) + std::pow(mcleg.vy(), 2))); + + float phi_cp = atan2(v0.vy(), v0.vx()); + o2::math_utils::bringTo02Pi(phi_cp); + float eta_cp = std::atanh(v0.vz() / std::sqrt(std::pow(v0.vx(), 2) + std::pow(v0.vy(), 2) + std::pow(v0.vz(), 2))); + fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hsConvPoint"), v0.v0radius(), phi_cp, eta_cp); } template @@ -461,22 +446,24 @@ struct PCMQCMC { } auto mcphoton = mcparticles.iteratorAt(photonid); + if (cfgRequireTrueAssociation && (mcphoton.emmceventId() != collision.emmceventId())) { + continue; + } + if (mcphoton.isPhysicalPrimary() || mcphoton.producedByGenerator()) { - fillV0Info<0>(v0, mcphoton, elemc); - fRegistry.fill(HIST("V0/primary/hPt_DeltaColID"), v0.pt(), collision.emmceventId() - mcphoton.emmceventId()); - fRegistry.fill(HIST("V0/primary/hDCAz_Pt_collType"), v0.dcaZtopv(), v0.pt(), collision.emmceventId() == mcphoton.emmceventId()); + fillV0Info<0>(collision, v0, mcphoton, elemc); for (auto& leg : {pos, ele}) { fillV0LegInfo<0>(leg); } ng_primary++; } else if (IsFromWD(mcphoton.template emmcevent_as(), mcphoton, mcparticles) > 0) { - fillV0Info<1>(v0, mcphoton, elemc); + fillV0Info<1>(collision, v0, mcphoton, elemc); for (auto& leg : {pos, ele}) { fillV0LegInfo<1>(leg); } ng_wd++; } else { - fillV0Info<2>(v0, mcphoton, elemc); + fillV0Info<2>(collision, v0, mcphoton, elemc); for (auto& leg : {pos, ele}) { fillV0LegInfo<2>(leg); } @@ -542,14 +529,26 @@ struct PCMQCMC { } if (std::abs(mctrack.pdgCode()) == 22 && (mctrack.isPhysicalPrimary() || mctrack.producedByGenerator())) { - fRegistry.fill(HIST("Generated/hPt_ConvertedPhoton"), mctrack.pt()); - fRegistry.fill(HIST("Generated/hY_ConvertedPhoton"), mctrack.y()); - fRegistry.fill(HIST("Generated/hPhi_ConvertedPhoton"), mctrack.phi()); auto daughter = mcparticles.iteratorAt(mctrack.daughtersIds()[0]); // choose ele or pos. - float rxy_gen_e = sqrt(pow(daughter.vx(), 2) + pow(daughter.vy(), 2)); - fRegistry.fill(HIST("Generated/hPhotonRZ"), daughter.vz(), rxy_gen_e); - fRegistry.fill(HIST("Generated/hPhotonRxy"), daughter.vx(), daughter.vy()); - fRegistry.fill(HIST("Generated/hPhotonPhivsRxy"), daughter.phi(), rxy_gen_e); + float rxy_gen_e = std::sqrt(std::pow(daughter.vx(), 2) + std::pow(daughter.vy(), 2)); + float phi_cp = atan2(daughter.vy(), daughter.vx()); + o2::math_utils::bringTo02Pi(phi_cp); + float eta_cp = std::atanh(daughter.vz() / std::sqrt(std::pow(daughter.vx(), 2) + std::pow(daughter.vy(), 2) + std::pow(daughter.vz(), 2))); + + if (rxy_gen_e < std::fabs(daughter.vz()) * std::tan(2 * std::atan(std::exp(-pcmcuts.cfg_max_eta_v0))) - margin_z_mc) { + continue; + } + if (rxy_gen_e > maxRgen) { + continue; + } + + fRegistry.fill(HIST("Generated/hPt_ConversionPhoton"), mctrack.pt()); + fRegistry.fill(HIST("Generated/hY_ConversionPhoton"), mctrack.y()); + fRegistry.fill(HIST("Generated/hPhi_ConversionPhoton"), mctrack.phi()); + fRegistry.fill(HIST("Generated/hsConvPoint"), rxy_gen_e, phi_cp, eta_cp); + fRegistry.fill(HIST("Generated/hXY"), daughter.vx(), daughter.vy()); + fRegistry.fill(HIST("Generated/hRZ"), daughter.vz(), rxy_gen_e); + fRegistry.fill(HIST("Generated/hRPhi"), phi_cp, rxy_gen_e); } } // end of mctrack loop per collision } // end of collision loop From f13c916ca547702f0464bd949a3f03dd0f27e311 Mon Sep 17 00:00:00 2001 From: Antonio Palasciano <52152842+apalasciano@users.noreply.github.com> Date: Thu, 6 Mar 2025 17:00:38 +0100 Subject: [PATCH 0576/1650] [PWGHF] Remove unbound indices from taskCharmHadImpactPar.cxx (#10360) --- PWGHF/Tasks/taskCharmHadImpactPar.cxx | 2 -- 1 file changed, 2 deletions(-) diff --git a/PWGHF/Tasks/taskCharmHadImpactPar.cxx b/PWGHF/Tasks/taskCharmHadImpactPar.cxx index e999dbdd575..1fb4daf3f73 100644 --- a/PWGHF/Tasks/taskCharmHadImpactPar.cxx +++ b/PWGHF/Tasks/taskCharmHadImpactPar.cxx @@ -70,7 +70,6 @@ DECLARE_SOA_COLUMN(EtaProng2, etaProng2, float); //! Eta of the } // namespace hf_charm_cand_lite DECLARE_SOA_TABLE(HfCharmCandLites, "AOD", "HFCHARMCANDLITE", //! Table with some charm hadron properties - collision::BCId, collision::NumContrib, collision::PosX, collision::PosY, @@ -244,7 +243,6 @@ struct HfTaskCharmHadImpactPar { hfCharmCandLite( // Event features - collision.bcId(), collision.numContrib(), collision.posX(), collision.posY(), From 27502defa20fc0711e03b881ffe99697c3d27a72 Mon Sep 17 00:00:00 2001 From: Lucia Anna Tarasovicova Date: Thu, 6 Mar 2025 18:23:47 +0100 Subject: [PATCH 0577/1650] [PWGLF] Change in hStrangeCorrelation.cxx (#10358) Co-authored-by: Lucia Anna Tarasovicova --- .../Tasks/Strangeness/hStrangeCorrelation.cxx | 88 +++++++++++-------- 1 file changed, 51 insertions(+), 37 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx index 60a0b850830..59479d4188d 100644 --- a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx +++ b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx @@ -45,10 +45,6 @@ using namespace o2::constants::math; using namespace o2::framework; using namespace o2::framework::expressions; -// simple checkers -#define BIT_SET(var, nbit) ((var) |= (1 << (nbit))) -#define BIT_CHECK(var, nbit) ((var) & (1 << (nbit))) - using TracksComplete = soa::Join; using V0DatasWithoutTrackX = soa::Join; @@ -251,7 +247,7 @@ struct HStrangeCorrelation { if (track.tpcNClsShared() > systCuts.triggerMaxTPCSharedClusters) { return false; // skip, has shared clusters } - if (!(BIT_CHECK(track.itsClusterMap(), 0)) && systCuts.triggerRequireL0) { + if (!(TESTBIT(track.itsClusterMap(), 0)) && systCuts.triggerRequireL0) { return false; // skip, doesn't have cluster in ITS L0 } // systematic variations: trigger DCAxy @@ -342,7 +338,7 @@ struct HStrangeCorrelation { } float weight = (applyEfficiencyCorrection || applyEfficiencyForTrigger) ? 1. / efficiency : 1.0f; - if (BIT_CHECK(doCorrelation, Index) && (!applyEfficiencyCorrection || efficiency != 0)) { + if (TESTBIT(doCorrelation, Index) && (!applyEfficiencyCorrection || efficiency != 0)) { if (assocCandidate.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(Index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && !mixing && -massWindowConfigurations.maxBgNSigma < assocCandidate.invMassNSigma(Index) && assocCandidate.invMassNSigma(Index) < -massWindowConfigurations.minBgNSigma) histos.fill(HIST("sameEvent/LeftBg/") + HIST(kV0names[Index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); if (assocCandidate.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(Index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && !mixing && -massWindowConfigurations.maxPeakNSigma < assocCandidate.invMassNSigma(Index) && assocCandidate.invMassNSigma(Index) < +massWindowConfigurations.maxPeakNSigma) { @@ -455,7 +451,7 @@ struct HStrangeCorrelation { efficiency = efficiency * hEfficiencyTrigger->Interpolate(pttrigger, trigg.eta()); } float weight = (applyEfficiencyCorrection || applyEfficiencyForTrigger) ? 1. / efficiency : 1.0f; - if (BIT_CHECK(doCorrelation, Index + 3) && (!applyEfficiencyCorrection || efficiency != 0)) { + if (TESTBIT(doCorrelation, Index + 3) && (!applyEfficiencyCorrection || efficiency != 0)) { if (assocCandidate.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(Index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && !mixing && -massWindowConfigurations.maxBgNSigma < assocCandidate.invMassNSigma(Index) && assocCandidate.invMassNSigma(Index) < -massWindowConfigurations.minBgNSigma) histos.fill(HIST("sameEvent/LeftBg/") + HIST(kCascadenames[Index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); if (assocCandidate.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(Index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && !mixing && -massWindowConfigurations.maxPeakNSigma < assocCandidate.invMassNSigma(Index) && assocCandidate.invMassNSigma(Index) < +massWindowConfigurations.maxPeakNSigma) @@ -575,23 +571,23 @@ struct HStrangeCorrelation { // set bitmap for convenience doCorrelation = 0; if (doCorrelationK0Short) - BIT_SET(doCorrelation, 0); + SETBIT(doCorrelation, 0); if (doCorrelationLambda) - BIT_SET(doCorrelation, 1); + SETBIT(doCorrelation, 1); if (doCorrelationAntiLambda) - BIT_SET(doCorrelation, 2); + SETBIT(doCorrelation, 2); if (doCorrelationXiMinus) - BIT_SET(doCorrelation, 3); + SETBIT(doCorrelation, 3); if (doCorrelationXiPlus) - BIT_SET(doCorrelation, 4); + SETBIT(doCorrelation, 4); if (doCorrelationOmegaMinus) - BIT_SET(doCorrelation, 5); + SETBIT(doCorrelation, 5); if (doCorrelationOmegaPlus) - BIT_SET(doCorrelation, 6); + SETBIT(doCorrelation, 6); if (doCorrelationPion) - BIT_SET(doCorrelation, 7); + SETBIT(doCorrelation, 7); if (doCorrelationHadron) - BIT_SET(doCorrelation, 8); + SETBIT(doCorrelation, 8); // Store axis ranges to prevent spurious filling // axis status: @@ -778,7 +774,7 @@ struct HStrangeCorrelation { bool hStrange = false; for (int i = 0; i < 9; i++) { - if (BIT_CHECK(doCorrelation, i)) { + if (TESTBIT(doCorrelation, i)) { histos.add(fmt::format("h{}EtaVsPtVsPhi", kParticlenames[i]).c_str(), "", kTH3F, {axisPtQA, axisEta, axisPhi}); histos.add(fmt::format("h3d{}Spectrum", kParticlenames[i]).c_str(), fmt::format("h3d{}Spectrum", kParticlenames[i]).c_str(), kTH3F, {axisPtQA, axisMult, axisMassNSigma}); histos.add(fmt::format("h3d{}SpectrumY", kParticlenames[i]).c_str(), fmt::format("h3d{}SpectrumY", kParticlenames[i]).c_str(), kTH3F, {axisPtQA, axisMult, axisMassNSigma}); @@ -828,9 +824,9 @@ struct HStrangeCorrelation { } if (doprocessClosureTest) { for (int i = 0; i < 8; i++) { - if (BIT_CHECK(doCorrelation, i)) + if (TESTBIT(doCorrelation, i)) histos.add(fmt::format("ClosureTest/sameEvent/{}", kParticlenames[i]).c_str(), "", kTHnF, {axisDeltaPhiNDim, axisDeltaEtaNDim, axisPtAssocNDim, axisPtTriggerNDim, axisVtxZNDim, axisMultNDim}); - if (BIT_CHECK(doCorrelation, i)) + if (TESTBIT(doCorrelation, i)) histos.add(fmt::format("ClosureTest/h{}", kParticlenames[i]).c_str(), "", kTH3F, {axisPtQA, axisEta, axisPhi}); } histos.add("ClosureTest/hTrigger", "Trigger Tracks", kTH3F, {axisPtQA, axisEta, axisMult}); @@ -908,7 +904,7 @@ struct HStrangeCorrelation { continue; } auto binNumber = histos.get(HIST("axes/hPtTriggerAxis"))->FindFixBin(track.pt()) - 1; - BIT_SET(triggerPresenceMap[collision.globalIndex()], binNumber); + SETBIT(triggerPresenceMap[collision.globalIndex()], binNumber); } } } @@ -919,10 +915,15 @@ struct HStrangeCorrelation { { // ________________________________________________ // skip if desired trigger not found - if (triggerPresenceMap.size() > 0 && !BIT_CHECK(triggerPresenceMap[collision.globalIndex()], triggerBinToSelect)) { + if (triggerPresenceMap.size() > 0 && !TESTBIT(triggerPresenceMap[collision.globalIndex()], triggerBinToSelect)) { return; } + if (applyEfficiencyCorrection) { + auto bc = collision.bc_as(); + initEfficiencyFromCCDB(bc); + } + // ________________________________________________ // Perform basic event selection if (!isCollisionSelected(collision)) { @@ -965,7 +966,7 @@ struct HStrangeCorrelation { { // ________________________________________________ // skip if desired trigger not found - if (triggerPresenceMap.size() > 0 && !BIT_CHECK(triggerPresenceMap[collision.globalIndex()], triggerBinToSelect)) { + if (triggerPresenceMap.size() > 0 && !TESTBIT(triggerPresenceMap[collision.globalIndex()], triggerBinToSelect)) { return; } @@ -1015,7 +1016,7 @@ struct HStrangeCorrelation { } float weight = applyEfficiencyCorrection ? 1. / efficiency : 1.0f; if (v0.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || v0.mcTrue(Index)) && (!doAssocPhysicalPrimary || v0.mcPhysicalPrimary()) && (!applyEfficiencyCorrection || efficiency != 0)) { - if (BIT_CHECK(doCorrelation, Index)) { + if (TESTBIT(doCorrelation, Index)) { histos.fill(HIST("h3d") + HIST(kV0names[Index]) + HIST("Spectrum"), v0Data.pt(), collision.centFT0M(), v0.invMassNSigma(Index), weight); if (std::abs(v0Data.rapidity(Index)) < 0.5) { histos.fill(HIST("h3d") + HIST(kV0names[Index]) + HIST("SpectrumY"), v0Data.pt(), collision.centFT0M(), v0.invMassNSigma(Index), weight); @@ -1055,7 +1056,7 @@ struct HStrangeCorrelation { { // ________________________________________________ // skip if desired trigger not found - if (triggerPresenceMap.size() > 0 && !BIT_CHECK(triggerPresenceMap[collision.globalIndex()], triggerBinToSelect)) { + if (triggerPresenceMap.size() > 0 && !TESTBIT(triggerPresenceMap[collision.globalIndex()], triggerBinToSelect)) { return; } @@ -1110,7 +1111,7 @@ struct HStrangeCorrelation { } float weight = applyEfficiencyCorrection ? 1. / efficiency : 1.0f; if (casc.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || casc.mcTrue(Index)) && (!doAssocPhysicalPrimary || casc.mcPhysicalPrimary()) && (!applyEfficiencyCorrection || efficiency != 0)) { - if (BIT_CHECK(doCorrelation, Index + 3)) { + if (TESTBIT(doCorrelation, Index + 3)) { histos.fill(HIST("h3d") + HIST(kCascadenames[Index]) + HIST("Spectrum"), cascData.pt(), collision.centFT0M(), casc.invMassNSigma(Index), weight); if (std::abs(cascData.rapidity(Index)) < 0.5) { histos.fill(HIST("h3d") + HIST(kCascadenames[Index]) + HIST("SpectrumY"), cascData.pt(), collision.centFT0M(), casc.invMassNSigma(Index), weight); @@ -1147,10 +1148,15 @@ struct HStrangeCorrelation { { // ________________________________________________ // skip if desired trigger not found - if (triggerPresenceMap.size() > 0 && !BIT_CHECK(triggerPresenceMap[collision.globalIndex()], triggerBinToSelect)) { + if (triggerPresenceMap.size() > 0 && !TESTBIT(triggerPresenceMap[collision.globalIndex()], triggerBinToSelect)) { return; } + if (applyEfficiencyCorrection) { + auto bc = collision.bc_as(); + initEfficiencyFromCCDB(bc); + } + // ________________________________________________ // Perform basic event selection if (!isCollisionSelected(collision)) { @@ -1188,13 +1194,17 @@ struct HStrangeCorrelation { void processMixedEventHHadrons(soa::Join const& collisions, aod::AssocHadrons const& assocHadrons, aod::TriggerTracks const& triggerTracks, - TracksComplete const&) + TracksComplete const&, aod::BCsWithTimestamps const&) { for (auto const& [collision1, collision2] : soa::selfCombinations(colBinning, mixingParameter, -1, collisions, collisions)) { - + // ________________________________________________ + if (applyEfficiencyCorrection) { + auto bc = collision1.bc_as(); + initEfficiencyFromCCDB(bc); + } // ________________________________________________ // skip if desired trigger not found - if (triggerPresenceMap.size() > 0 && (!BIT_CHECK(triggerPresenceMap[collision1.globalIndex()], triggerBinToSelect) || !BIT_CHECK(triggerPresenceMap[collision2.globalIndex()], triggerBinToSelect))) { + if (triggerPresenceMap.size() > 0 && (!TESTBIT(triggerPresenceMap[collision1.globalIndex()], triggerBinToSelect) || !TESTBIT(triggerPresenceMap[collision2.globalIndex()], triggerBinToSelect))) { return; } @@ -1237,7 +1247,7 @@ struct HStrangeCorrelation { } // ________________________________________________ // skip if desired trigger not found - if (triggerPresenceMap.size() > 0 && (!BIT_CHECK(triggerPresenceMap[collision1.globalIndex()], triggerBinToSelect) || !BIT_CHECK(triggerPresenceMap[collision2.globalIndex()], triggerBinToSelect))) { + if (triggerPresenceMap.size() > 0 && (!TESTBIT(triggerPresenceMap[collision1.globalIndex()], triggerBinToSelect) || !TESTBIT(triggerPresenceMap[collision2.globalIndex()], triggerBinToSelect))) { continue; } @@ -1279,7 +1289,7 @@ struct HStrangeCorrelation { } // ________________________________________________ // skip if desired trigger not found - if (triggerPresenceMap.size() > 0 && (!BIT_CHECK(triggerPresenceMap[collision1.globalIndex()], triggerBinToSelect) || !BIT_CHECK(triggerPresenceMap[collision2.globalIndex()], triggerBinToSelect))) { + if (triggerPresenceMap.size() > 0 && (!TESTBIT(triggerPresenceMap[collision1.globalIndex()], triggerBinToSelect) || !TESTBIT(triggerPresenceMap[collision2.globalIndex()], triggerBinToSelect))) { continue; } @@ -1310,13 +1320,17 @@ struct HStrangeCorrelation { } void processMixedEventHPions(soa::Join const& collisions, soa::Join const& assocPions, soa::Join const& triggerTracks, - TracksComplete const&) + TracksComplete const&, aod::BCsWithTimestamps const&) { for (auto const& [collision1, collision2] : soa::selfCombinations(colBinning, mixingParameter, -1, collisions, collisions)) { - + // ________________________________________________ + if (applyEfficiencyCorrection) { + auto bc = collision1.bc_as(); + initEfficiencyFromCCDB(bc); + } // ________________________________________________ // skip if desired trigger not found - if (triggerPresenceMap.size() > 0 && (!BIT_CHECK(triggerPresenceMap[collision1.globalIndex()], triggerBinToSelect) || !BIT_CHECK(triggerPresenceMap[collision2.globalIndex()], triggerBinToSelect))) { + if (triggerPresenceMap.size() > 0 && (!TESTBIT(triggerPresenceMap[collision1.globalIndex()], triggerBinToSelect) || !TESTBIT(triggerPresenceMap[collision2.globalIndex()], triggerBinToSelect))) { continue; } @@ -1432,7 +1446,7 @@ struct HStrangeCorrelation { // ________________________________________________ // skip if desired trigger not found - if (triggerPresenceMap.size() > 0 && !BIT_CHECK(bestCollisionTriggerPresenceMap, triggerBinToSelect)) { + if (triggerPresenceMap.size() > 0 && !TESTBIT(bestCollisionTriggerPresenceMap, triggerBinToSelect)) { return; } if (!bestCollisionSel8) @@ -1545,7 +1559,7 @@ struct HStrangeCorrelation { } // ________________________________________________ // skip if desired trigger not found - if (triggerPresenceMap.size() > 0 && !BIT_CHECK(bestCollisionTriggerPresenceMap, triggerBinToSelect)) { + if (triggerPresenceMap.size() > 0 && !TESTBIT(bestCollisionTriggerPresenceMap, triggerBinToSelect)) { return; } @@ -1671,7 +1685,7 @@ struct HStrangeCorrelation { continue; if (ptassoc < axisRanges[2][0] || ptassoc > axisRanges[2][1]) continue; - if (BIT_CHECK(doCorrelation, i)) + if (TESTBIT(doCorrelation, i)) histos.fill(HIST("ClosureTest/sameEvent/") + HIST(kParticlenames[Index]), computeDeltaPhi(gphitrigger, gphiassoc), deltaeta, ptassoc, pttrigger, bestCollisionVtxZ, bestCollisionFT0Mpercentile); } } From d87190049e9b484b5484c70b56bba3e31a1ca794 Mon Sep 17 00:00:00 2001 From: Kai Cui <129373281+kcui1@users.noreply.github.com> Date: Fri, 7 Mar 2025 01:24:40 +0800 Subject: [PATCH 0578/1650] [PWGLF] Bug fixing for h-strangeness filter (#10354) --- .../Strangeness/hStrangeCorrelationFilter.cxx | 209 +++++++++--------- 1 file changed, 110 insertions(+), 99 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx b/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx index e8bb824c8b1..2820e0e963e 100644 --- a/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx +++ b/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx @@ -9,6 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. /// +/// \file hStrangeCorrelationFilter.cxx /// \brief This task pre-filters tracks, V0s and cascades to do h-strangeness /// correlations with an analysis task. /// @@ -35,13 +36,14 @@ #include "EventFiltering/ZorroSummary.h" using namespace o2; +using namespace o2::constants::math; using namespace o2::framework; using namespace o2::framework::expressions; -#define bitset(var, nbit) ((var) |= (1 << (nbit))) -#define bitcheck(var, nbit) ((var) & (1 << (nbit))) +#define BIT_SET(var, nbit) ((var) |= (1 << (nbit))) +#define BIT_CHECK(var, nbit) ((var) & (1 << (nbit))) -struct hstrangecorrelationfilter { +struct HStrangeCorrelationFilter { Service ccdb; HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -56,8 +58,8 @@ struct hstrangecorrelationfilter { Configurable zorroMask{"zorroMask", "", "zorro trigger class to select on (empty: none)"}; // Trigger particle selections in phase space - Configurable triggerEtaMin{"triggerEtaCutMin", -0.8, "triggeretamin"}; - Configurable triggerEtaMax{"triggerEtaCutMax", 0.8, "triggeretamax"}; + Configurable triggerEtaMin{"triggerEtaMin", -0.8, "triggeretamin"}; + Configurable triggerEtaMax{"triggerEtaMax", 0.8, "triggeretamax"}; Configurable triggerPtCutMin{"triggerPtCutMin", 3, "triggerptmin"}; Configurable triggerPtCutMax{"triggerPtCutMax", 20, "triggerptmax"}; @@ -69,8 +71,8 @@ struct hstrangecorrelationfilter { Configurable triggerRequireL0{"triggerRequireL0", false, "require ITS L0 cluster for trigger"}; // Associated particle selections in phase space - Configurable assocEtaMin{"assocEtaCutMin", -0.8, "triggeretamin"}; - Configurable assocEtaMax{"assocEtaCutMax", 0.8, "triggeretamax"}; + Configurable assocEtaMin{"assocEtaMin", -0.8, "triggeretamin"}; + Configurable assocEtaMax{"assocEtaMax", 0.8, "triggeretamax"}; Configurable assocPtCutMin{"assocPtCutMin", 0.2, "assocptmin"}; Configurable assocPtCutMax{"assocPtCutMax", 10, "assocptmax"}; @@ -80,12 +82,12 @@ struct hstrangecorrelationfilter { Configurable rejectSigma{"rejectSigma", 1, "n sigma for rejecting pion candidates"}; // V0 selections - Configurable v0Cospa{"v0cospa", 0.97, "V0 CosPA"}; // double -> N.B. dcos(x)/dx = 0 at x=0) - Configurable dcaV0dau{"dcav0dau", 1.0, "DCA V0 Daughters"}; - Configurable dcaNegtopv{"dcanegtopv", 0.06, "DCA Neg To PV"}; - Configurable dcaPostopv{"dcapostopv", 0.06, "DCA Pos To PV"}; - Configurable v0RadiusMin{"v0radiusmin", 0.5, "v0radius"}; - Configurable v0RadiusMax{"v0radiusmax", 200, "v0radius"}; + Configurable v0Cospa{"v0Cospa", 0.97, "V0 CosPA"}; // double -> N.B. dcos(x)/dx = 0 at x=0) + Configurable dcaV0dau{"dcaV0dau", 1.0, "DCA V0 Daughters"}; + Configurable dcaNegtopv{"dcaNegtopv", 0.06, "DCA Neg To PV"}; + Configurable dcaPostopv{"dcaPostopv", 0.06, "DCA Pos To PV"}; + Configurable v0RadiusMin{"v0RadiusMin", 0.5, "v0radius"}; + Configurable v0RadiusMax{"v0RadiusMax", 200, "v0radius"}; // specific selections Configurable lambdaCospa{"lambdaCospa", 0.995, "CosPA for lambda"}; // allows for tighter selection for Lambda @@ -96,25 +98,25 @@ struct hstrangecorrelationfilter { Configurable dcaXYpTdep{"dcaXYpTdep", 0.013, "[1] in |DCAxy| < [0]+[1]/pT"}; // cascade selections - Configurable cascadesetting_cospa{"cascadesetting_cospa", 0.95, "cascadesetting_cospa"}; - Configurable cascadesetting_dcacascdau{"cascadesetting_dcacascdau", 1.0, "cascadesetting_dcacascdau"}; - Configurable cascadesetting_dcabachtopv{"cascadesetting_dcabachtopv", 0.1, "cascadesetting_dcabachtopv"}; - Configurable cascadesetting_cascradius{"cascadesetting_cascradius", 0.5, "cascadesetting_cascradius"}; - Configurable cascadesetting_v0masswindow{"cascadesetting_v0masswindow", 0.01, "cascadesetting_v0masswindow"}; - Configurable cascadesetting_mindcav0topv{"cascadesetting_mindcav0topv", 0.01, "cascadesetting_mindcav0topv"}; + Configurable cascadeSettingCospa{"cascadeSettingCospa", 0.95, "cascadeSettingCospa"}; + Configurable cascadeSettingDcacascdau{"cascadeSettingDcacascdau", 1.0, "cascadeSettingDcacascdau"}; + Configurable cascadeSettingDcabachtopv{"cascadeSettingDcabachtopv", 0.1, "cascadeSettingDcabachtopv"}; + Configurable cascadeSettingCascradius{"cascadeSettingCascradius", 0.5, "cascadeSettingCascradius"}; + Configurable cascadeSettingV0masswindow{"cascadeSettingV0masswindow", 0.01, "cascadeSettingV0masswindow"}; + Configurable cascadeSettingMindcav0topv{"cascadeSettingMindcav0topv", 0.01, "cascadeSettingMindcav0topv"}; // invariant mass parametrizations - Configurable> massParsK0Mean{"massParsK0Mean", {0.495, 0.000250, 0.0, 0.0}, "pars in [0]+[1]*x+[2]*TMath::Exp(-[3]*x)"}; - Configurable> massParsK0Width{"massParsK0Width", {0.00354, 0.000609, 0.0, 0.0}, "pars in [0]+[1]*x+[2]*TMath::Exp(-[3]*x)"}; + Configurable> massParsK0Mean{"massParsK0Mean", {0.495, 0.000250, 0.0, 0.0}, "pars in [0]+[1]*x+[2]*std::exp(-[3]*x)"}; + Configurable> massParsK0Width{"massParsK0Width", {0.00354, 0.000609, 0.0, 0.0}, "pars in [0]+[1]*x+[2]*std::exp(-[3]*x)"}; - Configurable> massParsLambdaMean{"massParsLambdaMean", {1.114, 0.000314, 0.140, 11.9}, "pars in [0]+[1]*x+[2]*TMath::Exp(-[3]*x)"}; - Configurable> massParsLambdaWidth{"massParsLambdaWidth", {0.00127, 0.000172, 0.00261, 2.02}, "pars in [0]+[1]*x+[2]*TMath::Exp(-[3]*x)"}; + Configurable> massParsLambdaMean{"massParsLambdaMean", {1.114, 0.000314, 0.140, 11.9}, "pars in [0]+[1]*x+[2]*std::exp(-[3]*x)"}; + Configurable> massParsLambdaWidth{"massParsLambdaWidth", {0.00127, 0.000172, 0.00261, 2.02}, "pars in [0]+[1]*x+[2]*std::exp(-[3]*x)"}; - Configurable> massParsCascadeMean{"massParsCascadeMean", {1.32, 0.000278, 0.0, 0.0}, "pars in [0]+[1]*x+[2]*TMath::Exp(-[3]*x)"}; - Configurable> massParsCascadeWidth{"massParsCascadeWidth", {0.00189, 0.000227, 0.00370, 1.635}, "pars in [0]+[1]*x+[2]*TMath::Exp(-[3]*x)"}; + Configurable> massParsCascadeMean{"massParsCascadeMean", {1.32, 0.000278, 0.0, 0.0}, "pars in [0]+[1]*x+[2]*std::exp(-[3]*x)"}; + Configurable> massParsCascadeWidth{"massParsCascadeWidth", {0.00189, 0.000227, 0.00370, 1.635}, "pars in [0]+[1]*x+[2]*std::exp(-[3]*x)"}; - Configurable> massParsOmegaMean{"massParsOmegaMean", {1.67, 0.000298, 0.0, 0.0}, "pars in [0]+[1]*x+[2]*TMath::Exp(-[3]*x)"}; - Configurable> massParsOmegaWidth{"massParsOmegaWidth", {0.00189, 0.000325, 0.00606, 1.77}, "pars in [0]+[1]*x+[2]*TMath::Exp(-[3]*x)"}; + Configurable> massParsOmegaMean{"massParsOmegaMean", {1.67, 0.000298, 0.0, 0.0}, "pars in [0]+[1]*x+[2]*std::exp(-[3]*x)"}; + Configurable> massParsOmegaWidth{"massParsOmegaWidth", {0.00189, 0.000325, 0.00606, 1.77}, "pars in [0]+[1]*x+[2]*std::exp(-[3]*x)"}; // must include windows for background and peak Configurable maxMassNSigma{"maxMassNSigma", 12.0f, "max mass region to be considered for further analysis"}; @@ -134,7 +136,7 @@ struct hstrangecorrelationfilter { Filter preFilterV0 = nabs(aod::v0data::dcapostopv) > dcaPostopv&& nabs(aod::v0data::dcanegtopv) > dcaNegtopv&& aod::v0data::dcaV0daughters < dcaV0dau; Filter preFilterCascade = - nabs(aod::cascdata::dcapostopv) > dcaPostopv&& nabs(aod::cascdata::dcanegtopv) > dcaNegtopv&& nabs(aod::cascdata::dcabachtopv) > cascadesetting_dcabachtopv&& aod::cascdata::dcaV0daughters < dcaV0dau&& aod::cascdata::dcacascdaughters < cascadesetting_dcacascdau; + nabs(aod::cascdata::dcapostopv) > dcaPostopv&& nabs(aod::cascdata::dcanegtopv) > dcaNegtopv&& nabs(aod::cascdata::dcabachtopv) > cascadeSettingDcabachtopv&& aod::cascdata::dcaV0daughters < dcaV0dau&& aod::cascdata::dcacascdaughters < cascadeSettingDcacascdau; using V0LinkedTagged = soa::Join; using CascadesLinkedTagged = soa::Join; @@ -154,14 +156,14 @@ struct hstrangecorrelationfilter { Produces assocHadrons; Produces assocPID; - TF1* fK0Mean = new TF1("fK0Mean", "[0]+[1]*x+[2]*TMath::Exp(-[3]*x)"); - TF1* fK0Width = new TF1("fK0Width", "[0]+[1]*x+[2]*TMath::Exp(-[3]*x)"); - TF1* fLambdaMean = new TF1("fLambdaMean", "[0]+[1]*x+[2]*TMath::Exp(-[3]*x)"); - TF1* fLambdaWidth = new TF1("fLambdaWidth", "[0]+[1]*x+[2]*TMath::Exp(-[3]*x)"); - TF1* fXiMean = new TF1("fXiMean", "[0]+[1]*x+[2]*TMath::Exp(-[3]*x)"); - TF1* fXiWidth = new TF1("fXiWidth", "[0]+[1]*x+[2]*TMath::Exp(-[3]*x)"); - TF1* fOmegaMean = new TF1("fomegaMean", "[0]+[1]*x+[2]*TMath::Exp(-[3]*x)"); - TF1* fOmegaWidth = new TF1("fomegaWidth", "[0]+[1]*x+[2]*TMath::Exp(-[3]*x)"); + TF1* fK0Mean = new TF1("fK0Mean", "[0]+[1]*x+[2]*std::exp(-[3]*x)"); + TF1* fK0Width = new TF1("fK0Width", "[0]+[1]*x+[2]*std::exp(-[3]*x)"); + TF1* fLambdaMean = new TF1("fLambdaMean", "[0]+[1]*x+[2]*std::exp(-[3]*x)"); + TF1* fLambdaWidth = new TF1("fLambdaWidth", "[0]+[1]*x+[2]*std::exp(-[3]*x)"); + TF1* fXiMean = new TF1("fXiMean", "[0]+[1]*x+[2]*std::exp(-[3]*x)"); + TF1* fXiWidth = new TF1("fXiWidth", "[0]+[1]*x+[2]*std::exp(-[3]*x)"); + TF1* fOmegaMean = new TF1("fomegaMean", "[0]+[1]*x+[2]*std::exp(-[3]*x)"); + TF1* fOmegaWidth = new TF1("fomegaWidth", "[0]+[1]*x+[2]*std::exp(-[3]*x)"); Zorro zorro; OutputObj zorroSummary{"zorroSummary"}; @@ -222,7 +224,7 @@ struct hstrangecorrelationfilter { if (track.tpcNClsShared() > triggerMaxTPCSharedClusters) { return false; // skip, has shared clusters } - if (!(bitcheck(track.itsClusterMap(), 0)) && triggerRequireL0) { + if (!(BIT_CHECK(track.itsClusterMap(), 0)) && triggerRequireL0) { return false; // skip, doesn't have cluster in ITS L0 } return true; @@ -310,7 +312,7 @@ struct hstrangecorrelationfilter { return; } // No need to correlate stuff that's in far collisions - if (TMath::Abs(collision.posZ()) > 10.0) { + if (std::abs(collision.posZ()) > 10.0) { return; } if (zorroMask.value != "") { @@ -344,7 +346,7 @@ struct hstrangecorrelationfilter { return; } // No need to correlate stuff that's in far collisions - if (TMath::Abs(collision.posZ()) > 10.0) { + if (std::abs(collision.posZ()) > 10.0) { return; } if (zorroMask.value != "") { @@ -384,7 +386,7 @@ struct hstrangecorrelationfilter { return; } // No need to correlate stuff that's in far collisions - if (TMath::Abs(collision.posZ()) > 10.0) { + if (std::abs(collision.posZ()) > 10.0) { return; } if (zorroMask.value != "") { @@ -411,7 +413,7 @@ struct hstrangecorrelationfilter { return; } // No need to correlate stuff that's in far collisions - if (TMath::Abs(collision.posZ()) > 10.0) { + if (std::abs(collision.posZ()) > 10.0) { return; } if (zorroMask.value != "") { @@ -438,7 +440,7 @@ struct hstrangecorrelationfilter { return; } // No need to correlate stuff that's in far collisions - if (TMath::Abs(collision.posZ()) > 10.0) { + if (std::abs(collision.posZ()) > 10.0) { return; } if (zorroMask.value != "") { @@ -464,7 +466,7 @@ struct hstrangecorrelationfilter { return; } // No need to correlate stuff that's in far collisions - if (TMath::Abs(collision.posZ()) > 10.0) { + if (std::abs(collision.posZ()) > 10.0) { return; } if (zorroMask.value != "") { @@ -491,7 +493,7 @@ struct hstrangecorrelationfilter { return; } // No need to correlate stuff that's in far collisions - if (TMath::Abs(collision.posZ()) > 10.0) { + if (std::abs(collision.posZ()) > 10.0) { return; } if (zorroMask.value != "") { @@ -509,6 +511,9 @@ struct hstrangecorrelationfilter { if (v0.v0radius() < v0RadiusMin || v0.v0radius() > v0RadiusMax || v0.eta() > assocEtaMax || v0.eta() < assocEtaMin || v0.v0cosPA() < v0Cospa) { continue; } + if (v0.pt() > assocPtCutMax || v0.pt() < assocPtCutMin) { + continue; + } // check dE/dx compatibility int compatibleK0Short = 0; int compatibleLambda = 0; @@ -523,32 +528,32 @@ struct hstrangecorrelationfilter { if (posdau.tpcNClsCrossedRows() < minTPCNCrossedRows) continue; - if (TMath::Abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose && TMath::Abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose) - bitset(compatibleK0Short, 0); - if (TMath::Abs(posdau.tpcNSigmaPi()) < strangedEdxNSigma && TMath::Abs(negdau.tpcNSigmaPi()) < strangedEdxNSigma) - bitset(compatibleK0Short, 1); - if (TMath::Abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaTight && TMath::Abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaTight) - bitset(compatibleK0Short, 2); + if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose) + BIT_SET(compatibleK0Short, 0); + if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigma) + BIT_SET(compatibleK0Short, 1); + if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaTight) + BIT_SET(compatibleK0Short, 2); - if (TMath::Abs(posdau.tpcNSigmaPr()) < strangedEdxNSigmaLoose && TMath::Abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose) + if (std::abs(posdau.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose) if (v0.v0cosPA() > lambdaCospa) - bitset(compatibleLambda, 0); - if (TMath::Abs(posdau.tpcNSigmaPr()) < strangedEdxNSigma && TMath::Abs(negdau.tpcNSigmaPi()) < strangedEdxNSigma) + BIT_SET(compatibleLambda, 0); + if (std::abs(posdau.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigma) if (v0.v0cosPA() > lambdaCospa) - bitset(compatibleLambda, 1); - if (TMath::Abs(posdau.tpcNSigmaPr()) < strangedEdxNSigmaTight && TMath::Abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaTight) + BIT_SET(compatibleLambda, 1); + if (std::abs(posdau.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaTight) if (v0.v0cosPA() > lambdaCospa) - bitset(compatibleLambda, 2); + BIT_SET(compatibleLambda, 2); - if (TMath::Abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose && TMath::Abs(negdau.tpcNSigmaPr()) < strangedEdxNSigmaLoose) + if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(negdau.tpcNSigmaPr()) < strangedEdxNSigmaLoose) if (v0.v0cosPA() > lambdaCospa) - bitset(compatibleAntiLambda, 0); - if (TMath::Abs(posdau.tpcNSigmaPi()) < strangedEdxNSigma && TMath::Abs(negdau.tpcNSigmaPr()) < strangedEdxNSigma) + BIT_SET(compatibleAntiLambda, 0); + if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(negdau.tpcNSigmaPr()) < strangedEdxNSigma) if (v0.v0cosPA() > lambdaCospa) - bitset(compatibleAntiLambda, 1); - if (TMath::Abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaTight && TMath::Abs(negdau.tpcNSigmaPr()) < strangedEdxNSigmaTight) + BIT_SET(compatibleAntiLambda, 1); + if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(negdau.tpcNSigmaPr()) < strangedEdxNSigmaTight) if (v0.v0cosPA() > lambdaCospa) - bitset(compatibleAntiLambda, 2); + BIT_SET(compatibleAntiLambda, 2); // simplified handling: calculate NSigma in mass here float massNSigmaK0Short = (v0.mK0Short() - fK0Mean->Eval(v0.pt())) / (fK0Width->Eval(v0.pt()) + 1e-6); @@ -582,7 +587,7 @@ struct hstrangecorrelationfilter { return; } // No need to correlate stuff that's in far collisions - if (TMath::Abs(collision.posZ()) > 10.0) { + if (std::abs(collision.posZ()) > 10.0) { return; } if (zorroMask.value != "") { @@ -596,6 +601,12 @@ struct hstrangecorrelationfilter { /// _________________________________________________ /// Step 3: Populate table with associated Cascades for (auto const& casc : Cascades) { + if (casc.eta() > assocEtaMax || casc.eta() < assocEtaMin) { + continue; + } + if (casc.pt() > assocPtCutMax || casc.pt() < assocPtCutMin) { + continue; + } auto bachTrackCast = casc.bachelor_as(); auto posTrackCast = casc.posTrack_as(); auto negTrackCast = casc.negTrack_as(); @@ -615,33 +626,33 @@ struct hstrangecorrelationfilter { int compatibleOmegaMinus = 0; int compatibleOmegaPlus = 0; - if (TMath::Abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && TMath::Abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && TMath::Abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && casc.sign() < 0) - bitset(compatibleXiMinus, 0); - if (TMath::Abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && TMath::Abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && TMath::Abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && casc.sign() < 0) - bitset(compatibleXiMinus, 1); - if (TMath::Abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && TMath::Abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && TMath::Abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && casc.sign() < 0) - bitset(compatibleXiMinus, 2); - - if (TMath::Abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && TMath::Abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && TMath::Abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && casc.sign() > 0) - bitset(compatibleXiPlus, 0); - if (TMath::Abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && TMath::Abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && TMath::Abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && casc.sign() > 0) - bitset(compatibleXiPlus, 1); - if (TMath::Abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && TMath::Abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && TMath::Abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && casc.sign() > 0) - bitset(compatibleXiPlus, 2); - - if (TMath::Abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && TMath::Abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && TMath::Abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaLoose && casc.sign() < 0) - bitset(compatibleOmegaMinus, 0); - if (TMath::Abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && TMath::Abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && TMath::Abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigma && casc.sign() < 0) - bitset(compatibleOmegaMinus, 1); - if (TMath::Abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && TMath::Abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && TMath::Abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaTight && casc.sign() < 0) - bitset(compatibleOmegaMinus, 2); - - if (TMath::Abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && TMath::Abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && TMath::Abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaLoose && casc.sign() > 0) - bitset(compatibleOmegaPlus, 0); - if (TMath::Abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && TMath::Abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && TMath::Abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigma && casc.sign() > 0) - bitset(compatibleOmegaPlus, 1); - if (TMath::Abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && TMath::Abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && TMath::Abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaTight && casc.sign() > 0) - bitset(compatibleOmegaPlus, 2); + if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && casc.sign() < 0) + BIT_SET(compatibleXiMinus, 0); + if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && casc.sign() < 0) + BIT_SET(compatibleXiMinus, 1); + if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && casc.sign() < 0) + BIT_SET(compatibleXiMinus, 2); + + if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && casc.sign() > 0) + BIT_SET(compatibleXiPlus, 0); + if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && casc.sign() > 0) + BIT_SET(compatibleXiPlus, 1); + if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && casc.sign() > 0) + BIT_SET(compatibleXiPlus, 2); + + if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaLoose && casc.sign() < 0) + BIT_SET(compatibleOmegaMinus, 0); + if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigma && casc.sign() < 0) + BIT_SET(compatibleOmegaMinus, 1); + if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaTight && casc.sign() < 0) + BIT_SET(compatibleOmegaMinus, 2); + + if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaLoose && casc.sign() > 0) + BIT_SET(compatibleOmegaPlus, 0); + if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigma && casc.sign() > 0) + BIT_SET(compatibleOmegaPlus, 1); + if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaTight && casc.sign() > 0) + BIT_SET(compatibleOmegaPlus, 2); float massNSigmaXi = (casc.mXi() - fXiMean->Eval(casc.pt())) / (fXiWidth->Eval(casc.pt()) + 1e-6); float massNSigmaOmega = (casc.mOmega() - fOmegaMean->Eval(casc.pt())) / (fOmegaWidth->Eval(casc.pt()) + 1e-6); @@ -670,18 +681,18 @@ struct hstrangecorrelationfilter { } } - PROCESS_SWITCH(hstrangecorrelationfilter, processTriggers, "Produce trigger tables", true); - PROCESS_SWITCH(hstrangecorrelationfilter, processTriggersMC, "Produce trigger tables for MC", false); - PROCESS_SWITCH(hstrangecorrelationfilter, processV0s, "Produce associated V0 tables", true); - PROCESS_SWITCH(hstrangecorrelationfilter, processAssocPions, "Produce associated Pion tables", false); - PROCESS_SWITCH(hstrangecorrelationfilter, processAssocPionsMC, "Produce associated Pion tables for MC", false); - PROCESS_SWITCH(hstrangecorrelationfilter, processCascades, "Produce associated cascade tables", true); - PROCESS_SWITCH(hstrangecorrelationfilter, processAssocHadrons, "Produce associated Hadron tables", true); - PROCESS_SWITCH(hstrangecorrelationfilter, processAssocHadronsMC, "Produce associated Hadron tables for MC", false); + PROCESS_SWITCH(HStrangeCorrelationFilter, processTriggers, "Produce trigger tables", true); + PROCESS_SWITCH(HStrangeCorrelationFilter, processTriggersMC, "Produce trigger tables for MC", false); + PROCESS_SWITCH(HStrangeCorrelationFilter, processV0s, "Produce associated V0 tables", true); + PROCESS_SWITCH(HStrangeCorrelationFilter, processAssocPions, "Produce associated Pion tables", false); + PROCESS_SWITCH(HStrangeCorrelationFilter, processAssocPionsMC, "Produce associated Pion tables for MC", false); + PROCESS_SWITCH(HStrangeCorrelationFilter, processCascades, "Produce associated cascade tables", true); + PROCESS_SWITCH(HStrangeCorrelationFilter, processAssocHadrons, "Produce associated Hadron tables", true); + PROCESS_SWITCH(HStrangeCorrelationFilter, processAssocHadronsMC, "Produce associated Hadron tables for MC", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc)}; + adaptAnalysisTask(cfgc)}; } From 88b926114f65e705880027e987390f784c711230 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Fri, 7 Mar 2025 03:50:42 +0900 Subject: [PATCH 0579/1650] [PWGEM/Dilepton] update treeCreatorElectronMLDDA.cxx (#10364) --- .../treeCreatorElectronMLDDA.cxx | 173 +++++++++++------- 1 file changed, 110 insertions(+), 63 deletions(-) diff --git a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx index fc07180c8c4..8665b208a1c 100644 --- a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx +++ b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx @@ -37,6 +37,7 @@ #include "DetectorsBase/GeometryManager.h" #include "DataFormatsParameters/GRPObject.h" #include "DataFormatsParameters/GRPMagField.h" +#include "DataFormatsCalibration/MeanVertexObject.h" #include "CCDB/BasicCCDBManager.h" #include "PWGEM/Dilepton/DataModel/lmeeMLTables.h" #include "PWGEM/Dilepton/Utils/PairUtilities.h" @@ -52,7 +53,7 @@ using namespace o2::constants::physics; using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; -using MyTracks = soa::Join; using MyTrack = MyTracks::iterator; @@ -103,19 +104,19 @@ struct TreeCreatorElectronMLDDA { {"V0/hITSClusterSize_P_Ka", "mean ITS cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, {"V0/hITSClusterSize_P_Pr", "mean ITS cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, - {"PrimaryTrack/hTPCdEdx_P", "TPC dEdx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, - {"PrimaryTrack/hTOFbeta_P", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, - {"PrimaryTrack/hITSClusterSize_P", "mean ITS cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, - {"PrimaryTrack/hTPCNsigmaEl_P", "TPC n#sigma_{e} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{e}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - {"PrimaryTrack/hTPCNsigmaMu_P", "TPC n#sigma_{#mu} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{#mu}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - {"PrimaryTrack/hTPCNsigmaPi_P", "TPC n#sigma_{#pi} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{#pi}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - {"PrimaryTrack/hTPCNsigmaKa_P", "TPC n#sigma_{K} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{K}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - {"PrimaryTrack/hTPCNsigmaPr_P", "TPC n#sigma_{p} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{p}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - {"PrimaryTrack/hTOFNsigmaEl_P", "TOF n#sigma_{e} vs. p;p^{ITS-TOF} (GeV/c);n #sigma_{e}^{TOF}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - {"PrimaryTrack/hTOFNsigmaMu_P", "TOF n#sigma_{#mu} vs. p;p^{ITS-TOF} (GeV/c);n #sigma_{#mu}^{TOF}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - {"PrimaryTrack/hTOFNsigmaPi_P", "TOF n#sigma_{#pi} vs. p;p^{ITS-TOF} (GeV/c);n #sigma_{#pi}^{TOF}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - {"PrimaryTrack/hTOFNsigmaKa_P", "TOF n#sigma_{K} vs. p;p^{ITS-TOF} (GeV/c);n #sigma_{K}^{TOF}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - {"PrimaryTrack/hTOFNsigmaPr_P", "TOF n#sigma_{p} vs. p;p^{ITS-TOF} (GeV/c);n #sigma_{p}^{TOF}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, + // {"PrimaryTrack/hTPCdEdx_P", "TPC dEdx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, + // {"PrimaryTrack/hTOFbeta_P", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, + // {"PrimaryTrack/hITSClusterSize_P", "mean ITS cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, + // {"PrimaryTrack/hTPCNsigmaEl_P", "TPC n#sigma_{e} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{e}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, + // {"PrimaryTrack/hTPCNsigmaMu_P", "TPC n#sigma_{#mu} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{#mu}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, + // {"PrimaryTrack/hTPCNsigmaPi_P", "TPC n#sigma_{#pi} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{#pi}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, + // {"PrimaryTrack/hTPCNsigmaKa_P", "TPC n#sigma_{K} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{K}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, + // {"PrimaryTrack/hTPCNsigmaPr_P", "TPC n#sigma_{p} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{p}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, + // {"PrimaryTrack/hTOFNsigmaEl_P", "TOF n#sigma_{e} vs. p;p^{ITS-TOF} (GeV/c);n #sigma_{e}^{TOF}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, + // {"PrimaryTrack/hTOFNsigmaMu_P", "TOF n#sigma_{#mu} vs. p;p^{ITS-TOF} (GeV/c);n #sigma_{#mu}^{TOF}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, + // {"PrimaryTrack/hTOFNsigmaPi_P", "TOF n#sigma_{#pi} vs. p;p^{ITS-TOF} (GeV/c);n #sigma_{#pi}^{TOF}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, + // {"PrimaryTrack/hTOFNsigmaKa_P", "TOF n#sigma_{K} vs. p;p^{ITS-TOF} (GeV/c);n #sigma_{K}^{TOF}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, + // {"PrimaryTrack/hTOFNsigmaPr_P", "TOF n#sigma_{p} vs. p;p^{ITS-TOF} (GeV/c);n #sigma_{p}^{TOF}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, {"Cascade/hRxy_Xi", "R_{xy} of cascade vs. mass;m_{#Lambda#pi};R_{xy} (cm)", {HistType::kTH2F, {{200, 1.2, 1.4}, {200, 0, 20.f}}}}, {"Cascade/hRxy_Omega", "R_{xy} of cascade vs. mass;m_{#LambdaK};R_{xy} (cm)", {HistType::kTH2F, {{200, 1.6, 1.8}, {200, 0, 20.f}}}}, @@ -144,6 +145,7 @@ struct TreeCreatorElectronMLDDA { Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; + Configurable mVtxPath{"mVtxPath", "GLO/Calib/MeanVertex", "Path of the mean vertex file"}; Configurable skipGRPOquery{"skipGRPOquery", true, "skip grpo query"}; // Operation and minimisation criteria Configurable d_bz_input{"d_bz_input", -999, "bz field, -999 is automatic"}; @@ -170,6 +172,7 @@ struct TreeCreatorElectronMLDDA { Configurable cfg_max_chi2tpc{"cfg_max_chi2tpc", 5.0, "max chi2/NclsTPC"}; Configurable cfg_max_chi2its{"cfg_max_chi2its", 6.0, "max chi2/NclsITS"}; Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 0.3, "max dca XY in cm"}; + Configurable cfg_max_dcaz{"cfg_max_dcaz", 0.3, "max dca Z in cm"}; } trackcuts; struct : ConfigurableGroup { @@ -244,7 +247,11 @@ struct TreeCreatorElectronMLDDA { int mRunNumber; float d_bz; Service ccdb; + o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT; + o2::dataformats::VertexBase mVtx; + const o2::dataformats::MeanVertexObject* mMeanVtx = nullptr; o2::base::MatLayerCylSet* lut = nullptr; + o2::dataformats::DCA mDcaInfoCov; std::mt19937 engine; std::uniform_real_distribution dist01; @@ -281,6 +288,14 @@ struct TreeCreatorElectronMLDDA { return; } + // load matLUT for this timestamp + if (!lut) { + LOG(info) << "Loading material look-up table for timestamp: " << bc.timestamp(); + lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->getForTimeStamp(lutPath, bc.timestamp())); + } else { + LOG(info) << "Material look-up table already in place. Not reloading."; + } + // In case override, don't proceed, please - no CCDB access required if (d_bz_input > -990) { d_bz = d_bz_input; @@ -289,6 +304,8 @@ struct TreeCreatorElectronMLDDA { grpmag.setL3Current(30000.f / (d_bz / 5.0f)); } o2::base::Propagator::initFieldFromGRP(&grpmag); + o2::base::Propagator::Instance()->setMatLUT(lut); + mMeanVtx = ccdb->getForTimeStamp(mVtxPath, bc.timestamp()); mRunNumber = bc.runNumber(); return; } @@ -300,6 +317,8 @@ struct TreeCreatorElectronMLDDA { grpo = ccdb->getForTimeStamp(grpPath, run3grp_timestamp); if (grpo) { o2::base::Propagator::initFieldFromGRP(grpo); + o2::base::Propagator::Instance()->setMatLUT(lut); + mMeanVtx = ccdb->getForTimeStamp(mVtxPath, bc.timestamp()); // Fetch magnetic field from ccdb for current collision d_bz = grpo->getNominalL3Field(); LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; @@ -309,16 +328,13 @@ struct TreeCreatorElectronMLDDA { LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for timestamp " << run3grp_timestamp; } o2::base::Propagator::initFieldFromGRP(grpmag); + o2::base::Propagator::Instance()->setMatLUT(lut); + mMeanVtx = ccdb->getForTimeStamp(mVtxPath, bc.timestamp()); // Fetch magnetic field from ccdb for current collision d_bz = std::lround(5.f * grpmag->getL3Current() / 30000.f); LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; } mRunNumber = bc.runNumber(); - - if (useMatCorrType == 2) { - // setMatLUT only after magfield has been initalized (setMatLUT has implicit and problematic init field call if not) - o2::base::Propagator::Instance()->setMatLUT(lut); - } } template @@ -339,21 +355,13 @@ struct TreeCreatorElectronMLDDA { } } - template - bool isSelectedTrack(TTrack const& track) + template + bool isSelectedTrack(TCollision const& collision, TTrack const& track) { - if (std::fabs(track.eta()) > trackcuts.cfg_max_eta || track.pt() < trackcuts.cfg_min_pt) { - return false; - } - if (!track.hasITS() || !track.hasTPC()) { return false; } - if (std::fabs(track.dcaXY()) > trackcuts.cfg_max_dcaxy) { - return false; - } - if (track.itsNCls() < trackcuts.cfg_min_ncluster_its) { return false; } @@ -379,23 +387,36 @@ struct TreeCreatorElectronMLDDA { if (track.tpcFractionSharedCls() > trackcuts.cfg_max_frac_shared_clusters_tpc) { return false; } - return true; - } - template - bool isSelectedV0Leg(TTrack const& track) - { - if (std::fabs(track.eta()) > v0cuts.cfg_max_eta || track.pt() < v0cuts.cfg_min_pt) { + mDcaInfoCov.set(999, 999, 999, 999, 999); + auto track_par_cov_recalc = getTrackParCov(track); + track_par_cov_recalc.setPID(track.pidForTracking()); + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc, 2.f, matCorr, &mDcaInfoCov); + float dcaXY = mDcaInfoCov.getY(); + float dcaZ = mDcaInfoCov.getZ(); + + if (std::fabs(track_par_cov_recalc.getEta()) > trackcuts.cfg_max_eta || track_par_cov_recalc.getPt() < trackcuts.cfg_min_pt) { return false; } - if (!track.hasITS() || !track.hasTPC()) { + if (std::fabs(dcaXY) > trackcuts.cfg_max_dcaxy) { + return false; + } + if (std::fabs(dcaZ) > trackcuts.cfg_max_dcaz) { return false; } - // if (std::fabs(track.dcaXY()) < v0cuts.cfg_min_dcaxy_v0leg) { // this is applied in filter. - // return false; - // } + return true; + } + + template + bool isSelectedV0Leg(TCollision const& collision, TTrack const& track) + { + if (!track.hasITS() || !track.hasTPC()) { + return false; + } if (track.itsNCls() < v0cuts.cfg_min_ncluster_its) { return false; @@ -422,6 +443,24 @@ struct TreeCreatorElectronMLDDA { if (track.tpcFractionSharedCls() > v0cuts.cfg_max_frac_shared_clusters_tpc) { return false; } + + mDcaInfoCov.set(999, 999, 999, 999, 999); + auto track_par_cov_recalc = getTrackParCov(track); + track_par_cov_recalc.setPID(track.pidForTracking()); + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc, 2.f, matCorr, &mDcaInfoCov); + float dcaXY = mDcaInfoCov.getY(); + // float dcaZ = mDcaInfoCov.getZ(); + + if (std::fabs(track_par_cov_recalc.getEta()) > v0cuts.cfg_max_eta || track_par_cov_recalc.getPt() < v0cuts.cfg_min_pt) { + return false; + } + + if (std::fabs(dcaXY) < v0cuts.cfg_min_dcaxy_v0leg) { // this is applied in filter. + return false; + } + return true; } @@ -477,9 +516,18 @@ struct TreeCreatorElectronMLDDA { void fillTrackTable(TCollision const& collision, TTrack const& track, const int pidlabel, const int tracktype) { if (std::find(stored_trackIds.begin(), stored_trackIds.end(), track.globalIndex()) == stored_trackIds.end()) { + mDcaInfoCov.set(999, 999, 999, 999, 999); + auto track_par_cov_recalc = getTrackParCov(track); + track_par_cov_recalc.setPID(track.pidForTracking()); + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc, 2.f, matCorr, &mDcaInfoCov); + float dcaXY = mDcaInfoCov.getY(); + float dcaZ = mDcaInfoCov.getZ(); + emprimarytracks(collision.globalIndex(), collision.posZ(), collision.numContrib(), track.pt(), track.eta(), track.phi(), track.tgl(), track.signed1Pt(), - track.dcaXY(), track.dcaZ(), track.cYY(), track.cZZ(), track.cZY(), + dcaXY, dcaZ, track_par_cov_recalc.getSigmaY2(), track_par_cov_recalc.getSigmaZ2(), track_par_cov_recalc.getSigmaZY(), track.tpcNClsFindable(), track.tpcNClsFound(), track.tpcNClsCrossedRows(), track.tpcChi2NCl(), track.tpcInnerParam(), track.tpcSignal(), track.tpcNSigmaEl(), track.tpcNSigmaMu(), track.tpcNSigmaPi(), track.tpcNSigmaKa(), track.tpcNSigmaPr(), @@ -520,7 +568,7 @@ struct TreeCreatorElectronMLDDA { for (const auto& v0 : v0s_coll) { auto pos = v0.template posTrack_as(); auto neg = v0.template negTrack_as(); - if (!isSelectedV0Leg(pos) || !isSelectedV0Leg(neg)) { + if (!isSelectedV0Leg(collision, pos) || !isSelectedV0Leg(collision, neg)) { continue; } if (pos.sign() * neg.sign() > 0) { @@ -596,7 +644,7 @@ struct TreeCreatorElectronMLDDA { auto posTracks_per_coll = posTracks->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); auto negTracks_per_coll = negTracks->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); for (const auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, negTracks_per_coll))) { - if (!isSelectedTrack(pos) || !isSelectedTrack(neg)) { + if (!isSelectedTrack(collision, pos) || !isSelectedTrack(collision, neg)) { continue; } @@ -632,7 +680,7 @@ struct TreeCreatorElectronMLDDA { auto bachelor = cascade.template bachelor_as(); auto pos = cascade.template posTrack_as(); auto neg = cascade.template negTrack_as(); - if (!isSelectedV0Leg(pos) || !isSelectedV0Leg(neg) || !isSelectedV0Leg(bachelor)) { + if (!isSelectedV0Leg(collision, pos) || !isSelectedV0Leg(collision, neg) || !isSelectedV0Leg(collision, bachelor)) { continue; } @@ -713,26 +761,25 @@ struct TreeCreatorElectronMLDDA { } } // end of cascade loop - auto tracks_coll = tracks.sliceBy(perCollision_track, collision.globalIndex()); - for (const auto& track : tracks_coll) { - if (!isSelectedTrack(track)) { - continue; - } - - registry.fill(HIST("PrimaryTrack/hTPCdEdx_P"), track.p(), track.tpcSignal()); - registry.fill(HIST("PrimaryTrack/hTOFbeta_P"), track.p(), track.beta()); - registry.fill(HIST("PrimaryTrack/hITSClusterSize_P"), track.p(), meanClusterSizeITS<0, 7>(track) * std::cos(std::atan(track.tgl()))); - registry.fill(HIST("PrimaryTrack/hTPCNsigmaEl_P"), track.p(), track.tpcNSigmaEl()); - registry.fill(HIST("PrimaryTrack/hTOFNsigmaEl_P"), track.p(), track.tofNSigmaEl()); - registry.fill(HIST("PrimaryTrack/hTPCNsigmaMu_P"), track.p(), track.tpcNSigmaMu()); - registry.fill(HIST("PrimaryTrack/hTOFNsigmaMu_P"), track.p(), track.tofNSigmaMu()); - registry.fill(HIST("PrimaryTrack/hTPCNsigmaPi_P"), track.p(), track.tpcNSigmaPi()); - registry.fill(HIST("PrimaryTrack/hTOFNsigmaPi_P"), track.p(), track.tofNSigmaPi()); - registry.fill(HIST("PrimaryTrack/hTPCNsigmaKa_P"), track.p(), track.tpcNSigmaKa()); - registry.fill(HIST("PrimaryTrack/hTOFNsigmaKa_P"), track.p(), track.tofNSigmaKa()); - registry.fill(HIST("PrimaryTrack/hTPCNsigmaPr_P"), track.p(), track.tpcNSigmaPr()); - registry.fill(HIST("PrimaryTrack/hTOFNsigmaPr_P"), track.p(), track.tofNSigmaPr()); - } // end of track loop + // auto tracks_coll = tracks.sliceBy(perCollision_track, collision.globalIndex()); + // for (const auto& track : tracks_coll) { + // if (!isSelectedTrack(collision, track)) { + // continue; + // } + // registry.fill(HIST("PrimaryTrack/hTPCdEdx_P"), track.p(), track.tpcSignal()); + // registry.fill(HIST("PrimaryTrack/hTOFbeta_P"), track.p(), track.beta()); + // registry.fill(HIST("PrimaryTrack/hITSClusterSize_P"), track.p(), meanClusterSizeITS<0, 7>(track) * std::cos(std::atan(track.tgl()))); + // registry.fill(HIST("PrimaryTrack/hTPCNsigmaEl_P"), track.p(), track.tpcNSigmaEl()); + // registry.fill(HIST("PrimaryTrack/hTOFNsigmaEl_P"), track.p(), track.tofNSigmaEl()); + // registry.fill(HIST("PrimaryTrack/hTPCNsigmaMu_P"), track.p(), track.tpcNSigmaMu()); + // registry.fill(HIST("PrimaryTrack/hTOFNsigmaMu_P"), track.p(), track.tofNSigmaMu()); + // registry.fill(HIST("PrimaryTrack/hTPCNsigmaPi_P"), track.p(), track.tpcNSigmaPi()); + // registry.fill(HIST("PrimaryTrack/hTOFNsigmaPi_P"), track.p(), track.tofNSigmaPi()); + // registry.fill(HIST("PrimaryTrack/hTPCNsigmaKa_P"), track.p(), track.tpcNSigmaKa()); + // registry.fill(HIST("PrimaryTrack/hTOFNsigmaKa_P"), track.p(), track.tofNSigmaKa()); + // registry.fill(HIST("PrimaryTrack/hTPCNsigmaPr_P"), track.p(), track.tpcNSigmaPr()); + // registry.fill(HIST("PrimaryTrack/hTOFNsigmaPr_P"), track.p(), track.tofNSigmaPr()); + // } // end of track loop } // end of collision loop stored_trackIds.clear(); From c05fff4bf2b879bf2a82643c7b2a602b3b8a5949 Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Thu, 6 Mar 2025 20:45:15 +0100 Subject: [PATCH 0580/1650] [PWGLF] Resonance Framework - Separate collision table (#10351) --- PWGLF/DataModel/LFResonanceTables.h | 92 +++++++++++++++---- .../Resonances/resonanceInitializer.cxx | 77 +++++++++++----- .../Resonances/resonanceMergeDF.cxx | 22 ++--- .../Resonances/resonanceModuleInitializer.cxx | 10 +- PWGLF/Tasks/Resonances/f0980analysis.cxx | 4 +- .../Resonances/k892SpherocityAnalysis.cxx | 2 +- PWGLF/Tasks/Resonances/k892analysis.cxx | 40 ++++---- PWGLF/Tasks/Resonances/kstar892analysis.cxx | 40 ++------ .../lambda1520SpherocityAnalysis.cxx | 3 +- PWGLF/Tasks/Resonances/lambda1520_PbPb.cxx | 2 +- PWGLF/Tasks/Resonances/lambda1520analysis.cxx | 14 +-- 11 files changed, 183 insertions(+), 123 deletions(-) diff --git a/PWGLF/DataModel/LFResonanceTables.h b/PWGLF/DataModel/LFResonanceTables.h index dc8389e0a63..589aca0155e 100644 --- a/PWGLF/DataModel/LFResonanceTables.h +++ b/PWGLF/DataModel/LFResonanceTables.h @@ -81,14 +81,7 @@ DECLARE_SOA_TABLE(ResoCollisions, "AOD", "RESOCOLLISION", collision::PosY, collision::PosZ, resocollision::Cent, - resocollision::Spherocity, - resocollision::EvtPl, - resocollision::EvtPlResAB, - resocollision::EvtPlResAC, - resocollision::EvtPlResBC, - resocollision::BMagField, - timestamp::Timestamp, - evsel::NumTracksInTimeRange); + resocollision::BMagField); using ResoCollision = ResoCollisions::iterator; DECLARE_SOA_TABLE(ResoMCCollisions, "AOD", "RESOMCCOLLISION", @@ -139,6 +132,36 @@ using ResoCollisionDF = ResoCollisionDFs::iterator; // inspired from PWGCF/DataModel/FemtoDerived.h namespace resodaughter { +struct ResoTrackFlags { + public: + typedef uint8_t flagtype; + static constexpr flagtype kPassedITSRefit = 1 << 0; + static constexpr flagtype kPassedTPCRefit = 1 << 1; + static constexpr flagtype kIsGlobalTrackWoDCA = 1 << 2; + static constexpr flagtype kIsGlobalTrack = 1 << 3; + static constexpr flagtype kIsPrimaryTrack = 1 << 4; + static constexpr flagtype kIsPVContributor = 1 << 5; + static constexpr flagtype kHasTOF = 1 << 6; + static constexpr flagtype kSign = 1 << 7; + /// @brief check if the flag is set + static bool checkFlag(const flagtype flags, const flagtype mask) + { + return (flags & mask) == mask; + } +}; +#define requireTrackFlag(mask) ((o2::aod::resodaughter::trackFlags & o2::aod::resodaughter::mask) == o2::aod::resodaughter::mask) + +#define requirePassedITSRefit() requireTrackFlag(ResoTrackFlags::kPassedITSRefit) +#define requirePassedTPCRefit() requireTrackFlag(ResoTrackFlags::kPassedTPCRefit) +#define requireGlobalTrack() requireTrackFlag(ResoTrackFlags::kIsGlobalTrack) +#define requireGlobalTrackWoDCA() requireTrackFlag(ResoTrackFlags::kIsGlobalTrackWoDCA) +#define requirePrimaryTrack() requireTrackFlag(ResoTrackFlags::kIsPrimaryTrack) +#define requirePVContributor() requireTrackFlag(ResoTrackFlags::kIsPVContributor) +#define requireHasTOF() requireTrackFlag(ResoTrackFlags::kHasTOF) +#define requireSign() requireTrackFlag(ResoTrackFlags::kSign) + +#define DECLARE_DYN_TRKSEL_COLUMN(name, getter, mask) \ + DECLARE_SOA_DYNAMIC_COLUMN(name, getter, [](ResoTrackFlags::flagtype flags) -> bool { return ResoTrackFlags::checkFlag(flags, mask); }); DECLARE_SOA_INDEX_COLUMN(ResoCollision, resoCollision); DECLARE_SOA_INDEX_COLUMN(ResoCollisionDF, resoCollisionDF); @@ -155,6 +178,8 @@ DECLARE_SOA_COLUMN(Indices, indices, int[2]); DECLARE_SOA_COLUMN(CascadeIndices, cascadeIndices, int[3]); //! Field for the track indices to remove auto-correlations (ordered: positive, negative, bachelor) DECLARE_SOA_COLUMN(TpcNClsCrossedRows, tpcNClsCrossedRows, uint8_t); //! Number of TPC crossed rows DECLARE_SOA_COLUMN(TpcNClsFound, tpcNClsFound, uint8_t); //! Number of TPC clusters found +DECLARE_SOA_COLUMN(DcaXY10000, dcaXY10000, int16_t); //! DCA_xy x10,000 in int16_t, resolution 10 um +DECLARE_SOA_COLUMN(DcaZ10000, dcaZ10000, int16_t); //! DCA_z x10,000 in int16_t, resolution 10 um DECLARE_SOA_COLUMN(TrackFlags, trackFlags, uint8_t); //! Track flags DECLARE_SOA_COLUMN(TpcNSigmaPi10, tpcNSigmaPi10, int8_t); //! TPC PID x10 of the track as Pion DECLARE_SOA_COLUMN(TpcNSigmaKa10, tpcNSigmaKa10, int8_t); //! TPC PID x10 of the track as Kaon @@ -208,6 +233,12 @@ DECLARE_SOA_COLUMN(SiblingIds, siblingIds, int[2]); //! Index of the particles DECLARE_SOA_COLUMN(BachTrkID, bachTrkID, int); //! Id of the bach track from cascade DECLARE_SOA_COLUMN(V0ID, v0ID, int); //! Id of the V0 from cascade // Dynamic columns +// DCA_xy x10,000 +DECLARE_SOA_DYNAMIC_COLUMN(DcaXY, dcaXY, + [](int16_t dcaXY10000) { return (float)dcaXY10000 / 10000.f; }); +// DCA_z x10,000 +DECLARE_SOA_DYNAMIC_COLUMN(DcaZ, dcaZ, + [](int16_t dcaZ10000) { return (float)dcaZ10000 / 10000.f; }); // TPC PID return value/10 DECLARE_SOA_DYNAMIC_COLUMN(TpcNSigmaPi, tpcNSigmaPi, [](int8_t tpcNSigmaPi10) { return (float)tpcNSigmaPi10 / 10.f; }); @@ -266,21 +297,38 @@ DECLARE_SOA_DYNAMIC_COLUMN(Eta, eta, [](float px, float py, float pz) -> float { DECLARE_SOA_DYNAMIC_COLUMN(Phi, phi, [](float px, float py) -> float { return RecoDecay::phi(px, py); }); // Track flags DECLARE_SOA_DYNAMIC_COLUMN(PassedITSRefit, passedITSRefit, - [](uint8_t trackFlags) -> bool { return (trackFlags & (1 << 0)) != 0; }); + [](ResoTrackFlags::flagtype trackFlags) -> bool { + return ResoTrackFlags::checkFlag(trackFlags, ResoTrackFlags::kPassedITSRefit); + }); DECLARE_SOA_DYNAMIC_COLUMN(PassedTPCRefit, passedTPCRefit, - [](uint8_t trackFlags) -> bool { return (trackFlags & (1 << 1)) != 0; }); + [](ResoTrackFlags::flagtype trackFlags) -> bool { + return ResoTrackFlags::checkFlag(trackFlags, ResoTrackFlags::kPassedTPCRefit); + }); DECLARE_SOA_DYNAMIC_COLUMN(IsGlobalTrackWoDCA, isGlobalTrackWoDCA, - [](uint8_t trackFlags) -> bool { return (trackFlags & (1 << 2)) != 0; }); + [](ResoTrackFlags::flagtype trackFlags) -> bool { + return ResoTrackFlags::checkFlag(trackFlags, ResoTrackFlags::kIsGlobalTrackWoDCA); + }); DECLARE_SOA_DYNAMIC_COLUMN(IsGlobalTrack, isGlobalTrack, - [](uint8_t trackFlags) -> bool { return (trackFlags & (1 << 3)) != 0; }); + [](ResoTrackFlags::flagtype trackFlags) -> bool { + return ResoTrackFlags::checkFlag(trackFlags, ResoTrackFlags::kIsGlobalTrack); + }); DECLARE_SOA_DYNAMIC_COLUMN(IsPrimaryTrack, isPrimaryTrack, - [](uint8_t trackFlags) -> bool { return (trackFlags & (1 << 4)) != 0; }); + [](ResoTrackFlags::flagtype trackFlags) -> bool { + return ResoTrackFlags::checkFlag(trackFlags, ResoTrackFlags::kIsPrimaryTrack); + }); DECLARE_SOA_DYNAMIC_COLUMN(IsPVContributor, isPVContributor, - [](uint8_t trackFlags) -> bool { return (trackFlags & (1 << 5)) != 0; }); + [](ResoTrackFlags::flagtype trackFlags) -> bool { + return ResoTrackFlags::checkFlag(trackFlags, ResoTrackFlags::kIsPVContributor); + }); DECLARE_SOA_DYNAMIC_COLUMN(HasTOF, hasTOF, - [](uint8_t trackFlags) -> bool { return (trackFlags & (1 << 6)) != 0; }); + [](ResoTrackFlags::flagtype trackFlags) -> bool { + return ResoTrackFlags::checkFlag(trackFlags, ResoTrackFlags::kHasTOF); + }); DECLARE_SOA_DYNAMIC_COLUMN(Sign, sign, - [](uint8_t trackFlags) -> int8_t { return (trackFlags & (1 << 7)) ? 1 : -1; }); + [](ResoTrackFlags::flagtype trackFlags) -> int8_t { + return (trackFlags & ResoTrackFlags::kSign) ? 1 : -1; + }); + } // namespace resodaughter DECLARE_SOA_TABLE(ResoTracks, "AOD", "RESOTRACK", o2::soa::Index<>, @@ -292,8 +340,8 @@ DECLARE_SOA_TABLE(ResoTracks, "AOD", "RESOTRACK", resodaughter::Pz, resodaughter::TpcNClsCrossedRows, resodaughter::TpcNClsFound, - o2::aod::track::DcaXY, - o2::aod::track::DcaZ, + resodaughter::DcaXY10000, + resodaughter::DcaZ10000, resodaughter::TpcNSigmaPi10, resodaughter::TpcNSigmaKa10, resodaughter::TpcNSigmaPr10, @@ -311,6 +359,8 @@ DECLARE_SOA_TABLE(ResoTracks, "AOD", "RESOTRACK", resodaughter::TofNSigmaPr, resodaughter::TpcSignal, // resodaughter::Pt, + resodaughter::DcaXY, + resodaughter::DcaZ, resodaughter::Eta, resodaughter::Phi, resodaughter::PassedITSRefit, @@ -334,8 +384,8 @@ DECLARE_SOA_TABLE(ResoTrackDFs, "AOD", "RESOTRACKDF", resodaughter::Pz, resodaughter::TpcNClsCrossedRows, resodaughter::TpcNClsFound, - o2::aod::track::DcaXY, - o2::aod::track::DcaZ, + resodaughter::DcaXY10000, + resodaughter::DcaZ10000, resodaughter::TpcNSigmaPi10, resodaughter::TpcNSigmaKa10, resodaughter::TpcNSigmaPr10, @@ -353,6 +403,8 @@ DECLARE_SOA_TABLE(ResoTrackDFs, "AOD", "RESOTRACKDF", resodaughter::TofNSigmaPr, resodaughter::TpcSignal, // resodaughter::Pt, + resodaughter::DcaXY, + resodaughter::DcaZ, resodaughter::Eta, resodaughter::Phi, resodaughter::PassedITSRefit, diff --git a/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx b/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx index 2c8662d1dc1..0c5e0c3ce45 100644 --- a/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx +++ b/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx @@ -59,6 +59,8 @@ struct ResonanceInitializer { Produces resoCollisions; Produces resoMCCollisions; + Produces resoSpheroCollisions; + Produces resoEvtPlCollisions; Produces reso2trks; Produces reso2v0s; Produces reso2cascades; @@ -615,8 +617,8 @@ struct ResonanceInitializer { track.pz(), (uint8_t)track.tpcNClsCrossedRows(), (uint8_t)track.tpcNClsFound(), - track.dcaXY(), - track.dcaZ(), + static_cast(track.dcaXY() * 10000), + static_cast(track.dcaZ() * 10000), (int8_t)(track.tpcNSigmaPi() * 10), (int8_t)(track.tpcNSigmaKa() * 10), (int8_t)(track.tpcNSigmaPr() * 10), @@ -1194,7 +1196,9 @@ struct ResonanceInitializer { return; colCuts.fillQA(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), computeSpherocity(tracks, trackSphMin, trackSphDef), 0., 0., 0., 0., dBz, bc.timestamp(), collision.trackOccupancyInTimeRange()); + resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); + resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); fillTracks(collision, tracks); } @@ -1204,13 +1208,15 @@ struct ResonanceInitializer { soa::Filtered const& tracks, BCsWithRun2Info const&) { - auto bc = collision.bc_as(); + // auto bc = collision.bc_as(); // Default event selection if (!colCuts.isSelected(collision)) return; colCuts.fillQARun2(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), collision.centRun2V0M(), computeSpherocity(tracks, trackSphMin, trackSphDef), 0., 0., 0., 0., dBz, bc.timestamp(), collision.trackOccupancyInTimeRange()); + resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), collision.centRun2V0M(), dBz); + resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); fillTracks(collision, tracks); } @@ -1227,8 +1233,9 @@ struct ResonanceInitializer { return; colCuts.fillQA(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), computeSpherocity(tracks, trackSphMin, trackSphDef), getEvtPl(collision), getEvtPlRes(collision, evtPlDetId, evtPlRefAId), getEvtPlRes(collision, evtPlDetId, evtPlRefBId), getEvtPlRes(collision, evtPlRefAId, evtPlRefBId), dBz, bc.timestamp(), collision.trackOccupancyInTimeRange()); - + resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); + resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(collision.globalIndex(), getEvtPl(collision), getEvtPlRes(collision, evtPlDetId, evtPlRefAId), getEvtPlRes(collision, evtPlDetId, evtPlRefBId), getEvtPlRes(collision, evtPlRefAId, evtPlRefBId)); fillTracks(collision, tracks); } PROCESS_SWITCH(ResonanceInitializer, processTrackEPData, "Process for data and ep ana", false); @@ -1245,7 +1252,9 @@ struct ResonanceInitializer { return; colCuts.fillQA(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), computeSpherocity(tracks, trackSphMin, trackSphDef), 0., 0., 0., 0., dBz, bc.timestamp(), collision.trackOccupancyInTimeRange()); + resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); + resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); fillTracks(collision, tracks); fillV0s(collision, V0s, tracks); @@ -1257,13 +1266,15 @@ struct ResonanceInitializer { ResoV0s const& V0s, BCsWithRun2Info const&) { - auto bc = collision.bc_as(); + // auto bc = collision.bc_as(); // Default event selection if (!colCuts.isSelected(collision)) return; colCuts.fillQARun2(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), collision.centRun2V0M(), computeSpherocity(tracks, trackSphMin, trackSphDef), 0., 0., 0., 0., dBz, bc.timestamp(), collision.trackOccupancyInTimeRange()); + resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), collision.centRun2V0M(), dBz); + resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); fillTracks(collision, tracks); fillV0s(collision, V0s, tracks); @@ -1283,8 +1294,9 @@ struct ResonanceInitializer { return; colCuts.fillQA(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), computeSpherocity(tracks, trackSphMin, trackSphDef), 0., 0., 0., 0., dBz, bc.timestamp(), collision.trackOccupancyInTimeRange()); - + resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); + resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); fillTracks(collision, tracks); fillV0s(collision, V0s, tracks); fillCascades(collision, Cascades, tracks); @@ -1297,13 +1309,15 @@ struct ResonanceInitializer { ResoCascades const& Cascades, BCsWithRun2Info const&) { - auto bc = collision.bc_as(); + // auto bc = collision.bc_as(); // Default event selection if (!colCuts.isSelected(collision)) return; colCuts.fillQARun2(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), collision.centRun2V0M(), computeSpherocity(tracks, trackSphMin, trackSphDef), 0., 0., 0., 0., dBz, bc.timestamp(), collision.trackOccupancyInTimeRange()); + resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), collision.centRun2V0M(), dBz); + resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); fillTracks(collision, tracks); fillV0s(collision, V0s, tracks); @@ -1320,8 +1334,9 @@ struct ResonanceInitializer { initCCDB(bc); colCuts.fillQA(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), computeSpherocity(tracks, trackSphMin, trackSphDef), 0., 0., 0., 0., dBz, bc.timestamp(), collision.trackOccupancyInTimeRange()); - + resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); + resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); auto mccollision = collision.mcCollision_as(); float impactpar = mccollision.impactParameter(); fillMCCollision(collision, mcParticles, impactpar); @@ -1343,7 +1358,9 @@ struct ResonanceInitializer { initCCDB(bc); colCuts.fillQA(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), computeSpherocity(tracks, trackSphMin, trackSphDef), getEvtPl(collision), getEvtPlRes(collision, evtPlDetId, evtPlRefAId), getEvtPlRes(collision, evtPlDetId, evtPlRefBId), getEvtPlRes(collision, evtPlRefAId, evtPlRefBId), dBz, bc.timestamp(), collision.trackOccupancyInTimeRange()); + resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); + resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(collision.globalIndex(), getEvtPl(collision), getEvtPlRes(collision, evtPlDetId, evtPlRefAId), getEvtPlRes(collision, evtPlDetId, evtPlRefBId), getEvtPlRes(collision, evtPlRefAId, evtPlRefBId)); fillMCCollision(collision, mcParticles); // Loop over tracks @@ -1359,10 +1376,12 @@ struct ResonanceInitializer { aod::McCollisions const&, soa::Filtered const& tracks, aod::McParticles const& mcParticles, BCsWithRun2Info const&) { - auto bc = collision.bc_as(); + // auto bc = collision.bc_as(); colCuts.fillQARun2(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), collision.centRun2V0M(), computeSpherocity(tracks, trackSphMin, trackSphDef), 0., 0., 0., 0., dBz, bc.timestamp(), collision.trackOccupancyInTimeRange()); + resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), collision.centRun2V0M(), dBz); + resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); fillMCCollision(collision, mcParticles); // Loop over tracks @@ -1383,7 +1402,9 @@ struct ResonanceInitializer { initCCDB(bc); colCuts.fillQA(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), computeSpherocity(tracks, trackSphMin, trackSphDef), 0., 0., 0., 0., dBz, bc.timestamp(), collision.trackOccupancyInTimeRange()); + resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); + resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); fillMCCollision(collision, mcParticles); // Loop over tracks @@ -1401,10 +1422,12 @@ struct ResonanceInitializer { ResoV0sMC const& V0s, aod::McParticles const& mcParticles, BCsWithRun2Info const&) { - auto bc = collision.bc_as(); + // auto bc = collision.bc_as(); colCuts.fillQARun2(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), collision.centRun2V0M(), computeSpherocity(tracks, trackSphMin, trackSphDef), 0., 0., 0., 0., dBz, bc.timestamp(), collision.trackOccupancyInTimeRange()); + resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), collision.centRun2V0M(), dBz); + resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); fillMCCollision(collision, mcParticles); // Loop over tracks @@ -1427,7 +1450,9 @@ struct ResonanceInitializer { initCCDB(bc); colCuts.fillQA(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), computeSpherocity(tracks, trackSphMin, trackSphDef), 0., 0., 0., 0., dBz, bc.timestamp(), collision.trackOccupancyInTimeRange()); + resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); + resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); fillMCCollision(collision, mcParticles); // Loop over tracks @@ -1447,10 +1472,12 @@ struct ResonanceInitializer { ResoCascadesMC const& Cascades, aod::McParticles const& mcParticles, BCsWithRun2Info const&) { - auto bc = collision.bc_as(); + // auto bc = collision.bc_as(); colCuts.fillQARun2(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), collision.centRun2V0M(), computeSpherocity(tracks, trackSphMin, trackSphDef), 0., 0., 0., 0., dBz, bc.timestamp(), collision.trackOccupancyInTimeRange()); + resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), collision.centRun2V0M(), dBz); + resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); fillMCCollision(collision, mcParticles); // Loop over tracks diff --git a/PWGLF/TableProducer/Resonances/resonanceMergeDF.cxx b/PWGLF/TableProducer/Resonances/resonanceMergeDF.cxx index 9bc266020a6..e7c31d1010e 100644 --- a/PWGLF/TableProducer/Resonances/resonanceMergeDF.cxx +++ b/PWGLF/TableProducer/Resonances/resonanceMergeDF.cxx @@ -99,7 +99,7 @@ struct ResonanceMergeDF { std::vector> vecOfTuples; std::vector>> vecOfVecOfTuples; @@ -107,10 +107,10 @@ struct ResonanceMergeDF { { int nCollisions = nDF; - vecOfTuples.push_back(std::make_tuple(collision.posX(), collision.posY(), collision.posZ(), collision.cent(), collision.spherocity(), collision.evtPl(), collision.trackOccupancyInTimeRange())); + vecOfTuples.push_back(std::make_tuple(collision.posX(), collision.posY(), collision.posZ(), collision.cent(), 0, 0, 0)); std::vector> innerVector; @@ -146,8 +146,8 @@ struct ResonanceMergeDF { track.sign(), (uint8_t)track.tpcNClsCrossedRows(), (uint8_t)track.tpcNClsFound(), - track.dcaXY(), - track.dcaZ(), + static_cast(track.dcaXY() * 10000), + static_cast(track.dcaZ() * 10000), (int8_t)(track.tpcNSigmaPi() * 10), (int8_t)(track.tpcNSigmaKa() * 10), (int8_t)(track.tpcNSigmaPr() * 10), @@ -209,7 +209,7 @@ struct ResonanceMergeDF { histos.fill(HIST("Event/h1d_ft0_mult_percentile"), collision.cent()); - resoCollisionsdf(0, collision.posX(), collision.posY(), collision.posZ(), collision.cent(), collision.spherocity(), collision.evtPl(), 0., 0., 0., 0., 0, collision.trackOccupancyInTimeRange()); + resoCollisionsdf(0, collision.posX(), collision.posY(), collision.posZ(), collision.cent(), 0, 0, 0., 0., 0., 0., 0, 0); for (const auto& track : tracks) { if (isPrimary && !track.isPrimaryTrack()) @@ -242,8 +242,8 @@ struct ResonanceMergeDF { track.pz(), (uint8_t)track.tpcNClsCrossedRows(), (uint8_t)track.tpcNClsFound(), - track.dcaXY(), - track.dcaZ(), + static_cast(track.dcaXY() * 10000), + static_cast(track.dcaZ() * 10000), (int8_t)(track.tpcNSigmaPi() * 10), (int8_t)(track.tpcNSigmaKa() * 10), (int8_t)(track.tpcNSigmaPr() * 10), @@ -266,7 +266,7 @@ struct ResonanceMergeDF { if (collision.cent() < minCent || collision.cent() > maxCent) return; - resoCollisionsdf(0, collision.posX(), collision.posY(), collision.posZ(), collision.cent(), collision.spherocity(), collision.evtPl(), 0., 0., 0., 0., 0, collision.trackOccupancyInTimeRange()); + resoCollisionsdf(0, collision.posX(), collision.posY(), collision.posZ(), collision.cent(), 0, 0, 0., 0., 0., 0., 0, 0); histos.fill(HIST("Event/h1d_ft0_mult_percentile"), collision.cent()); for (const auto& track : tracks) { @@ -305,8 +305,8 @@ struct ResonanceMergeDF { track.pz(), (uint8_t)track.tpcNClsCrossedRows(), (uint8_t)track.tpcNClsFound(), - track.dcaXY(), - track.dcaZ(), + static_cast(track.dcaXY() * 10000), + static_cast(track.dcaZ() * 10000), (int8_t)(track.tpcNSigmaPi() * 10), (int8_t)(track.tpcNSigmaKa() * 10), (int8_t)(track.tpcNSigmaPr() * 10), diff --git a/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx b/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx index 89ad777a59a..38ae54f4944 100644 --- a/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx +++ b/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx @@ -532,7 +532,7 @@ struct ResonanceModuleInitializer { colCuts.fillQA(collision); centrality = centEst(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centrality, -999, 0., 0., 0., 0., dBz, bc.timestamp(), collision.trackOccupancyInTimeRange()); + resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centrality, dBz); } PROCESS_SWITCH(ResonanceModuleInitializer, processRun3, "Default process for RUN3", false); @@ -545,14 +545,14 @@ struct ResonanceModuleInitializer { void processRun2(soa::Filtered::iterator const& collision, aod::BCsWithRun2Info const&) { - auto bc = collision.bc_as(); + // auto bc = collision.bc_as(); // Default event selection if (!colCuts.isSelected(collision)) return; colCuts.fillQARun2(collision); centrality = collision.centRun2V0M(); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centrality, -999, 0., 0., 0., 0., dBz, bc.timestamp(), -999); + resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centrality, dBz); } PROCESS_SWITCH(ResonanceModuleInitializer, processRun2, "process for RUN2", false); @@ -757,8 +757,8 @@ struct ResonanceDaughterInitializer { track.pz(), (uint8_t)track.tpcNClsCrossedRows(), (uint8_t)track.tpcNClsFound(), - track.dcaXY(), - track.dcaZ(), + static_cast(track.dcaXY() * 10000), + static_cast(track.dcaZ() * 10000), (int8_t)(track.tpcNSigmaPi() * 10), (int8_t)(track.tpcNSigmaKa() * 10), (int8_t)(track.tpcNSigmaPr() * 10), diff --git a/PWGLF/Tasks/Resonances/f0980analysis.cxx b/PWGLF/Tasks/Resonances/f0980analysis.cxx index d7b944e2ef6..01b059a7f29 100644 --- a/PWGLF/Tasks/Resonances/f0980analysis.cxx +++ b/PWGLF/Tasks/Resonances/f0980analysis.cxx @@ -288,7 +288,7 @@ struct f0980analysis { } } - void processData(aod::ResoCollision& collision, + void processData(soa::Join::iterator const& collision, aod::ResoTracks const& resotracks) { fillHistograms(collision, resotracks); @@ -296,7 +296,7 @@ struct f0980analysis { PROCESS_SWITCH(f0980analysis, processData, "Process Event for data", true); void processMCLight( - aod::ResoCollision& collision, + soa::Join::iterator const& collision, soa::Join const& resotracks) { fillHistograms(collision, resotracks); diff --git a/PWGLF/Tasks/Resonances/k892SpherocityAnalysis.cxx b/PWGLF/Tasks/Resonances/k892SpherocityAnalysis.cxx index 1c3490e0164..7081f79c751 100644 --- a/PWGLF/Tasks/Resonances/k892SpherocityAnalysis.cxx +++ b/PWGLF/Tasks/Resonances/k892SpherocityAnalysis.cxx @@ -437,7 +437,7 @@ struct k892Analysis { } } - using resoCols = aod::ResoCollisions; + using resoCols = soa::Join; using resoTracks = aod::ResoTracks; void processData(resoCols::iterator const& collision, resoTracks const& tracks) diff --git a/PWGLF/Tasks/Resonances/k892analysis.cxx b/PWGLF/Tasks/Resonances/k892analysis.cxx index f36263f93f2..34e4cc662a0 100644 --- a/PWGLF/Tasks/Resonances/k892analysis.cxx +++ b/PWGLF/Tasks/Resonances/k892analysis.cxx @@ -59,8 +59,8 @@ struct K892analysis { Configurable invmass1D{"invmass1D", false, "Invariant mass 1D"}; Configurable studyAntiparticle{"studyAntiparticle", false, "Study anti-particles separately"}; Configurable fillPidPlots{"fillPidPlots", false, "Make TPC and TOF PID plots"}; - Configurable applyOccupancyCut{"applyOccupancyCut", false, "Apply occupancy cut"}; - Configurable occupancyCut{"occupancyCut", 1000, "Mimimum Occupancy cut"}; + // Configurable applyOccupancyCut{"applyOccupancyCut", false, "Apply occupancy cut"}; + // Configurable occupancyCut{"occupancyCut", 1000, "Mimimum Occupancy cut"}; /// Event Mixing Configurable nEvtMixing{"nEvtMixing", 5, "Number of events to mix"}; @@ -137,7 +137,7 @@ struct K892analysis { AxisSpec ptAxisQA = {binsPtQA, "#it{p}_{T} (GeV/#it{c})"}; AxisSpec invMassAxis = {cInvMassBins, cInvMassStart, cInvMassEnd, "Invariant Mass (GeV/#it{c}^2)"}; AxisSpec pidQAAxis = {cPIDBins, -cPIDQALimit, cPIDQALimit}; - AxisSpec occupancyAxis = {occupancyBins, "Occupancy [-40,100]"}; + // AxisSpec occupancyAxis = {occupancyBins, "Occupancy [-40,100]"}; if (additionalQAeventPlots) { // Test on Mixed event @@ -247,17 +247,17 @@ struct K892analysis { } // 3d histogram - histos.add("h3k892invmassDS", "Invariant mass of K(892)0 differnt sign", kTHnSparseF, {centAxis, ptAxis, invMassAxis, occupancyAxis}); - histos.add("h3k892invmassLS", "Invariant mass of K(892)0 same sign", kTHnSparseF, {centAxis, ptAxis, invMassAxis, occupancyAxis}); - histos.add("h3k892invmassME", "Invariant mass of K(892)0 mixed event", kTHnSparseF, {centAxis, ptAxis, invMassAxis, occupancyAxis}); - histos.add("h3k892invmassLSAnti", "Invariant mass of Anti-K(892)0 same sign", kTHnSparseF, {centAxis, ptAxis, invMassAxis, occupancyAxis}); + histos.add("h3k892invmassDS", "Invariant mass of K(892)0 differnt sign", kTHnSparseF, {centAxis, ptAxis, invMassAxis}); + histos.add("h3k892invmassLS", "Invariant mass of K(892)0 same sign", kTHnSparseF, {centAxis, ptAxis, invMassAxis}); + histos.add("h3k892invmassME", "Invariant mass of K(892)0 mixed event", kTHnSparseF, {centAxis, ptAxis, invMassAxis}); + histos.add("h3k892invmassLSAnti", "Invariant mass of Anti-K(892)0 same sign", kTHnSparseF, {centAxis, ptAxis, invMassAxis}); if (studyAntiparticle) { - histos.add("h3k892invmassDSAnti", "Invariant mass of Anti-K(892)0 differnt sign", kTHnSparseF, {centAxis, ptAxis, invMassAxis, occupancyAxis}); + histos.add("h3k892invmassDSAnti", "Invariant mass of Anti-K(892)0 differnt sign", kTHnSparseF, {centAxis, ptAxis, invMassAxis}); } if (isCalcRotBkg) { - histos.add("h3K892InvMassRotation", "Invariant mass of K(892)0 rotation", kTHnSparseF, {centAxis, ptAxis, invMassAxis, occupancyAxis}); + histos.add("h3K892InvMassRotation", "Invariant mass of K(892)0 rotation", kTHnSparseF, {centAxis, ptAxis, invMassAxis}); } if (additionalMEPlots) { @@ -434,10 +434,10 @@ struct K892analysis { if (additionalEvsel && !eventSelected(collision, multiplicity)) { return; } - auto occupancyNo = collision.trackOccupancyInTimeRange(); - if (applyOccupancyCut && occupancyNo < occupancyCut) { - return; - } + // auto occupancyNo = collision.trackOccupancyInTimeRange(); + // if (applyOccupancyCut && occupancyNo < occupancyCut) { + // return; + // } if (additionalQAplots) { histos.fill(HIST("MultCalib/centglopi_before"), multiplicity, dTracks1.size()); // centrality vs global tracks before the multiplicity calibration cuts @@ -616,28 +616,28 @@ struct K892analysis { float theta2 = rn->Uniform(constants::math::PI - constants::math::PI / rotationalCut, constants::math::PI + constants::math::PI / rotationalCut); ldaughterRot.SetPtEtaPhiM(trk2.pt(), trk2.eta(), trk2.phi() + theta2, massKa); // for rotated background lresonanceRot = lDecayDaughter1 + ldaughterRot; - histos.fill(HIST("h3K892InvMassRotation"), multiplicity, lresonanceRot.Pt(), lresonanceRot.M(), occupancyNo); + histos.fill(HIST("h3K892InvMassRotation"), multiplicity, lresonanceRot.Pt(), lresonanceRot.M()); } } if (studyAntiparticle) { if (trk1.sign() < 0) { if (invmass1D) histos.fill(HIST("k892invmassDS"), lResonance.M()); - histos.fill(HIST("h3k892invmassDS"), multiplicity, lResonance.Pt(), lResonance.M(), occupancyNo); + histos.fill(HIST("h3k892invmassDS"), multiplicity, lResonance.Pt(), lResonance.M()); } else if (trk1.sign() > 0) { if (invmass1D) histos.fill(HIST("k892invmassDSAnti"), lResonance.M()); - histos.fill(HIST("h3k892invmassDSAnti"), multiplicity, lResonance.Pt(), lResonance.M(), occupancyNo); + histos.fill(HIST("h3k892invmassDSAnti"), multiplicity, lResonance.Pt(), lResonance.M()); } } else { if (invmass1D) histos.fill(HIST("k892invmassDS"), lResonance.M()); - histos.fill(HIST("h3k892invmassDS"), multiplicity, lResonance.Pt(), lResonance.M(), occupancyNo); + histos.fill(HIST("h3k892invmassDS"), multiplicity, lResonance.Pt(), lResonance.M()); } } else { if (invmass1D) histos.fill(HIST("k892invmassME"), lResonance.M()); - histos.fill(HIST("h3k892invmassME"), multiplicity, lResonance.Pt(), lResonance.M(), occupancyNo); + histos.fill(HIST("h3k892invmassME"), multiplicity, lResonance.Pt(), lResonance.M()); if (additionalMEPlots) { if (trk1.sign() < 0) { if (invmass1D) @@ -692,11 +692,11 @@ struct K892analysis { if (trk1.sign() < 0) { if (invmass1D) histos.fill(HIST("k892invmassLS"), lResonance.M()); - histos.fill(HIST("h3k892invmassLS"), multiplicity, lResonance.Pt(), lResonance.M(), occupancyNo); + histos.fill(HIST("h3k892invmassLS"), multiplicity, lResonance.Pt(), lResonance.M()); } else if (trk1.sign() > 0) { if (invmass1D) histos.fill(HIST("k892invmassLSAnti"), lResonance.M()); - histos.fill(HIST("h3k892invmassLSAnti"), multiplicity, lResonance.Pt(), lResonance.M(), occupancyNo); + histos.fill(HIST("h3k892invmassLSAnti"), multiplicity, lResonance.Pt(), lResonance.M()); } } } diff --git a/PWGLF/Tasks/Resonances/kstar892analysis.cxx b/PWGLF/Tasks/Resonances/kstar892analysis.cxx index 1fa20f8cfa4..0a43e73bb5b 100644 --- a/PWGLF/Tasks/Resonances/kstar892analysis.cxx +++ b/PWGLF/Tasks/Resonances/kstar892analysis.cxx @@ -36,6 +36,7 @@ using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::soa; using namespace o2::constants::physics; +using namespace o2::aod::resodaughter; struct kstar892analysis { HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -245,16 +246,16 @@ struct kstar892analysis { Filter acceptanceFilter = nabs(aod::resodaughter::pt) >= cMinPtcut; Filter DCAcutFilter = (nabs(aod::track::dcaXY) <= cMaxDCArToPVcut) && (nabs(aod::track::dcaZ) <= cMaxDCAzToPVcut); // Filter primarytrackFilter = aod::resodaughter::isPVContributor && aod::resodaughter::isPrimaryTrack && aod::resodaughter::isGlobalTrackWoDCA; - Filter primarytrackFilter = ((aod::resodaughter::trackFlags & ((1 << 5) | (1 << 4) | (1 << 2))) == ((1 << 5) | (1 << 4) | (1 << 2))); + Filter primarytrackFilter = requirePVContributor() && requirePrimaryTrack() && requireGlobalTrackWoDCA(); // partitions for data Partition resoKaWithTof = (nabs(aod::resodaughter::tofNSigmaKa10) <= 10 * cMaxTOFnSigmaKaon) && - ((aod::resodaughter::trackFlags & (1 << 6)) != 0); + requireHasTOF(); Partition resoPiWithTof = (nabs(aod::resodaughter::tofNSigmaPi10) <= 10 * cMaxTOFnSigmaPion) && - ((aod::resodaughter::trackFlags & (1 << 6)) != 0); + requireHasTOF(); Partition resoKa = (nabs(aod::resodaughter::tpcNSigmaKa10) <= 10 * cMaxTPCnSigmaKaon); @@ -272,22 +273,20 @@ struct kstar892analysis { Partition resoKaTOFhighPt = (nabs(aod::resodaughter::tofNSigmaKa10) <= 10 * cMaxTOFnSigmaKaon) && - ((aod::resodaughter::trackFlags & (1 << 6)) != 0) && - (nabs(aod::resodaughter::pt) >= cMinPtTOF); + requireHasTOF() && (nabs(aod::resodaughter::pt) >= cMinPtTOF); Partition resoPiTOFhighPt = (nabs(aod::resodaughter::tofNSigmaPi10) <= 10 * cMaxTOFnSigmaPion) && - ((aod::resodaughter::trackFlags & (1 << 6)) != 0) && - (nabs(aod::resodaughter::pt) >= cMinPtTOF); + requireHasTOF() && (nabs(aod::resodaughter::pt) >= cMinPtTOF); // Partitions for mc Partition> resoMCrecKaWithTof = (nabs(aod::resodaughter::tofNSigmaKa10) <= 10 * cMaxTOFnSigmaKaon) && - ((aod::resodaughter::trackFlags & (1 << 6)) != 0); + requireHasTOF(); Partition> resoMCrecPiWithTof = (nabs(aod::resodaughter::tofNSigmaPi10) <= 10 * cMaxTOFnSigmaPion) && - ((aod::resodaughter::trackFlags & (1 << 6)) != 0); + requireHasTOF(); Partition> resoMCrecKa = (nabs(aod::resodaughter::tpcNSigmaKa10) <= 10 * cMaxTPCnSigmaKaon); @@ -305,13 +304,11 @@ struct kstar892analysis { Partition> resoMCrecKaTOFhighPt = (nabs(aod::resodaughter::tofNSigmaKa10) <= 10 * cMaxTOFnSigmaKaon) && - ((aod::resodaughter::trackFlags & (1 << 6)) != 0) && - (nabs(aod::resodaughter::pt) >= cMinPtTOF); + requireHasTOF() && (nabs(aod::resodaughter::pt) >= cMinPtTOF); Partition> resoMCrecPiTOFhighPt = (nabs(aod::resodaughter::tofNSigmaPi10) <= 10 * cMaxTOFnSigmaPion) && - ((aod::resodaughter::trackFlags & (1 << 6)) != 0) && - (nabs(aod::resodaughter::pt) >= cMinPtTOF); + requireHasTOF() && (nabs(aod::resodaughter::pt) >= cMinPtTOF); using ResoMCCols = soa::Join; @@ -323,27 +320,10 @@ struct kstar892analysis { template bool trackCut(const TrackType track) { - // pT - if (track.pt() < cMinPtcut) - return false; - // DCA - if (track.dcaXY() > cMaxDCArToPVcut) - return false; - if (track.dcaZ() > cMaxDCAzToPVcut) - return false; - // Primary filters - if (!track.isPrimaryTrack()) - return false; - if (!track.isGlobalTrackWoDCA()) - return false; - // PV contributor - if (!track.isPVContributor()) - return false; // TPC if (track.tpcNClsFound() < cfgTPCcluster) return false; // ITS - if (cfgUseITSRefit && !track.passedITSRefit()) return false; if (cfgUseTPCRefit && !track.passedTPCRefit()) diff --git a/PWGLF/Tasks/Resonances/lambda1520SpherocityAnalysis.cxx b/PWGLF/Tasks/Resonances/lambda1520SpherocityAnalysis.cxx index d7303f3e5fd..b8d6cfeae29 100644 --- a/PWGLF/Tasks/Resonances/lambda1520SpherocityAnalysis.cxx +++ b/PWGLF/Tasks/Resonances/lambda1520SpherocityAnalysis.cxx @@ -15,6 +15,7 @@ #include #include +#include #include "Common/DataModel/PIDResponse.h" #include "Common/DataModel/Centrality.h" @@ -515,7 +516,7 @@ struct lambdaAnalysis { } } - using resoCols = aod::ResoCollisions; + using resoCols = soa::Join; using resoTracks = aod::ResoTracks; void processData(resoCols::iterator const& collision, resoTracks const& tracks) diff --git a/PWGLF/Tasks/Resonances/lambda1520_PbPb.cxx b/PWGLF/Tasks/Resonances/lambda1520_PbPb.cxx index 64084d6f4e2..d032d0c90aa 100644 --- a/PWGLF/Tasks/Resonances/lambda1520_PbPb.cxx +++ b/PWGLF/Tasks/Resonances/lambda1520_PbPb.cxx @@ -537,7 +537,7 @@ struct lambdaAnalysis_pb { } } - using resoCols = aod::ResoCollisions; + using resoCols = soa::Join; using resoTracks = aod::ResoTracks; void processData(resoCols::iterator const& collision, resoTracks const& tracks) diff --git a/PWGLF/Tasks/Resonances/lambda1520analysis.cxx b/PWGLF/Tasks/Resonances/lambda1520analysis.cxx index 22645dcf998..3e6749d451d 100644 --- a/PWGLF/Tasks/Resonances/lambda1520analysis.cxx +++ b/PWGLF/Tasks/Resonances/lambda1520analysis.cxx @@ -162,7 +162,7 @@ struct Lambda1520analysis { AxisSpec pidQAAxis = {binsnSigma, "#sigma"}; AxisSpec axisTPCSignal = {binsnTPCSignal, ""}; AxisSpec mcLabelAxis = {5, -0.5, 4.5, "MC Label"}; - AxisSpec occupancyaxis = {occupancybins, "Occupancy [-40,100]"}; + // AxisSpec occupancyaxis = {occupancybins, "Occupancy [-40,100]"}; if (additionalQAeventPlots) { // Test on Mixed event @@ -263,7 +263,7 @@ struct Lambda1520analysis { } if (isCalcRotBkg) { - histos.add("Result/Data/h3lambda1520InvMassRotation", "Invariant mass of #Lambda(1520) rotation", kTHnSparseF, {axisMult, axisPt, axisMassLambda1520, occupancyaxis}); + histos.add("Result/Data/h3lambda1520InvMassRotation", "Invariant mass of #Lambda(1520) rotation", kTHnSparseF, {axisMult, axisPt, axisMassLambda1520}); } // 3d histogram @@ -702,10 +702,10 @@ struct Lambda1520analysis { // LOG(info) << "Before pass, Collision index:" << collision.index() << "multiplicity: " << collision.cent() << std::endl; - auto occupancyNo = collision.trackOccupancyInTimeRange(); - if (applyOccupancyCut && occupancyNo < occupancyCut) { - return; - } + // auto occupancyNo = collision.trackOccupancyInTimeRange(); + // if (applyOccupancyCut && occupancyNo < occupancyCut) { + // return; + // } // Multiplicity correlation calibration plots if (isFilladditionalQA) { @@ -908,7 +908,7 @@ struct Lambda1520analysis { float theta2 = rn->Uniform(o2::constants::math::PI - o2::constants::math::PI / rotationalcut, o2::constants::math::PI + o2::constants::math::PI / rotationalcut); ldaughterRot.SetPtEtaPhiM(trk2.pt(), trk2.eta(), trk2.phi() + theta2, massKa); // for rotated background lresonanceRot = lDecayDaughter1 + ldaughterRot; - histos.fill(HIST("Result/Data/h3lambda1520InvMassRotation"), multiplicity, lresonanceRot.Pt(), lresonanceRot.M(), occupancyNo); + histos.fill(HIST("Result/Data/h3lambda1520InvMassRotation"), multiplicity, lresonanceRot.Pt(), lresonanceRot.M()); } } From f73c800322e376024536742b8ea353782011ad12 Mon Sep 17 00:00:00 2001 From: sarjeetagami <162087855+sarjeetagami@users.noreply.github.com> Date: Fri, 7 Mar 2025 02:43:22 +0530 Subject: [PATCH 0581/1650] [PWGLF] : added daughter weights for kstar flow (#10366) Co-authored-by: sarjeeta gami --- PWGLF/Tasks/Resonances/kstarpbpb.cxx | 287 +++++++++++++++++++++++---- 1 file changed, 245 insertions(+), 42 deletions(-) diff --git a/PWGLF/Tasks/Resonances/kstarpbpb.cxx b/PWGLF/Tasks/Resonances/kstarpbpb.cxx index 03f5819c6f9..b7295c2e459 100644 --- a/PWGLF/Tasks/Resonances/kstarpbpb.cxx +++ b/PWGLF/Tasks/Resonances/kstarpbpb.cxx @@ -98,6 +98,7 @@ struct kstarpbpb { Configurable useGlobalTrack{"useGlobalTrack", true, "use Global track"}; Configurable nsigmaCutTOF{"nsigmacutTOF", 3.0, "Value of the TOF Nsigma cut"}; Configurable nsigmaCutTPC{"nsigmacutTPC", 3.0, "Value of the TPC Nsigma cut"}; + Configurable isTOFOnly{"isTOFOnly", false, "use TOF only PID"}; Configurable nsigmaCutCombined{"nsigmaCutCombined", 3.0, "Value of the TOF Nsigma cut"}; Configurable cfgNoMixedEvents{"cfgNoMixedEvents", 1, "Number of mixed events per event"}; Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; @@ -114,7 +115,7 @@ struct kstarpbpb { Configurable timFrameEvsel{"timFrameEvsel", false, "TPC Time frame boundary cut"}; Configurable additionalEvselITS{"additionalEvselITS", true, "Additional event selcection for ITS"}; Configurable ispTdepPID{"ispTdepPID", true, "pT dependent PID"}; - Configurable isTOFOnly{"isTOFOnly", false, "use TOF only PID"}; + Configurable isNoTOF{"isNoTOF", true, "isNoTOF"}; Configurable PDGcheck{"PDGcheck", true, "PDGcheck"}; Configurable strategyPID{"strategyPID", 2, "PID strategy"}; Configurable cfgCutTOFBeta{"cfgCutTOFBeta", 0.0, "cut TOF beta"}; @@ -125,7 +126,6 @@ struct kstarpbpb { Configurable nBkgRotations{"nBkgRotations", 9, "Number of rotated copies (background) per each original candidate"}; Configurable fillRotation{"fillRotation", true, "fill rotation"}; Configurable same{"same", true, "same event"}; - Configurable isNoTOF{"isNoTOF", true, "isNoTOF"}; Configurable like{"like", false, "like-sign"}; Configurable fillOccupancy{"fillOccupancy", false, "fill Occupancy"}; Configurable cfgOccupancyCut{"cfgOccupancyCut", 500, "Occupancy cut"}; @@ -133,7 +133,8 @@ struct kstarpbpb { Configurable useSP{"useSP", false, "use SP"}; Configurable genacceptancecut{"genacceptancecut", true, "use acceptance cut for generated"}; Configurable avoidsplitrackMC{"avoidsplitrackMC", false, "avoid split track in MC"}; - Configurable ConfWeightPath{"ConfWeightPath", "Users/s/skundu/My/Object/PbPb2024/MCWeight2", "Path to gain calibration"}; + Configurable ConfWeightPath{"ConfWeightPath", "Users/s/skundu/My/Object/fitweight", "Path to gain calibration"}; + ConfigurableAxis axisPtKaonWeight{"axisPtKaonWeight", {VARIABLE_WIDTH, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.2f, 2.4f, 2.6f, 2.8f, 3.0f, 3.2f, 3.4f, 3.6f, 3.8f, 4.0f, 4.4f, 4.8f, 5.2f, 5.6f, 6.0f, 6.5f, 7.0f, 7.5f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f}, "pt axis"}; Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; Filter centralityFilter = nabs(aod::cent::centFT0C) < cfgCutCentrality; @@ -191,10 +192,21 @@ struct kstarpbpb { histos.add("hSparseV2SARec_V2", "hSparseV2SARec_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); histos.add("hpt", "hpt", kTH1F, {thnAxisPt}); histos.add("hMC", "MC Event statistics", kTH1F, {{10, 0.0f, 10.0f}}); + histos.add("h1PhiRecsplit", "Phi meson Rec split", kTH1F, {{100, 0.0f, 10.0f}}); histos.add("CentPercentileMCRecHist", "MC Centrality", kTH1F, {{100, 0.0f, 100.0f}}); histos.add("hSparseV2SAMixedEvent_V2", "hSparseV2SAMixedEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); histos.add("h2PhiGen2", "Phi meson gen", kTH2F, {thnAxisPt, thnAxisCentrality}); histos.add("h2PhiRec2", "Phi meson Rec", kTH2F, {thnAxisPt, thnAxisCentrality}); + histos.add("hImpactParameter", "Impact parameter", kTH1F, {{200, 0.0f, 20.0f}}); + histos.add("hEventPlaneAngle", "hEventPlaneAngle", kTH1F, {{200, -2.0f * TMath::Pi(), 2.0f * TMath::Pi()}}); + histos.add("hSparseKstarMCGenWeight", "hSparseKstarMCGenWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, thnAxisPt, {8, -0.8, 0.8}}); + histos.add("hSparseKstarMCRecWeight", "hSparseKstarMCRecWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, thnAxisPt, {8, -0.8, 0.8}}); + histos.add("hSparseKstarMCGenKaonWeight", "hSparseKstarMCGenKaonWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); + histos.add("hSparseKstarMCRecKaonWeight", "hSparseKstarMCRecKaonWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); + histos.add("hSparseKstarMCRecKaonMissMatchWeight", "hSparseKstarMCRecKaonMissMatchWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); + histos.add("hSparseKstarMCGenPionWeight", "hSparseKstarMCGenPionWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); + histos.add("hSparseKstarMCRecPionWeight", "hSparseKstarMCRecPionWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); + histos.add("hSparseKstarMCRecPionMissMatchWeight", "hSparseKstarMCRecPionMissMatchWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); if (additionalQAplots1) { histos.add("hFTOCvsTPCSelected", "Mult correlation FT0C vs. TPC after selection", kTH2F, {{80, 0.0f, 80.0f}, {100, -0.5f, 5999.5f}}); @@ -210,6 +222,9 @@ struct kstarpbpb { histos.add("ResFT0CTPCSP", "ResFT0CTPCSP", kTH2F, {centAxis, resAxis}); histos.add("ResFT0CFT0ASP", "ResFT0CFT0ASP", kTH2F, {centAxis, resAxis}); histos.add("ResFT0ATPCSP", "ResFT0ATPCSP", kTH2F, {centAxis, resAxis}); + histos.add("ResTrackSPFT0CTPC", "ResTrackSPFT0CTPC", kTH3F, {centAxis, occupancyAxis, resAxis}); + histos.add("ResTrackSPFT0CFT0A", "ResTrackSPFT0CFT0A", kTH3F, {centAxis, occupancyAxis, resAxis}); + histos.add("ResTrackSPFT0ATPC", "ResTrackSPFT0ATPC", kTH3F, {centAxis, occupancyAxis, resAxis}); } if (additionalQAplots) { // DCA QA @@ -323,7 +338,21 @@ struct kstarpbpb { } return false; } - + template + bool selectionPID2(const T& candidate, int PID) + { + if (PID == 0) { + if (candidate.hasTOF() && candidate.beta() > cfgCutTOFBeta && TMath::Abs(candidate.tofNSigmaKa()) < nsigmaCutTOF) { + return true; + } + } + if (PID == 1) { + if (candidate.hasTOF() && candidate.beta() > cfgCutTOFBeta && TMath::Abs(candidate.tofNSigmaPi()) < nsigmaCutTOF) { + return true; + } + } + return false; + } template bool selectionPID(const T& candidate, int PID) { @@ -422,21 +451,7 @@ struct kstarpbpb { } return false; } - template - bool selectionPID2(const T& candidate, int PID) - { - if (PID == 0) { - if (candidate.hasTOF() && candidate.beta() > cfgCutTOFBeta && TMath::Abs(candidate.tofNSigmaKa()) < nsigmaCutTOF) { - return true; - } - } - if (PID == 1) { - if (candidate.hasTOF() && candidate.beta() > cfgCutTOFBeta && TMath::Abs(candidate.tofNSigmaPi()) < nsigmaCutTOF) { - return true; - } - } - return false; - } + double GetPhiInRange(double phi) { double result = phi; @@ -461,14 +476,15 @@ struct kstarpbpb { ConfigurableAxis axisVertex{"axisVertex", {20, -10, 10}, "vertex axis for bin"}; ConfigurableAxis axisMultiplicityClass{"axisMultiplicityClass", {20, 0, 100}, "multiplicity percentile for bin"}; ConfigurableAxis axisEPAngle{"axisEPAngle", {6, -TMath::Pi() / 2, TMath::Pi() / 2}, "event plane angle"}; + ConfigurableAxis axisOccup{"axisOccup", {20, -0.5, 40000.0}, "occupancy axis"}; double v2, v2Rot; using BinningTypeVertexContributor = ColumnBinningPolicy; - ROOT::Math::PxPyPzMVector KstarMother, daughter1, daughter2, kaonrot, kstarrot, KaonPlus, KaonMinus; + ROOT::Math::PxPyPzMVector KstarMother, daughter1, daughter2, kaonrot, kstarrot, KaonPlus, PionMinus; int currentRunNumber = -999; int lastRunNumber = -999; - TH3D* hweight; + TH2D* hweight; void processSE(EventCandidates::iterator const& collision, TrackCandidates const& tracks, aod::BCsWithTimestamps const&) { if (!collision.sel8() || !collision.triggereventep() || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(aod::evsel::kNoITSROFrameBorder) || !collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV) || !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { @@ -510,7 +526,7 @@ struct kstarpbpb { auto bc = collision.bc_as(); currentRunNumber = collision.bc_as().runNumber(); if (useWeight && (currentRunNumber != lastRunNumber)) { - hweight = ccdb->getForTimeStamp(ConfWeightPath.value, bc.timestamp()); + hweight = ccdb->getForTimeStamp(ConfWeightPath.value, bc.timestamp()); } lastRunNumber = currentRunNumber; float weight1 = 1.0; @@ -528,9 +544,10 @@ struct kstarpbpb { continue; } track1kaon = true; + if (useWeight) { if (track1.pt() < 10.0 && track1.pt() > 0.15) { - weight1 = hweight->GetBinContent(hweight->FindBin(centrality, GetPhiInRange(track1.phi() - psiFT0C), track1.pt() + 0.000005)); + weight1 = 1 + hweight->GetBinContent(hweight->FindBin(centrality, track1.pt() + 0.000005)) * TMath::Cos(2.0 * GetPhiInRange(track1.phi() - psiFT0C)); } else { weight1 = 1; } @@ -568,7 +585,7 @@ struct kstarpbpb { } if (useWeight) { if (track2.pt() < 10.0 && track2.pt() > 0.15) { - weight2 = hweight->GetBinContent(hweight->FindBin(centrality, GetPhiInRange(track2.phi() - psiFT0C), track2.pt() + 0.000005)); + weight2 = 1 + hweight->GetBinContent(hweight->FindBin(centrality, track2.pt() + 0.000005)) * TMath::Cos(2.0 * GetPhiInRange(track2.phi() - psiFT0C)); } else { weight2 = 1; } @@ -579,7 +596,6 @@ struct kstarpbpb { if (TMath::Abs(KstarMother.Rapidity()) > confRapidity) { continue; } - auto phiminuspsi = GetPhiInRange(KstarMother.Phi() - psiFT0C); if (useSP) { @@ -589,9 +605,14 @@ struct kstarpbpb { v2 = TMath::Cos(2.0 * phiminuspsi); } auto totalweight = weight1 * weight2; - if (totalweight <= 0.0005) { + if (totalweight <= 0.0000005) { totalweight = 1.0; } + if (additionalQAplots1) { + histos.fill(HIST("ResTrackSPFT0CTPC"), centrality, occupancy, QFT0C * QTPC * TMath::Cos(2.0 * (psiFT0C - psiTPC))); + histos.fill(HIST("ResTrackSPFT0CFT0A"), centrality, occupancy, QFT0C * QFT0A * TMath::Cos(2.0 * (psiFT0C - psiFT0A))); + histos.fill(HIST("ResTrackSPFT0ATPC"), centrality, occupancy, QTPC * QFT0A * TMath::Cos(2.0 * (psiTPC - psiFT0A))); + } if (same) { if (useWeight) { histos.fill(HIST("hSparseV2SASameEvent_V2"), KstarMother.M(), KstarMother.Pt(), v2, centrality, 1 / totalweight); @@ -1020,7 +1041,7 @@ struct kstarpbpb { { auto tracksTuple = std::make_tuple(tracks); - BinningTypeVertexContributor binningOnPositions{{axisVertex, axisMultiplicityClass, axisEPAngle}, true}; + BinningTypeVertexContributor binningOnPositions{{axisVertex, axisMultiplicityClass, axisOccup}, true}; SameKindPair pair{binningOnPositions, cfgNoMixedEvents, -1, collisions, tracksTuple, &cache}; for (auto& [collision1, tracks1, collision2, tracks2] : pair) { if (!collision1.sel8() || !collision1.triggereventep() || !collision1.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision1.selection_bit(aod::evsel::kNoITSROFrameBorder) || !collision1.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision1.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV) || !collision1.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { @@ -1056,14 +1077,11 @@ struct kstarpbpb { } for (auto& [track1, track2] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { - // track selection - if (!selectionTrack(track1) || !selectionTrack(track2)) { - // printf("Mix = %d\n", 6); + if (track1.sign() * track2.sign() > 0) { continue; } - auto track1ID = track1.globalIndex(); - auto track2ID = track2.globalIndex(); - if (track2ID == track1ID) { + if (!selectionTrack(track1) || !selectionTrack(track2)) { + continue; } if (ispTdepPID && !isTOFOnly && !(selectionPIDNew(track1, 0))) { @@ -1084,9 +1102,13 @@ struct kstarpbpb { if (isTOFOnly && !selectionPID2(track2, 1)) { continue; } - - daughter1 = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); - daughter2 = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massPi); + if (track1.sign() > 0 && track2.sign() < 0) { + daughter1 = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); + daughter2 = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massPi); + } else if (track1.sign() < 0 && track2.sign() > 0) { + daughter2 = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); + daughter1 = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massPi); + } KstarMother = daughter1 + daughter2; if (TMath::Abs(KstarMother.Rapidity()) > confRapidity) { continue; @@ -1149,7 +1171,7 @@ struct kstarpbpb { auto track1ID = track1.index(); for (auto track2 : Rectrackspart) { auto track2ID = track2.index(); - if (track2ID == track1ID) { + if (track2ID <= track1ID) { continue; } if (!selectionTrack(track2)) { @@ -1206,13 +1228,13 @@ struct kstarpbpb { oldindex = mothertrack1.globalIndex(); if (track1.sign() > 0 && track2.sign() < 0) { KaonPlus = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); - KaonMinus = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massPi); + PionMinus = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massPi); } if (track1.sign() < 0 && track2.sign() > 0) { - KaonMinus = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); + PionMinus = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); KaonPlus = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massPi); } - KstarMother = KaonPlus + KaonMinus; + KstarMother = KaonPlus + PionMinus; if (TMath::Abs(KstarMother.Rapidity()) > confRapidity) { continue; } @@ -1260,11 +1282,11 @@ struct kstarpbpb { if (!genacceptancecut) { daughtm = true; } - KaonMinus = ROOT::Math::PxPyPzMVector(kCurrentDaughter.px(), kCurrentDaughter.py(), kCurrentDaughter.pz(), massPi); + PionMinus = ROOT::Math::PxPyPzMVector(kCurrentDaughter.px(), kCurrentDaughter.py(), kCurrentDaughter.pz(), massPi); } } if (daughtp && daughtm) { - KstarMother = KaonPlus + KaonMinus; + KstarMother = KaonPlus + PionMinus; if (TMath::Abs(KstarMother.Rapidity()) > confRapidity) { continue; } @@ -1280,6 +1302,187 @@ struct kstarpbpb { } // process MC PROCESS_SWITCH(kstarpbpb, processMC, "Process MC", false); + + void processMCkstarWeight(CollisionMCTrueTable::iterator const& TrueCollision, CollisionMCRecTableCentFT0C const& RecCollisions, TrackMCTrueTable const& GenParticles, FilTrackMCRecTable const& RecTracks) + { + float imp = TrueCollision.impactParameter(); + float evPhi = TrueCollision.eventPlaneAngle() / 2.0; + float centclass = -999; + if (imp >= 0 && imp < 3.49) { + centclass = 2.5; + } + if (imp >= 3.49 && imp < 4.93) { + centclass = 7.5; + } + if (imp >= 4.93 && imp < 6.98) { + centclass = 15.0; + } + if (imp >= 6.98 && imp < 8.55) { + centclass = 25.0; + } + if (imp >= 8.55 && imp < 9.87) { + centclass = 35.0; + } + if (imp >= 9.87 && imp < 11) { + centclass = 45.0; + } + if (imp >= 11 && imp < 12.1) { + centclass = 55.0; + } + if (imp >= 12.1 && imp < 13.1) { + centclass = 65.0; + } + if (imp >= 13.1 && imp < 14) { + centclass = 75.0; + } + histos.fill(HIST("hImpactParameter"), imp); + histos.fill(HIST("hEventPlaneAngle"), evPhi); + if (centclass < 0.0 || centclass > 80.0) { + return; + } + for (auto& RecCollision : RecCollisions) { + auto psiFT0C = TrueCollision.eventPlaneAngle(); + /* + if (!RecCollision.sel8()) { + continue; + } + if (!RecCollision.selection_bit(aod::evsel::kNoITSROFrameBorder)) { + continue; + } + */ + if (TMath::Abs(RecCollision.posZ()) > cfgCutVertex) { + continue; + } + auto oldindex = -999; + auto Rectrackspart = RecTracks.sliceBy(perCollision, RecCollision.globalIndex()); + // loop over reconstructed particle + for (auto track1 : Rectrackspart) { + if (!track1.has_mcParticle()) { + continue; + } + + const auto mctrack1 = track1.mcParticle(); + + if (selectionTrack(track1) && strategySelectionPID(track1, 0, strategyPID) && TMath::Abs(mctrack1.pdgCode()) == 321 && mctrack1.isPhysicalPrimary()) { + histos.fill(HIST("hSparseKstarMCRecKaonWeight"), centclass, GetPhiInRange(mctrack1.phi() - psiFT0C), TMath::Power(TMath::Cos(2.0 * GetPhiInRange(mctrack1.phi() - psiFT0C)), 2.0), mctrack1.pt(), mctrack1.eta()); + } + if (selectionTrack(track1) && track1.pt() > 0.5 && track1.hasTOF() && TMath::Abs(track1.tofNSigmaKa()) > nsigmaCutTOF && TMath::Abs(track1.tpcNSigmaKa()) < nsigmaCutTPC && TMath::Abs(mctrack1.pdgCode()) == 321 && mctrack1.isPhysicalPrimary()) { + histos.fill(HIST("hSparseKstarMCRecKaonMissMatchWeight"), centclass, GetPhiInRange(mctrack1.phi() - psiFT0C), TMath::Power(TMath::Cos(2.0 * GetPhiInRange(mctrack1.phi() - psiFT0C)), 2.0), mctrack1.pt(), mctrack1.eta()); + } + if (selectionTrack(track1) && strategySelectionPID(track1, 1, strategyPID) && TMath::Abs(mctrack1.pdgCode()) == 211 && mctrack1.isPhysicalPrimary()) { + histos.fill(HIST("hSparseKstarMCRecPionWeight"), centclass, GetPhiInRange(mctrack1.phi() - psiFT0C), TMath::Power(TMath::Cos(2.0 * GetPhiInRange(mctrack1.phi() - psiFT0C)), 2.0), mctrack1.pt(), mctrack1.eta()); + } + if (selectionTrack(track1) && track1.pt() > 0.5 && track1.hasTOF() && TMath::Abs(track1.tofNSigmaPi()) > nsigmaCutTOF && TMath::Abs(track1.tpcNSigmaPi()) < nsigmaCutTPC && TMath::Abs(mctrack1.pdgCode()) == 211 && mctrack1.isPhysicalPrimary()) { + histos.fill(HIST("hSparseKstarMCRecPionMissMatchWeight"), centclass, GetPhiInRange(mctrack1.phi() - psiFT0C), TMath::Power(TMath::Cos(2.0 * GetPhiInRange(mctrack1.phi() - psiFT0C)), 2.0), mctrack1.pt(), mctrack1.eta()); + } + auto track1ID = track1.index(); + for (auto track2 : Rectrackspart) { + if (!track2.has_mcParticle()) { + continue; + } + auto track2ID = track2.index(); + if (track2ID <= track1ID) { + continue; + } + const auto mctrack2 = track2.mcParticle(); + int track1PDG = TMath::Abs(mctrack1.pdgCode()); + int track2PDG = TMath::Abs(mctrack2.pdgCode()); + if (!mctrack1.isPhysicalPrimary()) { + continue; + } + if (!mctrack2.isPhysicalPrimary()) { + continue; + } + if (!(track1PDG == 321 && track2PDG == 211)) { + continue; + } + if (!selectionTrack(track1) || !selectionTrack(track2) || track1.sign() * track2.sign() > 0) { + continue; + } + // PID check + if (ispTdepPID && !isTOFOnly && (!strategySelectionPID(track1, 0, strategyPID) || !strategySelectionPID(track2, 1, strategyPID))) { + continue; + } + if (!ispTdepPID && !isTOFOnly && (!selectionPID(track1, 0) || !selectionPID(track2, 1))) { + continue; + } + if (isTOFOnly && (!selectionPID2(track1, 0) || !selectionPID2(track2, 1))) { + continue; + } + for (auto& mothertrack1 : mctrack1.mothers_as()) { + for (auto& mothertrack2 : mctrack2.mothers_as()) { + if (mothertrack1.pdgCode() != mothertrack2.pdgCode()) { + continue; + } + if (mothertrack1 != mothertrack2) { + continue; + } + if (TMath::Abs(mothertrack1.y()) > confRapidity) { + continue; + } + if (TMath::Abs(mothertrack1.pdgCode()) != 313) { + continue; + } + // if (avoidsplitrackMC && oldindex == mothertrack1.globalIndex()) { + if (avoidsplitrackMC && oldindex == mothertrack1.index()) { + histos.fill(HIST("h1PhiRecsplit"), mothertrack1.pt()); + continue; + } + // oldindex = mothertrack1.globalIndex(); + oldindex = mothertrack1.index(); + auto PhiMinusPsi = GetPhiInRange(mothertrack1.phi() - psiFT0C); + histos.fill(HIST("hSparseKstarMCRecWeight"), centclass, PhiMinusPsi, TMath::Power(TMath::Cos(2.0 * PhiMinusPsi), 2.0), mothertrack1.pt(), mothertrack1.eta()); + } + } + } + } + // loop over generated particle + for (auto& mcParticle : GenParticles) { + if (TMath::Abs(mcParticle.eta()) > 0.8) // main acceptance + continue; + if (TMath::Abs(mcParticle.pdgCode()) == 321 && mcParticle.isPhysicalPrimary()) { + histos.fill(HIST("hSparseKstarMCGenKaonWeight"), centclass, GetPhiInRange(mcParticle.phi() - psiFT0C), TMath::Power(TMath::Cos(2.0 * GetPhiInRange(mcParticle.phi() - psiFT0C)), 2.0), mcParticle.pt(), mcParticle.eta()); + } + if (TMath::Abs(mcParticle.pdgCode()) == 211 && mcParticle.isPhysicalPrimary()) { + histos.fill(HIST("hSparseKstarMCGenPionWeight"), centclass, GetPhiInRange(mcParticle.phi() - psiFT0C), TMath::Power(TMath::Cos(2.0 * GetPhiInRange(mcParticle.phi() - psiFT0C)), 2.0), mcParticle.pt(), mcParticle.eta()); + } + if (TMath::Abs(mcParticle.y()) > confRapidity) { + continue; + } + if (mcParticle.pdgCode() != 313) { + continue; + } + auto kDaughters = mcParticle.daughters_as(); + if (kDaughters.size() != 2) { + continue; + } + auto daughtp = false; + auto daughtm = false; + for (auto kCurrentDaughter : kDaughters) { + if (!kCurrentDaughter.isPhysicalPrimary()) { + continue; + } + if (kCurrentDaughter.pdgCode() == +321) { + if (kCurrentDaughter.pt() > cfgCutPT && TMath::Abs(kCurrentDaughter.eta()) < cfgCutEta) { + daughtp = true; + } + KaonPlus = ROOT::Math::PxPyPzMVector(kCurrentDaughter.px(), kCurrentDaughter.py(), kCurrentDaughter.pz(), massKa); + } else if (kCurrentDaughter.pdgCode() == -211) { + if (kCurrentDaughter.pt() > cfgCutPT && TMath::Abs(kCurrentDaughter.eta()) < cfgCutEta) { + daughtm = true; + } + PionMinus = ROOT::Math::PxPyPzMVector(kCurrentDaughter.px(), kCurrentDaughter.py(), kCurrentDaughter.pz(), massPi); + } + } + if (daughtp && daughtm) { + auto PhiMinusPsiGen = GetPhiInRange(mcParticle.phi() - psiFT0C); + histos.fill(HIST("hSparseKstarMCGenWeight"), centclass, PhiMinusPsiGen, TMath::Power(TMath::Cos(2.0 * PhiMinusPsiGen), 2.0), mcParticle.pt(), mcParticle.eta()); + } + } + } // rec collision loop + + } // process MC + PROCESS_SWITCH(kstarpbpb, processMCkstarWeight, "Process MC kstar Weight", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { From 56bac3496dc540a8482c9bcfecbd9803070b3586 Mon Sep 17 00:00:00 2001 From: Tanu Gahlaut <154991749+TGahlaut1@users.noreply.github.com> Date: Fri, 7 Mar 2025 02:54:48 +0530 Subject: [PATCH 0582/1650] [PWGCF] update chnages for efficiency correction (#10362) --- PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx | 136 ++++++++++-------- 1 file changed, 76 insertions(+), 60 deletions(-) diff --git a/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx b/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx index 29f3280021a..869bec278cc 100644 --- a/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx @@ -70,8 +70,6 @@ struct MeanPtFlucId { Configurable cfgCutKaP3{"cfgCutKaP3", 1.2, "kaon p cut-3"}; Configurable cfgCutPrP1{"cfgCutPrP1", 0.9, "proton p cut-1"}; Configurable cfgCutPrP2{"cfgCutPrP2", 1.0, "proton p cut-2"}; - Configurable cfgRun3{"cfgRun3", true, ""}; - Configurable cfgRun2{"cfgRun2", false, ""}; Configurable cfgCorrection{"cfgCorrection", true, "Efficiency Correction"}; Configurable cfgCorrectionPID{"cfgCorrectionPID", true, "ID particles Efficiency Correction"}; Configurable cfgCorrectionPtRap{"cfgCorrectionPtRap", false, "Efficiency Correction for pT and eta"}; @@ -81,14 +79,9 @@ struct MeanPtFlucId { Configurable cfgMCReco{"cfgMCReco", false, ""}; Configurable cfgMCTruth{"cfgMCTruth", false, ""}; Configurable cfgPosZ{"cfgPosZ", true, "Position Z"}; - Configurable cfgSel7{"cfgSel7", true, "Run2 Sel7 trigger"}; - Configurable cfgkINT7{"cfgkINT7", true, "Run2 MB trigger"}; Configurable cfgSel8{"cfgSel8", true, "Sel8 trigger"}; Configurable cfgNoSameBunchPileup{"cfgNoSameBunchPileup", true, "kNoSameBunchPileup"}; Configurable cfgIsVertexITSTPC{"cfgIsVertexITSTPC", true, "kIsVertexITSTPC"}; - Configurable cfgIsGoodZvtxFT0vsPV{"cfgIsGoodZvtxFT0vsPV", true, "kIsGoodZvtxFT0vsPV"}; - Configurable cfgTVXinTRD{"cfgTVXinTRD", true, "cfgTVXinTRD"}; - Configurable cfgNoCollInTimeRangeStandard{"cfgNoCollInTimeRangeStandard", true, "cfgNoCollInTimeRangeStandard"}; Configurable cfgRejTrk{"cfgRejTrk", true, "Rejected Tracks"}; Configurable cfgInvMass{"cfgInvMass", true, "electron Inv Mass cut selection"}; Configurable cfgSelOR{"cfgSelOR", true, "Low OR High momentum "}; @@ -108,11 +101,11 @@ struct MeanPtFlucId { Configurable> rapBins{"rapBins", {-0.6, -0.55, -0.5, -0.45, -0.4, -0.35, -0.3, -0.25, -0.2, -0.15, -0.1, -0.05, 0.0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6}, "#rap bins"}; Configurable> effValuesCh{"effValuesCh", {0, 0.429014, 0.487349, 0.491862, 0.487173, 0.493464, 0.502531, 0.510066, 0.517214, 0.524902, 0.529725, 0.537065, 0.542265, 0.546103, 0.549713, 0.555139, 0.55158, 0.562156, 0.563038, 0.568055, 0.570847, 0.580461, 0.580406, 0.585776, 0.587068, 0.598144, 0.590378, 0.609363, 0.607307, 0.604931, 0.6011, 0.593467, 0.61525, 0.61393, 0.61495, 0.610359, 0.622616}, "effeciency values for Charged Particles"}; Configurable> effPtValuesPi{"effPtValuesPi", {0, 0.410663, 0.480289, 0.494895, 0.487076, 0.489786, 0.49886, 0.493927, 0.39043, 0.243861, 0.238888, 0.229684, 0.232042, 0.236374, 0.240662, 0.243322, 0.244936, 0.247454, 0.250458, 0.251617, 0.255598, 0.258227, 0.262528, 0.266772, 0.272183, 0.279049, 0.279705, 0.283223, 0.285635, 0.287154, 0.288375, 0.291491, 0.294697, 0.295954, 0.298417, 0.304913, 0.31268}, "effeciency values for Pions"}; - Configurable> effPtRapValuesPi{"effPtRapValuesPi", {0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5515, 0.5337, 0.5204, 0.5118, 0.5072, 0.5195, 0.4326, 0.2341, 0.2669, 0.2604, 0.2484, 0.2547, 0.2539, 0.2608, 0.2621, 0.2653, 0.2653, 0.2783, 0.2765, 0.2858, 0.2932, 0.2862, 0.3041, 0.3038, 0.3081, 0.3024, 0.3153, 0.2991, 0.3121, 0.3094, 0.3203, 0.3320, 0.3225, 0.3355, 0.3491, 0.3485, 0.0000, 0.5483, 0.5306, 0.5231, 0.5126, 0.5090, 0.5168, 0.5040, 0.2427, 0.2606, 0.2519, 0.2405, 0.2453, 0.2465, 0.2479, 0.2513, 0.2540, 0.2560, 0.2579, 0.2625, 0.2597, 0.2627, 0.2795, 0.2765, 0.2871, 0.2798, 0.2882, 0.2981, 0.2993, 0.2950, 0.2918, 0.2912, 0.3173, 0.3076, 0.3088, 0.3235, 0.3261, 0.0000, 0.5353, 0.5284, 0.5192, 0.5120, 0.5136, 0.5209, 0.5247, 0.2871, 0.2642, 0.2601, 0.2534, 0.2576, 0.2600, 0.2653, 0.2696, 0.2700, 0.2753, 0.2899, 0.2821, 0.2855, 0.2894, 0.2952, 0.3073, 0.3100, 0.3200, 0.3173, 0.3219, 0.3235, 0.3241, 0.3328, 0.3322, 0.3361, 0.3375, 0.3344, 0.3449, 0.3659, 0.0000, 0.4807, 0.5206, 0.5190, 0.5131, 0.5132, 0.5204, 0.5263, 0.3672, 0.2951, 0.2831, 0.2745, 0.2762, 0.2819, 0.2864, 0.2893, 0.2866, 0.2926, 0.2957, 0.2996, 0.3020, 0.3081, 0.3163, 0.3141, 0.3305, 0.3314, 0.3359, 0.3342, 0.3425, 0.3287, 0.3405, 0.3284, 0.3474, 0.3738, 0.3428, 0.3608, 0.3580, 0.0000, 0.4313, 0.5049, 0.5164, 0.5139, 0.5121, 0.5180, 0.5238, 0.4100, 0.2872, 0.2788, 0.2665, 0.2682, 0.2722, 0.2775, 0.2754, 0.2784, 0.2823, 0.2814, 0.2872, 0.2874, 0.2828, 0.2891, 0.2997, 0.2997, 0.3147, 0.3147, 0.3067, 0.3095, 0.3204, 0.3334, 0.3118, 0.3263, 0.3210, 0.3130, 0.3477, 0.3453, 0.0000, 0.4125, 0.4795, 0.5132, 0.5083, 0.5124, 0.5182, 0.5244, 0.4443, 0.2584, 0.2502, 0.2405, 0.2397, 0.2446, 0.2512, 0.2589, 0.2565, 0.2583, 0.2605, 0.2628, 0.2681, 0.2657, 0.2772, 0.2782, 0.2802, 0.2908, 0.2900, 0.2886, 0.2959, 0.3061, 0.2919, 0.3010, 0.3056, 0.3061, 0.3054, 0.2973, 0.3227, 0.0000, 0.4045, 0.4708, 0.5112, 0.5070, 0.5084, 0.5167, 0.5201, 0.4732, 0.2244, 0.2256, 0.2162, 0.2244, 0.2247, 0.2376, 0.2323, 0.2374, 0.2460, 0.2430, 0.2437, 0.2511, 0.2524, 0.2519, 0.2660, 0.2606, 0.2837, 0.2833, 0.2877, 0.2872, 0.2945, 0.2936, 0.3049, 0.3080, 0.2987, 0.3073, 0.3041, 0.3108, 0.0000, 0.4038, 0.4932, 0.5118, 0.4980, 0.4996, 0.5104, 0.5156, 0.4926, 0.2091, 0.2117, 0.1980, 0.2032, 0.2099, 0.2100, 0.2183, 0.2140, 0.2196, 0.2166, 0.2175, 0.2266, 0.2251, 0.2312, 0.2320, 0.2411, 0.2451, 0.2397, 0.2608, 0.2515, 0.2619, 0.2578, 0.2603, 0.2557, 0.2651, 0.2695, 0.2740, 0.2689, 0.0000, 0.3453, 0.4426, 0.4595, 0.4485, 0.4580, 0.4717, 0.4742, 0.4735, 0.1814, 0.1763, 0.1679, 0.1683, 0.1728, 0.1761, 0.1760, 0.1788, 0.1781, 0.1797, 0.1828, 0.1802, 0.1869, 0.1880, 0.1859, 0.1923, 0.1920, 0.1992, 0.2081, 0.2101, 0.2082, 0.2137, 0.2171, 0.2091, 0.2110, 0.2063, 0.2134, 0.2060, 0.0000, 0.2718, 0.3691, 0.4004, 0.3955, 0.4086, 0.4176, 0.4272, 0.4323, 0.1217, 0.1172, 0.1120, 0.1133, 0.1177, 0.1198, 0.1249, 0.1227, 0.1244, 0.1278, 0.1202, 0.1236, 0.1245, 0.1315, 0.1290, 0.1343, 0.1417, 0.1452, 0.1454, 0.1354, 0.1481, 0.1474, 0.1445, 0.1551, 0.1389, 0.1463, 0.1488, 0.1391, 0.0000, 0.2701, 0.3734, 0.4018, 0.4004, 0.4118, 0.4228, 0.4314, 0.4347, 0.1340, 0.1342, 0.1294, 0.1252, 0.1288, 0.1308, 0.1342, 0.1330, 0.1393, 0.1404, 0.1359, 0.1420, 0.1377, 0.1478, 0.1472, 0.1513, 0.1506, 0.1593, 0.1519, 0.1551, 0.1589, 0.1640, 0.1595, 0.1608, 0.1605, 0.1592, 0.1734, 0.1677, 0.0000, 0.3251, 0.4435, 0.4686, 0.4533, 0.4644, 0.4754, 0.4806, 0.4789, 0.1828, 0.1822, 0.1735, 0.1722, 0.1753, 0.1780, 0.1814, 0.1853, 0.1798, 0.1908, 0.1844, 0.1901, 0.1910, 0.1975, 0.1890, 0.2014, 0.2058, 0.2071, 0.1975, 0.2117, 0.2097, 0.2101, 0.2176, 0.2159, 0.2182, 0.2200, 0.2242, 0.2088, 0.0000, 0.3560, 0.4871, 0.5035, 0.4921, 0.4955, 0.5032, 0.5127, 0.4853, 0.1938, 0.1908, 0.1845, 0.1879, 0.1945, 0.1946, 0.1996, 0.2004, 0.2016, 0.2026, 0.2010, 0.2053, 0.2072, 0.2175, 0.2206, 0.2153, 0.2357, 0.2307, 0.2407, 0.2388, 0.2332, 0.2447, 0.2377, 0.2434, 0.2373, 0.2499, 0.2482, 0.2567, 0.0000, 0.3632, 0.4656, 0.5044, 0.4982, 0.5003, 0.5099, 0.5196, 0.4650, 0.2335, 0.2316, 0.2204, 0.2243, 0.2285, 0.2333, 0.2384, 0.2369, 0.2404, 0.2394, 0.2435, 0.2452, 0.2501, 0.2549, 0.2584, 0.2574, 0.2716, 0.2784, 0.2863, 0.2815, 0.2886, 0.2961, 0.2897, 0.2822, 0.2868, 0.3006, 0.2948, 0.3187, 0.0000, 0.3911, 0.4746, 0.5049, 0.4997, 0.5024, 0.5111, 0.5190, 0.4462, 0.2897, 0.2828, 0.2753, 0.2772, 0.2820, 0.2854, 0.2963, 0.2941, 0.2953, 0.2974, 0.2978, 0.3012, 0.3070, 0.3044, 0.3207, 0.3238, 0.3322, 0.3292, 0.3315, 0.3457, 0.3413, 0.3252, 0.3420, 0.3471, 0.3459, 0.3501, 0.3417, 0.3833, 0.0000, 0.4216, 0.4934, 0.5105, 0.5060, 0.5009, 0.5082, 0.5107, 0.4247, 0.3192, 0.3097, 0.2968, 0.3011, 0.3039, 0.3098, 0.3115, 0.3138, 0.3145, 0.3173, 0.3238, 0.3320, 0.3319, 0.3304, 0.3348, 0.3478, 0.3522, 0.3428, 0.3499, 0.3588, 0.3683, 0.3532, 0.3796, 0.3497, 0.3672, 0.3789, 0.3828, 0.3958, 0.0000, 0.4697, 0.5062, 0.5111, 0.5027, 0.5016, 0.5113, 0.5137, 0.3797, 0.3255, 0.3218, 0.3066, 0.3100, 0.3154, 0.3256, 0.3241, 0.3282, 0.3313, 0.3314, 0.3430, 0.3401, 0.3518, 0.3527, 0.3581, 0.3683, 0.3702, 0.3795, 0.3675, 0.3780, 0.3752, 0.3810, 0.3896, 0.3945, 0.4056, 0.3943, 0.4078, 0.4469, 0.0000, 0.5251, 0.5210, 0.5129, 0.5006, 0.5013, 0.5083, 0.5143, 0.3072, 0.2999, 0.2948, 0.2847, 0.2867, 0.2997, 0.2996, 0.3032, 0.3062, 0.3110, 0.3171, 0.3177, 0.3219, 0.3322, 0.3327, 0.3382, 0.3499, 0.3549, 0.3451, 0.3620, 0.3693, 0.3554, 0.3625, 0.3679, 0.3682, 0.3714, 0.4006, 0.3892, 0.4137, 0.0000, 0.5409, 0.5208, 0.5121, 0.5037, 0.4999, 0.5079, 0.4914, 0.2571, 0.2818, 0.2732, 0.2670, 0.2650, 0.2723, 0.2755, 0.2748, 0.2813, 0.2831, 0.2864, 0.2907, 0.2959, 0.2949, 0.2998, 0.3017, 0.3166, 0.3149, 0.3134, 0.3309, 0.3309, 0.3257, 0.3308, 0.3304, 0.3290, 0.3346, 0.3499, 0.3636, 0.3523, 0.0000, 0.5406, 0.5250, 0.5103, 0.5001, 0.4989, 0.5082, 0.4259, 0.2494, 0.2792, 0.2714, 0.2662, 0.2694, 0.2742, 0.2797, 0.2787, 0.2884, 0.2851, 0.2887, 0.2947, 0.3003, 0.3046, 0.3032, 0.3169, 0.3152, 0.3199, 0.3331, 0.3213, 0.3302, 0.3299, 0.3293, 0.3335, 0.3508, 0.3530, 0.3372, 0.3434, 0.3631, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000}, "pT rap effeciency values for Pions"}; + Configurable> effPtRapValuesPi{"effPtRapValuesPi", {0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5515, 0.5339, 0.5204, 0.5122, 0.5071, 0.5179, 0.4312, 0.2341, 0.2669, 0.2606, 0.2483, 0.2551, 0.2536, 0.2605, 0.2621, 0.2646, 0.2654, 0.2783, 0.2767, 0.2868, 0.2924, 0.2871, 0.3049, 0.3052, 0.3075, 0.3031, 0.3160, 0.2992, 0.3131, 0.3090, 0.3215, 0.3294, 0.3211, 0.3354, 0.3489, 0.3483, 0.0000, 0.5485, 0.5303, 0.5227, 0.5120, 0.5096, 0.5167, 0.5028, 0.2424, 0.2605, 0.2525, 0.2403, 0.2457, 0.2476, 0.2480, 0.2518, 0.2536, 0.2566, 0.2577, 0.2618, 0.2598, 0.2632, 0.2792, 0.2768, 0.2865, 0.2797, 0.2885, 0.2976, 0.3001, 0.2950, 0.2927, 0.2926, 0.3179, 0.3063, 0.3083, 0.3224, 0.3266, 0.0000, 0.5348, 0.5284, 0.5193, 0.5115, 0.5132, 0.5205, 0.5248, 0.2876, 0.2646, 0.2592, 0.2533, 0.2574, 0.2596, 0.2653, 0.2700, 0.2693, 0.2750, 0.2897, 0.2815, 0.2855, 0.2882, 0.2946, 0.3091, 0.3090, 0.3212, 0.3181, 0.3212, 0.3242, 0.3234, 0.3339, 0.3299, 0.3373, 0.3367, 0.3349, 0.3436, 0.3658, 0.0000, 0.4804, 0.5192, 0.5200, 0.5127, 0.5142, 0.5205, 0.5251, 0.3668, 0.2952, 0.2831, 0.2745, 0.2764, 0.2823, 0.2872, 0.2898, 0.2871, 0.2919, 0.2955, 0.2993, 0.3029, 0.3082, 0.3162, 0.3135, 0.3298, 0.3314, 0.3362, 0.3339, 0.3412, 0.3307, 0.3402, 0.3282, 0.3472, 0.3743, 0.3436, 0.3606, 0.3546, 0.0000, 0.4305, 0.5050, 0.5156, 0.5141, 0.5118, 0.5180, 0.5228, 0.4094, 0.2868, 0.2791, 0.2660, 0.2683, 0.2718, 0.2772, 0.2758, 0.2782, 0.2824, 0.2818, 0.2874, 0.2870, 0.2836, 0.2885, 0.3005, 0.3003, 0.3145, 0.3158, 0.3055, 0.3081, 0.3207, 0.3314, 0.3149, 0.3277, 0.3208, 0.3137, 0.3477, 0.3461, 0.0000, 0.4123, 0.4795, 0.5125, 0.5081, 0.5123, 0.5177, 0.5244, 0.4448, 0.2584, 0.2504, 0.2404, 0.2400, 0.2446, 0.2508, 0.2585, 0.2568, 0.2574, 0.2601, 0.2638, 0.2690, 0.2664, 0.2763, 0.2775, 0.2806, 0.2903, 0.2899, 0.2879, 0.2971, 0.3041, 0.2923, 0.3003, 0.3067, 0.3065, 0.3033, 0.2982, 0.3242, 0.0000, 0.4040, 0.4701, 0.5105, 0.5075, 0.5090, 0.5166, 0.5209, 0.4723, 0.2242, 0.2254, 0.2157, 0.2246, 0.2245, 0.2373, 0.2323, 0.2372, 0.2460, 0.2432, 0.2445, 0.2504, 0.2522, 0.2524, 0.2655, 0.2600, 0.2828, 0.2843, 0.2877, 0.2889, 0.2957, 0.2945, 0.3053, 0.3077, 0.2982, 0.3068, 0.3066, 0.3109, 0.0000, 0.4032, 0.4926, 0.5108, 0.4975, 0.4988, 0.5093, 0.5165, 0.4915, 0.2091, 0.2115, 0.1980, 0.2030, 0.2104, 0.2097, 0.2184, 0.2138, 0.2194, 0.2172, 0.2176, 0.2270, 0.2257, 0.2313, 0.2318, 0.2412, 0.2447, 0.2391, 0.2605, 0.2514, 0.2627, 0.2575, 0.2598, 0.2555, 0.2646, 0.2699, 0.2721, 0.2679, 0.0000, 0.3451, 0.4420, 0.4600, 0.4475, 0.4581, 0.4718, 0.4745, 0.4725, 0.1812, 0.1765, 0.1678, 0.1677, 0.1730, 0.1761, 0.1762, 0.1789, 0.1776, 0.1796, 0.1835, 0.1795, 0.1874, 0.1881, 0.1870, 0.1920, 0.1917, 0.1999, 0.2101, 0.2099, 0.2083, 0.2141, 0.2171, 0.2097, 0.2108, 0.2074, 0.2140, 0.2060, 0.0000, 0.2712, 0.3687, 0.4008, 0.3954, 0.4089, 0.4173, 0.4276, 0.4311, 0.1215, 0.1171, 0.1121, 0.1130, 0.1175, 0.1203, 0.1243, 0.1227, 0.1249, 0.1275, 0.1210, 0.1237, 0.1244, 0.1309, 0.1283, 0.1346, 0.1415, 0.1446, 0.1448, 0.1364, 0.1478, 0.1465, 0.1435, 0.1551, 0.1388, 0.1463, 0.1488, 0.1411, 0.0000, 0.2700, 0.3726, 0.4012, 0.3999, 0.4128, 0.4228, 0.4307, 0.4341, 0.1343, 0.1344, 0.1293, 0.1254, 0.1290, 0.1307, 0.1342, 0.1328, 0.1394, 0.1400, 0.1359, 0.1423, 0.1383, 0.1482, 0.1471, 0.1517, 0.1492, 0.1599, 0.1516, 0.1568, 0.1603, 0.1635, 0.1599, 0.1606, 0.1603, 0.1598, 0.1729, 0.1660, 0.0000, 0.3252, 0.4427, 0.4683, 0.4525, 0.4645, 0.4751, 0.4804, 0.4789, 0.1826, 0.1817, 0.1737, 0.1719, 0.1753, 0.1784, 0.1813, 0.1846, 0.1799, 0.1903, 0.1841, 0.1909, 0.1912, 0.1969, 0.1885, 0.2016, 0.2069, 0.2072, 0.1970, 0.2125, 0.2100, 0.2110, 0.2168, 0.2154, 0.2173, 0.2194, 0.2248, 0.2107, 0.0000, 0.3561, 0.4868, 0.5036, 0.4920, 0.4958, 0.5034, 0.5112, 0.4861, 0.1933, 0.1911, 0.1848, 0.1879, 0.1946, 0.1951, 0.1994, 0.2005, 0.2016, 0.2030, 0.2010, 0.2057, 0.2074, 0.2175, 0.2217, 0.2154, 0.2363, 0.2318, 0.2403, 0.2396, 0.2342, 0.2434, 0.2385, 0.2441, 0.2380, 0.2486, 0.2488, 0.2550, 0.0000, 0.3630, 0.4654, 0.5047, 0.4980, 0.5007, 0.5093, 0.5194, 0.4649, 0.2338, 0.2319, 0.2199, 0.2245, 0.2286, 0.2332, 0.2378, 0.2368, 0.2405, 0.2390, 0.2432, 0.2463, 0.2499, 0.2562, 0.2581, 0.2576, 0.2713, 0.2778, 0.2863, 0.2819, 0.2895, 0.2963, 0.2897, 0.2830, 0.2869, 0.3009, 0.2923, 0.3181, 0.0000, 0.3910, 0.4739, 0.5051, 0.5008, 0.5014, 0.5108, 0.5198, 0.4457, 0.2904, 0.2829, 0.2752, 0.2773, 0.2820, 0.2859, 0.2957, 0.2936, 0.2957, 0.2982, 0.2976, 0.3007, 0.3072, 0.3058, 0.3202, 0.3237, 0.3326, 0.3293, 0.3305, 0.3464, 0.3396, 0.3269, 0.3417, 0.3478, 0.3430, 0.3472, 0.3433, 0.3875, 0.0000, 0.4216, 0.4936, 0.5101, 0.5054, 0.5005, 0.5077, 0.5101, 0.4259, 0.3187, 0.3101, 0.2967, 0.3010, 0.3035, 0.3102, 0.3110, 0.3129, 0.3144, 0.3174, 0.3242, 0.3323, 0.3322, 0.3300, 0.3343, 0.3475, 0.3521, 0.3429, 0.3491, 0.3592, 0.3700, 0.3532, 0.3806, 0.3486, 0.3671, 0.3798, 0.3808, 0.3984, 0.0000, 0.4694, 0.5071, 0.5102, 0.5025, 0.5013, 0.5107, 0.5136, 0.3797, 0.3257, 0.3214, 0.3061, 0.3098, 0.3152, 0.3253, 0.3237, 0.3291, 0.3315, 0.3303, 0.3439, 0.3409, 0.3513, 0.3532, 0.3582, 0.3686, 0.3700, 0.3796, 0.3664, 0.3786, 0.3741, 0.3801, 0.3896, 0.3939, 0.4071, 0.3942, 0.4073, 0.4455, 0.0000, 0.5246, 0.5206, 0.5129, 0.5007, 0.5011, 0.5094, 0.5149, 0.3079, 0.2997, 0.2948, 0.2844, 0.2866, 0.2993, 0.3000, 0.3032, 0.3064, 0.3106, 0.3177, 0.3176, 0.3225, 0.3319, 0.3317, 0.3378, 0.3507, 0.3551, 0.3456, 0.3625, 0.3698, 0.3570, 0.3629, 0.3669, 0.3698, 0.3725, 0.3997, 0.3872, 0.4163, 0.0000, 0.5407, 0.5209, 0.5114, 0.5037, 0.4997, 0.5077, 0.4915, 0.2569, 0.2815, 0.2731, 0.2669, 0.2652, 0.2720, 0.2759, 0.2745, 0.2815, 0.2831, 0.2866, 0.2906, 0.2964, 0.2956, 0.3009, 0.3031, 0.3165, 0.3142, 0.3134, 0.3305, 0.3323, 0.3246, 0.3320, 0.3324, 0.3317, 0.3358, 0.3507, 0.3684, 0.3533, 0.0000, 0.5404, 0.5250, 0.5098, 0.4997, 0.4998, 0.5077, 0.4251, 0.2495, 0.2793, 0.2713, 0.2659, 0.2699, 0.2746, 0.2803, 0.2778, 0.2893, 0.2850, 0.2897, 0.2942, 0.3007, 0.3040, 0.3041, 0.3162, 0.3166, 0.3187, 0.3330, 0.3217, 0.3301, 0.3321, 0.3279, 0.3316, 0.3490, 0.3509, 0.3387, 0.3445, 0.3634, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000}, "pT rap effeciency values for Pions"}; Configurable> effPtValuesKa{"effPtValuesKa", {0, 0, 0, 0.328845, 0.379771, 0.390088, 0.403074, 0.35504, 0.256438, 0.131726, 0.13796, 0.140295, 0.147229, 0.156968, 0.162245, 0.171312, 0.175851, 0.185823, 0.188763, 0.193965, 0.192999, 0.191121, 0.195547, 0.210082, 0.217502, 0.232456, 0.245035, 0.254051, 0.268206, 0.274664, 0.290428, 0.294979, 0.304817, 0.324206, 0.342578, 0.36466, 0.394134}, "effeciency values for Kaons"}; - Configurable> effPtRapValuesKa{"effPtRapValuesKa", {0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1710, 0.4333, 0.4561, 0.4428, 0.1393, 0.1635, 0.1836, 0.1883, 0.1719, 0.1795, 0.1780, 0.1907, 0.2059, 0.2126, 0.2202, 0.2160, 0.2130, 0.2434, 0.2642, 0.2601, 0.2988, 0.2967, 0.3087, 0.3210, 0.3659, 0.3808, 0.3560, 0.4011, 0.4004, 0.4507, 0.5358, 0.5475, 0.4919, 0.5736, 0.0000, 0.0000, 0.0000, 0.4064, 0.4340, 0.4523, 0.4884, 0.2246, 0.1275, 0.1524, 0.1638, 0.1678, 0.1899, 0.2055, 0.2134, 0.2186, 0.2245, 0.2655, 0.2590, 0.2420, 0.2367, 0.2698, 0.2533, 0.2606, 0.2782, 0.3164, 0.3342, 0.3403, 0.3238, 0.3297, 0.3572, 0.4031, 0.3991, 0.4431, 0.4791, 0.5160, 0.5619, 0.0000, 0.0000, 0.0000, 0.4011, 0.4186, 0.4499, 0.4929, 0.3641, 0.1376, 0.1716, 0.1813, 0.1748, 0.1816, 0.1987, 0.2031, 0.2157, 0.2189, 0.2383, 0.2336, 0.2463, 0.2388, 0.2608, 0.2532, 0.2906, 0.2875, 0.2858, 0.3218, 0.3383, 0.3852, 0.4082, 0.4257, 0.3886, 0.4276, 0.4136, 0.5055, 0.5401, 0.5559, 0.0000, 0.0000, 0.0000, 0.4018, 0.4292, 0.4693, 0.4800, 0.4941, 0.1452, 0.1656, 0.1789, 0.1754, 0.1932, 0.1992, 0.2124, 0.2334, 0.2529, 0.2683, 0.2569, 0.2610, 0.2560, 0.2817, 0.2783, 0.2701, 0.2927, 0.3348, 0.3479, 0.3598, 0.3752, 0.4069, 0.3838, 0.4251, 0.4384, 0.4489, 0.4720, 0.5712, 0.5559, 0.0000, 0.0000, 0.0000, 0.4044, 0.4158, 0.4518, 0.4736, 0.5041, 0.2438, 0.1757, 0.1872, 0.1927, 0.2077, 0.2163, 0.2303, 0.2333, 0.2466, 0.2500, 0.2546, 0.2598, 0.2597, 0.2549, 0.2765, 0.2824, 0.2953, 0.3066, 0.3252, 0.3230, 0.3371, 0.3696, 0.3785, 0.4025, 0.3631, 0.3894, 0.4227, 0.4968, 0.5269, 0.0000, 0.0000, 0.0000, 0.3772, 0.4052, 0.4427, 0.4735, 0.4973, 0.3424, 0.1813, 0.1817, 0.1755, 0.1913, 0.1964, 0.1931, 0.2108, 0.2139, 0.2267, 0.2449, 0.2446, 0.2306, 0.2203, 0.2281, 0.2395, 0.2564, 0.2729, 0.2793, 0.2971, 0.3204, 0.3486, 0.3403, 0.3598, 0.3336, 0.4031, 0.3827, 0.4153, 0.4825, 0.0000, 0.0000, 0.0000, 0.3692, 0.4236, 0.4238, 0.4535, 0.4874, 0.4023, 0.1581, 0.1600, 0.1752, 0.1779, 0.1921, 0.2002, 0.2115, 0.1938, 0.2353, 0.2190, 0.2317, 0.2499, 0.2108, 0.2228, 0.2372, 0.2598, 0.2897, 0.2968, 0.3133, 0.3346, 0.3145, 0.3446, 0.3797, 0.3506, 0.3971, 0.3812, 0.4328, 0.4627, 0.0000, 0.0000, 0.0000, 0.3574, 0.4078, 0.4161, 0.4555, 0.4859, 0.4549, 0.1234, 0.1394, 0.1447, 0.1518, 0.1617, 0.1720, 0.1870, 0.1899, 0.1990, 0.2060, 0.2290, 0.2154, 0.1940, 0.2001, 0.2104, 0.2297, 0.2476, 0.2475, 0.3002, 0.2997, 0.2965, 0.3335, 0.2995, 0.3265, 0.3485, 0.3586, 0.3593, 0.3895, 0.0000, 0.0000, 0.0000, 0.3515, 0.3866, 0.3904, 0.4175, 0.4436, 0.4482, 0.1154, 0.1325, 0.1284, 0.1375, 0.1461, 0.1515, 0.1668, 0.1598, 0.1779, 0.1718, 0.1851, 0.1923, 0.1751, 0.1677, 0.1788, 0.1905, 0.2016, 0.2277, 0.2293, 0.2357, 0.2365, 0.2547, 0.2547, 0.2904, 0.3060, 0.2770, 0.3024, 0.3044, 0.0000, 0.0000, 0.0000, 0.2892, 0.3182, 0.3325, 0.3723, 0.3948, 0.4164, 0.0746, 0.0849, 0.0802, 0.0831, 0.0977, 0.0977, 0.1076, 0.1055, 0.1078, 0.1292, 0.1338, 0.1203, 0.1220, 0.1222, 0.1269, 0.1520, 0.1471, 0.1481, 0.1551, 0.1632, 0.1747, 0.1881, 0.1929, 0.1952, 0.1882, 0.2317, 0.2041, 0.2184, 0.0000, 0.0000, 0.0000, 0.1412, 0.1523, 0.1380, 0.1249, 0.1134, 0.1096, 0.0206, 0.0215, 0.0217, 0.0234, 0.0245, 0.0235, 0.0264, 0.0260, 0.0259, 0.0306, 0.0301, 0.0329, 0.0278, 0.0293, 0.0291, 0.0285, 0.0338, 0.0367, 0.0327, 0.0347, 0.0379, 0.0398, 0.0394, 0.0415, 0.0432, 0.0459, 0.0455, 0.0448, 0.0000, 0.0000, 0.0000, 0.3380, 0.3800, 0.3929, 0.4257, 0.4659, 0.4770, 0.1180, 0.1269, 0.1332, 0.1331, 0.1554, 0.1509, 0.1550, 0.1511, 0.1614, 0.1707, 0.1756, 0.1879, 0.1745, 0.1814, 0.1935, 0.2082, 0.2145, 0.2267, 0.2253, 0.2399, 0.2584, 0.2321, 0.2688, 0.2835, 0.2905, 0.2703, 0.2646, 0.3305, 0.0000, 0.0000, 0.0000, 0.3511, 0.3996, 0.4104, 0.4351, 0.4728, 0.4420, 0.1167, 0.1296, 0.1344, 0.1395, 0.1582, 0.1586, 0.1630, 0.1761, 0.1778, 0.1758, 0.2058, 0.2141, 0.1884, 0.1912, 0.2007, 0.1999, 0.2372, 0.2419, 0.2498, 0.2777, 0.2696, 0.2919, 0.2636, 0.2878, 0.2997, 0.3078, 0.3120, 0.3634, 0.0000, 0.0000, 0.0000, 0.3515, 0.4008, 0.4128, 0.4487, 0.4714, 0.3919, 0.1661, 0.1741, 0.1862, 0.1905, 0.2126, 0.2116, 0.2105, 0.2297, 0.2320, 0.2338, 0.2458, 0.2438, 0.2333, 0.2475, 0.2702, 0.2490, 0.2799, 0.3052, 0.3312, 0.3008, 0.3384, 0.3727, 0.3729, 0.3636, 0.3633, 0.4090, 0.4434, 0.4768, 0.0000, 0.0000, 0.0000, 0.3819, 0.4277, 0.4347, 0.4577, 0.4789, 0.3477, 0.1967, 0.2060, 0.2049, 0.2209, 0.2227, 0.2315, 0.2301, 0.2438, 0.2524, 0.2502, 0.2623, 0.2576, 0.2564, 0.2699, 0.2855, 0.3143, 0.2979, 0.3263, 0.3232, 0.3717, 0.3753, 0.4165, 0.4346, 0.4080, 0.4615, 0.4266, 0.4392, 0.5890, 0.0000, 0.0000, 0.0000, 0.3925, 0.4204, 0.4355, 0.4655, 0.5137, 0.2522, 0.1977, 0.2036, 0.2264, 0.2299, 0.2466, 0.2628, 0.2639, 0.2634, 0.2815, 0.3062, 0.3054, 0.2843, 0.2735, 0.2903, 0.3024, 0.3271, 0.3474, 0.3701, 0.3710, 0.3882, 0.4187, 0.4192, 0.4064, 0.4700, 0.4275, 0.4634, 0.5384, 0.5804, 0.0000, 0.0000, 0.0000, 0.4013, 0.4256, 0.4442, 0.4596, 0.4860, 0.1637, 0.1880, 0.1854, 0.2001, 0.2260, 0.2395, 0.2359, 0.2605, 0.2761, 0.2912, 0.3005, 0.3060, 0.2783, 0.2967, 0.3172, 0.3477, 0.3610, 0.3755, 0.3853, 0.4036, 0.4232, 0.4345, 0.4714, 0.4609, 0.4807, 0.4760, 0.5307, 0.5920, 0.6667, 0.0000, 0.0000, 0.0000, 0.4080, 0.4225, 0.4587, 0.4873, 0.3585, 0.1490, 0.1847, 0.1978, 0.2024, 0.1907, 0.2021, 0.2301, 0.2312, 0.2396, 0.2437, 0.2615, 0.2626, 0.2670, 0.2763, 0.2692, 0.3377, 0.2918, 0.3532, 0.3584, 0.4009, 0.4231, 0.3914, 0.4495, 0.4513, 0.4265, 0.5075, 0.5419, 0.5530, 0.5991, 0.0000, 0.0000, 0.0000, 0.4028, 0.4344, 0.4443, 0.4706, 0.2189, 0.1332, 0.1607, 0.1688, 0.1826, 0.1941, 0.2104, 0.2330, 0.2464, 0.2556, 0.2657, 0.2593, 0.2694, 0.2570, 0.2585, 0.2601, 0.3015, 0.3106, 0.3096, 0.3325, 0.3396, 0.3926, 0.3547, 0.3922, 0.4017, 0.4041, 0.4452, 0.5183, 0.5656, 0.6020, 0.0000, 0.0000, 0.0000, 0.1668, 0.4392, 0.4493, 0.4341, 0.1520, 0.1720, 0.2046, 0.1954, 0.1838, 0.1763, 0.1911, 0.1864, 0.2099, 0.2275, 0.2336, 0.2244, 0.2312, 0.2482, 0.2544, 0.2762, 0.2956, 0.3206, 0.3364, 0.3618, 0.3787, 0.3705, 0.4065, 0.4193, 0.4130, 0.4612, 0.5291, 0.5680, 0.5802, 0.5690, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000}, "pT rap effeciency values for Kaons"}; + Configurable> effPtRapValuesKa{"effPtRapValuesKa", {0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1708, 0.4335, 0.4545, 0.4420, 0.1393, 0.1644, 0.1837, 0.1891, 0.1730, 0.1792, 0.1780, 0.1921, 0.2063, 0.2119, 0.2194, 0.2169, 0.2148, 0.2454, 0.2667, 0.2636, 0.2991, 0.2966, 0.3119, 0.3211, 0.3646, 0.3758, 0.3564, 0.4048, 0.3969, 0.4409, 0.5256, 0.5629, 0.4932, 0.5719, 0.0000, 0.0000, 0.0000, 0.4053, 0.4337, 0.4542, 0.4876, 0.2247, 0.1282, 0.1516, 0.1638, 0.1677, 0.1906, 0.2053, 0.2125, 0.2182, 0.2249, 0.2646, 0.2576, 0.2416, 0.2359, 0.2702, 0.2548, 0.2632, 0.2773, 0.3115, 0.3361, 0.3433, 0.3307, 0.3315, 0.3551, 0.3973, 0.4025, 0.4464, 0.4720, 0.5050, 0.5728, 0.0000, 0.0000, 0.0000, 0.3984, 0.4181, 0.4463, 0.4955, 0.3615, 0.1372, 0.1724, 0.1809, 0.1746, 0.1818, 0.1983, 0.2034, 0.2147, 0.2183, 0.2393, 0.2340, 0.2475, 0.2407, 0.2593, 0.2535, 0.2881, 0.2937, 0.2890, 0.3213, 0.3390, 0.3874, 0.4076, 0.4169, 0.3844, 0.4156, 0.4187, 0.5110, 0.5493, 0.5637, 0.0000, 0.0000, 0.0000, 0.4007, 0.4279, 0.4688, 0.4743, 0.4937, 0.1448, 0.1657, 0.1785, 0.1745, 0.1932, 0.2011, 0.2124, 0.2352, 0.2525, 0.2666, 0.2588, 0.2606, 0.2572, 0.2815, 0.2798, 0.2723, 0.2941, 0.3335, 0.3499, 0.3584, 0.3652, 0.4144, 0.3913, 0.4103, 0.4382, 0.4465, 0.4678, 0.5728, 0.5711, 0.0000, 0.0000, 0.0000, 0.4034, 0.4151, 0.4528, 0.4750, 0.5040, 0.2426, 0.1757, 0.1878, 0.1925, 0.2072, 0.2163, 0.2324, 0.2341, 0.2454, 0.2518, 0.2536, 0.2594, 0.2582, 0.2539, 0.2748, 0.2852, 0.2943, 0.3057, 0.3257, 0.3241, 0.3396, 0.3600, 0.3829, 0.4030, 0.3686, 0.3908, 0.4253, 0.4945, 0.5103, 0.0000, 0.0000, 0.0000, 0.3771, 0.4078, 0.4427, 0.4754, 0.5002, 0.3424, 0.1813, 0.1800, 0.1752, 0.1901, 0.1969, 0.1953, 0.2109, 0.2141, 0.2267, 0.2454, 0.2449, 0.2289, 0.2175, 0.2293, 0.2378, 0.2566, 0.2751, 0.2839, 0.2974, 0.3152, 0.3452, 0.3383, 0.3693, 0.3381, 0.4057, 0.3908, 0.4271, 0.4690, 0.0000, 0.0000, 0.0000, 0.3691, 0.4237, 0.4247, 0.4536, 0.4860, 0.4040, 0.1578, 0.1594, 0.1746, 0.1767, 0.1910, 0.2006, 0.2116, 0.1968, 0.2359, 0.2172, 0.2323, 0.2505, 0.2133, 0.2216, 0.2375, 0.2630, 0.2904, 0.2968, 0.3123, 0.3354, 0.3172, 0.3454, 0.3736, 0.3438, 0.3865, 0.3849, 0.4442, 0.4483, 0.0000, 0.0000, 0.0000, 0.3577, 0.4094, 0.4182, 0.4579, 0.4832, 0.4525, 0.1238, 0.1379, 0.1448, 0.1520, 0.1617, 0.1719, 0.1874, 0.1899, 0.2010, 0.2061, 0.2279, 0.2171, 0.1931, 0.2008, 0.2138, 0.2298, 0.2520, 0.2500, 0.2984, 0.3012, 0.2999, 0.3226, 0.2992, 0.3212, 0.3450, 0.3548, 0.3536, 0.3941, 0.0000, 0.0000, 0.0000, 0.3504, 0.3854, 0.3931, 0.4188, 0.4440, 0.4497, 0.1152, 0.1316, 0.1285, 0.1372, 0.1455, 0.1513, 0.1668, 0.1602, 0.1792, 0.1723, 0.1859, 0.1913, 0.1742, 0.1678, 0.1789, 0.1925, 0.2049, 0.2297, 0.2303, 0.2310, 0.2380, 0.2535, 0.2577, 0.2840, 0.3064, 0.2902, 0.3095, 0.3119, 0.0000, 0.0000, 0.0000, 0.2881, 0.3204, 0.3320, 0.3706, 0.3965, 0.4150, 0.0748, 0.0839, 0.0799, 0.0830, 0.0975, 0.0984, 0.1077, 0.1049, 0.1078, 0.1285, 0.1327, 0.1203, 0.1229, 0.1222, 0.1263, 0.1501, 0.1488, 0.1514, 0.1534, 0.1639, 0.1761, 0.1908, 0.1917, 0.1922, 0.1874, 0.2393, 0.2171, 0.2308, 0.0000, 0.0000, 0.0000, 0.2963, 0.3213, 0.3363, 0.3690, 0.3945, 0.4268, 0.0839, 0.0886, 0.0924, 0.1016, 0.1054, 0.1020, 0.1157, 0.1182, 0.1193, 0.1422, 0.1379, 0.1593, 0.1383, 0.1456, 0.1455, 0.1355, 0.1689, 0.1871, 0.1652, 0.1819, 0.1904, 0.2112, 0.2036, 0.2195, 0.2244, 0.2416, 0.2359, 0.2342, 0.0000, 0.0000, 0.0000, 0.3358, 0.3810, 0.3932, 0.4273, 0.4669, 0.4764, 0.1178, 0.1273, 0.1318, 0.1347, 0.1543, 0.1507, 0.1552, 0.1507, 0.1615, 0.1678, 0.1778, 0.1870, 0.1735, 0.1818, 0.1945, 0.2084, 0.2147, 0.2266, 0.2278, 0.2387, 0.2596, 0.2341, 0.2737, 0.2855, 0.2857, 0.2753, 0.2622, 0.3174, 0.0000, 0.0000, 0.0000, 0.3498, 0.3972, 0.4096, 0.4354, 0.4724, 0.4403, 0.1168, 0.1295, 0.1346, 0.1403, 0.1585, 0.1595, 0.1632, 0.1760, 0.1791, 0.1768, 0.2044, 0.2106, 0.1884, 0.1915, 0.2051, 0.2017, 0.2367, 0.2455, 0.2523, 0.2763, 0.2790, 0.2973, 0.2756, 0.2926, 0.3040, 0.3103, 0.3124, 0.3574, 0.0000, 0.0000, 0.0000, 0.3490, 0.4007, 0.4140, 0.4482, 0.4721, 0.3885, 0.1655, 0.1738, 0.1867, 0.1909, 0.2132, 0.2115, 0.2112, 0.2303, 0.2310, 0.2331, 0.2474, 0.2457, 0.2362, 0.2460, 0.2674, 0.2495, 0.2806, 0.3042, 0.3346, 0.3025, 0.3450, 0.3676, 0.3715, 0.3641, 0.3555, 0.4242, 0.4336, 0.4845, 0.0000, 0.0000, 0.0000, 0.3793, 0.4286, 0.4340, 0.4558, 0.4801, 0.3475, 0.1974, 0.2060, 0.2062, 0.2204, 0.2219, 0.2316, 0.2286, 0.2435, 0.2539, 0.2496, 0.2619, 0.2560, 0.2527, 0.2691, 0.2855, 0.3096, 0.2912, 0.3290, 0.3231, 0.3723, 0.3811, 0.4168, 0.4368, 0.4074, 0.4640, 0.4214, 0.4412, 0.6047, 0.0000, 0.0000, 0.0000, 0.3928, 0.4173, 0.4334, 0.4638, 0.5108, 0.2496, 0.1975, 0.2030, 0.2253, 0.2299, 0.2482, 0.2629, 0.2640, 0.2635, 0.2807, 0.3057, 0.3093, 0.2841, 0.2729, 0.2939, 0.3034, 0.3330, 0.3442, 0.3741, 0.3786, 0.3784, 0.4199, 0.4168, 0.4131, 0.4654, 0.4308, 0.4555, 0.5481, 0.5900, 0.0000, 0.0000, 0.0000, 0.4041, 0.4263, 0.4422, 0.4589, 0.4866, 0.1647, 0.1885, 0.1861, 0.1997, 0.2271, 0.2389, 0.2348, 0.2591, 0.2764, 0.2904, 0.3016, 0.3062, 0.2738, 0.2962, 0.3160, 0.3489, 0.3599, 0.3718, 0.3870, 0.4055, 0.4160, 0.4345, 0.4826, 0.4519, 0.4791, 0.4762, 0.5269, 0.6199, 0.6775, 0.0000, 0.0000, 0.0000, 0.4072, 0.4232, 0.4613, 0.4841, 0.3580, 0.1494, 0.1841, 0.1980, 0.2009, 0.1910, 0.2019, 0.2317, 0.2325, 0.2386, 0.2463, 0.2629, 0.2617, 0.2696, 0.2792, 0.2693, 0.3335, 0.2920, 0.3551, 0.3521, 0.4019, 0.4176, 0.3858, 0.4530, 0.4643, 0.4276, 0.5075, 0.5590, 0.5567, 0.6103, 0.0000, 0.0000, 0.0000, 0.4051, 0.4326, 0.4462, 0.4733, 0.2214, 0.1328, 0.1605, 0.1703, 0.1822, 0.1938, 0.2114, 0.2328, 0.2489, 0.2553, 0.2664, 0.2602, 0.2677, 0.2590, 0.2611, 0.2584, 0.3021, 0.3118, 0.3087, 0.3297, 0.3414, 0.3893, 0.3550, 0.3937, 0.4043, 0.4075, 0.4396, 0.5144, 0.5738, 0.5785, 0.0000, 0.0000, 0.0000, 0.1661, 0.4374, 0.4470, 0.4326, 0.1511, 0.1718, 0.2039, 0.1941, 0.1819, 0.1787, 0.1915, 0.1857, 0.2109, 0.2293, 0.2368, 0.2242, 0.2308, 0.2467, 0.2568, 0.2726, 0.2919, 0.3205, 0.3332, 0.3621, 0.3788, 0.3659, 0.4094, 0.4147, 0.4206, 0.4576, 0.5174, 0.5668, 0.5717, 0.6030, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000}, "pT rap effeciency values for Kaons"}; Configurable> effPtValuesPr{"effPtValuesPr", {0, 0, 0, 0, 0, 0, 0, 0.413799, 0.443597, 0.478144, 0.505512, 0.514127, 0.523279, 0.506121, 0.481129, 0.436858, 0.365426, 0.244158, 0.246106, 0.249133, 0.251019, 0.256516, 0.263027, 0.258241, 0.260814, 0.270519, 0.272534, 0.271853, 0.274523, 0.279029, 0.279756, 0.285479, 0.292531, 0.292348, 0.294704, 0.295867, 0.289818}, "effeciency values for Kaons"}; - Configurable> effPtRapValuesPr{"effPtRapValuesPr", {0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0339, 0.3198, 0.6225, 0.6961, 0.6865, 0.3870, 0.3603, 0.3747, 0.3765, 0.3812, 0.3860, 0.3793, 0.3897, 0.3713, 0.3408, 0.3204, 0.3505, 0.3313, 0.3189, 0.3179, 0.3714, 0.3450, 0.3659, 0.3303, 0.3727, 0.3353, 0.4124, 0.3755, 0.3680, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.2453, 0.5687, 0.6297, 0.6445, 0.6864, 0.7439, 0.6205, 0.3602, 0.3300, 0.3139, 0.3066, 0.2902, 0.2910, 0.3169, 0.3290, 0.3596, 0.3345, 0.3379, 0.3808, 0.3658, 0.3311, 0.3829, 0.4252, 0.3592, 0.3778, 0.4173, 0.4083, 0.3905, 0.4169, 0.3470, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5466, 0.6134, 0.6293, 0.6451, 0.6817, 0.7348, 0.6971, 0.4628, 0.3037, 0.3039, 0.3051, 0.3492, 0.3391, 0.3190, 0.3521, 0.3582, 0.3402, 0.3278, 0.3477, 0.3936, 0.3571, 0.3591, 0.3739, 0.3902, 0.3732, 0.4123, 0.3741, 0.3137, 0.3740, 0.3497, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5707, 0.6136, 0.6606, 0.6479, 0.6613, 0.6752, 0.6961, 0.7150, 0.3865, 0.3336, 0.3168, 0.3175, 0.3289, 0.3310, 0.3365, 0.3517, 0.3521, 0.3274, 0.3496, 0.3850, 0.3615, 0.3780, 0.3802, 0.4004, 0.4011, 0.4142, 0.4057, 0.4173, 0.4073, 0.4222, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5873, 0.6086, 0.6380, 0.6571, 0.6536, 0.7018, 0.7207, 0.7215, 0.5860, 0.3364, 0.3081, 0.3494, 0.3398, 0.3491, 0.3680, 0.3567, 0.4204, 0.3898, 0.3957, 0.4100, 0.3749, 0.4093, 0.3917, 0.4212, 0.3910, 0.4062, 0.4019, 0.4378, 0.3997, 0.3769, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5695, 0.5995, 0.6392, 0.6646, 0.6341, 0.6736, 0.7025, 0.7104, 0.7144, 0.4082, 0.3392, 0.3319, 0.3259, 0.3929, 0.3720, 0.3617, 0.3716, 0.3394, 0.3454, 0.3520, 0.3409, 0.3872, 0.3775, 0.3134, 0.3928, 0.3635, 0.3540, 0.4066, 0.3520, 0.3580, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5524, 0.6210, 0.6435, 0.6720, 0.6714, 0.6821, 0.7348, 0.7403, 0.7531, 0.5534, 0.3513, 0.3381, 0.3319, 0.3384, 0.3426, 0.3254, 0.3360, 0.3503, 0.3264, 0.3306, 0.3642, 0.3545, 0.3478, 0.3527, 0.3625, 0.3678, 0.4036, 0.3569, 0.3321, 0.3761, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5472, 0.5793, 0.6230, 0.6680, 0.6685, 0.6886, 0.7368, 0.7534, 0.7767, 0.6561, 0.2933, 0.2798, 0.2943, 0.2940, 0.3034, 0.3104, 0.3133, 0.3168, 0.3209, 0.3018, 0.3135, 0.3137, 0.3315, 0.3580, 0.3384, 0.3454, 0.3307, 0.3182, 0.3801, 0.3145, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5479, 0.5660, 0.5973, 0.6225, 0.6437, 0.6655, 0.6920, 0.7241, 0.7637, 0.7145, 0.2647, 0.2727, 0.2858, 0.2508, 0.2523, 0.2647, 0.2592, 0.2438, 0.3017, 0.2916, 0.2582, 0.2705, 0.2876, 0.2960, 0.2958, 0.2982, 0.3014, 0.2978, 0.3077, 0.3234, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.4692, 0.5078, 0.5095, 0.5695, 0.6257, 0.5869, 0.6149, 0.6597, 0.7159, 0.6730, 0.1877, 0.1686, 0.1809, 0.1793, 0.1636, 0.1880, 0.1822, 0.1980, 0.2000, 0.1931, 0.1960, 0.1895, 0.1921, 0.2056, 0.2194, 0.2048, 0.1942, 0.1944, 0.2267, 0.1756, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1458, 0.1090, 0.1011, 0.0956, 0.0961, 0.0920, 0.0934, 0.1006, 0.1015, 0.1028, 0.0299, 0.0291, 0.0298, 0.0290, 0.0285, 0.0326, 0.0318, 0.0316, 0.0335, 0.0307, 0.0370, 0.0346, 0.0373, 0.0330, 0.0404, 0.0409, 0.0379, 0.0393, 0.0384, 0.0347, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5459, 0.5794, 0.5870, 0.6118, 0.6806, 0.6603, 0.6685, 0.6983, 0.7300, 0.7229, 0.2701, 0.2476, 0.2332, 0.2516, 0.2832, 0.2878, 0.2401, 0.2429, 0.2737, 0.2909, 0.2821, 0.2739, 0.2935, 0.2763, 0.2905, 0.2901, 0.2624, 0.2743, 0.2765, 0.2768, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5492, 0.5688, 0.6025, 0.6438, 0.6553, 0.6753, 0.6955, 0.7401, 0.7443, 0.6152, 0.2739, 0.2595, 0.2627, 0.2448, 0.2755, 0.2661, 0.2868, 0.2728, 0.2766, 0.2822, 0.2971, 0.2699, 0.2906, 0.2847, 0.2991, 0.2922, 0.2971, 0.3115, 0.3190, 0.2911, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5386, 0.5562, 0.6265, 0.6461, 0.6657, 0.6662, 0.6788, 0.7231, 0.7452, 0.5331, 0.3690, 0.3522, 0.3639, 0.3608, 0.3767, 0.3659, 0.3698, 0.3622, 0.3835, 0.3945, 0.3727, 0.3756, 0.3696, 0.3793, 0.3974, 0.3849, 0.4076, 0.4034, 0.3830, 0.3997, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5549, 0.5906, 0.6211, 0.6459, 0.6337, 0.6527, 0.7139, 0.7135, 0.6978, 0.4328, 0.3874, 0.4117, 0.3946, 0.4086, 0.3969, 0.4171, 0.4177, 0.4252, 0.4013, 0.3983, 0.3879, 0.3580, 0.4246, 0.3776, 0.4004, 0.4148, 0.4322, 0.4258, 0.4097, 0.4332, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5714, 0.6016, 0.6489, 0.6461, 0.6212, 0.6422, 0.6781, 0.6867, 0.5264, 0.3990, 0.3788, 0.3841, 0.3841, 0.4045, 0.4228, 0.4481, 0.4041, 0.4295, 0.4772, 0.4250, 0.4547, 0.4662, 0.4123, 0.4281, 0.3978, 0.4676, 0.4783, 0.4357, 0.4261, 0.5097, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5979, 0.5975, 0.6258, 0.6617, 0.6368, 0.6823, 0.7199, 0.7093, 0.3680, 0.3414, 0.3514, 0.3390, 0.3770, 0.3479, 0.3471, 0.3840, 0.3779, 0.3988, 0.4329, 0.4114, 0.4216, 0.3994, 0.4046, 0.4322, 0.4386, 0.4179, 0.4636, 0.4501, 0.4376, 0.4547, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5787, 0.6295, 0.6553, 0.6404, 0.6299, 0.6723, 0.6928, 0.4525, 0.3031, 0.3146, 0.3160, 0.3328, 0.3610, 0.3694, 0.3414, 0.3894, 0.3549, 0.3514, 0.3854, 0.3937, 0.4015, 0.3991, 0.3783, 0.3765, 0.4228, 0.4194, 0.3932, 0.4179, 0.4323, 0.3799, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.2257, 0.5829, 0.6392, 0.6577, 0.6744, 0.7086, 0.6263, 0.3869, 0.3645, 0.3169, 0.2885, 0.2944, 0.2982, 0.2959, 0.3214, 0.3271, 0.3333, 0.3841, 0.3707, 0.4022, 0.3970, 0.3747, 0.3930, 0.3812, 0.3923, 0.3872, 0.4083, 0.4625, 0.4091, 0.4308, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0343, 0.3174, 0.6091, 0.6870, 0.6767, 0.4265, 0.4035, 0.3921, 0.4054, 0.3786, 0.3852, 0.3952, 0.3551, 0.3799, 0.3574, 0.3478, 0.3342, 0.3269, 0.3239, 0.3679, 0.3209, 0.3090, 0.3767, 0.3253, 0.3707, 0.3915, 0.4005, 0.4359, 0.4303, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000}, "pT rap effeciency values for Protons"}; + Configurable> effPtRapValuesPr{"effPtRapValuesPr", {0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0350, 0.3227, 0.6253, 0.6963, 0.6794, 0.3871, 0.3568, 0.3739, 0.3741, 0.3839, 0.3920, 0.3733, 0.3853, 0.3715, 0.3401, 0.3239, 0.3477, 0.3271, 0.3238, 0.3161, 0.3699, 0.3458, 0.3625, 0.3263, 0.3729, 0.3329, 0.4162, 0.3769, 0.3676, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0083, 0.2461, 0.5721, 0.6271, 0.6475, 0.6854, 0.7333, 0.6264, 0.3574, 0.3284, 0.3125, 0.3068, 0.2907, 0.2901, 0.3157, 0.3290, 0.3605, 0.3312, 0.3321, 0.3806, 0.3699, 0.3328, 0.3790, 0.4218, 0.3560, 0.3815, 0.4224, 0.4084, 0.3966, 0.4242, 0.3494, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1002, 0.4701, 0.5444, 0.6183, 0.6271, 0.6466, 0.6825, 0.7341, 0.7063, 0.4644, 0.3044, 0.3042, 0.3036, 0.3436, 0.3403, 0.3202, 0.3508, 0.3570, 0.3379, 0.3234, 0.3496, 0.3952, 0.3592, 0.3558, 0.3744, 0.3872, 0.3675, 0.4067, 0.3756, 0.3148, 0.3804, 0.3394, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5268, 0.5608, 0.5678, 0.6051, 0.6555, 0.6539, 0.6547, 0.6774, 0.7031, 0.7077, 0.3825, 0.3330, 0.3176, 0.3167, 0.3257, 0.3346, 0.3343, 0.3542, 0.3552, 0.3335, 0.3553, 0.3783, 0.3622, 0.3745, 0.3829, 0.4017, 0.4052, 0.4155, 0.4053, 0.4183, 0.4008, 0.4192, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.4958, 0.5522, 0.5850, 0.6070, 0.6356, 0.6566, 0.6527, 0.6986, 0.7230, 0.7258, 0.5841, 0.3389, 0.3065, 0.3507, 0.3404, 0.3470, 0.3700, 0.3559, 0.4174, 0.3907, 0.3927, 0.4110, 0.3821, 0.4087, 0.3856, 0.4179, 0.3846, 0.4074, 0.3998, 0.4417, 0.4030, 0.3701, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5001, 0.5387, 0.5687, 0.5979, 0.6325, 0.6667, 0.6343, 0.6637, 0.6918, 0.7160, 0.7163, 0.4032, 0.3426, 0.3320, 0.3235, 0.3942, 0.3691, 0.3655, 0.3713, 0.3375, 0.3440, 0.3526, 0.3389, 0.3869, 0.3817, 0.3117, 0.3904, 0.3625, 0.3513, 0.4033, 0.3470, 0.3548, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.4804, 0.5030, 0.5471, 0.6193, 0.6334, 0.6618, 0.6741, 0.6791, 0.7283, 0.7427, 0.7476, 0.5547, 0.3485, 0.3388, 0.3286, 0.3421, 0.3439, 0.3235, 0.3386, 0.3548, 0.3266, 0.3326, 0.3649, 0.3570, 0.3457, 0.3576, 0.3624, 0.3652, 0.4041, 0.3640, 0.3371, 0.3712, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.4419, 0.5043, 0.5513, 0.5806, 0.6186, 0.6703, 0.6720, 0.6886, 0.7436, 0.7489, 0.7714, 0.6523, 0.2967, 0.2818, 0.2935, 0.2928, 0.3057, 0.3124, 0.3170, 0.3149, 0.3148, 0.3017, 0.3070, 0.3154, 0.3342, 0.3592, 0.3378, 0.3462, 0.3262, 0.3199, 0.3758, 0.3140, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.4038, 0.4921, 0.5492, 0.5645, 0.5991, 0.6307, 0.6477, 0.6584, 0.6855, 0.7222, 0.7616, 0.7143, 0.2660, 0.2750, 0.2842, 0.2531, 0.2539, 0.2648, 0.2608, 0.2451, 0.3028, 0.2926, 0.2565, 0.2665, 0.2860, 0.2966, 0.2979, 0.2980, 0.3018, 0.3010, 0.3075, 0.3206, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.3102, 0.4179, 0.4648, 0.5130, 0.5140, 0.5673, 0.6299, 0.5979, 0.6114, 0.6674, 0.7252, 0.6795, 0.1875, 0.1700, 0.1824, 0.1786, 0.1608, 0.1882, 0.1811, 0.1999, 0.2013, 0.1920, 0.1976, 0.1903, 0.1912, 0.2079, 0.2191, 0.2053, 0.1942, 0.1965, 0.2280, 0.1778, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.3163, 0.4231, 0.4802, 0.4893, 0.5333, 0.5497, 0.6038, 0.5997, 0.6288, 0.6778, 0.6772, 0.6903, 0.1937, 0.1960, 0.1922, 0.1820, 0.1821, 0.2076, 0.1988, 0.1971, 0.2013, 0.1875, 0.2262, 0.2070, 0.2248, 0.1937, 0.2380, 0.2450, 0.2245, 0.2393, 0.2302, 0.2090, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.4023, 0.4795, 0.5410, 0.5795, 0.5822, 0.6051, 0.6759, 0.6646, 0.6803, 0.6998, 0.7394, 0.7203, 0.2703, 0.2484, 0.2319, 0.2506, 0.2807, 0.2881, 0.2433, 0.2440, 0.2752, 0.2875, 0.2810, 0.2802, 0.2895, 0.2778, 0.2870, 0.2928, 0.2577, 0.2739, 0.2786, 0.2742, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.4392, 0.5116, 0.5504, 0.5738, 0.6041, 0.6422, 0.6585, 0.6790, 0.7010, 0.7327, 0.7515, 0.6178, 0.2717, 0.2596, 0.2611, 0.2460, 0.2794, 0.2702, 0.2864, 0.2747, 0.2795, 0.2828, 0.2950, 0.2705, 0.2973, 0.2855, 0.2977, 0.2903, 0.2951, 0.3171, 0.3202, 0.2941, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.4439, 0.4995, 0.5408, 0.5552, 0.6285, 0.6429, 0.6630, 0.6641, 0.6801, 0.7234, 0.7430, 0.5295, 0.3723, 0.3488, 0.3658, 0.3605, 0.3756, 0.3643, 0.3665, 0.3644, 0.3818, 0.3922, 0.3707, 0.3767, 0.3660, 0.3812, 0.3982, 0.3818, 0.4121, 0.4057, 0.3821, 0.4087, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.4802, 0.5405, 0.5537, 0.5879, 0.6195, 0.6429, 0.6356, 0.6538, 0.7105, 0.7092, 0.6975, 0.4333, 0.3931, 0.4090, 0.3939, 0.4047, 0.3970, 0.4104, 0.4154, 0.4295, 0.3995, 0.4013, 0.3880, 0.3569, 0.4243, 0.3714, 0.3962, 0.4198, 0.4361, 0.4200, 0.4040, 0.4374, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5116, 0.5483, 0.5715, 0.5935, 0.6488, 0.6416, 0.6203, 0.6435, 0.6814, 0.6855, 0.5243, 0.3995, 0.3796, 0.3779, 0.3840, 0.4065, 0.4174, 0.4472, 0.4030, 0.4281, 0.4814, 0.4217, 0.4567, 0.4689, 0.4117, 0.4286, 0.3991, 0.4668, 0.4786, 0.4416, 0.4254, 0.5134, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5333, 0.5601, 0.5965, 0.6047, 0.6303, 0.6673, 0.6368, 0.6791, 0.7238, 0.7025, 0.3686, 0.3411, 0.3513, 0.3422, 0.3791, 0.3428, 0.3462, 0.3873, 0.3683, 0.3951, 0.4290, 0.4181, 0.4171, 0.3960, 0.4049, 0.4350, 0.4397, 0.4206, 0.4598, 0.4500, 0.4367, 0.4547, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1062, 0.4560, 0.5766, 0.6264, 0.6540, 0.6394, 0.6296, 0.6780, 0.6934, 0.4543, 0.3003, 0.3125, 0.3187, 0.3339, 0.3645, 0.3697, 0.3436, 0.3927, 0.3516, 0.3489, 0.3887, 0.3933, 0.3978, 0.3986, 0.3764, 0.3722, 0.4232, 0.4170, 0.3918, 0.4188, 0.4411, 0.3808, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0064, 0.2256, 0.5893, 0.6313, 0.6598, 0.6690, 0.7104, 0.6301, 0.3874, 0.3643, 0.3177, 0.2875, 0.2959, 0.2995, 0.2917, 0.3201, 0.3266, 0.3320, 0.3801, 0.3751, 0.3990, 0.3944, 0.3750, 0.3895, 0.3890, 0.3957, 0.3862, 0.4067, 0.4631, 0.3982, 0.4257, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0352, 0.3187, 0.6095, 0.6791, 0.6808, 0.4209, 0.3994, 0.3917, 0.4046, 0.3751, 0.3845, 0.3943, 0.3548, 0.3847, 0.3555, 0.3471, 0.3369, 0.3262, 0.3203, 0.3671, 0.3227, 0.3087, 0.3774, 0.3175, 0.3776, 0.3860, 0.4008, 0.4351, 0.4322, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000}, "pT rap effeciency values for Protons"}; using MyAllTracks = soa::Join ", kTH1D, {axisMeanPt}); @@ -788,12 +784,13 @@ struct MeanPtFlucId { // Fill after PID cut QA hist: template - void fillIdParticleQAHistos(T const& track, const std::vector& ptBins, const std::vector& rapBins, const std::vector& effPtValues, const std::vector& effPtRapValues, double rap, double nSigmaTPC, double nSigmaTOF, int nFT0M, int& N, double& Q1, double& Q2, double& Q3, double& Q4) + void fillIdParticleQAHistos(T const& track, const std::vector& ptBins, const std::vector& rapBins, const std::vector& effPtValues, const std::vector& effPtRapValues, double rap, double nSigmaTPC, double nSigmaTOF, int nFT0M, int& N, int& NW, double& Q1, double& Q2, double& Q3, double& Q4) { double pt = track.pt(); double weight = getCorrectedWeight(ptBins, rapBins, effPtValues, effPtRapValues, pt, rap, cfgCorrectionPtRapPID, cfgCorrectionPID); - N += weight; + NW += weight; + N++; moments(pt, weight, Q1, Q2, Q3, Q4); hist.fill(HIST(Dire[Mode]) + HIST("h2_Pt_Rap_weighted"), rap, pt, weight); @@ -869,7 +866,7 @@ struct MeanPtFlucId { } template - void fillAnalysisHistos(int nTPC, int nFT0M, int N, double Q1, double Q2, double Q3, double Q4) + void fillAnalysisHistos(int nTPC, int nFT0M, int N, int NW, double Q1, double Q2, double Q3, double Q4) { if (N == 0) { return; @@ -879,16 +876,17 @@ struct MeanPtFlucId { double fourpart1 = ((Q1 * Q1 * Q1 * Q1) - (6 * Q2 * Q1 * Q1) + (3 * Q2 * Q2) + (8 * Q3 * Q1) - 6 * Q4); hist.fill(HIST(Dire[Mode]) + HIST("h_Mult"), N); + hist.fill(HIST(Dire[Mode]) + HIST("h_Mult_weighted"), NW); hist.fill(HIST(Dire[Mode]) + HIST("h_Q1"), nTPC, Q1, nFT0M); hist.fill(HIST(Dire[Mode]) + HIST("h_Q2"), nTPC, Q2, nFT0M); hist.fill(HIST(Dire[Mode]) + HIST("h_Q3"), nTPC, Q3, nFT0M); hist.fill(HIST(Dire[Mode]) + HIST("h_Q4"), nTPC, Q4, nFT0M); if (N > 1) { - double meanPt = Q1 / static_cast(N); - double nPair = (static_cast(N) * (static_cast(N) - 1)); + double meanPt = Q1 / static_cast(NW); + double nPair = (static_cast(NW) * (static_cast(NW) - 1)); double twopart = twopart1 / nPair; - double checkNDenoVar = (1 / std::sqrt(1 - (1 / static_cast(N)))); + double checkNDenoVar = (1 / std::sqrt(1 - (1 / static_cast(NW)))); hist.fill(HIST(Dire[Mode]) + HIST("h_mean_pT"), meanPt); hist.fill(HIST(Dire[Mode]) + HIST("p_mean_pT_Mult_var"), nTPC, meanPt); @@ -924,8 +922,10 @@ struct MeanPtFlucId { void fillHistos(T const& col, U const& tracks) { int nCh = 0, nTPC = 0, nFT0M = 0, nFT0C = 0; + int nChW = 0; int nPi = 0, nKa = 0, nPr = 0; + int nPiW = 0, nKaW = 0, nPrW = 0; double ptCh = 0, q1Ch = 0, q2Ch = 0, q3Ch = 0, q4Ch = 0; double ptPi = 0, q1Pi = 0, q2Pi = 0, q3Pi = 0, q4Pi = 0; double ptPr = 0, q1Pr = 0, q2Pr = 0, q3Pr = 0, q4Pr = 0; @@ -933,12 +933,14 @@ struct MeanPtFlucId { int nChSim = 0, nSim = 0, nFT0CSim = 0; int nPiSim = 0, nKaSim = 0, nPrSim = 0; - double eta = 0, etaSim = 0, rapSim = 0; + double eta = 0, etaSim = -999, rapSim = -999; double ptChSim = 0, q1ChSim = 0, q2ChSim = 0, q3ChSim = 0, q4ChSim = 0; double ptPiSim = 0, q1PiSim = 0, q2PiSim = 0, q3PiSim = 0, q4PiSim = 0; double ptPrSim = 0, q1PrSim = 0, q2PrSim = 0, q3PrSim = 0, q4PrSim = 0; double ptKaSim = 0, q1KaSim = 0, q2KaSim = 0, q3KaSim = 0, q4KaSim = 0; + double wghtCh = 1.0, wghtPi = 1.0, wghtKa = 1.0, wghtPr = 1.0; + array p1, p2; double invMassGamma = 0.0; @@ -984,7 +986,8 @@ struct MeanPtFlucId { if (std::fabs(track.eta()) < 0.8) { ptCh = track.pt(); double weight = getCorrectedWeight(ptBins, {}, effValuesCh, {}, ptCh, 0.0, false, cfgCorrection); - nCh += weight; + nChW += weight; + nCh++; hist.fill(HIST("QA/after/h_Pt_weighted"), ptCh, weight); moments(ptCh, weight, q1Ch, q2Ch, q3Ch, q4Ch); @@ -1003,31 +1006,31 @@ struct MeanPtFlucId { if (cfgSelOR == true && cfgSelAND == false) { if (selLowPi(track) == cfgSelLow || selHighPi(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPi, effPtRapValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, q1Pi, q2Pi, q3Pi, q4Pi); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPi, effPtRapValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi); } } else if (cfgSelOR == false && cfgSelAND == true) { if (selLowPi(track) == cfgSelLow && selHighPi(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPi, effPtRapValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, q1Pi, q2Pi, q3Pi, q4Pi); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPi, effPtRapValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi); } } if (cfgSelOR == true && cfgSelAND == false) { if (selLowKa(track) == cfgSelLow || selHighKa(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesKa, effPtRapValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, q1Ka, q2Ka, q3Ka, q4Ka); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesKa, effPtRapValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka); } } else if (cfgSelOR == false && cfgSelAND == true) { if (selLowKa(track) == cfgSelLow && selHighKa(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesKa, effPtRapValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, q1Ka, q2Ka, q3Ka, q4Ka); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesKa, effPtRapValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka); } } if (cfgSelOR == true && cfgSelAND == false) { if (selLowPr(track) == cfgSelLow || selHighPr(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPr, effPtRapValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, q1Pr, q2Pr, q3Pr, q4Pr); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPr, effPtRapValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr); } } else if (cfgSelOR == false && cfgSelAND == true) { if (selLowPr(track) == cfgSelLow && selHighPr(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPr, effPtRapValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, q1Pr, q2Pr, q3Pr, q4Pr); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPr, effPtRapValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr); } } } @@ -1039,7 +1042,6 @@ struct MeanPtFlucId { nTPC = col.multNTracksHasTPC(); nFT0M = col.multFT0M(); nFT0C = col.multFT0C(); - hist.fill(HIST("Gen/h_VtxZ"), col.mcCollision().posZ()); for (const auto& track : tracks) { if (!track.has_mcParticle()) { @@ -1074,7 +1076,8 @@ struct MeanPtFlucId { ptCh = track.pt(); double weight = getCorrectedWeight(ptBins, {}, effValuesCh, {}, ptCh, 0.0, false, cfgCorrection); hist.fill(HIST("QA/after/h_Pt_weighted"), ptCh, weight); - nCh += weight; + nChW += weight; + nCh++; moments(ptCh, weight, q1Ch, q2Ch, q3Ch, q4Ch); fillChargedQAHistos(track, nFT0M); } @@ -1092,19 +1095,19 @@ struct MeanPtFlucId { if (cfgPDGCodeOnly == true) { if (std::abs(pid) == kPiPlus && std::abs(rapPi) < 0.5 && track.pt() >= cfgCutPiPtMin) { ptPi = track.pt(); - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPi, effPtRapValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, q1Pi, q2Pi, q3Pi, q4Pi); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPi, effPtRapValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi); fillPtMCHist(ptPi, eta, rapPi, nFT0M, pid, kPiPlus, kPiMinus); } if (std::abs(pid) == kKPlus && std::abs(rapKa) < 0.5 && track.pt() >= cfgCutKaPtMin) { ptKa = track.pt(); - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesKa, effPtRapValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, q1Ka, q2Ka, q3Ka, q4Ka); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesKa, effPtRapValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka); fillPtMCHist(ptKa, eta, rapKa, nFT0M, pid, kKPlus, kKMinus); } if (std::abs(pid) == kProton && std::abs(rapPr) < 0.5 && track.pt() >= cfgCutPrPtMin) { ptPr = track.pt(); - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPr, effPtRapValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, q1Pr, q2Pr, q3Pr, q4Pr); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPr, effPtRapValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr); fillPtMCHist(ptPr, eta, rapPr, nFT0M, pid, kProton, kProtonBar); } } @@ -1113,7 +1116,7 @@ struct MeanPtFlucId { if (cfgSelOR == true && cfgSelAND == false) { if (selLowPi(track) == cfgSelLow || selHighPi(track) == cfgSelHigh) { ptPi = track.pt(); - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPi, effPtRapValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, q1Pi, q2Pi, q3Pi, q4Pi); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPi, effPtRapValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi); if (std::abs(pid) == kPiPlus) { fillPtMCHist(ptPi, eta, rapPi, nFT0M, pid, kPiPlus, kPiMinus); } @@ -1121,7 +1124,7 @@ struct MeanPtFlucId { } else if (cfgSelOR == false && cfgSelAND == true) { if (selLowPi(track) == cfgSelLow && selHighPi(track) == cfgSelHigh) { ptPi = track.pt(); - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPi, effPtRapValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, q1Pi, q2Pi, q3Pi, q4Pi); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPi, effPtRapValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi); if (std::abs(pid) == kPiPlus) { fillPtMCHist(ptPi, eta, rapPi, nFT0M, pid, kPiPlus, kPiMinus); } @@ -1131,7 +1134,7 @@ struct MeanPtFlucId { if (cfgSelOR == true && cfgSelAND == false) { if (selLowKa(track) == cfgSelLow || selHighKa(track) == cfgSelHigh) { ptKa = track.pt(); - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesKa, effPtRapValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, q1Ka, q2Ka, q3Ka, q4Ka); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesKa, effPtRapValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka); if (std::abs(pid) == kKPlus) { fillPtMCHist(ptKa, eta, rapKa, nFT0M, pid, kKPlus, kKMinus); } @@ -1139,7 +1142,7 @@ struct MeanPtFlucId { } else if (cfgSelOR == false && cfgSelAND == true) { if (selLowKa(track) == cfgSelLow && selHighKa(track) == cfgSelHigh) { ptKa = track.pt(); - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesKa, effPtRapValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, q1Ka, q2Ka, q3Ka, q4Ka); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesKa, effPtRapValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka); if (std::abs(pid) == kKPlus) { fillPtMCHist(ptKa, eta, rapKa, nFT0M, pid, kKPlus, kKMinus); } @@ -1149,7 +1152,7 @@ struct MeanPtFlucId { if (cfgSelOR == true && cfgSelAND == false) { if (selLowPr(track) == cfgSelLow || selHighPr(track) == cfgSelHigh) { ptPr = track.pt(); - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPr, effPtRapValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, q1Pr, q2Pr, q3Pr, q4Pr); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPr, effPtRapValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr); if (std::abs(pid) == kProton) { fillPtMCHist(ptPr, eta, rapPr, nFT0M, pid, kProton, kProtonBar); } @@ -1157,7 +1160,7 @@ struct MeanPtFlucId { } else if (cfgSelOR == false && cfgSelAND == true) { if (selLowPr(track) == cfgSelLow && selHighPr(track) == cfgSelHigh) { ptPr = track.pt(); - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPr, effPtRapValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, q1Pr, q2Pr, q3Pr, q4Pr); + fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPr, effPtRapValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr); if (std::abs(pid) == kProton) { fillPtMCHist(ptPr, eta, rapPr, nFT0M, pid, kProton, kProtonBar); } @@ -1286,30 +1289,30 @@ struct MeanPtFlucId { if (selTrack(track)) { if (std::abs(track.eta()) < 0.8) { double pt = track.pt(); - double weight = getCorrectedWeight(ptBins, {}, effValuesCh, {}, pt, 0.0, false, cfgCorrection); - hist.fill(HIST("QA/after/h2_pt_nch"), nCh, pt, weight); - hist.fill(HIST("QA/after/h2_pt_nch_prof"), nCh, pt, weight); + wghtCh = getCorrectedWeight(ptBins, {}, effValuesCh, {}, pt, 0.0, false, cfgCorrection); + hist.fill(HIST("QA/after/h2_pt_nch"), nCh, pt, wghtCh); + hist.fill(HIST("QA/after/h2_pt_nch_prof"), nCh, pt, wghtCh); } if (selLowPi(track) == cfgSelLow || selHighPi(track) == cfgSelHigh) { ptPi = track.pt(); - double weight = getCorrectedWeight(ptBins, rapBins, effPtValuesPi, effPtRapValuesPi, ptPi, rapPi, cfgCorrectionPtRapPID, cfgCorrectionPID); - hist.fill(HIST("QA/Pion/h2_pt_nch"), nPi, ptPi, weight); - hist.fill(HIST("QA/Pion/h2_pt_nch_prof"), nPi, ptPi, weight); + wghtPi = getCorrectedWeight(ptBins, rapBins, effPtValuesPi, effPtRapValuesPi, ptPi, rapPi, cfgCorrectionPtRapPID, cfgCorrectionPID); + hist.fill(HIST("QA/Pion/h2_pt_nch"), nPi, ptPi, wghtPi); + hist.fill(HIST("QA/Pion/h2_pt_nch_prof"), nPi, ptPi, wghtPi); } if (selLowKa(track) == cfgSelLow || selHighKa(track) == cfgSelHigh) { ptKa = track.pt(); - double weight = getCorrectedWeight(ptBins, rapBins, effPtValuesKa, effPtRapValuesKa, ptKa, rapKa, cfgCorrectionPtRapPID, cfgCorrectionPID); - hist.fill(HIST("QA/Kaon/h2_pt_nch"), nKa, ptKa, weight); - hist.fill(HIST("QA/Kaon/h2_pt_nch_prof"), nKa, ptKa, weight); + wghtKa = getCorrectedWeight(ptBins, rapBins, effPtValuesKa, effPtRapValuesKa, ptKa, rapKa, cfgCorrectionPtRapPID, cfgCorrectionPID); + hist.fill(HIST("QA/Kaon/h2_pt_nch"), nKa, ptKa, wghtKa); + hist.fill(HIST("QA/Kaon/h2_pt_nch_prof"), nKa, ptKa, wghtKa); } if (selLowPr(track) == cfgSelLow || selHighPr(track) == cfgSelHigh) { ptPr = track.pt(); - double weight = getCorrectedWeight(ptBins, rapBins, effPtValuesPr, effPtRapValuesPr, ptPr, rapPr, cfgCorrectionPtRapPID, cfgCorrectionPID); - hist.fill(HIST("QA/Proton/h2_pt_nch"), nPr, ptPr, weight); - hist.fill(HIST("QA/Proton/h2_pt_nch_prof"), nPr, ptPr, weight); + wghtPr = getCorrectedWeight(ptBins, rapBins, effPtValuesPr, effPtRapValuesPr, ptPr, rapPr, cfgCorrectionPtRapPID, cfgCorrectionPID); + hist.fill(HIST("QA/Proton/h2_pt_nch"), nPr, ptPr, wghtPr); + hist.fill(HIST("QA/Proton/h2_pt_nch_prof"), nPr, ptPr, wghtPr); } } @@ -1331,7 +1334,7 @@ struct MeanPtFlucId { hist.fill(HIST("Gen/Charged/h2_pt_nch_prof"), nChSim, pt); } - if (std::abs(mcPart.y()) > 0.5) + if (std::abs(mcPart.y()) >= 0.5) continue; if (std::abs(pid) == kPiPlus && mcPart.pt() >= cfgCutPiPtMin) { @@ -1351,6 +1354,7 @@ struct MeanPtFlucId { hist.fill(HIST("Gen/h_Counts"), 2); hist.fill(HIST("QA/after/h_VtxZReco"), col.posZ()); + hist.fill(HIST("Gen/h_VtxZ"), col.mcCollision().posZ()); if (nSim > 0) hist.fill(HIST("Gen/h_NSim"), nSim); @@ -1373,6 +1377,18 @@ struct MeanPtFlucId { if (nPrSim > 0 && nTPC > 0) hist.fill(HIST("Gen/h2_NTPC_NPrSim"), nTPC, nPrSim); + if (nChSim > 0 && nCh > 0) + hist.fill(HIST("Gen/Charged/h2_Nid_NidSim"), nChSim, nCh, wghtCh); + + if (nPi > 0 && nPiSim > 0) + hist.fill(HIST("Gen/Pion/h2_Nid_NidSim"), nPiSim, nPi, wghtPi); + + if (nKa > 0 && nKaSim > 0) + hist.fill(HIST("Gen/Kaon/h2_Nid_NidSim"), nKaSim, nKa, wghtKa); + + if (nPr > 0 && nPrSim > 0) + hist.fill(HIST("Gen/Proton/h2_Nid_NidSim"), nPrSim, nPr, wghtPr); + hist.fill(HIST("Gen/h_NTPC"), nTPC); hist.fill(HIST("Gen/h_NFT0C"), nFT0CSim); hist.fill(HIST("Gen/h2_NTPC_NFT0C"), nFT0CSim, nTPC); @@ -1381,28 +1397,28 @@ struct MeanPtFlucId { if (nFT0C != 0 && nFT0CSim != 0) hist.fill(HIST("Gen/h2_NFT0C_NFT0CSim"), nFT0CSim, nFT0C); - fillAnalysisHistos(nTPC, nFT0M, nChSim, q1ChSim, q2ChSim, q3ChSim, q4ChSim); - fillAnalysisHistos(nTPC, nFT0M, nPiSim, q1PiSim, q2PiSim, q3PiSim, q4PiSim); - fillAnalysisHistos(nTPC, nFT0M, nKaSim, q1KaSim, q2KaSim, q3KaSim, q4KaSim); - fillAnalysisHistos(nTPC, nFT0M, nPrSim, q1PrSim, q2PrSim, q3PrSim, q4PrSim); + fillAnalysisHistos(nTPC, nFT0M, nChSim, nChSim, q1ChSim, q2ChSim, q3ChSim, q4ChSim); + fillAnalysisHistos(nTPC, nFT0M, nPiSim, nPiSim, q1PiSim, q2PiSim, q3PiSim, q4PiSim); + fillAnalysisHistos(nTPC, nFT0M, nKaSim, nKaSim, q1KaSim, q2KaSim, q3KaSim, q4KaSim); + fillAnalysisHistos(nTPC, nFT0M, nPrSim, nPrSim, q1PrSim, q2PrSim, q3PrSim, q4PrSim); } if (nTPC > 0 && nCh > 0) - hist.fill(HIST("QA/after/h2_NTPC_NCh"), nTPC, nCh); + hist.fill(HIST("QA/after/h2_NTPC_NCh"), nTPC, nCh, wghtCh); if (nPi > 0 && nTPC > 0) - hist.fill(HIST("QA/after/h2_NTPC_NPi"), nTPC, nPi); + hist.fill(HIST("QA/after/h2_NTPC_NPi"), nTPC, nPi, wghtPi); if (nKa > 0 && nTPC > 0) - hist.fill(HIST("QA/after/h2_NTPC_NKa"), nTPC, nKa); + hist.fill(HIST("QA/after/h2_NTPC_NKa"), nTPC, nKa, wghtKa); if (nPr > 0 && nTPC > 0) - hist.fill(HIST("QA/after/h2_NTPC_NPr"), nTPC, nPr); + hist.fill(HIST("QA/after/h2_NTPC_NPr"), nTPC, nPr, wghtPr); - fillAnalysisHistos(nTPC, nFT0M, nCh, q1Ch, q2Ch, q3Ch, q4Ch); - fillAnalysisHistos(nTPC, nFT0M, nPi, q1Pi, q2Pi, q3Pi, q4Pi); - fillAnalysisHistos(nTPC, nFT0M, nKa, q1Ka, q2Ka, q3Ka, q4Ka); - fillAnalysisHistos(nTPC, nFT0M, nPr, q1Pr, q2Pr, q3Pr, q4Pr); + fillAnalysisHistos(nTPC, nFT0M, nCh, nChW, q1Ch, q2Ch, q3Ch, q4Ch); + fillAnalysisHistos(nTPC, nFT0M, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi); + fillAnalysisHistos(nTPC, nFT0M, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka); + fillAnalysisHistos(nTPC, nFT0M, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr); } void processRun3(MyRun3Collisions::iterator const& col, MyAllTracks const& tracks) From 3aa1adf6f7db1f98179630ebc2df2f0c91c6e69e Mon Sep 17 00:00:00 2001 From: Katarzyna <116073883+kgwizdzi@users.noreply.github.com> Date: Fri, 7 Mar 2025 05:52:02 +0100 Subject: [PATCH 0583/1650] [PWGCF] FemtoUniverse: D0 task update (#10370) --- .../Tasks/femtoUniversePairTaskTrackD0.cxx | 214 ++++++++++++++++-- 1 file changed, 193 insertions(+), 21 deletions(-) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx index 75d39bdf510..80fc4f54218 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx @@ -156,15 +156,21 @@ struct FemtoUniversePairTaskTrackD0 { /// Partitions for particle 2 /// Partition with all D0/D0bar mesons (which pass double mass hypothesis) - // Partition partsAllDmesons = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kD0)) && (aod::femtouniverseparticle::mLambda > 0.0f) && (aod::femtouniverseparticle::mAntiLambda > 0.0f); + Partition partsAllDmesons = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kD0)) && ((aod::femtouniverseparticle::mLambda > 0.0f) || (aod::femtouniverseparticle::mAntiLambda > 0.0f)); /// Partition with D0/D0bar candidates, which pass only one mass hypothesis Partition partsOnlyD0D0bar = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kD0)) && (aod::femtouniverseparticle::mLambda < 0.0f || aod::femtouniverseparticle::mAntiLambda < 0.0f) && (aod::femtouniverseparticle::tempFitVar < ConfMlOpt.confMaxProbMlClass1Bg) && (aod::femtouniverseparticle::decayVtxY > ConfMlOpt.confMinProbMlClass2Prompt); + /// Partition with D0 mesons only (one and double mass hypothesis) + Partition partsAllD0s = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kD0)) && (aod::femtouniverseparticle::mLambda > ConfDmesons.minInvMassD0D0barSignal) && (aod::femtouniverseparticle::mLambda < ConfDmesons.maxInvMassD0D0barSignal) && (aod::femtouniverseparticle::pt > ConfDmesons.confMinPtD0D0bar) && (aod::femtouniverseparticle::pt < ConfDmesons.confMaxPtD0D0bar); /// Partition with D0 mesons only (one mass hypothesis) Partition partsD0s = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kD0)) && (aod::femtouniverseparticle::mLambda > ConfDmesons.minInvMassD0D0barSignal) && (aod::femtouniverseparticle::mLambda < ConfDmesons.maxInvMassD0D0barSignal) && (aod::femtouniverseparticle::mAntiLambda < 0.0f) && (aod::femtouniverseparticle::pt > ConfDmesons.confMinPtD0D0bar) && (aod::femtouniverseparticle::pt < ConfDmesons.confMaxPtD0D0bar) && (aod::femtouniverseparticle::tempFitVar < ConfMlOpt.confMaxProbMlClass1Bg) && (aod::femtouniverseparticle::decayVtxY > ConfMlOpt.confMinProbMlClass2Prompt); - /// Partition with D0s selected from the side-band (SB) regions - Partition partsD0sFromSB = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kD0)) && ((aod::femtouniverseparticle::mLambda > ConfDmesons.minInvMassD0D0barLeftSB && aod::femtouniverseparticle::mLambda < ConfDmesons.maxInvMassD0D0barLeftSB) || (aod::femtouniverseparticle::mLambda > ConfDmesons.minInvMassD0D0barRightSB && aod::femtouniverseparticle::mLambda < ConfDmesons.maxInvMassD0D0barRightSB)) && (aod::femtouniverseparticle::mAntiLambda < 0.0f) && (aod::femtouniverseparticle::pt > ConfDmesons.confMinPtD0D0bar) && (aod::femtouniverseparticle::pt < ConfDmesons.confMaxPtD0D0bar) && (aod::femtouniverseparticle::tempFitVar < ConfMlOpt.confMaxProbMlClass1Bg) && (aod::femtouniverseparticle::decayVtxY > ConfMlOpt.confMinProbMlClass2Prompt); + /// Partition with D0s selected from the side-band (SB) regions (candidates with double mass hypothesis included) + Partition partsD0sFromSB = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kD0)) && ((aod::femtouniverseparticle::mLambda > ConfDmesons.minInvMassD0D0barLeftSB && aod::femtouniverseparticle::mLambda < ConfDmesons.maxInvMassD0D0barLeftSB) || (aod::femtouniverseparticle::mLambda > ConfDmesons.minInvMassD0D0barRightSB && aod::femtouniverseparticle::mLambda < ConfDmesons.maxInvMassD0D0barRightSB)) && (aod::femtouniverseparticle::pt > ConfDmesons.confMinPtD0D0bar) && (aod::femtouniverseparticle::pt < ConfDmesons.confMaxPtD0D0bar); + /// Partition with D0bar mesons only (one and double mass hypothesis) + Partition partsAllD0bars = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kD0)) && (aod::femtouniverseparticle::mAntiLambda > ConfDmesons.minInvMassD0D0barSignal) && (aod::femtouniverseparticle::mAntiLambda < ConfDmesons.maxInvMassD0D0barSignal) && (aod::femtouniverseparticle::pt > ConfDmesons.confMinPtD0D0bar) && (aod::femtouniverseparticle::pt < ConfDmesons.confMaxPtD0D0bar); /// Partition with D0bar mesons only (one mass hypothesis) Partition partsD0bars = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kD0)) && (aod::femtouniverseparticle::mLambda < 0.0f) && (aod::femtouniverseparticle::mAntiLambda > ConfDmesons.minInvMassD0D0barSignal) && (aod::femtouniverseparticle::mAntiLambda < ConfDmesons.maxInvMassD0D0barSignal) && (aod::femtouniverseparticle::pt > ConfDmesons.confMinPtD0D0bar) && (aod::femtouniverseparticle::pt < ConfDmesons.confMaxPtD0D0bar) && (aod::femtouniverseparticle::tempFitVar < ConfMlOpt.confMaxProbMlClass1Bg) && (aod::femtouniverseparticle::decayVtxY > ConfMlOpt.confMinProbMlClass2Prompt); + /// Partition with D0bars selected from the side-band (SB) regions (candidates with double mass hypothesis included) + Partition partsD0barsFromSB = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kD0)) && ((aod::femtouniverseparticle::mAntiLambda > ConfDmesons.minInvMassD0D0barLeftSB && aod::femtouniverseparticle::mAntiLambda < ConfDmesons.maxInvMassD0D0barLeftSB) || (aod::femtouniverseparticle::mAntiLambda > ConfDmesons.minInvMassD0D0barRightSB && aod::femtouniverseparticle::mAntiLambda < ConfDmesons.maxInvMassD0D0barRightSB)) && (aod::femtouniverseparticle::pt > ConfDmesons.confMinPtD0D0bar) && (aod::femtouniverseparticle::pt < ConfDmesons.confMaxPtD0D0bar); /// Partition for D0/D0bar mesons from MC Partition partsD0D0barMCReco = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kD0)) && (aod::femtouniverseparticle::mLambda < 0.0f || aod::femtouniverseparticle::mAntiLambda < 0.0f) && (aod::femtouniverseparticle::pt > ConfDmesons.confMinPtD0D0bar) && (aod::femtouniverseparticle::pt < ConfDmesons.confMaxPtD0D0bar) && (aod::femtouniverseparticle::tempFitVar < ConfMlOpt.confMaxProbMlClass1Bg) && (aod::femtouniverseparticle::decayVtxY > ConfMlOpt.confMinProbMlClass2Prompt); Partition partsD0D0barMCTruth = (aod::femtouniverseparticle::partType == static_cast(aod::femtouniverseparticle::ParticleType::kMCTruthTrack)) && (aod::femtouniverseparticle::pidCut == static_cast(ConfDmesons.confPDGCodeD0) || aod::femtouniverseparticle::pidCut == static_cast(ConfDmesons.confPDGCodeD0bar)) && (aod::femtouniverseparticle::pt > ConfDmesons.confMinPtD0D0bar) && (aod::femtouniverseparticle::pt < ConfDmesons.confMaxPtD0D0bar); @@ -419,12 +425,18 @@ struct FemtoUniversePairTaskTrackD0 { mcTruthRegistry.add("MCTruthD0D0bar", "MC Truth D0/D0bar;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{360, 0, 36}, {400, -1.0, 1.0}}}); mcTruthRegistry.add("MCTruthAllPositivePt", "MC Truth all positive;#it{p}_{T} (GeV/c); counts", {HistType::kTH1F, {{360, 0, 36}}}); mcTruthRegistry.add("MCTruthAllNegativePt", "MC Truth all negative;#it{p}_{T} (GeV/c); counts", {HistType::kTH1F, {{360, 0, 36}}}); - mcTruthRegistry.add("MCTruthKp", "MC Truth K+;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); - mcTruthRegistry.add("MCTruthKm", "MC Truth K-;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); - mcTruthRegistry.add("MCTruthPip", "MC Truth #pi+;#it{p}_{T} (GeV/c)", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); - mcTruthRegistry.add("MCTruthPim", "MC Truth #pi-;#it{p}_{T} (GeV/c)", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); - mcTruthRegistry.add("MCTruthProton", "MC Truth proton;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); - mcTruthRegistry.add("MCTruthAntiproton", "MC Truth antiproton;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + mcTruthRegistry.add("MCTruthKpPtVsEta", "MC Truth K+;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + mcTruthRegistry.add("MCTruthKmPtVsEta", "MC Truth K-;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + mcTruthRegistry.add("MCTruthPipPtVsEta", "MC Truth #pi+;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + mcTruthRegistry.add("MCTruthPimPtVsEta", "MC Truth #pi-;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + mcTruthRegistry.add("MCTruthProtonPtVsEta", "MC Truth proton;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + mcTruthRegistry.add("MCTruthAntiProtonPtVsEta", "MC Truth antiproton;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + mcTruthRegistry.add("MCTruthKpPt", "MC Truth K+;#it{p}_{T} (GeV/c); counts", {HistType::kTH1F, {{500, 0, 5}}}); + mcTruthRegistry.add("MCTruthKmPt", "MC Truth K-;#it{p}_{T} (GeV/c); counts", {HistType::kTH1F, {{500, 0, 5}}}); + mcTruthRegistry.add("MCTruthPipPt", "MC Truth #pi+;#it{p}_{T} (GeV/c); counts", {HistType::kTH1F, {{500, 0, 5}}}); + mcTruthRegistry.add("MCTruthPimPt", "MC Truth #pi-;#it{p}_{T} (GeV/c); counts", {HistType::kTH1F, {{500, 0, 5}}}); + mcTruthRegistry.add("MCTruthProtonPt", "MC Truth proton;#it{p}_{T} (GeV/c); counts", {HistType::kTH1F, {{500, 0, 5}}}); + mcTruthRegistry.add("MCTruthAntiProtonPt", "MC Truth antiproton;#it{p}_{T} (GeV/c); counts", {HistType::kTH1F, {{500, 0, 5}}}); trackHistoPartD0D0bar.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarInvMassBins, ConfBothTracks.confIsMC, ConfDmesons.confPDGCodeD0); if (!ConfTrack.confIsSame) { @@ -457,6 +469,9 @@ struct FemtoUniversePairTaskTrackD0 { registry.add("D0D0bar_oneMassHypo/hMassVsPtD0bar", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("D0D0bar_oneMassHypo/hMassVsPtD0Reflected", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("D0D0bar_oneMassHypo/hMassVsPtD0barReflected", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("D0D0bar_doubleMassHypo/hMassVsPt", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("D0D0bar_doubleMassHypo/hMassVsPtD0", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("D0D0bar_doubleMassHypo/hMassVsPtD0bar", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {confInvMassBins, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); // Histograms for BDT score classes' check registry.add("DebugBdt/hBdtScore1VsStatus", ";BDT score;status", {HistType::kTH2F, {axisBdtScore, axisSelStatus}}); registry.add("DebugBdt/hBdtScore2VsStatus", ";BDT score;status", {HistType::kTH2F, {axisBdtScore, axisSelStatus}}); @@ -624,8 +639,81 @@ struct FemtoUniversePairTaskTrackD0 { } PROCESS_SWITCH(FemtoUniversePairTaskTrackD0, processQAD0D0barSel, "Enable filling QA plots for selected D0/D0bar cand.", true); + void processAllDmesons(o2::aod::FdCollision const& col, FemtoFullParticles const&) + { + auto groupPartsAllD0D0barCands = partsAllDmesons->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + auto groupPartsD0D0barChildren = partsDmesonsChildren->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + + // loop over D0/D0bar mesons (ONLY) + for (auto const& d0d0bar : groupPartsAllD0D0barCands) { + + registry.fill(HIST("hPtD0D0bar"), d0d0bar.pt()); + registry.fill(HIST("hPhiDmesonCand"), d0d0bar.phi()); + registry.fill(HIST("hEtaDmesonCand"), d0d0bar.eta()); + // BDT score classes + registry.fill(HIST("DebugBdt/hBdtScore1VsStatus"), d0d0bar.decayVtxX(), 1); + registry.fill(HIST("DebugBdt/hBdtScore2VsStatus"), d0d0bar.decayVtxY(), 1); + registry.fill(HIST("DebugBdt/hBdtScore3VsStatus"), d0d0bar.decayVtxZ(), 1); + + if (d0d0bar.mLambda() > 0.0f) { + registry.fill(HIST("D0D0bar_doubleMassHypo/hMassVsPt"), d0d0bar.mLambda(), d0d0bar.pt()); + registry.fill(HIST("D0D0bar_doubleMassHypo/hMassVsPtD0"), d0d0bar.mLambda(), d0d0bar.pt()); + if (d0d0bar.mAntiLambda() < 0.0f) { + registry.fill(HIST("D0D0bar_oneMassHypo/hMassVsPt"), d0d0bar.mLambda(), d0d0bar.pt()); + registry.fill(HIST("D0D0bar_oneMassHypo/hMassVsPtD0"), d0d0bar.mLambda(), d0d0bar.pt()); + registry.fill(HIST("hPtD0"), d0d0bar.pt()); + registry.fill(HIST("hPhiD0"), d0d0bar.phi()); + registry.fill(HIST("hEtaD0"), d0d0bar.eta()); + } + } + if (d0d0bar.mAntiLambda() > 0.0f) { + registry.fill(HIST("D0D0bar_doubleMassHypo/hMassVsPt"), d0d0bar.mLambda(), d0d0bar.pt()); + registry.fill(HIST("D0D0bar_doubleMassHypo/hMassVsPtD0bar"), d0d0bar.mLambda(), d0d0bar.pt()); + if (d0d0bar.mLambda() < 0.0f) { + registry.fill(HIST("D0D0bar_oneMassHypo/hMassVsPt"), d0d0bar.mAntiLambda(), d0d0bar.pt()); + registry.fill(HIST("D0D0bar_oneMassHypo/hMassVsPtD0bar"), d0d0bar.mAntiLambda(), d0d0bar.pt()); + registry.fill(HIST("hPtD0bar"), d0d0bar.pt()); + registry.fill(HIST("hPhiD0bar"), d0d0bar.phi()); + registry.fill(HIST("hEtaD0bar"), d0d0bar.eta()); + } + } + } + + // loop over D mesons childen + for (auto const& daughD0D0bar : groupPartsD0D0barChildren) { + registry.fill(HIST("hPtDaughters"), daughD0D0bar.pt()); + registry.fill(HIST("hSignDaughters"), daughD0D0bar.mLambda()); + // filling QA plots for D0 mesons' positive daughters (K+) + if (daughD0D0bar.mLambda() == 1 && (daughD0D0bar.mAntiLambda() == 1 || daughD0D0bar.mAntiLambda() == 0)) { + qaRegistry.fill(HIST("D0_pos_daugh/pt"), daughD0D0bar.pt()); + qaRegistry.fill(HIST("D0_pos_daugh/eta"), daughD0D0bar.eta()); + qaRegistry.fill(HIST("D0_pos_daugh/phi"), daughD0D0bar.phi()); + } + // filling QA plots for D0 mesons' negative daughters (pi-) + if (daughD0D0bar.mLambda() == -1 && (daughD0D0bar.mAntiLambda() == 1 || daughD0D0bar.mAntiLambda() == 0)) { + qaRegistry.fill(HIST("D0_neg_daugh/pt"), daughD0D0bar.pt()); + qaRegistry.fill(HIST("D0_neg_daugh/eta"), daughD0D0bar.eta()); + qaRegistry.fill(HIST("D0_neg_daugh/phi"), daughD0D0bar.phi()); + } + // filling QA plots for D0bar mesons' positive daughters (pi+) + if (daughD0D0bar.mLambda() == 1 && (daughD0D0bar.mAntiLambda() == -1 || daughD0D0bar.mAntiLambda() == 0)) { + qaRegistry.fill(HIST("D0bar_pos_daugh/pt"), daughD0D0bar.pt()); + qaRegistry.fill(HIST("D0bar_pos_daugh/eta"), daughD0D0bar.eta()); + qaRegistry.fill(HIST("D0bar_pos_daugh/phi"), daughD0D0bar.phi()); + } + // filling QA plots for D0bar mesons' negative daughters (K-) + if (daughD0D0bar.mLambda() == -1 && (daughD0D0bar.mAntiLambda() == -1 || daughD0D0bar.mAntiLambda() == 0)) { + qaRegistry.fill(HIST("D0bar_neg_daugh/pt"), daughD0D0bar.pt()); + qaRegistry.fill(HIST("D0bar_neg_daugh/eta"), daughD0D0bar.eta()); + qaRegistry.fill(HIST("D0bar_neg_daugh/phi"), daughD0D0bar.phi()); + } + } + } + PROCESS_SWITCH(FemtoUniversePairTaskTrackD0, processAllDmesons, "Enable processing over all D meson candidates", false); + void processD0mesons(o2::aod::FdCollision const& col, FemtoFullParticles const&) { + auto groupPartsAllD0D0barCands = partsAllDmesons->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); auto groupPartsOnlyD0D0bar = partsOnlyD0D0bar->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); auto groupPartsD0D0barChildren = partsDmesonsChildren->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); @@ -765,11 +853,12 @@ struct FemtoUniversePairTaskTrackD0 { if (ConfEff.doEfficiencyCorr) { weight = efficiencyCalculator.getWeight(ParticleNo::ONE, track.pt()) * efficiencyCalculator.getWeight(ParticleNo::TWO, d0candidate.pt()); } - sameEventAngularCont.setPair(track, d0candidate, multCol, ConfBothTracks.confUse3D); + sameEventAngularCont.setPair(track, d0candidate, multCol, ConfBothTracks.confUse3D, weight); } } /// process function for to call doSameEvent with Data + /// call this process function if you need D0/D0bar candidates which pass only one mass hypothesis /// \param col subscribe to the collision table (Data) /// \param parts subscribe to the femtoUniverseParticleTable void processSameEvent(o2::aod::FdCollision const& col, @@ -794,6 +883,36 @@ struct FemtoUniversePairTaskTrackD0 { } PROCESS_SWITCH(FemtoUniversePairTaskTrackD0, processSameEvent, "Enable processing same event", true); + /// process function for to call doSameEvent with Data + /// call this process function to include candidates which pass as well the selection for both D0 and D0bar candidates + /// \param col subscribe to the collision table (Data) + /// \param parts subscribe to the femtoUniverseParticleTable + void processSameEventWithDoubleHypo(o2::aod::FdCollision const& col, + FemtoFullParticles const& parts) + { + fillCollision(col); + + auto thegroupPartsTrack = partsTrack->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + auto theGroupPartsD0s = partsAllD0s->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + auto theGroupPartsD0bars = partsAllD0bars->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + + switch (confChooseD0trackCorr) { + case 0: + doSameEvent(thegroupPartsTrack, theGroupPartsD0s, parts, col.magField(), col.multNtr()); + break; + case 1: + doSameEvent(thegroupPartsTrack, theGroupPartsD0bars, parts, col.magField(), col.multNtr()); + break; + default: + break; + } + } + PROCESS_SWITCH(FemtoUniversePairTaskTrackD0, processSameEventWithDoubleHypo, "Enable processing same event", false); + + /// process function for to call doSameEvent with Data + /// call this process to obtain the function for D0/D0bar candidates from side-band regions + /// \param col subscribe to the collision table (Data) + /// \param parts subscribe to the femtoUniverseParticleTable void processSameEventSB(o2::aod::FdCollision const& col, FemtoFullParticles const& parts) { fillCollision(col); @@ -803,7 +922,7 @@ struct FemtoUniversePairTaskTrackD0 { doSameEvent(groupPartsTrack, groupPartsD0sFromSB, parts, col.magField(), col.multNtr()); } - PROCESS_SWITCH(FemtoUniversePairTaskTrackD0, processSameEventSB, "Enable processing same event", true); + PROCESS_SWITCH(FemtoUniversePairTaskTrackD0, processSameEventSB, "Enable processing same event", false); /// process function for to call doSameEvent with Monte Carlo /// \param col subscribe to the collision table (Monte Carlo Reconstructed reconstructed) @@ -864,11 +983,12 @@ struct FemtoUniversePairTaskTrackD0 { weight = efficiencyCalculator.getWeight(ParticleNo::ONE, track.pt()) * efficiencyCalculator.getWeight(ParticleNo::TWO, d0candidate.pt()); } - mixedEventAngularCont.setPair(track, d0candidate, multCol, ConfBothTracks.confUse3D); + mixedEventAngularCont.setPair(track, d0candidate, multCol, ConfBothTracks.confUse3D, weight); } } /// process function for to call doMixedEvent with Data + /// call this process function if you need D0/D0bar candidates which pass only one mass hypothesis /// @param cols subscribe to the collisions table (Data) /// @param parts subscribe to the femtoUniverseParticleTable void processMixedEvent(o2::aod::FdCollisions const& cols, @@ -907,6 +1027,46 @@ struct FemtoUniversePairTaskTrackD0 { PROCESS_SWITCH(FemtoUniversePairTaskTrackD0, processMixedEvent, "Enable processing mixed events", true); /// process function for to call doMixedEvent with Data + /// call this process function to include candidates which pass as well the selection for both D0 and D0bar candidates + /// @param cols subscribe to the collisions table (Data) + /// @param parts subscribe to the femtoUniverseParticleTable + void processMixedEventWithDoubleHypo(o2::aod::FdCollisions const& cols, + FemtoFullParticles const& parts) + { + for (auto const& [collision1, collision2] : soa::selfCombinations(colBinning, confNEventsMix, -1, cols, cols)) { + + const int multiplicityCol = collision1.multNtr(); + mixQaRegistry.fill(HIST("MixingQA/hMECollisionBins"), colBinning.getBin({collision1.posZ(), multiplicityCol})); + + auto groupPartsTrack = partsTrack->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision2.globalIndex(), cache); + auto theGroupPartsD0s = partsAllD0s->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex(), cache); + auto theGroupPartsD0bars = partsAllD0bars->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex(), cache); + + const auto& magFieldTesla1 = collision1.magField(); + const auto& magFieldTesla2 = collision2.magField(); + + if (magFieldTesla1 != magFieldTesla2) { + continue; + } + /// \todo before mixing we should check whether both collisions contain a pair of particles! + // if (partsD0.size() == 0 || kNPart2Evt1 == 0 || kNPart1Evt2 == 0 || partsTrack.size() == 0 ) continue; + + switch (confChooseD0trackCorr) { + case 0: + doMixedEvent(groupPartsTrack, theGroupPartsD0s, parts, magFieldTesla1, multiplicityCol); + break; + case 1: + doMixedEvent(groupPartsTrack, theGroupPartsD0bars, parts, magFieldTesla1, multiplicityCol); + break; + default: + break; + } + } + } + PROCESS_SWITCH(FemtoUniversePairTaskTrackD0, processMixedEventWithDoubleHypo, "Enable processing mixed events", false); + + /// process function for to call doMixedEvent with Data + /// call this process to obtain the function for D0/D0bar candidates from side-band regions /// @param cols subscribe to the collisions table (Data) /// @param parts subscribe to the femtoUniverseParticleTable void processMixedEventSB(o2::aod::FdCollisions const& cols, FemtoFullParticles const& parts) @@ -985,27 +1145,39 @@ struct FemtoUniversePairTaskTrackD0 { if (pdgParticle->Charge() > 0.0) { mcTruthRegistry.fill(HIST("MCTruthAllPositivePt"), part.pt()); } + if (pdgCode == 211) { + mcTruthRegistry.fill(HIST("MCTruthPipPtVsEta"), part.pt(), part.eta()); + mcTruthRegistry.fill(HIST("MCTruthPipPt"), part.pt()); + } if (pdgCode == 321) { - // mcTruthRegistry.fill(HIST("MCtruthKp"), part.pt(), part.eta()); - // mcTruthRegistry.fill(HIST("MCtruthKpPt"), part.pt()); + mcTruthRegistry.fill(HIST("MCTruthKpPtVsEta"), part.pt(), part.eta()); + mcTruthRegistry.fill(HIST("MCTruthKpPt"), part.pt()); } - if (pdgCode == 333) { - // mcTruthRegistry.fill(HIST("MCtruthPhi"), part.pt(), part.eta()); - // continue; + if (pdgCode == 421) { + mcTruthRegistry.fill(HIST("MCTruthD0D0bar"), part.pt(), part.eta()); } if (pdgCode == 2212) { - // mcTruthRegistry.fill(HIST("MCtruthPpos"), part.pt(), part.eta()); + mcTruthRegistry.fill(HIST("MCTruthProtonPtVsEta"), part.pt(), part.eta()); + mcTruthRegistry.fill(HIST("MCTruthProtonPt"), part.pt()); } if (pdgParticle->Charge() < 0.0) { mcTruthRegistry.fill(HIST("MCTruthAllNegativePt"), part.pt()); } + if (pdgCode == -211) { + mcTruthRegistry.fill(HIST("MCTruthPimPtVsEta"), part.pt(), part.eta()); + mcTruthRegistry.fill(HIST("MCTruthPimPt"), part.pt()); + } if (pdgCode == -321) { - // mcTruthRegistry.fill(HIST("MCtruthKm"), part.pt(), part.eta()); - // mcTruthRegistry.fill(HIST("MCtruthKmPt"), part.pt()); + mcTruthRegistry.fill(HIST("MCTruthKmPtVsEta"), part.pt(), part.eta()); + mcTruthRegistry.fill(HIST("MCTruthKmPt"), part.pt()); + } + if (pdgCode == -421) { + mcTruthRegistry.fill(HIST("MCTruthD0D0bar"), part.pt(), part.eta()); } if (pdgCode == -2212) { - // mcTruthRegistry.fill(HIST("MCtruthPneg"), part.pt(), part.eta()); + mcTruthRegistry.fill(HIST("MCTruthAntiProtonPtVsEta"), part.pt(), part.eta()); + mcTruthRegistry.fill(HIST("MCTruthAntiProtonPt"), part.pt()); } } } From f2953c5e41541c70fc614cc3aa2f51b49363798a Mon Sep 17 00:00:00 2001 From: Lars <146946151+ljoergen@users.noreply.github.com> Date: Fri, 7 Mar 2025 09:18:06 +0100 Subject: [PATCH 0584/1650] [PWGLF] AngularCorrelationsInJets.cxx: added JTracks table (#10372) --- PWGLF/Tasks/Nuspex/AngularCorrelationsInJets.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/AngularCorrelationsInJets.cxx b/PWGLF/Tasks/Nuspex/AngularCorrelationsInJets.cxx index b70cc853e5c..b9cd9965a37 100644 --- a/PWGLF/Tasks/Nuspex/AngularCorrelationsInJets.cxx +++ b/PWGLF/Tasks/Nuspex/AngularCorrelationsInJets.cxx @@ -155,8 +155,8 @@ struct AngularCorrelationsInJets { aod::TracksDCA, aod::pidTPCFullPr, aod::pidTPCFullDe, aod::pidTPCFullHe, aod::pidTOFFullPr, aod::pidTOFFullDe, aod::pidTOFFullHe, aod::pidTOFbeta, aod::pidTPCEl, aod::pidTPCMu, aod::pidTPCPi, aod::pidTPCKa, aod::pidTPCTr, aod::pidTPCAl, aod::pidTOFPi, aod::pidTOFKa, aod::McTrackLabels>; using McTracksRun3 = soa::Join; - using JetMcTracks = soa::Join; - using JetTracksRun3 = soa::Join; + using JetMcTracks = soa::Join; + using JetTracksRun3 = soa::Join; using BCsWithRun2Info = soa::Join; using McCollisions = soa::Join; From 17324bfc0a67dd00563b0d5bcddf6e687319d8c7 Mon Sep 17 00:00:00 2001 From: Rrantu <156880782+Rrantu@users.noreply.github.com> Date: Fri, 7 Mar 2025 16:22:40 +0800 Subject: [PATCH 0585/1650] [PWGHF] fix missing histogram error (#10374) --- .../candidateCreatorXic0Omegac0.cxx | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx b/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx index f05479d03da..31f873a6e96 100644 --- a/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx +++ b/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx @@ -185,10 +185,10 @@ struct HfCandidateCreatorXic0Omegac0 { struct { float chi2GeoV0; float ldlV0; - float chi2TopoV0ToPv; + float chi2NdfTopoV0ToPv; float chi2GeoCasc; float ldlCasc; - float chi2TopoCascToPv; + float chi2NdfTopoCascToPv; float decayLenXYLambda; float decayLenXYCasc; float cosPaV0ToCasc; @@ -206,17 +206,17 @@ struct HfCandidateCreatorXic0Omegac0 { float rapXic; float massXic; float cosThetaStarPiFromXic; - float chi2TopoPiFromXicToPv; + float chi2NdfTopoPiFromXicToPv; float kfDcaXYPiFromXic; - float chi2TopoV0ToCasc; - float chi2TopoCascToXic; + float chi2NdfTopoV0ToCasc; + float chi2NdfTopoCascToXic; float decayLenXYXic; float chi2GeoXic; float kfDcaV0Dau; float kfDcaCascDau; float kfDcaXicDau; float kfDcaXYCascToPv; - float chi2TopoXicToPv; + float chi2NdfTopoXicToPv; float cosPaXicToPv; float cosPaXYXicToPv; float ldlXic; @@ -1478,14 +1478,14 @@ struct HfCandidateCreatorXic0Omegac0 { auto cascChi2OverNdfm = kfXic0Candidate.chi2MassCasc / cascNdfm; // KF topo Chi2 - kfXic0Candidate.chi2TopoV0ToPv = kfV0ToPv.GetChi2(); - kfXic0Candidate.chi2TopoCascToPv = kfXiToPv.GetChi2(); - kfXic0Candidate.chi2TopoPiFromXicToPv = kfPiFromXicToPv.GetChi2(); - kfXic0Candidate.chi2TopoXicToPv = kfXic0ToPv.GetChi2(); + kfXic0Candidate.chi2NdfTopoV0ToPv = kfV0ToPv.GetChi2() / kfV0ToPv.GetNDF(); + kfXic0Candidate.chi2NdfTopoCascToPv = kfXiToPv.GetChi2() / kfXiToPv.GetNDF(); + kfXic0Candidate.chi2NdfTopoPiFromXicToPv = kfPiFromXicToPv.GetChi2() / kfPiFromXicToPv.GetNDF(); + kfXic0Candidate.chi2NdfTopoXicToPv = kfXic0ToPv.GetChi2() / kfXic0ToPv.GetNDF(); auto cascBachTopoChi2 = kfBachPionToXi.GetChi2(); - kfXic0Candidate.chi2TopoV0ToCasc = kfV0ToCasc.GetChi2(); - kfXic0Candidate.chi2TopoCascToXic = kfXiToXiC.GetChi2(); + kfXic0Candidate.chi2NdfTopoV0ToCasc = kfV0ToCasc.GetChi2() / kfV0ToCasc.GetNDF(); + kfXic0Candidate.chi2NdfTopoCascToXic = kfXiToXiC.GetChi2() / kfXiToXiC.GetNDF(); // KF ldl kfXic0Candidate.ldlV0 = ldlFromKF(kfV0, kfPV); @@ -1550,11 +1550,12 @@ struct HfCandidateCreatorXic0Omegac0 { // fill KF hist registry.fill(HIST("hKFParticleCascBachTopoChi2"), cascBachTopoChi2); - registry.fill(HIST("hKFParticleV0TopoChi2"), kfXic0Candidate.chi2TopoV0ToCasc); - registry.fill(HIST("hKFParticleCascTopoChi2"), kfXic0Candidate.chi2TopoCascToXic); + registry.fill(HIST("hKFParticleV0TopoChi2"), kfXic0Candidate.chi2NdfTopoV0ToCasc); + registry.fill(HIST("hKFParticleCascTopoChi2"), kfXic0Candidate.chi2NdfTopoCascToXic); registry.fill(HIST("hKFParticleDcaCharmBaryonDau"), kfXic0Candidate.kfDcaXicDau); registry.fill(HIST("hKFParticleDcaXYCascBachToPv"), dcaxyCascBachelor); - registry.fill(HIST("hKFParticleDcaXYV0DauToPv"), dcaxyV0Dau0); + registry.fill(HIST("hKFParticleDcaXYV0DauPosToPv"), dcaxyV0Dau0); + registry.fill(HIST("hKFParticleDcaXYV0DauNegToPv"), dcaxyV0Dau1); registry.fill(HIST("hKfLambda_ldl"), kfXic0Candidate.ldlV0); registry.fill(HIST("hKfXi_ldl"), kfXic0Candidate.ldlCasc); registry.fill(HIST("hKfXiC0_ldl"), kfXic0Candidate.ldlXic); @@ -1592,8 +1593,8 @@ struct HfCandidateCreatorXic0Omegac0 { kfXic0Candidate.kfDcaXYPiFromXic, kfXic0Candidate.kfDcaXYCascToPv, kfXic0Candidate.chi2GeoV0, kfXic0Candidate.chi2GeoCasc, kfXic0Candidate.chi2GeoXic, kfXic0Candidate.chi2MassV0, kfXic0Candidate.chi2MassCasc, kfXic0Candidate.ldlV0, kfXic0Candidate.ldlCasc, kfXic0Candidate.ldlXic, - kfXic0Candidate.chi2TopoV0ToPv, kfXic0Candidate.chi2TopoCascToPv, kfXic0Candidate.chi2TopoPiFromXicToPv, kfXic0Candidate.chi2TopoXicToPv, - kfXic0Candidate.chi2TopoV0ToCasc, kfXic0Candidate.chi2TopoCascToXic, + kfXic0Candidate.chi2NdfTopoV0ToPv, kfXic0Candidate.chi2NdfTopoCascToPv, kfXic0Candidate.chi2NdfTopoPiFromXicToPv, kfXic0Candidate.chi2NdfTopoXicToPv, + kfXic0Candidate.chi2NdfTopoV0ToCasc, kfXic0Candidate.chi2NdfTopoCascToXic, kfXic0Candidate.decayLenXYLambda, kfXic0Candidate.decayLenXYCasc, kfXic0Candidate.decayLenXYXic, kfXic0Candidate.cosPaV0ToCasc, kfXic0Candidate.cosPaCascToXic, kfXic0Candidate.cosPaXYV0ToCasc, kfXic0Candidate.cosPaXYCascToXic, kfXic0Candidate.rapXic, kfXic0Candidate.ptPiFromXic, kfXic0Candidate.ptXic, From 1bbac9c6edf6a6f16055966ea9a0f56b5bb9591b Mon Sep 17 00:00:00 2001 From: suyoupeng <109774812+15071832337@users.noreply.github.com> Date: Fri, 7 Mar 2025 16:40:07 +0800 Subject: [PATCH 0586/1650] [PWGLF] Lambda local polarization induced by jet in pp collision 13.6 TeV (#10357) --- .../Strangeness/lambdaJetpolarization.cxx | 58 +++++++++++++------ 1 file changed, 41 insertions(+), 17 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx b/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx index fbb866af8d4..89851c88af7 100644 --- a/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx +++ b/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx @@ -45,6 +45,7 @@ struct LfMyV0s { const AxisSpec axisPz{100, -10, 10, "#pz (GeV/c)"}; const AxisSpec axisPT{200, 0, 50, "#p_{T} (GeV/c)"}; const AxisSpec axisPhi{100, -3.14, 3.14, "#Phi"}; + const AxisSpec axisMass{100, 0, 2, "Mass(GeV/c^{2})"}; registry.add("hMassLambda", "hMassLambda", {HistType::kTH1F, {{200, 0.9f, 1.2f}}}); registry.add("V0pTInLab", "V0pTInLab", kTH1F, {axisPT}); @@ -76,6 +77,7 @@ struct LfMyV0s { registry.add("V0protonpxInRest_frame", "V0protonpxInRest_frame", kTH1F, {axisPx}); registry.add("V0protonpyInRest_frame", "V0protonpyInRest_frame", kTH1F, {axisPy}); registry.add("V0protonpzInRest_frame", "V0protonpzInRest_frame", kTH1F, {axisPz}); + registry.add("V0protonMassInRest_frame", "V0protonMassInRest_frame", kTH1F, {axisMass}); registry.add("V0protonphiInRest_frame", "V0protonphiInRest_frame", kTH1F, {axisPhi}); registry.add("V0protonpxInJetV0frame", "V0protonpxInJetV0frame", kTH1F, {axisPx}); @@ -83,6 +85,10 @@ struct LfMyV0s { registry.add("V0protonpzInJetV0frame", "V0protonpzInJetV0frame", kTH1F, {axisPz}); registry.add("V0protonphiInJetV0frame", "V0protonphiInJetV0frame", kTH1F, {axisPhi}); + registry.add("V0LambdapxInJetV0frame", "V0LambdapxInJetV0frame", kTH1F, {axisPx}); + registry.add("V0LambdapyInJetV0frame", "V0LambdapyInJetV0frame", kTH1F, {axisPy}); + registry.add("V0LambdapzInJetV0frame", "V0LambdapzInJetV0frame", kTH1F, {axisPz}); + registry.add("hLambdamassandSinPhi", "hLambdamassandSinPhi", kTH2F, {{200, 0.9, 1.2}, {200, -1, 1}}); registry.add("profile", "Invariant Mass vs sin(phi)", {HistType::kTProfile, {{200, 0.9, 1.2}}}); } @@ -120,11 +126,12 @@ struct LfMyV0s { TVector3 UnitZ(0.0, 0.0, 1.0); TVector3 JetP(Jetpx, Jetpy, Jetpz); TVector3 V0LambdaP(Lambdapx, Lambdapy, Lambdapz); - TVector3 JetCrossV0 = (JetP.Cross(V0LambdaP)); - TVector3 YinJet = (JetCrossV0).Cross(JetP); - TVector3 UnitXInJet = YinJet.Unit(); - TVector3 UnitYInJet = JetCrossV0.Unit(); - TVector3 UnitZInJet = JetP.Unit(); + TVector3 vortex_y = (JetP.Cross(V0LambdaP)); + + TVector3 z_hat = JetP.Unit(); + TVector3 y_hat = vortex_y.Unit(); + TVector3 x_hat1 = y_hat.Cross(z_hat); + TVector3 x_hat = x_hat1.Unit(); TMatrixD matrixLabToJet(4, 4); matrixLabToJet(0, 0) = 1; @@ -132,17 +139,17 @@ struct LfMyV0s { matrixLabToJet(0, 2) = 0.0; matrixLabToJet(0, 3) = 0.0; matrixLabToJet(1, 0) = 0.0; - matrixLabToJet(1, 1) = UnitXInJet * UnitX; - matrixLabToJet(1, 2) = UnitXInJet * UnitY; - matrixLabToJet(1, 3) = UnitXInJet * UnitZ; + matrixLabToJet(1, 1) = x_hat.X(); + matrixLabToJet(1, 2) = x_hat.Y(); + matrixLabToJet(1, 3) = x_hat.Z(); matrixLabToJet(2, 0) = 0.0; - matrixLabToJet(2, 1) = UnitYInJet * UnitX; - matrixLabToJet(2, 2) = UnitYInJet * UnitY; - matrixLabToJet(2, 3) = UnitYInJet * UnitZ; + matrixLabToJet(2, 1) = y_hat.X(); + matrixLabToJet(2, 2) = y_hat.Y(); + matrixLabToJet(2, 3) = y_hat.Z(); matrixLabToJet(3, 0) = 0.0; - matrixLabToJet(3, 1) = UnitZInJet * UnitX; - matrixLabToJet(3, 2) = UnitZInJet * UnitY; - matrixLabToJet(3, 3) = UnitZInJet * UnitZ; + matrixLabToJet(3, 1) = z_hat.X(); + matrixLabToJet(3, 2) = z_hat.Y(); + matrixLabToJet(3, 3) = z_hat.Z(); return matrixLabToJet; } // aod::MyCollision const& collision @@ -184,6 +191,8 @@ struct LfMyV0s { pLabproton(3, 0) = candidate.v0protonpz(); TMatrixD protonInV0(4, 1); protonInV0 = LorentzTransInV0frame(ELambda, candidate.v0px(), candidate.v0py(), candidate.v0pz()) * pLabproton; + double protonMassInV0 = sqrt(protonInV0(0, 0) * protonInV0(0, 0) - protonInV0(1, 0) * protonInV0(1, 0) - protonInV0(2, 0) * protonInV0(2, 0) - protonInV0(3, 0) * protonInV0(3, 0)); + registry.fill(HIST("V0protonMassInRest_frame"), protonMassInV0); registry.fill(HIST("V0protonpxInRest_frame"), protonInV0(1, 0)); registry.fill(HIST("V0protonpyInRest_frame"), protonInV0(2, 0)); registry.fill(HIST("V0protonpzInRest_frame"), protonInV0(3, 0)); @@ -201,7 +210,6 @@ struct LfMyV0s { PROCESS_SWITCH(LfMyV0s, processJetV0Analysis, "processJetV0Analysis", true); void processLeadingJetV0Analysis(aod::MyTable const& myv0s, aod::MyTableLeadingJet const& myleadingJets) { - // for (auto& LeadingJet : myleadingJets) { int V0Numbers = 0; double protonsinPhiInJetV0frame = 0; @@ -210,14 +218,30 @@ struct LfMyV0s { V0Numbers = V0Numbers + 1; double PLambda = sqrt(candidate.v0px() * candidate.v0px() + candidate.v0py() * candidate.v0py() + candidate.v0pz() * candidate.v0pz()); double ELambda = sqrt(candidate.v0Lambdamass() * candidate.v0Lambdamass() + PLambda * PLambda); - TMatrixD pLabproton(4, 1); double protonE = sqrt(massPr * massPr + candidate.v0protonpx() * candidate.v0protonpx() + candidate.v0protonpy() * candidate.v0protonpy() + candidate.v0protonpz() * candidate.v0protonpz()); + + TMatrixD pLabV0(4, 1); + pLabV0(0, 0) = ELambda; + pLabV0(1, 0) = candidate.v0px(); + pLabV0(2, 0) = candidate.v0py(); + pLabV0(3, 0) = candidate.v0pz(); + + TMatrixD lambdaInJet(4, 1); + lambdaInJet = MyTMatrixTranslationToJet(LeadingJet.leadingjetpx(), LeadingJet.leadingjetpy(), LeadingJet.leadingjetpz(), candidate.v0px(), candidate.v0py(), candidate.v0pz()) * pLabV0; + + TMatrixD lambdaInJetV0(4, 1); + lambdaInJetV0 = LorentzTransInV0frame(ELambda, lambdaInJet(1, 0), lambdaInJet(2, 0), lambdaInJet(3, 0)) * MyTMatrixTranslationToJet(LeadingJet.leadingjetpx(), LeadingJet.leadingjetpy(), LeadingJet.leadingjetpz(), candidate.v0px(), candidate.v0py(), candidate.v0pz()) * pLabV0; + registry.fill(HIST("V0LambdapxInJetV0frame"), lambdaInJetV0(1, 0)); + registry.fill(HIST("V0LambdapyInJetV0frame"), lambdaInJetV0(2, 0)); + registry.fill(HIST("V0LambdapzInJetV0frame"), lambdaInJetV0(3, 0)); + + TMatrixD pLabproton(4, 1); pLabproton(0, 0) = protonE; pLabproton(1, 0) = candidate.v0protonpx(); pLabproton(2, 0) = candidate.v0protonpy(); pLabproton(3, 0) = candidate.v0protonpz(); TMatrixD protonInJetV0(4, 1); - protonInJetV0 = LorentzTransInV0frame(ELambda, candidate.v0px(), candidate.v0py(), candidate.v0pz()) * MyTMatrixTranslationToJet(LeadingJet.leadingjetpx(), LeadingJet.leadingjetpy(), LeadingJet.leadingjetpz(), candidate.v0px(), candidate.v0py(), candidate.v0pz()) * pLabproton; + protonInJetV0 = LorentzTransInV0frame(ELambda, lambdaInJet(1, 0), lambdaInJet(2, 0), lambdaInJet(3, 0)) * MyTMatrixTranslationToJet(LeadingJet.leadingjetpx(), LeadingJet.leadingjetpy(), LeadingJet.leadingjetpz(), candidate.v0px(), candidate.v0py(), candidate.v0pz()) * pLabproton; registry.fill(HIST("V0protonpxInJetV0frame"), protonInJetV0(1, 0)); registry.fill(HIST("V0protonpyInJetV0frame"), protonInJetV0(2, 0)); registry.fill(HIST("V0protonpzInJetV0frame"), protonInJetV0(3, 0)); From 7c988304e2902888ad3a2ede234a5d9da021f5d4 Mon Sep 17 00:00:00 2001 From: nkaratze Date: Fri, 7 Mar 2025 09:34:32 +0000 Subject: [PATCH 0587/1650] [PWGLF] v0ptinvmass task Added feedown matrix, generated Pt Spectrums and corrections (#10363) --- PWGLF/Tasks/Strangeness/v0ptinvmassplots.cxx | 443 +++++++++++-------- 1 file changed, 254 insertions(+), 189 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/v0ptinvmassplots.cxx b/PWGLF/Tasks/Strangeness/v0ptinvmassplots.cxx index 23b488aa347..517ac9e6ead 100644 --- a/PWGLF/Tasks/Strangeness/v0ptinvmassplots.cxx +++ b/PWGLF/Tasks/Strangeness/v0ptinvmassplots.cxx @@ -15,10 +15,10 @@ /// \author Roman Lietava (roman.lietava@cern.ch) /*Description -This task creates 20 histograms that are filled with the V0 invariant mass under the K0, Lambda and Antilambda mass assumption -for different pt ranges (constituting bins), so 3x20=60 plots.The values are inserted as configurable strings for convinience. -Plots of the invariant masses at different stages of the analysis (ex. before and after the V0 cuts are enforced) and some pt distributions. -This analysis includes two processes, one for Real Data and one for MC Data switchable at the end of the code, only run one at a time*/ +This task creates up to 30 histograms that are filled with the V0 invariant mass under the K0, Lambda and Antilambda mass assumption +for different pt ranges (constituting bins). The values are inserted as configurable strings for convinience. +Also feed-down matrices for the Lambda and Anti-Lambda are produced. +This analysis includes three processes, one for Real Data and two for MC at the Generated and Reconstructed level*/ #include #include @@ -34,13 +34,12 @@ This analysis includes two processes, one for Real Data and one for MC Data swit // namespace to be used for pt plots and bins namespace pthistos { -constexpr uint32_t NSIZE = 30; -std::shared_ptr kaonPt[NSIZE]; -static std::vector kaonptbins; -std::shared_ptr lambdaPt[NSIZE]; +std::vector> kaonPt; +static std::vector kaonPtBins; +std::vector> lambdaPt; static std::vector lambdaPtBins; -std::shared_ptr antiLambdaPt[NSIZE]; -static std::vector antiLambdaPtBins; +std::vector> antilambdaPt; +static std::vector antilambdaPtBins; } // namespace pthistos using namespace o2; using namespace o2::framework; @@ -52,12 +51,12 @@ struct V0PtInvMassPlots { HistogramRegistry rKaonshMassPlotsPerPtBin{"KaonshMassPlotsPerPtBin", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry rLambdaMassPlotsPerPtBin{"LambdaMassPlotsPerPtBin", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry rAntilambdaMassPlotsPerPtBin{"AntilambdaMassPlotsPerPtBin", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry rFeeddownMatrices{"FeeddownMatrices", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; // Configurable for histograms Configurable nBins{"nBins", 100, "N bins in all histos"}; - Configurable xaxisGenBins{"xaxisGenBins", pthistos::NSIZE, "Number of bins for Generated Pt Spectrum"}; // is nSIZE ok - Configurable xaxisMinGenBin{"xaxisMinGenBin", 0.0, "Minimum bin value of the Generated Pt Spectrum Plot"}; - Configurable xaxisMaxGenBin{"xaxisMaxGenBin", 3.0, "Maximum bin value of the Generated Pt Spectrum Plot"}; + Configurable nBinsArmenteros{"nBinsArmenteros", 500, "N bins in Armenteros histos"}; + Configurable nmaxHistograms{"nmaxHistograms", 20, "N Pt Histograms"}; // Configurables for Cuts Configurable cutZVertex{"cutZVertex", 10.0f, "Accepted z-vertex range (cm)"}; @@ -65,26 +64,27 @@ struct V0PtInvMassPlots { Configurable nSigmaTPCProton{"nSigmaTPCProton", 4, "nSigmaTPCProton"}; Configurable compv0masscut{"compv0masscut", 0.01, "CompetitiveV0masscut (GeV)"}; Configurable etadau{"etadau", 0.8, "Eta Daughters"}; + Configurable rapiditycutGen{"rapiditycutGen", 0.5, "V0 Rapidity Window GenMC"}; // Configurable Kaonsh Topological Cuts (best cuts determined by v0topologicalcuts task) - Configurable kaonshSettingdcav0dau{"kaonshSettingdcav0dau", 100.0, "DCA V0 Daughters"}; + Configurable kaonshSettingdcav0dau{"kaonshSettingdcav0dau", 0.3, "DCA V0 Daughters"}; Configurable kaonshSettingdcapostopv{"kaonshSettingdcapostopv", 0.05, "DCA Pos To PV"}; Configurable kaonshSettingdcanegtopv{"kaonshSettingdcanegtopv", 0.05, "DCA Neg To PV"}; - Configurable kaonshSettingcosPA{"kaonshSettingcosPA", 0.50, "V0 CosPA"}; // double -> N.B. dcos(x)/dx = 0 at x=0 + Configurable kaonshSettingcosPA{"kaonshSettingcosPA", 0.98, "V0 CosPA"}; // double -> N.B. dcos(x)/dx = 0 at x=0 Configurable kaonshSettingradius{"kaonshSettingradius", 0.50, "v0radius"}; // Configurable Lambda Topological Cuts (best cuts determined by v0topologicalcuts task) - Configurable lambdaSettingdcav0dau{"lambdaSettingdcav0dau", 100.0, "DCA V0 Daughters"}; + Configurable lambdaSettingdcav0dau{"lambdaSettingdcav0dau", 0.3, "DCA V0 Daughters"}; Configurable lambdaSettingdcapostopv{"lambdaSettingdcapostopv", 0.05, "DCA Pos To PV"}; - Configurable lambdaSettingdcanegtopv{"lambdaSettingdcanegtopv", 0.05, "DCA Neg To PV"}; - Configurable lambdaSettingcosPA{"lambdaSettingcosPA", 0.50, "V0 CosPA"}; // double -> N.B. dcos(x)/dx = 0 at x=0 + Configurable lambdaSettingdcanegtopv{"lambdaSettingdcanegtopv", 0.09, "DCA Neg To PV"}; + Configurable lambdaSettingcosPA{"lambdaSettingcosPA", 0.98, "V0 CosPA"}; // double -> N.B. dcos(x)/dx = 0 at x=0 Configurable lambdaSettingradius{"lambdaSettingradius", 0.50, "v0radius"}; // Configurable Antilambda Topological Cuts (best cuts determined by v0topologicalcuts task) - Configurable antilambdaSettingdcav0dau{"antilambdaSettingdcav0dau", 100.0, "DCA V0 Daughters"}; - Configurable antilambdaSettingdcapostopv{"antilambdaSettingdcapostopv", 0.05, "DCA Pos To PV"}; + Configurable antilambdaSettingdcav0dau{"antilambdaSettingdcav0dau", 0.3, "DCA V0 Daughters"}; + Configurable antilambdaSettingdcapostopv{"antilambdaSettingdcapostopv", 0.09, "DCA Pos To PV"}; Configurable antilambdaSettingdcanegtopv{"antilambdaSettingdcanegtopv", 0.05, "DCA Neg To PV"}; - Configurable antilambdaSettingcosPA{"antilambdaSettingcosPA", 0.50, "V0 CosPA"}; // double -> N.B. dcos(x)/dx = 0 at x=0 + Configurable antilambdaSettingcosPA{"antilambdaSettingcosPA", 0.98, "V0 CosPA"}; // double -> N.B. dcos(x)/dx = 0 at x=0 Configurable antilambdaSettingradius{"antilambdaSettingradius", 0.50, "v0radius"}; // Configurables for Specific V0s analysis @@ -93,88 +93,132 @@ struct V0PtInvMassPlots { Configurable antiLambdaAnalysis{"antiLambdaAnalysis", true, "Enable Antilambda Pt Analysis"}; // Configurable string for Different Pt Bins - Configurable kzeroSettingPtBinsString{"kzeroSettingPtBinsString", {"0_0,0_15,0_3,0_45,0_6,0_75,0_9,1_05,1_2,1_35,1_5,1_65,1_8,1_95,2_1,2_25,2_4,2_55,2_7,2_85,3_0"}, "Kzero Pt Bin Values"}; - Configurable lambdaSettingPtBinsString{"lambdaSettingPtBinsString", {"0_0,0_15,0_3,0_45,0_6,0_75,0_9,1_05,1_2,1_35,1_5,1_65,1_8,1_95,2_1,2_25,2_4,2_55,2_7,2_85,3_0"}, "Lambda Pt Bin Values"}; - Configurable antilambdaSettingPtBinsString{"antilambdaSettingPtBinsString", {"0_0,0_15,0_3,0_45,0_6,0_75,0_9,1_05,1_2,1_35,1_5,1_65,1_8,1_95,2_1,2_25,2_4,2_55,2_7,2_85,3_0"}, "Antilambda Pt Bin Values"}; + Configurable kzeroSettingPtBinsString{"kzeroSettingPtBinsString", {"0.0,0.15,0.3,0.45,0.6,0.75,0.9,1.05,1.2,1.35,1.5,1.65,1.8,1.95,2.1,2.25,2.4,2.55,2.7,2.85,3.0"}, "Kzero Pt Bin Values"}; + Configurable lambdaSettingPtBinsString{"lambdaSettingPtBinsString", {"0.0,0.15,0.3,0.45,0.6,0.75,0.9,1.05,1.2,1.35,1.5,1.65,1.8,1.95,2.1,2.25,2.4,2.55,2.7,2.85,3.0"}, "Lambda Pt Bin Values"}; + Configurable antilambdaSettingPtBinsString{"antilambdaSettingPtBinsString", {"0.0,0.15,0.3,0.45,0.6,0.75,0.9,1.05,1.2,1.35,1.5,1.65,1.8,1.95,2.1,2.25,2.4,2.55,2.7,2.85,3.0"}, "Antilambda Pt Bin Values"}; void init(InitContext const&) { + pthistos::kaonPt.resize(nmaxHistograms); // number of Kaon Pt histograms to expect + pthistos::lambdaPt.resize(nmaxHistograms); // number of Lambda histograms to expect + pthistos::antilambdaPt.resize(nmaxHistograms); // number of Antilambda histograms to expect + // tokenise strings into individual values + pthistos::kaonPtBins = o2::utils::Str::tokenize(kzeroSettingPtBinsString, ','); + pthistos::lambdaPtBins = o2::utils::Str::tokenize(lambdaSettingPtBinsString, ','); + pthistos::antilambdaPtBins = o2::utils::Str::tokenize(antilambdaSettingPtBinsString, ','); + + // initialize and convert tokenized strings into vector of doubles for AxisSpec + std::vector kaonptedgevalues(nmaxHistograms + 1); + std::vector lambdaptedgevalues(nmaxHistograms + 1); + std::vector antilambdaPtedgevalues(nmaxHistograms + 1); + for (int i = 0; i < nmaxHistograms + 1; i++) { + kaonptedgevalues[i] = std::stod(pthistos::kaonPtBins[i]); + lambdaptedgevalues[i] = std::stod(pthistos::lambdaPtBins[i]); + antilambdaPtedgevalues[i] = std::stod(pthistos::antilambdaPtBins[i]); + } + // Axes AxisSpec k0ShortMassAxis = {nBins, 0.45f, 0.55f, "#it{M} #pi^{+}#pi^{-} [GeV/#it{c}^{2}]"}; AxisSpec lambdaMassAxis = {nBins, 1.085f, 1.145f, "#it{M} p^{+}#pi^{-} [GeV/#it{c}^{2}]"}; AxisSpec antiLambdaMassAxis = {nBins, 1.085f, 1.145f, "#it{M} p^{-}#pi^{+} [GeV/#it{c}^{2}]"}; - AxisSpec ptAxis = {nBins, 0.0f, 10.0f, "#it{p}_{T} (GeV/#it{c})"}; - AxisSpec armenterosQtAxis = {nBins, 0.0f, 0.3f, "#it{p}_{T} (GeV/#it{c})"}; - AxisSpec genPtAxis = {xaxisGenBins, xaxisMinGenBin, xaxisMaxGenBin, "#it{p}_{T} (GeV/#it{c})"}; - AxisSpec vertexZAxis = {nBins, -15., 15., "vrtx_{Z} [cm]"}; + AxisSpec k0ShortPtAxis = {kaonptedgevalues, "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec lambdaPtAxis = {lambdaptedgevalues, "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec antilambdaPtAxis = {antilambdaPtedgevalues, "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec armenterosQtAxis = {nBinsArmenteros, 0.0f, 0.3f, "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec armenterosasymAxis = {nBinsArmenteros, -1.f, 1.f, "#ait{p}^{+}_{||}-it{p}^{-}_{||}/it{p}^{+}_{||}+it{p}^{-}_{||}"}; + AxisSpec vertexZAxis = {nBins, -10.0f, 10.0f, "vrtx_{Z} [cm]"}; + + std::vector kaonhistvalue(nmaxHistograms + 1); + std::vector lambdahistvalue(nmaxHistograms + 1); + std::vector antilambdahistvalue(nmaxHistograms + 1); + // K0short Histogram Pt Bin Edges + for (int i = 0; i < nmaxHistograms + 1; i++) { // Histos won't accept "." character so converting it to "_" + std::string kaonptbin = pthistos::kaonPtBins[i]; // getting the value of the bin edge + size_t pos = kaonptbin.find("."); // finding the "." character + kaonptbin[pos] = '_'; // changing the "." character of thestring-value to a "_" + kaonhistvalue[i] = kaonptbin; // filling bin edges list + } + // Lambda Histograms Pt Bin Edges (same as K0s above) + for (int i = 0; i < nmaxHistograms + 1; i++) { + std::string lambdaptbin = pthistos::lambdaPtBins[i]; + size_t pos = lambdaptbin.find("."); + lambdaptbin[pos] = '_'; + lambdahistvalue[i] = lambdaptbin; + } + // AntiLambda Histograms Pt Bin Edges (same as K0s above) + for (int i = 0; i < nmaxHistograms + 1; i++) { + std::string antilambdaPtbin = pthistos::antilambdaPtBins[i]; + size_t pos = antilambdaPtbin.find("."); + antilambdaPtbin[pos] = '_'; + antilambdahistvalue[i] = antilambdaPtbin; + } - rPtAnalysis.add("hV0PtAll", "hV0PtAll", {HistType::kTH1F, {{nBins, 0.0f, 10.0f}}}); rPtAnalysis.add("hVertexZRec", "hVertexZRec", {HistType::kTH1F, {vertexZAxis}}); - rPtAnalysis.add("hArmenterosPodolanskiPlot", "hArmenterosPodolanskiPlot", {HistType::kTH2F, {{500, -1.f, 1.f}, {armenterosQtAxis}}}); + rPtAnalysis.add("hArmenterosPodolanskiPlot", "hArmenterosPodolanskiPlot", {HistType::kTH2F, {{armenterosasymAxis}, {armenterosQtAxis}}}); rPtAnalysis.add("hV0EtaDaughters", "hV0EtaDaughters", {HistType::kTH1F, {{nBins, -1.2f, 1.2f}}}); + // Generated Pt Spectrums For Feeddown + rPtAnalysis.add("hXiMinusGeneratedPtSpectrum", "hXiMinusGeneratedPtSpectrum", {HistType::kTH1F, {lambdaPtAxis}}); + rPtAnalysis.add("hXiZeroGeneratedPtSpectrum", "hXiZeroGeneratedPtSpectrum", {HistType::kTH1F, {lambdaPtAxis}}); + rPtAnalysis.add("hOmegaGeneratedPtSpectrum", "hOmegaGeneratedPtSpectrum", {HistType::kTH1F, {lambdaPtAxis}}); + rPtAnalysis.add("hXiPlusGeneratedPtSpectrum", "hXiPlusGeneratedPtSpectrum", {HistType::kTH1F, {antilambdaPtAxis}}); + rPtAnalysis.add("hAntiXiZeroGeneratedPtSpectrum", "hAntiXiZeroGeneratedPtSpectrum", {HistType::kTH1F, {antilambdaPtAxis}}); + rPtAnalysis.add("hAntiOmegaGeneratedPtSpectrum", "hAntiOmegaGeneratedPtSpectrum", {HistType::kTH1F, {antilambdaPtAxis}}); + // Adding Kzerosh Histograms to registry if (kzeroAnalysis == true) { - pthistos::kaonptbins = o2::utils::Str::tokenize(kzeroSettingPtBinsString, ','); - rPtAnalysis.add("hK0ShortReconstructedPtSpectrum", "hK0ShortReconstructedPtSpectrum", {HistType::kTH1F, {ptAxis}}); + rPtAnalysis.add("hK0ShGeneratedPtSpectrum", "hK0ShGeneratedPtSpectrum", {HistType::kTH1F, {k0ShortPtAxis}}); + rPtAnalysis.add("hK0ShortReconstructedPtSpectrum", "hK0ShortReconstructedPtSpectrum", {HistType::kTH1F, {k0ShortPtAxis}}); rPtAnalysis.add("hMassK0ShortAll", "hMassK0ShortAll", {HistType::kTH1F, {k0ShortMassAxis}}); - rPtAnalysis.add("hK0ShortPtSpectrumBeforeCuts", "hK0ShortPtSpectrumBeforeCuts", {HistType::kTH1F, {ptAxis}}); + rPtAnalysis.add("hK0ShortPtSpectrumBeforeCuts", "hK0ShortPtSpectrumBeforeCuts", {HistType::kTH1F, {k0ShortPtAxis}}); rPtAnalysis.add("hMassK0ShortAllAfterCuts", "hMassK0ShortAllAfterCuts", {HistType::kTH1F, {k0ShortMassAxis}}); - rPtAnalysis.add("hK0ShGeneratedPtSpectrum", "hK0ShGeneratedPtSpectrum", {HistType::kTH1F, {genPtAxis}}); - rPtAnalysis.add("hLambdaGeneratedPtSpectrum", "hLambdaGeneratedPtSpectrum", {HistType::kTH1F, {genPtAxis}}); - rPtAnalysis.add("hAntilambdaGeneratedPtSpectrum", "hAntilambdaGeneratedPtSpectrum", {HistType::kTH1F, {genPtAxis}}); - rPtAnalysis.add("hMassK0ShortAfterEtaCut", "hMassK0ShortAfterEtaCut", {HistType::kTH1F, {k0ShortMassAxis}}); - rPtAnalysis.add("hMassK0ShortAfterCompmassCut", "hMassK0ShortAfterCompmassCut", {HistType::kTH1F, {k0ShortMassAxis}}); - rPtAnalysis.add("hMassK0ShortAfterPIDCuts", "hMassK0ShortAfterPIDCuts", {HistType::kTH1F, {k0ShortMassAxis}}); - rPtAnalysis.add("hNSigmaPosPiFromK0s", "hNSigmaPosPiFromK0s", {HistType::kTH2F, {{100, -5.f, 5.f}, {ptAxis}}}); - rPtAnalysis.add("hNSigmaNegPiFromK0s", "hNSigmaNegPiFromK0s", {HistType::kTH2F, {{100, -5.f, 5.f}, {ptAxis}}}); - rPtAnalysis.add("hK0shEtaPosDau", "hK0shEtaPosDau", {HistType::kTH1F, {{nBins, -1.2f, 1.2f}}}); - rPtAnalysis.add("hK0shEtaNegDau", "hK0shEtaNegDau", {HistType::kTH1F, {{nBins, -1.2f, 1.2f}}}); + rPtAnalysis.add("hNSigmaPosPiFromK0s", "hNSigmaPosPiFromK0s", {HistType::kTH2F, {{100, -5.f, 5.f}, {k0ShortPtAxis}}}); + rPtAnalysis.add("hNSigmaNegPiFromK0s", "hNSigmaNegPiFromK0s", {HistType::kTH2F, {{100, -5.f, 5.f}, {k0ShortPtAxis}}}); rPtAnalysis.add("hK0shEtaDaughters", "hK0shEtaDaughters", {HistType::kTH1F, {{nBins, -1.2f, 1.2f}}}); - rPtAnalysis.add("hArmenterosPodolanskiPlotK0Short", "hArmenterosPodolanskiPlotK0Short", {HistType::kTH2F, {{500, -1.f, 1.f}, {armenterosQtAxis}}}); - for (uint32_t i = 0; i < pthistos::kaonptbins.size() - 1; i++) { - pthistos::kaonPt[i] = rKaonshMassPlotsPerPtBin.add(fmt::format("hPt_from_{0}_to_{1}", pthistos::kaonptbins[i], pthistos::kaonptbins[i + 1]).data(), fmt::format("hPt from {0} to {1}", pthistos::kaonptbins[i], pthistos::kaonptbins[i + 1]).data(), {HistType::kTH1D, {{k0ShortMassAxis}}}); + rPtAnalysis.add("hArmenterosPodolanskiPlotK0Short", "hArmenterosPodolanskiPlotK0Short", {HistType::kTH2F, {{armenterosasymAxis}, {armenterosQtAxis}}}); + for (int i = 0; i < nmaxHistograms; i++) { + pthistos::kaonPt[i] = rKaonshMassPlotsPerPtBin.add(fmt::format("hPt_from_{0}_to_{1}", kaonhistvalue[i], kaonhistvalue[i + 1]).c_str(), fmt::format("hPt_from_{0}_to_{1}", kaonhistvalue[i], kaonhistvalue[i + 1]).c_str(), {HistType::kTH1D, {{k0ShortMassAxis}}}); } } // Adding Lambda Histograms if (lambdaAnalysis == true) { // same method as in Kzerosh above - std::string lambdaSettingptbins = lambdaSettingPtBinsString; - pthistos::lambdaPtBins = o2::utils::Str::tokenize(lambdaSettingptbins, ','); - rPtAnalysis.add("hLambdaReconstructedPtSpectrum", "hLambdaReconstructedPtSpectrum", {HistType::kTH1F, {ptAxis}}); + rPtAnalysis.add("hLambdaGeneratedPtSpectrum", "hLambdaGeneratedPtSpectrum", {HistType::kTH1F, {lambdaPtAxis}}); + rPtAnalysis.add("hLambdaReconstructedPtSpectrum", "hLambdaReconstructedPtSpectrum", {HistType::kTH1F, {lambdaPtAxis}}); rPtAnalysis.add("hMassLambdaAll", "hMassLambdaAll", {HistType::kTH1F, {lambdaMassAxis}}); - rPtAnalysis.add("hLambdaPtSpectrumBeforeCuts", "hLambdaPtSpectrumBeforeCuts", {HistType::kTH1F, {ptAxis}}); + rPtAnalysis.add("hLambdaPtSpectrumBeforeCuts", "hLambdaPtSpectrumBeforeCuts", {HistType::kTH1F, {lambdaPtAxis}}); rPtAnalysis.add("hMassLambdaAllAfterCuts", "hMassLambdaAllAfterCuts", {HistType::kTH1F, {lambdaMassAxis}}); - rPtAnalysis.add("hMassLambdaAfterEtaCut", "hMassLambdaAfterEtaCut", {HistType::kTH1F, {lambdaMassAxis}}); - rPtAnalysis.add("hMassLambdaAfterCompmassCut", "hMassLambdaAfterCompmassCut", {HistType::kTH1F, {lambdaMassAxis}}); - rPtAnalysis.add("hMassLambdaAfterPIDCuts", "hMassLambdaAfterPIDCuts", {HistType::kTH1F, {lambdaMassAxis}}); - rPtAnalysis.add("hNSigmaPosProtonFromLambda", "hNSigmaPosProtonFromLambda", {HistType::kTH2F, {{100, -5.f, 5.f}, {ptAxis}}}); - rPtAnalysis.add("hNSigmaNegPionFromLambda", "hNSigmaNegPionFromLambda", {HistType::kTH2F, {{100, -5.f, 5.f}, {ptAxis}}}); + rPtAnalysis.add("hNSigmaPosProtonFromLambda", "hNSigmaPosProtonFromLambda", {HistType::kTH2F, {{100, -5.f, 5.f}, {lambdaPtAxis}}}); + rPtAnalysis.add("hNSigmaNegPionFromLambda", "hNSigmaNegPionFromLambda", {HistType::kTH2F, {{100, -5.f, 5.f}, {lambdaPtAxis}}}); rPtAnalysis.add("hLambdaEtaDaughters", "hLambdaEtaDaughters", {HistType::kTH1F, {{nBins, -1.2f, 1.2f}}}); - rPtAnalysis.add("hArmenterosPodolanskiPlotLambda", "hArmenterosPodolanskiPlotLambda", {HistType::kTH2F, {{500, -1.f, 1.f}, {armenterosQtAxis}}}); - for (u_int32_t i = 0; i < pthistos::lambdaPtBins.size() - 1; i++) { - pthistos::lambdaPt[i] = rLambdaMassPlotsPerPtBin.add(fmt::format("hPt_from_{0}_to_{1}", pthistos::lambdaPtBins[i], pthistos::lambdaPtBins[i + 1]).data(), fmt::format("hPt from {0} to {1}", pthistos::lambdaPtBins[i], pthistos::lambdaPtBins[i + 1]).data(), {HistType::kTH1D, {{lambdaMassAxis}}}); + rPtAnalysis.add("hArmenterosPodolanskiPlotLambda", "hArmenterosPodolanskiPlotLambda", {HistType::kTH2F, {{armenterosasymAxis}, {armenterosQtAxis}}}); + for (int i = 0; i < nmaxHistograms; i++) { + pthistos::lambdaPt[i] = rLambdaMassPlotsPerPtBin.add(fmt::format("hPt_from_{0}_to_{1}", lambdahistvalue[i], lambdahistvalue[i + 1]).c_str(), fmt::format("hPt_from_{0}_to_{1}", lambdahistvalue[i], lambdahistvalue[i + 1]).c_str(), {HistType::kTH1D, {{lambdaMassAxis}}}); } + // lambdafeeddown matrices + rFeeddownMatrices.add("hLambdaXiMinusFeeddownMatrix", "hLambdaXiMinusFeeddownMatrix", {HistType::kTH2F, {{lambdaPtAxis}, {lambdaPtAxis}}}); + rFeeddownMatrices.add("hLambdaXiZeroFeeddownMatrix", "hLambdaXiZeroFeeddownMatrix", {HistType::kTH2F, {{lambdaPtAxis}, {lambdaPtAxis}}}); + rFeeddownMatrices.add("hLambdaOmegaFeeddownMatrix", "hLambdaOmegaFeeddownMatrix", {HistType::kTH2F, {{lambdaPtAxis}, {lambdaPtAxis}}}); } // Adding Antilambda Histograms if (antiLambdaAnalysis == true) { // same method as in Lambda and Kzerosh above - std::string antilambdaSettingptbins = antilambdaSettingPtBinsString; - pthistos::antiLambdaPtBins = o2::utils::Str::tokenize(antilambdaSettingptbins, ','); - rPtAnalysis.add("hAntilambdaReconstructedPtSpectrum", "hAntilambdaReconstructedPtSpectrum", {HistType::kTH1F, {ptAxis}}); + rPtAnalysis.add("hAntilambdaGeneratedPtSpectrum", "hAntilambdaGeneratedPtSpectrum", {HistType::kTH1F, {{antilambdaPtAxis}}}); + rPtAnalysis.add("hAntilambdaReconstructedPtSpectrum", "hAntilambdaReconstructedPtSpectrum", {HistType::kTH1F, {antilambdaPtAxis}}); rPtAnalysis.add("hMassAntilambdaAll", "hMassAntilambdaAll", {HistType::kTH1F, {antiLambdaMassAxis}}); - rPtAnalysis.add("hAntilambdaPtSpectrumBeforeCuts", "hAntilambdaPtSpectrumBeforeCuts", {HistType::kTH1F, {ptAxis}}); + rPtAnalysis.add("hantilambdaPtSpectrumBeforeCuts", "hantilambdaPtSpectrumBeforeCuts", {HistType::kTH1F, {antilambdaPtAxis}}); rPtAnalysis.add("hMassAntilambdaAllAfterCuts", "hMassAntilambdaAllAfterCuts", {HistType::kTH1F, {antiLambdaMassAxis}}); - rPtAnalysis.add("hMassAntiLambdaAfterEtaCut", "hMassAntiLambdaAfterEtaCut", {HistType::kTH1F, {antiLambdaMassAxis}}); - rPtAnalysis.add("hMassAntiLambdaAfterCompmassCut", "hMassAntiLambdaAfterCompmassCut", {HistType::kTH1F, {antiLambdaMassAxis}}); - rPtAnalysis.add("hMassAntiLambdaAfterPIDCuts", "hMassAntiLambdaAfterPIDCuts", {HistType::kTH1F, {antiLambdaMassAxis}}); - rPtAnalysis.add("hNSigmaNegProtonFromAntilambda", "hNSigmaNegProtonFromAntilambda", {HistType::kTH2F, {{100, -5.f, 5.f}, {ptAxis}}}); - rPtAnalysis.add("hNSigmaPosPionFromAntilambda", "hNSigmaPosPionFromAntilambda", {HistType::kTH2F, {{100, -5.f, 5.f}, {ptAxis}}}); + rPtAnalysis.add("hNSigmaNegProtonFromAntilambda", "hNSigmaNegProtonFromAntilambda", {HistType::kTH2F, {{100, -5.f, 5.f}, {antilambdaPtAxis}}}); + rPtAnalysis.add("hNSigmaPosPionFromAntilambda", "hNSigmaPosPionFromAntilambda", {HistType::kTH2F, {{100, -5.f, 5.f}, {antilambdaPtAxis}}}); rPtAnalysis.add("hAntiLambdaEtaDaughters", "hAntiLambdaEtaDaughters", {HistType::kTH1F, {{nBins, -1.2f, 1.2f}}}); - rPtAnalysis.add("hArmenterosPodolanskiPlotAntiLambda", "hArmenterosPodolanskiPlotAntiLambda", {HistType::kTH2F, {{500, -1.f, 1.f}, {armenterosQtAxis}}}); - for (u_int32_t i = 0; i < pthistos::antiLambdaPtBins.size() - 1; i++) { - pthistos::antiLambdaPt[i] = rAntilambdaMassPlotsPerPtBin.add(fmt::format("hPt_from_{0}_to_{1}", pthistos::antiLambdaPtBins[i], pthistos::antiLambdaPtBins[i + 1]).data(), fmt::format("hPt from {0} to {1}", pthistos::antiLambdaPtBins[i], pthistos::antiLambdaPtBins[i + 1]).data(), {HistType::kTH1D, {{antiLambdaMassAxis}}}); + rPtAnalysis.add("hArmenterosPodolanskiPlotAntiLambda", "hArmenterosPodolanskiPlotAntiLambda", {HistType::kTH2F, {{armenterosasymAxis}, {armenterosQtAxis}}}); + for (int i = 0; i < nmaxHistograms; i++) { + pthistos::antilambdaPt[i] = rAntilambdaMassPlotsPerPtBin.add(fmt::format("hPt_from_{0}_to_{1}", antilambdahistvalue[i], antilambdahistvalue[i + 1]).c_str(), fmt::format("hPt_from_{0}_to_{1}", antilambdahistvalue[i], antilambdahistvalue[i + 1]).c_str(), {HistType::kTH1D, {{antiLambdaMassAxis}}}); } + // antilambdafeeddown matrices + rFeeddownMatrices.add("hAntiLambdaXiPlusFeeddownMatrix", "hAntiLambdaXiPlusFeeddownMatrix", {HistType::kTH2F, {{antilambdaPtAxis}, {antilambdaPtAxis}}}); + rFeeddownMatrices.add("hAntiLambdaAntiXiZeroFeeddownMatrix", "hAntiLambdaAntiXiZeroFeeddownMatrix", {HistType::kTH2F, {{antilambdaPtAxis}, {antilambdaPtAxis}}}); + rFeeddownMatrices.add("hAntiLambdaAntiOmegaFeeddownMatrix", "hAntiLambdaAntiOmegaPlusFeeddownMatrix", {HistType::kTH2F, {{antilambdaPtAxis}, {antilambdaPtAxis}}}); } } @@ -193,8 +237,8 @@ struct V0PtInvMassPlots { aod::McParticles const& mcParticles) { for (const auto& mcParticle : mcParticles) { - if (mcParticle.isPhysicalPrimary()) { - if (std::abs(mcParticle.y()) < 0.5f) { + if (std::abs(mcParticle.y()) < rapiditycutGen) { + if (mcParticle.isPhysicalPrimary()) { if (mcParticle.pdgCode() == 310) // kzero matched { rPtAnalysis.fill(HIST("hK0ShGeneratedPtSpectrum"), mcParticle.pt()); @@ -207,6 +251,30 @@ struct V0PtInvMassPlots { { rPtAnalysis.fill(HIST("hAntilambdaGeneratedPtSpectrum"), mcParticle.pt()); } + if (mcParticle.pdgCode() == 3312) // Xi Minus matched + { + rPtAnalysis.fill(HIST("hXiMinusGeneratedPtSpectrum"), mcParticle.pt()); + } + if (mcParticle.pdgCode() == 3322) // Xi Zero matched + { + rPtAnalysis.fill(HIST("hXiZeroGeneratedPtSpectrum"), mcParticle.pt()); + } + if (mcParticle.pdgCode() == 3334) // Omega matched + { + rPtAnalysis.fill(HIST("hOmegaGeneratedPtSpectrum"), mcParticle.pt()); + } + if (mcParticle.pdgCode() == -3312) // Xi Plus matched + { + rPtAnalysis.fill(HIST("hXiPlusGeneratedPtSpectrum"), mcParticle.pt()); + } + if (mcParticle.pdgCode() == -3322) // Anti-Xi Zero matched + { + rPtAnalysis.fill(HIST("hAntiXiZeroGeneratedPtSpectrum"), mcParticle.pt()); + } + if (mcParticle.pdgCode() == -3334) // Anti-Omega matched + { + rPtAnalysis.fill(HIST("hAntiOmegaGeneratedPtSpectrum"), mcParticle.pt()); + } } } } @@ -220,50 +288,46 @@ struct V0PtInvMassPlots { // PDG mass values for Competitive V0 Cut old: const auto& mK0shPDG = 0.497611; double mK0shPDG = o2::constants::physics::MassK0Short; double mLambdaPDG = o2::constants::physics::MassLambda0; + + // tokenise strings into individual values + pthistos::kaonPtBins = o2::utils::Str::tokenize(kzeroSettingPtBinsString, ','); + pthistos::lambdaPtBins = o2::utils::Str::tokenize(lambdaSettingPtBinsString, ','); + pthistos::antilambdaPtBins = o2::utils::Str::tokenize(antilambdaSettingPtBinsString, ','); + + // initialize and convert tokenized strings into vector of doubles for Pt Bin Edges + std::vector kaonptedgevalues(nmaxHistograms + 1); + std::vector lambdaptedgevalues(nmaxHistograms + 1); + std::vector antilambdaPtedgevalues(nmaxHistograms + 1); + + for (int i = 0; i < nmaxHistograms + 1; i++) { + kaonptedgevalues[i] = std::stod(pthistos::kaonPtBins[i]); + lambdaptedgevalues[i] = std::stod(pthistos::lambdaPtBins[i]); + antilambdaPtedgevalues[i] = std::stod(pthistos::antilambdaPtBins[i]); + } + for (const auto& v0 : V0s) { - // Armenteros-Podolandski Plot Values - double pv0 = std::sqrt((v0.px() * v0.px()) + (v0.py() * v0.py()) + (v0.pz() * v0.pz())); - double pposdauparallelv0 = ((v0.posTrack_as().px() * v0.px()) + (v0.posTrack_as().py() * v0.py()) + (v0.posTrack_as().pz() * v0.pz())) / pv0; - double qValue = std::sqrt(((v0.posTrack_as().px() * v0.posTrack_as().px()) + (v0.posTrack_as().py() * v0.posTrack_as().py()) + (v0.posTrack_as().pz() * v0.posTrack_as().pz())) - (pposdauparallelv0 * pposdauparallelv0)); - double plpos = (v0.posTrack_as().px() * v0.px() / pv0) + (v0.posTrack_as().py() * v0.py() / pv0) + (v0.posTrack_as().pz() * v0.pz() / pv0); - double plneg = (v0.negTrack_as().px() * v0.px() / pv0) + (v0.negTrack_as().py() * v0.py() / pv0) + (v0.negTrack_as().pz() * v0.pz() / pv0); - double aValue = (plpos - plneg) / (plpos + plneg); - rPtAnalysis.fill(HIST("hArmenterosPodolanskiPlot"), aValue, qValue); rPtAnalysis.fill(HIST("hVertexZRec"), collision.posZ()); - rPtAnalysis.fill(HIST("hV0PtAll"), v0.pt()); // Checking that the V0 is a true K0s/Lambdas/Antilambdas and then filling the parameter histograms and the invariant mass plots for different cuts (which are taken from namespace) if (v0.has_mcParticle()) { auto v0mcParticle = v0.mcParticle(); - if (v0mcParticle.isPhysicalPrimary()) { - if (std::abs(v0.posTrack_as().eta()) < etadau && std::abs(v0.negTrack_as().eta()) < etadau) { // daughters pseudorapidity cut - rPtAnalysis.fill(HIST("hV0EtaDaughters"), v0.negTrack_as().eta()); - rPtAnalysis.fill(HIST("hV0EtaDaughters"), v0.posTrack_as().eta()); - if (kzeroAnalysis == true) { - if (v0mcParticle.pdgCode() == 310) { // kzero matched - if (std::abs(v0.mLambda() - mLambdaPDG) > compv0masscut && std::abs(v0.mAntiLambda() - mLambdaPDG) > compv0masscut) { // Kzero competitive v0 mass cut (cut out Lambdas and Anti-Lambdas) - rPtAnalysis.fill(HIST("hMassK0ShortAll"), v0.mK0Short()); - rPtAnalysis.fill(HIST("hK0ShortPtSpectrumBeforeCuts"), v0.pt()); - // Implementing best kzero cuts - if (v0.v0cosPA() > kaonshSettingcosPA && v0.dcaV0daughters() < kaonshSettingdcav0dau && v0.v0radius() > kaonshSettingradius && std::abs(v0.dcapostopv()) > kaonshSettingdcapostopv && std::abs(v0.dcanegtopv()) > kaonshSettingdcanegtopv) { - rPtAnalysis.fill(HIST("hMassK0ShortAllAfterCuts"), v0.mK0Short()); - rPtAnalysis.fill(HIST("hK0ShortReconstructedPtSpectrum"), v0.pt()); - rPtAnalysis.fill(HIST("hK0shEtaPosDau"), v0.posTrack_as().eta()); - rPtAnalysis.fill(HIST("hK0shEtaNegDau"), v0.negTrack_as().eta()); - rPtAnalysis.fill(HIST("hK0shEtaDaughters"), v0.negTrack_as().eta()); - rPtAnalysis.fill(HIST("hK0shEtaDaughters"), v0.posTrack_as().eta()); - rPtAnalysis.fill(HIST("hArmenterosPodolanskiPlotK0Short"), aValue, qValue); - for (int i = 0; i < 20; i++) { - // getting the pt value in #_# for and converting it to a number #.# for use, we get two values which correspond to the range of each bin - std::string pt1 = pthistos::kaonptbins[i]; // getting the lower string-value of the bin - std::string pt2 = pthistos::kaonptbins[i + 1]; // getting the higher string-value of the bin - size_t pos1 = pt1.find("_"); // finding the "_" character of the lower string-value - size_t pos2 = pt2.find("_"); // finding the "_" character of the higher string-value - pt1[pos1] = '.'; // changing the "_" character of the lower string-value to a "." - pt2[pos2] = '.'; // changing the "_" character of the higher string-value to a "." - const float ptlowervalue = std::stod(pt1); // converting the lower string value to a double - const float pthighervalue = std::stod(pt2); // converting the higher string value to a double - if (ptlowervalue <= v0.pt() && v0.pt() < pthighervalue) { // finding v0s with pt withing the range of our lower and higher value - pthistos::kaonPt[i]->Fill(v0.mK0Short()); // filling the 20 kaon namespace histograms + if (std::abs(v0.posTrack_as().eta()) < etadau && std::abs(v0.negTrack_as().eta()) < etadau) { // daughters pseudorapidity cut + rPtAnalysis.fill(HIST("hV0EtaDaughters"), v0.negTrack_as().eta()); + rPtAnalysis.fill(HIST("hV0EtaDaughters"), v0.posTrack_as().eta()); + if (kzeroAnalysis == true) { + if (v0mcParticle.pdgCode() == 310) { // kzero matched + rPtAnalysis.fill(HIST("hMassK0ShortAll"), v0.mK0Short()); + rPtAnalysis.fill(HIST("hK0ShortPtSpectrumBeforeCuts"), v0.pt()); + if (std::abs(v0.mLambda() - mLambdaPDG) > compv0masscut && std::abs(v0.mAntiLambda() - mLambdaPDG) > compv0masscut) { // Kzero competitive v0 mass cut (cut out Lambdas and Anti-Lambdas) + // Implementing best kzero topological cuts + if (v0.v0cosPA() > kaonshSettingcosPA && v0.dcaV0daughters() < kaonshSettingdcav0dau && v0.v0radius() > kaonshSettingradius && std::abs(v0.dcapostopv()) > kaonshSettingdcapostopv && std::abs(v0.dcanegtopv()) > kaonshSettingdcanegtopv) { + rPtAnalysis.fill(HIST("hMassK0ShortAllAfterCuts"), v0.mK0Short()); + rPtAnalysis.fill(HIST("hK0ShortReconstructedPtSpectrum"), v0.pt()); + rPtAnalysis.fill(HIST("hK0shEtaDaughters"), v0.negTrack_as().eta()); + rPtAnalysis.fill(HIST("hK0shEtaDaughters"), v0.posTrack_as().eta()); + if (v0mcParticle.isPhysicalPrimary()) { + for (int i = 0; i < nmaxHistograms; i++) { + if (kaonptedgevalues[i] <= v0.pt() && v0.pt() < kaonptedgevalues[i + 1]) { // finding v0s with pt within the range of our bin edges + pthistos::kaonPt[i]->Fill(v0.mK0Short()); // filling the k0s namespace histograms } } } @@ -273,29 +337,39 @@ struct V0PtInvMassPlots { } // lambda analysis if (lambdaAnalysis == true) { - if (v0mcParticle.pdgCode() == 3122) { // lambda matched + if (v0mcParticle.pdgCode() == 3122) { // lambda matched + rPtAnalysis.fill(HIST("hMassLambdaAll"), v0.mLambda()); + rPtAnalysis.fill(HIST("hLambdaPtSpectrumBeforeCuts"), v0.pt()); if (std::abs(v0.mK0Short() - mK0shPDG) > compv0masscut) { // antilambda competitive v0 mass cut (cut out Kaons) - rPtAnalysis.fill(HIST("hMassLambdaAll"), v0.mLambda()); - rPtAnalysis.fill(HIST("hLambdaPtSpectrumBeforeCuts"), v0.pt()); // Implementing best lambda cuts if (v0.v0cosPA() > lambdaSettingcosPA && v0.dcaV0daughters() < lambdaSettingdcav0dau && v0.v0radius() > lambdaSettingradius && std::abs(v0.dcapostopv()) > lambdaSettingdcapostopv && std::abs(v0.dcanegtopv()) > lambdaSettingdcanegtopv) { rPtAnalysis.fill(HIST("hMassLambdaAllAfterCuts"), v0.mLambda()); rPtAnalysis.fill(HIST("hLambdaReconstructedPtSpectrum"), v0.pt()); rPtAnalysis.fill(HIST("hLambdaEtaDaughters"), v0.negTrack_as().eta()); rPtAnalysis.fill(HIST("hLambdaEtaDaughters"), v0.posTrack_as().eta()); - rPtAnalysis.fill(HIST("hArmenterosPodolanskiPlotLambda"), aValue, qValue); - for (int i = 0; i < 20; i++) { - // same as above with kzerosh we fill the 20 lambda namespace histograms within their Pt range - std::string pt1 = pthistos::lambdaPtBins[i]; - std::string pt2 = pthistos::lambdaPtBins[i + 1]; - size_t pos1 = pt1.find("_"); - size_t pos2 = pt2.find("_"); - pt1[pos1] = '.'; - pt2[pos2] = '.'; - const float ptlowervalue = std::stod(pt1); - const float pthighervalue = std::stod(pt2); - if (ptlowervalue <= v0.pt() && v0.pt() < pthighervalue) { - pthistos::lambdaPt[i]->Fill(v0.mLambda()); + if (v0mcParticle.isPhysicalPrimary()) { + for (int i = 0; i < nmaxHistograms; i++) { + if (lambdaptedgevalues[i] <= v0.pt() && v0.pt() < lambdaptedgevalues[i + 1]) { + pthistos::lambdaPt[i]->Fill(v0.mLambda()); + } + } + } + if (!v0mcParticle.isPhysicalPrimary()) { + auto v0mothers = v0mcParticle.mothers_as(); // Get mothers + if (!v0mothers.empty()) { + auto& v0mcParticleMother = v0mothers.front(); // First mother + if (v0mcParticleMother.pdgCode() == 3312) // Xi Minus Mother Matched + { + rFeeddownMatrices.fill(HIST("hLambdaXiMinusFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + } + if (v0mcParticleMother.pdgCode() == 3322) // Xi Zero Mother Matched + { + rFeeddownMatrices.fill(HIST("hLambdaXiZeroFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + } + if (v0mcParticleMother.pdgCode() == 3334) // Omega Mother Matched + { + rFeeddownMatrices.fill(HIST("hLambdaOmegaFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + } } } } @@ -304,29 +378,39 @@ struct V0PtInvMassPlots { } // antilambda analysis if (antiLambdaAnalysis == true) { - if (v0mcParticle.pdgCode() == -3122) { // antilambda matched + if (v0mcParticle.pdgCode() == -3122) { // antilambda matched + rPtAnalysis.fill(HIST("hMassAntilambdaAll"), v0.mAntiLambda()); + rPtAnalysis.fill(HIST("hantilambdaPtSpectrumBeforeCuts"), v0.pt()); if (std::abs(v0.mK0Short() - mK0shPDG) > compv0masscut) { // antilambda competitive v0 mass cut (cut out Kaons) - rPtAnalysis.fill(HIST("hMassAntilambdaAll"), v0.mAntiLambda()); - rPtAnalysis.fill(HIST("hAntilambdaPtSpectrumBeforeCuts"), v0.pt()); // Implementing best antilambda cuts if (v0.v0cosPA() > antilambdaSettingcosPA && v0.dcaV0daughters() < antilambdaSettingdcav0dau && v0.v0radius() > antilambdaSettingradius && std::abs(v0.dcapostopv()) > antilambdaSettingdcapostopv && std::abs(v0.dcanegtopv()) > antilambdaSettingdcanegtopv) { rPtAnalysis.fill(HIST("hMassAntilambdaAllAfterCuts"), v0.mAntiLambda()); rPtAnalysis.fill(HIST("hAntilambdaReconstructedPtSpectrum"), v0.pt()); rPtAnalysis.fill(HIST("hAntiLambdaEtaDaughters"), v0.negTrack_as().eta()); rPtAnalysis.fill(HIST("hAntiLambdaEtaDaughters"), v0.posTrack_as().eta()); - rPtAnalysis.fill(HIST("hArmenterosPodolanskiPlotAntiLambda"), aValue, qValue); - for (int i = 0; i < 20; i++) { - // same as above with kzerosh and lambda we fill the 20 anti-lambda namespace histograms within their Pt range - std::string pt1 = pthistos::antiLambdaPtBins[i]; - std::string pt2 = pthistos::antiLambdaPtBins[i + 1]; - size_t pos1 = pt1.find("_"); - size_t pos2 = pt2.find("_"); - pt1[pos1] = '.'; - pt2[pos2] = '.'; - const float ptlowervalue = std::stod(pt1); - const float pthighervalue = std::stod(pt2); - if (ptlowervalue <= v0.pt() && v0.pt() < pthighervalue) { - pthistos::antiLambdaPt[i]->Fill(v0.mAntiLambda()); + if (v0mcParticle.isPhysicalPrimary()) { + for (int i = 0; i < nmaxHistograms; i++) { + if (antilambdaPtedgevalues[i] <= v0.pt() && v0.pt() < antilambdaPtedgevalues[i + 1]) { + pthistos::antilambdaPt[i]->Fill(v0.mAntiLambda()); + } + } + } + if (!v0mcParticle.isPhysicalPrimary()) { + auto v0mothers = v0mcParticle.mothers_as(); // Get mothers + if (!v0mothers.empty()) { + auto& v0mcParticleMother = v0mothers.front(); // First mother + if (v0mcParticleMother.pdgCode() == -3312) // Xi Plus Mother Matched + { + rFeeddownMatrices.fill(HIST("hAntiLambdaXiPlusFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + } + if (v0mcParticleMother.pdgCode() == -3322) // Anti-Xi Zero Mother Matched + { + rFeeddownMatrices.fill(HIST("hAntiLambdaAntiXiZeroFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + } + if (v0mcParticleMother.pdgCode() == -3334) // Anti-Omega (minus) Mother Matched + { + rFeeddownMatrices.fill(HIST("hAntiLambdaAntiOmegaFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + } } } } @@ -342,8 +426,24 @@ struct V0PtInvMassPlots { aod::V0Datas const& V0s, DaughterTracks const&) { - const auto& mLambdaPDG = 1.115683; - const auto& mK0shPDG = 0.497611; + double mK0shPDG = o2::constants::physics::MassK0Short; + double mLambdaPDG = o2::constants::physics::MassLambda0; + + // tokenise strings into individual values + pthistos::kaonPtBins = o2::utils::Str::tokenize(kzeroSettingPtBinsString, ','); + pthistos::lambdaPtBins = o2::utils::Str::tokenize(lambdaSettingPtBinsString, ','); + pthistos::antilambdaPtBins = o2::utils::Str::tokenize(antilambdaSettingPtBinsString, ','); + + // initialize and convert tokenized strings into vector of doubles for pt bin edges + std::vector kaonptedgevalues(nmaxHistograms + 1); + std::vector lambdaptedgevalues(nmaxHistograms + 1); + std::vector antilambdaPtedgevalues(nmaxHistograms + 1); + for (int i = 0; i < nmaxHistograms + 1; i++) { + kaonptedgevalues[i] = std::stod(pthistos::kaonPtBins[i]); + lambdaptedgevalues[i] = std::stod(pthistos::lambdaPtBins[i]); + antilambdaPtedgevalues[i] = std::stod(pthistos::antilambdaPtBins[i]); + } + for (const auto& v0 : V0s) { const auto& posDaughterTrack = v0.posTrack_as(); const auto& negDaughterTrack = v0.negTrack_as(); @@ -356,11 +456,7 @@ struct V0PtInvMassPlots { double aValue = (plpos - plneg) / (plpos + plneg); rPtAnalysis.fill(HIST("hArmenterosPodolanskiPlot"), aValue, qValue); rPtAnalysis.fill(HIST("hVertexZRec"), collision.posZ()); - rPtAnalysis.fill(HIST("hV0PtAll"), v0.pt()); if (std::abs(v0.posTrack_as().eta()) < etadau && std::abs(v0.negTrack_as().eta()) < etadau) { // daughters pseudorapidity cut - rPtAnalysis.fill(HIST("hMassK0ShortAfterEtaCut"), v0.mK0Short()); - rPtAnalysis.fill(HIST("hMassLambdaAfterEtaCut"), v0.mLambda()); - rPtAnalysis.fill(HIST("hMassAntiLambdaAfterEtaCut"), v0.mAntiLambda()); rPtAnalysis.fill(HIST("hV0EtaDaughters"), v0.negTrack_as().eta()); rPtAnalysis.fill(HIST("hV0EtaDaughters"), v0.posTrack_as().eta()); // kzero analysis @@ -370,26 +466,15 @@ struct V0PtInvMassPlots { if (std::abs(v0.mLambda() - mLambdaPDG) > compv0masscut && std::abs(v0.mAntiLambda() - mLambdaPDG) > compv0masscut) { // antilambda competitive v0 mass cut (cut out Lambdas and Anti-Lambdas) // Implementing best kzero cuts if (std::abs(posDaughterTrack.tpcNSigmaPi()) < nSigmaTPCPion && std::abs(negDaughterTrack.tpcNSigmaPi()) < nSigmaTPCPion) { // TPC PID on daughter pions - rPtAnalysis.fill(HIST("hMassK0ShortAfterPIDCuts"), v0.mK0Short()); rPtAnalysis.fill(HIST("hNSigmaPosPiFromK0s"), posDaughterTrack.tpcNSigmaPi(), posDaughterTrack.tpcInnerParam()); rPtAnalysis.fill(HIST("hNSigmaNegPiFromK0s"), negDaughterTrack.tpcNSigmaPi(), negDaughterTrack.tpcInnerParam()); if (v0.v0cosPA() > kaonshSettingcosPA && v0.dcaV0daughters() < kaonshSettingdcav0dau && v0.v0radius() > kaonshSettingradius && std::abs(v0.dcapostopv()) > kaonshSettingdcapostopv && std::abs(v0.dcanegtopv()) > kaonshSettingdcanegtopv) { rPtAnalysis.fill(HIST("hMassK0ShortAllAfterCuts"), v0.mK0Short()); - rPtAnalysis.fill(HIST("hK0shEtaPosDau"), v0.posTrack_as().eta()); - rPtAnalysis.fill(HIST("hK0shEtaNegDau"), v0.negTrack_as().eta()); rPtAnalysis.fill(HIST("hK0shEtaDaughters"), v0.negTrack_as().eta()); rPtAnalysis.fill(HIST("hK0shEtaDaughters"), v0.posTrack_as().eta()); rPtAnalysis.fill(HIST("hArmenterosPodolanskiPlotK0Short"), aValue, qValue); - for (int i = 0; i < 20; i++) { // same as above MC-process we fill the namespace histos with the kaon invariant mass of the particle within the pt range of the histo - std::string pt1 = pthistos::kaonptbins[i]; - std::string pt2 = pthistos::kaonptbins[i + 1]; - size_t pos1 = pt1.find("_"); - size_t pos2 = pt2.find("_"); - pt1[pos1] = '.'; - pt2[pos2] = '.'; - const float ptlowervalue = std::stod(pt1); - const float pthighervalue = std::stod(pt2); - if (ptlowervalue < v0.pt() && v0.pt() < pthighervalue) { + for (int i = 0; i < nmaxHistograms; i++) { + if (kaonptedgevalues[i] <= v0.pt() && v0.pt() < kaonptedgevalues[i + 1]) { pthistos::kaonPt[i]->Fill(v0.mK0Short()); } } @@ -401,10 +486,8 @@ struct V0PtInvMassPlots { if (lambdaAnalysis == true) { // Filling the five lambda invariant mass plots for different cuts (which are taken from namespace), for full explanation see the first kzero cut filling in the MC process rPtAnalysis.fill(HIST("hMassLambdaAll"), v0.mLambda()); - if (std::abs(v0.mK0Short() - mK0shPDG) > compv0masscut) { // lambda competitive v0 mass cut (cut out Kaons) - rPtAnalysis.fill(HIST("hMassLambdaAfterCompmassCut"), v0.mLambda()); + if (std::abs(v0.mK0Short() - mK0shPDG) > compv0masscut) { // lambda competitive v0 mass cut (cut out Kaons) if (std::abs(posDaughterTrack.tpcNSigmaPr()) < nSigmaTPCProton && std::abs(negDaughterTrack.tpcNSigmaPi()) < nSigmaTPCPion) { // TPC PID on daughter pion and proton for Lambda - rPtAnalysis.fill(HIST("hMassLambdaAfterPIDCuts"), v0.mLambda()); rPtAnalysis.fill(HIST("hNSigmaPosProtonFromLambda"), posDaughterTrack.tpcNSigmaPr(), posDaughterTrack.tpcInnerParam()); rPtAnalysis.fill(HIST("hNSigmaNegPionFromLambda"), negDaughterTrack.tpcNSigmaPi(), negDaughterTrack.tpcInnerParam()); // Implementing best lambda cuts @@ -413,16 +496,8 @@ struct V0PtInvMassPlots { rPtAnalysis.fill(HIST("hLambdaEtaDaughters"), v0.negTrack_as().eta()); rPtAnalysis.fill(HIST("hLambdaEtaDaughters"), v0.posTrack_as().eta()); rPtAnalysis.fill(HIST("hArmenterosPodolanskiPlotLambda"), aValue, qValue); - for (int i = 0; i < 20; i++) { // same as above MC-process we fill the namespace histos with the lambda invariant mass of the particle within the pt range of the histo - std::string pt1 = pthistos::lambdaPtBins[i]; - std::string pt2 = pthistos::lambdaPtBins[i + 1]; - size_t pos1 = pt1.find("_"); - size_t pos2 = pt2.find("_"); - pt1[pos1] = '.'; - pt2[pos2] = '.'; - const float ptlowervalue = std::stod(pt1); - const float pthighervalue = std::stod(pt2); - if (ptlowervalue < v0.pt() && v0.pt() < pthighervalue) { + for (int i = 0; i < nmaxHistograms; i++) { + if (lambdaptedgevalues[i] <= v0.pt() && v0.pt() < lambdaptedgevalues[i + 1]) { pthistos::lambdaPt[i]->Fill(v0.mLambda()); } } @@ -434,10 +509,8 @@ struct V0PtInvMassPlots { if (antiLambdaAnalysis == true) { // Filling the five Antilambda invariant mass plots for different cuts (which are taken from namespace), for full explanation see the first kzero cut filling in the MC process rPtAnalysis.fill(HIST("hMassAntilambdaAll"), v0.mAntiLambda()); - if (std::abs(v0.mK0Short() - mK0shPDG) > compv0masscut) { // antilambda competitive v0 mass cut (cut out Kaons) - rPtAnalysis.fill(HIST("hMassAntiLambdaAfterCompmassCut"), v0.mAntiLambda()); + if (std::abs(v0.mK0Short() - mK0shPDG) > compv0masscut) { // antilambda competitive v0 mass cut (cut out Kaons) if (std::abs(negDaughterTrack.tpcNSigmaPr()) < nSigmaTPCProton && std::abs(posDaughterTrack.tpcNSigmaPi()) < nSigmaTPCPion) { // TPC PID on daughter pion and proton for AntiLambda - rPtAnalysis.fill(HIST("hMassAntiLambdaAfterPIDCuts"), v0.mAntiLambda()); rPtAnalysis.fill(HIST("hNSigmaPosPionFromAntilambda"), posDaughterTrack.tpcNSigmaPi(), posDaughterTrack.tpcInnerParam()); rPtAnalysis.fill(HIST("hNSigmaNegProtonFromAntilambda"), negDaughterTrack.tpcNSigmaPr(), negDaughterTrack.tpcInnerParam()); // implementing best antilambda cuts @@ -446,17 +519,9 @@ struct V0PtInvMassPlots { rPtAnalysis.fill(HIST("hAntiLambdaEtaDaughters"), v0.negTrack_as().eta()); rPtAnalysis.fill(HIST("hAntiLambdaEtaDaughters"), v0.posTrack_as().eta()); rPtAnalysis.fill(HIST("hArmenterosPodolanskiPlotAntiLambda"), aValue, qValue); - for (int i = 0; i < 20; i++) { // same as above MC-process we fill the namespace histos with the antilambda invariant mass of the particle within the pt range of the histo - std::string pt1 = pthistos::antiLambdaPtBins[i]; - std::string pt2 = pthistos::antiLambdaPtBins[i + 1]; - size_t pos1 = pt1.find("_"); - size_t pos2 = pt2.find("_"); - pt1[pos1] = '.'; - pt2[pos2] = '.'; - const float ptlowervalue = std::stod(pt1); - const float pthighervalue = std::stod(pt2); - if (ptlowervalue < v0.pt() && v0.pt() < pthighervalue) { - pthistos::antiLambdaPt[i]->Fill(v0.mAntiLambda()); + for (int i = 0; i < nmaxHistograms; i++) { + if (lambdaptedgevalues[i] <= v0.pt() && v0.pt() < lambdaptedgevalues[i + 1]) { + pthistos::antilambdaPt[i]->Fill(v0.mAntiLambda()); } } } From e3e51e814af2f560ee8301518df1959b48e17f19 Mon Sep 17 00:00:00 2001 From: ilikmeta <152337132+ilikmeta@users.noreply.github.com> Date: Fri, 7 Mar 2025 04:40:41 -0600 Subject: [PATCH 0588/1650] [PWGCF] Modify efficiency corrections (#10371) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/flowGfwTask.cxx | 480 ++++++++++++++++++------------- 1 file changed, 286 insertions(+), 194 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowGfwTask.cxx b/PWGCF/Flow/Tasks/flowGfwTask.cxx index a7cd60e2653..6581fbc26f2 100644 --- a/PWGCF/Flow/Tasks/flowGfwTask.cxx +++ b/PWGCF/Flow/Tasks/flowGfwTask.cxx @@ -34,6 +34,11 @@ #include "Common/DataModel/Centrality.h" #include "Common/DataModel/Multiplicity.h" +#include "Framework/O2DatabasePDGPlugin.h" +#include "ReconstructionDataFormats/GlobalTrackID.h" +#include "ReconstructionDataFormats/Track.h" +#include "TPDGCode.h" + #include "GFWPowerArray.h" #include "GFW.h" #include "GFWCumulant.h" @@ -52,6 +57,20 @@ using namespace o2::aod::evsel; #define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable NAME{#NAME, DEFAULT, HELP}; +namespace o2::aod +{ +using SimCollisions = soa::Join; + +using SimTracks = soa::Join; +} // namespace o2::aod + +using Colls = soa::Filtered>; +using AodTracks = soa::Filtered>; +using BCsRun3 = soa::Join; + struct FlowGfwTask { O2_DEFINE_CONFIGURABLE(cfgCutVertex, float, 10.0f, "Accepted z-vertex range") @@ -92,7 +111,7 @@ struct FlowGfwTask { O2_DEFINE_CONFIGURABLE(cfgEvSelkIsGoodITSLayersAll, bool, false, "kIsGoodITSLayersAll") O2_DEFINE_CONFIGURABLE(cfgOccupancy, bool, false, "Bool for event selection on detector occupancy"); O2_DEFINE_CONFIGURABLE(cfgMultCut, bool, false, "Use additional event cut on mult correlations"); - O2_DEFINE_CONFIGURABLE(cfgV0AT0A5Sigma, bool, true, "V0A T0A 5 sigma cut") + O2_DEFINE_CONFIGURABLE(cfgV0AT0A5Sigma, bool, false, "V0A T0A 5 sigma cut") O2_DEFINE_CONFIGURABLE(cfgGlobalplusITS, bool, false, "Global and ITS tracks") O2_DEFINE_CONFIGURABLE(cfgGlobalonly, bool, false, "Global only tracks") O2_DEFINE_CONFIGURABLE(cfgITSonly, bool, false, "ITS only tracks") @@ -236,151 +255,172 @@ struct FlowGfwTask { ccdb->setCreatedNotAfter(ccdbNoLaterThan.value); // Add some output objects to the histogram registry - registry.add("hEventCount", "Number of Events;; No. of Events", {HistType::kTH1D, {{kNOOFEVENTSTEPS, -0.5, static_cast(kNOOFEVENTSTEPS) - 0.5}}}); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kFILTERED + 1, "Filtered events"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kSEL8 + 1, "Sel8"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kOCCUPANCY + 1, "Occupancy"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kNOTIMEFRAMEBORDER + 1, "kNoTimeFrameBorder"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kNOITSROFRAMEBORDER + 1, "kNoITSROFrameBorder"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kNOPSAMEBUNCHPILEUP + 1, "kNoSameBunchPileup"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kISGOODZVTXFT0VSPV + 1, "kIsGoodZvtxFT0vsPV"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kISVERTEXITSTPC + 1, "kIsVertexITSTPC"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kNOCOLLINTIMERANGESTANDART + 1, "kNoCollInTimeRangeStandard"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kISGOODITSLAYERSALL + 1, "kIsGoodITSLayersAll"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kAFTERMULTCUTS + 1, "After Mult cuts"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kCENTRALITY + 1, "Centrality"); - registry.add("hPhi", "#phi distribution", {HistType::kTH1D, {axisPhi}}); - registry.add("hPhiWeighted", "corrected #phi distribution", {HistType::kTH1D, {axisPhi}}); - registry.add("hEta", "", {HistType::kTH1D, {axisEta}}); - registry.add("hVtxZ", "Vexter Z distribution", {HistType::kTH1D, {axisVertex}}); - registry.add("hMult", "Multiplicity distribution", {HistType::kTH1D, {{3000, 0.5, 3000.5}}}); - registry.add("hCent", "Centrality distribution", {HistType::kTH1D, {{90, 0, 90}}}); - registry.add("cent_vs_Nch", ";Centrality (%); M (|#eta| < 0.8);", {HistType::kTH2D, {axisCentrality, axisNch}}); - - // Centrality estimators - registry.add("hCentEstimators", "Number of Unfiltered Events;; No. of Events", {HistType::kTH1D, {{kNoCentEstimators, -0.5, static_cast(kNoCentEstimators) - 0.5}}}); - registry.get(HIST("hCentEstimators"))->GetXaxis()->SetBinLabel(kCentFT0C + 1, "FT0C"); - registry.get(HIST("hCentEstimators"))->GetXaxis()->SetBinLabel(kCentFT0A + 1, "FT0A"); - registry.get(HIST("hCentEstimators"))->GetXaxis()->SetBinLabel(kCentFT0M + 1, "FT0M"); - registry.get(HIST("hCentEstimators"))->GetXaxis()->SetBinLabel(kCentFV0A + 1, "FV0A"); - registry.get(HIST("hCentEstimators"))->GetXaxis()->SetBinLabel(kCentFT0CVariant1 + 1, "FT0CVar1"); - registry.add("hCentFT0C", "Uncorrected FT0C;Centrality FT0C ;Events", kTH1F, {axisCentrality}); - registry.add("hCentFT0A", "Uncorrected FT0A;Centrality FT0A ;Events", kTH1F, {axisCentrality}); - registry.add("hCentFT0M", "Uncorrected FT0M;Centrality FT0M ;Events", kTH1F, {axisCentrality}); - registry.add("hCentFV0A", "Uncorrected FV0A;Centrality FV0A ;Events", kTH1F, {axisCentrality}); - registry.add("hCentFT0CVariant1", "Uncorrected FT0CVariant1;Centrality FT0CVariant1 ;Events", kTH1F, {axisCentrality}); - - // Before cuts - registry.add("BeforeCut_globalTracks_centT0C", "before cut;Centrality T0C;mulplicity global tracks", {HistType::kTH2D, {axisCentForQA, axisNch}}); - registry.add("BeforeCut_PVTracks_centT0C", "before cut;Centrality T0C;mulplicity PV tracks", {HistType::kTH2D, {axisCentForQA, axisNchPV}}); - registry.add("BeforeCut_globalTracks_PVTracks", "before cut;mulplicity PV tracks;mulplicity global tracks", {HistType::kTH2D, {axisNchPV, axisNch}}); - registry.add("BeforeCut_globalTracks_multT0A", "before cut;mulplicity T0A;mulplicity global tracks", {HistType::kTH2D, {axisT0A, axisNch}}); - registry.add("BeforeCut_globalTracks_multV0A", "before cut;mulplicity V0A;mulplicity global tracks", {HistType::kTH2D, {axisT0A, axisNch}}); - registry.add("BeforeCut_multV0A_multT0A", "before cut;mulplicity T0A;mulplicity V0A", {HistType::kTH2D, {axisT0A, axisT0A}}); - registry.add("BeforeCut_multT0C_centT0C", "before cut;Centrality T0C;mulplicity T0C", {HistType::kTH2D, {axisCentForQA, axisT0C}}); - registry.add("BeforeCut_multT0A_centT0A", "before cut;Centrality T0C;mulplicity T0A", {HistType::kTH2D, {axisCentForQA, axisT0A}}); - registry.add("BeforeCut_multFT0M_centFT0M", "before cut;Centrality FT0M;mulplicity FT0M", {HistType::kTH2D, {axisCentForQA, axisT0M}}); - - // After cuts - registry.add("globalTracks_centT0C_Aft", "after cut;Centrality T0C;mulplicity global tracks", {HistType::kTH2D, {axisCentForQA, axisNch}}); - registry.add("PVTracks_centT0C_Aft", "after cut;Centrality T0C;mulplicity PV tracks", {HistType::kTH2D, {axisCentForQA, axisNchPV}}); - registry.add("globalTracks_PVTracks_Aft", "after cut;mulplicity PV tracks;mulplicity global tracks", {HistType::kTH2D, {axisNchPV, axisNch}}); - registry.add("globalTracks_multT0A_Aft", "after cut;mulplicity T0A;mulplicity global tracks", {HistType::kTH2D, {axisT0A, axisNch}}); - registry.add("globalTracks_multV0A_Aft", "after cut;mulplicity V0A;mulplicity global tracks", {HistType::kTH2D, {axisT0A, axisNch}}); - registry.add("multV0A_multT0A_Aft", "after cut;mulplicity T0A;mulplicity V0A", {HistType::kTH2D, {axisT0A, axisT0A}}); - registry.add("multT0C_centT0C_Aft", "after cut;Centrality T0C;mulplicity T0C", {HistType::kTH2D, {axisCentForQA, axisT0C}}); - registry.add("multT0A_centT0A_Aft", "after cut;Centrality T0A;mulplicity T0A", {HistType::kTH2D, {axisCentForQA, axisT0A}}); - registry.add("multFT0M_centFT0M_Aft", "after cut;Centrality FT0M;mulplicity FT0M", {HistType::kTH2D, {axisCentForQA, axisT0M}}); - - // FT0 plots - registry.add("FT0CAmp", ";FT0C amplitude;Events", kTH1F, {axisFT0CAmp}); - registry.add("FT0AAmp", ";FT0A amplitude;Events", kTH1F, {axisFT0AAmp}); - registry.add("FT0MAmp", ";FT0M amplitude;Events", kTH1F, {axisFT0MAmp}); - - // ZDC plots - const AxisSpec axisEvent{3, 0., +3.0, ""}; - registry.add("hEventCounterForZDC", "Event counter", kTH1F, {axisEvent}); - registry.add("ZNAcoll", "ZNAcoll; ZNA amplitude; Entries", {HistType::kTH1F, {{nBinsAmp, -0.5, maxZN}}}); - registry.add("ZPAcoll", "ZPAcoll; ZPA amplitude; Entries", {HistType::kTH1F, {{nBinsAmp, -0.5, maxZP}}}); - registry.add("ZNCcoll", "ZNCcoll; ZNC amplitude; Entries", {HistType::kTH1F, {{nBinsAmp, -0.5, maxZN}}}); - registry.add("ZPCcoll", "ZPCcoll; ZPC amplitude; Entries", {HistType::kTH1F, {{nBinsAmp, -0.5, maxZP}}}); - registry.add("ZNvsFT0correl", "ZNvsFT0correl; FT0 amplitude; ZN", {HistType::kTH2F, {{{nBinsFit, 0., maxMultFT0}, {nBinsAmp, -0.5, 2. * maxZN}}}}); - registry.add("ZDCAmp", "ZDC Amplitude; ZDC Amplitude; Events", {HistType::kTH1F, {{nBinsAmp, -0.5, maxZP}}}); - registry.add("ZNAmp", "ZNA+ZNC Amplitude; ZN Amplitude; Events", {HistType::kTH1F, {{nBinsAmp, -0.5, maxZN}}}); - registry.add("ZPAmp", "ZPA+ZPC Amplitude; ZP Amplitude; Events", {HistType::kTH1F, {{nBinsAmp, -0.5, maxZP}}}); - registry.add("ZNvsZEMcoll", "ZNvsZEMcoll; ZEM; ZDC energy (GeV)", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); - registry.add("ZNvsZEMcoll05", "ZNvsZEMcoll; ZEM; ZDC energy (GeV)", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); - registry.add("ZNvsZEMcoll510", "ZNvsZEMcoll; ZEM; ZDC energy (GeV)", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); - registry.add("ZNvsZEMcoll1020", "ZNvsZEMcoll; ZEM; ZDC energy (GeV)", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); - registry.add("ZNvsZEMcoll2030", "ZNvsZEMcoll; ZEM; ZDC energy (GeV)", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); - registry.add("ZNvsZEMcollrest", "ZNvsZEMcoll; ZEM; ZDC energy (GeV)", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); - - // Track plots - registry.add("Nch", "N_{ch 0-5%} vs #Events;N_{ch 0-5%};No. of Events", {HistType::kTH1D, {axisNch}}); - registry.add("Events_per_Centrality_Bin", "Events_per_Centrality_Bin;Centrality FT0C;No. of Events", kTH1F, {axisCentrality}); - registry.add("Tracks_per_Centrality_Bin", "Tracks_per_Centrality_Bin;Centrality FT0C;No. of Tracks", kTH1F, {axisCentrality}); - registry.add("pt_Cen_GlobalOnly", "pt_Cen_Global;Centrality (%); p_{T} (GeV/c);", {HistType::kTH2D, {axisCentrality, axisPt}}); - registry.add("phi_Cen_GlobalOnly", "phi_Cen_Global;Centrality (%); #phi;", {HistType::kTH2D, {axisCentrality, axisPhi}}); - registry.add("pt_Cen_ITSOnly", "pt_Cen_ITS;Centrality (%); p_{T} (GeV/c);", {HistType::kTH2D, {axisCentrality, axisPt}}); - registry.add("phi_Cen_ITSOnly", "phi_Cen_ITS;Centrality (%); #phi;", {HistType::kTH2D, {axisCentrality, axisPhi}}); - - // Track types - registry.add("GlobalplusITS", "Global plus ITS;Centrality FT0C;Nch", {HistType::kTH2D, {axisCentrality, axisNch}}); - registry.add("Globalonly", "Global only;Centrality FT0C;Nch", {HistType::kTH2D, {axisCentrality, axisNch}}); - registry.add("ITSonly", "ITS only;Centrality FT0C;Nch", {HistType::kTH2D, {axisCentrality, axisNch}}); - - // Track QA - registry.add("hPt", "p_{T} distribution before cut", {HistType::kTH1D, {axisPtHist}}); - registry.add("hPtRef", "p_{T} distribution after cut", {HistType::kTH1D, {axisPtHist}}); - registry.add("pt_phi_bef", "before cut;p_{T};#phi_{modn}", {HistType::kTH2D, {axisPt, axisPhiMod}}); - registry.add("pt_phi_aft", "after cut;p_{T};#phi_{modn}", {HistType::kTH2D, {axisPt, axisPhiMod}}); - registry.add("hChi2prTPCcls", "#chi^{2}/cluster for the TPC track segment", {HistType::kTH1D, {{100, 0., 5.}}}); - registry.add("hnTPCClu", "Number of found TPC clusters", {HistType::kTH1D, {{100, 40, 180}}}); - registry.add("hnTPCCrossedRow", "Number of crossed TPC Rows", {HistType::kTH1D, {{100, 40, 180}}}); - registry.add("hDCAz", "DCAz after cuts", {HistType::kTH1D, {{100, -3, 3}}}); - registry.add("hDCAxy", "DCAxy after cuts; DCAxy (cm); Pt", {HistType::kTH2D, {{50, -1, 1}, {50, 0, 10}}}); - - // Additional Output histograms - registry.add("c22", ";Centrality (%) ; C_{2}{2} ", {HistType::kTProfile, {axisCentrality}}); - registry.add("c24", ";Centrality (%) ; C_{2}{4}", {HistType::kTProfile, {axisCentrality}}); - registry.add("c26", ";Centrality (%) ; C_{2}{6}", {HistType::kTProfile, {axisCentrality}}); - registry.add("c28", ";Centrality (%) ; C_{2}{8}", {HistType::kTProfile, {axisCentrality}}); - registry.add("c22etagap", ";Centrality (%) ; C_{2}{2} (|#eta| < 0.8) ", {HistType::kTProfile, {axisCentrality}}); - registry.add("c32", ";Centrality (%) ; C_{3}{2} ", {HistType::kTProfile, {axisCentrality}}); - registry.add("c32etagap", ";Centrality (%) ; C_{3}{2} (|#eta| < 0.8) ", {HistType::kTProfile, {axisCentrality}}); - registry.add("c34", ";Centrality (%) ; C_{3}{4} ", {HistType::kTProfile, {axisCentrality}}); - - registry.add("c22Nch", ";N_{ch}(|#eta| < 0.8) ; C_{2}{2} ", {HistType::kTProfile, {axisNch}}); - registry.add("c24Nch", ";N_{ch}(|#eta| < 0.8) ; C_{2}{4}", {HistType::kTProfile, {axisNch}}); - registry.add("c26Nch", ";N_{ch}(|#eta| < 0.8) ; C_{2}{6}", {HistType::kTProfile, {axisNch}}); - registry.add("c28Nch", ";N_{ch}(|#eta| < 0.8) ; C_{2}{8}", {HistType::kTProfile, {axisNch}}); - registry.add("c22Nchetagap", ";N_ch(|#eta| < 0.8) ; C_{2}{2} (|#eta| < 0.8) ", {HistType::kTProfile, {axisNch}}); - registry.add("c32Nch", ";N_{ch}(|#eta| < 0.8) ; C_{3}{2} ", {HistType::kTProfile, {axisNch}}); - registry.add("c32Nchetagap", ";N_ch(|#eta| < 0.8) ; C_{3}{2} (|#eta| < 0.8) ", {HistType::kTProfile, {axisNch}}); - registry.add("c34Nch", ";N_{ch}(|#eta| < 0.8) ; C_{3}{4} ", {HistType::kTProfile, {axisNch}}); - - registry.add("c22Nch05", ";N_{ch 0-5%}(|#eta| < 0.8) ; C_{2}{2} ", {HistType::kTProfile, {axisNch}}); - registry.add("c24Nch05", ";N_{ch 0-5%}(|#eta| < 0.8) ; C_{2}{4}", {HistType::kTProfile, {axisNch}}); - registry.add("c26Nch05", ";N_{ch 0-5%}(|#eta| < 0.8) ; C_{2}{6}", {HistType::kTProfile, {axisNch}}); - registry.add("c28Nch05", ";N_{ch 0-5%}(|#eta| < 0.8) ; C_{2}{8}", {HistType::kTProfile, {axisNch}}); - registry.add("c22Nch05etagap", ";N_{ch 0-5%}(|#eta| < 0.8) ; C_{2}{2} (|#eta| < 0.8) ", {HistType::kTProfile, {axisNch}}); - registry.add("c32Nch05", ";N_{ch 0-5%}(|#eta| < 0.8) ; C_{3}{2} ", {HistType::kTProfile, {axisNch}}); - registry.add("c32Nch05etagap", ";N_{ch 0-5%}(|#eta| < 0.8) ; C_{3}{2} (|#eta| < 0.8) ", {HistType::kTProfile, {axisNch}}); - registry.add("c34Nch05", ";N_{ch 0-5%}(|#eta| < 0.8) ; C_{3}{4} ", {HistType::kTProfile, {axisNch}}); - - // Create histograms for Reco and MC - const AxisSpec axisCounter{1, 0, +1, ""}; - registry.add("eventCounter", "eventCounter", kTH1F, {axisCounter}); - registry.add("hPtMCRec", "Monte Carlo Reco", {HistType::kTH1D, {axisPt}}); - registry.add("hCenMCRec", "Monte Carlo Reco", {HistType::kTH1D, {axisCentrality}}); - registry.add("hPtMCRec05", "Monte Carlo Reco", {HistType::kTH1D, {axisPt}}); - registry.add("hPtMCRec5060", "Monte Carlo Reco", {HistType::kTH1D, {axisPt}}); - - registry.add("mcEventCounter", "Monte Carlo Truth EventCounter", kTH1F, {axisCounter}); - registry.add("hPtMCGen", "Monte Carlo Truth", {HistType::kTH1D, {axisPt}}); - registry.add("hCenMCGen", "Monte Carlo Truth", {HistType::kTH1D, {axisCentrality}}); - registry.add("hPtMCGen05", "Monte Carlo Truth", {HistType::kTH1D, {axisPt}}); - registry.add("hPtMCGen5060", "Monte Carlo Truth", {HistType::kTH1D, {axisPt}}); + if (doprocessData) { + registry.add("hEventCount", "Number of Events;; No. of Events", {HistType::kTH1D, {{kNOOFEVENTSTEPS, -0.5, static_cast(kNOOFEVENTSTEPS) - 0.5}}}); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kFILTERED + 1, "Filtered events"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kSEL8 + 1, "Sel8"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kOCCUPANCY + 1, "Occupancy"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kNOTIMEFRAMEBORDER + 1, "kNoTimeFrameBorder"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kNOITSROFRAMEBORDER + 1, "kNoITSROFrameBorder"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kNOPSAMEBUNCHPILEUP + 1, "kNoSameBunchPileup"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kISGOODZVTXFT0VSPV + 1, "kIsGoodZvtxFT0vsPV"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kISVERTEXITSTPC + 1, "kIsVertexITSTPC"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kNOCOLLINTIMERANGESTANDART + 1, "kNoCollInTimeRangeStandard"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kISGOODITSLAYERSALL + 1, "kIsGoodITSLayersAll"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kAFTERMULTCUTS + 1, "After Mult cuts"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kCENTRALITY + 1, "Centrality"); + registry.add("hPhi", "#phi distribution", {HistType::kTH1D, {axisPhi}}); + registry.add("hPhiWeighted", "corrected #phi distribution", {HistType::kTH1D, {axisPhi}}); + registry.add("hEta", "", {HistType::kTH1D, {axisEta}}); + registry.add("hVtxZ", "Vexter Z distribution", {HistType::kTH1D, {axisVertex}}); + registry.add("hMult", "Multiplicity distribution", {HistType::kTH1D, {{3000, 0.5, 3000.5}}}); + registry.add("hCent", "Centrality distribution", {HistType::kTH1D, {{90, 0, 90}}}); + registry.add("cent_vs_Nch", ";Centrality (%); M (|#eta| < 0.8);", {HistType::kTH2D, {axisCentrality, axisNch}}); + + // Centrality estimators + registry.add("hCentEstimators", "Number of Unfiltered Events;; No. of Events", {HistType::kTH1D, {{kNoCentEstimators, -0.5, static_cast(kNoCentEstimators) - 0.5}}}); + registry.get(HIST("hCentEstimators"))->GetXaxis()->SetBinLabel(kCentFT0C + 1, "FT0C"); + registry.get(HIST("hCentEstimators"))->GetXaxis()->SetBinLabel(kCentFT0A + 1, "FT0A"); + registry.get(HIST("hCentEstimators"))->GetXaxis()->SetBinLabel(kCentFT0M + 1, "FT0M"); + registry.get(HIST("hCentEstimators"))->GetXaxis()->SetBinLabel(kCentFV0A + 1, "FV0A"); + registry.get(HIST("hCentEstimators"))->GetXaxis()->SetBinLabel(kCentFT0CVariant1 + 1, "FT0CVar1"); + registry.add("hCentFT0C", "Uncorrected FT0C;Centrality FT0C ;Events", kTH1F, {axisCentrality}); + registry.add("hCentFT0A", "Uncorrected FT0A;Centrality FT0A ;Events", kTH1F, {axisCentrality}); + registry.add("hCentFT0M", "Uncorrected FT0M;Centrality FT0M ;Events", kTH1F, {axisCentrality}); + registry.add("hCentFV0A", "Uncorrected FV0A;Centrality FV0A ;Events", kTH1F, {axisCentrality}); + registry.add("hCentFT0CVariant1", "Uncorrected FT0CVariant1;Centrality FT0CVariant1 ;Events", kTH1F, {axisCentrality}); + + // Before cuts + registry.add("BeforeCut_globalTracks_centT0C", "before cut;Centrality T0C;mulplicity global tracks", {HistType::kTH2D, {axisCentForQA, axisNch}}); + registry.add("BeforeCut_PVTracks_centT0C", "before cut;Centrality T0C;mulplicity PV tracks", {HistType::kTH2D, {axisCentForQA, axisNchPV}}); + registry.add("BeforeCut_globalTracks_PVTracks", "before cut;mulplicity PV tracks;mulplicity global tracks", {HistType::kTH2D, {axisNchPV, axisNch}}); + registry.add("BeforeCut_globalTracks_multT0A", "before cut;mulplicity T0A;mulplicity global tracks", {HistType::kTH2D, {axisT0A, axisNch}}); + registry.add("BeforeCut_globalTracks_multV0A", "before cut;mulplicity V0A;mulplicity global tracks", {HistType::kTH2D, {axisT0A, axisNch}}); + registry.add("BeforeCut_multV0A_multT0A", "before cut;mulplicity T0A;mulplicity V0A", {HistType::kTH2D, {axisT0A, axisT0A}}); + registry.add("BeforeCut_multT0C_centT0C", "before cut;Centrality T0C;mulplicity T0C", {HistType::kTH2D, {axisCentForQA, axisT0C}}); + registry.add("BeforeCut_multT0A_centT0A", "before cut;Centrality T0C;mulplicity T0A", {HistType::kTH2D, {axisCentForQA, axisT0A}}); + registry.add("BeforeCut_multFT0M_centFT0M", "before cut;Centrality FT0M;mulplicity FT0M", {HistType::kTH2D, {axisCentForQA, axisT0M}}); + + // After cuts + registry.add("globalTracks_centT0C_Aft", "after cut;Centrality T0C;mulplicity global tracks", {HistType::kTH2D, {axisCentForQA, axisNch}}); + registry.add("PVTracks_centT0C_Aft", "after cut;Centrality T0C;mulplicity PV tracks", {HistType::kTH2D, {axisCentForQA, axisNchPV}}); + registry.add("globalTracks_PVTracks_Aft", "after cut;mulplicity PV tracks;mulplicity global tracks", {HistType::kTH2D, {axisNchPV, axisNch}}); + registry.add("globalTracks_multT0A_Aft", "after cut;mulplicity T0A;mulplicity global tracks", {HistType::kTH2D, {axisT0A, axisNch}}); + registry.add("globalTracks_multV0A_Aft", "after cut;mulplicity V0A;mulplicity global tracks", {HistType::kTH2D, {axisT0A, axisNch}}); + registry.add("multV0A_multT0A_Aft", "after cut;mulplicity T0A;mulplicity V0A", {HistType::kTH2D, {axisT0A, axisT0A}}); + registry.add("multT0C_centT0C_Aft", "after cut;Centrality T0C;mulplicity T0C", {HistType::kTH2D, {axisCentForQA, axisT0C}}); + registry.add("multT0A_centT0A_Aft", "after cut;Centrality T0A;mulplicity T0A", {HistType::kTH2D, {axisCentForQA, axisT0A}}); + registry.add("multFT0M_centFT0M_Aft", "after cut;Centrality FT0M;mulplicity FT0M", {HistType::kTH2D, {axisCentForQA, axisT0M}}); + + // FT0 plots + registry.add("FT0CAmp", ";FT0C amplitude;Events", kTH1F, {axisFT0CAmp}); + registry.add("FT0AAmp", ";FT0A amplitude;Events", kTH1F, {axisFT0AAmp}); + registry.add("FT0MAmp", ";FT0M amplitude;Events", kTH1F, {axisFT0MAmp}); + + // ZDC plots + const AxisSpec axisEvent{3, 0., +3.0, ""}; + registry.add("hEventCounterForZDC", "Event counter", kTH1F, {axisEvent}); + registry.add("ZNAcoll", "ZNAcoll; ZNA amplitude; Entries", {HistType::kTH1F, {{nBinsAmp, -0.5, maxZN}}}); + registry.add("ZPAcoll", "ZPAcoll; ZPA amplitude; Entries", {HistType::kTH1F, {{nBinsAmp, -0.5, maxZP}}}); + registry.add("ZNCcoll", "ZNCcoll; ZNC amplitude; Entries", {HistType::kTH1F, {{nBinsAmp, -0.5, maxZN}}}); + registry.add("ZPCcoll", "ZPCcoll; ZPC amplitude; Entries", {HistType::kTH1F, {{nBinsAmp, -0.5, maxZP}}}); + registry.add("ZNvsFT0correl", "ZNvsFT0correl; FT0 amplitude; ZN", {HistType::kTH2F, {{{nBinsFit, 0., maxMultFT0}, {nBinsAmp, -0.5, 2. * maxZN}}}}); + registry.add("ZDCAmp", "ZDC Amplitude; ZDC Amplitude; Events", {HistType::kTH1F, {{nBinsAmp, -0.5, maxZP}}}); + registry.add("ZNAmp", "ZNA+ZNC Amplitude; ZN Amplitude; Events", {HistType::kTH1F, {{nBinsAmp, -0.5, maxZN}}}); + registry.add("ZPAmp", "ZPA+ZPC Amplitude; ZP Amplitude; Events", {HistType::kTH1F, {{nBinsAmp, -0.5, maxZP}}}); + registry.add("ZNvsZEMcoll", "ZNvsZEMcoll; ZEM; ZDC energy (GeV)", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); + registry.add("ZNvsZEMcoll05", "ZNvsZEMcoll; ZEM; ZDC energy (GeV)", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); + registry.add("ZNvsZEMcoll510", "ZNvsZEMcoll; ZEM; ZDC energy (GeV)", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); + registry.add("ZNvsZEMcoll1020", "ZNvsZEMcoll; ZEM; ZDC energy (GeV)", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); + registry.add("ZNvsZEMcoll2030", "ZNvsZEMcoll; ZEM; ZDC energy (GeV)", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); + registry.add("ZNvsZEMcollrest", "ZNvsZEMcoll; ZEM; ZDC energy (GeV)", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); + + // Track plots + registry.add("Nch", "N_{ch 0-5%} vs #Events;N_{ch 0-5%};No. of Events", {HistType::kTH1D, {axisNch}}); + registry.add("Events_per_Centrality_Bin", "Events_per_Centrality_Bin;Centrality FT0C;No. of Events", kTH1F, {axisCentrality}); + registry.add("Tracks_per_Centrality_Bin", "Tracks_per_Centrality_Bin;Centrality FT0C;No. of Tracks", kTH1F, {axisCentrality}); + registry.add("pt_Cen_GlobalOnly", "pt_Cen_Global;Centrality (%); p_{T} (GeV/c);", {HistType::kTH2D, {axisCentrality, axisPt}}); + registry.add("phi_Cen_GlobalOnly", "phi_Cen_Global;Centrality (%); #phi;", {HistType::kTH2D, {axisCentrality, axisPhi}}); + registry.add("pt_Cen_ITSOnly", "pt_Cen_ITS;Centrality (%); p_{T} (GeV/c);", {HistType::kTH2D, {axisCentrality, axisPt}}); + registry.add("phi_Cen_ITSOnly", "phi_Cen_ITS;Centrality (%); #phi;", {HistType::kTH2D, {axisCentrality, axisPhi}}); + + // Track types + registry.add("GlobalplusITS", "Global plus ITS;Centrality FT0C;Nch", {HistType::kTH2D, {axisCentrality, axisNch}}); + registry.add("Globalonly", "Global only;Centrality FT0C;Nch", {HistType::kTH2D, {axisCentrality, axisNch}}); + registry.add("ITSonly", "ITS only;Centrality FT0C;Nch", {HistType::kTH2D, {axisCentrality, axisNch}}); + + // Track QA + registry.add("hPt", "p_{T} distribution before cut", {HistType::kTH1D, {axisPtHist}}); + registry.add("hPtRef", "p_{T} distribution after cut", {HistType::kTH1D, {axisPtHist}}); + registry.add("pt_phi_bef", "before cut;p_{T};#phi_{modn}", {HistType::kTH2D, {axisPt, axisPhiMod}}); + registry.add("pt_phi_aft", "after cut;p_{T};#phi_{modn}", {HistType::kTH2D, {axisPt, axisPhiMod}}); + registry.add("hChi2prTPCcls", "#chi^{2}/cluster for the TPC track segment", {HistType::kTH1D, {{100, 0., 5.}}}); + registry.add("hnTPCClu", "Number of found TPC clusters", {HistType::kTH1D, {{100, 40, 180}}}); + registry.add("hnTPCCrossedRow", "Number of crossed TPC Rows", {HistType::kTH1D, {{100, 40, 180}}}); + registry.add("hDCAz", "DCAz after cuts", {HistType::kTH1D, {{100, -3, 3}}}); + registry.add("hDCAxy", "DCAxy after cuts; DCAxy (cm); Pt", {HistType::kTH2D, {{50, -1, 1}, {50, 0, 10}}}); + + // Additional Output histograms + registry.add("c22", ";Centrality (%) ; C_{2}{2} ", {HistType::kTProfile, {axisCentrality}}); + registry.add("c24", ";Centrality (%) ; C_{2}{4}", {HistType::kTProfile, {axisCentrality}}); + registry.add("c26", ";Centrality (%) ; C_{2}{6}", {HistType::kTProfile, {axisCentrality}}); + registry.add("c28", ";Centrality (%) ; C_{2}{8}", {HistType::kTProfile, {axisCentrality}}); + registry.add("c22etagap", ";Centrality (%) ; C_{2}{2} (|#eta| < 0.8) ", {HistType::kTProfile, {axisCentrality}}); + registry.add("c32", ";Centrality (%) ; C_{3}{2} ", {HistType::kTProfile, {axisCentrality}}); + registry.add("c32etagap", ";Centrality (%) ; C_{3}{2} (|#eta| < 0.8) ", {HistType::kTProfile, {axisCentrality}}); + registry.add("c34", ";Centrality (%) ; C_{3}{4} ", {HistType::kTProfile, {axisCentrality}}); + + registry.add("c22Nch", ";N_{ch}(|#eta| < 0.8) ; C_{2}{2} ", {HistType::kTProfile, {axisNch}}); + registry.add("c24Nch", ";N_{ch}(|#eta| < 0.8) ; C_{2}{4}", {HistType::kTProfile, {axisNch}}); + registry.add("c26Nch", ";N_{ch}(|#eta| < 0.8) ; C_{2}{6}", {HistType::kTProfile, {axisNch}}); + registry.add("c28Nch", ";N_{ch}(|#eta| < 0.8) ; C_{2}{8}", {HistType::kTProfile, {axisNch}}); + registry.add("c22Nchetagap", ";N_ch(|#eta| < 0.8) ; C_{2}{2} (|#eta| < 0.8) ", {HistType::kTProfile, {axisNch}}); + registry.add("c32Nch", ";N_{ch}(|#eta| < 0.8) ; C_{3}{2} ", {HistType::kTProfile, {axisNch}}); + registry.add("c32Nchetagap", ";N_ch(|#eta| < 0.8) ; C_{3}{2} (|#eta| < 0.8) ", {HistType::kTProfile, {axisNch}}); + registry.add("c34Nch", ";N_{ch}(|#eta| < 0.8) ; C_{3}{4} ", {HistType::kTProfile, {axisNch}}); + + registry.add("c22Nch05", ";N_{ch 0-5%}(|#eta| < 0.8) ; C_{2}{2} ", {HistType::kTProfile, {axisNch}}); + registry.add("c24Nch05", ";N_{ch 0-5%}(|#eta| < 0.8) ; C_{2}{4}", {HistType::kTProfile, {axisNch}}); + registry.add("c26Nch05", ";N_{ch 0-5%}(|#eta| < 0.8) ; C_{2}{6}", {HistType::kTProfile, {axisNch}}); + registry.add("c28Nch05", ";N_{ch 0-5%}(|#eta| < 0.8) ; C_{2}{8}", {HistType::kTProfile, {axisNch}}); + registry.add("c22Nch05etagap", ";N_{ch 0-5%}(|#eta| < 0.8) ; C_{2}{2} (|#eta| < 0.8) ", {HistType::kTProfile, {axisNch}}); + registry.add("c32Nch05", ";N_{ch 0-5%}(|#eta| < 0.8) ; C_{3}{2} ", {HistType::kTProfile, {axisNch}}); + registry.add("c32Nch05etagap", ";N_{ch 0-5%}(|#eta| < 0.8) ; C_{3}{2} (|#eta| < 0.8) ", {HistType::kTProfile, {axisNch}}); + registry.add("c34Nch05", ";N_{ch 0-5%}(|#eta| < 0.8) ; C_{3}{4} ", {HistType::kTProfile, {axisNch}}); + } // End doprocessData + + const AxisSpec axisZpos{48, -12., 12., "Vtx_{z} (cm)"}; + const AxisSpec axisEvent{2, 0, +2, ""}; + // MC Histograms + if (doprocesspTEff) { + registry.add("hEventCounterMCRec", "Event counter", kTH1F, {axisEvent}); + registry.add("zPos", ";;Entries;", kTH1F, {axisZpos}); + registry.add("T0Ccent", ";;Entries", kTH1F, {axisCentrality}); + registry.add("nRecColvsCent", "", kTH2F, {{6, -0.5, 5.5}, {{axisCentrality}}}); + registry.add("Pt_all_ch", "", kTH2F, {{axisCentrality}, {axisPt}}); + registry.add("Pt_ch", "", kTH2F, {{axisCentrality}, {axisPt}}); + registry.add("hPtMCRec", "Monte Carlo Reco", {HistType::kTH1D, {axisPt}}); + registry.add("hCenMCRec", "Monte Carlo Reco", {HistType::kTH1D, {axisCentrality}}); + registry.add("Pt_pi", "", kTH2F, {{axisCentrality}, {axisPt}}); + registry.add("Pt_ka", "", kTH2F, {{axisCentrality}, {axisPt}}); + registry.add("Pt_pr", "", kTH2F, {{axisCentrality}, {axisPt}}); + registry.add("Pt_sigpos", "", kTH2F, {{axisCentrality}, {axisPt}}); + registry.add("Pt_signeg", "", kTH2F, {{axisCentrality}, {axisPt}}); + registry.add("Pt_re", "", kTH2F, {{axisCentrality}, {axisPt}}); + registry.add("EtaVsPhi", ";;#varphi;", kTH2F, + {{{axisEta}, {100, -0.1 * o2::constants::math::PI, +2.1 * o2::constants::math::PI}}}); + registry.add("hEventCounterMCGen", "Event counter", kTH1F, {axisEvent}); + registry.add("zPosMC", ";;Entries;", kTH1F, {axisZpos}); + registry.add("PtMC_ch", "", kTH2F, {{axisCentrality}, {axisPt}}); + registry.add("hPtMCGen", "Monte Carlo Truth", {HistType::kTH1D, {axisPt}}); + registry.add("hCenMCGen", "Monte Carlo Truth", {HistType::kTH1D, {axisCentrality}}); + registry.add("PtMC_pi", "", kTH2F, {{axisCentrality}, {axisPt}}); + registry.add("PtMC_ka", "", kTH2F, {{axisCentrality}, {axisPt}}); + registry.add("PtMC_pr", "", kTH2F, {{axisCentrality}, {axisPt}}); + registry.add("PtMC_sigpos", "", kTH2F, {{axisCentrality}, {axisPt}}); + registry.add("PtMC_signeg", "", kTH2F, {{axisCentrality}, {axisPt}}); + registry.add("PtMC_re", "", kTH2F, {{axisCentrality}, {axisPt}}); + } // initial array bootstrapArray.resize(cfgNbootstrap); @@ -709,7 +749,7 @@ struct FlowGfwTask { } else if (cfgGlobalplusITS) { return ((track.tpcNClsFound() >= cfgCutTPCclu) && (track.itsNCls() >= cfgCutITSclu)); } else if (cfgGlobalonly) { - return ((track.tpcNClsFound() >= cfgCutTPCclu)); + return ((track.tpcNClsFound() >= cfgCutTPCclu) && (track.itsNCls() >= cfgCutITSclu)); } else if (cfgITSonly) { return ((track.itsNCls() >= cfgCutITSclu)); } else { @@ -727,11 +767,6 @@ struct FlowGfwTask { ncheckbit(aod::track::trackCutFlag, TrackSelectionDCA)) && (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls); - using Colls = soa::Filtered>; // collisions filter - using AodTracks = soa::Filtered>; // tracks filter - - using BCsRun3 = soa::Join; - void processData(Colls::iterator const& collision, aod::BCsWithTimestamps const&, AodTracks const& tracks, aod::FT0s const&, aod::Zdcs const&, BCsRun3 const&) { registry.fill(HIST("hEventCount"), kFILTERED); @@ -1030,61 +1065,118 @@ struct FlowGfwTask { } // End of process PROCESS_SWITCH(FlowGfwTask, processData, "Process analysis for Run 3 data", false); - // Filter the Reconstructed tracks - Filter mytrackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax) && (nabs(aod::track::dcaXY) < cfgCutDCAxy); - using MyTracks = soa::Filtered>; - using MyCollisions = soa::Join; + using TheFilteredSimTracks = soa::Filtered; - void processMCReco(MyCollisions::iterator const& collision, MyTracks const& tracks, aod::McParticles const&) + Preslice perMCCollision = aod::mcparticle::mcCollisionId; + Preslice perCollision = aod::track::collisionId; + void processpTEff(aod::McCollisions::iterator const& mccollision, + soa::SmallGroups const& collisions, + aod::McParticles const& mcParticles, + TheFilteredSimTracks const& simTracks) { - registry.fill(HIST("eventCounter"), 0.5); - const auto centrality = collision.centFT0C(); - registry.fill(HIST("hCenMCRec"), centrality); - for (const auto& track : tracks) { - if (track.tpcNClsCrossedRows() < 70) + // MC reconstructed + for (const auto& collision : collisions) { + const auto& centrality = collision.centFT0C(); + + if (!collision.sel8()) + return; + + if (cfgUseAdditionalEventCut && !eventSelected(o2::aod::mult::MultNTracksPV(), collision, simTracks.size(), centrality)) { + return; + } + + if (!collision.has_mcCollision()) continue; - if (track.has_mcParticle()) { + registry.fill(HIST("zPos"), collision.posZ()); + registry.fill(HIST("nRecColvsCent"), collisions.size(), collision.centFT0C()); + registry.fill(HIST("T0Ccent"), centrality); + + const auto& groupedTracks = simTracks.sliceBy(perCollision, collision.globalIndex()); + for (const auto& track : groupedTracks) { + + if (!trackSelected(track)) + continue; + + if (!track.has_mcParticle()) + continue; + + const auto& particle = track.mcParticle(); + registry.fill(HIST("hEventCounterMCRec"), 0.5); registry.fill(HIST("hPtMCRec"), track.pt()); - if (centrality > 0 && centrality <= 5) { - registry.fill(HIST("hPtMCRec05"), track.pt()); - } - if (centrality >= 50 && centrality <= 60) { - registry.fill(HIST("hPtMCRec5060"), track.pt()); + registry.fill(HIST("hCenMCRec"), centrality); + registry.fill(HIST("Pt_all_ch"), centrality, track.pt()); + registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); + + if (!particle.isPhysicalPrimary()) + continue; + + registry.fill(HIST("Pt_ch"), centrality, track.pt()); + if (particle.pdgCode() == PDG_t::kPiPlus || + particle.pdgCode() == PDG_t::kPiMinus) { + registry.fill(HIST("Pt_pi"), centrality, track.pt()); + } else if (particle.pdgCode() == PDG_t::kKPlus || + particle.pdgCode() == PDG_t::kKMinus) { + registry.fill(HIST("Pt_ka"), centrality, track.pt()); + } else if (particle.pdgCode() == PDG_t::kProton || + particle.pdgCode() == PDG_t::kProtonBar) { + registry.fill(HIST("Pt_pr"), centrality, track.pt()); + } else if (particle.pdgCode() == PDG_t::kSigmaPlus || + particle.pdgCode() == PDG_t::kSigmaBarMinus) { + registry.fill(HIST("Pt_sigpos"), centrality, track.pt()); + } else if (particle.pdgCode() == PDG_t::kSigmaMinus || + particle.pdgCode() == PDG_t::kSigmaBarPlus) { + registry.fill(HIST("Pt_signeg"), centrality, track.pt()); + } else { + registry.fill(HIST("Pt_re"), centrality, track.pt()); } } - } - } - PROCESS_SWITCH(FlowGfwTask, processMCReco, "process reconstructed information", false); - - // Filter for MCParticle simulation - Filter particleFilter = (nabs(aod::mcparticle::eta) < cfgCutEta) && (aod::mcparticle::pt > cfgCutPtMin) && (aod::mcparticle::pt < cfgCutPtMax); - using MyMcParticles = soa::Filtered; - using MyMcCollisionsFT0Cs = soa::Join; - void processMCGEN(aod::McCollision const&, soa::SmallGroups> const& collisions, MyMcParticles const& mcParticles, MyMcCollisionsFT0Cs const& mcCollisionsFT0Cs) - { - if (collisions.size() > -1) { - registry.fill(HIST("mcEventCounter"), 0.5); - for (const auto& mcCollisionsFT0C : mcCollisionsFT0Cs) { - registry.fill(HIST("hCenMCGen"), mcCollisionsFT0C.centFT0C()); - } + // Generated MC + registry.fill(HIST("hEventCounterMCGen"), 0.5); + if (std::fabs(mccollision.posZ()) > cfgCutVertex) + continue; + registry.fill(HIST("zPosMC"), mccollision.posZ()); + registry.fill(HIST("hEventCounterMCGen"), 1); - for (const auto& mcCollisionsFT0C : mcCollisionsFT0Cs) { - const auto centrality = mcCollisionsFT0C.centFT0C(); - for (const auto& mcParticle : mcParticles) { - registry.fill(HIST("hPtMCGen"), mcParticle.pt()); - if (centrality > 0 && centrality <= 5) { - registry.fill(HIST("hPtMCGen05"), mcParticle.pt()); - } - if (centrality >= 50 && centrality <= 60) { - registry.fill(HIST("hPtMCGen5060"), mcParticle.pt()); - } + for (const auto& particle : mcParticles) { + if (particle.eta() < -cfgCutEta || particle.eta() > cfgCutEta) { + continue; + } + if (particle.pt() < cfgCutPtMin || particle.pt() > cfgCutPtMax) { + continue; + } + if (!particle.isPhysicalPrimary()) { + continue; + } + registry.fill(HIST("hEventCounterMCGen"), 1.5); + registry.fill(HIST("hPtMCGen"), particle.pt()); + registry.fill(HIST("hCenMCGen"), centrality); + registry.fill(HIST("PtMC_ch"), centrality, particle.pt()); + if (particle.pdgCode() == PDG_t::kPiPlus || + particle.pdgCode() == PDG_t::kPiMinus) { // pion + registry.fill(HIST("PtMC_pi"), centrality, particle.pt()); + } else if (particle.pdgCode() == PDG_t::kKPlus || + particle.pdgCode() == PDG_t::kKMinus) { // kaon + registry.fill(HIST("PtMC_ka"), centrality, particle.pt()); + } else if (particle.pdgCode() == PDG_t::kProton || + particle.pdgCode() == PDG_t::kProtonBar) { // proton + registry.fill(HIST("PtMC_pr"), centrality, particle.pt()); + } else if (particle.pdgCode() == PDG_t::kSigmaPlus || + particle.pdgCode() == + PDG_t::kSigmaBarMinus) { // positive sigma + registry.fill(HIST("PtMC_sigpos"), centrality, particle.pt()); + } else if (particle.pdgCode() == PDG_t::kSigmaMinus || + particle.pdgCode() == + PDG_t::kSigmaBarPlus) { // negative sigma + registry.fill(HIST("PtMC_signeg"), centrality, particle.pt()); + } else { // rest + registry.fill(HIST("PtMC_re"), centrality, particle.pt()); } } } } - PROCESS_SWITCH(FlowGfwTask, processMCGEN, "process pure simulation information", false); + PROCESS_SWITCH(FlowGfwTask, processpTEff, "Process pT Eff", false); }; // End of struct From f4f60bd2c1daf1a9b82843382d20f3dcaea62f3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Fri, 7 Mar 2025 11:43:08 +0100 Subject: [PATCH 0589/1650] [Infrastructure] Bump MegaLinter to v8.4.2 (#10102) --- .github/workflows/mega-linter.yml | 2 +- .mega-linter.yml | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/mega-linter.yml b/.github/workflows/mega-linter.yml index 90f11945ac0..026067e976a 100644 --- a/.github/workflows/mega-linter.yml +++ b/.github/workflows/mega-linter.yml @@ -38,7 +38,7 @@ jobs: id: ml # You can override MegaLinter flavor used to have faster performances # More info at https://megalinter.io/flavors/ - uses: oxsecurity/megalinter@v8.3.0 + uses: oxsecurity/megalinter@v8.4.2 env: # All available variables are described in documentation: # https://megalinter.io/configuration/ diff --git a/.mega-linter.yml b/.mega-linter.yml index 838c5454d14..70b533d13a8 100644 --- a/.mega-linter.yml +++ b/.mega-linter.yml @@ -15,6 +15,9 @@ DISABLE_LINTERS: - BASH_SHFMT - CPP_CLANG_FORMAT - JSON_PRETTIER + - PYTHON_BLACK + - PYTHON_FLAKE8 + - PYTHON_ISORT - REPOSITORY_DEVSKIM - REPOSITORY_KICS - REPOSITORY_SECRETLINT From 606d18bb7179ae69eddc8d526aa85c033b03ffa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Fri, 7 Mar 2025 11:43:52 +0100 Subject: [PATCH 0590/1650] Dependency finder: Add reverse mode (#10108) --- Scripts/find_dependencies.py | 121 +++++++++++++++++++++-------------- 1 file changed, 73 insertions(+), 48 deletions(-) diff --git a/Scripts/find_dependencies.py b/Scripts/find_dependencies.py index 10bd68ee91e..87e07897aff 100755 --- a/Scripts/find_dependencies.py +++ b/Scripts/find_dependencies.py @@ -142,7 +142,7 @@ def print_wf(dic_wf: dict, wf: str): print_wf(dic_wf, wf) -def get_table_producers(table: str, dic_wf_all: dict, case_sensitive=False): +def get_table_producers(table: str, dic_wf_all: dict, case_sensitive=False, reverse=False): """Find all workflows that have this table as output.""" list_producers = [] if not case_sensitive: @@ -151,7 +151,7 @@ def get_table_producers(table: str, dic_wf_all: dict, case_sensitive=False): for wf, dic_wf in dic_wf_all.items(): # Loop over devices for dev in dic_wf: - outputs = [o if case_sensitive else o.lower() for o in dic_wf[dev]["outputs"]] + outputs = [o if case_sensitive else o.lower() for o in dic_wf[dev]["inputs" if reverse else "outputs"]] if table in outputs: list_producers.append(wf) return list(dict.fromkeys(list_producers)) # Remove duplicities @@ -179,12 +179,7 @@ def get_workflow_inputs(wf: str, dic_wf_all: dict): def get_tree_for_workflow( - wf: str, - dic_wf_all: dict, - dic_wf_tree=None, - case_sensitive=False, - level=0, - levels_max=0, + wf: str, dic_wf_all: dict, dic_wf_tree=None, case_sensitive=False, level=0, levels_max=0, reverse=False ): """Get the dependency tree of tables and workflows needed to run this workflow.""" # print(level, levels_max) @@ -194,40 +189,47 @@ def get_tree_for_workflow( msg_fatal(f"Workflow {wf} not found") if wf not in dic_wf_tree: dic_wf_tree[wf] = dic_wf_all[wf] - inputs = get_workflow_inputs(wf, dic_wf_all) + if reverse: + inputs = get_workflow_outputs(wf, dic_wf_all) + symbol_direction = "->" + else: + inputs = get_workflow_inputs(wf, dic_wf_all) + symbol_direction = "<-" if inputs: - print(f"{level * ' '}{wf} <- {inputs}") + print(f"{level * ' '}{wf} {symbol_direction} {inputs}") if levels_max < 0 or level < levels_max: for tab in inputs: - producers = get_table_producers(tab, dic_wf_all, case_sensitive) + producers = get_table_producers(tab, dic_wf_all, case_sensitive, reverse) if producers: - print(f"{level * ' ' + ' '}{tab} <- {producers}") + print(f"{level * ' ' + ' '}{tab} {symbol_direction} {producers}") for p in producers: if p not in dic_wf_tree: # avoid infinite recursion get_tree_for_workflow( - p, - dic_wf_all, - dic_wf_tree, - case_sensitive, - level + 1, - levels_max, + p, dic_wf_all, dic_wf_tree, case_sensitive, level + 1, levels_max, reverse ) return dic_wf_tree -def get_tree_for_table(tab: str, dic_wf_all: dict, dic_wf_tree=None, case_sensitive=False, levels_max=0): +def get_tree_for_table(tab: str, dic_wf_all: dict, dic_wf_tree=None, case_sensitive=False, levels_max=0, reverse=False): """Get the dependency tree of tables and workflows needed to produce this table.""" if dic_wf_tree is None: dic_wf_tree = {} - producers = get_table_producers(tab, dic_wf_all, case_sensitive) + producers = get_table_producers(tab, dic_wf_all, case_sensitive, reverse) + symbol_direction = "<-" + if reverse: + symbol_direction = "->" if producers: - print(f"{tab} <- {producers}") - if levels_max != 0: # Search for more dependencies only if needed. + print(f"{tab} {symbol_direction} {producers}") + if levels_max == 0: # Add producers in the dependency dictionary. + for p in producers: + if p not in dic_wf_tree: + dic_wf_tree[p] = dic_wf_all[p] + else: # Search for more dependencies if needed. print("\nWorkflow dependency tree:\n") for p in producers: - get_tree_for_workflow(p, dic_wf_all, dic_wf_tree, case_sensitive, 0, levels_max) + get_tree_for_workflow(p, dic_wf_all, dic_wf_tree, case_sensitive, 0, levels_max, reverse) else: - print("No producers found") + print(f'No {"consumers" if reverse else "producers"} found') return dic_wf_tree @@ -236,8 +238,22 @@ def main(): parser = argparse.ArgumentParser( description="Find dependencies required to produce a given table or to run a given workflow." ) - parser.add_argument("-t", dest="table", type=str, nargs="+", help="table(s)") - parser.add_argument("-w", dest="workflow", type=str, nargs="+", help="workflow(s)") + parser.add_argument( + "-t", dest="table", type=str, nargs="+", help="table(s) for normal (backward) search (i.e. find producers)" + ) + parser.add_argument( + "-w", dest="workflow", type=str, nargs="+", help="workflow(s) for normal (backward) search (i.e. find inputs)" + ) + parser.add_argument( + "-T", dest="table_rev", type=str, nargs="+", help="table(s) for reverse (forward) search (i.e. find consumers)" + ) + parser.add_argument( + "-W", + dest="workflow_rev", + type=str, + nargs="+", + help="workflow(s) for reverse (forward) search (i.e. find outputs)", + ) parser.add_argument( "-c", dest="case", @@ -266,10 +282,12 @@ def main(): help="maximum number of workflow tree levels (default = 0, include all if < 0)", ) args = parser.parse_args() - if not (args.table or args.workflow): + if not (args.table or args.workflow or args.table_rev or args.workflow_rev): parser.error("Provide table(s) and/or workflow(s)") tables = args.table workflows = args.workflow + tables_rev = args.table_rev + workflows_rev = args.workflow_rev case_sensitive = args.case graph_suffix = args.suffix list_exclude = args.exclude @@ -302,27 +320,29 @@ def main(): dic_deps = {} # Find table dependencies - if tables: - for table in tables: - print(f"\nTable: {table}\n") - if not table: - msg_fatal("Bad table") - # producers = get_table_producers(table, dic_wf_all_simple, case_sensitive) - # if not producers: - # print("No producers found") - # return - # print(producers) - # print_workflows(dic_wf_all_simple, producers) - get_tree_for_table(table, dic_wf_all_simple, dic_deps, case_sensitive, n_levels) + for t, reverse in zip((tables, tables_rev), (False, True)): + if t: + for table in t: + print(f"\nTable: {table}\n") + if not table: + msg_fatal("Bad table") + # producers = get_table_producers(table, dic_wf_all_simple, case_sensitive) + # if not producers: + # print("No producers found") + # return + # print(producers) + # print_workflows(dic_wf_all_simple, producers) + get_tree_for_table(table, dic_wf_all_simple, dic_deps, case_sensitive, n_levels, reverse) # Find workflow dependencies - if workflows: - for workflow in workflows: - print(f"\nWorkflow: {workflow}\n") - if not workflow: - msg_fatal("Bad workflow") - # print_workflows(dic_wf_all_simple, [workflow]) - get_tree_for_workflow(workflow, dic_wf_all_simple, dic_deps, case_sensitive, 0, n_levels) + for w, reverse in zip((workflows, workflows_rev), (False, True)): + if w: + for workflow in w: + print(f"\nWorkflow: {workflow}\n") + if not workflow: + msg_fatal("Bad workflow") + # print_workflows(dic_wf_all_simple, [workflow]) + get_tree_for_workflow(workflow, dic_wf_all_simple, dic_deps, case_sensitive, 0, n_levels, reverse) # Print the tree dictionary with dependencies # print("\nTree\n") @@ -330,7 +350,12 @@ def main(): # Produce topology graph. if graph_suffix and dic_deps: - basename = "_".join((tables if tables else []) + (workflows if workflows else [])) + names_all = [] + for names in (tables, tables_rev, workflows, workflows_rev): + if names: + names_all += names + names_all = list(dict.fromkeys(names_all)) # Remove duplicities + basename = "_".join(names_all) # Set a short file name when the full name would be longer than 255 characters. if len(basename) > 251: basename = "o2_dependencies_" + hashlib.sha1(basename.encode(), usedforsecurity=False).hexdigest() @@ -375,7 +400,7 @@ def main(): dot += dot_workflows + dot_tables + dot_deps dot += "}\n" try: - with open(path_file_dot, "w") as file_dot: + with open(path_file_dot, "w", encoding="utf-8") as file_dot: file_dot.write(dot) except IOError: msg_fatal(f"Failed to open file {path_file_dot}") From 867b98c6381f2651c5b7a5d9eead295df7987c62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Fri, 7 Mar 2025 11:44:31 +0100 Subject: [PATCH 0591/1650] [Common] RecoDecay: Fix linter issues (#10169) --- Common/Core/RecoDecay.h | 304 ++++++++++++++++++++-------------------- 1 file changed, 154 insertions(+), 150 deletions(-) diff --git a/Common/Core/RecoDecay.h b/Common/Core/RecoDecay.h index 34b8b7e8bd1..2bdf3b82b60 100644 --- a/Common/Core/RecoDecay.h +++ b/Common/Core/RecoDecay.h @@ -17,15 +17,19 @@ #ifndef COMMON_CORE_RECODECAY_H_ #define COMMON_CORE_RECODECAY_H_ +// C++ includes #include // std::find #include // std::array #include // std::abs, std::sqrt #include -#include // std::move -#include // std::vector +#include // std::move +#include // std::vector -#include "TMCProcess.h" // for VMC Particle Production Process -#include "TPDGCode.h" // for PDG codes +// ROOT includes +#include // for VMC Particle Production Process +#include // for PDG codes + +// O2 includes #include "CommonConstants/MathConstants.h" /// Base class for calculating properties of reconstructed decays @@ -42,7 +46,7 @@ struct RecoDecay { Prompt, NonPrompt }; - static constexpr int8_t PdgStatusCodeAfterFlavourOscillation = 92; // decay products after B0(s) flavour oscillation + static constexpr int8_t StatusCodeAfterFlavourOscillation = 92; // decay products after B0(s) flavour oscillation // Auxiliary functions @@ -425,7 +429,7 @@ struct RecoDecay { static double m2(const std::array, N>& arrMom, const std::array& arrMass) { std::array momTotal{0., 0., 0.}; // candidate momentum vector - double energyTot{0.}; // candidate energy + double energyTot{0.}; // candidate energy for (std::size_t iProng = 0; iProng < N; ++iProng) { for (std::size_t iMom = 0; iMom < 3; ++iMom) { momTotal[iMom] += arrMom[iProng][iMom]; @@ -519,20 +523,20 @@ struct RecoDecay { /// Finds the mother of an MC particle by looking for the expected PDG code in the mother chain. /// \param particlesMC table with MC particles /// \param particle MC particle - /// \param PDGMother expected mother PDG code + /// \param pdgMother expected mother PDG code /// \param acceptAntiParticles switch to accept the antiparticle of the expected mother - /// \param sign antiparticle indicator of the found mother w.r.t. PDGMother; 1 if particle, -1 if antiparticle, 0 if mother not found + /// \param sign antiparticle indicator of the found mother w.r.t. pdgMother; 1 if particle, -1 if antiparticle, 0 if mother not found /// \param depthMax maximum decay tree level to check; Mothers up to this level will be considered. If -1, all levels are considered. /// \return index of the mother particle if found, -1 otherwise template static int getMother(const T& particlesMC, const typename T::iterator& particle, - int PDGMother, + int pdgMother, bool acceptAntiParticles = false, int8_t* sign = nullptr, int8_t depthMax = -1) { - int8_t sgn = 0; // 1 if the expected mother is particle, -1 if antiparticle (w.r.t. PDGMother) + int8_t sgn = 0; // 1 if the expected mother is particle, -1 if antiparticle (w.r.t. pdgMother) int indexMother = -1; // index of the final matched mother, if found int stage = 0; // mother tree level (just for debugging) bool motherFound = false; // true when the desired mother particle is found in the kine tree @@ -548,7 +552,7 @@ struct RecoDecay { while (!motherFound && arrayIds[-stage].size() > 0 && (depthMax < 0 || -stage < depthMax)) { // vector of mother indices for the current stage std::vector arrayIdsStage{}; - for (auto& iPart : arrayIds[-stage]) { // check all the particles that were the mothers at the previous stage + for (auto iPart : arrayIds[-stage]) { // check all the particles that were the mothers at the previous stage, o2-linter: disable=const-ref-in-for-loop (int elements) auto particleMother = particlesMC.rawIteratorAt(iPart - particlesMC.offset()); if (particleMother.has_mothers()) { for (auto iMother = particleMother.mothersIds().front(); iMother <= particleMother.mothersIds().back(); ++iMother) { // loop over the mother particles of the analysed particle @@ -557,17 +561,17 @@ struct RecoDecay { } auto mother = particlesMC.rawIteratorAt(iMother - particlesMC.offset()); // Check mother's PDG code. - auto PDGParticleIMother = mother.pdgCode(); // PDG code of the mother + auto pdgParticleIMother = mother.pdgCode(); // PDG code of the mother // printf("getMother: "); // for (int i = stage; i < 0; i++) // Indent to make the tree look nice. // printf(" "); - // printf("Stage %d: Mother PDG: %d, Index: %d\n", stage, PDGParticleIMother, iMother); - if (PDGParticleIMother == PDGMother) { // exact PDG match + // printf("Stage %d: Mother PDG: %d, Index: %d\n", stage, pdgParticleIMother, iMother); + if (pdgParticleIMother == pdgMother) { // exact PDG match sgn = 1; indexMother = iMother; motherFound = true; break; - } else if (acceptAntiParticles && PDGParticleIMother == -PDGMother) { // antiparticle PDG match + } else if (acceptAntiParticles && pdgParticleIMother == -pdgMother) { // antiparticle PDG match sgn = -1; indexMother = iMother; motherFound = true; @@ -584,8 +588,8 @@ struct RecoDecay { } if (sign) { if constexpr (acceptFlavourOscillation) { - if (std::abs(particle.getGenStatusCode()) == PdgStatusCodeAfterFlavourOscillation) { // take possible flavour oscillation of B0(s) mother into account - sgn *= -1; // select the sign of the mother after oscillation (and not before) + if (std::abs(particle.getGenStatusCode()) == StatusCodeAfterFlavourOscillation) { // take possible flavour oscillation of B0(s) mother into account + sgn *= -1; // select the sign of the mother after oscillation (and not before) } } *sign = sgn; @@ -598,15 +602,15 @@ struct RecoDecay { /// \param checkProcess switch to accept only decay daughters by checking the production process of MC particles /// \param particle MC particle /// \param list vector where the indices of final-state daughters will be added - /// \param arrPDGFinal array of PDG codes of particles to be considered final if found + /// \param arrPdgFinal array of PDG codes of particles to be considered final if found /// \param depthMax maximum decay tree level; Daughters at this level (or beyond) will be considered final. If -1, all levels are considered. /// \param stage decay tree level; If different from 0, the particle itself will be added in the list in case it has no daughters. - /// \note Final state is defined as particles from arrPDGFinal plus final daughters of any other decay branch. - /// \note Antiparticles of particles in arrPDGFinal are accepted as well. + /// \note Final state is defined as particles from arrPdgFinal plus final daughters of any other decay branch. + /// \note Antiparticles of particles in arrPdgFinal are accepted as well. template static void getDaughters(const T& particle, std::vector* list, - const std::array& arrPDGFinal, + const std::array& arrPdgFinal, int8_t depthMax = -1, int8_t stage = 0) { @@ -635,12 +639,12 @@ struct RecoDecay { // If this is not the original particle, we are at the end of this branch and this particle is final. isFinal = true; } - auto PDGParticle = std::abs(particle.pdgCode()); + auto pdgParticle = std::abs(particle.pdgCode()); // If this is not the original particle, check its PDG code. if (!isFinal && stage > 0) { // If the particle has daughters but is considered to be final, we label it as final. - for (auto PDGi : arrPDGFinal) { - if (PDGParticle == std::abs(PDGi)) { // Accept antiparticles. + for (auto pdgI : arrPdgFinal) { // o2-linter: disable=const-ref-in-for-loop (int elements) + if (pdgParticle == std::abs(pdgI)) { // Accept antiparticles. isFinal = true; break; } @@ -651,7 +655,7 @@ struct RecoDecay { // printf("getDaughters: "); // for (int i = 0; i < stage; i++) // Indent to make the tree look nice. // printf(" "); - // printf("Stage %d: Adding %d (PDG %d) as final daughter.\n", stage, index, PDGParticle); + // printf("Stage %d: Adding %d (PDG %d) as final daughter.\n", stage, index, pdgParticle); list->push_back(particle.globalIndex()); return; } @@ -659,11 +663,11 @@ struct RecoDecay { // printf("getDaughters: "); // for (int i = 0; i < stage; i++) // Indent to make the tree look nice. // printf(" "); - // printf("Stage %d: %d (PDG %d) -> %d-%d\n", stage, index, PDGParticle, indexDaughterFirst, indexDaughterLast); + // printf("Stage %d: %d (PDG %d) -> %d-%d\n", stage, index, pdgParticle, indexDaughterFirst, indexDaughterLast); // Call itself to get daughters of daughters recursively. stage++; - for (auto& dau : particle.template daughters_as::parent_t>()) { - getDaughters(dau, list, arrPDGFinal, depthMax, stage); + for (const auto& dau : particle.template daughters_as::parent_t>()) { + getDaughters(dau, list, arrPdgFinal, depthMax, stage); } } @@ -675,10 +679,10 @@ struct RecoDecay { /// \tparam acceptTrackIntWithMaterial switch to accept candidates with final (i.e. p, K, pi) daughter tracks interacting with material /// \param particlesMC table with MC particles /// \param arrDaughters array of candidate daughters - /// \param PDGMother expected mother PDG code - /// \param arrPDGDaughters array of expected daughter PDG codes + /// \param pdgMother expected mother PDG code + /// \param arrPdgDaughters array of expected daughter PDG codes /// \param acceptAntiParticles switch to accept the antiparticle version of the expected decay - /// \param sign antiparticle indicator of the found mother w.r.t. PDGMother; 1 if particle, -1 if antiparticle, 0 if mother not found + /// \param sign antiparticle indicator of the found mother w.r.t. pdgMother; 1 if particle, -1 if antiparticle, 0 if mother not found /// \param depthMax maximum decay tree level to check; Daughters up to this level will be considered. If -1, all levels are considered. /// \param nPiToMu number of pion prongs decayed to a muon /// \param nKaToPi number of kaon prongs decayed to a pion @@ -687,8 +691,8 @@ struct RecoDecay { template static int getMatchedMCRec(const T& particlesMC, const std::array& arrDaughters, - int PDGMother, - std::array arrPDGDaughters, + int pdgMother, + std::array arrPdgDaughters, bool acceptAntiParticles = false, int8_t* sign = nullptr, int depthMax = 1, @@ -696,9 +700,9 @@ struct RecoDecay { int8_t* nKaToPi = nullptr, int8_t* nInteractionsWithMaterial = nullptr) { - // Printf("MC Rec: Expected mother PDG: %d", PDGMother); + // Printf("MC Rec: Expected mother PDG: %d", pdgMother); int8_t coefFlavourOscillation = 1; // 1 if no B0(s) flavour oscillation occured, -1 else - int8_t sgn = 0; // 1 if the expected mother is particle, -1 if antiparticle (w.r.t. PDGMother) + int8_t sgn = 0; // 1 if the expected mother is particle, -1 if antiparticle (w.r.t. pdgMother) int8_t nPiToMuLocal = 0; // number of pion prongs decayed to a muon int8_t nKaToPiLocal = 0; // number of kaon prongs decayed to a pion int8_t nInteractionsWithMaterialLocal = 0; // number of interactions with material @@ -714,9 +718,9 @@ struct RecoDecay { if (!arrDaughters[iProng].has_mcParticle()) { return -1; } - auto particleI = arrDaughters[iProng].mcParticle(); // ith daughter particle - if (std::abs(particleI.getGenStatusCode()) == PdgStatusCodeAfterFlavourOscillation) { // oscillation decay product spotted - coefFlavourOscillation = -1; // select the sign of the mother after oscillation (and not before) + auto particleI = arrDaughters[iProng].mcParticle(); // ith daughter particle + if (std::abs(particleI.getGenStatusCode()) == StatusCodeAfterFlavourOscillation) { // oscillation decay product spotted + coefFlavourOscillation = -1; // select the sign of the mother after oscillation (and not before) break; } } @@ -769,7 +773,7 @@ struct RecoDecay { if (iProng == 0) { // Get the mother index and its sign. // PDG code of the first daughter's mother determines whether the expected mother is a particle or antiparticle. - indexMother = getMother(particlesMC, particleI, PDGMother, acceptAntiParticles, &sgn, depthMax); + indexMother = getMother(particlesMC, particleI, pdgMother, acceptAntiParticles, &sgn, depthMax); // Check whether mother was found. if (indexMother <= -1) { // Printf("MC Rec: Rejected: bad mother index or PDG"); @@ -790,7 +794,7 @@ struct RecoDecay { } } // Get the list of actual final daughters. - getDaughters(particleMother, &arrAllDaughtersIndex, arrPDGDaughters, depthMax); + getDaughters(particleMother, &arrAllDaughtersIndex, arrPdgDaughters, depthMax); // printf("MC Rec: Mother %d has %d final daughters:", indexMother, arrAllDaughtersIndex.size()); // for (auto i : arrAllDaughtersIndex) { // printf(" %d", i); @@ -817,18 +821,18 @@ struct RecoDecay { return -1; } // Check daughter's PDG code. - auto PDGParticleI = particleI.pdgCode(); // PDG code of the ith daughter - // Printf("MC Rec: Daughter %d PDG: %d", iProng, PDGParticleI); - bool isPDGFound = false; // Is the PDG code of this daughter among the remaining expected PDG codes? + auto pdgParticleI = particleI.pdgCode(); // PDG code of the ith daughter + // Printf("MC Rec: Daughter %d PDG: %d", iProng, pdgParticleI); + bool isPdgFound = false; // Is the PDG code of this daughter among the remaining expected PDG codes? for (std::size_t iProngCp = 0; iProngCp < N; ++iProngCp) { - if (PDGParticleI == coefFlavourOscillation * sgn * arrPDGDaughters[iProngCp]) { - arrPDGDaughters[iProngCp] = 0; // Remove this PDG code from the array of expected ones. - isPDGFound = true; + if (pdgParticleI == coefFlavourOscillation * sgn * arrPdgDaughters[iProngCp]) { + arrPdgDaughters[iProngCp] = 0; // Remove this PDG code from the array of expected ones. + isPdgFound = true; break; } } - if (!isPDGFound) { - // Printf("MC Rec: Rejected: bad daughter PDG: %d", PDGParticleI); + if (!isPdgFound) { + // Printf("MC Rec: Rejected: bad daughter PDG: %d", pdgParticleI); return -1; } } @@ -856,57 +860,57 @@ struct RecoDecay { /// \param checkProcess switch to accept only decay daughters by checking the production process of MC particles /// \param particlesMC table with MC particles /// \param candidate candidate MC particle - /// \param PDGParticle expected particle PDG code + /// \param pdgParticle expected particle PDG code /// \param acceptAntiParticles switch to accept the antiparticle - /// \param sign antiparticle indicator of the candidate w.r.t. PDGParticle; 1 if particle, -1 if antiparticle, 0 if not matched + /// \param sign antiparticle indicator of the candidate w.r.t. pdgParticle; 1 if particle, -1 if antiparticle, 0 if not matched /// \return true if PDG code of the particle is correct, false otherwise template static int isMatchedMCGen(const T& particlesMC, const U& candidate, - int PDGParticle, + int pdgParticle, bool acceptAntiParticles = false, int8_t* sign = nullptr) { - std::array arrPDGDaughters; - return isMatchedMCGen(particlesMC, candidate, PDGParticle, std::move(arrPDGDaughters), acceptAntiParticles, sign); + std::array arrPdgDaughters; + return isMatchedMCGen(particlesMC, candidate, pdgParticle, std::move(arrPdgDaughters), acceptAntiParticles, sign); } /// Check whether the MC particle is the expected one and whether it decayed via the expected decay channel. /// \param checkProcess switch to accept only decay daughters by checking the production process of MC particles /// \param particlesMC table with MC particles /// \param candidate candidate MC particle - /// \param PDGParticle expected particle PDG code - /// \param arrPDGDaughters array of expected PDG codes of daughters + /// \param pdgParticle expected particle PDG code + /// \param arrPdgDaughters array of expected PDG codes of daughters /// \param acceptAntiParticles switch to accept the antiparticle - /// \param sign antiparticle indicator of the candidate w.r.t. PDGParticle; 1 if particle, -1 if antiparticle, 0 if not matched + /// \param sign antiparticle indicator of the candidate w.r.t. pdgParticle; 1 if particle, -1 if antiparticle, 0 if not matched /// \param depthMax maximum decay tree level to check; Daughters up to this level will be considered. If -1, all levels are considered. /// \param listIndexDaughters vector of indices of found daughter /// \return true if PDG codes of the particle and its daughters are correct, false otherwise template static bool isMatchedMCGen(const T& particlesMC, const U& candidate, - int PDGParticle, - std::array arrPDGDaughters, + int pdgParticle, + std::array arrPdgDaughters, bool acceptAntiParticles = false, int8_t* sign = nullptr, int depthMax = 1, std::vector* listIndexDaughters = nullptr) { - // Printf("MC Gen: Expected particle PDG: %d", PDGParticle); + // Printf("MC Gen: Expected particle PDG: %d", pdgParticle); int8_t coefFlavourOscillation = 1; // 1 if no B0(s) flavour oscillation occured, -1 else - int8_t sgn = 0; // 1 if the expected mother is particle, -1 if antiparticle (w.r.t. PDGParticle) + int8_t sgn = 0; // 1 if the expected mother is particle, -1 if antiparticle (w.r.t. pdgParticle) if (sign) { *sign = sgn; } // Check the PDG code of the particle. - auto PDGCandidate = candidate.pdgCode(); - // Printf("MC Gen: Candidate PDG: %d", PDGCandidate); - if (PDGCandidate == PDGParticle) { // exact PDG match + auto pdgCandidate = candidate.pdgCode(); + // Printf("MC Gen: Candidate PDG: %d", pdgCandidate); + if (pdgCandidate == pdgParticle) { // exact PDG match sgn = 1; - } else if (acceptAntiParticles && PDGCandidate == -PDGParticle) { // antiparticle PDG match + } else if (acceptAntiParticles && pdgCandidate == -pdgParticle) { // antiparticle PDG match sgn = -1; } else { - // Printf("MC Gen: Rejected: bad particle PDG: %s%d != %d", acceptAntiParticles ? "abs " : "", PDGCandidate, std::abs(PDGParticle)); + // Printf("MC Gen: Rejected: bad particle PDG: %s%d != %d", acceptAntiParticles ? "abs " : "", pdgCandidate, std::abs(pdgParticle)); return false; } // Check the PDG codes of the decay products. @@ -926,7 +930,7 @@ struct RecoDecay { } } // Get the list of actual final daughters. - getDaughters(candidate, &arrAllDaughtersIndex, arrPDGDaughters, depthMax); + getDaughters(candidate, &arrAllDaughtersIndex, arrPdgDaughters, depthMax); // printf("MC Gen: Mother %ld has %ld final daughters:", candidate.globalIndex(), arrAllDaughtersIndex.size()); // for (auto i : arrAllDaughtersIndex) { // printf(" %d", i); @@ -939,29 +943,29 @@ struct RecoDecay { } if constexpr (acceptFlavourOscillation) { // Loop over decay candidate prongs to spot possible oscillation decay product - for (auto indexDaughterI : arrAllDaughtersIndex) { - auto candidateDaughterI = particlesMC.rawIteratorAt(indexDaughterI - particlesMC.offset()); // ith daughter particle - if (std::abs(candidateDaughterI.getGenStatusCode()) == PdgStatusCodeAfterFlavourOscillation) { // oscillation decay product spotted - coefFlavourOscillation = -1; // select the sign of the mother after oscillation (and not before) + for (auto indexDaughterI : arrAllDaughtersIndex) { // o2-linter: disable=const-ref-in-for-loop (int elements) + auto candidateDaughterI = particlesMC.rawIteratorAt(indexDaughterI - particlesMC.offset()); // ith daughter particle + if (std::abs(candidateDaughterI.getGenStatusCode()) == StatusCodeAfterFlavourOscillation) { // oscillation decay product spotted + coefFlavourOscillation = -1; // select the sign of the mother after oscillation (and not before) break; } } } // Check daughters' PDG codes. - for (auto indexDaughterI : arrAllDaughtersIndex) { + for (auto indexDaughterI : arrAllDaughtersIndex) { // o2-linter: disable=const-ref-in-for-loop (int elements) auto candidateDaughterI = particlesMC.rawIteratorAt(indexDaughterI - particlesMC.offset()); // ith daughter particle - auto PDGCandidateDaughterI = candidateDaughterI.pdgCode(); // PDG code of the ith daughter - // Printf("MC Gen: Daughter %d PDG: %d", indexDaughterI, PDGCandidateDaughterI); - bool isPDGFound = false; // Is the PDG code of this daughter among the remaining expected PDG codes? + auto pdgCandidateDaughterI = candidateDaughterI.pdgCode(); // PDG code of the ith daughter + // Printf("MC Gen: Daughter %d PDG: %d", indexDaughterI, pdgCandidateDaughterI); + bool isPdgFound = false; // Is the PDG code of this daughter among the remaining expected PDG codes? for (std::size_t iProngCp = 0; iProngCp < N; ++iProngCp) { - if (PDGCandidateDaughterI == coefFlavourOscillation * sgn * arrPDGDaughters[iProngCp]) { - arrPDGDaughters[iProngCp] = 0; // Remove this PDG code from the array of expected ones. - isPDGFound = true; + if (pdgCandidateDaughterI == coefFlavourOscillation * sgn * arrPdgDaughters[iProngCp]) { + arrPdgDaughters[iProngCp] = 0; // Remove this PDG code from the array of expected ones. + isPdgFound = true; break; } } - if (!isPDGFound) { - // Printf("MC Gen: Rejected: bad daughter PDG: %d", PDGCandidateDaughterI); + if (!isPdgFound) { + // Printf("MC Gen: Rejected: bad daughter PDG: %d", pdgCandidateDaughterI); return false; } } @@ -994,23 +998,23 @@ struct RecoDecay { std::vector> arrayIds{}; std::vector initVec{particle.globalIndex()}; arrayIds.push_back(initVec); // the first vector contains the index of the original particle - auto PDGParticle = std::abs(particle.pdgCode()); + auto pdgParticle = std::abs(particle.pdgCode()); bool couldBePrompt = false; - if (PDGParticle / 100 == 4 || PDGParticle / 1000 == 4) { + if (pdgParticle / 100 == kCharm || pdgParticle / 1000 == kCharm) { couldBePrompt = true; } while (arrayIds[-stage].size() > 0) { // vector of mother indices for the current stage std::vector arrayIdsStage{}; - for (auto& iPart : arrayIds[-stage]) { // check all the particles that were the mothers at the previous stage + for (auto iPart : arrayIds[-stage]) { // check all the particles that were the mothers at the previous stage, o2-linter: disable=const-ref-in-for-loop (int elements) auto particleMother = particlesMC.rawIteratorAt(iPart - particlesMC.offset()); if (particleMother.has_mothers()) { // we exit immediately if searchUpToQuark is false and the first mother is a parton (an hadron should never be the mother of a parton) if (!searchUpToQuark) { auto mother = particlesMC.rawIteratorAt(particleMother.mothersIds().front() - particlesMC.offset()); - auto PDGParticleIMother = std::abs(mother.pdgCode()); // PDG code of the mother - if (PDGParticleIMother < 9 || (PDGParticleIMother > 20 && PDGParticleIMother < 38)) { + auto pdgParticleIMother = std::abs(mother.pdgCode()); // PDG code of the mother + if (pdgParticleIMother < 9 || (pdgParticleIMother > 20 && pdgParticleIMother < 38)) { return OriginType::Prompt; } } @@ -1021,30 +1025,30 @@ struct RecoDecay { } auto mother = particlesMC.rawIteratorAt(iMother - particlesMC.offset()); // Check mother's PDG code. - auto PDGParticleIMother = std::abs(mother.pdgCode()); // PDG code of the mother + auto pdgParticleIMother = std::abs(mother.pdgCode()); // PDG code of the mother // printf("getMother: "); // for (int i = stage; i < 0; i++) // Indent to make the tree look nice. // printf(" "); - // printf("Stage %d: Mother PDG: %d, Index: %d\n", stage, PDGParticleIMother, iMother); + // printf("Stage %d: Mother PDG: %d, Index: %d\n", stage, pdgParticleIMother, iMother); if (searchUpToQuark) { if (idxBhadMothers) { - if (PDGParticleIMother / 100 == 5 || // b mesons - PDGParticleIMother / 1000 == 5) // b baryons + if (pdgParticleIMother / 100 == kBottom || // b mesons + pdgParticleIMother / 1000 == kBottom) // b baryons { idxBhadMothers->push_back(iMother); } } - if (PDGParticleIMother == 5) { // b quark + if (pdgParticleIMother == kBottom) { // b quark return OriginType::NonPrompt; } - if (PDGParticleIMother == 4) { // c quark + if (pdgParticleIMother == kCharm) { // c quark return OriginType::Prompt; } } else { if ( - (PDGParticleIMother / 100 == 5 || // b mesons - PDGParticleIMother / 1000 == 5) // b baryons + (pdgParticleIMother / 100 == kBottom || // b mesons + pdgParticleIMother / 1000 == kBottom) // b baryons ) { if (idxBhadMothers) { idxBhadMothers->push_back(iMother); @@ -1052,8 +1056,8 @@ struct RecoDecay { return OriginType::NonPrompt; } if ( - (PDGParticleIMother / 100 == 4 || // c mesons - PDGParticleIMother / 1000 == 4) // c baryons + (pdgParticleIMother / 100 == kCharm || // c mesons + pdgParticleIMother / 1000 == kCharm) // c baryons ) { couldBePrompt = true; } @@ -1092,33 +1096,33 @@ struct RecoDecay { std::vector> arrayIds{}; std::vector initVec{particle.globalIndex()}; arrayIds.push_back(initVec); // the first vector contains the index of the original particle - auto PDGParticle = std::abs(particle.pdgCode()); + auto pdgParticle = std::abs(particle.pdgCode()); bool couldBeCharm = false; - if (PDGParticle / 100 == 4 || PDGParticle / 1000 == 4) { + if (pdgParticle / 100 == kCharm || pdgParticle / 1000 == kCharm) { couldBeCharm = true; } while (arrayIds[-stage].size() > 0) { // vector of mother indices for the current stage std::vector arrayIdsStage{}; - for (auto& iPart : arrayIds[-stage]) { // check all the particles that were the mothers at the previous stage + for (auto iPart : arrayIds[-stage]) { // check all the particles that were the mothers at the previous stage, o2-linter: disable=const-ref-in-for-loop (int elements) auto particleMother = particlesMC.rawIteratorAt(iPart - particlesMC.offset()); if (particleMother.has_mothers()) { // we break immediately if searchUpToQuark is false and the first mother is a parton (an hadron should never be the mother of a parton) if (!searchUpToQuark) { auto mother = particlesMC.rawIteratorAt(particleMother.mothersIds().front() - particlesMC.offset()); - auto PDGParticleIMother = std::abs(mother.pdgCode()); // PDG code of the mother - if (PDGParticleIMother < 9 || (PDGParticleIMother > 20 && PDGParticleIMother < 38)) { + auto pdgParticleIMother = std::abs(mother.pdgCode()); // PDG code of the mother + if (pdgParticleIMother < 9 || (pdgParticleIMother > 20 && pdgParticleIMother < 38)) { // auto PDGPaticle = std::abs(particleMother.pdgCode()); if ( - (PDGParticle / 100 == 5 || // b mesons - PDGParticle / 1000 == 5) // b baryons + (pdgParticle / 100 == kBottom || // b mesons + pdgParticle / 1000 == kBottom) // b baryons ) { return OriginType::NonPrompt; // beauty } if ( - (PDGParticle / 100 == 4 || // c mesons - PDGParticle / 1000 == 4) // c baryons + (pdgParticle / 100 == kCharm || // c mesons + pdgParticle / 1000 == kCharm) // c baryons ) { return OriginType::Prompt; // charm } @@ -1133,31 +1137,31 @@ struct RecoDecay { auto mother = particlesMC.rawIteratorAt(iMother - particlesMC.offset()); // Check status code // auto motherStatusCode = std::abs(mother.getGenStatusCode()); - auto PDGParticleIMother = std::abs(mother.pdgCode()); // PDG code of the mother + auto pdgParticleIMother = std::abs(mother.pdgCode()); // PDG code of the mother // Check mother's PDG code. // printf("getMother: "); // for (int i = stage; i < 0; i++) // Indent to make the tree look nice. // printf(" "); - // printf("Stage %d: Mother PDG: %d, status: %d, Index: %d\n", stage, PDGParticleIMother, motherStatusCode, iMother); + // printf("Stage %d: Mother PDG: %d, status: %d, Index: %d\n", stage, pdgParticleIMother, motherStatusCode, iMother); if (searchUpToQuark) { if (idxBhadMothers) { - if (PDGParticleIMother / 100 == 5 || // b mesons - PDGParticleIMother / 1000 == 5) // b baryons + if (pdgParticleIMother / 100 == kBottom || // b mesons + pdgParticleIMother / 1000 == kBottom) // b baryons { idxBhadMothers->push_back(iMother); } } - if (PDGParticleIMother == 5) { // b quark - return OriginType::NonPrompt; // beauty + if (pdgParticleIMother == kBottom) { // b quark + return OriginType::NonPrompt; // beauty } - if (PDGParticleIMother == 4) { // c quark - return OriginType::Prompt; // charm + if (pdgParticleIMother == kCharm) { // c quark + return OriginType::Prompt; // charm } } else { if ( - (PDGParticleIMother / 100 == 5 || // b mesons - PDGParticleIMother / 1000 == 5) // b baryons + (pdgParticleIMother / 100 == kBottom || // b mesons + pdgParticleIMother / 1000 == kBottom) // b baryons ) { if (idxBhadMothers) { idxBhadMothers->push_back(iMother); @@ -1165,8 +1169,8 @@ struct RecoDecay { return OriginType::NonPrompt; // beauty } if ( - (PDGParticleIMother / 100 == 4 || // c mesons - PDGParticleIMother / 1000 == 4) // c baryons + (pdgParticleIMother / 100 == kCharm || // c mesons + pdgParticleIMother / 1000 == kCharm) // c baryons ) { couldBeCharm = true; } @@ -1394,41 +1398,41 @@ struct RecoDecayPtEtaPhiBase { return y(vec, vec[indexM]); } - /// Test consistency of calculations of kinematic quantities - /// \param pxIn px - /// \param pyIn py - /// \param pzIn pz - /// \param mIn mass - template - static void test(T pxIn, T pyIn, T pzIn, TM mIn) - { - std::array vecXYZ{pxIn, pyIn, pzIn}; - std::array vecXYZ0{0, 0, 0}; - std::array vecPtEtaPhi; - std::array vecPtEtaPhiM; - setVectorFromVariables(vecPtEtaPhi, RecoDecay::pt(vecXYZ), RecoDecay::eta(vecXYZ), RecoDecay::phi(vecXYZ)); - setVectorFromVariables(vecPtEtaPhiM, RecoDecay::pt(vecXYZ), RecoDecay::eta(vecXYZ), RecoDecay::phi(vecXYZ)); - vecPtEtaPhiM[3] = mIn; - auto vecXYZFromVec = pVector(vecPtEtaPhi); - auto vecXYZFromVars = pVector(pt(vecPtEtaPhi), eta(vecPtEtaPhi), phi(vecPtEtaPhi)); - // Test px, py, pz, pt, p, eta, phi, e, y, m - printf("RecoDecay test\n"); - printf("px: In: %g, XYZ: %g, XYZ from vec: %g, XYZ from vars: %g, PtEtaPhi: %g, PtEtaPhiM: %g\n", pxIn, vecXYZ[0], vecXYZFromVec[0], vecXYZFromVars[0], px(vecPtEtaPhi), px(vecPtEtaPhiM)); - printf("py: In: %g, XYZ: %g, XYZ from vec: %g, XYZ from vars: %g, PtEtaPhi: %g, PtEtaPhiM: %g\n", pyIn, vecXYZ[1], vecXYZFromVec[1], vecXYZFromVars[1], py(vecPtEtaPhi), py(vecPtEtaPhiM)); - printf("pz: In: %g, XYZ: %g, XYZ from vec: %g, XYZ from vars: %g, PtEtaPhi: %g, PtEtaPhiM: %g\n", pzIn, vecXYZ[2], vecXYZFromVec[2], vecXYZFromVars[2], pz(vecPtEtaPhi), pz(vecPtEtaPhiM)); - printf("pt: XYZ: %g, PtEtaPhi: %g, PtEtaPhiM: %g\n", RecoDecay::pt(vecXYZ), pt(vecPtEtaPhi), pt(vecPtEtaPhiM)); - printf("p: XYZ: %g, PtEtaPhi: %g, PtEtaPhiM: %g\n", RecoDecay::p(vecXYZ), p(vecPtEtaPhi), p(vecPtEtaPhiM)); - printf("eta: XYZ: %g, PtEtaPhi: %g, PtEtaPhiM: %g\n", RecoDecay::eta(vecXYZ), eta(vecPtEtaPhi), eta(vecPtEtaPhiM)); - printf("phi: XYZ: %g, PtEtaPhi: %g, PtEtaPhiM: %g\n", RecoDecay::phi(vecXYZ), phi(vecPtEtaPhi), phi(vecPtEtaPhiM)); - printf("e: XYZ: %g, PtEtaPhi: %g, PtEtaPhiM: %g\n", RecoDecay::e(vecXYZ, mIn), e(vecPtEtaPhi, mIn), e(vecPtEtaPhiM)); - printf("y: XYZ: %g, PtEtaPhi: %g, PtEtaPhiM: %g\n", RecoDecay::y(vecXYZ, mIn), y(vecPtEtaPhi, mIn), y(vecPtEtaPhiM)); - printf("m: In: %g, XYZ(p, E): %g, XYZ(pVec, E): %g, XYZ(arr): %g, PtEtaPhiM: %g\n", - mIn, - RecoDecay::m(RecoDecay::p(vecXYZ), RecoDecay::e(vecXYZ, mIn)), - RecoDecay::m(vecXYZ, RecoDecay::e(vecXYZ, mIn)), - RecoDecay::m(std::array{vecXYZ, vecXYZ0}, std::array{mIn, 0.}), - vecPtEtaPhiM[indexM]); - } + // /// Test consistency of calculations of kinematic quantities + // /// \param pxIn px + // /// \param pyIn py + // /// \param pzIn pz + // /// \param mIn mass + // template + // static void test(T pxIn, T pyIn, T pzIn, TM mIn) + // { + // std::array vecXYZ{pxIn, pyIn, pzIn}; + // std::array vecXYZ0{0, 0, 0}; + // std::array vecPtEtaPhi; + // std::array vecPtEtaPhiM; + // setVectorFromVariables(vecPtEtaPhi, RecoDecay::pt(vecXYZ), RecoDecay::eta(vecXYZ), RecoDecay::phi(vecXYZ)); + // setVectorFromVariables(vecPtEtaPhiM, RecoDecay::pt(vecXYZ), RecoDecay::eta(vecXYZ), RecoDecay::phi(vecXYZ)); + // vecPtEtaPhiM[3] = mIn; + // auto vecXYZFromVec = pVector(vecPtEtaPhi); + // auto vecXYZFromVars = pVector(pt(vecPtEtaPhi), eta(vecPtEtaPhi), phi(vecPtEtaPhi)); + // // Test px, py, pz, pt, p, eta, phi, e, y, m + // printf("RecoDecay test\n"); + // printf("px: In: %g, XYZ: %g, XYZ from vec: %g, XYZ from vars: %g, PtEtaPhi: %g, PtEtaPhiM: %g\n", pxIn, vecXYZ[0], vecXYZFromVec[0], vecXYZFromVars[0], px(vecPtEtaPhi), px(vecPtEtaPhiM)); + // printf("py: In: %g, XYZ: %g, XYZ from vec: %g, XYZ from vars: %g, PtEtaPhi: %g, PtEtaPhiM: %g\n", pyIn, vecXYZ[1], vecXYZFromVec[1], vecXYZFromVars[1], py(vecPtEtaPhi), py(vecPtEtaPhiM)); + // printf("pz: In: %g, XYZ: %g, XYZ from vec: %g, XYZ from vars: %g, PtEtaPhi: %g, PtEtaPhiM: %g\n", pzIn, vecXYZ[2], vecXYZFromVec[2], vecXYZFromVars[2], pz(vecPtEtaPhi), pz(vecPtEtaPhiM)); + // printf("pt: XYZ: %g, PtEtaPhi: %g, PtEtaPhiM: %g\n", RecoDecay::pt(vecXYZ), pt(vecPtEtaPhi), pt(vecPtEtaPhiM)); + // printf("p: XYZ: %g, PtEtaPhi: %g, PtEtaPhiM: %g\n", RecoDecay::p(vecXYZ), p(vecPtEtaPhi), p(vecPtEtaPhiM)); + // printf("eta: XYZ: %g, PtEtaPhi: %g, PtEtaPhiM: %g\n", RecoDecay::eta(vecXYZ), eta(vecPtEtaPhi), eta(vecPtEtaPhiM)); + // printf("phi: XYZ: %g, PtEtaPhi: %g, PtEtaPhiM: %g\n", RecoDecay::phi(vecXYZ), phi(vecPtEtaPhi), phi(vecPtEtaPhiM)); + // printf("e: XYZ: %g, PtEtaPhi: %g, PtEtaPhiM: %g\n", RecoDecay::e(vecXYZ, mIn), e(vecPtEtaPhi, mIn), e(vecPtEtaPhiM)); + // printf("y: XYZ: %g, PtEtaPhi: %g, PtEtaPhiM: %g\n", RecoDecay::y(vecXYZ, mIn), y(vecPtEtaPhi, mIn), y(vecPtEtaPhiM)); + // printf("m: In: %g, XYZ(p, E): %g, XYZ(pVec, E): %g, XYZ(arr): %g, PtEtaPhiM: %g\n", + // mIn, + // RecoDecay::m(RecoDecay::p(vecXYZ), RecoDecay::e(vecXYZ, mIn)), + // RecoDecay::m(vecXYZ, RecoDecay::e(vecXYZ, mIn)), + // RecoDecay::m(std::array{vecXYZ, vecXYZ0}, std::array{mIn, 0.}), + // vecPtEtaPhiM[indexM]); + // } }; using RecoDecayPtEtaPhi = RecoDecayPtEtaPhiBase<>; // alias for instance with default parameters From cefeca85b8339db0f526196fec766792916228a2 Mon Sep 17 00:00:00 2001 From: Jesper Gumprecht <113693781+jesgum@users.noreply.github.com> Date: Fri, 7 Mar 2025 12:53:25 +0100 Subject: [PATCH 0592/1650] [ALICE3] Changes to configurables and histograms in multi-charm task (#10361) --- ALICE3/TableProducer/alice3-multicharm.cxx | 29 ++++++++++++++-------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/ALICE3/TableProducer/alice3-multicharm.cxx b/ALICE3/TableProducer/alice3-multicharm.cxx index 71be5256362..661deec3c29 100644 --- a/ALICE3/TableProducer/alice3-multicharm.cxx +++ b/ALICE3/TableProducer/alice3-multicharm.cxx @@ -82,8 +82,8 @@ struct alice3multicharm { Configurable magneticField{"magneticField", 20.0f, "Magnetic field (in kilogauss)"}; Configurable doDCAplots{"doDCAplots", true, "do daughter prong DCA plots for D mesons"}; Configurable mcSameMotherCheck{"mcSameMotherCheck", true, "check if tracks come from the same MC mother"}; - Configurable dcaXiCDaughtersSelection{"dcaXiCDaughtersSelection", 200.0f, "DCA between XiC daughters (cm)"}; - Configurable dcaXiCCDaughtersSelection{"dcaXiCCDaughtersSelection", 200.0f, "DCA between XiCC daughters (cm)"}; + Configurable dcaXiCDaughtersSelection{"dcaXiCDaughtersSelection", 0.002f, "DCA between XiC daughters (cm)"}; + Configurable dcaXiCCDaughtersSelection{"dcaXiCCDaughtersSelection", 0.002f, "DCA between XiCC daughters (cm)"}; Configurable piFromXiC_dcaXYconstant{"piFromXiC_dcaXYconstant", 0.001f, "[0] in |DCAxy| > [0]+[1]/pT"}; Configurable piFromXiC_dcaXYpTdep{"piFromXiC_dcaXYpTdep", 0.0, "[1] in |DCAxy| > [0]+[1]/pT"}; @@ -94,6 +94,7 @@ struct alice3multicharm { Configurable minPiCPt{"minPiCPt", 0.15, "Minimum pT for XiC pions"}; Configurable minPiCCPt{"minPiCCPt", 0.3, "Minimum pT for XiCC pions"}; + Configurable minMultiplicity{"minMultiplicity", 0, "Minimum multiplicity"}; Configurable minXiCRadius{"minXiCRadius", 0.001, "Minimum R2D for XiC decay (cm)"}; Configurable massWindowXi{"massWindowXi", 0.015, "Mass window around Xi peak"}; @@ -107,8 +108,8 @@ struct alice3multicharm { ConfigurableAxis axisXiCMass{"axisXiCMass", {200, 2.368f, 2.568f}, "XiC Inv Mass (GeV/c^{2})"}; ConfigurableAxis axisXiCCMass{"axisXiCCMass", {200, 3.521f, 3.721f}, "XiCC Inv Mass (GeV/c^{2})"}; - ConfigurableAxis axisDCAXiCDaughters{"axisDCAXiCDaughters", {200, 0, 100}, "DCA (cm)"}; - ConfigurableAxis axisDCAXiCCDaughters{"axisDCAXiCCDaughters", {200, 0, 100}, "DCA (cm)"}; + ConfigurableAxis axisDCAXiCDaughters{"axisDCAXiCDaughters", {200, 0, 100}, "DCA (mum)"}; + ConfigurableAxis axisDCAXiCCDaughters{"axisDCAXiCCDaughters", {200, 0, 100}, "DCA (mum)"}; ConfigurableAxis axisNConsidered{"axisNConsidered", {200, -0.5f, 199.5f}, "Number of considered track combinations"}; @@ -395,7 +396,7 @@ struct alice3multicharm { // CombinationsXiCC: doublets XiC-pi considered per XiC histos.add("hCombinationsXiC", "hCombinationsXiC", kTH1D, {axisNConsidered}); histos.add("hCombinationsXiCC", "hCombinationsXiCC", kTH1D, {axisNConsidered}); - + histos.add("hNCollisions", "hNCollisions", kTH1D, {{2, 0.5, 2.5}}); if (doDCAplots) { histos.add("h2dDCAxyVsPtXiFromXiC", "h2dDCAxyVsPtXiFromXiC", kTH2D, {axisPt, axisDCA}); histos.add("h2dDCAxyVsPtPiFromXiC", "h2dDCAxyVsPtPiFromXiC", kTH2D, {axisPt, axisDCA}); @@ -419,6 +420,12 @@ struct alice3multicharm { //*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+* void processFindXiCC(aod::Collision const& collision, alice3tracks const& tracks, aod::McParticles const&, aod::UpgradeCascades const& cascades) { + histos.fill(HIST("hNCollisions"), 1); + if (tracks.size() < minMultiplicity) + return; + + histos.fill(HIST("hNCollisions"), 2); + // group with this collision // n.b. cascades do not need to be grouped, being used directly in iterator-grouping auto tracksPiFromXiCgrouped = tracksPiFromXiC->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); @@ -448,7 +455,7 @@ struct alice3multicharm { continue; // out of mass region uint32_t nCombinationsC = 0; - auto xi = xiCand.cascadeTrack_as(); // de-reference cascade track + auto xi = xiCand.cascadeTrack_as(); // de-reference cascade track auto piFromXi = xiCand.bachTrack_as(); // de-reference bach track auto piFromLa = xiCand.negTrack_as(); // de-reference neg track auto prFromLa = xiCand.posTrack_as(); // de-reference pos track @@ -481,7 +488,7 @@ struct alice3multicharm { nCombinationsC++; histos.fill(HIST("hCharmBuilding"), 0.0f); - if (!buildDecayCandidateThreeBody(xi, pi1c, pi2c, 1.32171, 0.139570, 0.139570)) + if (!buildDecayCandidateThreeBody(xi, pi1c, pi2c, o2::constants::physics::MassXiMinus, o2::constants::physics::MassPionCharged, o2::constants::physics::MassPionCharged)) continue; // failed at building candidate if (std::abs(thisXiCcandidate.mass - o2::constants::physics::MassXiCPlus) > massWindowXiC) @@ -510,7 +517,7 @@ struct alice3multicharm { } histos.fill(HIST("hMassXiC"), thisXiCcandidate.mass); - histos.fill(HIST("hDCAXiCDaughters"), thisXiCcandidate.dca); + histos.fill(HIST("hDCAXiCDaughters"), thisXiCcandidate.dca * 1e+4); // attempt XiCC finding uint32_t nCombinationsCC = 0; @@ -525,15 +532,15 @@ struct alice3multicharm { o2::track::TrackParCov piccTrack = getTrackParCov(picc); nCombinationsCC++; histos.fill(HIST("hCharmBuilding"), 2.0f); - if (!buildDecayCandidateTwoBody(xicTrack, piccTrack, 2.46793, 0.139570)) + if (!buildDecayCandidateTwoBody(xicTrack, piccTrack, o2::constants::physics::MassXiCPlus, o2::constants::physics::MassPionCharged)) continue; // failed at building candidate - histos.fill(HIST("hCharmBuilding"), 3.0f); + histos.fill(HIST("hCharmBuilding"), 3.0f); histos.fill(HIST("hMassXiCC"), thisXiCCcandidate.mass); histos.fill(HIST("hPtXiCC"), thisXiCCcandidate.pt); histos.fill(HIST("hEtaXiCC"), thisXiCCcandidate.eta); histos.fill(HIST("h3dMassXiCC"), thisXiCCcandidate.pt, thisXiCCcandidate.eta, thisXiCCcandidate.mass); - histos.fill(HIST("hDCAXiCCDaughters"), thisXiCCcandidate.dca); + histos.fill(HIST("hDCAXiCCDaughters"), thisXiCCcandidate.dca * 1e+4); const std::array momentumCC = { thisXiCCcandidate.prong0mom[0] + thisXiCCcandidate.prong1mom[0], From 6d4e48e1387a972b38f54d0e9aee7d31f4b494d6 Mon Sep 17 00:00:00 2001 From: Ionut Cristian Arsene Date: Fri, 7 Mar 2025 13:41:56 +0100 Subject: [PATCH 0593/1650] Add inv mass of dilepton candidate to the B meson table (#10380) Co-authored-by: Ionut Cristian Arsene --- PWGDQ/Tasks/dqEfficiency_withAssoc.cxx | 5 +++-- PWGDQ/Tasks/tableReader_withAssoc.cxx | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx index 9e50ca50be6..753d42aa92d 100644 --- a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx +++ b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx @@ -73,6 +73,7 @@ DECLARE_SOA_COLUMN(MuonAmbiguityOutOfBunch, muonAmbiguityOutOfBunch, int8_t); DECLARE_SOA_BITMAP_COLUMN(IsBarrelSelectedPrefilter, isBarrelSelectedPrefilter, 32); //! Barrel prefilter decisions (joinable to ReducedTracksAssoc) // Bcandidate columns for ML analysis of B->Jpsi+K DECLARE_SOA_COLUMN(massBcandidate, MBcandidate, float); +DECLARE_SOA_COLUMN(MassDileptonCandidate, massDileptonCandidate, float); DECLARE_SOA_COLUMN(deltaMassBcandidate, deltaMBcandidate, float); DECLARE_SOA_COLUMN(pTBcandidate, PtBcandidate, float); DECLARE_SOA_COLUMN(LxyBcandidate, lxyBcandidate, float); @@ -103,7 +104,7 @@ DECLARE_SOA_TABLE(MuonTrackCuts, "AOD", "DQANAMUONCUTS", dqanalysisflags::IsMuon DECLARE_SOA_TABLE(MuonAmbiguities, "AOD", "DQMUONAMB", dqanalysisflags::MuonAmbiguityInBunch, dqanalysisflags::MuonAmbiguityOutOfBunch); //! joinable to ReducedMuonTracks DECLARE_SOA_TABLE(Prefilter, "AOD", "DQPREFILTER", dqanalysisflags::IsBarrelSelectedPrefilter); //! joinable to ReducedTracksAssoc DECLARE_SOA_TABLE(BmesonCandidates, "AOD", "DQBMESONS", - dqanalysisflags::massBcandidate, dqanalysisflags::deltaMassBcandidate, dqanalysisflags::pTBcandidate, + dqanalysisflags::massBcandidate, dqanalysisflags::MassDileptonCandidate, dqanalysisflags::deltaMassBcandidate, dqanalysisflags::pTBcandidate, dqanalysisflags::LxyBcandidate, dqanalysisflags::LxyzBcandidate, dqanalysisflags::LzBcandidate, dqanalysisflags::TauxyBcandidate, dqanalysisflags::TauzBcandidate, dqanalysisflags::DCAxyzBetweenProngs, dqanalysisflags::CosPBcandidate, dqanalysisflags::Chi2Bcandidate, @@ -3629,7 +3630,7 @@ struct AnalysisDileptonTrack { } // end loop over track cuts } // end loop over dilepton cuts // table to be written out for ML analysis - BmesonsTable(fValuesHadron[VarManager::kPairMass], fValuesHadron[VarManager::kDeltaMass], fValuesHadron[VarManager::kPairPt], + BmesonsTable(fValuesHadron[VarManager::kPairMass], dilepton.mass(), fValuesHadron[VarManager::kDeltaMass], fValuesHadron[VarManager::kPairPt], fValuesHadron[VarManager::kVertexingLxy], fValuesHadron[VarManager::kVertexingLxyz], fValuesHadron[VarManager::kVertexingLz], fValuesHadron[VarManager::kVertexingTauxy], fValuesHadron[VarManager::kVertexingTauz], fValuesHadron[VarManager::kKFDCAxyzBetweenProngs], fValuesHadron[VarManager::kCosPointingAngle], fValuesHadron[VarManager::kVertexingChi2PCA], dilepton.filterMap_raw(), trackSelection, mcDecision); diff --git a/PWGDQ/Tasks/tableReader_withAssoc.cxx b/PWGDQ/Tasks/tableReader_withAssoc.cxx index e457acb6f7d..694b4bf9073 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.cxx +++ b/PWGDQ/Tasks/tableReader_withAssoc.cxx @@ -81,6 +81,7 @@ DECLARE_SOA_COLUMN(MuonAmbiguityOutOfBunch, muonAmbiguityOutOfBunch, int8_t); DECLARE_SOA_BITMAP_COLUMN(IsBarrelSelectedPrefilter, isBarrelSelectedPrefilter, 32); //! Barrel prefilter decisions (joinable to ReducedTracksAssoc) // Bcandidate columns for ML analysis of B->Jpsi+K DECLARE_SOA_COLUMN(massBcandidate, MBcandidate, float); +DECLARE_SOA_COLUMN(MassDileptonCandidate, massDileptonCandidate, float); DECLARE_SOA_COLUMN(deltamassBcandidate, deltaMBcandidate, float); DECLARE_SOA_COLUMN(pTBcandidate, PtBcandidate, float); DECLARE_SOA_COLUMN(LxyBcandidate, lxyBcandidate, float); @@ -109,7 +110,7 @@ DECLARE_SOA_TABLE(MuonTrackCuts, "AOD", "DQANAMUONCUTSA", dqanalysisflags::IsMuo DECLARE_SOA_TABLE(MuonAmbiguities, "AOD", "DQMUONAMBA", dqanalysisflags::MuonAmbiguityInBunch, dqanalysisflags::MuonAmbiguityOutOfBunch); //! joinable to ReducedMuonTracks DECLARE_SOA_TABLE(Prefilter, "AOD", "DQPREFILTERA", dqanalysisflags::IsBarrelSelectedPrefilter); //! joinable to ReducedTracksAssoc DECLARE_SOA_TABLE(BmesonCandidates, "AOD", "DQBMESONSA", - dqanalysisflags::massBcandidate, dqanalysisflags::deltamassBcandidate, dqanalysisflags::pTBcandidate, + dqanalysisflags::massBcandidate, dqanalysisflags::MassDileptonCandidate, dqanalysisflags::deltamassBcandidate, dqanalysisflags::pTBcandidate, dqanalysisflags::LxyBcandidate, dqanalysisflags::LxyzBcandidate, dqanalysisflags::LzBcandidate, dqanalysisflags::TauxyBcandidate, dqanalysisflags::TauzBcandidate, dqanalysisflags::CosPBcandidate, dqanalysisflags::Chi2Bcandidate, dqanalysisflags::IsJpsiFromBSelected, dqanalysisflags::IsBarrelSelected); @@ -3177,7 +3178,7 @@ struct AnalysisDileptonTrack { } // end loop over track cuts } // end loop over dilepton cuts // table to be written out for ML analysis - BmesonsTable(fValuesHadron[VarManager::kPairMass], fValuesHadron[VarManager::kDeltaMass], fValuesHadron[VarManager::kPairPt], + BmesonsTable(fValuesHadron[VarManager::kPairMass], dilepton.mass(), fValuesHadron[VarManager::kDeltaMass], fValuesHadron[VarManager::kPairPt], fValuesHadron[VarManager::kVertexingLxy], fValuesHadron[VarManager::kVertexingLxyz], fValuesHadron[VarManager::kVertexingLz], fValuesHadron[VarManager::kVertexingTauxy], fValuesHadron[VarManager::kVertexingTauz], fValuesHadron[VarManager::kCosPointingAngle], fValuesHadron[VarManager::kVertexingChi2PCA], dilepton.filterMap_raw(), trackSelection); From 8f07e6a3a2a4e6c13bd4a3b9cd7c60a403b4970e Mon Sep 17 00:00:00 2001 From: Samuele Cattaruzzi <124249902+scattaru@users.noreply.github.com> Date: Fri, 7 Mar 2025 15:34:28 +0100 Subject: [PATCH 0594/1650] [PWGHF] DS-h correlation, adding TPC crossed rows check in efficiency process (#10375) --- PWGHF/HFC/TableProducer/correlatorDsHadronsReduced.cxx | 4 ++++ PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/PWGHF/HFC/TableProducer/correlatorDsHadronsReduced.cxx b/PWGHF/HFC/TableProducer/correlatorDsHadronsReduced.cxx index f24bc1d5880..31fd99530c2 100644 --- a/PWGHF/HFC/TableProducer/correlatorDsHadronsReduced.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDsHadronsReduced.cxx @@ -116,6 +116,10 @@ struct HfCorrelatorDsHadronsReduced { registry.fill(HIST("hEtaVsPtCand"), candidate.etaCand(), candidate.ptCand()); entryDsCandRecoInfo(candidate.invMassDs(), candidate.ptCand(), candidate.bdtScorePrompt(), candidate.bdtScoreBkg()); for (const auto& track : tracksThisColl) { + // Removing Ds daughters by checking track indices + if ((candidate.prong0Id() == track.originTrackId()) || (candidate.prong1Id() == track.originTrackId()) || (candidate.prong2Id() == track.originTrackId())) { + continue; + } registry.fill(HIST("hTracksPoolBin"), poolBin); registry.fill(HIST("hPhiVsPtPartAssoc"), RecoDecay::constrainAngle(track.phiAssocTrack(), -PIHalf), candidate.ptCand(), track.ptAssocTrack()); registry.fill(HIST("hEtaVsPtPartAssoc"), track.etaAssocTrack(), candidate.ptCand(), track.ptAssocTrack()); diff --git a/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx b/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx index f8bf2fff6d6..76c4f88c04c 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx @@ -910,7 +910,7 @@ struct HfTaskCorrelationDsHadrons { // reconstructed track loop for (const auto& track : groupedTracks) { - if (!track.isGlobalTrackWoDCA()) { + if (!track.isGlobalTrackWoDCA() || track.tpcNClsCrossedRows() < nTpcCrossedRaws) { continue; } if (track.has_mcParticle()) { From 4786b0f58c3341efac03d243f40c8bda24ba0208 Mon Sep 17 00:00:00 2001 From: Zuzanna Chochulska <87480906+zchochul@users.noreply.github.com> Date: Fri, 7 Mar 2025 15:42:21 +0100 Subject: [PATCH 0595/1650] PWGCF: FemtoUniverse -- removing unused registries (#10381) Co-authored-by: Zuzanna <01150674@pw.edu.pl> --- PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx index f29ae2a882b..0999d3a82c9 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx @@ -144,12 +144,10 @@ struct FemtoUniversePairTaskTrackPhi { /// Histogramming for particle 1 FemtoUniverseParticleHisto trackHistoPartTrack; - FemtoUniverseParticleHisto hMCTruth1; FemtoUniverseParticleHisto hTrackDCA; /// Histogramming for particle 2 FemtoUniverseParticleHisto trackHistoPartPhi; - FemtoUniverseParticleHisto hMCTruth2; /// Histogramming for Event FemtoUniverseEventHisto eventHisto; @@ -375,8 +373,6 @@ struct FemtoUniversePairTaskTrackPhi { void init(InitContext&) { if (ConfIsMC) { - hMCTruth1.init(&qaRegistry, ConfBinsTempFitVarpT, ConfBinsTempFitVarPDG, false, ConfTrackPDGCode, false); - hMCTruth2.init(&qaRegistry, ConfBinsTempFitVarpT, ConfBinsTempFitVarPDG, false, 333, false); hTrackDCA.init(®istryDCA, ConfBinsTempFitVarpT, ConfBinsTempFitVarDCA, true, ConfTrackPDGCode, true); registryMCpT.add("MCReco/C_phi_pT", "; #it{p_T} (GeV/#it{c}); Counts", kTH1F, {{100, 0, 10}}); From f384f13421b4353090f42a8c5be53c581aa9436a Mon Sep 17 00:00:00 2001 From: fuchuncui <162277233+fuchuncui@users.noreply.github.com> Date: Fri, 7 Mar 2025 22:51:07 +0800 Subject: [PATCH 0596/1650] [PWGCF] Add PDGCode check (#10376) --- PWGCF/Flow/Tasks/flowEfficiencyCasc.cxx | 54 +++++++++++++++---------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowEfficiencyCasc.cxx b/PWGCF/Flow/Tasks/flowEfficiencyCasc.cxx index 2dc6f8f51ce..1587a3b386c 100644 --- a/PWGCF/Flow/Tasks/flowEfficiencyCasc.cxx +++ b/PWGCF/Flow/Tasks/flowEfficiencyCasc.cxx @@ -61,10 +61,10 @@ struct FlowEfficiencyCasc { O2_DEFINE_CONFIGURABLE(cfgcasc_dcav0dau, float, 1.0f, "maximum DCA among V0 daughters") O2_DEFINE_CONFIGURABLE(cfgcasc_mlambdawindow, float, 0.04f, "Invariant mass window of lambda") // track quality and type selections - O2_DEFINE_CONFIGURABLE(cfgtpcclusters, int, 70, "minimum number of TPC clusters requirement") - O2_DEFINE_CONFIGURABLE(cfgitsclusters, int, 1, "minimum number of ITS clusters requirement") - O2_DEFINE_CONFIGURABLE(cfgtpcclufindable, int, 1, "minimum number of findable TPC clusters") - O2_DEFINE_CONFIGURABLE(cfgtpccrossoverfindable, int, 1, "minimum number of Ratio crossed rows over findable clusters") + O2_DEFINE_CONFIGURABLE(cfgtpcclusters, int, 0, "minimum number of TPC clusters requirement") + O2_DEFINE_CONFIGURABLE(cfgitsclusters, int, 0, "minimum number of ITS clusters requirement") + O2_DEFINE_CONFIGURABLE(cfgtpcclufindable, int, 0, "minimum number of findable TPC clusters") + O2_DEFINE_CONFIGURABLE(cfgtpccrossoverfindable, int, 0, "minimum number of Ratio crossed rows over findable clusters") O2_DEFINE_CONFIGURABLE(cfgcheckDauTPC, bool, true, "check daughter tracks TPC or not") O2_DEFINE_CONFIGURABLE(cfgcheckDauTOF, bool, false, "check daughter tracks TOF or not") O2_DEFINE_CONFIGURABLE(cfgCasc_rapidity, float, 0.5, "rapidity") @@ -114,6 +114,7 @@ struct FlowEfficiencyCasc { for (const auto& casc : Cascades) { if (!casc.has_cascMCCore()) continue; + auto cascMC = casc.cascMCCore_as>(); auto negdau = casc.negTrackExtra_as(); auto posdau = casc.posTrackExtra_as(); auto bachelor = casc.bachTrackExtra_as(); @@ -148,26 +149,32 @@ struct FlowEfficiencyCasc { if (std::fabs(casc.mLambda() - o2::constants::physics::MassLambda0) > cfgcasc_mlambdawindow) continue; // Omega and antiOmega - if (casc.sign() < 0 && (casc.mOmega() > 1.63) && (casc.mOmega() < 1.71) && std::fabs(casc.yOmega()) < cfgCasc_rapidity && - (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { - registry.fill(HIST("h2DRecOmega"), casc.pt(), rectracknum); - } else if (casc.sign() < 0 && (casc.mOmega() > 1.63) && (casc.mOmega() < 1.71) && std::fabs(casc.yOmega()) < cfgCasc_rapidity && - (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0]))) { - registry.fill(HIST("h2DRecOmega"), casc.pt(), rectracknum); + int pdgCode{cascMC.pdgCode()}; + if (std::abs(pdgCode) == kOmegaMinus && std::abs(cascMC.pdgCodeV0()) == kLambda0 && std::abs(cascMC.pdgCodeBachelor()) == kKPlus) { + if (casc.sign() < 0 && (casc.mOmega() > 1.63) && (casc.mOmega() < 1.71) && std::fabs(casc.yOmega()) < cfgCasc_rapidity && + (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { + registry.fill(HIST("h2DRecOmega"), casc.pt(), rectracknum); + } else if (casc.sign() < 0 && (casc.mOmega() > 1.63) && (casc.mOmega() < 1.71) && std::fabs(casc.yOmega()) < cfgCasc_rapidity && + (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0]))) { + registry.fill(HIST("h2DRecOmega"), casc.pt(), rectracknum); + } } // Xi and antiXi - if (casc.sign() < 0 && (casc.mXi() > 1.30) && (casc.mXi() < 1.37) && std::fabs(casc.yXi()) < cfgCasc_rapidity && - (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { - registry.fill(HIST("h2DRecXi"), casc.pt(), rectracknum); - } else if (casc.sign() < 0 && (casc.mXi() > 1.30) && (casc.mXi() < 1.37) && std::fabs(casc.yXi()) < cfgCasc_rapidity && - (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0]))) { - registry.fill(HIST("h2DRecXi"), casc.pt(), rectracknum); + if (std::abs(pdgCode) == kXiMinus && std::abs(cascMC.pdgCodeV0()) == kLambda0 && std::abs(cascMC.pdgCodeBachelor()) == kPiPlus) { + if (casc.sign() < 0 && (casc.mXi() > 1.30) && (casc.mXi() < 1.37) && std::fabs(casc.yXi()) < cfgCasc_rapidity && + (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { + registry.fill(HIST("h2DRecXi"), casc.pt(), rectracknum); + } else if (casc.sign() < 0 && (casc.mXi() > 1.30) && (casc.mXi() < 1.37) && std::fabs(casc.yXi()) < cfgCasc_rapidity && + (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0]))) { + registry.fill(HIST("h2DRecXi"), casc.pt(), rectracknum); + } } } for (const auto& v0 : V0s) { if (!v0.has_v0MCCore()) continue; + auto v0MC = v0.v0MCCore_as>(); auto v0negdau = v0.negTrackExtra_as(); auto v0posdau = v0.posTrackExtra_as(); @@ -198,18 +205,23 @@ struct FlowEfficiencyCasc { if (std::fabs(v0.dcanegtopv()) < cfgv0_dcadautopv) continue; + int pdgCode{v0MC.pdgCode()}; // K0short - if (v0.qtarm() / std::fabs(v0.alpha()) > cfgv0_ArmPodocut && std::fabs(v0.y()) < 0.5 && std::fabs(v0.mK0Short() - o2::constants::physics::MassK0Short) < cfgv0_mk0swindow && - (!cfgcheckDauTPC || (std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { - registry.fill(HIST("h2DRecK0s"), v0.pt(), rectracknum); + if (std::abs(pdgCode) == kK0Short && v0MC.pdgCodePositive() == kPiPlus && v0MC.pdgCodeNegative() == kPiMinus) { + if (v0.qtarm() / std::fabs(v0.alpha()) > cfgv0_ArmPodocut && std::fabs(v0.y()) < 0.5 && std::fabs(v0.mK0Short() - o2::constants::physics::MassK0Short) < cfgv0_mk0swindow && + (!cfgcheckDauTPC || (std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { + registry.fill(HIST("h2DRecK0s"), v0.pt(), rectracknum); + } } // Lambda and antiLambda if (std::fabs(v0.y()) < 0.5 && std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < cfgv0_mlambdawindow && (!cfgcheckDauTPC || (std::fabs(v0posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { - registry.fill(HIST("h2DRecLambda"), v0.pt(), rectracknum); + if (std::abs(pdgCode) == kLambda0 && v0MC.pdgCodePositive() == kProton && v0MC.pdgCodeNegative() == kPiMinus) + registry.fill(HIST("h2DRecLambda"), v0.pt(), rectracknum); } else if (std::fabs(v0.y()) < 0.5 && std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < cfgv0_mlambdawindow && (!cfgcheckDauTPC || (std::fabs(v0negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0]))) { - registry.fill(HIST("h2DRecLambda"), v0.pt(), rectracknum); + if (std::abs(pdgCode) == kLambda0 && v0MC.pdgCodePositive() == kPiPlus && v0MC.pdgCodeNegative() == kProtonBar) + registry.fill(HIST("h2DRecLambda"), v0.pt(), rectracknum); } } } From 9d173985e3befe9b812283b0086623a957464c86 Mon Sep 17 00:00:00 2001 From: Preet-Bhanjan Date: Fri, 7 Mar 2025 15:51:23 +0100 Subject: [PATCH 0597/1650] [PWGCF] Added the loadcorrections function (#10379) Co-authored-by: Preet Pati --- PWGCF/Flow/Tasks/flowPbpbPikp.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/PWGCF/Flow/Tasks/flowPbpbPikp.cxx b/PWGCF/Flow/Tasks/flowPbpbPikp.cxx index e76754a837e..f30622dacc5 100644 --- a/PWGCF/Flow/Tasks/flowPbpbPikp.cxx +++ b/PWGCF/Flow/Tasks/flowPbpbPikp.cxx @@ -467,6 +467,7 @@ struct FlowPbpbPikp { float weff = 1; int pidIndex; + loadCorrections(bc); for (auto const& track : tracks) { double pt = track.pt(); From ed1fe393f2981e1aec0036ef1a621993dd5ba0ca Mon Sep 17 00:00:00 2001 From: AlexianL <123153896+AlexianL@users.noreply.github.com> Date: Fri, 7 Mar 2025 16:49:44 +0100 Subject: [PATCH 0598/1650] [PWGHF] taskFlow.cxx: remove unused plots, remove cut, remove some CorrelationContainers (#10383) --- PWGHF/HFC/Tasks/taskFlow.cxx | 500 ++++++++--------------------------- 1 file changed, 106 insertions(+), 394 deletions(-) diff --git a/PWGHF/HFC/Tasks/taskFlow.cxx b/PWGHF/HFC/Tasks/taskFlow.cxx index ff58422ab14..6b54f6d8944 100644 --- a/PWGHF/HFC/Tasks/taskFlow.cxx +++ b/PWGHF/HFC/Tasks/taskFlow.cxx @@ -68,13 +68,10 @@ struct HfTaskFlow { Configurable ptTpcTrackMin{"ptTpcTrackMin", 0.5f, "min. pT of TPC tracks"}; // configurables for HF candidates Configurable etaCandidateMax{"etaCandidateMax", 0.8f, "max. eta of HF candidate"}; - Configurable ptCandidateMax{"ptCandidateMax", 8.0f, "max. pT of candidates"}; - Configurable ptCandidateMin{"ptCandidateMin", 2.0f, "min. pT of candidates"}; Configurable selectionFlagD0{"selectionFlagD0", 1, "Selection Flag for D0"}; Configurable selectionFlagD0bar{"selectionFlagD0bar", 1, "Selection Flag for D0bar"}; Configurable selectionFlagLcToPKPi{"selectionFlagLcToPKPi", 1, "Selection Flag for LambdaC"}; Configurable selectionFlagLcToPiKP{"selectionFlagLcToPiKP", 1, "Selection Flag for LambdaC bar"}; - Configurable yCandMax{"yCandMax", -1., "max. cand. rapidity"}; Configurable> binsPt{"binsPt", std::vector{hf_cuts_d0_to_pi_k::vecBinsPt}, "pT bin limits"}; // configurables for MFT tracks Configurable etaMftTrackMax{"etaMftTrackMax", 0, "Maximum value for the eta of MFT tracks"}; @@ -102,7 +99,7 @@ struct HfTaskFlow { // Kata adds subscribes to it but do not add it in the join // using FilteredCollisionsWSelMultMC = soa::Filtered>; using FilteredCollisionsWSelMultMC = soa::Filtered>; - using FilteredMcCollisions = soa::Filtered; + using FilteredMcCollisions = soa::Filtered>; using FilteredMcParticles = soa::Filtered; using TracksWDcaSelMC = soa::Filtered>; @@ -176,18 +173,22 @@ struct HfTaskFlow { HistogramRegistry registry{"registry"}; // Correlation containers used for data - OutputObj sameTPCTPCChCh{"sameTPCTPCChCh"}; - OutputObj mixedTPCTPCChCh{"mixedTPCTPCChCh"}; - OutputObj sameTPCTPCHfCh{"sameTPCTPCHfCh"}; // I still keep only one Correlation Container for HF, whether is D0 or Lc - OutputObj mixedTPCTPCHfCh{"mixedTPCTPCHfCh"}; // Because only one should be run at the same time - OutputObj sameTPCMFTChCh{"sameTPCMFTChCh"}; - OutputObj mixedTPCMFTChCh{"mixedTPCMFTChCh"}; - OutputObj sameTPCMFTHfCh{"sameTPCMFTHfCh"}; // I still keep only one Correlation Container for HF, whether is D0 or Lc - OutputObj mixedTPCMFTHfCh{"mixedTPCMFTHfCh"}; // Because only one should be run at the same time + OutputObj sameEvent{"sameEvent"}; + OutputObj mixedEvent{"mixedEvent"}; + OutputObj sameEventHf{"sameEventHf"}; + OutputObj mixedEventHf{"mixedEventHf"}; + // OutputObj sameTPCTPCChCh{"sameTPCTPCChCh"}; + // OutputObj mixedTPCTPCChCh{"mixedTPCTPCChCh"}; + // OutputObj sameTPCTPCHfCh{"sameTPCTPCHfCh"}; // I still keep only one Correlation Container for HF, whether is D0 or Lc + // OutputObj mixedTPCTPCHfCh{"mixedTPCTPCHfCh"}; // Because only one should be run at the same time + // OutputObj sameTPCMFTChCh{"sameTPCMFTChCh"}; + // OutputObj mixedTPCMFTChCh{"mixedTPCMFTChCh"}; + // OutputObj sameTPCMFTHfCh{"sameTPCMFTHfCh"}; // I still keep only one Correlation Container for HF, whether is D0 or Lc + // OutputObj mixedTPCMFTHfCh{"mixedTPCMFTHfCh"}; // Because only one should be run at the same time // Correlation containers used for Monte-Carlo - OutputObj sameTPCTPCChChMC{"sameTPCTPCChChMC"}; - OutputObj mixedTPCTPCChChMC{"mixedTPCTPCChChMC"}; + // OutputObj sameTPCTPCChChMC{"sameTPCTPCChChMC"}; + // OutputObj mixedTPCTPCChChMC{"mixedTPCTPCChChMC"}; // ========================= // init() @@ -198,13 +199,12 @@ struct HfTaskFlow { // Event histograms // TO-DO : do i have to separate event histograms between DATA and MC ? // ========================= - constexpr int kNBinsEvents = 3; + constexpr int kNBinsEvents = 2; registry.add("Data/hEventCounter", "hEventCounter", {HistType::kTH1F, {{kNBinsEvents, 0.5, 0.5 + kNBinsEvents}}}); // set axes of the event counter histogram std::string labels[kNBinsEvents]; labels[0] = "all"; - labels[1] = "after trigger selection (Run 2)"; - labels[2] = "after Physics selection"; + labels[1] = "after Physics selection"; const int nBinsMix = axisMultiplicity->size() * 14; // 14 bins for z-vertex @@ -227,7 +227,6 @@ struct HfTaskFlow { registry.add("Data/TpcTpc/HadronHadron/SameEvent/hPhi", "phi", {HistType::kTH1F, {{100, 0, TwoPI, "#varphi"}}}); registry.add("Data/TpcTpc/HadronHadron/SameEvent/hYields", "multiplicity vs pT vs eta", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {40, 0, 20, "p_{T}"}, {100, -2, 2, "#eta"}}}); registry.add("Data/TpcTpc/HadronHadron/SameEvent/hEtaPhi", "multiplicity vs eta vs phi", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {100, -2, 2, "#eta"}, {200, 0, TwoPI, "#varphi"}}}); - // registry.add("Data/TpcTpc/HadronHadron/SameEvent/hNtracks", "hNtracks", {HistType::kTH1F, {{500, 0, 500}}}); // Katarina had this : registry.add("Data/TpcTpc/HadronHadron/SameEvent/hVzEta", "eta vs. Vz", {HistType::kTH2F, {{100, -4, 4, "#eta"}, {20, -10, 10, "Vz"}}}); @@ -259,19 +258,8 @@ struct HfTaskFlow { registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hPtProng1", "2-prong candidates;prong 1 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{100, 0, 10.}}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hMassVsPt", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{500, 0., 5.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hMass", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hDecLength", "2-prong candidates;decay length (cm);entries", {HistType::kTH2F, {{200, 0., 2.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hDecLengthXY", "2-prong candidates;decay length xy (cm);entries", {HistType::kTH2F, {{200, 0., 2.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hd0Prong0", "2-prong candidates;prong 0 DCAxy to prim. vertex (cm);entries", {HistType::kTH2F, {{100, -1., 1.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hd0Prong1", "2-prong candidates;prong 1 DCAxy to prim. vertex (cm);entries", {HistType::kTH2F, {{100, -1., 1.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hd0d0", "2-prong candidates;product of DCAxy to prim. vertex (cm^{2});entries", {HistType::kTH2F, {{500, -1., 1.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hCTS", "2-prong candidates;cos #it{#theta}* (D^{0});entries", {HistType::kTH2F, {{110, -1.1, 1.1}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hCt", "2-prong candidates;proper lifetime (D^{0}) * #it{c} (cm);entries", {HistType::kTH2F, {{120, -20., 100.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hCPA", "2-prong candidates;cosine of pointing angle;entries", {HistType::kTH2F, {{110, -1.1, 1.1}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hEtaCandVsPt", "2-prong candidates;candidate #it{#eta};entries", {HistType::kTH2F, {{100, -2., 2.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hSelectionStatus", "2-prong candidates;selection status;entries", {HistType::kTH2F, {{5, -0.5, 4.5}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hImpParErr", "2-prong candidates;impact parameter error (cm);entries", {HistType::kTH2F, {{100, -1., 1.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hDecLenErr", "2-prong candidates;decay length error (cm);entries", {HistType::kTH2F, {{100, 0., 1.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hDecLenXYErr", "2-prong candidates;decay length xy error (cm);entries", {HistType::kTH2F, {{100, 0., 1.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); // ========================= // DATA : histograms for TPC-TPC HF-h case for 3PRONG @@ -281,38 +269,16 @@ struct HfTaskFlow { registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hMassVsPt", "3-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{500, 0., 5.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hMass", "3-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hMassVsPtVsMult", "3-prong candidates;inv. mass (p K #pi) (GeV/#it{c}^{2}); p_{T}; multiplicity", {HistType::kTH3F, {{600, 1.98, 2.58}, {vbins, "#it{p}_{T} (GeV/#it{c})"}, {5000, 0., 10000.}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hd0VsPtProng0", "3-prong candidates;prong 0 DCAxy to prim. vertex (cm);entries", {HistType::kTH2F, {{600, -0.4, 0.4}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hd0VsPtProng1", "3-prong candidates;prong 1 DCAxy to prim. vertex (cm);entries", {HistType::kTH2F, {{600, -0.4, 0.4}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hd0VsPtProng2", "3-prong candidates;prong 2 DCAxy to prim. vertex (cm);entries", {HistType::kTH2F, {{600, -0.4, 0.4}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hMultiplicity", "multiplicity;multiplicity;entries", {HistType::kTH1F, {{500, 0, 500}}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPt", "3-prong candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{360, 0., 36.}}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPtProng0", "3-prong candidates;prong 0 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{360, 0., 36.}}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPtProng1", "3-prong candidates;prong 1 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{360, 0., 36.}}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPtProng2", "3-prong candidates;prong 2 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{360, 0., 36.}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hd0Prong0", "3-prong candidates;prong 0 DCAxy to prim. vertex (cm);entries", {HistType::kTH1F, {{600, -0.4, 0.4}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hd0Prong1", "3-prong candidates;prong 1 DCAxy to prim. vertex (cm);entries", {HistType::kTH1F, {{600, -0.4, 0.4}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hd0Prong2", "3-prong candidates;prong 2 DCAxy to prim. vertex (cm);entries", {HistType::kTH1F, {{600, -0.4, 0.4}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hDecLength", "3-prong candidates;decay length (cm);entries", {HistType::kTH1F, {{400, 0., 1.}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hDecLengthxy", "3-prong candidates;decay length xy (cm);entries", {HistType::kTH1F, {{400, 0., 1.}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hCt", "3-prong candidates;proper lifetime (#Lambda_{c}) * #it{c} (cm);entries", {HistType::kTH1F, {{100, 0., 0.2}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hCPA", "3-prong candidates;cosine of pointing angle;entries", {HistType::kTH1F, {{110, -1.1, 1.1}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hCPAxy", "3-prong candidates;cosine of pointing angle xy;entries", {HistType::kTH1F, {{110, -1.1, 1.1}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hDca2", "3-prong candidates;prong Chi2PCA to sec. vertex (cm);entries", {HistType::kTH1F, {{400, 0., 20.}}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hEta", "3-prong candidates;#it{#eta};entries", {HistType::kTH1F, {{100, -2., 2.}}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPhi", "3-prong candidates;#it{#Phi};entries", {HistType::kTH1F, {{100, 0., 6.3}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hDecLengthVsPt", "3-prong candidates;decay length (cm);entries", {HistType::kTH2F, {{400, 0., 1.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hDecLengthxyVsPt", "3-prong candidates;decay length xy(cm);entries", {HistType::kTH2F, {{400, 0., 1.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hCtVsPt", "3-prong candidates;proper lifetime (#Lambda_{c}) * #it{c} (cm);entries", {HistType::kTH2F, {{100, 0., 0.2}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hCPAVsPt", "3-prong candidates;cosine of pointing angle;entries", {HistType::kTH2F, {{110, -1.1, 1.1}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hCPAxyVsPt", "3-prong candidates;cosine of pointing angle xy;entries", {HistType::kTH2F, {{110, -1.1, 1.1}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hDca2VsPt", "3-prong candidates;prong Chi2PCA to sec. vertex (cm);entries", {HistType::kTH2F, {{400, 0., 20.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hEtaVsPt", "3-prong candidates;candidate #it{#eta};entries", {HistType::kTH2F, {{100, -2., 2.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPhiVsPt", "3-prong candidates;candidate #it{#Phi};entries", {HistType::kTH2F, {{100, 0., 6.3}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hSelectionStatus", "3-prong candidates;selection status;entries", {HistType::kTH2F, {{5, -0.5, 4.5}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hImpParErrProng0", "3-prong candidates;prong 0 impact parameter error (cm);entries", {HistType::kTH2F, {{100, -1., 1.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hImpParErrProng1", "3-prong candidates;prong 1 impact parameter error (cm);entries", {HistType::kTH2F, {{100, -1., 1.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hImpParErrProng2", "3-prong candidates;prong 2 impact parameter error (cm);entries", {HistType::kTH2F, {{100, -1., 1.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hDecLenErr", "3-prong candidates;decay length error (cm);entries", {HistType::kTH2F, {{100, 0., 1.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); // ========================= // DATA : histograms for TPC-MFT h-h case @@ -325,7 +291,6 @@ struct HfTaskFlow { registry.add("Data/TpcMft/HadronHadron/SameEvent/hPhiTPC", "phiTPC", {HistType::kTH1F, {{100, 0, TwoPI, "#varphi"}}}); registry.add("Data/TpcMft/HadronHadron/SameEvent/hPtTPC", "pT", {HistType::kTH1F, {{100, 0, 10, "p_{T}"}}}); registry.add("Data/TpcMft/HadronHadron/SameEvent/hYieldsTPC", "multiplicity vs pT vs eta", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {40, 0, 20, "p_{T}"}, {100, -2, 2, "#eta"}}}); - // registry.add("Data/TpcMft/HadronHadron/SameEvent/hNtracksTPC", "hNtracks", {HistType::kTH1F, {{500, 0, 500}}}); registry.add("Data/TpcMft/HadronHadron/SameEvent/hMultiplicityTPC", "multiplicity;multiplicity;entries", {HistType::kTH1F, {{500, 0, 500}}}); // DATA : associated particles (MFT tracks) histograms for TPC-MFT h-h same event @@ -334,7 +299,6 @@ struct HfTaskFlow { registry.add("Data/TpcMft/HadronHadron/SameEvent/hPhiMFT", "phiMFT", {HistType::kTH1F, {{100, 0, TwoPI, "#varphi"}}}); registry.add("Data/TpcMft/HadronHadron/SameEvent/hPtMFT", "pT", {HistType::kTH1F, {{100, 0, 10, "p_{T}"}}}); registry.add("Data/TpcMft/HadronHadron/SameEvent/hYieldsMFT", "multiplicity vs pT vs eta", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {40, 0, 20, "p_{T}"}, {100, -5, 0, "#eta"}}}); - // registry.add("Data/TpcMft/HadronHadron/SameEvent/hNtracksMFT", "hNtracks", {HistType::kTH1F, {{500, 0, 500}}}); // DATA : histograms for TPC-MFT h-h event mixing for events QA registry.add("Data/TpcMft/HadronHadron/MixedEvent/hEventCountMixing", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); @@ -350,7 +314,6 @@ struct HfTaskFlow { registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hPhiCandidate", "phiTPC", {HistType::kTH1F, {{100, 0, TwoPI, "#varphi"}}}); registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hYieldsCandidate", "multiplicity vs pT vs eta", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {40, 0, 20, "p_{T}"}, {100, -2, 2, "#eta"}}}); registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hMultiplicityCandidate", "multiplicity;multiplicity;entries", {HistType::kTH1F, {{500, 0, 500}}}); - // registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hNtracksCandidate", "hNtracks", {HistType::kTH1F, {{500, 0, 500}}}); // DATA : trigger particles (candidates) histograms for TPC-MFT HF-h same event registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hPtCandidate", "2-prong candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{100, 0, 10.}}}); @@ -358,19 +321,8 @@ struct HfTaskFlow { registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hPtProng1", "2-prong candidates;prong 1 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{100, 0, 10.}}}); registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hMassVsPt", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{500, 0., 5.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hMass", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hDecLength", "2-prong candidates;decay length (cm);entries", {HistType::kTH2F, {{200, 0., 2.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hDecLengthXY", "2-prong candidates;decay length xy (cm);entries", {HistType::kTH2F, {{200, 0., 2.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hd0Prong0", "2-prong candidates;prong 0 DCAxy to prim. vertex (cm);entries", {HistType::kTH2F, {{100, -1., 1.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hd0Prong1", "2-prong candidates;prong 1 DCAxy to prim. vertex (cm);entries", {HistType::kTH2F, {{100, -1., 1.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hd0d0", "2-prong candidates;product of DCAxy to prim. vertex (cm^{2});entries", {HistType::kTH2F, {{500, -1., 1.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hCTS", "2-prong candidates;cos #it{#theta}* (D^{0});entries", {HistType::kTH2F, {{110, -1.1, 1.1}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hCt", "2-prong candidates;proper lifetime (D^{0}) * #it{c} (cm);entries", {HistType::kTH2F, {{120, -20., 100.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hCPA", "2-prong candidates;cosine of pointing angle;entries", {HistType::kTH2F, {{110, -1.1, 1.1}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hEtaCandVsPt", "2-prong candidates;candidate #it{#eta};entries", {HistType::kTH2F, {{100, -2., 2.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hSelectionStatus", "2-prong candidates;selection status;entries", {HistType::kTH2F, {{5, -0.5, 4.5}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hImpParErr", "2-prong candidates;impact parameter error (cm);entries", {HistType::kTH2F, {{100, -1., 1.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hDecLenErr", "2-prong candidates;decay length error (cm);entries", {HistType::kTH2F, {{100, 0., 1.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hDecLenXYErr", "2-prong candidates;decay length xy error (cm);entries", {HistType::kTH2F, {{100, 0., 1.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); // DATA : associated particles (MFT tracks) histograms for TPC-MFT h-h same event registry.add("Data/TpcMft/HfHadron/SameEvent/hEtaPhiMFT", "multiplicity vs eta vs phi in MFT", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {100, -2, 2, "#eta"}, {200, 0, TwoPI, "#varphi"}}}); @@ -378,7 +330,6 @@ struct HfTaskFlow { registry.add("Data/TpcMft/HfHadron/SameEvent/hPhiMFT", "phiMFT", {HistType::kTH1F, {{100, 0, TwoPI, "#varphi"}}}); registry.add("Data/TpcMft/HfHadron/SameEvent/hPtMFT", "pT", {HistType::kTH1F, {{100, 0, 10, "p_{T}"}}}); registry.add("Data/TpcMft/HfHadron/SameEvent/hYieldsMFT", "multiplicity vs pT vs eta", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {40, 0, 20, "p_{T}"}, {100, -5, 0, "#eta"}}}); - // registry.add("Data/TpcMft/HfHadron/SameEvent/hNtracksMFT", "hNtracks", {HistType::kTH1F, {{500, 0, 500}}}); // DATA : histograms for TPC-MFT h-h event mixing for events QA registry.add("Data/TpcMft/HfHadron/MixedEvent/hEventCountMixing", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); @@ -390,42 +341,19 @@ struct HfTaskFlow { registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hEventCountSame", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hYieldsCandidate", "multiplicity vs pT vs eta", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {40, 0, 20, "p_{T}"}, {100, -2, 2, "#eta"}}}); registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hMultiplicityCandidate", "multiplicity;multiplicity;entries", {HistType::kTH1F, {{500, 0, 500}}}); - // registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hNtracksCandidate", "hNtracks", {HistType::kTH1F, {{500, 0, 500}}}); registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hEtaPhiCandidate", "multiplicity vs eta vs phi in TPC", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {100, -2, 2, "#eta"}, {200, 0, TwoPI, "#varphi"}}}); registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hMassVsPt", "3-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{500, 0., 5.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hMass", "3-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hMassVsPtVsMult", "3-prong candidates;inv. mass (p K #pi) (GeV/#it{c}^{2}); p_{T}; multiplicity", {HistType::kTH3F, {{600, 1.98, 2.58}, {vbins, "#it{p}_{T} (GeV/#it{c})"}, {5000, 0., 10000.}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hd0VsPtProng0", "3-prong candidates;prong 0 DCAxy to prim. vertex (cm);entries", {HistType::kTH2F, {{600, -0.4, 0.4}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hd0VsPtProng1", "3-prong candidates;prong 1 DCAxy to prim. vertex (cm);entries", {HistType::kTH2F, {{600, -0.4, 0.4}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hd0VsPtProng2", "3-prong candidates;prong 2 DCAxy to prim. vertex (cm);entries", {HistType::kTH2F, {{600, -0.4, 0.4}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hPt", "3-prong candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{360, 0., 36.}}}); registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hPtProng0", "3-prong candidates;prong 0 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{360, 0., 36.}}}); registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hPtProng1", "3-prong candidates;prong 1 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{360, 0., 36.}}}); registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hPtProng2", "3-prong candidates;prong 2 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{360, 0., 36.}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hd0Prong0", "3-prong candidates;prong 0 DCAxy to prim. vertex (cm);entries", {HistType::kTH1F, {{600, -0.4, 0.4}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hd0Prong1", "3-prong candidates;prong 1 DCAxy to prim. vertex (cm);entries", {HistType::kTH1F, {{600, -0.4, 0.4}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hd0Prong2", "3-prong candidates;prong 2 DCAxy to prim. vertex (cm);entries", {HistType::kTH1F, {{600, -0.4, 0.4}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hDecLength", "3-prong candidates;decay length (cm);entries", {HistType::kTH1F, {{400, 0., 1.}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hDecLengthxy", "3-prong candidates;decay length xy (cm);entries", {HistType::kTH1F, {{400, 0., 1.}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hCt", "3-prong candidates;proper lifetime (#Lambda_{c}) * #it{c} (cm);entries", {HistType::kTH1F, {{100, 0., 0.2}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hCPA", "3-prong candidates;cosine of pointing angle;entries", {HistType::kTH1F, {{110, -1.1, 1.1}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hCPAxy", "3-prong candidates;cosine of pointing angle xy;entries", {HistType::kTH1F, {{110, -1.1, 1.1}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hDca2", "3-prong candidates;prong Chi2PCA to sec. vertex (cm);entries", {HistType::kTH1F, {{400, 0., 20.}}}); registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hEta", "3-prong candidates;#it{#eta};entries", {HistType::kTH1F, {{100, -2., 2.}}}); registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hPhi", "3-prong candidates;#it{#Phi};entries", {HistType::kTH1F, {{100, 0., 6.3}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hDecLengthVsPt", "3-prong candidates;decay length (cm);entries", {HistType::kTH2F, {{400, 0., 1.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hDecLengthxyVsPt", "3-prong candidates;decay length xy(cm);entries", {HistType::kTH2F, {{400, 0., 1.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hCtVsPt", "3-prong candidates;proper lifetime (#Lambda_{c}) * #it{c} (cm);entries", {HistType::kTH2F, {{100, 0., 0.2}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hCPAVsPt", "3-prong candidates;cosine of pointing angle;entries", {HistType::kTH2F, {{110, -1.1, 1.1}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hCPAxyVsPt", "3-prong candidates;cosine of pointing angle xy;entries", {HistType::kTH2F, {{110, -1.1, 1.1}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hDca2VsPt", "3-prong candidates;prong Chi2PCA to sec. vertex (cm);entries", {HistType::kTH2F, {{400, 0., 20.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hEtaVsPt", "3-prong candidates;candidate #it{#eta};entries", {HistType::kTH2F, {{100, -2., 2.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hPhiVsPt", "3-prong candidates;candidate #it{#Phi};entries", {HistType::kTH2F, {{100, 0., 6.3}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hSelectionStatus", "3-prong candidates;selection status;entries", {HistType::kTH2F, {{5, -0.5, 4.5}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hImpParErrProng0", "3-prong candidates;prong 0 impact parameter error (cm);entries", {HistType::kTH2F, {{100, -1., 1.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hImpParErrProng1", "3-prong candidates;prong 1 impact parameter error (cm);entries", {HistType::kTH2F, {{100, -1., 1.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hImpParErrProng2", "3-prong candidates;prong 2 impact parameter error (cm);entries", {HistType::kTH2F, {{100, -1., 1.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hDecLenErr", "3-prong candidates;decay length error (cm);entries", {HistType::kTH2F, {{100, 0., 1.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); // ========================= // MC : histograms for TPC-TPC h-h case @@ -444,7 +372,6 @@ struct HfTaskFlow { registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hPhi", "phi", {HistType::kTH1F, {{100, 0, TwoPI, "#varphi"}}}); registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hYields", "multiplicity vs pT vs eta", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {40, 0, 20, "p_{T}"}, {100, -2, 2, "#eta"}}}); registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hEtaPhi", "multiplicity vs eta vs phi", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {100, -2, 2, "#eta"}, {200, 0, TwoPI, "#varphi"}}}); - registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hNtracks", "hNtracks", {HistType::kTH1F, {{500, 0, 500}}}); // histograms for MC particles in event mixing registry.add("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hEventCountMixing", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); registry.add("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hMultiplicityMixing", "hMultiplicityMixing", {HistType::kTH1F, {{500, 0, 500}}}); @@ -452,7 +379,6 @@ struct HfTaskFlow { registry.add("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hPtMixing", "pT", {HistType::kTH1F, {{100, 0, 10, "p_{T}"}}}); registry.add("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hEtaMixing", "eta", {HistType::kTH1F, {{100, -4, 4, "#eta"}}}); registry.add("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hPhiMixing", "phi", {HistType::kTH1F, {{100, 0, TwoPI, "#varphi"}}}); - registry.add("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hNtracksMixing", "hNtracksMixing", {HistType::kTH1F, {{500, 0, 500}}}); // MC Truth @@ -467,7 +393,6 @@ struct HfTaskFlow { registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hPhi", "phi", {HistType::kTH1F, {{100, 0, TwoPI, "#varphi"}}}); registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hYields", "multiplicity vs pT vs eta", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {40, 0, 20, "p_{T}"}, {100, -2, 2, "#eta"}}}); registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hEtaPhi", "multiplicity vs eta vs phi", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {100, -2, 2, "#eta"}, {200, 0, TwoPI, "#varphi"}}}); - registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hNtracks", "hNtracks", {HistType::kTH1F, {{500, 0, 500}}}); // histograms for MC particles in event mixing registry.add("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hEventCountMixing", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); registry.add("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hMultiplicityMixing", "hMultiplicityMixing", {HistType::kTH1F, {{500, 0, 500}}}); @@ -475,7 +400,6 @@ struct HfTaskFlow { registry.add("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hPtMixing", "pT", {HistType::kTH1F, {{100, 0, 10, "p_{T}"}}}); registry.add("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hEtaMixing", "eta", {HistType::kTH1F, {{100, -4, 4, "#eta"}}}); registry.add("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hPhiMixing", "phi", {HistType::kTH1F, {{100, 0, TwoPI, "#varphi"}}}); - registry.add("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hNtracksMixing", "hNtracksMixing", {HistType::kTH1F, {{500, 0, 500}}}); // ========================= // Declaration of correlation containers and their respective axis @@ -493,18 +417,22 @@ struct HfTaskFlow { std::vector userAxis = {{axisMass, "m_{inv} (GeV/c^{2})"}}; // initialization of correlation containers for data - sameTPCTPCChCh.setObject(new CorrelationContainer("sameTPCTPCChCh", "sameTPCTPCChCh", corrAxis, effAxis, {})); - mixedTPCTPCChCh.setObject(new CorrelationContainer("mixedTPCTPCChCh", "mixedTPCTPCChCh", corrAxis, effAxis, {})); - sameTPCTPCHfCh.setObject(new CorrelationContainer("sameTPCTPCHfCh", "sameTPCTPCHfCh", corrAxis, effAxis, userAxis)); - mixedTPCTPCHfCh.setObject(new CorrelationContainer("mixedTPCTPCHfCh", "mixedTPCTPCHfCh", corrAxis, effAxis, userAxis)); - sameTPCMFTChCh.setObject(new CorrelationContainer("sameTPCMFTChCh", "sameTPCMFTChCh", corrAxis, effAxis, {})); - mixedTPCMFTChCh.setObject(new CorrelationContainer("mixedTPCMFTChCh", "mixedTPCMFTChCh", corrAxis, effAxis, {})); - sameTPCMFTHfCh.setObject(new CorrelationContainer("sameTPCMFTHfCh", "sameTPCMFTHfCh", corrAxis, effAxis, userAxis)); - mixedTPCMFTHfCh.setObject(new CorrelationContainer("mixedTPCMFTHfCh", "mixedTPCMFTHfCh", corrAxis, effAxis, userAxis)); + sameEvent.setObject(new CorrelationContainer("sameEvent", "sameEvent", corrAxis, effAxis, {})); + mixedEvent.setObject(new CorrelationContainer("mixedEvent", "mixedEvent", corrAxis, effAxis, {})); + sameEventHf.setObject(new CorrelationContainer("sameEventHf", "sameEventHf", corrAxis, effAxis, userAxis)); + mixedEventHf.setObject(new CorrelationContainer("mixedEventHf", "mixedEventHf", corrAxis, effAxis, userAxis)); + // sameTPCTPCChCh.setObject(new CorrelationContainer("sameTPCTPCChCh", "sameTPCTPCChCh", corrAxis, effAxis, {})); + // mixedTPCTPCChCh.setObject(new CorrelationContainer("mixedTPCTPCChCh", "mixedTPCTPCChCh", corrAxis, effAxis, {})); + // sameTPCTPCHfCh.setObject(new CorrelationContainer("sameTPCTPCHfCh", "sameTPCTPCHfCh", corrAxis, effAxis, userAxis)); + // mixedTPCTPCHfCh.setObject(new CorrelationContainer("mixedTPCTPCHfCh", "mixedTPCTPCHfCh", corrAxis, effAxis, userAxis)); + // sameTPCMFTChCh.setObject(new CorrelationContainer("sameTPCMFTChCh", "sameTPCMFTChCh", corrAxis, effAxis, {})); + // mixedTPCMFTChCh.setObject(new CorrelationContainer("mixedTPCMFTChCh", "mixedTPCMFTChCh", corrAxis, effAxis, {})); + // sameTPCMFTHfCh.setObject(new CorrelationContainer("sameTPCMFTHfCh", "sameTPCMFTHfCh", corrAxis, effAxis, userAxis)); + // mixedTPCMFTHfCh.setObject(new CorrelationContainer("mixedTPCMFTHfCh", "mixedTPCMFTHfCh", corrAxis, effAxis, userAxis)); // initialization of correlation containes for monte-carlo - sameTPCTPCChChMC.setObject(new CorrelationContainer("sameTPCTPCChChMC", "sameTPCTPCChChMC", corrAxis, effAxis, {})); - mixedTPCTPCChChMC.setObject(new CorrelationContainer("mixedTPCTPCChChMC", "mixedTPCTPCChChMC", corrAxis, effAxis, {})); + // sameTPCTPCChChMC.setObject(new CorrelationContainer("sameTPCTPCChChMC", "sameTPCTPCChChMC", corrAxis, effAxis, {})); + // mixedTPCTPCChChMC.setObject(new CorrelationContainer("mixedTPCTPCChChMC", "mixedTPCTPCChChMC", corrAxis, effAxis, {})); } // End of init() function // ========================= @@ -532,44 +460,23 @@ struct HfTaskFlow { registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/hEtaPhi"), multiplicity, track.eta(), track.phi()); } - // ---- MC : TPC-TPC h-h Same Event QA ---- - // Changed quickly void for int type + added the return for a test - template - int fillTpcTpcChChSameEventQaMc(float multiplicity, TTracks const& tracks) + // ---- MC REC : TPC-TPC h-h Same Event QA ---- + template + void fillTpcTpcChChSameEventQaMc(float multiplicity, TTrack const& track) { - int nTracks = tracks.size(); - for (const auto& track1 : tracks) { - - // in case of MC-generated, do additional selection on MCparticles : charge and isPhysicalPrimary - if constexpr (std::is_same_v) { - if (!isMcParticleSelected(track1)) { - continue; - } - // TO-DO : add other if constexpr conditions when I will have more MC cases - } - - if constexpr (std::is_same_v) { // if MC Rec - registry.fill(HIST("MC/Rec/TpcTpc/HadronHadron/SameEvent/hPt"), track1.pt()); - registry.fill(HIST("MC/Rec/TpcTpc/HadronHadron/SameEvent/hEta"), track1.eta()); - registry.fill(HIST("MC/Rec/TpcTpc/HadronHadron/SameEvent/hPhi"), track1.phi()); - registry.fill(HIST("MC/Rec/TpcTpc/HadronHadron/SameEvent/hYields"), multiplicity, track1.pt(), track1.eta()); - registry.fill(HIST("MC/Rec/TpcTpc/HadronHadron/SameEvent/hEtaPhi"), multiplicity, track1.eta(), track1.phi()); - } else { // if MC Gen - registry.fill(HIST("MC/Gen/TpcTpc/HadronHadron/SameEvent/hPt"), track1.pt()); - registry.fill(HIST("MC/Gen/TpcTpc/HadronHadron/SameEvent/hEta"), track1.eta()); - registry.fill(HIST("MC/Gen/TpcTpc/HadronHadron/SameEvent/hPhi"), track1.phi()); - registry.fill(HIST("MC/Gen/TpcTpc/HadronHadron/SameEvent/hYields"), multiplicity, track1.pt(), track1.eta()); - registry.fill(HIST("MC/Gen/TpcTpc/HadronHadron/SameEvent/hEtaPhi"), multiplicity, track1.eta(), track1.phi()); - } - } - if constexpr (std::is_same_v) { // if MC Rec - registry.fill(HIST("MC/Rec/TpcTpc/HadronHadron/SameEvent/hNtracks"), nTracks); - registry.fill(HIST("MC/Rec/TpcTpc/HadronHadron/SameEvent/hMultiplicityPrimary"), nTracks); + if constexpr (std::is_same_v) { // if MC Rec + registry.fill(HIST("MC/Rec/TpcTpc/HadronHadron/SameEvent/hPt"), track.pt()); + registry.fill(HIST("MC/Rec/TpcTpc/HadronHadron/SameEvent/hEta"), track.eta()); + registry.fill(HIST("MC/Rec/TpcTpc/HadronHadron/SameEvent/hPhi"), track.phi()); + registry.fill(HIST("MC/Rec/TpcTpc/HadronHadron/SameEvent/hYields"), multiplicity, track.pt(), track.eta()); + registry.fill(HIST("MC/Rec/TpcTpc/HadronHadron/SameEvent/hEtaPhi"), multiplicity, track.eta(), track.phi()); } else { // if MC Gen - registry.fill(HIST("MC/Gen/TpcTpc/HadronHadron/SameEvent/hNtracks"), nTracks); - registry.fill(HIST("MC/Gen/TpcTpc/HadronHadron/SameEvent/hMultiplicityPrimary"), nTracks); + registry.fill(HIST("MC/Gen/TpcTpc/HadronHadron/SameEvent/hPt"), track.pt()); + registry.fill(HIST("MC/Gen/TpcTpc/HadronHadron/SameEvent/hEta"), track.eta()); + registry.fill(HIST("MC/Gen/TpcTpc/HadronHadron/SameEvent/hPhi"), track.phi()); + registry.fill(HIST("MC/Gen/TpcTpc/HadronHadron/SameEvent/hYields"), multiplicity, track.pt(), track.eta()); + registry.fill(HIST("MC/Gen/TpcTpc/HadronHadron/SameEvent/hEtaPhi"), multiplicity, track.eta(), track.phi()); } - return nTracks; } // ---- DATA : TPC-MFT h-h Same Event QA ---- @@ -614,8 +521,6 @@ struct HfTaskFlow { } // ---- DATA : TPC-TPC HF-h Same Event (Candidates) QA ---- - // TODO: Note: we do not need all these plots since they are in D0 and Lc task -> remove it after we are sure this works - // TODO: Note: we do not need all these plots since they are in D0 and Lc task -> remove it after we are sure this works template void fillTpcTpcD0CandidateQa(float multiplicity, TTrack const& candidate) @@ -640,20 +545,8 @@ struct HfTaskFlow { registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hPtCandidate"), pt); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hPtProng0"), candidate.ptProng0()); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hPtProng1"), candidate.ptProng1()); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hDecLength"), candidate.decayLength(), pt); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hDecLengthXY"), candidate.decayLengthXY(), pt); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hd0Prong0"), candidate.impactParameter0(), pt); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hd0Prong1"), candidate.impactParameter1(), pt); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hd0d0"), candidate.impactParameterProduct(), pt); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hCTS"), hfHelper.cosThetaStarD0(candidate), pt); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hCt"), hfHelper.ctD0(candidate), pt); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hCPA"), candidate.cpa(), pt); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hEtaCandVsPt"), candidate.eta(), pt); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hSelectionStatus"), candidate.isSelD0() + (candidate.isSelD0bar() * 2), pt); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hImpParErr"), candidate.errorImpactParameter0(), pt); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hImpParErr"), candidate.errorImpactParameter1(), pt); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hDecLenErr"), candidate.errorDecayLength(), pt); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hDecLenXYErr"), candidate.errorDecayLengthXY(), pt); } // ---- DATA : TPC-TPC HF-h Same Event (Candidates) QA ---- @@ -668,11 +561,6 @@ struct HfTaskFlow { auto ptProng0 = candidate.ptProng0(); auto ptProng1 = candidate.ptProng1(); auto ptProng2 = candidate.ptProng2(); - auto decayLength = candidate.decayLength(); - auto decayLengthXY = candidate.decayLengthXY(); - auto chi2PCA = candidate.chi2PCA(); - auto cpa = candidate.cpa(); - auto cpaXY = candidate.cpaXY(); if (candidate.isSelLcToPKPi() >= selectionFlagLcToPKPi) { registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hMass"), hfHelper.invMassLcToPKPi(candidate)); @@ -690,34 +578,12 @@ struct HfTaskFlow { registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPtProng0"), ptProng0); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPtProng1"), ptProng1); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPtProng2"), ptProng2); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hd0Prong0"), candidate.impactParameter0()); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hd0Prong1"), candidate.impactParameter1()); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hd0Prong2"), candidate.impactParameter2()); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hd0VsPtProng0"), candidate.impactParameter0(), pt); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hd0VsPtProng1"), candidate.impactParameter1(), pt); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hd0VsPtProng2"), candidate.impactParameter2(), pt); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hDecLength"), decayLength); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hDecLengthVsPt"), decayLength, pt); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hDecLengthxy"), decayLengthXY); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hDecLengthxyVsPt"), decayLengthXY, pt); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hCt"), hfHelper.ctLc(candidate)); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hCtVsPt"), hfHelper.ctLc(candidate), pt); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hCPA"), cpa); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hCPAVsPt"), cpa, pt); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hCPAxy"), cpaXY); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hCPAxyVsPt"), cpaXY, pt); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hDca2"), chi2PCA); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hDca2VsPt"), chi2PCA, pt); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hEta"), candidate.eta()); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hEtaVsPt"), candidate.eta(), pt); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPhi"), phi); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPhiVsPt"), phi, pt); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hSelectionStatus"), candidate.isSelLcToPKPi(), pt); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hSelectionStatus"), candidate.isSelLcToPiKP(), pt); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hImpParErrProng0"), candidate.errorImpactParameter0(), pt); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hImpParErrProng1"), candidate.errorImpactParameter1(), pt); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hImpParErrProng2"), candidate.errorImpactParameter2(), pt); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hDecLenErr"), candidate.errorDecayLength(), pt); } // ---- DATA : TPC-MFT HF-h Same Event (Candidates) QA ---- @@ -746,20 +612,8 @@ struct HfTaskFlow { registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/2Prong/hPtCandidate"), pt); registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/2Prong/hPtProng0"), candidate.ptProng0()); registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/2Prong/hPtProng1"), candidate.ptProng1()); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/2Prong/hDecLength"), candidate.decayLength(), pt); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/2Prong/hDecLengthXY"), candidate.decayLengthXY(), pt); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/2Prong/hd0Prong0"), candidate.impactParameter0(), pt); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/2Prong/hd0Prong1"), candidate.impactParameter1(), pt); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/2Prong/hd0d0"), candidate.impactParameterProduct(), pt); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/2Prong/hCTS"), hfHelper.cosThetaStarD0(candidate), pt); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/2Prong/hCt"), hfHelper.ctD0(candidate), pt); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/2Prong/hCPA"), candidate.cpa(), pt); registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/2Prong/hEtaCandVsPt"), candidate.eta(), pt); registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/2Prong/hSelectionStatus"), candidate.isSelD0() + (candidate.isSelD0bar() * 2), pt); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/2Prong/hImpParErr"), candidate.errorImpactParameter0(), pt); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/2Prong/hImpParErr"), candidate.errorImpactParameter1(), pt); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/2Prong/hDecLenErr"), candidate.errorDecayLength(), pt); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/2Prong/hDecLenXYErr"), candidate.errorDecayLengthXY(), pt); } // ---- DATA : TPC-MFT HF-h Same Event (Candidates) QA ---- @@ -772,11 +626,6 @@ struct HfTaskFlow { auto ptProng0 = candidate.ptProng0(); auto ptProng1 = candidate.ptProng1(); auto ptProng2 = candidate.ptProng2(); - auto decayLength = candidate.decayLength(); - auto decayLengthXY = candidate.decayLengthXY(); - auto chi2PCA = candidate.chi2PCA(); - auto cpa = candidate.cpa(); - auto cpaXY = candidate.cpaXY(); float phi = candidate.phi(); o2::math_utils::bringTo02Pi(phi); @@ -798,69 +647,12 @@ struct HfTaskFlow { registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hPtProng0"), ptProng0); registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hPtProng1"), ptProng1); registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hPtProng2"), ptProng2); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hd0Prong0"), candidate.impactParameter0()); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hd0Prong1"), candidate.impactParameter1()); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hd0Prong2"), candidate.impactParameter2()); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hd0VsPtProng0"), candidate.impactParameter0(), pt); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hd0VsPtProng1"), candidate.impactParameter1(), pt); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hd0VsPtProng2"), candidate.impactParameter2(), pt); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hDecLength"), decayLength); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hDecLengthVsPt"), decayLength, pt); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hDecLengthxy"), decayLengthXY); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hDecLengthxyVsPt"), decayLengthXY, pt); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hCt"), hfHelper.ctLc(candidate)); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hCtVsPt"), hfHelper.ctLc(candidate), pt); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hCPA"), cpa); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hCPAVsPt"), cpa, pt); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hCPAxy"), cpaXY); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hCPAxyVsPt"), cpaXY, pt); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hDca2"), chi2PCA); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hDca2VsPt"), chi2PCA, pt); registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hEta"), candidate.eta()); registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hEtaVsPt"), candidate.eta(), pt); registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hPhi"), candidate.phi()); registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hPhiVsPt"), candidate.phi(), pt); registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hSelectionStatus"), candidate.isSelLcToPKPi(), pt); registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hSelectionStatus"), candidate.isSelLcToPiKP(), pt); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hImpParErrProng0"), candidate.errorImpactParameter0(), pt); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hImpParErrProng1"), candidate.errorImpactParameter1(), pt); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hImpParErrProng2"), candidate.errorImpactParameter2(), pt); - registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hDecLenErr"), candidate.errorDecayLength(), pt); - } - - // ========================= - // Quality Assesment plots for Mixed Event - // ========================= - - // ---- MC : TPC-TPC h-h Mixed Event QA ---- - template - void fillTpcTpcChChMixedEventQaMc(float multiplicity, float vz, TTracks const& tracks) - { - if constexpr (std::is_same_v) { // if MC Rec - registry.fill(HIST("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hMultiplicityMixing"), multiplicity); - registry.fill(HIST("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hVtxZMixing"), vz); - } else { // if MC Gen - registry.fill(HIST("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hMultiplicityMixing"), multiplicity); - registry.fill(HIST("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hVtxZMixing"), vz); - } - - int nTracks = tracks.size(); - for (const auto& track1 : tracks) { - if constexpr (std::is_same_v) { // if MC Rec - registry.fill(HIST("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hPtMixing"), track1.pt()); - registry.fill(HIST("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hEtaMixing"), track1.eta()); - registry.fill(HIST("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hPhiMixing"), track1.phi()); - } else { // if MC Gen - registry.fill(HIST("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hPtMixing"), track1.pt()); - registry.fill(HIST("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hEtaMixing"), track1.eta()); - registry.fill(HIST("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hPhiMixing"), track1.phi()); - } - } - if constexpr (std::is_same_v) { // if MC Rec - registry.fill(HIST("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hNtracksMixing"), nTracks); - } else { // if MC Gen - registry.fill(HIST("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hNtracksMixing"), nTracks); - } } // ========================= @@ -871,8 +663,9 @@ struct HfTaskFlow { template bool isAcceptedCollision(TCollision const& collision, bool fillHistograms = false) { - if (fillHistograms) + if (fillHistograms) { registry.fill(HIST("Data/hEventCounter"), 1); + } if (processMc == false) { if (!collision.sel8()) { @@ -880,8 +673,9 @@ struct HfTaskFlow { } } - if (fillHistograms) - registry.fill(HIST("Data/hEventCounter"), 3); + if (fillHistograms) { + registry.fill(HIST("Data/hEventCounter"), 2); + } return true; } @@ -891,41 +685,22 @@ struct HfTaskFlow { bool isAcceptedCandidate(TTrack const& candidate) { auto etaCandidate = candidate.eta(); - auto ptCandidate = candidate.pt(); if constexpr (std::is_same_v) { // For now, that means we do LambdaC if (!(candidate.hfflag() & 1 << aod::hf_cand_3prong::DecayType::LcToPKPi)) { return false; } - if (yCandMax >= 0. && std::abs(hfHelper.yLc(candidate)) > yCandMax) { - return false; - } if (etaCandidateMax >= 0. && std::abs(etaCandidate) > etaCandidateMax) { return false; } - if (ptCandidateMax >= 0. && ptCandidate > ptCandidateMax) { - return false; - } - if (ptCandidateMin >= 0. && ptCandidate < ptCandidateMin) { - return false; - } return true; } else { // For now, that means we do D0 if (!(candidate.hfflag() & 1 << aod::hf_cand_2prong::DecayType::D0ToPiK)) { return false; } - if (yCandMax >= 0. && std::abs(hfHelper.yD0(candidate)) > yCandMax) { - return false; - } if (etaCandidateMax >= 0. && std::abs(etaCandidate) > etaCandidateMax) { return false; } - if (ptCandidateMax >= 0. && ptCandidate > ptCandidateMax) { - return false; - } - if (ptCandidateMin >= 0. && ptCandidate < ptCandidateMin) { - return false; - } return true; } } @@ -1033,28 +808,30 @@ struct HfTaskFlow { // FILL QA PLOTS for trigger particle if (sameEvent) { - // if constexpr (std::is_same_v) { // If DATA - if constexpr (!std::is_same_v) { // IF TPC-TPC case - if constexpr (std::is_same_v) { // IF D0 CASE -> TPC-TPC D0-h - fillTpcTpcD0CandidateQa(multiplicity, track1); - } else if constexpr (std::is_same_v) { // IF LC CASE -> TPC-TPC Lc-h - fillTpcTpcLcCandidateQa(multiplicity, track1); - } else { // IF NEITHER D0 NOR LC -> TPC-TPC h-h - fillTpcTpcChChSameEventQa(multiplicity, track1); + if (processMc == false) { // If DATA + if constexpr (!std::is_same_v) { // IF TPC-TPC case + if constexpr (std::is_same_v) { // IF D0 CASE -> TPC-TPC D0-h + fillTpcTpcD0CandidateQa(multiplicity, track1); + } else if constexpr (std::is_same_v) { // IF LC CASE -> TPC-TPC Lc-h + fillTpcTpcLcCandidateQa(multiplicity, track1); + } else { // IF NEITHER D0 NOR LC -> TPC-TPC h-h + fillTpcTpcChChSameEventQa(multiplicity, track1); + } + } else { // IF TPC-MFT case + if constexpr (std::is_same_v) { // IF D0 CASE -> TPC-MFT D0-h + fillTpcMftD0CandidateQa(multiplicity, track1); + } else if constexpr (std::is_same_v) { // IF LC CASE -> TPC-MFT Lc-h + fillTpcMftLcCandidateQa(multiplicity, track1); + } else { // IF NEITHER D0 NOR LC -> TPC-MFT h-h + fillTpcMftChChSameEventQa(multiplicity, track1, true); + } // end of if condition for TPC-TPC or TPC-MFT case + } + // Maybe I won't need it for MC (first files are way lighter in MC, but also I need to loop over all tracks in MC GEN) + } else { // If MC (add cases later) + if constexpr (!std::is_same_v) { // IF TPC-TPC case + fillTpcTpcChChSameEventQaMc(multiplicity, track1); } - } else { // IF TPC-MFT case - if constexpr (std::is_same_v) { // IF D0 CASE -> TPC-MFT D0-h - fillTpcMftD0CandidateQa(multiplicity, track1); - } else if constexpr (std::is_same_v) { // IF LC CASE -> TPC-MFT Lc-h - fillTpcMftLcCandidateQa(multiplicity, track1); - } else { // IF NEITHER D0 NOR LC -> TPC-MFT h-h - fillTpcMftChChSameEventQa(multiplicity, track1, true); - } // end of if condition for TPC-TPC or TPC-MFT case } - // Maybe I won't need it for MC (first files are way lighter in MC, but also I need to loop over all tracks in MC GEN) - //} else { // If MC (add cases later) - // fillTpcTpcChChSameEventQaMc(multiplicityTracks2, vz, tracks1); - //} } for (const auto& track2 : tracks2) { @@ -1210,17 +987,6 @@ struct HfTaskFlow { for (const auto& [collision1, tracks1, collision2, tracks2] : pair) { - // added this to try to compile when doing mixed event with FilteredMcParticles and FilteredMcCollisions (MC truth) - // TODO : GET RID OF THE COLLISION SELECTION FOR MC TRUTH - // if constexpr (!std::is_same_v) { - // if (!(isAcceptedCollision(collision1, false))) { - // continue; - // } - // if (!(isAcceptedCollision(collision2, false))) { - // continue; - // } - //} - auto binningValues = binningWithTracksSize.getBinningValues(collision1, collisions); int bin = binningWithTracksSize.getBin(binningValues); @@ -1230,15 +996,6 @@ struct HfTaskFlow { // TO BE DONE : ADD ONE MORE IF CONDITION TO FILL THE MC CASE // TODO : FILL NEW PLOTS FOR MCTRUTH ONLY registry.fill(HIST("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hEventCountMixing"), bin); - // fillTpcTpcChChMixedEventQaMc(multiplicity, vz, tracks1); - - // if constexpr (std::is_same_v || std::is_same_v) { - // registry.fill(HIST("Data/TpcTpc/HfHadron/MixedEvent/hEventCountHFMixing"), bin); - // fillHFMixingQA(multiplicity, vz, tracks1); - // } else { - // registry.fill(HIST("Data/TpcTpc/HadronHadron/MixedEvent/hEventCountMixing"), bin); - // fillMixingQA(multiplicity, vz, tracks1); - // } corrContainer->fillEvent(multiplicity, CorrelationContainer::kCFStepAll); fillCorrelations(corrContainer, tracks1, tracks2, multiplicity, collision1.posZ(), false); @@ -1270,10 +1027,10 @@ struct HfTaskFlow { int bin = baseBinning.getBin(std::make_tuple(collision.posZ(), multiplicity)); registry.fill(HIST("Data/TpcTpc/HadronHadron/SameEvent/hEventCountSame"), bin); - sameTPCTPCChCh->fillEvent(multiplicity, CorrelationContainer::kCFStepReconstructed); + sameEvent->fillEvent(multiplicity, CorrelationContainer::kCFStepReconstructed); // TO-DO : add if condition for when we will implant corrected correlations (kCFStepReconstructed -> kCFStepCorrected) - fillCorrelations(sameTPCTPCChCh, tracks, tracks, multiplicity, collision.posZ(), true); + fillCorrelations(sameEvent, tracks, tracks, multiplicity, collision.posZ(), true); } PROCESS_SWITCH(HfTaskFlow, processSameTpcTpcChCh, "DATA : Process same-event correlations for TPC-TPC h-h case", false); @@ -1300,9 +1057,9 @@ struct HfTaskFlow { int bin = baseBinning.getBin(std::make_tuple(collision.posZ(), multiplicity)); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hEventCountSame"), bin); - sameTPCTPCHfCh->fillEvent(multiplicity, CorrelationContainer::kCFStepReconstructed); + sameEventHf->fillEvent(multiplicity, CorrelationContainer::kCFStepReconstructed); - fillCorrelations(sameTPCTPCHfCh, candidates, tracks, multiplicity, collision.posZ(), true); + fillCorrelations(sameEventHf, candidates, tracks, multiplicity, collision.posZ(), true); } PROCESS_SWITCH(HfTaskFlow, processSameTpcTpcD0Ch, "DATA : Process same-event correlations for TPC-TPC D0-h case", false); @@ -1329,9 +1086,9 @@ struct HfTaskFlow { int bin = baseBinning.getBin(std::make_tuple(collision.posZ(), multiplicity)); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hEventCountSame"), bin); - sameTPCTPCHfCh->fillEvent(multiplicity, CorrelationContainer::kCFStepReconstructed); + sameEventHf->fillEvent(multiplicity, CorrelationContainer::kCFStepReconstructed); - fillCorrelations(sameTPCTPCHfCh, candidates, tracks, multiplicity, collision.posZ(), true); + fillCorrelations(sameEventHf, candidates, tracks, multiplicity, collision.posZ(), true); } PROCESS_SWITCH(HfTaskFlow, processSameTpcTpcLcCh, "DATA : Process same-event correlations for TPC-TPC Lc-h case", false); @@ -1352,9 +1109,9 @@ struct HfTaskFlow { int bin = baseBinning.getBin(std::make_tuple(collision.posZ(), multiplicity)); registry.fill(HIST("Data/TpcMft/HadronHadron/SameEvent/hEventCountSame"), bin); - sameTPCMFTChCh->fillEvent(multiplicity, CorrelationContainer::kCFStepReconstructed); + sameEvent->fillEvent(multiplicity, CorrelationContainer::kCFStepReconstructed); - fillCorrelations(sameTPCMFTChCh, tracks, mftTracks, multiplicity, collision.posZ(), true); + fillCorrelations(sameEvent, tracks, mftTracks, multiplicity, collision.posZ(), true); } PROCESS_SWITCH(HfTaskFlow, processSameTpcMftChCh, "DATA : Process same-event correlations for TPC-MFT h-h case", false); @@ -1382,9 +1139,9 @@ struct HfTaskFlow { int bin = baseBinning.getBin(std::make_tuple(collision.posZ(), multiplicity)); registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/2Prong/hEventCountSame"), bin); - sameTPCMFTHfCh->fillEvent(multiplicity, CorrelationContainer::kCFStepReconstructed); + sameEventHf->fillEvent(multiplicity, CorrelationContainer::kCFStepReconstructed); - fillCorrelations(sameTPCMFTHfCh, candidates, mftTracks, multiplicity, collision.posZ(), true); + fillCorrelations(sameEventHf, candidates, mftTracks, multiplicity, collision.posZ(), true); } PROCESS_SWITCH(HfTaskFlow, processSameTpcMftD0Ch, "DATA : Process same-event correlations for TPC-MFT D0-h case", false); @@ -1412,9 +1169,9 @@ struct HfTaskFlow { int bin = baseBinning.getBin(std::make_tuple(collision.posZ(), multiplicity)); registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hEventCountSame"), bin); - sameTPCMFTHfCh->fillEvent(multiplicity, CorrelationContainer::kCFStepReconstructed); + sameEventHf->fillEvent(multiplicity, CorrelationContainer::kCFStepReconstructed); - fillCorrelations(sameTPCMFTHfCh, candidates, mftTracks, multiplicity, collision.posZ(), true); + fillCorrelations(sameEventHf, candidates, mftTracks, multiplicity, collision.posZ(), true); } PROCESS_SWITCH(HfTaskFlow, processSameTpcMftLcCh, "DATA : Process same-event correlations for TPC-MFT Lc-h case", false); @@ -1422,39 +1179,11 @@ struct HfTaskFlow { // MONTE-CARLO : process same event correlations: TPC-TPC h-h case // ===================================== - void processSameTpcTpcChChmcREC(FilteredCollisionsWSelMultMC::iterator const& mcCollision, - TracksWDcaSelMC const& mcTracks) - { - - // NEED TO COMMENT THIS - // if (!(isAcceptedCollision(mcCollision, true))) { - // return; - //} - - const auto multiplicity = mcCollision.multNTracksPV(); - registry.fill(HIST("MC/Rec/TpcTpc/HadronHadron/SameEvent/hMultiplicity"), multiplicity); - registry.fill(HIST("MC/Rec/TpcTpc/HadronHadron/SameEvent/hVtxZ"), mcCollision.posZ()); - - BinningPolicyBase<2> baseBinning{{axisVertex, axisMultiplicity}, true}; - int bin = baseBinning.getBin(std::make_tuple(mcCollision.posZ(), multiplicity)); - registry.fill(HIST("MC/Rec/TpcTpc/HadronHadron/SameEvent/hEventCountSame"), bin); - - sameTPCTPCChChMC->fillEvent(multiplicity, CorrelationContainer::kCFStepReconstructed); - - fillTpcTpcChChSameEventQaMc(multiplicity, mcTracks); - fillCorrelations(sameTPCTPCChChMC, mcTracks, mcTracks, multiplicity, mcCollision.posZ(), true); - } - PROCESS_SWITCH(HfTaskFlow, processSameTpcTpcChChmcREC, "MONTE-CARLO : Process same-event correlations for TPC-TPC h-h case", false); - // Katarina's version = MC Truth void processSameTpcTpcChChmcGEN(FilteredMcCollisions::iterator const& mcCollision, FilteredMcParticles const& mcParticles) { - // if (!(isAcceptedCollision(mcCollision, true))) { - // return; - // } - // Not sure why to use this // if (collisions.size() == 0) { // return; @@ -1466,21 +1195,16 @@ struct HfTaskFlow { // } // TODO : check if I have to get my multiplicity based on multNTracksPV or mcParticles.size() - const auto multiplicity = mcParticles.size(); // Note: these are all MC particles after selection (not only primary) - // const auto multiplicity = collision.multNTracksPV(); + // const auto multiplicity = mcParticles.size(); // Note: these are all MC particles after selection (not only primary) + const auto multiplicity = mcCollision.multMCPVz(); registry.fill(HIST("MC/Gen/TpcTpc/HadronHadron/SameEvent/hMultiplicity"), multiplicity); registry.fill(HIST("MC/Gen/TpcTpc/HadronHadron/SameEvent/hVtxZ"), mcCollision.posZ()); // fill correlations for all MC collisions // In Katka's code, the first time doing this does not fill the histograms, right now will be filled two times.. - auto multPrimaryCharge0 = fillTpcTpcChChSameEventQaMc(multiplicity, mcParticles); - sameTPCTPCChChMC->fillEvent(multPrimaryCharge0, CorrelationContainer::kCFStepAll); - fillCorrelations(sameTPCTPCChChMC, mcParticles, mcParticles, multPrimaryCharge0, mcCollision.posZ(), true); - - // NOT USED BY KATARINA APPARENTLY - // BinningPolicyBase<2> baseBinning{{axisVertex, axisMultiplicity}, true}; - // int bin = baseBinning.getBin(std::make_tuple(mcCollision.posZ(), multiplicity)); - // registry.fill(HIST("MC/Gen/TpcTpc/HadronHadron/SameEvent/hEventCountSame"), bin); + // auto multPrimaryCharge0 = fillTpcTpcChChSameEventQaMc(multiplicity, mcParticles); + sameEvent->fillEvent(multiplicity, CorrelationContainer::kCFStepAll); + fillCorrelations(sameEvent, mcParticles, mcParticles, multiplicity, mcCollision.posZ(), true); // TO-DO : fill correlation container for MC collisions that have a reconstructed collision // got rid of the second const auto for multPrimaryCharge0 @@ -1511,8 +1235,8 @@ struct HfTaskFlow { return multiplicity; }; - // mixCollisions(collisions, tracks, tracks, getTracksSize, mixedTPCTPCChCh); - mixCollisions(collisions, tracks, tracks, getMultiplicity, mixedTPCTPCChCh); + // mixCollisions(collisions, tracks, tracks, getTracksSize, mixedEvent); + mixCollisions(collisions, tracks, tracks, getMultiplicity, mixedEvent); } PROCESS_SWITCH(HfTaskFlow, processMixedTpcTpcChCh, "DATA : Process mixed-event correlations for TPC-TPC h-h case", false); @@ -1530,7 +1254,7 @@ struct HfTaskFlow { return multiplicity; }; - mixCollisions(collisions, candidates, tracks, getMultiplicity, mixedTPCTPCHfCh); + mixCollisions(collisions, candidates, tracks, getMultiplicity, mixedEventHf); } PROCESS_SWITCH(HfTaskFlow, processMixedTpcTpcD0Ch, "DATA : Process mixed-event correlations for TPC-TPC D0-h case", false); @@ -1550,7 +1274,7 @@ struct HfTaskFlow { return size; }; - mixCollisions(collisions, candidates, tracks, getTracksSize, mixedTPCTPCHfCh); + mixCollisions(collisions, candidates, tracks, getTracksSize, mixedEventHf); } PROCESS_SWITCH(HfTaskFlow, processMixedTpcTpcLcCh, "DATA : Process mixed-event correlations for TPC-TPC Lc-h case", false); @@ -1574,7 +1298,7 @@ struct HfTaskFlow { return multiplicity; }; - mixCollisions(collisions, tracks, mftTracks, getMultiplicity, mixedTPCMFTChCh); + mixCollisions(collisions, tracks, mftTracks, getMultiplicity, mixedEvent); } PROCESS_SWITCH(HfTaskFlow, processMixedTpcMftChCh, "DATA : Process mixed-event correlations for TPC-MFT h-h case", false); @@ -1593,7 +1317,7 @@ struct HfTaskFlow { return multiplicity; }; - mixCollisions(collisions, candidates, mftTracks, getMultiplicity, mixedTPCMFTHfCh); + mixCollisions(collisions, candidates, mftTracks, getMultiplicity, mixedEventHf); } PROCESS_SWITCH(HfTaskFlow, processMixedTpcMftD0Ch, "DATA : Process mixed-event correlations for TPC-MFT D0-h case", false); @@ -1612,7 +1336,7 @@ struct HfTaskFlow { return multiplicity; }; - mixCollisions(collisions, candidates, mftTracks, getMultiplicity, mixedTPCMFTHfCh); + mixCollisions(collisions, candidates, mftTracks, getMultiplicity, mixedEventHf); } PROCESS_SWITCH(HfTaskFlow, processMixedTpcMftLcCh, "DATA : Process mixed-event correlations for TPC-MFT Lc-h case", false); @@ -1620,23 +1344,6 @@ struct HfTaskFlow { // MONTE-CARLO : process mixed event correlations: TPC-TPC h-h case // ===================================== - // MC rec - void processMixedTpcTpcChChmcREC(FilteredCollisionsWSelMultMC const& mcCollisions, - TracksWDcaSelMC const& mcTracks) - { - // use normal index instead of globalIndex for MixedEvent ?? - - // we want to group collisions based on charged-track multiplicity - auto getTracksSize = [&mcTracks, this](FilteredCollisionsWSelMultMC::iterator const& mcCol) { - auto associatedTracks = mcTracks.sliceByCached(o2::aod::track::collisionId, mcCol.globalIndex(), this->cache); // it's cached, so slicing/grouping happens only once - auto size = associatedTracks.size(); - return size; - }; - - mixCollisions(mcCollisions, mcTracks, mcTracks, getTracksSize, mixedTPCTPCChChMC); - } - PROCESS_SWITCH(HfTaskFlow, processMixedTpcTpcChChmcREC, "MONTE-CARLO : Process mixed-event correlations for TPC-TPC h-h case", false); - // MC gen void processMixedTpcTpcChChmcGEN(FilteredMcCollisions const& mcCollisions, FilteredMcParticles const& mcParticles) @@ -1644,13 +1351,18 @@ struct HfTaskFlow { // use normal index instead of globalIndex for MixedEvent ?? // we want to group collisions based on charged-track multiplicity - auto getTracksSize = [&mcParticles, this](FilteredMcCollisions::iterator const& mcCol) { - auto associatedTracks = mcParticles.sliceByCached(o2::aod::mcparticle::mcCollisionId, mcCol.globalIndex(), this->cache); // it's cached, so slicing/grouping happens only once - auto size = associatedTracks.size(); - return size; + // auto getTracksSize = [&mcParticles, this](FilteredMcCollisions::iterator const& mcCol) { + // auto associatedTracks = mcParticles.sliceByCached(o2::aod::mcparticle::mcCollisionId, mcCol.globalIndex(), this->cache); // it's cached, so slicing/grouping happens only once + // auto size = associatedTracks.size(); + // return size; + //}; + + auto getMultiplicity = [](FilteredMcCollisions::iterator const& mcCollision) { + auto multiplicity = mcCollision.multMCPVz(); + return multiplicity; }; - mixCollisionsMcTruth(mcCollisions, mcParticles, mcParticles, getTracksSize, mixedTPCTPCChChMC); + mixCollisionsMcTruth(mcCollisions, mcParticles, mcParticles, getMultiplicity, mixedEvent); // TO-DO : mixed event for particles that have a reconstructed collision kCFStepVertex } From c25b17e051f3397018c3a67016f64226480e9825 Mon Sep 17 00:00:00 2001 From: nzardosh Date: Fri, 7 Mar 2025 18:07:56 +0100 Subject: [PATCH 0599/1650] [PWGJE] adding new centrality and hadronic rate definitions (#10389) --- PWGJE/Core/JetDerivedDataUtilities.h | 2 +- PWGJE/DataModel/JetReducedData.h | 12 +++++++- PWGJE/DataModel/JetSubstructure.h | 25 ++++++++++++++++ PWGJE/TableProducer/CMakeLists.txt | 2 +- PWGJE/TableProducer/derivedDataProducer.cxx | 29 ++++++++++++++----- PWGJE/TableProducer/derivedDataWriter.cxx | 2 +- PWGJE/Tasks/jetSubstructureBplusOutput.cxx | 2 +- PWGJE/Tasks/jetSubstructureD0Output.cxx | 2 +- .../Tasks/jetSubstructureDielectronOutput.cxx | 2 +- PWGJE/Tasks/jetSubstructureDplusOutput.cxx | 2 +- PWGJE/Tasks/jetSubstructureHFOutput.cxx | 8 +++-- PWGJE/Tasks/jetSubstructureLcOutput.cxx | 2 +- PWGJE/Tasks/jetSubstructureOutput.cxx | 6 +++- 13 files changed, 77 insertions(+), 19 deletions(-) diff --git a/PWGJE/Core/JetDerivedDataUtilities.h b/PWGJE/Core/JetDerivedDataUtilities.h index eed60cb6236..b526dc53fc1 100644 --- a/PWGJE/Core/JetDerivedDataUtilities.h +++ b/PWGJE/Core/JetDerivedDataUtilities.h @@ -121,10 +121,10 @@ std::vector initialiseEventSelectionBits(std::string eventSelectionMasks) } if (eventSelectionMasksContainSelection(eventSelectionMasks, "selUnanchoredMC")) { eventSelectionMaskBits.push_back(JCollisionSel::selTVX); - eventSelectionMaskBits.push_back(JCollisionSel::selNoTimeFrameBorder); } if (eventSelectionMasksContainSelection(eventSelectionMasks, "selMC")) { eventSelectionMaskBits.push_back(JCollisionSel::selTVX); + eventSelectionMaskBits.push_back(JCollisionSel::selNoTimeFrameBorder); } if (eventSelectionMasksContainSelection(eventSelectionMasks, "selMCFull")) { eventSelectionMaskBits.push_back(JCollisionSel::selTVX); diff --git a/PWGJE/DataModel/JetReducedData.h b/PWGJE/DataModel/JetReducedData.h index 52b9d92fd05..5b97e41ab74 100644 --- a/PWGJE/DataModel/JetReducedData.h +++ b/PWGJE/DataModel/JetReducedData.h @@ -69,6 +69,8 @@ DECLARE_SOA_COLUMN(PosY, posY, float); DECLARE_SOA_COLUMN(PosZ, posZ, float); DECLARE_SOA_COLUMN(Multiplicity, multiplicity, float); DECLARE_SOA_COLUMN(Centrality, centrality, float); +DECLARE_SOA_COLUMN(CentralityVariant1, centralityVariant1, float); +DECLARE_SOA_COLUMN(HadronicRate, hadronicRate, float); DECLARE_SOA_COLUMN(Weight, weight, float); DECLARE_SOA_COLUMN(SubGeneratorId, subGeneratorId, int); DECLARE_SOA_COLUMN(EventSel, eventSel, uint16_t); @@ -102,6 +104,8 @@ DECLARE_SOA_TABLE_STAGED(JCollisions, "JCOLLISION", jcollision::PosZ, jcollision::Multiplicity, jcollision::Centrality, + jcollision::CentralityVariant1, + jcollision::HadronicRate, jcollision::TrackOccupancyInTimeRange, jcollision::EventSel, jcollision::Alias, @@ -217,7 +221,13 @@ DECLARE_SOA_DYNAMIC_COLUMN(P, p, DECLARE_SOA_DYNAMIC_COLUMN(Energy, energy, [](float pt, float eta) -> float { return std::sqrt((pt * std::cosh(eta) * pt * std::cosh(eta)) + (jetderiveddatautilities::mPion * jetderiveddatautilities::mPion)); }); DECLARE_SOA_DYNAMIC_COLUMN(Sign, sign, - [](uint8_t trackSel) -> int { if (trackSel & (1 << jetderiveddatautilities::JTrackSel::trackSign)){ return 1;} else{return -1;} }); + [](uint8_t trackSel) -> int { + if (trackSel & (1 << jetderiveddatautilities::JTrackSel::trackSign)) { + return 1; + } else { + return -1; + } + }); } // namespace jtrack DECLARE_SOA_TABLE_STAGED(JTracks, "JTRACK", diff --git a/PWGJE/DataModel/JetSubstructure.h b/PWGJE/DataModel/JetSubstructure.h index f459c9592f4..fcbf2987e52 100644 --- a/PWGJE/DataModel/JetSubstructure.h +++ b/PWGJE/DataModel/JetSubstructure.h @@ -36,6 +36,16 @@ DECLARE_SOA_COLUMN(EventSel, eventSel, uint8_t); //! DECLARE_SOA_COLUMN(EventWeight, eventWeight, float); //! } // namespace jetcollision +namespace jetmccollision +{ +DECLARE_SOA_COLUMN(PosZ, posZ, float); //! +DECLARE_SOA_COLUMN(Accepted, accepted, uint64_t); //! +DECLARE_SOA_COLUMN(Attempted, attempted, uint64_t); //! +DECLARE_SOA_COLUMN(XsectGen, xsectGen, float); //! +DECLARE_SOA_COLUMN(XsectErr, xsectErr, float); //! +DECLARE_SOA_COLUMN(EventWeight, eventWeight, float); //! +} // namespace jetmccollision + namespace jetsubstructure { //! DECLARE_SOA_COLUMN(EnergyMother, energyMother, std::vector); //! @@ -153,6 +163,20 @@ DECLARE_SOA_COLUMN(JetPerpConeRho, jetPerpConeRho, float); //! DECLARE_SOA_COLUMN(JetNConstituents, jetNConstituents, int); //! } // namespace jetoutput +#define MCCOLL_TABLE_DEF(_jet_type_, _jet_description_, _name_) \ + namespace _name_##mccollisionoutput \ + { \ + DECLARE_SOA_DYNAMIC_COLUMN(Dummy##_jet_type_, dummy##_jet_type_, []() -> int { return 0; }); \ + } \ + DECLARE_SOA_TABLE(_jet_type_##MCCOs, "AOD", _jet_description_ "MCCO", \ + jetmccollision::PosZ, \ + jetmccollision::Accepted, \ + jetmccollision::Attempted, \ + jetmccollision::XsectGen, \ + jetmccollision::XsectErr, \ + jetmccollision::EventWeight, \ + _name_##mccollisionoutput::Dummy##_jet_type_<>); + // Defines the jet substrcuture table definition #define JETSUBSTRUCTURE_TABLE_DEF(_jet_type_, _jet_description_, _name_, _cand_type_, _cand_description_) \ \ @@ -217,6 +241,7 @@ DECLARE_SOA_COLUMN(JetNConstituents, jetNConstituents, int); //! JETPAIRMATCHING_TABLE_DEF(_jet_type_full_##EventWiseSubtracted, _jet_type_full_, _jet_description_ "EWSSP2") \ JETSUBSTRUCTURE_TABLE_DEF(_jet_type_##MCDJet, _jet_description_ "MCDJET", _jet_type_##mcdjet, _cand_type_mcd_, _cand_description_mcd_) \ JETSUBSTRUCTURE_TABLE_DEF(_jet_type_##MCPJet, _jet_description_ "MCPJET", _jet_type_##mcpjet, _hfparticle_type_, _hfparticle_description_) \ + MCCOLL_TABLE_DEF(_jet_type_##MCPJet, _jet_description_ "MCPJET", _jet_type_##mcpjet) \ JETMATCHING_TABLE_DEF(_jet_type_##MCDJet, _jet_type_##MCPJet, _jet_description_ "MCPJET", _jet_type_##mcdjet, _jet_description_ "MCDJET") \ JETMATCHING_TABLE_DEF(_jet_type_##MCPJet, _jet_type_##MCDJet, _jet_description_ "MCDJET", _jet_type_##mcpjet, _jet_description_ "MCPJET") \ JETSPLITTING_TABLE_DEF(_jet_type_full_##MCDetectorLevel, _jet_description_ "D", _jet_full_description_##mcdetectorlevel, _track_type_mcd_, _cand_type_mcd_) \ diff --git a/PWGJE/TableProducer/CMakeLists.txt b/PWGJE/TableProducer/CMakeLists.txt index 85083da0801..2a82a7f0466 100644 --- a/PWGJE/TableProducer/CMakeLists.txt +++ b/PWGJE/TableProducer/CMakeLists.txt @@ -15,7 +15,7 @@ if(FastJet_FOUND) o2physics_add_dpl_workflow(jet-deriveddata-producer SOURCES derivedDataProducer.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2Physics::EventFilteringUtils + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore O2Physics::EventFilteringUtils O2Physics::AnalysisCCDB COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(jet-deriveddata-trigger-producer diff --git a/PWGJE/TableProducer/derivedDataProducer.cxx b/PWGJE/TableProducer/derivedDataProducer.cxx index 931bd91aaff..d94c0225d8f 100644 --- a/PWGJE/TableProducer/derivedDataProducer.cxx +++ b/PWGJE/TableProducer/derivedDataProducer.cxx @@ -15,6 +15,9 @@ #include #include +#include +#include +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -37,6 +40,7 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/Centrality.h" #include "Common/Core/RecoDecay.h" +#include "Common/CCDB/ctpRateFetcher.h" #include "Common/DataModel/CollisionAssociationTables.h" #include "PWGJE/DataModel/EMCALClusters.h" @@ -121,6 +125,7 @@ struct JetDerivedDataProducerTask { Configurable ccdbURL{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Configurable includeTriggers{"includeTriggers", false, "fill the collision information with software trigger decisions"}; + Configurable includeHadronicRate{"includeHadronicRate", true, "fill the collision information with the hadronic rate"}; Preslice perClusterCells = aod::emcalclustercell::emcalclusterId; Preslice perClusterTracks = aod::emcalclustercell::emcalclusterId; @@ -133,11 +138,14 @@ struct JetDerivedDataProducerTask { Service pdgDatabase; Zorro triggerDecider; + ctpRateFetcher rateFetcher; int runNumber; + float hadronicRate; bool withCollisionAssociator; void init(InitContext const&) { - if (doprocessTracksWithCollisionAssociator || includeTriggers) { + hadronicRate = -1.0; + if (doprocessTracksWithCollisionAssociator || includeHadronicRate || includeTriggers) { ccdb->setURL(ccdbUrl); ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); @@ -169,15 +177,21 @@ struct JetDerivedDataProducerTask { } PROCESS_SWITCH(JetDerivedDataProducerTask, processBunchCrossings, "produces derived bunch crossing table", false); - void processCollisions(soa::Join::iterator const& collision, soa::Join const&) + void processCollisions(soa::Join::iterator const& collision, soa::Join const&) { + auto bc = collision.bc_as>(); + if (includeHadronicRate) { + if (runNumber != bc.runNumber()) { + runNumber = bc.runNumber(); + hadronicRate = rateFetcher.fetch(ccdb.service, bc.timestamp(), runNumber, "ZNC hadronic") * 0.001; + } + } uint64_t triggerBit = 0; if (includeTriggers) { - auto bc = collision.bc_as>(); triggerDecider.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), jetderiveddatautilities::JTriggerMasks); triggerBit = jetderiveddatautilities::setTriggerSelectionBit(triggerDecider.getTriggerOfInterestResults(bc.globalBC())); } - products.jCollisionsTable(collision.posX(), collision.posY(), collision.posZ(), collision.multFT0C(), collision.centFT0C(), collision.trackOccupancyInTimeRange(), jetderiveddatautilities::setEventSelectionBit(collision), collision.alias_raw(), triggerBit); // note change multFT0C to multFT0M when problems with multFT0A are fixed + products.jCollisionsTable(collision.posX(), collision.posY(), collision.posZ(), collision.multFT0C(), collision.centFT0C(), collision.centFT0CVariant1(), hadronicRate, collision.trackOccupancyInTimeRange(), jetderiveddatautilities::setEventSelectionBit(collision), collision.alias_raw(), triggerBit); // note change multFT0C to multFT0M when problems with multFT0A are fixed products.jCollisionsParentIndexTable(collision.globalIndex()); products.jCollisionsBunchCrossingIndexTable(collision.bcId()); } @@ -191,7 +205,7 @@ struct JetDerivedDataProducerTask { triggerDecider.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), jetderiveddatautilities::JTriggerMasks); triggerBit = jetderiveddatautilities::setTriggerSelectionBit(triggerDecider.getTriggerOfInterestResults(bc.globalBC())); } - products.jCollisionsTable(collision.posX(), collision.posY(), collision.posZ(), -1.0, -1.0, -1, jetderiveddatautilities::setEventSelectionBit(collision), collision.alias_raw(), triggerBit); + products.jCollisionsTable(collision.posX(), collision.posY(), collision.posZ(), -1.0, -1.0, -1.0, -1.0, -1, jetderiveddatautilities::setEventSelectionBit(collision), collision.alias_raw(), triggerBit); products.jCollisionsParentIndexTable(collision.globalIndex()); products.jCollisionsBunchCrossingIndexTable(collision.bcId()); } @@ -199,7 +213,7 @@ struct JetDerivedDataProducerTask { void processCollisionsRun2(soa::Join::iterator const& collision) { - products.jCollisionsTable(collision.posX(), collision.posY(), collision.posZ(), collision.multFT0C(), collision.centRun2V0M(), -1, jetderiveddatautilities::setEventSelectionBit(collision), collision.alias_raw(), 0); // note change multFT0C to multFT0M when problems with multFT0A are fixed + products.jCollisionsTable(collision.posX(), collision.posY(), collision.posZ(), collision.multFT0C(), collision.centRun2V0M(), -1.0, -1.0, -1, jetderiveddatautilities::setEventSelectionBit(collision), collision.alias_raw(), 0); // note change multFT0C to multFT0M when problems with multFT0A are fixed products.jCollisionsParentIndexTable(collision.globalIndex()); products.jCollisionsBunchCrossingIndexTable(collision.bcId()); } @@ -207,7 +221,7 @@ struct JetDerivedDataProducerTask { void processCollisionsALICE3(aod::Collision const& collision) { - products.jCollisionsTable(collision.posX(), collision.posY(), collision.posZ(), -1.0, -1.0, -1, -1.0, 0, 0); + products.jCollisionsTable(collision.posX(), collision.posY(), collision.posZ(), -1.0, -1.0, -1.0, -1.0, -1, -1.0, 0, 0); products.jCollisionsParentIndexTable(collision.globalIndex()); products.jCollisionsBunchCrossingIndexTable(-1); } @@ -274,6 +288,7 @@ struct JetDerivedDataProducerTask { void processTracksWithCollisionAssociator(aod::Collisions const& collisions, soa::Join const&, soa::Join const&, aod::TrackAssoc const& assocCollisions) { + runNumber = 0; for (auto const& collision : collisions) { auto collisionTrackIndices = assocCollisions.sliceBy(perCollisionTrackIndices, collision.globalIndex()); for (auto const& collisionTrackIndex : collisionTrackIndices) { diff --git a/PWGJE/TableProducer/derivedDataWriter.cxx b/PWGJE/TableProducer/derivedDataWriter.cxx index 2b2cabbf2e2..dfd1c82b200 100644 --- a/PWGJE/TableProducer/derivedDataWriter.cxx +++ b/PWGJE/TableProducer/derivedDataWriter.cxx @@ -292,7 +292,7 @@ struct JetDerivedDataWriter { for (auto const& collision : collisions) { if (collision.isCollisionSelected()) { - products.storedJCollisionsTable(collision.posX(), collision.posY(), collision.posZ(), collision.multiplicity(), collision.centrality(), collision.trackOccupancyInTimeRange(), collision.eventSel(), collision.alias_raw(), collision.triggerSel()); + products.storedJCollisionsTable(collision.posX(), collision.posY(), collision.posZ(), collision.multiplicity(), collision.centrality(), collision.centralityVariant1(), collision.hadronicRate(), collision.trackOccupancyInTimeRange(), collision.eventSel(), collision.alias_raw(), collision.triggerSel()); collisionMapping[collision.globalIndex()] = products.storedJCollisionsTable.lastIndex(); products.storedJCollisionMcInfosTable(collision.weight(), collision.subGeneratorId()); products.storedJCollisionsParentIndexTable(collision.collisionId()); diff --git a/PWGJE/Tasks/jetSubstructureBplusOutput.cxx b/PWGJE/Tasks/jetSubstructureBplusOutput.cxx index 0e2880bfe48..fec4c2a27ec 100644 --- a/PWGJE/Tasks/jetSubstructureBplusOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureBplusOutput.cxx @@ -16,7 +16,7 @@ #include #include "PWGJE/Tasks/jetSubstructureHFOutput.cxx" -using JetSubstructureOutputBplus = JetSubstructureHFOutputTask, aod::McCollisionsBplus, aod::CandidatesBplusData, aod::CandidatesBplusMCD, aod::CandidatesBplusMCP, aod::BkgBplusRhos, aod::BkgBplusMcRhos, aod::JTrackBplusSubs, soa::Join, soa::Join, soa::Join, soa::Join, aod::BplusCJetCOs, aod::BplusCJetOs, aod::BplusCJetSSOs, aod::BplusCJetMOs, soa::Join, soa::Join, soa::Join, aod::BplusCMCDJetCOs, aod::BplusCMCDJetOs, aod::BplusCMCDJetSSOs, aod::BplusCMCDJetMOs, soa::Join, soa::Join, soa::Join, soa::Join, aod::BplusCMCPJetCOs, aod::BplusCMCPJetOs, aod::BplusCMCPJetSSOs, aod::BplusCMCPJetMOs, soa::Join, soa::Join, soa::Join, aod::BplusCEWSJetCOs, aod::BplusCEWSJetOs, aod::BplusCEWSJetSSOs, aod::BplusCEWSJetMOs, aod::StoredHfBplusCollBase, aod::StoredHfBplusBases, aod::StoredHfBplusPars, aod::StoredHfBplusParEs, aod::StoredHfBplusParD0s, aod::StoredHfBplusSels, aod::StoredHfBplusMls, aod::StoredHfBplusMlD0s, aod::StoredHfBplusMcs, aod::StoredHfBplusMcCollBases, aod::StoredHfBplusMcRCollIds, aod::StoredHfBplusPBases>; +using JetSubstructureOutputBplus = JetSubstructureHFOutputTask, aod::McCollisionsBplus, aod::CandidatesBplusData, aod::CandidatesBplusMCD, aod::CandidatesBplusMCP, aod::BkgBplusRhos, aod::BkgBplusMcRhos, aod::JTrackBplusSubs, soa::Join, soa::Join, soa::Join, soa::Join, aod::BplusCJetCOs, aod::BplusCJetOs, aod::BplusCJetSSOs, aod::BplusCJetMOs, soa::Join, soa::Join, soa::Join, aod::BplusCMCDJetCOs, aod::BplusCMCDJetOs, aod::BplusCMCDJetSSOs, aod::BplusCMCDJetMOs, soa::Join, soa::Join, soa::Join, soa::Join, aod::BplusCMCPJetCOs, aod::BplusCMCPJetMCCOs, aod::BplusCMCPJetOs, aod::BplusCMCPJetSSOs, aod::BplusCMCPJetMOs, soa::Join, soa::Join, soa::Join, aod::BplusCEWSJetCOs, aod::BplusCEWSJetOs, aod::BplusCEWSJetSSOs, aod::BplusCEWSJetMOs, aod::StoredHfBplusCollBase, aod::StoredHfBplusBases, aod::StoredHfBplusPars, aod::StoredHfBplusParEs, aod::StoredHfBplusParD0s, aod::StoredHfBplusSels, aod::StoredHfBplusMls, aod::StoredHfBplusMlD0s, aod::StoredHfBplusMcs, aod::StoredHfBplusMcCollBases, aod::StoredHfBplusMcRCollIds, aod::StoredHfBplusPBases>; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGJE/Tasks/jetSubstructureD0Output.cxx b/PWGJE/Tasks/jetSubstructureD0Output.cxx index 571055851c1..43b909a3688 100644 --- a/PWGJE/Tasks/jetSubstructureD0Output.cxx +++ b/PWGJE/Tasks/jetSubstructureD0Output.cxx @@ -16,7 +16,7 @@ #include #include "PWGJE/Tasks/jetSubstructureHFOutput.cxx" -using JetSubstructureOutputD0 = JetSubstructureHFOutputTask, aod::McCollisionsD0, aod::CandidatesD0Data, aod::CandidatesD0MCD, aod::CandidatesD0MCP, aod::BkgD0Rhos, aod::BkgD0McRhos, aod::JTrackD0Subs, soa::Join, soa::Join, soa::Join, soa::Join, aod::D0CJetCOs, aod::D0CJetOs, aod::D0CJetSSOs, aod::D0CJetMOs, soa::Join, soa::Join, soa::Join, aod::D0CMCDJetCOs, aod::D0CMCDJetOs, aod::D0CMCDJetSSOs, aod::D0CMCDJetMOs, soa::Join, soa::Join, soa::Join, soa::Join, aod::D0CMCPJetCOs, aod::D0CMCPJetOs, aod::D0CMCPJetSSOs, aod::D0CMCPJetMOs, soa::Join, soa::Join, soa::Join, aod::D0CEWSJetCOs, aod::D0CEWSJetOs, aod::D0CEWSJetSSOs, aod::D0CEWSJetMOs, aod::StoredHfD0CollBase, aod::StoredHfD0Bases, aod::StoredHfD0Pars, aod::StoredHfD0ParEs, aod::JDumD0ParDaus, aod::StoredHfD0Sels, aod::StoredHfD0Mls, aod::JDumD0MlDaus, aod::StoredHfD0Mcs, aod::StoredHfD0McCollBases, aod::StoredHfD0McRCollIds, aod::StoredHfD0PBases>; +using JetSubstructureOutputD0 = JetSubstructureHFOutputTask, aod::McCollisionsD0, aod::CandidatesD0Data, aod::CandidatesD0MCD, aod::CandidatesD0MCP, aod::BkgD0Rhos, aod::BkgD0McRhos, aod::JTrackD0Subs, soa::Join, soa::Join, soa::Join, soa::Join, aod::D0CJetCOs, aod::D0CJetOs, aod::D0CJetSSOs, aod::D0CJetMOs, soa::Join, soa::Join, soa::Join, aod::D0CMCDJetCOs, aod::D0CMCDJetOs, aod::D0CMCDJetSSOs, aod::D0CMCDJetMOs, soa::Join, soa::Join, soa::Join, soa::Join, aod::D0CMCPJetCOs, aod::D0CMCPJetMCCOs, aod::D0CMCPJetOs, aod::D0CMCPJetSSOs, aod::D0CMCPJetMOs, soa::Join, soa::Join, soa::Join, aod::D0CEWSJetCOs, aod::D0CEWSJetOs, aod::D0CEWSJetSSOs, aod::D0CEWSJetMOs, aod::StoredHfD0CollBase, aod::StoredHfD0Bases, aod::StoredHfD0Pars, aod::StoredHfD0ParEs, aod::JDumD0ParDaus, aod::StoredHfD0Sels, aod::StoredHfD0Mls, aod::JDumD0MlDaus, aod::StoredHfD0Mcs, aod::StoredHfD0McCollBases, aod::StoredHfD0McRCollIds, aod::StoredHfD0PBases>; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGJE/Tasks/jetSubstructureDielectronOutput.cxx b/PWGJE/Tasks/jetSubstructureDielectronOutput.cxx index 1d3ab203a00..8c8d7a8980d 100644 --- a/PWGJE/Tasks/jetSubstructureDielectronOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureDielectronOutput.cxx @@ -16,7 +16,7 @@ #include #include "PWGJE/Tasks/jetSubstructureHFOutput.cxx" -using JetSubstructureOutputDielectron = JetSubstructureHFOutputTask, aod::McCollisionsDielectron, aod::CandidatesDielectronData, aod::CandidatesDielectronMCD, aod::CandidatesDielectronMCP, aod::BkgDielectronRhos, aod::BkgDielectronMcRhos, aod::JTrackDielectronSubs, soa::Join, soa::Join, soa::Join, soa::Join, aod::DielectronCJetCOs, aod::DielectronCJetOs, aod::DielectronCJetSSOs, aod::DielectronCJetMOs, soa::Join, soa::Join, soa::Join, aod::DielectronCMCDJetCOs, aod::DielectronCMCDJetOs, aod::DielectronCMCDJetSSOs, aod::DielectronCMCDJetMOs, soa::Join, soa::Join, soa::Join, soa::Join, aod::DielectronCMCPJetCOs, aod::DielectronCMCPJetOs, aod::DielectronCMCPJetSSOs, aod::DielectronCMCPJetMOs, soa::Join, soa::Join, soa::Join, aod::DielectronCEWSJetCOs, aod::DielectronCEWSJetOs, aod::DielectronCEWSJetSSOs, aod::DielectronCEWSJetMOs, aod::StoredReducedEvents, aod::StoredDielectrons, aod::JDielectron1Dummys, aod::JDielectron2Dummys, aod::JDielectron3Dummys, aod::JDielectron4Dummys, aod::JDielectron5Dummys, aod::JDielectron6Dummys, aod::JDielectron7Dummys, aod::StoredJDielectronMcCollisions, aod::JDielectronMcRCollDummys, aod::StoredJDielectronMcs>; +using JetSubstructureOutputDielectron = JetSubstructureHFOutputTask, aod::McCollisionsDielectron, aod::CandidatesDielectronData, aod::CandidatesDielectronMCD, aod::CandidatesDielectronMCP, aod::BkgDielectronRhos, aod::BkgDielectronMcRhos, aod::JTrackDielectronSubs, soa::Join, soa::Join, soa::Join, soa::Join, aod::DielectronCJetCOs, aod::DielectronCJetOs, aod::DielectronCJetSSOs, aod::DielectronCJetMOs, soa::Join, soa::Join, soa::Join, aod::DielectronCMCDJetCOs, aod::DielectronCMCDJetOs, aod::DielectronCMCDJetSSOs, aod::DielectronCMCDJetMOs, soa::Join, soa::Join, soa::Join, soa::Join, aod::DielectronCMCPJetCOs, aod::DielectronCMCPJetMCCOs, aod::DielectronCMCPJetOs, aod::DielectronCMCPJetSSOs, aod::DielectronCMCPJetMOs, soa::Join, soa::Join, soa::Join, aod::DielectronCEWSJetCOs, aod::DielectronCEWSJetOs, aod::DielectronCEWSJetSSOs, aod::DielectronCEWSJetMOs, aod::StoredReducedEvents, aod::StoredDielectrons, aod::JDielectron1Dummys, aod::JDielectron2Dummys, aod::JDielectron3Dummys, aod::JDielectron4Dummys, aod::JDielectron5Dummys, aod::JDielectron6Dummys, aod::JDielectron7Dummys, aod::StoredJDielectronMcCollisions, aod::JDielectronMcRCollDummys, aod::StoredJDielectronMcs>; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGJE/Tasks/jetSubstructureDplusOutput.cxx b/PWGJE/Tasks/jetSubstructureDplusOutput.cxx index 7aa35616fc0..e45dfc5833c 100644 --- a/PWGJE/Tasks/jetSubstructureDplusOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureDplusOutput.cxx @@ -16,7 +16,7 @@ #include #include "PWGJE/Tasks/jetSubstructureHFOutput.cxx" -using JetSubstructureOutputDplus = JetSubstructureHFOutputTask, aod::McCollisionsDplus, aod::CandidatesDplusData, aod::CandidatesDplusMCD, aod::CandidatesDplusMCP, aod::BkgDplusRhos, aod::BkgDplusMcRhos, aod::JTrackDplusSubs, soa::Join, soa::Join, soa::Join, soa::Join, aod::DplusCJetCOs, aod::DplusCJetOs, aod::DplusCJetSSOs, aod::DplusCJetMOs, soa::Join, soa::Join, soa::Join, aod::DplusCMCDJetCOs, aod::DplusCMCDJetOs, aod::DplusCMCDJetSSOs, aod::DplusCMCDJetMOs, soa::Join, soa::Join, soa::Join, soa::Join, aod::DplusCMCPJetCOs, aod::DplusCMCPJetOs, aod::DplusCMCPJetSSOs, aod::DplusCMCPJetMOs, soa::Join, soa::Join, soa::Join, aod::DplusCEWSJetCOs, aod::DplusCEWSJetOs, aod::DplusCEWSJetSSOs, aod::DplusCEWSJetMOs, aod::StoredHfDplusCollBase, aod::StoredHfDplusBases, aod::StoredHfDplusPars, aod::StoredHfDplusParEs, aod::JDumDplusParDaus, aod::StoredHfDplusSels, aod::StoredHfDplusMls, aod::JDumDplusMlDaus, aod::StoredHfDplusMcs, aod::StoredHfDplusMcCollBases, aod::StoredHfDplusMcRCollIds, aod::StoredHfDplusPBases>; +using JetSubstructureOutputDplus = JetSubstructureHFOutputTask, aod::McCollisionsDplus, aod::CandidatesDplusData, aod::CandidatesDplusMCD, aod::CandidatesDplusMCP, aod::BkgDplusRhos, aod::BkgDplusMcRhos, aod::JTrackDplusSubs, soa::Join, soa::Join, soa::Join, soa::Join, aod::DplusCJetCOs, aod::DplusCJetOs, aod::DplusCJetSSOs, aod::DplusCJetMOs, soa::Join, soa::Join, soa::Join, aod::DplusCMCDJetCOs, aod::DplusCMCDJetOs, aod::DplusCMCDJetSSOs, aod::DplusCMCDJetMOs, soa::Join, soa::Join, soa::Join, soa::Join, aod::DplusCMCPJetCOs, aod::DplusCMCPJetMCCOs, aod::DplusCMCPJetOs, aod::DplusCMCPJetSSOs, aod::DplusCMCPJetMOs, soa::Join, soa::Join, soa::Join, aod::DplusCEWSJetCOs, aod::DplusCEWSJetOs, aod::DplusCEWSJetSSOs, aod::DplusCEWSJetMOs, aod::StoredHfDplusCollBase, aod::StoredHfDplusBases, aod::StoredHfDplusPars, aod::StoredHfDplusParEs, aod::JDumDplusParDaus, aod::StoredHfDplusSels, aod::StoredHfDplusMls, aod::JDumDplusMlDaus, aod::StoredHfDplusMcs, aod::StoredHfDplusMcCollBases, aod::StoredHfDplusMcRCollIds, aod::StoredHfDplusPBases>; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGJE/Tasks/jetSubstructureHFOutput.cxx b/PWGJE/Tasks/jetSubstructureHFOutput.cxx index 14755a98226..ffa526f1a11 100644 --- a/PWGJE/Tasks/jetSubstructureHFOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureHFOutput.cxx @@ -45,7 +45,7 @@ using namespace o2::framework::expressions; // NB: runDataProcessing.h must be included after customize! #include "Framework/runDataProcessing.h" -template +template struct JetSubstructureHFOutputTask { struct : ProducesGroup { @@ -62,6 +62,7 @@ struct JetSubstructureHFOutputTask { Produces jetSubstructureOutputTableMCD; Produces jetMatchingOutputTableMCD; Produces collisionOutputTableMCP; + Produces hfMcOnlyCollisionsTable; Produces jetOutputTableMCP; Produces jetSubstructureOutputTableMCP; Produces jetMatchingOutputTableMCP; @@ -542,11 +543,14 @@ struct JetSubstructureHFOutputTask { } PROCESS_SWITCH(JetSubstructureHFOutputTask, processClearMaps, "process function that clears all the non-mcp maps in each dataframe", true); - void processClearMapsMCP(aod::JetMcCollisions const&) + void processClearMapsMCP(aod::JetMcCollisions const& mcCollisions) { candidateMappingMCP.clear(); jetMappingMCP.clear(); candidateMcCollisionMapping.clear(); + for (auto mcCollision : mcCollisions) { + products.hfMcOnlyCollisionsTable(mcCollision.posZ(), mcCollision.accepted(), mcCollision.attempted(), mcCollision.xsectGen(), mcCollision.xsectErr(), mcCollision.weight()); + } } PROCESS_SWITCH(JetSubstructureHFOutputTask, processClearMapsMCP, "process function that clears all the mcp maps in each dataframe", true); diff --git a/PWGJE/Tasks/jetSubstructureLcOutput.cxx b/PWGJE/Tasks/jetSubstructureLcOutput.cxx index dcc5b6b9f80..992dc6e2259 100644 --- a/PWGJE/Tasks/jetSubstructureLcOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureLcOutput.cxx @@ -16,7 +16,7 @@ #include #include "PWGJE/Tasks/jetSubstructureHFOutput.cxx" -using JetSubstructureOutputLc = JetSubstructureHFOutputTask, aod::McCollisionsLc, aod::CandidatesLcData, aod::CandidatesLcMCD, aod::CandidatesLcMCP, aod::BkgLcRhos, aod::BkgLcMcRhos, aod::JTrackLcSubs, soa::Join, soa::Join, soa::Join, soa::Join, aod::LcCJetCOs, aod::LcCJetOs, aod::LcCJetSSOs, aod::LcCJetMOs, soa::Join, soa::Join, soa::Join, aod::LcCMCDJetCOs, aod::LcCMCDJetOs, aod::LcCMCDJetSSOs, aod::LcCMCDJetMOs, soa::Join, soa::Join, soa::Join, soa::Join, aod::LcCMCPJetCOs, aod::LcCMCPJetOs, aod::LcCMCPJetSSOs, aod::LcCMCPJetMOs, soa::Join, soa::Join, soa::Join, aod::LcCEWSJetCOs, aod::LcCEWSJetOs, aod::LcCEWSJetSSOs, aod::LcCEWSJetMOs, aod::StoredHfLcCollBase, aod::StoredHfLcBases, aod::StoredHfLcPars, aod::StoredHfLcParEs, aod::JDumLcParDaus, aod::StoredHfLcSels, aod::StoredHfLcMls, aod::JDumLcMlDaus, aod::StoredHfLcMcs, aod::StoredHfLcMcCollBases, aod::StoredHfLcMcRCollIds, aod::StoredHfLcPBases>; +using JetSubstructureOutputLc = JetSubstructureHFOutputTask, aod::McCollisionsLc, aod::CandidatesLcData, aod::CandidatesLcMCD, aod::CandidatesLcMCP, aod::BkgLcRhos, aod::BkgLcMcRhos, aod::JTrackLcSubs, soa::Join, soa::Join, soa::Join, soa::Join, aod::LcCJetCOs, aod::LcCJetOs, aod::LcCJetSSOs, aod::LcCJetMOs, soa::Join, soa::Join, soa::Join, aod::LcCMCDJetCOs, aod::LcCMCDJetOs, aod::LcCMCDJetSSOs, aod::LcCMCDJetMOs, soa::Join, soa::Join, soa::Join, soa::Join, aod::LcCMCPJetCOs, aod::LcCMCPJetMCCOs, aod::LcCMCPJetOs, aod::LcCMCPJetSSOs, aod::LcCMCPJetMOs, soa::Join, soa::Join, soa::Join, aod::LcCEWSJetCOs, aod::LcCEWSJetOs, aod::LcCEWSJetSSOs, aod::LcCEWSJetMOs, aod::StoredHfLcCollBase, aod::StoredHfLcBases, aod::StoredHfLcPars, aod::StoredHfLcParEs, aod::JDumLcParDaus, aod::StoredHfLcSels, aod::StoredHfLcMls, aod::JDumLcMlDaus, aod::StoredHfLcMcs, aod::StoredHfLcMcCollBases, aod::StoredHfLcMcRCollIds, aod::StoredHfLcPBases>; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGJE/Tasks/jetSubstructureOutput.cxx b/PWGJE/Tasks/jetSubstructureOutput.cxx index a1790f1bfb7..fab2581ad2a 100644 --- a/PWGJE/Tasks/jetSubstructureOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureOutput.cxx @@ -62,6 +62,7 @@ struct JetSubstructureOutputTask { Produces jetOutputTableMCP; Produces jetSubstructureOutputTableMCP; Produces jetMatchingOutputTableMCP; + Produces mcCollisionOutputTable; Configurable jetPtMinData{"jetPtMinData", 0.0, "minimum jet pT cut for data jets"}; Configurable jetPtMinDataSub{"jetPtMinDataSub", 0.0, "minimum jet pT cut for eventwise constituent subtracted data jets"}; @@ -309,9 +310,12 @@ struct JetSubstructureOutputTask { } PROCESS_SWITCH(JetSubstructureOutputTask, processClearMaps, "process function that clears all the non-mcp maps in each dataframe", true); - void processClearMapsMCP(aod::JetMcCollisions const&) + void processClearMapsMCP(aod::JetMcCollisions const& mcCollisions) { jetMappingMCP.clear(); + for (auto mcCollision : mcCollisions) { + mcCollisionOutputTable(mcCollision.posZ(), mcCollision.accepted(), mcCollision.attempted(), mcCollision.xsectGen(), mcCollision.xsectErr(), mcCollision.weight()); + } } PROCESS_SWITCH(JetSubstructureOutputTask, processClearMapsMCP, "process function that clears all the mcp maps in each dataframe", true); From 625edd0ea105eef1cce1da6eca97f05afce68b01 Mon Sep 17 00:00:00 2001 From: marcobianchi463 <121625445+marcobianchi463@users.noreply.github.com> Date: Fri, 7 Mar 2025 18:21:07 +0100 Subject: [PATCH 0600/1650] [PWGLF] Add task specific to flow (#10391) --- PWGLF/TableProducer/Nuspex/CMakeLists.txt | 5 + PWGLF/TableProducer/Nuspex/nucleiFlowTree.cxx | 486 ++++++++++++++++++ PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx | 4 +- PWGLF/TableProducer/Nuspex/nucleiUtils.h | 186 +++++++ 4 files changed, 679 insertions(+), 2 deletions(-) create mode 100644 PWGLF/TableProducer/Nuspex/nucleiFlowTree.cxx create mode 100644 PWGLF/TableProducer/Nuspex/nucleiUtils.h diff --git a/PWGLF/TableProducer/Nuspex/CMakeLists.txt b/PWGLF/TableProducer/Nuspex/CMakeLists.txt index 67738870283..a015f240c2e 100644 --- a/PWGLF/TableProducer/Nuspex/CMakeLists.txt +++ b/PWGLF/TableProducer/Nuspex/CMakeLists.txt @@ -103,3 +103,8 @@ o2physics_add_dpl_workflow(reduced3body-creator SOURCES reduced3bodyCreator.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore KFParticle::KFParticle O2Physics::EventFilteringUtils O2::TOFBase COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(nuclei-flow-trees + SOURCES nucleiFlowTree.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DetectorsBase O2Physics::EventFilteringUtils + COMPONENT_NAME Analysis) diff --git a/PWGLF/TableProducer/Nuspex/nucleiFlowTree.cxx b/PWGLF/TableProducer/Nuspex/nucleiFlowTree.cxx new file mode 100644 index 00000000000..ed8f915296d --- /dev/null +++ b/PWGLF/TableProducer/Nuspex/nucleiFlowTree.cxx @@ -0,0 +1,486 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +// +// Nuclei spectra analysis task +// ======================== +// +// Executable + dependencies: +// +// Data (run3): +// o2-analysis-lf-nuclei-spectra, o2-analysis-timestamp +// o2-analysis-pid-tof-base, o2-analysis-multiplicity-table, o2-analysis-event-selection +// (to add flow: o2-analysis-qvector-table, o2-analysis-centrality-table) + +#include +#include +#include +#include +#include + +#include "Math/Vector4D.h" + +#include "CCDB/BasicCCDBManager.h" + +#include "Common/Core/TrackSelection.h" +#include "Common/Core/trackUtilities.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/PIDResponseITS.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/Core/PID/PIDTOF.h" +#include "Common/TableProducer/PID/pidTOFBase.h" +#include "Common/Core/EventPlaneHelper.h" +#include "Common/DataModel/Qvectors.h" +#include "Common/Tools/TrackTuner.h" +#include "Common/Core/RecoDecay.h" + +#include "DataFormatsParameters/GRPMagField.h" +#include "DataFormatsParameters/GRPObject.h" +#include "DataFormatsTPC/BetheBlochAleph.h" +#include "DetectorsBase/GeometryManager.h" +#include "DetectorsBase/Propagator.h" + +#include "EventFiltering/Zorro.h" +#include "EventFiltering/ZorroSummary.h" + +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/runDataProcessing.h" + +#include "ReconstructionDataFormats/Track.h" + +#include "PWGLF/DataModel/EPCalibrationTables.h" +#include "PWGLF/DataModel/LFSlimNucleiTables.h" + +#include "TRandom3.h" + +#include "nucleiUtils.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::constants::physics; + +struct nucleiFlowTree { + enum { + kProton = BIT(0), + kDeuteron = BIT(1), + kTriton = BIT(2), + kHe3 = BIT(3), + kHe4 = BIT(4), + kHasTOF = BIT(5), + kHasTRD = BIT(6), + kIsAmbiguous = BIT(7), /// just a placeholder now + kITSrof = BIT(8), + kIsPhysicalPrimary = BIT(9), /// MC flags starting from the second half of the short + kIsSecondaryFromMaterial = BIT(10), + kIsSecondaryFromWeakDecay = BIT(11) /// the last 4 bits are reserved for the PID in tracking + }; + + Produces nucleiTable; + Produces nucleiTableMC; + Produces nucleiTableFlow; + Service ccdb; + Zorro zorro; + OutputObj zorroSummary{"zorroSummary"}; + + Configurable cfgCompensatePIDinTracking{"cfgCompensatePIDinTracking", false, "If true, divide tpcInnerParam by the electric charge"}; + + Configurable cfgCentralityEstimator{"cfgCentralityEstimator", 0, "Centrality estimator (FV0A: 0, FT0M: 1, FT0A: 2, FT0C: 3)"}; + Configurable cfgCMrapidity{"cfgCMrapidity", 0.f, "Rapidity of the center of mass (only for p-Pb)"}; + Configurable cfgCutVertex{"cfgCutVertex", 10.0f, "Accepted z-vertex range"}; + Configurable cfgCutEta{"cfgCutEta", 0.8f, "Eta range for tracks"}; + Configurable cfgCutTpcMom{"cfgCutTpcMom", 0.2f, "Minimum TPC momentum for tracks"}; + Configurable cfgCutRapidityMin{"cfgCutRapidityMin", -0.5, "Minimum rapidity for tracks"}; + Configurable cfgCutRapidityMax{"cfgCutRapidityMax", 0.5, "Maximum rapidity for tracks"}; + Configurable cfgCutOnReconstructedRapidity{"cfgCutOnReconstructedRapidity", false, "Cut on reconstructed rapidity"}; + Configurable cfgCutNclusITS{"cfgCutNclusITS", 5, "Minimum number of ITS clusters"}; + Configurable cfgCutNclusTPC{"cfgCutNclusTPC", 70, "Minimum number of TPC clusters"}; + Configurable cfgCutPtMinTree{"cfgCutPtMinTree", 0.2f, "Minimum track transverse momentum for tree saving"}; + Configurable cfgCutPtMaxTree{"cfgCutPtMaxTree", 15.0f, "Maximum track transverse momentum for tree saving"}; + + Configurable> cfgEventSelections{"cfgEventSelections", {nuclei::EvSelDefault[0], 8, 1, nuclei::eventSelectionLabels, nuclei::eventSelectionTitle}, "Event selections"}; + + Configurable> cfgMomentumScalingBetheBloch{"cfgMomentumScalingBetheBloch", {nuclei::bbMomScalingDefault[0], 5, 2, nuclei::names, nuclei::chargeLabelNames}, "TPC Bethe-Bloch momentum scaling for light nuclei"}; + Configurable> cfgBetheBlochParams{"cfgBetheBlochParams", {nuclei::betheBlochDefault[0], 5, 6, nuclei::names, nuclei::betheBlochParNames}, "TPC Bethe-Bloch parameterisation for light nuclei"}; + Configurable> cfgNsigmaTPC{"cfgNsigmaTPC", {nuclei::nSigmaTPCdefault[0], 5, 2, nuclei::names, nuclei::nSigmaConfigName}, "TPC nsigma selection for light nuclei"}; + Configurable> cfgDCAcut{"cfgDCAcut", {nuclei::DCAcutDefault[0], 5, 2, nuclei::names, nuclei::nDCAConfigName}, "Max DCAxy and DCAz for light nuclei"}; + Configurable> cfgDownscaling{"cfgDownscaling", {nuclei::DownscalingDefault[0], 5, 1, nuclei::names, nuclei::DownscalingConfigName}, "Fraction of kept candidates for light nuclei"}; + Configurable> cfgTreeConfig{"cfgTreeConfig", {nuclei::TreeConfigDefault[0], 5, 2, nuclei::names, nuclei::treeConfigNames}, "Filtered trees configuration"}; + + ConfigurableAxis cfgNITSClusBins{"cfgNITSClusBins", {3, 4.5, 7.5}, "N ITS clusters binning"}; + ConfigurableAxis cfgNTPCClusBins{"cfgNTPCClusBins", {3, 89.5, 159.5}, "N TPC clusters binning"}; + + Configurable cfgSkimmedProcessing{"cfgSkimmedProcessing", false, "Skimmed dataset processing"}; + + o2::track::TrackParametrizationWithError mTrackParCov; + o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT; + + // CCDB options + Configurable cfgMaterialCorrection{"cfgMaterialCorrection", static_cast(o2::base::Propagator::MatCorrType::USEMatCorrLUT), "Type of material correction"}; + Configurable cfgCCDBurl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable cfgZorroCCDBpath{"cfgZorroCCDBpath", "/Users/m/mpuccio/EventFiltering/OTS/", "path to the zorro ccdb objects"}; + int mRunNumber = 0; + float mBz = 0.f; + + using TrackCandidates = soa::Join; + + // Collisions with chentrality + using CollWithCent = soa::Join::iterator; + + // Flow analysis + using CollWithEP = soa::Join::iterator; + + using CollWithQvec = soa::Join::iterator; + + HistogramRegistry spectra{"spectra", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + + float computeEventPlane(float y, float x) + { + return 0.5 * std::atan2(y, x); + } + + template + bool eventSelectionWithHisto(Tcoll& collision) + { + spectra.fill(HIST("hEventSelections"), 0); + + if (cfgEventSelections->get(nuclei::evSel::kTVX) && !collision.selection_bit(aod::evsel::kIsTriggerTVX)) { + return false; + } + spectra.fill(HIST("hEventSelections"), nuclei::evSel::kTVX + 1); + + if (cfgEventSelections->get(nuclei::evSel::kZvtx) && std::abs(collision.posZ()) > cfgCutVertex) { + return false; + } + spectra.fill(HIST("hEventSelections"), nuclei::evSel::kZvtx + 1); + + if (cfgEventSelections->get(nuclei::evSel::kTFborder) && !collision.selection_bit(aod::evsel::kNoTimeFrameBorder)) { + return false; + } + spectra.fill(HIST("hEventSelections"), nuclei::evSel::kTFborder + 1); + + if (cfgEventSelections->get(nuclei::evSel::kITSROFborder) && !collision.selection_bit(aod::evsel::kNoITSROFrameBorder)) { + return false; + } + spectra.fill(HIST("hEventSelections"), nuclei::evSel::kITSROFborder + 1); + + if (cfgEventSelections->get(nuclei::evSel::kNoSameBunchPileup) && !collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { + return false; + } + spectra.fill(HIST("hEventSelections"), nuclei::evSel::kNoSameBunchPileup + 1); + + if (cfgEventSelections->get(nuclei::evSel::kIsGoodZvtxFT0vsPV) && !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { + return false; + } + spectra.fill(HIST("hEventSelections"), nuclei::evSel::kIsGoodZvtxFT0vsPV + 1); + + if (cfgEventSelections->get(nuclei::evSel::kIsGoodITSLayersAll) && !collision.selection_bit(aod::evsel::kIsGoodITSLayersAll)) { + return false; + } + spectra.fill(HIST("hEventSelections"), nuclei::evSel::kIsGoodITSLayersAll + 1); + + if constexpr ( + requires { + collision.triggereventep(); + }) { + if (cfgEventSelections->get(nuclei::evSel::kIsEPtriggered) && !collision.triggereventep()) { + return false; + } + spectra.fill(HIST("hEventSelections"), nuclei::evSel::kIsEPtriggered + 1); + } + + float centrality = getCentrality(collision); + spectra.fill(HIST("hCentrality"), centrality); + + return true; + } + + void initCCDB(aod::BCsWithTimestamps::iterator const& bc) + { + if (mRunNumber == bc.runNumber()) { + return; + } + if (cfgSkimmedProcessing) { + zorro.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), "fHe"); + zorro.populateHistRegistry(spectra, bc.runNumber()); + } + auto timestamp = bc.timestamp(); + mRunNumber = bc.runNumber(); + + o2::parameters::GRPMagField* grpmag = ccdb->getForTimeStamp("GLO/Config/GRPMagField", timestamp); + o2::base::Propagator::initFieldFromGRP(grpmag); + o2::base::Propagator::Instance()->setMatLUT(nuclei::lut); + mBz = static_cast(grpmag->getNominalL3Field()); + LOGF(info, "Retrieved GRP for timestamp %ull (%i) with magnetic field of %1.2f kZG", timestamp, mRunNumber, mBz); + } + + void init(o2::framework::InitContext&) + { + zorroSummary.setObject(zorro.getZorroSummary()); + zorro.setBaseCCDBPath(cfgZorroCCDBpath.value); + ccdb->setURL(cfgCCDBurl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setFatalWhenNull(false); + + spectra.add("hEventSelections", "hEventSelections", {HistType::kTH1D, {{nuclei::evSel::kNevSels + 1, -0.5f, static_cast(nuclei::evSel::kNevSels) + 0.5f}}}); + spectra.get(HIST("hEventSelections"))->GetXaxis()->SetBinLabel(1, "all"); + spectra.get(HIST("hEventSelections"))->GetXaxis()->SetBinLabel(nuclei::evSel::kTVX + 2, "TVX"); + spectra.get(HIST("hEventSelections"))->GetXaxis()->SetBinLabel(nuclei::evSel::kZvtx + 2, "Zvtx"); + spectra.get(HIST("hEventSelections"))->GetXaxis()->SetBinLabel(nuclei::evSel::kTFborder + 2, "TFborder"); + spectra.get(HIST("hEventSelections"))->GetXaxis()->SetBinLabel(nuclei::evSel::kITSROFborder + 2, "ITSROFborder"); + spectra.get(HIST("hEventSelections"))->GetXaxis()->SetBinLabel(nuclei::evSel::kNoSameBunchPileup + 2, "kNoSameBunchPileup"); + spectra.get(HIST("hEventSelections"))->GetXaxis()->SetBinLabel(nuclei::evSel::kIsGoodZvtxFT0vsPV + 2, "isGoodZvtxFT0vsPV"); + spectra.get(HIST("hEventSelections"))->GetXaxis()->SetBinLabel(nuclei::evSel::kIsGoodITSLayersAll + 2, "IsGoodITSLayersAll"); + spectra.get(HIST("hEventSelections"))->GetXaxis()->SetBinLabel(nuclei::evSel::kIsEPtriggered + 2, "IsEPtriggered"); + + spectra.add("hCentrality", "hCentrality", HistType::kTH1D, {{100, 0., 100., "Centrality (%)"}}); + + spectra.add("hRecVtxZData", "collision z position", HistType::kTH1F, {{200, -20., 20., "z position (cm)"}}); + spectra.add("hTpcSignalData", "Specific energy loss", HistType::kTH2F, {{600, -6., 6., "#it{p} (GeV/#it{c})"}, {1400, 0, 1400, "d#it{E} / d#it{X} (a. u.)"}}); + spectra.add("hTpcSignalDataSelected", "Specific energy loss for selected particles", HistType::kTH2F, {{600, -6., 6., "#it{p} (GeV/#it{c})"}, {1400, 0, 1400, "d#it{E} / d#it{X} (a. u.)"}}); + spectra.add("hTofSignalData", "TOF beta", HistType::kTH2F, {{500, 0., 5., "#it{p} (GeV/#it{c})"}, {750, 0, 1.5, "TOF #beta"}}); + + for (int iS{0}; iS < nuclei::species; ++iS) { + for (int iMax{0}; iMax < 2; ++iMax) { + nuclei::pidCutTPC[iS][iMax] = cfgNsigmaTPC->get(iS, iMax); // changed pidCut to pidCutTPC so that it compiles TODO: check if it is correct + } + } + + nuclei::lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get("GLO/Param/MatLUT")); + } + + template + float getCentrality(Tcoll const& collision) + { + float centrality = 1.; + if constexpr (o2::aod::HasCentrality) { + if (cfgCentralityEstimator == nuclei::centDetectors::kFV0A) { + centrality = collision.centFV0A(); + } else if (cfgCentralityEstimator == nuclei::centDetectors::kFT0M) { + centrality = collision.centFT0M(); + } else if (cfgCentralityEstimator == nuclei::centDetectors::kFT0A) { + centrality = collision.centFT0A(); + } else if (cfgCentralityEstimator == nuclei::centDetectors::kFT0C) { + centrality = collision.centFT0C(); + } else { + LOG(warning) << "Centrality estimator not valid. Possible values: (FV0A: 0, FT0M: 1, FT0A: 2, FT0C: 3). Centrality set to 1."; + } + } + return centrality; + } + + template + void fillDataInfo(Tcoll const& collision, Ttrks const& tracks) + { + auto bc = collision.template bc_as(); + initCCDB(bc); + if (cfgSkimmedProcessing) { + zorro.isSelected(bc.globalBC()); /// Just let Zorro do the accounting + } + gRandom->SetSeed(bc.timestamp()); + + spectra.fill(HIST("hRecVtxZData"), collision.posZ()); + + const o2::math_utils::Point3D collVtx{collision.posX(), collision.posY(), collision.posZ()}; + + const double bgScalings[5][2]{ + {nuclei::charges[0] * cfgMomentumScalingBetheBloch->get(0u, 0u) / nuclei::masses[0], nuclei::charges[0] * cfgMomentumScalingBetheBloch->get(0u, 1u) / nuclei::masses[0]}, + {nuclei::charges[1] * cfgMomentumScalingBetheBloch->get(1u, 0u) / nuclei::masses[1], nuclei::charges[1] * cfgMomentumScalingBetheBloch->get(1u, 1u) / nuclei::masses[1]}, + {nuclei::charges[2] * cfgMomentumScalingBetheBloch->get(2u, 0u) / nuclei::masses[2], nuclei::charges[2] * cfgMomentumScalingBetheBloch->get(2u, 1u) / nuclei::masses[2]}, + {nuclei::charges[3] * cfgMomentumScalingBetheBloch->get(3u, 0u) / nuclei::masses[3], nuclei::charges[3] * cfgMomentumScalingBetheBloch->get(3u, 1u) / nuclei::masses[3]}, + {nuclei::charges[4] * cfgMomentumScalingBetheBloch->get(3u, 0u) / nuclei::masses[4], nuclei::charges[4] * cfgMomentumScalingBetheBloch->get(3u, 1u) / nuclei::masses[4]}}; + + for (auto& track : tracks) { // start loop over tracks + if (std::abs(track.eta()) > cfgCutEta || + track.tpcInnerParam() < cfgCutTpcMom || + track.itsNCls() < cfgCutNclusITS || + track.tpcNClsFound() < cfgCutNclusTPC || + track.tpcNClsCrossedRows() < 70 || + track.tpcNClsCrossedRows() < 0.8 * track.tpcNClsFindable() || + track.tpcChi2NCl() > 4.f || + track.itsChi2NCl() > 36.f) { + continue; + } + // temporary fix: tpcInnerParam() returns the momentum in all the software tags before + bool heliumPID = track.pidForTracking() == o2::track::PID::Helium3 || track.pidForTracking() == o2::track::PID::Alpha; + float correctedTpcInnerParam = (heliumPID && cfgCompensatePIDinTracking) ? track.tpcInnerParam() / 2 : track.tpcInnerParam(); + + spectra.fill(HIST("hTpcSignalData"), correctedTpcInnerParam * track.sign(), track.tpcSignal()); + const int iC{track.sign() < 0}; + + bool selectedTPC[5]{false}, goodToAnalyse{false}; + std::array nSigmaTPC; + + for (int iS{0}; iS < nuclei::species; ++iS) { + + double expBethe{tpc::BetheBlochAleph(static_cast(correctedTpcInnerParam * bgScalings[iS][iC]), cfgBetheBlochParams->get(iS, 0u), cfgBetheBlochParams->get(iS, 1u), cfgBetheBlochParams->get(iS, 2u), cfgBetheBlochParams->get(iS, 3u), cfgBetheBlochParams->get(iS, 4u))}; + + double expSigma{expBethe * cfgBetheBlochParams->get(iS, 5u)}; + + nSigmaTPC[iS] = static_cast((track.tpcSignal() - expBethe) / expSigma); + + selectedTPC[iS] = (nSigmaTPC[iS] > nuclei::pidCutTPC[iS][0] && nSigmaTPC[iS] < nuclei::pidCutTPC[iS][1]); + + goodToAnalyse = goodToAnalyse || selectedTPC[iS]; + } + if (!goodToAnalyse) { + continue; + } + + setTrackParCov(track, mTrackParCov); + mTrackParCov.setPID(track.pidForTracking()); + + gpu::gpustd::array dcaInfo; + o2::base::Propagator::Instance()->propagateToDCA(collVtx, mTrackParCov, mBz, 2.f, static_cast(cfgMaterialCorrection.value), &dcaInfo); + + float beta{o2::pid::tof::Beta::GetBeta(track)}; + spectra.fill(HIST("hTpcSignalDataSelected"), correctedTpcInnerParam * track.sign(), track.tpcSignal()); + spectra.fill(HIST("hTofSignalData"), correctedTpcInnerParam, beta); + beta = std::min(1.f - 1.e-6f, std::max(1.e-4f, beta)); /// sometimes beta > 1 or < 0, to be checked + uint16_t flag = static_cast((track.pidForTracking() & 0xF) << 12); + std::array tofMasses{-3.f, -3.f, -3.f, -3.f, -3.f}; + bool fillTree{true}; // set to true and never used again + bool fillDCAHist{false}; + bool correctPV{false}; + bool isSecondary{false}; + bool fromWeakDecay{false}; + + if (track.hasTOF()) { + flag |= kHasTOF; + } + if (track.hasTRD()) { + flag |= kHasTRD; + } + if (!collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { + flag |= kITSrof; + } + for (int iS{0}; iS < nuclei::species; ++iS) { + bool selectedTOF{false}; + if (std::abs(dcaInfo[1]) > cfgDCAcut->get(iS, 1)) { + continue; + } + ROOT::Math::LorentzVector> fvector{mTrackParCov.getPt() * nuclei::charges[iS], mTrackParCov.getEta(), mTrackParCov.getPhi(), nuclei::masses[iS]}; + if (selectedTPC[iS]) { + if (track.hasTOF()) { + selectedTOF = true; /// temporarly skipped + float charge{1.f + static_cast(iS == 3 || iS == 4)}; + tofMasses[iS] = correctedTpcInnerParam * charge * std::sqrt(1.f / (beta * beta) - 1.f) - nuclei::masses[iS]; + } + if (cfgTreeConfig->get(iS, 1u) && !selectedTOF) { + continue; + } + bool setPartFlag = cfgTreeConfig->get(iS, 0u); + if (setPartFlag) { + if (cfgDownscaling->get(iS) < 1. && gRandom->Rndm() > cfgDownscaling->get(iS)) { + continue; + } + flag |= BIT(iS); + } + } + } + if (flag & (kProton | kDeuteron | kTriton | kHe3 | kHe4) /*|| doprocessMC*/) { /// ignore PID pre-selections for the MC + if constexpr (requires { + collision.psiFT0A(); + }) { + nuclei::candidates_flow.emplace_back(NucleusCandidateFlow{ + collision.centFV0A(), + collision.centFT0M(), + collision.centFT0A(), + collision.centFT0C(), + collision.psiFT0A(), + collision.psiFT0C(), + collision.psiTPC(), + collision.psiTPCL(), + collision.psiTPCR(), + collision.qFT0A(), + collision.qFT0C(), + collision.qTPC(), + collision.qTPCL(), + collision.qTPCR(), + }); + } else if constexpr (requires { + collision.qvecFT0AIm(); + }) { + nuclei::candidates_flow.emplace_back(NucleusCandidateFlow{ + collision.centFV0A(), + collision.centFT0M(), + collision.centFT0A(), + collision.centFT0C(), + computeEventPlane(collision.qvecFT0AIm(), collision.qvecFT0ARe()), + computeEventPlane(collision.qvecFT0CIm(), collision.qvecFT0CRe()), + computeEventPlane(collision.qvecBTotIm(), collision.qvecBTotRe()), + computeEventPlane(collision.qvecBNegIm(), collision.qvecBNegRe()), + computeEventPlane(collision.qvecBPosIm(), collision.qvecBPosRe()), + collision.sumAmplFT0A(), + collision.sumAmplFT0C(), + static_cast(collision.nTrkBTot()), + static_cast(collision.nTrkBNeg()), + static_cast(collision.nTrkBPos())}); + } + if (flag & kTriton) { + if (track.pt() < cfgCutPtMinTree || track.pt() > cfgCutPtMaxTree || track.sign() > 0) + continue; + } + nuclei::candidates.emplace_back(NucleusCandidate{ + static_cast(track.globalIndex()), static_cast(track.collisionId()), (1 - 2 * iC) * mTrackParCov.getPt(), mTrackParCov.getEta(), mTrackParCov.getPhi(), + correctedTpcInnerParam, beta, collision.posZ(), dcaInfo[0], dcaInfo[1], track.tpcSignal(), track.itsChi2NCl(), track.tpcChi2NCl(), track.tofChi2(), + nSigmaTPC, tofMasses, fillTree, fillDCAHist, correctPV, isSecondary, fromWeakDecay, flag, track.tpcNClsFindable(), static_cast(track.tpcNClsCrossedRows()), track.itsClusterMap(), + static_cast(track.tpcNClsFound()), static_cast(track.tpcNClsShared()), static_cast(track.itsNCls()), static_cast(track.itsClusterSizes())}); + } + } // end loop over tracks + } + + void processDataFlow(CollWithEP const& collision, TrackCandidates const& tracks, aod::BCsWithTimestamps const&) + { + nuclei::candidates.clear(); + nuclei::candidates_flow.clear(); + if (!eventSelectionWithHisto(collision)) { + return; + } + fillDataInfo(collision, tracks); + for (auto& c : nuclei::candidates) { + nucleiTable(c.pt, c.eta, c.phi, c.tpcInnerParam, c.beta, c.zVertex, c.DCAxy, c.DCAz, c.TPCsignal, c.ITSchi2, c.TPCchi2, c.TOFchi2, c.flags, c.TPCfindableCls, c.TPCcrossedRows, c.ITSclsMap, c.TPCnCls, c.TPCnClsShared, c.clusterSizesITS); + } + for (auto& c : nuclei::candidates_flow) { + nucleiTableFlow(c.centFV0A, c.centFT0M, c.centFT0A, c.centFT0C, c.psiFT0A, c.psiFT0C, c.psiTPC, c.psiTPCl, c.psiTPCr, c.qFT0A, c.qFT0C, c.qTPC, c.qTPCl, c.qTPCr); + } + } + PROCESS_SWITCH(nucleiFlowTree, processDataFlow, "Data analysis with flow", true); + + void processDataFlowAlternative(CollWithQvec const& collision, TrackCandidates const& tracks, aod::BCsWithTimestamps const&) + { + nuclei::candidates.clear(); + nuclei::candidates_flow.clear(); + if (!eventSelectionWithHisto(collision)) { + return; + } + fillDataInfo(collision, tracks); + for (auto& c : nuclei::candidates) { + nucleiTable(c.pt, c.eta, c.phi, c.tpcInnerParam, c.beta, c.zVertex, c.DCAxy, c.DCAz, c.TPCsignal, c.ITSchi2, c.TPCchi2, c.TOFchi2, c.flags, c.TPCfindableCls, c.TPCcrossedRows, c.ITSclsMap, c.TPCnCls, c.TPCnClsShared, c.clusterSizesITS); + } + for (auto& c : nuclei::candidates_flow) { + nucleiTableFlow(c.centFV0A, c.centFT0M, c.centFT0A, c.centFT0C, c.psiFT0A, c.psiFT0C, c.psiTPC, c.psiTPCl, c.psiTPCr, c.qFT0A, c.qFT0C, c.qTPC, c.qTPCl, c.qTPCr); + } + } + PROCESS_SWITCH(nucleiFlowTree, processDataFlowAlternative, "Data analysis with flow - alternative framework", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc, TaskName{"nuclei-flow-trees"})}; +} diff --git a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx index c921b72bba6..134a1a150cf 100644 --- a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx +++ b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx @@ -494,7 +494,7 @@ struct nucleiSpectra { {cfgDCAxyBinsAlpha, "DCA_{z} (cm)"}}; const AxisSpec etaAxis{40, -1., 1., "#eta"}; - spectra.add("hEventSelections", "hEventSelections", {HistType::kTH1D, {{nuclei::evSel::kNevSels + 1, -0.5f, float(nuclei::evSel::kNevSels) + 0.5f}}}); + spectra.add("hEventSelections", "hEventSelections", {HistType::kTH1D, {{nuclei::evSel::kNevSels + 1, -0.5f, static_cast(nuclei::evSel::kNevSels) + 0.5f}}}); spectra.get(HIST("hEventSelections"))->GetXaxis()->SetBinLabel(1, "all"); spectra.get(HIST("hEventSelections"))->GetXaxis()->SetBinLabel(nuclei::evSel::kTVX + 2, "TVX"); spectra.get(HIST("hEventSelections"))->GetXaxis()->SetBinLabel(nuclei::evSel::kZvtx + 2, "Zvtx"); @@ -807,7 +807,7 @@ struct nucleiSpectra { std::hypot(collision.qvecBPosIm(), collision.qvecBPosRe())}); } if (fillTree) { - if (flag & BIT(2)) { + if (flag & kTriton) { if (track.pt() < cfgCutPtMinTree || track.pt() > cfgCutPtMaxTree || track.sign() > 0) continue; } diff --git a/PWGLF/TableProducer/Nuspex/nucleiUtils.h b/PWGLF/TableProducer/Nuspex/nucleiUtils.h new file mode 100644 index 00000000000..2a9a64bc4b2 --- /dev/null +++ b/PWGLF/TableProducer/Nuspex/nucleiUtils.h @@ -0,0 +1,186 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +#ifndef PWGLF_TABLEPRODUCER_NUSPEX_NUCLEIUTILS_H_ +#define PWGLF_TABLEPRODUCER_NUSPEX_NUCLEIUTILS_H_ + +#include +#include + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::constants::physics; + +struct NucleusCandidate { + int globalIndex; + int collTrackIndex; + float pt; + float eta; + float phi; + float tpcInnerParam; + float beta; + float zVertex; + float DCAxy; + float DCAz; + float TPCsignal; + float ITSchi2; + float TPCchi2; + float TOFchi2; + std::array nSigmaTPC; + std::array tofMasses; + bool fillTree; + bool fillDCAHist; + bool correctPV; + bool isSecondary; + bool fromWeakDecay; + uint16_t flags; + uint8_t TPCfindableCls; + uint8_t TPCcrossedRows; + uint8_t ITSclsMap; + uint8_t TPCnCls; + uint8_t TPCnClsShared; + uint8_t ITSnCls; + uint32_t clusterSizesITS; +}; + +struct NucleusCandidateFlow { + float centFV0A; + float centFT0M; + float centFT0A; + float centFT0C; + float psiFT0A; + float psiFT0C; + float psiTPC; + float psiTPCl; + float psiTPCr; + float qFT0A; + float qFT0C; + float qTPC; + float qTPCl; + float qTPCr; +}; + +namespace nuclei +{ +constexpr double bbMomScalingDefault[5][2]{ + {1., 1.}, + {1., 1.}, + {1., 1.}, + {1., 1.}, + {1., 1.}}; +constexpr double betheBlochDefault[5][6]{ + {-136.71, 0.441, 0.2269, 1.347, 0.8035, 0.09}, + {-136.71, 0.441, 0.2269, 1.347, 0.8035, 0.09}, + {-239.99, 1.155, 1.099, 1.137, 1.006, 0.09}, + {-321.34, 0.6539, 1.591, 0.8225, 2.363, 0.09}, + {-586.66, 1.859, 4.435, 0.282, 3.201, 0.09}}; +constexpr double nSigmaTPCdefault[5][2]{ + {-5., 5.}, + {-5., 5.}, + {-5., 5.}, + {-5., 5.}, + {-5., 5.}}; +// constexpr double nSigmaTOFdefault[5][2]{ +// {-5., 5.}, +// {-5., 5.}, +// {-5., 5.}, +// {-5., 5.}, +// {-5., 5.}}; +constexpr double DCAcutDefault[5][2]{ + {1., 1.}, + {1., 1.}, + {1., 1.}, + {1., 1.}, + {1., 1.}}; +constexpr int TreeConfigDefault[5][2]{ + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}}; +constexpr int FlowHistDefault[5][1]{ + {0}, + {0}, + {0}, + {0}, + {0}}; +constexpr int DCAHistDefault[5][2]{ + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}}; +constexpr double DownscalingDefault[5][1]{ + {1.}, + {1.}, + {1.}, + {1.}, + {1.}}; +// constexpr bool storeTreesDefault[5]{false, false, false, false, false}; +constexpr int species{5}; +constexpr float charges[5]{1.f, 1.f, 1.f, 2.f, 2.f}; +constexpr float masses[5]{MassProton, MassDeuteron, MassTriton, MassHelium3, MassAlpha}; +static const std::vector matter{"M", "A"}; +static const std::vector pidName{"TPC", "TOF"}; +static const std::vector names{"proton", "deuteron", "triton", "He3", "alpha"}; +static const std::vector treeConfigNames{"Filter trees", "Use TOF selection"}; +static const std::vector flowConfigNames{"Save flow hists"}; +static const std::vector DCAConfigNames{"Save DCA hist", "Matter/Antimatter"}; +static const std::vector nSigmaConfigName{"nsigma_min", "nsigma_max"}; +static const std::vector nDCAConfigName{"max DCAxy", "max DCAz"}; +static const std::vector DownscalingConfigName{"Fraction of kept candidates"}; +static const std::vector betheBlochParNames{"p0", "p1", "p2", "p3", "p4", "resolution"}; +static const std::vector chargeLabelNames{"Positive", "Negative"}; + +float pidCutTPC[5][2]; //[species][lower/upper limit] + +o2::base::MatLayerCylSet* lut = nullptr; + +std::vector candidates; +std::vector candidates_flow; + +enum centDetectors { + kFV0A = 0, + kFT0M = 1, + kFT0A = 2, + kFT0C = 3 +}; + +static const std::vector centDetectorNames{"FV0A", "FT0M", "FT0A", "FT0C"}; + +enum evSel { + kTVX = 0, + kZvtx, + kTFborder, + kITSROFborder, + kNoSameBunchPileup, + kIsGoodZvtxFT0vsPV, + kIsGoodITSLayersAll, + kIsEPtriggered, + kNevSels +}; + +static const std::vector eventSelectionTitle{"Event selections"}; +static const std::vector eventSelectionLabels{"TVX", "Z vtx", "TF border", "ITS ROF border", "No same-bunch pile-up", "kIsGoodZvtxFT0vsPV", "isGoodITSLayersAll", "isEPtriggered"}; + +constexpr int EvSelDefault[8][1]{ + {1}, + {1}, + {0}, + {0}, + {0}, + {0}, + {0}, + {0}}; +} // namespace nuclei + +#endif // PWGLF_TABLEPRODUCER_NUSPEX_NUCLEIUTILS_H_ From a49345a345f827742f6a015993ea2942d13edb2e Mon Sep 17 00:00:00 2001 From: Chiara Pinto <48326672+chiarapinto@users.noreply.github.com> Date: Fri, 7 Mar 2025 20:10:23 +0100 Subject: [PATCH 0601/1650] [PWGLF] added subscription to MCParticles table (#10392) --- PWGLF/Tasks/Nuspex/antinucleiInJets.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx index 8f8a11f899b..b2dc3054210 100644 --- a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx +++ b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx @@ -998,7 +998,7 @@ struct AntinucleiInJets { } PROCESS_SWITCH(AntinucleiInJets, processJetsMCgen, "process jets mc gen", false); - void processJetsMCrec(SimCollisions const& collisions, MCTracks const& mcTracks) + void processJetsMCrec(SimCollisions const& collisions, MCTracks const& mcTracks, McParticles const&) { for (const auto& collision : collisions) { From 43633aed57c3b23554d3badeaadf84a733de204e Mon Sep 17 00:00:00 2001 From: Archita-Dash <91664849+Archita-Dash@users.noreply.github.com> Date: Fri, 7 Mar 2025 20:27:37 +0100 Subject: [PATCH 0602/1650] [PWGJE] fixed outlier bugs+ added correlation histos (#10395) Co-authored-by: ALICE Action Bot --- PWGJE/Tasks/fullJetSpectraPP.cxx | 242 +++++++++++++++---------------- 1 file changed, 114 insertions(+), 128 deletions(-) diff --git a/PWGJE/Tasks/fullJetSpectraPP.cxx b/PWGJE/Tasks/fullJetSpectraPP.cxx index 9b16c0501ef..4ccb8bbc5e7 100644 --- a/PWGJE/Tasks/fullJetSpectraPP.cxx +++ b/PWGJE/Tasks/fullJetSpectraPP.cxx @@ -11,8 +11,6 @@ // FullJet Spectra in pp // -// TO DO: -// 1. implement HadCorr // /// \author Archita Rani Dash #include @@ -63,8 +61,8 @@ struct FullJetSpectrapp { Configurable centralityMin{"centralityMin", -999.0, "minimum centrality"}; Configurable centralityMax{"centralityMax", 999.0, "maximum centrality"}; Configurable doEMCALEventWorkaround{"doEMCALEventWorkaround", false, "apply the workaround to read the EMC trigger bit by requiring a cell content in the EMCAL"}; - Configurable doMBGapTrigger{"doMBGapTrigger", false, "set to true only when using MB-Gap Trigger JJ MC"}; - Configurable doJJMC{"doJJMC", false, "set to true only when using JJ MC"}; + Configurable doMBGapTrigger{"doMBGapTrigger", true, "set to true only when using MB-Gap Trigger JJ MC"}; + Configurable doMBMC{"doMBMC", false, "set to true only when using MB MC"}; // Jet configurables Configurable selectedJetsRadius{"selectedJetsRadius", 0.4, "resolution parameter for histograms without radius"}; @@ -104,6 +102,7 @@ struct FullJetSpectrapp { Configurable pTHatMaxMCD{"pTHatMaxMCD", 999.0, "maximum fraction of hard scattering for jet acceptance in detector MC"}; Configurable pTHatMaxMCP{"pTHatMaxMCP", 999.0, "maximum fraction of hard scattering for jet acceptance in particle MC"}; Configurable pTHatExponent{"pTHatExponent", 4.0, "exponent of the event weight for the calculation of pTHat"}; // 6 for MB MC and 4 for JJ MC + Configurable pTHatAbsoluteMin{"pTHatAbsoluteMin", -99.0, "minimum value of pTHat"}; int trackSelection = -1; std::vector eventSelectionBits; @@ -173,42 +172,26 @@ struct FullJetSpectrapp { registry.add("h_track_energy", "track energy;Energy of tracks;entries", {HistType::kTH1F, {{400, 0., 400.}}}); registry.add("h_track_energysum", "track energy sum;Sum of track energy per event;entries", {HistType::kTH1F, {{400, 0., 400.}}}); - // registry.add("h_gaptrig_track_pt", "gap triggered track pT;#it{p}_{T,track} (GeV/#it{c});entries", {HistType::kTH1F, {{350, 0., 350.}}}); - // registry.add("h_gaptrig_track_eta", "gap triggered track #eta;#eta_{track};entries", {HistType::kTH1F, {{100, -1., 1.}}}); - // registry.add("h_gaptrig_track_phi", "gap triggered track #varphi;#varphi_{track};entries", {HistType::kTH1F, {{160, 0., 7.}}}); - // Cluster QA histograms + registry.add("h_clusterTime", "Time of cluster", HistType::kTH1F, {{500, -250, 250, "#it{t}_{cls} (ns)"}}); registry.add("h_cluster_pt", "cluster pT;#it{p}_{T_cluster} (GeV/#it{c});entries", {HistType::kTH1F, {{200, 0., 200.}}}); registry.add("h_cluster_eta", "cluster #eta;#eta_{cluster};entries", {HistType::kTH1F, {{100, -1., 1.}}}); registry.add("h_cluster_phi", "cluster #varphi;#varphi_{cluster};entries", {HistType::kTH1F, {{160, 0., 7.}}}); registry.add("h_cluster_energy", "cluster energy;Energy of cluster;entries", {HistType::kTH1F, {{400, 0., 400.}}}); registry.add("h_cluster_energysum", "cluster energy sum;Sum of cluster energy per event;entries", {HistType::kTH1F, {{400, 0., 400.}}}); - // registry.add("h_gaptrig_cluster_pt", "gap triggered cluster pT;#it{p}_{T_cluster} (GeV/#it{c});entries", {HistType::kTH1F, {{200, 0., 200.}}}); - // registry.add("h_gaptrig_cluster_eta", "gap triggered cluster #eta;#eta_{cluster};entries", {HistType::kTH1F, {{100, -1., 1.}}}); - // registry.add("h_gaptrig_cluster_phi", "gap triggered cluster #varphi;#varphi_{cluster};entries", {HistType::kTH1F, {{160, 0., 7.}}}); - // registry.add("h_gaptrig_cluster_energy", "gap triggered cluster #varphi;#varphi_{cluster};entries", {HistType::kTH1F, {{160, 0., 7.}}}); - if (doprocessTracksWeighted) { registry.add("h_collisions_weighted", "event status;event status;entries", {HistType::kTH1F, {{12, 0.0, 12.0}}}); - registry.add("h_gaptrig_collisions", "event status; event status; entries", {HistType::kTH1F, {{4, 0.0, 4.0}}}); - - // registry.add("h_gaptrig_track_pt", "gap triggered track pT;#it{p}_{T,track} (GeV/#it{c});entries", {HistType::kTH1F, {{350, 0., 350.}}}); - // registry.add("h_gaptrig_track_eta", "gap triggered track #eta;#eta_{track};entries", {HistType::kTH1F, {{100, -1., 1.}}}); - // registry.add("h_gaptrig_track_phi", "gap triggered track #varphi;#varphi_{track};entries", {HistType::kTH1F, {{160, 0., 7.}}}); - // - // registry.add("h_gaptrig_cluster_pt", "gap triggered cluster pT;#it{p}_{T_cluster} (GeV/#it{c});entries", {HistType::kTH1F, {{200, 0., 200.}}}); - // registry.add("h_gaptrig_cluster_eta", "gap triggered cluster #eta;#eta_{cluster};entries", {HistType::kTH1F, {{100, -1., 1.}}}); - // registry.add("h_gaptrig_cluster_phi", "gap triggered cluster #varphi;#varphi_{cluster};entries", {HistType::kTH1F, {{160, 0., 7.}}}); - // registry.add("h_gaptrig_cluster_energy", "gap triggered cluster #varphi;#varphi_{cluster};entries", {HistType::kTH1F, {{160, 0., 7.}}}); } } // Jet QA histograms if (doprocessJetsData || doprocessJetsMCD || doprocessJetsMCDWeighted) { registry.add("h_full_jet_pt", "#it{p}_{T,jet};#it{p}_{T_jet} (GeV/#it{c});entries", {HistType::kTH1F, {{350, 0., 350.}}}); + registry.add("h_full_jet_pt_pTHatcut", "#it{p}_{T,jet};#it{p}_{T_jet} (GeV/#it{c});entries", {HistType::kTH1F, {{350, 0., 350.}}}); registry.add("h_full_jet_eta", "jet #eta;#eta_{jet};entries", {HistType::kTH1F, {{100, -1., 1.}}}); registry.add("h_full_jet_phi", "jet #varphi;#varphi_{jet};entries", {HistType::kTH1F, {{160, 0., 7.}}}); + registry.add("h_full_jet_clusterTime", "Time of cluster", HistType::kTH1F, {{500, -250, 250, "#it{t}_{cls} (ns)"}}); registry.add("h2_full_jet_NEF", "#it{p}_{T,jet} vs NEF at Det Level; #it{p}_{T,jet} (GeV/#it{c});NEF", {HistType::kTH2F, {{350, 0., 350.}, {105, 0., 1.05}}}); registry.add("h2_full_jet_NEF_rejected", "#it{p}_{T,jet} vs NEF at Det Level for rejected events; #it{p}_{T,jet} (GeV/#it{c});NEF", {HistType::kTH2F, {{350, 0., 350.}, {105, 0., 1.05}}}); @@ -231,10 +214,6 @@ struct FullJetSpectrapp { registry.add("h2_track_etaphi", "jet_track #eta vs jet_track #varphi; #eta_{track};#varphi_{track}", {HistType::kTH2F, {{500, -5., 5.}, {160, -1., 7.}}}); registry.add("h2_jet_etaphi", "jet #eta vs jet #varphi; #eta_{jet};#varphi_{jet}", {HistType::kTH2F, {{100, -1., 1.}, {160, -1., 7.}}}); - // registry.add("h_full_mcdjet_tablesize", "", {HistType::kTH1F, {{4, 0., 5.}}}); - // registry.add("h_gaptrig_full_jet_pt", "gap triggered jet pT;#it{p}_{T_jet} (GeV/#it{c});entries", {HistType::kTH1F, {{350, 0., 350.}}}); - // registry.add("h_gaptrig_full_jet_eta", "gap triggered jet #eta;#eta_{jet};entries", {HistType::kTH1F, {{100, -1., 1.}}}); - // registry.add("h_gaptrig_full_jet_phi", "gap triggered jet #varphi;#varphi_{jet};entries", {HistType::kTH1F, {{160, 0., 7.}}}); } if (doprocessJetsMCP || doprocessJetsMCPWeighted) { registry.add("h_full_mcpjet_tablesize", "", {HistType::kTH1F, {{4, 0., 5.}}}); @@ -259,11 +238,6 @@ struct FullJetSpectrapp { registry.add("h2_track_etaphi_part", "jet_track #eta vs jet_track #varphi; #eta_{track};#varphi_{track}", {HistType::kTH2F, {{500, -5., 5.}, {160, -1., 7.}}}); registry.add("h2_jet_etaphi_part", "jet #eta vs jet #varphi; #eta_{jet};#varphi_{jet}", {HistType::kTH2F, {{100, -1., 1.}, {160, -1., 7.}}}); - // registry.add("h_gaptrig_full_mcpjet_tablesize", "", {HistType::kTH1F, {{4, 0., 5.}}}); - // registry.add("h_gaptrig_full_mcpjet_ntracks", "", {HistType::kTH1F, {{200, -0.5, 200.}}}); - // registry.add("h_gaptrig_full_jet_pt_part", "jet pT;#it{p}_{T_jet} (GeV/#it{c});entries", {HistType::kTH1F, {{350, 0., 350.}}}); - // registry.add("h_gaptrig_full_jet_eta_part", "jet #eta;#eta_{jet};entries", {HistType::kTH1F, {{100, -1., 1.}}}); - // registry.add("h_gaptrig_full_jet_phi_part", "jet #varphi;#varphi_{jet};entries", {HistType::kTH1F, {{160, 0., 7.}}}); } if (doprocessJetsMCPMCDMatched || doprocessJetsMCPMCDMatchedWeighted) { @@ -275,38 +249,27 @@ struct FullJetSpectrapp { registry.add("h_full_matchedmcdjet_phi", "Matched MCD jet #varphi;#varphi_{jet};entries", {HistType::kTH1F, {{160, 0., 7.}}}); registry.add("h_full_matchedmcpjet_eta", "Matched MCP jet #eta;#eta_{jet};entries", {HistType::kTH1F, {{100, -1., 1.}}}); registry.add("h_full_matchedmcpjet_phi", "Matched MCP jet #varphi;#varphi_{jet};entries", {HistType::kTH1F, {{160, 0., 7.}}}); - registry.add("h_full_jet_deltaR", "Distance between matched Det Jet and Part Jet; \\Delta R; entries", {HistType::kTH1F, {{100, 0., 1.}}}); + registry.add("h_full_jet_deltaR", "Distance between matched Det Jet and Part Jet; #Delta R; entries", {HistType::kTH1F, {{100, 0., 1.}}}); registry.add("h2_full_jet_energyscaleDet", "Jet Energy Scale (det); p_{T,det} (GeV/c); (p_{T,det} - p_{T,part})/p_{T,part}", {HistType::kTH2F, {{400, 0., 400.}, {200, -1., 1.}}}); - // registry.add("h2_matchedjettrack_eta", "jet #eta vs jet_track #eta; #eta_{jet};#eta_{track}", {HistType::kTH2F, {{100, -1., 1.}, {500, -5., 5.}}}); - // registry.add("h2_matchedjettrack_phi", "jet #varphi vs jet_track #varphi; #varphi_{jet}; #varphi_{track}", {HistType::kTH2F, {{160, 0., 7.}, {160, -1., 7.}}}); - registry.add("h2_matchedjet_etaphiDet", "Det jet #eta vs jet #varphi; #eta_{jet};#varphi_{jet}", {HistType::kTH2F, {{100, -1., 1.}, {160, -1., 7.}}}); registry.add("h2_matchedjet_etaphiPart", "Part jet #eta vs jet #varphi; #eta_{jet};#varphi_{jet}", {HistType::kTH2F, {{100, -1., 1.}, {160, -1., 7.}}}); + registry.add("h2_matchedjet_deltaEtaCorr", "Correlation between Det Eta and Part Eta; #eta_{jet,det}; #eta_{jet,part}", {HistType::kTH2F, {{100, -1., 1.}, {100, -1., 1.}}}); + registry.add("h2_matchedjet_deltaPhiCorr", "Correlation between Det Phi and Part Phi; #varphi_{jet,det}; #varphi_{jet,part}", {HistType::kTH2F, {{160, 0., 7.}, {160, 0., 7.}}}); - // registry.add("h_full_jet_energyscaleDetCharged", "Jet Energy Scale (det, charged part); p_{t,det} (GeV/c); (p_{t,det} - p_{t,part})/p_{t,part}", {HistType::kTH2F,{{400, 0., 400., 200, -1.,1.}}}); - // registry.add("h_full_jet_energyscaleDetNeutral", "Jet Energy Scale (det, neutral part); p_{t,det} (GeV/c); (p_{t,det} - p_{t,part})/p_{t,part}", {HistType::kTH2F,{{400, 0., 400., 200, -1.,1.}}}); - // registry.add("h_full_jet_energyscaleDetChargedVsFull", "Jet Energy Scale (det, charged part, vs. full jet pt); p_{t,det} (GeV/c); (p_{t,det} - p_{t,part})/p_{t,part}", {HistType::kTH2F,{{400, 0., 400., 200, -1.,1.}}}); - // registry.add("h_full_jet_energyscaleDetNeutralVsFull", "Jet Energy Scale (det, neutral part, vs. full jet pt); p_{t,det} (GeV/c); (p_{t,det} - p_{t,part})/p_{t,part}", {HistType::kTH2F,{{400, 0., 400., 200, -1.,1.}}}); registry.add("h2_full_jet_energyscalePart", "Jet Energy Scale (part); p_{T,part} (GeV/c); (p_{T,det} - p_{T,part})/p_{T,part}", {HistType::kTH2F, {{400, 0., 400.}, {200, -1., 1.}}}); registry.add("h3_full_jet_energyscalePart", "R dependence of Jet Energy Scale (Part); #it{R}_{jet};p_{T,det} (GeV/c); (p_{T,det} - p_{T,part})/p_{T,part}", {HistType::kTH3F, {{jetRadiiBins, ""}, {400, 0., 400.}, {200, -1., 1.}}}); registry.add("h2_full_jet_etaresolutionPart", ";p_{T,part} (GeV/c); (#eta_{jet,det} - #eta_{jet,part})/#eta_{jet,part}", {HistType::kTH2F, {{400, 0., 400.}, {100, -1., 1.}}}); registry.add("h2_full_jet_phiresolutionPart", ";p_{T,part} (GeV/c); (#varphi_{jet,det} - #varphi_{jet,part})/#varphi_{jet,part}", {HistType::kTH2F, {{400, 0., 400.}, {160, -1., 7.}}}); - // registry.add("h_full_jet_energyscaleCharged", "Jet Energy Scale (charged part); p_{t,part} (GeV/c); (p_{t,det} - p_{t,part})/p_{t,part}", {HistType::kTH2F,{{400, 0., 400., 200, -1.,1.}}}); - // registry.add("h_full_jet_energyscaleNeutral", "Jet Energy Scale (neutral part); p_{t,part} (GeV/c); (p_{t,det} - p_{t,part})/p_{t,part}", {HistType::kTH2F,{{400, 0., 400., 200, -1.,1.}}}); - // registry.add("h_full_jet_energyscaleChargedVsFull", "Jet Energy Scale (charged part, vs. full jet pt); p_{t,part} (GeV/c); (p_{t,det} - p_{t,part})/p_{t,part}", {HistType::kTH2F,{{400, 0., 400., 200, -1.,1.}}}); - // registry.add("h_full_jet_energyscaleNeutralVsFull", "Jet Energy Scale (neutral part, vs. full jet pt); p_{t,part} (GeV/c); (p_{t,det} - p_{t,part})/p_{t,part}", {HistType::kTH2F,{{400, 0., 400., 200, -1.,1.}}}); + registry.add("h2_full_jet_energyscaleChargedPart", "Jet Energy Scale (charged part); p_{T,part} (GeV/c); (p_{T,det} - p_{T,part})/p_{T,part}", {HistType::kTH2F, {{400, 0., 400.}, {200, -1., 1.}}}); + registry.add("h2_full_jet_energyscaleNeutralPart", "Jet Energy Scale (neutral part); p_{T,part} (GeV/c); (p_{T,det} - p_{T,part})/p_{T,part}", {HistType::kTH2F, {{400, 0., 400.}, {200, -1., 1.}}}); + registry.add("h2_full_jet_energyscaleChargedVsFullPart", "Jet Energy Scale (charged part, vs. full jet pt); p_{T,part} (GeV/c); (p_{T,det} - p_{T,part})/p_{T,part}", {HistType::kTH2F, {{400, 0., 400.}, {200, -1., 1.}}}); + registry.add("h2_full_jet_energyscaleNeutralVsFullPart", "Jet Energy Scale (neutral part, vs. full jet pt); p_{T,part} (GeV/c); (p_{T,det} - p_{T,part})/p_{T,part}", {HistType::kTH2F, {{400, 0., 400.}, {200, -1., 1.}}}); registry.add("h2_full_fakemcdjets", "Fake MCD Jets; p_{T,det} (GeV/c); NCounts", {HistType::kTH2F, {{350, 0., 350.}, {100, 0., 100.}}}); registry.add("h2_full_fakemcpjets", "Fake MCP Jets; p_{T,part} (GeV/c); NCounts", {HistType::kTH2F, {{350, 0., 350.}, {100, 0., 100.}}}); // Response Matrix registry.add("h_full_jet_ResponseMatrix", "Full Jets Response Matrix; p_{T,det} (GeV/c); p_{T,part} (GeV/c)", {HistType::kTH2F, {{200, 0., 200.}, {200, 0., 200.}}}); - - // registry.add("h_gaptrig_full_matchedmcdjet_tablesize", "", {HistType::kTH1F, {{4, 0., 5.}}}); - // registry.add("h_gaptrig_full_matchedmcdjet_ntracks", "", {HistType::kTH1F, {{200, -0.5, 200.}}}); - // registry.add("h_gaptrig_full_jet_energyscaleDet", "Jet Energy Scale (det); p_{T,det} (GeV/c); (p_{T,det} - p_{T,part})/p_{T,part}", {HistType::kTH2F,{{400, 0., 400.}, {200, -1.,1.}}}); - // registry.add("h_gaptrig_full_jet_energyscalePart", "Jet Energy Scale (part); p_{T,part} (GeV/c); (p_{T,det} - p_{T,part})/p_{T,part}", {HistType::kTH2F,{{400, 0., 400.}, {200, -1.,1.}}}); - // registry.add("h_gaptrig_full_jet_ResponseMatrix", "Full Jets Response Matrix; p_{T,det} (GeV/c); p_{T,part} (GeV/c)", {HistType::kTH2F,{{400, 0., 400.}, {400,0.,400.}}}); } // Label the histograms @@ -323,8 +286,8 @@ struct FullJetSpectrapp { using JetTableMCDMatchedJoined = soa::Join; using JetTableMCPMatchedJoined = soa::Join; - using JetTableMCDMatchedWeightedJoined = soa::Join; - using JetTableMCPMatchedWeightedJoined = soa::Join; + using JetTableMCDMatchedWeightedJoined = soa::Join; + using JetTableMCPMatchedWeightedJoined = soa::Join; // Applying some cuts(filters) on collisions, tracks, clusters @@ -333,7 +296,7 @@ struct FullJetSpectrapp { Filter trackCuts = (aod::jtrack::pt >= trackpTMin && aod::jtrack::pt < trackpTMax && aod::jtrack::eta > trackEtaMin && aod::jtrack::eta < trackEtaMax && aod::jtrack::phi >= trackPhiMin && aod::jtrack::phi <= trackPhiMax); aod::EMCALClusterDefinition clusterDefinition = aod::emcalcluster::getClusterDefinitionFromString(clusterDefinitionS.value); Filter clusterFilter = (aod::jcluster::definition == static_cast(clusterDefinition) && aod::jcluster::eta > clusterEtaMin && aod::jcluster::eta < clusterEtaMax && aod::jcluster::phi >= clusterPhiMin && aod::jcluster::phi <= clusterPhiMax && aod::jcluster::energy >= clusterEnergyMin && aod::jcluster::time > clusterTimeMin && aod::jcluster::time < clusterTimeMax && (clusterRejectExotics && aod::jcluster::isExotic != true)); - Preslice JetMCPPerMcCollision = aod::jet::mcCollisionId; + Preslice JetMCPPerMcCollision = aod::jet::mcCollisionId; template bool isAcceptedJet(U const& jet) @@ -362,15 +325,17 @@ struct FullJetSpectrapp { template void fillJetHistograms(T const& jet, float weight = 1.0) { + float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); + if (jet.pt() > pTHatMaxMCD * pTHat || pTHat < pTHatAbsoluteMin) { // for MCD jets only to remove outliers; setting pTHatMaxMCD = 1 improves purity + return; + } + float neutralEnergy = 0.0; double sumtrackE = 0.0; if (jet.r() == round(selectedJetsRadius * 100.0f)) { registry.fill(HIST("h_full_jet_pt"), jet.pt(), weight); registry.fill(HIST("h_full_jet_eta"), jet.eta(), weight); registry.fill(HIST("h_full_jet_phi"), jet.phi(), weight); - // registry.fill(HIST("h_full_mcdjet_tablesize"), jet.size(), weight); - // registry.fill(HIST("h_full_mcdjet_ntracks"), jet.tracksIds().size(), weight); - // } registry.fill(HIST("h2_jet_etaphi"), jet.eta(), jet.phi(), weight); for (auto& cluster : jet.template clusters_as()) { @@ -378,6 +343,7 @@ struct FullJetSpectrapp { neutralEnergy += cluster.energy(); double clusterpt = cluster.energy() / std::cosh(cluster.eta()); + registry.fill(HIST("h_full_jet_clusterTime"), cluster.time(), weight); registry.fill(HIST("h_full_jet_neutralconstituents_pt"), clusterpt, weight); registry.fill(HIST("h_full_jet_neutralconstituents_eta"), cluster.eta(), weight); registry.fill(HIST("h_full_jet_neutralconstituents_phi"), cluster.phi(), weight); @@ -423,6 +389,10 @@ struct FullJetSpectrapp { template void fillMCPHistograms(T const& jet, float weight = 1.0) { + float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); + if (jet.pt() > pTHatMaxMCP * pTHat || pTHat < pTHatAbsoluteMin) { // MCP outlier rejection + return; + } float neutralEnergy = 0.0; int neutralconsts = 0; int chargedconsts = 0; @@ -432,8 +402,6 @@ struct FullJetSpectrapp { registry.fill(HIST("h_full_jet_pt_part"), jet.pt(), weight); registry.fill(HIST("h_full_jet_eta_part"), jet.eta(), weight); registry.fill(HIST("h_full_jet_phi_part"), jet.phi(), weight); - // registry.fill(HIST("h_full_jet_ntracks_part"), jet.tracksIds().size(), weight); - // } registry.fill(HIST("h2_jet_etaphi_part"), jet.eta(), jet.phi(), weight); for (auto& constituent : jet.template tracks_as()) { @@ -467,6 +435,10 @@ struct FullJetSpectrapp { void fillTrackHistograms(T const& tracks, U const& clusters, float weight = 1.0) { double sumtrackE = 0.0; + float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); + if (pTHat < pTHatAbsoluteMin) { // Track outlier rejection + return; + } for (auto const& track : tracks) { if (!jetderiveddatautilities::selectTrack(track, trackSelection)) { continue; @@ -482,6 +454,7 @@ struct FullJetSpectrapp { double clusterpt = cluster.energy() / std::cosh(cluster.eta()); sumclusterE += cluster.energy(); + registry.fill(HIST("h_clusterTime"), cluster.time()); registry.fill(HIST("h_cluster_pt"), clusterpt, weight); registry.fill(HIST("h_cluster_eta"), cluster.eta(), weight); registry.fill(HIST("h_cluster_phi"), cluster.phi(), weight); @@ -493,7 +466,10 @@ struct FullJetSpectrapp { template void fillMatchedHistograms(T const& jetBase, float weight = 1.0) { - if (doJJMC) { + float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); + if (jetBase.pt() > pTHatMaxMCD * pTHat || pTHat < pTHatAbsoluteMin) { + return; + } if (jetBase.has_matchedJetGeo()) { // geometrical jet matching only needed for pp - here,matching Base(Det.level) with Tag (Part. level) jets registry.fill(HIST("h_full_matchedmcdjet_tablesize"), jetBase.size(), weight); @@ -501,7 +477,9 @@ struct FullJetSpectrapp { registry.fill(HIST("h2_matchedjet_etaphiDet"), jetBase.eta(), jetBase.phi(), weight); for (auto& jetTag : jetBase.template matchedJetGeo_as>()) { - + if (jetTag.pt() > pTHatMaxMCP * pTHat || pTHat < pTHatAbsoluteMin) { // MCP outlier rejection + continue; + } auto deltaEta = jetBase.eta() - jetTag.eta(); auto deltaPhi = jetBase.phi() - jetTag.phi(); auto deltaR = jetutilities::deltaR(jetBase, jetTag); @@ -510,6 +488,8 @@ struct FullJetSpectrapp { registry.fill(HIST("h_full_matchedmcpjet_tablesize"), jetTag.size(), weight); registry.fill(HIST("h_full_matchedmcpjet_ntracks"), jetTag.tracksIds().size(), weight); registry.fill(HIST("h2_matchedjet_etaphiPart"), jetTag.eta(), jetTag.phi(), weight); + registry.fill(HIST("h2_matchedjet_deltaEtaCorr"), jetBase.eta(), jetTag.eta(), weight); + registry.fill(HIST("h2_matchedjet_deltaPhiCorr"), jetBase.phi(), jetTag.phi(), weight); // JES for fulljets registry.fill(HIST("h2_full_jet_energyscaleDet"), jetBase.pt(), (jetBase.pt() - jetTag.pt()) / jetTag.pt(), weight); @@ -522,35 +502,6 @@ struct FullJetSpectrapp { registry.fill(HIST("h_full_jet_ResponseMatrix"), jetBase.pt(), jetTag.pt(), weight); // MCD vs MCP jet pT } // jetTag } // jetBase - } else { - if (jetBase.has_matchedJetGeo()) { // geometrical jet matching only needed for pp - here,matching Base(Det.level) with Tag (Part. level) jets - registry.fill(HIST("h_full_matchedmcdjet_tablesize"), jetBase.size(), weight); - registry.fill(HIST("h_full_matchedmcdjet_ntracks"), jetBase.tracksIds().size(), weight); - registry.fill(HIST("h2_matchedjet_etaphiDet"), jetBase.eta(), jetBase.phi(), weight); - - for (auto& jetTag : jetBase.template matchedJetGeo_as>()) { - - auto deltaEta = jetBase.eta() - jetTag.eta(); - auto deltaPhi = jetBase.phi() - jetTag.phi(); - auto deltaR = jetutilities::deltaR(jetBase, jetTag); - - registry.fill(HIST("h_full_jet_deltaR"), deltaR, weight); - registry.fill(HIST("h_full_matchedmcpjet_tablesize"), jetTag.size(), weight); - registry.fill(HIST("h_full_matchedmcpjet_ntracks"), jetTag.tracksIds().size(), weight); - - registry.fill(HIST("h2_matchedjet_etaphiPart"), jetTag.eta(), jetTag.phi(), weight); - // JES for fulljets - registry.fill(HIST("h2_full_jet_energyscaleDet"), jetBase.pt(), (jetBase.pt() - jetTag.pt()) / jetTag.pt(), weight); - registry.fill(HIST("h2_full_jet_energyscalePart"), jetTag.pt(), (jetBase.pt() - jetTag.pt()) / jetTag.pt(), weight); - registry.fill(HIST("h3_full_jet_energyscalePart"), jetBase.r() / 100.0, jetTag.pt(), (jetBase.pt() - jetTag.pt()) / jetTag.pt(), weight); - registry.fill(HIST("h2_full_jet_etaresolutionPart"), jetTag.pt(), deltaEta / jetTag.eta(), weight); - registry.fill(HIST("h2_full_jet_phiresolutionPart"), jetTag.pt(), deltaPhi / jetTag.phi(), weight); - - // Response Matrix - registry.fill(HIST("h_full_jet_ResponseMatrix"), jetBase.pt(), jetTag.pt(), weight); // MCD vs MCP jet pT - } // jetTag - } // jetBase - } // else } void processDummy(aod::JetCollisions const&) @@ -563,6 +514,10 @@ struct FullJetSpectrapp { registry.fill(HIST("h_collisions_unweighted"), 1.0); // total events bool eventAccepted = false; + // if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + // return; + // } + if (doEMCALEventWorkaround) { if (collision.isEmcalReadout() && !collision.isAmbiguous()) { // i.e. EMCAL has a cell content eventAccepted = true; @@ -597,12 +552,12 @@ struct FullJetSpectrapp { if (!isAcceptedJet(jet)) { continue; } - fillJetHistograms(jet, 1.0); + fillJetHistograms(jet); } } PROCESS_SWITCH(FullJetSpectrapp, processJetsData, "Full Jets Data", false); - void processJetsMCD(soa::Filtered::iterator const& collision, JetTableMCDJoined const& jets, aod::JetTracks const&, aod::JetClusters const&) + void processJetsMCD(soa::Filtered>::iterator const& collision, JetTableMCDJoined const& jets, aod::JetTracks const&, aod::JetClusters const&) { registry.fill(HIST("h_collisions_unweighted"), 1.0); // total events bool eventAccepted = false; @@ -641,16 +596,20 @@ struct FullJetSpectrapp { if (!isAcceptedJet(jet)) { continue; } - fillJetHistograms(jet, 1.0); + fillJetHistograms(jet); } } PROCESS_SWITCH(FullJetSpectrapp, processJetsMCD, "Full Jets at Detector Level", false); - void processJetsMCDWeighted(soa::Filtered::iterator const& collision, JetTableMCDWeightedJoined const& jets, aod::JetTracks const&, aod::JetClusters const&) + void processJetsMCDWeighted(soa::Filtered>::iterator const& collision, JetTableMCDWeightedJoined const& jets, aod::JetTracks const&, aod::JetClusters const&) { registry.fill(HIST("h_collisions_weighted"), 1.0); // total events bool eventAccepted = false; + // if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + // return; + // } + if (doEMCALEventWorkaround) { if (collision.isEmcalReadout() && !collision.isAmbiguous()) { // i.e. EMCAL has a cell content eventAccepted = true; @@ -667,9 +626,10 @@ struct FullJetSpectrapp { if (!eventAccepted) { registry.fill(HIST("h_collisions_weighted"), 5.0); // JetsMCDWeighted w/o kTVXinEMC + for (auto const& jet : jets) { if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax) || !isAcceptedJet(jet)) { - fillRejectedJetHistograms(jet, jet.eventWeight()); + fillRejectedJetHistograms(jet, collision.mcCollision().weight()); } } return; @@ -685,11 +645,18 @@ struct FullJetSpectrapp { if (!isAcceptedJet(jet)) { continue; } - if (doMBGapTrigger && jet.eventWeight() == 1) { + if (doMBGapTrigger && collision.mcCollision().weight() == 1) { continue; } - // std::cout << "MCD jet.eventWeight() is: " << jet.eventWeight() << std::endl; - fillJetHistograms(jet, jet.eventWeight()); + + // this cut only to be used for calculating Jet Purity and not for Response Matrix + // this is mainly applied to remove all high weight jets causing big fluctuations + double pTHat = 10. / (std::pow(collision.mcCollision().weight(), 1.0 / pTHatExponent)); + if (jet.pt() > 1 * pTHat) { + registry.fill(HIST("h_full_jet_pt_pTHatcut"), jet.pt(), collision.mcCollision().weight()); + } + + fillJetHistograms(jet, collision.mcCollision().weight()); } } PROCESS_SWITCH(FullJetSpectrapp, processJetsMCDWeighted, "Full Jets at Detector Level on weighted events", false); @@ -702,29 +669,24 @@ struct FullJetSpectrapp { if (!isAcceptedJet(jet)) { return; } - fillMCPHistograms(jet, 1.0); + fillMCPHistograms(jet); } PROCESS_SWITCH(FullJetSpectrapp, processJetsMCP, "Full Jets at Particle Level", false); void processJetsMCPWeighted(typename JetTableMCPWeightedJoined::iterator const& jet, aod::JetParticles const&) { + if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { return; } if (!isAcceptedJet(jet)) { return; } - // std::cout << jet.eventWeight() << std::endl; if (doMBGapTrigger && jet.eventWeight() == 1) { return; - // std::cout << jet.eventWeight() << std::endl; } - // std::cout << "MCP jet.eventWeight() is: " << jet.eventWeight() << std::endl; fillMCPHistograms(jet, jet.eventWeight()); - // } else { - // return; - // } } PROCESS_SWITCH(FullJetSpectrapp, processJetsMCPWeighted, "Full Jets at Particle Level on weighted events", false); @@ -732,6 +694,12 @@ struct FullJetSpectrapp { { registry.fill(HIST("h_collisions_unweighted"), 1.0); // total events bool eventAccepted = false; + if (fabs(collision.posZ()) > VertexZCut) { + return; + } + // if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + // return; + // } // needed for the workaround to access EMCAL trigger bits. - This is needed for the MC productions in which the EMC trigger bits are missing. (MB MC LHC24f3, for ex.) // It first requires for atleast a cell in EMCAL to have energy content. // Once it finds a cell content, @@ -764,19 +732,26 @@ struct FullJetSpectrapp { } PROCESS_SWITCH(FullJetSpectrapp, processTracks, "Full Jet tracks", false); - void processJetsMCPMCDMatched(soa::Filtered>::iterator const& collision, JetTableMCDMatchedJoined const& mcdjets, JetTableMCPMatchedJoined const&, aod::JMcCollisions const&, aod::JetTracks const&, aod::JetClusters const&, aod::JetParticles const&) + void processJetsMCPMCDMatched(soa::Filtered>::iterator const& collision, JetTableMCDMatchedJoined const& mcdjets, JetTableMCPMatchedJoined const& mcpjets, aod::JMcCollisions const&, aod::JetTracks const&, aod::JetClusters const&, aod::JetParticles const&) { registry.fill(HIST("h_collisions_unweighted"), 1.0); // total events bool eventAccepted = false; int fakemcdjet = 0; int fakemcpjet = 0; - + // float pTHat = 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); if (fabs(collision.posZ()) > VertexZCut) { // making double sure this condition is satisfied return; } - if (!collision.has_mcCollision()) { - return; - } + // if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + // return; + // } + const auto mcpJetsPerMcCollision = mcpjets.sliceBy(JetMCPPerMcCollision, collision.mcCollisionId()); + + // for (auto mcpjet : mcpJetsPerMcCollision) { + // if (mcpjet.pt() > pTHatMaxMCP * pTHat) { // outlier rejection for MCP + // return; + // } + // } //**start of event selection** if (doEMCALEventWorkaround) { if (collision.isEmcalReadout() && !collision.isAmbiguous()) { // i.e. EMCAL has a cell content @@ -798,19 +773,20 @@ struct FullJetSpectrapp { //**end of event selection** for (const auto& mcdjet : mcdjets) { - // Check if MCD jet is within the EMCAL fiducial region + if (!jetfindingutilities::isInEtaAcceptance(mcdjet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + // Check if MCD jet is within the EMCAL fiducial region; if not then flag it as a fake jet if (mcdjet.phi() < jetPhiMin || mcdjet.phi() > jetPhiMax || mcdjet.eta() < jetEtaMin || mcdjet.eta() > jetEtaMax) { fakemcdjet++; registry.fill(HIST("h_collisions_unweighted"), 10.0); // Fake Matched MCD Jets registry.fill(HIST("h2_full_fakemcdjets"), mcdjet.pt(), fakemcdjet, 1.0); continue; } - if (!jetfindingutilities::isInEtaAcceptance(mcdjet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { - continue; - } if (!isAcceptedJet(mcdjet)) { continue; } + for (auto& mcpjet : mcdjet.template matchedJetGeo_as()) { // apply emcal fiducial cuts to the matched particle level jets if (mcpjet.eta() > jetEtaMax || mcpjet.eta() < jetEtaMin || mcpjet.phi() > jetPhiMax || mcpjet.phi() < jetPhiMin) { @@ -819,13 +795,12 @@ struct FullJetSpectrapp { registry.fill(HIST("h2_full_fakemcpjets"), mcpjet.pt(), fakemcpjet, 1.0); continue; } - // Fill MCD jet histograms if a valid MCP jet match was found within the EMCAL region - registry.fill(HIST("h_full_matchedmcpjet_eta"), mcpjet.eta(), 1.0); - registry.fill(HIST("h_full_matchedmcpjet_phi"), mcpjet.phi(), 1.0); - fillMatchedHistograms(mcdjet); } // mcpjet loop - registry.fill(HIST("h_full_matchedmcdjet_eta"), mcdjet.eta(), 1.0); - registry.fill(HIST("h_full_matchedmcdjet_phi"), mcdjet.phi(), 1.0); + + // // Fill MCD jet histograms if a valid MCP jet match was found within the EMCAL region + // registry.fill(HIST("h_full_matchedmcpjet_eta"), mcpjet.eta(), 1.0); + // registry.fill(HIST("h_full_matchedmcpjet_phi"), mcpjet.phi(), 1.0); + fillMatchedHistograms(mcdjet); } // mcdjet loop } PROCESS_SWITCH(FullJetSpectrapp, processJetsMCPMCDMatched, "Full Jet finder MCP matched to MCD", false); @@ -833,9 +808,17 @@ struct FullJetSpectrapp { void processJetsMCPMCDMatchedWeighted(soa::Filtered>::iterator const& collision, JetTableMCDMatchedWeightedJoined const& mcdjets, JetTableMCPMatchedWeightedJoined const& mcpjets, aod::JMcCollisions const&, aod::JetTracks const&, aod::JetClusters const&, aod::JetParticles const&) { float eventWeight = collision.mcCollision().weight(); + + if (fabs(collision.posZ()) > VertexZCut) { // making double sure this condition is satisfied + return; + } if (doMBGapTrigger && eventWeight == 1) { return; } + // if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + // return; + // } + registry.fill(HIST("h_collisions_weighted"), 1.0, eventWeight); // total events with eventWeight!=1 bool eventAccepted = false; int fakemcdjet = 0; @@ -869,7 +852,7 @@ struct FullJetSpectrapp { } for (const auto& mcdjet : mcdjets) { - // Check if MCD jet is within the EMCAL fiducial region + // Check if MCD jet is within the EMCAL fiducial region; if not then flag it as a fake jet if (mcdjet.phi() < jetPhiMin || mcdjet.phi() > jetPhiMax || mcdjet.eta() < jetEtaMin || mcdjet.eta() > jetEtaMax) { fakemcdjet++; registry.fill(HIST("h_collisions_weighted"), 8.0); // Fake Matched Weighted MCD Jets @@ -882,6 +865,7 @@ struct FullJetSpectrapp { if (!isAcceptedJet(mcdjet)) { continue; } + for (auto& mcpjet : mcdjet.template matchedJetGeo_as()) { // apply emcal fiducial cuts to the matched particle level jets if (mcpjet.eta() > jetEtaMax || mcpjet.eta() < jetEtaMin || mcpjet.phi() > jetPhiMax || mcpjet.phi() < jetPhiMin) { @@ -890,14 +874,14 @@ struct FullJetSpectrapp { registry.fill(HIST("h2_full_fakemcpjets"), mcpjet.pt(), fakemcpjet, eventWeight); continue; } - // If both MCD-MCP matched jet pairs are within the EMCAL fiducial region, fill these histos + // // If both MCD-MCP matched jet pairs are within the EMCAL fiducial region, fill these histos registry.fill(HIST("h_full_matchedmcpjet_eta"), mcpjet.eta(), eventWeight); registry.fill(HIST("h_full_matchedmcpjet_phi"), mcpjet.phi(), eventWeight); - fillMatchedHistograms(mcdjet, eventWeight); } // mcpjet // Fill MCD jet histograms if a valid MCP jet match was found within the EMCAL region - registry.fill(HIST("h_full_matchedmcdjet_eta"), mcdjet.eta(), eventWeight); - registry.fill(HIST("h_full_matchedmcdjet_phi"), mcdjet.phi(), eventWeight); + // registry.fill(HIST("h_full_matchedmcdjet_eta"), mcdjet.eta(), eventWeight); + // registry.fill(HIST("h_full_matchedmcdjet_phi"), mcdjet.phi(), eventWeight); + fillMatchedHistograms(mcdjet, mcdjet.eventWeight()); } // mcdjet } PROCESS_SWITCH(FullJetSpectrapp, processJetsMCPMCDMatchedWeighted, "Full Jet finder MCP matched to MCD on weighted events", false); @@ -909,17 +893,19 @@ struct FullJetSpectrapp { { bool eventAccepted = false; float eventWeight = collision.mcCollision().weight(); + if (fabs(collision.posZ()) > VertexZCut) { + return; + } if (eventWeight == 1) { return; } - // registry.fill(HIST("h_collisions_weighted"), 1.0, eventWeight); // total events - + // if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + // return; + // } // set "doMBGapTrigger" to true only if you are testing with MB Gap-triggers if (doMBGapTrigger && eventWeight == 1) { return; } - // std::cout << "Tracks eventWeight() is: " << eventWeight << std::endl; - registry.fill(HIST("h_collisions_weighted"), 1.0, eventWeight); // total events if (doEMCALEventWorkaround) { From 00d2e196cbc9f43db644089554f37a6c1384af16 Mon Sep 17 00:00:00 2001 From: Tanu Gahlaut <154991749+TGahlaut1@users.noreply.github.com> Date: Sat, 8 Mar 2025 02:32:58 +0530 Subject: [PATCH 0603/1650] [PWGCF] Add histograms (#10399) --- PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx b/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx index 869bec278cc..2349f00b50b 100644 --- a/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx @@ -223,6 +223,7 @@ struct MeanPtFlucId { hist.add("QA/after/h_Pt_weighted", "weighted pT distribution", kTH1D, {axisPt}); hist.add("QA/after/h2_Pt_NFT0M", "p_{T} in Multiplicity Classes ", kTH2D, {{axisPt}, {axisMultFT0M}}); hist.add("QA/after/h2_pt_nch", "Truth", kTH2D, {{axisMult}, {axisPt}}); + hist.add("QA/after/h3_nft0m_pt_nch", "Reco", kTHnSparseD, {axisMult, axisPt, axisMultFT0M}); hist.add("QA/after/h2_pt_nch_prof", "Truth", kTProfile, {axisMult}); hist.add("QA/Pion/before/h2_TPCNsigma", "n #sigma_{TPC}", tpcNSigmaHist); @@ -260,8 +261,9 @@ struct MeanPtFlucId { hist.add("QA/Pion/h2_PtTruth_NFT0M", "p_{T} in Multiplicity Classes ", kTH2D, {{axisPt}, {axisMultFT0M}}); hist.add("QA/Pion/h2_PtPosTruth_NFT0M", "p_{T} in Multiplicity Classes ", kTH2D, {{axisPt}, {axisMultFT0M}}); hist.add("QA/Pion/h2_PtNegTruth_NFT0M", "p_{T} in Multiplicity Classes ", kTH2D, {{axisPt}, {axisMultFT0M}}); - hist.add("QA/Pion/h2_pt_nch", "Truth", kTH2D, {{axisMult}, {axisPt}}); - hist.add("QA/Pion/h2_pt_nch_prof", "Truth", kTProfile, {axisMult}); + hist.add("QA/Pion/h2_pt_nch", "Reco", kTH2D, {{axisMult}, {axisPt}}); + hist.add("QA/Pion/h3_nft0m_pt_nch", "Reco", kTHnSparseD, {axisMult, axisPt, axisMultFT0M}); + hist.add("QA/Pion/h2_pt_nch_prof", "Reco", kTProfile, {axisMult}); hist.add("QA/Pion/h2_TPCNsigma", "n #sigma_{TPC}", tpcNSigmaHist); hist.add("QA/Pion/h2_TPCNsigma_El", "n #sigma_{TPC, El}", tpcNSigmaHist); @@ -344,6 +346,7 @@ struct MeanPtFlucId { hist.add("Gen/Charged/h_Mult", "Multiplicity", kTH1D, {axisMult}); hist.add("Gen/Charged/h_Mult_weighted", "Multiplicity", kTH1D, {axisMult}); hist.add("Gen/Charged/h2_pt_nch", "Truth", kTH2D, {{axisMult}, {axisPt}}); + hist.add("Gen/Charged/h3_nft0m_pt_nch", "Truth", kTHnSparseD, {axisMult, axisPt, axisMultFT0M}); hist.add("Gen/Charged/h2_pt_nch_prof", "Truth", kTProfile, {axisMult}); hist.add("Gen/Charged/h_mean_pT", " ", kTH1D, {axisMeanPt}); @@ -466,9 +469,6 @@ struct MeanPtFlucId { if (std::fabs(track.dcaZ()) > cfgCutDcaZ) return false; - if (std::fabs(track.dcaXY()) > cfgCutDcaXY) - return false; - return true; } @@ -1291,6 +1291,7 @@ struct MeanPtFlucId { double pt = track.pt(); wghtCh = getCorrectedWeight(ptBins, {}, effValuesCh, {}, pt, 0.0, false, cfgCorrection); hist.fill(HIST("QA/after/h2_pt_nch"), nCh, pt, wghtCh); + hist.fill(HIST("QA/after/h3_nft0m_pt_nch"), nCh, pt, nFT0M, wghtCh); hist.fill(HIST("QA/after/h2_pt_nch_prof"), nCh, pt, wghtCh); } @@ -1298,6 +1299,7 @@ struct MeanPtFlucId { ptPi = track.pt(); wghtPi = getCorrectedWeight(ptBins, rapBins, effPtValuesPi, effPtRapValuesPi, ptPi, rapPi, cfgCorrectionPtRapPID, cfgCorrectionPID); hist.fill(HIST("QA/Pion/h2_pt_nch"), nPi, ptPi, wghtPi); + hist.fill(HIST("QA/Pion/h3_nft0m_pt_nch"), nPi, ptPi, nFT0M, wghtPi); hist.fill(HIST("QA/Pion/h2_pt_nch_prof"), nPi, ptPi, wghtPi); } @@ -1305,6 +1307,7 @@ struct MeanPtFlucId { ptKa = track.pt(); wghtKa = getCorrectedWeight(ptBins, rapBins, effPtValuesKa, effPtRapValuesKa, ptKa, rapKa, cfgCorrectionPtRapPID, cfgCorrectionPID); hist.fill(HIST("QA/Kaon/h2_pt_nch"), nKa, ptKa, wghtKa); + hist.fill(HIST("QA/Kaon/h3_nft0m_pt_nch"), nKa, ptKa, nFT0M, wghtKa); hist.fill(HIST("QA/Kaon/h2_pt_nch_prof"), nKa, ptKa, wghtKa); } @@ -1312,6 +1315,7 @@ struct MeanPtFlucId { ptPr = track.pt(); wghtPr = getCorrectedWeight(ptBins, rapBins, effPtValuesPr, effPtRapValuesPr, ptPr, rapPr, cfgCorrectionPtRapPID, cfgCorrectionPID); hist.fill(HIST("QA/Proton/h2_pt_nch"), nPr, ptPr, wghtPr); + hist.fill(HIST("QA/Proton/h3_nft0m_pt_nch"), nPr, ptPr, nFT0M, wghtPr); hist.fill(HIST("QA/Proton/h2_pt_nch_prof"), nPr, ptPr, wghtPr); } } @@ -1331,6 +1335,7 @@ struct MeanPtFlucId { if (std::abs(mcPart.eta()) < 0.8) { double pt = mcPart.pt(); hist.fill(HIST("Gen/Charged/h2_pt_nch"), nChSim, pt); + hist.fill(HIST("Gen/Charged/h3_nft0m_pt_nch"), nChSim, pt, nFT0M); hist.fill(HIST("Gen/Charged/h2_pt_nch_prof"), nChSim, pt); } @@ -1339,14 +1344,17 @@ struct MeanPtFlucId { if (std::abs(pid) == kPiPlus && mcPart.pt() >= cfgCutPiPtMin) { hist.fill(HIST("Gen/Pion/h2_pt_nch"), nPiSim, mcPart.pt()); + hist.fill(HIST("Gen/Pion/h3_nft0m_pt_nch"), nPiSim, mcPart.pt(), nFT0M); hist.fill(HIST("Gen/Pion/h2_pt_nch_prof"), nPiSim, mcPart.pt()); } if (std::abs(pid) == kKPlus && mcPart.pt() >= cfgCutKaPtMin) { hist.fill(HIST("Gen/Kaon/h2_pt_nch"), nKaSim, mcPart.pt()); + hist.fill(HIST("Gen/Kaon/h3_nft0m_pt_nch"), nKaSim, mcPart.pt(), nFT0M); hist.fill(HIST("Gen/Kaon/h2_pt_nch_prof"), nKaSim, mcPart.pt()); } if (std::abs(pid) == kProton && mcPart.pt() >= cfgCutPrPtMin) { hist.fill(HIST("Gen/Proton/h2_pt_nch"), nPrSim, mcPart.pt()); + hist.fill(HIST("Gen/Proton/h3_nft0m_pt_nch"), nPrSim, mcPart.pt(), nFT0M); hist.fill(HIST("Gen/Proton/h2_pt_nch_prof"), nPrSim, mcPart.pt()); } } From 091e0d022c41da6be1a3f9fed32534c452d610ae Mon Sep 17 00:00:00 2001 From: Chiara Pinto <48326672+chiarapinto@users.noreply.github.com> Date: Fri, 7 Mar 2025 22:24:24 +0100 Subject: [PATCH 0604/1650] [PWGLF] cleaning up: removing outdated task (#10397) --- PWGLF/Tasks/Nuspex/CMakeLists.txt | 5 - PWGLF/Tasks/Nuspex/nucleiInJets.cxx | 1571 --------------------------- 2 files changed, 1576 deletions(-) delete mode 100644 PWGLF/Tasks/Nuspex/nucleiInJets.cxx diff --git a/PWGLF/Tasks/Nuspex/CMakeLists.txt b/PWGLF/Tasks/Nuspex/CMakeLists.txt index 4e3dcf2a892..4e5edc7e16b 100644 --- a/PWGLF/Tasks/Nuspex/CMakeLists.txt +++ b/PWGLF/Tasks/Nuspex/CMakeLists.txt @@ -34,11 +34,6 @@ o2physics_add_dpl_workflow(hypertriton3bodymcqa PUBLIC_LINK_LIBRARIES O2::DCAFitter O2Physics::AnalysisCore O2::TOFBase COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(nuclei-in-jets - SOURCES nucleiInJets.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore - COMPONENT_NAME Analysis) - o2physics_add_dpl_workflow(helium-flow SOURCES helium_flow.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore diff --git a/PWGLF/Tasks/Nuspex/nucleiInJets.cxx b/PWGLF/Tasks/Nuspex/nucleiInJets.cxx deleted file mode 100644 index 41d07b46a64..00000000000 --- a/PWGLF/Tasks/Nuspex/nucleiInJets.cxx +++ /dev/null @@ -1,1571 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. -/// -/// \file nucleiInJets.cxx -/// -/// \brief task for analysis of nuclei in jets -/// \author Alberto Caliva (alberto.caliva@cern.ch) -/// \since November 22, 2023 - -#include -#include -#include -#include -#include -#include -#include -#include "TGrid.h" -#include "TF1.h" -#include - -#include "CCDB/BasicCCDBManager.h" -#include "CCDB/CcdbApi.h" -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoA.h" -#include "Framework/ASoAHelpers.h" -#include "Framework/HistogramRegistry.h" -#include "Framework/RunningWorkflowInfo.h" -#include "Framework/DataTypes.h" -#include "ReconstructionDataFormats/Track.h" -#include "ReconstructionDataFormats/PID.h" -#include "ReconstructionDataFormats/DCA.h" -#include "Common/Core/trackUtilities.h" -#include "Common/Core/TrackSelection.h" -#include "Common/DataModel/TrackSelectionTables.h" -#include "Common/DataModel/EventSelection.h" -#include "Common/DataModel/Centrality.h" -#include "Common/DataModel/PIDResponse.h" -#include "Common/DataModel/PIDResponseITS.h" - -using namespace std; -using namespace o2; -using namespace o2::soa; -using namespace o2::aod; -using namespace o2::framework; -using namespace o2::framework::expressions; -using namespace o2::constants::physics; -using namespace o2::constants::math; -using std::array; - -using SelectedCollisions = soa::Join; -using SimCollisions = soa::Join; - -using FullNucleiTracks = soa::Join; - -using MCTracks = soa::Join; - -struct NucleiInJets { - - // QC Histograms - HistogramRegistry registryQC{ - "registryQC", - {}, - OutputObjHandlingPolicy::AnalysisObject, - true, - true}; - - // Analysis Histograms: Data - HistogramRegistry registryData{ - "registryData", - {}, - OutputObjHandlingPolicy::AnalysisObject, - true, - true}; - - // Analysis Histograms: MC - HistogramRegistry registryMC{ - "registryMC", - {}, - OutputObjHandlingPolicy::AnalysisObject, - true, - true}; - - // Global Parameters - Configurable minJetPt{"minJetPt", 10.0, "Minimum pt of the jet"}; - Configurable rJet{"rJet", 0.3, "Jet resolution parameter R"}; - Configurable zVtx{"zVtx", 10.0, "Maximum zVertex"}; - Configurable minNparticlesInJet{"minNparticlesInJet", 2, "Minimum number of particles inside jet"}; - Configurable nJetsPerEventMax{"nJetsPerEventMax", 1000, "Maximum number of jets per event"}; - Configurable requireNoOverlap{"requireNoOverlap", true, "require no overlap between jets and UE cones"}; - Configurable nGhosts{"nGhosts", 1000, "number of ghost particles"}; - Configurable alpha{"alpha", 1.0, "Alpha"}; - Configurable averagePtUE{"averagePtUE", 0.1, "Average pt of UE"}; - Configurable averagePtUEMC{"averagePtUEMC", 0.1, "Average pt of UE in MC"}; - - // Track Parameters - Configurable par0{"par0", 0.00164, "par 0"}; - Configurable par1{"par1", 0.00231, "par 1"}; - Configurable minItsNclusters{"minItsNclusters", 5, "minimum number of ITS clusters"}; - Configurable minTpcNcrossedRows{"minTpcNcrossedRows", 80, "minimum number of TPC crossed pad rows"}; - Configurable minTpcNcrossedRowsOverFindable{"minTpcNcrossedRowsOverFindable", 0.8, "crossed rows/findable"}; - Configurable maxChiSquareTpc{"maxChiSquareTpc", 4.0, "maximum TPC chi^2/Ncls"}; - Configurable maxChiSquareIts{"maxChiSquareIts", 36.0, "maximum ITS chi^2/Ncls"}; - Configurable minPt{"minPt", 0.3, "minimum pt of the tracks"}; - Configurable minEta{"minEta", -0.8, "minimum eta"}; - Configurable maxEta{"maxEta", +0.8, "maximum eta"}; - Configurable maxDcaxy{"maxDcaxy", 0.05, "Maximum DCAxy"}; - Configurable maxDcaz{"maxDcaz", 0.05, "Maximum DCAz"}; - Configurable minNsigmaTpc{"minNsigmaTpc", -3.0, "Minimum nsigma TPC"}; - Configurable maxNsigmaTpc{"maxNsigmaTpc", +3.0, "Maximum nsigma TPC"}; - Configurable minNsigmaTof{"minNsigmaTof", -3.0, "Minimum nsigma TOF"}; - Configurable maxNsigmaTof{"maxNsigmaTof", +3.5, "Maximum nsigma TOF"}; - Configurable maxPtForNsigmaTpc{"maxPtForNsigmaTpc", 2.0, "Maximum pt for TPC analysis"}; - Configurable minPtForNsigmaTof{"minPtForNsigmaTof", 0.5, "Minimum pt for TOF analysis"}; - Configurable requirePvContributor{"requirePvContributor", true, "require that the track is a PV contributor"}; - Configurable setDCAselectionPtDep{"setDCAselectionPtDep", true, "require pt dependent selection"}; - Configurable applyReweighting{"applyReweighting", true, "apply reweighting"}; - Configurable applyItsPid{"applyItsPid", true, "apply ITS PID"}; - Configurable ptMaxItsPid{"ptMaxItsPid", 1.0, "maximum pt for ITS PID"}; - Configurable nSigmaItsMin{"nSigmaItsMin", -2.0, "nSigmaITS min"}; - Configurable nSigmaItsMax{"nSigmaItsMax", +2.0, "nSigmaITS max"}; - Configurable urlToCcdb{"urlToCcdb", "http://alice-ccdb.cern.ch", "url of the personal ccdb"}; - Configurable pathToFile{"pathToFile", "", "path to file with reweighting"}; - Configurable histoNameWeightAntipJet{"histoNameWeightAntipJet", "", "reweighting histogram: antip in jet"}; - Configurable histoNameWeightAntipUe{"histoNameWeightAntipUe", "", "reweighting histogram: antip in ue"}; - - TH2F* twoDweightsAntipJet; - TH2F* twoDweightsAntipUe; - - Service ccdb; - o2::ccdb::CcdbApi ccdbApi; - - void init(InitContext const&) - { - ccdb->setURL(urlToCcdb.value); - ccdb->setCaching(true); - ccdb->setLocalObjectValidityChecking(); - ccdb->setCreatedNotAfter(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); - ccdb->setFatalWhenNull(false); - - if (applyReweighting) { - getReweightingHistograms(ccdb, TString(pathToFile), TString(histoNameWeightAntipJet), TString(histoNameWeightAntipUe)); - } else { - twoDweightsAntipJet = nullptr; - twoDweightsAntipUe = nullptr; - } - - // QC Histograms - registryQC.add("deltaEtadeltaPhiJet", "deltaEtadeltaPhiJet", HistType::kTH2F, {{200, -0.5, 0.5, "#Delta#eta"}, {200, 0, PIHalf, "#Delta#phi"}}); - registryQC.add("deltaEtadeltaPhi_ue", "deltaEtadeltaPhi_ue", HistType::kTH2F, {{200, -0.5, 0.5, "#Delta#eta"}, {200, 0, PIHalf, "#Delta#phi"}}); - registryQC.add("NchJetPlusUE", "NchJetPlusUE", HistType::kTH1F, {{100, 0, 100, "#it{N}_{ch}"}}); - registryQC.add("NchJet", "NchJet", HistType::kTH1F, {{100, 0, 100, "#it{N}_{ch}"}}); - registryQC.add("NchUE", "NchUE", HistType::kTH1F, {{100, 0, 100, "#it{N}_{ch}"}}); - registryQC.add("sumPtJetPlusUE", "sumPtJetPlusUE", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); - registryQC.add("sumPtJet", "sumPtJet", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); - registryQC.add("sumPtUE", "sumPtUE", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); - registryQC.add("sumPtUE_MC", "sumPtUE_MC", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); - registryQC.add("nJets_found", "nJets_found", HistType::kTH1F, {{10, 0, 10, "#it{n}_{Jet}"}}); - registryQC.add("nJets_selected", "nJets_selected", HistType::kTH1F, {{10, 0, 10, "#it{n}_{Jet}"}}); - registryQC.add("dcaxy_vs_pt", "dcaxy_vs_pt", HistType::kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); - registryQC.add("dcaz_vs_pt", "dcaz_vs_pt", HistType::kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{z} (cm)"}}); - registryQC.add("jet_jet_overlaps", "jet_jet_overlaps", HistType::kTH2F, {{20, 0.0, 20.0, "#it{n}_{jet}"}, {200, 0.0, 200.0, "#it{n}_{overlaps}"}}); - registryQC.add("jet_ue_overlaps", "jet_ue_overlaps", HistType::kTH2F, {{20, 0.0, 20.0, "#it{n}_{jet}"}, {200, 0.0, 200.0, "#it{n}_{overlaps}"}}); - registryQC.add("ue_ue_overlaps", "ue_ue_overlaps", HistType::kTH2F, {{20, 0.0, 20.0, "#it{n}_{jet}"}, {200, 0.0, 200.0, "#it{n}_{overlaps}"}}); - registryQC.add("tot_overlaps", "tot_overlaps", HistType::kTH2F, {{20, 0.0, 20.0, "#it{n}_{jet}"}, {200, 0.0, 200.0, "#it{n}_{overlaps}"}}); - registryQC.add("hJetArea", "hJetArea", HistType::kTH1F, {{2000, 0, 2, "Area"}}); - registryQC.add("hError", "hError", HistType::kTH1F, {{5, 0, 5, "error"}}); - - // Event Counters - registryData.add("number_of_events_data", "number of events in data", HistType::kTH1F, {{10, 0, 10, "counter"}}); - registryMC.add("number_of_events_mc", "number of events in mc", HistType::kTH1F, {{10, 0, 10, "counter"}}); - - // Binning - double min = 0.0; - double max = 6.0; - int nbins = 120; - - // Antiprotons - registryData.add("antiproton_jet_tpc", "antiproton_jet_tpc", HistType::kTH2F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}}); - registryData.add("antiproton_jet_tof", "antiproton_jet_tof", HistType::kTH2F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TOF}"}}); - registryData.add("antiproton_ue_tpc", "antiproton_ue_tpc", HistType::kTH2F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}}); - registryData.add("antiproton_ue_tof", "antiproton_ue_tof", HistType::kTH2F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TOF}"}}); - registryData.add("antiproton_dca_jet", "antiproton_dca_jet", HistType::kTH2F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {200, -0.5, 0.5, "DCA_{xy} (cm)"}}); - registryData.add("antiproton_dca_ue", "antiproton_dca_ue", HistType::kTH2F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {200, -0.5, 0.5, "DCA_{xy} (cm)"}}); - - // Antideuterons - registryData.add("antideuteron_jet_tpc", "antideuteron_jet_tpc", HistType::kTH2F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}}); - registryData.add("antideuteron_jet_tof", "antideuteron_jet_tof", HistType::kTH2F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TOF}"}}); - registryData.add("antideuteron_ue_tpc", "antideuteron_ue_tpc", HistType::kTH2F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}}); - registryData.add("antideuteron_ue_tof", "antideuteron_ue_tof", HistType::kTH2F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TOF}"}}); - - // Deuterons - registryData.add("deuteron_jet_tof", "deuteron_jet_tof", HistType::kTH2F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TOF}"}}); - registryData.add("deuteron_ue_tof", "deuteron_ue_tof", HistType::kTH2F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TOF}"}}); - - // Antihelium-3 - registryData.add("antihelium3_jet_tpc", "antihelium3_jet_tpc", HistType::kTH2F, {{nbins, min * 3, max * 3, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}}); - registryData.add("antihelium3_ue_tpc", "antihelium3_ue_tpc", HistType::kTH2F, {{nbins, min * 3, max * 3, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}}); - - // Helium-3 - registryData.add("helium3_jet_tpc", "helium3_jet_tpc", HistType::kTH2F, {{nbins, min * 3, max * 3, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}}); - registryData.add("helium3_ue_tpc", "helium3_ue_tpc", HistType::kTH2F, {{nbins, min * 3, max * 3, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}}); - - // Generated - registryMC.add("antiproton_jet_gen", "antiproton_jet_gen", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antideuteron_jet_gen", "antideuteron_jet_gen", HistType::kTH1F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antihelium3_jet_gen", "antihelium3_jet_gen", HistType::kTH1F, {{nbins, min * 3, max * 3, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antiproton_ue_gen", "antiproton_ue_gen", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antideuteron_ue_gen", "antideuteron_ue_gen", HistType::kTH1F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antihelium3_ue_gen", "antihelium3_ue_gen", HistType::kTH1F, {{nbins, min * 3, max * 3, "#it{p}_{T} (GeV/#it{c})"}}); - - // Reconstructed TPC - registryMC.add("antiproton_jet_rec_tpc", "antiproton_jet_rec_tpc", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antideuteron_jet_rec_tpc", "antideuteron_jet_rec_tpc", HistType::kTH1F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antihelium3_jet_rec_tpc", "antihelium3_jet_rec_tpc", HistType::kTH1F, {{nbins, min * 3, max * 3, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antiproton_ue_rec_tpc", "antiproton_ue_rec_tpc", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antideuteron_ue_rec_tpc", "antideuteron_ue_rec_tpc", HistType::kTH1F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antihelium3_ue_rec_tpc", "antihelium3_ue_rec_tpc", HistType::kTH1F, {{nbins, min * 3, max * 3, "#it{p}_{T} (GeV/#it{c})"}}); - - // Reconstructed TOF - registryMC.add("antiproton_jet_rec_tof", "antiproton_jet_rec_tof", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antideuteron_jet_rec_tof", "antideuteron_jet_rec_tof", HistType::kTH1F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antiproton_ue_rec_tof", "antiproton_ue_rec_tof", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antideuteron_ue_rec_tof", "antideuteron_ue_rec_tof", HistType::kTH1F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}}); - - // DCA Templates - registryMC.add("antiproton_dca_prim", "antiproton_dca_prim", HistType::kTH2F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {200, -0.5, 0.5, "DCA_{xy} (cm)"}}); - registryMC.add("antiproton_dca_sec", "antiproton_dca_sec", HistType::kTH2F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {200, -0.5, 0.5, "DCA_{xy} (cm)"}}); - - // Fraction of Primary Antiprotons from MC - registryMC.add("antiproton_prim", "antiproton_prim", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antiproton_all", "antiproton_all", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antiproton_prim_jet", "antiproton_prim_jet", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antiproton_all_jet", "antiproton_all_jet", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antiproton_prim_ue", "antiproton_prim_ue", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); - registryMC.add("antiproton_all_ue", "antiproton_all_ue", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); - - // Antiproton Reweighting - registryMC.add("antiproton_eta_pt_pythia", "antiproton_eta_pt_pythia", HistType::kTH2F, {{200, 0.0, 10.0, "#it{p}_{T} (GeV/#it{c})"}, {20, -1.0, 1.0, "#it{#eta}"}}); - registryMC.add("antiproton_eta_pt_jet", "antiproton_eta_pt_jet", HistType::kTH2F, {{200, 0.0, 10.0, "#it{p}_{T} (GeV/#it{c})"}, {20, -1.0, 1.0, "#it{#eta}"}}); - registryMC.add("antiproton_eta_pt_ue", "antiproton_eta_pt_ue", HistType::kTH2F, {{200, 0.0, 10.0, "#it{p}_{T} (GeV/#it{c})"}, {20, -1.0, 1.0, "#it{#eta}"}}); - - // Detector Response Matrix - if (doprocessDetResponseMatrix) { - registryMC.add("detectorResponseMatrix", "detectorResponseMatrix", HistType::kTH2F, {{5000, 0.0, 50.0, "#it{p}_{T}^{gen} (GeV/#it{c})"}, {5000, 0.0, 50.0, "#it{p}_{T}^{rec} (GeV/#it{c})"}}); - } - } - - // ITS Hit - template - bool hasITSHit(T const& track, int layer) - { - int ibit = layer - 1; - return (track.itsClusterMap() & (1 << ibit)); - } - - // Single-Track Selection for Particles inside Jets - template - bool passedTrackSelectionForJetReconstruction(const T1& track) - { - if (!track.hasITS()) - return false; - if ((!hasITSHit(track, 1)) && (!hasITSHit(track, 2)) && (!hasITSHit(track, 3))) - return false; - if (!track.hasTPC()) - return false; - if (track.tpcNClsCrossedRows() < 70) - return false; - if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < 0.8) - return false; - if (track.tpcChi2NCl() > 4) - return false; - if (track.itsChi2NCl() > 36) - return false; - if (track.eta() < -0.8 || track.eta() > 0.8) - return false; - if (track.pt() < 0.15) - return false; - if (std::fabs(track.dcaXY()) > 0.25) - return false; - if (std::fabs(track.dcaZ()) > 2.0) - return false; - - /* - // pt-dependent selection - if (setDCAselectionPtDep) { - if (std::fabs(track.dcaXY()) > (par0 + par1 / track.pt())) - return false; - if (std::fabs(track.dcaZ()) > (par0 + par1 / track.pt())) - return false; - } - - // standard selection - if (!setDCAselectionPtDep) { - if (std::fabs(track.dcaXY()) > maxDcaxy) - return false; - if (std::fabs(track.dcaZ()) > maxDcaz) - return false; - } - */ - - return true; - } - - // Single-Track Selection - template - bool passedTrackSelection(const T2& track) - { - if (!track.hasITS()) - return false; - if (track.itsNCls() < minItsNclusters) - return false; - if (!track.hasTPC()) - return false; - if (track.tpcNClsCrossedRows() < minTpcNcrossedRows) - return false; - if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < minTpcNcrossedRowsOverFindable) - return false; - if (track.tpcChi2NCl() > maxChiSquareTpc) - return false; - if (track.itsChi2NCl() > maxChiSquareIts) - return false; - if (track.eta() < minEta || track.eta() > maxEta) - return false; - if (track.pt() < minPt) - return false; - - return true; - } - - template - bool isHighPurityAntiproton(const T3& track) - { - // Variables - double nsigmaTPCPr = track.tpcNSigmaPr(); - double nsigmaTOFPr = track.tofNSigmaPr(); - double pt = track.pt(); - - if (pt < 0.5 && std::fabs(nsigmaTPCPr) < 2.0) - return true; - if (pt >= 0.5 && std::fabs(nsigmaTPCPr) < 2.0 && track.hasTOF() && std::fabs(nsigmaTOFPr) < 2.0) - return true; - return false; - } - - // Minimum - double minimumValue(double x1, double x2) - { - double xMin(x1); - if (x1 < x2) - xMin = x1; - if (x1 >= x2) - xMin = x2; - - return xMin; - } - - // Deltaphi - double getDeltaPhi(double a1, double a2) - { - double deltaPhi(0); - double phi1 = TVector2::Phi_0_2pi(a1); - double phi2 = TVector2::Phi_0_2pi(a2); - double diff = std::fabs(phi1 - phi2); - - if (diff <= PI) - deltaPhi = diff; - if (diff > PI) - deltaPhi = TwoPI - diff; - - return deltaPhi; - } - - void getPerpendicularAxis(TVector3 p, TVector3& u, double sign) - { - // Initialization - double ux(0), uy(0), uz(0); - - // Components of Vector p - double px = p.X(); - double py = p.Y(); - double pz = p.Z(); - - // Protection 1 - if (px == 0 && py != 0) { - - uy = -(pz * pz) / py; - ux = sign * std::sqrt(py * py - (pz * pz * pz * pz) / (py * py)); - uz = pz; - u.SetXYZ(ux, uy, uz); - return; - } - - // Protection 2 - if (py == 0 && px != 0) { - - ux = -(pz * pz) / px; - uy = sign * std::sqrt(px * px - (pz * pz * pz * pz) / (px * px)); - uz = pz; - u.SetXYZ(ux, uy, uz); - return; - } - - // Equation Parameters - double a = px * px + py * py; - double b = 2.0 * px * pz * pz; - double c = pz * pz * pz * pz - py * py * py * py - px * px * py * py; - double delta = b * b - 4.0 * a * c; - - // Protection against delta<0 - if (delta < 0) { - return; - } - - // Solutions - ux = (-b + sign * std::sqrt(delta)) / (2.0 * a); - uy = (-pz * pz - px * ux) / py; - uz = pz; - u.SetXYZ(ux, uy, uz); - return; - } - - double calculateDij(TVector3 t1, TVector3 t2, double R) - { - double distanceJet(0); - double x1 = 1.0 / (t1.Pt() * t1.Pt()); - double x2 = 1.0 / (t2.Pt() * t2.Pt()); - double deltaEta = t1.Eta() - t2.Eta(); - double deltaPhi = getDeltaPhi(t1.Phi(), t2.Phi()); - double min = minimumValue(x1, x2); - double deltaSquare = deltaEta * deltaEta + deltaPhi * deltaPhi; - distanceJet = min * deltaSquare / (R * R); - return distanceJet; - } - - bool overlap(TVector3 v1, TVector3 v2, double R) - { - double dx = v1.Eta() - v2.Eta(); - double dy = getDeltaPhi(v1.Phi(), v2.Phi()); - double d = std::sqrt(dx * dx + dy * dy); - if (d < 2.0 * R) - return true; - return false; - } - - double getCorrectedPt(double ptRec) - { - // to be developed - return ptRec; - } - - void getReweightingHistograms(o2::framework::Service const& ccdbObj, TString filepath, TString histname_antip_jet, TString histname_antip_ue) - { - TList* l = ccdbObj->get(filepath.Data()); - if (!l) { - LOGP(error, "Could not open the file {}", Form("%s", filepath.Data())); - return; - } - twoDweightsAntipJet = static_cast(l->FindObject(Form("%s_antiproton", histname_antip_jet.Data()))); - if (!twoDweightsAntipJet) { - LOGP(error, "Could not open histogram {}", Form("%s_antiproton", histname_antip_jet.Data())); - return; - } - twoDweightsAntipUe = static_cast(l->FindObject(Form("%s_antiproton", histname_antip_ue.Data()))); - if (!twoDweightsAntipUe) { - LOGP(error, "Could not open histogram {}", Form("%s_antiproton", histname_antip_ue.Data())); - return; - } - LOGP(info, "Opened histogram {}", Form("%s_antiproton", histname_antip_jet.Data())); - LOGP(info, "Opened histogram {}", Form("%s_antiproton", histname_antip_ue.Data())); - } - - // Process Data - void processData(SelectedCollisions::iterator const& collision, FullNucleiTracks const& tracks) - { - // Event Counter: before event selection - registryData.fill(HIST("number_of_events_data"), 0.5); - - // Event Selection - if (!collision.sel8()) - return; - - // Event Counter: after event selection sel8 - registryData.fill(HIST("number_of_events_data"), 1.5); - - // Cut on z-vertex - if (std::fabs(collision.posZ()) > zVtx) - return; - - // Event Counter: after z-vertex cut - registryData.fill(HIST("number_of_events_data"), 2.5); - - // ITS Response - o2::aod::ITSResponse itsResponse; - - // List of Tracks - std::vector trk; - std::vector ntrk; - - for (auto track : tracks) { // o2-linter: disable=[const-ref-in-for-loop] - - if (!passedTrackSelectionForJetReconstruction(track)) - continue; - registryQC.fill(HIST("dcaxy_vs_pt"), track.pt(), track.dcaXY()); - registryQC.fill(HIST("dcaz_vs_pt"), track.pt(), track.dcaZ()); - - TVector3 momentum(track.px(), track.py(), track.pz()); - trk.push_back(momentum); - ntrk.push_back(1); - } - - // Reject Empty Events - if (static_cast(trk.size()) < 1) - return; - registryData.fill(HIST("number_of_events_data"), 3.5); - - // Anti-kt Jet Finder - int nParticlesRemoved(0); - std::vector jet; - std::vector ue1; - std::vector ue2; - std::vector nParticlesInjet; - - do { - double dijMin(1e+300), diBmin(1e+300); - int iMin(0), jMin(0), iBmin(0); - for (int i = 0; i < static_cast(trk.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] - if (trk[i].Mag() == 0) - continue; - double diB = 1.0 / (trk[i].Pt() * trk[i].Pt()); - if (diB < diBmin) { - diBmin = diB; - iBmin = i; - } - for (int j = (i + 1); j < static_cast(trk.size()); j++) { // o2-linter: disable=[const-ref-in-for-loop] - if (trk[j].Mag() == 0) - continue; - double dij = calculateDij(trk[i], trk[j], rJet); - if (dij < dijMin) { - dijMin = dij; - iMin = i; - jMin = j; - } - } - } - if (dijMin < diBmin) { - trk[iMin] = trk[iMin] + trk[jMin]; - ntrk[iMin] = ntrk[iMin] + ntrk[jMin]; - trk[jMin].SetXYZ(0, 0, 0); - ntrk[jMin] = 0; - nParticlesRemoved++; - } - if (dijMin > diBmin) { - jet.push_back(trk[iBmin]); - nParticlesInjet.push_back(ntrk[iBmin]); - trk[iBmin].SetXYZ(0, 0, 0); - nParticlesRemoved++; - } - } while (nParticlesRemoved < static_cast(trk.size())); - - registryQC.fill(HIST("nJets_found"), static_cast(jet.size())); - - // Jet Selection - std::vector isSelected; - int nJetsSelected(0); - for (int i = 0; i < static_cast(jet.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] - - // Initialization - isSelected.push_back(0); - - // Jet fully contained inside acceptance - if ((std::fabs(jet[i].Eta()) + rJet) > (maxEta - 0.5)) - continue; - if (nParticlesInjet[i] < minNparticlesInJet) - continue; - - // Perpendicular cones - TVector3 ueAxis1(0, 0, 0); - TVector3 ueAxis2(0, 0, 0); - getPerpendicularAxis(jet[i], ueAxis1, +1); - getPerpendicularAxis(jet[i], ueAxis2, -1); - ue1.push_back(ueAxis1); - ue2.push_back(ueAxis2); - - double ptUE(0); - for (auto track : tracks) { // o2-linter: disable=[const-ref-in-for-loop] - - if (!passedTrackSelectionForJetReconstruction(track)) - continue; - TVector3 selectedTrack(track.px(), track.py(), track.pz()); - - double deltaEtaUe1 = selectedTrack.Eta() - ueAxis1.Eta(); - double deltaPhiUe1 = getDeltaPhi(selectedTrack.Phi(), ueAxis1.Phi()); - double deltaRUe1 = std::sqrt(deltaEtaUe1 * deltaEtaUe1 + deltaPhiUe1 * deltaPhiUe1); - double deltaEtaUe2 = selectedTrack.Eta() - ueAxis2.Eta(); - double deltaPhiUe2 = getDeltaPhi(selectedTrack.Phi(), ueAxis2.Phi()); - double deltaRUe2 = std::sqrt(deltaEtaUe2 * deltaEtaUe2 + deltaPhiUe2 * deltaPhiUe2); - - if (deltaRUe1 < alpha * rJet) { - registryQC.fill(HIST("deltaEtadeltaPhi_ue"), deltaEtaUe1, deltaPhiUe1); - ptUE = ptUE + selectedTrack.Pt(); - } - if (deltaRUe2 < alpha * rJet) { - registryQC.fill(HIST("deltaEtadeltaPhi_ue"), deltaEtaUe2, deltaPhiUe2); - ptUE = ptUE + selectedTrack.Pt(); - } - } - registryQC.fill(HIST("sumPtUE"), 0.5 * ptUE); - registryQC.fill(HIST("NchJetPlusUE"), nParticlesInjet[i]); - - double ptJetRec = jet[i].Pt() - averagePtUE; - double ptJetCorr = getCorrectedPt(ptJetRec); - - if (ptJetCorr < minJetPt) - continue; - - nJetsSelected++; - isSelected[i] = 1; - } - registryQC.fill(HIST("nJets_selected"), nJetsSelected); - - if (nJetsSelected == 0) - return; - registryData.fill(HIST("number_of_events_data"), 4.5); - - // Overlaps - int nOverlapsJetJet(0); - int nOverlapsJetUe(0); - int nOverlapsUeUe(0); - int nOverlapsTot(0); - for (int i = 0; i < static_cast(jet.size()); i++) { - if (isSelected[i] == 0) - continue; - - for (int j = (i + 1); j < static_cast(jet.size()); j++) { - if (isSelected[j] == 0) - continue; - if (overlap(jet[i], jet[j], rJet)) - nOverlapsJetJet++; - if (overlap(jet[i], ue1[j], rJet) || overlap(jet[i], ue2[j], rJet)) - nOverlapsJetUe++; - if (overlap(ue1[i], ue1[j], rJet) || overlap(ue1[i], ue2[j], rJet) || overlap(ue2[i], ue2[j], rJet)) - nOverlapsUeUe++; - } - } - nOverlapsTot = nOverlapsJetJet + nOverlapsJetUe + nOverlapsUeUe; - registryQC.fill(HIST("jet_jet_overlaps"), nJetsSelected, nOverlapsJetJet); - registryQC.fill(HIST("jet_ue_overlaps"), nJetsSelected, nOverlapsJetUe); - registryQC.fill(HIST("ue_ue_overlaps"), nJetsSelected, nOverlapsUeUe); - registryQC.fill(HIST("tot_overlaps"), nJetsSelected, nOverlapsTot); - - if (nJetsSelected > nJetsPerEventMax) - return; - registryData.fill(HIST("number_of_events_data"), 5.5); - - if (requireNoOverlap && nOverlapsTot > 0) - return; - registryData.fill(HIST("number_of_events_data"), 6.5); - - //************************************************************************************************************** - - for (int i = 0; i < static_cast(jet.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] - - if (isSelected[i] == 0) - continue; - - for (auto track : tracks) { // o2-linter: disable=[const-ref-in-for-loop] - if (!passedTrackSelection(track)) - continue; - if (requirePvContributor && !(track.isPVContributor())) - continue; - - // Variables - double nsigmaTPCPr = track.tpcNSigmaPr(); - double nsigmaTOFPr = track.tofNSigmaPr(); - double nsigmaTPCDe = track.tpcNSigmaDe(); - double nsigmaTOFDe = track.tofNSigmaDe(); - double nsigmaTPCHe = track.tpcNSigmaHe(); - double pt = track.pt(); - double dcaxy = track.dcaXY(); - double dcaz = track.dcaZ(); - - // Selection on - bool passedItsPid = false; - if (itsResponse.nSigmaITS(track) > nSigmaItsMin && itsResponse.nSigmaITS(track) < nSigmaItsMax) { - passedItsPid = true; - } - - bool passedItsPidSelection = true; - if (applyItsPid && pt < ptMaxItsPid && (!passedItsPid)) - passedItsPidSelection = false; - - TVector3 particleDirection(track.px(), track.py(), track.pz()); - double deltaEtaJet = particleDirection.Eta() - jet[i].Eta(); - double deltaPhiJet = getDeltaPhi(particleDirection.Phi(), jet[i].Phi()); - double deltaRjet = std::sqrt(deltaEtaJet * deltaEtaJet + deltaPhiJet * deltaPhiJet); - double deltaEtaUe1 = particleDirection.Eta() - ue1[i].Eta(); - double deltaPhiUe1 = getDeltaPhi(particleDirection.Phi(), ue1[i].Phi()); - double deltaRUe1 = std::sqrt(deltaEtaUe1 * deltaEtaUe1 + deltaPhiUe1 * deltaPhiUe1); - double deltaEtaUe2 = particleDirection.Eta() - ue2[i].Eta(); - double deltaPhiUe2 = getDeltaPhi(particleDirection.Phi(), ue2[i].Phi()); - double deltaRUe2 = std::sqrt(deltaEtaUe2 * deltaEtaUe2 + deltaPhiUe2 * deltaPhiUe2); - - // DCAxy Distributions of Antiprotons - if (track.sign() < 0) { // only antiprotons - if (isHighPurityAntiproton(track) && std::fabs(dcaz) < maxDcaz) { - if (deltaRjet < rJet) { - registryData.fill(HIST("antiproton_dca_jet"), pt, dcaxy); - } - if (deltaRUe1 < rJet || deltaRUe2 < rJet) { - registryData.fill(HIST("antiproton_dca_ue"), pt, dcaxy); - } - } - } - // DCA Cuts - if (std::fabs(dcaxy) > maxDcaxy) - continue; - if (std::fabs(dcaz) > maxDcaz) - continue; - - // Jet - if (deltaRjet < rJet) { - - if (track.sign() < 0) { // only antimatter - // Antiproton - if (passedItsPidSelection) { - if (pt < maxPtForNsigmaTpc) - registryData.fill(HIST("antiproton_jet_tpc"), pt, nsigmaTPCPr); - if (pt >= minPtForNsigmaTof && nsigmaTPCPr > minNsigmaTpc && nsigmaTPCPr < maxNsigmaTpc && track.hasTOF()) - registryData.fill(HIST("antiproton_jet_tof"), pt, nsigmaTOFPr); - } - - // Antideuteron - if (pt < maxPtForNsigmaTpc) - registryData.fill(HIST("antideuteron_jet_tpc"), pt, nsigmaTPCDe); - if (pt >= minPtForNsigmaTof && nsigmaTPCDe > minNsigmaTpc && nsigmaTPCDe < maxNsigmaTpc && track.hasTOF()) - registryData.fill(HIST("antideuteron_jet_tof"), pt, nsigmaTOFDe); - - // Antihelium3 - registryData.fill(HIST("antihelium3_jet_tpc"), 2.0 * pt, nsigmaTPCHe); - } - - if (track.sign() > 0) { // only matter - // Deuteron - if (pt >= minPtForNsigmaTof && nsigmaTPCDe > minNsigmaTpc && nsigmaTPCDe < maxNsigmaTpc && track.hasTOF()) - registryData.fill(HIST("deuteron_jet_tof"), pt, nsigmaTOFDe); - - // Helium3 - registryData.fill(HIST("helium3_jet_tpc"), 2.0 * pt, nsigmaTPCHe); - } - } - - // UE - if (deltaRUe1 < rJet || deltaRUe2 < rJet) { - - if (track.sign() < 0) { // only antimatter - // Antiproton - if (passedItsPidSelection) { - if (pt < maxPtForNsigmaTpc) - registryData.fill(HIST("antiproton_ue_tpc"), pt, nsigmaTPCPr); - if (pt >= minPtForNsigmaTof && nsigmaTPCPr > minNsigmaTpc && nsigmaTPCPr < maxNsigmaTpc && track.hasTOF()) - registryData.fill(HIST("antiproton_ue_tof"), pt, nsigmaTOFPr); - } - // Antideuteron - if (pt < maxPtForNsigmaTpc) - registryData.fill(HIST("antideuteron_ue_tpc"), pt, nsigmaTPCDe); - if (pt >= minPtForNsigmaTof && nsigmaTPCDe > minNsigmaTpc && nsigmaTPCDe < maxNsigmaTpc && track.hasTOF()) - registryData.fill(HIST("antideuteron_ue_tof"), pt, nsigmaTOFDe); - - // Antihelium3 - registryData.fill(HIST("antihelium3_ue_tpc"), 2.0 * pt, nsigmaTPCHe); - } - - if (track.sign() > 0) { // only matter - // Deuteron - if (pt >= minPtForNsigmaTof && nsigmaTPCDe > minNsigmaTpc && nsigmaTPCDe < maxNsigmaTpc && track.hasTOF()) - registryData.fill(HIST("deuteron_ue_tof"), pt, nsigmaTOFDe); - - // Helium3 - registryData.fill(HIST("helium3_ue_tpc"), 2.0 * pt, nsigmaTPCHe); - } - } - } - } - } - PROCESS_SWITCH(NucleiInJets, processData, "Process Data", true); - - Preslice perMCCollision = o2::aod::mcparticle::mcCollisionId; - Preslice perCollision = o2::aod::track::collisionId; - - void processEfficiency(o2::aod::McCollisions const& mcCollisions, SimCollisions const& collisions, MCTracks const& mcTracks, aod::McParticles const& mcParticles) - { - // Generated Events - for (const auto& mccollision : mcCollisions) { // o2-linter: disable=[const-ref-in-for-loop] - - registryMC.fill(HIST("number_of_events_mc"), 0.5); - auto mcParticlesPerColl = mcParticles.sliceBy(perMCCollision, mccollision.globalIndex()); - - for (auto& particle : mcParticlesPerColl) { // o2-linter: disable=[const-ref-in-for-loop] - - if (!particle.isPhysicalPrimary()) - continue; - if ((particle.pdgCode() != -2212) && (particle.pdgCode() != -1000010020) && (particle.pdgCode() != -1000020030)) - continue; - if (particle.eta() < minEta || particle.eta() > maxEta) - continue; - - double wAntipJet(1.0); - double wAntipUe(1.0); - if (applyReweighting) { - int ix = twoDweightsAntipJet->GetXaxis()->FindBin(particle.pt()); - int iy = twoDweightsAntipJet->GetYaxis()->FindBin(particle.eta()); - wAntipJet = twoDweightsAntipJet->GetBinContent(ix, iy); - wAntipUe = twoDweightsAntipUe->GetBinContent(ix, iy); - - // protections - if (ix == 0 || ix > twoDweightsAntipJet->GetNbinsX()) { - wAntipJet = 1.0; - wAntipUe = 1.0; - } - if (iy == 0 || iy > twoDweightsAntipJet->GetNbinsY()) { - wAntipJet = 1.0; - wAntipUe = 1.0; - } - } - - if (particle.pdgCode() == -2212) { - registryMC.fill(HIST("antiproton_jet_gen"), particle.pt(), wAntipJet); - registryMC.fill(HIST("antiproton_ue_gen"), particle.pt(), wAntipUe); - } - if (particle.pdgCode() == -1000010020) { - registryMC.fill(HIST("antideuteron_jet_gen"), particle.pt()); - registryMC.fill(HIST("antideuteron_ue_gen"), particle.pt()); - } - if (particle.pdgCode() == -1000020030) { - registryMC.fill(HIST("antihelium3_jet_gen"), particle.pt()); - registryMC.fill(HIST("antihelium3_ue_gen"), particle.pt()); - } - } - } - - // Reconstructed Events - for (const auto& collision : collisions) { // o2-linter: disable=[const-ref-in-for-loop] - - registryMC.fill(HIST("number_of_events_mc"), 1.5); - - // Event Selection - if (!collision.sel8()) - continue; - - if (std::fabs(collision.posZ()) > 10) - continue; - - // Event Counter (after event sel) - registryMC.fill(HIST("number_of_events_mc"), 2.5); - - auto tracksPerColl = mcTracks.sliceBy(perCollision, collision.globalIndex()); - - // Reconstructed Tracks - for (auto track : tracksPerColl) { // o2-linter: disable=[const-ref-in-for-loop] - - // Get MC Particle - if (!track.has_mcParticle()) - continue; - - const auto particle = track.mcParticle(); - if ((particle.pdgCode() != -2212) && (particle.pdgCode() != -1000010020) && (particle.pdgCode() != -1000020030)) - continue; - - // Track Selection - if (!passedTrackSelection(track)) - continue; - if (requirePvContributor && !(track.isPVContributor())) - continue; - - // Variables - float nsigmaTPCPr = track.tpcNSigmaPr(); - float nsigmaTOFPr = track.tofNSigmaPr(); - float nsigmaTPCDe = track.tpcNSigmaDe(); - float nsigmaTOFDe = track.tofNSigmaDe(); - float nsigmaTPCHe = track.tpcNSigmaHe(); - float pt = track.pt(); - - // DCA Templates - if (particle.pdgCode() == -2212 && particle.isPhysicalPrimary() && std::fabs(track.dcaZ()) < maxDcaz) - registryMC.fill(HIST("antiproton_dca_prim"), pt, track.dcaXY()); - - if (particle.pdgCode() == -2212 && (!particle.isPhysicalPrimary()) && std::fabs(track.dcaZ()) < maxDcaz) - registryMC.fill(HIST("antiproton_dca_sec"), pt, track.dcaXY()); - - // DCA Cuts - if (std::fabs(track.dcaXY()) > maxDcaxy) - continue; - if (std::fabs(track.dcaZ()) > maxDcaz) - continue; - - // Fraction of Primary Antiprotons - if (particle.pdgCode() == -2212) { - registryMC.fill(HIST("antiproton_all"), pt); - if (particle.isPhysicalPrimary()) { - registryMC.fill(HIST("antiproton_prim"), pt); - } - } - - if (!particle.isPhysicalPrimary()) - continue; - - double wAntipJet(1.0); - double wAntipUe(1.0); - if (applyReweighting) { - int ix = twoDweightsAntipJet->GetXaxis()->FindBin(particle.pt()); - int iy = twoDweightsAntipJet->GetYaxis()->FindBin(particle.eta()); - wAntipJet = twoDweightsAntipJet->GetBinContent(ix, iy); - wAntipUe = twoDweightsAntipUe->GetBinContent(ix, iy); - - // protection - if (ix == 0 || ix > twoDweightsAntipJet->GetNbinsX()) { - wAntipJet = 1.0; - wAntipUe = 1.0; - } - if (iy == 0 || iy > twoDweightsAntipJet->GetNbinsY()) { - wAntipJet = 1.0; - wAntipUe = 1.0; - } - } - - // Antiproton - if (particle.pdgCode() == -2212) { - if (pt < maxPtForNsigmaTpc && nsigmaTPCPr > minNsigmaTpc && nsigmaTPCPr < maxNsigmaTpc) { - registryMC.fill(HIST("antiproton_jet_rec_tpc"), pt, wAntipJet); - registryMC.fill(HIST("antiproton_ue_rec_tpc"), pt, wAntipUe); - } - if (pt >= minPtForNsigmaTof && nsigmaTPCPr > minNsigmaTpc && nsigmaTPCPr < maxNsigmaTpc && track.hasTOF() && nsigmaTOFPr > minNsigmaTof && nsigmaTOFPr < maxNsigmaTof) { - registryMC.fill(HIST("antiproton_jet_rec_tof"), pt, wAntipJet); - registryMC.fill(HIST("antiproton_ue_rec_tof"), pt, wAntipUe); - } - } - - // Antideuteron - if (particle.pdgCode() == -1000010020) { - if (pt < maxPtForNsigmaTpc && nsigmaTPCDe > minNsigmaTpc && nsigmaTPCDe < maxNsigmaTpc) { - registryMC.fill(HIST("antideuteron_jet_rec_tpc"), pt); - registryMC.fill(HIST("antideuteron_ue_rec_tpc"), pt); - } - if (pt >= minPtForNsigmaTof && nsigmaTPCDe > minNsigmaTpc && nsigmaTPCDe < maxNsigmaTpc && track.hasTOF() && nsigmaTOFDe > minNsigmaTof && nsigmaTOFDe < maxNsigmaTof) { - registryMC.fill(HIST("antideuteron_jet_rec_tof"), pt); - registryMC.fill(HIST("antideuteron_ue_rec_tof"), pt); - } - } - - // Antihelium-3 - if (particle.pdgCode() == -1000020030) { - if (nsigmaTPCHe > minNsigmaTpc && nsigmaTPCHe < maxNsigmaTpc) { - registryMC.fill(HIST("antihelium3_jet_rec_tpc"), 2.0 * pt); - registryMC.fill(HIST("antihelium3_ue_rec_tpc"), 2.0 * pt); - } - } - } - } - } - PROCESS_SWITCH(NucleiInJets, processEfficiency, "process efficiency", false); - - void processSecondaryAntiprotons(SimCollisions const& collisions, MCTracks const& mcTracks, aod::McCollisions const&, const aod::McParticles&) - { - for (const auto& collision : collisions) { // o2-linter: disable=[const-ref-in-for-loop] - - registryMC.fill(HIST("number_of_events_mc"), 3.5); - - // Event Selection - if (!collision.sel8()) - continue; - registryMC.fill(HIST("number_of_events_mc"), 4.5); - - if (std::fabs(collision.posZ()) > zVtx) - continue; - registryMC.fill(HIST("number_of_events_mc"), 5.5); - - auto tracksPerColl = mcTracks.sliceBy(perCollision, collision.globalIndex()); - - // List of Tracks - std::vector trk; - std::vector part; - std::vector ntrk; - - for (auto track : tracksPerColl) { // o2-linter: disable=[const-ref-in-for-loop] - - if (!passedTrackSelectionForJetReconstruction(track)) - continue; - if (!track.has_mcParticle()) - continue; - - const auto particle = track.mcParticle(); - TVector3 pRec(track.px(), track.py(), track.pz()); - TVector3 pGen(particle.px(), particle.py(), particle.pz()); - trk.push_back(pRec); - part.push_back(pGen); - ntrk.push_back(1); - } - - // Reject Empty Events - if (static_cast(trk.size()) < 1) - continue; - - // Anti-kt Jet Finder - int nParticlesRemoved(0); - std::vector jet; - std::vector jetGen; - std::vector ue1; - std::vector ue2; - std::vector nParticlesInjet; - - do { - double dijMin(1e+300), diBmin(1e+300); - int iMin(0), jMin(0), iBmin(0); - for (int i = 0; i < static_cast(trk.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] - if (trk[i].Mag() == 0) - continue; - double diB = 1.0 / (trk[i].Pt() * trk[i].Pt()); - if (diB < diBmin) { - diBmin = diB; - iBmin = i; - } - for (int j = (i + 1); j < static_cast(trk.size()); j++) { // o2-linter: disable=[const-ref-in-for-loop] - if (trk[j].Mag() == 0) - continue; - double dij = calculateDij(trk[i], trk[j], rJet); - if (dij < dijMin) { - dijMin = dij; - iMin = i; - jMin = j; - } - } - } - if (dijMin < diBmin) { - trk[iMin] = trk[iMin] + trk[jMin]; - ntrk[iMin] = ntrk[iMin] + ntrk[jMin]; - part[iMin] = part[iMin] + part[jMin]; - trk[jMin].SetXYZ(0, 0, 0); - part[jMin].SetXYZ(0, 0, 0); - ntrk[jMin] = 0; - nParticlesRemoved++; - } - if (dijMin > diBmin) { - jet.push_back(trk[iBmin]); - jetGen.push_back(part[iBmin]); - nParticlesInjet.push_back(ntrk[iBmin]); - trk[iBmin].SetXYZ(0, 0, 0); - part[iBmin].SetXYZ(0, 0, 0); - nParticlesRemoved++; - } - } while (nParticlesRemoved < static_cast(trk.size())); - - // Jet Selection - std::vector isSelected; - int nJetsSelected(0); - for (int i = 0; i < static_cast(jet.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] - - // Initialization - isSelected.push_back(0); - - // Jet fully contained inside acceptance - if ((std::fabs(jet[i].Eta()) + rJet) > (maxEta - 0.5)) - continue; - if (nParticlesInjet[i] < minNparticlesInJet) - continue; - - // Perpendicular cones - TVector3 ueAxis1(0, 0, 0); - TVector3 ueAxis2(0, 0, 0); - getPerpendicularAxis(jet[i], ueAxis1, +1); - getPerpendicularAxis(jet[i], ueAxis2, -1); - ue1.push_back(ueAxis1); - ue2.push_back(ueAxis2); - - double ptUE(0); - for (auto track : tracksPerColl) { // o2-linter: disable=[const-ref-in-for-loop] - - if (!passedTrackSelectionForJetReconstruction(track)) - continue; - TVector3 selectedTrack(track.px(), track.py(), track.pz()); - if (!track.has_mcParticle()) - continue; - - const auto particle = track.mcParticle(); - double deltaEtaUe1 = selectedTrack.Eta() - ueAxis1.Eta(); - double deltaPhiUe1 = getDeltaPhi(selectedTrack.Phi(), ueAxis1.Phi()); - double deltaRUe1 = std::sqrt(deltaEtaUe1 * deltaEtaUe1 + deltaPhiUe1 * deltaPhiUe1); - double deltaEtaUe2 = selectedTrack.Eta() - ueAxis2.Eta(); - double deltaPhiUe2 = getDeltaPhi(selectedTrack.Phi(), ueAxis2.Phi()); - double deltaRUe2 = std::sqrt(deltaEtaUe2 * deltaEtaUe2 + deltaPhiUe2 * deltaPhiUe2); - - if ((deltaRUe1 < alpha * rJet) || (deltaRUe2 < alpha * rJet)) { - ptUE = ptUE + particle.pt(); - } - } - registryQC.fill(HIST("sumPtUE_MC"), 0.5 * ptUE); - - double ptJetCorr = jetGen[i].Pt() - averagePtUEMC; - - if (ptJetCorr < minJetPt) - continue; - - nJetsSelected++; - isSelected[i] = 1; - } - if (nJetsSelected == 0) - continue; - - // Overlaps - int nOverlapsJetJet(0); - int nOverlapsJetUe(0); - int nOverlapsUeUe(0); - int nOverlapsTot(0); - for (int i = 0; i < static_cast(jet.size()); i++) { - if (isSelected[i] == 0) - continue; - - for (int j = (i + 1); j < static_cast(jet.size()); j++) { - if (isSelected[j] == 0) - continue; - if (overlap(jet[i], jet[j], rJet)) - nOverlapsJetJet++; - if (overlap(jet[i], ue1[j], rJet) || overlap(jet[i], ue2[j], rJet)) - nOverlapsJetUe++; - if (overlap(ue1[i], ue1[j], rJet) || overlap(ue1[i], ue2[j], rJet) || overlap(ue2[i], ue2[j], rJet)) - nOverlapsUeUe++; - } - } - nOverlapsTot = nOverlapsJetJet + nOverlapsJetUe + nOverlapsUeUe; - if (nJetsSelected > nJetsPerEventMax) - continue; - if (requireNoOverlap && nOverlapsTot > 0) - continue; - - for (int i = 0; i < static_cast(jet.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] - - if (isSelected[i] == 0) - continue; - - for (auto track : tracksPerColl) { // o2-linter: disable=[const-ref-in-for-loop] - if (!passedTrackSelection(track)) - continue; - if (requirePvContributor && !(track.isPVContributor())) - continue; - if (track.sign() > 0) - continue; - if (std::fabs(track.dcaXY()) > maxDcaxy) - continue; - if (std::fabs(track.dcaZ()) > maxDcaz) - continue; - if (!track.has_mcParticle()) - continue; - const auto particle = track.mcParticle(); - if (particle.pdgCode() != -2212) - continue; - - TVector3 particleDirection(track.px(), track.py(), track.pz()); - float deltaEtaJet = particleDirection.Eta() - jet[i].Eta(); - float deltaPhiJet = getDeltaPhi(particleDirection.Phi(), jet[i].Phi()); - float deltaRjet = std::sqrt(deltaEtaJet * deltaEtaJet + deltaPhiJet * deltaPhiJet); - float deltaEtaUe1 = particleDirection.Eta() - ue1[i].Eta(); - float deltaPhiUe1 = getDeltaPhi(particleDirection.Phi(), ue1[i].Phi()); - float deltaRUe1 = std::sqrt(deltaEtaUe1 * deltaEtaUe1 + deltaPhiUe1 * deltaPhiUe1); - float deltaEtaUe2 = particleDirection.Eta() - ue2[i].Eta(); - float deltaPhiUe2 = getDeltaPhi(particleDirection.Phi(), ue2[i].Phi()); - float deltaRUe2 = std::sqrt(deltaEtaUe2 * deltaEtaUe2 + deltaPhiUe2 * deltaPhiUe2); - - if (deltaRjet < rJet) { - registryMC.fill(HIST("antiproton_all_jet"), track.pt()); - if (particle.isPhysicalPrimary()) { - registryMC.fill(HIST("antiproton_prim_jet"), track.pt()); - } - } - if (deltaRUe1 < rJet || deltaRUe2 < rJet) { - registryMC.fill(HIST("antiproton_all_ue"), track.pt()); - if (particle.isPhysicalPrimary()) { - registryMC.fill(HIST("antiproton_prim_ue"), track.pt()); - } - } - } - } - } - } - PROCESS_SWITCH(NucleiInJets, processSecondaryAntiprotons, "process secondary antiprotons", false); - - void processAntiprotonReweighting(o2::aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) - { - for (const auto& mccollision : mcCollisions) { // o2-linter: disable=[const-ref-in-for-loop] - - registryMC.fill(HIST("number_of_events_mc"), 7.5); - - // Selection on z_{vertex} - if (std::fabs(mccollision.posZ()) > 10) - continue; - registryMC.fill(HIST("number_of_events_mc"), 8.5); - - // MC Particles per Collision - auto mcParticlesPerColl = mcParticles.sliceBy(perMCCollision, mccollision.globalIndex()); - - // List of Tracks - std::vector trk; - std::vector ntrk; - - for (auto& particle : mcParticlesPerColl) { // o2-linter: disable=[const-ref-in-for-loop] - if (particle.isPhysicalPrimary() && particle.pdgCode() == -2212) { - registryMC.fill(HIST("antiproton_eta_pt_pythia"), particle.pt(), particle.eta()); - } - - // Select Primary Particles - double dx = particle.vx() - mccollision.posX(); - double dy = particle.vy() - mccollision.posY(); - double dz = particle.vz() - mccollision.posZ(); - double dcaxy = std::sqrt(dx * dx + dy * dy); - double dcaz = std::fabs(dz); - if (dcaxy > 0.25) - continue; - if (dcaz > 2.0) - continue; - if (std::fabs(particle.eta()) > 0.8) - continue; - if (particle.pt() < 0.15) - continue; - - // PDG Selection - int pdg = std::fabs(particle.pdgCode()); - if ((pdg != 11) && (pdg != 211) && (pdg != 321) && (pdg != 2212)) - continue; - - TVector3 momentum(particle.px(), particle.py(), particle.pz()); - trk.push_back(momentum); - ntrk.push_back(1); - } - - // Anti-kt Jet Finder - int nParticlesRemoved(0); - std::vector jet; - std::vector ue1; - std::vector ue2; - std::vector nParticlesInjet; - - do { - double dijMin(1e+300), diBmin(1e+300); - int iMin(0), jMin(0), iBmin(0); - for (int i = 0; i < static_cast(trk.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] - if (trk[i].Mag() == 0) - continue; - double diB = 1.0 / (trk[i].Pt() * trk[i].Pt()); - if (diB < diBmin) { - diBmin = diB; - iBmin = i; - } - for (int j = (i + 1); j < static_cast(trk.size()); j++) { // o2-linter: disable=[const-ref-in-for-loop] - if (trk[j].Mag() == 0) - continue; - double dij = calculateDij(trk[i], trk[j], rJet); - if (dij < dijMin) { - dijMin = dij; - iMin = i; - jMin = j; - } - } - } - if (dijMin < diBmin) { - trk[iMin] = trk[iMin] + trk[jMin]; - ntrk[iMin] = ntrk[iMin] + ntrk[jMin]; - trk[jMin].SetXYZ(0, 0, 0); - ntrk[jMin] = 0; - nParticlesRemoved++; - } - if (dijMin > diBmin) { - jet.push_back(trk[iBmin]); - nParticlesInjet.push_back(ntrk[iBmin]); - trk[iBmin].SetXYZ(0, 0, 0); - nParticlesRemoved++; - } - } while (nParticlesRemoved < static_cast(trk.size())); - - // Jet Selection - std::vector isSelected; - int nJetsSelected(0); - for (int i = 0; i < static_cast(jet.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] - - // Initialization - isSelected.push_back(0); - - // Jet fully contained inside acceptance - if ((std::fabs(jet[i].Eta()) + rJet) > (maxEta - 0.5)) - continue; - if (nParticlesInjet[i] < minNparticlesInJet) - continue; - - // Perpendicular cones - TVector3 ueAxis1(0, 0, 0); - TVector3 ueAxis2(0, 0, 0); - getPerpendicularAxis(jet[i], ueAxis1, +1); - getPerpendicularAxis(jet[i], ueAxis2, -1); - ue1.push_back(ueAxis1); - ue2.push_back(ueAxis2); - - double ptJetCorr = jet[i].Pt() - averagePtUEMC; - if (ptJetCorr < minJetPt) - continue; - - nJetsSelected++; - isSelected[i] = 1; - } - if (nJetsSelected == 0) - continue; - - // Overlaps - int nOverlapsJetJet(0); - int nOverlapsJetUe(0); - int nOverlapsUeUe(0); - int nOverlapsTot(0); - for (int i = 0; i < static_cast(jet.size()); i++) { - if (isSelected[i] == 0) - continue; - - for (int j = (i + 1); j < static_cast(jet.size()); j++) { - if (isSelected[j] == 0) - continue; - if (overlap(jet[i], jet[j], rJet)) - nOverlapsJetJet++; - if (overlap(jet[i], ue1[j], rJet) || overlap(jet[i], ue2[j], rJet)) - nOverlapsJetUe++; - if (overlap(ue1[i], ue1[j], rJet) || overlap(ue1[i], ue2[j], rJet) || overlap(ue2[i], ue2[j], rJet)) - nOverlapsUeUe++; - } - } - nOverlapsTot = nOverlapsJetJet + nOverlapsJetUe + nOverlapsUeUe; - if (nJetsSelected > nJetsPerEventMax) - continue; - if (requireNoOverlap && nOverlapsTot > 0) - continue; - - for (int i = 0; i < static_cast(jet.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] - - if (isSelected[i] == 0) - continue; - - // Generated Particles - for (auto& particle : mcParticlesPerColl) { // o2-linter: disable=[const-ref-in-for-loop] - - if (!particle.isPhysicalPrimary()) - continue; - if (particle.pdgCode() != -2212) - continue; - - TVector3 particleDirection(particle.px(), particle.py(), particle.pz()); - double deltaEtaJet = particleDirection.Eta() - jet[i].Eta(); - double deltaPhiJet = getDeltaPhi(particleDirection.Phi(), jet[i].Phi()); - double deltaRjet = std::sqrt(deltaEtaJet * deltaEtaJet + deltaPhiJet * deltaPhiJet); - double deltaEtaUe1 = particleDirection.Eta() - ue1[i].Eta(); - double deltaPhiUe1 = getDeltaPhi(particleDirection.Phi(), ue1[i].Phi()); - double deltaRUe1 = std::sqrt(deltaEtaUe1 * deltaEtaUe1 + deltaPhiUe1 * deltaPhiUe1); - double deltaEtaUe2 = particleDirection.Eta() - ue2[i].Eta(); - double deltaPhiUe2 = getDeltaPhi(particleDirection.Phi(), ue2[i].Phi()); - double deltaRUe2 = std::sqrt(deltaEtaUe2 * deltaEtaUe2 + deltaPhiUe2 * deltaPhiUe2); - - if (deltaRjet < rJet) { - registryMC.fill(HIST("antiproton_eta_pt_jet"), particle.pt(), particle.eta()); - } - if (deltaRUe1 < rJet || deltaRUe2 < rJet) { - registryMC.fill(HIST("antiproton_eta_pt_ue"), particle.pt(), particle.eta()); - } - } - } - } - } - PROCESS_SWITCH(NucleiInJets, processAntiprotonReweighting, "Process antiproton reweighting", false); - - void processGhosts(SelectedCollisions::iterator const& collision, FullNucleiTracks const& tracks) - { - // Event Selection - if (!collision.sel8() || std::fabs(collision.posZ()) > zVtx) - return; - - // Track Selection for Jet Finding - std::vector trk; - for (auto track : tracks) { // o2-linter: disable=[const-ref-in-for-loop] - - if (!passedTrackSelectionForJetReconstruction(track)) - continue; - TVector3 momentum(track.px(), track.py(), track.pz()); - trk.push_back(momentum); - } - // Reject Empty Events - if (static_cast(trk.size()) < 1) - return; - - // Generate Ghosts - for (int i = 0; i < nGhosts; i++) { // o2-linter: disable=[const-ref-in-for-loop] - - double eta = gRandom->Uniform(-0.8, 0.8); - double phi = gRandom->Uniform(0.0, TwoPI); - double pt = 1e-100; - TVector3 ghost; - ghost.SetPtEtaPhi(pt, eta, phi); - trk.push_back(ghost); - } - - // Anti-kt Jet Finder - int nParticlesRemoved(0); - std::vector jet; - std::vector jetArea; - - do { - double dijMin(1e+300), diBmin(1e+300); - int iMin(0), jMin(0), iBmin(0); - int nGhostsInJet(0); - for (int i = 0; i < static_cast(trk.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] - if (trk[i].Mag() == 0) - continue; - double diB = 1.0 / (trk[i].Pt() * trk[i].Pt()); - if (diB < diBmin) { - diBmin = diB; - iBmin = i; - } - for (int j = (i + 1); j < static_cast(trk.size()); j++) { // o2-linter: disable=[const-ref-in-for-loop] - if (trk[j].Mag() == 0) - continue; - double dij = calculateDij(trk[i], trk[j], rJet); - if (dij < dijMin) { - dijMin = dij; - iMin = i; - jMin = j; - } - } - } - if (dijMin < diBmin) { - if (trk[iMin].Pt() == 1e-100) - nGhostsInJet++; - if (trk[jMin].Pt() == 1e-100) - nGhostsInJet++; - trk[iMin] = trk[iMin] + trk[jMin]; - trk[jMin].SetXYZ(0, 0, 0); - nParticlesRemoved++; - } - if (dijMin > diBmin) { - double area = (static_cast(nGhostsInJet) / static_cast(nGhosts)) * TwoPI * 1.6; - double alphaJet = area / (PI * rJet * rJet); - jetArea.push_back(alphaJet); - jet.push_back(trk[iBmin]); - trk[iBmin].SetXYZ(0, 0, 0); - nParticlesRemoved++; - } - if (dijMin == diBmin) { - registryQC.fill(HIST("hError"), 0.5); - nParticlesRemoved = static_cast(trk.size()); - } - } while (nParticlesRemoved < static_cast(trk.size())); - - for (int i = 0; i < static_cast(jet.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] - - if ((std::fabs(jet[i].Eta()) + rJet) > (maxEta - 0.5)) - continue; - - double ptJetRec = jet[i].Pt() - averagePtUE; - double ptJetCorr = getCorrectedPt(ptJetRec); - if (ptJetCorr < minJetPt) - continue; - - registryQC.fill(HIST("hJetArea"), jetArea[i]); - } - } - PROCESS_SWITCH(NucleiInJets, processGhosts, "Process Ghosts", false); - - void processDetResponseMatrix(SimCollisions const& collisions, MCTracks const& mcTracks, aod::McCollisions const&, const aod::McParticles&) - { - for (const auto& collision : collisions) { // o2-linter: disable=[const-ref-in-for-loop] - - // Event Selection - if (!collision.sel8() || std::fabs(collision.posZ()) > zVtx) - continue; - - // List of Tracks and Particles - std::vector trk; - std::vector part; - std::vector ntrk; - auto tracksPerColl = mcTracks.sliceBy(perCollision, collision.globalIndex()); - - for (auto track : tracksPerColl) { // o2-linter: disable=[const-ref-in-for-loop] - - if (!passedTrackSelectionForJetReconstruction(track)) - continue; - if (!track.has_mcParticle()) - continue; - const auto particle = track.mcParticle(); - - TVector3 recMomentum(track.px(), track.py(), track.pz()); - TVector3 genMomentum(particle.px(), particle.py(), particle.pz()); - trk.push_back(recMomentum); - part.push_back(genMomentum); - ntrk.push_back(1); - } - // Reject Empty Events - if (static_cast(trk.size()) < 1) - continue; - - // Anti-kt Jet Finder - int nParticlesRemoved(0); - std::vector jetRecMomentum; - std::vector jetGenMomentum; - std::vector nParticlesInjet; - - do { - double dijMin(1e+300), diBmin(1e+300); - int iMin(0), jMin(0), iBmin(0); - for (int i = 0; i < static_cast(trk.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] - if (trk[i].Mag() == 0) - continue; - double diB = 1.0 / (trk[i].Pt() * trk[i].Pt()); - if (diB < diBmin) { - diBmin = diB; - iBmin = i; - } - for (int j = (i + 1); j < static_cast(trk.size()); j++) { // o2-linter: disable=[const-ref-in-for-loop] - if (trk[j].Mag() == 0) - continue; - double dij = calculateDij(trk[i], trk[j], rJet); - if (dij < dijMin) { - dijMin = dij; - iMin = i; - jMin = j; - } - } - } - if (dijMin < diBmin) { - trk[iMin] = trk[iMin] + trk[jMin]; - ntrk[iMin] = ntrk[iMin] + ntrk[jMin]; - part[iMin] = part[iMin] + part[jMin]; - trk[jMin].SetXYZ(0, 0, 0); - ntrk[jMin] = 0; - nParticlesRemoved++; - } - if (dijMin > diBmin) { - jetRecMomentum.push_back(trk[iBmin]); - jetGenMomentum.push_back(part[iBmin]); - nParticlesInjet.push_back(ntrk[iBmin]); - trk[iBmin].SetXYZ(0, 0, 0); - nParticlesRemoved++; - } - } while (nParticlesRemoved < static_cast(trk.size())); - - for (int i = 0; i < static_cast(jetRecMomentum.size()); i++) { // o2-linter: disable=[const-ref-in-for-loop] - - if ((std::fabs(jetRecMomentum[i].Eta()) + rJet) > (maxEta - 0.5)) - continue; - - double ptGen = jetGenMomentum[i].Pt(); - double ptRec = jetRecMomentum[i].Pt(); - registryMC.fill(HIST("detectorResponseMatrix"), ptGen, ptRec); - } - } - } - PROCESS_SWITCH(NucleiInJets, processDetResponseMatrix, "process detector response matrix", false); -}; - -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - return WorkflowSpec{adaptAnalysisTask(cfgc)}; -} From 542ec8261a93bdb91f99c63797bbae91e7456c37 Mon Sep 17 00:00:00 2001 From: Paul Buehler Date: Fri, 7 Mar 2025 22:44:15 +0100 Subject: [PATCH 0605/1650] [PWGUD] enable skimmers to save all McCollisions, even if they are not reconstructed (#10393) --- PWGUD/Core/UDHelpers.h | 2 +- PWGUD/TableProducer/DGCandProducer.cxx | 101 ++++++++++++++++------ PWGUD/TableProducer/SGCandProducer.cxx | 115 +++++++++++++++++-------- 3 files changed, 153 insertions(+), 65 deletions(-) diff --git a/PWGUD/Core/UDHelpers.h b/PWGUD/Core/UDHelpers.h index 4b8050cf6f1..4b692f7c5c1 100644 --- a/PWGUD/Core/UDHelpers.h +++ b/PWGUD/Core/UDHelpers.h @@ -122,7 +122,7 @@ T compatibleBCs(B const& bc, uint64_t const& meanBC, int const& deltaBC, T const // check [min,max]BC to overlap with [bcs.iteratorAt([0,bcs.size() - 1]) if (maxBC < bcs.iteratorAt(0).globalBC() || minBC > bcs.iteratorAt(bcs.size() - 1).globalBC()) { - LOGF(info, " No overlap of [%d, %d] and [%d, %d]", minBC, maxBC, bcs.iteratorAt(0).globalBC(), bcs.iteratorAt(bcs.size() - 1).globalBC()); + LOGF(debug, " No overlap of [%d, %d] and [%d, %d]", minBC, maxBC, bcs.iteratorAt(0).globalBC(), bcs.iteratorAt(bcs.size() - 1).globalBC()); return T{{bcs.asArrowTable()->Slice(0, 0)}, static_cast(0)}; } diff --git a/PWGUD/TableProducer/DGCandProducer.cxx b/PWGUD/TableProducer/DGCandProducer.cxx index 9aa418d8573..f5cec97f6c0 100644 --- a/PWGUD/TableProducer/DGCandProducer.cxx +++ b/PWGUD/TableProducer/DGCandProducer.cxx @@ -472,6 +472,9 @@ struct McDGCandProducer { Produces outputMcCollsLabels; Produces outputMcTrackLabels; + // save all McTruth, even if the collisions is not reconstructed + Configurable saveAllMcCollisions{"saveAllMcCollisions", true, "save all McCollisions"}; + using CCs = soa::Join; using BCs = soa::Join; using TCs = soa::Join; @@ -670,30 +673,10 @@ struct McDGCandProducer { } } - void init(InitContext& context) - { - // add histograms for the different process functions - if (context.mOptions.get("processMCTruth")) { - registry.add("mcTruth/collisions", "Number of associated collisions", {HistType::kTH1F, {{11, -0.5, 10.5}}}); - registry.add("mcTruth/collType", "Collision type", {HistType::kTH1F, {{5, -0.5, 4.5}}}); - registry.add("mcTruth/IVMpt", "Invariant mass versus p_{T}", {HistType::kTH2F, {{150, 0.0, 3.0}, {150, 0.0, 3.0}}}); - } - } - - // process function for MC data - // save the MC truth of all events of interest and of the DG events - void processMCTruth(aod::McCollisions const& mccols, aod::McParticles const& mcparts, - UDCCs const& dgcands, UDTCs const& udtracks, - CCs const& /*collisions*/, BCs const& /*bcs*/, TCs const& /*tracks*/) + // updating McTruth data and links to reconstructed data + void procWithDgCand(aod::McCollisions const& mccols, aod::McParticles const& mcparts, + UDCCs const& dgcands, UDTCs const& udtracks) { - LOGF(debug, "Number of McCollisions %d", mccols.size()); - LOGF(debug, "Number of DG candidates %d", dgcands.size()); - LOGF(debug, "Number of UD tracks %d", udtracks.size()); - if (dgcands.size() <= 0) { - LOGF(info, "No DG candidates to save!"); - return; - } - // use a hash table to keep track of the McCollisions which have been added to the UDMcCollision table // {McCollisionId : udMcCollisionId} // similar for the McParticles which have been added to the UDMcParticle table @@ -703,18 +686,19 @@ struct McDGCandProducer { // loop over McCollisions and UDCCs simultaneously auto mccol = mccols.iteratorAt(0); - auto dgcand = dgcands.iteratorAt(0); auto lastmccol = mccols.iteratorAt(mccols.size() - 1); + auto mccolAtEnd = false; + + auto dgcand = dgcands.iteratorAt(0); auto lastdgcand = dgcands.iteratorAt(dgcands.size() - 1); + auto dgcandAtEnd = false; // advance dgcand and mccol until both are AtEnd int64_t mccolId = mccol.globalIndex(); int64_t mcdgId = -1; int64_t colId = -1; - auto dgcandAtEnd = dgcand == lastdgcand; - auto mccolAtEnd = mccol == lastmccol; - bool goon = !dgcandAtEnd || !mccolAtEnd; + bool goon = true; while (goon) { // check if dgcand has an associated Collision and McCollision if (dgcand.has_collision()) { @@ -825,10 +809,71 @@ struct McDGCandProducer { mccolAtEnd = true; } } - LOGF(debug, " UDMcCollsLabels %d (of %d) UDMcCollisions %d", outputMcCollsLabels.lastIndex(), dgcands.size() - 1, outputMcCollisions.lastIndex()); + LOGF(info, " UDMcCollsLabels %d (of %d) UDMcCollisions %d", outputMcCollsLabels.lastIndex(), dgcands.size() - 1, outputMcCollisions.lastIndex()); goon = !dgcandAtEnd || !mccolAtEnd; } } + + // updating McTruth data only + void procWithoutDgCand(aod::McCollisions const& mccols, aod::McParticles const& mcparts) + { + // use a hash table to keep track of the McCollisions which have been added to the UDMcCollision table + // {McCollisionId : udMcCollisionId} + // similar for the McParticles which have been added to the UDMcParticle table + // {McParticleId : udMcParticleId} + std::map mcColIsSaved; + std::map mcPartIsSaved; + + // loop over McCollisions + for (auto const& mccol : mccols) { + int64_t mccolId = mccol.globalIndex(); + + // update UDMcCollisions and UDMcParticles + if (mcColIsSaved.find(mccolId) == mcColIsSaved.end()) { + + // update UDMcCollisions + LOGF(debug, " writing mcCollision %d to UDMcCollisions", mccolId); + updateUDMcCollisions(mccol); + mcColIsSaved[mccolId] = outputMcCollisions.lastIndex(); + + // update UDMcParticles + auto mcPartsSlice = mcparts.sliceBy(mcPartsPerMcCollision, mccolId); + updateUDMcParticles(mcPartsSlice, mcColIsSaved[mccolId], mcPartIsSaved); + } + } + } + + void init(InitContext& context) + { + // add histograms for the different process functions + if (context.mOptions.get("processMCTruth")) { + LOGF(info, "Preparing histograms for processMCTruth."); + registry.add("mcTruth/collisions", "Number of associated collisions", {HistType::kTH1F, {{11, -0.5, 10.5}}}); + registry.add("mcTruth/collType", "Collision type", {HistType::kTH1F, {{5, -0.5, 4.5}}}); + registry.add("mcTruth/IVMpt", "Invariant mass versus p_{T}", {HistType::kTH2F, {{150, 0.0, 3.0}, {150, 0.0, 3.0}}}); + } + } + + // process function for MC data + // save the MC truth of all events of interest and of the DG events + void processMCTruth(aod::McCollisions const& mccols, aod::McParticles const& mcparts, + UDCCs const& dgcands, UDTCs const& udtracks, + CCs const& /*collisions*/, BCs const& /*bcs*/, TCs const& /*tracks*/) + { + LOGF(info, "Number of McCollisions %d", mccols.size()); + LOGF(info, "Number of DG candidates %d", dgcands.size()); + LOGF(info, "Number of UD tracks %d", udtracks.size()); + + if (mccols.size() > 0) { + if (dgcands.size() > 0) { + procWithDgCand(mccols, mcparts, dgcands, udtracks); + } else { + if (saveAllMcCollisions) { + procWithoutDgCand(mccols, mcparts); + } + } + } + } PROCESS_SWITCH(McDGCandProducer, processMCTruth, "Produce MC tables", false); void processDummy(aod::Collisions const& /*collisions*/) diff --git a/PWGUD/TableProducer/SGCandProducer.cxx b/PWGUD/TableProducer/SGCandProducer.cxx index 07eaa7891b7..c3d8de0cb48 100644 --- a/PWGUD/TableProducer/SGCandProducer.cxx +++ b/PWGUD/TableProducer/SGCandProducer.cxx @@ -365,6 +365,9 @@ struct McSGCandProducer { Produces outputMcCollsLabels; Produces outputMcTrackLabels; + // save all McTruth, even if the collisions is not reconstructed + Configurable saveAllMcCollisions{"saveAllMcCollisions", true, "save all McCollisions"}; + using CCs = soa::Join; using BCs = soa::Join; using TCs = soa::Join; @@ -539,33 +542,10 @@ struct McSGCandProducer { } } - void init(InitContext& context) + // updating McTruth data and links to reconstructed data + void procWithSgCand(aod::McCollisions const& mccols, aod::McParticles const& mcparts, + UDCCs const& sgcands, UDTCs const& udtracks) { - // add histograms for the different process functions - if (context.mOptions.get("processMC")) { - registry.add("mcTruth/collisions", "Number of associated collisions", {HistType::kTH1F, {{11, -0.5, 10.5}}}); - registry.add("mcTruth/collType", "Collision type", {HistType::kTH1F, {{5, -0.5, 4.5}}}); - registry.add("mcTruth/IVMpt", "Invariant mass versus p_{T}", {HistType::kTH2F, {{150, 0.0, 3.0}, {150, 0.0, 3.0}}}); - } - } - - // process function for MC data - // save the MC truth of all events of interest and of the DG events - void processMC(aod::McCollisions const& mccols, aod::McParticles const& mcparts, - UDCCs const& sgcands, UDTCs const& udtracks, - CCs const& /*collisions*/, BCs const& /*bcs*/, TCs const& /*tracks*/) - { - if (verboseInfoMC) { - LOGF(info, "Number of McCollisions %d", mccols.size()); - LOGF(info, "Number of SG candidates %d", sgcands.size()); - LOGF(info, "Number of UD tracks %d", udtracks.size()); - } - if (sgcands.size() <= 0) { - if (verboseInfoMC) - LOGF(info, "No DG candidates to save!"); - return; - } - // use a hash table to keep track of the McCollisions which have been added to the UDMcCollision table // {McCollisionId : udMcCollisionId} // similar for the McParticles which have been added to the UDMcParticle table @@ -575,21 +555,20 @@ struct McSGCandProducer { // loop over McCollisions and UDCCs simultaneously auto mccol = mccols.iteratorAt(0); - auto sgcand = sgcands.iteratorAt(0); auto lastmccol = mccols.iteratorAt(mccols.size() - 1); + auto mccolAtEnd = false; + + auto sgcand = sgcands.iteratorAt(0); auto lastsgcand = sgcands.iteratorAt(sgcands.size() - 1); + auto sgcandAtEnd = false; // advance dgcand and mccol until both are AtEnd int64_t mccolId = mccol.globalIndex(); int64_t mcsgId = -1; - // int64_t colId = -1; - auto sgcandAtEnd = sgcand == lastsgcand; - auto mccolAtEnd = mccol == lastmccol; - bool goon = !sgcandAtEnd || !mccolAtEnd; + + bool goon = true; while (goon) { - auto bcIter = mccol.bc_as(); - uint64_t globBC = bcIter.globalBC(); - // uint64_t globBC = 0; + auto globBC = mccol.bc_as().globalBC(); // check if dgcand has an associated McCollision if (sgcand.has_collision()) { auto sgcandCol = sgcand.collision_as(); @@ -600,7 +579,6 @@ struct McSGCandProducer { mcsgId = -1; } } else { - // colId = -1; mcsgId = -1; } if (verboseInfoMC) @@ -659,7 +637,7 @@ struct McSGCandProducer { auto mcPart = track.mcParticle(); auto mcCol = mcPart.mcCollision(); if (mcColIsSaved.find(mcCol.globalIndex()) == mcColIsSaved.end()) { - updateUDMcCollisions(mcCol, mcCol.bc_as().globalBC()); + updateUDMcCollisions(mcCol, globBC); mcColIsSaved[mcCol.globalIndex()] = outputMcCollisions.lastIndex(); } updateUDMcParticle(mcPart, mcColIsSaved[mcCol.globalIndex()], mcPartIsSaved); @@ -687,6 +665,7 @@ struct McSGCandProducer { if (mcColIsSaved.find(mccolId) == mcColIsSaved.end()) { if (verboseInfoMC) LOGF(info, " Saving McCollision %d", mccolId); + // update UDMcCollisions updateUDMcCollisions(mccol, globBC); mcColIsSaved[mccolId] = outputMcCollisions.lastIndex(); @@ -710,7 +689,71 @@ struct McSGCandProducer { LOGF(info, "End of loop mcsgId %d mccolId %d", mcsgId, mccolId); } } + + // updating McTruth data only + void procWithoutSgCand(aod::McCollisions const& mccols, aod::McParticles const& mcparts) + { + // use a hash table to keep track of the McCollisions which have been added to the UDMcCollision table + // {McCollisionId : udMcCollisionId} + // similar for the McParticles which have been added to the UDMcParticle table + // {McParticleId : udMcParticleId} + std::map mcColIsSaved; + std::map mcPartIsSaved; + + // loop over McCollisions + for (auto const& mccol : mccols) { + int64_t mccolId = mccol.globalIndex(); + uint64_t globBC = mccol.bc_as().globalBC(); + + // update UDMcCollisions and UDMcParticles + if (mcColIsSaved.find(mccolId) == mcColIsSaved.end()) { + if (verboseInfoMC) + LOGF(info, " Saving McCollision %d", mccolId); + + // update UDMcCollisions + updateUDMcCollisions(mccol, globBC); + mcColIsSaved[mccolId] = outputMcCollisions.lastIndex(); + + // update UDMcParticles + auto mcPartsSlice = mcparts.sliceBy(mcPartsPerMcCollision, mccolId); + updateUDMcParticles(mcPartsSlice, mcColIsSaved[mccolId], mcPartIsSaved); + } + } + } + + void init(InitContext& context) + { + // add histograms for the different process functions + if (context.mOptions.get("processMC")) { + registry.add("mcTruth/collisions", "Number of associated collisions", {HistType::kTH1F, {{11, -0.5, 10.5}}}); + registry.add("mcTruth/collType", "Collision type", {HistType::kTH1F, {{5, -0.5, 4.5}}}); + registry.add("mcTruth/IVMpt", "Invariant mass versus p_{T}", {HistType::kTH2F, {{150, 0.0, 3.0}, {150, 0.0, 3.0}}}); + } + } + + // process function for MC data + // save the MC truth of all events of interest and of the DG events + void processMC(aod::McCollisions const& mccols, aod::McParticles const& mcparts, + UDCCs const& sgcands, UDTCs const& udtracks, + CCs const& /*collisions*/, BCs const& /*bcs*/, TCs const& /*tracks*/) + { + if (verboseInfoMC) { + LOGF(info, "Number of McCollisions %d", mccols.size()); + LOGF(info, "Number of SG candidates %d", sgcands.size()); + LOGF(info, "Number of UD tracks %d", udtracks.size()); + } + if (mccols.size() > 0) { + if (sgcands.size() > 0) { + procWithSgCand(mccols, mcparts, sgcands, udtracks); + } else { + if (saveAllMcCollisions) { + procWithoutSgCand(mccols, mcparts); + } + } + } + } PROCESS_SWITCH(McSGCandProducer, processMC, "Produce MC tables", false); + void processDummy(aod::Collisions const& /*collisions*/) { // do nothing From 063ecb496d48e3d245a89f3f74c1c57d8a78247f Mon Sep 17 00:00:00 2001 From: Anantha Padmanabhan M Nair <82643666+ananthapadmanabhan18@users.noreply.github.com> Date: Sat, 8 Mar 2025 03:14:41 +0530 Subject: [PATCH 0606/1650] [PWGUD] Added few more tables (#10396) --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 152 +++++++++++++++++++++--------- 1 file changed, 109 insertions(+), 43 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index bda827daccb..1803b07a81a 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -41,50 +41,72 @@ using namespace o2::framework::expressions; namespace o2::aod { -namespace zero_charge_events +namespace branch { - DECLARE_SOA_COLUMN(Dcaxy, dcaxy, std::vector); DECLARE_SOA_COLUMN(Dcaz, dcaz, std::vector); - DECLARE_SOA_COLUMN(PionPt, pionPt, std::vector); DECLARE_SOA_COLUMN(PionEta, pionEta, std::vector); DECLARE_SOA_COLUMN(PionRapidity, pionRapidity, std::vector); - DECLARE_SOA_COLUMN(FourPionPt, fourPionPt, double); DECLARE_SOA_COLUMN(FourPionEta, fourPionEta, double); DECLARE_SOA_COLUMN(FourPionRapidity, fourPionRapidity, double); DECLARE_SOA_COLUMN(FourPionMass, fourPionMass, double); - DECLARE_SOA_COLUMN(FourPionPhiPair1, fourPionPhiPair1, double); DECLARE_SOA_COLUMN(FourPionPhiPair2, fourPionPhiPair2, double); DECLARE_SOA_COLUMN(FourPionCosThetaPair1, fourPionCosThetaPair1, double); DECLARE_SOA_COLUMN(FourPionCosThetaPair2, fourPionCosThetaPair2, double); -} // namespace zero_charge_events -DECLARE_SOA_TABLE(TREE, "AOD", "Tree", - - zero_charge_events::Dcaxy, - zero_charge_events::Dcaz, - - zero_charge_events::PionPt, - zero_charge_events::PionEta, - zero_charge_events::PionRapidity, - - zero_charge_events::FourPionPt, - zero_charge_events::FourPionEta, - zero_charge_events::FourPionRapidity, - zero_charge_events::FourPionMass, - - zero_charge_events::FourPionPhiPair1, - zero_charge_events::FourPionPhiPair2, - zero_charge_events::FourPionCosThetaPair1, - zero_charge_events::FourPionCosThetaPair2); +} // namespace branch +DECLARE_SOA_TABLE(UDTree, "AOD", "UD0Charge", + branch::Dcaxy, + branch::Dcaz, + branch::PionPt, + branch::PionEta, + branch::PionRapidity, + branch::FourPionPt, + branch::FourPionEta, + branch::FourPionRapidity, + branch::FourPionMass, + branch::FourPionPhiPair1, + branch::FourPionPhiPair2, + branch::FourPionCosThetaPair1, + branch::FourPionCosThetaPair2); + +DECLARE_SOA_TABLE(MCTree, "AOD", "MC0Charge", + branch::PionPt, + branch::PionEta, + branch::PionRapidity, + branch::FourPionPt, + branch::FourPionEta, + branch::FourPionRapidity, + branch::FourPionMass, + branch::FourPionPhiPair1, + branch::FourPionPhiPair2, + branch::FourPionCosThetaPair1, + branch::FourPionCosThetaPair2); + +DECLARE_SOA_TABLE(MCUDTree, "AOD", "UDMC0Charge", + branch::Dcaxy, + branch::Dcaz, + branch::PionPt, + branch::PionEta, + branch::PionRapidity, + branch::FourPionPt, + branch::FourPionEta, + branch::FourPionRapidity, + branch::FourPionMass, + branch::FourPionPhiPair1, + branch::FourPionPhiPair2, + branch::FourPionCosThetaPair1, + branch::FourPionCosThetaPair2); } // namespace o2::aod ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct SGSelector sgSelector; - Produces zeroChargeEvents; + Produces zeroChargeEventsData; + Produces zeroChargeEventsMCgen; + Produces zeroChargeEventsMCreco; HistogramRegistry histosData{"histosData", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry histosMCgen{"histosMCgen", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; @@ -96,7 +118,7 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct Configurable ft0cCut{"ft0cCut", 50., "FT0C threshold"}; Configurable fddaCut{"fddaCut", 10000., "FDDA threshold"}; Configurable fddcCut{"fddcCut", 10000., "FDDC threshold"}; - Configurable zdcCut{"zdcCut", 10., "ZDC threshold"}; + Configurable zdcCut{"zdcCut", 1., "ZDC threshold"}; Configurable pvCut{"pvCut", 1.0, "Use Only PV tracks"}; Configurable dcaZcut{"dcaZcut", 2, "dcaZ cut"}; @@ -625,7 +647,7 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct fourPiCosThetaPair1 = cosThetaCollinsSoperFrame(k13, k24, k1234); fourPiCosThetaPair2 = cosThetaCollinsSoperFrame(k14, k23, k1234); - zeroChargeEvents( + zeroChargeEventsData( pidcaXY, pidcaZ, piPt, piEta, piRapidity, p1234.Pt(), p1234.Eta(), p1234.Rapidity(), p1234.M(), @@ -704,6 +726,10 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct TLorentzVector motherVector, tempVector, p1, p2, p3, p4; TLorentzVector p1234; + std::vector piPt; + std::vector piEta; + std::vector piRapidity; + bool flag = false; for (const auto& particle : mcParts) { @@ -712,30 +738,31 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct if (!particle.has_mothers()) { continue; } - for (const auto& mother : particle.mothers_as()) { - // LOGF(info, "Mother ID: %d", mother.pdgCode()); + for (const auto& mother : particle.mothers_as()) { if (mother.pdgCode() == 30113) { motherVector.SetXYZM(mother.px(), mother.py(), mother.pz(), o2::constants::physics::MassPionCharged); histosMCgen.fill(HIST("MCgen_rhoPrime_pT"), motherVector.Pt()); + if (flag == false) { histosMCgen.fill(HIST("rhoPrimeCounts"), 5); } flag = true; - if (particle.pdgCode() == 211) { histosMCgen.fill(HIST("MCgen_particle_pT"), tempVector.Pt()); histosMCgen.fill(HIST("MCgen_particle_rapidity"), tempVector.Rapidity()); - if (std::abs(tempVector.Eta()) < 0.9) { - piPlusvectors.push_back(tempVector); - } + piPlusvectors.push_back(tempVector); + piPt.push_back(tempVector.Pt()); + piEta.push_back(tempVector.Eta()); + piRapidity.push_back(tempVector.Rapidity()); } if (particle.pdgCode() == -211) { histosMCgen.fill(HIST("MCgen_particle_pT"), tempVector.Pt()); histosMCgen.fill(HIST("MCgen_particle_rapidity"), tempVector.Rapidity()); - if (std::abs(tempVector.Eta()) < 0.9) { - piMinusvectors.push_back(tempVector); - } + piMinusvectors.push_back(tempVector); + piPt.push_back(tempVector.Pt()); + piEta.push_back(tempVector.Eta()); + piRapidity.push_back(tempVector.Rapidity()); } } // End of Mother ID 30113 rho prime } // End of loop over mothers @@ -792,6 +819,10 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosMCgen.fill(HIST("MCgen_phi_cosTheta_pair_1"), phiPair1, cosThetaPair1); histosMCgen.fill(HIST("MCgen_phi_cosTheta_pair_2"), phiPair2, cosThetaPair2); + zeroChargeEventsMCgen(piPt, piEta, piRapidity, + p1234.Pt(), p1234.Eta(), p1234.Rapidity(), p1234.M(), + phiPair1, phiPair2, cosThetaPair1, cosThetaPair2); + } // End of 4 Pion MC Generation Process function PROCESS_SWITCH(exclusiveRhoTo4Pi, processMCgen, "The Process for 4 Pion Analysis from MC Generation", false); @@ -828,9 +859,7 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosMCreco.fill(HIST("FT0A"), collision.totalFT0AmplitudeA()); histosMCreco.fill(HIST("FT0C"), collision.totalFT0AmplitudeC()); histosMCreco.fill(HIST("ZDC_A"), collision.energyCommonZNA()); - LOGF(info, "ZDC_A: %f", collision.energyCommonZNA()); histosMCreco.fill(HIST("ZDC_C"), collision.energyCommonZNC()); - LOGF(info, "ZDC_C: %f", collision.energyCommonZNC()); if (strictEventSelection) { if (collision.numContrib() != 4) { @@ -964,6 +993,48 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct k23 = k2 + k3; k24 = k2 + k4; + auto phiPair1 = phiCollinsSoperFrame(k13, k24, k1234); + auto phiPair2 = phiCollinsSoperFrame(k14, k23, k1234); + auto cosThetaPair1 = cosThetaCollinsSoperFrame(k13, k24, k1234); + auto cosThetaPair2 = cosThetaCollinsSoperFrame(k14, k23, k1234); + + std::vector dcaxy; + std::vector dcaz; + + std::vector piPt; + std::vector piEta; + std::vector piRapidity; + + dcaxy.push_back(Pi_plus_tracks[0].dcaXY()); + dcaxy.push_back(Pi_plus_tracks[1].dcaXY()); + dcaxy.push_back(Pi_minus_tracks[0].dcaXY()); + dcaxy.push_back(Pi_minus_tracks[1].dcaXY()); + + dcaz.push_back(Pi_plus_tracks[0].dcaZ()); + dcaz.push_back(Pi_plus_tracks[1].dcaZ()); + dcaz.push_back(Pi_minus_tracks[0].dcaZ()); + dcaz.push_back(Pi_minus_tracks[1].dcaZ()); + + piPt.push_back(p1.Pt()); + piPt.push_back(p2.Pt()); + piPt.push_back(p3.Pt()); + piPt.push_back(p4.Pt()); + + piEta.push_back(p1.Eta()); + piEta.push_back(p2.Eta()); + piEta.push_back(p3.Eta()); + piEta.push_back(p4.Eta()); + + piRapidity.push_back(p1.Rapidity()); + piRapidity.push_back(p2.Rapidity()); + piRapidity.push_back(p3.Rapidity()); + piRapidity.push_back(p4.Rapidity()); + + zeroChargeEventsMCreco(dcaxy, dcaz, + piPt, piEta, piRapidity, + p1234.Pt(), p1234.Eta(), p1234.Rapidity(), p1234.M(), + phiPair1, phiPair2, cosThetaPair1, cosThetaPair2); + if (std::fabs(p1234.Rapidity()) < 0.5) { histosMCreco.fill(HIST("pT_event_0charge_WTS_PID_Pi"), p1234.Pt()); if (p1234.Pt() < 0.15) { @@ -975,11 +1046,6 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosMCreco.fill(HIST("invMass_pair_3"), (p2 + p3).M()); histosMCreco.fill(HIST("invMass_pair_4"), (p2 + p4).M()); - auto phiPair1 = phiCollinsSoperFrame(k13, k24, k1234); - auto phiPair2 = phiCollinsSoperFrame(k14, k23, k1234); - auto cosThetaPair1 = cosThetaCollinsSoperFrame(k13, k24, k1234); - auto cosThetaPair2 = cosThetaCollinsSoperFrame(k14, k23, k1234); - histosMCreco.fill(HIST("CS_phi_pair_1"), phiPair1); histosMCreco.fill(HIST("CS_phi_pair_2"), phiPair2); histosMCreco.fill(HIST("CS_costheta_pair_1"), cosThetaPair1); From 6df49b0b8f2116192edae8ccf740b18482751cf1 Mon Sep 17 00:00:00 2001 From: Victor Gonzalez Date: Fri, 7 Mar 2025 22:49:44 +0100 Subject: [PATCH 0607/1650] [PWGCF] DptDpt - Fall back to TPC+TOF tracks (#10400) Co-authored-by: Victor --- PWGCF/TableProducer/dptdptfilter.h | 127 ++++++++++++++++++++++------- 1 file changed, 96 insertions(+), 31 deletions(-) diff --git a/PWGCF/TableProducer/dptdptfilter.h b/PWGCF/TableProducer/dptdptfilter.h index d6f7254944b..e83587208a1 100644 --- a/PWGCF/TableProducer/dptdptfilter.h +++ b/PWGCF/TableProducer/dptdptfilter.h @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -223,9 +224,9 @@ static constexpr o2::aod::track::TrackSelectionFlags::flagtype TrackSelectionDCA o2::aod::track::TrackSelectionFlags::kDCAz | o2::aod::track::TrackSelectionFlags::kDCAxy; int tracktype = 1; -std::function maxDcaZPtDep{}; // max dca in z axis as function of pT - -std::vector trackFilters = {}; +std::vector trackFilters = {}; // the vector of track selectors +std::vector> maxDcaZPtDeps = {}; // max dca in z axis as function of pT for each track selector +TrackSelection* extraTrackFilter = nullptr; bool dca2Dcut = false; float sharedTpcClusters = 1.0; ///< max fraction of shared TPC clusters float maxDCAz = 1e6f; @@ -256,6 +257,18 @@ inline TList* getCCDBInput(auto& ccdb, const char* ccdbpath, const char* ccdbdat inline void initializeTrackSelection(TrackSelectionTuneCfg& tune) { + auto addTrackFilter = [](auto filter, std::function dcaZCutFunc = {}) { + trackFilters.push_back(filter); + maxDcaZPtDeps.push_back(dcaZCutFunc); + }; + auto highQualityTpcTrack = []() { + TrackSelection* tpcTrack = new TrackSelection(getGlobalTrackSelection()); + tpcTrack->ResetITSRequirements(); + tpcTrack->SetRequireITSRefit(false); + tpcTrack->SetMinNClustersTPC(120); + sharedTpcClusters = 0.2; + return tpcTrack; + }; switch (tracktype) { case 1: { /* Run2 global track */ TrackSelection* globalRun2 = new TrackSelection(getGlobalTrackSelection()); @@ -264,8 +277,8 @@ inline void initializeTrackSelection(TrackSelectionTuneCfg& tune) TrackSelection* globalSDDRun2 = new TrackSelection(getGlobalTrackSelectionSDD()); globalSDDRun2->SetTrackType(o2::aod::track::Run2Track); // Run 2 track asked by default globalSDDRun2->SetMaxChi2PerClusterTPC(2.5f); - trackFilters.push_back(globalRun2); - trackFilters.push_back(globalSDDRun2); + addTrackFilter(globalRun2); + addTrackFilter(globalSDDRun2); } break; case 3: { /* Run3 track */ TrackSelection* globalRun3 = new TrackSelection(getGlobalTrackSelection()); @@ -277,8 +290,8 @@ inline void initializeTrackSelection(TrackSelectionTuneCfg& tune) globalSDDRun3->ResetITSRequirements(); globalSDDRun3->SetRequireNoHitsInITSLayers({0, 1, 2}); globalSDDRun3->SetRequireHitsInITSLayers(1, {3}); - trackFilters.push_back(globalRun3); - trackFilters.push_back(globalSDDRun3); + addTrackFilter(globalRun3); + addTrackFilter(globalSDDRun3); } break; case 5: { /* Run2 TPC only track */ TrackSelection* tpcOnly = new TrackSelection; @@ -290,7 +303,7 @@ inline void initializeTrackSelection(TrackSelectionTuneCfg& tune) tpcOnly->SetMaxDcaXY(2.4f); maxDCAxy = 2.4; dca2Dcut = true; - trackFilters.push_back(tpcOnly); + addTrackFilter(tpcOnly); } break; case 7: { /* Run3 TPC only track */ TrackSelection* tpcOnly = new TrackSelection; @@ -302,47 +315,72 @@ inline void initializeTrackSelection(TrackSelectionTuneCfg& tune) tpcOnly->SetMaxDcaXY(2.4f); maxDCAxy = 2.4; dca2Dcut = true; - trackFilters.push_back(tpcOnly); + addTrackFilter(tpcOnly); + } break; + case 10: { /* Run3 track primary vertex contributor */ + TrackSelection* globalRun3 = new TrackSelection(getGlobalTrackSelection()); + globalRun3->SetTrackType(o2::aod::track::TrackTypeEnum::Track); + globalRun3->ResetITSRequirements(); + globalRun3->SetRequireHitsInITSLayers(1, {0, 1, 2}); + TrackSelection* globalSDDRun3 = new TrackSelection(getGlobalTrackSelection()); + globalSDDRun3->SetTrackType(o2::aod::track::TrackTypeEnum::Track); + globalSDDRun3->ResetITSRequirements(); + globalSDDRun3->SetRequireNoHitsInITSLayers({0, 1, 2}); + globalSDDRun3->SetRequireHitsInITSLayers(1, {3}); + addTrackFilter(globalRun3); + addTrackFilter(globalSDDRun3); } break; case 30: { /* Run 3 default global track: kAny on 3 IB layers of ITS */ - trackFilters.push_back(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibAny, TrackSelection::GlobalTrackRun3DCAxyCut::Default))); + addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibAny, TrackSelection::GlobalTrackRun3DCAxyCut::Default))); } break; case 31: { /* Run 3 global track: kTwo on 3 IB layers of ITS */ - trackFilters.push_back(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibTwo, TrackSelection::GlobalTrackRun3DCAxyCut::Default))); + addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibTwo, TrackSelection::GlobalTrackRun3DCAxyCut::Default))); } break; case 32: { /* Run 3 global track: kAny on all 7 layers of ITS */ - trackFilters.push_back(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSallAny, TrackSelection::GlobalTrackRun3DCAxyCut::Default))); + addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSallAny, TrackSelection::GlobalTrackRun3DCAxyCut::Default))); } break; case 33: { /* Run 3 global track: kAll on all 7 layers of ITS */ - trackFilters.push_back(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSall7Layers, TrackSelection::GlobalTrackRun3DCAxyCut::Default))); + addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSall7Layers, TrackSelection::GlobalTrackRun3DCAxyCut::Default))); } break; case 40: { /* Run 3 global track: kAny on 3 IB layers of ITS, tighter DCAxy */ - trackFilters.push_back(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3))); + addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3))); } break; case 41: { /* Run 3 global track: kTwo on 3 IB layers of ITS, tighter DCAxy */ - trackFilters.push_back(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibTwo, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3))); + addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibTwo, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3))); } break; case 42: { /* Run 3 global track: kAny on all 7 layers of ITS, tighter DCAxy */ - trackFilters.push_back(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSallAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3))); + addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSallAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3))); } break; case 43: { /* Run 3 global track: kAll on all 7 layers of ITS, tighter DCAxy */ - trackFilters.push_back(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSall7Layers, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3))); + addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSall7Layers, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3))); } break; case 50: { /* Run 3 global track: kAny on 3 IB layers of ITS, tighter DCAxy, tighter pT dep DCAz */ - trackFilters.push_back(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3))); - maxDcaZPtDep = [](float pt) { return 0.004f + 0.013f / pt; }; + addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }); } break; case 51: { /* Run 3 global track: kTwo on 3 IB layers of ITS, tighter DCAxy, tighter pT dep DCAz */ - trackFilters.push_back(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibTwo, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3))); - maxDcaZPtDep = [](float pt) { return 0.004f + 0.013f / pt; }; + addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibTwo, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }); } break; case 52: { /* Run 3 global track: kAny on all 7 layers of ITS, tighter DCAxy, tighter pT dep DCAz */ - trackFilters.push_back(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSallAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3))); - maxDcaZPtDep = [](float pt) { return 0.004f + 0.013f / pt; }; + addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSallAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }); } break; case 53: { /* Run 3 global track: kAll on all 7 layers of ITS, tighter DCAxy, tighter pT dep DCAz */ - trackFilters.push_back(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSall7Layers, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3))); - maxDcaZPtDep = [](float pt) { return 0.004f + 0.013f / pt; }; + addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSall7Layers, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }); + } break; + case 60: { /* Run 3 global track: kAny on 3 IB layers of ITS, tighter DCAxy, tighter pT dep DCAz, plus TPC+TOF only tracks */ + addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }); + extraTrackFilter = highQualityTpcTrack(); + } break; + case 61: { /* Run 3 global track: kTwo on 3 IB layers of ITS, tighter DCAxy, tighter pT dep DCAz, plus TPC+TOF only tracks */ + addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibTwo, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }); + extraTrackFilter = highQualityTpcTrack(); + } break; + case 62: { /* Run 3 global track: kAny on all 7 layers of ITS, tighter DCAxy, tighter pT dep DCAz, plus TPC+TOF only tracks */ + addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSallAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }); + extraTrackFilter = highQualityTpcTrack(); + } break; + case 63: { /* Run 3 global track: kAll on all 7 layers of ITS, tighter DCAxy, tighter pT dep DCAz, plus TPC+TOF only tracks */ + addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSall7Layers, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }); + extraTrackFilter = highQualityTpcTrack(); } break; default: break; @@ -368,7 +406,9 @@ inline void initializeTrackSelection(TrackSelectionTuneCfg& tune) } } if (tune.mUseDCAz) { - maxDcaZPtDep = [&tune](float) { return tune.mDCAz; }; + for (auto dcaZCut : maxDcaZPtDeps) { // o2-linter: disable=const-ref-in-for-loop + dcaZCut = [&tune](float) { return tune.mDCAz; }; + } } if (tune.mUseFractionTpcSharedClusters) { sharedTpcClusters = tune.mFractionTpcSharedClusters; @@ -1154,7 +1194,7 @@ struct TpcExcludeTrack { { method = kNOEXCLUSION; } - explicit TpcExcludeTrack(TpcExclusionMethod m) + explicit TpcExcludeTrack(TpcExclusionMethod m) // o2-linter: disable=name/function-variable { switch (m) { case kNOEXCLUSION: @@ -1252,9 +1292,11 @@ inline bool matchTrackType(TrackObject const& track) (!track.hasTPC() || ((track.trackCutFlag() & TrackSelectionTPC) == TrackSelectionTPC)) && ((track.trackCutFlag() & TrackSelectionDCA) == TrackSelectionDCA); } else { - for (auto const& filter : trackFilters) { + for (size_t i = 0; i < trackFilters.size(); ++i) { + auto const& filter = trackFilters[i]; + auto const& maxDcaZPtDep = maxDcaZPtDeps[i]; if (filter->IsSelected(track)) { - /* additional track cuts if needed */ + /* additional more stringent track cuts if needed */ auto checkDca2Dcut = [&](auto const& track) { if (dca2Dcut) { if (track.dcaXY() * track.dcaXY() / maxDCAxy / maxDCAxy + track.dcaZ() * track.dcaZ() / maxDCAz / maxDCAz > 1) { @@ -1276,16 +1318,39 @@ inline bool matchTrackType(TrackObject const& track) } /* 2D DCA xy-o-z cut */ if (!checkDca2Dcut(track)) { - return false; + continue; } + /* shared fraction of TPC clusters */ + if (!(track.tpcFractionSharedCls() < sharedTpcClusters)) { + continue; + } + /* primary vertex contributor */ + if (tracktype == 10) { + if (!track.isPVContributor()) { + continue; + } + } + return true; + } + } + /* check extra less stringent selections */ + if (extraTrackFilter != nullptr) { + if (extraTrackFilter->IsSelected(track)) { /* shared fraction of TPC clusters */ if (!(track.tpcFractionSharedCls() < sharedTpcClusters)) { return false; } + /* we require TOF */ + if (!(track.hasTOF())) { + return false; + } return true; + } else { + return false; } + } else { + return false; } - return false; } } From 4e8eff3e6ff95906e17ba2701581606f981ec8b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Karpi=C5=84ski?= <40724893+davkk@users.noreply.github.com> Date: Sat, 8 Mar 2025 07:34:39 +0100 Subject: [PATCH 0608/1650] [PWGCF/FemtoUniverse] Properly filter by PDG and charge in `track-track-extended` task (#10401) --- ...emtoUniversePairTaskTrackTrackExtended.cxx | 51 ++++++++++++++++--- 1 file changed, 43 insertions(+), 8 deletions(-) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackExtended.cxx index b4dad165507..af908d13829 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackExtended.cxx @@ -16,6 +16,7 @@ /// \author Anton Riedel, TU München, anton.riedel@tum.de /// \author Zuzanna Chochulska, WUT Warsaw & CTU Prague, zchochul@cern.ch +#include #include #include @@ -53,6 +54,8 @@ static const float cutsTable[NPart][NCuts]{ } // namespace struct FemtoUniversePairTaskTrackTrackExtended { + Service pdgMC; + /// Particle selection part /// Table for both particles @@ -97,7 +100,6 @@ struct FemtoUniversePairTaskTrackTrackExtended { Partition> partsOneMCTruth = aod::femtouniverseparticle::partType == static_cast(aod::femtouniverseparticle::ParticleType::kMCTruthTrack) && - aod::femtouniverseparticle::pidCut == static_cast(trackonefilter.confPDGCodePartOne) && aod::femtouniverseparticle::pt < trackonefilter.confPtHighPart1 && aod::femtouniverseparticle::pt > trackonefilter.confPtLowPart1; @@ -122,7 +124,6 @@ struct FemtoUniversePairTaskTrackTrackExtended { Partition> partsTwoMCTruth = aod::femtouniverseparticle::partType == static_cast(aod::femtouniverseparticle::ParticleType::kMCTruthTrack) && - aod::femtouniverseparticle::pidCut == static_cast(tracktwofilter.confPDGCodePartTwo) && aod::femtouniverseparticle::pt < tracktwofilter.confPtHighPart2 && aod::femtouniverseparticle::pt > tracktwofilter.confPtLowPart2; @@ -313,6 +314,12 @@ struct FemtoUniversePairTaskTrackTrackExtended { return false; } + /// @returns 1 if positive, -1 if negative, 0 if zero + auto sign(auto number) -> int8_t + { + return (number > 0) - (number < 0); + } + void init(InitContext&) { if (twotracksconfigs.confIsMC) { @@ -353,6 +360,38 @@ struct FemtoUniversePairTaskTrackTrackExtended { eventHisto.fillQA(col); } + template + requires isOneOrTwo + auto doMCTruth(FemtoUniverseParticleHisto hist, auto parts) -> void + { + auto expectedPDG = 0; + auto expectedCharge = 0.0l; + + if constexpr (N == ParticleNo::ONE) { + expectedPDG = trackonefilter.confPDGCodePartOne; + expectedCharge = trackonefilter.confChargePart1; + } else if constexpr (N == ParticleNo::TWO) { + expectedPDG = tracktwofilter.confPDGCodePartTwo; + expectedCharge = tracktwofilter.confChargePart2; + } + + for (const auto& particle : parts) { + auto pdgCode = static_cast(particle.pidCut()); + if (pdgCode != expectedPDG) { + continue; + } + + const auto& pdgParticle = pdgMC->GetParticle(pdgCode); + if (!pdgParticle) { + continue; + } + + if (sign(pdgParticle->Charge()) == sign(expectedCharge)) { + hist.template fillQA(particle); + } + } + } + /// This function processes the same event and takes care of all the histogramming /// \todo the trivial loops over the tracks should be factored out since they will be common to all combinations of T-T, T-V0, V0-V0, ... /// @tparam PartitionType @@ -563,15 +602,11 @@ struct FemtoUniversePairTaskTrackTrackExtended { fillCollision(col); auto groupMCTruth1 = partsOneMCTruth->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - for (const auto& particle : groupMCTruth1) { - hMCTruth1.fillQA(particle); - } + doMCTruth<1>(hMCTruth1, groupMCTruth1); if (!confIsSame) { auto groupMCTruth2 = partsTwoMCTruth->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - for (const auto& particle : groupMCTruth1) { - hMCTruth2.fillQA(particle); - } + doMCTruth<2>(hMCTruth2, groupMCTruth2); } auto groupMCReco1 = partsOneMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); From cbc0ae1eed668cf2e4c6b4baf62f62f92231f1db Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Sat, 8 Mar 2025 17:34:05 +0900 Subject: [PATCH 0609/1650] [PWGEM/PhotonMeson] update for TPC shared cluster cut (#10390) --- PWGEM/PhotonMeson/Core/DalitzEECut.cxx | 5 +++++ PWGEM/PhotonMeson/Core/DalitzEECut.h | 9 +++++++++ PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h | 11 +++++++++-- PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h | 11 +++++++++-- PWGEM/PhotonMeson/DataModel/gammaTables.h | 3 ++- .../skimmerPrimaryElectronFromDalitzEE.cxx | 2 +- PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx | 13 +++++++++---- PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx | 13 +++++++++---- 8 files changed, 53 insertions(+), 14 deletions(-) diff --git a/PWGEM/PhotonMeson/Core/DalitzEECut.cxx b/PWGEM/PhotonMeson/Core/DalitzEECut.cxx index c5a42fdad4f..6dd58b4a560 100644 --- a/PWGEM/PhotonMeson/Core/DalitzEECut.cxx +++ b/PWGEM/PhotonMeson/Core/DalitzEECut.cxx @@ -81,6 +81,11 @@ void DalitzEECut::SetMinNCrossedRowsOverFindableClustersTPC(float minNCrossedRow mMinNCrossedRowsOverFindableClustersTPC = minNCrossedRowsOverFindableClustersTPC; LOG(info) << "DalitzEE Cut, set min N crossed rows over findable clusters TPC: " << mMinNCrossedRowsOverFindableClustersTPC; } +void DalitzEECut::SetMaxFracSharedClustersTPC(float max) +{ + mMaxFracSharedClustersTPC = max; + LOG(info) << "Dalitz EE Cut, set max fraction of shared clusters in TPC: " << mMaxFracSharedClustersTPC; +} void DalitzEECut::SetChi2PerClusterTPC(float min, float max) { mMinChi2PerClusterTPC = min; diff --git a/PWGEM/PhotonMeson/Core/DalitzEECut.h b/PWGEM/PhotonMeson/Core/DalitzEECut.h index 13851adc298..a757ca58fda 100644 --- a/PWGEM/PhotonMeson/Core/DalitzEECut.h +++ b/PWGEM/PhotonMeson/Core/DalitzEECut.h @@ -53,6 +53,7 @@ class DalitzEECut : public TNamed kTPCNCls, kTPCCrossedRows, kTPCCrossedRowsOverNCls, + kTPCFracSharedClusters, kTPCChi2NDF, kTPCNsigmaEl, kTPCNsigmaPi, @@ -166,6 +167,9 @@ class DalitzEECut : public TNamed if (!IsSelectedTrack(track, DalitzEECuts::kTPCCrossedRowsOverNCls)) { return false; } + if (!IsSelectedTrack(track, DalitzEECuts::kTPCFracSharedClusters)) { + return false; + } if (!IsSelectedTrack(track, DalitzEECuts::kTPCChi2NDF)) { return false; } @@ -232,6 +236,9 @@ class DalitzEECut : public TNamed case DalitzEECuts::kTPCCrossedRowsOverNCls: return track.tpcCrossedRowsOverFindableCls() >= mMinNCrossedRowsOverFindableClustersTPC; + case DalitzEECuts::kTPCFracSharedClusters: + return track.tpcFractionSharedCls() <= mMaxFracSharedClustersTPC; + case DalitzEECuts::kTPCChi2NDF: return mMinChi2PerClusterTPC < track.tpcChi2NCl() && track.tpcChi2NCl() < mMaxChi2PerClusterTPC; @@ -267,6 +274,7 @@ class DalitzEECut : public TNamed void SetMinNClustersTPC(int minNClustersTPC); void SetMinNCrossedRowsTPC(int minNCrossedRowsTPC); void SetMinNCrossedRowsOverFindableClustersTPC(float minNCrossedRowsOverFindableClustersTPC); + void SetMaxFracSharedClustersTPC(float max); void SetChi2PerClusterTPC(float min, float max); void SetNClustersITS(int min, int max); void SetChi2PerClusterITS(float min, float max); @@ -309,6 +317,7 @@ class DalitzEECut : public TNamed int mMinNCrossedRowsTPC{0}; // min number of crossed rows in TPC float mMinChi2PerClusterTPC{-1e10f}, mMaxChi2PerClusterTPC{1e10f}; // max tpc fit chi2 per TPC cluster float mMinNCrossedRowsOverFindableClustersTPC{0.f}; // min ratio crossed rows / findable clusters + float mMaxFracSharedClustersTPC{999.f}; // max ratio shared clusters / clusters in TPC int mMinNClustersITS{0}, mMaxNClustersITS{7}; // range in number of ITS clusters float mMinChi2PerClusterITS{-1e10f}, mMaxChi2PerClusterITS{1e10f}; // max its fit chi2 per ITS cluster float mMaxPinMuonTPConly{0.2f}; // max pin cut for muon ID with TPConly diff --git a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h index 11ea121ccfa..9b891be3fbf 100644 --- a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h +++ b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h @@ -148,6 +148,7 @@ struct Pi0EtaToGammaGamma { Configurable cfg_min_ncluster_tpc{"cfg_min_ncluster_tpc", 10, "min ncluster tpc"}; Configurable cfg_min_ncrossedrows{"cfg_min_ncrossedrows", 40, "min ncrossed rows"}; + Configurable cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 999.f, "max fraction of shared clusters in TPC"}; Configurable cfg_max_chi2tpc{"cfg_max_chi2tpc", 4.0, "max chi2/NclsTPC"}; Configurable cfg_max_chi2its{"cfg_max_chi2its", 5.0, "max chi2/NclsITS"}; Configurable cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -3.0, "min. TPC n sigma for electron"}; @@ -176,13 +177,16 @@ struct Pi0EtaToGammaGamma { Configurable cfg_max_chi2its{"cfg_max_chi2its", 5.0, "max chi2/NclsITS"}; Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 0.05, "max dca XY for single track in cm"}; Configurable cfg_max_dcaz{"cfg_max_dcaz", 0.05, "max dca Z for single track in cm"}; + Configurable cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 999.f, "max fraction of shared clusters in TPC"}; Configurable cfg_apply_cuts_from_prefilter_derived{"cfg_apply_cuts_from_prefilter_derived", false, "flag to apply prefilter to electron"}; Configurable cfg_pid_scheme{"cfg_pid_scheme", static_cast(DalitzEECut::PIDSchemes::kTOFif), "pid scheme [kTOFif : 0, kTPConly : 1]"}; Configurable cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -2.0, "min. TPC n sigma for electron inclusion"}; Configurable cfg_max_TPCNsigmaEl{"cfg_max_TPCNsigmaEl", +3.0, "max. TPC n sigma for electron inclusion"}; - Configurable cfg_min_TPCNsigmaPi{"cfg_min_TPCNsigmaPi", -3.0, "min. TPC n sigma for pion exclusion"}; - Configurable cfg_max_TPCNsigmaPi{"cfg_max_TPCNsigmaPi", +3.0, "max. TPC n sigma for pion exclusion"}; + Configurable cfg_min_TPCNsigmaPi{"cfg_min_TPCNsigmaPi", -0.0, "min. TPC n sigma for pion exclusion"}; + Configurable cfg_max_TPCNsigmaPi{"cfg_max_TPCNsigmaPi", +0.0, "max. TPC n sigma for pion exclusion"}; + Configurable cfg_min_TOFNsigmaEl{"cfg_min_TOFNsigmaEl", -3.0, "min. TOF n sigma for electron inclusion"}; + Configurable cfg_max_TOFNsigmaEl{"cfg_max_TOFNsigmaEl", +3.0, "max. TOF n sigma for electron inclusion"}; } dileptoncuts; EMCPhotonCut fEMCCut; @@ -355,6 +359,7 @@ struct Pi0EtaToGammaGamma { fV0PhotonCut.SetMinNClustersTPC(pcmcuts.cfg_min_ncluster_tpc); fV0PhotonCut.SetMinNCrossedRowsTPC(pcmcuts.cfg_min_ncrossedrows); fV0PhotonCut.SetMinNCrossedRowsOverFindableClustersTPC(0.8); + fV0PhotonCut.SetMaxFracSharedClustersTPC(pcmcuts.cfg_max_frac_shared_clusters_tpc); fV0PhotonCut.SetChi2PerClusterTPC(0.0, pcmcuts.cfg_max_chi2tpc); fV0PhotonCut.SetTPCNsigmaElRange(pcmcuts.cfg_min_TPCNsigmaEl, pcmcuts.cfg_max_TPCNsigmaEl); fV0PhotonCut.SetChi2PerClusterITS(-1e+10, pcmcuts.cfg_max_chi2its); @@ -385,6 +390,7 @@ struct Pi0EtaToGammaGamma { fDileptonCut.SetMinNClustersTPC(dileptoncuts.cfg_min_ncluster_tpc); fDileptonCut.SetMinNCrossedRowsTPC(dileptoncuts.cfg_min_ncrossedrows); fDileptonCut.SetMinNCrossedRowsOverFindableClustersTPC(0.8); + fDileptonCut.SetMaxFracSharedClustersTPC(dileptoncuts.cfg_max_frac_shared_clusters_tpc); fDileptonCut.SetChi2PerClusterTPC(0.0, dileptoncuts.cfg_max_chi2tpc); fDileptonCut.SetChi2PerClusterITS(0.0, dileptoncuts.cfg_max_chi2its); fDileptonCut.SetNClustersITS(dileptoncuts.cfg_min_ncluster_its, 7); @@ -395,6 +401,7 @@ struct Pi0EtaToGammaGamma { fDileptonCut.SetPIDScheme(dileptoncuts.cfg_pid_scheme); fDileptonCut.SetTPCNsigmaElRange(dileptoncuts.cfg_min_TPCNsigmaEl, dileptoncuts.cfg_max_TPCNsigmaEl); fDileptonCut.SetTPCNsigmaPiRange(dileptoncuts.cfg_min_TPCNsigmaPi, dileptoncuts.cfg_max_TPCNsigmaPi); + fDileptonCut.SetTOFNsigmaElRange(dileptoncuts.cfg_min_TOFNsigmaEl, dileptoncuts.cfg_max_TOFNsigmaEl); } void DefineEMCCut() diff --git a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h index 4b71ae8265f..f9578ce6f14 100644 --- a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h +++ b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h @@ -138,6 +138,7 @@ struct Pi0EtaToGammaGammaMC { Configurable cfg_min_ncrossedrows{"cfg_min_ncrossedrows", 40, "min ncrossed rows"}; Configurable cfg_max_chi2tpc{"cfg_max_chi2tpc", 4.0, "max chi2/NclsTPC"}; Configurable cfg_max_chi2its{"cfg_max_chi2its", 5.0, "max chi2/NclsITS"}; + Configurable cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 999.f, "max fraction of shared clusters in TPC"}; Configurable cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -3.0, "min. TPC n sigma for electron"}; Configurable cfg_max_TPCNsigmaEl{"cfg_max_TPCNsigmaEl", +3.0, "max. TPC n sigma for electron"}; Configurable cfg_disable_itsonly_track{"cfg_disable_itsonly_track", false, "flag to disable ITSonly tracks"}; @@ -160,6 +161,7 @@ struct Pi0EtaToGammaGammaMC { Configurable cfg_min_ncluster_tpc{"cfg_min_ncluster_tpc", 0, "min ncluster tpc"}; Configurable cfg_min_ncluster_its{"cfg_min_ncluster_its", 5, "min ncluster its"}; Configurable cfg_min_ncrossedrows{"cfg_min_ncrossedrows", 70, "min ncrossed rows"}; + Configurable cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 999.f, "max fraction of shared clusters in TPC"}; Configurable cfg_max_chi2tpc{"cfg_max_chi2tpc", 4.0, "max chi2/NclsTPC"}; Configurable cfg_max_chi2its{"cfg_max_chi2its", 5.0, "max chi2/NclsITS"}; Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 0.05, "max dca XY for single track in cm"}; @@ -169,8 +171,10 @@ struct Pi0EtaToGammaGammaMC { Configurable cfg_pid_scheme{"cfg_pid_scheme", static_cast(DalitzEECut::PIDSchemes::kTOFif), "pid scheme [kTOFif : 0, kTPConly : 1]"}; Configurable cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -2.0, "min. TPC n sigma for electron inclusion"}; Configurable cfg_max_TPCNsigmaEl{"cfg_max_TPCNsigmaEl", +3.0, "max. TPC n sigma for electron inclusion"}; - Configurable cfg_min_TPCNsigmaPi{"cfg_min_TPCNsigmaPi", -3.0, "min. TPC n sigma for pion exclusion"}; - Configurable cfg_max_TPCNsigmaPi{"cfg_max_TPCNsigmaPi", +3.0, "max. TPC n sigma for pion exclusion"}; + Configurable cfg_min_TPCNsigmaPi{"cfg_min_TPCNsigmaPi", -0.0, "min. TPC n sigma for pion exclusion"}; + Configurable cfg_max_TPCNsigmaPi{"cfg_max_TPCNsigmaPi", +0.0, "max. TPC n sigma for pion exclusion"}; + Configurable cfg_min_TOFNsigmaEl{"cfg_min_TOFNsigmaEl", -3.0, "min. TOF n sigma for electron inclusion"}; + Configurable cfg_max_TOFNsigmaEl{"cfg_max_TOFNsigmaEl", +3.0, "max. TOF n sigma for electron inclusion"}; } dileptoncuts; EMCPhotonCut fEMCCut; @@ -317,6 +321,7 @@ struct Pi0EtaToGammaGammaMC { fV0PhotonCut.SetTrackEtaRange(-pcmcuts.cfg_max_eta_v0, +pcmcuts.cfg_max_eta_v0); fV0PhotonCut.SetMinNCrossedRowsTPC(pcmcuts.cfg_min_ncrossedrows); fV0PhotonCut.SetMinNCrossedRowsOverFindableClustersTPC(0.8); + fV0PhotonCut.SetMaxFracSharedClustersTPC(pcmcuts.cfg_max_frac_shared_clusters_tpc); fV0PhotonCut.SetChi2PerClusterTPC(0.0, pcmcuts.cfg_max_chi2tpc); fV0PhotonCut.SetTPCNsigmaElRange(pcmcuts.cfg_min_TPCNsigmaEl, pcmcuts.cfg_max_TPCNsigmaEl); fV0PhotonCut.SetChi2PerClusterITS(-1e+10, pcmcuts.cfg_max_chi2its); @@ -347,6 +352,7 @@ struct Pi0EtaToGammaGammaMC { fDileptonCut.SetMinNClustersTPC(dileptoncuts.cfg_min_ncluster_tpc); fDileptonCut.SetMinNCrossedRowsTPC(dileptoncuts.cfg_min_ncrossedrows); fDileptonCut.SetMinNCrossedRowsOverFindableClustersTPC(0.8); + fDileptonCut.SetMaxFracSharedClustersTPC(dileptoncuts.cfg_max_frac_shared_clusters_tpc); fDileptonCut.SetChi2PerClusterTPC(0.0, dileptoncuts.cfg_max_chi2tpc); fDileptonCut.SetChi2PerClusterITS(0.0, dileptoncuts.cfg_max_chi2its); fDileptonCut.SetNClustersITS(dileptoncuts.cfg_min_ncluster_its, 7); @@ -357,6 +363,7 @@ struct Pi0EtaToGammaGammaMC { fDileptonCut.SetPIDScheme(dileptoncuts.cfg_pid_scheme); fDileptonCut.SetTPCNsigmaElRange(dileptoncuts.cfg_min_TPCNsigmaEl, dileptoncuts.cfg_max_TPCNsigmaEl); fDileptonCut.SetTPCNsigmaPiRange(dileptoncuts.cfg_min_TPCNsigmaPi, dileptoncuts.cfg_max_TPCNsigmaPi); + fDileptonCut.SetTOFNsigmaElRange(dileptoncuts.cfg_min_TOFNsigmaEl, dileptoncuts.cfg_max_TOFNsigmaEl); } void DefineEMCCut() diff --git a/PWGEM/PhotonMeson/DataModel/gammaTables.h b/PWGEM/PhotonMeson/DataModel/gammaTables.h index 0453e71814a..238a5ce11c6 100644 --- a/PWGEM/PhotonMeson/DataModel/gammaTables.h +++ b/PWGEM/PhotonMeson/DataModel/gammaTables.h @@ -310,7 +310,7 @@ DECLARE_SOA_TABLE(EMPrimaryElectronsFromDalitz, "AOD", "EMPRIMARYELDA", //! o2::soa::Index<>, emprimaryelectron::CollisionId, emprimaryelectron::TrackId, emprimaryelectron::Sign, track::Pt, track::Eta, track::Phi, track::DcaXY, track::DcaZ, track::CYY, track::CZY, track::CZZ, - track::TPCNClsFindable, track::TPCNClsFindableMinusFound, track::TPCNClsFindableMinusCrossedRows, + track::TPCNClsFindable, track::TPCNClsFindableMinusFound, track::TPCNClsFindableMinusCrossedRows, track::TPCNClsShared, track::TPCChi2NCl, track::TPCInnerParam, track::TPCSignal, pidtpc::TPCNSigmaEl, pidtpc::TPCNSigmaPi, pidtofbeta::Beta, pidtof::TOFNSigmaEl, pidtof::TOFNSigmaPi, @@ -322,6 +322,7 @@ DECLARE_SOA_TABLE(EMPrimaryElectronsFromDalitz, "AOD", "EMPRIMARYELDA", //! track::TPCCrossedRowsOverFindableCls, track::TPCFoundOverFindableCls, track::v001::ITSClusterMap, track::v001::ITSNCls, track::v001::ITSNClsInnerBarrel, + track::TPCFractionSharedCls, track::HasITS, track::HasTPC, track::HasTRD, track::HasTOF, emprimaryelectron::Signed1Pt, diff --git a/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx b/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx index 078cac30e70..606cb9548ed 100644 --- a/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx +++ b/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx @@ -255,7 +255,7 @@ struct skimmerPrimaryElectronFromDalitzEE { if (std::find(stored_trackIds.begin(), stored_trackIds.end(), std::make_pair(collision.globalIndex(), track.globalIndex())) == stored_trackIds.end()) { emprimaryelectrons(collision.globalIndex(), track.globalIndex(), track.sign(), track.pt(), track.eta(), track.phi(), track.dcaXY(), track.dcaZ(), track.cYY(), track.cZY(), track.cZZ(), - track.tpcNClsFindable(), track.tpcNClsFindableMinusFound(), track.tpcNClsFindableMinusCrossedRows(), + track.tpcNClsFindable(), track.tpcNClsFindableMinusFound(), track.tpcNClsFindableMinusCrossedRows(), track.tpcNClsShared(), track.tpcChi2NCl(), track.tpcInnerParam(), track.tpcSignal(), track.tpcNSigmaEl(), track.tpcNSigmaPi(), track.beta(), track.tofNSigmaEl(), track.tofNSigmaPi(), diff --git a/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx b/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx index e2d13df4f40..3345afc4e83 100644 --- a/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx +++ b/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx @@ -80,7 +80,7 @@ struct DalitzEEQC { struct : ConfigurableGroup { std::string prefix = "dileptoncut_group"; Configurable cfg_min_mass{"cfg_min_mass", 0.0, "min mass"}; - Configurable cfg_max_mass{"cfg_max_mass", 0.5, "max mass"}; + Configurable cfg_max_mass{"cfg_max_mass", 0.02, "max mass"}; Configurable cfg_apply_phiv{"cfg_apply_phiv", true, "flag to apply phiv cut"}; Configurable cfg_require_itsib_any{"cfg_require_itsib_any", true, "flag to require ITS ib any hits"}; Configurable cfg_require_itsib_1st{"cfg_require_itsib_1st", false, "flag to require ITS ib 1st hit"}; @@ -92,16 +92,19 @@ struct DalitzEEQC { Configurable cfg_min_ncluster_tpc{"cfg_min_ncluster_tpc", 0, "min ncluster tpc"}; Configurable cfg_min_ncluster_its{"cfg_min_ncluster_its", 5, "min ncluster its"}; Configurable cfg_min_ncrossedrows{"cfg_min_ncrossedrows", 70, "min ncrossed rows"}; + Configurable cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 999.f, "max fraction of shared clusters in TPC"}; Configurable cfg_max_chi2tpc{"cfg_max_chi2tpc", 4.0, "max chi2/NclsTPC"}; Configurable cfg_max_chi2its{"cfg_max_chi2its", 5.0, "max chi2/NclsITS"}; Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 1.0, "max dca XY for single track in cm"}; Configurable cfg_max_dcaz{"cfg_max_dcaz", 1.0, "max dca Z for single track in cm"}; - Configurable cfg_pid_scheme{"cfg_pid_scheme", static_cast(DalitzEECut::PIDSchemes::kTPConly), "pid scheme [kTPConly : 0]"}; + Configurable cfg_pid_scheme{"cfg_pid_scheme", static_cast(DalitzEECut::PIDSchemes::kTOFif), "pid scheme [kTOFif : 0, kTPConly : 1]"}; Configurable cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -2.0, "min. TPC n sigma for electron inclusion"}; Configurable cfg_max_TPCNsigmaEl{"cfg_max_TPCNsigmaEl", +3.0, "max. TPC n sigma for electron inclusion"}; - Configurable cfg_min_TPCNsigmaPi{"cfg_min_TPCNsigmaPi", -1e+10, "min. TPC n sigma for pion exclusion"}; - Configurable cfg_max_TPCNsigmaPi{"cfg_max_TPCNsigmaPi", +3.0, "max. TPC n sigma for pion exclusion"}; + Configurable cfg_min_TPCNsigmaPi{"cfg_min_TPCNsigmaPi", -0.0, "min. TPC n sigma for pion exclusion"}; + Configurable cfg_max_TPCNsigmaPi{"cfg_max_TPCNsigmaPi", +0.0, "max. TPC n sigma for pion exclusion"}; + Configurable cfg_min_TOFNsigmaEl{"cfg_min_TOFNsigmaEl", -3.0, "min. TOF n sigma for electron inclusion"}; + Configurable cfg_max_TOFNsigmaEl{"cfg_max_TOFNsigmaEl", +3.0, "max. TOF n sigma for electron inclusion"}; } dileptoncuts; o2::ccdb::CcdbApi ccdbApi; @@ -227,6 +230,7 @@ struct DalitzEEQC { fDileptonCut.SetMinNClustersTPC(dileptoncuts.cfg_min_ncluster_tpc); fDileptonCut.SetMinNCrossedRowsTPC(dileptoncuts.cfg_min_ncrossedrows); fDileptonCut.SetMinNCrossedRowsOverFindableClustersTPC(0.8); + fDileptonCut.SetMaxFracSharedClustersTPC(dileptoncuts.cfg_max_frac_shared_clusters_tpc); fDileptonCut.SetChi2PerClusterTPC(0.0, dileptoncuts.cfg_max_chi2tpc); fDileptonCut.SetChi2PerClusterITS(0.0, dileptoncuts.cfg_max_chi2its); fDileptonCut.SetNClustersITS(dileptoncuts.cfg_min_ncluster_its, 7); @@ -237,6 +241,7 @@ struct DalitzEEQC { fDileptonCut.SetPIDScheme(dileptoncuts.cfg_pid_scheme); fDileptonCut.SetTPCNsigmaElRange(dileptoncuts.cfg_min_TPCNsigmaEl, dileptoncuts.cfg_max_TPCNsigmaEl); fDileptonCut.SetTPCNsigmaPiRange(dileptoncuts.cfg_min_TPCNsigmaPi, dileptoncuts.cfg_max_TPCNsigmaPi); + fDileptonCut.SetTOFNsigmaElRange(dileptoncuts.cfg_min_TOFNsigmaEl, dileptoncuts.cfg_max_TOFNsigmaEl); } template diff --git a/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx b/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx index a39ddabed0b..dc5ae5721eb 100644 --- a/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx @@ -84,7 +84,7 @@ struct DalitzEEQCMC { struct : ConfigurableGroup { std::string prefix = "dileptoncut_group"; Configurable cfg_min_mass{"cfg_min_mass", 0.0, "min mass"}; - Configurable cfg_max_mass{"cfg_max_mass", 1e+10, "max mass"}; + Configurable cfg_max_mass{"cfg_max_mass", 0.02, "max mass"}; Configurable cfg_apply_phiv{"cfg_apply_phiv", true, "flag to apply phiv cut"}; Configurable cfg_require_itsib_any{"cfg_require_itsib_any", true, "flag to require ITS ib any hits"}; Configurable cfg_require_itsib_1st{"cfg_require_itsib_1st", false, "flag to require ITS ib 1st hit"}; @@ -96,16 +96,19 @@ struct DalitzEEQCMC { Configurable cfg_min_ncluster_tpc{"cfg_min_ncluster_tpc", 0, "min ncluster tpc"}; Configurable cfg_min_ncluster_its{"cfg_min_ncluster_its", 5, "min ncluster its"}; Configurable cfg_min_ncrossedrows{"cfg_min_ncrossedrows", 70, "min ncrossed rows"}; + Configurable cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 999.f, "max fraction of shared clusters in TPC"}; Configurable cfg_max_chi2tpc{"cfg_max_chi2tpc", 4.0, "max chi2/NclsTPC"}; Configurable cfg_max_chi2its{"cfg_max_chi2its", 5.0, "max chi2/NclsITS"}; Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 1.0, "max dca XY for single track in cm"}; Configurable cfg_max_dcaz{"cfg_max_dcaz", 1.0, "max dca Z for single track in cm"}; - Configurable cfg_pid_scheme{"cfg_pid_scheme", static_cast(DalitzEECut::PIDSchemes::kTPConly), "pid scheme [kTPConly : 0]"}; + Configurable cfg_pid_scheme{"cfg_pid_scheme", static_cast(DalitzEECut::PIDSchemes::kTOFif), "pid scheme [kTOFif : 0, kTPConly : 1]"}; Configurable cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -2.0, "min. TPC n sigma for electron inclusion"}; Configurable cfg_max_TPCNsigmaEl{"cfg_max_TPCNsigmaEl", +3.0, "max. TPC n sigma for electron inclusion"}; - Configurable cfg_min_TPCNsigmaPi{"cfg_min_TPCNsigmaPi", -1e+10, "min. TPC n sigma for pion exclusion"}; - Configurable cfg_max_TPCNsigmaPi{"cfg_max_TPCNsigmaPi", +3.0, "max. TPC n sigma for pion exclusion"}; + Configurable cfg_min_TPCNsigmaPi{"cfg_min_TPCNsigmaPi", -0.0, "min. TPC n sigma for pion exclusion"}; + Configurable cfg_max_TPCNsigmaPi{"cfg_max_TPCNsigmaPi", +0.0, "max. TPC n sigma for pion exclusion"}; + Configurable cfg_min_TOFNsigmaEl{"cfg_min_TOFNsigmaEl", -3.0, "min. TOF n sigma for electron inclusion"}; + Configurable cfg_max_TOFNsigmaEl{"cfg_max_TOFNsigmaEl", +3.0, "max. TOF n sigma for electron inclusion"}; } dileptoncuts; o2::ccdb::CcdbApi ccdbApi; @@ -254,6 +257,7 @@ struct DalitzEEQCMC { fDileptonCut.SetMinNClustersTPC(dileptoncuts.cfg_min_ncluster_tpc); fDileptonCut.SetMinNCrossedRowsTPC(dileptoncuts.cfg_min_ncrossedrows); fDileptonCut.SetMinNCrossedRowsOverFindableClustersTPC(0.8); + fDileptonCut.SetMaxFracSharedClustersTPC(dileptoncuts.cfg_max_frac_shared_clusters_tpc); fDileptonCut.SetChi2PerClusterTPC(0.0, dileptoncuts.cfg_max_chi2tpc); fDileptonCut.SetChi2PerClusterITS(0.0, dileptoncuts.cfg_max_chi2its); fDileptonCut.SetNClustersITS(dileptoncuts.cfg_min_ncluster_its, 7); @@ -264,6 +268,7 @@ struct DalitzEEQCMC { fDileptonCut.SetPIDScheme(dileptoncuts.cfg_pid_scheme); fDileptonCut.SetTPCNsigmaElRange(dileptoncuts.cfg_min_TPCNsigmaEl, dileptoncuts.cfg_max_TPCNsigmaEl); fDileptonCut.SetTPCNsigmaPiRange(dileptoncuts.cfg_min_TPCNsigmaPi, dileptoncuts.cfg_max_TPCNsigmaPi); + fDileptonCut.SetTOFNsigmaElRange(dileptoncuts.cfg_min_TOFNsigmaEl, dileptoncuts.cfg_max_TOFNsigmaEl); } template From e9f6e195641ef533f9be62f9189f910f7a2ff7b1 Mon Sep 17 00:00:00 2001 From: rolavick Date: Sat, 8 Mar 2025 10:18:32 +0100 Subject: [PATCH 0610/1650] [PWGUD] personal task modification (#10388) --- PWGUD/Tasks/upcTauRl.cxx | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/PWGUD/Tasks/upcTauRl.cxx b/PWGUD/Tasks/upcTauRl.cxx index adf85fa8629..248d44506db 100644 --- a/PWGUD/Tasks/upcTauRl.cxx +++ b/PWGUD/Tasks/upcTauRl.cxx @@ -70,10 +70,10 @@ DECLARE_SOA_COLUMN(HadronicRate, hadronicRate, double); DECLARE_SOA_COLUMN(Trs, trs, int); DECLARE_SOA_COLUMN(Trofs, trofs, int); DECLARE_SOA_COLUMN(Hmpr, hmpr, int); -DECLARE_SOA_COLUMN(TFb, tfb, int); -DECLARE_SOA_COLUMN(ITSROFb, itsROFb, int); +DECLARE_SOA_COLUMN(Tfb, tfb, int); +DECLARE_SOA_COLUMN(ItsRofb, itsRofb, int); DECLARE_SOA_COLUMN(Sbp, sbp, int); -DECLARE_SOA_COLUMN(ZvtxFT0vPV, zVtxFT0vPV, int); +DECLARE_SOA_COLUMN(ZvtxFT0vsPv, zvtxFT0vsPv, int); DECLARE_SOA_COLUMN(VtxITSTPC, vtxITSTPC, int); // FIT info DECLARE_SOA_COLUMN(TotalFT0AmplitudeA, totalFT0AmplitudeA, float); @@ -106,7 +106,7 @@ DECLARE_SOA_COLUMN(TrkTOFnSigmaPr, trkTOFnSigmaPr, float[2]); DECLARE_SOA_TABLE(TauTwoTracks, "AOD", "TAUTWOTRACK", tau_tree::RunNumber, tau_tree::Bc, tau_tree::TotalTracks, tau_tree::NumContrib, tau_tree::GlobalNonPVtracks, tau_tree::PosX, tau_tree::PosY, tau_tree::PosZ, tau_tree::RecoMode, tau_tree::OccupancyInTime, tau_tree::HadronicRate, - tau_tree::Trs, tau_tree::Trofs, tau_tree::Hmpr, tau_tree::TFb, tau_tree::ITSROFb, tau_tree::Sbp, tau_tree::ZvtxFT0vPV, tau_tree::VtxITSTPC, + tau_tree::Trs, tau_tree::Trofs, tau_tree::Hmpr, tau_tree::Tfb, tau_tree::ItsRofb, tau_tree::Sbp, tau_tree::ZvtxFT0vsPv, tau_tree::VtxITSTPC, tau_tree::TotalFT0AmplitudeA, tau_tree::TotalFT0AmplitudeC, tau_tree::TotalFV0AmplitudeA, tau_tree::TimeFT0A, tau_tree::TimeFT0C, tau_tree::TimeFV0A, tau_tree::TrkPx, tau_tree::TrkPy, tau_tree::TrkPz, tau_tree::TrkSign, tau_tree::TrkDCAxy, tau_tree::TrkDCAz, @@ -2018,6 +2018,7 @@ struct UpcTauRl { if (isElectronCandidate(track)) { countPVGTel++; vecTrkIdx.push_back(track.index()); + continue; } if (isMuPionCandidate(track)) { countPVGTmupi++; @@ -2025,7 +2026,7 @@ struct UpcTauRl { } } // Loop over tracks with selections - if (countPVGTel == 2 || (countPVGTel == 1 && countPVGTmupi == 1)) { + if ((countPVGTel == 2 && countPVGTmupi == 0) || (countPVGTel == 1 && countPVGTmupi == 1)) { const auto& trk1 = tracks.iteratorAt(vecTrkIdx[0]); const auto& trk2 = tracks.iteratorAt(vecTrkIdx[1]); @@ -2049,7 +2050,7 @@ struct UpcTauRl { float tofPr[2] = {trk1.tofNSigmaPr(), trk2.tofNSigmaPr()}; tauTwoTracks(collision.runNumber(), collision.globalBC(), countTracksPerCollision, collision.numContrib(), countGoodNonPVtracks, collision.posX(), collision.posY(), collision.posZ(), - collision.flags(), collision.occupancyInTime(), collision.hadronicRate(), collision.trs(), collision.hmpr(), collision.hmpr(), + collision.flags(), collision.occupancyInTime(), collision.hadronicRate(), collision.trs(), collision.trofs(), collision.hmpr(), collision.tfb(), collision.itsROFb(), collision.sbp(), collision.zVtxFT0vPV(), collision.vtxITSTPC(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFV0AmplitudeA(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), From a0bf5a48a74dfd2eaacdf0ffb6ed89473d8e843c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Sat, 8 Mar 2025 10:22:20 +0100 Subject: [PATCH 0611/1650] [Infrastructure] MegaLinter: Configure gitleaks to only scan PR commits (#10387) --- .mega-linter.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.mega-linter.yml b/.mega-linter.yml index 70b533d13a8..475adff6b0d 100644 --- a/.mega-linter.yml +++ b/.mega-linter.yml @@ -38,3 +38,4 @@ PYTHON_PYRIGHT_CONFIG_FILE: pyproject.toml PYTHON_RUFF_CONFIG_FILE: pyproject.toml CPP_CPPLINT_FILE_EXTENSIONS: [".C", ".c", ".c++", ".cc", ".cl", ".cpp", ".cu", ".cuh", ".cxx", ".cxx.in", ".h", ".h++", ".hh", ".h.in", ".hpp", ".hxx", ".inc", ".inl", ".macro"] CPP_CLANG_FORMAT_FILE_EXTENSIONS: [".C", ".c", ".c++", ".cc", ".cl", ".cpp", ".cu", ".cuh", ".cxx", ".cxx.in", ".h", ".h++", ".hh", ".h.in", ".hpp", ".hxx", ".inc", ".inl", ".macro"] +REPOSITORY_GITLEAKS_PR_COMMITS_SCAN: true From 24959513d78a594ddff0370a55bce9cd7798aee2 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Sat, 8 Mar 2025 12:18:55 +0100 Subject: [PATCH 0612/1650] [PWGLF] Add THnsparse for v2 correction of phi meson (#10405) --- PWGLF/Tasks/Resonances/phipbpb.cxx | 88 ++++++++++++++++++++++++------ 1 file changed, 72 insertions(+), 16 deletions(-) diff --git a/PWGLF/Tasks/Resonances/phipbpb.cxx b/PWGLF/Tasks/Resonances/phipbpb.cxx index 53af1c98534..e0e53d4b4fa 100644 --- a/PWGLF/Tasks/Resonances/phipbpb.cxx +++ b/PWGLF/Tasks/Resonances/phipbpb.cxx @@ -180,6 +180,7 @@ struct phipbpb { AxisSpec squareAxis = {200, 0, 1, "aossquare"}; AxisSpec phiAxis = {500, -6.28, 6.28, "phi"}; AxisSpec resAxis = {6000, -30, 30, "Res"}; + AxisSpec resAxisSquare = {800, -1, 1, "Res"}; AxisSpec centAxis = {8, 0, 80, "V0M (%)"}; AxisSpec occupancyAxis = {occupancyBinning, "Occupancy"}; @@ -215,6 +216,9 @@ struct phipbpb { histos.add("hSparseV2SameEventCosDeltaPhi", "hSparseV2SameEventCosDeltaPhi", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); histos.add("hSparseV2MixedEventCosDeltaPhi", "hSparseV2MixedEventCosDeltaPhi", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); + histos.add("hSparseV2SameEventCos2DeltaPhi", "hSparseV2SameEventCos2DeltaPhi", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); + histos.add("hSparseV2MixedEventCos2DeltaPhi", "hSparseV2MixedEventCos2DeltaPhi", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); + histos.add("hSparseV2SameEventCosDeltaPhiSquare", "hSparseV2SameEventCosDeltaPhiSquare", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, squareAxis, thnAxisCentrality}); histos.add("hSparseV2SameEventCosDeltaPhiCube", "hSparseV2SameEventCosDeltaPhiCube", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); histos.add("hSparseV2MixedEventCosDeltaPhiSquare", "hSparseV2MixedEventCosDeltaPhiSquare", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, squareAxis, thnAxisCentrality}); @@ -236,6 +240,20 @@ struct phipbpb { histos.add("ResFT0CFT0A", "ResFT0CFT0A", kTH3F, {centAxis, occupancyAxis, resAxis}); histos.add("ResFT0ATPC", "ResFT0ATPC", kTH3F, {centAxis, occupancyAxis, resAxis}); + histos.add("Res4FT0CTPC", "Res4FT0CTPC", kTH3F, {centAxis, occupancyAxis, resAxis}); + histos.add("Res4FT0CTPCR", "Res4FT0CTPCR", kTH3F, {centAxis, occupancyAxis, resAxis}); + histos.add("Res4FT0CTPCL", "Res4FT0CTPCL", kTH3F, {centAxis, occupancyAxis, resAxis}); + histos.add("Res4TPCRTPCL", "Res4TPCRTPCL", kTH3F, {centAxis, occupancyAxis, resAxis}); + histos.add("Res4FT0CFT0A", "Res4FT0CFT0A", kTH3F, {centAxis, occupancyAxis, resAxis}); + histos.add("Res4FT0ATPC", "Res4FT0ATPC", kTH3F, {centAxis, occupancyAxis, resAxis}); + + histos.add("ResFT0CTPCSquare", "ResFT0CTPCSquare", kTH3F, {centAxis, occupancyAxis, resAxisSquare}); + histos.add("ResFT0CTPCRSquare", "ResFT0CTPCRSquare", kTH3F, {centAxis, occupancyAxis, resAxisSquare}); + histos.add("ResFT0CTPCLSquare", "ResFT0CTPCLSquare", kTH3F, {centAxis, occupancyAxis, resAxisSquare}); + histos.add("ResTPCRTPCLSquare", "ResTPCRTPCLSquare", kTH3F, {centAxis, occupancyAxis, resAxisSquare}); + histos.add("ResFT0CFT0ASquare", "ResFT0CFT0ASquare", kTH3F, {centAxis, occupancyAxis, resAxisSquare}); + histos.add("ResFT0ATPCSquare", "ResFT0ATPCSquare", kTH3F, {centAxis, occupancyAxis, resAxisSquare}); + histos.add("ResSPFT0CTPC", "ResSPFT0CTPC", kTH3F, {centAxis, occupancyAxis, resAxis}); histos.add("ResSPFT0CTPCR", "ResSPFT0CTPCR", kTH3F, {centAxis, occupancyAxis, resAxis}); histos.add("ResSPFT0CTPCL", "ResSPFT0CTPCL", kTH3F, {centAxis, occupancyAxis, resAxis}); @@ -243,6 +261,13 @@ struct phipbpb { histos.add("ResSPFT0CFT0A", "ResSPFT0CFT0A", kTH3F, {centAxis, occupancyAxis, resAxis}); histos.add("ResSPFT0ATPC", "ResSPFT0ATPC", kTH3F, {centAxis, occupancyAxis, resAxis}); + histos.add("Res4SPFT0CTPC", "Res4SPFT0CTPC", kTH3F, {centAxis, occupancyAxis, resAxis}); + histos.add("Res4SPFT0CTPCR", "Res4SPFT0CTPCR", kTH3F, {centAxis, occupancyAxis, resAxis}); + histos.add("Res4SPFT0CTPCL", "Res4SPFT0CTPCL", kTH3F, {centAxis, occupancyAxis, resAxis}); + histos.add("Res4SPTPCRTPCL", "Res4SPTPCRTPCL", kTH3F, {centAxis, occupancyAxis, resAxis}); + histos.add("Res4SPFT0CFT0A", "Res4SPFT0CFT0A", kTH3F, {centAxis, occupancyAxis, resAxis}); + histos.add("Res4SPFT0ATPC", "Res4SPFT0ATPC", kTH3F, {centAxis, occupancyAxis, resAxis}); + histos.add("ResTrackSPFT0CTPC", "ResTrackSPFT0CTPC", kTH3F, {centAxis, occupancyAxis, resAxis}); histos.add("ResTrackSPFT0CTPCR", "ResTrackSPFT0CTPCR", kTH3F, {centAxis, occupancyAxis, resAxis}); histos.add("ResTrackSPFT0CTPCL", "ResTrackSPFT0CTPCL", kTH3F, {centAxis, occupancyAxis, resAxis}); @@ -263,19 +288,21 @@ struct phipbpb { histos.add("hSparseV2MCRecCosThetaStar_effy", "hSparseV2SameEventCosThetaStar_effy", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, thnAxisCosThetaStar, thnAxisRapidity, thnAxisCentrality}); // weight - histos.add("hSparsePhiMCGenWeight", "hSparsePhiMCGenWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, thnAxisPt, {8, -0.8, 0.8}}); - histos.add("hSparsePhiMCRecWeight", "hSparsePhiMCRecWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, thnAxisPt, {8, -0.8, 0.8}}); - histos.add("hSparsePhiMCGenKaonWeight", "hSparsePhiMCGenKaonWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); - histos.add("hSparsePhiMCRecKaonWeight", "hSparsePhiMCRecKaonWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); - histos.add("hSparsePhiMCRecKaonMissMatchWeight", "hSparsePhiMCRecKaonMissMatchWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); + + histos.add("hSparsePhiMCGenWeight", "hSparsePhiMCGenWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, -1.0, 1}, thnAxisPt, {8, -0.8, 0.8}}); + histos.add("hSparsePhiMCRecWeight", "hSparsePhiMCRecWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, -1.0, 1}, thnAxisPt, {8, -0.8, 0.8}}); + histos.add("hSparsePhiMCGenKaonWeight", "hSparsePhiMCGenKaonWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, -1.0, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); + histos.add("hSparsePhiMCRecKaonWeight", "hSparsePhiMCRecKaonWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, -1.0, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); + histos.add("hSparsePhiMCRecKaonMissMatchWeight", "hSparsePhiMCRecKaonMissMatchWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, -1.0, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); + + histos.add("hSparseMCGenWeight", "hSparseMCGenWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, -1.0, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); + histos.add("hSparseMCRecWeight", "hSparseMCRecWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, -1.0, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); + histos.add("hSparseMCRecAllTrackWeight", "hSparseMCRecAllTrackWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0, TMath::Pi()}, {400, -1.0, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); histos.add("hImpactParameter", "Impact parameter", kTH1F, {{200, 0.0f, 20.0f}}); histos.add("hEventPlaneAngle", "hEventPlaneAngle", kTH1F, {{200, -2.0f * TMath::Pi(), 2.0f * TMath::Pi()}}); histos.add("hEventPlaneAngleRec", "hEventPlaneAngleRec", kTH1F, {{200, -2.0f * TMath::Pi(), 2.0f * TMath::Pi()}}); histos.add("hNchVsImpactParameter", "hNchVsImpactParameter", kTH2F, {{200, 0.0f, 20.0f}, {500, -0.5f, 5000.5f}}); - histos.add("hSparseMCGenWeight", "hSparseMCGenWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); - histos.add("hSparseMCRecWeight", "hSparseMCRecWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); - histos.add("hSparseMCRecAllTrackWeight", "hSparseMCRecAllTrackWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); histos.add("hSparseMCGenV2", "hSparseMCGenV2", HistType::kTHnSparseD, {thnAxisCentrality, {200, -1.0, 1.0}, axisPtKaonWeight}); histos.add("hSparseMCRecV2", "hSparseMCRecV2", HistType::kTHnSparseD, {thnAxisCentrality, {200, -1.0, 1.0}, axisPtKaonWeight}); // histos.add("hSparseMCGenV2Square", "hSparseMCGenV2Square", HistType::kTHnSparseD, {thnAxisCentrality, {1000, 0.0, 1.0}, axisPtKaonWeight}); @@ -486,6 +513,20 @@ struct phipbpb { histos.fill(HIST("ResFT0CFT0A"), centrality, occupancy, TMath::Cos(2.0 * (psiFT0C - psiFT0A))); histos.fill(HIST("ResFT0ATPC"), centrality, occupancy, TMath::Cos(2.0 * (psiTPC - psiFT0A))); + histos.fill(HIST("Res4FT0CTPC"), centrality, occupancy, TMath::Cos(4.0 * (psiFT0C - psiTPC))); + histos.fill(HIST("Res4FT0CTPCR"), centrality, occupancy, TMath::Cos(4.0 * (psiFT0C - psiTPCR))); + histos.fill(HIST("Res4FT0CTPCL"), centrality, occupancy, TMath::Cos(4.0 * (psiFT0C - psiTPCL))); + histos.fill(HIST("Res4TPCRTPCL"), centrality, occupancy, TMath::Cos(4.0 * (psiTPCR - psiTPCL))); + histos.fill(HIST("Res4FT0CFT0A"), centrality, occupancy, TMath::Cos(4.0 * (psiFT0C - psiFT0A))); + histos.fill(HIST("Res4FT0ATPC"), centrality, occupancy, TMath::Cos(4.0 * (psiTPC - psiFT0A))); + + histos.fill(HIST("ResFT0CTPCSquare"), centrality, occupancy, TMath::Power(TMath::Cos(2.0 * (psiFT0C - psiTPC)), 2.0)); + histos.fill(HIST("ResFT0CTPCRSquare"), centrality, occupancy, TMath::Power(TMath::Cos(2.0 * (psiFT0C - psiTPCR)), 2.0)); + histos.fill(HIST("ResFT0CTPCLSquare"), centrality, occupancy, TMath::Power(TMath::Cos(2.0 * (psiFT0C - psiTPCL)), 2.0)); + histos.fill(HIST("ResTPCRTPCLSquare"), centrality, occupancy, TMath::Power(TMath::Cos(2.0 * (psiTPCR - psiTPCL)), 2.0)); + histos.fill(HIST("ResFT0CFT0ASquare"), centrality, occupancy, TMath::Power(TMath::Cos(2.0 * (psiFT0C - psiFT0A)), 2.0)); + histos.fill(HIST("ResFT0ATPCSquare"), centrality, occupancy, TMath::Power(TMath::Cos(2.0 * (psiTPC - psiFT0A)), 2.0)); + histos.fill(HIST("ResSPFT0CTPC"), centrality, occupancy, QFT0C * QTPC * TMath::Cos(2.0 * (psiFT0C - psiTPC))); histos.fill(HIST("ResSPFT0CTPCR"), centrality, occupancy, QFT0C * QTPCR * TMath::Cos(2.0 * (psiFT0C - psiTPCR))); histos.fill(HIST("ResSPFT0CTPCL"), centrality, occupancy, QFT0C * QTPCL * TMath::Cos(2.0 * (psiFT0C - psiTPCL))); @@ -493,6 +534,13 @@ struct phipbpb { histos.fill(HIST("ResSPFT0CFT0A"), centrality, occupancy, QFT0C * QFT0A * TMath::Cos(2.0 * (psiFT0C - psiFT0A))); histos.fill(HIST("ResSPFT0ATPC"), centrality, occupancy, QTPC * QFT0A * TMath::Cos(2.0 * (psiTPC - psiFT0A))); + histos.fill(HIST("Res4SPFT0CTPC"), centrality, occupancy, QFT0C * QTPC * TMath::Cos(4.0 * (psiFT0C - psiTPC))); + histos.fill(HIST("Res4SPFT0CTPCR"), centrality, occupancy, QFT0C * QTPCR * TMath::Cos(4.0 * (psiFT0C - psiTPCR))); + histos.fill(HIST("Res4SPFT0CTPCL"), centrality, occupancy, QFT0C * QTPCL * TMath::Cos(4.0 * (psiFT0C - psiTPCL))); + histos.fill(HIST("Res4SPTPCRTPCL"), centrality, occupancy, QTPCR * QTPCL * TMath::Cos(4.0 * (psiTPCR - psiTPCL))); + histos.fill(HIST("Res4SPFT0CFT0A"), centrality, occupancy, QFT0C * QFT0A * TMath::Cos(4.0 * (psiFT0C - psiFT0A))); + histos.fill(HIST("Res4SPFT0ATPC"), centrality, occupancy, QTPC * QFT0A * TMath::Cos(4.0 * (psiTPC - psiFT0A))); + histos.fill(HIST("hCentrality"), centrality); histos.fill(HIST("hVtxZ"), collision.posZ()); @@ -591,6 +639,7 @@ struct phipbpb { PhiMesonMother = KaonPlus + KaonMinus; auto phiminuspsi = GetPhiInRange(PhiMesonMother.Phi() - psiFT0C); auto v2 = TMath::Cos(2.0 * phiminuspsi); + auto v2acc = TMath::Cos(4.0 * phiminuspsi); auto v2sin = TMath::Sin(2.0 * phiminuspsi); auto phimother = PhiMesonMother.Phi(); histos.fill(HIST("hpTvsRapidity"), PhiMesonMother.Pt(), PhiMesonMother.Rapidity()); @@ -608,6 +657,8 @@ struct phipbpb { histos.fill(HIST("ResTrackSPFT0ATPC"), centrality, occupancy, QTPC * QFT0A * TMath::Cos(2.0 * (psiTPC - psiFT0A))); if (useWeight) { histos.fill(HIST("hSparseV2SameEventCosDeltaPhi"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2 * QFT0C, centrality, 1 / totalweight); + histos.fill(HIST("hSparseV2SameEventCos2DeltaPhi"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2acc * QFT0C, centrality, 1 / totalweight); + histos.fill(HIST("hSparseV2SameEventCosDeltaPhiSquare"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2 * v2, centrality, 1 / totalweight); histos.fill(HIST("hSparseV2SameEventSinDeltaPhi"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2sin * QFT0C, centrality, 1 / totalweight); @@ -618,8 +669,10 @@ struct phipbpb { } else { if (useSP) { histos.fill(HIST("hSparseV2SameEventCosDeltaPhi"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2 * QFT0C, centrality); + histos.fill(HIST("hSparseV2SameEventCos2DeltaPhi"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2acc * QFT0C, centrality); } else { histos.fill(HIST("hSparseV2SameEventCosDeltaPhi"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2, centrality); + histos.fill(HIST("hSparseV2SameEventCos2DeltaPhi"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2acc, centrality); } histos.fill(HIST("hSparseV2SameEventCosDeltaPhiSquare"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2 * v2, centrality); histos.fill(HIST("hSparseV2SameEventCosDeltaPhiCube"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2 * v2 * v2, centrality); @@ -742,13 +795,16 @@ struct phipbpb { PhiMesonMother = KaonPlus + KaonMinus; auto phiminuspsi = GetPhiInRange(PhiMesonMother.Phi() - psiFT0C); auto v2 = TMath::Cos(2.0 * phiminuspsi); + auto v2acc = TMath::Cos(4.0 * phiminuspsi); auto v2sin = TMath::Sin(2.0 * phiminuspsi); histos.fill(HIST("hpTvsRapidity"), PhiMesonMother.Pt(), PhiMesonMother.Rapidity()); if (TMath::Abs(PhiMesonMother.Rapidity()) < confRapidity) { if (useSP) { histos.fill(HIST("hSparseV2MixedEventCosDeltaPhi"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2 * QFT0C, centrality); + histos.fill(HIST("hSparseV2MixedEventCos2DeltaPhi"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2acc * QFT0C, centrality); } else { histos.fill(HIST("hSparseV2MixedEventCosDeltaPhi"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2, centrality); + histos.fill(HIST("hSparseV2MixedEventCos2DeltaPhi"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2acc, centrality); } histos.fill(HIST("hSparseV2MixedEventCosDeltaPhiSquare"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2 * v2, centrality); histos.fill(HIST("hSparseV2MixedEventSinDeltaPhi"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2sin * QFT0C, centrality); @@ -1011,7 +1067,7 @@ struct phipbpb { continue; if (TMath::Abs(mcParticle.eta()) > 0.8) // main acceptance continue; - histos.fill(HIST("hSparseMCGenWeight"), centclass, GetPhiInRange(deltaPhi), TMath::Power(TMath::Cos(2.0 * GetPhiInRange(deltaPhi)), 2.0), mcParticle.pt(), mcParticle.eta()); + histos.fill(HIST("hSparseMCGenWeight"), centclass, GetPhiInRange(deltaPhi), TMath::Power(TMath::Cos(4.0 * GetPhiInRange(deltaPhi)), 1.0), mcParticle.pt(), mcParticle.eta()); histos.fill(HIST("hSparseMCGenV2"), centclass, TMath::Cos(2.0 * GetPhiInRange(deltaPhi)), mcParticle.pt()); histos.fill(HIST("hSparseMCGenV2Square"), centclass, TMath::Power(TMath::Cos(2.0 * GetPhiInRange(deltaPhi)), 2.0), mcParticle.pt()); nCh++; @@ -1030,12 +1086,12 @@ struct phipbpb { } // if valid global, fill if (validGlobal) { - histos.fill(HIST("hSparseMCRecWeight"), centclass, GetPhiInRange(deltaPhi), TMath::Power(TMath::Cos(2.0 * GetPhiInRange(deltaPhi)), 2.0), mcParticle.pt(), mcParticle.eta()); + histos.fill(HIST("hSparseMCRecWeight"), centclass, GetPhiInRange(deltaPhi), TMath::Power(TMath::Cos(4.0 * GetPhiInRange(deltaPhi)), 1.0), mcParticle.pt(), mcParticle.eta()); histos.fill(HIST("hSparseMCRecV2"), centclass, TMath::Cos(2.0 * GetPhiInRange(deltaPhi)), mcParticle.pt()); histos.fill(HIST("hSparseMCRecV2Square"), centclass, TMath::Power(TMath::Cos(2.0 * GetPhiInRange(deltaPhi)), 2.0), mcParticle.pt()); } if (validAny) { - histos.fill(HIST("hSparseMCRecAllTrackWeight"), centclass, GetPhiInRange(deltaPhi), TMath::Power(TMath::Cos(2.0 * GetPhiInRange(deltaPhi)), 2.0), mcParticle.pt(), mcParticle.eta()); + histos.fill(HIST("hSparseMCRecAllTrackWeight"), centclass, GetPhiInRange(deltaPhi), TMath::Power(TMath::Cos(4.0 * GetPhiInRange(deltaPhi)), 1.0), mcParticle.pt(), mcParticle.eta()); histos.fill(HIST("hEventPlaneAngleRec"), GetPhiInRange(deltaPhi)); } // if any track present, fill @@ -1106,11 +1162,11 @@ struct phipbpb { const auto mctrack1 = track1.mcParticle(); if (selectionTrack(track1) && selectionPIDpTdependent(track1) && TMath::Abs(mctrack1.pdgCode()) == 321 && mctrack1.isPhysicalPrimary()) { - histos.fill(HIST("hSparsePhiMCRecKaonWeight"), centclass, GetPhiInRange(mctrack1.phi() - psiFT0C), TMath::Power(TMath::Cos(2.0 * GetPhiInRange(mctrack1.phi() - psiFT0C)), 2.0), mctrack1.pt(), mctrack1.eta()); + histos.fill(HIST("hSparsePhiMCRecKaonWeight"), centclass, GetPhiInRange(mctrack1.phi() - psiFT0C), TMath::Power(TMath::Cos(4.0 * GetPhiInRange(mctrack1.phi() - psiFT0C)), 1.0), mctrack1.pt(), mctrack1.eta()); } if (selectionTrack(track1) && track1.pt() > 0.5 && track1.hasTOF() && TMath::Abs(track1.tofNSigmaKa()) > nsigmaCutTOF && TMath::Abs(track1.tpcNSigmaKa()) < nsigmaCutTPC && TMath::Abs(mctrack1.pdgCode()) == 321 && mctrack1.isPhysicalPrimary()) { - histos.fill(HIST("hSparsePhiMCRecKaonMissMatchWeight"), centclass, GetPhiInRange(mctrack1.phi() - psiFT0C), TMath::Power(TMath::Cos(2.0 * GetPhiInRange(mctrack1.phi() - psiFT0C)), 2.0), mctrack1.pt(), mctrack1.eta()); + histos.fill(HIST("hSparsePhiMCRecKaonMissMatchWeight"), centclass, GetPhiInRange(mctrack1.phi() - psiFT0C), TMath::Power(TMath::Cos(4.0 * GetPhiInRange(mctrack1.phi() - psiFT0C)), 1.0), mctrack1.pt(), mctrack1.eta()); } auto track1ID = track1.index(); for (auto track2 : Rectrackspart) { @@ -1168,7 +1224,7 @@ struct phipbpb { // oldindex = mothertrack1.globalIndex(); oldindex = mothertrack1.index(); auto PhiMinusPsi = GetPhiInRange(mothertrack1.phi() - psiFT0C); - histos.fill(HIST("hSparsePhiMCRecWeight"), centclass, PhiMinusPsi, TMath::Power(TMath::Cos(2.0 * PhiMinusPsi), 2.0), mothertrack1.pt(), mothertrack1.eta()); + histos.fill(HIST("hSparsePhiMCRecWeight"), centclass, PhiMinusPsi, TMath::Power(TMath::Cos(4.0 * PhiMinusPsi), 1.0), mothertrack1.pt(), mothertrack1.eta()); } } } @@ -1178,7 +1234,7 @@ struct phipbpb { if (TMath::Abs(mcParticle.eta()) > 0.8) // main acceptance continue; if (TMath::Abs(mcParticle.pdgCode()) == 321 && mcParticle.isPhysicalPrimary()) { - histos.fill(HIST("hSparsePhiMCGenKaonWeight"), centclass, GetPhiInRange(mcParticle.phi() - psiFT0C), TMath::Power(TMath::Cos(2.0 * GetPhiInRange(mcParticle.phi() - psiFT0C)), 2.0), mcParticle.pt(), mcParticle.eta()); + histos.fill(HIST("hSparsePhiMCGenKaonWeight"), centclass, GetPhiInRange(mcParticle.phi() - psiFT0C), TMath::Power(TMath::Cos(4.0 * GetPhiInRange(mcParticle.phi() - psiFT0C)), 1.0), mcParticle.pt(), mcParticle.eta()); } if (TMath::Abs(mcParticle.y()) > confRapidity) { continue; @@ -1210,7 +1266,7 @@ struct phipbpb { } if (daughtp && daughtm) { auto PhiMinusPsiGen = GetPhiInRange(mcParticle.phi() - psiFT0C); - histos.fill(HIST("hSparsePhiMCGenWeight"), centclass, PhiMinusPsiGen, TMath::Power(TMath::Cos(2.0 * PhiMinusPsiGen), 2.0), mcParticle.pt(), mcParticle.eta()); + histos.fill(HIST("hSparsePhiMCGenWeight"), centclass, PhiMinusPsiGen, TMath::Power(TMath::Cos(4.0 * PhiMinusPsiGen), 1.0), mcParticle.pt(), mcParticle.eta()); } } } // rec collision loop From 29a0e66cec7989dbe3de0180f3d74722cdcd2b3c Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Sun, 9 Mar 2025 06:17:07 +0900 Subject: [PATCH 0613/1650] [PWGEM/Dilepton] fix in treeCreatorElectronMLDDA.cxx (#10412) --- PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx index 8665b208a1c..16aa791d217 100644 --- a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx +++ b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx @@ -752,8 +752,8 @@ struct TreeCreatorElectronMLDDA { registry.fill(HIST("Cascade/hRxy_Omega"), cascade.mOmega(), cascade.cascradius()); registry.fill(HIST("Cascade/hCTau_Omega"), cascade.mOmega(), ctauOmega); if (cascadecuts.cfg_min_mass_Omega < cascade.mOmega() && cascade.mOmega() < cascadecuts.cfg_max_mass_Omega) { // select Omega candidates - registry.fill(HIST("V0/hTPCdEdx_P_Ka"), neg.p(), neg.tpcSignal()); - registry.fill(HIST("V0/hTOFbeta_P_Ka"), neg.p(), neg.beta()); + registry.fill(HIST("V0/hTPCdEdx_P_Ka"), bachelor.p(), bachelor.tpcSignal()); + registry.fill(HIST("V0/hTOFbeta_P_Ka"), bachelor.p(), bachelor.beta()); if (dist01(engine) < downscaling_kaon) { fillTrackTable(collision, bachelor, static_cast(o2::aod::pwgem::dilepton::PID_Label::kKaon), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary)); } From e901200eb8d870ee0b19f26fb6f1829ff98d6bfe Mon Sep 17 00:00:00 2001 From: ilikmeta <152337132+ilikmeta@users.noreply.github.com> Date: Sat, 8 Mar 2025 16:31:44 -0600 Subject: [PATCH 0614/1650] [PWGCF] Fix hEventCounter histogram (#10404) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/flowGfwTask.cxx | 59 ++++++++++++++------------------ 1 file changed, 26 insertions(+), 33 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowGfwTask.cxx b/PWGCF/Flow/Tasks/flowGfwTask.cxx index 6581fbc26f2..b70d301e2f2 100644 --- a/PWGCF/Flow/Tasks/flowGfwTask.cxx +++ b/PWGCF/Flow/Tasks/flowGfwTask.cxx @@ -57,16 +57,8 @@ using namespace o2::aod::evsel; #define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable NAME{#NAME, DEFAULT, HELP}; -namespace o2::aod -{ -using SimCollisions = soa::Join; - -using SimTracks = soa::Join; -} // namespace o2::aod - +using SimCollisions = soa::Join; +using SimTracks = soa::Join; using Colls = soa::Filtered>; using AodTracks = soa::Filtered>; using BCsRun3 = soa::Join; @@ -255,20 +247,21 @@ struct FlowGfwTask { ccdb->setCreatedNotAfter(ccdbNoLaterThan.value); // Add some output objects to the histogram registry + registry.add("hEventCount", "Number of Events;; No. of Events", {HistType::kTH1D, {{kNOOFEVENTSTEPS, -0.5, static_cast(kNOOFEVENTSTEPS) - 0.5}}}); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kFILTERED + 1, "Filtered events"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kSEL8 + 1, "Sel8"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kOCCUPANCY + 1, "Occupancy"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kNOTIMEFRAMEBORDER + 1, "kNoTimeFrameBorder"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kNOITSROFRAMEBORDER + 1, "kNoITSROFrameBorder"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kNOPSAMEBUNCHPILEUP + 1, "kNoSameBunchPileup"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kISGOODZVTXFT0VSPV + 1, "kIsGoodZvtxFT0vsPV"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kISVERTEXITSTPC + 1, "kIsVertexITSTPC"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kNOCOLLINTIMERANGESTANDART + 1, "kNoCollInTimeRangeStandard"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kISGOODITSLAYERSALL + 1, "kIsGoodITSLayersAll"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kAFTERMULTCUTS + 1, "After Mult cuts"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kCENTRALITY + 1, "Centrality"); + if (doprocessData) { - registry.add("hEventCount", "Number of Events;; No. of Events", {HistType::kTH1D, {{kNOOFEVENTSTEPS, -0.5, static_cast(kNOOFEVENTSTEPS) - 0.5}}}); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kFILTERED + 1, "Filtered events"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kSEL8 + 1, "Sel8"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kOCCUPANCY + 1, "Occupancy"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kNOTIMEFRAMEBORDER + 1, "kNoTimeFrameBorder"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kNOITSROFRAMEBORDER + 1, "kNoITSROFrameBorder"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kNOPSAMEBUNCHPILEUP + 1, "kNoSameBunchPileup"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kISGOODZVTXFT0VSPV + 1, "kIsGoodZvtxFT0vsPV"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kISVERTEXITSTPC + 1, "kIsVertexITSTPC"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kNOCOLLINTIMERANGESTANDART + 1, "kNoCollInTimeRangeStandard"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kISGOODITSLAYERSALL + 1, "kIsGoodITSLayersAll"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kAFTERMULTCUTS + 1, "After Mult cuts"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(kCENTRALITY + 1, "Centrality"); registry.add("hPhi", "#phi distribution", {HistType::kTH1D, {axisPhi}}); registry.add("hPhiWeighted", "corrected #phi distribution", {HistType::kTH1D, {axisPhi}}); registry.add("hEta", "", {HistType::kTH1D, {axisEta}}); @@ -390,7 +383,7 @@ struct FlowGfwTask { } // End doprocessData const AxisSpec axisZpos{48, -12., 12., "Vtx_{z} (cm)"}; - const AxisSpec axisEvent{2, 0, +2, ""}; + const AxisSpec axisEvent{3, 0, 3, ""}; // MC Histograms if (doprocesspTEff) { registry.add("hEventCounterMCRec", "Event counter", kTH1F, {axisEvent}); @@ -773,10 +766,11 @@ struct FlowGfwTask { if (!collision.sel8()) return; - int nTotal = tracks.size(); - if (nTotal < 1) + if (tracks.size() < 1) return; + registry.fill(HIST("hEventCount"), kSEL8); + // Choose centrality estimator -- Only one can be true auto centrality = -1; if (cfgcentEstFt0c) { @@ -815,7 +809,6 @@ struct FlowGfwTask { registry.fill(HIST("BeforeCut_multT0C_centT0C"), collision.centFT0C(), collision.multFT0C()); registry.fill(HIST("BeforeCut_multT0A_centT0A"), collision.centFT0A(), collision.multFT0A()); registry.fill(HIST("BeforeCut_multFT0M_centFT0M"), collision.centFT0M(), collision.multFT0M()); - registry.fill(HIST("hEventCount"), kSEL8); if (cfgOccupancy) { int occupancy = collision.trackOccupancyInTimeRange(); @@ -893,9 +886,9 @@ struct FlowGfwTask { float vtxz = collision.posZ(); float lRandom = fRndm->Rndm(); registry.fill(HIST("hVtxZ"), vtxz); - registry.fill(HIST("hMult"), nTotal); + registry.fill(HIST("hMult"), tracks.size()); registry.fill(HIST("hCent"), centrality); - registry.fill(HIST("cent_vs_Nch"), centrality, nTotal); + registry.fill(HIST("cent_vs_Nch"), centrality, tracks.size()); fGFW->Clear(); @@ -1065,12 +1058,12 @@ struct FlowGfwTask { } // End of process PROCESS_SWITCH(FlowGfwTask, processData, "Process analysis for Run 3 data", false); - using TheFilteredSimTracks = soa::Filtered; + using TheFilteredSimTracks = soa::Filtered; Preslice perMCCollision = aod::mcparticle::mcCollisionId; Preslice perCollision = aod::track::collisionId; void processpTEff(aod::McCollisions::iterator const& mccollision, - soa::SmallGroups const& collisions, + soa::SmallGroups const& collisions, aod::McParticles const& mcParticles, TheFilteredSimTracks const& simTracks) { @@ -1137,7 +1130,7 @@ struct FlowGfwTask { if (std::fabs(mccollision.posZ()) > cfgCutVertex) continue; registry.fill(HIST("zPosMC"), mccollision.posZ()); - registry.fill(HIST("hEventCounterMCGen"), 1); + registry.fill(HIST("hEventCounterMCGen"), 1.5); for (const auto& particle : mcParticles) { if (particle.eta() < -cfgCutEta || particle.eta() > cfgCutEta) { @@ -1149,7 +1142,7 @@ struct FlowGfwTask { if (!particle.isPhysicalPrimary()) { continue; } - registry.fill(HIST("hEventCounterMCGen"), 1.5); + registry.fill(HIST("hEventCounterMCGen"), 2.5); registry.fill(HIST("hPtMCGen"), particle.pt()); registry.fill(HIST("hCenMCGen"), centrality); registry.fill(HIST("PtMC_ch"), centrality, particle.pt()); From 5b2089eb302fe66bd5f246d71f5bb2f46b3bfeef Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Sun, 9 Mar 2025 06:32:44 +0800 Subject: [PATCH 0615/1650] [PWGCF] change Chebyshev to linear (#10407) --- PWGCF/Flow/Tasks/flowQa.cxx | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowQa.cxx b/PWGCF/Flow/Tasks/flowQa.cxx index dc46198edba..8c186b3e47d 100644 --- a/PWGCF/Flow/Tasks/flowQa.cxx +++ b/PWGCF/Flow/Tasks/flowQa.cxx @@ -96,6 +96,7 @@ struct FlowQa { O2_DEFINE_CONFIGURABLE(cfgCutOccupancyLow, int, 0, "Low cut on TPC occupancy") O2_DEFINE_CONFIGURABLE(cfgUseSmallMemory, bool, false, "Use small memory mode") O2_DEFINE_CONFIGURABLE(cfgUseEPcorrection, bool, false, "Use event plane efficiency correction") + O2_DEFINE_CONFIGURABLE(cfgUseEPEffSlopeFactor, float, 1.0f, "A factor to scale the EP efficiency slope") Configurable> cfgUserDefineGFWCorr{"cfgUserDefineGFWCorr", std::vector{"refN02 {2} refP02 {-2}", "refN12 {2} refP12 {-2}"}, "User defined GFW CorrelatorConfig"}; Configurable> cfgUserDefineGFWName{"cfgUserDefineGFWName", std::vector{"Ch02Gap22", "Ch12Gap22"}, "User defined GFW Name"}; Configurable> cfgRunRemoveList{"cfgRunRemoveList", std::vector{-1}, "excluded run numbers"}; @@ -366,20 +367,20 @@ struct FlowQa { if (cfgUseEPcorrection) { hFindPtBin = new TH1D("hFindPtBin", "hFindPtBin", 7, 0.2, 3.0); funcEff.resize(7); - funcEff[0] = new TF1("funcEff0", "[0]+[1]*x+[2]*(2*x*x - 1)+[3]*(4*x*x*x - 3*x)+[4]*(8*x*x*x*x - 8*x*x + 1)", 0, 3000); - funcEff[0]->SetParameters(0.7366162408, -2.11923e-05, 1.5258e-09, -2.23824e-12, 4.53824e-16); - funcEff[1] = new TF1("funcEff1", "[0]+[1]*x+[2]*(2*x*x - 1)+[3]*(4*x*x*x - 3*x)+[4]*(8*x*x*x*x - 8*x*x + 1)", 0, 3000); - funcEff[1]->SetParameters(0.7742102264, -2.50337e-05, -1.12602e-09, -1.38765e-12, 3.86733e-16); - funcEff[2] = new TF1("funcEff2", "[0]+[1]*x+[2]*(2*x*x - 1)+[3]*(4*x*x*x - 3*x)+[4]*(8*x*x*x*x - 8*x*x + 1)", 0, 3000); - funcEff[2]->SetParameters(0.7933082148, -2.24092e-05, -2.55079e-09, -8.59327e-13, 3.1966e-16); - funcEff[3] = new TF1("funcEff3", "[0]+[1]*x+[2]*(2*x*x - 1)+[3]*(4*x*x*x - 3*x)+[4]*(8*x*x*x*x - 8*x*x + 1)", 0, 3000); - funcEff[3]->SetParameters(0.8084143879, -1.88185e-05, -3.26378e-09, -6.57021e-13, 2.92597e-16); - funcEff[4] = new TF1("funcEff4", "[0]+[1]*x+[2]*(2*x*x - 1)+[3]*(4*x*x*x - 3*x)+[4]*(8*x*x*x*x - 8*x*x + 1)", 0, 3000); - funcEff[4]->SetParameters(0.8160584679, -4.0401e-06, -1.5118e-08, 3.22423e-12, -1.21729e-16); - funcEff[5] = new TF1("funcEff5", "[0]+[1]*x+[2]*(2*x*x - 1)+[3]*(4*x*x*x - 3*x)+[4]*(8*x*x*x*x - 8*x*x + 1)", 0, 3000); - funcEff[5]->SetParameters(0.8245747952, -1.88827e-05, 9.88837e-10, -2.23894e-12, 4.62594e-16); - funcEff[6] = new TF1("funcEff6", "[0]+[1]*x+[2]*(2*x*x - 1)+[3]*(4*x*x*x - 3*x)+[4]*(8*x*x*x*x - 8*x*x + 1)", 0, 3000); - funcEff[6]->SetParameters(0.8277255051, -1.07687e-05, -3.9408e-09, -8.7277e-13, 3.3104e-16); + funcEff[0] = new TF1("funcEff0", "[0]+[1]*x", 0, 3000); + funcEff[0]->SetParameters(0.736274, -2.26721e-05 * cfgUseEPEffSlopeFactor); + funcEff[1] = new TF1("funcEff1", "[0]+[1]*x", 0, 3000); + funcEff[1]->SetParameters(0.773396, -2.79496e-05 * cfgUseEPEffSlopeFactor); + funcEff[2] = new TF1("funcEff2", "[0]+[1]*x", 0, 3000); + funcEff[2]->SetParameters(0.792831, -2.69748e-05 * cfgUseEPEffSlopeFactor); + funcEff[3] = new TF1("funcEff3", "[0]+[1]*x", 0, 3000); + funcEff[3]->SetParameters(0.808402, -2.48438e-05 * cfgUseEPEffSlopeFactor); + funcEff[4] = new TF1("funcEff4", "[0]+[1]*x", 0, 3000); + funcEff[4]->SetParameters(0.817907, -2.31138e-05 * cfgUseEPEffSlopeFactor); + funcEff[5] = new TF1("funcEff5", "[0]+[1]*x", 0, 3000); + funcEff[5]->SetParameters(0.82473, -2.20517e-05 * cfgUseEPEffSlopeFactor); + funcEff[6] = new TF1("funcEff6", "[0]+[1]*x", 0, 3000); + funcEff[6]->SetParameters(0.829151, -2.0758e-05 * cfgUseEPEffSlopeFactor); funcV2 = new TF1("funcV2", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); funcV2->SetParameters(0.0186111, 0.00351907, -4.38264e-05, 1.35383e-07, -3.96266e-10); funcV3 = new TF1("funcV3", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); @@ -749,7 +750,10 @@ struct FlowQa { int pTBinForEff = hFindPtBin->FindBin(track.pt()); if (pTBinForEff >= 1 && pTBinForEff <= 7) { wEPeff = funcEff[pTBinForEff - 1]->Eval(fphi * tracks.size()); - weff *= wEPeff; + if (wEPeff > 0.) { + wEPeff = 1. / wEPeff; + weff *= wEPeff; + } } } registry.fill(HIST("hPt"), track.pt()); From 76ead5a735d1f04cdf746ba86ce7ce1360c02f00 Mon Sep 17 00:00:00 2001 From: Swati <69241911+SwatiSaha-1997@users.noreply.github.com> Date: Sun, 9 Mar 2025 04:04:33 +0530 Subject: [PATCH 0616/1650] [PWGCF] [PWGCF]removed derived data (#10410) --- .../Tasks/netprotonCumulantsMc.cxx | 69 ------------------- 1 file changed, 69 deletions(-) diff --git a/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx b/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx index 91070889b55..99b775a0203 100644 --- a/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx @@ -56,62 +56,6 @@ #include #include -namespace o2::aod -{ - -namespace gen_ebyecolltable -{ -DECLARE_SOA_COLUMN(CentralityGen, centralityGen, float); -DECLARE_SOA_COLUMN(NetProtNoGen, netProtNoGen, float); //! net proton no. in an event -DECLARE_SOA_COLUMN(ProtNoGen, protNoGen, float); //! proton no. in an event -DECLARE_SOA_COLUMN(AntiProtNoGen, antiProtNoGen, float); //! antiproton no. in an event -} // namespace gen_ebyecolltable - -DECLARE_SOA_TABLE(ProtGenCollEbyeTables, "AOD", "PROTGENCOLLEBYETABLE", - gen_ebyecolltable::CentralityGen, - gen_ebyecolltable::NetProtNoGen, - gen_ebyecolltable::ProtNoGen, - gen_ebyecolltable::AntiProtNoGen); -using ProtGenCollEbyeTable = ProtGenCollEbyeTables::iterator; - -namespace rec_ebyecolltable -{ -DECLARE_SOA_COLUMN(CentralityRec, centralityRec, float); -DECLARE_SOA_COLUMN(NetProtNoRec, netProtNoRec, float); //! net proton no. in an event -DECLARE_SOA_COLUMN(ProtNoRec, protNoRec, float); //! proton no. in an event -DECLARE_SOA_COLUMN(AntiProtNoRec, antiProtNoRec, float); //! antiproton no. in an event -} // namespace rec_ebyecolltable - -DECLARE_SOA_TABLE(ProtRecCollEbyeTables, "AOD", "PROTRECCOLLEBYETABLE", - rec_ebyecolltable::CentralityRec, - rec_ebyecolltable::NetProtNoRec, - rec_ebyecolltable::ProtNoRec, - rec_ebyecolltable::AntiProtNoRec); -using ProtRecCollEbyeTable = ProtRecCollEbyeTables::iterator; - -DECLARE_SOA_TABLE(RecCollTables, "AOD", "RECCOLLTABLE", - o2::soa::Index<>, - rec_ebyecolltable::CentralityRec); -using RecCollTable = RecCollTables::iterator; - -namespace rec_ebyetracktable -{ -DECLARE_SOA_INDEX_COLUMN(RecCollTable, recCollTable); -DECLARE_SOA_COLUMN(Pt, pt, float); -DECLARE_SOA_COLUMN(Eta, eta, float); -DECLARE_SOA_COLUMN(Charge, charge, int); -} // namespace rec_ebyetracktable - -DECLARE_SOA_TABLE(ProtRecCompleteEbyeTables, "AOD", "PROTRECCOMPLETEEBYETABLE", - o2::soa::Index<>, - rec_ebyetracktable::RecCollTableId, - rec_ebyetracktable::Pt, - rec_ebyetracktable::Eta, - rec_ebyetracktable::Charge); -using ProtRecCompleteEbyeTable = ProtRecCompleteEbyeTables::iterator; - -} // namespace o2::aod - using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; @@ -991,8 +935,6 @@ struct NetprotonCumulantsMc { } } - Produces genEbyeCollisions; //! MC Gen table creation - void processMCGen(aod::McCollision const& mcCollision, aod::McParticles const& mcParticles, const soa::SmallGroups& collisions) { histos.fill(HIST("hMC"), 0.5); @@ -1085,7 +1027,6 @@ struct NetprotonCumulantsMc { histos.fill(HIST("hgenProfileTotalProton"), cent, (nProt + nAntiprot)); histos.fill(HIST("hgenProfileProton"), cent, nProt); histos.fill(HIST("hgenProfileAntiproton"), cent, nAntiprot); - genEbyeCollisions(cent, netProt, nProt, nAntiprot); // Profiles for generated level cumulants //------------------------------------------------------------------------------------------- @@ -1119,10 +1060,6 @@ struct NetprotonCumulantsMc { } PROCESS_SWITCH(NetprotonCumulantsMc, processMCGen, "Process Generated", true); - Produces recEbyeCollisions; //! MC Rec table creation - Produces recCollisions; //! MC Rec table creation - Produces recEbyeCompleteCollisions; //! MC Rec table creation with tracks - void processMCRec(MyMCRecCollision const& collision, MyMCTracks const& tracks, aod::McCollisions const&, aod::McParticles const&) { if (!collision.has_mcCollision()) { @@ -1147,7 +1084,6 @@ struct NetprotonCumulantsMc { histos.fill(HIST("hCentrec"), cent); histos.fill(HIST("hMC"), 5.5); histos.fill(HIST("hZvtx_after_sel"), collision.posZ()); - recCollisions(cent); float nProt = 0.0; float nAntiprot = 0.0; @@ -1207,7 +1143,6 @@ struct NetprotonCumulantsMc { trackSelected = selectionPIDold(track); if (trackSelected) { - recEbyeCompleteCollisions(recCollisions.lastIndex(), particle.pt(), particle.eta(), track.sign()); // filling nSigma distribution histos.fill(HIST("h2DnsigmaTpcVsPt"), track.pt(), track.tpcNSigmaPr()); histos.fill(HIST("h2DnsigmaTofVsPt"), track.pt(), track.tofNSigmaPr()); @@ -1271,7 +1206,6 @@ struct NetprotonCumulantsMc { histos.fill(HIST("hCorrProfileTotalProton"), cent, (powerEffProt[1] + powerEffAntiprot[1])); histos.fill(HIST("hCorrProfileProton"), cent, powerEffProt[1]); histos.fill(HIST("hCorrProfileAntiproton"), cent, powerEffAntiprot[1]); - recEbyeCollisions(cent, netProt, nProt, nAntiprot); // Calculating q_{r,s} as required for (int i = 1; i < 7; i++) { @@ -2091,7 +2025,6 @@ struct NetprotonCumulantsMc { // variables auto cent = coll.centFT0M(); histos.fill(HIST("hCentrec"), cent); - recCollisions(cent); float nProt = 0.0; float nAntiprot = 0.0; @@ -2143,7 +2076,6 @@ struct NetprotonCumulantsMc { trackSelected = selectionPIDold(track); if (trackSelected) { - recEbyeCompleteCollisions(recCollisions.lastIndex(), track.pt(), track.eta(), track.sign()); // filling nSigma distribution histos.fill(HIST("h2DnsigmaTpcVsPt"), track.pt(), track.tpcNSigmaPr()); histos.fill(HIST("h2DnsigmaTofVsPt"), track.pt(), track.tofNSigmaPr()); @@ -2200,7 +2132,6 @@ struct NetprotonCumulantsMc { histos.fill(HIST("hCorrProfileTotalProton"), cent, (powerEffProt[1] + powerEffAntiprot[1])); histos.fill(HIST("hCorrProfileProton"), cent, powerEffProt[1]); histos.fill(HIST("hCorrProfileAntiproton"), cent, powerEffAntiprot[1]); - recEbyeCollisions(cent, netProt, nProt, nAntiprot); // Calculating q_{r,s} as required for (int i = 1; i < 7; i++) { From 75172ec970c5e04f0cd30a2017c5b1f6691b5f9c Mon Sep 17 00:00:00 2001 From: Tanu Gahlaut <154991749+TGahlaut1@users.noreply.github.com> Date: Sun, 9 Mar 2025 04:09:19 +0530 Subject: [PATCH 0617/1650] [PWGCF] Add ccdb object for efficiency correction (#10413) --- PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx | 199 +++++++++--------- 1 file changed, 99 insertions(+), 100 deletions(-) diff --git a/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx b/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx index 2349f00b50b..22256cbb2ab 100644 --- a/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx @@ -18,6 +18,7 @@ #include #include +#include #include #include "Framework/runDataProcessing.h" @@ -34,6 +35,7 @@ #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/Centrality.h" #include "Common/Core/RecoDecay.h" +#include "CCDB/BasicCCDBManager.h" using namespace o2; using namespace o2::framework; @@ -70,10 +72,14 @@ struct MeanPtFlucId { Configurable cfgCutKaP3{"cfgCutKaP3", 1.2, "kaon p cut-3"}; Configurable cfgCutPrP1{"cfgCutPrP1", 0.9, "proton p cut-1"}; Configurable cfgCutPrP2{"cfgCutPrP2", 1.0, "proton p cut-2"}; - Configurable cfgCorrection{"cfgCorrection", true, "Efficiency Correction"}; - Configurable cfgCorrectionPID{"cfgCorrectionPID", true, "ID particles Efficiency Correction"}; - Configurable cfgCorrectionPtRap{"cfgCorrectionPtRap", false, "Efficiency Correction for pT and eta"}; - Configurable cfgCorrectionPtRapPID{"cfgCorrectionPtRapPID", false, "ID particles Efficiency Correction for pT and eta"}; + Configurable cfgLoadEff{"cfgLoadEff", true, "Load efficiency"}; + Configurable cfgEffPtCh{"cfgEffPtCh", true, "Efficiency correction (pT) for charged particles"}; + Configurable cfgEffPtPi{"cfgEffPtPi", true, "Efficiency correction (pT) for pions"}; + Configurable cfgEffPtKa{"cfgEffPtKa", true, "Efficiency correction (pT) for kaons"}; + Configurable cfgEffPtPr{"cfgEffPtPr", true, "Efficiency correction (pT) for protons"}; + Configurable cfgEffPtYPi{"cfgEffPtYPi", true, "Efficiency correction (pT, y) for pions"}; + Configurable cfgEffPtYKa{"cfgEffPtYKa", true, "Efficiency correction (pT, y) for kaons"}; + Configurable cfgEffPtYPr{"cfgEffPtYPr", true, "Efficiency correction (pT, y) for protons"}; Configurable cfgPidCut{"cfgPidCut", false, ""}; Configurable cfgPDGCodeOnly{"cfgPDGCodeOnly", true, ""}; Configurable cfgMCReco{"cfgMCReco", false, ""}; @@ -99,13 +105,13 @@ struct MeanPtFlucId { Configurable> ptBins{"ptBins", {0.15, 0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50, 0.55, 0.60, 0.65, 0.70, 0.75, 0.80, 0.85, 0.90, 0.95, 1.00, 1.05, 1.10, 1.15, 1.20, 1.25, 1.30, 1.35, 1.40, 1.45, 1.50, 1.55, 1.60, 1.65, 1.70, 1.75, 1.80, 1.85, 1.90, 1.95, 2.00}, "p_{T} bins"}; Configurable> etaBins{"etaBins", {-0.8, -0.75, -0.7, -0.65, -0.6, -0.55, -0.5, -0.45, -0.4, -0.35, -0.3, -0.25, -0.2, -0.15, -0.1, -0.05, 0.0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8}, "#eta bins"}; Configurable> rapBins{"rapBins", {-0.6, -0.55, -0.5, -0.45, -0.4, -0.35, -0.3, -0.25, -0.2, -0.15, -0.1, -0.05, 0.0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6}, "#rap bins"}; - Configurable> effValuesCh{"effValuesCh", {0, 0.429014, 0.487349, 0.491862, 0.487173, 0.493464, 0.502531, 0.510066, 0.517214, 0.524902, 0.529725, 0.537065, 0.542265, 0.546103, 0.549713, 0.555139, 0.55158, 0.562156, 0.563038, 0.568055, 0.570847, 0.580461, 0.580406, 0.585776, 0.587068, 0.598144, 0.590378, 0.609363, 0.607307, 0.604931, 0.6011, 0.593467, 0.61525, 0.61393, 0.61495, 0.610359, 0.622616}, "effeciency values for Charged Particles"}; - Configurable> effPtValuesPi{"effPtValuesPi", {0, 0.410663, 0.480289, 0.494895, 0.487076, 0.489786, 0.49886, 0.493927, 0.39043, 0.243861, 0.238888, 0.229684, 0.232042, 0.236374, 0.240662, 0.243322, 0.244936, 0.247454, 0.250458, 0.251617, 0.255598, 0.258227, 0.262528, 0.266772, 0.272183, 0.279049, 0.279705, 0.283223, 0.285635, 0.287154, 0.288375, 0.291491, 0.294697, 0.295954, 0.298417, 0.304913, 0.31268}, "effeciency values for Pions"}; - Configurable> effPtRapValuesPi{"effPtRapValuesPi", {0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5515, 0.5339, 0.5204, 0.5122, 0.5071, 0.5179, 0.4312, 0.2341, 0.2669, 0.2606, 0.2483, 0.2551, 0.2536, 0.2605, 0.2621, 0.2646, 0.2654, 0.2783, 0.2767, 0.2868, 0.2924, 0.2871, 0.3049, 0.3052, 0.3075, 0.3031, 0.3160, 0.2992, 0.3131, 0.3090, 0.3215, 0.3294, 0.3211, 0.3354, 0.3489, 0.3483, 0.0000, 0.5485, 0.5303, 0.5227, 0.5120, 0.5096, 0.5167, 0.5028, 0.2424, 0.2605, 0.2525, 0.2403, 0.2457, 0.2476, 0.2480, 0.2518, 0.2536, 0.2566, 0.2577, 0.2618, 0.2598, 0.2632, 0.2792, 0.2768, 0.2865, 0.2797, 0.2885, 0.2976, 0.3001, 0.2950, 0.2927, 0.2926, 0.3179, 0.3063, 0.3083, 0.3224, 0.3266, 0.0000, 0.5348, 0.5284, 0.5193, 0.5115, 0.5132, 0.5205, 0.5248, 0.2876, 0.2646, 0.2592, 0.2533, 0.2574, 0.2596, 0.2653, 0.2700, 0.2693, 0.2750, 0.2897, 0.2815, 0.2855, 0.2882, 0.2946, 0.3091, 0.3090, 0.3212, 0.3181, 0.3212, 0.3242, 0.3234, 0.3339, 0.3299, 0.3373, 0.3367, 0.3349, 0.3436, 0.3658, 0.0000, 0.4804, 0.5192, 0.5200, 0.5127, 0.5142, 0.5205, 0.5251, 0.3668, 0.2952, 0.2831, 0.2745, 0.2764, 0.2823, 0.2872, 0.2898, 0.2871, 0.2919, 0.2955, 0.2993, 0.3029, 0.3082, 0.3162, 0.3135, 0.3298, 0.3314, 0.3362, 0.3339, 0.3412, 0.3307, 0.3402, 0.3282, 0.3472, 0.3743, 0.3436, 0.3606, 0.3546, 0.0000, 0.4305, 0.5050, 0.5156, 0.5141, 0.5118, 0.5180, 0.5228, 0.4094, 0.2868, 0.2791, 0.2660, 0.2683, 0.2718, 0.2772, 0.2758, 0.2782, 0.2824, 0.2818, 0.2874, 0.2870, 0.2836, 0.2885, 0.3005, 0.3003, 0.3145, 0.3158, 0.3055, 0.3081, 0.3207, 0.3314, 0.3149, 0.3277, 0.3208, 0.3137, 0.3477, 0.3461, 0.0000, 0.4123, 0.4795, 0.5125, 0.5081, 0.5123, 0.5177, 0.5244, 0.4448, 0.2584, 0.2504, 0.2404, 0.2400, 0.2446, 0.2508, 0.2585, 0.2568, 0.2574, 0.2601, 0.2638, 0.2690, 0.2664, 0.2763, 0.2775, 0.2806, 0.2903, 0.2899, 0.2879, 0.2971, 0.3041, 0.2923, 0.3003, 0.3067, 0.3065, 0.3033, 0.2982, 0.3242, 0.0000, 0.4040, 0.4701, 0.5105, 0.5075, 0.5090, 0.5166, 0.5209, 0.4723, 0.2242, 0.2254, 0.2157, 0.2246, 0.2245, 0.2373, 0.2323, 0.2372, 0.2460, 0.2432, 0.2445, 0.2504, 0.2522, 0.2524, 0.2655, 0.2600, 0.2828, 0.2843, 0.2877, 0.2889, 0.2957, 0.2945, 0.3053, 0.3077, 0.2982, 0.3068, 0.3066, 0.3109, 0.0000, 0.4032, 0.4926, 0.5108, 0.4975, 0.4988, 0.5093, 0.5165, 0.4915, 0.2091, 0.2115, 0.1980, 0.2030, 0.2104, 0.2097, 0.2184, 0.2138, 0.2194, 0.2172, 0.2176, 0.2270, 0.2257, 0.2313, 0.2318, 0.2412, 0.2447, 0.2391, 0.2605, 0.2514, 0.2627, 0.2575, 0.2598, 0.2555, 0.2646, 0.2699, 0.2721, 0.2679, 0.0000, 0.3451, 0.4420, 0.4600, 0.4475, 0.4581, 0.4718, 0.4745, 0.4725, 0.1812, 0.1765, 0.1678, 0.1677, 0.1730, 0.1761, 0.1762, 0.1789, 0.1776, 0.1796, 0.1835, 0.1795, 0.1874, 0.1881, 0.1870, 0.1920, 0.1917, 0.1999, 0.2101, 0.2099, 0.2083, 0.2141, 0.2171, 0.2097, 0.2108, 0.2074, 0.2140, 0.2060, 0.0000, 0.2712, 0.3687, 0.4008, 0.3954, 0.4089, 0.4173, 0.4276, 0.4311, 0.1215, 0.1171, 0.1121, 0.1130, 0.1175, 0.1203, 0.1243, 0.1227, 0.1249, 0.1275, 0.1210, 0.1237, 0.1244, 0.1309, 0.1283, 0.1346, 0.1415, 0.1446, 0.1448, 0.1364, 0.1478, 0.1465, 0.1435, 0.1551, 0.1388, 0.1463, 0.1488, 0.1411, 0.0000, 0.2700, 0.3726, 0.4012, 0.3999, 0.4128, 0.4228, 0.4307, 0.4341, 0.1343, 0.1344, 0.1293, 0.1254, 0.1290, 0.1307, 0.1342, 0.1328, 0.1394, 0.1400, 0.1359, 0.1423, 0.1383, 0.1482, 0.1471, 0.1517, 0.1492, 0.1599, 0.1516, 0.1568, 0.1603, 0.1635, 0.1599, 0.1606, 0.1603, 0.1598, 0.1729, 0.1660, 0.0000, 0.3252, 0.4427, 0.4683, 0.4525, 0.4645, 0.4751, 0.4804, 0.4789, 0.1826, 0.1817, 0.1737, 0.1719, 0.1753, 0.1784, 0.1813, 0.1846, 0.1799, 0.1903, 0.1841, 0.1909, 0.1912, 0.1969, 0.1885, 0.2016, 0.2069, 0.2072, 0.1970, 0.2125, 0.2100, 0.2110, 0.2168, 0.2154, 0.2173, 0.2194, 0.2248, 0.2107, 0.0000, 0.3561, 0.4868, 0.5036, 0.4920, 0.4958, 0.5034, 0.5112, 0.4861, 0.1933, 0.1911, 0.1848, 0.1879, 0.1946, 0.1951, 0.1994, 0.2005, 0.2016, 0.2030, 0.2010, 0.2057, 0.2074, 0.2175, 0.2217, 0.2154, 0.2363, 0.2318, 0.2403, 0.2396, 0.2342, 0.2434, 0.2385, 0.2441, 0.2380, 0.2486, 0.2488, 0.2550, 0.0000, 0.3630, 0.4654, 0.5047, 0.4980, 0.5007, 0.5093, 0.5194, 0.4649, 0.2338, 0.2319, 0.2199, 0.2245, 0.2286, 0.2332, 0.2378, 0.2368, 0.2405, 0.2390, 0.2432, 0.2463, 0.2499, 0.2562, 0.2581, 0.2576, 0.2713, 0.2778, 0.2863, 0.2819, 0.2895, 0.2963, 0.2897, 0.2830, 0.2869, 0.3009, 0.2923, 0.3181, 0.0000, 0.3910, 0.4739, 0.5051, 0.5008, 0.5014, 0.5108, 0.5198, 0.4457, 0.2904, 0.2829, 0.2752, 0.2773, 0.2820, 0.2859, 0.2957, 0.2936, 0.2957, 0.2982, 0.2976, 0.3007, 0.3072, 0.3058, 0.3202, 0.3237, 0.3326, 0.3293, 0.3305, 0.3464, 0.3396, 0.3269, 0.3417, 0.3478, 0.3430, 0.3472, 0.3433, 0.3875, 0.0000, 0.4216, 0.4936, 0.5101, 0.5054, 0.5005, 0.5077, 0.5101, 0.4259, 0.3187, 0.3101, 0.2967, 0.3010, 0.3035, 0.3102, 0.3110, 0.3129, 0.3144, 0.3174, 0.3242, 0.3323, 0.3322, 0.3300, 0.3343, 0.3475, 0.3521, 0.3429, 0.3491, 0.3592, 0.3700, 0.3532, 0.3806, 0.3486, 0.3671, 0.3798, 0.3808, 0.3984, 0.0000, 0.4694, 0.5071, 0.5102, 0.5025, 0.5013, 0.5107, 0.5136, 0.3797, 0.3257, 0.3214, 0.3061, 0.3098, 0.3152, 0.3253, 0.3237, 0.3291, 0.3315, 0.3303, 0.3439, 0.3409, 0.3513, 0.3532, 0.3582, 0.3686, 0.3700, 0.3796, 0.3664, 0.3786, 0.3741, 0.3801, 0.3896, 0.3939, 0.4071, 0.3942, 0.4073, 0.4455, 0.0000, 0.5246, 0.5206, 0.5129, 0.5007, 0.5011, 0.5094, 0.5149, 0.3079, 0.2997, 0.2948, 0.2844, 0.2866, 0.2993, 0.3000, 0.3032, 0.3064, 0.3106, 0.3177, 0.3176, 0.3225, 0.3319, 0.3317, 0.3378, 0.3507, 0.3551, 0.3456, 0.3625, 0.3698, 0.3570, 0.3629, 0.3669, 0.3698, 0.3725, 0.3997, 0.3872, 0.4163, 0.0000, 0.5407, 0.5209, 0.5114, 0.5037, 0.4997, 0.5077, 0.4915, 0.2569, 0.2815, 0.2731, 0.2669, 0.2652, 0.2720, 0.2759, 0.2745, 0.2815, 0.2831, 0.2866, 0.2906, 0.2964, 0.2956, 0.3009, 0.3031, 0.3165, 0.3142, 0.3134, 0.3305, 0.3323, 0.3246, 0.3320, 0.3324, 0.3317, 0.3358, 0.3507, 0.3684, 0.3533, 0.0000, 0.5404, 0.5250, 0.5098, 0.4997, 0.4998, 0.5077, 0.4251, 0.2495, 0.2793, 0.2713, 0.2659, 0.2699, 0.2746, 0.2803, 0.2778, 0.2893, 0.2850, 0.2897, 0.2942, 0.3007, 0.3040, 0.3041, 0.3162, 0.3166, 0.3187, 0.3330, 0.3217, 0.3301, 0.3321, 0.3279, 0.3316, 0.3490, 0.3509, 0.3387, 0.3445, 0.3634, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000}, "pT rap effeciency values for Pions"}; - Configurable> effPtValuesKa{"effPtValuesKa", {0, 0, 0, 0.328845, 0.379771, 0.390088, 0.403074, 0.35504, 0.256438, 0.131726, 0.13796, 0.140295, 0.147229, 0.156968, 0.162245, 0.171312, 0.175851, 0.185823, 0.188763, 0.193965, 0.192999, 0.191121, 0.195547, 0.210082, 0.217502, 0.232456, 0.245035, 0.254051, 0.268206, 0.274664, 0.290428, 0.294979, 0.304817, 0.324206, 0.342578, 0.36466, 0.394134}, "effeciency values for Kaons"}; - Configurable> effPtRapValuesKa{"effPtRapValuesKa", {0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1708, 0.4335, 0.4545, 0.4420, 0.1393, 0.1644, 0.1837, 0.1891, 0.1730, 0.1792, 0.1780, 0.1921, 0.2063, 0.2119, 0.2194, 0.2169, 0.2148, 0.2454, 0.2667, 0.2636, 0.2991, 0.2966, 0.3119, 0.3211, 0.3646, 0.3758, 0.3564, 0.4048, 0.3969, 0.4409, 0.5256, 0.5629, 0.4932, 0.5719, 0.0000, 0.0000, 0.0000, 0.4053, 0.4337, 0.4542, 0.4876, 0.2247, 0.1282, 0.1516, 0.1638, 0.1677, 0.1906, 0.2053, 0.2125, 0.2182, 0.2249, 0.2646, 0.2576, 0.2416, 0.2359, 0.2702, 0.2548, 0.2632, 0.2773, 0.3115, 0.3361, 0.3433, 0.3307, 0.3315, 0.3551, 0.3973, 0.4025, 0.4464, 0.4720, 0.5050, 0.5728, 0.0000, 0.0000, 0.0000, 0.3984, 0.4181, 0.4463, 0.4955, 0.3615, 0.1372, 0.1724, 0.1809, 0.1746, 0.1818, 0.1983, 0.2034, 0.2147, 0.2183, 0.2393, 0.2340, 0.2475, 0.2407, 0.2593, 0.2535, 0.2881, 0.2937, 0.2890, 0.3213, 0.3390, 0.3874, 0.4076, 0.4169, 0.3844, 0.4156, 0.4187, 0.5110, 0.5493, 0.5637, 0.0000, 0.0000, 0.0000, 0.4007, 0.4279, 0.4688, 0.4743, 0.4937, 0.1448, 0.1657, 0.1785, 0.1745, 0.1932, 0.2011, 0.2124, 0.2352, 0.2525, 0.2666, 0.2588, 0.2606, 0.2572, 0.2815, 0.2798, 0.2723, 0.2941, 0.3335, 0.3499, 0.3584, 0.3652, 0.4144, 0.3913, 0.4103, 0.4382, 0.4465, 0.4678, 0.5728, 0.5711, 0.0000, 0.0000, 0.0000, 0.4034, 0.4151, 0.4528, 0.4750, 0.5040, 0.2426, 0.1757, 0.1878, 0.1925, 0.2072, 0.2163, 0.2324, 0.2341, 0.2454, 0.2518, 0.2536, 0.2594, 0.2582, 0.2539, 0.2748, 0.2852, 0.2943, 0.3057, 0.3257, 0.3241, 0.3396, 0.3600, 0.3829, 0.4030, 0.3686, 0.3908, 0.4253, 0.4945, 0.5103, 0.0000, 0.0000, 0.0000, 0.3771, 0.4078, 0.4427, 0.4754, 0.5002, 0.3424, 0.1813, 0.1800, 0.1752, 0.1901, 0.1969, 0.1953, 0.2109, 0.2141, 0.2267, 0.2454, 0.2449, 0.2289, 0.2175, 0.2293, 0.2378, 0.2566, 0.2751, 0.2839, 0.2974, 0.3152, 0.3452, 0.3383, 0.3693, 0.3381, 0.4057, 0.3908, 0.4271, 0.4690, 0.0000, 0.0000, 0.0000, 0.3691, 0.4237, 0.4247, 0.4536, 0.4860, 0.4040, 0.1578, 0.1594, 0.1746, 0.1767, 0.1910, 0.2006, 0.2116, 0.1968, 0.2359, 0.2172, 0.2323, 0.2505, 0.2133, 0.2216, 0.2375, 0.2630, 0.2904, 0.2968, 0.3123, 0.3354, 0.3172, 0.3454, 0.3736, 0.3438, 0.3865, 0.3849, 0.4442, 0.4483, 0.0000, 0.0000, 0.0000, 0.3577, 0.4094, 0.4182, 0.4579, 0.4832, 0.4525, 0.1238, 0.1379, 0.1448, 0.1520, 0.1617, 0.1719, 0.1874, 0.1899, 0.2010, 0.2061, 0.2279, 0.2171, 0.1931, 0.2008, 0.2138, 0.2298, 0.2520, 0.2500, 0.2984, 0.3012, 0.2999, 0.3226, 0.2992, 0.3212, 0.3450, 0.3548, 0.3536, 0.3941, 0.0000, 0.0000, 0.0000, 0.3504, 0.3854, 0.3931, 0.4188, 0.4440, 0.4497, 0.1152, 0.1316, 0.1285, 0.1372, 0.1455, 0.1513, 0.1668, 0.1602, 0.1792, 0.1723, 0.1859, 0.1913, 0.1742, 0.1678, 0.1789, 0.1925, 0.2049, 0.2297, 0.2303, 0.2310, 0.2380, 0.2535, 0.2577, 0.2840, 0.3064, 0.2902, 0.3095, 0.3119, 0.0000, 0.0000, 0.0000, 0.2881, 0.3204, 0.3320, 0.3706, 0.3965, 0.4150, 0.0748, 0.0839, 0.0799, 0.0830, 0.0975, 0.0984, 0.1077, 0.1049, 0.1078, 0.1285, 0.1327, 0.1203, 0.1229, 0.1222, 0.1263, 0.1501, 0.1488, 0.1514, 0.1534, 0.1639, 0.1761, 0.1908, 0.1917, 0.1922, 0.1874, 0.2393, 0.2171, 0.2308, 0.0000, 0.0000, 0.0000, 0.2963, 0.3213, 0.3363, 0.3690, 0.3945, 0.4268, 0.0839, 0.0886, 0.0924, 0.1016, 0.1054, 0.1020, 0.1157, 0.1182, 0.1193, 0.1422, 0.1379, 0.1593, 0.1383, 0.1456, 0.1455, 0.1355, 0.1689, 0.1871, 0.1652, 0.1819, 0.1904, 0.2112, 0.2036, 0.2195, 0.2244, 0.2416, 0.2359, 0.2342, 0.0000, 0.0000, 0.0000, 0.3358, 0.3810, 0.3932, 0.4273, 0.4669, 0.4764, 0.1178, 0.1273, 0.1318, 0.1347, 0.1543, 0.1507, 0.1552, 0.1507, 0.1615, 0.1678, 0.1778, 0.1870, 0.1735, 0.1818, 0.1945, 0.2084, 0.2147, 0.2266, 0.2278, 0.2387, 0.2596, 0.2341, 0.2737, 0.2855, 0.2857, 0.2753, 0.2622, 0.3174, 0.0000, 0.0000, 0.0000, 0.3498, 0.3972, 0.4096, 0.4354, 0.4724, 0.4403, 0.1168, 0.1295, 0.1346, 0.1403, 0.1585, 0.1595, 0.1632, 0.1760, 0.1791, 0.1768, 0.2044, 0.2106, 0.1884, 0.1915, 0.2051, 0.2017, 0.2367, 0.2455, 0.2523, 0.2763, 0.2790, 0.2973, 0.2756, 0.2926, 0.3040, 0.3103, 0.3124, 0.3574, 0.0000, 0.0000, 0.0000, 0.3490, 0.4007, 0.4140, 0.4482, 0.4721, 0.3885, 0.1655, 0.1738, 0.1867, 0.1909, 0.2132, 0.2115, 0.2112, 0.2303, 0.2310, 0.2331, 0.2474, 0.2457, 0.2362, 0.2460, 0.2674, 0.2495, 0.2806, 0.3042, 0.3346, 0.3025, 0.3450, 0.3676, 0.3715, 0.3641, 0.3555, 0.4242, 0.4336, 0.4845, 0.0000, 0.0000, 0.0000, 0.3793, 0.4286, 0.4340, 0.4558, 0.4801, 0.3475, 0.1974, 0.2060, 0.2062, 0.2204, 0.2219, 0.2316, 0.2286, 0.2435, 0.2539, 0.2496, 0.2619, 0.2560, 0.2527, 0.2691, 0.2855, 0.3096, 0.2912, 0.3290, 0.3231, 0.3723, 0.3811, 0.4168, 0.4368, 0.4074, 0.4640, 0.4214, 0.4412, 0.6047, 0.0000, 0.0000, 0.0000, 0.3928, 0.4173, 0.4334, 0.4638, 0.5108, 0.2496, 0.1975, 0.2030, 0.2253, 0.2299, 0.2482, 0.2629, 0.2640, 0.2635, 0.2807, 0.3057, 0.3093, 0.2841, 0.2729, 0.2939, 0.3034, 0.3330, 0.3442, 0.3741, 0.3786, 0.3784, 0.4199, 0.4168, 0.4131, 0.4654, 0.4308, 0.4555, 0.5481, 0.5900, 0.0000, 0.0000, 0.0000, 0.4041, 0.4263, 0.4422, 0.4589, 0.4866, 0.1647, 0.1885, 0.1861, 0.1997, 0.2271, 0.2389, 0.2348, 0.2591, 0.2764, 0.2904, 0.3016, 0.3062, 0.2738, 0.2962, 0.3160, 0.3489, 0.3599, 0.3718, 0.3870, 0.4055, 0.4160, 0.4345, 0.4826, 0.4519, 0.4791, 0.4762, 0.5269, 0.6199, 0.6775, 0.0000, 0.0000, 0.0000, 0.4072, 0.4232, 0.4613, 0.4841, 0.3580, 0.1494, 0.1841, 0.1980, 0.2009, 0.1910, 0.2019, 0.2317, 0.2325, 0.2386, 0.2463, 0.2629, 0.2617, 0.2696, 0.2792, 0.2693, 0.3335, 0.2920, 0.3551, 0.3521, 0.4019, 0.4176, 0.3858, 0.4530, 0.4643, 0.4276, 0.5075, 0.5590, 0.5567, 0.6103, 0.0000, 0.0000, 0.0000, 0.4051, 0.4326, 0.4462, 0.4733, 0.2214, 0.1328, 0.1605, 0.1703, 0.1822, 0.1938, 0.2114, 0.2328, 0.2489, 0.2553, 0.2664, 0.2602, 0.2677, 0.2590, 0.2611, 0.2584, 0.3021, 0.3118, 0.3087, 0.3297, 0.3414, 0.3893, 0.3550, 0.3937, 0.4043, 0.4075, 0.4396, 0.5144, 0.5738, 0.5785, 0.0000, 0.0000, 0.0000, 0.1661, 0.4374, 0.4470, 0.4326, 0.1511, 0.1718, 0.2039, 0.1941, 0.1819, 0.1787, 0.1915, 0.1857, 0.2109, 0.2293, 0.2368, 0.2242, 0.2308, 0.2467, 0.2568, 0.2726, 0.2919, 0.3205, 0.3332, 0.3621, 0.3788, 0.3659, 0.4094, 0.4147, 0.4206, 0.4576, 0.5174, 0.5668, 0.5717, 0.6030, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000}, "pT rap effeciency values for Kaons"}; - Configurable> effPtValuesPr{"effPtValuesPr", {0, 0, 0, 0, 0, 0, 0, 0.413799, 0.443597, 0.478144, 0.505512, 0.514127, 0.523279, 0.506121, 0.481129, 0.436858, 0.365426, 0.244158, 0.246106, 0.249133, 0.251019, 0.256516, 0.263027, 0.258241, 0.260814, 0.270519, 0.272534, 0.271853, 0.274523, 0.279029, 0.279756, 0.285479, 0.292531, 0.292348, 0.294704, 0.295867, 0.289818}, "effeciency values for Kaons"}; - Configurable> effPtRapValuesPr{"effPtRapValuesPr", {0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0350, 0.3227, 0.6253, 0.6963, 0.6794, 0.3871, 0.3568, 0.3739, 0.3741, 0.3839, 0.3920, 0.3733, 0.3853, 0.3715, 0.3401, 0.3239, 0.3477, 0.3271, 0.3238, 0.3161, 0.3699, 0.3458, 0.3625, 0.3263, 0.3729, 0.3329, 0.4162, 0.3769, 0.3676, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0083, 0.2461, 0.5721, 0.6271, 0.6475, 0.6854, 0.7333, 0.6264, 0.3574, 0.3284, 0.3125, 0.3068, 0.2907, 0.2901, 0.3157, 0.3290, 0.3605, 0.3312, 0.3321, 0.3806, 0.3699, 0.3328, 0.3790, 0.4218, 0.3560, 0.3815, 0.4224, 0.4084, 0.3966, 0.4242, 0.3494, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1002, 0.4701, 0.5444, 0.6183, 0.6271, 0.6466, 0.6825, 0.7341, 0.7063, 0.4644, 0.3044, 0.3042, 0.3036, 0.3436, 0.3403, 0.3202, 0.3508, 0.3570, 0.3379, 0.3234, 0.3496, 0.3952, 0.3592, 0.3558, 0.3744, 0.3872, 0.3675, 0.4067, 0.3756, 0.3148, 0.3804, 0.3394, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5268, 0.5608, 0.5678, 0.6051, 0.6555, 0.6539, 0.6547, 0.6774, 0.7031, 0.7077, 0.3825, 0.3330, 0.3176, 0.3167, 0.3257, 0.3346, 0.3343, 0.3542, 0.3552, 0.3335, 0.3553, 0.3783, 0.3622, 0.3745, 0.3829, 0.4017, 0.4052, 0.4155, 0.4053, 0.4183, 0.4008, 0.4192, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.4958, 0.5522, 0.5850, 0.6070, 0.6356, 0.6566, 0.6527, 0.6986, 0.7230, 0.7258, 0.5841, 0.3389, 0.3065, 0.3507, 0.3404, 0.3470, 0.3700, 0.3559, 0.4174, 0.3907, 0.3927, 0.4110, 0.3821, 0.4087, 0.3856, 0.4179, 0.3846, 0.4074, 0.3998, 0.4417, 0.4030, 0.3701, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5001, 0.5387, 0.5687, 0.5979, 0.6325, 0.6667, 0.6343, 0.6637, 0.6918, 0.7160, 0.7163, 0.4032, 0.3426, 0.3320, 0.3235, 0.3942, 0.3691, 0.3655, 0.3713, 0.3375, 0.3440, 0.3526, 0.3389, 0.3869, 0.3817, 0.3117, 0.3904, 0.3625, 0.3513, 0.4033, 0.3470, 0.3548, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.4804, 0.5030, 0.5471, 0.6193, 0.6334, 0.6618, 0.6741, 0.6791, 0.7283, 0.7427, 0.7476, 0.5547, 0.3485, 0.3388, 0.3286, 0.3421, 0.3439, 0.3235, 0.3386, 0.3548, 0.3266, 0.3326, 0.3649, 0.3570, 0.3457, 0.3576, 0.3624, 0.3652, 0.4041, 0.3640, 0.3371, 0.3712, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.4419, 0.5043, 0.5513, 0.5806, 0.6186, 0.6703, 0.6720, 0.6886, 0.7436, 0.7489, 0.7714, 0.6523, 0.2967, 0.2818, 0.2935, 0.2928, 0.3057, 0.3124, 0.3170, 0.3149, 0.3148, 0.3017, 0.3070, 0.3154, 0.3342, 0.3592, 0.3378, 0.3462, 0.3262, 0.3199, 0.3758, 0.3140, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.4038, 0.4921, 0.5492, 0.5645, 0.5991, 0.6307, 0.6477, 0.6584, 0.6855, 0.7222, 0.7616, 0.7143, 0.2660, 0.2750, 0.2842, 0.2531, 0.2539, 0.2648, 0.2608, 0.2451, 0.3028, 0.2926, 0.2565, 0.2665, 0.2860, 0.2966, 0.2979, 0.2980, 0.3018, 0.3010, 0.3075, 0.3206, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.3102, 0.4179, 0.4648, 0.5130, 0.5140, 0.5673, 0.6299, 0.5979, 0.6114, 0.6674, 0.7252, 0.6795, 0.1875, 0.1700, 0.1824, 0.1786, 0.1608, 0.1882, 0.1811, 0.1999, 0.2013, 0.1920, 0.1976, 0.1903, 0.1912, 0.2079, 0.2191, 0.2053, 0.1942, 0.1965, 0.2280, 0.1778, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.3163, 0.4231, 0.4802, 0.4893, 0.5333, 0.5497, 0.6038, 0.5997, 0.6288, 0.6778, 0.6772, 0.6903, 0.1937, 0.1960, 0.1922, 0.1820, 0.1821, 0.2076, 0.1988, 0.1971, 0.2013, 0.1875, 0.2262, 0.2070, 0.2248, 0.1937, 0.2380, 0.2450, 0.2245, 0.2393, 0.2302, 0.2090, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.4023, 0.4795, 0.5410, 0.5795, 0.5822, 0.6051, 0.6759, 0.6646, 0.6803, 0.6998, 0.7394, 0.7203, 0.2703, 0.2484, 0.2319, 0.2506, 0.2807, 0.2881, 0.2433, 0.2440, 0.2752, 0.2875, 0.2810, 0.2802, 0.2895, 0.2778, 0.2870, 0.2928, 0.2577, 0.2739, 0.2786, 0.2742, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.4392, 0.5116, 0.5504, 0.5738, 0.6041, 0.6422, 0.6585, 0.6790, 0.7010, 0.7327, 0.7515, 0.6178, 0.2717, 0.2596, 0.2611, 0.2460, 0.2794, 0.2702, 0.2864, 0.2747, 0.2795, 0.2828, 0.2950, 0.2705, 0.2973, 0.2855, 0.2977, 0.2903, 0.2951, 0.3171, 0.3202, 0.2941, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.4439, 0.4995, 0.5408, 0.5552, 0.6285, 0.6429, 0.6630, 0.6641, 0.6801, 0.7234, 0.7430, 0.5295, 0.3723, 0.3488, 0.3658, 0.3605, 0.3756, 0.3643, 0.3665, 0.3644, 0.3818, 0.3922, 0.3707, 0.3767, 0.3660, 0.3812, 0.3982, 0.3818, 0.4121, 0.4057, 0.3821, 0.4087, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.4802, 0.5405, 0.5537, 0.5879, 0.6195, 0.6429, 0.6356, 0.6538, 0.7105, 0.7092, 0.6975, 0.4333, 0.3931, 0.4090, 0.3939, 0.4047, 0.3970, 0.4104, 0.4154, 0.4295, 0.3995, 0.4013, 0.3880, 0.3569, 0.4243, 0.3714, 0.3962, 0.4198, 0.4361, 0.4200, 0.4040, 0.4374, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5116, 0.5483, 0.5715, 0.5935, 0.6488, 0.6416, 0.6203, 0.6435, 0.6814, 0.6855, 0.5243, 0.3995, 0.3796, 0.3779, 0.3840, 0.4065, 0.4174, 0.4472, 0.4030, 0.4281, 0.4814, 0.4217, 0.4567, 0.4689, 0.4117, 0.4286, 0.3991, 0.4668, 0.4786, 0.4416, 0.4254, 0.5134, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.5333, 0.5601, 0.5965, 0.6047, 0.6303, 0.6673, 0.6368, 0.6791, 0.7238, 0.7025, 0.3686, 0.3411, 0.3513, 0.3422, 0.3791, 0.3428, 0.3462, 0.3873, 0.3683, 0.3951, 0.4290, 0.4181, 0.4171, 0.3960, 0.4049, 0.4350, 0.4397, 0.4206, 0.4598, 0.4500, 0.4367, 0.4547, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1062, 0.4560, 0.5766, 0.6264, 0.6540, 0.6394, 0.6296, 0.6780, 0.6934, 0.4543, 0.3003, 0.3125, 0.3187, 0.3339, 0.3645, 0.3697, 0.3436, 0.3927, 0.3516, 0.3489, 0.3887, 0.3933, 0.3978, 0.3986, 0.3764, 0.3722, 0.4232, 0.4170, 0.3918, 0.4188, 0.4411, 0.3808, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0064, 0.2256, 0.5893, 0.6313, 0.6598, 0.6690, 0.7104, 0.6301, 0.3874, 0.3643, 0.3177, 0.2875, 0.2959, 0.2995, 0.2917, 0.3201, 0.3266, 0.3320, 0.3801, 0.3751, 0.3990, 0.3944, 0.3750, 0.3895, 0.3890, 0.3957, 0.3862, 0.4067, 0.4631, 0.3982, 0.4257, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0352, 0.3187, 0.6095, 0.6791, 0.6808, 0.4209, 0.3994, 0.3917, 0.4046, 0.3751, 0.3845, 0.3943, 0.3548, 0.3847, 0.3555, 0.3471, 0.3369, 0.3262, 0.3203, 0.3671, 0.3227, 0.3087, 0.3774, 0.3175, 0.3776, 0.3860, 0.4008, 0.4351, 0.4322, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000}, "pT rap effeciency values for Protons"}; + + Configurable cfgUrlCCDB{"cfgUrlCCDB", "http://ccdb-test.cern.ch:8080", "url of ccdb"}; + Configurable cfgPathCCDB{"cfgPathCCDB", "Users/t/tgahlaut/", "Path for ccdb-object"}; + + Service ccdb; + + std::vector vEff = {"heffPt", "heffPtPi", "heffPtKa", "heffPtPr", "heffPtRapPi", "heffPtRapKa", "heffPtRapPr"}; using MyAllTracks = soa::Join pdg; HistogramRegistry hist{"hist", {}, OutputObjHandlingPolicy::AnalysisObject}; + + TH1D* heffPt = nullptr; + TH1D* heffPtPi = nullptr; + TH1D* heffPtKa = nullptr; + TH1D* heffPtPr = nullptr; + TH2D* heffPtRapPi = nullptr; + TH2D* heffPtRapKa = nullptr; + TH2D* heffPtRapPr = nullptr; + void init(InitContext const&) { + if (cfgLoadEff) { + // Set CCDB url + ccdb->setURL(cfgUrlCCDB.value); + ccdb->setCaching(true); + + TList* lst = ccdb->getForTimeStamp(cfgPathCCDB.value, -1); + heffPt = reinterpret_cast(lst->FindObject("heffPt")); + heffPtPi = reinterpret_cast(lst->FindObject("heffPtPi")); + heffPtKa = reinterpret_cast(lst->FindObject("heffPtKa")); + heffPtPr = reinterpret_cast(lst->FindObject("heffPtPr")); + heffPtRapPi = reinterpret_cast(lst->FindObject("heffPtRapPi")); + heffPtRapKa = reinterpret_cast(lst->FindObject("heffPtRapKa")); + heffPtRapPr = reinterpret_cast(lst->FindObject("heffPtRapPr")); + + if (!heffPt || !heffPtPi || !heffPtKa || !heffPtPr || !heffPtRapPi || !heffPtRapKa || !heffPtRapPr) { + LOGF(info, "FATAL!! Could not find required histograms in CCDB"); + } + } + const AxisSpec axisEvents{10, 0, 10, "Counts"}; const AxisSpec axisEta{etaBins, "#eta"}; const AxisSpec axisPhi{nPhiBins, 0., +7., "#phi (rad)"}; @@ -223,7 +257,7 @@ struct MeanPtFlucId { hist.add("QA/after/h_Pt_weighted", "weighted pT distribution", kTH1D, {axisPt}); hist.add("QA/after/h2_Pt_NFT0M", "p_{T} in Multiplicity Classes ", kTH2D, {{axisPt}, {axisMultFT0M}}); hist.add("QA/after/h2_pt_nch", "Truth", kTH2D, {{axisMult}, {axisPt}}); - hist.add("QA/after/h3_nft0m_pt_nch", "Reco", kTHnSparseD, {axisMult, axisPt, axisMultFT0M}); + hist.add("QA/after/h3_nft0m_pt_nch", "Reco", kTHnSparseD, {{axisMult}, {axisPt}, {axisMultFT0M}}); hist.add("QA/after/h2_pt_nch_prof", "Truth", kTProfile, {axisMult}); hist.add("QA/Pion/before/h2_TPCNsigma", "n #sigma_{TPC}", tpcNSigmaHist); @@ -262,7 +296,7 @@ struct MeanPtFlucId { hist.add("QA/Pion/h2_PtPosTruth_NFT0M", "p_{T} in Multiplicity Classes ", kTH2D, {{axisPt}, {axisMultFT0M}}); hist.add("QA/Pion/h2_PtNegTruth_NFT0M", "p_{T} in Multiplicity Classes ", kTH2D, {{axisPt}, {axisMultFT0M}}); hist.add("QA/Pion/h2_pt_nch", "Reco", kTH2D, {{axisMult}, {axisPt}}); - hist.add("QA/Pion/h3_nft0m_pt_nch", "Reco", kTHnSparseD, {axisMult, axisPt, axisMultFT0M}); + hist.add("QA/Pion/h3_nft0m_pt_nch", "Reco", kTHnSparseD, {{axisMult}, {axisPt}, {axisMultFT0M}}); hist.add("QA/Pion/h2_pt_nch_prof", "Reco", kTProfile, {axisMult}); hist.add("QA/Pion/h2_TPCNsigma", "n #sigma_{TPC}", tpcNSigmaHist); @@ -346,7 +380,7 @@ struct MeanPtFlucId { hist.add("Gen/Charged/h_Mult", "Multiplicity", kTH1D, {axisMult}); hist.add("Gen/Charged/h_Mult_weighted", "Multiplicity", kTH1D, {axisMult}); hist.add("Gen/Charged/h2_pt_nch", "Truth", kTH2D, {{axisMult}, {axisPt}}); - hist.add("Gen/Charged/h3_nft0m_pt_nch", "Truth", kTHnSparseD, {axisMult, axisPt, axisMultFT0M}); + hist.add("Gen/Charged/h3_nft0m_pt_nch", "Truth", kTHnSparseD, {{axisMult}, {axisPt}, {axisMultFT0M}}); hist.add("Gen/Charged/h2_pt_nch_prof", "Truth", kTProfile, {axisMult}); hist.add("Gen/Charged/h_mean_pT", " ", kTH1D, {axisMeanPt}); @@ -614,41 +648,6 @@ struct MeanPtFlucId { return false; } - // To find the pT bin - int findBin(float pT, const std::vector& bins) - { - for (size_t i = 0; i < bins.size() - 1; ++i) { - if (pT >= bins[i] && pT < bins[i + 1]) { - return i; - } - } - return -1; - } - - // Find bin index for both pT and eta - std::pair find2DBin(float pT, float rap, const std::vector& ptBins, const std::vector& rapBins) - { - int ptBin = -1, rapBin = -1; - - // Find pT bin - for (size_t i = 0; i < ptBins.size() - 1; ++i) { - if (pT >= ptBins[i] && pT < ptBins[i + 1]) { - ptBin = i + 1; // ROOT bins start from 1 - break; - } - } - - // Find eta bin - for (size_t j = 0; j < rapBins.size() - 1; ++j) { - if (rap >= rapBins[j] && rap < rapBins[j + 1]) { - rapBin = j + 1; - break; - } - } - - return {ptBin, rapBin}; - } - // Fill hist before selection cuts: template void fillBeforeQAHistos(T const& col, U const& tracks) @@ -751,32 +750,32 @@ struct MeanPtFlucId { Q4 += pt * pt * pt * pt * weight; } - double getCorrectedWeight(const std::vector& ptBins, const std::vector& rapBins, - const std::vector& effPtValues, const std::vector& effPtRapValues, - double pt, double rap, bool cfgCorrectionPtRap, bool cfgCorrection) + float getCorrectedWeight(double pt, double rap, bool cfgEffPtCh, bool cfgEffPtPi, bool cfgEffPtKa, bool cfgEffPtPr, bool cfgEffPtYPi, bool cfgEffPtYKa, bool cfgEffPtYPr) { - double weight = 1.0; - - if (cfgCorrectionPtRap) { - auto [ptBin, rapBin] = find2DBin(pt, rap, ptBins, rapBins); - - if (ptBin != -1 && rapBin != -1) { - int numPtBins = ptBins.size() - 1; // Number of pt bins - double efficiency = effPtRapValues[rapBin * numPtBins + ptBin]; - - if (efficiency > 0) { - weight = 1.0 / efficiency; - } - } - } else if (cfgCorrection) { - int binIndex = findBin(pt, ptBins); - - if (binIndex != -1) { - double efficiency = effPtValues[binIndex]; - if (efficiency > 0) { - weight = 1.0 / efficiency; - } - } + float weight = 1.0; + if (cfgEffPtCh) { + float effPt = heffPt->GetBinContent(heffPt->FindBin(pt)); + weight = 1.0 / effPt; + } else if (cfgEffPtPi) { + float effPtPi = heffPtPi->GetBinContent(heffPtPi->FindBin(pt)); + weight = 1.0 / effPtPi; + } else if (cfgEffPtKa) { + float effPtKa = heffPtKa->GetBinContent(heffPtKa->FindBin(pt)); + weight = 1.0 / effPtKa; + } else if (cfgEffPtPr) { + float effPtPr = heffPtPr->GetBinContent(heffPtPr->FindBin(pt)); + weight = 1.0 / effPtPr; + } else if (cfgEffPtYPi) { + float effPtYPi = heffPtRapPi->GetBinContent(heffPtRapPi->FindBin(rap, pt)); + weight = 1.0 / effPtYPi; + } else if (cfgEffPtYKa) { + float effPtYKa = heffPtRapKa->GetBinContent(heffPtRapKa->FindBin(rap, pt)); + weight = 1.0 / effPtYKa; + } else if (cfgEffPtYPr) { + float effPtYPr = heffPtRapPr->GetBinContent(heffPtRapPr->FindBin(rap, pt)); + weight = 1.0 / effPtYPr; + } else { + weight = 1.0; } return weight; @@ -784,10 +783,10 @@ struct MeanPtFlucId { // Fill after PID cut QA hist: template - void fillIdParticleQAHistos(T const& track, const std::vector& ptBins, const std::vector& rapBins, const std::vector& effPtValues, const std::vector& effPtRapValues, double rap, double nSigmaTPC, double nSigmaTOF, int nFT0M, int& N, int& NW, double& Q1, double& Q2, double& Q3, double& Q4) + void fillIdParticleQAHistos(T const& track, double rap, double nSigmaTPC, double nSigmaTOF, int nFT0M, bool cfgEffPtPi, bool cfgEffPtKa, bool cfgEffPtPr, bool cfgEffPtYPi, bool cfgEffPtYKa, bool cfgEffPtYPr, int& N, int& NW, double& Q1, double& Q2, double& Q3, double& Q4) { double pt = track.pt(); - double weight = getCorrectedWeight(ptBins, rapBins, effPtValues, effPtRapValues, pt, rap, cfgCorrectionPtRapPID, cfgCorrectionPID); + double weight = getCorrectedWeight(pt, rap, false, cfgEffPtPi, cfgEffPtKa, cfgEffPtPr, cfgEffPtYPi, cfgEffPtYKa, cfgEffPtYPr); NW += weight; N++; @@ -985,7 +984,7 @@ struct MeanPtFlucId { if (std::fabs(track.eta()) < 0.8) { ptCh = track.pt(); - double weight = getCorrectedWeight(ptBins, {}, effValuesCh, {}, ptCh, 0.0, false, cfgCorrection); + double weight = getCorrectedWeight(ptCh, 0.0, cfgEffPtCh, false, false, false, false, false, false); nChW += weight; nCh++; hist.fill(HIST("QA/after/h_Pt_weighted"), ptCh, weight); @@ -1006,31 +1005,31 @@ struct MeanPtFlucId { if (cfgSelOR == true && cfgSelAND == false) { if (selLowPi(track) == cfgSelLow || selHighPi(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPi, effPtRapValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi); + fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, cfgEffPtPi, false, false, cfgEffPtYPi, false, false, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi); } } else if (cfgSelOR == false && cfgSelAND == true) { if (selLowPi(track) == cfgSelLow && selHighPi(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPi, effPtRapValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi); + fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, cfgEffPtPi, false, false, cfgEffPtYPi, false, false, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi); } } if (cfgSelOR == true && cfgSelAND == false) { if (selLowKa(track) == cfgSelLow || selHighKa(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesKa, effPtRapValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka); + fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, false, cfgEffPtKa, false, false, cfgEffPtYKa, false, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka); } } else if (cfgSelOR == false && cfgSelAND == true) { if (selLowKa(track) == cfgSelLow && selHighKa(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesKa, effPtRapValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka); + fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, false, cfgEffPtKa, false, false, cfgEffPtYKa, false, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka); } } if (cfgSelOR == true && cfgSelAND == false) { if (selLowPr(track) == cfgSelLow || selHighPr(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPr, effPtRapValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr); + fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, false, false, cfgEffPtPr, false, false, cfgEffPtYPr, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr); } } else if (cfgSelOR == false && cfgSelAND == true) { if (selLowPr(track) == cfgSelLow && selHighPr(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPr, effPtRapValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr); + fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, false, false, cfgEffPtPr, false, false, cfgEffPtYPr, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr); } } } @@ -1074,7 +1073,7 @@ struct MeanPtFlucId { if (std::fabs(track.eta()) < 0.8) { ptCh = track.pt(); - double weight = getCorrectedWeight(ptBins, {}, effValuesCh, {}, ptCh, 0.0, false, cfgCorrection); + double weight = getCorrectedWeight(ptCh, 0.0, cfgEffPtCh, false, false, false, false, false, false); hist.fill(HIST("QA/after/h_Pt_weighted"), ptCh, weight); nChW += weight; nCh++; @@ -1093,21 +1092,21 @@ struct MeanPtFlucId { eta = track.eta(); if (cfgPDGCodeOnly == true) { - if (std::abs(pid) == kPiPlus && std::abs(rapPi) < 0.5 && track.pt() >= cfgCutPiPtMin) { + if (std::abs(pid) == kPiPlus && std::abs(rapPi) < cfgCutRap && track.pt() >= cfgCutPiPtMin) { ptPi = track.pt(); - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPi, effPtRapValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi); + fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, cfgEffPtPi, false, false, cfgEffPtYPi, false, false, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi); fillPtMCHist(ptPi, eta, rapPi, nFT0M, pid, kPiPlus, kPiMinus); } - if (std::abs(pid) == kKPlus && std::abs(rapKa) < 0.5 && track.pt() >= cfgCutKaPtMin) { + if (std::abs(pid) == kKPlus && std::abs(rapKa) < cfgCutRap && track.pt() >= cfgCutKaPtMin) { ptKa = track.pt(); - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesKa, effPtRapValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka); + fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, false, cfgEffPtKa, false, false, cfgEffPtYKa, false, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka); fillPtMCHist(ptKa, eta, rapKa, nFT0M, pid, kKPlus, kKMinus); } - if (std::abs(pid) == kProton && std::abs(rapPr) < 0.5 && track.pt() >= cfgCutPrPtMin) { + if (std::abs(pid) == kProton && std::abs(rapPr) < cfgCutRap && track.pt() >= cfgCutPrPtMin) { ptPr = track.pt(); - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPr, effPtRapValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr); + fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, false, false, cfgEffPtPr, false, false, cfgEffPtYPr, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr); fillPtMCHist(ptPr, eta, rapPr, nFT0M, pid, kProton, kProtonBar); } } @@ -1116,7 +1115,7 @@ struct MeanPtFlucId { if (cfgSelOR == true && cfgSelAND == false) { if (selLowPi(track) == cfgSelLow || selHighPi(track) == cfgSelHigh) { ptPi = track.pt(); - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPi, effPtRapValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi); + fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, cfgEffPtPi, false, false, cfgEffPtYPi, false, false, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi); if (std::abs(pid) == kPiPlus) { fillPtMCHist(ptPi, eta, rapPi, nFT0M, pid, kPiPlus, kPiMinus); } @@ -1124,7 +1123,7 @@ struct MeanPtFlucId { } else if (cfgSelOR == false && cfgSelAND == true) { if (selLowPi(track) == cfgSelLow && selHighPi(track) == cfgSelHigh) { ptPi = track.pt(); - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPi, effPtRapValuesPi, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi); + fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, cfgEffPtPi, false, false, cfgEffPtYPi, false, false, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi); if (std::abs(pid) == kPiPlus) { fillPtMCHist(ptPi, eta, rapPi, nFT0M, pid, kPiPlus, kPiMinus); } @@ -1134,7 +1133,7 @@ struct MeanPtFlucId { if (cfgSelOR == true && cfgSelAND == false) { if (selLowKa(track) == cfgSelLow || selHighKa(track) == cfgSelHigh) { ptKa = track.pt(); - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesKa, effPtRapValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka); + fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, false, cfgEffPtKa, false, false, cfgEffPtYKa, false, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka); if (std::abs(pid) == kKPlus) { fillPtMCHist(ptKa, eta, rapKa, nFT0M, pid, kKPlus, kKMinus); } @@ -1142,7 +1141,7 @@ struct MeanPtFlucId { } else if (cfgSelOR == false && cfgSelAND == true) { if (selLowKa(track) == cfgSelLow && selHighKa(track) == cfgSelHigh) { ptKa = track.pt(); - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesKa, effPtRapValuesKa, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka); + fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, false, cfgEffPtKa, false, false, cfgEffPtYKa, false, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka); if (std::abs(pid) == kKPlus) { fillPtMCHist(ptKa, eta, rapKa, nFT0M, pid, kKPlus, kKMinus); } @@ -1152,7 +1151,7 @@ struct MeanPtFlucId { if (cfgSelOR == true && cfgSelAND == false) { if (selLowPr(track) == cfgSelLow || selHighPr(track) == cfgSelHigh) { ptPr = track.pt(); - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPr, effPtRapValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr); + fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, false, false, cfgEffPtPr, false, false, cfgEffPtYPr, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr); if (std::abs(pid) == kProton) { fillPtMCHist(ptPr, eta, rapPr, nFT0M, pid, kProton, kProtonBar); } @@ -1160,7 +1159,7 @@ struct MeanPtFlucId { } else if (cfgSelOR == false && cfgSelAND == true) { if (selLowPr(track) == cfgSelLow && selHighPr(track) == cfgSelHigh) { ptPr = track.pt(); - fillIdParticleQAHistos(track, ptBins, rapBins, effPtValuesPr, effPtRapValuesPr, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr); + fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, false, false, cfgEffPtPr, false, false, cfgEffPtYPr, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr); if (std::abs(pid) == kProton) { fillPtMCHist(ptPr, eta, rapPr, nFT0M, pid, kProton, kProtonBar); } @@ -1289,7 +1288,7 @@ struct MeanPtFlucId { if (selTrack(track)) { if (std::abs(track.eta()) < 0.8) { double pt = track.pt(); - wghtCh = getCorrectedWeight(ptBins, {}, effValuesCh, {}, pt, 0.0, false, cfgCorrection); + wghtCh = getCorrectedWeight(pt, 0.0, cfgEffPtCh, false, false, false, false, false, false); hist.fill(HIST("QA/after/h2_pt_nch"), nCh, pt, wghtCh); hist.fill(HIST("QA/after/h3_nft0m_pt_nch"), nCh, pt, nFT0M, wghtCh); hist.fill(HIST("QA/after/h2_pt_nch_prof"), nCh, pt, wghtCh); @@ -1297,7 +1296,7 @@ struct MeanPtFlucId { if (selLowPi(track) == cfgSelLow || selHighPi(track) == cfgSelHigh) { ptPi = track.pt(); - wghtPi = getCorrectedWeight(ptBins, rapBins, effPtValuesPi, effPtRapValuesPi, ptPi, rapPi, cfgCorrectionPtRapPID, cfgCorrectionPID); + wghtPi = getCorrectedWeight(ptPi, rapPi, false, cfgEffPtPi, false, false, cfgEffPtYPi, false, false); hist.fill(HIST("QA/Pion/h2_pt_nch"), nPi, ptPi, wghtPi); hist.fill(HIST("QA/Pion/h3_nft0m_pt_nch"), nPi, ptPi, nFT0M, wghtPi); hist.fill(HIST("QA/Pion/h2_pt_nch_prof"), nPi, ptPi, wghtPi); @@ -1305,7 +1304,7 @@ struct MeanPtFlucId { if (selLowKa(track) == cfgSelLow || selHighKa(track) == cfgSelHigh) { ptKa = track.pt(); - wghtKa = getCorrectedWeight(ptBins, rapBins, effPtValuesKa, effPtRapValuesKa, ptKa, rapKa, cfgCorrectionPtRapPID, cfgCorrectionPID); + wghtKa = getCorrectedWeight(ptKa, rapKa, false, false, cfgEffPtKa, false, false, cfgEffPtYKa, false); hist.fill(HIST("QA/Kaon/h2_pt_nch"), nKa, ptKa, wghtKa); hist.fill(HIST("QA/Kaon/h3_nft0m_pt_nch"), nKa, ptKa, nFT0M, wghtKa); hist.fill(HIST("QA/Kaon/h2_pt_nch_prof"), nKa, ptKa, wghtKa); @@ -1313,7 +1312,7 @@ struct MeanPtFlucId { if (selLowPr(track) == cfgSelLow || selHighPr(track) == cfgSelHigh) { ptPr = track.pt(); - wghtPr = getCorrectedWeight(ptBins, rapBins, effPtValuesPr, effPtRapValuesPr, ptPr, rapPr, cfgCorrectionPtRapPID, cfgCorrectionPID); + wghtPr = getCorrectedWeight(ptPr, rapPr, false, false, false, cfgEffPtPr, false, false, cfgEffPtYPr); hist.fill(HIST("QA/Proton/h2_pt_nch"), nPr, ptPr, wghtPr); hist.fill(HIST("QA/Proton/h3_nft0m_pt_nch"), nPr, ptPr, nFT0M, wghtPr); hist.fill(HIST("QA/Proton/h2_pt_nch_prof"), nPr, ptPr, wghtPr); From 0554124990c695686690032cac79f8751983991a Mon Sep 17 00:00:00 2001 From: eloviyo <38348689+Eloviyo@users.noreply.github.com> Date: Sun, 9 Mar 2025 12:03:09 +0100 Subject: [PATCH 0618/1650] [PWGCF] FemtoUniverse cascade task -- implemented Close Pair Rejection for cascade - cascade pairs (#10411) Co-authored-by: Shirajum Monira --- ...toUniversePairTaskTrackCascadeExtended.cxx | 93 ++++++++++++------- 1 file changed, 58 insertions(+), 35 deletions(-) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx index a7a70d3a76f..96cd072d4e4 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx @@ -45,47 +45,54 @@ struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/st using FemtoFullParticles = soa::Join; Preslice perCol = aod::femtouniverseparticle::fdCollisionId; - ConfigurableAxis confChildTempFitVarpTBins{"ConfChildTempFitVarpTBins", {20, 0.5, 4.05}, "V0 child: pT binning of the pT vs. TempFitVar plot"}; // o2-linter: disable=name/configurable - ConfigurableAxis confChildTempFitVarBins{"ConfChildTempFitVarBins", {300, -0.15, 0.15}, "V0 child: binning of the TempFitVar in the pT vs. TempFitVar plot"}; // o2-linter: disable=name/configurable - Configurable confCascInvMassLowLimit{"ConfCascInvMassLowLimit", 1.315, "Lower limit of the Casc invariant mass"}; // o2-linter: disable=name/configurable - Configurable confCascInvMassUpLimit{"ConfCascInvMassUpLimit", 1.325, "Upper limit of the Casc invariant mass"}; // o2-linter: disable=name/configurable - Configurable confCascTranRad{"ConfCascTranRad", 0.5, "Cascade transverse radius"}; // o2-linter: disable=name/configurable + ConfigurableAxis confChildTempFitVarpTBins{"ConfChildTempFitVarpTBins", {20, 0.5, 4.05}, "V0 child: pT binning of the pT vs. TempFitVar plot"}; + ConfigurableAxis confChildTempFitVarBins{"ConfChildTempFitVarBins", {300, -0.15, 0.15}, "V0 child: binning of the TempFitVar in the pT vs. TempFitVar plot"}; + Configurable confCascInvMassLowLimit{"ConfCascInvMassLowLimit", 1.315, "Lower limit of the Casc invariant mass"}; + Configurable confCascInvMassUpLimit{"ConfCascInvMassUpLimit", 1.325, "Upper limit of the Casc invariant mass"}; + Configurable confCascTranRad{"ConfCascTranRad", 0.5, "Cascade transverse radius"}; - Configurable confNSigmaTPCPion{"NSigmaTPCPion", 4, "NSigmaTPCPion"}; // o2-linter: disable=name/configurable - Configurable confNSigmaTPCProton{"NSigmaTPCProton", 4, "NSigmaTPCProton"}; // o2-linter: disable=name/configurable + Configurable confNSigmaTPCPion{"NSigmaTPCPion", 4, "NSigmaTPCPion"}; + Configurable confNSigmaTPCProton{"NSigmaTPCProton", 4, "NSigmaTPCProton"}; /// applying narrow cut - Configurable confZVertexCut{"ConfZVertexCut", 10.f, "Event sel: Maximum z-Vertex (cm)"}; // o2-linter: disable=name/configurable - Configurable confEta{"ConfEta", 0.8, "Eta cut for the global track"}; // o2-linter: disable=name/configurable + Configurable confZVertexCut{"ConfZVertexCut", 10.f, "Event sel: Maximum z-Vertex (cm)"}; + Configurable confEta{"ConfEta", 0.8, "Eta cut for the global track"}; // configurations for correlation part - Configurable confTrackChoicePartOne{"ConfTrackChoicePartOne", 0, "0:Proton, 1:Pion, 2:Kaon"}; // o2-linter: disable=name/configurable - Configurable confTrkPDGCodePartOne{"ConfTrkPDGCodePartOne", 2212, "Particle 1 (Track) - PDG code"}; // o2-linter: disable=name/configurable - Configurable confCascType1{"ConfCascType1", 0, "select one of the V0s (Omega = 0, Xi = 1, anti-Omega = 2, anti-Xi = 3) for track-cascade combination"}; // o2-linter: disable=name/configurable - Configurable confCascType2{"ConfCascType2", 0, "select one of the V0s (Omega = 0, Xi = 1, anti-Omega = 2, anti-Xi = 3) for cascade-cascade combination"}; // o2-linter: disable=name/configurable - Configurable confChargePart1{"ConfChargePart1", 1, "sign of particle 1"}; // o2-linter: disable=name/configurable - Configurable confHPtPart1{"ConfHPtPart1", 4.0f, "higher limit for pt of particle 1"}; // o2-linter: disable=name/configurable - Configurable confLPtPart1{"ConfLPtPart1", 0.5f, "lower limit for pt of particle 1"}; // o2-linter: disable=name/configurable - Configurable confHPtPart2{"ConfHPtPart2", 4.0f, "higher limit for pt of particle 2"}; // o2-linter: disable=name/configurable - Configurable confLPtPart2{"ConfLPtPart2", 0.3f, "lower limit for pt of particle 2"}; // o2-linter: disable=name/configurable - Configurable confmom{"Confmom", 0.75, "momentum threshold for particle identification using TOF"}; // o2-linter: disable=name/configurable - Configurable confNsigmaTPCParticle{"ConfNsigmaTPCParticle", 3.0, "TPC Sigma for particle momentum < Confmom"}; // o2-linter: disable=name/configurable - Configurable confNsigmaCombinedParticle{"ConfNsigmaCombinedParticle", 3.0, "TPC and TOF Sigma (combined) for particle momentum > Confmom"}; // o2-linter: disable=name/configurable - - ConfigurableAxis confkstarBins{"ConfkstarBins", {1500, 0., 6.}, "binning kstar"}; // o2-linter: disable=name/configurable - ConfigurableAxis confMultBins{"ConfMultBins", {VARIABLE_WIDTH, 0.0f, 20.0f, 40.0f, 60.0f, 80.0f, 100.0f, 200.0f, 99999.f}, "Mixing bins - multiplicity"}; // o2-linter: disable=name/configurable - ConfigurableAxis confkTBins{"ConfkTBins", {150, 0., 9.}, "binning kT"}; // o2-linter: disable=name/configurable - ConfigurableAxis confmTBins{"ConfmTBins", {225, 0., 7.5}, "binning mT"}; // o2-linter: disable=name/configurable - ConfigurableAxis confmultBins3D{"ConfMultBins3D", {VARIABLE_WIDTH, 0.0f, 20.0f, 30.0f, 40.0f, 99999.0f}, "multiplicity Binning for the 3Dimensional plot: k* vs multiplicity vs mT (set <> to true in order to use)"}; // o2-linter: disable=name/configurable - ConfigurableAxis confmTBins3D{"ConfmTBins3D", {VARIABLE_WIDTH, 1.02f, 1.14f, 1.20f, 1.26f, 1.38f, 1.56f, 1.86f, 4.50f}, "mT Binning for the 3Dimensional plot: k* vs multiplicity vs mT (set <> to true in order to use)"}; // o2-linter: disable=name/configurable - Configurable confEtaBins{"ConfEtaBins", 29, "Number of eta bins in deta dphi"}; // o2-linter: disable=name/configurable - Configurable confPhiBins{"ConfPhiBins", 29, "Number of phi bins in deta dphi"}; // o2-linter: disable=name/configurable - Configurable confIsMC{"ConfIsMC", false, "Enable additional Histograms in the case of a MonteCarlo Run"}; // o2-linter: disable=name/configurable - Configurable confUse3D{"ConfUse3D", false, "Enable three dimensional histogramms (to be used only for analysis with high statistics): k* vs mT vs multiplicity"}; // o2-linter: disable=name/configurable + Configurable confTrackChoicePartOne{"ConfTrackChoicePartOne", 0, "0:Proton, 1:Pion, 2:Kaon"}; + Configurable confTrkPDGCodePartOne{"ConfTrkPDGCodePartOne", 2212, "Particle 1 (Track) - PDG code"}; + Configurable confCascType1{"ConfCascType1", 0, "select one of the V0s (Omega = 0, Xi = 1, anti-Omega = 2, anti-Xi = 3) for track-cascade combination"}; + Configurable confCascType2{"ConfCascType2", 0, "select one of the V0s (Omega = 0, Xi = 1, anti-Omega = 2, anti-Xi = 3) for cascade-cascade combination"}; + Configurable confIsCPR{"ConfIsCPR", false, "Close Pair Rejection"}; + Configurable confCPRdeltaPhiCutMax{"ConfCPRdeltaPhiCutMax", 0.0, "Delta Phi max cut for Close Pair Rejection"}; + Configurable confCPRdeltaPhiCutMin{"ConfCPRdeltaPhiCutMin", 0.0, "Delta Phi min cut for Close Pair Rejection"}; + Configurable confCPRdeltaEtaCutMax{"ConfCPRdeltaEtaCutMax", 0.0, "Delta Eta max cut for Close Pair Rejection"}; + Configurable confCPRdeltaEtaCutMin{"ConfCPRdeltaEtaCutMin", 0.0, "Delta Eta min cut for Close Pair Rejection"}; + Configurable confCPRPlotPerRadii{"ConfCPRPlotPerRadii", false, "Plot CPR per radii"}; + Configurable confCPRChosenRadii{"ConfCPRChosenRadii", 0.0, "Delta Eta cut for Close Pair Rejection"}; + Configurable confChargePart1{"ConfChargePart1", 1, "sign of particle 1"}; + Configurable confHPtPart1{"ConfHPtPart1", 4.0f, "higher limit for pt of particle 1"}; + Configurable confLPtPart1{"ConfLPtPart1", 0.5f, "lower limit for pt of particle 1"}; + Configurable confHPtPart2{"ConfHPtPart2", 4.0f, "higher limit for pt of particle 2"}; + Configurable confLPtPart2{"ConfLPtPart2", 0.3f, "lower limit for pt of particle 2"}; + Configurable confmom{"Confmom", 0.75, "momentum threshold for particle identification using TOF"}; + Configurable confNsigmaTPCParticle{"ConfNsigmaTPCParticle", 3.0, "TPC Sigma for particle momentum < Confmom"}; + Configurable confNsigmaCombinedParticle{"ConfNsigmaCombinedParticle", 3.0, "TPC and TOF Sigma (combined) for particle momentum > Confmom"}; + + ConfigurableAxis confkstarBins{"ConfkstarBins", {1500, 0., 6.}, "binning kstar"}; + ConfigurableAxis confMultBins{"ConfMultBins", {VARIABLE_WIDTH, 0.0f, 20.0f, 40.0f, 60.0f, 80.0f, 100.0f, 200.0f, 99999.f}, "Mixing bins - multiplicity"}; + ConfigurableAxis confkTBins{"ConfkTBins", {150, 0., 9.}, "binning kT"}; + ConfigurableAxis confmTBins{"ConfmTBins", {225, 0., 7.5}, "binning mT"}; + ConfigurableAxis confmultBins3D{"ConfMultBins3D", {VARIABLE_WIDTH, 0.0f, 20.0f, 30.0f, 40.0f, 99999.0f}, "multiplicity Binning for the 3Dimensional plot: k* vs multiplicity vs mT (set <> to true in order to use)"}; + ConfigurableAxis confmTBins3D{"ConfmTBins3D", {VARIABLE_WIDTH, 1.02f, 1.14f, 1.20f, 1.26f, 1.38f, 1.56f, 1.86f, 4.50f}, "mT Binning for the 3Dimensional plot: k* vs multiplicity vs mT (set <> to true in order to use)"}; + Configurable confEtaBins{"ConfEtaBins", 29, "Number of eta bins in deta dphi"}; + Configurable confPhiBins{"ConfPhiBins", 29, "Number of phi bins in deta dphi"}; + Configurable confIsMC{"ConfIsMC", false, "Enable additional Histograms in the case of a MonteCarlo Run"}; + Configurable confUse3D{"ConfUse3D", false, "Enable three dimensional histogramms (to be used only for analysis with high statistics): k* vs mT vs multiplicity"}; Configurable confUseCent{"confUseCent", false, "Use centrality in place of multiplicity"}; - ConfigurableAxis confVtxBins{"ConfVtxBins", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; // o2-linter: disable=name/configurable - ConfigurableAxis confTrkTempFitVarpTBins{"ConfTrkTempFitVarpTBins", {20, 0.5, 4.05}, "pT binning of the pT vs. TempFitVar plot"}; // o2-linter: disable=name/configurable - ConfigurableAxis confTrkTempFitVarBins{"ConfTrkDTempFitVarBins", {300, -0.15, 0.15}, "binning of the TempFitVar in the pT vs. TempFitVar plot"}; // o2-linter: disable=name/configurable + ConfigurableAxis confVtxBins{"ConfVtxBins", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; + ConfigurableAxis confTrkTempFitVarpTBins{"ConfTrkTempFitVarpTBins", {20, 0.5, 4.05}, "pT binning of the pT vs. TempFitVar plot"}; + ConfigurableAxis confTrkTempFitVarBins{"ConfTrkDTempFitVarBins", {300, -0.15, 0.15}, "binning of the TempFitVar in the pT vs. TempFitVar plot"}; Filter collisionFilter = (nabs(aod::collision::posZ) < confZVertexCut); using FilteredFDCollisions = soa::Filtered; @@ -119,6 +126,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/st FemtoUniverseContainer mixedEventCont; FemtoUniversePairCleaner pairCleaner; FemtoUniversePairCleaner pairCleanerCasc; + FemtoUniverseDetaDphiStar pairCloseRejection; HistogramRegistry rXiQA{"xi", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry qaRegistry{"TrackQA", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -216,6 +224,9 @@ struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/st sameEventCont.init(&resultRegistry, confkstarBins, confMultBins, confkTBins, confmTBins, confmultBins3D, confmTBins3D, confEtaBins, confPhiBins, confIsMC, confUse3D); mixedEventCont.init(&resultRegistry, confkstarBins, confMultBins, confkTBins, confmTBins, confmultBins3D, confmTBins3D, confEtaBins, confPhiBins, confIsMC, confUse3D); pairCleaner.init(&qaRegistry); + if (confIsCPR.value) { + pairCloseRejection.init(&resultRegistry, &qaRegistry, confCPRdeltaPhiCutMin.value, confCPRdeltaPhiCutMax.value, confCPRdeltaEtaCutMin.value, confCPRdeltaEtaCutMax.value, confCPRChosenRadii.value, confCPRPlotPerRadii.value); + } } void processCascades(const FilteredFDCollision& col, const FemtoFullParticles& parts) @@ -351,6 +362,8 @@ struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/st /// cascade - cascade void processSameEventCasc(const FilteredFDCollision& col, const FemtoFullParticles& parts) { + const auto& magFieldTesla = col.magField(); + auto groupPartsTwo = partsTwo->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); eventHisto.fillQA(col); @@ -389,6 +402,11 @@ struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/st if (!pairCleanerCasc.isCleanPair(p1, p2, parts)) { return; } + if (confIsCPR.value) { + if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla, femto_universe_container::EventType::same)) { + return; + } + } const auto& posChild1 = parts.iteratorAt(p1.index() - 3); const auto& negChild1 = parts.iteratorAt(p1.index() - 2); const auto& bachelor1 = parts.iteratorAt(p1.index() - 1); @@ -499,6 +517,11 @@ struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/st if (!pairCleanerCasc.isCleanPair(p1, p2, parts)) { continue; } + if (confIsCPR.value) { + if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla1, femto_universe_container::EventType::mixed)) { + continue; + } + } mixedEventCont.setPair(p1, p2, multCol, confUse3D, 1.0f); } From 78749b37a56b047aff1d538d917717abd65d07e4 Mon Sep 17 00:00:00 2001 From: czhang Date: Sun, 9 Mar 2025 19:02:30 +0100 Subject: [PATCH 0619/1650] [PWGDQ] Implementation of single muon cumulants in muon selection (#10402) --- PWGDQ/Core/HistogramsLibrary.cxx | 42 ++++++++++++++++++++++++++++++-- PWGDQ/Core/VarManager.h | 35 ++++++++++++++++++++++++++ PWGDQ/Tasks/tableReader.cxx | 29 ++++++++++++++++++++++ 3 files changed, 104 insertions(+), 2 deletions(-) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 4bcd02f88a0..a55fab5ee42 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -838,6 +838,26 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "tpcNSigmaKa_tofNSigmaKa", "", false, 200, -10., 10., VarManager::kTPCnSigmaKa, 200, -10., 10., VarManager::kTOFnSigmaKa); hm->AddHistogram(histClass, "tpcNSigmaPi_tofNSigmaPi", "", false, 200, -10., 10., VarManager::kTPCnSigmaPi, 200, -10., 10., VarManager::kTOFnSigmaPi); } + if (subGroupStr.Contains("singlemucumulant")) { + double PtBinEdges[67]; // 0-30GeV/c + for (int i = 0; i < 67; i++) { + if (i <= 39) { + PtBinEdges[i] = i / 10.; + } else { + PtBinEdges[i] = (i - 40) * 1. + 4.; + } + } + + double CentBinEdges[19]; // 0-90% + for (int i = 0; i < 19; i++) { + CentBinEdges[i] = i * 5; + } + + hm->AddHistogram(histClass, "Pt_centrFT0C_Corr2REFsingle", "", true, 66, PtBinEdges, VarManager::kPt, 18, CentBinEdges, VarManager::kCentFT0C, 0, nullptr, VarManager::kCORR2REFbysinglemu, "", "", "", VarManager::kNothing, VarManager::kM11REFoverMpsingle); + hm->AddHistogram(histClass, "Pt_centrFT0C_Corr4REFsingle", "", true, 66, PtBinEdges, VarManager::kPt, 18, CentBinEdges, VarManager::kCentFT0C, 0, nullptr, VarManager::kCORR4REFbysinglemu, "", "", "", VarManager::kNothing, VarManager::kM1111REFoverMpsingle); + hm->AddHistogram(histClass, "Pt_centrFT0C_Corr2POIsingle", "", true, 66, PtBinEdges, VarManager::kPt, 18, CentBinEdges, VarManager::kCentFT0C, 0, nullptr, VarManager::kCORR2POIsingle, "", "", "", VarManager::kNothing, VarManager::kM01POIoverMpsingle); + hm->AddHistogram(histClass, "Pt_centrFT0C_Corr4POIsingle", "", true, 66, PtBinEdges, VarManager::kPt, 18, CentBinEdges, VarManager::kCentFT0C, 0, nullptr, VarManager::kCORR4POIsingle, "", "", "", VarManager::kNothing, VarManager::kM0111POIoverMpsingle); + } } if (!groupStr.CompareTo("mctruth_triple")) { @@ -1121,8 +1141,26 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V24ME", "Mass_Pt_CentFT0C_V24ME", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV24ME, VarManager::kWV24ME); } if (subGroupStr.Contains("cumulantme1")) { - hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V22ME", "Mass_Pt_CentFT0C_V22ME", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV22ME, VarManager::kWV22ME); - hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V24ME", "Mass_Pt_CentFT0C_V24ME", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 90, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kV24ME, VarManager::kWV24ME); + double MassBinEdges[251]; // 0-5GeV/c2 + for (int i = 0; i < 251; i++) { + MassBinEdges[i] = i * 0.02; + } + + double PtBinEdges[67]; // 0-30GeV/c + for (int i = 0; i < 67; i++) { + if (i <= 39) { + PtBinEdges[i] = i / 10.; + } else { + PtBinEdges[i] = (i - 40) * 1. + 4.; + } + } + + double CentBinEdges[19]; // 0-90% + for (int i = 0; i < 19; i++) { + CentBinEdges[i] = i * 5; + } + hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V22ME", "Mass_Pt_CentFT0C_V22ME", true, 250, MassBinEdges, VarManager::kMass, 66, PtBinEdges, VarManager::kPt, 18, CentBinEdges, VarManager::kCentFT0C, "", "", "", VarManager::kV22ME, VarManager::kWV22ME); + hm->AddHistogram(histClass, "Mass_Pt_CentFT0C_V24ME", "Mass_Pt_CentFT0C_V24ME", true, 250, MassBinEdges, VarManager::kMass, 66, PtBinEdges, VarManager::kPt, 18, CentBinEdges, VarManager::kCentFT0C, "", "", "", VarManager::kV24ME, VarManager::kWV24ME); } if (subGroupStr.Contains("cumulantme2")) { hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_M11REFoverMpME", "", true, 250, 0.0, 5.0, VarManager::kMass, 60, 0.0, 30.0, VarManager::kPt, 9, 0.0, 90.0, VarManager::kCentFT0C, "", "", "", VarManager::kM11REFoverMpME); diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 8f28042c7d6..95269681f6c 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -236,6 +236,7 @@ class VarManager : public TObject kMultDimuons, kMultAntiMuons, kMultMuons, + kMultSingleMuons, kMultNTracksHasITS, kMultNTracksHasTPC, kMultNTracksHasTOF, @@ -691,6 +692,7 @@ class VarManager : public TObject kM0111POI, kCORR2REF, kCORR2REFbydimuons, + kCORR2REFbysinglemu, kCORR2REFetagap, kCORR2POI, kCORR2POICORR4POI, @@ -702,6 +704,7 @@ class VarManager : public TObject kCORR2CORR4REF, kCORR4REF, kCORR4REFbydimuons, + kCORR4REFbysinglemu, kCORR4POI, kM11REFoverMp, kM01POIoverMp, @@ -713,19 +716,27 @@ class VarManager : public TObject kM0111POIplus, kM01POIminus, kM0111POIminus, + kM01POIsingle, + kM0111POIsingle, kM01POIoverMpminus, kM01POIoverMpplus, + kM01POIoverMpsingle, kM01POIoverMpmoins, kM0111POIoverMpminus, kM0111POIoverMpplus, + kM0111POIoverMpsingle, kCORR2POIplus, kCORR2POIminus, + kCORR2POIsingle, kCORR4POIplus, kCORR4POIminus, + kCORR4POIsingle, kM11REFoverMpplus, kM1111REFoverMpplus, kM11REFoverMpminus, kM1111REFoverMpminus, + kM11REFoverMpsingle, + kM1111REFoverMpsingle, kM01POIME, kMultDimuonsME, kM0111POIME, @@ -2187,6 +2198,30 @@ void VarManager::FillTrack(T const& track, float* values) if constexpr ((fillMap & MuonRealign) > 0) { values[kMuonChi2] = track.chi2(); } + + if (fgUsedVars[kM11REFoverMpsingle]) { + float m = o2::constants::physics::MassMuon; + ROOT::Math::PtEtaPhiMVector v(track.pt(), track.eta(), track.phi(), m); + complex Q21(values[kQ2X0A] * values[kS11A], values[kQ2Y0A] * values[kS11A]); + complex Q42(values[kQ42XA], values[kQ42YA]); + complex Q23(values[kQ23XA], values[kQ23YA]); + complex P2(TMath::Cos(2 * v.Phi()), TMath::Sin(2 * v.Phi())); + values[kM11REFoverMpsingle] = values[kMultSingleMuons] > 0 && !(std::isnan(values[kM11REF]) || std::isinf(values[kM11REF]) || std::isnan(values[kCORR2REF]) || std::isinf(values[kCORR2REF]) || std::isnan(values[kM1111REF]) || std::isinf(values[kM1111REF]) || std::isnan(values[kCORR4REF]) || std::isinf(values[kCORR4REF])) ? values[kM11REF] / values[kMultSingleMuons] : 0; + values[kM1111REFoverMpsingle] = values[kMultSingleMuons] > 0 && !(std::isnan(values[kM1111REF]) || std::isinf(values[kM1111REF]) || std::isnan(values[kCORR4REF]) || std::isinf(values[kCORR4REF]) || std::isnan(values[kM11REF]) || std::isinf(values[kM11REF]) || std::isnan(values[kCORR2REF]) || std::isinf(values[kCORR2REF])) ? values[kM1111REF] / values[kMultSingleMuons] : 0; + values[kCORR2REFbysinglemu] = std::isnan(values[kM11REFoverMpsingle]) || std::isinf(values[kM11REFoverMpsingle]) || std::isnan(values[kCORR2REF]) || std::isinf(values[kCORR2REF]) || std::isnan(values[kM1111REFoverMpsingle]) || std::isinf(values[kM1111REFoverMpsingle]) || std::isnan(values[kCORR4REF]) || std::isinf(values[kCORR4REF]) ? 0 : values[kCORR2REF]; + values[kCORR4REFbysinglemu] = std::isnan(values[kM1111REFoverMpsingle]) || std::isinf(values[kM1111REFoverMpsingle]) || std::isnan(values[kCORR4REF]) || std::isinf(values[kCORR4REF]) || std::isnan(values[kM11REFoverMpsingle]) || std::isinf(values[kM11REFoverMpsingle]) || std::isnan(values[kCORR2REF]) || std::isinf(values[kCORR2REF]) ? 0 : values[kCORR4REF]; + values[kCORR2POIsingle] = (P2 * conj(Q21)).real() / values[kM01POI]; + values[kM01POIsingle] = values[kMultSingleMuons] * values[kS11A]; + values[kM0111POIsingle] = values[kMultSingleMuons] * (values[kS31A] - 3. * values[kS11A] * values[kS12A] + 2. * values[kS13A]); + values[kCORR2POIsingle] = (P2 * conj(Q21)).real() / values[kM01POIsingle]; + values[kCORR4POIsingle] = (P2 * Q21 * conj(Q21) * conj(Q21) - P2 * Q21 * conj(Q42) - 2. * values[kS12A] * P2 * conj(Q21) + 2. * P2 * conj(Q23)).real() / values[kM0111POIsingle]; + values[kM01POIsingle] = std::isnan(values[kM01POIsingle]) || std::isinf(values[kM01POIsingle]) || std::isnan(values[kM0111POIsingle]) || std::isinf(values[kM0111POIsingle]) || std::isnan(values[kCORR2POIsingle]) || std::isinf(values[kCORR2POIsingle]) || std::isnan(values[kCORR4POIsingle]) || std::isinf(values[kCORR4POIsingle]) ? 0 : values[kM01POIsingle]; + values[kM0111POIsingle] = std::isnan(values[kM0111POIsingle]) || std::isinf(values[kM0111POIsingle]) || std::isnan(values[kCORR2POIsingle]) || std::isinf(values[kCORR2POIsingle]) || std::isnan(values[kCORR4POIsingle]) || std::isinf(values[kCORR4POIsingle]) ? 0 : values[kM0111POIsingle]; + values[kCORR2POIsingle] = std::isnan(values[kM01POIsingle]) || std::isinf(values[kM01POIsingle]) || std::isnan(values[kM0111POIsingle]) || std::isinf(values[kM0111POIsingle]) || std::isnan(values[kCORR2POIsingle]) || std::isinf(values[kCORR2POIsingle]) || std::isnan(values[kCORR4POIsingle]) || std::isinf(values[kCORR4POIsingle]) ? 0 : values[kCORR2POIsingle]; + values[kCORR4POIsingle] = std::isnan(values[kM01POIsingle]) || std::isinf(values[kM01POIsingle]) || std::isnan(values[kM0111POIsingle]) || std::isinf(values[kM0111POIsingle]) || std::isnan(values[kCORR2POIsingle]) || std::isinf(values[kCORR2POIsingle]) || std::isnan(values[kCORR4POIsingle]) || std::isinf(values[kCORR4POIsingle]) ? 0 : values[kCORR4POIsingle]; + values[kM01POIoverMpsingle] = values[kMultSingleMuons] > 0 && !(std::isnan(values[kM0111POIsingle]) || std::isinf(values[kM0111POIsingle]) || std::isnan(values[kCORR4POIsingle]) || std::isinf(values[kCORR4POIsingle]) || std::isnan(values[kM01POIsingle]) || std::isinf(values[kM01POIsingle]) || std::isnan(values[kCORR2POIsingle]) || std::isinf(values[kCORR2POIsingle])) ? values[kM01POIsingle] / values[kMultSingleMuons] : 0; + values[kM0111POIoverMpsingle] = values[kMultSingleMuons] > 0 && !(std::isnan(values[kM0111POIsingle]) || std::isinf(values[kM0111POIsingle]) || std::isnan(values[kCORR4POIsingle]) || std::isinf(values[kCORR4POIsingle]) || std::isnan(values[kM01POIsingle]) || std::isinf(values[kM01POIsingle]) || std::isnan(values[kCORR2POIsingle]) || std::isinf(values[kCORR2POIsingle])) ? values[kM0111POIsingle] / values[kMultSingleMuons] : 0; + } } // Quantities based on the barrel tables diff --git a/PWGDQ/Tasks/tableReader.cxx b/PWGDQ/Tasks/tableReader.cxx index 109227ddb55..2249aba8163 100644 --- a/PWGDQ/Tasks/tableReader.cxx +++ b/PWGDQ/Tasks/tableReader.cxx @@ -305,6 +305,7 @@ struct AnalysisEventSelection { PROCESS_SWITCH(AnalysisEventSelection, processSkimmedQVectorMultExtra, "Run event selection on DQ skimmed events with Q vector from GFW and MultPV", false); PROCESS_SWITCH(AnalysisEventSelection, processSkimmedQVectorCentrMultExtra, "Run event selection on DQ skimmed events with Q vector from CFW and MultPV", false); PROCESS_SWITCH(AnalysisEventSelection, processSkimmedQVectorExtraRef, "Run event selection on DQ skimmed events with Q vector and subscribing to reference flow table", false); + PROCESS_SWITCH(AnalysisEventSelection, processSkimmedQVectorMultExtraRef, "Run event selection on DQ skimmed events with Q vector and subscribing to reference flow table with MultPV", false); PROCESS_SWITCH(AnalysisEventSelection, processDummy, "Dummy function", false); // TODO: Add process functions subscribing to Framework Collision }; @@ -463,6 +464,8 @@ struct AnalysisMuonSelection { HistogramManager* fHistMan; std::vector fMuonCuts; + Filter filterEventSelected = aod::dqanalysisflags::isEventSelected == 1; + void init(o2::framework::InitContext& context) { if (context.mOptions.get("processDummy")) { @@ -506,6 +509,26 @@ struct AnalysisMuonSelection { uint32_t filterMap = 0; int iCut = 0; + // First loop to get muon multiplicity for single muon cumulants + if constexpr (static_cast(TEventFillMap & VarManager::ObjTypes::ReducedEventQvector)) { + int multMuon = 0; + for (auto& muon : muons) { + filterMap = 0; + VarManager::FillTrack(muon); + + iCut = 0; + for (auto cut = fMuonCuts.begin(); cut != fMuonCuts.end(); cut++, iCut++) { + if ((*cut).IsSelected(VarManager::fgValues)) { + filterMap |= (static_cast(1) << iCut); + } + } + if (static_cast(filterMap) > 0) { + multMuon++; + } + } + VarManager::fgValues[VarManager::kMultSingleMuons] = multMuon; + } + for (auto& muon : muons) { filterMap = 0; VarManager::FillTrack(muon); @@ -530,12 +553,18 @@ struct AnalysisMuonSelection { { runMuonSelection(event, muons); } + void processVnSingleMuonCumulantSkimmed(soa::Filtered::iterator const& event, MyMuonTracks const& muons) + { + VarManager::FillEvent(event, VarManager::fgValues); + runMuonSelection(event, muons); + } void processDummy(MyEvents&) { // do nothing } PROCESS_SWITCH(AnalysisMuonSelection, processSkimmed, "Run muon selection on DQ skimmed muons", false); + PROCESS_SWITCH(AnalysisMuonSelection, processVnSingleMuonCumulantSkimmed, "Run muon selection for single muon cumulant correlators", false); PROCESS_SWITCH(AnalysisMuonSelection, processDummy, "Dummy function", false); }; From 13115d8a7e528a0ead9cfcc2d82f93a44da333a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Sun, 9 Mar 2025 20:27:48 +0100 Subject: [PATCH 0620/1650] [PWGHF] Refine the bin width of Occupancy Axis of the HF event selection QA histogram (#10419) --- PWGHF/Utils/utilsEvSelHf.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGHF/Utils/utilsEvSelHf.h b/PWGHF/Utils/utilsEvSelHf.h index ee5183eea1f..a3500da73da 100644 --- a/PWGHF/Utils/utilsEvSelHf.h +++ b/PWGHF/Utils/utilsEvSelHf.h @@ -154,7 +154,7 @@ struct HfEventSelection : o2::framework::ConfigurableGroup { o2::framework::Configurable bcMarginForSoftwareTrigger{"bcMarginForSoftwareTrigger", 100, "Number of BCs of margin for software triggers"}; o2::framework::Configurable ccdbPathSoftwareTrigger{"ccdbPathSoftwareTrigger", "Users/m/mpuccio/EventFiltering/OTS/Chunked/", "ccdb path for ZORRO objects"}; o2::framework::ConfigurableAxis th2ConfigAxisCent{"th2ConfigAxisCent", {100, 0., 100.}, ""}; - o2::framework::ConfigurableAxis th2ConfigAxisOccupancy{"th2ConfigAxisOccupancy", {14, 0, 140000}, ""}; + o2::framework::ConfigurableAxis th2ConfigAxisOccupancy{"th2ConfigAxisOccupancy", {14, 0, 14000}, ""}; // histogram names static constexpr char NameHistCollisions[] = "hCollisions"; From ae214d6115bf1318f7370890fd5687f1fe7b7222 Mon Sep 17 00:00:00 2001 From: eloviyo <38348689+Eloviyo@users.noreply.github.com> Date: Sun, 9 Mar 2025 20:45:05 +0100 Subject: [PATCH 0621/1650] [PWGCF] FemtoUniverse cascade task -- full MC for cascade analysis (#10417) Co-authored-by: Shirajum Monira --- ...toUniversePairTaskTrackCascadeExtended.cxx | 122 ++++++++++++++++++ 1 file changed, 122 insertions(+) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx index 96cd072d4e4..86ef57cef3f 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx @@ -45,6 +45,9 @@ struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/st using FemtoFullParticles = soa::Join; Preslice perCol = aod::femtouniverseparticle::fdCollisionId; + using FemtoRecoParticles = soa::Join; + Preslice perColReco = aod::femtouniverseparticle::fdCollisionId; + ConfigurableAxis confChildTempFitVarpTBins{"ConfChildTempFitVarpTBins", {20, 0.5, 4.05}, "V0 child: pT binning of the pT vs. TempFitVar plot"}; ConfigurableAxis confChildTempFitVarBins{"ConfChildTempFitVarBins", {300, -0.15, 0.15}, "V0 child: binning of the TempFitVar in the pT vs. TempFitVar plot"}; Configurable confCascInvMassLowLimit{"ConfCascInvMassLowLimit", 1.315, "Lower limit of the Casc invariant mass"}; @@ -101,10 +104,12 @@ struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/st /// Partition for particle 1 (track) Partition partsOne = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kTrack)) && (aod::femtouniverseparticle::sign == confChargePart1) && (nabs(aod::femtouniverseparticle::eta) < confEta) && (aod::femtouniverseparticle::pt < confHPtPart1) && (aod::femtouniverseparticle::pt > confLPtPart1); Partition partsOneMCgen = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kMCTruthTrack)) && (nabs(aod::femtouniverseparticle::eta) < confEta) && (aod::femtouniverseparticle::pt < confHPtPart1) && (aod::femtouniverseparticle::pt > confLPtPart1); + Partition partsOneMCreco = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kTrack)) && (aod::femtouniverseparticle::sign == confChargePart1) && (nabs(aod::femtouniverseparticle::eta) < confEta) && (aod::femtouniverseparticle::pt < confHPtPart1) && (aod::femtouniverseparticle::pt > confLPtPart1); /// Partition for particle 2 (cascade) Partition partsTwo = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kCascade)) && (aod::femtouniverseparticle::pt < confHPtPart2) && (aod::femtouniverseparticle::pt > confLPtPart2); Partition partsTwoMCgen = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kMCTruthTrack)) && (aod::femtouniverseparticle::pt < confHPtPart2) && (aod::femtouniverseparticle::pt > confLPtPart2); + Partition partsTwoMCreco = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kCascade)) && (aod::femtouniverseparticle::pt < confHPtPart2) && (aod::femtouniverseparticle::pt > confLPtPart2); /// Partition for cascades Partition cascs = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kCascade)); @@ -131,6 +136,8 @@ struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/st HistogramRegistry rXiQA{"xi", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry qaRegistry{"TrackQA", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry resultRegistry{"Correlations", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry registryMCgen{"MCgenHistos", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; + HistogramRegistry registryMCreco{"MCrecoHistos", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; // Table to select cascade daughters // Charges: = +--, +--, +-+, +-+ @@ -214,6 +221,32 @@ struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/st qaRegistry.add("Tracks_neg/nSigmaTPC", "; #it{p} (GeV/#it{c}); n#sigma_{TPC}", kTH2F, {{100, 0, 10}, {200, -4.975, 5.025}}); qaRegistry.add("Tracks_neg/nSigmaTOF", "; #it{p} (GeV/#it{c}); n#sigma_{TOF}", kTH2F, {{100, 0, 10}, {200, -4.975, 5.025}}); + // MC gen + registryMCgen.add("plus/MCgenCasc", "MC gen cascades;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + registryMCgen.add("minus/MCgenCasc", "MC gen cascades;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + + registryMCgen.add("plus/MCgenAllPt", "MC gen all;#it{p}_{T} (GeV/c); #eta", {HistType::kTH1F, {{500, 0, 5}}}); + registryMCgen.add("minus/MCgenAllPt", "MC gen all;#it{p}_{T} (GeV/c); #eta", {HistType::kTH1F, {{500, 0, 5}}}); + + registryMCgen.add("plus/MCgenPr", "MC gen protons;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + registryMCgen.add("minus/MCgenPr", "MC gen protons;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + + registryMCgen.add("plus/MCgenPrPt", "MC gen protons;#it{p}_{T} (GeV/c)", {HistType::kTH1F, {{500, 0, 5}}}); + registryMCgen.add("minus/MCgenPrPt", "MC gen protons;#it{p}_{T} (GeV/c)", {HistType::kTH1F, {{500, 0, 5}}}); + + // MC reco + registryMCreco.add("plus/MCrecoCascade", "MC reco Cascades;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + registryMCreco.add("minus/MCrecoCascade", "MC reco Cascades;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + + registryMCreco.add("plus/MCrecoAllPt", "MC reco all;#it{p}_{T} (GeV/c); #eta", {HistType::kTH1F, {{500, 0, 5}}}); + registryMCreco.add("minus/MCrecoAllPt", "MC reco all;#it{p}_{T} (GeV/c); #eta", {HistType::kTH1F, {{500, 0, 5}}}); + + registryMCreco.add("plus/MCrecoPr", "MC reco protons;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + registryMCreco.add("minus/MCrecoPr", "MC reco protons;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); + + registryMCreco.add("plus/MCrecoPrPt", "MC reco protons;#it{p}_{T} (GeV/c)", {HistType::kTH1F, {{500, 0, 5}}}); + registryMCreco.add("minus/MCrecoPrPt", "MC reco protons;#it{p}_{T} (GeV/c)", {HistType::kTH1F, {{500, 0, 5}}}); + trackHistoPartOnePos.init(&qaRegistry, confTrkTempFitVarpTBins, confTrkTempFitVarBins, confIsMC, confTrkPDGCodePartOne); trackHistoPartOneNeg.init(&qaRegistry, confTrkTempFitVarpTBins, confTrkTempFitVarBins, confIsMC, confTrkPDGCodePartOne); posChildHistos.init(&qaRegistry, confChildTempFitVarpTBins, confChildTempFitVarBins, false, 0, true); @@ -597,6 +630,95 @@ struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/st } } PROCESS_SWITCH(femtoUniversePairTaskTrackCascadeExtended, processMixedEventMCgen, "Enable processing mixed event MC truth for track - cascade", false); + + /// This function fills MC truth particles from derived MC table + void processMCgen(aod::FDCascParticles const& parts) + { + for (const auto& part : parts) { + if (part.partType() != uint8_t(aod::femtouniverseparticle::ParticleType::kMCTruthTrack)) + continue; + + int pdgCode = static_cast(part.pidCut()); + const auto& pdgParticle = pdgMC->GetParticle(pdgCode); + if (!pdgParticle) { + continue; + } + + if ((confCascType1 == 0 && pdgCode == 3334) || (confCascType1 == 1 && pdgCode == 3312)) { + registryMCgen.fill(HIST("plus/MCgenCasc"), part.pt(), part.eta()); + continue; + } else if ((confCascType1 == 0 && pdgCode == -3334) || (confCascType1 == 1 && pdgCode == -3312)) { + registryMCgen.fill(HIST("minus/MCgenCasc"), part.pt(), part.eta()); + continue; + } + + if (pdgParticle->Charge() > 0.0) { + registryMCgen.fill(HIST("plus/MCgenAllPt"), part.pt()); + } + if (pdgCode == 2212) { + registryMCgen.fill(HIST("plus/MCgenPr"), part.pt(), part.eta()); + registryMCgen.fill(HIST("plus/MCgenPrPt"), part.pt()); + } + + if (pdgParticle->Charge() < 0.0) { + registryMCgen.fill(HIST("minus/MCgenAllPt"), part.pt()); + } + if (pdgCode == -2212) { + registryMCgen.fill(HIST("minus/MCgenPr"), part.pt(), part.eta()); + registryMCgen.fill(HIST("minus/MCgenPrPt"), part.pt()); + } + } + } + + PROCESS_SWITCH(femtoUniversePairTaskTrackCascadeExtended, processMCgen, "Process MC truth data for cascades", false); + + void processMCReco(FemtoRecoParticles const& parts, aod::FdMCParticles const& mcparts) + { + for (const auto& part : parts) { + auto mcPartId = part.fdMCParticleId(); + if (mcPartId == -1) + continue; // no MC particle + const auto& mcpart = mcparts.iteratorAt(mcPartId); + // + if (part.partType() == aod::femtouniverseparticle::ParticleType::kCascade) { + if ((confCascType1 == 0 && mcpart.pdgMCTruth() == 3334) || (confCascType1 == 1 && mcpart.pdgMCTruth() == 3312)) { + const auto& posChild = parts.iteratorAt(part.index() - 3); + const auto& negChild = parts.iteratorAt(part.index() - 2); + const auto& bachelor = parts.iteratorAt(part.index() - 1); + /// Daughters that do not pass this condition are not selected + if (isParticleTPC(posChild, CascChildTable[confCascType1][0]) && isParticleTPC(negChild, CascChildTable[confCascType1][1]) && isParticleTPC(bachelor, CascChildTable[confCascType1][2])) { + registryMCreco.fill(HIST("plus/MCrecoCascade"), mcpart.pt(), mcpart.eta()); + } + } else if ((confCascType1 == 0 && mcpart.pdgMCTruth() == -3334) || (confCascType1 == 1 && mcpart.pdgMCTruth() == -3312)) { + /// Daughters that do not pass this condition are not selected + const auto& posChild = parts.iteratorAt(part.index() - 3); + const auto& negChild = parts.iteratorAt(part.index() - 2); + const auto& bachelor = parts.iteratorAt(part.index() - 1); + if (isParticleTPC(posChild, CascChildTable[confCascType1 + 2][0]) && isParticleTPC(negChild, CascChildTable[confCascType1 + 2][1]) && isParticleTPC(bachelor, CascChildTable[confCascType1 + 2][2])) { + registryMCreco.fill(HIST("minus/MCrecoCascade"), mcpart.pt(), mcpart.eta()); + } + } + } else if (part.partType() == aod::femtouniverseparticle::ParticleType::kTrack) { + if (part.sign() > 0) { + registryMCreco.fill(HIST("plus/MCrecoAllPt"), mcpart.pt()); + if (mcpart.pdgMCTruth() == 2212 && isNSigmaCombined(part.p(), unPackInTable(part.tpcNSigmaStorePr()), unPackInTable(part.tofNSigmaStorePr()))) { + registryMCreco.fill(HIST("plus/MCrecoPr"), mcpart.pt(), mcpart.eta()); + registryMCreco.fill(HIST("plus/MCrecoPrPt"), mcpart.pt()); + } + } + + if (part.sign() < 0) { + registryMCreco.fill(HIST("minus/MCrecoAllPt"), mcpart.pt()); + if (mcpart.pdgMCTruth() == -2212 && isNSigmaCombined(part.p(), unPackInTable(part.tpcNSigmaStorePr()), unPackInTable(part.tofNSigmaStorePr()))) { + registryMCreco.fill(HIST("minus/MCrecoPr"), mcpart.pt(), mcpart.eta()); + registryMCreco.fill(HIST("minus/MCrecoPrPt"), mcpart.pt()); + } + } + } + } + } + + PROCESS_SWITCH(femtoUniversePairTaskTrackCascadeExtended, processMCReco, "Process MC reco data for cascades", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 9d44e03a203ab9885b760f9cbeac79e2ceb164b5 Mon Sep 17 00:00:00 2001 From: Anantha Padmanabhan M Nair <82643666+ananthapadmanabhan18@users.noreply.github.com> Date: Mon, 10 Mar 2025 11:58:02 +0530 Subject: [PATCH 0622/1650] [PWGUD] Added tables (#10415) --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 36 +++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index 1803b07a81a..5cf399af5ab 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -57,7 +57,7 @@ DECLARE_SOA_COLUMN(FourPionPhiPair2, fourPionPhiPair2, double); DECLARE_SOA_COLUMN(FourPionCosThetaPair1, fourPionCosThetaPair1, double); DECLARE_SOA_COLUMN(FourPionCosThetaPair2, fourPionCosThetaPair2, double); } // namespace branch -DECLARE_SOA_TABLE(UDTree, "AOD", "UD0Charge", +DECLARE_SOA_TABLE(UDTree0c, "AOD", "UD0Charge", branch::Dcaxy, branch::Dcaz, branch::PionPt, @@ -72,6 +72,17 @@ DECLARE_SOA_TABLE(UDTree, "AOD", "UD0Charge", branch::FourPionCosThetaPair1, branch::FourPionCosThetaPair2); +DECLARE_SOA_TABLE(UDTreen0c, "AOD", "UDn0Charge", + branch::Dcaxy, + branch::Dcaz, + branch::PionPt, + branch::PionEta, + branch::PionRapidity, + branch::FourPionPt, + branch::FourPionEta, + branch::FourPionRapidity, + branch::FourPionMass); + DECLARE_SOA_TABLE(MCTree, "AOD", "MC0Charge", branch::PionPt, branch::PionEta, @@ -104,7 +115,8 @@ DECLARE_SOA_TABLE(MCUDTree, "AOD", "UDMC0Charge", ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct SGSelector sgSelector; - Produces zeroChargeEventsData; + Produces zeroChargeEventsData; + Produces nonzeroChargeEventsData; Produces zeroChargeEventsMCgen; Produces zeroChargeEventsMCreco; @@ -687,7 +699,13 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct // Selecting Events with net charge != 0 for estimation of background if (numPionMinusTRacks != 2 && numPiPlusTracks != 2) { + std::vector pidcaXY; + std::vector pidcaZ; + std::vector piPt; + std::vector piEta; + std::vector piRapidity; TLorentzVector p1, p2, p3, p4, p1234; + TLorentzVector tempVec; p1.SetXYZM(WTS_PID_Pi_tracks[0].px(), WTS_PID_Pi_tracks[0].py(), WTS_PID_Pi_tracks[0].pz(), o2::constants::physics::MassPionCharged); p2.SetXYZM(WTS_PID_Pi_tracks[1].px(), WTS_PID_Pi_tracks[1].py(), WTS_PID_Pi_tracks[1].pz(), o2::constants::physics::MassPionCharged); p3.SetXYZM(WTS_PID_Pi_tracks[2].px(), WTS_PID_Pi_tracks[2].py(), WTS_PID_Pi_tracks[2].pz(), o2::constants::physics::MassPionCharged); @@ -695,6 +713,20 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct p1234 = p1 + p2 + p3 + p4; + for (int i = 0; i < 4; i++) { + tempVec.SetXYZM(WTS_PID_Pi_tracks[i].px(), WTS_PID_Pi_tracks[i].py(), WTS_PID_Pi_tracks[i].pz(), o2::constants::physics::MassPionCharged); + pidcaXY.push_back(WTS_PID_Pi_tracks[i].dcaXY()); + pidcaZ.push_back(WTS_PID_Pi_tracks[i].dcaZ()); + piPt.push_back(tempVec.Pt()); + piEta.push_back(tempVec.Eta()); + piRapidity.push_back(tempVec.Rapidity()); + } + + nonzeroChargeEventsData( + pidcaXY, pidcaZ, + piPt, piEta, piRapidity, + p1234.Pt(), p1234.Eta(), p1234.Rapidity(), p1234.M()); + if (std::fabs(p1234.Rapidity()) < 0.5) { histosData.fill(HIST("pT_event_non0charge_WTS_PID_Pi"), p1234.Pt()); From ff5bbd4be16f5a0f29edcc3cdbd9125850b5e625 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Mon, 10 Mar 2025 18:01:42 +0900 Subject: [PATCH 0623/1650] [PWGEM/PhotonMeson] update photon data table and pcm qc (#10406) --- PWGEM/PhotonMeson/DataModel/gammaTables.h | 33 ++--------------- .../TableProducer/photonconversionbuilder.cxx | 2 +- .../TableProducer/skimmerGammaConversion.cxx | 2 +- .../skimmerPrimaryElectronFromDalitzEE.cxx | 19 ++++++++-- PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx | 27 ++++++++++++-- PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx | 37 +++++++++++++++---- PWGEM/PhotonMeson/Tasks/pcmQC.cxx | 20 +++++----- PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx | 34 ++++++++--------- 8 files changed, 102 insertions(+), 72 deletions(-) diff --git a/PWGEM/PhotonMeson/DataModel/gammaTables.h b/PWGEM/PhotonMeson/DataModel/gammaTables.h index 238a5ce11c6..0abbc3bfe76 100644 --- a/PWGEM/PhotonMeson/DataModel/gammaTables.h +++ b/PWGEM/PhotonMeson/DataModel/gammaTables.h @@ -227,6 +227,8 @@ DECLARE_SOA_COLUMN(MGamma, mGamma, float); //! inva DECLARE_SOA_COLUMN(DCAxyToPV, dcaXYtopv, float); //! DCAxy of V0 to PV DECLARE_SOA_COLUMN(DCAzToPV, dcaZtopv, float); //! DCAz of V0 to PV DECLARE_SOA_COLUMN(CosPA, cospa, float); //! +DECLARE_SOA_COLUMN(CosPAXY, cospaXY, float); //! +DECLARE_SOA_COLUMN(CosPARZ, cospaRZ, float); //! DECLARE_SOA_COLUMN(PCA, pca, float); //! DECLARE_SOA_COLUMN(Alpha, alpha, float); //! DECLARE_SOA_COLUMN(QtArm, qtarm, float); //! @@ -245,31 +247,6 @@ DECLARE_SOA_DYNAMIC_COLUMN(Eta, eta, [](float px, float py, float pz) -> float { DECLARE_SOA_DYNAMIC_COLUMN(Phi, phi, [](float px, float py) -> float { return RecoDecay::phi(px, py); }); DECLARE_SOA_DYNAMIC_COLUMN(P, p, [](float px, float py, float pz) -> float { return RecoDecay::sqrtSumOfSquares(px, py, pz); }); DECLARE_SOA_DYNAMIC_COLUMN(V0Radius, v0radius, [](float vx, float vy) -> float { return RecoDecay::sqrtSumOfSquares(vx, vy); }); -DECLARE_SOA_DYNAMIC_COLUMN(CosPAXY, cosPAXY, [](float px, float py, float vx, float vy, float pvx, float pvy) -> float { - float lx = vx - pvx; // flight length X - float ly = vy - pvy; // flight length Y - float cospaXY = RecoDecay::dotProd(std::array{lx, ly}, std::array{px, py}) / (RecoDecay::sqrtSumOfSquares(lx, ly) * RecoDecay::sqrtSumOfSquares(px, py)); - if (cospaXY < -1.) { - return -1.; - } else if (cospaXY > 1.) { - return 1.; - } - return cospaXY; -}); -DECLARE_SOA_DYNAMIC_COLUMN(CosPARZ, cosPARZ, [](float px, float py, float pz, float vx, float vy, float vz, float pvx, float pvy, float pvz) -> float { - float lx = vx - pvx; // flight length X - float ly = vy - pvy; // flight length Y - float lz = vz - pvz; // flight length Z - float lt = RecoDecay::sqrtSumOfSquares(lx, ly); // flight length R, i.e. transverse plane. - float pt = RecoDecay::sqrtSumOfSquares(px, py); - float cospaRZ = RecoDecay::dotProd(std::array{lt, lz}, std::array{pt, pz}) / (RecoDecay::sqrtSumOfSquares(lt, lz) * RecoDecay::sqrtSumOfSquares(pt, pz)); - if (cospaRZ < -1.) { - return -1.; - } else if (cospaRZ > 1.) { - return 1.; - } - return cospaRZ; -}); } // namespace v0photonkf DECLARE_SOA_TABLE(V0PhotonsKF, "AOD", "V0PHOTONKF", //! o2::soa::Index<>, v0photonkf::CollisionId, v0photonkf::V0Id, v0photonkf::PosTrackId, v0photonkf::NegTrackId, @@ -277,7 +254,7 @@ DECLARE_SOA_TABLE(V0PhotonsKF, "AOD", "V0PHOTONKF", //! v0photonkf::Px, v0photonkf::Py, v0photonkf::Pz, v0photonkf::MGamma, v0photonkf::DCAxyToPV, v0photonkf::DCAzToPV, - v0photonkf::CosPA, v0photonkf::PCA, + v0photonkf::CosPA, v0photonkf::CosPAXY, v0photonkf::CosPARZ, v0photonkf::PCA, v0photonkf::Alpha, v0photonkf::QtArm, v0photonkf::ChiSquareNDF, @@ -287,9 +264,7 @@ DECLARE_SOA_TABLE(V0PhotonsKF, "AOD", "V0PHOTONKF", //! v0photonkf::Eta, v0photonkf::Phi, v0photonkf::P, - v0photonkf::V0Radius, - v0photonkf::CosPAXY, - v0photonkf::CosPARZ); + v0photonkf::V0Radius); // iterators using V0PhotonKF = V0PhotonsKF::iterator; diff --git a/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx b/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx index 836a6deccf0..3843a00987b 100644 --- a/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx +++ b/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx @@ -661,7 +661,7 @@ struct PhotonConversionBuilder { gammaKF_DecayVtx.GetX(), gammaKF_DecayVtx.GetY(), gammaKF_DecayVtx.GetZ(), gammaKF_PV.GetPx(), gammaKF_PV.GetPy(), gammaKF_PV.GetPz(), v0_sv.M(), dca_xy_v0_to_pv, dca_z_v0_to_pv, - cospa_kf, pca_kf, alpha, qt, chi2kf); + cospa_kf, cospaXY_kf, cospaRZ_kf, pca_kf, alpha, qt, chi2kf); v0photonskfcov(gammaKF_PV.GetCovariance(9), gammaKF_PV.GetCovariance(14), gammaKF_PV.GetCovariance(20), gammaKF_PV.GetCovariance(13), gammaKF_PV.GetCovariance(19), gammaKF_PV.GetCovariance(18)); diff --git a/PWGEM/PhotonMeson/TableProducer/skimmerGammaConversion.cxx b/PWGEM/PhotonMeson/TableProducer/skimmerGammaConversion.cxx index 8c8e2c8a109..6a39aea8881 100644 --- a/PWGEM/PhotonMeson/TableProducer/skimmerGammaConversion.cxx +++ b/PWGEM/PhotonMeson/TableProducer/skimmerGammaConversion.cxx @@ -313,7 +313,7 @@ struct skimmerGammaConversion { gammaKF_DecayVtx.GetX(), gammaKF_DecayVtx.GetY(), gammaKF_DecayVtx.GetZ(), gammaKF_DecayVtx.GetPx(), gammaKF_DecayVtx.GetPy(), gammaKF_DecayVtx.GetPz(), v0_sv.M(), dca_xy_v0_to_pv, dca_z_v0_to_pv, - cospa_kf, pca_kf, alpha, qt, chi2kf); + cospa_kf, 1.f, 1.f, pca_kf, alpha, qt, chi2kf); fillTrackTable(pos, kfp_pos_DecayVtx); fillTrackTable(ele, kfp_ele_DecayVtx); diff --git a/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx b/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx index 606cb9548ed..b72fdedb8da 100644 --- a/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx +++ b/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx @@ -70,15 +70,16 @@ struct skimmerPrimaryElectronFromDalitzEE { Configurable maxchi2its{"maxchi2its", 6.0, "max. chi2/NclsITS"}; Configurable minpt{"minpt", 0.05, "min pt for track"}; Configurable maxeta{"maxeta", 2.0, "max eta acceptance"}; - Configurable dca_xy_max{"dca_xy_max", 0.05, "max DCAxy in cm"}; - Configurable dca_z_max{"dca_z_max", 0.05, "max DCAz in cm"}; + Configurable dca_xy_max{"dca_xy_max", 1, "max DCAxy in cm"}; + Configurable dca_z_max{"dca_z_max", 1, "max DCAz in cm"}; + Configurable dca_3d_sigma_max{"dca_3d_sigma_max", 2, "max DCA 3D in sigma"}; Configurable minTPCNsigmaEl{"minTPCNsigmaEl", -2.5, "min. TPC n sigma for electron inclusion"}; Configurable maxTPCNsigmaEl{"maxTPCNsigmaEl", +3.5, "max. TPC n sigma for electron inclusion"}; Configurable maxTPCNsigmaPi{"maxTPCNsigmaPi", 0.0, "max. TPC n sigma for pion exclusion"}; Configurable minTPCNsigmaPi{"minTPCNsigmaPi", 0.0, "min. TPC n sigma for pion exclusion"}; Configurable minTOFNsigmaEl{"minTOFNsigmaEl", -3.5, "min. TOF n sigma for electron inclusion"}; Configurable maxTOFNsigmaEl{"maxTOFNsigmaEl", +3.5, "max. TOF n sigma for electron inclusion"}; - Configurable maxMee{"maxMee", 0.03, "max. mee to store dalitz ee pairs"}; + Configurable maxMee{"maxMee", 0.04, "max. mee to store dalitz ee pairs"}; Configurable fillLS{"fillLS", true, "flag to fill LS histograms for QA"}; HistogramRegistry fRegistry{"output", {}, OutputObjHandlingPolicy::AnalysisObject, false, false}; @@ -227,6 +228,18 @@ struct skimmerPrimaryElectronFromDalitzEE { return false; } + float dca_3d = 999.f; + float det = track.cYY() * track.cZZ() - track.cZY() * track.cZY(); + if (det < 0) { + dca_3d = 999.f; + } else { + float chi2 = (track.dcaXY() * track.dcaXY() * track.cZZ() + track.dcaZ() * track.dcaZ() * track.cYY() - 2. * track.dcaXY() * track.dcaZ() * track.cZY()) / det; + dca_3d = std::sqrt(std::fabs(chi2) / 2.); + } + if (dca_3d > dca_3d_sigma_max) { + return false; + } + if (track.pt() < minpt || std::fabs(track.eta()) > maxeta) { return false; } diff --git a/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx b/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx index 3345afc4e83..6d289eccbb6 100644 --- a/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx +++ b/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx @@ -187,17 +187,29 @@ struct DalitzEEQC { fRegistry.add("Track/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{400, -20, 20}}, false); fRegistry.add("Track/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {40, -2.0f, 2.0f}}, false); fRegistry.add("Track/hDCAxyz", "DCA xy vs. z;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -1.0f, 1.0f}, {200, -1.0f, 1.0f}}, false); + fRegistry.add("Track/hDCAxyzSigma", "DCA xy vs. z;DCA_{xy} (#sigma);DCA_{z} (#sigma)", kTH2F, {{200, -10.0f, 10.0f}, {200, -10.0f, 10.0f}}, false); + fRegistry.add("Track/hDCAxyRes_Pt", "DCA_{xy} resolution vs. pT;p_{T} (GeV/c);DCA_{xy} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0., 500}}, false); + fRegistry.add("Track/hDCAzRes_Pt", "DCA_{z} resolution vs. pT;p_{T} (GeV/c);DCA_{z} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0., 500}}, false); fRegistry.add("Track/hNclsTPC", "number of TPC clusters", kTH1F, {{161, -0.5, 160.5}}, false); fRegistry.add("Track/hNcrTPC", "number of TPC crossed rows", kTH1F, {{161, -0.5, 160.5}}, false); fRegistry.add("Track/hChi2TPC", "chi2/number of TPC clusters", kTH1F, {{100, 0, 10}}, false); - fRegistry.add("Track/hTPCdEdx", "TPC dE/dx;p_{in} (GeV/c);TPC dE/dx (a.u.)", kTH2F, {{1000, 0, 10}, {200, 0, 200}}, false); - fRegistry.add("Track/hTPCNsigmaEl", "TPC n sigma el;p_{in} (GeV/c);n #sigma_{e}^{TPC}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); - fRegistry.add("Track/hTPCNsigmaPi", "TPC n sigma pi;p_{in} (GeV/c);n #sigma_{#pi}^{TPC}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); fRegistry.add("Track/hTPCNcr2Nf", "TPC Ncr/Nfindable", kTH1F, {{200, 0, 2}}, false); fRegistry.add("Track/hTPCNcls2Nf", "TPC Ncls/Nfindable", kTH1F, {{200, 0, 2}}, false); + fRegistry.add("Track/hTPCNclsShared", "TPC Ncls shared/Ncls;p_{T} (GeV/c);N_{cls}^{shared}/N_{cls} in TPC", kTH2F, {{1000, 0, 10}, {100, 0, 1}}, false); + fRegistry.add("Track/hNclsITS", "number of ITS clusters", kTH1F, {{8, -0.5, 7.5}}, false); fRegistry.add("Track/hChi2ITS", "chi2/number of ITS clusters", kTH1F, {{100, 0, 10}}, false); fRegistry.add("Track/hITSClusterMap", "ITS cluster map", kTH1F, {{128, -0.5, 127.5}}, false); + fRegistry.add("Track/hMeanClusterSizeITS", "mean cluster size ITS;p_{pv} (GeV/c); on ITS #times cos(#lambda)", kTH2F, {{1000, 0, 10}, {150, 0, 15}}, false); + + fRegistry.add("Track/hTPCdEdx", "TPC dE/dx;p_{in} (GeV/c);TPC dE/dx (a.u.)", kTH2F, {{1000, 0, 10}, {200, 0, 200}}, false); + fRegistry.add("Track/hTPCNsigmaEl", "TPC n sigma el;p_{in} (GeV/c);n #sigma_{e}^{TPC}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); + fRegistry.add("Track/hTPCNsigmaPi", "TPC n sigma pi;p_{in} (GeV/c);n #sigma_{#pi}^{TPC}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); + + fRegistry.add("Track/hChi2TOF", "chi2 of TOF", kTH1F, {{100, 0, 10}}, false); + fRegistry.add("Track/hTOFbeta", "TOF beta;p_{pv} (GeV/c);#beta", kTH2F, {{1000, 0, 10}, {240, 0, 1.2}}, false); + fRegistry.add("Track/hTOFNsigmaEl", "TOF n sigma el;p_{pv} (GeV/c);n #sigma_{e}^{TOF}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); + fRegistry.add("Track/hTOFNsigmaPi", "TOF n sigma pi;p_{pv} (GeV/c);n #sigma_{#pi}^{TOF}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); } void DefineEMEventCut() @@ -304,17 +316,26 @@ struct DalitzEEQC { fRegistry.fill(HIST("Track/hQoverPt"), track.sign() / track.pt()); fRegistry.fill(HIST("Track/hEtaPhi"), track.phi(), track.eta()); fRegistry.fill(HIST("Track/hDCAxyz"), track.dcaXY(), track.dcaZ()); + fRegistry.fill(HIST("Track/hDCAxyzSigma"), track.dcaXY() / sqrt(track.cYY()), track.dcaZ() / sqrt(track.cZZ())); + fRegistry.fill(HIST("Track/hDCAxyRes_Pt"), track.pt(), sqrt(track.cYY()) * 1e+4); // convert cm to um + fRegistry.fill(HIST("Track/hDCAzRes_Pt"), track.pt(), sqrt(track.cZZ()) * 1e+4); // convert cm to um fRegistry.fill(HIST("Track/hNclsITS"), track.itsNCls()); fRegistry.fill(HIST("Track/hNclsTPC"), track.tpcNClsFound()); fRegistry.fill(HIST("Track/hNcrTPC"), track.tpcNClsCrossedRows()); fRegistry.fill(HIST("Track/hTPCNcr2Nf"), track.tpcCrossedRowsOverFindableCls()); fRegistry.fill(HIST("Track/hTPCNcls2Nf"), track.tpcFoundOverFindableCls()); + fRegistry.fill(HIST("Track/hTPCNclsShared"), track.pt(), track.tpcFractionSharedCls()); fRegistry.fill(HIST("Track/hChi2TPC"), track.tpcChi2NCl()); fRegistry.fill(HIST("Track/hChi2ITS"), track.itsChi2NCl()); + fRegistry.fill(HIST("Track/hChi2TOF"), track.tofChi2()); fRegistry.fill(HIST("Track/hITSClusterMap"), track.itsClusterMap()); fRegistry.fill(HIST("Track/hTPCdEdx"), track.tpcInnerParam(), track.tpcSignal()); fRegistry.fill(HIST("Track/hTPCNsigmaEl"), track.tpcInnerParam(), track.tpcNSigmaEl()); fRegistry.fill(HIST("Track/hTPCNsigmaPi"), track.tpcInnerParam(), track.tpcNSigmaPi()); + fRegistry.fill(HIST("Track/hTOFNsigmaEl"), track.p(), track.tofNSigmaEl()); + fRegistry.fill(HIST("Track/hTOFNsigmaPi"), track.p(), track.tofNSigmaPi()); + fRegistry.fill(HIST("Track/hTOFbeta"), track.p(), track.beta()); + fRegistry.fill(HIST("Track/hMeanClusterSizeITS"), track.p(), track.meanClusterSizeITS() * std::cos(std::atan(track.tgl()))); } Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); diff --git a/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx b/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx index dc5ae5721eb..91c54bf439f 100644 --- a/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx @@ -64,6 +64,7 @@ struct DalitzEEQCMC { Configurable cfgCentMin{"cfgCentMin", 0, "min. centrality"}; Configurable cfgCentMax{"cfgCentMax", 999.f, "max. centrality"}; Configurable maxY{"maxY", 0.9, "maximum rapidity for reconstructed particles"}; + Configurable cfgRequireTrueAssociation{"cfgRequireTrueAssociation", false, "flag to require true mc collision association"}; EMPhotonEventCut fEMEventCut; struct : ConfigurableGroup { @@ -159,18 +160,29 @@ struct DalitzEEQCMC { fRegistry.add("Track/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{400, -20, 20}}, false); fRegistry.add("Track/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {40, -2.0f, 2.0f}}, false); fRegistry.add("Track/hDCAxyz", "DCA xy vs. z;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -1.0f, 1.0f}, {200, -1.0f, 1.0f}}, false); + fRegistry.add("Track/hDCAxyzSigma", "DCA xy vs. z;DCA_{xy} (#sigma);DCA_{z} (#sigma)", kTH2F, {{200, -10.0f, 10.0f}, {200, -10.0f, 10.0f}}, false); + fRegistry.add("Track/hDCAxyRes_Pt", "DCA_{xy} resolution vs. pT;p_{T} (GeV/c);DCA_{xy} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0., 500}}, false); + fRegistry.add("Track/hDCAzRes_Pt", "DCA_{z} resolution vs. pT;p_{T} (GeV/c);DCA_{z} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0., 500}}, false); fRegistry.add("Track/hNclsTPC", "number of TPC clusters", kTH1F, {{161, -0.5, 160.5}}, false); fRegistry.add("Track/hNcrTPC", "number of TPC crossed rows", kTH1F, {{161, -0.5, 160.5}}, false); fRegistry.add("Track/hChi2TPC", "chi2/number of TPC clusters", kTH1F, {{100, 0, 10}}, false); + fRegistry.add("Track/hTPCNcr2Nf", "TPC Ncr/Nfindable", kTH1F, {{200, 0, 2}}, false); + fRegistry.add("Track/hTPCNcls2Nf", "TPC Ncls/Nfindable", kTH1F, {{200, 0, 2}}, false); + fRegistry.add("Track/hTPCNclsShared", "TPC Ncls shared/Ncls;p_{T} (GeV/c);N_{cls}^{shared}/N_{cls} in TPC", kTH2F, {{1000, 0, 10}, {100, 0, 1}}, false); + fRegistry.add("Track/hTPCdEdx", "TPC dE/dx;p_{in} (GeV/c);TPC dE/dx (a.u.)", kTH2F, {{1000, 0, 10}, {200, 0, 200}}, false); fRegistry.add("Track/hTPCNsigmaEl", "TPC n sigma el;p_{in} (GeV/c);n #sigma_{e}^{TPC}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); fRegistry.add("Track/hTPCNsigmaPi", "TPC n sigma pi;p_{in} (GeV/c);n #sigma_{#pi}^{TPC}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); - fRegistry.add("Track/hTPCNcr2Nf", "TPC Ncr/Nfindable", kTH1F, {{200, 0, 2}}, false); - fRegistry.add("Track/hTPCNcls2Nf", "TPC Ncls/Nfindable", kTH1F, {{200, 0, 2}}, false); + fRegistry.add("Track/hNclsITS", "number of ITS clusters", kTH1F, {{8, -0.5, 7.5}}, false); fRegistry.add("Track/hChi2ITS", "chi2/number of ITS clusters", kTH1F, {{100, 0, 10}}, false); fRegistry.add("Track/hITSClusterMap", "ITS cluster map", kTH1F, {{128, -0.5, 127.5}}, false); fRegistry.add("Track/hMeanClusterSizeITS", "mean cluster size ITS; on ITS #times cos(#lambda)", kTH1F, {{32, 0, 16}}, false); + + fRegistry.add("Track/hChi2TOF", "chi2 of TOF", kTH1F, {{100, 0, 10}}, false); + fRegistry.add("Track/hTOFbeta", "TOF beta;p_{pv} (GeV/c);#beta", kTH2F, {{1000, 0, 10}, {240, 0, 1.2}}, false); + fRegistry.add("Track/hTOFNsigmaEl", "TOF n sigma el;p_{pv} (GeV/c);n #sigma_{e}^{TOF}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); + fRegistry.add("Track/hTOFNsigmaPi", "TOF n sigma pi;p_{pv} (GeV/c);n #sigma_{#pi}^{TOF}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); } void init(InitContext&) @@ -300,7 +312,7 @@ struct DalitzEEQCMC { } template - bool fillTruePairInfo(TCollision const&, TTrack1 const& t1, TTrack2 const& t2, TMCParticles const& mcparticles) + bool fillTruePairInfo(TCollision const& collision, TTrack1 const& t1, TTrack2 const& t2, TMCParticles const& mcparticles) { if (!fDileptonCut.IsSelectedTrack(t1) || !fDileptonCut.IsSelectedTrack(t2)) { return false; @@ -314,8 +326,7 @@ struct DalitzEEQCMC { auto t2mc = t2.template emmcparticle_as(); int mother_id = FindLF(t1mc, t2mc, mcparticles); - int hfee_type = IsHF(t1mc, t2mc, mcparticles); - if (mother_id < 0 && hfee_type < 0) { + if (mother_id < 0) { return false; } ROOT::Math::PtEtaPhiMVector v1(t1.pt(), t1.eta(), t1.phi(), o2::constants::physics::MassElectron); @@ -328,6 +339,10 @@ struct DalitzEEQCMC { if (mother_id > -1 && t1mc.pdgCode() * t2mc.pdgCode() < 0) { auto mcmother = mcparticles.iteratorAt(mother_id); + if (cfgRequireTrueAssociation && (mcmother.emmceventId() != collision.emmceventId())) { + return false; + } + if (mcmother.isPhysicalPrimary() || mcmother.producedByGenerator()) { if ((t1mc.isPhysicalPrimary() || t1mc.producedByGenerator()) && (t2mc.isPhysicalPrimary() || t2mc.producedByGenerator())) { switch (abs(mcmother.pdgCode())) { @@ -405,18 +420,25 @@ struct DalitzEEQCMC { fRegistry.fill(HIST("Track/hQoverPt"), track.sign() / track.pt()); fRegistry.fill(HIST("Track/hEtaPhi"), track.phi(), track.eta()); fRegistry.fill(HIST("Track/hDCAxyz"), track.dcaXY(), track.dcaZ()); + fRegistry.fill(HIST("Track/hDCAxyzSigma"), track.dcaXY() / sqrt(track.cYY()), track.dcaZ() / sqrt(track.cZZ())); + fRegistry.fill(HIST("Track/hDCAxyRes_Pt"), track.pt(), sqrt(track.cYY()) * 1e+4); // convert cm to um + fRegistry.fill(HIST("Track/hDCAzRes_Pt"), track.pt(), sqrt(track.cZZ()) * 1e+4); // convert cm to um fRegistry.fill(HIST("Track/hNclsITS"), track.itsNCls()); fRegistry.fill(HIST("Track/hNclsTPC"), track.tpcNClsFound()); fRegistry.fill(HIST("Track/hNcrTPC"), track.tpcNClsCrossedRows()); fRegistry.fill(HIST("Track/hTPCNcr2Nf"), track.tpcCrossedRowsOverFindableCls()); fRegistry.fill(HIST("Track/hTPCNcls2Nf"), track.tpcFoundOverFindableCls()); + fRegistry.fill(HIST("Track/hTPCNclsShared"), track.pt(), track.tpcFractionSharedCls()); fRegistry.fill(HIST("Track/hChi2TPC"), track.tpcChi2NCl()); fRegistry.fill(HIST("Track/hChi2ITS"), track.itsChi2NCl()); fRegistry.fill(HIST("Track/hITSClusterMap"), track.itsClusterMap()); - fRegistry.fill(HIST("Track/hMeanClusterSizeITS"), track.meanClusterSizeITS() * std::cos(std::atan(track.tgl()))); + fRegistry.fill(HIST("Track/hMeanClusterSizeITS"), track.p(), track.meanClusterSizeITS() * std::cos(std::atan(track.tgl()))); fRegistry.fill(HIST("Track/hTPCdEdx"), track.tpcInnerParam(), track.tpcSignal()); fRegistry.fill(HIST("Track/hTPCNsigmaEl"), track.tpcInnerParam(), track.tpcNSigmaEl()); fRegistry.fill(HIST("Track/hTPCNsigmaPi"), track.tpcInnerParam(), track.tpcNSigmaPi()); + fRegistry.fill(HIST("Track/hTOFNsigmaEl"), track.p(), track.tofNSigmaEl()); + fRegistry.fill(HIST("Track/hTOFNsigmaPi"), track.p(), track.tofNSigmaPi()); + fRegistry.fill(HIST("Track/hTOFbeta"), track.p(), track.beta()); } std::vector used_trackIds; @@ -509,8 +531,7 @@ struct DalitzEEQCMC { } int mother_id = FindLF(t1, t2, mcparticles); - int hfee_type = IsHF(t1, t2, mcparticles); - if (mother_id < 0 && hfee_type < 0) { + if (mother_id < 0) { continue; } ROOT::Math::PtEtaPhiMVector v1(t1.pt(), t1.eta(), t1.phi(), o2::constants::physics::MassElectron); diff --git a/PWGEM/PhotonMeson/Tasks/pcmQC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQC.cxx index ccc28ed652e..81fbd5328ef 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQC.cxx @@ -136,7 +136,8 @@ struct PCMQC { // v0 info fRegistry.add("V0/hPt", "pT;p_{T,#gamma} (GeV/c)", kTH1F, {{2000, 0.0f, 20}}, false); fRegistry.add("V0/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{90, 0, 2 * M_PI}, {200, -1.0f, 1.0f}}, false); - fRegistry.add("V0/hRadius", "V0Radius; radius in Z (cm);radius in XY (cm)", kTH2F, {{200, -100, 100}, {200, 0.0f, 100.0f}}, false); + fRegistry.add("V0/hXY", "conversion point in XY;V_{x} (cm);V_{y} (cm)", kTH2F, {{400, -100.0f, 100.0f}, {400, -100.0f, 100.0f}}, false); + fRegistry.add("V0/hRZ", "conversion point in RZ;Z (cm);R_{xy} (cm)", kTH2F, {{200, -100, 100}, {200, 0.0f, 100.0f}}, false); fRegistry.add("V0/hCosPA", "V0CosPA;cosine pointing angle in 3D", kTH1F, {{100, 0.99f, 1.0f}}, false); fRegistry.add("V0/hCosPAXY", "V0CosPA;cosine pointing angle in XY", kTH1F, {{100, 0.99f, 1.0f}}, false); fRegistry.add("V0/hCosPARZ", "V0CosPA;cosine pointing angle in RZ", kTH1F, {{100, 0.99f, 1.0f}}, false); @@ -145,7 +146,6 @@ struct PCMQC { fRegistry.add("V0/hDCAz_Pt", "DCA_{z} to PV vs. p_{T};DCA_{z} (cm);p_{T} (GeV/c)", kTH2F, {{200, -5.f, +5.f}, {2000, 0.0f, 20}}, false); fRegistry.add("V0/hAPplot", "AP plot;#alpha;q_{T} (GeV/c)", kTH2F, {{200, -1.0f, +1.0f}, {250, 0.0f, 0.25f}}, false); fRegistry.add("V0/hMassGamma", "hMassGamma;R_{xy} (cm);m_{ee} (GeV/c^{2})", kTH2F, {{200, 0.0f, 100.0f}, {100, 0.0f, 0.1f}}, false); - fRegistry.add("V0/hGammaRxy", "conversion point in XY;V_{x} (cm);V_{y} (cm)", kTH2F, {{400, -100.0f, 100.0f}, {400, -100.0f, 100.0f}}, false); fRegistry.add("V0/hKFChi2vsM", "KF chi2 vs. m_{ee};m_{ee} (GeV/c^{2});KF chi2/NDF", kTH2F, {{100, 0.0f, 0.1f}, {100, 0.f, 100.0f}}, false); fRegistry.add("V0/hKFChi2vsR", "KF chi2 vs. conversion point in XY;R_{xy} (cm);KF chi2/NDF", kTH2F, {{200, 0.0f, 100.0f}, {100, 0.f, 100.0f}}, false); fRegistry.add("V0/hKFChi2vsX", "KF chi2 vs. conversion point in X;X (cm);KF chi2/NDF", kTH2F, {{200, -100.0f, 100.0f}, {100, 0.f, 100.0f}}, false); @@ -156,7 +156,7 @@ struct PCMQC { fRegistry.add("V0/hEtaResolution", "#eta resolution;p_{#gamma} (GeV/c);#Delta#eta", kTH2F, {{1000, 0.0f, 10}, {100, 0, 0.01}}, false); fRegistry.add("V0/hThetaResolution", "#theta resolution;p_{#gamma} (GeV/c);#Delta#theta (rad.)", kTH2F, {{1000, 0.0f, 10}, {100, 0, 0.01}}, false); fRegistry.add("V0/hPhiResolution", "#varphi resolution;p_{#gamma} (GeV/c);#Delta#varphi (rad.)", kTH2F, {{1000, 0.0f, 10}, {100, 0, 0.01}}, false); - fRegistry.add("V0/hsConvPoint", "photon conversion point;r_{xy} (cm);#varphi (rad.);#eta;", kTHnSparseF, {{100, 0.0f, 100}, {90, 0, 2 * M_PI}, {40, -2, +2}}, false); + fRegistry.add("V0/hsConvPoint", "photon conversion point;r_{xy} (cm);#varphi (rad.);#eta;", kTHnSparseF, {{100, 0.0f, 100}, {90, 0, 2 * M_PI}, {80, -2, +2}}, false); fRegistry.add("V0/hNgamma", "Number of #gamma candidates per collision", kTH1F, {{101, -0.5f, 100.5f}}); // v0leg info @@ -274,21 +274,21 @@ struct PCMQC { fRegistry.fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hMultFT0MvsMultNTracksPV"), collision.multFT0A() + collision.multFT0C(), collision.multNTracksPV()); } - template - void fillV0Info(TCollision const& collision, TV0 const& v0) + template + void fillV0Info(TV0 const& v0) { fRegistry.fill(HIST("V0/hPt"), v0.pt()); fRegistry.fill(HIST("V0/hEtaPhi"), v0.phi(), v0.eta()); - fRegistry.fill(HIST("V0/hRadius"), v0.vz(), v0.v0radius()); + fRegistry.fill(HIST("V0/hXY"), v0.vx(), v0.vy()); + fRegistry.fill(HIST("V0/hRZ"), v0.vz(), v0.v0radius()); fRegistry.fill(HIST("V0/hCosPA"), v0.cospa()); - fRegistry.fill(HIST("V0/hCosPAXY"), v0.cosPAXY(collision.posX(), collision.posY())); - fRegistry.fill(HIST("V0/hCosPARZ"), v0.cosPARZ(collision.posX(), collision.posY(), collision.posZ())); + fRegistry.fill(HIST("V0/hCosPAXY"), v0.cospaXY()); + fRegistry.fill(HIST("V0/hCosPARZ"), v0.cospaRZ()); fRegistry.fill(HIST("V0/hPCA"), v0.pca()); fRegistry.fill(HIST("V0/hDCAxyz"), v0.dcaXYtopv(), v0.dcaZtopv()); fRegistry.fill(HIST("V0/hDCAz_Pt"), v0.dcaZtopv(), v0.pt()); fRegistry.fill(HIST("V0/hAPplot"), v0.alpha(), v0.qtarm()); fRegistry.fill(HIST("V0/hMassGamma"), v0.v0radius(), v0.mGamma()); - fRegistry.fill(HIST("V0/hGammaRxy"), v0.vx(), v0.vy()); fRegistry.fill(HIST("V0/hKFChi2vsM"), v0.mGamma(), v0.chiSquareNDF()); fRegistry.fill(HIST("V0/hKFChi2vsR"), v0.v0radius(), v0.chiSquareNDF()); fRegistry.fill(HIST("V0/hKFChi2vsX"), v0.vx(), v0.chiSquareNDF()); @@ -364,7 +364,7 @@ struct PCMQC { if (!fV0PhotonCut.IsSelected(v0)) { continue; } - fillV0Info(collision, v0); + fillV0Info(v0); for (auto& leg : {pos, ele}) { fillV0LegInfo(leg); } diff --git a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx index e3f7ab23b56..2758390cca8 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx @@ -150,7 +150,7 @@ struct PCMQCMC { fRegistry.add("Generated/hXY", "conversion point in XY MC;V_{x} (cm);V_{y} (cm)", kTH2F, {{800, -100.0f, 100.0f}, {800, -100.0f, 100.0f}}, true); fRegistry.add("Generated/hRZ", "conversion point in RZ MC;V_{z} (cm);R_{xy} (cm)", kTH2F, {{400, -100.0f, 100.0f}, {400, 0.f, 100.0f}}, true); fRegistry.add("Generated/hRPhi", "conversion point of #varphi vs. R_{xy} MC;#varphi (rad.);R_{xy} (cm);N_{e}", kTH2F, {{360, 0.0f, 2 * M_PI}, {400, 0, 100}}, true); - fRegistry.add("Generated/hsConvPoint", "photon conversion point;r_{xy} (cm);#varphi (rad.);#eta;", kTHnSparseF, {{100, 0.0f, 100}, {90, 0, 2 * M_PI}, {40, -2, +2}}, true); + fRegistry.add("Generated/hsConvPoint", "photon conversion point;r_{xy} (cm);#varphi (rad.);#eta;", kTHnSparseF, {{100, 0.0f, 100}, {90, 0, 2 * M_PI}, {80, -2, +2}}, true); } // event info @@ -180,7 +180,8 @@ struct PCMQCMC { // v0 info fRegistry.add("V0/primary/hPt", "pT;p_{T,#gamma} (GeV/c)", kTH1F, {{2000, 0.0f, 20}}, false); fRegistry.add("V0/primary/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{90, 0, 2 * M_PI}, {200, -1.0f, 1.0f}}, false); - fRegistry.add("V0/primary/hRadius", "V0Radius; radius in Z (cm);radius in XY (cm)", kTH2F, {{200, -100, 100}, {200, 0.0f, 100.0f}}, false); + fRegistry.add("V0/primary/hXY", "conversion point in XY;V_{x} (cm);V_{y} (cm)", kTH2F, {{400, -100.0f, 100.0f}, {400, -100.0f, 100.0f}}, false); + fRegistry.add("V0/primary/hRZ", "conversion point in RZ;Z (cm);R_{xy} (cm)", kTH2F, {{200, -100, 100}, {200, 0.0f, 100.0f}}, false); fRegistry.add("V0/primary/hCosPA", "V0CosPA;cosine pointing angle in 3D", kTH1F, {{100, 0.99f, 1.0f}}, false); fRegistry.add("V0/primary/hCosPAXY", "V0CosPA;cosine pointing angle in XY", kTH1F, {{100, 0.99f, 1.0f}}, false); fRegistry.add("V0/primary/hCosPARZ", "V0CosPA;cosine pointing angle in RZ", kTH1F, {{100, 0.99f, 1.0f}}, false); @@ -189,7 +190,6 @@ struct PCMQCMC { fRegistry.add("V0/primary/hDCAz_Pt", "DCA_{z} to PV vs. p_{T};DCA_{z} (cm);p_{T} (GeV/c)", kTH2F, {{200, -5.f, +5.f}, {2000, 0.0f, 20}}, false); fRegistry.add("V0/primary/hAPplot", "AP plot;#alpha;q_{T} (GeV/c)", kTH2F, {{200, -1.0f, +1.0f}, {250, 0.0f, 0.25f}}, false); fRegistry.add("V0/primary/hMassGamma", "hMassGamma;R_{xy} (cm);m_{ee} (GeV/c^{2})", kTH2F, {{200, 0.0f, 100.0f}, {100, 0.0f, 0.1f}}, false); - fRegistry.add("V0/primary/hGammaRxy", "conversion point in XY;V_{x} (cm);V_{y} (cm)", kTH2F, {{400, -100.0f, 100.0f}, {400, -100.0f, 100.0f}}, false); fRegistry.add("V0/primary/hKFChi2vsM", "KF chi2 vs. m_{ee};m_{ee} (GeV/c^{2});KF chi2/NDF", kTH2F, {{100, 0.0f, 0.1f}, {100, 0.f, 100.0f}}, false); fRegistry.add("V0/primary/hKFChi2vsR", "KF chi2 vs. conversion point in XY;R_{xy} (cm);KF chi2/NDF", kTH2F, {{200, 0.0f, 100.0f}, {100, 0.f, 100.0f}}, false); fRegistry.add("V0/primary/hKFChi2vsX", "KF chi2 vs. conversion point in X;X (cm);KF chi2/NDF", kTH2F, {{200, -100.0f, 100.0f}, {100, 0.f, 100.0f}}, false); @@ -207,9 +207,9 @@ struct PCMQCMC { fRegistry.add("V0/primary/hPtGen_DeltaPtOverPtGen", "photon p_{T} resolution;p_{T}^{gen} (GeV/c);(p_{T}^{rec} - p_{T}^{gen})/p_{T}^{gen}", kTH2F, {{1000, 0, 10}, {400, -1.0f, 1.0f}}, true); fRegistry.add("V0/primary/hPtGen_DeltaEta", "photon #eta resolution;p_{T}^{gen} (GeV/c);#eta^{rec} - #eta^{gen}", kTH2F, {{1000, 0, 10}, {400, -1.0f, 1.0f}}, true); fRegistry.add("V0/primary/hPtGen_DeltaPhi", "photon #varphi resolution;p_{T}^{gen} (GeV/c);#varphi^{rec} - #varphi^{gen} (rad.)", kTH2F, {{1000, 0, 10}, {400, -1.0f, 1.0f}}, true); - fRegistry.add("V0/primary/hXY_Photon_MC", "X vs. Y of true photon conversion point.;X (cm);Y (cm)", kTH2F, {{400, -100.0f, +100}, {400, -100, +100}}, true); - fRegistry.add("V0/primary/hRZ_Photon_MC", "R vs. Z of true photon conversion point;Z (cm);R_{xy} (cm)", kTH2F, {{200, -100.0f, +100}, {200, 0, 100}}, true); - fRegistry.add("V0/primary/hsConvPoint", "photon conversion point;r_{xy} (cm);#varphi (rad.);#eta;", kTHnSparseF, {{100, 0.0f, 100}, {90, 0, 2 * M_PI}, {40, -2, +2}}, false); + fRegistry.add("V0/primary/hXY_MC", "X vs. Y of true photon conversion point.;X (cm);Y (cm)", kTH2F, {{400, -100.0f, +100}, {400, -100, +100}}, true); + fRegistry.add("V0/primary/hRZ_MC", "R vs. Z of true photon conversion point;Z (cm);R_{xy} (cm)", kTH2F, {{200, -100.0f, +100}, {200, 0, 100}}, true); + fRegistry.add("V0/primary/hsConvPoint", "photon conversion point;r_{xy} (cm);#varphi (rad.);#eta;", kTHnSparseF, {{100, 0.0f, 100}, {90, 0, 2 * M_PI}, {80, -2, +2}}, false); fRegistry.addClone("V0/primary/", "V0/fromWD/"); // from weak decay fRegistry.addClone("V0/primary/", "V0/fromHS/"); // from hadronic shower in detector materials @@ -334,21 +334,21 @@ struct PCMQCMC { fRegistry.fill(HIST("Event/") + HIST(event_types[ev_id]) + HIST("hMultFT0MvsMultNTracksPV"), collision.multFT0A() + collision.multFT0C(), collision.multNTracksPV()); } - template - void fillV0Info(TCollision const& collision, TV0 const& v0, TMCV0 const& mcphoton, TMCLeg const& mcleg) + template + void fillV0Info(TV0 const& v0, TMCV0 const& mcphoton, TMCLeg const& mcleg) { fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hPt"), v0.pt()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hEtaPhi"), v0.phi(), v0.eta()); - fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hRadius"), v0.vz(), v0.v0radius()); + fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hXY"), v0.vx(), v0.vy()); + fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hRZ"), v0.vz(), v0.v0radius()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hCosPA"), v0.cospa()); - fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hCosPAXY"), v0.cosPAXY(collision.posX(), collision.posY())); - fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hCosPARZ"), v0.cosPARZ(collision.posX(), collision.posY(), collision.posZ())); + fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hCosPAXY"), v0.cospaXY()); + fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hCosPARZ"), v0.cospaRZ()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hPCA"), v0.pca()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hDCAxyz"), v0.dcaXYtopv(), v0.dcaZtopv()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hDCAz_Pt"), v0.dcaZtopv(), v0.pt()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hAPplot"), v0.alpha(), v0.qtarm()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hMassGamma"), v0.v0radius(), v0.mGamma()); - fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hGammaRxy"), v0.vx(), v0.vy()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hKFChi2vsM"), v0.mGamma(), v0.chiSquareNDF()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hKFChi2vsR"), v0.v0radius(), v0.chiSquareNDF()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hKFChi2vsX"), v0.vx(), v0.chiSquareNDF()); @@ -365,8 +365,8 @@ struct PCMQCMC { fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hConvPoint_diffX"), mcleg.vx(), v0.vx() - mcleg.vx()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hConvPoint_diffY"), mcleg.vy(), v0.vy() - mcleg.vy()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hConvPoint_diffZ"), mcleg.vz(), v0.vz() - mcleg.vz()); - fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hXY_Photon_MC"), mcleg.vx(), mcleg.vy()); - fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hRZ_Photon_MC"), mcleg.vz(), std::sqrt(std::pow(mcleg.vx(), 2) + std::pow(mcleg.vy(), 2))); + fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hXY_MC"), mcleg.vx(), mcleg.vy()); + fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hRZ_MC"), mcleg.vz(), std::sqrt(std::pow(mcleg.vx(), 2) + std::pow(mcleg.vy(), 2))); float phi_cp = atan2(v0.vy(), v0.vx()); o2::math_utils::bringTo02Pi(phi_cp); @@ -451,19 +451,19 @@ struct PCMQCMC { } if (mcphoton.isPhysicalPrimary() || mcphoton.producedByGenerator()) { - fillV0Info<0>(collision, v0, mcphoton, elemc); + fillV0Info<0>(v0, mcphoton, elemc); for (auto& leg : {pos, ele}) { fillV0LegInfo<0>(leg); } ng_primary++; } else if (IsFromWD(mcphoton.template emmcevent_as(), mcphoton, mcparticles) > 0) { - fillV0Info<1>(collision, v0, mcphoton, elemc); + fillV0Info<1>(v0, mcphoton, elemc); for (auto& leg : {pos, ele}) { fillV0LegInfo<1>(leg); } ng_wd++; } else { - fillV0Info<2>(collision, v0, mcphoton, elemc); + fillV0Info<2>(v0, mcphoton, elemc); for (auto& leg : {pos, ele}) { fillV0LegInfo<2>(leg); } From 671c4a1dbeabb65b95bc4358a6b415ec427d1bad Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Mon, 10 Mar 2025 10:55:20 +0100 Subject: [PATCH 0624/1650] [PWGLF,Tutorial] Resonance Framework - introducing microTrack table (#10418) Co-authored-by: ALICE Action Bot --- PWGLF/DataModel/LFResonanceTables.h | 169 +++++++++++++++ .../Resonances/resonanceInitializer.cxx | 145 +++++++++++-- .../Resonances/resonanceModuleInitializer.cxx | 110 ++++++++++ Tutorials/PWGLF/Resonance/CMakeLists.txt | 5 + .../PWGLF/Resonance/resonancesMicrotrack.cxx | 203 ++++++++++++++++++ 5 files changed, 619 insertions(+), 13 deletions(-) create mode 100644 Tutorials/PWGLF/Resonance/resonancesMicrotrack.cxx diff --git a/PWGLF/DataModel/LFResonanceTables.h b/PWGLF/DataModel/LFResonanceTables.h index 589aca0155e..a026156e5be 100644 --- a/PWGLF/DataModel/LFResonanceTables.h +++ b/PWGLF/DataModel/LFResonanceTables.h @@ -23,6 +23,7 @@ #define PWGLF_DATAMODEL_LFRESONANCETABLES_H_ #include +#include #include "Common/DataModel/PIDResponse.h" #include "Common/Core/RecoDecay.h" @@ -330,6 +331,148 @@ DECLARE_SOA_DYNAMIC_COLUMN(Sign, sign, }); } // namespace resodaughter + +namespace resodmciroaughter +{ +// micro track for primary pion + +/// @brief Save TPC & TOF nSigma info with 8-bit variable +struct PidNSigma { + uint8_t flag; + + /// @brief Constructor: Convert TPC & TOF values and save + PidNSigma(float TPCnSigma, float TOFnSigma, bool hasTOF) + { + uint8_t TPCencoded = encodeNSigma(TPCnSigma); + uint8_t TOFencoded = hasTOF ? encodeNSigma(TOFnSigma) : 0x0F; // If TOF is not available, set all 4 bits to 1 + flag = (TPCencoded << 4) | TOFencoded; // Upper 4 bits = TPC, Lower 4 bits = TOF + } + + /// @brief Encode 0.2 sigma interval to 0~10 range + static uint8_t encodeNSigma(float nSigma) + { + float encoded = std::abs((nSigma - 1.5) / 0.2); // Convert to 0~10 range + encoded = std::min(std::max(encoded, 0.f), 10.f); // Clamp to 0~10 range + return (uint8_t)round(encoded); + } + + /// @brief Decode 0~10 value to original 1.5~3.5 sigma range + static float decodeNSigma(uint8_t encoded) + { + encoded = std::min(encoded, (uint8_t)10); // Safety check, should not be needed if encode is used properly + return (encoded * 0.2) + 1.5; + } + + /// @brief Check if TOF info is available + bool hasTOF() const + { + return (flag & 0x0F) != 0x0F; // Check if lower 4 bits are not all 1 + } + + /// @brief Restore TPC nSigma value + static float getTPCnSigma(uint8_t encoded) + { + return decodeNSigma((encoded >> 4) & 0x0F); // Extract upper 4 bits + } + + /// @brief Restore TOF nSigma value (if not available, return NAN) + static float getTOFnSigma(uint8_t encoded) + { + uint8_t TOFencoded = encoded & 0x0F; // Extract lower 4 bits + return (TOFencoded == 0x0F) ? NAN : decodeNSigma(TOFencoded); + } + + /// @brief Operator to convert to uint8_t (automatic conversion support) + operator uint8_t() const + { + return flag; + } +}; + +DECLARE_SOA_COLUMN(PidNSigmaPiFlag, pidNSigmaPiFlag, uint8_t); //! Pid flag for the track as Pion +DECLARE_SOA_COLUMN(PidNSigmaKaFlag, pidNSigmaKaFlag, uint8_t); //! Pid flag for the track as Kaon +DECLARE_SOA_COLUMN(PidNSigmaPrFlag, pidNSigmaPrFlag, uint8_t); //! Pid flag for the track as Proton +DECLARE_SOA_COLUMN(TrackSelectionFlags, trackSelectionFlags, int8_t); //! Track selection flags +DECLARE_SOA_DYNAMIC_COLUMN(HasTOF, hasTOF, + [](uint8_t pidNSigmaFlags) -> bool { + return (pidNSigmaFlags & 0x0F) != 0x0F; + }); + +/// @brief DCAxy & DCAz selection flag +struct ResoMicroTrackSelFlag { + uint8_t flag; // Flag for DCAxy & DCAz selection (8-bit variable) + + /// @brief Default constructor + ResoMicroTrackSelFlag() + { + flag = 0x00; + } + + /// @brief Constructor: Convert DCAxy/DCAz and save (default 1~15 values) + ResoMicroTrackSelFlag(float DCAxy, float DCAz) + { + uint8_t DCAxyEncoded = encodeDCA(DCAxy); + uint8_t DCAzEncoded = encodeDCA(DCAz); + flag = (DCAxyEncoded << 4) | DCAzEncoded; // Upper 4 bits = DCAxy, Lower 4 bits = DCAz + } + + /// @brief Convert DCA to 1~15 steps (0 value is not used) + static uint8_t encodeDCA(float DCA) + { + for (uint8_t i = 1; i < 15; i++) { + if (DCA < i * 0.1f) + return i; + } + return 15; + } + + /// @brief Operator to convert to `uint8_t` (for SOA storage) + operator uint8_t() const + { + return flag; + } + + /// @brief Get DCAxy value + uint8_t getDCAxyFlag() const + { + return (flag >> 4) & 0x0F; // Extract upper 4 bits + } + + /// @brief Get DCAz value + uint8_t getDCAzFlag() const + { + return flag & 0x0F; // Extract lower 4 bits + } + + /// @brief Apply DCAxy tight cut (0 value) + void setDCAxy0() + { + flag &= 0x0F; // Set DCAxy to 0 (delete upper 4 bits) + } + + /// @brief Apply DCAz tight cut (0 value) + void setDCAz0() + { + flag &= 0xF0; // Set DCAz to 0 (delete lower 4 bits) + } + /// @brief Decode DCAxy + static float decodeDCAxy(uint8_t flag_saved) + { + uint8_t DCAxyFlag = (flag_saved >> 4) & 0x0F; // Extract upper 4 bits + return (DCAxyFlag == 0) ? 0.0f : DCAxyFlag * 0.1f; // Tight cut(0) is 0.0, otherwise flag * 0.1 cm + } + + /// @brief Decode DCAz + static float decodeDCAz(uint8_t flag_saved) + { + uint8_t DCAzFlag = flag_saved & 0x0F; // Extract lower 4 bits + return (DCAzFlag == 0) ? 0.0f : DCAzFlag * 0.1f; // Tight cut(0) is 0.0, otherwise flag * 0.1 cm + } +}; + +DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, [](float px, float py) -> float { return RecoDecay::sqrtSumOfSquares(px, py); }); +} // namespace resodmciroaughter + DECLARE_SOA_TABLE(ResoTracks, "AOD", "RESOTRACK", o2::soa::Index<>, resodaughter::ResoCollisionId, @@ -373,6 +516,32 @@ DECLARE_SOA_TABLE(ResoTracks, "AOD", "RESOTRACK", resodaughter::Sign); using ResoTrack = ResoTracks::iterator; +DECLARE_SOA_TABLE(ResoMicroTracks, "AOD", "RESOMICROTRACK", + o2::soa::Index<>, + resodaughter::ResoCollisionId, + resodaughter::TrackId, + resodaughter::Px, + resodaughter::Py, + resodaughter::Pz, + resodmciroaughter::PidNSigmaPiFlag, + resodmciroaughter::PidNSigmaKaFlag, + resodmciroaughter::PidNSigmaPrFlag, + resodmciroaughter::TrackSelectionFlags, + resodaughter::TrackFlags, + // Dynamic columns + resodmciroaughter::Pt, + resodaughter::Eta, + resodaughter::Phi, + resodaughter::PassedITSRefit, + resodaughter::PassedTPCRefit, + resodaughter::IsGlobalTrackWoDCA, + resodaughter::IsGlobalTrack, + resodaughter::IsPrimaryTrack, + resodaughter::IsPVContributor, + resodmciroaughter::HasTOF, + resodaughter::Sign); +using ResoMicroTrack = ResoMicroTracks::iterator; + // For DF mixing study DECLARE_SOA_TABLE(ResoTrackDFs, "AOD", "RESOTRACKDF", o2::soa::Index<>, diff --git a/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx b/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx index 0c5e0c3ce45..baebb40c908 100644 --- a/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx +++ b/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx @@ -62,6 +62,7 @@ struct ResonanceInitializer { Produces resoSpheroCollisions; Produces resoEvtPlCollisions; Produces reso2trks; + Produces reso2microtrks; Produces reso2v0s; Produces reso2cascades; Produces reso2mctracks; @@ -77,6 +78,8 @@ struct ResonanceInitializer { Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; Configurable cfgFatalWhenNull{"cfgFatalWhenNull", true, "Fatal when null on ccdb access"}; + Configurable cfgFillMicroTracks{"cfgFillMicroTracks", false, "Fill micro tracks"}; + Configurable cfgBypassTrackFill{"cfgBypassTrackFill", true, "Bypass track fill"}; // Configurables Configurable dBzInput{"dBzInput", -999, "bz field, -999 is automatic"}; @@ -153,6 +156,9 @@ struct ResonanceInitializer { Configurable cfgFillPionTracks{"cfgFillPionTracks", false, "Fill pion tracks"}; Configurable cfgFillKaonTracks{"cfgFillKaonTracks", false, "Fill kaon tracks"}; Configurable cfgFillProtonTracks{"cfgFillProtonTracks", false, "Fill proton tracks"}; + Configurable cfgFillPionMicroTracks{"cfgFillPionMicroTracks", false, "Fill pion micro tracks"}; + Configurable cfgFillKaonMicroTracks{"cfgFillKaonMicroTracks", false, "Fill kaon micro tracks"}; + Configurable cfgFillProtonMicroTracks{"cfgFillProtonMicroTracks", false, "Fill proton micro tracks"}; Configurable cfgFillK0s{"cfgFillK0s", false, "Fill K0s"}; Configurable cfgFillLambda0{"cfgFillLambda0", false, "Fill Lambda0"}; Configurable cfgFillXi0{"cfgFillXi0", false, "Fill Xi0"}; @@ -234,6 +240,27 @@ struct ResonanceInitializer { using ResoCascadesMC = soa::Join; using BCsWithRun2Info = soa::Join; + template + bool filterMicroTrack(T const& track) + { + // if no selection is requested, return true + if (!FilterForDerivedTables.cfgFillPionMicroTracks && !FilterForDerivedTables.cfgFillKaonMicroTracks && !FilterForDerivedTables.cfgFillProtonMicroTracks) + return true; + if (FilterForDerivedTables.cfgFillPionMicroTracks) { + if (std::abs(track.tpcNSigmaPi()) < pidnSigmaPreSelectionCut) + return true; + } + if (FilterForDerivedTables.cfgFillKaonMicroTracks) { + if (std::abs(track.tpcNSigmaKa()) < pidnSigmaPreSelectionCut) + return true; + } + if (FilterForDerivedTables.cfgFillProtonMicroTracks) { + if (std::abs(track.tpcNSigmaPr()) < pidnSigmaPreSelectionCut) + return true; + } + return false; + } + template bool filterTrack(T const& track) { @@ -339,6 +366,19 @@ struct ResonanceInitializer { } return false; } + template + bool isMicroTrackSelected(CollisionType const&, TrackType const& track) + { + // Micro track selection + // DCAxy cut + if (std::fabs(track.dcaXY()) > cMaxDCArToPVcut) + return false; + // DCAz cut + if (std::fabs(track.dcaZ()) > cMaxDCAzToPVcut || std::fabs(track.dcaZ()) < cMinDCAzToPVcut) + return false; + return true; + } + template bool isTrackSelected(CollisionType const&, TrackType const& track) { @@ -590,11 +630,49 @@ struct ResonanceInitializer { returnValue = helperEP.GetResolution(helperEP.GetEventPlane(ResoEvents.qvecRe()[a * 4 + 3], ResoEvents.qvecIm()[a * 4 + 3], 2), helperEP.GetEventPlane(ResoEvents.qvecRe()[b * 4 + 3], ResoEvents.qvecIm()[b * 4 + 3], 2), 2); return returnValue; } - + // Filter for micro tracks + template + void fillMicroTracks(CollisionType const& collision, TrackType const& tracks) + { + // Loop over tracks + for (auto const& track : tracks) { + if (!isMicroTrackSelected(collision, track)) + continue; + if (!filterMicroTrack(track)) + continue; + o2::aod::resodmciroaughter::ResoMicroTrackSelFlag trackSelFlag(track.dcaXY(), track.dcaZ()); + if (std::abs(track.dcaXY()) < (0.004 + (0.013 / track.pt()))) { + trackSelFlag.setDCAxy0(); + } + if (std::abs(track.dcaZ()) < (0.004 + (0.013 / track.pt()))) { // TODO: check this + trackSelFlag.setDCAz0(); + } + uint8_t trackFlags = (track.passedITSRefit() << 0) | + (track.passedTPCRefit() << 1) | + (track.isGlobalTrackWoDCA() << 2) | + (track.isGlobalTrack() << 3) | + (track.isPrimaryTrack() << 4) | + (track.isPVContributor() << 5) | + (track.hasTOF() << 6) | + ((track.sign() > 0) << 7); // sign +1: 1, -1: 0 + reso2microtrks(resoCollisions.lastIndex(), + track.globalIndex(), + track.px(), + track.py(), + track.pz(), + static_cast(o2::aod::resodmciroaughter::PidNSigma(std::abs(track.tpcNSigmaPi()), std::abs(track.tofNSigmaPi()), track.hasTOF())), + static_cast(o2::aod::resodmciroaughter::PidNSigma(std::abs(track.tpcNSigmaKa()), std::abs(track.tofNSigmaKa()), track.hasTOF())), + static_cast(o2::aod::resodmciroaughter::PidNSigma(std::abs(track.tpcNSigmaPr()), std::abs(track.tofNSigmaPr()), track.hasTOF())), + static_cast(trackSelFlag), + trackFlags); + } + } // Filter for all tracks template void fillTracks(CollisionType const& collision, TrackType const& tracks) { + if (cfgBypassTrackFill) + return; // Loop over tracks for (auto const& track : tracks) { if (!isTrackSelected(collision, track)) @@ -615,17 +693,17 @@ struct ResonanceInitializer { track.px(), track.py(), track.pz(), - (uint8_t)track.tpcNClsCrossedRows(), - (uint8_t)track.tpcNClsFound(), - static_cast(track.dcaXY() * 10000), - static_cast(track.dcaZ() * 10000), - (int8_t)(track.tpcNSigmaPi() * 10), - (int8_t)(track.tpcNSigmaKa() * 10), - (int8_t)(track.tpcNSigmaPr() * 10), - (int8_t)(track.tofNSigmaPi() * 10), - (int8_t)(track.tofNSigmaKa() * 10), - (int8_t)(track.tofNSigmaPr() * 10), - (int8_t)(track.tpcSignal() * 10), + static_cast(track.tpcNClsCrossedRows()), + static_cast(track.tpcNClsFound()), + static_cast(std::round(track.dcaXY() * 10000)), + static_cast(std::round(track.dcaZ() * 10000)), + static_cast(std::round(track.tpcNSigmaPi() * 10)), + static_cast(std::round(track.tpcNSigmaKa() * 10)), + static_cast(std::round(track.tpcNSigmaPr() * 10)), + static_cast(std::round(track.tofNSigmaPi() * 10)), + static_cast(std::round(track.tofNSigmaKa() * 10)), + static_cast(std::round(track.tofNSigmaPr() * 10)), + static_cast(std::round(track.tpcSignal() * 10)), trackFlags); if constexpr (isMC) { fillMCTrack(track); @@ -1201,6 +1279,9 @@ struct ResonanceInitializer { resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); fillTracks(collision, tracks); + if (cfgFillMicroTracks) { + fillMicroTracks(collision, tracks); + } } PROCESS_SWITCH(ResonanceInitializer, processTrackData, "Process for data", false); @@ -1219,6 +1300,9 @@ struct ResonanceInitializer { resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); fillTracks(collision, tracks); + if (cfgFillMicroTracks) { + fillMicroTracks(collision, tracks); + } } PROCESS_SWITCH(ResonanceInitializer, processTrackDataRun2, "Process for data", false); @@ -1237,6 +1321,9 @@ struct ResonanceInitializer { resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); resoEvtPlCollisions(collision.globalIndex(), getEvtPl(collision), getEvtPlRes(collision, evtPlDetId, evtPlRefAId), getEvtPlRes(collision, evtPlDetId, evtPlRefBId), getEvtPlRes(collision, evtPlRefAId, evtPlRefBId)); fillTracks(collision, tracks); + if (cfgFillMicroTracks) { + fillMicroTracks(collision, tracks); + } } PROCESS_SWITCH(ResonanceInitializer, processTrackEPData, "Process for data and ep ana", false); @@ -1257,6 +1344,9 @@ struct ResonanceInitializer { resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); fillTracks(collision, tracks); + if (cfgFillMicroTracks) { + fillMicroTracks(collision, tracks); + } fillV0s(collision, V0s, tracks); } PROCESS_SWITCH(ResonanceInitializer, processTrackV0Data, "Process for data", false); @@ -1277,6 +1367,9 @@ struct ResonanceInitializer { resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); fillTracks(collision, tracks); + if (cfgFillMicroTracks) { + fillMicroTracks(collision, tracks); + } fillV0s(collision, V0s, tracks); } PROCESS_SWITCH(ResonanceInitializer, processTrackV0DataRun2, "Process for data", false); @@ -1298,6 +1391,9 @@ struct ResonanceInitializer { resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); fillTracks(collision, tracks); + if (cfgFillMicroTracks) { + fillMicroTracks(collision, tracks); + } fillV0s(collision, V0s, tracks); fillCascades(collision, Cascades, tracks); } @@ -1320,6 +1416,9 @@ struct ResonanceInitializer { resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); fillTracks(collision, tracks); + if (cfgFillMicroTracks) { + fillMicroTracks(collision, tracks); + } fillV0s(collision, V0s, tracks); fillCascades(collision, Cascades, tracks); } @@ -1343,6 +1442,9 @@ struct ResonanceInitializer { // Loop over tracks fillTracks(collision, tracks); + if (cfgFillMicroTracks) { + fillMicroTracks(collision, tracks); + } // Loop over all MC particles auto mcParts = selectedMCParticles->sliceBy(perMcCollision, collision.mcCollision().globalIndex()); @@ -1365,6 +1467,9 @@ struct ResonanceInitializer { // Loop over tracks fillTracks(collision, tracks); + if (cfgFillMicroTracks) { + fillMicroTracks(collision, tracks); + } // Loop over all MC particles auto mcParts = selectedMCParticles->sliceBy(perMcCollision, collision.mcCollision().globalIndex()); fillMCParticles(mcParts, mcParticles); @@ -1386,7 +1491,9 @@ struct ResonanceInitializer { // Loop over tracks fillTracks(collision, tracks); - + if (cfgFillMicroTracks) { + fillMicroTracks(collision, tracks); + } // Loop over all MC particles auto mcParts = selectedMCParticles->sliceBy(perMcCollisionRun2, collision.mcCollision().globalIndex()); fillMCParticles(mcParts, mcParticles); @@ -1409,6 +1516,9 @@ struct ResonanceInitializer { // Loop over tracks fillTracks(collision, tracks); + if (cfgFillMicroTracks) { + fillMicroTracks(collision, tracks); + } fillV0s(collision, V0s, tracks); // Loop over all MC particles @@ -1432,6 +1542,9 @@ struct ResonanceInitializer { // Loop over tracks fillTracks(collision, tracks); + if (cfgFillMicroTracks) { + fillMicroTracks(collision, tracks); + } fillV0s(collision, V0s, tracks); // Loop over all MC particles @@ -1457,6 +1570,9 @@ struct ResonanceInitializer { // Loop over tracks fillTracks(collision, tracks); + if (cfgFillMicroTracks) { + fillMicroTracks(collision, tracks); + } fillV0s(collision, V0s, tracks); fillCascades(collision, Cascades, tracks); @@ -1482,6 +1598,9 @@ struct ResonanceInitializer { // Loop over tracks fillTracks(collision, tracks); + if (cfgFillMicroTracks) { + fillMicroTracks(collision, tracks); + } fillV0s(collision, V0s, tracks); fillCascades(collision, Cascades, tracks); diff --git a/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx b/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx index 38ae54f4944..cbbe3a4bd28 100644 --- a/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx +++ b/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx @@ -618,6 +618,7 @@ struct ResonanceModuleInitializer { struct ResonanceDaughterInitializer { SliceCache cache; Produces reso2trks; ///< Output table for resonance tracks + Produces reso2microtrks; ///< Output table for resonance microtracks Produces reso2mctracks; ///< Output table for MC resonance tracks Produces reso2v0s; ///< Output table for resonance V0s Produces reso2mcv0s; ///< Output table for MC resonance V0s @@ -626,12 +627,15 @@ struct ResonanceDaughterInitializer { // Configurables Configurable cfgFillQA{"cfgFillQA", false, "Fill QA histograms"}; + Configurable cfgFillMicroTracks{"cfgFillMicroTracks", false, "Fill micro tracks"}; + Configurable cfgBypassTrackFill{"cfgBypassTrackFill", true, "Bypass track fill"}; // Configurables for tracks Configurable cMaxDCArToPVcut{"cMaxDCArToPVcut", 2.0, "Track DCAr cut to PV Maximum"}; Configurable cMinDCArToPVcut{"cMinDCArToPVcut", 0.0, "Track DCAr cut to PV Minimum"}; Configurable cMaxDCAzToPVcut{"cMaxDCAzToPVcut", 2.0, "Track DCAz cut to PV Maximum"}; Configurable cMinDCAzToPVcut{"cMinDCAzToPVcut", 0.0, "Track DCAz cut to PV Minimum"}; + Configurable pidnSigmaPreSelectionCut{"pidnSigmaPreSelectionCut", 5.0f, "TPC and TOF PID cut (loose, improve performance)"}; Configurable trackSelection{"trackSelection", 1, "Track selection: 0 -> No Cut, 1 -> kGlobalTrack, 2 -> kGlobalTrackWoPtEta, 3 -> kGlobalTrackWoDCA, 4 -> kQualityTracks, 5 -> kInAcceptanceTracks"}; // Configurables for V0s @@ -644,6 +648,16 @@ struct ResonanceDaughterInitializer { Configurable cMaxCascRadius{"cMaxCascRadius", 200.0, "Maximum Cascade radius from PV"}; Configurable cMinCascCosPA{"cMinCascCosPA", 0.97, "Minimum Cascade CosPA to PV"}; + // Derived dataset selections + struct : ConfigurableGroup { + Configurable cfgFillPionTracks{"cfgFillPionTracks", false, "Fill pion tracks"}; + Configurable cfgFillKaonTracks{"cfgFillKaonTracks", false, "Fill kaon tracks"}; + Configurable cfgFillProtonTracks{"cfgFillProtonTracks", false, "Fill proton tracks"}; + Configurable cfgFillPionMicroTracks{"cfgFillPionMicroTracks", false, "Fill pion micro tracks"}; + Configurable cfgFillKaonMicroTracks{"cfgFillKaonMicroTracks", false, "Fill kaon micro tracks"}; + Configurable cfgFillProtonMicroTracks{"cfgFillProtonMicroTracks", false, "Fill proton micro tracks"}; + } FilterForDerivedTables; + // Filters Filter dcaXYFilter = nabs(aod::track::dcaXY) < cMaxDCArToPVcut && nabs(aod::track::dcaXY) > cMinDCArToPVcut; Filter dcaZFilter = nabs(aod::track::dcaZ) < cMaxDCAzToPVcut && nabs(aod::track::dcaZ) > cMinDCAzToPVcut; @@ -720,6 +734,91 @@ struct ResonanceDaughterInitializer { LOGF(fatal, "ResonanceDaughterInitializer not initialized, enable at least one process"); } } + template + bool filterMicroTrack(T const& track) + { + // if no selection is requested, return true + if (!FilterForDerivedTables.cfgFillPionMicroTracks && !FilterForDerivedTables.cfgFillKaonMicroTracks && !FilterForDerivedTables.cfgFillProtonMicroTracks) + return true; + if (FilterForDerivedTables.cfgFillPionMicroTracks) { + if (std::abs(track.tpcNSigmaPi()) < pidnSigmaPreSelectionCut) + return true; + } + if (FilterForDerivedTables.cfgFillKaonMicroTracks) { + if (std::abs(track.tpcNSigmaKa()) < pidnSigmaPreSelectionCut) + return true; + } + if (FilterForDerivedTables.cfgFillProtonMicroTracks) { + if (std::abs(track.tpcNSigmaPr()) < pidnSigmaPreSelectionCut) + return true; + } + return false; + } + + template + bool filterTrack(T const& track) + { + // if no selection is requested, return true + if (!FilterForDerivedTables.cfgFillPionTracks && !FilterForDerivedTables.cfgFillKaonTracks && !FilterForDerivedTables.cfgFillProtonTracks) + return true; + if (FilterForDerivedTables.cfgFillPionTracks) { + if (std::abs(track.tpcNSigmaPi()) < pidnSigmaPreSelectionCut) + return true; + } + if (FilterForDerivedTables.cfgFillKaonTracks) { + if (std::abs(track.tpcNSigmaKa()) < pidnSigmaPreSelectionCut) + return true; + } + if (FilterForDerivedTables.cfgFillProtonTracks) { + if (std::abs(track.tpcNSigmaPr()) < pidnSigmaPreSelectionCut) + return true; + } + return false; + } + + /** + * @brief Fills track data + * + * @tparam isMC Boolean indicating if it's MC + * @tparam TrackType Type of track + * @tparam CollisionType Type of collision + * @param collision Collision data + * @param tracks Track data + */ + template + void fillMicroTracks(CollisionType const& collision, TrackType const& tracks) + { + // Loop over tracks + for (auto const& track : tracks) { + if (!filterMicroTrack(track)) + continue; + o2::aod::resodmciroaughter::ResoMicroTrackSelFlag trackSelFlag(track.dcaXY(), track.dcaZ()); + if (std::abs(track.dcaXY()) < (0.004 + (0.013 / track.pt()))) { + trackSelFlag.setDCAxy0(); + } + if (std::abs(track.dcaZ()) < (0.004 + (0.013 / track.pt()))) { // TODO: check this + trackSelFlag.setDCAz0(); + } + uint8_t trackFlags = (track.passedITSRefit() << 0) | + (track.passedTPCRefit() << 1) | + (track.isGlobalTrackWoDCA() << 2) | + (track.isGlobalTrack() << 3) | + (track.isPrimaryTrack() << 4) | + (track.isPVContributor() << 5) | + (track.hasTOF() << 6) | + ((track.sign() > 0) << 7); // sign +1: 1, -1: 0 + reso2microtrks(collision.globalIndex(), + track.globalIndex(), + track.px(), + track.py(), + track.pz(), + static_cast(o2::aod::resodmciroaughter::PidNSigma(std::abs(track.tpcNSigmaPi()), std::abs(track.tofNSigmaPi()), track.hasTOF())), + static_cast(o2::aod::resodmciroaughter::PidNSigma(std::abs(track.tpcNSigmaKa()), std::abs(track.tofNSigmaKa()), track.hasTOF())), + static_cast(o2::aod::resodmciroaughter::PidNSigma(std::abs(track.tpcNSigmaPr()), std::abs(track.tofNSigmaPr()), track.hasTOF())), + static_cast(trackSelFlag), + trackFlags); + } + } /** * @brief Fills track data @@ -733,8 +832,13 @@ struct ResonanceDaughterInitializer { template void fillTracks(CollisionType const& collision, TrackType const& tracks) { + if (cfgBypassTrackFill) { + return; + } // Loop over tracks for (auto const& track : tracks) { + if (!filterTrack(track)) + continue; if (cfgFillQA) { qaRegistry.fill(HIST("QA/hGoodTrackIndices"), 0); qaRegistry.fill(HIST("QA/hTrackPt"), track.pt()); @@ -1189,6 +1293,9 @@ struct ResonanceDaughterInitializer { soa::Filtered const& tracks) { fillTracks(collision, tracks); + if (cfgFillMicroTracks) { + fillMicroTracks(collision, tracks); + } } PROCESS_SWITCH(ResonanceDaughterInitializer, processData, "Process tracks for data", false); @@ -1204,6 +1311,9 @@ struct ResonanceDaughterInitializer { aod::McParticles const&) { fillTracks(collision, tracks); + if (cfgFillMicroTracks) { + fillMicroTracks(collision, tracks); + } } PROCESS_SWITCH(ResonanceDaughterInitializer, processMC, "Process tracks for MC", false); diff --git a/Tutorials/PWGLF/Resonance/CMakeLists.txt b/Tutorials/PWGLF/Resonance/CMakeLists.txt index 09f58af5cd0..35ac519aa65 100644 --- a/Tutorials/PWGLF/Resonance/CMakeLists.txt +++ b/Tutorials/PWGLF/Resonance/CMakeLists.txt @@ -49,3 +49,8 @@ o2physics_add_dpl_workflow(resonances-combine SOURCES resonancesCombine.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME AnalysisTutorial) + +o2physics_add_dpl_workflow(resonances-microtrack + SOURCES resonancesMicrotrack.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME AnalysisTutorial) diff --git a/Tutorials/PWGLF/Resonance/resonancesMicrotrack.cxx b/Tutorials/PWGLF/Resonance/resonancesMicrotrack.cxx new file mode 100644 index 00000000000..07736a3e841 --- /dev/null +++ b/Tutorials/PWGLF/Resonance/resonancesMicrotrack.cxx @@ -0,0 +1,203 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// +/// \file resonancesMicrotrack.cxx +/// \brief Resonance microtrack tutorial +/// \author Bong-Hwi Lim +/// \since 07/03/2025 + +#include +#include + +#include "CommonConstants/MathConstants.h" +#include "CommonConstants/PhysicsConstants.h" +#include "Framework/AnalysisTask.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/runDataProcessing.h" +#include "PWGLF/DataModel/LFResonanceTables.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::constants::math; +// Extract STEP +// Handle resomicrotracks +struct ResonancesMicrotrack { + HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + + // Configurable for number of bins + Configurable nBins{"nBins", 100, "N bins in all histos"}; + // Configurable for min pT cut + Configurable cMinPtcut{"cMinPtcut", 0.15, "Track minium pt cut"}; + // Configurable for event plane + Configurable cfgEvtPl{"cfgEvtPl", 40500, "Configuration of three subsystems for the event plane and its resolution, 10000*RefA + 100*RefB + S, where FT0C:0, FT0A:1, FT0M:2, FV0A:3, BPos:5, BNeg:6"}; + + // Track selection + // primary track condition + Configurable cfgPrimaryTrack{"cfgPrimaryTrack", false, "Primary track selection"}; + Configurable cfgGlobalWoDCATrack{"cfgGlobalWoDCATrack", true, "Global track selection without DCA"}; + Configurable cfgPVContributor{"cfgPVContributor", false, "PV contributor track selection"}; + // DCA Selections + // DCAr to PV + Configurable cMaxDCArToPVcut{"cMaxDCArToPVcut", 0.5, "Track DCAr cut to PV Maximum"}; + // DCAz to PV + Configurable cMaxDCAzToPVcut{"cMaxDCAzToPVcut", 1.0, "Track DCAz cut to PV Maximum"}; + Configurable cMinDCAzToPVcut{"cMinDCAzToPVcut", 0.0, "Track DCAz cut to PV Minimum"}; + + // PID selection + Configurable nSigmaCutTPC{"nSigmaCutTPC", 3.0, "Value of the TPC Nsigma cut"}; + Configurable nSigmaCutTOF{"nSigmaCutTOF", 3.0, "Value of the TOF Nsigma cut"}; + + void init(o2::framework::InitContext&) + { + histos.add("hVertexZ", "hVertexZ", HistType::kTH1F, {{nBins, -15., 15.}}); + histos.add("hMultiplicityPercent", "Multiplicity Percentile", kTH1F, {{120, 0.0f, 120.0f}}); + histos.add("hEta_ResoTracks", "Eta distribution", kTH1F, {{200, -1.0f, 1.0f}}); + histos.add("hEta_ResoMicroTracks", "Eta distribution", kTH1F, {{200, -1.0f, 1.0f}}); + histos.add("hPhi_ResoTracks", "Phi distribution", kTH1F, {{200, 0, TwoPI}}); + histos.add("hPhi_ResoMicroTracks", "Phi distribution", kTH1F, {{200, 0, TwoPI}}); + histos.add("hPt_ResoTracks", "Pt distribution", kTH1F, {{150, 0.0f, 15.0f}}); + histos.add("hPt_ResoMicroTracks", "Pt distribution", kTH1F, {{150, 0.0f, 15.0f}}); + histos.add("hPx_ResoTracks", "Px distribution", kTH1F, {{200, -10.0f, 10.0f}}); + histos.add("hPx_ResoMicroTracks", "Px distribution", kTH1F, {{200, -10.0f, 10.0f}}); + histos.add("hPy_ResoTracks", "Py distribution", kTH1F, {{200, -10.0f, 10.0f}}); + histos.add("hPy_ResoMicroTracks", "Py distribution", kTH1F, {{200, -10.0f, 10.0f}}); + histos.add("hPz_ResoTracks", "Pz distribution", kTH1F, {{200, -10.0f, 10.0f}}); + histos.add("hPz_ResoMicroTracks", "Pz distribution", kTH1F, {{200, -10.0f, 10.0f}}); + + histos.add("hDcaxy_ResoTracks", "Dcaxy distribution", kTH1F, {{200, 0, 2.0f}}); + histos.add("hDcaz_ResoTracks", "Dcaz distribution", kTH1F, {{200, 0, 2.0f}}); + histos.add("hDcaxy_ResoMicroTracks", "Dcaxy distribution", kTH1F, {{200, 0, 2.0f}}); + histos.add("hDcaz_ResoMicroTracks", "Dcaz distribution", kTH1F, {{200, 0, 2.0f}}); + + // PID + histos.add("hNsigmaKaonTPC_ResoMicroTracks", "NsigmaKaonTPC distribution", kTH1F, {{240, -6.0f, 6.0f}}); + histos.add("hNsigmaKaonTOF_ResoMicroTracks", "NsigmaKaonTOF distribution", kTH1F, {{240, -6.0f, 6.0f}}); + histos.add("hNsigmaKaonTPC_ResoTracks", "NsigmaKaonTPC distribution", kTH1F, {{240, -6.0f, 6.0f}}); + histos.add("hNsigmaKaonTOF_ResoTracks", "NsigmaKaonTOF distribution", kTH1F, {{240, -6.0f, 6.0f}}); + + LOG(info) << "Size of the histograms in resonance tutorial with table combination:"; + histos.print(); + } + + template + bool trackCut(const TrackType track) + { + if constexpr (!IsResoMicrotrack) { + if (std::abs(track.pt()) < cMinPtcut) + return false; + if (std::abs(track.dcaXY()) > cMaxDCArToPVcut) + return false; + if (std::abs(track.dcaZ()) > cMaxDCAzToPVcut) + return false; + if (cfgPrimaryTrack && !track.isPrimaryTrack()) + return false; + if (cfgGlobalWoDCATrack && !track.isGlobalTrackWoDCA()) + return false; + if (cfgPVContributor && !track.isPVContributor()) + return false; + } else { + if (std::abs(track.pt()) < cMinPtcut) + return false; + if (o2::aod::resodmciroaughter::ResoMicroTrackSelFlag::decodeDCAxy(track.trackSelectionFlags()) > cMaxDCArToPVcut - Epsilon) + return false; + if (o2::aod::resodmciroaughter::ResoMicroTrackSelFlag::decodeDCAz(track.trackSelectionFlags()) > cMaxDCAzToPVcut - Epsilon) + return false; + if (cfgPrimaryTrack && !track.isPrimaryTrack()) + return false; + if (cfgGlobalWoDCATrack && !track.isGlobalTrackWoDCA()) + return false; + if (cfgPVContributor && !track.isPVContributor()) + return false; + } + return true; + } + + template + bool selectionPID(const T& candidate) + { + if constexpr (!IsResoMicrotrack) { + bool tpcPass = std::abs(candidate.tpcNSigmaPr()) < nSigmaCutTPC; + bool tofPass = (candidate.hasTOF()) ? std::abs(candidate.tofNSigmaPr()) < nSigmaCutTOF : true; + if (tpcPass && tofPass) { + return true; + } + // return true; + } else { + bool tpcPass = std::abs(o2::aod::resodmciroaughter::PidNSigma::getTPCnSigma(candidate.pidNSigmaPrFlag())) < nSigmaCutTPC + Epsilon; + bool tofPass = candidate.hasTOF() ? std::abs(o2::aod::resodmciroaughter::PidNSigma::getTOFnSigma(candidate.pidNSigmaPrFlag())) < nSigmaCutTOF + Epsilon : true; + if (tpcPass && tofPass) { + return true; + } + // return true; + } + return false; + } + + template + void fillHistograms(const CollisionType& collision, const TracksType& dTracks) + { + auto multiplicity = collision.cent(); + histos.fill(HIST("hVertexZ"), collision.posZ()); + histos.fill(HIST("hMultiplicityPercent"), multiplicity); + for (auto const& track : dTracks) { + if (!trackCut(track) || !selectionPID(track)) { + continue; + } + + if constexpr (!IsResoMicrotrack) { // ResoTracks + histos.fill(HIST("hEta_ResoTracks"), track.eta()); + histos.fill(HIST("hPhi_ResoTracks"), track.phi()); + histos.fill(HIST("hPt_ResoTracks"), track.pt()); + histos.fill(HIST("hPx_ResoTracks"), track.px()); + histos.fill(HIST("hPy_ResoTracks"), track.py()); + histos.fill(HIST("hPz_ResoTracks"), track.pz()); + histos.fill(HIST("hDcaxy_ResoTracks"), track.dcaXY()); + histos.fill(HIST("hDcaz_ResoTracks"), track.dcaZ()); + histos.fill(HIST("hNsigmaKaonTPC_ResoTracks"), track.tpcNSigmaPr()); + if (track.hasTOF()) { + histos.fill(HIST("hNsigmaKaonTOF_ResoTracks"), track.tofNSigmaPr()); + } + } else { // ResoMicroTracks + histos.fill(HIST("hEta_ResoMicroTracks"), track.eta()); + histos.fill(HIST("hPhi_ResoMicroTracks"), track.phi()); + histos.fill(HIST("hPt_ResoMicroTracks"), track.pt()); + histos.fill(HIST("hPx_ResoMicroTracks"), track.px()); + histos.fill(HIST("hPy_ResoMicroTracks"), track.py()); + histos.fill(HIST("hPz_ResoMicroTracks"), track.pz()); + histos.fill(HIST("hDcaxy_ResoMicroTracks"), o2::aod::resodmciroaughter::ResoMicroTrackSelFlag::decodeDCAxy(track.trackSelectionFlags())); + histos.fill(HIST("hDcaz_ResoMicroTracks"), o2::aod::resodmciroaughter::ResoMicroTrackSelFlag::decodeDCAz(track.trackSelectionFlags())); + histos.fill(HIST("hNsigmaKaonTPC_ResoMicroTracks"), o2::aod::resodmciroaughter::PidNSigma::getTPCnSigma(track.pidNSigmaPrFlag())); + if (track.hasTOF()) { + histos.fill(HIST("hNsigmaKaonTOF_ResoMicroTracks"), o2::aod::resodmciroaughter::PidNSigma::getTOFnSigma(track.pidNSigmaPrFlag())); + } + } + } + } + void processDummy(aod::ResoCollision const& /*collisions*/) + { + } + PROCESS_SWITCH(ResonancesMicrotrack, processDummy, "Process Dummy", true); + + void processResoTracks(aod::ResoCollision const& collision, aod::ResoTracks const& resotracks) + { + fillHistograms(collision, resotracks); + } + PROCESS_SWITCH(ResonancesMicrotrack, processResoTracks, "Process ResoTracks", false); + + void processResoMicroTracks(aod::ResoCollision const& collision, aod::ResoMicroTracks const& resomicrotracks) + { + fillHistograms(collision, resomicrotracks); + } + PROCESS_SWITCH(ResonancesMicrotrack, processResoMicroTracks, "Process ResoMicroTracks", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From 107346d4cbc3764fe3079cfce8a2a6e1a697eca3 Mon Sep 17 00:00:00 2001 From: Rashi gupta <167059733+rashigupt@users.noreply.github.com> Date: Mon, 10 Mar 2025 16:42:38 +0530 Subject: [PATCH 0625/1650] [PWGHF] Add ConfigurableAxis in electronSelectionWithTpcEmcal.cxx (#10325) Co-authored-by: Rashi Gupta --- .../TableProducer/correlatorHfeHadrons.cxx | 9 +- .../electronSelectionWithTpcEmcal.cxx | 141 +++++++++--------- 2 files changed, 75 insertions(+), 75 deletions(-) diff --git a/PWGHF/HFC/TableProducer/correlatorHfeHadrons.cxx b/PWGHF/HFC/TableProducer/correlatorHfeHadrons.cxx index fd16c4c82d6..2a463696be2 100644 --- a/PWGHF/HFC/TableProducer/correlatorHfeHadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorHfeHadrons.cxx @@ -75,7 +75,12 @@ struct HfCorrelatorHfeHadrons { Filter collisionFilter = nabs(aod::collision::posZ) < zPvPosMax && aod::collision::numContrib > static_cast(1); Preslice perCol = aod::track::collisionId; Preslice perCollision = aod::hf_sel_electron::collisionId; - HistogramConfigSpec hCorrelSpec{HistType::kTHnSparseD, {{30, 0., 30.}, {20, 0., 20.}, {32, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {50, -1.8, 1.8}}}; + + ConfigurableAxis binsDeltaEta{"binsDeltaEta", {30, -1.8, 1.8}, "#it{#Delta#eta}"}; + ConfigurableAxis binsDeltaPhi{"binsDeltaPhi", {32, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, "#it{#Delta#varphi}"}; + ConfigurableAxis binsP{"binsP", {50, 0.0, 50}, "#it{p_{T}}(GeV/#it{c})"}; + + HistogramConfigSpec hCorrelSpec{HistType::kTHnSparseD, {{binsP}, {binsP}, {binsDeltaPhi}, {binsDeltaEta}}}; HistogramRegistry registry{ "registry", @@ -84,7 +89,7 @@ struct HfCorrelatorHfeHadrons { {"hULSEHCorrel", "Sparse for Delta phi and Delta eta UnLike sign Electron pair with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, {"hMCgenNonHfEHCorrel", "Sparse for Delta phi and Delta eta Non Hf for McGen Inclusive Electron with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, {"hMCgenInclusiveEHCorrl", "Sparse for Delta phi and Delta eta for McGen Electron pair with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, - {"hptElectron", "hptElectron", {HistType::kTH1F, {{100, 0, 100}}}}, + {"hptElectron", "hptElectron", {HistType::kTH1F, {{binsP}}}}, {"hMixEventInclusiveEHCorrl", "Sparse for mix event Delta phi and Delta eta Inclusive Electron with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, {"hMixEventLSEHCorrel", "Sparse for mix event Delta phi and Delta eta Like sign Electron pair with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, diff --git a/PWGHF/HFL/TableProducer/electronSelectionWithTpcEmcal.cxx b/PWGHF/HFL/TableProducer/electronSelectionWithTpcEmcal.cxx index 86448f4582e..971200a7105 100644 --- a/PWGHF/HFL/TableProducer/electronSelectionWithTpcEmcal.cxx +++ b/PWGHF/HFL/TableProducer/electronSelectionWithTpcEmcal.cxx @@ -43,33 +43,6 @@ using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::soa; -const int etaAxisBins = 100; -const float trackEtaAxisMin = -1.5; -const float trackEtaAxisMax = 1.5; -const int phiAxisBins = 100; -const float trackPhiAxisMin = 0.; -const float trackPhiAxisMax = o2::constants::math::TwoPI; -const int passEMCalBins = 3; -const int passEMCalAxisMin = 0.; -const int passEMCalAxisMax = 3; -const int eopAxisBins = 60; -const float eopAxisMin = 0.; -const float eopAxisMax = 3.0; -const int pAxisBins = 500; -const float pAxisMin = 0.; -const float pAxisMax = 50.0; -const int m02AxisBins = 100; -const float m02AxisMin = 0.; -const float m02AxisMax = 2.0; -const int m20AxisBins = 100; -const float m20AxisMin = 0.; -const float m20AxisMax = 2.0; -const int nSigmaAxisBins = 300; -const float nSigmaAxisMin = -15.; -const float nSigmaAxisMax = 15.; -const int dEdxAxisBins = 480; -const float dEdxAxisMin = 0.; -const float dEdxAxisMax = 160.; const int kEta = 221; struct HfElectronSelectionWithTpcEmcal { @@ -81,6 +54,7 @@ struct HfElectronSelectionWithTpcEmcal { // EMCal Cluster information KFParticle kfNonHfe; Configurable fillEmcClusterInfo{"fillEmcClusterInfo", true, "Fill histograms with EMCal cluster info before and after track match"}; + Configurable fillTrackInfo{"fillTrackInfo", true, "Fill histograms with Track Information info before track match"}; // Event Selection Configurable zPvPosMax{"zPvPosMax", 10., "Maximum z of the primary vertex (cm)"}; @@ -143,35 +117,55 @@ struct HfElectronSelectionWithTpcEmcal { Filter collisionFilter = nabs(aod::collision::posZ) < zPvPosMax && aod::collision::numContrib > static_cast(1); PresliceUnsorted perClusterMatchedTracks = o2::aod::emcalmatchedtrack::trackId; - HistogramConfigSpec hEmcClusterEnergySpec{HistType::kTH1F, {{300, 0.0, 30.0}}}; - HistogramConfigSpec hEmcClusterEtaPhiSpec{HistType::kTH2F, {{100, -0.9, 0.9}, {200, 0, 6.3}}}; - HistogramConfigSpec hEmcClusterEnergyCellSpec{HistType::kTH2F, {{400, 0.0, 30.0}, {50, 0, 50}}}; - HistogramConfigSpec hEmcClusterEnergyTimeSpec{HistType::kTH2F, {{300, 0.0, 30.0}, {1800, -900, 900}}}; + // configurable axis - HistogramConfigSpec hDeltaPhiDeltaEtaEmcClusterTrackSpecEnergy{HistType::kTH3F, {{400, -0.2, 0.2}, {400, -0.2, 0.2}, {600, -300, 300}}}; - HistogramConfigSpec hAfterMatchEoPSigamSpec{HistType::kTHnSparseD, {{eopAxisBins, eopAxisMin, eopAxisMax}, {pAxisBins, pAxisMin, pAxisMax}, {nSigmaAxisBins, nSigmaAxisMin, nSigmaAxisMax}, {m02AxisBins, m02AxisMin, m02AxisMax}, {m20AxisBins, m20AxisMin, m20AxisMax}}}; + ConfigurableAxis binsPosZ{"binsPosZ", {100, -10., 10.}, "primary vertex z coordinate"}; + ConfigurableAxis binsEta{"binsEta", {100, -2.0, 2.}, "#it{#eta}"}; + ConfigurableAxis binsPhi{"binsPhi", {32, 0.0, o2::constants::math::TwoPI}, "#it{#varphi}"}; + ConfigurableAxis binsPt{"binsPt", {50, 0.0, 50}, "#it{p_{T}}(GeV/#it{c})"}; + ConfigurableAxis binsdEdx{"binsdEdx", {160, 0., 160.}, "dE/dX"}; + ConfigurableAxis binsnSigma{"binsnSigma", {30, -15., 15.}, "#it{#sigma_{TPC}}"}; + ConfigurableAxis binsM02{"binsM02", {50, 0., 2.0}, "M02; entries"}; + ConfigurableAxis binsM20{"binsM20", {50, 0., 2.0}, "M20; entries"}; + ConfigurableAxis binsEoP{"binsEoP", {30, 0., 3.}, "e/p"}; + ConfigurableAxis binsEmcEnergy{"binsEmcEnergy", {50, 0., 50.}, "Cluster Energy (GeV/#it{c}^{2})"}; + ConfigurableAxis binsEmcClsNCells{"binsEmcClsNCells", {50, 0., 50.}, "nCells"}; + ConfigurableAxis binsEmcClsTime{"binsEmcClsTime", {1800, -900.0, 900.}, "Cluster Time"}; + ConfigurableAxis binsPassEMcal{"binsPassEMcal", {3, 0.0, 3.}, "Pass EMcal"}; - HistogramConfigSpec hTrackEnergyLossSpec{HistType::kTH3F, {{dEdxAxisBins, dEdxAxisMin, dEdxAxisMax}, {pAxisBins, pAxisMin, pAxisMax}, {passEMCalBins, passEMCalAxisMin, passEMCalAxisMax}}}; + ConfigurableAxis binsDeltaEta{"binsDeltaEta", {20, -0.2, 0.2}, "Track Cluser Match #Delta #eta"}; + ConfigurableAxis binsDeltaPhi{"binsDeltaPhi", {20, -0.2, 0.2}, "Track Cluser Match #Delta #varphi"}; + ConfigurableAxis binsMass{"binsMass", {100, 0.0, 2.0}, "Mass (GeV/#it{c}^{2}); entries"}; - HistogramConfigSpec hTracknSigmaSpec{HistType::kTH3F, {{nSigmaAxisBins, nSigmaAxisMin, nSigmaAxisMax}, {pAxisBins, pAxisMin, pAxisMax}, {passEMCalBins, passEMCalAxisMin, passEMCalAxisMax}}}; + HistogramConfigSpec hEmcClusterEnergySpec{HistType::kTH1F, {{binsEmcEnergy}}}; + HistogramConfigSpec hEmcClusterEtaPhiSpec{HistType::kTH2F, {{binsEta}, {binsPhi}}}; + HistogramConfigSpec hEmcClusterEnergyCellSpec{HistType::kTH2F, {{binsEmcEnergy}, {binsEmcClsNCells}}}; + HistogramConfigSpec hEmcClusterEnergyTimeSpec{HistType::kTH2F, {{binsEmcEnergy}, {binsEmcClsTime}}}; + + HistogramConfigSpec hDeltaPhiDeltaEtaEmcClusterTrackTime{HistType::kTH3F, {{binsDeltaEta}, {binsDeltaPhi}, {binsEmcClsTime}}}; + HistogramConfigSpec hAfterMatchEoPSigamSpec{HistType::kTHnSparseD, {{binsEoP}, {binsPt}, {binsnSigma}, {binsM02}, {binsM20}}}; + + HistogramConfigSpec hTrackEnergyLossSpec{HistType::kTH3F, {{binsdEdx}, {binsPt}, {binsPassEMcal}}}; + + HistogramConfigSpec hTracknSigmaSpec{HistType::kTH3F, {{binsnSigma}, {binsPt}, {binsPassEMcal}}}; HistogramRegistry registry{ "registry", {{"hNevents", "No of events", {HistType::kTH1F, {{3, 1, 4}}}}, - {"hZvertex", "z vertex", {HistType::kTH1F, {{100, -100, 100}}}}, - {"hLikeMass", "Like mass", {HistType::kTH1F, {{1000, 0, 2.0}}}}, - {"hUnLikeMass", "unLike mass", {HistType::kTH1F, {{1000, 0, 1.0}}}}, - {"hLikeSignPt", "Like sign Momentum ", {HistType::kTH1F, {{pAxisBins, pAxisMin, pAxisMax}}}}, - {"hUnLikeSignPt", "UnLike sign Momentum", {HistType::kTH1F, {{pAxisBins, pAxisMin, pAxisMax}}}}, - {"hMcgenInElectron", "Mc Gen Inclusive Electron", {HistType::kTH1F, {{pAxisBins, pAxisMin, pAxisMax}}}}, - {"hMcgenAllNonHfeElectron", "Mc Gen All NonHf Electron", {HistType::kTH1F, {{pAxisBins, pAxisMin, pAxisMax}}}}, - {"hMcgenNonHfeElectron", "Mc Gen NonHf Electron with mother", {HistType::kTH1F, {{pAxisBins, pAxisMin, pAxisMax}}}}, - {"hPi0eEmbTrkPt", "Mc Gen Pi0 mother NonHf Electron", {HistType::kTH1F, {{pAxisBins, pAxisMin, pAxisMax}}}}, - - {"hEtaeEmbTrkPt", "Mc Gen Eta mother NonHf Electron", {HistType::kTH1F, {{pAxisBins, pAxisMin, pAxisMax}}}}, - {"hEmcClusterM02", "m02", {HistType::kTH1F, {{m02AxisBins, m02AxisMin, m02AxisMax}}}}, - {"hEmcClusterM20", "m20", {HistType::kTH1F, {{m20AxisBins, m20AxisMin, m20AxisMax}}}}, - {"hTrackEtaPhi", "TPC EtaPhi Info; #eta;#varphi;passEMcal;", {HistType::kTH3F, {{etaAxisBins, trackEtaAxisMin, trackEtaAxisMax}, {phiAxisBins, trackPhiAxisMin, trackPhiAxisMax}, {passEMCalBins, passEMCalAxisMin, passEMCalAxisMax}}}}, + {"hZvertex", "z vertex", {HistType::kTH1F, {{binsPosZ}}}}, + {"hLikeMass", "Like mass", {HistType::kTH1F, {{binsMass}}}}, + {"hUnLikeMass", "unLike mass", {HistType::kTH1F, {{binsMass}}}}, + {"hLikeSignPt", "Like sign Momentum ", {HistType::kTH1F, {{binsPt}}}}, + {"hUnLikeSignPt", "UnLike sign Momentum", {HistType::kTH1F, {{binsPt}}}}, + {"hMcgenInElectron", "Mc Gen Inclusive Electron", {HistType::kTH1F, {{binsPt}}}}, + {"hMcgenAllNonHfeElectron", "Mc Gen All NonHf Electron", {HistType::kTH1F, {{binsPt}}}}, + {"hMcgenNonHfeElectron", "Mc Gen NonHf Electron with mother", {HistType::kTH1F, {{binsPt}}}}, + {"hPi0eEmbTrkPt", "Mc Gen Pi0 mother NonHf Electron", {HistType::kTH1F, {{binsPt}}}}, + + {"hEtaeEmbTrkPt", "Mc Gen Eta mother NonHf Electron", {HistType::kTH1F, {{binsPt}}}}, + {"hEmcClusterM02", "m02", {HistType::kTH1F, {{binsM02}}}}, + {"hEmcClusterM20", "m20", {HistType::kTH1F, {{binsM20}}}}, + {"hTrackEtaPhi", "TPC EtaPhi Info; #eta;#varphi;passEMcal;", {HistType::kTH3F, {{binsEta}, {binsPhi}, {binsPassEMcal}}}}, {"hTrackEnergyLossVsP", " TPC Energy loss info vs P; dE/dx;#it{p} (GeV#it{/c});passEMcal;", hTrackEnergyLossSpec}, {"hTrackEnergyLossVsPt", " TPC Energy loss info vs Pt; dE/dx;#it{p}_{T} (GeV#it{/c});passEMcal;", hTrackEnergyLossSpec}, {"hTracknSigmaVsP", " TPC nSigma info vs P; n#sigma;#it{p} (GeV#it{/c});passEMcal;", hTracknSigmaSpec}, @@ -186,16 +180,16 @@ struct HfElectronSelectionWithTpcEmcal { {"hEmcClusterAfterMatchEnergyTime", "EMCal Cluster Info After match Energy vs time; Energy (GeV); sec;", hEmcClusterEnergyTimeSpec}, {"hAfterMatchSigmaVsEoP", "PID Info after match EoP vs Sigma ; E/P;#it{p}_{T} (GeV#it{/c});n#sigma; m02; m20;", hAfterMatchEoPSigamSpec}, - {"hAfterMatchEoPVsP", "PID Info after match EoP vs P; E/P;#it{p} (GeV#it{/c});", {HistType::kTH2F, {{eopAxisBins, eopAxisMin, eopAxisMax}, {pAxisBins, pAxisMin, pAxisMax}}}}, - {"hAfterMatchSigmaVsP", "PID Info after match Sigma vs Momentum ; n#sigma; #it{p} (GeV#it{/c}; ", {HistType::kTH2F, {{nSigmaAxisBins, nSigmaAxisMin, nSigmaAxisMax}, {pAxisBins, pAxisMin, pAxisMax}}}}, - {"hAfterMatchEtaPhi", "PID Info after match Eta vs Phi ; #eta; #varphi; ", {HistType::kTH2F, {{etaAxisBins, trackEtaAxisMin, trackEtaAxisMax}, {phiAxisBins, trackPhiAxisMin, trackPhiAxisMax}}}}, - {"hAfterMatchEnergyLossVsP", "PID Info after match Energy loss info vs P ; dE/dx;#it{p} (GeV#it{/c});; ", {HistType::kTH2F, {{dEdxAxisBins, dEdxAxisMin, dEdxAxisMax}, {pAxisBins, pAxisMin, pAxisMax}}}}, - {"hAfterMatchEnergyLossVsPt", "PID Info after match Energy loss info vs Pt ;dE/dx;#it{p}_{T} (GeV#it{/c}); ", {HistType::kTH2F, {{dEdxAxisBins, dEdxAxisMin, dEdxAxisMax}, {pAxisBins, pAxisMin, pAxisMax}}}}, - - {"hAfterPIDEtaPhi", "PID Info after PID Cuts Eta vs Phi ; #eta; #varphi; ", {HistType::kTH2F, {{etaAxisBins, trackEtaAxisMin, trackEtaAxisMax}, {phiAxisBins, trackPhiAxisMin, trackPhiAxisMax}}}}, - {"hEPRatioAfterPID", "E/P Ratio after PID Cuts apply only trackwodca filter", {HistType::kTH2F, {{pAxisBins, pAxisMin, pAxisMax}, {300, 0, 30}}}}, + {"hAfterMatchEoPVsP", "PID Info after match EoP vs P; E/P;#it{p} (GeV#it{/c});", {HistType::kTH2F, {{binsEoP}, {binsPt}}}}, + {"hAfterMatchSigmaVsP", "PID Info after match Sigma vs Momentum ; n#sigma; #it{p} (GeV#it{/c}; ", {HistType::kTH2F, {{binsnSigma}, {binsPt}}}}, + {"hAfterMatchEtaPhi", "PID Info after match Eta vs Phi ; #eta; #varphi; ", {HistType::kTH2F, {{binsEta}, {binsPhi}}}}, + {"hAfterMatchEnergyLossVsP", "PID Info after match Energy loss info vs P ; dE/dx;#it{p} (GeV#it{/c});; ", {HistType::kTH2F, {{binsdEdx}, {binsPt}}}}, + {"hAfterMatchEnergyLossVsPt", "PID Info after match Energy loss info vs Pt ;dE/dx;#it{p}_{T} (GeV#it{/c}); ", {HistType::kTH2F, {{binsdEdx}, {binsPt}}}}, + + {"hAfterPIDEtaPhi", "PID Info after PID Cuts Eta vs Phi ; #eta; #varphi; ", {HistType::kTH2F, {{binsEta}, {binsPhi}}}}, + {"hEPRatioAfterPID", "E/P Ratio after PID Cuts apply only trackwodca filter", {HistType::kTH2F, {{binsPt}, {binsEmcEnergy}}}}, {"hPIDAfterPIDCuts", "PID Info after PID cuts; E/P;#it{p}_{T} (GeV#it{/c});n#sigma;m02; m20;", hAfterMatchEoPSigamSpec}, - {"hEmcClsTrkEtaPhiDiffTimeEnergy", "EmcClsTrkEtaPhiDiffTimeEnergy;#Delta#eta;#Delta#varphi;Sec;", hDeltaPhiDeltaEtaEmcClusterTrackSpecEnergy}}}; + {"hEmcClsTrkEtaPhiDiffTime", "EmcClsTrkEtaPhiDiffTime;#Delta#eta;#Delta#varphi;Sec;", hDeltaPhiDeltaEtaEmcClusterTrackTime}}}; void init(o2::framework::InitContext&) { @@ -404,13 +398,13 @@ struct HfElectronSelectionWithTpcEmcal { passEMCal = 1; // EMcal acceptance passed if ((phiTrack > phiTrackDCalMin && phiTrack < phiTrackDCalMax) && ((etaTrack > etaTrackDCalPositiveMin && etaTrack < etaTrackDCalPositiveMax) || (etaTrack > etaTrackDCalNegativeMin && etaTrack < etaTrackDCalNegativeMax))) passEMCal = 2; // Dcal acceptance passed - - registry.fill(HIST("hTrackEtaPhi"), etaTrack, phiTrack, passEMCal); // track etaphi infor after filter bit - registry.fill(HIST("hTrackEnergyLossVsP"), track.tpcSignal(), pTrack, passEMCal); // track etaphi infor after filter bit - registry.fill(HIST("hTrackEnergyLossVsPt"), track.tpcSignal(), ptTrack, passEMCal); // track etaphi infor after filter bit - registry.fill(HIST("hTracknSigmaVsP"), tpcNsigmaTrack, pTrack, passEMCal); // track etaphi infor after filter bit - registry.fill(HIST("hTracknSigmaVsPt"), tpcNsigmaTrack, ptTrack, passEMCal); // track etaphi infor after filter bit - + if (fillTrackInfo) { + registry.fill(HIST("hTrackEtaPhi"), etaTrack, phiTrack, passEMCal); // track etaphi infor after filter bit + registry.fill(HIST("hTrackEnergyLossVsP"), track.tpcSignal(), pTrack, passEMCal); // track etaphi infor after filter bit + registry.fill(HIST("hTrackEnergyLossVsPt"), track.tpcSignal(), ptTrack, passEMCal); // track etaphi infor after filter bit + registry.fill(HIST("hTracknSigmaVsP"), tpcNsigmaTrack, pTrack, passEMCal); // track etaphi infor after filter bit + registry.fill(HIST("hTracknSigmaVsPt"), tpcNsigmaTrack, ptTrack, passEMCal); // track etaphi infor after filter bit + } auto tracksofcluster = matchedTracks.sliceBy(perClusterMatchedTracks, track.globalIndex()); float phiMatchTrack = -999; float etaMatchTrack = -999; @@ -461,13 +455,14 @@ struct HfElectronSelectionWithTpcEmcal { continue; } - registry.fill(HIST("hEmcClsTrkEtaPhiDiffTimeEnergy"), deltaEtaMatch, deltaPhiMatch, timeEmcCluster); + registry.fill(HIST("hEmcClsTrkEtaPhiDiffTime"), deltaEtaMatch, deltaPhiMatch, timeEmcCluster); - if (fillEmcClusterInfo) - registry.fill(HIST("hEmcClusterAfterMatchEnergy"), emcCluster.energy()); // track etaphi infor after filter bit - registry.fill(HIST("hEmcClusterAfterMatchEtaPhi"), emcCluster.eta(), emcCluster.phi()); // track etaphi infor after filter bit - registry.fill(HIST("hEmcClusterAfterMatchEnergyCells"), emcCluster.energy(), emcCluster.nCells()); // track etaphi infor after filter bit - registry.fill(HIST("hEmcClusterAfterMatchEnergyTime"), emcCluster.energy(), emcCluster.time()); // track etaphi infor after filter bit + if (fillEmcClusterInfo) { + registry.fill(HIST("hEmcClusterAfterMatchEnergy"), emcCluster.energy()); // track etaphi infor after filter bit + registry.fill(HIST("hEmcClusterAfterMatchEtaPhi"), emcCluster.eta(), emcCluster.phi()); // track etaphi infor after filter bit + registry.fill(HIST("hEmcClusterAfterMatchEnergyCells"), emcCluster.energy(), emcCluster.nCells()); // track etaphi infor after filter bit + registry.fill(HIST("hEmcClusterAfterMatchEnergyTime"), emcCluster.energy(), emcCluster.time()); // track etaphi infor after filter bit + } eop = eMatchEmcCluster / pMatchTrack; @@ -516,7 +511,7 @@ struct HfElectronSelectionWithTpcEmcal { { fillElectronTrack(collision, tracks, emcClusters, matchedTracks, 0); } - PROCESS_SWITCH(HfElectronSelectionWithTpcEmcal, processData, "process Data info only", false); + PROCESS_SWITCH(HfElectronSelectionWithTpcEmcal, processData, "process Data info only", true); /// Electron selection - for MC reco-level analysis void processMcRec(McTableCollision const& mcCollision, McTableTracks const& mcTracks, @@ -608,7 +603,7 @@ struct HfElectronSelectionWithTpcEmcal { } } - PROCESS_SWITCH(HfElectronSelectionWithTpcEmcal, processMcGen, "Process MC Gen mode", true); + PROCESS_SWITCH(HfElectronSelectionWithTpcEmcal, processMcGen, "Process MC Gen mode", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From fbbe840e4b2cea085b58c4513f969716d117e8e4 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Mon, 10 Mar 2025 22:25:20 +0900 Subject: [PATCH 0626/1650] [PWGEM/PhotonMeson] update pcm data table and tasks (#10425) --- PWGEM/PhotonMeson/DataModel/gammaTables.h | 4 ++-- .../TableProducer/photonconversionbuilder.cxx | 9 ++++++--- .../PhotonMeson/TableProducer/skimmerGammaConversion.cxx | 2 +- .../TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx | 4 +++- PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx | 2 ++ PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx | 2 ++ PWGEM/PhotonMeson/Tasks/pcmQC.cxx | 2 ++ PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx | 2 ++ 8 files changed, 20 insertions(+), 7 deletions(-) diff --git a/PWGEM/PhotonMeson/DataModel/gammaTables.h b/PWGEM/PhotonMeson/DataModel/gammaTables.h index 0abbc3bfe76..27927173f63 100644 --- a/PWGEM/PhotonMeson/DataModel/gammaTables.h +++ b/PWGEM/PhotonMeson/DataModel/gammaTables.h @@ -175,7 +175,7 @@ DECLARE_SOA_TABLE(V0Legs, "AOD", "V0LEG", //! track::TPCChi2NCl, track::TPCInnerParam, track::TPCSignal, pidtpc::TPCNSigmaEl, pidtpc::TPCNSigmaPi, track::ITSClusterSizes, track::ITSChi2NCl, track::DetectorMap, - track::X, track::Y, track::Z, track::Tgl, + track::X, track::Y, track::Z, track::Tgl, track::C1Pt21Pt2, // dynamic column v0leg::P, @@ -284,7 +284,7 @@ using V0PhotonKFPrefilterBitDerived = V0PhotonsKFPrefilterBitDerived::iterator; DECLARE_SOA_TABLE(EMPrimaryElectronsFromDalitz, "AOD", "EMPRIMARYELDA", //! o2::soa::Index<>, emprimaryelectron::CollisionId, emprimaryelectron::TrackId, emprimaryelectron::Sign, - track::Pt, track::Eta, track::Phi, track::DcaXY, track::DcaZ, track::CYY, track::CZY, track::CZZ, + track::Pt, track::Eta, track::Phi, track::DcaXY, track::DcaZ, track::CYY, track::CZY, track::CZZ, track::C1Pt21Pt2, track::TPCNClsFindable, track::TPCNClsFindableMinusFound, track::TPCNClsFindableMinusCrossedRows, track::TPCNClsShared, track::TPCChi2NCl, track::TPCInnerParam, track::TPCSignal, pidtpc::TPCNSigmaEl, pidtpc::TPCNSigmaPi, diff --git a/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx b/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx index 3843a00987b..6e104d55623 100644 --- a/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx +++ b/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx @@ -166,6 +166,7 @@ struct PhotonConversionBuilder { {"V0/hPCA_diffX", "PCA vs. trackiu X - R_{xy};distance btween 2 legs (cm);min trackiu X - R_{xy} (cm)", {HistType::kTH2F, {{500, 0.0f, 5.f}, {100, -50.0, 50.0f}}}}, {"V0Leg/hPt", "pT of leg at SV;p_{T,e} (GeV/c)", {HistType::kTH1F, {{1000, 0.0f, 10.0f}}}}, {"V0Leg/hEtaPhi", "#eta vs. #varphi of leg at SV;#varphi (rad.);#eta", {HistType::kTH2F, {{72, 0.0f, 2 * M_PI}, {200, -1, +1}}}}, + {"V0Leg/hRelDeltaPt", "pT resolution;p_{T} (GeV/c);#Deltap_{T}/p_{T}", {HistType::kTH2F, {{1000, 0.f, 10.f}, {100, 0, 1}}}}, {"V0Leg/hDCAxyz", "DCA xy vs. z to PV;DCA_{xy} (cm);DCA_{z} (cm)", {HistType::kTH2F, {{200, -50.f, 50.f}, {200, -50.f, +50.f}}}}, {"V0Leg/hdEdx_Pin", "TPC dE/dx vs. p_{in};p_{in} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{1000, 0.f, 10.f}, {200, 0.f, 200.f}}}}, {"V0Leg/hTPCNsigmaEl", "TPC dE/dx vs. p_{in};p_{in} (GeV/c);n #sigma_{e}^{TPC}", {HistType::kTH2F, {{1000, 0.f, 10.f}, {100, -5.f, +5.f}}}}, @@ -368,7 +369,7 @@ struct PhotonConversionBuilder { track.tpcChi2NCl(), track.tpcInnerParam(), track.tpcSignal(), track.tpcNSigmaEl(), track.tpcNSigmaPi(), track.itsClusterSizes(), track.itsChi2NCl(), track.detectorMap(), - shiftedtrack.getX(), shiftedtrack.getY(), shiftedtrack.getZ(), shiftedtrack.getTgl()); + shiftedtrack.getX(), shiftedtrack.getY(), shiftedtrack.getZ(), shiftedtrack.getTgl(), shiftedtrack.getSigma1Pt2()); } template @@ -647,8 +648,10 @@ struct PhotonConversionBuilder { registry.fill(HIST("V0Leg/hdEdx_Pin"), leg.tpcInnerParam(), leg.tpcSignal()); registry.fill(HIST("V0Leg/hTPCNsigmaEl"), leg.tpcInnerParam(), leg.tpcNSigmaEl()); } // end of leg loop - registry.fill(HIST("V0Leg/hXZ"), pTrack.getZ(), pTrack.getX()); - registry.fill(HIST("V0Leg/hXZ"), nTrack.getZ(), nTrack.getX()); + for (auto& leg : {pTrack, nTrack}) { + registry.fill(HIST("V0Leg/hXZ"), leg.getZ(), leg.getX()); + registry.fill(HIST("V0Leg/hRelDeltaPt"), leg.getPt(), leg.getPt() * std::sqrt(leg.getSigma1Pt2())); + } // end of leg loop registry.fill(HIST("V0Leg/hDCAxyz"), posdcaXY, posdcaZ); registry.fill(HIST("V0Leg/hDCAxyz"), eledcaXY, eledcaZ); diff --git a/PWGEM/PhotonMeson/TableProducer/skimmerGammaConversion.cxx b/PWGEM/PhotonMeson/TableProducer/skimmerGammaConversion.cxx index 6a39aea8881..c9d602d247f 100644 --- a/PWGEM/PhotonMeson/TableProducer/skimmerGammaConversion.cxx +++ b/PWGEM/PhotonMeson/TableProducer/skimmerGammaConversion.cxx @@ -190,7 +190,7 @@ struct skimmerGammaConversion { theTrack.tpcChi2NCl(), theTrack.tpcInnerParam(), theTrack.tpcSignal(), theTrack.tpcNSigmaEl(), theTrack.tpcNSigmaPi(), theTrack.itsClusterSizes(), theTrack.itsChi2NCl(), theTrack.detectorMap(), - theTrack.x(), theTrack.y(), theTrack.z(), theTrack.tgl()); + theTrack.x(), theTrack.y(), theTrack.z(), theTrack.tgl(), theTrack.c1Pt21Pt2()); } template diff --git a/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx b/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx index b72fdedb8da..23f8510ba15 100644 --- a/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx +++ b/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx @@ -103,6 +103,7 @@ struct skimmerPrimaryElectronFromDalitzEE { fRegistry.add("Track/hPt", "pT;p_{T} (GeV/c)", kTH1F, {{1000, 0.0f, 10}}, false); fRegistry.add("Track/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {400, -2.0f, 2.0f}}, false); fRegistry.add("Track/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{400, -20, 20}}, false); + fRegistry.add("Track/hRelDeltaPt", "pT resolution;p_{T} (GeV/c);#Deltap_{T}/p_{T}", kTH2F, {{1000, 0, 10}, {100, 0, 1}}, false); fRegistry.add("Track/hDCAxyz", "DCA xy vs. z;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -1.0f, 1.0f}, {200, -1.0f, 1.0f}}, false); fRegistry.add("Track/hDCAxy_Pt", "DCA_{xy} vs. pT;p_{T} (GeV/c);DCA_{xy} (cm)", kTH2F, {{200, 0, 10}, {200, -1, 1}}, false); fRegistry.add("Track/hDCAz_Pt", "DCA_{z} vs. pT;p_{T} (GeV/c);DCA_{z} (cm)", kTH2F, {{200, 0, 10}, {200, -1, 1}}, false); @@ -267,7 +268,7 @@ struct skimmerPrimaryElectronFromDalitzEE { { if (std::find(stored_trackIds.begin(), stored_trackIds.end(), std::make_pair(collision.globalIndex(), track.globalIndex())) == stored_trackIds.end()) { emprimaryelectrons(collision.globalIndex(), track.globalIndex(), track.sign(), - track.pt(), track.eta(), track.phi(), track.dcaXY(), track.dcaZ(), track.cYY(), track.cZY(), track.cZZ(), + track.pt(), track.eta(), track.phi(), track.dcaXY(), track.dcaZ(), track.cYY(), track.cZY(), track.cZZ(), track.c1Pt21Pt2(), track.tpcNClsFindable(), track.tpcNClsFindableMinusFound(), track.tpcNClsFindableMinusCrossedRows(), track.tpcNClsShared(), track.tpcChi2NCl(), track.tpcInnerParam(), track.tpcSignal(), track.tpcNSigmaEl(), track.tpcNSigmaPi(), @@ -277,6 +278,7 @@ struct skimmerPrimaryElectronFromDalitzEE { fRegistry.fill(HIST("Track/hPt"), track.pt()); fRegistry.fill(HIST("Track/hEtaPhi"), track.phi(), track.eta()); fRegistry.fill(HIST("Track/hQoverPt"), track.sign() / track.pt()); + fRegistry.fill(HIST("Track/hRelDeltaPt"), track.pt(), track.sigma1Pt() * track.pt()); fRegistry.fill(HIST("Track/hDCAxyz"), track.dcaXY(), track.dcaZ()); fRegistry.fill(HIST("Track/hDCAxy_Pt"), track.pt(), track.dcaXY()); fRegistry.fill(HIST("Track/hDCAz_Pt"), track.pt(), track.dcaZ()); diff --git a/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx b/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx index 6d289eccbb6..ed29c207602 100644 --- a/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx +++ b/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx @@ -185,6 +185,7 @@ struct DalitzEEQC { fRegistry.add("Track/hPt", "pT;p_{T} (GeV/c)", kTH1F, {{1000, 0.0f, 10}}, false); fRegistry.add("Track/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{400, -20, 20}}, false); + fRegistry.add("Track/hRelDeltaPt", "pT resolution;p_{T} (GeV/c);#Deltap_{T}/p_{T}", kTH2F, {{1000, 0, 10}, {200, 0, 0.2}}, false); fRegistry.add("Track/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {40, -2.0f, 2.0f}}, false); fRegistry.add("Track/hDCAxyz", "DCA xy vs. z;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -1.0f, 1.0f}, {200, -1.0f, 1.0f}}, false); fRegistry.add("Track/hDCAxyzSigma", "DCA xy vs. z;DCA_{xy} (#sigma);DCA_{z} (#sigma)", kTH2F, {{200, -10.0f, 10.0f}, {200, -10.0f, 10.0f}}, false); @@ -314,6 +315,7 @@ struct DalitzEEQC { { fRegistry.fill(HIST("Track/hPt"), track.pt()); fRegistry.fill(HIST("Track/hQoverPt"), track.sign() / track.pt()); + fRegistry.fill(HIST("Track/hRelDeltaPt"), track.pt(), std::sqrt(track.c1Pt21Pt2()) * track.pt()); fRegistry.fill(HIST("Track/hEtaPhi"), track.phi(), track.eta()); fRegistry.fill(HIST("Track/hDCAxyz"), track.dcaXY(), track.dcaZ()); fRegistry.fill(HIST("Track/hDCAxyzSigma"), track.dcaXY() / sqrt(track.cYY()), track.dcaZ() / sqrt(track.cZZ())); diff --git a/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx b/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx index 91c54bf439f..e4748f462fb 100644 --- a/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx @@ -158,6 +158,7 @@ struct DalitzEEQCMC { // track info fRegistry.add("Track/hPt", "pT;p_{T} (GeV/c)", kTH1F, {{1000, 0.0f, 10}}, false); fRegistry.add("Track/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{400, -20, 20}}, false); + fRegistry.add("Track/hRelDeltaPt", "pT resolution;p_{T} (GeV/c);#Deltap_{T}/p_{T}", kTH2F, {{1000, 0, 10}, {200, 0, 0.2}}, false); fRegistry.add("Track/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {40, -2.0f, 2.0f}}, false); fRegistry.add("Track/hDCAxyz", "DCA xy vs. z;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -1.0f, 1.0f}, {200, -1.0f, 1.0f}}, false); fRegistry.add("Track/hDCAxyzSigma", "DCA xy vs. z;DCA_{xy} (#sigma);DCA_{z} (#sigma)", kTH2F, {{200, -10.0f, 10.0f}, {200, -10.0f, 10.0f}}, false); @@ -418,6 +419,7 @@ struct DalitzEEQCMC { { fRegistry.fill(HIST("Track/hPt"), track.pt()); fRegistry.fill(HIST("Track/hQoverPt"), track.sign() / track.pt()); + fRegistry.fill(HIST("Track/hRelDeltaPt"), track.pt(), std::sqrt(track.c1Pt21Pt2()) * track.pt()); fRegistry.fill(HIST("Track/hEtaPhi"), track.phi(), track.eta()); fRegistry.fill(HIST("Track/hDCAxyz"), track.dcaXY(), track.dcaZ()); fRegistry.fill(HIST("Track/hDCAxyzSigma"), track.dcaXY() / sqrt(track.cYY()), track.dcaZ() / sqrt(track.cZZ())); diff --git a/PWGEM/PhotonMeson/Tasks/pcmQC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQC.cxx index 81fbd5328ef..c7660624bc1 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQC.cxx @@ -162,6 +162,7 @@ struct PCMQC { // v0leg info fRegistry.add("V0Leg/hPt", "pT;p_{T,e} (GeV/c)", kTH1F, {{1000, 0.0f, 10}}, false); fRegistry.add("V0Leg/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{1000, -50, 50}}, false); + fRegistry.add("V0Leg/hRelDeltaPt", "pT resolution;p_{T} (GeV/c);#Deltap_{T}/p_{T}", kTH2F, {{1000, 0, 10}, {200, 0, 0.2}}, false); fRegistry.add("V0Leg/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{90, 0, 2 * M_PI}, {200, -1.0f, 1.0f}}, false); fRegistry.add("V0Leg/hDCAxyz", "DCA xy vs. z;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -50.0f, 50.0f}, {200, -50.0f, 50.0f}}, false); fRegistry.add("V0Leg/hNclsTPC", "number of TPC clusters", kTH1F, {{161, -0.5, 160.5}}, false); @@ -311,6 +312,7 @@ struct PCMQC { { fRegistry.fill(HIST("V0Leg/hPt"), leg.pt()); fRegistry.fill(HIST("V0Leg/hQoverPt"), leg.sign() / leg.pt()); + fRegistry.fill(HIST("V0Leg/hRelDeltaPt"), leg.pt(), std::sqrt(leg.c1Pt21Pt2()) * leg.pt()); fRegistry.fill(HIST("V0Leg/hEtaPhi"), leg.phi(), leg.eta()); fRegistry.fill(HIST("V0Leg/hDCAxyz"), leg.dcaXY(), leg.dcaZ()); fRegistry.fill(HIST("V0Leg/hNclsITS"), leg.itsNCls()); diff --git a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx index 2758390cca8..d90338fe94d 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx @@ -216,6 +216,7 @@ struct PCMQCMC { // v0leg info fRegistry.add("V0Leg/primary/hPt", "pT;p_{T,e} (GeV/c)", kTH1F, {{1000, 0.0f, 10}}, false); fRegistry.add("V0Leg/primary/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{1000, -50, 50}}, false); + fRegistry.add("V0Leg/primary/hRelDeltaPt", "pT resolution;p_{T} (GeV/c);#Deltap_{T}/p_{T}", kTH2F, {{1000, 0, 10}, {200, 0, 0.2}}, false); fRegistry.add("V0Leg/primary/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{90, 0, 2 * M_PI}, {200, -1.0f, 1.0f}}, false); fRegistry.add("V0Leg/primary/hDCAxyz", "DCA xy vs. z;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -50.0f, 50.0f}, {200, -50.0f, 50.0f}}, false); fRegistry.add("V0Leg/primary/hNclsTPC", "number of TPC clusters", kTH1F, {{161, -0.5, 160.5}}, false); @@ -380,6 +381,7 @@ struct PCMQCMC { fRegistry.fill(HIST("V0Leg/") + HIST(mcphoton_types[mctype]) + HIST("hPt"), leg.pt()); fRegistry.fill(HIST("V0Leg/") + HIST(mcphoton_types[mctype]) + HIST("hQoverPt"), leg.sign() / leg.pt()); fRegistry.fill(HIST("V0Leg/") + HIST(mcphoton_types[mctype]) + HIST("hEtaPhi"), leg.phi(), leg.eta()); + fRegistry.fill(HIST("V0Leg/") + HIST(mcphoton_types[mctype]) + HIST("hRelDeltaPt"), leg.pt(), std::sqrt(leg.c1Pt21Pt2()) * leg.pt()); fRegistry.fill(HIST("V0Leg/") + HIST(mcphoton_types[mctype]) + HIST("hDCAxyz"), leg.dcaXY(), leg.dcaZ()); fRegistry.fill(HIST("V0Leg/") + HIST(mcphoton_types[mctype]) + HIST("hNclsITS"), leg.itsNCls()); fRegistry.fill(HIST("V0Leg/") + HIST(mcphoton_types[mctype]) + HIST("hNclsTPC"), leg.tpcNClsFound()); From 875cefb42bfd7bbf567373ccd854bbc95e0cdf23 Mon Sep 17 00:00:00 2001 From: Paul Buehler Date: Mon, 10 Mar 2025 14:32:27 +0100 Subject: [PATCH 0627/1650] [PWGUD] Added configurable generatorIds in Mc[D,S]GCandProducer (#10427) --- PWGUD/TableProducer/DGCandProducer.cxx | 15 ++++++++++++--- PWGUD/TableProducer/SGCandProducer.cxx | 11 +++++++---- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/PWGUD/TableProducer/DGCandProducer.cxx b/PWGUD/TableProducer/DGCandProducer.cxx index f5cec97f6c0..54c353d3d9a 100644 --- a/PWGUD/TableProducer/DGCandProducer.cxx +++ b/PWGUD/TableProducer/DGCandProducer.cxx @@ -473,6 +473,7 @@ struct McDGCandProducer { Produces outputMcTrackLabels; // save all McTruth, even if the collisions is not reconstructed + Configurable> generatorIds{"generatorIds", std::vector{-1}, "MC generatorIds to process"}; Configurable saveAllMcCollisions{"saveAllMcCollisions", true, "save all McCollisions"}; using CCs = soa::Join; @@ -686,6 +687,7 @@ struct McDGCandProducer { // loop over McCollisions and UDCCs simultaneously auto mccol = mccols.iteratorAt(0); + auto mcOfInterest = std::find(generatorIds->begin(), generatorIds->end(), mccol.getGeneratorId()) != generatorIds->end(); auto lastmccol = mccols.iteratorAt(mccols.size() - 1); auto mccolAtEnd = false; @@ -729,7 +731,9 @@ struct McDGCandProducer { // If the dgcand has an associated McCollision then the McCollision and all associated // McParticles are saved - if (mcdgId >= 0) { + // but only consider generated events of interest + if (mcdgId >= 0 && mcOfInterest) { + if (mcColIsSaved.find(mcdgId) == mcColIsSaved.end()) { // update UDMcCollisions LOGF(debug, " writing mcCollision %d to UDMcCollisions", mcdgId); @@ -789,7 +793,8 @@ struct McDGCandProducer { // this is case 2. // update UDMcCollisions and UDMcParticles - if (mcColIsSaved.find(mccolId) == mcColIsSaved.end()) { + // but only consider generated events of interest + if (mcOfInterest && mcColIsSaved.find(mccolId) == mcColIsSaved.end()) { // update UDMcCollisions LOGF(debug, " writing mcCollision %d to UDMcCollisions", mccolId); @@ -804,6 +809,7 @@ struct McDGCandProducer { // advance mccol if (mccol != lastmccol) { mccol++; + mcOfInterest = std::find(generatorIds->begin(), generatorIds->end(), mccol.getGeneratorId()) != generatorIds->end(); mccolId = mccol.globalIndex(); } else { mccolAtEnd = true; @@ -826,8 +832,11 @@ struct McDGCandProducer { // loop over McCollisions for (auto const& mccol : mccols) { - int64_t mccolId = mccol.globalIndex(); + // only consider generated events of interest + if (std::find(generatorIds->begin(), generatorIds->end(), mccol.getGeneratorId()) == generatorIds->end()) + continue; + int64_t mccolId = mccol.globalIndex(); // update UDMcCollisions and UDMcParticles if (mcColIsSaved.find(mccolId) == mcColIsSaved.end()) { diff --git a/PWGUD/TableProducer/SGCandProducer.cxx b/PWGUD/TableProducer/SGCandProducer.cxx index c3d8de0cb48..51736bbea86 100644 --- a/PWGUD/TableProducer/SGCandProducer.cxx +++ b/PWGUD/TableProducer/SGCandProducer.cxx @@ -366,6 +366,7 @@ struct McSGCandProducer { Produces outputMcTrackLabels; // save all McTruth, even if the collisions is not reconstructed + Configurable> generatorIds{"generatorIds", std::vector{-1}, "MC generatorIds to process"}; Configurable saveAllMcCollisions{"saveAllMcCollisions", true, "save all McCollisions"}; using CCs = soa::Join; @@ -555,6 +556,7 @@ struct McSGCandProducer { // loop over McCollisions and UDCCs simultaneously auto mccol = mccols.iteratorAt(0); + auto mcOfInterest = std::find(generatorIds->begin(), generatorIds->end(), mccol.getGeneratorId()) != generatorIds->end(); auto lastmccol = mccols.iteratorAt(mccols.size() - 1); auto mccolAtEnd = false; @@ -565,7 +567,6 @@ struct McSGCandProducer { // advance dgcand and mccol until both are AtEnd int64_t mccolId = mccol.globalIndex(); int64_t mcsgId = -1; - bool goon = true; while (goon) { auto globBC = mccol.bc_as().globalBC(); @@ -599,7 +600,8 @@ struct McSGCandProducer { // If the sgcand has an associated McCollision then the McCollision and all associated // McParticles are saved - if (mcsgId >= 0) { + // but only consider generated events of interest + if (mcsgId >= 0 && mcOfInterest) { if (mcColIsSaved.find(mcsgId) == mcColIsSaved.end()) { if (verboseInfoMC) LOGF(info, " Saving McCollision %d", mcsgId); @@ -662,10 +664,10 @@ struct McSGCandProducer { LOGF(info, "Doing case 2"); // update UDMcCollisions and UDMcParticles - if (mcColIsSaved.find(mccolId) == mcColIsSaved.end()) { + // but only consider generated events of interest + if (mcOfInterest && mcColIsSaved.find(mccolId) == mcColIsSaved.end()) { if (verboseInfoMC) LOGF(info, " Saving McCollision %d", mccolId); - // update UDMcCollisions updateUDMcCollisions(mccol, globBC); mcColIsSaved[mccolId] = outputMcCollisions.lastIndex(); @@ -678,6 +680,7 @@ struct McSGCandProducer { // advance mccol if (mccol != lastmccol) { mccol++; + mcOfInterest = std::find(generatorIds->begin(), generatorIds->end(), mccol.getGeneratorId()) != generatorIds->end(); mccolId = mccol.globalIndex(); } else { mccolAtEnd = true; From cf6a7d8ec184699fa7fa88bbfe1b450b44be3a5e Mon Sep 17 00:00:00 2001 From: Antonio Palasciano <52152842+apalasciano@users.noreply.github.com> Date: Mon, 10 Mar 2025 14:51:24 +0100 Subject: [PATCH 0628/1650] [PWGHF,Trigger] Add Charm baryons in D0p to HF filters (#10340) --- EventFiltering/PWGHF/HFFilter.cxx | 151 ++++++++++++++++++++++++- EventFiltering/PWGHF/HFFilterHelpers.h | 20 ++-- EventFiltering/filterTables.h | 2 + 3 files changed, 160 insertions(+), 13 deletions(-) diff --git a/EventFiltering/PWGHF/HFFilter.cxx b/EventFiltering/PWGHF/HFFilter.cxx index ee41cd01c30..a8edb09fab1 100644 --- a/EventFiltering/PWGHF/HFFilter.cxx +++ b/EventFiltering/PWGHF/HFFilter.cxx @@ -18,6 +18,7 @@ /// \author Alexandre Bigot , Strasbourg University /// \author Biao Zhang , CCNU /// \author Federica Zanone , Heidelberg University +/// \author Antonio Palasciano , INFN Bari #include #include @@ -108,8 +109,10 @@ struct HfFilter { // Main struct for HF triggers // parameters for resonance triggers Configurable> cutsGammaK0sLambda{"cutsGammaK0sLambda", {cutsV0s[0], 1, 6, labelsEmpty, labelsColumnsV0s}, "Selections for V0s (gamma, K0s, Lambda) for D+V0 triggers"}; - Configurable> cutsPtDeltaMassCharmReso{"cutsPtDeltaMassCharmReso", {cutsCharmReso[0], 3, 11, labelsRowsDeltaMassCharmReso, labelsColumnsDeltaMassCharmReso}, "pt (GeV/c) and invariant-mass delta (GeV/c2) for charm hadron resonances"}; + Configurable> cutsPtDeltaMassCharmReso{"cutsPtDeltaMassCharmReso", {cutsCharmReso[0], 3, 13, labelsRowsDeltaMassCharmReso, labelsColumnsDeltaMassCharmReso}, "pt (GeV/c) and invariant-mass delta (GeV/c2) for charm hadron resonances"}; Configurable keepAlsoWrongDmesLambdaPairs{"keepAlsoWrongDmesLambdaPairs", true, "flat go keep also wrong sign D+Lambda pairs"}; + Configurable keepAlsoWrongDmesProtonPairs{"keepAlsoWrongDmesProtonPairs", true, "flat go keep also wrong sign D0p pairs"}; + Configurable keepAlsoWrongDstarMesProtonPairs{"keepAlsoWrongDstarMesProtonPairs", true, "flat go keep also wrong sign D*0p pairs"}; // parameters for charm baryons to Xi bachelor Configurable> cutsXiCascades{"cutsXiCascades", {cutsCascades[0], 1, 8, labelsEmpty, labelsColumnsCascades}, "Selections for cascades (Xi) for Xi+bachelor triggers"}; @@ -170,7 +173,7 @@ struct HfFilter { // Main struct for HF triggers std::array, kNCharmParticles> hCharmProtonKstarDistr{}; std::array, kNCharmParticles> hCharmDeuteronKstarDistr{}; std::array, nTotBeautyParts> hMassVsPtB{}; - std::array, kNCharmParticles + 19> hMassVsPtC{}; // +9 for resonances (D*+, D*0, Ds*+, Ds1+, Ds2*+, Xic+* right sign, Xic+* wrong sign, Xic0* right sign, Xic0* wrong sign) +2 for SigmaC (SigmaC++, SigmaC0) +2 for SigmaCK pairs (SigmaC++K-, SigmaC0K0s) +3 for charm baryons (Xi+Pi, Xi+Ka, Xi+Pi+Pi) + JPsi + std::array, kNCharmParticles + 22> hMassVsPtC{}; // +9 for resonances (D*+, D*0, Ds*+, Ds1+, Ds2*+, Xic+* right sign, Xic+* wrong sign, Xic0* right sign, Xic0* wrong sign) +2 for SigmaC (SigmaC++, SigmaC0) +2 for SigmaCK pairs (SigmaC++K-, SigmaC0K0s) +3 for charm baryons (Xi+Pi, Xi+Ka, Xi+Pi+Pi) + JPsi + 4 for charm baryons (D0+p, D0+pWrongSign, D*0p, D*0+pWrongSign) std::array, 4> hPrDePID; // proton TPC, proton TOF, deuteron TPC, deuteron TOF std::array, kNCharmParticles> hBDTScoreBkg{}; std::array, kNCharmParticles> hBDTScorePrompt{}; @@ -278,6 +281,12 @@ struct HfFilter { // Main struct for HF triggers hMassVsPtC[kNCharmParticles + 17] = registry.add("fMassVsPtCharmBaryonToXiPiPi", "#it{M} vs. #it{p}_{T} distribution of triggered #Xi+#pi+#pi candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 17]}); // JPsi hMassVsPtC[kNCharmParticles + 18] = registry.add("fMassVsPtJPsiToMuMu", "#it{M} vs. #it{p}_{T} distribution of triggered J/#psi to #mu#mu candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 18]}); + // Lc resonances + hMassVsPtC[kNCharmParticles + 19] = registry.add("fMassVsPtCharmBaryonToD0P", "#it{M} vs. #it{p}_{T} distribution of triggered D^{0}#p candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 19]}); + hMassVsPtC[kNCharmParticles + 20] = registry.add("fMassVsPtCharmBaryonToD0PWrongSign", "#it{M} vs. #it{p}_{T} distribution of triggered D^{0}#p wrong sign candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 20]}); + // ThetaC + hMassVsPtC[kNCharmParticles + 21] = registry.add("fMassVsPtCharmBaryonToDstarP", "#it{M} vs. #it{p}_{T} distribution of triggered D^{*0}#p candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 21]}); + hMassVsPtC[kNCharmParticles + 22] = registry.add("fMassVsPtCharmBaryonToDstarPWrongSign", "#it{M} vs. #it{p}_{T} distribution of triggered D^{*0}#p wrong sign candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", HistType::kTH2D, {ptAxis, massAxisC[kNCharmParticles + 22]}); for (int iBeautyPart{0}; iBeautyPart < kNBeautyParticles; ++iBeautyPart) { hMassVsPtB[iBeautyPart] = registry.add(Form("fMassVsPt%s", beautyParticleNames[iBeautyPart].data()), Form("#it{M} vs. #it{p}_{T} distribution of triggered %s candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", beautyParticleNames[iBeautyPart].data()), HistType::kTH2D, {ptAxis, massAxisB[iBeautyPart]}); @@ -376,7 +385,7 @@ struct HfFilter { // Main struct for HF triggers bool keepEvent[kNtriggersHF]{false}; if (!collision.sel8() || std::fabs(collision.posZ()) > 11.f) { // safety margin for Zvtx - tags(keepEvent[kHighPt2P], keepEvent[kHighPt3P], keepEvent[kBeauty3P], keepEvent[kBeauty4P], keepEvent[kFemto2P], keepEvent[kFemto3P], keepEvent[kDoubleCharm2P], keepEvent[kDoubleCharm3P], keepEvent[kDoubleCharmMix], keepEvent[kV0Charm2P], keepEvent[kV0Charm3P], keepEvent[kCharmBarToXiBach], keepEvent[kSigmaCPPK], keepEvent[kSigmaC0K0], keepEvent[kPhotonCharm2P], keepEvent[kPhotonCharm3P], keepEvent[kSingleCharm2P], keepEvent[kSingleCharm3P], keepEvent[kSingleNonPromptCharm2P], keepEvent[kSingleNonPromptCharm3P], keepEvent[kCharmBarToXi2Bach], keepEvent[kBtoJPsiKa], keepEvent[kBtoJPsiKstar], keepEvent[kBtoJPsiPhi], keepEvent[kBtoJPsiPrKa], keepEvent[kBtoJPsiPi]); + tags(keepEvent[kHighPt2P], keepEvent[kHighPt3P], keepEvent[kBeauty3P], keepEvent[kBeauty4P], keepEvent[kFemto2P], keepEvent[kFemto3P], keepEvent[kDoubleCharm2P], keepEvent[kDoubleCharm3P], keepEvent[kDoubleCharmMix], keepEvent[kV0Charm2P], keepEvent[kV0Charm3P], keepEvent[kCharmBarToXiBach], keepEvent[kSigmaCPPK], keepEvent[kSigmaC0K0], keepEvent[kPhotonCharm2P], keepEvent[kPhotonCharm3P], keepEvent[kSingleCharm2P], keepEvent[kSingleCharm3P], keepEvent[kSingleNonPromptCharm2P], keepEvent[kSingleNonPromptCharm3P], keepEvent[kCharmBarToXi2Bach], keepEvent[kPrCharm2P], keepEvent[kBtoJPsiKa], keepEvent[kBtoJPsiKstar], keepEvent[kBtoJPsiPhi], keepEvent[kBtoJPsiPrKa], keepEvent[kBtoJPsiPi]); continue; } @@ -929,6 +938,140 @@ struct HfFilter { // Main struct for HF triggers } } // end V0 selection + // 2-prong (D0 or D*) with proton for Lc resonances and ThetaC (3100) + if (!keepEvent[kPrCharm2P] && isD0SignalTagged && (TESTBIT(selD0InMass, 0) || TESTBIT(selD0InMass, 1))) { + for (const auto& trackProtonId : trackIdsThisCollision) { // start loop over tracks selecting only protons + auto trackProton = tracks.rawIteratorAt(trackProtonId.trackId()); + std::array pVecProton = trackProton.pVector(); + if (trackProton.globalIndex() == trackPos.globalIndex() || trackProton.globalIndex() == trackNeg.globalIndex()) { + continue; + } + bool isProton = helper.isSelectedProton4CharmOrBeautyBaryons(trackProton); + if (isProton) { + if (!keepEvent[kPrCharm2P]) { + // we first look for a D*+ + for (const auto& trackBachelorId : trackIdsThisCollision) { // start loop over tracks to find bachelor pion + auto trackBachelor = tracks.rawIteratorAt(trackBachelorId.trackId()); + if (trackBachelor.globalIndex() == trackPos.globalIndex() || trackBachelor.globalIndex() == trackNeg.globalIndex() || trackBachelor.globalIndex() == trackProton.globalIndex()) { + continue; + } + auto trackParBachelor = getTrackPar(trackBachelor); + o2::gpu::gpustd::array dcaBachelor{trackBachelor.dcaXY(), trackBachelor.dcaZ()}; + std::array pVecBachelor = trackBachelor.pVector(); + if (trackBachelor.collisionId() != thisCollId) { + o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParBachelor, 2.f, noMatCorr, &dcaBachelor); + getPxPyPz(trackParBachelor, pVecBachelor); + } + int isTrackSelected = helper.isSelectedTrackForSoftPionOrBeauty(trackBachelor, trackParBachelor, dcaBachelor); + if (TESTBIT(isTrackSelected, kSoftPion) && ((TESTBIT(selD0InMass, 0) && trackBachelor.sign() > 0) || (TESTBIT(selD0InMass, 1) && trackBachelor.sign() < 0))) { + std::array massDausD0{massPi, massKa}; + auto massD0dau = massD0Cand; + if (trackBachelor.sign() < 0) { + massDausD0[0] = massKa; + massDausD0[1] = massPi; + massD0dau = massD0BarCand; + } + auto pVecDStarCand = RecoDecay::pVec(pVec2Prong, pVecBachelor); + auto ptDStarCand = RecoDecay::pt(pVecDStarCand); + double massDStarCand{-999.}, massDiffDstar{-999.}; + if (ptDStarCand > cutsPtDeltaMassCharmReso->get(2u, 0u)) { + massDStarCand = RecoDecay::m(std::array{pVecPos, pVecNeg, pVecBachelor}, std::array{massDausD0[0], massDausD0[1], massPi}); + massDiffDstar = massDStarCand - massD0dau; + if (cutsPtDeltaMassCharmReso->get(0u, 0u) <= massDiffDstar && massDiffDstar <= cutsPtDeltaMassCharmReso->get(1u, 0u)) { + if (activateQA) { // probably this is not needed, since already performed for the Xic (duplicate) + hMassVsPtC[kNCharmParticles]->Fill(ptDStarCand, massDiffDstar); + } + auto pVecReso2Prong = RecoDecay::pVec(pVecDStarCand, pVecProton); + auto ptCand = RecoDecay::pt(pVecReso2Prong); + if (ptCand > cutsPtDeltaMassCharmReso->get(2u, 12u)) { + // build D*0p candidate with the possibility of storing also the other sign hyp. + float massThetacCand{-999.}, massThetacBarCand{-999.}; + float massDiffThetacCand{-999.}, massDiffThetacBarCand{-999.}; + bool isRightSignThetaC{false}, isRightSignThetaCBar{false}; + if (TESTBIT(selD0InMass, 1)) { // Correct hyp: ThetaC -> pD*- -> D0bar\pi- (Equivalent to trackBachelor.sign() < 0) + massThetacCand = RecoDecay::m(std::array{pVecPos, pVecNeg, pVecBachelor, pVecProton}, std::array{massDausD0[0], massDausD0[1], massPi, massProton}); + massDiffThetacCand = massThetacCand - massDStarCand; + isRightSignThetaC = trackProton.sign() > 0; // right sign if proton + } + if (TESTBIT(selD0InMass, 0)) { // Correct hyp: ThetaCbar -> pD*+ -> pD0\pi+ (Equivalent to trackBachelor.sign() > 0) + massThetacBarCand = RecoDecay::m(std::array{pVecPos, pVecNeg, pVecBachelor, pVecProton}, std::array{massDausD0[0], massDausD0[1], massPi, massProton}); + massDiffThetacBarCand = massThetacBarCand - massDStarCand; + isRightSignThetaCBar = trackProton.sign() < 0; // right sign if antiproton + } + bool isGoodThetac = (cutsPtDeltaMassCharmReso->get(0u, 12u) < massDiffThetacCand && massDiffThetacCand < cutsPtDeltaMassCharmReso->get(1u, 12u)); + bool isGoodThetacBar = (cutsPtDeltaMassCharmReso->get(0u, 12u) < massDiffThetacBarCand && massDiffThetacBarCand < cutsPtDeltaMassCharmReso->get(1u, 12u)); + + if (activateQA) { + if (isGoodThetac) { + if (isRightSignThetaC) { + hMassVsPtC[kNCharmParticles + 21]->Fill(ptCand, massDiffThetacCand); + } else if (!isRightSignThetaC && keepAlsoWrongDmesProtonPairs) { + hMassVsPtC[kNCharmParticles + 22]->Fill(ptCand, massDiffThetacBarCand); + } + } + if (isGoodThetacBar) { + if (isRightSignThetaCBar) { + hMassVsPtC[kNCharmParticles + 21]->Fill(ptCand, massDiffThetacCand); + } else if (!isRightSignThetaCBar && keepAlsoWrongDmesProtonPairs) { + hMassVsPtC[kNCharmParticles + 22]->Fill(ptCand, massDiffThetacBarCand); + } + } + } + if ((isGoodThetac && (isRightSignThetaC || keepAlsoWrongDstarMesProtonPairs)) || (isGoodThetacBar && (isRightSignThetaCBar || keepAlsoWrongDstarMesProtonPairs))) { + keepEvent[kPrCharm2P] = true; + break; + } + } + } + } + } + } // end bachelor pion for D*p pairs + // build D0p candidate with the possibility of storing also the other sign hyp. + float massLcStarCand{-999.}, massLcStarBarCand{-999.}; + float massDiffLcStarCand{-999.}, massDiffLcStarBarCand{-999.}; + bool isRightSignLcStar{false}, isRightSignLcStarBar{false}; + auto pVecReso2Prong = RecoDecay::pVec(pVec2Prong, pVecProton); + auto ptCand = RecoDecay::pt(pVecReso2Prong); + if (ptCand > cutsPtDeltaMassCharmReso->get(2u, 11u)) { + if (TESTBIT(selD0InMass, 0)) { + massLcStarCand = RecoDecay::m(std::array{pVecPos, pVecNeg, pVecProton}, std::array{massPi, massKa, massProton}); + massDiffLcStarCand = massLcStarCand - massD0Cand; + isRightSignLcStar = trackProton.sign() > 0; // right sign if proton + } + if (TESTBIT(selD0InMass, 1)) { + massLcStarBarCand = RecoDecay::m(std::array{pVecPos, pVecNeg, pVecProton}, std::array{massKa, massPi, massProton}); + massDiffLcStarBarCand = massLcStarBarCand - massD0BarCand; + isRightSignLcStarBar = trackProton.sign() < 0; // right sign if antiproton + } + bool isGoodLcStar = (cutsPtDeltaMassCharmReso->get(0u, 11u) < massDiffLcStarCand && massDiffLcStarCand < cutsPtDeltaMassCharmReso->get(1u, 11u)); + bool isGoodLcStarBar = (cutsPtDeltaMassCharmReso->get(0u, 11u) < massDiffLcStarBarCand && massDiffLcStarBarCand < cutsPtDeltaMassCharmReso->get(1u, 11u)); + + if (activateQA) { + if (isGoodLcStar) { + if (isRightSignLcStar) { + hMassVsPtC[kNCharmParticles + 19]->Fill(ptCand, massDiffLcStarCand); + } else if (!isRightSignLcStar && keepAlsoWrongDmesProtonPairs) { + hMassVsPtC[kNCharmParticles + 20]->Fill(ptCand, massDiffLcStarBarCand); + } + } + if (isGoodLcStarBar) { + if (isRightSignLcStarBar) { + hMassVsPtC[kNCharmParticles + 19]->Fill(ptCand, massDiffLcStarCand); + } else if (!isRightSignLcStarBar && keepAlsoWrongDmesProtonPairs) { + hMassVsPtC[kNCharmParticles + 20]->Fill(ptCand, massDiffLcStarBarCand); + } + } + } + if ((isGoodLcStar && (isRightSignLcStar || keepAlsoWrongDmesProtonPairs)) || (isGoodLcStarBar && (isRightSignLcStarBar || keepAlsoWrongDmesProtonPairs))) { + keepEvent[kPrCharm2P] = true; + break; + } + } + } + } // end proton loop + } + } // end Lc resonances via D0-proton decays + } // end loop over 2-prong candidates std::vector> indicesDau3Prong{}; @@ -1663,7 +1806,7 @@ struct HfFilter { // Main struct for HF triggers } } - tags(keepEvent[kHighPt2P], keepEvent[kHighPt3P], keepEvent[kBeauty3P], keepEvent[kBeauty4P], keepEvent[kFemto2P], keepEvent[kFemto3P], keepEvent[kDoubleCharm2P], keepEvent[kDoubleCharm3P], keepEvent[kDoubleCharmMix], keepEvent[kV0Charm2P], keepEvent[kV0Charm3P], keepEvent[kCharmBarToXiBach], keepEvent[kSigmaCPPK], keepEvent[kSigmaC0K0], keepEvent[kPhotonCharm2P], keepEvent[kPhotonCharm3P], keepEvent[kSingleCharm2P], keepEvent[kSingleCharm3P], keepEvent[kSingleNonPromptCharm2P], keepEvent[kSingleNonPromptCharm3P], keepEvent[kCharmBarToXi2Bach], keepEvent[kBtoJPsiKa], keepEvent[kBtoJPsiKstar], keepEvent[kBtoJPsiPhi], keepEvent[kBtoJPsiPrKa], keepEvent[kBtoJPsiPi]); + tags(keepEvent[kHighPt2P], keepEvent[kHighPt3P], keepEvent[kBeauty3P], keepEvent[kBeauty4P], keepEvent[kFemto2P], keepEvent[kFemto3P], keepEvent[kDoubleCharm2P], keepEvent[kDoubleCharm3P], keepEvent[kDoubleCharmMix], keepEvent[kV0Charm2P], keepEvent[kV0Charm3P], keepEvent[kCharmBarToXiBach], keepEvent[kSigmaCPPK], keepEvent[kSigmaC0K0], keepEvent[kPhotonCharm2P], keepEvent[kPhotonCharm3P], keepEvent[kSingleCharm2P], keepEvent[kSingleCharm3P], keepEvent[kSingleNonPromptCharm2P], keepEvent[kSingleNonPromptCharm3P], keepEvent[kCharmBarToXi2Bach], keepEvent[kPrCharm2P], keepEvent[kBtoJPsiKa], keepEvent[kBtoJPsiKstar], keepEvent[kBtoJPsiPhi], keepEvent[kBtoJPsiPrKa], keepEvent[kBtoJPsiPi]); if (!std::accumulate(keepEvent, keepEvent + kNtriggersHF, 0)) { hProcessedEvents->Fill(1); diff --git a/EventFiltering/PWGHF/HFFilterHelpers.h b/EventFiltering/PWGHF/HFFilterHelpers.h index a44cc11ea17..04050908016 100644 --- a/EventFiltering/PWGHF/HFFilterHelpers.h +++ b/EventFiltering/PWGHF/HFFilterHelpers.h @@ -18,6 +18,7 @@ /// \author Alexandre Bigot , Strasbourg University /// \author Biao Zhang , CCNU /// \author Federica Zanone , Heidelberg University +/// \author Antonio Palasciano , INFN Bari #ifndef EVENTFILTERING_PWGHF_HFFILTERHELPERS_H_ #define EVENTFILTERING_PWGHF_HFFILTERHELPERS_H_ @@ -82,6 +83,7 @@ enum HfTriggers { kSingleNonPromptCharm2P, kSingleNonPromptCharm3P, kCharmBarToXi2Bach, + kPrCharm2P, kBtoJPsiKa, kBtoJPsiKstar, kBtoJPsiPhi, @@ -233,7 +235,7 @@ static const int nTotBeautyParts = static_cast(kNBeautyParticles) + static_ static const std::array beautyParticleNames{"Bplus", "B0toDStar", "B0", "Bs", "Lb", "Xib", "BplusToJPsi", "B0ToJPsi", "BsToJPsi", "LbToJPsi", "BcToJPsi"}; static const std::array pdgCodesCharm{421, 411, 431, 4122, 4232}; static const std::array eventTitles = {"all", "rejected"}; -static const std::vector hfTriggerNames{filtering::HfHighPt2P::columnLabel(), filtering::HfHighPt3P::columnLabel(), filtering::HfBeauty3P::columnLabel(), filtering::HfBeauty4P::columnLabel(), filtering::HfFemto2P::columnLabel(), filtering::HfFemto3P::columnLabel(), filtering::HfDoubleCharm2P::columnLabel(), filtering::HfDoubleCharm3P::columnLabel(), filtering::HfDoubleCharmMix::columnLabel(), filtering::HfV0Charm2P::columnLabel(), filtering::HfV0Charm3P::columnLabel(), filtering::HfCharmBarToXiBach::columnLabel(), filtering::HfSigmaCPPK::columnLabel(), filtering::HfSigmaC0K0::columnLabel(), filtering::HfPhotonCharm2P::columnLabel(), filtering::HfPhotonCharm3P::columnLabel(), filtering::HfSingleCharm2P::columnLabel(), filtering::HfSingleCharm3P::columnLabel(), filtering::HfSingleNonPromptCharm2P::columnLabel(), filtering::HfSingleNonPromptCharm3P::columnLabel(), filtering::HfCharmBarToXi2Bach::columnLabel(), filtering::HfBtoJPsiKa::columnLabel(), filtering::HfBtoJPsiKstar::columnLabel(), filtering::HfBtoJPsiPhi::columnLabel(), filtering::HfBtoJPsiPrKa::columnLabel(), filtering::HfBtoJPsiPi::columnLabel()}; +static const std::vector hfTriggerNames{filtering::HfHighPt2P::columnLabel(), filtering::HfHighPt3P::columnLabel(), filtering::HfBeauty3P::columnLabel(), filtering::HfBeauty4P::columnLabel(), filtering::HfFemto2P::columnLabel(), filtering::HfFemto3P::columnLabel(), filtering::HfDoubleCharm2P::columnLabel(), filtering::HfDoubleCharm3P::columnLabel(), filtering::HfDoubleCharmMix::columnLabel(), filtering::HfV0Charm2P::columnLabel(), filtering::HfV0Charm3P::columnLabel(), filtering::HfCharmBarToXiBach::columnLabel(), filtering::HfSigmaCPPK::columnLabel(), filtering::HfSigmaC0K0::columnLabel(), filtering::HfPhotonCharm2P::columnLabel(), filtering::HfPhotonCharm3P::columnLabel(), filtering::HfSingleCharm2P::columnLabel(), filtering::HfSingleCharm3P::columnLabel(), filtering::HfSingleNonPromptCharm2P::columnLabel(), filtering::HfSingleNonPromptCharm3P::columnLabel(), filtering::HfCharmBarToXi2Bach::columnLabel(), filtering::HfPrCharm2P::columnLabel(), filtering::HfBtoJPsiKa::columnLabel(), filtering::HfBtoJPsiKstar::columnLabel(), filtering::HfBtoJPsiPhi::columnLabel(), filtering::HfBtoJPsiPrKa::columnLabel(), filtering::HfBtoJPsiPi::columnLabel()}; static const std::array v0Labels{"#gamma", "K_{S}^{0}", "#Lambda", "#bar{#Lambda}"}; static const std::array v0Names{"Photon", "K0S", "Lambda", "AntiLambda"}; @@ -281,7 +283,7 @@ static const o2::framework::AxisSpec alphaAxis{100, -1.f, 1.f}; static const o2::framework::AxisSpec qtAxis{100, 0.f, 0.25f}; static const o2::framework::AxisSpec bdtAxis{100, 0.f, 1.f}; static const o2::framework::AxisSpec phiAxis{36, 0., o2::constants::math::TwoPI}; -static const std::array massAxisC = {o2::framework::AxisSpec{250, 1.65f, 2.15f}, o2::framework::AxisSpec{250, 1.65f, 2.15f}, o2::framework::AxisSpec{250, 1.75f, 2.25f}, o2::framework::AxisSpec{250, 2.05f, 2.55f}, o2::framework::AxisSpec{250, 2.25f, 2.75f}, o2::framework::AxisSpec{200, 0.139f, 0.159f}, o2::framework::AxisSpec{250, 0.f, 0.25f}, o2::framework::AxisSpec{250, 0.f, 0.25f}, o2::framework::AxisSpec{200, 0.48f, 0.88f}, o2::framework::AxisSpec{200, 0.48f, 0.88f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{170, 0.13f, 0.3f}, o2::framework::AxisSpec{170, 0.13f, 0.3f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{350, 2.3f, 3.0f}, o2::framework::AxisSpec{350, 2.3f, 3.0f}, o2::framework::AxisSpec{350, 2.3f, 3.0f}, o2::framework::AxisSpec{240, 2.4f, 3.6f}}; +static const std::array massAxisC = {o2::framework::AxisSpec{250, 1.65f, 2.15f}, o2::framework::AxisSpec{250, 1.65f, 2.15f}, o2::framework::AxisSpec{250, 1.75f, 2.25f}, o2::framework::AxisSpec{250, 2.05f, 2.55f}, o2::framework::AxisSpec{250, 2.25f, 2.75f}, o2::framework::AxisSpec{200, 0.139f, 0.159f}, o2::framework::AxisSpec{250, 0.f, 0.25f}, o2::framework::AxisSpec{250, 0.f, 0.25f}, o2::framework::AxisSpec{200, 0.48f, 0.88f}, o2::framework::AxisSpec{200, 0.48f, 0.88f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{170, 0.13f, 0.3f}, o2::framework::AxisSpec{170, 0.13f, 0.3f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{350, 2.3f, 3.0f}, o2::framework::AxisSpec{350, 2.3f, 3.0f}, o2::framework::AxisSpec{350, 2.3f, 3.0f}, o2::framework::AxisSpec{240, 2.4f, 3.6f}, o2::framework::AxisSpec{300, 0.7f, 1.3f}, o2::framework::AxisSpec{300, 0.7f, 1.3f}, o2::framework::AxisSpec{300, 0.7f, 1.3f}, o2::framework::AxisSpec{300, 0.7f, 1.3f}}; static const std::array massAxisB = {o2::framework::AxisSpec{240, 4.8f, 6.0f}, o2::framework::AxisSpec{240, 4.8f, 6.0f}, o2::framework::AxisSpec{240, 4.8f, 6.0f}, o2::framework::AxisSpec{240, 4.8f, 6.0f}, o2::framework::AxisSpec{240, 5.0f, 6.2f}, o2::framework::AxisSpec{240, 5.0f, 6.2f}, o2::framework::AxisSpec{240, 4.8f, 6.0f}, o2::framework::AxisSpec{240, 4.8f, 6.0f}, o2::framework::AxisSpec{240, 5.0f, 6.2f}, o2::framework::AxisSpec{240, 5.0f, 6.2f}, o2::framework::AxisSpec{240, 5.8f, 7.0f}}; // default values for configurables @@ -345,10 +347,10 @@ constexpr int activeDoubleCharmChannels[1][3] = {{1, 1, 1}}; // kDoubleCharm2P, static const std::vector labelsColumnsDoubleCharmChannels = {"DoubleCharm2Prong", "DoubleCharm3Prong", "DoubleCharmMix"}; // charm resonances -constexpr float cutsCharmReso[3][11] = {{0.0, 0.0, 0.0, 0.0, 0.4, 0., 0.0, 0.00, 0.21, 0.21, 0.0}, - {0.155, 0.3, 0.3, 0.88, 0.88, 1.35, 0.18, 0.18, 0.25, 0.25, 0.8}, - {0.0, 0.0, 0.0, 0.0, 5.0, 0.0, 0.0, 6.0, 0.0, 6.0, 0.0}}; // D*+, D*0, Ds*0, Ds1+, Ds2*+, Xic*->D, SigmaC0, SigmaC++, SigmaC(2520)0, SigmaC(2520)++, Xic*->SigmaC -static const std::vector labelsColumnsDeltaMassCharmReso = {"DstarPlus", "DstarZero", "DsStarZero", "Ds1Plus", "Ds2StarPlus", "XicResoToD", "SigmaC0", "SigmaCPlusPlus", "SigmaC02520", "SigmaCPlusPlus2520", "XicResoToSigmaC"}; +constexpr float cutsCharmReso[3][13] = {{0.0, 0.0, 0.0, 0.0, 0.4, 0., 0.0, 0.00, 0.21, 0.21, 0.0, 0.7, 0.7}, + {0.155, 0.3, 0.3, 0.88, 0.88, 1.35, 0.18, 0.18, 0.25, 0.25, 0.8, 1.3, 1.3}, + {0.0, 0.0, 0.0, 0.0, 5.0, 0.0, 0.0, 6.0, 0.0, 6.0, 0.0, 0.0, 0.0}}; // D*+, D*0, Ds*0, Ds1+, Ds2*+, Xic*->D, SigmaC0, SigmaC++, SigmaC(2520)0, SigmaC(2520)++, Xic*->SigmaC, Lc*->D0P, Lc*->D*+P +static const std::vector labelsColumnsDeltaMassCharmReso = {"DstarPlus", "DstarZero", "DsStarZero", "Ds1Plus", "Ds2StarPlus", "XicResoToD", "SigmaC0", "SigmaCPlusPlus", "SigmaC02520", "SigmaCPlusPlus2520", "XicResoToSigmaC", "LcResoToD0Pr", "ThetaC"}; static const std::vector labelsRowsDeltaMassCharmReso = {"deltaMassMin", "deltaMassMax", "ptMin"}; // V0s for charm resonances constexpr float cutsV0s[1][6] = {{0.85, 0.97, 0.5, 4., 0.02, 0.01}}; // cosPaGamma, cosPaK0sLambda, radiusK0sLambda, nSigmaPrLambda, deltaMassK0S, deltaMassLambda @@ -369,7 +371,7 @@ static constexpr double cutsTrackDummy[o2::analysis::hf_cuts_single_track::NBins o2::framework::LabeledArray cutsSingleTrackDummy{cutsTrackDummy[0], o2::analysis::hf_cuts_single_track::NBinsPtTrack, o2::analysis::hf_cuts_single_track::NCutVarsTrack, o2::analysis::hf_cuts_single_track::labelsPtTrack, o2::analysis::hf_cuts_single_track::labelsCutVarTrack}; // manual downscale factors for tests -constexpr double defDownscaleFactors[kNtriggersHF][1] = {{1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}}; // one for each trigger +constexpr double defDownscaleFactors[kNtriggersHF][1] = {{1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}, {1.1}}; // one for each trigger static const std::vector labelsDownscaleFactor = {"Downscale factor"}; // Main helper class @@ -593,6 +595,8 @@ class HfFilterHelper bool isSelectedCascade(const Casc& casc); template int8_t isSelectedBachelorForCharmBaryon(const T& track, const T2& dca); + template + bool isSelectedProton4CharmOrBeautyBaryons(const T& track); template int8_t isBDTSelected(const T& scores, const U& thresholdBDTScores); template @@ -632,8 +636,6 @@ class HfFilterHelper // selections template bool isSelectedKaon4Charm3ProngOrBeautyToJPsi(const T& track); - template - bool isSelectedProton4CharmOrBeautyBaryons(const T& track); // PID float getTPCSplineCalib(const float tpcPin, const float dEdx, const int& pidSpecies); diff --git a/EventFiltering/filterTables.h b/EventFiltering/filterTables.h index 2155e6528eb..bd06ab99a88 100644 --- a/EventFiltering/filterTables.h +++ b/EventFiltering/filterTables.h @@ -84,6 +84,7 @@ DECLARE_SOA_COLUMN(HfV0Charm2P, hasHfV0Charm2P, bool); DECLARE_SOA_COLUMN(HfV0Charm3P, hasHfV0Charm3P, bool); //! V0 with 3-prong charm hadron DECLARE_SOA_COLUMN(HfCharmBarToXiBach, hasHfCharmBarToXiBach, bool); //! Charm baryon to Xi + bachelor DECLARE_SOA_COLUMN(HfCharmBarToXi2Bach, hasHfCharmBarToXi2Bach, bool); //! Charm baryon to Xi + 2 bachelors +DECLARE_SOA_COLUMN(HfPrCharm2P, hasHfPrCharm2P, bool); //! Charm baryon to 2-prong + bachelors DECLARE_SOA_COLUMN(HfSigmaCPPK, hasHfSigmaCPPK, bool); //! SigmaC(2455)++K- and SigmaC(2520)++K- + c.c. DECLARE_SOA_COLUMN(HfSigmaC0K0, hasHfSigmaC0K0, bool); //! SigmaC(2455)0KS0 and SigmaC(2520)0KS0 DECLARE_SOA_COLUMN(HfPhotonCharm2P, hasHfPhotonCharm2P, bool); //! photon with 2-prong charm hadron @@ -241,6 +242,7 @@ DECLARE_SOA_TABLE(HfFilters, "AOD", "HfFilters", //! filtering::HfSingleNonPromptCharm2P, filtering::HfSingleNonPromptCharm3P, filtering::HfCharmBarToXi2Bach, + filtering::HfPrCharm2P, filtering::HfBtoJPsiKa, filtering::HfBtoJPsiKstar, filtering::HfBtoJPsiPhi, From 3f638ed08c5d6a2fa5e76600fb212fcb7f00f59e Mon Sep 17 00:00:00 2001 From: sashingo Date: Mon, 10 Mar 2025 22:53:53 +0900 Subject: [PATCH 0629/1650] [PWGHF] added minimum pT cut parameter for Zee mass calculation (#10423) --- PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx | 31 +++++++++-------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx b/PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx index b966b1a1c36..ceb92e5e61c 100644 --- a/PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx +++ b/PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx @@ -52,6 +52,7 @@ struct HfTaskElectronWeakBoson { Configurable dcaxyMax{"dcaxyMax", 2.0f, "mximum DCA xy"}; Configurable chi2ItsMax{"chi2ItsMax", 15.0f, "its chi2 cut"}; Configurable ptMin{"ptMin", 3.0f, "minimum pT cut"}; + Configurable ptZeeMin{"ptZeeMin", 20.0f, "minimum pT cut for Zee"}; Configurable chi2TpcMax{"chi2TpcMax", 4.0f, "tpc chi2 cut"}; Configurable nclItsMin{"nclItsMin", 2.0f, "its # of cluster cut"}; Configurable nclTpcMin{"nclTpcMin", 100.0f, "tpc # if cluster cut"}; @@ -162,8 +163,6 @@ struct HfTaskElectronWeakBoson { registry.add("hIsolationTrack", "Isolation Track", kTH2F, {{axisE}, {axisIsoTrack}}); registry.add("hInvMassZeeLs", "invariant mass for Z LS pair", kTH2F, {{axisPt}, {axisInvMassZ}}); registry.add("hInvMassZeeUls", "invariant mass for Z ULS pair", kTH2F, {{axisPt}, {axisInvMassZ}}); - registry.add("hInvMassDyLs", "invariant mass for DY LS pair", kTH2F, {{axisPt}, {axisInvMassDy}}); - registry.add("hInvMassDyUls", "invariant mass for DY ULS pair", kTH2F, {{axisPt}, {axisInvMassDy}}); } bool isIsolatedCluster(const o2::aod::EMCALCluster& cluster, const SelectedClusters& clusters) @@ -269,7 +268,7 @@ struct HfTaskElectronWeakBoson { float energyTrk = 0.0; - if (track.tpcNSigmaEl() > nsigTpcMinLose && track.tpcNSigmaEl() < nsigTpcMax) { + if (track.tpcNSigmaEl() > nsigTpcMinLose && track.tpcNSigmaEl() < nsigTpcMax && track.pt() > ptZeeMin) { selectedElectronsAss.emplace_back( track.pt(), track.eta(), @@ -351,14 +350,16 @@ struct HfTaskElectronWeakBoson { if (isIsolated) { registry.fill(HIST("hEopIsolation"), match.track_as().pt(), eop); - selectedElectronsIso.emplace_back( - match.track_as().pt(), - match.track_as().eta(), - match.track_as().phi(), - energyEmc, - match.track_as().sign()); - } + if (match.track_as().pt() > ptZeeMin) { + selectedElectronsIso.emplace_back( + match.track_as().pt(), + match.track_as().eta(), + match.track_as().phi(), + energyEmc, + match.track_as().sign()); + } + } if (isIsolatedTr) { registry.fill(HIST("hEopIsolationTr"), match.track_as().pt(), eop); } @@ -377,7 +378,7 @@ struct HfTaskElectronWeakBoson { } // end of track loop // calculate inv. mass - if (selectedElectronsIso.size() > 1) { + if (selectedElectronsIso.size() > 0) { for (size_t i = 0; i < selectedElectronsIso.size(); i++) { const auto& e1 = selectedElectronsIso[i]; for (size_t j = 0; j < selectedElectronsAss.size(); j++) { @@ -390,14 +391,6 @@ struct HfTaskElectronWeakBoson { auto arr1 = RecoDecayPtEtaPhi::pVector(e1.pt, e1.eta, e1.phi); auto arr2 = RecoDecayPtEtaPhi::pVector(e2.pt, e2.eta, e2.phi); double mass = RecoDecay::m(std::array{arr1, arr2}, std::array{o2::constants::physics::MassElectron, o2::constants::physics::MassElectron}); - if (e1.sign() * e2.sign() > 0) { - registry.fill(HIST("hInvMassDyLs"), ptIso, mass); - } else { - registry.fill(HIST("hInvMassDyUls"), ptIso, mass); - } - - if (ptAss < 20.0 && ptIso < 20.0) - continue; if (e1.sign() * e2.sign() > 0) { registry.fill(HIST("hInvMassZeeLs"), ptIso, mass); From 163620b050efc378b2f84bb07b154b508ddea303 Mon Sep 17 00:00:00 2001 From: Steffimro <63045530+Steffimro@users.noreply.github.com> Date: Mon, 10 Mar 2025 15:52:36 +0100 Subject: [PATCH 0630/1650] PWGJE/mcGeneratorStudies: Added charged particle only selection (#10365) Co-authored-by: Stefanie Mrozinski --- PWGJE/Tasks/mcGeneratorStudies.cxx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/PWGJE/Tasks/mcGeneratorStudies.cxx b/PWGJE/Tasks/mcGeneratorStudies.cxx index 4d4ca3ab2bd..bef48af81a8 100644 --- a/PWGJE/Tasks/mcGeneratorStudies.cxx +++ b/PWGJE/Tasks/mcGeneratorStudies.cxx @@ -27,6 +27,8 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/EventSelection.h" +#include "TDatabasePDG.h" + using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; @@ -40,6 +42,8 @@ struct MCGeneratorStudies { Configurable mVertexCut{"vertexCut", 10.f, "apply z-vertex cut with value in cm"}; Configurable mRapidityCut{"rapidityCut", 0.9f, "Maximum absolute rapidity of counted generated particles"}; Configurable mSelectedParticleCode{"particlePDGCode", 111, "PDG code of the particle to be investigated (0 for all)"}; + Configurable mSelectOnlyChargedParticles{"mSelectOnlyChargedParticles", false, "set true to only count charged particles"}; + Configurable mRequireGammaGammaDecay{"requireGammaGammaDecay", false, "Only count generated particles that decayed into two photons"}; Configurable mRequireEMCCellContent{"requireEMCCellContent", false, "Ask forEMCal cell content instead of the kTVXinEMC trigger"}; @@ -145,6 +149,8 @@ struct MCGeneratorStudies { for (auto& mcParticle : mcParticles_inColl) { if (mSelectedParticleCode != 0 && mcParticle.pdgCode() != mSelectedParticleCode) continue; + else if (mSelectOnlyChargedParticles && TDatabasePDG::Instance()->GetParticle(mcParticle.pdgCode())->Charge()) + continue; if (fabs(mcParticle.y()) > mRapidityCut) continue; if (!mcParticle.isPhysicalPrimary() && !mcParticle.producedByGenerator()) @@ -170,6 +176,8 @@ struct MCGeneratorStudies { for (auto& mcParticle : mcParticles_inColl) { if (mSelectedParticleCode != 0 && mcParticle.pdgCode() != mSelectedParticleCode) continue; + else if (mSelectOnlyChargedParticles && TDatabasePDG::Instance()->GetParticle(mcParticle.pdgCode())->Charge()) + continue; if (fabs(mcParticle.y()) > mRapidityCut) continue; if (!mcParticle.isPhysicalPrimary() && !mcParticle.producedByGenerator()) From cd868223a757e742e1900b9dcc8e2208d96c8750 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Mon, 10 Mar 2025 15:57:48 +0100 Subject: [PATCH 0631/1650] Improve O2 linter (#10097) Co-authored-by: ALICE Builder --- Scripts/o2_linter.py | 76 ++++++++++++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 28 deletions(-) diff --git a/Scripts/o2_linter.py b/Scripts/o2_linter.py index f88911d1ee9..dcf6ba82d1b 100644 --- a/Scripts/o2_linter.py +++ b/Scripts/o2_linter.py @@ -163,6 +163,7 @@ class TestSpec(ABC): suffixes: "list[str]" = [] # suffixes of files to test per_line = True # Test lines separately one by one. n_issues = 0 # issue counter + n_disabled = 0 # counter of disabled issues def file_matches(self, path: str) -> bool: """Test whether the path matches the pattern for files to test.""" @@ -175,7 +176,10 @@ def is_disabled(self, line: str, prefix_comment="//") -> bool: return False line = line[(line.index(prefix) + len(prefix)) :] # Strip away part before prefix. if self.name in line: - return True + self.n_disabled += 1 + # Look for a comment with a reason for disabling. + if re.search(r" \([\w\s]{3,}\)", line): + return True return False def test_line(self, line: str) -> bool: @@ -225,7 +229,7 @@ class TestIOStream(TestSpec): """Detect included iostream.""" name = "include-iostream" - message = "Including iostream is discouraged. Use O2 logging instead." + message = "Do not include iostream. Use O2 logging instead." suffixes = [".h", ".cxx"] def test_line(self, line: str) -> bool: @@ -238,7 +242,7 @@ class TestUsingStd(TestSpec): """Detect importing names from the std namespace.""" name = "import-std-name" - message = "Importing names from the std namespace is not allowed in headers." + message = "Do not import names from the std namespace in headers." suffixes = [".h"] def test_line(self, line: str) -> bool: @@ -251,7 +255,7 @@ class TestUsingDirectives(TestSpec): """Detect using directives in headers.""" name = "using-directive" - message = "Using directives are not allowed in headers." + message = "Do not put using directives at global scope in headers." suffixes = [".h"] def test_line(self, line: str) -> bool: @@ -308,7 +312,7 @@ class TestROOT(TestSpec): """Detect unnecessary use of ROOT entities.""" name = "root-entity" - message = "Consider replacing ROOT entities with equivalents from standard C++ or from O2." + message = "Replace ROOT entities with equivalents from standard C++ or from O2." suffixes = [".h", ".cxx"] def file_matches(self, path: str) -> bool: @@ -329,14 +333,14 @@ class TestPi(TestSpec): """Detect use of external pi.""" name = "external-pi" - message = "Consider using the PI constant (and its multiples and fractions) defined in o2::constants::math." + message = "Use the PI constant (and its multiples and fractions) defined in o2::constants::math." suffixes = [".h", ".cxx"] def file_matches(self, path: str) -> bool: return super().file_matches(path) and "Macros/" not in path def test_line(self, line: str) -> bool: - pattern = r"M_PI|TMath::(Two)?Pi" + pattern = r"[^\w]M_PI|TMath::(Two)?Pi" if is_comment_cpp(line): return True line = remove_comment_cpp(line) @@ -347,7 +351,7 @@ class TestTwoPiAddSubtract(TestSpec): """Detect adding/subtracting of 2 pi.""" name = "two-pi-add-subtract" - message = "Consider using RecoDecay::constrainAngle to restrict angle to a given range." + message = "Use RecoDecay::constrainAngle to restrict angle to a given range." suffixes = [".h", ".cxx"] def test_line(self, line: str) -> bool: @@ -366,14 +370,14 @@ class TestPiMultipleFraction(TestSpec): """Detect multiples/fractions of pi for existing equivalent constants.""" name = "pi-multiple-fraction" - message = "Consider using multiples/fractions of PI defined in o2::constants::math." + message = "Use multiples/fractions of PI defined in o2::constants::math." suffixes = [".h", ".cxx"] def test_line(self, line: str) -> bool: pattern_pi = r"(M_PI|TMath::(Two)?Pi\(\)|(((o2::)?constants::)?math::)?(Two)?PI)" pattern_multiple = r"(2(\.0*f?)?|0\.2?5f?) \* " # * 2, 0.25, 0.5 pattern_fraction = r" / ((2|3|4)([ ,;\)]|\.0*f?))" # / 2, 3, 4 - pattern = rf"{pattern_multiple}{pattern_pi}|{pattern_pi}{pattern_fraction}" + pattern = rf"{pattern_multiple}{pattern_pi}[^\w]|{pattern_pi}{pattern_fraction}" if is_comment_cpp(line): return True line = remove_comment_cpp(line) @@ -385,8 +389,8 @@ class TestPdgDatabase(TestSpec): name = "pdg/database" message = ( - "Direct use of TDatabasePDG is not allowed. " - "Use o2::constants::physics::Mass... or Service." + "Do not use TDatabasePDG directly. " + "Use o2::constants::physics::Mass... or Service instead." ) suffixes = [".h", ".cxx"] @@ -413,7 +417,7 @@ def test_line(self, line: str) -> bool: line = remove_comment_cpp(line) if re.search(r"->(GetParticle|Mass)\([+-]?[0-9]+\)", line): return False - match = re.search(r"[Pp][Dd][Gg][\w]* ={1,2} [+-]?([0-9]+);", line) + match = re.search(r"[Pp][Dd][Gg].* !?={1,2} [+-]?([0-9]+)", line) if match: code = match.group(1) if code not in ("0", "1", "999"): @@ -425,9 +429,7 @@ class TestPdgMass(TestSpec): """Detect unnecessary call of Mass() for a known PDG code.""" name = "pdg/known-mass" - message = ( - "Consider using o2::constants::physics::Mass... instead of calling a database method for a known PDG code." - ) + message = "Use o2::constants::physics::Mass... instead of calling a database method for a known PDG code." suffixes = [".h", ".cxx", ".C"] def test_line(self, line: str) -> bool: @@ -446,7 +448,7 @@ class TestLogging(TestSpec): """Detect non-O2 logging.""" name = "logging" - message = "Consider using O2 logging (LOG, LOGF, LOGP)." + message = "Use O2 logging (LOG, LOGF, LOGP)." suffixes = [".h", ".cxx"] def file_matches(self, path: str) -> bool: @@ -694,6 +696,8 @@ def test_line(self, line: str) -> bool: "namespace", "struct", "class", + "explicit", + "concept", ): return True if len(words) > 2 and words[1] in ("typename", "class", "struct"): @@ -792,6 +796,8 @@ def test_line(self, line: str) -> bool: constant_name = constant_name[: constant_name.index("[")] if "::" in constant_name: # Remove the class prefix for methods. constant_name = constant_name.split("::")[-1] + if "#" in constant_name: # Remove "#" for strings in macros. + constant_name = constant_name[: constant_name.index("#")] # The actual test comes here. if constant_name.startswith("k") and len(constant_name) > 1: # exception for special constants constant_name = constant_name[1:] # test the name without "k" @@ -822,6 +828,10 @@ def test_line(self, line: str) -> bool: # return True if column_type_name[0] == "_": # probably a macro variable return True + if "#" in column_type_name: # Remove "#" for strings in macros. + column_type_name = column_type_name[: column_type_name.index("#")] + if "#" in column_getter_name: # Remove "#" for strings in macros. + column_getter_name = column_getter_name[: column_getter_name.index("#")] # The actual test comes here. if not is_upper_camel_case(column_type_name): return False @@ -858,6 +868,8 @@ def test_line(self, line: str) -> bool: # print(f"Got versioned table \"{table_type_name}\", version {table_version}") if table_type_name[0] == "_": # probably a macro variable return True + if "#" in table_type_name: # Remove "#" for strings in macros. + table_type_name = table_type_name[: table_type_name.index("#")] # The actual test comes here. return is_upper_camel_case(table_type_name) @@ -888,16 +900,16 @@ class TestNameType(TestSpec): """Test names of defined types.""" name = "name/type" - message = "Use UpperCamelCase for names of defined types." + message = "Use UpperCamelCase for names of defined types (including concepts)." suffixes = [".h", ".cxx", ".C"] def test_line(self, line: str) -> bool: if is_comment_cpp(line): return True - if not (match := re.match(r"using (\w+) = ", line)): + if not (match := re.match(r"(using|concept) (\w+) = ", line)): return True # Extract type name. - type_name = match.group(1) + type_name = match.group(2) # The actual test comes here. return is_upper_camel_case(type_name) @@ -1193,8 +1205,13 @@ def file_matches(self, path: str) -> bool: def test_file(self, path: str, content) -> bool: file_name = os.path.basename(path).rstrip(".cxx") base_struct_name = f"{file_name[0].upper()}{file_name[1:]}" # expected base of struct names - if "PWGHF/" in path: - base_struct_name = "Hf" + base_struct_name + if match := re.search("PWG([A-Z]{2})/", path): + name_pwg = match.group(1) + prefix_pwg = name_pwg.capitalize() + if name_pwg in ("HF"): + base_struct_name = rf"{prefix_pwg}{base_struct_name}" # mandatory PWG prefix + else: + base_struct_name = rf"({prefix_pwg})?{base_struct_name}" # optional PWG prefix # print(f"For file {file_name} expecting to find {base_struct_name}.") struct_names = [] # actual struct names in the file for line in content: @@ -1204,13 +1221,13 @@ def test_file(self, path: str, content) -> bool: continue # Extract struct name. words = line.split() - if not words[1].isalnum(): # "struct : ..." + if not words[1].isidentifier(): # "struct : ..." continue struct_name = words[1] struct_names.append(struct_name) # print(f"Found structs: {struct_names}.") for struct_name in struct_names: - if struct_name.startswith(base_struct_name): + if re.match(base_struct_name, struct_name): return True return False @@ -1486,9 +1503,12 @@ def main(): # Report results per test. print("\nResults per test") len_max = max(len(name) for name in test_names) - print(f"test{' ' * (len_max - len('test'))}\tissues\tbad files") + print(f"test{' ' * (len_max - len('test'))}\tissues\tdisabled\tbad files") for test in tests: - print(f"{test.name}{' ' * (len_max - len(test.name))}\t{test.n_issues}\t{n_files_bad[test.name]}") + print( + f"{test.name}{' ' * (len_max - len(test.name))}\t{test.n_issues}\t{test.n_disabled}" + f"\t\t{n_files_bad[test.name]}" + ) # Report global result. title_result = "O2 linter result" @@ -1501,8 +1521,8 @@ def main(): else: msg_result = "Issues have been found." msg_disable = ( - f'You can disable a test for a line by adding a comment with "{prefix_disable}"' - " followed by the name of the test." + f'Exceptionally, you can disable a test for a line by adding a comment with "{prefix_disable}"' + " followed by the name of the test and parentheses with a reason for the exception." ) if github_mode: print(f"::error title={title_result}::{msg_result}") From 87a9319749f2ad66e965b5e07ea66d457612542e Mon Sep 17 00:00:00 2001 From: Ionut Cristian Arsene Date: Mon, 10 Mar 2025 16:09:25 +0100 Subject: [PATCH 0632/1650] [PWGDQ] Added option to reject collision splitting candidates (#10428) Co-authored-by: Ionut Cristian Arsene --- PWGDQ/Tasks/tableReader_withAssoc.cxx | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/PWGDQ/Tasks/tableReader_withAssoc.cxx b/PWGDQ/Tasks/tableReader_withAssoc.cxx index 694b4bf9073..5f7912211b2 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.cxx +++ b/PWGDQ/Tasks/tableReader_withAssoc.cxx @@ -218,9 +218,19 @@ struct AnalysisEventSelection { void init(o2::framework::InitContext& context) { - if (context.mOptions.get("processDummy")) { + bool isAnyProcessEnabled = context.mOptions.get("processSkimmed") || context.mOptions.get("processSkimmedWithZdc") || context.mOptions.get("processSkimmedWithMultExtra") || context.mOptions.get("processSkimmedWithMultExtraZdc"); + bool isDummyEnabled = context.mOptions.get("processDummy"); + + if (isDummyEnabled) { + if (isAnyProcessEnabled) { + LOG(fatal) << "You have enabled both the dummy process and at least one normal process function! Check your config!"; + } return; } + if (!isAnyProcessEnabled) { + return; + } + VarManager::SetDefaultVarNames(); fEventCut = new AnalysisCompositeCut(true); @@ -1129,6 +1139,7 @@ struct AnalysisSameEventPairing { Configurable track{"cfgTrackCuts", "jpsiO2MCdebugCuts2", "Comma separated list of barrel track cuts"}; Configurable muon{"cfgMuonCuts", "", "Comma separated list of muon cuts"}; Configurable pair{"cfgPairCuts", "", "Comma separated list of pair cuts"}; + Configurable event{"cfgRemoveCollSplittingCandidates", false, "If true, remove collision splitting candidates as determined by the event selection task upstream"}; // TODO: Add pair cuts via JSON } fConfigCuts; @@ -1190,8 +1201,7 @@ struct AnalysisSameEventPairing { void init(o2::framework::InitContext& context) { - - fEnableBarrelHistos = context.mOptions.get("processAllSkimmed") || context.mOptions.get("processBarrelOnlySkimmed") || context.mOptions.get("processBarrelOnlyWithCollSkimmed") || context.mOptions.get("processBarrelOnlySkimmedNoCov"); + fEnableBarrelHistos = context.mOptions.get("processAllSkimmed") || context.mOptions.get("processBarrelOnlySkimmed") || context.mOptions.get("processBarrelOnlyWithCollSkimmed") || context.mOptions.get("processBarrelOnlySkimmedNoCov") || context.mOptions.get("processBarrelOnlySkimmedNoCovWithMultExtra"); fEnableBarrelMixingHistos = context.mOptions.get("processMixingAllSkimmed") || context.mOptions.get("processMixingBarrelSkimmed"); fEnableMuonHistos = context.mOptions.get("processAllSkimmed") || context.mOptions.get("processMuonOnlySkimmed") || context.mOptions.get("processMuonOnlySkimmedMultExtra") || context.mOptions.get("processMixingMuonSkimmed"); fEnableMuonMixingHistos = context.mOptions.get("processMixingAllSkimmed") || context.mOptions.get("processMixingMuonSkimmed"); @@ -1531,6 +1541,9 @@ struct AnalysisSameEventPairing { if (!event.isEventSelected_bit(0)) { continue; } + if (fConfigCuts.event && event.isEventSelected_bit(2)) { + continue; + } uint8_t evSel = event.isEventSelected_raw(); // Reset the fValues array VarManager::ResetValues(0, VarManager::kNVars); @@ -1967,6 +1980,13 @@ struct AnalysisSameEventPairing { runSameEventPairing(events, trackAssocsPerCollision, barrelAssocs, barrelTracks); } + void processBarrelOnlySkimmedNoCovWithMultExtra(MyEventsMultExtraSelected const& events, + soa::Join const& barrelAssocs, + MyBarrelTracksWithAmbiguities const& barrelTracks) + { + runSameEventPairing(events, trackAssocsPerCollision, barrelAssocs, barrelTracks); + } + void processBarrelOnlyWithCollSkimmed(MyEventsVtxCovSelected const& events, soa::Join const& barrelAssocs, MyBarrelTracksWithCovWithAmbiguitiesWithColl const& barrelTracks) @@ -2015,6 +2035,7 @@ struct AnalysisSameEventPairing { PROCESS_SWITCH(AnalysisSameEventPairing, processBarrelOnlySkimmed, "Run barrel only pairing, with skimmed tracks", false); PROCESS_SWITCH(AnalysisSameEventPairing, processBarrelOnlyWithCollSkimmed, "Run barrel only pairing, with skimmed tracks and with collision information", false); PROCESS_SWITCH(AnalysisSameEventPairing, processBarrelOnlySkimmedNoCov, "Run barrel only pairing (no covariances), with skimmed tracks and with collision information", false); + PROCESS_SWITCH(AnalysisSameEventPairing, processBarrelOnlySkimmedNoCovWithMultExtra, "Run barrel only pairing (no covariances), with skimmed tracks, with collision information, with MultsExtra", false); PROCESS_SWITCH(AnalysisSameEventPairing, processMuonOnlySkimmed, "Run muon only pairing, with skimmed tracks", false); PROCESS_SWITCH(AnalysisSameEventPairing, processMuonOnlySkimmedMultExtra, "Run muon only pairing, with skimmed tracks", false); PROCESS_SWITCH(AnalysisSameEventPairing, processMixingAllSkimmed, "Run all types of mixed pairing, with skimmed tracks/muons", false); From b2473579090a5e7cc3e78506760ef91b9409b0e7 Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Mon, 10 Mar 2025 16:11:25 +0100 Subject: [PATCH 0633/1650] [Common] Improve warning message for estimator not available (#10426) Co-authored-by: ALICE Builder --- Common/TableProducer/centralityTable.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Common/TableProducer/centralityTable.cxx b/Common/TableProducer/centralityTable.cxx index 2d7fc92f1f9..a88944171f9 100644 --- a/Common/TableProducer/centralityTable.cxx +++ b/Common/TableProducer/centralityTable.cxx @@ -590,7 +590,7 @@ struct CentralityTable { estimator.mCalibrationStored = true; estimator.isSane(); } else { - LOGF(error, "Calibration information from %s for run %d not available", estimator.name.c_str(), bc.runNumber()); + LOGF(info, "Calibration information from %s for run %d not available, will fill this estimator with invalid values and continue (no crash).", estimator.name.c_str(), bc.runNumber()); } }; From f63ec73209c4a2c77a60ff4481236e604a61c53d Mon Sep 17 00:00:00 2001 From: Nicolas Strangmann <77485327+nstrangm@users.noreply.github.com> Date: Mon, 10 Mar 2025 16:23:25 +0100 Subject: [PATCH 0634/1650] [PWGEM/PhotonMeson,Trigger] Add Heavy Neutral Meson Software Trigger Task (#10421) Co-authored-by: Nicolas Strangmann Co-authored-by: ALICE Action Bot --- EventFiltering/CMakeLists.txt | 5 + .../PWGEM/HeavyNeutralMesonFilter.cxx | 181 ++++++++++++++++++ EventFiltering/cefpTask.cxx | 1 + EventFiltering/filterTables.h | 29 ++- .../TableProducer/skimmerGammaCalo.cxx | 58 ++++-- PWGEM/PhotonMeson/Utils/HNMUtilities.h | 175 +++++++++++++++++ 6 files changed, 425 insertions(+), 24 deletions(-) create mode 100644 EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx create mode 100644 PWGEM/PhotonMeson/Utils/HNMUtilities.h diff --git a/EventFiltering/CMakeLists.txt b/EventFiltering/CMakeLists.txt index 31cd58f40ed..af42d63b16c 100644 --- a/EventFiltering/CMakeLists.txt +++ b/EventFiltering/CMakeLists.txt @@ -102,6 +102,11 @@ o2physics_add_dpl_workflow(em-photon-filter-qc PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DetectorsBase O2Physics::PWGEMPhotonMesonCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(heavy-neutral-meson-filter + SOURCES PWGEM/HeavyNeutralMesonFilter.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2::EMCALBase O2::EMCALCalib O2Physics::AnalysisCore O2Physics::PWGEMPhotonMesonCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(lf-f1proton-filter SOURCES PWGLF/filterf1proton.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DetectorsBase diff --git a/EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx b/EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx new file mode 100644 index 00000000000..1446943c279 --- /dev/null +++ b/EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx @@ -0,0 +1,181 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// +/// \file HeavyNeutralMesonFilter.cxx +/// +/// \brief This code loops over collisions to filter events contaning heavy mesons (omega or eta') using EMCal clusters and V0s (PCM) +/// +/// \author Nicolas Strangmann (nicolas.strangmann@cern.ch) - Goethe University Frankfurt +/// + +#include + +#include "PWGEM/PhotonMeson/Utils/HNMUtilities.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::aod::pwgem::photonmeson; + +using MyBCs = soa::Join; +using MyCollisions = soa::Join; + +using SelectedTracks = soa::Filtered>; + +struct HeavyNeutralMesonFilter { + Produces tags; + + HistogramRegistry mHistManager{"HeavyNeutralMesonFilterHistograms", {}, OutputObjHandlingPolicy::QAObject}; + + Configurable cfgTrackMinPt{"cfgTrackMinPt", 0.1, "Minimum momentum of tracks (GeV/c)"}; + Configurable cfgHNMMassCorrection{"cfgHNMMassCorrection", 1, "Use GG PDG mass to correct HNM mass (0 = off, 1 = subDeltaPi0, 2 = subLambda)"}; + static constexpr float defaultMassWindows[2][4] = {{0., 0.4, 0.6, 1.}, {0.4, 0.8, 0.8, 1.2}}; + Configurable> massWindowOmega{"massWindowOmega", {defaultMassWindows[0], 4, {"pi0_min", "pi0_max", "omega_min", "omega_max"}}, "Mass window for selected omegas and their decay pi0"}; + Configurable> massWindowEtaPrime{"massWindowEtaPrime", {defaultMassWindows[1], 4, {"eta_min", "eta_max", "etaprime_min", "etaprime_max"}}, "Mass window for selected eta' and their decay eta"}; + + static constexpr float defaultMinPts[4] = {1.8, 1.8, 2.6, 2.6}; + Configurable> minHNMPts{"minHNMPts", {defaultMinPts, 4, {"PCM_omega", "PCM_etaprime", "EMC_omega", "EMC_etaprime"}}, "Minimum pT values for the trigger decisions (GeV/c)"}; + + Filter trackPtFilter = aod::track::pt > cfgTrackMinPt; + + std::vector vGGs; + std::vector vHNMs; + + bool colContainsPCMOmega, colContainsEMCOmega, colContainsPCMEtaPrime, colContainsEMCEtaPrime = false; + + emcal::Geometry* emcalGeom; + + void init(InitContext const&) + { + emcalGeom = emcal::Geometry::GetInstanceFromRunNumber(300000); + auto hCollisionCounter = mHistManager.add("Event/hCollisionCounter", "Number of collisions;;#bf{#it{N}_{Coll}}", HistType::kTH1F, {{6, -0.5, 5.5}}); + hCollisionCounter->GetXaxis()->SetBinLabel(1, "all"); + hCollisionCounter->GetXaxis()->SetBinLabel(2, "kTVXinEMC"); + hCollisionCounter->GetXaxis()->SetBinLabel(3, "PCM #omega"); + hCollisionCounter->GetXaxis()->SetBinLabel(4, "EMC #omega"); + hCollisionCounter->GetXaxis()->SetBinLabel(5, "PCM #eta'"); + hCollisionCounter->GetXaxis()->SetBinLabel(6, "EMC #eta'"); + + mHistManager.add("Event/nGGs", "Number of (selected) #gamma#gamma paris;#bf{#it{N}_{#gamma#gamma}};#bf{#it{N}_{#gamma#gamma}^{selected}}", HistType::kTH2F, {{51, -0.5, 50.5}, {51, -0.5, 50.5}}); + mHistManager.add("Event/nTracks", "Number of tracks;#bf{N_{tracks}};#bf{#it{N}_{Coll}}", HistType::kTH1F, {{51, -0.5, 50.5}}); + mHistManager.add("Event/nHeavyNeutralMesons", "Number of (selected) HNM candidates;#bf{#it{N}_{HNM}};#bf{#it{N}_{HNM}^{selected}}", HistType::kTH2F, {{51, -0.5, 50.5}, {51, -0.5, 50.5}}); + mHistManager.add("Event/nClustersVsV0s", "Number of clusters and V0s in the collision;#bf{#it{N}_{clusters}};#bf{#it{N}_{V0s}}", HistType::kTH2F, {{26, -0.5, 25.5}, {26, -0.5, 25.5}}); + + mHistManager.add("GG/invMassVsPt_PCM", "Invariant mass and pT of gg candidates;#bf{#it{M}_{#gamma#gamma}};#bf{#it{N}_{#gamma#gamma}}", HistType::kTH2F, {{400, 0., 0.8}, {250, 0., 25.}}); + mHistManager.add("GG/invMassVsPt_PCMEMC", "Invariant mass and pT of gg candidates;#bf{#it{M}_{#gamma#gamma}};#bf{#it{N}_{#gamma#gamma}}", HistType::kTH2F, {{400, 0., 0.8}, {250, 0., 25.}}); + mHistManager.add("GG/invMassVsPt_EMC", "Invariant mass and pT of gg candidates;#bf{#it{M}_{#gamma#gamma}};#bf{#it{N}_{#gamma#gamma}}", HistType::kTH2F, {{400, 0., 0.8}, {250, 0., 25.}}); + + mHistManager.add("HeavyNeutralMeson/invMassVsPt_PCM", "Invariant mass and pT of HNM candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{N}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{600, 0.6, 1.2}, {250, 0., 25.}}); + mHistManager.add("HeavyNeutralMeson/invMassVsPt_PCMEMC", "Invariant mass and pT of HNM candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{N}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{600, 0.6, 1.2}, {250, 0., 25.}}); + mHistManager.add("HeavyNeutralMeson/invMassVsPt_EMC", "Invariant mass and pT of HNM candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{N}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{600, 0.6, 1.2}, {250, 0., 25.}}); + } + + Preslice perCollision_pcm = aod::v0photonkf::collisionId; + Preslice perCollision_emc = aod::skimmedcluster::collisionId; + + void process(MyCollisions::iterator const& collision, MyBCs const&, aod::SkimEMCClusters const& clusters, aod::V0PhotonsKF const& v0s, SelectedTracks const& tracks) + { + mHistManager.fill(HIST("Event/hCollisionCounter"), 0.); + + if (collision.foundBC_as().alias_bit(kTVXinEMC)) + mHistManager.fill(HIST("Event/hCollisionCounter"), 1.); + + auto v0sInThisCollision = v0s.sliceBy(perCollision_pcm, collision.globalIndex()); + auto clustersInThisCollision = clusters.sliceBy(perCollision_emc, collision.globalIndex()); + + mHistManager.fill(HIST("Event/nClustersVsV0s"), clustersInThisCollision.size(), v0sInThisCollision.size()); + mHistManager.fill(HIST("Event/nTracks"), tracks.size()); + + colContainsPCMOmega = colContainsEMCOmega = colContainsPCMEtaPrime = colContainsEMCEtaPrime = false; + + hnmutilities::reconstructGGs(clustersInThisCollision, v0sInThisCollision, vGGs); + processGGs(vGGs); + hnmutilities::reconstructHeavyNeutralMesons(tracks, vGGs, vHNMs); + processHNMs(vHNMs); + + tags(colContainsPCMOmega, colContainsEMCOmega, colContainsPCMEtaPrime, colContainsEMCEtaPrime); + } + + /// \brief Loop over the GG candidates, fill the mass/pt histograms and set the isPi0/isEta flags based on the reconstructed mass + void processGGs(std::vector& vGGs) + { + int nGGsBeforeMassCuts = vGGs.size(); + for (unsigned int iGG = 0; iGG < vGGs.size(); iGG++) { + auto lightMeson = &vGGs.at(iGG); + + if (lightMeson->reconstructionType == photonpair::kPCMPCM) { + mHistManager.fill(HIST("GG/invMassVsPt_PCM"), lightMeson->m(), lightMeson->pT()); + } else if (lightMeson->reconstructionType == photonpair::kEMCEMC) { + mHistManager.fill(HIST("GG/invMassVsPt_EMC"), lightMeson->m(), lightMeson->pT()); + } else { + mHistManager.fill(HIST("GG/invMassVsPt_PCMEMC"), lightMeson->m(), lightMeson->pT()); + } + + if (lightMeson->m() > massWindowOmega->get("pi0_min") && lightMeson->m() < massWindowOmega->get("pi0_max")) { + lightMeson->isPi0 = true; + } else if (lightMeson->m() > massWindowEtaPrime->get("eta_min") && lightMeson->m() < massWindowEtaPrime->get("eta_max")) { + lightMeson->isEta = true; + } else { + vGGs.erase(vGGs.begin() + iGG); + iGG--; + } + } + mHistManager.fill(HIST("Event/nGGs"), nGGsBeforeMassCuts, vGGs.size()); + } + + /// \brief Loop over the heavy neutral meson candidates, fill the mass/pt histograms and set the trigger flags based on the reconstructed mass + void processHNMs(std::vector& vHNMs) + { + int nHNMsBeforeMassCuts = vHNMs.size(); + for (unsigned int iHNM = 0; iHNM < vHNMs.size(); iHNM++) { + auto heavyNeutralMeson = vHNMs.at(iHNM); + + float massHNM = heavyNeutralMeson.m(cfgHNMMassCorrection); + if (heavyNeutralMeson.gg->reconstructionType == photonpair::kPCMPCM) { + mHistManager.fill(HIST("HeavyNeutralMeson/invMassVsPt_PCM"), massHNM, heavyNeutralMeson.pT()); + } else if (heavyNeutralMeson.gg->reconstructionType == photonpair::kEMCEMC) { + mHistManager.fill(HIST("HeavyNeutralMeson/invMassVsPt_EMC"), massHNM, heavyNeutralMeson.pT()); + } else { + mHistManager.fill(HIST("HeavyNeutralMeson/invMassVsPt_PCMEMC"), massHNM, heavyNeutralMeson.pT()); + } + + if (heavyNeutralMeson.gg->isPi0 && massHNM > massWindowOmega->get("omega_min") && massHNM < massWindowOmega->get("omega_max")) { + if (heavyNeutralMeson.gg->reconstructionType == photonpair::kPCMPCM && heavyNeutralMeson.pT() > minHNMPts->get("PCM_omega")) + colContainsPCMOmega = true; + else if (heavyNeutralMeson.gg->reconstructionType == photonpair::kEMCEMC && heavyNeutralMeson.pT() > minHNMPts->get("EMC_omega")) + colContainsEMCOmega = true; + } else if (heavyNeutralMeson.gg->isEta && massHNM > massWindowEtaPrime->get("etaprime_min") && massHNM < massWindowEtaPrime->get("etaprime_max")) { + if (heavyNeutralMeson.gg->reconstructionType == photonpair::kPCMPCM && heavyNeutralMeson.pT() > minHNMPts->get("PCM_etaprime")) + colContainsPCMEtaPrime = true; + else if (heavyNeutralMeson.gg->reconstructionType == photonpair::kEMCEMC && heavyNeutralMeson.pT() > minHNMPts->get("EMC_etaprime")) + colContainsEMCEtaPrime = true; + } else { + vHNMs.erase(vHNMs.begin() + iHNM); + iHNM--; + } + } + mHistManager.fill(HIST("Event/nHeavyNeutralMesons"), nHNMsBeforeMassCuts, vHNMs.size()); + + if (colContainsPCMOmega) + mHistManager.fill(HIST("Event/hCollisionCounter"), 2.); + if (colContainsEMCOmega) + mHistManager.fill(HIST("Event/hCollisionCounter"), 3.); + if (colContainsPCMEtaPrime) + mHistManager.fill(HIST("Event/hCollisionCounter"), 4.); + if (colContainsEMCEtaPrime) + mHistManager.fill(HIST("Event/hCollisionCounter"), 5.); + } +}; + +WorkflowSpec defineDataProcessing(o2::framework::ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} diff --git a/EventFiltering/cefpTask.cxx b/EventFiltering/cefpTask.cxx index b5cfa90449a..56c75c2a047 100644 --- a/EventFiltering/cefpTask.cxx +++ b/EventFiltering/cefpTask.cxx @@ -227,6 +227,7 @@ struct centralEventFilterTask { FILTER_CONFIGURABLE(MultFilters); FILTER_CONFIGURABLE(FullJetFilters); FILTER_CONFIGURABLE(PhotonFilters); + FILTER_CONFIGURABLE(HeavyNeutralMesonFilters); void init(o2::framework::InitContext& initc) { diff --git a/EventFiltering/filterTables.h b/EventFiltering/filterTables.h index bd06ab99a88..eca0a1b4d5f 100644 --- a/EventFiltering/filterTables.h +++ b/EventFiltering/filterTables.h @@ -46,9 +46,9 @@ namespace o2::aod { namespace filtering { -DECLARE_SOA_COLUMN(H2, hasH2, bool); //! deuteron trigger for the helium normalisation (to be downscaled) -DECLARE_SOA_COLUMN(He, hasHe, bool); //! helium -DECLARE_SOA_COLUMN(H3L3Body, hasH3L3Body, bool); //! hypertriton 3body +DECLARE_SOA_COLUMN(H2, hasH2, bool); //! deuteron trigger for the helium normalisation (to be downscaled) +DECLARE_SOA_COLUMN(He, hasHe, bool); //! helium +DECLARE_SOA_COLUMN(H3L3Body, hasH3L3Body, bool); //! hypertriton 3body DECLARE_SOA_COLUMN(ITSextremeIonisation, hasITSextremeIonisation, bool); //! ITS extreme ionisation DECLARE_SOA_COLUMN(ITSmildIonisation, hasITSmildIonisation, bool); //! ITS mild ionisation (normalisation of the extreme ionisation), to be downscaled @@ -175,6 +175,12 @@ DECLARE_SOA_COLUMN(PCMHighPtPhoton, hasPCMHighPtPhoton, bool); //! PCM high pT p // DECLARE_SOA_COLUMN(PCMEtaDalitz, hasPCMEtaDalitz, bool); //! PCM eta -> ee gamma // DECLARE_SOA_COLUMN(PCMEtaGG, hasPCMEtaGG, bool); //! PCM eta -> ee gamma DECLARE_SOA_COLUMN(PCMandEE, hasPCMandEE, bool); //! PCM and ee + +// heavy meson filters +DECLARE_SOA_COLUMN(PCMOmegaMeson, hasPCMOmegaMeson, bool); //! Omega meson candidate (3pi) in the collision +DECLARE_SOA_COLUMN(EMCOmegaMeson, hasEMCOmegaMeson, bool); //! Omega meson candidate (3pi) in the collision +DECLARE_SOA_COLUMN(PCMEtaPrimeMeson, hasPCMEtaPrimeMeson, bool); //! Eta' meson candidate (3pi) in the collision +DECLARE_SOA_COLUMN(EMCEtaPrimeMeson, hasEMCEtaPrimeMeson, bool); //! Eta' meson candidate (3pi) in the collision } // namespace filtering namespace decision @@ -300,6 +306,13 @@ DECLARE_SOA_TABLE(PhotonFilters, "AOD", "PhotonFilters", //! using PhotonFilter = PhotonFilters::iterator; +// heavy mesons +DECLARE_SOA_TABLE(HeavyNeutralMesonFilters, "AOD", "HeavyNeutralMesonFilters", //! + filtering::PCMOmegaMeson, filtering::EMCOmegaMeson, + filtering::PCMEtaPrimeMeson, filtering::EMCEtaPrimeMeson); + +using HeavyNeutralMesonFilter = HeavyNeutralMesonFilters::iterator; + // cefp decision DECLARE_SOA_TABLE(CefpDecisions, "AOD", "CefpDecision", //! decision::BCId, decision::GlobalBCId, decision::EvSelBC, decision::CollisionTime, decision::CollisionTimeRes, decision::CefpTriggered0, decision::CefpTriggered1, decision::CefpSelected0, decision::CefpSelected1); @@ -311,11 +324,11 @@ DECLARE_SOA_TABLE(BCRanges, "AOD", "BCRanges", //! using BCRange = BCRanges::iterator; /// List of the available filters, the description of their tables and the name of the tasks -constexpr int NumberOfFilters{12}; -constexpr std::array AvailableFilters{"NucleiFilters", "DiffractionFilters", "DqFilters", "HfFilters", "CFFilters", "JetFilters", "JetHFFilters", "FullJetFilters", "StrangenessFilters", "MultFilters", "PhotonFilters", "F1ProtonFilters"}; -constexpr std::array FilterDescriptions{"NucleiFilters", "DiffFilters", "DqFilters", "HfFilters", "CFFilters", "JetFilters", "JetHFFilters", "FullJetFilters", "LFStrgFilters", "MultFilters", "PhotonFilters", "F1ProtonFilters"}; -constexpr std::array FilteringTaskNames{"o2-analysis-nuclei-filter", "o2-analysis-diffraction-filter", "o2-analysis-dq-filter-pp-with-association", "o2-analysis-hf-filter", "o2-analysis-cf-filter", "o2-analysis-je-filter", "o2-analysis-je-hf-filter", "o2-analysis-fje-filter", "o2-analysis-lf-strangeness-filter", "o2-analysis-mult-filter", "o2-analysis-em-photon-filter", "o2-analysis-lf-f1proton-filter"}; -constexpr o2::framework::pack FiltersPack; +constexpr int NumberOfFilters{13}; +constexpr std::array AvailableFilters{"NucleiFilters", "DiffractionFilters", "DqFilters", "HfFilters", "CFFilters", "JetFilters", "JetHFFilters", "FullJetFilters", "StrangenessFilters", "MultFilters", "PhotonFilters", "F1ProtonFilters", "HeavyNeutralMesonFilters"}; +constexpr std::array FilterDescriptions{"NucleiFilters", "DiffFilters", "DqFilters", "HfFilters", "CFFilters", "JetFilters", "JetHFFilters", "FullJetFilters", "LFStrgFilters", "MultFilters", "PhotonFilters", "F1ProtonFilters", "HNMesonFilters"}; +constexpr std::array FilteringTaskNames{"o2-analysis-nuclei-filter", "o2-analysis-diffraction-filter", "o2-analysis-dq-filter-pp-with-association", "o2-analysis-hf-filter", "o2-analysis-cf-filter", "o2-analysis-je-filter", "o2-analysis-je-hf-filter", "o2-analysis-fje-filter", "o2-analysis-lf-strangeness-filter", "o2-analysis-mult-filter", "o2-analysis-em-photon-filter", "o2-analysis-lf-f1proton-filter", "o2-analysis-heavy-meson-filter"}; +constexpr o2::framework::pack FiltersPack; static_assert(o2::framework::pack_size(FiltersPack) == NumberOfFilters); template diff --git a/PWGEM/PhotonMeson/TableProducer/skimmerGammaCalo.cxx b/PWGEM/PhotonMeson/TableProducer/skimmerGammaCalo.cxx index c7da3fa270f..701aa70e195 100644 --- a/PWGEM/PhotonMeson/TableProducer/skimmerGammaCalo.cxx +++ b/PWGEM/PhotonMeson/TableProducer/skimmerGammaCalo.cxx @@ -50,6 +50,7 @@ struct skimmerGammaCalo { Configurable minM02{"minM02", 0.0, "Minimum M02 for M02 cut"}; Configurable maxM02{"maxM02", 1.0, "Maximum M02 for M02 cut"}; Configurable minE{"minE", 0.5, "Minimum energy for energy cut"}; + Configurable> clusterDefinitions{"clusterDefinitions", {0, 1, 2, 10, 11, 12, 13, 20, 21, 22, 30, 40, 41, 42, 43, 44, 45}, "Cluster definitions to be accepted (e.g. 13 for kV3MostSplitLowSeed)"}; Configurable maxdEta{"maxdEta", 0.1, "Set a maximum difference in eta for tracks and cluster to still count as matched"}; Configurable maxdPhi{"maxdPhi", 0.1, "Set a maximum difference in phi for tracks and cluster to still count as matched"}; Configurable applyEveSel_at_skimming{"applyEveSel_at_skimming", false, "flag to apply minimal event selection at the skimming level"}; @@ -59,15 +60,23 @@ struct skimmerGammaCalo { void init(o2::framework::InitContext& initContext) { - historeg.add("hCaloClusterEIn", "hCaloClusterEIn", gHistoSpec_clusterE); - historeg.add("hCaloClusterEOut", "hCaloClusterEOut", gHistoSpec_clusterE); - historeg.add("hMTEtaPhi", "hMTEtaPhi", gHistoSpec_clusterTM_dEtadPhi); - auto hCaloClusterFilter = historeg.add("hCaloClusterFilter", "hCaloClusterFilter", kTH1I, {{5, 0, 5}}); + historeg.add("DefinitionIn", "Cluster definitions before cuts;#bf{Cluster definition};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{51, -0.5, 50.5}}); + historeg.add("DefinitionOut", "Cluster definitions after cuts;#bf{Cluster definition};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{51, -0.5, 50.5}}); + historeg.add("EIn", "Energy of clusters before cuts", gHistoSpec_clusterE); + historeg.add("EOut", "Energy of clusters after cuts", gHistoSpec_clusterE); + historeg.add("MTEtaPhi", "Eta phi of matched tracks", gHistoSpec_clusterTM_dEtadPhi); + historeg.add("M02In", "Shape of cluster before cuts;#bf{#it{M}_{02}};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{200, 0, 2}}); + historeg.add("M02Out", "Shape of cluster after cuts;#bf{#it{M}_{02}};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{200, 0, 2}}); + historeg.add("TimeIn", "Time of cluster before cuts;#bf{#it{t} (ns)};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{200, -100, 100}}); + historeg.add("TimeOut", "Time of cluster after cuts;#bf{#it{t} (ns)};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{200, -100, 100}}); + + auto hCaloClusterFilter = historeg.add("hCaloClusterFilter", "hCaloClusterFilter", kTH1I, {{6, 0, 6}}); hCaloClusterFilter->GetXaxis()->SetBinLabel(1, "in"); - hCaloClusterFilter->GetXaxis()->SetBinLabel(2, "E cut"); - hCaloClusterFilter->GetXaxis()->SetBinLabel(3, "time cut"); - hCaloClusterFilter->GetXaxis()->SetBinLabel(4, "M02 cut"); - hCaloClusterFilter->GetXaxis()->SetBinLabel(5, "out"); + hCaloClusterFilter->GetXaxis()->SetBinLabel(2, "Definition cut"); + hCaloClusterFilter->GetXaxis()->SetBinLabel(3, "E cut"); + hCaloClusterFilter->GetXaxis()->SetBinLabel(4, "time cut"); + hCaloClusterFilter->GetXaxis()->SetBinLabel(5, "M02 cut"); + hCaloClusterFilter->GetXaxis()->SetBinLabel(6, "out"); if (inherit_from_emevent_photon) { getTaskOptionValue(initContext, "create-emevent-photon", "applyEveSel_at_skimming", applyEveSel_at_skimming.value, true); // for EM users. @@ -84,24 +93,40 @@ struct skimmerGammaCalo { return; } for (const auto& emccluster : emcclusters) { - historeg.fill(HIST("hCaloClusterEIn"), emccluster.energy()); historeg.fill(HIST("hCaloClusterFilter"), 0); + historeg.fill(HIST("DefinitionIn"), emccluster.definition()); + historeg.fill(HIST("EIn"), emccluster.energy()); + historeg.fill(HIST("M02In"), emccluster.m02()); + historeg.fill(HIST("TimeIn"), emccluster.time()); + + // Definition cut + if (!(std::find(clusterDefinitions.value.begin(), clusterDefinitions.value.end(), emccluster.definition()) != clusterDefinitions.value.end())) { + historeg.fill(HIST("hCaloClusterFilter"), 1); + continue; + } + historeg.fill(HIST("EIn"), emccluster.energy()); // Energy cut if (emccluster.energy() < minE) { - historeg.fill(HIST("hCaloClusterFilter"), 1); + historeg.fill(HIST("hCaloClusterFilter"), 2); continue; } // timing cut if (emccluster.time() > maxTime || emccluster.time() < minTime) { - historeg.fill(HIST("hCaloClusterFilter"), 2); + historeg.fill(HIST("hCaloClusterFilter"), 3); continue; } // M02 cut if (emccluster.nCells() > 1 && (emccluster.m02() > maxM02 || emccluster.m02() < minM02)) { - historeg.fill(HIST("hCaloClusterFilter"), 3); + historeg.fill(HIST("hCaloClusterFilter"), 4); continue; } + historeg.fill(HIST("hCaloClusterFilter"), 5); + + historeg.fill(HIST("DefinitionOut"), emccluster.definition()); + historeg.fill(HIST("EOut"), emccluster.energy()); + historeg.fill(HIST("M02Out"), emccluster.m02()); + historeg.fill(HIST("TimeOut"), emccluster.time()); // Skimmed cell table auto groupedCells = emcclustercells.sliceBy(CellperCluster, emccluster.globalIndex()); @@ -125,7 +150,7 @@ struct skimmerGammaCalo { if (std::abs(emccluster.eta() - emcmatchedtrack.track_as().trackEtaEmcal()) >= maxdEta || std::abs(emccluster.phi() - emcmatchedtrack.track_as().trackPhiEmcal()) >= maxdPhi) { continue; } - historeg.fill(HIST("hMTEtaPhi"), emccluster.eta() - emcmatchedtrack.track_as().trackEtaEmcal(), emccluster.phi() - emcmatchedtrack.track_as().trackPhiEmcal()); + historeg.fill(HIST("MTEtaPhi"), emccluster.eta() - emcmatchedtrack.track_as().trackEtaEmcal(), emccluster.phi() - emcmatchedtrack.track_as().trackPhiEmcal()); vTrackIds.emplace_back(emcmatchedtrack.trackId()); vEta.emplace_back(emcmatchedtrack.track_as().trackEtaEmcal()); vPhi.emplace_back(emcmatchedtrack.track_as().trackPhiEmcal()); @@ -135,9 +160,6 @@ struct skimmerGammaCalo { emcmatchedtrack.track_as().p(), emcmatchedtrack.track_as().pt()); } - historeg.fill(HIST("hCaloClusterEOut"), emccluster.energy()); - historeg.fill(HIST("hCaloClusterFilter"), 4); - tableGammaEMCReco(emccluster.collisionId(), emccluster.definition(), emccluster.energy(), emccluster.eta(), emccluster.phi(), emccluster.m02(), emccluster.nCells(), emccluster.time(), emccluster.isExotic(), vEta, vPhi, vP, vPt); } @@ -149,6 +171,10 @@ struct skimmerGammaCalo { } for (const auto& emccluster : emcclusters) { + // Definition cut + if (!(std::find(clusterDefinitions.value.begin(), clusterDefinitions.value.end(), emccluster.definition()) != clusterDefinitions.value.end())) { + continue; + } // Energy cut if (emccluster.energy() < minE) { continue; diff --git a/PWGEM/PhotonMeson/Utils/HNMUtilities.h b/PWGEM/PhotonMeson/Utils/HNMUtilities.h new file mode 100644 index 00000000000..279b7a0b683 --- /dev/null +++ b/PWGEM/PhotonMeson/Utils/HNMUtilities.h @@ -0,0 +1,175 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// +/// \file HNMUtilities.h +/// +/// \brief This code provides helper functions for the reconstruction of heavy neutral mesons (omega and eta meson) via their three pion decay +/// +/// \author Nicolas Strangmann (nicolas.strangmann@cern.ch) - Goethe University Frankfurt +/// + +#ifndef PWGEM_PHOTONMESON_UTILS_HNMUTILITIES_H_ +#define PWGEM_PHOTONMESON_UTILS_HNMUTILITIES_H_ + +#include +#include +#include +#include "TVector3.h" + +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" +#include "Common/DataModel/EventSelection.h" +#include "EMCALBase/Geometry.h" +#include "PWGJE/DataModel/EMCALClusters.h" +#include "PWGEM/PhotonMeson/DataModel/gammaTables.h" +#include "PWGEM/PhotonMeson/Utils/PairUtilities.h" +#include "Common/Core/trackUtilities.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "EventFiltering/filterTables.h" + +using namespace o2::aod::pwgem::photonmeson; + +// -------> Struct to store photons from EMC clusters or V0s +namespace o2::aod::pwgem::photonmeson::hnmutilities +{ +struct Photon { + Photon(float px, float py, float pz, bool isFromConversion) : px(px), py(py), pz(pz), pt(std::sqrt(px * px + py * py)), isFromConversion(isFromConversion) + { + photon.SetPxPyPzE(px, py, pz, std::sqrt(px * px + py * py + pz * pz)); + } + + static Photon fromPxPyPz(float px, float py, float pz) + { + Photon photon(px, py, pz, true); + return photon; + } + + static Photon fromEtaPhiEnergy(float eta, float phi, float energy) + { + float theta = 2 * std::atan2(std::exp(-eta), 1); + float px = energy * std::sin(theta) * std::cos(phi); + float py = energy * std::sin(theta) * std::sin(phi); + float pz = energy * std::cos(theta); + Photon photon(px, py, pz, false); + return photon; + } + + ROOT::Math::PxPyPzEVector photon; + float px, py, pz, pt; + bool isFromConversion; +}; + +// -------> Struct to store gamma gamma pairs (pi0 or eta meson candidates) +struct GammaGammaPair { + GammaGammaPair(Photon p1, Photon p2) : p1(p1), p2(p2) + { + vGG = p1.photon + p2.photon; + } + Photon p1, p2; + ROOT::Math::PxPyPzEVector vGG; + + bool isPi0 = false; + bool isEta = false; + ushort reconstructionType; + void setReconstructionType(ushort type) { reconstructionType = type; } + + float m() const { return vGG.M(); } + float pT() const { return vGG.Pt(); } +}; + +// -------> Enum to specify how the heavy neutral meson mass should be corrected based on the PDG mass of its light neutral meson decay daughter +enum MassCorrectionType { + kNoHNMMassCorrection = 0, + kSubDeltaPi0 = 1, + kSubLambda = 2 +}; + +struct HeavyNeutralMeson { + HeavyNeutralMeson(GammaGammaPair* gg, float eTracks, float pxTracks, float pyTracks, float pzTracks) : gg(gg) + { + vHeavyNeutralMeson.SetPxPyPzE(gg->vGG.Px() + pxTracks, gg->vGG.Py() + pyTracks, gg->vGG.Pz() + pzTracks, gg->vGG.e() + eTracks); + } + + GammaGammaPair* gg = nullptr; + ROOT::Math::PxPyPzEVector vHeavyNeutralMeson; + + float m(int massCorrectionType) const + { + float massHNM = vHeavyNeutralMeson.M(); + switch (massCorrectionType) { + case kNoHNMMassCorrection: // No mass correction + break; + case kSubDeltaPi0: // Subtract the mass difference of the reconstructed light neutral meson mass to the PDG mass + massHNM -= gg->m(); + massHNM += (gg->isPi0 ? constants::physics::MassPi0 : 0.547862); + break; + case kSubLambda: // Subtract an opening angle dependent mass correction (see https://arxiv.org/abs/2502.19956 for details) + LOGF(warning, "SubLambdaMassCorrection not yet implemented!"); + break; + default: + LOGF(fatal, "Unknown mass correction type %d", massCorrectionType); + } + return massHNM; + } + float pT() const { return vHeavyNeutralMeson.Pt(); } +}; + +/// \brief Reconstruct light neutral mesons from EMC clusters and V0s and fill them into the vGGs vector +template +void reconstructGGs(C clusters, V v0s, std::vector& vGGs) +{ + std::vector vPhotons; + for (const auto& cluster : clusters) + vPhotons.push_back(Photon::fromEtaPhiEnergy(cluster.eta(), cluster.phi(), cluster.e())); + + for (const auto& v0 : v0s) + vPhotons.push_back(Photon::fromPxPyPz(v0.px(), v0.py(), v0.pz())); + + vGGs.clear(); + // loop over all photon combinations and build meson candidates + for (unsigned int ig1 = 0; ig1 < vPhotons.size(); ++ig1) { + for (unsigned int ig2 = ig1 + 1; ig2 < vPhotons.size(); ++ig2) { + GammaGammaPair lightMeson(vPhotons[ig1], vPhotons[ig2]); // build lightMeson from photons + if (vPhotons[ig1].isFromConversion && vPhotons[ig2].isFromConversion) + lightMeson.setReconstructionType(photonpair::kPCMPCM); + else if (!vPhotons[ig1].isFromConversion && !vPhotons[ig2].isFromConversion) + lightMeson.setReconstructionType(photonpair::kEMCEMC); + else + lightMeson.setReconstructionType(photonpair::kPCMEMC); + + vGGs.push_back(lightMeson); + } + } +} + +/// \brief Reconstruct heavy neutral mesons from tracks and GG candidates and fill them into the vHNMs vector +template +void reconstructHeavyNeutralMesons(Track const& tracks, std::vector& vGGs, std::vector& vHNMs) +{ + vHNMs.clear(); + for (const auto& posTrack : tracks) { + if (!posTrack.isGlobalTrack() || posTrack.sign() < 0) + continue; + for (const auto& negTrack : tracks) { + if (!negTrack.isGlobalTrack() || negTrack.sign() > 0) + continue; + for (size_t iGG = 0; iGG < vGGs.size(); iGG++) { + HeavyNeutralMeson heavyNeutralMeson(&vGGs.at(iGG), posTrack.energy(constants::physics::MassPiPlus) + negTrack.energy(constants::physics::MassPiMinus), posTrack.px() + negTrack.px(), posTrack.py() + negTrack.py(), posTrack.pz() + negTrack.pz()); + vHNMs.push_back(heavyNeutralMeson); + } + } + } +} + +} // namespace o2::aod::pwgem::photonmeson::hnmutilities + +#endif // PWGEM_PHOTONMESON_UTILS_HNMUTILITIES_H_ From a0c2761a81083a6568070c292e6303872a682be7 Mon Sep 17 00:00:00 2001 From: Joachim Carlo Kristian Bjerg Hansen <50103987+joachimckh@users.noreply.github.com> Date: Mon, 10 Mar 2025 17:36:44 +0100 Subject: [PATCH 0635/1650] [PWGJE] include centVariant1 variation and minor fix to background process (#10424) --- PWGJE/Tasks/jetSpectraEseTask.cxx | 45 +++++++++++++++++-------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/PWGJE/Tasks/jetSpectraEseTask.cxx b/PWGJE/Tasks/jetSpectraEseTask.cxx index 05a8d2f011f..0b720cdbb83 100644 --- a/PWGJE/Tasks/jetSpectraEseTask.cxx +++ b/PWGJE/Tasks/jetSpectraEseTask.cxx @@ -71,6 +71,7 @@ struct JetSpectraEseTask { Configurable leadingTrackPtCut{"leadingTrackPtCut", 5.0, "leading jet pT cut"}; Configurable jetAreaFractionMin{"jetAreaFractionMin", 0.56, "used to make a cut on the jet areas"}; Configurable fjetAreaCut{"fjetAreaCut", true, "Flag for jet area cut"}; + Configurable cfgCentVariant{"cfgCentVariant", false, "Flag for centrality variant 1"}; Configurable trackEtaMin{"trackEtaMin", -0.9, "minimum eta acceptance for tracks"}; Configurable trackEtaMax{"trackEtaMax", 0.9, "maximum eta acceptance for tracks"}; @@ -292,13 +293,14 @@ struct JetSpectraEseTask { return; registry.fill(HIST("hEventCounter"), counter++); - if (cfgEvSelOccupancy && !isOccupancyWithin(collision)) + if (cfgEvSelOccupancy && !isOccupancyAccepted(collision)) return; registry.fill(HIST("hEventCounter"), counter++); - if (cfgSelCentrality && !isCentralitySelected(collision.centrality())) + auto centrality = cfgCentVariant ? collision.centralityVariant1() : collision.centrality(); + if (cfgSelCentrality && !isCentralitySelected(centrality)) return; - registry.fill(HIST("hCentralitySel"), collision.centrality()); + registry.fill(HIST("hCentralitySel"), centrality); const auto psi{procEP(collision)}; const auto qPerc{collision.qPERCFT0C()}; @@ -317,8 +319,8 @@ struct JetSpectraEseTask { } registry.fill(HIST("hEventCounter"), counter++); - registry.fill(HIST("hRho"), collision.centrality(), collision.rho()); - registry.fill(HIST("hCentralityAnalyzed"), collision.centrality()); + registry.fill(HIST("hRho"), centrality, collision.rho()); + registry.fill(HIST("hCentralityAnalyzed"), centrality); for (auto const& jet : jets) { if (fjetAreaCut && !isJetAreaAccepted(jet)) continue; @@ -331,19 +333,19 @@ struct JetSpectraEseTask { registry.fill(HIST("hJetArea"), jet.area()); float dPhi{RecoDecay::constrainAngle(jet.phi() - psi.psi2, -o2::constants::math::PI)}; - registry.fill(HIST("hCentJetPtdPhiq2"), collision.centrality(), jet.pt() - (collision.rho() * jet.area()), dPhi, qPerc[0]); + registry.fill(HIST("hCentJetPtdPhiq2"), centrality, jet.pt() - (collision.rho() * jet.area()), dPhi, qPerc[0]); if (cfgrhoPhi) { auto rhoLocal = evalRho(rhoFit.get(), jetR, jet.phi(), collision.rho()); - registry.fill(HIST("hRhoPhi"), collision.centrality(), rhoLocal); - registry.fill(HIST("hCentJetPtdPhiq2RhoPhi"), collision.centrality(), jet.pt() - (rhoLocal * jet.area()), dPhi, qPerc[0]); - registry.fill(HIST("hCentPhi"), collision.centrality(), rhoFit->Eval(jet.phi())); - registry.fill(HIST("hdPhiRhoPhi"), dPhi, rhoFit->Eval(jet.phi())); + registry.fill(HIST("hRhoPhi"), centrality, rhoLocal); + registry.fill(HIST("hCentJetPtdPhiq2RhoPhi"), centrality, jet.pt() - (rhoLocal * jet.area()), dPhi, qPerc[0]); + registry.fill(HIST("hCentPhi"), centrality, rhoFit->Eval(jet.phi())); + registry.fill(HIST("hdPhiRhoPhi"), dPhi, rhoLocal); } } registry.fill(HIST("hEventCounter"), counter++); - if (collision.centrality() < 30 || collision.centrality() > 50) + if (centrality < 30 || centrality > 50) return; registry.fill(HIST("hEventCounter"), counter++); } @@ -357,7 +359,7 @@ struct JetSpectraEseTask { if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) return; - if (cfgEvSelOccupancy && !isOccupancyWithin(collision)) + if (cfgEvSelOccupancy && !isOccupancyAccepted(collision)) return; [[maybe_unused]] const auto psi{procEP(collision)}; @@ -442,7 +444,7 @@ struct JetSpectraEseTask { if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) return; registry.fill(HIST("hMCDetEventCounter"), counter++); - if (cfgEvSelOccupancy && !isOccupancyWithin(collision)) + if (cfgEvSelOccupancy && !isOccupancyAccepted(collision)) return; registry.fill(HIST("hMCDetEventCounter"), counter++); registry.fill(HIST("hDetCentralitySel"), collision.centrality()); @@ -487,7 +489,7 @@ struct JetSpectraEseTask { return; registry.fill(HIST("hMCDMatchedEventCounter"), secCount++); - if (cfgEvSelOccupancy && !isOccupancyWithin(collision)) + if (cfgEvSelOccupancy && !isOccupancyAccepted(collision)) return; registry.fill(HIST("hMCDMatchedEventCounter"), secCount++); @@ -656,7 +658,7 @@ struct JetSpectraEseTask { } template - bool isOccupancyWithin(const col& collision) + bool isOccupancyAccepted(const col& collision) { auto occupancy{collision.trackOccupancyInTimeRange()}; if (occupancy < cfgCutOccupancy->at(0) || occupancy > cfgCutOccupancy->at(1)) @@ -691,10 +693,12 @@ struct JetSpectraEseTask { int nTrk{0}; if (jets.size() > 0) { for (const auto& track : tracks) { - registry.fill(HIST("hTrackCounter"), 0.5); + if constexpr (fillHist) + registry.fill(HIST("hTrackCounter"), 0.5); if (jetderiveddatautilities::selectTrack(track, trackSelection) && (std::fabs(track.eta() - leadingJetEta) > jetR) && track.pt() >= 0.2 && track.pt() <= 5) { nTrk++; - registry.fill(HIST("hTrackCounter"), 1.5); + if constexpr (fillHist) + registry.fill(HIST("hTrackCounter"), 1.5); } } } @@ -705,9 +709,10 @@ struct JetSpectraEseTask { for (const auto& track : tracks) { if (jetderiveddatautilities::selectTrack(track, trackSelection) && (std::fabs(track.eta() - leadingJetEta) > jetR) && track.pt() >= 0.2 && track.pt() <= 5) { hPhiPt->Fill(track.phi(), track.pt()); - registry.fill(HIST("hTrackCounter"), 2.5); - if constexpr (fillHist) + if constexpr (fillHist) { + registry.fill(HIST("hTrackCounter"), 2.5); registry.fill(HIST("hPhiPtsum"), track.phi(), track.pt()); + } } } auto modulationFit = std::unique_ptr(new TF1("fit_rholoc", "[0] * (1. + 2. * ([1] * std::cos(2. * (x - [2])) + [3] * std::cos(3. * (x - [4]))))", 0, o2::constants::math::TwoPI)); @@ -769,7 +774,7 @@ struct JetSpectraEseTask { if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { return; } - if (cfgEvSelOccupancy && !isOccupancyWithin(collision)) + if (cfgEvSelOccupancy && !isOccupancyAccepted(collision)) return; const auto psi{procEP(collision)}; From 07ccf73238fb9687f6457a2488d6bc8096b3ec3d Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Tue, 11 Mar 2025 02:33:35 +0800 Subject: [PATCH 0636/1650] [PWGCF] fix mAcceptance pointer issue (#10422) --- PWGCF/Flow/Tasks/flowPbpbPikp.cxx | 46 +++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowPbpbPikp.cxx b/PWGCF/Flow/Tasks/flowPbpbPikp.cxx index f30622dacc5..1a0a137e1b8 100644 --- a/PWGCF/Flow/Tasks/flowPbpbPikp.cxx +++ b/PWGCF/Flow/Tasks/flowPbpbPikp.cxx @@ -133,6 +133,7 @@ struct FlowPbpbPikp { histos.add("hMult", "", {HistType::kTH1D, {{3000, 0.5, 3000.5}}}); histos.add("hCent", "", {HistType::kTH1D, {{90, 0, 90}}}); histos.add("hPhi", "", {HistType::kTH1D, {axisPhi}}); + histos.add("hPhiWeighted", "", {HistType::kTH1D, {axisPhi}}); histos.add("hEta", "", {HistType::kTH1D, {axisEta}}); histos.add("hPt", "", {HistType::kTH1D, {axisPt}}); histos.add("c22_gap08", "", {HistType::kTProfile, {axisMultiplicity}}); @@ -385,11 +386,35 @@ struct FlowPbpbPikp { uint64_t timestamp = bc.timestamp(); mAcceptance.clear(); mAcceptance.resize(kCount_OutputSpecies); - mAcceptance.push_back(ccdb->getForTimeStamp(cfgAcceptance.value + "_ref", timestamp)); - mAcceptance.push_back(ccdb->getForTimeStamp(cfgAcceptance.value + "_ch", timestamp)); - mAcceptance.push_back(ccdb->getForTimeStamp(cfgAcceptance.value + "_pi", timestamp)); - mAcceptance.push_back(ccdb->getForTimeStamp(cfgAcceptance.value + "_ka", timestamp)); - mAcceptance.push_back(ccdb->getForTimeStamp(cfgAcceptance.value + "_pr", timestamp)); + mAcceptance[hRef] = ccdb->getForTimeStamp(cfgAcceptance.value + "_ref", timestamp); + if (mAcceptance[hRef]) + LOGF(info, "Loaded acceptance weights from %s_ref (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hRef]); + else + LOGF(fatal, "Could not load acceptance weights from %s_ref (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hRef]); + + mAcceptance[hCharge] = ccdb->getForTimeStamp(cfgAcceptance.value + "_ch", timestamp); + if (mAcceptance[hCharge]) + LOGF(info, "Loaded acceptance weights from %s_ch (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hCharge]); + else + LOGF(fatal, "Could not load acceptance weights from %s_ch (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hCharge]); + + mAcceptance[hPion] = ccdb->getForTimeStamp(cfgAcceptance.value + "_pi", timestamp); + if (mAcceptance[hPion]) + LOGF(info, "Loaded acceptance weights from %s_pi (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hPion]); + else + LOGF(fatal, "Could not load acceptance weights from %s_pi (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hPion]); + + mAcceptance[hKaon] = ccdb->getForTimeStamp(cfgAcceptance.value + "_ka", timestamp); + if (mAcceptance[hKaon]) + LOGF(info, "Loaded acceptance weights from %s_ka (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hKaon]); + else + LOGF(fatal, "Could not load acceptance weights from %s_ka (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hKaon]); + + mAcceptance[hProton] = ccdb->getForTimeStamp(cfgAcceptance.value + "_pr", timestamp); + if (mAcceptance[hProton]) + LOGF(info, "Loaded acceptance weights from %s_pr (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hProton]); + else + LOGF(fatal, "Could not load acceptance weights from %s_pr (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hProton]); } correctionsLoaded = true; @@ -398,9 +423,17 @@ struct FlowPbpbPikp { template double getAcceptance(TTrack track, const double& vtxz, int index) { // 0 ref, 1 ch, 2 pi, 3 ka, 4 pr + if (index < 0 || index >= kCount_OutputSpecies) { + return 1; + } double wacc = 1; - if (!mAcceptance.empty()) + if (!mAcceptance.empty() && correctionsLoaded) { + if (!mAcceptance[index]) { + LOGF(fatal, "Acceptance weights not loaded for index %d", index); + return 1; + } wacc = mAcceptance[index]->getNUA(track.phi(), track.eta(), vtxz); + } return wacc; } @@ -495,6 +528,7 @@ struct FlowPbpbPikp { waccRef = waccPOI; // if particle is both (then it's overlap), override ref with POI if (withinPtRef) { + histos.fill(HIST("hPhiWeighted"), track.phi(), waccRef); fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), waccRef * weff, 1); fGFW->Fill(track.eta(), 1, track.phi(), waccRef * weff, 512); } From 8f1e261a5543acc761292af970ecfbc200da3cf9 Mon Sep 17 00:00:00 2001 From: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> Date: Mon, 10 Mar 2025 19:34:42 +0100 Subject: [PATCH 0637/1650] [PWGLF] Add Generator ID in strangeness data model (#10394) --- PWGLF/DataModel/LFStrangenessTables.h | 5 ++- .../Strangeness/Converters/CMakeLists.txt | 5 +++ .../Converters/stramccollisionconverter2.cxx | 44 +++++++++++++++++++ .../Strangeness/strangederivedbuilder.cxx | 2 +- .../derivedlambdakzeroanalysis.cxx | 2 +- 5 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 PWGLF/TableProducer/Strangeness/Converters/stramccollisionconverter2.cxx diff --git a/PWGLF/DataModel/LFStrangenessTables.h b/PWGLF/DataModel/LFStrangenessTables.h index bc7a4883fb8..2e99b4c7500 100644 --- a/PWGLF/DataModel/LFStrangenessTables.h +++ b/PWGLF/DataModel/LFStrangenessTables.h @@ -282,7 +282,10 @@ DECLARE_SOA_TABLE(StraMCCollisions_000, "AOD", "STRAMCCOLLISION", //! MC collisi DECLARE_SOA_TABLE_VERSIONED(StraMCCollisions_001, "AOD", "STRAMCCOLLISION", 1, //! debug information o2::soa::Index<>, mccollision::PosX, mccollision::PosY, mccollision::PosZ, mccollision::ImpactParameter, mccollision::EventPlaneAngle); -using StraMCCollisions = StraMCCollisions_001; +DECLARE_SOA_TABLE_VERSIONED(StraMCCollisions_002, "AOD", "STRAMCCOLLISION", 2, //! debug information + o2::soa::Index<>, mccollision::PosX, mccollision::PosY, mccollision::PosZ, + mccollision::ImpactParameter, mccollision::EventPlaneAngle, mccollision::GeneratorsID); +using StraMCCollisions = StraMCCollisions_002; using StraMCCollision = StraMCCollisions::iterator; DECLARE_SOA_TABLE(StraMCCollMults_000, "AOD", "STRAMCCOLLMULTS", //! MC collision multiplicities diff --git a/PWGLF/TableProducer/Strangeness/Converters/CMakeLists.txt b/PWGLF/TableProducer/Strangeness/Converters/CMakeLists.txt index 56325210aa1..146a1142982 100644 --- a/PWGLF/TableProducer/Strangeness/Converters/CMakeLists.txt +++ b/PWGLF/TableProducer/Strangeness/Converters/CMakeLists.txt @@ -103,3 +103,8 @@ o2physics_add_dpl_workflow(stramccollmultconverter SOURCES stramccollmultconverter.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(stramccollisionconverter2 + SOURCES stramccollisionconverter2.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) diff --git a/PWGLF/TableProducer/Strangeness/Converters/stramccollisionconverter2.cxx b/PWGLF/TableProducer/Strangeness/Converters/stramccollisionconverter2.cxx new file mode 100644 index 00000000000..c821c6fb5fe --- /dev/null +++ b/PWGLF/TableProducer/Strangeness/Converters/stramccollisionconverter2.cxx @@ -0,0 +1,44 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +// +// +/// \file stramccollisionconverter2.cxx +/// \brief Converter task to convert StraMCCollisions_001 --> StraMCCollisions_002 +/// +/// \author Romain Schotter , Austrian Academy of Sciences & SMI +// + +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" + +using namespace o2; +using namespace o2::framework; + +// Converts V0 version 001 to 002 +struct stramccollisionconverter2 { + Produces straMCCollisions_002; + + void process(aod::StraMCCollisions_001 const& straMCcoll) + { + for (auto& mccollision : straMCcoll) { + straMCCollisions_002(mccollision.posX(), mccollision.posY(), mccollision.posZ(), + mccollision.impactParameter(), mccollision.eventPlaneAngle(), 0); + } + } +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc)}; +} diff --git a/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx index 0f1e94963af..6b520b04e16 100644 --- a/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx @@ -592,7 +592,7 @@ struct strangederivedbuilder { } strangeMCColl(mccollision.posX(), mccollision.posY(), mccollision.posZ(), - mccollision.impactParameter(), mccollision.eventPlaneAngle()); + mccollision.impactParameter(), mccollision.eventPlaneAngle(), mccollision.getGeneratorId()); strangeMCMults(mccollision.multMCFT0A(), mccollision.multMCFT0C(), mccollision.multMCNParticlesEta05(), mccollision.multMCNParticlesEta08(), diff --git a/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx b/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx index c0a390162db..80c048e1214 100644 --- a/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx @@ -1811,7 +1811,7 @@ struct derivedlambdakzeroanalysis { } else { // we are in Pb-Pb float collisionOccupancy = eventSelections.useFT0CbasedOccupancy ? collision.ft0cOccupancyInTimeRange() : collision.trackOccupancyInTimeRange(); - if (eventSelections.minOccupancy >= 0 && collisionOccupancy <= eventSelections.minOccupancy) { + if (eventSelections.minOccupancy >= 0 && collisionOccupancy < eventSelections.minOccupancy) { return false; } if (fillHists) From e61171693a65b5d2e8b38886d216332cf9037715 Mon Sep 17 00:00:00 2001 From: Sierra Cantway <51177851+sweyh99@users.noreply.github.com> Date: Mon, 10 Mar 2025 15:40:54 -0400 Subject: [PATCH 0638/1650] [PWGJE] hybrid track cuts for Run2 converted data (#9680) Co-authored-by: ALICE Action Bot --- Common/Core/TrackSelection.cxx | 10 ++++++++- Common/Core/TrackSelection.h | 10 +++++++++ Common/Core/TrackSelectionDefaults.cxx | 23 +++++++++++++++++---- Common/Tools/trackSelectionRequest.cxx | 14 ++++++++++++- Common/Tools/trackSelectionRequest.h | 7 +++++++ PWGJE/TableProducer/derivedDataProducer.cxx | 15 ++++++++++++++ 6 files changed, 73 insertions(+), 6 deletions(-) diff --git a/Common/Core/TrackSelection.cxx b/Common/Core/TrackSelection.cxx index 4cc355b57ce..717d7db77f5 100644 --- a/Common/Core/TrackSelection.cxx +++ b/Common/Core/TrackSelection.cxx @@ -30,7 +30,7 @@ bool TrackSelection::FulfillsITSHitRequirements(uint8_t itsClusterMap) const return true; } -const std::string TrackSelection::mCutNames[static_cast(TrackSelection::TrackCuts::kNCuts)] = {"TrackType", "PtRange", "EtaRange", "TPCNCls", "TPCCrossedRows", "TPCCrossedRowsOverNCls", "TPCChi2NDF", "TPCRefit", "ITSNCls", "ITSChi2NDF", "ITSRefit", "ITSHits", "GoldenChi2", "DCAxy", "DCAz"}; +const std::string TrackSelection::mCutNames[static_cast(TrackSelection::TrackCuts::kNCuts)] = {"TrackType", "PtRange", "EtaRange", "TPCNCls", "TPCCrossedRows", "TPCCrossedRowsOverNCls", "TPCChi2NDF", "TPCRefit", "ITSNCls", "ITSChi2NDF", "ITSRefit", "ITSHits", "GoldenChi2", "DCAxy", "DCAz", "TPCFracSharedCls"}; void TrackSelection::SetTrackType(o2::aod::track::TrackTypeEnum trackType) { @@ -79,6 +79,11 @@ void TrackSelection::SetMinNCrossedRowsOverFindableClustersTPC(float minNCrossed mMinNCrossedRowsOverFindableClustersTPC = minNCrossedRowsOverFindableClustersTPC; LOG(info) << "Track selection, set min N crossed rows over findable clusters TPC: " << mMinNCrossedRowsOverFindableClustersTPC; } +void TrackSelection::SetMaxTPCFractionSharedCls(float maxTPCFractionSharedCls) +{ + mMaxTPCFractionSharedCls = maxTPCFractionSharedCls; + LOG(info) << "Track selection, set max fraction of shared clusters TPC: " << mMaxTPCFractionSharedCls; +} void TrackSelection::SetMinNClustersITS(int minNClustersITS) { mMinNClustersITS = minNClustersITS; @@ -175,6 +180,9 @@ void TrackSelection::print() const case TrackCuts::kDCAz: LOG(info) << mCutNames[i] << " < " << mMaxDcaZ; break; + case TrackCuts::kTPCFracSharedCls: + LOG(info) << mCutNames[i] << " < " << mMaxTPCFractionSharedCls; + break; default: LOG(fatal) << "Cut unknown!"; } diff --git a/Common/Core/TrackSelection.h b/Common/Core/TrackSelection.h index 351b662c48d..19d77a198e1 100644 --- a/Common/Core/TrackSelection.h +++ b/Common/Core/TrackSelection.h @@ -45,6 +45,7 @@ class TrackSelection kGoldenChi2, kDCAxy, kDCAz, + kTPCFracSharedCls, kNCuts }; @@ -114,6 +115,9 @@ class TrackSelection if (!IsSelected(track, TrackCuts::kDCAz)) { return false; } + if (!IsSelected(track, TrackCuts::kTPCFracSharedCls)) { + return false; + } return true; } @@ -144,6 +148,7 @@ class TrackSelection setFlag(TrackCuts::kGoldenChi2); setFlag(TrackCuts::kDCAxy); setFlag(TrackCuts::kDCAz); + setFlag(TrackCuts::kTPCFracSharedCls); return flag; } @@ -199,6 +204,8 @@ class TrackSelection case TrackCuts::kDCAz: return std::fabs(track.dcaZ()) <= mMaxDcaZ; + case TrackCuts::kTPCFracSharedCls: + return track.tpcFractionSharedCls() <= mMaxTPCFractionSharedCls; default: return false; @@ -225,6 +232,7 @@ class TrackSelection void SetRequireNoHitsInITSLayers(std::set excludedLayers); /// @brief Reset ITS requirements void ResetITSRequirements() { mRequiredITSHits.clear(); } + void SetMaxTPCFractionSharedCls(float maxTPCFractionSharedCls); /// @brief Print the track selection void print() const; @@ -250,6 +258,8 @@ class TrackSelection float mMaxDcaZ{1e10f}; // max dca in z direction std::function mMaxDcaXYPtDep{}; // max dca in xy plane as function of pT + float mMaxTPCFractionSharedCls{1e10f}; // max fraction of shared TPC clusters + bool mRequireITSRefit{false}; // require refit in ITS bool mRequireTPCRefit{false}; // require refit in TPC bool mRequireGoldenChi2{false}; // require golden chi2 cut (Run 2 only) diff --git a/Common/Core/TrackSelectionDefaults.cxx b/Common/Core/TrackSelectionDefaults.cxx index 1974b7df38f..2958718feba 100644 --- a/Common/Core/TrackSelectionDefaults.cxx +++ b/Common/Core/TrackSelectionDefaults.cxx @@ -120,12 +120,27 @@ TrackSelection getGlobalTrackSelectionRun3HF() // Reduced default track selection for jet validation based on hybrid cuts for converted (based on ESD's from run 2) A02D's TrackSelection getJEGlobalTrackSelectionRun2() { - TrackSelection selectedTracks = getGlobalTrackSelection(); - selectedTracks.SetPtRange(0.15f, 1e15f); - selectedTracks.SetRequireGoldenChi2(false); - selectedTracks.SetMaxDcaXYPtDep([](float /*pt*/) { return 1e+10; }); + TrackSelection selectedTracks; + + // These track selections are the same as the global track selections as of Jan 2025. Implemented seperately to prevent future + // global track selection changes from affecting the Run 2 hybrid track selections. + selectedTracks.SetTrackType(o2::aod::track::Run2Track); // Run 2 track asked by default + selectedTracks.SetRequireITSRefit(true); + selectedTracks.SetRequireTPCRefit(true); + selectedTracks.SetRequireGoldenChi2(true); + selectedTracks.SetMinNCrossedRowsTPC(70); + selectedTracks.SetMinNCrossedRowsOverFindableClustersTPC(0.8f); + selectedTracks.SetMaxChi2PerClusterTPC(4.f); + selectedTracks.SetMaxChi2PerClusterITS(36.f); + + // These track selections are different to the global track selections as of Jan 2025. + selectedTracks.SetPtRange(0.15f, 1000.f); selectedTracks.SetEtaRange(-0.9f, 0.9f); + selectedTracks.SetMaxDcaXYPtDep([](float /*pt*/) { return 1e+10; }); selectedTracks.SetMaxDcaXY(2.4f); selectedTracks.SetMaxDcaZ(3.2f); + selectedTracks.SetRequireHitsInITSLayers(0, {0, 1}); // no minimum required number of hits in any SPD layer + selectedTracks.SetMaxTPCFractionSharedCls(0.4f); // This cut machinery was added since it's used in hybrid tracks Run 2 + return selectedTracks; } diff --git a/Common/Tools/trackSelectionRequest.cxx b/Common/Tools/trackSelectionRequest.cxx index 088eafab508..ed82f1ff7bf 100644 --- a/Common/Tools/trackSelectionRequest.cxx +++ b/Common/Tools/trackSelectionRequest.cxx @@ -108,6 +108,14 @@ int trackSelectionRequest::getMinTPCCrossedRowsOverFindable() const { return minTPCcrossedrowsoverfindable; } +void trackSelectionRequest::setMaxTPCFractionSharedCls(float maxTPCFractionSharedCls_) +{ + maxTPCFractionSharedCls = maxTPCFractionSharedCls_; +} +int trackSelectionRequest::getMaxTPCFractionSharedCls() const +{ + return maxTPCFractionSharedCls; +} void trackSelectionRequest::setRequireITS(bool requireITS_) { requireITS = requireITS_; @@ -159,6 +167,8 @@ void trackSelectionRequest::CombineWithLogicalOR(trackSelectionRequest const& lT minTPCcrossedrows = lTraSelRe.getMinTPCCrossedRows(); if (lTraSelRe.getMinTPCCrossedRowsOverFindable() < minTPCcrossedrowsoverfindable) minTPCcrossedrowsoverfindable = lTraSelRe.getMinTPCCrossedRowsOverFindable(); + if (lTraSelRe.getMaxTPCFractionSharedCls() > maxTPCFractionSharedCls) + maxTPCFractionSharedCls = lTraSelRe.getMaxTPCFractionSharedCls(); if (lTraSelRe.getRequireITS() == false) requireITS = false; @@ -205,7 +215,9 @@ void trackSelectionRequest::PrintSelections() const LOGF(info, "Minimum TPC clusters ...................: %i", minTPCclusters); LOGF(info, "Minimum TPC crossed rows ...............: %i", minTPCcrossedrows); LOGF(info, "Minimum TPC crossed rows over findable .: %.3f", minTPCcrossedrowsoverfindable); + LOGF(info, "Max Fraction of TPC Shared Clusters ....: %.3f", maxTPCFractionSharedCls); + LOGF(info, "Require ITS ............................: %i", requireITS); LOGF(info, "Minimum ITS clusters ...................: %i", minITSclusters); LOGF(info, "Max ITS chi2/clu ......................: %.3f", maxITSChi2percluster); -} \ No newline at end of file +} diff --git a/Common/Tools/trackSelectionRequest.h b/Common/Tools/trackSelectionRequest.h index 00931491acf..123392611f0 100644 --- a/Common/Tools/trackSelectionRequest.h +++ b/Common/Tools/trackSelectionRequest.h @@ -60,6 +60,8 @@ class trackSelectionRequest int getMinTPCCrossedRows() const; void setMinTPCCrossedRowsOverFindable(float minTPCCrossedRowsOverFindable_); int getMinTPCCrossedRowsOverFindable() const; + void setMaxTPCFractionSharedCls(float maxTPCFractionSharedCls_); + int getMaxTPCFractionSharedCls() const; void setRequireITS(bool requireITS_); bool getRequireITS() const; @@ -97,6 +99,8 @@ class trackSelectionRequest return false; if (lTrack.tpcCrossedRowsOverFindableCls() < minTPCcrossedrowsoverfindable) return false; + if (lTrack.tpcFractionSharedCls() > maxTPCFractionSharedCls) + return false; if (lTrack.hasITS() == false && requireITS) return false; if (lTrack.itsNCls() < minITSclusters) @@ -117,6 +121,8 @@ class trackSelectionRequest return false; if (lTrack.tpcCrossedRowsOverFindableCls() < minTPCcrossedrowsoverfindable) return false; + if (lTrack.tpcFractionSharedCls() > maxTPCFractionSharedCls) + return false; if (lTrack.hasITS() == false && requireITS) return false; if (lTrack.itsNCls() < minITSclusters) @@ -146,6 +152,7 @@ class trackSelectionRequest int minTPCclusters; int minTPCcrossedrows; float minTPCcrossedrowsoverfindable; + float maxTPCFractionSharedCls; // ITS parameters (TracksExtra) bool requireITS; // in Run 3, equiv to hasITS int minITSclusters; diff --git a/PWGJE/TableProducer/derivedDataProducer.cxx b/PWGJE/TableProducer/derivedDataProducer.cxx index d94c0225d8f..a946d93b997 100644 --- a/PWGJE/TableProducer/derivedDataProducer.cxx +++ b/PWGJE/TableProducer/derivedDataProducer.cxx @@ -333,6 +333,21 @@ struct JetDerivedDataProducerTask { } PROCESS_SWITCH(JetDerivedDataProducerTask, processTracksWithCollisionAssociator, "produces derived track table taking into account track-to-collision associations", false); + void processTracksRun2(soa::Join::iterator const& track) + { + // TracksDCACov table is not yet available for Run 2 converted data. Remove this process function and use only processTracks when that becomes available. + products.jTracksTable(track.collisionId(), track.pt(), track.eta(), track.phi(), jetderiveddatautilities::setTrackSelectionBit(track, track.dcaZ(), dcaZMax)); + float sigmaDCAXYZ2 = 0.0; + float dcaXYZ = getDcaXYZ(track, &sigmaDCAXYZ2); + float dcaX = -99.0; + float dcaY = -99.0; + + products.jTracksExtraTable(dcaX, dcaY, track.dcaZ(), track.dcaXY(), dcaXYZ, std::sqrt(1.), std::sqrt(1.), std::sqrt(sigmaDCAXYZ2), track.sigma1Pt()); // dummy values - will be fixed when TracksDCACov table is available for Run 2 + products.jTracksParentIndexTable(track.globalIndex()); + trackCollisionMapping[{track.globalIndex(), track.collisionId()}] = products.jTracksTable.lastIndex(); + } + PROCESS_SWITCH(JetDerivedDataProducerTask, processTracksRun2, "produces derived track table for Run2 AO2Ds", false); + void processMcTrackLabels(soa::Join::iterator const& track) { if (track.has_mcParticle()) { From 303b2c8c0f2669740817a61f5622bf65efe083f1 Mon Sep 17 00:00:00 2001 From: Anantha Padmanabhan M Nair <82643666+ananthapadmanabhan18@users.noreply.github.com> Date: Tue, 11 Mar 2025 02:23:17 +0530 Subject: [PATCH 0639/1650] [PWGUD] More Tables (#10432) --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 211 ++++++++++++++++++++++++++++++ 1 file changed, 211 insertions(+) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index 5cf399af5ab..6e14e67b7f1 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -45,6 +45,17 @@ namespace branch { DECLARE_SOA_COLUMN(Dcaxy, dcaxy, std::vector); DECLARE_SOA_COLUMN(Dcaz, dcaz, std::vector); +DECLARE_SOA_COLUMN(TpcNsigmaKa, tpcNsigmaKa, std::vector); +DECLARE_SOA_COLUMN(TpcNsigmaPr, tpcNsigmaPr, std::vector); +DECLARE_SOA_COLUMN(TpcNsigmaMu, tpcNsigmaMu, std::vector); +DECLARE_SOA_COLUMN(TpcNsigmaEl, tpcNsigmaEl, std::vector); +DECLARE_SOA_COLUMN(TofNsigmaKa, tofNsigmaKa, std::vector); +DECLARE_SOA_COLUMN(TofNsigmaPr, tofNsigmaPr, std::vector); +DECLARE_SOA_COLUMN(TofNsigmaMu, tofNsigmaMu, std::vector); +DECLARE_SOA_COLUMN(TofNsigmaEl, tofNsigmaEl, std::vector); +DECLARE_SOA_COLUMN(TpcChi2, tpcChi2, std::vector); +DECLARE_SOA_COLUMN(TpcNClsFindable, tpcNClsFindable, std::vector); +DECLARE_SOA_COLUMN(ItsChi2, itsChi2, std::vector); DECLARE_SOA_COLUMN(PionPt, pionPt, std::vector); DECLARE_SOA_COLUMN(PionEta, pionEta, std::vector); DECLARE_SOA_COLUMN(PionRapidity, pionRapidity, std::vector); @@ -60,6 +71,17 @@ DECLARE_SOA_COLUMN(FourPionCosThetaPair2, fourPionCosThetaPair2, double); DECLARE_SOA_TABLE(UDTree0c, "AOD", "UD0Charge", branch::Dcaxy, branch::Dcaz, + branch::TpcNsigmaKa, + branch::TpcNsigmaPr, + branch::TpcNsigmaMu, + branch::TpcNsigmaEl, + branch::TofNsigmaKa, + branch::TofNsigmaPr, + branch::TofNsigmaMu, + branch::TofNsigmaEl, + branch::TpcChi2, + branch::TpcNClsFindable, + branch::ItsChi2, branch::PionPt, branch::PionEta, branch::PionRapidity, @@ -75,6 +97,17 @@ DECLARE_SOA_TABLE(UDTree0c, "AOD", "UD0Charge", DECLARE_SOA_TABLE(UDTreen0c, "AOD", "UDn0Charge", branch::Dcaxy, branch::Dcaz, + branch::TpcNsigmaKa, + branch::TpcNsigmaPr, + branch::TpcNsigmaMu, + branch::TpcNsigmaEl, + branch::TofNsigmaKa, + branch::TofNsigmaPr, + branch::TofNsigmaMu, + branch::TofNsigmaEl, + branch::TpcChi2, + branch::TpcNClsFindable, + branch::ItsChi2, branch::PionPt, branch::PionEta, branch::PionRapidity, @@ -99,6 +132,17 @@ DECLARE_SOA_TABLE(MCTree, "AOD", "MC0Charge", DECLARE_SOA_TABLE(MCUDTree, "AOD", "UDMC0Charge", branch::Dcaxy, branch::Dcaz, + branch::TpcNsigmaKa, + branch::TpcNsigmaPr, + branch::TpcNsigmaMu, + branch::TpcNsigmaEl, + branch::TofNsigmaKa, + branch::TofNsigmaPr, + branch::TofNsigmaMu, + branch::TofNsigmaEl, + branch::TpcChi2, + branch::TpcNClsFindable, + branch::ItsChi2, branch::PionPt, branch::PionEta, branch::PionRapidity, @@ -586,6 +630,20 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct std::vector pidcaXY; std::vector pidcaZ; + std::vector tpcNsigKa; + std::vector tpcNsigPr; + std::vector tpcNsigEl; + std::vector tpcNsigMu; + + std::vector tofNsigKa; + std::vector tofNsigPr; + std::vector tofNsigEl; + std::vector tofNsigMu; + + std::vector tpcchi2; + std::vector itschi2; + std::vector tpcNFindableCls; + std::vector piPt; std::vector piEta; std::vector piRapidity; @@ -616,6 +674,61 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct pidcaZ.push_back(Pi_minus_tracks[0].dcaZ()); pidcaZ.push_back(Pi_minus_tracks[1].dcaZ()); + tpcNsigKa.push_back(Pi_plus_tracks[0].tpcNSigmaKa()); + tpcNsigKa.push_back(Pi_plus_tracks[1].tpcNSigmaKa()); + tpcNsigKa.push_back(Pi_minus_tracks[0].tpcNSigmaKa()); + tpcNsigKa.push_back(Pi_minus_tracks[1].tpcNSigmaKa()); + + tpcNsigPr.push_back(Pi_plus_tracks[0].tpcNSigmaPr()); + tpcNsigPr.push_back(Pi_plus_tracks[1].tpcNSigmaPr()); + tpcNsigPr.push_back(Pi_minus_tracks[0].tpcNSigmaPr()); + tpcNsigPr.push_back(Pi_minus_tracks[1].tpcNSigmaPr()); + + tpcNsigEl.push_back(Pi_plus_tracks[0].tpcNSigmaEl()); + tpcNsigEl.push_back(Pi_plus_tracks[1].tpcNSigmaEl()); + tpcNsigEl.push_back(Pi_minus_tracks[0].tpcNSigmaEl()); + tpcNsigEl.push_back(Pi_minus_tracks[1].tpcNSigmaEl()); + + tpcNsigMu.push_back(Pi_plus_tracks[0].tpcNSigmaMu()); + tpcNsigMu.push_back(Pi_plus_tracks[1].tpcNSigmaMu()); + tpcNsigMu.push_back(Pi_minus_tracks[0].tpcNSigmaMu()); + tpcNsigMu.push_back(Pi_minus_tracks[1].tpcNSigmaMu()); + + tofNsigKa.push_back(Pi_plus_tracks[0].tofNSigmaKa()); + tofNsigKa.push_back(Pi_plus_tracks[1].tofNSigmaKa()); + tofNsigKa.push_back(Pi_minus_tracks[0].tofNSigmaKa()); + tofNsigKa.push_back(Pi_minus_tracks[1].tofNSigmaKa()); + + tofNsigPr.push_back(Pi_plus_tracks[0].tofNSigmaPr()); + tofNsigPr.push_back(Pi_plus_tracks[1].tofNSigmaPr()); + tofNsigPr.push_back(Pi_minus_tracks[0].tofNSigmaPr()); + tofNsigPr.push_back(Pi_minus_tracks[1].tofNSigmaPr()); + + tofNsigEl.push_back(Pi_plus_tracks[0].tofNSigmaEl()); + tofNsigEl.push_back(Pi_plus_tracks[1].tofNSigmaEl()); + tofNsigEl.push_back(Pi_minus_tracks[0].tofNSigmaEl()); + tofNsigEl.push_back(Pi_minus_tracks[1].tofNSigmaEl()); + + tofNsigMu.push_back(Pi_plus_tracks[0].tofNSigmaMu()); + tofNsigMu.push_back(Pi_plus_tracks[1].tofNSigmaMu()); + tofNsigMu.push_back(Pi_minus_tracks[0].tofNSigmaMu()); + tofNsigMu.push_back(Pi_minus_tracks[1].tofNSigmaMu()); + + tpcchi2.push_back(Pi_plus_tracks[0].tpcChi2NCl()); + tpcchi2.push_back(Pi_plus_tracks[1].tpcChi2NCl()); + tpcchi2.push_back(Pi_minus_tracks[0].tpcChi2NCl()); + tpcchi2.push_back(Pi_minus_tracks[1].tpcChi2NCl()); + + tpcNFindableCls.push_back(Pi_plus_tracks[0].tpcNClsFindable()); + tpcNFindableCls.push_back(Pi_plus_tracks[1].tpcNClsFindable()); + tpcNFindableCls.push_back(Pi_minus_tracks[0].tpcNClsFindable()); + tpcNFindableCls.push_back(Pi_minus_tracks[1].tpcNClsFindable()); + + itschi2.push_back(Pi_plus_tracks[0].itsChi2NCl()); + itschi2.push_back(Pi_plus_tracks[1].itsChi2NCl()); + itschi2.push_back(Pi_minus_tracks[0].itsChi2NCl()); + itschi2.push_back(Pi_minus_tracks[1].itsChi2NCl()); + piPt.push_back(p1.Pt()); piPt.push_back(p2.Pt()); piPt.push_back(p3.Pt()); @@ -661,6 +774,9 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct zeroChargeEventsData( pidcaXY, pidcaZ, + tpcNsigKa, tpcNsigPr, tpcNsigEl, tpcNsigMu, + tofNsigKa, tofNsigPr, tofNsigEl, tofNsigMu, + tpcchi2, tpcNFindableCls, itschi2, piPt, piEta, piRapidity, p1234.Pt(), p1234.Eta(), p1234.Rapidity(), p1234.M(), fourPiPhiPair1, fourPiPhiPair2, fourPiCosThetaPair1, fourPiCosThetaPair2); @@ -701,6 +817,17 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct std::vector pidcaXY; std::vector pidcaZ; + std::vector tpcNsigKa; + std::vector tpcNsigPr; + std::vector tpcNsigEl; + std::vector tpcNsigMu; + std::vector tofNsigKa; + std::vector tofNsigPr; + std::vector tofNsigEl; + std::vector tofNsigMu; + std::vector tpcchi2; + std::vector itschi2; + std::vector tpcNFindableCls; std::vector piPt; std::vector piEta; std::vector piRapidity; @@ -717,6 +844,17 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct tempVec.SetXYZM(WTS_PID_Pi_tracks[i].px(), WTS_PID_Pi_tracks[i].py(), WTS_PID_Pi_tracks[i].pz(), o2::constants::physics::MassPionCharged); pidcaXY.push_back(WTS_PID_Pi_tracks[i].dcaXY()); pidcaZ.push_back(WTS_PID_Pi_tracks[i].dcaZ()); + tpcNsigKa.push_back(WTS_PID_Pi_tracks[i].tpcNSigmaKa()); + tpcNsigPr.push_back(WTS_PID_Pi_tracks[i].tpcNSigmaPr()); + tpcNsigEl.push_back(WTS_PID_Pi_tracks[i].tpcNSigmaEl()); + tpcNsigMu.push_back(WTS_PID_Pi_tracks[i].tpcNSigmaMu()); + tofNsigKa.push_back(WTS_PID_Pi_tracks[i].tofNSigmaKa()); + tofNsigPr.push_back(WTS_PID_Pi_tracks[i].tofNSigmaPr()); + tofNsigEl.push_back(WTS_PID_Pi_tracks[i].tofNSigmaEl()); + tofNsigMu.push_back(WTS_PID_Pi_tracks[i].tofNSigmaMu()); + tpcchi2.push_back(WTS_PID_Pi_tracks[i].tpcChi2NCl()); + itschi2.push_back(WTS_PID_Pi_tracks[i].itsChi2NCl()); + tpcNFindableCls.push_back(WTS_PID_Pi_tracks[i].tpcNClsFindable()); piPt.push_back(tempVec.Pt()); piEta.push_back(tempVec.Eta()); piRapidity.push_back(tempVec.Rapidity()); @@ -724,6 +862,9 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct nonzeroChargeEventsData( pidcaXY, pidcaZ, + tpcNsigKa, tpcNsigPr, tpcNsigMu, tpcNsigEl, + tofNsigKa, tofNsigPr, tofNsigMu, tofNsigEl, + tpcchi2, tpcNFindableCls, itschi2, piPt, piEta, piRapidity, p1234.Pt(), p1234.Eta(), p1234.Rapidity(), p1234.M()); @@ -1033,6 +1174,18 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct std::vector dcaxy; std::vector dcaz; + std::vector tpcNsigKa; + std::vector tpcNsigPr; + std::vector tpcNsigEl; + std::vector tpcNsigMu; + std::vector tofNsigKa; + std::vector tofNsigPr; + std::vector tofNsigEl; + std::vector tofNsigMu; + std::vector tpcchi2; + std::vector itschi2; + std::vector tpcNFindableCls; + std::vector piPt; std::vector piEta; std::vector piRapidity; @@ -1047,6 +1200,61 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct dcaz.push_back(Pi_minus_tracks[0].dcaZ()); dcaz.push_back(Pi_minus_tracks[1].dcaZ()); + tpcNsigKa.push_back(Pi_plus_tracks[0].tpcNSigmaKa()); + tpcNsigKa.push_back(Pi_plus_tracks[1].tpcNSigmaKa()); + tpcNsigKa.push_back(Pi_minus_tracks[0].tpcNSigmaKa()); + tpcNsigKa.push_back(Pi_minus_tracks[1].tpcNSigmaKa()); + + tpcNsigPr.push_back(Pi_plus_tracks[0].tpcNSigmaPr()); + tpcNsigPr.push_back(Pi_plus_tracks[1].tpcNSigmaPr()); + tpcNsigPr.push_back(Pi_minus_tracks[0].tpcNSigmaPr()); + tpcNsigPr.push_back(Pi_minus_tracks[1].tpcNSigmaPr()); + + tpcNsigEl.push_back(Pi_plus_tracks[0].tpcNSigmaEl()); + tpcNsigEl.push_back(Pi_plus_tracks[1].tpcNSigmaEl()); + tpcNsigEl.push_back(Pi_minus_tracks[0].tpcNSigmaEl()); + tpcNsigEl.push_back(Pi_minus_tracks[1].tpcNSigmaEl()); + + tpcNsigMu.push_back(Pi_plus_tracks[0].tpcNSigmaMu()); + tpcNsigMu.push_back(Pi_plus_tracks[1].tpcNSigmaMu()); + tpcNsigMu.push_back(Pi_minus_tracks[0].tpcNSigmaMu()); + tpcNsigMu.push_back(Pi_minus_tracks[1].tpcNSigmaMu()); + + tofNsigKa.push_back(Pi_plus_tracks[0].tofNSigmaKa()); + tofNsigKa.push_back(Pi_plus_tracks[1].tofNSigmaKa()); + tofNsigKa.push_back(Pi_minus_tracks[0].tofNSigmaKa()); + tofNsigKa.push_back(Pi_minus_tracks[1].tofNSigmaKa()); + + tofNsigPr.push_back(Pi_plus_tracks[0].tofNSigmaPr()); + tofNsigPr.push_back(Pi_plus_tracks[1].tofNSigmaPr()); + tofNsigPr.push_back(Pi_minus_tracks[0].tofNSigmaPr()); + tofNsigPr.push_back(Pi_minus_tracks[1].tofNSigmaPr()); + + tofNsigEl.push_back(Pi_plus_tracks[0].tofNSigmaEl()); + tofNsigEl.push_back(Pi_plus_tracks[1].tofNSigmaEl()); + tofNsigEl.push_back(Pi_minus_tracks[0].tofNSigmaEl()); + tofNsigEl.push_back(Pi_minus_tracks[1].tofNSigmaEl()); + + tofNsigMu.push_back(Pi_plus_tracks[0].tofNSigmaMu()); + tofNsigMu.push_back(Pi_plus_tracks[1].tofNSigmaMu()); + tofNsigMu.push_back(Pi_minus_tracks[0].tofNSigmaMu()); + tofNsigMu.push_back(Pi_minus_tracks[1].tofNSigmaMu()); + + tpcchi2.push_back(Pi_plus_tracks[0].tpcChi2NCl()); + tpcchi2.push_back(Pi_plus_tracks[1].tpcChi2NCl()); + tpcchi2.push_back(Pi_minus_tracks[0].tpcChi2NCl()); + tpcchi2.push_back(Pi_minus_tracks[1].tpcChi2NCl()); + + tpcNFindableCls.push_back(Pi_plus_tracks[0].tpcNClsFindable()); + tpcNFindableCls.push_back(Pi_plus_tracks[1].tpcNClsFindable()); + tpcNFindableCls.push_back(Pi_minus_tracks[0].tpcNClsFindable()); + tpcNFindableCls.push_back(Pi_minus_tracks[1].tpcNClsFindable()); + + itschi2.push_back(Pi_plus_tracks[0].itsChi2NCl()); + itschi2.push_back(Pi_plus_tracks[1].itsChi2NCl()); + itschi2.push_back(Pi_minus_tracks[0].itsChi2NCl()); + itschi2.push_back(Pi_minus_tracks[1].itsChi2NCl()); + piPt.push_back(p1.Pt()); piPt.push_back(p2.Pt()); piPt.push_back(p3.Pt()); @@ -1063,6 +1271,9 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct piRapidity.push_back(p4.Rapidity()); zeroChargeEventsMCreco(dcaxy, dcaz, + tpcNsigKa, tpcNsigPr, tpcNsigMu, tpcNsigEl, + tofNsigKa, tofNsigPr, tofNsigMu, tofNsigEl, + tpcchi2, tpcNFindableCls, itschi2, piPt, piEta, piRapidity, p1234.Pt(), p1234.Eta(), p1234.Rapidity(), p1234.M(), phiPair1, phiPair2, cosThetaPair1, cosThetaPair2); From 729ae088b3855636ce66b5fd76695cac75346db9 Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Mon, 10 Mar 2025 22:25:14 +0100 Subject: [PATCH 0640/1650] [Common] Rename variable for temporary gitleaks hotfix (#10429) --- Common/TableProducer/PID/pidITS.cxx | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/Common/TableProducer/PID/pidITS.cxx b/Common/TableProducer/PID/pidITS.cxx index 58563955bc0..c3f437e6c8d 100644 --- a/Common/TableProducer/PID/pidITS.cxx +++ b/Common/TableProducer/PID/pidITS.cxx @@ -80,19 +80,19 @@ struct itsPid { ccdb->setCreatedNotAfter(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); LOG(fatal) << "Not implemented yet"; } else { - const char* key = metadataInfo.isMC() ? "MC" : "Data"; - o2::aod::ITSResponse::setParameters(itsParams->get(key, "RespITSPar1"), - itsParams->get(key, "RespITSPar2"), - itsParams->get(key, "RespITSPar3"), - itsParams->get(key, "RespITSPar1_Z2"), - itsParams->get(key, "RespITSPar2_Z2"), - itsParams->get(key, "RespITSPar3_Z2"), - itsParams->get(key, "ResolutionPar1"), - itsParams->get(key, "ResolutionPar2"), - itsParams->get(key, "ResolutionPar3"), - itsParams->get(key, "ResolutionPar1_Z2"), - itsParams->get(key, "ResolutionPar2_Z2"), - itsParams->get(key, "ResolutionPar3_Z2")); + const char* dataType = metadataInfo.isMC() ? "MC" : "Data"; + o2::aod::ITSResponse::setParameters(itsParams->get(dataType, "RespITSPar1"), + itsParams->get(dataType, "RespITSPar2"), + itsParams->get(dataType, "RespITSPar3"), + itsParams->get(dataType, "RespITSPar1_Z2"), + itsParams->get(dataType, "RespITSPar2_Z2"), + itsParams->get(dataType, "RespITSPar3_Z2"), + itsParams->get(dataType, "ResolutionPar1"), + itsParams->get(dataType, "ResolutionPar2"), + itsParams->get(dataType, "ResolutionPar3"), + itsParams->get(dataType, "ResolutionPar1_Z2"), + itsParams->get(dataType, "ResolutionPar2_Z2"), + itsParams->get(dataType, "ResolutionPar3_Z2")); } } From 8c2fbea226d57f1a66148c9895d88ca06958f963 Mon Sep 17 00:00:00 2001 From: Tanu Gahlaut <154991749+TGahlaut1@users.noreply.github.com> Date: Tue, 11 Mar 2025 03:25:17 +0530 Subject: [PATCH 0641/1650] [PWGCF] Remove rapidity cut and update efficiency correction (#10433) --- PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx | 690 ++++++++---------- 1 file changed, 297 insertions(+), 393 deletions(-) diff --git a/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx b/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx index 22256cbb2ab..ee045fdac6a 100644 --- a/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx @@ -53,7 +53,6 @@ struct MeanPtFlucId { Configurable cfgCutPtMin{"cfgCutPtMin", 0.15, "minimum pT"}; Configurable cfgCutEta{"cfgCutEta", 0.8, "Eta cut"}; Configurable cfgCutRap{"cfgCutRap", 0.5, "Rapidity Cut"}; - Configurable cfgCutDcaXY{"cfgCutDcaXY", 0.12, "DCAxy cut"}; Configurable cfgCutDcaZ{"cfgCutDcaZ", 0.3, "DCAz cut"}; Configurable cfgCutPosZ{"cfgCutPosZ", 10.0, "cut for vertex Z"}; Configurable cfgGammaCut{"cfgGammaCut", 0.003, "Gamma inv Mass Cut for electron-positron rejection"}; @@ -74,14 +73,10 @@ struct MeanPtFlucId { Configurable cfgCutPrP2{"cfgCutPrP2", 1.0, "proton p cut-2"}; Configurable cfgLoadEff{"cfgLoadEff", true, "Load efficiency"}; Configurable cfgEffPtCh{"cfgEffPtCh", true, "Efficiency correction (pT) for charged particles"}; - Configurable cfgEffPtPi{"cfgEffPtPi", true, "Efficiency correction (pT) for pions"}; - Configurable cfgEffPtKa{"cfgEffPtKa", true, "Efficiency correction (pT) for kaons"}; - Configurable cfgEffPtPr{"cfgEffPtPr", true, "Efficiency correction (pT) for protons"}; - Configurable cfgEffPtYPi{"cfgEffPtYPi", true, "Efficiency correction (pT, y) for pions"}; - Configurable cfgEffPtYKa{"cfgEffPtYKa", true, "Efficiency correction (pT, y) for kaons"}; - Configurable cfgEffPtYPr{"cfgEffPtYPr", true, "Efficiency correction (pT, y) for protons"}; - Configurable cfgPidCut{"cfgPidCut", false, ""}; - Configurable cfgPDGCodeOnly{"cfgPDGCodeOnly", true, ""}; + Configurable cfgEffPtId{"cfgEffPtId", false, "Efficiency correction (pT) "}; + Configurable cfgEffPtYId{"cfgEffPtYId", false, "Efficiency correction (pT, rap) "}; + Configurable cfgEffPtEtaId{"cfgEffPtEtaId", true, "Efficiency correction (pT, Eta) "}; + Configurable cfgPurityId{"cfgPurityId", false, "Purity correction"}; Configurable cfgMCReco{"cfgMCReco", false, ""}; Configurable cfgMCTruth{"cfgMCTruth", false, ""}; Configurable cfgPosZ{"cfgPosZ", true, "Position Z"}; @@ -89,11 +84,8 @@ struct MeanPtFlucId { Configurable cfgNoSameBunchPileup{"cfgNoSameBunchPileup", true, "kNoSameBunchPileup"}; Configurable cfgIsVertexITSTPC{"cfgIsVertexITSTPC", true, "kIsVertexITSTPC"}; Configurable cfgRejTrk{"cfgRejTrk", true, "Rejected Tracks"}; - Configurable cfgInvMass{"cfgInvMass", true, "electron Inv Mass cut selection"}; - Configurable cfgSelOR{"cfgSelOR", true, "Low OR High momentum "}; - Configurable cfgSelAND{"cfgSelAND", false, "Low AND High momentum"}; - Configurable cfgSelLow{"cfgSelLow", true, "PID selection cut for Low momentum"}; - Configurable cfgSelHigh{"cfgSelHigh", true, "PID selection cut for High momentum"}; + Configurable cfgSelOld{"cfgSelOld", true, " Non-circular Cuts"}; + Configurable cfgSelNew{"cfgSelNew", false, "Circular Cuts"}; ConfigurableAxis multTPCBins{"multTPCBins", {150, 0, 150}, "TPC Multiplicity bins"}; ConfigurableAxis multFT0MBins{"multFT0MBins", {1000, 0, 5000}, "Forward Multiplicity bins"}; ConfigurableAxis multFT0MMCBins{"multFT0MMCBins", {250, 0, 250}, "Forward Multiplicity bins"}; @@ -111,8 +103,6 @@ struct MeanPtFlucId { Service ccdb; - std::vector vEff = {"heffPt", "heffPtPi", "heffPtKa", "heffPtPr", "heffPtRapPi", "heffPtRapKa", "heffPtRapPr"}; - using MyAllTracks = soa::JoinsetCaching(true); TList* lst = ccdb->getForTimeStamp(cfgPathCCDB.value, -1); - heffPt = reinterpret_cast(lst->FindObject("heffPt")); - heffPtPi = reinterpret_cast(lst->FindObject("heffPtPi")); - heffPtKa = reinterpret_cast(lst->FindObject("heffPtKa")); - heffPtPr = reinterpret_cast(lst->FindObject("heffPtPr")); - heffPtRapPi = reinterpret_cast(lst->FindObject("heffPtRapPi")); - heffPtRapKa = reinterpret_cast(lst->FindObject("heffPtRapKa")); - heffPtRapPr = reinterpret_cast(lst->FindObject("heffPtRapPr")); - - if (!heffPt || !heffPtPi || !heffPtKa || !heffPtPr || !heffPtRapPi || !heffPtRapKa || !heffPtRapPr) { + hEffPt = reinterpret_cast(lst->FindObject("hEffPt")); + hEffPtPi = reinterpret_cast(lst->FindObject("hEffPtPi")); + hEffPtKa = reinterpret_cast(lst->FindObject("hEffPtKa")); + hEffPtPr = reinterpret_cast(lst->FindObject("hEffPtPr")); + hPurePtPi = reinterpret_cast(lst->FindObject("hPurePtPi")); + hPurePtKa = reinterpret_cast(lst->FindObject("hPurePtKa")); + hPurePtPr = reinterpret_cast(lst->FindObject("hPurePtPr")); + hEffPtRapPi = reinterpret_cast(lst->FindObject("hEffPtRapPi")); + hEffPtRapKa = reinterpret_cast(lst->FindObject("hEffPtRapKa")); + hEffPtRapPr = reinterpret_cast(lst->FindObject("hEffPtRapPr")); + hEffPtEtaPi = reinterpret_cast(lst->FindObject("hEffPtEtaPi")); + hEffPtEtaKa = reinterpret_cast(lst->FindObject("hEffPtEtaKa")); + hEffPtEtaPr = reinterpret_cast(lst->FindObject("hEffPtEtaPr")); + + if (!hEffPt || !hEffPtPi || !hEffPtKa || !hEffPtPr || !hEffPtRapPi || !hEffPtRapKa || !hEffPtRapPr || !hEffPtEtaPi || !hEffPtEtaKa || !hEffPtEtaPr || !hPurePtPi || !hPurePtKa || !hPurePtPr) { LOGF(info, "FATAL!! Could not find required histograms in CCDB"); } } @@ -280,15 +285,13 @@ struct MeanPtFlucId { hist.add("QA/Pion/h_Pt_weighted", "weighted pT distribution", kTH1D, {axisPt}); hist.add("QA/Pion/h2_Pt_Rap", "p_{T} vs y", kTH2D, {{axisY}, {axisPt}}); - hist.add("QA/Pion/h2_PtPos_rap", "p_{T} vs y", kTH2D, {{axisY}, {axisPt}}); - hist.add("QA/Pion/h2_PtNeg_rap", "p_{T} vs y", kTH2D, {{axisY}, {axisPt}}); hist.add("QA/Pion/h2_PtTruth_Rap", "p_{T} vs y", kTH2D, {{axisY}, {axisPt}}); - hist.add("QA/Pion/h2_PtPosTruth_Rap", "p_{T} vs y", kTH2D, {{axisY}, {axisPt}}); - hist.add("QA/Pion/h2_PtNegTruth_Rap", "p_{T} vs y", kTH2D, {{axisY}, {axisPt}}); + hist.add("QA/Pion/h2_PtTruth_Eta", "p_{T} vs #eta", kTH2D, {{axisEta}, {axisPt}}); hist.add("QA/Pion/h2_Pt_Eta", "p_{T} vs #eta", kTH2D, {{axisEta}, {axisPt}}); hist.add("QA/Pion/h2_DcaZ", "DCA_{z}", kTH2D, {{axisPt}, {axisDCAz}}); hist.add("QA/Pion/h2_DcaXY", "DCA_{xy}", kTH2D, {{axisPt}, {axisDCAxy}}); - hist.add("QA/Pion/h2_Pt_Rap_weighted", "p_{T} vs #eta weighted", kTH2D, {{axisY}, {axisPt}}); + hist.add("QA/Pion/h2_Pt_Rap_weighted", "p_{T} vs y weighted", kTH2D, {{axisY}, {axisPt}}); + hist.add("QA/Pion/h2_Pt_Eta_weighted", "p_{T} vs #eta weighted", kTH2D, {{axisEta}, {axisPt}}); hist.add("QA/Pion/h2_Pt_NFT0M", "p_{T} in Multiplicity Classes ", kTH2D, {{axisPt}, {axisMultFT0M}}); hist.add("QA/Pion/h2_PtPos_NFT0M", "p_{T} in Multiplicity Classes ", kTH2D, {{axisPt}, {axisMultFT0M}}); hist.add("QA/Pion/h2_PtNeg_NFT0M", "p_{T} in Multiplicity Classes ", kTH2D, {{axisPt}, {axisMultFT0M}}); @@ -410,8 +413,6 @@ struct MeanPtFlucId { hist.add("Gen/Pion/h_RapTruth", "y", kTH1D, {axisY}); hist.add("Gen/Pion/h2_PtTruth_Rap", "p_{T} vs y", kTH2D, {{axisY}, {axisPt}}); - hist.add("Gen/Pion/h2_PtPosTruth_Rap", "p_{T} vs y", kTH2D, {{axisY}, {axisPt}}); - hist.add("Gen/Pion/h2_PtNegTruth_Rap", "p_{T} vs y", kTH2D, {{axisY}, {axisPt}}); hist.add("Gen/Pion/h_PtPosTruth", "p_{T} (Positive)", kTH1D, {axisPt}); hist.add("Gen/Pion/h_PtNegTruth", "p_{T} (negative)", kTH1D, {axisPt}); hist.add("Gen/Pion/h2_PtPosTruth_NFT0M", "p_{T} in Multiplicity Classes ", kTH2D, {{axisPt}, {axisMultFT0M}}); @@ -503,6 +504,9 @@ struct MeanPtFlucId { if (std::fabs(track.dcaZ()) > cfgCutDcaZ) return false; + if (std::abs(track.eta()) >= cfgCutEta) + return false; + return true; } @@ -533,11 +537,10 @@ struct MeanPtFlucId { // PID selction cuts for Low momentum Pions template - bool selLowPi(T const& track) + bool selPi(T const& track) { if (track.pt() >= cfgCutPiPtMin && - track.p() <= cfgCutPiThrsldP && - std::abs(track.rapidity(MassPiPlus)) < cfgCutRap) { + track.p() <= cfgCutPiThrsldP) { if (!track.hasTOF() && std::fabs(track.tpcNSigmaPi()) < cfgCutNSig2) { return true; @@ -548,17 +551,23 @@ struct MeanPtFlucId { std::fabs(track.tofNSigmaPi()) < cfgCutNSig3) { return true; } + } else if (track.hasTOF() && + track.p() > cfgCutPiThrsldP && + std::fabs(track.tpcNSigmaPi()) < cfgCutNSig3 && + std::fabs(track.tofNSigmaPi()) < cfgCutNSig3) { + + return true; } + return false; } // PID selction cuts for Low momentum Kaons template - bool selLowKa(T const& track) + bool selKa(T const& track) { if (track.pt() >= cfgCutKaPtMin && - track.p() <= cfgCutKaThrsldP && - std::abs(track.rapidity(MassKPlus)) < cfgCutRap) { + track.p() <= cfgCutKaThrsldP) { if (!track.hasTOF() && std::fabs(track.tpcNSigmaKa()) < cfgCutNSig2) { return true; @@ -570,17 +579,25 @@ struct MeanPtFlucId { return true; } } + if (track.hasTOF() && + track.p() > cfgCutKaThrsldP && + std::fabs(track.tpcNSigmaKa()) < cfgCutNSig3 && + ((std::fabs(track.tofNSigmaKa()) < cfgCutNSig3 && track.p() <= cfgCutKaP3) || + (std::fabs(track.tofNSigmaKa()) < cfgCutNSig2 && track.p() > cfgCutKaP3))) { + + return true; + } return false; } // PID selction cuts for Low momentum Protons template - bool selLowPr(T const& track) + bool selPr(T const& track) { + if (track.pt() >= cfgCutPrPtMin && - track.p() <= cfgCutPrThrsldP && - std::abs(track.rapidity(MassProton)) < cfgCutRap) { + track.p() <= cfgCutPrThrsldP) { if (!track.hasTOF() && std::fabs(track.tpcNSigmaPr()) < cfgCutNSig2) { return true; @@ -591,6 +608,12 @@ struct MeanPtFlucId { std::fabs(track.tofNSigmaPr()) < cfgCutNSig3) { return true; } + } else if (track.hasTOF() && + track.p() > cfgCutPrThrsldP && + std::fabs(track.tpcNSigmaPr()) < cfgCutNSig3 && + std::fabs(track.tofNSigmaPr()) < cfgCutNSig3) { + + return true; } return false; @@ -598,16 +621,24 @@ struct MeanPtFlucId { // PID selction cuts for High momentum Protons template - bool selHighPi(T const& track) + bool selCirPi(T const& track) { - if (track.hasTOF() && - track.p() > cfgCutPiThrsldP && - std::fabs(track.tpcNSigmaPi()) < cfgCutNSig3 && - std::fabs(track.tofNSigmaPi()) < cfgCutNSig3) { + double nTPCTOF = std::pow(track.tpcNSigmaPi(), 2) + std::pow(track.tofNSigmaPi(), 2); + if (track.pt() >= cfgCutPiPtMin && + track.p() <= cfgCutPiThrsldP) { + if (!track.hasTOF() && + std::fabs(track.tpcNSigmaPi()) < cfgCutNSig2) { + return true; + } - if (std::abs(track.rapidity(MassPiPlus)) < cfgCutRap) { + if (track.hasTOF() && + std::fabs(track.tpcNSigmaPi()) < cfgCutNSig2 && + std::fabs(track.tofNSigmaPi()) < cfgCutNSig3) { return true; } + } else if (track.p() > cfgCutPiThrsldP && + nTPCTOF < cfgCutNSig3) { + return true; } return false; @@ -615,17 +646,25 @@ struct MeanPtFlucId { // PID selction cuts for High momentum Kaons template - bool selHighKa(T const& track) + bool selCirKa(T const& track) { - if (track.hasTOF() && - track.p() > cfgCutKaThrsldP && - std::fabs(track.tpcNSigmaKa()) < cfgCutNSig3 && - ((std::fabs(track.tofNSigmaKa()) < cfgCutNSig3 && track.p() <= cfgCutKaP3) || - (std::fabs(track.tofNSigmaKa()) < cfgCutNSig2 && track.p() > cfgCutKaP3))) { + double nTPCTOF = std::pow(track.tpcNSigmaPi(), 2) + std::pow(track.tofNSigmaPi(), 2); + if (track.pt() >= cfgCutKaPtMin && + track.p() <= cfgCutKaThrsldP) { + if (!track.hasTOF() && + std::fabs(track.tpcNSigmaKa()) < cfgCutNSig2) { + return true; + } - if (std::abs(track.rapidity(MassKPlus)) < cfgCutRap) { + if (track.hasTOF() && + std::fabs(track.tpcNSigmaKa()) < cfgCutNSig2 && + std::fabs(track.tofNSigmaKa()) < cfgCutNSig3) { return true; } + } else if (track.p() > cfgCutPiThrsldP && + ((nTPCTOF < cfgCutNSig3 && track.p() <= cfgCutKaP3) || + (nTPCTOF < cfgCutNSig2 && track.p() > cfgCutKaP3))) { + return true; } return false; @@ -633,16 +672,26 @@ struct MeanPtFlucId { // PID selction cuts for High momentum Protons template - bool selHighPr(T const& track) + bool selCirPr(T const& track) { - if (track.hasTOF() && - track.p() > cfgCutPrThrsldP && - std::fabs(track.tpcNSigmaPr()) < cfgCutNSig3 && - std::fabs(track.tofNSigmaPr()) < cfgCutNSig3) { + double nTPCTOF = std::pow(track.tpcNSigmaPi(), 2) + std::pow(track.tofNSigmaPi(), 2); + if (track.pt() >= cfgCutPrPtMin && + track.p() <= cfgCutPrThrsldP) { + if (!track.hasTOF() && + std::fabs(track.tpcNSigmaPr()) < cfgCutNSig2) { + return true; + } - if (std::abs(track.rapidity(MassProton)) < cfgCutRap) { + if (track.hasTOF() && + std::fabs(track.tpcNSigmaPr()) < cfgCutNSig2 && + std::fabs(track.tofNSigmaPr()) < cfgCutNSig3) { return true; } + } else if (track.hasTOF() && + track.p() > cfgCutPrThrsldP && + nTPCTOF < cfgCutNSig3) { + + return true; } return false; @@ -750,73 +799,83 @@ struct MeanPtFlucId { Q4 += pt * pt * pt * pt * weight; } - float getCorrectedWeight(double pt, double rap, bool cfgEffPtCh, bool cfgEffPtPi, bool cfgEffPtKa, bool cfgEffPtPr, bool cfgEffPtYPi, bool cfgEffPtYKa, bool cfgEffPtYPr) + template + float getCorrectedWeight(T1 hEffPt, T1 hPurePt, T2 hEffPtY, T2 hEffPtEta, double pt, double rap, double eta, bool cfgEffPt, bool cfgEffPtY, bool cfgEffPtEta, bool cfgPurity) { float weight = 1.0; - if (cfgEffPtCh) { - float effPt = heffPt->GetBinContent(heffPt->FindBin(pt)); - weight = 1.0 / effPt; - } else if (cfgEffPtPi) { - float effPtPi = heffPtPi->GetBinContent(heffPtPi->FindBin(pt)); - weight = 1.0 / effPtPi; - } else if (cfgEffPtKa) { - float effPtKa = heffPtKa->GetBinContent(heffPtKa->FindBin(pt)); - weight = 1.0 / effPtKa; - } else if (cfgEffPtPr) { - float effPtPr = heffPtPr->GetBinContent(heffPtPr->FindBin(pt)); - weight = 1.0 / effPtPr; - } else if (cfgEffPtYPi) { - float effPtYPi = heffPtRapPi->GetBinContent(heffPtRapPi->FindBin(rap, pt)); - weight = 1.0 / effPtYPi; - } else if (cfgEffPtYKa) { - float effPtYKa = heffPtRapKa->GetBinContent(heffPtRapKa->FindBin(rap, pt)); - weight = 1.0 / effPtYKa; - } else if (cfgEffPtYPr) { - float effPtYPr = heffPtRapPr->GetBinContent(heffPtRapPr->FindBin(rap, pt)); - weight = 1.0 / effPtYPr; + float purity = 1.0; + if (cfgPurity) { + purity = hPurePt->GetBinContent(hPurePt->FindBin(pt)); } else { - weight = 1.0; + purity = 1.0; } + if (cfgEffPt) { + float effPt = hEffPt->GetBinContent(hEffPt->FindBin(pt)); + if (effPt > 0) { + weight = purity / effPt; + } + } else if (cfgEffPtY) { + float effPtY = hEffPtY->GetBinContent(hEffPtY->FindBin(rap, pt)); + if (effPtY > 0) { + weight = purity / effPtY; + } + } else if (cfgEffPtEta) { + float effPtEta = hEffPtEta->GetBinContent(hEffPtEta->FindBin(eta, pt)); + if (effPtEta > 0) { + weight = purity / effPtEta; + } + } else { + weight = 1.0; + } return weight; } // Fill after PID cut QA hist: - template - void fillIdParticleQAHistos(T const& track, double rap, double nSigmaTPC, double nSigmaTOF, int nFT0M, bool cfgEffPtPi, bool cfgEffPtKa, bool cfgEffPtPr, bool cfgEffPtYPi, bool cfgEffPtYKa, bool cfgEffPtYPr, int& N, int& NW, double& Q1, double& Q2, double& Q3, double& Q4) + template + void fillIdParticleQAHistos(T const& track, double rap, double nSigmaTPC, double nSigmaTOF, int nFT0M, T1 hEffPt, T1 hPurePt, T2 hEffPtY, T2 hEffPtEta, bool cfgEffPtId, bool cfgEffPtYId, bool cfgEffPtEtaId, bool cfgPurityId, int& N, int& NW, double& Q1, double& Q2, double& Q3, double& Q4, float& weight) { double pt = track.pt(); - double weight = getCorrectedWeight(pt, rap, false, cfgEffPtPi, cfgEffPtKa, cfgEffPtPr, cfgEffPtYPi, cfgEffPtYKa, cfgEffPtYPr); + double eta = track.eta(); + weight = getCorrectedWeight(hEffPt, hPurePt, hEffPtY, hEffPtEta, pt, rap, eta, cfgEffPtId, cfgEffPtYId, cfgEffPtEtaId, cfgPurityId); + if (weight == 0) + return; NW += weight; N++; moments(pt, weight, Q1, Q2, Q3, Q4); - hist.fill(HIST(Dire[Mode]) + HIST("h2_Pt_Rap_weighted"), rap, pt, weight); + if (cfgEffPtYId) + hist.fill(HIST(Dire[Mode]) + HIST("h2_Pt_Rap_weighted"), rap, pt, weight); + + if (cfgEffPtEtaId) + hist.fill(HIST(Dire[Mode]) + HIST("h2_Pt_Eta_weighted"), eta, pt, weight); + hist.fill(HIST(Dire[Mode]) + HIST("h_Pt_weighted"), pt, weight); + hist.fill(HIST(Dire[Mode]) + HIST("h2_pt_nch"), N, pt, weight); + hist.fill(HIST(Dire[Mode]) + HIST("h3_nft0m_pt_nch"), N, pt, nFT0M, weight); + hist.fill(HIST(Dire[Mode]) + HIST("h2_pt_nch_prof"), N, pt, weight); - hist.fill(HIST(Dire[Mode]) + HIST("h_Pt"), track.pt()); - hist.fill(HIST(Dire[Mode]) + HIST("h2_Pt_NFT0M"), track.pt(), nFT0M); - hist.fill(HIST(Dire[Mode]) + HIST("h2_Pt_Eta"), track.eta(), track.pt()); + hist.fill(HIST(Dire[Mode]) + HIST("h_Pt"), pt); + hist.fill(HIST(Dire[Mode]) + HIST("h2_Pt_NFT0M"), pt, nFT0M); + hist.fill(HIST(Dire[Mode]) + HIST("h2_Pt_Eta"), eta, pt); if (track.sign() > 0) { - hist.fill(HIST(Dire[Mode]) + HIST("h_PtPos"), track.pt()); - hist.fill(HIST(Dire[Mode]) + HIST("h2_PtPos_NFT0M"), track.pt(), nFT0M); - hist.fill(HIST(Dire[Mode]) + HIST("h2_PtPos_rap"), rap, track.pt()); + hist.fill(HIST(Dire[Mode]) + HIST("h_PtPos"), pt); + hist.fill(HIST(Dire[Mode]) + HIST("h2_PtPos_NFT0M"), pt, nFT0M); } if (track.sign() < 0) { - hist.fill(HIST(Dire[Mode]) + HIST("h_PtNeg"), track.pt()); - hist.fill(HIST(Dire[Mode]) + HIST("h2_PtNeg_NFT0M"), track.pt(), nFT0M); - hist.fill(HIST(Dire[Mode]) + HIST("h2_PtNeg_rap"), rap, track.pt()); + hist.fill(HIST(Dire[Mode]) + HIST("h_PtNeg"), pt); + hist.fill(HIST(Dire[Mode]) + HIST("h2_PtNeg_NFT0M"), pt, nFT0M); } - hist.fill(HIST(Dire[Mode]) + HIST("h_Eta"), track.eta()); + hist.fill(HIST(Dire[Mode]) + HIST("h_Eta"), eta); hist.fill(HIST(Dire[Mode]) + HIST("h_Phi"), track.phi()); hist.fill(HIST(Dire[Mode]) + HIST("h_Rap"), rap); - hist.fill(HIST(Dire[Mode]) + HIST("h2_Pt_Rap"), rap, track.pt()); + hist.fill(HIST(Dire[Mode]) + HIST("h2_Pt_Rap"), rap, pt); hist.fill(HIST(Dire[Mode]) + HIST("h_DcaZ"), track.dcaZ()); hist.fill(HIST(Dire[Mode]) + HIST("h_DcaXY"), track.dcaXY()); - hist.fill(HIST(Dire[Mode]) + HIST("h2_DcaZ"), track.pt(), track.dcaZ()); - hist.fill(HIST(Dire[Mode]) + HIST("h2_DcaXY"), track.pt(), track.dcaXY()); + hist.fill(HIST(Dire[Mode]) + HIST("h2_DcaZ"), pt, track.dcaZ()); + hist.fill(HIST(Dire[Mode]) + HIST("h2_DcaXY"), pt, track.dcaXY()); hist.fill(HIST(Dire[Mode]) + HIST("h2_TPCNsigma_El"), track.p(), track.tpcNSigmaEl()); hist.fill(HIST(Dire[Mode]) + HIST("h2_TOFNsigma_El"), track.p(), track.tofNSigmaEl()); @@ -851,16 +910,15 @@ struct MeanPtFlucId { hist.fill(HIST(Dire[Mode]) + HIST("h_RapTruth"), rap); hist.fill(HIST(Dire[Mode]) + HIST("h2_PtTruth_NFT0M"), pt, nFT0M); hist.fill(HIST(Dire[Mode]) + HIST("h2_PtTruth_Rap"), rap, pt); + hist.fill(HIST(Dire[Mode]) + HIST("h2_PtTruth_Eta"), eta, pt); if (pid == pdgCodePos) { hist.fill(HIST(Dire[Mode]) + HIST("h_PtPosTruth"), pt); hist.fill(HIST(Dire[Mode]) + HIST("h2_PtPosTruth_NFT0M"), pt, nFT0M); - hist.fill(HIST(Dire[Mode]) + HIST("h2_PtPosTruth_Rap"), rap, pt); } if (pid == pdgCodeNeg) { hist.fill(HIST(Dire[Mode]) + HIST("h_PtNegTruth"), pt); hist.fill(HIST(Dire[Mode]) + HIST("h2_PtNegTruth_NFT0M"), pt, nFT0M); - hist.fill(HIST(Dire[Mode]) + HIST("h2_PtNegTruth_Rap"), rap, pt); } } @@ -880,9 +938,11 @@ struct MeanPtFlucId { hist.fill(HIST(Dire[Mode]) + HIST("h_Q2"), nTPC, Q2, nFT0M); hist.fill(HIST(Dire[Mode]) + HIST("h_Q3"), nTPC, Q3, nFT0M); hist.fill(HIST(Dire[Mode]) + HIST("h_Q4"), nTPC, Q4, nFT0M); + double meanPt = Q1 / static_cast(NW); + hist.fill(HIST(Dire[Mode]) + HIST("p_mean_pT_Mult_var"), nTPC, meanPt); //////need to check if (N > 1) { - double meanPt = Q1 / static_cast(NW); + // double meanPt = Q1 / static_cast(NW); double nPair = (static_cast(NW) * (static_cast(NW) - 1)); double twopart = twopart1 / nPair; double checkNDenoVar = (1 / std::sqrt(1 - (1 / static_cast(NW)))); @@ -938,27 +998,7 @@ struct MeanPtFlucId { double ptPrSim = 0, q1PrSim = 0, q2PrSim = 0, q3PrSim = 0, q4PrSim = 0; double ptKaSim = 0, q1KaSim = 0, q2KaSim = 0, q3KaSim = 0, q4KaSim = 0; - double wghtCh = 1.0, wghtPi = 1.0, wghtKa = 1.0, wghtPr = 1.0; - - array p1, p2; - double invMassGamma = 0.0; - - for (const auto& [trkEl, trkPos] : soa::combinations(soa::CombinationsFullIndexPolicy(tracks, tracks))) { - if (trkEl.index() == trkPos.index()) - continue; - - if (!selTrack(trkEl) || !selTrack(trkPos)) - continue; - - if (!selElectrons(trkEl) || !selElectrons(trkPos)) - continue; - - p1 = std::array{trkEl.px(), trkEl.py(), trkEl.pz()}; - p2 = std::array{trkPos.px(), trkPos.py(), trkPos.pz()}; - - invMassGamma = RecoDecay::m(std::array{p1, p2}, std::array{MassElectron, MassElectron}); - hist.fill(HIST("QA/after/h_invMass_gamma"), invMassGamma); - } + float wghtCh = 1.0, wghtPi = 1.0, wghtKa = 1.0, wghtPr = 1.0; fillAfterQAHistos(col); @@ -984,52 +1024,52 @@ struct MeanPtFlucId { if (std::fabs(track.eta()) < 0.8) { ptCh = track.pt(); - double weight = getCorrectedWeight(ptCh, 0.0, cfgEffPtCh, false, false, false, false, false, false); - nChW += weight; + wghtCh = getCorrectedWeight(hEffPt, hPurePt, hEffPtRap, hEffPtEta, ptCh, 0.0, eta, cfgEffPtCh, false, false, false); + nChW += wghtCh; nCh++; - hist.fill(HIST("QA/after/h_Pt_weighted"), ptCh, weight); - moments(ptCh, weight, q1Ch, q2Ch, q3Ch, q4Ch); - - fillChargedQAHistos(track, nFT0M); - } + moments(ptCh, wghtCh, q1Ch, q2Ch, q3Ch, q4Ch); - fillBeforePIDQAHistos(track); + hist.fill(HIST("QA/after/h_Pt_weighted"), ptCh, wghtCh); + hist.fill(HIST("QA/after/h2_pt_nch"), nCh, ptCh, wghtCh); + hist.fill(HIST("QA/after/h3_nft0m_pt_nch"), nCh, ptCh, nFT0M, wghtCh); + hist.fill(HIST("QA/after/h2_pt_nch_prof"), nCh, ptCh, wghtCh); - if (rejectTracks(track)) { - return; - } + fillChargedQAHistos(track, nFT0M); - if (cfgInvMass == true && invMassGamma < cfgGammaCut) { - continue; - } + fillBeforePIDQAHistos(track); - if (cfgSelOR == true && cfgSelAND == false) { - if (selLowPi(track) == cfgSelLow || selHighPi(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, cfgEffPtPi, false, false, cfgEffPtYPi, false, false, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi); - } - } else if (cfgSelOR == false && cfgSelAND == true) { - if (selLowPi(track) == cfgSelLow && selHighPi(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, cfgEffPtPi, false, false, cfgEffPtYPi, false, false, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi); + if (rejectTracks(track)) { + return; } - } - if (cfgSelOR == true && cfgSelAND == false) { - if (selLowKa(track) == cfgSelLow || selHighKa(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, false, cfgEffPtKa, false, false, cfgEffPtYKa, false, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka); - } - } else if (cfgSelOR == false && cfgSelAND == true) { - if (selLowKa(track) == cfgSelLow && selHighKa(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, false, cfgEffPtKa, false, false, cfgEffPtYKa, false, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka); + if (cfgSelOld) { + if (selPi(track)) { + fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, hEffPtPi, hPurePtPi, hEffPtRapPi, hEffPtEtaPi, cfgEffPtId, cfgEffPtYId, cfgEffPtEtaId, cfgPurityId, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi, wghtPi); + } + } else if (cfgSelNew) { + if (selCirPi(track)) { + fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, hEffPtPi, hPurePtPi, hEffPtRapPi, hEffPtEtaPi, cfgEffPtId, cfgEffPtYId, cfgEffPtEtaId, cfgPurityId, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi, wghtPi); + } } - } - if (cfgSelOR == true && cfgSelAND == false) { - if (selLowPr(track) == cfgSelLow || selHighPr(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, false, false, cfgEffPtPr, false, false, cfgEffPtYPr, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr); + if (cfgSelOld) { + if (selKa(track)) { + fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, hEffPtKa, hPurePtKa, hEffPtRapKa, hEffPtEtaKa, cfgEffPtId, cfgEffPtYId, cfgEffPtEtaId, cfgPurityId, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka, wghtKa); + } + } else if (cfgSelNew) { + if (selCirKa(track)) { + fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, hEffPtKa, hPurePtKa, hEffPtRapKa, hEffPtEtaKa, cfgEffPtId, cfgEffPtYId, cfgEffPtEtaId, cfgPurityId, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka, wghtKa); + } } - } else if (cfgSelOR == false && cfgSelAND == true) { - if (selLowPr(track) == cfgSelLow && selHighPr(track) == cfgSelHigh) { - fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, false, false, cfgEffPtPr, false, false, cfgEffPtYPr, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr); + + if (cfgSelOld) { + if (selPr(track)) { + fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, hEffPtPr, hPurePtPr, hEffPtRapPr, hEffPtEtaPr, cfgEffPtId, cfgEffPtYId, cfgEffPtEtaId, cfgPurityId, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr, wghtPr); + } + } else if (cfgSelNew) { + if (selCirPr(track)) { + fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, hEffPtPr, hPurePtPr, hEffPtRapPr, hEffPtEtaPr, cfgEffPtId, cfgEffPtYId, cfgEffPtEtaId, cfgPurityId, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr, wghtPr); + } } } } @@ -1053,9 +1093,9 @@ struct MeanPtFlucId { continue; } - if (std::abs(track.eta()) < 0.8) { - nTPC++; - } + // if (std::abs(track.eta()) < 0.8) { + // nTPC++; + // } double nSigmaTPCPi = track.tpcNSigmaPi(); double nSigmaTPCKa = track.tpcNSigmaKa(); @@ -1071,98 +1111,75 @@ struct MeanPtFlucId { if (selTrack(track)) { - if (std::fabs(track.eta()) < 0.8) { - ptCh = track.pt(); - double weight = getCorrectedWeight(ptCh, 0.0, cfgEffPtCh, false, false, false, false, false, false); - hist.fill(HIST("QA/after/h_Pt_weighted"), ptCh, weight); - nChW += weight; - nCh++; - moments(ptCh, weight, q1Ch, q2Ch, q3Ch, q4Ch); - fillChargedQAHistos(track, nFT0M); - } + eta = track.eta(); + ptCh = track.pt(); + wghtCh = getCorrectedWeight(hEffPt, hPurePt, hEffPtRap, hEffPtEta, ptCh, 0.0, eta, cfgEffPtCh, false, false, false); + nChW += wghtCh; + nCh++; + moments(ptCh, wghtCh, q1Ch, q2Ch, q3Ch, q4Ch); + fillChargedQAHistos(track, nFT0M); + + hist.fill(HIST("QA/after/h_Pt_weighted"), ptCh, wghtCh); + hist.fill(HIST("QA/after/h2_pt_nch"), nCh, ptCh, wghtCh); + hist.fill(HIST("QA/after/h3_nft0m_pt_nch"), nCh, ptCh, nFT0M, wghtCh); + hist.fill(HIST("QA/after/h2_pt_nch_prof"), nCh, ptCh, wghtCh); + fillBeforePIDQAHistos(track); if (cfgRejTrk == true && rejectTracks(track)) { return; } - if (cfgInvMass == true && invMassGamma < cfgGammaCut) { - continue; - } - - eta = track.eta(); - if (cfgPDGCodeOnly == true) { - if (std::abs(pid) == kPiPlus && std::abs(rapPi) < cfgCutRap && track.pt() >= cfgCutPiPtMin) { + if (cfgSelOld) { + if (selPi(track)) { ptPi = track.pt(); - fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, cfgEffPtPi, false, false, cfgEffPtYPi, false, false, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi); - fillPtMCHist(ptPi, eta, rapPi, nFT0M, pid, kPiPlus, kPiMinus); - } - - if (std::abs(pid) == kKPlus && std::abs(rapKa) < cfgCutRap && track.pt() >= cfgCutKaPtMin) { - ptKa = track.pt(); - fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, false, cfgEffPtKa, false, false, cfgEffPtYKa, false, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka); - fillPtMCHist(ptKa, eta, rapKa, nFT0M, pid, kKPlus, kKMinus); + fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, hEffPtPi, hPurePtPi, hEffPtRapPi, hEffPtEtaPi, cfgEffPtId, cfgEffPtYId, cfgEffPtEtaId, cfgPurityId, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi, wghtPi); + if (std::abs(pid) == kPiPlus) { + fillPtMCHist(ptPi, eta, rapPi, nFT0M, pid, kPiPlus, kPiMinus); + } } - - if (std::abs(pid) == kProton && std::abs(rapPr) < cfgCutRap && track.pt() >= cfgCutPrPtMin) { - ptPr = track.pt(); - fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, false, false, cfgEffPtPr, false, false, cfgEffPtYPr, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr); - fillPtMCHist(ptPr, eta, rapPr, nFT0M, pid, kProton, kProtonBar); + } else if (cfgSelNew) { + if (selCirPi(track)) { + ptPi = track.pt(); + fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, hEffPtPi, hPurePtPi, hEffPtRapPi, hEffPtEtaPi, cfgEffPtId, cfgEffPtYId, cfgEffPtEtaId, cfgPurityId, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi, wghtPi); + if (std::abs(pid) == kPiPlus) { + fillPtMCHist(ptPi, eta, rapPi, nFT0M, pid, kPiPlus, kPiMinus); + } } } - if (cfgPidCut == true) { - if (cfgSelOR == true && cfgSelAND == false) { - if (selLowPi(track) == cfgSelLow || selHighPi(track) == cfgSelHigh) { - ptPi = track.pt(); - fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, cfgEffPtPi, false, false, cfgEffPtYPi, false, false, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi); - if (std::abs(pid) == kPiPlus) { - fillPtMCHist(ptPi, eta, rapPi, nFT0M, pid, kPiPlus, kPiMinus); - } - } - } else if (cfgSelOR == false && cfgSelAND == true) { - if (selLowPi(track) == cfgSelLow && selHighPi(track) == cfgSelHigh) { - ptPi = track.pt(); - fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, cfgEffPtPi, false, false, cfgEffPtYPi, false, false, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi); - if (std::abs(pid) == kPiPlus) { - fillPtMCHist(ptPi, eta, rapPi, nFT0M, pid, kPiPlus, kPiMinus); - } + if (cfgSelOld) { + if (selKa(track)) { + ptKa = track.pt(); + fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, hEffPtKa, hPurePtKa, hEffPtRapKa, hEffPtEtaKa, cfgEffPtId, cfgEffPtYId, cfgEffPtEtaId, cfgPurityId, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka, wghtKa); + if (std::abs(pid) == kKPlus) { + fillPtMCHist(ptKa, eta, rapKa, nFT0M, pid, kKPlus, kKMinus); } } - - if (cfgSelOR == true && cfgSelAND == false) { - if (selLowKa(track) == cfgSelLow || selHighKa(track) == cfgSelHigh) { - ptKa = track.pt(); - fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, false, cfgEffPtKa, false, false, cfgEffPtYKa, false, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka); - if (std::abs(pid) == kKPlus) { - fillPtMCHist(ptKa, eta, rapKa, nFT0M, pid, kKPlus, kKMinus); - } - } - } else if (cfgSelOR == false && cfgSelAND == true) { - if (selLowKa(track) == cfgSelLow && selHighKa(track) == cfgSelHigh) { - ptKa = track.pt(); - fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, false, cfgEffPtKa, false, false, cfgEffPtYKa, false, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka); - if (std::abs(pid) == kKPlus) { - fillPtMCHist(ptKa, eta, rapKa, nFT0M, pid, kKPlus, kKMinus); - } + } else if (cfgSelNew) { + if (selCirKa(track)) { + ptKa = track.pt(); + fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, hEffPtKa, hPurePtKa, hEffPtRapKa, hEffPtEtaKa, cfgEffPtId, cfgEffPtYId, cfgEffPtEtaId, cfgPurityId, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka, wghtKa); + if (std::abs(pid) == kKPlus) { + fillPtMCHist(ptKa, eta, rapKa, nFT0M, pid, kKPlus, kKMinus); } } + } - if (cfgSelOR == true && cfgSelAND == false) { - if (selLowPr(track) == cfgSelLow || selHighPr(track) == cfgSelHigh) { - ptPr = track.pt(); - fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, false, false, cfgEffPtPr, false, false, cfgEffPtYPr, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr); - if (std::abs(pid) == kProton) { - fillPtMCHist(ptPr, eta, rapPr, nFT0M, pid, kProton, kProtonBar); - } + if (cfgSelOld) { + if (selPr(track)) { + ptPr = track.pt(); + fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, hEffPtPr, hPurePtPr, hEffPtRapPr, hEffPtEtaPr, cfgEffPtId, cfgEffPtYId, cfgEffPtEtaId, cfgPurityId, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr, wghtPr); + if (std::abs(pid) == kProton) { + fillPtMCHist(ptPr, eta, rapPr, nFT0M, pid, kProton, kProtonBar); } - } else if (cfgSelOR == false && cfgSelAND == true) { - if (selLowPr(track) == cfgSelLow && selHighPr(track) == cfgSelHigh) { - ptPr = track.pt(); - fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, false, false, cfgEffPtPr, false, false, cfgEffPtYPr, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr); - if (std::abs(pid) == kProton) { - fillPtMCHist(ptPr, eta, rapPr, nFT0M, pid, kProton, kProtonBar); - } + } + } else if (cfgSelNew) { + if (selCirPr(track)) { + ptPr = track.pt(); + fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, hEffPtPr, hPurePtPr, hEffPtRapPr, hEffPtEtaPr, cfgEffPtId, cfgEffPtYId, cfgEffPtEtaId, cfgPurityId, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr, wghtPr); + if (std::abs(pid) == kProton) { + fillPtMCHist(ptPr, eta, rapPr, nFT0M, pid, kProton, kProtonBar); } } } @@ -1200,161 +1217,48 @@ struct MeanPtFlucId { hist.fill(HIST("Gen/Charged/h2_PtTruth_Eta"), mcPart.eta(), mcPart.pt()); hist.fill(HIST("Gen/Charged/h_EtaTruth"), mcPart.eta()); hist.fill(HIST("Gen/Charged/h_PhiTruth"), mcPart.phi()); - } - - if (std::abs(mcPart.y()) > cfgCutRap) { - continue; - } - if (std::abs(pid) == kPiPlus && mcPart.pt() >= cfgCutPiPtMin) { - etaSim = mcPart.eta(); - rapSim = mcPart.y(); - - if (cfgSelOR == true && cfgSelAND == false) { - if (mcPart.p() <= cfgCutPiThrsldP || mcPart.p() > cfgCutPiThrsldP) { - nPiSim++; - ptPiSim = mcPart.pt(); - moments(ptPiSim, 1.0, q1PiSim, q2PiSim, q3PiSim, q4PiSim); - fillPtMCHist(ptPiSim, etaSim, rapSim, nFT0M, pid, kPiPlus, kPiMinus); - } - } else if (cfgSelOR == false && cfgSelAND == true) { - if ((cfgSelLow == true && mcPart.p() <= cfgCutPiThrsldP) && (cfgSelHigh == true && mcPart.p() > cfgCutPiThrsldP)) { - nPiSim++; - ptPiSim = mcPart.pt(); - moments(ptPiSim, 1.0, q1PiSim, q2PiSim, q3PiSim, q4PiSim); - fillPtMCHist(ptPiSim, etaSim, rapSim, nFT0M, pid, kPiPlus, kPiMinus); - } + hist.fill(HIST("Gen/Charged/h2_pt_nch"), nChSim, mcPart.pt()); + hist.fill(HIST("Gen/Charged/h3_nft0m_pt_nch"), nChSim, mcPart.pt(), nFT0M); + hist.fill(HIST("Gen/Charged/h2_pt_nch_prof"), nChSim, mcPart.pt()); + + if (std::abs(pid) == kPiPlus && mcPart.pt() >= cfgCutPiPtMin) { + etaSim = mcPart.eta(); + rapSim = mcPart.y(); + nPiSim++; + ptPiSim = mcPart.pt(); + moments(ptPiSim, 1.0, q1PiSim, q2PiSim, q3PiSim, q4PiSim); + fillPtMCHist(ptPiSim, etaSim, rapSim, nFT0M, pid, kPiPlus, kPiMinus); + + hist.fill(HIST("Gen/Pion/h_PhiTruth"), mcPart.phi()); + hist.fill(HIST("Gen/Pion/h2_pt_nch"), nPiSim, mcPart.pt()); + hist.fill(HIST("Gen/Pion/h3_nft0m_pt_nch"), nPiSim, mcPart.pt(), nFT0M); + hist.fill(HIST("Gen/Pion/h2_pt_nch_prof"), nPiSim, mcPart.pt()); } - hist.fill(HIST("Gen/Pion/h_PhiTruth"), mcPart.phi()); - } - if (std::abs(pid) == kKPlus && mcPart.pt() >= cfgCutKaPtMin) { - if (cfgSelOR == true && cfgSelAND == false) { - if ((cfgSelLow == true && mcPart.p() <= cfgCutPiThrsldP) || (cfgSelHigh == true && mcPart.p() > cfgCutPiThrsldP)) { - nKaSim++; - ptKaSim = mcPart.pt(); - moments(ptKaSim, 1.0, q1KaSim, q2KaSim, q3KaSim, q4KaSim); - fillPtMCHist(ptKaSim, etaSim, rapSim, nFT0M, pid, kKPlus, kKMinus); - } - } else if (cfgSelOR == false && cfgSelAND == true) { - if ((cfgSelLow == true && mcPart.p() <= cfgCutKaThrsldP) && (cfgSelHigh == true && mcPart.p() > cfgCutKaThrsldP)) { - nKaSim++; - ptKaSim = mcPart.pt(); - moments(ptKaSim, 1.0, q1KaSim, q2KaSim, q3KaSim, q4KaSim); - fillPtMCHist(ptKaSim, etaSim, rapSim, nFT0M, pid, kKPlus, kKMinus); - } - } - hist.fill(HIST("Gen/Kaon/h_PhiTruth"), mcPart.phi()); - } + if (std::abs(pid) == kKPlus && mcPart.pt() >= cfgCutKaPtMin) { + nKaSim++; + ptKaSim = mcPart.pt(); + moments(ptKaSim, 1.0, q1KaSim, q2KaSim, q3KaSim, q4KaSim); + fillPtMCHist(ptKaSim, etaSim, rapSim, nFT0M, pid, kKPlus, kKMinus); - if (std::abs(pid) == kProton && mcPart.pt() >= cfgCutPrPtMin) { - if (cfgSelOR == true && cfgSelAND == false) { - if ((cfgSelLow == true && mcPart.p() <= cfgCutPrThrsldP) || (cfgSelHigh == true && mcPart.p() > cfgCutPrThrsldP)) { - nPrSim++; - ptPrSim = mcPart.pt(); - moments(ptPrSim, 1.0, q1PrSim, q2PrSim, q3PrSim, q4PrSim); - fillPtMCHist(ptPrSim, etaSim, rapSim, nFT0M, pid, kProton, kProtonBar); - } - } else if (cfgSelOR == false && cfgSelAND == true) { - if ((cfgSelLow == true && mcPart.p() <= cfgCutPrThrsldP) && (cfgSelHigh == true && mcPart.p() > cfgCutPrThrsldP)) { - nPrSim++; - ptPrSim = mcPart.pt(); - moments(ptPrSim, 1.0, q1PrSim, q2PrSim, q3PrSim, q4PrSim); - fillPtMCHist(ptPrSim, etaSim, rapSim, nFT0M, pid, kProton, kProtonBar); - } + hist.fill(HIST("Gen/Kaon/h_PhiTruth"), mcPart.phi()); + hist.fill(HIST("Gen/Kaon/h2_pt_nch"), nKaSim, mcPart.pt()); + hist.fill(HIST("Gen/Kaon/h3_nft0m_pt_nch"), nKaSim, mcPart.pt(), nFT0M); + hist.fill(HIST("Gen/Kaon/h2_pt_nch_prof"), nKaSim, mcPart.pt()); } - hist.fill(HIST("Gen/Proton/h_PhiTruth"), mcPart.phi()); - } - } - } - ////////////////////////////////////////////////////////////////////////////////////////////////////////////// + if (std::abs(pid) == kProton && mcPart.pt() >= cfgCutPrPtMin) { + nPrSim++; + ptPrSim = mcPart.pt(); + moments(ptPrSim, 1.0, q1PrSim, q2PrSim, q3PrSim, q4PrSim); + fillPtMCHist(ptPrSim, etaSim, rapSim, nFT0M, pid, kProton, kProtonBar); - for (const auto& track : tracks) { - if (!track.has_mcParticle()) { - LOGF(warning, "No MC Particle for this track, skip..."); - continue; - } - auto mcPart = track.mcParticle(); - int pid = mcPart.pdgCode(); - if (!mcPart.isPhysicalPrimary()) { - continue; - } - - double rapPi = track.rapidity(MassPiPlus); - double rapKa = track.rapidity(MassKPlus); - double rapPr = track.rapidity(MassProton); - - if (selTrack(track)) { - if (std::abs(track.eta()) < 0.8) { - double pt = track.pt(); - wghtCh = getCorrectedWeight(pt, 0.0, cfgEffPtCh, false, false, false, false, false, false); - hist.fill(HIST("QA/after/h2_pt_nch"), nCh, pt, wghtCh); - hist.fill(HIST("QA/after/h3_nft0m_pt_nch"), nCh, pt, nFT0M, wghtCh); - hist.fill(HIST("QA/after/h2_pt_nch_prof"), nCh, pt, wghtCh); - } - - if (selLowPi(track) == cfgSelLow || selHighPi(track) == cfgSelHigh) { - ptPi = track.pt(); - wghtPi = getCorrectedWeight(ptPi, rapPi, false, cfgEffPtPi, false, false, cfgEffPtYPi, false, false); - hist.fill(HIST("QA/Pion/h2_pt_nch"), nPi, ptPi, wghtPi); - hist.fill(HIST("QA/Pion/h3_nft0m_pt_nch"), nPi, ptPi, nFT0M, wghtPi); - hist.fill(HIST("QA/Pion/h2_pt_nch_prof"), nPi, ptPi, wghtPi); - } - - if (selLowKa(track) == cfgSelLow || selHighKa(track) == cfgSelHigh) { - ptKa = track.pt(); - wghtKa = getCorrectedWeight(ptKa, rapKa, false, false, cfgEffPtKa, false, false, cfgEffPtYKa, false); - hist.fill(HIST("QA/Kaon/h2_pt_nch"), nKa, ptKa, wghtKa); - hist.fill(HIST("QA/Kaon/h3_nft0m_pt_nch"), nKa, ptKa, nFT0M, wghtKa); - hist.fill(HIST("QA/Kaon/h2_pt_nch_prof"), nKa, ptKa, wghtKa); - } - - if (selLowPr(track) == cfgSelLow || selHighPr(track) == cfgSelHigh) { - ptPr = track.pt(); - wghtPr = getCorrectedWeight(ptPr, rapPr, false, false, false, cfgEffPtPr, false, false, cfgEffPtYPr); - hist.fill(HIST("QA/Proton/h2_pt_nch"), nPr, ptPr, wghtPr); - hist.fill(HIST("QA/Proton/h3_nft0m_pt_nch"), nPr, ptPr, nFT0M, wghtPr); - hist.fill(HIST("QA/Proton/h2_pt_nch_prof"), nPr, ptPr, wghtPr); - } - } - - auto charge = 0.; - auto* pd = pdg->GetParticle(pid); - if (pd != nullptr) { - charge = pd->Charge(); - } - if (std::fabs(charge) < 1e-3) { - continue; - } - if (std::abs(pid) != kElectron && std::abs(pid) != kMuonMinus && std::abs(pid) != kPiPlus && std::abs(pid) != kKPlus && std::abs(pid) != kProton) { - continue; - } - if (mcPart.pt() > cfgCutPtMin && mcPart.pt() < cfgCutPtMax) { - if (std::abs(mcPart.eta()) < 0.8) { - double pt = mcPart.pt(); - hist.fill(HIST("Gen/Charged/h2_pt_nch"), nChSim, pt); - hist.fill(HIST("Gen/Charged/h3_nft0m_pt_nch"), nChSim, pt, nFT0M); - hist.fill(HIST("Gen/Charged/h2_pt_nch_prof"), nChSim, pt); - } - - if (std::abs(mcPart.y()) >= 0.5) - continue; - - if (std::abs(pid) == kPiPlus && mcPart.pt() >= cfgCutPiPtMin) { - hist.fill(HIST("Gen/Pion/h2_pt_nch"), nPiSim, mcPart.pt()); - hist.fill(HIST("Gen/Pion/h3_nft0m_pt_nch"), nPiSim, mcPart.pt(), nFT0M); - hist.fill(HIST("Gen/Pion/h2_pt_nch_prof"), nPiSim, mcPart.pt()); - } - if (std::abs(pid) == kKPlus && mcPart.pt() >= cfgCutKaPtMin) { - hist.fill(HIST("Gen/Kaon/h2_pt_nch"), nKaSim, mcPart.pt()); - hist.fill(HIST("Gen/Kaon/h3_nft0m_pt_nch"), nKaSim, mcPart.pt(), nFT0M); - hist.fill(HIST("Gen/Kaon/h2_pt_nch_prof"), nKaSim, mcPart.pt()); - } - if (std::abs(pid) == kProton && mcPart.pt() >= cfgCutPrPtMin) { - hist.fill(HIST("Gen/Proton/h2_pt_nch"), nPrSim, mcPart.pt()); - hist.fill(HIST("Gen/Proton/h3_nft0m_pt_nch"), nPrSim, mcPart.pt(), nFT0M); - hist.fill(HIST("Gen/Proton/h2_pt_nch_prof"), nPrSim, mcPart.pt()); + hist.fill(HIST("Gen/Proton/h_PhiTruth"), mcPart.phi()); + hist.fill(HIST("Gen/Proton/h2_pt_nch"), nPrSim, mcPart.pt()); + hist.fill(HIST("Gen/Proton/h3_nft0m_pt_nch"), nPrSim, mcPart.pt(), nFT0M); + hist.fill(HIST("Gen/Proton/h2_pt_nch_prof"), nPrSim, mcPart.pt()); + } } } } From 44888c58d4a15a74f3416ec80133a9b916e6b0bf Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Tue, 11 Mar 2025 11:27:28 +0900 Subject: [PATCH 0642/1650] [PWGEM/PhotonMeson] fix to process function names (#10434) --- PWGEM/PhotonMeson/TableProducer/createEMEventPhoton.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PWGEM/PhotonMeson/TableProducer/createEMEventPhoton.cxx b/PWGEM/PhotonMeson/TableProducer/createEMEventPhoton.cxx index 25f1c73533e..cba68536ddb 100644 --- a/PWGEM/PhotonMeson/TableProducer/createEMEventPhoton.cxx +++ b/PWGEM/PhotonMeson/TableProducer/createEMEventPhoton.cxx @@ -229,17 +229,17 @@ struct CreateEMEventPhoton { } PROCESS_SWITCH(CreateEMEventPhoton, processEventJJMC, "process event info", false); - void procesEeventCent(MyCollisionsCent const& collisions, MyBCs const& bcs) + void processEvent_Cent(MyCollisionsCent const& collisions, MyBCs const& bcs) { skimEvent(collisions, bcs); } - PROCESS_SWITCH(CreateEMEventPhoton, procesEeventCent, "process event info", false); + PROCESS_SWITCH(CreateEMEventPhoton, processEvent_Cent, "process event info", false); - void processEventCent_Qvec(MyCollisionsCentQvec const& collisions, MyBCs const& bcs) + void processEvent_Cent_Qvec(MyCollisionsCentQvec const& collisions, MyBCs const& bcs) { skimEvent(collisions, bcs); } - PROCESS_SWITCH(CreateEMEventPhoton, processEventCent_Qvec, "process event info", false); + PROCESS_SWITCH(CreateEMEventPhoton, processEvent_Cent_Qvec, "process event info", false); void processEventMC_Cent(MyCollisionsMCCent const& collisions, MyBCs const& bcs) { From 1876d1b0d59cd9710cafcfb344f7bc2ee5020165 Mon Sep 17 00:00:00 2001 From: sangwoo <141385263+sangwoo184@users.noreply.github.com> Date: Tue, 11 Mar 2025 14:21:16 +0900 Subject: [PATCH 0643/1650] [PWGLF] Add test code using kaon instead of pion (#10431) Co-authored-by: sangwoo --- PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx | 113 +++++++++++++------ 1 file changed, 79 insertions(+), 34 deletions(-) diff --git a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx index fe6b08d9e19..a1c2ebf3f8c 100644 --- a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx +++ b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx @@ -13,6 +13,7 @@ /// \brief f0980 resonance analysis in PbPb collisions /// \author Junlee Kim (jikim1290@gmail.com) +#include #include #include #include @@ -140,7 +141,8 @@ struct f0980pbpbanalysis { double relPhi; double relPhiRot; - double massPi = o2::constants::physics::MassPionCharged; + // double massPi = o2::constants::physics::MassPionCharged; + double massPtl; TRandom* rn = new TRandom(); // float theta2; @@ -150,7 +152,7 @@ struct f0980pbpbanalysis { Filter cutDCAFilter = (nabs(aod::track::dcaXY) < cfgMaxDCArToPVcut) && (nabs(aod::track::dcaZ) < cfgMaxDCAzToPVcut); using EventCandidates = soa::Filtered>; - using TrackCandidates = soa::Filtered>; + using TrackCandidates = soa::Filtered>; template int getDetId(const T& name) @@ -262,8 +264,7 @@ struct f0980pbpbanalysis { if (std::fabs(track.tpcNSigmaPi()) > cMaxTPCnSigmaPionS) { return 0; } - } - if (cfgSelectType == 1) { + } else if (cfgSelectType == 1) { if (cfgUSETOF) { if (track.hasTOF()) { if (std::fabs(track.tofNSigmaPi()) > cMaxTOFnSigmaPion) { @@ -282,11 +283,49 @@ struct f0980pbpbanalysis { return 0; } } + } else if (cfgSelectType == 2) { + if (cfgUSETOF) { + if (track.hasTOF()) { + if (std::fabs(track.tofNSigmaKa()) > 3) { + return 0; + } + if (std::fabs(track.tpcNSigmaKa()) > 3) { + return 0; + } + } else { + if (std::fabs(track.tpcNSigmaKa()) > 3) { + return 0; + } + } + } else { + if (std::fabs(track.tpcNSigmaKa()) > 3) { + return 0; + } + } } - return 1; } + template + float getTpcNSigma(const TrackType track) + { + if (cfgSelectType == 2) { + return track.tpcNSigmaKa(); + } else { + return track.tpcNSigmaPi(); + } + } + + template + float getTofNSigma(const TrackType track) + { + if (cfgSelectType == 2) { + return track.tofNSigmaKa(); + } else { + return track.tofNSigmaPi(); + } + } + template void fillHistograms(const CollisionType& collision, const TracksType& dTracks, int nmode) @@ -314,9 +353,9 @@ struct f0980pbpbanalysis { continue; } - histos.fill(HIST("QA/Nsigma_TPC"), trk1.pt(), trk1.tpcNSigmaPi()); - histos.fill(HIST("QA/Nsigma_TOF"), trk1.pt(), trk1.tofNSigmaPi()); - histos.fill(HIST("QA/TPC_TOF"), trk1.tpcNSigmaPi(), trk1.tofNSigmaPi()); + histos.fill(HIST("QA/Nsigma_TPC"), trk1.pt(), getTpcNSigma(trk1)); + histos.fill(HIST("QA/Nsigma_TOF"), trk1.pt(), getTofNSigma(trk1)); + histos.fill(HIST("QA/TPC_TOF"), getTpcNSigma(trk1), getTofNSigma(trk1)); for (const auto& trk2 : dTracks) { if (!trackSelected(trk2)) { @@ -329,13 +368,13 @@ struct f0980pbpbanalysis { } if (trk1.index() == trk2.index()) { - histos.fill(HIST("QA/Nsigma_TPC_selected"), trk1.pt(), trk1.tpcNSigmaPi()); - histos.fill(HIST("QA/Nsigma_TOF_selected"), trk1.pt(), trk1.tofNSigmaPi()); - histos.fill(HIST("QA/TPC_TOF_selected"), trk1.tpcNSigmaPi(), trk1.tofNSigmaPi()); + histos.fill(HIST("QA/Nsigma_TPC_selected"), trk1.pt(), getTpcNSigma(trk2)); + histos.fill(HIST("QA/Nsigma_TOF_selected"), trk1.pt(), getTofNSigma(trk2)); + histos.fill(HIST("QA/TPC_TOF_selected"), getTpcNSigma(trk2), getTofNSigma(trk2)); } - pion1.SetXYZM(trk1.px(), trk1.py(), trk1.pz(), massPi); - pion2.SetXYZM(trk2.px(), trk2.py(), trk2.pz(), massPi); + pion1.SetXYZM(trk1.px(), trk1.py(), trk1.pz(), massPtl); + pion2.SetXYZM(trk2.px(), trk2.py(), trk2.pz(), massPtl); reco = pion1 + pion2; if (reco.Rapidity() > cfgMaxRap || reco.Rapidity() < cfgMinRap) { @@ -356,7 +395,7 @@ struct f0980pbpbanalysis { for (int nr = 0; nr < cfgNRotBkg; nr++) { auto randomPhi = rn->Uniform(o2::constants::math::PI * 5.0 / 6.0, o2::constants::math::PI * 7.0 / 6.0); randomPhi += pion2.Phi(); - pion2Rot.SetXYZM(pion2.Pt() * std::cos(randomPhi), pion2.Pt() * std::sin(randomPhi), trk2.pz(), massPi); + pion2Rot.SetXYZM(pion2.Pt() * std::cos(randomPhi), pion2.Pt() * std::sin(randomPhi), trk2.pz(), massPtl); recoRot = pion1 + pion2Rot; relPhiRot = TVector2::Phi_0_2pi((recoRot.Phi() - eventPlaneDet) * static_cast(nmode)); histos.fill(HIST("hInvMass_f0980_USRot_EPA"), recoRot.M(), recoRot.Pt(), centrality, relPhiRot); @@ -369,28 +408,28 @@ struct f0980pbpbanalysis { void init(o2::framework::InitContext&) { AxisSpec epAxis = {6, 0.0, 2.0 * o2::constants::math::PI}; - AxisSpec centQaAxis = {110, 0, 110}; - AxisSpec vzQaAxis = {100, -20, 20}; - AxisSpec PIDqaAxis = {100, -10, 10}; - AxisSpec pTqaAxis = {200, 0, 20}; - AxisSpec epQaAxis = {100, -1.0 * o2::constants::math::PI, o2::constants::math::PI}; + AxisSpec qaCentAxis = {110, 0, 110}; + AxisSpec qaVzAxis = {100, -20, 20}; + AxisSpec qaPIDAxis = {100, -10, 10}; + AxisSpec qaPtAxis = {200, 0, 20}; + AxisSpec qaEpAxis = {100, -1.0 * o2::constants::math::PI, o2::constants::math::PI}; AxisSpec epresAxis = {102, -1.02, 1.02}; - histos.add("QA/CentDist", "", {HistType::kTH1F, {centQaAxis}}); - histos.add("QA/Vz", "", {HistType::kTH1F, {vzQaAxis}}); + histos.add("QA/CentDist", "", {HistType::kTH1F, {qaCentAxis}}); + histos.add("QA/Vz", "", {HistType::kTH1F, {qaVzAxis}}); - histos.add("QA/Nsigma_TPC", "", {HistType::kTH2F, {pTqaAxis, PIDqaAxis}}); - histos.add("QA/Nsigma_TOF", "", {HistType::kTH2F, {pTqaAxis, PIDqaAxis}}); - histos.add("QA/TPC_TOF", "", {HistType::kTH2F, {PIDqaAxis, PIDqaAxis}}); + histos.add("QA/Nsigma_TPC", "", {HistType::kTH2F, {qaPtAxis, qaPIDAxis}}); + histos.add("QA/Nsigma_TOF", "", {HistType::kTH2F, {qaPtAxis, qaPIDAxis}}); + histos.add("QA/TPC_TOF", "", {HistType::kTH2F, {qaPIDAxis, qaPIDAxis}}); - histos.add("QA/Nsigma_TPC_selected", "", {HistType::kTH2F, {pTqaAxis, PIDqaAxis}}); - histos.add("QA/Nsigma_TOF_selected", "", {HistType::kTH2F, {pTqaAxis, PIDqaAxis}}); - histos.add("QA/TPC_TOF_selected", "", {HistType::kTH2F, {PIDqaAxis, PIDqaAxis}}); + histos.add("QA/Nsigma_TPC_selected", "", {HistType::kTH2F, {qaPtAxis, qaPIDAxis}}); + histos.add("QA/Nsigma_TOF_selected", "", {HistType::kTH2F, {qaPtAxis, qaPIDAxis}}); + histos.add("QA/TPC_TOF_selected", "", {HistType::kTH2F, {qaPIDAxis, qaPIDAxis}}); - histos.add("QA/EPhist", "", {HistType::kTH2F, {centQaAxis, epQaAxis}}); - histos.add("QA/EPResAB", "", {HistType::kTH2F, {centQaAxis, epresAxis}}); - histos.add("QA/EPResAC", "", {HistType::kTH2F, {centQaAxis, epresAxis}}); - histos.add("QA/EPResBC", "", {HistType::kTH2F, {centQaAxis, epresAxis}}); + histos.add("QA/EPhist", "", {HistType::kTH2F, {qaCentAxis, qaEpAxis}}); + histos.add("QA/EPResAB", "", {HistType::kTH2F, {qaCentAxis, epresAxis}}); + histos.add("QA/EPResAC", "", {HistType::kTH2F, {qaCentAxis, epresAxis}}); + histos.add("QA/EPResBC", "", {HistType::kTH2F, {qaCentAxis, epresAxis}}); histos.add("hInvMass_f0980_US_EPA", "unlike invariant mass", {HistType::kTHnSparseF, {massAxis, ptAxis, centAxis, epAxis}}); @@ -401,8 +440,8 @@ struct f0980pbpbanalysis { histos.add("hInvMass_f0980_USRot_EPA", "unlike invariant mass Rotation", {HistType::kTHnSparseF, {massAxis, ptAxis, centAxis, epAxis}}); // if (doprocessMCLight) { - // histos.add("MCL/hpT_f0980_GEN", "generated f0 signals", HistType::kTH1F, {pTqaAxis}); - // histos.add("MCL/hpT_f0980_REC", "reconstructed f0 signals", HistType::kTH3F, {massAxis, pTqaAxis, centAxis}); + // histos.add("MCL/hpT_f0980_GEN", "generated f0 signals", HistType::kTH1F, {qaPtAxis}); + // histos.add("MCL/hpT_f0980_REC", "reconstructed f0 signals", HistType::kTH3F, {massAxis, qaPtAxis, centAxis}); // } detId = getDetId(cfgQvecDetName); @@ -416,6 +455,12 @@ struct f0980pbpbanalysis { refBId = 5; } + if (cfgSelectType == 2) { + massPtl = o2::constants::physics::MassKaonCharged; + } else { + massPtl = o2::constants::physics::MassPionCharged; + } + fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x - 2.5*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); fMultPVCutLow->SetParameters(2834.66, -87.0127, 0.915126, -0.00330136, 332.513, -12.3476, 0.251663, -0.00272819, 1.12242e-05); fMultPVCutHigh = new TF1("fMultPVCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x + 2.5*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); @@ -443,7 +488,7 @@ struct f0980pbpbanalysis { histos.fill(HIST("QA/Vz"), collision.posZ(), 1.0); fillHistograms(collision, tracks, 2); // second order - }; + } PROCESS_SWITCH(f0980pbpbanalysis, processData, "Process Event for data", true); }; From 716cb1f59803e2c0d09656b66597213b546ef81e Mon Sep 17 00:00:00 2001 From: HANSEO PARK <53218370+hanseopark@users.noreply.github.com> Date: Tue, 11 Mar 2025 18:50:54 +0900 Subject: [PATCH 0644/1650] [PWGJE] Add validation function of heavy-flavour definition and fix response matrix (#10385) --- PWGJE/Tasks/jetTaggerHFQA.cxx | 96 ++++++++++++++++++++++++++++++++++- 1 file changed, 94 insertions(+), 2 deletions(-) diff --git a/PWGJE/Tasks/jetTaggerHFQA.cxx b/PWGJE/Tasks/jetTaggerHFQA.cxx index b2d1261e335..2f51f5e787f 100644 --- a/PWGJE/Tasks/jetTaggerHFQA.cxx +++ b/PWGJE/Tasks/jetTaggerHFQA.cxx @@ -59,6 +59,7 @@ struct JetTaggerHFQA { Configurable trackPtMax{"trackPtMax", 100.0, "maximum pT acceptance for tracks"}; Configurable trackDcaXYMax{"trackDcaXYMax", 1, "minimum DCA xy acceptance for tracks [cm]"}; Configurable trackDcaZMax{"trackDcaZMax", 2, "minimum DCA z acceptance for tracks [cm]"}; + Configurable maxDeltaR{"maxDeltaR", 0.25, "maximum distance of jet axis from flavour initiating parton"}; Configurable jetEtaMin{"jetEtaMin", -99.0, "minimum jet pseudorapidity"}; Configurable jetEtaMax{"jetEtaMax", 99.0, "maximum jet pseudorapidity"}; Configurable prongChi2PCAMin{"prongChi2PCAMin", 1, "minimum Chi2 PCA of decay length of prongs"}; @@ -155,6 +156,18 @@ struct JetTaggerHFQA { registry.add("h_impact_parameter_xyz", "", {HistType::kTH1F, {{axisImpactParameterXYZ}}}); registry.add("h_impact_parameter_xyz_significance", "", {HistType::kTH1F, {{axisImpactParameterXYZSignificance}}}); } + if (doprocessValFlavourDefMCD) { + registry.add("h2_flavour_dist_quark_flavour_dist_hadron", "", {HistType::kTH2F, {{axisJetFlavour}, {axisJetFlavour}}}); + registry.add("h2_flavour_const_quark_flavour_const_hadron", "", {HistType::kTH2F, {{axisJetFlavour}, {axisJetFlavour}}}); + registry.add("h2_flavour_const_hadron_flavour_dist_hadron", "", {HistType::kTH2F, {{axisJetFlavour}, {axisJetFlavour}}}); + registry.add("h2_flavour_const_quark_flavour_dist_quark", "", {HistType::kTH2F, {{axisJetFlavour}, {axisJetFlavour}}}); + } + if (doprocessValFlavourDefMCP) { + registry.add("h2_part_flavour_dist_quark_part_flavour_dist_hadron", "", {HistType::kTH2F, {{axisJetFlavour}, {axisJetFlavour}}}); + registry.add("h2_part_flavour_const_quark_part_flavour_const_hadron", "", {HistType::kTH2F, {{axisJetFlavour}, {axisJetFlavour}}}); + registry.add("h2_part_flavour_const_hadron_part_flavour_dist_hadron", "", {HistType::kTH2F, {{axisJetFlavour}, {axisJetFlavour}}}); + registry.add("h2_part_flavour_const_quark_part_flavour_dist_quark", "", {HistType::kTH2F, {{axisJetFlavour}, {axisJetFlavour}}}); + } if (doprocessIPsData) { registry.add("h_jet_pt", "", {HistType::kTH1F, {{axisJetPt}}}); registry.add("h_jet_eta", "", {HistType::kTH1F, {{axisEta}}}); @@ -443,6 +456,47 @@ struct JetTaggerHFQA { return true; } + template + void fillValidationFlavourDefMCD(T const& mcdjet, V const& tracks, W const& particles, X const& particlesPerColl, float eventWeight = 1.0) + { + float pTHat = 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); + if (mcdjet.pt() > pTHatMaxMCD * pTHat) { + return; + } + typename V::iterator hftrack; + int jetflavourConstQuark = jettaggingutilities::mcdJetFromHFShower(mcdjet, tracks, particles, maxDeltaR, true); + int jetflavourConstHadron = jettaggingutilities::mcdJetFromHFShower(mcdjet, tracks, particles, maxDeltaR, false); + int jetflavourDistQuark = -1; + int jetflavourDistHadron = -1; + for (auto const& mcpjet : mcdjet.template matchedJetGeo_as()) { + jetflavourDistQuark = jettaggingutilities::getJetFlavor(mcpjet, particlesPerColl); + jetflavourDistHadron = jettaggingutilities::getJetFlavorHadron(mcpjet, particlesPerColl); + } + if (jetflavourDistQuark < 0 || jetflavourDistHadron < 0) + return; + registry.fill(HIST("h2_flavour_dist_quark_flavour_dist_hadron"), jetflavourDistQuark, jetflavourDistHadron, eventWeight); + registry.fill(HIST("h2_flavour_const_quark_flavour_const_hadron"), jetflavourConstQuark, jetflavourConstHadron, eventWeight); + registry.fill(HIST("h2_flavour_const_hadron_flavour_dist_hadron"), jetflavourConstHadron, jetflavourDistHadron, eventWeight); + registry.fill(HIST("h2_flavour_const_quark_flavour_dist_quark"), jetflavourConstQuark, jetflavourDistQuark, eventWeight); + } + + template + void fillValidationFlavourDefMCP(T const& mcpjet, U const& particles, V const& particlesPerColl, float eventWeight = 1.0) + { + float pTHat = 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); + if (mcpjet.pt() > pTHatMaxMCP * pTHat) { + return; + } + int jetflavourConstQuark = jettaggingutilities::mcpJetFromHFShower(mcpjet, particles, maxDeltaR, true); + int jetflavourConstHadron = jettaggingutilities::mcpJetFromHFShower(mcpjet, particles, maxDeltaR, false); + int jetflavourDistQuark = jettaggingutilities::getJetFlavor(mcpjet, particlesPerColl); + int jetflavourDistHadron = jettaggingutilities::getJetFlavorHadron(mcpjet, particlesPerColl); + registry.fill(HIST("h2_part_flavour_dist_quark_part_flavour_dist_hadron"), jetflavourDistQuark, jetflavourDistHadron, eventWeight); + registry.fill(HIST("h2_part_flavour_const_quark_part_flavour_const_hadron"), jetflavourConstQuark, jetflavourConstHadron, eventWeight); + registry.fill(HIST("h2_part_flavour_const_hadron_part_flavour_dist_hadron"), jetflavourConstHadron, jetflavourDistHadron, eventWeight); + registry.fill(HIST("h2_part_flavour_const_quark_part_flavour_dist_quark"), jetflavourConstQuark, jetflavourDistQuark, eventWeight); + } + template void fillHistogramIPsData(T const& jet, U const& /*tracks*/) { @@ -1013,6 +1067,44 @@ struct JetTaggerHFQA { } PROCESS_SWITCH(JetTaggerHFQA, processTracksDca, "Fill inclusive tracks' imformation for data", false); + void processValFlavourDefMCD(soa::Filtered>::iterator const& collision, soa::Join const& mcdjets, soa::Join const& /*mcpjets*/, JetTagTracksMCD const& tracks, aod::JetParticles const& particles) + { + if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { + return; + } + for (auto const& mcdjet : mcdjets) { + auto const particlesPerColl = particles.sliceBy(particlesPerCollision, collision.mcCollisionId()); + if (!jetfindingutilities::isInEtaAcceptance(mcdjet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + if (!isAcceptedJet(mcdjet)) { + continue; + } + fillValidationFlavourDefMCD>(mcdjet, tracks, particles, particlesPerColl, mcdjet.eventWeight()); + } + } + PROCESS_SWITCH(JetTaggerHFQA, processValFlavourDefMCD, "to check the validation of jet-flavour definition when compared to distance for mcd jets", false); + + void processValFlavourDefMCP(soa::Join const& mcpjets, aod::JetParticles const& particles, aod::JetMcCollisions const&) + { + for (auto const& mcpjet : mcpjets) { + auto const particlesPerColl = particles.sliceBy(particlesPerCollision, mcpjet.globalIndex()); + if (!jetfindingutilities::isInEtaAcceptance(mcpjet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + if (!isAcceptedJet(mcpjet)) { + continue; + } + int eventWeight = mcpjet.eventWeight(); + float pTHat = 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); + if (mcpjet.pt() > pTHatMaxMCD * pTHat) { + return; + } + fillValidationFlavourDefMCP(mcpjet, particles, particlesPerColl); + } + } + PROCESS_SWITCH(JetTaggerHFQA, processValFlavourDefMCP, "to check the validation of jet-flavour definition when compared to distance for mcp jets", false); + void processIPsData(soa::Filtered::iterator const& collision, soa::Join const& jets, JetTagTracksData const& tracks) { if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { @@ -1119,7 +1211,7 @@ struct JetTaggerHFQA { if (!mcdjet.has_matchedJetGeo()) continue; for (auto const& mcpjet : mcdjet.template matchedJetGeo_as>()) { - registry.fill(HIST("h3_jet_pt_jet_pt_part_matchedgeo_flavour"), mcpjet.pt(), mcdjet.pt(), mcdjet.origin()); + registry.fill(HIST("h3_jet_pt_jet_pt_part_matchedgeo_flavour"), mcdjet.pt(), mcpjet.pt(), mcdjet.origin()); } if (!doprocessIPsMCD) fillHistogramIPsMCD(mcdjet, tracks); @@ -1150,7 +1242,7 @@ struct JetTaggerHFQA { if (mcpjet.pt() > pTHatMaxMCP * pTHat) { continue; } - registry.fill(HIST("h3_jet_pt_jet_pt_part_matchedgeo_flavour"), mcpjet.pt(), mcdjet.pt(), mcdjet.origin(), mcdjet.eventWeight()); + registry.fill(HIST("h3_jet_pt_jet_pt_part_matchedgeo_flavour"), mcdjet.pt(), mcpjet.pt(), mcdjet.origin(), mcdjet.eventWeight()); } if (!doprocessIPsMCDWeighted) fillHistogramIPsMCD(mcdjet, tracks, mcdjet.eventWeight()); From 5ed0d7d6538361d362219366482da8075bfb4a1f Mon Sep 17 00:00:00 2001 From: navneetkumar231295 <71565461+navneetkumar231295@users.noreply.github.com> Date: Tue, 11 Mar 2025 16:39:31 +0530 Subject: [PATCH 0645/1650] [PWGLF] PWG:LF To add the rotational background and other qa plots (#10438) Co-authored-by: Navneet --- .../Tasks/Resonances/chargedkstaranalysis.cxx | 42 ++++++++++++++++++- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx b/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx index bfc62a3841a..a1beb862cd6 100644 --- a/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx +++ b/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx @@ -124,6 +124,9 @@ struct chargedkstaranalysis { Configurable cInvMassEnd{"cInvMassEnd", 1.5, "Invariant mass end"}; Configurable cInvMassBins{"cInvMassBins", 900, "Invariant mass binning"}; + // Rapidity Cut + Configurable confRapidity{"confRapidity", 0.5, "Rapidity cut"}; + // Event mixing Configurable nEvtMixing{"nEvtMixing", 5, "Number of events to mix"}; ConfigurableAxis cfgvtxbins{"cfgvtxbins", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; @@ -140,6 +143,13 @@ struct chargedkstaranalysis { "Value of the TOF Nsigma cut"}; Configurable nsigmaCutCombined{"nsigmaCutCombined", 3.0, "Value of the Combined Nsigma cut"}; Configurable cfgNoMixedEvents{"cfgNoMixedEvents", 5, "Number of mixed events per event"}; + + // For rotational background + Configurable fillRotation{"fillRotation", true, "fill rotation"}; + Configurable confMinRot{"confMinRot", 5.0 * TMath::Pi() / 6.0, "Minimum of rotation"}; + Configurable confMaxRot{"confMaxRot", 7.0 * TMath::Pi() / 6.0, "Maximum of rotation"}; + Configurable nBkgRotations{"nBkgRotations", 9, "Number of rotated copies (background) per each original candidate"}; + void init(InitContext const&) { AxisSpec dcaxyAxisQA = {cDCABinsQA, 0.0, 3.0, "DCA_{#it{xy}} (cm)"}; @@ -208,9 +218,14 @@ struct chargedkstaranalysis { histos1.add("chargekstarMassPtMultPtUnlikeSign", "Invariant mass of CKS meson Unlike Sign", kTHnSparseF, {invMassAxis, ptAxis, centAxis}, true); + histos1.add("hSparseChargeKstarSameEventRotational", "hSparseChargeKstarSameEventRotational", HistType::kTHnSparseF, {invMassAxis, ptAxis, centAxis}, true); + histos1.add("chargekstarMassPtMultPtMixedEvent", "Invariant mass of CKS meson MixedEvent Sign", kTHnSparseF, {invMassAxis, ptAxis, centAxis}, true); + if (fillRotation) { + histos1.add("hRotation", "hRotation", kTH1F, {{360, 0.0, 2.0 * TMath::Pi()}}); + } } double massPi = o2::constants::physics::MassPionCharged; double massK0s = o2::constants::physics::MassK0Short; @@ -230,7 +245,7 @@ struct chargedkstaranalysis { // auto multiplicity = collision.cent(); auto multiplicity = collision.cent(); histos1.fill(HIST("QAbefore/collMult"), multiplicity); - TLorentzVector lDecayDaughter, lDecayV0, lResonance; + TLorentzVector lDecayDaughter, lDecayV0, lResonance, pionrot, chargekstarrot; for (const auto& track : dTracks) { // loop over all dTracks1 to find the bachelor pion auto trackId = track.index(); @@ -296,7 +311,7 @@ struct chargedkstaranalysis { histos1.fill(HIST("QAafter/hGoodTracksV0s"), 2.5); // Checking whether the mid-rapidity condition is met - if (std::abs(lResonance.Rapidity()) > 0.5) + if (std::abs(lResonance.Rapidity()) > confRapidity) continue; if constexpr (!IsMix) { histos1.fill(HIST("chargedkstarinvmassUlikeSign"), lResonance.M()); @@ -310,6 +325,29 @@ struct chargedkstaranalysis { histos1.fill(HIST("chargekstarMassPtMultPtMixedEvent"), lResonance.M(), lResonance.Pt(), multiplicity); } + + if constexpr (!IsMix) { + if (fillRotation) { + for (int nrotbkg = 0; nrotbkg < nBkgRotations; nrotbkg++) { + auto rotangle = TMath::Pi(); + if (nBkgRotations > 1) { + auto anglestart = confMinRot; + auto angleend = confMaxRot; + auto anglestep = (angleend - anglestart) / (1.0 * (nBkgRotations - 1)); + rotangle = anglestart + nrotbkg * anglestep; + } + histos1.fill(HIST("hRotation"), rotangle); + auto rotpionPx = lDecayDaughter.Px() * std::cos(rotangle) - lDecayDaughter.Py() * std::sin(rotangle); + auto rotpionPy = lDecayDaughter.Px() * std::sin(rotangle) + lDecayDaughter.Py() * std::cos(rotangle); + pionrot.SetXYZM(rotpionPx, rotpionPy, lDecayDaughter.Pz(), massPi); + chargekstarrot = pionrot + lDecayV0; + if (TMath::Abs(chargekstarrot.Rapidity()) > confRapidity) { + continue; + } + histos1.fill(HIST("hSparseChargeKstarSameEventRotational"), chargekstarrot.M(), chargekstarrot.Pt(), multiplicity); + } + } + } } } } From 87da5f130304b06614546d78e685cd5372e63a7c Mon Sep 17 00:00:00 2001 From: JimunLee Date: Tue, 11 Mar 2025 20:11:09 +0900 Subject: [PATCH 0646/1650] [PWGJE] : Added a switch for each histogram to reduce memory consumption (#10403) Co-authored-by: jimun_lee --- PWGJE/Tasks/phiInJets.cxx | 136 +++++++++++++++++++------------------- 1 file changed, 67 insertions(+), 69 deletions(-) diff --git a/PWGJE/Tasks/phiInJets.cxx b/PWGJE/Tasks/phiInJets.cxx index 3776cf284c1..672280fbab8 100644 --- a/PWGJE/Tasks/phiInJets.cxx +++ b/PWGJE/Tasks/phiInJets.cxx @@ -20,6 +20,7 @@ #include #include #include + #include #include "Framework/ASoA.h" @@ -80,6 +81,8 @@ struct phiInJets { Configurable cfgIsKstar{"cfgIsKstar", false, "Swaps Phi for Kstar analysis"}; Configurable cfgDataHists{"cfgDataHists", false, "Enables DataHists"}; Configurable cfgMCRecHists{"cfgMCRecHists", false, "Enables MCRecHists"}; + Configurable cfgMCRecMBHists{"cfgMCRecMBHists", false, "Enables MCRec MB Hists"}; + Configurable cfgMCRecInsideHists{"cfgMCRecInsideHists", false, "Enables MCRec Inside Hists"}; Configurable cfgMCGenHists{"cfgMCGenHists", false, "Enables MCGenHists"}; Configurable cfgMCGenMATCHEDHists{"cfgMCGenMATCHEDHists", false, "Enables MCGenMATCHEDHists"}; Configurable cfgMCRecMATCHEDHists{"cfgMCRecMATCHEDHists", false, "Enables MCRecMATCHEDHists"}; @@ -164,36 +167,24 @@ struct phiInJets { JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE_pt_v_eta", "hMCRec_nonmatch_hUSS_INSIDE_pt_v_eta", kTH2F, {PtAxis, axisEta}); JEhistos.add("JetVsPhi_REC", "JetVsPhi_REC", kTH2F, {{4000, 0., 200.}, {200, 0, 20.0}}); - JEhistos.add("hMCRecTrue_hUSS", "hMCRecTrue_hUSS", kTH3F, {dRAxis, PtAxis, MinvAxis}); - JEhistos.add("hMCRecTrue_hLSS", "hMCRecTrue_hLSS", kTH3F, {dRAxis, PtAxis, MinvAxis}); - - JEhistos.add("hMCRec_hUSS", "hMCRec_hUSS", kTH3F, {dRAxis, PtAxis, MinvAxis}); - JEhistos.add("hMCRec_hUSS_1D", "hMCRec_hUSS_1D", kTH1F, {MinvAxis}); - JEhistos.add("hMCRec_hUSS_1D_2_3", "hMCRec_hUSS_1D_2_3", kTH1F, {MinvAxis}); - - JEhistos.add("hMCRec_hLSS", "hMCRec_hLSS", kTH3F, {dRAxis, PtAxis, MinvAxis}); - JEhistos.add("hMCRec_hLSS_1D", "hMCRec_hLSS_1D", kTH1F, {MinvAxis}); - JEhistos.add("hMCRec_hLSS_1D_2_3", "hMCRec_hLSS_1D_2_3", kTH1F, {MinvAxis}); - - JEhistos.add("hMCRec_hUSS_INSIDE", "hMCRec_hUSS_INSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); - JEhistos.add("hMCRec_hUSS_INSIDE_1D", "hMCRec_hUSS_INSIDE_1D", kTH1F, {MinvAxis}); - JEhistos.add("hMCRec_hUSS_INSIDE_1D_2_3", "hMCRec_hUSS_INSIDE_1D_2_3", kTH1F, {MinvAxis}); - - JEhistos.add("hMCRec_hLSS_INSIDE", "hMCRec_hLSS_INSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); - JEhistos.add("hMCRec_hLSS_INSIDE_1D", "hMCRec_hLSS_INSIDE_1D", kTH1F, {MinvAxis}); - JEhistos.add("hMCRec_hLSS_INSIDE_1D_2_3", "hMCRec_hLSS_INSIDE_1D_2_3", kTH1F, {MinvAxis}); - - JEhistos.add("hMCRecTrue_hUSS_INSIDE", "hMCRecTrue_hUSS_INSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); - JEhistos.add("hMCRecTrue_hUSS_INSIDE_1D", "hMCRecTrue_hUSS_INSIDE_1D", kTH1F, {MinvAxis}); - JEhistos.add("hMCRecTrue_hUSS_INSIDE_1D_2_3", "hMCRecTrue_hUSS_INSIDE_1D_2_3", kTH1F, {MinvAxis}); - - JEhistos.add("hMCRecTrue_hLSS_INSIDE", "hMCRecTrue_hLSS_INSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); - JEhistos.add("hMCRecTrue_hLSS_INSIDE_1D", "hMCRecTrue_hLSS_INSIDE_1D", kTH1F, {MinvAxis}); - JEhistos.add("hMCRecTrue_hLSS_INSIDE_1D_2_3", "hMCRecTrue_hLSS_INSIDE_1D_2_3", kTH1F, {MinvAxis}); - - JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE", "hMCRec_nonmatch_hUSS_INSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); - JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE_1D", "hMCRec_nonmatch_hUSS_INSIDE_1D", kTH1F, {MinvAxis}); - JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE_1D_2_3", "hMCRec_nonmatch_hUSS_INSIDE_1D_2_3", kTH1F, {MinvAxis}); + // used for Minv closure tests + // MB + if (cfgMCRecMBHists) { + JEhistos.add("hMCRec_hUSS", "hMCRec_hUSS", kTH3F, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRec_hLSS", "hMCRec_hLSS", kTH3F, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRecTrue_hUSS", "hMCRecTrue_hUSS", kTH3F, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRecTrue_hLSS", "hMCRecTrue_hLSS", kTH3F, {dRAxis, PtAxis, MinvAxis}); + } + // INSIDE + if (cfgMCRecInsideHists) { + JEhistos.add("hMCRec_hUSS_INSIDE", "hMCRec_hUSS_INSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRec_hLSS_INSIDE", "hMCRec_hLSS_INSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRecTrue_hUSS_INSIDE", "hMCRecTrue_hUSS_INSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRecTrue_hLSS_INSIDE", "hMCRecTrue_hLSS_INSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE", "hMCRec_nonmatch_hUSS_INSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE_1D", "hMCRec_nonmatch_hUSS_INSIDE_1D", kTH1F, {MinvAxis}); + JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE_1D_2_3", "hMCRec_nonmatch_hUSS_INSIDE_1D_2_3", kTH1F, {MinvAxis}); + } } if (cfgMCGenHists) { @@ -723,10 +714,12 @@ struct phiInJets { //================== // 1.MB REC Closure //================== - if (originalTrack.sign() * originalTrack2.sign() < 0) { - JEhistos.fill(HIST("hMCRec_hUSS"), 1.0, lResonance.Pt(), lResonance.M()); - } else if (originalTrack.sign() * originalTrack2.sign() > 0) { - JEhistos.fill(HIST("hMCRec_hLSS"), 1.0, lResonance.Pt(), lResonance.M()); + if (cfgMCRecMBHists) { + if (originalTrack.sign() * originalTrack2.sign() < 0) { + JEhistos.fill(HIST("hMCRec_hUSS"), 1.0, lResonance.Pt(), lResonance.M()); + } else if (originalTrack.sign() * originalTrack2.sign() > 0) { + JEhistos.fill(HIST("hMCRec_hLSS"), 1.0, lResonance.Pt(), lResonance.M()); + } } //============================================ // 2.Check if particle is inside a jet or not @@ -766,14 +759,15 @@ struct phiInJets { //====================== // 3.INSIDE REC Closure //====================== - if (jetFlag) { - if (originalTrack.sign() * originalTrack2.sign() < 0) { - JEhistos.fill(HIST("hMCRec_hUSS_INSIDE"), 1.0, lResonance.Pt(), lResonance.M()); - } else if (originalTrack.sign() * originalTrack2.sign() > 0) { - JEhistos.fill(HIST("hMCRec_hLSS_INSIDE"), 1.0, lResonance.Pt(), lResonance.M()); + if (cfgMCRecInsideHists) { + if (jetFlag) { + if (originalTrack.sign() * originalTrack2.sign() < 0) { + JEhistos.fill(HIST("hMCRec_hUSS_INSIDE"), 1.0, lResonance.Pt(), lResonance.M()); + } else if (originalTrack.sign() * originalTrack2.sign() > 0) { + JEhistos.fill(HIST("hMCRec_hLSS_INSIDE"), 1.0, lResonance.Pt(), lResonance.M()); + } } } - // check PID if (track.has_mcParticle() && track2.has_mcParticle()) { auto part1 = track.mcParticle(); @@ -830,48 +824,52 @@ struct phiInJets { //===================== // 4.MB True Closure //===================== - if (originalTrack.sign() * originalTrack2.sign() < 0) { - JEhistos.fill(HIST("hMCRecTrue_hUSS"), 1.0, lResonance.Pt(), lResonance.M()); - } else if (originalTrack.sign() * originalTrack2.sign() > 0) { - JEhistos.fill(HIST("hMCRecTrue_hLSS"), 1.0, lResonance.Pt(), lResonance.M()); + if (cfgMCRecMBHists) { + if (originalTrack.sign() * originalTrack2.sign() < 0) { + JEhistos.fill(HIST("hMCRecTrue_hUSS"), 1.0, lResonance.Pt(), lResonance.M()); + } else if (originalTrack.sign() * originalTrack2.sign() > 0) { + JEhistos.fill(HIST("hMCRecTrue_hLSS"), 1.0, lResonance.Pt(), lResonance.M()); + } } - //=========================== // 5.INSIDE REC True Closure //=========================== - if (jetFlag) { - if (originalTrack.sign() * originalTrack2.sign() < 0) { - JEhistos.fill(HIST("hMCRecTrue_hUSS_INSIDE"), 1.0, lResonance.Pt(), lResonance.M()); - } else if (originalTrack.sign() * originalTrack2.sign() > 0) { - JEhistos.fill(HIST("hMCRecTrue_hLSS_INSIDE"), 1.0, lResonance.Pt(), lResonance.M()); + if (cfgMCRecInsideHists) { + if (jetFlag) { + if (originalTrack.sign() * originalTrack2.sign() < 0) { + JEhistos.fill(HIST("hMCRecTrue_hUSS_INSIDE"), 1.0, lResonance.Pt(), lResonance.M()); + } else if (originalTrack.sign() * originalTrack2.sign() > 0) { + JEhistos.fill(HIST("hMCRecTrue_hLSS_INSIDE"), 1.0, lResonance.Pt(), lResonance.M()); + } } } - if (lResonance.M() > 1.005 && lResonance.M() < 1.035) RealPhiCand++; // Now we do jets - if (cfgSingleJet) - if (goodjets > 1) - jetpt = DistinguishJetsMC(mcd_pt, mcd_phi, mcd_eta, lResonance); + if (cfgMCRecInsideHists) { + if (cfgSingleJet) + if (goodjets > 1) + jetpt = DistinguishJetsMC(mcd_pt, mcd_phi, mcd_eta, lResonance); - if (jetFlag) { - if (lResonance.M() > 1.005 && lResonance.M() < 1.035) - RealPhiCandInJet++; - JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_INSIDE_pt_v_eta"), lResonance.Pt(), lResonance.Eta()); - JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_INSIDE_1D"), lResonance.M()); - if (lResonance.Pt() > 2.0 && lResonance.Pt() < 3) - JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_INSIDE_1D_2_3"), lResonance.M()); - JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_INSIDE"), jetpt, lResonance.Pt(), lResonance.M()); - } + if (jetFlag) { + if (lResonance.M() > 1.005 && lResonance.M() < 1.035) + RealPhiCandInJet++; + JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_INSIDE_pt_v_eta"), lResonance.Pt(), lResonance.Eta()); + JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_INSIDE_1D"), lResonance.M()); + if (lResonance.Pt() > 2.0 && lResonance.Pt() < 3) + JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_INSIDE_1D_2_3"), lResonance.M()); + JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_INSIDE"), jetpt, lResonance.Pt(), lResonance.M()); + } - if (hasJets) { - JEhistos.fill(HIST("ptJEHistogramPhi_JetTrigger"), lResonance.Pt()); - auto triggerjet = std::min_element(mcd_pt.begin(), mcd_pt.end()); - double triggerjet_pt = *triggerjet; - JEhistos.fill(HIST("JetVsPhi_REC"), triggerjet_pt, lResonance.Pt()); + if (hasJets) { + JEhistos.fill(HIST("ptJEHistogramPhi_JetTrigger"), lResonance.Pt()); + auto triggerjet = std::min_element(mcd_pt.begin(), mcd_pt.end()); + double triggerjet_pt = *triggerjet; + JEhistos.fill(HIST("JetVsPhi_REC"), triggerjet_pt, lResonance.Pt()); + } + JEhistos.fill(HIST("minvJEHistogramPhi"), lResonance.M()); } - JEhistos.fill(HIST("minvJEHistogramPhi"), lResonance.M()); } // mcpart check } // tracks2 } // tracks1 From 4c26818b6827c698fb72f5cd109f9ff35554cec0 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Tue, 11 Mar 2025 20:30:20 +0900 Subject: [PATCH 0647/1650] [PWGEM/PhotonMeson] update TaggingPi0 (#10437) --- PWGEM/PhotonMeson/Core/DalitzEECut.cxx | 6 + PWGEM/PhotonMeson/Core/DalitzEECut.h | 14 +- PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h | 2 + PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h | 7 +- PWGEM/PhotonMeson/Core/TaggingPi0.h | 684 ++++++++++++++++++ PWGEM/PhotonMeson/Core/TaggingPi0MC.h | 581 +++++++++++++++ PWGEM/PhotonMeson/Tasks/CMakeLists.txt | 10 + .../Tasks/TaggingPi0MCPCMDalitzEE.cxx | 29 + .../Tasks/TaggingPi0PCMDalitzEE.cxx | 29 + PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx | 2 + PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx | 2 + PWGEM/PhotonMeson/Utils/MCUtilities.h | 6 +- 12 files changed, 1363 insertions(+), 9 deletions(-) create mode 100644 PWGEM/PhotonMeson/Core/TaggingPi0.h create mode 100644 PWGEM/PhotonMeson/Core/TaggingPi0MC.h create mode 100644 PWGEM/PhotonMeson/Tasks/TaggingPi0MCPCMDalitzEE.cxx create mode 100644 PWGEM/PhotonMeson/Tasks/TaggingPi0PCMDalitzEE.cxx diff --git a/PWGEM/PhotonMeson/Core/DalitzEECut.cxx b/PWGEM/PhotonMeson/Core/DalitzEECut.cxx index 6dd58b4a560..99ac9ee356a 100644 --- a/PWGEM/PhotonMeson/Core/DalitzEECut.cxx +++ b/PWGEM/PhotonMeson/Core/DalitzEECut.cxx @@ -111,6 +111,12 @@ void DalitzEECut::SetMeanClusterSizeITS(float min, float max) mMaxMeanClusterSizeITS = max; LOG(info) << "DalitzEE Cut, set mean cluster size ITS range: " << mMinMeanClusterSizeITS << " - " << mMaxMeanClusterSizeITS; } +void DalitzEECut::SetTrackDca3DRange(float min, float max) +{ + mMinDca3D = min; + mMaxDca3D = max; + LOG(info) << "DalitzEE Cut, set DCA 3D range in sigma: " << mMinDca3D << " - " << mMaxDca3D; +} void DalitzEECut::SetMaxDcaXY(float maxDcaXY) { mMaxDcaXY = maxDcaXY; diff --git a/PWGEM/PhotonMeson/Core/DalitzEECut.h b/PWGEM/PhotonMeson/Core/DalitzEECut.h index a757ca58fda..60dff1786d1 100644 --- a/PWGEM/PhotonMeson/Core/DalitzEECut.h +++ b/PWGEM/PhotonMeson/Core/DalitzEECut.h @@ -57,6 +57,7 @@ class DalitzEECut : public TNamed kTPCChi2NDF, kTPCNsigmaEl, kTPCNsigmaPi, + kDCA3Dsigma, kDCAxy, kDCAz, kITSNCls, @@ -125,6 +126,9 @@ class DalitzEECut : public TNamed if (!IsSelectedTrack(track, DalitzEECuts::kTrackEtaRange)) { return false; } + if (!IsSelectedTrack(track, DalitzEECuts::kDCA3Dsigma)) { + return false; + } if (!IsSelectedTrack(track, DalitzEECuts::kDCAxy)) { return false; } @@ -242,6 +246,9 @@ class DalitzEECut : public TNamed case DalitzEECuts::kTPCChi2NDF: return mMinChi2PerClusterTPC < track.tpcChi2NCl() && track.tpcChi2NCl() < mMaxChi2PerClusterTPC; + case DalitzEECuts::kDCA3Dsigma: + return mMinDca3D <= dca3DinSigma(track) && dca3DinSigma(track) <= mMaxDca3D; // in sigma for single leg + case DalitzEECuts::kDCAxy: return std::fabs(track.dcaXY()) <= ((mMaxDcaXYPtDep) ? mMaxDcaXYPtDep(track.pt()) : mMaxDcaXY); @@ -288,8 +295,9 @@ class DalitzEECut : public TNamed void RequireITSibAny(bool flag); void RequireITSib1st(bool flag); - void SetMaxDcaXY(float maxDcaXY); // in cm - void SetMaxDcaZ(float maxDcaZ); // in cm + void SetTrackDca3DRange(float min, float max); // in sigma + void SetMaxDcaXY(float maxDcaXY); // in cm + void SetMaxDcaZ(float maxDcaZ); // in cm void SetMaxDcaXYPtDep(std::function ptDepCut); void ApplyPrefilter(bool flag); void ApplyPhiV(bool flag); @@ -324,6 +332,8 @@ class DalitzEECut : public TNamed bool mRequireITSibAny{true}; bool mRequireITSib1st{false}; + float mMinDca3D{0.0f}; // min dca in 3D in units of sigma + float mMaxDca3D{1e+10}; // max dca in 3D in units of sigma float mMaxDcaXY{1.0f}; // max dca in xy plane float mMaxDcaZ{1.0f}; // max dca in z direction std::function mMaxDcaXYPtDep{}; // max dca in xy plane as function of pT diff --git a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h index 9b891be3fbf..601d805dcf4 100644 --- a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h +++ b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h @@ -177,6 +177,7 @@ struct Pi0EtaToGammaGamma { Configurable cfg_max_chi2its{"cfg_max_chi2its", 5.0, "max chi2/NclsITS"}; Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 0.05, "max dca XY for single track in cm"}; Configurable cfg_max_dcaz{"cfg_max_dcaz", 0.05, "max dca Z for single track in cm"}; + Configurable cfg_max_dca3dsigma_track{"cfg_max_dca3dsigma_track", 1.5, "max DCA 3D in sigma"}; Configurable cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 999.f, "max fraction of shared clusters in TPC"}; Configurable cfg_apply_cuts_from_prefilter_derived{"cfg_apply_cuts_from_prefilter_derived", false, "flag to apply prefilter to electron"}; @@ -396,6 +397,7 @@ struct Pi0EtaToGammaGamma { fDileptonCut.SetNClustersITS(dileptoncuts.cfg_min_ncluster_its, 7); fDileptonCut.SetMaxDcaXY(dileptoncuts.cfg_max_dcaxy); fDileptonCut.SetMaxDcaZ(dileptoncuts.cfg_max_dcaz); + fDileptonCut.SetTrackDca3DRange(0.f, dileptoncuts.cfg_max_dca3dsigma_track); // in sigma // for eID fDileptonCut.SetPIDScheme(dileptoncuts.cfg_pid_scheme); diff --git a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h index f9578ce6f14..50efdfa8ab1 100644 --- a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h +++ b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h @@ -166,6 +166,7 @@ struct Pi0EtaToGammaGammaMC { Configurable cfg_max_chi2its{"cfg_max_chi2its", 5.0, "max chi2/NclsITS"}; Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 0.05, "max dca XY for single track in cm"}; Configurable cfg_max_dcaz{"cfg_max_dcaz", 0.05, "max dca Z for single track in cm"}; + Configurable cfg_max_dca3dsigma_track{"cfg_max_dca3dsigma_track", 1.5, "max DCA 3D in sigma"}; Configurable cfg_apply_cuts_from_prefilter_derived{"cfg_apply_cuts_from_prefilter_derived", false, "flag to apply prefilter to electron"}; Configurable cfg_pid_scheme{"cfg_pid_scheme", static_cast(DalitzEECut::PIDSchemes::kTOFif), "pid scheme [kTOFif : 0, kTPConly : 1]"}; @@ -319,6 +320,7 @@ struct Pi0EtaToGammaGammaMC { // for track fV0PhotonCut.SetTrackPtRange(pcmcuts.cfg_min_pt_v0 * 0.4, 1e+10f); fV0PhotonCut.SetTrackEtaRange(-pcmcuts.cfg_max_eta_v0, +pcmcuts.cfg_max_eta_v0); + fV0PhotonCut.SetMinNClustersTPC(pcmcuts.cfg_min_ncluster_tpc); fV0PhotonCut.SetMinNCrossedRowsTPC(pcmcuts.cfg_min_ncrossedrows); fV0PhotonCut.SetMinNCrossedRowsOverFindableClustersTPC(0.8); fV0PhotonCut.SetMaxFracSharedClustersTPC(pcmcuts.cfg_max_frac_shared_clusters_tpc); @@ -358,6 +360,7 @@ struct Pi0EtaToGammaGammaMC { fDileptonCut.SetNClustersITS(dileptoncuts.cfg_min_ncluster_its, 7); fDileptonCut.SetMaxDcaXY(dileptoncuts.cfg_max_dcaxy); fDileptonCut.SetMaxDcaZ(dileptoncuts.cfg_max_dcaz); + fDileptonCut.SetTrackDca3DRange(0.f, dileptoncuts.cfg_max_dca3dsigma_track); // in sigma // for eID fDileptonCut.SetPIDScheme(dileptoncuts.cfg_pid_scheme); @@ -406,10 +409,6 @@ struct Pi0EtaToGammaGammaMC { Partition positrons = o2::aod::emprimaryelectron::sign > int8_t(0) && static_cast(dileptoncuts.cfg_min_pt_track) < o2::aod::track::pt&& nabs(o2::aod::track::eta) < static_cast(dileptoncuts.cfg_max_eta_track) && static_cast(dileptoncuts.cfg_min_TPCNsigmaEl) < o2::aod::pidtpc::tpcNSigmaEl&& o2::aod::pidtpc::tpcNSigmaEl < static_cast(dileptoncuts.cfg_max_TPCNsigmaEl); Partition electrons = o2::aod::emprimaryelectron::sign < int8_t(0) && static_cast(dileptoncuts.cfg_min_pt_track) < o2::aod::track::pt && nabs(o2::aod::track::eta) < static_cast(dileptoncuts.cfg_max_eta_track) && static_cast(dileptoncuts.cfg_min_TPCNsigmaEl) < o2::aod::pidtpc::tpcNSigmaEl && o2::aod::pidtpc::tpcNSigmaEl < static_cast(dileptoncuts.cfg_max_TPCNsigmaEl); - // Preslice perCollision_muon = aod::emprimarymuon::emeventId; - // Partition muons_pos = o2::aod::emprimarymuon::sign > int8_t(0) && static_cast(dileptoncuts.cfg_min_pt_track) < o2::aod::track::pt&& nabs(o2::aod::track::eta) < static_cast(dileptoncuts.cfg_max_eta_track) && static_cast(dileptoncuts.cfg_min_TPCNsigmaMu) < o2::aod::pidtpc::tpcNSigmaMu&& o2::aod::pidtpc::tpcNSigmaMu < static_cast(dileptoncuts.cfg_max_TPCNsigmaMu); - // Partition muons_neg = o2::aod::emprimarymuon::sign < int8_t(0) && static_cast(dileptoncuts.cfg_min_pt_track) < o2::aod::track::pt && nabs(o2::aod::track::eta) < static_cast(dileptoncuts.cfg_max_eta_track) && static_cast(dileptoncuts.cfg_min_TPCNsigmaMu) < o2::aod::pidtpc::tpcNSigmaMu && o2::aod::pidtpc::tpcNSigmaMu < static_cast(dileptoncuts.cfg_max_TPCNsigmaMu); - template void runTruePairing(TCollisions const& collisions, TPhotons1 const& photons1, TPhotons2 const& photons2, diff --git a/PWGEM/PhotonMeson/Core/TaggingPi0.h b/PWGEM/PhotonMeson/Core/TaggingPi0.h new file mode 100644 index 00000000000..a22d93da0c0 --- /dev/null +++ b/PWGEM/PhotonMeson/Core/TaggingPi0.h @@ -0,0 +1,684 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +// +// ======================== +// +/// \file TaggingPi0.h +/// \brief This code loops over photons and makes pairs for direct photon analysis. +/// +/// \author D. Sekihata, daiki.sekihata@cern.ch + +#ifndef PWGEM_PHOTONMESON_CORE_TAGGINGPI0_H_ +#define PWGEM_PHOTONMESON_CORE_TAGGINGPI0_H_ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "TString.h" +#include "Math/Vector4D.h" +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/ASoAHelpers.h" + +#include "DetectorsBase/GeometryManager.h" +#include "DataFormatsParameters/GRPObject.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "CCDB/BasicCCDBManager.h" + +#include "Common/Core/RecoDecay.h" +#include "PWGEM/PhotonMeson/DataModel/gammaTables.h" +#include "PWGEM/PhotonMeson/Core/V0PhotonCut.h" +#include "PWGEM/PhotonMeson/Core/DalitzEECut.h" +#include "PWGEM/PhotonMeson/Core/PHOSPhotonCut.h" +#include "PWGEM/PhotonMeson/Core/EMCPhotonCut.h" +#include "PWGEM/PhotonMeson/Core/EMPhotonEventCut.h" +#include "PWGEM/PhotonMeson/Utils/PairUtilities.h" +#include "PWGEM/Dilepton/Utils/EMTrack.h" +#include "PWGEM/Dilepton/Utils/EventMixingHandler.h" +#include "PWGEM/PhotonMeson/Utils/EventHistograms.h" +#include "PWGEM/Dilepton/Utils/EMTrackUtilities.h" + +using namespace o2; +using namespace o2::aod; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::soa; +using namespace o2::aod::pwgem::photonmeson::photonpair; +using namespace o2::aod::pwgem::photon; +using namespace o2::aod::pwgem::dilepton::utils::emtrackutil; +using namespace o2::aod::pwgem::dilepton::utils; + +using MyCollisions = soa::Join; +using MyCollision = MyCollisions::iterator; + +using MyV0Photons = soa::Join; +using MyV0Photon = MyV0Photons::iterator; + +using MyPrimaryElectrons = soa::Join; +using MyPrimaryElectron = MyPrimaryElectrons::iterator; + +using MyEMCClusters = soa::Join; +using MyEMCCluster = MyEMCClusters::iterator; + +using MyPHOSClusters = soa::Join; +using MyPHOSCluster = MyPHOSClusters::iterator; + +template +struct TaggingPi0 { + Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; + Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + Configurable skipGRPOquery{"skipGRPOquery", true, "skip grpo query"}; + Configurable d_bz_input{"d_bz_input", -999, "bz field in kG, -999 is automatic"}; + + Configurable cfgQvecEstimator{"cfgQvecEstimator", 0, "FT0M:0, FT0A:1, FT0C:2"}; + Configurable cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"}; + Configurable cfgOccupancyEstimator{"cfgOccupancyEstimator", 0, "FT0C:0, Track:1"}; + Configurable cfgCentMin{"cfgCentMin", 0, "min. centrality"}; + Configurable cfgCentMax{"cfgCentMax", 999, "max. centrality"}; + Configurable cfgDoMix{"cfgDoMix", true, "flag for event mixing"}; + Configurable ndepth{"ndepth", 100, "depth for event mixing"}; + ConfigurableAxis ConfVtxBins{"ConfVtxBins", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; + ConfigurableAxis ConfCentBins{"ConfCentBins", {VARIABLE_WIDTH, 0.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.f, 999.f}, "Mixing bins - centrality"}; + ConfigurableAxis ConfEPBins{"ConfEPBins", {VARIABLE_WIDTH, -M_PI / 2, -M_PI / 4, 0.0f, +M_PI / 4, +M_PI / 2}, "Mixing bins - event plane angle"}; + ConfigurableAxis ConfOccupancyBins{"ConfOccupancyBins", {VARIABLE_WIDTH, -1, 1e+10}, "Mixing bins - occupancy"}; + ConfigurableAxis ConfPtBins{"ConfPtBins", {100, 0, 10}, "pT bins for output histograms"}; + + EMPhotonEventCut fEMEventCut; + struct : ConfigurableGroup { + std::string prefix = "eventcut_group"; + Configurable cfgZvtxMax{"cfgZvtxMax", 10.f, "max. Zvtx"}; + Configurable cfgRequireSel8{"cfgRequireSel8", true, "require sel8 in event cut"}; + Configurable cfgRequireFT0AND{"cfgRequireFT0AND", true, "require FT0AND in event cut"}; + Configurable cfgRequireNoTFB{"cfgRequireNoTFB", false, "require No time frame border in event cut"}; + Configurable cfgRequireNoITSROFB{"cfgRequireNoITSROFB", false, "require no ITS readout frame border in event cut"}; + Configurable cfgRequireNoSameBunchPileup{"cfgRequireNoSameBunchPileup", false, "require no same bunch pileup in event cut"}; + Configurable cfgRequireVertexITSTPC{"cfgRequireVertexITSTPC", false, "require Vertex ITSTPC in event cut"}; // ITS-TPC matched track contributes PV. + Configurable cfgRequireGoodZvtxFT0vsPV{"cfgRequireGoodZvtxFT0vsPV", false, "require good Zvtx between FT0 vs. PV in event cut"}; + Configurable cfgRequireEMCReadoutInMB{"cfgRequireEMCReadoutInMB", false, "require the EMC to be read out in an MB collision (kTVXinEMC)"}; + Configurable cfgRequireEMCHardwareTriggered{"cfgRequireEMCHardwareTriggered", false, "require the EMC to be hardware triggered (kEMC7 or kDMC7)"}; + Configurable cfgTrackOccupancyMin{"cfgTrackOccupancyMin", -2, "min. occupancy"}; + Configurable cfgTrackOccupancyMax{"cfgTrackOccupancyMax", 1000000000, "max. occupancy"}; + Configurable cfgFT0COccupancyMin{"cfgFT0COccupancyMin", -2, "min. FT0C occupancy"}; + Configurable cfgFT0COccupancyMax{"cfgFT0COccupancyMax", 1000000000, "max. FT0C occupancy"}; + Configurable onlyKeepWeightedEvents{"onlyKeepWeightedEvents", false, "flag to keep only weighted events (for JJ MCs) and remove all MB events (with weight = 1)"}; + } eventcuts; + + V0PhotonCut fV0PhotonCut; + struct : ConfigurableGroup { + std::string prefix = "pcmcut_group"; + Configurable cfg_require_v0_with_itstpc{"cfg_require_v0_with_itstpc", false, "flag to select V0s with ITS-TPC matched tracks"}; + Configurable cfg_require_v0_with_itsonly{"cfg_require_v0_with_itsonly", false, "flag to select V0s with ITSonly tracks"}; + Configurable cfg_require_v0_with_tpconly{"cfg_require_v0_with_tpconly", false, "flag to select V0s with TPConly tracks"}; + Configurable cfg_min_pt_v0{"cfg_min_pt_v0", 0.1, "min pT for v0 photons at PV"}; + Configurable cfg_max_pt_v0{"cfg_max_pt_v0", 1e+10, "max pT for v0 photons at PV"}; + Configurable cfg_min_eta_v0{"cfg_min_eta_v0", -0.8, "min eta for v0 photons at PV"}; + Configurable cfg_max_eta_v0{"cfg_max_eta_v0", 0.8, "max eta for v0 photons at PV"}; + Configurable cfg_min_v0radius{"cfg_min_v0radius", 4.0, "min v0 radius"}; + Configurable cfg_max_v0radius{"cfg_max_v0radius", 90.0, "max v0 radius"}; + Configurable cfg_max_alpha_ap{"cfg_max_alpha_ap", 0.95, "max alpha for AP cut"}; + Configurable cfg_max_qt_ap{"cfg_max_qt_ap", 0.01, "max qT for AP cut"}; + Configurable cfg_min_cospa{"cfg_min_cospa", 0.997, "min V0 CosPA"}; + Configurable cfg_max_pca{"cfg_max_pca", 3.0, "max distance btween 2 legs"}; + Configurable cfg_max_chi2kf{"cfg_max_chi2kf", 1e+10, "max chi2/ndf with KF"}; + Configurable cfg_require_v0_with_correct_xz{"cfg_require_v0_with_correct_xz", true, "flag to select V0s with correct xz"}; + Configurable cfg_reject_v0_on_itsib{"cfg_reject_v0_on_itsib", true, "flag to reject V0s on ITSib"}; + + Configurable cfg_min_ncluster_tpc{"cfg_min_ncluster_tpc", 10, "min ncluster tpc"}; + Configurable cfg_min_ncrossedrows{"cfg_min_ncrossedrows", 40, "min ncrossed rows"}; + Configurable cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 999.f, "max fraction of shared clusters in TPC"}; + Configurable cfg_max_chi2tpc{"cfg_max_chi2tpc", 4.0, "max chi2/NclsTPC"}; + Configurable cfg_max_chi2its{"cfg_max_chi2its", 5.0, "max chi2/NclsITS"}; + Configurable cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -3.0, "min. TPC n sigma for electron"}; + Configurable cfg_max_TPCNsigmaEl{"cfg_max_TPCNsigmaEl", +3.0, "max. TPC n sigma for electron"}; + Configurable cfg_disable_itsonly_track{"cfg_disable_itsonly_track", false, "flag to disable ITSonly tracks"}; + Configurable cfg_disable_tpconly_track{"cfg_disable_tpconly_track", false, "flag to disable TPConly tracks"}; + } pcmcuts; + + DalitzEECut fDileptonCut; + struct : ConfigurableGroup { + std::string prefix = "dileptoncut_group"; + Configurable cfg_min_mass{"cfg_min_mass", 0.0, "min mass"}; + Configurable cfg_max_mass{"cfg_max_mass", 0.1, "max mass"}; + Configurable cfg_apply_phiv{"cfg_apply_phiv", true, "flag to apply phiv cut"}; + Configurable cfg_require_itsib_any{"cfg_require_itsib_any", false, "flag to require ITS ib any hits"}; + Configurable cfg_require_itsib_1st{"cfg_require_itsib_1st", true, "flag to require ITS ib 1st hit"}; + Configurable cfg_phiv_slope{"cfg_phiv_slope", 0.0185, "slope for m vs. phiv"}; + Configurable cfg_phiv_intercept{"cfg_phiv_intercept", -0.0280, "intercept for m vs. phiv"}; + + Configurable cfg_min_pt_track{"cfg_min_pt_track", 0.1, "min pT for single track"}; + Configurable cfg_max_eta_track{"cfg_max_eta_track", 0.8, "max eta for single track"}; + Configurable cfg_min_ncluster_tpc{"cfg_min_ncluster_tpc", 0, "min ncluster tpc"}; + Configurable cfg_min_ncluster_its{"cfg_min_ncluster_its", 5, "min ncluster its"}; + Configurable cfg_min_ncrossedrows{"cfg_min_ncrossedrows", 70, "min ncrossed rows"}; + Configurable cfg_max_chi2tpc{"cfg_max_chi2tpc", 4.0, "max chi2/NclsTPC"}; + Configurable cfg_max_chi2its{"cfg_max_chi2its", 5.0, "max chi2/NclsITS"}; + Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 0.05, "max dca XY for single track in cm"}; + Configurable cfg_max_dcaz{"cfg_max_dcaz", 0.05, "max dca Z for single track in cm"}; + Configurable cfg_max_dca3dsigma_track{"cfg_max_dca3dsigma_track", 1.5, "max DCA 3D in sigma"}; + Configurable cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 999.f, "max fraction of shared clusters in TPC"}; + + Configurable cfg_pid_scheme{"cfg_pid_scheme", static_cast(DalitzEECut::PIDSchemes::kTOFif), "pid scheme [kTOFif : 0, kTPConly : 1]"}; + Configurable cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -2.0, "min. TPC n sigma for electron inclusion"}; + Configurable cfg_max_TPCNsigmaEl{"cfg_max_TPCNsigmaEl", +3.0, "max. TPC n sigma for electron inclusion"}; + Configurable cfg_min_TPCNsigmaPi{"cfg_min_TPCNsigmaPi", -0.0, "min. TPC n sigma for pion exclusion"}; + Configurable cfg_max_TPCNsigmaPi{"cfg_max_TPCNsigmaPi", +0.0, "max. TPC n sigma for pion exclusion"}; + Configurable cfg_min_TOFNsigmaEl{"cfg_min_TOFNsigmaEl", -3.0, "min. TOF n sigma for electron inclusion"}; + Configurable cfg_max_TOFNsigmaEl{"cfg_max_TOFNsigmaEl", +3.0, "max. TOF n sigma for electron inclusion"}; + } dileptoncuts; + + EMCPhotonCut fEMCCut; + struct : ConfigurableGroup { + std::string prefix = "emccut_group"; + Configurable clusterDefinition{"clusterDefinition", "kV3Default", "Clusterizer to be selected, e.g. V3Default"}; + Configurable minOpenAngle{"minOpenAngle", 0.0202, "apply min opening angle"}; + Configurable EMC_minTime{"EMC_minTime", -20., "Minimum cluster time for EMCal time cut"}; + Configurable EMC_maxTime{"EMC_maxTime", +25., "Maximum cluster time for EMCal time cut"}; + Configurable EMC_minM02{"EMC_minM02", 0.1, "Minimum M02 for EMCal M02 cut"}; + Configurable EMC_maxM02{"EMC_maxM02", 0.7, "Maximum M02 for EMCal M02 cut"}; + Configurable EMC_minE{"EMC_minE", 0.7, "Minimum cluster energy for EMCal energy cut"}; + Configurable EMC_minNCell{"EMC_minNCell", 1, "Minimum number of cells per cluster for EMCal NCell cut"}; + Configurable> EMC_TM_Eta{"EMC_TM_Eta", {0.01f, 4.07f, -2.5f}, "|eta| <= [0]+(pT+[1])^[2] for EMCal track matching"}; + Configurable> EMC_TM_Phi{"EMC_TM_Phi", {0.015f, 3.65f, -2.f}, "|phi| <= [0]+(pT+[1])^[2] for EMCal track matching"}; + Configurable EMC_Eoverp{"EMC_Eoverp", 1.75, "Minimum cluster energy over track momentum for EMCal track matching"}; + Configurable EMC_UseExoticCut{"EMC_UseExoticCut", true, "FLag to use the EMCal exotic cluster cut"}; + Configurable cfgDistanceToEdge{"cfgDistanceToEdge", 1, "Distance to edge in cells required for rotated cluster to be accepted"}; + } emccuts; + + PHOSPhotonCut fPHOSCut; + struct : ConfigurableGroup { + std::string prefix = "phoscut_group"; + Configurable cfg_min_Ecluster{"cfg_min_Ecluster", 0.3, "Minimum cluster energy for PHOS in GeV"}; + } phoscuts; + + HistogramRegistry fRegistry{"output", {}, OutputObjHandlingPolicy::AnalysisObject, false, false}; + static constexpr std::string_view event_types[2] = {"before/", "after/"}; + static constexpr std::string_view event_pair_types[2] = {"same/", "mix/"}; + + std::vector zvtx_bin_edges; + std::vector cent_bin_edges; + std::vector ep_bin_edges; + std::vector occ_bin_edges; + + o2::ccdb::CcdbApi ccdbApi; + Service ccdb; + int mRunNumber; + float d_bz; + + void init(InitContext&) + { + zvtx_bin_edges = std::vector(ConfVtxBins.value.begin(), ConfVtxBins.value.end()); + zvtx_bin_edges.erase(zvtx_bin_edges.begin()); + + cent_bin_edges = std::vector(ConfCentBins.value.begin(), ConfCentBins.value.end()); + cent_bin_edges.erase(cent_bin_edges.begin()); + + ep_bin_edges = std::vector(ConfEPBins.value.begin(), ConfEPBins.value.end()); + ep_bin_edges.erase(ep_bin_edges.begin()); + + LOGF(info, "cfgOccupancyEstimator = %d", cfgOccupancyEstimator.value); + occ_bin_edges = std::vector(ConfOccupancyBins.value.begin(), ConfOccupancyBins.value.end()); + occ_bin_edges.erase(occ_bin_edges.begin()); + + emh1 = new MyEMH(ndepth); + emh2 = new MyEMH(ndepth); + + o2::aod::pwgem::photonmeson::utils::eventhistogram::addEventHistograms(&fRegistry); + + addHistogrms(); + DefineEMEventCut(); + DefinePCMCut(); + DefineDileptonCut(); + DefineEMCCut(); + DefinePHOSCut(); + + mRunNumber = 0; + d_bz = 0; + + ccdb->setURL(ccdburl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setFatalWhenNull(false); + } + + template + void initCCDB(TCollision const& collision) + { + if (mRunNumber == collision.runNumber()) { + return; + } + + // In case override, don't proceed, please - no CCDB access required + if (d_bz_input > -990) { + d_bz = d_bz_input; + o2::parameters::GRPMagField grpmag; + if (std::fabs(d_bz) > 1e-5) { + grpmag.setL3Current(30000.f / (d_bz / 5.0f)); + } + mRunNumber = collision.runNumber(); + return; + } + + auto run3grp_timestamp = collision.timestamp(); + o2::parameters::GRPObject* grpo = 0x0; + o2::parameters::GRPMagField* grpmag = 0x0; + if (!skipGRPOquery) + grpo = ccdb->getForTimeStamp(grpPath, run3grp_timestamp); + if (grpo) { + // Fetch magnetic field from ccdb for current collision + d_bz = grpo->getNominalL3Field(); + LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; + } else { + grpmag = ccdb->getForTimeStamp(grpmagPath, run3grp_timestamp); + if (!grpmag) { + LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for timestamp " << run3grp_timestamp; + } + // Fetch magnetic field from ccdb for current collision + d_bz = std::lround(5.f * grpmag->getL3Current() / 30000.f); + LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; + } + mRunNumber = collision.runNumber(); + } + + ~TaggingPi0() + { + delete emh1; + emh1 = 0x0; + delete emh2; + emh2 = 0x0; + + used_photonIds.clear(); + used_photonIds.shrink_to_fit(); + used_dileptonIds.clear(); + used_dileptonIds.shrink_to_fit(); + } + + void addHistogrms() + { + TString mggTitle = "ee#gamma"; + if constexpr (pairtype == PairType::kPCMDalitzEE) { + mggTitle = "ee#gamma"; + } else { + mggTitle = "#gamma#gamma"; + } + + const AxisSpec axis_m{200, 0, 0.4, Form("m_{%s} (GeV/c^{2})", mggTitle.Data())}; + const AxisSpec axis_pt{ConfPtBins, "p_{T,#gamma} (GeV/c)"}; + + fRegistry.add("Photon/hPt", "p_{T,#gamma};p_{T,#gamma} (GeV/c)", kTH1D, {axis_pt}, true); + fRegistry.add("Photon/hEtaPhi", "#varphi vs. #eta;#varphi_{#gamma} (rad.);#eta_{#gamma}", kTH2D, {{90, 0, 2 * M_PI}, {40, -1, +1}}, true); + fRegistry.add("Pair/same/hMvsPt", "mass vs. p_{T,#gamma}", kTH2D, {axis_m, axis_pt}, true); + fRegistry.addClone("Pair/same/", "Pair/mix/"); + } + + void DefineEMEventCut() + { + fEMEventCut = EMPhotonEventCut("fEMEventCut", "fEMEventCut"); + fEMEventCut.SetRequireSel8(eventcuts.cfgRequireSel8); + fEMEventCut.SetRequireFT0AND(eventcuts.cfgRequireFT0AND); + fEMEventCut.SetZvtxRange(-eventcuts.cfgZvtxMax, +eventcuts.cfgZvtxMax); + fEMEventCut.SetRequireNoTFB(eventcuts.cfgRequireNoTFB); + fEMEventCut.SetRequireNoITSROFB(eventcuts.cfgRequireNoITSROFB); + fEMEventCut.SetRequireNoSameBunchPileup(eventcuts.cfgRequireNoSameBunchPileup); + fEMEventCut.SetRequireVertexITSTPC(eventcuts.cfgRequireVertexITSTPC); + fEMEventCut.SetRequireGoodZvtxFT0vsPV(eventcuts.cfgRequireGoodZvtxFT0vsPV); + fEMEventCut.SetRequireEMCReadoutInMB(eventcuts.cfgRequireEMCReadoutInMB); + fEMEventCut.SetRequireEMCHardwareTriggered(eventcuts.cfgRequireEMCHardwareTriggered); + } + + void DefinePCMCut() + { + fV0PhotonCut = V0PhotonCut("fV0PhotonCut", "fV0PhotonCut"); + + // for v0 + fV0PhotonCut.SetV0PtRange(pcmcuts.cfg_min_pt_v0, pcmcuts.cfg_max_pt_v0); + fV0PhotonCut.SetV0EtaRange(pcmcuts.cfg_min_eta_v0, pcmcuts.cfg_max_eta_v0); + fV0PhotonCut.SetMinCosPA(pcmcuts.cfg_min_cospa); + fV0PhotonCut.SetMaxPCA(pcmcuts.cfg_max_pca); + fV0PhotonCut.SetMaxChi2KF(pcmcuts.cfg_max_chi2kf); + fV0PhotonCut.SetRxyRange(pcmcuts.cfg_min_v0radius, pcmcuts.cfg_max_v0radius); + fV0PhotonCut.SetAPRange(pcmcuts.cfg_max_alpha_ap, pcmcuts.cfg_max_qt_ap); + fV0PhotonCut.RejectITSib(pcmcuts.cfg_reject_v0_on_itsib); + + // for track + fV0PhotonCut.SetMinNClustersTPC(pcmcuts.cfg_min_ncluster_tpc); + fV0PhotonCut.SetMinNCrossedRowsTPC(pcmcuts.cfg_min_ncrossedrows); + fV0PhotonCut.SetMinNCrossedRowsOverFindableClustersTPC(0.8); + fV0PhotonCut.SetMaxFracSharedClustersTPC(pcmcuts.cfg_max_frac_shared_clusters_tpc); + fV0PhotonCut.SetChi2PerClusterTPC(0.0, pcmcuts.cfg_max_chi2tpc); + fV0PhotonCut.SetTPCNsigmaElRange(pcmcuts.cfg_min_TPCNsigmaEl, pcmcuts.cfg_max_TPCNsigmaEl); + fV0PhotonCut.SetChi2PerClusterITS(-1e+10, pcmcuts.cfg_max_chi2its); + fV0PhotonCut.SetNClustersITS(0, 7); + fV0PhotonCut.SetMeanClusterSizeITSob(0.0, 16.0); + fV0PhotonCut.SetIsWithinBeamPipe(pcmcuts.cfg_require_v0_with_correct_xz); + fV0PhotonCut.SetDisableITSonly(pcmcuts.cfg_disable_itsonly_track); + fV0PhotonCut.SetDisableTPConly(pcmcuts.cfg_disable_tpconly_track); + fV0PhotonCut.SetRequireITSTPC(pcmcuts.cfg_require_v0_with_itstpc); + fV0PhotonCut.SetRequireITSonly(pcmcuts.cfg_require_v0_with_itsonly); + fV0PhotonCut.SetRequireTPConly(pcmcuts.cfg_require_v0_with_tpconly); + } + + void DefineDileptonCut() + { + fDileptonCut = DalitzEECut("fDileptonCut", "fDileptonCut"); + + // for pair + fDileptonCut.SetMeeRange(dileptoncuts.cfg_min_mass, dileptoncuts.cfg_max_mass); + fDileptonCut.SetMaxPhivPairMeeDep([&](float mll) { return (mll - dileptoncuts.cfg_phiv_intercept) / dileptoncuts.cfg_phiv_slope; }); + fDileptonCut.ApplyPhiV(dileptoncuts.cfg_apply_phiv); + fDileptonCut.RequireITSibAny(dileptoncuts.cfg_require_itsib_any); + fDileptonCut.RequireITSib1st(dileptoncuts.cfg_require_itsib_1st); + + // for track + fDileptonCut.SetTrackPtRange(dileptoncuts.cfg_min_pt_track, 1e+10f); + fDileptonCut.SetTrackEtaRange(-dileptoncuts.cfg_max_eta_track, +dileptoncuts.cfg_max_eta_track); + fDileptonCut.SetMinNClustersTPC(dileptoncuts.cfg_min_ncluster_tpc); + fDileptonCut.SetMinNCrossedRowsTPC(dileptoncuts.cfg_min_ncrossedrows); + fDileptonCut.SetMinNCrossedRowsOverFindableClustersTPC(0.8); + fDileptonCut.SetMaxFracSharedClustersTPC(dileptoncuts.cfg_max_frac_shared_clusters_tpc); + fDileptonCut.SetChi2PerClusterTPC(0.0, dileptoncuts.cfg_max_chi2tpc); + fDileptonCut.SetChi2PerClusterITS(0.0, dileptoncuts.cfg_max_chi2its); + fDileptonCut.SetNClustersITS(dileptoncuts.cfg_min_ncluster_its, 7); + fDileptonCut.SetMaxDcaXY(dileptoncuts.cfg_max_dcaxy); + fDileptonCut.SetMaxDcaZ(dileptoncuts.cfg_max_dcaz); + fDileptonCut.SetTrackDca3DRange(0.f, dileptoncuts.cfg_max_dca3dsigma_track); // in sigma + + // for eID + fDileptonCut.SetPIDScheme(dileptoncuts.cfg_pid_scheme); + fDileptonCut.SetTPCNsigmaElRange(dileptoncuts.cfg_min_TPCNsigmaEl, dileptoncuts.cfg_max_TPCNsigmaEl); + fDileptonCut.SetTPCNsigmaPiRange(dileptoncuts.cfg_min_TPCNsigmaPi, dileptoncuts.cfg_max_TPCNsigmaPi); + fDileptonCut.SetTOFNsigmaElRange(dileptoncuts.cfg_min_TOFNsigmaEl, dileptoncuts.cfg_max_TOFNsigmaEl); + } + + void DefineEMCCut() + { + const float a = emccuts.EMC_TM_Eta->at(0); + const float b = emccuts.EMC_TM_Eta->at(1); + const float c = emccuts.EMC_TM_Eta->at(2); + + const float d = emccuts.EMC_TM_Phi->at(0); + const float e = emccuts.EMC_TM_Phi->at(1); + const float f = emccuts.EMC_TM_Phi->at(2); + LOGF(info, "EMCal track matching parameters : a = %f, b = %f, c = %f, d = %f, e = %f, f = %f", a, b, c, d, e, f); + + fEMCCut = EMCPhotonCut("fEMCCut", "fEMCCut"); + + fEMCCut.SetClusterizer(emccuts.clusterDefinition); + fEMCCut.SetMinE(emccuts.EMC_minE); + fEMCCut.SetMinNCell(emccuts.EMC_minNCell); + fEMCCut.SetM02Range(emccuts.EMC_minM02, emccuts.EMC_maxM02); + fEMCCut.SetTimeRange(emccuts.EMC_minTime, emccuts.EMC_maxTime); + + fEMCCut.SetTrackMatchingEta([a, b, c](float pT) { return a + std::pow(pT + b, c); }); + fEMCCut.SetTrackMatchingPhi([d, e, f](float pT) { return d + std::pow(pT + e, f); }); + + fEMCCut.SetMinEoverP(emccuts.EMC_Eoverp); + fEMCCut.SetUseExoticCut(emccuts.EMC_UseExoticCut); + } + + void DefinePHOSCut() + { + fPHOSCut.SetEnergyRange(phoscuts.cfg_min_Ecluster, 1e+10); + } + + SliceCache cache; + Preslice perCollision_pcm = aod::v0photonkf::emeventId; + Preslice perCollision_emc = aod::emccluster::emeventId; + Preslice perCollision_phos = aod::phoscluster::emeventId; + + Preslice perCollision_electron = aod::emprimaryelectron::emeventId; + Partition positrons = o2::aod::emprimaryelectron::sign > int8_t(0) && static_cast(dileptoncuts.cfg_min_pt_track) < o2::aod::track::pt&& nabs(o2::aod::track::eta) < static_cast(dileptoncuts.cfg_max_eta_track) && static_cast(dileptoncuts.cfg_min_TPCNsigmaEl) < o2::aod::pidtpc::tpcNSigmaEl&& o2::aod::pidtpc::tpcNSigmaEl < static_cast(dileptoncuts.cfg_max_TPCNsigmaEl); + Partition electrons = o2::aod::emprimaryelectron::sign < int8_t(0) && static_cast(dileptoncuts.cfg_min_pt_track) < o2::aod::track::pt && nabs(o2::aod::track::eta) < static_cast(dileptoncuts.cfg_max_eta_track) && static_cast(dileptoncuts.cfg_min_TPCNsigmaEl) < o2::aod::pidtpc::tpcNSigmaEl && o2::aod::pidtpc::tpcNSigmaEl < static_cast(dileptoncuts.cfg_max_TPCNsigmaEl); + + using MyEMH = o2::aod::pwgem::dilepton::utils::EventMixingHandler, std::pair, EMTrack>; + MyEMH* emh1 = nullptr; + MyEMH* emh2 = nullptr; + std::vector> used_photonIds; // + std::vector> used_dileptonIds; // + + template + void runPairing(TCollisions const& collisions, + TPhotons1 const& photons1, TPhotons2 const& photons2, + TSubInfos1 const& /*subinfos1*/, TSubInfos2 const& /*subinfos2*/, + TPreslice1 const& perCollision1, TPreslice2 const& perCollision2, + TCut1 const& cut1, TCut2 const& cut2) + { + for (const auto& collision : collisions) { + initCCDB(collision); + int ndiphoton = 0; + + if (eventcuts.onlyKeepWeightedEvents && std::fabs(collision.weight() - 1.f) < 1e-10) { + continue; + } + + const float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; + if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { + continue; + } + + o2::aod::pwgem::photonmeson::utils::eventhistogram::fillEventInfo<0>(&fRegistry, collision, collision.weight()); + if (!fEMEventCut.IsSelected(collision)) { + continue; + } + o2::aod::pwgem::photonmeson::utils::eventhistogram::fillEventInfo<1>(&fRegistry, collision, collision.weight()); + fRegistry.fill(HIST("Event/before/hCollisionCounter"), 12.0, collision.weight()); // accepted + fRegistry.fill(HIST("Event/after/hCollisionCounter"), 12.0, collision.weight()); // accepted + + int zbin = lower_bound(zvtx_bin_edges.begin(), zvtx_bin_edges.end(), collision.posZ()) - zvtx_bin_edges.begin() - 1; + if (zbin < 0) { + zbin = 0; + } else if (static_cast(zvtx_bin_edges.size()) - 2 < zbin) { + zbin = static_cast(zvtx_bin_edges.size()) - 2; + } + + float centrality = centralities[cfgCentEstimator]; + int centbin = lower_bound(cent_bin_edges.begin(), cent_bin_edges.end(), centrality) - cent_bin_edges.begin() - 1; + if (centbin < 0) { + centbin = 0; + } else if (static_cast(cent_bin_edges.size()) - 2 < centbin) { + centbin = static_cast(cent_bin_edges.size()) - 2; + } + + float ep2 = collision.ep2btot(); + int epbin = lower_bound(ep_bin_edges.begin(), ep_bin_edges.end(), ep2) - ep_bin_edges.begin() - 1; + if (epbin < 0) { + epbin = 0; + } else if (static_cast(ep_bin_edges.size()) - 2 < epbin) { + epbin = static_cast(ep_bin_edges.size()) - 2; + } + + int occbin = -1; + if (cfgOccupancyEstimator == 0) { + occbin = lower_bound(occ_bin_edges.begin(), occ_bin_edges.end(), collision.ft0cOccupancyInTimeRange()) - occ_bin_edges.begin() - 1; + } else if (cfgOccupancyEstimator == 1) { + occbin = lower_bound(occ_bin_edges.begin(), occ_bin_edges.end(), collision.trackOccupancyInTimeRange()) - occ_bin_edges.begin() - 1; + } else { + occbin = lower_bound(occ_bin_edges.begin(), occ_bin_edges.end(), collision.ft0cOccupancyInTimeRange()) - occ_bin_edges.begin() - 1; + } + + if (occbin < 0) { + occbin = 0; + } else if (static_cast(occ_bin_edges.size()) - 2 < occbin) { + occbin = static_cast(occ_bin_edges.size()) - 2; + } + + // LOGF(info, "collision.globalIndex() = %d, collision.posZ() = %f, centrality = %f, ep2 = %f, collision.trackOccupancyInTimeRange() = %d, zbin = %d, centbin = %d, epbin = %d, occbin = %d", collision.globalIndex(), collision.posZ(), centrality, ep2, collision.trackOccupancyInTimeRange(), zbin, centbin, epbin, occbin); + + std::tuple key_bin = std::make_tuple(zbin, centbin, epbin, occbin); + std::pair key_df_collision = std::make_pair(ndf, collision.globalIndex()); + + if constexpr (pairtype == PairType::kPCMDalitzEE) { + auto photons1_per_collision = photons1.sliceBy(perCollision1, collision.globalIndex()); // PCM + auto positrons_per_collision = positrons->sliceByCached(o2::aod::emprimaryelectron::emeventId, collision.globalIndex(), cache); // positrons + auto electrons_per_collision = electrons->sliceByCached(o2::aod::emprimaryelectron::emeventId, collision.globalIndex(), cache); // electrons + + for (const auto& g1 : photons1_per_collision) { + if (!cut1.template IsSelected(g1)) { + continue; + } + auto pos1 = g1.template posTrack_as(); + auto ele1 = g1.template negTrack_as(); + ROOT::Math::PtEtaPhiMVector v_gamma(g1.pt(), g1.eta(), g1.phi(), 0.); + fRegistry.fill(HIST("Photon/hPt"), v_gamma.Pt(), collision.weight()); + fRegistry.fill(HIST("Photon/hEtaPhi"), v_gamma.Phi() > 0 ? v_gamma.Phi() : v_gamma.Phi() + 2 * M_PI, v_gamma.Eta(), collision.weight()); + + for (const auto& [pos2, ele2] : combinations(CombinationsFullIndexPolicy(positrons_per_collision, electrons_per_collision))) { + + if (pos2.trackId() == ele2.trackId()) { // this is protection against pairing identical 2 tracks. + continue; + } + if (pos1.trackId() == pos2.trackId() || ele1.trackId() == ele2.trackId()) { + continue; + } + + if (!cut2.template IsSelectedTrack(pos2, collision) || !cut2.template IsSelectedTrack(ele2, collision)) { + continue; + } + + if (!cut2.IsSelectedPair(pos2, ele2, d_bz)) { + continue; + } + + ROOT::Math::PtEtaPhiMVector v_pos(pos2.pt(), pos2.eta(), pos2.phi(), o2::constants::physics::MassElectron); + ROOT::Math::PtEtaPhiMVector v_ele(ele2.pt(), ele2.eta(), ele2.phi(), o2::constants::physics::MassElectron); + ROOT::Math::PtEtaPhiMVector v_ee = v_pos + v_ele; + ROOT::Math::PtEtaPhiMVector veeg = v_gamma + v_pos + v_ele; + fRegistry.fill(HIST("Pair/same/hMvsPt"), veeg.M(), v_gamma.Pt(), collision.weight()); + + std::pair pair_tmp_id1 = std::make_pair(ndf, g1.globalIndex()); + std::tuple tuple_tmp_id2 = std::make_tuple(ndf, collision.globalIndex(), pos2.trackId(), ele2.trackId()); + if (std::find(used_photonIds.begin(), used_photonIds.end(), pair_tmp_id1) == used_photonIds.end()) { + emh1->AddTrackToEventPool(key_df_collision, EMTrack(-1, g1.globalIndex(), collision.globalIndex(), -1, g1.pt(), g1.eta(), g1.phi(), 0)); + used_photonIds.emplace_back(pair_tmp_id1); + } + if (std::find(used_dileptonIds.begin(), used_dileptonIds.end(), tuple_tmp_id2) == used_dileptonIds.end()) { + emh2->AddTrackToEventPool(key_df_collision, EMTrack(-1, -1, collision.globalIndex(), -1, v_ee.Pt(), v_ee.Eta(), v_ee.Phi(), v_ee.M())); + used_dileptonIds.emplace_back(tuple_tmp_id2); + } + ndiphoton++; + } // end of dielectron loop + } // end of g1 loop + } else { // PCM-EMC, PCM-PHOS. Not supported. + auto photons1_per_collision = photons1.sliceBy(perCollision1, collision.globalIndex()); // PCM + auto photons2_per_collision = photons2.sliceBy(perCollision2, collision.globalIndex()); // EMC or PHOS + + for (const auto& [g1, g2] : combinations(CombinationsFullIndexPolicy(photons1_per_collision, photons2_per_collision))) { + if (!cut1.template IsSelected(g1) || !cut2.template IsSelected(g2)) { + continue; + } + ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.); + ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.); + ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; + + fRegistry.fill(HIST("Pair/same/hMvsPt"), v12.M(), v1.Pt(), collision.weight()); + + std::pair pair_tmp_id1 = std::make_pair(ndf, g1.globalIndex()); + std::pair pair_tmp_id2 = std::make_pair(ndf, g2.globalIndex()); + + if (std::find(used_photonIds.begin(), used_photonIds.end(), pair_tmp_id1) == used_photonIds.end()) { + emh1->AddTrackToEventPool(key_df_collision, EMTrack(-1, g1.globalIndex(), collision.globalIndex(), -1, g1.pt(), g1.eta(), g1.phi(), 0)); + used_photonIds.emplace_back(pair_tmp_id1); + } + if (std::find(used_photonIds.begin(), used_photonIds.end(), pair_tmp_id2) == used_photonIds.end()) { + emh2->AddTrackToEventPool(key_df_collision, EMTrack(-1, g2.globalIndex(), collision.globalIndex(), -1, g2.pt(), g2.eta(), g2.phi(), 0)); + used_photonIds.emplace_back(pair_tmp_id2); + } + ndiphoton++; + } // end of pairing loop + } // end of pairing in same event + + // event mixing + if (!cfgDoMix || !(ndiphoton > 0)) { + continue; + } + + // make a vector of selected photons in this collision. + auto selected_photons1_in_this_event = emh1->GetTracksPerCollision(key_df_collision); + // auto selected_photons2_in_this_event = emh2->GetTracksPerCollision(key_df_collision); + + // auto collisionIds1_in_mixing_pool = emh1->GetCollisionIdsFromEventPool(key_bin); + auto collisionIds2_in_mixing_pool = emh2->GetCollisionIdsFromEventPool(key_bin); + + for (const auto& mix_dfId_collisionId : collisionIds2_in_mixing_pool) { + int mix_dfId = mix_dfId_collisionId.first; + int64_t mix_collisionId = mix_dfId_collisionId.second; + + if (collision.globalIndex() == mix_collisionId && ndf == mix_dfId) { // this never happens. only protection. + continue; + } + + auto photons2_from_event_pool = emh2->GetTracksPerCollision(mix_dfId_collisionId); + // LOGF(info, "Do event mixing: current event (%d, %d), ngamma = %d | event pool (%d, %d), nll = %d", ndf, collision.globalIndex(), selected_photons1_in_this_event.size(), mix_dfId, mix_collisionId, photons2_from_event_pool.size()); + + for (const auto& g1 : selected_photons1_in_this_event) { // [photon from event1, dilepton from event2] + for (const auto& g2 : photons2_from_event_pool) { + ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.); + ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.); + if constexpr (pairtype == PairType::kPCMDalitzEE) { + v2.SetM(g2.mass()); + } + ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; + fRegistry.fill(HIST("Pair/mix/hMvsPt"), v12.M(), v1.Pt(), collision.weight()); + } + } + } // end of loop over mixed event pool + + if (ndiphoton > 0) { + emh1->AddCollisionIdAtLast(key_bin, key_df_collision); + emh2->AddCollisionIdAtLast(key_bin, key_df_collision); + } + + } // end of collision loop + } + + Filter collisionFilter_occupancy_track = eventcuts.cfgTrackOccupancyMin <= o2::aod::evsel::trackOccupancyInTimeRange && o2::aod::evsel::trackOccupancyInTimeRange < eventcuts.cfgTrackOccupancyMax; + Filter collisionFilter_occupancy_ft0c = eventcuts.cfgFT0COccupancyMin <= o2::aod::evsel::ft0cOccupancyInTimeRange && o2::aod::evsel::ft0cOccupancyInTimeRange < eventcuts.cfgFT0COccupancyMax; + Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); + using FilteredMyCollisions = soa::Filtered; + + int ndf = 0; + void processAnalysis(FilteredMyCollisions const& collisions, Types const&... args) + { + // LOGF(info, "ndf = %d", ndf); + if constexpr (pairtype == PairType::kPCMDalitzEE) { + auto v0photons = std::get<0>(std::tie(args...)); + auto v0legs = std::get<1>(std::tie(args...)); + auto emprimaryelectrons = std::get<2>(std::tie(args...)); + // LOGF(info, "electrons.size() = %d, positrons.size() = %d", electrons.size(), positrons.size()); + runPairing(collisions, v0photons, emprimaryelectrons, v0legs, emprimaryelectrons, perCollision_pcm, perCollision_electron, fV0PhotonCut, fDileptonCut); + } + // else if constexpr (pairtype == PairType::kPCMEMC) { + // auto v0photons = std::get<0>(std::tie(args...)); + // auto v0legs = std::get<1>(std::tie(args...)); + // auto emcclusters = std::get<2>(std::tie(args...)); + // auto emcmatchedtracks = std::get<3>(std::tie(args...)); + // runPairing(collisions, v0photons, emcclusters, v0legs, nullptr, perCollision_pcm, perCollision_emc, fV0PhotonCut, fEMCCut, emcmatchedtracks, nullptr); + // } else if constexpr (pairtype == PairType::kPCMPHOS) { + // auto v0photons = std::get<0>(std::tie(args...)); + // auto v0legs = std::get<1>(std::tie(args...)); + // auto phosclusters = std::get<2>(std::tie(args...)); + // runPairing(collisions, v0photons, phosclusters, v0legs, nullptr, perCollision_pcm, perCollision_phos, fV0PhotonCut, fPHOSCut, nullptr, nullptr); + // } + ndf++; + } + PROCESS_SWITCH(TaggingPi0, processAnalysis, "process pair analysis", false); + + void processDummy(MyCollisions const&) {} + PROCESS_SWITCH(TaggingPi0, processDummy, "Dummy function", true); +}; +#endif // PWGEM_PHOTONMESON_CORE_TAGGINGPI0_H_ diff --git a/PWGEM/PhotonMeson/Core/TaggingPi0MC.h b/PWGEM/PhotonMeson/Core/TaggingPi0MC.h new file mode 100644 index 00000000000..875b1c60e78 --- /dev/null +++ b/PWGEM/PhotonMeson/Core/TaggingPi0MC.h @@ -0,0 +1,581 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +// +// ======================== +// +// This code loops over photons and makes pairs for neutral mesons analyses. +// Please write to: daiki.sekihata@cern.ch + +#ifndef PWGEM_PHOTONMESON_CORE_TAGGINGPI0MC_H_ +#define PWGEM_PHOTONMESON_CORE_TAGGINGPI0MC_H_ + +#include +#include +#include + +#include "TF1.h" +#include "TString.h" +#include "Math/Vector4D.h" +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/ASoAHelpers.h" + +#include "DetectorsBase/GeometryManager.h" +#include "DataFormatsParameters/GRPObject.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "CCDB/BasicCCDBManager.h" + +#include "Common/Core/RecoDecay.h" +#include "PWGEM/PhotonMeson/DataModel/gammaTables.h" +#include "PWGEM/PhotonMeson/Utils/PairUtilities.h" +#include "PWGEM/PhotonMeson/Utils/MCUtilities.h" +#include "PWGEM/PhotonMeson/Utils/EventHistograms.h" +#include "PWGEM/PhotonMeson/Utils/NMHistograms.h" +#include "PWGEM/PhotonMeson/Core/V0PhotonCut.h" +#include "PWGEM/PhotonMeson/Core/DalitzEECut.h" +#include "PWGEM/PhotonMeson/Core/PHOSPhotonCut.h" +#include "PWGEM/PhotonMeson/Core/EMCPhotonCut.h" +#include "PWGEM/PhotonMeson/Core/EMPhotonEventCut.h" +#include "PWGEM/Dilepton/Utils/MCUtilities.h" + +using namespace o2; +using namespace o2::aod; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::soa; +using namespace o2::aod::pwgem::photonmeson::photonpair; +using namespace o2::aod::pwgem::photonmeson::utils::mcutil; +using namespace o2::aod::pwgem::dilepton::utils::mcutil; + +using MyCollisions = soa::Join; +using MyCollision = MyCollisions::iterator; + +using MyMCCollisions = soa::Join; +using MyMCCollision = MyMCCollisions::iterator; + +using MyV0Photons = soa::Join; +using MyV0Photon = MyV0Photons::iterator; + +using MyEMCClusters = soa::Join; +using MyEMCCluster = MyEMCClusters::iterator; + +using MyPHOSClusters = soa::Join; +using MyPHOSCluster = MyEMCClusters::iterator; + +using MyMCV0Legs = soa::Join; +using MyMCV0Leg = MyMCV0Legs::iterator; + +using MyMCElectrons = soa::Join; +using MyMCElectron = MyMCElectrons::iterator; + +template +struct TaggingPi0MC { + Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; + Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + Configurable skipGRPOquery{"skipGRPOquery", true, "skip grpo query"}; + Configurable d_bz_input{"d_bz_input", -999, "bz field in kG, -999 is automatic"}; + + Configurable cfgQvecEstimator{"cfgQvecEstimator", 0, "FT0M:0, FT0A:1, FT0C:2"}; + Configurable cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"}; + Configurable cfgCentMin{"cfgCentMin", 0, "min. centrality"}; + Configurable cfgCentMax{"cfgCentMax", 999, "max. centrality"}; + Configurable cfgRequireTrueAssociation{"cfgRequireTrueAssociation", false, "flag to require true mc collision association"}; + ConfigurableAxis ConfPtBins{"ConfPtBins", {100, 0, 10}, "pT bins for output histograms"}; + + EMPhotonEventCut fEMEventCut; + struct : ConfigurableGroup { + std::string prefix = "eventcut_group"; + Configurable cfgZvtxMax{"cfgZvtxMax", 10.f, "max. Zvtx"}; + Configurable cfgRequireSel8{"cfgRequireSel8", true, "require sel8 in event cut"}; + Configurable cfgRequireFT0AND{"cfgRequireFT0AND", true, "require FT0AND in event cut"}; + Configurable cfgRequireNoTFB{"cfgRequireNoTFB", false, "require No time frame border in event cut"}; + Configurable cfgRequireNoITSROFB{"cfgRequireNoITSROFB", false, "require no ITS readout frame border in event cut"}; + Configurable cfgRequireNoSameBunchPileup{"cfgRequireNoSameBunchPileup", false, "require no same bunch pileup in event cut"}; + Configurable cfgRequireVertexITSTPC{"cfgRequireVertexITSTPC", false, "require Vertex ITSTPC in event cut"}; // ITS-TPC matched track contributes PV. + Configurable cfgRequireGoodZvtxFT0vsPV{"cfgRequireGoodZvtxFT0vsPV", false, "require good Zvtx between FT0 vs. PV in event cut"}; + Configurable cfgRequireEMCReadoutInMB{"cfgRequireEMCReadoutInMB", false, "require the EMC to be read out in an MB collision (kTVXinEMC)"}; + Configurable cfgRequireEMCHardwareTriggered{"cfgRequireEMCHardwareTriggered", false, "require the EMC to be hardware triggered (kEMC7 or kDMC7)"}; + Configurable cfgTrackOccupancyMin{"cfgTrackOccupancyMin", -2, "min. occupancy"}; + Configurable cfgTrackOccupancyMax{"cfgTrackOccupancyMax", 1000000000, "max. occupancy"}; + Configurable cfgFT0COccupancyMin{"cfgFT0COccupancyMin", -2, "min. FT0C occupancy"}; + Configurable cfgFT0COccupancyMax{"cfgFT0COccupancyMax", 1000000000, "max. FT0C occupancy"}; + Configurable onlyKeepWeightedEvents{"onlyKeepWeightedEvents", false, "flag to keep only weighted events (for JJ MCs) and remove all MB events (with weight = 1)"}; + } eventcuts; + + V0PhotonCut fV0PhotonCut; + struct : ConfigurableGroup { + std::string prefix = "pcmcut_group"; + Configurable cfg_require_v0_with_itstpc{"cfg_require_v0_with_itstpc", false, "flag to select V0s with ITS-TPC matched tracks"}; + Configurable cfg_require_v0_with_itsonly{"cfg_require_v0_with_itsonly", false, "flag to select V0s with ITSonly tracks"}; + Configurable cfg_require_v0_with_tpconly{"cfg_require_v0_with_tpconly", false, "flag to select V0s with TPConly tracks"}; + Configurable cfg_min_pt_v0{"cfg_min_pt_v0", 0.1, "min pT for v0 photons at PV"}; + Configurable cfg_max_pt_v0{"cfg_max_pt_v0", 1e+10, "max pT for v0 photons at PV"}; + Configurable cfg_min_eta_v0{"cfg_min_eta_v0", -0.8, "min eta for v0 photons at PV"}; + Configurable cfg_max_eta_v0{"cfg_max_eta_v0", 0.8, "max eta for v0 photons at PV"}; + Configurable cfg_min_v0radius{"cfg_min_v0radius", 4.0, "min v0 radius"}; + Configurable cfg_max_v0radius{"cfg_max_v0radius", 90.0, "max v0 radius"}; + Configurable cfg_max_alpha_ap{"cfg_max_alpha_ap", 0.95, "max alpha for AP cut"}; + Configurable cfg_max_qt_ap{"cfg_max_qt_ap", 0.01, "max qT for AP cut"}; + Configurable cfg_min_cospa{"cfg_min_cospa", 0.997, "min V0 CosPA"}; + Configurable cfg_max_pca{"cfg_max_pca", 3.0, "max distance btween 2 legs"}; + Configurable cfg_max_chi2kf{"cfg_max_chi2kf", 1e+10, "max chi2/ndf with KF"}; + Configurable cfg_require_v0_with_correct_xz{"cfg_require_v0_with_correct_xz", true, "flag to select V0s with correct xz"}; + Configurable cfg_reject_v0_on_itsib{"cfg_reject_v0_on_itsib", true, "flag to reject V0s on ITSib"}; + + Configurable cfg_min_ncluster_tpc{"cfg_min_ncluster_tpc", 10, "min ncluster tpc"}; + Configurable cfg_min_ncrossedrows{"cfg_min_ncrossedrows", 40, "min ncrossed rows"}; + Configurable cfg_max_chi2tpc{"cfg_max_chi2tpc", 4.0, "max chi2/NclsTPC"}; + Configurable cfg_max_chi2its{"cfg_max_chi2its", 5.0, "max chi2/NclsITS"}; + Configurable cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 999.f, "max fraction of shared clusters in TPC"}; + Configurable cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -3.0, "min. TPC n sigma for electron"}; + Configurable cfg_max_TPCNsigmaEl{"cfg_max_TPCNsigmaEl", +3.0, "max. TPC n sigma for electron"}; + Configurable cfg_disable_itsonly_track{"cfg_disable_itsonly_track", false, "flag to disable ITSonly tracks"}; + Configurable cfg_disable_tpconly_track{"cfg_disable_tpconly_track", false, "flag to disable TPConly tracks"}; + } pcmcuts; + + DalitzEECut fDileptonCut; + struct : ConfigurableGroup { + std::string prefix = "dileptoncut_group"; + Configurable cfg_min_mass{"cfg_min_mass", 0.0, "min mass"}; + Configurable cfg_max_mass{"cfg_max_mass", 0.1, "max mass"}; + Configurable cfg_apply_phiv{"cfg_apply_phiv", true, "flag to apply phiv cut"}; + Configurable cfg_require_itsib_any{"cfg_require_itsib_any", false, "flag to require ITS ib any hits"}; + Configurable cfg_require_itsib_1st{"cfg_require_itsib_1st", true, "flag to require ITS ib 1st hit"}; + Configurable cfg_phiv_slope{"cfg_phiv_slope", 0.0185, "slope for m vs. phiv"}; + Configurable cfg_phiv_intercept{"cfg_phiv_intercept", -0.0280, "intercept for m vs. phiv"}; + + Configurable cfg_min_pt_track{"cfg_min_pt_track", 0.1, "min pT for single track"}; + Configurable cfg_max_eta_track{"cfg_max_eta_track", 0.8, "max eta for single track"}; + Configurable cfg_min_ncluster_tpc{"cfg_min_ncluster_tpc", 0, "min ncluster tpc"}; + Configurable cfg_min_ncluster_its{"cfg_min_ncluster_its", 5, "min ncluster its"}; + Configurable cfg_min_ncrossedrows{"cfg_min_ncrossedrows", 70, "min ncrossed rows"}; + Configurable cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 999.f, "max fraction of shared clusters in TPC"}; + Configurable cfg_max_chi2tpc{"cfg_max_chi2tpc", 4.0, "max chi2/NclsTPC"}; + Configurable cfg_max_chi2its{"cfg_max_chi2its", 5.0, "max chi2/NclsITS"}; + Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 0.05, "max dca XY for single track in cm"}; + Configurable cfg_max_dcaz{"cfg_max_dcaz", 0.05, "max dca Z for single track in cm"}; + Configurable cfg_max_dca3dsigma_track{"cfg_max_dca3dsigma_track", 1.5, "max DCA 3D in sigma"}; + + Configurable cfg_pid_scheme{"cfg_pid_scheme", static_cast(DalitzEECut::PIDSchemes::kTOFif), "pid scheme [kTOFif : 0, kTPConly : 1]"}; + Configurable cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -2.0, "min. TPC n sigma for electron inclusion"}; + Configurable cfg_max_TPCNsigmaEl{"cfg_max_TPCNsigmaEl", +3.0, "max. TPC n sigma for electron inclusion"}; + Configurable cfg_min_TPCNsigmaPi{"cfg_min_TPCNsigmaPi", -0.0, "min. TPC n sigma for pion exclusion"}; + Configurable cfg_max_TPCNsigmaPi{"cfg_max_TPCNsigmaPi", +0.0, "max. TPC n sigma for pion exclusion"}; + Configurable cfg_min_TOFNsigmaEl{"cfg_min_TOFNsigmaEl", -3.0, "min. TOF n sigma for electron inclusion"}; + Configurable cfg_max_TOFNsigmaEl{"cfg_max_TOFNsigmaEl", +3.0, "max. TOF n sigma for electron inclusion"}; + } dileptoncuts; + + EMCPhotonCut fEMCCut; + struct : ConfigurableGroup { + std::string prefix = "emccut_group"; + Configurable clusterDefinition{"clusterDefinition", "kV3Default", "Clusterizer to be selected, e.g. V3Default"}; + Configurable minOpenAngle{"minOpenAngle", 0.0202, "apply min opening angle"}; + Configurable EMC_minTime{"EMC_minTime", -20., "Minimum cluster time for EMCal time cut"}; + Configurable EMC_maxTime{"EMC_maxTime", +25., "Maximum cluster time for EMCal time cut"}; + Configurable EMC_minM02{"EMC_minM02", 0.1, "Minimum M02 for EMCal M02 cut"}; + Configurable EMC_maxM02{"EMC_maxM02", 0.7, "Maximum M02 for EMCal M02 cut"}; + Configurable EMC_minE{"EMC_minE", 0.7, "Minimum cluster energy for EMCal energy cut"}; + Configurable EMC_minNCell{"EMC_minNCell", 1, "Minimum number of cells per cluster for EMCal NCell cut"}; + Configurable> EMC_TM_Eta{"EMC_TM_Eta", {0.01f, 4.07f, -2.5f}, "|eta| <= [0]+(pT+[1])^[2] for EMCal track matching"}; + Configurable> EMC_TM_Phi{"EMC_TM_Phi", {0.015f, 3.65f, -2.f}, "|phi| <= [0]+(pT+[1])^[2] for EMCal track matching"}; + Configurable EMC_Eoverp{"EMC_Eoverp", 1.75, "Minimum cluster energy over track momentum for EMCal track matching"}; + Configurable EMC_UseExoticCut{"EMC_UseExoticCut", true, "FLag to use the EMCal exotic cluster cut"}; + } emccuts; + + PHOSPhotonCut fPHOSCut; + struct : ConfigurableGroup { + std::string prefix = "phoscut_group"; + Configurable cfg_min_Ecluster{"cfg_min_Ecluster", 0.3, "Minimum cluster energy for PHOS in GeV"}; + } phoscuts; + + HistogramRegistry fRegistry{"output", {}, OutputObjHandlingPolicy::AnalysisObject, false, false}; + static constexpr std::string_view event_types[2] = {"before/", "after/"}; + static constexpr std::string_view event_pair_types[2] = {"same/", "mix/"}; + static constexpr std::string_view parnames[2] = {"Pi0/", "Eta/"}; + + o2::ccdb::CcdbApi ccdbApi; + Service ccdb; + int mRunNumber; + float d_bz; + + void init(InitContext&) + { + o2::aod::pwgem::photonmeson::utils::eventhistogram::addEventHistograms(&fRegistry); + addHistogrms(); + DefineEMEventCut(); + DefinePCMCut(); + DefineDileptonCut(); + DefineEMCCut(); + DefinePHOSCut(); + + mRunNumber = 0; + d_bz = 0; + + ccdb->setURL(ccdburl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setFatalWhenNull(false); + } + + template + void initCCDB(TCollision const& collision) + { + if (mRunNumber == collision.runNumber()) { + return; + } + + // In case override, don't proceed, please - no CCDB access required + if (d_bz_input > -990) { + d_bz = d_bz_input; + o2::parameters::GRPMagField grpmag; + if (std::fabs(d_bz) > 1e-5) { + grpmag.setL3Current(30000.f / (d_bz / 5.0f)); + } + mRunNumber = collision.runNumber(); + return; + } + + auto run3grp_timestamp = collision.timestamp(); + o2::parameters::GRPObject* grpo = 0x0; + o2::parameters::GRPMagField* grpmag = 0x0; + if (!skipGRPOquery) + grpo = ccdb->getForTimeStamp(grpPath, run3grp_timestamp); + if (grpo) { + // Fetch magnetic field from ccdb for current collision + d_bz = grpo->getNominalL3Field(); + LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; + } else { + grpmag = ccdb->getForTimeStamp(grpmagPath, run3grp_timestamp); + if (!grpmag) { + LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for timestamp " << run3grp_timestamp; + } + // Fetch magnetic field from ccdb for current collision + d_bz = std::lround(5.f * grpmag->getL3Current() / 30000.f); + LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; + } + mRunNumber = collision.runNumber(); + } + + ~TaggingPi0MC() {} + + void addHistogrms() + { + TString mggTitle = "ee#gamma"; + if constexpr (pairtype == PairType::kPCMDalitzEE) { + mggTitle = "ee#gamma"; + } else { + mggTitle = "#gamma#gamma"; + } + + const AxisSpec axis_m{200, 0, 0.4, Form("m_{%s} (GeV/c^{2})", mggTitle.Data())}; + const AxisSpec axis_pt{ConfPtBins, "p_{T,#gamma} (GeV/c)"}; + + fRegistry.add("Photon/candidate/hPt", "photon candidates;p_{T,#gamma} (GeV/c)", kTH1D, {axis_pt}, true); // for purity + fRegistry.add("Photon/candidate/hEtaPhi", "#varphi vs. #eta;#varphi_{#gamma} (rad.);#eta_{#gamma}", kTH2D, {{90, 0, 2 * M_PI}, {40, -1, +1}}, true); // for purity + fRegistry.add("Photon/primary/hPt", "photon;p_{T,#gamma} (GeV/c)", kTH1D, {axis_pt}, true); // for purity + fRegistry.add("Photon/primary/hEtaPhi", "#varphi vs. #eta;#varphi_{#gamma} (rad.);#eta_{#gamma}", kTH2D, {{90, 0, 2 * M_PI}, {40, -1, +1}}, true); // for purity + fRegistry.addClone("Photon/primary/", "Photon/fromWD/"); // only for completeness + fRegistry.addClone("Photon/primary/", "Photon/fromHS/"); // only for completeness + fRegistry.addClone("Photon/primary/", "Photon/fromPi0/"); // for conditional acceptance, denominator + + fRegistry.add("Pair/primary/hMvsPt", "mass vs. p_{T,#gamma} from #pi^{0}", kTH2D, {axis_m, axis_pt}, true); // for conditional acceptance, numerator + fRegistry.addClone("Pair/primary/", "Pair/fromWD/"); // only for completeness + fRegistry.addClone("Pair/primary/", "Pair/fromHS/"); // only for completeness + } + + void DefineEMEventCut() + { + fEMEventCut = EMPhotonEventCut("fEMEventCut", "fEMEventCut"); + fEMEventCut.SetRequireSel8(eventcuts.cfgRequireSel8); + fEMEventCut.SetRequireFT0AND(eventcuts.cfgRequireFT0AND); + fEMEventCut.SetZvtxRange(-eventcuts.cfgZvtxMax, +eventcuts.cfgZvtxMax); + fEMEventCut.SetRequireNoTFB(eventcuts.cfgRequireNoTFB); + fEMEventCut.SetRequireNoITSROFB(eventcuts.cfgRequireNoITSROFB); + fEMEventCut.SetRequireNoSameBunchPileup(eventcuts.cfgRequireNoSameBunchPileup); + fEMEventCut.SetRequireVertexITSTPC(eventcuts.cfgRequireVertexITSTPC); + fEMEventCut.SetRequireGoodZvtxFT0vsPV(eventcuts.cfgRequireGoodZvtxFT0vsPV); + fEMEventCut.SetRequireEMCReadoutInMB(eventcuts.cfgRequireEMCReadoutInMB); + fEMEventCut.SetRequireEMCHardwareTriggered(eventcuts.cfgRequireEMCHardwareTriggered); + } + + void DefinePCMCut() + { + fV0PhotonCut = V0PhotonCut("fV0PhotonCut", "fV0PhotonCut"); + + // for v0 + fV0PhotonCut.SetV0PtRange(pcmcuts.cfg_min_pt_v0, pcmcuts.cfg_max_pt_v0); + fV0PhotonCut.SetV0EtaRange(pcmcuts.cfg_min_eta_v0, pcmcuts.cfg_max_eta_v0); + fV0PhotonCut.SetMinCosPA(pcmcuts.cfg_min_cospa); + fV0PhotonCut.SetMaxPCA(pcmcuts.cfg_max_pca); + fV0PhotonCut.SetMaxChi2KF(pcmcuts.cfg_max_chi2kf); + fV0PhotonCut.SetRxyRange(pcmcuts.cfg_min_v0radius, pcmcuts.cfg_max_v0radius); + fV0PhotonCut.SetAPRange(pcmcuts.cfg_max_alpha_ap, pcmcuts.cfg_max_qt_ap); + fV0PhotonCut.RejectITSib(pcmcuts.cfg_reject_v0_on_itsib); + + // for track + fV0PhotonCut.SetMinNClustersTPC(pcmcuts.cfg_min_ncluster_tpc); + fV0PhotonCut.SetMinNCrossedRowsTPC(pcmcuts.cfg_min_ncrossedrows); + fV0PhotonCut.SetMinNCrossedRowsOverFindableClustersTPC(0.8); + fV0PhotonCut.SetMaxFracSharedClustersTPC(pcmcuts.cfg_max_frac_shared_clusters_tpc); + fV0PhotonCut.SetChi2PerClusterTPC(0.0, pcmcuts.cfg_max_chi2tpc); + fV0PhotonCut.SetTPCNsigmaElRange(pcmcuts.cfg_min_TPCNsigmaEl, pcmcuts.cfg_max_TPCNsigmaEl); + fV0PhotonCut.SetChi2PerClusterITS(-1e+10, pcmcuts.cfg_max_chi2its); + fV0PhotonCut.SetNClustersITS(0, 7); + fV0PhotonCut.SetMeanClusterSizeITSob(0.0, 16.0); + fV0PhotonCut.SetIsWithinBeamPipe(pcmcuts.cfg_require_v0_with_correct_xz); + fV0PhotonCut.SetDisableITSonly(pcmcuts.cfg_disable_itsonly_track); + fV0PhotonCut.SetDisableTPConly(pcmcuts.cfg_disable_tpconly_track); + fV0PhotonCut.SetRequireITSTPC(pcmcuts.cfg_require_v0_with_itstpc); + fV0PhotonCut.SetRequireITSonly(pcmcuts.cfg_require_v0_with_itsonly); + fV0PhotonCut.SetRequireTPConly(pcmcuts.cfg_require_v0_with_tpconly); + } + + void DefineDileptonCut() + { + fDileptonCut = DalitzEECut("fDileptonCut", "fDileptonCut"); + + // for pair + fDileptonCut.SetMeeRange(dileptoncuts.cfg_min_mass, dileptoncuts.cfg_max_mass); + fDileptonCut.SetMaxPhivPairMeeDep([&](float mll) { return (mll - dileptoncuts.cfg_phiv_intercept) / dileptoncuts.cfg_phiv_slope; }); + fDileptonCut.ApplyPhiV(dileptoncuts.cfg_apply_phiv); + fDileptonCut.RequireITSibAny(dileptoncuts.cfg_require_itsib_any); + fDileptonCut.RequireITSib1st(dileptoncuts.cfg_require_itsib_1st); + + // for track + fDileptonCut.SetTrackPtRange(dileptoncuts.cfg_min_pt_track, 1e+10f); + fDileptonCut.SetTrackEtaRange(-dileptoncuts.cfg_max_eta_track, +dileptoncuts.cfg_max_eta_track); + fDileptonCut.SetMinNClustersTPC(dileptoncuts.cfg_min_ncluster_tpc); + fDileptonCut.SetMinNCrossedRowsTPC(dileptoncuts.cfg_min_ncrossedrows); + fDileptonCut.SetMinNCrossedRowsOverFindableClustersTPC(0.8); + fDileptonCut.SetMaxFracSharedClustersTPC(dileptoncuts.cfg_max_frac_shared_clusters_tpc); + fDileptonCut.SetChi2PerClusterTPC(0.0, dileptoncuts.cfg_max_chi2tpc); + fDileptonCut.SetChi2PerClusterITS(0.0, dileptoncuts.cfg_max_chi2its); + fDileptonCut.SetNClustersITS(dileptoncuts.cfg_min_ncluster_its, 7); + fDileptonCut.SetMaxDcaXY(dileptoncuts.cfg_max_dcaxy); + fDileptonCut.SetMaxDcaZ(dileptoncuts.cfg_max_dcaz); + fDileptonCut.SetTrackDca3DRange(0.f, dileptoncuts.cfg_max_dca3dsigma_track); // in sigma + + // for eID + fDileptonCut.SetPIDScheme(dileptoncuts.cfg_pid_scheme); + fDileptonCut.SetTPCNsigmaElRange(dileptoncuts.cfg_min_TPCNsigmaEl, dileptoncuts.cfg_max_TPCNsigmaEl); + fDileptonCut.SetTPCNsigmaPiRange(dileptoncuts.cfg_min_TPCNsigmaPi, dileptoncuts.cfg_max_TPCNsigmaPi); + fDileptonCut.SetTOFNsigmaElRange(dileptoncuts.cfg_min_TOFNsigmaEl, dileptoncuts.cfg_max_TOFNsigmaEl); + } + + void DefineEMCCut() + { + const float a = emccuts.EMC_TM_Eta->at(0); + const float b = emccuts.EMC_TM_Eta->at(1); + const float c = emccuts.EMC_TM_Eta->at(2); + + const float d = emccuts.EMC_TM_Phi->at(0); + const float e = emccuts.EMC_TM_Phi->at(1); + const float f = emccuts.EMC_TM_Phi->at(2); + LOGF(info, "EMCal track matching parameters : a = %f, b = %f, c = %f, d = %f, e = %f, f = %f", a, b, c, d, e, f); + + fEMCCut = EMCPhotonCut("fEMCCut", "fEMCCut"); + + fEMCCut.SetClusterizer(emccuts.clusterDefinition); + fEMCCut.SetMinE(emccuts.EMC_minE); + fEMCCut.SetMinNCell(emccuts.EMC_minNCell); + fEMCCut.SetM02Range(emccuts.EMC_minM02, emccuts.EMC_maxM02); + fEMCCut.SetTimeRange(emccuts.EMC_minTime, emccuts.EMC_maxTime); + + fEMCCut.SetTrackMatchingEta([a, b, c](float pT) { return a + std::pow(pT + b, c); }); + fEMCCut.SetTrackMatchingPhi([d, e, f](float pT) { return d + std::pow(pT + e, f); }); + + fEMCCut.SetMinEoverP(emccuts.EMC_Eoverp); + fEMCCut.SetUseExoticCut(emccuts.EMC_UseExoticCut); + } + + void DefinePHOSCut() + { + fPHOSCut.SetEnergyRange(phoscuts.cfg_min_Ecluster, 1e+10); + } + + SliceCache cache; + Preslice perCollision_pcm = aod::v0photonkf::emeventId; + Preslice perCollision_emc = aod::emccluster::emeventId; + Preslice perCollision_phos = aod::phoscluster::emeventId; + + Preslice perCollision_electron = aod::emprimaryelectron::emeventId; + Partition positrons = o2::aod::emprimaryelectron::sign > int8_t(0) && static_cast(dileptoncuts.cfg_min_pt_track) < o2::aod::track::pt&& nabs(o2::aod::track::eta) < static_cast(dileptoncuts.cfg_max_eta_track) && static_cast(dileptoncuts.cfg_min_TPCNsigmaEl) < o2::aod::pidtpc::tpcNSigmaEl&& o2::aod::pidtpc::tpcNSigmaEl < static_cast(dileptoncuts.cfg_max_TPCNsigmaEl); + Partition electrons = o2::aod::emprimaryelectron::sign < int8_t(0) && static_cast(dileptoncuts.cfg_min_pt_track) < o2::aod::track::pt && nabs(o2::aod::track::eta) < static_cast(dileptoncuts.cfg_max_eta_track) && static_cast(dileptoncuts.cfg_min_TPCNsigmaEl) < o2::aod::pidtpc::tpcNSigmaEl && o2::aod::pidtpc::tpcNSigmaEl < static_cast(dileptoncuts.cfg_max_TPCNsigmaEl); + + template + void runTruePairing(TCollisions const& collisions, + TPhotons1 const& photons1, TPhotons2 const& photons2, + TSubInfos1 const&, TSubInfos2 const&, + TPreslice1 const& perCollision1, TPreslice2 const& perCollision2, + TCut1 const& cut1, TCut2 const& cut2, + TMCCollisions const&, TMCParticles const& mcparticles) + { + for (const auto& collision : collisions) { + initCCDB(collision); + + if (eventcuts.onlyKeepWeightedEvents && std::fabs(collision.weight() - 1.f) < 1e-10) { + continue; + } + + const float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; + if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { + continue; + } + + o2::aod::pwgem::photonmeson::utils::eventhistogram::fillEventInfo<0>(&fRegistry, collision, collision.weight()); + if (!fEMEventCut.IsSelected(collision)) { + continue; + } + o2::aod::pwgem::photonmeson::utils::eventhistogram::fillEventInfo<1>(&fRegistry, collision, collision.weight()); + fRegistry.fill(HIST("Event/before/hCollisionCounter"), 12.0, collision.weight()); // accepted + fRegistry.fill(HIST("Event/after/hCollisionCounter"), 12.0, collision.weight()); // accepted + + if constexpr (pairtype == PairType::kPCMDalitzEE) { + auto photons1_per_collision = photons1.sliceBy(perCollision1, collision.globalIndex()); + auto positrons_per_collision = positrons->sliceByCached(o2::aod::emprimaryelectron::emeventId, collision.globalIndex(), cache); + auto electrons_per_collision = electrons->sliceByCached(o2::aod::emprimaryelectron::emeventId, collision.globalIndex(), cache); + + for (const auto& g1 : photons1_per_collision) { + if (!cut1.template IsSelected(g1)) { + continue; + } + + ROOT::Math::PtEtaPhiMVector v_gamma(g1.pt(), g1.eta(), g1.phi(), 0.f); + fRegistry.fill(HIST("Photon/candidate/hPt"), v_gamma.Pt(), collision.weight()); + fRegistry.fill(HIST("Photon/candidate/hEtaPhi"), v_gamma.Phi() > 0 ? v_gamma.Phi() : v_gamma.Phi() + 2 * M_PI, v_gamma.Eta(), collision.weight()); + + auto pos1 = g1.template posTrack_as(); + auto ele1 = g1.template negTrack_as(); + auto pos1mc = pos1.template emmcparticle_as(); + auto ele1mc = ele1.template emmcparticle_as(); + int photonid1 = FindCommonMotherFrom2Prongs(pos1mc, ele1mc, -11, 11, 22, mcparticles); + if (photonid1 < 0) { + continue; + } + auto g1mc = mcparticles.iteratorAt(photonid1); + + if (cfgRequireTrueAssociation && (g1mc.emmceventId() != collision.emmceventId())) { + continue; + } + + if (g1mc.isPhysicalPrimary() || g1mc.producedByGenerator()) { + fRegistry.fill(HIST("Photon/primary/hPt"), v_gamma.Pt(), collision.weight()); + fRegistry.fill(HIST("Photon/primary/hEtaPhi"), v_gamma.Phi() > 0 ? v_gamma.Phi() : v_gamma.Phi() + 2 * M_PI, v_gamma.Eta(), collision.weight()); + if (g1mc.has_mothers()) { + auto mp = g1mc.template mothers_first_as(); + if (std::abs(mp.pdgCode()) == 111) { + fRegistry.fill(HIST("Photon/fromPi0/hPt"), v_gamma.Pt(), collision.weight()); + fRegistry.fill(HIST("Photon/fromPi0/hEtaPhi"), v_gamma.Phi() > 0 ? v_gamma.Phi() : v_gamma.Phi() + 2 * M_PI, v_gamma.Eta(), collision.weight()); + } + } + } else if (IsFromWD(g1mc.template emmcevent_as(), g1mc, mcparticles) > 0) { + fRegistry.fill(HIST("Photon/fromWD/hPt"), v_gamma.Pt(), collision.weight()); + fRegistry.fill(HIST("Photon/fromWD/hEtaPhi"), v_gamma.Phi() > 0 ? v_gamma.Phi() : v_gamma.Phi() + 2 * M_PI, v_gamma.Eta(), collision.weight()); + } else { + fRegistry.fill(HIST("Photon/fromHS/hPt"), v_gamma.Pt(), collision.weight()); + fRegistry.fill(HIST("Photon/fromHS/hEtaPhi"), v_gamma.Phi() > 0 ? v_gamma.Phi() : v_gamma.Phi() + 2 * M_PI, v_gamma.Eta(), collision.weight()); + } + + for (const auto& [pos2, ele2] : combinations(CombinationsFullIndexPolicy(positrons_per_collision, electrons_per_collision))) { // ULS + if (pos2.trackId() == ele2.trackId()) { // this is protection against pairing identical 2 tracks. + continue; + } + if (pos1.trackId() == pos2.trackId() || ele1.trackId() == ele2.trackId()) { + continue; + } + + if (!cut2.template IsSelectedTrack(pos2, collision) || !cut2.template IsSelectedTrack(ele2, collision)) { + continue; + } + + if (!cut2.template IsSelectedPair(pos2, ele2, d_bz)) { + continue; + } + + auto pos2mc = mcparticles.iteratorAt(pos2.emmcparticleId()); + auto ele2mc = mcparticles.iteratorAt(ele2.emmcparticleId()); + int pi0id = FindCommonMotherFrom3Prongs(g1mc, pos2mc, ele2mc, 22, -11, 11, 111, mcparticles); + if (pi0id < 0) { + continue; + } + auto pi0mc = mcparticles.iteratorAt(pi0id); + if (cfgRequireTrueAssociation && (pi0mc.emmceventId() != collision.emmceventId())) { + continue; + } + ROOT::Math::PtEtaPhiMVector v_pos(pos2.pt(), pos2.eta(), pos2.phi(), o2::constants::physics::MassElectron); + ROOT::Math::PtEtaPhiMVector v_ele(ele2.pt(), ele2.eta(), ele2.phi(), o2::constants::physics::MassElectron); + ROOT::Math::PtEtaPhiMVector veeg = v_gamma + v_pos + v_ele; + + if (pi0mc.isPhysicalPrimary() || pi0mc.producedByGenerator()) { + fRegistry.fill(HIST("Pair/primary/hMvsPt"), veeg.M(), v_gamma.Pt(), collision.weight()); + } else if (IsFromWD(pi0mc.template emmcevent_as(), pi0mc, mcparticles) > 0) { + fRegistry.fill(HIST("Pair/fromWD/hMvsPt"), veeg.M(), v_gamma.Pt(), collision.weight()); + } else { + fRegistry.fill(HIST("Pair/fromHS/hMvsPt"), veeg.M(), v_gamma.Pt(), collision.weight()); + } + + } // end of dielectron loop + } // end of pcm loop + } else { // PCM-EMC, PCM-PHOS. Not supported. + auto photons1_per_collision = photons1.sliceBy(perCollision1, collision.globalIndex()); + auto photons2_per_collision = photons2.sliceBy(perCollision2, collision.globalIndex()); + + for (const auto& [g1, g2] : combinations(CombinationsFullIndexPolicy(photons1_per_collision, photons2_per_collision))) { + if (!cut1.template IsSelected(g1) || !cut2.template IsSelected(g2)) { + continue; + } + // ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.); + // ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.); + // ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; + // if (pi0id > 0) { + // auto pi0mc = mcparticles.iteratorAt(pi0id); + // o2::aod::pwgem::photonmeson::utils::nmhistogram::fillTruePairInfo(&fRegistry, v12, pi0mc, mcparticles, mccollisions, f1fd_k0s_to_pi0, collision.weight()); + // } + } // end of pairing loop + } // end of pairing in same event + } // end of collision loop + } + + Filter collisionFilter_occupancy_track = eventcuts.cfgTrackOccupancyMin <= o2::aod::evsel::trackOccupancyInTimeRange && o2::aod::evsel::trackOccupancyInTimeRange < eventcuts.cfgTrackOccupancyMax; + Filter collisionFilter_occupancy_ft0c = eventcuts.cfgFT0COccupancyMin <= o2::aod::evsel::ft0cOccupancyInTimeRange && o2::aod::evsel::ft0cOccupancyInTimeRange < eventcuts.cfgFT0COccupancyMax; + Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); + using FilteredMyCollisions = soa::Filtered; + + void processAnalysis(FilteredMyCollisions const& collisions, MyMCCollisions const& mccollisions, aod::EMMCParticles const& mcparticles, Types const&... args) + { + if constexpr (pairtype == PairType::kPCMDalitzEE) { + auto v0photons = std::get<0>(std::tie(args...)); + auto v0legs = std::get<1>(std::tie(args...)); + auto emprimaryelectrons = std::get<2>(std::tie(args...)); + // LOGF(info, "electrons.size() = %d, positrons.size() = %d", electrons.size(), positrons.size()); + runTruePairing(collisions, v0photons, emprimaryelectrons, v0legs, emprimaryelectrons, perCollision_pcm, perCollision_electron, fV0PhotonCut, fDileptonCut, mccollisions, mcparticles); + } + // else if constexpr (pairtype == PairType::kPCMEMC) { + // auto v0photons = std::get<0>(std::tie(args...)); + // auto v0legs = std::get<1>(std::tie(args...)); + // auto emcclusters = std::get<2>(std::tie(args...)); + // auto emcmatchedtracks = std::get<3>(std::tie(args...)); + // runPairing(collisions, v0photons, emcclusters, v0legs, nullptr, perCollision_pcm, perCollision_emc, fV0PhotonCut, fEMCCut, emcmatchedtracks, nullptr); + // } else if constexpr (pairtype == PairType::kPCMPHOS) { + // auto v0photons = std::get<0>(std::tie(args...)); + // auto v0legs = std::get<1>(std::tie(args...)); + // auto phosclusters = std::get<2>(std::tie(args...)); + // runPairing(collisions, v0photons, phosclusters, v0legs, nullptr, perCollision_pcm, perCollision_phos, fV0PhotonCut, fPHOSCut, nullptr, nullptr); + // } + } + PROCESS_SWITCH(TaggingPi0MC, processAnalysis, "process pair analysis", false); + + void processDummy(MyCollisions const&) {} + PROCESS_SWITCH(TaggingPi0MC, processDummy, "Dummy function", true); +}; +#endif // PWGEM_PHOTONMESON_CORE_TAGGINGPI0MC_H_ diff --git a/PWGEM/PhotonMeson/Tasks/CMakeLists.txt b/PWGEM/PhotonMeson/Tasks/CMakeLists.txt index d46ce9f0ada..cc011f303f4 100644 --- a/PWGEM/PhotonMeson/Tasks/CMakeLists.txt +++ b/PWGEM/PhotonMeson/Tasks/CMakeLists.txt @@ -134,3 +134,13 @@ o2physics_add_dpl_workflow(prefilter-photon PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGEMPhotonMesonCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(tagging-pi0-pcmdalitzee + SOURCES TaggingPi0PCMDalitzEE.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGEMPhotonMesonCore + COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(tagging-pi0-mc-pcmdalitzee + SOURCES TaggingPi0MCPCMDalitzEE.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGEMPhotonMesonCore + COMPONENT_NAME Analysis) + diff --git a/PWGEM/PhotonMeson/Tasks/TaggingPi0MCPCMDalitzEE.cxx b/PWGEM/PhotonMeson/Tasks/TaggingPi0MCPCMDalitzEE.cxx new file mode 100644 index 00000000000..ccdc4184568 --- /dev/null +++ b/PWGEM/PhotonMeson/Tasks/TaggingPi0MCPCMDalitzEE.cxx @@ -0,0 +1,29 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +// +// ======================== +// +// This code loops over photons and makes pairs for neutral mesons analyses. +// Please write to: daiki.sekihata@cern.ch + +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "PWGEM/PhotonMeson/Core/TaggingPi0MC.h" + +using namespace o2; +using namespace o2::aod; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask>(cfgc, TaskName{"tagging-pi0-mc-pcmdalitzee"}), + }; +} diff --git a/PWGEM/PhotonMeson/Tasks/TaggingPi0PCMDalitzEE.cxx b/PWGEM/PhotonMeson/Tasks/TaggingPi0PCMDalitzEE.cxx new file mode 100644 index 00000000000..2292faef120 --- /dev/null +++ b/PWGEM/PhotonMeson/Tasks/TaggingPi0PCMDalitzEE.cxx @@ -0,0 +1,29 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +// +// ======================== +// +// This code loops over photons and makes pairs for neutral mesons analyses. +// Please write to: daiki.sekihata@cern.ch + +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "PWGEM/PhotonMeson/Core/TaggingPi0.h" + +using namespace o2; +using namespace o2::aod; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask>(cfgc, TaskName{"tagging-pi0-pcmdalitzee"}), + }; +} diff --git a/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx b/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx index ed29c207602..31be005c306 100644 --- a/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx +++ b/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx @@ -97,6 +97,7 @@ struct DalitzEEQC { Configurable cfg_max_chi2its{"cfg_max_chi2its", 5.0, "max chi2/NclsITS"}; Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 1.0, "max dca XY for single track in cm"}; Configurable cfg_max_dcaz{"cfg_max_dcaz", 1.0, "max dca Z for single track in cm"}; + Configurable cfg_max_dca3dsigma_track{"cfg_max_dca3dsigma_track", 1.5, "max DCA 3D in sigma"}; Configurable cfg_pid_scheme{"cfg_pid_scheme", static_cast(DalitzEECut::PIDSchemes::kTOFif), "pid scheme [kTOFif : 0, kTPConly : 1]"}; Configurable cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -2.0, "min. TPC n sigma for electron inclusion"}; @@ -249,6 +250,7 @@ struct DalitzEEQC { fDileptonCut.SetNClustersITS(dileptoncuts.cfg_min_ncluster_its, 7); fDileptonCut.SetMaxDcaXY(dileptoncuts.cfg_max_dcaxy); fDileptonCut.SetMaxDcaZ(dileptoncuts.cfg_max_dcaz); + fDileptonCut.SetTrackDca3DRange(0.f, dileptoncuts.cfg_max_dca3dsigma_track); // in sigma // for eID fDileptonCut.SetPIDScheme(dileptoncuts.cfg_pid_scheme); diff --git a/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx b/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx index e4748f462fb..30457fecb83 100644 --- a/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx @@ -102,6 +102,7 @@ struct DalitzEEQCMC { Configurable cfg_max_chi2its{"cfg_max_chi2its", 5.0, "max chi2/NclsITS"}; Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 1.0, "max dca XY for single track in cm"}; Configurable cfg_max_dcaz{"cfg_max_dcaz", 1.0, "max dca Z for single track in cm"}; + Configurable cfg_max_dca3dsigma_track{"cfg_max_dca3dsigma_track", 1.5, "max DCA 3D in sigma"}; Configurable cfg_pid_scheme{"cfg_pid_scheme", static_cast(DalitzEECut::PIDSchemes::kTOFif), "pid scheme [kTOFif : 0, kTPConly : 1]"}; Configurable cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -2.0, "min. TPC n sigma for electron inclusion"}; @@ -276,6 +277,7 @@ struct DalitzEEQCMC { fDileptonCut.SetNClustersITS(dileptoncuts.cfg_min_ncluster_its, 7); fDileptonCut.SetMaxDcaXY(dileptoncuts.cfg_max_dcaxy); fDileptonCut.SetMaxDcaZ(dileptoncuts.cfg_max_dcaz); + fDileptonCut.SetTrackDca3DRange(0.f, dileptoncuts.cfg_max_dca3dsigma_track); // in sigma // for eID fDileptonCut.SetPIDScheme(dileptoncuts.cfg_pid_scheme); diff --git a/PWGEM/PhotonMeson/Utils/MCUtilities.h b/PWGEM/PhotonMeson/Utils/MCUtilities.h index 11f6251eda3..19432c66475 100644 --- a/PWGEM/PhotonMeson/Utils/MCUtilities.h +++ b/PWGEM/PhotonMeson/Utils/MCUtilities.h @@ -224,7 +224,7 @@ bool IsInAcceptance(TMCParticle const& mcparticle, TMCParticles const& mcparticl template bool IsConversionPointInAcceptance(TMCPhoton const& mcphoton, const float max_r_gen, const float max_eta_gen, const float margin_z_mc, TMCParticles const& mcparticles) { - if (abs(mcphoton.pdgCode()) != 22) { + if (std::abs(mcphoton.pdgCode()) != 22) { return false; } @@ -238,7 +238,7 @@ bool IsConversionPointInAcceptance(TMCPhoton const& mcphoton, const float max_r_ return false; } auto daughter = mcparticles.iteratorAt(daughterId); - if (abs(daughter.pdgCode()) != 11) { + if (std::abs(daughter.pdgCode()) != 11) { return false; } @@ -246,7 +246,7 @@ bool IsConversionPointInAcceptance(TMCPhoton const& mcphoton, const float max_r_ return false; } - float rxy_gen_e = sqrt(pow(daughter.vx(), 2) + pow(daughter.vy(), 2)); + float rxy_gen_e = std::sqrt(std::pow(daughter.vx(), 2) + pow(daughter.vy(), 2)); // LOGF(info, "daughterId = %d , pdg = %d , vx = %f , vy = %f , vz = %f, rxy = %f", daughterId, daughter.pdgCode(), daughter.vx(), daughter.vy(), daughter.vz(), rxy_gen_e); if (rxy_gen_e > max_r_gen || rxy_gen_e < abs(daughter.vz()) * std::tan(2 * std::atan(std::exp(-max_eta_gen))) - margin_z_mc) { return false; From b83664de2298c5d2a10e0b89315b3748e2950be7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Tue, 11 Mar 2025 12:51:53 +0100 Subject: [PATCH 0648/1650] [Infrastructure] MegaLinter: Disable gitleaks (#10440) --- .mega-linter.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.mega-linter.yml b/.mega-linter.yml index 475adff6b0d..e45919ac05a 100644 --- a/.mega-linter.yml +++ b/.mega-linter.yml @@ -19,6 +19,7 @@ DISABLE_LINTERS: - PYTHON_FLAKE8 - PYTHON_ISORT - REPOSITORY_DEVSKIM + - REPOSITORY_GITLEAKS - REPOSITORY_KICS - REPOSITORY_SECRETLINT - REPOSITORY_TRIVY From dff623ea25fcc1a7d1ac58c6353640ad2eac3b31 Mon Sep 17 00:00:00 2001 From: Zhengqing Wang Date: Tue, 11 Mar 2025 20:23:56 +0800 Subject: [PATCH 0649/1650] [PWGCF] update on pidselection (#10439) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/pidcme.cxx | 237 ++++++++++++++++++++++-------------- 1 file changed, 143 insertions(+), 94 deletions(-) diff --git a/PWGCF/Flow/Tasks/pidcme.cxx b/PWGCF/Flow/Tasks/pidcme.cxx index b21a1ee6ce8..4f7f8426e70 100644 --- a/PWGCF/Flow/Tasks/pidcme.cxx +++ b/PWGCF/Flow/Tasks/pidcme.cxx @@ -75,7 +75,7 @@ DECLARE_SOA_TABLE(Flags, "AOD", "Flags", cme_track_pid_columns::NPidFlag); DECLARE_SOA_TABLE(PidInfo, "AOD", "PidInfo", cme_track_pid_columns::AverClusterSizeCosl, cme_track_pid_columns::NSigmaPiITS, cme_track_pid_columns::NSigmaKaITS, cme_track_pid_columns::NSigmaPrITS, cme_track_pid_columns::NSigmaPiTPC, cme_track_pid_columns::NSigmaKaTPC, cme_track_pid_columns::NSigmaPrTPC, cme_track_pid_columns::NSigmaPiTOF, cme_track_pid_columns::NSigmaKaTOF, cme_track_pid_columns::NSigmaPrTOF); } // namespace o2::aod -using TracksPID = soa::Join; +using TracksPID = soa::Join; using CollisionPID = soa::Join; struct FillPIDcolums { Configurable cfgPtMaxforTPCOnlyPID{"cfgPtMaxforTPCOnlyPID", 0.4, "Maxmium track pt for TPC only PID,only when onlyTOF and onlyTOFHIT closed"}; @@ -85,7 +85,9 @@ struct FillPIDcolums { Configurable cfgMaxTPCChi2NCl{"cfgMaxTPCChi2NCl", 2.5, "Maximum chi2 per cluster TPC for PID if not use costom track cuts"}; Configurable cfgMaxChi2NClITS{"cfgMaxChi2NClITS", 2.5, "Maximum chi2 per cluster ITS for PID if not use costom track cuts"}; Configurable cfgMinTPCCls{"cfgMinTPCCls", 70, "Minimum TPC clusters for PID if not use costom track cuts"}; - Configurable cfgMinITSCls{"cfgMinITSCls", 5, "Minimum ITS clusters for PID if not use costom track cuts"}; + Configurable cfgMinITSCls{"cfgMinITSCls", 1, "Minimum ITS clusters for PID if not use costom track cuts"}; + Configurable cfgMaxDCAxy{"cfgMaxDCAxy", 99, "Maxium DCAxy for standard PID tracking"}; + Configurable cfgMaxDCAz{"cfgMaxDCAz", 2, "Maxium DCAz for standard PID tracking"}; Configurable cfgAveClusSizeCoslMinPi{"cfgAveClusSizeCoslMinPi", 0, "Base line for minmum ITS cluster size x cos(#lambda) for Pions"}; Configurable cfgAveClusSizeCoslMaxPi{"cfgAveClusSizeCoslMaxPi", 1e9, "Base line for maxmum ITS cluster size x cos(#lambda) for Pions"}; Configurable cfgAveClusSizeCoslMinKa{"cfgAveClusSizeCoslMinKa", 0, "Base line for minmum ITS cluster size x cos(#lambda) for Kaons"}; @@ -106,6 +108,7 @@ struct FillPIDcolums { ConfigurableAxis cfgaxisetaPID{"cfgaxisetaPID", {90, -0.9, 0.9}, "Binning for Pt QA"}; Configurable cfgQuietMode{"cfgQuietMode", false, "open quiet mode for saving cpu cost and only do some basic QA plots"}; + Configurable cfgRequireGlobalTrack{"cfgRequireGlobalTrack", false, "Require track used must be the global track"}; Configurable cfgOpenPlotnSigmaTOFITSPt{"cfgOpenPlotnSigmaTOFITSPt", true, "plot nSigmaTOF vs nSigmaITS vs Pt"}; Configurable cfgOpenPlotnSigmaITSTPCPt{"cfgOpenPlotnSigmaITSTPCPt", true, "plot nSigmaITS vs nSigmaTOF vs Pt"}; Configurable cfgOpenPlotnSigmaTOFTPCPt{"cfgOpenPlotnSigmaTOFTPCPt", true, "plot nSigmaTOF vs nSigmaTPC vs Pt"}; @@ -131,22 +134,35 @@ struct FillPIDcolums { Configurable cfgOpenPtRangedTPCnSigmacutPr{"cfgOpenPtRangedTPCnSigmacutPr", false, "use nSigma TPC cut for different pt Proton"}; Configurable cfgOpenPtRangedITSnSigmacutPr{"cfgOpenPtRangedITSnSigmacutPr", false, "use nSigma ITS cut for different pt Proton"}; - Configurable> cfgnSigmaCutTPC{"cfgnSigmaCutTPC", {3, 3, 3}, "TPC nsigma cut for pi k p respectively at low pt and for the TPCOnly case"}; - Configurable> cfgnSigmaCutTOF{"cfgnSigmaCutTOF", {1.5, 1.5, 1.5}, "TOF nsigma cut for pi k p respectively for the TOFonly case"}; - Configurable> cfgnSigmaCutRMS{"cfgnSigmaCutRMS", {3, 3, 3}, "TPC_TOF combined cut for pi k p respectively at high pt"}; - Configurable> cfgnSigmaCutITS{"cfgnSigmaCutITS", {3, 2.5, 2}, "ITS nSigma cut for pi k p"}; + Configurable> cfgnSigmaCutTPCUpper{"cfgnSigmaCutTPCUpper", {3, 3, 3}, "TPC nsigma cut upper limit for pi k p respectively at low pt and for the TPCOnly case"}; + Configurable> cfgnSigmaCutTOFUpper{"cfgnSigmaCutTOFUpper", {1.5, 1.5, 1.5}, "TOF nsigma cut upper limit for pi k p respectively for the TOFonly case"}; + Configurable> cfgnSigmaCutRMSUpper{"cfgnSigmaCutRMSUpper", {3, 3, 3}, "TPC_TOF combined cut upper limit for pi k p respectively at high pt"}; + Configurable> cfgnSigmaCutITSUpper{"cfgnSigmaCutITSUpper", {3, 2.5, 2}, "ITS nSigma cut upper limit for pi k p"}; + Configurable> cfgnSigmaCutTPCLower{"cfgnSigmaCutTPCLower", {-3, -3, -3}, "TPC nsigma cut lower limit for pi k p respectively at low pt and for the TPCOnly case"}; + Configurable> cfgnSigmaCutTOFLower{"cfgnSigmaCutTOFLower", {-1.5, -1.5, -1.5}, "TOF nsigma cut lower limit for pi k p respectively for the TOFonly case"}; + Configurable> cfgnSigmaCutRMSLower{"cfgnSigmaCutRMSLower", {-3, -3, -3}, "TPC_TOF combined cut lower limit for pi k p respectively at high pt"}; + Configurable> cfgnSigmaCutITSLower{"cfgnSigmaCutITSLower", {-3, -2.5, -2}, "ITS nSigma cut lower limit for pi k p"}; Configurable> cfgPtBinPionPID{"cfgPtBinPionPID", {0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 3.0, 3.5, 4.0, 5.0, 6.0, 8.0, 10.0}, "pt bin for pion PIDnsigma"}; Configurable> cfgPtBinKaonPID{"cfgPtBinKaonPID", {0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 3.0, 3.5, 4.0, 5.0, 6.0}, "pt bin for pion PIDnsigma"}; Configurable> cfgPtBinProtonPID{"cfgPtBinProtonPID", {0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 3.0, 3.5, 4.0, 5.0, 6.0}, "pt bin for pion PIDnsigma"}; - Configurable> cfgnSigmaTPCPionPt{"cfgnSigmaTPCPionPt", {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, "nSigmaTPC cut anchored to pion pt bins"}; - Configurable> cfgnSigmaTOFPionPt{"cfgnSigmaTOFPionPt", {1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5}, "nSigmaTOF cut anchored to pion pt bins"}; - Configurable> cfgnSigmaITSPionPt{"cfgnSigmaITSPionPt", {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, "nSigmaITS cut anchored to pion pt bins"}; - Configurable> cfgnSigmaTPCKaonPt{"cfgnSigmaTPCKaonPt", {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, "nSigmaTPC cut anchored to kaon pt bins"}; - Configurable> cfgnSigmaTOFKaonPt{"cfgnSigmaTOFKaonPt", {1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5}, "nSigmaTOF cut anchored to kaon pt bins"}; - Configurable> cfgnSigmaITSKaonPt{"cfgnSigmaITSKaonPt", {2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5}, "nSigmaITS cut anchored to kaon pt bins"}; - Configurable> cfgnSigmaTPCProtonPt{"cfgnSigmaTPCProtonPt", {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, "nSigmaTPC cut anchored to proton pt bins"}; - Configurable> cfgnSigmaTOFProtonPt{"cfgnSigmaTOFProtonPt", {1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5}, "nSigmaTOF cut anchored to proton pt bins"}; - Configurable> cfgnSigmaITSProtonPt{"cfgnSigmaITSProtonPt", {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, "nSigmaITS cut anchored to proton pt bins"}; + Configurable> cfgnSigmaTPCPionPtUpper{"cfgnSigmaTPCPionPtUpper", {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, "nSigmaTPC cut upper limit anchored to pion pt bins"}; + Configurable> cfgnSigmaTOFPionPtUpper{"cfgnSigmaTOFPionPtUpper", {1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5}, "nSigmaTOF cut upper limit anchored to pion pt bins"}; + Configurable> cfgnSigmaITSPionPtUpper{"cfgnSigmaITSPionPtUpper", {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, "nSigmaITS cut upper limit anchored to pion pt bins"}; + Configurable> cfgnSigmaTPCKaonPtUpper{"cfgnSigmaTPCKaonPtUpper", {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, "nSigmaTPC cut upper limit anchored to kaon pt bins"}; + Configurable> cfgnSigmaTOFKaonPtUpper{"cfgnSigmaTOFKaonPtUpper", {1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5}, "nSigmaTOF cut upper limit anchored to kaon pt bins"}; + Configurable> cfgnSigmaITSKaonPtUpper{"cfgnSigmaITSKaonPtUpper", {2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5}, "nSigmaITS cut upper limit anchored to kaon pt bins"}; + Configurable> cfgnSigmaTPCProtonPtUpper{"cfgnSigmaTPCProtonPtUpper", {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, "nSigmaTPC cut upper limit anchored to proton pt bins"}; + Configurable> cfgnSigmaTOFProtonPtUpper{"cfgnSigmaTOFProtonPtUpper", {1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5}, "nSigmaTOF cut upper limit anchored to proton pt bins"}; + Configurable> cfgnSigmaITSProtonPtUpper{"cfgnSigmaITSProtonPtUpper", {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, "nSigmaITS cut upper limit anchored to proton pt bins"}; + Configurable> cfgnSigmaTPCPionPtLower{"cfgnSigmaTPCPionPtLower", {-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3}, "nSigmaTPC cut lower limit anchored to pion pt bins"}; + Configurable> cfgnSigmaTOFPionPtLower{"cfgnSigmaTOFPionPtLower", {-1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5}, "nSigmaTOF cut lower limit anchored to pion pt bins"}; + Configurable> cfgnSigmaITSPionPtLower{"cfgnSigmaITSPionPtLower", {-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3}, "nSigmaITS cut lower limit anchored to pion pt bins"}; + Configurable> cfgnSigmaTPCKaonPtLower{"cfgnSigmaTPCKaonPtLower", {-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3}, "nSigmaTPC cut lower limit anchored to kaon pt bins"}; + Configurable> cfgnSigmaTOFKaonPtLower{"cfgnSigmaTOFKaonPtLower", {-1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5}, "nSigmaTOF cut lower limit anchored to kaon pt bins"}; + Configurable> cfgnSigmaITSKaonPtLower{"cfgnSigmaITSKaonPtLower", {-2.5, -2.5, -2.5, -2.5, -2.5, -2.5, -2.5, -2.5, -2.5, -2.5, -2.5, -2.5, -2.5, -2.5, -2.5, -2.5, -2.5, -2.5}, "nSigmaITS cut lower limit anchored to kaon pt bins"}; + Configurable> cfgnSigmaTPCProtonPtLower{"cfgnSigmaTPCProtonPtLower", {-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3}, "nSigmaTPC cut lower limit anchored to proton pt bins"}; + Configurable> cfgnSigmaTOFProtonPtLower{"cfgnSigmaTOFProtonPtLower", {-1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5}, "nSigmaTOF cut lower limit anchored to proton pt bins"}; + Configurable> cfgnSigmaITSProtonPtLower{"cfgnSigmaITSProtonPtLower", {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2}, "nSigmaITS cut lower limit anchored to proton pt bins"}; static float averageClusterSizeCosl(uint32_t itsClusterSizes, float eta) { @@ -173,6 +189,10 @@ struct FillPIDcolums { return false; if (std::abs(track.eta()) > cfgMaxEtaPID) return false; + if (cfgRequireGlobalTrack) { + if (!(track.isGlobalTrackSDD() == (uint8_t) true)) + return false; + } if (cfgUseCostomTrackCuts) { if (!track.passedITSNCls()) return false; @@ -182,6 +202,12 @@ struct FillPIDcolums { return false; if (!track.passedTPCChi2NDF()) return false; + if (!track.passedTPCCrossedRowsOverNCls()) + return false; + if (!track.passedDCAxy()) + return false; + if (!track.passedDCAz()) + return false; } else { if (track.tpcChi2NCl() > cfgMaxTPCChi2NCl) return false; @@ -191,13 +217,11 @@ struct FillPIDcolums { return false; if (track.itsNCls() < cfgMinITSCls) return false; + if (std::abs(track.dcaXY()) > cfgMaxDCAxy) + return false; + if (std::abs(track.dcaZ()) > cfgMaxDCAz) + return false; } - if (!track.passedTPCCrossedRowsOverNCls()) - return false; - if (!track.passedDCAxy()) - return false; - if (!track.passedDCAz()) - return false; return true; } @@ -210,9 +234,12 @@ struct FillPIDcolums { std::array nSigmaTOF = {candidate.tofNSigmaPi(), candidate.tofNSigmaKa(), candidate.tofNSigmaPr()}; std::array nSigmaCombined = {std::hypot(candidate.tpcNSigmaPi(), candidate.tofNSigmaPi()), std::hypot(candidate.tpcNSigmaKa(), candidate.tofNSigmaKa()), std::hypot(candidate.tpcNSigmaPr(), candidate.tofNSigmaPr())}; std::array nSigmaToUse; - std::vector pidVector; - std::vector pidVectorTOFPt; - std::vector pidVectorTPCPt; + std::vector pidVectorUpper; + std::vector pidVectorLower; + std::vector pidVectorTOFPtUpper; + std::vector pidVectorTOFPtLower; + std::vector pidVectorTPCPtUpper; + std::vector pidVectorTPCPtLower; int pid = -1; bool kIsPi = false, kIsKa = false, kIsPr = false; int currentPtBinPi = -1, currentPtBinKa = -1, currentPtBinPr = -1; @@ -240,35 +267,50 @@ struct FillPIDcolums { } } } - float nSigmaTOFCutPiPt = (currentPtBinPi == -1) ? cfgnSigmaCutTOF.value[0] : cfgnSigmaTOFPionPt.value[currentPtBinPi]; - float nSigmaTOFCutKaPt = (currentPtBinKa == -1) ? cfgnSigmaCutTOF.value[1] : cfgnSigmaTOFKaonPt.value[currentPtBinKa]; - float nSigmaTOFCutPrPt = (currentPtBinPr == -1) ? cfgnSigmaCutTOF.value[2] : cfgnSigmaTOFProtonPt.value[currentPtBinPr]; - float nSigmaTPCCutPiPt = (currentPtBinPi == -1) ? cfgnSigmaCutTPC.value[0] : cfgnSigmaTPCPionPt.value[currentPtBinPi]; - float nSigmaTPCCutKaPt = (currentPtBinKa == -1) ? cfgnSigmaCutTPC.value[1] : cfgnSigmaTPCKaonPt.value[currentPtBinKa]; - float nSigmaTPCCutPrPt = (currentPtBinPr == -1) ? cfgnSigmaCutTPC.value[2] : cfgnSigmaTPCProtonPt.value[currentPtBinPr]; - pidVectorTOFPt.push_back(nSigmaTOFCutPiPt); - pidVectorTOFPt.push_back(nSigmaTOFCutKaPt); - pidVectorTOFPt.push_back(nSigmaTOFCutPrPt); - pidVectorTPCPt.push_back(nSigmaTPCCutPiPt); - pidVectorTPCPt.push_back(nSigmaTPCCutKaPt); - pidVectorTPCPt.push_back(nSigmaTPCCutPrPt); + float nSigmaTOFCutPiPtUpper = (currentPtBinPi == -1) ? cfgnSigmaCutTOFUpper.value[0] : cfgnSigmaTOFPionPtUpper.value[currentPtBinPi]; + float nSigmaTOFCutKaPtUpper = (currentPtBinKa == -1) ? cfgnSigmaCutTOFUpper.value[1] : cfgnSigmaTOFKaonPtUpper.value[currentPtBinKa]; + float nSigmaTOFCutPrPtUpper = (currentPtBinPr == -1) ? cfgnSigmaCutTOFUpper.value[2] : cfgnSigmaTOFProtonPtUpper.value[currentPtBinPr]; + float nSigmaTPCCutPiPtUpper = (currentPtBinPi == -1) ? cfgnSigmaCutTPCUpper.value[0] : cfgnSigmaTPCPionPtUpper.value[currentPtBinPi]; + float nSigmaTPCCutKaPtUpper = (currentPtBinKa == -1) ? cfgnSigmaCutTPCUpper.value[1] : cfgnSigmaTPCKaonPtUpper.value[currentPtBinKa]; + float nSigmaTPCCutPrPtUpper = (currentPtBinPr == -1) ? cfgnSigmaCutTPCUpper.value[2] : cfgnSigmaTPCProtonPtUpper.value[currentPtBinPr]; + float nSigmaTOFCutPiPtLower = (currentPtBinPi == -1) ? cfgnSigmaCutTOFLower.value[0] : cfgnSigmaTOFPionPtLower.value[currentPtBinPi]; + float nSigmaTOFCutKaPtLower = (currentPtBinKa == -1) ? cfgnSigmaCutTOFLower.value[1] : cfgnSigmaTOFKaonPtLower.value[currentPtBinKa]; + float nSigmaTOFCutPrPtLower = (currentPtBinPr == -1) ? cfgnSigmaCutTOFLower.value[2] : cfgnSigmaTOFProtonPtLower.value[currentPtBinPr]; + float nSigmaTPCCutPiPtLower = (currentPtBinPi == -1) ? cfgnSigmaCutTPCLower.value[0] : cfgnSigmaTPCPionPtLower.value[currentPtBinPi]; + float nSigmaTPCCutKaPtLower = (currentPtBinKa == -1) ? cfgnSigmaCutTPCLower.value[1] : cfgnSigmaTPCKaonPtLower.value[currentPtBinKa]; + float nSigmaTPCCutPrPtLower = (currentPtBinPr == -1) ? cfgnSigmaCutTPCLower.value[2] : cfgnSigmaTPCProtonPtLower.value[currentPtBinPr]; + pidVectorTOFPtUpper.push_back(nSigmaTOFCutPiPtUpper); + pidVectorTOFPtUpper.push_back(nSigmaTOFCutKaPtUpper); + pidVectorTOFPtUpper.push_back(nSigmaTOFCutPrPtUpper); + pidVectorTPCPtUpper.push_back(nSigmaTPCCutPiPtUpper); + pidVectorTPCPtUpper.push_back(nSigmaTPCCutKaPtUpper); + pidVectorTPCPtUpper.push_back(nSigmaTPCCutPrPtUpper); + pidVectorTOFPtLower.push_back(nSigmaTOFCutPiPtLower); + pidVectorTOFPtLower.push_back(nSigmaTOFCutKaPtLower); + pidVectorTOFPtLower.push_back(nSigmaTOFCutPrPtLower); + pidVectorTPCPtLower.push_back(nSigmaTPCCutPiPtLower); + pidVectorTPCPtLower.push_back(nSigmaTPCCutKaPtLower); + pidVectorTPCPtLower.push_back(nSigmaTPCCutPrPtLower); // Choose which nSigma array and PIDcut array to use if (cfgOpenTOFOnlyPID) { if (!candidate.hasTOF()) - return -1; + return 0; nSigmaToUse = nSigmaTOF; - pidVector = pidVectorTOFPt; + pidVectorUpper = pidVectorTOFPtUpper; + pidVectorLower = pidVectorTOFPtLower; } else if (cfgOpenTPCOnlyPID) { nSigmaToUse = nSigmaTPC; - pidVector = pidVectorTPCPt; + pidVectorUpper = pidVectorTPCPtUpper; + pidVectorLower = pidVectorTPCPtLower; } else { nSigmaToUse = (candidate.pt() > cfgPtMaxforTPCOnlyPID && candidate.hasTOF()) ? nSigmaCombined : nSigmaTPC; - pidVector = (candidate.pt() > cfgPtMaxforTPCOnlyPID && candidate.hasTOF()) ? cfgnSigmaCutRMS.value : cfgnSigmaCutTPC.value; + pidVectorUpper = (candidate.pt() > cfgPtMaxforTPCOnlyPID && candidate.hasTOF()) ? cfgnSigmaCutRMSUpper.value : cfgnSigmaCutTPCUpper.value; + pidVectorLower = (candidate.pt() > cfgPtMaxforTPCOnlyPID && candidate.hasTOF()) ? cfgnSigmaCutRMSLower.value : cfgnSigmaCutTPCLower.value; } - float nsigma = pidVector[0]; + float nsigma = 9999.99; // Fill cross pid QA for (int i = 0; i < 3; ++i) { - if (std::abs(nSigmaToUse[i]) < pidVector[i]) { + if (nSigmaToUse[i] > pidVectorLower[i] && nSigmaToUse[i] < pidVectorUpper[i]) { if (i == 0) { kIsPi = true; if (!cfgQuietMode) { @@ -402,7 +444,7 @@ struct FillPIDcolums { } else { // Select particle with the lowest nsigma (If not allow cross track) for (int i = 0; i < 3; ++i) { - if (std::abs(nSigmaToUse[i]) < nsigma && std::abs(nSigmaToUse[i]) < pidVector[i]) { + if (std::abs(nSigmaToUse[i]) < nsigma && (nSigmaToUse[i] > pidVectorLower[i] && nSigmaToUse[i] < pidVectorUpper[i])) { pid = i; nsigma = std::abs(nSigmaToUse[i]); } @@ -410,15 +452,19 @@ struct FillPIDcolums { return pid + 1; // shift the pid by 1, 1 = pion, 2 = kaon, 3 = proton } // Clear the vectors - std::vector().swap(pidVector); - std::vector().swap(pidVectorTOFPt); - std::vector().swap(pidVectorTPCPt); + std::vector().swap(pidVectorLower); + std::vector().swap(pidVectorUpper); + std::vector().swap(pidVectorTOFPtUpper); + std::vector().swap(pidVectorTPCPtLower); + std::vector().swap(pidVectorTOFPtUpper); + std::vector().swap(pidVectorTPCPtLower); } template bool selectionITS(const T& candidate, int mode, float avgclssize) { - std::array nSigmaITSToUse; + std::array nSigmaITSToUseUpper; + std::array nSigmaITSToUseLower; int currentPtBinPi = -1, currentPtBinKa = -1, currentPtBinPr = -1; if (cfgOpenPtRangedITSnSigmacutPi) { for (int i = 0; i < static_cast(cfgPtBinPionPID.value.size()) - 1; ++i) { @@ -444,12 +490,15 @@ struct FillPIDcolums { } } } - nSigmaITSToUse[0] = (currentPtBinPi == -1) ? cfgnSigmaCutITS.value[0] : cfgnSigmaITSPionPt.value[currentPtBinPi]; - nSigmaITSToUse[1] = (currentPtBinKa == -1) ? cfgnSigmaCutITS.value[1] : cfgnSigmaITSKaonPt.value[currentPtBinKa]; - nSigmaITSToUse[2] = (currentPtBinPr == -1) ? cfgnSigmaCutITS.value[2] : cfgnSigmaITSProtonPt.value[currentPtBinPr]; + nSigmaITSToUseUpper[0] = (currentPtBinPi == -1) ? cfgnSigmaCutITSUpper.value[0] : cfgnSigmaITSPionPtUpper.value[currentPtBinPi]; + nSigmaITSToUseUpper[1] = (currentPtBinKa == -1) ? cfgnSigmaCutITSUpper.value[1] : cfgnSigmaITSKaonPtUpper.value[currentPtBinKa]; + nSigmaITSToUseUpper[2] = (currentPtBinPr == -1) ? cfgnSigmaCutITSUpper.value[2] : cfgnSigmaITSProtonPtUpper.value[currentPtBinPr]; + nSigmaITSToUseLower[0] = (currentPtBinPi == -1) ? cfgnSigmaCutITSLower.value[0] : cfgnSigmaITSPionPtLower.value[currentPtBinPi]; + nSigmaITSToUseLower[1] = (currentPtBinKa == -1) ? cfgnSigmaCutITSLower.value[1] : cfgnSigmaITSKaonPtLower.value[currentPtBinKa]; + nSigmaITSToUseLower[2] = (currentPtBinPr == -1) ? cfgnSigmaCutITSLower.value[2] : cfgnSigmaITSProtonPtLower.value[currentPtBinPr]; switch (mode) { case 1: // For Pion - if (!(std::abs(candidate.itsNSigmaPi()) < nSigmaITSToUse[0] && avgclssize > cfgAveClusSizeCoslMinPi && avgclssize < cfgAveClusSizeCoslMaxPi)) { + if (!((candidate.itsNSigmaPi() > nSigmaITSToUseLower[0] && candidate.itsNSigmaPi() < nSigmaITSToUseUpper[0]) && avgclssize > cfgAveClusSizeCoslMinPi && avgclssize < cfgAveClusSizeCoslMaxPi)) { return false; } else { return true; @@ -457,7 +506,7 @@ struct FillPIDcolums { break; case 2: // For Kaon - if (!(std::abs(candidate.itsNSigmaKa()) < nSigmaITSToUse[1] && avgclssize > cfgAveClusSizeCoslMinKa && avgclssize < cfgAveClusSizeCoslMaxKa)) { + if (!((candidate.itsNSigmaKa() > nSigmaITSToUseLower[1] && candidate.itsNSigmaKa() < nSigmaITSToUseUpper[1]) && avgclssize > cfgAveClusSizeCoslMinKa && avgclssize < cfgAveClusSizeCoslMaxKa)) { return false; } else { return true; @@ -465,7 +514,7 @@ struct FillPIDcolums { break; case 3: // For Proton - if (!(std::abs(candidate.itsNSigmaPr()) < nSigmaITSToUse[2] && avgclssize > cfgAveClusSizeCoslMinPr && avgclssize < cfgAveClusSizeCoslMaxPr)) { + if (!((candidate.itsNSigmaPr() > nSigmaITSToUseLower[2] && candidate.itsNSigmaPr() < nSigmaITSToUseUpper[2]) && avgclssize > cfgAveClusSizeCoslMinPr && avgclssize < cfgAveClusSizeCoslMaxPr)) { return false; } else { return true; @@ -1682,15 +1731,15 @@ struct pidcme { // o2-linter: disable=name/struct Configurable cfgkOpenPiKa{"cfgkOpenPiKa", true, "open Pi-Ka"}; Configurable cfgkOpenPiPr{"cfgkOpenPiPr", true, "open Pi-Pr"}; Configurable cfgkOpenKaPr{"cfgkOpenKaPr", true, "open Ka-Pr"}; - Configurable cfgkOpenHaHa{"cfgkOpenHaHa", false, "open Ha-Ha"}; + Configurable cfgkOpenHaHa{"cfgkOpenHaHa", true, "open Ha-Ha"}; Configurable cfgkOpenSsOsCrossCheck{"cfgkOpenSsOsCrossCheck", false, "open check for matter an antimatter #gamma#delta"}; Configurable cfgkOpenTPCITSPurityCut{"cfgkOpenTPCITSPurityCut", true, "open ITS-TPC purity cut"}; Configurable cfgkOpenTPCITSPurityCutQA{"cfgkOpenTPCITSPurityCutQA", true, "open ITS-TPC purity cut QA plots"}; Configurable cfgkOpenDebugPIDCME{"cfgkOpenDebugPIDCME", false, "open pidcme workflow debug mode"}; Configurable cfgOpenPlotITSNcls{"cfgOpenPlotITSNcls", true, "open QA for overall ITSNcls distribution"}; Configurable cfgOpenPlotITSNclsPtCent{"cfgOpenPlotITSNclsPtCent", false, "open QA for ITSNcls distribution vs centality and pt"}; - Configurable cfgOpenTPCNcls{"cfgOpenTPCNcls", true, "open QA for overall TPCNcls distribution"}; - Configurable cfgOpenTPCNclsPtCent{"cfgOpenTPCNclsPtCent", false, "open QA for TPCNcls distribution vs centality and pt"}; + Configurable cfgOpenPlotTPCNcls{"cfgOpenPlotTPCNcls", true, "open QA for overall TPCNcls distribution"}; + Configurable cfgOpenPlotTPCNclsPtCent{"cfgOpenPlotTPCNclsPtCent", false, "open QA for TPCNcls distribution vs centality and pt"}; Configurable cfgOpenCustomTrackCutAssurance{"cfgOpenCustomTrackCutAssurance", true, "Assure track using for v2 and cme pass the custom track cuts"}; Configurable> cfgITSPurityCen{"cfgITSPurityCen", {20, 30}, "ITS purity cut centrality"}; @@ -1884,7 +1933,7 @@ struct pidcme { // o2-linter: disable=name/struct histosQA.add(Form("QA/histITSNclsPtCent_PosPr"), ";ITSNcls;Pt;Centrality", {HistType::kTH3F, {axisITSNcls, axisPt, axisCentMerged}}); histosQA.add(Form("QA/histITSNclsPtCent_NegPr"), ";ITSNcls;Pt;Centrality", {HistType::kTH3F, {axisITSNcls, axisPt, axisCentMerged}}); } - if (cfgOpenTPCNcls) { + if (cfgOpenPlotTPCNcls) { histosQA.add(Form("QA/histTPCNcls_PosPi"), ";TPCNcls;counts", {HistType::kTH1F, {axisTPCNcls}}); histosQA.add(Form("QA/histTPCNcls_NegPi"), ";TPCNcls;counts", {HistType::kTH1F, {axisTPCNcls}}); histosQA.add(Form("QA/histTPCNcls_PosKa"), ";TPCNcls;counts", {HistType::kTH1F, {axisTPCNcls}}); @@ -1892,7 +1941,7 @@ struct pidcme { // o2-linter: disable=name/struct histosQA.add(Form("QA/histTPCNcls_PosPr"), ";TPCNcls;counts", {HistType::kTH1F, {axisTPCNcls}}); histosQA.add(Form("QA/histTPCNcls_NegPr"), ";TPCNcls;counts", {HistType::kTH1F, {axisTPCNcls}}); } - if (cfgOpenTPCNclsPtCent) { + if (cfgOpenPlotTPCNclsPtCent) { histosQA.add(Form("QA/histTPCNclsPtCent_PosPi"), ";TPCNcls;Pt;Centrality", {HistType::kTH3F, {axisTPCNcls, axisPt, axisCentMerged}}); histosQA.add(Form("QA/histTPCNclsPtCent_NegPi"), ";TPCNcls;Pt;Centrality", {HistType::kTH3F, {axisTPCNcls, axisPt, axisCentMerged}}); histosQA.add(Form("QA/histTPCNclsPtCent_PosKa"), ";TPCNcls;Pt;Centrality", {HistType::kTH3F, {axisTPCNcls, axisPt, axisCentMerged}}); @@ -2382,10 +2431,10 @@ struct pidcme { // o2-linter: disable=name/struct if (cfgOpenPlotITSNclsPtCent) { histosQA.fill(HIST("QA/histITSNclsPtCent_PosPi"), trk.itsNCls(), trk.pt(), cent); } - if (cfgOpenTPCNcls) { + if (cfgOpenPlotTPCNcls) { histosQA.fill(HIST("QA/histTPCNcls_PosPi"), trk.tpcNClsFound()); } - if (cfgOpenTPCNclsPtCent) { + if (cfgOpenPlotTPCNclsPtCent) { histosQA.fill(HIST("QA/histTPCNclsPtCent_PosPi"), trk.tpcNClsFound(), trk.pt(), cent); } } else if (trk.sign() < 0) { @@ -2397,10 +2446,10 @@ struct pidcme { // o2-linter: disable=name/struct if (cfgOpenPlotITSNclsPtCent) { histosQA.fill(HIST("QA/histITSNclsPtCent_NegPi"), trk.itsNCls(), trk.pt(), cent); } - if (cfgOpenTPCNcls) { + if (cfgOpenPlotTPCNcls) { histosQA.fill(HIST("QA/histTPCNcls_NegPi"), trk.tpcNClsFound()); } - if (cfgOpenTPCNclsPtCent) { + if (cfgOpenPlotTPCNclsPtCent) { histosQA.fill(HIST("QA/histTPCNclsPtCent_NegPi"), trk.tpcNClsFound(), trk.pt(), cent); } } @@ -2419,10 +2468,10 @@ struct pidcme { // o2-linter: disable=name/struct if (cfgOpenPlotITSNclsPtCent) { histosQA.fill(HIST("QA/histITSNclsPtCent_PosKa"), trk.itsNCls(), trk.pt(), cent); } - if (cfgOpenTPCNcls) { + if (cfgOpenPlotTPCNcls) { histosQA.fill(HIST("QA/histTPCNcls_PosKa"), trk.tpcNClsFound()); } - if (cfgOpenTPCNclsPtCent) { + if (cfgOpenPlotTPCNclsPtCent) { histosQA.fill(HIST("QA/histTPCNclsPtCent_PosKa"), trk.tpcNClsFound(), trk.pt(), cent); } } else if (trk.sign() < 0) { @@ -2434,10 +2483,10 @@ struct pidcme { // o2-linter: disable=name/struct if (cfgOpenPlotITSNclsPtCent) { histosQA.fill(HIST("QA/histITSNclsPtCent_NegKa"), trk.itsNCls(), trk.pt(), cent); } - if (cfgOpenTPCNcls) { + if (cfgOpenPlotTPCNcls) { histosQA.fill(HIST("QA/histTPCNcls_NegKa"), trk.tpcNClsFound()); } - if (cfgOpenTPCNclsPtCent) { + if (cfgOpenPlotTPCNclsPtCent) { histosQA.fill(HIST("QA/histTPCNclsPtCent_NegKa"), trk.tpcNClsFound(), trk.pt(), cent); } } @@ -2456,10 +2505,10 @@ struct pidcme { // o2-linter: disable=name/struct if (cfgOpenPlotITSNclsPtCent) { histosQA.fill(HIST("QA/histITSNclsPtCent_PosPr"), trk.itsNCls(), trk.pt(), cent); } - if (cfgOpenTPCNcls) { + if (cfgOpenPlotTPCNcls) { histosQA.fill(HIST("QA/histTPCNcls_PosPr"), trk.tpcNClsFound()); } - if (cfgOpenTPCNclsPtCent) { + if (cfgOpenPlotTPCNclsPtCent) { histosQA.fill(HIST("QA/histTPCNclsPtCent_PosPr"), trk.tpcNClsFound(), trk.pt(), cent); } } else if (trk.sign() < 0) { @@ -2471,10 +2520,10 @@ struct pidcme { // o2-linter: disable=name/struct if (cfgOpenPlotITSNclsPtCent) { histosQA.fill(HIST("QA/histITSNclsPtCent_NegPr"), trk.itsNCls(), trk.pt(), cent); } - if (cfgOpenTPCNcls) { + if (cfgOpenPlotTPCNcls) { histosQA.fill(HIST("QA/histTPCNcls_NegPr"), trk.tpcNClsFound()); } - if (cfgOpenTPCNclsPtCent) { + if (cfgOpenPlotTPCNclsPtCent) { histosQA.fill(HIST("QA/histTPCNclsPtCent_NegPr"), trk.tpcNClsFound(), trk.pt(), cent); } } @@ -3049,22 +3098,22 @@ struct pidcme { // o2-linter: disable=name/struct histosQA.fill(HIST("PIDCME/histdelta_HaHa_ss"), cent, std::cos((trk1.phi() - trk2.phi()))); if (cfgkOpenCMEDifferential) { if (cfgkOpenDeltaPt) { - histosQA.fill(HIST("PIDCME/Differential/histgamma_HaHa_ss_DPt"), cent, trk2.pt() - trk2.pt(), - std::cos((trk2.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_HaHa_ss_DPt"), cent, trk2.pt() - trk2.pt(), - std::cos((trk2.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/Differential/histgamma_HaHa_ss_DPt"), cent, trk1.pt() - trk2.pt(), + std::cos((trk1.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_HaHa_ss_DPt"), cent, trk1.pt() - trk2.pt(), + std::cos((trk1.phi() - trk2.phi()))); } if (cfgkOpenDeltaEta) { - histosQA.fill(HIST("PIDCME/Differential/histgamma_HaHa_ss_DEt"), cent, trk2.eta() - trk2.eta(), - std::cos((trk2.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_HaHa_ss_DEt"), cent, trk2.eta() - trk2.eta(), - std::cos((trk2.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/Differential/histgamma_HaHa_ss_DEt"), cent, trk1.eta() - trk2.eta(), + std::cos((trk1.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_HaHa_ss_DEt"), cent, trk1.eta() - trk2.eta(), + std::cos((trk1.phi() - trk2.phi()))); } if (cfgkOpenAveragePt) { - histosQA.fill(HIST("PIDCME/Differential/histgamma_HaHa_ss_SPt"), cent, trk2.pt() + trk2.pt(), - std::cos((trk2.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_HaHa_ss_SPt"), cent, trk2.pt() + trk2.pt(), - std::cos((trk2.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/Differential/histgamma_HaHa_ss_SPt"), cent, trk1.pt() + trk2.pt(), + std::cos((trk1.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_HaHa_ss_SPt"), cent, trk1.pt() + trk2.pt(), + std::cos((trk1.phi() - trk2.phi()))); } } if (cfgkOpenSsOsCrossCheck) { @@ -3081,22 +3130,22 @@ struct pidcme { // o2-linter: disable=name/struct histosQA.fill(HIST("PIDCME/histdelta_HaHa_os"), cent, std::cos((trk1.phi() - trk2.phi()))); if (cfgkOpenCMEDifferential) { if (cfgkOpenDeltaPt) { - histosQA.fill(HIST("PIDCME/Differential/histgamma_HaHa_os_DPt"), cent, trk2.pt() - trk2.pt(), - std::cos((trk2.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_HaHa_os_DPt"), cent, trk2.pt() - trk2.pt(), - std::cos((trk2.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/Differential/histgamma_HaHa_os_DPt"), cent, trk1.pt() - trk2.pt(), + std::cos((trk1.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_HaHa_os_DPt"), cent, trk1.pt() - trk2.pt(), + std::cos((trk1.phi() - trk2.phi()))); } if (cfgkOpenDeltaEta) { - histosQA.fill(HIST("PIDCME/Differential/histgamma_HaHa_os_DEt"), cent, trk2.eta() - trk2.eta(), - std::cos((trk2.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_HaHa_os_DEt"), cent, trk2.eta() - trk2.eta(), - std::cos((trk2.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/Differential/histgamma_HaHa_os_DEt"), cent, trk1.eta() - trk2.eta(), + std::cos((trk1.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_HaHa_os_DEt"), cent, trk1.eta() - trk2.eta(), + std::cos((trk1.phi() - trk2.phi()))); } if (cfgkOpenAveragePt) { - histosQA.fill(HIST("PIDCME/Differential/histgamma_HaHa_os_SPt"), cent, trk2.pt() + trk2.pt(), - std::cos((trk2.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); - histosQA.fill(HIST("PIDCME/Differential/histdelta_HaHa_os_SPt"), cent, trk2.pt() + trk2.pt(), - std::cos((trk2.phi() - trk2.phi()))); + histosQA.fill(HIST("PIDCME/Differential/histgamma_HaHa_os_SPt"), cent, trk1.pt() + trk2.pt(), + std::cos((trk1.phi() + trk2.phi() - static_cast(cfgnMods->at(i)) * psiNGlobal))); + histosQA.fill(HIST("PIDCME/Differential/histdelta_HaHa_os_SPt"), cent, trk1.pt() + trk2.pt(), + std::cos((trk1.phi() - trk2.phi()))); } } if (cfgkOpenSsOsCrossCheck) { From cbcf82352b853b6b3c9b7127f6a5f890dfd38625 Mon Sep 17 00:00:00 2001 From: Kai Cui <129373281+kcui1@users.noreply.github.com> Date: Fri, 14 Mar 2025 02:03:30 +0800 Subject: [PATCH 0650/1650] [PWGLF] Change Builder to StrangenessBuilder on HstrangenessFilter (#10378) --- .../Strangeness/hStrangeCorrelationFilter.cxx | 253 ++++++++++++++++-- .../Tasks/Strangeness/hStrangeCorrelation.cxx | 8 +- 2 files changed, 239 insertions(+), 22 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx b/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx index 2820e0e963e..082d04f6bb5 100644 --- a/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx +++ b/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx @@ -9,10 +9,10 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. /// -/// \file hStrangeCorrelationFilter.cxx /// \brief This task pre-filters tracks, V0s and cascades to do h-strangeness /// correlations with an analysis task. /// +/// \file hStrangeCorrelationFilter.cxx /// \author Kai Cui (kaicui@mails.ccnu.edu.cn) /// \author Lucia Anna Tarasovicova (lucia.anna.husova@cern.ch) /// \author David Dobrigkeit Chinellato (david.dobrigkeit.chinellato@cern.ch) @@ -138,8 +138,8 @@ struct HStrangeCorrelationFilter { Filter preFilterCascade = nabs(aod::cascdata::dcapostopv) > dcaPostopv&& nabs(aod::cascdata::dcanegtopv) > dcaNegtopv&& nabs(aod::cascdata::dcabachtopv) > cascadeSettingDcabachtopv&& aod::cascdata::dcaV0daughters < dcaV0dau&& aod::cascdata::dcacascdaughters < cascadeSettingDcacascdau; - using V0LinkedTagged = soa::Join; - using CascadesLinkedTagged = soa::Join; + // using V0LinkedTagged = soa::Join; + // using CascadesLinkedTagged = soa::Join; using FullTracks = soa::Join; using FullTracksMC = soa::Join; using DauTracks = soa::Join; @@ -148,6 +148,8 @@ struct HStrangeCorrelationFilter { using IDTracks = soa::Join; using IDTracksMC = soa::Join; using V0DatasWithoutTrackX = soa::Join; + using V0DatasWithoutTrackXMC = soa::Join; + using CascDatasMC = soa::Join; Produces triggerTrack; Produces triggerTrackExtra; @@ -486,7 +488,7 @@ struct HStrangeCorrelationFilter { } } - void processV0s(soa::Join::iterator const& collision, DauTracks const&, soa::Filtered const& V0s, V0LinkedTagged const&, aod::BCsWithTimestamps const&) + void processV0s(soa::Join::iterator const& collision, DauTracks const&, soa::Filtered const& V0s, aod::BCsWithTimestamps const&) { // Perform basic event selection if (!collision.sel8()) { @@ -521,7 +523,6 @@ struct HStrangeCorrelationFilter { auto posdau = v0.posTrack_as(); auto negdau = v0.negTrack_as(); - auto origV0entry = v0.v0_as(); // retrieve tags if (negdau.tpcNClsCrossedRows() < minTPCNCrossedRows) continue; @@ -560,11 +561,115 @@ struct HStrangeCorrelationFilter { float massNSigmaLambda = (v0.mLambda() - fLambdaMean->Eval(v0.pt())) / (fLambdaWidth->Eval(v0.pt()) + 1e-6); float massNSigmaAntiLambda = (v0.mAntiLambda() - fLambdaMean->Eval(v0.pt())) / (fLambdaWidth->Eval(v0.pt()) + 1e-6); - if (compatibleK0Short && (!doTrueSelectionInMass || (origV0entry.isTrueK0Short() && origV0entry.isPhysicalPrimary()))) + if (compatibleK0Short) + histos.fill(HIST("h3dMassK0Short"), v0.pt(), v0.mK0Short(), collision.centFT0M()); + if (compatibleLambda) + histos.fill(HIST("h3dMassLambda"), v0.pt(), v0.mLambda(), collision.centFT0M()); + if (compatibleAntiLambda) + histos.fill(HIST("h3dMassAntiLambda"), v0.pt(), v0.mAntiLambda(), collision.centFT0M()); + + if (!fillTableOnlyWithCompatible || + ( // start major condition check + (compatibleK0Short > 0 && std::abs(massNSigmaK0Short) < maxMassNSigma) || + (compatibleLambda > 0 && std::abs(massNSigmaLambda) < maxMassNSigma) || + (compatibleAntiLambda > 0 && std::abs(massNSigmaAntiLambda) < maxMassNSigma)) // end major condition check + ) { + assocV0(v0.collisionId(), v0.globalIndex(), + compatibleK0Short, compatibleLambda, compatibleAntiLambda, + false, false, false, false, + massNSigmaK0Short, massNSigmaLambda, massNSigmaAntiLambda); + } + } + } + + void processV0sMC(soa::Join::iterator const& collision, DauTracksMC const&, soa::Filtered const& V0s, aod::McParticles const&, aod::BCsWithTimestamps const&) + { + // Perform basic event selection + if (!collision.sel8()) { + return; + } + // No need to correlate stuff that's in far collisions + if (std::abs(collision.posZ()) > 10.0) { + return; + } + if (zorroMask.value != "") { + auto bc = collision.bc_as(); + initCCDB(bc); + bool zorroSelected = zorro.isSelected(collision.bc_as().globalBC()); /// Just let Zorro do the accounting + if (!zorroSelected) { + return; + } + } + + /// _________________________________________________ + /// Populate table with associated V0s + for (auto const& v0 : V0s) { + if (v0.v0radius() < v0RadiusMin || v0.v0radius() > v0RadiusMax || v0.eta() > assocEtaMax || v0.eta() < assocEtaMin || v0.v0cosPA() < v0Cospa) { + continue; + } + if (v0.pt() > assocPtCutMax || v0.pt() < assocPtCutMin) { + continue; + } + // check dE/dx compatibility + int compatibleK0Short = 0; + int compatibleLambda = 0; + int compatibleAntiLambda = 0; + + auto posdau = v0.posTrack_as(); + auto negdau = v0.negTrack_as(); + + if (negdau.tpcNClsCrossedRows() < minTPCNCrossedRows) + continue; + if (posdau.tpcNClsCrossedRows() < minTPCNCrossedRows) + continue; + + if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose) + BIT_SET(compatibleK0Short, 0); + if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigma) + BIT_SET(compatibleK0Short, 1); + if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaTight) + BIT_SET(compatibleK0Short, 2); + + if (std::abs(posdau.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose) + if (v0.v0cosPA() > lambdaCospa) + BIT_SET(compatibleLambda, 0); + if (std::abs(posdau.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigma) + if (v0.v0cosPA() > lambdaCospa) + BIT_SET(compatibleLambda, 1); + if (std::abs(posdau.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaTight) + if (v0.v0cosPA() > lambdaCospa) + BIT_SET(compatibleLambda, 2); + + if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(negdau.tpcNSigmaPr()) < strangedEdxNSigmaLoose) + if (v0.v0cosPA() > lambdaCospa) + BIT_SET(compatibleAntiLambda, 0); + if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(negdau.tpcNSigmaPr()) < strangedEdxNSigma) + if (v0.v0cosPA() > lambdaCospa) + BIT_SET(compatibleAntiLambda, 1); + if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(negdau.tpcNSigmaPr()) < strangedEdxNSigmaTight) + if (v0.v0cosPA() > lambdaCospa) + BIT_SET(compatibleAntiLambda, 2); + + // simplified handling: calculate NSigma in mass here + float massNSigmaK0Short = (v0.mK0Short() - fK0Mean->Eval(v0.pt())) / (fK0Width->Eval(v0.pt()) + 1e-6); + float massNSigmaLambda = (v0.mLambda() - fLambdaMean->Eval(v0.pt())) / (fLambdaWidth->Eval(v0.pt()) + 1e-6); + float massNSigmaAntiLambda = (v0.mAntiLambda() - fLambdaMean->Eval(v0.pt())) / (fLambdaWidth->Eval(v0.pt()) + 1e-6); + bool v0PhysicalPrimary = false; + bool trueK0Short = false; + bool trueLambda = false; + bool trueAntiLambda = false; + v0PhysicalPrimary = v0.isPhysicalPrimary(); + if (v0.pdgCode() == 310) + trueK0Short = true; + if (v0.pdgCode() == 3122) + trueLambda = true; + if (v0.pdgCode() == -3122) + trueAntiLambda = true; + if (compatibleK0Short && (!doTrueSelectionInMass || (trueK0Short && v0PhysicalPrimary))) histos.fill(HIST("h3dMassK0Short"), v0.pt(), v0.mK0Short(), collision.centFT0M()); - if (compatibleLambda && (!doTrueSelectionInMass || (origV0entry.isTrueLambda() && origV0entry.isPhysicalPrimary()))) + if (compatibleLambda && (!doTrueSelectionInMass || (trueLambda && v0PhysicalPrimary))) histos.fill(HIST("h3dMassLambda"), v0.pt(), v0.mLambda(), collision.centFT0M()); - if (compatibleAntiLambda && (!doTrueSelectionInMass || (origV0entry.isTrueAntiLambda() && origV0entry.isPhysicalPrimary()))) + if (compatibleAntiLambda && (!doTrueSelectionInMass || (trueAntiLambda && v0PhysicalPrimary))) histos.fill(HIST("h3dMassAntiLambda"), v0.pt(), v0.mAntiLambda(), collision.centFT0M()); if (!fillTableOnlyWithCompatible || @@ -575,12 +680,13 @@ struct HStrangeCorrelationFilter { ) { assocV0(v0.collisionId(), v0.globalIndex(), compatibleK0Short, compatibleLambda, compatibleAntiLambda, - origV0entry.isTrueK0Short(), origV0entry.isTrueLambda(), origV0entry.isTrueAntiLambda(), origV0entry.isPhysicalPrimary(), + trueK0Short, trueLambda, trueAntiLambda, v0PhysicalPrimary, massNSigmaK0Short, massNSigmaLambda, massNSigmaAntiLambda); } } } - void processCascades(soa::Join::iterator const& collision, DauTracks const&, soa::Filtered const& /*V0s*/, soa::Filtered const& Cascades, aod::V0sLinked const&, CascadesLinkedTagged const&, aod::BCsWithTimestamps const&) + + void processCascades(soa::Join::iterator const& collision, DauTracks const&, soa::Filtered const& /*V0s*/, soa::Filtered const& Cascades, aod::BCsWithTimestamps const&) { // Perform basic event selection if (!collision.sel8()) { @@ -610,7 +716,6 @@ struct HStrangeCorrelationFilter { auto bachTrackCast = casc.bachelor_as(); auto posTrackCast = casc.posTrack_as(); auto negTrackCast = casc.negTrack_as(); - auto origCascadeEntry = casc.cascade_as(); // minimum TPC crossed rows if (bachTrackCast.tpcNClsCrossedRows() < minTPCNCrossedRows) @@ -657,13 +762,13 @@ struct HStrangeCorrelationFilter { float massNSigmaXi = (casc.mXi() - fXiMean->Eval(casc.pt())) / (fXiWidth->Eval(casc.pt()) + 1e-6); float massNSigmaOmega = (casc.mOmega() - fOmegaMean->Eval(casc.pt())) / (fOmegaWidth->Eval(casc.pt()) + 1e-6); - if (compatibleXiMinus && (!doTrueSelectionInMass || (origCascadeEntry.isTrueXiMinus() && origCascadeEntry.isPhysicalPrimary()))) + if (compatibleXiMinus) histos.fill(HIST("h3dMassXiMinus"), casc.pt(), casc.mXi(), collision.centFT0M()); - if (compatibleXiPlus && (!doTrueSelectionInMass || (origCascadeEntry.isTrueXiPlus() && origCascadeEntry.isPhysicalPrimary()))) + if (compatibleXiPlus) histos.fill(HIST("h3dMassXiPlus"), casc.pt(), casc.mXi(), collision.centFT0M()); - if (compatibleOmegaMinus && (!doTrueSelectionInMass || (origCascadeEntry.isTrueOmegaMinus() && origCascadeEntry.isPhysicalPrimary()))) + if (compatibleOmegaMinus) histos.fill(HIST("h3dMassOmegaMinus"), casc.pt(), casc.mOmega(), collision.centFT0M()); - if (compatibleOmegaPlus && (!doTrueSelectionInMass || (origCascadeEntry.isTrueOmegaPlus() && origCascadeEntry.isPhysicalPrimary()))) + if (compatibleOmegaPlus) histos.fill(HIST("h3dMassOmegaPlus"), casc.pt(), casc.mOmega(), collision.centFT0M()); if (!fillTableOnlyWithCompatible || @@ -673,20 +778,132 @@ struct HStrangeCorrelationFilter { ) { assocCascades(casc.collisionId(), casc.globalIndex(), compatibleXiMinus, compatibleXiPlus, compatibleOmegaMinus, compatibleOmegaPlus, - origCascadeEntry.isTrueXiMinus(), origCascadeEntry.isTrueXiPlus(), - origCascadeEntry.isTrueOmegaMinus(), origCascadeEntry.isTrueOmegaPlus(), - origCascadeEntry.isPhysicalPrimary(), + false, false, false, false, false, massNSigmaXi, massNSigmaOmega); } } } + void processCascadesMC(soa::Join::iterator const& collision, DauTracks const&, soa::Filtered const& /*V0s*/, soa::Filtered const& Cascades, aod::McParticles const&, aod::BCsWithTimestamps const&) + { + // Perform basic event selection + if (!collision.sel8()) { + return; + } + // No need to correlate stuff that's in far collisions + if (std::abs(collision.posZ()) > 10.0) { + return; + } + if (zorroMask.value != "") { + auto bc = collision.bc_as(); + initCCDB(bc); + bool zorroSelected = zorro.isSelected(collision.bc_as().globalBC()); /// Just let Zorro do the accounting + if (!zorroSelected) { + return; + } + } + /// _________________________________________________ + /// Step 3: Populate table with associated Cascades + for (auto const& casc : Cascades) { + if (casc.eta() > assocEtaMax || casc.eta() < assocEtaMin) { + continue; + } + if (casc.pt() > assocPtCutMax || casc.pt() < assocPtCutMin) { + continue; + } + auto bachTrackCast = casc.bachelor_as(); + auto posTrackCast = casc.posTrack_as(); + auto negTrackCast = casc.negTrack_as(); + + // minimum TPC crossed rows + if (bachTrackCast.tpcNClsCrossedRows() < minTPCNCrossedRows) + continue; + if (posTrackCast.tpcNClsCrossedRows() < minTPCNCrossedRows) + continue; + if (negTrackCast.tpcNClsCrossedRows() < minTPCNCrossedRows) + continue; + + // check dE/dx compatibility + int compatibleXiMinus = 0; + int compatibleXiPlus = 0; + int compatibleOmegaMinus = 0; + int compatibleOmegaPlus = 0; + + if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && casc.sign() < 0) + BIT_SET(compatibleXiMinus, 0); + if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && casc.sign() < 0) + BIT_SET(compatibleXiMinus, 1); + if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && casc.sign() < 0) + BIT_SET(compatibleXiMinus, 2); + + if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && casc.sign() > 0) + BIT_SET(compatibleXiPlus, 0); + if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && casc.sign() > 0) + BIT_SET(compatibleXiPlus, 1); + if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && casc.sign() > 0) + BIT_SET(compatibleXiPlus, 2); + + if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaLoose && casc.sign() < 0) + BIT_SET(compatibleOmegaMinus, 0); + if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigma && casc.sign() < 0) + BIT_SET(compatibleOmegaMinus, 1); + if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaTight && casc.sign() < 0) + BIT_SET(compatibleOmegaMinus, 2); + + if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaLoose && casc.sign() > 0) + BIT_SET(compatibleOmegaPlus, 0); + if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigma && casc.sign() > 0) + BIT_SET(compatibleOmegaPlus, 1); + if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaTight && casc.sign() > 0) + BIT_SET(compatibleOmegaPlus, 2); + + float massNSigmaXi = (casc.mXi() - fXiMean->Eval(casc.pt())) / (fXiWidth->Eval(casc.pt()) + 1e-6); + float massNSigmaOmega = (casc.mOmega() - fOmegaMean->Eval(casc.pt())) / (fOmegaWidth->Eval(casc.pt()) + 1e-6); + bool cascPhysicalPrimary = false; + bool trueXiMinus = false; + bool trueXiPlus = false; + bool trueOmegaMinus = false; + bool trueOmegaPlus = false; + cascPhysicalPrimary = casc.isPhysicalPrimary(); + if (casc.pdgCode() == 3312) + trueXiMinus = true; + if (casc.pdgCode() == -3312) + trueXiPlus = true; + if (casc.pdgCode() == 3334) + trueOmegaMinus = true; + if (casc.pdgCode() == -3334) + trueOmegaPlus = true; + if (compatibleXiMinus && (!doTrueSelectionInMass || (trueXiMinus && cascPhysicalPrimary))) + histos.fill(HIST("h3dMassXiMinus"), casc.pt(), casc.mXi(), collision.centFT0M()); + if (compatibleXiPlus && (!doTrueSelectionInMass || (trueXiPlus && cascPhysicalPrimary))) + histos.fill(HIST("h3dMassXiPlus"), casc.pt(), casc.mXi(), collision.centFT0M()); + if (compatibleOmegaMinus && (!doTrueSelectionInMass || (trueOmegaMinus && cascPhysicalPrimary))) + histos.fill(HIST("h3dMassOmegaMinus"), casc.pt(), casc.mOmega(), collision.centFT0M()); + if (compatibleOmegaPlus && (!doTrueSelectionInMass || (trueOmegaPlus && cascPhysicalPrimary))) + histos.fill(HIST("h3dMassOmegaPlus"), casc.pt(), casc.mOmega(), collision.centFT0M()); + + if (!fillTableOnlyWithCompatible || + ( // start major condition check + ((compatibleXiMinus > 0 || compatibleXiPlus > 0) && std::abs(massNSigmaXi) < maxMassNSigma) || + ((compatibleOmegaMinus > 0 || compatibleOmegaPlus > 0) && std::abs(massNSigmaOmega) < maxMassNSigma)) // end major condition check + ) { + assocCascades(casc.collisionId(), casc.globalIndex(), + compatibleXiMinus, compatibleXiPlus, compatibleOmegaMinus, compatibleOmegaPlus, + trueXiMinus, trueXiPlus, + trueOmegaMinus, trueOmegaPlus, + cascPhysicalPrimary, + massNSigmaXi, massNSigmaOmega); + } + } + } PROCESS_SWITCH(HStrangeCorrelationFilter, processTriggers, "Produce trigger tables", true); PROCESS_SWITCH(HStrangeCorrelationFilter, processTriggersMC, "Produce trigger tables for MC", false); PROCESS_SWITCH(HStrangeCorrelationFilter, processV0s, "Produce associated V0 tables", true); + PROCESS_SWITCH(HStrangeCorrelationFilter, processV0sMC, "Produce associated V0 tables for MC", false); PROCESS_SWITCH(HStrangeCorrelationFilter, processAssocPions, "Produce associated Pion tables", false); PROCESS_SWITCH(HStrangeCorrelationFilter, processAssocPionsMC, "Produce associated Pion tables for MC", false); PROCESS_SWITCH(HStrangeCorrelationFilter, processCascades, "Produce associated cascade tables", true); + PROCESS_SWITCH(HStrangeCorrelationFilter, processCascadesMC, "Produce associated cascade tables for MC", false); PROCESS_SWITCH(HStrangeCorrelationFilter, processAssocHadrons, "Produce associated Hadron tables", true); PROCESS_SWITCH(HStrangeCorrelationFilter, processAssocHadronsMC, "Produce associated Hadron tables for MC", false); }; diff --git a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx index 59479d4188d..d3359190587 100644 --- a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx +++ b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx @@ -962,7 +962,7 @@ struct HStrangeCorrelation { void processSameEventHV0s(soa::Join::iterator const& collision, aod::AssocV0s const& associatedV0s, aod::TriggerTracks const& triggerTracks, - V0DatasWithoutTrackX const&, aod::V0sLinked const&, TracksComplete const&, aod::BCsWithTimestamps const&) + V0DatasWithoutTrackX const&, TracksComplete const&, aod::BCsWithTimestamps const&) { // ________________________________________________ // skip if desired trigger not found @@ -1052,7 +1052,7 @@ struct HStrangeCorrelation { void processSameEventHCascades(soa::Join::iterator const& collision, aod::AssocV0s const&, aod::AssocCascades const& associatedCascades, aod::TriggerTracks const& triggerTracks, - V0DatasWithoutTrackX const&, aod::V0sLinked const&, aod::CascDatas const&, TracksComplete const&, aod::BCsWithTimestamps const&) + V0DatasWithoutTrackX const&, aod::CascDatas const&, TracksComplete const&, aod::BCsWithTimestamps const&) { // ________________________________________________ // skip if desired trigger not found @@ -1237,7 +1237,7 @@ struct HStrangeCorrelation { void processMixedEventHV0s(soa::Join const& collisions, aod::AssocV0s const& associatedV0s, aod::TriggerTracks const& triggerTracks, - V0DatasWithoutTrackX const&, aod::V0sLinked const&, TracksComplete const&, aod::BCsWithTimestamps const&) + V0DatasWithoutTrackX const&, TracksComplete const&, aod::BCsWithTimestamps const&) { for (auto const& [collision1, collision2] : soa::selfCombinations(colBinning, mixingParameter, -1, collisions, collisions)) { // ________________________________________________ @@ -1279,7 +1279,7 @@ struct HStrangeCorrelation { } void processMixedEventHCascades(soa::Join const& collisions, aod::AssocV0s const&, aod::AssocCascades const& associatedCascades, aod::TriggerTracks const& triggerTracks, - V0DatasWithoutTrackX const&, aod::V0sLinked const&, aod::CascDatas const&, TracksComplete const&, aod::BCsWithTimestamps const&) + V0DatasWithoutTrackX const&, aod::CascDatas const&, TracksComplete const&, aod::BCsWithTimestamps const&) { for (auto const& [collision1, collision2] : soa::selfCombinations(colBinning, mixingParameter, -1, collisions, collisions)) { // ________________________________________________ From 67e2a806da33896713317efd599de761185fa08c Mon Sep 17 00:00:00 2001 From: bghanley1995 Date: Fri, 14 Mar 2025 10:01:51 -0400 Subject: [PATCH 0651/1650] [PWGCF] IdentifiedBfFilter.cxx Added checks for PID for MC tracks (#10490) Co-authored-by: ALICE Action Bot --- .../TableProducer/identifiedBfFilter.cxx | 153 ++++++++++++------ 1 file changed, 108 insertions(+), 45 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx b/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx index 673dc11760f..ea0ad92e8f2 100644 --- a/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx +++ b/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx @@ -153,6 +153,12 @@ TH2F* fhAmbiguousTrackPt = nullptr; TH2F* fhAmbiguityDegree = nullptr; TH2F* fhCompatibleCollisionsZVtxRms = nullptr; +TH2S* fhTruePIDMismatch = nullptr; +TH1S* fhTruePIDCorrect = nullptr; + +TH2F* fhTrueNSigmaTPC[kIdBfNoOfSpecies] = {nullptr}; +TH2F* fhTrueNSigmaTOF[kIdBfNoOfSpecies] = {nullptr}; + TH1F* fhTrueCentMultB = nullptr; TH1F* fhTrueCentMultA = nullptr; TH1F* fhTrueVertexZB = nullptr; @@ -959,6 +965,9 @@ struct IdentifiedBfFilterTracks { if ((fDataType != kData) && (fDataType != kDataNoEvtSel)) { /* create the true data histograms */ + fhTruePIDMismatch = new TH2S("fHistTruePIDMismatch", "Mismatched Generated and Reconstructed PID;Generated Species;Reconstructed Species", kIdBfNoOfSpecies, 0, kIdBfNoOfSpecies, kIdBfNoOfSpecies, 0, kIdBfNoOfSpecies); + fhTruePIDCorrect = new TH1S("fHistTruePIDCorrect", "Correct PID between Generated and Reconstructed PID;Species", kIdBfNoOfSpecies, 0, kIdBfNoOfSpecies); + fhTruePB = new TH1F("fTrueHistPB", "p distribution before (truth);p (GeV/c);dN/dp (c/GeV)", 100, 0.0, 15.0); fhTrueCharge = new TH1F("fTrueHistCharge", "Charge distribution before (truth);charge;count", 3, -1.0, 1.0); @@ -1016,7 +1025,21 @@ struct IdentifiedBfFilterTracks { 79, -39.5, 39.5); } + for (int sp = 0; sp < kIdBfNoOfSpecies; ++sp) { + fhTrueNSigmaTPC[sp] = new TH2F(TString::Format("fhTrueNSigmaTPC_%s", speciesName[sp]).Data(), + TString::Format("N #sigma from TPC vs P for generated %s;N #sigma;p (GeV/c)", speciesTitle[sp]).Data(), + 48, -6, 6, + ptbins, ptlow, ptup); + + fhTrueNSigmaTOF[sp] = new TH2F(TString::Format("fhTrueNSigmaTOF_%s", speciesName[sp]).Data(), + TString::Format("N #sigma from TOF vs P for generated %s;N #sigma;p (GeV/c)", speciesTitle[sp]).Data(), + 48, -6, 6, + ptbins, ptlow, ptup); + } + /* add the hstograms to the output list */ + fOutputList->Add(fhTruePIDMismatch); + fOutputList->Add(fhTruePIDCorrect); fOutputList->Add(fhTruePhiYB); fOutputList->Add(fhTruePtYB); fOutputList->Add(fhTruePhiYA); @@ -1050,6 +1073,10 @@ struct IdentifiedBfFilterTracks { fOutputList->Add(fhTrueNPosNegA[sp]); fOutputList->Add(fhTrueDeltaNA[sp]); } + for (int sp = 0; sp < kIdBfNoOfSpecies; ++sp) { + fOutputList->Add(fhTrueNSigmaTPC[sp]); + fOutputList->Add(fhTrueNSigmaTOF[sp]); + } } /* initialize access to the CCDB */ } @@ -1063,6 +1090,8 @@ struct IdentifiedBfFilterTracks { template int8_t selectTrackAmbiguousCheck(CollisionObjects const& collisions, TrackObject const& track); template + inline void identifyPIDMismatch(ParticleObject const& particle, MatchRecoGenSpecies const& trkId, float tpcNSigma[kIdBfNoOfSpecies], float tofNSigma[kIdBfNoOfSpecies], float tpcInnerParam); + template inline MatchRecoGenSpecies identifyParticle(ParticleObject const& particle); template void fillTrackHistosBeforeSelection(TrackObject const& track); @@ -1210,19 +1239,19 @@ struct IdentifiedBfFilterTracks { } PROCESS_SWITCH(IdentifiedBfFilterTracks, filterRecoWithPIDAmbiguous, "Not stored derived data track filtering with ambiguous tracks check", false) - void filterDetectorLevelWithPID(soa::Join& collisions, IdBfFullTracksPIDDetLevel const& tracks) + void filterDetectorLevelWithPID(soa::Join& collisions, IdBfFullTracksPIDDetLevel const& tracks, aod::McParticles const&) { filterTracks(collisions, tracks); } PROCESS_SWITCH(IdentifiedBfFilterTracks, filterDetectorLevelWithPID, "Not stored derived data detector level track filtering", false) - void filterDetectorLevelWithPIDAmbiguous(soa::Join& collisions, IdBfFullTracksPIDDetLevelAmbiguous const& tracks) + void filterDetectorLevelWithPIDAmbiguous(soa::Join& collisions, IdBfFullTracksPIDDetLevelAmbiguous const& tracks, aod::McParticles const&) { filterTracks(collisions, tracks); } PROCESS_SWITCH(IdentifiedBfFilterTracks, filterDetectorLevelWithPIDAmbiguous, "Not stored derived data detector level track filtering with ambiguous tracks check", false) - void filterRecoWithFullPID(soa::Join& collisions, IdBfFullTracksFullPID const& tracks) + void filterRecoWithFullPID(soa::Join& collisions, IdBfFullTracksFullPID const& tracks, aod::McParticles const&) { filterTracks(collisions, tracks); } @@ -1234,13 +1263,13 @@ struct IdentifiedBfFilterTracks { } PROCESS_SWITCH(IdentifiedBfFilterTracks, filterRecoWithFullPIDAmbiguous, "Not stored derived data track filtering with ambiguous tracks check", false) - void filterDetectorLevelWithFullPID(soa::Join& collisions, IdBfFullTracksFullPIDDetLevel const& tracks) + void filterDetectorLevelWithFullPID(soa::Join& collisions, IdBfFullTracksFullPIDDetLevel const& tracks, aod::McParticles const&) { filterTracks(collisions, tracks); } PROCESS_SWITCH(IdentifiedBfFilterTracks, filterDetectorLevelWithFullPID, "Not stored derived data detector level track filtering", false) - void filterDetectorLevelWithFullPIDAmbiguous(soa::Join& collisions, IdBfFullTracksFullPIDDetLevelAmbiguous const& tracks) + void filterDetectorLevelWithFullPIDAmbiguous(soa::Join& collisions, IdBfFullTracksFullPIDDetLevelAmbiguous const& tracks, aod::McParticles const&) { filterTracks(collisions, tracks); } @@ -1264,7 +1293,7 @@ struct IdentifiedBfFilterTracks { } PROCESS_SWITCH(IdentifiedBfFilterTracks, filterDetectorLevelWithoutPID, "Detector level track filtering without PID information", false) - void filterDetectorLevelWithoutPIDAmbiguous(soa::Join const& collisions, IdBfFullTracksDetLevelAmbiguous const& tracks) + void filterDetectorLevelWithoutPIDAmbiguous(soa::Join const& collisions, IdBfFullTracksDetLevelAmbiguous const& tracks, aod::McParticles const&) { filterTracks(collisions, tracks); } @@ -1308,6 +1337,46 @@ inline MatchRecoGenSpecies IdentifiedBfFilterTracks::identifyParticle(ParticleOb } } +template +inline void IdentifiedBfFilterTracks::identifyPIDMismatch(ParticleObject const& particle, MatchRecoGenSpecies const& trkId, float tpcNSigma[kIdBfNoOfSpecies], float tofNSigma[kIdBfNoOfSpecies], float tpcInnerParam) +{ + MatchRecoGenSpecies realPID = kWrongSpecies; + int pdgcode = std::fabs(particle.pdgCode()); + + switch (pdgcode) { + case pdgcodeEl: + realPID = kIdBfElectron; + break; + case pdgcodePi: + realPID = kIdBfPion; + break; + case pdgcodeKa: + realPID = kIdBfKaon; + break; + case pdgcodePr: + realPID = kIdBfProton; + break; + default: + if (traceOutOfSpeciesParticles) { + LOGF(info, "Wrong particle passed selection cuts. PDG code: %d", pdgcode); + } + realPID = kWrongSpecies; + break; + } + if (!(realPID < 0)) { + if (realPID == trkId) { + fhTruePIDCorrect->Fill(realPID); + } else { + fhTruePIDMismatch->Fill(realPID, trkId); + } + + fhTrueNSigmaTPC[realPID]->Fill(tpcNSigma[realPID], tpcInnerParam); + fhTrueNSigmaTOF[realPID]->Fill(tofNSigma[realPID], tpcInnerParam); + + // fill histo based on realTPC and tpcNSigma value for center align + } +} + template void fillNSigmaHistos(TrackObject const& track) { @@ -1347,46 +1416,49 @@ inline MatchRecoGenSpecies IdentifiedBfFilterTracks::identifyTrack(TrackObject c fillNSigmaHistos(track); - float actualTPCNSigmaEl = track.tpcNSigmaEl(); - float actualTPCNSigmaPi = track.tpcNSigmaPi(); - float actualTPCNSigmaKa = track.tpcNSigmaKa(); - float actualTPCNSigmaPr = track.tpcNSigmaPr(); + float actualTPCNSigma[kIdBfNoOfSpecies]; + + actualTPCNSigma[kIdBfElectron] = track.tpcNSigmaEl(); + actualTPCNSigma[kIdBfPion] = track.tpcNSigmaPi(); + actualTPCNSigma[kIdBfKaon] = track.tpcNSigmaKa(); + actualTPCNSigma[kIdBfProton] = track.tpcNSigmaPr(); + + float actualTOFNSigma[kIdBfNoOfSpecies]; + + actualTOFNSigma[kIdBfElectron] = track.tofNSigmaEl(); + actualTOFNSigma[kIdBfPion] = track.tofNSigmaPi(); + actualTOFNSigma[kIdBfKaon] = track.tofNSigmaKa(); + actualTOFNSigma[kIdBfProton] = track.tofNSigmaPr(); float nsigmas[kIdBfNoOfSpecies]; if (loadfromccdb) { - actualTPCNSigmaEl = actualTPCNSigmaEl - fhNSigmaCorrection[kIdBfElectron]->GetBinContent(fhNSigmaCorrection[kIdBfElectron]->FindBin(track.tpcInnerParam())); - actualTPCNSigmaPi = actualTPCNSigmaPi - fhNSigmaCorrection[kIdBfPion]->GetBinContent(fhNSigmaCorrection[kIdBfPion]->FindBin(track.tpcInnerParam())); - actualTPCNSigmaKa = actualTPCNSigmaKa - fhNSigmaCorrection[kIdBfKaon]->GetBinContent(fhNSigmaCorrection[kIdBfKaon]->FindBin(track.tpcInnerParam())); - actualTPCNSigmaPr = actualTPCNSigmaPr - fhNSigmaCorrection[kIdBfProton]->GetBinContent(fhNSigmaCorrection[kIdBfProton]->FindBin(track.tpcInnerParam())); + for (int iSp = 0; iSp < kIdBfNoOfSpecies; iSp++) { + actualTPCNSigma[iSp] = actualTPCNSigma[iSp] - fhNSigmaCorrection[iSp]->GetBinContent(fhNSigmaCorrection[iSp]->FindBin(track.tpcInnerParam())); + } } if (track.tpcInnerParam() < tofCut && !reqTOF && !onlyTOF) { - nsigmas[kIdBfElectron] = actualTPCNSigmaEl; - nsigmas[kIdBfPion] = actualTPCNSigmaPi; - nsigmas[kIdBfKaon] = actualTPCNSigmaKa; - nsigmas[kIdBfProton] = actualTPCNSigmaPr; - + for (int iSp = 0; iSp < kIdBfNoOfSpecies; iSp++) { + nsigmas[iSp] = actualTPCNSigma[iSp]; + } } else { /* introduce require TOF flag */ if (track.hasTOF() && !onlyTOF) { - nsigmas[kIdBfElectron] = sqrtf(actualTPCNSigmaEl * actualTPCNSigmaEl + track.tofNSigmaEl() * track.tofNSigmaEl()); - nsigmas[kIdBfPion] = sqrtf(actualTPCNSigmaPi * actualTPCNSigmaPi + track.tofNSigmaPi() * track.tofNSigmaPi()); - nsigmas[kIdBfKaon] = sqrtf(actualTPCNSigmaKa * actualTPCNSigmaKa + track.tofNSigmaKa() * track.tofNSigmaKa()); - nsigmas[kIdBfProton] = sqrtf(actualTPCNSigmaPr * actualTPCNSigmaPr + track.tofNSigmaPr() * track.tofNSigmaPr()); - + // TODO: Add an output that tells if TOF was used for PID and at what momentum + for (int iSp = 0; iSp < kIdBfNoOfSpecies; iSp++) { + nsigmas[iSp] = sqrtf(actualTPCNSigma[iSp] * actualTPCNSigma[iSp] + actualTOFNSigma[iSp] * actualTOFNSigma[iSp]); + } } else if (!reqTOF || !onlyTOF) { - nsigmas[kIdBfElectron] = actualTPCNSigmaEl; - nsigmas[kIdBfPion] = actualTPCNSigmaPi; - nsigmas[kIdBfKaon] = actualTPCNSigmaKa; - nsigmas[kIdBfProton] = actualTPCNSigmaPr; + for (int iSp = 0; iSp < kIdBfNoOfSpecies; iSp++) { + nsigmas[iSp] = actualTPCNSigma[iSp]; + } } else if (track.hasTOF() && onlyTOF) { - nsigmas[kIdBfElectron] = track.tofNSigmaEl(); - nsigmas[kIdBfPion] = track.tofNSigmaPi(); - nsigmas[kIdBfKaon] = track.tofNSigmaKa(); - nsigmas[kIdBfProton] = track.tofNSigmaPr(); + for (int iSp = 0; iSp < kIdBfNoOfSpecies; iSp++) { + nsigmas[iSp] = actualTOFNSigma[iSp]; + } } else { return kWrongSpecies; } @@ -1431,19 +1503,11 @@ inline MatchRecoGenSpecies IdentifiedBfFilterTracks::identifyTrack(TrackObject c fhDoublePID->Fill(spMinNSigma, spDouble); return kWrongSpecies; // Return wrong species value } else { - if (spMinNSigma == 0) { - fhNSigmaTPCIdTrks[spMinNSigma]->Fill(actualTPCNSigmaEl, track.tpcInnerParam()); - } - if (spMinNSigma == 1) { - fhNSigmaTPCIdTrks[spMinNSigma]->Fill(actualTPCNSigmaPi, track.tpcInnerParam()); - } - if (spMinNSigma == 2) { - fhNSigmaTPCIdTrks[spMinNSigma]->Fill(actualTPCNSigmaKa, track.tpcInnerParam()); - } - if (spMinNSigma == 3) { - fhNSigmaTPCIdTrks[spMinNSigma]->Fill(actualTPCNSigmaPr, track.tpcInnerParam()); - } + fhNSigmaTPCIdTrks[spMinNSigma]->Fill(actualTPCNSigma[spMinNSigma], track.tpcInnerParam()); + if constexpr (framework::has_type_v) { + identifyPIDMismatch(track.template mcParticle_as(), spMinNSigma, actualTPCNSigma, actualTOFNSigma, track.tpcInnerParam()); + } return spMinNSigma; } } else { @@ -1477,7 +1541,6 @@ inline int8_t IdentifiedBfFilterTracks::acceptTrack(TrackObject const& track) if (recoIdMethod == 0) { sp = kIdBfCharged; } else if (recoIdMethod == 1) { - if constexpr (framework::has_type_v || framework::has_type_v) { sp = identifyTrack(track); } else { From c1bf27c071852e2f808e2fae4deb47babdc69d34 Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Fri, 14 Mar 2025 15:27:07 +0100 Subject: [PATCH 0652/1650] [Trigger] Use proper end time for OTS object uploads (#10442) --- EventFiltering/macros/uploadOTSobjects.C | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/EventFiltering/macros/uploadOTSobjects.C b/EventFiltering/macros/uploadOTSobjects.C index 77b6ac97f34..2a9be2de17e 100644 --- a/EventFiltering/macros/uploadOTSobjects.C +++ b/EventFiltering/macros/uploadOTSobjects.C @@ -64,10 +64,10 @@ void uploadOTSobjects(std::string inputList, std::string passName, bool useAlien std::unique_ptr scalersFile{TFile::Open((path + "/AnalysisResults_fullrun.root").data(), "READ")}; TH1* scalers = static_cast(scalersFile->Get("central-event-filter-task/scalers/mScalers")); TH1* filters = static_cast(scalersFile->Get("central-event-filter-task/scalers/mFiltered")); - api.storeAsTFile(scalers, baseCCDBpath + "FilterCounters", metadata, duration.first, duration.second); - api.storeAsTFile(filters, baseCCDBpath + "SelectionCounters", metadata, duration.first, duration.second); + api.storeAsTFile(scalers, baseCCDBpath + "FilterCounters", metadata, duration.first, duration.second + 1); + api.storeAsTFile(filters, baseCCDBpath + "SelectionCounters", metadata, duration.first, duration.second + 1); TH1* hCounterTVX = static_cast(scalersFile->Get("bc-selection-task/hCounterTVX")); - api.storeAsTFile(hCounterTVX, baseCCDBpath + "InspectedTVX", metadata, duration.first, duration.second); + api.storeAsTFile(hCounterTVX, baseCCDBpath + "InspectedTVX", metadata, duration.first, duration.second + 1); std::vector zorroHelpers; std::unique_ptr bcRangesFile{TFile::Open((path + "/bcRanges_fullrun.root").data(), "READ")}; @@ -99,7 +99,7 @@ void uploadOTSobjects(std::string inputList, std::string passName, bool useAlien return a.bcAOD < b.bcAOD; }); if (!chunkedProcessing) { - api.storeAsTFileAny(&zorroHelpers, baseCCDBpath + "ZorroHelpers", metadata, duration.first, duration.second); + api.storeAsTFileAny(&zorroHelpers, baseCCDBpath + "ZorroHelpers", metadata, duration.first, duration.second + 1); std::cout << std::endl; } else { uint32_t helperIndex{0}; @@ -126,7 +126,7 @@ void uploadOTSobjects(std::string inputList, std::string passName, bool useAlien endIndex++; } std::cout << ">>> Chunk " << helperIndex << " - " << helperIndex + chunk.size() << " : " << startTS << " - " << endTS << " \t" << (endTS - startTS) * 1.e-3 << std::endl; - api.storeAsTFileAny(&chunk, baseCCDBpath + "ZorroHelpers", metadata, startTS, endTS); + api.storeAsTFileAny(&chunk, baseCCDBpath + "ZorroHelpers", metadata, startTS, endTS + 1); startTS = endTS + 1; helperIndex += chunk.size(); } From 367562a3c820aa32e75cf7a70619bf8068d2b75f Mon Sep 17 00:00:00 2001 From: Archita-Dash <91664849+Archita-Dash@users.noreply.github.com> Date: Fri, 14 Mar 2025 15:39:19 +0100 Subject: [PATCH 0653/1650] [PWGJE] added missing JMcCollision tables (#10409) --- PWGJE/Tasks/fullJetSpectraPP.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PWGJE/Tasks/fullJetSpectraPP.cxx b/PWGJE/Tasks/fullJetSpectraPP.cxx index 4ccb8bbc5e7..8cdc23ebf9c 100644 --- a/PWGJE/Tasks/fullJetSpectraPP.cxx +++ b/PWGJE/Tasks/fullJetSpectraPP.cxx @@ -601,7 +601,7 @@ struct FullJetSpectrapp { } PROCESS_SWITCH(FullJetSpectrapp, processJetsMCD, "Full Jets at Detector Level", false); - void processJetsMCDWeighted(soa::Filtered>::iterator const& collision, JetTableMCDWeightedJoined const& jets, aod::JetTracks const&, aod::JetClusters const&) + void processJetsMCDWeighted(soa::Filtered>::iterator const& collision, JetTableMCDWeightedJoined const& jets, aod::JMcCollisions const&, aod::JetTracks const&, aod::JetClusters const&) { registry.fill(HIST("h_collisions_weighted"), 1.0); // total events bool eventAccepted = false; @@ -661,7 +661,7 @@ struct FullJetSpectrapp { } PROCESS_SWITCH(FullJetSpectrapp, processJetsMCDWeighted, "Full Jets at Detector Level on weighted events", false); - void processJetsMCP(typename JetTableMCPJoined::iterator const& jet, aod::JetParticles const&, aod::JetMcCollisions const&) + void processJetsMCP(typename JetTableMCPJoined::iterator const& jet, aod::JetParticles const&) { if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { return; @@ -673,7 +673,7 @@ struct FullJetSpectrapp { } PROCESS_SWITCH(FullJetSpectrapp, processJetsMCP, "Full Jets at Particle Level", false); - void processJetsMCPWeighted(typename JetTableMCPWeightedJoined::iterator const& jet, aod::JetParticles const&) + void processJetsMCPWeighted(typename JetTableMCPWeightedJoined::iterator const& jet, aod::JetParticles const&, aod::JetMcCollisions const&) { if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { From 31d8379f39fb355d02d39741f60fac2f6a0181d2 Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Fri, 14 Mar 2025 16:04:03 +0100 Subject: [PATCH 0654/1650] [PWGCF] jFlucEfficiencyTask - Add process for Run2 QA (#10450) --- PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx | 101 ++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx b/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx index 2e4b443ae66..41403ff443c 100644 --- a/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx +++ b/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx @@ -102,8 +102,10 @@ struct JFlucEfficiencyTask { Configurable cfgCentBinsForMC{"cfgCentBinsForMC", 1, "Centrality bins for MC, 0: off, 1: on"}; using CollisionCandidates = soa::Join; + using CollisionRun2Candidates = soa::Join; using TrackCandidates = soa::Join; using MCCollisionCandidates = soa::Join; + using MCRun2CollisionCandidates = soa::Join; using MCTrackCandidates = soa::Join; // Histogram Registry @@ -325,6 +327,78 @@ struct JFlucEfficiencyTask { } } + void processMCRun2(aod::McCollisions::iterator const& mcCollision, + soa::SmallGroups const& collisions, + soa::Filtered const& mcTracks, + aod::McParticles const& mcParticles) + { + registry.fill(HIST("hEventCounterMC"), 0); + if (!(std::abs(mcCollision.posZ()) < cfgCutVertex)) { + return; + } + if (collisions.size() < 1) { + return; + } + if (cfgAcceptSplitCollisions == 0 && collisions.size() > 1) { + return; + } + float centrality = -999; + for (const auto& collision : collisions) { // Anayway only 1 collision per mcCollision will be selected + if (!colCuts.isSelected(collision)) // Default event selection + return; + colCuts.fillQARun2(collision); + centrality = collision.centRun2V0M(); + } + registry.fill(HIST("hEventCounterMC"), 1); + registry.fill(HIST("hZVertexMC"), mcCollision.posZ(), centrality); + if (centrality < cfgCentMin || centrality > cfgCentMax) { + return; + } + for (const auto& particle : mcParticles) { + auto charge = getCharge(particle); + if ((!particle.isPhysicalPrimary()) || !isChargedParticle(particle.pdgCode())) { + continue; + } + // pT and eta selections + if (particle.pt() < cfgPtMin || particle.pt() > cfgPtMax || particle.eta() < cfgEtaMin || particle.eta() > cfgEtaMax) { + continue; + } + registry.fill(HIST("hPtGen"), particle.pt(), centrality); + registry.fill(HIST("hEtaGen"), particle.eta(), centrality); + if (charge > 0) { // Positive particles + registry.fill(HIST("hPtGenPos"), particle.pt(), centrality); + } else if (charge < 0) { // Negative particles + registry.fill(HIST("hPtGenNeg"), particle.pt(), centrality); + } + } + // Reconstruct tracks from MC particles + for (const auto& collision : collisions) { + registry.fill(HIST("hZVertexReco"), collision.posZ(), centrality); + registry.fill(HIST("hZVertexCorrelation"), mcCollision.posZ(), collision.posZ()); + auto tracks = mcTracks.sliceBy(perCollision, collision.globalIndex()); + for (const auto& track : tracks) { + if (!track.has_mcParticle()) { + continue; + } + auto mcPart = track.mcParticle(); + if (!mcPart.isPhysicalPrimary() || !isChargedParticle(mcPart.pdgCode())) { + continue; + } + // pT and eta selections + if (track.pt() < cfgPtMin || track.pt() > cfgPtMax || track.eta() < cfgEtaMin || track.eta() > cfgEtaMax) { + continue; + } + registry.fill(HIST("hPtRec"), track.pt(), centrality); + registry.fill(HIST("hEtaRec"), track.eta(), centrality); + if (track.sign() > 0) { // Positive tracks + registry.fill(HIST("hPtRecPos"), track.pt(), centrality); + } else if (track.sign() < 0) { // Negative tracks + registry.fill(HIST("hPtRecNeg"), track.pt(), centrality); + } + } + } + } + void processData(CollisionCandidates::iterator const& collision, soa::Filtered const& tracks) { if (!colCuts.isSelected(collision)) // Default event selection @@ -350,6 +424,31 @@ struct JFlucEfficiencyTask { } } + void processDataRun2(CollisionRun2Candidates::iterator const& collision, soa::Filtered const& tracks) + { + if (!colCuts.isSelected(collision)) // Default event selection + return; + colCuts.fillQARun2(collision); + auto centrality = collision.centRun2V0M(); + if (centrality < cfgCentMin || centrality > cfgCentMax) { + return; + } + registry.fill(HIST("hZVertexReco"), collision.posZ(), centrality); + for (const auto& track : tracks) { + // pT and eta selections + if (track.pt() < cfgPtMin || track.pt() > cfgPtMax || track.eta() < cfgEtaMin || track.eta() > cfgEtaMax) { + continue; + } + registry.fill(HIST("hPtRec"), track.pt(), centrality); + registry.fill(HIST("hEtaRec"), track.eta(), centrality); + if (track.sign() > 0) { // Positive tracks + registry.fill(HIST("hPtRecPos"), track.pt(), centrality); + } else if (track.sign() < 0) { // Negative tracks + registry.fill(HIST("hPtRecNeg"), track.pt(), centrality); + } + } + } + // NOTE SmallGroups includes soa::Filtered always Preslice perCFCollision = aod::cftrack::cfCollisionId; void processEfficiency(soa::Filtered::iterator const& mcCollision, @@ -455,7 +554,9 @@ struct JFlucEfficiencyTask { } PROCESS_SWITCH(JFlucEfficiencyTask, processMC, "Process MC only", false); + PROCESS_SWITCH(JFlucEfficiencyTask, processMCRun2, "Process Run2 MC only", false); PROCESS_SWITCH(JFlucEfficiencyTask, processData, "Process data only", false); + PROCESS_SWITCH(JFlucEfficiencyTask, processDataRun2, "Process Run2 data only", false); PROCESS_SWITCH(JFlucEfficiencyTask, processDerivedMC, "Process derived MC only", false); PROCESS_SWITCH(JFlucEfficiencyTask, processDerivedData, "Process derived data only", false); PROCESS_SWITCH(JFlucEfficiencyTask, processEfficiency, "Process efficiency task", true); From f1e06c752029b4fc81e1303ed78f9a7d3c257efd Mon Sep 17 00:00:00 2001 From: Evgeny Kryshen Date: Fri, 14 Mar 2025 18:10:22 +0300 Subject: [PATCH 0655/1650] [Common] Set triggerBcShift to 0 by default. Use default CCDB objects for unanchored MCs (#10454) --- Common/TableProducer/eventSelection.cxx | 32 ++++++++++++------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Common/TableProducer/eventSelection.cxx b/Common/TableProducer/eventSelection.cxx index 49cb49475cc..1e55b6288a3 100644 --- a/Common/TableProducer/eventSelection.cxx +++ b/Common/TableProducer/eventSelection.cxx @@ -59,12 +59,12 @@ struct BcSelectionTask { Produces bcsel; Service ccdb; HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; - Configurable confTriggerBcShift{"triggerBcShift", 999, "set to 294 for apass2/apass3 in LHC22o-t"}; // o2-linter: disable=name/configurable - Configurable confITSROFrameStartBorderMargin{"ITSROFrameStartBorderMargin", -1, "Number of bcs at the start of ITS RO Frame border. Take from CCDB if -1"}; // o2-linter: disable=name/configurable - Configurable confITSROFrameEndBorderMargin{"ITSROFrameEndBorderMargin", -1, "Number of bcs at the end of ITS RO Frame border. Take from CCDB if -1"}; // o2-linter: disable=name/configurable - Configurable confTimeFrameStartBorderMargin{"TimeFrameStartBorderMargin", -1, "Number of bcs to cut at the start of the Time Frame. Take from CCDB if -1"}; // o2-linter: disable=name/configurable - Configurable confTimeFrameEndBorderMargin{"TimeFrameEndBorderMargin", -1, "Number of bcs to cut at the end of the Time Frame. Take from CCDB if -1"}; // o2-linter: disable=name/configurable - Configurable confCheckRunDurationLimits{"checkRunDurationLimits", false, "Check if the BCs are within the run duration limits"}; // o2-linter: disable=name/configurable + Configurable confTriggerBcShift{"triggerBcShift", 0, "set either custom shift or 999 for apass2/apass3 in LHC22o-t"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confITSROFrameStartBorderMargin{"ITSROFrameStartBorderMargin", -1, "Number of bcs at the start of ITS RO Frame border. Take from CCDB if -1"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confITSROFrameEndBorderMargin{"ITSROFrameEndBorderMargin", -1, "Number of bcs at the end of ITS RO Frame border. Take from CCDB if -1"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confTimeFrameStartBorderMargin{"TimeFrameStartBorderMargin", -1, "Number of bcs to cut at the start of the Time Frame. Take from CCDB if -1"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confTimeFrameEndBorderMargin{"TimeFrameEndBorderMargin", -1, "Number of bcs to cut at the end of the Time Frame. Take from CCDB if -1"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confCheckRunDurationLimits{"checkRunDurationLimits", false, "Check if the BCs are within the run duration limits"}; // o2-linter: disable=name/configurable (temporary fix) Configurable> maxInactiveChipsPerLayer{"maxInactiveChipsPerLayer", {8, 8, 8, 111, 111, 195, 195}, "Maximum allowed number of inactive ITS chips per layer"}; int lastRun = -1; @@ -264,7 +264,7 @@ struct BcSelectionTask { int run = bcs.iteratorAt(0).runNumber(); - if (run != lastRun && run >= 500000) { + if (run != lastRun) { lastRun = run; auto runInfo = o2::parameters::AggregatedRunInfo::buildAggregatedRunInfo(o2::ccdb::BasicCCDBManager::instance(), run); // first bc of the first orbit @@ -341,7 +341,7 @@ struct BcSelectionTask { } // bc loop - for (auto bc : bcs) { // o2-linter: disable=const-ref-in-for-loop + for (auto bc : bcs) { // o2-linter: disable=const-ref-in-for-loop (use bc as nonconst iterator) // store rct flags uint32_t rct = lastRCT; int64_t thisTF = (bc.globalBC() - bcSOR) / nBCsPerTF; @@ -550,14 +550,14 @@ struct EventSelectionTask { Configurable confSigmaBCforHighPtTracks{"confSigmaBCforHighPtTracks", 4, "Custom sigma (in bcs) for collisions with high-pt tracks"}; // configurables for occupancy-based event selection - Configurable confTimeIntervalForOccupancyCalculationMin{"TimeIntervalForOccupancyCalculationMin", -40, "Min time diff window for TPC occupancy calculation, us"}; // o2-linter: disable=name/configurable - Configurable confTimeIntervalForOccupancyCalculationMax{"TimeIntervalForOccupancyCalculationMax", 100, "Max time diff window for TPC occupancy calculation, us"}; // o2-linter: disable=name/configurable - Configurable confTimeRangeVetoOnCollStandard{"TimeRangeVetoOnCollStandard", 10.0, "Exclusion of a collision if there are other collisions nearby, +/- us"}; // o2-linter: disable=name/configurable - Configurable confTimeRangeVetoOnCollNarrow{"TimeRangeVetoOnCollNarrow", 2.0, "Exclusion of a collision if there are other collisions nearby, +/- us"}; // o2-linter: disable=name/configurable - Configurable confFT0CamplCutVetoOnCollInTimeRange{"FT0CamplPerCollCutVetoOnCollInTimeRange", 8000, "Max allowed FT0C amplitude for each nearby collision in +/- time range"}; // o2-linter: disable=name/configurable - Configurable confFT0CamplCutVetoOnCollInROF{"FT0CamplPerCollCutVetoOnCollInROF", 5000, "Max allowed FT0C amplitude for each nearby collision inside this ITS ROF"}; // o2-linter: disable=name/configurable - Configurable confEpsilonVzDiffVetoInROF{"EpsilonVzDiffVetoInROF", 0.3, "Minumum distance to nearby collisions along z inside this ITS ROF, cm"}; // o2-linter: disable=name/configurable - Configurable confUseWeightsForOccupancyVariable{"UseWeightsForOccupancyEstimator", 1, "Use or not the delta-time weights for the occupancy estimator"}; // o2-linter: disable=name/configurable + Configurable confTimeIntervalForOccupancyCalculationMin{"TimeIntervalForOccupancyCalculationMin", -40, "Min time diff window for TPC occupancy calculation, us"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confTimeIntervalForOccupancyCalculationMax{"TimeIntervalForOccupancyCalculationMax", 100, "Max time diff window for TPC occupancy calculation, us"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confTimeRangeVetoOnCollStandard{"TimeRangeVetoOnCollStandard", 10.0, "Exclusion of a collision if there are other collisions nearby, +/- us"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confTimeRangeVetoOnCollNarrow{"TimeRangeVetoOnCollNarrow", 2.0, "Exclusion of a collision if there are other collisions nearby, +/- us"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confFT0CamplCutVetoOnCollInTimeRange{"FT0CamplPerCollCutVetoOnCollInTimeRange", 8000, "Max allowed FT0C amplitude for each nearby collision in +/- time range"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confFT0CamplCutVetoOnCollInROF{"FT0CamplPerCollCutVetoOnCollInROF", 5000, "Max allowed FT0C amplitude for each nearby collision inside this ITS ROF"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confEpsilonVzDiffVetoInROF{"EpsilonVzDiffVetoInROF", 0.3, "Minumum distance to nearby collisions along z inside this ITS ROF, cm"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confUseWeightsForOccupancyVariable{"UseWeightsForOccupancyEstimator", 1, "Use or not the delta-time weights for the occupancy estimator"}; // o2-linter: disable=name/configurable (temporary fix) Partition tracklets = (aod::track::trackType == static_cast(o2::aod::track::TrackTypeEnum::Run2Tracklet)); From 57e70c482b69603b6a8018e2a6dfa253b0acf40f Mon Sep 17 00:00:00 2001 From: limhyunji999 <95397778+limhyunji999@users.noreply.github.com> Date: Sat, 15 Mar 2025 00:28:27 +0900 Subject: [PATCH 0656/1650] [PWGLF] Add the same PID option with Run2 analysis (#10455) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Resonances/rho770analysis.cxx | 43 +++++++++++++++++++---- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/PWGLF/Tasks/Resonances/rho770analysis.cxx b/PWGLF/Tasks/Resonances/rho770analysis.cxx index ddda2ad25ac..07531afc724 100644 --- a/PWGLF/Tasks/Resonances/rho770analysis.cxx +++ b/PWGLF/Tasks/Resonances/rho770analysis.cxx @@ -12,7 +12,7 @@ /// \file rho770analysis.cxx /// \brief rho(770)0 analysis in pp 13 & 13.6 TeV /// \author Hyunji Lim (hyunji.lim@cern.ch) -/// \since 01/23/2025 +/// \since 03/12/2025 #include #include @@ -45,7 +45,7 @@ struct rho770analysis { Configurable cfgMaxDCArToPVcut{"cfgMaxDCArToPVcut", 0.15, "Maximum transverse DCA"}; Configurable cfgMaxDCAzToPVcut{"cfgMaxDCAzToPVcut", 2.0, "Maximum longitudinal DCA"}; Configurable cfgMaxTPC{"cfgMaxTPC", 5.0, "Maximum TPC PID with TOF"}; - Configurable cfgMaxTOF{"cfgMaxTOF", 3.0, "Maximum TOF PID with TPC"}; + Configurable cfgMaxTOF{"cfgMaxTOF", 5.0, "Maximum TOF PID with TPC"}; Configurable cfgMinRap{"cfgMinRap", -0.5, "Minimum rapidity for pair"}; Configurable cfgMaxRap{"cfgMaxRap", 0.5, "Maximum rapidity for pair"}; @@ -68,7 +68,8 @@ struct rho770analysis { // PID Configurable cMaxTOFnSigmaPion{"cMaxTOFnSigmaPion", 3.0, "TOF nSigma cut for Pion"}; // TOF - Configurable cMaxTPCnSigmaPion{"cMaxTPCnSigmaPion", 3.0, "TPC nSigma cut for Pion"}; // TPC + Configurable cMaxTPCnSigmaPion{"cMaxTPCnSigmaPion", 5.0, "TPC nSigma cut for Pion"}; // TPC + Configurable cMaxTPCnSigmaPionnoTOF{"cMaxTPCnSigmaPionnoTOF", 2.0, "TPC nSigma cut for Pion in no TOF case"}; // TPC Configurable nsigmaCutCombinedPion{"nsigmaCutCombinedPion", 3.0, "Combined nSigma cut for Pion"}; Configurable selectType{"selectType", 0, "PID selection type"}; @@ -97,6 +98,10 @@ struct rho770analysis { histos.add("hInvMass_Kstar_LSpp", "Kstar ++ invariant mass", {HistType::kTHnSparseF, {massKstarAxis, ptAxis, centAxis}}); histos.add("hInvMass_Kstar_LSmm", "Kstar -- invariant mass", {HistType::kTHnSparseF, {massKstarAxis, ptAxis, centAxis}}); + histos.add("QA/Nsigma_TPC_BF", "", {HistType::kTH2F, {pTqaAxis, pidqaAxis}}); + histos.add("QA/Nsigma_TOF_BF", "", {HistType::kTH2F, {pTqaAxis, pidqaAxis}}); + histos.add("QA/TPC_TOF_BF", "", {HistType::kTH2F, {pidqaAxis, pidqaAxis}}); + histos.add("QA/Nsigma_TPC", "", {HistType::kTH2F, {pTqaAxis, pidqaAxis}}); histos.add("QA/Nsigma_TOF", "", {HistType::kTH2F, {pTqaAxis, pidqaAxis}}); histos.add("QA/TPC_TOF", "", {HistType::kTH2F, {pidqaAxis, pidqaAxis}}); @@ -163,6 +168,15 @@ struct rho770analysis { if (track.tpcNSigmaPi() * track.tpcNSigmaPi() + track.tofNSigmaPi() * track.tofNSigmaPi() >= nsigmaCutCombinedPion * nsigmaCutCombinedPion) return false; } + if (selectType == 3) { + if (track.hasTOF()) { + if (std::fabs(track.tpcNSigmaPi()) >= cMaxTPCnSigmaPion || std::fabs(track.tofNSigmaPi()) >= cMaxTOFnSigmaPion) + return false; + } else if (!track.hasTOF()) { + if (std::fabs(track.tpcNSigmaPi()) >= cMaxTPCnSigmaPionnoTOF) + return false; + } + } return true; } @@ -181,6 +195,15 @@ struct rho770analysis { if (track.tpcNSigmaKa() * track.tpcNSigmaKa() + track.tofNSigmaKa() * track.tofNSigmaKa() >= nsigmaCutCombinedPion * nsigmaCutCombinedPion) return false; } + if (selectType == 3) { + if (track.hasTOF()) { + if (std::fabs(track.tpcNSigmaKa()) >= cMaxTPCnSigmaPion || std::fabs(track.tofNSigmaKa()) >= cMaxTOFnSigmaPion) + return false; + } else if (!track.hasTOF()) { + if (std::fabs(track.tpcNSigmaKa()) >= cMaxTPCnSigmaPionnoTOF) + return false; + } + } return true; } @@ -191,6 +214,10 @@ struct rho770analysis { for (const auto& [trk1, trk2] : combinations(CombinationsUpperIndexPolicy(dTracks, dTracks))) { if (trk1.index() == trk2.index()) { + histos.fill(HIST("QA/Nsigma_TPC_BF"), trk1.pt(), trk1.tpcNSigmaPi()); + histos.fill(HIST("QA/Nsigma_TOF_BF"), trk1.pt(), trk1.tofNSigmaPi()); + histos.fill(HIST("QA/TPC_TOF_BF"), trk1.tpcNSigmaPi(), trk1.tofNSigmaPi()); + if (!selTrack(trk1)) continue; @@ -306,17 +333,19 @@ struct rho770analysis { truthpar.SetPxPyPzE(part.px(), part.py(), part.pz(), part.e()); auto mass = truthpar.M(); + histos.fill(HIST("MCL/hpT_rho770_GEN"), 0, mass, part.pt(), multiplicity); + if (collision.isVtxIn10()) { - histos.fill(HIST("MCL/hpT_rho770_GEN"), 0, mass, part.pt(), multiplicity); + histos.fill(HIST("MCL/hpT_rho770_GEN"), 1, mass, part.pt(), multiplicity); } if (collision.isVtxIn10() && collision.isInSel8()) { - histos.fill(HIST("MCL/hpT_rho770_GEN"), 1, mass, part.pt(), multiplicity); + histos.fill(HIST("MCL/hpT_rho770_GEN"), 2, mass, part.pt(), multiplicity); } if (collision.isVtxIn10() && collision.isTriggerTVX()) { - histos.fill(HIST("MCL/hpT_rho770_GEN"), 2, mass, part.pt(), multiplicity); + histos.fill(HIST("MCL/hpT_rho770_GEN"), 3, mass, part.pt(), multiplicity); } if (collision.isInAfterAllCuts()) { - histos.fill(HIST("MCL/hpT_rho770_GEN"), 3, mass, part.pt(), multiplicity); + histos.fill(HIST("MCL/hpT_rho770_GEN"), 4, mass, part.pt(), multiplicity); } } }; From 02f5d38a6224a15936907f21510b445da7a89a00 Mon Sep 17 00:00:00 2001 From: yuanzhe <90246048+wang-yuanzhe@users.noreply.github.com> Date: Fri, 14 Mar 2025 16:28:49 +0100 Subject: [PATCH 0657/1650] [PWGLF] Update 3body EM and reduced data creator (#10430) --- PWGLF/DataModel/Reduced3BodyTables.h | 242 ++------ PWGLF/TableProducer/Nuspex/CMakeLists.txt | 2 +- .../Nuspex/decay3bodybuilder.cxx | 539 ++++++++++++++---- .../Nuspex/reduced3bodyCreator.cxx | 47 +- .../Nuspex/threebodyRecoTask.cxx | 2 +- 5 files changed, 536 insertions(+), 296 deletions(-) diff --git a/PWGLF/DataModel/Reduced3BodyTables.h b/PWGLF/DataModel/Reduced3BodyTables.h index b73c6c8775d..51fff63c81d 100644 --- a/PWGLF/DataModel/Reduced3BodyTables.h +++ b/PWGLF/DataModel/Reduced3BodyTables.h @@ -9,6 +9,11 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +/// \file Reduced3BodyTables.h +/// \brief Definitions of tables for reduced data of 3body decayed hypertriton analysis +/// \author Carolina Reetz +/// \author Yuanzhe Wang + #ifndef PWGLF_DATAMODEL_REDUCED3BODYTABLES_H_ #define PWGLF_DATAMODEL_REDUCED3BODYTABLES_H_ @@ -41,147 +46,6 @@ namespace reducedtracks3body { // track parameter definition DECLARE_SOA_INDEX_COLUMN_FULL(Collision, collision, int, RedCollisions, ""); //! Collision index -DECLARE_SOA_COLUMN(X, x, float); //! -DECLARE_SOA_COLUMN(Alpha, alpha, float); //! -DECLARE_SOA_COLUMN(Y, y, float); //! -DECLARE_SOA_COLUMN(Z, z, float); //! -DECLARE_SOA_COLUMN(Snp, snp, float); //! -DECLARE_SOA_COLUMN(Tgl, tgl, float); //! -DECLARE_SOA_COLUMN(Signed1Pt, signed1Pt, float); //! (sign of charge)/Pt in c/GeV. Use pt() and sign() instead -DECLARE_SOA_EXPRESSION_COLUMN(Phi, phi, float, //! Phi of the track, in radians within [0, 2pi) - ifnode(nasin(aod::track::snp) + aod::track::alpha < 0.0f, nasin(aod::track::snp) + aod::track::alpha + o2::constants::math::TwoPI, - ifnode(nasin(aod::track::snp) + aod::track::alpha >= o2::constants::math::TwoPI, nasin(aod::track::snp) + aod::track::alpha - o2::constants::math::TwoPI, - nasin(aod::track::snp) + aod::track::alpha))); -DECLARE_SOA_EXPRESSION_COLUMN(Eta, eta, float, //! Pseudorapidity - -1.f * nlog(ntan(o2::constants::math::PIQuarter - 0.5f * natan(aod::track::tgl)))); -DECLARE_SOA_EXPRESSION_COLUMN(Pt, pt, float, //! Transverse momentum of the track in GeV/c - ifnode(nabs(aod::track::signed1Pt) <= o2::constants::math::Almost0, o2::constants::math::VeryBig, nabs(1.f / aod::track::signed1Pt))); -DECLARE_SOA_DYNAMIC_COLUMN(Sign, sign, //! Charge: positive: 1, negative: -1 - [](float signed1Pt) -> short { return (signed1Pt > 0) ? 1 : -1; }); -DECLARE_SOA_DYNAMIC_COLUMN(Px, px, //! Momentum in x-direction in GeV/c - [](float signed1Pt, float snp, float alpha) -> float { - auto pt = 1.f / std::abs(signed1Pt); - // FIXME: GCC & clang should optimize to sincosf - float cs = cosf(alpha), sn = sinf(alpha); - auto r = std::sqrt((1.f - snp) * (1.f + snp)); - return pt * (r * cs - snp * sn); - }); -DECLARE_SOA_DYNAMIC_COLUMN(Py, py, //! Momentum in y-direction in GeV/c - [](float signed1Pt, float snp, float alpha) -> float { - auto pt = 1.f / std::abs(signed1Pt); - // FIXME: GCC & clang should optimize to sincosf - float cs = cosf(alpha), sn = sinf(alpha); - auto r = std::sqrt((1.f - snp) * (1.f + snp)); - return pt * (snp * cs + r * sn); - }); -DECLARE_SOA_DYNAMIC_COLUMN(Pz, pz, //! Momentum in z-direction in GeV/c - [](float signed1Pt, float tgl) -> float { - auto pt = 1.f / std::abs(signed1Pt); - return pt * tgl; - }); -DECLARE_SOA_EXPRESSION_COLUMN(P, p, float, //! Momentum in Gev/c - ifnode(nabs(aod::track::signed1Pt) <= o2::constants::math::Almost0, o2::constants::math::VeryBig, 0.5f * (ntan(o2::constants::math::PIQuarter - 0.5f * natan(aod::track::tgl)) + 1.f / ntan(o2::constants::math::PIQuarter - 0.5f * natan(aod::track::tgl))) / nabs(aod::track::signed1Pt))); -DECLARE_SOA_DYNAMIC_COLUMN(Rapidity, rapidity, //! Track rapidity, computed under the mass assumption given as input - [](float signed1Pt, float tgl, float mass) -> float { - const auto pt = 1.f / std::abs(signed1Pt); - const auto pz = pt * tgl; - const auto p = 0.5f * (std::tan(o2::constants::math::PIQuarter - 0.5f * std::atan(tgl)) + 1.f / std::tan(o2::constants::math::PIQuarter - 0.5f * std::atan(tgl))) * pt; - const auto energy = std::sqrt(p * p + mass * mass); - return 0.5f * std::log((energy + pz) / (energy - pz)); - }); - -// tracks cov matrix parameter definition -DECLARE_SOA_COLUMN(SigmaY, sigmaY, float); //! Covariance matrix -DECLARE_SOA_COLUMN(SigmaZ, sigmaZ, float); //! Covariance matrix -DECLARE_SOA_COLUMN(SigmaSnp, sigmaSnp, float); //! Covariance matrix -DECLARE_SOA_COLUMN(SigmaTgl, sigmaTgl, float); //! Covariance matrix -DECLARE_SOA_COLUMN(Sigma1Pt, sigma1Pt, float); //! Covariance matrix -DECLARE_SOA_COLUMN(RhoZY, rhoZY, int8_t); //! Covariance matrix in compressed form -DECLARE_SOA_COLUMN(RhoSnpY, rhoSnpY, int8_t); //! Covariance matrix in compressed form -DECLARE_SOA_COLUMN(RhoSnpZ, rhoSnpZ, int8_t); //! Covariance matrix in compressed form -DECLARE_SOA_COLUMN(RhoTglY, rhoTglY, int8_t); //! Covariance matrix in compressed form -DECLARE_SOA_COLUMN(RhoTglZ, rhoTglZ, int8_t); //! Covariance matrix in compressed form -DECLARE_SOA_COLUMN(RhoTglSnp, rhoTglSnp, int8_t); //! Covariance matrix in compressed form -DECLARE_SOA_COLUMN(Rho1PtY, rho1PtY, int8_t); //! Covariance matrix in compressed form -DECLARE_SOA_COLUMN(Rho1PtZ, rho1PtZ, int8_t); //! Covariance matrix in compressed form -DECLARE_SOA_COLUMN(Rho1PtSnp, rho1PtSnp, int8_t); //! Covariance matrix in compressed form -DECLARE_SOA_COLUMN(Rho1PtTgl, rho1PtTgl, int8_t); //! Covariance matrix in compressed form - -DECLARE_SOA_EXPRESSION_COLUMN(CYY, cYY, float, //! - aod::track::sigmaY* aod::track::sigmaY); -DECLARE_SOA_EXPRESSION_COLUMN(CZY, cZY, float, //! - (aod::track::rhoZY / 128.f) * (aod::track::sigmaZ * aod::track::sigmaY)); -DECLARE_SOA_EXPRESSION_COLUMN(CZZ, cZZ, float, //! - aod::track::sigmaZ* aod::track::sigmaZ); -DECLARE_SOA_EXPRESSION_COLUMN(CSnpY, cSnpY, float, //! - (aod::track::rhoSnpY / 128.f) * (aod::track::sigmaSnp * aod::track::sigmaY)); -DECLARE_SOA_EXPRESSION_COLUMN(CSnpZ, cSnpZ, float, //! - (aod::track::rhoSnpZ / 128.f) * (aod::track::sigmaSnp * aod::track::sigmaZ)); -DECLARE_SOA_EXPRESSION_COLUMN(CSnpSnp, cSnpSnp, float, //! - aod::track::sigmaSnp* aod::track::sigmaSnp); -DECLARE_SOA_EXPRESSION_COLUMN(CTglY, cTglY, float, //! - (aod::track::rhoTglY / 128.f) * (aod::track::sigmaTgl * aod::track::sigmaY)); -DECLARE_SOA_EXPRESSION_COLUMN(CTglZ, cTglZ, float, //! - (aod::track::rhoTglZ / 128.f) * (aod::track::sigmaTgl * aod::track::sigmaZ)); -DECLARE_SOA_EXPRESSION_COLUMN(CTglSnp, cTglSnp, float, //! - (aod::track::rhoTglSnp / 128.f) * (aod::track::sigmaTgl * aod::track::sigmaSnp)); -DECLARE_SOA_EXPRESSION_COLUMN(CTglTgl, cTglTgl, float, //! - aod::track::sigmaTgl* aod::track::sigmaTgl); -DECLARE_SOA_EXPRESSION_COLUMN(C1PtY, c1PtY, float, //! - (aod::track::rho1PtY / 128.f) * (aod::track::sigma1Pt * aod::track::sigmaY)); -DECLARE_SOA_EXPRESSION_COLUMN(C1PtZ, c1PtZ, float, //! - (aod::track::rho1PtZ / 128.f) * (aod::track::sigma1Pt * aod::track::sigmaZ)); -DECLARE_SOA_EXPRESSION_COLUMN(C1PtSnp, c1PtSnp, float, //! - (aod::track::rho1PtSnp / 128.f) * (aod::track::sigma1Pt * aod::track::sigmaSnp)); -DECLARE_SOA_EXPRESSION_COLUMN(C1PtTgl, c1PtTgl, float, //! - (aod::track::rho1PtTgl / 128.f) * (aod::track::sigma1Pt * aod::track::sigmaTgl)); -DECLARE_SOA_EXPRESSION_COLUMN(C1Pt21Pt2, c1Pt21Pt2, float, //! - aod::track::sigma1Pt* aod::track::sigma1Pt); - -// tracks extra parameter definition -DECLARE_SOA_COLUMN(TPCInnerParam, tpcInnerParam, float); //! Momentum at inner wall of the TPC -DECLARE_SOA_COLUMN(Flags, flags, uint32_t); //! Track flags. Run 2: see TrackFlagsRun2Enum | Run 3: see TrackFlags -DECLARE_SOA_COLUMN(ITSClusterSizes, itsClusterSizes, uint32_t); //! Clusters sizes, four bits per a layer, starting from the innermost -DECLARE_SOA_COLUMN(TPCNClsFindable, tpcNClsFindable, uint8_t); //! Findable TPC clusters for this track geometry -DECLARE_SOA_COLUMN(TPCNClsFindableMinusFound, tpcNClsFindableMinusFound, int8_t); //! TPC Clusters: Findable - Found -DECLARE_SOA_COLUMN(TPCNClsFindableMinusCrossedRows, tpcNClsFindableMinusCrossedRows, int8_t); //! TPC Clusters: Findable - crossed rows -DECLARE_SOA_COLUMN(TRDPattern, trdPattern, uint8_t); //! Contributor to the track on TRD layer in bits 0-5, starting from the innermost, bit 6 indicates a potentially split tracklet, bit 7 if the track crossed a padrow -DECLARE_SOA_COLUMN(TPCChi2NCl, tpcChi2NCl, float); //! Chi2 / cluster for the TPC track segment -DECLARE_SOA_COLUMN(TOFChi2, tofChi2, float); //! Chi2 for the TOF track segment -DECLARE_SOA_COLUMN(TPCSignal, tpcSignal, float); //! dE/dx signal in the TPC -DECLARE_SOA_COLUMN(TOFExpMom, tofExpMom, float); //! TOF expected momentum obtained in tracking, used to compute the expected times - -DECLARE_SOA_EXPRESSION_COLUMN(DetectorMap, detectorMap, uint8_t, //! Detector map version 1, see enum DetectorMapEnum - ifnode(aod::track::itsClusterSizes > (uint32_t)0, static_cast(o2::aod::track::ITS), (uint8_t)0x0) | - ifnode(aod::track::tpcNClsFindable > (uint8_t)0, static_cast(o2::aod::track::TPC), (uint8_t)0x0) | - ifnode(aod::track::trdPattern > (uint8_t)0, static_cast(o2::aod::track::TRD), (uint8_t)0x0) | - ifnode((aod::track::tofChi2 >= 0.f) && (aod::track::tofExpMom > 0.f), static_cast(o2::aod::track::TOF), (uint8_t)0x0)); - -DECLARE_SOA_DYNAMIC_COLUMN(ITSClsSizeInLayer, itsClsSizeInLayer, //! Size of the ITS cluster in a given layer - [](uint32_t itsClusterSizes, int layer) -> uint8_t { - if (layer >= 7 || layer < 0) { - return 0; - } - return (itsClusterSizes >> (layer * 4)) & 0xf; - }); - -DECLARE_SOA_DYNAMIC_COLUMN(HasTPC, hasTPC, //! Flag to check if track has a TPC match - [](uint8_t detectorMap) -> bool { return detectorMap & o2::aod::track::TPC; }); -DECLARE_SOA_DYNAMIC_COLUMN(HasTOF, hasTOF, //! Flag to check if track has a TOF measurement - [](uint8_t detectorMap) -> bool { return detectorMap & o2::aod::track::TOF; }); -DECLARE_SOA_DYNAMIC_COLUMN(IsPVContributor, isPVContributor, //! Run 3: Has this track contributed to the collision vertex fit - [](uint8_t flags) -> bool { return (flags & o2::aod::track::PVContributor) == o2::aod::track::PVContributor; }); -DECLARE_SOA_DYNAMIC_COLUMN(PIDForTracking, pidForTracking, //! PID hypothesis used during tracking. See the constants in the class PID in PID.h - [](uint32_t flags) -> uint32_t { return flags >> 28; }); -DECLARE_SOA_DYNAMIC_COLUMN(TPCNClsFound, tpcNClsFound, //! Number of found TPC clusters - [](uint8_t tpcNClsFindable, int8_t tpcNClsFindableMinusFound) -> int16_t { return (int16_t)tpcNClsFindable - tpcNClsFindableMinusFound; }); -DECLARE_SOA_DYNAMIC_COLUMN(TPCNClsCrossedRows, tpcNClsCrossedRows, //! Number of crossed TPC Rows - [](uint8_t tpcNClsFindable, int8_t TPCNClsFindableMinusCrossedRows) -> int16_t { return (int16_t)tpcNClsFindable - TPCNClsFindableMinusCrossedRows; }); -DECLARE_SOA_DYNAMIC_COLUMN(TPCCrossedRowsOverFindableCls, tpcCrossedRowsOverFindableCls, //! Ratio crossed rows over findable clusters - [](uint8_t tpcNClsFindable, int8_t tpcNClsFindableMinusCrossedRows) -> float { - int16_t tpcNClsCrossedRows = (int16_t)tpcNClsFindable - tpcNClsFindableMinusCrossedRows; - return (float)tpcNClsCrossedRows / (float)tpcNClsFindable; - }); // track PID definition DECLARE_SOA_COLUMN(TPCNSigmaPr, tpcNSigmaPr, float); //! Nsigma separation with the TPC detector for proton @@ -193,62 +57,62 @@ DECLARE_SOA_COLUMN(TOFNSigmaDe, tofNSigmaDe, float); //! Nsigma separation with DECLARE_SOA_TABLE_FULL(StoredRedIUTracks, "RedIUTracks", "AOD", "REDIUTRACK", //! On disk version of the track parameters at inner most update (e.g. ITS) as it comes from the tracking o2::soa::Index<>, reducedtracks3body::CollisionId, - reducedtracks3body::X, reducedtracks3body::Alpha, - reducedtracks3body::Y, reducedtracks3body::Z, reducedtracks3body::Snp, reducedtracks3body::Tgl, - reducedtracks3body::Signed1Pt, + track::X, track::Alpha, + track::Y, track::Z, track::Snp, track::Tgl, + track::Signed1Pt, // cov matrix - reducedtracks3body::SigmaY, reducedtracks3body::SigmaZ, reducedtracks3body::SigmaSnp, reducedtracks3body::SigmaTgl, reducedtracks3body::Sigma1Pt, - reducedtracks3body::RhoZY, reducedtracks3body::RhoSnpY, reducedtracks3body::RhoSnpZ, reducedtracks3body::RhoTglY, reducedtracks3body::RhoTglZ, - reducedtracks3body::RhoTglSnp, reducedtracks3body::Rho1PtY, reducedtracks3body::Rho1PtZ, reducedtracks3body::Rho1PtSnp, reducedtracks3body::Rho1PtTgl, + track::SigmaY, track::SigmaZ, track::SigmaSnp, track::SigmaTgl, track::Sigma1Pt, + track::RhoZY, track::RhoSnpY, track::RhoSnpZ, track::RhoTglY, track::RhoTglZ, + track::RhoTglSnp, track::Rho1PtY, track::Rho1PtZ, track::Rho1PtSnp, track::Rho1PtTgl, // tracks extra - reducedtracks3body::TPCInnerParam, reducedtracks3body::Flags, reducedtracks3body::ITSClusterSizes, - reducedtracks3body::TPCNClsFindable, reducedtracks3body::TPCNClsFindableMinusFound, reducedtracks3body::TPCNClsFindableMinusCrossedRows, - reducedtracks3body::TRDPattern, reducedtracks3body::TPCChi2NCl, reducedtracks3body::TOFChi2, - reducedtracks3body::TPCSignal, reducedtracks3body::TOFExpMom, + track::TPCInnerParam, track::Flags, track::ITSClusterSizes, + track::TPCNClsFindable, track::TPCNClsFindableMinusFound, track::TPCNClsFindableMinusCrossedRows, + track::TRDPattern, track::TPCChi2NCl, track::TOFChi2, + track::TPCSignal, track::TOFExpMom, // TPC PID reducedtracks3body::TPCNSigmaPr, reducedtracks3body::TPCNSigmaPi, reducedtracks3body::TPCNSigmaDe, reducedtracks3body::TOFNSigmaDe, // ----------- dynmaic columns ------------ // tracks IU - reducedtracks3body::Px, - reducedtracks3body::Py, - reducedtracks3body::Pz, - reducedtracks3body::Rapidity, - reducedtracks3body::Sign, + track::Px, + track::Py, + track::Pz, + track::Rapidity, + track::Sign, // tracks extra - reducedtracks3body::PIDForTracking, - reducedtracks3body::IsPVContributor, - reducedtracks3body::HasTPC, - reducedtracks3body::HasTOF, - reducedtracks3body::TPCNClsFound, - reducedtracks3body::TPCNClsCrossedRows, - reducedtracks3body::ITSClsSizeInLayer, - reducedtracks3body::TPCCrossedRowsOverFindableCls); + track::PIDForTracking, + track::IsPVContributor, + track::HasTPC, + track::HasTOF, + track::TPCNClsFound, + track::TPCNClsCrossedRows, + track::v001::ITSClsSizeInLayer, + track::TPCCrossedRowsOverFindableCls); DECLARE_SOA_EXTENDED_TABLE_USER(RedIUTracks, StoredRedIUTracks, "REDIUTRACKEXT", //! Track parameters at inner most update (e.g. ITS) as it comes from the tracking - reducedtracks3body::Pt, - reducedtracks3body::P, - reducedtracks3body::Eta, - reducedtracks3body::Phi, + track::Pt, + track::P, + track::Eta, + track::Phi, // cov matrix - reducedtracks3body::CYY, - reducedtracks3body::CZY, - reducedtracks3body::CZZ, - reducedtracks3body::CSnpY, - reducedtracks3body::CSnpZ, - reducedtracks3body::CSnpSnp, - reducedtracks3body::CTglY, - reducedtracks3body::CTglZ, - reducedtracks3body::CTglSnp, - reducedtracks3body::CTglTgl, - reducedtracks3body::C1PtY, - reducedtracks3body::C1PtZ, - reducedtracks3body::C1PtSnp, - reducedtracks3body::C1PtTgl, - reducedtracks3body::C1Pt21Pt2, + track::CYY, + track::CZY, + track::CZZ, + track::CSnpY, + track::CSnpZ, + track::CSnpSnp, + track::CTglY, + track::CTglZ, + track::CTglSnp, + track::CTglTgl, + track::C1PtY, + track::C1PtZ, + track::C1PtSnp, + track::C1PtTgl, + track::C1Pt21Pt2, // tracks extra - reducedtracks3body::DetectorMap); + track::v001::DetectorMap); namespace reduceddecay3body { @@ -270,6 +134,16 @@ using ReducedDecay3BodyLinked = ReducedDecay3BodysLinked::iterator; DECLARE_SOA_TABLE(Red3BodyInfo, "AOD", "RED3BODYINFO", //! joinable with RedDecay3Bodys reduceddecay3body::Radius, reduceddecay3body::Phi, reduceddecay3body::PosZ); +namespace dcafittersvinfo +{ +DECLARE_SOA_COLUMN(SVRadius, svRadius, float); //! SV radius in x-y plane calculated by dcaFitter +DECLARE_SOA_COLUMN(MomPhi, momPhi, float); //! phi of momentum of mother particle calculated from dcaFitter +DECLARE_SOA_COLUMN(SVPosZ, svPosZ, float); //! z position of SV calculated by dcaFitter +} // namespace dcafittersvinfo + +DECLARE_SOA_TABLE_FULL(DCAFitterSVInfo, "FitSVInfo", "AOD", "FITSVINFO", //! joinable with RedDecay3Bodys + dcafittersvinfo::SVRadius, dcafittersvinfo::MomPhi, dcafittersvinfo::SVPosZ); + } // namespace o2::aod #endif // PWGLF_DATAMODEL_REDUCED3BODYTABLES_H_ diff --git a/PWGLF/TableProducer/Nuspex/CMakeLists.txt b/PWGLF/TableProducer/Nuspex/CMakeLists.txt index a015f240c2e..e8ec0868378 100644 --- a/PWGLF/TableProducer/Nuspex/CMakeLists.txt +++ b/PWGLF/TableProducer/Nuspex/CMakeLists.txt @@ -11,7 +11,7 @@ o2physics_add_dpl_workflow(decay3bodybuilder SOURCES decay3bodybuilder.cxx - PUBLIC_LINK_LIBRARIES O2::DCAFitter KFParticle::KFParticle O2Physics::AnalysisCore O2::TOFBase O2Physics::EventFilteringUtils + PUBLIC_LINK_LIBRARIES O2::DCAFitter KFParticle::KFParticle O2Physics::AnalysisCore O2::TOFBase O2Physics::EventFilteringUtils O2::DetectorsVertexing COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(hyhefour-builder diff --git a/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx b/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx index d02fecd1d63..6bb7fe503cf 100644 --- a/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx +++ b/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx @@ -9,6 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +/// \file decay3bodybuilder.cxx /// \brief Builder task for 3-body decay reconstruction (p + pion + bachelor) /// \author Yuanzhe Wang /// \author Carolina Reetz (KFParticle specific part) @@ -18,6 +19,8 @@ #include #include #include +#include +#include #include #include @@ -29,6 +32,7 @@ #include "Framework/ASoAHelpers.h" #include "DCAFitter/DCAFitterN.h" #include "ReconstructionDataFormats/Track.h" +#include "DetectorsVertexing/SVertexHypothesis.h" #include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" #include "PWGLF/DataModel/LFStrangenessTables.h" @@ -50,6 +54,7 @@ #include "DataFormatsParameters/GRPMagField.h" #include "CCDB/BasicCCDBManager.h" #include "DataFormatsTPC/BetheBlochAleph.h" +#include "DataFormatsCalibration/MeanVertexObject.h" #ifndef HomogeneousField #define HomogeneousField @@ -80,7 +85,12 @@ using MCLabeledTracksIU = soa::Join; using ReducedCollisionsMults = soa::Join; using ReducedCollisionsMultsCents = soa::Join; -struct vtxCandidate { +namespace +{ +const float pidCutsLambda[o2::vertexing::SVertexHypothesis::NPIDParams] = {0., 20, 0., 5.0, 0.0, 1.09004e-03, 2.62291e-04, 8.93179e-03, 2.83121}; // Lambda +} // namespace + +struct VtxCandidate { int track0Id; int track1Id; int track2Id; @@ -160,9 +170,10 @@ struct decay3bodyBuilder { Produces kfvtx3bodydatalite; Service ccdb; o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; - std::vector vtxCandidates; + std::vector VtxCandidates; - std::unordered_map ccdbCache; // Maps runNumber -> d_bz + std::unordered_map ccdbCache; // Maps runNumber -> d_bz + std::unordered_map> grpMagCache; // Maps runNumber -> grpmap Zorro zorro; OutputObj zorroSummary{"zorroSummary"}; @@ -172,13 +183,13 @@ struct decay3bodyBuilder { // Configurables Configurable d_UseAbsDCA{"d_UseAbsDCA", true, "Use Abs DCAs"}; - enum hyp3body { kH3L = 0, + enum Hyp3Body { kH3L = 0, kH4L, kHe4L, kHe5L, kNHyp3body }; - enum vtxstep { kVtxAll = 0, + enum VtxStep { kVtxAll = 0, kVtxTPCNcls, kVtxPIDCut, kVtxhasSV, @@ -212,7 +223,7 @@ struct decay3bodyBuilder { HistogramRegistry registry{"registry", {}}; // hypothesis - Configurable motherhyp{"motherhyp", 0, "hypothesis of the 3body decayed particle"}; // corresponds to hyp3body + Configurable motherhyp{"motherhyp", 0, "hypothesis of the 3body decayed particle"}; // corresponds to Hyp3Body int bachelorcharge = 1; // to be updated in Init base on the hypothesis o2::aod::pidtofgeneric::TofPidNewCollision bachelorTOFPID; // to be updated in Init base on the hypothesis @@ -298,27 +309,40 @@ struct decay3bodyBuilder { } kfparticleConfigurations; //------------------------------------------------------------------ - // Sets for event mixing + // Sets for DCAFitter event mixing struct : ConfigurableGroup { - Configurable nUseMixedEvent{"nUseMixedEvent", 5, "nUseMixedEvent"}; - Configurable em_event_sel8_selection{"em_event_sel8_selection", true, "event selection count post sel8 cut"}; - Configurable etacut{"etacut", 0.9, "etacut"}; - Configurable minProtonPt{"minProtonPt", 0.3, "minProtonPt"}; - Configurable maxProtonPt{"maxProtonPt", 5, "maxProtonPt"}; - Configurable minPionPt{"minPionPt", 0.1, "minPionPt"}; - Configurable maxPionPt{"maxPionPt", 1.2, "maxPionPt"}; - Configurable minDeuteronPt{"minDeuteronPt", 0.6, "minDeuteronPt"}; - Configurable maxDeuteronPt{"maxDeuteronPt", 10, "maxDeuteronPt"}; - Configurable mintpcNClsproton{"mintpcNClsproton", 90, "min tpc Nclusters for proton"}; - Configurable mintpcNClspion{"mintpcNClspion", 70, "min tpc Nclusters for pion"}; - Configurable mintpcNClsbachelor{"mintpcNClsbachelor", 100, "min tpc Nclusters for bachelor"}; - Configurable emTpcPidNsigmaCut{"emTpcPidNsigmaCut", 5, "emTpcPidNsigmaCut"}; - } EMTrackSel; + Configurable nUseMixed{"dcaFitterEMSel.nUseMixed", 5, "nUseMixed"}; + Configurable mMinPt2V0{"dcaFitterEMSel.mMinPt2V0", 0.5, "mMinPt2V0"}; // minimum pT^2 of V0 + Configurable mMaxTgl2V0{"dcaFitterEMSel.mMaxTgl2V0", 4, "mMaxTgl2V0"}; // maximum tgLambda^2 of V0 + Configurable mMaxDCAXY2ToMeanVertex3bodyV0{"dcaFitterEMSel.mMaxDCAXY2ToMeanVertex3bodyV0", 4, "mMaxDCAXY2ToMeanVertex3bodyV0"}; // max DCA^2 of 2 body decay to mean vertex of 3 body decay in XY + Configurable minCosPAXYMeanVertex3bodyV0{"dcaFitterEMSel.minCosPAXYMeanVertex3bodyV0", 0.9, "minCosPAXYMeanVertex3bodyV0"}; // min CosPA of 2 body decay to mean vertex of 3 body decay in XY + Configurable minCosPA3bodyV0{"dcaFitterEMSel.minCosPA3bodyV0", 0.8, "minCosPA3bodyV0"}; // min CosPA of 3 body decay to PV + Configurable maxRDiffV03body{"dcaFitterEMSel.maxRDiffV03body", 3, "maxRDiffV03body"}; // Maximum difference between virtual V0 and 3body radius + Configurable minPt3Body = {"dcaFitterEMSel.minPt3Body", 0.01, ""}; // minimum pT of 3body Vertex + Configurable maxTgl3Body = {"dcaFitterEMSel.maxTgl3Body", 2, ""}; // maximum tgLambda of 3body Vertex + Configurable maxDCAXY3Body{"dcaFitterEMSel.maxDCAXY3Body", 0.5, "DCAXY H3L to PV"}; // max DCA of 3 body decay to PV in XY + Configurable maxDCAZ3Body{"dcaFitterEMSel.maxDCAZ3Body", 1.0, "DCAZ H3L to PV"}; // max DCA of 3 body decay to PV in Z + // Binning for mixing events + ConfigurableAxis binsVtxZ{"dcaFitterEMSel.binsVtxZ", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; + ConfigurableAxis binsMultiplicity{"dcaFitterEMSel.binsMultiplicity", {VARIABLE_WIDTH, 0.0f, 1.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f, 110.0f}, "Mixing bins - multiplicity"}; + Configurable maxDeltaRadiusColMixing{"dcaFitterEMSel.maxDeltaRadiusColMixing", 2., "max difference between pv z position in case of collision mixing"}; + Configurable maxDeltaPhiColMixing{"dcaFitterEMSel.maxDeltaPhiColMixing", 30., "max difference between Phi of monther particle in case of collision mixing (degree)"}; + // Configurations for mixing decay3bodys + // Configurable cfgUseDCAFitterInfo{"dcaFitterEMSel.cfgUseDCAFitterInfo", true, ""}; // if use information from dcatFitter while mixing reduced 3bodys + Configurable cfgMix3BodyMethod{"dcaFitterEMSel.cfgMix3BodyMethod", 0, ""}; // 0: bachelor, 1: pion, 2: proton + Configurable cfgApplyV0Cut{"dcaFitterEMSel.cfgApplyV0Cut", true, "if apply V0 cut while performing event-mixing"}; + ConfigurableAxis bins3BodyRadius{"dcaFitterEMSel.bins3BodyRadius", {VARIABLE_WIDTH, 0.0f, 2.0f, 4.0f, 7.0f, 10.0f, 14.0f, 18.0f, 22.0f, 30.0f, 40.0f}, "Mixing bins - 3body radius"}; + ConfigurableAxis bins3BodyPhi{"dcaFitterEMSel.bins3BodyPhi", {VARIABLE_WIDTH, -3.15, -2.15, -1, 0, 1, 2.15, 3.15}, "Mixing bins - 3body phi"}; + ConfigurableAxis bins3BodyPhiDegree{"dcaFitterEMSel.bins3BodyPhiDegree", {VARIABLE_WIDTH, -180, -120, -60, 0, 60, 120, 180}, "Mixing bins - 3body phi"}; + ConfigurableAxis bins3BodyPosZ{"dcaFitterEMSel.bins3BodyPosZ", {VARIABLE_WIDTH, -500.0f, -200.0f, -100.0f, -70.0f, -60.0f, -50.0f, -40.0f, -35.0f, -30.0f, -25.0f, -20.0f, -15.0f, -13.0f, -10.0f, -8.0f, -6.0f, -4.0f, -2.0f, 0.0f, 2.0f, 4.0f, 6.0f, 8.0f, 10.0f, 13.0f, 15.0f, 20.0f, 25.0f, 30.0f, 35.0f, 40.0f, 50.0f, 60.0f, 70.0f, 100.0f, 200.0f, 500.0f}, "3body SV z position"}; + Configurable selectPVPosZ3bodyMixing{"dcaFitterEMSel.selectPVPosZ3bodyMixing", true, "Select same pvPosZ events in case of 3body mixing"}; + Configurable maxDeltaPVPosZ3bodyMixing{"dcaFitterEMSel.maxDeltaPVPosZ3bodyMixing", 1., "max difference between pv z position in case of 3body mixing"}; + } dcaFitterEMSel; SliceCache cache; - ConfigurableAxis axisPosZ{"axisPosZ", {10, -10, 10}, "Mixing bins - posZ"}; - ConfigurableAxis axisCentrality{"axisCentrality", {10, 0, 100}, "Mixing bins - centrality"}; - using BinningType = ColumnBinningPolicy; + using BinningTypeColEM = ColumnBinningPolicy; + using Binning3BodyDCAFitter = ColumnBinningPolicy; + using Binning3BodyKFInfo = ColumnBinningPolicy; // KF event mixing using BinningTypeKF = ColumnBinningPolicy; @@ -335,8 +359,12 @@ struct decay3bodyBuilder { float maxSnp; // max sine phi for propagation float maxStep; // max step size (cm) for propagation o2::base::MatLayerCylSet* lut = nullptr; + o2::vertexing::DCAFitterN<2> fitterV0; o2::vertexing::DCAFitterN<3> fitter3body; o2::pid::tof::TOFResoParamsV2 mRespParamsV2; + std::array mV0Hyps; // 0 - Lambda, 1 - AntiLambda + bool doUpdateGRPMagField = false; // if initialize magnetic field for each bc + o2::dataformats::VertexBase mMeanVertex{{0., 0., 0.}, {0.1 * 0.1, 0., 0.1 * 0.1, 0., 0., 6. * 6.}}; void init(InitContext&) { @@ -347,21 +375,21 @@ struct decay3bodyBuilder { maxSnp = 0.85f; // could be changed later maxStep = 2.00f; // could be changed later - // set hypothesis corresponds to hyp3body, tpcpid to be implemented + // set hypothesis corresponds to Hyp3Body, tpcpid to be implemented switch (motherhyp) { - case hyp3body::kH3L: + case Hyp3Body::kH3L: bachelorcharge = 1; bachelorTOFPID.SetPidType(o2::track::PID::Deuteron); break; - case hyp3body::kH4L: + case Hyp3Body::kH4L: bachelorcharge = 1; bachelorTOFPID.SetPidType(o2::track::PID::Triton); break; - case hyp3body::kHe4L: + case Hyp3Body::kHe4L: bachelorcharge = 2; bachelorTOFPID.SetPidType(o2::track::PID::Helium3); break; - case hyp3body::kHe5L: + case Hyp3Body::kHe5L: bachelorcharge = 2; bachelorTOFPID.SetPidType(o2::track::PID::Alpha); break; @@ -370,6 +398,14 @@ struct decay3bodyBuilder { return; } + fitterV0.setPropagateToPCA(true); + fitterV0.setMaxR(200.); + fitterV0.setMinParamChange(1e-3); + fitterV0.setMinRelChi2Change(0.9); + fitterV0.setMaxDZIni(1e9); + fitterV0.setMaxChi2(1e9); + fitterV0.setUseAbsDCA(d_UseAbsDCA); + fitter3body.setPropagateToPCA(true); fitter3body.setMaxR(200.); //->maxRIni3body fitter3body.setMinParamChange(1e-3); @@ -401,12 +437,16 @@ struct decay3bodyBuilder { if (useMatCorrType == 2) matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT; + fitterV0.setMatCorrType(matCorr); fitter3body.setMatCorrType(matCorr); // Add histograms separately for different process functions - if (doprocessRun3 == true || doprocessRun3Reduced || doprocessRun3ReducedEM == true) { + if (doprocessRun3 == true || doprocessRun3Reduced) { registry.add("hEventCounter", "hEventCounter", HistType::kTH1F, {{1, 0.0f, 1.0f}}); - auto hVtx3BodyCounter = registry.add("hVtx3BodyCounter", "hVtx3BodyCounter", HistType::kTH1F, {{6, 0.0f, 6.0f}}); + } + + if (doprocessRun3 == true || doprocessRun3Reduced || doprocessRun3ReducedEM == true || doprocessRun3Reduced3bodyMixing == true || doprocessRun3Reduced3bodyMixingKFInfo == true) { + auto hVtx3BodyCounter = registry.add("hVtx3BodyCounter", "hVtx3BodyCounter", HistType::kTH1D, {{6, 0.0f, 6.0f}}); hVtx3BodyCounter->GetXaxis()->SetBinLabel(1, "Total"); hVtx3BodyCounter->GetXaxis()->SetBinLabel(2, "TPCNcls"); hVtx3BodyCounter->GetXaxis()->SetBinLabel(3, "PIDCut"); @@ -416,6 +456,34 @@ struct decay3bodyBuilder { registry.add("hBachelorTOFNSigmaDe", "", HistType::kTH2F, {{40, -10.0f, 10.0f, "p/z (GeV/c)"}, {40, -10.0f, 10.0f, "TOF n#sigma"}}); } + if (doprocessRun3ReducedEM == true) { + registry.add("hEventCount", "hEventCount", HistType::kTH2F, {dcaFitterEMSel.binsVtxZ, dcaFitterEMSel.binsMultiplicity}); + registry.add("hEventPairs", "hEventPairs", HistType::kTH2F, {dcaFitterEMSel.binsVtxZ, dcaFitterEMSel.binsMultiplicity}); + registry.add("hDecay3BodyPairsBeforeCut", "hDecay3BodyPairsBeforeCut", HistType::kTH2F, {dcaFitterEMSel.binsVtxZ, dcaFitterEMSel.binsMultiplicity}); + registry.add("hDecay3BodyPairsAfterCut", "hDecay3BodyPairsAfterCut", HistType::kTH2F, {dcaFitterEMSel.binsVtxZ, dcaFitterEMSel.binsMultiplicity}); + registry.add("hRadius0", "hRadius0", HistType::kTH1F, {{200, 0.0f, 20.0f, "Radius (cm)"}}); + registry.add("hRadius1", "hRadius1", HistType::kTH1F, {{200, 0.0f, 20.0f, "Radius (cm)"}}); + registry.add("hDeltaRadius", "hDeltaRadius", HistType::kTH1F, {{400, -20.0f, 20.0f, "#Delta Radius (cm)"}}); + registry.add("hPhi0", "hPhi0", HistType::kTH1F, {{360, -180.0f, 180.0f, "#phi (degree)"}}); + registry.add("hPhi1", "hPhi1", HistType::kTH1F, {{360, -180.0f, 180.0f, "#phi (degree)"}}); + registry.add("hDeltaPhi", "hDeltaPhi", HistType::kTH1F, {{360, -180.0f, 180.0f, "#Delta #phi (degree)"}}); + } + + if (doprocessRun3Reduced3bodyMixing == true || doprocessRun3Reduced3bodyMixingKFInfo == true) { + registry.add("hDecay3BodyRadiusPhi", "hDecay3BodyRadiusPhi", HistType::kTH2F, {dcaFitterEMSel.bins3BodyRadius, dcaFitterEMSel.bins3BodyPhi}); + registry.add("hDecay3BodyPosZ", "hDecay3BodyPosZ", HistType::kTH1F, {dcaFitterEMSel.bins3BodyPosZ}); + auto h3bodyCombinationCounter = registry.add("h3bodyCombinationCounter", "h3bodyCombinationCounter", HistType::kTH1D, {{4, 0.0f, 4.0f}}); + h3bodyCombinationCounter->GetXaxis()->SetBinLabel(1, "total"); + h3bodyCombinationCounter->GetXaxis()->SetBinLabel(2, "bach sign/ID"); + h3bodyCombinationCounter->GetXaxis()->SetBinLabel(3, "not same collision"); + h3bodyCombinationCounter->GetXaxis()->SetBinLabel(4, "collision VtxZ"); + } + + if (doprocessRun3ReducedEM == true || doprocessRun3Reduced3bodyMixing == true || doprocessRun3Reduced3bodyMixingKFInfo == true) { + doUpdateGRPMagField = true; + registry.add("h3bodyEMCutCounter", "h3bodyEMCutCounter", HistType::kTH1D, {{14, 0.0f, 14.0f}}); + } + if (doprocessRun3withKFParticle == true || doprocessRun3withKFParticleStrangenessTracking == true || doprocessRun3withKFParticleReduced == true || doprocessRun3withKFParticleReducedEM == true || doprocessRun3withKFParticleReduced3bodyMixing == true) { auto hEventCounterZorro = registry.add("Counters/hEventCounterZorro", "hEventCounterZorro", HistType::kTH1D, {{2, -0.5, 1.5}}); hEventCounterZorro->GetXaxis()->SetBinLabel(1, "Zorro before evsel"); @@ -509,8 +577,7 @@ struct decay3bodyBuilder { h3bodyCombinationCounter->GetXaxis()->SetBinLabel(1, "total"); h3bodyCombinationCounter->GetXaxis()->SetBinLabel(2, "bach sign/ID"); h3bodyCombinationCounter->GetXaxis()->SetBinLabel(3, "not same collision"); - h3bodyCombinationCounter->GetXaxis()->SetBinLabel(3, "collision VtxZ"); - h3bodyCombinationCounter->LabelsOption("v"); + h3bodyCombinationCounter->GetXaxis()->SetBinLabel(4, "collision VtxZ"); } } @@ -527,6 +594,7 @@ struct decay3bodyBuilder { // In case override, don't proceed, please - no CCDB access required if (d_bz_input > -990) { d_bz = d_bz_input; + fitterV0.setBz(d_bz); fitter3body.setBz(d_bz); #ifdef HomogeneousField KFParticle::SetField(d_bz); @@ -561,6 +629,7 @@ struct decay3bodyBuilder { } mRunNumber = bc.runNumber(); // Set magnetic field value once known + fitterV0.setBz(d_bz); fitter3body.setBz(d_bz); // Set magnetic field for KF vertexing #ifdef HomogeneousField @@ -636,48 +705,48 @@ struct decay3bodyBuilder { void initCCDBfromRunNumber(int runNumber) { + // set magnetic field only when run number changes + if (mRunNumber == runNumber) { + LOG(debug) << "CCDB initialized for run " << mRunNumber; + return; + } + mRunNumber = runNumber; // Update the last run number + // Check if the CCDB data for this run is already cached if (ccdbCache.find(runNumber) != ccdbCache.end()) { LOG(debug) << "CCDB data already cached for run " << runNumber; - - // get magnetic field info from cache - float d_bz = ccdbCache[runNumber]; - - // Set magnetic field for KF vertexing -#ifdef HomogeneousField - KFParticle::SetField(d_bz); -#endif - // Set field for DCAfitter - fitter3body.setBz(d_bz); - - if (useMatCorrType == 2) { - // setMatLUT only after magfield has been initalized - o2::base::Propagator::Instance()->setMatLUT(lut); + d_bz = ccdbCache[runNumber]; + if (doUpdateGRPMagField == true) { + o2::base::Propagator::initFieldFromGRP(grpMagCache[runNumber].get()); } - } else { // fetch data from CCDB and cache it - o2::parameters::GRPMagField* grpmag = ccdb->getForRun(grpmagPath, runNumber); + } else { + std::shared_ptr grpmag = std::make_shared(*ccdb->getForRun(grpmagPath, runNumber)); if (!grpmag) { LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for run number " << runNumber; } - o2::base::Propagator::initFieldFromGRP(grpmag); + o2::base::Propagator::initFieldFromGRP(grpmag.get()); // Fetch magnetic field from ccdb for current collision d_bz = o2::base::Propagator::Instance()->getNominalBz(); LOG(info) << "Retrieved GRP for run number " << runNumber << " with magnetic field of " << d_bz << " kZG"; - // Set magnetic field for KF vertexing + ccdbCache[runNumber] = d_bz; + grpMagCache[runNumber] = grpmag; + } + + // Set magnetic field for KF vertexing #ifdef HomogeneousField - KFParticle::SetField(d_bz); + KFParticle::SetField(d_bz); #endif - // Set field for DCAfitter - fitter3body.setBz(d_bz); + // Set field for DCAfitter + fitterV0.setBz(d_bz); + fitter3body.setBz(d_bz); - if (useMatCorrType == 2) { - // setMatLUT only after magfield has been initalized - o2::base::Propagator::Instance()->setMatLUT(lut); - } + mV0Hyps[0].set(o2::track::PID::Lambda, o2::track::PID::Proton, o2::track::PID::Pion, pidCutsLambda, d_bz); + mV0Hyps[1].set(o2::track::PID::Lambda, o2::track::PID::Pion, o2::track::PID::Proton, pidCutsLambda, d_bz); - // cache magnetic field info - ccdbCache[runNumber] = d_bz; + if (useMatCorrType == 2) { + // setMatLUT only after magfield has been initalized + o2::base::Propagator::Instance()->setMatLUT(lut); } } @@ -712,9 +781,8 @@ struct decay3bodyBuilder { //------------------------------------------------------------------ // 3body candidate builder template - void fillVtxCand(TCollisionTable const& collision, TTrackTable const& t0, TTrackTable const& t1, TTrackTable const& t2, int64_t decay3bodyId, int bachelorcharge = 1, double tofNSigmaBach = -999) + void fillVtxCand(TCollisionTable const& collision, TTrackTable const& t0, TTrackTable const& t1, TTrackTable const& t2, int64_t decay3bodyId, int bachelorcharge = 1, double tofNSigmaBach = -999, bool saveInTable = true) { - registry.fill(HIST("hVtx3BodyCounter"), kVtxAll); if (t0.tpcNClsFound() < mintpcNCls || t1.tpcNClsFound() < mintpcNCls || t2.tpcNClsFound() < mintpcNCls) { @@ -784,15 +852,124 @@ struct decay3bodyBuilder { } registry.fill(HIST("hVtx3BodyCounter"), kVtxDcaDau); - float VtxcosPA = RecoDecay::cpa(array{collision.posX(), collision.posY(), collision.posZ()}, std::array{pos[0], pos[1], pos[2]}, std::array{p3B[0], p3B[1], p3B[2]}); + float VtxcosPA = RecoDecay::cpa(std::array{collision.posX(), collision.posY(), collision.posZ()}, std::array{pos[0], pos[1], pos[2]}, std::array{p3B[0], p3B[1], p3B[2]}); if (VtxcosPA < minCosPA3body) { return; } registry.fill(HIST("hVtx3BodyCounter"), kVtxCosPA); - registry.fill(HIST("hBachelorTOFNSigmaDe"), t2.sign() * t2.p(), tofNSigmaBach); - vtxCandidate candVtx; + // additional cut for EM + if (decay3bodyId == -1) { + registry.fill(HIST("h3bodyEMCutCounter"), 0.5); + auto v0Track0 = getTrackParCov(t0); + auto v0Track1 = getTrackParCov(t1); + int nV0 = fitterV0.process(v0Track0, v0Track1); + if (nV0 == 0) { + return; + } + registry.fill(HIST("h3bodyEMCutCounter"), 1.5); + + std::array v0pos = {0.}; + const auto& v0vtxXYZ = fitterV0.getPCACandidate(); + for (int i = 0; i < 3; i++) { + v0pos[i] = v0vtxXYZ[i]; + } + const int cand = 0; + if (!fitterV0.isPropagateTracksToVertexDone(cand) && !fitterV0.propagateTracksToVertex(cand)) { + return; + } + registry.fill(HIST("h3bodyEMCutCounter"), 2.5); + + const auto& trPProp = fitterV0.getTrack(0, cand); + const auto& trNProp = fitterV0.getTrack(1, cand); + std::array pP{}, pN{}; + trPProp.getPxPyPzGlo(pP); + trNProp.getPxPyPzGlo(pN); + std::array pV0 = {pP[0] + pN[0], pP[1] + pN[1], pP[2] + pN[2]}; + // Cut for Virtual V0 + float dxv0 = v0pos[0] - mMeanVertex.getX(), dyv0 = v0pos[1] - mMeanVertex.getY(), r2v0 = dxv0 * dxv0 + dyv0 * dyv0; + float rv0 = std::sqrt(r2v0); + float pt2V0 = pV0[0] * pV0[0] + pV0[1] * pV0[1], prodXYv0 = dxv0 * pV0[0] + dyv0 * pV0[1], tDCAXY = prodXYv0 / pt2V0; + if (dcaFitterEMSel.cfgApplyV0Cut && pt2V0 <= dcaFitterEMSel.mMinPt2V0) { + return; + } + registry.fill(HIST("h3bodyEMCutCounter"), 3.5); + if (dcaFitterEMSel.cfgApplyV0Cut && pV0[2] * pV0[2] / pt2V0 > dcaFitterEMSel.mMaxTgl2V0) { // tgLambda cut + return; + } + registry.fill(HIST("h3bodyEMCutCounter"), 4.5); + + float p2V0 = pt2V0 + pV0[2] * pV0[2], ptV0 = std::sqrt(pt2V0); + // apply mass selections + float p2Pos = pP[0] * pP[0] + pP[1] * pP[1] + pP[2] * pP[2], p2Neg = pN[0] * pN[0] + pN[1] * pN[1] + pN[2] * pN[2]; + bool good3bodyV0Hyp = false; + for (int ipid = 0; ipid < 2; ipid++) { + float massForLambdaHyp = mV0Hyps[ipid].calcMass(p2Pos, p2Neg, p2V0); + if (massForLambdaHyp - mV0Hyps[ipid].getMassV0Hyp() < mV0Hyps[ipid].getMargin(ptV0)) { + good3bodyV0Hyp = true; + break; + } + } + if (dcaFitterEMSel.cfgApplyV0Cut && !good3bodyV0Hyp) { + return; + } + registry.fill(HIST("h3bodyEMCutCounter"), 5.5); + + float dcaX = dxv0 - pV0[0] * tDCAXY, dcaY = dyv0 - pV0[1] * tDCAXY, dca2 = dcaX * dcaX + dcaY * dcaY; + float cosPAXY = prodXYv0 / rv0 * ptV0; + if (dcaFitterEMSel.cfgApplyV0Cut && dca2 > dcaFitterEMSel.mMaxDCAXY2ToMeanVertex3bodyV0) { + return; + } + registry.fill(HIST("h3bodyEMCutCounter"), 6.5); + // FIXME: V0 cosPA cut to be investigated + if (dcaFitterEMSel.cfgApplyV0Cut && cosPAXY < dcaFitterEMSel.minCosPAXYMeanVertex3bodyV0) { + return; + } + registry.fill(HIST("h3bodyEMCutCounter"), 7.5); + // Check: CosPA Cut of Virtual V0 may not be used since the V0 may be based on another PV + float dx = v0pos[0] - collision.posX(), dy = v0pos[1] - collision.posY(), dz = v0pos[2] - collision.posZ(), prodXYZv0 = dx * pV0[0] + dy * pV0[1] + dz * pV0[2]; + float v0CosPA = prodXYZv0 / std::sqrt((dx * dx + dy * dy + dz * dz) * p2V0); + if (dcaFitterEMSel.cfgApplyV0Cut && v0CosPA < dcaFitterEMSel.minCosPA3bodyV0) { + return; + } + registry.fill(HIST("h3bodyEMCutCounter"), 8.5); + + float r3body = std::hypot(pos[0], pos[1]); + if (r3body < 0.5) { + return; + } + registry.fill(HIST("h3bodyEMCutCounter"), 9.5); + + // Cut for the compatibility of V0 and 3body vertex + float deltaR = std::abs(rv0 - r3body); + if (deltaR > dcaFitterEMSel.maxRDiffV03body) { + return; + } + registry.fill(HIST("h3bodyEMCutCounter"), 10.5); + + float pt3B = std::hypot(p3B[0], p3B[1]); + if (pt3B < dcaFitterEMSel.minPt3Body) { // pt cut + return; + } + registry.fill(HIST("h3bodyEMCutCounter"), 11.5); + if (p3B[2] / pt3B > dcaFitterEMSel.maxTgl3Body) { // tgLambda cut + return; + } + registry.fill(HIST("h3bodyEMCutCounter"), 12.5); + + // H3L DCA Check + const auto& vertexXYZ = fitter3body.getPCACandidatePos(); + auto track3B = o2::track::TrackParCov(vertexXYZ, p3B, t2.sign()); + o2::dataformats::DCA dca; + if (!track3B.propagateToDCA({{collision.posX(), collision.posY(), collision.posZ()}, {collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()}}, fitter3body.getBz(), &dca, 5.) || + std::abs(dca.getY()) > dcaFitterEMSel.maxDCAXY3Body || std::abs(dca.getZ()) > dcaFitterEMSel.maxDCAZ3Body) { + return; + } + registry.fill(HIST("h3bodyEMCutCounter"), 13.5); + } + + VtxCandidate candVtx; candVtx.track0Id = t0.globalIndex(); candVtx.track1Id = t1.globalIndex(); candVtx.track2Id = t2.globalIndex(); @@ -818,11 +995,66 @@ struct decay3bodyBuilder { candVtx.daudcatopv[1] = Track1dca; candVtx.daudcatopv[2] = Track2dca; candVtx.bachelortofNsigma = tofNSigmaBach; - vtxCandidates.push_back(candVtx); + if (saveInTable) { + fillVtx3BodyTable(candVtx); + } else { + VtxCandidates.push_back(candVtx); + } + } + //------------------------------------------------------------------ + // event mixing + template + void doMixed3Body(TMixed3bodys decay3bodys, TBinningType binningType) + { + // Strictly upper index policy for decay3body objects binned by radius, phi + for (const auto& [decay3body0, decay3body1] : selfCombinations(binningType, dcaFitterEMSel.nUseMixed, -1, decay3bodys, decay3bodys)) { + auto tpos0 = decay3body0.template track0_as(); + auto tneg0 = decay3body0.template track1_as(); + auto tbach0 = decay3body0.template track2_as(); + auto tpos1 = decay3body1.template track0_as(); + auto tneg1 = decay3body1.template track1_as(); + auto tbach1 = decay3body1.template track2_as(); + + registry.fill(HIST("h3bodyCombinationCounter"), 0.5); + + // ---------- selections ---------- + if ((tbach0.sign() > 0 && !(tbach1.sign() > 0)) || (tbach0.sign() < 0 && !(tbach1.sign() < 0)) || tbach0.globalIndex() == tbach1.globalIndex()) { // only combine if tbach1 has correct sign and is not same as tbach0 + continue; + } + registry.fill(HIST("h3bodyCombinationCounter"), 1.5); + + if (decay3body0.collisionId() == decay3body1.collisionId()) { // only combine if from different event + continue; + } + registry.fill(HIST("h3bodyCombinationCounter"), 2.5); + + auto c0 = decay3body0.template collision_as(); + auto c1 = decay3body1.template collision_as(); + + if (dcaFitterEMSel.selectPVPosZ3bodyMixing && std::abs(c0.posZ() - c1.posZ()) > dcaFitterEMSel.maxDeltaPVPosZ3bodyMixing) { // only combine if collision similar in PV posZ + continue; + } + registry.fill(HIST("h3bodyCombinationCounter"), 3.5); + + initCCDBfromRunNumber(c0.runNumber()); + + if (dcaFitterEMSel.cfgMix3BodyMethod == 0) { // mix bachelor (deuteron) + fillVtxCand(c0, tpos0, tneg0, tbach1, -1, bachelorcharge, tbach1.tofNSigmaDe()); + fillVtxCand(c1, tpos1, tneg1, tbach0, -1, bachelorcharge, tbach0.tofNSigmaDe()); + } else if ((dcaFitterEMSel.cfgMix3BodyMethod == 1 && tbach0.sign() > 0) || (dcaFitterEMSel.cfgMix3BodyMethod == 2 && tbach0.sign() < 0)) { // mix piMinus or proton + fillVtxCand(c0, tpos0, tneg1, tbach0, -1, bachelorcharge, tbach0.tofNSigmaDe()); + fillVtxCand(c1, tpos1, tneg0, tbach1, -1, bachelorcharge, tbach1.tofNSigmaDe()); + } else if ((dcaFitterEMSel.cfgMix3BodyMethod == 1 && tbach0.sign() < 0) || (dcaFitterEMSel.cfgMix3BodyMethod == 2 && tbach0.sign() > 0)) { // mix piPlus or anti-proton + fillVtxCand(c0, tpos1, tneg0, tbach0, -1, bachelorcharge, tbach0.tofNSigmaDe()); + fillVtxCand(c1, tpos0, tneg1, tbach1, -1, bachelorcharge, tbach1.tofNSigmaDe()); + } + + VtxCandidates.clear(); + } // end decay3body combinations loop } //------------------------------------------------------------------ // fill the StoredVtx3BodyDatas table - void fillVtx3BodyTable(vtxCandidate const& candVtx) + void fillVtx3BodyTable(VtxCandidate const& candVtx) { vtx3bodydata( candVtx.track0Id, candVtx.track1Id, candVtx.track2Id, candVtx.collisionId, candVtx.decay3bodyId, @@ -1451,7 +1683,7 @@ struct decay3bodyBuilder { //------------------------------------------------------------------ void processRun3(ColwithEvTimes const& collisions, aod::Decay3Bodys const& decay3bodys, TrackExtPIDIUwithEvTimes const&, aod::BCsWithTimestamps const&) { - vtxCandidates.clear(); + VtxCandidates.clear(); registry.fill(HIST("hEventCounter"), 0.5, collisions.size()); @@ -1472,39 +1704,25 @@ struct decay3bodyBuilder { fillVtxCand(collision, t0, t1, t2, d3body.globalIndex(), bachelorcharge, tofNSigmaBach); } - - for (const auto& candVtx : vtxCandidates) { - fillVtx3BodyTable(candVtx); - } } PROCESS_SWITCH(decay3bodyBuilder, processRun3, "Produce DCA fitter decay3body tables", true); //------------------------------------------------------------------ void processRun3Reduced(aod::RedCollisions const& collisions, aod::RedDecay3Bodys const& decay3bodys, aod::RedIUTracks const&) { - vtxCandidates.clear(); + VtxCandidates.clear(); registry.fill(HIST("hEventCounter"), 0.5, collisions.size()); - int lastRunNumber = -1; - for (const auto& d3body : decay3bodys) { auto t0 = d3body.track0_as(); auto t1 = d3body.track1_as(); auto t2 = d3body.track2_as(); auto collision = d3body.collision_as(); - if (collision.runNumber() != lastRunNumber) { - initCCDBfromRunNumber(collision.runNumber()); - lastRunNumber = collision.runNumber(); // Update the last run number - LOG(debug) << "CCDB initialized for run " << lastRunNumber; - } + initCCDBfromRunNumber(collision.runNumber()); fillVtxCand(collision, t0, t1, t2, d3body.globalIndex(), bachelorcharge, t2.tofNSigmaDe()); } - - for (const auto& candVtx : vtxCandidates) { - fillVtx3BodyTable(candVtx); - } } PROCESS_SWITCH(decay3bodyBuilder, processRun3Reduced, "Produce DCA fitter decay3body tables with reduced data", false); @@ -1512,16 +1730,33 @@ struct decay3bodyBuilder { // Event-mixing background void processRun3ReducedEM(ReducedCollisionsMultsCents const& collisions, aod::RedDecay3Bodys const& decay3bodys, aod::RedIUTracks const&) { - vtxCandidates.clear(); + auto xAxis = registry.get(HIST("hEventPairs"))->GetXaxis(); + auto yAxis = registry.get(HIST("hEventPairs"))->GetYaxis(); - auto tuple = std::make_tuple(decay3bodys); - BinningType binningEvent{{axisPosZ, axisCentrality}, true}; - SameKindPair pair{binningEvent, EMTrackSel.nUseMixedEvent, -1, collisions, tuple, &cache}; + // fill collisions counter + for (const auto& collision : collisions) { + int bin_PosZ = xAxis->FindBin(collision.posZ()); + int bin_Mult = yAxis->FindBin(collision.multNTracksPV()); + registry.fill(HIST("hEventCount"), xAxis->GetBinCenter(bin_PosZ), yAxis->GetBinCenter(bin_Mult)); + } + VtxCandidates.clear(); - int lastRunNumber = -1; + auto tuple = std::make_tuple(decay3bodys); + BinningTypeColEM binningEvent{{dcaFitterEMSel.binsVtxZ, dcaFitterEMSel.binsMultiplicity}, true}; + SameKindPair pair{binningEvent, dcaFitterEMSel.nUseMixed, -1, collisions, tuple, &cache}; for (const auto& [c0, decay3bodys0, c1, decay3bodys1] : pair) { - for (auto& [d3body0, d3body1] : combinations(soa::CombinationsFullIndexPolicy(decay3bodys0, decay3bodys1))) { + // LOG(info) << "Processing event mixing with collisions " << c0.globalIndex() << " and " << c1.globalIndex(); + initCCDBfromRunNumber(c0.runNumber()); + + int bin_PosZ = xAxis->FindBin(c0.posZ()); + int bin_Mult = yAxis->FindBin(c0.multNTracksPV()); + registry.fill(HIST("hEventPairs"), xAxis->GetBinCenter(bin_PosZ), yAxis->GetBinCenter(bin_Mult)); + + for (const auto& [d3body0, d3body1] : combinations(soa::CombinationsFullIndexPolicy(decay3bodys0, decay3bodys1))) { + + registry.fill(HIST("hDecay3BodyPairsBeforeCut"), xAxis->GetBinCenter(bin_PosZ), yAxis->GetBinCenter(bin_Mult)); + auto tpos0 = d3body0.track0_as(); auto tneg0 = d3body0.track1_as(); auto tbach0 = d3body0.track2_as(); @@ -1529,32 +1764,124 @@ struct decay3bodyBuilder { auto tneg1 = d3body1.track1_as(); auto tbach1 = d3body1.track2_as(); - if (c0.runNumber() != lastRunNumber) { - initCCDBfromRunNumber(c0.runNumber()); - lastRunNumber = c0.runNumber(); // Update the last run number - LOG(debug) << "CCDB initialized for run " << lastRunNumber; + // try to fit the vertex for decay3body0 + auto Trackpos0 = getTrackParCov(tpos0); + auto Trackneg0 = getTrackParCov(tneg0); + auto Trackbach0 = getTrackParCov(tbach0); + int nVtx0 = fitter3body.process(Trackpos0, Trackneg0, Trackbach0); + if (nVtx0 == 0) { + continue; + ; } - fillVtxCand(c0, tpos0, tneg0, tbach1, -1, bachelorcharge, tbach1.tofNSigmaDe()); - if (c1.runNumber() != lastRunNumber) { - initCCDBfromRunNumber(c1.runNumber()); - lastRunNumber = c1.runNumber(); // Update the last run number - LOG(debug) << "CCDB initialized for run " << lastRunNumber; + if ((tbach0.sign() > 0 && !(tbach1.sign() > 0)) || (tbach0.sign() < 0 && !(tbach1.sign() < 0)) || tbach0.globalIndex() == tbach1.globalIndex()) { // only combine if tbach1 has correct sign and is not same as tbach0 + continue; } + + const auto& vtx0XYZ = fitter3body.getPCACandidate(); + float rVtx0 = std::hypot(vtx0XYZ[0], vtx0XYZ[1]); + registry.fill(HIST("hRadius0"), rVtx0); + + std::array ppos0 = {0.}, pneg0 = {0.}, pbach0{0.}; + const auto& propagatedtpos0 = fitter3body.getTrack(0); + const auto& propagatedtneg0 = fitter3body.getTrack(1); + const auto& propagatedtbach0 = fitter3body.getTrack(2); + propagatedtpos0.getPxPyPzGlo(ppos0); + propagatedtneg0.getPxPyPzGlo(pneg0); + propagatedtbach0.getPxPyPzGlo(pbach0); + for (int i = 0; i < 3; i++) { + pbach0[i] *= bachelorcharge; + } + std::array p3B0 = {ppos0[0] + pneg0[0] + pbach0[0], ppos0[1] + pneg0[1] + pbach0[1], ppos0[2] + pneg0[2] + pbach0[2]}; + float phiVtx0 = std::atan2(p3B0[1], p3B0[0]); + + // try to fit the vertex for decay3body1 + auto Trackpos1 = getTrackParCov(tpos1); + auto Trackneg1 = getTrackParCov(tneg1); + auto Trackbach1 = getTrackParCov(tbach1); + int nVtx1 = fitter3body.process(Trackpos1, Trackneg1, Trackbach1); + if (nVtx1 == 0) { + continue; + } + + const auto& vtx1XYZ = fitter3body.getPCACandidate(); + float rVtx1 = std::hypot(vtx1XYZ[0], vtx1XYZ[1]); + registry.fill(HIST("hRadius1"), rVtx1); + + std::array ppos1 = {0.}, pneg1 = {0.}, pbach1{0.}; + const auto& propagatedtpos1 = fitter3body.getTrack(0); + const auto& propagatedtneg1 = fitter3body.getTrack(1); + const auto& propagatedtbach1 = fitter3body.getTrack(2); + propagatedtpos1.getPxPyPzGlo(ppos1); + propagatedtneg1.getPxPyPzGlo(pneg1); + propagatedtbach1.getPxPyPzGlo(pbach1); + for (int i = 0; i < 3; i++) { + pbach1[i] *= bachelorcharge; + } + std::array p3B1 = {ppos1[0] + pneg1[0] + pbach1[0], ppos1[1] + pneg1[1] + pbach1[1], ppos1[2] + pneg1[2] + pbach1[2]}; + float phiVtx1 = std::atan2(p3B1[1], p3B1[0]); + registry.fill(HIST("hPhi0"), phiVtx0 * o2::constants::math::Rad2Deg); + registry.fill(HIST("hPhi1"), phiVtx1 * o2::constants::math::Rad2Deg); + // convert deltaPhi to range [-pi, pi] + float deltaPhi = RecoDecay::constrainAngle(phiVtx1 - phiVtx0, -o2::constants::math::PI); + // check if radius and phi of the two vertices are compatible + registry.fill(HIST("hDeltaRadius"), rVtx1 - rVtx0); + registry.fill(HIST("hDeltaPhi"), deltaPhi * o2::constants::math::Rad2Deg); + if (std::abs(deltaPhi) * o2::constants::math::Rad2Deg > dcaFitterEMSel.maxDeltaPhiColMixing || std::abs(rVtx1 - rVtx0) > dcaFitterEMSel.maxDeltaRadiusColMixing) { + continue; + } + registry.fill(HIST("hDecay3BodyPairsAfterCut"), xAxis->GetBinCenter(bin_PosZ), yAxis->GetBinCenter(bin_Mult)); + + fillVtxCand(c0, tpos0, tneg0, tbach1, -1, bachelorcharge, tbach1.tofNSigmaDe()); + // initCCDBfromRunNumber(c1.runNumber()); fillVtxCand(c1, tpos1, tneg1, tbach0, -1, bachelorcharge, tbach0.tofNSigmaDe()); } } // Aviod break of preslice in following workflow - std::sort(vtxCandidates.begin(), vtxCandidates.end(), [](const vtxCandidate a, const vtxCandidate b) { + /*std::sort(VtxCandidates.begin(), VtxCandidates.end(), [](const VtxCandidate a, const VtxCandidate b) { return a.collisionId < b.collisionId; - }); + });*/ + } + PROCESS_SWITCH(decay3bodyBuilder, processRun3ReducedEM, "Produce event-mixing background", false); - for (const auto& candVtx : vtxCandidates) { - fillVtx3BodyTable(candVtx); + void processRun3Reduced3bodyMixing(ReducedCollisionsMults const&, aod::RedIUTracks const&, soa::Join const& decay3bodys) + { + VtxCandidates.clear(); + + auto xAxis = registry.get(HIST("hDecay3BodyRadiusPhi"))->GetXaxis(); + auto yAxis = registry.get(HIST("hDecay3BodyRadiusPhi"))->GetYaxis(); + + for (const auto& decay3body : decay3bodys) { + int bin_Radius = xAxis->FindBin(decay3body.svRadius()); + int bin_Phi = yAxis->FindBin(decay3body.momPhi()); + registry.fill(HIST("hDecay3BodyRadiusPhi"), xAxis->GetBinCenter(bin_Radius), yAxis->GetBinCenter(bin_Phi)); + registry.fill(HIST("hDecay3BodyPosZ"), decay3body.svPosZ()); } + + Binning3BodyDCAFitter binningOnRadiusPhi{{dcaFitterEMSel.bins3BodyRadius, dcaFitterEMSel.bins3BodyPhiDegree}, true}; + doMixed3Body(decay3bodys, binningOnRadiusPhi); + } + PROCESS_SWITCH(decay3bodyBuilder, processRun3Reduced3bodyMixing, "Produce mixing background directly from mixed decay3bodys based on DCAFitter Info", false); + + void processRun3Reduced3bodyMixingKFInfo(ReducedCollisionsMults const&, aod::RedIUTracks const&, soa::Join const& decay3bodys) + { + VtxCandidates.clear(); + + auto xAxis = registry.get(HIST("hDecay3BodyRadiusPhi"))->GetXaxis(); + auto yAxis = registry.get(HIST("hDecay3BodyRadiusPhi"))->GetYaxis(); + + for (const auto& decay3body : decay3bodys) { + int bin_Radius = xAxis->FindBin(decay3body.radius()); + int bin_Phi = yAxis->FindBin(decay3body.phi()); + registry.fill(HIST("hDecay3BodyRadiusPhi"), xAxis->GetBinCenter(bin_Radius), yAxis->GetBinCenter(bin_Phi)); + registry.fill(HIST("hDecay3BodyPosZ"), decay3body.posz()); + } + + Binning3BodyKFInfo binningOnRadiusPhi{{dcaFitterEMSel.bins3BodyRadius, dcaFitterEMSel.bins3BodyPhi}, true}; + doMixed3Body(decay3bodys, binningOnRadiusPhi); } - PROCESS_SWITCH(decay3bodyBuilder, processRun3ReducedEM, "Produce event-mix background", false); + PROCESS_SWITCH(decay3bodyBuilder, processRun3Reduced3bodyMixingKFInfo, "Produce mixing background directly from mixed decay3bodys based on KF Info", false); //------------------------------------------------------------------ void processRun3withKFParticle(ColwithEvTimes const& collisions, TrackExtPIDIUwithEvTimes const&, aod::Decay3Bodys const& decay3bodys, aod::BCsWithTimestamps const&) @@ -1861,7 +2188,7 @@ struct decay3bodyBuilder { // build link from decay3body -> vtx3body struct decay3bodyDataLinkBuilder { - Produces vtxdataLink; + Produces VtxDataLink; void init(InitContext const&) {} @@ -1878,7 +2205,7 @@ struct decay3bodyDataLinkBuilder { } } for (int ii = 0; ii < decay3bodytable.size(); ii++) { - vtxdataLink(lIndices[ii]); + VtxDataLink(lIndices[ii]); } } diff --git a/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx b/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx index 93ca8a26990..0067195e9e7 100644 --- a/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx +++ b/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx @@ -18,12 +18,14 @@ #include #include #include +#include #include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "Framework/ASoAHelpers.h" +#include "DCAFitter/DCAFitterN.h" #include "ReconstructionDataFormats/Track.h" #include "Common/Core/trackUtilities.h" #include "Common/DataModel/Multiplicity.h" @@ -76,11 +78,13 @@ struct reduced3bodyCreator { Produces reducedDecay3Bodys; Produces reduced3BodyInfo; Produces reducedFullTracksPIDIU; + Produces dcaFitterSVInfo; Service ccdb; Zorro zorro; OutputObj zorroSummary{"zorroSummary"}; + o2::vertexing::DCAFitterN<3> fitter3body; o2::aod::pidtofgeneric::TofPidNewCollision bachelorTOFPID; Configurable event_sel8_selection{"event_sel8_selection", true, "event selection count post sel8 cut"}; @@ -102,6 +106,7 @@ struct reduced3bodyCreator { Configurable cfgSkimmedProcessing{"cfgSkimmedProcessing", false, "Skimmed dataset processing"}; // Flag for trigger Configurable cfgOnlyKeepH3L3Body{"cfgOnlyKeepH3L3Body", false, "Flag to keep only H3L3Body trigger"}; + Configurable cfgMaterialCorrection{"cfgMaterialCorrection", static_cast(o2::base::Propagator::MatCorrType::USEMatCorrNONE), "Type of material correction for DCAFitter"}; int mRunNumber; float d_bz; @@ -120,6 +125,16 @@ struct reduced3bodyCreator { ccdb->setLocalObjectValidityChecking(); ccdb->setFatalWhenNull(false); + fitter3body.setPropagateToPCA(true); + fitter3body.setMaxR(200.); //->maxRIni3body + fitter3body.setMinParamChange(1e-3); + fitter3body.setMinRelChi2Change(0.9); + fitter3body.setMaxDZIni(1e9); + fitter3body.setMaxChi2(1e9); + fitter3body.setUseAbsDCA(true); + int mat{static_cast(cfgMaterialCorrection)}; + fitter3body.setMatCorrType(static_cast(mat)); + registry.add("hAllSelEventsVtxZ", "hAllSelEventsVtxZ", HistType::kTH1F, {{500, -15.0f, 15.0f, "PV Z (cm)"}}); auto hEventCounter = registry.add("hEventCounter", "hEventCounter", HistType::kTH1D, {{4, 0.0f, 4.0f}}); @@ -129,7 +144,7 @@ struct reduced3bodyCreator { hEventCounter->GetXaxis()->SetBinLabel(4, "reduced"); hEventCounter->LabelsOption("v"); - auto hEventCounterZorro = registry.add("hEventCounterZorro", "hEventCounterZorro", HistType::kTH1D, {{2, -0.5, 1.5}}); + auto hEventCounterZorro = registry.add("hEventCounterZorro", "hEventCounterZorro", HistType::kTH1D, {{2, 0, 2}}); hEventCounterZorro->GetXaxis()->SetBinLabel(1, "Zorro before evsel"); hEventCounterZorro->GetXaxis()->SetBinLabel(2, "Zorro after evsel"); } @@ -233,6 +248,7 @@ struct reduced3bodyCreator { } } + fitter3body.setBz(d_bz); bachelorTOFPID.SetParams(mRespParamsV2); } @@ -281,6 +297,7 @@ struct reduced3bodyCreator { void process(ColwithEvTimesMultsCents const& collisions, TrackExtPIDIUwithEvTimes const&, aod::Decay3Bodys const& decay3bodys, aod::BCsWithTimestamps const&) { + std::vector triggeredCollisions(collisions.size(), false); int lastRunNumber = -1; // RunNumber of last collision, used for zorro counting // Event counting @@ -298,6 +315,7 @@ struct reduced3bodyCreator { isZorroSelected = zorro.isSelected(bc.globalBC()); if (isZorroSelected) { registry.fill(HIST("hEventCounterZorro"), 0.5); + triggeredCollisions[collision.globalIndex()] = true; } } @@ -334,10 +352,8 @@ struct reduced3bodyCreator { auto bc = collision.bc_as(); initCCDB(bc); - bool isZorroSelected = false; if (cfgSkimmedProcessing && cfgOnlyKeepH3L3Body) { - isZorroSelected = zorro.isSelected(bc.globalBC()); - if (!isZorroSelected) { + if (triggeredCollisions[collision.globalIndex()] == false) { continue; } } @@ -404,6 +420,29 @@ struct reduced3bodyCreator { KFHt.GetPhi(phi, sigma); // fill 3body info table reduced3BodyInfo(radius, phi, KFHt.GetZ()); + + // -------- save dcaFitter secondary vertex info table -------- + auto Track0 = getTrackParCov(daughter0); + auto Track1 = getTrackParCov(daughter1); + auto Track2 = getTrackParCov(daughter2); + int n3bodyVtx = fitter3body.process(Track0, Track1, Track2); + if (n3bodyVtx == 0) { // discard this pair + dcaFitterSVInfo(-999, -999, -999); + } else { + const auto& vtxXYZ = fitter3body.getPCACandidate(); + + std::array p0 = {0.}, p1 = {0.}, p2{0.}; + const auto& propagatedTrack0 = fitter3body.getTrack(0); + const auto& propagatedTrack1 = fitter3body.getTrack(1); + const auto& propagatedTrack2 = fitter3body.getTrack(2); + propagatedTrack0.getPxPyPzGlo(p0); + propagatedTrack1.getPxPyPzGlo(p1); + propagatedTrack2.getPxPyPzGlo(p2); + std::array p3B = {p0[0] + p1[0] + p2[0], p0[1] + p1[1] + p2[1], p0[2] + p1[2] + p2[2]}; + float phiVtx = std::atan2(p3B[1], p3B[0]); + float rVtx = std::hypot(vtxXYZ[0], vtxXYZ[1]); + dcaFitterSVInfo(rVtx, phiVtx, vtxXYZ[2]); + } } // end decay3body loop registry.fill(HIST("hEventCounter"), 3.5, reducedCollisions.lastIndex() + 1); diff --git a/PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx b/PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx index d1e7b769b63..c847730a795 100644 --- a/PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx +++ b/PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx @@ -99,7 +99,7 @@ struct ThreebodyRecoTask { OutputObj zorroSummary{"zorroSummary"}; //------------------------------------------------------------------ - Preslice perCollisionVtx3BodyDatas = o2::aod::vtx3body::collisionId; + PresliceUnsorted perCollisionVtx3BodyDatas = o2::aod::vtx3body::collisionId; // Configuration to enable like-sign analysis Configurable cfgLikeSignAnalysis{"cfgLikeSignAnalysis", false, "Enable like-sign analysis"}; From 17bf61ef7b302f9920dc4f7c05480f595c8a94e1 Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Fri, 14 Mar 2025 23:39:07 +0800 Subject: [PATCH 0658/1650] [PWGCF] use narrow pT for track density correction (#10476) --- PWGCF/Flow/Tasks/flowQa.cxx | 39 +++++++++------------ PWGCF/Flow/Tasks/flowTask.cxx | 66 +++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 22 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowQa.cxx b/PWGCF/Flow/Tasks/flowQa.cxx index 8c186b3e47d..d540f3dffa5 100644 --- a/PWGCF/Flow/Tasks/flowQa.cxx +++ b/PWGCF/Flow/Tasks/flowQa.cxx @@ -95,8 +95,8 @@ struct FlowQa { O2_DEFINE_CONFIGURABLE(cfgCutOccupancyHigh, int, 500, "High cut on TPC occupancy") O2_DEFINE_CONFIGURABLE(cfgCutOccupancyLow, int, 0, "Low cut on TPC occupancy") O2_DEFINE_CONFIGURABLE(cfgUseSmallMemory, bool, false, "Use small memory mode") - O2_DEFINE_CONFIGURABLE(cfgUseEPcorrection, bool, false, "Use event plane efficiency correction") - O2_DEFINE_CONFIGURABLE(cfgUseEPEffSlopeFactor, float, 1.0f, "A factor to scale the EP efficiency slope") + O2_DEFINE_CONFIGURABLE(cfgTrackDensityCorrUse, bool, false, "Use track density efficiency correction") + O2_DEFINE_CONFIGURABLE(cfgTrackDensityCorrSlopeFactor, float, 1.0f, "A factor to scale the track density efficiency slope") Configurable> cfgUserDefineGFWCorr{"cfgUserDefineGFWCorr", std::vector{"refN02 {2} refP02 {-2}", "refN12 {2} refP12 {-2}"}, "User defined GFW CorrelatorConfig"}; Configurable> cfgUserDefineGFWName{"cfgUserDefineGFWName", std::vector{"Ch02Gap22", "Ch12Gap22"}, "User defined GFW Name"}; Configurable> cfgRunRemoveList{"cfgRunRemoveList", std::vector{-1}, "excluded run numbers"}; @@ -237,6 +237,7 @@ struct FlowQa { // Track QA registry.add("hPhi", "#phi distribution", {HistType::kTH1D, {axisPhi}}); registry.add("hPhiWeighted", "corrected #phi distribution", {HistType::kTH1D, {axisPhi}}); + registry.add("hPhiWeightedTrDen", "corrected #phi distribution, considering track density", {HistType::kTH1D, {axisPhi}}); registry.add("hEta", "#eta distribution", {HistType::kTH1D, {axisEta}}); registry.add("hPt", "p_{T} distribution before cut", {HistType::kTH1D, {axisPtHist}}); registry.add("hPtRef", "p_{T} distribution after cut", {HistType::kTH1D, {axisPtHist}}); @@ -364,23 +365,16 @@ struct FlowQa { } fGFW->CreateRegions(); - if (cfgUseEPcorrection) { - hFindPtBin = new TH1D("hFindPtBin", "hFindPtBin", 7, 0.2, 3.0); - funcEff.resize(7); - funcEff[0] = new TF1("funcEff0", "[0]+[1]*x", 0, 3000); - funcEff[0]->SetParameters(0.736274, -2.26721e-05 * cfgUseEPEffSlopeFactor); - funcEff[1] = new TF1("funcEff1", "[0]+[1]*x", 0, 3000); - funcEff[1]->SetParameters(0.773396, -2.79496e-05 * cfgUseEPEffSlopeFactor); - funcEff[2] = new TF1("funcEff2", "[0]+[1]*x", 0, 3000); - funcEff[2]->SetParameters(0.792831, -2.69748e-05 * cfgUseEPEffSlopeFactor); - funcEff[3] = new TF1("funcEff3", "[0]+[1]*x", 0, 3000); - funcEff[3]->SetParameters(0.808402, -2.48438e-05 * cfgUseEPEffSlopeFactor); - funcEff[4] = new TF1("funcEff4", "[0]+[1]*x", 0, 3000); - funcEff[4]->SetParameters(0.817907, -2.31138e-05 * cfgUseEPEffSlopeFactor); - funcEff[5] = new TF1("funcEff5", "[0]+[1]*x", 0, 3000); - funcEff[5]->SetParameters(0.82473, -2.20517e-05 * cfgUseEPEffSlopeFactor); - funcEff[6] = new TF1("funcEff6", "[0]+[1]*x", 0, 3000); - funcEff[6]->SetParameters(0.829151, -2.0758e-05 * cfgUseEPEffSlopeFactor); + if (cfgTrackDensityCorrUse) { + std::vector pTEffBins = {0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.4, 1.8, 2.2, 2.6, 3.0}; + hFindPtBin = new TH1D("hFindPtBin", "hFindPtBin", pTEffBins.size() - 1, &pTEffBins[0]); + funcEff.resize(pTEffBins.size() - 1); + std::vector f1p0 = {0.713412, 0.73259, 0.749925, 0.760693, 0.767321, 0.772874, 0.777889, 0.782172, 0.792831, 0.808402, 0.817907, 0.82473, 0.829151}; + std::vector f1p1 = {-2.15831e-05, -2.19538e-05, -2.2958e-05, -2.55123e-05, -2.75207e-05, -2.81486e-05, -2.839e-05, -2.83713e-05, -2.69748e-05, -2.48438e-05, -2.31138e-05, -2.20517e-05, -2.0758e-05}; + for (uint ifunc = 0; ifunc < pTEffBins.size() - 1; ifunc++) { + funcEff[ifunc] = new TF1(Form("funcEff%i", ifunc), "[0]+[1]*x", 0, 3000); + funcEff[ifunc]->SetParameters(f1p0[ifunc], f1p1[ifunc] * cfgTrackDensityCorrSlopeFactor); + } funcV2 = new TF1("funcV2", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); funcV2->SetParameters(0.0186111, 0.00351907, -4.38264e-05, 1.35383e-07, -3.96266e-10); funcV3 = new TF1("funcV3", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); @@ -706,7 +700,7 @@ struct FlowQa { double psi2Est = 0, psi3Est = 0, psi4Est = 0; float wEPeff = 1; double v2 = 0, v3 = 0, v4 = 0; - if (cfgUseEPcorrection) { + if (cfgTrackDensityCorrUse) { double q2x = 0, q2y = 0; double q3x = 0, q3y = 0; double q4x = 0, q4y = 0; @@ -744,15 +738,16 @@ struct FlowQa { } if (!setCurrentParticleWeights(weff, wacc, track.phi(), track.eta(), track.pt(), vtxz)) continue; - if (cfgUseEPcorrection && withinPtRef) { + if (cfgTrackDensityCorrUse && withinPtRef) { double fphi = v2 * std::cos(2 * (track.phi() - psi2Est)) + v3 * std::cos(3 * (track.phi() - psi3Est)) + v4 * std::cos(4 * (track.phi() - psi4Est)); fphi = (1 + 2 * fphi); int pTBinForEff = hFindPtBin->FindBin(track.pt()); - if (pTBinForEff >= 1 && pTBinForEff <= 7) { + if (pTBinForEff >= 1 && pTBinForEff <= hFindPtBin->GetNbinsX()) { wEPeff = funcEff[pTBinForEff - 1]->Eval(fphi * tracks.size()); if (wEPeff > 0.) { wEPeff = 1. / wEPeff; weff *= wEPeff; + registry.fill(HIST("hPhiWeightedTrDen"), track.phi(), wacc * wEPeff); } } } diff --git a/PWGCF/Flow/Tasks/flowTask.cxx b/PWGCF/Flow/Tasks/flowTask.cxx index 2c3c094cdac..34f244d842f 100644 --- a/PWGCF/Flow/Tasks/flowTask.cxx +++ b/PWGCF/Flow/Tasks/flowTask.cxx @@ -97,6 +97,7 @@ struct FlowTask { O2_DEFINE_CONFIGURABLE(cfgCutOccupancyHigh, int, 500, "High cut on TPC occupancy") O2_DEFINE_CONFIGURABLE(cfgCutOccupancyLow, int, 0, "Low cut on TPC occupancy") O2_DEFINE_CONFIGURABLE(cfgUseSmallMemory, bool, false, "Use small memory mode") + O2_DEFINE_CONFIGURABLE(cfgTrackDensityCorrUse, bool, false, "Use track density efficiency correction") Configurable> cfgUserDefineGFWCorr{"cfgUserDefineGFWCorr", std::vector{"refN02 {2} refP02 {-2}", "refN12 {2} refP12 {-2}"}, "User defined GFW CorrelatorConfig"}; Configurable> cfgUserDefineGFWName{"cfgUserDefineGFWName", std::vector{"Ch02Gap22", "Ch12Gap22"}, "User defined GFW Name"}; Configurable> cfgRunRemoveList{"cfgRunRemoveList", std::vector{-1}, "excluded run numbers"}; @@ -147,6 +148,13 @@ struct FlowTask { ctpRateFetcher mRateFetcher; TH2* gCurrentHadronicRate; + // phi-EP correction + std::vector funcEff; + TH1D* hFindPtBin; + TF1* funcV2; + TF1* funcV3; + TF1* funcV4; + using AodCollisions = soa::Filtered>; using AodTracks = soa::Filtered>; @@ -419,6 +427,24 @@ struct FlowTask { fT0AV0ASigma->SetParameters(463.4144, 6.796509e-02, -9.097136e-07, 7.971088e-12, -2.600581e-17); } + if (cfgTrackDensityCorrUse) { + std::vector pTEffBins = {0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.4, 1.8, 2.2, 2.6, 3.0}; + hFindPtBin = new TH1D("hFindPtBin", "hFindPtBin", pTEffBins.size() - 1, &pTEffBins[0]); + funcEff.resize(pTEffBins.size() - 1); + std::vector f1p0 = {0.713412, 0.73259, 0.749925, 0.760693, 0.767321, 0.772874, 0.777889, 0.782172, 0.792831, 0.808402, 0.817907, 0.82473, 0.829151}; + std::vector f1p1 = {-2.15831e-05, -2.19538e-05, -2.2958e-05, -2.55123e-05, -2.75207e-05, -2.81486e-05, -2.839e-05, -2.83713e-05, -2.69748e-05, -2.48438e-05, -2.31138e-05, -2.20517e-05, -2.0758e-05}; + for (uint ifunc = 0; ifunc < pTEffBins.size() - 1; ifunc++) { + funcEff[ifunc] = new TF1(Form("funcEff%i", ifunc), "[0]+[1]*x", 0, 3000); + funcEff[ifunc]->SetParameters(f1p0[ifunc], f1p1[ifunc]); + } + funcV2 = new TF1("funcV2", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); + funcV2->SetParameters(0.0186111, 0.00351907, -4.38264e-05, 1.35383e-07, -3.96266e-10); + funcV3 = new TF1("funcV3", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); + funcV3->SetParameters(0.0174056, 0.000703329, -1.45044e-05, 1.91991e-07, -1.62137e-09); + funcV4 = new TF1("funcV4", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); + funcV4->SetParameters(0.008845, 0.000259668, -3.24435e-06, 4.54837e-08, -6.01825e-10); + } + myTrackSel = getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibAny, TrackSelection::GlobalTrackRun3DCAxyCut::Default); myTrackSel.SetMinNClustersTPC(cfgCutTPCclu); myTrackSel.SetMinNClustersITS(cfgCutITSclu); @@ -734,6 +760,34 @@ struct FlowTask { if (cfgUseNch) independent = static_cast(tracks.size()); + double psi2Est = 0, psi3Est = 0, psi4Est = 0; + float wEPeff = 1; + double v2 = 0, v3 = 0, v4 = 0; + // be cautious, this only works for Pb-Pb + // esimate the Event plane and vn for this event + if (cfgTrackDensityCorrUse) { + double q2x = 0, q2y = 0; + double q3x = 0, q3y = 0; + double q4x = 0, q4y = 0; + for (const auto& track : tracks) { + bool withinPtRef = (cfgCutPtRefMin < track.pt()) && (track.pt() < cfgCutPtRefMax); // within RF pT rang + if (withinPtRef) { + q2x += std::cos(2 * track.phi()); + q2y += std::sin(2 * track.phi()); + q3x += std::cos(3 * track.phi()); + q3y += std::sin(3 * track.phi()); + q4x += std::cos(4 * track.phi()); + q4y += std::sin(4 * track.phi()); + } + } + psi2Est = std::atan2(q2y, q2x) / 2.; + psi3Est = std::atan2(q3y, q3x) / 3.; + psi4Est = std::atan2(q4y, q4x) / 4.; + v2 = funcV2->Eval(cent); + v3 = funcV3->Eval(cent); + v4 = funcV4->Eval(cent); + } + for (const auto& track : tracks) { if (!trackSelected(track)) continue; @@ -749,6 +803,18 @@ struct FlowTask { } if (!setCurrentParticleWeights(weff, wacc, track.phi(), track.eta(), track.pt(), vtxz)) continue; + if (cfgTrackDensityCorrUse && withinPtRef) { + double fphi = v2 * std::cos(2 * (track.phi() - psi2Est)) + v3 * std::cos(3 * (track.phi() - psi3Est)) + v4 * std::cos(4 * (track.phi() - psi4Est)); + fphi = (1 + 2 * fphi); + int pTBinForEff = hFindPtBin->FindBin(track.pt()); + if (pTBinForEff >= 1 && pTBinForEff <= hFindPtBin->GetNbinsX()) { + wEPeff = funcEff[pTBinForEff - 1]->Eval(fphi * tracks.size()); + if (wEPeff > 0.) { + wEPeff = 1. / wEPeff; + weff *= wEPeff; + } + } + } registry.fill(HIST("hPt"), track.pt()); if (withinPtRef) { registry.fill(HIST("hPhi"), track.phi()); From fb5999cd2f6b7fd8f8754a0ca0743550f0b10bb4 Mon Sep 17 00:00:00 2001 From: basiach <74355517+basiach@users.noreply.github.com> Date: Fri, 14 Mar 2025 16:40:57 +0100 Subject: [PATCH 0659/1650] [PWGCF] FemtoUniverse - Adding a TOF nSigma cut on cascade daughters (#10458) Co-authored-by: Barbara Chytla Co-authored-by: ALICE Action Bot --- .../Core/FemtoUniverseCascadeSelection.h | 4 --- .../femtoUniverseProducerTask.cxx | 9 ++++--- ...toUniversePairTaskTrackCascadeExtended.cxx | 26 +++++++++++++++++++ 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseCascadeSelection.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseCascadeSelection.h index 26bad42b780..566323d078e 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseCascadeSelection.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseCascadeSelection.h @@ -428,7 +428,6 @@ bool FemtoUniverseCascadeSelection::isSelectedMinimal(Col const& col, Casc const const float dcav0topv = cascade.dcav0topv(col.posX(), col.posY(), col.posZ()); const float invMassLambda = cascade.mLambda(); const float invMass = isCascOmega ? cascade.mOmega() : cascade.mXi(); - const float nSigmaPIDMax = bachTrackSel.getSigmaPIDMax(); if (invMassLambda < fV0InvMassLowLimit || invMassLambda > fV0InvMassUpLimit) { return false; @@ -500,9 +499,6 @@ bool FemtoUniverseCascadeSelection::isSelectedMinimal(Col const& col, Casc const if (!negDaughTrack.isSelectedMinimal(negTrack)) { return false; } - if (bachTrack.hasTOF() && ((isCascOmega && bachTrack.tofNSigmaKa() > nSigmaPIDMax) || (!isCascOmega && bachTrack.tofNSigmaPi() > nSigmaPIDMax))) { - return false; - } if (!bachTrackSel.isSelectedMinimal(bachTrack)) { return false; } diff --git a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx index 7ec37221f64..32f256aa2dc 100644 --- a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx +++ b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx @@ -1183,6 +1183,7 @@ struct FemtoUniverseProducerTask { childIDs[0] = rowInPrimaryTrackTablePos; // pos childIDs[1] = 0; // neg childIDs[2] = 0; // bachelor + float hasTOF = posTrackCasc.hasTOF() ? 1 : 0; outputCascParts(outputCollision.lastIndex(), casc.positivept(), casc.positiveeta(), @@ -1190,7 +1191,7 @@ struct FemtoUniverseProducerTask { aod::femtouniverseparticle::ParticleType::kV0Child, 0, // cutContainerV0.at(femto_universe_v0_selection::V0ContainerPosition::kPosCuts), 0, // cutContainerV0.at(femto_universe_v0_selection::V0ContainerPosition::kPosPID), - 0., + hasTOF, childIDs, 0, 0, @@ -1214,6 +1215,7 @@ struct FemtoUniverseProducerTask { childIDs[0] = 0; // pos childIDs[1] = rowInPrimaryTrackTableNeg; // neg childIDs[2] = 0; // bachelor + hasTOF = negTrackCasc.hasTOF() ? 1 : 0; outputCascParts(outputCollision.lastIndex(), casc.negativept(), casc.negativeeta(), @@ -1221,7 +1223,7 @@ struct FemtoUniverseProducerTask { aod::femtouniverseparticle::ParticleType::kV0Child, 0, // cutContainerV0.at(femto_universe_v0_selection::V0ContainerPosition::kNegCuts), 0, // cutContainerV0.at(femto_universe_v0_selection::V0ContainerPosition::kNegPID), - 0., + hasTOF, childIDs, 0, 0, @@ -1246,6 +1248,7 @@ struct FemtoUniverseProducerTask { childIDs[0] = 0; // pos childIDs[1] = 0; // neg childIDs[2] = rowInPrimaryTrackTableBach; // bachelor + hasTOF = bachTrackCasc.hasTOF() ? 1 : 0; outputCascParts(outputCollision.lastIndex(), casc.bachelorpt(), casc.bacheloreta(), @@ -1253,7 +1256,7 @@ struct FemtoUniverseProducerTask { aod::femtouniverseparticle::ParticleType::kCascadeBachelor, 0, // cutContainerV0.at(femto_universe_v0_selection::V0ContainerPosition::kNegCuts), 0, // cutContainerV0.at(femto_universe_v0_selection::V0ContainerPosition::kNegPID), - 0., + hasTOF, childIDs, 0, 0, diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx index 86ef57cef3f..6d4bb3dbfad 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx @@ -80,6 +80,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/st Configurable confLPtPart2{"ConfLPtPart2", 0.3f, "lower limit for pt of particle 2"}; Configurable confmom{"Confmom", 0.75, "momentum threshold for particle identification using TOF"}; Configurable confNsigmaTPCParticle{"ConfNsigmaTPCParticle", 3.0, "TPC Sigma for particle momentum < Confmom"}; + Configurable confNsigmaTOFParticle{"ConfNsigmaTOFParticle", 3.0, "TOF Sigma for particle momentum > Confmom"}; Configurable confNsigmaCombinedParticle{"ConfNsigmaCombinedParticle", 3.0, "TPC and TOF Sigma (combined) for particle momentum > Confmom"}; ConfigurableAxis confkstarBins{"ConfkstarBins", {1500, 0., 6.}, "binning kstar"}; @@ -160,6 +161,20 @@ struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/st } } + bool isNSigmaTOF(float mom, float nsigmaTOFParticle, float hasTOF) + { + // Cut only on tracks, that have TOF signal + if (mom > confmom && hasTOF == 1) { + if (std::abs(nsigmaTOFParticle) < confNsigmaTOFParticle) { + return true; + } else { + return false; + } + } else { + return true; + } + } + bool isNSigmaCombined(float mom, float nsigmaTPCParticle, float nsigmaTOFParticle) { if (mom <= confmom) { @@ -177,6 +192,14 @@ struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/st return isNSigmaTPC(tpcNSigmas[id]); } + template + bool isParticleTOF(const T& part, int id) + { + const float tofNSigmas[3] = {unPackInTable(part.tofNSigmaStorePr()), unPackInTable(part.tofNSigmaStorePi()), unPackInTable(part.tofNSigmaStoreKa())}; + + return isNSigmaTOF(part.p(), tofNSigmas[id], part.tempFitVar()); + } + template bool isParticleCombined(const T& part, int id) { @@ -346,6 +369,9 @@ struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/st if (!isParticleTPC(posChild, CascChildTable[confCascType1][0]) || !isParticleTPC(negChild, CascChildTable[confCascType1][1]) || !isParticleTPC(bachelor, CascChildTable[confCascType1][2])) continue; + if (!isParticleTOF(posChild, CascChildTable[confCascType1][0]) || !isParticleTOF(negChild, CascChildTable[confCascType1][1]) || !isParticleTOF(bachelor, CascChildTable[confCascType1][2])) + continue; + posChildHistos.fillQA(posChild); negChildHistos.fillQA(negChild); bachHistos.fillQABase(bachelor, HIST("hBachelor")); From 9e3d7ed8633479ff888b6bd360a2a77c7b2ecc3b Mon Sep 17 00:00:00 2001 From: aimeric-landou <46970521+aimeric-landou@users.noreply.github.com> Date: Fri, 14 Mar 2025 16:52:56 +0100 Subject: [PATCH 0660/1650] [PWGJE] jetspectraCharged and jetBackgroundAnalysis updates (#10456) --- PWGJE/Tasks/jetBackgroundAnalysis.cxx | 21 ++++++---- PWGJE/Tasks/jetSpectraCharged.cxx | 55 +++++++++++++++------------ 2 files changed, 45 insertions(+), 31 deletions(-) diff --git a/PWGJE/Tasks/jetBackgroundAnalysis.cxx b/PWGJE/Tasks/jetBackgroundAnalysis.cxx index 75ed414d205..ac6e1430d76 100644 --- a/PWGJE/Tasks/jetBackgroundAnalysis.cxx +++ b/PWGJE/Tasks/jetBackgroundAnalysis.cxx @@ -55,6 +55,7 @@ struct JetBackgroundAnalysisTask { Configurable centralityMax{"centralityMax", 999.0, "maximum centrality for collisions"}; Configurable trackOccupancyInTimeRangeMax{"trackOccupancyInTimeRangeMax", 999999, "maximum track occupancy of collisions in neighbouring collisions in a given time range; only applied to reconstructed collisions (data and mcd jets), not mc collisions (mcp jets)"}; Configurable trackOccupancyInTimeRangeMin{"trackOccupancyInTimeRangeMin", -999999, "minimum track occupancy of collisions in neighbouring collisions in a given time range; only applied to reconstructed collisions (data and mcd jets), not mc collisions (mcp jets)"}; + Configurable skipMBGapEvents{"skipMBGapEvents", false, "flag to choose to reject min. bias gap events"}; Configurable trackEtaMin{"trackEtaMin", -0.9, "minimum eta acceptance for tracks"}; Configurable trackEtaMax{"trackEtaMax", 0.9, "maximum eta acceptance for tracks"}; @@ -114,12 +115,6 @@ struct JetBackgroundAnalysisTask { template void bkgFluctuationsRandomCone(TCollisions const& collision, TJets const& jets, TTracks const& tracks) { - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { - return; - } - if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { - return; - } TRandom3 randomNumber(0); float randomConeEta = randomNumber.Uniform(trackEtaMin + randomConeR, trackEtaMax - randomConeR); float randomConePhi = randomNumber.Uniform(0.0, 2 * M_PI); @@ -201,7 +196,7 @@ struct JetBackgroundAnalysisTask { void processRho(soa::Filtered>::iterator const& collision, soa::Filtered const& tracks) { - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { return; } if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { @@ -223,12 +218,24 @@ struct JetBackgroundAnalysisTask { void processBkgFluctuationsData(soa::Filtered>::iterator const& collision, soa::Join const& jets, soa::Filtered const& tracks) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { + return; + } + if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { + return; + } bkgFluctuationsRandomCone(collision, jets, tracks); } PROCESS_SWITCH(JetBackgroundAnalysisTask, processBkgFluctuationsData, "QA for random cone estimation of background fluctuations in data", false); void processBkgFluctuationsMCD(soa::Filtered>::iterator const& collision, soa::Join const& jets, soa::Filtered const& tracks) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { + return; + } + if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { + return; + } bkgFluctuationsRandomCone(collision, jets, tracks); } PROCESS_SWITCH(JetBackgroundAnalysisTask, processBkgFluctuationsMCD, "QA for random cone estimation of background fluctuations in mcd", false); diff --git a/PWGJE/Tasks/jetSpectraCharged.cxx b/PWGJE/Tasks/jetSpectraCharged.cxx index e3b5c7d454b..afcdbf31ea2 100644 --- a/PWGJE/Tasks/jetSpectraCharged.cxx +++ b/PWGJE/Tasks/jetSpectraCharged.cxx @@ -82,6 +82,8 @@ struct JetSpectraCharged { Configurable checkPtMatched{"checkPtMatched", false, "0: turn off pT matching, 1: do pT matching"}; Configurable checkGeoPtMatched{"checkGeoPtMatched", false, "0: turn off geometry and pT matching, 1: do geometry and pT matching"}; Configurable acceptSplitCollisions{"acceptSplitCollisions", 0, "0: only look at mcCollisions that are not split; 1: accept split mcCollisions, 2: accept split mcCollisions but only look at the first reco collision associated with it"}; + Configurable skipMBGapEvents{"skipMBGapEvents", false, "flag to choose to reject min. bias gap events; jet-level rejection can also be applied at the jet finder level for jets only, here rejection is applied for collision and track process functions for the first time, and on jets in case it was set to false at the jet finder level"}; + Configurable checkLeadConstituentMinPtForMcpJets{"checkLeadConstituentMinPtForMcpJets", false, "flag to choose whether particle level jets should have their lead track pt above leadingConstituentPtMin to be accepted; off by default, as leadingConstituentPtMin cut is only applied on MCD jets for the Pb-Pb analysis using pp MC anchored to Pb-Pb for the response matrix"}; std::vector eventSelectionBits; int trackSelection = -1; @@ -237,9 +239,8 @@ struct JetSpectraCharged { Preslice mcdjetsPerJCollision = o2::aod::jet::collisionId; template - bool isAcceptedJet(TJets const& jet) + bool isAcceptedJet(TJets const& jet, bool mcLevelIsParticleLevel = false) { - if (jetAreaFractionMin > -98.0) { if (jet.area() < jetAreaFractionMin * o2::constants::math::PI * (jet.r() / 100.0) * (jet.r() / 100.0)) { return false; @@ -259,7 +260,7 @@ struct JetSpectraCharged { for (const auto& constituent : jet.template tracks_as()) { double pt = constituent.pt(); - if (checkConstituentMinPt && pt >= leadingConstituentPtMin) { + if ((!checkLeadConstituentMinPtForMcpJets && mcLevelIsParticleLevel) || (checkConstituentMinPt && pt >= leadingConstituentPtMin)) { // if the jet is mcp level and checkLeadConstituentMinPtForMcpJets is true, then the pt of the leading track of that jet does not need to be below the defined leadingConstituentPtMin cut isMinLeadingConstituent = true; } if (checkConstituentMaxPt && pt > leadingConstituentPtMax) { @@ -464,7 +465,7 @@ struct JetSpectraCharged { void processQC(soa::Filtered::iterator const& collision, soa::Filtered> const& tracks) { - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { return; } if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { @@ -484,7 +485,7 @@ struct JetSpectraCharged { soa::Filtered> const& tracks) { float eventWeight = collision.mcCollision().weight(); - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { return; } if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { @@ -502,7 +503,7 @@ struct JetSpectraCharged { void processCollisions(soa::Filtered::iterator const& collision) { registry.fill(HIST("h_collisions"), 0.5); - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { return; } registry.fill(HIST("h_collisions"), 1.5); @@ -521,7 +522,7 @@ struct JetSpectraCharged { float eventWeight = collision.mcCollision().weight(); registry.fill(HIST("h_collisions"), 0.5); registry.fill(HIST("h_collisions_weighted"), 0.5, eventWeight); - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { return; } registry.fill(HIST("h_collisions"), 1.5); @@ -540,7 +541,7 @@ struct JetSpectraCharged { soa::Join const& jets, aod::JetTracks const&) { - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { return; } if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { @@ -562,7 +563,7 @@ struct JetSpectraCharged { soa::Join const& jets, aod::JetTracks const&) { - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { return; } if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { @@ -584,7 +585,7 @@ struct JetSpectraCharged { soa::Join const& jets, aod::JetTracks const&) { - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { return; } if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { @@ -606,7 +607,7 @@ struct JetSpectraCharged { soa::Join const& jets, aod::JetTracks const&) { - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { return; } if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { @@ -628,7 +629,7 @@ struct JetSpectraCharged { soa::Join const& jets, aod::JetTracks const&) { - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { return; } if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { @@ -658,6 +659,8 @@ struct JetSpectraCharged { soa::Join const& jets, aod::JetParticles const&) { + bool mcLevelIsParticleLevel = true; + registry.fill(HIST("h_mcColl_counts_areasub"), 0.5); if (std::abs(mccollision.posZ()) > vertexZCut) { return; @@ -676,7 +679,7 @@ struct JetSpectraCharged { bool centralityIsGood = false; bool occupancyIsGood = false; if (acceptSplitCollisions == 2) { - if (jetderiveddatautilities::selectCollision(collisions.begin(), eventSelectionBits)) { + if (jetderiveddatautilities::selectCollision(collisions.begin(), eventSelectionBits, skipMBGapEvents)) { hasSel8Coll = true; } if ((centralityMin < collisions.begin().centrality()) && (collisions.begin().centrality() < centralityMax)) { @@ -687,7 +690,7 @@ struct JetSpectraCharged { } } else { for (auto const& collision : collisions) { - if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { hasSel8Coll = true; } if ((centralityMin < collision.centrality()) && (collision.centrality() < centralityMax)) { @@ -717,7 +720,7 @@ struct JetSpectraCharged { if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { continue; } - if (!isAcceptedJet(jet)) { + if (!isAcceptedJet(jet, mcLevelIsParticleLevel)) { continue; } fillMCPAreaSubHistograms(jet, mccollision.rho()); @@ -730,6 +733,8 @@ struct JetSpectraCharged { soa::Join const& jets, aod::JetParticles const&) { + bool mcLevelIsParticleLevel = true; + registry.fill(HIST("h_mcColl_counts"), 0.5); if (std::abs(mccollision.posZ()) > vertexZCut) { return; @@ -744,7 +749,7 @@ struct JetSpectraCharged { bool centralityIsGood = false; bool occupancyIsGood = false; for (auto const& collision : collisions) { - if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { hasSel8Coll = true; } if ((centralityMin < collision.centrality()) && (collision.centrality() < centralityMax)) { @@ -772,7 +777,7 @@ struct JetSpectraCharged { if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { continue; } - if (!isAcceptedJet(jet)) { + if (!isAcceptedJet(jet, mcLevelIsParticleLevel)) { continue; } fillMCPHistograms(jet); @@ -785,6 +790,8 @@ struct JetSpectraCharged { soa::Join const& jets, aod::JetParticles const&) { + bool mcLevelIsParticleLevel = true; + registry.fill(HIST("h_mcColl_counts"), 0.5); if (std::abs(mccollision.posZ()) > vertexZCut) { return; @@ -797,7 +804,7 @@ struct JetSpectraCharged { bool hasSel8Coll = false; for (auto const& collision : collisions) { - if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { hasSel8Coll = true; } } @@ -811,7 +818,7 @@ struct JetSpectraCharged { if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { continue; } - if (!isAcceptedJet(jet)) { + if (!isAcceptedJet(jet, mcLevelIsParticleLevel)) { continue; } float jetweight = jet.eventWeight(); @@ -831,7 +838,7 @@ struct JetSpectraCharged { soa::Join const& jets, aod::JetTracksSub const&) { - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { return; } if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { @@ -853,7 +860,7 @@ struct JetSpectraCharged { soa::Join const& jets, aod::JetTracksSub const&) { - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { return; } if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { @@ -876,7 +883,7 @@ struct JetSpectraCharged { ChargedMCPMatchedJets const&, aod::JetTracks const&, aod::JetParticles const&) { - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { return; } if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { @@ -900,7 +907,7 @@ struct JetSpectraCharged { ChargedMCPMatchedJetsWeighted const&, aod::JetTracks const&, aod::JetParticles const&) { - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { return; } if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { @@ -937,7 +944,7 @@ struct JetSpectraCharged { registry.fill(HIST("h_mc_rho_matched"), mcrho); for (const auto& collision : collisions) { registry.fill(HIST("h_mcd_events_matched"), 0.5); - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits) || !(std::abs(collision.posZ()) < vertexZCut)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents) || !(std::abs(collision.posZ()) < vertexZCut)) { continue; } registry.fill(HIST("h_mcd_events_matched"), 1.5); From 07f4c97feed06199613d855bec27c781bf5d4db5 Mon Sep 17 00:00:00 2001 From: Marvin Hemmer <53471402+mhemmer-cern@users.noreply.github.com> Date: Fri, 14 Mar 2025 17:05:28 +0100 Subject: [PATCH 0661/1650] [PWGEM,PWGEM-36] Pi0FlowEMC - Add option to revert scaling from NonLin (#10462) --- PWGEM/PhotonMeson/Tasks/taskPi0FlowEMC.cxx | 29 ++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/PWGEM/PhotonMeson/Tasks/taskPi0FlowEMC.cxx b/PWGEM/PhotonMeson/Tasks/taskPi0FlowEMC.cxx index 360638f4f12..d893e8be223 100644 --- a/PWGEM/PhotonMeson/Tasks/taskPi0FlowEMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/taskPi0FlowEMC.cxx @@ -96,6 +96,7 @@ struct TaskPi0FlowEMC { Configurable cfgRotAngle{"cfgRotAngle", std::move(const_cast(o2::constants::math::PIHalf)), "Angle used for the rotation method"}; Configurable cfgDistanceToEdge{"cfgDistanceToEdge", 1, "Distance to edge in cells required for rotated cluster to be accepted"}; Configurable cfgDoM02{"cfgDoM02", false, "Flag to enable flow vs M02 for single photons"}; + Configurable cfgDoReverseScaling{"cfgDoReverseScaling", false, "Flag to reverse the scaling that is possibly applied during NonLin"}; // configurable axis ConfigurableAxis thnConfigAxisInvMass{"thnConfigAxisInvMass", {400, 0.0, 0.8}, ""}; @@ -938,6 +939,15 @@ struct TaskPi0FlowEMC { ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.); ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.); + if (cfgDoReverseScaling) { + // Convert to PxPyPzEVector to modify energy + ROOT::Math::PxPyPzEVector v1Mod(v1); + v1Mod.SetE(v1Mod.E() * 1.0505); + v1 = ROOT::Math::PtEtaPhiMVector(v1Mod); + ROOT::Math::PxPyPzEVector v2Mod(v2); + v2Mod.SetE(v2Mod.E() * 1.0505); + v2 = ROOT::Math::PtEtaPhiMVector(v2Mod); + } ROOT::Math::PtEtaPhiMVector vMeson = v1 + v2; float dTheta = v1.Theta() - v2.Theta(); float dPhi = v1.Phi() - v2.Phi(); @@ -1036,6 +1046,16 @@ struct TaskPi0FlowEMC { } ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.); ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.); + + if (cfgDoReverseScaling) { + // Convert to PxPyPzEVector to modify energy + ROOT::Math::PxPyPzEVector v1Mod(v1); + v1Mod.SetE(v1Mod.E() * 1.0505); + v1 = ROOT::Math::PtEtaPhiMVector(v1Mod); + ROOT::Math::PxPyPzEVector v2Mod(v2); + v2Mod.SetE(v2Mod.E() * 1.0505); + v2 = ROOT::Math::PtEtaPhiMVector(v2Mod); + } ROOT::Math::PtEtaPhiMVector vMeson = v1 + v2; float dTheta = v1.Theta() - v2.Theta(); @@ -1253,6 +1273,15 @@ struct TaskPi0FlowEMC { ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.); ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.); + if (cfgDoReverseScaling) { + // Convert to PxPyPzEVector to modify energy + ROOT::Math::PxPyPzEVector v1Mod(v1); + v1Mod.SetE(v1Mod.E() * 1.0505); + v1 = ROOT::Math::PtEtaPhiMVector(v1Mod); + ROOT::Math::PxPyPzEVector v2Mod(v2); + v2Mod.SetE(v2Mod.E() * 1.0505); + v2 = ROOT::Math::PtEtaPhiMVector(v2Mod); + } ROOT::Math::PtEtaPhiMVector vMeson = v1 + v2; float dTheta = v1.Theta() - v2.Theta(); float dPhi = v1.Phi() - v2.Phi(); From 09d372c1554f1aa9b97366476b58884b3e437349 Mon Sep 17 00:00:00 2001 From: victorvalenciatorres <118812999+victorvalenciatorres@users.noreply.github.com> Date: Fri, 14 Mar 2025 17:17:21 +0100 Subject: [PATCH 0662/1650] [PWGDQ] Adding new histogram group for cumulants (#10459) --- PWGDQ/Core/HistogramsLibrary.cxx | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index a55fab5ee42..42028192825 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -1468,6 +1468,28 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr2POIplus", "", true, 60, 0.0, 30.0, VarManager::kPt1, 18, 0.0, 90.0, VarManager::kCentFT0C, 0, 0.0, 1.0, VarManager::kCORR2POIplus, "", "", "", VarManager::kNothing, VarManager::kM01POIoverMpplus); hm->AddHistogram(histClass, "Mass_Pt_centrFT0C_Corr4POIplus", "", true, 60, 0.0, 30.0, VarManager::kPt1, 18, 0.0, 90.0, VarManager::kCentFT0C, 0, 0.0, 1.0, VarManager::kCORR4POIplus, "", "", "", VarManager::kNothing, VarManager::kM0111POIoverMpplus); } + if (subGroupStr.Contains("singlecumulant2")) { + double PtBinEdges[67]; // 0-30GeV/c + for (int i = 0; i < 67; i++) { + if (i <= 39) { + PtBinEdges[i] = i / 10.; + } else { + PtBinEdges[i] = (i - 40) * 1. + 4.; + } + } + double CentBinEdges[19]; // 0-90% + for (int i = 0; i < 19; i++) { + CentBinEdges[i] = i * 5; + } + hm->AddHistogram(histClass, "Pt_centrFT0C_Corr2REFminus", "", true, 66, PtBinEdges, VarManager::kPt2, 18, CentBinEdges, VarManager::kCentFT0C, 0, nullptr, VarManager::kCORR2REFbydimuons, "", "", "", VarManager::kNothing, VarManager::kM11REFoverMpminus); + hm->AddHistogram(histClass, "Pt_centrFT0C_Corr4REFminus", "", true, 66, PtBinEdges, VarManager::kPt2, 18, CentBinEdges, VarManager::kCentFT0C, 0, nullptr, VarManager::kCORR4REFbydimuons, "", "", "", VarManager::kNothing, VarManager::kM1111REFoverMpminus); + hm->AddHistogram(histClass, "Pt_centrFT0C_Corr2REFplus", "", true, 66, PtBinEdges, VarManager::kPt1, 18, CentBinEdges, VarManager::kCentFT0C, 0, nullptr, VarManager::kCORR2REFbydimuons, "", "", "", VarManager::kNothing, VarManager::kM11REFoverMpplus); + hm->AddHistogram(histClass, "Pt_centrFT0C_Corr4REFplus", "", true, 66, PtBinEdges, VarManager::kPt1, 18, CentBinEdges, VarManager::kCentFT0C, 0, nullptr, VarManager::kCORR4REFbydimuons, "", "", "", VarManager::kNothing, VarManager::kM1111REFoverMpplus); + hm->AddHistogram(histClass, "Pt_centrFT0C_Corr2POIminus", "", true, 66, PtBinEdges, VarManager::kPt2, 18, CentBinEdges, VarManager::kCentFT0C, 0, nullptr, VarManager::kCORR2POIminus, "", "", "", VarManager::kNothing, VarManager::kM01POIoverMpminus); + hm->AddHistogram(histClass, "Pt_centrFT0C_Corr4POIminus", "", true, 66, PtBinEdges, VarManager::kPt2, 18, CentBinEdges, VarManager::kCentFT0C, 0, nullptr, VarManager::kCORR4POIminus, "", "", "", VarManager::kNothing, VarManager::kM0111POIoverMpminus); + hm->AddHistogram(histClass, "Pt_centrFT0C_Corr2POIplus", "", true, 66, PtBinEdges, VarManager::kPt1, 18, CentBinEdges, VarManager::kCentFT0C, 0, nullptr, VarManager::kCORR2POIplus, "", "", "", VarManager::kNothing, VarManager::kM01POIoverMpplus); + hm->AddHistogram(histClass, "Pt_centrFT0C_Corr4POIplus", "", true, 66, PtBinEdges, VarManager::kPt1, 18, CentBinEdges, VarManager::kCentFT0C, 0, nullptr, VarManager::kCORR4POIplus, "", "", "", VarManager::kNothing, VarManager::kM0111POIoverMpplus); + } if (subGroupStr.Contains("res-flow-dimuon")) { int varV2[6] = {VarManager::kMass, VarManager::kPt, VarManager::kRap, VarManager::kCentFT0C, VarManager::kR2SP_AB, VarManager::kR2EP_AB}; // int varV3[6] = {VarManager::kMass, VarManager::kPt, VarManager::kRap, VarManager::kCentFT0C, VarManager::kR3SP, VarManager::kR3EP}; // removed temporarily From 9b657da5b21664a1b0cd1afb2fcfe21a6635b5c4 Mon Sep 17 00:00:00 2001 From: Zuzanna Chochulska <87480906+zchochul@users.noreply.github.com> Date: Fri, 14 Mar 2025 17:30:02 +0100 Subject: [PATCH 0663/1650] [PWGCF] fix: change in the mixed events fot pPhi task (#10464) Co-authored-by: Zuzanna <01150674@pw.edu.pl> --- .../Tasks/femtoUniversePairTaskTrackPhi.cxx | 123 +++++++++--------- 1 file changed, 63 insertions(+), 60 deletions(-) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx index 0999d3a82c9..c1dcdf969eb 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx @@ -185,6 +185,8 @@ struct FemtoUniversePairTaskTrackPhi { HistogramRegistry registryDCA{"registryDCA", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; HistogramRegistry registryMCpT{"registryMCpT", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; + ColumnBinningPolicy colBinning{{ConfBinsVtx, ConfBinsMult}, true}; + EfficiencyConfigurableGroup effConfGroup; EfficiencyCalculator efficiencyCalculator{&effConfGroup}; @@ -466,14 +468,9 @@ struct FemtoUniversePairTaskTrackPhi { } template - void doSameEvent(FilteredFDCollision const& col, PartType const& parts, PartitionType& groupPartsOne, PartitionType& groupPartsTwo, [[maybe_unused]] MCParticles mcParts = nullptr) + void doSameEvent(PartitionType groupPartsTrack, PartitionType groupPartsPhi, PartType parts, float magFieldTesla, int multCol, [[maybe_unused]] MCParticles mcParts = nullptr) { - const auto& magFieldTesla = col.magField(); - const int multCol = col.multNtr(); - - eventHisto.fillQA(col); - - for (auto const& phicandidate : groupPartsTwo) { + for (auto const& phicandidate : groupPartsPhi) { // TODO: add phi meson minv cut here const auto& posChild = parts.iteratorAt(phicandidate.index() - 2); float tpcNSigmaKp = trackCuts.getNsigmaTPC(posChild, o2::track::PID::Kaon); @@ -498,7 +495,7 @@ struct FemtoUniversePairTaskTrackPhi { trackHistoPartPhi.fillQA(phicandidate); } - for (auto const& track : groupPartsOne) { + for (auto const& track : groupPartsTrack) { float tpcNSigmaPi = trackCuts.getNsigmaTPC(track, o2::track::PID::Pion); float tofNSigmaPi = trackCuts.getNsigmaTOF(track, o2::track::PID::Pion); float tpcNSigmaKa = trackCuts.getNsigmaTPC(track, o2::track::PID::Kaon); @@ -535,9 +532,7 @@ struct FemtoUniversePairTaskTrackPhi { } /// Now build the combinations - for (auto const& [track, phicandidate] : combinations(CombinationsFullIndexPolicy(groupPartsOne, groupPartsTwo))) { - // TODO: add phi inv mass cut here - + for (auto const& [track, phicandidate] : combinations(CombinationsFullIndexPolicy(groupPartsTrack, groupPartsPhi))) { if (ConfTrackIsIdentified) { if (!isParticleNSigmaAccepted(track.p(), trackCuts.getNsigmaTPC(track, o2::track::PID::Proton), trackCuts.getNsigmaTOF(track, o2::track::PID::Proton), trackCuts.getNsigmaTPC(track, o2::track::PID::Pion), trackCuts.getNsigmaTOF(track, o2::track::PID::Pion), trackCuts.getNsigmaTPC(track, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(track, o2::track::PID::Kaon))) { continue; @@ -597,6 +592,36 @@ struct FemtoUniversePairTaskTrackPhi { // } } + template + void doMixedEvent(PartitionType groupPartsTrack, PartitionType groupPartsPhi, PartType parts, float magFieldTesla, int multCol, [[maybe_unused]] MCParticles mcParts = nullptr) + { + for (auto const& [track, phicandidate] : combinations(CombinationsFullIndexPolicy(groupPartsTrack, groupPartsPhi))) { + if (ConfTrackIsIdentified) { + if (!isParticleNSigmaAccepted(track.p(), trackCuts.getNsigmaTPC(track, o2::track::PID::Proton), trackCuts.getNsigmaTOF(track, o2::track::PID::Proton), trackCuts.getNsigmaTPC(track, o2::track::PID::Pion), trackCuts.getNsigmaTOF(track, o2::track::PID::Pion), trackCuts.getNsigmaTPC(track, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(track, o2::track::PID::Kaon))) { + continue; + } + if (ConfTrackIsRejected) { + if (isParticleNSigmaRejected(track.p(), trackCuts.getNsigmaTPC(track, o2::track::PID::Proton), trackCuts.getNsigmaTOF(track, o2::track::PID::Proton), trackCuts.getNsigmaTPC(track, o2::track::PID::Pion), trackCuts.getNsigmaTOF(track, o2::track::PID::Pion), trackCuts.getNsigmaTPC(track, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(track, o2::track::PID::Kaon))) { + continue; + } + } + } + + if (ConfCPRIsEnabled) { + if (pairCloseRejection.isClosePair(track, phicandidate, parts, magFieldTesla, femto_universe_container::EventType::mixed)) { + continue; + } + } + + weight = efficiencyCalculator.getWeight(ParticleNo::ONE, phicandidate.pt()) * efficiencyCalculator.getWeight(ParticleNo::TWO, track.pt()); + + if constexpr (std::is_same::value) + mixedEventCont.setPair(track, phicandidate, multCol, ConfUse3D, weight); + else + mixedEventCont.setPair(track, phicandidate, multCol, ConfUse3D, weight); + } + } + void processSameEvent(FilteredFDCollision const& col, FilteredFemtoFullParticles const& parts) { auto thegroupPartsTrack = partsTrack->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); @@ -604,67 +629,30 @@ struct FemtoUniversePairTaskTrackPhi { // auto thegroupPartsPhiDaugh = partsPhiDaugh->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); // auto thegroupPartsKaons = partsKaons->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - doSameEvent(col, parts, thegroupPartsTrack, thegroupPartsPhi); + doSameEvent(thegroupPartsTrack, thegroupPartsPhi, parts, col.magField(), col.multNtr()); } PROCESS_SWITCH(FemtoUniversePairTaskTrackPhi, processSameEvent, "Enable processing same event", true); - template - void doMixedEvent(FilteredFDCollisions const& cols, PartType const& parts, PartitionType& partitionPhi, PartitionType& partitionTrack, [[maybe_unused]] MCParticles mcParts = nullptr) + void processMixedEvent(FilteredFDCollisions const& cols, FilteredFemtoFullParticles const& parts) { - ColumnBinningPolicy colBinning{{ConfBinsVtx, ConfBinsMult}, true}; + for (auto const& [collision1, collision2] : soa::selfCombinations(colBinning, 5, -1, cols, cols)) { - auto mixedCollProcessFunc = [&](auto& collision1, auto& collision2) -> void { - const int multCol = collision1.multNtr(); + const int multiplicityCol = collision1.multNtr(); + mixQaRegistry.fill(HIST("MixingQA/hMECollisionBins"), colBinning.getBin({collision1.posZ(), multiplicityCol})); - auto groupPartsPhi = partitionPhi->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex(), cache); - auto groupPartsTrack = partitionTrack->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex(), cache); + auto groupPartsTrack = partsTrack->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision2.globalIndex(), cache); + auto groupPartsPhi = partsPhi->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex(), cache); const auto& magFieldTesla1 = collision1.magField(); const auto& magFieldTesla2 = collision2.magField(); if (magFieldTesla1 != magFieldTesla2) { - return; - } - - for (const auto& [phicandidate, track] : combinations(CombinationsFullIndexPolicy(groupPartsPhi, groupPartsTrack))) { - // TODO: move here phi meson mass cut - - if (ConfTrackIsIdentified) { - if (!isParticleNSigmaAccepted(track.p(), trackCuts.getNsigmaTPC(track, o2::track::PID::Proton), trackCuts.getNsigmaTOF(track, o2::track::PID::Proton), trackCuts.getNsigmaTPC(track, o2::track::PID::Pion), trackCuts.getNsigmaTOF(track, o2::track::PID::Pion), trackCuts.getNsigmaTPC(track, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(track, o2::track::PID::Kaon))) { - continue; - } - if (ConfTrackIsRejected) { - if (isParticleNSigmaRejected(track.p(), trackCuts.getNsigmaTPC(track, o2::track::PID::Proton), trackCuts.getNsigmaTOF(track, o2::track::PID::Proton), trackCuts.getNsigmaTPC(track, o2::track::PID::Pion), trackCuts.getNsigmaTOF(track, o2::track::PID::Pion), trackCuts.getNsigmaTPC(track, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(track, o2::track::PID::Kaon))) { - continue; - } - } - } - - if (ConfCPRIsEnabled) { - if (pairCloseRejection.isClosePair(track, phicandidate, parts, magFieldTesla1, femto_universe_container::EventType::mixed)) { - continue; - } - } - - weight = efficiencyCalculator.getWeight(ParticleNo::ONE, phicandidate.pt()) * efficiencyCalculator.getWeight(ParticleNo::TWO, track.pt()); - - if constexpr (std::is_same::value) - mixedEventCont.setPair(track, phicandidate, multCol, ConfUse3D, weight); - else - mixedEventCont.setPair(track, phicandidate, multCol, ConfUse3D, weight); + continue; } - }; - for (const auto& [collision1, collision2] : soa::selfCombinations(colBinning, ConfNEventsMix, -1, cols, cols)) { - mixedCollProcessFunc(collision1, collision2); - mixQaRegistry.fill(HIST("MixingQA/hMECollisionBins"), colBinning.getBin({collision1.posZ(), collision1.multNtr()})); + doMixedEvent(groupPartsTrack, groupPartsPhi, parts, magFieldTesla1, multiplicityCol); } } - - void processMixedEvent(FilteredFDCollisions const& cols, FilteredFemtoFullParticles const& parts) - { - doMixedEvent(cols, parts, partsPhi, partsTrack); - } PROCESS_SWITCH(FemtoUniversePairTaskTrackPhi, processMixedEvent, "Enable processing mixed events", true); ///--------------------------------------------MC-------------------------------------------------/// @@ -674,14 +662,29 @@ struct FemtoUniversePairTaskTrackPhi { auto thegroupPartsPhi = partsPhiMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); // auto thegroupPartsPhiDaugh = partsPhiDaugh->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); // auto thegroupPartsKaons = partsKaons->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - - doSameEvent(col, parts, thegroupPartsTrack, thegroupPartsPhi, mcparts); + doSameEvent(thegroupPartsTrack, thegroupPartsPhi, parts, col.magField(), col.multNtr(), mcparts); } PROCESS_SWITCH(FemtoUniversePairTaskTrackPhi, processSameEventMCReco, "Enable processing same event for MC Reco", true); void processMixedEventMCReco(FilteredFDCollisions const& cols, FemtoRecoParticles const& parts, aod::FdMCParticles const& mcparts) { - doMixedEvent(cols, parts, partsPhiMCReco, partsTrackMCReco, mcparts); + for (auto const& [collision1, collision2] : soa::selfCombinations(colBinning, 5, -1, cols, cols)) { + + const int multiplicityCol = collision1.multNtr(); + mixQaRegistry.fill(HIST("MixingQA/hMECollisionBins"), colBinning.getBin({collision1.posZ(), multiplicityCol})); + + const auto& magFieldTesla1 = collision1.magField(); + const auto& magFieldTesla2 = collision2.magField(); + + if (magFieldTesla1 != magFieldTesla2) { + continue; + } + + auto groupPartsTrack = partsTrackMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision2.globalIndex(), cache); + auto groupPartsPhi = partsPhiMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex(), cache); + + doMixedEvent(groupPartsTrack, groupPartsPhi, parts, magFieldTesla1, multiplicityCol, mcparts); + } } PROCESS_SWITCH(FemtoUniversePairTaskTrackPhi, processMixedEventMCReco, "Enable processing mixed events for MC Reco", false); From 0e5710158f371203439a7b4828a1911da44eca9a Mon Sep 17 00:00:00 2001 From: dajones2 <140733426+dajones2@users.noreply.github.com> Date: Fri, 14 Mar 2025 17:11:16 +0000 Subject: [PATCH 0664/1650] [PWGJE] Adding histograms for testing rho reference shift (#10474) --- PWGJE/Tasks/jetHadronRecoil.cxx | 52 ++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/PWGJE/Tasks/jetHadronRecoil.cxx b/PWGJE/Tasks/jetHadronRecoil.cxx index c9a7ec8a91b..e4cc16b0e8a 100644 --- a/PWGJE/Tasks/jetHadronRecoil.cxx +++ b/PWGJE/Tasks/jetHadronRecoil.cxx @@ -112,15 +112,16 @@ struct JetHadronRecoil { {"hPtTrack", "Track p_{T};p_{T};entries", {HistType::kTH1F, {{200, 0, 200}}}}, {"hEtaTrack", "Track #eta;#eta;entries", {HistType::kTH1F, {{100, -1.0, 1.0}}}}, {"hPhiTrack", "Track #phi;#phi;entries", {HistType::kTH1F, {{100, 0.0, o2::constants::math::TwoPI}}}}, - {"hReferencePtDPhi", "jet p_{T} vs DPhi;#Delta#phi;p_{T,jet}", {HistType::kTH2F, {{100, 0, o2::constants::math::TwoPI}, {250, -100, 150}}}}, - {"hSignalPtDPhi", "jet p_{T} vs DPhi;#Delta#phi;p_{T,jet}", {HistType::kTH2F, {{100, 0, o2::constants::math::TwoPI}, {250, -100, 150}}}}, - {"hReferencePt", "jet p_{T};p_{T,jet};entries", {HistType::kTH1F, {{250, -100, 150}}}}, - {"hSignalPt", "jet p_{T};p_{T,jet};entries", {HistType::kTH1F, {{250, -100, 150}}}}, + {"hReferencePtDPhi", "jet p_{T} vs DPhi;#Delta#phi;p_{T,jet}", {HistType::kTH2F, {{100, 0, o2::constants::math::TwoPI}, {500, -100, 400}}}}, + {"hReferencePtDPhiShifts", "rho shifts;#Delta#phi;p_{T,jet};shifts", {HistType::kTH3F, {{100, 0, o2::constants::math::TwoPI}, {500, -100, 400}, {20, 0.0, 2.0}}}}, + {"hSignalPtDPhi", "jet p_{T} vs DPhi;#Delta#phi;p_{T,jet}", {HistType::kTH2F, {{100, 0, o2::constants::math::TwoPI}, {500, -100, 400}}}}, + {"hReferencePt", "jet p_{T};p_{T,jet};entries", {HistType::kTH1F, {{500, -100, 400}}}}, + {"hSignalPt", "jet p_{T};p_{T,jet};entries", {HistType::kTH1F, {{500, -100, 400}}}}, {"hSignalTriggers", "trigger p_{T};p_{T,trig};entries", {HistType::kTH1F, {{150, 0, 150}}}}, {"hReferenceTriggers", "trigger p_{T};p_{T,trig};entries", {HistType::kTH1F, {{150, 0, 150}}}}, {"hSigEventTriggers", "N_{triggers};events", {HistType::kTH1F, {{10, 0, 10}}}}, {"hRefEventTriggers", "N_{triggers};events", {HistType::kTH1F, {{10, 0, 10}}}}, - {"hJetPt", "jet p_{T};p_{T,jet};entries", {HistType::kTH1F, {{300, -100, 200}}}}, + {"hJetPt", "jet p_{T};p_{T,jet};entries", {HistType::kTH1F, {{500, -100, 400}}}}, {"hJetEta", "jet #eta;#eta_{jet};entries", {HistType::kTH1F, {{100, -1.0, 1.0}}}}, {"hJetPhi", "jet #phi;#phi_{jet};entries", {HistType::kTH1F, {{100, 0.0, o2::constants::math::TwoPI}}}}, {"hPtPart", "Particle p_{T};p_{T};entries", {HistType::kTH1F, {{200, 0, 200}}}}, @@ -128,30 +129,32 @@ struct JetHadronRecoil { {"hPhiPart", "Particle #phi;#phi;entries", {HistType::kTH1F, {{100, 0.0, o2::constants::math::TwoPI}}}}, {"hDeltaR", "#DeltaR;#DeltaR;#frac{dN_{jets}}{d#DeltaR}", {HistType::kTH1F, {dRAxis}}}, {"hDeltaRPart", "Particle #DeltaR;#DeltaR;#frac{1}{N_{jets}}#frac{dN_{jets}}{d#DeltaR}", {HistType::kTH1F, {dRAxis}}}, - {"hDeltaRpT", "jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{300, -100, 200}, dRAxis}}}, - {"hDeltaRpTPart", "Particle jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{200, 0, 200}, dRAxis}}}, + {"hDeltaRpT", "jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{500, -100, 400}, dRAxis}}}, + {"hDeltaRpTPart", "Particle jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{400, 0, 400}, dRAxis}}}, {"hRhoSignal", "Signal Rho bkg;#rho;entries", {HistType::kTH1F, {{220, 0, 220}}}}, {"hRhoReference", "Reference Rho bkg;#rho;entries", {HistType::kTH1F, {{220, 0, 220}}}}, + {"hRhoReferenceShift", "Testing reference shifts;#rho;shift", {HistType::kTH2F, {{220, 0, 220}, {20, 0.0, 2.0}}}}, {"hDeltaRSignal", "#DeltaR;#DeltaR;#frac{dN_{jets}}{d#DeltaR}", {HistType::kTH1F, {dRAxis}}}, {"hDeltaRSignalPart", "Particle #DeltaR;#DeltaR;#frac{1}{N_{jets}}#frac{dN_{jets}}{d#DeltaR}", {HistType::kTH1F, {dRAxis}}}, - {"hDeltaRpTSignal", "jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{300, -100, 200}, dRAxis}}}, - {"hDeltaRpTSignalPart", "Particle jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{200, 0, 200}, dRAxis}}}, - {"hDeltaRpTDPhiSignal", "jet p_{T} vs #DeltaR vs #Delta#phi;p_{T,jet};#Delta#phi;#DeltaR", {HistType::kTH3F, {{300, -100, 200}, {100, 0, o2::constants::math::TwoPI}, dRAxis}}}, - {"hDeltaRpTDPhiSignalPart", "Particle jet p_{T} vs #DeltaR vs #Delta#phi;p_{T,jet};#Delta#phi;#DeltaR", {HistType::kTH3F, {{200, 0, 200}, {100, 0, o2::constants::math::TwoPI}, dRAxis}}}, + {"hDeltaRpTSignal", "jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{500, -100, 400}, dRAxis}}}, + {"hDeltaRpTSignalPart", "Particle jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{400, 0, 400}, dRAxis}}}, + {"hDeltaRpTDPhiSignal", "jet p_{T} vs #DeltaR vs #Delta#phi;p_{T,jet};#Delta#phi;#DeltaR", {HistType::kTH3F, {{500, -100, 400}, {100, 0, o2::constants::math::TwoPI}, dRAxis}}}, + {"hDeltaRpTDPhiSignalPart", "Particle jet p_{T} vs #DeltaR vs #Delta#phi;p_{T,jet};#Delta#phi;#DeltaR", {HistType::kTH3F, {{400, 0, 400}, {100, 0, o2::constants::math::TwoPI}, dRAxis}}}, {"hDeltaRReference", "#DeltaR;#DeltaR;#frac{dN_{jets}}{d#DeltaR}", {HistType::kTH1F, {dRAxis}}}, {"hDeltaRPartReference", "Particle #DeltaR;#DeltaR;#frac{1}{N_{jets}}#frac{dN_{jets}}{d#DeltaR}", {HistType::kTH1F, {dRAxis}}}, - {"hDeltaRpTReference", "jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{300, -100, 200}, dRAxis}}}, - {"hDeltaRpTPartReference", "Particle jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{200, 0, 200}, dRAxis}}}, - {"hDeltaRpTDPhiReference", "jet p_{T} vs #DeltaR vs #Delta#phi;p_{T,jet};#Delta#phi;#DeltaR", {HistType::kTH3F, {{300, -100, 200}, {100, 0, o2::constants::math::TwoPI}, dRAxis}}}, - {"hDeltaRpTDPhiReferencePart", "jet p_{T} vs #DeltaR vs #Delta#phi;p_{T,jet};#Delta#phi;#DeltaR", {HistType::kTH3F, {{200, 0, 200}, {100, 0, o2::constants::math::TwoPI}, dRAxis}}}, - {"hPtMatched", "p_{T} matching;p_{T,det};p_{T,part}", {HistType::kTH2F, {{300, -100, 200}, {200, 0, 200}}}}, + {"hDeltaRpTReference", "jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{500, -100, 400}, dRAxis}}}, + {"hDeltaRpTPartReference", "Particle jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{400, 0, 400}, dRAxis}}}, + {"hDeltaRpTDPhiReference", "jet p_{T} vs #DeltaR vs #Delta#phi;p_{T,jet};#Delta#phi;#DeltaR", {HistType::kTH3F, {{500, -100, 400}, {100, 0, o2::constants::math::TwoPI}, dRAxis}}}, + {"hDeltaRpTDPhiReferenceShifts", "testing shifts;p_{T,jet};#Delta#phi;#DeltaR;shifts", {HistType::kTHnSparseD, {{500, -100, 400}, {100, 0, o2::constants::math::TwoPI}, dRAxis, {20, 0.0, 2.0}}}}, + {"hDeltaRpTDPhiReferencePart", "jet p_{T} vs #DeltaR vs #Delta#phi;p_{T,jet};#Delta#phi;#DeltaR", {HistType::kTH3F, {{400, 0, 400}, {100, 0, o2::constants::math::TwoPI}, dRAxis}}}, + {"hPtMatched", "p_{T} matching;p_{T,det};p_{T,part}", {HistType::kTH2F, {{500, -100, 400}, {400, 0, 400}}}}, {"hPhiMatched", "#phi matching;#phi_{det};#phi_{part}", {HistType::kTH2F, {{100, 0.0, o2::constants::math::TwoPI}, {100, 0.0, o2::constants::math::TwoPI}}}}, {"hDeltaRMatched", "#DeltaR matching;#DeltaR_{det};#DeltaR_{part}", {HistType::kTH2F, {dRAxisDet, dRAxisPart}}}, - {"hPtMatched1d", "p_{T} matching 1d;p_{T,part}", {HistType::kTH1F, {{200, 0, 200}}}}, + {"hPtMatched1d", "p_{T} matching 1d;p_{T,part}", {HistType::kTH1F, {{400, 0, 400}}}}, {"hDeltaRMatched1d", "#DeltaR matching 1d;#DeltaR_{part}", {HistType::kTH1F, {dRAxisPart}}}, - {"hPtResolution", "p_{T} resolution;p_{T,part};Relative Resolution", {HistType::kTH2F, {{200, 0, 200}, {1000, -5.0, 5.0}}}}, - {"hPhiResolution", "#phi resolution;#p{T,part};Resolution", {HistType::kTH2F, {{200, 0, 200}, {1000, -7.0, 7.0}}}}, - {"hDeltaRResolution", "#DeltaR Resolution;p_{T,part};Resolution", {HistType::kTH2F, {{200, 0, 200}, {1000, -0.15, 0.15}}}}, + {"hPtResolution", "p_{T} resolution;p_{T,part};Relative Resolution", {HistType::kTH2F, {{400, 0, 400}, {1000, -5.0, 5.0}}}}, + {"hPhiResolution", "#phi resolution;#p{T,part};Resolution", {HistType::kTH2F, {{400, 0, 400}, {1000, -7.0, 7.0}}}}, + {"hDeltaRResolution", "#DeltaR Resolution;p_{T,part};Resolution", {HistType::kTH2F, {{400, 0, 400}, {1000, -0.15, 0.15}}}}, {"hFullMatching", "Full 6D matching;p_{T,det};p_{T,part};#phi_{det};#phi_{part};#DeltaR_{det};#DeltaR_{part}", {HistType::kTHnSparseD, {ptAxisDet, ptAxisPart, phiAxisDet, phiAxisPart, dRAxisDet, dRAxisPart}}}}}; std::vector eventSelectionBits; @@ -220,6 +223,9 @@ struct JetHadronRecoil { registry.fill(HIST("hNtrig"), 0.5, weight); registry.fill(HIST("hRefEventTriggers"), nTT, weight); registry.fill(HIST("hRhoReference"), rhoReference, weight); + for (double shift = 0.0; shift <= 2.0; shift += 0.1) { + registry.fill(HIST("hRhoReferenceShift"), rho + shift, shift, weight); + } } } @@ -265,8 +271,14 @@ struct JetHadronRecoil { registry.fill(HIST("hDeltaRReference"), dR, weight); } registry.fill(HIST("hDeltaRpTDPhiReference"), jet.pt() - (rhoReference * jet.area()), dphi, dR, weight); + for (double shift = 0.0; shift <= 2.0; shift += 0.1) { + registry.fill(HIST("hDeltaRpTDPhiReferenceShifts"), jet.pt() - ((rho + shift) * jet.area()), dphi, dR, shift, weight); + } } registry.fill(HIST("hReferencePtDPhi"), dphi, jet.pt() - (rhoReference * jet.area()), weight); + for (double shift = 0.0; shift <= 2.0; shift += 0.1) { + registry.fill(HIST("hReferencePtDPhiShifts"), dphi, jet.pt() - ((rho + shift) * jet.area()), shift, weight); + } if (std::abs(dphi - o2::constants::math::PI) < 0.6) { registry.fill(HIST("hReferencePt"), jet.pt() - (rhoReference * jet.area()), weight); } From 82e184338ca5071c9d7a9f3b9e33659a5169e526 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Fri, 14 Mar 2025 18:19:02 +0100 Subject: [PATCH 0665/1650] [PWGLF] Change histogram bin (#10468) --- PWGLF/Tasks/Resonances/f1protoncorrelation.cxx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/PWGLF/Tasks/Resonances/f1protoncorrelation.cxx b/PWGLF/Tasks/Resonances/f1protoncorrelation.cxx index 20e986625a8..4d1a9bb094f 100644 --- a/PWGLF/Tasks/Resonances/f1protoncorrelation.cxx +++ b/PWGLF/Tasks/Resonances/f1protoncorrelation.cxx @@ -84,13 +84,13 @@ struct f1protoncorrelation { histos.add("hNsigmaPionKaonTPC", "Nsigma Pion Kaon TPC correlation", kTH2F, {{100, -5.0f, 5.0f}, {100, -5.0f, 5.0f}}); histos.add("h2SameEventPtCorrelation", "Pt correlation of F1 and proton", kTH3F, {{100, 0.0f, 1.0f}, {100, 0.0, 10.0}, {100, 0.0, 10.0}}); - histos.add("h2SameEventInvariantMassUnlike_mass", "Unlike Sign Invariant mass of f1 same event", kTH3F, {{100, 0.0f, 1.0f}, {100, 0.0, 10.0}, {800, 1.0, 1.8}}); - histos.add("h2SameEventInvariantMassLike_mass", "Like Sign Invariant mass of f1 same event", kTH3F, {{100, 0.0f, 1.0f}, {100, 0.0, 10.0}, {800, 1.0, 1.8}}); - histos.add("h2SameEventInvariantMassRot_mass", "Rotational Invariant mass of f1 same event", kTH3F, {{100, 0.0f, 1.0f}, {100, 0.0, 10.0}, {800, 1.0, 1.8}}); + histos.add("h2SameEventInvariantMassUnlike_mass", "Unlike Sign Invariant mass of f1 same event", kTH3F, {{300, 0.0f, 3.0f}, {100, 0.0, 10.0}, {800, 1.0, 1.8}}); + histos.add("h2SameEventInvariantMassLike_mass", "Like Sign Invariant mass of f1 same event", kTH3F, {{300, 0.0f, 3.0f}, {100, 0.0, 10.0}, {800, 1.0, 1.8}}); + histos.add("h2SameEventInvariantMassRot_mass", "Rotational Invariant mass of f1 same event", kTH3F, {{300, 0.0f, 3.0f}, {100, 0.0, 10.0}, {800, 1.0, 1.8}}); - histos.add("h2MixEventInvariantMassUnlike_mass", "Unlike Sign Invariant mass of f1 mix event", kTH3F, {{100, 0.0f, 1.0f}, {100, 0.0, 10.0}, {800, 1.0, 1.8}}); - histos.add("h2MixEventInvariantMassLike_mass", "Like Sign Invariant mass of f1 mix event", kTH3F, {{100, 0.0f, 1.0f}, {100, 0.0, 10.0}, {800, 1.0, 1.8}}); - histos.add("h2MixEventInvariantMassRot_mass", "Rotational Sign Invariant mass of f1 mix event", kTH3F, {{100, 0.0f, 1.0f}, {100, 0.0, 10.0}, {800, 1.0, 1.8}}); + histos.add("h2MixEventInvariantMassUnlike_mass", "Unlike Sign Invariant mass of f1 mix event", kTH3F, {{300, 0.0f, 3.0f}, {100, 0.0, 10.0}, {800, 1.0, 1.8}}); + histos.add("h2MixEventInvariantMassLike_mass", "Like Sign Invariant mass of f1 mix event", kTH3F, {{300, 0.0f, 3.0f}, {100, 0.0, 10.0}, {800, 1.0, 1.8}}); + histos.add("h2MixEventInvariantMassRot_mass", "Rotational Sign Invariant mass of f1 mix event", kTH3F, {{300, 0.0f, 3.0f}, {100, 0.0, 10.0}, {800, 1.0, 1.8}}); const AxisSpec thnAxisInvMass{configThnAxisInvMass, "#it{M} (GeV/#it{c}^{2})"}; const AxisSpec thnAxisPt{configThnAxisPt, "#it{p}_{T} (GeV/#it{c})"}; From d57030e5fe242fda9f11783debd664265929fe28 Mon Sep 17 00:00:00 2001 From: YubiaoWang Date: Sat, 15 Mar 2025 01:35:34 +0800 Subject: [PATCH 0666/1650] [PWGJE] Add event number check plot, rho_local check plot about centrality, add event plane resolution plots (#10461) --- PWGJE/Tasks/jetChargedV2.cxx | 47 ++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/PWGJE/Tasks/jetChargedV2.cxx b/PWGJE/Tasks/jetChargedV2.cxx index 4468afdd727..c88f40cb990 100644 --- a/PWGJE/Tasks/jetChargedV2.cxx +++ b/PWGJE/Tasks/jetChargedV2.cxx @@ -204,6 +204,7 @@ struct JetChargedV2 { eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast(eventSelections)); trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast(trackSelections)); + registry.add("h_collisions", "event status;event status;entries", {HistType::kTH1F, {{4, 0.0, 4.0}}}); //< \sigma p_T at local rho test plot > registry.add("h_accept_Track", "all and accept track;Track;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); registry.add("h_accept_Track_init", "all and accept track;Track;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); @@ -212,7 +213,6 @@ struct JetChargedV2 { registry.add("h_ptsum_collnum", "ptsum collnum;collnum;entries", {HistType::kTH1F, {{40, 0.0, 40}}}); registry.add("h_ptsum_sumpt", "jet sumpt;sum p_{T};entries", {HistType::kTH1F, {{40, 0., o2::constants::math::TwoPI}}}); registry.add("h2_phi_track_eta", "phi vs track eta; #eta (GeV/#it{c}); #varphi", {HistType::kTH2F, {{100, -1.0, 1.0}, {40, 0., o2::constants::math::TwoPI}}}); - registry.add("h2_phi_track_pt", "phi vs track pT; #it{p}_{T,track} (GeV/#it{c}); #varphi", {HistType::kTH2F, {{200, 0., 200.}, {40, 0., o2::constants::math::TwoPI}}}); registry.add("h2_centrality_phi_w_pt", "centrality vs jet #varphi; centrality; entries", {HistType::kTH2F, {{100, 0.0, 100.0}, {40, 0., o2::constants::math::TwoPI}}}); registry.add("h2_evtnum_phi_w_pt", "eventNumber vs jet #varphi; #eventNumber; entries", {HistType::kTH2F, {{1000, 0.0, 1000}, {40, 0., o2::constants::math::TwoPI}}}); @@ -242,13 +242,11 @@ struct JetChargedV2 { registry.add("h_fitparav2obs_evtnum", "fitparameter v2obs vs evtnum ; #eventnumber", {HistType::kTH1F, {{1000, 0.0, 1000}}}); registry.add("h_fitparav3obs_evtnum", "fitparameter v3obs vs evtnum ; #eventnumber", {HistType::kTH1F, {{1000, 0.0, 1000}}}); + registry.add("h2_fitParaZero_cent", "#varphi vs #rho(#varphi); #cent; #fitParameter[0] ", {HistType::kTH2F, {{100, 0., 100}, {210, -10.0, 200.0}}}); registry.add("h2_phi_rhophi", "#varphi vs #rho(#varphi); #varphi - #Psi_{EP,2}; #rho_{ch}(#varphi) ", {HistType::kTH2F, {{40, 0., o2::constants::math::TwoPI}, {210, -10.0, 200.0}}}); registry.add("h2_phi_rholocal", "#varphi vs #rho(#varphi); #varphi - #Psi_{EP,2}; #rho(#varphi) ", {HistType::kTH2F, {{40, 0., o2::constants::math::TwoPI}, {210, -10.0, 200.0}}}); - registry.add("h2_phi_rhomedian", "#varphi vs #rho(#varphi); #varphi - #Psi_{EP,2}; #rho_{median} ", {HistType::kTH2F, {{40, 0., o2::constants::math::TwoPI}, {210, -10.0, 200.0}}}); - - registry.add("h2_fitParaZero_cent", "#varphi vs #rho(#varphi); #cent; #fitParameter[0] ", {HistType::kTH2F, {{100, 0., 100}, {210, -10.0, 200.0}}}); registry.add("h2_phi_rholocal_cent", "#varphi vs #rho(#varphi); #cent; #rho(#varphi) ", {HistType::kTH2F, {{100, 0., 100}, {210, -10.0, 200.0}}}); - registry.add("h2_phi_rhomedian_cent", "#varphi vs #rho(#varphi); #cent; #rho_{median} ", {HistType::kTH2F, {{100, 0., 100}, {210, -10.0, 200.0}}}); + registry.add("h3_centrality_localrho_phi", "centrality; #rho_{local}; #Delta#varphi_{jet}", {HistType::kTH3F, {{120, -10.0, 110.0}, {200, 0.0, 200.0}, {40, 0., o2::constants::math::TwoPI}}}); registry.add("h3_centrality_rhovsphi_phi", "centrality; #rho(#varphi); #Delta#varphi_{jet}", {HistType::kTH3F, {{120, -10.0, 110.0}, {200, 0.0, 200.0}, {40, 0., o2::constants::math::TwoPI}}}); //< \sigma p_T at local rho test plot | end > @@ -269,7 +267,7 @@ struct JetChargedV2 { //< RC test plots >// registry.add("h3_centrality_deltapT_RandomCornPhi_rhorandomconewithoutleadingjet", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}; #Delta#varphi_{jet}", {HistType::kTH3F, {{100, 0.0, 100.0}, {400, -200.0, 200.0}, {100, 0., o2::constants::math::TwoPI}}}); registry.add("h3_centrality_deltapT_RandomCornPhi_localrhovsphi", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}; #Delta#varphi_{jet}", {HistType::kTH3F, {{100, 0.0, 100.0}, {400, -200.0, 200.0}, {100, 0., o2::constants::math::TwoPI}}}); - registry.add("h3_centrality_deltapT_RandomCornPhi_RCprocess_rhorandomconewithoutleadingjet", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}; #Delta#varphi_{jet}", {HistType::kTH3F, {{100, 0.0, 100.0}, {400, -200.0, 200.0}, {100, 0., o2::constants::math::TwoPI}}}); + registry.add("h2_centrality_deltapT_RandomCornPhi_RCprocess_rhorandomconewithoutleadingjet", "#it{p}_{T,random cone} - #it{area, random cone} * #it{rho}; #Delta#varphi_{jet}", {HistType::kTH2F, {{400, -200.0, 200.0}, {100, 0., o2::constants::math::TwoPI}}}); registry.add("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithoutleadingjet", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}(#varphi); #Delta#varphi_{jet}", {HistType::kTH3F, {{100, 0.0, 100.0}, {400, -200.0, 200.0}, {100, 0., o2::constants::math::TwoPI}}}); registry.add("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithoutoneleadingjet", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}(#varphi); #Delta#varphi_{jet}", {HistType::kTH3F, {{100, 0.0, 100.0}, {400, -200.0, 200.0}, {100, 0., o2::constants::math::TwoPI}}}); @@ -316,6 +314,10 @@ struct JetChargedV2 { histosQA.add(Form("histEvtPlRectrV%d", cfgnMods->at(i)), "", {HistType::kTH2F, {axisEvtPl, axisCent}}); histosQA.add(Form("histEvtPlTwistV%d", cfgnMods->at(i)), "", {HistType::kTH2F, {axisEvtPl, axisCent}}); histosQA.add(Form("histEvtPlFinalV%d", cfgnMods->at(i)), "", {HistType::kTH2F, {axisEvtPl, axisCent}}); + + histosQA.add(Form("histEvtPlRes_SigRefAV%d", cfgnMods->at(i)), "", {HistType::kTH2F, {axisEvtPl, axisCent}}); + histosQA.add(Form("histEvtPlRes_SigRefBV%d", cfgnMods->at(i)), "", {HistType::kTH2F, {axisEvtPl, axisCent}}); + histosQA.add(Form("histEvtPlRes_RefARefBV%d", cfgnMods->at(i)), "", {HistType::kTH2F, {axisEvtPl, axisCent}}); } //=====================< evt pln plot | end >=====================// } @@ -399,8 +401,10 @@ struct JetChargedV2 { for (uint i = 0; i < cfgnMods->size(); i++) { int nmode = cfgnMods->at(i); int detInd = detId * 4 + cfgnTotalSystem * 4 * (nmode - 2); + int refAInd = refAId * 4 + cfgnTotalSystem * 4 * (nmode - 2); + int refBInd = refBId * 4 + cfgnTotalSystem * 4 * (nmode - 2); if (nmode == 2) { - if (collision.qvecAmp()[detId] > 1e-8) { + if (collision.qvecAmp()[detId] > 1e-8 || collision.qvecAmp()[refAId] < 1e-8 || collision.qvecAmp()[refBId] < 1e-8) { histosQA.fill(HIST("histQvecUncorV2"), collision.qvecRe()[detInd], collision.qvecIm()[detInd], collision.cent()); histosQA.fill(HIST("histQvecRectrV2"), collision.qvecRe()[detInd + 1], collision.qvecIm()[detInd + 1], collision.cent()); histosQA.fill(HIST("histQvecTwistV2"), collision.qvecRe()[detInd + 2], collision.qvecIm()[detInd + 2], collision.cent()); @@ -410,6 +414,10 @@ struct JetChargedV2 { histosQA.fill(HIST("histEvtPlRectrV2"), helperEP.GetEventPlane(collision.qvecRe()[detInd + 1], collision.qvecIm()[detInd + 1], nmode), collision.cent()); histosQA.fill(HIST("histEvtPlTwistV2"), helperEP.GetEventPlane(collision.qvecRe()[detInd + 2], collision.qvecIm()[detInd + 2], nmode), collision.cent()); histosQA.fill(HIST("histEvtPlFinalV2"), helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode), collision.cent()); + + histosQA.fill(HIST("histEvtPlRes_SigRefAV2"), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode), helperEP.GetEventPlane(collision.qvecRe()[refAInd + 3], collision.qvecIm()[refAInd + 3], nmode), nmode), collision.cent()); + histosQA.fill(HIST("histEvtPlRes_SigRefBV2"), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode), helperEP.GetEventPlane(collision.qvecRe()[refBInd + 3], collision.qvecIm()[refBInd + 3], nmode), nmode), collision.cent()); + histosQA.fill(HIST("histEvtPlRes_RefARefBV2"), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[refAInd + 3], collision.qvecIm()[refAInd + 3], nmode), helperEP.GetEventPlane(collision.qvecRe()[refBInd + 3], collision.qvecIm()[refBInd + 3], nmode), nmode), collision.cent()); } } else if (nmode == 3) { histosQA.fill(HIST("histQvecUncorV3"), collision.qvecRe()[detInd], collision.qvecIm()[detInd], collision.cent()); @@ -421,6 +429,10 @@ struct JetChargedV2 { histosQA.fill(HIST("histEvtPlRectrV3"), helperEP.GetEventPlane(collision.qvecRe()[detInd + 1], collision.qvecIm()[detInd + 1], nmode), collision.cent()); histosQA.fill(HIST("histEvtPlTwistV3"), helperEP.GetEventPlane(collision.qvecRe()[detInd + 2], collision.qvecIm()[detInd + 2], nmode), collision.cent()); histosQA.fill(HIST("histEvtPlFinalV3"), helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode), collision.cent()); + + histosQA.fill(HIST("histEvtPlRes_SigRefAV3"), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode), helperEP.GetEventPlane(collision.qvecRe()[refAInd + 3], collision.qvecIm()[refAInd + 3], nmode), nmode), collision.cent()); + histosQA.fill(HIST("histEvtPlRes_SigRefBV3"), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode), helperEP.GetEventPlane(collision.qvecRe()[refBInd + 3], collision.qvecIm()[refBInd + 3], nmode), nmode), collision.cent()); + histosQA.fill(HIST("histEvtPlRes_RefARefBV3"), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[refAInd + 3], collision.qvecIm()[refAInd + 3], nmode), helperEP.GetEventPlane(collision.qvecRe()[refBInd + 3], collision.qvecIm()[refBInd + 3], nmode), nmode), collision.cent()); } if (nmode == 2) { @@ -484,13 +496,15 @@ struct JetChargedV2 { soa::Join const& jets, aod::JetTracks const& tracks) { - // for (const auto& collision : collisions) { - if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { + registry.fill(HIST("h_collisions"), 0.5); + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { return; } - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + registry.fill(HIST("h_collisions"), 1.5); + if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { return; } + registry.fill(HIST("h_collisions"), 2.5); double leadingJetPt = -1; double leadingJetPhi = -1; double leadingJetEta = -1; @@ -535,7 +549,6 @@ struct JetChargedV2 { accptTrack += 1; registry.fill(HIST("h_accept_Track"), 2.5); hPtsumSumptFit->Fill(track.phi(), track.pt()); - registry.fill(HIST("h2_phi_track_pt"), track.pt(), track.phi()); registry.fill(HIST("h2_phi_track_eta"), track.eta(), track.phi()); registry.fill(HIST("h_ptsum_sumpt"), track.phi(), track.pt()); registry.fill(HIST("h2_centrality_phi_w_pt"), collision.centrality(), track.phi(), track.pt()); @@ -661,8 +674,11 @@ struct JetChargedV2 { double integralValue = fFitModulationV2v3->Integral(jet.phi() - jetRadius, jet.phi() + jetRadius); double rholocal = collision.rho() / (2 * jetRadius * temppara[0]) * integralValue; + registry.fill(HIST("h2_phi_rhophi"), jet.phi() - ep2, fFitModulationV2v3->Eval(jet.phi()), 1.0); + registry.fill(HIST("h3_centrality_rhovsphi_phi"), collision.centrality(), fFitModulationV2v3->Eval(jet.phi()), jet.phi() - ep2); + registry.fill(HIST("h2_phi_rholocal_cent"), collision.centrality(), rholocal, 1.0); - registry.fill(HIST("h2_phi_rhomedian_cent"), collision.centrality(), collision.rho(), 1.0); + registry.fill(HIST("h3_centrality_localrho_phi"), collision.centrality(), rholocal, jet.phi() - ep2); if (nmode == 2) { registry.fill(HIST("h_jet_pt_rholocal"), jet.pt() - (rholocal * jet.area()), 1.0); @@ -716,11 +732,6 @@ struct JetChargedV2 { double rcPhiPsi2; rcPhiPsi2 = randomConePhi - ep2; - for (auto const& jet : jets) { - registry.fill(HIST("h2_phi_rhophi"), jet.phi() - ep2, fFitModulationV2v3->Eval(jet.phi()), 1.0); - registry.fill(HIST("h3_centrality_rhovsphi_phi"), collision.centrality(), fFitModulationV2v3->Eval(jet.phi()), jet.phi() - ep2); - } - for (auto const& track : tracks) { if (jetderiveddatautilities::selectTrack(track, trackSelection)) { float dPhi = RecoDecay::constrainAngle(track.phi() - randomConePhi, static_cast(-o2::constants::math::PI)); @@ -849,7 +860,7 @@ struct JetChargedV2 { } } } - registry.fill(HIST("h3_centrality_deltapT_RandomCornPhi_RCprocess_rhorandomconewithoutleadingjet"), collision.centrality(), randomConePt - o2::constants::math::PI * randomConeR * randomConeR * collision.rho(), rcPhiPsi2, 1.0); + registry.fill(HIST("h2_centrality_deltapT_RandomCornPhi_RCprocess_rhorandomconewithoutleadingjet"), randomConePt - o2::constants::math::PI * randomConeR * randomConeR * collision.rho(), rcPhiPsi2, 1.0); } else if (nmode == 3) { continue; } From cb5216e56dd917495b25ffc24d3d07612a921f00 Mon Sep 17 00:00:00 2001 From: alicja-pp <101565842+alicja-pp@users.noreply.github.com> Date: Fri, 14 Mar 2025 18:36:12 +0100 Subject: [PATCH 0667/1650] [PWGCF] FemtoUniverse: add processes for analysis of MC reconstructed V0s (#10463) --- .../femtoUniverseProducerTask.cxx | 45 +++++- .../femtoUniversePairTaskTrackV0Extended.cxx | 128 ++++++++++++------ 2 files changed, 129 insertions(+), 44 deletions(-) diff --git a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx index 32f256aa2dc..9c152281a39 100644 --- a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx +++ b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx @@ -469,10 +469,10 @@ struct FemtoUniverseProducerTask { void init(InitContext&) { - if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackCascadeData || doprocessTrackD0mesonData || doprocessTrackD0DataML || doprocessTrackCentRun2Data || doprocessTrackV0CentRun2Data || doprocessTrackCentRun3Data || doprocessV0CentRun3Data || doprocessCascadeCentRun3Data || doprocessTrackDataCentPP) == false && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth || doprocessTrackMCGen || doprocessTruthAndFullMCV0 || doprocessTrackD0MC || doprocessTruthAndFullMCCasc || doprocessFullMCCent || doprocessTrackCentRun3DataMC || doprocessTruthAndFullMCCentRun3) == false) { + if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackCascadeData || doprocessTrackD0mesonData || doprocessTrackD0DataML || doprocessTrackCentRun2Data || doprocessTrackV0CentRun2Data || doprocessTrackCentRun3Data || doprocessV0CentRun3Data || doprocessCascadeCentRun3Data || doprocessTrackDataCentPP) == false && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth || doprocessTrackMCGen || doprocessTruthAndFullMCV0 || doprocessTrackD0MC || doprocessTruthAndFullMCCasc || doprocessFullMCCent || doprocessTrackCentRun3DataMC || doprocessTruthAndFullMCCentRun3 || doprocessTruthAndFullMCCentRun3V0) == false) { LOGF(fatal, "Neither processFullData nor processFullMC enabled. Please choose one."); } - if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackCascadeData || doprocessTrackD0mesonData || doprocessTrackD0DataML || doprocessTrackCentRun2Data || doprocessTrackV0CentRun2Data || doprocessTrackCentRun3Data || doprocessV0CentRun3Data || doprocessCascadeCentRun3Data || doprocessTrackDataCentPP) == true && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth || doprocessTrackMCGen || doprocessTruthAndFullMCV0 || doprocessTrackD0MC || doprocessTruthAndFullMCCasc || doprocessFullMCCent || doprocessTrackCentRun3DataMC || doprocessTruthAndFullMCCentRun3) == true) { + if ((doprocessFullData || doprocessTrackPhiData || doprocessTrackData || doprocessTrackV0 || doprocessTrackCascadeData || doprocessTrackD0mesonData || doprocessTrackD0DataML || doprocessTrackCentRun2Data || doprocessTrackV0CentRun2Data || doprocessTrackCentRun3Data || doprocessV0CentRun3Data || doprocessCascadeCentRun3Data || doprocessTrackDataCentPP) == true && (doprocessFullMC || doprocessTrackMC || doprocessTrackMCTruth || doprocessTrackMCGen || doprocessTruthAndFullMCV0 || doprocessTrackD0MC || doprocessTruthAndFullMCCasc || doprocessFullMCCent || doprocessTrackCentRun3DataMC || doprocessTruthAndFullMCCentRun3 || doprocessTruthAndFullMCCentRun3V0) == true) { LOGF(fatal, "Cannot enable process Data and process MC at the same time. " "Please choose one."); @@ -2300,6 +2300,47 @@ struct FemtoUniverseProducerTask { } PROCESS_SWITCH(FemtoUniverseProducerTask, processTruthAndFullMCV0, "Provide both MC truth and reco for tracks and V0s", false); + void processTruthAndFullMCCentRun3V0( + aod::McCollisions const& mccols, + aod::McParticles const& mcParticles, + aod::FemtoFullCollisionCentRun3MCs const& collisions, + soa::Filtered> const& tracks, + soa::Join const& fullV0s, + aod::BCsWithTimestamps const&) + { + + // recos + std::set recoMcIds; + for (const auto& col : collisions) { + auto groupedTracks = tracks.sliceBy(perCollisionTracks, col.globalIndex()); + auto groupedV0Parts = fullV0s.sliceBy(perCollisionV0s, col.globalIndex()); + getMagneticFieldTesla(col.bc_as()); + const auto colcheck = fillCollisionsCentRun3(col); + if (colcheck) { + fillTracks(groupedTracks); + fillV0(col, groupedV0Parts, groupedTracks); + } + for (const auto& track : groupedTracks) { + if (trackCuts.isSelectedMinimal(track)) + recoMcIds.insert(track.mcParticleId()); + } + } + + // truth + for (const auto& mccol : mccols) { + auto groupedCollisions = collisions.sliceBy(recoCollsPerMCCollCentPbPb, mccol.globalIndex()); + for (const auto& col : groupedCollisions) { + const auto colcheck = fillMCTruthCollisionsCentRun3(col); // fills the reco collisions for mc collision + if (colcheck) { + auto groupedMCParticles = mcParticles.sliceBy(perMCCollision, mccol.globalIndex()); + outputCollExtra(1.0, 1.0); + fillParticles(groupedMCParticles, recoMcIds); // fills mc particles + } + } + } + } + PROCESS_SWITCH(FemtoUniverseProducerTask, processTruthAndFullMCCentRun3V0, "Provide both MC truth and reco for tracks and V0s with centrality", false); + Preslice> perCollisionCascs = aod::track::collisionId; void processTruthAndFullMCCasc( aod::McCollisions const& mccols, diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx index 13f66eb53cb..2ab6c6dbb10 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx @@ -22,15 +22,12 @@ #include "Framework/runDataProcessing.h" #include "Framework/HistogramRegistry.h" #include "Framework/ASoAHelpers.h" -#include "Framework/RunningWorkflowInfo.h" -#include "Framework/StepTHn.h" #include "PWGCF/FemtoUniverse/DataModel/FemtoDerived.h" #include "PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h" #include "PWGCF/FemtoUniverse/Core/FemtoUniverseEventHisto.h" #include "PWGCF/FemtoUniverse/Core/FemtoUniversePairCleaner.h" #include "PWGCF/FemtoUniverse/Core/FemtoUniverseContainer.h" #include "PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h" -#include "PWGCF/FemtoUniverse/Core/femtoUtils.h" #include "Framework/O2DatabasePDGPlugin.h" #include #include @@ -376,28 +373,12 @@ struct FemtoUniversePairTaskTrackV0Extended { } } - void processSameEvent(FilteredFDCollision const& col, FemtoFullParticles const& parts) - { - auto groupPartsOne = partsOne->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - auto groupPartsTwo = partsTwo->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - doSameEvent(col, parts, groupPartsOne, groupPartsTwo); - } - PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processSameEvent, "Enable processing same event for track - V0", false); - - void processSameEventMCReco(FilteredFDCollision const& col, FemtoRecoParticles const& parts, aod::FdMCParticles const& mcparts) - { - auto groupPartsOne = partsOneMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - auto groupPartsTwo = partsTwoMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - doSameEvent(col, parts, groupPartsOne, groupPartsTwo, mcparts); - } - PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processSameEventMCReco, "Enable processing same event for track - V0 MC Reco", false); - /// This function processes the same event for V0 - V0 - void processSameEventV0(FilteredFDCollision const& col, FemtoFullParticles const& parts) + template + void doSameEventV0(FilteredFDCollision const& col, PartType const& parts, PartitionType& groupPartsTwo, [[maybe_unused]] MCParticles mcParts = nullptr) { const auto& magFieldTesla = col.magField(); - auto groupPartsTwo = partsTwo->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); const int multCol = confUseCent ? col.multV0M() : col.multNtr(); eventHisto.fillQA(col); @@ -455,8 +436,12 @@ struct FemtoUniversePairTaskTrackV0Extended { if (!isParticleTPC(posChild2, V0ChildTable[confV0Type2][0]) || !isParticleTPC(negChild2, V0ChildTable[confV0Type2][1])) return; - sameEventCont.setPair(p1, p2, multCol, confUse3D); + if constexpr (std::is_same::value) + sameEventCont.setPair(p1, p2, multCol, confUse3D); + else + sameEventCont.setPair(p1, p2, multCol, confUse3D); }; + if (confV0Type1 == confV0Type2) { /// Now build the combinations for identical V0s for (const auto& [p1, p2] : combinations(CombinationsStrictlyUpperIndexPolicy(groupPartsTwo, groupPartsTwo))) { @@ -470,8 +455,38 @@ struct FemtoUniversePairTaskTrackV0Extended { } } + void + processSameEvent(FilteredFDCollision const& col, FemtoFullParticles const& parts) + { + auto groupPartsOne = partsOne->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + auto groupPartsTwo = partsTwo->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + doSameEvent(col, parts, groupPartsOne, groupPartsTwo); + } + PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processSameEvent, "Enable processing same event for track - V0", false); + + void processSameEventMCReco(FilteredFDCollision const& col, FemtoRecoParticles const& parts, aod::FdMCParticles const& mcparts) + { + auto groupPartsOne = partsOneMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + auto groupPartsTwo = partsTwoMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + doSameEvent(col, parts, groupPartsOne, groupPartsTwo, mcparts); + } + PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processSameEventMCReco, "Enable processing same event for track - V0 MC Reco", false); + + /// This function processes the same event for V0 - V0 + void processSameEventV0(FilteredFDCollision const& col, FemtoFullParticles const& parts) + { + auto groupPartsTwo = partsTwo->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + doSameEventV0(col, parts, groupPartsTwo); + } PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processSameEventV0, "Enable processing same event for V0 - V0", false); + void processSameEventV0MCReco(FilteredFDCollision const& col, FemtoRecoParticles const& parts, aod::FdMCParticles const& mcparts) + { + auto groupPartsTwo = partsTwoMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + doSameEventV0(col, parts, groupPartsTwo, mcparts); + } + PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processSameEventV0MCReco, "Enable processing same event for V0 - V0 MC Reco", false); + /// This function processes MC same events for Track - V0 void processMCSameEvent(FilteredFDCollision const& col, FemtoFullParticles const& parts) { @@ -527,7 +542,7 @@ struct FemtoUniversePairTaskTrackV0Extended { PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processMCSameEvent, "Enable processing same event for MC truth track - V0", false); /// This function processes MC same events for V0 - V0 - void processMCSameEventV0(FilteredFDCollision const& col, FemtoFullParticles const& /*parts*/) + void processMCSameEventV0(FilteredFDCollision const& col, FemtoFullParticles const& parts) { auto groupPartsTwo = partsTwoMC->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); const int multCol = confUseCent ? col.multV0M() : col.multNtr(); @@ -536,10 +551,23 @@ struct FemtoUniversePairTaskTrackV0Extended { /// Histogramming same event for (const auto& part : groupPartsTwo) { + const auto& posChild = parts.iteratorAt(part.index() - 2); + const auto& negChild = parts.iteratorAt(part.index() - 1); int pdgCode = static_cast(part.pidCut()); - if ((confV0Type1 == 0 && pdgCode != 3122) || (confV0Type1 == 1 && pdgCode != -3122)) - continue; - trackHistoPartTwo.fillQA(part); + if ((confV0Type1 == 0 && pdgCode == 3122) || (confV0Type1 == 1 && pdgCode == -3122)) { + trackHistoV0Type1.fillQABase(part, HIST("V0Type1")); + posChildV0Type1.fillQABase(posChild, HIST("posChildV0Type1")); + negChildV0Type1.fillQABase(negChild, HIST("negChildV0Type1")); + qaRegistry.fill(HIST("V0Type1/hInvMassLambdaVsCent"), multCol, part.mLambda()); + qaRegistry.fill(HIST("V0Type1/hInvMassAntiLambdaVsCent"), multCol, part.mAntiLambda()); + } + if ((confV0Type2 == 0 && pdgCode == 3122) || (confV0Type2 == 1 && pdgCode == -3122)) { + trackHistoV0Type2.fillQABase(part, HIST("V0Type2")); + posChildV0Type2.fillQABase(posChild, HIST("posChildV0Type2")); + negChildV0Type2.fillQABase(negChild, HIST("negChildV0Type2")); + qaRegistry.fill(HIST("V0Type2/hInvMassLambdaVsCent"), multCol, part.mLambda()); + qaRegistry.fill(HIST("V0Type2/hInvMassAntiLambdaVsCent"), multCol, part.mAntiLambda()); + } } auto pairProcessFunc = [&](auto& p1, auto& p2) -> void { @@ -634,20 +662,9 @@ struct FemtoUniversePairTaskTrackV0Extended { } } - void processMixedEvent(FilteredFDCollisions const& cols, FemtoFullParticles const& parts) - { - doMixedEvent(cols, parts, partsOne, partsTwo); - } - PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processMixedEvent, "Enable processing mixed event for track - V0", false); - - void processMixedEventMCReco(FilteredFDCollisions const& cols, FemtoRecoParticles const& parts, aod::FdMCParticles const& mcparts) - { - doMixedEvent(cols, parts, partsOneMCReco, partsTwoMCReco, mcparts); - } - PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processMixedEventMCReco, "Enable processing mixed event for track - V0 for MC Reco", false); - /// This function processes the mixed event for V0 - V0 - void processMixedEventV0(FilteredFDCollisions const& cols, FemtoFullParticles const& parts) + template + void doMixedEventV0(FilteredFDCollisions const& cols, PartType const& parts, PartitionType& partitionTwo, [[maybe_unused]] MCParticles mcParts = nullptr) { ColumnBinningPolicy colBinningMult{{confVtxBins, confMultBins}, true}; ColumnBinningPolicy colBinningCent{{confVtxBins, confMultBins}, true}; @@ -655,8 +672,8 @@ struct FemtoUniversePairTaskTrackV0Extended { auto mixedCollProcessFunc = [&](auto& collision1, auto& collision2) -> void { const int multCol = confUseCent ? collision1.multV0M() : collision1.multNtr(); - auto groupPartsOne = partsTwo->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex(), cache); - auto groupPartsTwo = partsTwo->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision2.globalIndex(), cache); + auto groupPartsOne = partitionTwo->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex(), cache); + auto groupPartsTwo = partitionTwo->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision2.globalIndex(), cache); const auto& magFieldTesla1 = collision1.magField(); const auto& magFieldTesla2 = collision2.magField(); @@ -696,7 +713,11 @@ struct FemtoUniversePairTaskTrackV0Extended { continue; } } - mixedEventCont.setPair(p1, p2, multCol, confUse3D); + + if constexpr (std::is_same::value) + mixedEventCont.setPair(p1, p2, multCol, confUse3D); + else + mixedEventCont.setPair(p1, p2, multCol, confUse3D); } }; @@ -712,8 +733,31 @@ struct FemtoUniversePairTaskTrackV0Extended { } } } + + void processMixedEvent(FilteredFDCollisions const& cols, FemtoFullParticles const& parts) + { + doMixedEvent(cols, parts, partsOne, partsTwo); + } + PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processMixedEvent, "Enable processing mixed event for track - V0", false); + + void processMixedEventMCReco(FilteredFDCollisions const& cols, FemtoRecoParticles const& parts, aod::FdMCParticles const& mcparts) + { + doMixedEvent(cols, parts, partsOneMCReco, partsTwoMCReco, mcparts); + } + PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processMixedEventMCReco, "Enable processing mixed event for track - V0 for MC Reco", false); + + void processMixedEventV0(FilteredFDCollisions const& cols, FemtoFullParticles const& parts) + { + doMixedEventV0(cols, parts, partsTwo); + } PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processMixedEventV0, "Enable processing mixed events for V0 - V0", false); + void processMixedEventV0MCReco(FilteredFDCollisions const& cols, FemtoRecoParticles const& parts, aod::FdMCParticles const& mcparts) + { + doMixedEventV0(cols, parts, partsTwoMCReco, mcparts); + } + PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processMixedEventV0MCReco, "Enable processing mixed event for V0 - V0 for MC Reco", false); + /// This function processes MC mixed events for Track - V0 void processMCMixedEvent(FilteredFDCollisions const& cols, FemtoFullParticles const& parts) { From 18a0f073de38c38ae6e457f0d0f9966b0f2757fe Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Sat, 15 Mar 2025 02:43:25 +0900 Subject: [PATCH 0668/1650] [PWGEM/PhotonMeson] add histograms for misidentified ee as V0 photons in MC (#10466) --- PWGEM/PhotonMeson/DataModel/gammaTables.h | 4 +- .../TableProducer/photonconversionbuilder.cxx | 2 +- .../TableProducer/skimmerGammaConversion.cxx | 2 +- .../skimmerPrimaryElectronFromDalitzEE.cxx | 2 +- PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx | 8 +- PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx | 18 ++--- PWGEM/PhotonMeson/Tasks/pcmQC.cxx | 2 - PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx | 78 ++++++++++++------- 8 files changed, 68 insertions(+), 48 deletions(-) diff --git a/PWGEM/PhotonMeson/DataModel/gammaTables.h b/PWGEM/PhotonMeson/DataModel/gammaTables.h index 27927173f63..0abbc3bfe76 100644 --- a/PWGEM/PhotonMeson/DataModel/gammaTables.h +++ b/PWGEM/PhotonMeson/DataModel/gammaTables.h @@ -175,7 +175,7 @@ DECLARE_SOA_TABLE(V0Legs, "AOD", "V0LEG", //! track::TPCChi2NCl, track::TPCInnerParam, track::TPCSignal, pidtpc::TPCNSigmaEl, pidtpc::TPCNSigmaPi, track::ITSClusterSizes, track::ITSChi2NCl, track::DetectorMap, - track::X, track::Y, track::Z, track::Tgl, track::C1Pt21Pt2, + track::X, track::Y, track::Z, track::Tgl, // dynamic column v0leg::P, @@ -284,7 +284,7 @@ using V0PhotonKFPrefilterBitDerived = V0PhotonsKFPrefilterBitDerived::iterator; DECLARE_SOA_TABLE(EMPrimaryElectronsFromDalitz, "AOD", "EMPRIMARYELDA", //! o2::soa::Index<>, emprimaryelectron::CollisionId, emprimaryelectron::TrackId, emprimaryelectron::Sign, - track::Pt, track::Eta, track::Phi, track::DcaXY, track::DcaZ, track::CYY, track::CZY, track::CZZ, track::C1Pt21Pt2, + track::Pt, track::Eta, track::Phi, track::DcaXY, track::DcaZ, track::CYY, track::CZY, track::CZZ, track::TPCNClsFindable, track::TPCNClsFindableMinusFound, track::TPCNClsFindableMinusCrossedRows, track::TPCNClsShared, track::TPCChi2NCl, track::TPCInnerParam, track::TPCSignal, pidtpc::TPCNSigmaEl, pidtpc::TPCNSigmaPi, diff --git a/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx b/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx index 6e104d55623..96fc0d0d6d8 100644 --- a/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx +++ b/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx @@ -369,7 +369,7 @@ struct PhotonConversionBuilder { track.tpcChi2NCl(), track.tpcInnerParam(), track.tpcSignal(), track.tpcNSigmaEl(), track.tpcNSigmaPi(), track.itsClusterSizes(), track.itsChi2NCl(), track.detectorMap(), - shiftedtrack.getX(), shiftedtrack.getY(), shiftedtrack.getZ(), shiftedtrack.getTgl(), shiftedtrack.getSigma1Pt2()); + shiftedtrack.getX(), shiftedtrack.getY(), shiftedtrack.getZ(), shiftedtrack.getTgl()); } template diff --git a/PWGEM/PhotonMeson/TableProducer/skimmerGammaConversion.cxx b/PWGEM/PhotonMeson/TableProducer/skimmerGammaConversion.cxx index c9d602d247f..6a39aea8881 100644 --- a/PWGEM/PhotonMeson/TableProducer/skimmerGammaConversion.cxx +++ b/PWGEM/PhotonMeson/TableProducer/skimmerGammaConversion.cxx @@ -190,7 +190,7 @@ struct skimmerGammaConversion { theTrack.tpcChi2NCl(), theTrack.tpcInnerParam(), theTrack.tpcSignal(), theTrack.tpcNSigmaEl(), theTrack.tpcNSigmaPi(), theTrack.itsClusterSizes(), theTrack.itsChi2NCl(), theTrack.detectorMap(), - theTrack.x(), theTrack.y(), theTrack.z(), theTrack.tgl(), theTrack.c1Pt21Pt2()); + theTrack.x(), theTrack.y(), theTrack.z(), theTrack.tgl()); } template diff --git a/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx b/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx index 23f8510ba15..a0c9ccfd5e6 100644 --- a/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx +++ b/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx @@ -268,7 +268,7 @@ struct skimmerPrimaryElectronFromDalitzEE { { if (std::find(stored_trackIds.begin(), stored_trackIds.end(), std::make_pair(collision.globalIndex(), track.globalIndex())) == stored_trackIds.end()) { emprimaryelectrons(collision.globalIndex(), track.globalIndex(), track.sign(), - track.pt(), track.eta(), track.phi(), track.dcaXY(), track.dcaZ(), track.cYY(), track.cZY(), track.cZZ(), track.c1Pt21Pt2(), + track.pt(), track.eta(), track.phi(), track.dcaXY(), track.dcaZ(), track.cYY(), track.cZY(), track.cZZ(), track.tpcNClsFindable(), track.tpcNClsFindableMinusFound(), track.tpcNClsFindableMinusCrossedRows(), track.tpcNClsShared(), track.tpcChi2NCl(), track.tpcInnerParam(), track.tpcSignal(), track.tpcNSigmaEl(), track.tpcNSigmaPi(), diff --git a/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx b/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx index 31be005c306..94afd4911e1 100644 --- a/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx +++ b/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx @@ -142,7 +142,7 @@ struct DalitzEEQC { if (d_bz_input > -990) { d_bz = d_bz_input; o2::parameters::GRPMagField grpmag; - if (fabs(d_bz) > 1e-5) { + if (std::fabs(d_bz) > 1e-5) { grpmag.setL3Current(30000.f / (d_bz / 5.0f)); } mRunNumber = collision.runNumber(); @@ -186,9 +186,8 @@ struct DalitzEEQC { fRegistry.add("Track/hPt", "pT;p_{T} (GeV/c)", kTH1F, {{1000, 0.0f, 10}}, false); fRegistry.add("Track/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{400, -20, 20}}, false); - fRegistry.add("Track/hRelDeltaPt", "pT resolution;p_{T} (GeV/c);#Deltap_{T}/p_{T}", kTH2F, {{1000, 0, 10}, {200, 0, 0.2}}, false); fRegistry.add("Track/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {40, -2.0f, 2.0f}}, false); - fRegistry.add("Track/hDCAxyz", "DCA xy vs. z;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -1.0f, 1.0f}, {200, -1.0f, 1.0f}}, false); + fRegistry.add("Track/hDCAxyz", "DCA xy vs. z;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -0.1f, 0.1f}, {200, -0.1f, 0.1f}}, false); fRegistry.add("Track/hDCAxyzSigma", "DCA xy vs. z;DCA_{xy} (#sigma);DCA_{z} (#sigma)", kTH2F, {{200, -10.0f, 10.0f}, {200, -10.0f, 10.0f}}, false); fRegistry.add("Track/hDCAxyRes_Pt", "DCA_{xy} resolution vs. pT;p_{T} (GeV/c);DCA_{xy} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0., 500}}, false); fRegistry.add("Track/hDCAzRes_Pt", "DCA_{z} resolution vs. pT;p_{T} (GeV/c);DCA_{z} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0., 500}}, false); @@ -277,7 +276,7 @@ struct DalitzEEQC { ROOT::Math::PtEtaPhiMVector v1(t1.pt(), t1.eta(), t1.phi(), o2::constants::physics::MassElectron); ROOT::Math::PtEtaPhiMVector v2(t2.pt(), t2.eta(), t2.phi(), o2::constants::physics::MassElectron); ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - if (abs(v12.Rapidity()) > maxY) { + if (std::fabs(v12.Rapidity()) > maxY) { return false; } float phiv = o2::aod::pwgem::dilepton::utils::pairutil::getPhivPair(t1.px(), t1.py(), t1.pz(), t2.px(), t2.py(), t2.pz(), t1.sign(), t2.sign(), d_bz); @@ -317,7 +316,6 @@ struct DalitzEEQC { { fRegistry.fill(HIST("Track/hPt"), track.pt()); fRegistry.fill(HIST("Track/hQoverPt"), track.sign() / track.pt()); - fRegistry.fill(HIST("Track/hRelDeltaPt"), track.pt(), std::sqrt(track.c1Pt21Pt2()) * track.pt()); fRegistry.fill(HIST("Track/hEtaPhi"), track.phi(), track.eta()); fRegistry.fill(HIST("Track/hDCAxyz"), track.dcaXY(), track.dcaZ()); fRegistry.fill(HIST("Track/hDCAxyzSigma"), track.dcaXY() / sqrt(track.cYY()), track.dcaZ() / sqrt(track.cZZ())); diff --git a/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx b/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx index 30457fecb83..1ad6750af0f 100644 --- a/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx @@ -159,9 +159,8 @@ struct DalitzEEQCMC { // track info fRegistry.add("Track/hPt", "pT;p_{T} (GeV/c)", kTH1F, {{1000, 0.0f, 10}}, false); fRegistry.add("Track/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{400, -20, 20}}, false); - fRegistry.add("Track/hRelDeltaPt", "pT resolution;p_{T} (GeV/c);#Deltap_{T}/p_{T}", kTH2F, {{1000, 0, 10}, {200, 0, 0.2}}, false); fRegistry.add("Track/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {40, -2.0f, 2.0f}}, false); - fRegistry.add("Track/hDCAxyz", "DCA xy vs. z;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -1.0f, 1.0f}, {200, -1.0f, 1.0f}}, false); + fRegistry.add("Track/hDCAxyz", "DCA xy vs. z;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -0.1f, 0.1f}, {200, -0.1f, 0.1f}}, false); fRegistry.add("Track/hDCAxyzSigma", "DCA xy vs. z;DCA_{xy} (#sigma);DCA_{z} (#sigma)", kTH2F, {{200, -10.0f, 10.0f}, {200, -10.0f, 10.0f}}, false); fRegistry.add("Track/hDCAxyRes_Pt", "DCA_{xy} resolution vs. pT;p_{T} (GeV/c);DCA_{xy} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0., 500}}, false); fRegistry.add("Track/hDCAzRes_Pt", "DCA_{z} resolution vs. pT;p_{T} (GeV/c);DCA_{z} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0., 500}}, false); @@ -213,7 +212,7 @@ struct DalitzEEQCMC { if (d_bz_input > -990) { d_bz = d_bz_input; o2::parameters::GRPMagField grpmag; - if (fabs(d_bz) > 1e-5) { + if (std::fabs(d_bz) > 1e-5) { grpmag.setL3Current(30000.f / (d_bz / 5.0f)); } mRunNumber = collision.runNumber(); @@ -307,7 +306,7 @@ struct DalitzEEQCMC { template bool isInAcceptance(T const& t1) { - if ((mctrackcuts.min_mcPt < t1.pt() && t1.pt() < mctrackcuts.max_mcPt) && abs(t1.eta()) < mctrackcuts.max_mcEta) { + if ((mctrackcuts.min_mcPt < t1.pt() && t1.pt() < mctrackcuts.max_mcPt) && std::fabs(t1.eta()) < mctrackcuts.max_mcEta) { return true; } else { return false; @@ -335,7 +334,7 @@ struct DalitzEEQCMC { ROOT::Math::PtEtaPhiMVector v1(t1.pt(), t1.eta(), t1.phi(), o2::constants::physics::MassElectron); ROOT::Math::PtEtaPhiMVector v2(t2.pt(), t2.eta(), t2.phi(), o2::constants::physics::MassElectron); ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - if (abs(v12.Rapidity()) > maxY) { + if (std::fabs(v12.Rapidity()) > maxY) { return false; } float phiv = o2::aod::pwgem::dilepton::utils::pairutil::getPhivPair(t1.px(), t1.py(), t1.pz(), t2.px(), t2.py(), t2.pz(), t1.sign(), t2.sign(), d_bz); @@ -348,7 +347,7 @@ struct DalitzEEQCMC { if (mcmother.isPhysicalPrimary() || mcmother.producedByGenerator()) { if ((t1mc.isPhysicalPrimary() || t1mc.producedByGenerator()) && (t2mc.isPhysicalPrimary() || t2mc.producedByGenerator())) { - switch (abs(mcmother.pdgCode())) { + switch (std::abs(mcmother.pdgCode())) { case 111: fRegistry.fill(HIST("Pair/sm/Pi0/hMvsPt"), v12.M(), v12.Pt()); fRegistry.fill(HIST("Pair/sm/Pi0/hMvsPhiV"), phiv, v12.M()); @@ -377,7 +376,7 @@ struct DalitzEEQCMC { break; } } else if (!(t1mc.isPhysicalPrimary() || t1mc.producedByGenerator()) && !(t2mc.isPhysicalPrimary() || t2mc.producedByGenerator())) { - switch (abs(mcmother.pdgCode())) { + switch (std::abs(mcmother.pdgCode())) { case 22: fRegistry.fill(HIST("Pair/sm/Photon/hMvsPt"), v12.M(), v12.Pt()); fRegistry.fill(HIST("Pair/sm/Photon/hMvsPhiV"), phiv, v12.M()); @@ -421,7 +420,6 @@ struct DalitzEEQCMC { { fRegistry.fill(HIST("Track/hPt"), track.pt()); fRegistry.fill(HIST("Track/hQoverPt"), track.sign() / track.pt()); - fRegistry.fill(HIST("Track/hRelDeltaPt"), track.pt(), std::sqrt(track.c1Pt21Pt2()) * track.pt()); fRegistry.fill(HIST("Track/hEtaPhi"), track.phi(), track.eta()); fRegistry.fill(HIST("Track/hDCAxyz"), track.dcaXY(), track.dcaZ()); fRegistry.fill(HIST("Track/hDCAxyzSigma"), track.dcaXY() / sqrt(track.cYY()), track.dcaZ() / sqrt(track.cZZ())); @@ -542,7 +540,7 @@ struct DalitzEEQCMC { ROOT::Math::PtEtaPhiMVector v2(t2.pt(), t2.eta(), t2.phi(), o2::constants::physics::MassElectron); ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - if (abs(v12.Rapidity()) > maxY) { + if (std::fabs(v12.Rapidity()) > maxY) { continue; } @@ -550,7 +548,7 @@ struct DalitzEEQCMC { auto mcmother = mcparticles.iteratorAt(mother_id); if (mcmother.isPhysicalPrimary() || mcmother.producedByGenerator()) { - switch (abs(mcmother.pdgCode())) { + switch (std::abs(mcmother.pdgCode())) { case 111: fRegistry.fill(HIST("Generated/sm/Pi0/hMvsPt"), v12.M(), v12.Pt()); break; diff --git a/PWGEM/PhotonMeson/Tasks/pcmQC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQC.cxx index c7660624bc1..81fbd5328ef 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQC.cxx @@ -162,7 +162,6 @@ struct PCMQC { // v0leg info fRegistry.add("V0Leg/hPt", "pT;p_{T,e} (GeV/c)", kTH1F, {{1000, 0.0f, 10}}, false); fRegistry.add("V0Leg/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{1000, -50, 50}}, false); - fRegistry.add("V0Leg/hRelDeltaPt", "pT resolution;p_{T} (GeV/c);#Deltap_{T}/p_{T}", kTH2F, {{1000, 0, 10}, {200, 0, 0.2}}, false); fRegistry.add("V0Leg/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{90, 0, 2 * M_PI}, {200, -1.0f, 1.0f}}, false); fRegistry.add("V0Leg/hDCAxyz", "DCA xy vs. z;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -50.0f, 50.0f}, {200, -50.0f, 50.0f}}, false); fRegistry.add("V0Leg/hNclsTPC", "number of TPC clusters", kTH1F, {{161, -0.5, 160.5}}, false); @@ -312,7 +311,6 @@ struct PCMQC { { fRegistry.fill(HIST("V0Leg/hPt"), leg.pt()); fRegistry.fill(HIST("V0Leg/hQoverPt"), leg.sign() / leg.pt()); - fRegistry.fill(HIST("V0Leg/hRelDeltaPt"), leg.pt(), std::sqrt(leg.c1Pt21Pt2()) * leg.pt()); fRegistry.fill(HIST("V0Leg/hEtaPhi"), leg.phi(), leg.eta()); fRegistry.fill(HIST("V0Leg/hDCAxyz"), leg.dcaXY(), leg.dcaZ()); fRegistry.fill(HIST("V0Leg/hNclsITS"), leg.itsNCls()); diff --git a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx index d90338fe94d..d5d3eaa0afd 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx @@ -114,7 +114,7 @@ struct PCMQCMC { HistogramRegistry fRegistry{"output", {}, OutputObjHandlingPolicy::AnalysisObject, false, false}; static constexpr std::string_view event_types[2] = {"before/", "after/"}; - static constexpr std::string_view mcphoton_types[3] = {"primary/", "fromWD/", "fromHS/"}; + static constexpr std::string_view mcphoton_types[5] = {"primary/", "fromWD/", "fromHS/", "fromPi0Dalitz/", "fromEtaDalitz"}; void init(InitContext&) { @@ -200,7 +200,7 @@ struct PCMQCMC { fRegistry.add("V0/primary/hEtaResolution", "#eta resolution;p_{#gamma} (GeV/c);#Delta#eta", kTH2F, {{1000, 0.0f, 10}, {100, 0, 0.01}}, false); fRegistry.add("V0/primary/hThetaResolution", "#theta resolution;p_{#gamma} (GeV/c);#Delta#theta (rad.)", kTH2F, {{1000, 0.0f, 10}, {100, 0, 0.01}}, false); fRegistry.add("V0/primary/hPhiResolution", "#varphi resolution;p_{#gamma} (GeV/c);#Delta#varphi (rad.)", kTH2F, {{1000, 0.0f, 10}, {100, 0, 0.01}}, false); - fRegistry.add("V0/primary/hNgamma", "Number of true #gamma per collision", kTH1F, {{101, -0.5f, 100.5f}}); + fRegistry.add("V0/primary/hNgamma", "Number of true #gamma per collision;N_{#gamma} per event;Number of events", kTH1F, {{101, -0.5f, 100.5f}}); fRegistry.add("V0/primary/hConvPoint_diffX", "conversion point diff X MC;X_{MC} (cm);X_{rec} - X_{MC} (cm)", kTH2F, {{200, -100, +100}, {100, -50.0f, 50.0f}}, true); fRegistry.add("V0/primary/hConvPoint_diffY", "conversion point diff Y MC;Y_{MC} (cm);Y_{rec} - Y_{MC} (cm)", kTH2F, {{200, -100, +100}, {100, -50.0f, 50.0f}}, true); fRegistry.add("V0/primary/hConvPoint_diffZ", "conversion point diff Z MC;Z_{MC} (cm);Z_{rec} - Z_{MC} (cm)", kTH2F, {{200, -100, +100}, {100, -50.0f, 50.0f}}, true); @@ -210,13 +210,14 @@ struct PCMQCMC { fRegistry.add("V0/primary/hXY_MC", "X vs. Y of true photon conversion point.;X (cm);Y (cm)", kTH2F, {{400, -100.0f, +100}, {400, -100, +100}}, true); fRegistry.add("V0/primary/hRZ_MC", "R vs. Z of true photon conversion point;Z (cm);R_{xy} (cm)", kTH2F, {{200, -100.0f, +100}, {200, 0, 100}}, true); fRegistry.add("V0/primary/hsConvPoint", "photon conversion point;r_{xy} (cm);#varphi (rad.);#eta;", kTHnSparseF, {{100, 0.0f, 100}, {90, 0, 2 * M_PI}, {80, -2, +2}}, false); - fRegistry.addClone("V0/primary/", "V0/fromWD/"); // from weak decay - fRegistry.addClone("V0/primary/", "V0/fromHS/"); // from hadronic shower in detector materials + fRegistry.addClone("V0/primary/", "V0/fromWD/"); // from weak decay + fRegistry.addClone("V0/primary/", "V0/fromHS/"); // from hadronic shower in detector materials + fRegistry.addClone("V0/primary/", "V0/fromPi0Dalitz/"); // misidentified dielectron from pi0 dalitz decay + fRegistry.addClone("V0/primary/", "V0/fromEtaDalitz/"); // misidentified dielectron from eta dalitz decay // v0leg info fRegistry.add("V0Leg/primary/hPt", "pT;p_{T,e} (GeV/c)", kTH1F, {{1000, 0.0f, 10}}, false); fRegistry.add("V0Leg/primary/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{1000, -50, 50}}, false); - fRegistry.add("V0Leg/primary/hRelDeltaPt", "pT resolution;p_{T} (GeV/c);#Deltap_{T}/p_{T}", kTH2F, {{1000, 0, 10}, {200, 0, 0.2}}, false); fRegistry.add("V0Leg/primary/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{90, 0, 2 * M_PI}, {200, -1.0f, 1.0f}}, false); fRegistry.add("V0Leg/primary/hDCAxyz", "DCA xy vs. z;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -50.0f, 50.0f}, {200, -50.0f, 50.0f}}, false); fRegistry.add("V0Leg/primary/hNclsTPC", "number of TPC clusters", kTH1F, {{161, -0.5, 160.5}}, false); @@ -381,7 +382,6 @@ struct PCMQCMC { fRegistry.fill(HIST("V0Leg/") + HIST(mcphoton_types[mctype]) + HIST("hPt"), leg.pt()); fRegistry.fill(HIST("V0Leg/") + HIST(mcphoton_types[mctype]) + HIST("hQoverPt"), leg.sign() / leg.pt()); fRegistry.fill(HIST("V0Leg/") + HIST(mcphoton_types[mctype]) + HIST("hEtaPhi"), leg.phi(), leg.eta()); - fRegistry.fill(HIST("V0Leg/") + HIST(mcphoton_types[mctype]) + HIST("hRelDeltaPt"), leg.pt(), std::sqrt(leg.c1Pt21Pt2()) * leg.pt()); fRegistry.fill(HIST("V0Leg/") + HIST(mcphoton_types[mctype]) + HIST("hDCAxyz"), leg.dcaXY(), leg.dcaZ()); fRegistry.fill(HIST("V0Leg/") + HIST(mcphoton_types[mctype]) + HIST("hNclsITS"), leg.itsNCls()); fRegistry.fill(HIST("V0Leg/") + HIST(mcphoton_types[mctype]) + HIST("hNclsTPC"), leg.tpcNClsFound()); @@ -430,7 +430,7 @@ struct PCMQCMC { fRegistry.fill(HIST("Event/after/hCollisionCounter"), 10.0); // accepted auto V0Photons_coll = v0photons.sliceBy(perCollision, collision.globalIndex()); - int ng_primary = 0, ng_wd = 0, ng_hs = 0; + int ng_primary = 0, ng_wd = 0, ng_hs = 0, nee_pi0 = 0, nee_eta = 0; for (auto& v0 : V0Photons_coll) { auto pos = v0.posTrack_as(); auto ele = v0.negTrack_as(); @@ -443,39 +443,65 @@ struct PCMQCMC { continue; } int photonid = FindCommonMotherFrom2Prongs(posmc, elemc, -11, 11, 22, mcparticles); - if (photonid < 0) { + int pi0id = FindCommonMotherFrom2Prongs(posmc, elemc, -11, 11, 111, mcparticles); // pi0 dalitz decay + int etaid = FindCommonMotherFrom2Prongs(posmc, elemc, -11, 11, 221, mcparticles); // eta dalitz decay + if (photonid < 0 && pi0id < 0 && etaid < 0) { continue; } - auto mcphoton = mcparticles.iteratorAt(photonid); - if (cfgRequireTrueAssociation && (mcphoton.emmceventId() != collision.emmceventId())) { - continue; - } + if (photonid > 0) { + auto mcphoton = mcparticles.iteratorAt(photonid); + if (cfgRequireTrueAssociation && (mcphoton.emmceventId() != collision.emmceventId())) { + continue; + } - if (mcphoton.isPhysicalPrimary() || mcphoton.producedByGenerator()) { - fillV0Info<0>(v0, mcphoton, elemc); - for (auto& leg : {pos, ele}) { - fillV0LegInfo<0>(leg); + if (mcphoton.isPhysicalPrimary() || mcphoton.producedByGenerator()) { + fillV0Info<0>(v0, mcphoton, elemc); + for (auto& leg : {pos, ele}) { + fillV0LegInfo<0>(leg); + } + ng_primary++; + } else if (IsFromWD(mcphoton.template emmcevent_as(), mcphoton, mcparticles) > 0) { + fillV0Info<1>(v0, mcphoton, elemc); + for (auto& leg : {pos, ele}) { + fillV0LegInfo<1>(leg); + } + ng_wd++; + } else { + fillV0Info<2>(v0, mcphoton, elemc); + for (auto& leg : {pos, ele}) { + fillV0LegInfo<2>(leg); + } + ng_hs++; + // LOGF(info, "mcphoton.vx() = %f, mcphoton.vy() = %f, mcphoton.vz() = %f, mother_pdg = %d", mcphoton.vx(), mcphoton.vy(), mcphoton.vz(), mother_pdg); } - ng_primary++; - } else if (IsFromWD(mcphoton.template emmcevent_as(), mcphoton, mcparticles) > 0) { - fillV0Info<1>(v0, mcphoton, elemc); + } else if (pi0id > 0) { + auto mcpi0 = mcparticles.iteratorAt(photonid); + if (cfgRequireTrueAssociation && (mcpi0.emmceventId() != collision.emmceventId())) { + continue; + } + fillV0Info<3>(v0, mcpi0, elemc); for (auto& leg : {pos, ele}) { - fillV0LegInfo<1>(leg); + fillV0LegInfo<3>(leg); + } + nee_pi0++; + } else if (etaid > 0) { + auto mceta = mcparticles.iteratorAt(photonid); + if (cfgRequireTrueAssociation && (mceta.emmceventId() != collision.emmceventId())) { + continue; } - ng_wd++; - } else { - fillV0Info<2>(v0, mcphoton, elemc); + fillV0Info<4>(v0, mceta, elemc); for (auto& leg : {pos, ele}) { - fillV0LegInfo<2>(leg); + fillV0LegInfo<4>(leg); } - ng_hs++; - // LOGF(info, "mcphoton.vx() = %f, mcphoton.vy() = %f, mcphoton.vz() = %f, mother_pdg = %d", mcphoton.vx(), mcphoton.vy(), mcphoton.vz(), mother_pdg); + nee_eta++; } } // end of v0 loop fRegistry.fill(HIST("V0/primary/hNgamma"), ng_primary); fRegistry.fill(HIST("V0/fromWD/hNgamma"), ng_wd); fRegistry.fill(HIST("V0/fromHS/hNgamma"), ng_hs); + fRegistry.fill(HIST("V0/fromPi0Dalitz/hNgamma"), nee_pi0); + fRegistry.fill(HIST("V0/fromEtaDalitz/hNgamma"), nee_eta); } // end of collision loop } // end of process From a3c013ce55fa919c0fdc3f686e2de2fedd4c2498 Mon Sep 17 00:00:00 2001 From: Chiara Pinto <48326672+chiarapinto@users.noreply.github.com> Date: Fri, 14 Mar 2025 19:07:52 +0100 Subject: [PATCH 0669/1650] [PWGLF] add histograms for systematics (#10469) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Nuspex/antinucleiInJets.cxx | 135 ++++++++++++++++++++++++ 1 file changed, 135 insertions(+) diff --git a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx index b2dc3054210..3c216f3f54b 100644 --- a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx +++ b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx @@ -196,6 +196,12 @@ struct AntinucleiInJets { // helium-3 registryData.add("helium3_jet_tpc", "helium3_jet_tpc", HistType::kTH2F, {{nbins, min * 3, max * 3, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}}); registryData.add("helium3_ue_tpc", "helium3_ue_tpc", HistType::kTH2F, {{nbins, min * 3, max * 3, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}}); + + // systematic variations + registryData.add("antiproton_tpc_syst", "antiproton_tpc_syst", HistType::kTHnSparseF, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}, {10, 0, 10, "systematic uncertainty"}}); + registryData.add("antiproton_tof_syst", "antiproton_tof_syst", HistType::kTHnSparseF, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TOF}"}, {10, 0, 10, "systematic uncertainty"}}); + registryData.add("antideuteron_tpc_syst", "antideuteron_tpc_syst", HistType::kTHnSparseF, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}, {10, 0, 10, "systematic uncertainty"}}); + registryData.add("antideuteron_tof_syst", "antideuteron_tof_syst", HistType::kTHnSparseF, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TOF}"}, {10, 0, 10, "systematic uncertainty"}}); } // monte carlo histograms @@ -1172,6 +1178,135 @@ struct AntinucleiInJets { } } PROCESS_SWITCH(AntinucleiInJets, processJetsMCrec, "process jets MC rec", false); + + // Process Systematics + void processSystematicsData(SelectedCollisions::iterator const& collision, FullNucleiTracks const& tracks) + { + const int nSystematics = 10; + int itsNclustersSyst[nSystematics] = {5, 6, 5, 4, 5, 3, 5, 6, 3, 4}; + float tpcNcrossedRowsSyst[nSystematics] = {100, 85, 80, 110, 95, 90, 105, 95, 100, 105}; + float dcaxySyst[nSystematics] = {0.05, 0.07, 0.10, 0.03, 0.06, 0.15, 0.08, 0.04, 0.09, 0.10}; + float dcazSyst[nSystematics] = {0.1, 0.15, 0.3, 0.075, 0.12, 0.18, 0.2, 0.1, 0.15, 0.2}; + + // event selection + if (!collision.sel8() || std::fabs(collision.posZ()) > zVtx) + return; + + // loop over reconstructed tracks + int id(-1); + std::vector fjParticles; + for (auto const& track : tracks) { + id++; + if (!passedTrackSelectionForJetReconstruction(track)) + continue; + + // 4-momentum representation of a particle + fastjet::PseudoJet fourMomentum(track.px(), track.py(), track.pz(), track.energy(MassPionCharged)); + fourMomentum.set_user_index(id); + fjParticles.emplace_back(fourMomentum); + } + + // reject empty events + if (fjParticles.size() < 1) + return; + + // cluster particles using the anti-kt algorithm + fastjet::JetDefinition jetDef(fastjet::antikt_algorithm, rJet); + fastjet::AreaDefinition areaDef(fastjet::active_area, fastjet::GhostedAreaSpec(1.0)); // active_area_explicit_ghosts + fastjet::ClusterSequenceArea cs(fjParticles, jetDef, areaDef); + std::vector jets = fastjet::sorted_by_pt(cs.inclusive_jets()); + auto [rhoPerp, rhoMPerp] = backgroundSub.estimateRhoPerpCone(fjParticles, jets); + + // loop over reconstructed jets + for (auto& jet : jets) { + + // jet must be fully contained in the acceptance + if ((std::fabs(jet.eta()) + rJet) > (maxEta - deltaEtaEdge)) + continue; + + // jet pt must be larger than threshold + fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jet, rhoPerp, rhoMPerp); + if (getCorrectedPt(jetMinusBkg.pt()) < minJetPt) + continue; + + // get jet constituents + std::vector jetConstituents = jet.constituents(); + o2::aod::ITSResponse itsResponse; + + // loop over jet constituents + for (const auto& particle : jetConstituents) { + for (int i = 0; i < nSystematics; i++) { + // get corresponding track and apply track selection criteria + auto const& track = tracks.iteratorAt(particle.user_index()); + + // variables + double nsigmaTPCPr = track.tpcNSigmaPr(); + double nsigmaTOFPr = track.tofNSigmaPr(); + double nsigmaTPCDe = track.tpcNSigmaDe(); + double nsigmaTOFDe = track.tofNSigmaDe(); + double pt = track.pt(); + double dcaxy = track.dcaXY(); + double dcaz = track.dcaZ(); + + if (requirePvContributor && !(track.isPVContributor())) + continue; + if (!track.hasITS()) + continue; + if (track.itsNCls() < itsNclustersSyst[i]) + continue; + if (!track.hasTPC()) + continue; + if (track.tpcNClsCrossedRows() < tpcNcrossedRowsSyst[i]) + continue; + if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < minTpcNcrossedRowsOverFindable) + continue; + if (track.tpcChi2NCl() > maxChiSquareTpc) + continue; + if (track.itsChi2NCl() > maxChiSquareIts) + continue; + if (track.eta() < minEta || track.eta() > maxEta) + continue; + if (track.pt() < minPt) + continue; + if (std::fabs(dcaxy) > dcaxySyst[i]) + continue; + if (std::fabs(dcaz) > dcazSyst[i]) + continue; + + bool passedItsPidProt(false), passedItsPidDeut(false); + if (itsResponse.nSigmaITS(track) > nSigmaItsMin && itsResponse.nSigmaITS(track) < nSigmaItsMax) { + passedItsPidProt = true; + } + if (itsResponse.nSigmaITS(track) > nSigmaItsMin && itsResponse.nSigmaITS(track) < nSigmaItsMax) { + passedItsPidDeut = true; + } + if (!applyItsPid) { + passedItsPidProt = true; + passedItsPidDeut = true; + } + if (pt > ptMaxItsPidProt) + passedItsPidProt = true; + if (pt > ptMaxItsPidDeut) + passedItsPidDeut = true; + + // antimatter + if (track.sign() < 0) { + if (passedItsPidProt) { + registryData.fill(HIST("antiproton_tpc_syst"), pt, nsigmaTPCPr, i); + if (nsigmaTPCPr > minNsigmaTpc && nsigmaTPCPr < maxNsigmaTpc && track.hasTOF()) + registryData.fill(HIST("antiproton_tof_syst"), pt, nsigmaTOFPr, i); + } + if (passedItsPidDeut) { + registryData.fill(HIST("antideuteron_tpc_syst"), pt, nsigmaTPCDe, i); + if (nsigmaTPCDe > minNsigmaTpc && nsigmaTPCDe < maxNsigmaTpc && track.hasTOF()) + registryData.fill(HIST("antideuteron_tof_syst"), pt, nsigmaTOFDe, i); + } + } + } + } + } + } + PROCESS_SWITCH(AntinucleiInJets, processSystematicsData, "Process Systematics", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From b5152196ccd48d88cd957a05e3fd121b07205e01 Mon Sep 17 00:00:00 2001 From: Victor Gonzalez Date: Fri, 14 Mar 2025 19:32:09 +0100 Subject: [PATCH 0670/1650] [PWGCF] DptDpt - Incorporating ITS only track selection (#10473) Co-authored-by: Victor --- PWGCF/TableProducer/dptdptfilter.h | 37 +++++++++++++++++-- .../Tasks/dptDptEfficiencyAndQc.cxx | 2 +- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/PWGCF/TableProducer/dptdptfilter.h b/PWGCF/TableProducer/dptdptfilter.h index e83587208a1..e7554ee35ac 100644 --- a/PWGCF/TableProducer/dptdptfilter.h +++ b/PWGCF/TableProducer/dptdptfilter.h @@ -228,7 +228,9 @@ std::vector trackFilters = {}; // the vector of tr std::vector> maxDcaZPtDeps = {}; // max dca in z axis as function of pT for each track selector TrackSelection* extraTrackFilter = nullptr; bool dca2Dcut = false; -float sharedTpcClusters = 1.0; ///< max fraction of shared TPC clusters +/// TODO: to incorporate our own track selectio object +float sharedTpcClusters = 1.0; ///< max fraction of shared TPC clusters +float sharedTpcClustersExtra = 1.0; ///< max fraction of shared TPC clusters for the extra track filter float maxDCAz = 1e6f; float maxDCAxy = 1e6f; @@ -263,12 +265,22 @@ inline void initializeTrackSelection(TrackSelectionTuneCfg& tune) }; auto highQualityTpcTrack = []() { TrackSelection* tpcTrack = new TrackSelection(getGlobalTrackSelection()); + tpcTrack->SetTrackType(o2::aod::track::TrackTypeEnum::Track); tpcTrack->ResetITSRequirements(); tpcTrack->SetRequireITSRefit(false); tpcTrack->SetMinNClustersTPC(120); - sharedTpcClusters = 0.2; + sharedTpcClustersExtra = 0.2; return tpcTrack; }; + auto itsOnlyTrack = []() { + TrackSelection* itsTrack = new TrackSelection(); + itsTrack->SetTrackType(o2::aod::track::TrackTypeEnum::Track); + itsTrack->SetRequireITSRefit(true); + itsTrack->SetRequireHitsInITSLayers(2, {0, 1, 2}); + itsTrack->SetMaxChi2PerClusterITS(36.0f); + itsTrack->SetMaxDcaXYPtDep([](float pt) { return 0.004f + 0.013f / pt; }); + return itsTrack; + }; switch (tracktype) { case 1: { /* Run2 global track */ TrackSelection* globalRun2 = new TrackSelection(getGlobalTrackSelection()); @@ -382,6 +394,22 @@ inline void initializeTrackSelection(TrackSelectionTuneCfg& tune) addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSall7Layers, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }); extraTrackFilter = highQualityTpcTrack(); } break; + case 70: { /* Run 3 global track: kAny on 3 IB layers of ITS, tighter DCAxy, tighter pT dep DCAz, plus ITS only tracks */ + addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }); + addTrackFilter(itsOnlyTrack(), [](float pt) { return 0.004f + 0.013f / pt; }); + } break; + case 71: { /* Run 3 global track: kTwo on 3 IB layers of ITS, tighter DCAxy, tighter pT dep DCAz, plus ITS only tracks */ + addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibTwo, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }); + addTrackFilter(itsOnlyTrack(), [](float pt) { return 0.004f + 0.013f / pt; }); + } break; + case 72: { /* Run 3 global track: kAny on all 7 layers of ITS, tighter DCAxy, tighter pT dep DCAz, plus ITS only tracks */ + addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSallAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }); + addTrackFilter(itsOnlyTrack(), [](float pt) { return 0.004f + 0.013f / pt; }); + } break; + case 73: { /* Run 3 global track: kAll on all 7 layers of ITS, tighter DCAxy, tighter pT dep DCAz, plus ITS only tracks */ + addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSall7Layers, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }); + addTrackFilter(itsOnlyTrack(), [](float pt) { return 0.004f + 0.013f / pt; }); + } break; default: break; } @@ -406,12 +434,13 @@ inline void initializeTrackSelection(TrackSelectionTuneCfg& tune) } } if (tune.mUseDCAz) { - for (auto dcaZCut : maxDcaZPtDeps) { // o2-linter: disable=const-ref-in-for-loop + for (auto dcaZCut : maxDcaZPtDeps) { // o2-linter: disable=const-ref-in-for-loop (the loop variable is not constant) dcaZCut = [&tune](float) { return tune.mDCAz; }; } } if (tune.mUseFractionTpcSharedClusters) { sharedTpcClusters = tune.mFractionTpcSharedClusters; + sharedTpcClustersExtra = tune.mFractionTpcSharedClusters; } } } @@ -1337,7 +1366,7 @@ inline bool matchTrackType(TrackObject const& track) if (extraTrackFilter != nullptr) { if (extraTrackFilter->IsSelected(track)) { /* shared fraction of TPC clusters */ - if (!(track.tpcFractionSharedCls() < sharedTpcClusters)) { + if (!(track.tpcFractionSharedCls() < sharedTpcClustersExtra)) { return false; } /* we require TOF */ diff --git a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx index 7110f748837..f3e35e6344d 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx @@ -596,7 +596,7 @@ struct QAExtraDataCollectingEngine { AxisSpec phiAxis = {phibins, 0.0f, constants::math::TwoPI, "#varphi"}; AxisSpec deltaPhiAxis = {phibins, 0.0f, constants::math::TwoPI, "#Delta#varphi"}; AxisSpec etaAxis = {etabins, etalow, etaup, "#eta"}; - AxisSpec deltaEtaAxis = {2 * etabins - 1, etalow - etaup, etaup - etalow, "#DeltaEta"}; + AxisSpec deltaEtaAxis = {2 * etabins - 1, etalow - etaup, etaup - etalow, "#Delta#eta"}; /* the reconstructed and generated levels histograms */ std::string recogen = (kindOfData == kReco) ? "Reco" : "Gen"; From 12c081db138d4aec311ee13f2334bb8cc480b6bd Mon Sep 17 00:00:00 2001 From: fuchuncui <162277233+fuchuncui@users.noreply.github.com> Date: Sat, 15 Mar 2025 02:56:47 +0800 Subject: [PATCH 0671/1650] [PWGCF] change the method of applying local density efficiency (#10477) --- PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx | 50 +++++++++++++---------------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx b/PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx index 66ef0f50183..2620dab69bd 100644 --- a/PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx +++ b/PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx @@ -111,7 +111,11 @@ struct FlowGfwOmegaXi { O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeights, bool, true, "Fill and output NUA weights") O2_DEFINE_CONFIGURABLE(cfgAcceptancePath, std::vector, (std::vector{"Users/f/fcui/NUA/NUAREFPartical", "Users/f/fcui/NUA/NUAK0s", "Users/f/fcui/NUA/NUALambda", "Users/f/fcui/NUA/NUAXi", "Users/f/fcui/NUA/NUAOmega"}), "CCDB path to acceptance object") O2_DEFINE_CONFIGURABLE(cfgEfficiencyPath, std::vector, (std::vector{"PathtoRef"}), "CCDB path to efficiency object") - O2_DEFINE_CONFIGURABLE(cfgLocDenPath, std::vector, (std::vector{"PathtoRef"}), "CCDB path to local density efficiency object") + + O2_DEFINE_CONFIGURABLE(cfgLocDenParaXi, std::vector, (std::vector{-0.000986187, -3.86861, -0.000912481, -3.29206, -0.000859271, -2.89389, -0.000817039, -2.61201, -0.000788792, -2.39079, -0.000780182, -2.19276, -0.000750457, -2.07205, -0.000720279, -1.96865, -0.00073247, -1.85642, -0.000695091, -1.82625, -0.000693332, -1.72679, -0.000681225, -1.74305, -0.000652818, -1.92608, -0.000618892, -2.31985}), "Local density efficiency function parameter for Xi, exp(Ax + B)") + O2_DEFINE_CONFIGURABLE(cfgLocDenParaOmega, std::vector, (std::vector{-0.000444324, -6.0424, -0.000566208, -5.42168, -0.000580338, -4.96967, -0.000721054, -4.41994, -0.000626394, -4.27934, -0.000652167, -3.9543, -0.000592327, -3.79053, -0.000544721, -3.73292, -0.000613419, -3.43849, -0.000402506, -3.47687, -0.000602687, -3.24491, -0.000460848, -3.056, -0.00039428, -2.35188, -0.00041908, -2.03642}), "Local density efficiency function parameter for Omega, exp(Ax + B)") + O2_DEFINE_CONFIGURABLE(cfgLocDenParaK0s, std::vector, (std::vector{-0.00043057, -3.2435, -0.000385085, -2.97687, -0.000350298, -2.81502, -0.000326159, -2.71091, -0.000299563, -2.65448, -0.000294284, -2.60865, -0.000277938, -2.589, -0.000277091, -2.56983, -0.000272783, -2.56825, -0.000252706, -2.58996, -0.000247834, -2.63158, -0.00024379, -2.76976, -0.000286468, -2.92484, -0.000310149, -3.27746}), "Local density efficiency function parameter for K0s, exp(Ax + B)") + O2_DEFINE_CONFIGURABLE(cfgLocDenParaLambda, std::vector, (std::vector{-0.000510948, -4.4846, -0.000460629, -4.14465, -0.000433729, -3.94173, -0.000412751, -3.81839, -0.000411211, -3.72502, -0.000401511, -3.68426, -0.000407461, -3.67005, -0.000379371, -3.71153, -0.000392828, -3.73214, -0.000403996, -3.80717, -0.000403376, -3.90917, -0.000354624, -4.34629, -0.000477606, -4.66307, -0.000541139, -4.61364}), "Local density efficiency function parameter for Lambda, exp(Ax + B)") ConfigurableAxis cfgaxisVertex{"cfgaxisVertex", {20, -10, 10}, "vertex axis for histograms"}; ConfigurableAxis cfgaxisPhi{"cfgaxisPhi", {60, 0.0, constants::math::TwoPI}, "phi axis for histograms"}; @@ -152,12 +156,10 @@ struct FlowGfwOmegaXi { std::vector corrconfigs; std::vector cfgAcceptance = cfgAcceptancePath; std::vector cfgEfficiency = cfgEfficiencyPath; - std::vector cfgLocDen = cfgLocDenPath; std::vector cfgNSigma = cfgNSigmatpctof; std::vector mAcceptance; std::vector mEfficiency; - std::vector mLocDen; bool correctionsLoaded = false; TF1* fMultPVCutLow = nullptr; @@ -550,15 +552,6 @@ struct FlowGfwOmegaXi { else LOGF(fatal, "Could not load efficiency histogram"); } - if (cfgLocDen.size() == 5) { - for (int i = 0; i <= 4; i++) { - mLocDen.push_back(ccdb->getForTimeStamp(cfgLocDen[i], timestamp)); - } - if (cfgLocDen.size() == 5) - LOGF(info, "Loaded local density efficiency histogram"); - else - LOGF(fatal, "Could not load local density efficiency histogram"); - } correctionsLoaded = true; } @@ -581,17 +574,18 @@ struct FlowGfwOmegaXi { } template - bool setCurrentLocalDensityWeights(float& weight_loc, TrackObject track, float locDensity, int ispecies) + bool setCurrentLocalDensityWeights(float& weight_loc, TrackObject track, double locDensity, int ispecies) { - float eff = 1.; - if (mLocDen.size() == 5) { - int ptbin = mLocDen[ispecies]->GetXaxis()->FindBin(track.pt()); - float density = locDensity * 200 / (2 * cfgDeltaPhiLocDen + 1); - int densitybin = mLocDen[ispecies]->GetYaxis()->FindBin(density); - eff = mLocDen[ispecies]->GetBinContent(ptbin, densitybin); - } else { - eff = 1.0; + auto cfgLocDenPara = (std::vector>){cfgLocDenParaK0s, cfgLocDenParaLambda, cfgLocDenParaXi, cfgLocDenParaOmega}; + if (track.pt() < 0.9 || track.pt() > 10) { + weight_loc = 1.0; + return true; } + int ptbin = fXiPtAxis->FindBin(track.pt()); + double paraA = cfgLocDenPara[ispecies - 1][2 * ptbin - 2]; + double paraB = cfgLocDenPara[ispecies - 1][2 * ptbin - 1]; + double density = locDensity * 200 / (2 * cfgDeltaPhiLocDen + 1); + double eff = std::exp(paraA * density + paraB); weight_loc = 1 / eff; return true; } @@ -683,7 +677,7 @@ struct FlowGfwOmegaXi { float vtxz = collision.posZ(); registry.fill(HIST("hVtxZ"), vtxz); registry.fill(HIST("hMult"), nTot); - registry.fill(HIST("hCent"), collision.centFT0C()); + registry.fill(HIST("hCent"), cent); for (int i = 0; i < 4; i++) { registry.fill(HIST("hEventCount"), 1.5, i + 0.5); } @@ -703,8 +697,8 @@ struct FlowGfwOmegaXi { int ptbin = fPtAxis->FindBin(track.pt()) - 1; if ((track.pt() > cfgCutPtMin) && (track.pt() < cfgCutPtMax)) { fGFW->Fill(track.eta(), ptbin, track.phi(), wacc * weff, 1); //(eta, ptbin, phi, wacc*weff, bitmask) - hLocalDensity->Fill(track.phi()); - hLocalDensity->Fill(RecoDecay::constrainAngle(track.phi(), -constants::math::TwoPI)); + hLocalDensity->Fill(track.phi(), wacc * weff); + hLocalDensity->Fill(RecoDecay::constrainAngle(track.phi(), -constants::math::TwoPI), wacc * weff); } if ((track.pt() > cfgCutPtPOIMin) && (track.pt() < cfgCutPtPOIMax)) { fGFW->Fill(track.eta(), ptbin, track.phi(), wacc * weff, 32); @@ -789,7 +783,7 @@ struct FlowGfwOmegaXi { int phibin = -999; phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(v0.phi(), -constants::math::PI)); if (phibin > -900) { - int density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); setCurrentLocalDensityWeights(wloc, v0, density, 1); } @@ -805,7 +799,7 @@ struct FlowGfwOmegaXi { int phibin = -999; phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(v0.phi(), -constants::math::PI)); if (phibin > -900) { - int density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); setCurrentLocalDensityWeights(wloc, v0, density, 2); } @@ -891,7 +885,7 @@ struct FlowGfwOmegaXi { int phibin = -999; phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(casc.phi(), -constants::math::PI)); if (phibin > -900) { - int density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); setCurrentLocalDensityWeights(wloc, casc, density, 4); } @@ -907,7 +901,7 @@ struct FlowGfwOmegaXi { int phibin = -999; phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(casc.phi(), -constants::math::PI)); if (phibin > -900) { - int density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); setCurrentLocalDensityWeights(wloc, casc, density, 3); } From 0a8765dc02f6388eb13bbb379a7e5d56d992181a Mon Sep 17 00:00:00 2001 From: Mingyu Zhang <83645570+Mingyu3360715@users.noreply.github.com> Date: Fri, 14 Mar 2025 20:22:46 +0100 Subject: [PATCH 0672/1650] [PWGHF] Add track quality selection for D0 candidate selector, add track quality axis in Thn for taskD0 (#10367) --- PWGHF/D2H/Tasks/taskD0.cxx | 133 ++++++++++++++------ PWGHF/TableProducer/candidateSelectorD0.cxx | 34 +++++ 2 files changed, 128 insertions(+), 39 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskD0.cxx b/PWGHF/D2H/Tasks/taskD0.cxx index 7c2bee7340f..0db5a832135 100644 --- a/PWGHF/D2H/Tasks/taskD0.cxx +++ b/PWGHF/D2H/Tasks/taskD0.cxx @@ -16,6 +16,7 @@ /// \author Vít Kučera , CERN #include +#include // std::min #include "CommonConstants/PhysicsConstants.h" #include "Framework/AnalysisTask.h" @@ -27,7 +28,7 @@ #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/Utils/utilsEvSelHf.h" -// #include "PWGHF/Utils/utilsAnalysis.h" +#include "PWGHF/Utils/utilsAnalysis.h" using namespace o2; using namespace o2::analysis; @@ -62,27 +63,13 @@ struct HfTaskD0 { Configurable occEstimator{"occEstimator", 0, "Occupancy estimation (None: 0, ITS: 1, FT0C: 2)"}; Configurable storeCentrality{"storeCentrality", false, "Flag to store centrality information"}; Configurable storeOccupancy{"storeOccupancy", false, "Flag to store occupancy information"}; + Configurable storeTrackQuality{"storeTrackQuality", false, "Flag to store track quality information"}; // ML inference Configurable applyMl{"applyMl", false, "Flag to apply ML selections"}; - // ThnSparse for ML outputScores and Vars - ConfigurableAxis thnConfigAxisBkgScore{"thnConfigAxisBkgScore", {50, 0, 1}, "Bkg score bins"}; - ConfigurableAxis thnConfigAxisNonPromptScore{"thnConfigAxisNonPromptScore", {50, 0, 1}, "Non-prompt score bins"}; - ConfigurableAxis thnConfigAxisPromptScore{"thnConfigAxisPromptScore", {50, 0, 1}, "Prompt score bins"}; - ConfigurableAxis thnConfigAxisMass{"thnConfigAxisMass", {120, 1.5848, 2.1848}, "Cand. inv-mass bins"}; - ConfigurableAxis thnConfigAxisPtB{"thnConfigAxisPtB", {1000, 0, 100}, "Cand. beauty mother pTB bins"}; - ConfigurableAxis thnConfigAxisPt{"thnConfigAxisPt", {500, 0, 50}, "Cand. pT bins"}; - ConfigurableAxis thnConfigAxisY{"thnConfigAxisY", {20, -1, 1}, "Cand. rapidity bins"}; - ConfigurableAxis thnConfigAxisOrigin{"thnConfigAxisOrigin", {3, -0.5, 2.5}, "Cand. origin type"}; - ConfigurableAxis thnConfigAxisCandType{"thnConfigAxisCandType", {6, -0.5, 5.5}, "D0 type"}; - ConfigurableAxis thnConfigAxisGenPtD{"thnConfigAxisGenPtD", {500, 0, 50}, "Gen Pt D"}; - ConfigurableAxis thnConfigAxisGenPtB{"thnConfigAxisGenPtB", {1000, 0, 100}, "Gen Pt B"}; - ConfigurableAxis thnConfigAxisNumPvContr{"thnConfigAxisNumPvContr", {200, -0.5, 199.5}, "Number of PV contributors"}; - ConfigurableAxis thnConfigAxisCent{"thnConfigAxisCent", {110, 0., 110.}, ""}; - ConfigurableAxis thnConfigAxisOccupancy{"thnConfigAxisOccupancy", {14, 0, 14000}, "axis for centrality"}; - HfHelper hfHelper; + SliceCache cache; using D0Candidates = soa::Join; using D0CandidatesMc = soa::Join; using D0CandidatesKF = soa::Join; @@ -97,9 +84,9 @@ struct HfTaskD0 { using CollisionsCent = soa::Join; using CollisionsWithMcLabels = soa::Join; using CollisionsWithMcLabelsCent = soa::Join; + using TracksSelQuality = soa::Join; PresliceUnsorted colPerMcCollision = aod::mccollisionlabel::mcCollisionId; PresliceUnsorted colPerMcCollisionCent = aod::mccollisionlabel::mcCollisionId; - SliceCache cache; Partition selectedD0Candidates = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlagD0 || aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlagD0bar; Partition selectedD0CandidatesKF = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlagD0 || aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlagD0bar; @@ -111,6 +98,24 @@ struct HfTaskD0 { Partition selectedD0CandidatesMlMc = aod::hf_sel_candidate_d0::isRecoHfFlag >= selectionFlagHf; Partition selectedD0CandidatesMlMcKF = aod::hf_sel_candidate_d0::isRecoHfFlag >= selectionFlagHf; + // ThnSparse for ML outputScores and Vars + ConfigurableAxis thnConfigAxisBkgScore{"thnConfigAxisBkgScore", {50, 0, 1}, "Bkg score bins"}; + ConfigurableAxis thnConfigAxisNonPromptScore{"thnConfigAxisNonPromptScore", {50, 0, 1}, "Non-prompt score bins"}; + ConfigurableAxis thnConfigAxisPromptScore{"thnConfigAxisPromptScore", {50, 0, 1}, "Prompt score bins"}; + ConfigurableAxis thnConfigAxisMass{"thnConfigAxisMass", {120, 1.5848, 2.1848}, "Cand. inv-mass bins"}; + ConfigurableAxis thnConfigAxisPtB{"thnConfigAxisPtB", {1000, 0, 100}, "Cand. beauty mother pTB bins"}; + ConfigurableAxis thnConfigAxisPt{"thnConfigAxisPt", {500, 0, 50}, "Cand. pT bins"}; + ConfigurableAxis thnConfigAxisY{"thnConfigAxisY", {20, -1, 1}, "Cand. rapidity bins"}; + ConfigurableAxis thnConfigAxisOrigin{"thnConfigAxisOrigin", {3, -0.5, 2.5}, "Cand. origin type"}; + ConfigurableAxis thnConfigAxisCandType{"thnConfigAxisCandType", {6, -0.5, 5.5}, "D0 type"}; + ConfigurableAxis thnConfigAxisGenPtD{"thnConfigAxisGenPtD", {500, 0, 50}, "Gen Pt D"}; + ConfigurableAxis thnConfigAxisGenPtB{"thnConfigAxisGenPtB", {1000, 0, 100}, "Gen Pt B"}; + ConfigurableAxis thnConfigAxisNumPvContr{"thnConfigAxisNumPvContr", {200, -0.5, 199.5}, "Number of PV contributors"}; + ConfigurableAxis thnConfigAxisCent{"thnConfigAxisCent", {110, 0., 110.}, ""}; + ConfigurableAxis thnConfigAxisOccupancy{"thnConfigAxisOccupancy", {14, 0, 14000}, "axis for centrality"}; + ConfigurableAxis thnConfigAxisMinItsNCls{"thnConfigAxisMinItsNCls", {5, 3, 8}, "axis for minimum ITS NCls of candidate prongs"}; + ConfigurableAxis thnConfigAxisMinTpcNCrossedRows{"thnConfigAxisMinTpcNCrossedRows", {10, 70, 180}, "axis for minimum TPC NCls crossed rows of candidate prongs"}; + HistogramRegistry registry{ "registry", {{"hPtCand", "2-prong candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{360, 0., 36.}}}}, @@ -249,6 +254,8 @@ struct HfTaskD0 { const AxisSpec thnAxisNumPvContr{thnConfigAxisNumPvContr, "Number of PV contributors"}; const AxisSpec thnAxisCent{thnConfigAxisCent, "Centrality"}; const AxisSpec thnAxisOccupancy{thnConfigAxisOccupancy, "Occupancy"}; + const AxisSpec thnAxisMinItsNCls{thnConfigAxisMinItsNCls, "Minimum ITS cluster found"}; + const AxisSpec thnAxisMinTpcNCrossedRows{thnConfigAxisMinTpcNCrossedRows, "Minimum TPC crossed rows"}; if (doprocessMcWithDCAFitterN || doprocessMcWithDCAFitterNCent || doprocessMcWithKFParticle || doprocessMcWithDCAFitterNMl || doprocessMcWithDCAFitterNMlCent || doprocessMcWithKFParticleMl) { std::vector axesAcc = {thnAxisGenPtD, thnAxisGenPtB, thnAxisY, thnAxisOrigin, thnAxisNumPvContr}; @@ -276,6 +283,10 @@ struct HfTaskD0 { if (storeOccupancy) { axes.push_back(thnAxisOccupancy); } + if (storeTrackQuality) { + axes.push_back(thnAxisMinItsNCls); + axes.push_back(thnAxisMinTpcNCrossedRows); + } if (applyMl) { const AxisSpec thnAxisBkgScore{thnConfigAxisBkgScore, "BDT score bkg."}; const AxisSpec thnAxisNonPromptScore{thnConfigAxisNonPromptScore, "BDT score non-prompt."}; @@ -294,7 +305,9 @@ struct HfTaskD0 { } template - void processData(CandType const& candidates, CollType const&) + void processData(CandType const& candidates, + CollType const&, + aod::TracksWExtra const&) { for (const auto& candidate : candidates) { if (!(candidate.hfflag() & 1 << aod::hf_cand_2prong::DecayType::D0ToPiK)) { @@ -365,6 +378,10 @@ struct HfTaskD0 { } } + auto trackPos = candidate.template prong0_as(); // positive daughter + auto trackNeg = candidate.template prong1_as(); // negative daughter + int minItsClustersOfProngs = std::min(trackPos.itsNCls(), trackNeg.itsNCls()); + int minTpcCrossedRowsOfProngs = std::min(trackPos.tpcNClsCrossedRows(), trackNeg.tpcNClsCrossedRows()); if constexpr (applyMl) { if (storeCentrality && storeOccupancy) { if (candidate.isSelD0() >= selectionFlagD0) { @@ -393,6 +410,15 @@ struct HfTaskD0 { registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsD0Type"), candidate.mlProbD0bar()[0], candidate.mlProbD0bar()[1], candidate.mlProbD0bar()[2], massD0bar, ptCandidate, hfHelper.yD0(candidate), SigD0bar, occ); registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsD0Type"), candidate.mlProbD0bar()[0], candidate.mlProbD0bar()[1], candidate.mlProbD0bar()[2], massD0bar, ptCandidate, hfHelper.yD0(candidate), candidate.isSelD0() ? ReflectedD0bar : PureSigD0bar, occ); } + } else if (storeTrackQuality) { + if (candidate.isSelD0() >= selectionFlagD0) { + registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsD0Type"), candidate.mlProbD0()[0], candidate.mlProbD0()[1], candidate.mlProbD0()[2], massD0, ptCandidate, hfHelper.yD0(candidate), SigD0, minItsClustersOfProngs, minTpcCrossedRowsOfProngs); + registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsD0Type"), candidate.mlProbD0()[0], candidate.mlProbD0()[1], candidate.mlProbD0()[2], massD0, ptCandidate, hfHelper.yD0(candidate), candidate.isSelD0bar() ? ReflectedD0 : PureSigD0, minItsClustersOfProngs, minTpcCrossedRowsOfProngs); + } + if (candidate.isSelD0bar() >= selectionFlagD0bar) { + registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsD0Type"), candidate.mlProbD0bar()[0], candidate.mlProbD0bar()[1], candidate.mlProbD0bar()[2], massD0bar, ptCandidate, hfHelper.yD0(candidate), SigD0bar, minItsClustersOfProngs, minTpcCrossedRowsOfProngs); + registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsD0Type"), candidate.mlProbD0bar()[0], candidate.mlProbD0bar()[1], candidate.mlProbD0bar()[2], massD0bar, ptCandidate, hfHelper.yD0(candidate), candidate.isSelD0() ? ReflectedD0bar : PureSigD0bar, minItsClustersOfProngs, minTpcCrossedRowsOfProngs); + } } else { if (candidate.isSelD0() >= selectionFlagD0) { registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsD0Type"), candidate.mlProbD0()[0], candidate.mlProbD0()[1], candidate.mlProbD0()[2], massD0, ptCandidate, hfHelper.yD0(candidate), SigD0); @@ -431,6 +457,15 @@ struct HfTaskD0 { registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsD0Type"), massD0bar, ptCandidate, hfHelper.yD0(candidate), SigD0bar, occ); registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsD0Type"), massD0bar, ptCandidate, hfHelper.yD0(candidate), candidate.isSelD0() ? ReflectedD0bar : PureSigD0bar, occ); } + } else if (storeTrackQuality) { + if (candidate.isSelD0() >= selectionFlagD0) { + registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsD0Type"), massD0, ptCandidate, hfHelper.yD0(candidate), SigD0, minItsClustersOfProngs, minTpcCrossedRowsOfProngs); + registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsD0Type"), massD0, ptCandidate, hfHelper.yD0(candidate), candidate.isSelD0bar() ? ReflectedD0 : PureSigD0, minItsClustersOfProngs, minTpcCrossedRowsOfProngs); + } + if (candidate.isSelD0bar() >= selectionFlagD0bar) { + registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsD0Type"), massD0bar, ptCandidate, hfHelper.yD0(candidate), SigD0bar); + registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsD0Type"), massD0bar, ptCandidate, hfHelper.yD0(candidate), candidate.isSelD0() ? ReflectedD0bar : PureSigD0bar); + } } else { if (candidate.isSelD0() >= selectionFlagD0) { registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsD0Type"), massD0, ptCandidate, hfHelper.yD0(candidate), SigD0); @@ -444,40 +479,40 @@ struct HfTaskD0 { } } } - void processDataWithDCAFitterN(D0Candidates const&, Collisions const& collisions) + void processDataWithDCAFitterN(D0Candidates const&, Collisions const& collisions, aod::TracksWExtra const& tracks) { - processData(selectedD0Candidates, collisions); + processData(selectedD0Candidates, collisions, tracks); } PROCESS_SWITCH(HfTaskD0, processDataWithDCAFitterN, "process taskD0 with DCAFitterN", true); - void processDataWithDCAFitterNCent(D0Candidates const&, CollisionsCent const& collisions) + void processDataWithDCAFitterNCent(D0Candidates const&, CollisionsCent const& collisions, aod::TracksWExtra const& tracks) { - processData(selectedD0Candidates, collisions); + processData(selectedD0Candidates, collisions, tracks); } PROCESS_SWITCH(HfTaskD0, processDataWithDCAFitterNCent, "process taskD0 with DCAFitterN and centrality", false); - void processDataWithKFParticle(D0CandidatesKF const&, Collisions const& collisions) + void processDataWithKFParticle(D0CandidatesKF const&, Collisions const& collisions, aod::TracksWExtra const& tracks) { - processData(selectedD0CandidatesKF, collisions); + processData(selectedD0CandidatesKF, collisions, tracks); } PROCESS_SWITCH(HfTaskD0, processDataWithKFParticle, "process taskD0 with KFParticle", false); // TODO: add processKFParticleCent - void processDataWithDCAFitterNMl(D0CandidatesMl const&, Collisions const& collisions) + void processDataWithDCAFitterNMl(D0CandidatesMl const&, Collisions const& collisions, aod::TracksWExtra const& tracks) { - processData(selectedD0CandidatesMl, collisions); + processData(selectedD0CandidatesMl, collisions, tracks); } PROCESS_SWITCH(HfTaskD0, processDataWithDCAFitterNMl, "process taskD0 with DCAFitterN and ML selections", false); - void processDataWithDCAFitterNMlCent(D0CandidatesMl const&, CollisionsCent const& collisions) + void processDataWithDCAFitterNMlCent(D0CandidatesMl const&, CollisionsCent const& collisions, aod::TracksWExtra const& tracks) { - processData(selectedD0CandidatesMl, collisions); + processData(selectedD0CandidatesMl, collisions, tracks); } PROCESS_SWITCH(HfTaskD0, processDataWithDCAFitterNMlCent, "process taskD0 with DCAFitterN and ML selections and centrality", false); - void processDataWithKFParticleMl(D0CandidatesMlKF const&, Collisions const& collisions) + void processDataWithKFParticleMl(D0CandidatesMlKF const&, Collisions const& collisions, aod::TracksWExtra const& tracks) { - processData(selectedD0CandidatesMlKF, collisions); + processData(selectedD0CandidatesMlKF, collisions, tracks); } PROCESS_SWITCH(HfTaskD0, processDataWithKFParticleMl, "process taskD0 with KFParticle and ML selections", false); // TODO: add processKFParticleMlCent @@ -485,7 +520,7 @@ struct HfTaskD0 { template void processMc(CandType const& candidates, soa::Join const& mcParticles, - aod::TracksWMc const&, + TracksSelQuality const&, CollType const& collisions, aod::McCollisions const&) { @@ -516,9 +551,11 @@ struct HfTaskD0 { massD0 = hfHelper.invMassD0ToPiK(candidate); massD0bar = hfHelper.invMassD0barToKPi(candidate); } + auto trackPos = candidate.template prong0_as(); // positive daughter + auto trackNeg = candidate.template prong1_as(); // negative daughter if (std::abs(candidate.flagMcMatchRec()) == 1 << aod::hf_cand_2prong::DecayType::D0ToPiK) { // Get the corresponding MC particle. - auto indexMother = RecoDecay::getMother(mcParticles, candidate.template prong0_as().template mcParticle_as>(), o2::constants::physics::Pdg::kD0, true); + auto indexMother = RecoDecay::getMother(mcParticles, trackPos.template mcParticle_as>(), o2::constants::physics::Pdg::kD0, true); auto particleMother = mcParticles.rawIteratorAt(indexMother); auto ptGen = particleMother.pt(); // gen. level pT auto yGen = RecoDecay::y(particleMother.pVector(), o2::constants::physics::MassD0); // gen. level y @@ -606,6 +643,8 @@ struct HfTaskD0 { auto ctCandidate = hfHelper.ctD0(candidate); auto cpaCandidate = candidate.cpa(); auto cpaxyCandidate = candidate.cpaXY(); + int minItsClustersOfProngs = std::min(trackPos.itsNCls(), trackNeg.itsNCls()); + int minTpcCrossedRowsOfProngs = std::min(trackPos.tpcNClsCrossedRows(), trackNeg.tpcNClsCrossedRows()); if (candidate.isSelD0() >= selectionFlagD0) { registry.fill(HIST("hMassSigBkgD0"), massD0, ptCandidate, rapidityCandidate); if (candidate.flagMcMatchRec() == (1 << aod::hf_cand_2prong::DecayType::D0ToPiK)) { @@ -639,6 +678,8 @@ struct HfTaskD0 { registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsD0Type"), candidate.mlProbD0()[0], candidate.mlProbD0()[1], candidate.mlProbD0()[2], massD0, ptCandidate, rapidityCandidate, SigD0, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors, cent); } else if (!storeCentrality && storeOccupancy) { registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsD0Type"), candidate.mlProbD0()[0], candidate.mlProbD0()[1], candidate.mlProbD0()[2], massD0, ptCandidate, rapidityCandidate, SigD0, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors, occ); + } else if (storeTrackQuality) { + registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsD0Type"), candidate.mlProbD0()[0], candidate.mlProbD0()[1], candidate.mlProbD0()[2], massD0, ptCandidate, rapidityCandidate, SigD0, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors, minItsClustersOfProngs, minTpcCrossedRowsOfProngs); } else { registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsD0Type"), candidate.mlProbD0()[0], candidate.mlProbD0()[1], candidate.mlProbD0()[2], massD0, ptCandidate, rapidityCandidate, SigD0, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors); } @@ -649,6 +690,8 @@ struct HfTaskD0 { registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsD0Type"), massD0, ptCandidate, rapidityCandidate, SigD0, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors, cent); } else if (!storeCentrality && storeOccupancy) { registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsD0Type"), massD0, ptCandidate, rapidityCandidate, SigD0, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors, occ); + } else if (storeTrackQuality) { + registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsD0Type"), massD0, ptCandidate, rapidityCandidate, SigD0, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors, minItsClustersOfProngs, minTpcCrossedRowsOfProngs); } else { registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsD0Type"), massD0, ptCandidate, rapidityCandidate, SigD0, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors); } @@ -677,6 +720,8 @@ struct HfTaskD0 { registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsD0Type"), candidate.mlProbD0()[0], candidate.mlProbD0()[1], candidate.mlProbD0()[2], massD0, ptCandidate, rapidityCandidate, ReflectedD0, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors, cent); } else if (!storeCentrality && storeOccupancy) { registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsD0Type"), candidate.mlProbD0()[0], candidate.mlProbD0()[1], candidate.mlProbD0()[2], massD0, ptCandidate, rapidityCandidate, ReflectedD0, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors, occ); + } else if (storeTrackQuality) { + registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsD0Type"), candidate.mlProbD0()[0], candidate.mlProbD0()[1], candidate.mlProbD0()[2], massD0, ptCandidate, rapidityCandidate, ReflectedD0, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors, minItsClustersOfProngs, minTpcCrossedRowsOfProngs); } else { registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsD0Type"), candidate.mlProbD0()[0], candidate.mlProbD0()[1], candidate.mlProbD0()[2], massD0, ptCandidate, rapidityCandidate, ReflectedD0, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors); } @@ -687,6 +732,8 @@ struct HfTaskD0 { registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsD0Type"), massD0, ptCandidate, rapidityCandidate, ReflectedD0, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors, cent); } else if (!storeCentrality && storeOccupancy) { registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsD0Type"), massD0, ptCandidate, rapidityCandidate, ReflectedD0, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors, occ); + } else if (storeTrackQuality) { + registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsD0Type"), massD0, ptCandidate, rapidityCandidate, ReflectedD0, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors, minItsClustersOfProngs, minTpcCrossedRowsOfProngs); } else { registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsD0Type"), massD0, ptCandidate, rapidityCandidate, ReflectedD0, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors); } @@ -705,6 +752,8 @@ struct HfTaskD0 { registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsD0Type"), candidate.mlProbD0bar()[0], candidate.mlProbD0bar()[1], candidate.mlProbD0bar()[2], massD0bar, ptCandidate, rapidityCandidate, SigD0bar, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors, cent); } else if (!storeCentrality && storeOccupancy) { registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsD0Type"), candidate.mlProbD0bar()[0], candidate.mlProbD0bar()[1], candidate.mlProbD0bar()[2], massD0bar, ptCandidate, rapidityCandidate, SigD0bar, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors, occ); + } else if (storeTrackQuality) { + registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsD0Type"), candidate.mlProbD0bar()[0], candidate.mlProbD0bar()[1], candidate.mlProbD0bar()[2], massD0bar, ptCandidate, rapidityCandidate, SigD0bar, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors, minItsClustersOfProngs, minTpcCrossedRowsOfProngs); } else { registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsD0Type"), candidate.mlProbD0bar()[0], candidate.mlProbD0bar()[1], candidate.mlProbD0bar()[2], massD0bar, ptCandidate, rapidityCandidate, SigD0bar, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors); } @@ -715,6 +764,8 @@ struct HfTaskD0 { registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsD0Type"), massD0bar, ptCandidate, rapidityCandidate, SigD0bar, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors, cent); } else if (!storeCentrality && storeOccupancy) { registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsD0Type"), massD0bar, ptCandidate, rapidityCandidate, SigD0bar, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors, occ); + } else if (storeTrackQuality) { + registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsD0Type"), massD0bar, ptCandidate, rapidityCandidate, SigD0bar, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors, minItsClustersOfProngs, minTpcCrossedRowsOfProngs); } else { registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsD0Type"), massD0bar, ptCandidate, rapidityCandidate, SigD0bar, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors); } @@ -730,6 +781,8 @@ struct HfTaskD0 { registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsD0Type"), candidate.mlProbD0bar()[0], candidate.mlProbD0bar()[1], candidate.mlProbD0bar()[2], massD0bar, ptCandidate, rapidityCandidate, ReflectedD0bar, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors, cent); } else if (!storeCentrality && storeOccupancy) { registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsD0Type"), candidate.mlProbD0bar()[0], candidate.mlProbD0bar()[1], candidate.mlProbD0bar()[2], massD0bar, ptCandidate, rapidityCandidate, ReflectedD0bar, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors, occ); + } else if (storeTrackQuality) { + registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsD0Type"), candidate.mlProbD0bar()[0], candidate.mlProbD0bar()[1], candidate.mlProbD0bar()[2], massD0bar, ptCandidate, rapidityCandidate, ReflectedD0bar, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors, minItsClustersOfProngs, minTpcCrossedRowsOfProngs); } else { registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsD0Type"), candidate.mlProbD0bar()[0], candidate.mlProbD0bar()[1], candidate.mlProbD0bar()[2], massD0bar, ptCandidate, rapidityCandidate, ReflectedD0bar, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors); } @@ -740,6 +793,8 @@ struct HfTaskD0 { registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsD0Type"), massD0bar, ptCandidate, rapidityCandidate, ReflectedD0bar, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors, cent); } else if (!storeCentrality && storeOccupancy) { registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsD0Type"), massD0bar, ptCandidate, rapidityCandidate, ReflectedD0bar, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors, occ); + } else if (storeTrackQuality) { + registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsD0Type"), massD0bar, ptCandidate, rapidityCandidate, ReflectedD0bar, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors, minItsClustersOfProngs, minTpcCrossedRowsOfProngs); } else { registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsD0Type"), massD0bar, ptCandidate, rapidityCandidate, ReflectedD0bar, candidate.ptBhadMotherPart(), candidate.originMcRec(), numPvContributors); } @@ -816,7 +871,7 @@ struct HfTaskD0 { void processMcWithDCAFitterN(D0CandidatesMc const&, soa::Join const& mcParticles, - aod::TracksWMc const& tracks, + TracksSelQuality const& tracks, CollisionsWithMcLabels const& collisions, aod::McCollisions const& mcCollisions) { @@ -826,7 +881,7 @@ struct HfTaskD0 { void processMcWithDCAFitterNCent(D0CandidatesMc const&, soa::Join const& mcParticles, - aod::TracksWMc const& tracks, + TracksSelQuality const& tracks, CollisionsWithMcLabelsCent const& collisions, aod::McCollisions const& mcCollisions) { @@ -836,7 +891,7 @@ struct HfTaskD0 { void processMcWithKFParticle(D0CandidatesMcKF const&, soa::Join const& mcParticles, - aod::TracksWMc const& tracks, + TracksSelQuality const& tracks, CollisionsWithMcLabels const& collisions, aod::McCollisions const& mcCollisions) { @@ -847,7 +902,7 @@ struct HfTaskD0 { void processMcWithDCAFitterNMl(D0CandidatesMlMc const&, soa::Join const& mcParticles, - aod::TracksWMc const& tracks, + TracksSelQuality const& tracks, CollisionsWithMcLabels const& collisions, aod::McCollisions const& mcCollisions) { @@ -857,7 +912,7 @@ struct HfTaskD0 { void processMcWithDCAFitterNMlCent(D0CandidatesMlMc const&, soa::Join const& mcParticles, - aod::TracksWMc const& tracks, + TracksSelQuality const& tracks, CollisionsWithMcLabelsCent const& collisions, aod::McCollisions const& mcCollisions) { @@ -867,7 +922,7 @@ struct HfTaskD0 { void processMcWithKFParticleMl(D0CandidatesMlMcKF const&, soa::Join const& mcParticles, - aod::TracksWMc const& tracks, + TracksSelQuality const& tracks, CollisionsWithMcLabels const& collisions, aod::McCollisions const& mcCollisions) { diff --git a/PWGHF/TableProducer/candidateSelectorD0.cxx b/PWGHF/TableProducer/candidateSelectorD0.cxx index 75c61745e7c..eda8561c6b3 100644 --- a/PWGHF/TableProducer/candidateSelectorD0.cxx +++ b/PWGHF/TableProducer/candidateSelectorD0.cxx @@ -56,6 +56,14 @@ struct HfCandidateSelectorD0 { Configurable nSigmaTofCombinedMax{"nSigmaTofCombinedMax", 5., "Nsigma cut on TOF combined with TPC"}; // AND logic for TOF+TPC PID (as in Run2) Configurable usePidTpcAndTof{"usePidTpcAndTof", false, "Use AND logic for TPC and TOF PID"}; + // ITS quality track cuts + Configurable itsNClustersFoundMin{"itsNClustersFoundMin", 0, "Minimum number of found ITS clusters"}; + Configurable itsChi2PerClusterMax{"itsChi2PerClusterMax", 1e10f, "Maximum its fit chi2 per ITS cluster"}; + // TPC quality track cuts + Configurable tpcNClustersFoundMin{"tpcNClustersFoundMin", 0, "Minimum number of found TPC clusters"}; + Configurable tpcNCrossedRowsMin{"tpcNCrossedRowsMin", 0, "Minimum number of crossed rows in TPC"}; + Configurable tpcNCrossedRowsOverFindableClustersMin{"tpcNCrossedRowsOverFindableClustersMin", 0., "Minimum ratio crossed rows / findable clusters"}; + Configurable tpcChi2PerClusterMax{"tpcChi2PerClusterMax", 1e10f, "Maximum TPC fit chi2 per TPC cluster"}; // selecting only background candidates Configurable keepOnlySidebandCandidates{"keepOnlySidebandCandidates", false, "Select only sideband candidates, for studying background cut variable distributions"}; Configurable distanceFromD0MassForSidebands{"distanceFromD0MassForSidebands", 0.15, "Minimum distance from nominal D0 mass value for sideband region"}; @@ -131,6 +139,23 @@ struct HfCandidateSelectorD0 { } } + /// Single track quality cuts + /// \param track is track + /// \return true if track passes all cuts + template + bool isSelectedCandidateProng(const T& trackPos, const T& trackNeg) + { + if (!isSelectedTrackTpcQuality(trackPos, tpcNClustersFoundMin.value, tpcNCrossedRowsMin.value, tpcNCrossedRowsOverFindableClustersMin.value, tpcChi2PerClusterMax.value) || + !isSelectedTrackTpcQuality(trackNeg, tpcNClustersFoundMin.value, tpcNCrossedRowsMin.value, tpcNCrossedRowsOverFindableClustersMin.value, tpcChi2PerClusterMax.value)) { + return false; + } + if (!isSelectedTrackItsQuality(trackPos, itsNClustersFoundMin.value, itsChi2PerClusterMax.value) || + !isSelectedTrackItsQuality(trackNeg, itsNClustersFoundMin.value, itsChi2PerClusterMax.value)) { + return false; + } + return true; + } + /// Conjugate-independent topological cuts /// \param reconstructionType is the reconstruction type (DCAFitterN or KFParticle) /// \param candidate is candidate @@ -297,6 +322,15 @@ struct HfCandidateSelectorD0 { auto trackPos = candidate.template prong0_as(); // positive daughter auto trackNeg = candidate.template prong1_as(); // negative daughter + // implement track quality selection for D0 daughters + if (!isSelectedCandidateProng(trackPos, trackNeg)) { + hfSelD0Candidate(statusD0, statusD0bar, statusHFFlag, statusTopol, statusCand, statusPID); + if (applyMl) { + hfMlD0Candidate(outputMlD0, outputMlD0bar); + } + continue; + } + // conjugate-independent topological selection if (!selectionTopol(candidate)) { hfSelD0Candidate(statusD0, statusD0bar, statusHFFlag, statusTopol, statusCand, statusPID); From 44429eba0a42382c03b7796706713b9a4b73b617 Mon Sep 17 00:00:00 2001 From: EmilGorm <50658075+EmilGorm@users.noreply.github.com> Date: Fri, 14 Mar 2025 20:23:01 +0100 Subject: [PATCH 0673/1650] [PWGCF] fix registry naming issue (#10496) Co-authored-by: Emil Gorm Nielsen Co-authored-by: ALICE Action Bot --- .../Tasks/flowGenericFramework.cxx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx b/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx index f5dab09c53b..4ea461c4c0b 100644 --- a/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx +++ b/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx @@ -386,7 +386,7 @@ struct FlowGenericFramework { if (!cfgRunByRun && cfg.correctionsLoaded) return; if (!cfgAcceptance.value.empty()) { - std::string runstr = (cfgRunByRun) ? "RBR/" : ""; + std::string runstr = (cfgRunByRun) ? "RunByRun/" : ""; cfg.mAcceptance.clear(); if (cfgUsePID) { cfg.mAcceptance.push_back(ccdb->getForTimeStamp(cfgAcceptance.value + runstr + "ref/", timestamp)); @@ -601,20 +601,20 @@ struct FlowGenericFramework { th3sList[run][hNUAch + pid_index]->Fill(track.phi(), track.eta(), vtxz); // charged and id'ed particle weights } else { if (withinPtRef && !pid_index) - registry.fill(HIST("hPhiEtaVtxz_ref"), track.phi(), track.eta(), vtxz); // pt-subset of charged particles for ref flow + registry.fill(HIST("phi_eta_vtxz_ref"), track.phi(), track.eta(), vtxz); // pt-subset of charged particles for ref flow if (withinPtPOI) { switch (pid_index) { case 0: - registry.fill(HIST("hPhiEtaVtxz_ch"), track.phi(), track.eta(), vtxz); // charged particle weights + registry.fill(HIST("phi_eta_vtxz_ch"), track.phi(), track.eta(), vtxz); // charged particle weights break; case 1: - registry.fill(HIST("hPhiEtaVtxz_pi"), track.phi(), track.eta(), vtxz); // pion weights + registry.fill(HIST("phi_eta_vtxz_pi"), track.phi(), track.eta(), vtxz); // pion weights break; case 2: - registry.fill(HIST("hPhiEtaVtxz_ka"), track.phi(), track.eta(), vtxz); // kaon weights + registry.fill(HIST("phi_eta_vtxz_ka"), track.phi(), track.eta(), vtxz); // kaon weights break; case 3: - registry.fill(HIST("hPhiEtaVtxz_pr"), track.phi(), track.eta(), vtxz); // proton weights + registry.fill(HIST("phi_eta_vtxz_pr"), track.phi(), track.eta(), vtxz); // proton weights break; } } @@ -623,7 +623,7 @@ struct FlowGenericFramework { if (cfgRunByRun) th3sList[run][hNUAref]->Fill(track.phi(), track.eta(), vtxz); else - registry.fill(HIST("hPhiEtaVtxz_ref"), track.phi(), track.eta(), vtxz); + registry.fill(HIST("phi_eta_vtxz_ref"), track.phi(), track.eta(), vtxz); } return; } From f838bedf90f72decc8bb7c5c1f174505154de180 Mon Sep 17 00:00:00 2001 From: JStaa <39123272+JStaa@users.noreply.github.com> Date: Fri, 14 Mar 2025 20:31:18 +0100 Subject: [PATCH 0674/1650] [PWGCF] Fixed bugs in processMCSame and processMCMixed functions (#10487) Co-authored-by: ALICE Action Bot --- .../Tasks/threeParticleCorrelations.cxx | 87 ++++++++++--------- 1 file changed, 48 insertions(+), 39 deletions(-) diff --git a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx index d0746966a3d..302e25943d3 100644 --- a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx +++ b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx @@ -26,6 +26,8 @@ #include "RecoDecay.h" #include "TPDGCode.h" +#include "Common/DataModel/McCollisionExtra.h" + using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; @@ -41,7 +43,7 @@ struct ThreeParticleCorrelations { HistogramRegistry rQARegistry{"QARegistry", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; // Collision & Event filters - Filter collCent = aod::cent::centFT0M > 0.0f && aod::cent::centFT0M < 90.0f; + Filter collCent = aod::cent::centFT0C > 0.0f && aod::cent::centFT0C < 90.0f; Filter collZvtx = nabs(aod::collision::posZ) < 7.0f; Filter mcCollZvtx = nabs(aod::mccollision::posZ) < 7.0f; Filter evSelect = aod::evsel::sel8 == true; @@ -59,7 +61,7 @@ struct ThreeParticleCorrelations { Filter particleEta = nabs(aod::mcparticle::eta) < 0.8f; // Table aliases - Data - using MyFilteredCollisions = soa::Filtered>; + using MyFilteredCollisions = soa::Filtered>; using MyFilteredCollision = MyFilteredCollisions::iterator; using MyFilteredV0s = soa::Filtered; using MyFilteredTracks = soa::Filtered>; // Table aliases - MC - using MyFilteredMCGenCollisions = soa::Filtered>; + using MyFilteredMCGenCollisions = soa::Filtered>; using MyFilteredMCGenCollision = MyFilteredMCGenCollisions::iterator; using MyFilteredMCParticles = soa::Filtered; using MyFilteredMCRecCollision = soa::Filtered>::iterator; @@ -79,11 +81,11 @@ struct ThreeParticleCorrelations { SliceCache cache; ConfigurableAxis confCentBins{"confCentBins", {VARIABLE_WIDTH, 0.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f}, "ME Centrality binning"}; ConfigurableAxis confZvtxBins{"confZvtxBins", {VARIABLE_WIDTH, -7.0f, -5.0f, -3.0f, -1.0f, 0.0f, 1.0f, 3.0f, 5.0f, 7.0f}, "ME Zvtx binning"}; - using BinningType = ColumnBinningPolicy; + using BinningType = ColumnBinningPolicy; + using BinningTypeMC = ColumnBinningPolicy; BinningType collBinning{{confCentBins, confZvtxBins}, true}; - Pair pairData{collBinning, 5, -1, &cache}; - SameKindPair pairMC{collBinning, 5, -1, &cache}; + BinningTypeMC collBinningMC{{confCentBins, confZvtxBins}, true}; // Process configurables Configurable confFilterSwitch{"confFilterSwitch", false, "Switch for the fakeV0Filter function"}; @@ -123,6 +125,7 @@ struct ThreeParticleCorrelations { rQARegistry.add("hTrackEta", "hTrackEta", {HistType::kTH1D, {{100, -1, 1}}}); rQARegistry.add("hTrackPhi", "hTrackPhi", {HistType::kTH1D, {{100, (-1. / 2) * constants::math::PI, (5. / 2) * constants::math::PI}}}); rQARegistry.add("hEventCentrality", "hEventCentrality", {HistType::kTH1D, {{centralityAxis}}}); + rQARegistry.add("hEventCentrality_MC", "hEventCentrality_MC", {HistType::kTH1D, {{centralityAxis}}}); rQARegistry.add("hEventZvtx", "hEventZvtx", {HistType::kTH1D, {{zvtxAxis}}}); rQARegistry.add("hdEdx", "hdEdx", {HistType::kTH2D, {{56, 0.2, 3.0}, {180, 20, 200}}}); @@ -146,7 +149,7 @@ struct ThreeParticleCorrelations { rQARegistry.add("hInvMassLambda", "hInvMassLambda", {HistType::kTH3D, {{lambdaInvMassAxis}, {v0PtAxis}, {centralityAxis}}}); rQARegistry.add("hInvMassAntiLambda", "hInvMassAntiLambda", {HistType::kTH3D, {{lambdaInvMassAxis}, {v0PtAxis}, {centralityAxis}}}); - rQARegistry.add("hNLambdas_MC", "hNLambdas_MC", {HistType::kTH3D, {{2, -2, 2}, {v0PtAxis}, {centralityAxis}}}); + rQARegistry.add("hNLambdas", "hNLambdas", {HistType::kTH3D, {{2, -2, 2}, {v0PtAxis}, {centralityAxis}}}); // PhiStar rPhiStarRegistry.add("hSEProtonPreCut", "hSEProtonPreCut", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); @@ -223,7 +226,7 @@ struct ThreeParticleCorrelations { auto bc = collision.bc_as(); auto bField = getMagneticField(bc.timestamp()); - rQARegistry.fill(HIST("hEventCentrality"), collision.centFT0M()); + rQARegistry.fill(HIST("hEventCentrality"), collision.centFT0C()); rQARegistry.fill(HIST("hEventZvtx"), collision.posZ()); // Start of the Track QA @@ -261,17 +264,17 @@ struct ThreeParticleCorrelations { } // End of the Track QA - // Start of the Same-Event Correlations + // Start of the Same-Event correlations for (const auto& trigger : v0s) { if (v0Filters(trigger)) { triggSign = v0Sign(trigger); if (triggSign == 1) { candMass = trigger.mLambda(); - rQARegistry.fill(HIST("hInvMassLambda"), trigger.mLambda(), trigger.pt(), collision.centFT0M()); + rQARegistry.fill(HIST("hInvMassLambda"), trigger.mLambda(), trigger.pt(), collision.centFT0C()); } else if (triggSign == -1) { candMass = trigger.mAntiLambda(); - rQARegistry.fill(HIST("hInvMassAntiLambda"), trigger.mAntiLambda(), trigger.pt(), collision.centFT0M()); + rQARegistry.fill(HIST("hInvMassAntiLambda"), trigger.mAntiLambda(), trigger.pt(), collision.centFT0C()); } for (const auto& associate : tracks) { @@ -284,19 +287,19 @@ struct ThreeParticleCorrelations { if (candMass >= massLambda - 4 * dGaussSigma && candMass <= massLambda + 4 * dGaussSigma) { if (assocPID[0] == 0.0) { // Pions - rSECorrRegistry.fill(HIST("hSameLambdaPion_SGNL"), deltaPhi, deltaEta, collision.centFT0M(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate.sign(), associate.pt())); + rSECorrRegistry.fill(HIST("hSameLambdaPion_SGNL"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate.sign(), associate.pt())); } else if (assocPID[0] == 1.0) { // Kaons - rSECorrRegistry.fill(HIST("hSameLambdaKaon_SGNL"), deltaPhi, deltaEta, collision.centFT0M(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate.sign(), associate.pt())); + rSECorrRegistry.fill(HIST("hSameLambdaKaon_SGNL"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate.sign(), associate.pt())); } else if (assocPID[0] == 2.0) { // Protons - rSECorrRegistry.fill(HIST("hSameLambdaProton_SGNL"), deltaPhi, deltaEta, collision.centFT0M(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate.sign(), associate.pt())); + rSECorrRegistry.fill(HIST("hSameLambdaProton_SGNL"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate.sign(), associate.pt())); } } else if (candMass >= massLambda - 8 * dGaussSigma && candMass <= massLambda + 8 * dGaussSigma) { if (assocPID[0] == 0.0) { // Pions - rSECorrRegistry.fill(HIST("hSameLambdaPion_SB"), deltaPhi, deltaEta, collision.centFT0M(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate.sign(), associate.pt())); + rSECorrRegistry.fill(HIST("hSameLambdaPion_SB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate.sign(), associate.pt())); } else if (assocPID[0] == 1.0) { // Kaons - rSECorrRegistry.fill(HIST("hSameLambdaKaon_SB"), deltaPhi, deltaEta, collision.centFT0M(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate.sign(), associate.pt())); + rSECorrRegistry.fill(HIST("hSameLambdaKaon_SB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate.sign(), associate.pt())); } else if (assocPID[0] == 2.0) { // Protons - rSECorrRegistry.fill(HIST("hSameLambdaProton_SB"), deltaPhi, deltaEta, collision.centFT0M(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate.sign(), associate.pt())); + rSECorrRegistry.fill(HIST("hSameLambdaProton_SB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate.sign(), associate.pt())); } } } @@ -304,13 +307,16 @@ struct ThreeParticleCorrelations { } } } - // End of the Same-Event Correlations + // End of the Same-Event correlations } - void processMixed(MyFilteredCollisions const&, MyFilteredV0s const&, MyFilteredTracks const&, aod::BCsWithTimestamps const&) + void processMixed(MyFilteredCollisions const& collisions, MyFilteredV0s const& v0s, MyFilteredTracks const& tracks, aod::BCsWithTimestamps const&) { - // Start of the Mixed-events Correlations + auto tracksTuple = std::make_tuple(v0s, tracks); + Pair pairData{collBinning, 5, -1, collisions, tracksTuple, &cache}; + + // Start of the Mixed-Event correlations for (const auto& [coll_1, v0_1, coll_2, track_2] : pairData) { auto bc = coll_1.bc_as(); @@ -332,31 +338,32 @@ struct ThreeParticleCorrelations { if (candMass >= massLambda - 4 * dGaussSigma && candMass <= massLambda + 4 * dGaussSigma) { if (assocPID[0] == 0.0) { // Pions - rMECorrRegistry.fill(HIST("hMixLambdaPion_SGNL"), deltaPhi, deltaEta, coll_1.centFT0M(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate.sign(), associate.pt())); + rMECorrRegistry.fill(HIST("hMixLambdaPion_SGNL"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate.sign(), associate.pt())); } else if (assocPID[0] == 1.0) { // Kaons - rMECorrRegistry.fill(HIST("hMixLambdaKaon_SGNL"), deltaPhi, deltaEta, coll_1.centFT0M(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate.sign(), associate.pt())); + rMECorrRegistry.fill(HIST("hMixLambdaKaon_SGNL"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate.sign(), associate.pt())); } else if (assocPID[0] == 2.0) { // Protons - rMECorrRegistry.fill(HIST("hMixLambdaProton_SGNL"), deltaPhi, deltaEta, coll_1.centFT0M(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate.sign(), associate.pt())); + rMECorrRegistry.fill(HIST("hMixLambdaProton_SGNL"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate.sign(), associate.pt())); } } else if (candMass >= massLambda - 8 * dGaussSigma && candMass <= massLambda + 8 * dGaussSigma) { if (assocPID[0] == 0.0) { // Pions - rMECorrRegistry.fill(HIST("hMixLambdaPion_SB"), deltaPhi, deltaEta, coll_1.centFT0M(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate.sign(), associate.pt())); + rMECorrRegistry.fill(HIST("hMixLambdaPion_SB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate.sign(), associate.pt())); } else if (assocPID[0] == 1.0) { // Kaons - rMECorrRegistry.fill(HIST("hMixLambdaKaon_SB"), deltaPhi, deltaEta, coll_1.centFT0M(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate.sign(), associate.pt())); + rMECorrRegistry.fill(HIST("hMixLambdaKaon_SB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate.sign(), associate.pt())); } else if (assocPID[0] == 2.0) { // Protons - rMECorrRegistry.fill(HIST("hMixLambdaProton_SB"), deltaPhi, deltaEta, coll_1.centFT0M(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate.sign(), associate.pt())); + rMECorrRegistry.fill(HIST("hMixLambdaProton_SB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate.sign(), associate.pt())); } } } } } } - // End of the Mixed-events Correlations + // End of the Mixed-Event Correlations } void processMCSame(MyFilteredMCGenCollision const& collision, MyFilteredMCParticles const& particles) { + rQARegistry.fill(HIST("hEventCentrality_MC"), collision.bestCollisionCentFT0C()); Partition mcTriggers = (aod::mcparticle::pdgCode == static_cast(kLambda0) || aod::mcparticle::pdgCode == static_cast(kLambda0Bar)) && aod::mcparticle::pt > 0.6f && aod::mcparticle::pt < 12.0f && nabs(aod::mcparticle::eta) < 0.72f; Partition mcAssociates = (((aod::mcparticle::pdgCode == static_cast(kPiPlus) || aod::mcparticle::pdgCode == static_cast(kPiMinus)) && aod::mcparticle::pt > 0.3f && aod::mcparticle::pt < 2.3f) || ((aod::mcparticle::pdgCode == static_cast(kKPlus) || aod::mcparticle::pdgCode == static_cast(kKMinus)) && aod::mcparticle::pt > 0.5f && aod::mcparticle::pt < 2.5f) || @@ -364,17 +371,16 @@ struct ThreeParticleCorrelations { mcTriggers.bindTable(particles); mcAssociates.bindTable(particles); - // Start of the MC Same-Event Correlations + // Start of the MC Same-Event correlations for (const auto& trigger : mcTriggers) { if (trigger.isPhysicalPrimary()) { if (trigger.pdgCode() > 0) { triggSign = 1; - rQARegistry.fill(HIST("hNLambdas_MC"), 1, trigger.pt(), collision.centFT0M()); } else if (trigger.pdgCode() < 0) { triggSign = -1; - rQARegistry.fill(HIST("hNLambdas_MC"), -1, trigger.pt(), collision.centFT0M()); } + rQARegistry.fill(HIST("hNLambdas"), triggSign, trigger.pt(), collision.bestCollisionCentFT0C()); for (const auto& associate : mcAssociates) { if (associate.isPhysicalPrimary()) { @@ -389,11 +395,11 @@ struct ThreeParticleCorrelations { deltaEta = trigger.eta() - associate.eta(); if (std::abs(associate.pdgCode()) == kPiPlus) { - rSECorrRegistry.fill(HIST("hSameLambdaPion_MC"), deltaPhi, deltaEta, collision.centFT0M(), collision.posZ(), triggSign, assocSign); + rSECorrRegistry.fill(HIST("hSameLambdaPion_MC"), deltaPhi, deltaEta, collision.bestCollisionCentFT0C(), collision.posZ(), triggSign, assocSign); } else if (std::abs(associate.pdgCode()) == kKPlus) { - rSECorrRegistry.fill(HIST("hSameLambdaKaon_MC"), deltaPhi, deltaEta, collision.centFT0M(), collision.posZ(), triggSign, assocSign); + rSECorrRegistry.fill(HIST("hSameLambdaKaon_MC"), deltaPhi, deltaEta, collision.bestCollisionCentFT0C(), collision.posZ(), triggSign, assocSign); } else if (std::abs(associate.pdgCode()) == kProton) { - rSECorrRegistry.fill(HIST("hSameLambdaProton_MC"), deltaPhi, deltaEta, collision.centFT0M(), collision.posZ(), triggSign, assocSign); + rSECorrRegistry.fill(HIST("hSameLambdaProton_MC"), deltaPhi, deltaEta, collision.bestCollisionCentFT0C(), collision.posZ(), triggSign, assocSign); } } } @@ -402,9 +408,12 @@ struct ThreeParticleCorrelations { // End of the MC Same-Event Correlations } - void processMCMixed(MyFilteredMCGenCollisions const&, MyFilteredMCParticles const&) + void processMCMixed(MyFilteredMCGenCollisions const& collisions, MyFilteredMCParticles const& particles) { + auto particlesTuple = std::make_tuple(particles); + SameKindPair pairMC{collBinningMC, 5, -1, collisions, particlesTuple, &cache}; + // Start of the MC Mixed-events Correlations for (const auto& [coll_1, v0_1, coll_2, track_2] : pairMC) { Partition mcTriggers = (aod::mcparticle::pdgCode == static_cast(kLambda0) || aod::mcparticle::pdgCode == static_cast(kLambda0Bar)) && aod::mcparticle::pt > 0.6f && aod::mcparticle::pt < 12.0f && nabs(aod::mcparticle::eta) < 0.72f; @@ -432,11 +441,11 @@ struct ThreeParticleCorrelations { deltaEta = trigger.eta() - associate.eta(); if (std::abs(associate.pdgCode()) == kPiPlus) { - rMECorrRegistry.fill(HIST("hMixLambdaPion_MC"), deltaPhi, deltaEta, coll_1.centFT0M(), coll_1.posZ(), triggSign, assocSign); + rMECorrRegistry.fill(HIST("hMixLambdaPion_MC"), deltaPhi, deltaEta, coll_1.bestCollisionCentFT0C(), coll_1.posZ(), triggSign, assocSign); } else if (std::abs(associate.pdgCode()) == kKPlus) { - rMECorrRegistry.fill(HIST("hMixLambdaKaon_MC"), deltaPhi, deltaEta, coll_1.centFT0M(), coll_1.posZ(), triggSign, assocSign); + rMECorrRegistry.fill(HIST("hMixLambdaKaon_MC"), deltaPhi, deltaEta, coll_1.bestCollisionCentFT0C(), coll_1.posZ(), triggSign, assocSign); } else if (std::abs(associate.pdgCode()) == kProton) { - rMECorrRegistry.fill(HIST("hMixLambdaProton_MC"), deltaPhi, deltaEta, coll_1.centFT0M(), coll_1.posZ(), triggSign, assocSign); + rMECorrRegistry.fill(HIST("hMixLambdaProton_MC"), deltaPhi, deltaEta, coll_1.bestCollisionCentFT0C(), coll_1.posZ(), triggSign, assocSign); } } } @@ -553,8 +562,8 @@ struct ThreeParticleCorrelations { PROCESS_SWITCH(ThreeParticleCorrelations, processSame, "Process same-event correlations", true); PROCESS_SWITCH(ThreeParticleCorrelations, processMixed, "Process mixed-event correlations", true); - PROCESS_SWITCH(ThreeParticleCorrelations, processMCSame, "Process MC same-event correlations", true); - PROCESS_SWITCH(ThreeParticleCorrelations, processMCMixed, "Process MC mixed-event correlations", true); + PROCESS_SWITCH(ThreeParticleCorrelations, processMCSame, "Process MC same-event correlations", false); + PROCESS_SWITCH(ThreeParticleCorrelations, processMCMixed, "Process MC mixed-event correlations", false); PROCESS_SWITCH(ThreeParticleCorrelations, processMCGen, "Process Monte-Carlo, generator level", false); PROCESS_SWITCH(ThreeParticleCorrelations, processMCRec, "Process Monte-Carlo, reconstructed level", false); From 2e6be0c2a3757962d8da715d37d5a6ca44220697 Mon Sep 17 00:00:00 2001 From: navneetkumar231295 <71565461+navneetkumar231295@users.noreply.github.com> Date: Sat, 15 Mar 2025 01:14:18 +0530 Subject: [PATCH 0675/1650] [PWGLF] The efficiency calculation part is included by adding processMCLight and processMCTrue (#10444) Co-authored-by: Navneet --- .../Tasks/Resonances/chargedkstaranalysis.cxx | 85 +++++++++++++++++-- 1 file changed, 77 insertions(+), 8 deletions(-) diff --git a/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx b/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx index a1beb862cd6..8286f876bc8 100644 --- a/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx +++ b/PWGLF/Tasks/Resonances/chargedkstaranalysis.cxx @@ -25,7 +25,7 @@ #include #include #include -// #include +#include #include #include @@ -79,6 +79,8 @@ struct chargedkstaranalysis { {VARIABLE_WIDTH, 0.0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8, 5.0, 5.2, 5.4, 5.6, 5.8, 6.0, 6.2, 6.4, 6.6, 6.8, 7.0, 7.2, 7.4, 7.6, 7.8, 8.0, 8.2, 8.4, 8.6, 8.8, 9.0, 9.2, 9.4, 9.6, 9.8, 10.0}, "Binning of the pT axis"}; + AxisSpec k892pmCountAxis = {2, 0., 2., "K*^{+}(892) = 1, K*^{-}(892) = 2"}; + HistogramRegistry histos1{ "histos1", {}, @@ -146,8 +148,8 @@ struct chargedkstaranalysis { // For rotational background Configurable fillRotation{"fillRotation", true, "fill rotation"}; - Configurable confMinRot{"confMinRot", 5.0 * TMath::Pi() / 6.0, "Minimum of rotation"}; - Configurable confMaxRot{"confMaxRot", 7.0 * TMath::Pi() / 6.0, "Maximum of rotation"}; + Configurable confMinRot{"confMinRot", 5.0 * o2::constants::math::PI / 6.0, "Minimum of rotation"}; + Configurable confMaxRot{"confMaxRot", 7.0 * o2::constants::math::PI / 6.0, "Maximum of rotation"}; Configurable nBkgRotations{"nBkgRotations", 9, "Number of rotated copies (background) per each original candidate"}; void init(InitContext const&) @@ -224,7 +226,22 @@ struct chargedkstaranalysis { "Invariant mass of CKS meson MixedEvent Sign", kTHnSparseF, {invMassAxis, ptAxis, centAxis}, true); if (fillRotation) { - histos1.add("hRotation", "hRotation", kTH1F, {{360, 0.0, 2.0 * TMath::Pi()}}); + histos1.add("hRotation", "hRotation", kTH1F, {{360, 0.0, o2::constants::math::TwoPI}}); + } + + // for MC production + if (doprocessMCTrue) { + // DEBUG HISTOGRAMS + histos1.add("hK892pmCounter", "Generated MC resonances", kTH1F, {k892pmCountAxis}); + histos1.add("k892pmPtGen", "pT distribution of True MC charged K*(892)", kTH1F, {ptAxis}); + histos1.add("k892pPtGen", "pT distribution of True MC K*(892) Plus", kTH1F, {ptAxis}); + histos1.add("k892mPtGen", "pT distribution of True MC K*(892) Minus", kTH1F, {ptAxis}); + + // histos.add("hDaughterCounter", "Generated MC resonance daughters", kTH1F, {daughterCountAxis}); + } + if (doprocessMCLight) { + // MC QA + histos1.add("k892pmPtRec", "pT distribution of Reconstructed MC charged K*(892)", kTH1F, {ptAxis}); } } double massPi = o2::constants::physics::MassPionCharged; @@ -318,18 +335,35 @@ struct chargedkstaranalysis { // Reconstructed K*(892)pm 3d mass, pt, multiplicity histogram histos1.fill(HIST("chargekstarMassPtMultPtUnlikeSign"), lResonance.M(), lResonance.Pt(), multiplicity); - + if constexpr (IsMC) { + bool pass1 = false; + bool pass2 = false; + // LOG(info) << "track PDG:\t" << trk.pdgCode() << "\tV0 PDG:\t" << v0.pdgCode(); + if ((track.pdgCode() != PDG_t::kPiPlus) && (v0.pdgCode() != PDG_t::kK0Short)) { // One decay to K0s and the other to pi+ (K*(892)+ mother) - Particle pass + pass1 = true; + } + if ((track.pdgCode() != PDG_t::kPiMinus) && (v0.pdgCode() != -310)) { // One decay to K0s and the other to pi+ (K*(892)+ mother) - Particle pass + pass2 = true; + } + if (!pass1 && !pass2) // Go on only if we have both decay products, else skip to next iteration + continue; + if (track.motherPDG() != v0.motherPDG()) + continue; + // LOG(info) << "track PDG:\t" << trk.pdgCode() << "\tV0 PDG:\t" << v0.pdgCode(); + if (track.motherPDG() != o2::constants::physics::Pdg::kKPlusStar892) + continue; + histos1.fill(HIST("k892pmPtRec"), lResonance.Pt()); + } } else { histos1.fill(HIST("chargedkstarinvmassMixedEvent"), lResonance.M()); // Reconstructed K*(892)pm 3d mass, pt, multiplicity histogram histos1.fill(HIST("chargekstarMassPtMultPtMixedEvent"), lResonance.M(), lResonance.Pt(), multiplicity); } - if constexpr (!IsMix) { if (fillRotation) { for (int nrotbkg = 0; nrotbkg < nBkgRotations; nrotbkg++) { - auto rotangle = TMath::Pi(); + auto rotangle = o2::constants::math::PI; if (nBkgRotations > 1) { auto anglestart = confMinRot; auto angleend = confMaxRot; @@ -341,7 +375,7 @@ struct chargedkstaranalysis { auto rotpionPy = lDecayDaughter.Px() * std::sin(rotangle) + lDecayDaughter.Py() * std::cos(rotangle); pionrot.SetXYZM(rotpionPx, rotpionPy, lDecayDaughter.Pz(), massPi); chargekstarrot = pionrot + lDecayV0; - if (TMath::Abs(chargekstarrot.Rapidity()) > confRapidity) { + if (std::abs(chargekstarrot.Rapidity()) > confRapidity) { continue; } histos1.fill(HIST("hSparseChargeKstarSameEventRotational"), chargekstarrot.M(), chargekstarrot.Pt(), multiplicity); @@ -457,6 +491,41 @@ struct chargedkstaranalysis { } PROCESS_SWITCH(chargedkstaranalysis, processMEnew, "Process Mixed events new", true); + + void processMCTrue(aod::ResoMCParents const& resoParents) + { + for (const auto& part : resoParents) { // loop over all pre-filtered MC particles + if (std::abs(part.pdgCode()) != o2::constants::physics::Pdg::kKPlusStar892) // K*892(pm) + continue; + if (std::abs(part.y()) > 0.5) // rapidity cut + continue; + bool pass1 = false; + bool pass2 = false; + + if (part.daughterPDG1() == PDG_t::kPiPlus && part.daughterPDG2() == PDG_t::kK0Short) { // One decay to K0s and the other to pi+ (K*(892)+ mother) - Particle pass + pass1 = true; + histos1.fill(HIST("hK892pmCounter"), 0.5); + histos1.fill(HIST("k892pPtGen"), part.pt()); + } + if (part.daughterPDG1() == PDG_t::kPiMinus && part.daughterPDG2() == -310) { // One decay to AntiK0s and the other to pi- (K*(892)- mother) - Antiparticle pass + pass2 = true; + histos1.fill(HIST("hK892pmCounter"), 1.5); + histos1.fill(HIST("k892mPtGen"), part.pt()); + } + if (!pass1 && !pass2) // Go on only if we have both decay products, else skip to next iteration + continue; + histos1.fill(HIST("k892pmPtGen"), part.pt()); + } + } + PROCESS_SWITCH(chargedkstaranalysis, processMCTrue, "Process Event for MC", false); + + void processMCLight(aod::ResoCollision const& collision, + soa::Join const& resotracks, + soa::Join const& resov0s) + { + fillHistograms(collision, resotracks, resov0s); + } + PROCESS_SWITCH(chargedkstaranalysis, processMCLight, "Process Event for MC", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From f535991b8ff519130a41699d1daef55fa5280b94 Mon Sep 17 00:00:00 2001 From: Preet-Bhanjan Date: Fri, 14 Mar 2025 20:55:32 +0100 Subject: [PATCH 0676/1650] [PWGCF] Fixed bugs and addition of event and track selections (#10491) Co-authored-by: Preet Pati --- PWGCF/Flow/Tasks/flowPbpbPikp.cxx | 29 +++++++++++++++++++++--- PWGCF/Flow/Tasks/resonancesGfwFlow.cxx | 31 +++++++++++++++----------- 2 files changed, 44 insertions(+), 16 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowPbpbPikp.cxx b/PWGCF/Flow/Tasks/flowPbpbPikp.cxx index 1a0a137e1b8..311cccc5b84 100644 --- a/PWGCF/Flow/Tasks/flowPbpbPikp.cxx +++ b/PWGCF/Flow/Tasks/flowPbpbPikp.cxx @@ -85,6 +85,10 @@ struct FlowPbpbPikp { O2_DEFINE_CONFIGURABLE(cfgCutDCAxy, float, 2.0f, "DCAxy range for tracks") O2_DEFINE_CONFIGURABLE(cfgCutDCAz, float, 2.0f, "DCAz range for tracks") + O2_DEFINE_CONFIGURABLE(cfgCutOccupancy, int, 3000, "Occupancy cut") + O2_DEFINE_CONFIGURABLE(cfgUseGlobalTrack, bool, true, "use Global track") + O2_DEFINE_CONFIGURABLE(cfgITScluster, int, 0, "Number of ITS cluster") + ConfigurableAxis axisVertex{"axisVertex", {20, -10, 10}, "vertex axis for histograms"}; ConfigurableAxis axisPhi{"axisPhi", {60, 0.0, constants::math::TwoPI}, "phi axis for histograms"}; ConfigurableAxis axisEta{"axisEta", {40, -1., 1.}, "eta axis for histograms"}; @@ -256,6 +260,18 @@ struct FlowPbpbPikp { PROTONS }; + template + bool selectionTrack(const TTrack& track) + { + if (cfgUseGlobalTrack && !(track.isGlobalTrack() && track.isPVContributor() && track.itsNCls() > cfgITScluster && track.tpcNClsFound() > cfgTpcCluster && track.hasTPC())) { + return false; + } + if (!cfgUseGlobalTrack && !(track.isPVContributor() && track.itsNCls() > cfgITScluster && track.hasTPC())) { + return false; + } + return true; + } + template int getNsigmaPID(TTrack track) { @@ -476,7 +492,12 @@ struct FlowPbpbPikp { int nTot = tracks.size(); if (nTot < 1) return; - if (!collision.sel8()) + + if (!collision.sel8() || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(aod::evsel::kNoITSROFrameBorder) || !collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV) || !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) + return; + + int occupancy = collision.trackOccupancyInTimeRange(); + if (occupancy > cfgCutOccupancy) return; float lRandom = fRndm->Rndm(); @@ -495,14 +516,16 @@ struct FlowPbpbPikp { histos.fill(HIST("hVtxZ"), vtxz); histos.fill(HIST("hMult"), nTot); - histos.fill(HIST("hCent"), collision.centFT0C()); + histos.fill(HIST("hCent"), cent); fGFW->Clear(); float weff = 1; int pidIndex; - loadCorrections(bc); + loadCorrections(bc); // load corrections for the each event for (auto const& track : tracks) { + if (!selectionTrack(track)) + continue; double pt = track.pt(); histos.fill(HIST("hPhi"), track.phi()); histos.fill(HIST("hEta"), track.eta()); diff --git a/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx b/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx index 450830bd3e7..949c7a49757 100644 --- a/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx +++ b/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx @@ -114,9 +114,9 @@ struct ResonancesGfwFlow { O2_DEFINE_CONFIGURABLE(cfgUseMCCLambda, bool, false, "Use mass cross check for lambda") O2_DEFINE_CONFIGURABLE(cfgUseMCCK0, bool, false, "Use mass cross check for K0") - O2_DEFINE_CONFIGURABLE(cfgNPhiMassBins, int, 70, "Invasriant mass bins for phi") - O2_DEFINE_CONFIGURABLE(cfgNK0MassBins, int, 120, "Invasriant mass bins for K0") - O2_DEFINE_CONFIGURABLE(cfgNLambdaMassBins, int, 70, "Invasriant mass bins for lambda") + O2_DEFINE_CONFIGURABLE(cfgNPhiMassBins, double, 70, "Invasriant mass bins for phi") + O2_DEFINE_CONFIGURABLE(cfgNK0MassBins, double, 70, "Invasriant mass bins for K0") + O2_DEFINE_CONFIGURABLE(cfgNLambdaMassBins, double, 70, "Invasriant mass bins for lambda") // Defining configurable axis ConfigurableAxis axisVertex{"axisVertex", {20, -10, 10}, "vertex axis for histograms"}; @@ -127,14 +127,14 @@ struct ResonancesGfwFlow { ConfigurableAxis axisNsigmaTPC{"axisNsigmaTPC", {80, -5, 5}, "nsigmaTPC axis"}; ConfigurableAxis axisNsigmaTOF{"axisNsigmaTOF", {80, -5, 5}, "nsigmaTOF axis"}; ConfigurableAxis axisParticles{"axisParticles", {3, 0, 3}, "axis for different hadrons"}; - ConfigurableAxis axisPhiMass{"axisPhiMass", {70, 0.99, 1.06}, "axis for invariant mass distibution for Phi"}; - ConfigurableAxis axisK0Mass{"axisK0Mass", {120, 0.44, 0.56}, "axis for invariant mass distibution for K0"}; - ConfigurableAxis axisLambdaMass{"axisLambdaMass", {70, 1.08, 1.15}, "axis for invariant mass distibution for Lambda"}; + ConfigurableAxis axisPhiMass{"axisPhiMass", {cfgNPhiMassBins, 0.99, 1.06}, "axis for invariant mass distibution for Phi"}; + ConfigurableAxis axisK0Mass{"axisK0Mass", {cfgNK0MassBins, cfgMassK0Min, cfgMassK0Max}, "axis for invariant mass distibution for K0"}; + ConfigurableAxis axisLambdaMass{"axisLambdaMass", {cfgNLambdaMassBins, cfgMassLambdaMin, cfgMassLambdaMax}, "axis for invariant mass distibution for Lambda"}; ConfigurableAxis axisTPCsignal{"axisTPCsignal", {10000, 0, 1000}, "axis for TPC signal"}; ConfigurableAxis axisTOFsignal{"axisTOFsignal", {10000, 0, 1000}, "axis for TOF signal"}; Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; - Filter trackFilter = (nabs(aod::track::dcaXY) < cfgCutDCAxy) && (nabs(aod::track::dcaZ) < cfgCutDCAz) && (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtPOIMin) && (aod::track::pt < cfgCutPtPOIMax); + Filter trackFilter = (nabs(aod::track::dcaXY) < cfgCutDCAxy) && (nabs(aod::track::dcaZ) < cfgCutDCAz) && (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtPOIMin) && (aod::track::pt < cfgCutPtPOIMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls); using AodCollisions = soa::Filtered>; using AodTracksWithoutBayes = soa::Filtered>; @@ -225,8 +225,8 @@ struct ResonancesGfwFlow { fPtAxis = new TAxis(nPtBins, ptBins); fPhiMassAxis = new TAxis(cfgNPhiMassBins, 0.99, 1.06); - fK0MassAxis = new TAxis(cfgNK0MassBins, 0.44, 0.56); - fLambdaMassAxis = new TAxis(cfgNLambdaMassBins, 1.08, 1.15); + fK0MassAxis = new TAxis(cfgNK0MassBins, cfgMassK0Min, cfgMassK0Max); + fLambdaMassAxis = new TAxis(cfgNLambdaMassBins, cfgMassLambdaMin, cfgMassLambdaMax); int nPhisPtMassBins = nPtBins * cfgNPhiMassBins; int nK0sPtMassBins = nPtBins * cfgNK0MassBins; @@ -253,7 +253,7 @@ struct ResonancesGfwFlow { fGFW->AddRegion("poiNantilam", -0.8, -0.4, 1 + nLambdasPtMassBins, 16); fGFW->AddRegion("olNantilam", -0.8, -0.4, 1 + nLambdasPtMassBins, 256); - //********** Defining the correlations ********** + //********** Defining the correlations ************ // reference particles corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Phi08Gap22", kFALSE)); corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Ks08Gap22", kFALSE)); @@ -569,9 +569,9 @@ struct ResonancesGfwFlow { return false; // Mass cross check - if (cfgUseMCCK0 && std::abs(massK0Short - 1.11568) < 0.005) + if (cfgUseMCCK0 && std::abs(massLambda - 1.11568) < 0.005) return false; - if (cfgUseMCCK0 && std::abs(massK0Short - 1.11568) < 0.005) + if (cfgUseMCCK0 && std::abs(massLambda - 1.11568) < 0.005) return false; bool withinPtPOI = (cfgCutPtPOIMin < candidate.pt()) && (candidate.pt() < cfgCutPtPOIMax); // within POI pT range @@ -601,6 +601,10 @@ struct ResonancesGfwFlow { void process(AodCollisions::iterator const& collision, aod::BCsWithTimestamps const&, AodTracksWithoutBayes const& tracks, aod::V0Datas const& V0s) { + int nTot = tracks.size(); + if (nTot < 1) + return; + if (!collision.sel8() || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(aod::evsel::kNoITSROFrameBorder) || !collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV) || !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) return; @@ -609,7 +613,6 @@ struct ResonancesGfwFlow { return; const auto cent = collision.centFT0C(); - int nTot = tracks.size(); float vtxz = collision.posZ(); histos.fill(HIST("hVtxZ"), vtxz); @@ -620,6 +623,8 @@ struct ResonancesGfwFlow { float weff = 1, wacc = 1; for (auto const& track : tracks) { + if (!selectionTrack(track)) + continue; double pt = track.pt(); bool withinPtRef = (cfgCutPtMin < pt) && (pt < cfgCutPtMax); From f53a087f08b0182a3d0f2c9f470c4b739b91d56a Mon Sep 17 00:00:00 2001 From: ilikmeta <152337132+ilikmeta@users.noreply.github.com> Date: Fri, 14 Mar 2025 15:19:30 -0500 Subject: [PATCH 0677/1650] [PWGCF] Fix Reco tracks (#10493) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/flowGfwTask.cxx | 121 +++++++++++++++++++++---------- 1 file changed, 81 insertions(+), 40 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowGfwTask.cxx b/PWGCF/Flow/Tasks/flowGfwTask.cxx index b70d301e2f2..c9f46203f14 100644 --- a/PWGCF/Flow/Tasks/flowGfwTask.cxx +++ b/PWGCF/Flow/Tasks/flowGfwTask.cxx @@ -57,8 +57,8 @@ using namespace o2::aod::evsel; #define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable NAME{#NAME, DEFAULT, HELP}; -using SimCollisions = soa::Join; -using SimTracks = soa::Join; +using MyCollisions = soa::Join; +using MyTracks = soa::Join; using Colls = soa::Filtered>; using AodTracks = soa::Filtered>; using BCsRun3 = soa::Join; @@ -89,7 +89,7 @@ struct FlowGfwTask { O2_DEFINE_CONFIGURABLE(cfgEfficiency, std::string, "", "CCDB path to efficiency object") O2_DEFINE_CONFIGURABLE(cfgAcceptance, std::string, "", "CCDB path to acceptance object") O2_DEFINE_CONFIGURABLE(cfgMagnetField, std::string, "GLO/Config/GRPMagField", "CCDB path to Magnet field object") - O2_DEFINE_CONFIGURABLE(cfgCutOccupancyHigh, int, 3000, "High cut on TPC occupancy") + O2_DEFINE_CONFIGURABLE(cfgCutOccupancyHigh, int, 500, "High cut on TPC occupancy") O2_DEFINE_CONFIGURABLE(cfgCutOccupancyLow, int, 0, "Low cut on TPC occupancy") O2_DEFINE_CONFIGURABLE(cfgCutDCAz, float, 2, "Custom DCA Z cut") O2_DEFINE_CONFIGURABLE(cfgCutDCAxy, float, 0.2f, "Custom DCA XY cut") @@ -240,6 +240,21 @@ struct FlowGfwTask { TF1* fT0AV0AMean = nullptr; TF1* fT0AV0ASigma = nullptr; + bool isStable(int pdg) + { + if (std::abs(pdg) == PDG_t::kPiPlus) + return true; + if (std::abs(pdg) == PDG_t::kKPlus) + return true; + if (std::abs(pdg) == PDG_t::kProton) + return true; + if (std::abs(pdg) == PDG_t::kElectron) + return true; + if (std::abs(pdg) == PDG_t::kMuonMinus) + return true; + return false; + } + void init(InitContext const&) // Initialization { ccdb->setURL(ccdbUrl.value); @@ -392,8 +407,9 @@ struct FlowGfwTask { registry.add("nRecColvsCent", "", kTH2F, {{6, -0.5, 5.5}, {{axisCentrality}}}); registry.add("Pt_all_ch", "", kTH2F, {{axisCentrality}, {axisPt}}); registry.add("Pt_ch", "", kTH2F, {{axisCentrality}, {axisPt}}); - registry.add("hPtMCRec", "Monte Carlo Reco", {HistType::kTH1D, {axisPt}}); - registry.add("hCenMCRec", "Monte Carlo Reco", {HistType::kTH1D, {axisCentrality}}); + registry.add("hPtMCRec", "Monte Carlo Reco; pT (GeV/c)", {HistType::kTH1D, {axisPt}}); + registry.add("hCenMCRec", "Monte Carlo Reco; Centrality (%)", {HistType::kTH1D, {axisCentrality}}); + registry.add("hPtNchMCRec", "Reco production; pT (GeV/c); Multiplicity", {HistType::kTH2D, {axisPt, axisNch}}); registry.add("Pt_pi", "", kTH2F, {{axisCentrality}, {axisPt}}); registry.add("Pt_ka", "", kTH2F, {{axisCentrality}, {axisPt}}); registry.add("Pt_pr", "", kTH2F, {{axisCentrality}, {axisPt}}); @@ -405,8 +421,9 @@ struct FlowGfwTask { registry.add("hEventCounterMCGen", "Event counter", kTH1F, {axisEvent}); registry.add("zPosMC", ";;Entries;", kTH1F, {axisZpos}); registry.add("PtMC_ch", "", kTH2F, {{axisCentrality}, {axisPt}}); - registry.add("hPtMCGen", "Monte Carlo Truth", {HistType::kTH1D, {axisPt}}); - registry.add("hCenMCGen", "Monte Carlo Truth", {HistType::kTH1D, {axisCentrality}}); + registry.add("hPtMCGen", "Monte Carlo Truth; pT (GeV/c)", {HistType::kTH1D, {axisPt}}); + registry.add("hCenMCGen", "Monte Carlo Truth; Centrality (%)", {HistType::kTH1D, {axisCentrality}}); + registry.add("hPtNchMCGen", "Truth production; pT (GeV/c); multiplicity", {HistType::kTH2D, {axisPt, axisNch}}); registry.add("PtMC_pi", "", kTH2F, {{axisCentrality}, {axisPt}}); registry.add("PtMC_ka", "", kTH2F, {{axisCentrality}, {axisPt}}); registry.add("PtMC_pr", "", kTH2F, {{axisCentrality}, {axisPt}}); @@ -740,7 +757,7 @@ struct FlowGfwTask { if (cfgTrackSel) { return myTrackSel.IsSelected(track); } else if (cfgGlobalplusITS) { - return ((track.tpcNClsFound() >= cfgCutTPCclu) && (track.itsNCls() >= cfgCutITSclu)); + return ((track.tpcNClsFound() >= cfgCutTPCclu) || (track.itsNCls() >= cfgCutITSclu)); } else if (cfgGlobalonly) { return ((track.tpcNClsFound() >= cfgCutTPCclu) && (track.itsNCls() >= cfgCutITSclu)); } else if (cfgITSonly) { @@ -1058,14 +1075,15 @@ struct FlowGfwTask { } // End of process PROCESS_SWITCH(FlowGfwTask, processData, "Process analysis for Run 3 data", false); - using TheFilteredSimTracks = soa::Filtered; + using TheFilteredMyTracks = soa::Filtered; + using TheFilteredMyCollisions = soa::Filtered; Preslice perMCCollision = aod::mcparticle::mcCollisionId; - Preslice perCollision = aod::track::collisionId; + Preslice perCollision = aod::track::collisionId; void processpTEff(aod::McCollisions::iterator const& mccollision, - soa::SmallGroups const& collisions, + soa::SmallGroups const& collisions, aod::McParticles const& mcParticles, - TheFilteredSimTracks const& simTracks) + TheFilteredMyTracks const& tracks) { // MC reconstructed for (const auto& collision : collisions) { @@ -1074,7 +1092,10 @@ struct FlowGfwTask { if (!collision.sel8()) return; - if (cfgUseAdditionalEventCut && !eventSelected(o2::aod::mult::MultNTracksPV(), collision, simTracks.size(), centrality)) { + if (tracks.size() < 1) + return; + + if (cfgUseAdditionalEventCut && !eventSelected(o2::aod::mult::MultNTracksPV(), collision, tracks.size(), centrality)) { return; } @@ -1085,7 +1106,7 @@ struct FlowGfwTask { registry.fill(HIST("nRecColvsCent"), collisions.size(), collision.centFT0C()); registry.fill(HIST("T0Ccent"), centrality); - const auto& groupedTracks = simTracks.sliceBy(perCollision, collision.globalIndex()); + const auto& groupedTracks = tracks.sliceBy(perCollision, collision.globalIndex()); for (const auto& track : groupedTracks) { if (!trackSelected(track)) @@ -1095,9 +1116,14 @@ struct FlowGfwTask { continue; const auto& particle = track.mcParticle(); - registry.fill(HIST("hEventCounterMCRec"), 0.5); - registry.fill(HIST("hPtMCRec"), track.pt()); - registry.fill(HIST("hCenMCRec"), centrality); + + if (isStable(particle.pdgCode())) { + registry.fill(HIST("hEventCounterMCRec"), 0.5); + registry.fill(HIST("hPtMCRec"), track.pt()); + registry.fill(HIST("hCenMCRec"), centrality); + registry.fill(HIST("hPtNchMCRec"), track.pt(), track.size()); + } + registry.fill(HIST("Pt_all_ch"), centrality, track.pt()); registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); @@ -1105,20 +1131,20 @@ struct FlowGfwTask { continue; registry.fill(HIST("Pt_ch"), centrality, track.pt()); - if (particle.pdgCode() == PDG_t::kPiPlus || - particle.pdgCode() == PDG_t::kPiMinus) { + if (particle.pdgCode() == kPiPlus || + particle.pdgCode() == kPiMinus) { registry.fill(HIST("Pt_pi"), centrality, track.pt()); - } else if (particle.pdgCode() == PDG_t::kKPlus || - particle.pdgCode() == PDG_t::kKMinus) { + } else if (particle.pdgCode() == kKPlus || + particle.pdgCode() == kKMinus) { registry.fill(HIST("Pt_ka"), centrality, track.pt()); - } else if (particle.pdgCode() == PDG_t::kProton || - particle.pdgCode() == PDG_t::kProtonBar) { + } else if (particle.pdgCode() == kProton || + particle.pdgCode() == kProtonBar) { registry.fill(HIST("Pt_pr"), centrality, track.pt()); - } else if (particle.pdgCode() == PDG_t::kSigmaPlus || - particle.pdgCode() == PDG_t::kSigmaBarMinus) { + } else if (particle.pdgCode() == kSigmaPlus || + particle.pdgCode() == kSigmaBarMinus) { registry.fill(HIST("Pt_sigpos"), centrality, track.pt()); - } else if (particle.pdgCode() == PDG_t::kSigmaMinus || - particle.pdgCode() == PDG_t::kSigmaBarPlus) { + } else if (particle.pdgCode() == kSigmaMinus || + particle.pdgCode() == kSigmaBarPlus) { registry.fill(HIST("Pt_signeg"), centrality, track.pt()); } else { registry.fill(HIST("Pt_re"), centrality, track.pt()); @@ -1132,6 +1158,12 @@ struct FlowGfwTask { registry.fill(HIST("zPosMC"), mccollision.posZ()); registry.fill(HIST("hEventCounterMCGen"), 1.5); + std::vector numberOfTracks; + for (auto const& collision : collisions) { + auto groupedTracks = tracks.sliceBy(perCollision, collision.globalIndex()); + numberOfTracks.emplace_back(groupedTracks.size()); + } + for (const auto& particle : mcParticles) { if (particle.eta() < -cfgCutEta || particle.eta() > cfgCutEta) { continue; @@ -1139,29 +1171,38 @@ struct FlowGfwTask { if (particle.pt() < cfgCutPtMin || particle.pt() > cfgCutPtMax) { continue; } + if (!particle.isPhysicalPrimary()) { continue; } - registry.fill(HIST("hEventCounterMCGen"), 2.5); - registry.fill(HIST("hPtMCGen"), particle.pt()); - registry.fill(HIST("hCenMCGen"), centrality); + + if (isStable(particle.pdgCode())) { + registry.fill(HIST("hEventCounterMCGen"), 2.5); + registry.fill(HIST("hPtMCGen"), particle.pt()); + registry.fill(HIST("hCenMCGen"), centrality); + + if (collisions.size() > 0) { + registry.fill(HIST("hPtNchMCGen"), particle.pt(), numberOfTracks[0]); + } + } + registry.fill(HIST("PtMC_ch"), centrality, particle.pt()); - if (particle.pdgCode() == PDG_t::kPiPlus || - particle.pdgCode() == PDG_t::kPiMinus) { // pion + if (particle.pdgCode() == kPiPlus || + particle.pdgCode() == kPiMinus) { // pion registry.fill(HIST("PtMC_pi"), centrality, particle.pt()); - } else if (particle.pdgCode() == PDG_t::kKPlus || - particle.pdgCode() == PDG_t::kKMinus) { // kaon + } else if (particle.pdgCode() == kKPlus || + particle.pdgCode() == kKMinus) { // kaon registry.fill(HIST("PtMC_ka"), centrality, particle.pt()); - } else if (particle.pdgCode() == PDG_t::kProton || - particle.pdgCode() == PDG_t::kProtonBar) { // proton + } else if (particle.pdgCode() == kProton || + particle.pdgCode() == kProtonBar) { // proton registry.fill(HIST("PtMC_pr"), centrality, particle.pt()); - } else if (particle.pdgCode() == PDG_t::kSigmaPlus || + } else if (particle.pdgCode() == kSigmaPlus || particle.pdgCode() == - PDG_t::kSigmaBarMinus) { // positive sigma + kSigmaBarMinus) { // positive sigma registry.fill(HIST("PtMC_sigpos"), centrality, particle.pt()); - } else if (particle.pdgCode() == PDG_t::kSigmaMinus || + } else if (particle.pdgCode() == kSigmaMinus || particle.pdgCode() == - PDG_t::kSigmaBarPlus) { // negative sigma + kSigmaBarPlus) { // negative sigma registry.fill(HIST("PtMC_signeg"), centrality, particle.pt()); } else { // rest registry.fill(HIST("PtMC_re"), centrality, particle.pt()); From 7b1681136136b8c5dbbaf0b253859fd05210922b Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Sat, 15 Mar 2025 05:25:30 +0900 Subject: [PATCH 0678/1650] [PWGEM/Dilepton] update ConfYllBins (#10500) Co-authored-by: ALICE Action Bot --- PWGEM/Dilepton/Core/DileptonMC.h | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/PWGEM/Dilepton/Core/DileptonMC.h b/PWGEM/Dilepton/Core/DileptonMC.h index 8c72345639f..1583373553d 100644 --- a/PWGEM/Dilepton/Core/DileptonMC.h +++ b/PWGEM/Dilepton/Core/DileptonMC.h @@ -110,6 +110,8 @@ struct DileptonMC { ConfigurableAxis ConfPtllBins{"ConfPtllBins", {VARIABLE_WIDTH, 0.00, 0.10, 0.20, 0.30, 0.40, 0.50, 0.60, 0.70, 0.80, 0.90, 1.00, 1.10, 1.20, 1.30, 1.40, 1.50, 1.60, 1.70, 1.80, 1.90, 2.00, 2.50, 3.00, 3.50, 4.00, 4.50, 5.00, 6.00, 7.00, 8.00, 9.00, 10.00}, "pTll bins for output histograms"}; ConfigurableAxis ConfDCAllBins{"ConfDCAllBins", {VARIABLE_WIDTH, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0}, "DCAll bins for output histograms"}; + ConfigurableAxis ConfYllBins{"ConfYllBins", {VARIABLE_WIDTH, -10.f, +10.f}, "yll bins for output histograms"}; + // ConfigurableAxis ConfMmumuBins{"ConfMmumuBins", {VARIABLE_WIDTH, 0.20, 0.21, 0.22, 0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.30, 0.31, 0.32, 0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.40, 0.41, 0.42, 0.43, 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.50, 0.51, 0.52, 0.53, 0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.60, 0.61, 0.62, 0.63, 0.64, 0.65, 0.66, 0.67, 0.68, 0.69, 0.70, 0.71, 0.72, 0.73, 0.74, 0.75, 0.76, 0.77, 0.78, 0.79, 0.80, 0.81, 0.82, 0.83, 0.84, 0.85, 0.86, 0.87, 0.88, 0.89, 0.90, 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1.00, 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.10, 1.11,1.12,1.13,1.14,1.15,1.16,1.17,1.18,1.19, 1.20, 1.30, 1.40, 1.50, 1.60, 1.70, 1.80, 1.90, 2.00, 2.10, 2.20, 2.30, 2.40, 2.50, 2.60, 2.70, 2.75, 2.80, 2.85, 2.90, 2.95, 3.00, 3.05, 3.10, 3.15, 3.20, 3.25, 3.30, 3.35, 3.40, 3.45, 3.50, 3.55, 3.60, 3.65, 3.70, 3.75, 3.80, 3.85, 3.90, 3.95, 4.00, 4.10, 4.20, 4.30, 4.40, 4.50, 4.60, 4.70, 4.80, 4.90, 5.00, 5.10, 5.20, 5.30, 5.40, 5.50, 5.60, 5.70, 5.80, 5.90, 6.00, 6.10, 6.20, 6.30, 6.40, 6.50, 6.60, 6.70, 6.80, 6.90, 7.00, 7.10, 7.20, 7.30, 7.40, 7.50, 7.60, 7.70, 7.80, 7.90, 8.00, 8.10, 8.20, 8.30, 8.40, 8.50, 8.60, 8.70, 8.80, 8.90, 9.00, 9.10, 9.20, 9.30, 9.40, 9.50, 9.60, 9.70, 9.80, 9.90, 10.00, 10.10, 10.20, 10.30, 10.40, 10.50, 10.60, 10.70, 10.80, 10.90, 11.00, 11.50, 12.00}, "mmumu bins for output histograms"}; // for dimuon. one can copy bins here to hyperloop page. Configurable cfg_nbin_dphi_ee{"cfg_nbin_dphi_ee", 1, "number of bins for dphi_ee"}; // 36 @@ -301,9 +303,6 @@ struct DileptonMC { std::string pair_pt_axis_title = "p_{T,ll} (GeV/c)"; std::string pair_y_axis_title = "y_{ll}"; std::string pair_dca_axis_title = "DCA_{ll} (#sigma)"; - int nbin_y = 20; - float min_y = -1.0; - float max_y = +1.0; if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { mass_axis_title = "m_{ee} (GeV/c^{2})"; pair_pt_axis_title = "p_{T,ee} (GeV/c)"; @@ -314,26 +313,20 @@ struct DileptonMC { } else if (cfgDCAType == 2) { pair_dca_axis_title = "DCA_{ee}^{Z} (#sigma)"; } - nbin_y = 20; - min_y = -1.0; - max_y = +1.0; } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { mass_axis_title = "m_{#mu#mu} (GeV/c^{2})"; pair_pt_axis_title = "p_{T,#mu#mu} (GeV/c)"; pair_y_axis_title = "y_{#mu#mu}"; pair_dca_axis_title = "DCA_{#mu#mu}^{XY} (#sigma)"; - nbin_y = 25; - min_y = -4.5; - max_y = -2.0; } // pair info const AxisSpec axis_mass{ConfMllBins, mass_axis_title}; const AxisSpec axis_pt{ConfPtllBins, pair_pt_axis_title}; - const AxisSpec axis_y{nbin_y, min_y, max_y, pair_y_axis_title}; + const AxisSpec axis_y{ConfYllBins, pair_y_axis_title}; const AxisSpec axis_dca{ConfDCAllBins, pair_dca_axis_title}; const AxisSpec axis_pt_meson{ConfPtllBins, "p_{T} (GeV/c)"}; // for omega, phi meson pT spectra - const AxisSpec axis_y_meson{nbin_y, min_y, max_y, "y"}; // rapidity of meson + const AxisSpec axis_y_meson{ConfYllBins, "y"}; // rapidity of meson const AxisSpec axis_dphi_ee{cfg_nbin_dphi_ee, -M_PI / 2., 3. / 2. * M_PI, "#Delta#varphi = #varphi_{l1} - #varphi_{l2} (rad.)"}; // for kHFll const AxisSpec axis_deta_ee{cfg_nbin_deta_ee, -2., 2., "#Delta#eta = #eta_{l1} - #eta_{l2}"}; // for kHFll From c2a7e7bfcb106fbc1270f1039a84f7c956778283 Mon Sep 17 00:00:00 2001 From: Victor Gonzalez Date: Fri, 14 Mar 2025 21:26:20 +0100 Subject: [PATCH 0679/1650] [PWGCF] DptDpt - Tracking each of the track selection criteria (#10505) Co-authored-by: Victor --- PWGCF/TableProducer/dptdptfilter.cxx | 70 ++- PWGCF/TableProducer/dptdptfilter.h | 515 +++++++++--------- .../Tasks/dptDptPerRunQc.cxx | 7 +- 3 files changed, 309 insertions(+), 283 deletions(-) diff --git a/PWGCF/TableProducer/dptdptfilter.cxx b/PWGCF/TableProducer/dptdptfilter.cxx index d7b02e2205e..93de67eff5c 100644 --- a/PWGCF/TableProducer/dptdptfilter.cxx +++ b/PWGCF/TableProducer/dptdptfilter.cxx @@ -370,6 +370,8 @@ struct DptDptFilter { struct : ConfigurableGroup { std::string prefix = "cfgEventSelection"; Configurable itsDeadMaps{"itsDeadMaps", "", "Level of inactive chips: nocheck(empty), goodIts3, goodIts0123, goodItsAll. Default empty"}; + Configurable minOrbit{"minOrbit", -1, "Lowest orbit to track"}; + Configurable maxOrbit{"maxOrbit", INT64_MAX, "Highest orbit to track"}; struct : ConfigurableGroup { std::string prefix = "cfgOccupancySelection"; Configurable cfgOccupancyEstimation{"cfgOccupancyEstimation", "None", "Occupancy estimation: None, Tracks, FT0C. Default None"}; @@ -520,22 +522,22 @@ struct DptDptFilter { template void processReconstructed(CollisionObject const& collision, TracksObject const& ftracks, float centormult); - void processWithCent(aod::CollisionEvSelCent const& collision, DptDptFullTracks const& ftracks); + void processWithCent(aod::CollisionEvSelCent const& collision, DptDptFullTracks const& ftracks, const aod::BCsWithTimestamps&); PROCESS_SWITCH(DptDptFilter, processWithCent, "Process reco with centrality", false); - void processWithRun2Cent(aod::CollisionEvSelRun2Cent const& collision, DptDptFullTracks const& ftracks); + void processWithRun2Cent(aod::CollisionEvSelRun2Cent const& collision, DptDptFullTracks const& ftracks, const aod::BCsWithTimestamps&); PROCESS_SWITCH(DptDptFilter, processWithRun2Cent, "Process reco with Run !/2 centrality", false); - void processWithoutCent(aod::CollisionEvSel const& collision, DptDptFullTracks const& ftracks); + void processWithoutCent(aod::CollisionEvSel const& collision, DptDptFullTracks const& ftracks, const aod::BCsWithTimestamps&); PROCESS_SWITCH(DptDptFilter, processWithoutCent, "Process reco without centrality", false); - void processWithCentDetectorLevel(aod::CollisionEvSelCent const& collision, DptDptFullTracksDetLevel const& ftracks, aod::McParticles const&); + void processWithCentDetectorLevel(aod::CollisionEvSelCent const& collision, DptDptFullTracksDetLevel const& ftracks, aod::McParticles const&, const aod::BCsWithTimestamps&); PROCESS_SWITCH(DptDptFilter, processWithCentDetectorLevel, "Process MC detector level with centrality", false); - void processWithRun2CentDetectorLevel(aod::CollisionEvSelRun2Cent const& collision, DptDptFullTracksDetLevel const& ftracks, aod::McParticles const&); + void processWithRun2CentDetectorLevel(aod::CollisionEvSelRun2Cent const& collision, DptDptFullTracksDetLevel const& ftracks, aod::McParticles const&, const aod::BCsWithTimestamps&); PROCESS_SWITCH(DptDptFilter, processWithRun2CentDetectorLevel, "Process MC detector level with centrality", false); - void processWithoutCentDetectorLevel(aod::CollisionEvSel const& collision, DptDptFullTracksDetLevel const& ftracks, aod::McParticles const&); + void processWithoutCentDetectorLevel(aod::CollisionEvSel const& collision, DptDptFullTracksDetLevel const& ftracks, aod::McParticles const&, const aod::BCsWithTimestamps&); PROCESS_SWITCH(DptDptFilter, processWithoutCentDetectorLevel, "Process MC detector level without centrality", false); template @@ -582,13 +584,16 @@ void DptDptFilter::processReconstructed(CollisionObject const& collision, Tracks LOGF(DPTDPTFILTERLOGCOLLISIONS, "DptDptFilterTask::processReconstructed(). New collision with %d tracks", ftracks.size()); float mult = extractMultiplicity(collision, fCentMultEstimator); + static const int32_t nBCsPerOrbit = o2::constants::lhc::LHCMaxBunches; fhCentMultB->Fill(tentativecentmult); fhMultB->Fill(mult); fhVertexZB->Fill(collision.posZ()); uint8_t acceptedevent = uint8_t(false); float centormult = tentativecentmult; - if (isEventSelected(collision, centormult)) { + int64_t orbit = collision.template bc_as().globalBC() / nBCsPerOrbit; + bool withinOrbitOfInterest = (cfgEventSelection.minOrbit <= orbit) && (orbit < cfgEventSelection.maxOrbit); + if (withinOrbitOfInterest && isEventSelected(collision, centormult)) { acceptedevent = true; fhCentMultA->Fill(centormult); fhMultA->Fill(mult); @@ -612,32 +617,32 @@ void DptDptFilter::processReconstructed(CollisionObject const& collision, Tracks } } -void DptDptFilter::processWithCent(aod::CollisionEvSelCent const& collision, DptDptFullTracks const& ftracks) +void DptDptFilter::processWithCent(aod::CollisionEvSelCent const& collision, DptDptFullTracks const& ftracks, aod::BCsWithTimestamps const&) { processReconstructed(collision, ftracks, getCentMultPercentile(collision)); } -void DptDptFilter::processWithRun2Cent(aod::CollisionEvSelRun2Cent const& collision, DptDptFullTracks const& ftracks) +void DptDptFilter::processWithRun2Cent(aod::CollisionEvSelRun2Cent const& collision, DptDptFullTracks const& ftracks, aod::BCsWithTimestamps const&) { processReconstructed(collision, ftracks, getCentMultPercentile(collision)); } -void DptDptFilter::processWithoutCent(aod::CollisionEvSel const& collision, DptDptFullTracks const& ftracks) +void DptDptFilter::processWithoutCent(aod::CollisionEvSel const& collision, DptDptFullTracks const& ftracks, aod::BCsWithTimestamps const&) { processReconstructed(collision, ftracks, 50.0); } -void DptDptFilter::processWithCentDetectorLevel(aod::CollisionEvSelCent const& collision, DptDptFullTracksDetLevel const& ftracks, aod::McParticles const&) +void DptDptFilter::processWithCentDetectorLevel(aod::CollisionEvSelCent const& collision, DptDptFullTracksDetLevel const& ftracks, aod::McParticles const&, aod::BCsWithTimestamps const&) { processReconstructed(collision, ftracks, getCentMultPercentile(collision)); } -void DptDptFilter::processWithRun2CentDetectorLevel(aod::CollisionEvSelRun2Cent const& collision, DptDptFullTracksDetLevel const& ftracks, aod::McParticles const&) +void DptDptFilter::processWithRun2CentDetectorLevel(aod::CollisionEvSelRun2Cent const& collision, DptDptFullTracksDetLevel const& ftracks, aod::McParticles const&, aod::BCsWithTimestamps const&) { processReconstructed(collision, ftracks, getCentMultPercentile(collision)); } -void DptDptFilter::processWithoutCentDetectorLevel(aod::CollisionEvSel const& collision, DptDptFullTracksDetLevel const& ftracks, aod::McParticles const&) +void DptDptFilter::processWithoutCentDetectorLevel(aod::CollisionEvSel const& collision, DptDptFullTracksDetLevel const& ftracks, aod::McParticles const&, aod::BCsWithTimestamps const&) { processReconstructed(collision, ftracks, 50.0); } @@ -853,9 +858,20 @@ struct DptDptFilterTracks { getTaskOptionValue(initContext, "dpt-dpt-filter", "input_ccdbdate", cfgCCDBDate, false); getTaskOptionValue(initContext, "dpt-dpt-filter", "input_ccdbperiod", cfgCCDBPeriod, false); + /* create the output list which will own the task histograms */ + TList* fOutputList = new TList(); + fOutputList->SetOwner(true); + fOutput.setObject(fOutputList); + /* the track types and combinations */ tracktype = cfgTrackType.value; - initializeTrackSelection(cfgTuneTrackSelection.value); + + /* incorporate configuration parameters to the output */ + fOutputList->Add(new TParameter("TrackType", cfgTrackType, 'f')); + fOutputList->Add(new TParameter("TrackOneCharge", 1, 'f')); + fOutputList->Add(new TParameter("TrackTwoCharge", -1, 'f')); + + DptDptTrackSelection::initializeTrackSelection(cfgTuneTrackSelection.value, fOutputList); traceDCAOutliers = cfgTraceDCAOutliers; traceOutOfSpeciesParticles = cfgTraceOutOfSpeciesParticles; recoIdMethod = cfgRecoIdMethod; @@ -897,16 +913,6 @@ struct DptDptFilterTracks { insertInPIDselector(cfgKaonPIDSelection, 3); insertInPIDselector(cfgProtonPIDSelection, 4); - /* create the output list which will own the task histograms */ - TList* fOutputList = new TList(); - fOutputList->SetOwner(true); - fOutput.setObject(fOutputList); - - /* incorporate configuration parameters to the output */ - fOutputList->Add(new TParameter("TrackType", cfgTrackType, 'f')); - fOutputList->Add(new TParameter("TrackOneCharge", 1, 'f')); - fOutputList->Add(new TParameter("TrackTwoCharge", -1, 'f')); - if ((fDataType == kData) || (fDataType == kDataNoEvtSel) || (fDataType == kMC)) { /* create the reconstructed data histograms */ fhPB = new TH1F("fHistPB", "p distribution for reconstructed before;p (GeV/c);dN/dp (c/GeV)", 100, 0.0, 15.0); @@ -1424,15 +1430,25 @@ struct DptDptFilterTracks { } PROCESS_SWITCH(DptDptFilterTracks, filterGenerated, "Generated particles filtering", true) - void filterGeneratedNotReconstructedWithPID(soa::Join const& gencollisions, aod::McParticles const& particles, - soa::Join& collisions, DptDptFullTracksPIDDetLevel const& tracks) + void filterGeneratedNotReconstructed(soa::Join const& gencollisions, aod::McParticles const& particles, + soa::Join& collisions, DptDptFullTracksPIDDetLevel const& tracks) + { + particleReconstructed.resize(particles.size()); + filterTracksSpecial(collisions, tracks); + filterParticlesSpecial(gencollisions, particles); + particleReconstructed.clear(); + } + PROCESS_SWITCH(DptDptFilterTracks, filterGeneratedNotReconstructed, "Generated particles filtering selecting not reconstructed using PID", false) + + void filterGeneratedNotReconstructedWithoutPID(soa::Join const& gencollisions, aod::McParticles const& particles, + soa::Join& collisions, DptDptFullTracksDetLevel const& tracks) { particleReconstructed.resize(particles.size()); filterTracksSpecial(collisions, tracks); filterParticlesSpecial(gencollisions, particles); particleReconstructed.clear(); } - PROCESS_SWITCH(DptDptFilterTracks, filterGeneratedNotReconstructedWithPID, "Generated particles filtering", false) + PROCESS_SWITCH(DptDptFilterTracks, filterGeneratedNotReconstructedWithoutPID, "Generated particles filtering selecting not reconstructed inclusive", false) }; template diff --git a/PWGCF/TableProducer/dptdptfilter.h b/PWGCF/TableProducer/dptdptfilter.h index e7554ee35ac..576757499c4 100644 --- a/PWGCF/TableProducer/dptdptfilter.h +++ b/PWGCF/TableProducer/dptdptfilter.h @@ -223,16 +223,264 @@ static constexpr o2::aod::track::TrackSelectionFlags::flagtype TrackSelectionTPC static constexpr o2::aod::track::TrackSelectionFlags::flagtype TrackSelectionDCA = o2::aod::track::TrackSelectionFlags::kDCAz | o2::aod::track::TrackSelectionFlags::kDCAxy; +struct DptDptTrackSelection; // forward struct declaration int tracktype = 1; -std::vector trackFilters = {}; // the vector of track selectors -std::vector> maxDcaZPtDeps = {}; // max dca in z axis as function of pT for each track selector -TrackSelection* extraTrackFilter = nullptr; -bool dca2Dcut = false; -/// TODO: to incorporate our own track selectio object -float sharedTpcClusters = 1.0; ///< max fraction of shared TPC clusters -float sharedTpcClustersExtra = 1.0; ///< max fraction of shared TPC clusters for the extra track filter -float maxDCAz = 1e6f; -float maxDCAxy = 1e6f; +std::vector trackFilters = {}; // the vector of track selectors + +struct DptDptTrackSelection { + DptDptTrackSelection(TrackSelection* stdTs, TList* outputList, const char* name) : stdTrackSelection(stdTs) + { + passedHistogram = new TH1F(name, name, ptbins, ptlow, ptup); + outputList->Add(passedHistogram); + } + DptDptTrackSelection(TrackSelection* stdTs, std::function ptDepCut, TList* outputList, const char* name) + : stdTrackSelection(stdTs), + maxDcazPtDep(ptDepCut) + { + passedHistogram = new TH1F(name, name, ptbins, ptlow, ptup); + outputList->Add(passedHistogram); + } + void setMaxDcaXY(float max) + { + maxDCAxy = max; + stdTrackSelection->SetMaxDcaXY(max); + } + void setMaxDcaZ(float max) + { + maxDCAz = max; + stdTrackSelection->SetMaxDcaZ(max); + } + void setMaxDcazPtDep(std::function ptDepCut) + { + maxDcazPtDep = ptDepCut; + } + + template + bool isSelected(TrackObject const& track) const + { + if (stdTrackSelection->IsSelected(track)) { + auto checkDca2Dcut = [&](auto const& track) { + if (dca2Dcut) { + if (track.dcaXY() * track.dcaXY() / maxDCAxy / maxDCAxy + track.dcaZ() * track.dcaZ() / maxDCAz / maxDCAz > 1) { + return false; + } else { + return true; + } + } else { + return true; + } + }; + auto checkDcaZcut = [&](auto const& track) { + return ((maxDcazPtDep) ? std::fabs(track.dcaZ()) <= maxDcazPtDep(track.pt()) : true); + }; + + /* tight pT dependent DCAz cut */ + if (!checkDcaZcut(track)) { + return false; + } + /* 2D DCA xy-o-z cut */ + if (!checkDca2Dcut(track)) { + return false; + } + /* primary vertex contributor */ + if (requirePvContributor) { + if (!track.isPVContributor()) { + return false; + } + } + passedHistogram->Fill(track.pt()); + return true; + } else { + return false; + } + } + + static void initializeTrackSelection(TrackSelectionTuneCfg& tune, TList* outputList) + { + auto addTrackFilter = [](auto filter) { + trackFilters.push_back(filter); + }; + auto highQualityTpcTrack = [](TList* outList, const char* name) { + DptDptTrackSelection* tpcTrack = new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelection()), outList, name); + tpcTrack->stdTrackSelection->ResetITSRequirements(); + tpcTrack->stdTrackSelection->SetRequireITSRefit(false); + tpcTrack->stdTrackSelection->SetMinNClustersTPC(120); + tpcTrack->stdTrackSelection->SetMaxTPCFractionSharedCls(0.2f); + return tpcTrack; + }; + auto highQualityItsOnlyTrack = [](TList* outList, const char* name) { + DptDptTrackSelection* itsTrack = new DptDptTrackSelection(new TrackSelection(), [](float pt) { return 0.004f + 0.013f / pt; }, outList, name); + itsTrack->stdTrackSelection->SetTrackType(o2::aod::track::TrackTypeEnum::Track); + itsTrack->stdTrackSelection->SetRequireITSRefit(true); + itsTrack->stdTrackSelection->SetRequireHitsInITSLayers(2, {0, 1, 2}); + itsTrack->stdTrackSelection->SetMaxChi2PerClusterITS(36.0f); + itsTrack->stdTrackSelection->SetMaxDcaXYPtDep([](float pt) { return 0.004f + 0.013f / pt; }); + return itsTrack; + }; + switch (tracktype) { + case 1: { /* Run2 global track */ + DptDptTrackSelection* globalRun2 = new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelection()), outputList, "TType1Global"); + globalRun2->stdTrackSelection->SetTrackType(o2::aod::track::Run2Track); // Run 2 track asked by default + globalRun2->stdTrackSelection->SetMaxChi2PerClusterTPC(2.5f); + DptDptTrackSelection* globalSDDRun2 = new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelectionSDD()), outputList, "TType1Sdd"); + globalSDDRun2->stdTrackSelection->SetTrackType(o2::aod::track::Run2Track); // Run 2 track asked by default + globalSDDRun2->stdTrackSelection->SetMaxChi2PerClusterTPC(2.5f); + addTrackFilter(globalRun2); + addTrackFilter(globalSDDRun2); + } break; + case 3: { /* Run3 track */ + DptDptTrackSelection* globalRun3 = new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelection()), outputList, "TType3Global"); + globalRun3->stdTrackSelection->SetTrackType(o2::aod::track::TrackTypeEnum::Track); + globalRun3->stdTrackSelection->ResetITSRequirements(); + globalRun3->stdTrackSelection->SetRequireHitsInITSLayers(1, {0, 1, 2}); + DptDptTrackSelection* globalSDDRun3 = new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelection()), outputList, "TType3Sdd"); + globalSDDRun3->stdTrackSelection->SetTrackType(o2::aod::track::TrackTypeEnum::Track); + globalSDDRun3->stdTrackSelection->ResetITSRequirements(); + globalSDDRun3->stdTrackSelection->SetRequireNoHitsInITSLayers({0, 1, 2}); + globalSDDRun3->stdTrackSelection->SetRequireHitsInITSLayers(1, {3}); + addTrackFilter(globalRun3); + addTrackFilter(globalSDDRun3); + } break; + case 5: { /* Run2 TPC only track */ + DptDptTrackSelection* tpcOnly = new DptDptTrackSelection(new TrackSelection, outputList, "TType5"); + tpcOnly->stdTrackSelection->SetTrackType(o2::aod::track::Run2Track); // Run 2 track asked by default + tpcOnly->stdTrackSelection->SetMinNClustersTPC(50); + tpcOnly->stdTrackSelection->SetMaxChi2PerClusterTPC(4); + tpcOnly->setMaxDcaZ(3.2f); + tpcOnly->setMaxDcaXY(2.4f); + tpcOnly->dca2Dcut = true; + addTrackFilter(tpcOnly); + } break; + case 7: { /* Run3 TPC only track */ + DptDptTrackSelection* tpcOnly = new DptDptTrackSelection(new TrackSelection, outputList, "TType7"); + tpcOnly->stdTrackSelection->SetTrackType(o2::aod::track::TrackTypeEnum::Track); + tpcOnly->stdTrackSelection->SetMinNClustersTPC(50); + tpcOnly->stdTrackSelection->SetMaxChi2PerClusterTPC(4); + tpcOnly->setMaxDcaZ(3.2f); + tpcOnly->setMaxDcaXY(2.4f); + tpcOnly->dca2Dcut = true; + addTrackFilter(tpcOnly); + } break; + case 10: { /* Run3 track primary vertex contributor */ + DptDptTrackSelection* globalRun3 = new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelection()), outputList, "TType10Global"); + globalRun3->stdTrackSelection->SetTrackType(o2::aod::track::TrackTypeEnum::Track); + globalRun3->stdTrackSelection->ResetITSRequirements(); + globalRun3->stdTrackSelection->SetRequireHitsInITSLayers(1, {0, 1, 2}); + DptDptTrackSelection* globalSDDRun3 = new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelection()), outputList, "TType10Sdd"); + globalSDDRun3->stdTrackSelection->SetTrackType(o2::aod::track::TrackTypeEnum::Track); + globalSDDRun3->stdTrackSelection->ResetITSRequirements(); + globalSDDRun3->stdTrackSelection->SetRequireNoHitsInITSLayers({0, 1, 2}); + globalSDDRun3->stdTrackSelection->SetRequireHitsInITSLayers(1, {3}); + addTrackFilter(globalRun3); + addTrackFilter(globalSDDRun3); + } break; + case 30: { /* Run 3 default global track: kAny on 3 IB layers of ITS */ + addTrackFilter(new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibAny, TrackSelection::GlobalTrackRun3DCAxyCut::Default)), outputList, "TType30")); + } break; + case 31: { /* Run 3 global track: kTwo on 3 IB layers of ITS */ + addTrackFilter(new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibTwo, TrackSelection::GlobalTrackRun3DCAxyCut::Default)), outputList, "TType31")); + } break; + case 32: { /* Run 3 global track: kAny on all 7 layers of ITS */ + addTrackFilter(new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSallAny, TrackSelection::GlobalTrackRun3DCAxyCut::Default)), outputList, "TType32")); + } break; + case 33: { /* Run 3 global track: kAll on all 7 layers of ITS */ + addTrackFilter(new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSall7Layers, TrackSelection::GlobalTrackRun3DCAxyCut::Default)), outputList, "TType33")); + } break; + case 40: { /* Run 3 global track: kAny on 3 IB layers of ITS, tighter DCAxy */ + addTrackFilter(new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), outputList, "TType40")); + } break; + case 41: { /* Run 3 global track: kTwo on 3 IB layers of ITS, tighter DCAxy */ + addTrackFilter(new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibTwo, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), outputList, "TType41")); + } break; + case 42: { /* Run 3 global track: kAny on all 7 layers of ITS, tighter DCAxy */ + addTrackFilter(new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSallAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), outputList, "TType42")); + } break; + case 43: { /* Run 3 global track: kAll on all 7 layers of ITS, tighter DCAxy */ + addTrackFilter(new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSall7Layers, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), outputList, "TType43")); + } break; + case 50: { /* Run 3 global track: kAny on 3 IB layers of ITS, tighter DCAxy, tighter pT dep DCAz */ + addTrackFilter(new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }, outputList, "TType50")); + } break; + case 51: { /* Run 3 global track: kTwo on 3 IB layers of ITS, tighter DCAxy, tighter pT dep DCAz */ + addTrackFilter(new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibTwo, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }, outputList, "TType51")); + } break; + case 52: { /* Run 3 global track: kAny on all 7 layers of ITS, tighter DCAxy, tighter pT dep DCAz */ + addTrackFilter(new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSallAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }, outputList, "TType52")); + } break; + case 53: { /* Run 3 global track: kAll on all 7 layers of ITS, tighter DCAxy, tighter pT dep DCAz */ + addTrackFilter(new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSall7Layers, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }, outputList, "TType53")); + } break; + case 60: { /* Run 3 global track: kAny on 3 IB layers of ITS, tighter DCAxy, tighter pT dep DCAz, plus TPC+TOF only tracks */ + addTrackFilter(new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }, outputList, "TType60Global")); + addTrackFilter(highQualityTpcTrack(outputList, "TType60Tpc")); + } break; + case 61: { /* Run 3 global track: kTwo on 3 IB layers of ITS, tighter DCAxy, tighter pT dep DCAz, plus TPC+TOF only tracks */ + addTrackFilter(new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibTwo, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }, outputList, "TType61Global")); + addTrackFilter(highQualityTpcTrack(outputList, "TType61Tpc")); + } break; + case 62: { /* Run 3 global track: kAny on all 7 layers of ITS, tighter DCAxy, tighter pT dep DCAz, plus TPC+TOF only tracks */ + addTrackFilter(new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSallAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }, outputList, "TType62Global")); + addTrackFilter(highQualityTpcTrack(outputList, "TType62Tpc")); + } break; + case 63: { /* Run 3 global track: kAll on all 7 layers of ITS, tighter DCAxy, tighter pT dep DCAz, plus TPC+TOF only tracks */ + addTrackFilter(new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSall7Layers, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }, outputList, "TType63Global")); + addTrackFilter(highQualityTpcTrack(outputList, "TType63Tpc")); + } break; + case 70: { /* Run 3 global track: kAny on 3 IB layers of ITS, tighter DCAxy, tighter pT dep DCAz, plus ITS only tracks */ + addTrackFilter(new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }, outputList, "TType70Global")); + addTrackFilter(highQualityItsOnlyTrack(outputList, "TType70Its")); + } break; + case 71: { /* Run 3 global track: kTwo on 3 IB layers of ITS, tighter DCAxy, tighter pT dep DCAz, plus ITS only tracks */ + addTrackFilter(new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibTwo, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }, outputList, "TType71Global")); + addTrackFilter(highQualityItsOnlyTrack(outputList, "TType71Its")); + } break; + case 72: { /* Run 3 global track: kAny on all 7 layers of ITS, tighter DCAxy, tighter pT dep DCAz, plus ITS only tracks */ + addTrackFilter(new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSallAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }, outputList, "TType72Global")); + addTrackFilter(highQualityItsOnlyTrack(outputList, "TType72Its")); + } break; + case 73: { /* Run 3 global track: kAll on all 7 layers of ITS, tighter DCAxy, tighter pT dep DCAz, plus ITS only tracks */ + addTrackFilter(new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSall7Layers, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }, outputList, "TType73Global")); + addTrackFilter(highQualityItsOnlyTrack(outputList, "TType73Its")); + } break; + default: + break; + } + if (tune.mUseIt) { + for (auto const& filter : trackFilters) { + if (tune.mUseTPCclusters) { + filter->stdTrackSelection->SetMinNClustersTPC(tune.mTPCclusters); + } + if (tune.mUseTPCxRows) { + filter->stdTrackSelection->SetMinNCrossedRowsTPC(tune.mTPCxRows); + } + if (tune.mUseTPCXRoFClusters) { + filter->stdTrackSelection->SetMinNCrossedRowsOverFindableClustersTPC(tune.mTPCXRoFClusters); + } + if (tune.mUseDCAxy) { + /* DCAxy is tricky due to how the pT dependence is implemented */ + filter->stdTrackSelection->SetMaxDcaXYPtDep([&tune](float) { return tune.mDCAxy; }); + filter->setMaxDcaXY(tune.mDCAxy); + } + if (tune.mUseDCAz) { + /* DCAz is tricky due to how the pT dependence is implemented */ + filter->setMaxDcazPtDep([&tune](float) { return tune.mDCAz; }); + filter->setMaxDcaZ(tune.mDCAz); + } + if (tune.mUseFractionTpcSharedClusters) { + filter->stdTrackSelection->SetMaxTPCFractionSharedCls(tune.mFractionTpcSharedClusters); + } + } + } + } + + float maxDCAxy = 1e6; + float maxDCAz = 1e6; + TrackSelection* stdTrackSelection = nullptr; + std::function maxDcazPtDep = {}; + TH1* passedHistogram = nullptr; + bool dca2Dcut = false; + bool requirePvContributor = false; +}; inline TList* getCCDBInput(auto& ccdb, const char* ccdbpath, const char* ccdbdate, const char* period = "") { @@ -257,194 +505,6 @@ inline TList* getCCDBInput(auto& ccdb, const char* ccdbpath, const char* ccdbdat return lst; } -inline void initializeTrackSelection(TrackSelectionTuneCfg& tune) -{ - auto addTrackFilter = [](auto filter, std::function dcaZCutFunc = {}) { - trackFilters.push_back(filter); - maxDcaZPtDeps.push_back(dcaZCutFunc); - }; - auto highQualityTpcTrack = []() { - TrackSelection* tpcTrack = new TrackSelection(getGlobalTrackSelection()); - tpcTrack->SetTrackType(o2::aod::track::TrackTypeEnum::Track); - tpcTrack->ResetITSRequirements(); - tpcTrack->SetRequireITSRefit(false); - tpcTrack->SetMinNClustersTPC(120); - sharedTpcClustersExtra = 0.2; - return tpcTrack; - }; - auto itsOnlyTrack = []() { - TrackSelection* itsTrack = new TrackSelection(); - itsTrack->SetTrackType(o2::aod::track::TrackTypeEnum::Track); - itsTrack->SetRequireITSRefit(true); - itsTrack->SetRequireHitsInITSLayers(2, {0, 1, 2}); - itsTrack->SetMaxChi2PerClusterITS(36.0f); - itsTrack->SetMaxDcaXYPtDep([](float pt) { return 0.004f + 0.013f / pt; }); - return itsTrack; - }; - switch (tracktype) { - case 1: { /* Run2 global track */ - TrackSelection* globalRun2 = new TrackSelection(getGlobalTrackSelection()); - globalRun2->SetTrackType(o2::aod::track::Run2Track); // Run 2 track asked by default - globalRun2->SetMaxChi2PerClusterTPC(2.5f); - TrackSelection* globalSDDRun2 = new TrackSelection(getGlobalTrackSelectionSDD()); - globalSDDRun2->SetTrackType(o2::aod::track::Run2Track); // Run 2 track asked by default - globalSDDRun2->SetMaxChi2PerClusterTPC(2.5f); - addTrackFilter(globalRun2); - addTrackFilter(globalSDDRun2); - } break; - case 3: { /* Run3 track */ - TrackSelection* globalRun3 = new TrackSelection(getGlobalTrackSelection()); - globalRun3->SetTrackType(o2::aod::track::TrackTypeEnum::Track); - globalRun3->ResetITSRequirements(); - globalRun3->SetRequireHitsInITSLayers(1, {0, 1, 2}); - TrackSelection* globalSDDRun3 = new TrackSelection(getGlobalTrackSelection()); - globalSDDRun3->SetTrackType(o2::aod::track::TrackTypeEnum::Track); - globalSDDRun3->ResetITSRequirements(); - globalSDDRun3->SetRequireNoHitsInITSLayers({0, 1, 2}); - globalSDDRun3->SetRequireHitsInITSLayers(1, {3}); - addTrackFilter(globalRun3); - addTrackFilter(globalSDDRun3); - } break; - case 5: { /* Run2 TPC only track */ - TrackSelection* tpcOnly = new TrackSelection; - tpcOnly->SetTrackType(o2::aod::track::Run2Track); // Run 2 track asked by default - tpcOnly->SetMinNClustersTPC(50); - tpcOnly->SetMaxChi2PerClusterTPC(4); - tpcOnly->SetMaxDcaZ(3.2f); - maxDCAz = 3.2; - tpcOnly->SetMaxDcaXY(2.4f); - maxDCAxy = 2.4; - dca2Dcut = true; - addTrackFilter(tpcOnly); - } break; - case 7: { /* Run3 TPC only track */ - TrackSelection* tpcOnly = new TrackSelection; - tpcOnly->SetTrackType(o2::aod::track::TrackTypeEnum::Track); - tpcOnly->SetMinNClustersTPC(50); - tpcOnly->SetMaxChi2PerClusterTPC(4); - tpcOnly->SetMaxDcaZ(3.2f); - maxDCAz = 3.2; - tpcOnly->SetMaxDcaXY(2.4f); - maxDCAxy = 2.4; - dca2Dcut = true; - addTrackFilter(tpcOnly); - } break; - case 10: { /* Run3 track primary vertex contributor */ - TrackSelection* globalRun3 = new TrackSelection(getGlobalTrackSelection()); - globalRun3->SetTrackType(o2::aod::track::TrackTypeEnum::Track); - globalRun3->ResetITSRequirements(); - globalRun3->SetRequireHitsInITSLayers(1, {0, 1, 2}); - TrackSelection* globalSDDRun3 = new TrackSelection(getGlobalTrackSelection()); - globalSDDRun3->SetTrackType(o2::aod::track::TrackTypeEnum::Track); - globalSDDRun3->ResetITSRequirements(); - globalSDDRun3->SetRequireNoHitsInITSLayers({0, 1, 2}); - globalSDDRun3->SetRequireHitsInITSLayers(1, {3}); - addTrackFilter(globalRun3); - addTrackFilter(globalSDDRun3); - } break; - case 30: { /* Run 3 default global track: kAny on 3 IB layers of ITS */ - addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibAny, TrackSelection::GlobalTrackRun3DCAxyCut::Default))); - } break; - case 31: { /* Run 3 global track: kTwo on 3 IB layers of ITS */ - addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibTwo, TrackSelection::GlobalTrackRun3DCAxyCut::Default))); - } break; - case 32: { /* Run 3 global track: kAny on all 7 layers of ITS */ - addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSallAny, TrackSelection::GlobalTrackRun3DCAxyCut::Default))); - } break; - case 33: { /* Run 3 global track: kAll on all 7 layers of ITS */ - addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSall7Layers, TrackSelection::GlobalTrackRun3DCAxyCut::Default))); - } break; - case 40: { /* Run 3 global track: kAny on 3 IB layers of ITS, tighter DCAxy */ - addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3))); - } break; - case 41: { /* Run 3 global track: kTwo on 3 IB layers of ITS, tighter DCAxy */ - addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibTwo, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3))); - } break; - case 42: { /* Run 3 global track: kAny on all 7 layers of ITS, tighter DCAxy */ - addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSallAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3))); - } break; - case 43: { /* Run 3 global track: kAll on all 7 layers of ITS, tighter DCAxy */ - addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSall7Layers, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3))); - } break; - case 50: { /* Run 3 global track: kAny on 3 IB layers of ITS, tighter DCAxy, tighter pT dep DCAz */ - addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }); - } break; - case 51: { /* Run 3 global track: kTwo on 3 IB layers of ITS, tighter DCAxy, tighter pT dep DCAz */ - addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibTwo, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }); - } break; - case 52: { /* Run 3 global track: kAny on all 7 layers of ITS, tighter DCAxy, tighter pT dep DCAz */ - addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSallAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }); - } break; - case 53: { /* Run 3 global track: kAll on all 7 layers of ITS, tighter DCAxy, tighter pT dep DCAz */ - addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSall7Layers, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }); - } break; - case 60: { /* Run 3 global track: kAny on 3 IB layers of ITS, tighter DCAxy, tighter pT dep DCAz, plus TPC+TOF only tracks */ - addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }); - extraTrackFilter = highQualityTpcTrack(); - } break; - case 61: { /* Run 3 global track: kTwo on 3 IB layers of ITS, tighter DCAxy, tighter pT dep DCAz, plus TPC+TOF only tracks */ - addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibTwo, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }); - extraTrackFilter = highQualityTpcTrack(); - } break; - case 62: { /* Run 3 global track: kAny on all 7 layers of ITS, tighter DCAxy, tighter pT dep DCAz, plus TPC+TOF only tracks */ - addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSallAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }); - extraTrackFilter = highQualityTpcTrack(); - } break; - case 63: { /* Run 3 global track: kAll on all 7 layers of ITS, tighter DCAxy, tighter pT dep DCAz, plus TPC+TOF only tracks */ - addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSall7Layers, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }); - extraTrackFilter = highQualityTpcTrack(); - } break; - case 70: { /* Run 3 global track: kAny on 3 IB layers of ITS, tighter DCAxy, tighter pT dep DCAz, plus ITS only tracks */ - addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }); - addTrackFilter(itsOnlyTrack(), [](float pt) { return 0.004f + 0.013f / pt; }); - } break; - case 71: { /* Run 3 global track: kTwo on 3 IB layers of ITS, tighter DCAxy, tighter pT dep DCAz, plus ITS only tracks */ - addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibTwo, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }); - addTrackFilter(itsOnlyTrack(), [](float pt) { return 0.004f + 0.013f / pt; }); - } break; - case 72: { /* Run 3 global track: kAny on all 7 layers of ITS, tighter DCAxy, tighter pT dep DCAz, plus ITS only tracks */ - addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSallAny, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }); - addTrackFilter(itsOnlyTrack(), [](float pt) { return 0.004f + 0.013f / pt; }); - } break; - case 73: { /* Run 3 global track: kAll on all 7 layers of ITS, tighter DCAxy, tighter pT dep DCAz, plus ITS only tracks */ - addTrackFilter(new TrackSelection(getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSall7Layers, TrackSelection::GlobalTrackRun3DCAxyCut::ppPass3)), [](float pt) { return 0.004f + 0.013f / pt; }); - addTrackFilter(itsOnlyTrack(), [](float pt) { return 0.004f + 0.013f / pt; }); - } break; - default: - break; - } - if (tune.mUseIt) { - for (auto const& filter : trackFilters) { - if (tune.mUseTPCclusters) { - filter->SetMinNClustersTPC(tune.mTPCclusters); - } - if (tune.mUseTPCxRows) { - filter->SetMinNCrossedRowsTPC(tune.mTPCxRows); - } - if (tune.mUseTPCXRoFClusters) { - filter->SetMinNCrossedRowsOverFindableClustersTPC(tune.mTPCXRoFClusters); - } - if (tune.mUseDCAxy) { - /* DCAxy is tricky due to how the pT dependence is implemented */ - filter->SetMaxDcaXYPtDep([&tune](float) { return tune.mDCAxy; }); - filter->SetMaxDcaXY(tune.mDCAxy); - } - if (tune.mUseDCAz) { - filter->SetMaxDcaZ(tune.mDCAz); - } - } - if (tune.mUseDCAz) { - for (auto dcaZCut : maxDcaZPtDeps) { // o2-linter: disable=const-ref-in-for-loop (the loop variable is not constant) - dcaZCut = [&tune](float) { return tune.mDCAz; }; - } - } - if (tune.mUseFractionTpcSharedClusters) { - sharedTpcClusters = tune.mFractionTpcSharedClusters; - sharedTpcClustersExtra = tune.mFractionTpcSharedClusters; - } - } -} - SystemType fSystem = kNoSystem; DataType fDataType = kData; CentMultEstimatorType fCentMultEstimator = kV0M; @@ -1223,7 +1283,7 @@ struct TpcExcludeTrack { { method = kNOEXCLUSION; } - explicit TpcExcludeTrack(TpcExclusionMethod m) // o2-linter: disable=name/function-variable + explicit TpcExcludeTrack(TpcExclusionMethod m) { switch (m) { case kNOEXCLUSION: @@ -1321,65 +1381,12 @@ inline bool matchTrackType(TrackObject const& track) (!track.hasTPC() || ((track.trackCutFlag() & TrackSelectionTPC) == TrackSelectionTPC)) && ((track.trackCutFlag() & TrackSelectionDCA) == TrackSelectionDCA); } else { - for (size_t i = 0; i < trackFilters.size(); ++i) { - auto const& filter = trackFilters[i]; - auto const& maxDcaZPtDep = maxDcaZPtDeps[i]; - if (filter->IsSelected(track)) { - /* additional more stringent track cuts if needed */ - auto checkDca2Dcut = [&](auto const& track) { - if (dca2Dcut) { - if (track.dcaXY() * track.dcaXY() / maxDCAxy / maxDCAxy + track.dcaZ() * track.dcaZ() / maxDCAz / maxDCAz > 1) { - return false; - } else { - return true; - } - } else { - return true; - } - }; - auto checkDcaZcut = [&](auto const& track) { - return ((maxDcaZPtDep) ? std::fabs(track.dcaZ()) <= maxDcaZPtDep(track.pt()) : true); - }; - - /* tight pT dependent DCAz cut */ - if (!checkDcaZcut(track)) { - return false; - } - /* 2D DCA xy-o-z cut */ - if (!checkDca2Dcut(track)) { - continue; - } - /* shared fraction of TPC clusters */ - if (!(track.tpcFractionSharedCls() < sharedTpcClusters)) { - continue; - } - /* primary vertex contributor */ - if (tracktype == 10) { - if (!track.isPVContributor()) { - continue; - } - } - return true; - } - } - /* check extra less stringent selections */ - if (extraTrackFilter != nullptr) { - if (extraTrackFilter->IsSelected(track)) { - /* shared fraction of TPC clusters */ - if (!(track.tpcFractionSharedCls() < sharedTpcClustersExtra)) { - return false; - } - /* we require TOF */ - if (!(track.hasTOF())) { - return false; - } + for (auto const& filter : trackFilters) { + if (filter->isSelected(track)) { return true; - } else { - return false; } - } else { - return false; } + return false; } } diff --git a/PWGCF/TwoParticleCorrelations/Tasks/dptDptPerRunQc.cxx b/PWGCF/TwoParticleCorrelations/Tasks/dptDptPerRunQc.cxx index dd95686113e..fb179838563 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/dptDptPerRunQc.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/dptDptPerRunQc.cxx @@ -18,6 +18,7 @@ #include #include #include +#include #include "CCDB/BasicCCDBManager.h" #include "Common/CCDB/ctpRateFetcher.h" @@ -64,6 +65,8 @@ struct DptDptPerRunQc { ctpRateFetcher mRateFetcher; HistogramRegistry mHistos{"PerRunQaHistograms", {}, OutputObjHandlingPolicy::AnalysisObject}; + Configurable cfgInteractionRateSource{"cfgInteractionRateSource", "ZNC hadronic", "The shource for the interaction rate measure.PbPb:ZNC hadronic;pp:T0VTX.Default:ZNC hadronic"}; + void initCCDB(aod::BCsWithTimestamps::iterator const& bc) { using namespace perrunqctask; @@ -99,9 +102,9 @@ struct DptDptPerRunQc { gCurrentCollisionOrbitBefore = nullptr; gCurrentCollisionOrbitAfter = nullptr; } + LOGF(info, "Run number: %d, SOR: %lld, EOR: %lld, prev SOR: %lld, prev EOR: %lld, SOR seconds: %f", mRunNumber, tsSOR, tsEOR, mSOR, runDuration.second, mMinSeconds); } gCurrentHadronicRate = gHadronicRate[mRunNumber]; - LOGF(info, "Getting out"); } void init(o2::framework::InitContext&) @@ -125,7 +128,7 @@ struct DptDptPerRunQc { return; } - double hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), mRunNumber, "T0VTX") * 1.e-3; // + double hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), mRunNumber, cfgInteractionRateSource) * 1.e-3; // double seconds = bc.timestamp() * 1.e-3 - mMinSeconds; gCurrentHadronicRate->Fill(seconds, hadronicRate); gCurrentCollisionOrbitAfter->Fill(orbit); From 8a2c71dd4f991d51099c4d00e26752dc29aa6914 Mon Sep 17 00:00:00 2001 From: Zhengqing Wang Date: Sat, 15 Mar 2025 04:43:53 +0800 Subject: [PATCH 0680/1650] [PWGCF] updates on Systematic checking (#10494) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/pidcme.cxx | 483 +++++++++++++++++++++++++++--------- 1 file changed, 370 insertions(+), 113 deletions(-) diff --git a/PWGCF/Flow/Tasks/pidcme.cxx b/PWGCF/Flow/Tasks/pidcme.cxx index 4f7f8426e70..8242b9af48b 100644 --- a/PWGCF/Flow/Tasks/pidcme.cxx +++ b/PWGCF/Flow/Tasks/pidcme.cxx @@ -86,6 +86,8 @@ struct FillPIDcolums { Configurable cfgMaxChi2NClITS{"cfgMaxChi2NClITS", 2.5, "Maximum chi2 per cluster ITS for PID if not use costom track cuts"}; Configurable cfgMinTPCCls{"cfgMinTPCCls", 70, "Minimum TPC clusters for PID if not use costom track cuts"}; Configurable cfgMinITSCls{"cfgMinITSCls", 1, "Minimum ITS clusters for PID if not use costom track cuts"}; + Configurable cfgMaxTPCCls{"cfgMaxTPCCls", 999, "Max TPC clusters for PID if not use costom track cuts"}; + Configurable cfgMaxITSCls{"cfgMaxITSCls", 999, "Max ITS clusters for PID if not use costom track cuts"}; Configurable cfgMaxDCAxy{"cfgMaxDCAxy", 99, "Maxium DCAxy for standard PID tracking"}; Configurable cfgMaxDCAz{"cfgMaxDCAz", 2, "Maxium DCAz for standard PID tracking"}; Configurable cfgAveClusSizeCoslMinPi{"cfgAveClusSizeCoslMinPi", 0, "Base line for minmum ITS cluster size x cos(#lambda) for Pions"}; @@ -106,9 +108,14 @@ struct FillPIDcolums { ConfigurableAxis cfgaxisAverClusterCosl{"cfgaxisAverClusterCosl", {50, 0, 10}, "Binning for average cluster size x cos(#lambda)"}; ConfigurableAxis cfgaxisAverClusterCoslnSigma{"cfgaxisAverClusterCoslnSigma", {50, 0, 5}, "Binning for average cluster size x cos(#lambda) vs nSigam"}; ConfigurableAxis cfgaxisetaPID{"cfgaxisetaPID", {90, -0.9, 0.9}, "Binning for Pt QA"}; + ConfigurableAxis cfgaxisDCAz{"cfgaxisDCAz", {200, -1, 1}, "Binning for DCAz"}; + ConfigurableAxis cfgaxisDCAxy{"cfgaxisDCAxy", {100, -0.5, 0.5}, "Binning for DCAxy"}; + ConfigurableAxis cfgaxisChi2Ncls{"cfgaxisChi2Ncls", {50, 0, 5}, "Binning for Chi2Ncls TPC/ITS"}; Configurable cfgQuietMode{"cfgQuietMode", false, "open quiet mode for saving cpu cost and only do some basic QA plots"}; Configurable cfgRequireGlobalTrack{"cfgRequireGlobalTrack", false, "Require track used must be the global track"}; + Configurable cfgOpenPIDPtSelection{"cfgOpenPIDPtSelection", false, "Cut Pt reign PID particles for use"}; + Configurable cfgOpenPlotnSigmaOrigin{"cfgOpenPlotnSigmaOrigin", true, "Open origin nSigma plots before PID selections"}; Configurable cfgOpenPlotnSigmaTOFITSPt{"cfgOpenPlotnSigmaTOFITSPt", true, "plot nSigmaTOF vs nSigmaITS vs Pt"}; Configurable cfgOpenPlotnSigmaITSTPCPt{"cfgOpenPlotnSigmaITSTPCPt", true, "plot nSigmaITS vs nSigmaTOF vs Pt"}; Configurable cfgOpenPlotnSigmaTOFTPCPt{"cfgOpenPlotnSigmaTOFTPCPt", true, "plot nSigmaTOF vs nSigmaTPC vs Pt"}; @@ -118,10 +125,12 @@ struct FillPIDcolums { Configurable cfgOpenPlotPhiDis{"cfgOpenPlotPhiDis", true, "plot phi distribution QA"}; Configurable cfgOpenPlotPhiDisPtEta{"cfgOpenPlotPhiDisPtEta", true, "plot phi pt eta distribution QA"}; Configurable cfgOpenITSCut{"cfgOpenITSCut", true, "open ITSnsigma cut"}; + Configurable cfgOpenITSCutQAPlots{"cfgOpenITSCutQAPlots", true, "open QA plots after ITS nsigma cut"}; Configurable cfgOpenDetailPlotsTPCITSContaimination{"cfgOpenDetailPlotsTPCITSContaimination", false, "open detail TH3D plots for nSigmaTPC-ITS Pt-eta-Phi nSigmaITS-clustersize"}; Configurable cfgOpenAllowCrossTrack{"cfgOpenAllowCrossTrack", false, "Allow one track to be identified as different kind of PID particles"}; Configurable cfgOpenCrossTrackQAPlots{"cfgOpenCrossTrackQAPlots", true, "open cross pid track QA plots"}; - Configurable cfgOpenTOFOnlyPID{"cfgOpenTOFOnlyPID", true, "only accept tracks who has TOF infomation and use TOFnsigma for PID(priority greater than TPConly and combined)"}; + Configurable cfgOpenTOFOnlyPID{"cfgOpenTOFOnlyPID", true, "only accept tracks who has TOF infomation and use TOFnsigma for PID(priority greater than TPConly and combined"}; + Configurable cfgOpenTPCAssistanceTOFOnlyPID{"cfgOpenTPCAssistanceTOFOnlyPID", false, "Set loose TPC nsigma cut for TOFOnlyPID mode using cfg nsigmaTPC configurations"}; Configurable cfgOpenTPCOnlyPID{"cfgOpenTPCOnlyPID", false, "only use TPCnsigma for PID(priority grater than combined less than TOFOnly)"}; Configurable cfgUseCostomTrackCuts{"cfgUseCostomTrackCuts", true, "use track cuts from default track selection table producer"}; Configurable cfgOpenPtRangedTOFnSigmacutPi{"cfgOpenPtRangedTOFnSigmacutPi", false, "use nSigma TOF cut for different pt Pion"}; @@ -133,7 +142,11 @@ struct FillPIDcolums { Configurable cfgOpenPtRangedTOFnSigmacutPr{"cfgOpenPtRangedTOFnSigmacutPr", false, "use nSigma TOF cut for different pt Proton"}; Configurable cfgOpenPtRangedTPCnSigmacutPr{"cfgOpenPtRangedTPCnSigmacutPr", false, "use nSigma TPC cut for different pt Proton"}; Configurable cfgOpenPtRangedITSnSigmacutPr{"cfgOpenPtRangedITSnSigmacutPr", false, "use nSigma ITS cut for different pt Proton"}; + Configurable cfgOpenPlotCheckITSOnlytrackInfo{"cfgOpenPlotCheckITSOnlytrackInfo", true, "plot checks if track NclsTPC is 0 for assure it has p info or not"}; + Configurable cfgOpenTrackingInfoCheck{"cfgOpenTrackingInfoCheck", true, "plot track infomation check"}; + Configurable> cfgPtCutLower{"cfgPtCutLower", {0.15, 0.15, 0.15}, "Pt lower limit for pi k p respectively"}; + Configurable> cfgPtCutUpper{"cfgPtCutUpper", {99., 99., 99.}, "Pt upper limit for pi k p respectively"}; Configurable> cfgnSigmaCutTPCUpper{"cfgnSigmaCutTPCUpper", {3, 3, 3}, "TPC nsigma cut upper limit for pi k p respectively at low pt and for the TPCOnly case"}; Configurable> cfgnSigmaCutTOFUpper{"cfgnSigmaCutTOFUpper", {1.5, 1.5, 1.5}, "TOF nsigma cut upper limit for pi k p respectively for the TOFonly case"}; Configurable> cfgnSigmaCutRMSUpper{"cfgnSigmaCutRMSUpper", {3, 3, 3}, "TPC_TOF combined cut upper limit for pi k p respectively at high pt"}; @@ -211,11 +224,11 @@ struct FillPIDcolums { } else { if (track.tpcChi2NCl() > cfgMaxTPCChi2NCl) return false; - if (track.tpcNClsFound() < cfgMinTPCCls) + if (track.tpcNClsFound() < cfgMinTPCCls || track.tpcNClsFound() > cfgMaxTPCCls) return false; - if (track.itsChi2NCl() < cfgMaxChi2NClITS) + if (track.itsChi2NCl() > cfgMaxChi2NClITS) return false; - if (track.itsNCls() < cfgMinITSCls) + if (track.itsNCls() < cfgMinITSCls || track.itsNCls() > cfgMaxITSCls) return false; if (std::abs(track.dcaXY()) > cfgMaxDCAxy) return false; @@ -226,7 +239,7 @@ struct FillPIDcolums { } template - int selectionPidtpctof(const T& candidate) + int selectionPidtpctof(const T& candidate, std::array nSigmaTOFCutPtUpper, std::array nSigmaTOFCutPtLower, std::array nSigmaTPCCutPtUpper, std::array nSigmaTPCCutPtLower) { // initialization for basic parameter float averClusSizeCosl = averageClusterSizeCosl(candidate.itsClusterSizes(), candidate.eta()); @@ -242,55 +255,18 @@ struct FillPIDcolums { std::vector pidVectorTPCPtLower; int pid = -1; bool kIsPi = false, kIsKa = false, kIsPr = false; - int currentPtBinPi = -1, currentPtBinKa = -1, currentPtBinPr = -1; - if (cfgOpenPtRangedTOFnSigmacutPi || cfgOpenPtRangedTPCnSigmacutPi) { - for (int i = 0; i < static_cast(cfgPtBinPionPID.value.size()) - 1; ++i) { - if (candidate.pt() >= cfgPtBinPionPID.value[i] && candidate.pt() < cfgPtBinPionPID.value[i + 1]) { - currentPtBinPi = i; - break; - } - } - } - if (cfgOpenPtRangedTOFnSigmacutKa || cfgOpenPtRangedTPCnSigmacutKa) { - for (int i = 0; i < static_cast(cfgPtBinKaonPID.value.size()) - 1; ++i) { - if (candidate.pt() >= cfgPtBinKaonPID.value[i] && candidate.pt() < cfgPtBinKaonPID.value[i + 1]) { - currentPtBinKa = i; - break; - } - } - } - if (cfgOpenPtRangedTOFnSigmacutPr || cfgOpenPtRangedTPCnSigmacutPr) { - for (int i = 0; i < static_cast(cfgPtBinProtonPID.value.size()) - 1; ++i) { - if (candidate.pt() >= cfgPtBinProtonPID.value[i] && candidate.pt() < cfgPtBinProtonPID.value[i + 1]) { - currentPtBinPr = i; - break; - } - } - } - float nSigmaTOFCutPiPtUpper = (currentPtBinPi == -1) ? cfgnSigmaCutTOFUpper.value[0] : cfgnSigmaTOFPionPtUpper.value[currentPtBinPi]; - float nSigmaTOFCutKaPtUpper = (currentPtBinKa == -1) ? cfgnSigmaCutTOFUpper.value[1] : cfgnSigmaTOFKaonPtUpper.value[currentPtBinKa]; - float nSigmaTOFCutPrPtUpper = (currentPtBinPr == -1) ? cfgnSigmaCutTOFUpper.value[2] : cfgnSigmaTOFProtonPtUpper.value[currentPtBinPr]; - float nSigmaTPCCutPiPtUpper = (currentPtBinPi == -1) ? cfgnSigmaCutTPCUpper.value[0] : cfgnSigmaTPCPionPtUpper.value[currentPtBinPi]; - float nSigmaTPCCutKaPtUpper = (currentPtBinKa == -1) ? cfgnSigmaCutTPCUpper.value[1] : cfgnSigmaTPCKaonPtUpper.value[currentPtBinKa]; - float nSigmaTPCCutPrPtUpper = (currentPtBinPr == -1) ? cfgnSigmaCutTPCUpper.value[2] : cfgnSigmaTPCProtonPtUpper.value[currentPtBinPr]; - float nSigmaTOFCutPiPtLower = (currentPtBinPi == -1) ? cfgnSigmaCutTOFLower.value[0] : cfgnSigmaTOFPionPtLower.value[currentPtBinPi]; - float nSigmaTOFCutKaPtLower = (currentPtBinKa == -1) ? cfgnSigmaCutTOFLower.value[1] : cfgnSigmaTOFKaonPtLower.value[currentPtBinKa]; - float nSigmaTOFCutPrPtLower = (currentPtBinPr == -1) ? cfgnSigmaCutTOFLower.value[2] : cfgnSigmaTOFProtonPtLower.value[currentPtBinPr]; - float nSigmaTPCCutPiPtLower = (currentPtBinPi == -1) ? cfgnSigmaCutTPCLower.value[0] : cfgnSigmaTPCPionPtLower.value[currentPtBinPi]; - float nSigmaTPCCutKaPtLower = (currentPtBinKa == -1) ? cfgnSigmaCutTPCLower.value[1] : cfgnSigmaTPCKaonPtLower.value[currentPtBinKa]; - float nSigmaTPCCutPrPtLower = (currentPtBinPr == -1) ? cfgnSigmaCutTPCLower.value[2] : cfgnSigmaTPCProtonPtLower.value[currentPtBinPr]; - pidVectorTOFPtUpper.push_back(nSigmaTOFCutPiPtUpper); - pidVectorTOFPtUpper.push_back(nSigmaTOFCutKaPtUpper); - pidVectorTOFPtUpper.push_back(nSigmaTOFCutPrPtUpper); - pidVectorTPCPtUpper.push_back(nSigmaTPCCutPiPtUpper); - pidVectorTPCPtUpper.push_back(nSigmaTPCCutKaPtUpper); - pidVectorTPCPtUpper.push_back(nSigmaTPCCutPrPtUpper); - pidVectorTOFPtLower.push_back(nSigmaTOFCutPiPtLower); - pidVectorTOFPtLower.push_back(nSigmaTOFCutKaPtLower); - pidVectorTOFPtLower.push_back(nSigmaTOFCutPrPtLower); - pidVectorTPCPtLower.push_back(nSigmaTPCCutPiPtLower); - pidVectorTPCPtLower.push_back(nSigmaTPCCutKaPtLower); - pidVectorTPCPtLower.push_back(nSigmaTPCCutPrPtLower); + pidVectorTOFPtUpper.push_back(nSigmaTOFCutPtUpper[0]); + pidVectorTOFPtUpper.push_back(nSigmaTOFCutPtUpper[1]); + pidVectorTOFPtUpper.push_back(nSigmaTOFCutPtUpper[2]); + pidVectorTOFPtLower.push_back(nSigmaTOFCutPtLower[0]); + pidVectorTOFPtLower.push_back(nSigmaTOFCutPtLower[1]); + pidVectorTOFPtLower.push_back(nSigmaTOFCutPtLower[2]); + pidVectorTPCPtUpper.push_back(nSigmaTPCCutPtUpper[0]); + pidVectorTPCPtUpper.push_back(nSigmaTPCCutPtUpper[1]); + pidVectorTPCPtUpper.push_back(nSigmaTPCCutPtUpper[2]); + pidVectorTPCPtLower.push_back(nSigmaTPCCutPtLower[0]); + pidVectorTPCPtLower.push_back(nSigmaTPCCutPtLower[1]); + pidVectorTPCPtLower.push_back(nSigmaTPCCutPtLower[2]); // Choose which nSigma array and PIDcut array to use if (cfgOpenTOFOnlyPID) { if (!candidate.hasTOF()) @@ -461,41 +437,8 @@ struct FillPIDcolums { } template - bool selectionITS(const T& candidate, int mode, float avgclssize) + bool selectionITS(const T& candidate, int mode, float avgclssize, std::array nSigmaITSToUseUpper, std::array nSigmaITSToUseLower) { - std::array nSigmaITSToUseUpper; - std::array nSigmaITSToUseLower; - int currentPtBinPi = -1, currentPtBinKa = -1, currentPtBinPr = -1; - if (cfgOpenPtRangedITSnSigmacutPi) { - for (int i = 0; i < static_cast(cfgPtBinPionPID.value.size()) - 1; ++i) { - if (candidate.pt() >= cfgPtBinPionPID.value[i] && candidate.pt() < cfgPtBinPionPID.value[i + 1]) { - currentPtBinPi = i; - break; - } - } - } - if (cfgOpenPtRangedITSnSigmacutKa) { - for (int i = 0; i < static_cast(cfgPtBinKaonPID.value.size()) - 1; ++i) { - if (candidate.pt() >= cfgPtBinKaonPID.value[i] && candidate.pt() < cfgPtBinKaonPID.value[i + 1]) { - currentPtBinKa = i; - break; - } - } - } - if (cfgOpenPtRangedITSnSigmacutPr) { - for (int i = 0; i < static_cast(cfgPtBinProtonPID.value.size()) - 1; ++i) { - if (candidate.pt() >= cfgPtBinProtonPID.value[i] && candidate.pt() < cfgPtBinProtonPID.value[i + 1]) { - currentPtBinPr = i; - break; - } - } - } - nSigmaITSToUseUpper[0] = (currentPtBinPi == -1) ? cfgnSigmaCutITSUpper.value[0] : cfgnSigmaITSPionPtUpper.value[currentPtBinPi]; - nSigmaITSToUseUpper[1] = (currentPtBinKa == -1) ? cfgnSigmaCutITSUpper.value[1] : cfgnSigmaITSKaonPtUpper.value[currentPtBinKa]; - nSigmaITSToUseUpper[2] = (currentPtBinPr == -1) ? cfgnSigmaCutITSUpper.value[2] : cfgnSigmaITSProtonPtUpper.value[currentPtBinPr]; - nSigmaITSToUseLower[0] = (currentPtBinPi == -1) ? cfgnSigmaCutITSLower.value[0] : cfgnSigmaITSPionPtLower.value[currentPtBinPi]; - nSigmaITSToUseLower[1] = (currentPtBinKa == -1) ? cfgnSigmaCutITSLower.value[1] : cfgnSigmaITSKaonPtLower.value[currentPtBinKa]; - nSigmaITSToUseLower[2] = (currentPtBinPr == -1) ? cfgnSigmaCutITSLower.value[2] : cfgnSigmaITSProtonPtLower.value[currentPtBinPr]; switch (mode) { case 1: // For Pion if (!((candidate.itsNSigmaPi() > nSigmaITSToUseLower[0] && candidate.itsNSigmaPi() < nSigmaITSToUseUpper[0]) && avgclssize > cfgAveClusSizeCoslMinPi && avgclssize < cfgAveClusSizeCoslMaxPi)) { @@ -541,7 +484,135 @@ struct FillPIDcolums { AxisSpec axisClusterSize{cfgaxisAverClusterCosl, " x "}; AxisSpec axisClusterSizenSigma{cfgaxisAverClusterCoslnSigma, " x "}; AxisSpec axisPhi = {100, 0, 2.1 * constants::math::PI, "#phi"}; + AxisSpec axisDCAz{cfgaxisDCAz, "#it{DCA_{z}}"}; + AxisSpec axisDCAxy{cfgaxisDCAxy, "#it{DCA_{xy}}"}; + AxisSpec axisITSNcls = {10, -1.5, 8.5, "ITSNcls"}; + AxisSpec axisTPCNcls = {160, 0, 160, "TPCNcls"}; + AxisSpec axisP{50, -5, 5, "#it{p}"}; + AxisSpec axisChi2Ncls = {cfgaxisChi2Ncls, "#chi^{2}/Ncls"}; + if (!cfgQuietMode) { + // ITSOnly track check + if (cfgOpenPlotCheckITSOnlytrackInfo) { + histosQA.add(Form("QA/PID/histDCAz_ITSOnly_Px"), "", {HistType::kTH1F, {axisP}}); + histosQA.add(Form("QA/PID/histDCAz_ITSOnly_Py"), "", {HistType::kTH1F, {axisP}}); + histosQA.add(Form("QA/PID/histDCAz_ITSOnly_Pz"), "", {HistType::kTH1F, {axisP}}); + } + // TPCChi2Ncls Checking + if (cfgOpenTrackingInfoCheck) { + histosQA.add(Form("QA/PID/histTPCChi2Ncls_total_origin"), "#chi^{2}/Ncls_{TPC},counts", {HistType::kTH1F, {axisChi2Ncls}}); + histosQA.add(Form("QA/PID/histTPCChi2Ncls_total"), "#chi^{2}/Ncls_{TPC},counts", {HistType::kTH1F, {axisChi2Ncls}}); + histosQA.add(Form("QA/PID/histTPCChi2Ncls_Pi"), "#chi^{2}/Ncls_{TPC},counts", {HistType::kTH1F, {axisChi2Ncls}}); + histosQA.add(Form("QA/PID/histTPCChi2Ncls_Ka"), "#chi^{2}/Ncls_{TPC},counts", {HistType::kTH1F, {axisChi2Ncls}}); + histosQA.add(Form("QA/PID/histTPCChi2Ncls_Pr"), "#chi^{2}/Ncls_{TPC},counts", {HistType::kTH1F, {axisChi2Ncls}}); + if (cfgOpenITSCutQAPlots) { + histosQA.add(Form("QA/PID/histTPCChi2Ncls_total_AfterITS"), ",#chi^{2}/Ncls_{TPC},counts", {HistType::kTH1F, {axisChi2Ncls}}); + histosQA.add(Form("QA/PID/histTPCChi2Ncls_Pi_AfterITS"), "#chi^{2}/Ncls_{TPC},counts", {HistType::kTH1F, {axisChi2Ncls}}); + histosQA.add(Form("QA/PID/histTPCChi2Ncls_Ka_AfterITS"), "#chi^{2}/Ncls_{TPC},counts", {HistType::kTH1F, {axisChi2Ncls}}); + histosQA.add(Form("QA/PID/histTPCChi2Ncls_Pr_AfterITS"), "#chi^{2}/Ncls_{TPC},counts", {HistType::kTH1F, {axisChi2Ncls}}); + } + } + // ITSChi2Ncls Checking + if (cfgOpenTrackingInfoCheck) { + histosQA.add(Form("QA/PID/histITSChi2Ncls_total_origin"), "#chi^{2}/Ncls_{ITS},counts", {HistType::kTH1F, {axisChi2Ncls}}); + histosQA.add(Form("QA/PID/histITSChi2Ncls_total"), "#chi^{2}/Ncls_{ITS},counts", {HistType::kTH1F, {axisChi2Ncls}}); + histosQA.add(Form("QA/PID/histITSChi2Ncls_Pi"), "#chi^{2}/Ncls_{ITS},counts", {HistType::kTH1F, {axisChi2Ncls}}); + histosQA.add(Form("QA/PID/histITSChi2Ncls_Ka"), "#chi^{2}/Ncls_{ITS},counts", {HistType::kTH1F, {axisChi2Ncls}}); + histosQA.add(Form("QA/PID/histITSChi2Ncls_Pr"), "#chi^{2}/Ncls_{ITS},counts", {HistType::kTH1F, {axisChi2Ncls}}); + if (cfgOpenITSCutQAPlots) { + histosQA.add(Form("QA/PID/histITSChi2Ncls_total_AfterITS"), ",#chi^{2}/Ncls_{ITS},counts", {HistType::kTH1F, {axisChi2Ncls}}); + histosQA.add(Form("QA/PID/histITSChi2Ncls_Pi_AfterITS"), "#chi^{2}/Ncls_{ITS},counts", {HistType::kTH1F, {axisChi2Ncls}}); + histosQA.add(Form("QA/PID/histITSChi2Ncls_Ka_AfterITS"), "#chi^{2}/Ncls_{ITS},counts", {HistType::kTH1F, {axisChi2Ncls}}); + histosQA.add(Form("QA/PID/histITSChi2Ncls_Pr_AfterITS"), "#chi^{2}/Ncls_{ITS},counts", {HistType::kTH1F, {axisChi2Ncls}}); + } + } + // DCA Chencks + if (cfgOpenTrackingInfoCheck) { + histosQA.add(Form("QA/PID/histDCAz_total_origin"), "", {HistType::kTH1F, {axisDCAz}}); + histosQA.add(Form("QA/PID/histDCAxy_total_origin"), "", {HistType::kTH1F, {axisDCAxy}}); + histosQA.add(Form("QA/PID/histDCAz_total"), "", {HistType::kTH1F, {axisDCAz}}); + histosQA.add(Form("QA/PID/histDCAxy_total"), "", {HistType::kTH1F, {axisDCAxy}}); + histosQA.add(Form("QA/PID/histDCAz_Pi"), "", {HistType::kTH1F, {axisDCAz}}); + histosQA.add(Form("QA/PID/histDCAxy_Pi"), "", {HistType::kTH1F, {axisDCAxy}}); + histosQA.add(Form("QA/PID/histDCAz_Ka"), "", {HistType::kTH1F, {axisDCAz}}); + histosQA.add(Form("QA/PID/histDCAxy_Ka"), "", {HistType::kTH1F, {axisDCAxy}}); + histosQA.add(Form("QA/PID/histDCAz_Pr"), "", {HistType::kTH1F, {axisDCAz}}); + histosQA.add(Form("QA/PID/histDCAxy_Pr"), "", {HistType::kTH1F, {axisDCAxy}}); + if (cfgOpenITSCutQAPlots) { + histosQA.add(Form("QA/PID/histDCAz_total_AfterITS"), "", {HistType::kTH1F, {axisDCAz}}); + histosQA.add(Form("QA/PID/histDCAxy_total_AfterITS"), "", {HistType::kTH1F, {axisDCAxy}}); + histosQA.add(Form("QA/PID/histDCAz_Pi_AfterITS"), "", {HistType::kTH1F, {axisDCAz}}); + histosQA.add(Form("QA/PID/histDCAxy_Pi_AfterITS"), "", {HistType::kTH1F, {axisDCAxy}}); + histosQA.add(Form("QA/PID/histDCAz_Ka_AfterITS"), "", {HistType::kTH1F, {axisDCAz}}); + histosQA.add(Form("QA/PID/histDCAxy_Ka_AfterITS"), "", {HistType::kTH1F, {axisDCAxy}}); + histosQA.add(Form("QA/PID/histDCAz_Pr_AfterITS"), "", {HistType::kTH1F, {axisDCAz}}); + histosQA.add(Form("QA/PID/histDCAxy_Pr_AfterITS"), "", {HistType::kTH1F, {axisDCAxy}}); + } + } + // ITSNcls Checks + if (cfgOpenTrackingInfoCheck) { + histosQA.add(Form("QA/PID/histITSNcls_total_origin"), "", {HistType::kTH1F, {axisITSNcls}}); + histosQA.add(Form("QA/PID/histITSNcls_total"), "", {HistType::kTH1F, {axisITSNcls}}); + histosQA.add(Form("QA/PID/histITSNcls_Pi"), "", {HistType::kTH1F, {axisITSNcls}}); + histosQA.add(Form("QA/PID/histITSNcls_Ka"), "", {HistType::kTH1F, {axisITSNcls}}); + histosQA.add(Form("QA/PID/histITSNcls_Pr"), "", {HistType::kTH1F, {axisITSNcls}}); + if (cfgOpenITSCutQAPlots) { + histosQA.add(Form("QA/PID/histITSNcls_total_AfterITS"), "", {HistType::kTH1F, {axisITSNcls}}); + histosQA.add(Form("QA/PID/histITSNcls_Pi_AfterITS"), "", {HistType::kTH1F, {axisITSNcls}}); + histosQA.add(Form("QA/PID/histITSNcls_Ka_AfterITS"), "", {HistType::kTH1F, {axisITSNcls}}); + histosQA.add(Form("QA/PID/histITSNcls_Pr_AfterITS"), "", {HistType::kTH1F, {axisITSNcls}}); + } + } + // TPCNcls Checks + if (cfgOpenTrackingInfoCheck) { + histosQA.add(Form("QA/PID/histTPCNcls_total_origin"), "", {HistType::kTH1F, {axisTPCNcls}}); + histosQA.add(Form("QA/PID/histTPCNcls_total"), "", {HistType::kTH1F, {axisTPCNcls}}); + histosQA.add(Form("QA/PID/histTPCNcls_Pi"), "", {HistType::kTH1F, {axisTPCNcls}}); + histosQA.add(Form("QA/PID/histTPCNcls_Ka"), "", {HistType::kTH1F, {axisTPCNcls}}); + histosQA.add(Form("QA/PID/histTPCNcls_Pr"), "", {HistType::kTH1F, {axisTPCNcls}}); + if (cfgOpenITSCutQAPlots) { + histosQA.add(Form("QA/PID/histTPCNcls_total_AfterITS"), "", {HistType::kTH1F, {axisTPCNcls}}); + histosQA.add(Form("QA/PID/histTPCNcls_Pi_AfterITS"), "", {HistType::kTH1F, {axisTPCNcls}}); + histosQA.add(Form("QA/PID/histTPCNcls_Ka_AfterITS"), "", {HistType::kTH1F, {axisTPCNcls}}); + histosQA.add(Form("QA/PID/histTPCNcls_Pr_AfterITS"), "", {HistType::kTH1F, {axisTPCNcls}}); + } + } + // PID Origin plots + if (cfgOpenPlotnSigmaOrigin) { + if (cfgOpenPlotnSigmaTOFITSPt) { + histosQA.add(Form("QA/PID/histnSigma_Origin_TOF_ITS_Pt_Pi"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaITS, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigma_Origin_TOF_ITS_Pt_Ka"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaITS, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigma_Origin_TOF_ITS_Pt_Pr"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaITS, axisPtPID}}); + } + if (cfgOpenPlotnSigmaTOFTPCPt) { + histosQA.add(Form("QA/PID/histnSigma_Origin_TOF_TPC_Pt_Pi"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaTPC, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigma_Origin_TOF_TPC_Pt_Ka"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaTPC, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigma_Origin_TOF_TPC_Pt_Pr"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaTPC, axisPtPID}}); + } + if (cfgOpenPlotnSigmaITSTPCPt) { + histosQA.add(Form("QA/PID/histnSigma_Origin_ITS_TPC_Pt_Pi"), "", {HistType::kTH3F, {axisnSigmaITS, axisnSigmaTPC, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigma_Origin_ITS_TPC_Pt_Ka"), "", {HistType::kTH3F, {axisnSigmaITS, axisnSigmaTPC, axisPtPID}}); + histosQA.add(Form("QA/PID/histnSigma_Origin_ITS_TPC_Pt_Pr"), "", {HistType::kTH3F, {axisnSigmaITS, axisnSigmaTPC, axisPtPID}}); + } + histosQA.add(Form("QA/PID/histnSigma_Origin_TPC_Pi"), "", {HistType::kTH1F, {axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_Origin_TPC_Ka"), "", {HistType::kTH1F, {axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_Origin_TPC_Pr"), "", {HistType::kTH1F, {axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_Origin_TPC_Pt_Pi"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_Origin_TPC_Pt_Ka"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_Origin_TPC_Pt_Pr"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTPC}}); + histosQA.add(Form("QA/PID/histnSigma_Origin_TOF_Pi"), "", {HistType::kTH1F, {axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_Origin_TOF_Ka"), "", {HistType::kTH1F, {axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_Origin_TOF_Pr"), "", {HistType::kTH1F, {axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_Origin_TOF_Pt_Pi"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_Origin_TOF_Pt_Ka"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_Origin_TOF_Pt_Pr"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); + histosQA.add(Form("QA/PID/histnSigma_Origin_ITS_Pi"), "", {HistType::kTH1F, {axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigma_Origin_ITS_Ka"), "", {HistType::kTH1F, {axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigma_Origin_ITS_Pr"), "", {HistType::kTH1F, {axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigma_Origin_ITS_Pt_Pi"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigma_Origin_ITS_Pt_Ka"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaITS}}); + histosQA.add(Form("QA/PID/histnSigma_Origin_ITS_Pt_Pr"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaITS}}); + } // TH3D NSigmaTPC,NSigmaTOF,NSigmaITS combo vs pt(if necessary for whole centrality) if (cfgOpenPlotnSigmaTOFITSPt) { histosQA.add(Form("QA/PID/histnSigma_TOF_ITS_Pt_Pi"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaITS, axisPtPID}}); @@ -552,7 +623,7 @@ struct FillPIDcolums { histosQA.add(Form("QA/PID/histnSigma_TOF_ITS_Pt_cross_Ka"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaITS, axisPtPID}}); histosQA.add(Form("QA/PID/histnSigma_TOF_ITS_Pt_cross_Pr"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaITS, axisPtPID}}); } - if (cfgOpenITSCut) { + if (cfgOpenITSCutQAPlots) { histosQA.add(Form("QA/PID/histnSigma_TOF_ITS_Pt_AfterITS_Pi"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaITS, axisPtPID}}); histosQA.add(Form("QA/PID/histnSigma_TOF_ITS_Pt_AfterITS_Ka"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaITS, axisPtPID}}); histosQA.add(Form("QA/PID/histnSigma_TOF_ITS_Pt_AfterITS_Pr"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaITS, axisPtPID}}); @@ -567,7 +638,7 @@ struct FillPIDcolums { histosQA.add(Form("QA/PID/histnSigma_TOF_TPC_Pt_cross_Ka"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaTPC, axisPtPID}}); histosQA.add(Form("QA/PID/histnSigma_TOF_TPC_Pt_cross_Pr"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaTPC, axisPtPID}}); } - if (cfgOpenITSCut) { + if (cfgOpenITSCutQAPlots) { histosQA.add(Form("QA/PID/histnSigma_TOF_TPC_Pt_AfterITS_Pi"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaTPC, axisPtPID}}); histosQA.add(Form("QA/PID/histnSigma_TOF_TPC_Pt_AfterITS_Ka"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaTPC, axisPtPID}}); histosQA.add(Form("QA/PID/histnSigma_TOF_TPC_Pt_AfterITS_Pr"), "", {HistType::kTH3F, {axisnSigmaTOF, axisnSigmaTPC, axisPtPID}}); @@ -582,7 +653,7 @@ struct FillPIDcolums { histosQA.add(Form("QA/PID/histnSigma_ITS_TPC_Pt_cross_Ka"), "", {HistType::kTH3F, {axisnSigmaITS, axisnSigmaTPC, axisPtPID}}); histosQA.add(Form("QA/PID/histnSigma_ITS_TPC_Pt_cross_Pr"), "", {HistType::kTH3F, {axisnSigmaITS, axisnSigmaTPC, axisPtPID}}); } - if (cfgOpenITSCut) { + if (cfgOpenITSCutQAPlots) { histosQA.add(Form("QA/PID/histnSigma_ITS_TPC_Pt_AfterITS_Pi"), "", {HistType::kTH3F, {axisnSigmaITS, axisnSigmaTPC, axisPtPID}}); histosQA.add(Form("QA/PID/histnSigma_ITS_TPC_Pt_AfterITS_Ka"), "", {HistType::kTH3F, {axisnSigmaITS, axisnSigmaTPC, axisPtPID}}); histosQA.add(Form("QA/PID/histnSigma_ITS_TPC_Pt_AfterITS_Pr"), "", {HistType::kTH3F, {axisnSigmaITS, axisnSigmaTPC, axisPtPID}}); @@ -597,7 +668,7 @@ struct FillPIDcolums { histosQA.add(Form("QA/PID/histAverClusterSizeCosl_cross_Ka"), "", {HistType::kTH1F, {axisClusterSize}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_cross_Pr"), "", {HistType::kTH1F, {axisClusterSize}}); } - if (cfgOpenITSCut) { + if (cfgOpenITSCutQAPlots) { histosQA.add(Form("QA/PID/histAverClusterSizeCosl_AfterITS_Pi"), "", {HistType::kTH1F, {axisClusterSize}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_AfterITS_Ka"), "", {HistType::kTH1F, {axisClusterSize}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_AfterITS_Pr"), "", {HistType::kTH1F, {axisClusterSize}}); @@ -612,7 +683,7 @@ struct FillPIDcolums { histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_cross_Ka"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_cross_Pr"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); } - if (cfgOpenITSCut) { + if (cfgOpenITSCutQAPlots) { histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_AfterITS_Pi"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_AfterITS_Ka"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_P_AfterITS_Pr"), "", {HistType::kTH2F, {axisPPID, axisClusterSize}}); @@ -627,7 +698,7 @@ struct FillPIDcolums { histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_cross_Ka"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_cross_Pr"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); } - if (cfgOpenITSCut) { + if (cfgOpenITSCutQAPlots) { histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Pi"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Ka"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_AfterITS_Pr"), "", {HistType::kTH2F, {axisnSigmaTPC, axisClusterSizenSigma}}); @@ -642,7 +713,7 @@ struct FillPIDcolums { histosQA.add(Form("QA/PID/histPhi_Dis_cross_Ka"), "", {HistType::kTH1F, {axisPhi}}); histosQA.add(Form("QA/PID/histPhi_Dis_cross_Pr"), "", {HistType::kTH1F, {axisPhi}}); } - if (cfgOpenITSCut) { + if (cfgOpenITSCutQAPlots) { histosQA.add(Form("QA/PID/histPhi_Dis_AfterITS_Pi"), "", {HistType::kTH1F, {axisPhi}}); histosQA.add(Form("QA/PID/histPhi_Dis_AfterITS_Ka"), "", {HistType::kTH1F, {axisPhi}}); histosQA.add(Form("QA/PID/histPhi_Dis_AfterITS_Pr"), "", {HistType::kTH1F, {axisPhi}}); @@ -657,7 +728,7 @@ struct FillPIDcolums { histosQA.add(Form("QA/PID/histPhi_Dis_Pt_Eta_cross_Ka"), "", {HistType::kTH3F, {axisPhi, axisPtPID, axisEtaPID}}); histosQA.add(Form("QA/PID/histPhi_Dis_Pt_Eta_cross_Pr"), "", {HistType::kTH3F, {axisPhi, axisPtPID, axisEtaPID}}); } - if (cfgOpenITSCut) { + if (cfgOpenITSCutQAPlots) { histosQA.add(Form("QA/PID/histPhi_Dis_Pt_Eta_AfterITS_Pi"), "", {HistType::kTH3F, {axisPhi, axisPtPID, axisEtaPID}}); histosQA.add(Form("QA/PID/histPhi_Dis_Pt_Eta_AfterITS_Ka"), "", {HistType::kTH3F, {axisPhi, axisPtPID, axisEtaPID}}); histosQA.add(Form("QA/PID/histPhi_Dis_Pt_Eta_AfterITS_Pr"), "", {HistType::kTH3F, {axisPhi, axisPtPID, axisEtaPID}}); @@ -685,7 +756,7 @@ struct FillPIDcolums { histosQA.add(Form("QA/PID/histnSigmaTOF_nSigmaTPC_cross_Ka"), "", {HistType::kTH2F, {axisnSigmaTOF, axisnSigmaTPC}}); histosQA.add(Form("QA/PID/histnSigmaTOF_nSigmaTPC_cross_Pr"), "", {HistType::kTH2F, {axisnSigmaTOF, axisnSigmaTPC}}); } - if (cfgOpenITSCut) { + if (cfgOpenITSCutQAPlots) { histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Pi"), "", {HistType::kTH2F, {axisnSigmaITS, axisnSigmaTPC}}); histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Ka"), "", {HistType::kTH2F, {axisnSigmaITS, axisnSigmaTPC}}); histosQA.add(Form("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Pr"), "", {HistType::kTH2F, {axisnSigmaITS, axisnSigmaTPC}}); @@ -745,7 +816,7 @@ struct FillPIDcolums { histosQA.add(Form("QA/PID/histnSigma_ITS_Pt_cross_Ka"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaITS}}); histosQA.add(Form("QA/PID/histnSigma_ITS_Pt_cross_Pr"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaITS}}); } - if (cfgOpenITSCut) { + if (cfgOpenITSCutQAPlots) { histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_AfterITS_Pi"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_AfterITS_Ka"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); histosQA.add(Form("QA/PID/histnSigma_TOF_Pt_AfterITS_Pr"), "", {HistType::kTH2F, {axisPtPID, axisnSigmaTOF}}); @@ -770,7 +841,7 @@ struct FillPIDcolums { histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_NegPi_Before"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_NegKa_Before"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); histosQA.add(Form("QA/PID/histAverClusterSizeCosl_nSigmaTPC_Pt_NegPr_Before"), ";n#sigma_{TPC}; x ;#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisClusterSizenSigma, axisPtPID}}); - if (cfgOpenITSCut) { + if (cfgOpenITSCutQAPlots) { histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosPi_After"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosKa_After"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); histosQA.add(Form("QA/PID/histnSigmaITS_TPC_Pt_PosPr_After"), ";n#sigma_{TPC};n#sigma_{ITS};#p_{t}", {HistType::kTH3F, {axisnSigmaTPC, axisnSigmaITS, axisPtPID}}); @@ -797,18 +868,132 @@ struct FillPIDcolums { aod::pidits::ITSNSigmaPr>(tracks); int8_t pidFlag; for (const auto& track : tracksWithITSPid) { + // Fill the original plots first + if (!cfgQuietMode) { + if (cfgOpenTrackingInfoCheck) { + histosQA.fill(HIST("QA/PID/histDCAz_total_origin"), track.dcaZ()); + histosQA.fill(HIST("QA/PID/histDCAxy_total_origin"), track.dcaXY()); + histosQA.fill(HIST("QA/PID/histTPCNcls_total_origin"), track.tpcNClsFound()); + histosQA.fill(HIST("QA/PID/histITSNcls_total_origin"), track.itsNCls()); + histosQA.fill(HIST("QA/PID/histTPCChi2Ncls_total_origin"), track.tpcChi2NCl()); + histosQA.fill(HIST("QA/PID/histITSChi2Ncls_total_origin"), track.itsChi2NCl()); + } + if (cfgOpenPlotCheckITSOnlytrackInfo && track.tpcNClsFound() == 0) { + histosQA.fill(HIST("QA/PID/histDCAz_ITSOnly_Px"), track.px()); + histosQA.fill(HIST("QA/PID/histDCAz_ITSOnly_Py"), track.py()); + histosQA.fill(HIST("QA/PID/histDCAz_ITSOnly_Pz"), track.pz()); + } + if (cfgOpenPlotnSigmaOrigin) { + if (cfgOpenPlotnSigmaTOFITSPt) { + histosQA.fill(HIST("QA/PID/histnSigma_Origin_TOF_ITS_Pt_Pi"), track.tofNSigmaPi(), track.itsNSigmaPi(), track.pt()); + histosQA.fill(HIST("QA/PID/histnSigma_Origin_TOF_ITS_Pt_Ka"), track.tofNSigmaKa(), track.itsNSigmaKa(), track.pt()); + histosQA.fill(HIST("QA/PID/histnSigma_Origin_TOF_ITS_Pt_Pr"), track.tofNSigmaPr(), track.itsNSigmaPr(), track.pt()); + } + if (cfgOpenPlotnSigmaTOFTPCPt) { + histosQA.fill(HIST("QA/PID/histnSigma_Origin_TOF_TPC_Pt_Pi"), track.tofNSigmaPi(), track.tpcNSigmaPi(), track.pt()); + histosQA.fill(HIST("QA/PID/histnSigma_Origin_TOF_TPC_Pt_Ka"), track.tofNSigmaKa(), track.tpcNSigmaKa(), track.pt()); + histosQA.fill(HIST("QA/PID/histnSigma_Origin_TOF_TPC_Pt_Pr"), track.tofNSigmaPr(), track.tpcNSigmaPr(), track.pt()); + } + if (cfgOpenPlotnSigmaITSTPCPt) { + histosQA.fill(HIST("QA/PID/histnSigma_Origin_ITS_TPC_Pt_Pi"), track.itsNSigmaPi(), track.tpcNSigmaPi(), track.pt()); + histosQA.fill(HIST("QA/PID/histnSigma_Origin_ITS_TPC_Pt_Ka"), track.itsNSigmaKa(), track.tpcNSigmaKa(), track.pt()); + histosQA.fill(HIST("QA/PID/histnSigma_Origin_ITS_TPC_Pt_Pr"), track.itsNSigmaPr(), track.tpcNSigmaPr(), track.pt()); + } + histosQA.fill(HIST("QA/PID/histnSigma_Origin_TPC_Pi"), track.tpcNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_Origin_TPC_Ka"), track.tpcNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_Origin_TPC_Pr"), track.tpcNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_Origin_TOF_Pi"), track.tofNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_Origin_TOF_Ka"), track.tofNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_Origin_TOF_Pr"), track.tofNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_Origin_ITS_Pi"), track.itsNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_Origin_ITS_Ka"), track.itsNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_Origin_ITS_Pr"), track.itsNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_Origin_TPC_Pt_Pi"), track.pt(), track.tpcNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_Origin_TPC_Pt_Ka"), track.pt(), track.tpcNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_Origin_TPC_Pt_Pr"), track.pt(), track.tpcNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_Origin_TOF_Pt_Pi"), track.pt(), track.tofNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_Origin_TOF_Pt_Ka"), track.pt(), track.tofNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_Origin_TOF_Pt_Pr"), track.pt(), track.tofNSigmaPr()); + histosQA.fill(HIST("QA/PID/histnSigma_Origin_ITS_Pt_Pi"), track.pt(), track.itsNSigmaPi()); + histosQA.fill(HIST("QA/PID/histnSigma_Origin_ITS_Pt_Ka"), track.pt(), track.itsNSigmaKa()); + histosQA.fill(HIST("QA/PID/histnSigma_Origin_ITS_Pt_Pr"), track.pt(), track.itsNSigmaPr()); + } + } + int currentPtBinPi = -1, currentPtBinKa = -1, currentPtBinPr = -1; + if (cfgOpenPtRangedTOFnSigmacutPi || cfgOpenPtRangedTPCnSigmacutPi || cfgOpenPtRangedITSnSigmacutPi) { + for (int i = 0; i < static_cast(cfgPtBinPionPID.value.size()) - 1; ++i) { + if (track.pt() >= cfgPtBinPionPID.value[i] && track.pt() < cfgPtBinPionPID.value[i + 1]) { + currentPtBinPi = i; + break; + } + } + } + if (cfgOpenPtRangedTOFnSigmacutKa || cfgOpenPtRangedTPCnSigmacutKa || cfgOpenPtRangedITSnSigmacutKa) { + for (int i = 0; i < static_cast(cfgPtBinKaonPID.value.size()) - 1; ++i) { + if (track.pt() >= cfgPtBinKaonPID.value[i] && track.pt() < cfgPtBinKaonPID.value[i + 1]) { + currentPtBinKa = i; + break; + } + } + } + if (cfgOpenPtRangedTOFnSigmacutPr || cfgOpenPtRangedTPCnSigmacutPr || cfgOpenPtRangedITSnSigmacutPr) { + for (int i = 0; i < static_cast(cfgPtBinProtonPID.value.size()) - 1; ++i) { + if (track.pt() >= cfgPtBinProtonPID.value[i] && track.pt() < cfgPtBinProtonPID.value[i + 1]) { + currentPtBinPr = i; + break; + } + } + } + float nSigmaTOFCutPiPtUpper = (currentPtBinPi == -1) ? cfgnSigmaCutTOFUpper.value[0] : cfgnSigmaTOFPionPtUpper.value[currentPtBinPi]; + float nSigmaTOFCutKaPtUpper = (currentPtBinKa == -1) ? cfgnSigmaCutTOFUpper.value[1] : cfgnSigmaTOFKaonPtUpper.value[currentPtBinKa]; + float nSigmaTOFCutPrPtUpper = (currentPtBinPr == -1) ? cfgnSigmaCutTOFUpper.value[2] : cfgnSigmaTOFProtonPtUpper.value[currentPtBinPr]; + float nSigmaTPCCutPiPtUpper = (currentPtBinPi == -1) ? cfgnSigmaCutTPCUpper.value[0] : cfgnSigmaTPCPionPtUpper.value[currentPtBinPi]; + float nSigmaTPCCutKaPtUpper = (currentPtBinKa == -1) ? cfgnSigmaCutTPCUpper.value[1] : cfgnSigmaTPCKaonPtUpper.value[currentPtBinKa]; + float nSigmaTPCCutPrPtUpper = (currentPtBinPr == -1) ? cfgnSigmaCutTPCUpper.value[2] : cfgnSigmaTPCProtonPtUpper.value[currentPtBinPr]; + float nSigmaTOFCutPiPtLower = (currentPtBinPi == -1) ? cfgnSigmaCutTOFLower.value[0] : cfgnSigmaTOFPionPtLower.value[currentPtBinPi]; + float nSigmaTOFCutKaPtLower = (currentPtBinKa == -1) ? cfgnSigmaCutTOFLower.value[1] : cfgnSigmaTOFKaonPtLower.value[currentPtBinKa]; + float nSigmaTOFCutPrPtLower = (currentPtBinPr == -1) ? cfgnSigmaCutTOFLower.value[2] : cfgnSigmaTOFProtonPtLower.value[currentPtBinPr]; + float nSigmaTPCCutPiPtLower = (currentPtBinPi == -1) ? cfgnSigmaCutTPCLower.value[0] : cfgnSigmaTPCPionPtLower.value[currentPtBinPi]; + float nSigmaTPCCutKaPtLower = (currentPtBinKa == -1) ? cfgnSigmaCutTPCLower.value[1] : cfgnSigmaTPCKaonPtLower.value[currentPtBinKa]; + float nSigmaTPCCutPrPtLower = (currentPtBinPr == -1) ? cfgnSigmaCutTPCLower.value[2] : cfgnSigmaTPCProtonPtLower.value[currentPtBinPr]; + float nSigmaITSCutPiPtUpper = (currentPtBinPi == -1) ? cfgnSigmaCutITSUpper.value[0] : cfgnSigmaITSPionPtUpper.value[currentPtBinPi]; + float nSigmaITSCutKaPtUpper = (currentPtBinKa == -1) ? cfgnSigmaCutITSUpper.value[1] : cfgnSigmaITSKaonPtUpper.value[currentPtBinKa]; + float nSigmaITSCutPrPtUpper = (currentPtBinPr == -1) ? cfgnSigmaCutITSUpper.value[2] : cfgnSigmaITSProtonPtUpper.value[currentPtBinPr]; + float nSigmaITSCutPiPtLower = (currentPtBinPi == -1) ? cfgnSigmaCutITSLower.value[0] : cfgnSigmaITSPionPtLower.value[currentPtBinPi]; + float nSigmaITSCutKaPtLower = (currentPtBinKa == -1) ? cfgnSigmaCutITSLower.value[1] : cfgnSigmaITSKaonPtLower.value[currentPtBinKa]; + float nSigmaITSCutPrPtLower = (currentPtBinPr == -1) ? cfgnSigmaCutITSLower.value[2] : cfgnSigmaITSProtonPtLower.value[currentPtBinPr]; + std::array nSigmaTOFCutPtUpper = {nSigmaTOFCutPiPtUpper, nSigmaTOFCutKaPtUpper, nSigmaTOFCutPrPtUpper}; + std::array nSigmaTPCCutPtUpper = {nSigmaTPCCutPiPtUpper, nSigmaTPCCutKaPtUpper, nSigmaTPCCutPrPtUpper}; + std::array nSigmaTOFCutPtLower = {nSigmaTOFCutPiPtLower, nSigmaTOFCutKaPtLower, nSigmaTOFCutPrPtLower}; + std::array nSigmaTPCCutPtLower = {nSigmaTPCCutPiPtLower, nSigmaTPCCutKaPtLower, nSigmaTPCCutPrPtLower}; + std::array nSigmaITSCutPtUpper = {nSigmaITSCutPiPtUpper, nSigmaITSCutKaPtUpper, nSigmaITSCutPrPtUpper}; + std::array nSigmaITSCutPtLower = {nSigmaITSCutPiPtLower, nSigmaITSCutKaPtLower, nSigmaITSCutPrPtLower}; const float averClusSizeCosl = averageClusterSizeCosl(track.itsClusterSizes(), track.eta()); if (!selTrackPid(track)) { pidFlag = -1; } else { if (!cfgQuietMode) { histosQA.fill(HIST("QA/PID/histdEdxTPC_All"), track.sign() * track.tpcInnerParam(), track.tpcSignal()); + if (cfgOpenTrackingInfoCheck) { + histosQA.fill(HIST("QA/PID/histDCAz_total"), track.dcaZ()); + histosQA.fill(HIST("QA/PID/histDCAxy_total"), track.dcaXY()); + histosQA.fill(HIST("QA/PID/histITSNcls_total"), track.itsNCls()); + histosQA.fill(HIST("QA/PID/histTPCNcls_total"), track.tpcNClsFound()); + histosQA.fill(HIST("QA/PID/histTPCChi2Ncls_total"), track.tpcChi2NCl()); + histosQA.fill(HIST("QA/PID/histITSChi2Ncls_total"), track.itsChi2NCl()); + } } - pidFlag = selectionPidtpctof(track); + pidFlag = selectionPidtpctof(track, nSigmaTOFCutPtUpper, nSigmaTOFCutPtLower, nSigmaTPCCutPtUpper, nSigmaTPCCutPtLower); if (!(pidFlag == 0 || pidFlag == -1)) { // First fill ITS uncut plots - if (!cfgQuietMode) { - if ((pidFlag == 1) || (pidFlag == 7) || (pidFlag == 8) || (pidFlag == 10)) { + if ((pidFlag == 1) || (pidFlag == 7) || (pidFlag == 8) || (pidFlag == 10)) { + if (cfgOpenTPCAssistanceTOFOnlyPID && !(track.tpcNSigmaPi() > nSigmaTPCCutPiPtLower && track.tpcNSigmaPi() < nSigmaTPCCutPiPtUpper)) { + pidFlag = 0; + } + if (cfgOpenPIDPtSelection && !(track.pt() > cfgPtCutLower.value[0] && track.pt() < cfgPtCutUpper.value[0])) { + pidFlag = 0; + } + if (!(cfgQuietMode || pidFlag == 0)) { histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_Pi"), track.itsNSigmaPi(), track.tpcNSigmaPi()); histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaITS_Pi"), track.tofNSigmaPi(), track.itsNSigmaPi()); histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaTPC_Pi"), track.tofNSigmaPi(), track.tpcNSigmaPi()); @@ -820,6 +1005,14 @@ struct FillPIDcolums { histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_Pi"), track.pt(), track.tofNSigmaPi()); histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pi"), track.itsNSigmaPi()); histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pt_Pi"), track.pt(), track.itsNSigmaPi()); + if (cfgOpenTrackingInfoCheck) { + histosQA.fill(HIST("QA/PID/histDCAz_Pi"), track.dcaZ()); + histosQA.fill(HIST("QA/PID/histDCAxy_Pi"), track.dcaXY()); + histosQA.fill(HIST("QA/PID/histITSNcls_Pi"), track.itsNCls()); + histosQA.fill(HIST("QA/PID/histTPCNcls_Pi"), track.tpcNClsFound()); + histosQA.fill(HIST("QA/PID/histTPCChi2Ncls_Pi"), track.tpcChi2NCl()); + histosQA.fill(HIST("QA/PID/histITSChi2Ncls_Pi"), track.itsChi2NCl()); + } if (cfgOpenPlotnSigmaTOFITSPt) { histosQA.fill(HIST("QA/PID/histnSigma_TOF_ITS_Pt_Pi"), track.tofNSigmaPi(), track.itsNSigmaPi(), track.pt()); } @@ -854,7 +1047,15 @@ struct FillPIDcolums { } } } - if ((pidFlag == 2) || (pidFlag == 7) || (pidFlag == 9) || (pidFlag == 10)) { + } + if ((pidFlag == 2) || (pidFlag == 7) || (pidFlag == 9) || (pidFlag == 10)) { + if (cfgOpenTPCAssistanceTOFOnlyPID && !(track.tpcNSigmaKa() > nSigmaTPCCutKaPtLower && track.tpcNSigmaKa() < nSigmaTPCCutKaPtUpper)) { + pidFlag = 0; + } + if (cfgOpenPIDPtSelection && !(track.pt() > cfgPtCutLower.value[1] && track.pt() < cfgPtCutUpper.value[1])) { + pidFlag = 0; + } + if (!(cfgQuietMode || pidFlag == 0)) { histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_Ka"), track.itsNSigmaKa(), track.tpcNSigmaKa()); histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaITS_Ka"), track.tofNSigmaKa(), track.itsNSigmaKa()); histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaTPC_Ka"), track.tofNSigmaKa(), track.tpcNSigmaKa()); @@ -866,6 +1067,14 @@ struct FillPIDcolums { histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_Ka"), track.pt(), track.tofNSigmaKa()); histosQA.fill(HIST("QA/PID/histnSigma_ITS_Ka"), track.itsNSigmaKa()); histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pt_Ka"), track.pt(), track.itsNSigmaKa()); + if (cfgOpenTrackingInfoCheck) { + histosQA.fill(HIST("QA/PID/histDCAz_Ka"), track.dcaZ()); + histosQA.fill(HIST("QA/PID/histDCAxy_Ka"), track.dcaXY()); + histosQA.fill(HIST("QA/PID/histITSNcls_Ka"), track.itsNCls()); + histosQA.fill(HIST("QA/PID/histTPCNcls_Ka"), track.tpcNClsFound()); + histosQA.fill(HIST("QA/PID/histTPCChi2Ncls_Ka"), track.tpcChi2NCl()); + histosQA.fill(HIST("QA/PID/histITSChi2Ncls_Ka"), track.itsChi2NCl()); + } if (cfgOpenPlotnSigmaTOFITSPt) { histosQA.fill(HIST("QA/PID/histnSigma_TOF_ITS_Pt_Ka"), track.tofNSigmaKa(), track.itsNSigmaKa(), track.pt()); } @@ -900,7 +1109,15 @@ struct FillPIDcolums { } } } - if ((pidFlag == 3) || (pidFlag == 8) || (pidFlag == 9) || (pidFlag == 10)) { + } + if ((pidFlag == 3) || (pidFlag == 8) || (pidFlag == 9) || (pidFlag == 10)) { + if (cfgOpenTPCAssistanceTOFOnlyPID && !(track.tpcNSigmaPr() > nSigmaTPCCutPrPtLower && track.tpcNSigmaPr() < nSigmaTPCCutPrPtUpper)) { + pidFlag = 0; + } + if (cfgOpenPIDPtSelection && !(track.pt() > cfgPtCutLower.value[2] && track.pt() < cfgPtCutUpper.value[2])) { + pidFlag = 0; + } + if (!(cfgQuietMode || pidFlag == 0)) { histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_Pr"), track.itsNSigmaPr(), track.tpcNSigmaPr()); histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaITS_Pr"), track.tofNSigmaPr(), track.itsNSigmaPr()); histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaTPC_Pr"), track.tofNSigmaPr(), track.tpcNSigmaPr()); @@ -912,6 +1129,14 @@ struct FillPIDcolums { histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_Pr"), track.pt(), track.tofNSigmaPr()); histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pr"), track.itsNSigmaPr()); histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pt_Pr"), track.pt(), track.itsNSigmaPr()); + if (cfgOpenTrackingInfoCheck) { + histosQA.fill(HIST("QA/PID/histDCAz_Pr"), track.dcaZ()); + histosQA.fill(HIST("QA/PID/histDCAxy_Pr"), track.dcaXY()); + histosQA.fill(HIST("QA/PID/histITSNcls_Pr"), track.itsNCls()); + histosQA.fill(HIST("QA/PID/histTPCNcls_Pr"), track.tpcNClsFound()); + histosQA.fill(HIST("QA/PID/histTPCChi2Ncls_Pr"), track.tpcChi2NCl()); + histosQA.fill(HIST("QA/PID/histITSChi2Ncls_Pr"), track.itsChi2NCl()); + } if (cfgOpenPlotnSigmaTOFITSPt) { histosQA.fill(HIST("QA/PID/histnSigma_TOF_ITS_Pt_Pr"), track.tofNSigmaPr(), track.itsNSigmaPr(), track.pt()); } @@ -952,22 +1177,22 @@ struct FillPIDcolums { int idx = -1; switch (pidFlag) { case 1: - if (!selectionITS(track, 1, averClusSizeCosl)) { + if (!selectionITS(track, 1, averClusSizeCosl, nSigmaITSCutPtUpper, nSigmaITSCutPtLower)) { pidFlag = 4; } break; case 2: - if (!selectionITS(track, 2, averClusSizeCosl)) { + if (!selectionITS(track, 2, averClusSizeCosl, nSigmaITSCutPtUpper, nSigmaITSCutPtLower)) { pidFlag = 5; } break; case 3: - if (!selectionITS(track, 3, averClusSizeCosl)) { + if (!selectionITS(track, 3, averClusSizeCosl, nSigmaITSCutPtUpper, nSigmaITSCutPtLower)) { pidFlag = 6; } break; case 7: - idx = (selectionITS(track, 1, averClusSizeCosl) << 1) | selectionITS(track, 2, averClusSizeCosl); + idx = (selectionITS(track, 1, averClusSizeCosl, nSigmaITSCutPtUpper, nSigmaITSCutPtLower) << 1) | selectionITS(track, 2, averClusSizeCosl, nSigmaITSCutPtUpper, nSigmaITSCutPtLower); switch (idx) { case 0: pidFlag = 11; @@ -983,7 +1208,7 @@ struct FillPIDcolums { } break; case 8: - idx = (selectionITS(track, 1, averClusSizeCosl) << 1) | selectionITS(track, 3, averClusSizeCosl); + idx = (selectionITS(track, 1, averClusSizeCosl, nSigmaITSCutPtUpper, nSigmaITSCutPtLower) << 1) | selectionITS(track, 3, averClusSizeCosl, nSigmaITSCutPtUpper, nSigmaITSCutPtLower); switch (idx) { case 0: pidFlag = 12; @@ -999,7 +1224,7 @@ struct FillPIDcolums { } break; case 9: - idx = (selectionITS(track, 2, averClusSizeCosl) << 1) | selectionITS(track, 3, averClusSizeCosl); + idx = (selectionITS(track, 2, averClusSizeCosl, nSigmaITSCutPtUpper, nSigmaITSCutPtLower) << 1) | selectionITS(track, 3, averClusSizeCosl, nSigmaITSCutPtUpper, nSigmaITSCutPtLower); switch (idx) { case 0: pidFlag = 13; @@ -1015,7 +1240,7 @@ struct FillPIDcolums { } break; case 10: - idx = (selectionITS(track, 1, averClusSizeCosl) << 2) | (selectionITS(track, 2, averClusSizeCosl) << 1) | selectionITS(track, 3, averClusSizeCosl); + idx = (selectionITS(track, 1, averClusSizeCosl, nSigmaITSCutPtUpper, nSigmaITSCutPtLower) << 2) | (selectionITS(track, 2, averClusSizeCosl, nSigmaITSCutPtUpper, nSigmaITSCutPtLower) << 1) | selectionITS(track, 3, averClusSizeCosl, nSigmaITSCutPtUpper, nSigmaITSCutPtLower); switch (idx) { case 0: pidFlag = 14; @@ -1049,8 +1274,16 @@ struct FillPIDcolums { } } // Third Fill ITS cut plots - if (cfgOpenITSCut) { + if (cfgOpenITSCutQAPlots) { if (!cfgQuietMode) { + if (cfgOpenTrackingInfoCheck) { + histosQA.fill(HIST("QA/PID/histDCAz_total_AfterITS"), track.dcaZ()); + histosQA.fill(HIST("QA/PID/histDCAxy_total_AfterITS"), track.dcaXY()); + histosQA.fill(HIST("QA/PID/histITSNcls_total_AfterITS"), track.itsNCls()); + histosQA.fill(HIST("QA/PID/histTPCNcls_total_AfterITS"), track.tpcNClsFound()); + histosQA.fill(HIST("QA/PID/histTPCChi2Ncls_total_AfterITS"), track.tpcChi2NCl()); + histosQA.fill(HIST("QA/PID/histITSChi2Ncls_total_AfterITS"), track.itsChi2NCl()); + } if ((pidFlag == 1) || (pidFlag == 7) || (pidFlag == 8) || (pidFlag == 10)) { histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Pi"), track.itsNSigmaPi(), track.tpcNSigmaPi()); histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaITS_AfterITS_Pi"), track.tofNSigmaPi(), track.itsNSigmaPi()); @@ -1058,6 +1291,14 @@ struct FillPIDcolums { histosQA.fill(HIST("QA/PID/histnSigma_TPC_Pt_AfterITS_Pi"), track.pt(), track.tpcNSigmaPi()); histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_AfterITS_Pi"), track.pt(), track.tofNSigmaPi()); histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pt_AfterITS_Pi"), track.pt(), track.itsNSigmaPi()); + if (cfgOpenTrackingInfoCheck) { + histosQA.fill(HIST("QA/PID/histDCAz_Pi_AfterITS"), track.dcaZ()); + histosQA.fill(HIST("QA/PID/histDCAxy_Pi_AfterITS"), track.dcaXY()); + histosQA.fill(HIST("QA/PID/histITSNcls_Pi_AfterITS"), track.itsNCls()); + histosQA.fill(HIST("QA/PID/histTPCNcls_Pi_AfterITS"), track.tpcNClsFound()); + histosQA.fill(HIST("QA/PID/histTPCChi2Ncls_Pi_AfterITS"), track.tpcChi2NCl()); + histosQA.fill(HIST("QA/PID/histITSChi2Ncls_Pi_AfterITS"), track.itsChi2NCl()); + } if (cfgOpenPlotnSigmaTOFITSPt) { histosQA.fill(HIST("QA/PID/histnSigma_TOF_ITS_Pt_AfterITS_Pi"), track.tofNSigmaPi(), track.itsNSigmaPi(), track.pt()); } @@ -1099,6 +1340,14 @@ struct FillPIDcolums { histosQA.fill(HIST("QA/PID/histnSigma_TPC_Pt_AfterITS_Ka"), track.pt(), track.tpcNSigmaKa()); histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_AfterITS_Ka"), track.pt(), track.tofNSigmaKa()); histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pt_AfterITS_Ka"), track.pt(), track.itsNSigmaKa()); + if (cfgOpenTrackingInfoCheck) { + histosQA.fill(HIST("QA/PID/histDCAz_Ka_AfterITS"), track.dcaZ()); + histosQA.fill(HIST("QA/PID/histDCAxy_Ka_AfterITS"), track.dcaXY()); + histosQA.fill(HIST("QA/PID/histITSNcls_Ka_AfterITS"), track.itsNCls()); + histosQA.fill(HIST("QA/PID/histTPCNcls_Ka_AfterITS"), track.tpcNClsFound()); + histosQA.fill(HIST("QA/PID/histTPCChi2Ncls_Ka_AfterITS"), track.tpcChi2NCl()); + histosQA.fill(HIST("QA/PID/histITSChi2Ncls_Ka_AfterITS"), track.itsChi2NCl()); + } if (cfgOpenPlotnSigmaTOFITSPt) { histosQA.fill(HIST("QA/PID/histnSigma_TOF_ITS_Pt_AfterITS_Ka"), track.tofNSigmaKa(), track.itsNSigmaKa(), track.pt()); } @@ -1140,6 +1389,14 @@ struct FillPIDcolums { histosQA.fill(HIST("QA/PID/histnSigma_TPC_Pt_AfterITS_Pr"), track.pt(), track.tpcNSigmaPr()); histosQA.fill(HIST("QA/PID/histnSigma_TOF_Pt_AfterITS_Pr"), track.pt(), track.tofNSigmaPr()); histosQA.fill(HIST("QA/PID/histnSigma_ITS_Pt_AfterITS_Pr"), track.pt(), track.itsNSigmaPr()); + if (cfgOpenTrackingInfoCheck) { + histosQA.fill(HIST("QA/PID/histDCAz_Pr_AfterITS"), track.dcaZ()); + histosQA.fill(HIST("QA/PID/histDCAxy_Pr_AfterITS"), track.dcaXY()); + histosQA.fill(HIST("QA/PID/histITSNcls_Pr_AfterITS"), track.itsNCls()); + histosQA.fill(HIST("QA/PID/histTPCNcls_Pr_AfterITS"), track.tpcNClsFound()); + histosQA.fill(HIST("QA/PID/histTPCChi2Ncls_Pr_AfterITS"), track.tpcChi2NCl()); + histosQA.fill(HIST("QA/PID/histITSChi2Ncls_Pr_AfterITS"), track.itsChi2NCl()); + } if (cfgOpenPlotnSigmaTOFITSPt) { histosQA.fill(HIST("QA/PID/histnSigma_TOF_ITS_Pt_AfterITS_Pr"), track.tofNSigmaPr(), track.itsNSigmaPr(), track.pt()); } @@ -1667,7 +1924,7 @@ struct QAProcessCent { } }; -struct pidcme { // o2-linter: disable=name/struct +struct pidcme { // o2-linter: disable=name/struct(keep the saving dir name for offline analysis) HistogramRegistry histosQA{"histosmain", {}, OutputObjHandlingPolicy::AnalysisObject}; Configurable> cfgnMods{"cfgnMods", {2}, "Modulation of interest"}; From 2a7cb0255481e5e3f11c869fa01d70f911caab61 Mon Sep 17 00:00:00 2001 From: Rahul Verma <110929992+rahulverma012@users.noreply.github.com> Date: Sat, 15 Mar 2025 03:48:34 +0530 Subject: [PATCH 0681/1650] [PWGCF] Kaon isospin fluctuation particle identification updated (#10449) Co-authored-by: Victor Gonzalez --- .../Tasks/kaonIsospinFluctuations.cxx | 797 +++++++++++++----- 1 file changed, 600 insertions(+), 197 deletions(-) diff --git a/PWGCF/EbyEFluctuations/Tasks/kaonIsospinFluctuations.cxx b/PWGCF/EbyEFluctuations/Tasks/kaonIsospinFluctuations.cxx index b6a4eb5042b..114eee65041 100644 --- a/PWGCF/EbyEFluctuations/Tasks/kaonIsospinFluctuations.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/kaonIsospinFluctuations.cxx @@ -69,7 +69,7 @@ struct KaonIsospinFluctuations { // Configurables // Event Selection - Configurable cutZvertex{"cutZvertex", 10.0f, "Accepted z-vertex range (cm)"}; + Configurable cutZvertex{"cutZvertex", 8.0f, "Accepted z-vertex range (cm)"}; // Configurable parameters for V0 selection Configurable v0settingDcaPosToPV{"v0settingDcaPosToPV", 0.06, "DCA Pos to PV"}; @@ -89,6 +89,42 @@ struct KaonIsospinFluctuations { Configurable centAxisType{"centAxisType", 0, "centAxisType"}; + // Configurables for particle Identification + Configurable cfgCheckVetoCut{"cfgCheckVetoCut", false, "cfgCheckVetoCut"}; + Configurable cfgDoElAndDeRejection{"cfgDoElAndDeRejection", false, "cfgDoElAndDeRejection"}; + Configurable cfgDoPdependentId{"cfgDoPdependentId", true, "cfgDoPdependentId"}; + Configurable cfgDoTpcInnerParamId{"cfgDoTpcInnerParamId", false, "cfgDoTpcInnerParamId"}; + + Configurable cfgPiThrPforTOF{"cfgPiThrPforTOF", 0.7, "cfgPiThrPforTOF"}; + Configurable cfgPiIdCutTypeLowP{"cfgPiIdCutTypeLowP", 0, "cfgPiIdCutTypeLowP"}; + Configurable cfgPiNSigmaTPCLowP{"cfgPiNSigmaTPCLowP", 3.0, "cfgPiNSigmaTPCLowP"}; + Configurable cfgPiNSigmaTOFLowP{"cfgPiNSigmaTOFLowP", 3.0, "cfgPiNSigmaTOFLowP"}; + Configurable cfgPiNSigmaRadLowP{"cfgPiNSigmaRadLowP", 9.0, "cfgPiNSigmaRadLowP"}; + Configurable cfgPiIdCutTypeHighP{"cfgPiIdCutTypeHighP", 0, "cfgPiIdCutTypeHighP"}; + Configurable cfgPiNSigmaTPCHighP{"cfgPiNSigmaTPCHighP", 3.0, "cfgPiNSigmaTPCHighP"}; + Configurable cfgPiNSigmaTOFHighP{"cfgPiNSigmaTOFHighP", 3.0, "cfgPiNSigmaTOFHighP"}; + Configurable cfgPiNSigmaRadHighP{"cfgPiNSigmaRadHighP", 9.0, "cfgPiNSigmaRadHighP"}; + + Configurable cfgKaThrPforTOF{"cfgKaThrPforTOF", 0.8, "cfgKaThrPforTOF"}; + Configurable cfgKaIdCutTypeLowP{"cfgKaIdCutTypeLowP", 0, "cfgKaIdCutTypeLowP"}; + Configurable cfgKaNSigmaTPCLowP{"cfgKaNSigmaTPCLowP", 3.0, "cfgKaNSigmaTPCLowP"}; + Configurable cfgKaNSigmaTOFLowP{"cfgKaNSigmaTOFLowP", 3.0, "cfgKaNSigmaTOFLowP"}; + Configurable cfgKaNSigmaRadLowP{"cfgKaNSigmaRadLowP", 9.0, "cfgKaNSigmaRadLowP"}; + Configurable cfgKaIdCutTypeHighP{"cfgKaIdCutTypeHighP", 0, "cfgKaIdCutTypeHighP"}; + Configurable cfgKaNSigmaTPCHighP{"cfgKaNSigmaTPCHighP", 3.0, "cfgKaNSigmaTPCHighP"}; + Configurable cfgKaNSigmaTOFHighP{"cfgKaNSigmaTOFHighP", 3.0, "cfgKaNSigmaTOFHighP"}; + Configurable cfgKaNSigmaRadHighP{"cfgKaNSigmaRadHighP", 9.0, "cfgKaNSigmaRadHighP"}; + + Configurable cfgPrThrPforTOF{"cfgPrThrPforTOF", 0.8, "cfgPrThrPforTOF"}; + Configurable cfgPrIdCutTypeLowP{"cfgPrIdCutTypeLowP", 0, "cfgPrIdCutTypeLowP"}; + Configurable cfgPrNSigmaTPCLowP{"cfgPrNSigmaTPCLowP", 3.0, "cfgPrNSigmaTPCLowP"}; + Configurable cfgPrNSigmaTOFLowP{"cfgPrNSigmaTOFLowP", 3.0, "cfgPrNSigmaTOFLowP"}; + Configurable cfgPrNSigmaRadLowP{"cfgPrNSigmaRadLowP", 9.0, "cfgPrNSigmaRadLowP"}; + Configurable cfgPrIdCutTypeHighP{"cfgPrIdCutTypeHighP", 0, "cfgPrIdCutTypeHighP"}; + Configurable cfgPrNSigmaTPCHighP{"cfgPrNSigmaTPCHighP", 3.0, "cfgPrNSigmaTPCHighP"}; + Configurable cfgPrNSigmaTOFHighP{"cfgPrNSigmaTOFHighP", 3.0, "cfgPrNSigmaTOFHighP"}; + Configurable cfgPrNSigmaRadHighP{"cfgPrNSigmaRadHighP", 9.0, "cfgPrNSigmaRadHighP"}; + // configurable for process functions to reduce memory usage Configurable cfgFillV0TableFull{"cfgFillV0TableFull", true, "cfgFillV0TableFull"}; Configurable cfgFillV0TablePostK0sCheck{"cfgFillV0TablePostK0sCheck", false, "cfgFillV0TablePostK0sCheck"}; @@ -284,6 +320,7 @@ struct KaonIsospinFluctuations { recoV0s.add("v0Table/postSelectionCut/nCommonPionOfDifferentK0s", "nCommonPionOfDifferentK0s", {HistType::kTH1D, {{44, -2, 20}}}); // Event Selection + recoEvent.add("recoEvent/ProcessType", "ProcessType", {HistType::kTH1D, {{20, -1, 9}}}); recoEvent.add("recoEvent/h01_CollisionCount", "CollisionCount", {HistType::kTH1D, {{1, 0, 1}}}); recoEvent.add("recoEvent/h02_VertexXRec", "VertexXRec", {HistType::kTH1D, {{1000, -0.2, 0.2}}}); recoEvent.add("recoEvent/h03_VertexYRec", "VertexYRec", {HistType::kTH1D, {{1000, -0.2, 0.2}}}); @@ -518,15 +555,390 @@ struct KaonIsospinFluctuations { kTOFidentified }; + enum TpcTofCutType { + kRectangularCut = 0, + kCircularCut, + kEllipsoidalCut + }; + + enum ProcessTypeEnum { + doDataProcessing = 0, + doRecoProcessing, + doPurityProcessing + }; + + enum HistRegEnum { + v0TableFull = 0, + v0TablePostK0sCheck, + v0TablePostMassCut, + v0TablePostSelectionCut, + recoK0sPreSel, + recoK0sPostSel, + recoTrackPreSel, + recoTrackPostSel, + recoAnalysisDir, + genAnalysisDir + }; + + static constexpr std::string_view HistRegDire[] = { + "v0Table/Full/", + "v0Table/postK0sCheck/", + "v0Table/postMassCut/", + "v0Table/postSelectionCut/", + "recoK0s/PreSel/", + "recoK0s/PostSel/", + "recoTracks/PreSel/", + "recoTracks/PostSel/", + "recoAnalysis/", + "genAnalysis/"}; + + enum PidEnum { + kPi = 0, // dont use kPion, kKaon, as these enumeration + kKa, // are already defined in $ROOTSYS/root/include/TPDGCode.h + kPr, + kEl, + kDe, + kK0s + }; + + static constexpr std::string_view PidDire[] = { + "Pi/", + "Ka/", + "Pr/", + "El/", + "De/", + "K0s/"}; + + enum DetEnum { + tpcId = 0, + tofId, + NoId + }; + + static constexpr std::string_view DetDire[] = { + "tpcId/", + "tofId/", + "NoId/"}; + + // vetoRejection for particles //From Victor Luis Gonzalez Sebastian's analysis note for balance functions + template + bool selTrackForId(const T& track) + { + if (-3.0 < track.tpcNSigmaEl() && track.tpcNSigmaEl() < 5.0 && + std::fabs(track.tpcNSigmaPi()) > 3.0 && + std::fabs(track.tpcNSigmaKa()) > 3.0 && + std::fabs(track.tpcNSigmaPr()) > 3.0) { + return false; + } else { + return true; + } + } + + template + bool vetoIdOthersTPC(const T& track) + { + if (pidMode != kPi) { + if (std::fabs(track.tpcNSigmaPi()) < 3.0) + return false; + } + if (pidMode != kKa) { + if (std::fabs(track.tpcNSigmaKa()) < 3.0) + return false; + } + if (pidMode != kPr) { + if (std::fabs(track.tpcNSigmaPr()) < 3.0) + return false; + } + if (cfgDoElAndDeRejection) { + if (pidMode != kDe) { + if (std::fabs(track.tpcNSigmaDe()) < 3.0) + return false; + } + if (pidMode != kEl) { + if (std::fabs(track.tpcNSigmaEl()) < 3.0) + return false; + } + } + return true; + } + + template + bool vetoIdOthersTOF(const T& track) + { + if (pidMode != kPi) { + if (std::fabs(track.tofNSigmaPi()) < 3.0) + return false; + } + if (pidMode != kKa) { + if (std::fabs(track.tofNSigmaKa()) < 3.0) + return false; + } + if (pidMode != kPr) { + if (std::fabs(track.tofNSigmaPr()) < 3.0) + return false; + } + if (cfgDoElAndDeRejection) { + if (pidMode != kDe) { + if (std::fabs(track.tofNSigmaDe()) < 3.0) + return false; + } + if (pidMode != kEl) { + if (std::fabs(track.tofNSigmaEl()) < 3.0) + return false; + } + } + return true; + } + + template + bool vetoIdOthersTPCTOF(const T& track) + { + if (pidMode != kPi) { + if (std::fabs(track.tpcNSigmaPi()) < 3.0 && std::fabs(track.tofNSigmaPi()) < 3.0) + return false; + } + if (pidMode != kKa) { + if (std::fabs(track.tpcNSigmaKa()) < 3.0 && std::fabs(track.tofNSigmaKa()) < 3.0) + return false; + } + if (pidMode != kPr) { + if (std::fabs(track.tpcNSigmaPr()) < 3.0 && std::fabs(track.tofNSigmaPr()) < 3.0) + return false; + } + if (cfgDoElAndDeRejection) { + if (pidMode != kDe) { + if (std::fabs(track.tpcNSigmaDe()) < 3.0 && std::fabs(track.tofNSigmaDe()) < 3.0) + return false; + } + if (pidMode != kEl) { + if (std::fabs(track.tpcNSigmaEl()) < 3.0 && std::fabs(track.tofNSigmaEl()) < 3.0) + return false; + } + } + return true; + } + + template + bool selIdRectangularCut(const T& track, const float& nSigmaTPC, const float& nSigmaTOF) + { + switch (pidMode) { + case kPi: + if (std::fabs(track.tpcNSigmaPi()) < nSigmaTPC && + std::fabs(track.tofNSigmaPi()) < nSigmaTOF) { + return true; + } + break; + case kKa: + if (std::fabs(track.tpcNSigmaKa()) < nSigmaTPC && + std::fabs(track.tofNSigmaKa()) < nSigmaTOF) { + return true; + } + break; + case kPr: + if (std::fabs(track.tpcNSigmaPr()) < nSigmaTPC && + std::fabs(track.tofNSigmaPr()) < nSigmaTOF) { + return true; + } + break; + default: + return false; + break; + } + return false; + } + + template + bool selIdEllipsoidalCut(const T& track, const float& nSigmaTPC, const float& nSigmaTOF) + { + switch (pidMode) { + case kPi: + if (std::pow(track.tpcNSigmaPi() / nSigmaTPC, 2) + std::pow(track.tofNSigmaPi() / nSigmaTOF, 2) < 1.0) + return true; + break; + case kKa: + if (std::pow(track.tpcNSigmaKa() / nSigmaTPC, 2) + std::pow(track.tofNSigmaKa() / nSigmaTOF, 2) < 1.0) + return true; + break; + case kPr: + if (std::pow(track.tpcNSigmaPr() / nSigmaTPC, 2) + std::pow(track.tofNSigmaPr() / nSigmaTOF, 2) < 1.0) + return true; + break; + default: + return false; + break; + } + return false; + } + + template + bool selIdCircularCut(const T& track, const float& nSigmaSquaredRad) + { + switch (pidMode) { + case kPi: + if (std::pow(track.tpcNSigmaPi(), 2) + std::pow(track.tofNSigmaPi(), 2) < nSigmaSquaredRad) + return true; + break; + case kKa: + if (std::pow(track.tpcNSigmaKa(), 2) + std::pow(track.tofNSigmaKa(), 2) < nSigmaSquaredRad) + return true; + break; + case kPr: + if (std::pow(track.tpcNSigmaPr(), 2) + std::pow(track.tofNSigmaPr(), 2) < nSigmaSquaredRad) + return true; + break; + default: + return false; + break; + } + return false; + } + + template + bool checkReliableTOF(const T& track) + { + if (track.hasTOF()) + return true; // which check makes the information of TOF relaiable? should track.beta() be checked? + else + return false; + } + + template + bool idTPC(const T& track, const float& nSigmaTPC) + { + if (cfgCheckVetoCut && !vetoIdOthersTPC(track)) + return false; + switch (pidMode) { + case kPi: + if (std::fabs(track.tpcNSigmaPi()) < nSigmaTPC) + return true; + break; + case kKa: + if (std::fabs(track.tpcNSigmaKa()) < nSigmaTPC) + return true; + break; + case kPr: + if (std::fabs(track.tpcNSigmaPr()) < nSigmaTPC) + return true; + break; + default: + return false; + break; + } + return false; + } + + template + bool idTPCTOF(const T& track, const int& pidCutType, const float& nSigmaTPC, const float& nSigmaTOF, const float& nSigmaSquaredRad) + { + if (cfgCheckVetoCut && !vetoIdOthersTPCTOF(track)) + return false; + if (pidCutType == kRectangularCut) { + return selIdRectangularCut(track, nSigmaTPC, nSigmaTOF); + } else if (pidCutType == kCircularCut) { + return selIdCircularCut(track, nSigmaSquaredRad); + } else if (pidCutType == kEllipsoidalCut) { + return selIdEllipsoidalCut(track, nSigmaTPC, nSigmaTOF); + } + return false; + } + + template + bool selPiPdependent(const T& track, int& IdMethod) + { + if (track.p() < cfgPiThrPforTOF) { + if (checkReliableTOF(track)) { + if (idTPCTOF(track, cfgPiIdCutTypeLowP, cfgPiNSigmaTPCLowP, cfgPiNSigmaTOFLowP, cfgPiNSigmaRadLowP)) { + IdMethod = kTOFidentified; + return true; + } + return false; + } else { + if (idTPC(track, cfgPiNSigmaTPCLowP)) { + IdMethod = kTPCidentified; + return true; + } + return false; + } + } else { + if (checkReliableTOF(track)) { + if (idTPCTOF(track, cfgPiIdCutTypeHighP, cfgPiNSigmaTPCHighP, cfgPiNSigmaTOFHighP, cfgPiNSigmaRadHighP)) { + IdMethod = kTOFidentified; + return true; + } + return false; + } + return false; + } + } + + template + bool selKaPdependent(const T& track, int& IdMethod) + { + if (track.p() < cfgKaThrPforTOF) { + if (checkReliableTOF(track)) { + if (idTPCTOF(track, cfgKaIdCutTypeLowP, cfgKaNSigmaTPCLowP, cfgKaNSigmaTOFLowP, cfgKaNSigmaRadLowP)) { + IdMethod = kTOFidentified; + return true; + } + return false; + } else { + if (idTPC(track, cfgKaNSigmaTPCLowP)) { + IdMethod = kTPCidentified; + return true; + } + return false; + } + } else { + if (checkReliableTOF(track)) { + if (idTPCTOF(track, cfgKaIdCutTypeHighP, cfgKaNSigmaTPCHighP, cfgKaNSigmaTOFHighP, cfgKaNSigmaRadHighP)) { + IdMethod = kTOFidentified; + return true; + } + return false; + } + return false; + } + } + + template + bool selPrPdependent(const T& track, int& IdMethod) + { + if (track.p() < cfgPrThrPforTOF) { + if (checkReliableTOF(track)) { + if (idTPCTOF(track, cfgPrIdCutTypeLowP, cfgPrNSigmaTPCLowP, cfgPrNSigmaTOFLowP, cfgPrNSigmaRadLowP)) { + IdMethod = kTOFidentified; + return true; + } + return false; + } else { + if (idTPC(track, cfgPrNSigmaTPCLowP)) { + IdMethod = kTPCidentified; + return true; + } + return false; + } + } else { + if (checkReliableTOF(track)) { + if (idTPCTOF(track, cfgPrIdCutTypeHighP, cfgPrNSigmaTPCHighP, cfgPrNSigmaTOFHighP, cfgPrNSigmaRadHighP)) { + IdMethod = kTOFidentified; + return true; + } + return false; + } + return false; + } + } + + //_______________________________Identification Funtions Depending on the tpcInnerParam _______________________________ // tpc Selections template bool selPionTPCInnerParam(T track) { - if (std::abs(track.tpcNSigmaEl()) > 3.0 && std::abs(track.tpcNSigmaKa()) > 3.0 && std::abs(track.tpcNSigmaPr()) > 3.0 && std::abs(track.tpcNSigmaDe()) > 3.0) { - if (0.05 <= track.tpcInnerParam() && track.tpcInnerParam() < 0.70 && std::abs(track.tpcNSigmaPi()) < 3.0) { + if (vetoIdOthersTPC(track)) { + if (0.05 <= track.tpcInnerParam() && track.tpcInnerParam() < 0.70 && std::abs(track.tpcNSigmaPi()) < cfgPiNSigmaTPCLowP) { return true; } - if (0.70 <= track.tpcInnerParam() && std::abs(track.tpcNSigmaPi()) < 2.0) { + if (0.70 <= track.tpcInnerParam() && std::abs(track.tpcNSigmaPi()) < cfgPiNSigmaTPCHighP) { return true; } } @@ -536,12 +948,11 @@ struct KaonIsospinFluctuations { template bool selKaonTPCInnerParam(T track) { - // p dependent cuts - if (std::abs(track.tpcNSigmaEl()) > 3.0 && std::abs(track.tpcNSigmaPi()) > 3.0 && std::abs(track.tpcNSigmaPr()) > 3.0 && std::abs(track.tpcNSigmaDe()) > 3.0) { - if (0.05 <= track.tpcInnerParam() && track.tpcInnerParam() < 0.70 && std::abs(track.tpcNSigmaKa()) < 3.0) { + if (vetoIdOthersTPC(track)) { + if (0.05 <= track.tpcInnerParam() && track.tpcInnerParam() < 0.70 && std::abs(track.tpcNSigmaKa()) < cfgKaNSigmaTPCLowP) { return true; } - if (0.70 <= track.tpcInnerParam() && std::abs(track.tpcNSigmaKa()) < 2.0) { + if (0.70 <= track.tpcInnerParam() && std::abs(track.tpcNSigmaKa()) < cfgKaNSigmaTPCHighP) { return true; } } @@ -551,11 +962,11 @@ struct KaonIsospinFluctuations { template bool selProtonTPCInnerParam(T track) { - if (std::abs(track.tpcNSigmaEl()) > 3.0 && std::abs(track.tpcNSigmaPi()) > 3.0 && std::abs(track.tpcNSigmaKa()) > 3.0 && std::abs(track.tpcNSigmaDe()) > 3.0) { - if (0.05 <= track.tpcInnerParam() && track.tpcInnerParam() < 1.60 && std::abs(track.tpcNSigmaPr()) < 3.0) { + if (vetoIdOthersTPC(track)) { + if (0.05 <= track.tpcInnerParam() && track.tpcInnerParam() < 1.60 && std::abs(track.tpcNSigmaPr()) < cfgPrNSigmaTPCLowP) { return true; } - if (1.60 <= track.tpcInnerParam() && std::abs(track.tpcNSigmaPr()) < 2.0) { + if (1.60 <= track.tpcInnerParam() && std::abs(track.tpcNSigmaPr()) < cfgPrNSigmaTPCHighP) { return true; } } @@ -565,7 +976,7 @@ struct KaonIsospinFluctuations { template bool selDeuteronTPCInnerParam(T track) { - if (std::abs(track.tpcNSigmaEl()) > 3.0 && std::abs(track.tpcNSigmaPi()) > 3.0 && std::abs(track.tpcNSigmaKa()) > 3.0 && std::abs(track.tpcNSigmaPr()) > 3.0) { + if (vetoIdOthersTPC(track)) { if (0.05 <= track.tpcInnerParam() && track.tpcInnerParam() < 1.80 && std::abs(track.tpcNSigmaDe()) < 3.0) { return true; } @@ -585,17 +996,19 @@ struct KaonIsospinFluctuations { return false; } // - + //_____________________________________________________TOF selection Functions _______________________________________________________________________ // TOF Selections // Pion template bool selPionTOF(T track) { - if (track.p() <= 0.75 && std::abs(track.tpcNSigmaPi()) < 3.0 && std::abs(track.tofNSigmaPi()) < 3.0 && std::abs(track.tofNSigmaEl()) > 3.0) { - return true; - } else if (0.75 < track.p() // after p = 0.75, Pi and Ka lines of nSigma 3.0 will start intersecting - && std::abs(track.tpcNSigmaPi()) < 2.0 && std::abs(track.tofNSigmaPi()) < 2.0 && std::abs(track.tofNSigmaEl()) > 3.0 && std::abs(track.tofNSigmaKa()) > 3.0 && std::abs(track.tofNSigmaPr()) > 3.0 && std::abs(track.tofNSigmaDe()) > 3.0) { - return true; + if (vetoIdOthersTOF(track)) { + if (track.p() <= 0.75 && std::abs(track.tpcNSigmaPi()) < cfgPiNSigmaTPCLowP && std::abs(track.tofNSigmaPi()) < cfgPiNSigmaTOFLowP) { + return true; + } else if (0.75 < track.p() // after p = 0.75, Pi and Ka lines of nSigma 3.0 will start intersecting + && std::abs(track.tpcNSigmaPi()) < cfgPiNSigmaTPCHighP && std::abs(track.tofNSigmaPi()) < cfgPiNSigmaTOFHighP) { + return true; + } } return false; } @@ -604,16 +1017,18 @@ struct KaonIsospinFluctuations { template bool selKaonTOF(T track) { - if (track.p() <= 0.75 && std::abs(track.tpcNSigmaKa()) < 3.0 && std::abs(track.tofNSigmaKa()) < 3.0) { - return true; - } - if (0.75 < track.p() && track.p() <= 1.30 // after 0.75 Pi and Ka lines of nSigma 3.0 will start intersecting - && std::abs(track.tpcNSigmaKa()) < 3.0 && std::abs(track.tofNSigmaKa()) < 3.0 && std::abs(track.tofNSigmaPi()) > 3.0 && std::abs(track.tofNSigmaEl()) > 3.0) { - return true; - } - if (1.30 < track.p() // after 1.30 Pr and Ka lines of nSigma 3.0 will start intersecting - && std::abs(track.tpcNSigmaKa()) < 2.0 && std::abs(track.tofNSigmaKa()) < 2.0 && std::abs(track.tofNSigmaEl()) > 3.0 && std::abs(track.tofNSigmaPi()) > 3.0 && std::abs(track.tofNSigmaPr()) > 3.0 && std::abs(track.tofNSigmaDe()) > 3.0) { - return true; + if (vetoIdOthersTOF(track)) { + if (track.p() <= 0.75 && std::abs(track.tpcNSigmaKa()) < cfgKaNSigmaTPCLowP && std::abs(track.tofNSigmaKa()) < cfgKaNSigmaTOFLowP) { + return true; + } + if (0.75 < track.p() && track.p() <= 1.30 // after 0.75 Pi and Ka lines of nSigma 3.0 will start intersecting + && std::abs(track.tpcNSigmaKa()) < cfgKaNSigmaTPCLowP && std::abs(track.tofNSigmaKa()) < cfgKaNSigmaTOFLowP) { + return true; + } + if (1.30 < track.p() // after 1.30 Pr and Ka lines of nSigma 3.0 will start intersecting + && std::abs(track.tpcNSigmaKa()) < cfgKaNSigmaTPCHighP && std::abs(track.tofNSigmaKa()) < cfgKaNSigmaTOFHighP) { + return true; + } } return false; } @@ -622,17 +1037,19 @@ struct KaonIsospinFluctuations { template bool selProtonTOF(T track) { - if (track.p() <= 1.30 && std::abs(track.tpcNSigmaPr()) < 3.0 && std::abs(track.tofNSigmaPr()) < 3.0) { - return true; - } - if (1.30 < track.p() && track.p() <= 3.10 // after 1.30 Pr and Ka lines of nSigma 3.0 will start intersecting - && std::abs(track.tpcNSigmaPr()) < 3.0 && std::abs(track.tofNSigmaPr()) < 3.0 && std::abs(track.tofNSigmaEl()) > 3.0 && std::abs(track.tofNSigmaPi()) > 3.0 && std::abs(track.tofNSigmaKa()) > 3.0 && std::abs(track.tofNSigmaDe()) > 3.0 // Some Deuteron contamination is still coming in p dependent cuts - ) { - return true; - } - if (3.10 < track.p() // after 3.10 Pr and De lines of nSigma 3.0 will start intersecting - && std::abs(track.tpcNSigmaPr()) < 2.0 && std::abs(track.tofNSigmaPr()) < 2.0 && std::abs(track.tofNSigmaEl()) > 3.0 && std::abs(track.tofNSigmaPi()) > 3.0 && std::abs(track.tofNSigmaKa()) > 3.0 && std::abs(track.tofNSigmaDe()) > 3.0) { - return true; + if (vetoIdOthersTOF(track)) { + if (track.p() <= 1.30 && std::abs(track.tpcNSigmaPr()) < cfgPrNSigmaTPCLowP && std::abs(track.tofNSigmaPr()) < cfgPrNSigmaTOFLowP) { + return true; + } + if (1.30 < track.p() && track.p() <= 3.10 // after 1.30 Pr and Ka lines of nSigma 3.0 will start intersecting + && std::abs(track.tpcNSigmaPr()) < cfgPrNSigmaTPCLowP && std::abs(track.tofNSigmaPr()) < cfgPrNSigmaTOFLowP // Some Deuteron contamination is still coming in p dependent cuts + ) { + return true; + } + if (3.10 < track.p() // after 3.10 Pr and De lines of nSigma 3.0 will start intersecting + && std::abs(track.tpcNSigmaPr()) < cfgPrNSigmaTPCHighP && std::abs(track.tofNSigmaPr()) < cfgPrNSigmaTOFHighP) { + return true; + } } return false; } @@ -641,12 +1058,14 @@ struct KaonIsospinFluctuations { template bool selDeuteronTOF(T track) { - if (track.p() <= 3.10 && std::abs(track.tpcNSigmaDe()) < 3.0 && std::abs(track.tofNSigmaDe()) < 3.0 && std::abs(track.tofNSigmaEl()) > 3.0 && std::abs(track.tofNSigmaPi()) > 3.0 && std::abs(track.tofNSigmaKa()) > 3.0 && std::abs(track.tofNSigmaPr()) > 3.0) { - return true; - } - if (3.10 < track.p() // after 3.10 De and Pr lines of nSigma 3.0 will start intersecting - && std::abs(track.tpcNSigmaDe()) < 2.0 && std::abs(track.tofNSigmaDe()) < 2.0 && std::abs(track.tofNSigmaEl()) > 3.0 && std::abs(track.tofNSigmaPi()) > 3.0 && std::abs(track.tofNSigmaKa()) > 3.0 && std::abs(track.tofNSigmaPr()) > 3.0) { - return true; + if (vetoIdOthersTOF(track)) { + if (track.p() <= 3.10 && std::abs(track.tpcNSigmaDe()) < 3.0 && std::abs(track.tofNSigmaDe()) < 3.0) { + return true; + } + if (3.10 < track.p() // after 3.10 De and Pr lines of nSigma 3.0 will start intersecting + && std::abs(track.tpcNSigmaDe()) < 2.0 && std::abs(track.tofNSigmaDe()) < 2.0) { + return true; + } } return false; } @@ -655,34 +1074,29 @@ struct KaonIsospinFluctuations { template bool selElectronTOF(T track) { - if ( - (std::pow(track.tpcNSigmaEl(), 2) + std::pow(track.tofNSigmaEl(), 2)) < 9.00 && std::abs(track.tofNSigmaPi()) > 3.0 && std::abs(track.tofNSigmaKa()) > 3.0 && std::abs(track.tofNSigmaPr()) > 3.0 && std::abs(track.tofNSigmaDe()) > 3.0) { + if ((std::pow(track.tpcNSigmaEl(), 2) + std::pow(track.tofNSigmaEl(), 2)) < 9.00 && vetoIdOthersTOF(track)) { return true; } return false; } // - // SelectionFunctions + //______________________________Identification Functions________________________________________________________________ // Pion template bool selPion(T track, int& IdMethod) { - if (!track.hasTOF() && selPionTPCInnerParam(track)) { - IdMethod = kTPCidentified; - return true; - } - if (track.hasTOF() && track.beta() < 0.0 && selPionTPCInnerParam(track)) { - IdMethod = kTPCidentified; - return true; - } - if (track.hasTOF() && track.beta() > 0.0 && selPionTPCInnerParam(track)) { - IdMethod = kTPCidentified; - return true; - } - if (track.hasTOF() && track.beta() > 0.0 && !selPionTPCInnerParam(track)) { - IdMethod = kTOFidentified; - return selPionTOF(track); + if (cfgDoPdependentId) { + return selPiPdependent(track, IdMethod); + } else if (cfgDoTpcInnerParamId) { + if (selPionTPCInnerParam(track)) { + IdMethod = kTPCidentified; + return true; + } else if (track.hasTOF() && track.beta() > 0.0 && selPionTOF(track)) { + IdMethod = kTOFidentified; + return true; + } + return false; } return false; } @@ -691,21 +1105,17 @@ struct KaonIsospinFluctuations { template bool selKaon(T track, int& IdMethod) { - if (!track.hasTOF() && selKaonTPCInnerParam(track)) { - IdMethod = kTPCidentified; - return true; - } - if (track.hasTOF() && track.beta() < 0.0 && selKaonTPCInnerParam(track)) { - IdMethod = kTPCidentified; - return true; - } - if (track.hasTOF() && track.beta() > 0.0 && selKaonTPCInnerParam(track)) { - IdMethod = kTPCidentified; - return true; - } - if (track.hasTOF() && track.beta() > 0.0 && !selKaonTPCInnerParam(track)) { - IdMethod = kTOFidentified; - return selKaonTOF(track); + if (cfgDoPdependentId) { + return selKaPdependent(track, IdMethod); + } else if (cfgDoTpcInnerParamId) { + if (selKaonTPCInnerParam(track)) { + IdMethod = kTPCidentified; + return true; + } else if (track.hasTOF() && track.beta() > 0.0 && selKaonTOF(track)) { + IdMethod = kTOFidentified; + return true; + } + return false; } return false; } @@ -714,21 +1124,17 @@ struct KaonIsospinFluctuations { template bool selProton(T track, int& IdMethod) { - if (!track.hasTOF() && selProtonTPCInnerParam(track)) { - IdMethod = kTPCidentified; - return true; - } - if (track.hasTOF() && track.beta() < 0.0 && selProtonTPCInnerParam(track)) { - IdMethod = kTPCidentified; - return true; - } - if (track.hasTOF() && track.beta() > 0.0 && selProtonTPCInnerParam(track)) { - IdMethod = kTPCidentified; - return true; - } - if (track.hasTOF() && track.beta() > 0.0 && !selProtonTPCInnerParam(track)) { - IdMethod = kTOFidentified; - return selProtonTOF(track); + if (cfgDoPdependentId) { + return selPrPdependent(track, IdMethod); + } else if (cfgDoTpcInnerParamId) { + if (selProtonTPCInnerParam(track)) { + IdMethod = kTPCidentified; + return true; + } else if (track.hasTOF() && track.beta() > 0.0 && selProtonTOF(track)) { + IdMethod = kTOFidentified; + return true; + } + return false; } return false; } @@ -737,21 +1143,17 @@ struct KaonIsospinFluctuations { template bool selDeuteron(T track, int& IdMethod) { - if (!track.hasTOF() && selDeuteronTPCInnerParam(track)) { - IdMethod = kTPCidentified; - return true; - } - if (track.hasTOF() && track.beta() < 0.0 && selDeuteronTPCInnerParam(track)) { - IdMethod = kTPCidentified; - return true; - } - if (track.hasTOF() && track.beta() > 0.0 && selDeuteronTPCInnerParam(track)) { - IdMethod = kTPCidentified; - return true; - } - if (track.hasTOF() && track.beta() > 0.0 && !selDeuteronTPCInnerParam(track)) { - IdMethod = kTOFidentified; - return selDeuteronTOF(track); + if (cfgDoPdependentId) { + return false; + } else if (cfgDoTpcInnerParamId) { + if (selDeuteronTPCInnerParam(track)) { + IdMethod = kTPCidentified; + return true; + } else if (track.hasTOF() && track.beta() > 0.0 && selDeuteronTOF(track)) { + IdMethod = kTOFidentified; + return true; + } + return false; } return false; } @@ -760,21 +1162,17 @@ struct KaonIsospinFluctuations { template bool selElectron(T track, int& IdMethod) { - if (!track.hasTOF() && selElectronTPCInnerParam(track)) { - IdMethod = kTPCidentified; - return true; - } - if (track.hasTOF() && track.beta() < 0.0 && selElectronTPCInnerParam(track)) { - IdMethod = kTPCidentified; - return true; - } - if (track.hasTOF() && track.beta() > 0.0 && selElectronTPCInnerParam(track)) { - IdMethod = kTPCidentified; - return true; - } - if (track.hasTOF() && track.beta() > 0.0 && !selElectronTPCInnerParam(track)) { - IdMethod = kTOFidentified; - return selElectronTOF(track); + if (cfgDoPdependentId) { + return false; + } else if (cfgDoTpcInnerParamId) { + if (selElectronTPCInnerParam(track)) { + IdMethod = kTPCidentified; + return true; + } else if (track.hasTOF() && track.beta() > 0.0 && selElectronTOF(track)) { + IdMethod = kTOFidentified; + return true; + } + return false; } return false; } @@ -886,64 +1284,6 @@ struct KaonIsospinFluctuations { return true; } - enum ProcessTypeEnum { - doDataProcessing = 0, - doRecoProcessing - }; - - enum HistRegEnum { - v0TableFull = 0, - v0TablePostK0sCheck, - v0TablePostMassCut, - v0TablePostSelectionCut, - recoK0sPreSel, - recoK0sPostSel, - recoTrackPreSel, - recoTrackPostSel, - recoAnalysisDir, - genAnalysisDir - }; - - static constexpr std::string_view HistRegDire[] = { - "v0Table/Full/", - "v0Table/postK0sCheck/", - "v0Table/postMassCut/", - "v0Table/postSelectionCut/", - "recoK0s/PreSel/", - "recoK0s/PostSel/", - "recoTracks/PreSel/", - "recoTracks/PostSel/", - "recoAnalysis/", - "genAnalysis/"}; - - enum PidEnum { - kPi = 0, // dont use kPion, kKaon, as these enumeration - kKa, // are already defined in $ROOTSYS/root/include/TPDGCode.h - kPr, - kEl, - kDe, - kK0s - }; - - static constexpr std::string_view PidDire[] = { - "Pi/", - "Ka/", - "Pr/", - "El/", - "De/", - "K0s/"}; - - enum DetEnum { - tpcId = 0, - tofId, - NoId - }; - - static constexpr std::string_view DetDire[] = { - "tpcId/", - "tofId/", - "NoId/"}; - template void fillIdentificationQA(H histReg, const T& track) { @@ -1474,7 +1814,6 @@ struct KaonIsospinFluctuations { std::vector k0sNegDauList; std::vector fullDauList; - // template template void executeAnalysis(const C& collisions, const V& V0s, const T& tracks) { @@ -1528,7 +1867,6 @@ struct KaonIsospinFluctuations { int idMethodEl = -1; int idMethodDe = -1; - // if(doData) {} if constexpr (analysisType == doDataProcessing) { for (const auto& v0 : V0s) { const auto& posDaughterTrack = v0.template posTrack_as(); @@ -1645,7 +1983,7 @@ struct KaonIsospinFluctuations { nPiPlus, nKaPlus, nProton, nElPlus, nDePlus, nPiMinus, nKaMinus, nPBar, nElMinus, nDeMinus); } // collision loop ends - } else if constexpr (analysisType == doRecoProcessing) { + } else if constexpr (analysisType == doRecoProcessing || analysisType == doPurityProcessing) { for (const auto& v0 : V0s) { const auto& posDaughterTrack = v0.template posTrack_as(); const auto& negDaughterTrack = v0.template negTrack_as(); @@ -1659,7 +1997,12 @@ struct KaonIsospinFluctuations { if (!v0mcparticle.isPhysicalPrimary()) continue; - // should i check daugter tracks as physical primary as well. is it needed? // because my daughter must be seconday particle for it + if constexpr (analysisType == doPurityProcessing) { + auto posDauMcPart = posDaughterTrack.mcParticle(); + auto negDauMcPart = negDaughterTrack.mcParticle(); + if (v0mcparticle.pdgCode() != kK0Short || posDauMcPart.pdgCode() != kPiPlus || negDauMcPart.pdgCode() != kPiMinus) + continue; + } executeV0loop(posDaughterTrack, negDaughterTrack, v0, recoV0s, posPiIdMethod, posPrIdMethod, negPiIdMethod, negPrIdMethod, @@ -1715,6 +2058,13 @@ struct KaonIsospinFluctuations { if (!v0mcparticle.isPhysicalPrimary()) continue; + if constexpr (analysisType == doPurityProcessing) { + auto posDauMcPart = posDaughterTrack.mcParticle(); + auto negDauMcPart = negDaughterTrack.mcParticle(); + if (v0mcparticle.pdgCode() != kK0Short || posDauMcPart.pdgCode() != kPiPlus || negDauMcPart.pdgCode() != kPiMinus) + continue; + } + executeV0InCollisionloop(posDaughterTrack, negDaughterTrack, v0, posPiIdMethod, posPrIdMethod, negPiIdMethod, negPrIdMethod, v0Tag, isK0s, v0DauCollisionIndexTag, nK0s, centrality); @@ -1775,6 +2125,49 @@ struct KaonIsospinFluctuations { BITSET(trackIdTag, ID_BIT_DE); } + if constexpr (analysisType == doPurityProcessing) { + if (trackIsPion) { + if (track.sign() > 0 && mcPart.pdgCode() != kPiPlus) { + trackIsPion = false; + } + if (track.sign() < 0 && mcPart.pdgCode() != kPiMinus) { + trackIsPion = false; + } + } + if (trackIsKaon) { + if (track.sign() > 0 && mcPart.pdgCode() != kKPlus) { + trackIsKaon = false; + } + if (track.sign() < 0 && mcPart.pdgCode() != kKMinus) { + trackIsKaon = false; + } + } + if (trackIsProton) { + if (track.sign() > 0 && mcPart.pdgCode() != kProton) { + trackIsProton = false; + } + if (track.sign() < 0 && mcPart.pdgCode() != kProtonBar) { + trackIsProton = false; + } + } + if (trackIsElectron) { + if (track.sign() > 0 && mcPart.pdgCode() != kPositron) { + trackIsElectron = false; + } + if (track.sign() < 0 && mcPart.pdgCode() != kElectron) { + trackIsElectron = false; + } + } + if (trackIsDeuteron) { + if (track.sign() > 0 && mcPart.pdgCode() != kDeuteron) { + trackIsDeuteron = false; + } + if (track.sign() < 0 && mcPart.pdgCode() != -kDeuteron) { + trackIsDeuteron = false; + } + } + } + executeTrackAnalysisPart(track, trackIdTag, idMethodPi, trackIsPion, nPiMinus, nPiPlus, idMethodKa, trackIsKaon, nKaMinus, nKaPlus, @@ -1802,6 +2195,7 @@ struct KaonIsospinFluctuations { MyV0s const& V0s, MyTracks const& tracks) { + recoEvent.fill(HIST("recoEvent/ProcessType"), 1); executeAnalysis(collisions, V0s, tracks); } // Process Function Ends @@ -1809,17 +2203,26 @@ struct KaonIsospinFluctuations { void processReco(MyCollisionsWithMcLabels const& collisions, MyV0sWithMcLabels const& V0s, MyTracksWithMcLabels const& tracks, aod::McParticles const&) { - + recoEvent.fill(HIST("recoEvent/ProcessType"), 2); executeAnalysis(collisions, V0s, tracks); } // Process function is over PROCESS_SWITCH(KaonIsospinFluctuations, processReco, "Process for Reco", false); + void processPurity(MyCollisionsWithMcLabels const& collisions, MyV0sWithMcLabels const& V0s, MyTracksWithMcLabels const& tracks, aod::McParticles const&) + { + recoEvent.fill(HIST("recoEvent/ProcessType"), 4); + executeAnalysis(collisions, V0s, tracks); + + } // Process function is over + PROCESS_SWITCH(KaonIsospinFluctuations, processPurity, "Process for Purity", false); + Preslice mcTracksPerMcCollisionPreslice = o2::aod::mcparticle::mcCollisionId; using MyMcCollisions = aod::McCollisions; void processGen(MyMcCollisions const&, MyCollisionsWithMcLabels const& collisions, aod::McParticles const& mcParticles) { + recoEvent.fill(HIST("recoEvent/ProcessType"), 3); float centrality = -1; for (const auto& collision : collisions) { if (!collision.has_mcCollision()) { @@ -1862,7 +2265,7 @@ struct KaonIsospinFluctuations { continue; } - if (mcTrack.pdgCode() == 310 && + if (mcTrack.pdgCode() == kK0Short && 0.1 < mcTrack.pt() && mcTrack.pt() < 1.5 && std::abs(mcTrack.y()) < 0.5) { nK0s++; @@ -1873,34 +2276,34 @@ struct KaonIsospinFluctuations { continue; } - if (mcTrack.pdgCode() == 211) { + if (mcTrack.pdgCode() == kPiPlus) { fillGenTrackQA(genAnalysis, mcTrack); nPiPlus++; - } else if (mcTrack.pdgCode() == -211) { + } else if (mcTrack.pdgCode() == kPiMinus) { fillGenTrackQA(genAnalysis, mcTrack); nPiMinus++; - } else if (mcTrack.pdgCode() == 321) { + } else if (mcTrack.pdgCode() == kKPlus) { fillGenTrackQA(genAnalysis, mcTrack); nKaPlus++; - } else if (mcTrack.pdgCode() == -321) { + } else if (mcTrack.pdgCode() == kKMinus) { fillGenTrackQA(genAnalysis, mcTrack); nKaMinus++; - } else if (mcTrack.pdgCode() == 2212) { + } else if (mcTrack.pdgCode() == kProton) { fillGenTrackQA(genAnalysis, mcTrack); nProton++; - } else if (mcTrack.pdgCode() == -2212) { + } else if (mcTrack.pdgCode() == kProtonBar) { fillGenTrackQA(genAnalysis, mcTrack); nPBar++; - } else if (mcTrack.pdgCode() == 11) { + } else if (mcTrack.pdgCode() == kElectron) { fillGenTrackQA(genAnalysis, mcTrack); nElPlus++; - } else if (mcTrack.pdgCode() == -11) { + } else if (mcTrack.pdgCode() == kPositron) { fillGenTrackQA(genAnalysis, mcTrack); nElMinus++; - } else if (mcTrack.pdgCode() == 1000010020) { + } else if (mcTrack.pdgCode() == kDeuteron) { fillGenTrackQA(genAnalysis, mcTrack); nDePlus++; - } else if (mcTrack.pdgCode() == -1000010020) { + } else if (mcTrack.pdgCode() == -kDeuteron) { fillGenTrackQA(genAnalysis, mcTrack); nDeMinus++; } From ffb6acb5f906bd5e2366e25dd6d447dfc5fd11d7 Mon Sep 17 00:00:00 2001 From: altsybee Date: Fri, 14 Mar 2025 23:51:46 +0100 Subject: [PATCH 0682/1650] [DPG] Update timeDependentQa.cxx - new histos, bug fixes (#10489) --- DPG/Tasks/AOTEvent/timeDependentQa.cxx | 423 ++++++++++++++++--------- 1 file changed, 281 insertions(+), 142 deletions(-) diff --git a/DPG/Tasks/AOTEvent/timeDependentQa.cxx b/DPG/Tasks/AOTEvent/timeDependentQa.cxx index cb64a2e3d91..cfd0535922c 100644 --- a/DPG/Tasks/AOTEvent/timeDependentQa.cxx +++ b/DPG/Tasks/AOTEvent/timeDependentQa.cxx @@ -28,7 +28,7 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "Common/CCDB/ctpRateFetcher.h" #include "TPCCalibration/TPCMShapeCorrection.h" -#include "DataFormatsParameters/GRPECSObject.h" +#include "DataFormatsParameters/AggregatedRunInfo.h" #include "DataFormatsITSMFT/ROFRecord.h" #include "ReconstructionDataFormats/Vertex.h" #include "Common/DataModel/Multiplicity.h" @@ -41,7 +41,6 @@ using namespace o2::aod::evsel; using ColEvSels = soa::Join; using BCsRun3 = soa::Join; - using BarrelTracks = soa::Join; const AxisSpec axisQoverPt{100, -1., 1., "q/p_{T}, 1/GeV"}; @@ -52,10 +51,11 @@ const AxisSpec axisSparseDcaR{100, -1., 1., "DCA_{r}, cm"}; const AxisSpec axisSparseDcaZ{100, -1., 1., "DCA_{z}, cm"}; struct TimeDependentQaTask { - Configurable confTimeBinWidthInSec{"TimeBinWidthInSec", 0.25, "Width of time bins in seconds"}; // o2-linter: disable=name/configurable - Configurable confTakeVerticesWithUPCsettings{"ConsiderVerticesWithUPCsettings", 0, "Take vertices: 0 - all , 1 - only without UPC settings, 2 - only with UPC settings"}; // o2-linter: disable=name/configurable - Configurable confFillPhiVsTimeHist{"FillPhiVsTimeHist", 2, "0 - don't fill , 1 - fill only for global/7cls/TRD/TOF tracks, 2 - fill also layer-by-layer"}; // o2-linter: disable=name/configurable - Configurable confFillEtaPhiVsTimeHist{"FillEtaPhiVsTimeHist", 0, "0 - don't fill , 1 - fill"}; // o2-linter: disable=name/configurable + Configurable confTimeBinWidthInSec{"TimeBinWidthInSec", 0.25, "Width of time bins in seconds"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confTakeVerticesWithUPCsettings{"ConsiderVerticesWithUPCsettings", 0, "Take vertices: 0 - all , 1 - only without UPC settings, 2 - only with UPC settings"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confFillPhiVsTimeHist{"FlagFillPhiVsTimeHist", 2, "0 - don't fill , 1 - fill only for global/7cls/TRD/TOF tracks, 2 - fill also layer-by-layer"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confFillEtaPhiVsTimeHist{"FlagFillEtaPhiVsTimeHist", 0, "0 - don't fill , 1 - fill"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confCutOnNtpcClsForSharedFractAndDeDxCalc{"CutOnNtpcClsForSharedFractAndDeDxCalc", 70, ""}; // o2-linter: disable=name/configurable (temporary fix) enum EvSelBitsToMonitor { enCollisionsAll, @@ -79,11 +79,10 @@ struct TimeDependentQaTask { enIsGoodITSLayersAll, enIsLowOccupStd, enIsLowOccupStdAlsoInPrevRof, - enIsLowOccupStdAndCut2000, - enIsLowOccupStdAlsoInPrevRofAndCut2000, - enIsLowOccupStdAndCut500, - enIsLowOccupStdAlsoInPrevRofAndCut500, - enIsLowOccupStdAlsoInPrevRofAndCut500noDeadStaves, + enIsLowOccupStdCut500, + enIsLowOccupStdCut2000, + enIsLowOccupStdCut4000, + enIsLowOccupStdAlsoInPrevRofCut2000noDeadStaves, enNumEvSelBits, // counter }; @@ -93,6 +92,9 @@ struct TimeDependentQaTask { int lastRunNumber = -1; double maxSec = 1; double minSec = 0; + static const int32_t nBCsPerOrbit = o2::constants::lhc::LHCMaxBunches; + int64_t bcSOR = 0; // global bc of the start of the first orbit, setting 0 for unanchored MC + int64_t nBCsPerTF = -1; // duration of TF in bcs ctpRateFetcher mRateFetcher; void init(InitContext&) @@ -100,29 +102,72 @@ struct TimeDependentQaTask { ccdb->setURL("http://alice-ccdb.cern.ch"); ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); - histos.add("hQoverPt", "", kTH1F, {axisQoverPt}); - histos.add("hDcaR", "", kTH1F, {axisDcaR}); - histos.add("hDcaZ", "", kTH1F, {axisDcaZ}); - histos.add("hQoverPtDcaR", "", kTH2F, {axisSparseQoverPt, axisSparseDcaR}); - histos.add("hQoverPtDcaZ", "", kTH2F, {axisSparseQoverPt, axisSparseDcaZ}); + histos.add("allTracks/hQoverPt", "", kTH1F, {axisQoverPt}); + histos.add("allTracks/hDcaR", "", kTH1F, {axisDcaR}); + histos.add("allTracks/hDcaZ", "", kTH1F, {axisDcaZ}); + histos.add("allTracks/hDcaRafterCuts", "", kTH1F, {axisDcaR}); + histos.add("allTracks/hDcaZafterCuts", "", kTH1F, {axisDcaZ}); + histos.add("allTracks/hQoverPtDcaR", "", kTH2F, {axisSparseQoverPt, axisSparseDcaR}); + histos.add("allTracks/hQoverPtDcaZ", "", kTH2F, {axisSparseQoverPt, axisSparseDcaZ}); + + histos.add("PVcontrib/hDcaRafterCuts", "", kTH1F, {axisDcaR}); + histos.add("PVcontrib/hDcaZafterCuts", "", kTH1F, {axisDcaZ}); + + histos.add("A/global/hDcaRafterCuts", "", kTH1F, {axisDcaR}); + histos.add("A/global/hDcaZafterCuts", "", kTH1F, {axisDcaZ}); + histos.add("A/globalPV/hDcaRafterCuts", "", kTH1F, {axisDcaR}); + histos.add("A/globalPV/hDcaZafterCuts", "", kTH1F, {axisDcaZ}); + + histos.add("C/global/hDcaRafterCuts", "", kTH1F, {axisDcaR}); + histos.add("C/global/hDcaZafterCuts", "", kTH1F, {axisDcaZ}); + histos.add("C/globalPV/hDcaRafterCuts", "", kTH1F, {axisDcaR}); + histos.add("C/globalPV/hDcaZafterCuts", "", kTH1F, {axisDcaZ}); + + const AxisSpec axisBCinTF{150000, 0, 150000, "bc in TF"}; + histos.add("hNcolVsBcInTF", ";bc in TF; n collisions", kTH1F, {axisBCinTF}); + histos.add("hNcolVsBcInTFantiBorderCut", ";bc in TF; n collisions", kTH1F, {axisBCinTF}); } - void process(ColEvSels const& cols, BCsRun3 const& bcs, BarrelTracks const& tracks, aod::FT0s const&) + void processRun3( + ColEvSels const& cols, + BarrelTracks const& tracks, + BCsRun3 const& bcs, + aod::FT0s const&) { int runNumber = bcs.iteratorAt(0).runNumber(); if (runNumber != lastRunNumber) { - LOGP(info, " >> QA: run number = {}", runNumber); - + LOGP(debug, " >> QA: run number = {}", runNumber); lastRunNumber = runNumber; - std::map metadata; - metadata["runNumber"] = Form("%d", runNumber); - auto grpecs = ccdb->getSpecific("GLO/Config/GRPECS", bcs.iteratorAt(0).timestamp(), metadata); - minSec = floor(grpecs->getTimeStart() / 1000.); - maxSec = ceil(grpecs->getTimeEnd() / 1000.); + + int64_t tsSOR = 0; // dummy start-of-run timestamp + int64_t tsEOR = 1; // dummy end-of-run timestamp + if (runNumber >= 500000) { + auto runInfo = o2::parameters::AggregatedRunInfo::buildAggregatedRunInfo(o2::ccdb::BasicCCDBManager::instance(), runNumber); + // first bc of the first orbit + bcSOR = runInfo.orbitSOR * nBCsPerOrbit; + // duration of TF in bcs + nBCsPerTF = runInfo.orbitsPerTF * nBCsPerOrbit; + // start-of-run timestamp + tsSOR = runInfo.sor; + // end-of-run timestamp + tsEOR = runInfo.eor; + } + + minSec = floor(tsSOR / 1000.); + maxSec = ceil(tsEOR / 1000.); int nTimeBins = static_cast((maxSec - minSec) / confTimeBinWidthInSec); double timeInterval = nTimeBins * confTimeBinWidthInSec; const AxisSpec axisSeconds{nTimeBins, 0, timeInterval, "seconds"}; + histos.add("hSecondsBCsTVX", "", kTH1D, {axisSeconds}); + // histos.add("hSecondsBCsTFborder", "", kTH1D, {axisSeconds}); + histos.add("hSecondsBCsTVXandTFborder", "", kTH1D, {axisSeconds}); + + histos.add("hSecondsCollisionsBeforeAllCuts", "", kTH1D, {axisSeconds}); + histos.add("hSecondsCollisionsNoVzInTVX", "", kTH1D, {axisSeconds}); + histos.add("hSecondsCollisionsNoVzNoTFborder", "", kTH1D, {axisSeconds}); + histos.add("hSecondsCollisionsNoVzInTVXandNoTFborder", "", kTH1D, {axisSeconds}); + histos.add("hSecondsCollisions", "", kTH1D, {axisSeconds}); histos.add("hSecondsIR", "", kTH1D, {axisSeconds}); histos.add("hSecondsVz", "", kTH1D, {axisSeconds}); @@ -130,7 +175,6 @@ struct TimeDependentQaTask { histos.add("hSecondsFT0CamlpByColMult", "", kTH1D, {axisSeconds}); histos.add("hSecondsFT0AamlpByColMult", "", kTH1D, {axisSeconds}); histos.add("hSecondsV0Aamlp", "", kTH1D, {axisSeconds}); - histos.add("hSecondsOccupancyByTracks", "", kTH1D, {axisSeconds}); histos.add("hSecondsOccupancyByFT0C", "", kTH1D, {axisSeconds}); @@ -138,7 +182,7 @@ struct TimeDependentQaTask { histos.add("hSecondsUPCverticesBeforeSel8", "", kTH2F, {axisSeconds, {2, -0.5, 1.5, "Is vertex with UPC settings"}}); histos.add("hSecondsUPCvertices", "", kTH2F, {axisSeconds, {2, -0.5, 1.5, "Is vertex with UPC settings after sel8"}}); - // QA event selection bits + // ### QA event selection bits int nEvSelBits = enNumEvSelBits; histos.add("hSecondsEventSelBits", "", kTH2F, {axisSeconds, {nEvSelBits, -0.5, nEvSelBits - 0.5, "Monitoring of event selection bits"}}); TAxis* axSelBits = reinterpret_cast(histos.get(HIST("hSecondsEventSelBits"))->GetYaxis()); @@ -146,99 +190,118 @@ struct TimeDependentQaTask { axSelBits->SetBinLabel(1 + enIsTriggerTVX, "IsTriggerTVX"); axSelBits->SetBinLabel(1 + enNoTimeFrameBorder, "NoTimeFrameBorder"); axSelBits->SetBinLabel(1 + enNoITSROFrameBorder, "NoITSROFrameBorder"); + + // bits after sel8 axSelBits->SetBinLabel(1 + enCollisionsSel8, "collisionsSel8"); axSelBits->SetBinLabel(1 + enNoSameBunchPileup, "NoSameBunchPileup"); axSelBits->SetBinLabel(1 + enIsGoodZvtxFT0vsPV, "IsGoodZvtxFT0vsPV"); axSelBits->SetBinLabel(1 + enIsVertexITSTPC, "IsVertexITSTPC"); axSelBits->SetBinLabel(1 + enIsVertexTOFmatched, "IsVertexTOFmatched"); axSelBits->SetBinLabel(1 + enIsVertexTRDmatched, "IsVertexTRDmatched"); + axSelBits->SetBinLabel(1 + enNoCollInTimeRangeNarrow, "NoCollInTimeRangeNarrow"); axSelBits->SetBinLabel(1 + enNoCollInTimeRangeStrict, "NoCollInTimeRangeStrict"); axSelBits->SetBinLabel(1 + enNoCollInTimeRangeStandard, "NoCollInTimeRangeStandard"); axSelBits->SetBinLabel(1 + enNoCollInRofStrict, "NoCollInRofStrict"); axSelBits->SetBinLabel(1 + enNoCollInRofStandard, "NoCollInRofStandard"); axSelBits->SetBinLabel(1 + enNoHighMultCollInPrevRof, "NoHighMultCollInPrevRof"); + axSelBits->SetBinLabel(1 + enIsGoodITSLayer3, "IsGoodITSLayer3"); axSelBits->SetBinLabel(1 + enIsGoodITSLayer0123, "IsGoodITSLayer0123"); axSelBits->SetBinLabel(1 + enIsGoodITSLayersAll, "IsGoodITSLayersAll"); + + // combined conditions on occupancy axSelBits->SetBinLabel(1 + enIsLowOccupStd, "isLowOccupStd"); axSelBits->SetBinLabel(1 + enIsLowOccupStdAlsoInPrevRof, "isLowOccupStdAlsoInPrevRof"); - axSelBits->SetBinLabel(1 + enIsLowOccupStdAndCut2000, "isLowOccupStdAndCut2000"); - axSelBits->SetBinLabel(1 + enIsLowOccupStdAlsoInPrevRofAndCut2000, "isLowOccupStdAlsoInPrevRofAndCut2000"); - axSelBits->SetBinLabel(1 + enIsLowOccupStdAndCut500, "isLowOccupStdAndCut500"); - axSelBits->SetBinLabel(1 + enIsLowOccupStdAlsoInPrevRofAndCut500, "isLowOccupStdAlsoInPrevRofAndCut500"); - axSelBits->SetBinLabel(1 + enIsLowOccupStdAlsoInPrevRofAndCut500noDeadStaves, "isLowOccupStdAlsoInPrevRofAndCut500noDeadStaves"); - - // QA for tracks - histos.add("hSecondsTracks", "", kTH1D, {axisSeconds}); - histos.add("hSecondsQoverPtSumDcaR", "", kTH2D, {axisSeconds, axisSparseQoverPt}); - histos.add("hSecondsQoverPtSumDcaZ", "", kTH2D, {axisSeconds, axisSparseQoverPt}); - histos.add("hSecondsSumDcaR", "", kTH1D, {axisSeconds}); - histos.add("hSecondsSumDcaZ", "", kTH1D, {axisSeconds}); - histos.add("hSecondsTracksMshape", "", kTH1D, {axisSeconds}); - - // QA for global tracks - const AxisSpec axisChi2{40, 0., 20., "chi2/ndof"}; - const AxisSpec axisNclsITS{9, -0.5, 8.5, "n ITS cls"}; + axSelBits->SetBinLabel(1 + enIsLowOccupStdCut500, "isLowOccupStdCut500"); + axSelBits->SetBinLabel(1 + enIsLowOccupStdCut2000, "isLowOccupStdCut2000"); + axSelBits->SetBinLabel(1 + enIsLowOccupStdCut4000, "isLowOccupStdCut4000"); + axSelBits->SetBinLabel(1 + enIsLowOccupStdAlsoInPrevRofCut2000noDeadStaves, "isLowOccupStdAlsoInPrevRofCut2000noDeadStaves"); + + // const AxisSpec axisChi2ITS{40, 0., 20., "chi2/ndof"}; + // const AxisSpec axisChi2TPC{40, 0., 20., "chi2/ndof"}; + const AxisSpec axisNclsITS{5, 3.5, 8.5, "n ITS cls"}; const AxisSpec axisNclsTPC{40, -0.5, 159.5, "n TPC cls"}; - const AxisSpec axisFraction{40, 0, 1., "Fraction shared cls Tpc"}; + const AxisSpec axisFraction{20, 0, 1., "Fraction shared cls Tpc"}; + + // QA for all tracks + histos.add("allTracks/hSecondsTracks", "", kTH1D, {axisSeconds}); + histos.add("allTracks/hSecondsQoverPtSumDcaR", "", kTH2D, {axisSeconds, axisSparseQoverPt}); + histos.add("allTracks/hSecondsQoverPtSumDcaZ", "", kTH2D, {axisSeconds, axisSparseQoverPt}); + histos.add("allTracks/hSecondsSumDcaR", "", kTH1D, {axisSeconds}); + histos.add("allTracks/hSecondsSumDcaZ", "", kTH1D, {axisSeconds}); + histos.add("allTracks/hSecondsSumPt", "", kTH1D, {axisSeconds}); + histos.add("allTracks/hSecondsNumClsIts", "", kTH2D, {axisSeconds, axisNclsITS}); + histos.add("allTracks/hSecondsChi2NClIts", "", kTH1D, {axisSeconds}); + histos.add("allTracks/hSecondsTracksMshape", "", kTH1D, {axisSeconds}); + + // QA for PV contributors + histos.add("PVcontrib/hSecondsTracks", "", kTH1D, {axisSeconds}); + // histos.add("PVcontrib/hSecondsQoverPtSumDcaR", "", kTH2D, {axisSeconds, axisSparseQoverPt}); + // histos.add("PVcontrib/hSecondsQoverPtSumDcaZ", "", kTH2D, {axisSeconds, axisSparseQoverPt}); + histos.add("PVcontrib/hSecondsSumDcaR", "", kTH1D, {axisSeconds}); + histos.add("PVcontrib/hSecondsSumDcaZ", "", kTH1D, {axisSeconds}); + histos.add("PVcontrib/hSecondsSumPt", "", kTH1D, {axisSeconds}); + histos.add("PVcontrib/hSecondsNumClsIts", "", kTH2D, {axisSeconds, axisNclsITS}); + histos.add("PVcontrib/hSecondsChi2NClIts", "", kTH1D, {axisSeconds}); + // QA for global tracks // ### A side - histos.add("A/hSecondsTracks", "", kTH1D, {axisSeconds}); - histos.add("A/hSecondsQoverPtSumDcaR", "", kTH2D, {axisSeconds, axisSparseQoverPt}); - histos.add("A/hSecondsQoverPtSumDcaZ", "", kTH2D, {axisSeconds, axisSparseQoverPt}); - histos.add("A/hSecondsSumDcaR", "", kTH1D, {axisSeconds}); - histos.add("A/hSecondsSumDcaZ", "", kTH1D, {axisSeconds}); - // global tracks histos.add("A/global/hSecondsNumTracks", "", kTH1D, {axisSeconds}); + histos.add("A/global/hSecondsQoverPtSumDcaR", "", kTH2D, {axisSeconds, axisSparseQoverPt}); + histos.add("A/global/hSecondsQoverPtSumDcaZ", "", kTH2D, {axisSeconds, axisSparseQoverPt}); histos.add("A/global/hSecondsSumDcaR", "", kTH1D, {axisSeconds}); histos.add("A/global/hSecondsSumDcaZ", "", kTH1D, {axisSeconds}); + histos.add("A/global/hSecondsSumPt", "", kTH1D, {axisSeconds}); histos.add("A/global/hSecondsNumClsIts", "", kTH2D, {axisSeconds, axisNclsITS}); - histos.add("A/global/hSecondsChi2NClIts", "", kTH2D, {axisSeconds, axisChi2}); + histos.add("A/global/hSecondsChi2NClIts", "", kTH1D, {axisSeconds}); histos.add("A/global/hSecondsNumClsTpc", "", kTH2D, {axisSeconds, axisNclsTPC}); - histos.add("A/global/hSecondsChi2NClTpc", "", kTH2D, {axisSeconds, axisChi2}); - histos.add("A/global/hSecondsTpcFractionSharedClsnTPCclsCut70", "", kTH2D, {axisSeconds, axisFraction}); + histos.add("A/global/hSecondsChi2NClTpc", "", kTH1D, {axisSeconds}); + histos.add("A/global/hSecondsTpcFractionSharedCls", "", kTH2D, {axisSeconds, axisFraction}); + histos.add("A/global/hSecondsDeDx", "", kTH1D, {axisSeconds}); // global && PV tracks histos.add("A/globalPV/hSecondsNumPVcontributors", "", kTH1D, {axisSeconds}); histos.add("A/globalPV/hSecondsSumDcaR", "", kTH1D, {axisSeconds}); histos.add("A/globalPV/hSecondsSumDcaZ", "", kTH1D, {axisSeconds}); + histos.add("A/globalPV/hSecondsSumPt", "", kTH1D, {axisSeconds}); histos.add("A/globalPV/hSecondsNumClsIts", "", kTH2D, {axisSeconds, axisNclsITS}); - histos.add("A/globalPV/hSecondsChi2NClIts", "", kTH2D, {axisSeconds, axisChi2}); + histos.add("A/globalPV/hSecondsChi2NClIts", "", kTH1D, {axisSeconds}); histos.add("A/globalPV/hSecondsNumClsTpc", "", kTH2D, {axisSeconds, axisNclsTPC}); - histos.add("A/globalPV/hSecondsChi2NClTpc", "", kTH2D, {axisSeconds, axisChi2}); - histos.add("A/globalPV/hSecondsTpcFractionSharedClsnTPCclsCut70", "", kTH2D, {axisSeconds, axisFraction}); + histos.add("A/globalPV/hSecondsChi2NClTpc", "", kTH1D, {axisSeconds}); + histos.add("A/globalPV/hSecondsTpcFractionSharedCls", "", kTH2D, {axisSeconds, axisFraction}); + histos.add("A/globalPV/hSecondsDeDx", "", kTH1D, {axisSeconds}); // ### C side - histos.add("C/hSecondsTracks", "", kTH1D, {axisSeconds}); - histos.add("C/hSecondsQoverPtSumDcaR", "", kTH2D, {axisSeconds, axisSparseQoverPt}); - histos.add("C/hSecondsQoverPtSumDcaZ", "", kTH2D, {axisSeconds, axisSparseQoverPt}); - histos.add("C/hSecondsSumDcaR", "", kTH1D, {axisSeconds}); - histos.add("C/hSecondsSumDcaZ", "", kTH1D, {axisSeconds}); - // global tracks histos.add("C/global/hSecondsNumTracks", "", kTH1D, {axisSeconds}); + histos.add("C/global/hSecondsQoverPtSumDcaR", "", kTH2D, {axisSeconds, axisSparseQoverPt}); + histos.add("C/global/hSecondsQoverPtSumDcaZ", "", kTH2D, {axisSeconds, axisSparseQoverPt}); histos.add("C/global/hSecondsSumDcaR", "", kTH1D, {axisSeconds}); histos.add("C/global/hSecondsSumDcaZ", "", kTH1D, {axisSeconds}); + histos.add("C/global/hSecondsSumPt", "", kTH1D, {axisSeconds}); histos.add("C/global/hSecondsNumClsIts", "", kTH2D, {axisSeconds, axisNclsITS}); - histos.add("C/global/hSecondsChi2NClIts", "", kTH2D, {axisSeconds, axisChi2}); + histos.add("C/global/hSecondsChi2NClIts", "", kTH1D, {axisSeconds}); histos.add("C/global/hSecondsNumClsTpc", "", kTH2D, {axisSeconds, axisNclsTPC}); - histos.add("C/global/hSecondsChi2NClTpc", "", kTH2D, {axisSeconds, axisChi2}); - histos.add("C/global/hSecondsTpcFractionSharedClsnTPCclsCut70", "", kTH2D, {axisSeconds, axisFraction}); + histos.add("C/global/hSecondsChi2NClTpc", "", kTH1D, {axisSeconds}); + histos.add("C/global/hSecondsTpcFractionSharedCls", "", kTH2D, {axisSeconds, axisFraction}); + histos.add("C/global/hSecondsDeDx", "", kTH1D, {axisSeconds}); // global && PV tracks histos.add("C/globalPV/hSecondsNumPVcontributors", "", kTH1D, {axisSeconds}); histos.add("C/globalPV/hSecondsSumDcaR", "", kTH1D, {axisSeconds}); histos.add("C/globalPV/hSecondsSumDcaZ", "", kTH1D, {axisSeconds}); + histos.add("C/globalPV/hSecondsSumPt", "", kTH1D, {axisSeconds}); histos.add("C/globalPV/hSecondsNumClsIts", "", kTH2D, {axisSeconds, axisNclsITS}); - histos.add("C/globalPV/hSecondsChi2NClIts", "", kTH2D, {axisSeconds, axisChi2}); + histos.add("C/globalPV/hSecondsChi2NClIts", "", kTH1D, {axisSeconds}); histos.add("C/globalPV/hSecondsNumClsTpc", "", kTH2D, {axisSeconds, axisNclsTPC}); - histos.add("C/globalPV/hSecondsChi2NClTpc", "", kTH2D, {axisSeconds, axisChi2}); - histos.add("C/globalPV/hSecondsTpcFractionSharedClsnTPCclsCut70", "", kTH2D, {axisSeconds, axisFraction}); + histos.add("C/globalPV/hSecondsChi2NClTpc", "", kTH1D, {axisSeconds}); + histos.add("C/globalPV/hSecondsTpcFractionSharedCls", "", kTH2D, {axisSeconds, axisFraction}); + histos.add("C/globalPV/hSecondsDeDx", "", kTH1D, {axisSeconds}); // phi holes vs time - const AxisSpec axisPhi{64, 0, TMath::TwoPi(), "#varphi"}; // o2-linter: disable=external-pi + const AxisSpec axisPhi{64, 0, TMath::TwoPi(), "#varphi"}; // o2-linter: disable=external-pi (temporary fix) const AxisSpec axisEta{10, -0.8, 0.8, "#eta"}; if (confFillPhiVsTimeHist == 2) { histos.add("hSecondsITSlayer0vsPhi", "", kTH2F, {axisSeconds, axisPhi}); @@ -259,36 +322,69 @@ struct TimeDependentQaTask { histos.add("hSecondsITSglobalVsEtaPhi", "", kTH3F, {axisSeconds, axisEta, axisPhi}); } - // ### collision loop - for (const auto& col : cols) { - if (std::fabs(col.posZ()) > 10) - continue; - - auto bc = col.foundBC_as(); + // count TVX triggers per DF + for (const auto& bc : bcs) { + // auto bc = col.foundBC_as(); int64_t ts = bc.timestamp(); double secFromSOR = ts / 1000. - minSec; + if (bc.selection_bit(kIsTriggerTVX)) { + histos.fill(HIST("hSecondsBCsTVX"), secFromSOR); + } + // if (bc.selection_bit(kNoTimeFrameBorder)) { + // histos.fill(HIST("hSecondsBCsTFborder"), secFromSOR); + // } + if (bc.selection_bit(kIsTriggerTVX) && bc.selection_bit(kNoTimeFrameBorder)) { + histos.fill(HIST("hSecondsBCsTVXandTFborder"), secFromSOR); + } + } - // check if a vertex is found in the UPC mode ITS ROF, flags from: https://github.com/AliceO2Group/AliceO2/blob/dev/DataFormats/Reconstruction/include/ReconstructionDataFormats/Vertex.h + // ### collision loop + for (const auto& col : cols) { + // check if a vertex is found in the UPC mode ITS ROF + // flags from: https://github.com/AliceO2Group/AliceO2/blob/dev/DataFormats/Reconstruction/include/ReconstructionDataFormats/Vertex.h ushort flags = col.flags(); bool isVertexUPC = flags & dataformats::Vertex>::Flags::UPCMode; // is vertex with UPC settings - histos.fill(HIST("hSecondsUPCverticesBeforeSel8"), secFromSOR, isVertexUPC ? 1 : 0); - - if (confTakeVerticesWithUPCsettings > 0) { - if (confTakeVerticesWithUPCsettings == 1 && isVertexUPC) // reject vertices with UPC settings - return; + if (confTakeVerticesWithUPCsettings > 0) { // otherwise analyse all collisions + if (confTakeVerticesWithUPCsettings == 1 && isVertexUPC) // reject vertices with UPC settings + continue; if (confTakeVerticesWithUPCsettings == 2 && !isVertexUPC) // we want to select vertices with UPC settings --> reject vertices reconstructed with "normal" settings - return; + continue; // LOGP(info, "flags={} nTracks = {}", flags, tracks.size()); } + auto bc = col.foundBC_as(); + int64_t ts = bc.timestamp(); + double secFromSOR = ts / 1000. - minSec; + + histos.fill(HIST("hSecondsCollisionsBeforeAllCuts"), secFromSOR); + if (col.selection_bit(kIsTriggerTVX)) + histos.fill(HIST("hSecondsCollisionsNoVzInTVX"), secFromSOR); + if (col.selection_bit(kNoTimeFrameBorder)) + histos.fill(HIST("hSecondsCollisionsNoVzNoTFborder"), secFromSOR); + if (col.selection_bit(kIsTriggerTVX) && col.selection_bit(kNoTimeFrameBorder)) + histos.fill(HIST("hSecondsCollisionsNoVzInTVXandNoTFborder"), secFromSOR); + + if (std::fabs(col.posZ()) > 10) + continue; + + histos.fill(HIST("hSecondsUPCverticesBeforeSel8"), secFromSOR, isVertexUPC ? 1 : 0); + histos.fill(HIST("hSecondsEventSelBits"), secFromSOR, enCollisionsAll); histos.fill(HIST("hSecondsEventSelBits"), secFromSOR, enIsTriggerTVX, col.selection_bit(kIsTriggerTVX)); histos.fill(HIST("hSecondsEventSelBits"), secFromSOR, enNoTimeFrameBorder, col.selection_bit(kNoTimeFrameBorder)); histos.fill(HIST("hSecondsEventSelBits"), secFromSOR, enNoITSROFrameBorder, col.selection_bit(kNoITSROFrameBorder)); + // for QA: + uint64_t globalBC = bc.globalBC(); + int64_t bcInTF = (globalBC - bcSOR) % nBCsPerTF; + + histos.fill(HIST("hNcolVsBcInTF"), bcInTF); + if (!col.selection_bit(kNoTimeFrameBorder)) + histos.fill(HIST("hNcolVsBcInTFantiBorderCut"), bcInTF); + // sel8 selection: if (!col.sel8()) - return; + continue; histos.fill(HIST("hSecondsUPCvertices"), secFromSOR, isVertexUPC ? 1 : 0); histos.fill(HIST("hSecondsCollisions"), secFromSOR); @@ -319,22 +415,24 @@ struct TimeDependentQaTask { // occupancy selection combinations float occupByTracks = col.trackOccupancyInTimeRange(); + bool isLowOccupStd = col.selection_bit(kNoCollInTimeRangeStandard) && col.selection_bit(kNoCollInRofStandard); - bool isLowOccupStdAlsoInPrevRof = isLowOccupStd && col.selection_bit(kNoCollInRofStandard); histos.fill(HIST("hSecondsEventSelBits"), secFromSOR, enIsLowOccupStd, isLowOccupStd); + + bool isLowOccupStdAlsoInPrevRof = isLowOccupStd && col.selection_bit(kNoHighMultCollInPrevRof); histos.fill(HIST("hSecondsEventSelBits"), secFromSOR, enIsLowOccupStdAlsoInPrevRof, isLowOccupStdAlsoInPrevRof); - bool isLowOccupStdAndCut2000 = isLowOccupStd && occupByTracks >= 0 && occupByTracks < 2000; - bool isLowOccupStdAlsoInPrevRofAndCut2000 = isLowOccupStdAlsoInPrevRof && occupByTracks >= 0 && occupByTracks < 2000; - histos.fill(HIST("hSecondsEventSelBits"), secFromSOR, enIsLowOccupStdAndCut2000, isLowOccupStdAndCut2000); - histos.fill(HIST("hSecondsEventSelBits"), secFromSOR, enIsLowOccupStdAlsoInPrevRofAndCut2000, isLowOccupStdAlsoInPrevRofAndCut2000); + bool isLowOccupStdCut500 = isLowOccupStd && occupByTracks >= 0 && occupByTracks < 500; + histos.fill(HIST("hSecondsEventSelBits"), secFromSOR, enIsLowOccupStdCut500, isLowOccupStdCut500); + + bool isLowOccupStdCut2000 = isLowOccupStd && occupByTracks >= 0 && occupByTracks < 2000; + histos.fill(HIST("hSecondsEventSelBits"), secFromSOR, enIsLowOccupStdCut2000, isLowOccupStdCut2000); + + bool isLowOccupStdCut4000 = isLowOccupStd && occupByTracks >= 0 && occupByTracks < 4000; + histos.fill(HIST("hSecondsEventSelBits"), secFromSOR, enIsLowOccupStdCut4000, isLowOccupStdCut4000); - bool isLowOccupStdAndCut500 = isLowOccupStd && occupByTracks >= 0 && occupByTracks < 500; - bool isLowOccupStdAlsoInPrevRofAndCut500 = isLowOccupStdAlsoInPrevRof && occupByTracks >= 0 && occupByTracks < 500; - bool isLowOccupStdAlsoInPrevRofAndCut500noDeadStaves = isLowOccupStdAlsoInPrevRofAndCut500 && col.selection_bit(kIsGoodITSLayersAll); - histos.fill(HIST("hSecondsEventSelBits"), secFromSOR, enIsLowOccupStdAndCut500, isLowOccupStdAndCut500); - histos.fill(HIST("hSecondsEventSelBits"), secFromSOR, enIsLowOccupStdAlsoInPrevRofAndCut500, isLowOccupStdAlsoInPrevRofAndCut500); - histos.fill(HIST("hSecondsEventSelBits"), secFromSOR, enIsLowOccupStdAlsoInPrevRofAndCut500noDeadStaves, isLowOccupStdAlsoInPrevRofAndCut500noDeadStaves); + bool isLowOccupStdAlsoInPrevRofCut2000noDeadStaves = isLowOccupStdCut2000 && col.selection_bit(kNoHighMultCollInPrevRof) && col.selection_bit(kIsGoodITSLayersAll); + histos.fill(HIST("hSecondsEventSelBits"), secFromSOR, enIsLowOccupStdAlsoInPrevRofCut2000noDeadStaves, isLowOccupStdAlsoInPrevRofCut2000noDeadStaves); double hadronicRate = mRateFetcher.fetch(ccdb.service, ts, runNumber, "ZNC hadronic") * 1.e-3; // kHz histos.fill(HIST("hSecondsIR"), secFromSOR, hadronicRate); @@ -344,101 +442,141 @@ struct TimeDependentQaTask { mshape.setFromTree(*mShapeTree); bool isMshape = !mshape.getBoundaryPotential(ts).mPotential.empty(); + // ##### track loop for (const auto& track : tracks) { - if (!track.hasTPC() || !track.hasITS()) - continue; + // if (!track.hasTPC() || !track.hasITS()) + // continue; if (std::fabs(track.eta()) > 0.8 || std::fabs(track.pt()) < 0.2) continue; double dcaR = track.dcaXY(); double dcaZ = track.dcaZ(); LOGP(debug, "dcaR = {} dcaZ = {}", dcaR, dcaZ); - histos.fill(HIST("hDcaR"), dcaR); - histos.fill(HIST("hDcaZ"), dcaZ); + histos.fill(HIST("allTracks/hDcaR"), dcaR); + histos.fill(HIST("allTracks/hDcaZ"), dcaZ); // now DCA cuts: if (std::fabs(dcaR) > 1. || std::fabs(dcaZ) > 1.) continue; - histos.fill(HIST("hSecondsTracks"), secFromSOR); + histos.fill(HIST("allTracks/hSecondsTracks"), secFromSOR); + + histos.fill(HIST("allTracks/hDcaRafterCuts"), dcaR); + histos.fill(HIST("allTracks/hDcaZafterCuts"), dcaZ); double qpt = track.signed1Pt(); - histos.fill(HIST("hQoverPt"), qpt); - histos.fill(HIST("hQoverPtDcaR"), qpt, dcaR); - histos.fill(HIST("hQoverPtDcaZ"), qpt, dcaZ); + histos.fill(HIST("allTracks/hQoverPt"), qpt); + histos.fill(HIST("allTracks/hQoverPtDcaR"), qpt, dcaR); + histos.fill(HIST("allTracks/hQoverPtDcaZ"), qpt, dcaZ); // now consider only abs values for DCAs: - dcaR = std::fabs(dcaR); - dcaZ = std::fabs(dcaZ); - - histos.fill(HIST("hSecondsSumDcaR"), secFromSOR, dcaR); - histos.fill(HIST("hSecondsSumDcaZ"), secFromSOR, dcaZ); - histos.fill(HIST("hSecondsQoverPtSumDcaR"), secFromSOR, qpt, dcaR); - histos.fill(HIST("hSecondsQoverPtSumDcaZ"), secFromSOR, qpt, dcaZ); - - if (track.tgl() > 0.) { - histos.fill(HIST("A/hSecondsTracks"), secFromSOR); - histos.fill(HIST("A/hSecondsQoverPtSumDcaR"), secFromSOR, qpt, dcaR); - histos.fill(HIST("A/hSecondsQoverPtSumDcaZ"), secFromSOR, qpt, dcaZ); - histos.fill(HIST("A/hSecondsSumDcaR"), secFromSOR, dcaR); - histos.fill(HIST("A/hSecondsSumDcaZ"), secFromSOR, dcaZ); - - } else { - histos.fill(HIST("C/hSecondsTracks"), secFromSOR); - histos.fill(HIST("C/hSecondsQoverPtSumDcaR"), secFromSOR, qpt, dcaR); - histos.fill(HIST("C/hSecondsQoverPtSumDcaZ"), secFromSOR, qpt, dcaZ); - histos.fill(HIST("C/hSecondsSumDcaR"), secFromSOR, dcaR); - histos.fill(HIST("C/hSecondsSumDcaZ"), secFromSOR, dcaZ); - } + double dcaRabs = std::fabs(dcaR); + double dcaZabs = std::fabs(dcaZ); + + histos.fill(HIST("allTracks/hSecondsSumDcaR"), secFromSOR, dcaRabs); + histos.fill(HIST("allTracks/hSecondsSumDcaZ"), secFromSOR, dcaZabs); + histos.fill(HIST("allTracks/hSecondsSumPt"), secFromSOR, track.pt()); + histos.fill(HIST("allTracks/hSecondsQoverPtSumDcaR"), secFromSOR, qpt, dcaRabs); + histos.fill(HIST("allTracks/hSecondsQoverPtSumDcaZ"), secFromSOR, qpt, dcaZabs); + histos.fill(HIST("allTracks/hSecondsNumClsIts"), secFromSOR, track.itsNCls()); + histos.fill(HIST("allTracks/hSecondsChi2NClIts"), secFromSOR, track.itsChi2NCl()); if (isMshape) { - histos.fill(HIST("hSecondsTracksMshape"), secFromSOR); + histos.fill(HIST("allTracks/hSecondsTracksMshape"), secFromSOR); } - // global tracks + // ### PV contributors + if (track.isPVContributor()) { + histos.fill(HIST("PVcontrib/hDcaRafterCuts"), dcaR); + histos.fill(HIST("PVcontrib/hDcaZafterCuts"), dcaZ); + + histos.fill(HIST("PVcontrib/hSecondsTracks"), secFromSOR); + histos.fill(HIST("PVcontrib/hSecondsSumDcaR"), secFromSOR, dcaRabs); + histos.fill(HIST("PVcontrib/hSecondsSumDcaZ"), secFromSOR, dcaZabs); + histos.fill(HIST("PVcontrib/hSecondsSumPt"), secFromSOR, track.pt()); + // histos.fill(HIST("PVcontrib/hSecondsQoverPtSumDcaR"), secFromSOR, qpt, dcaRabs); + // histos.fill(HIST("PVcontrib/hSecondsQoverPtSumDcaZ"), secFromSOR, qpt, dcaZabs); + histos.fill(HIST("PVcontrib/hSecondsNumClsIts"), secFromSOR, track.itsNCls()); + histos.fill(HIST("PVcontrib/hSecondsChi2NClIts"), secFromSOR, track.itsChi2NCl()); + } + + // ### global tracks + float dedx = track.tpcSignal(); if (track.isGlobalTrack()) { // A side if (track.tgl() > 0.) { + histos.fill(HIST("A/global/hDcaRafterCuts"), dcaR); + histos.fill(HIST("A/global/hDcaZafterCuts"), dcaZ); + histos.fill(HIST("A/global/hSecondsNumTracks"), secFromSOR); - histos.fill(HIST("A/global/hSecondsSumDcaR"), secFromSOR, dcaR); - histos.fill(HIST("A/global/hSecondsSumDcaZ"), secFromSOR, dcaZ); + histos.fill(HIST("A/global/hSecondsQoverPtSumDcaR"), secFromSOR, qpt, dcaRabs); + histos.fill(HIST("A/global/hSecondsQoverPtSumDcaZ"), secFromSOR, qpt, dcaZabs); + histos.fill(HIST("A/global/hSecondsSumDcaR"), secFromSOR, dcaRabs); + histos.fill(HIST("A/global/hSecondsSumDcaZ"), secFromSOR, dcaZabs); + histos.fill(HIST("A/global/hSecondsSumPt"), secFromSOR, track.pt()); histos.fill(HIST("A/global/hSecondsNumClsIts"), secFromSOR, track.itsNCls()); histos.fill(HIST("A/global/hSecondsChi2NClIts"), secFromSOR, track.itsChi2NCl()); histos.fill(HIST("A/global/hSecondsNumClsTpc"), secFromSOR, track.tpcNClsFound()); histos.fill(HIST("A/global/hSecondsChi2NClTpc"), secFromSOR, track.tpcChi2NCl()); - if (track.tpcNClsFound() >= 70) - histos.fill(HIST("A/global/hSecondsTpcFractionSharedClsnTPCclsCut70"), secFromSOR, track.tpcFractionSharedCls()); + if (track.tpcNClsFound() >= confCutOnNtpcClsForSharedFractAndDeDxCalc) { + histos.fill(HIST("A/global/hSecondsTpcFractionSharedCls"), secFromSOR, track.tpcFractionSharedCls()); + if (dedx < 1.e4) // protection from weird values + histos.fill(HIST("A/global/hSecondsDeDx"), secFromSOR, dedx); + } if (track.isPVContributor()) { + histos.fill(HIST("A/globalPV/hDcaRafterCuts"), dcaR); + histos.fill(HIST("A/globalPV/hDcaZafterCuts"), dcaZ); + histos.fill(HIST("A/globalPV/hSecondsNumPVcontributors"), secFromSOR); - histos.fill(HIST("A/globalPV/hSecondsSumDcaR"), secFromSOR, dcaR); - histos.fill(HIST("A/globalPV/hSecondsSumDcaZ"), secFromSOR, dcaZ); + histos.fill(HIST("A/globalPV/hSecondsSumDcaR"), secFromSOR, dcaRabs); + histos.fill(HIST("A/globalPV/hSecondsSumDcaZ"), secFromSOR, dcaZabs); + histos.fill(HIST("A/globalPV/hSecondsSumPt"), secFromSOR, track.pt()); histos.fill(HIST("A/globalPV/hSecondsNumClsIts"), secFromSOR, track.itsNCls()); histos.fill(HIST("A/globalPV/hSecondsChi2NClIts"), secFromSOR, track.itsChi2NCl()); histos.fill(HIST("A/globalPV/hSecondsNumClsTpc"), secFromSOR, track.tpcNClsFound()); histos.fill(HIST("A/globalPV/hSecondsChi2NClTpc"), secFromSOR, track.tpcChi2NCl()); - if (track.tpcNClsFound() >= 70) - histos.fill(HIST("A/globalPV/hSecondsTpcFractionSharedClsnTPCclsCut70"), secFromSOR, track.tpcFractionSharedCls()); + if (track.tpcNClsFound() >= confCutOnNtpcClsForSharedFractAndDeDxCalc) { + histos.fill(HIST("A/globalPV/hSecondsTpcFractionSharedCls"), secFromSOR, track.tpcFractionSharedCls()); + if (dedx < 1.e4) // protection from weird values + histos.fill(HIST("A/globalPV/hSecondsDeDx"), secFromSOR, dedx); + } } } else { // C side + histos.fill(HIST("C/global/hDcaRafterCuts"), dcaR); + histos.fill(HIST("C/global/hDcaZafterCuts"), dcaZ); + histos.fill(HIST("C/global/hSecondsNumTracks"), secFromSOR); - histos.fill(HIST("C/global/hSecondsSumDcaR"), secFromSOR, dcaR); - histos.fill(HIST("C/global/hSecondsSumDcaZ"), secFromSOR, dcaZ); + histos.fill(HIST("C/global/hSecondsQoverPtSumDcaR"), secFromSOR, qpt, dcaRabs); + histos.fill(HIST("C/global/hSecondsQoverPtSumDcaZ"), secFromSOR, qpt, dcaZabs); + histos.fill(HIST("C/global/hSecondsSumDcaR"), secFromSOR, dcaRabs); + histos.fill(HIST("C/global/hSecondsSumDcaZ"), secFromSOR, dcaZabs); + histos.fill(HIST("C/global/hSecondsSumPt"), secFromSOR, track.pt()); histos.fill(HIST("C/global/hSecondsNumClsIts"), secFromSOR, track.itsNCls()); histos.fill(HIST("C/global/hSecondsChi2NClIts"), secFromSOR, track.itsChi2NCl()); histos.fill(HIST("C/global/hSecondsNumClsTpc"), secFromSOR, track.tpcNClsFound()); histos.fill(HIST("C/global/hSecondsChi2NClTpc"), secFromSOR, track.tpcChi2NCl()); - if (track.tpcNClsFound() >= 70) - histos.fill(HIST("C/global/hSecondsTpcFractionSharedClsnTPCclsCut70"), secFromSOR, track.tpcFractionSharedCls()); + if (track.tpcNClsFound() >= confCutOnNtpcClsForSharedFractAndDeDxCalc) { + histos.fill(HIST("C/global/hSecondsTpcFractionSharedCls"), secFromSOR, track.tpcFractionSharedCls()); + if (dedx < 1.e4) // protection from weird values + histos.fill(HIST("C/global/hSecondsDeDx"), secFromSOR, dedx); + } if (track.isPVContributor()) { + histos.fill(HIST("C/globalPV/hDcaRafterCuts"), dcaR); + histos.fill(HIST("C/globalPV/hDcaZafterCuts"), dcaZ); + histos.fill(HIST("C/globalPV/hSecondsNumPVcontributors"), secFromSOR); - histos.fill(HIST("C/globalPV/hSecondsSumDcaR"), secFromSOR, dcaR); - histos.fill(HIST("C/globalPV/hSecondsSumDcaZ"), secFromSOR, dcaZ); + histos.fill(HIST("C/globalPV/hSecondsSumDcaR"), secFromSOR, dcaRabs); + histos.fill(HIST("C/globalPV/hSecondsSumDcaZ"), secFromSOR, dcaZabs); + histos.fill(HIST("C/globalPV/hSecondsSumPt"), secFromSOR, track.pt()); histos.fill(HIST("C/globalPV/hSecondsNumClsIts"), secFromSOR, track.itsNCls()); histos.fill(HIST("C/globalPV/hSecondsChi2NClIts"), secFromSOR, track.itsChi2NCl()); histos.fill(HIST("C/globalPV/hSecondsNumClsTpc"), secFromSOR, track.tpcNClsFound()); histos.fill(HIST("C/globalPV/hSecondsChi2NClTpc"), secFromSOR, track.tpcChi2NCl()); - if (track.tpcNClsFound() >= 70) - histos.fill(HIST("C/globalPV/hSecondsTpcFractionSharedClsnTPCclsCut70"), secFromSOR, track.tpcFractionSharedCls()); + if (track.tpcNClsFound() >= confCutOnNtpcClsForSharedFractAndDeDxCalc) { + histos.fill(HIST("C/globalPV/hSecondsTpcFractionSharedCls"), secFromSOR, track.tpcFractionSharedCls()); + if (dedx < 1.e4) // protection from weird values + histos.fill(HIST("C/globalPV/hSecondsDeDx"), secFromSOR, dedx); + } } } } // end of global tracks @@ -481,6 +619,7 @@ struct TimeDependentQaTask { } } } // end of collision loop + PROCESS_SWITCH(TimeDependentQaTask, processRun3, "Process Run3 QA vs time", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 3502fc912334c7d6d20ae887573f7f954c19c28e Mon Sep 17 00:00:00 2001 From: jaimenorman Date: Fri, 14 Mar 2025 23:03:49 +0000 Subject: [PATCH 0683/1650] [PWGJE] fix double filling of histogram (#10467) --- PWGJE/Tasks/jetFinderQA.cxx | 1 - 1 file changed, 1 deletion(-) diff --git a/PWGJE/Tasks/jetFinderQA.cxx b/PWGJE/Tasks/jetFinderQA.cxx index a43b1cd3414..106ad4b4e1e 100644 --- a/PWGJE/Tasks/jetFinderQA.cxx +++ b/PWGJE/Tasks/jetFinderQA.cxx @@ -561,7 +561,6 @@ struct JetFinderQATask { registry.fill(HIST("h3_jet_r_jet_eta_tag_jet_eta_base_matchedgeo"), jetBase.r() / 100.0, jetTag.eta(), jetBase.eta(), weight); registry.fill(HIST("h3_jet_r_jet_phi_tag_jet_phi_base_matchedgeo"), jetBase.r() / 100.0, jetTag.phi(), jetBase.phi(), weight); registry.fill(HIST("h3_jet_r_jet_ntracks_tag_jet_ntracks_base_matchedgeo"), jetBase.r() / 100.0, jetTag.tracksIds().size(), jetBase.tracksIds().size(), weight); - registry.fill(HIST("h3_jet_r_jet_pt_tag_jet_pt_base_matchedgeo"), jetBase.r() / 100.0, jetTag.pt(), jetBase.pt(), weight); registry.fill(HIST("h3_jet_r_jet_pt_tag_jet_pt_base_diff_matchedgeo"), jetBase.r() / 100.0, jetTag.pt(), (jetTag.pt() - jetBase.pt()) / jetTag.pt(), weight); registry.fill(HIST("h3_jet_r_jet_pt_tag_jet_eta_base_diff_matchedgeo"), jetBase.r() / 100.0, jetTag.pt(), jetTag.eta() - jetBase.eta(), weight); registry.fill(HIST("h3_jet_r_jet_pt_tag_jet_phi_base_diff_matchedgeo"), jetBase.r() / 100.0, jetTag.pt(), jetTag.phi() - jetBase.phi(), weight); From 5e966fdc54cca85b8238b75b007ebdec35740dd6 Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Sat, 15 Mar 2025 00:05:20 +0100 Subject: [PATCH 0684/1650] [PWGLF,Tutorial] Resonance Framework - Separate index table for derived dataset (#10443) --- PWGLF/DataModel/LFResonanceTables.h | 30 ++-- .../Resonances/resonanceInitializer.cxx | 151 ++++++++++++------ .../Resonances/resonanceModuleInitializer.cxx | 53 ++++-- .../PWGLF/Resonance/resonancesCombine.cxx | 2 +- 4 files changed, 162 insertions(+), 74 deletions(-) diff --git a/PWGLF/DataModel/LFResonanceTables.h b/PWGLF/DataModel/LFResonanceTables.h index a026156e5be..6d0b909a695 100644 --- a/PWGLF/DataModel/LFResonanceTables.h +++ b/PWGLF/DataModel/LFResonanceTables.h @@ -76,7 +76,6 @@ DECLARE_SOA_COLUMN(ImpactParameter, impactParameter, float); //! ImpactParamete } // namespace resocollision DECLARE_SOA_TABLE(ResoCollisions, "AOD", "RESOCOLLISION", o2::soa::Index<>, - resocollision::CollisionId, o2::aod::mult::MultNTracksPV, collision::PosX, collision::PosY, @@ -85,6 +84,10 @@ DECLARE_SOA_TABLE(ResoCollisions, "AOD", "RESOCOLLISION", resocollision::BMagField); using ResoCollision = ResoCollisions::iterator; +DECLARE_SOA_TABLE(ResoCollisionColls, "AOD", "RESOCOLLISIONCOL", + resocollision::CollisionId); +using ResoCollisionColl = ResoCollisionColls::iterator; + DECLARE_SOA_TABLE(ResoMCCollisions, "AOD", "RESOMCCOLLISION", o2::soa::Index<>, resocollision::IsVtxIn10, @@ -97,13 +100,11 @@ using ResoMCCollision = ResoMCCollisions::iterator; DECLARE_SOA_TABLE(ResoSpheroCollisions, "AOD", "RESOSPHEROCOLLISION", o2::soa::Index<>, - resocollision::CollisionId, resocollision::Spherocity); using ResoSpheroCollision = ResoSpheroCollisions::iterator; DECLARE_SOA_TABLE(ResoEvtPlCollisions, "AOD", "RESOEVTPLCOLLISION", o2::soa::Index<>, - resocollision::CollisionId, resocollision::EvtPl, resocollision::EvtPlResAB, resocollision::EvtPlResAC, @@ -113,7 +114,6 @@ using ResoEvtPlCollision = ResoEvtPlCollisions::iterator; // For DF mixing study DECLARE_SOA_TABLE(ResoCollisionDFs, "AOD", "RESOCOLLISIONDF", o2::soa::Index<>, - // resocollision::CollisionId, o2::aod::mult::MultNTracksPV, collision::PosX, collision::PosY, @@ -476,7 +476,6 @@ DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, [](float px, float py) -> float { return Reco DECLARE_SOA_TABLE(ResoTracks, "AOD", "RESOTRACK", o2::soa::Index<>, resodaughter::ResoCollisionId, - resodaughter::TrackId, resodaughter::Pt, resodaughter::Px, resodaughter::Py, @@ -516,10 +515,13 @@ DECLARE_SOA_TABLE(ResoTracks, "AOD", "RESOTRACK", resodaughter::Sign); using ResoTrack = ResoTracks::iterator; +DECLARE_SOA_TABLE(ResoTrackTracks, "AOD", "RESOTRACKTRACK", + resodaughter::TrackId); +using ResoTrackTrack = ResoTrackTracks::iterator; + DECLARE_SOA_TABLE(ResoMicroTracks, "AOD", "RESOMICROTRACK", o2::soa::Index<>, resodaughter::ResoCollisionId, - resodaughter::TrackId, resodaughter::Px, resodaughter::Py, resodaughter::Pz, @@ -542,11 +544,14 @@ DECLARE_SOA_TABLE(ResoMicroTracks, "AOD", "RESOMICROTRACK", resodaughter::Sign); using ResoMicroTrack = ResoMicroTracks::iterator; +DECLARE_SOA_TABLE(ResoMicroTrackTracks, "AOD", "RESOMICROTRACKTRACK", + resodaughter::TrackId); +using ResoMicroTrackTrack = ResoMicroTrackTracks::iterator; + // For DF mixing study DECLARE_SOA_TABLE(ResoTrackDFs, "AOD", "RESOTRACKDF", o2::soa::Index<>, resodaughter::ResoCollisionDFId, - // resodaughter::TrackId, resodaughter::Pt, resodaughter::Px, resodaughter::Py, @@ -589,7 +594,6 @@ using ResoTrackDF = ResoTrackDFs::iterator; DECLARE_SOA_TABLE(ResoV0s, "AOD", "RESOV0", o2::soa::Index<>, resodaughter::ResoCollisionId, - resodaughter::V0Id, resodaughter::Pt, resodaughter::Px, resodaughter::Py, @@ -636,10 +640,13 @@ DECLARE_SOA_TABLE(ResoV0s, "AOD", "RESOV0", resodaughter::DaughterTOFNSigmaNegPr); using ResoV0 = ResoV0s::iterator; +DECLARE_SOA_TABLE(ResoV0V0s, "AOD", "RESOV0V0", + resodaughter::V0Id); +using ResoV0V0 = ResoV0V0s::iterator; + DECLARE_SOA_TABLE(ResoCascades, "AOD", "RESOCASCADE", o2::soa::Index<>, resodaughter::ResoCollisionId, - resodaughter::CascadeId, resodaughter::Pt, resodaughter::Px, resodaughter::Py, @@ -704,10 +711,13 @@ DECLARE_SOA_TABLE(ResoCascades, "AOD", "RESOCASCADE", resodaughter::DaughterTOFNSigmaBachPr); using ResoCascade = ResoCascades::iterator; +DECLARE_SOA_TABLE(ResoCascadeCascades, "AOD", "RESOCASCADECASCADE", + resodaughter::CascadeId); +using ResoCascadeCascade = ResoCascadeCascades::iterator; + DECLARE_SOA_TABLE(ResoCascadeDFs, "AOD", "RESOCASCADEDF", o2::soa::Index<>, resodaughter::ResoCollisionDFId, - // resodaughter::CascadeId, resodaughter::Pt, resodaughter::Px, resodaughter::Py, diff --git a/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx b/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx index baebb40c908..132fa09f3d2 100644 --- a/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx +++ b/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx @@ -58,13 +58,18 @@ struct ResonanceInitializer { Service pdg; Produces resoCollisions; + Produces resoCollisionColls; Produces resoMCCollisions; Produces resoSpheroCollisions; Produces resoEvtPlCollisions; Produces reso2trks; + Produces resoTrackTracks; Produces reso2microtrks; + Produces resoMicroTrackTracks; Produces reso2v0s; + Produces resoV0V0s; Produces reso2cascades; + Produces resoCascadeCascades; Produces reso2mctracks; Produces reso2mcparents; Produces reso2mcv0s; @@ -79,7 +84,9 @@ struct ResonanceInitializer { Configurable cfgFatalWhenNull{"cfgFatalWhenNull", true, "Fatal when null on ccdb access"}; Configurable cfgFillMicroTracks{"cfgFillMicroTracks", false, "Fill micro tracks"}; - Configurable cfgBypassTrackFill{"cfgBypassTrackFill", true, "Bypass track fill"}; + Configurable cfgBypassTrackFill{"cfgBypassTrackFill", false, "Bypass track fill"}; + Configurable cfgBypassCollIndexFill{"cfgBypassCollIndexFill", false, "Bypass collision index fill"}; + Configurable cfgBypassTrackIndexFill{"cfgBypassTrackIndexFill", false, "Bypass track index fill"}; // Configurables Configurable dBzInput{"dBzInput", -999, "bz field, -999 is automatic"}; @@ -656,7 +663,6 @@ struct ResonanceInitializer { (track.hasTOF() << 6) | ((track.sign() > 0) << 7); // sign +1: 1, -1: 0 reso2microtrks(resoCollisions.lastIndex(), - track.globalIndex(), track.px(), track.py(), track.pz(), @@ -665,6 +671,9 @@ struct ResonanceInitializer { static_cast(o2::aod::resodmciroaughter::PidNSigma(std::abs(track.tpcNSigmaPr()), std::abs(track.tofNSigmaPr()), track.hasTOF())), static_cast(trackSelFlag), trackFlags); + if (!cfgBypassTrackIndexFill) { + resoMicroTrackTracks(track.globalIndex()); + } } } // Filter for all tracks @@ -688,7 +697,6 @@ struct ResonanceInitializer { (track.hasTOF() << 6) | ((track.sign() > 0) << 7); // sign +1: 1, -1: 0 reso2trks(resoCollisions.lastIndex(), - track.globalIndex(), track.pt(), track.px(), track.py(), @@ -705,6 +713,9 @@ struct ResonanceInitializer { static_cast(std::round(track.tofNSigmaPr() * 10)), static_cast(std::round(track.tpcSignal() * 10)), trackFlags); + if (!cfgBypassTrackIndexFill) { + resoTrackTracks(track.globalIndex()); + } if constexpr (isMC) { fillMCTrack(track); } @@ -724,7 +735,6 @@ struct ResonanceInitializer { if (!filterV0(collision, v0)) continue; reso2v0s(resoCollisions.lastIndex(), - v0.globalIndex(), v0.pt(), v0.px(), v0.py(), @@ -751,6 +761,9 @@ struct ResonanceInitializer { v0.mAntiLambda(), v0.mK0Short(), v0.v0radius(), v0.x(), v0.y(), v0.z()); + if (!cfgBypassTrackIndexFill) { + resoV0V0s(v0.globalIndex()); + } if constexpr (isMC) { fillMCV0(v0); } @@ -771,7 +784,6 @@ struct ResonanceInitializer { if (!filterCasc(casc)) continue; reso2cascades(resoCollisions.lastIndex(), - casc.globalIndex(), casc.pt(), casc.px(), casc.py(), @@ -809,6 +821,9 @@ struct ResonanceInitializer { casc.mLambda(), casc.mXi(), casc.v0radius(), casc.cascradius(), casc.x(), casc.y(), casc.z()); + if (!cfgBypassTrackIndexFill) { + resoCascadeCascades(casc.globalIndex()); + } if constexpr (isMC) { fillMCCascade(casc); } @@ -1274,9 +1289,12 @@ struct ResonanceInitializer { return; colCuts.fillQA(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); - resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); - resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); + resoCollisions(0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); + if (!cfgBypassCollIndexFill) { + resoCollisionColls(collision.globalIndex()); + } + resoSpheroCollisions(computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(0, 0, 0, 0); fillTracks(collision, tracks); if (cfgFillMicroTracks) { @@ -1295,9 +1313,12 @@ struct ResonanceInitializer { return; colCuts.fillQARun2(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), collision.centRun2V0M(), dBz); - resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); - resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); + resoCollisions(0, collision.posX(), collision.posY(), collision.posZ(), collision.centRun2V0M(), dBz); + if (!cfgBypassCollIndexFill) { + resoCollisionColls(collision.globalIndex()); + } + resoSpheroCollisions(computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(0, 0, 0, 0); fillTracks(collision, tracks); if (cfgFillMicroTracks) { @@ -1317,9 +1338,12 @@ struct ResonanceInitializer { return; colCuts.fillQA(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); - resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); - resoEvtPlCollisions(collision.globalIndex(), getEvtPl(collision), getEvtPlRes(collision, evtPlDetId, evtPlRefAId), getEvtPlRes(collision, evtPlDetId, evtPlRefBId), getEvtPlRes(collision, evtPlRefAId, evtPlRefBId)); + resoCollisions(0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); + if (!cfgBypassCollIndexFill) { + resoCollisionColls(collision.globalIndex()); + } + resoSpheroCollisions(computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(getEvtPl(collision), getEvtPlRes(collision, evtPlDetId, evtPlRefAId), getEvtPlRes(collision, evtPlDetId, evtPlRefBId), getEvtPlRes(collision, evtPlRefAId, evtPlRefBId)); fillTracks(collision, tracks); if (cfgFillMicroTracks) { fillMicroTracks(collision, tracks); @@ -1339,9 +1363,12 @@ struct ResonanceInitializer { return; colCuts.fillQA(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); - resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); - resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); + resoCollisions(0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); + if (!cfgBypassCollIndexFill) { + resoCollisionColls(collision.globalIndex()); + } + resoSpheroCollisions(computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(0, 0, 0, 0); fillTracks(collision, tracks); if (cfgFillMicroTracks) { @@ -1362,9 +1389,12 @@ struct ResonanceInitializer { return; colCuts.fillQARun2(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), collision.centRun2V0M(), dBz); - resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); - resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); + resoCollisions(0, collision.posX(), collision.posY(), collision.posZ(), collision.centRun2V0M(), dBz); + if (!cfgBypassCollIndexFill) { + resoCollisionColls(collision.globalIndex()); + } + resoSpheroCollisions(computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(0, 0, 0, 0); fillTracks(collision, tracks); if (cfgFillMicroTracks) { @@ -1387,9 +1417,12 @@ struct ResonanceInitializer { return; colCuts.fillQA(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); - resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); - resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); + resoCollisions(0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); + if (!cfgBypassCollIndexFill) { + resoCollisionColls(collision.globalIndex()); + } + resoSpheroCollisions(computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(0, 0, 0, 0); fillTracks(collision, tracks); if (cfgFillMicroTracks) { fillMicroTracks(collision, tracks); @@ -1411,9 +1444,12 @@ struct ResonanceInitializer { return; colCuts.fillQARun2(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), collision.centRun2V0M(), dBz); - resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); - resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); + resoCollisions(0, collision.posX(), collision.posY(), collision.posZ(), collision.centRun2V0M(), dBz); + if (!cfgBypassCollIndexFill) { + resoCollisionColls(collision.globalIndex()); + } + resoSpheroCollisions(computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(0, 0, 0, 0); fillTracks(collision, tracks); if (cfgFillMicroTracks) { @@ -1433,9 +1469,12 @@ struct ResonanceInitializer { initCCDB(bc); colCuts.fillQA(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); - resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); - resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); + resoCollisions(0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); + if (!cfgBypassCollIndexFill) { + resoCollisionColls(collision.globalIndex()); + } + resoSpheroCollisions(computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(0, 0, 0, 0); auto mccollision = collision.mcCollision_as(); float impactpar = mccollision.impactParameter(); fillMCCollision(collision, mcParticles, impactpar); @@ -1460,9 +1499,12 @@ struct ResonanceInitializer { initCCDB(bc); colCuts.fillQA(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); - resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); - resoEvtPlCollisions(collision.globalIndex(), getEvtPl(collision), getEvtPlRes(collision, evtPlDetId, evtPlRefAId), getEvtPlRes(collision, evtPlDetId, evtPlRefBId), getEvtPlRes(collision, evtPlRefAId, evtPlRefBId)); + resoCollisions(0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); + if (!cfgBypassCollIndexFill) { + resoCollisionColls(collision.globalIndex()); + } + resoSpheroCollisions(computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(getEvtPl(collision), getEvtPlRes(collision, evtPlDetId, evtPlRefAId), getEvtPlRes(collision, evtPlDetId, evtPlRefBId), getEvtPlRes(collision, evtPlRefAId, evtPlRefBId)); fillMCCollision(collision, mcParticles); // Loop over tracks @@ -1484,9 +1526,12 @@ struct ResonanceInitializer { // auto bc = collision.bc_as(); colCuts.fillQARun2(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), collision.centRun2V0M(), dBz); - resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); - resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); + resoCollisions(0, collision.posX(), collision.posY(), collision.posZ(), collision.centRun2V0M(), dBz); + if (!cfgBypassCollIndexFill) { + resoCollisionColls(collision.globalIndex()); + } + resoSpheroCollisions(computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(0, 0, 0, 0); fillMCCollision(collision, mcParticles); // Loop over tracks @@ -1509,9 +1554,12 @@ struct ResonanceInitializer { initCCDB(bc); colCuts.fillQA(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); - resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); - resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); + resoCollisions(0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); + if (!cfgBypassCollIndexFill) { + resoCollisionColls(collision.globalIndex()); + } + resoSpheroCollisions(computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(0, 0, 0, 0); fillMCCollision(collision, mcParticles); // Loop over tracks @@ -1535,9 +1583,12 @@ struct ResonanceInitializer { // auto bc = collision.bc_as(); colCuts.fillQARun2(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), collision.centRun2V0M(), dBz); - resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); - resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); + resoCollisions(0, collision.posX(), collision.posY(), collision.posZ(), collision.centRun2V0M(), dBz); + if (!cfgBypassCollIndexFill) { + resoCollisionColls(collision.globalIndex()); + } + resoSpheroCollisions(computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(0, 0, 0, 0); fillMCCollision(collision, mcParticles); // Loop over tracks @@ -1563,9 +1614,12 @@ struct ResonanceInitializer { initCCDB(bc); colCuts.fillQA(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); - resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); - resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); + resoCollisions(0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); + if (!cfgBypassCollIndexFill) { + resoCollisionColls(collision.globalIndex()); + } + resoSpheroCollisions(computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(0, 0, 0, 0); fillMCCollision(collision, mcParticles); // Loop over tracks @@ -1591,9 +1645,12 @@ struct ResonanceInitializer { // auto bc = collision.bc_as(); colCuts.fillQARun2(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), collision.centRun2V0M(), dBz); - resoSpheroCollisions(collision.globalIndex(), computeSpherocity(tracks, trackSphMin, trackSphDef)); - resoEvtPlCollisions(collision.globalIndex(), 0, 0, 0, 0); + resoCollisions(0, collision.posX(), collision.posY(), collision.posZ(), collision.centRun2V0M(), dBz); + if (!cfgBypassCollIndexFill) { + resoCollisionColls(collision.globalIndex()); + } + resoSpheroCollisions(computeSpherocity(tracks, trackSphMin, trackSphDef)); + resoEvtPlCollisions(0, 0, 0, 0); fillMCCollision(collision, mcParticles); // Loop over tracks diff --git a/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx b/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx index cbbe3a4bd28..838a8c0a793 100644 --- a/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx +++ b/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx @@ -66,6 +66,7 @@ struct ResonanceModuleInitializer { EventPlaneHelper helperEP; ///< Helper for event plane calculations Produces resoCollisions; ///< Output table for resonance collisions + Produces resoCollisionColls; ///< Output table for collision references Produces resoMCCollisions; ///< Output table for MC resonance collisions Produces resoSpheroCollisions; ///< Output table for spherocity Produces resoEvtPlCollisions; ///< Output table for event plane @@ -78,6 +79,7 @@ struct ResonanceModuleInitializer { Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; Configurable cfgFatalWhenNull{"cfgFatalWhenNull", true, "Fatal when null on ccdb access"}; + Configurable cfgBypassCollIndexFill{"cfgBypassCollIndexFill", false, "Bypass collision index fill"}; // Configurables Configurable dBzInput{"dBzInput", -999, "bz field, -999 is automatic"}; @@ -532,7 +534,10 @@ struct ResonanceModuleInitializer { colCuts.fillQA(collision); centrality = centEst(collision); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centrality, dBz); + resoCollisions(0, collision.posX(), collision.posY(), collision.posZ(), centrality, dBz); + if (!cfgBypassCollIndexFill) { + resoCollisionColls(collision.globalIndex()); + } } PROCESS_SWITCH(ResonanceModuleInitializer, processRun3, "Default process for RUN3", false); @@ -552,7 +557,10 @@ struct ResonanceModuleInitializer { colCuts.fillQARun2(collision); centrality = collision.centRun2V0M(); - resoCollisions(collision.globalIndex(), 0, collision.posX(), collision.posY(), collision.posZ(), centrality, dBz); + resoCollisions(0, collision.posX(), collision.posY(), collision.posZ(), centrality, dBz); + if (!cfgBypassCollIndexFill) { + resoCollisionColls(collision.globalIndex()); + } } PROCESS_SWITCH(ResonanceModuleInitializer, processRun2, "process for RUN2", false); @@ -589,10 +597,10 @@ struct ResonanceModuleInitializer { * @param collision Collision data * @param tracks Track data */ - void processSpherocity(soa::Filtered::iterator const& collision, aod::ResoTrackCandidates const& tracks) + void processSpherocity(soa::Filtered::iterator const& /*collision*/, aod::ResoTrackCandidates const& tracks) { float spherocity = computeSpherocity(tracks, cfgTrackSphMin, cfgTrackSphDef); - resoSpheroCollisions(collision.globalIndex(), spherocity); + resoSpheroCollisions(spherocity); } PROCESS_SWITCH(ResonanceModuleInitializer, processSpherocity, "process Spherocity", false); @@ -604,7 +612,7 @@ struct ResonanceModuleInitializer { */ void processEventPlane(soa::Filtered>::iterator const& collision) { - resoEvtPlCollisions(collision.globalIndex(), getEvtPl(collision), getEvtPlRes(collision, evtPlDetId, evtPlRefAId), getEvtPlRes(collision, evtPlDetId, evtPlRefBId), getEvtPlRes(collision, evtPlRefAId, evtPlRefBId)); + resoEvtPlCollisions(getEvtPl(collision), getEvtPlRes(collision, evtPlDetId, evtPlRefAId), getEvtPlRes(collision, evtPlDetId, evtPlRefBId), getEvtPlRes(collision, evtPlRefAId, evtPlRefBId)); } PROCESS_SWITCH(ResonanceModuleInitializer, processEventPlane, "process Event Plane", false); }; @@ -617,18 +625,23 @@ struct ResonanceModuleInitializer { */ struct ResonanceDaughterInitializer { SliceCache cache; - Produces reso2trks; ///< Output table for resonance tracks - Produces reso2microtrks; ///< Output table for resonance microtracks - Produces reso2mctracks; ///< Output table for MC resonance tracks - Produces reso2v0s; ///< Output table for resonance V0s - Produces reso2mcv0s; ///< Output table for MC resonance V0s - Produces reso2cascades; ///< Output table for resonance cascades - Produces reso2mccascades; ///< Output table for MC resonance cascades + Produces reso2trks; ///< Output table for resonance tracks + Produces resoTrackTracks; ///< Output table for resonance track tracks + Produces reso2microtrks; ///< Output table for resonance microtracks + Produces resoMicroTrackTracks; ///< Output table for resonance microtrack tracks + Produces reso2mctracks; ///< Output table for MC resonance tracks + Produces reso2v0s; ///< Output table for resonance V0s + Produces resoV0V0s; ///< Output table for resonance V0-V0s + Produces reso2mcv0s; ///< Output table for MC resonance V0s + Produces reso2cascades; ///< Output table for resonance cascades + Produces resoCascadeCascades; ///< Output table for resonance cascade-cascades + Produces reso2mccascades; ///< Output table for MC resonance cascades // Configurables Configurable cfgFillQA{"cfgFillQA", false, "Fill QA histograms"}; Configurable cfgFillMicroTracks{"cfgFillMicroTracks", false, "Fill micro tracks"}; Configurable cfgBypassTrackFill{"cfgBypassTrackFill", true, "Bypass track fill"}; + Configurable cfgBypassTrackIndexFill{"cfgBypassTrackIndexFill", false, "Bypass track index fill"}; // Configurables for tracks Configurable cMaxDCArToPVcut{"cMaxDCArToPVcut", 2.0, "Track DCAr cut to PV Maximum"}; @@ -808,7 +821,6 @@ struct ResonanceDaughterInitializer { (track.hasTOF() << 6) | ((track.sign() > 0) << 7); // sign +1: 1, -1: 0 reso2microtrks(collision.globalIndex(), - track.globalIndex(), track.px(), track.py(), track.pz(), @@ -817,6 +829,9 @@ struct ResonanceDaughterInitializer { static_cast(o2::aod::resodmciroaughter::PidNSigma(std::abs(track.tpcNSigmaPr()), std::abs(track.tofNSigmaPr()), track.hasTOF())), static_cast(trackSelFlag), trackFlags); + if (!cfgBypassTrackIndexFill) { + resoMicroTrackTracks(track.globalIndex()); + } } } @@ -854,7 +869,6 @@ struct ResonanceDaughterInitializer { (track.hasTOF() << 6) | ((track.sign() > 0) << 7); // sign +1: 1, -1: 0 reso2trks(collision.globalIndex(), - track.globalIndex(), track.pt(), track.px(), track.py(), @@ -871,6 +885,9 @@ struct ResonanceDaughterInitializer { (int8_t)(track.tofNSigmaPr() * 10), (int8_t)(track.tpcSignal() * 10), trackFlags); + if (!cfgBypassTrackIndexFill) { + resoTrackTracks(track.globalIndex()); + } if constexpr (isMC) { fillMCTrack(track); } @@ -981,7 +998,6 @@ struct ResonanceDaughterInitializer { childIDs[0] = v0.posTrackId(); childIDs[1] = v0.negTrackId(); reso2v0s(collision.globalIndex(), - v0.globalIndex(), v0.pt(), v0.px(), v0.py(), @@ -1008,6 +1024,9 @@ struct ResonanceDaughterInitializer { v0.mAntiLambda(), v0.mK0Short(), v0.v0radius(), v0.x(), v0.y(), v0.z()); + if (!cfgBypassTrackIndexFill) { + resoV0V0s(v0.globalIndex()); + } if constexpr (isMC) { fillMCV0(v0); } @@ -1134,7 +1153,6 @@ struct ResonanceDaughterInitializer { childIDs[1] = casc.negTrackId(); childIDs[2] = casc.bachelorId(); reso2cascades(collision.globalIndex(), - casc.globalIndex(), casc.pt(), casc.px(), casc.py(), @@ -1172,6 +1190,9 @@ struct ResonanceDaughterInitializer { casc.mLambda(), casc.mXi(), casc.v0radius(), casc.cascradius(), casc.x(), casc.y(), casc.z()); + if (!cfgBypassTrackIndexFill) { + resoCascadeCascades(casc.globalIndex()); + } if constexpr (isMC) { fillMCCascade(casc); } diff --git a/Tutorials/PWGLF/Resonance/resonancesCombine.cxx b/Tutorials/PWGLF/Resonance/resonancesCombine.cxx index 0168c140c23..26a28661c6c 100644 --- a/Tutorials/PWGLF/Resonance/resonancesCombine.cxx +++ b/Tutorials/PWGLF/Resonance/resonancesCombine.cxx @@ -172,7 +172,7 @@ struct ResonanceCombine { } } - void process(soa::Join::iterator const& collision, soa::Join const& resotracks) + void process(soa::Join::iterator const& collision, soa::Join const& resotracks) { histos.fill(HIST("hVertexZ"), collision.posZ()); // Both resoCollisions and Qvectors have the same cent column, so we have to use "_as" to access it From 598a74cc9c70d1361effaeb30b011c006cfa1b9d Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Sat, 15 Mar 2025 00:16:04 +0100 Subject: [PATCH 0685/1650] [PWGLF] feat(DataModel): Add MotherDecayDaughters column to NPCascadeTable (#10492) --- PWGLF/DataModel/LFNonPromptCascadeTables.h | 10 +++++-- PWGLF/Tasks/Strangeness/nonPromptCascade.cxx | 29 ++++++++++++++++++-- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/PWGLF/DataModel/LFNonPromptCascadeTables.h b/PWGLF/DataModel/LFNonPromptCascadeTables.h index 288cd1778c3..1600ab0e733 100644 --- a/PWGLF/DataModel/LFNonPromptCascadeTables.h +++ b/PWGLF/DataModel/LFNonPromptCascadeTables.h @@ -103,6 +103,7 @@ DECLARE_SOA_COLUMN(DCAxMC, dcaXmc, float); DECLARE_SOA_COLUMN(DCAyMC, dcaYmc, float); DECLARE_SOA_COLUMN(DCAzMC, dcaZmc, float); DECLARE_SOA_COLUMN(MCcollisionMatch, mcCollisionMatch, bool); +DECLARE_SOA_COLUMN(MotherDecayDaughters, motherDecayDaughters, int8_t); } // namespace NPCascadeTable DECLARE_SOA_TABLE(NPCascTable, "AOD", "NPCASCTABLE", @@ -282,7 +283,8 @@ DECLARE_SOA_TABLE(NPCascTableMC, "AOD", "NPCASCTABLEMC", NPCascadeTable::DCAxMC, NPCascadeTable::DCAyMC, NPCascadeTable::DCAzMC, - NPCascadeTable::MCcollisionMatch) + NPCascadeTable::MCcollisionMatch, + NPCascadeTable::MotherDecayDaughters) DECLARE_SOA_TABLE(NPCascTableMCNT, "AOD", "NPCASCTABLEMCNT", NPCascadeTable::MatchingChi2, @@ -351,7 +353,8 @@ DECLARE_SOA_TABLE(NPCascTableMCNT, "AOD", "NPCASCTABLEMCNT", NPCascadeTable::DCAxMC, NPCascadeTable::DCAyMC, NPCascadeTable::DCAzMC, - NPCascadeTable::MCcollisionMatch) + NPCascadeTable::MCcollisionMatch, + NPCascadeTable::MotherDecayDaughters) DECLARE_SOA_TABLE(NPCascTableGen, "AOD", "NPCASCTABLEGen", NPCascadeTable::gPt, @@ -363,7 +366,8 @@ DECLARE_SOA_TABLE(NPCascTableGen, "AOD", "NPCASCTABLEGen", NPCascadeTable::DCAyMC, NPCascadeTable::DCAzMC, NPCascadeTable::IsFromBeauty, - NPCascadeTable::IsFromCharm) + NPCascadeTable::IsFromCharm, + NPCascadeTable::MotherDecayDaughters) } // namespace o2::aod diff --git a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx index 45770d24067..65f9f649afc 100644 --- a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx +++ b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx @@ -481,6 +481,18 @@ struct NonPromptCascadeTask { continue; } auto particle = mcParticles.iteratorAt(c.mcParticleId); + int motherDecayDaughters{0}; + if (c.isFromBeauty || c.isFromCharm) { + auto mom = particle.template mothers_as()[0]; + auto daughters = mom.template daughters_as(); + motherDecayDaughters = daughters.size(); + for (const auto& d : daughters) { + if (std::abs(d.pdgCode()) == 11 || std::abs(d.pdgCode()) == 13) { + motherDecayDaughters *= -1; + break; + } + } + } auto mcCollision = particle.template mcCollision_as(); auto recCollision = collisions.iteratorAt(c.collisionID); @@ -493,7 +505,7 @@ struct NonPromptCascadeTask { c.pionTPCNSigma, c.bachKaonTPCNSigma, c.bachPionTPCNSigma, c.protonHasTOF, c.pionHasTOF, c.bachHasTOF, c.protonTOFNSigma, c.pionTOFNSigma, c.bachKaonTOFNSigma, c.bachPionTOFNSigma, particle.pt(), particle.eta(), particle.phi(), particle.pdgCode(), mcCollision.posX() - particle.vx(), mcCollision.posY() - particle.vy(), - mcCollision.posZ() - particle.vz(), mcCollision.globalIndex() == recCollision.mcCollisionId()); + mcCollision.posZ() - particle.vz(), mcCollision.globalIndex() == recCollision.mcCollisionId(), motherDecayDaughters); } } @@ -547,7 +559,20 @@ struct NonPromptCascadeTask { int pdgCodeMom = p.has_mothers() ? p.template mothers_as()[0].pdgCode() : 0; auto mcCollision = p.template mcCollision_as(); - NPCTableGen(p.pt(), p.eta(), p.phi(), p.pdgCode(), pdgCodeMom, mcCollision.posX() - p.vx(), mcCollision.posY() - p.vy(), mcCollision.posZ() - p.vz(), fromHF[0], fromHF[1]); + int motherDecayDaughters{0}; + if (fromHF[0] || fromHF[1]) { + auto mom = p.template mothers_as()[0]; + auto daughters = mom.template daughters_as(); + motherDecayDaughters = daughters.size(); + for (const auto& d : daughters) { + if (std::abs(d.pdgCode()) == 11 || std::abs(d.pdgCode()) == 13) { + motherDecayDaughters *= -1; + break; + } + } + } + + NPCTableGen(p.pt(), p.eta(), p.phi(), p.pdgCode(), pdgCodeMom, mcCollision.posX() - p.vx(), mcCollision.posY() - p.vy(), mcCollision.posZ() - p.vz(), fromHF[0], fromHF[1], motherDecayDaughters); } } PROCESS_SWITCH(NonPromptCascadeTask, processGenParticles, "process gen cascades: MC analysis", false); From 1b01b868fc279d3ee5108b69bad0c57e62462896 Mon Sep 17 00:00:00 2001 From: Himanshu Sharma Date: Sat, 15 Mar 2025 00:40:09 +0100 Subject: [PATCH 0686/1650] [PWGHF] Add swapping info in XicToPKPi tree creator (#10497) --- PWGHF/TableProducer/candidateCreator3Prong.cxx | 3 +++ PWGHF/TableProducer/treeCreatorXicToPKPi.cxx | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/PWGHF/TableProducer/candidateCreator3Prong.cxx b/PWGHF/TableProducer/candidateCreator3Prong.cxx index 234ca475cbc..24d9496630c 100644 --- a/PWGHF/TableProducer/candidateCreator3Prong.cxx +++ b/PWGHF/TableProducer/candidateCreator3Prong.cxx @@ -999,6 +999,9 @@ struct HfCandidateCreator3ProngExpressions { } if (indexRec > -1) { flag = sign * (1 << DecayType::XicToPKPi); + if (arrayDaughters[0].has_mcParticle()) { + swapping = int8_t(std::abs(arrayDaughters[0].mcParticle().pdgCode()) == kPiPlus); + } } } diff --git a/PWGHF/TableProducer/treeCreatorXicToPKPi.cxx b/PWGHF/TableProducer/treeCreatorXicToPKPi.cxx index 2e1f8f45775..915cfba1bda 100644 --- a/PWGHF/TableProducer/treeCreatorXicToPKPi.cxx +++ b/PWGHF/TableProducer/treeCreatorXicToPKPi.cxx @@ -75,7 +75,7 @@ DECLARE_SOA_COLUMN(Ct, ct, float); DECLARE_SOA_COLUMN(FlagMc, flagMc, int8_t); DECLARE_SOA_COLUMN(OriginMcRec, originMcRec, int8_t); DECLARE_SOA_COLUMN(OriginMcGen, originMcGen, int8_t); -DECLARE_SOA_COLUMN(IsCandidateSwapped, isCandidateSwapped, int8_t); +DECLARE_SOA_COLUMN(IsCandidateSwapped, isCandidateSwapped, int); // Events DECLARE_SOA_COLUMN(IsEventReject, isEventReject, int); @@ -265,7 +265,7 @@ struct HfTreeCreatorXicToPKPi { { int8_t flagMc = 0; int8_t originMc = 0; - int8_t candSwapped = -1; + int candSwapped = 0; if constexpr (doMc) { flagMc = candidate.flagMcMatchRec(); originMc = candidate.originMcRec(); From c845124627f031d140c9d5ed6c34a6bb962193c5 Mon Sep 17 00:00:00 2001 From: Noor Koster <82090643+cnkoster@users.noreply.github.com> Date: Sat, 15 Mar 2025 01:04:30 +0100 Subject: [PATCH 0687/1650] [PWGCF] Update MC process functions (#10480) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/flowSP.cxx | 268 +++++++++++++++++++++++++++--------- 1 file changed, 204 insertions(+), 64 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowSP.cxx b/PWGCF/Flow/Tasks/flowSP.cxx index 32f1ca5691b..cf92af61d3f 100644 --- a/PWGCF/Flow/Tasks/flowSP.cxx +++ b/PWGCF/Flow/Tasks/flowSP.cxx @@ -27,6 +27,7 @@ #include "Framework/ASoAHelpers.h" #include "Framework/RunningWorkflowInfo.h" #include "Framework/HistogramRegistry.h" +#include "Framework/O2DatabasePDGPlugin.h" #include "Common/DataModel/EventSelection.h" #include "Common/Core/TrackSelection.h" @@ -84,6 +85,9 @@ struct FlowSP { // Additional event selections O2_DEFINE_CONFIGURABLE(cfgUseAdditionalEventCut, bool, true, "Bool to enable Additional Event Cut"); O2_DEFINE_CONFIGURABLE(cfgnSigmaMultCuts, int, 1, "Sigma cut on Additional event cut: 1 (default), 2 or 3 sigma available"); + O2_DEFINE_CONFIGURABLE(cfgManualEventParameters, bool, false, "Use manual event parameters for the pile up fits. Needed for Cent estimaters other than FT0C"); + O2_DEFINE_CONFIGURABLE(cfgMultPv, std::vector, {}, "Multiplicity cuts for PV first 5 parameters cutLOW last 5 cutHIGH"); + O2_DEFINE_CONFIGURABLE(cfgMult, std::vector, {}, "Multiplicity cuts for T0C first 5 parameters cutLOW last 5 cutHIGH"); O2_DEFINE_CONFIGURABLE(cfgMaxOccupancy, int, 10000, "Maximum occupancy of selected events"); O2_DEFINE_CONFIGURABLE(cfgNoSameBunchPileupCut, bool, true, "kNoSameBunchPileupCut"); O2_DEFINE_CONFIGURABLE(cfgIsGoodZvtxFT0vsPV, bool, true, "kIsGoodZvtxFT0vsPV"); @@ -92,7 +96,6 @@ struct FlowSP { O2_DEFINE_CONFIGURABLE(cfgTVXinTRD, bool, false, "Use kTVXinTRD (reject TRD triggered events)"); O2_DEFINE_CONFIGURABLE(cfgIsVertexITSTPC, bool, true, "Selects collisions with at least one ITS-TPC track"); O2_DEFINE_CONFIGURABLE(cfgIsGoodITSLayersAll, bool, true, "Cut time intervals with dead ITS staves"); - O2_DEFINE_CONFIGURABLE(cfgEvSelsMCReco, bool, true, "Apply event selections in MC Reco"); // harmonics for v coefficients O2_DEFINE_CONFIGURABLE(cfgHarm, int, 1, "Flow harmonic n for ux and uy: (Cos(n*phi), Sin(n*phi))"); O2_DEFINE_CONFIGURABLE(cfgHarmMixed, int, 2, "Flow harmonic n for ux and uy in mixed harmonics (MH): (Cos(n*phi), Sin(n*phi))"); @@ -123,11 +126,26 @@ struct FlowSP { Filter collisionFilter = nabs(aod::collision::posZ) < cfgVtxZ; Filter trackFilter = nabs(aod::track::eta) < cfgEta && aod::track::pt > cfgPtmin&& aod::track::pt < cfgPtmax && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && nabs(aod::track::dcaXY) < cfgDCAxy&& nabs(aod::track::dcaZ) < cfgDCAz; + Filter trackFilterMC = nabs(aod::mcparticle::eta) < cfgEta && aod::mcparticle::pt > cfgPtmin&& aod::mcparticle::pt < cfgPtmax; using UsedCollisions = soa::Filtered>; using UsedTracks = soa::Filtered>; + // For MC Reco and Gen + using CCs = soa::Filtered>; + using CC = CCs::iterator; + using TCs = soa::Join; + using FilteredTCs = soa::Filtered>; + using TC = TCs::iterator; + using MCs = soa::Filtered; + + Preslice partPerMcCollision = aod::mcparticle::mcCollisionId; + PresliceUnsorted colPerMcCollision = aod::mccollisionlabel::mcCollisionId; + PresliceUnsorted trackPerMcParticle = aod::mctracklabel::mcParticleId; + Preslice trackPerCollision = aod::track::collisionId; + // Connect to ccdb Service ccdb; + Service pdg; // struct to hold the correction histos/ struct Config { @@ -176,8 +194,12 @@ struct FlowSP { nEventSelections }; - enum TrackSelections { - trackSel_FilteredTracks, + enum TrackSelectionsUnFiltered { + trackSel_Eta, + trackSel_Pt, + trackSel_DCAxy, + trackSel_DCAz, + trackSel_GlobalTracks, trackSel_NCls, trackSel_FshCls, trackSel_TPCBoundary, @@ -225,15 +247,21 @@ struct FlowSP { fWeightsNEG->init(true, false); } - if ((doprocessData || doprocessMCReco)) { + if (doprocessData || doprocessMCReco || doprocessMCGen) { if (cfgFillQAHistos) { - registry.add("QA/after/hCent", "", {HistType::kTH1D, {axisCent}}); + registry.add("QA/after/hCentFT0C", " ; Cent FT0C (%); ", {HistType::kTH1D, {axisCent}}); + registry.add("QA/after/hCentFT0M", "; Cent FT0M (%); ", {HistType::kTH1D, {axisCent}}); + registry.add("QA/after/hCentFV0A", "; Cent FV0A (%); ", {HistType::kTH1D, {axisCent}}); + registry.add("QA/after/hCentNGlobal", "; Cent NGlobal (%); ", {HistType::kTH1D, {axisCent}}); + registry.add("QA/after/pt_phi", "", {HistType::kTH2D, {axisPt, axisPhiMod}}); registry.add("QA/after/hPt_inclusive", "", {HistType::kTH1D, {axisPt}}); registry.add("QA/after/hPt_positive", "", {HistType::kTH1D, {axisPt}}); registry.add("QA/after/hPt_negative", "", {HistType::kTH1D, {axisPt}}); registry.add("QA/after/globalTracks_centT0C", "", {HistType::kTH2D, {axisCent, axisNch}}); + registry.add("QA/after/globalTracks_centNGlobal", "", {HistType::kTH2D, {axisCent, axisNch}}); registry.add("QA/after/PVTracks_centT0C", "", {HistType::kTH2D, {axisCent, axisMultpv}}); + registry.add("QA/after/PVTracks_centNGlobal", "", {HistType::kTH2D, {axisCent, axisMultpv}}); registry.add("QA/after/globalTracks_PVTracks", "", {HistType::kTH2D, {axisMultpv, axisNch}}); registry.add("QA/after/globalTracks_multT0A", "", {HistType::kTH2D, {axisT0a, axisNch}}); registry.add("QA/after/globalTracks_multV0A", "", {HistType::kTH2D, {axisV0a, axisNch}}); @@ -245,19 +273,27 @@ struct FlowSP { registry.add("QA/after/CentFT0C_vs_CentFV0A", " ; Cent FT0C (%); Cent FV0A (%) ", {HistType::kTH2D, {axisCent, axisCent}}); registry.add("QA/after/CentFT0C_vs_CentNGlobal", " ; Cent FT0C (%); Cent NGlobal (%) ", {HistType::kTH2D, {axisCent, axisCent}}); - // track QA for pos, neg, incl - registry.add("incl/QA/hPt", "", kTH1D, {axisPt}); - registry.add("incl/QA/hPhi", "", kTH1D, {axisPhi}); - registry.add("incl/QA/hPhiCorrected", "", kTH1D, {axisPhi}); - registry.add("incl/QA/hEta", "", kTH1D, {axisEta}); - registry.add("incl/QA/hPhi_Eta_vz", "", kTH3D, {axisPhi, axisEta, axisVz}); - registry.add("incl/QA/hDCAxy_pt", "", kTH2D, {axisPt, axisDCAxy}); - registry.add("incl/QA/hDCAz_pt", "", kTH2D, {axisPt, axisDCAz}); - registry.add("incl/QA/hSharedClusters_pt", "", {HistType::kTH2D, {axisPt, axisShCl}}); - registry.add("incl/QA/hCrossedRows_pt", "", {HistType::kTH2D, {axisPt, axisCl}}); + if (doprocessData || doprocessMCReco) { + // track QA for pos, neg, incl + registry.add("incl/QA/hPt", "", kTH1D, {axisPt}); + registry.add("incl/QA/hPhi", "", kTH1D, {axisPhi}); + registry.add("incl/QA/hPhiCorrected", "", kTH1D, {axisPhi}); + registry.add("incl/QA/hEta", "", kTH1D, {axisEta}); + registry.add("incl/QA/hPhi_Eta_vz", "", kTH3D, {axisPhi, axisEta, axisVz}); + registry.add("incl/QA/hDCAxy_pt", "", kTH2D, {axisPt, axisDCAxy}); + registry.add("incl/QA/hDCAz_pt", "", kTH2D, {axisPt, axisDCAz}); + registry.add("incl/QA/hSharedClusters_pt", "", {HistType::kTH2D, {axisPt, axisShCl}}); + registry.add("incl/QA/hCrossedRows_pt", "", {HistType::kTH2D, {axisPt, axisCl}}); + } } if (doprocessMCReco) { + registry.add("trackMCReco/after/hIsPhysicalPrimary", "", {HistType::kTH1D, {{2, 0, 2}}}); + registry.add("trackMCReco/hTrackSize_unFiltered", "", {HistType::kTH1D, {{100, 0, 20000}}}); + registry.add("trackMCReco/hTrackSize_Filtered", "", {HistType::kTH1D, {{100, 0, 20000}}}); + registry.get(HIST("trackMCReco/after/hIsPhysicalPrimary"))->GetXaxis()->SetBinLabel(1, "Secondary"); + registry.get(HIST("trackMCReco/after/hIsPhysicalPrimary"))->GetXaxis()->SetBinLabel(2, "Primary"); + registry.add("trackMCReco/after/hPt_inclusive", "", {HistType::kTH1D, {axisPt}}); registry.add("trackMCReco/after/hPt_positive", "", {HistType::kTH1D, {axisPt}}); registry.add("trackMCReco/after/hPt_negative", "", {HistType::kTH1D, {axisPt}}); @@ -366,9 +402,14 @@ struct FlowSP { registry.addClone("incl/", "pos/"); registry.addClone("incl/", "neg/"); } - } else if (doprocessMCGen) { - registry.add("trackMCGen/before/pt_gen_incl", "", {HistType::kTH1D, {axisPt}}); - registry.add("trackMCGen/before/phi_eta_vtxZ_gen", "", {HistType::kTH3D, {axisPhi, axisEta, axisVz}}); + } + + if (doprocessMCGen) { + registry.add("trackMCGen/nCollReconstructedPerMcCollision", "", {HistType::kTH1D, {{10, -5, 5}}}); + registry.add("trackMCGen/before/incl/pt_gen", "", {HistType::kTH1D, {axisPt}}); + registry.add("trackMCGen/before/incl/phi_eta_vtxZ_gen", "", {HistType::kTH3D, {axisPhi, axisEta, axisVz}}); + registry.addClone("trackMCGen/before/incl/", "trackMCGen/before/pos/"); + registry.addClone("trackMCGen/before/incl/", "trackMCGen/before/neg/"); registry.addClone("trackMCGen/before/", "trackMCGen/after/"); } @@ -387,7 +428,11 @@ struct FlowSP { registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_isSelectedZDC + 1, "isSelected"); registry.add("hTrackCount", "Number of Tracks; Cut; #Tracks Passed Cut", {HistType::kTH1D, {{nTrackSelections, 0, nTrackSelections}}}); - registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_FilteredTracks + 1, "Filtered Track"); + registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_Eta + 1, "Eta"); + registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_Pt + 1, "Pt"); + registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_DCAxy + 1, "DCAxy"); + registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_DCAz + 1, "DCAz"); + registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_GlobalTracks + 1, "GlobalTracks"); registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_NCls + 1, "nClusters TPC"); registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_FshCls + 1, "Frac. sh. Cls TPC"); registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_TPCBoundary + 1, "TPC Boundary"); @@ -425,6 +470,13 @@ struct FlowSP { fMultCutHigh->SetParameters(2610.98, -83.3983, 1.0893, -0.00735094, 2.26929e-05); } + if (cfgManualEventParameters) { + fMultPVCutLow->SetParameters((cfgMultPv.value)[0], (cfgMultPv.value)[1], (cfgMultPv.value)[2], (cfgMultPv.value)[3], (cfgMultPv.value)[4]); + fMultPVCutHigh->SetParameters((cfgMultPv.value)[5], (cfgMultPv.value)[6], (cfgMultPv.value)[7], (cfgMultPv.value)[8], (cfgMultPv.value)[9]); + fMultCutLow->SetParameters((cfgMult.value)[0], (cfgMult.value)[1], (cfgMult.value)[2], (cfgMult.value)[3], (cfgMult.value)[4]); + fMultCutHigh->SetParameters((cfgMult.value)[5], (cfgMult.value)[6], (cfgMult.value)[7], (cfgMult.value)[8], (cfgMult.value)[9]); + } + if (cfgUseAdditionalTrackCut) { fPhiCutLow = new TF1("fPhiCutLow", "0.06/x+pi/18.0-0.06", 0, 100); fPhiCutHigh = new TF1("fPhiCutHigh", "0.1/x+pi/18.0+0.06", 0, 100); @@ -574,13 +626,13 @@ struct FlowSP { if (vtxz > 10 || vtxz < -10) return 0; - if (multNTracksPV < fMultPVCutLow->Eval(centrality)) + if (multNTracksPV < fMultPVCutLow->Eval(collision.centFT0C())) return 0; - if (multNTracksPV > fMultPVCutHigh->Eval(centrality)) + if (multNTracksPV > fMultPVCutHigh->Eval(collision.centFT0C())) return 0; - if (multTrk < fMultCutLow->Eval(centrality)) + if (multTrk < fMultCutLow->Eval(collision.centFT0C())) return 0; - if (multTrk > fMultCutHigh->Eval(centrality)) + if (multTrk > fMultCutHigh->Eval(collision.centFT0C())) return 0; registry.fill(HIST("hEventCount"), evSel_MultCuts); @@ -605,6 +657,26 @@ struct FlowSP { template bool trackSelected(TrackObject track, const int& field) { + if (std::fabs(track.eta()) < cfgEta) + return false; + registry.fill(HIST("hTrackCount"), trackSel_Eta); + + if (track.pt() < cfgPtmin || track.pt() > cfgPtmax) + return false; + + registry.fill(HIST("hTrackCount"), trackSel_Pt); + + if (track.dcaXY() > cfgDCAxy) + return false; + + registry.fill(HIST("hTrackCount"), trackSel_DCAxy); + + if (track.dcaZ() > cfgDCAz) + return false; + + registry.fill(HIST("hTrackCount"), trackSel_DCAz); + + // registry.fill(HIST("hTrackCount"), trackSel_GlobalTracks); if (track.tpcNClsFound() < cfgNcls) return false; @@ -642,7 +714,10 @@ struct FlowSP { { static constexpr std::string_view Time[] = {"before", "after"}; - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hCent"), collision.centFT0C()); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hCentFT0C"), collision.centFT0C()); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hCentNGlobal"), collision.centNGlobal()); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hCentFT0M"), collision.centFT0M()); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hCentFV0A"), collision.centFV0A()); registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/globalTracks_centT0C"), collision.centFT0C(), tracks.size()); registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/PVTracks_centT0C"), collision.centFT0C(), collision.multNTracksPV()); registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/globalTracks_PVTracks"), collision.multNTracksPV(), tracks.size()); @@ -872,7 +947,7 @@ struct FlowSP { if (cfgFillQAHistos) registry.fill(HIST("QA/before/hPt_inclusive"), track.pt()); - registry.fill(HIST("hTrackCount"), trackSel_FilteredTracks); + // registry.fill(HIST("hTrackCount"), trackSel_FilteredTracks); float weff = 1., wacc = 1.; float weffP = 1., waccP = 1.; @@ -945,7 +1020,7 @@ struct FlowSP { } PROCESS_SWITCH(FlowSP, processData, "Process analysis for non-derived data", true); - void processMCReco(soa::Filtered>::iterator const& collision, aod::BCsWithTimestamps const&, soa::Filtered> const& tracks, aod::McParticles const&) + void processMCReco(CC const& collision, aod::BCsWithTimestamps const&, TCs const& tracks, FilteredTCs const& filteredTracks, aod::McParticles const&) { auto bc = collision.template bc_as(); auto field = (cfgMagField == 99999) ? getMagneticField(bc.timestamp()) : cfgMagField; @@ -964,21 +1039,23 @@ struct FlowSP { if (cfgFillQAHistos) fillEventQA(collision, tracks); - if (cfgEvSelsMCReco && !eventSelected(collision, tracks.size(), centrality)) + if (!eventSelected(collision, filteredTracks.size(), centrality)) return; + if (!collision.has_mcCollision()) { + LOGF(info, "No mccollision found for this collision"); + return; + } + if (cfgFillQAHistos) fillEventQA(collision, tracks); - for (const auto& track : tracks) { + // LOGF(info, "Size of tracks: %i", tracks.size()); + registry.fill(HIST("trackMCReco/hTrackSize_unFiltered"), tracks.size()); + registry.fill(HIST("trackMCReco/hTrackSize_Filtered"), filteredTracks.size()); + for (const auto& track : filteredTracks) { auto mcParticle = track.mcParticle(); - if (!mcParticle.isPhysicalPrimary()) - continue; - - if (mcParticle.eta() < -cfgEta || mcParticle.eta() > cfgEta || mcParticle.pt() < cfgPtmin || mcParticle.pt() > cfgPtmax || track.tpcNClsFound() < cfgNcls) - continue; - if (track.sign() == 0.0) continue; bool pos = (track.sign() > 0) ? true : false; @@ -990,6 +1067,13 @@ struct FlowSP { registry.fill(HIST("trackMCReco/before/hPt_negative"), track.pt()); } + if (!mcParticle.isPhysicalPrimary()) { + registry.fill(HIST("trackMCReco/before/hIsPhysicalPrimary"), 0); + continue; + } else { + registry.fill(HIST("trackMCReco/before/hIsPhysicalPrimary"), 1); + } + if (!trackSelected(track, field)) continue; @@ -1007,44 +1091,100 @@ struct FlowSP { } PROCESS_SWITCH(FlowSP, processMCReco, "Process analysis for MC reconstructed events", false); - Filter mcCollFilter = nabs(aod::mccollision::posZ) < cfgVtxZ; - void processMCGen(soa::Filtered::iterator const& mcCollision, soa::SmallGroups> const& collisions, aod::McParticles const& particles) + // Filter mcCollFilter = nabs(aod::mccollision::posZ) < cfgVtxZ; + void processMCGen(aod::McCollisions const& mcCollisions, CCs const& collisions, TCs const& tracks, FilteredTCs const& filteredTracks, MCs const& McParts) { - if (collisions.size() != 1) { // check if MC collision is only reconstructed once! (https://indico.cern.ch/event/1425820/contributions/6170879/attachments/2947721/5180548/DDChinellato-O2AT4-HandsOn-03a.pdf) - return; - } - float centrality = -1; - for (const auto& collision : collisions) { - centrality = collision.centFT0C(); - if (cfgFT0Cvariant1) - centrality = collision.centFT0CVariant1(); - if (cfgFT0M) - centrality = collision.centFT0M(); - if (cfgFV0A) - centrality = collision.centFV0A(); - if (cfgNGlobal) - centrality = collision.centNGlobal(); - } + // LOGF(info, "Size of mccollisions: %i", mcCollisions.size()); - if (particles.size() < 1) - return; - if (centrality < cfgCentMin || centrality > cfgCentMax) - return; + for (const auto& mcCollision : mcCollisions) { + float centrality = -1; + bool colSelected = true; - float vtxz = mcCollision.posZ(); + // get McParticles which belong to mccollision + auto partSlice = McParts.sliceBy(partPerMcCollision, mcCollision.globalIndex()); - for (const auto& particle : particles) { - if (!particle.isPhysicalPrimary()) + // get reconstructed collision which belongs to mccollision + auto colSlice = collisions.sliceBy(colPerMcCollision, mcCollision.globalIndex()); + registry.fill(HIST("trackMCGen/nCollReconstructedPerMcCollision"), colSlice.size()); + if (colSlice.size() != 1) { // check if MC collision is only reconstructed once! (https://indico.cern.ch/event/1425820/contributions/6170879/attachments/2947721/5180548/DDChinellato-O2AT4-HandsOn-03a.pdf) continue; + } + + for (const auto& col : colSlice) { + // get tracks that belong to reconstructed collision + auto trackSlice = tracks.sliceBy(trackPerCollision, col.globalIndex()); + + auto filteredTrackSlice = filteredTracks.sliceBy(trackPerCollision, col.globalIndex()); + + centrality = col.centFT0C(); + if (cfgFT0Cvariant1) + centrality = col.centFT0CVariant1(); + if (cfgFT0M) + centrality = col.centFT0M(); + if (cfgFV0A) + centrality = col.centFV0A(); + if (cfgNGlobal) + centrality = col.centNGlobal(); + fillEventQA(col, trackSlice); + if (trackSlice.size() < 1) { + colSelected = false; + continue; + } + if (!eventSelected(col, filteredTrackSlice.size(), centrality)) { + colSelected = false; + continue; + } + fillEventQA(col, trackSlice); + + if (!colSelected) + continue; - registry.fill(HIST("trackMCGen/before/pt_gen_incl"), particle.pt()); - registry.fill(HIST("trackMCGen/before/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); + float vtxz = mcCollision.posZ(); - if (particle.eta() < -cfgEta || particle.eta() > cfgEta || particle.pt() < cfgPtmin || particle.pt() > cfgPtmax) - continue; + for (const auto& particle : partSlice) { + if (!particle.isPhysicalPrimary()) + continue; - registry.fill(HIST("trackMCGen/after/pt_gen_incl"), particle.pt()); - registry.fill(HIST("trackMCGen/after/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); + int charge = 0; + ; + + auto pdgCode = particle.pdgCode(); + auto pdgInfo = pdg->GetParticle(pdgCode); + if (pdgInfo != nullptr) { + charge = pdgInfo->Charge(); + } + + if (std::fabs(charge) < 1) + continue; + + bool pos = (charge > 0) ? true : false; + + registry.fill(HIST("trackMCGen/before/incl/pt_gen"), particle.pt()); + registry.fill(HIST("trackMCGen/before/incl/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); + + if (pos) { + registry.fill(HIST("trackMCGen/before/pos/pt_gen"), particle.pt()); + registry.fill(HIST("trackMCGen/before/pos/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); + } else { + registry.fill(HIST("trackMCGen/before/neg/pt_gen"), particle.pt()); + registry.fill(HIST("trackMCGen/before/neg/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); + } + + if (particle.eta() < -cfgEta || particle.eta() > cfgEta || particle.pt() < cfgPtmin || particle.pt() > cfgPtmax) + continue; + + registry.fill(HIST("trackMCGen/after/incl/pt_gen"), particle.pt()); + registry.fill(HIST("trackMCGen/after/incl/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); + + if (pos) { + registry.fill(HIST("trackMCGen/after/pos/pt_gen"), particle.pt()); + registry.fill(HIST("trackMCGen/after/pos/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); + } else { + registry.fill(HIST("trackMCGen/after/neg/pt_gen"), particle.pt()); + registry.fill(HIST("trackMCGen/after/neg/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); + } + } + } } } PROCESS_SWITCH(FlowSP, processMCGen, "Process analysis for MC generated events", false); From 7e1765827f376ee7fa57180a5f5e83625e1654f1 Mon Sep 17 00:00:00 2001 From: Ravindra Singh <56298081+1994ra@users.noreply.github.com> Date: Sat, 15 Mar 2025 01:19:55 +0100 Subject: [PATCH 0688/1650] [PWGHF] Fix bug for yCandGenMax in correlatorLcHadrons (#10506) --- PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx b/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx index 00d10d40b20..fcd40d29e2f 100644 --- a/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx @@ -775,7 +775,7 @@ struct HfCorrelatorLcHadrons { continue; } double yL = RecoDecay::y(particle.pVector(), MassLambdaCPlus); - if (std::abs(yL) > yCandMax || particle.pt() < ptCandMin) { + if (std::abs(yL) > yCandGenMax || particle.pt() < ptCandMin) { continue; } registry.fill(HIST("hLcBin"), poolBin); From 43449f496b0176609dbc5013edae3f324902cb42 Mon Sep 17 00:00:00 2001 From: Swati <69241911+SwatiSaha-1997@users.noreply.github.com> Date: Sat, 15 Mar 2025 06:37:39 +0530 Subject: [PATCH 0689/1650] [PWGCF] Antiproton cumulants (#10504) --- PWGCF/EbyEFluctuations/Tasks/CMakeLists.txt | 5 + .../Tasks/antiprotonCumulantsMc.cxx | 2936 +++++++++++++++++ 2 files changed, 2941 insertions(+) create mode 100644 PWGCF/EbyEFluctuations/Tasks/antiprotonCumulantsMc.cxx diff --git a/PWGCF/EbyEFluctuations/Tasks/CMakeLists.txt b/PWGCF/EbyEFluctuations/Tasks/CMakeLists.txt index a55aa34e61c..1dd4e544331 100644 --- a/PWGCF/EbyEFluctuations/Tasks/CMakeLists.txt +++ b/PWGCF/EbyEFluctuations/Tasks/CMakeLists.txt @@ -29,6 +29,11 @@ o2physics_add_dpl_workflow(netproton-cumulants-mc PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(antiproton-cumulants-mc + SOURCES antiprotonCumulantsMc.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(identified-meanpt-fluctuations SOURCES IdentifiedMeanPtFluctuations.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore diff --git a/PWGCF/EbyEFluctuations/Tasks/antiprotonCumulantsMc.cxx b/PWGCF/EbyEFluctuations/Tasks/antiprotonCumulantsMc.cxx new file mode 100644 index 00000000000..918f794fb65 --- /dev/null +++ b/PWGCF/EbyEFluctuations/Tasks/antiprotonCumulantsMc.cxx @@ -0,0 +1,2936 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file antiprotonCumulantsMc.cxx +/// \brief Task for analyzing efficiency of proton, and net-proton distributions in MC reconstructed and generated, and calculating net-proton cumulants +/// \author Swati Saha + +#include +#include +#include +#include +#include +#include +#include "Framework/AnalysisTask.h" +#include "Framework/runDataProcessing.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/RunningWorkflowInfo.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/StepTHn.h" +#include "ReconstructionDataFormats/Track.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/Core/TrackSelection.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/PIDResponseITS.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/Core/trackUtilities.h" +#include "CommonConstants/PhysicsConstants.h" +#include "Framework/O2DatabasePDGPlugin.h" +#include "DataFormatsParameters/GRPObject.h" +#include "DataFormatsParameters/GRPMagField.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +struct AntiprotonCumulantsMc { + // events + Configurable cfgCutVertex{"cfgCutVertex", 10.0f, "Accepted z-vertex range"}; + // MC + Configurable cfgIsMC{"cfgIsMC", true, "Run MC"}; + // tracks + Configurable cfgCutPtLower{"cfgCutPtLower", 0.2f, "Lower pT cut"}; + Configurable cfgCutPtUpper{"cfgCutPtUpper", 3.0f, "Higher pT cut"}; + Configurable cfgCutEta{"cfgCutEta", 0.8f, "absolute Eta cut"}; + Configurable cfgPIDchoice{"cfgPIDchoice", 1, "PID selection fucntion choice"}; + Configurable cfgCutPtUpperTPC{"cfgCutPtUpperTPC", 0.6f, "Upper pT cut for PID using TPC only"}; + Configurable cfgnSigmaCutTPC{"cfgnSigmaCutTPC", 2.0f, "PID nSigma cut for TPC"}; + Configurable cfgnSigmaCutTOF{"cfgnSigmaCutTOF", 2.0f, "PID nSigma cut for TOF"}; + Configurable cfgnSigmaCutCombTPCTOF{"cfgnSigmaCutCombTPCTOF", 2.0f, "PID nSigma combined cut for TPC and TOF"}; + Configurable cfgCutTpcChi2NCl{"cfgCutTpcChi2NCl", 2.5f, "Maximum TPCchi2NCl"}; + Configurable cfgCutItsChi2NCl{"cfgCutItsChi2NCl", 36.0f, "Maximum ITSchi2NCl"}; + Configurable cfgCutDCAxy{"cfgCutDCAxy", 2.0f, "DCAxy range for tracks"}; + Configurable cfgCutDCAz{"cfgCutDCAz", 2.0f, "DCAz range for tracks"}; + Configurable cfgITScluster{"cfgITScluster", 1, "Minimum Number of ITS cluster"}; + Configurable cfgTPCcluster{"cfgTPCcluster", 80, "Minimum Number of TPC cluster"}; + Configurable cfgTPCnCrossedRows{"cfgTPCnCrossedRows", 70, "Minimum Number of TPC crossed-rows"}; + Configurable cfgUseItsPid{"cfgUseItsPid", true, "Use ITS nSigma Cut"}; + + // Calculation of cumulants central/error + Configurable cfgNSubsample{"cfgNSubsample", 10, "Number of subsamples for ERR"}; + Configurable cfgIsCalculateCentral{"cfgIsCalculateCentral", true, "Calculate Central value"}; + Configurable cfgIsCalculateError{"cfgIsCalculateError", false, "Calculate Error"}; + + // Efficiencies + Configurable> cfgPtBins{"cfgPtBins", {0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0}, "Pt Bins for Efficiency of protons"}; + Configurable> cfgProtonEff{"cfgProtonEff", {0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9}, "Efficiency of protons"}; + Configurable> cfgAntiprotonEff{"cfgAntiprotonEff", {0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9}, "Efficiency of anti-protons"}; + + Configurable cfgLoadEff{"cfgLoadEff", true, "Load efficiency from file"}; + Configurable cfgEvSelkNoSameBunchPileup{"cfgEvSelkNoSameBunchPileup", true, "Pileup removal"}; + Configurable cfgUseGoodITSLayerAllCut{"cfgUseGoodITSLayerAllCut", true, "Remove time interval with dead ITS zone"}; + Configurable cfgIfRejectElectron{"cfgIfRejectElectron", true, "Remove electrons"}; + Configurable cfgIfMandatoryTOF{"cfgIfMandatoryTOF", true, "Mandatory TOF requirement to remove pileup"}; + Configurable cfgEvSelkIsVertexTOFmatched{"cfgEvSelkIsVertexTOFmatched", true, "If matched with TOF, for pileup"}; + ConfigurableAxis cfgCentralityBins{"cfgCentralityBins", {90, 0., 90.}, "Centrality/Multiplicity percentile bining"}; + + // Connect to ccdb + Service ccdb; + Configurable ccdbNoLaterThan{"ccdbNoLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; + Configurable ccdbUrl{"ccdbUrl", "https://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable ccdbPath{"ccdbPath", "Users/s/swati/EtavsPtEfficiency_LHC24f3b_PIDchoice0", "CCDB path to ccdb object containing eff(pt, eta) in 2D hist"}; + + HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + + TRandom3* fRndm = new TRandom3(0); + + // Eff histograms 2d: eff(pT, eta) + TH2F* hRatio2DEtaVsPtProton = nullptr; + TH2F* hRatio2DEtaVsPtAntiproton = nullptr; + + // Filter command for rec (data)*********** + Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; + Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtLower) && (aod::track::pt < 5.0f) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::tpcChi2NCl < cfgCutTpcChi2NCl) && (aod::track::itsChi2NCl < cfgCutItsChi2NCl) && (aod::track::dcaZ < cfgCutDCAz) && (aod::track::dcaXY < cfgCutDCAxy); + + // filtering collisions and tracks for real data*********** + using AodCollisions = soa::Filtered>; + using AodTracks = soa::Filtered>; + + // filtering collisions and tracks for MC rec data*********** + using MyMCRecCollisions = soa::Filtered>; + using MyMCRecCollision = MyMCRecCollisions::iterator; + using MyMCTracks = soa::Filtered>; + using EventCandidatesMC = soa::Join; + + // Equivalent of the AliRoot task UserCreateOutputObjects + void init(o2::framework::InitContext&) + { + // Loading efficiency histograms from ccdb + if (cfgLoadEff) { + + // Accessing eff histograms + ccdb->setURL(ccdbUrl.value); + // Enabling object caching, otherwise each call goes to the CCDB server + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + // Not later than now, will be replaced by the value of the train creation + // This avoids that users can replace objects **while** a train is running + ccdb->setCreatedNotAfter(ccdbNoLaterThan.value); + LOGF(info, "Getting object %s", ccdbPath.value.data()); + TList* lst = ccdb->getForTimeStamp(ccdbPath.value, ccdbNoLaterThan.value); + hRatio2DEtaVsPtProton = reinterpret_cast(lst->FindObject("hRatio2DEtaVsPtProton")); + hRatio2DEtaVsPtAntiproton = reinterpret_cast(lst->FindObject("hRatio2DEtaVsPtAntiproton")); + if (!hRatio2DEtaVsPtProton || !hRatio2DEtaVsPtAntiproton) + LOGF(info, "FATAL!! could not get efficiency---------> check"); + } + + // Define your axes + // Constant bin width axis + AxisSpec vtxZAxis = {100, -20, 20}; + // Variable bin width axis + std::vector ptBinning = {0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4.0}; + AxisSpec ptAxis = {ptBinning, "#it{p}_{T} (GeV/#it{c})"}; + std::vector etaBinning = {-0.8, -0.7, -0.6, -0.5, -0.4, -0.3, -0.2, -0.1, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8}; + AxisSpec etaAxis = {etaBinning, "#it{#eta}"}; + // std::vector centBining = {0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90}; + // AxisSpec centAxis = {centBining, "Multiplicity percentile from FT0M (%)"}; + const AxisSpec centAxis{cfgCentralityBins, "Multiplicity percentile from FT0M (%)"}; + AxisSpec netprotonAxis = {41, -20.5, 20.5, "net-proton number"}; + AxisSpec protonAxis = {21, -0.5, 20.5, "proton number"}; + AxisSpec antiprotonAxis = {21, -0.5, 20.5, "antiproton number"}; + AxisSpec nSigmaAxis = {200, -5.0, 5.0, "nSigma(Proton)"}; + + auto noSubsample = static_cast(cfgNSubsample); + float maxSubsample = 1.0 * noSubsample; + AxisSpec subsampleAxis = {noSubsample, 0.0, maxSubsample, "subsample no."}; + + // histograms for events + histos.add("hZvtx_after_sel", "Vertex dist. after event selection;Z (cm)", kTH1F, {vtxZAxis}); + histos.add("hCentrec", "MCRec Multiplicity percentile from FT0M (%)", kTH1F, {{100, 0.0, 100.0}}); + // tracks Rec level histograms + histos.add("hrecPtAll", "Reconstructed All particles;#it{p}_{T} (GeV/#it{c})", kTH1F, {ptAxis}); + histos.add("hrecPtProton", "Reconstructed Protons;#it{p}_{T} (GeV/#it{c})", kTH1F, {ptAxis}); + histos.add("hrecPtAntiproton", "Reconstructed Antiprotons;#it{p}_{T} (GeV/#it{c})", kTH1F, {ptAxis}); + histos.add("hrecPhiAll", "Reconstructed All particles;#phi", kTH1F, {{100, 0., 7.}}); + histos.add("hrecPhiProton", "Reconstructed Protons;#phi", kTH1F, {{100, 0., 7.}}); + histos.add("hrecPhiAntiproton", "Reconstructed Antiprotons;#phi", kTH1F, {{100, 0., 7.}}); + histos.add("hrecEtaAll", "Reconstructed All particles;#eta", kTH1F, {{100, -2.01, 2.01}}); + histos.add("hrecEtaProton", "Reconstructed Proton;#eta", kTH1F, {{100, -2.01, 2.01}}); + histos.add("hrecEtaAntiproton", "Reconstructed Antiprotons;#eta", kTH1F, {{100, -2.01, 2.01}}); + histos.add("hrecDcaXYAll", "Reconstructed All particles;DCA_{xy} (in cm)", kTH1F, {{400, -2.0, 2.0}}); + histos.add("hrecDcaXYProton", "Reconstructed Proton;DCA_{xy} (in cm)", kTH1F, {{400, -2.0, 2.0}}); + histos.add("hrecDcaXYAntiproton", "Reconstructed Antiprotons;DCA_{xy} (in cm)", kTH1F, {{400, -2.0, 2.0}}); + histos.add("hrecDcaZAll", "Reconstructed All particles;DCA_{z} (in cm)", kTH1F, {{400, -2.0, 2.0}}); + histos.add("hrecDcaZProton", "Reconstructed Proton;DCA_{z} (in cm)", kTH1F, {{400, -2.0, 2.0}}); + histos.add("hrecDcaZAntiproton", "Reconstructed Antiprotons;DCA_{z} (in cm)", kTH1F, {{400, -2.0, 2.0}}); + histos.add("hrecPtDistProtonVsCentrality", "Reconstructed proton number vs centrality in 2D", kTH2F, {ptAxis, centAxis}); + histos.add("hrecPtDistAntiprotonVsCentrality", "Reconstructed antiproton number vs centrality in 2D", kTH2F, {ptAxis, centAxis}); + + histos.add("hrecProtonVsCentrality", "Reconstructed proton number vs centrality in 2D", kTH2F, {protonAxis, centAxis}); + histos.add("hrecAntiprotonVsCentrality", "Reconstructed antiproton number vs centrality in 2D", kTH2F, {antiprotonAxis, centAxis}); + histos.add("hrecProfileTotalProton", "Reconstructed total proton number vs. centrality", kTProfile, {centAxis}); + histos.add("hrecProfileProton", "Reconstructed proton number vs. centrality", kTProfile, {centAxis}); + histos.add("hrecProfileAntiproton", "Reconstructed antiproton number vs. centrality", kTProfile, {centAxis}); + histos.add("hCorrProfileTotalProton", "Eff. Corrected total proton number vs. centrality", kTProfile, {centAxis}); + histos.add("hCorrProfileProton", "Eff. Corrected proton number vs. centrality", kTProfile, {centAxis}); + histos.add("hCorrProfileAntiproton", "Eff. Corrected antiproton number vs. centrality", kTProfile, {centAxis}); + histos.add("hrec2DEtaVsPtProton", "2D hist of Reconstructed Proton y: eta vs. x: pT", kTH2F, {ptAxis, etaAxis}); + histos.add("hrec2DEtaVsPtAntiproton", "2D hist of Reconstructed Anti-proton y: eta vs. x: pT", kTH2F, {ptAxis, etaAxis}); + histos.add("hgen2DEtaVsPtProton", "2D hist of Generated Proton y: eta vs. x: pT", kTH2F, {ptAxis, etaAxis}); + histos.add("hgen2DEtaVsPtAntiproton", "2D hist of Generated Anti-proton y: eta vs. x: pT", kTH2F, {ptAxis, etaAxis}); + + // 2D histograms of nSigma + histos.add("h2DnsigmaTpcVsPt", "2D hist of nSigmaTPC vs. pT", kTH2F, {ptAxis, nSigmaAxis}); + histos.add("h2DnsigmaTofVsPt", "2D hist of nSigmaTOF vs. pT", kTH2F, {ptAxis, nSigmaAxis}); + histos.add("h2DnsigmaItsVsPt", "2D hist of nSigmaITS vs. pT", kTH2F, {ptAxis, nSigmaAxis}); + + if (cfgIsCalculateCentral) { + // uncorrected + histos.add("Prof_mu1_antiproton", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_mu2_antiproton", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_mu3_antiproton", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_mu4_antiproton", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_mu5_antiproton", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_mu6_antiproton", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_mu7_antiproton", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_mu8_antiproton", "", {HistType::kTProfile, {centAxis}}); + + // eff. corrected + histos.add("Prof_Q11_1", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q11_2", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q11_3", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q11_4", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q21_1", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q22_1", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q31_1", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q32_1", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q33_1", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q41_1", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q42_1", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q43_1", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q44_1", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q21_2", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q22_2", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1121_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1121_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1121_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1121_20", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1121_21", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1122_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1122_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1122_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1122_20", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1122_21", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1131_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1131_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1131_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1132_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1132_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1132_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1133_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1133_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1133_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2122_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2122_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2122_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q3132_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q3132_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q3132_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q3133_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q3133_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q3133_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q3233_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q3233_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q3233_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2241_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2241_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2241_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2242_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2242_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2242_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2243_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2243_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2243_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2244_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2244_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2244_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2141_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2141_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2141_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2142_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2142_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2142_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2143_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2143_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2143_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2144_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2144_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2144_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1151_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1151_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1151_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1152_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1152_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1152_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1153_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1153_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1153_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1154_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1154_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1154_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1155_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1155_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1155_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112233_001", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112233_010", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112233_100", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112233_011", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112233_101", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112233_110", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112232_001", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112232_010", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112232_100", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112232_011", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112232_101", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112232_110", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112231_001", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112231_010", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112231_100", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112231_011", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112231_101", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112231_110", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112133_001", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112133_010", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112133_100", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112133_011", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112133_101", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112133_110", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112132_001", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112132_010", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112132_100", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112132_011", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112132_101", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112132_110", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112131_001", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112131_010", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112131_100", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112131_011", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112131_101", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112131_110", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2221_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2221_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2221_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2221_21", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2221_20", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2122_21", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2122_20", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1121_02", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1121_12", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1121_22", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1122_02", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1122_12", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1122_22", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112221_001", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112221_010", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112221_100", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112221_011", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112221_101", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112221_110", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112221_200", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112221_201", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112221_210", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112221_211", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1131_21", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1131_20", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1131_31", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1131_30", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1132_21", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1132_20", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1132_31", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1132_30", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1133_21", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1133_20", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1133_31", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1133_30", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q11_5", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q11_6", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1121_30", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1121_31", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1121_40", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1121_41", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1122_30", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1122_31", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1122_40", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1122_41", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2211_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2211_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2211_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2211_20", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2211_21", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2111_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2111_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2111_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2111_20", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2111_21", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112122_001", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112122_010", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112122_100", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112122_011", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112122_101", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112122_110", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1141_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1141_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1141_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1141_20", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1141_21", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1142_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1142_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1142_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1142_20", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1142_21", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1143_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1143_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1143_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1143_20", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1143_21", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1144_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1144_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1144_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1144_20", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q1144_21", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2131_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2131_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2131_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2132_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2132_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2132_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2133_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2133_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2133_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2231_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2231_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2231_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2232_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2232_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2232_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2233_11", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2233_01", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q2233_10", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q51_1", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q52_1", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q53_1", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q54_1", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q55_1", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q21_3", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q22_3", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q31_2", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q32_2", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q33_2", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q61_1", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q62_1", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q63_1", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q64_1", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q65_1", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q66_1", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112122_111", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112131_111", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112132_111", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112133_111", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112231_111", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112232_111", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112233_111", "", {HistType::kTProfile, {centAxis}}); + histos.add("Prof_Q112221_111", "", {HistType::kTProfile, {centAxis}}); + } + + if (cfgIsCalculateError) { + // uncorrected + histos.add("Prof2D_mu1_antiproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_mu2_antiproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_mu3_antiproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_mu4_antiproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_mu5_antiproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_mu6_antiproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_mu7_antiproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_mu8_antiproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + + // eff. corrected + histos.add("Prof2D_Q11_1", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q11_2", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q11_3", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q11_4", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q21_1", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q22_1", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q31_1", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q32_1", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q33_1", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q41_1", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q42_1", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q43_1", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q44_1", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q21_2", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q22_2", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1121_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1121_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1121_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1121_20", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1121_21", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1122_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1122_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1122_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1122_20", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1122_21", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1131_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1131_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1131_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1132_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1132_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1132_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1133_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1133_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1133_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2122_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2122_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2122_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q3132_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q3132_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q3132_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q3133_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q3133_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q3133_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q3233_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q3233_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q3233_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2241_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2241_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2241_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2242_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2242_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2242_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2243_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2243_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2243_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2244_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2244_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2244_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2141_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2141_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2141_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2142_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2142_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2142_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2143_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2143_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2143_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2144_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2144_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2144_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1151_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1151_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1151_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1152_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1152_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1152_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1153_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1153_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1153_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1154_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1154_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1154_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1155_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1155_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1155_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112233_001", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112233_010", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112233_100", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112233_011", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112233_101", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112233_110", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112232_001", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112232_010", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112232_100", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112232_011", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112232_101", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112232_110", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112231_001", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112231_010", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112231_100", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112231_011", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112231_101", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112231_110", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112133_001", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112133_010", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112133_100", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112133_011", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112133_101", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112133_110", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112132_001", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112132_010", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112132_100", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112132_011", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112132_101", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112132_110", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112131_001", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112131_010", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112131_100", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112131_011", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112131_101", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112131_110", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2221_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2221_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2221_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2221_21", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2221_20", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2122_21", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2122_20", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1121_02", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1121_12", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1121_22", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1122_02", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1122_12", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1122_22", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112221_001", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112221_010", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112221_100", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112221_011", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112221_101", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112221_110", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112221_200", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112221_201", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112221_210", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112221_211", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1131_21", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1131_20", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1131_31", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1131_30", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1132_21", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1132_20", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1132_31", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1132_30", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1133_21", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1133_20", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1133_31", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1133_30", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q11_5", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q11_6", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1121_30", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1121_31", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1121_40", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1121_41", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1122_30", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1122_31", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1122_40", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1122_41", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2211_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2211_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2211_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2211_20", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2211_21", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2111_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2111_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2111_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2111_20", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2111_21", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112122_001", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112122_010", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112122_100", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112122_011", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112122_101", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112122_110", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1141_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1141_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1141_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1141_20", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1141_21", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1142_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1142_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1142_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1142_20", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1142_21", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1143_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1143_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1143_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1143_20", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1143_21", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1144_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1144_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1144_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1144_20", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q1144_21", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2131_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2131_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2131_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2132_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2132_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2132_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2133_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2133_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2133_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2231_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2231_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2231_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2232_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2232_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2232_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2233_11", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2233_01", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q2233_10", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q51_1", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q52_1", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q53_1", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q54_1", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q55_1", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q21_3", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q22_3", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q31_2", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q32_2", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q33_2", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q61_1", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q62_1", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q63_1", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q64_1", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q65_1", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q66_1", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112122_111", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112131_111", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112132_111", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112133_111", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112231_111", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112232_111", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112233_111", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("Prof2D_Q112221_111", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + } + + if (cfgIsMC) { + // MC event counts + histos.add("hMC", "MC Event statistics", kTH1F, {{10, 0.0f, 10.0f}}); + histos.add("hCentgen", "MCGen Multiplicity percentile from FT0M (%)", kTH1F, {{100, 0.0, 100.0}}); + // tracks Gen level histograms + histos.add("hgenPtAll", "Generated All particles;#it{p}_{T} (GeV/#it{c})", kTH1F, {ptAxis}); + histos.add("hgenPtProton", "Generated Protons;#it{p}_{T} (GeV/#it{c})", kTH1F, {ptAxis}); + histos.add("hgenPtAntiproton", "Generated Antiprotons;#it{p}_{T} (GeV/#it{c})", kTH1F, {ptAxis}); + histos.add("hrecPartPtAll", "Reconstructed All particles filled mcparticle pt;#it{p}_{T} (GeV/#it{c})", kTH1F, {ptAxis}); + histos.add("hrecPartPtProton", "Reconstructed Protons filled mcparticle pt;#it{p}_{T} (GeV/#it{c})", kTH1F, {ptAxis}); + histos.add("hrecPartPtAntiproton", "Reconstructed Antiprotons filled mcparticle pt;#it{p}_{T} (GeV/#it{c})", kTH1F, {ptAxis}); + histos.add("hgenPhiAll", "Generated All particles;#phi", kTH1F, {{100, 0., 7.}}); + histos.add("hgenPhiProton", "Generated Protons;#phi", kTH1F, {{100, 0., 7.}}); + histos.add("hgenPhiAntiproton", "Generated Antiprotons;#phi", kTH1F, {{100, 0., 7.}}); + histos.add("hgenEtaAll", "Generated All particles;#eta", kTH1F, {{100, -2.01, 2.01}}); + histos.add("hgenEtaProton", "Generated Proton;#eta", kTH1F, {{100, -2.01, 2.01}}); + histos.add("hgenEtaAntiproton", "Generated Antiprotons;#eta", kTH1F, {{100, -2.01, 2.01}}); + histos.add("hgenPtDistProtonVsCentrality", "Generated proton number vs centrality in 2D", kTH2F, {ptAxis, centAxis}); + histos.add("hgenPtDistAntiprotonVsCentrality", "Generated antiproton number vs centrality in 2D", kTH2F, {ptAxis, centAxis}); + histos.add("hrecTruePtProton", "Reconstructed pdgcode verified protons;#it{p}_{T} (GeV/#it{c})", kTH1F, {ptAxis}); + histos.add("hrecTruePtAntiproton", "Reconstructed pdgcode verified Antiprotons;#it{p}_{T} (GeV/#it{c})", kTH1F, {ptAxis}); + + histos.add("hgenProtonVsCentrality", "Generated proton number vs centrality in 2D", kTH2F, {protonAxis, centAxis}); + histos.add("hgenAntiprotonVsCentrality", "Generated antiproton number vs centrality in 2D", kTH2F, {antiprotonAxis, centAxis}); + histos.add("hgenProfileTotalProton", "Generated total proton number vs. centrality", kTProfile, {centAxis}); + histos.add("hgenProfileProton", "Generated proton number vs. centrality", kTProfile, {centAxis}); + histos.add("hgenProfileAntiproton", "Generated antiproton number vs. centrality", kTProfile, {centAxis}); + + if (cfgIsCalculateCentral) { + histos.add("GenProf_mu1_antiproton", "", {HistType::kTProfile, {centAxis}}); + histos.add("GenProf_mu2_antiproton", "", {HistType::kTProfile, {centAxis}}); + histos.add("GenProf_mu3_antiproton", "", {HistType::kTProfile, {centAxis}}); + histos.add("GenProf_mu4_antiproton", "", {HistType::kTProfile, {centAxis}}); + histos.add("GenProf_mu5_antiproton", "", {HistType::kTProfile, {centAxis}}); + histos.add("GenProf_mu6_antiproton", "", {HistType::kTProfile, {centAxis}}); + histos.add("GenProf_mu7_antiproton", "", {HistType::kTProfile, {centAxis}}); + histos.add("GenProf_mu8_antiproton", "", {HistType::kTProfile, {centAxis}}); + } + + if (cfgIsCalculateError) { + histos.add("GenProf2D_mu1_antiproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("GenProf2D_mu2_antiproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("GenProf2D_mu3_antiproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("GenProf2D_mu4_antiproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("GenProf2D_mu5_antiproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("GenProf2D_mu6_antiproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("GenProf2D_mu7_antiproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + histos.add("GenProf2D_mu8_antiproton", "", {HistType::kTProfile2D, {centAxis, subsampleAxis}}); + } + } + } // end init() + + template + bool selectionPIDold(const T& candidate) + { + if (!candidate.hasTPC()) + return false; + + //! PID checking as done in Run2 my analysis + //! ---------------------------------------------------------------------- + int flag = 0; //! pid check main flag + + if (candidate.pt() > 0.2f && candidate.pt() <= cfgCutPtUpperTPC) { + if (std::abs(candidate.tpcNSigmaPr()) < cfgnSigmaCutTPC) { + flag = 1; + } + } + if (candidate.hasTOF() && candidate.pt() > cfgCutPtUpperTPC && candidate.pt() < 5.0f) { + const float combNSigmaPr = std::sqrt(std::pow(candidate.tpcNSigmaPr(), 2.0) + std::pow(candidate.tofNSigmaPr(), 2.0)); + const float combNSigmaPi = std::sqrt(std::pow(candidate.tpcNSigmaPi(), 2.0) + std::pow(candidate.tofNSigmaPi(), 2.0)); + const float combNSigmaKa = std::sqrt(std::pow(candidate.tpcNSigmaKa(), 2.0) + std::pow(candidate.tofNSigmaKa(), 2.0)); + + int flag2 = 0; + if (combNSigmaPr < 3.0) + flag2 += 1; + if (combNSigmaPi < 3.0) + flag2 += 1; + if (combNSigmaKa < 3.0) + flag2 += 1; + if (!(flag2 > 1) && !(combNSigmaPr > combNSigmaPi) && !(combNSigmaPr > combNSigmaKa)) { + if (combNSigmaPr < cfgnSigmaCutCombTPCTOF) { + flag = 1; + } + } + } + if (flag == 1) + return true; + else + return false; + } + + template + bool selectionPIDoldTOFveto(const T& candidate) + { + if (!candidate.hasTPC()) + return false; + + //! PID checking as done in Run2 my analysis + //! ---------------------------------------------------------------------- + int flag = 0; //! pid check main flag + + if (candidate.pt() > 0.2f && candidate.pt() <= cfgCutPtUpperTPC) { + if (!candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < cfgnSigmaCutTPC) { + flag = 1; + } + if (candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < cfgnSigmaCutTPC && std::abs(candidate.tofNSigmaPr()) < cfgnSigmaCutTOF) { + flag = 1; + } + } + if (candidate.hasTOF() && candidate.pt() > cfgCutPtUpperTPC && candidate.pt() < 5.0f) { + const float combNSigmaPr = std::sqrt(std::pow(candidate.tpcNSigmaPr(), 2.0) + std::pow(candidate.tofNSigmaPr(), 2.0)); + const float combNSigmaPi = std::sqrt(std::pow(candidate.tpcNSigmaPi(), 2.0) + std::pow(candidate.tofNSigmaPi(), 2.0)); + const float combNSigmaKa = std::sqrt(std::pow(candidate.tpcNSigmaKa(), 2.0) + std::pow(candidate.tofNSigmaKa(), 2.0)); + + int flag2 = 0; + if (combNSigmaPr < 3.0) + flag2 += 1; + if (combNSigmaPi < 3.0) + flag2 += 1; + if (combNSigmaKa < 3.0) + flag2 += 1; + if (!(flag2 > 1) && !(combNSigmaPr > combNSigmaPi) && !(combNSigmaPr > combNSigmaKa)) { + if (combNSigmaPr < cfgnSigmaCutCombTPCTOF) { + flag = 1; + } + } + } + if (flag == 1) + return true; + else + return false; + } + + // electron rejection function + template + bool isElectron(const T& candidate) // Victor's BF analysis + { + if (candidate.tpcNSigmaEl() > -3.0f && candidate.tpcNSigmaEl() < 5.0f && std::abs(candidate.tpcNSigmaPi()) > 3.0f && std::abs(candidate.tpcNSigmaKa()) > 3.0f && std::abs(candidate.tpcNSigmaPr()) > 3.0f) { + return true; + } + return false; + } + + template + bool selectionPIDnew(const T& candidate) // Victor's BF analysis + { + // electron rejection + if (candidate.tpcNSigmaEl() > -3.0f && candidate.tpcNSigmaEl() < 5.0f && std::abs(candidate.tpcNSigmaPi()) > 3.0f && std::abs(candidate.tpcNSigmaKa()) > 3.0f && std::abs(candidate.tpcNSigmaPr()) > 3.0f) { + return false; + } + + //! if pt < threshold + if (candidate.pt() > 0.2f && candidate.pt() <= cfgCutPtUpperTPC) { + if (!candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < cfgnSigmaCutTPC && std::abs(candidate.tpcNSigmaPi()) > cfgnSigmaCutTPC && std::abs(candidate.tpcNSigmaKa()) > cfgnSigmaCutTPC) { + return true; + } + if (candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < cfgnSigmaCutTPC && std::abs(candidate.tpcNSigmaPi()) > cfgnSigmaCutTPC && std::abs(candidate.tpcNSigmaKa()) > cfgnSigmaCutTPC && std::abs(candidate.tofNSigmaPr()) < cfgnSigmaCutTOF && std::abs(candidate.tofNSigmaPi()) > cfgnSigmaCutTOF && std::abs(candidate.tofNSigmaKa()) > cfgnSigmaCutTOF) { + return true; + } + } + + //! if pt > threshold + if (candidate.pt() > cfgCutPtUpperTPC) { + if (candidate.hasTOF() && std::abs(candidate.tpcNSigmaPr()) < cfgnSigmaCutTPC && std::abs(candidate.tpcNSigmaPi()) > cfgnSigmaCutTPC && std::abs(candidate.tpcNSigmaKa()) > cfgnSigmaCutTPC && std::abs(candidate.tofNSigmaPr()) < cfgnSigmaCutTOF && std::abs(candidate.tofNSigmaPi()) > cfgnSigmaCutTOF && std::abs(candidate.tofNSigmaKa()) > cfgnSigmaCutTOF) { + return true; + } + } + return false; + } + + // Function to check which pt bin the track lies in and assign the corresponding efficiency + + template + float getEfficiency(const T& candidate) + { + // Load eff from histograms in CCDB + if (cfgLoadEff) { + if (candidate.sign() > 0) { + float effmeanval = hRatio2DEtaVsPtProton->GetBinContent(hRatio2DEtaVsPtProton->FindBin(candidate.pt(), candidate.eta())); + return effmeanval; + } + if (candidate.sign() < 0) { + float effmeanval = hRatio2DEtaVsPtAntiproton->GetBinContent(hRatio2DEtaVsPtAntiproton->FindBin(candidate.pt(), candidate.eta())); + return effmeanval; + } + return 0.0; + } else { + // Find the pt bin index based on the track's pt value + int binIndex = -1; + + for (int i = 0; i < 16; ++i) { + if (candidate.pt() >= cfgPtBins.value[i] && candidate.pt() < cfgPtBins.value[i + 1]) { + binIndex = i; + break; + } + } + // If the pt is outside the defined bins, return a default efficiency or handle it differently + if (binIndex == -1) { + return 0.0; // Default efficiency (0% if outside bins) + } + if (candidate.sign() > 0) + return cfgProtonEff.value[binIndex]; + if (candidate.sign() < 0) + return cfgAntiprotonEff.value[binIndex]; + return 0.0; + } + } + + void processMCGen(aod::McCollision const& mcCollision, aod::McParticles const& mcParticles, const soa::SmallGroups& collisions) + { + histos.fill(HIST("hMC"), 0.5); + if (std::abs(mcCollision.posZ()) < cfgCutVertex) { + histos.fill(HIST("hMC"), 1.5); + } + auto cent = 0; + + int nchInel = 0; + for (const auto& mcParticle : mcParticles) { + auto pdgcode = std::abs(mcParticle.pdgCode()); + if (mcParticle.isPhysicalPrimary() && (pdgcode == 211 || pdgcode == 321 || pdgcode == 2212 || pdgcode == 11 || pdgcode == 13)) { + if (std::abs(mcParticle.eta()) < 1.0) { + nchInel = nchInel + 1; + } + } + } + if (nchInel > 0 && std::abs(mcCollision.posZ()) < cfgCutVertex) + histos.fill(HIST("hMC"), 2.5); + std::vector selectedEvents(collisions.size()); + int nevts = 0; + + for (const auto& collision : collisions) { + if (!collision.sel8() || std::abs(collision.mcCollision().posZ()) > cfgCutVertex) { + continue; + } + if (cfgUseGoodITSLayerAllCut && !(collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll))) { + continue; + } + if (cfgEvSelkNoSameBunchPileup && !(collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup))) { + continue; + } + if (cfgEvSelkIsVertexTOFmatched && !(collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched))) { + continue; + } + + cent = collision.centFT0M(); + + selectedEvents[nevts++] = collision.mcCollision_as().globalIndex(); + } + selectedEvents.resize(nevts); + const auto evtReconstructedAndSelected = std::find(selectedEvents.begin(), selectedEvents.end(), mcCollision.globalIndex()) != selectedEvents.end(); + histos.fill(HIST("hMC"), 3.5); + if (!evtReconstructedAndSelected) { // Check that the event is reconstructed and that the reconstructed events pass the selection + return; + } + histos.fill(HIST("hMC"), 4.5); + histos.fill(HIST("hCentgen"), cent); + + // creating phi, pt, eta dstribution of generted MC particles + + float nProt = 0.0; + float nAntiprot = 0.0; + + for (const auto& mcParticle : mcParticles) { + if (mcParticle.isPhysicalPrimary()) { + if ((mcParticle.pt() > cfgCutPtLower) && (mcParticle.pt() < 5.0f) && (std::abs(mcParticle.eta()) < cfgCutEta)) { + histos.fill(HIST("hgenPtAll"), mcParticle.pt()); + histos.fill(HIST("hgenEtaAll"), mcParticle.eta()); + histos.fill(HIST("hgenPhiAll"), mcParticle.phi()); + + if (std::abs(mcParticle.pdgCode()) == 2212 /*&& std::abs(mcParticle.y()) < 0.5*/) { + if (mcParticle.pdgCode() == 2212) { + histos.fill(HIST("hgenPtProton"), mcParticle.pt()); //! hist for p gen + histos.fill(HIST("hgenPtDistProtonVsCentrality"), mcParticle.pt(), cent); + histos.fill(HIST("hgen2DEtaVsPtProton"), mcParticle.pt(), mcParticle.eta()); + histos.fill(HIST("hgenEtaProton"), mcParticle.eta()); + histos.fill(HIST("hgenPhiProton"), mcParticle.phi()); + if (mcParticle.pt() < cfgCutPtUpper) + nProt = nProt + 1.0; + } + if (mcParticle.pdgCode() == -2212) { + histos.fill(HIST("hgenPtAntiproton"), mcParticle.pt()); //! hist for anti-p gen + histos.fill(HIST("hgenPtDistAntiprotonVsCentrality"), mcParticle.pt(), cent); + histos.fill(HIST("hgen2DEtaVsPtAntiproton"), mcParticle.pt(), mcParticle.eta()); + histos.fill(HIST("hgenEtaAntiproton"), mcParticle.eta()); + histos.fill(HIST("hgenPhiAntiproton"), mcParticle.phi()); + if (mcParticle.pt() < cfgCutPtUpper) + nAntiprot = nAntiprot + 1.0; + } + } + } + } + } //! end particle loop + + float netProt = nAntiprot; // here we are interested in antiproton cumulants + + histos.fill(HIST("hgenProtonVsCentrality"), nProt, cent); + histos.fill(HIST("hgenAntiprotonVsCentrality"), nAntiprot, cent); + histos.fill(HIST("hgenProfileTotalProton"), cent, (nProt + nAntiprot)); + histos.fill(HIST("hgenProfileProton"), cent, nProt); + histos.fill(HIST("hgenProfileAntiproton"), cent, nAntiprot); + + // Profiles for generated level cumulants + //------------------------------------------------------------------------------------------- + + if (cfgIsCalculateCentral) { + histos.get(HIST("GenProf_mu1_antiproton"))->Fill(cent, std::pow(netProt, 1.0)); + histos.get(HIST("GenProf_mu2_antiproton"))->Fill(cent, std::pow(netProt, 2.0)); + histos.get(HIST("GenProf_mu3_antiproton"))->Fill(cent, std::pow(netProt, 3.0)); + histos.get(HIST("GenProf_mu4_antiproton"))->Fill(cent, std::pow(netProt, 4.0)); + histos.get(HIST("GenProf_mu5_antiproton"))->Fill(cent, std::pow(netProt, 5.0)); + histos.get(HIST("GenProf_mu6_antiproton"))->Fill(cent, std::pow(netProt, 6.0)); + histos.get(HIST("GenProf_mu7_antiproton"))->Fill(cent, std::pow(netProt, 7.0)); + histos.get(HIST("GenProf_mu8_antiproton"))->Fill(cent, std::pow(netProt, 8.0)); + } + + if (cfgIsCalculateError) { + + float lRandom = fRndm->Rndm(); + int sampleIndex = static_cast(cfgNSubsample * lRandom); + + histos.get(HIST("GenProf2D_mu1_antiproton"))->Fill(cent, sampleIndex, std::pow(netProt, 1.0)); + histos.get(HIST("GenProf2D_mu2_antiproton"))->Fill(cent, sampleIndex, std::pow(netProt, 2.0)); + histos.get(HIST("GenProf2D_mu3_antiproton"))->Fill(cent, sampleIndex, std::pow(netProt, 3.0)); + histos.get(HIST("GenProf2D_mu4_antiproton"))->Fill(cent, sampleIndex, std::pow(netProt, 4.0)); + histos.get(HIST("GenProf2D_mu5_antiproton"))->Fill(cent, sampleIndex, std::pow(netProt, 5.0)); + histos.get(HIST("GenProf2D_mu6_antiproton"))->Fill(cent, sampleIndex, std::pow(netProt, 6.0)); + histos.get(HIST("GenProf2D_mu7_antiproton"))->Fill(cent, sampleIndex, std::pow(netProt, 7.0)); + histos.get(HIST("GenProf2D_mu8_antiproton"))->Fill(cent, sampleIndex, std::pow(netProt, 8.0)); + } + //------------------------------------------------------------------------------------------- + } + PROCESS_SWITCH(AntiprotonCumulantsMc, processMCGen, "Process Generated", true); + + void processMCRec(MyMCRecCollision const& collision, MyMCTracks const& tracks, aod::McCollisions const&, aod::McParticles const&) + { + if (!collision.has_mcCollision()) { + return; + } + + if (!collision.sel8()) { + return; + } + if (cfgUseGoodITSLayerAllCut && !(collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll))) { + return; + } + if (cfgEvSelkNoSameBunchPileup && !(collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup))) { + return; + } + if (cfgEvSelkIsVertexTOFmatched && !(collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched))) { + return; + ; + } + + auto cent = collision.centFT0M(); + histos.fill(HIST("hCentrec"), cent); + histos.fill(HIST("hMC"), 5.5); + histos.fill(HIST("hZvtx_after_sel"), collision.posZ()); + + float nProt = 0.0; + float nAntiprot = 0.0; + std::array powerEffProt = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + std::array powerEffAntiprot = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + std::array fTCP0 = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + std::array fTCP1 = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + o2::aod::ITSResponse itsResponse; + + // Start of the Monte-Carlo reconstructed tracks + for (const auto& track : tracks) { + if (!track.has_mcParticle()) //! check if track has corresponding MC particle + { + continue; + } + if (!track.isPVContributor()) //! track check as used in data + { + continue; + } + + auto particle = track.mcParticle(); + if ((particle.pt() < cfgCutPtLower) || (particle.pt() > 5.0f) || (std::abs(particle.eta()) > cfgCutEta)) { + continue; + } + if (!(track.itsNCls() > cfgITScluster) || !(track.tpcNClsFound() >= cfgTPCcluster) || !(track.tpcNClsCrossedRows() >= cfgTPCnCrossedRows)) { + continue; + } + + if (particle.isPhysicalPrimary()) { + histos.fill(HIST("hrecPartPtAll"), particle.pt()); + histos.fill(HIST("hrecPtAll"), track.pt()); + histos.fill(HIST("hrecEtaAll"), particle.eta()); + histos.fill(HIST("hrecPhiAll"), particle.phi()); + histos.fill(HIST("hrecDcaXYAll"), track.dcaXY()); + histos.fill(HIST("hrecDcaZAll"), track.dcaZ()); + + // rejecting electron + if (cfgIfRejectElectron && isElectron(track)) { + continue; + } + // use ITS pid as well + if (cfgUseItsPid && (std::abs(itsResponse.nSigmaITS(track)) > 3.0)) { + continue; + } + // required tracks with TOF mandatory to avoid pileup + if (cfgIfMandatoryTOF && !track.hasTOF()) { + continue; + } + + bool trackSelected = false; + if (cfgPIDchoice == 0) + trackSelected = selectionPIDoldTOFveto(track); + if (cfgPIDchoice == 1) + trackSelected = selectionPIDnew(track); + if (cfgPIDchoice == 2) + trackSelected = selectionPIDold(track); + + if (trackSelected) { + // filling nSigma distribution + histos.fill(HIST("h2DnsigmaTpcVsPt"), track.pt(), track.tpcNSigmaPr()); + histos.fill(HIST("h2DnsigmaTofVsPt"), track.pt(), track.tofNSigmaPr()); + histos.fill(HIST("h2DnsigmaItsVsPt"), track.pt(), itsResponse.nSigmaITS(track)); + + if (track.sign() > 0) { + histos.fill(HIST("hrecPartPtProton"), particle.pt()); //! hist for p rec + histos.fill(HIST("hrecPtProton"), track.pt()); //! hist for p rec + histos.fill(HIST("hrecPtDistProtonVsCentrality"), particle.pt(), cent); + histos.fill(HIST("hrec2DEtaVsPtProton"), particle.pt(), particle.eta()); + histos.fill(HIST("hrecEtaProton"), particle.eta()); + histos.fill(HIST("hrecPhiProton"), particle.phi()); + histos.fill(HIST("hrecDcaXYProton"), track.dcaXY()); + histos.fill(HIST("hrecDcaZProton"), track.dcaZ()); + if (particle.pt() < cfgCutPtUpper) { + nProt = nProt + 1.0; + float pEff = getEfficiency(track); // get efficiency of track + if (pEff != 0) { + for (int i = 1; i < 7; i++) { + powerEffProt[i] += std::pow(1.0 / pEff, i); + } + } + } + if (particle.pdgCode() == 2212) { + histos.fill(HIST("hrecTruePtProton"), particle.pt()); //! hist for p purity + } + } + if (track.sign() < 0) { + histos.fill(HIST("hrecPartPtAntiproton"), particle.pt()); //! hist for anti-p rec + histos.fill(HIST("hrecPtAntiproton"), track.pt()); //! hist for anti-p rec + histos.fill(HIST("hrecPtDistAntiprotonVsCentrality"), particle.pt(), cent); + histos.fill(HIST("hrec2DEtaVsPtAntiproton"), particle.pt(), particle.eta()); + histos.fill(HIST("hrecEtaAntiproton"), particle.eta()); + histos.fill(HIST("hrecPhiAntiproton"), particle.phi()); + histos.fill(HIST("hrecDcaXYAntiproton"), track.dcaXY()); + histos.fill(HIST("hrecDcaZAntiproton"), track.dcaZ()); + if (particle.pt() < cfgCutPtUpper) { + nAntiprot = nAntiprot + 1.0; + float pEff = getEfficiency(track); // get efficiency of track + if (pEff != 0) { + for (int i = 1; i < 7; i++) { + powerEffAntiprot[i] += std::pow(1.0 / pEff, i); + } + } + } + if (particle.pdgCode() == -2212) { + histos.fill(HIST("hrecTruePtAntiproton"), particle.pt()); //! hist for anti-p purity + } + } + } //! checking PID + } //! checking if primary + } //! end track loop + + float netProt = nAntiprot; + + histos.fill(HIST("hrecProtonVsCentrality"), nProt, cent); + histos.fill(HIST("hrecAntiprotonVsCentrality"), nAntiprot, cent); + histos.fill(HIST("hrecProfileTotalProton"), cent, (nProt + nAntiprot)); + histos.fill(HIST("hrecProfileProton"), cent, nProt); + histos.fill(HIST("hrecProfileAntiproton"), cent, nAntiprot); + histos.fill(HIST("hCorrProfileTotalProton"), cent, (powerEffProt[1] + powerEffAntiprot[1])); + histos.fill(HIST("hCorrProfileProton"), cent, powerEffProt[1]); + histos.fill(HIST("hCorrProfileAntiproton"), cent, powerEffAntiprot[1]); + + // Calculating q_{r,s} as required + for (int i = 1; i < 7; i++) { + fTCP0[i] = 0.0 + powerEffAntiprot[i]; + fTCP1[i] = 0.0 - powerEffAntiprot[i]; + } + + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + float fQ11_1 = fTCP1[1]; + float fQ11_2 = std::pow(fTCP1[1], 2); + float fQ11_3 = std::pow(fTCP1[1], 3); + float fQ11_4 = std::pow(fTCP1[1], 4); + float fQ11_5 = std::pow(fTCP1[1], 5); + float fQ11_6 = std::pow(fTCP1[1], 6); + + float fQ21_3 = std::pow(fTCP0[1], 3); + float fQ22_3 = std::pow(fTCP0[2], 3); + float fQ31_2 = std::pow(fTCP1[1], 2); + float fQ32_2 = std::pow(fTCP1[2], 2); + float fQ33_2 = std::pow(fTCP1[3], 2); + + float fQ61_1 = fTCP0[1]; + float fQ62_1 = fTCP0[2]; + float fQ63_1 = fTCP0[3]; + float fQ64_1 = fTCP0[4]; + float fQ65_1 = fTCP0[5]; + float fQ66_1 = fTCP0[6]; + + float fQ112122_111 = fTCP1[1] * fTCP0[1] * fTCP0[2]; + float fQ112131_111 = fTCP1[1] * fTCP0[1] * fTCP1[1]; + float fQ112132_111 = fTCP1[1] * fTCP0[1] * fTCP1[2]; + float fQ112133_111 = fTCP1[1] * fTCP0[1] * fTCP1[3]; + float fQ112231_111 = fTCP1[1] * fTCP0[2] * fTCP1[1]; + float fQ112232_111 = fTCP1[1] * fTCP0[2] * fTCP1[2]; + float fQ112233_111 = fTCP1[1] * fTCP0[2] * fTCP1[3]; + float fQ112221_111 = fTCP1[1] * fTCP0[2] * fTCP0[1]; + + float fQ21_1 = fTCP0[1]; + float fQ22_1 = fTCP0[2]; + float fQ31_1 = fTCP1[1]; + float fQ32_1 = fTCP1[2]; + float fQ33_1 = fTCP1[3]; + float fQ41_1 = fTCP0[1]; + float fQ42_1 = fTCP0[2]; + float fQ43_1 = fTCP0[3]; + float fQ44_1 = fTCP0[4]; + float fQ21_2 = std::pow(fTCP0[1], 2); + float fQ22_2 = std::pow(fTCP0[2], 2); + float fQ1121_11 = fTCP1[1] * fTCP0[1]; + float fQ1121_01 = fTCP0[1]; + float fQ1121_10 = fTCP1[1]; + float fQ1121_20 = std::pow(fTCP1[1], 2); + float fQ1121_21 = std::pow(fTCP1[1], 2) * fTCP0[1]; + float fQ1122_11 = fTCP1[1] * fTCP0[2]; + float fQ1122_01 = fTCP0[2]; + float fQ1122_10 = fTCP1[1]; + float fQ1122_20 = std::pow(fTCP1[1], 2); + float fQ1122_21 = std::pow(fTCP1[1], 2) * fTCP0[2]; + float fQ1131_11 = fTCP1[1] * fTCP1[1]; + float fQ1131_01 = fTCP1[1]; + float fQ1131_10 = fTCP1[1]; + float fQ1132_11 = fTCP1[1] * fTCP1[2]; + float fQ1132_01 = fTCP1[2]; + float fQ1132_10 = fTCP1[1]; + float fQ1133_11 = fTCP1[1] * fTCP1[3]; + float fQ1133_01 = fTCP1[3]; + float fQ1133_10 = fTCP1[1]; + float fQ2122_11 = fTCP0[1] * fTCP0[2]; + float fQ2122_01 = fTCP0[2]; + float fQ2122_10 = fTCP0[1]; + + ///////////////---------------------> + float fQ3132_11 = fTCP1[1] * fTCP1[2]; + float fQ3132_01 = fTCP1[2]; + float fQ3132_10 = fTCP1[1]; + float fQ3133_11 = fTCP1[1] * fTCP1[3]; + float fQ3133_01 = fTCP1[3]; + float fQ3133_10 = fTCP1[1]; + float fQ3233_11 = fTCP1[2] * fTCP1[3]; + float fQ3233_01 = fTCP1[3]; + float fQ3233_10 = fTCP1[2]; + float fQ2241_11 = fTCP0[2] * fTCP0[1]; + float fQ2241_01 = fTCP0[1]; + float fQ2241_10 = fTCP0[2]; + float fQ2242_11 = fTCP0[2] * fTCP0[2]; + float fQ2242_01 = fTCP0[2]; + float fQ2242_10 = fTCP0[2]; + float fQ2243_11 = fTCP0[2] * fTCP0[3]; + float fQ2243_01 = fTCP0[3]; + float fQ2243_10 = fTCP0[2]; + float fQ2244_11 = fTCP0[2] * fTCP0[4]; + float fQ2244_01 = fTCP0[4]; + float fQ2244_10 = fTCP0[2]; + float fQ2141_11 = fTCP0[1] * fTCP0[1]; + float fQ2141_01 = fTCP0[1]; + float fQ2141_10 = fTCP0[1]; + float fQ2142_11 = fTCP0[1] * fTCP0[2]; + float fQ2142_01 = fTCP0[2]; + float fQ2142_10 = fTCP0[1]; + float fQ2143_11 = fTCP0[1] * fTCP0[3]; + float fQ2143_01 = fTCP0[3]; + float fQ2143_10 = fTCP0[1]; + float fQ2144_11 = fTCP0[1] * fTCP0[4]; + float fQ2144_01 = fTCP0[4]; + float fQ2144_10 = fTCP0[1]; + float fQ1151_11 = fTCP1[1] * fTCP1[1]; + float fQ1151_01 = fTCP1[1]; + float fQ1151_10 = fTCP1[1]; + float fQ1152_11 = fTCP1[1] * fTCP1[2]; + float fQ1152_01 = fTCP1[2]; + float fQ1152_10 = fTCP1[1]; + float fQ1153_11 = fTCP1[1] * fTCP1[3]; + float fQ1153_01 = fTCP1[3]; + float fQ1153_10 = fTCP1[1]; + float fQ1154_11 = fTCP1[1] * fTCP1[4]; + float fQ1154_01 = fTCP1[4]; + float fQ1154_10 = fTCP1[1]; + float fQ1155_11 = fTCP1[1] * fTCP1[5]; + float fQ1155_01 = fTCP1[5]; + float fQ1155_10 = fTCP1[1]; + + float fQ112233_001 = fTCP1[3]; + float fQ112233_010 = fTCP0[2]; + float fQ112233_100 = fTCP1[1]; + float fQ112233_011 = fTCP0[2] * fTCP1[3]; + float fQ112233_101 = fTCP1[1] * fTCP1[3]; + float fQ112233_110 = fTCP1[1] * fTCP0[2]; + float fQ112232_001 = fTCP1[2]; + float fQ112232_010 = fTCP0[2]; + float fQ112232_100 = fTCP1[1]; + float fQ112232_011 = fTCP0[2] * fTCP1[2]; + float fQ112232_101 = fTCP1[1] * fTCP1[2]; + float fQ112232_110 = fTCP1[1] * fTCP0[2]; + // + float fQ112231_001 = fTCP1[1]; + float fQ112231_010 = fTCP0[2]; + float fQ112231_100 = fTCP1[1]; + float fQ112231_011 = fTCP0[2] * fTCP1[1]; + float fQ112231_101 = fTCP1[1] * fTCP1[1]; + float fQ112231_110 = fTCP1[1] * fTCP0[2]; + float fQ112133_001 = fTCP1[3]; + float fQ112133_010 = fTCP0[1]; + float fQ112133_100 = fTCP1[1]; + float fQ112133_011 = fTCP0[1] * fTCP1[3]; + float fQ112133_101 = fTCP1[1] * fTCP1[3]; + float fQ112133_110 = fTCP1[1] * fTCP0[1]; + + float fQ112132_001 = fTCP1[2]; + float fQ112132_010 = fTCP0[1]; + float fQ112132_100 = fTCP1[1]; + float fQ112132_011 = fTCP0[1] * fTCP1[2]; + float fQ112132_101 = fTCP1[1] * fTCP1[2]; + float fQ112132_110 = fTCP1[1] * fTCP0[1]; + float fQ112131_001 = fTCP1[1]; + float fQ112131_010 = fTCP0[1]; + float fQ112131_100 = fTCP1[1]; + float fQ112131_011 = fTCP0[1] * fTCP1[1]; + float fQ112131_101 = fTCP1[1] * fTCP1[1]; + float fQ112131_110 = fTCP1[1] * fTCP0[1]; + + float fQ2221_11 = fTCP0[2] * fTCP0[1]; + float fQ2221_01 = fTCP0[1]; + float fQ2221_10 = fTCP0[2]; + float fQ2221_21 = std::pow(fTCP0[2], 2) * fTCP0[1]; + float fQ2221_20 = std::pow(fTCP0[2], 2); + + float fQ2122_21 = std::pow(fTCP0[1], 2) * fTCP0[2]; + float fQ2122_20 = std::pow(fTCP0[1], 2); + float fQ1121_02 = std::pow(fTCP0[1], 2); + float fQ1121_12 = fTCP1[1] * std::pow(fTCP0[1], 2); + float fQ1121_22 = std::pow(fTCP1[1], 2) * std::pow(fTCP0[1], 2); + float fQ1122_02 = std::pow(fTCP0[2], 2); + float fQ1122_12 = fTCP1[1] * std::pow(fTCP0[2], 2); + float fQ1122_22 = std::pow(fTCP1[1], 2) * std::pow(fTCP0[2], 2); + + float fQ112221_001 = fTCP0[1]; + float fQ112221_010 = fTCP0[2]; + float fQ112221_100 = fTCP1[1]; + float fQ112221_011 = fTCP0[2] * fTCP0[1]; + float fQ112221_101 = fTCP1[1] * fTCP0[1]; + float fQ112221_110 = fTCP1[1] * fTCP0[2]; + float fQ112221_200 = std::pow(fTCP1[1], 2); + float fQ112221_201 = std::pow(fTCP1[1], 2) * fTCP0[1]; + float fQ112221_210 = std::pow(fTCP1[1], 2) * fTCP0[2]; + float fQ112221_211 = std::pow(fTCP1[1], 2) * fTCP0[2] * fTCP0[1]; + float fQ1131_21 = std::pow(fTCP1[1], 2) * fTCP1[1]; + float fQ1131_20 = std::pow(fTCP1[1], 2); + float fQ1131_31 = std::pow(fTCP1[1], 3) * fTCP1[1]; + float fQ1131_30 = std::pow(fTCP1[1], 3); + + float fQ1132_21 = std::pow(fTCP1[1], 2) * fTCP1[2]; + float fQ1132_20 = std::pow(fTCP1[1], 2); + float fQ1132_31 = std::pow(fTCP1[1], 3) * fTCP1[2]; + float fQ1132_30 = std::pow(fTCP1[1], 3); + float fQ1133_21 = std::pow(fTCP1[1], 2) * fTCP1[3]; + float fQ1133_20 = std::pow(fTCP1[1], 2); + float fQ1133_31 = std::pow(fTCP1[1], 3) * fTCP1[3]; + float fQ1133_30 = std::pow(fTCP1[1], 3); + float fQ1121_30 = std::pow(fTCP1[1], 3); + float fQ1121_31 = std::pow(fTCP1[1], 3) * fTCP0[1]; + float fQ1121_40 = std::pow(fTCP1[1], 4); + float fQ1121_41 = std::pow(fTCP1[1], 4) * fTCP0[1]; + float fQ1122_30 = std::pow(fTCP1[1], 3); + float fQ1122_31 = std::pow(fTCP1[1], 3) * fTCP0[2]; + float fQ1122_40 = std::pow(fTCP1[1], 4); + float fQ1122_41 = std::pow(fTCP1[1], 4) * fTCP0[2]; + + float fQ2211_11 = fTCP0[2] * fTCP1[1]; + float fQ2211_01 = fTCP1[1]; + float fQ2211_10 = fTCP0[2]; + float fQ2211_20 = std::pow(fTCP0[2], 2); + float fQ2211_21 = std::pow(fTCP0[2], 2) * fTCP1[1]; + float fQ2111_11 = fTCP0[1] * fTCP1[1]; + float fQ2111_01 = fTCP1[1]; + float fQ2111_10 = fTCP0[1]; + float fQ2111_20 = std::pow(fTCP0[1], 2); + float fQ2111_21 = std::pow(fTCP0[1], 2) * fTCP1[1]; + + float fQ112122_001 = fTCP0[2]; + float fQ112122_010 = fTCP0[1]; + float fQ112122_100 = fTCP1[1]; + float fQ112122_011 = fTCP0[1] * fTCP0[2]; + float fQ112122_101 = fTCP1[1] * fTCP0[2]; + float fQ112122_110 = fTCP1[1] * fTCP0[1]; + + float fQ1141_11 = fTCP1[1] * fTCP0[1]; + float fQ1141_01 = fTCP0[1]; + float fQ1141_10 = fTCP1[1]; + float fQ1141_20 = std::pow(fTCP1[1], 2); + float fQ1141_21 = std::pow(fTCP1[1], 2) * fTCP0[1]; + float fQ1142_11 = fTCP1[1] * fTCP0[2]; + float fQ1142_01 = fTCP0[2]; + float fQ1142_10 = fTCP1[1]; + float fQ1142_20 = std::pow(fTCP1[1], 2); + float fQ1142_21 = std::pow(fTCP1[1], 2) * fTCP0[2]; + + float fQ1143_11 = fTCP1[1] * fTCP0[3]; + float fQ1143_01 = fTCP0[3]; + float fQ1143_10 = fTCP1[1]; + float fQ1143_20 = std::pow(fTCP1[1], 2); + float fQ1143_21 = std::pow(fTCP1[1], 2) * fTCP0[3]; + float fQ1144_11 = fTCP1[1] * fTCP0[4]; + float fQ1144_01 = fTCP0[4]; + float fQ1144_10 = fTCP1[1]; + float fQ1144_20 = std::pow(fTCP1[1], 2); + float fQ1144_21 = std::pow(fTCP1[1], 2) * fTCP0[4]; + float fQ2131_11 = fTCP0[1] * fTCP1[1]; + float fQ2131_01 = fTCP1[1]; + float fQ2131_10 = fTCP0[1]; + + float fQ2132_11 = fTCP0[1] * fTCP1[2]; + float fQ2132_01 = fTCP1[2]; + float fQ2132_10 = fTCP0[1]; + float fQ2133_11 = fTCP0[1] * fTCP1[3]; + float fQ2133_01 = fTCP1[3]; + float fQ2133_10 = fTCP0[1]; + float fQ2231_11 = fTCP0[2] * fTCP1[1]; + float fQ2231_01 = fTCP1[1]; + float fQ2231_10 = fTCP0[2]; + float fQ2232_11 = fTCP0[2] * fTCP1[2]; + float fQ2232_01 = fTCP1[2]; + float fQ2232_10 = fTCP0[2]; + float fQ2233_11 = fTCP0[2] * fTCP1[3]; + float fQ2233_01 = fTCP1[3]; + float fQ2233_10 = fTCP0[2]; + + float fQ51_1 = fTCP1[1]; + float fQ52_1 = fTCP1[2]; + float fQ53_1 = fTCP1[3]; + float fQ54_1 = fTCP1[4]; + float fQ55_1 = fTCP1[5]; + + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + if (cfgIsCalculateCentral) { + + // uncorrected + histos.get(HIST("Prof_mu1_antiproton"))->Fill(cent, std::pow(netProt, 1.0)); + histos.get(HIST("Prof_mu2_antiproton"))->Fill(cent, std::pow(netProt, 2.0)); + histos.get(HIST("Prof_mu3_antiproton"))->Fill(cent, std::pow(netProt, 3.0)); + histos.get(HIST("Prof_mu4_antiproton"))->Fill(cent, std::pow(netProt, 4.0)); + histos.get(HIST("Prof_mu5_antiproton"))->Fill(cent, std::pow(netProt, 5.0)); + histos.get(HIST("Prof_mu6_antiproton"))->Fill(cent, std::pow(netProt, 6.0)); + histos.get(HIST("Prof_mu7_antiproton"))->Fill(cent, std::pow(netProt, 7.0)); + histos.get(HIST("Prof_mu8_antiproton"))->Fill(cent, std::pow(netProt, 8.0)); + + // eff. corrected + histos.get(HIST("Prof_Q11_1"))->Fill(cent, fQ11_1); + histos.get(HIST("Prof_Q11_2"))->Fill(cent, fQ11_2); + histos.get(HIST("Prof_Q11_3"))->Fill(cent, fQ11_3); + histos.get(HIST("Prof_Q11_4"))->Fill(cent, fQ11_4); + histos.get(HIST("Prof_Q21_1"))->Fill(cent, fQ21_1); + histos.get(HIST("Prof_Q22_1"))->Fill(cent, fQ22_1); + histos.get(HIST("Prof_Q31_1"))->Fill(cent, fQ31_1); + histos.get(HIST("Prof_Q32_1"))->Fill(cent, fQ32_1); + histos.get(HIST("Prof_Q33_1"))->Fill(cent, fQ33_1); + histos.get(HIST("Prof_Q41_1"))->Fill(cent, fQ41_1); + histos.get(HIST("Prof_Q42_1"))->Fill(cent, fQ42_1); + histos.get(HIST("Prof_Q43_1"))->Fill(cent, fQ43_1); + histos.get(HIST("Prof_Q44_1"))->Fill(cent, fQ44_1); + histos.get(HIST("Prof_Q21_2"))->Fill(cent, fQ21_2); + histos.get(HIST("Prof_Q22_2"))->Fill(cent, fQ22_2); + histos.get(HIST("Prof_Q1121_11"))->Fill(cent, fQ1121_11); + histos.get(HIST("Prof_Q1121_01"))->Fill(cent, fQ1121_01); + histos.get(HIST("Prof_Q1121_10"))->Fill(cent, fQ1121_10); + histos.get(HIST("Prof_Q1121_20"))->Fill(cent, fQ1121_20); + histos.get(HIST("Prof_Q1121_21"))->Fill(cent, fQ1121_21); + histos.get(HIST("Prof_Q1122_11"))->Fill(cent, fQ1122_11); + histos.get(HIST("Prof_Q1122_01"))->Fill(cent, fQ1122_01); + histos.get(HIST("Prof_Q1122_10"))->Fill(cent, fQ1122_10); + histos.get(HIST("Prof_Q1122_20"))->Fill(cent, fQ1122_20); + histos.get(HIST("Prof_Q1122_21"))->Fill(cent, fQ1122_21); + histos.get(HIST("Prof_Q1131_11"))->Fill(cent, fQ1131_11); + histos.get(HIST("Prof_Q1131_01"))->Fill(cent, fQ1131_01); + histos.get(HIST("Prof_Q1131_10"))->Fill(cent, fQ1131_10); + histos.get(HIST("Prof_Q1132_11"))->Fill(cent, fQ1132_11); + histos.get(HIST("Prof_Q1132_01"))->Fill(cent, fQ1132_01); + histos.get(HIST("Prof_Q1132_10"))->Fill(cent, fQ1132_10); + histos.get(HIST("Prof_Q1133_11"))->Fill(cent, fQ1133_11); + histos.get(HIST("Prof_Q1133_01"))->Fill(cent, fQ1133_01); + histos.get(HIST("Prof_Q1133_10"))->Fill(cent, fQ1133_10); + histos.get(HIST("Prof_Q2122_11"))->Fill(cent, fQ2122_11); + histos.get(HIST("Prof_Q2122_01"))->Fill(cent, fQ2122_01); + histos.get(HIST("Prof_Q2122_10"))->Fill(cent, fQ2122_10); + histos.get(HIST("Prof_Q3132_11"))->Fill(cent, fQ3132_11); + histos.get(HIST("Prof_Q3132_01"))->Fill(cent, fQ3132_01); + histos.get(HIST("Prof_Q3132_10"))->Fill(cent, fQ3132_10); + histos.get(HIST("Prof_Q3133_11"))->Fill(cent, fQ3133_11); + histos.get(HIST("Prof_Q3133_01"))->Fill(cent, fQ3133_01); + histos.get(HIST("Prof_Q3133_10"))->Fill(cent, fQ3133_10); + histos.get(HIST("Prof_Q3233_11"))->Fill(cent, fQ3233_11); + histos.get(HIST("Prof_Q3233_01"))->Fill(cent, fQ3233_01); + histos.get(HIST("Prof_Q3233_10"))->Fill(cent, fQ3233_10); + histos.get(HIST("Prof_Q2241_11"))->Fill(cent, fQ2241_11); + histos.get(HIST("Prof_Q2241_01"))->Fill(cent, fQ2241_01); + histos.get(HIST("Prof_Q2241_10"))->Fill(cent, fQ2241_10); + histos.get(HIST("Prof_Q2242_11"))->Fill(cent, fQ2242_11); + histos.get(HIST("Prof_Q2242_01"))->Fill(cent, fQ2242_01); + histos.get(HIST("Prof_Q2242_10"))->Fill(cent, fQ2242_10); + histos.get(HIST("Prof_Q2243_11"))->Fill(cent, fQ2243_11); + histos.get(HIST("Prof_Q2243_01"))->Fill(cent, fQ2243_01); + histos.get(HIST("Prof_Q2243_10"))->Fill(cent, fQ2243_10); + histos.get(HIST("Prof_Q2244_11"))->Fill(cent, fQ2244_11); + histos.get(HIST("Prof_Q2244_01"))->Fill(cent, fQ2244_01); + histos.get(HIST("Prof_Q2244_10"))->Fill(cent, fQ2244_10); + histos.get(HIST("Prof_Q2141_11"))->Fill(cent, fQ2141_11); + histos.get(HIST("Prof_Q2141_01"))->Fill(cent, fQ2141_01); + histos.get(HIST("Prof_Q2141_10"))->Fill(cent, fQ2141_10); + histos.get(HIST("Prof_Q2142_11"))->Fill(cent, fQ2142_11); + histos.get(HIST("Prof_Q2142_01"))->Fill(cent, fQ2142_01); + histos.get(HIST("Prof_Q2142_10"))->Fill(cent, fQ2142_10); + histos.get(HIST("Prof_Q2143_11"))->Fill(cent, fQ2143_11); + histos.get(HIST("Prof_Q2143_01"))->Fill(cent, fQ2143_01); + histos.get(HIST("Prof_Q2143_10"))->Fill(cent, fQ2143_10); + histos.get(HIST("Prof_Q2144_11"))->Fill(cent, fQ2144_11); + histos.get(HIST("Prof_Q2144_01"))->Fill(cent, fQ2144_01); + histos.get(HIST("Prof_Q2144_10"))->Fill(cent, fQ2144_10); + histos.get(HIST("Prof_Q1151_11"))->Fill(cent, fQ1151_11); + histos.get(HIST("Prof_Q1151_01"))->Fill(cent, fQ1151_01); + histos.get(HIST("Prof_Q1151_10"))->Fill(cent, fQ1151_10); + histos.get(HIST("Prof_Q1152_11"))->Fill(cent, fQ1152_11); + histos.get(HIST("Prof_Q1152_01"))->Fill(cent, fQ1152_01); + histos.get(HIST("Prof_Q1152_10"))->Fill(cent, fQ1152_10); + histos.get(HIST("Prof_Q1153_11"))->Fill(cent, fQ1153_11); + histos.get(HIST("Prof_Q1153_01"))->Fill(cent, fQ1153_01); + histos.get(HIST("Prof_Q1153_10"))->Fill(cent, fQ1153_10); + histos.get(HIST("Prof_Q1154_11"))->Fill(cent, fQ1154_11); + histos.get(HIST("Prof_Q1154_01"))->Fill(cent, fQ1154_01); + histos.get(HIST("Prof_Q1154_10"))->Fill(cent, fQ1154_10); + histos.get(HIST("Prof_Q1155_11"))->Fill(cent, fQ1155_11); + histos.get(HIST("Prof_Q1155_01"))->Fill(cent, fQ1155_01); + histos.get(HIST("Prof_Q1155_10"))->Fill(cent, fQ1155_10); + histos.get(HIST("Prof_Q112233_001"))->Fill(cent, fQ112233_001); + histos.get(HIST("Prof_Q112233_010"))->Fill(cent, fQ112233_010); + histos.get(HIST("Prof_Q112233_100"))->Fill(cent, fQ112233_100); + histos.get(HIST("Prof_Q112233_011"))->Fill(cent, fQ112233_011); + histos.get(HIST("Prof_Q112233_101"))->Fill(cent, fQ112233_101); + histos.get(HIST("Prof_Q112233_110"))->Fill(cent, fQ112233_110); + histos.get(HIST("Prof_Q112232_001"))->Fill(cent, fQ112232_001); + histos.get(HIST("Prof_Q112232_010"))->Fill(cent, fQ112232_010); + histos.get(HIST("Prof_Q112232_100"))->Fill(cent, fQ112232_100); + histos.get(HIST("Prof_Q112232_011"))->Fill(cent, fQ112232_011); + histos.get(HIST("Prof_Q112232_101"))->Fill(cent, fQ112232_101); + histos.get(HIST("Prof_Q112232_110"))->Fill(cent, fQ112232_110); + histos.get(HIST("Prof_Q112231_001"))->Fill(cent, fQ112231_001); + histos.get(HIST("Prof_Q112231_010"))->Fill(cent, fQ112231_010); + histos.get(HIST("Prof_Q112231_100"))->Fill(cent, fQ112231_100); + histos.get(HIST("Prof_Q112231_011"))->Fill(cent, fQ112231_011); + histos.get(HIST("Prof_Q112231_101"))->Fill(cent, fQ112231_101); + histos.get(HIST("Prof_Q112231_110"))->Fill(cent, fQ112231_110); + histos.get(HIST("Prof_Q112133_001"))->Fill(cent, fQ112133_001); + histos.get(HIST("Prof_Q112133_010"))->Fill(cent, fQ112133_010); + histos.get(HIST("Prof_Q112133_100"))->Fill(cent, fQ112133_100); + histos.get(HIST("Prof_Q112133_011"))->Fill(cent, fQ112133_011); + histos.get(HIST("Prof_Q112133_101"))->Fill(cent, fQ112133_101); + histos.get(HIST("Prof_Q112133_110"))->Fill(cent, fQ112133_110); + histos.get(HIST("Prof_Q112132_001"))->Fill(cent, fQ112132_001); + histos.get(HIST("Prof_Q112132_010"))->Fill(cent, fQ112132_010); + histos.get(HIST("Prof_Q112132_100"))->Fill(cent, fQ112132_100); + histos.get(HIST("Prof_Q112132_011"))->Fill(cent, fQ112132_011); + histos.get(HIST("Prof_Q112132_101"))->Fill(cent, fQ112132_101); + histos.get(HIST("Prof_Q112132_110"))->Fill(cent, fQ112132_110); + histos.get(HIST("Prof_Q112131_001"))->Fill(cent, fQ112131_001); + histos.get(HIST("Prof_Q112131_010"))->Fill(cent, fQ112131_010); + histos.get(HIST("Prof_Q112131_100"))->Fill(cent, fQ112131_100); + histos.get(HIST("Prof_Q112131_011"))->Fill(cent, fQ112131_011); + histos.get(HIST("Prof_Q112131_101"))->Fill(cent, fQ112131_101); + histos.get(HIST("Prof_Q112131_110"))->Fill(cent, fQ112131_110); + histos.get(HIST("Prof_Q2221_11"))->Fill(cent, fQ2221_11); + histos.get(HIST("Prof_Q2221_01"))->Fill(cent, fQ2221_01); + histos.get(HIST("Prof_Q2221_10"))->Fill(cent, fQ2221_10); + histos.get(HIST("Prof_Q2221_21"))->Fill(cent, fQ2221_21); + histos.get(HIST("Prof_Q2221_20"))->Fill(cent, fQ2221_20); + histos.get(HIST("Prof_Q2122_21"))->Fill(cent, fQ2122_21); + histos.get(HIST("Prof_Q2122_20"))->Fill(cent, fQ2122_20); + histos.get(HIST("Prof_Q1121_02"))->Fill(cent, fQ1121_02); + histos.get(HIST("Prof_Q1121_12"))->Fill(cent, fQ1121_12); + histos.get(HIST("Prof_Q1121_22"))->Fill(cent, fQ1121_22); + histos.get(HIST("Prof_Q1122_02"))->Fill(cent, fQ1122_02); + histos.get(HIST("Prof_Q1122_12"))->Fill(cent, fQ1122_12); + histos.get(HIST("Prof_Q1122_22"))->Fill(cent, fQ1122_22); + histos.get(HIST("Prof_Q112221_001"))->Fill(cent, fQ112221_001); + histos.get(HIST("Prof_Q112221_010"))->Fill(cent, fQ112221_010); + histos.get(HIST("Prof_Q112221_100"))->Fill(cent, fQ112221_100); + histos.get(HIST("Prof_Q112221_011"))->Fill(cent, fQ112221_011); + histos.get(HIST("Prof_Q112221_101"))->Fill(cent, fQ112221_101); + histos.get(HIST("Prof_Q112221_110"))->Fill(cent, fQ112221_110); + histos.get(HIST("Prof_Q112221_200"))->Fill(cent, fQ112221_200); + histos.get(HIST("Prof_Q112221_201"))->Fill(cent, fQ112221_201); + histos.get(HIST("Prof_Q112221_210"))->Fill(cent, fQ112221_210); + histos.get(HIST("Prof_Q112221_211"))->Fill(cent, fQ112221_211); + histos.get(HIST("Prof_Q1131_21"))->Fill(cent, fQ1131_21); + histos.get(HIST("Prof_Q1131_20"))->Fill(cent, fQ1131_20); + histos.get(HIST("Prof_Q1131_31"))->Fill(cent, fQ1131_31); + histos.get(HIST("Prof_Q1131_30"))->Fill(cent, fQ1131_30); + histos.get(HIST("Prof_Q1132_21"))->Fill(cent, fQ1132_21); + histos.get(HIST("Prof_Q1132_20"))->Fill(cent, fQ1132_20); + histos.get(HIST("Prof_Q1132_31"))->Fill(cent, fQ1132_31); + histos.get(HIST("Prof_Q1132_30"))->Fill(cent, fQ1132_30); + histos.get(HIST("Prof_Q1133_21"))->Fill(cent, fQ1133_21); + histos.get(HIST("Prof_Q1133_20"))->Fill(cent, fQ1133_20); + histos.get(HIST("Prof_Q1133_31"))->Fill(cent, fQ1133_31); + histos.get(HIST("Prof_Q1133_30"))->Fill(cent, fQ1133_30); + histos.get(HIST("Prof_Q11_5"))->Fill(cent, fQ11_5); + histos.get(HIST("Prof_Q11_6"))->Fill(cent, fQ11_6); + histos.get(HIST("Prof_Q1121_30"))->Fill(cent, fQ1121_30); + histos.get(HIST("Prof_Q1121_31"))->Fill(cent, fQ1121_31); + histos.get(HIST("Prof_Q1121_40"))->Fill(cent, fQ1121_40); + histos.get(HIST("Prof_Q1121_41"))->Fill(cent, fQ1121_41); + histos.get(HIST("Prof_Q1122_30"))->Fill(cent, fQ1122_30); + histos.get(HIST("Prof_Q1122_31"))->Fill(cent, fQ1122_31); + histos.get(HIST("Prof_Q1122_40"))->Fill(cent, fQ1122_40); + histos.get(HIST("Prof_Q1122_41"))->Fill(cent, fQ1122_41); + histos.get(HIST("Prof_Q2211_11"))->Fill(cent, fQ2211_11); + histos.get(HIST("Prof_Q2211_01"))->Fill(cent, fQ2211_01); + histos.get(HIST("Prof_Q2211_10"))->Fill(cent, fQ2211_10); + histos.get(HIST("Prof_Q2211_20"))->Fill(cent, fQ2211_20); + histos.get(HIST("Prof_Q2211_21"))->Fill(cent, fQ2211_21); + histos.get(HIST("Prof_Q2111_11"))->Fill(cent, fQ2111_11); + histos.get(HIST("Prof_Q2111_01"))->Fill(cent, fQ2111_01); + histos.get(HIST("Prof_Q2111_10"))->Fill(cent, fQ2111_10); + histos.get(HIST("Prof_Q2111_20"))->Fill(cent, fQ2111_20); + histos.get(HIST("Prof_Q2111_21"))->Fill(cent, fQ2111_21); + histos.get(HIST("Prof_Q112122_001"))->Fill(cent, fQ112122_001); + histos.get(HIST("Prof_Q112122_010"))->Fill(cent, fQ112122_010); + histos.get(HIST("Prof_Q112122_100"))->Fill(cent, fQ112122_100); + histos.get(HIST("Prof_Q112122_011"))->Fill(cent, fQ112122_011); + histos.get(HIST("Prof_Q112122_101"))->Fill(cent, fQ112122_101); + histos.get(HIST("Prof_Q112122_110"))->Fill(cent, fQ112122_110); + histos.get(HIST("Prof_Q1141_11"))->Fill(cent, fQ1141_11); + histos.get(HIST("Prof_Q1141_01"))->Fill(cent, fQ1141_01); + histos.get(HIST("Prof_Q1141_10"))->Fill(cent, fQ1141_10); + histos.get(HIST("Prof_Q1141_20"))->Fill(cent, fQ1141_20); + histos.get(HIST("Prof_Q1141_21"))->Fill(cent, fQ1141_21); + histos.get(HIST("Prof_Q1142_11"))->Fill(cent, fQ1142_11); + histos.get(HIST("Prof_Q1142_01"))->Fill(cent, fQ1142_01); + histos.get(HIST("Prof_Q1142_10"))->Fill(cent, fQ1142_10); + histos.get(HIST("Prof_Q1142_20"))->Fill(cent, fQ1142_20); + histos.get(HIST("Prof_Q1142_21"))->Fill(cent, fQ1142_21); + histos.get(HIST("Prof_Q1143_11"))->Fill(cent, fQ1143_11); + histos.get(HIST("Prof_Q1143_01"))->Fill(cent, fQ1143_01); + histos.get(HIST("Prof_Q1143_10"))->Fill(cent, fQ1143_10); + histos.get(HIST("Prof_Q1143_20"))->Fill(cent, fQ1143_20); + histos.get(HIST("Prof_Q1143_21"))->Fill(cent, fQ1143_21); + histos.get(HIST("Prof_Q1144_11"))->Fill(cent, fQ1144_11); + histos.get(HIST("Prof_Q1144_01"))->Fill(cent, fQ1144_01); + histos.get(HIST("Prof_Q1144_10"))->Fill(cent, fQ1144_10); + histos.get(HIST("Prof_Q1144_20"))->Fill(cent, fQ1144_20); + histos.get(HIST("Prof_Q1144_21"))->Fill(cent, fQ1144_21); + histos.get(HIST("Prof_Q2131_11"))->Fill(cent, fQ2131_11); + histos.get(HIST("Prof_Q2131_01"))->Fill(cent, fQ2131_01); + histos.get(HIST("Prof_Q2131_10"))->Fill(cent, fQ2131_10); + histos.get(HIST("Prof_Q2132_11"))->Fill(cent, fQ2132_11); + histos.get(HIST("Prof_Q2132_01"))->Fill(cent, fQ2132_01); + histos.get(HIST("Prof_Q2132_10"))->Fill(cent, fQ2132_10); + histos.get(HIST("Prof_Q2133_11"))->Fill(cent, fQ2133_11); + histos.get(HIST("Prof_Q2133_01"))->Fill(cent, fQ2133_01); + histos.get(HIST("Prof_Q2133_10"))->Fill(cent, fQ2133_10); + histos.get(HIST("Prof_Q2231_11"))->Fill(cent, fQ2231_11); + histos.get(HIST("Prof_Q2231_01"))->Fill(cent, fQ2231_01); + histos.get(HIST("Prof_Q2231_10"))->Fill(cent, fQ2231_10); + histos.get(HIST("Prof_Q2232_11"))->Fill(cent, fQ2232_11); + histos.get(HIST("Prof_Q2232_01"))->Fill(cent, fQ2232_01); + histos.get(HIST("Prof_Q2232_10"))->Fill(cent, fQ2232_10); + histos.get(HIST("Prof_Q2233_11"))->Fill(cent, fQ2233_11); + histos.get(HIST("Prof_Q2233_01"))->Fill(cent, fQ2233_01); + histos.get(HIST("Prof_Q2233_10"))->Fill(cent, fQ2233_10); + histos.get(HIST("Prof_Q51_1"))->Fill(cent, fQ51_1); + histos.get(HIST("Prof_Q52_1"))->Fill(cent, fQ52_1); + histos.get(HIST("Prof_Q53_1"))->Fill(cent, fQ53_1); + histos.get(HIST("Prof_Q54_1"))->Fill(cent, fQ54_1); + histos.get(HIST("Prof_Q55_1"))->Fill(cent, fQ55_1); + histos.get(HIST("Prof_Q21_3"))->Fill(cent, fQ21_3); + histos.get(HIST("Prof_Q22_3"))->Fill(cent, fQ22_3); + histos.get(HIST("Prof_Q31_2"))->Fill(cent, fQ31_2); + histos.get(HIST("Prof_Q32_2"))->Fill(cent, fQ32_2); + histos.get(HIST("Prof_Q33_2"))->Fill(cent, fQ33_2); + histos.get(HIST("Prof_Q61_1"))->Fill(cent, fQ61_1); + histos.get(HIST("Prof_Q62_1"))->Fill(cent, fQ62_1); + histos.get(HIST("Prof_Q63_1"))->Fill(cent, fQ63_1); + histos.get(HIST("Prof_Q64_1"))->Fill(cent, fQ64_1); + histos.get(HIST("Prof_Q65_1"))->Fill(cent, fQ65_1); + histos.get(HIST("Prof_Q66_1"))->Fill(cent, fQ66_1); + histos.get(HIST("Prof_Q112122_111"))->Fill(cent, fQ112122_111); + histos.get(HIST("Prof_Q112131_111"))->Fill(cent, fQ112131_111); + histos.get(HIST("Prof_Q112132_111"))->Fill(cent, fQ112132_111); + histos.get(HIST("Prof_Q112133_111"))->Fill(cent, fQ112133_111); + histos.get(HIST("Prof_Q112231_111"))->Fill(cent, fQ112231_111); + histos.get(HIST("Prof_Q112232_111"))->Fill(cent, fQ112232_111); + histos.get(HIST("Prof_Q112233_111"))->Fill(cent, fQ112233_111); + histos.get(HIST("Prof_Q112221_111"))->Fill(cent, fQ112221_111); + } + + if (cfgIsCalculateError) { + // selecting subsample and filling profiles + float lRandom = fRndm->Rndm(); + int sampleIndex = static_cast(cfgNSubsample * lRandom); + + histos.get(HIST("Prof2D_mu1_antiproton"))->Fill(cent, sampleIndex, std::pow(netProt, 1.0)); + histos.get(HIST("Prof2D_mu2_antiproton"))->Fill(cent, sampleIndex, std::pow(netProt, 2.0)); + histos.get(HIST("Prof2D_mu3_antiproton"))->Fill(cent, sampleIndex, std::pow(netProt, 3.0)); + histos.get(HIST("Prof2D_mu4_antiproton"))->Fill(cent, sampleIndex, std::pow(netProt, 4.0)); + histos.get(HIST("Prof2D_mu5_antiproton"))->Fill(cent, sampleIndex, std::pow(netProt, 5.0)); + histos.get(HIST("Prof2D_mu6_antiproton"))->Fill(cent, sampleIndex, std::pow(netProt, 6.0)); + histos.get(HIST("Prof2D_mu7_antiproton"))->Fill(cent, sampleIndex, std::pow(netProt, 7.0)); + histos.get(HIST("Prof2D_mu8_antiproton"))->Fill(cent, sampleIndex, std::pow(netProt, 8.0)); + + histos.get(HIST("Prof2D_Q11_1"))->Fill(cent, sampleIndex, fQ11_1); + histos.get(HIST("Prof2D_Q11_2"))->Fill(cent, sampleIndex, fQ11_2); + histos.get(HIST("Prof2D_Q11_3"))->Fill(cent, sampleIndex, fQ11_3); + histos.get(HIST("Prof2D_Q11_4"))->Fill(cent, sampleIndex, fQ11_4); + histos.get(HIST("Prof2D_Q21_1"))->Fill(cent, sampleIndex, fQ21_1); + histos.get(HIST("Prof2D_Q22_1"))->Fill(cent, sampleIndex, fQ22_1); + histos.get(HIST("Prof2D_Q31_1"))->Fill(cent, sampleIndex, fQ31_1); + histos.get(HIST("Prof2D_Q32_1"))->Fill(cent, sampleIndex, fQ32_1); + histos.get(HIST("Prof2D_Q33_1"))->Fill(cent, sampleIndex, fQ33_1); + histos.get(HIST("Prof2D_Q41_1"))->Fill(cent, sampleIndex, fQ41_1); + histos.get(HIST("Prof2D_Q42_1"))->Fill(cent, sampleIndex, fQ42_1); + histos.get(HIST("Prof2D_Q43_1"))->Fill(cent, sampleIndex, fQ43_1); + histos.get(HIST("Prof2D_Q44_1"))->Fill(cent, sampleIndex, fQ44_1); + histos.get(HIST("Prof2D_Q21_2"))->Fill(cent, sampleIndex, fQ21_2); + histos.get(HIST("Prof2D_Q22_2"))->Fill(cent, sampleIndex, fQ22_2); + histos.get(HIST("Prof2D_Q1121_11"))->Fill(cent, sampleIndex, fQ1121_11); + histos.get(HIST("Prof2D_Q1121_01"))->Fill(cent, sampleIndex, fQ1121_01); + histos.get(HIST("Prof2D_Q1121_10"))->Fill(cent, sampleIndex, fQ1121_10); + histos.get(HIST("Prof2D_Q1121_20"))->Fill(cent, sampleIndex, fQ1121_20); + histos.get(HIST("Prof2D_Q1121_21"))->Fill(cent, sampleIndex, fQ1121_21); + histos.get(HIST("Prof2D_Q1122_11"))->Fill(cent, sampleIndex, fQ1122_11); + histos.get(HIST("Prof2D_Q1122_01"))->Fill(cent, sampleIndex, fQ1122_01); + histos.get(HIST("Prof2D_Q1122_10"))->Fill(cent, sampleIndex, fQ1122_10); + histos.get(HIST("Prof2D_Q1122_20"))->Fill(cent, sampleIndex, fQ1122_20); + histos.get(HIST("Prof2D_Q1122_21"))->Fill(cent, sampleIndex, fQ1122_21); + histos.get(HIST("Prof2D_Q1131_11"))->Fill(cent, sampleIndex, fQ1131_11); + histos.get(HIST("Prof2D_Q1131_01"))->Fill(cent, sampleIndex, fQ1131_01); + histos.get(HIST("Prof2D_Q1131_10"))->Fill(cent, sampleIndex, fQ1131_10); + histos.get(HIST("Prof2D_Q1132_11"))->Fill(cent, sampleIndex, fQ1132_11); + histos.get(HIST("Prof2D_Q1132_01"))->Fill(cent, sampleIndex, fQ1132_01); + histos.get(HIST("Prof2D_Q1132_10"))->Fill(cent, sampleIndex, fQ1132_10); + histos.get(HIST("Prof2D_Q1133_11"))->Fill(cent, sampleIndex, fQ1133_11); + histos.get(HIST("Prof2D_Q1133_01"))->Fill(cent, sampleIndex, fQ1133_01); + histos.get(HIST("Prof2D_Q1133_10"))->Fill(cent, sampleIndex, fQ1133_10); + histos.get(HIST("Prof2D_Q2122_11"))->Fill(cent, sampleIndex, fQ2122_11); + histos.get(HIST("Prof2D_Q2122_01"))->Fill(cent, sampleIndex, fQ2122_01); + histos.get(HIST("Prof2D_Q2122_10"))->Fill(cent, sampleIndex, fQ2122_10); + histos.get(HIST("Prof2D_Q3132_11"))->Fill(cent, sampleIndex, fQ3132_11); + histos.get(HIST("Prof2D_Q3132_01"))->Fill(cent, sampleIndex, fQ3132_01); + histos.get(HIST("Prof2D_Q3132_10"))->Fill(cent, sampleIndex, fQ3132_10); + histos.get(HIST("Prof2D_Q3133_11"))->Fill(cent, sampleIndex, fQ3133_11); + histos.get(HIST("Prof2D_Q3133_01"))->Fill(cent, sampleIndex, fQ3133_01); + histos.get(HIST("Prof2D_Q3133_10"))->Fill(cent, sampleIndex, fQ3133_10); + histos.get(HIST("Prof2D_Q3233_11"))->Fill(cent, sampleIndex, fQ3233_11); + histos.get(HIST("Prof2D_Q3233_01"))->Fill(cent, sampleIndex, fQ3233_01); + histos.get(HIST("Prof2D_Q3233_10"))->Fill(cent, sampleIndex, fQ3233_10); + histos.get(HIST("Prof2D_Q2241_11"))->Fill(cent, sampleIndex, fQ2241_11); + histos.get(HIST("Prof2D_Q2241_01"))->Fill(cent, sampleIndex, fQ2241_01); + histos.get(HIST("Prof2D_Q2241_10"))->Fill(cent, sampleIndex, fQ2241_10); + histos.get(HIST("Prof2D_Q2242_11"))->Fill(cent, sampleIndex, fQ2242_11); + histos.get(HIST("Prof2D_Q2242_01"))->Fill(cent, sampleIndex, fQ2242_01); + histos.get(HIST("Prof2D_Q2242_10"))->Fill(cent, sampleIndex, fQ2242_10); + histos.get(HIST("Prof2D_Q2243_11"))->Fill(cent, sampleIndex, fQ2243_11); + histos.get(HIST("Prof2D_Q2243_01"))->Fill(cent, sampleIndex, fQ2243_01); + histos.get(HIST("Prof2D_Q2243_10"))->Fill(cent, sampleIndex, fQ2243_10); + histos.get(HIST("Prof2D_Q2244_11"))->Fill(cent, sampleIndex, fQ2244_11); + histos.get(HIST("Prof2D_Q2244_01"))->Fill(cent, sampleIndex, fQ2244_01); + histos.get(HIST("Prof2D_Q2244_10"))->Fill(cent, sampleIndex, fQ2244_10); + histos.get(HIST("Prof2D_Q2141_11"))->Fill(cent, sampleIndex, fQ2141_11); + histos.get(HIST("Prof2D_Q2141_01"))->Fill(cent, sampleIndex, fQ2141_01); + histos.get(HIST("Prof2D_Q2141_10"))->Fill(cent, sampleIndex, fQ2141_10); + histos.get(HIST("Prof2D_Q2142_11"))->Fill(cent, sampleIndex, fQ2142_11); + histos.get(HIST("Prof2D_Q2142_01"))->Fill(cent, sampleIndex, fQ2142_01); + histos.get(HIST("Prof2D_Q2142_10"))->Fill(cent, sampleIndex, fQ2142_10); + histos.get(HIST("Prof2D_Q2143_11"))->Fill(cent, sampleIndex, fQ2143_11); + histos.get(HIST("Prof2D_Q2143_01"))->Fill(cent, sampleIndex, fQ2143_01); + histos.get(HIST("Prof2D_Q2143_10"))->Fill(cent, sampleIndex, fQ2143_10); + histos.get(HIST("Prof2D_Q2144_11"))->Fill(cent, sampleIndex, fQ2144_11); + histos.get(HIST("Prof2D_Q2144_01"))->Fill(cent, sampleIndex, fQ2144_01); + histos.get(HIST("Prof2D_Q2144_10"))->Fill(cent, sampleIndex, fQ2144_10); + histos.get(HIST("Prof2D_Q1151_11"))->Fill(cent, sampleIndex, fQ1151_11); + histos.get(HIST("Prof2D_Q1151_01"))->Fill(cent, sampleIndex, fQ1151_01); + histos.get(HIST("Prof2D_Q1151_10"))->Fill(cent, sampleIndex, fQ1151_10); + histos.get(HIST("Prof2D_Q1152_11"))->Fill(cent, sampleIndex, fQ1152_11); + histos.get(HIST("Prof2D_Q1152_01"))->Fill(cent, sampleIndex, fQ1152_01); + histos.get(HIST("Prof2D_Q1152_10"))->Fill(cent, sampleIndex, fQ1152_10); + histos.get(HIST("Prof2D_Q1153_11"))->Fill(cent, sampleIndex, fQ1153_11); + histos.get(HIST("Prof2D_Q1153_01"))->Fill(cent, sampleIndex, fQ1153_01); + histos.get(HIST("Prof2D_Q1153_10"))->Fill(cent, sampleIndex, fQ1153_10); + histos.get(HIST("Prof2D_Q1154_11"))->Fill(cent, sampleIndex, fQ1154_11); + histos.get(HIST("Prof2D_Q1154_01"))->Fill(cent, sampleIndex, fQ1154_01); + histos.get(HIST("Prof2D_Q1154_10"))->Fill(cent, sampleIndex, fQ1154_10); + histos.get(HIST("Prof2D_Q1155_11"))->Fill(cent, sampleIndex, fQ1155_11); + histos.get(HIST("Prof2D_Q1155_01"))->Fill(cent, sampleIndex, fQ1155_01); + histos.get(HIST("Prof2D_Q1155_10"))->Fill(cent, sampleIndex, fQ1155_10); + histos.get(HIST("Prof2D_Q112233_001"))->Fill(cent, sampleIndex, fQ112233_001); + histos.get(HIST("Prof2D_Q112233_010"))->Fill(cent, sampleIndex, fQ112233_010); + histos.get(HIST("Prof2D_Q112233_100"))->Fill(cent, sampleIndex, fQ112233_100); + histos.get(HIST("Prof2D_Q112233_011"))->Fill(cent, sampleIndex, fQ112233_011); + histos.get(HIST("Prof2D_Q112233_101"))->Fill(cent, sampleIndex, fQ112233_101); + histos.get(HIST("Prof2D_Q112233_110"))->Fill(cent, sampleIndex, fQ112233_110); + histos.get(HIST("Prof2D_Q112232_001"))->Fill(cent, sampleIndex, fQ112232_001); + histos.get(HIST("Prof2D_Q112232_010"))->Fill(cent, sampleIndex, fQ112232_010); + histos.get(HIST("Prof2D_Q112232_100"))->Fill(cent, sampleIndex, fQ112232_100); + histos.get(HIST("Prof2D_Q112232_011"))->Fill(cent, sampleIndex, fQ112232_011); + histos.get(HIST("Prof2D_Q112232_101"))->Fill(cent, sampleIndex, fQ112232_101); + histos.get(HIST("Prof2D_Q112232_110"))->Fill(cent, sampleIndex, fQ112232_110); + histos.get(HIST("Prof2D_Q112231_001"))->Fill(cent, sampleIndex, fQ112231_001); + histos.get(HIST("Prof2D_Q112231_010"))->Fill(cent, sampleIndex, fQ112231_010); + histos.get(HIST("Prof2D_Q112231_100"))->Fill(cent, sampleIndex, fQ112231_100); + histos.get(HIST("Prof2D_Q112231_011"))->Fill(cent, sampleIndex, fQ112231_011); + histos.get(HIST("Prof2D_Q112231_101"))->Fill(cent, sampleIndex, fQ112231_101); + histos.get(HIST("Prof2D_Q112231_110"))->Fill(cent, sampleIndex, fQ112231_110); + histos.get(HIST("Prof2D_Q112133_001"))->Fill(cent, sampleIndex, fQ112133_001); + histos.get(HIST("Prof2D_Q112133_010"))->Fill(cent, sampleIndex, fQ112133_010); + histos.get(HIST("Prof2D_Q112133_100"))->Fill(cent, sampleIndex, fQ112133_100); + histos.get(HIST("Prof2D_Q112133_011"))->Fill(cent, sampleIndex, fQ112133_011); + histos.get(HIST("Prof2D_Q112133_101"))->Fill(cent, sampleIndex, fQ112133_101); + histos.get(HIST("Prof2D_Q112133_110"))->Fill(cent, sampleIndex, fQ112133_110); + histos.get(HIST("Prof2D_Q112132_001"))->Fill(cent, sampleIndex, fQ112132_001); + histos.get(HIST("Prof2D_Q112132_010"))->Fill(cent, sampleIndex, fQ112132_010); + histos.get(HIST("Prof2D_Q112132_100"))->Fill(cent, sampleIndex, fQ112132_100); + histos.get(HIST("Prof2D_Q112132_011"))->Fill(cent, sampleIndex, fQ112132_011); + histos.get(HIST("Prof2D_Q112132_101"))->Fill(cent, sampleIndex, fQ112132_101); + histos.get(HIST("Prof2D_Q112132_110"))->Fill(cent, sampleIndex, fQ112132_110); + histos.get(HIST("Prof2D_Q112131_001"))->Fill(cent, sampleIndex, fQ112131_001); + histos.get(HIST("Prof2D_Q112131_010"))->Fill(cent, sampleIndex, fQ112131_010); + histos.get(HIST("Prof2D_Q112131_100"))->Fill(cent, sampleIndex, fQ112131_100); + histos.get(HIST("Prof2D_Q112131_011"))->Fill(cent, sampleIndex, fQ112131_011); + histos.get(HIST("Prof2D_Q112131_101"))->Fill(cent, sampleIndex, fQ112131_101); + histos.get(HIST("Prof2D_Q112131_110"))->Fill(cent, sampleIndex, fQ112131_110); + histos.get(HIST("Prof2D_Q2221_11"))->Fill(cent, sampleIndex, fQ2221_11); + histos.get(HIST("Prof2D_Q2221_01"))->Fill(cent, sampleIndex, fQ2221_01); + histos.get(HIST("Prof2D_Q2221_10"))->Fill(cent, sampleIndex, fQ2221_10); + histos.get(HIST("Prof2D_Q2221_21"))->Fill(cent, sampleIndex, fQ2221_21); + histos.get(HIST("Prof2D_Q2221_20"))->Fill(cent, sampleIndex, fQ2221_20); + histos.get(HIST("Prof2D_Q2122_21"))->Fill(cent, sampleIndex, fQ2122_21); + histos.get(HIST("Prof2D_Q2122_20"))->Fill(cent, sampleIndex, fQ2122_20); + histos.get(HIST("Prof2D_Q1121_02"))->Fill(cent, sampleIndex, fQ1121_02); + histos.get(HIST("Prof2D_Q1121_12"))->Fill(cent, sampleIndex, fQ1121_12); + histos.get(HIST("Prof2D_Q1121_22"))->Fill(cent, sampleIndex, fQ1121_22); + histos.get(HIST("Prof2D_Q1122_02"))->Fill(cent, sampleIndex, fQ1122_02); + histos.get(HIST("Prof2D_Q1122_12"))->Fill(cent, sampleIndex, fQ1122_12); + histos.get(HIST("Prof2D_Q1122_22"))->Fill(cent, sampleIndex, fQ1122_22); + histos.get(HIST("Prof2D_Q112221_001"))->Fill(cent, sampleIndex, fQ112221_001); + histos.get(HIST("Prof2D_Q112221_010"))->Fill(cent, sampleIndex, fQ112221_010); + histos.get(HIST("Prof2D_Q112221_100"))->Fill(cent, sampleIndex, fQ112221_100); + histos.get(HIST("Prof2D_Q112221_011"))->Fill(cent, sampleIndex, fQ112221_011); + histos.get(HIST("Prof2D_Q112221_101"))->Fill(cent, sampleIndex, fQ112221_101); + histos.get(HIST("Prof2D_Q112221_110"))->Fill(cent, sampleIndex, fQ112221_110); + histos.get(HIST("Prof2D_Q112221_200"))->Fill(cent, sampleIndex, fQ112221_200); + histos.get(HIST("Prof2D_Q112221_201"))->Fill(cent, sampleIndex, fQ112221_201); + histos.get(HIST("Prof2D_Q112221_210"))->Fill(cent, sampleIndex, fQ112221_210); + histos.get(HIST("Prof2D_Q112221_211"))->Fill(cent, sampleIndex, fQ112221_211); + histos.get(HIST("Prof2D_Q1131_21"))->Fill(cent, sampleIndex, fQ1131_21); + histos.get(HIST("Prof2D_Q1131_20"))->Fill(cent, sampleIndex, fQ1131_20); + histos.get(HIST("Prof2D_Q1131_31"))->Fill(cent, sampleIndex, fQ1131_31); + histos.get(HIST("Prof2D_Q1131_30"))->Fill(cent, sampleIndex, fQ1131_30); + histos.get(HIST("Prof2D_Q1132_21"))->Fill(cent, sampleIndex, fQ1132_21); + histos.get(HIST("Prof2D_Q1132_20"))->Fill(cent, sampleIndex, fQ1132_20); + histos.get(HIST("Prof2D_Q1132_31"))->Fill(cent, sampleIndex, fQ1132_31); + histos.get(HIST("Prof2D_Q1132_30"))->Fill(cent, sampleIndex, fQ1132_30); + histos.get(HIST("Prof2D_Q1133_21"))->Fill(cent, sampleIndex, fQ1133_21); + histos.get(HIST("Prof2D_Q1133_20"))->Fill(cent, sampleIndex, fQ1133_20); + histos.get(HIST("Prof2D_Q1133_31"))->Fill(cent, sampleIndex, fQ1133_31); + histos.get(HIST("Prof2D_Q1133_30"))->Fill(cent, sampleIndex, fQ1133_30); + histos.get(HIST("Prof2D_Q11_5"))->Fill(cent, sampleIndex, fQ11_5); + histos.get(HIST("Prof2D_Q11_6"))->Fill(cent, sampleIndex, fQ11_6); + histos.get(HIST("Prof2D_Q1121_30"))->Fill(cent, sampleIndex, fQ1121_30); + histos.get(HIST("Prof2D_Q1121_31"))->Fill(cent, sampleIndex, fQ1121_31); + histos.get(HIST("Prof2D_Q1121_40"))->Fill(cent, sampleIndex, fQ1121_40); + histos.get(HIST("Prof2D_Q1121_41"))->Fill(cent, sampleIndex, fQ1121_41); + histos.get(HIST("Prof2D_Q1122_30"))->Fill(cent, sampleIndex, fQ1122_30); + histos.get(HIST("Prof2D_Q1122_31"))->Fill(cent, sampleIndex, fQ1122_31); + histos.get(HIST("Prof2D_Q1122_40"))->Fill(cent, sampleIndex, fQ1122_40); + histos.get(HIST("Prof2D_Q1122_41"))->Fill(cent, sampleIndex, fQ1122_41); + histos.get(HIST("Prof2D_Q2211_11"))->Fill(cent, sampleIndex, fQ2211_11); + histos.get(HIST("Prof2D_Q2211_01"))->Fill(cent, sampleIndex, fQ2211_01); + histos.get(HIST("Prof2D_Q2211_10"))->Fill(cent, sampleIndex, fQ2211_10); + histos.get(HIST("Prof2D_Q2211_20"))->Fill(cent, sampleIndex, fQ2211_20); + histos.get(HIST("Prof2D_Q2211_21"))->Fill(cent, sampleIndex, fQ2211_21); + histos.get(HIST("Prof2D_Q2111_11"))->Fill(cent, sampleIndex, fQ2111_11); + histos.get(HIST("Prof2D_Q2111_01"))->Fill(cent, sampleIndex, fQ2111_01); + histos.get(HIST("Prof2D_Q2111_10"))->Fill(cent, sampleIndex, fQ2111_10); + histos.get(HIST("Prof2D_Q2111_20"))->Fill(cent, sampleIndex, fQ2111_20); + histos.get(HIST("Prof2D_Q2111_21"))->Fill(cent, sampleIndex, fQ2111_21); + histos.get(HIST("Prof2D_Q112122_001"))->Fill(cent, sampleIndex, fQ112122_001); + histos.get(HIST("Prof2D_Q112122_010"))->Fill(cent, sampleIndex, fQ112122_010); + histos.get(HIST("Prof2D_Q112122_100"))->Fill(cent, sampleIndex, fQ112122_100); + histos.get(HIST("Prof2D_Q112122_011"))->Fill(cent, sampleIndex, fQ112122_011); + histos.get(HIST("Prof2D_Q112122_101"))->Fill(cent, sampleIndex, fQ112122_101); + histos.get(HIST("Prof2D_Q112122_110"))->Fill(cent, sampleIndex, fQ112122_110); + histos.get(HIST("Prof2D_Q1141_11"))->Fill(cent, sampleIndex, fQ1141_11); + histos.get(HIST("Prof2D_Q1141_01"))->Fill(cent, sampleIndex, fQ1141_01); + histos.get(HIST("Prof2D_Q1141_10"))->Fill(cent, sampleIndex, fQ1141_10); + histos.get(HIST("Prof2D_Q1141_20"))->Fill(cent, sampleIndex, fQ1141_20); + histos.get(HIST("Prof2D_Q1141_21"))->Fill(cent, sampleIndex, fQ1141_21); + histos.get(HIST("Prof2D_Q1142_11"))->Fill(cent, sampleIndex, fQ1142_11); + histos.get(HIST("Prof2D_Q1142_01"))->Fill(cent, sampleIndex, fQ1142_01); + histos.get(HIST("Prof2D_Q1142_10"))->Fill(cent, sampleIndex, fQ1142_10); + histos.get(HIST("Prof2D_Q1142_20"))->Fill(cent, sampleIndex, fQ1142_20); + histos.get(HIST("Prof2D_Q1142_21"))->Fill(cent, sampleIndex, fQ1142_21); + histos.get(HIST("Prof2D_Q1143_11"))->Fill(cent, sampleIndex, fQ1143_11); + histos.get(HIST("Prof2D_Q1143_01"))->Fill(cent, sampleIndex, fQ1143_01); + histos.get(HIST("Prof2D_Q1143_10"))->Fill(cent, sampleIndex, fQ1143_10); + histos.get(HIST("Prof2D_Q1143_20"))->Fill(cent, sampleIndex, fQ1143_20); + histos.get(HIST("Prof2D_Q1143_21"))->Fill(cent, sampleIndex, fQ1143_21); + histos.get(HIST("Prof2D_Q1144_11"))->Fill(cent, sampleIndex, fQ1144_11); + histos.get(HIST("Prof2D_Q1144_01"))->Fill(cent, sampleIndex, fQ1144_01); + histos.get(HIST("Prof2D_Q1144_10"))->Fill(cent, sampleIndex, fQ1144_10); + histos.get(HIST("Prof2D_Q1144_20"))->Fill(cent, sampleIndex, fQ1144_20); + histos.get(HIST("Prof2D_Q1144_21"))->Fill(cent, sampleIndex, fQ1144_21); + histos.get(HIST("Prof2D_Q2131_11"))->Fill(cent, sampleIndex, fQ2131_11); + histos.get(HIST("Prof2D_Q2131_01"))->Fill(cent, sampleIndex, fQ2131_01); + histos.get(HIST("Prof2D_Q2131_10"))->Fill(cent, sampleIndex, fQ2131_10); + histos.get(HIST("Prof2D_Q2132_11"))->Fill(cent, sampleIndex, fQ2132_11); + histos.get(HIST("Prof2D_Q2132_01"))->Fill(cent, sampleIndex, fQ2132_01); + histos.get(HIST("Prof2D_Q2132_10"))->Fill(cent, sampleIndex, fQ2132_10); + histos.get(HIST("Prof2D_Q2133_11"))->Fill(cent, sampleIndex, fQ2133_11); + histos.get(HIST("Prof2D_Q2133_01"))->Fill(cent, sampleIndex, fQ2133_01); + histos.get(HIST("Prof2D_Q2133_10"))->Fill(cent, sampleIndex, fQ2133_10); + histos.get(HIST("Prof2D_Q2231_11"))->Fill(cent, sampleIndex, fQ2231_11); + histos.get(HIST("Prof2D_Q2231_01"))->Fill(cent, sampleIndex, fQ2231_01); + histos.get(HIST("Prof2D_Q2231_10"))->Fill(cent, sampleIndex, fQ2231_10); + histos.get(HIST("Prof2D_Q2232_11"))->Fill(cent, sampleIndex, fQ2232_11); + histos.get(HIST("Prof2D_Q2232_01"))->Fill(cent, sampleIndex, fQ2232_01); + histos.get(HIST("Prof2D_Q2232_10"))->Fill(cent, sampleIndex, fQ2232_10); + histos.get(HIST("Prof2D_Q2233_11"))->Fill(cent, sampleIndex, fQ2233_11); + histos.get(HIST("Prof2D_Q2233_01"))->Fill(cent, sampleIndex, fQ2233_01); + histos.get(HIST("Prof2D_Q2233_10"))->Fill(cent, sampleIndex, fQ2233_10); + histos.get(HIST("Prof2D_Q51_1"))->Fill(cent, sampleIndex, fQ51_1); + histos.get(HIST("Prof2D_Q52_1"))->Fill(cent, sampleIndex, fQ52_1); + histos.get(HIST("Prof2D_Q53_1"))->Fill(cent, sampleIndex, fQ53_1); + histos.get(HIST("Prof2D_Q54_1"))->Fill(cent, sampleIndex, fQ54_1); + histos.get(HIST("Prof2D_Q55_1"))->Fill(cent, sampleIndex, fQ55_1); + histos.get(HIST("Prof2D_Q21_3"))->Fill(cent, sampleIndex, fQ21_3); + histos.get(HIST("Prof2D_Q22_3"))->Fill(cent, sampleIndex, fQ22_3); + histos.get(HIST("Prof2D_Q31_2"))->Fill(cent, sampleIndex, fQ31_2); + histos.get(HIST("Prof2D_Q32_2"))->Fill(cent, sampleIndex, fQ32_2); + histos.get(HIST("Prof2D_Q33_2"))->Fill(cent, sampleIndex, fQ33_2); + histos.get(HIST("Prof2D_Q61_1"))->Fill(cent, sampleIndex, fQ61_1); + histos.get(HIST("Prof2D_Q62_1"))->Fill(cent, sampleIndex, fQ62_1); + histos.get(HIST("Prof2D_Q63_1"))->Fill(cent, sampleIndex, fQ63_1); + histos.get(HIST("Prof2D_Q64_1"))->Fill(cent, sampleIndex, fQ64_1); + histos.get(HIST("Prof2D_Q65_1"))->Fill(cent, sampleIndex, fQ65_1); + histos.get(HIST("Prof2D_Q66_1"))->Fill(cent, sampleIndex, fQ66_1); + histos.get(HIST("Prof2D_Q112122_111"))->Fill(cent, sampleIndex, fQ112122_111); + histos.get(HIST("Prof2D_Q112131_111"))->Fill(cent, sampleIndex, fQ112131_111); + histos.get(HIST("Prof2D_Q112132_111"))->Fill(cent, sampleIndex, fQ112132_111); + histos.get(HIST("Prof2D_Q112133_111"))->Fill(cent, sampleIndex, fQ112133_111); + histos.get(HIST("Prof2D_Q112231_111"))->Fill(cent, sampleIndex, fQ112231_111); + histos.get(HIST("Prof2D_Q112232_111"))->Fill(cent, sampleIndex, fQ112232_111); + histos.get(HIST("Prof2D_Q112233_111"))->Fill(cent, sampleIndex, fQ112233_111); + histos.get(HIST("Prof2D_Q112221_111"))->Fill(cent, sampleIndex, fQ112221_111); + } + } + PROCESS_SWITCH(AntiprotonCumulantsMc, processMCRec, "Process Generated", true); + + void processDataRec(AodCollisions::iterator const& coll, aod::BCsWithTimestamps const&, AodTracks const& inputTracks) + { + if (!coll.sel8()) { + return; + } + if (cfgUseGoodITSLayerAllCut && !(coll.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll))) { + return; + } + if (cfgEvSelkNoSameBunchPileup && !(coll.selection_bit(o2::aod::evsel::kNoSameBunchPileup))) { + // rejects collisions which are associated with the same "found-by-T0" bunch crossing + // https://indico.cern.ch/event/1396220/#1-event-selection-with-its-rof + return; + } + + if (cfgEvSelkIsVertexTOFmatched && !(coll.selection_bit(o2::aod::evsel::kIsVertexTOFmatched))) { + return; + ; + } + + histos.fill(HIST("hZvtx_after_sel"), coll.posZ()); + // variables + auto cent = coll.centFT0M(); + histos.fill(HIST("hCentrec"), cent); + + float nProt = 0.0; + float nAntiprot = 0.0; + std::array powerEffProt = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + std::array powerEffAntiprot = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + std::array fTCP0 = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + std::array fTCP1 = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; + + o2::aod::ITSResponse itsResponse; + + // Start of the Monte-Carlo reconstructed tracks + for (const auto& track : inputTracks) { + if (!track.isPVContributor()) //! track check as used in data + { + continue; + } + if ((track.pt() < cfgCutPtLower) || (track.pt() > 5.0f) || (std::abs(track.eta()) > cfgCutEta)) { + continue; + } + if (!(track.itsNCls() > cfgITScluster) || !(track.tpcNClsFound() >= cfgTPCcluster) || !(track.tpcNClsCrossedRows() >= cfgTPCnCrossedRows)) { + continue; + } + + histos.fill(HIST("hrecPtAll"), track.pt()); + histos.fill(HIST("hrecEtaAll"), track.eta()); + histos.fill(HIST("hrecPhiAll"), track.phi()); + histos.fill(HIST("hrecDcaXYAll"), track.dcaXY()); + histos.fill(HIST("hrecDcaZAll"), track.dcaZ()); + + // rejecting electron + if (cfgIfRejectElectron && isElectron(track)) { + continue; + } + // use ITS pid as well + if (cfgUseItsPid && (std::abs(itsResponse.nSigmaITS(track)) > 3.0)) { + continue; + } + // required tracks with TOF mandatory to avoid pileup + if (cfgIfMandatoryTOF && !track.hasTOF()) { + continue; + } + + bool trackSelected = false; + if (cfgPIDchoice == 0) + trackSelected = selectionPIDoldTOFveto(track); + if (cfgPIDchoice == 1) + trackSelected = selectionPIDnew(track); + if (cfgPIDchoice == 2) + trackSelected = selectionPIDold(track); + + if (trackSelected) { + // filling nSigma distribution + histos.fill(HIST("h2DnsigmaTpcVsPt"), track.pt(), track.tpcNSigmaPr()); + histos.fill(HIST("h2DnsigmaTofVsPt"), track.pt(), track.tofNSigmaPr()); + histos.fill(HIST("h2DnsigmaItsVsPt"), track.pt(), itsResponse.nSigmaITS(track)); + + // for protons + if (track.sign() > 0) { + histos.fill(HIST("hrecPtProton"), track.pt()); //! hist for p rec + histos.fill(HIST("hrecPtDistProtonVsCentrality"), track.pt(), cent); + histos.fill(HIST("hrecEtaProton"), track.eta()); + histos.fill(HIST("hrecPhiProton"), track.phi()); + histos.fill(HIST("hrecDcaXYProton"), track.dcaXY()); + histos.fill(HIST("hrecDcaZProton"), track.dcaZ()); + + if (track.pt() < cfgCutPtUpper) { + nProt = nProt + 1.0; + float pEff = getEfficiency(track); // get efficiency of track + if (pEff != 0) { + for (int i = 1; i < 7; i++) { + powerEffProt[i] += std::pow(1.0 / pEff, i); + } + } + } + } + // for anti-protons + if (track.sign() < 0) { + histos.fill(HIST("hrecPtAntiproton"), track.pt()); //! hist for anti-p rec + histos.fill(HIST("hrecPtDistAntiprotonVsCentrality"), track.pt(), cent); + histos.fill(HIST("hrecEtaAntiproton"), track.eta()); + histos.fill(HIST("hrecPhiAntiproton"), track.phi()); + histos.fill(HIST("hrecDcaXYAntiproton"), track.dcaXY()); + histos.fill(HIST("hrecDcaZAntiproton"), track.dcaZ()); + if (track.pt() < cfgCutPtUpper) { + nAntiprot = nAntiprot + 1.0; + float pEff = getEfficiency(track); // get efficiency of track + if (pEff != 0) { + for (int i = 1; i < 7; i++) { + powerEffAntiprot[i] += std::pow(1.0 / pEff, i); + } + } + } + } + + } //! checking PID + } //! end track loop + + float netProt = nAntiprot; + + histos.fill(HIST("hrecProtonVsCentrality"), nProt, cent); + histos.fill(HIST("hrecAntiprotonVsCentrality"), nAntiprot, cent); + histos.fill(HIST("hrecProfileTotalProton"), cent, (nProt + nAntiprot)); + histos.fill(HIST("hrecProfileProton"), cent, nProt); + histos.fill(HIST("hrecProfileAntiproton"), cent, nAntiprot); + histos.fill(HIST("hCorrProfileTotalProton"), cent, (powerEffProt[1] + powerEffAntiprot[1])); + histos.fill(HIST("hCorrProfileProton"), cent, powerEffProt[1]); + histos.fill(HIST("hCorrProfileAntiproton"), cent, powerEffAntiprot[1]); + + // Calculating q_{r,s} as required + for (int i = 1; i < 7; i++) { + fTCP0[i] = 0.0 + powerEffAntiprot[i]; + fTCP1[i] = 0.0 - powerEffAntiprot[i]; + } + + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + float fQ11_1 = fTCP1[1]; + float fQ11_2 = std::pow(fTCP1[1], 2); + float fQ11_3 = std::pow(fTCP1[1], 3); + float fQ11_4 = std::pow(fTCP1[1], 4); + float fQ11_5 = std::pow(fTCP1[1], 5); + float fQ11_6 = std::pow(fTCP1[1], 6); + + float fQ21_3 = std::pow(fTCP0[1], 3); + float fQ22_3 = std::pow(fTCP0[2], 3); + float fQ31_2 = std::pow(fTCP1[1], 2); + float fQ32_2 = std::pow(fTCP1[2], 2); + float fQ33_2 = std::pow(fTCP1[3], 2); + + float fQ61_1 = fTCP0[1]; + float fQ62_1 = fTCP0[2]; + float fQ63_1 = fTCP0[3]; + float fQ64_1 = fTCP0[4]; + float fQ65_1 = fTCP0[5]; + float fQ66_1 = fTCP0[6]; + + float fQ112122_111 = fTCP1[1] * fTCP0[1] * fTCP0[2]; + float fQ112131_111 = fTCP1[1] * fTCP0[1] * fTCP1[1]; + float fQ112132_111 = fTCP1[1] * fTCP0[1] * fTCP1[2]; + float fQ112133_111 = fTCP1[1] * fTCP0[1] * fTCP1[3]; + float fQ112231_111 = fTCP1[1] * fTCP0[2] * fTCP1[1]; + float fQ112232_111 = fTCP1[1] * fTCP0[2] * fTCP1[2]; + float fQ112233_111 = fTCP1[1] * fTCP0[2] * fTCP1[3]; + float fQ112221_111 = fTCP1[1] * fTCP0[2] * fTCP0[1]; + + float fQ21_1 = fTCP0[1]; + float fQ22_1 = fTCP0[2]; + float fQ31_1 = fTCP1[1]; + float fQ32_1 = fTCP1[2]; + float fQ33_1 = fTCP1[3]; + float fQ41_1 = fTCP0[1]; + float fQ42_1 = fTCP0[2]; + float fQ43_1 = fTCP0[3]; + float fQ44_1 = fTCP0[4]; + float fQ21_2 = std::pow(fTCP0[1], 2); + float fQ22_2 = std::pow(fTCP0[2], 2); + float fQ1121_11 = fTCP1[1] * fTCP0[1]; + float fQ1121_01 = fTCP0[1]; + float fQ1121_10 = fTCP1[1]; + float fQ1121_20 = std::pow(fTCP1[1], 2); + float fQ1121_21 = std::pow(fTCP1[1], 2) * fTCP0[1]; + float fQ1122_11 = fTCP1[1] * fTCP0[2]; + float fQ1122_01 = fTCP0[2]; + float fQ1122_10 = fTCP1[1]; + float fQ1122_20 = std::pow(fTCP1[1], 2); + float fQ1122_21 = std::pow(fTCP1[1], 2) * fTCP0[2]; + float fQ1131_11 = fTCP1[1] * fTCP1[1]; + float fQ1131_01 = fTCP1[1]; + float fQ1131_10 = fTCP1[1]; + float fQ1132_11 = fTCP1[1] * fTCP1[2]; + float fQ1132_01 = fTCP1[2]; + float fQ1132_10 = fTCP1[1]; + float fQ1133_11 = fTCP1[1] * fTCP1[3]; + float fQ1133_01 = fTCP1[3]; + float fQ1133_10 = fTCP1[1]; + float fQ2122_11 = fTCP0[1] * fTCP0[2]; + float fQ2122_01 = fTCP0[2]; + float fQ2122_10 = fTCP0[1]; + + ///////////////---------------------> + float fQ3132_11 = fTCP1[1] * fTCP1[2]; + float fQ3132_01 = fTCP1[2]; + float fQ3132_10 = fTCP1[1]; + float fQ3133_11 = fTCP1[1] * fTCP1[3]; + float fQ3133_01 = fTCP1[3]; + float fQ3133_10 = fTCP1[1]; + float fQ3233_11 = fTCP1[2] * fTCP1[3]; + float fQ3233_01 = fTCP1[3]; + float fQ3233_10 = fTCP1[2]; + float fQ2241_11 = fTCP0[2] * fTCP0[1]; + float fQ2241_01 = fTCP0[1]; + float fQ2241_10 = fTCP0[2]; + float fQ2242_11 = fTCP0[2] * fTCP0[2]; + float fQ2242_01 = fTCP0[2]; + float fQ2242_10 = fTCP0[2]; + float fQ2243_11 = fTCP0[2] * fTCP0[3]; + float fQ2243_01 = fTCP0[3]; + float fQ2243_10 = fTCP0[2]; + float fQ2244_11 = fTCP0[2] * fTCP0[4]; + float fQ2244_01 = fTCP0[4]; + float fQ2244_10 = fTCP0[2]; + float fQ2141_11 = fTCP0[1] * fTCP0[1]; + float fQ2141_01 = fTCP0[1]; + float fQ2141_10 = fTCP0[1]; + float fQ2142_11 = fTCP0[1] * fTCP0[2]; + float fQ2142_01 = fTCP0[2]; + float fQ2142_10 = fTCP0[1]; + float fQ2143_11 = fTCP0[1] * fTCP0[3]; + float fQ2143_01 = fTCP0[3]; + float fQ2143_10 = fTCP0[1]; + float fQ2144_11 = fTCP0[1] * fTCP0[4]; + float fQ2144_01 = fTCP0[4]; + float fQ2144_10 = fTCP0[1]; + float fQ1151_11 = fTCP1[1] * fTCP1[1]; + float fQ1151_01 = fTCP1[1]; + float fQ1151_10 = fTCP1[1]; + float fQ1152_11 = fTCP1[1] * fTCP1[2]; + float fQ1152_01 = fTCP1[2]; + float fQ1152_10 = fTCP1[1]; + float fQ1153_11 = fTCP1[1] * fTCP1[3]; + float fQ1153_01 = fTCP1[3]; + float fQ1153_10 = fTCP1[1]; + float fQ1154_11 = fTCP1[1] * fTCP1[4]; + float fQ1154_01 = fTCP1[4]; + float fQ1154_10 = fTCP1[1]; + float fQ1155_11 = fTCP1[1] * fTCP1[5]; + float fQ1155_01 = fTCP1[5]; + float fQ1155_10 = fTCP1[1]; + + float fQ112233_001 = fTCP1[3]; + float fQ112233_010 = fTCP0[2]; + float fQ112233_100 = fTCP1[1]; + float fQ112233_011 = fTCP0[2] * fTCP1[3]; + float fQ112233_101 = fTCP1[1] * fTCP1[3]; + float fQ112233_110 = fTCP1[1] * fTCP0[2]; + float fQ112232_001 = fTCP1[2]; + float fQ112232_010 = fTCP0[2]; + float fQ112232_100 = fTCP1[1]; + float fQ112232_011 = fTCP0[2] * fTCP1[2]; + float fQ112232_101 = fTCP1[1] * fTCP1[2]; + float fQ112232_110 = fTCP1[1] * fTCP0[2]; + // + float fQ112231_001 = fTCP1[1]; + float fQ112231_010 = fTCP0[2]; + float fQ112231_100 = fTCP1[1]; + float fQ112231_011 = fTCP0[2] * fTCP1[1]; + float fQ112231_101 = fTCP1[1] * fTCP1[1]; + float fQ112231_110 = fTCP1[1] * fTCP0[2]; + float fQ112133_001 = fTCP1[3]; + float fQ112133_010 = fTCP0[1]; + float fQ112133_100 = fTCP1[1]; + float fQ112133_011 = fTCP0[1] * fTCP1[3]; + float fQ112133_101 = fTCP1[1] * fTCP1[3]; + float fQ112133_110 = fTCP1[1] * fTCP0[1]; + + float fQ112132_001 = fTCP1[2]; + float fQ112132_010 = fTCP0[1]; + float fQ112132_100 = fTCP1[1]; + float fQ112132_011 = fTCP0[1] * fTCP1[2]; + float fQ112132_101 = fTCP1[1] * fTCP1[2]; + float fQ112132_110 = fTCP1[1] * fTCP0[1]; + float fQ112131_001 = fTCP1[1]; + float fQ112131_010 = fTCP0[1]; + float fQ112131_100 = fTCP1[1]; + float fQ112131_011 = fTCP0[1] * fTCP1[1]; + float fQ112131_101 = fTCP1[1] * fTCP1[1]; + float fQ112131_110 = fTCP1[1] * fTCP0[1]; + + float fQ2221_11 = fTCP0[2] * fTCP0[1]; + float fQ2221_01 = fTCP0[1]; + float fQ2221_10 = fTCP0[2]; + float fQ2221_21 = std::pow(fTCP0[2], 2) * fTCP0[1]; + float fQ2221_20 = std::pow(fTCP0[2], 2); + + float fQ2122_21 = std::pow(fTCP0[1], 2) * fTCP0[2]; + float fQ2122_20 = std::pow(fTCP0[1], 2); + float fQ1121_02 = std::pow(fTCP0[1], 2); + float fQ1121_12 = fTCP1[1] * std::pow(fTCP0[1], 2); + float fQ1121_22 = std::pow(fTCP1[1], 2) * std::pow(fTCP0[1], 2); + float fQ1122_02 = std::pow(fTCP0[2], 2); + float fQ1122_12 = fTCP1[1] * std::pow(fTCP0[2], 2); + float fQ1122_22 = std::pow(fTCP1[1], 2) * std::pow(fTCP0[2], 2); + + float fQ112221_001 = fTCP0[1]; + float fQ112221_010 = fTCP0[2]; + float fQ112221_100 = fTCP1[1]; + float fQ112221_011 = fTCP0[2] * fTCP0[1]; + float fQ112221_101 = fTCP1[1] * fTCP0[1]; + float fQ112221_110 = fTCP1[1] * fTCP0[2]; + float fQ112221_200 = std::pow(fTCP1[1], 2); + float fQ112221_201 = std::pow(fTCP1[1], 2) * fTCP0[1]; + float fQ112221_210 = std::pow(fTCP1[1], 2) * fTCP0[2]; + float fQ112221_211 = std::pow(fTCP1[1], 2) * fTCP0[2] * fTCP0[1]; + float fQ1131_21 = std::pow(fTCP1[1], 2) * fTCP1[1]; + float fQ1131_20 = std::pow(fTCP1[1], 2); + float fQ1131_31 = std::pow(fTCP1[1], 3) * fTCP1[1]; + float fQ1131_30 = std::pow(fTCP1[1], 3); + + float fQ1132_21 = std::pow(fTCP1[1], 2) * fTCP1[2]; + float fQ1132_20 = std::pow(fTCP1[1], 2); + float fQ1132_31 = std::pow(fTCP1[1], 3) * fTCP1[2]; + float fQ1132_30 = std::pow(fTCP1[1], 3); + float fQ1133_21 = std::pow(fTCP1[1], 2) * fTCP1[3]; + float fQ1133_20 = std::pow(fTCP1[1], 2); + float fQ1133_31 = std::pow(fTCP1[1], 3) * fTCP1[3]; + float fQ1133_30 = std::pow(fTCP1[1], 3); + float fQ1121_30 = std::pow(fTCP1[1], 3); + float fQ1121_31 = std::pow(fTCP1[1], 3) * fTCP0[1]; + float fQ1121_40 = std::pow(fTCP1[1], 4); + float fQ1121_41 = std::pow(fTCP1[1], 4) * fTCP0[1]; + float fQ1122_30 = std::pow(fTCP1[1], 3); + float fQ1122_31 = std::pow(fTCP1[1], 3) * fTCP0[2]; + float fQ1122_40 = std::pow(fTCP1[1], 4); + float fQ1122_41 = std::pow(fTCP1[1], 4) * fTCP0[2]; + + float fQ2211_11 = fTCP0[2] * fTCP1[1]; + float fQ2211_01 = fTCP1[1]; + float fQ2211_10 = fTCP0[2]; + float fQ2211_20 = std::pow(fTCP0[2], 2); + float fQ2211_21 = std::pow(fTCP0[2], 2) * fTCP1[1]; + float fQ2111_11 = fTCP0[1] * fTCP1[1]; + float fQ2111_01 = fTCP1[1]; + float fQ2111_10 = fTCP0[1]; + float fQ2111_20 = std::pow(fTCP0[1], 2); + float fQ2111_21 = std::pow(fTCP0[1], 2) * fTCP1[1]; + + float fQ112122_001 = fTCP0[2]; + float fQ112122_010 = fTCP0[1]; + float fQ112122_100 = fTCP1[1]; + float fQ112122_011 = fTCP0[1] * fTCP0[2]; + float fQ112122_101 = fTCP1[1] * fTCP0[2]; + float fQ112122_110 = fTCP1[1] * fTCP0[1]; + + float fQ1141_11 = fTCP1[1] * fTCP0[1]; + float fQ1141_01 = fTCP0[1]; + float fQ1141_10 = fTCP1[1]; + float fQ1141_20 = std::pow(fTCP1[1], 2); + float fQ1141_21 = std::pow(fTCP1[1], 2) * fTCP0[1]; + float fQ1142_11 = fTCP1[1] * fTCP0[2]; + float fQ1142_01 = fTCP0[2]; + float fQ1142_10 = fTCP1[1]; + float fQ1142_20 = std::pow(fTCP1[1], 2); + float fQ1142_21 = std::pow(fTCP1[1], 2) * fTCP0[2]; + + float fQ1143_11 = fTCP1[1] * fTCP0[3]; + float fQ1143_01 = fTCP0[3]; + float fQ1143_10 = fTCP1[1]; + float fQ1143_20 = std::pow(fTCP1[1], 2); + float fQ1143_21 = std::pow(fTCP1[1], 2) * fTCP0[3]; + float fQ1144_11 = fTCP1[1] * fTCP0[4]; + float fQ1144_01 = fTCP0[4]; + float fQ1144_10 = fTCP1[1]; + float fQ1144_20 = std::pow(fTCP1[1], 2); + float fQ1144_21 = std::pow(fTCP1[1], 2) * fTCP0[4]; + float fQ2131_11 = fTCP0[1] * fTCP1[1]; + float fQ2131_01 = fTCP1[1]; + float fQ2131_10 = fTCP0[1]; + + float fQ2132_11 = fTCP0[1] * fTCP1[2]; + float fQ2132_01 = fTCP1[2]; + float fQ2132_10 = fTCP0[1]; + float fQ2133_11 = fTCP0[1] * fTCP1[3]; + float fQ2133_01 = fTCP1[3]; + float fQ2133_10 = fTCP0[1]; + float fQ2231_11 = fTCP0[2] * fTCP1[1]; + float fQ2231_01 = fTCP1[1]; + float fQ2231_10 = fTCP0[2]; + float fQ2232_11 = fTCP0[2] * fTCP1[2]; + float fQ2232_01 = fTCP1[2]; + float fQ2232_10 = fTCP0[2]; + float fQ2233_11 = fTCP0[2] * fTCP1[3]; + float fQ2233_01 = fTCP1[3]; + float fQ2233_10 = fTCP0[2]; + + float fQ51_1 = fTCP1[1]; + float fQ52_1 = fTCP1[2]; + float fQ53_1 = fTCP1[3]; + float fQ54_1 = fTCP1[4]; + float fQ55_1 = fTCP1[5]; + + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + if (cfgIsCalculateCentral) { + + // uncorrected + histos.get(HIST("Prof_mu1_antiproton"))->Fill(cent, std::pow(netProt, 1.0)); + histos.get(HIST("Prof_mu2_antiproton"))->Fill(cent, std::pow(netProt, 2.0)); + histos.get(HIST("Prof_mu3_antiproton"))->Fill(cent, std::pow(netProt, 3.0)); + histos.get(HIST("Prof_mu4_antiproton"))->Fill(cent, std::pow(netProt, 4.0)); + histos.get(HIST("Prof_mu5_antiproton"))->Fill(cent, std::pow(netProt, 5.0)); + histos.get(HIST("Prof_mu6_antiproton"))->Fill(cent, std::pow(netProt, 6.0)); + histos.get(HIST("Prof_mu7_antiproton"))->Fill(cent, std::pow(netProt, 7.0)); + histos.get(HIST("Prof_mu8_antiproton"))->Fill(cent, std::pow(netProt, 8.0)); + + // eff. corrected + histos.get(HIST("Prof_Q11_1"))->Fill(cent, fQ11_1); + histos.get(HIST("Prof_Q11_2"))->Fill(cent, fQ11_2); + histos.get(HIST("Prof_Q11_3"))->Fill(cent, fQ11_3); + histos.get(HIST("Prof_Q11_4"))->Fill(cent, fQ11_4); + histos.get(HIST("Prof_Q21_1"))->Fill(cent, fQ21_1); + histos.get(HIST("Prof_Q22_1"))->Fill(cent, fQ22_1); + histos.get(HIST("Prof_Q31_1"))->Fill(cent, fQ31_1); + histos.get(HIST("Prof_Q32_1"))->Fill(cent, fQ32_1); + histos.get(HIST("Prof_Q33_1"))->Fill(cent, fQ33_1); + histos.get(HIST("Prof_Q41_1"))->Fill(cent, fQ41_1); + histos.get(HIST("Prof_Q42_1"))->Fill(cent, fQ42_1); + histos.get(HIST("Prof_Q43_1"))->Fill(cent, fQ43_1); + histos.get(HIST("Prof_Q44_1"))->Fill(cent, fQ44_1); + histos.get(HIST("Prof_Q21_2"))->Fill(cent, fQ21_2); + histos.get(HIST("Prof_Q22_2"))->Fill(cent, fQ22_2); + histos.get(HIST("Prof_Q1121_11"))->Fill(cent, fQ1121_11); + histos.get(HIST("Prof_Q1121_01"))->Fill(cent, fQ1121_01); + histos.get(HIST("Prof_Q1121_10"))->Fill(cent, fQ1121_10); + histos.get(HIST("Prof_Q1121_20"))->Fill(cent, fQ1121_20); + histos.get(HIST("Prof_Q1121_21"))->Fill(cent, fQ1121_21); + histos.get(HIST("Prof_Q1122_11"))->Fill(cent, fQ1122_11); + histos.get(HIST("Prof_Q1122_01"))->Fill(cent, fQ1122_01); + histos.get(HIST("Prof_Q1122_10"))->Fill(cent, fQ1122_10); + histos.get(HIST("Prof_Q1122_20"))->Fill(cent, fQ1122_20); + histos.get(HIST("Prof_Q1122_21"))->Fill(cent, fQ1122_21); + histos.get(HIST("Prof_Q1131_11"))->Fill(cent, fQ1131_11); + histos.get(HIST("Prof_Q1131_01"))->Fill(cent, fQ1131_01); + histos.get(HIST("Prof_Q1131_10"))->Fill(cent, fQ1131_10); + histos.get(HIST("Prof_Q1132_11"))->Fill(cent, fQ1132_11); + histos.get(HIST("Prof_Q1132_01"))->Fill(cent, fQ1132_01); + histos.get(HIST("Prof_Q1132_10"))->Fill(cent, fQ1132_10); + histos.get(HIST("Prof_Q1133_11"))->Fill(cent, fQ1133_11); + histos.get(HIST("Prof_Q1133_01"))->Fill(cent, fQ1133_01); + histos.get(HIST("Prof_Q1133_10"))->Fill(cent, fQ1133_10); + histos.get(HIST("Prof_Q2122_11"))->Fill(cent, fQ2122_11); + histos.get(HIST("Prof_Q2122_01"))->Fill(cent, fQ2122_01); + histos.get(HIST("Prof_Q2122_10"))->Fill(cent, fQ2122_10); + histos.get(HIST("Prof_Q3132_11"))->Fill(cent, fQ3132_11); + histos.get(HIST("Prof_Q3132_01"))->Fill(cent, fQ3132_01); + histos.get(HIST("Prof_Q3132_10"))->Fill(cent, fQ3132_10); + histos.get(HIST("Prof_Q3133_11"))->Fill(cent, fQ3133_11); + histos.get(HIST("Prof_Q3133_01"))->Fill(cent, fQ3133_01); + histos.get(HIST("Prof_Q3133_10"))->Fill(cent, fQ3133_10); + histos.get(HIST("Prof_Q3233_11"))->Fill(cent, fQ3233_11); + histos.get(HIST("Prof_Q3233_01"))->Fill(cent, fQ3233_01); + histos.get(HIST("Prof_Q3233_10"))->Fill(cent, fQ3233_10); + histos.get(HIST("Prof_Q2241_11"))->Fill(cent, fQ2241_11); + histos.get(HIST("Prof_Q2241_01"))->Fill(cent, fQ2241_01); + histos.get(HIST("Prof_Q2241_10"))->Fill(cent, fQ2241_10); + histos.get(HIST("Prof_Q2242_11"))->Fill(cent, fQ2242_11); + histos.get(HIST("Prof_Q2242_01"))->Fill(cent, fQ2242_01); + histos.get(HIST("Prof_Q2242_10"))->Fill(cent, fQ2242_10); + histos.get(HIST("Prof_Q2243_11"))->Fill(cent, fQ2243_11); + histos.get(HIST("Prof_Q2243_01"))->Fill(cent, fQ2243_01); + histos.get(HIST("Prof_Q2243_10"))->Fill(cent, fQ2243_10); + histos.get(HIST("Prof_Q2244_11"))->Fill(cent, fQ2244_11); + histos.get(HIST("Prof_Q2244_01"))->Fill(cent, fQ2244_01); + histos.get(HIST("Prof_Q2244_10"))->Fill(cent, fQ2244_10); + histos.get(HIST("Prof_Q2141_11"))->Fill(cent, fQ2141_11); + histos.get(HIST("Prof_Q2141_01"))->Fill(cent, fQ2141_01); + histos.get(HIST("Prof_Q2141_10"))->Fill(cent, fQ2141_10); + histos.get(HIST("Prof_Q2142_11"))->Fill(cent, fQ2142_11); + histos.get(HIST("Prof_Q2142_01"))->Fill(cent, fQ2142_01); + histos.get(HIST("Prof_Q2142_10"))->Fill(cent, fQ2142_10); + histos.get(HIST("Prof_Q2143_11"))->Fill(cent, fQ2143_11); + histos.get(HIST("Prof_Q2143_01"))->Fill(cent, fQ2143_01); + histos.get(HIST("Prof_Q2143_10"))->Fill(cent, fQ2143_10); + histos.get(HIST("Prof_Q2144_11"))->Fill(cent, fQ2144_11); + histos.get(HIST("Prof_Q2144_01"))->Fill(cent, fQ2144_01); + histos.get(HIST("Prof_Q2144_10"))->Fill(cent, fQ2144_10); + histos.get(HIST("Prof_Q1151_11"))->Fill(cent, fQ1151_11); + histos.get(HIST("Prof_Q1151_01"))->Fill(cent, fQ1151_01); + histos.get(HIST("Prof_Q1151_10"))->Fill(cent, fQ1151_10); + histos.get(HIST("Prof_Q1152_11"))->Fill(cent, fQ1152_11); + histos.get(HIST("Prof_Q1152_01"))->Fill(cent, fQ1152_01); + histos.get(HIST("Prof_Q1152_10"))->Fill(cent, fQ1152_10); + histos.get(HIST("Prof_Q1153_11"))->Fill(cent, fQ1153_11); + histos.get(HIST("Prof_Q1153_01"))->Fill(cent, fQ1153_01); + histos.get(HIST("Prof_Q1153_10"))->Fill(cent, fQ1153_10); + histos.get(HIST("Prof_Q1154_11"))->Fill(cent, fQ1154_11); + histos.get(HIST("Prof_Q1154_01"))->Fill(cent, fQ1154_01); + histos.get(HIST("Prof_Q1154_10"))->Fill(cent, fQ1154_10); + histos.get(HIST("Prof_Q1155_11"))->Fill(cent, fQ1155_11); + histos.get(HIST("Prof_Q1155_01"))->Fill(cent, fQ1155_01); + histos.get(HIST("Prof_Q1155_10"))->Fill(cent, fQ1155_10); + histos.get(HIST("Prof_Q112233_001"))->Fill(cent, fQ112233_001); + histos.get(HIST("Prof_Q112233_010"))->Fill(cent, fQ112233_010); + histos.get(HIST("Prof_Q112233_100"))->Fill(cent, fQ112233_100); + histos.get(HIST("Prof_Q112233_011"))->Fill(cent, fQ112233_011); + histos.get(HIST("Prof_Q112233_101"))->Fill(cent, fQ112233_101); + histos.get(HIST("Prof_Q112233_110"))->Fill(cent, fQ112233_110); + histos.get(HIST("Prof_Q112232_001"))->Fill(cent, fQ112232_001); + histos.get(HIST("Prof_Q112232_010"))->Fill(cent, fQ112232_010); + histos.get(HIST("Prof_Q112232_100"))->Fill(cent, fQ112232_100); + histos.get(HIST("Prof_Q112232_011"))->Fill(cent, fQ112232_011); + histos.get(HIST("Prof_Q112232_101"))->Fill(cent, fQ112232_101); + histos.get(HIST("Prof_Q112232_110"))->Fill(cent, fQ112232_110); + histos.get(HIST("Prof_Q112231_001"))->Fill(cent, fQ112231_001); + histos.get(HIST("Prof_Q112231_010"))->Fill(cent, fQ112231_010); + histos.get(HIST("Prof_Q112231_100"))->Fill(cent, fQ112231_100); + histos.get(HIST("Prof_Q112231_011"))->Fill(cent, fQ112231_011); + histos.get(HIST("Prof_Q112231_101"))->Fill(cent, fQ112231_101); + histos.get(HIST("Prof_Q112231_110"))->Fill(cent, fQ112231_110); + histos.get(HIST("Prof_Q112133_001"))->Fill(cent, fQ112133_001); + histos.get(HIST("Prof_Q112133_010"))->Fill(cent, fQ112133_010); + histos.get(HIST("Prof_Q112133_100"))->Fill(cent, fQ112133_100); + histos.get(HIST("Prof_Q112133_011"))->Fill(cent, fQ112133_011); + histos.get(HIST("Prof_Q112133_101"))->Fill(cent, fQ112133_101); + histos.get(HIST("Prof_Q112133_110"))->Fill(cent, fQ112133_110); + histos.get(HIST("Prof_Q112132_001"))->Fill(cent, fQ112132_001); + histos.get(HIST("Prof_Q112132_010"))->Fill(cent, fQ112132_010); + histos.get(HIST("Prof_Q112132_100"))->Fill(cent, fQ112132_100); + histos.get(HIST("Prof_Q112132_011"))->Fill(cent, fQ112132_011); + histos.get(HIST("Prof_Q112132_101"))->Fill(cent, fQ112132_101); + histos.get(HIST("Prof_Q112132_110"))->Fill(cent, fQ112132_110); + histos.get(HIST("Prof_Q112131_001"))->Fill(cent, fQ112131_001); + histos.get(HIST("Prof_Q112131_010"))->Fill(cent, fQ112131_010); + histos.get(HIST("Prof_Q112131_100"))->Fill(cent, fQ112131_100); + histos.get(HIST("Prof_Q112131_011"))->Fill(cent, fQ112131_011); + histos.get(HIST("Prof_Q112131_101"))->Fill(cent, fQ112131_101); + histos.get(HIST("Prof_Q112131_110"))->Fill(cent, fQ112131_110); + histos.get(HIST("Prof_Q2221_11"))->Fill(cent, fQ2221_11); + histos.get(HIST("Prof_Q2221_01"))->Fill(cent, fQ2221_01); + histos.get(HIST("Prof_Q2221_10"))->Fill(cent, fQ2221_10); + histos.get(HIST("Prof_Q2221_21"))->Fill(cent, fQ2221_21); + histos.get(HIST("Prof_Q2221_20"))->Fill(cent, fQ2221_20); + histos.get(HIST("Prof_Q2122_21"))->Fill(cent, fQ2122_21); + histos.get(HIST("Prof_Q2122_20"))->Fill(cent, fQ2122_20); + histos.get(HIST("Prof_Q1121_02"))->Fill(cent, fQ1121_02); + histos.get(HIST("Prof_Q1121_12"))->Fill(cent, fQ1121_12); + histos.get(HIST("Prof_Q1121_22"))->Fill(cent, fQ1121_22); + histos.get(HIST("Prof_Q1122_02"))->Fill(cent, fQ1122_02); + histos.get(HIST("Prof_Q1122_12"))->Fill(cent, fQ1122_12); + histos.get(HIST("Prof_Q1122_22"))->Fill(cent, fQ1122_22); + histos.get(HIST("Prof_Q112221_001"))->Fill(cent, fQ112221_001); + histos.get(HIST("Prof_Q112221_010"))->Fill(cent, fQ112221_010); + histos.get(HIST("Prof_Q112221_100"))->Fill(cent, fQ112221_100); + histos.get(HIST("Prof_Q112221_011"))->Fill(cent, fQ112221_011); + histos.get(HIST("Prof_Q112221_101"))->Fill(cent, fQ112221_101); + histos.get(HIST("Prof_Q112221_110"))->Fill(cent, fQ112221_110); + histos.get(HIST("Prof_Q112221_200"))->Fill(cent, fQ112221_200); + histos.get(HIST("Prof_Q112221_201"))->Fill(cent, fQ112221_201); + histos.get(HIST("Prof_Q112221_210"))->Fill(cent, fQ112221_210); + histos.get(HIST("Prof_Q112221_211"))->Fill(cent, fQ112221_211); + histos.get(HIST("Prof_Q1131_21"))->Fill(cent, fQ1131_21); + histos.get(HIST("Prof_Q1131_20"))->Fill(cent, fQ1131_20); + histos.get(HIST("Prof_Q1131_31"))->Fill(cent, fQ1131_31); + histos.get(HIST("Prof_Q1131_30"))->Fill(cent, fQ1131_30); + histos.get(HIST("Prof_Q1132_21"))->Fill(cent, fQ1132_21); + histos.get(HIST("Prof_Q1132_20"))->Fill(cent, fQ1132_20); + histos.get(HIST("Prof_Q1132_31"))->Fill(cent, fQ1132_31); + histos.get(HIST("Prof_Q1132_30"))->Fill(cent, fQ1132_30); + histos.get(HIST("Prof_Q1133_21"))->Fill(cent, fQ1133_21); + histos.get(HIST("Prof_Q1133_20"))->Fill(cent, fQ1133_20); + histos.get(HIST("Prof_Q1133_31"))->Fill(cent, fQ1133_31); + histos.get(HIST("Prof_Q1133_30"))->Fill(cent, fQ1133_30); + histos.get(HIST("Prof_Q11_5"))->Fill(cent, fQ11_5); + histos.get(HIST("Prof_Q11_6"))->Fill(cent, fQ11_6); + histos.get(HIST("Prof_Q1121_30"))->Fill(cent, fQ1121_30); + histos.get(HIST("Prof_Q1121_31"))->Fill(cent, fQ1121_31); + histos.get(HIST("Prof_Q1121_40"))->Fill(cent, fQ1121_40); + histos.get(HIST("Prof_Q1121_41"))->Fill(cent, fQ1121_41); + histos.get(HIST("Prof_Q1122_30"))->Fill(cent, fQ1122_30); + histos.get(HIST("Prof_Q1122_31"))->Fill(cent, fQ1122_31); + histos.get(HIST("Prof_Q1122_40"))->Fill(cent, fQ1122_40); + histos.get(HIST("Prof_Q1122_41"))->Fill(cent, fQ1122_41); + histos.get(HIST("Prof_Q2211_11"))->Fill(cent, fQ2211_11); + histos.get(HIST("Prof_Q2211_01"))->Fill(cent, fQ2211_01); + histos.get(HIST("Prof_Q2211_10"))->Fill(cent, fQ2211_10); + histos.get(HIST("Prof_Q2211_20"))->Fill(cent, fQ2211_20); + histos.get(HIST("Prof_Q2211_21"))->Fill(cent, fQ2211_21); + histos.get(HIST("Prof_Q2111_11"))->Fill(cent, fQ2111_11); + histos.get(HIST("Prof_Q2111_01"))->Fill(cent, fQ2111_01); + histos.get(HIST("Prof_Q2111_10"))->Fill(cent, fQ2111_10); + histos.get(HIST("Prof_Q2111_20"))->Fill(cent, fQ2111_20); + histos.get(HIST("Prof_Q2111_21"))->Fill(cent, fQ2111_21); + histos.get(HIST("Prof_Q112122_001"))->Fill(cent, fQ112122_001); + histos.get(HIST("Prof_Q112122_010"))->Fill(cent, fQ112122_010); + histos.get(HIST("Prof_Q112122_100"))->Fill(cent, fQ112122_100); + histos.get(HIST("Prof_Q112122_011"))->Fill(cent, fQ112122_011); + histos.get(HIST("Prof_Q112122_101"))->Fill(cent, fQ112122_101); + histos.get(HIST("Prof_Q112122_110"))->Fill(cent, fQ112122_110); + histos.get(HIST("Prof_Q1141_11"))->Fill(cent, fQ1141_11); + histos.get(HIST("Prof_Q1141_01"))->Fill(cent, fQ1141_01); + histos.get(HIST("Prof_Q1141_10"))->Fill(cent, fQ1141_10); + histos.get(HIST("Prof_Q1141_20"))->Fill(cent, fQ1141_20); + histos.get(HIST("Prof_Q1141_21"))->Fill(cent, fQ1141_21); + histos.get(HIST("Prof_Q1142_11"))->Fill(cent, fQ1142_11); + histos.get(HIST("Prof_Q1142_01"))->Fill(cent, fQ1142_01); + histos.get(HIST("Prof_Q1142_10"))->Fill(cent, fQ1142_10); + histos.get(HIST("Prof_Q1142_20"))->Fill(cent, fQ1142_20); + histos.get(HIST("Prof_Q1142_21"))->Fill(cent, fQ1142_21); + histos.get(HIST("Prof_Q1143_11"))->Fill(cent, fQ1143_11); + histos.get(HIST("Prof_Q1143_01"))->Fill(cent, fQ1143_01); + histos.get(HIST("Prof_Q1143_10"))->Fill(cent, fQ1143_10); + histos.get(HIST("Prof_Q1143_20"))->Fill(cent, fQ1143_20); + histos.get(HIST("Prof_Q1143_21"))->Fill(cent, fQ1143_21); + histos.get(HIST("Prof_Q1144_11"))->Fill(cent, fQ1144_11); + histos.get(HIST("Prof_Q1144_01"))->Fill(cent, fQ1144_01); + histos.get(HIST("Prof_Q1144_10"))->Fill(cent, fQ1144_10); + histos.get(HIST("Prof_Q1144_20"))->Fill(cent, fQ1144_20); + histos.get(HIST("Prof_Q1144_21"))->Fill(cent, fQ1144_21); + histos.get(HIST("Prof_Q2131_11"))->Fill(cent, fQ2131_11); + histos.get(HIST("Prof_Q2131_01"))->Fill(cent, fQ2131_01); + histos.get(HIST("Prof_Q2131_10"))->Fill(cent, fQ2131_10); + histos.get(HIST("Prof_Q2132_11"))->Fill(cent, fQ2132_11); + histos.get(HIST("Prof_Q2132_01"))->Fill(cent, fQ2132_01); + histos.get(HIST("Prof_Q2132_10"))->Fill(cent, fQ2132_10); + histos.get(HIST("Prof_Q2133_11"))->Fill(cent, fQ2133_11); + histos.get(HIST("Prof_Q2133_01"))->Fill(cent, fQ2133_01); + histos.get(HIST("Prof_Q2133_10"))->Fill(cent, fQ2133_10); + histos.get(HIST("Prof_Q2231_11"))->Fill(cent, fQ2231_11); + histos.get(HIST("Prof_Q2231_01"))->Fill(cent, fQ2231_01); + histos.get(HIST("Prof_Q2231_10"))->Fill(cent, fQ2231_10); + histos.get(HIST("Prof_Q2232_11"))->Fill(cent, fQ2232_11); + histos.get(HIST("Prof_Q2232_01"))->Fill(cent, fQ2232_01); + histos.get(HIST("Prof_Q2232_10"))->Fill(cent, fQ2232_10); + histos.get(HIST("Prof_Q2233_11"))->Fill(cent, fQ2233_11); + histos.get(HIST("Prof_Q2233_01"))->Fill(cent, fQ2233_01); + histos.get(HIST("Prof_Q2233_10"))->Fill(cent, fQ2233_10); + histos.get(HIST("Prof_Q51_1"))->Fill(cent, fQ51_1); + histos.get(HIST("Prof_Q52_1"))->Fill(cent, fQ52_1); + histos.get(HIST("Prof_Q53_1"))->Fill(cent, fQ53_1); + histos.get(HIST("Prof_Q54_1"))->Fill(cent, fQ54_1); + histos.get(HIST("Prof_Q55_1"))->Fill(cent, fQ55_1); + histos.get(HIST("Prof_Q21_3"))->Fill(cent, fQ21_3); + histos.get(HIST("Prof_Q22_3"))->Fill(cent, fQ22_3); + histos.get(HIST("Prof_Q31_2"))->Fill(cent, fQ31_2); + histos.get(HIST("Prof_Q32_2"))->Fill(cent, fQ32_2); + histos.get(HIST("Prof_Q33_2"))->Fill(cent, fQ33_2); + histos.get(HIST("Prof_Q61_1"))->Fill(cent, fQ61_1); + histos.get(HIST("Prof_Q62_1"))->Fill(cent, fQ62_1); + histos.get(HIST("Prof_Q63_1"))->Fill(cent, fQ63_1); + histos.get(HIST("Prof_Q64_1"))->Fill(cent, fQ64_1); + histos.get(HIST("Prof_Q65_1"))->Fill(cent, fQ65_1); + histos.get(HIST("Prof_Q66_1"))->Fill(cent, fQ66_1); + histos.get(HIST("Prof_Q112122_111"))->Fill(cent, fQ112122_111); + histos.get(HIST("Prof_Q112131_111"))->Fill(cent, fQ112131_111); + histos.get(HIST("Prof_Q112132_111"))->Fill(cent, fQ112132_111); + histos.get(HIST("Prof_Q112133_111"))->Fill(cent, fQ112133_111); + histos.get(HIST("Prof_Q112231_111"))->Fill(cent, fQ112231_111); + histos.get(HIST("Prof_Q112232_111"))->Fill(cent, fQ112232_111); + histos.get(HIST("Prof_Q112233_111"))->Fill(cent, fQ112233_111); + histos.get(HIST("Prof_Q112221_111"))->Fill(cent, fQ112221_111); + } + + if (cfgIsCalculateError) { + // selecting subsample and filling profiles + float lRandom = fRndm->Rndm(); + int sampleIndex = static_cast(cfgNSubsample * lRandom); + + histos.get(HIST("Prof2D_mu1_antiproton"))->Fill(cent, sampleIndex, std::pow(netProt, 1.0)); + histos.get(HIST("Prof2D_mu2_antiproton"))->Fill(cent, sampleIndex, std::pow(netProt, 2.0)); + histos.get(HIST("Prof2D_mu3_antiproton"))->Fill(cent, sampleIndex, std::pow(netProt, 3.0)); + histos.get(HIST("Prof2D_mu4_antiproton"))->Fill(cent, sampleIndex, std::pow(netProt, 4.0)); + histos.get(HIST("Prof2D_mu5_antiproton"))->Fill(cent, sampleIndex, std::pow(netProt, 5.0)); + histos.get(HIST("Prof2D_mu6_antiproton"))->Fill(cent, sampleIndex, std::pow(netProt, 6.0)); + histos.get(HIST("Prof2D_mu7_antiproton"))->Fill(cent, sampleIndex, std::pow(netProt, 7.0)); + histos.get(HIST("Prof2D_mu8_antiproton"))->Fill(cent, sampleIndex, std::pow(netProt, 8.0)); + + histos.get(HIST("Prof2D_Q11_1"))->Fill(cent, sampleIndex, fQ11_1); + histos.get(HIST("Prof2D_Q11_2"))->Fill(cent, sampleIndex, fQ11_2); + histos.get(HIST("Prof2D_Q11_3"))->Fill(cent, sampleIndex, fQ11_3); + histos.get(HIST("Prof2D_Q11_4"))->Fill(cent, sampleIndex, fQ11_4); + histos.get(HIST("Prof2D_Q21_1"))->Fill(cent, sampleIndex, fQ21_1); + histos.get(HIST("Prof2D_Q22_1"))->Fill(cent, sampleIndex, fQ22_1); + histos.get(HIST("Prof2D_Q31_1"))->Fill(cent, sampleIndex, fQ31_1); + histos.get(HIST("Prof2D_Q32_1"))->Fill(cent, sampleIndex, fQ32_1); + histos.get(HIST("Prof2D_Q33_1"))->Fill(cent, sampleIndex, fQ33_1); + histos.get(HIST("Prof2D_Q41_1"))->Fill(cent, sampleIndex, fQ41_1); + histos.get(HIST("Prof2D_Q42_1"))->Fill(cent, sampleIndex, fQ42_1); + histos.get(HIST("Prof2D_Q43_1"))->Fill(cent, sampleIndex, fQ43_1); + histos.get(HIST("Prof2D_Q44_1"))->Fill(cent, sampleIndex, fQ44_1); + histos.get(HIST("Prof2D_Q21_2"))->Fill(cent, sampleIndex, fQ21_2); + histos.get(HIST("Prof2D_Q22_2"))->Fill(cent, sampleIndex, fQ22_2); + histos.get(HIST("Prof2D_Q1121_11"))->Fill(cent, sampleIndex, fQ1121_11); + histos.get(HIST("Prof2D_Q1121_01"))->Fill(cent, sampleIndex, fQ1121_01); + histos.get(HIST("Prof2D_Q1121_10"))->Fill(cent, sampleIndex, fQ1121_10); + histos.get(HIST("Prof2D_Q1121_20"))->Fill(cent, sampleIndex, fQ1121_20); + histos.get(HIST("Prof2D_Q1121_21"))->Fill(cent, sampleIndex, fQ1121_21); + histos.get(HIST("Prof2D_Q1122_11"))->Fill(cent, sampleIndex, fQ1122_11); + histos.get(HIST("Prof2D_Q1122_01"))->Fill(cent, sampleIndex, fQ1122_01); + histos.get(HIST("Prof2D_Q1122_10"))->Fill(cent, sampleIndex, fQ1122_10); + histos.get(HIST("Prof2D_Q1122_20"))->Fill(cent, sampleIndex, fQ1122_20); + histos.get(HIST("Prof2D_Q1122_21"))->Fill(cent, sampleIndex, fQ1122_21); + histos.get(HIST("Prof2D_Q1131_11"))->Fill(cent, sampleIndex, fQ1131_11); + histos.get(HIST("Prof2D_Q1131_01"))->Fill(cent, sampleIndex, fQ1131_01); + histos.get(HIST("Prof2D_Q1131_10"))->Fill(cent, sampleIndex, fQ1131_10); + histos.get(HIST("Prof2D_Q1132_11"))->Fill(cent, sampleIndex, fQ1132_11); + histos.get(HIST("Prof2D_Q1132_01"))->Fill(cent, sampleIndex, fQ1132_01); + histos.get(HIST("Prof2D_Q1132_10"))->Fill(cent, sampleIndex, fQ1132_10); + histos.get(HIST("Prof2D_Q1133_11"))->Fill(cent, sampleIndex, fQ1133_11); + histos.get(HIST("Prof2D_Q1133_01"))->Fill(cent, sampleIndex, fQ1133_01); + histos.get(HIST("Prof2D_Q1133_10"))->Fill(cent, sampleIndex, fQ1133_10); + histos.get(HIST("Prof2D_Q2122_11"))->Fill(cent, sampleIndex, fQ2122_11); + histos.get(HIST("Prof2D_Q2122_01"))->Fill(cent, sampleIndex, fQ2122_01); + histos.get(HIST("Prof2D_Q2122_10"))->Fill(cent, sampleIndex, fQ2122_10); + histos.get(HIST("Prof2D_Q3132_11"))->Fill(cent, sampleIndex, fQ3132_11); + histos.get(HIST("Prof2D_Q3132_01"))->Fill(cent, sampleIndex, fQ3132_01); + histos.get(HIST("Prof2D_Q3132_10"))->Fill(cent, sampleIndex, fQ3132_10); + histos.get(HIST("Prof2D_Q3133_11"))->Fill(cent, sampleIndex, fQ3133_11); + histos.get(HIST("Prof2D_Q3133_01"))->Fill(cent, sampleIndex, fQ3133_01); + histos.get(HIST("Prof2D_Q3133_10"))->Fill(cent, sampleIndex, fQ3133_10); + histos.get(HIST("Prof2D_Q3233_11"))->Fill(cent, sampleIndex, fQ3233_11); + histos.get(HIST("Prof2D_Q3233_01"))->Fill(cent, sampleIndex, fQ3233_01); + histos.get(HIST("Prof2D_Q3233_10"))->Fill(cent, sampleIndex, fQ3233_10); + histos.get(HIST("Prof2D_Q2241_11"))->Fill(cent, sampleIndex, fQ2241_11); + histos.get(HIST("Prof2D_Q2241_01"))->Fill(cent, sampleIndex, fQ2241_01); + histos.get(HIST("Prof2D_Q2241_10"))->Fill(cent, sampleIndex, fQ2241_10); + histos.get(HIST("Prof2D_Q2242_11"))->Fill(cent, sampleIndex, fQ2242_11); + histos.get(HIST("Prof2D_Q2242_01"))->Fill(cent, sampleIndex, fQ2242_01); + histos.get(HIST("Prof2D_Q2242_10"))->Fill(cent, sampleIndex, fQ2242_10); + histos.get(HIST("Prof2D_Q2243_11"))->Fill(cent, sampleIndex, fQ2243_11); + histos.get(HIST("Prof2D_Q2243_01"))->Fill(cent, sampleIndex, fQ2243_01); + histos.get(HIST("Prof2D_Q2243_10"))->Fill(cent, sampleIndex, fQ2243_10); + histos.get(HIST("Prof2D_Q2244_11"))->Fill(cent, sampleIndex, fQ2244_11); + histos.get(HIST("Prof2D_Q2244_01"))->Fill(cent, sampleIndex, fQ2244_01); + histos.get(HIST("Prof2D_Q2244_10"))->Fill(cent, sampleIndex, fQ2244_10); + histos.get(HIST("Prof2D_Q2141_11"))->Fill(cent, sampleIndex, fQ2141_11); + histos.get(HIST("Prof2D_Q2141_01"))->Fill(cent, sampleIndex, fQ2141_01); + histos.get(HIST("Prof2D_Q2141_10"))->Fill(cent, sampleIndex, fQ2141_10); + histos.get(HIST("Prof2D_Q2142_11"))->Fill(cent, sampleIndex, fQ2142_11); + histos.get(HIST("Prof2D_Q2142_01"))->Fill(cent, sampleIndex, fQ2142_01); + histos.get(HIST("Prof2D_Q2142_10"))->Fill(cent, sampleIndex, fQ2142_10); + histos.get(HIST("Prof2D_Q2143_11"))->Fill(cent, sampleIndex, fQ2143_11); + histos.get(HIST("Prof2D_Q2143_01"))->Fill(cent, sampleIndex, fQ2143_01); + histos.get(HIST("Prof2D_Q2143_10"))->Fill(cent, sampleIndex, fQ2143_10); + histos.get(HIST("Prof2D_Q2144_11"))->Fill(cent, sampleIndex, fQ2144_11); + histos.get(HIST("Prof2D_Q2144_01"))->Fill(cent, sampleIndex, fQ2144_01); + histos.get(HIST("Prof2D_Q2144_10"))->Fill(cent, sampleIndex, fQ2144_10); + histos.get(HIST("Prof2D_Q1151_11"))->Fill(cent, sampleIndex, fQ1151_11); + histos.get(HIST("Prof2D_Q1151_01"))->Fill(cent, sampleIndex, fQ1151_01); + histos.get(HIST("Prof2D_Q1151_10"))->Fill(cent, sampleIndex, fQ1151_10); + histos.get(HIST("Prof2D_Q1152_11"))->Fill(cent, sampleIndex, fQ1152_11); + histos.get(HIST("Prof2D_Q1152_01"))->Fill(cent, sampleIndex, fQ1152_01); + histos.get(HIST("Prof2D_Q1152_10"))->Fill(cent, sampleIndex, fQ1152_10); + histos.get(HIST("Prof2D_Q1153_11"))->Fill(cent, sampleIndex, fQ1153_11); + histos.get(HIST("Prof2D_Q1153_01"))->Fill(cent, sampleIndex, fQ1153_01); + histos.get(HIST("Prof2D_Q1153_10"))->Fill(cent, sampleIndex, fQ1153_10); + histos.get(HIST("Prof2D_Q1154_11"))->Fill(cent, sampleIndex, fQ1154_11); + histos.get(HIST("Prof2D_Q1154_01"))->Fill(cent, sampleIndex, fQ1154_01); + histos.get(HIST("Prof2D_Q1154_10"))->Fill(cent, sampleIndex, fQ1154_10); + histos.get(HIST("Prof2D_Q1155_11"))->Fill(cent, sampleIndex, fQ1155_11); + histos.get(HIST("Prof2D_Q1155_01"))->Fill(cent, sampleIndex, fQ1155_01); + histos.get(HIST("Prof2D_Q1155_10"))->Fill(cent, sampleIndex, fQ1155_10); + histos.get(HIST("Prof2D_Q112233_001"))->Fill(cent, sampleIndex, fQ112233_001); + histos.get(HIST("Prof2D_Q112233_010"))->Fill(cent, sampleIndex, fQ112233_010); + histos.get(HIST("Prof2D_Q112233_100"))->Fill(cent, sampleIndex, fQ112233_100); + histos.get(HIST("Prof2D_Q112233_011"))->Fill(cent, sampleIndex, fQ112233_011); + histos.get(HIST("Prof2D_Q112233_101"))->Fill(cent, sampleIndex, fQ112233_101); + histos.get(HIST("Prof2D_Q112233_110"))->Fill(cent, sampleIndex, fQ112233_110); + histos.get(HIST("Prof2D_Q112232_001"))->Fill(cent, sampleIndex, fQ112232_001); + histos.get(HIST("Prof2D_Q112232_010"))->Fill(cent, sampleIndex, fQ112232_010); + histos.get(HIST("Prof2D_Q112232_100"))->Fill(cent, sampleIndex, fQ112232_100); + histos.get(HIST("Prof2D_Q112232_011"))->Fill(cent, sampleIndex, fQ112232_011); + histos.get(HIST("Prof2D_Q112232_101"))->Fill(cent, sampleIndex, fQ112232_101); + histos.get(HIST("Prof2D_Q112232_110"))->Fill(cent, sampleIndex, fQ112232_110); + histos.get(HIST("Prof2D_Q112231_001"))->Fill(cent, sampleIndex, fQ112231_001); + histos.get(HIST("Prof2D_Q112231_010"))->Fill(cent, sampleIndex, fQ112231_010); + histos.get(HIST("Prof2D_Q112231_100"))->Fill(cent, sampleIndex, fQ112231_100); + histos.get(HIST("Prof2D_Q112231_011"))->Fill(cent, sampleIndex, fQ112231_011); + histos.get(HIST("Prof2D_Q112231_101"))->Fill(cent, sampleIndex, fQ112231_101); + histos.get(HIST("Prof2D_Q112231_110"))->Fill(cent, sampleIndex, fQ112231_110); + histos.get(HIST("Prof2D_Q112133_001"))->Fill(cent, sampleIndex, fQ112133_001); + histos.get(HIST("Prof2D_Q112133_010"))->Fill(cent, sampleIndex, fQ112133_010); + histos.get(HIST("Prof2D_Q112133_100"))->Fill(cent, sampleIndex, fQ112133_100); + histos.get(HIST("Prof2D_Q112133_011"))->Fill(cent, sampleIndex, fQ112133_011); + histos.get(HIST("Prof2D_Q112133_101"))->Fill(cent, sampleIndex, fQ112133_101); + histos.get(HIST("Prof2D_Q112133_110"))->Fill(cent, sampleIndex, fQ112133_110); + histos.get(HIST("Prof2D_Q112132_001"))->Fill(cent, sampleIndex, fQ112132_001); + histos.get(HIST("Prof2D_Q112132_010"))->Fill(cent, sampleIndex, fQ112132_010); + histos.get(HIST("Prof2D_Q112132_100"))->Fill(cent, sampleIndex, fQ112132_100); + histos.get(HIST("Prof2D_Q112132_011"))->Fill(cent, sampleIndex, fQ112132_011); + histos.get(HIST("Prof2D_Q112132_101"))->Fill(cent, sampleIndex, fQ112132_101); + histos.get(HIST("Prof2D_Q112132_110"))->Fill(cent, sampleIndex, fQ112132_110); + histos.get(HIST("Prof2D_Q112131_001"))->Fill(cent, sampleIndex, fQ112131_001); + histos.get(HIST("Prof2D_Q112131_010"))->Fill(cent, sampleIndex, fQ112131_010); + histos.get(HIST("Prof2D_Q112131_100"))->Fill(cent, sampleIndex, fQ112131_100); + histos.get(HIST("Prof2D_Q112131_011"))->Fill(cent, sampleIndex, fQ112131_011); + histos.get(HIST("Prof2D_Q112131_101"))->Fill(cent, sampleIndex, fQ112131_101); + histos.get(HIST("Prof2D_Q112131_110"))->Fill(cent, sampleIndex, fQ112131_110); + histos.get(HIST("Prof2D_Q2221_11"))->Fill(cent, sampleIndex, fQ2221_11); + histos.get(HIST("Prof2D_Q2221_01"))->Fill(cent, sampleIndex, fQ2221_01); + histos.get(HIST("Prof2D_Q2221_10"))->Fill(cent, sampleIndex, fQ2221_10); + histos.get(HIST("Prof2D_Q2221_21"))->Fill(cent, sampleIndex, fQ2221_21); + histos.get(HIST("Prof2D_Q2221_20"))->Fill(cent, sampleIndex, fQ2221_20); + histos.get(HIST("Prof2D_Q2122_21"))->Fill(cent, sampleIndex, fQ2122_21); + histos.get(HIST("Prof2D_Q2122_20"))->Fill(cent, sampleIndex, fQ2122_20); + histos.get(HIST("Prof2D_Q1121_02"))->Fill(cent, sampleIndex, fQ1121_02); + histos.get(HIST("Prof2D_Q1121_12"))->Fill(cent, sampleIndex, fQ1121_12); + histos.get(HIST("Prof2D_Q1121_22"))->Fill(cent, sampleIndex, fQ1121_22); + histos.get(HIST("Prof2D_Q1122_02"))->Fill(cent, sampleIndex, fQ1122_02); + histos.get(HIST("Prof2D_Q1122_12"))->Fill(cent, sampleIndex, fQ1122_12); + histos.get(HIST("Prof2D_Q1122_22"))->Fill(cent, sampleIndex, fQ1122_22); + histos.get(HIST("Prof2D_Q112221_001"))->Fill(cent, sampleIndex, fQ112221_001); + histos.get(HIST("Prof2D_Q112221_010"))->Fill(cent, sampleIndex, fQ112221_010); + histos.get(HIST("Prof2D_Q112221_100"))->Fill(cent, sampleIndex, fQ112221_100); + histos.get(HIST("Prof2D_Q112221_011"))->Fill(cent, sampleIndex, fQ112221_011); + histos.get(HIST("Prof2D_Q112221_101"))->Fill(cent, sampleIndex, fQ112221_101); + histos.get(HIST("Prof2D_Q112221_110"))->Fill(cent, sampleIndex, fQ112221_110); + histos.get(HIST("Prof2D_Q112221_200"))->Fill(cent, sampleIndex, fQ112221_200); + histos.get(HIST("Prof2D_Q112221_201"))->Fill(cent, sampleIndex, fQ112221_201); + histos.get(HIST("Prof2D_Q112221_210"))->Fill(cent, sampleIndex, fQ112221_210); + histos.get(HIST("Prof2D_Q112221_211"))->Fill(cent, sampleIndex, fQ112221_211); + histos.get(HIST("Prof2D_Q1131_21"))->Fill(cent, sampleIndex, fQ1131_21); + histos.get(HIST("Prof2D_Q1131_20"))->Fill(cent, sampleIndex, fQ1131_20); + histos.get(HIST("Prof2D_Q1131_31"))->Fill(cent, sampleIndex, fQ1131_31); + histos.get(HIST("Prof2D_Q1131_30"))->Fill(cent, sampleIndex, fQ1131_30); + histos.get(HIST("Prof2D_Q1132_21"))->Fill(cent, sampleIndex, fQ1132_21); + histos.get(HIST("Prof2D_Q1132_20"))->Fill(cent, sampleIndex, fQ1132_20); + histos.get(HIST("Prof2D_Q1132_31"))->Fill(cent, sampleIndex, fQ1132_31); + histos.get(HIST("Prof2D_Q1132_30"))->Fill(cent, sampleIndex, fQ1132_30); + histos.get(HIST("Prof2D_Q1133_21"))->Fill(cent, sampleIndex, fQ1133_21); + histos.get(HIST("Prof2D_Q1133_20"))->Fill(cent, sampleIndex, fQ1133_20); + histos.get(HIST("Prof2D_Q1133_31"))->Fill(cent, sampleIndex, fQ1133_31); + histos.get(HIST("Prof2D_Q1133_30"))->Fill(cent, sampleIndex, fQ1133_30); + histos.get(HIST("Prof2D_Q11_5"))->Fill(cent, sampleIndex, fQ11_5); + histos.get(HIST("Prof2D_Q11_6"))->Fill(cent, sampleIndex, fQ11_6); + histos.get(HIST("Prof2D_Q1121_30"))->Fill(cent, sampleIndex, fQ1121_30); + histos.get(HIST("Prof2D_Q1121_31"))->Fill(cent, sampleIndex, fQ1121_31); + histos.get(HIST("Prof2D_Q1121_40"))->Fill(cent, sampleIndex, fQ1121_40); + histos.get(HIST("Prof2D_Q1121_41"))->Fill(cent, sampleIndex, fQ1121_41); + histos.get(HIST("Prof2D_Q1122_30"))->Fill(cent, sampleIndex, fQ1122_30); + histos.get(HIST("Prof2D_Q1122_31"))->Fill(cent, sampleIndex, fQ1122_31); + histos.get(HIST("Prof2D_Q1122_40"))->Fill(cent, sampleIndex, fQ1122_40); + histos.get(HIST("Prof2D_Q1122_41"))->Fill(cent, sampleIndex, fQ1122_41); + histos.get(HIST("Prof2D_Q2211_11"))->Fill(cent, sampleIndex, fQ2211_11); + histos.get(HIST("Prof2D_Q2211_01"))->Fill(cent, sampleIndex, fQ2211_01); + histos.get(HIST("Prof2D_Q2211_10"))->Fill(cent, sampleIndex, fQ2211_10); + histos.get(HIST("Prof2D_Q2211_20"))->Fill(cent, sampleIndex, fQ2211_20); + histos.get(HIST("Prof2D_Q2211_21"))->Fill(cent, sampleIndex, fQ2211_21); + histos.get(HIST("Prof2D_Q2111_11"))->Fill(cent, sampleIndex, fQ2111_11); + histos.get(HIST("Prof2D_Q2111_01"))->Fill(cent, sampleIndex, fQ2111_01); + histos.get(HIST("Prof2D_Q2111_10"))->Fill(cent, sampleIndex, fQ2111_10); + histos.get(HIST("Prof2D_Q2111_20"))->Fill(cent, sampleIndex, fQ2111_20); + histos.get(HIST("Prof2D_Q2111_21"))->Fill(cent, sampleIndex, fQ2111_21); + histos.get(HIST("Prof2D_Q112122_001"))->Fill(cent, sampleIndex, fQ112122_001); + histos.get(HIST("Prof2D_Q112122_010"))->Fill(cent, sampleIndex, fQ112122_010); + histos.get(HIST("Prof2D_Q112122_100"))->Fill(cent, sampleIndex, fQ112122_100); + histos.get(HIST("Prof2D_Q112122_011"))->Fill(cent, sampleIndex, fQ112122_011); + histos.get(HIST("Prof2D_Q112122_101"))->Fill(cent, sampleIndex, fQ112122_101); + histos.get(HIST("Prof2D_Q112122_110"))->Fill(cent, sampleIndex, fQ112122_110); + histos.get(HIST("Prof2D_Q1141_11"))->Fill(cent, sampleIndex, fQ1141_11); + histos.get(HIST("Prof2D_Q1141_01"))->Fill(cent, sampleIndex, fQ1141_01); + histos.get(HIST("Prof2D_Q1141_10"))->Fill(cent, sampleIndex, fQ1141_10); + histos.get(HIST("Prof2D_Q1141_20"))->Fill(cent, sampleIndex, fQ1141_20); + histos.get(HIST("Prof2D_Q1141_21"))->Fill(cent, sampleIndex, fQ1141_21); + histos.get(HIST("Prof2D_Q1142_11"))->Fill(cent, sampleIndex, fQ1142_11); + histos.get(HIST("Prof2D_Q1142_01"))->Fill(cent, sampleIndex, fQ1142_01); + histos.get(HIST("Prof2D_Q1142_10"))->Fill(cent, sampleIndex, fQ1142_10); + histos.get(HIST("Prof2D_Q1142_20"))->Fill(cent, sampleIndex, fQ1142_20); + histos.get(HIST("Prof2D_Q1142_21"))->Fill(cent, sampleIndex, fQ1142_21); + histos.get(HIST("Prof2D_Q1143_11"))->Fill(cent, sampleIndex, fQ1143_11); + histos.get(HIST("Prof2D_Q1143_01"))->Fill(cent, sampleIndex, fQ1143_01); + histos.get(HIST("Prof2D_Q1143_10"))->Fill(cent, sampleIndex, fQ1143_10); + histos.get(HIST("Prof2D_Q1143_20"))->Fill(cent, sampleIndex, fQ1143_20); + histos.get(HIST("Prof2D_Q1143_21"))->Fill(cent, sampleIndex, fQ1143_21); + histos.get(HIST("Prof2D_Q1144_11"))->Fill(cent, sampleIndex, fQ1144_11); + histos.get(HIST("Prof2D_Q1144_01"))->Fill(cent, sampleIndex, fQ1144_01); + histos.get(HIST("Prof2D_Q1144_10"))->Fill(cent, sampleIndex, fQ1144_10); + histos.get(HIST("Prof2D_Q1144_20"))->Fill(cent, sampleIndex, fQ1144_20); + histos.get(HIST("Prof2D_Q1144_21"))->Fill(cent, sampleIndex, fQ1144_21); + histos.get(HIST("Prof2D_Q2131_11"))->Fill(cent, sampleIndex, fQ2131_11); + histos.get(HIST("Prof2D_Q2131_01"))->Fill(cent, sampleIndex, fQ2131_01); + histos.get(HIST("Prof2D_Q2131_10"))->Fill(cent, sampleIndex, fQ2131_10); + histos.get(HIST("Prof2D_Q2132_11"))->Fill(cent, sampleIndex, fQ2132_11); + histos.get(HIST("Prof2D_Q2132_01"))->Fill(cent, sampleIndex, fQ2132_01); + histos.get(HIST("Prof2D_Q2132_10"))->Fill(cent, sampleIndex, fQ2132_10); + histos.get(HIST("Prof2D_Q2133_11"))->Fill(cent, sampleIndex, fQ2133_11); + histos.get(HIST("Prof2D_Q2133_01"))->Fill(cent, sampleIndex, fQ2133_01); + histos.get(HIST("Prof2D_Q2133_10"))->Fill(cent, sampleIndex, fQ2133_10); + histos.get(HIST("Prof2D_Q2231_11"))->Fill(cent, sampleIndex, fQ2231_11); + histos.get(HIST("Prof2D_Q2231_01"))->Fill(cent, sampleIndex, fQ2231_01); + histos.get(HIST("Prof2D_Q2231_10"))->Fill(cent, sampleIndex, fQ2231_10); + histos.get(HIST("Prof2D_Q2232_11"))->Fill(cent, sampleIndex, fQ2232_11); + histos.get(HIST("Prof2D_Q2232_01"))->Fill(cent, sampleIndex, fQ2232_01); + histos.get(HIST("Prof2D_Q2232_10"))->Fill(cent, sampleIndex, fQ2232_10); + histos.get(HIST("Prof2D_Q2233_11"))->Fill(cent, sampleIndex, fQ2233_11); + histos.get(HIST("Prof2D_Q2233_01"))->Fill(cent, sampleIndex, fQ2233_01); + histos.get(HIST("Prof2D_Q2233_10"))->Fill(cent, sampleIndex, fQ2233_10); + histos.get(HIST("Prof2D_Q51_1"))->Fill(cent, sampleIndex, fQ51_1); + histos.get(HIST("Prof2D_Q52_1"))->Fill(cent, sampleIndex, fQ52_1); + histos.get(HIST("Prof2D_Q53_1"))->Fill(cent, sampleIndex, fQ53_1); + histos.get(HIST("Prof2D_Q54_1"))->Fill(cent, sampleIndex, fQ54_1); + histos.get(HIST("Prof2D_Q55_1"))->Fill(cent, sampleIndex, fQ55_1); + histos.get(HIST("Prof2D_Q21_3"))->Fill(cent, sampleIndex, fQ21_3); + histos.get(HIST("Prof2D_Q22_3"))->Fill(cent, sampleIndex, fQ22_3); + histos.get(HIST("Prof2D_Q31_2"))->Fill(cent, sampleIndex, fQ31_2); + histos.get(HIST("Prof2D_Q32_2"))->Fill(cent, sampleIndex, fQ32_2); + histos.get(HIST("Prof2D_Q33_2"))->Fill(cent, sampleIndex, fQ33_2); + histos.get(HIST("Prof2D_Q61_1"))->Fill(cent, sampleIndex, fQ61_1); + histos.get(HIST("Prof2D_Q62_1"))->Fill(cent, sampleIndex, fQ62_1); + histos.get(HIST("Prof2D_Q63_1"))->Fill(cent, sampleIndex, fQ63_1); + histos.get(HIST("Prof2D_Q64_1"))->Fill(cent, sampleIndex, fQ64_1); + histos.get(HIST("Prof2D_Q65_1"))->Fill(cent, sampleIndex, fQ65_1); + histos.get(HIST("Prof2D_Q66_1"))->Fill(cent, sampleIndex, fQ66_1); + histos.get(HIST("Prof2D_Q112122_111"))->Fill(cent, sampleIndex, fQ112122_111); + histos.get(HIST("Prof2D_Q112131_111"))->Fill(cent, sampleIndex, fQ112131_111); + histos.get(HIST("Prof2D_Q112132_111"))->Fill(cent, sampleIndex, fQ112132_111); + histos.get(HIST("Prof2D_Q112133_111"))->Fill(cent, sampleIndex, fQ112133_111); + histos.get(HIST("Prof2D_Q112231_111"))->Fill(cent, sampleIndex, fQ112231_111); + histos.get(HIST("Prof2D_Q112232_111"))->Fill(cent, sampleIndex, fQ112232_111); + histos.get(HIST("Prof2D_Q112233_111"))->Fill(cent, sampleIndex, fQ112233_111); + histos.get(HIST("Prof2D_Q112221_111"))->Fill(cent, sampleIndex, fQ112221_111); + } + } + PROCESS_SWITCH(AntiprotonCumulantsMc, processDataRec, "Process real data", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + WorkflowSpec workflow{adaptAnalysisTask(cfgc)}; + return workflow; +} From 01111697e9dc55cecbbb73876285a00e8b0756a1 Mon Sep 17 00:00:00 2001 From: prottayCMT <61418725+prottayCMT@users.noreply.github.com> Date: Sat, 15 Mar 2025 04:08:44 +0100 Subject: [PATCH 0690/1650] [PWGLF] updated code for systematic study (#10485) Co-authored-by: Prottay Das --- PWGLF/Tasks/Strangeness/lambdapolsp.cxx | 311 +++++++++++++++++------- 1 file changed, 222 insertions(+), 89 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdapolsp.cxx b/PWGLF/Tasks/Strangeness/lambdapolsp.cxx index 995f178b097..18c2b7b06da 100644 --- a/PWGLF/Tasks/Strangeness/lambdapolsp.cxx +++ b/PWGLF/Tasks/Strangeness/lambdapolsp.cxx @@ -80,20 +80,19 @@ struct lambdapolsp { Configurable additionalEvSel4{"additionalEvSel4", false, "additionalEvSel4"}; Configurable globalpt{"globalpt", true, "select tracks based on pt global vs tpc"}; Configurable cqvas{"cqvas", false, "change q vectors after shift correction"}; - Configurable useonlypsis{"useonlypsis", true, "use only psis to calculate total spectator plane angle"}; Configurable useprofile{"useprofile", 3, "flag to select profile vs Sparse"}; Configurable QxyNbins{"QxyNbins", 100, "Number of bins in QxQy histograms"}; Configurable lbinQxy{"lbinQxy", -5.0, "lower bin value in QxQy histograms"}; Configurable hbinQxy{"hbinQxy", 5.0, "higher bin value in QxQy histograms"}; Configurable cfgMaxOccupancy{"cfgMaxOccupancy", 1000, "maximum occupancy of tracks in neighbouring collisions in a given time range"}; Configurable cfgMinOccupancy{"cfgMinOccupancy", 0, "maximum occupancy of tracks in neighbouring collisions in a given time range"}; - + Configurable sys{"sys", 1, "flag to select systematic source"}; + Configurable dosystematic{"dosystematic", false, "flag to perform systematic study"}; // events Configurable cfgCutVertex{"cfgCutVertex", 10.0f, "Accepted z-vertex range"}; Configurable cfgCutCentralityMax{"cfgCutCentralityMax", 50.0f, "Accepted maximum Centrality"}; Configurable cfgCutCentralityMin{"cfgCutCentralityMin", 30.0f, "Accepted minimum Centrality"}; // proton track cut - Configurable confRapidity{"confRapidity", 0.8, "cut on Rapidity"}; Configurable cfgCutPT{"cfgCutPT", 0.15, "PT cut on daughter track"}; Configurable cfgCutEta{"cfgCutEta", 0.8, "Eta cut on daughter track"}; Configurable cfgCutDCAxy{"cfgCutDCAxy", 0.1f, "DCAxy range for tracks"}; @@ -169,6 +168,7 @@ struct lambdapolsp { AxisSpec pxAxis = {pxNbins, -10.0, 10.0, "Px"}; AxisSpec spAxis = {spNbins, lbinsp, hbinsp, "Sp"}; AxisSpec qxZDCAxis = {QxyNbins, lbinQxy, hbinQxy, "Qx"}; + AxisSpec binAxis = {10, 0, 10.0, "BA"}; if (checkwithpub) { if (useprofile == 2) { @@ -293,37 +293,37 @@ struct lambdapolsp { histos.add("hcentQxZDCC", "hcentQxZDCC", kTH2F, {{centAxis}, {qxZDCAxis}}); histos.add("hcentQyZDCC", "hcentQyZDCC", kTH2F, {{centAxis}, {qxZDCAxis}});*/ - histos.add("hSparseLambdaCosPsiA", "hSparseLambdaCosPsiA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); - histos.add("hSparseLambdaSinPsiA", "hSparseLambdaSinPsiA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); - histos.add("hSparseLambdaCosPsiC", "hSparseLambdaCosPsiC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); - histos.add("hSparseLambdaSinPsiC", "hSparseLambdaSinPsiC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); - histos.add("hSparseLambdaCosPsi", "hSparseLambdaCosPsi", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); - histos.add("hSparseLambdaSinPsi", "hSparseLambdaSinPsi", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); - histos.add("hSparseAntiLambdaCosPsiA", "hSparseAntiLambdaCosPsiA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); - histos.add("hSparseAntiLambdaSinPsiA", "hSparseAntiLambdaSinPsiA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); - histos.add("hSparseAntiLambdaCosPsiC", "hSparseAntiLambdaCosPsiC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); - histos.add("hSparseAntiLambdaSinPsiC", "hSparseAntiLambdaSinPsiC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); - histos.add("hSparseAntiLambdaCosPsi", "hSparseAntiLambdaCosPsi", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); - histos.add("hSparseAntiLambdaSinPsi", "hSparseAntiLambdaSinPsi", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); - - histos.add("hSparseLambdaPol", "hSparseLambdaPol", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); - histos.add("hSparseLambdaPolA", "hSparseLambdaPolA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); - histos.add("hSparseLambdaPolC", "hSparseLambdaPolC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); - histos.add("hSparseAntiLambdaPol", "hSparseAntiLambdaPol", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); - histos.add("hSparseAntiLambdaPolA", "hSparseAntiLambdaPolA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); - histos.add("hSparseAntiLambdaPolC", "hSparseAntiLambdaPolC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); - - histos.add("hSparseLambda_corr1a", "hSparseLambda_corr1a", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); - histos.add("hSparseLambda_corr1b", "hSparseLambda_corr1b", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); - histos.add("hSparseLambda_corr1c", "hSparseLambda_corr1c", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configphiAxis, configcentAxis}, true); - histos.add("hSparseAntiLambda_corr1a", "hSparseAntiLambda_corr1a", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); - histos.add("hSparseAntiLambda_corr1b", "hSparseAntiLambda_corr1b", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); - histos.add("hSparseAntiLambda_corr1c", "hSparseAntiLambda_corr1c", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configphiAxis, configcentAxis}, true); - - histos.add("hSparseLambda_corr2a", "hSparseLambda_corr2a", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); - histos.add("hSparseLambda_corr2b", "hSparseLambda_corr2b", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); - histos.add("hSparseAntiLambda_corr2a", "hSparseAntiLambda_corr2a", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); - histos.add("hSparseAntiLambda_corr2b", "hSparseAntiLambda_corr2b", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configetaAxis, configthnAxisPol, configcentAxis}, true); + histos.add("hSparseLambdaCosPsiA", "hSparseLambdaCosPsiA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); + histos.add("hSparseLambdaSinPsiA", "hSparseLambdaSinPsiA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); + histos.add("hSparseLambdaCosPsiC", "hSparseLambdaCosPsiC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); + histos.add("hSparseLambdaSinPsiC", "hSparseLambdaSinPsiC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); + histos.add("hSparseLambdaCosPsi", "hSparseLambdaCosPsi", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); + histos.add("hSparseLambdaSinPsi", "hSparseLambdaSinPsi", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); + histos.add("hSparseAntiLambdaCosPsiA", "hSparseAntiLambdaCosPsiA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); + histos.add("hSparseAntiLambdaSinPsiA", "hSparseAntiLambdaSinPsiA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); + histos.add("hSparseAntiLambdaCosPsiC", "hSparseAntiLambdaCosPsiC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); + histos.add("hSparseAntiLambdaSinPsiC", "hSparseAntiLambdaSinPsiC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); + histos.add("hSparseAntiLambdaCosPsi", "hSparseAntiLambdaCosPsi", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); + histos.add("hSparseAntiLambdaSinPsi", "hSparseAntiLambdaSinPsi", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); + + histos.add("hSparseLambdaPol", "hSparseLambdaPol", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); + histos.add("hSparseLambdaPolA", "hSparseLambdaPolA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); + histos.add("hSparseLambdaPolC", "hSparseLambdaPolC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); + histos.add("hSparseAntiLambdaPol", "hSparseAntiLambdaPol", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); + histos.add("hSparseAntiLambdaPolA", "hSparseAntiLambdaPolA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); + histos.add("hSparseAntiLambdaPolC", "hSparseAntiLambdaPolC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); + + histos.add("hSparseLambda_corr1a", "hSparseLambda_corr1a", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); + histos.add("hSparseLambda_corr1b", "hSparseLambda_corr1b", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); + histos.add("hSparseLambda_corr1c", "hSparseLambda_corr1c", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configphiAxis, configcentAxis, binAxis}, true); + histos.add("hSparseAntiLambda_corr1a", "hSparseAntiLambda_corr1a", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); + histos.add("hSparseAntiLambda_corr1b", "hSparseAntiLambda_corr1b", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); + histos.add("hSparseAntiLambda_corr1c", "hSparseAntiLambda_corr1c", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configphiAxis, configcentAxis, binAxis}, true); + + histos.add("hSparseLambda_corr2a", "hSparseLambda_corr2a", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); + histos.add("hSparseLambda_corr2b", "hSparseLambda_corr2b", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); + histos.add("hSparseAntiLambda_corr2a", "hSparseAntiLambda_corr2a", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); + histos.add("hSparseAntiLambda_corr2b", "hSparseAntiLambda_corr2b", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); } } @@ -503,7 +503,7 @@ struct lambdapolsp { void fillHistograms(bool tag1, bool tag2, const ROOT::Math::PxPyPzMVector& particle, const ROOT::Math::PxPyPzMVector& daughter, double psiZDCC, double psiZDCA, double psiZDC, double centrality, - double candmass, double candpt, double candeta) + double candmass, double candpt, float desbinvalue) { ROOT::Math::Boost boost{particle.BoostToCM()}; @@ -525,38 +525,39 @@ struct lambdapolsp { // Fill histograms using constructed names if (tag2) { - histos.fill(HIST("hSparseAntiLambdaCosPsiA"), candmass, candpt, candeta, (TMath::Cos(GetPhiInRange(psiZDCA))), centrality); - histos.fill(HIST("hSparseAntiLambdaCosPsiC"), candmass, candpt, candeta, (TMath::Cos(GetPhiInRange(psiZDCC))), centrality); - histos.fill(HIST("hSparseAntiLambdaSinPsiA"), candmass, candpt, candeta, (TMath::Sin(GetPhiInRange(psiZDCA))), centrality); - histos.fill(HIST("hSparseAntiLambdaSinPsiC"), candmass, candpt, candeta, (TMath::Sin(GetPhiInRange(psiZDCC))), centrality); - histos.fill(HIST("hSparseAntiLambdaCosPsi"), candmass, candpt, candeta, (TMath::Cos(GetPhiInRange(psiZDC))), centrality); - histos.fill(HIST("hSparseAntiLambdaSinPsi"), candmass, candpt, candeta, (TMath::Sin(GetPhiInRange(psiZDC))), centrality); - - histos.fill(HIST("hSparseAntiLambdaPolA"), candmass, candpt, candeta, PolA, centrality); - histos.fill(HIST("hSparseAntiLambdaPolC"), candmass, candpt, candeta, PolC, centrality); - histos.fill(HIST("hSparseAntiLambdaPol"), candmass, candpt, candeta, Pol, centrality); - histos.fill(HIST("hSparseAntiLambda_corr1a"), candmass, candpt, candeta, sinPhiStar, centrality); - histos.fill(HIST("hSparseAntiLambda_corr1b"), candmass, candpt, candeta, cosPhiStar, centrality); - histos.fill(HIST("hSparseAntiLambda_corr1c"), candmass, candpt, candeta, phiphiStar, centrality); - histos.fill(HIST("hSparseAntiLambda_corr2a"), candmass, candpt, candeta, sinThetaStar, centrality); - histos.fill(HIST("hSparseAntiLambda_corr2b"), candmass, candpt, candeta, sinThetaStarcosphiphiStar, centrality); + + histos.fill(HIST("hSparseAntiLambdaCosPsiA"), candmass, candpt, (TMath::Cos(GetPhiInRange(psiZDCA))), centrality, desbinvalue); + histos.fill(HIST("hSparseAntiLambdaCosPsiC"), candmass, candpt, (TMath::Cos(GetPhiInRange(psiZDCC))), centrality, desbinvalue); + histos.fill(HIST("hSparseAntiLambdaSinPsiA"), candmass, candpt, (TMath::Sin(GetPhiInRange(psiZDCA))), centrality, desbinvalue); + histos.fill(HIST("hSparseAntiLambdaSinPsiC"), candmass, candpt, (TMath::Sin(GetPhiInRange(psiZDCC))), centrality, desbinvalue); + histos.fill(HIST("hSparseAntiLambdaCosPsi"), candmass, candpt, (TMath::Cos(GetPhiInRange(psiZDC))), centrality, desbinvalue); + histos.fill(HIST("hSparseAntiLambdaSinPsi"), candmass, candpt, (TMath::Sin(GetPhiInRange(psiZDC))), centrality, desbinvalue); + + histos.fill(HIST("hSparseAntiLambdaPolA"), candmass, candpt, PolA, centrality, desbinvalue); + histos.fill(HIST("hSparseAntiLambdaPolC"), candmass, candpt, PolC, centrality, desbinvalue); + histos.fill(HIST("hSparseAntiLambdaPol"), candmass, candpt, Pol, centrality, desbinvalue); + histos.fill(HIST("hSparseAntiLambda_corr1a"), candmass, candpt, sinPhiStar, centrality, desbinvalue); + histos.fill(HIST("hSparseAntiLambda_corr1b"), candmass, candpt, cosPhiStar, centrality, desbinvalue); + histos.fill(HIST("hSparseAntiLambda_corr1c"), candmass, candpt, phiphiStar, centrality, desbinvalue); + histos.fill(HIST("hSparseAntiLambda_corr2a"), candmass, candpt, sinThetaStar, centrality, desbinvalue); + histos.fill(HIST("hSparseAntiLambda_corr2b"), candmass, candpt, sinThetaStarcosphiphiStar, centrality, desbinvalue); } if (tag1) { - histos.fill(HIST("hSparseLambdaCosPsiA"), candmass, candpt, candeta, (TMath::Cos(GetPhiInRange(psiZDCA))), centrality); - histos.fill(HIST("hSparseLambdaCosPsiC"), candmass, candpt, candeta, (TMath::Cos(GetPhiInRange(psiZDCC))), centrality); - histos.fill(HIST("hSparseLambdaSinPsiA"), candmass, candpt, candeta, (TMath::Sin(GetPhiInRange(psiZDCA))), centrality); - histos.fill(HIST("hSparseLambdaSinPsiC"), candmass, candpt, candeta, (TMath::Sin(GetPhiInRange(psiZDCC))), centrality); - histos.fill(HIST("hSparseLambdaCosPsi"), candmass, candpt, candeta, (TMath::Cos(GetPhiInRange(psiZDC))), centrality); - histos.fill(HIST("hSparseLambdaSinPsi"), candmass, candpt, candeta, (TMath::Sin(GetPhiInRange(psiZDC))), centrality); - - histos.fill(HIST("hSparseLambdaPolA"), candmass, candpt, candeta, PolA, centrality); - histos.fill(HIST("hSparseLambdaPolC"), candmass, candpt, candeta, PolC, centrality); - histos.fill(HIST("hSparseLambdaPol"), candmass, candpt, candeta, Pol, centrality); - histos.fill(HIST("hSparseLambda_corr1a"), candmass, candpt, candeta, sinPhiStar, centrality); - histos.fill(HIST("hSparseLambda_corr1b"), candmass, candpt, candeta, cosPhiStar, centrality); - histos.fill(HIST("hSparseLambda_corr1c"), candmass, candpt, candeta, phiphiStar, centrality); - histos.fill(HIST("hSparseLambda_corr2a"), candmass, candpt, candeta, sinThetaStar, centrality); - histos.fill(HIST("hSparseLambda_corr2b"), candmass, candpt, candeta, sinThetaStarcosphiphiStar, centrality); + histos.fill(HIST("hSparseLambdaCosPsiA"), candmass, candpt, (TMath::Cos(GetPhiInRange(psiZDCA))), centrality, desbinvalue); + histos.fill(HIST("hSparseLambdaCosPsiC"), candmass, candpt, (TMath::Cos(GetPhiInRange(psiZDCC))), centrality, desbinvalue); + histos.fill(HIST("hSparseLambdaSinPsiA"), candmass, candpt, (TMath::Sin(GetPhiInRange(psiZDCA))), centrality, desbinvalue); + histos.fill(HIST("hSparseLambdaSinPsiC"), candmass, candpt, (TMath::Sin(GetPhiInRange(psiZDCC))), centrality, desbinvalue); + histos.fill(HIST("hSparseLambdaCosPsi"), candmass, candpt, (TMath::Cos(GetPhiInRange(psiZDC))), centrality, desbinvalue); + histos.fill(HIST("hSparseLambdaSinPsi"), candmass, candpt, (TMath::Sin(GetPhiInRange(psiZDC))), centrality, desbinvalue); + + histos.fill(HIST("hSparseLambdaPolA"), candmass, candpt, PolA, centrality, desbinvalue); + histos.fill(HIST("hSparseLambdaPolC"), candmass, candpt, PolC, centrality, desbinvalue); + histos.fill(HIST("hSparseLambdaPol"), candmass, candpt, Pol, centrality, desbinvalue); + histos.fill(HIST("hSparseLambda_corr1a"), candmass, candpt, sinPhiStar, centrality, desbinvalue); + histos.fill(HIST("hSparseLambda_corr1b"), candmass, candpt, cosPhiStar, centrality, desbinvalue); + histos.fill(HIST("hSparseLambda_corr1c"), candmass, candpt, phiphiStar, centrality, desbinvalue); + histos.fill(HIST("hSparseLambda_corr2a"), candmass, candpt, sinThetaStar, centrality, desbinvalue); + histos.fill(HIST("hSparseLambda_corr2b"), candmass, candpt, sinThetaStarcosphiphiStar, centrality, desbinvalue); } } @@ -664,9 +665,9 @@ struct lambdapolsp { } auto psiZDC = TMath::ATan2((modqyZDCC - modqyZDCA), (modqxZDCC - modqxZDCA)); // full event plane - if (useonlypsis) { + /*if (useonlypsis) { psiZDC = psiZDCC - psiZDCA; - } + }*/ histos.fill(HIST("hCentrality"), centrality); if (!checkwithpub) { @@ -877,17 +878,85 @@ struct lambdapolsp { int taga = LambdaTag; int tagb = aLambdaTag; - if (LambdaTag) { - Lambda = Proton + AntiPion; - tagb = 0; - fillHistograms(taga, tagb, Lambda, Proton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mLambda(), v0.pt(), v0.eta()); + float desbinvalue = 0.0; + if (dosystematic) { + //////////////////////////////////////////////////// + float LTsys = TMath::Abs(v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * massLambda); + float CPAsys = v0.v0cosPA(); + float DCADaughsys = TMath::Abs(v0.dcaV0daughters()); + float DCApossys = TMath::Abs(v0.dcapostopv()); + float DCAnegsys = TMath::Abs(v0.dcanegtopv()); + float sysvar = -999.9; + double syst[10]; + if (sys == 1) { + double temp[10] = {26, 27, 28, 29, 30, 31, 32, 33, 34, 35}; + std::copy(std::begin(temp), std::end(temp), std::begin(syst)); + sysvar = LTsys; + } + if (sys == 2) { + double temp[10] = {0.992, 0.993, 0.9935, 0.994, 0.9945, 0.995, 0.9955, 0.996, 0.9965, 0.997}; + std::copy(std::begin(temp), std::end(temp), std::begin(syst)); + sysvar = CPAsys; + } + if (sys == 3) { + double temp[10] = {0.8, 0.85, 0.9, 0.95, 1.0, 1.05, 1.1, 1.15, 1.2, 1.25}; + std::copy(std::begin(temp), std::end(temp), std::begin(syst)); + sysvar = DCADaughsys; + } + if (sys == 4) { + double temp[10] = {0.05, 0.07, 0.1, 0.15, 0.18, 0.2, 0.22, 0.25, 0.28, 0.3}; + std::copy(std::begin(temp), std::end(temp), std::begin(syst)); + sysvar = DCApossys; + } + if (sys == 5) { + double temp[10] = {0.05, 0.07, 0.1, 0.15, 0.18, 0.2, 0.22, 0.25, 0.28, 0.3}; + std::copy(std::begin(temp), std::end(temp), std::begin(syst)); + sysvar = DCAnegsys; + } + + for (int i = 0; i < 10; i++) { + if (sys == 1 || sys == 3) { + if (sysvar < syst[i]) + desbinvalue = i + 0.5; + else + continue; + } + if (sys == 2 || sys == 4 || sys == 5) { + if (sysvar > syst[i]) + desbinvalue = i + 0.5; + else + continue; + } + + /////////////////////////////////////////////////// + if (LambdaTag) { + Lambda = Proton + AntiPion; + tagb = 0; + fillHistograms(taga, tagb, Lambda, Proton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mLambda(), v0.pt(), desbinvalue); + } + + tagb = aLambdaTag; + if (aLambdaTag) { + AntiLambda = AntiProton + Pion; + taga = 0; + fillHistograms(taga, tagb, AntiLambda, AntiProton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mAntiLambda(), v0.pt(), desbinvalue); + } + } } - tagb = aLambdaTag; - if (aLambdaTag) { - AntiLambda = AntiProton + Pion; - taga = 0; - fillHistograms(taga, tagb, AntiLambda, AntiProton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mAntiLambda(), v0.pt(), v0.eta()); + else { + if (LambdaTag) { + Lambda = Proton + AntiPion; + tagb = 0; + fillHistograms(taga, tagb, Lambda, Proton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mLambda(), v0.pt(), 0.0); + } + + tagb = aLambdaTag; + if (aLambdaTag) { + AntiLambda = AntiProton + Pion; + taga = 0; + fillHistograms(taga, tagb, AntiLambda, AntiProton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mAntiLambda(), v0.pt(), 0.0); + } } } } @@ -999,21 +1068,85 @@ struct lambdapolsp { int taga = LambdaTag; int tagb = aLambdaTag; - if (LambdaTag) { - Lambda = Proton + AntiPion; - tagb = 0; - fillHistograms(taga, tagb, Lambda, Proton, psiZDCC, psiZDCA, psiZDC, centrality, - v0.mLambda(), v0.pt(), v0.eta()); - } + float desbinvalue = 0.0; + if (dosystematic) { + //////////////////////////////////////////////////// + float LTsys = TMath::Abs(v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * massLambda); + float CPAsys = v0.v0cosPA(); + float DCADaughsys = TMath::Abs(v0.dcaV0daughters()); + float DCApossys = TMath::Abs(v0.dcapostopv()); + float DCAnegsys = TMath::Abs(v0.dcanegtopv()); + float sysvar = -999.9; + double syst[10]; + if (sys == 1) { + double temp[10] = {26, 27, 28, 29, 30, 31, 32, 33, 34, 35}; + std::copy(std::begin(temp), std::end(temp), std::begin(syst)); + sysvar = LTsys; + } + if (sys == 2) { + double temp[10] = {0.992, 0.993, 0.9935, 0.994, 0.9945, 0.995, 0.9955, 0.996, 0.9965, 0.997}; + std::copy(std::begin(temp), std::end(temp), std::begin(syst)); + sysvar = CPAsys; + } + if (sys == 3) { + double temp[10] = {0.8, 0.85, 0.9, 0.95, 1.0, 1.05, 1.1, 1.15, 1.2, 1.25}; + std::copy(std::begin(temp), std::end(temp), std::begin(syst)); + sysvar = DCADaughsys; + } + if (sys == 4) { + double temp[10] = {0.05, 0.07, 0.1, 0.15, 0.18, 0.2, 0.22, 0.25, 0.28, 0.3}; + std::copy(std::begin(temp), std::end(temp), std::begin(syst)); + sysvar = DCApossys; + } + if (sys == 5) { + double temp[10] = {0.05, 0.07, 0.1, 0.15, 0.18, 0.2, 0.22, 0.25, 0.28, 0.3}; + std::copy(std::begin(temp), std::end(temp), std::begin(syst)); + sysvar = DCAnegsys; + } - tagb = aLambdaTag; - if (aLambdaTag) { - AntiLambda = AntiProton + Pion; - taga = 0; - fillHistograms(taga, tagb, AntiLambda, AntiProton, psiZDCC, psiZDCA, psiZDC, centrality, - v0.mAntiLambda(), v0.pt(), v0.eta()); + for (int i = 0; i < 10; i++) { + if (sys == 1 || sys == 3) { + if (sysvar < syst[i]) + desbinvalue = i + 0.5; + else + continue; + } + if (sys == 2 || sys == 4 || sys == 5) { + if (sysvar > syst[i]) + desbinvalue = i + 0.5; + else + continue; + } + + /////////////////////////////////////////////////// + if (LambdaTag) { + Lambda = Proton + AntiPion; + tagb = 0; + fillHistograms(taga, tagb, Lambda, Proton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mLambda(), v0.pt(), desbinvalue); + } + + tagb = aLambdaTag; + if (aLambdaTag) { + AntiLambda = AntiProton + Pion; + taga = 0; + fillHistograms(taga, tagb, AntiLambda, AntiProton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mAntiLambda(), v0.pt(), desbinvalue); + } + } + } else { + if (LambdaTag) { + Lambda = Proton + AntiPion; + tagb = 0; + fillHistograms(taga, tagb, Lambda, Proton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mLambda(), v0.pt(), 0.0); + } + + tagb = aLambdaTag; + if (aLambdaTag) { + AntiLambda = AntiProton + Pion; + taga = 0; + fillHistograms(taga, tagb, AntiLambda, AntiProton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mAntiLambda(), v0.pt(), 0.0); + } } - } // end loop over V0s + } } PROCESS_SWITCH(lambdapolsp, processDerivedData, "Process derived data", false); }; From 662ec1857b2ab0aca37592ab6507811ef8a67b9c Mon Sep 17 00:00:00 2001 From: ynishida-style Date: Sat, 15 Mar 2025 15:32:21 +0900 Subject: [PATCH 0691/1650] [PWGJE] Improvements to my own code, jetShape.cxx (#10483) --- PWGJE/Tasks/jetShape.cxx | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/PWGJE/Tasks/jetShape.cxx b/PWGJE/Tasks/jetShape.cxx index 4beaeb24d89..b34f70ef46f 100644 --- a/PWGJE/Tasks/jetShape.cxx +++ b/PWGJE/Tasks/jetShape.cxx @@ -41,18 +41,20 @@ using namespace o2::framework::expressions; struct JetShapeTask { HistogramRegistry registry{"registry", - {{"tpcPi", "tpcPi", {HistType::kTH2F, {{1000, 0, 5}, {401, -10.025f, 10.025f}}}}, - {"tofPi", "tofPi", {HistType::kTH2F, {{1000, 0, 5}, {401, -10.025f, 10.025f}}}}, - {"tpcPr", "tpcPr", {HistType::kTH2F, {{1000, 0, 5}, {401, -10.025f, 10.025f}}}}, - {"tofPr", "tofPr", {HistType::kTH2F, {{1000, 0, 5}, {401, -10.025f, 10.025f}}}}, - {"tpcDedx", "tpcDedx", {HistType::kTH2F, {{1000, 0, 5}, {1000, 0, 1000}}}}, - {"tofBeta", "tofBeta", {HistType::kTH2F, {{1000, 0, 5}, {900, 0.2, 1.1}}}}, + {{"tpcTofPi", "tpcTofPi", {HistType::kTH3F, {{401, -10.025f, 10.025f}, {401, -10.025f, 10.025f}, {100, 0, 5}}}}, + {"tpcPi", "tpcPi", {HistType::kTH2F, {{500, 0, 5}, {401, -10.025f, 10.025f}}}}, + {"tofPi", "tofPi", {HistType::kTH2F, {{500, 0, 5}, {401, -10.025f, 10.025f}}}}, + {"tpcTofPr", "tpcTofPr", {HistType::kTH3F, {{401, -10.025f, 10.025f}, {401, -10.025f, 10.025f}, {100, 0, 5}}}}, + {"tpcPr", "tpcPr", {HistType::kTH2F, {{500, 0, 5}, {401, -10.025f, 10.025f}}}}, + {"tofPr", "tofPr", {HistType::kTH2F, {{500, 0, 5}, {401, -10.025f, 10.025f}}}}, + {"tpcDedx", "tpcDedx", {HistType::kTH2F, {{500, 0, 5}, {1000, 0, 1000}}}}, + {"tofBeta", "tofBeta", {HistType::kTH2F, {{500, 0, 5}, {450, 0.2, 1.1}}}}, {"tofMass", "tofMass", {HistType::kTH1F, {{3000, 0, 3}}}}, {"jetPt", "jet pT;#it{p}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {{200, 0., 200.}}}}, {"jetEta", "jet #eta;#eta_{jet};entries", {HistType::kTH1F, {{100, -1.0, 1.0}}}}, {"jetPhi", "jet #phi;#phi_{jet};entries", {HistType::kTH1F, {{80, -1.0, 7.}}}}, {"area", "area", {HistType::kTH1F, {{200, 0, 4}}}}, - {"rho", "rho", {HistType::kTH1F, {{200, -1, 119}}}}, + {"rho", "rho", {HistType::kTH1F, {{300, 0, 300}}}}, {"ptCorr", "Corrected jet pT; p_{T}^{corr} (GeV/c); Counts", {HistType::kTH1F, {{200, 0, 200}}}}, {"ptCorrVsDistance", "ptcorr_vs_distance", {HistType::kTH2F, {{70, 0, 0.7}, {100, 0, 100}}}}, {"distanceVsTrackpt", "trackpt_vs_distance", {HistType::kTH2F, {{70, 0, 0.7}, {100, 0, 100}}}}, @@ -254,8 +256,10 @@ struct JetShapeTask { registry.fill(HIST("tofMass"), track.mass()); // for calculate purity + registry.fill(HIST("tpcTofPi"), track.tpcNSigmaPi(), track.tofNSigmaPi(), track.pt()); registry.fill(HIST("tpcPi"), track.pt(), track.tpcNSigmaPi()); registry.fill(HIST("tofPi"), track.pt(), track.tofNSigmaPi()); + registry.fill(HIST("tpcTofPr"), track.tpcNSigmaPr(), track.tofNSigmaPr(), track.pt()); registry.fill(HIST("tpcPr"), track.pt(), track.tpcNSigmaPr()); registry.fill(HIST("tofPr"), track.pt(), track.tofNSigmaPr()); From 18eaf7a3206bf95b0a355a9d12b51933c12aaae0 Mon Sep 17 00:00:00 2001 From: Nicolas Strangmann <77485327+nstrangm@users.noreply.github.com> Date: Sat, 15 Mar 2025 07:32:54 +0100 Subject: [PATCH 0692/1650] [PWGEM/PhotonMeson] Add outlier rejection for JJ MC events (#10482) Co-authored-by: Nicolas Strangmann --- .../PhotonMeson/TableProducer/CMakeLists.txt | 2 +- .../TableProducer/createEMEventPhoton.cxx | 35 +++++++++++++++---- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/PWGEM/PhotonMeson/TableProducer/CMakeLists.txt b/PWGEM/PhotonMeson/TableProducer/CMakeLists.txt index 7d58cb0cb7c..ede83862a3f 100644 --- a/PWGEM/PhotonMeson/TableProducer/CMakeLists.txt +++ b/PWGEM/PhotonMeson/TableProducer/CMakeLists.txt @@ -31,7 +31,7 @@ o2physics_add_dpl_workflow(create-pcm o2physics_add_dpl_workflow(create-emevent-photon SOURCES createEMEventPhoton.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGJECore COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(associate-mc-info-photon diff --git a/PWGEM/PhotonMeson/TableProducer/createEMEventPhoton.cxx b/PWGEM/PhotonMeson/TableProducer/createEMEventPhoton.cxx index cba68536ddb..f1d78bd76b6 100644 --- a/PWGEM/PhotonMeson/TableProducer/createEMEventPhoton.cxx +++ b/PWGEM/PhotonMeson/TableProducer/createEMEventPhoton.cxx @@ -30,6 +30,8 @@ #include "PWGEM/PhotonMeson/DataModel/gammaTables.h" +#include "PWGJE/DataModel/Jet.h" + using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; @@ -70,6 +72,8 @@ struct CreateEMEventPhoton { Configurable applyEveSelAtSkimming{"applyEveSel_at_skimming", false, "flag to apply minimal event selection at the skimming level"}; Configurable needEMCTrigger{"needEMCTrigger", false, "flag to only save events which have kTVXinEMC trigger bit. To reduce PbPb derived data size"}; Configurable needPHSTrigger{"needPHSTrigger", false, "flag to only save events which have kTVXinPHOS trigger bit. To reduce PbPb derived data size"}; + Configurable enableJJHistograms{"enableJJHistograms", false, "flag to fill JJ QA histograms for outlier rejection"}; + Configurable maxpTJetOverpTHard{"maxpTJetOverpTHard", 2., "set weight to 0 for JJ events with larger pTJet/pTHard"}; HistogramRegistry registry{"registry"}; void init(o2::framework::InitContext&) @@ -77,6 +81,10 @@ struct CreateEMEventPhoton { auto hEventCounter = registry.add("hEventCounter", "hEventCounter", kTH1I, {{7, 0.5f, 7.5f}}); hEventCounter->GetXaxis()->SetBinLabel(1, "all"); hEventCounter->GetXaxis()->SetBinLabel(2, "sel8"); + + if (enableJJHistograms) { + auto hJJ_pTHardVsJetpT = registry.add("hJJ_pTHardVsJetpT", "hJJ_pTHardVsJetpT;#bf{#it{p}_{T}^{hard}};#bf{#it{p}_{T}^{leading jet}}", kTH2F, {{500, 0, 1000}, {500, 0, 1000}}); + } } int mRunNumber; @@ -132,7 +140,7 @@ struct CreateEMEventPhoton { } } - const auto& bc = collision.template foundBC_as(); + auto bc = collision.template foundBC_as(); initCCDB(bc); if (applyEveSelAtSkimming && (!collision.selection_bit(o2::aod::evsel::kIsTriggerTVX) || !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder))) { @@ -192,7 +200,11 @@ struct CreateEMEventPhoton { } // end of skimEvent - void fillEventWeights(MyCollisionsMC const& collisions, aod::McCollisions const&, MyBCs const&) + Preslice perCollision_jet = aod::jet::mcCollisionId; + + using MyJJCollisions = soa::Join; + + void fillEventWeights(MyCollisionsMC const& collisions, MyJJCollisions const&, MyBCs const&, aod::FullMCParticleLevelJets const& jets) { for (const auto& collision : collisions) { if (!collision.has_mcCollision()) { @@ -205,8 +217,19 @@ struct CreateEMEventPhoton { if (applyEveSelAtSkimming && (!collision.selection_bit(o2::aod::evsel::kIsTriggerTVX) || !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder))) { continue; } - auto mcCollision = collision.mcCollision(); - eventWeights(mcCollision.weight()); + auto mcCollision = collision.mcCollision_as(); + + // Outlier rejection: Set weight to 0 for events with large pTJet/pTHard + // ---------------------------------------------------------------------- + auto jetsInThisCollision = jets.sliceBy(perCollision_jet, mcCollision.globalIndex()); + float collisionWeight = mcCollision.weight(); + for (const auto& jet : jetsInThisCollision) { + if (jet.pt() > maxpTJetOverpTHard * mcCollision.ptHard()) + collisionWeight = 0.f; + registry.fill(HIST("hJJ_pTHardVsJetpT"), mcCollision.ptHard(), jet.pt()); + } + + eventWeights(collisionWeight); } } @@ -222,10 +245,10 @@ struct CreateEMEventPhoton { } PROCESS_SWITCH(CreateEMEventPhoton, processEventMC, "process event info", false); - void processEventJJMC(MyCollisionsMC const& collisions, aod::McCollisions const& mcCollisions, MyBCs const& bcs) + void processEventJJMC(MyCollisionsMC const& collisions, MyJJCollisions const& mcCollisions, MyBCs const& bcs, aod::FullMCParticleLevelJets const& jets) { skimEvent(collisions, bcs); - fillEventWeights(collisions, mcCollisions, bcs); + fillEventWeights(collisions, mcCollisions, bcs, jets); } PROCESS_SWITCH(CreateEMEventPhoton, processEventJJMC, "process event info", false); From a9b82aa699f7819043d0cda6d91fe65aa659be8b Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Sat, 15 Mar 2025 07:33:41 +0100 Subject: [PATCH 0693/1650] [PWGLF] chk892Flow - Add centrality cut and modify default values (#10478) --- PWGLF/Tasks/Resonances/chk892Flow.cxx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/PWGLF/Tasks/Resonances/chk892Flow.cxx b/PWGLF/Tasks/Resonances/chk892Flow.cxx index 1e764a0c9f2..4d4c4d349f5 100644 --- a/PWGLF/Tasks/Resonances/chk892Flow.cxx +++ b/PWGLF/Tasks/Resonances/chk892Flow.cxx @@ -146,6 +146,8 @@ struct Chk892Flow { Configurable cfgEvtPileupRejection{"cfgEvtPileupRejection", true, "Evt sel: apply pileup rejection"}; Configurable cfgEvtNoITSROBorderCut{"cfgEvtNoITSROBorderCut", false, "Evt sel: apply NoITSRO border cut"}; Configurable cfgEvtCollInTimeRangeStandard{"cfgEvtCollInTimeRangeStandard", true, "Evt sel: apply NoCollInTimeRangeStandard"}; + Configurable cfgEventCentralityMin{"cfgEventCentralityMin", 0.0f, "Event sel: minimum centrality"}; + Configurable cfgEventCentralityMax{"cfgEventCentralityMax", 80.0f, "Event sel: maximum centrality"}; } EventCuts; /// PID Selections, pion @@ -159,7 +161,7 @@ struct Chk892Flow { // Track selections struct : ConfigurableGroup { - Configurable cfgMinPtcut{"cfgMinPtcut", 0.15, "Track minium pt cut"}; + Configurable cfgMinPtcut{"cfgMinPtcut", 0.6, "Track minium pt cut"}; Configurable cfgMaxEtacut{"cfgMaxEtacut", 0.8, "Track maximum eta cut"}; Configurable cfgPrimaryTrack{"cfgPrimaryTrack", true, "Primary track selection"}; // kGoldenChi2 | kDCAxy | kDCAz Configurable cfgGlobalWoDCATrack{"cfgGlobalWoDCATrack", true, "Global track selection without DCA"}; // kQualityTracks (kTrackType | kTPCNCls | kTPCCrossedRows | kTPCCrossedRowsOverNCls | kTPCChi2NDF | kTPCRefit | kITSNCls | kITSChi2NDF | kITSRefit | kITSHits) | kInAcceptanceTracks (kPtRange | kEtaRange) @@ -190,14 +192,14 @@ struct Chk892Flow { Configurable cfgByPassDauPIDSelection{"cfgByPassDauPIDSelection", true, "Bypass Daughters PID selection"}; Configurable cfgSecondaryDauDCAMax{"cfgSecondaryDauDCAMax", 0.2, "Maximum DCA Secondary daughters to PV"}; - Configurable cfgSecondaryDauPosDCAtoPVMin{"cfgSecondaryDauPosDCAtoPVMin", 0.0, "Minimum DCA Secondary positive daughters to PV"}; - Configurable cfgSecondaryDauNegDCAtoPVMin{"cfgSecondaryDauNegDCAtoPVMin", 0.0, "Minimum DCA Secondary negative daughters to PV"}; + Configurable cfgSecondaryDauPosDCAtoPVMin{"cfgSecondaryDauPosDCAtoPVMin", 0.1, "Minimum DCA Secondary positive daughters to PV"}; + Configurable cfgSecondaryDauNegDCAtoPVMin{"cfgSecondaryDauNegDCAtoPVMin", 0.1, "Minimum DCA Secondary negative daughters to PV"}; Configurable cfgSecondaryPtMin{"cfgSecondaryPtMin", 0.f, "Minimum transverse momentum of Secondary"}; - Configurable cfgSecondaryRapidityMax{"cfgSecondaryRapidityMax", 0.5, "Maximum rapidity of Secondary"}; + Configurable cfgSecondaryRapidityMax{"cfgSecondaryRapidityMax", 0.8, "Maximum rapidity of Secondary"}; Configurable cfgSecondaryRadiusMin{"cfgSecondaryRadiusMin", 0.0, "Minimum transverse radius of Secondary"}; Configurable cfgSecondaryRadiusMax{"cfgSecondaryRadiusMax", 999.9, "Maximum transverse radius of Secondary"}; - Configurable cfgSecondaryCosPAMin{"cfgSecondaryCosPAMin", 0.998, "Mininum cosine pointing angle of Secondary"}; + Configurable cfgSecondaryCosPAMin{"cfgSecondaryCosPAMin", 0.995, "Mininum cosine pointing angle of Secondary"}; Configurable cfgSecondaryDCAtoPVMax{"cfgSecondaryDCAtoPVMax", 0.4, "Maximum DCA Secondary to PV"}; Configurable cfgSecondaryProperLifetimeMax{"cfgSecondaryProperLifetimeMax", 20., "Maximum Secondary Lifetime"}; Configurable cfgSecondaryparamArmenterosCut{"cfgSecondaryparamArmenterosCut", 0.2, "parameter for Armenteros Cut"}; @@ -1068,6 +1070,8 @@ struct Chk892Flow { return; // If we don't have a Q-vector colCuts.fillQA(collision); lCentrality = getCentrality(collision); + if (lCentrality < EventCuts.cfgEventCentralityMin || lCentrality > EventCuts.cfgEventCentralityMax) + return; fillHistograms(collision, tracks, v0s, EventPlaneConfig.cfgnMods); // second order } From 868c8972594db4aa2d241aaf2c22981195495b73 Mon Sep 17 00:00:00 2001 From: Junlee Kim Date: Sat, 15 Mar 2025 06:37:40 +0000 Subject: [PATCH 0694/1650] [PWGLF] add event selection flag (#10457) --- PWGLF/Tasks/Strangeness/lambdalambda.cxx | 32 +++++++++++++++--------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdalambda.cxx b/PWGLF/Tasks/Strangeness/lambdalambda.cxx index 516fed02e9b..f51ddeb86c6 100644 --- a/PWGLF/Tasks/Strangeness/lambdalambda.cxx +++ b/PWGLF/Tasks/Strangeness/lambdalambda.cxx @@ -86,6 +86,7 @@ struct lambdalambda { Configurable cfgCentSel{"cfgCentSel", 100., "Centrality selection"}; Configurable cfgCentEst{"cfgCentEst", 1, "Centrality estimator, 1: FT0C, 2: FT0M"}; + Configurable cfgEvtSel{"cfgEvtSel", true, "event selection flag"}; Configurable cfgPVSel{"cfgPVSel", false, "Additional PV selection flag for syst"}; Configurable cfgPV{"cfgPV", 8.0, "Additional PV selection range for syst"}; Configurable cfgAddEvtSelPileup{"cfgAddEvtSelPileup", false, "flag for additional pileup selection"}; @@ -120,7 +121,8 @@ struct lambdalambda { Configurable cfgV0V0Radius{"cfgV0V0Radius", 1.0, "maximum radius of v0v0"}; Configurable cfgV0V0CPA{"cfgV0V0CPA", 0.6, "minimum CPA of v0v0"}; Configurable cfgV0V0Distance{"cfgV0V0Distance", 1, "minimum distance of v0v0"}; - Configurable cfgV0V0DCA{"cfgV0V0DCA", 1.0, "maximum DCA of v0v0"}; + Configurable cfgV0V0DCAR{"cfgV0V0DCAR", 1.0, "maximum DCA of v0v0 R"}; + Configurable cfgV0V0DCAZ{"cfgV0V0DCAZ", 1.0, "maximum DCA of v0v0 Z"}; Configurable cfgEffCor{"cfgEffCor", false, "flag to apply efficiency correction"}; Configurable cfgEffCorPath{"cfgEffCorPath", "", "path for pseudo efficiency correction"}; @@ -137,7 +139,8 @@ struct lambdalambda { ConfigurableAxis RadiusAxis{"RadiusAxis", {100, 0, 5}, "radius of v0v0"}; ConfigurableAxis CPAAxis{"CPAAxis", {102, -1.02, 1.02}, "CPA of v0v0"}; ConfigurableAxis DistanceAxis{"DistanceAxis", {100, 0, 10}, "distance of v0v0"}; - ConfigurableAxis DCAAxis{"DCAAxis", {100, 0, 5}, "DCA of v0v0"}; + ConfigurableAxis DCARAxis{"DCARAxis", {100, 0, 2}, "DCA of v0v0R"}; + ConfigurableAxis DCAZAxis{"DCAZAxis", {100, -2, 2}, "DCA of v0v0Z"}; TF1* fMultPVCutLow = nullptr; TF1* fMultPVCutHigh = nullptr; @@ -161,12 +164,14 @@ struct lambdalambda { histos.add("Radius_V0V0_full", "", {HistType::kTHnSparseF, {massAxis, ptAxis, RadiusAxis, combAxis}}); histos.add("CPA_V0V0_full", "", {HistType::kTHnSparseF, {massAxis, ptAxis, CPAAxis, combAxis}}); histos.add("Distance_V0V0_full", "", {HistType::kTHnSparseF, {massAxis, ptAxis, DistanceAxis, combAxis}}); - histos.add("DCA_V0V0_full", "", {HistType::kTHnSparseF, {massAxis, ptAxis, DCAAxis, combAxis}}); + histos.add("DCAR_V0V0_full", "", {HistType::kTHnSparseF, {massAxis, ptAxis, DCARAxis, combAxis}}); + histos.add("DCAZ_V0V0_full", "", {HistType::kTHnSparseF, {massAxis, ptAxis, DCAZAxis, combAxis}}); histos.add("Radius_V0V0_sel", "", {HistType::kTHnSparseF, {massAxis, ptAxis, RadiusAxis, combAxis}}); histos.add("CPA_V0V0_sel", "", {HistType::kTHnSparseF, {massAxis, ptAxis, CPAAxis, combAxis}}); histos.add("Distance_V0V0_sel", "", {HistType::kTHnSparseF, {massAxis, ptAxis, DistanceAxis, combAxis}}); - histos.add("DCA_V0V0_sel", "", {HistType::kTHnSparseF, {massAxis, ptAxis, DCAAxis, combAxis}}); + histos.add("DCAR_V0V0_sel", "", {HistType::kTHnSparseF, {massAxis, ptAxis, DCARAxis, combAxis}}); + histos.add("DCAZ_V0V0_sel", "", {HistType::kTHnSparseF, {massAxis, ptAxis, DCAZAxis, combAxis}}); histos.add("h_InvMass_same", "", {HistType::kTHnSparseF, {massAxis, ptAxis, centAxis, combAxis}}); histos.add("h_InvMass_mixed", "", {HistType::kTHnSparseF, {massAxis, ptAxis, centAxis, combAxis}}); @@ -284,7 +289,9 @@ struct lambdalambda { template bool isSelectedV0V0(V01 const& v01, V02 const& v02) { - if (getDCAofV0V0(v01, v02) > cfgV0V0DCA) + if (std::sqrt(getDCAofV0V0(v01, v02).perp2()) > cfgV0V0DCAR) + return false; + if (getDCAofV0V0(v01, v02).z() > cfgV0V0DCAZ) return false; if (getCPA(v01, v02) < cfgV0V0CPA) return false; @@ -297,7 +304,7 @@ struct lambdalambda { } template - float getDCAofV0V0(V01 const& v01, V02 const& v02) + ROOT::Math::XYZVector getDCAofV0V0(V01 const& v01, V02 const& v02) { ROOT::Math::XYZVector v01pos, v02pos, v01mom, v02mom; v01pos.SetXYZ(v01.x(), v01.y(), v01.z()); @@ -307,9 +314,8 @@ struct lambdalambda { ROOT::Math::XYZVector posdiff = v02pos - v01pos; ROOT::Math::XYZVector cross = v01mom.Cross(v02mom); - if (std::sqrt(cross.Mag2()) < 1e-6) - return 999.; - return std::abs(posdiff.Dot(cross)) / std::sqrt(cross.Mag2()); + ROOT::Math::XYZVector dcaVec = (posdiff.Dot(cross) / cross.Mag2()) * cross; + return dcaVec; } template @@ -439,13 +445,15 @@ struct lambdalambda { histos.fill(HIST("Radius_V0V0_full"), RecoV0V0.M(), RecoV0V0.Pt(), getRadius(v01, v02), V01Tag + V02Tag); histos.fill(HIST("CPA_V0V0_full"), RecoV0V0.M(), RecoV0V0.Pt(), getCPA(v01, v02), V01Tag + V02Tag); histos.fill(HIST("Distance_V0V0_full"), RecoV0V0.M(), RecoV0V0.Pt(), getDistance(v01, v02), V01Tag + V02Tag); - histos.fill(HIST("DCA_V0V0_full"), RecoV0V0.M(), RecoV0V0.Pt(), getDCAofV0V0(v01, v02), V01Tag + V02Tag); + histos.fill(HIST("DCAR_V0V0_full"), RecoV0V0.M(), RecoV0V0.Pt(), std::sqrt(getDCAofV0V0(v01, v02).perp2()), V01Tag + V02Tag); + histos.fill(HIST("DCAZ_V0V0_full"), RecoV0V0.M(), RecoV0V0.Pt(), getDCAofV0V0(v01, v02).z(), V01Tag + V02Tag); if (isSelectedV0V0(v01, v02)) { histos.fill(HIST("Radius_V0V0_sel"), RecoV0V0.M(), RecoV0V0.Pt(), getRadius(v01, v02), V01Tag + V02Tag); histos.fill(HIST("CPA_V0V0_sel"), RecoV0V0.M(), RecoV0V0.Pt(), getCPA(v01, v02), V01Tag + V02Tag); histos.fill(HIST("Distance_V0V0_sel"), RecoV0V0.M(), RecoV0V0.Pt(), getDistance(v01, v02), V01Tag + V02Tag); - histos.fill(HIST("DCA_V0V0_sel"), RecoV0V0.M(), RecoV0V0.Pt(), getDCAofV0V0(v01, v02), V01Tag + V02Tag); + histos.fill(HIST("DCAR_V0V0_sel"), RecoV0V0.M(), RecoV0V0.Pt(), std::sqrt(getDCAofV0V0(v01, v02).perp2()), V01Tag + V02Tag); + histos.fill(HIST("DCAZ_V0V0_sel"), RecoV0V0.M(), RecoV0V0.Pt(), getDCAofV0V0(v01, v02).z(), V01Tag + V02Tag); IsSelected = true; } @@ -487,7 +495,7 @@ struct lambdalambda { centrality = collision.centFT0M(); } histos.fill(HIST("hEventstat"), 0.5); - if (!eventSelected(collision)) { + if (!eventSelected(collision) && cfgEvtSel) { return; } histos.fill(HIST("hEventstat"), 1.5); From ea0f0f1943f01d587053d7a5e0fba580508c83d9 Mon Sep 17 00:00:00 2001 From: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> Date: Sat, 15 Mar 2025 07:37:58 +0100 Subject: [PATCH 0695/1650] [PWGLF] Replace GetGeneratorID to GeneratorID (#10452) --- PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx index 6b520b04e16..0f3c9ac49d1 100644 --- a/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx @@ -592,7 +592,7 @@ struct strangederivedbuilder { } strangeMCColl(mccollision.posX(), mccollision.posY(), mccollision.posZ(), - mccollision.impactParameter(), mccollision.eventPlaneAngle(), mccollision.getGeneratorId()); + mccollision.impactParameter(), mccollision.eventPlaneAngle(), mccollision.generatorsID()); strangeMCMults(mccollision.multMCFT0A(), mccollision.multMCFT0C(), mccollision.multMCNParticlesEta05(), mccollision.multMCNParticlesEta08(), From 5a66c73ff186b7b952b096913e15e2e7a3eee5da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Sat, 15 Mar 2025 07:40:01 +0100 Subject: [PATCH 0696/1650] [Common] Multiplicity: align with centrality Run2 vs Run3 config. (#9521) --- Common/TableProducer/multiplicityTable.cxx | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/Common/TableProducer/multiplicityTable.cxx b/Common/TableProducer/multiplicityTable.cxx index 4a1be55d0bd..e65348ecbf7 100644 --- a/Common/TableProducer/multiplicityTable.cxx +++ b/Common/TableProducer/multiplicityTable.cxx @@ -132,6 +132,7 @@ struct MultiplicityTable { } ccdbConfig; Configurable produceHistograms{"produceHistograms", false, {"Option to produce debug histograms"}}; + Configurable autoSetupFromMetadata{"autoSetupFromMetadata", true, {"Autosetup the Run 2 and Run 3 processing from the metadata"}}; int mRunNumber; bool lCalibLoaded; @@ -152,11 +153,15 @@ struct MultiplicityTable { unsigned int randomSeed = 0; void init(InitContext& context) { - if (metadataInfo.isFullyDefined() && !doprocessRun2 && !doprocessRun3) { // Check if the metadata is initialized (only if not forced from the workflow configuration) - if (metadataInfo.isRun3()) { - doprocessRun3.value = true; - } else { - doprocessRun2.value = false; + // If both Run 2 and Run 3 data process flags are enabled then we check the metadata + if (autoSetupFromMetadata && metadataInfo.isFullyDefined()) { + LOG(info) << "Autosetting the processing from the metadata"; + if (doprocessRun2 == true && doprocessRun3 == true) { + if (metadataInfo.isRun3()) { + doprocessRun2.value = false; + } else { + doprocessRun3.value = false; + } } } @@ -799,8 +804,8 @@ struct MultiplicityTable { } // Process switches - PROCESS_SWITCH(MultiplicityTable, processRun2, "Produce Run 2 multiplicity tables", false); - PROCESS_SWITCH(MultiplicityTable, processRun3, "Produce Run 3 multiplicity tables", true); + PROCESS_SWITCH(MultiplicityTable, processRun2, "Produce Run 2 multiplicity tables. Autoset if both processRun2 and processRun3 are enabled", true); + PROCESS_SWITCH(MultiplicityTable, processRun3, "Produce Run 3 multiplicity tables. Autoset if both processRun2 and processRun3 are enabled", true); PROCESS_SWITCH(MultiplicityTable, processGlobalTrackingCounters, "Produce Run 3 global counters", false); PROCESS_SWITCH(MultiplicityTable, processMC, "Produce MC multiplicity tables", false); PROCESS_SWITCH(MultiplicityTable, processMC2Mults, "Produce MC -> Mult map", false); From 71324e0a65356d356a0cc5a2df126a8588930821 Mon Sep 17 00:00:00 2001 From: mm1707 <126352184+mm1707@users.noreply.github.com> Date: Sat, 15 Mar 2025 09:39:40 +0100 Subject: [PATCH 0697/1650] [PWGCF] Pair Fractions (#10460) --- .../femtoUniverseProducerTask.cxx | 21 ++++++++ .../femtoUniversePairTaskTrackV0Extended.cxx | 54 ++++++++++++++++++- 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx index 9c152281a39..efd4a17a0c8 100644 --- a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx +++ b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx @@ -721,6 +721,21 @@ struct FemtoUniverseProducerTask { } } + template + void fillDebugParticleMC(ParticleType const& particle) + { + auto motherparticlesMC = particle.template mothers_as(); + if (!motherparticlesMC.empty()) { + auto motherparticleMC = motherparticlesMC.front(); + if (particle.isPhysicalPrimary()) + outputDebugPartsMC(0); + else + outputDebugPartsMC(motherparticleMC.pdgCode()); + } else { + outputDebugPartsMC(9999); + } + } + template void fillMCParticle(ParticleType const& particle, o2::aod::femtouniverseparticle::ParticleType fdparttype) { @@ -746,9 +761,11 @@ struct FemtoUniverseProducerTask { } outputPartsMC(particleOrigin, pdgCode, particleMC.pt(), particleMC.eta(), particleMC.phi()); + fillDebugParticleMC(particleMC); outputPartsMCLabels(outputPartsMC.lastIndex()); } else { outputPartsMCLabels(-1); + outputDebugPartsMC(9999); } } @@ -1782,6 +1799,7 @@ struct FemtoUniverseProducerTask { // aligned, so that they can be joined in the task. if constexpr (transientLabels) { outputPartsMCLabels(-1); + outputDebugPartsMC(9999); } } if constexpr (resolveDaughs) { @@ -1834,6 +1852,7 @@ struct FemtoUniverseProducerTask { // aligned, so that they can be joined in the task. if constexpr (transientLabels) { outputPartsMCLabels(-1); + outputDebugPartsMC(9999); } } } @@ -1928,6 +1947,7 @@ struct FemtoUniverseProducerTask { // aligned, so that they can be joined in the task. if constexpr (transientLabels) { outputPartsMCLabels(-1); + outputDebugPartsMC(9999); } } if constexpr (resolveDaughs) { @@ -1963,6 +1983,7 @@ struct FemtoUniverseProducerTask { // aligned, so that they can be joined in the task. if constexpr (transientLabels) { outputPartsMCLabels(-1); + outputDebugPartsMC(9999); } } } diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx index 2ab6c6dbb10..302cbc198cb 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx @@ -48,7 +48,7 @@ struct FemtoUniversePairTaskTrackV0Extended { using FemtoFullParticles = soa::Join; Preslice perCol = aod::femtouniverseparticle::fdCollisionId; - using FemtoRecoParticles = soa::Join; + using FemtoRecoParticles = soa::Join; Preslice perColMC = aod::femtouniverseparticle::fdCollisionId; /// To apply narrow cut @@ -269,6 +269,8 @@ struct FemtoUniversePairTaskTrackV0Extended { registryMCreco.add("minus/MCrecoPiPt", "MC reco pions;#it{p}_{T} (GeV/c)", {HistType::kTH1F, {{500, 0, 5}}}); registryMCreco.add("minus/MCrecoPrPt", "MC reco protons;#it{p}_{T} (GeV/c)", {HistType::kTH1F, {{500, 0, 5}}}); + registryMCreco.add("motherParticle", "pair fractions;part1 mother PDG;part2 mother PDG", {HistType::kTH2F, {{8001, -4000, 4000}, {8001, -4000, 4000}}}); + sameEventCont.init(&resultRegistry, confkstarBins, confMultBins, confkTBins, confmTBins, confMultBins3D, confmTBins3D, confEtaBins, confPhiBins, confIsMC, confUse3D); sameEventCont.setPDGCodes(confTrkPDGCodePartOne, confV0PDGCodePartTwo); mixedEventCont.init(&resultRegistry, confkstarBins, confMultBins, confkTBins, confmTBins, confMultBins3D, confmTBins3D, confEtaBins, confPhiBins, confIsMC, confUse3D); @@ -894,6 +896,56 @@ struct FemtoUniversePairTaskTrackV0Extended { PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processMCTruth, "Process MC truth data", false); + void processPairFractions(FilteredFDCollisions const& cols, FemtoRecoParticles const& parts) + { + + ColumnBinningPolicy colBinningMult{{confVtxBins, confMultBins}, true}; + ColumnBinningPolicy colBinningCent{{confVtxBins, confMultBins}, true}; + + auto mixedCollProcessFunc = [&](auto& collision1, auto& collision2) -> void { + auto groupPartsOne = partsOneMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex(), cache); + auto groupPartsTwo = partsTwoMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision2.globalIndex(), cache); + + const auto& magFieldTesla1 = collision1.magField(); + const auto& magFieldTesla2 = collision2.magField(); + + if (magFieldTesla1 != magFieldTesla2) { + return; + } + + for (const auto& [p1, p2] : combinations(CombinationsFullIndexPolicy(groupPartsOne, groupPartsTwo))) { + // Lambda invariant mass cut + if (!invMLambda(p2.mLambda(), p2.mAntiLambda())) + continue; + /// PID using stored binned nsigma + if (!isParticleCombined(p1, confTrackChoicePartOne)) + continue; + + const auto& posChild = parts.iteratorAt(p2.globalIndex() - 2); + const auto& negChild = parts.iteratorAt(p2.globalIndex() - 1); + /// Daughters that do not pass this condition are not selected + if (!isParticleTPC(posChild, V0ChildTable[confV0Type1][0]) || !isParticleTPC(negChild, V0ChildTable[confV0Type1][1])) + continue; + + // track cleaning + if (!pairCleaner.isCleanPair(p1, p2, parts)) { + continue; + } + if (confIsCPR.value) { + if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla1, femto_universe_container::EventType::mixed)) { + continue; + } + } + registryMCreco.fill(HIST("motherParticle"), p1.motherPDG(), p2.motherPDG()); + } + }; + + for (const auto& [collision1, collision2] : soa::selfCombinations(colBinningCent, confNEventsMix, -1, cols, cols)) { + mixedCollProcessFunc(collision1, collision2); + } + } + PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processPairFractions, "Process MC data to obtain pair fractions", false); + void processMCReco(FemtoRecoParticles const& parts, aod::FdMCParticles const& mcparts) { for (const auto& part : parts) { From f2f626051f1bbe6344fed18577653e2b1d1018e7 Mon Sep 17 00:00:00 2001 From: Stefano Cannito <143754257+scannito@users.noreply.github.com> Date: Sat, 15 Mar 2025 11:58:51 +0100 Subject: [PATCH 0698/1650] [PWGLF] Choose number of deltay classes (#10501) --- .../Tasks/Strangeness/phik0shortanalysis.cxx | 640 +++++++++--------- 1 file changed, 305 insertions(+), 335 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx index 712278be785..bf04c3c0e37 100644 --- a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx @@ -15,6 +15,7 @@ #include #include +#include #include #include #include @@ -131,8 +132,8 @@ struct Phik0shortanalysis { Configurable v0SettingCosPA{"v0SettingCosPA", 0.98f, "V0 CosPA"}; Configurable v0SettingRadius{"v0SettingRadius", 0.5f, "v0radius"}; Configurable v0SettingDCAV0Dau{"v0SettingDCAV0Dau", 1.0f, "DCA V0 Daughters"}; - Configurable v0SettingDCAPosToPV{"v0SettingDCAPosToPV", 0.06f, "DCA Pos To PV"}; - Configurable v0SettingDCANegToPV{"v0SettingDCANegToPV", 0.06f, "DCA Neg To PV"}; + Configurable v0SettingDCAPosToPV{"v0SettingDCAPosToPV", 0.1f, "DCA Pos To PV"}; + Configurable v0SettingDCANegToPV{"v0SettingDCANegToPV", 0.1f, "DCA Neg To PV"}; Configurable v0SettingMinPt{"v0SettingMinPt", 0.1f, "V0 min pt"}; Configurable cfgisV0ForData{"cfgisV0ForData", true, "isV0ForData"}; @@ -157,9 +158,10 @@ struct Phik0shortanalysis { Configurable nBinsY{"nBinsY", 80, "Number of bins in y axis"}; Configurable nBinsDeltaY{"nBinsDeltaY", 24, "Number of bins in deltay axis"}; Configurable cfgYAcceptance{"cfgYAcceptance", 0.5f, "Rapidity acceptance"}; + Configurable cfgYAcceptanceSmear{"cfgYAcceptanceSmear", 0.8f, "Rapidity acceptance for smearing matrix study"}; Configurable cfgFCutOnDeltaY{"cfgFCutOnDeltaY", 0.5f, "First upper bound on Deltay selection"}; Configurable cfgSCutOnDeltaY{"cfgSCutOnDeltaY", 0.1f, "Second upper bound on Deltay selection"}; - Configurable cfgYAcceptanceSmear{"cfgYAcceptanceSmear", 0.8f, "Rapidity acceptance for smearing matrix study"}; + Configurable> cfgDeltaYAcceptanceBins{"cfgDeltaYAcceptanceBins", {1.0f, 0.8f, 0.6f, 0.5f, 0.3f, 0.2f}, "Rapidity acceptance bins"}; // Configurable for RecMC Configurable cfgiskNoITSROFrameBorder{"cfgiskNoITSROFrameBorder", false, "kNoITSROFrameBorder request on RecMC collisions"}; @@ -225,7 +227,7 @@ struct Phik0shortanalysis { Service ccdb; // Set of functions for phi purity - std::vector> phiPurityFunctions = std::vector>(10, std::vector(7, nullptr)); + std::vector> phiPurityFunctions = std::vector>(binsMult->size(), std::vector(binspTPhi->size(), nullptr)); void init(InitContext&) { @@ -298,15 +300,19 @@ struct Phik0shortanalysis { dataPhiHist.add("hNsigmaKaonTOF", "NsigmaKaon TOF distribution", kTH2F, {{100, 0.0, 5.0, "#it{p} (GeV/#it{c})"}, {100, -10.0f, 10.0f}}); // Phi invariant mass for computing purities and normalisation - dataPhiHist.add("h3PhipurInvMass", "Invariant mass of Phi for Purity (no K0S/Pi)", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); + dataPhiHist.add("h3PhipurData", "Invariant mass of Phi for Purity (no K0S/Pi) in Data", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); - dataPhiHist.add("h3PhipurK0SInvMassInc", "Invariant mass of Phi for Purity (K0S) Inclusive", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); - dataPhiHist.add("h3PhipurK0SInvMassFCut", "Invariant mass of Phi for Purity (K0S) Deltay < FirstCut", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); - dataPhiHist.add("h3PhipurK0SInvMassSCut", "Invariant mass of Phi for Purity (K0S) Deltay < SecondCut", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); + dataPhiHist.add("h4PhipurK0SData", "Invariant mass of Phi for Purity (K0S) in Data", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); + dataPhiHist.get(HIST("h4PhipurK0SData"))->GetAxis(0)->SetBinLabel(1, "Inclusive"); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + dataPhiHist.get(HIST("h4PhipurK0SData"))->GetAxis(0)->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); + } - dataPhiHist.add("h3PhipurPiInvMassInc", "Invariant mass of Phi for Purity (Pi) Inclusive", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); - dataPhiHist.add("h3PhipurPiInvMassFCut", "Invariant mass of Phi for Purity (Pi) Deltay < FirstCut", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); - dataPhiHist.add("h3PhipurPiInvMassSCut", "Invariant mass of Phi for Purity (Pi) Deltay < SecondCut", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); + dataPhiHist.add("h4PhipurPiData", "Invariant mass of Phi for Purity (Pi) in Data", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); + dataPhiHist.get(HIST("h4PhipurPiData"))->GetAxis(0)->SetBinLabel(1, "Inclusive"); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + dataPhiHist.get(HIST("h4PhipurPiData"))->GetAxis(0)->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); + } // DCA plots for phi daughters in MCReco mcPhiHist.add("h2DauTracksPhiDCAxyPreCutMCReco", "Dcaxy distribution vs pt before DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); @@ -315,15 +321,19 @@ struct Phik0shortanalysis { mcPhiHist.add("h2DauTracksPhiDCAzPostCutMCReco", "Dcaz distribution vs pt after DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{z} (cm)"}}); // MCPhi invariant mass for computing purities - closureMCPhiHist.add("h3MCPhipurInvMass", "Invariant mass of Phi for Purity (no K0S/Pi)", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); + closureMCPhiHist.add("h3PhipurMCClosure", "Invariant mass of Phi for Purity (no K0S/Pi)", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); - closureMCPhiHist.add("h3MCPhipurK0SInvMassInc", "Invariant mass of Phi for Purity (K0S) Inclusive", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); - closureMCPhiHist.add("h3MCPhipurK0SInvMassFCut", "Invariant mass of Phi for Purity (K0S) Deltay < FirstCut", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); - closureMCPhiHist.add("h3MCPhipurK0SInvMassSCut", "Invariant mass of Phi for Purity (K0S) Deltay < SecondCut", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); + closureMCPhiHist.add("h4PhipurK0SMCClosure", "Invariant mass of Phi for Purity (K0S) in MCClosure", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); + closureMCPhiHist.get(HIST("h4PhipurK0SMCClosure"))->GetAxis(0)->SetBinLabel(1, "Inclusive"); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + closureMCPhiHist.get(HIST("h4PhipurK0SMCClosure"))->GetAxis(0)->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); + } - closureMCPhiHist.add("h3MCPhipurPiInvMassInc", "Invariant mass of Phi for Purity (Pi) Inclusive", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); - closureMCPhiHist.add("h3MCPhipurPiInvMassFCut", "Invariant mass of Phi for Purity (Pi) Deltay < FirstCut", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); - closureMCPhiHist.add("h3MCPhipurPiInvMassSCut", "Invariant mass of Phi for Purity (Pi) Deltay < SecondCut", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); + closureMCPhiHist.add("h4PhipurPiMCClosure", "Invariant mass of Phi for Purity (Pi) in MCClosure", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); + closureMCPhiHist.get(HIST("h4PhipurPiMCClosure"))->GetAxis(0)->SetBinLabel(1, "Inclusive"); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + closureMCPhiHist.get(HIST("h4PhipurPiMCClosure"))->GetAxis(0)->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); + } // K0S topological/PID cuts dataK0SHist.add("hDCAV0Daughters", "hDCAV0Daughters", kTH1F, {{55, 0.0f, 2.2f}}); @@ -332,9 +342,11 @@ struct Phik0shortanalysis { dataK0SHist.add("hNSigmaNegPionFromK0S", "hNSigmaNegPionFromK0Short", kTH2F, {{100, 0.0, 5.0, "#it{p} (GeV/#it{c})"}, {100, -10.0f, 10.0f}}); // 2D mass of Phi and K0S for Data - dataPhiK0SHist.add("h4PhiK0SSEInc", "2D Invariant mass of Phi and K0Short for Same Event Inclusive", kTHnSparseF, {binnedmultAxis, binnedptK0SAxis, massK0SAxis, sigmassPhiAxis}); - dataPhiK0SHist.add("h4PhiK0SSEFCut", "2D Invariant mass of Phi and K0Short for Same Event Deltay < FirstCut", kTHnSparseF, {binnedmultAxis, binnedptK0SAxis, massK0SAxis, sigmassPhiAxis}); - dataPhiK0SHist.add("h4PhiK0SSESCut", "2D Invariant mass of Phi and K0Short for Same Event Deltay < SecondCut", kTHnSparseF, {binnedmultAxis, binnedptK0SAxis, massK0SAxis, sigmassPhiAxis}); + dataPhiK0SHist.add("h5PhiK0SData", "2D Invariant mass of Phi and K0Short for Data", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptK0SAxis, massK0SAxis, sigmassPhiAxis}); + dataPhiK0SHist.get(HIST("h5PhiK0SData"))->GetAxis(0)->SetBinLabel(1, "Inclusive"); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + dataPhiK0SHist.get(HIST("h5PhiK0SData"))->GetAxis(0)->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); + } // 1D mass of K0S for Data dataPhiK0SHist.add("h3PhiK0SSEIncNew", "Invariant mass of K0Short for Same Event Inclusive", kTH3F, {binnedmultAxis, binnedptK0SAxis, massK0SAxis}); @@ -345,23 +357,31 @@ struct Phik0shortanalysis { dataK0SHist.add("h3K0SRapidityData", "K0Short rapidity for Data", kTH3F, {binnedmultAxis, binnedptK0SAxis, yAxis}); // RecMC K0S coupled to Phi - mcPhiK0SHist.add("h3RecMCPhiK0SInc", "RecoMC K0Short coupled to Phi Inclusive", kTH3F, {binnedmultAxis, binnedptK0SAxis, massK0SAxis}); - mcPhiK0SHist.add("h3RecMCPhiK0SFCut", "RecoMC K0Short coupled to Phi Deltay < FirstCut", kTH3F, {binnedmultAxis, binnedptK0SAxis, massK0SAxis}); - mcPhiK0SHist.add("h3RecMCPhiK0SSCut", "RecoMC K0Short coupled to Phi Deltay < SecondCut", kTH3F, {binnedmultAxis, binnedptK0SAxis, massK0SAxis}); + mcPhiK0SHist.add("h4PhiK0SMCReco", "K0S coupled to Phi in MCReco", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptK0SAxis, massK0SAxis}); + mcPhiK0SHist.get(HIST("h4PhiK0SMCReco"))->GetAxis(0)->SetBinLabel(1, "Inclusive"); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + mcPhiK0SHist.get(HIST("h4PhiK0SMCReco"))->GetAxis(0)->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); + } // GenMC K0S coupled to Phi - mcPhiK0SHist.add("h2PhiK0SGenMCInc", "K0Short coupled to Phi for GenMC Inclusive", kTH2F, {binnedmultAxis, binnedptK0SAxis}); - mcPhiK0SHist.add("h2PhiK0SGenMCFCut", "K0Short coupled to Phi for GenMC Deltay < FirstCut", kTH2F, {binnedmultAxis, binnedptK0SAxis}); - mcPhiK0SHist.add("h2PhiK0SGenMCSCut", "K0Short coupled to Phi for GenMC Deltay < SecondCut", kTH2F, {binnedmultAxis, binnedptK0SAxis}); + mcPhiK0SHist.add("h3PhiK0SMCGen", "K0S coupled toPhi in MCGen", kTH3F, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptK0SAxis}); + mcPhiK0SHist.get(HIST("h3PhiK0SMCGen"))->GetXaxis()->SetBinLabel(1, "Inclusive"); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + mcPhiK0SHist.get(HIST("h3PhiK0SMCGen"))->GetXaxis()->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); + } - mcPhiK0SHist.add("h2PhiK0SGenMCIncAssocReco", "K0Short coupled to Phi for GenMC Inclusive Associated Reco Collision", kTH2F, {binnedmultAxis, binnedptK0SAxis}); - mcPhiK0SHist.add("h2PhiK0SGenMCFCutAssocReco", "K0Short coupled to Phi for GenMC Deltay < FirstCut Associated Reco Collision", kTH2F, {binnedmultAxis, binnedptK0SAxis}); - mcPhiK0SHist.add("h2PhiK0SGenMCSCutAssocReco", "K0Short coupled to Phi for GenMC Deltay < SecondCut Associated Reco Collision", kTH2F, {binnedmultAxis, binnedptK0SAxis}); + mcPhiK0SHist.add("h3PhiK0SMCGenAssocReco", "K0S coupled toPhi in MCGen Associated MCReco Collision", kTH3F, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptK0SAxis}); + mcPhiK0SHist.get(HIST("h3PhiK0SMCGenAssocReco"))->GetXaxis()->SetBinLabel(1, "Inclusive"); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + mcPhiK0SHist.get(HIST("h3PhiK0SMCGenAssocReco"))->GetXaxis()->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); + } // 2D mass of Phi and K0S for Closure Test - closureMCPhiK0SHist.add("h4ClosureMCPhiK0SSEInc", "2D Invariant mass of Phi and K0Short for Inclusive for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptK0SAxis, massK0SAxis, sigmassPhiAxis}); - closureMCPhiK0SHist.add("h4ClosureMCPhiK0SSEFCut", "2D Invariant mass of Phi and K0Short for Deltay < FirstCut for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptK0SAxis, massK0SAxis, sigmassPhiAxis}); - closureMCPhiK0SHist.add("h4ClosureMCPhiK0SSESCut", "2D Invariant mass of Phi and K0Short for Deltay < SecondCut for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptK0SAxis, massK0SAxis, sigmassPhiAxis}); + closureMCPhiK0SHist.add("h5PhiK0SMCClosure", "2D Invariant mass of Phi and K0Short for MC Closure Test", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptK0SAxis, massK0SAxis, sigmassPhiAxis}); + closureMCPhiK0SHist.get(HIST("h5PhiK0SMCClosure"))->GetAxis(0)->SetBinLabel(1, "Inclusive"); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + closureMCPhiK0SHist.get(HIST("h5PhiK0SMCClosure"))->GetAxis(0)->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); + } // 1D mass of K0S for Closure Test closureMCPhiK0SHist.add("h3ClosureMCPhiK0SSEIncNew", "Invariant mass of K0Short for Inclusive for Closure Test", kTH3F, {binnedmultAxis, binnedptK0SAxis, massK0SAxis}); @@ -369,9 +389,11 @@ struct Phik0shortanalysis { closureMCPhiK0SHist.add("h3ClosureMCPhiK0SSESCutNew", "Invariant mass of K0Short for Deltay < SecondCut for Closure Test", kTH3F, {binnedmultAxis, binnedptK0SAxis, massK0SAxis}); // Phi mass vs Pion NSigma dE/dx for Data - dataPhiPionHist.add("h5PhiPiSEInc", "Phi Invariant mass vs Pion nSigma TPC/TOF for Same Event Inclusive", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); - dataPhiPionHist.add("h5PhiPiSEFCut", "Phi Invariant mass vs Pion nSigma TPC/TOF for Same Event Deltay < FirstCut", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); - dataPhiPionHist.add("h5PhiPiSESCut", "Phi Invariant mass vs Pion nSigma TPC/TOF for Same Event Deltay < SecondCut", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); + dataPhiPionHist.add("h6PhiPiData", "Phi Invariant mass vs Pion nSigma TPC/TOF for Data", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); + dataPhiPionHist.get(HIST("h6PhiPiData"))->GetAxis(0)->SetBinLabel(1, "Inclusive"); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + dataPhiPionHist.get(HIST("h6PhiPiData"))->GetAxis(0)->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); + } // Pion NSigma dE/dx for Data dataPhiPionHist.add("h4PhiPiSEIncNew", "Pion nSigma TPC/TOF for Same Event Inclusive", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}}); @@ -399,28 +421,37 @@ struct Phik0shortanalysis { mcPionHist.add("h3RecMCDCAxySecMaterialPi", "Dcaxy distribution vs pt for Secondary Pions from Material", kTH2F, {binnedptPiAxis, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); // RecMC Pion coupled to Phi with TPC - mcPhiPionHist.add("h3RecMCPhiPiTPCInc", "RecoMC Pion coupled to Phi with TPC Inclusive", kTH3F, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}}); - mcPhiPionHist.add("h3RecMCPhiPiTPCFCut", "RecoMC Pion coupled to Phi with TPC Deltay < FirstCut", kTH3F, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}}); - mcPhiPionHist.add("h3RecMCPhiPiTPCSCut", "RecoMC Pion coupled to Phi with TPC Deltay < SecondCut", kTH3F, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}}); + mcPhiPionHist.add("h4PhiPiTPCMCReco", "Pion coupled to Phi in MCReco (TPC)", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}}); + mcPhiPionHist.get(HIST("h4PhiPiTPCMCReco"))->GetAxis(0)->SetBinLabel(1, "Inclusive"); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + mcPhiPionHist.get(HIST("h4PhiPiTPCMCReco"))->GetAxis(0)->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); + } // RecMC Pion coupled to Phi with TPC and TOF - mcPhiPionHist.add("h4RecMCPhiPiTPCTOFInc", "RecoMC Pion coupled to Phi with TPC and TOF Inclusive", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}}); - mcPhiPionHist.add("h4RecMCPhiPiTPCTOFFCut", "RecoMC Pion coupled to Phi with TPC and TOF Deltay < FirstCut", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}}); - mcPhiPionHist.add("h4RecMCPhiPiTPCTOFSCut", "RecoMC Pion coupled to Phi with TPC and TOF Deltay < SecondCut", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}}); + mcPhiPionHist.add("h5PhiPiTPCTOFMCReco", "Pion coupled to Phi in MCReco (TPC and TOF)", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}}); + mcPhiPionHist.get(HIST("h5PhiPiTPCTOFMCReco"))->GetAxis(0)->SetBinLabel(1, "Inclusive"); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + mcPhiPionHist.get(HIST("h5PhiPiTPCTOFMCReco"))->GetAxis(0)->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); + } - // GenMC Pion coupled to Phi - mcPhiPionHist.add("h2PhiPiGenMCInc", "Pion coupled to Phi for GenMC Inclusive", kTH2F, {binnedmultAxis, binnedptPiAxis}); - mcPhiPionHist.add("h2PhiPiGenMCFCut", "Pion coupled to Phi for GenMC Deltay < FirstCut", kTH2F, {binnedmultAxis, binnedptPiAxis}); - mcPhiPionHist.add("h2PhiPiGenMCSCut", "Pion coupled to Phi for GenMC Deltay < SecondCut", kTH2F, {binnedmultAxis, binnedptPiAxis}); + mcPhiPionHist.add("h3PhiPiMCGen", "Pion coupled to Phi in MCGen", kTH3F, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptPiAxis}); + mcPhiPionHist.get(HIST("h3PhiPiMCGen"))->GetXaxis()->SetBinLabel(1, "Inclusive"); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + mcPhiPionHist.get(HIST("h3PhiPiMCGen"))->GetXaxis()->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); + } - mcPhiPionHist.add("h2PhiPiGenMCIncAssocReco", "Pion coupled to Phi for GenMC Inclusive Associated Reco Collision", kTH2F, {binnedmultAxis, binnedptPiAxis}); - mcPhiPionHist.add("h2PhiPiGenMCFCutAssocReco", "Pion coupled to Phi for GenMC Deltay < FirstCut Associated Reco Collision", kTH2F, {binnedmultAxis, binnedptPiAxis}); - mcPhiPionHist.add("h2PhiPiGenMCSCutAssocReco", "Pion coupled to Phi for GenMC Deltay < SecondCut Associated Reco Collision", kTH2F, {binnedmultAxis, binnedptPiAxis}); + mcPhiPionHist.add("h3PhiPiMCGenAssocReco", "Pion coupled to Phi in MCGen Associated Reco Collision", kTH3F, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptPiAxis}); + mcPhiPionHist.get(HIST("h3PhiPiMCGenAssocReco"))->GetXaxis()->SetBinLabel(1, "Inclusive"); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + mcPhiPionHist.get(HIST("h3PhiPiMCGenAssocReco"))->GetXaxis()->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); + } // Phi mass vs Pion NSigma dE/dx for Closure Test - closureMCPhiPionHist.add("h5ClosureMCPhiPiSEInc", "Phi Invariant mass vs Pion nSigma TPC/TOF for Inclusive for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); - closureMCPhiPionHist.add("h5ClosureMCPhiPiSEFCut", "Phi Invariant mass vs Pion nSigma TPC/TOF for Deltay < FirstCut for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); - closureMCPhiPionHist.add("h5ClosureMCPhiPiSESCut", "Phi Invariant mass vs Pion nSigma TPC/TOF for Deltay < SecondCut for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); + closureMCPhiPionHist.add("h6PhiPiMCClosure", "Phi Invariant mass vs Pion nSigma TPC/TOF for MC Closure Test", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); + closureMCPhiPionHist.get(HIST("h6PhiPiMCClosure"))->GetAxis(0)->SetBinLabel(1, "Inclusive"); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + closureMCPhiPionHist.get(HIST("h6PhiPiMCClosure"))->GetAxis(0)->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); + } // Phi mass vs Pion NSigma dE/dx for Closure Test closureMCPhiPionHist.add("h4ClosureMCPhiPiSEIncNew", "Pion nSigma TPC/TOF for Inclusive for Closure Test", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}}); @@ -462,10 +493,10 @@ struct Phik0shortanalysis { mcPhiHist.add("h3PhiRapiditySmearing", "Rapidity Smearing Matrix for Phi", kTH3F, {binnedmultAxis, yAxis, yAxis}); // MCK0S invariant mass and GenMC K0S for computing efficiencies - mcK0SHist.add("h3RecMCK0S", "RecoMC K0Short for Efficiency", kTH3F, {binnedmultAxis, binnedptK0SAxis, massK0SAxis}); + mcK0SHist.add("h3K0SMCReco", "K0S for MCReco", kTH3F, {binnedmultAxis, binnedptK0SAxis, massK0SAxis}); - mcK0SHist.add("h2K0SGenMC", "K0Short for GenMC", kTH2F, {binnedmultAxis, binnedptK0SAxis}); - mcK0SHist.add("h2K0SGenMCAssocReco", "K0Short for GenMC Associated Reco Collision", kTH2F, {binnedmultAxis, binnedptK0SAxis}); + mcK0SHist.add("h2K0SMCGen", "K0S for MCGen", kTH2F, {binnedmultAxis, binnedptK0SAxis}); + mcK0SHist.add("h2K0SMCGenAssocReco", "K0S for MCGen Associated Reco Collision", kTH2F, {binnedmultAxis, binnedptK0SAxis}); // Rapidity smearing matrix for K0S and rapidity in GenMC mcK0SHist.add("h4K0SRapiditySmearing", "Rapidity Smearing Matrix for K0Short", kTHnSparseF, {binnedmultAxis, binnedptK0SAxis, yAxis, yAxis}); @@ -473,11 +504,11 @@ struct Phik0shortanalysis { mcK0SHist.add("h3K0SRapidityGenMC", "Rapidity for K0Short for GenMC", kTH3F, {binnedmultAxis, binnedptK0SAxis, yAxis}); // MCPion invariant mass and GenMC Pion for computing efficiencies - mcPionHist.add("h3RecMCPiTPC", "RecoMC Pion for Efficiency with TPC", kTH3F, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}}); - mcPionHist.add("h4RecMCPiTPCTOF", "RecoMC Pion for Efficiency with TPC and TOF", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}}); + mcPionHist.add("h3PiTPCMCReco", "Pion for MCReco (TPC)", kTH3F, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}}); + mcPionHist.add("h4PiTPCTOFMCReco", "Pion for MCReco (TPC and TOF)", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}}); - mcPionHist.add("h2PiGenMC", "Pion for GenMC", kTH2F, {binnedmultAxis, binnedptPiAxis}); - mcPionHist.add("h2PiGenMCAssocReco", "Pion for GenMC Associated Reco Collision", kTH2F, {binnedmultAxis, binnedptPiAxis}); + mcPionHist.add("h2PiMCGen", "Pion for GenMC", kTH2F, {binnedmultAxis, binnedptPiAxis}); + mcPionHist.add("h2PiMCGenAssocReco", "Pion for GenMC Associated Reco Collision", kTH2F, {binnedmultAxis, binnedptPiAxis}); // Rapidity smearing matrix for Pion and rapidity in GenMC mcPionHist.add("h4PiRapiditySmearing", "Rapidity Smearing Matrix for Pion", kTHnSparseF, {binnedmultAxis, binnedptPiAxis, yAxis, yAxis}); @@ -782,59 +813,55 @@ struct Phik0shortanalysis { // Fill 2D invariant mass histogram for V0 and Phi template - void fillInvMass2D(const T& V0, const std::vector& listPhi, float multiplicity, const std::array& weights) + void fillInvMass2D(const T& V0, const std::vector& listPhi, float multiplicity, const std::vector& weights) { for (const auto& Phi : listPhi) { if constexpr (!isMC) { // same event - dataPhiK0SHist.fill(HIST("h4PhiK0SSEInc"), multiplicity, V0.pt(), V0.mK0Short(), Phi.M(), weights.at(0)); - if (std::abs(V0.yK0Short() - Phi.Rapidity()) > cfgFCutOnDeltaY) - continue; - dataPhiK0SHist.fill(HIST("h4PhiK0SSEFCut"), multiplicity, V0.pt(), V0.mK0Short(), Phi.M(), weights.at(1)); - if (std::abs(V0.yK0Short() - Phi.Rapidity()) > cfgSCutOnDeltaY) - continue; - dataPhiK0SHist.fill(HIST("h4PhiK0SSESCut"), multiplicity, V0.pt(), V0.mK0Short(), Phi.M(), weights.at(2)); + dataPhiK0SHist.fill(HIST("h5PhiK0SData"), 0, multiplicity, V0.pt(), V0.mK0Short(), Phi.M(), weights.at(0)); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + if (std::abs(V0.yK0Short() - Phi.Rapidity()) > cfgDeltaYAcceptanceBins->at(i)) + continue; + dataPhiK0SHist.fill(HIST("h5PhiK0SData"), i + 1, multiplicity, V0.pt(), V0.mK0Short(), Phi.M(), weights.at(i + 1)); + } } else { // MC event - closureMCPhiK0SHist.fill(HIST("h4ClosureMCPhiK0SSEInc"), multiplicity, V0.pt(), V0.mK0Short(), Phi.M(), weights.at(0)); - if (std::abs(V0.yK0Short() - Phi.Rapidity()) > cfgFCutOnDeltaY) - continue; - closureMCPhiK0SHist.fill(HIST("h4ClosureMCPhiK0SSEFCut"), multiplicity, V0.pt(), V0.mK0Short(), Phi.M(), weights.at(1)); - if (std::abs(V0.yK0Short() - Phi.Rapidity()) > cfgSCutOnDeltaY) - continue; - closureMCPhiK0SHist.fill(HIST("h4ClosureMCPhiK0SSESCut"), multiplicity, V0.pt(), V0.mK0Short(), Phi.M(), weights.at(2)); + closureMCPhiK0SHist.fill(HIST("h5PhiK0SMCClosure"), 0, multiplicity, V0.pt(), V0.mK0Short(), Phi.M(), weights.at(0)); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + if (std::abs(V0.yK0Short() - Phi.Rapidity()) > cfgDeltaYAcceptanceBins->at(i)) + continue; + closureMCPhiK0SHist.fill(HIST("h5PhiK0SMCClosure"), i + 1, multiplicity, V0.pt(), V0.mK0Short(), Phi.M(), weights.at(i + 1)); + } } } } // Fill Phi invariant mass vs Pion nSigmaTPC/TOF histogram template - void fillInvMassNSigma(const T& Pi, const std::vector& listPhi, float multiplicity, const std::array& weights) + void fillInvMassNSigma(const T& Pi, const std::vector& listPhi, float multiplicity, const std::vector& weights) { float nSigmaTOFPi = (Pi.hasTOF() ? Pi.tofNSigmaPi() : -999); for (const auto& Phi : listPhi) { if constexpr (!isMC) { // same event - dataPhiPionHist.fill(HIST("h5PhiPiSEInc"), multiplicity, Pi.pt(), Pi.tpcNSigmaPi(), nSigmaTOFPi, Phi.M(), weights.at(0)); - if (std::abs(Pi.rapidity(massPi) - Phi.Rapidity()) > cfgFCutOnDeltaY) - continue; - dataPhiPionHist.fill(HIST("h5PhiPiSEFCut"), multiplicity, Pi.pt(), Pi.tpcNSigmaPi(), nSigmaTOFPi, Phi.M(), weights.at(1)); - if (std::abs(Pi.rapidity(massPi) - Phi.Rapidity()) > cfgSCutOnDeltaY) - continue; - dataPhiPionHist.fill(HIST("h5PhiPiSESCut"), multiplicity, Pi.pt(), Pi.tpcNSigmaPi(), nSigmaTOFPi, Phi.M(), weights.at(2)); + dataPhiPionHist.fill(HIST("h6PhiPiData"), 0, multiplicity, Pi.pt(), Pi.tpcNSigmaPi(), nSigmaTOFPi, Phi.M(), weights.at(0)); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + if (std::abs(Pi.rapidity(massPi) - Phi.Rapidity()) > cfgDeltaYAcceptanceBins->at(i)) + continue; + dataPhiPionHist.fill(HIST("h6PhiPiData"), i + 1, multiplicity, Pi.pt(), Pi.tpcNSigmaPi(), nSigmaTOFPi, Phi.M(), weights.at(i + 1)); + } } else { // MC event - closureMCPhiPionHist.fill(HIST("h5ClosureMCPhiPiSEInc"), multiplicity, Pi.pt(), Pi.tpcNSigmaPi(), nSigmaTOFPi, Phi.M(), weights.at(0)); - if (std::abs(Pi.rapidity(massPi) - Phi.Rapidity()) > cfgFCutOnDeltaY) - continue; - closureMCPhiPionHist.fill(HIST("h5ClosureMCPhiPiSEFCut"), multiplicity, Pi.pt(), Pi.tpcNSigmaPi(), nSigmaTOFPi, Phi.M(), weights.at(1)); - if (std::abs(Pi.rapidity(massPi) - Phi.Rapidity()) > cfgSCutOnDeltaY) - continue; - closureMCPhiPionHist.fill(HIST("h5ClosureMCPhiPiSESCut"), multiplicity, Pi.pt(), Pi.tpcNSigmaPi(), nSigmaTOFPi, Phi.M(), weights.at(2)); + closureMCPhiPionHist.fill(HIST("h6PhiPiMCClosure"), 0, multiplicity, Pi.pt(), Pi.tpcNSigmaPi(), nSigmaTOFPi, Phi.M(), weights.at(0)); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + if (std::abs(Pi.rapidity(massPi) - Phi.Rapidity()) > cfgDeltaYAcceptanceBins->at(i)) + continue; + closureMCPhiPionHist.fill(HIST("h6PhiPiMCClosure"), i + 1, multiplicity, Pi.pt(), Pi.tpcNSigmaPi(), nSigmaTOFPi, Phi.M(), weights.at(i + 1)); + } } } } // Fill invariant mass histogram for V0 template - void fillInvMass(const T& V0, float multiplicity, const std::array& weights) + void fillInvMass(const T& V0, float multiplicity, const std::vector& weights) { if constexpr (!isMC) { // same event dataPhiK0SHist.fill(HIST("h3PhiK0SSEIncNew"), multiplicity, V0.pt(), V0.mK0Short(), weights.at(0)); @@ -849,7 +876,7 @@ struct Phik0shortanalysis { // Fill nSigmaTPC/TOF histogram for Pion template - void fillNSigma(const T& Pi, float multiplicity, const std::array& weights) + void fillNSigma(const T& Pi, float multiplicity, const std::vector& weights) { float nSigmaTOFPi = (Pi.hasTOF() ? Pi.tofNSigmaPi() : -999); @@ -917,9 +944,9 @@ struct Phik0shortanalysis { if (fillMethodSingleWeight) weight *= (1 - getPhiPurity(multiplicity, recPhi)); - dataPhiHist.fill(HIST("h3PhipurInvMass"), multiplicity, recPhi.Pt(), recPhi.M()); + dataPhiHist.fill(HIST("h3PhipurData"), multiplicity, recPhi.Pt(), recPhi.M()); - std::array isCountedK0S{false, false, false}; + std::vector countsK0S(cfgDeltaYAcceptanceBins->size() + 1, 0); // V0 already reconstructed by the builder for (const auto& v0 : V0s) { @@ -945,27 +972,23 @@ struct Phik0shortanalysis { if (std::abs(v0.yK0Short()) > cfgYAcceptance) continue; - if (!isCountedK0S.at(0)) { - dataPhiHist.fill(HIST("h3PhipurK0SInvMassInc"), multiplicity, recPhi.Pt(), recPhi.M()); - isCountedK0S.at(0) = true; - } - if (std::abs(v0.yK0Short() - recPhi.Rapidity()) > cfgFCutOnDeltaY) - continue; - if (!isCountedK0S.at(1)) { - dataPhiHist.fill(HIST("h3PhipurK0SInvMassFCut"), multiplicity, recPhi.Pt(), recPhi.M()); - isCountedK0S.at(1) = true; - } - if (std::abs(v0.yK0Short() - recPhi.Rapidity()) > cfgSCutOnDeltaY) - continue; - if (!isCountedK0S.at(2)) { - dataPhiHist.fill(HIST("h3PhipurK0SInvMassSCut"), multiplicity, recPhi.Pt(), recPhi.M()); - isCountedK0S.at(2) = true; + + countsK0S.at(0)++; + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + if (std::abs(v0.yK0Short() - recPhi.Rapidity()) > cfgDeltaYAcceptanceBins->at(i)) + continue; + countsK0S.at(i + 1)++; } } + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size() + 1; i++) { + if (countsK0S.at(i) > 0) + dataPhiHist.fill(HIST("h4PhipurK0SData"), i, multiplicity, recPhi.Pt(), recPhi.M()); + } + isFilledhV0 = true; - std::array isCountedPi{false, false, false}; + std::vector countsPi(cfgDeltaYAcceptanceBins->size(), 0); // Loop over all primary pion candidates for (const auto& track : fullTracks) { @@ -974,23 +997,19 @@ struct Phik0shortanalysis { if (std::abs(track.rapidity(massPi)) > cfgYAcceptance) continue; - if (!isCountedPi.at(0)) { - dataPhiHist.fill(HIST("h3PhipurPiInvMassInc"), multiplicity, recPhi.Pt(), recPhi.M()); - isCountedPi.at(0) = true; - } - if (std::abs(track.rapidity(massPi) - recPhi.Rapidity()) > cfgFCutOnDeltaY) - continue; - if (!isCountedPi.at(1)) { - dataPhiHist.fill(HIST("h3PhipurPiInvMassFCut"), multiplicity, recPhi.Pt(), recPhi.M()); - isCountedPi.at(1) = true; - } - if (std::abs(track.rapidity(massPi) - recPhi.Rapidity()) > cfgSCutOnDeltaY) - continue; - if (!isCountedPi.at(2)) { - dataPhiHist.fill(HIST("h3PhipurPiInvMassSCut"), multiplicity, recPhi.Pt(), recPhi.M()); - isCountedPi.at(2) = true; + + countsPi.at(0)++; + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + if (std::abs(track.rapidity(massPi) - recPhi.Rapidity()) > cfgDeltaYAcceptanceBins->at(i)) + continue; + countsPi.at(i + 1)++; } } + + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size() + 1; i++) { + if (countsPi.at(i) > 0) + dataPhiHist.fill(HIST("h4PhipurPiData"), i, multiplicity, recPhi.Pt(), recPhi.M()); + } } } @@ -1029,8 +1048,8 @@ struct Phik0shortanalysis { continue; std::vector listrecPhi; - std::array counts{}; - std::array weights{1, 1, 1}; + std::vector counts(cfgDeltaYAcceptanceBins->size() + 1, 0); + std::vector weights(cfgDeltaYAcceptanceBins->size() + 1, 1); // Phi reconstruction // Loop over positive tracks @@ -1066,24 +1085,22 @@ struct Phik0shortanalysis { counts.at(0)++; weights.at(0) *= (1 - phiPurity); - if (std::abs(v0.yK0Short() - recPhi.Rapidity()) > cfgFCutOnDeltaY) - continue; - counts.at(1)++; - weights.at(1) *= (1 - phiPurity); - if (std::abs(v0.yK0Short() - recPhi.Rapidity()) > cfgSCutOnDeltaY) - continue; - counts.at(2)++; - weights.at(2) *= (1 - phiPurity); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + if (std::abs(v0.yK0Short() - recPhi.Rapidity()) > cfgDeltaYAcceptanceBins->at(i)) + continue; + counts.at(i + 1)++; + weights.at(i + 1) *= (1 - phiPurity); + } } } if (fillMethodMultipleWeights) { - for (unsigned int i = 0; i < counts.size(); i++) { + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size() + 1; i++) { weights.at(i) = (counts.at(i) > 0 ? 1. / static_cast(counts.at(i)) : 0); } fillInvMass2D(v0, listrecPhi, multiplicity, weights); } else if (fillMethodSingleWeight) { - for (unsigned int i = 0; i < counts.size(); i++) { + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size() + 1; i++) { weights.at(i) = (counts.at(i) > 0 ? 1 - weights.at(i) : 0); } fillInvMass(v0, multiplicity, weights); @@ -1118,8 +1135,8 @@ struct Phik0shortanalysis { continue; std::vector listrecPhi; - std::array counts{}; - std::array weights{1, 1, 1}; + std::vector counts(cfgDeltaYAcceptanceBins->size() + 1, 0); + std::vector weights(cfgDeltaYAcceptanceBins->size() + 1, 1); // Phi reconstruction // Loop over positive tracks @@ -1155,24 +1172,22 @@ struct Phik0shortanalysis { counts.at(0)++; weights.at(0) *= (1 - phiPurity); - if (std::abs(track.rapidity(massPi) - recPhi.Rapidity()) > cfgFCutOnDeltaY) - continue; - counts.at(1)++; - weights.at(1) *= (1 - phiPurity); - if (std::abs(track.rapidity(massPi) - recPhi.Rapidity()) > cfgSCutOnDeltaY) - continue; - counts.at(2)++; - weights.at(2) *= (1 - phiPurity); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + if (std::abs(track.rapidity(massPi) - recPhi.Rapidity()) > cfgDeltaYAcceptanceBins->at(i)) + continue; + counts.at(i + 1)++; + weights.at(i + 1) *= (1 - phiPurity); + } } } if (fillMethodMultipleWeights) { - for (unsigned int i = 0; i < counts.size(); i++) { + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size() + 1; i++) { weights.at(i) = (counts.at(i) > 0 ? 1. / static_cast(counts.at(i)) : 0); } fillInvMassNSigma(track, listrecPhi, multiplicity, weights); } else if (fillMethodSingleWeight) { - for (unsigned int i = 0; i < counts.size(); i++) { + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size() + 1; i++) { weights.at(i) = (counts.at(i) > 0 ? 1 - weights.at(i) : 0); } fillNSigma(track, multiplicity, weights); @@ -1214,7 +1229,7 @@ struct Phik0shortanalysis { if (!track1.has_mcParticle()) continue; auto mcTrack1 = track1.mcParticle_as(); - if (mcTrack1.pdgCode() != 321 || !mcTrack1.isPhysicalPrimary()) + if (mcTrack1.pdgCode() != PDG_t::kKPlus || !mcTrack1.isPhysicalPrimary()) continue; // Loop over all negative tracks @@ -1229,14 +1244,14 @@ struct Phik0shortanalysis { if (!track2.has_mcParticle()) continue; auto mcTrack2 = track2.mcParticle_as(); - if (mcTrack2.pdgCode() != -321 || !mcTrack2.isPhysicalPrimary()) + if (mcTrack2.pdgCode() != PDG_t::kKMinus || !mcTrack2.isPhysicalPrimary()) continue; bool isMCMotherPhi = false; auto mcMotherPhi = mcTrack1.mothers_as()[0]; for (const auto& MotherOfmcTrack1 : mcTrack1.mothers_as()) { for (const auto& MotherOfmcTrack2 : mcTrack2.mothers_as()) { - if (MotherOfmcTrack1 == MotherOfmcTrack2 && MotherOfmcTrack1.pdgCode() == 333) { + if (MotherOfmcTrack1 == MotherOfmcTrack2 && MotherOfmcTrack1.pdgCode() == o2::constants::physics::Pdg::kPhi) { mcMotherPhi = MotherOfmcTrack1; isMCMotherPhi = true; } @@ -1271,7 +1286,7 @@ struct Phik0shortanalysis { } auto v0mcparticle = v0.mcParticle(); - if (v0mcparticle.pdgCode() != 310 || !v0mcparticle.isPhysicalPrimary()) + if (v0mcparticle.pdgCode() != PDG_t::kK0Short || !v0mcparticle.isPhysicalPrimary()) continue; const auto& posDaughterTrack = v0.posTrack_as(); @@ -1311,7 +1326,7 @@ struct Phik0shortanalysis { continue; auto mcTrack = track.mcParticle_as(); - if (std::abs(mcTrack.pdgCode()) != 211 || !mcTrack.isPhysicalPrimary()) + if (std::abs(mcTrack.pdgCode()) != PDG_t::kPiPlus || !mcTrack.isPhysicalPrimary()) continue; if (!selectionPion(track, false)) @@ -1366,7 +1381,7 @@ struct Phik0shortanalysis { continue; auto v0mcparticle = v0.mcParticle(); - if (v0mcparticle.pdgCode() != 310 || !v0mcparticle.isPhysicalPrimary()) + if (v0mcparticle.pdgCode() != PDG_t::kK0Short || !v0mcparticle.isPhysicalPrimary()) continue; const auto& posDaughterTrack = v0.posTrack_as(); @@ -1382,35 +1397,30 @@ struct Phik0shortanalysis { if (std::abs(v0mcparticle.y()) > cfgYAcceptance) continue; - mcK0SHist.fill(HIST("h3RecMCK0S"), genmultiplicity, v0mcparticle.pt(), v0.mK0Short()); + mcK0SHist.fill(HIST("h3K0SMCReco"), genmultiplicity, v0mcparticle.pt(), v0.mK0Short()); - std::array isCountedMCPhi{false, false, false}; + std::vector counts(cfgDeltaYAcceptanceBins->size() + 1, 0); for (const auto& mcParticle : mcParticlesThisColl) { - if (mcParticle.pdgCode() != 333) + if (mcParticle.pdgCode() != o2::constants::physics::Pdg::kPhi) continue; if (mcParticle.pt() < minPhiPt || mcParticle.pt() > maxPhiPt) continue; if (std::abs(mcParticle.y()) > cfgYAcceptance) continue; - if (!isCountedMCPhi.at(0)) { - mcPhiK0SHist.fill(HIST("h3RecMCPhiK0SInc"), genmultiplicity, v0mcparticle.pt(), v0.mK0Short()); - isCountedMCPhi.at(0) = true; - } - if (std::abs(v0mcparticle.y() - mcParticle.y()) > cfgFCutOnDeltaY) - continue; - if (!isCountedMCPhi.at(1)) { - mcPhiK0SHist.fill(HIST("h3RecMCPhiK0SFCut"), genmultiplicity, v0mcparticle.pt(), v0.mK0Short()); - isCountedMCPhi.at(1) = true; - } - if (std::abs(v0mcparticle.y() - mcParticle.y()) > cfgSCutOnDeltaY) - continue; - if (!isCountedMCPhi.at(2)) { - mcPhiK0SHist.fill(HIST("h3RecMCPhiK0SSCut"), genmultiplicity, v0mcparticle.pt(), v0.mK0Short()); - isCountedMCPhi.at(2) = true; + counts.at(0)++; + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + if (std::abs(v0mcparticle.y() - mcParticle.y()) > cfgDeltaYAcceptanceBins->at(i)) + continue; + counts.at(i + 1)++; } } + + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size() + 1; i++) { + if (counts.at(i) > 0) + mcPhiK0SHist.fill(HIST("h4PhiK0SMCReco"), i, genmultiplicity, v0mcparticle.pt(), v0.mK0Short()); + } } } } @@ -1445,7 +1455,7 @@ struct Phik0shortanalysis { continue; auto mcTrack = track.mcParticle_as(); - if (std::abs(mcTrack.pdgCode()) != 211) + if (std::abs(mcTrack.pdgCode()) != PDG_t::kPiPlus) continue; if (std::abs(mcTrack.y()) > cfgYAcceptance) @@ -1465,68 +1475,58 @@ struct Phik0shortanalysis { mcPionHist.fill(HIST("h4PiRapiditySmearing"), genmultiplicity, track.pt(), track.rapidity(massPi), mcTrack.y()); - mcPionHist.fill(HIST("h3RecMCPiTPC"), genmultiplicity, mcTrack.pt(), track.tpcNSigmaPi()); + mcPionHist.fill(HIST("h3PiTPCMCReco"), genmultiplicity, mcTrack.pt(), track.tpcNSigmaPi()); - std::array isCountedMCPhi{false, false, false}; + std::vector countsTPC(cfgDeltaYAcceptanceBins->size() + 1, 0); for (const auto& mcParticle : mcParticlesThisColl) { - if (mcParticle.pdgCode() != 333) + if (mcParticle.pdgCode() != o2::constants::physics::Pdg::kPhi) continue; if (mcParticle.pt() < minPhiPt || mcParticle.pt() > maxPhiPt) continue; if (std::abs(mcParticle.y()) > cfgYAcceptance) continue; - if (!isCountedMCPhi.at(0)) { - mcPhiPionHist.fill(HIST("h3RecMCPhiPiTPCInc"), genmultiplicity, mcTrack.pt(), track.tpcNSigmaPi()); - isCountedMCPhi.at(0) = true; - } - if (std::abs(mcTrack.y() - mcParticle.y()) > cfgFCutOnDeltaY) - continue; - if (!isCountedMCPhi.at(1)) { - mcPhiPionHist.fill(HIST("h3RecMCPhiPiTPCFCut"), genmultiplicity, mcTrack.pt(), track.tpcNSigmaPi()); - isCountedMCPhi.at(1) = true; - } - if (std::abs(mcTrack.y() - mcParticle.y()) > cfgSCutOnDeltaY) - continue; - if (!isCountedMCPhi.at(2)) { - mcPhiPionHist.fill(HIST("h3RecMCPhiPiTPCSCut"), genmultiplicity, mcTrack.pt(), track.tpcNSigmaPi()); - isCountedMCPhi.at(2) = true; + countsTPC.at(0)++; + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + if (std::abs(mcTrack.y() - mcParticle.y()) > cfgDeltaYAcceptanceBins->at(i)) + continue; + countsTPC.at(i + 1)++; } } + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size() + 1; i++) { + if (countsTPC.at(i) > 0) + mcPhiPionHist.fill(HIST("h4PhiPiTPCMCReco"), i, genmultiplicity, mcTrack.pt(), track.tpcNSigmaPi()); + } + if (track.pt() >= 0.5 && !track.hasTOF()) continue; - mcPionHist.fill(HIST("h4RecMCPiTPCTOF"), genmultiplicity, mcTrack.pt(), track.tpcNSigmaPi(), track.tofNSigmaPi()); + mcPionHist.fill(HIST("h4PiTPCTOFMCReco"), genmultiplicity, mcTrack.pt(), track.tpcNSigmaPi(), track.tofNSigmaPi()); - isCountedMCPhi = {false, false, false}; + std::vector countsTPCTOF(cfgDeltaYAcceptanceBins->size() + 1, 0); for (const auto& mcParticle : mcParticlesThisColl) { - if (mcParticle.pdgCode() != 333) + if (mcParticle.pdgCode() != o2::constants::physics::Pdg::kPhi) continue; if (mcParticle.pt() < minPhiPt || mcParticle.pt() > maxPhiPt) continue; if (std::abs(mcParticle.y()) > cfgYAcceptance) continue; - if (!isCountedMCPhi.at(0)) { - mcPhiPionHist.fill(HIST("h4RecMCPhiPiTPCTOFInc"), genmultiplicity, mcTrack.pt(), track.tpcNSigmaPi(), track.tofNSigmaPi()); - isCountedMCPhi.at(0) = true; - } - if (std::abs(mcTrack.y() - mcParticle.y()) > cfgFCutOnDeltaY) - continue; - if (!isCountedMCPhi.at(1)) { - mcPhiPionHist.fill(HIST("h4RecMCPhiPiTPCTOFFCut"), genmultiplicity, mcTrack.pt(), track.tpcNSigmaPi(), track.tofNSigmaPi()); - isCountedMCPhi.at(1) = true; - } - if (std::abs(mcTrack.y() - mcParticle.y()) > cfgSCutOnDeltaY) - continue; - if (!isCountedMCPhi.at(2)) { - mcPhiPionHist.fill(HIST("h4RecMCPhiPiTPCTOFSCut"), genmultiplicity, mcTrack.pt(), track.tpcNSigmaPi(), track.tofNSigmaPi()); - isCountedMCPhi.at(2) = true; + countsTPCTOF.at(0)++; + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + if (std::abs(mcTrack.y() - mcParticle.y()) > cfgDeltaYAcceptanceBins->at(i)) + continue; + countsTPCTOF.at(i + 1)++; } } + + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size() + 1; i++) { + if (countsTPCTOF.at(i) > 0) + mcPhiPionHist.fill(HIST("h5PhiPiTPCTOFMCReco"), i, genmultiplicity, mcTrack.pt(), track.tpcNSigmaPi(), track.tofNSigmaPi()); + } } } } @@ -1585,9 +1585,9 @@ struct Phik0shortanalysis { if (fillMethodSingleWeight) weight *= (1 - getPhiPurity(genmultiplicity, recPhi)); - closureMCPhiHist.fill(HIST("h3MCPhipurInvMass"), genmultiplicity, recPhi.Pt(), recPhi.M()); + closureMCPhiHist.fill(HIST("h3PhipurMCClosure"), genmultiplicity, recPhi.Pt(), recPhi.M()); - std::array isCountedK0S{false, false, false}; + std::vector countsK0S(cfgDeltaYAcceptanceBins->size() + 1, 0); // V0 already reconstructed by the builder for (const auto& v0 : V0s) { @@ -1595,7 +1595,7 @@ struct Phik0shortanalysis { if (!v0.has_mcParticle()) continue; auto v0mcparticle = v0.mcParticle(); - if (v0mcparticle.pdgCode() != 310 || !v0mcparticle.isPhysicalPrimary()) + if (v0mcparticle.pdgCode() != PDG_t::kK0Short || !v0mcparticle.isPhysicalPrimary()) continue; } @@ -1610,25 +1610,20 @@ struct Phik0shortanalysis { if (std::abs(v0.yK0Short()) > cfgYAcceptance) continue; - if (!isCountedK0S.at(0)) { - closureMCPhiHist.fill(HIST("h3MCPhipurK0SInvMassInc"), genmultiplicity, recPhi.Pt(), recPhi.M()); - isCountedK0S.at(0) = true; - } - if (std::abs(v0.yK0Short() - recPhi.Rapidity()) > cfgFCutOnDeltaY) - continue; - if (!isCountedK0S.at(1)) { - closureMCPhiHist.fill(HIST("h3MCPhipurK0SInvMassFCut"), genmultiplicity, recPhi.Pt(), recPhi.M()); - isCountedK0S.at(1) = true; - } - if (std::abs(v0.yK0Short() - recPhi.Rapidity()) > cfgSCutOnDeltaY) - continue; - if (!isCountedK0S.at(2)) { - closureMCPhiHist.fill(HIST("h3MCPhipurK0SInvMassSCut"), genmultiplicity, recPhi.Pt(), recPhi.M()); - isCountedK0S.at(2) = true; + countsK0S.at(0)++; + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + if (std::abs(v0.yK0Short() - recPhi.Rapidity()) > cfgDeltaYAcceptanceBins->at(i)) + continue; + countsK0S.at(i + 1)++; } } - std::array isCountedPi{false, false, false}; + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size() + 1; i++) { + if (countsK0S.at(i) > 0) + closureMCPhiHist.fill(HIST("h4PhipurK0SInvMass"), i, genmultiplicity, recPhi.Pt(), recPhi.M()); + } + + std::vector countsPi(cfgDeltaYAcceptanceBins->size() + 1, 0); // Loop over all primary pion candidates for (const auto& track : fullMCTracks) { @@ -1636,7 +1631,7 @@ struct Phik0shortanalysis { if (!track.has_mcParticle()) continue; auto mcTrack = track.mcParticle_as(); - if (std::abs(mcTrack.pdgCode()) != 211 || !mcTrack.isPhysicalPrimary()) + if (std::abs(mcTrack.pdgCode()) != PDG_t::kPiPlus || !mcTrack.isPhysicalPrimary()) continue; } @@ -1646,23 +1641,18 @@ struct Phik0shortanalysis { if (std::abs(track.rapidity(massPi)) > cfgYAcceptance) continue; - if (!isCountedPi.at(0)) { - closureMCPhiHist.fill(HIST("h3MCPhipurPiInvMassInc"), genmultiplicity, recPhi.Pt(), recPhi.M()); - isCountedPi.at(0) = true; - } - if (std::abs(track.rapidity(massPi) - recPhi.Rapidity()) > cfgFCutOnDeltaY) - continue; - if (!isCountedPi.at(1)) { - closureMCPhiHist.fill(HIST("h3MCPhipurPiInvMassFCut"), genmultiplicity, recPhi.Pt(), recPhi.M()); - isCountedPi.at(1) = true; - } - if (std::abs(track.rapidity(massPi) - recPhi.Rapidity()) > cfgSCutOnDeltaY) - continue; - if (!isCountedPi.at(2)) { - closureMCPhiHist.fill(HIST("h3MCPhipurPiInvMassSCut"), genmultiplicity, recPhi.Pt(), recPhi.M()); - isCountedPi.at(2) = true; + countsPi.at(0)++; + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + if (std::abs(track.rapidity(massPi) - recPhi.Rapidity()) > cfgDeltaYAcceptanceBins->at(i)) + continue; + countsPi.at(i + 1)++; } } + + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size() + 1; i++) { + if (countsPi.at(i) > 0) + closureMCPhiHist.fill(HIST("h4PhipurPiInvMass"), i, genmultiplicity, recPhi.Pt(), recPhi.M()); + } } } @@ -1693,7 +1683,7 @@ struct Phik0shortanalysis { if (!v0.has_mcParticle()) continue; auto v0mcparticle = v0.mcParticle(); - if (v0mcparticle.pdgCode() != 310 || !v0mcparticle.isPhysicalPrimary()) + if (v0mcparticle.pdgCode() != PDG_t::kK0Short || !v0mcparticle.isPhysicalPrimary()) continue; } @@ -1709,8 +1699,8 @@ struct Phik0shortanalysis { continue; std::vector listrecPhi; - std::array counts{}; - std::array weights{1, 1, 1}; + std::vector counts(cfgDeltaYAcceptanceBins->size() + 1, 0); + std::vector weights(cfgDeltaYAcceptanceBins->size() + 1, 1); // Phi reconstruction for (const auto& track1 : posThisColl) { // loop over all selected tracks @@ -1731,13 +1721,13 @@ struct Phik0shortanalysis { if (!track1.has_mcParticle()) continue; auto mcTrack1 = track1.mcParticle_as(); - if (mcTrack1.pdgCode() != 321 || !mcTrack1.isPhysicalPrimary()) + if (mcTrack1.pdgCode() != PDG_t::kKPlus || !mcTrack1.isPhysicalPrimary()) continue; if (!track2.has_mcParticle()) continue; auto mcTrack2 = track2.mcParticle_as(); - if (mcTrack2.pdgCode() != -321 || !mcTrack2.isPhysicalPrimary()) + if (mcTrack2.pdgCode() != PDG_t::kKMinus || !mcTrack2.isPhysicalPrimary()) continue; bool isMCMotherPhi = false; @@ -1747,7 +1737,7 @@ struct Phik0shortanalysis { continue; if (motherOfMcTrack1.globalIndex() != motherOfMcTrack2.globalIndex()) continue; - if (motherOfMcTrack1.pdgCode() != 333) + if (motherOfMcTrack1.pdgCode() != o2::constants::physics::Pdg::kPhi) continue; isMCMotherPhi = true; } @@ -1773,24 +1763,22 @@ struct Phik0shortanalysis { counts.at(0)++; weights.at(0) *= (1 - phiPurity); - if (std::abs(v0.yK0Short() - recPhi.Rapidity()) > cfgFCutOnDeltaY) - continue; - counts.at(1)++; - weights.at(1) *= (1 - phiPurity); - if (std::abs(v0.yK0Short() - recPhi.Rapidity()) > cfgSCutOnDeltaY) - continue; - counts.at(2)++; - weights.at(2) *= (1 - phiPurity); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + if (std::abs(v0.yK0Short() - recPhi.Rapidity()) > cfgDeltaYAcceptanceBins->at(i)) + continue; + counts.at(i + 1)++; + weights.at(i + 1) *= (1 - phiPurity); + } } } if (fillMethodMultipleWeights) { - for (unsigned int i = 0; i < counts.size(); i++) { + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size() + 1; i++) { weights.at(i) = (counts.at(i) > 0 ? 1. / static_cast(counts.at(i)) : 0); } fillInvMass2D(v0, listrecPhi, genmultiplicity, weights); } else if (fillMethodSingleWeight) { - for (unsigned int i = 0; i < counts.size(); i++) { + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size() + 1; i++) { weights.at(i) = (counts.at(i) > 0 ? 1 - weights.at(i) : 0); } fillInvMass(v0, genmultiplicity, weights); @@ -1821,7 +1809,7 @@ struct Phik0shortanalysis { if (!track.has_mcParticle()) continue; auto mcTrack = track.mcParticle_as(); - if (std::abs(mcTrack.pdgCode()) != 211 || !mcTrack.isPhysicalPrimary()) + if (std::abs(mcTrack.pdgCode()) != PDG_t::kPiPlus || !mcTrack.isPhysicalPrimary()) continue; } @@ -1833,8 +1821,8 @@ struct Phik0shortanalysis { continue; std::vector listrecPhi; - std::array counts{}; - std::array weights{1, 1, 1}; + std::vector counts(cfgDeltaYAcceptanceBins->size() + 1, 0); + std::vector weights(cfgDeltaYAcceptanceBins->size() + 1, 1); // Phi reconstruction for (const auto& track1 : posThisColl) { // loop over all selected tracks @@ -1855,13 +1843,13 @@ struct Phik0shortanalysis { if (!track1.has_mcParticle()) continue; auto mcTrack1 = track1.mcParticle_as(); - if (mcTrack1.pdgCode() != 321 || !mcTrack1.isPhysicalPrimary()) + if (mcTrack1.pdgCode() != PDG_t::kKPlus || !mcTrack1.isPhysicalPrimary()) continue; if (!track2.has_mcParticle()) continue; auto mcTrack2 = track2.mcParticle_as(); - if (mcTrack2.pdgCode() != -321 || !mcTrack2.isPhysicalPrimary()) + if (mcTrack2.pdgCode() != PDG_t::kKMinus || !mcTrack2.isPhysicalPrimary()) continue; bool isMCMotherPhi = false; @@ -1871,7 +1859,7 @@ struct Phik0shortanalysis { continue; if (motherOfMcTrack1.globalIndex() != motherOfMcTrack2.globalIndex()) continue; - if (motherOfMcTrack1.pdgCode() != 333) + if (motherOfMcTrack1.pdgCode() != o2::constants::physics::Pdg::kPhi) continue; isMCMotherPhi = true; } @@ -1897,24 +1885,22 @@ struct Phik0shortanalysis { counts.at(0)++; weights.at(0) *= (1 - phiPurity); - if (std::abs(track.rapidity(massPi) - recPhi.Rapidity()) > cfgFCutOnDeltaY) - continue; - counts.at(1)++; - weights.at(1) *= (1 - phiPurity); - if (std::abs(track.rapidity(massPi) - recPhi.Rapidity()) > cfgSCutOnDeltaY) - continue; - counts.at(2)++; - weights.at(2) *= (1 - phiPurity); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + if (std::abs(track.rapidity(massPi) - recPhi.Rapidity()) > cfgDeltaYAcceptanceBins->at(i)) + continue; + counts.at(i + 1)++; + weights.at(i + 1) *= (1 - phiPurity); + } } } if (fillMethodMultipleWeights) { - for (unsigned int i = 0; i < counts.size(); i++) { + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size() + 1; i++) { weights.at(i) = (counts.at(i) > 0 ? 1. / static_cast(counts.at(i)) : 0); } fillInvMassNSigma(track, listrecPhi, genmultiplicity, weights); } else if (fillMethodSingleWeight) { - for (unsigned int i = 0; i < counts.size(); i++) { + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size() + 1; i++) { weights.at(i) = (counts.at(i) > 0 ? 1 - weights.at(i) : 0); } fillNSigma(track, genmultiplicity, weights); @@ -1949,16 +1935,16 @@ struct Phik0shortanalysis { bool isCountedPhi = false; for (const auto& mcParticle1 : mcParticles) { - if (mcParticle1.pdgCode() != 333) + if (mcParticle1.pdgCode() != o2::constants::physics::Pdg::kPhi) continue; auto kDaughters = mcParticle1.daughters_as(); if (kDaughters.size() != 2) continue; bool isPosKaon = false, isNegKaon = false; for (const auto& kDaughter : kDaughters) { - if (kDaughter.pdgCode() == 321) + if (kDaughter.pdgCode() == PDG_t::kKPlus) isPosKaon = true; - if (kDaughter.pdgCode() == -321) + if (kDaughter.pdgCode() == PDG_t::kKMinus) isNegKaon = true; } if (!isPosKaon || !isNegKaon) @@ -1980,7 +1966,7 @@ struct Phik0shortanalysis { std::array isCountedK0S = {false, false, false}; for (const auto& mcParticle2 : mcParticles) { - if (mcParticle2.pdgCode() != 310) + if (mcParticle2.pdgCode() != PDG_t::kK0Short) continue; if (!mcParticle2.isPhysicalPrimary()) continue; @@ -2014,7 +2000,7 @@ struct Phik0shortanalysis { std::array isCountedPi = {false, false, false}; for (const auto& mcParticle2 : mcParticles) { - if (std::abs(mcParticle2.pdgCode()) != 211) + if (std::abs(mcParticle2.pdgCode()) != PDG_t::kPiPlus) continue; if (!mcParticle2.isPhysicalPrimary()) continue; @@ -2068,7 +2054,7 @@ struct Phik0shortanalysis { mcEventHist.fill(HIST("hGenMCMultiplicityPercent"), genmultiplicity); for (const auto& mcParticle1 : mcParticles) { - if (mcParticle1.pdgCode() != 310) + if (mcParticle1.pdgCode() != PDG_t::kK0Short) continue; if (!mcParticle1.isPhysicalPrimary() || mcParticle1.pt() < v0Configs.v0SettingMinPt) continue; @@ -2078,14 +2064,14 @@ struct Phik0shortanalysis { if (std::abs(mcParticle1.y()) > cfgYAcceptance) continue; - mcK0SHist.fill(HIST("h2K0SGenMC"), genmultiplicity, mcParticle1.pt()); + mcK0SHist.fill(HIST("h2K0SMCGen"), genmultiplicity, mcParticle1.pt()); if (isAssocColl) - mcK0SHist.fill(HIST("h2K0SGenMCAssocReco"), genmultiplicity, mcParticle1.pt()); + mcK0SHist.fill(HIST("h2K0SMCGenAssocReco"), genmultiplicity, mcParticle1.pt()); - std::array isCountedPhi = {false, false, false}; + std::vector counts(cfgDeltaYAcceptanceBins->size() + 1, 0); for (const auto& mcParticle2 : mcParticles) { - if (mcParticle2.pdgCode() != 333) + if (mcParticle2.pdgCode() != o2::constants::physics::Pdg::kPhi) continue; if (cfgisGenMCForClosure) { auto kDaughters = mcParticle2.daughters_as(); @@ -2093,9 +2079,9 @@ struct Phik0shortanalysis { continue; bool isPosKaon = false, isNegKaon = false; for (const auto& kDaughter : kDaughters) { - if (kDaughter.pdgCode() == 321) + if (kDaughter.pdgCode() == PDG_t::kKPlus) isPosKaon = true; - if (kDaughter.pdgCode() == -321) + if (kDaughter.pdgCode() == PDG_t::kKMinus) isNegKaon = true; } if (!isPosKaon || !isNegKaon) @@ -2103,30 +2089,22 @@ struct Phik0shortanalysis { } if (mcParticle2.pt() < minPhiPt || mcParticle2.pt() > maxPhiPt) continue; - if (std::abs(mcParticle2.y()) > cfgYAcceptance) continue; - if (!isCountedPhi.at(0)) { - mcPhiK0SHist.fill(HIST("h2PhiK0SGenMCInc"), genmultiplicity, mcParticle1.pt()); - if (isAssocColl) - mcPhiK0SHist.fill(HIST("h2PhiK0SGenMCIncAssocReco"), genmultiplicity, mcParticle1.pt()); - isCountedPhi.at(0) = true; - } - if (std::abs(mcParticle1.y() - mcParticle2.y()) > cfgFCutOnDeltaY) - continue; - if (!isCountedPhi.at(1)) { - mcPhiK0SHist.fill(HIST("h2PhiK0SGenMCFCut"), genmultiplicity, mcParticle1.pt()); - if (isAssocColl) - mcPhiK0SHist.fill(HIST("h2PhiK0SGenMCFCutAssocReco"), genmultiplicity, mcParticle1.pt()); - isCountedPhi.at(1) = true; + + counts.at(0)++; + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + if (std::abs(mcParticle1.y() - mcParticle2.y()) > cfgDeltaYAcceptanceBins->at(i)) + continue; + counts.at(i + 1)++; } - if (std::abs(mcParticle1.y() - mcParticle2.y()) > cfgSCutOnDeltaY) - continue; - if (!isCountedPhi.at(2)) { - mcPhiK0SHist.fill(HIST("h2PhiK0SGenMCSCut"), genmultiplicity, mcParticle1.pt()); + } + + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size() + 1; i++) { + if (counts.at(i) > 0) { + mcPhiK0SHist.fill(HIST("h3PhiK0SMCGen"), i, genmultiplicity, mcParticle1.pt()); if (isAssocColl) - mcPhiK0SHist.fill(HIST("h2PhiK0SGenMCSCutAssocReco"), genmultiplicity, mcParticle1.pt()); - isCountedPhi.at(2) = true; + mcPhiK0SHist.fill(HIST("h3PhiK0SMCGenAssocReco"), i, genmultiplicity, mcParticle1.pt()); } } } @@ -2153,7 +2131,7 @@ struct Phik0shortanalysis { mcEventHist.fill(HIST("hGenMCMultiplicityPercent"), genmultiplicity); for (const auto& mcParticle1 : mcParticles) { - if (std::abs(mcParticle1.pdgCode()) != 211) + if (std::abs(mcParticle1.pdgCode()) != PDG_t::kPiPlus) continue; if (!mcParticle1.isPhysicalPrimary() || mcParticle1.pt() < trackConfigs.cMinPionPtcut) continue; @@ -2163,14 +2141,14 @@ struct Phik0shortanalysis { if (std::abs(mcParticle1.y()) > cfgYAcceptance) continue; - mcPionHist.fill(HIST("h2PiGenMC"), genmultiplicity, mcParticle1.pt()); + mcPionHist.fill(HIST("h2PiMCGen"), genmultiplicity, mcParticle1.pt()); if (isAssocColl) - mcPionHist.fill(HIST("h2PiGenMCAssocReco"), genmultiplicity, mcParticle1.pt()); + mcPionHist.fill(HIST("h2PiMCGenAssocReco"), genmultiplicity, mcParticle1.pt()); - std::array isCountedPhi = {false, false, false}; + std::vector counts(cfgDeltaYAcceptanceBins->size() + 1, 0); for (const auto& mcParticle2 : mcParticles) { - if (mcParticle2.pdgCode() != 333) + if (mcParticle2.pdgCode() != o2::constants::physics::Pdg::kPhi) continue; if (cfgisGenMCForClosure) { auto kDaughters = mcParticle2.daughters_as(); @@ -2178,9 +2156,9 @@ struct Phik0shortanalysis { continue; bool isPosKaon = false, isNegKaon = false; for (const auto& kDaughter : kDaughters) { - if (kDaughter.pdgCode() == 321) + if (kDaughter.pdgCode() == PDG_t::kKPlus) isPosKaon = true; - if (kDaughter.pdgCode() == -321) + if (kDaughter.pdgCode() == PDG_t::kKMinus) isNegKaon = true; } if (!isPosKaon || !isNegKaon) @@ -2188,30 +2166,22 @@ struct Phik0shortanalysis { } if (mcParticle2.pt() < minPhiPt || mcParticle2.pt() > maxPhiPt) continue; - if (std::abs(mcParticle2.y()) > cfgYAcceptance) continue; - if (!isCountedPhi.at(0)) { - mcPhiPionHist.fill(HIST("h2PhiPiGenMCInc"), genmultiplicity, mcParticle1.pt()); - if (isAssocColl) - mcPhiPionHist.fill(HIST("h2PhiPiGenMCIncAssocReco"), genmultiplicity, mcParticle1.pt()); - isCountedPhi.at(0) = true; - } - if (std::abs(mcParticle1.y() - mcParticle2.y()) > cfgFCutOnDeltaY) - continue; - if (!isCountedPhi.at(1)) { - mcPhiPionHist.fill(HIST("h2PhiPiGenMCFCut"), genmultiplicity, mcParticle1.pt()); - if (isAssocColl) - mcPhiPionHist.fill(HIST("h2PhiPiGenMCFCutAssocReco"), genmultiplicity, mcParticle1.pt()); - isCountedPhi.at(1) = true; + + counts.at(0)++; + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + if (std::abs(mcParticle1.y() - mcParticle2.y()) > cfgDeltaYAcceptanceBins->at(i)) + continue; + counts.at(i + 1)++; } - if (std::abs(mcParticle1.y() - mcParticle2.y()) > cfgSCutOnDeltaY) - continue; - if (!isCountedPhi.at(2)) { - mcPhiPionHist.fill(HIST("h2PhiPiGenMCSCut"), genmultiplicity, mcParticle1.pt()); + } + + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size() + 1; i++) { + if (counts.at(i) > 0) { + mcPhiPionHist.fill(HIST("h3PhiPiMCGen"), i, genmultiplicity, mcParticle1.pt()); if (isAssocColl) - mcPhiPionHist.fill(HIST("h2PhiPiGenMCSCutAssocReco"), genmultiplicity, mcParticle1.pt()); - isCountedPhi.at(2) = true; + mcPhiPionHist.fill(HIST("h3PhiPiMCGenAssocReco"), i, genmultiplicity, mcParticle1.pt()); } } } From 4e545edeb2d4655781f171fe769db95ef6cac9a0 Mon Sep 17 00:00:00 2001 From: altsybee Date: Sat, 15 Mar 2025 13:36:52 +0100 Subject: [PATCH 0699/1650] [DPG] Update timeDependentQa.cxx - add RCT flags vs time monitoring (#10509) --- DPG/Tasks/AOTEvent/timeDependentQa.cxx | 116 ++++++++++++++++++------- 1 file changed, 86 insertions(+), 30 deletions(-) diff --git a/DPG/Tasks/AOTEvent/timeDependentQa.cxx b/DPG/Tasks/AOTEvent/timeDependentQa.cxx index cfd0535922c..f1b8f6141bd 100644 --- a/DPG/Tasks/AOTEvent/timeDependentQa.cxx +++ b/DPG/Tasks/AOTEvent/timeDependentQa.cxx @@ -27,17 +27,18 @@ #include "Common/CCDB/EventSelectionParams.h" #include "Common/DataModel/TrackSelectionTables.h" #include "Common/CCDB/ctpRateFetcher.h" +#include "Common/DataModel/Multiplicity.h" #include "TPCCalibration/TPCMShapeCorrection.h" #include "DataFormatsParameters/AggregatedRunInfo.h" #include "DataFormatsITSMFT/ROFRecord.h" #include "ReconstructionDataFormats/Vertex.h" -#include "Common/DataModel/Multiplicity.h" #include "TTree.h" using namespace o2; using namespace o2::framework; using namespace o2::aod::evsel; +using namespace o2::aod::rctsel; using ColEvSels = soa::Join; using BCsRun3 = soa::Join; @@ -58,7 +59,7 @@ struct TimeDependentQaTask { Configurable confCutOnNtpcClsForSharedFractAndDeDxCalc{"CutOnNtpcClsForSharedFractAndDeDxCalc", 70, ""}; // o2-linter: disable=name/configurable (temporary fix) enum EvSelBitsToMonitor { - enCollisionsAll, + enCollisionsAll = 0, enIsTriggerTVX, enNoTimeFrameBorder, enNoITSROFrameBorder, @@ -86,6 +87,16 @@ struct TimeDependentQaTask { enNumEvSelBits, // counter }; + enum RctCombFlagsToMonitor { + enCBT = kNRCTSelectionFlags, + enCBT_hadronPID, + enCBT_electronPID, + enCBT_calo, + enCBT_muon, + enCBT_muon_glo, + enNumRctFlagsTotal, // counter + }; + Service ccdb; HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; o2::tpc::TPCMShapeCorrection mshape; // object for simple access @@ -97,6 +108,16 @@ struct TimeDependentQaTask { int64_t nBCsPerTF = -1; // duration of TF in bcs ctpRateFetcher mRateFetcher; + // RCT flag combinations: checkers (based on presentation https://indico.cern.ch/event/1513866/#18-how-to-use-the-rct-flags-at) + RCTFlagsChecker rctCheckerCBT{"CBT"}; // o2-linter: disable=name/function-variable (temporary fix) + RCTFlagsChecker rctCheckerCBT_hadronPID{"CBT_hadronPID"}; // o2-linter: disable=name/function-variable (temporary fix) + RCTFlagsChecker rctCheckerCBT_electronPID{"CBT_electronPID"}; // o2-linter: disable=name/function-variable (temporary fix) + RCTFlagsChecker rctCheckerCBT_calo{"CBT_calo"}; // o2-linter: disable=name/function-variable (temporary fix) + RCTFlagsChecker rctCheckerCBT_muon{"CBT_muon"}; // o2-linter: disable=name/function-variable (temporary fix) + RCTFlagsChecker rctCheckerCBT_muon_glo{"CBT_muon_glo"}; // o2-linter: disable=name/function-variable (temporary fix) + + TAxis* axRctFlags; + void init(InitContext&) { ccdb->setURL("http://alice-ccdb.cern.ch"); @@ -122,10 +143,6 @@ struct TimeDependentQaTask { histos.add("C/global/hDcaZafterCuts", "", kTH1F, {axisDcaZ}); histos.add("C/globalPV/hDcaRafterCuts", "", kTH1F, {axisDcaR}); histos.add("C/globalPV/hDcaZafterCuts", "", kTH1F, {axisDcaZ}); - - const AxisSpec axisBCinTF{150000, 0, 150000, "bc in TF"}; - histos.add("hNcolVsBcInTF", ";bc in TF; n collisions", kTH1F, {axisBCinTF}); - histos.add("hNcolVsBcInTFantiBorderCut", ";bc in TF; n collisions", kTH1F, {axisBCinTF}); } void processRun3( @@ -160,13 +177,12 @@ struct TimeDependentQaTask { const AxisSpec axisSeconds{nTimeBins, 0, timeInterval, "seconds"}; histos.add("hSecondsBCsTVX", "", kTH1D, {axisSeconds}); - // histos.add("hSecondsBCsTFborder", "", kTH1D, {axisSeconds}); - histos.add("hSecondsBCsTVXandTFborder", "", kTH1D, {axisSeconds}); + histos.add("hSecondsBCsTVXandTFborderCuts", "", kTH1D, {axisSeconds}); histos.add("hSecondsCollisionsBeforeAllCuts", "", kTH1D, {axisSeconds}); - histos.add("hSecondsCollisionsNoVzInTVX", "", kTH1D, {axisSeconds}); - histos.add("hSecondsCollisionsNoVzNoTFborder", "", kTH1D, {axisSeconds}); - histos.add("hSecondsCollisionsNoVzInTVXandNoTFborder", "", kTH1D, {axisSeconds}); + histos.add("hSecondsCollisionsTVXNoVzCut", "", kTH1D, {axisSeconds}); + histos.add("hSecondsCollisionsTFborderCutNoVzCut", "", kTH1D, {axisSeconds}); + histos.add("hSecondsCollisionsTVXTFborderCutNoVzCut", "", kTH1D, {axisSeconds}); histos.add("hSecondsCollisions", "", kTH1D, {axisSeconds}); histos.add("hSecondsIR", "", kTH1D, {axisSeconds}); @@ -218,13 +234,48 @@ struct TimeDependentQaTask { axSelBits->SetBinLabel(1 + enIsLowOccupStdCut4000, "isLowOccupStdCut4000"); axSelBits->SetBinLabel(1 + enIsLowOccupStdAlsoInPrevRofCut2000noDeadStaves, "isLowOccupStdAlsoInPrevRofCut2000noDeadStaves"); + // ### QA RCT flags + int nRctFlagsTotal = enNumRctFlagsTotal; + histos.add("hSecondsRCTflags", "", kTH2F, {axisSeconds, {nRctFlagsTotal + 1, -0.5, nRctFlagsTotal + 1 - 0.5, "Monitoring of RCT flags"}}); + axRctFlags = reinterpret_cast(histos.get(HIST("hSecondsRCTflags"))->GetYaxis()); + axRctFlags->SetBinLabel(1, "NcollisionsSel8"); + axRctFlags->SetBinLabel(2 + kCPVBad, "CPVBad"); + axRctFlags->SetBinLabel(2 + kEMCBad, "EMCBad"); + axRctFlags->SetBinLabel(2 + kEMCLimAccMCRepr, "EMCLimAccMCRepr"); + axRctFlags->SetBinLabel(2 + kFDDBad, "FDDBad"); + axRctFlags->SetBinLabel(2 + kFT0Bad, "FT0Bad"); + axRctFlags->SetBinLabel(2 + kFV0Bad, "FV0Bad"); + axRctFlags->SetBinLabel(2 + kHMPBad, "HMPBad"); + axRctFlags->SetBinLabel(2 + kITSBad, "ITSBad"); + axRctFlags->SetBinLabel(2 + kITSLimAccMCRepr, "ITSLimAccMCRepr"); + axRctFlags->SetBinLabel(2 + kMCHBad, "MCHBad"); + axRctFlags->SetBinLabel(2 + kMCHLimAccMCRepr, "MCHLimAccMCRepr"); + axRctFlags->SetBinLabel(2 + kMFTBad, "MFTBad"); + axRctFlags->SetBinLabel(2 + kMFTLimAccMCRepr, "MFTLimAccMCRepr"); + axRctFlags->SetBinLabel(2 + kMIDBad, "MIDBad"); + axRctFlags->SetBinLabel(2 + kMIDLimAccMCRepr, "MIDLimAccMCRepr"); + axRctFlags->SetBinLabel(2 + kPHSBad, "PHSBad"); + axRctFlags->SetBinLabel(2 + kTOFBad, "TOFBad"); + axRctFlags->SetBinLabel(2 + kTOFLimAccMCRepr, "TOFLimAccMCRepr"); + axRctFlags->SetBinLabel(2 + kTPCBadTracking, "TPCBadTracking"); + axRctFlags->SetBinLabel(2 + kTPCBadPID, "TPCBadPID"); + axRctFlags->SetBinLabel(2 + kTPCLimAccMCRepr, "TPCLimAccMCRepr"); + axRctFlags->SetBinLabel(2 + kTRDBad, "TRDBad"); + axRctFlags->SetBinLabel(2 + kZDCBad, "ZDCBad"); + // combined flags + axRctFlags->SetBinLabel(2 + enCBT, "CBT"); + axRctFlags->SetBinLabel(2 + enCBT_hadronPID, "CBT_hadronPID"); + axRctFlags->SetBinLabel(2 + enCBT_electronPID, "CBT_electronPID"); + axRctFlags->SetBinLabel(2 + enCBT_calo, "CBT_calo"); + axRctFlags->SetBinLabel(2 + enCBT_muon, "CBT_muon"); + axRctFlags->SetBinLabel(2 + enCBT_muon_glo, "CBT_muon_glo"); + + // QA for all tracks // const AxisSpec axisChi2ITS{40, 0., 20., "chi2/ndof"}; // const AxisSpec axisChi2TPC{40, 0., 20., "chi2/ndof"}; const AxisSpec axisNclsITS{5, 3.5, 8.5, "n ITS cls"}; const AxisSpec axisNclsTPC{40, -0.5, 159.5, "n TPC cls"}; const AxisSpec axisFraction{20, 0, 1., "Fraction shared cls Tpc"}; - - // QA for all tracks histos.add("allTracks/hSecondsTracks", "", kTH1D, {axisSeconds}); histos.add("allTracks/hSecondsQoverPtSumDcaR", "", kTH2D, {axisSeconds, axisSparseQoverPt}); histos.add("allTracks/hSecondsQoverPtSumDcaZ", "", kTH2D, {axisSeconds, axisSparseQoverPt}); @@ -329,12 +380,9 @@ struct TimeDependentQaTask { double secFromSOR = ts / 1000. - minSec; if (bc.selection_bit(kIsTriggerTVX)) { histos.fill(HIST("hSecondsBCsTVX"), secFromSOR); - } - // if (bc.selection_bit(kNoTimeFrameBorder)) { - // histos.fill(HIST("hSecondsBCsTFborder"), secFromSOR); - // } - if (bc.selection_bit(kIsTriggerTVX) && bc.selection_bit(kNoTimeFrameBorder)) { - histos.fill(HIST("hSecondsBCsTVXandTFborder"), secFromSOR); + if (bc.selection_bit(kNoTimeFrameBorder)) { + histos.fill(HIST("hSecondsBCsTVXandTFborderCuts"), secFromSOR); + } } } @@ -358,11 +406,11 @@ struct TimeDependentQaTask { histos.fill(HIST("hSecondsCollisionsBeforeAllCuts"), secFromSOR); if (col.selection_bit(kIsTriggerTVX)) - histos.fill(HIST("hSecondsCollisionsNoVzInTVX"), secFromSOR); + histos.fill(HIST("hSecondsCollisionsTVXNoVzCut"), secFromSOR); if (col.selection_bit(kNoTimeFrameBorder)) - histos.fill(HIST("hSecondsCollisionsNoVzNoTFborder"), secFromSOR); + histos.fill(HIST("hSecondsCollisionsTFborderCutNoVzCut"), secFromSOR); if (col.selection_bit(kIsTriggerTVX) && col.selection_bit(kNoTimeFrameBorder)) - histos.fill(HIST("hSecondsCollisionsNoVzInTVXandNoTFborder"), secFromSOR); + histos.fill(HIST("hSecondsCollisionsTVXTFborderCutNoVzCut"), secFromSOR); if (std::fabs(col.posZ()) > 10) continue; @@ -374,14 +422,6 @@ struct TimeDependentQaTask { histos.fill(HIST("hSecondsEventSelBits"), secFromSOR, enNoTimeFrameBorder, col.selection_bit(kNoTimeFrameBorder)); histos.fill(HIST("hSecondsEventSelBits"), secFromSOR, enNoITSROFrameBorder, col.selection_bit(kNoITSROFrameBorder)); - // for QA: - uint64_t globalBC = bc.globalBC(); - int64_t bcInTF = (globalBC - bcSOR) % nBCsPerTF; - - histos.fill(HIST("hNcolVsBcInTF"), bcInTF); - if (!col.selection_bit(kNoTimeFrameBorder)) - histos.fill(HIST("hNcolVsBcInTFantiBorderCut"), bcInTF); - // sel8 selection: if (!col.sel8()) continue; @@ -434,6 +474,22 @@ struct TimeDependentQaTask { bool isLowOccupStdAlsoInPrevRofCut2000noDeadStaves = isLowOccupStdCut2000 && col.selection_bit(kNoHighMultCollInPrevRof) && col.selection_bit(kIsGoodITSLayersAll); histos.fill(HIST("hSecondsEventSelBits"), secFromSOR, enIsLowOccupStdAlsoInPrevRofCut2000noDeadStaves, isLowOccupStdAlsoInPrevRofCut2000noDeadStaves); + // check RCT flags + histos.fill(HIST("hSecondsRCTflags"), secFromSOR, 0); // n collisions sel8 + for (int iFlag = 0; iFlag < kNRCTSelectionFlags; iFlag++) { + histos.fill(HIST("hSecondsRCTflags"), secFromSOR, 1 + iFlag, col.rct_bit(iFlag)); + LOGP(debug, "i = {}, bitValue = {}, binLabel={}, binCenter={}", iFlag, col.rct_bit(iFlag), axRctFlags->GetBinLabel(2 + iFlag), axRctFlags->GetBinCenter(2 + iFlag)); + } + LOGP(debug, "CBT_hadronPID = {}, kFT0Bad = {}, kITSBad = {}, kTPCBadTracking = {}, kTPCBadPID = {}, kTOFBad = {}, 1 + enCBT_hadronPID = {}, binLabel={}, binCenter={}", rctCheckerCBT_hadronPID(col), + col.rct_bit(kFT0Bad), col.rct_bit(kITSBad), col.rct_bit(kTPCBadTracking), col.rct_bit(kTPCBadPID), col.rct_bit(kTOFBad), 1 + enCBT_hadronPID, axRctFlags->GetBinLabel(2 + enCBT_hadronPID), axRctFlags->GetBinCenter(2 + enCBT_hadronPID)); + histos.fill(HIST("hSecondsRCTflags"), secFromSOR, 1 + enCBT, rctCheckerCBT(col)); + histos.fill(HIST("hSecondsRCTflags"), secFromSOR, 1 + enCBT_hadronPID, rctCheckerCBT_hadronPID(col)); + histos.fill(HIST("hSecondsRCTflags"), secFromSOR, 1 + enCBT_electronPID, rctCheckerCBT_electronPID(col)); + histos.fill(HIST("hSecondsRCTflags"), secFromSOR, 1 + enCBT_calo, rctCheckerCBT_calo(col)); + histos.fill(HIST("hSecondsRCTflags"), secFromSOR, 1 + enCBT_muon, rctCheckerCBT_muon(col)); + histos.fill(HIST("hSecondsRCTflags"), secFromSOR, 1 + enCBT_muon_glo, rctCheckerCBT_muon_glo(col)); + + // check hadronic rate double hadronicRate = mRateFetcher.fetch(ccdb.service, ts, runNumber, "ZNC hadronic") * 1.e-3; // kHz histos.fill(HIST("hSecondsIR"), secFromSOR, hadronicRate); From 84b49c17fe78f05fb074abe0dfdfa6ddacf6be36 Mon Sep 17 00:00:00 2001 From: Ionut Cristian Arsene Date: Sat, 15 Mar 2025 14:46:48 +0100 Subject: [PATCH 0700/1650] [PWGDQ] Changes to MCProng/MCSignal and dq-effieciency for generator level signal counting (#10510) Co-authored-by: Ionut Cristian Arsene --- PWGDQ/Core/MCProng.cxx | 3 +- PWGDQ/Core/MCProng.h | 1 + PWGDQ/Core/MCSignal.h | 122 ++++++++++-------- PWGDQ/Core/MCSignalLibrary.cxx | 31 +++++ PWGDQ/DataModel/ReducedInfoTables.h | 1 + .../TableProducer/tableMakerMC_withAssoc.cxx | 38 ++++++ PWGDQ/Tasks/dqEfficiency_withAssoc.cxx | 63 ++++++++- 7 files changed, 198 insertions(+), 61 deletions(-) diff --git a/PWGDQ/Core/MCProng.cxx b/PWGDQ/Core/MCProng.cxx index ba09616cda0..cc3d3ee8b36 100644 --- a/PWGDQ/Core/MCProng.cxx +++ b/PWGDQ/Core/MCProng.cxx @@ -21,7 +21,8 @@ std::map MCProng::fgSourceNames = { {"kPhysicalPrimary", MCProng::kPhysicalPrimary}, {"kProducedInTransport", MCProng::kProducedInTransport}, {"kProducedByGenerator", MCProng::kProducedByGenerator}, - {"kFromBackgroundEvent", MCProng::kFromBackgroundEvent}}; + {"kFromBackgroundEvent", MCProng::kFromBackgroundEvent}, + {"kHEPMCFinalState", MCProng::kHEPMCFinalState}}; //________________________________________________________________________________________________________________ MCProng::MCProng() : fNGenerations(0), diff --git a/PWGDQ/Core/MCProng.h b/PWGDQ/Core/MCProng.h index 82ac6420434..b1935260433 100644 --- a/PWGDQ/Core/MCProng.h +++ b/PWGDQ/Core/MCProng.h @@ -72,6 +72,7 @@ class MCProng kProducedInTransport, // Produced during transport through the detector (e.g. GEANT) kProducedByGenerator, // Produced by generator (if not, then produced by GEANT) kFromBackgroundEvent, // Produced in the underlying event + kHEPMCFinalState, // HEPMC code 11 kNSources }; diff --git a/PWGDQ/Core/MCSignal.h b/PWGDQ/Core/MCSignal.h index d8f32091b8d..06404e88ed5 100644 --- a/PWGDQ/Core/MCSignal.h +++ b/PWGDQ/Core/MCSignal.h @@ -216,41 +216,50 @@ bool MCSignal::CheckProng(int i, bool checkSources, const T& track) currentMCParticle = track; for (int j = 0; j < fProngs[i].fNGenerations; j++) { // check whether sources are required for this generation - if (!fProngs[i].fSourceBits[j]) { - continue; + bool hasSources = false; + if (fProngs[i].fSourceBits[j]) { + hasSources = true; } // check each source uint64_t sourcesDecision = 0; - // Check kPhysicalPrimary - if (fProngs[i].fSourceBits[j] & (static_cast(1) << MCProng::kPhysicalPrimary)) { - if ((fProngs[i].fExcludeSource[j] & (static_cast(1) << MCProng::kPhysicalPrimary)) != currentMCParticle.isPhysicalPrimary()) { - sourcesDecision |= (static_cast(1) << MCProng::kPhysicalPrimary); + if (hasSources) { + // Check kPhysicalPrimary + if (fProngs[i].fSourceBits[j] & (static_cast(1) << MCProng::kPhysicalPrimary)) { + if ((fProngs[i].fExcludeSource[j] & (static_cast(1) << MCProng::kPhysicalPrimary)) != currentMCParticle.isPhysicalPrimary()) { + sourcesDecision |= (static_cast(1) << MCProng::kPhysicalPrimary); + } } - } - // Check kProducedInTransport - if (fProngs[i].fSourceBits[j] & (static_cast(1) << MCProng::kProducedInTransport)) { - if ((fProngs[i].fExcludeSource[j] & (static_cast(1) << MCProng::kProducedInTransport)) != (!currentMCParticle.producedByGenerator())) { - sourcesDecision |= (static_cast(1) << MCProng::kProducedInTransport); + // Check kProducedInTransport + if (fProngs[i].fSourceBits[j] & (static_cast(1) << MCProng::kProducedInTransport)) { + if ((fProngs[i].fExcludeSource[j] & (static_cast(1) << MCProng::kProducedInTransport)) != (!currentMCParticle.producedByGenerator())) { + sourcesDecision |= (static_cast(1) << MCProng::kProducedInTransport); + } } - } - // Check kProducedByGenerator - if (fProngs[i].fSourceBits[j] & (static_cast(1) << MCProng::kProducedByGenerator)) { - if ((fProngs[i].fExcludeSource[j] & (static_cast(1) << MCProng::kProducedByGenerator)) != currentMCParticle.producedByGenerator()) { - sourcesDecision |= (static_cast(1) << MCProng::kProducedByGenerator); + // Check kProducedByGenerator + if (fProngs[i].fSourceBits[j] & (static_cast(1) << MCProng::kProducedByGenerator)) { + if ((fProngs[i].fExcludeSource[j] & (static_cast(1) << MCProng::kProducedByGenerator)) != currentMCParticle.producedByGenerator()) { + sourcesDecision |= (static_cast(1) << MCProng::kProducedByGenerator); + } } - } - // Check kFromBackgroundEvent - if (fProngs[i].fSourceBits[j] & (static_cast(1) << MCProng::kFromBackgroundEvent)) { - if ((fProngs[i].fExcludeSource[j] & (static_cast(1) << MCProng::kFromBackgroundEvent)) != currentMCParticle.fromBackgroundEvent()) { - sourcesDecision |= (static_cast(1) << MCProng::kFromBackgroundEvent); + // Check kFromBackgroundEvent + if (fProngs[i].fSourceBits[j] & (static_cast(1) << MCProng::kFromBackgroundEvent)) { + if ((fProngs[i].fExcludeSource[j] & (static_cast(1) << MCProng::kFromBackgroundEvent)) != currentMCParticle.fromBackgroundEvent()) { + sourcesDecision |= (static_cast(1) << MCProng::kFromBackgroundEvent); + } } - } + // Check HEPMC code 11 (final state) + if (fProngs[i].fSourceBits[j] & (static_cast(1) << MCProng::kHEPMCFinalState)) { + if ((fProngs[i].fExcludeSource[j] & (static_cast(1) << MCProng::kHEPMCFinalState)) != (currentMCParticle.getHepMCStatusCode() == 11)) { + sourcesDecision |= (static_cast(1) << MCProng::kHEPMCFinalState); + } + } + } // end if(hasSources) // no source bit is fulfilled - if (!sourcesDecision) { + if (hasSources && !sourcesDecision) { return false; } // if fUseANDonSourceBitMap is on, request all bits - if (fProngs[i].fUseANDonSourceBitMap[j] && (sourcesDecision != fProngs[i].fSourceBits[j])) { + if (hasSources && (fProngs[i].fUseANDonSourceBitMap[j] && (sourcesDecision != fProngs[i].fSourceBits[j]))) { return false; } @@ -280,8 +289,8 @@ bool MCSignal::CheckProng(int i, bool checkSources, const T& track) } } } - } - } + } // end loop over generations + } // end if(checkSources) if (fProngs[i].fPDGInHistory.size() == 0) { return true; @@ -299,40 +308,41 @@ bool MCSignal::CheckProng(int i, bool checkSources, const T& track) // Note: Currently no need to check generation InTime, so disable if case and always check BackInTime (direction of mothers) // The option to check for daughter in decay chain is still implemented but commented out. - // if (!fProngs[i].fCheckGenerationsInTime) { // check generation back in time - while (currentMCParticle.has_mothers()) { - auto mother = currentMCParticle.template mothers_first_as

(); - if (!fProngs[i].fExcludePDGInHistory[k] && fProngs[i].ComparePDG(mother.pdgCode(), fProngs[i].fPDGInHistory[k], true, fProngs[i].fExcludePDGInHistory[k])) { - pdgInHistory.emplace_back(mother.pdgCode()); - break; + if (!fProngs[i].fCheckGenerationsInTime) { // check generation back in time + while (currentMCParticle.has_mothers()) { + auto mother = currentMCParticle.template mothers_first_as

(); + if (!fProngs[i].fExcludePDGInHistory[k] && fProngs[i].ComparePDG(mother.pdgCode(), fProngs[i].fPDGInHistory[k], true, fProngs[i].fExcludePDGInHistory[k])) { + pdgInHistory.emplace_back(mother.pdgCode()); + break; + } + if (fProngs[i].fExcludePDGInHistory[k] && !fProngs[i].ComparePDG(mother.pdgCode(), fProngs[i].fPDGInHistory[k], true, fProngs[i].fExcludePDGInHistory[k])) { + return false; + } + ith++; + currentMCParticle = mother; + if (ith > 10) { // need error message. Given pdg code was not found within 10 generations of the particles decay chain. + break; + } } - if (fProngs[i].fExcludePDGInHistory[k] && !fProngs[i].ComparePDG(mother.pdgCode(), fProngs[i].fPDGInHistory[k], true, fProngs[i].fExcludePDGInHistory[k])) { + } /*else { // check generation in time + if (!currentMCParticle.has_daughters()) { return false; } - ith++; - currentMCParticle = mother; - if (ith > 10) { // need error message. Given pdg code was not found within 10 generations of the particles decay chain. - break; + const auto& daughtersSlice = currentMCParticle.template daughters_as

(); + for (auto& d : daughtersSlice) { + if (!fProngs[i].fExcludePDGInHistory[k] && fProngs[i].ComparePDG(d.pdgCode(), fProngs[i].fPDGInHistory[k], true, fProngs[i].fExcludePDGInHistory[k])) { + pdgInHistory.emplace_back(d.pdgCode()); + break; + } + if (fProngs[i].fExcludePDGInHistory[k] && !fProngs[i].ComparePDG(d.pdgCode(), fProngs[i].fPDGInHistory[k], true, fProngs[i].fExcludePDGInHistory[k])) { + return false; + } + ith++; + if (ith > 10) { // need error message. Given pdg code was not found within 10 generations of the particles decay chain. + break; + } } - } - // } else { // check generation in time - // if (!currentMCParticle.has_daughters()) - // return false; - // const auto& daughtersSlice = currentMCParticle.template daughters_as

(); - // for (auto& d : daughtersSlice) { - // if (!fProngs[i].fExcludePDGInHistory[k] && fProngs[i].ComparePDG(d.pdgCode(), fProngs[i].fPDGInHistory[k], true, fProngs[i].fExcludePDGInHistory[k])) { - // pdgInHistory.emplace_back(d.pdgCode()); - // break; - // } - // if (fProngs[i].fExcludePDGInHistory[k] && !fProngs[i].ComparePDG(d.pdgCode(), fProngs[i].fPDGInHistory[k], true, fProngs[i].fExcludePDGInHistory[k])) { - // return false; - // } - // ith++; - // if (ith > 10) { // need error message. Given pdg code was not found within 10 generations of the particles decay chain. - // break; - // } - // } - // } + }*/ } if (pdgInHistory.size() != nIncludedPDG) { // vector has as many entries as mothers (daughters) defined for prong return false; diff --git a/PWGDQ/Core/MCSignalLibrary.cxx b/PWGDQ/Core/MCSignalLibrary.cxx index 665fc7f4dee..1778d4ceadc 100644 --- a/PWGDQ/Core/MCSignalLibrary.cxx +++ b/PWGDQ/Core/MCSignalLibrary.cxx @@ -205,11 +205,23 @@ MCSignal* o2::aod::dqmcsignals::GetMCSignal(const char* name) signal = new MCSignal(name, "All beauty hadrons", {prong}, {-1}); return signal; } + if (!nameStr.compare("allBeautyHadronsFS")) { + MCProng prong(1, {503}, {true}, {false}, {0}, {0}, {false}); + prong.SetSourceBit(0, MCProng::kHEPMCFinalState); + signal = new MCSignal(name, "All beauty hadrons", {prong}, {-1}); + return signal; + } if (!nameStr.compare("allOpenBeautyHadrons")) { MCProng prong(1, {502}, {true}, {false}, {0}, {0}, {false}); signal = new MCSignal(name, "All open beauty hadrons", {prong}, {-1}); return signal; } + if (!nameStr.compare("allOpenBeautyHadronsFS")) { + MCProng prong(1, {502}, {true}, {false}, {0}, {0}, {false}); + prong.SetSourceBit(0, MCProng::kHEPMCFinalState); + signal = new MCSignal(name, "All open beauty hadrons", {prong}, {-1}); + return signal; + } if (!nameStr.compare("Bc")) { MCProng prong(1, {541}, {true}, {false}, {0}, {0}, {false}); signal = new MCSignal(name, "Bc", {prong}, {-1}); @@ -236,11 +248,23 @@ MCSignal* o2::aod::dqmcsignals::GetMCSignal(const char* name) signal = new MCSignal(name, "Everything from beauty", {prong}, {-1}); return signal; } + if (!nameStr.compare("everythingFromBeautyFS")) { + MCProng prong(2, {0, 503}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); + prong.SetSourceBit(1, MCProng::kHEPMCFinalState); + signal = new MCSignal(name, "Everything from beauty", {prong}, {-1}); + return signal; + } if (!nameStr.compare("everythingFromEverythingFromBeauty")) { MCProng prong(3, {0, 0, 503}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}); signal = new MCSignal(name, "Everything from everything from beauty", {prong}, {-1}); return signal; } + if (!nameStr.compare("everythingFromEverythingFromBeautyFS")) { + MCProng prong(3, {0, 0, 503}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}); + prong.SetSourceBit(2, MCProng::kHEPMCFinalState); + signal = new MCSignal(name, "Everything from everything from beauty", {prong}, {-1}); + return signal; + } if (!nameStr.compare("allCharmHadrons")) { MCProng prong(1, {403}, {true}, {false}, {0}, {0}, {false}); signal = new MCSignal(name, "All charm hadrons", {prong}, {-1}); @@ -1249,6 +1273,13 @@ MCSignal* o2::aod::dqmcsignals::GetMCSignal(const char* name) return signal; } + if (!nameStr.compare("BplusFS")) { + MCProng prong(1, {521}, {true}, {false}, {0}, {0}, {false}); + prong.SetSourceBit(0, MCProng::kHEPMCFinalState); + signal = new MCSignal(name, "B+", {prong}, {-1}); + return signal; + } + if (!nameStr.compare("beautyPairs")) { MCProng prong(1, {503}, {true}, {false}, {0}, {0}, {false}); signal = new MCSignal("beautyPairs", "Beauty hadron pair", {prong, prong}, {-1, -1}); diff --git a/PWGDQ/DataModel/ReducedInfoTables.h b/PWGDQ/DataModel/ReducedInfoTables.h index 40352fd1588..5a0f9809734 100644 --- a/PWGDQ/DataModel/ReducedInfoTables.h +++ b/PWGDQ/DataModel/ReducedInfoTables.h @@ -408,6 +408,7 @@ DECLARE_SOA_TABLE(ReducedMCTracks, "AOD", "REDUCEDMCTRACK", //! MC track inform mcparticle::FromBackgroundEvent, mcparticle::GetGenStatusCode, mcparticle::GetProcess, + mcparticle::GetHepMCStatusCode, mcparticle::IsPhysicalPrimary); using ReducedMCTrack = ReducedMCTracks::iterator; diff --git a/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx b/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx index 661d2869768..441ab311657 100644 --- a/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx +++ b/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx @@ -106,6 +106,14 @@ constexpr static uint32_t gkMuonFillMapWithCov = VarManager::ObjTypes::Muon | Va // constexpr static uint32_t gkTrackFillMapWithAmbi = VarManager::ObjTypes::Track | VarManager::ObjTypes::AmbiTrack; constexpr static uint32_t gkMFTFillMap = VarManager::ObjTypes::TrackMFT; +template +void PrintBitMap(TMap map, int nbits) +{ + for (int i = 0; i < nbits; i++) { + cout << ((map & (TMap(1) << i)) > 0 ? "1" : "0"); + } +} + struct TableMakerMC { Produces eventMC; @@ -457,6 +465,36 @@ struct TableMakerMC { } i++; } + + /*if ((std::abs(mctrack.pdgCode())>400 && std::abs(mctrack.pdgCode())<599) || + (std::abs(mctrack.pdgCode())>4000 && std::abs(mctrack.pdgCode())<5999) || + (mcflags > 0)) { + cout << ">>>>>>>>>>>>>>>>>>>>>>> track idx / pdg / process / status code / HEPMC status / primary : " + << mctrack.globalIndex() << " / " << mctrack.pdgCode() << " / " + << mctrack.getProcess() << " / " << mctrack.getGenStatusCode() << " / " << mctrack.getHepMCStatusCode() << " / " << mctrack.isPhysicalPrimary() << endl; + cout << ">>>>>>>>>>>>>>>>>>>>>>> track bitmap: "; + PrintBitMap(mcflags, 16); + cout << endl; + if (mctrack.has_mothers()) { + for (auto& m : mctrack.mothersIds()) { + if (m < mcTracks.size()) { // protect against bad mother indices + auto aMother = mcTracks.rawIteratorAt(m); + cout << "<<<<<< mother idx / pdg: " << m << " / " << aMother.pdgCode() << endl; + } + } + } + + if (mctrack.has_daughters()) { + for (int d = mctrack.daughtersIds()[0]; d <= mctrack.daughtersIds()[1]; ++d) { + + if (d < mcTracks.size()) { // protect against bad daughter indices + auto aDaughter = mcTracks.rawIteratorAt(d); + cout << "<<<<<< daughter idx / pdg: " << d << " / " << aDaughter.pdgCode() << endl; + } + } + } + }*/ + // if no MC signals were matched, continue if (mcflags == 0) { continue; diff --git a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx index 753d42aa92d..139442814a5 100644 --- a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx +++ b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx @@ -3154,7 +3154,7 @@ struct AnalysisDileptonTrack { bool isBarrel = context.mOptions.get("processBarrelSkimmed"); bool isBarrelAsymmetric = context.mOptions.get("processDstarToD0Pi"); bool isMuon = context.mOptions.get("processMuonSkimmed"); - bool isMCGen = context.mOptions.get("processMCGen"); + bool isMCGen = context.mOptions.get("processMCGen") || context.mOptions.get("processMCGenWithEventSelection"); bool isDummy = context.mOptions.get("processDummy"); if (isDummy) { @@ -3399,6 +3399,7 @@ struct AnalysisDileptonTrack { if (isMCGen) { for (auto& sig : fGenMCSignals) { DefineHistograms(fHistMan, Form("MCTruthGen_%s", sig->GetName()), ""); + DefineHistograms(fHistMan, Form("MCTruthGenSel_%s", sig->GetName()), ""); } } @@ -3716,19 +3717,72 @@ struct AnalysisDileptonTrack { // loop over mc stack and fill histograms for pure MC truth signals // group all the MC tracks which belong to the MC event corresponding to the current reconstructed event // auto groupedMCTracks = tracksMC.sliceBy(aod::reducedtrackMC::reducedMCeventId, event.reducedMCevent().globalIndex()); - for (auto& track : mcTracks) { - VarManager::FillTrackMC(mcTracks, track); + for (auto& mctrack : mcTracks) { + + /*if ((std::abs(mctrack.pdgCode())>400 && std::abs(mctrack.pdgCode())<599) || + (std::abs(mctrack.pdgCode())>4000 && std::abs(mctrack.pdgCode())<5999) || + std::abs(mctrack.pdgCode())>5999) { + cout << ">>>>>>>>>>>>>>>>>>>>>>> track idx / pdg: " << mctrack.globalIndex() << " / " << mctrack.pdgCode() << endl; + if (mctrack.has_mothers()) { + for (auto& m : mctrack.mothersIds()) { + if (m < mcTracks.size()) { // protect against bad mother indices + auto aMother = mcTracks.rawIteratorAt(m); + cout << "<<<<<< mother idx / pdg: " << m << " / " << aMother.pdgCode() << endl; + } + } + } + + if (mctrack.has_daughters()) { + for (int d = mctrack.daughtersIds()[0]; d <= mctrack.daughtersIds()[1]; ++d) { + if (d < mcTracks.size()) { // protect against bad daughter indices + auto aDaughter = mcTracks.rawIteratorAt(d); + cout << "<<<<<< daughter idx / pdg: " << d << " / " << aDaughter.pdgCode() << endl; + } + } + } + }*/ + + VarManager::FillTrackMC(mcTracks, mctrack); // NOTE: Signals are checked here mostly based on the skimmed MC stack, so depending on the requested signal, the stack could be incomplete. // NOTE: However, the working model is that the decisions on MC signals are precomputed during skimming and are stored in the mcReducedFlags member. // TODO: Use the mcReducedFlags to select signals for (auto& sig : fGenMCSignals) { - if (sig->CheckSignal(true, track)) { + if (sig->CheckSignal(true, mctrack)) { fHistMan->FillHistClass(Form("MCTruthGen_%s", sig->GetName()), VarManager::fgValues); } } } } + PresliceUnsorted perReducedMcEvent = aod::reducedtrackMC::reducedMCeventId; + + void processMCGenWithEventSelection(soa::Filtered const& events, + ReducedMCEvents const& /*mcEvents*/, ReducedMCTracks const& mcTracks) + { + for (auto& event : events) { + if (!event.isEventSelected_bit(0)) { + continue; + } + if (!event.has_reducedMCevent()) { + continue; + } + + auto groupedMCTracks = mcTracks.sliceBy(perReducedMcEvent, event.reducedMCeventId()); + groupedMCTracks.bindInternalIndicesTo(&mcTracks); + for (auto& track : groupedMCTracks) { + + VarManager::FillTrackMC(mcTracks, track); + + auto track_raw = groupedMCTracks.rawIteratorAt(track.globalIndex()); + for (auto& sig : fGenMCSignals) { + if (sig->CheckSignal(true, track_raw)) { + fHistMan->FillHistClass(Form("MCTruthGenSel_%s", sig->GetName()), VarManager::fgValues); + } + } + } + } // end loop over reconstructed events + } + void processDummy(MyEvents&) { // do nothing @@ -3738,6 +3792,7 @@ struct AnalysisDileptonTrack { PROCESS_SWITCH(AnalysisDileptonTrack, processDstarToD0Pi, "Run barrel pairing of D0 daughters with pion candidate, using skimmed data", false); PROCESS_SWITCH(AnalysisDileptonTrack, processMuonSkimmed, "Run muon dilepton-track pairing, using skimmed data", false); PROCESS_SWITCH(AnalysisDileptonTrack, processMCGen, "Loop over MC particle stack and fill generator level histograms", false); + PROCESS_SWITCH(AnalysisDileptonTrack, processMCGenWithEventSelection, "Loop over MC particle stack and fill generator level histograms", false); PROCESS_SWITCH(AnalysisDileptonTrack, processDummy, "Dummy function", false); }; From 87d572caeccd79af565eaecfb4bfeccf53981951 Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Sun, 16 Mar 2025 00:16:40 +0800 Subject: [PATCH 0701/1650] [PWGCF] modify MC and Eff func (#10508) --- PWGCF/Flow/Tasks/flowMc.cxx | 18 ++++++++++++++++-- PWGCF/Flow/Tasks/flowQa.cxx | 5 +++-- PWGCF/Flow/Tasks/flowTask.cxx | 5 +++-- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowMc.cxx b/PWGCF/Flow/Tasks/flowMc.cxx index cbc205b9ff3..cad20c9bf55 100644 --- a/PWGCF/Flow/Tasks/flowMc.cxx +++ b/PWGCF/Flow/Tasks/flowMc.cxx @@ -58,9 +58,12 @@ struct FlowMc { O2_DEFINE_CONFIGURABLE(cfgCutPtRefMax, float, 3.0f, "Maximal pT for ref tracks") O2_DEFINE_CONFIGURABLE(cfgCutPtPOIMin, float, 0.2f, "Minimal pT for poi tracks") O2_DEFINE_CONFIGURABLE(cfgCutPtPOIMax, float, 10.0f, "Maximal pT for poi tracks") + O2_DEFINE_CONFIGURABLE(cfgCutTPCclu, float, 70.0f, "minimum TPC clusters") + O2_DEFINE_CONFIGURABLE(cfgCutITSclu, float, 6.0f, "minimum ITS clusters") O2_DEFINE_CONFIGURABLE(cfgFlowAcceptance, std::string, "", "CCDB path to acceptance object") O2_DEFINE_CONFIGURABLE(cfgFlowEfficiency, std::string, "", "CCDB path to efficiency object") O2_DEFINE_CONFIGURABLE(cfgCentVsIPTruth, std::string, "", "CCDB path to centrality vs IP truth") + O2_DEFINE_CONFIGURABLE(cfgIsGlobalTrack, bool, false, "Use global tracks instead of hasTPC&&hasITS") O2_DEFINE_CONFIGURABLE(cfgFlowCumulantEnabled, bool, false, "switch of calculating flow") O2_DEFINE_CONFIGURABLE(cfgFlowCumulantNbootstrap, int, 30, "Number of subsamples") @@ -97,6 +100,9 @@ struct FlowMc { void init(InitContext&) { + // QA histograms + histos.add("hnTPCClu", "Number of found TPC clusters", HistType::kTH1D, {{100, 40, 180}}); + histos.add("hnITSClu", "Number of found ITS clusters", HistType::kTH1D, {{100, 0, 20}}); // pT histograms histos.add("hImpactParameter", "hImpactParameter", HistType::kTH1D, {axisB}); histos.add("hNchVsImpactParameter", "hNchVsImpactParameter", HistType::kTH2D, {axisB, axisNch}); @@ -269,7 +275,7 @@ struct FlowMc { } } - using RecoTracks = soa::Join; + using RecoTracks = soa::Join; void process(aod::McCollision const& mcCollision, aod::BCsWithTimestamps const&, soa::Join const& mcParticles, RecoTracks const&) { @@ -344,7 +350,15 @@ struct FlowMc { if (mcParticle.has_tracks()) { auto const& tracks = mcParticle.tracks_as(); for (auto const& track : tracks) { - if (track.hasTPC() && track.hasITS()) { + if (!((track.tpcNClsFound() >= cfgCutTPCclu) && (track.itsNCls() >= cfgCutITSclu))) { + continue; + } + histos.fill(HIST("hnTPCClu"), track.tpcNClsFound()); + histos.fill(HIST("hnITSClu"), track.itsNCls()); + if (cfgIsGlobalTrack && track.isGlobalTrack()) { + validGlobal = true; + } + if (!cfgIsGlobalTrack && track.hasTPC() && track.hasITS()) { validGlobal = true; } if (track.hasTPC() || track.hasITS()) { diff --git a/PWGCF/Flow/Tasks/flowQa.cxx b/PWGCF/Flow/Tasks/flowQa.cxx index d540f3dffa5..53ec6673643 100644 --- a/PWGCF/Flow/Tasks/flowQa.cxx +++ b/PWGCF/Flow/Tasks/flowQa.cxx @@ -369,8 +369,9 @@ struct FlowQa { std::vector pTEffBins = {0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.4, 1.8, 2.2, 2.6, 3.0}; hFindPtBin = new TH1D("hFindPtBin", "hFindPtBin", pTEffBins.size() - 1, &pTEffBins[0]); funcEff.resize(pTEffBins.size() - 1); - std::vector f1p0 = {0.713412, 0.73259, 0.749925, 0.760693, 0.767321, 0.772874, 0.777889, 0.782172, 0.792831, 0.808402, 0.817907, 0.82473, 0.829151}; - std::vector f1p1 = {-2.15831e-05, -2.19538e-05, -2.2958e-05, -2.55123e-05, -2.75207e-05, -2.81486e-05, -2.839e-05, -2.83713e-05, -2.69748e-05, -2.48438e-05, -2.31138e-05, -2.20517e-05, -2.0758e-05}; + // LHC24g3 Eff + std::vector f1p0 = {0.7217476707, 0.7384792571, 0.7542625668, 0.7640680200, 0.7701951667, 0.7755299053, 0.7805901710, 0.7849446786, 0.7957356586, 0.8113039262, 0.8211968966, 0.8280558878, 0.8329342135}; + std::vector f1p1 = {-2.169488e-05, -2.191913e-05, -2.295484e-05, -2.556538e-05, -2.754463e-05, -2.816832e-05, -2.846502e-05, -2.843857e-05, -2.705974e-05, -2.477018e-05, -2.321730e-05, -2.203315e-05, -2.109474e-05}; for (uint ifunc = 0; ifunc < pTEffBins.size() - 1; ifunc++) { funcEff[ifunc] = new TF1(Form("funcEff%i", ifunc), "[0]+[1]*x", 0, 3000); funcEff[ifunc]->SetParameters(f1p0[ifunc], f1p1[ifunc] * cfgTrackDensityCorrSlopeFactor); diff --git a/PWGCF/Flow/Tasks/flowTask.cxx b/PWGCF/Flow/Tasks/flowTask.cxx index 34f244d842f..109758bf3af 100644 --- a/PWGCF/Flow/Tasks/flowTask.cxx +++ b/PWGCF/Flow/Tasks/flowTask.cxx @@ -431,8 +431,9 @@ struct FlowTask { std::vector pTEffBins = {0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.4, 1.8, 2.2, 2.6, 3.0}; hFindPtBin = new TH1D("hFindPtBin", "hFindPtBin", pTEffBins.size() - 1, &pTEffBins[0]); funcEff.resize(pTEffBins.size() - 1); - std::vector f1p0 = {0.713412, 0.73259, 0.749925, 0.760693, 0.767321, 0.772874, 0.777889, 0.782172, 0.792831, 0.808402, 0.817907, 0.82473, 0.829151}; - std::vector f1p1 = {-2.15831e-05, -2.19538e-05, -2.2958e-05, -2.55123e-05, -2.75207e-05, -2.81486e-05, -2.839e-05, -2.83713e-05, -2.69748e-05, -2.48438e-05, -2.31138e-05, -2.20517e-05, -2.0758e-05}; + // LHC24g3 Eff + std::vector f1p0 = {0.7217476707, 0.7384792571, 0.7542625668, 0.7640680200, 0.7701951667, 0.7755299053, 0.7805901710, 0.7849446786, 0.7957356586, 0.8113039262, 0.8211968966, 0.8280558878, 0.8329342135}; + std::vector f1p1 = {-2.169488e-05, -2.191913e-05, -2.295484e-05, -2.556538e-05, -2.754463e-05, -2.816832e-05, -2.846502e-05, -2.843857e-05, -2.705974e-05, -2.477018e-05, -2.321730e-05, -2.203315e-05, -2.109474e-05}; for (uint ifunc = 0; ifunc < pTEffBins.size() - 1; ifunc++) { funcEff[ifunc] = new TF1(Form("funcEff%i", ifunc), "[0]+[1]*x", 0, 3000); funcEff[ifunc]->SetParameters(f1p0[ifunc], f1p1[ifunc]); From 6be7fa6ede2c21bdf9f66665f34999dab3a97262 Mon Sep 17 00:00:00 2001 From: Victor Gonzalez Date: Sat, 15 Mar 2025 18:03:03 +0100 Subject: [PATCH 0702/1650] [PWGCF] DptDpt - Tracking relative separation within TPC sectors (#10511) Co-authored-by: Victor --- .../Tasks/dptDptEfficiencyAndQc.cxx | 66 +++++++++++++------ 1 file changed, 46 insertions(+), 20 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx index f3e35e6344d..661c1f94e2a 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -581,11 +582,11 @@ struct QAExtraDataCollectingEngine { //=================================================== /* pairs histograms */ std::vector>>> fhPhiPhiA{2, {nsp, {nsp, nullptr}}}; - std::vector>>> fhDeltaPhiVsPhiPhiA{2, {nsp, {nsp, nullptr}}}; - std::vector>>> fhDeltaPhiVsEtaEtaA{2, {nsp, {nsp, nullptr}}}; std::vector>>> fhEtaEtaA{2, {nsp, {nsp, nullptr}}}; - std::vector>>> fhDeltaEtaVsEtaEtaA{2, {nsp, {nsp, nullptr}}}; - std::vector>>> fhDeltaEtaVsPhiPhiA{2, {nsp, {nsp, nullptr}}}; + TAxis ptAxis{analysis::dptdptfilter::ptbins, analysis::dptdptfilter::ptlow, analysis::dptdptfilter::ptup}; + Configurable> cfgPtBinsOfInterest{"cfgPtBinsOfInterest", {1, 2, 3}, "The pt bins of interest"}; + std::vector>>>>> fhInSectorDeltaPhiVsPhiPhiPerPtBinA{2, {nsp, {nsp, {cfgPtBinsOfInterest->size(), {cfgPtBinsOfInterest->size(), nullptr}}}}}; + std::vector>>>>> fhInSectorDeltaPhiVsEtaEtaPerPtBinA{2, {nsp, {nsp, {cfgPtBinsOfInterest->size(), {cfgPtBinsOfInterest->size(), nullptr}}}}}; template void init(HistogramRegistry& registry, const char* dirname) @@ -594,9 +595,10 @@ struct QAExtraDataCollectingEngine { using namespace analysis::dptdptfilter; AxisSpec phiAxis = {phibins, 0.0f, constants::math::TwoPI, "#varphi"}; - AxisSpec deltaPhiAxis = {phibins, 0.0f, constants::math::TwoPI, "#Delta#varphi"}; + AxisSpec phiSectorAxis = {144, 0.0f, kTpcPhiSectorWidth, "#varphi (mod(2#pi/18)) (rad)"}; + AxisSpec deltaPhiAxis = {phibins, 0.0f, constants::math::TwoPI, "#Delta#varphi (rad)"}; + AxisSpec deltaPhiInSectorAxis = {288, -kTpcPhiSectorWidth, kTpcPhiSectorWidth, "#Delta#varphi (rad)"}; AxisSpec etaAxis = {etabins, etalow, etaup, "#eta"}; - AxisSpec deltaEtaAxis = {2 * etabins - 1, etalow - etaup, etaup - etalow, "#Delta#eta"}; /* the reconstructed and generated levels histograms */ std::string recogen = (kindOfData == kReco) ? "Reco" : "Gen"; @@ -604,16 +606,20 @@ struct QAExtraDataCollectingEngine { for (uint jsp = 0; jsp < nsp; ++jsp) { fhPhiPhiA[kindOfData][isp][jsp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("PhiPhi_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTH2F, {phiAxis, phiAxis}); - fhDeltaPhiVsPhiPhiA[kindOfData][isp][jsp] = ADDHISTOGRAM(TH3, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("DeltaPhiVsPhiPhi_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), - HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTH3F, {phiAxis, phiAxis, deltaPhiAxis}); - fhDeltaEtaVsPhiPhiA[kindOfData][isp][jsp] = ADDHISTOGRAM(TH3, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("DeltaEtaVsPhiPhi_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), - HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTH3F, {phiAxis, phiAxis, deltaEtaAxis}); fhEtaEtaA[kindOfData][isp][jsp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("EtaEta_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTH2F, {etaAxis, etaAxis}); - fhDeltaEtaVsEtaEtaA[kindOfData][isp][jsp] = ADDHISTOGRAM(TH3, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("DeltaEtaVsEtaEta_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), - HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTH3F, {etaAxis, etaAxis, deltaEtaAxis}); - fhDeltaPhiVsEtaEtaA[kindOfData][isp][jsp] = ADDHISTOGRAM(TH3, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("DeltaPhiVsEtaEta_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), - HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTH3F, {etaAxis, etaAxis, deltaPhiAxis}); + /* first resize them to the actual configured size */ + fhInSectorDeltaPhiVsPhiPhiPerPtBinA[kindOfData][isp][jsp].resize(cfgPtBinsOfInterest->size()); + for (uint ipt = 0; ipt < cfgPtBinsOfInterest->size(); ++ipt) { + /* first resize them to the actual configured size */ + fhInSectorDeltaPhiVsPhiPhiPerPtBinA[kindOfData][isp][jsp][ipt].resize(cfgPtBinsOfInterest->size(), nullptr); + for (uint jpt = 0; jpt < cfgPtBinsOfInterest->size(); ++jpt) { + fhInSectorDeltaPhiVsPhiPhiPerPtBinA[kindOfData][isp][jsp][ipt][jpt] = ADDHISTOGRAM(TH3, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("DeltaPhiVsPhiPhiPt%02d%02d_%s%s", ipt, jpt, tnames[isp].c_str(), tnames[jsp].c_str()), + HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTH3F, {phiSectorAxis, phiSectorAxis, deltaPhiInSectorAxis}); + fhInSectorDeltaPhiVsEtaEtaPerPtBinA[kindOfData][isp][jsp][ipt][jpt] = ADDHISTOGRAM(TH3, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("DeltaPhiVsEtaEtaPt%02d%02d_%s%s", ipt, jpt, tnames[isp].c_str(), tnames[jsp].c_str()), + HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTH3F, {etaAxis, etaAxis, deltaPhiInSectorAxis}); + } + } } } } @@ -626,20 +632,40 @@ struct QAExtraDataCollectingEngine { /* we should only receive accepted tracks */ for (auto const& track1 : tracks1) { + auto indexForPt = [&](auto const& track) { + int ptBin = ptAxis.FindFixBin(track.pt()); + if (std::find(cfgPtBinsOfInterest->begin(), cfgPtBinsOfInterest->end(), ptBin) != cfgPtBinsOfInterest->end()) { + /* of interest */ + return ptBin - 1; + } else { + return -1; + } + }; + int ptBinIx1 = indexForPt(track1); + if (ptBinIx1 < 0) { + continue; + } + float inTpcSectorPhi1 = std::fmod(track1.phi(), kTpcPhiSectorWidth); for (auto const& track2 : tracks2) { /* checking the same track id condition */ if (track1 == track2) { /* exclude autocorrelations */ continue; } - float deltaPhi = RecoDecay::constrainAngle(track1.phi() - track2.phi()); - float deltaEta = track1.eta() - track2.eta(); + int ptBinIx2 = indexForPt(track2); + if (ptBinIx2 < 0) { + continue; + } fhPhiPhiA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(track1.phi(), track2.phi()); - fhDeltaPhiVsPhiPhiA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(track1.phi(), track2.phi(), deltaPhi); - fhDeltaEtaVsPhiPhiA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(track1.phi(), track2.phi(), deltaEta); fhEtaEtaA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(track1.eta(), track2.eta()); - fhDeltaEtaVsEtaEtaA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(track1.eta(), track2.eta(), deltaEta); - fhDeltaPhiVsEtaEtaA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(track1.eta(), track2.eta(), deltaPhi); + if (static_cast(track1.phi() / kTpcPhiSectorWidth) == static_cast(track2.phi() / kTpcPhiSectorWidth)) { + /* only if, for sure, both tracks are within the same sector */ + float inTpcSectorPhi2 = std::fmod(track2.phi(), kTpcPhiSectorWidth); + float deltaPhi = inTpcSectorPhi1 - inTpcSectorPhi2; + + fhInSectorDeltaPhiVsPhiPhiPerPtBinA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()][ptBinIx1][ptBinIx2]->Fill(track1.phi(), track2.phi(), deltaPhi); + fhInSectorDeltaPhiVsEtaEtaPerPtBinA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()][ptBinIx1][ptBinIx2]->Fill(track1.eta(), track2.eta(), deltaPhi); + } } } } From 6e441d1dbf4ec5cd48390c73e3feaebeb9d3a38e Mon Sep 17 00:00:00 2001 From: prottayCMT <61418725+prottayCMT@users.noreply.github.com> Date: Sat, 15 Mar 2025 19:51:28 +0100 Subject: [PATCH 0703/1650] [PWGHF] updated code to reduce memory size of the output file (#10486) Co-authored-by: Prottay Das --- .../Tasks/taskDirectedFlowCharmHadrons.cxx | 53 +++++++++++-------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskDirectedFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskDirectedFlowCharmHadrons.cxx index 0ac694501d1..10c5c19216c 100644 --- a/PWGHF/D2H/Tasks/taskDirectedFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskDirectedFlowCharmHadrons.cxx @@ -54,6 +54,7 @@ struct HfTaskDirectedFlowCharmHadrons { Configurable centralityMax{"centralityMax", 100., "Maximum centrality accepted in SP computation"}; Configurable storeMl{"storeMl", false, "Flag to store ML scores"}; Configurable direct{"direct", false, "Flag to calculate direct v1 odd and even"}; + Configurable correction{"correction", false, "Flag for correction"}; Configurable userap{"userap", false, "Flag to fill rapidity vs eta "}; Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Configurable> classMl{"classMl", {0, 2}, "Indices of BDT scores to be stored. Two indexes max."}; @@ -121,17 +122,19 @@ struct HfTaskDirectedFlowCharmHadrons { if (direct) { registry.add("hpQxytpvscent", "hpQxytpvscent", HistType::kTHnSparseF, {thnAxisCent, thnAxisScalarProd}, true); - registry.add("hpuxyQxypvscentpteta", "hpuxyQxypvscentpteta", HistType::kTHnSparseF, axes, true); - registry.add("hpuxyQxytvscentpteta", "hpuxyQxytvscentpteta", HistType::kTHnSparseF, axes, true); registry.add("hpoddvscentpteta", "hpoddvscentpteta", HistType::kTHnSparseF, axes, true); registry.add("hpevenvscentpteta", "hpevenvscentpteta", HistType::kTHnSparseF, axes, true); - - registry.add("hpQxpvscent", "hpQxpvscent", HistType::kTHnSparseF, {thnAxisCent, thnAxisScalarProd}, true); - registry.add("hpQypvscent", "hpQypvscent", HistType::kTHnSparseF, {thnAxisCent, thnAxisScalarProd}, true); - registry.add("hpQxtvscent", "hpQxtvscent", HistType::kTHnSparseF, {thnAxisCent, thnAxisScalarProd}, true); - registry.add("hpQytvscent", "hpQytvscent", HistType::kTHnSparseF, {thnAxisCent, thnAxisScalarProd}, true); - registry.add("hpuxvscentpteta", "hpuxvscentpteta", HistType::kTHnSparseF, axes, true); - registry.add("hpuyvscentpteta", "hpuyvscentpteta", HistType::kTHnSparseF, axes, true); + if (correction) { + registry.add("hpuxyQxypvscentpteta", "hpuxyQxypvscentpteta", HistType::kTHnSparseF, axes, true); + registry.add("hpuxyQxytvscentpteta", "hpuxyQxytvscentpteta", HistType::kTHnSparseF, axes, true); + + registry.add("hpQxpvscent", "hpQxpvscent", HistType::kTHnSparseF, {thnAxisCent, thnAxisScalarProd}, true); + registry.add("hpQypvscent", "hpQypvscent", HistType::kTHnSparseF, {thnAxisCent, thnAxisScalarProd}, true); + registry.add("hpQxtvscent", "hpQxtvscent", HistType::kTHnSparseF, {thnAxisCent, thnAxisScalarProd}, true); + registry.add("hpQytvscent", "hpQytvscent", HistType::kTHnSparseF, {thnAxisCent, thnAxisScalarProd}, true); + registry.add("hpuxvscentpteta", "hpuxvscentpteta", HistType::kTHnSparseF, axes, true); + registry.add("hpuyvscentpteta", "hpuyvscentpteta", HistType::kTHnSparseF, axes, true); + } } else { registry.add("hpQxtQxpvscent", "hpQxtQxpvscent", HistType::kTHnSparseF, {thnAxisCent, thnAxisScalarProd}, true); registry.add("hpQytQypvscent", "hpQytQypvscent", HistType::kTHnSparseF, {thnAxisCent, thnAxisScalarProd}, true); @@ -212,10 +215,12 @@ struct HfTaskDirectedFlowCharmHadrons { // correlations in the denominators for SP calculation if (direct) { registry.fill(HIST("hpQxytpvscent"), cent, Qxytp); - registry.fill(HIST("hpQxpvscent"), cent, qxZDCA); - registry.fill(HIST("hpQxtvscent"), cent, qxZDCC); - registry.fill(HIST("hpQypvscent"), cent, qyZDCA); - registry.fill(HIST("hpQytvscent"), cent, qyZDCC); + if (correction) { + registry.fill(HIST("hpQxpvscent"), cent, qxZDCA); + registry.fill(HIST("hpQxtvscent"), cent, qxZDCC); + registry.fill(HIST("hpQypvscent"), cent, qyZDCA); + registry.fill(HIST("hpQytvscent"), cent, qyZDCC); + } } else { registry.fill(HIST("hpQxtQxpvscent"), cent, QxtQxp); registry.fill(HIST("hpQytQypvscent"), cent, QytQyp); @@ -305,14 +310,15 @@ struct HfTaskDirectedFlowCharmHadrons { if (storeMl) { if (direct) { - registry.fill(HIST("hpuxyQxypvscentpteta"), massCand, cent, ptCand, etaCand, uxyQxyp, sign, outputMl[0], outputMl[1]); - registry.fill(HIST("hpuxyQxytvscentpteta"), massCand, cent, ptCand, etaCand, uxyQxyt, sign, outputMl[0], outputMl[1]); registry.fill(HIST("hpoddvscentpteta"), massCand, cent, ptCand, etaCand, oddv1, sign, outputMl[0], outputMl[1]); registry.fill(HIST("hpevenvscentpteta"), massCand, cent, ptCand, etaCand, evenv1, sign, outputMl[0], outputMl[1]); + if (correction) { + registry.fill(HIST("hpuxyQxypvscentpteta"), massCand, cent, ptCand, etaCand, uxyQxyp, sign, outputMl[0], outputMl[1]); + registry.fill(HIST("hpuxyQxytvscentpteta"), massCand, cent, ptCand, etaCand, uxyQxyt, sign, outputMl[0], outputMl[1]); - registry.fill(HIST("hpuxvscentpteta"), massCand, cent, ptCand, etaCand, ux, sign, outputMl[0], outputMl[1]); - registry.fill(HIST("hpuyvscentpteta"), massCand, cent, ptCand, etaCand, uy, sign, outputMl[0], outputMl[1]); - + registry.fill(HIST("hpuxvscentpteta"), massCand, cent, ptCand, etaCand, ux, sign, outputMl[0], outputMl[1]); + registry.fill(HIST("hpuyvscentpteta"), massCand, cent, ptCand, etaCand, uy, sign, outputMl[0], outputMl[1]); + } } else { registry.fill(HIST("hpuxQxpvscentpteta"), massCand, cent, ptCand, etaCand, uxQxp, sign, outputMl[0], outputMl[1]); registry.fill(HIST("hpuyQypvscentpteta"), massCand, cent, ptCand, etaCand, uyQyp, sign, outputMl[0], outputMl[1]); @@ -324,13 +330,16 @@ struct HfTaskDirectedFlowCharmHadrons { } } else { if (direct) { - registry.fill(HIST("hpuxyQxypvscentpteta"), massCand, cent, ptCand, etaCand, uxyQxyp, sign); - registry.fill(HIST("hpuxyQxytvscentpteta"), massCand, cent, ptCand, etaCand, uxyQxyt, sign); registry.fill(HIST("hpoddvscentpteta"), massCand, cent, ptCand, etaCand, oddv1, sign); registry.fill(HIST("hpevenvscentpteta"), massCand, cent, ptCand, etaCand, evenv1, sign); - registry.fill(HIST("hpuxvscentpteta"), massCand, cent, ptCand, etaCand, ux, sign); - registry.fill(HIST("hpuyvscentpteta"), massCand, cent, ptCand, etaCand, uy, sign); + if (correction) { + registry.fill(HIST("hpuxyQxypvscentpteta"), massCand, cent, ptCand, etaCand, uxyQxyp, sign); + registry.fill(HIST("hpuxyQxytvscentpteta"), massCand, cent, ptCand, etaCand, uxyQxyt, sign); + + registry.fill(HIST("hpuxvscentpteta"), massCand, cent, ptCand, etaCand, ux, sign); + registry.fill(HIST("hpuyvscentpteta"), massCand, cent, ptCand, etaCand, uy, sign); + } } else { registry.fill(HIST("hpuxQxpvscentpteta"), massCand, cent, ptCand, etaCand, uxQxp, sign); registry.fill(HIST("hpuyQypvscentpteta"), massCand, cent, ptCand, etaCand, uyQyp, sign); From f95e5658c6dcd6f63551b3239b3c77a33dff2bd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Sat, 15 Mar 2025 23:51:14 +0100 Subject: [PATCH 0704/1650] [PWGHF] Fixing the O2 linter warning of charm directed flow task (#10513) --- .../Tasks/taskDirectedFlowCharmHadrons.cxx | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskDirectedFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskDirectedFlowCharmHadrons.cxx index 10c5c19216c..db2300126f2 100644 --- a/PWGHF/D2H/Tasks/taskDirectedFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskDirectedFlowCharmHadrons.cxx @@ -59,14 +59,11 @@ struct HfTaskDirectedFlowCharmHadrons { Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Configurable> classMl{"classMl", {0, 2}, "Indices of BDT scores to be stored. Two indexes max."}; - ConfigurableAxis thnConfigAxisInvMass{"thnConfigAxisInvMass", {100, 1.78, 2.05}, ""}; - ConfigurableAxis thnConfigAxisPt{"thnConfigAxisPt", {VARIABLE_WIDTH, 0.2, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 6.5, 8.0, 10.0}, ""}; - ConfigurableAxis thnConfigAxisEta{"thnConfigAxisEta", {VARIABLE_WIDTH, -0.8, -0.4, 0, 0.4, 0.8}, ""}; - ConfigurableAxis thnConfigAxisCent{"thnConfigAxisCent", {VARIABLE_WIDTH, 0.0, 10.0, 40.0, 80.0}, ""}; - ConfigurableAxis thnConfigAxisScalarProd{"thnConfigAxisScalarProd", {8000, -2.0, 2.0}, ""}; - ConfigurableAxis thnConfigAxisSign{"thnConfigAxisSign", {2, -2.0, 2.0}, ""}; - ConfigurableAxis thnConfigAxisMlOne{"thnConfigAxisMlOne", {1000, 0., 1.}, ""}; - ConfigurableAxis thnConfigAxisMlTwo{"thnConfigAxisMlTwo", {1000, 0., 1.}, ""}; + HfHelper hfHelper; + EventPlaneHelper epHelper; + SliceCache cache; + HfEventSelection hfEvSel; // event selection and monitoring + o2::framework::Service ccdb; using CandDplusDataWMl = soa::Filtered>; using CandDplusData = soa::Filtered>; @@ -86,11 +83,14 @@ struct HfTaskDirectedFlowCharmHadrons { Partition selectedD0ToPiKWMl = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlag; Partition selectedD0ToKPiWMl = aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlag; - SliceCache cache; - HfHelper hfHelper; - EventPlaneHelper epHelper; - HfEventSelection hfEvSel; // event selection and monitoring - o2::framework::Service ccdb; + ConfigurableAxis thnConfigAxisInvMass{"thnConfigAxisInvMass", {100, 1.78, 2.05}, ""}; + ConfigurableAxis thnConfigAxisPt{"thnConfigAxisPt", {VARIABLE_WIDTH, 0.2, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 6.5, 8.0, 10.0}, ""}; + ConfigurableAxis thnConfigAxisEta{"thnConfigAxisEta", {VARIABLE_WIDTH, -0.8, -0.4, 0, 0.4, 0.8}, ""}; + ConfigurableAxis thnConfigAxisCent{"thnConfigAxisCent", {VARIABLE_WIDTH, 0.0, 10.0, 40.0, 80.0}, ""}; + ConfigurableAxis thnConfigAxisScalarProd{"thnConfigAxisScalarProd", {8000, -2.0, 2.0}, ""}; + ConfigurableAxis thnConfigAxisSign{"thnConfigAxisSign", {2, -2.0, 2.0}, ""}; + ConfigurableAxis thnConfigAxisMlOne{"thnConfigAxisMlOne", {1000, 0., 1.}, ""}; + ConfigurableAxis thnConfigAxisMlTwo{"thnConfigAxisMlTwo", {1000, 0., 1.}, ""}; HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -206,15 +206,15 @@ struct HfTaskDirectedFlowCharmHadrons { auto qxZDCC = collision.qxZDCC(); // extracting q vectors of ZDC auto qyZDCC = collision.qyZDCC(); - auto QxtQxp = qxZDCC * qxZDCA; - auto QytQyp = qyZDCC * qyZDCA; - auto Qxytp = QxtQxp + QytQyp; - auto QxpQyt = qxZDCA * qyZDCC; - auto QxtQyp = qxZDCC * qyZDCA; + auto qxtQxp = qxZDCC * qxZDCA; + auto qytQyp = qyZDCC * qyZDCA; + auto qxytp = qxtQxp + qytQyp; + auto qxpQyt = qxZDCA * qyZDCC; + auto qxtQyp = qxZDCC * qyZDCA; // correlations in the denominators for SP calculation if (direct) { - registry.fill(HIST("hpQxytpvscent"), cent, Qxytp); + registry.fill(HIST("hpQxytpvscent"), cent, qxytp); if (correction) { registry.fill(HIST("hpQxpvscent"), cent, qxZDCA); registry.fill(HIST("hpQxtvscent"), cent, qxZDCC); @@ -222,10 +222,10 @@ struct HfTaskDirectedFlowCharmHadrons { registry.fill(HIST("hpQytvscent"), cent, qyZDCC); } } else { - registry.fill(HIST("hpQxtQxpvscent"), cent, QxtQxp); - registry.fill(HIST("hpQytQypvscent"), cent, QytQyp); - registry.fill(HIST("hpQxpQytvscent"), cent, QxpQyt); - registry.fill(HIST("hpQxtQypvscent"), cent, QxtQyp); + registry.fill(HIST("hpQxtQxpvscent"), cent, qxtQxp); + registry.fill(HIST("hpQytQypvscent"), cent, qytQyp); + registry.fill(HIST("hpQxpQytvscent"), cent, qxpQyt); + registry.fill(HIST("hpQxtQypvscent"), cent, qxtQyp); registry.fill(HIST("hpQxpvscent"), cent, qxZDCA); registry.fill(HIST("hpQxtvscent"), cent, qxZDCC); registry.fill(HIST("hpQypvscent"), cent, qyZDCA); From 69c345a45678d49be0aefcd533045c16380cb229 Mon Sep 17 00:00:00 2001 From: Marvin Hemmer <53471402+mhemmer-cern@users.noreply.github.com> Date: Sun, 16 Mar 2025 13:17:02 +0100 Subject: [PATCH 0705/1650] [PWGEM,PWGEM-36] Fix Pi0FlowEMC non zero mass (#10515) --- PWGEM/PhotonMeson/Tasks/taskPi0FlowEMC.cxx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/PWGEM/PhotonMeson/Tasks/taskPi0FlowEMC.cxx b/PWGEM/PhotonMeson/Tasks/taskPi0FlowEMC.cxx index d893e8be223..5394eb19deb 100644 --- a/PWGEM/PhotonMeson/Tasks/taskPi0FlowEMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/taskPi0FlowEMC.cxx @@ -943,10 +943,10 @@ struct TaskPi0FlowEMC { // Convert to PxPyPzEVector to modify energy ROOT::Math::PxPyPzEVector v1Mod(v1); v1Mod.SetE(v1Mod.E() * 1.0505); - v1 = ROOT::Math::PtEtaPhiMVector(v1Mod); + v1 = ROOT::Math::PtEtaPhiMVector(v1Mod.Pt(), v1Mod.Eta(), v1Mod.Phi(), 0.); ROOT::Math::PxPyPzEVector v2Mod(v2); v2Mod.SetE(v2Mod.E() * 1.0505); - v2 = ROOT::Math::PtEtaPhiMVector(v2Mod); + v2 = ROOT::Math::PtEtaPhiMVector(v2Mod.Pt(), v2Mod.Eta(), v2Mod.Phi(), 0.); } ROOT::Math::PtEtaPhiMVector vMeson = v1 + v2; float dTheta = v1.Theta() - v2.Theta(); @@ -1051,10 +1051,10 @@ struct TaskPi0FlowEMC { // Convert to PxPyPzEVector to modify energy ROOT::Math::PxPyPzEVector v1Mod(v1); v1Mod.SetE(v1Mod.E() * 1.0505); - v1 = ROOT::Math::PtEtaPhiMVector(v1Mod); + v1 = ROOT::Math::PtEtaPhiMVector(v1Mod.Pt(), v1Mod.Eta(), v1Mod.Phi(), 0.); ROOT::Math::PxPyPzEVector v2Mod(v2); v2Mod.SetE(v2Mod.E() * 1.0505); - v2 = ROOT::Math::PtEtaPhiMVector(v2Mod); + v2 = ROOT::Math::PtEtaPhiMVector(v2Mod.Pt(), v2Mod.Eta(), v2Mod.Phi(), 0.); } ROOT::Math::PtEtaPhiMVector vMeson = v1 + v2; @@ -1277,10 +1277,10 @@ struct TaskPi0FlowEMC { // Convert to PxPyPzEVector to modify energy ROOT::Math::PxPyPzEVector v1Mod(v1); v1Mod.SetE(v1Mod.E() * 1.0505); - v1 = ROOT::Math::PtEtaPhiMVector(v1Mod); + v1 = ROOT::Math::PtEtaPhiMVector(v1Mod.Pt(), v1Mod.Eta(), v1Mod.Phi(), 0.); ROOT::Math::PxPyPzEVector v2Mod(v2); v2Mod.SetE(v2Mod.E() * 1.0505); - v2 = ROOT::Math::PtEtaPhiMVector(v2Mod); + v2 = ROOT::Math::PtEtaPhiMVector(v2Mod.Pt(), v2Mod.Eta(), v2Mod.Phi(), 0.); } ROOT::Math::PtEtaPhiMVector vMeson = v1 + v2; float dTheta = v1.Theta() - v2.Theta(); From 3c6e3d1be99846560dc34c56db47f3af6275b8a0 Mon Sep 17 00:00:00 2001 From: Gyula Bencedi Date: Sun, 16 Mar 2025 13:22:43 +0100 Subject: [PATCH 0706/1650] [PWGLF] [PWGMM] Reduce dimensions in efficiency histograms (#10516) Co-authored-by: ALICE Action Bot --- PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx | 106 +++++++++++++---------------- 1 file changed, 47 insertions(+), 59 deletions(-) diff --git a/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx b/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx index 2efe478c796..c9e1f52e63e 100644 --- a/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx +++ b/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx @@ -518,26 +518,22 @@ struct DndetaMFTPbPb { } if (doprocessTrkEffIdxInlusive) { - qaregistry.add({"Tracks/hPtPhiEtaZvtxEffGen", - "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", + qaregistry.add({"Tracks/hPtEtaEffGen", + "; p_{T} (GeV/c); #eta; occupancy", {HistType::kTHnSparseF, - {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/hPtPhiEtaZvtxEffRec", - "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", + {ptAxis, etaAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/hPtEtaEffRec", + "; p_{T} (GeV/c); #eta; occupancy", {HistType::kTHnSparseF, - {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); - qaregistry.add( - {"Tracks/hPhiEtaDuplicates", - "; #varphi; #eta; occupancy", - {HistType::kTHnSparseF, {phiAxis, etaAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/hPtPhiEtaZvtxEffDuplicates", - "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", + {ptAxis, etaAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/hPtEtaEffDuplicates", + "; p_{T} (GeV/c); #eta; occupancy", {HistType::kTHnSparseF, - {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/hPtPhiEtaZvtxEffGenDuplicates", - "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", + {ptAxis, etaAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/hPtEtaEffGenDuplicates", + "; p_{T} (GeV/c); #eta; occupancy", {HistType::kTHnSparseF, - {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); + {ptAxis, etaAxis, occupancyAxis}}}); qaregistry.add({"Tracks/NmftTrkPerPart", "; #it{N}_{mft tracks per particle}; occupancy", {HistType::kTH2F, {multAxis, occupancyAxis}}}); @@ -545,33 +541,29 @@ struct DndetaMFTPbPb { if (doprocessTrkEffIdxCentFT0C) { qaregistry.add( - {"Tracks/Centrality/hPtPhiEtaZvtxEffGen", - "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); centrality; " + {"Tracks/Centrality/hPtEtaEffGen", + "; p_{T} (GeV/c); #eta; centrality; " "occupancy", {HistType::kTHnSparseF, - {ptAxis, phiAxis, etaAxis, zAxis, centralityAxis, occupancyAxis}}}); + {ptAxis, etaAxis, centralityAxis, occupancyAxis}}}); qaregistry.add( - {"Tracks/Centrality/hPtPhiEtaZvtxEffRec", - "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); centrality; " + {"Tracks/Centrality/hPtEtaEffRec", + "; p_{T} (GeV/c); #eta; centrality; " "occupancy", {HistType::kTHnSparseF, - {ptAxis, phiAxis, etaAxis, zAxis, centralityAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/Centrality/hPhiEtaDuplicates", - "; #varphi; #eta; centrality; occupancy", - {HistType::kTHnSparseF, - {phiAxis, etaAxis, centralityAxis, occupancyAxis}}}); + {ptAxis, etaAxis, centralityAxis, occupancyAxis}}}); qaregistry.add( - {"Tracks/Centrality/hPtPhiEtaZvtxEffDuplicates", - "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); centrality; " + {"Tracks/Centrality/hPtEtaEffDuplicates", + "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); centrality; " "occupancy", {HistType::kTHnSparseF, - {ptAxis, phiAxis, etaAxis, zAxis, centralityAxis, occupancyAxis}}}); + {ptAxis, etaAxis, centralityAxis, occupancyAxis}}}); qaregistry.add( - {"Tracks/Centrality/hPtPhiEtaZvtxEffGenDuplicates", - "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); centrality; " + {"Tracks/Centrality/hPtEtaEffGenDuplicates", + "; p_{T} (GeV/c); #eta; centrality; " "occupancy", {HistType::kTHnSparseF, - {ptAxis, phiAxis, etaAxis, zAxis, centralityAxis, occupancyAxis}}}); + {ptAxis, etaAxis, centralityAxis, occupancyAxis}}}); qaregistry.add( {"Tracks/Centrality/NmftTrkPerPart", "; #it{N}_{mft tracks per particle}; centrality; occupancy", @@ -1746,12 +1738,12 @@ struct DndetaMFTPbPb { // MC gen if constexpr (has_reco_cent) { - qaregistry.fill(HIST("Tracks/Centrality/hPtPhiEtaZvtxEffGen"), - particle.pt(), particle.phi(), particle.eta(), - mcCollision.posZ(), cgen, occgen); + qaregistry.fill(HIST("Tracks/Centrality/hPtEtaEffGen"), + particle.pt(), particle.eta(), + cgen, occgen); } else { - qaregistry.fill(HIST("Tracks/hPtPhiEtaZvtxEffGen"), particle.pt(), - particle.phi(), particle.eta(), mcCollision.posZ(), + qaregistry.fill(HIST("Tracks/hPtEtaEffGen"), particle.pt(), + particle.eta(), occgen); } // MC rec @@ -1767,32 +1759,28 @@ struct DndetaMFTPbPb { ++ncnt; if constexpr (has_reco_cent) { if (!iscounted) { // primaries - qaregistry.fill(HIST("Tracks/Centrality/hPtPhiEtaZvtxEffRec"), - particle.pt(), particle.phi(), particle.eta(), - mcCollision.posZ(), crec, occrec); + qaregistry.fill(HIST("Tracks/Centrality/hPtEtaEffRec"), + particle.pt(), particle.eta(), + crec, occrec); iscounted = true; } if (ncnt > 1) { // duplicates - qaregistry.fill(HIST("Tracks/Centrality/hPhiEtaDuplicates"), - track.phi(), track.eta(), crec, occrec); qaregistry.fill( - HIST("Tracks/Centrality/hPtPhiEtaZvtxEffDuplicates"), - particle.pt(), particle.phi(), particle.eta(), - mcCollision.posZ(), crec, occrec); + HIST("Tracks/Centrality/hPtEtaEffDuplicates"), + particle.pt(), particle.eta(), + crec, occrec); } } else { if (!iscounted) { // primaries - qaregistry.fill(HIST("Tracks/hPtPhiEtaZvtxEffRec"), - particle.pt(), particle.phi(), particle.eta(), - mcCollision.posZ(), occrec); + qaregistry.fill(HIST("Tracks/hPtEtaEffRec"), + particle.pt(), particle.eta(), + occrec); iscounted = true; } if (ncnt > 1) { // duplicates - qaregistry.fill(HIST("Tracks/hPhiEtaDuplicates"), track.phi(), - track.eta(), occrec); - qaregistry.fill(HIST("Tracks/hPtPhiEtaZvtxEffDuplicates"), - particle.pt(), particle.phi(), particle.eta(), - mcCollision.posZ(), occrec); + qaregistry.fill(HIST("Tracks/hPtEtaEffDuplicates"), + particle.pt(), particle.eta(), + occrec); } } } @@ -1805,13 +1793,13 @@ struct DndetaMFTPbPb { if (relatedTracks.size() > 1) { if constexpr (has_reco_cent) { qaregistry.fill( - HIST("Tracks/Centrality/hPtPhiEtaZvtxEffGenDuplicates"), - particle.pt(), particle.phi(), particle.eta(), - mcCollision.posZ(), crec, occrec); + HIST("Tracks/Centrality/hPtEtaEffGenDuplicates"), + particle.pt(), particle.eta(), + crec, occrec); } else { - qaregistry.fill(HIST("Tracks/hPtPhiEtaZvtxEffGenDuplicates"), - particle.pt(), particle.phi(), particle.eta(), - mcCollision.posZ(), occrec); + qaregistry.fill(HIST("Tracks/hPtEtaEffGenDuplicates"), + particle.pt(), particle.eta(), + occrec); } } } From 25dc8a02dc11f29e52cb51ce0c86e74e773a2667 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Mon, 17 Mar 2025 01:35:06 +0900 Subject: [PATCH 0707/1650] [PWGEM/PhotonMeson] update several photon tasks (#10520) --- .../Dilepton/TableProducer/eventSelection.cxx | 16 +- PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h | 27 + PWGEM/PhotonMeson/Core/TaggingPi0.h | 13 + PWGEM/PhotonMeson/Core/TaggingPi0MC.h | 27 +- PWGEM/PhotonMeson/Core/V0PhotonCut.cxx | 6 - PWGEM/PhotonMeson/Core/V0PhotonCut.h | 9 - .../TableProducer/associateMCinfoPhoton.cxx | 5 +- .../TableProducer/createEMEventPhoton.cxx | 11 +- .../TableProducer/photonconversionbuilder.cxx | 29 +- .../TableProducer/skimmerGammaCalo.cxx | 18 +- .../skimmerPrimaryElectronFromDalitzEE.cxx | 13 +- PWGEM/PhotonMeson/Tasks/CMakeLists.txt | 10 - PWGEM/PhotonMeson/Tasks/TaggingPi0.cxx | 585 ----------------- PWGEM/PhotonMeson/Tasks/TaggingPi0MC.cxx | 589 ------------------ PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx | 6 +- PWGEM/PhotonMeson/Utils/NMHistograms.h | 4 +- PWGEM/PhotonMeson/Utils/TrackSelection.h | 6 +- 17 files changed, 111 insertions(+), 1263 deletions(-) delete mode 100644 PWGEM/PhotonMeson/Tasks/TaggingPi0.cxx delete mode 100644 PWGEM/PhotonMeson/Tasks/TaggingPi0MC.cxx diff --git a/PWGEM/Dilepton/TableProducer/eventSelection.cxx b/PWGEM/Dilepton/TableProducer/eventSelection.cxx index 3e095375aad..d161b3803fc 100644 --- a/PWGEM/Dilepton/TableProducer/eventSelection.cxx +++ b/PWGEM/Dilepton/TableProducer/eventSelection.cxx @@ -36,14 +36,14 @@ struct EMEventSelection { // Configurables Configurable cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"}; - Configurable cfgCentMin{"cfgCentMin", 0.f, "min. centrality"}; + Configurable cfgCentMin{"cfgCentMin", -1.f, "min. centrality"}; Configurable cfgCentMax{"cfgCentMax", 999.f, "max. centrality"}; - Configurable cfgZvtxMax{"cfgZvtxMax", 10.f, "max. Zvtx"}; - Configurable cfgRequireSel8{"cfgRequireSel8", true, "require sel8 in event cut"}; - Configurable cfgRequireFT0AND{"cfgRequireFT0AND", true, "require FT0AND in event cut"}; - Configurable cfgRequireNoTFB{"cfgRequireNoTFB", true, "require No time frame border in event cut"}; - Configurable cfgRequireNoITSROFB{"cfgRequireNoITSROFB", true, "require no ITS readout frame border in event cut"}; + Configurable cfgZvtxMax{"cfgZvtxMax", 1e+10, "max. Zvtx"}; + Configurable cfgRequireSel8{"cfgRequireSel8", false, "require sel8 in event cut"}; + Configurable cfgRequireFT0AND{"cfgRequireFT0AND", false, "require FT0AND in event cut"}; + Configurable cfgRequireNoTFB{"cfgRequireNoTFB", false, "require No time frame border in event cut"}; + Configurable cfgRequireNoITSROFB{"cfgRequireNoITSROFB", false, "require no ITS readout frame border in event cut"}; Configurable cfgRequireNoSameBunchPileup{"cfgRequireNoSameBunchPileup", false, "require no same bunch pileup in event cut"}; Configurable cfgRequireGoodZvtxFT0vsPV{"cfgRequireGoodZvtxFT0vsPV", false, "require good Zvtx between FT0 vs. PV in event cut"}; Configurable cfgTrackOccupancyMin{"cfgTrackOccupancyMin", -2, "min. track occupancy"}; @@ -63,7 +63,7 @@ struct EMEventSelection { } } - if (fabs(collision.posZ()) > cfgZvtxMax) { + if (std::fabs(collision.posZ()) > cfgZvtxMax) { return false; } @@ -112,7 +112,7 @@ struct EMEventSelection { template void processEventSelection(TCollisions const& collisions) { - for (auto& collision : collisions) { + for (const auto& collision : collisions) { emevsel(isSelectedEvent(collision)); } // end of collision loop } // end of process diff --git a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h index 601d805dcf4..9e6905e8ab6 100644 --- a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h +++ b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h @@ -27,6 +27,7 @@ #include #include #include +#include #include "TString.h" #include "Math/Vector4D.h" @@ -91,6 +92,7 @@ struct Pi0EtaToGammaGamma { Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; Configurable skipGRPOquery{"skipGRPOquery", true, "skip grpo query"}; Configurable d_bz_input{"d_bz_input", -999, "bz field in kG, -999 is automatic"}; + Configurable ndiff_bc_mix{"ndiff_bc_mix", 198, "difference in global BC required in mixed events"}; Configurable cfgQvecEstimator{"cfgQvecEstimator", 0, "FT0M:0, FT0A:1, FT0C:2"}; Configurable cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"}; @@ -263,6 +265,7 @@ struct Pi0EtaToGammaGamma { fRegistry.addClone("Pair/same/", "Pair/rotation/"); emcalGeom = o2::emcal::Geometry::GetInstanceFromRunNumber(300000); } + fRegistry.add("Pair/mix/hDiffBC", "diff. global BC in mixed event;|BC_{current} - BC_{mixed}|", kTH1D, {{10001, -0.5, 10000.5}}, true); mRunNumber = 0; d_bz = 0; @@ -323,6 +326,7 @@ struct Pi0EtaToGammaGamma { used_photonIds.shrink_to_fit(); used_dileptonIds.clear(); used_dileptonIds.shrink_to_fit(); + map_mixed_eventId_to_globalBC.clear(); } void DefineEMEventCut() @@ -550,6 +554,7 @@ struct Pi0EtaToGammaGamma { MyEMH* emh2 = nullptr; std::vector> used_photonIds; // std::vector> used_dileptonIds; // + std::map, uint64_t> map_mixed_eventId_to_globalBC; template void runPairing(TCollisions const& collisions, @@ -773,6 +778,13 @@ struct Pi0EtaToGammaGamma { continue; } + auto globalBC_mix = map_mixed_eventId_to_globalBC[mix_dfId_collisionId]; + uint64_t diffBC = std::max(collision.globalBC(), globalBC_mix) - std::min(collision.globalBC(), globalBC_mix); + fRegistry.fill(HIST("Pair/mix/hDiffBC"), diffBC); + if (diffBC < ndiff_bc_mix) { + continue; + } + auto photons1_from_event_pool = emh1->GetTracksPerCollision(mix_dfId_collisionId); // LOGF(info, "Do event mixing: current event (%d, %d), ngamma = %d | event pool (%d, %d), ngamma = %d", ndf, collision.globalIndex(), selected_photons1_in_this_event.size(), mix_dfId, mix_collisionId, photons1_from_event_pool.size()); @@ -799,6 +811,13 @@ struct Pi0EtaToGammaGamma { continue; } + auto globalBC_mix = map_mixed_eventId_to_globalBC[mix_dfId_collisionId]; + uint64_t diffBC = std::max(collision.globalBC(), globalBC_mix) - std::min(collision.globalBC(), globalBC_mix); + fRegistry.fill(HIST("Pair/mix/hDiffBC"), diffBC); + if (diffBC < ndiff_bc_mix) { + continue; + } + auto photons2_from_event_pool = emh2->GetTracksPerCollision(mix_dfId_collisionId); // LOGF(info, "Do event mixing: current event (%d, %d), ngamma = %d | event pool (%d, %d), nll = %d", ndf, collision.globalIndex(), selected_photons1_in_this_event.size(), mix_dfId, mix_collisionId, photons2_from_event_pool.size()); @@ -825,6 +844,13 @@ struct Pi0EtaToGammaGamma { continue; } + auto globalBC_mix = map_mixed_eventId_to_globalBC[mix_dfId_collisionId]; + uint64_t diffBC = std::max(collision.globalBC(), globalBC_mix) - std::min(collision.globalBC(), globalBC_mix); + fRegistry.fill(HIST("Pair/mix/hDiffBC"), diffBC); + if (diffBC < ndiff_bc_mix) { + continue; + } + auto photons1_from_event_pool = emh1->GetTracksPerCollision(mix_dfId_collisionId); // LOGF(info, "Do event mixing: current event (%d, %d), nll = %d | event pool (%d, %d), ngamma = %d", ndf, collision.globalIndex(), selected_photons2_in_this_event.size(), mix_dfId, mix_collisionId, photons1_from_event_pool.size()); @@ -848,6 +874,7 @@ struct Pi0EtaToGammaGamma { if (ndiphoton > 0) { emh1->AddCollisionIdAtLast(key_bin, key_df_collision); emh2->AddCollisionIdAtLast(key_bin, key_df_collision); + map_mixed_eventId_to_globalBC[key_df_collision] = collision.globalBC(); } } // end of collision loop diff --git a/PWGEM/PhotonMeson/Core/TaggingPi0.h b/PWGEM/PhotonMeson/Core/TaggingPi0.h index a22d93da0c0..d74af2ceb0c 100644 --- a/PWGEM/PhotonMeson/Core/TaggingPi0.h +++ b/PWGEM/PhotonMeson/Core/TaggingPi0.h @@ -27,6 +27,7 @@ #include #include #include +#include #include "TString.h" #include "Math/Vector4D.h" @@ -85,6 +86,7 @@ struct TaggingPi0 { Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; Configurable skipGRPOquery{"skipGRPOquery", true, "skip grpo query"}; Configurable d_bz_input{"d_bz_input", -999, "bz field in kG, -999 is automatic"}; + Configurable ndiff_bc_mix{"ndiff_bc_mix", 198, "difference in global BC required in mixed events"}; Configurable cfgQvecEstimator{"cfgQvecEstimator", 0, "FT0M:0, FT0A:1, FT0C:2"}; Configurable cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"}; @@ -306,6 +308,7 @@ struct TaggingPi0 { used_photonIds.shrink_to_fit(); used_dileptonIds.clear(); used_dileptonIds.shrink_to_fit(); + map_mixed_eventId_to_globalBC.clear(); } void addHistogrms() @@ -324,6 +327,7 @@ struct TaggingPi0 { fRegistry.add("Photon/hEtaPhi", "#varphi vs. #eta;#varphi_{#gamma} (rad.);#eta_{#gamma}", kTH2D, {{90, 0, 2 * M_PI}, {40, -1, +1}}, true); fRegistry.add("Pair/same/hMvsPt", "mass vs. p_{T,#gamma}", kTH2D, {axis_m, axis_pt}, true); fRegistry.addClone("Pair/same/", "Pair/mix/"); + fRegistry.add("Pair/mix/hDiffBC", "diff. global BC in mixed event;|BC_{current} - BC_{mixed}|", kTH1D, {{10001, -0.5, 10000.5}}, true); } void DefineEMEventCut() @@ -450,6 +454,7 @@ struct TaggingPi0 { MyEMH* emh2 = nullptr; std::vector> used_photonIds; // std::vector> used_dileptonIds; // + std::map, uint64_t> map_mixed_eventId_to_globalBC; template void runPairing(TCollisions const& collisions, @@ -622,6 +627,13 @@ struct TaggingPi0 { continue; } + auto globalBC_mix = map_mixed_eventId_to_globalBC[mix_dfId_collisionId]; + uint64_t diffBC = std::max(collision.globalBC(), globalBC_mix) - std::min(collision.globalBC(), globalBC_mix); + fRegistry.fill(HIST("Pair/mix/hDiffBC"), diffBC); + if (diffBC < ndiff_bc_mix) { + continue; + } + auto photons2_from_event_pool = emh2->GetTracksPerCollision(mix_dfId_collisionId); // LOGF(info, "Do event mixing: current event (%d, %d), ngamma = %d | event pool (%d, %d), nll = %d", ndf, collision.globalIndex(), selected_photons1_in_this_event.size(), mix_dfId, mix_collisionId, photons2_from_event_pool.size()); @@ -641,6 +653,7 @@ struct TaggingPi0 { if (ndiphoton > 0) { emh1->AddCollisionIdAtLast(key_bin, key_df_collision); emh2->AddCollisionIdAtLast(key_bin, key_df_collision); + map_mixed_eventId_to_globalBC[key_df_collision] = collision.globalBC(); } } // end of collision loop diff --git a/PWGEM/PhotonMeson/Core/TaggingPi0MC.h b/PWGEM/PhotonMeson/Core/TaggingPi0MC.h index 875b1c60e78..c2c844f4f5e 100644 --- a/PWGEM/PhotonMeson/Core/TaggingPi0MC.h +++ b/PWGEM/PhotonMeson/Core/TaggingPi0MC.h @@ -89,6 +89,7 @@ struct TaggingPi0MC { Configurable cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"}; Configurable cfgCentMin{"cfgCentMin", 0, "min. centrality"}; Configurable cfgCentMax{"cfgCentMax", 999, "max. centrality"}; + Configurable fd_k0s_to_pi0{"fd_k0s_pi0", "1.0", "feed down correction to pi0"}; Configurable cfgRequireTrueAssociation{"cfgRequireTrueAssociation", false, "flag to require true mc collision association"}; ConfigurableAxis ConfPtBins{"ConfPtBins", {100, 0, 10}, "pT bins for output histograms"}; @@ -207,6 +208,7 @@ struct TaggingPi0MC { Service ccdb; int mRunNumber; float d_bz; + TF1* f1fd_k0s_to_pi0; void init(InitContext&) { @@ -220,6 +222,7 @@ struct TaggingPi0MC { mRunNumber = 0; d_bz = 0; + f1fd_k0s_to_pi0 = new TF1("f1fd_k0s_to_pi0", TString(fd_k0s_to_pi0), 0.f, 100.f); ccdb->setURL(ccdburl); ccdb->setCaching(true); @@ -266,7 +269,11 @@ struct TaggingPi0MC { mRunNumber = collision.runNumber(); } - ~TaggingPi0MC() {} + ~TaggingPi0MC() + { + delete f1fd_k0s_to_pi0; + f1fd_k0s_to_pi0 = 0x0; + } void addHistogrms() { @@ -479,8 +486,14 @@ struct TaggingPi0MC { } } } else if (IsFromWD(g1mc.template emmcevent_as(), g1mc, mcparticles) > 0) { - fRegistry.fill(HIST("Photon/fromWD/hPt"), v_gamma.Pt(), collision.weight()); - fRegistry.fill(HIST("Photon/fromWD/hEtaPhi"), v_gamma.Phi() > 0 ? v_gamma.Phi() : v_gamma.Phi() + 2 * M_PI, v_gamma.Eta(), collision.weight()); + int motherid_strhad = IsFromWD(g1mc.template emmcevent_as(), g1mc, mcparticles); + auto str_had = mcparticles.iteratorAt(motherid_strhad); + float weight = 1.f; + if (std::abs(str_had.pdgCode()) == 310 && f1fd_k0s_to_pi0 != nullptr) { + weight = f1fd_k0s_to_pi0->Eval(str_had.pt()); + } + fRegistry.fill(HIST("Photon/fromWD/hPt"), v_gamma.Pt(), collision.weight() * weight); + fRegistry.fill(HIST("Photon/fromWD/hEtaPhi"), v_gamma.Phi() > 0 ? v_gamma.Phi() : v_gamma.Phi() + 2 * M_PI, v_gamma.Eta(), collision.weight() * weight); } else { fRegistry.fill(HIST("Photon/fromHS/hPt"), v_gamma.Pt(), collision.weight()); fRegistry.fill(HIST("Photon/fromHS/hEtaPhi"), v_gamma.Phi() > 0 ? v_gamma.Phi() : v_gamma.Phi() + 2 * M_PI, v_gamma.Eta(), collision.weight()); @@ -519,7 +532,13 @@ struct TaggingPi0MC { if (pi0mc.isPhysicalPrimary() || pi0mc.producedByGenerator()) { fRegistry.fill(HIST("Pair/primary/hMvsPt"), veeg.M(), v_gamma.Pt(), collision.weight()); } else if (IsFromWD(pi0mc.template emmcevent_as(), pi0mc, mcparticles) > 0) { - fRegistry.fill(HIST("Pair/fromWD/hMvsPt"), veeg.M(), v_gamma.Pt(), collision.weight()); + int motherid_strhad = IsFromWD(pi0mc.template emmcevent_as(), pi0mc, mcparticles); + auto str_had = mcparticles.iteratorAt(motherid_strhad); + float weight = 1.f; + if (std::abs(str_had.pdgCode()) == 310 && f1fd_k0s_to_pi0 != nullptr) { + weight = f1fd_k0s_to_pi0->Eval(str_had.pt()); + } + fRegistry.fill(HIST("Pair/fromWD/hMvsPt"), veeg.M(), v_gamma.Pt(), collision.weight() * weight); } else { fRegistry.fill(HIST("Pair/fromHS/hMvsPt"), veeg.M(), v_gamma.Pt(), collision.weight()); } diff --git a/PWGEM/PhotonMeson/Core/V0PhotonCut.cxx b/PWGEM/PhotonMeson/Core/V0PhotonCut.cxx index d00d8366d34..07d805fa291 100644 --- a/PWGEM/PhotonMeson/Core/V0PhotonCut.cxx +++ b/PWGEM/PhotonMeson/Core/V0PhotonCut.cxx @@ -229,12 +229,6 @@ void V0PhotonCut::SetRequireTPCTOF(bool flag) LOG(info) << "V0 Photon Cut, require TPC-TOF track: " << mRequireTPCTOF; } -void V0PhotonCut::SetRequireTPCTRDTOF(bool flag) -{ - mRequireTPCTRDTOF = flag; - LOG(info) << "V0 Photon Cut, require TPC-TOF track: " << mRequireTPCTRDTOF; -} - void V0PhotonCut::SetDisableITSonly(bool flag) { mDisableITSonly = flag; diff --git a/PWGEM/PhotonMeson/Core/V0PhotonCut.h b/PWGEM/PhotonMeson/Core/V0PhotonCut.h index afcc0030544..d6064ab8786 100644 --- a/PWGEM/PhotonMeson/Core/V0PhotonCut.h +++ b/PWGEM/PhotonMeson/Core/V0PhotonCut.h @@ -70,7 +70,6 @@ class V0PhotonCut : public TNamed kRequireTPConly, kRequireTPCTRD, kRequireTPCTOF, - kRequireTPCTRDTOF, kNCuts }; @@ -198,9 +197,6 @@ class V0PhotonCut : public TNamed if (mRequireTPCTOF && !IsSelectedTrack(track, V0PhotonCuts::kRequireTPCTOF)) { return false; } - if (mRequireTPCTRDTOF && !IsSelectedTrack(track, V0PhotonCuts::kRequireTPCTRDTOF)) { - return false; - } } return true; } @@ -429,9 +425,6 @@ class V0PhotonCut : public TNamed case V0PhotonCuts::kRequireTPCTOF: return isTPCTOFTrack(track); - case V0PhotonCuts::kRequireTPCTRDTOF: - return isTPCTRDTOFTrack(track); - default: return false; } @@ -477,7 +470,6 @@ class V0PhotonCut : public TNamed void SetRequireTPConly(bool flag); void SetRequireTPCTRD(bool flag); void SetRequireTPCTOF(bool flag); - void SetRequireTPCTRDTOF(bool flag); void SetDisableITSonly(bool flag); void SetDisableTPConly(bool flag); @@ -529,7 +521,6 @@ class V0PhotonCut : public TNamed bool mRequireTPConly{false}; bool mRequireTPCTRD{false}; bool mRequireTPCTOF{false}; - bool mRequireTPCTRDTOF{false}; bool mDisableITSonly{false}; bool mDisableTPConly{false}; diff --git a/PWGEM/PhotonMeson/TableProducer/associateMCinfoPhoton.cxx b/PWGEM/PhotonMeson/TableProducer/associateMCinfoPhoton.cxx index 3f06fd2fb60..2fafc5118e3 100644 --- a/PWGEM/PhotonMeson/TableProducer/associateMCinfoPhoton.cxx +++ b/PWGEM/PhotonMeson/TableProducer/associateMCinfoPhoton.cxx @@ -33,7 +33,7 @@ using namespace o2::framework::expressions; using namespace o2::soa; using namespace o2::aod::pwgem::photonmeson::utils::mcutil; -using MyCollisionsMC = soa::Join; +using MyCollisionsMC = soa::Join; using TracksMC = soa::Join; using FwdTracksMC = soa::Join; using MyEMCClusters = soa::Join; @@ -55,7 +55,6 @@ struct AssociateMCInfoPhoton { Produces binnedGenPt; - Configurable applyEveSel_at_skimming{"applyEveSel_at_skimming", false, "flag to apply minimal event selection at the skimming level"}; Configurable max_eta_gen_secondary{"max_eta_gen_secondary", 0.9, "max eta to store generated information"}; Configurable margin_z_gen{"margin_z_gen", 15.f, "margin for Z of true photon conversion point to store generated information"}; Configurable max_rxy_gen{"max_rxy_gen", 100, "max rxy to store generated information"}; @@ -132,7 +131,7 @@ struct AssociateMCInfoPhoton { continue; } - if (applyEveSel_at_skimming && (!collision.selection_bit(o2::aod::evsel::kIsTriggerTVX) || !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder))) { + if (!collision.isSelected()) { continue; } diff --git a/PWGEM/PhotonMeson/TableProducer/createEMEventPhoton.cxx b/PWGEM/PhotonMeson/TableProducer/createEMEventPhoton.cxx index f1d78bd76b6..c325ff875c6 100644 --- a/PWGEM/PhotonMeson/TableProducer/createEMEventPhoton.cxx +++ b/PWGEM/PhotonMeson/TableProducer/createEMEventPhoton.cxx @@ -40,7 +40,7 @@ using namespace o2::soa; using MyBCs = soa::Join; using MyQvectors = soa::Join; -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; using MyCollisionsCent = soa::Join; // centrality table has dependency on multiplicity table. using MyCollisionsCentQvec = soa::Join; @@ -69,7 +69,6 @@ struct CreateEMEventPhoton { Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; Configurable skipGRPOquery{"skipGRPOquery", true, "skip grpo query"}; Configurable dBzInput{"d_bz", -999, "bz field, -999 is automatic"}; - Configurable applyEveSelAtSkimming{"applyEveSel_at_skimming", false, "flag to apply minimal event selection at the skimming level"}; Configurable needEMCTrigger{"needEMCTrigger", false, "flag to only save events which have kTVXinEMC trigger bit. To reduce PbPb derived data size"}; Configurable needPHSTrigger{"needPHSTrigger", false, "flag to only save events which have kTVXinPHOS trigger bit. To reduce PbPb derived data size"}; Configurable enableJJHistograms{"enableJJHistograms", false, "flag to fill JJ QA histograms for outlier rejection"}; @@ -143,7 +142,7 @@ struct CreateEMEventPhoton { auto bc = collision.template foundBC_as(); initCCDB(bc); - if (applyEveSelAtSkimming && (!collision.selection_bit(o2::aod::evsel::kIsTriggerTVX) || !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder))) { + if (!collision.isSelected()) { continue; } if (needEMCTrigger && !collision.alias_bit(kTVXinEMC)) { @@ -210,13 +209,13 @@ struct CreateEMEventPhoton { if (!collision.has_mcCollision()) { continue; } + if (!collision.isSelected()) { + continue; + } auto bc = collision.template foundBC_as(); initCCDB(bc); - if (applyEveSelAtSkimming && (!collision.selection_bit(o2::aod::evsel::kIsTriggerTVX) || !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder))) { - continue; - } auto mcCollision = collision.mcCollision_as(); // Outlier rejection: Set weight to 0 for events with large pTJet/pTHard diff --git a/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx b/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx index 96fc0d0d6d8..b8c46daa494 100644 --- a/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx +++ b/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx @@ -61,7 +61,7 @@ using namespace o2::constants::physics; using namespace o2::pwgem::photonmeson; using std::array; -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; using MyCollisionsWithSWT = soa::Join; using MyCollisionsMC = soa::Join; @@ -81,18 +81,17 @@ struct PhotonConversionBuilder { Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; Configurable skipGRPOquery{"skipGRPOquery", true, "skip grpo query"}; - Configurable inherit_from_emevent_photon{"inherit_from_emevent_photon", false, "flag to inherit task options from emevent-photon"}; // Operation and minimisation criteria Configurable d_bz_input{"d_bz", -999, "bz field, -999 is automatic"}; Configurable useMatCorrType{"useMatCorrType", 0, "0: none, 1: TGeo, 2: LUT"}; - Configurable applyEveSel_at_skimming{"applyEveSel_at_skimming", false, "flag to apply minimal event selection at the skimming level"}; // single track cuts Configurable min_ncluster_tpc{"min_ncluster_tpc", 0, "min ncluster tpc"}; Configurable mincrossedrows{"mincrossedrows", 40, "min crossed rows"}; Configurable moveTPCTracks{"moveTPCTracks", true, "Move TPC-only tracks under the collision assumption"}; Configurable disableITSonlyTracks{"disableITSonlyTracks", false, "disable ITSonly tracks in V0 legs"}; + Configurable disableTPConlyTracks{"disableTPConlyTracks", false, "disable TPConly tracks in V0 legs"}; Configurable maxchi2tpc{"maxchi2tpc", 5.0, "max chi2/NclsTPC"}; // default 4.0 + 1.0 Configurable maxchi2its{"maxchi2its", 6.0, "max chi2/NclsITS"}; // default 5.0 + 1.0 @@ -173,7 +172,7 @@ struct PhotonConversionBuilder { {"V0Leg/hXZ", "track iu x vs. z;z (cm);x (cm)", {HistType::kTH2F, {{200, -100.f, 100.f}, {200, 0.f, 100.f}}}}, }}; - void init(InitContext& initContext) + void init(InitContext&) { mRunNumber = 0; d_bz = 0; @@ -185,10 +184,6 @@ struct PhotonConversionBuilder { ccdb->setLocalObjectValidityChecking(); ccdb->setFatalWhenNull(false); - if (inherit_from_emevent_photon) { - getTaskOptionValue(initContext, "create-emevent-photon", "applyEveSel_at_skimming", applyEveSel_at_skimming.value, true); - } - if (useMatCorrType == 1) { LOGF(info, "TGeo correction requested, loading geometry"); if (!o2::base::GeometryManager::isGeometryLoaded()) { @@ -281,6 +276,10 @@ struct PhotonConversionBuilder { return false; } + if (disableTPConlyTracks && isTPConlyTrack(track)) { + return false; + } + if (track.x() > maxX) { return false; } @@ -690,10 +689,8 @@ struct PhotonConversionBuilder { } } - if constexpr (enableFilter) { - if (!collision.isSelected()) { - continue; - } + if (!collision.isSelected()) { + continue; } if constexpr (isTriggerAnalysis) { @@ -708,10 +705,6 @@ struct PhotonConversionBuilder { initCCDB(bc); registry.fill(HIST("hCollisionCounter"), 1); - if (applyEveSel_at_skimming && (!collision.selection_bit(o2::aod::evsel::kIsTriggerTVX) || !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder))) { - continue; - } - updateCCDB(bc); // delay update until is needed const auto& v0s_per_coll = v0s.sliceBy(perCollision, collision.globalIndex()); @@ -836,13 +829,13 @@ struct PhotonConversionBuilder { } PROCESS_SWITCH(PhotonConversionBuilder, processMC, "process reconstructed info for MC", false); - void processRec_OnlyIfDielectron(soa::Join const& collisions, filteredV0s const& v0s, MyTracksIU const& tracks, aod::BCsWithTimestamps const& bcs) + void processRec_OnlyIfDielectron(soa::Join const& collisions, filteredV0s const& v0s, MyTracksIU const& tracks, aod::BCsWithTimestamps const& bcs) { build(collisions, v0s, tracks, bcs); } PROCESS_SWITCH(PhotonConversionBuilder, processRec_OnlyIfDielectron, "process reconstructed info for data", false); - void processRec_SWT_OnlyIfDielectron(soa::Join const& collisions, filteredV0s const& v0s, MyTracksIU const& tracks, aod::BCsWithTimestamps const& bcs) + void processRec_SWT_OnlyIfDielectron(soa::Join const& collisions, filteredV0s const& v0s, MyTracksIU const& tracks, aod::BCsWithTimestamps const& bcs) { build(collisions, v0s, tracks, bcs); } diff --git a/PWGEM/PhotonMeson/TableProducer/skimmerGammaCalo.cxx b/PWGEM/PhotonMeson/TableProducer/skimmerGammaCalo.cxx index 701aa70e195..da85ef3c8b4 100644 --- a/PWGEM/PhotonMeson/TableProducer/skimmerGammaCalo.cxx +++ b/PWGEM/PhotonMeson/TableProducer/skimmerGammaCalo.cxx @@ -53,12 +53,10 @@ struct skimmerGammaCalo { Configurable> clusterDefinitions{"clusterDefinitions", {0, 1, 2, 10, 11, 12, 13, 20, 21, 22, 30, 40, 41, 42, 43, 44, 45}, "Cluster definitions to be accepted (e.g. 13 for kV3MostSplitLowSeed)"}; Configurable maxdEta{"maxdEta", 0.1, "Set a maximum difference in eta for tracks and cluster to still count as matched"}; Configurable maxdPhi{"maxdPhi", 0.1, "Set a maximum difference in phi for tracks and cluster to still count as matched"}; - Configurable applyEveSel_at_skimming{"applyEveSel_at_skimming", false, "flag to apply minimal event selection at the skimming level"}; - Configurable inherit_from_emevent_photon{"inherit_from_emevent_photon", false, "flag to inherit task options from emevent-photon"}; HistogramRegistry historeg{"output", {}, OutputObjHandlingPolicy::AnalysisObject, false, false}; - void init(o2::framework::InitContext& initContext) + void init(o2::framework::InitContext&) { historeg.add("DefinitionIn", "Cluster definitions before cuts;#bf{Cluster definition};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{51, -0.5, 50.5}}); historeg.add("DefinitionOut", "Cluster definitions after cuts;#bf{Cluster definition};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{51, -0.5, 50.5}}); @@ -78,20 +76,17 @@ struct skimmerGammaCalo { hCaloClusterFilter->GetXaxis()->SetBinLabel(5, "M02 cut"); hCaloClusterFilter->GetXaxis()->SetBinLabel(6, "out"); - if (inherit_from_emevent_photon) { - getTaskOptionValue(initContext, "create-emevent-photon", "applyEveSel_at_skimming", applyEveSel_at_skimming.value, true); // for EM users. - } - LOG(info) << "| Timing cut: " << minTime << " < t < " << maxTime; LOG(info) << "| M02 cut: " << minM02 << " < M02 < " << maxM02; LOG(info) << "| E cut: E > " << minE; } - void processRec(soa::Join::iterator const& collision, aod::EMCALClusters const& emcclusters, aod::EMCALClusterCells const& emcclustercells, aod::EMCALMatchedTracks const& emcmatchedtracks, aod::FullTracks const&) + void processRec(soa::Join::iterator const& collision, aod::EMCALClusters const& emcclusters, aod::EMCALClusterCells const& emcclustercells, aod::EMCALMatchedTracks const& emcmatchedtracks, aod::FullTracks const&) { - if (applyEveSel_at_skimming && (!collision.selection_bit(o2::aod::evsel::kIsTriggerTVX) || !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder))) { + if (!collision.isSelected()) { return; } + for (const auto& emccluster : emcclusters) { historeg.fill(HIST("hCaloClusterFilter"), 0); @@ -164,11 +159,12 @@ struct skimmerGammaCalo { emccluster.nCells(), emccluster.time(), emccluster.isExotic(), vEta, vPhi, vP, vPt); } } - void processMC(soa::Join::iterator const& collision, soa::Join const& emcclusters, aod::McParticles const&) + void processMC(soa::Join::iterator const& collision, soa::Join const& emcclusters, aod::McParticles const&) { - if (applyEveSel_at_skimming && (!collision.selection_bit(o2::aod::evsel::kIsTriggerTVX) || !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder))) { + if (!collision.isSelected()) { return; } + for (const auto& emccluster : emcclusters) { // Definition cut diff --git a/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx b/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx index a0c9ccfd5e6..7f840cb179c 100644 --- a/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx +++ b/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx @@ -39,7 +39,7 @@ using namespace o2::framework::expressions; using namespace o2::constants::physics; using namespace o2::pwgem::photonmeson; -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; using MyCollisionsMC = soa::Join; using MyTracks = soa::Join; using MyTrack = MyTracks::iterator; @@ -58,7 +58,6 @@ struct skimmerPrimaryElectronFromDalitzEE { Configurable skipGRPOquery{"skipGRPOquery", true, "skip grpo query"}; // Operation and minimisation criteria - Configurable applyEveSel_at_skimming{"applyEveSel_at_skimming", false, "flag to apply minimal event selection at the skimming level"}; Configurable d_bz_input{"d_bz_input", -999, "bz field in kG, -999 is automatic"}; Configurable min_ncluster_tpc{"min_ncluster_tpc", 0, "min ncluster tpc"}; Configurable mincrossedrows{"mincrossedrows", 70, "min. crossed rows"}; @@ -374,10 +373,10 @@ struct skimmerPrimaryElectronFromDalitzEE { for (const auto& collision : collisions) { auto bc = collision.template foundBC_as(); initCCDB(bc); - - if (applyEveSel_at_skimming && (!collision.selection_bit(o2::aod::evsel::kIsTriggerTVX) || !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder))) { + if (!collision.isSelected()) { continue; } + if (collision.ngpcm() < 1) { continue; } @@ -409,12 +408,12 @@ struct skimmerPrimaryElectronFromDalitzEE { if (!collision.has_mcCollision()) { continue; } + if (!collision.isSelected()) { + continue; + } auto bc = collision.template foundBC_as(); initCCDB(bc); - if (applyEveSel_at_skimming && (!collision.selection_bit(o2::aod::evsel::kIsTriggerTVX) || !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder))) { - continue; - } if (collision.ngpcm() < 1) { continue; } diff --git a/PWGEM/PhotonMeson/Tasks/CMakeLists.txt b/PWGEM/PhotonMeson/Tasks/CMakeLists.txt index cc011f303f4..88edd482b19 100644 --- a/PWGEM/PhotonMeson/Tasks/CMakeLists.txt +++ b/PWGEM/PhotonMeson/Tasks/CMakeLists.txt @@ -94,16 +94,6 @@ o2physics_add_dpl_workflow(pi0eta-to-gammagamma-mc-emcemc PUBLIC_LINK_LIBRARIES O2::Framework O2::EMCALBase O2::EMCALCalib O2Physics::AnalysisCore O2Physics::PWGEMPhotonMesonCore COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(tagging-pi0 - SOURCES TaggingPi0.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2::EMCALBase O2::EMCALCalib O2Physics::AnalysisCore O2Physics::PWGEMPhotonMesonCore O2Physics::MLCore - COMPONENT_NAME Analysis) - -o2physics_add_dpl_workflow(tagging-pi0-mc - SOURCES TaggingPi0MC.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2::EMCALBase O2::EMCALCalib O2Physics::AnalysisCore O2Physics::PWGEMPhotonMesonCore O2Physics::MLCore - COMPONENT_NAME Analysis) - o2physics_add_dpl_workflow(tag-and-probe SOURCES TagAndProbe.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2::EMCALBase O2::EMCALCalib O2Physics::AnalysisCore O2Physics::PWGEMPhotonMesonCore O2Physics::MLCore diff --git a/PWGEM/PhotonMeson/Tasks/TaggingPi0.cxx b/PWGEM/PhotonMeson/Tasks/TaggingPi0.cxx deleted file mode 100644 index 4d00ddb1a21..00000000000 --- a/PWGEM/PhotonMeson/Tasks/TaggingPi0.cxx +++ /dev/null @@ -1,585 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. -// -// ======================== -// -// This code runs loop over photons with PCM and PHOS for direct photon analysis. -// Please write to: daiki.sekihata@cern.ch - -#include -#include - -#include "TString.h" -#include "Math/Vector4D.h" -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoAHelpers.h" -#include "Common/Core/RecoDecay.h" - -#include "DetectorsBase/GeometryManager.h" -#include "DataFormatsParameters/GRPObject.h" -#include "DataFormatsParameters/GRPMagField.h" -#include "CCDB/BasicCCDBManager.h" - -#include "PWGEM/PhotonMeson/Utils/PairUtilities.h" -#include "PWGEM/PhotonMeson/DataModel/gammaTables.h" -#include "PWGEM/PhotonMeson/Core/V0PhotonCut.h" -#include "PWGEM/PhotonMeson/Core/DalitzEECut.h" -#include "PWGEM/PhotonMeson/Core/PHOSPhotonCut.h" -#include "PWGEM/PhotonMeson/Core/EMCPhotonCut.h" -#include "PWGEM/PhotonMeson/Core/PairCut.h" -#include "PWGEM/PhotonMeson/Core/CutsLibrary.h" -#include "PWGEM/PhotonMeson/Core/HistogramsLibrary.h" - -using namespace o2; -using namespace o2::aod; -using namespace o2::framework; -using namespace o2::framework::expressions; -using namespace o2::soa; -using namespace o2::aod::pwgem::photonmeson::photonpair; -using namespace o2::aod::pwgem::photon; - -using MyCollisions = soa::Join; -using MyCollision = MyCollisions::iterator; - -using MyV0Photons = soa::Join; -using MyV0Photon = MyV0Photons::iterator; - -using MyDalitzEEs = soa::Join; -using MyDalitzEE = MyDalitzEEs::iterator; - -using MyPrimaryElectrons = soa::Join; -using MyPrimaryElectron = MyPrimaryElectrons::iterator; - -struct TaggingPi0 { - - // Configurables - Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; - Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; - Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; - Configurable skipGRPOquery{"skipGRPOquery", true, "skip grpo query"}; - Configurable d_bz_input{"d_bz_input", -999, "bz field in kG, -999 is automatic"}; - - Configurable cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"}; - Configurable cfgCentMin{"cfgCentMin", 0, "min. centrality"}; - Configurable cfgCentMax{"cfgCentMax", 999, "max. centrality"}; - - // Configurable maxY{"maxY", 0.9, "maximum rapidity for reconstructed particles"}; - Configurable fConfigPCMCuts{"cfgPCMCuts", "qc", "Comma separated list of V0 photon cuts"}; - Configurable fConfigDalitzEECuts{"cfgDalitzEECuts", "mee_0_120_tpchadrejortofreq,mee_0_120_tpchadrejortofreq_lowB", "Comma separated list of Dalitz ee cuts"}; - Configurable fConfigPHOSCuts{"cfgPHOSCuts", "test02,test03", "Comma separated list of PHOS photon cuts"}; - Configurable fConfigEMCCuts{"cfgEMCCuts", "standard", "Comma separated list of EMCal photon cuts"}; - Configurable fConfigPairCuts{"cfgPairCuts", "nocut", "Comma separated list of pair cuts"}; - - // Configurable for EMCal cuts - Configurable EMC_minTime{"EMC_minTime", -20., "Minimum cluster time for EMCal time cut"}; - Configurable EMC_maxTime{"EMC_maxTime", +25., "Maximum cluster time for EMCal time cut"}; - Configurable EMC_minM02{"EMC_minM02", 0.1, "Minimum M02 for EMCal M02 cut"}; - Configurable EMC_maxM02{"EMC_maxM02", 0.7, "Maximum M02 for EMCal M02 cut"}; - Configurable EMC_minE{"EMC_minE", 0.7, "Minimum cluster energy for EMCal energy cut"}; - Configurable EMC_minNCell{"EMC_minNCell", 1, "Minimum number of cells per cluster for EMCal NCell cut"}; - Configurable> EMC_TM_Eta{"EMC_TM_Eta", {0.01f, 4.07f, -2.5f}, "|eta| <= [0]+(pT+[1])^[2] for EMCal track matching"}; - Configurable> EMC_TM_Phi{"EMC_TM_Phi", {0.015f, 3.65f, -2.f}, "|phi| <= [0]+(pT+[1])^[2] for EMCal track matching"}; - Configurable EMC_Eoverp{"EMC_Eoverp", 1.75, "Minimum cluster energy over track momentum for EMCal track matching"}; - Configurable EMC_UseExoticCut{"EMC_UseExoticCut", true, "FLag to use the EMCal exotic cluster cut"}; - - Configurable fConfigEMEventCut{"cfgEMEventCut", "minbias", "em event cut"}; // only 1 event cut per wagon - EMPhotonEventCut fEMEventCut; - static constexpr std::string_view event_types[2] = {"before", "after"}; - - OutputObj fOutputEvent{"Event"}; - OutputObj fOutputPair{"Pair"}; // 2-photon pair - THashList* fMainList = new THashList(); - - std::vector fPCMCuts; - std::vector fDalitzEECuts; - std::vector fPHOSCuts; - std::vector fEMCCuts; - std::vector fPairCuts; - - std::vector fPairNames; - - Service ccdb; - int mRunNumber; - float d_bz; - - void init(InitContext& context) - { - if (context.mOptions.get("processPCMDalitzEE")) { - fPairNames.push_back("PCMDalitzEE"); - } - if (context.mOptions.get("processPCMPHOS")) { - fPairNames.push_back("PCMPHOS"); - } - if (context.mOptions.get("processPCMEMC")) { - fPairNames.push_back("PCMEMC"); - } - - DefinePCMCuts(); - DefineDalitzEECuts(); - DefinePHOSCuts(); - DefineEMCCuts(); - DefinePairCuts(); - addhistograms(); - TString ev_cut_name = fConfigEMEventCut.value; - fEMEventCut = *eventcuts::GetCut(ev_cut_name.Data()); - - fOutputEvent.setObject(reinterpret_cast(fMainList->FindObject("Event"))); - fOutputPair.setObject(reinterpret_cast(fMainList->FindObject("Pair"))); - - mRunNumber = 0; - d_bz = 0; - - ccdb->setURL(ccdburl); - ccdb->setCaching(true); - ccdb->setLocalObjectValidityChecking(); - ccdb->setFatalWhenNull(false); - } - - template - void initCCDB(TCollision const& collision) - { - if (mRunNumber == collision.runNumber()) { - return; - } - - // In case override, don't proceed, please - no CCDB access required - if (d_bz_input > -990) { - d_bz = d_bz_input; - o2::parameters::GRPMagField grpmag; - if (fabs(d_bz) > 1e-5) { - grpmag.setL3Current(30000.f / (d_bz / 5.0f)); - } - mRunNumber = collision.runNumber(); - return; - } - - auto run3grp_timestamp = collision.timestamp(); - o2::parameters::GRPObject* grpo = 0x0; - o2::parameters::GRPMagField* grpmag = 0x0; - if (!skipGRPOquery) - grpo = ccdb->getForTimeStamp(grpPath, run3grp_timestamp); - if (grpo) { - // Fetch magnetic field from ccdb for current collision - d_bz = grpo->getNominalL3Field(); - LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; - } else { - grpmag = ccdb->getForTimeStamp(grpmagPath, run3grp_timestamp); - if (!grpmag) { - LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for timestamp " << run3grp_timestamp; - } - // Fetch magnetic field from ccdb for current collision - d_bz = std::lround(5.f * grpmag->getL3Current() / 30000.f); - LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; - } - mRunNumber = collision.runNumber(); - } - - template - void add_pair_histograms(THashList* list_pair, const std::string pairname, TCuts1 const& cuts1, TCuts2 const& cuts2, TCuts3 const& cuts3) - { - for (auto& cut1 : cuts1) { - for (auto& cut2 : cuts2) { - std::string cutname1 = cut1.GetName(); - std::string cutname2 = cut2.GetName(); - - if ((pairname == "PCMPCM" || pairname == "PHOSPHOS" || pairname == "EMCEMC") && (cutname1 != cutname2)) - continue; - - THashList* list_pair_subsys = reinterpret_cast(list_pair->FindObject(pairname.data())); - std::string photon_cut_name = cutname1 + "_" + cutname2; - o2::aod::pwgem::photon::histogram::AddHistClass(list_pair_subsys, photon_cut_name.data()); - THashList* list_pair_subsys_photoncut = reinterpret_cast(list_pair_subsys->FindObject(photon_cut_name.data())); - - for (auto& cut3 : cuts3) { - std::string pair_cut_name = cut3.GetName(); - o2::aod::pwgem::photon::histogram::AddHistClass(list_pair_subsys_photoncut, pair_cut_name.data()); - THashList* list_pair_subsys_paircut = reinterpret_cast(list_pair_subsys_photoncut->FindObject(pair_cut_name.data())); - o2::aod::pwgem::photon::histogram::DefineHistograms(list_pair_subsys_paircut, "tagging_pi0"); - } // end of cut3 loop - } // end of cut2 loop - } // end of cut1 loop - } - - static constexpr std::string_view pairnames[9] = {"PCMPCM", "PHOSPHOS", "EMCEMC", "PCMPHOS", "PCMEMC", "PCMDalitzEE", "PCMDalitzMuMu", "PHOSEMC", "DalitzEEDalitzEE"}; - void addhistograms() - { - fMainList->SetOwner(true); - fMainList->SetName("fMainList"); - - // create sub lists first. - o2::aod::pwgem::photon::histogram::AddHistClass(fMainList, "Event"); - THashList* list_ev = reinterpret_cast(fMainList->FindObject("Event")); - - o2::aod::pwgem::photon::histogram::AddHistClass(fMainList, "Pair"); - THashList* list_pair = reinterpret_cast(fMainList->FindObject("Pair")); - - for (auto& pairname : fPairNames) { - LOGF(info, "Enabled pairs = %s", pairname.data()); - - THashList* list_ev_pair = reinterpret_cast(o2::aod::pwgem::photon::histogram::AddHistClass(list_ev, pairname.data())); - for (const auto& evtype : event_types) { - THashList* list_ev_type = reinterpret_cast(o2::aod::pwgem::photon::histogram::AddHistClass(list_ev_pair, evtype.data())); - o2::aod::pwgem::photon::histogram::DefineHistograms(list_ev_type, "Event", evtype.data()); - } - - o2::aod::pwgem::photon::histogram::AddHistClass(list_pair, pairname.data()); - - if (pairname == "PCMPHOS") { - add_pair_histograms(list_pair, pairname, fPCMCuts, fPHOSCuts, fPairCuts); - } - if (pairname == "PCMEMC") { - add_pair_histograms(list_pair, pairname, fPCMCuts, fEMCCuts, fPairCuts); - } - if (pairname == "PCMDalitzEE") { - add_pair_histograms(list_pair, pairname, fPCMCuts, fDalitzEECuts, fPairCuts); - } - - } // end of pair name loop - } - - void DefinePCMCuts() - { - TString cutNamesStr = fConfigPCMCuts.value; - if (!cutNamesStr.IsNull()) { - std::unique_ptr objArray(cutNamesStr.Tokenize(",")); - for (int icut = 0; icut < objArray->GetEntries(); ++icut) { - const char* cutname = objArray->At(icut)->GetName(); - LOGF(info, "add cut : %s", cutname); - fPCMCuts.push_back(*pcmcuts::GetCut(cutname)); - } - } - LOGF(info, "Number of PCM cuts = %d", fPCMCuts.size()); - } - - void DefineDalitzEECuts() - { - TString cutNamesStr = fConfigDalitzEECuts.value; - if (!cutNamesStr.IsNull()) { - std::unique_ptr objArray(cutNamesStr.Tokenize(",")); - for (int icut = 0; icut < objArray->GetEntries(); ++icut) { - const char* cutname = objArray->At(icut)->GetName(); - LOGF(info, "add cut : %s", cutname); - fDalitzEECuts.push_back(*dalitzeecuts::GetCut(cutname)); - } - } - LOGF(info, "Number of DalitzEE cuts = %d", fDalitzEECuts.size()); - } - - void DefinePHOSCuts() - { - TString cutNamesStr = fConfigPHOSCuts.value; - if (!cutNamesStr.IsNull()) { - std::unique_ptr objArray(cutNamesStr.Tokenize(",")); - for (int icut = 0; icut < objArray->GetEntries(); ++icut) { - const char* cutname = objArray->At(icut)->GetName(); - LOGF(info, "add cut : %s", cutname); - fPHOSCuts.push_back(*phoscuts::GetCut(cutname)); - } - } - LOGF(info, "Number of PHOS cuts = %d", fPHOSCuts.size()); - } - - void DefineEMCCuts() - { - const float a = EMC_TM_Eta->at(0); - const float b = EMC_TM_Eta->at(1); - const float c = EMC_TM_Eta->at(2); - - const float d = EMC_TM_Phi->at(0); - const float e = EMC_TM_Phi->at(1); - const float f = EMC_TM_Phi->at(2); - LOGF(info, "EMCal track matching parameters : a = %f, b = %f, c = %f, d = %f, e = %f, f = %f", a, b, c, d, e, f); - - TString cutNamesStr = fConfigEMCCuts.value; - if (!cutNamesStr.IsNull()) { - std::unique_ptr objArray(cutNamesStr.Tokenize(",")); - for (int icut = 0; icut < objArray->GetEntries(); ++icut) { - const char* cutname = objArray->At(icut)->GetName(); - LOGF(info, "add cut : %s", cutname); - if (std::strcmp(cutname, "custom") == 0) { - EMCPhotonCut* custom_cut = new EMCPhotonCut(cutname, cutname); - custom_cut->SetMinE(EMC_minE); - custom_cut->SetMinNCell(EMC_minNCell); - custom_cut->SetM02Range(EMC_minM02, EMC_maxM02); - custom_cut->SetTimeRange(EMC_minTime, EMC_maxTime); - - custom_cut->SetTrackMatchingEta([a, b, c](float pT) { - return a + pow(pT + b, c); - }); - custom_cut->SetTrackMatchingPhi([d, e, f](float pT) { - return d + pow(pT + e, f); - }); - - custom_cut->SetMinEoverP(EMC_Eoverp); - custom_cut->SetUseExoticCut(EMC_UseExoticCut); - fEMCCuts.push_back(*custom_cut); - } else { - fEMCCuts.push_back(*emccuts::GetCut(cutname)); - } - } - } - LOGF(info, "Number of EMCal cuts = %d", fEMCCuts.size()); - } - - void DefinePairCuts() - { - TString cutNamesStr = fConfigPairCuts.value; - if (!cutNamesStr.IsNull()) { - std::unique_ptr objArray(cutNamesStr.Tokenize(",")); - for (int icut = 0; icut < objArray->GetEntries(); ++icut) { - const char* cutname = objArray->At(icut)->GetName(); - LOGF(info, "add cut : %s", cutname); - fPairCuts.push_back(*paircuts::GetCut(cutname)); - } - } - LOGF(info, "Number of Pair cuts = %d", fPairCuts.size()); - } - - template - bool IsSelectedPair(TG1 const& g1, TG2 const& g2, TCut1 const& cut1, TCut2 const& cut2) - { - bool is_selected_pair = false; - if constexpr (pairtype == PairType::kPCMPHOS) { - is_selected_pair = o2::aod::pwgem::photonmeson::photonpair::IsSelectedPair(g1, g2, cut1, cut2); - } else if constexpr (pairtype == PairType::kPCMEMC) { - is_selected_pair = o2::aod::pwgem::photonmeson::photonpair::IsSelectedPair(g1, g2, cut1, cut2); - } else if constexpr (pairtype == PairType::kPCMDalitzEE) { - is_selected_pair = o2::aod::pwgem::photonmeson::photonpair::IsSelectedPair(g1, g2, cut1, cut2); - } else { - is_selected_pair = true; - } - return is_selected_pair; - } - - template - void SameEventPairing(TEvents const& collisions, TPhotons1 const& photons1, TPhotons2 const& photons2, TPreslice1 const& perCollision1, TPreslice2 const& perCollision2, TCuts1 const& cuts1, TCuts2 const& cuts2, TPairCuts const& paircuts, TLegs const& /*legs*/, TEMPrimaryElectrons const& /*emprimaryelectrons*/) - { - THashList* list_ev_pair_before = static_cast(fMainList->FindObject("Event")->FindObject(pairnames[pairtype].data())->FindObject(event_types[0].data())); - THashList* list_ev_pair_after = static_cast(fMainList->FindObject("Event")->FindObject(pairnames[pairtype].data())->FindObject(event_types[1].data())); - THashList* list_pair_ss = static_cast(fMainList->FindObject("Pair")->FindObject(pairnames[pairtype].data())); - - for (auto& collision : collisions) { - initCCDB(collision); - if ((pairtype == kPHOSPHOS || pairtype == kPCMPHOS) && !collision.alias_bit(triggerAliases::kTVXinPHOS)) { - continue; - } - if ((pairtype == kEMCEMC || pairtype == kPCMEMC) && !collision.alias_bit(triggerAliases::kTVXinEMC)) { - continue; - } - - const float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; - if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { - continue; - } - - o2::aod::pwgem::photon::histogram::FillHistClass(list_ev_pair_before, "", collision); - if (!fEMEventCut.IsSelected(collision)) { - continue; - } - o2::aod::pwgem::photon::histogram::FillHistClass(list_ev_pair_after, "", collision); - reinterpret_cast(list_ev_pair_before->FindObject("hCollisionCounter"))->Fill("accepted", 1.f); - reinterpret_cast(list_ev_pair_after->FindObject("hCollisionCounter"))->Fill("accepted", 1.f); - - auto photons1_coll = photons1.sliceBy(perCollision1, collision.globalIndex()); - auto photons2_coll = photons2.sliceBy(perCollision2, collision.globalIndex()); - - for (auto& cut1 : cuts1) { - for (auto& cut2 : cuts2) { - for (auto& paircut : paircuts) { - for (auto& [g1, g2] : combinations(CombinationsFullIndexPolicy(photons1_coll, photons2_coll))) { - - if constexpr (pairtype == PairType::kPCMDalitzEE) { - auto pos_pv = g2.template posTrack_as(); - auto ele_pv = g2.template negTrack_as(); - std::tuple pair2 = std::make_tuple(pos_pv, ele_pv, d_bz); - if (!IsSelectedPair(g1, pair2, cut1, cut2)) { - continue; - } - } else { - if (!IsSelectedPair(g1, g2, cut1, cut2)) { - continue; - } - } - - if (!paircut.IsSelected(g1, g2)) { - continue; - } - - if constexpr (pairtype == PairType::kPCMPHOS || pairtype == PairType::kPCMEMC) { - auto pos = g1.template posTrack_as(); - auto ele = g1.template negTrack_as(); - if constexpr (pairtype == PairType::kPCMPHOS) { - if (o2::aod::pwgem::photonmeson::photonpair::DoesV0LegMatchWithCluster(pos, g2, 0.02, 0.4, 0.2) || o2::aod::pwgem::photonmeson::photonpair::DoesV0LegMatchWithCluster(ele, g2, 0.02, 0.4, 0.2)) { - continue; - } - } else if constexpr (pairtype == PairType::kPCMEMC) { - if (o2::aod::pwgem::photonmeson::photonpair::DoesV0LegMatchWithCluster(pos, g2, 0.02, 0.4, 0.5) || o2::aod::pwgem::photonmeson::photonpair::DoesV0LegMatchWithCluster(ele, g2, 0.02, 0.4, 0.5)) { - continue; - } - } - } - ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.); // pcm - ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.); // phos or emc or dalitzee - if constexpr (pairtype == PairType::kPCMDalitzEE) { - v2.SetM(g2.mass()); - } - ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - // if (abs(v12.Rapidity()) > maxY) { - // continue; - // } - reinterpret_cast(list_pair_ss->FindObject(Form("%s_%s", cut1.GetName(), cut2.GetName()))->FindObject(paircut.GetName())->FindObject("hMggPt_Same"))->Fill(v12.M(), v1.Pt()); - } // end of combination - } // end of pair cut loop - } // end of cut2 loop - } // end of cut1 loop - } // end of collision loop - } - - Configurable ndepth{"ndepth", 10, "depth for event mixing"}; - ConfigurableAxis ConfVtxBins{"ConfVtxBins", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; - ConfigurableAxis ConfCentBins{"ConfCentBins", {VARIABLE_WIDTH, 0.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f, 999.f}, "Mixing bins - centrality"}; - using BinningType_M = ColumnBinningPolicy; - using BinningType_A = ColumnBinningPolicy; - using BinningType_C = ColumnBinningPolicy; - BinningType_M colBinning_M{{ConfVtxBins, ConfCentBins}, true}; - BinningType_A colBinning_A{{ConfVtxBins, ConfCentBins}, true}; - BinningType_C colBinning_C{{ConfVtxBins, ConfCentBins}, true}; - - template - void MixedEventPairing(TEvents const& collisions, TPhotons1 const& photons1, TPhotons2 const& photons2, TPreslice1 const& perCollision1, TPreslice2 const& perCollision2, TCuts1 const& cuts1, TCuts2 const& cuts2, TPairCuts const& paircuts, TLegs const& /*legs*/, TEMPrimaryElectrons const& /*emprimaryelectrons*/, TMixedBinning const& colBinning) - { - THashList* list_pair_ss = static_cast(fMainList->FindObject("Pair")->FindObject(pairnames[pairtype].data())); - - // LOGF(info, "Number of collisions after filtering: %d", collisions.size()); - for (auto& [collision1, collision2] : soa::selfCombinations(colBinning, ndepth, -1, collisions, collisions)) { // internally, CombinationsStrictlyUpperIndexPolicy(collisions, collisions) is called. - - const float centralities1[3] = {collision1.centFT0M(), collision1.centFT0A(), collision1.centFT0C()}; - const float centralities2[3] = {collision2.centFT0M(), collision2.centFT0A(), collision2.centFT0C()}; - - if (centralities1[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities1[cfgCentEstimator]) { - continue; - } - if (centralities2[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities2[cfgCentEstimator]) { - continue; - } - if (!fEMEventCut.IsSelected(collision1) || !fEMEventCut.IsSelected(collision2)) { - continue; - } - - auto photons_coll1 = photons1.sliceBy(perCollision1, collision1.globalIndex()); - auto photons_coll2 = photons2.sliceBy(perCollision2, collision2.globalIndex()); - // LOGF(info, "collision1: posZ = %f, numContrib = %d , sel8 = %d | collision2: posZ = %f, numContrib = %d , sel8 = %d", - // collision1.posZ(), collision1.numContrib(), collision1.sel8(), collision2.posZ(), collision2.numContrib(), collision2.sel8()); - - for (auto& cut1 : cuts1) { - for (auto& cut2 : cuts2) { - for (auto& paircut : paircuts) { - for (auto& [g1, g2] : combinations(soa::CombinationsFullIndexPolicy(photons_coll1, photons_coll2))) { - // LOGF(info, "Mixed event photon pair: (%d, %d) from events (%d, %d), photon event: (%d, %d)", g1.index(), g2.index(), collision1.index(), collision2.index(), g1.globalIndex(), g2.globalIndex()); - - if ((pairtype == PairType::kPCMPCM || pairtype == PairType::kPHOSPHOS || pairtype == PairType::kEMCEMC) && (TString(cut1.GetName()) != TString(cut2.GetName()))) { - continue; - } - - if constexpr (pairtype == PairType::kPCMDalitzEE) { - auto pos_pv = g2.template posTrack_as(); - auto ele_pv = g2.template negTrack_as(); - std::tuple pair2 = std::make_tuple(pos_pv, ele_pv, d_bz); - if (!IsSelectedPair(g1, pair2, cut1, cut2)) { - continue; - } - } else { - if (!IsSelectedPair(g1, g2, cut1, cut2)) { - continue; - } - } - - if (!paircut.IsSelected(g1, g2)) { - continue; - } - - ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.); // pcm - ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.); // phos or emc or dalitzee - if constexpr (pairtype == PairType::kPCMDalitzEE) { - v2.SetM(g2.mass()); - auto pos_sv = g1.template posTrack_as(); - auto ele_sv = g1.template negTrack_as(); - auto pos_pv = g2.template posTrack_as(); - auto ele_pv = g2.template negTrack_as(); - if (pos_sv.trackId() == pos_pv.trackId() || ele_sv.trackId() == ele_pv.trackId()) { - continue; - } - } - ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - // if (abs(v12.Rapidity()) > maxY) { - // continue; - // } - reinterpret_cast(list_pair_ss->FindObject(Form("%s_%s", cut1.GetName(), cut2.GetName()))->FindObject(paircut.GetName())->FindObject("hMggPt_Mixed"))->Fill(v12.M(), v1.Pt()); - - } // end of different photon combinations - } // end of pair cut loop - } // end of cut2 loop - } // end of cut1 loop - } // end of different collision combinations - } - - Partition grouped_collisions = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); // this goes to same event. - Filter collisionFilter_common = nabs(o2::aod::collision::posZ) < 10.f && o2::aod::collision::numContrib > (uint16_t)0 && o2::aod::evsel::sel8 == true; - Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); - using MyFilteredCollisions = soa::Filtered; - - Filter DalitzEEFilter = o2::aod::dalitzee::sign == 0; // analyze only uls - using MyFilteredDalitzEEs = soa::Filtered; - - Preslice perCollision_pcm = aod::v0photonkf::emeventId; - Preslice perCollision_dalitz = aod::dalitzee::emeventId; - Preslice perCollision_phos = aod::skimmedcluster::collisionId; - Preslice perCollision_emc = aod::skimmedcluster::collisionId; - - void processPCMDalitzEE(MyCollisions const&, MyFilteredCollisions const& filtered_collisions, MyV0Photons const& v0photons, aod::V0Legs const& legs, MyFilteredDalitzEEs const& dielectrons, MyPrimaryElectrons const& emprimaryelectrons) - { - SameEventPairing(grouped_collisions, v0photons, dielectrons, perCollision_pcm, perCollision_dalitz, fPCMCuts, fDalitzEECuts, fPairCuts, legs, emprimaryelectrons); - if (cfgCentEstimator == 0) { - MixedEventPairing(filtered_collisions, v0photons, dielectrons, perCollision_pcm, perCollision_dalitz, fPCMCuts, fDalitzEECuts, fPairCuts, legs, emprimaryelectrons, colBinning_M); - } else if (cfgCentEstimator == 1) { - MixedEventPairing(filtered_collisions, v0photons, dielectrons, perCollision_pcm, perCollision_dalitz, fPCMCuts, fDalitzEECuts, fPairCuts, legs, emprimaryelectrons, colBinning_A); - } else if (cfgCentEstimator == 2) { - MixedEventPairing(filtered_collisions, v0photons, dielectrons, perCollision_pcm, perCollision_dalitz, fPCMCuts, fDalitzEECuts, fPairCuts, legs, emprimaryelectrons, colBinning_C); - } - } - - void processPCMPHOS(MyCollisions const&, MyFilteredCollisions const& filtered_collisions, MyV0Photons const& v0photons, aod::PHOSClusters const& phosclusters, aod::V0Legs const& legs) - { - SameEventPairing(grouped_collisions, v0photons, phosclusters, perCollision_pcm, perCollision_phos, fPCMCuts, fPHOSCuts, fPairCuts, legs, nullptr); - MixedEventPairing(filtered_collisions, v0photons, phosclusters, perCollision_pcm, perCollision_phos, fPCMCuts, fPHOSCuts, fPairCuts, legs, nullptr, colBinning_C); - } - - void processPCMEMC(MyCollisions const&, MyFilteredCollisions const& filtered_collisions, MyV0Photons const& v0photons, aod::SkimEMCClusters const& emcclusters, aod::V0Legs const& legs) - { - SameEventPairing(grouped_collisions, v0photons, emcclusters, perCollision_pcm, perCollision_emc, fPCMCuts, fEMCCuts, fPairCuts, legs, nullptr); - MixedEventPairing(filtered_collisions, v0photons, emcclusters, perCollision_pcm, perCollision_emc, fPCMCuts, fEMCCuts, fPairCuts, legs, nullptr, colBinning_C); - } - - void processDummy(MyCollisions const&) {} - - PROCESS_SWITCH(TaggingPi0, processPCMDalitzEE, "pairing PCM-Dalitz", false); - PROCESS_SWITCH(TaggingPi0, processPCMPHOS, "pairing PCM-PHOS", false); - PROCESS_SWITCH(TaggingPi0, processPCMEMC, "pairing PCM-EMCal", false); - PROCESS_SWITCH(TaggingPi0, processDummy, "Dummy function", true); -}; - -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"tagging-pi0"})}; -} diff --git a/PWGEM/PhotonMeson/Tasks/TaggingPi0MC.cxx b/PWGEM/PhotonMeson/Tasks/TaggingPi0MC.cxx deleted file mode 100644 index 335e8195d8b..00000000000 --- a/PWGEM/PhotonMeson/Tasks/TaggingPi0MC.cxx +++ /dev/null @@ -1,589 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. -// -// ======================== -// -// This code runs loop over photons with PCM and PHOS for direct photon analysis. -// Please write to: daiki.sekihata@cern.ch - -#include -#include - -#include "TString.h" -#include "Math/Vector4D.h" - -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoAHelpers.h" - -#include "DetectorsBase/GeometryManager.h" -#include "DataFormatsParameters/GRPObject.h" -#include "DataFormatsParameters/GRPMagField.h" -#include "CCDB/BasicCCDBManager.h" - -#include "Common/Core/RecoDecay.h" -#include "PWGEM/PhotonMeson/Utils/PairUtilities.h" -#include "PWGEM/PhotonMeson/Utils/MCUtilities.h" -#include "PWGEM/PhotonMeson/DataModel/gammaTables.h" -#include "PWGEM/PhotonMeson/Core/V0PhotonCut.h" -#include "PWGEM/PhotonMeson/Core/DalitzEECut.h" -#include "PWGEM/PhotonMeson/Core/PHOSPhotonCut.h" -#include "PWGEM/PhotonMeson/Core/EMCPhotonCut.h" -#include "PWGEM/PhotonMeson/Core/PairCut.h" -#include "PWGEM/PhotonMeson/Core/CutsLibrary.h" -#include "PWGEM/PhotonMeson/Core/HistogramsLibrary.h" -#include "PWGEM/Dilepton/Utils/MCUtilities.h" - -using namespace o2; -using namespace o2::aod; -using namespace o2::framework; -using namespace o2::framework::expressions; -using namespace o2::soa; -using namespace o2::aod::pwgem::photonmeson::photonpair; -using namespace o2::aod::pwgem::photonmeson::utils::mcutil; -using namespace o2::aod::pwgem::dilepton::utils::mcutil; -using namespace o2::aod::pwgem::photon; - -using MyCollisions = soa::Join; -using MyCollision = MyCollisions::iterator; - -using MyV0Photons = soa::Join; -using MyV0Photon = MyV0Photons::iterator; - -using MyDalitzEEs = soa::Join; -using MyDalitzEE = MyDalitzEEs::iterator; - -struct TaggingPi0MC { - using MyMCV0Legs = soa::Join; - using MyMCTracks = soa::Join; - using MyMCTrack = MyMCTracks::iterator; - - // Configurables - Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; - Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; - Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; - Configurable skipGRPOquery{"skipGRPOquery", true, "skip grpo query"}; - Configurable d_bz_input{"d_bz_input", -999, "bz field in kG, -999 is automatic"}; - - Configurable cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"}; - Configurable cfgCentMin{"cfgCentMin", 0, "min. centrality"}; - Configurable cfgCentMax{"cfgCentMax", 999, "max. centrality"}; - - Configurable maxY{"maxY", 0.9, "maximum rapidity for reconstructed particles"}; - Configurable maxRgen{"maxRgen", 90.f, "maximum radius for generated particles"}; - Configurable margin_z_mc{"margin_z_mc", 7.0, "margin for z cut in cm for MC"}; - - Configurable fConfigPCMCuts{"cfgPCMCuts", "qc", "Comma separated list of V0 photon cuts"}; - Configurable fConfigDalitzEECuts{"cfgDalitzEECuts", "mee_0_120_tpchadrejortofreq,mee_0_120_tpchadrejortofreq_lowB", "Comma separated list of Dalitz ee cuts"}; - Configurable fConfigPHOSCuts{"cfgPHOSCuts", "test02,test03", "Comma separated list of PHOS photon cuts"}; - Configurable fConfigEMCCuts{"fConfigEMCCuts", "standard", "Comma separated list of EMCal photon cuts"}; - Configurable fConfigPairCuts{"cfgPairCuts", "nocut", "Comma separated list of pair cuts"}; - - // Configurable for EMCal cuts - Configurable EMC_minTime{"EMC_minTime", -20., "Minimum cluster time for EMCal time cut"}; - Configurable EMC_maxTime{"EMC_maxTime", +25., "Maximum cluster time for EMCal time cut"}; - Configurable EMC_minM02{"EMC_minM02", 0.1, "Minimum M02 for EMCal M02 cut"}; - Configurable EMC_maxM02{"EMC_maxM02", 0.7, "Maximum M02 for EMCal M02 cut"}; - Configurable EMC_minE{"EMC_minE", 0.7, "Minimum cluster energy for EMCal energy cut"}; - Configurable EMC_minNCell{"EMC_minNCell", 1, "Minimum number of cells per cluster for EMCal NCell cut"}; - Configurable> EMC_TM_Eta{"EMC_TM_Eta", {0.01f, 4.07f, -2.5f}, "|eta| <= [0]+(pT+[1])^[2] for EMCal track matching"}; - Configurable> EMC_TM_Phi{"EMC_TM_Phi", {0.015f, 3.65f, -2.f}, "|phi| <= [0]+(pT+[1])^[2] for EMCal track matching"}; - Configurable EMC_Eoverp{"EMC_Eoverp", 1.75, "Minimum cluster energy over track momentum for EMCal track matching"}; - Configurable EMC_UseExoticCut{"EMC_UseExoticCut", true, "FLag to use the EMCal exotic cluster cut"}; - - Configurable fConfigEMEventCut{"cfgEMEventCut", "minbias", "em event cut"}; // only 1 event cut per wagon - EMPhotonEventCut fEMEventCut; - static constexpr std::string_view event_types[2] = {"before", "after"}; - - OutputObj fOutputEvent{"Event"}; - OutputObj fOutputPair{"Pair"}; // 2-photon pair - OutputObj fOutputPCM{"PCM"}; // v0-photon - THashList* fMainList = new THashList(); - - std::vector fPCMCuts; - std::vector fDalitzEECuts; - std::vector fPHOSCuts; - std::vector fEMCCuts; - std::vector fPairCuts; - - std::vector fPairNames; - - Service ccdb; - int mRunNumber; - float d_bz; - - void init(InitContext& context) - { - if (context.mOptions.get("processPCMDalitzEE")) { - fPairNames.push_back("PCMDalitzEE"); - } - if (context.mOptions.get("processPCMPHOS")) { - fPairNames.push_back("PCMPHOS"); - } - if (context.mOptions.get("processPCMEMC")) { - fPairNames.push_back("PCMEMC"); - } - - DefinePCMCuts(); - DefineDalitzEECuts(); - DefinePHOSCuts(); - DefineEMCCuts(); - DefinePairCuts(); - addhistograms(); - TString ev_cut_name = fConfigEMEventCut.value; - fEMEventCut = *eventcuts::GetCut(ev_cut_name.Data()); - - fOutputEvent.setObject(reinterpret_cast(fMainList->FindObject("Event"))); - fOutputPair.setObject(reinterpret_cast(fMainList->FindObject("Pair"))); - fOutputPCM.setObject(reinterpret_cast(fMainList->FindObject("PCM"))); - - mRunNumber = 0; - d_bz = 0; - - ccdb->setURL(ccdburl); - ccdb->setCaching(true); - ccdb->setLocalObjectValidityChecking(); - ccdb->setFatalWhenNull(false); - } - - template - void initCCDB(TCollision const& collision) - { - if (mRunNumber == collision.runNumber()) { - return; - } - - // In case override, don't proceed, please - no CCDB access required - if (d_bz_input > -990) { - d_bz = d_bz_input; - o2::parameters::GRPMagField grpmag; - if (fabs(d_bz) > 1e-5) { - grpmag.setL3Current(30000.f / (d_bz / 5.0f)); - } - mRunNumber = collision.runNumber(); - return; - } - - auto run3grp_timestamp = collision.timestamp(); - o2::parameters::GRPObject* grpo = 0x0; - o2::parameters::GRPMagField* grpmag = 0x0; - if (!skipGRPOquery) - grpo = ccdb->getForTimeStamp(grpPath, run3grp_timestamp); - if (grpo) { - // Fetch magnetic field from ccdb for current collision - d_bz = grpo->getNominalL3Field(); - LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; - } else { - grpmag = ccdb->getForTimeStamp(grpmagPath, run3grp_timestamp); - if (!grpmag) { - LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for timestamp " << run3grp_timestamp; - } - // Fetch magnetic field from ccdb for current collision - d_bz = std::lround(5.f * grpmag->getL3Current() / 30000.f); - LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; - } - mRunNumber = collision.runNumber(); - } - - template - void add_pair_histograms(THashList* list_pair, const std::string pairname, TCuts1 const& cuts1, TCuts2 const& cuts2, TCuts3 const& cuts3) - { - for (auto& cut1 : cuts1) { - for (auto& cut2 : cuts2) { - std::string cutname1 = cut1.GetName(); - std::string cutname2 = cut2.GetName(); - - if ((pairname == "PCMPCM" || pairname == "PHOSPHOS" || pairname == "EMCEMC") && (cutname1 != cutname2)) - continue; - - THashList* list_pair_subsys = reinterpret_cast(list_pair->FindObject(pairname.data())); - std::string photon_cut_name = cutname1 + "_" + cutname2; - o2::aod::pwgem::photon::histogram::AddHistClass(list_pair_subsys, photon_cut_name.data()); - THashList* list_pair_subsys_photoncut = reinterpret_cast(list_pair_subsys->FindObject(photon_cut_name.data())); - - for (auto& cut3 : cuts3) { - std::string pair_cut_name = cut3.GetName(); - o2::aod::pwgem::photon::histogram::AddHistClass(list_pair_subsys_photoncut, pair_cut_name.data()); - THashList* list_pair_subsys_paircut = reinterpret_cast(list_pair_subsys_photoncut->FindObject(pair_cut_name.data())); - o2::aod::pwgem::photon::histogram::DefineHistograms(list_pair_subsys_paircut, "tagging_pi0_mc", "pair"); - } // end of pair cut loop - } // end of cut2 loop - } // end of cut1 loop - } - - static constexpr std::string_view pairnames[9] = {"PCMPCM", "PHOSPHOS", "EMCEMC", "PCMPHOS", "PCMEMC", "PCMDalitzEE", "PCMDalitzMuMu", "PHOSEMC", "DalitzEEDalitzEE"}; - void addhistograms() - { - fMainList->SetOwner(true); - fMainList->SetName("fMainList"); - - // create sub lists first. - o2::aod::pwgem::photon::histogram::AddHistClass(fMainList, "Event"); - THashList* list_ev = reinterpret_cast(fMainList->FindObject("Event")); - - o2::aod::pwgem::photon::histogram::AddHistClass(fMainList, "PCM"); - THashList* list_pcm = reinterpret_cast(fMainList->FindObject("PCM")); - for (auto& cut : fPCMCuts) { - THashList* list_pcm_cut = o2::aod::pwgem::photon::histogram::AddHistClass(list_pcm, cut.GetName()); - o2::aod::pwgem::photon::histogram::DefineHistograms(list_pcm_cut, "tagging_pi0_mc", "pcm"); - } - - o2::aod::pwgem::photon::histogram::AddHistClass(fMainList, "Pair"); - THashList* list_pair = reinterpret_cast(fMainList->FindObject("Pair")); - - for (auto& pairname : fPairNames) { - LOGF(info, "Enabled pairs = %s", pairname.data()); - - THashList* list_ev_pair = reinterpret_cast(o2::aod::pwgem::photon::histogram::AddHistClass(list_ev, pairname.data())); - for (const auto& evtype : event_types) { - THashList* list_ev_type = reinterpret_cast(o2::aod::pwgem::photon::histogram::AddHistClass(list_ev_pair, evtype.data())); - o2::aod::pwgem::photon::histogram::DefineHistograms(list_ev_type, "Event", evtype.data()); - } - - o2::aod::pwgem::photon::histogram::AddHistClass(list_pair, pairname.data()); - - if (pairname == "PCMDalitzEE") { - add_pair_histograms(list_pair, pairname, fPCMCuts, fDalitzEECuts, fPairCuts); - } - if (pairname == "PCMPHOS") { - add_pair_histograms(list_pair, pairname, fPCMCuts, fPHOSCuts, fPairCuts); - } - if (pairname == "PCMEMC") { - add_pair_histograms(list_pair, pairname, fPCMCuts, fEMCCuts, fPairCuts); - } - - } // end of pair name loop - } - - void DefinePCMCuts() - { - TString cutNamesStr = fConfigPCMCuts.value; - if (!cutNamesStr.IsNull()) { - std::unique_ptr objArray(cutNamesStr.Tokenize(",")); - for (int icut = 0; icut < objArray->GetEntries(); ++icut) { - const char* cutname = objArray->At(icut)->GetName(); - LOGF(info, "add cut : %s", cutname); - fPCMCuts.push_back(*pcmcuts::GetCut(cutname)); - } - } - LOGF(info, "Number of PCM cuts = %d", fPCMCuts.size()); - } - - void DefineDalitzEECuts() - { - TString cutNamesStr = fConfigDalitzEECuts.value; - if (!cutNamesStr.IsNull()) { - std::unique_ptr objArray(cutNamesStr.Tokenize(",")); - for (int icut = 0; icut < objArray->GetEntries(); ++icut) { - const char* cutname = objArray->At(icut)->GetName(); - LOGF(info, "add cut : %s", cutname); - fDalitzEECuts.push_back(*dalitzeecuts::GetCut(cutname)); - } - } - LOGF(info, "Number of DalitzEE cuts = %d", fDalitzEECuts.size()); - } - - void DefinePHOSCuts() - { - TString cutNamesStr = fConfigPHOSCuts.value; - if (!cutNamesStr.IsNull()) { - std::unique_ptr objArray(cutNamesStr.Tokenize(",")); - for (int icut = 0; icut < objArray->GetEntries(); ++icut) { - const char* cutname = objArray->At(icut)->GetName(); - LOGF(info, "add cut : %s", cutname); - fPHOSCuts.push_back(*phoscuts::GetCut(cutname)); - } - } - LOGF(info, "Number of PHOS cuts = %d", fPHOSCuts.size()); - } - - void DefineEMCCuts() - { - const float a = EMC_TM_Eta->at(0); - const float b = EMC_TM_Eta->at(1); - const float c = EMC_TM_Eta->at(2); - - const float d = EMC_TM_Phi->at(0); - const float e = EMC_TM_Phi->at(1); - const float f = EMC_TM_Phi->at(2); - LOGF(info, "EMCal track matching parameters : a = %f, b = %f, c = %f, d = %f, e = %f, f = %f", a, b, c, d, e, f); - - TString cutNamesStr = fConfigEMCCuts.value; - if (!cutNamesStr.IsNull()) { - std::unique_ptr objArray(cutNamesStr.Tokenize(",")); - for (int icut = 0; icut < objArray->GetEntries(); ++icut) { - const char* cutname = objArray->At(icut)->GetName(); - LOGF(info, "add cut : %s", cutname); - if (std::strcmp(cutname, "custom") == 0) { - EMCPhotonCut* custom_cut = new EMCPhotonCut(cutname, cutname); - custom_cut->SetMinE(EMC_minE); - custom_cut->SetMinNCell(EMC_minNCell); - custom_cut->SetM02Range(EMC_minM02, EMC_maxM02); - custom_cut->SetTimeRange(EMC_minTime, EMC_maxTime); - - custom_cut->SetTrackMatchingEta([a, b, c](float pT) { - return a + pow(pT + b, c); - }); - custom_cut->SetTrackMatchingPhi([d, e, f](float pT) { - return d + pow(pT + e, f); - }); - - custom_cut->SetMinEoverP(EMC_Eoverp); - custom_cut->SetUseExoticCut(EMC_UseExoticCut); - fEMCCuts.push_back(*custom_cut); - } else { - fEMCCuts.push_back(*emccuts::GetCut(cutname)); - } - } - } - LOGF(info, "Number of EMCal cuts = %d", fEMCCuts.size()); - } - - void DefinePairCuts() - { - TString cutNamesStr = fConfigPairCuts.value; - if (!cutNamesStr.IsNull()) { - std::unique_ptr objArray(cutNamesStr.Tokenize(",")); - for (int icut = 0; icut < objArray->GetEntries(); ++icut) { - const char* cutname = objArray->At(icut)->GetName(); - LOGF(info, "add cut : %s", cutname); - fPairCuts.push_back(*paircuts::GetCut(cutname)); - } - } - LOGF(info, "Number of Pair cuts = %d", fPairCuts.size()); - } - - template - bool IsSelectedPair(TG1 const& g1, TG2 const& g2, TCut1 const& cut1, TCut2 const& cut2) - { - bool is_selected_pair = false; - if constexpr (pairtype == PairType::kPCMPHOS) { - is_selected_pair = o2::aod::pwgem::photonmeson::photonpair::IsSelectedPair(g1, g2, cut1, cut2); - } else if constexpr (pairtype == PairType::kPCMEMC) { - is_selected_pair = o2::aod::pwgem::photonmeson::photonpair::IsSelectedPair(g1, g2, cut1, cut2); - } else if constexpr (pairtype == PairType::kPCMDalitzEE) { - is_selected_pair = o2::aod::pwgem::photonmeson::photonpair::IsSelectedPair(g1, g2, cut1, cut2); - } else { - is_selected_pair = true; - } - return is_selected_pair; - } - - template - void TruePairing(TEvents const& collisions, TPhotons1 const& photons1, TPhotons2 const& photons2, TPreslice1 const& perCollision1, TPreslice2 const& perCollision2, TCuts1 const& cuts1, TCuts2 const& cuts2, TPairCuts const& paircuts, TLegs const& /*legs*/, TEMPrimaryElectrons const& /*emprimaryelectrons*/, TMCParticles const& mcparticles, TMCEvents const& /*mcevents*/) - { - THashList* list_ev_pair_before = static_cast(fMainList->FindObject("Event")->FindObject(pairnames[pairtype].data())->FindObject(event_types[0].data())); - THashList* list_ev_pair_after = static_cast(fMainList->FindObject("Event")->FindObject(pairnames[pairtype].data())->FindObject(event_types[1].data())); - THashList* list_pair_ss = static_cast(fMainList->FindObject("Pair")->FindObject(pairnames[pairtype].data())); - THashList* list_pcm = static_cast(fMainList->FindObject("PCM")); - - for (auto& collision : collisions) { - initCCDB(collision); - if ((pairtype == kPHOSPHOS || pairtype == kPCMPHOS) && !collision.alias_bit(triggerAliases::kTVXinPHOS)) { - continue; - } - if ((pairtype == kEMCEMC || pairtype == kPCMEMC) && !collision.alias_bit(triggerAliases::kTVXinEMC)) { - continue; - } - - const float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; - if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { - continue; - } - - o2::aod::pwgem::photon::histogram::FillHistClass(list_ev_pair_before, "", collision); - if (!fEMEventCut.IsSelected(collision)) { - continue; - } - o2::aod::pwgem::photon::histogram::FillHistClass(list_ev_pair_after, "", collision); - reinterpret_cast(list_ev_pair_before->FindObject("hCollisionCounter"))->Fill("accepted", 1.f); - reinterpret_cast(list_ev_pair_after->FindObject("hCollisionCounter"))->Fill("accepted", 1.f); - - auto photons1_coll = photons1.sliceBy(perCollision1, collision.globalIndex()); - auto photons2_coll = photons2.sliceBy(perCollision2, collision.globalIndex()); - - for (auto& cut1 : cuts1) { - for (auto& g1 : photons1_coll) { - - if (!cut1.template IsSelected(g1)) { - continue; - } - if (abs(g1.eta()) > maxY) { // photon is massless particle. rapidity = pseudo-rapidity - continue; - } - - auto pos1 = g1.template posTrack_as(); - auto ele1 = g1.template negTrack_as(); - auto pos1mc = pos1.template emmcparticle_as(); - auto ele1mc = ele1.template emmcparticle_as(); - - int photonid1 = FindCommonMotherFrom2Prongs(pos1mc, ele1mc, -11, 11, 22, mcparticles); - if (photonid1 < 0) { - continue; - } - auto mcphoton1 = mcparticles.iteratorAt(photonid1); - - int pi0id1 = IsXFromY(mcphoton1, mcparticles, 22, 111); - if (pi0id1 < 0) { // photon from pi0 decay - continue; - } - auto mcpi01 = mcparticles.iteratorAt(pi0id1); - - // // check if pi0 is physical primary or produced by generator, photon should be physical primary or produced by generator. - // LOGF(info, "mcphoton1.isPhysicalPrimary() = %d, mcphoton1.producedByGenerator() = %d, mcpi01.isPhysicalPrimary() = %d, mcpi01.producedByGenerator() = %d", - // mcphoton1.isPhysicalPrimary(), mcphoton1.producedByGenerator(), mcpi01.isPhysicalPrimary(), mcpi01.producedByGenerator()); - - if (mcpi01.isPhysicalPrimary() || mcpi01.producedByGenerator()) { - if (!IsConversionPointInAcceptance(mcphoton1, maxRgen, maxY, margin_z_mc, mcparticles)) { - continue; - } - reinterpret_cast(list_pcm->FindObject(cut1.GetName())->FindObject("hPt_v0photon_Pi0_Primary"))->Fill(g1.pt()); - } else if (IsFromWD(mcpi01.emmcevent(), mcpi01, mcparticles) > 0) { - reinterpret_cast(list_pcm->FindObject(cut1.GetName())->FindObject("hPt_v0photon_Pi0_FromWD"))->Fill(g1.pt()); - } else { - reinterpret_cast(list_pcm->FindObject(cut1.GetName())->FindObject("hPt_v0photon_Pi0_hs"))->Fill(g1.pt()); - } - - } // end of pcm photon loop - } // end of cut loop - - for (auto& cut1 : cuts1) { - for (auto& cut2 : cuts2) { - for (auto& paircut : paircuts) { - for (auto& [g1, g2] : combinations(CombinationsFullIndexPolicy(photons1_coll, photons2_coll))) { - - if constexpr (pairtype == PairType::kPCMDalitzEE) { - auto pos_pv = g2.template posTrack_as(); - auto ele_pv = g2.template negTrack_as(); - std::tuple pair2 = std::make_tuple(pos_pv, ele_pv, d_bz); - if (!IsSelectedPair(g1, pair2, cut1, cut2)) { - continue; - } - } else { - if (!IsSelectedPair(g1, g2, cut1, cut2)) { - continue; - } - } - - if (!paircut.IsSelected(g1, g2)) { - continue; - } - - auto pos1 = g1.template posTrack_as(); - auto ele1 = g1.template negTrack_as(); - auto pos1mc = pos1.template emmcparticle_as(); - auto ele1mc = ele1.template emmcparticle_as(); - - int photonid1 = FindCommonMotherFrom2Prongs(pos1mc, ele1mc, -11, 11, 22, mcparticles); - if (photonid1 < 0) { // check swap, true electron is reconstructed as positron and vice versa. - photonid1 = FindCommonMotherFrom2Prongs(pos1mc, ele1mc, 11, -11, 22, mcparticles); - } - if (photonid1 < 0) { - continue; - } - - if constexpr (pairtype == PairType::kPCMPHOS || pairtype == PairType::kPCMEMC) { - if constexpr (pairtype == PairType::kPCMPHOS) { - if (o2::aod::pwgem::photonmeson::photonpair::DoesV0LegMatchWithCluster(pos1, g2, 0.02, 0.4, 0.2) || o2::aod::pwgem::photonmeson::photonpair::DoesV0LegMatchWithCluster(ele1, g2, 0.02, 0.4, 0.2)) { - continue; - } - } else if constexpr (pairtype == PairType::kPCMEMC) { - if (o2::aod::pwgem::photonmeson::photonpair::DoesV0LegMatchWithCluster(pos1, g2, 0.02, 0.4, 0.5) || o2::aod::pwgem::photonmeson::photonpair::DoesV0LegMatchWithCluster(ele1, g2, 0.02, 0.4, 0.5)) { - continue; - } - } - } - - auto g1mc = mcparticles.iteratorAt(photonid1); - - int pi0id = -1; - if constexpr (pairtype == PairType::kPCMDalitzEE) { - auto pos2 = g2.template posTrack_as(); - auto ele2 = g2.template negTrack_as(); - if (pos1.trackId() == pos2.trackId() || ele1.trackId() == ele2.trackId()) { - continue; - } - auto pos2mc = pos2.template emmcparticle_as(); - auto ele2mc = ele2.template emmcparticle_as(); - pi0id = FindCommonMotherFrom3Prongs(g1mc, pos2mc, ele2mc, 22, -11, 11, 111, mcparticles); - } - if (pi0id < 0) { - continue; - } - - ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.); // pcm - ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.); // phos or emc or dalitzee - if constexpr (pairtype == PairType::kPCMDalitzEE) { - v2.SetM(g2.mass()); - } - ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - // if (abs(v12.Rapidity()) > maxY) { - // continue; - // } - - if (pi0id > 0) { - auto mcpi0 = mcparticles.iteratorAt(pi0id); - if (mcpi0.isPhysicalPrimary() || mcpi0.producedByGenerator()) { - if (!IsConversionPointInAcceptance(g1mc, maxRgen, maxY, margin_z_mc, mcparticles)) { - continue; - } - reinterpret_cast(list_pair_ss->FindObject(Form("%s_%s", cut1.GetName(), cut2.GetName()))->FindObject(paircut.GetName())->FindObject("hMggPt_Pi0_Primary"))->Fill(v12.M(), v1.Pt()); - } else if (IsFromWD(mcpi0.emmcevent(), mcpi0, mcparticles)) { - reinterpret_cast(list_pair_ss->FindObject(Form("%s_%s", cut1.GetName(), cut2.GetName()))->FindObject(paircut.GetName())->FindObject("hMggPt_Pi0_FromWD"))->Fill(v12.M(), v1.Pt()); - } else { - reinterpret_cast(list_pair_ss->FindObject(Form("%s_%s", cut1.GetName(), cut2.GetName()))->FindObject(paircut.GetName())->FindObject("hMggPt_Pi0_hs"))->Fill(v12.M(), v1.Pt()); - } - } - } // end of combination - } // end of pair cut loop - } // end of cut2 loop - } // end of cut1 loop - } // end of collision loop - } - - Filter DalitzEEFilter = o2::aod::dalitzee::sign == 0; // analyze only uls - using MyFilteredDalitzEEs = soa::Filtered; - - Preslice perCollision_pcm = aod::v0photonkf::emeventId; - Preslice perCollision_dalitz = aod::dalitzee::emeventId; - Preslice perCollision_phos = aod::skimmedcluster::collisionId; - Preslice perCollision_emc = aod::skimmedcluster::collisionId; - Partition grouped_collisions = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); // this goes to same event. - - void processPCMDalitzEE(MyCollisions const&, MyV0Photons const& v0photons, MyMCV0Legs const& legs, MyFilteredDalitzEEs const& dielectrons, MyMCTracks const& emprimaryelectrons, aod::EMMCParticles const& mcparticles, aod::EMMCEvents const& mccollisions) - { - TruePairing(grouped_collisions, v0photons, dielectrons, perCollision_pcm, perCollision_dalitz, fPCMCuts, fDalitzEECuts, fPairCuts, legs, emprimaryelectrons, mcparticles, mccollisions); - } - - void processPCMPHOS(MyCollisions const&, MyV0Photons const& v0photons, aod::PHOSClusters const& phosclusters, MyMCV0Legs const& legs, aod::EMMCParticles const& mcparticles, aod::EMMCEvents const& mccollisions) - { - TruePairing(grouped_collisions, v0photons, phosclusters, perCollision_pcm, perCollision_phos, fPCMCuts, fPHOSCuts, fPairCuts, legs, nullptr, mcparticles, mccollisions); - } - - void processPCMEMC(MyCollisions const&, MyV0Photons const& v0photons, aod::SkimEMCClusters const& emcclusters, MyMCV0Legs const& legs, aod::EMMCParticles const& mcparticles, aod::EMMCEvents const& mccollisions) - { - TruePairing(grouped_collisions, v0photons, emcclusters, perCollision_pcm, perCollision_emc, fPCMCuts, fEMCCuts, fPairCuts, legs, nullptr, mcparticles, mccollisions); - } - - void processDummy(MyCollisions const&) {} - - PROCESS_SWITCH(TaggingPi0MC, processPCMDalitzEE, "pairing PCM-Dalitz", false); - PROCESS_SWITCH(TaggingPi0MC, processPCMPHOS, "pairing PCM-PHOS", false); - PROCESS_SWITCH(TaggingPi0MC, processPCMEMC, "pairing PCM-EMCal", false); - PROCESS_SWITCH(TaggingPi0MC, processDummy, "Dummy function", true); -}; - -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"tagging-pi0-mc"})}; -} diff --git a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx index d5d3eaa0afd..fe5b31cd975 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx @@ -239,8 +239,10 @@ struct PCMQCMC { fRegistry.add("V0Leg/primary/hPtGen_DeltaPtOverPtGen", "electron p_{T} resolution;p_{T}^{gen} (GeV/c);(p_{T}^{rec} - p_{T}^{gen})/p_{T}^{gen}", kTH2F, {{1000, 0, 10}, {400, -1.0f, 1.0f}}, true); fRegistry.add("V0Leg/primary/hPtGen_DeltaEta", "electron #eta resolution;p_{T}^{gen} (GeV/c);#eta^{rec} - #eta^{gen}", kTH2F, {{1000, 0, 10}, {400, -1.0f, 1.0f}}, true); fRegistry.add("V0Leg/primary/hPtGen_DeltaPhi", "electron #varphi resolution;p_{T}^{gen} (GeV/c);#varphi^{rec} - #varphi^{gen} (rad.)", kTH2F, {{1000, 0, 10}, {400, -1.0f, 1.0f}}, true); - fRegistry.addClone("V0Leg/primary/", "V0Leg/fromWD/"); // from weak decay - fRegistry.addClone("V0Leg/primary/", "V0Leg/fromHS/"); // from hadronic shower in detector materials + fRegistry.addClone("V0Leg/primary/", "V0Leg/fromWD/"); // from weak decay + fRegistry.addClone("V0Leg/primary/", "V0Leg/fromHS/"); // from hadronic shower in detector materials + fRegistry.addClone("V0Leg/primary/", "V0Leg/fromPi0Dalitz/"); // misidentified dielectron from pi0 dalitz decay + fRegistry.addClone("V0Leg/primary/", "V0Leg/fromEtaDalitz/"); // misidentified dielectron from eta dalitz decay } void DefineEMEventCut() diff --git a/PWGEM/PhotonMeson/Utils/NMHistograms.h b/PWGEM/PhotonMeson/Utils/NMHistograms.h index a3e62b0bc5a..9dbeb77c4f6 100644 --- a/PWGEM/PhotonMeson/Utils/NMHistograms.h +++ b/PWGEM/PhotonMeson/Utils/NMHistograms.h @@ -72,7 +72,7 @@ void addNMHistograms(HistogramRegistry* fRegistry, bool isMC, const char* pairna template void fillTruePairInfo(HistogramRegistry* fRegistry, TDiphoton const& v12, TMCParitlce const& mcparticle, TMCParticles const& mcparticles, TMCCollisions const&, const TF1* f1fd_k0s_to_pi0 = nullptr, float eventWeight = 1.f) { - int pdg = abs(mcparticle.pdgCode()); + int pdg = std::abs(mcparticle.pdgCode()); float weight = eventWeight; switch (pdg) { case 111: { @@ -81,7 +81,7 @@ void fillTruePairInfo(HistogramRegistry* fRegistry, TDiphoton const& v12, TMCPar fRegistry->fill(HIST("Pair/Pi0/hs_Primary"), v12.M(), v12.Pt(), weight); } else if (motherid_strhad > 0) { auto str_had = mcparticles.iteratorAt(motherid_strhad); - if (abs(str_had.pdgCode()) == 310 && f1fd_k0s_to_pi0 != nullptr) { + if (std::abs(str_had.pdgCode()) == 310 && f1fd_k0s_to_pi0 != nullptr) { weight *= f1fd_k0s_to_pi0->Eval(str_had.pt()); } fRegistry->fill(HIST("Pair/Pi0/hs_FromWD"), v12.M(), v12.Pt(), weight); diff --git a/PWGEM/PhotonMeson/Utils/TrackSelection.h b/PWGEM/PhotonMeson/Utils/TrackSelection.h index d7c4df97d2c..bdc2f5be533 100644 --- a/PWGEM/PhotonMeson/Utils/TrackSelection.h +++ b/PWGEM/PhotonMeson/Utils/TrackSelection.h @@ -43,7 +43,7 @@ inline bool isITSTPCTrack(TTrack const& track) template inline bool isTPCTRDTrack(TTrack const& track) { - return !track.hasITS() && track.hasTPC() && track.hasTRD(); + return !track.hasITS() && track.hasTPC() && track.hasTRD() && !track.hasTOF(); } /** @@ -56,7 +56,7 @@ inline bool isTPCTRDTrack(TTrack const& track) template inline bool isITSTPCTRDTrack(TTrack const& track) { - return track.hasITS() && track.hasTPC() && track.hasTRD(); + return track.hasITS() && track.hasTPC() && track.hasTRD() && !track.hasTOF(); } /** @@ -215,7 +215,7 @@ inline bool isTPConly_ITSonly(TTrack const& track0, TTrack const& track1) template inline bool checkMCParticles(T const& mc1, T const& mc2) { - if (abs(mc1.pdgCode()) != kElectron || abs(mc2.pdgCode()) != kElectron) { + if (std::abs(mc1.pdgCode()) != kElectron || std::abs(mc2.pdgCode()) != kElectron) { return false; } if (!mc1.has_mothers() || !mc2.has_mothers()) { From 106e9986d61da2ae9abf375bbd06e0eb8336910e Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Mon, 17 Mar 2025 02:33:15 +0900 Subject: [PATCH 0708/1650] [PWGEM/Dilepton] fix std::abs, std::fabs (#10521) --- PWGEM/Dilepton/Core/DielectronCut.h | 4 +- PWGEM/Dilepton/Core/Dilepton.h | 22 +- PWGEM/Dilepton/Core/DileptonMC.h | 314 +++++++++++++------------- PWGEM/Dilepton/Core/SingleTrackQCMC.h | 8 +- 4 files changed, 174 insertions(+), 174 deletions(-) diff --git a/PWGEM/Dilepton/Core/DielectronCut.h b/PWGEM/Dilepton/Core/DielectronCut.h index 006624d75ed..d1c305d3d72 100644 --- a/PWGEM/Dilepton/Core/DielectronCut.h +++ b/PWGEM/Dilepton/Core/DielectronCut.h @@ -374,10 +374,10 @@ class DielectronCut : public TNamed return mMinDca3D <= dca3DinSigma(track) && dca3DinSigma(track) <= mMaxDca3D; // in sigma for single leg case DielectronCuts::kDCAxy: - return abs(track.dcaXY()) <= ((mMaxDcaXYPtDep) ? mMaxDcaXYPtDep(track.pt()) : mMaxDcaXY); + return std::fabs(track.dcaXY()) <= ((mMaxDcaXYPtDep) ? mMaxDcaXYPtDep(track.pt()) : mMaxDcaXY); case DielectronCuts::kDCAz: - return abs(track.dcaZ()) <= mMaxDcaZ; + return std::fabs(track.dcaZ()) <= mMaxDcaZ; case DielectronCuts::kITSNCls: return mMinNClustersITS <= track.itsNCls() && track.itsNCls() <= mMaxNClustersITS; diff --git a/PWGEM/Dilepton/Core/Dilepton.h b/PWGEM/Dilepton/Core/Dilepton.h index 809eeaf52a5..4bc4172bfb4 100644 --- a/PWGEM/Dilepton/Core/Dilepton.h +++ b/PWGEM/Dilepton/Core/Dilepton.h @@ -436,7 +436,7 @@ struct Dilepton { if (d_bz_input > -990) { d_bz = d_bz_input; o2::parameters::GRPMagField grpmag; - if (fabs(d_bz) > 1e-5) { + if (std::fabs(d_bz) > 1e-5) { grpmag.setL3Current(30000.f / (d_bz / 5.0f)); } o2::base::Propagator::initFieldFromGRP(&grpmag); @@ -759,7 +759,7 @@ struct Dilepton { { bool is_good = true; for (auto& qn : qvectors[nmod]) { - if (fabs(qn[0]) > 20.f || fabs(qn[1]) > 20.f) { + if (std::fabs(qn[0]) > 20.f || std::fabs(qn[1]) > 20.f) { is_good = false; break; } @@ -922,8 +922,8 @@ struct Dilepton { } else if (cfgAnalysisType == static_cast(o2::aod::pwgem::dilepton::utils::pairutil::DileptonAnalysisType::kUPC)) { float dphi = v1.Phi() - v2.Phi(); o2::math_utils::bringToPMPi(dphi); - float aco = 1.f - abs(dphi) / M_PI; - float asym = abs(v1.Pt() - v2.Pt()) / (v1.Pt() + v2.Pt()); + float aco = 1.f - std::fabs(dphi) / M_PI; + float asym = std::fabs(v1.Pt() - v2.Pt()) / (v1.Pt() + v2.Pt()); float dphi_e_ee = v1.Phi() - v12.Phi(); o2::math_utils::bringToPMPi(dphi_e_ee); @@ -931,11 +931,11 @@ struct Dilepton { o2::aod::pwgem::dilepton::utils::pairutil::getAngleCS(t1, t2, leptonM1, leptonM2, beamE1, beamE2, beamP1, beamP2, cos_thetaCS, phiCS); if (t1.sign() * t2.sign() < 0) { // ULS - fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("uls/hs"), v12.M(), v12.Pt(), pair_dca, aco, asym, abs(dphi_e_ee), abs(cos_thetaCS), weight); + fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("uls/hs"), v12.M(), v12.Pt(), pair_dca, aco, asym, std::fabs(dphi_e_ee), std::fabs(cos_thetaCS), weight); } else if (t1.sign() > 0 && t2.sign() > 0) { // LS++ - fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("lspp/hs"), v12.M(), v12.Pt(), pair_dca, aco, asym, abs(dphi_e_ee), abs(cos_thetaCS), weight); + fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("lspp/hs"), v12.M(), v12.Pt(), pair_dca, aco, asym, std::fabs(dphi_e_ee), std::fabs(cos_thetaCS), weight); } else if (t1.sign() < 0 && t2.sign() < 0) { // LS-- - fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("lsmm/hs"), v12.M(), v12.Pt(), pair_dca, aco, asym, abs(dphi_e_ee), abs(cos_thetaCS), weight); + fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("lsmm/hs"), v12.M(), v12.Pt(), pair_dca, aco, asym, std::fabs(dphi_e_ee), std::fabs(cos_thetaCS), weight); } } else if (cfgAnalysisType == static_cast(o2::aod::pwgem::dilepton::utils::pairutil::DileptonAnalysisType::kFlowV2) || cfgAnalysisType == static_cast(o2::aod::pwgem::dilepton::utils::pairutil::DileptonAnalysisType::kFlowV3)) { std::array q2ft0m = {collision.q2xft0m(), collision.q2yft0m()}; @@ -984,11 +984,11 @@ struct Dilepton { o2::math_utils::bringToPMPi(phiCS); if (t1.sign() * t2.sign() < 0) { // ULS - fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("uls/hs"), v12.M(), v12.Pt(), pair_dca, abs(cos_thetaCS), abs(phiCS), weight); + fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("uls/hs"), v12.M(), v12.Pt(), pair_dca, std::fabs(cos_thetaCS), std::fabs(phiCS), weight); } else if (t1.sign() > 0 && t2.sign() > 0) { // LS++ - fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("lspp/hs"), v12.M(), v12.Pt(), pair_dca, abs(cos_thetaCS), abs(phiCS), weight); + fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("lspp/hs"), v12.M(), v12.Pt(), pair_dca, std::fabs(cos_thetaCS), std::fabs(phiCS), weight); } else if (t1.sign() < 0 && t2.sign() < 0) { // LS-- - fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("lsmm/hs"), v12.M(), v12.Pt(), pair_dca, abs(cos_thetaCS), abs(phiCS), weight); + fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("lsmm/hs"), v12.M(), v12.Pt(), pair_dca, std::fabs(cos_thetaCS), std::fabs(phiCS), weight); } } else if (cfgAnalysisType == static_cast(o2::aod::pwgem::dilepton::utils::pairutil::DileptonAnalysisType::kVM)) { @@ -1558,7 +1558,7 @@ struct Dilepton { if (collision.sel8()) { fRegistry.fill(HIST("Event/norm/hCollisionCounter"), 10.0); } - if (abs(collision.posZ()) < 10.0) { + if (std::fabs(collision.posZ()) < 10.0) { fRegistry.fill(HIST("Event/norm/hCollisionCounter"), 11.0); } if (collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { diff --git a/PWGEM/Dilepton/Core/DileptonMC.h b/PWGEM/Dilepton/Core/DileptonMC.h index 1583373553d..f6600ed92c8 100644 --- a/PWGEM/Dilepton/Core/DileptonMC.h +++ b/PWGEM/Dilepton/Core/DileptonMC.h @@ -542,7 +542,7 @@ struct DileptonMC { if (d_bz_input > -990) { d_bz = d_bz_input; o2::parameters::GRPMagField grpmag; - if (fabs(d_bz) > 1e-5) { + if (std::fabs(d_bz) > 1e-5) { grpmag.setL3Current(30000.f / (d_bz / 5.0f)); } o2::base::Propagator::initFieldFromGRP(&grpmag); @@ -901,8 +901,8 @@ struct DileptonMC { float dphi = v1.Phi() - v2.Phi(); o2::math_utils::bringToPMPi(dphi); - float aco = 1.f - abs(dphi) / M_PI; - float asym = abs(v1.Pt() - v2.Pt()) / (v1.Pt() + v2.Pt()); + float aco = 1.f - std::fabs(dphi) / M_PI; + float asym = std::fabs(v1.Pt() - v2.Pt()) / (v1.Pt() + v2.Pt()); float dphi_e_ee = v1.Phi() - v12.Phi(); o2::math_utils::bringToPMPi(dphi_e_ee); dphi = RecoDecay::constrainAngle(dphi, -o2::constants::math::PIHalf, 1); // shift dphi in [-pi/2, +3pi/2] rad. @@ -912,36 +912,36 @@ struct DileptonMC { o2::math_utils::bringToPMPi(phiCS); if ((FindCommonMotherFrom2ProngsWithoutPDG(t1mc, t2mc) > 0 || IsHF(t1mc, t2mc, mcparticles) > 0) && is_pair_from_same_mcevent) { // for bkg study - if (abs(t1mc.pdgCode()) != pdg_lepton || abs(t2mc.pdgCode()) != pdg_lepton) { // hh or eh correlated bkg - if (abs(t1mc.pdgCode()) != pdg_lepton && abs(t2mc.pdgCode()) != pdg_lepton) { // hh correlated bkg + if (std::abs(t1mc.pdgCode()) != pdg_lepton || std::abs(t2mc.pdgCode()) != pdg_lepton) { // hh or eh correlated bkg + if (std::abs(t1mc.pdgCode()) != pdg_lepton && std::abs(t2mc.pdgCode()) != pdg_lepton) { // hh correlated bkg if (t1.sign() * t2.sign() < 0) { // ULS - fRegistry.fill(HIST("Pair/corr_bkg_hh/uls/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/corr_bkg_hh/uls/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if (t1.sign() > 0 && t2.sign() > 0) { // LS++ - fRegistry.fill(HIST("Pair/corr_bkg_hh/lspp/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/corr_bkg_hh/lspp/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if (t1.sign() < 0 && t2.sign() < 0) { // LS-- - fRegistry.fill(HIST("Pair/corr_bkg_hh/lsmm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/corr_bkg_hh/lsmm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } } else { // eh correlated bkg if (t1.sign() * t2.sign() < 0) { // ULS - fRegistry.fill(HIST("Pair/corr_bkg_eh/uls/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/corr_bkg_eh/uls/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if (t1.sign() > 0 && t2.sign() > 0) { // LS++ - fRegistry.fill(HIST("Pair/corr_bkg_eh/lspp/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/corr_bkg_eh/lspp/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if (t1.sign() < 0 && t2.sign() < 0) { // LS-- - fRegistry.fill(HIST("Pair/corr_bkg_eh/lsmm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/corr_bkg_eh/lsmm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } } } } else { // true combinatorial bkg if (t1.sign() * t2.sign() < 0) { // ULS - fRegistry.fill(HIST("Pair/comb_bkg/uls/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/comb_bkg/uls/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if (t1.sign() > 0 && t2.sign() > 0) { // LS++ - fRegistry.fill(HIST("Pair/comb_bkg/lspp/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/comb_bkg/lspp/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if (t1.sign() < 0 && t2.sign() < 0) { // LS-- - fRegistry.fill(HIST("Pair/comb_bkg/lsmm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/comb_bkg/lsmm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } } - if (abs(t1mc.pdgCode()) != pdg_lepton || abs(t2mc.pdgCode()) != pdg_lepton) { + if (std::abs(t1mc.pdgCode()) != pdg_lepton || std::abs(t2mc.pdgCode()) != pdg_lepton) { return false; } @@ -961,54 +961,54 @@ struct DileptonMC { auto mcmother = mcparticles.iteratorAt(mother_id); if (mcmother.isPhysicalPrimary() || mcmother.producedByGenerator()) { if ((t1mc.isPhysicalPrimary() || t1mc.producedByGenerator()) && (t2mc.isPhysicalPrimary() || t2mc.producedByGenerator())) { - switch (abs(mcmother.pdgCode())) { + switch (std::abs(mcmother.pdgCode())) { case 111: if (IsFromCharm(mcmother, mcparticles) < 0 && IsFromBeauty(mcmother, mcparticles) < 0) { // prompt pi0 - fRegistry.fill(HIST("Pair/sm/PromptPi0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/sm/PromptPi0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { fRegistry.fill(HIST("Pair/sm/PromptPi0/hMvsPhiV"), phiv, v12.M()); } } else { // non-prompt pi0 - fRegistry.fill(HIST("Pair/sm/NonPromptPi0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/sm/NonPromptPi0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { fRegistry.fill(HIST("Pair/sm/NonPromptPi0/hMvsPhiV"), phiv, v12.M()); } } break; case 221: - fRegistry.fill(HIST("Pair/sm/Eta/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/sm/Eta/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); break; case 331: - fRegistry.fill(HIST("Pair/sm/EtaPrime/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/sm/EtaPrime/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); break; case 113: - fRegistry.fill(HIST("Pair/sm/Rho/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/sm/Rho/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); break; case 223: - fRegistry.fill(HIST("Pair/sm/Omega/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/sm/Omega/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); if (mcmother.daughtersIds().size() == 2) { // omeag->ee - fRegistry.fill(HIST("Pair/sm/Omega2ll/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/sm/Omega2ll/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } break; case 333: - fRegistry.fill(HIST("Pair/sm/Phi/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/sm/Phi/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); if (mcmother.daughtersIds().size() == 2) { // phi->ee - fRegistry.fill(HIST("Pair/sm/Phi2ll/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/sm/Phi2ll/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } break; case 443: { if (IsFromBeauty(mcmother, mcparticles) > 0) { - fRegistry.fill(HIST("Pair/sm/NonPromptJPsi/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/sm/NonPromptJPsi/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else { - fRegistry.fill(HIST("Pair/sm/PromptJPsi/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/sm/PromptJPsi/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } break; } case 100443: { if (IsFromBeauty(mcmother, mcparticles) > 0) { - fRegistry.fill(HIST("Pair/sm/NonPromptPsi2S/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/sm/NonPromptPsi2S/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else { - fRegistry.fill(HIST("Pair/sm/PromptPsi2S/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/sm/PromptPsi2S/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } break; } @@ -1016,9 +1016,9 @@ struct DileptonMC { break; } } else if (!(t1mc.isPhysicalPrimary() || t1mc.producedByGenerator()) && !(t2mc.isPhysicalPrimary() || t2mc.producedByGenerator())) { - switch (abs(mcmother.pdgCode())) { + switch (std::abs(mcmother.pdgCode())) { case 22: - fRegistry.fill(HIST("Pair/sm/Photon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/sm/Photon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { fRegistry.fill(HIST("Pair/sm/Photon/hMvsPhiV"), phiv, v12.M()); float rxy_gen = std::sqrt(std::pow(t1mc.vx(), 2) + std::pow(t1mc.vy(), 2)); @@ -1037,105 +1037,105 @@ struct DileptonMC { if (t1mc.pdgCode() * t2mc.pdgCode() < 0) { // ULS switch (hfee_type) { case static_cast(EM_HFeeType::kCe_Ce): { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/hadron_hadron/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/hadron_hadron/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); if (isCharmMeson(mp1) && isCharmMeson(mp2)) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/meson_meson/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/meson_meson/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); if (std::abs(mp1.pdgCode()) == 411 && std::abs(mp2.pdgCode()) == 411) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Dplus_Dminus/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Dplus_Dminus/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if (std::abs(mp1.pdgCode()) == 421 && std::abs(mp2.pdgCode()) == 421) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/D0_D0bar/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/D0_D0bar/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if (std::abs(mp1.pdgCode()) == 431 && std::abs(mp2.pdgCode()) == 431) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Dsplus_Dsminus/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Dsplus_Dsminus/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if ((std::abs(mp1.pdgCode()) == 411 && std::abs(mp2.pdgCode()) == 421) || (std::abs(mp2.pdgCode()) == 411 && std::abs(mp1.pdgCode()) == 421)) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Dpm_D0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Dpm_D0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if ((std::abs(mp1.pdgCode()) == 411 && std::abs(mp2.pdgCode()) == 431) || (std::abs(mp2.pdgCode()) == 411 && std::abs(mp1.pdgCode()) == 431)) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Dpm_Dspm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Dpm_Dspm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if ((std::abs(mp1.pdgCode()) == 421 && std::abs(mp2.pdgCode()) == 431) || (std::abs(mp2.pdgCode()) == 421 && std::abs(mp1.pdgCode()) == 431)) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/D0_Dspm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/D0_Dspm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } } else if (isCharmBaryon(mp1) && isCharmBaryon(mp2)) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/baryon_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/baryon_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); if (std::abs(mp1.pdgCode()) == 4122 && std::abs(mp2.pdgCode()) == 4122) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Lcplus_Lcminus/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Lcplus_Lcminus/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if (std::abs(mp1.pdgCode()) == 4232 && std::abs(mp2.pdgCode()) == 4232) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Xicplus_Xicminus/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Xicplus_Xicminus/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if (std::abs(mp1.pdgCode()) == 4132 && std::abs(mp2.pdgCode()) == 4132) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Xic0_Xic0bar/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Xic0_Xic0bar/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if (std::abs(mp1.pdgCode()) == 4332 && std::abs(mp2.pdgCode()) == 4332) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Omegac0_Omegac0bar/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Omegac0_Omegac0bar/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if ((std::abs(mp1.pdgCode()) == 4122 && std::abs(mp2.pdgCode()) == 4232) || (std::abs(mp2.pdgCode()) == 4122 && std::abs(mp1.pdgCode()) == 4232)) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Lcpm_Xicpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Lcpm_Xicpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if ((std::abs(mp1.pdgCode()) == 4122 && std::abs(mp2.pdgCode()) == 4132) || (std::abs(mp2.pdgCode()) == 4122 && std::abs(mp1.pdgCode()) == 4132)) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Lcpm_Xic0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Lcpm_Xic0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if ((std::abs(mp1.pdgCode()) == 4122 && std::abs(mp2.pdgCode()) == 4332) || (std::abs(mp2.pdgCode()) == 4122 && std::abs(mp1.pdgCode()) == 4332)) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Lcpm_Omegac0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Lcpm_Omegac0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if ((std::abs(mp1.pdgCode()) == 4232 && std::abs(mp2.pdgCode()) == 4132) || (std::abs(mp2.pdgCode()) == 4232 && std::abs(mp1.pdgCode()) == 4132)) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Xicpm_Xic0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Xicpm_Xic0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if ((std::abs(mp1.pdgCode()) == 4232 && std::abs(mp2.pdgCode()) == 4332) || (std::abs(mp2.pdgCode()) == 4232 && std::abs(mp1.pdgCode()) == 4332)) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Xicpm_Omegac0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Xicpm_Omegac0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if ((std::abs(mp1.pdgCode()) == 4132 && std::abs(mp2.pdgCode()) == 4332) || (std::abs(mp2.pdgCode()) == 4132 && std::abs(mp1.pdgCode()) == 4332)) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Xic0_Omegac0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Xic0_Omegac0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } } else { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/meson_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/meson_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); if ((std::abs(mp1.pdgCode()) == 411 && std::abs(mp2.pdgCode()) == 4122) || (std::abs(mp2.pdgCode()) == 411 && std::abs(mp1.pdgCode()) == 4122)) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Dpm_Lcpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Dpm_Lcpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if ((std::abs(mp1.pdgCode()) == 411 && std::abs(mp2.pdgCode()) == 4232) || (std::abs(mp2.pdgCode()) == 411 && std::abs(mp1.pdgCode()) == 4232)) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Dpm_Xicpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Dpm_Xicpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if ((std::abs(mp1.pdgCode()) == 411 && std::abs(mp2.pdgCode()) == 4132) || (std::abs(mp2.pdgCode()) == 411 && std::abs(mp1.pdgCode()) == 4132)) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Dpm_Xic0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Dpm_Xic0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if ((std::abs(mp1.pdgCode()) == 411 && std::abs(mp2.pdgCode()) == 4332) || (std::abs(mp2.pdgCode()) == 411 && std::abs(mp1.pdgCode()) == 4332)) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Dpm_Omegac0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Dpm_Omegac0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if ((std::abs(mp1.pdgCode()) == 421 && std::abs(mp2.pdgCode()) == 4122) || (std::abs(mp2.pdgCode()) == 421 && std::abs(mp1.pdgCode()) == 4122)) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/D0_Lcpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/D0_Lcpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if ((std::abs(mp1.pdgCode()) == 421 && std::abs(mp2.pdgCode()) == 4232) || (std::abs(mp2.pdgCode()) == 421 && std::abs(mp1.pdgCode()) == 4232)) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/D0_Xicpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/D0_Xicpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if ((std::abs(mp1.pdgCode()) == 421 && std::abs(mp2.pdgCode()) == 4132) || (std::abs(mp2.pdgCode()) == 421 && std::abs(mp1.pdgCode()) == 4132)) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/D0_Xic0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/D0_Xic0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if ((std::abs(mp1.pdgCode()) == 421 && std::abs(mp2.pdgCode()) == 4332) || (std::abs(mp2.pdgCode()) == 421 && std::abs(mp1.pdgCode()) == 4332)) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/D0_Omegac0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/D0_Omegac0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if ((std::abs(mp1.pdgCode()) == 431 && std::abs(mp2.pdgCode()) == 4122) || (std::abs(mp2.pdgCode()) == 431 && std::abs(mp1.pdgCode()) == 4122)) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Dspm_Lcpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Dspm_Lcpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if ((std::abs(mp1.pdgCode()) == 431 && std::abs(mp2.pdgCode()) == 4232) || (std::abs(mp2.pdgCode()) == 431 && std::abs(mp1.pdgCode()) == 4232)) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Dspm_Xicpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Dspm_Xicpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if ((std::abs(mp1.pdgCode()) == 431 && std::abs(mp2.pdgCode()) == 4132) || (std::abs(mp2.pdgCode()) == 431 && std::abs(mp1.pdgCode()) == 4132)) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Dspm_Xic0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Dspm_Xic0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if ((std::abs(mp1.pdgCode()) == 431 && std::abs(mp2.pdgCode()) == 4332) || (std::abs(mp2.pdgCode()) == 431 && std::abs(mp1.pdgCode()) == 4332)) { - fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Dspm_Omegac0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/ccbar/c2l_c2l/Dspm_Omegac0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } } break; } case static_cast(EM_HFeeType::kBe_Be): { - fRegistry.fill(HIST("Pair/bbbar/b2l_b2l/hadron_hadron/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/bbbar/b2l_b2l/hadron_hadron/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); if (isBeautyMeson(mp1) && isBeautyMeson(mp2)) { - fRegistry.fill(HIST("Pair/bbbar/b2l_b2l/meson_meson/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/bbbar/b2l_b2l/meson_meson/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if (isBeautyBaryon(mp1) && isBeautyBaryon(mp2)) { - fRegistry.fill(HIST("Pair/bbbar/b2l_b2l/baryon_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/bbbar/b2l_b2l/baryon_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else { - fRegistry.fill(HIST("Pair/bbbar/b2l_b2l/meson_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/bbbar/b2l_b2l/meson_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } break; } case static_cast(EM_HFeeType::kBCe_BCe): { - fRegistry.fill(HIST("Pair/bbbar/b2c2l_b2c2l/hadron_hadron/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/bbbar/b2c2l_b2c2l/hadron_hadron/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); if (isCharmMeson(mp1) && isCharmMeson(mp2)) { - fRegistry.fill(HIST("Pair/bbbar/b2c2l_b2c2l/meson_meson/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/bbbar/b2c2l_b2c2l/meson_meson/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if (isCharmBaryon(mp1) && isCharmBaryon(mp2)) { - fRegistry.fill(HIST("Pair/bbbar/b2c2l_b2c2l/baryon_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/bbbar/b2c2l_b2c2l/baryon_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else { - fRegistry.fill(HIST("Pair/bbbar/b2c2l_b2c2l/meson_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/bbbar/b2c2l_b2c2l/meson_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } break; } case static_cast(EM_HFeeType::kBCe_Be_SameB): { // ULS - fRegistry.fill(HIST("Pair/bbbar/b2c2l_b2l_sameb/hadron_hadron/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/bbbar/b2c2l_b2l_sameb/hadron_hadron/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); if ((isCharmMeson(mp1) && isBeautyMeson(mp2)) || (isCharmMeson(mp2) && isBeautyMeson(mp1))) { - fRegistry.fill(HIST("Pair/bbbar/b2c2l_b2l_sameb/meson_meson/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/bbbar/b2c2l_b2l_sameb/meson_meson/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if ((isCharmBaryon(mp1) && isBeautyBaryon(mp2)) || (isCharmBaryon(mp2) && isBeautyBaryon(mp1))) { - fRegistry.fill(HIST("Pair/bbbar/b2c2l_b2l_sameb/baryon_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/bbbar/b2c2l_b2l_sameb/baryon_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else { - fRegistry.fill(HIST("Pair/bbbar/b2c2l_b2l_sameb/meson_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/bbbar/b2c2l_b2l_sameb/meson_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } break; } @@ -1160,13 +1160,13 @@ struct DileptonMC { LOGF(info, "You should not see kBCe_Be_SameB in LS. Good luck."); break; case static_cast(EM_HFeeType::kBCe_Be_DiffB): { // LS - fRegistry.fill(HIST("Pair/bbbar/b2c2l_b2l_diffb/hadron_hadron/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/bbbar/b2c2l_b2l_diffb/hadron_hadron/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); if ((isCharmMeson(mp1) && isBeautyMeson(mp2)) || (isCharmMeson(mp2) && isBeautyMeson(mp1))) { - fRegistry.fill(HIST("Pair/bbbar/b2c2l_b2l_diffb/meson_meson/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/bbbar/b2c2l_b2l_diffb/meson_meson/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if ((isCharmBaryon(mp1) && isBeautyBaryon(mp2)) || (isCharmBaryon(mp2) && isBeautyBaryon(mp1))) { - fRegistry.fill(HIST("Pair/bbbar/b2c2l_b2l_diffb/baryon_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/bbbar/b2c2l_b2l_diffb/baryon_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else { - fRegistry.fill(HIST("Pair/bbbar/b2c2l_b2l_diffb/meson_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/bbbar/b2c2l_b2l_diffb/meson_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } break; } @@ -1357,8 +1357,8 @@ struct DileptonMC { } } - float aco = 1.f - abs(dphi) / M_PI; - float asym = abs(v1.Pt() - v2.Pt()) / (v1.Pt() + v2.Pt()); + float aco = 1.f - std::fabs(dphi) / M_PI; + float asym = std::fabs(v1.Pt() - v2.Pt()) / (v1.Pt() + v2.Pt()); float dphi_e_ee = v1.Phi() - v12.Phi(); o2::math_utils::bringToPMPi(dphi_e_ee); dphi = RecoDecay::constrainAngle(dphi, -o2::constants::math::PIHalf, 1); // shift dphi in [-pi/2, +3pi/2] rad. after deta-dphi cut. @@ -1371,48 +1371,48 @@ struct DileptonMC { auto mcmother = mcparticles.iteratorAt(mother_id); if (mcmother.isPhysicalPrimary() || mcmother.producedByGenerator()) { - switch (abs(mcmother.pdgCode())) { + switch (std::abs(mcmother.pdgCode())) { case 111: if (IsFromCharm(mcmother, mcparticles) < 0 && IsFromBeauty(mcmother, mcparticles) < 0) { // prompt pi0 - fRegistry.fill(HIST("Generated/sm/PromptPi0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/sm/PromptPi0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else { // non-prompt pi0 - fRegistry.fill(HIST("Generated/sm/NonPromptPi0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/sm/NonPromptPi0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } break; case 221: - fRegistry.fill(HIST("Generated/sm/Eta/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/sm/Eta/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); break; case 331: - fRegistry.fill(HIST("Generated/sm/EtaPrime/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/sm/EtaPrime/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); break; case 113: - fRegistry.fill(HIST("Generated/sm/Rho/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/sm/Rho/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); break; case 223: - fRegistry.fill(HIST("Generated/sm/Omega/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/sm/Omega/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); if (mcmother.daughtersIds().size() == 2) { // omega->ee - fRegistry.fill(HIST("Generated/sm/Omega2ll/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/sm/Omega2ll/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } break; case 333: - fRegistry.fill(HIST("Generated/sm/Phi/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/sm/Phi/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); if (mcmother.daughtersIds().size() == 2) { // phi->ee - fRegistry.fill(HIST("Generated/sm/Phi2ll/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/sm/Phi2ll/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } break; case 443: { if (IsFromBeauty(mcmother, mcparticles) > 0) { - fRegistry.fill(HIST("Generated/sm/NonPromptJPsi/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/sm/NonPromptJPsi/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else { - fRegistry.fill(HIST("Generated/sm/PromptJPsi/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/sm/PromptJPsi/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } break; } case 100443: { if (IsFromBeauty(mcmother, mcparticles) > 0) { - fRegistry.fill(HIST("Generated/sm/NonPromptPsi2S/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/sm/NonPromptPsi2S/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else { - fRegistry.fill(HIST("Generated/sm/PromptPsi2S/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/sm/PromptPsi2S/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } break; } @@ -1425,105 +1425,105 @@ struct DileptonMC { auto mp2 = mcparticles.iteratorAt(t2.mothersIds()[0]); switch (hfee_type) { case static_cast(EM_HFeeType::kCe_Ce): { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/hadron_hadron/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/hadron_hadron/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); if (isCharmMeson(mp1) && isCharmMeson(mp2)) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/meson_meson/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/meson_meson/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); if (std::abs(mp1.pdgCode()) == 411 && std::abs(mp2.pdgCode()) == 411) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Dplus_Dminus/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Dplus_Dminus/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if (std::abs(mp1.pdgCode()) == 421 && std::abs(mp2.pdgCode()) == 421) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/D0_D0bar/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/D0_D0bar/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if (std::abs(mp1.pdgCode()) == 431 && std::abs(mp2.pdgCode()) == 431) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Dsplus_Dsminus/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Dsplus_Dsminus/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if ((std::abs(mp1.pdgCode()) == 411 && std::abs(mp2.pdgCode()) == 421) || (std::abs(mp2.pdgCode()) == 411 && std::abs(mp1.pdgCode()) == 421)) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Dpm_D0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Dpm_D0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if ((std::abs(mp1.pdgCode()) == 411 && std::abs(mp2.pdgCode()) == 431) || (std::abs(mp2.pdgCode()) == 411 && std::abs(mp1.pdgCode()) == 431)) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Dpm_Dspm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Dpm_Dspm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if ((std::abs(mp1.pdgCode()) == 421 && std::abs(mp2.pdgCode()) == 431) || (std::abs(mp2.pdgCode()) == 421 && std::abs(mp1.pdgCode()) == 431)) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/D0_Dspm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/D0_Dspm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } } else if (isCharmBaryon(mp1) && isCharmBaryon(mp2)) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/baryon_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/baryon_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); if (std::abs(mp1.pdgCode()) == 4122 && std::abs(mp2.pdgCode()) == 4122) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Lcplus_Lcminus/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Lcplus_Lcminus/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if (std::abs(mp1.pdgCode()) == 4232 && std::abs(mp2.pdgCode()) == 4232) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Xicplus_Xicminus/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Xicplus_Xicminus/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if (std::abs(mp1.pdgCode()) == 4132 && std::abs(mp2.pdgCode()) == 4132) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Xic0_Xic0bar/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Xic0_Xic0bar/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if (std::abs(mp1.pdgCode()) == 4332 && std::abs(mp2.pdgCode()) == 4332) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Omegac0_Omegac0bar/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Omegac0_Omegac0bar/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if ((std::abs(mp1.pdgCode()) == 4122 && std::abs(mp2.pdgCode()) == 4232) || (std::abs(mp2.pdgCode()) == 4122 && std::abs(mp1.pdgCode()) == 4232)) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Lcpm_Xicpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Lcpm_Xicpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if ((std::abs(mp1.pdgCode()) == 4122 && std::abs(mp2.pdgCode()) == 4132) || (std::abs(mp2.pdgCode()) == 4122 && std::abs(mp1.pdgCode()) == 4132)) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Lcpm_Xic0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Lcpm_Xic0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if ((std::abs(mp1.pdgCode()) == 4122 && std::abs(mp2.pdgCode()) == 4332) || (std::abs(mp2.pdgCode()) == 4122 && std::abs(mp1.pdgCode()) == 4332)) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Lcpm_Omegac0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Lcpm_Omegac0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if ((std::abs(mp1.pdgCode()) == 4232 && std::abs(mp2.pdgCode()) == 4132) || (std::abs(mp2.pdgCode()) == 4232 && std::abs(mp1.pdgCode()) == 4132)) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Xicpm_Xic0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Xicpm_Xic0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if ((std::abs(mp1.pdgCode()) == 4232 && std::abs(mp2.pdgCode()) == 4332) || (std::abs(mp2.pdgCode()) == 4232 && std::abs(mp1.pdgCode()) == 4332)) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Xicpm_Omegac0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Xicpm_Omegac0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if ((std::abs(mp1.pdgCode()) == 4132 && std::abs(mp2.pdgCode()) == 4332) || (std::abs(mp2.pdgCode()) == 4132 && std::abs(mp1.pdgCode()) == 4332)) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Xic0_Omegac0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Xic0_Omegac0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } } else { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/meson_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/meson_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); if ((std::abs(mp1.pdgCode()) == 411 && std::abs(mp2.pdgCode()) == 4122) || (std::abs(mp2.pdgCode()) == 411 && std::abs(mp1.pdgCode()) == 4122)) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Dpm_Lcpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Dpm_Lcpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if ((std::abs(mp1.pdgCode()) == 411 && std::abs(mp2.pdgCode()) == 4232) || (std::abs(mp2.pdgCode()) == 411 && std::abs(mp1.pdgCode()) == 4232)) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Dpm_Xicpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Dpm_Xicpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if ((std::abs(mp1.pdgCode()) == 411 && std::abs(mp2.pdgCode()) == 4132) || (std::abs(mp2.pdgCode()) == 411 && std::abs(mp1.pdgCode()) == 4132)) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Dpm_Xic0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Dpm_Xic0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if ((std::abs(mp1.pdgCode()) == 411 && std::abs(mp2.pdgCode()) == 4332) || (std::abs(mp2.pdgCode()) == 411 && std::abs(mp1.pdgCode()) == 4332)) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Dpm_Omegac0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Dpm_Omegac0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if ((std::abs(mp1.pdgCode()) == 421 && std::abs(mp2.pdgCode()) == 4122) || (std::abs(mp2.pdgCode()) == 421 && std::abs(mp1.pdgCode()) == 4122)) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/D0_Lcpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/D0_Lcpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if ((std::abs(mp1.pdgCode()) == 421 && std::abs(mp2.pdgCode()) == 4232) || (std::abs(mp2.pdgCode()) == 421 && std::abs(mp1.pdgCode()) == 4232)) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/D0_Xicpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/D0_Xicpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if ((std::abs(mp1.pdgCode()) == 421 && std::abs(mp2.pdgCode()) == 4132) || (std::abs(mp2.pdgCode()) == 421 && std::abs(mp1.pdgCode()) == 4132)) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/D0_Xic0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/D0_Xic0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if ((std::abs(mp1.pdgCode()) == 421 && std::abs(mp2.pdgCode()) == 4332) || (std::abs(mp2.pdgCode()) == 421 && std::abs(mp1.pdgCode()) == 4332)) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/D0_Omegac0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/D0_Omegac0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if ((std::abs(mp1.pdgCode()) == 431 && std::abs(mp2.pdgCode()) == 4122) || (std::abs(mp2.pdgCode()) == 431 && std::abs(mp1.pdgCode()) == 4122)) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Dspm_Lcpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Dspm_Lcpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if ((std::abs(mp1.pdgCode()) == 431 && std::abs(mp2.pdgCode()) == 4232) || (std::abs(mp2.pdgCode()) == 431 && std::abs(mp1.pdgCode()) == 4232)) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Dspm_Xicpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Dspm_Xicpm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if ((std::abs(mp1.pdgCode()) == 431 && std::abs(mp2.pdgCode()) == 4132) || (std::abs(mp2.pdgCode()) == 431 && std::abs(mp1.pdgCode()) == 4132)) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Dspm_Xic0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Dspm_Xic0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if ((std::abs(mp1.pdgCode()) == 431 && std::abs(mp2.pdgCode()) == 4332) || (std::abs(mp2.pdgCode()) == 431 && std::abs(mp1.pdgCode()) == 4332)) { - fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Dspm_Omegac0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/ccbar/c2l_c2l/Dspm_Omegac0/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } } break; } case static_cast(EM_HFeeType::kBe_Be): { - fRegistry.fill(HIST("Generated/bbbar/b2l_b2l/hadron_hadron/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/bbbar/b2l_b2l/hadron_hadron/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); if (isBeautyMeson(mp1) && isBeautyMeson(mp2)) { - fRegistry.fill(HIST("Generated/bbbar/b2l_b2l/meson_meson/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/bbbar/b2l_b2l/meson_meson/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if (isBeautyBaryon(mp1) && isBeautyBaryon(mp2)) { - fRegistry.fill(HIST("Generated/bbbar/b2l_b2l/baryon_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/bbbar/b2l_b2l/baryon_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else { - fRegistry.fill(HIST("Generated/bbbar/b2l_b2l/meson_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/bbbar/b2l_b2l/meson_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } break; } case static_cast(EM_HFeeType::kBCe_BCe): { - fRegistry.fill(HIST("Generated/bbbar/b2c2l_b2c2l/hadron_hadron/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/bbbar/b2c2l_b2c2l/hadron_hadron/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); if (isCharmMeson(mp1) && isCharmMeson(mp2)) { - fRegistry.fill(HIST("Generated/bbbar/b2l_b2l/meson_meson/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/bbbar/b2l_b2l/meson_meson/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if (isCharmBaryon(mp1) && isCharmBaryon(mp2)) { - fRegistry.fill(HIST("Generated/bbbar/b2l_b2l/baryon_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/bbbar/b2l_b2l/baryon_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else { - fRegistry.fill(HIST("Generated/bbbar/b2l_b2l/meson_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/bbbar/b2l_b2l/meson_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } break; } case static_cast(EM_HFeeType::kBCe_Be_SameB): { // ULS - fRegistry.fill(HIST("Generated/bbbar/b2c2l_b2l_sameb/hadron_hadron/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/bbbar/b2c2l_b2l_sameb/hadron_hadron/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); if ((isCharmMeson(mp1) && isBeautyMeson(mp2)) || (isCharmMeson(mp2) && isBeautyMeson(mp1))) { - fRegistry.fill(HIST("Generated/bbbar/b2c2l_b2l_sameb/meson_meson/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/bbbar/b2c2l_b2l_sameb/meson_meson/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if ((isCharmBaryon(mp1) && isBeautyBaryon(mp2)) || (isCharmBaryon(mp2) && isBeautyBaryon(mp1))) { - fRegistry.fill(HIST("Generated/bbbar/b2c2l_b2l_sameb/baryon_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/bbbar/b2c2l_b2l_sameb/baryon_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else { - fRegistry.fill(HIST("Generated/bbbar/b2c2l_b2l_sameb/meson_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/bbbar/b2c2l_b2l_sameb/meson_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } break; } @@ -1631,8 +1631,8 @@ struct DileptonMC { } } - float aco = 1.f - abs(dphi) / M_PI; - float asym = abs(v1.Pt() - v2.Pt()) / (v1.Pt() + v2.Pt()); + float aco = 1.f - std::fabs(dphi) / M_PI; + float asym = std::fabs(v1.Pt() - v2.Pt()) / (v1.Pt() + v2.Pt()); float dphi_e_ee = v1.Phi() - v12.Phi(); o2::math_utils::bringToPMPi(dphi_e_ee); dphi = RecoDecay::constrainAngle(dphi, -o2::constants::math::PIHalf, 1); // shift dphi in [-pi/2, +3pi/2] rad. after deta-dphi cut. @@ -1658,13 +1658,13 @@ struct DileptonMC { LOGF(info, "You should not see kBCe_Be_SameB in LS++. Good luck."); break; case static_cast(EM_HFeeType::kBCe_Be_DiffB): { // LS - fRegistry.fill(HIST("Generated/bbbar/b2c2l_b2l_diffb/hadron_hadron/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/bbbar/b2c2l_b2l_diffb/hadron_hadron/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); if ((isCharmMeson(mp1) && isBeautyMeson(mp2)) || (isCharmMeson(mp2) && isBeautyMeson(mp1))) { - fRegistry.fill(HIST("Generated/bbbar/b2c2l_b2l_diffb/meson_meson/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/bbbar/b2c2l_b2l_diffb/meson_meson/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if ((isCharmBaryon(mp1) && isBeautyBaryon(mp2)) || (isCharmBaryon(mp2) && isBeautyBaryon(mp1))) { - fRegistry.fill(HIST("Generated/bbbar/b2c2l_b2l_diffb/baryon_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/bbbar/b2c2l_b2l_diffb/baryon_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else { - fRegistry.fill(HIST("Generated/bbbar/b2c2l_b2l_diffb/meson_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/bbbar/b2c2l_b2l_diffb/meson_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } break; } @@ -1769,8 +1769,8 @@ struct DileptonMC { } } - float aco = 1.f - abs(dphi) / M_PI; - float asym = abs(v1.Pt() - v2.Pt()) / (v1.Pt() + v2.Pt()); + float aco = 1.f - std::fabs(dphi) / M_PI; + float asym = std::fabs(v1.Pt() - v2.Pt()) / (v1.Pt() + v2.Pt()); float dphi_e_ee = v1.Phi() - v12.Phi(); o2::math_utils::bringToPMPi(dphi_e_ee); dphi = RecoDecay::constrainAngle(dphi, -o2::constants::math::PIHalf, 1); // shift dphi in [-pi/2, +3pi/2] rad. after deta-dphi cut. @@ -1796,13 +1796,13 @@ struct DileptonMC { LOGF(info, "You should not see kBCe_Be_SameB in LS--. Good luck."); break; case static_cast(EM_HFeeType::kBCe_Be_DiffB): { // LS - fRegistry.fill(HIST("Generated/bbbar/b2c2l_b2l_diffb/hadron_hadron/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/bbbar/b2c2l_b2l_diffb/hadron_hadron/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); if ((isCharmMeson(mp1) && isBeautyMeson(mp2)) || (isCharmMeson(mp2) && isBeautyMeson(mp1))) { - fRegistry.fill(HIST("Generated/bbbar/b2c2l_b2l_diffb/meson_meson/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/bbbar/b2c2l_b2l_diffb/meson_meson/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else if ((isCharmBaryon(mp1) && isBeautyBaryon(mp2)) || (isCharmBaryon(mp2) && isBeautyBaryon(mp1))) { - fRegistry.fill(HIST("Generated/bbbar/b2c2l_b2l_diffb/baryon_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/bbbar/b2c2l_b2l_diffb/baryon_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } else { - fRegistry.fill(HIST("Generated/bbbar/b2c2l_b2l_diffb/meson_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, abs(cos_thetaCS), abs(phiCS), aco, asym, abs(dphi_e_ee)); + fRegistry.fill(HIST("Generated/bbbar/b2c2l_b2l_diffb/meson_baryon/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee)); } break; } @@ -2020,7 +2020,7 @@ struct DileptonMC { continue; } - if ((abs(mcpos.pdgCode()) != pdg_lepton || abs(mcneg.pdgCode()) != pdg_lepton) || (mcpos.emmceventId() != mcneg.emmceventId())) { + if ((std::abs(mcpos.pdgCode()) != pdg_lepton || std::abs(mcneg.pdgCode()) != pdg_lepton) || (mcpos.emmceventId() != mcneg.emmceventId())) { continue; } if (mcpos.pdgCode() * mcneg.pdgCode() > 0) { // ULS @@ -2054,7 +2054,7 @@ struct DileptonMC { if (mother_id > -1) { auto mcmother = mcparticles.iteratorAt(mother_id); if (mcmother.isPhysicalPrimary() || mcmother.producedByGenerator()) { - switch (abs(mcmother.pdgCode())) { + switch (std::abs(mcmother.pdgCode())) { case 111: case 221: case 331: @@ -2159,7 +2159,7 @@ struct DileptonMC { continue; } - if ((abs(mcpos1.pdgCode()) != pdg_lepton || abs(mcpos2.pdgCode()) != pdg_lepton) || (mcpos1.emmceventId() != mcpos2.emmceventId())) { + if ((std::abs(mcpos1.pdgCode()) != pdg_lepton || std::abs(mcpos2.pdgCode()) != pdg_lepton) || (mcpos1.emmceventId() != mcpos2.emmceventId())) { continue; } if (mcpos1.pdgCode() * mcpos2.pdgCode() < 0) { // LS @@ -2233,7 +2233,7 @@ struct DileptonMC { if (!isPairOK(collision, neg1, neg2, cut)) { // without acceptance continue; } - if ((abs(mcneg1.pdgCode()) != pdg_lepton || abs(mcneg2.pdgCode()) != pdg_lepton) || (mcneg1.emmceventId() != mcneg2.emmceventId())) { + if ((std::abs(mcneg1.pdgCode()) != pdg_lepton || std::abs(mcneg2.pdgCode()) != pdg_lepton) || (mcneg1.emmceventId() != mcneg2.emmceventId())) { continue; } if (mcneg1.pdgCode() * mcneg2.pdgCode() < 0) { // LS @@ -2399,7 +2399,7 @@ struct DileptonMC { } } - switch (abs(mctrack.pdgCode())) { + switch (std::abs(mctrack.pdgCode())) { case 223: fRegistry.fill(HIST("Generated/sm/Omega2ll/hPtY"), mctrack.y(), mctrack.pt(), 1.f / mctrack.dsf()); break; @@ -2446,7 +2446,7 @@ struct DileptonMC { if (collision.sel8()) { fRegistry.fill(HIST("Event/norm/hCollisionCounter"), 10.0); } - if (abs(collision.posZ()) < 10.0) { + if (std::fabs(collision.posZ()) < 10.0) { fRegistry.fill(HIST("Event/norm/hCollisionCounter"), 11.0); } if (collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { diff --git a/PWGEM/Dilepton/Core/SingleTrackQCMC.h b/PWGEM/Dilepton/Core/SingleTrackQCMC.h index 05c6471f495..b014746a35d 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQCMC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQCMC.h @@ -715,7 +715,7 @@ struct SingleTrackQCMC { for (auto& track : tracks_per_coll) { auto mctrack = track.template emmcparticle_as(); - if (abs(mctrack.pdgCode()) != pdg_lepton) { + if (std::abs(mctrack.pdgCode()) != pdg_lepton) { continue; } @@ -752,7 +752,7 @@ struct SingleTrackQCMC { continue; } auto mcmother = mcparticles.iteratorAt(mctrack.mothersIds()[0]); - int pdg_mother = abs(mcmother.pdgCode()); + int pdg_mother = std::abs(mcmother.pdgCode()); if (mctrack.isPhysicalPrimary() || mctrack.producedByGenerator()) { if (pdg_mother == 111 || pdg_mother == 221 || pdg_mother == 331 || pdg_mother == 113 || pdg_mother == 223 || pdg_mother == 333) { @@ -826,7 +826,7 @@ struct SingleTrackQCMC { continue; } auto mcmother = mcparticles.iteratorAt(lepton.mothersIds()[0]); - int pdg_mother = abs(mcmother.pdgCode()); + int pdg_mother = std::abs(mcmother.pdgCode()); float pt = 0.f, eta = 0.f, phi = 0.f; if constexpr (isSmeared) { @@ -1068,7 +1068,7 @@ struct SingleTrackQCMC { if (collision.sel8()) { fRegistry.fill(HIST("Event/norm/hCollisionCounter"), 10.0); } - if (abs(collision.posZ()) < 10.0) { + if (std::fabs(collision.posZ()) < 10.0) { fRegistry.fill(HIST("Event/norm/hCollisionCounter"), 11.0); } if (collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { From db4ae8f0b449975384667bb4148f8452bd1fb716 Mon Sep 17 00:00:00 2001 From: Joachim Carlo Kristian Bjerg Hansen <50103987+joachimckh@users.noreply.github.com> Date: Sun, 16 Mar 2025 21:51:19 +0100 Subject: [PATCH 0709/1650] [PWGJE] update mc process, generalized jetloop (#10527) --- PWGJE/Tasks/jetSpectraEseTask.cxx | 251 ++++++++++++++++-------------- 1 file changed, 137 insertions(+), 114 deletions(-) diff --git a/PWGJE/Tasks/jetSpectraEseTask.cxx b/PWGJE/Tasks/jetSpectraEseTask.cxx index 0b720cdbb83..dd64d3cf8e4 100644 --- a/PWGJE/Tasks/jetSpectraEseTask.cxx +++ b/PWGJE/Tasks/jetSpectraEseTask.cxx @@ -54,7 +54,7 @@ struct JetSpectraEseTask { ConfigurableAxis binCos{"binCos", {100, -1.05, 1.05}, ""}; ConfigurableAxis binOccupancy{"binOccupancy", {5000, 0, 25000}, ""}; ConfigurableAxis binQVec{"binQVec", {500, -3, 3}, ""}; - ConfigurableAxis binCentrality{"binCentrality", {100, 0, 100}, ""}; + ConfigurableAxis binCentrality{"binCentrality", {101, -1, 100}, ""}; ConfigurableAxis binPhi{"binPhi", {60, -1.0, 7.0}, ""}; ConfigurableAxis binEta{"binEta", {80, -0.9, 0.9}, ""}; ConfigurableAxis binFit0{"binFit0", {100, 0, 50}, ""}; @@ -72,6 +72,8 @@ struct JetSpectraEseTask { Configurable jetAreaFractionMin{"jetAreaFractionMin", 0.56, "used to make a cut on the jet areas"}; Configurable fjetAreaCut{"fjetAreaCut", true, "Flag for jet area cut"}; Configurable cfgCentVariant{"cfgCentVariant", false, "Flag for centrality variant 1"}; + Configurable cfgisPbPb{"cfgisPbPb", false, "Flag for using MC centrality in PbPb"}; + Configurable cfgbkgSubMC{"cfgbkgSubMC", true, "Flag for MC background subtraction"}; Configurable trackEtaMin{"trackEtaMin", -0.9, "minimum eta acceptance for tracks"}; Configurable trackEtaMax{"trackEtaMax", 0.9, "maximum eta acceptance for tracks"}; @@ -214,63 +216,61 @@ struct JetSpectraEseTask { } if (doprocessMCParticleLevel) { LOGF(info, "JetSpectraEseTask::init() - MC Particle level"); - registry.add("hMCPartEventCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); - registry.add("hPartCentralitySel", ";centr;entries", {HistType::kTH1F, {{centAxis}}}); - registry.add("hPartJetPt", "particle level jet pT;#it{p}_{T,jet part} (GeV/#it{c});entries", {HistType::kTH1F, {{jetPtAxis}}}); - registry.add("hPartJetPtSubBkg", "particle level jet pT;#it{p}_{T,jet part} (GeV/#it{c});entries", {HistType::kTH1F, {{jetPtAxis}}}); - registry.add("hPartJetSparse", ";Centrality;#it{p}_{T,jet part} (GeV/#it{c})", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {etaAxis}, {phiAxis}}}); - registry.add("hPartJetEta", "particle level jet #eta;#eta_{jet part};entries", {HistType::kTH1F, {{etaAxis}}}); - registry.add("hPartJetPhi", "particle level jet #phi;#phi_{jet part};entries", {HistType::kTH1F, {{phiAxis}}}); - - registry.get(HIST("hMCPartEventCounter"))->GetXaxis()->SetBinLabel(1, "Input event"); - registry.get(HIST("hMCPartEventCounter"))->GetXaxis()->SetBinLabel(2, "Collision size < 1"); - registry.get(HIST("hMCPartEventCounter"))->GetXaxis()->SetBinLabel(3, "MCD size != 1"); + registry.add("mcp/hEventCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); + registry.add("mcp/hCentralitySel", ";centr;entries", {HistType::kTH1F, {{centAxis}}}); + // registry.add("mcp/hJetSparse", ";Centrality;#it{p}_{T,jet part}; #eta; #phi", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {etaAxis}, {phiAxis}}}); + registry.add("mcp/hJetSparse", ";Centrality;#it{p}_{T,jet part}; #eta; #phi", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {etaAxis}, {phiAxis}}}); + // registry.add("mcp/hJetPt", "particle level jet pT;#it{p}_{T,jet part} (GeV/#it{c});entries", {HistType::kTH1F, {{jetPtAxis}}}); + // registry.add("mcp/hJetEta", "particle level jet #eta;#eta_{jet part};entries", {HistType::kTH1F, {{etaAxis}}}); + // registry.add("mcp/hJetPhi", "particle level jet #phi;#phi_{jet part};entries", {HistType::kTH1F, {{phiAxis}}}); + + registry.get(HIST("mcp/hEventCounter"))->GetXaxis()->SetBinLabel(1, "Input event"); + registry.get(HIST("mcp/hEventCounter"))->GetXaxis()->SetBinLabel(2, "Collision size < 1"); + registry.get(HIST("mcp/hEventCounter"))->GetXaxis()->SetBinLabel(3, "MCD size != 1"); + registry.get(HIST("mcp/hEventCounter"))->GetXaxis()->SetBinLabel(4, "Occupancy cut"); } if (doprocessMCDetectorLevel) { LOGF(info, "JetSpectraEseTask::init() - MC Detector level"); - registry.add("hMCDetEventCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); - registry.add("hDetCentralitySel", ";centr;entries", {HistType::kTH1F, {{100, 0.0, 100.0}}}); - registry.add("hDetJetPt", "particle level jet pT;#it{p}_{T,jet part} (GeV/#it{c});entries", {HistType::kTH1F, {{jetPtAxis}}}); - registry.add("hDetJetSparse", ";Centr;#it{p}_{T,jet part} (GeV/#it{c})", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {etaAxis}, {phiAxis}}}); - registry.add("hDetJetEta", "particle level jet #eta;#eta_{jet part};entries", {HistType::kTH1F, {{etaAxis}}}); - registry.add("hDetJetPhi", "particle level jet #phi;#phi_{jet part};entries", {HistType::kTH1F, {{phiAxis}}}); - - registry.get(HIST("hMCDetEventCounter"))->GetXaxis()->SetBinLabel(1, "Input event"); - registry.get(HIST("hMCDetEventCounter"))->GetXaxis()->SetBinLabel(2, "Event eelection"); - registry.get(HIST("hMCDetEventCounter"))->GetXaxis()->SetBinLabel(3, "Occupancy cut"); + registry.add("mcd/hEventCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); + registry.add("mcd/hCentralitySel", ";centr;entries", {HistType::kTH1F, {{centAxis}}}); + // registry.add("mcd/hJetPt", "particle level jet pT;#it{p}_{T,jet part} (GeV/#it{c});entries", {HistType::kTH1F, {{jetPtAxis}}}); + // registry.add("mcd/hJetSparse", ";Centrality;#it{p}_{T,jet det}; #eta; #phi", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {etaAxis}, {phiAxis}}}); + registry.add("mcd/hJetSparse", ";Centrality;#it{p}_{T,jet det}; #eta; #phi", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {etaAxis}, {phiAxis}}}); + // registry.add("mcd/hJetEta", "particle level jet #eta;#eta_{jet part};entries", {HistType::kTH1F, {{etaAxis}}}); + // registry.add("mcd/hJetPhi", "particle level jet #phi;#phi_{jet part};entries", {HistType::kTH1F, {{phiAxis}}}); + + registry.get(HIST("mcd/hEventCounter"))->GetXaxis()->SetBinLabel(1, "Input event"); + registry.get(HIST("mcd/hEventCounter"))->GetXaxis()->SetBinLabel(2, "Collision size < 1"); + registry.get(HIST("mcd/hEventCounter"))->GetXaxis()->SetBinLabel(3, "Occupancy cut"); } if (doprocessMCChargedMatched) { LOGF(info, "JetSpectraEseTask::init() - MC Charged Matched"); - registry.add("hMCEventCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); - registry.add("hMCDMatchedEventCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); - registry.add("hCentralityAnalyzed", ";Centrality;entries", {HistType::kTH1F, {{centAxis}}}); - registry.add("hPartJetPtMatch", ";Centrality;#it{p}_{T,jet part} (GeV/#it{c})", {HistType::kTH2F, {{centAxis}, {jetPtAxis}}}); - registry.add("hPartJetPtMatchSubBkg", ";Centrality;#it{p}_{T,jet part} (GeV/#it{c})", {HistType::kTH2F, {{centAxis}, {jetPtAxis}}}); - registry.add("hPartJetMatchSparse", ";Centrality;#it{p}_{T,jet part} (GeV/#it{c})", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {etaAxis}, {phiAxis}}}); - registry.add("hPartJetEtaMatch", "particle level jet #eta;#eta_{jet part};entries", {HistType::kTH1F, {{etaAxis}}}); - registry.add("hPartJetPhiMatch", "particle level jet #phi;#phi_{jet part};entries", {HistType::kTH1F, {{phiAxis}}}); - registry.add("hDetectorJetPt", ";Centrality;#it{p}_{T,jet det} (GeV/#it{c})", {HistType::kTH2F, {{centAxis}, {jetPtAxis}}}); - registry.add("hDetectorJetPtSubBkg", ";Centrality;#it{p}_{T,jet det} (GeV/#it{c})", {HistType::kTH2F, {{centAxis}, {jetPtAxis}}}); - registry.add("hDetectorJetEta", "detector level jet #eta;#eta_{jet det};entries", {HistType::kTH1F, {{etaAxis}}}); - registry.add("hDetectorJetPhi", "detector level jet #phi;#phi_{jet det};entries", {HistType::kTH1F, {{phiAxis}}}); - registry.add("hMatchedJetsPtDelta", "#it{p}_{T,jet part}; det - part", {HistType::kTH2F, {{jetPtAxis}, {100, -20., 20.0}}}); - registry.add("hGenMatchedJetsPtDeltadPt", "#it{p}_{T,jet part}; det - part / part", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {200, -20., 20.0}}}); - registry.add("hRecoMatchedJetsPtDeltadPt", "#it{p}_{T,jet det}; det - part / det", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {200, -20., 20.0}}}); - registry.add("hMatchedJetsEtaDelta", "#eta_{jet part}; det - part", {HistType::kTH2F, {{etaAxis}, {200, -0.8, 0.8}}}); - registry.add("hMatchedJetsPhiDelta", "#phi_{jet part}; det - part", {HistType::kTH2F, {{phiAxis}, {200, -10.0, 10.}}}); - registry.add("hRespMcDMcPMatch", ";Centrality,#it{p}_{T, jet det}; #it{p}_{T, jet part}", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {jetPtAxis}}}); - registry.add("hRespMcDMcPMatchSubBkg", ";Centrality,#it{p}_{T, jet det}; #it{p}_{T, jet part}", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {jetPtAxis}}}); - - registry.get(HIST("hMCEventCounter"))->GetXaxis()->SetBinLabel(1, "Input event"); - registry.get(HIST("hMCEventCounter"))->GetXaxis()->SetBinLabel(2, "Collision size < 1"); - registry.get(HIST("hMCEventCounter"))->GetXaxis()->SetBinLabel(3, "Vertex cut"); - registry.get(HIST("hMCEventCounter"))->GetXaxis()->SetBinLabel(4, "After analysis"); - registry.get(HIST("hMCDMatchedEventCounter"))->GetXaxis()->SetBinLabel(1, "Input event"); - registry.get(HIST("hMCDMatchedEventCounter"))->GetXaxis()->SetBinLabel(2, "Vertex cut"); - registry.get(HIST("hMCDMatchedEventCounter"))->GetXaxis()->SetBinLabel(3, "Event selection"); - registry.get(HIST("hMCDMatchedEventCounter"))->GetXaxis()->SetBinLabel(4, "Occupancy cut"); - registry.get(HIST("hMCDMatchedEventCounter"))->GetXaxis()->SetBinLabel(5, "Centrality cut1:cut2"); - registry.get(HIST("hMCDMatchedEventCounter"))->GetXaxis()->SetBinLabel(6, "After analysis"); + + registry.add("mcm/hJetSparse", ";Centrality;#it{p}_{T,jet det}; #eta; #phi", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {etaAxis}, {phiAxis}}}); /* detector level */ + registry.add("mcm/hPartSparseMatch", ";Centrality;#it{p}_{T,jet part}; #eta; #phi", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {etaAxis}, {phiAxis}}}); + + registry.add("mcm/hMCEventCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); + registry.add("mcm/hMCDMatchedEventCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); + registry.add("mcm/hCentralityAnalyzed", ";Centrality;entries", {HistType::kTH1F, {{centAxis}}}); + + registry.add("mcm/hMatchedJetsPtDelta", "#it{p}_{T,jet part}; det - part", {HistType::kTH2F, {{jetPtAxis}, {100, -20., 20.0}}}); + registry.add("mcm/hGenMatchedJetsPtDeltadPt", "#it{p}_{T,jet part}; det - part / part", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {200, -20., 20.0}}}); + registry.add("mcm/hRecoMatchedJetsPtDeltadPt", "#it{p}_{T,jet det}; det - part / det", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {200, -20., 20.0}}}); + registry.add("mcm/hMatchedJetsEtaDelta", "#eta_{jet part}; det - part", {HistType::kTH2F, {{etaAxis}, {200, -0.8, 0.8}}}); + registry.add("mcm/hMatchedJetsPhiDelta", "#phi_{jet part}; det - part", {HistType::kTH2F, {{phiAxis}, {200, -10.0, 10.}}}); + + registry.add("mcm/hRespMcDMcPMatch", ";Centrality,#it{p}_{T, jet det}; #it{p}_{T, jet part}", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {jetPtAxis}}}); + + registry.get(HIST("mcm/hMCEventCounter"))->GetXaxis()->SetBinLabel(1, "Input event"); + registry.get(HIST("mcm/hMCEventCounter"))->GetXaxis()->SetBinLabel(2, "Collision size < 1"); + registry.get(HIST("mcm/hMCEventCounter"))->GetXaxis()->SetBinLabel(3, "Vertex cut"); + registry.get(HIST("mcm/hMCEventCounter"))->GetXaxis()->SetBinLabel(4, "After analysis"); + registry.get(HIST("mcm/hMCDMatchedEventCounter"))->GetXaxis()->SetBinLabel(1, "Input event"); + registry.get(HIST("mcm/hMCDMatchedEventCounter"))->GetXaxis()->SetBinLabel(2, "Vertex cut"); + registry.get(HIST("mcm/hMCDMatchedEventCounter"))->GetXaxis()->SetBinLabel(3, "Event selection"); + registry.get(HIST("mcm/hMCDMatchedEventCounter"))->GetXaxis()->SetBinLabel(4, "Occupancy cut"); + registry.get(HIST("mcm/hMCDMatchedEventCounter"))->GetXaxis()->SetBinLabel(5, "Centrality cut1:cut2"); + registry.get(HIST("mcm/hMCDMatchedEventCounter"))->GetXaxis()->SetBinLabel(6, "After analysis"); } if (doprocessESEOccupancy) { LOGF(info, "JetSpectraEseTask::init() - Occupancy QA"); @@ -408,29 +408,32 @@ struct JetSpectraEseTask { soa::Filtered const& jets) { float counter{0.5f}; - registry.fill(HIST("hMCPartEventCounter"), counter++); + registry.fill(HIST("mcp/hEventCounter"), counter++); if (mcCollision.size() < 1) { return; } - registry.fill(HIST("hMCPartEventCounter"), counter++); + registry.fill(HIST("mcp/hEventCounter"), counter++); if (collisions.size() != 1) { return; } - registry.fill(HIST("hMCPartEventCounter"), counter++); + + registry.fill(HIST("mcp/hEventCounter"), counter++); auto centrality{-1}; + bool fOccupancy = true; for (const auto& col : collisions) { - centrality = col.centrality(); + if (cfgisPbPb) + centrality = col.centrality(); + if (cfgEvSelOccupancy && !isOccupancyAccepted(col)) + fOccupancy = false; } + if (cfgEvSelOccupancy && !fOccupancy) + return; - registry.fill(HIST("hPartCentralitySel"), centrality); - for (const auto& jet : jets) { - const auto mcPt{jet.pt() - (mcCollision.rho() * jet.area())}; - registry.fill(HIST("hPartJetPt"), jet.pt()); - registry.fill(HIST("hPartJetPtSubBkg"), mcPt); - registry.fill(HIST("hPartJetEta"), jet.eta()); - registry.fill(HIST("hPartJetPhi"), jet.phi()); - registry.fill(HIST("hPartJetSparse"), centrality, mcPt, jet.eta(), jet.phi()); - } + registry.fill(HIST("mcp/hEventCounter"), counter++); + + registry.fill(HIST("mcp/hCentralitySel"), centrality); + + jetLoop(jets, centrality, mcCollision.rho()); } PROCESS_SWITCH(JetSpectraEseTask, processMCParticleLevel, "jets on particle level MC", false); @@ -440,21 +443,19 @@ struct JetSpectraEseTask { aod::JetParticles const&) { float counter{0.5f}; - registry.fill(HIST("hMCDetEventCounter"), counter++); + registry.fill(HIST("mcd/hEventCounter"), counter++); if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) return; - registry.fill(HIST("hMCDetEventCounter"), counter++); + registry.fill(HIST("mcd/hEventCounter"), counter++); if (cfgEvSelOccupancy && !isOccupancyAccepted(collision)) return; - registry.fill(HIST("hMCDetEventCounter"), counter++); - registry.fill(HIST("hDetCentralitySel"), collision.centrality()); - for (const auto& mcdjet : mcdjets) { - auto mcdetPt{mcdjet.pt() - (collision.rho() * mcdjet.area())}; - registry.fill(HIST("hDetJetPt"), mcdjet.pt()); - registry.fill(HIST("hDetJetEta"), mcdjet.eta()); - registry.fill(HIST("hDetJetPhi"), mcdjet.phi()); - registry.fill(HIST("hDetJetSparse"), collision.centrality(), mcdetPt, mcdjet.eta(), mcdjet.phi()); - } + registry.fill(HIST("mcd/hEventCounter"), counter++); + + auto centrality = cfgisPbPb ? collision.centrality() : -1; + + registry.fill(HIST("mcd/hCentralitySel"), centrality); + + jetLoop(mcdjets, centrality, collision.rho()); } PROCESS_SWITCH(JetSpectraEseTask, processMCDetectorLevel, "jets on detector level", false); @@ -467,63 +468,49 @@ struct JetSpectraEseTask { aod::JetParticles const&) { float counter{0.5f}; - registry.fill(HIST("hMCEventCounter"), counter++); + registry.fill(HIST("mcm/hMCEventCounter"), counter++); if (mcCol.size() < 1) { return; } - registry.fill(HIST("hMCEventCounter"), counter++); + registry.fill(HIST("mcm/hMCEventCounter"), counter++); if (!(std::abs(mcCol.posZ()) < vertexZCut)) { return; } - registry.fill(HIST("hMCEventCounter"), counter++); + registry.fill(HIST("mcm/hMCEventCounter"), counter++); for (const auto& collision : collisions) { float secCount{0.5f}; - registry.fill(HIST("hMCDMatchedEventCounter"), secCount++); + registry.fill(HIST("mcm/hMCDMatchedEventCounter"), secCount++); if (!(std::abs(collision.posZ()) < vertexZCut)) { return; } - registry.fill(HIST("hMCDMatchedEventCounter"), secCount++); + registry.fill(HIST("mcm/hMCDMatchedEventCounter"), secCount++); if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) return; - registry.fill(HIST("hMCDMatchedEventCounter"), secCount++); + registry.fill(HIST("mcm/hMCDMatchedEventCounter"), secCount++); if (cfgEvSelOccupancy && !isOccupancyAccepted(collision)) return; - registry.fill(HIST("hMCDMatchedEventCounter"), secCount++); - - if (collision.centrality() < centRange->at(0) || collision.centrality() > centRange->at(1)) - registry.fill(HIST("hMCDMatchedEventCounter"), secCount++); - - registry.fill(HIST("hCentralityAnalyzed"), collision.centrality()); - auto collmcdJets{mcdjets.sliceBy(mcdjetsPerJCollision, collision.globalIndex())}; - for (const auto& mcdjet : collmcdJets) { - auto mcdPt{mcdjet.pt() - (collision.rho() * mcdjet.area())}; - registry.fill(HIST("hDetectorJetPt"), collision.centrality(), mcdjet.pt()); - registry.fill(HIST("hDetectorJetPtSubBkg"), collision.centrality(), mcdPt); - registry.fill(HIST("hDetectorJetEta"), mcdjet.eta()); - registry.fill(HIST("hDetectorJetPhi"), mcdjet.phi()); - for (const auto& mcpjet : mcdjet.template matchedJetGeo_as()) { - auto mcpPt{mcpjet.pt() - (mcCol.rho() * mcpjet.area())}; - registry.fill(HIST("hPartJetPtMatch"), collision.centrality(), mcpjet.pt()); - registry.fill(HIST("hPartJetPtMatchSubBkg"), collision.centrality(), mcpPt); - registry.fill(HIST("hPartJetEtaMatch"), mcpjet.eta()); - registry.fill(HIST("hPartJetPhiMatch"), mcpjet.phi()); - registry.fill(HIST("hPartJetMatchSparse"), collision.centrality(), mcpPt, mcpjet.eta(), mcpjet.phi()); - registry.fill(HIST("hMatchedJetsPtDelta"), mcpjet.pt(), mcdjet.pt() - mcpjet.pt()); - registry.fill(HIST("hGenMatchedJetsPtDeltadPt"), collision.centrality(), mcpPt, (mcdPt - mcpPt) / mcpPt); - registry.fill(HIST("hRecoMatchedJetsPtDeltadPt"), collision.centrality(), mcdPt, (mcdPt - mcpPt) / mcdPt); - registry.fill(HIST("hMatchedJetsPhiDelta"), mcpjet.phi(), mcdjet.phi() - mcpjet.phi()); - registry.fill(HIST("hMatchedJetsEtaDelta"), mcpjet.eta(), mcdjet.eta() - mcpjet.eta()); - - registry.fill(HIST("hRespMcDMcPMatch"), collision.centrality(), mcdjet.pt(), mcpjet.pt()); - registry.fill(HIST("hRespMcDMcPMatchSubBkg"), collision.centrality(), mcdPt, mcpPt); - } - } - registry.fill(HIST("hMCDMatchedEventCounter"), secCount++); + registry.fill(HIST("mcm/hMCDMatchedEventCounter"), secCount++); + + auto centrality = cfgisPbPb ? collision.centrality() : -1; + if (cfgisPbPb) + if (centrality < centRange->at(0) || centrality > centRange->at(1)) + registry.fill(HIST("mcm/hMCDMatchedEventCounter"), secCount++); + + registry.fill(HIST("mcm/hCentralityAnalyzed"), centrality); + + jetLoop( + mcdjets.sliceBy(mcdjetsPerJCollision, collision.globalIndex()), + centrality, + collision.rho(), + [](const auto& jet) { return jet.template matchedJetGeo_as(); }, + mcCol.rho()); + + registry.fill(HIST("mcm/hMCDMatchedEventCounter"), secCount++); } - registry.fill(HIST("hMCEventCounter"), counter++); + registry.fill(HIST("mcm/hMCEventCounter"), counter++); } PROCESS_SWITCH(JetSpectraEseTask, processMCChargedMatched, "jet MC process: geometrically matched MCP and MCD for response matrix and efficiency", false); @@ -876,5 +863,41 @@ struct JetSpectraEseTask { } return false; } + + static constexpr std::string_view LevelJets[] = {"mcd/", "mcp/", "mcm/"}; + enum JetType { MCP = 0, + MCD = 1, + MCM = 2 }; + template + void jetLoop(const Jets& jets, const float& centrality, const float& rho, matchJet matchjet = nullptr, const float& rho2 = 0) + { + + for (const auto& jet : jets) { + auto pt = jet.pt(); + if (cfgbkgSubMC) { + pt = jet.pt() - (rho * jet.area()); + } + // registry.fill(HIST(levelJets[jetLvl]) + HIST("hJetSparse"), centrality, jet.pt(), jet.eta(), jet.phi()); + registry.fill(HIST(LevelJets[jetLvl]) + HIST("hJetSparse"), centrality, pt, jet.eta(), jet.phi()); /* detector level mcm*/ + + if constexpr (jetLvl == MCM && !std::is_same_v) { + for (const auto& matchedJet : matchjet(jet)) { + auto matchedpt = matchedJet.pt(); + if (cfgbkgSubMC) { + matchedpt = matchedJet.pt() - (rho2 * matchedJet.area()); + } + registry.fill(HIST("mcm/hPartSparseMatch"), centrality, matchedpt, matchedJet.eta(), matchedJet.phi()); + + registry.fill(HIST("mcm/hMatchedJetsPtDelta"), matchedJet.pt(), jet.pt() - matchedJet.pt()); + registry.fill(HIST("mcm/hMatchedJetsPhiDelta"), matchedJet.phi(), jet.phi() - matchedJet.phi()); + registry.fill(HIST("mcm/hMatchedJetsEtaDelta"), matchedJet.eta(), jet.eta() - matchedJet.eta()); + registry.fill(HIST("mcm/hGenMatchedJetsPtDeltadPt"), centrality, matchedpt, (pt - matchedpt) / matchedpt); + registry.fill(HIST("mcm/hRecoMatchedJetsPtDeltadPt"), centrality, pt, (pt - matchedpt) / pt); + + registry.fill(HIST("mcm/hRespMcDMcPMatch"), centrality, pt, matchedpt); + } + } + } + } }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From 296a228ac116a97791cf497abc9c2295cc6324ae Mon Sep 17 00:00:00 2001 From: Anantha Padmanabhan M Nair <82643666+ananthapadmanabhan18@users.noreply.github.com> Date: Mon, 17 Mar 2025 02:39:41 +0530 Subject: [PATCH 0710/1650] [PWGUD] Added 4 More table columns, fixed O2linter errors, whithout disabling them. (#10514) --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 74 +++++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 18 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index 6e14e67b7f1..7b23bfe2e7c 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -32,6 +32,7 @@ #include "Math/Vector4D.h" #include "Math/Vector3D.h" #include "Math/GenVector/Boost.h" +#include "CommonConstants/PhysicsConstants.h" using namespace std; using namespace o2; @@ -43,32 +44,49 @@ namespace o2::aod { namespace branch { +DECLARE_SOA_COLUMN(Fv0signal, fv0signal, double); +DECLARE_SOA_COLUMN(Ft0asignal, ft0asignal, double); +DECLARE_SOA_COLUMN(Ft0csignal, ft0csignal, double); +DECLARE_SOA_COLUMN(Fddasignal, fddasignal, double); +DECLARE_SOA_COLUMN(Fddcsignal, fddcsignal, double); + DECLARE_SOA_COLUMN(Dcaxy, dcaxy, std::vector); DECLARE_SOA_COLUMN(Dcaz, dcaz, std::vector); + DECLARE_SOA_COLUMN(TpcNsigmaKa, tpcNsigmaKa, std::vector); DECLARE_SOA_COLUMN(TpcNsigmaPr, tpcNsigmaPr, std::vector); DECLARE_SOA_COLUMN(TpcNsigmaMu, tpcNsigmaMu, std::vector); DECLARE_SOA_COLUMN(TpcNsigmaEl, tpcNsigmaEl, std::vector); + DECLARE_SOA_COLUMN(TofNsigmaKa, tofNsigmaKa, std::vector); DECLARE_SOA_COLUMN(TofNsigmaPr, tofNsigmaPr, std::vector); DECLARE_SOA_COLUMN(TofNsigmaMu, tofNsigmaMu, std::vector); DECLARE_SOA_COLUMN(TofNsigmaEl, tofNsigmaEl, std::vector); + DECLARE_SOA_COLUMN(TpcChi2, tpcChi2, std::vector); DECLARE_SOA_COLUMN(TpcNClsFindable, tpcNClsFindable, std::vector); DECLARE_SOA_COLUMN(ItsChi2, itsChi2, std::vector); + DECLARE_SOA_COLUMN(PionPt, pionPt, std::vector); DECLARE_SOA_COLUMN(PionEta, pionEta, std::vector); DECLARE_SOA_COLUMN(PionRapidity, pionRapidity, std::vector); + DECLARE_SOA_COLUMN(FourPionPt, fourPionPt, double); DECLARE_SOA_COLUMN(FourPionEta, fourPionEta, double); DECLARE_SOA_COLUMN(FourPionRapidity, fourPionRapidity, double); DECLARE_SOA_COLUMN(FourPionMass, fourPionMass, double); +DECLARE_SOA_COLUMN(FourPionPhi, fourPionPhi, double); DECLARE_SOA_COLUMN(FourPionPhiPair1, fourPionPhiPair1, double); DECLARE_SOA_COLUMN(FourPionPhiPair2, fourPionPhiPair2, double); DECLARE_SOA_COLUMN(FourPionCosThetaPair1, fourPionCosThetaPair1, double); DECLARE_SOA_COLUMN(FourPionCosThetaPair2, fourPionCosThetaPair2, double); } // namespace branch DECLARE_SOA_TABLE(UDTree0c, "AOD", "UD0Charge", + branch::Fv0signal, + branch::Ft0asignal, + branch::Ft0csignal, + branch::Fddasignal, + branch::Fddcsignal, branch::Dcaxy, branch::Dcaz, branch::TpcNsigmaKa, @@ -89,12 +107,18 @@ DECLARE_SOA_TABLE(UDTree0c, "AOD", "UD0Charge", branch::FourPionEta, branch::FourPionRapidity, branch::FourPionMass, + branch::FourPionPhi, branch::FourPionPhiPair1, branch::FourPionPhiPair2, branch::FourPionCosThetaPair1, branch::FourPionCosThetaPair2); DECLARE_SOA_TABLE(UDTreen0c, "AOD", "UDn0Charge", + branch::Fv0signal, + branch::Ft0asignal, + branch::Ft0csignal, + branch::Fddasignal, + branch::Fddcsignal, branch::Dcaxy, branch::Dcaz, branch::TpcNsigmaKa, @@ -114,7 +138,8 @@ DECLARE_SOA_TABLE(UDTreen0c, "AOD", "UDn0Charge", branch::FourPionPt, branch::FourPionEta, branch::FourPionRapidity, - branch::FourPionMass); + branch::FourPionMass, + branch::FourPionPhi); DECLARE_SOA_TABLE(MCTree, "AOD", "MC0Charge", branch::PionPt, @@ -130,6 +155,11 @@ DECLARE_SOA_TABLE(MCTree, "AOD", "MC0Charge", branch::FourPionCosThetaPair2); DECLARE_SOA_TABLE(MCUDTree, "AOD", "UDMC0Charge", + branch::Fv0signal, + branch::Ft0asignal, + branch::Ft0csignal, + branch::Fddasignal, + branch::Fddcsignal, branch::Dcaxy, branch::Dcaz, branch::TpcNsigmaKa, @@ -150,6 +180,7 @@ DECLARE_SOA_TABLE(MCUDTree, "AOD", "UDMC0Charge", branch::FourPionEta, branch::FourPionRapidity, branch::FourPionMass, + branch::FourPionPhi, branch::FourPionPhiPair1, branch::FourPionPhiPair2, branch::FourPionCosThetaPair1, @@ -157,8 +188,11 @@ DECLARE_SOA_TABLE(MCUDTree, "AOD", "UDMC0Charge", } // namespace o2::aod ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct +struct ExclusiveRhoTo4Pi { SGSelector sgSelector; + int kPiPlus = 211; + int kPiMinus = -211; + int kRhoPrime1700 = 30113; Produces zeroChargeEventsData; Produces nonzeroChargeEventsData; Produces zeroChargeEventsMCgen; @@ -773,12 +807,13 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct fourPiCosThetaPair2 = cosThetaCollinsSoperFrame(k14, k23, k1234); zeroChargeEventsData( + collision.totalFV0AmplitudeA(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), pidcaXY, pidcaZ, tpcNsigKa, tpcNsigPr, tpcNsigEl, tpcNsigMu, tofNsigKa, tofNsigPr, tofNsigEl, tofNsigMu, tpcchi2, tpcNFindableCls, itschi2, piPt, piEta, piRapidity, - p1234.Pt(), p1234.Eta(), p1234.Rapidity(), p1234.M(), + p1234.Pt(), p1234.Eta(), p1234.Rapidity(), p1234.M(), p1234.Phi(), fourPiPhiPair1, fourPiPhiPair2, fourPiCosThetaPair1, fourPiCosThetaPair2); if (std::fabs(p1234.Rapidity()) < 0.5) { @@ -861,12 +896,13 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct } nonzeroChargeEventsData( + collision.totalFV0AmplitudeA(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), pidcaXY, pidcaZ, tpcNsigKa, tpcNsigPr, tpcNsigMu, tpcNsigEl, tofNsigKa, tofNsigPr, tofNsigMu, tofNsigEl, tpcchi2, tpcNFindableCls, itschi2, piPt, piEta, piRapidity, - p1234.Pt(), p1234.Eta(), p1234.Rapidity(), p1234.M()); + p1234.Pt(), p1234.Eta(), p1234.Rapidity(), p1234.M(), p1234.Phi()); if (std::fabs(p1234.Rapidity()) < 0.5) { histosData.fill(HIST("pT_event_non0charge_WTS_PID_Pi"), p1234.Pt()); @@ -888,7 +924,7 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct } // End of Analysis for non 0 charge events } // End of 4 Pion Analysis Process function for Data - PROCESS_SWITCH(exclusiveRhoTo4Pi, processData, "The Process for 4 Pion Analysis from data", true); + PROCESS_SWITCH(ExclusiveRhoTo4Pi, processData, "The Process for 4 Pion Analysis from data", true); //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- // Begin of MC Generation function----------------------------------------------------------------------------------------------------------------------------------------------- @@ -913,7 +949,7 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct } for (const auto& mother : particle.mothers_as()) { - if (mother.pdgCode() == 30113) { + if (mother.pdgCode() == kRhoPrime1700) { motherVector.SetXYZM(mother.px(), mother.py(), mother.pz(), o2::constants::physics::MassPionCharged); histosMCgen.fill(HIST("MCgen_rhoPrime_pT"), motherVector.Pt()); @@ -921,7 +957,7 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct histosMCgen.fill(HIST("rhoPrimeCounts"), 5); } flag = true; - if (particle.pdgCode() == 211) { + if (particle.pdgCode() == kPiPlus) { histosMCgen.fill(HIST("MCgen_particle_pT"), tempVector.Pt()); histosMCgen.fill(HIST("MCgen_particle_rapidity"), tempVector.Rapidity()); piPlusvectors.push_back(tempVector); @@ -929,7 +965,7 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct piEta.push_back(tempVector.Eta()); piRapidity.push_back(tempVector.Rapidity()); } - if (particle.pdgCode() == -211) { + if (particle.pdgCode() == kPiMinus) { histosMCgen.fill(HIST("MCgen_particle_pT"), tempVector.Pt()); histosMCgen.fill(HIST("MCgen_particle_rapidity"), tempVector.Rapidity()); piMinusvectors.push_back(tempVector); @@ -997,7 +1033,7 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct phiPair1, phiPair2, cosThetaPair1, cosThetaPair2); } // End of 4 Pion MC Generation Process function - PROCESS_SWITCH(exclusiveRhoTo4Pi, processMCgen, "The Process for 4 Pion Analysis from MC Generation", false); + PROCESS_SWITCH(ExclusiveRhoTo4Pi, processMCgen, "The Process for 4 Pion Analysis from MC Generation", false); using CollisionStuff = soa::Join; using CollisionTotal = CollisionStuff::iterator; @@ -1270,13 +1306,15 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct piRapidity.push_back(p3.Rapidity()); piRapidity.push_back(p4.Rapidity()); - zeroChargeEventsMCreco(dcaxy, dcaz, - tpcNsigKa, tpcNsigPr, tpcNsigMu, tpcNsigEl, - tofNsigKa, tofNsigPr, tofNsigMu, tofNsigEl, - tpcchi2, tpcNFindableCls, itschi2, - piPt, piEta, piRapidity, - p1234.Pt(), p1234.Eta(), p1234.Rapidity(), p1234.M(), - phiPair1, phiPair2, cosThetaPair1, cosThetaPair2); + zeroChargeEventsMCreco( + collision.totalFV0AmplitudeA(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), + dcaxy, dcaz, + tpcNsigKa, tpcNsigPr, tpcNsigMu, tpcNsigEl, + tofNsigKa, tofNsigPr, tofNsigMu, tofNsigEl, + tpcchi2, tpcNFindableCls, itschi2, + piPt, piEta, piRapidity, + p1234.Pt(), p1234.Eta(), p1234.Rapidity(), p1234.M(), p1234.Phi(), + phiPair1, phiPair2, cosThetaPair1, cosThetaPair2); if (std::fabs(p1234.Rapidity()) < 0.5) { histosMCreco.fill(HIST("pT_event_0charge_WTS_PID_Pi"), p1234.Pt()); @@ -1339,7 +1377,7 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct } // End of Analysis for non 0 charge events } // End of 4 Pion Analysis Process function for MC Reconstruction - PROCESS_SWITCH(exclusiveRhoTo4Pi, processMCrec, "The Process for 4 Pion Analysis from MC Reconstruction", false); + PROCESS_SWITCH(ExclusiveRhoTo4Pi, processMCrec, "The Process for 4 Pion Analysis from MC Reconstruction", false); }; // End of Struct exclusiveRhoTo4Pi ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1347,5 +1385,5 @@ struct exclusiveRhoTo4Pi { // o2-linter: disable=name/workflow-file,name/struct WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc)}; + adaptAnalysisTask(cfgc)}; } From 40d4682f8f3e34b63ef0d6d28eee5097aff65486 Mon Sep 17 00:00:00 2001 From: Victor Gonzalez Date: Sun, 16 Mar 2025 22:25:01 +0100 Subject: [PATCH 0711/1650] [PWGCF] DptDpt - Improving QC data layout for HL execution (#10526) Co-authored-by: Victor --- .../Tasks/dptDptEfficiencyAndQc.cxx | 88 ++++++++++--------- 1 file changed, 45 insertions(+), 43 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx index 661c1f94e2a..f543b4673f9 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx @@ -15,6 +15,7 @@ #include #include +#include #include #include #include @@ -93,6 +94,9 @@ float maxNSigma = 4.05f; float widthNSigmaBin = 0.1f; int noOfNSigmaBins = static_cast((maxNSigma - minNSigma) / widthNSigmaBin); +/* the pT bins of interest for the relative separation within TPC sectors data collection */ +std::vector ptBinsOfInterest{1, 2, 3}; + /* the PID selector object to help with the configuration and the id of the selected particles */ o2::analysis::dptdptfilter::PIDSpeciesSelection pidselector; @@ -584,9 +588,8 @@ struct QAExtraDataCollectingEngine { std::vector>>> fhPhiPhiA{2, {nsp, {nsp, nullptr}}}; std::vector>>> fhEtaEtaA{2, {nsp, {nsp, nullptr}}}; TAxis ptAxis{analysis::dptdptfilter::ptbins, analysis::dptdptfilter::ptlow, analysis::dptdptfilter::ptup}; - Configurable> cfgPtBinsOfInterest{"cfgPtBinsOfInterest", {1, 2, 3}, "The pt bins of interest"}; - std::vector>>>>> fhInSectorDeltaPhiVsPhiPhiPerPtBinA{2, {nsp, {nsp, {cfgPtBinsOfInterest->size(), {cfgPtBinsOfInterest->size(), nullptr}}}}}; - std::vector>>>>> fhInSectorDeltaPhiVsEtaEtaPerPtBinA{2, {nsp, {nsp, {cfgPtBinsOfInterest->size(), {cfgPtBinsOfInterest->size(), nullptr}}}}}; + std::vector>>> fhInSectorDeltaPhiVsPhiPhiPerPtBinA{2, {nsp, {nsp, nullptr}}}; + std::vector>>> fhInSectorDeltaPhiVsEtaEtaPerPtBinA{2, {nsp, {nsp, nullptr}}}; template void init(HistogramRegistry& registry, const char* dirname) @@ -595,10 +598,11 @@ struct QAExtraDataCollectingEngine { using namespace analysis::dptdptfilter; AxisSpec phiAxis = {phibins, 0.0f, constants::math::TwoPI, "#varphi"}; - AxisSpec phiSectorAxis = {144, 0.0f, kTpcPhiSectorWidth, "#varphi (mod(2#pi/18)) (rad)"}; + AxisSpec phiSectorAxis = {72, 0.0f, kTpcPhiSectorWidth, "#varphi (mod(2#pi/18)) (rad)"}; AxisSpec deltaPhiAxis = {phibins, 0.0f, constants::math::TwoPI, "#Delta#varphi (rad)"}; - AxisSpec deltaPhiInSectorAxis = {288, -kTpcPhiSectorWidth, kTpcPhiSectorWidth, "#Delta#varphi (rad)"}; + AxisSpec deltaPhiInSectorAxis = {144, -kTpcPhiSectorWidth, kTpcPhiSectorWidth, "#Delta#varphi (rad)"}; AxisSpec etaAxis = {etabins, etalow, etaup, "#eta"}; + AxisSpec ptOfInterestAxis = {static_cast(ptBinsOfInterest.size()), 0.5f, static_cast(ptBinsOfInterest.size()) + 0.5f, "#it{p}_{T} (GeV/#it{c})"}; /* the reconstructed and generated levels histograms */ std::string recogen = (kindOfData == kReco) ? "Reco" : "Gen"; @@ -609,17 +613,11 @@ struct QAExtraDataCollectingEngine { fhEtaEtaA[kindOfData][isp][jsp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("EtaEta_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTH2F, {etaAxis, etaAxis}); /* first resize them to the actual configured size */ - fhInSectorDeltaPhiVsPhiPhiPerPtBinA[kindOfData][isp][jsp].resize(cfgPtBinsOfInterest->size()); - for (uint ipt = 0; ipt < cfgPtBinsOfInterest->size(); ++ipt) { - /* first resize them to the actual configured size */ - fhInSectorDeltaPhiVsPhiPhiPerPtBinA[kindOfData][isp][jsp][ipt].resize(cfgPtBinsOfInterest->size(), nullptr); - for (uint jpt = 0; jpt < cfgPtBinsOfInterest->size(); ++jpt) { - fhInSectorDeltaPhiVsPhiPhiPerPtBinA[kindOfData][isp][jsp][ipt][jpt] = ADDHISTOGRAM(TH3, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("DeltaPhiVsPhiPhiPt%02d%02d_%s%s", ipt, jpt, tnames[isp].c_str(), tnames[jsp].c_str()), - HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTH3F, {phiSectorAxis, phiSectorAxis, deltaPhiInSectorAxis}); - fhInSectorDeltaPhiVsEtaEtaPerPtBinA[kindOfData][isp][jsp][ipt][jpt] = ADDHISTOGRAM(TH3, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("DeltaPhiVsEtaEtaPt%02d%02d_%s%s", ipt, jpt, tnames[isp].c_str(), tnames[jsp].c_str()), - HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTH3F, {etaAxis, etaAxis, deltaPhiInSectorAxis}); - } - } + fhInSectorDeltaPhiVsPhiPhiPerPtBinA[kindOfData][isp][jsp] = ADDHISTOGRAM(THnSparse, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("DeltaPhiVsPhiPhiPt_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), + HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTHnSparseF, {phiSectorAxis, phiSectorAxis, deltaPhiInSectorAxis, ptOfInterestAxis, ptOfInterestAxis}); + // TODO: after checking the consumed execution memory + // fhInSectorDeltaPhiVsEtaEtaPerPtBinA[kindOfData][isp][jsp] = ADDHISTOGRAM(THnSparse, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("DeltaPhiVsEtaEtaPt_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), + // HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTHnSparseF, {etaAxis, etaAxis, deltaPhiInSectorAxis, ptOfInterestAxis, ptOfInterestAxis}); } } } @@ -632,39 +630,39 @@ struct QAExtraDataCollectingEngine { /* we should only receive accepted tracks */ for (auto const& track1 : tracks1) { - auto indexForPt = [&](auto const& track) { + auto binForPt = [&](auto const& track) { int ptBin = ptAxis.FindFixBin(track.pt()); - if (std::find(cfgPtBinsOfInterest->begin(), cfgPtBinsOfInterest->end(), ptBin) != cfgPtBinsOfInterest->end()) { + if (std::find(ptBinsOfInterest.begin(), ptBinsOfInterest.end(), ptBin) != ptBinsOfInterest.end()) { /* of interest */ - return ptBin - 1; + return ptBin; } else { return -1; } }; - int ptBinIx1 = indexForPt(track1); - if (ptBinIx1 < 0) { - continue; - } - float inTpcSectorPhi1 = std::fmod(track1.phi(), kTpcPhiSectorWidth); - for (auto const& track2 : tracks2) { - /* checking the same track id condition */ - if (track1 == track2) { - /* exclude autocorrelations */ - continue; - } - int ptBinIx2 = indexForPt(track2); - if (ptBinIx2 < 0) { - continue; - } - fhPhiPhiA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(track1.phi(), track2.phi()); - fhEtaEtaA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(track1.eta(), track2.eta()); - if (static_cast(track1.phi() / kTpcPhiSectorWidth) == static_cast(track2.phi() / kTpcPhiSectorWidth)) { - /* only if, for sure, both tracks are within the same sector */ - float inTpcSectorPhi2 = std::fmod(track2.phi(), kTpcPhiSectorWidth); - float deltaPhi = inTpcSectorPhi1 - inTpcSectorPhi2; - - fhInSectorDeltaPhiVsPhiPhiPerPtBinA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()][ptBinIx1][ptBinIx2]->Fill(track1.phi(), track2.phi(), deltaPhi); - fhInSectorDeltaPhiVsEtaEtaPerPtBinA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()][ptBinIx1][ptBinIx2]->Fill(track1.eta(), track2.eta(), deltaPhi); + int ptBin1 = binForPt(track1); + if (ptBin1 > 0) { + float inTpcSectorPhi1 = std::fmod(track1.phi(), kTpcPhiSectorWidth); + for (auto const& track2 : tracks2) { + /* checking the same track id condition */ + if (track1 == track2) { + /* exclude autocorrelations */ + continue; + } + int ptBin2 = binForPt(track2); + if (ptBin2 > 0) { + fhPhiPhiA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(track1.phi(), track2.phi()); + fhEtaEtaA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(track1.eta(), track2.eta()); + if (static_cast(track1.phi() / kTpcPhiSectorWidth) == static_cast(track2.phi() / kTpcPhiSectorWidth)) { + /* only if, for sure, both tracks are within the same sector */ + float inTpcSectorPhi2 = std::fmod(track2.phi(), kTpcPhiSectorWidth); + float deltaPhi = inTpcSectorPhi1 - inTpcSectorPhi2; + double values[] = {inTpcSectorPhi1, inTpcSectorPhi2, deltaPhi, static_cast(ptBin1), static_cast(ptBin2)}; + + fhInSectorDeltaPhiVsPhiPhiPerPtBinA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(values); + // TODO: after checking the consumed execution memory + // fhInSectorDeltaPhiVsEtaEtaPerPtBinA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(track1.eta(), track2.eta(), deltaPhi); + } + } } } } @@ -999,6 +997,7 @@ struct DptDptEfficiencyAndQc { Configurable cfgMinNSigma{"cfgMinNSigma", -4.05f, "nsigma axes lowest value. Default: -4.05"}; Configurable cfgMaxNSigma{"cfgMaxNSigma", 4.05f, "nsigma axes highest value. Default: 4.05"}; Configurable cfgWidthNSigmaBin{"cfgWidthNSigmaBin", 0.1, "nsigma axes bin width. Deafault: 0.1"}; + Configurable> cfgPtBinsOfInterest{"cfgPtBinsOfInterest", {1, 2, 3}, "The pt bins of interest"}; void init(o2::framework::InitContext& initContext) { @@ -1100,6 +1099,9 @@ struct DptDptEfficiencyAndQc { widthNSigmaBin = cfgWidthNSigmaBin.value; noOfNSigmaBins = static_cast((maxNSigma - minNSigma) / widthNSigmaBin); + /* configure the pT bins of interest */ + ptBinsOfInterest = cfgPtBinsOfInterest.value; + bool doBasicAnalysis = doprocessDetectorLevelNotStored || doprocessReconstructedNotStored || doprocessGeneratorLevelNotStored; bool doExtraAnalysis = doprocessExtraDetectorLevelNotStored || doprocessExtraReconstructedNotStored || doprocessExtraGeneratorLevelNotStored; bool doPidAnalysis = doprocessDetectorLevelNotStoredPID || doprocessDetectorLevelNotStoredTunedOnDataPID || doprocessReconstructedNotStoredPID; From f2bb4398f7477b29d9e3bdcf9e5fdf8a81613e0f Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Mon, 17 Mar 2025 06:29:58 +0900 Subject: [PATCH 0712/1650] [PWGEM/PhotonMeson] update qc tasks (#10523) --- PWGEM/Dilepton/Core/PhotonHBT.h | 43 +--- PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h | 2 - PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h | 2 - PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx | 32 +-- PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx | 192 +++++++++++------- PWGEM/PhotonMeson/Tasks/pcmQC.cxx | 2 - PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx | 28 ++- PWGEM/PhotonMeson/Tasks/prefilterPhoton.cxx | 10 +- 8 files changed, 163 insertions(+), 148 deletions(-) diff --git a/PWGEM/Dilepton/Core/PhotonHBT.h b/PWGEM/Dilepton/Core/PhotonHBT.h index 54e2bfed037..b24f22cd5d8 100644 --- a/PWGEM/Dilepton/Core/PhotonHBT.h +++ b/PWGEM/Dilepton/Core/PhotonHBT.h @@ -103,7 +103,7 @@ struct PhotonHBT { Configurable maxY{"maxY", 0.8, "maximum rapidity for reconstructed particles"}; Configurable cfgDoMix{"cfgDoMix", true, "flag for event mixing"}; Configurable ndepth{"ndepth", 100, "depth for event mixing"}; - Configurable ndiff_bc_mix{"ndiff_bc_mix", 5, "difference in global BC required in mixed events"}; + Configurable ndiff_bc_mix{"ndiff_bc_mix", 198, "difference in global BC required in mixed events"}; ConfigurableAxis ConfVtxBins{"ConfVtxBins", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; ConfigurableAxis ConfCentBins{"ConfCentBins", {VARIABLE_WIDTH, 0.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.f, 999.f}, "Mixing bins - centrality"}; ConfigurableAxis ConfEPBins{"ConfEPBins", {16, -M_PI / 2, +M_PI / 2}, "Mixing bins - event plane angle"}; @@ -116,8 +116,8 @@ struct PhotonHBT { ConfigurableAxis ConfQBins{"ConfQBins", {60, 0, +0.3f}, "q bins for output histograms"}; ConfigurableAxis ConfKtBins{"ConfKtBins", {VARIABLE_WIDTH, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0}, "kT bins for output histograms"}; - ConfigurableAxis ConfM1Bins{"ConfM1Bins", {VARIABLE_WIDTH, 0.0, 0.14, 0.5, 1.1, 2.7, 3.2, 4.0}, "m1 bins for output histograms"}; - ConfigurableAxis ConfM2Bins{"ConfM2Bins", {VARIABLE_WIDTH, 0.0, 0.14, 0.5, 1.1, 2.7, 3.2, 4.0}, "m1 bins for output histograms"}; + ConfigurableAxis ConfM1Bins{"ConfM1Bins", {VARIABLE_WIDTH, 0.0, 0.14, 0.5, 1.1, 2.0, 2.7, 3.2, 4.0}, "m1 bins for output histograms"}; + ConfigurableAxis ConfM2Bins{"ConfM2Bins", {VARIABLE_WIDTH, 0.0, 0.14, 0.5, 1.1, 2.0, 2.7, 3.2, 4.0}, "m2 bins for output histograms"}; EMEventCut fEMEventCut; struct : ConfigurableGroup { @@ -151,7 +151,6 @@ struct PhotonHBT { Configurable cfg_require_v0_with_itstpc{"cfg_require_v0_with_itstpc", false, "flag to select V0s with ITS-TPC matched tracks"}; Configurable cfg_require_v0_with_itsonly{"cfg_require_v0_with_itsonly", false, "flag to select V0s with ITSonly tracks"}; Configurable cfg_require_v0_with_tpconly{"cfg_require_v0_with_tpconly", false, "flag to select V0s with TPConly tracks"}; - Configurable cfg_require_v0_on_wwire_ib{"cfg_require_v0_on_wwire_ib", false, "flag to select V0s on W wires ITSib"}; Configurable cfg_min_pt_v0{"cfg_min_pt_v0", 0.1, "min pT for v0 photons at PV"}; Configurable cfg_max_eta_v0{"cfg_max_eta_v0", 0.8, "max eta for v0 photons at PV"}; Configurable cfg_min_v0radius{"cfg_min_v0radius", 4.0, "min v0 radius"}; @@ -165,6 +164,7 @@ struct PhotonHBT { Configurable cfg_reject_v0_on_itsib{"cfg_reject_v0_on_itsib", true, "flag to reject V0s on ITSib"}; Configurable cfg_disable_itsonly_track{"cfg_disable_itsonly_track", false, "flag to disable ITSonly tracks"}; + Configurable cfg_disable_tpconly_track{"cfg_disable_tpconly_track", false, "flag to disable TPConly tracks"}; Configurable cfg_min_ncluster_tpc{"cfg_min_ncluster_tpc", 10, "min ncluster tpc"}; Configurable cfg_min_ncrossedrows{"cfg_min_ncrossedrows", 40, "min ncrossed rows"}; Configurable cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 999.f, "max fraction of shared clusters in TPC"}; @@ -403,7 +403,7 @@ struct PhotonHBT { if (d_bz_input > -990) { d_bz = d_bz_input; o2::parameters::GRPMagField grpmag; - if (fabs(d_bz) > 1e-5) { + if (std::fabs(d_bz) > 1e-5) { grpmag.setL3Current(30000.f / (d_bz / 5.0f)); } mRunNumber = collision.runNumber(); @@ -522,8 +522,6 @@ struct PhotonHBT { fV0PhotonCut.RejectITSib(pcmcuts.cfg_reject_v0_on_itsib); // for track - fV0PhotonCut.SetTrackPtRange(pcmcuts.cfg_min_pt_v0 * 0.5, 1e+10f); - fV0PhotonCut.SetTrackEtaRange(-pcmcuts.cfg_max_eta_v0, +pcmcuts.cfg_max_eta_v0); fV0PhotonCut.SetMinNClustersTPC(pcmcuts.cfg_min_ncluster_tpc); fV0PhotonCut.SetMinNCrossedRowsTPC(pcmcuts.cfg_min_ncrossedrows); fV0PhotonCut.SetMinNCrossedRowsOverFindableClustersTPC(0.8); @@ -532,32 +530,13 @@ struct PhotonHBT { fV0PhotonCut.SetTPCNsigmaElRange(pcmcuts.cfg_min_TPCNsigmaEl, pcmcuts.cfg_max_TPCNsigmaEl); fV0PhotonCut.SetChi2PerClusterITS(-1e+10, pcmcuts.cfg_max_chi2its); fV0PhotonCut.SetDisableITSonly(pcmcuts.cfg_disable_itsonly_track); - - if (pcmcuts.cfg_reject_v0_on_itsib) { - fV0PhotonCut.SetNClustersITS(2, 4); - } else { - fV0PhotonCut.SetNClustersITS(0, 7); - } + fV0PhotonCut.SetDisableTPConly(pcmcuts.cfg_disable_tpconly_track); + fV0PhotonCut.SetNClustersITS(0, 7); fV0PhotonCut.SetMeanClusterSizeITSob(0.0, 16.0); fV0PhotonCut.SetIsWithinBeamPipe(pcmcuts.cfg_require_v0_with_correct_xz); - - if (pcmcuts.cfg_require_v0_with_itstpc) { - fV0PhotonCut.SetRequireITSTPC(true); - fV0PhotonCut.SetRxyRange(4, 40); - } - if (pcmcuts.cfg_require_v0_with_itsonly) { - fV0PhotonCut.SetRequireITSonly(true); - fV0PhotonCut.SetRxyRange(4, 24); - } - if (pcmcuts.cfg_require_v0_with_tpconly) { - fV0PhotonCut.SetRequireTPConly(true); - fV0PhotonCut.SetRxyRange(32, 90); - } - if (pcmcuts.cfg_require_v0_on_wwire_ib) { - fV0PhotonCut.SetOnWwireIB(true); - fV0PhotonCut.SetOnWwireOB(false); - fV0PhotonCut.SetRxyRange(7, 14); - } + fV0PhotonCut.SetRequireITSTPC(pcmcuts.cfg_require_v0_with_itstpc); + fV0PhotonCut.SetRequireITSonly(pcmcuts.cfg_require_v0_with_itsonly); + fV0PhotonCut.SetRequireTPConly(pcmcuts.cfg_require_v0_with_tpconly); } o2::analysis::MlResponseDielectronSingleTrack mlResponseSingleTrack; @@ -692,7 +671,7 @@ struct PhotonHBT { // LOGF(info, "qabs_lcms = %f, qabs_lcms_tmp = %f", qabs_lcms, qabs_lcms_tmp); if (cfgDo3D) { - fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("hs_3d"), fabs(qout_lcms), fabs(qside_lcms), fabs(qlong_lcms), kt, v1.M(), v2.M(), weight); // qosl can be [-inf, +inf] and CF is symmetric for pos and neg qosl. To reduce stat. unc. absolute value is taken here. + fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("hs_3d"), std::fabs(qout_lcms), std::fabs(qside_lcms), std::fabs(qlong_lcms), kt, v1.M(), v2.M(), weight); // qosl can be [-inf, +inf] and CF is symmetric for pos and neg qosl. To reduce stat. unc. absolute value is taken here. } else { if (cfgUseLCMS) { fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("hs_1d"), qabs_lcms, kt, v1.M(), v2.M(), weight); diff --git a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h index 9e6905e8ab6..e4bc8414601 100644 --- a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h +++ b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGamma.h @@ -359,8 +359,6 @@ struct Pi0EtaToGammaGamma { fV0PhotonCut.RejectITSib(pcmcuts.cfg_reject_v0_on_itsib); // for track - fV0PhotonCut.SetTrackPtRange(pcmcuts.cfg_min_pt_v0 * 0.5, 1e+10f); - fV0PhotonCut.SetTrackEtaRange(-pcmcuts.cfg_max_eta_v0, +pcmcuts.cfg_max_eta_v0); fV0PhotonCut.SetMinNClustersTPC(pcmcuts.cfg_min_ncluster_tpc); fV0PhotonCut.SetMinNCrossedRowsTPC(pcmcuts.cfg_min_ncrossedrows); fV0PhotonCut.SetMinNCrossedRowsOverFindableClustersTPC(0.8); diff --git a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h index 50efdfa8ab1..c69ec62a51f 100644 --- a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h +++ b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h @@ -318,8 +318,6 @@ struct Pi0EtaToGammaGammaMC { fV0PhotonCut.RejectITSib(pcmcuts.cfg_reject_v0_on_itsib); // for track - fV0PhotonCut.SetTrackPtRange(pcmcuts.cfg_min_pt_v0 * 0.4, 1e+10f); - fV0PhotonCut.SetTrackEtaRange(-pcmcuts.cfg_max_eta_v0, +pcmcuts.cfg_max_eta_v0); fV0PhotonCut.SetMinNClustersTPC(pcmcuts.cfg_min_ncluster_tpc); fV0PhotonCut.SetMinNCrossedRowsTPC(pcmcuts.cfg_min_ncrossedrows); fV0PhotonCut.SetMinNCrossedRowsOverFindableClustersTPC(0.8); diff --git a/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx b/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx index 94afd4911e1..74c97448baf 100644 --- a/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx +++ b/PWGEM/PhotonMeson/Tasks/dalitzEEQC.cxx @@ -286,27 +286,13 @@ struct DalitzEEQC { fRegistry.fill(HIST("Pair/same/hMvsPhiV"), phiv, v12.M()); } - if (t1.sign() > 0) { - if (std::find(used_trackIds.begin(), used_trackIds.end(), t1.globalIndex()) == used_trackIds.end()) { - used_trackIds.emplace_back(t1.globalIndex()); - fillTrackInfo(t1); - } - } else { - if (std::find(used_trackIds.begin(), used_trackIds.end(), t1.globalIndex()) == used_trackIds.end()) { - used_trackIds.emplace_back(t1.globalIndex()); - fillTrackInfo(t1); - } + if (std::find(used_trackIds.begin(), used_trackIds.end(), t1.globalIndex()) == used_trackIds.end()) { + used_trackIds.emplace_back(t1.globalIndex()); + fillTrackInfo(t1); } - if (t2.sign() > 0) { - if (std::find(used_trackIds.begin(), used_trackIds.end(), t2.globalIndex()) == used_trackIds.end()) { - used_trackIds.emplace_back(t2.globalIndex()); - fillTrackInfo(t2); - } - } else { - if (std::find(used_trackIds.begin(), used_trackIds.end(), t2.globalIndex()) == used_trackIds.end()) { - used_trackIds.emplace_back(t2.globalIndex()); - fillTrackInfo(t2); - } + if (std::find(used_trackIds.begin(), used_trackIds.end(), t2.globalIndex()) == used_trackIds.end()) { + used_trackIds.emplace_back(t2.globalIndex()); + fillTrackInfo(t2); } return true; } @@ -318,9 +304,9 @@ struct DalitzEEQC { fRegistry.fill(HIST("Track/hQoverPt"), track.sign() / track.pt()); fRegistry.fill(HIST("Track/hEtaPhi"), track.phi(), track.eta()); fRegistry.fill(HIST("Track/hDCAxyz"), track.dcaXY(), track.dcaZ()); - fRegistry.fill(HIST("Track/hDCAxyzSigma"), track.dcaXY() / sqrt(track.cYY()), track.dcaZ() / sqrt(track.cZZ())); - fRegistry.fill(HIST("Track/hDCAxyRes_Pt"), track.pt(), sqrt(track.cYY()) * 1e+4); // convert cm to um - fRegistry.fill(HIST("Track/hDCAzRes_Pt"), track.pt(), sqrt(track.cZZ()) * 1e+4); // convert cm to um + fRegistry.fill(HIST("Track/hDCAxyzSigma"), track.dcaXY() / std::sqrt(track.cYY()), track.dcaZ() / std::sqrt(track.cZZ())); + fRegistry.fill(HIST("Track/hDCAxyRes_Pt"), track.pt(), std::sqrt(track.cYY()) * 1e+4); // convert cm to um + fRegistry.fill(HIST("Track/hDCAzRes_Pt"), track.pt(), std::sqrt(track.cZZ()) * 1e+4); // convert cm to um fRegistry.fill(HIST("Track/hNclsITS"), track.itsNCls()); fRegistry.fill(HIST("Track/hNclsTPC"), track.tpcNClsFound()); fRegistry.fill(HIST("Track/hNcrTPC"), track.tpcNClsCrossedRows()); diff --git a/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx b/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx index 1ad6750af0f..4e2e33c2d18 100644 --- a/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/dalitzEEQCMC.cxx @@ -127,6 +127,7 @@ struct DalitzEEQCMC { HistogramRegistry fRegistry{"output", {}, OutputObjHandlingPolicy::AnalysisObject, false, false}; static constexpr std::string_view event_cut_types[2] = {"before/", "after/"}; + static constexpr std::string_view track_types[2] = {"primary/", "secondary/"}; ~DalitzEEQCMC() {} @@ -157,33 +158,37 @@ struct DalitzEEQCMC { fRegistry.addClone("Pair/sm/Photon/", "Pair/sm/Phi/"); // track info - fRegistry.add("Track/hPt", "pT;p_{T} (GeV/c)", kTH1F, {{1000, 0.0f, 10}}, false); - fRegistry.add("Track/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{400, -20, 20}}, false); - fRegistry.add("Track/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {40, -2.0f, 2.0f}}, false); - fRegistry.add("Track/hDCAxyz", "DCA xy vs. z;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -0.1f, 0.1f}, {200, -0.1f, 0.1f}}, false); - fRegistry.add("Track/hDCAxyzSigma", "DCA xy vs. z;DCA_{xy} (#sigma);DCA_{z} (#sigma)", kTH2F, {{200, -10.0f, 10.0f}, {200, -10.0f, 10.0f}}, false); - fRegistry.add("Track/hDCAxyRes_Pt", "DCA_{xy} resolution vs. pT;p_{T} (GeV/c);DCA_{xy} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0., 500}}, false); - fRegistry.add("Track/hDCAzRes_Pt", "DCA_{z} resolution vs. pT;p_{T} (GeV/c);DCA_{z} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0., 500}}, false); - fRegistry.add("Track/hNclsTPC", "number of TPC clusters", kTH1F, {{161, -0.5, 160.5}}, false); - fRegistry.add("Track/hNcrTPC", "number of TPC crossed rows", kTH1F, {{161, -0.5, 160.5}}, false); - fRegistry.add("Track/hChi2TPC", "chi2/number of TPC clusters", kTH1F, {{100, 0, 10}}, false); - fRegistry.add("Track/hTPCNcr2Nf", "TPC Ncr/Nfindable", kTH1F, {{200, 0, 2}}, false); - fRegistry.add("Track/hTPCNcls2Nf", "TPC Ncls/Nfindable", kTH1F, {{200, 0, 2}}, false); - fRegistry.add("Track/hTPCNclsShared", "TPC Ncls shared/Ncls;p_{T} (GeV/c);N_{cls}^{shared}/N_{cls} in TPC", kTH2F, {{1000, 0, 10}, {100, 0, 1}}, false); - - fRegistry.add("Track/hTPCdEdx", "TPC dE/dx;p_{in} (GeV/c);TPC dE/dx (a.u.)", kTH2F, {{1000, 0, 10}, {200, 0, 200}}, false); - fRegistry.add("Track/hTPCNsigmaEl", "TPC n sigma el;p_{in} (GeV/c);n #sigma_{e}^{TPC}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); - fRegistry.add("Track/hTPCNsigmaPi", "TPC n sigma pi;p_{in} (GeV/c);n #sigma_{#pi}^{TPC}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); - - fRegistry.add("Track/hNclsITS", "number of ITS clusters", kTH1F, {{8, -0.5, 7.5}}, false); - fRegistry.add("Track/hChi2ITS", "chi2/number of ITS clusters", kTH1F, {{100, 0, 10}}, false); - fRegistry.add("Track/hITSClusterMap", "ITS cluster map", kTH1F, {{128, -0.5, 127.5}}, false); - fRegistry.add("Track/hMeanClusterSizeITS", "mean cluster size ITS; on ITS #times cos(#lambda)", kTH1F, {{32, 0, 16}}, false); - - fRegistry.add("Track/hChi2TOF", "chi2 of TOF", kTH1F, {{100, 0, 10}}, false); - fRegistry.add("Track/hTOFbeta", "TOF beta;p_{pv} (GeV/c);#beta", kTH2F, {{1000, 0, 10}, {240, 0, 1.2}}, false); - fRegistry.add("Track/hTOFNsigmaEl", "TOF n sigma el;p_{pv} (GeV/c);n #sigma_{e}^{TOF}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); - fRegistry.add("Track/hTOFNsigmaPi", "TOF n sigma pi;p_{pv} (GeV/c);n #sigma_{#pi}^{TOF}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); + fRegistry.add("Track/primary/hPt", "pT;p_{T} (GeV/c)", kTH1F, {{1000, 0.0f, 10}}, false); + fRegistry.add("Track/primary/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{400, -20, 20}}, false); + fRegistry.add("Track/primary/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {40, -2.0f, 2.0f}}, false); + fRegistry.add("Track/primary/hDCAxyz", "DCA xy vs. z;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -0.1f, 0.1f}, {200, -0.1f, 0.1f}}, false); + fRegistry.add("Track/primary/hDCAxyzSigma", "DCA xy vs. z;DCA_{xy} (#sigma);DCA_{z} (#sigma)", kTH2F, {{200, -10.0f, 10.0f}, {200, -10.0f, 10.0f}}, false); + fRegistry.add("Track/primary/hDCAxyRes_Pt", "DCA_{xy} resolution vs. pT;p_{T} (GeV/c);DCA_{xy} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0., 500}}, false); + fRegistry.add("Track/primary/hDCAzRes_Pt", "DCA_{z} resolution vs. pT;p_{T} (GeV/c);DCA_{z} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0., 500}}, false); + fRegistry.add("Track/primary/hNclsTPC", "number of TPC clusters", kTH1F, {{161, -0.5, 160.5}}, false); + fRegistry.add("Track/primary/hNcrTPC", "number of TPC crossed rows", kTH1F, {{161, -0.5, 160.5}}, false); + fRegistry.add("Track/primary/hChi2TPC", "chi2/number of TPC clusters", kTH1F, {{100, 0, 10}}, false); + fRegistry.add("Track/primary/hTPCNcr2Nf", "TPC Ncr/Nfindable", kTH1F, {{200, 0, 2}}, false); + fRegistry.add("Track/primary/hTPCNcls2Nf", "TPC Ncls/Nfindable", kTH1F, {{200, 0, 2}}, false); + fRegistry.add("Track/primary/hTPCNclsShared", "TPC Ncls shared/Ncls;p_{T} (GeV/c);N_{cls}^{shared}/N_{cls} in TPC", kTH2F, {{1000, 0, 10}, {100, 0, 1}}, false); + + fRegistry.add("Track/primary/hTPCdEdx", "TPC dE/dx;p_{in} (GeV/c);TPC dE/dx (a.u.)", kTH2F, {{1000, 0, 10}, {200, 0, 200}}, false); + fRegistry.add("Track/primary/hTPCNsigmaEl", "TPC n sigma el;p_{in} (GeV/c);n #sigma_{e}^{TPC}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); + fRegistry.add("Track/primary/hTPCNsigmaPi", "TPC n sigma pi;p_{in} (GeV/c);n #sigma_{#pi}^{TPC}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); + + fRegistry.add("Track/primary/hNclsITS", "number of ITS clusters", kTH1F, {{8, -0.5, 7.5}}, false); + fRegistry.add("Track/primary/hChi2ITS", "chi2/number of ITS clusters", kTH1F, {{100, 0, 10}}, false); + fRegistry.add("Track/primary/hITSClusterMap", "ITS cluster map", kTH1F, {{128, -0.5, 127.5}}, false); + fRegistry.add("Track/primary/hMeanClusterSizeITS", "mean cluster size ITS; on ITS #times cos(#lambda)", kTH1F, {{32, 0, 16}}, false); + + fRegistry.add("Track/primary/hChi2TOF", "chi2 of TOF", kTH1F, {{100, 0, 10}}, false); + fRegistry.add("Track/primary/hTOFbeta", "TOF beta;p_{pv} (GeV/c);#beta", kTH2F, {{1000, 0, 10}, {240, 0, 1.2}}, false); + fRegistry.add("Track/primary/hTOFNsigmaEl", "TOF n sigma el;p_{pv} (GeV/c);n #sigma_{e}^{TOF}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); + fRegistry.add("Track/primary/hTOFNsigmaPi", "TOF n sigma pi;p_{pv} (GeV/c);n #sigma_{#pi}^{TOF}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); + fRegistry.add("Track/primary/hPtGen_DeltaPtOverPtGen", "electron p_{T} resolution;p_{T}^{gen} (GeV/c);(p_{T}^{rec} - p_{T}^{gen})/p_{T}^{gen}", kTH2F, {{1000, 0, 10}, {200, -1.0f, 1.0f}}, true); + fRegistry.add("Track/primary/hPtGen_DeltaEta", "electron #eta resolution;p_{T}^{gen} (GeV/c);#eta^{rec} - #eta^{gen}", kTH2F, {{1000, 0, 10}, {100, -0.5f, 0.5f}}, true); + fRegistry.add("Track/primary/hPtGen_DeltaPhi", "electron #varphi resolution;p_{T}^{gen} (GeV/c);#varphi^{rec} - #varphi^{gen} (rad.)", kTH2F, {{1000, 0, 10}, {100, -0.5f, 0.5f}}, true); + fRegistry.addClone("Track/primary/", "Track/secondary/"); } void init(InitContext&) @@ -351,26 +356,74 @@ struct DalitzEEQCMC { case 111: fRegistry.fill(HIST("Pair/sm/Pi0/hMvsPt"), v12.M(), v12.Pt()); fRegistry.fill(HIST("Pair/sm/Pi0/hMvsPhiV"), phiv, v12.M()); + if (std::find(used_trackIds.begin(), used_trackIds.end(), t1.globalIndex()) == used_trackIds.end()) { + used_trackIds.emplace_back(t1.globalIndex()); + fillTrackInfo<0>(t1); + } + if (std::find(used_trackIds.begin(), used_trackIds.end(), t2.globalIndex()) == used_trackIds.end()) { + used_trackIds.emplace_back(t2.globalIndex()); + fillTrackInfo<0>(t2); + } break; case 221: fRegistry.fill(HIST("Pair/sm/Eta/hMvsPt"), v12.M(), v12.Pt()); fRegistry.fill(HIST("Pair/sm/Eta/hMvsPhiV"), phiv, v12.M()); + if (std::find(used_trackIds.begin(), used_trackIds.end(), t1.globalIndex()) == used_trackIds.end()) { + used_trackIds.emplace_back(t1.globalIndex()); + fillTrackInfo<0>(t1); + } + if (std::find(used_trackIds.begin(), used_trackIds.end(), t2.globalIndex()) == used_trackIds.end()) { + used_trackIds.emplace_back(t2.globalIndex()); + fillTrackInfo<0>(t2); + } break; case 331: fRegistry.fill(HIST("Pair/sm/EtaPrime/hMvsPt"), v12.M(), v12.Pt()); fRegistry.fill(HIST("Pair/sm/EtaPrime/hMvsPhiV"), phiv, v12.M()); + if (std::find(used_trackIds.begin(), used_trackIds.end(), t1.globalIndex()) == used_trackIds.end()) { + used_trackIds.emplace_back(t1.globalIndex()); + fillTrackInfo<0>(t1); + } + if (std::find(used_trackIds.begin(), used_trackIds.end(), t2.globalIndex()) == used_trackIds.end()) { + used_trackIds.emplace_back(t2.globalIndex()); + fillTrackInfo<0>(t2); + } break; case 113: fRegistry.fill(HIST("Pair/sm/Rho/hMvsPt"), v12.M(), v12.Pt()); fRegistry.fill(HIST("Pair/sm/Rho/hMvsPhiV"), phiv, v12.M()); + if (std::find(used_trackIds.begin(), used_trackIds.end(), t1.globalIndex()) == used_trackIds.end()) { + used_trackIds.emplace_back(t1.globalIndex()); + fillTrackInfo<0>(t1); + } + if (std::find(used_trackIds.begin(), used_trackIds.end(), t2.globalIndex()) == used_trackIds.end()) { + used_trackIds.emplace_back(t2.globalIndex()); + fillTrackInfo<0>(t2); + } break; case 223: fRegistry.fill(HIST("Pair/sm/Omega/hMvsPt"), v12.M(), v12.Pt()); fRegistry.fill(HIST("Pair/sm/Omega/hMvsPhiV"), phiv, v12.M()); + if (std::find(used_trackIds.begin(), used_trackIds.end(), t1.globalIndex()) == used_trackIds.end()) { + used_trackIds.emplace_back(t1.globalIndex()); + fillTrackInfo<0>(t1); + } + if (std::find(used_trackIds.begin(), used_trackIds.end(), t2.globalIndex()) == used_trackIds.end()) { + used_trackIds.emplace_back(t2.globalIndex()); + fillTrackInfo<0>(t2); + } break; case 333: fRegistry.fill(HIST("Pair/sm/Phi/hMvsPt"), v12.M(), v12.Pt()); fRegistry.fill(HIST("Pair/sm/Phi/hMvsPhiV"), phiv, v12.M()); + if (std::find(used_trackIds.begin(), used_trackIds.end(), t1.globalIndex()) == used_trackIds.end()) { + used_trackIds.emplace_back(t1.globalIndex()); + fillTrackInfo<0>(t1); + } + if (std::find(used_trackIds.begin(), used_trackIds.end(), t2.globalIndex()) == used_trackIds.end()) { + used_trackIds.emplace_back(t2.globalIndex()); + fillTrackInfo<0>(t2); + } break; default: break; @@ -380,6 +433,14 @@ struct DalitzEEQCMC { case 22: fRegistry.fill(HIST("Pair/sm/Photon/hMvsPt"), v12.M(), v12.Pt()); fRegistry.fill(HIST("Pair/sm/Photon/hMvsPhiV"), phiv, v12.M()); + if (std::find(used_trackIds.begin(), used_trackIds.end(), t1.globalIndex()) == used_trackIds.end()) { + used_trackIds.emplace_back(t1.globalIndex()); + fillTrackInfo<1>(t1); + } + if (std::find(used_trackIds.begin(), used_trackIds.end(), t2.globalIndex()) == used_trackIds.end()) { + used_trackIds.emplace_back(t2.globalIndex()); + fillTrackInfo<1>(t2); + } break; default: break; @@ -387,60 +448,39 @@ struct DalitzEEQCMC { } // end of primary/secondary selection } // end of primary selection for same mother } - - // fill track info that belong to true pairs. - if (t1.sign() > 0) { - if (std::find(used_trackIds.begin(), used_trackIds.end(), t1.globalIndex()) == used_trackIds.end()) { - used_trackIds.emplace_back(t1.globalIndex()); - fillTrackInfo(t1); - } - } else { - if (std::find(used_trackIds.begin(), used_trackIds.end(), t1.globalIndex()) == used_trackIds.end()) { - used_trackIds.emplace_back(t1.globalIndex()); - fillTrackInfo(t1); - } - } - if (t2.sign() > 0) { - if (std::find(used_trackIds.begin(), used_trackIds.end(), t1.globalIndex()) == used_trackIds.end()) { - used_trackIds.emplace_back(t1.globalIndex()); - fillTrackInfo(t2); - } - } else { - if (std::find(used_trackIds.begin(), used_trackIds.end(), t2.globalIndex()) == used_trackIds.end()) { - used_trackIds.emplace_back(t2.globalIndex()); - fillTrackInfo(t2); - } - } - return true; } - template + template void fillTrackInfo(TTrack const& track) { - fRegistry.fill(HIST("Track/hPt"), track.pt()); - fRegistry.fill(HIST("Track/hQoverPt"), track.sign() / track.pt()); - fRegistry.fill(HIST("Track/hEtaPhi"), track.phi(), track.eta()); - fRegistry.fill(HIST("Track/hDCAxyz"), track.dcaXY(), track.dcaZ()); - fRegistry.fill(HIST("Track/hDCAxyzSigma"), track.dcaXY() / sqrt(track.cYY()), track.dcaZ() / sqrt(track.cZZ())); - fRegistry.fill(HIST("Track/hDCAxyRes_Pt"), track.pt(), sqrt(track.cYY()) * 1e+4); // convert cm to um - fRegistry.fill(HIST("Track/hDCAzRes_Pt"), track.pt(), sqrt(track.cZZ()) * 1e+4); // convert cm to um - fRegistry.fill(HIST("Track/hNclsITS"), track.itsNCls()); - fRegistry.fill(HIST("Track/hNclsTPC"), track.tpcNClsFound()); - fRegistry.fill(HIST("Track/hNcrTPC"), track.tpcNClsCrossedRows()); - fRegistry.fill(HIST("Track/hTPCNcr2Nf"), track.tpcCrossedRowsOverFindableCls()); - fRegistry.fill(HIST("Track/hTPCNcls2Nf"), track.tpcFoundOverFindableCls()); - fRegistry.fill(HIST("Track/hTPCNclsShared"), track.pt(), track.tpcFractionSharedCls()); - fRegistry.fill(HIST("Track/hChi2TPC"), track.tpcChi2NCl()); - fRegistry.fill(HIST("Track/hChi2ITS"), track.itsChi2NCl()); - fRegistry.fill(HIST("Track/hITSClusterMap"), track.itsClusterMap()); - fRegistry.fill(HIST("Track/hMeanClusterSizeITS"), track.p(), track.meanClusterSizeITS() * std::cos(std::atan(track.tgl()))); - fRegistry.fill(HIST("Track/hTPCdEdx"), track.tpcInnerParam(), track.tpcSignal()); - fRegistry.fill(HIST("Track/hTPCNsigmaEl"), track.tpcInnerParam(), track.tpcNSigmaEl()); - fRegistry.fill(HIST("Track/hTPCNsigmaPi"), track.tpcInnerParam(), track.tpcNSigmaPi()); - fRegistry.fill(HIST("Track/hTOFNsigmaEl"), track.p(), track.tofNSigmaEl()); - fRegistry.fill(HIST("Track/hTOFNsigmaPi"), track.p(), track.tofNSigmaPi()); - fRegistry.fill(HIST("Track/hTOFbeta"), track.p(), track.beta()); + auto mctrack = track.template emmcparticle_as(); + fRegistry.fill(HIST("Track/") + HIST(track_types[tracktype]) + HIST("hPt"), track.pt()); + fRegistry.fill(HIST("Track/") + HIST(track_types[tracktype]) + HIST("hQoverPt"), track.sign() / track.pt()); + fRegistry.fill(HIST("Track/") + HIST(track_types[tracktype]) + HIST("hEtaPhi"), track.phi(), track.eta()); + fRegistry.fill(HIST("Track/") + HIST(track_types[tracktype]) + HIST("hDCAxyz"), track.dcaXY(), track.dcaZ()); + fRegistry.fill(HIST("Track/") + HIST(track_types[tracktype]) + HIST("hDCAxyzSigma"), track.dcaXY() / std::sqrt(track.cYY()), track.dcaZ() / std::sqrt(track.cZZ())); + fRegistry.fill(HIST("Track/") + HIST(track_types[tracktype]) + HIST("hDCAxyRes_Pt"), track.pt(), std::sqrt(track.cYY()) * 1e+4); // convert cm to um + fRegistry.fill(HIST("Track/") + HIST(track_types[tracktype]) + HIST("hDCAzRes_Pt"), track.pt(), std::sqrt(track.cZZ()) * 1e+4); // convert cm to um + fRegistry.fill(HIST("Track/") + HIST(track_types[tracktype]) + HIST("hNclsITS"), track.itsNCls()); + fRegistry.fill(HIST("Track/") + HIST(track_types[tracktype]) + HIST("hNclsTPC"), track.tpcNClsFound()); + fRegistry.fill(HIST("Track/") + HIST(track_types[tracktype]) + HIST("hNcrTPC"), track.tpcNClsCrossedRows()); + fRegistry.fill(HIST("Track/") + HIST(track_types[tracktype]) + HIST("hTPCNcr2Nf"), track.tpcCrossedRowsOverFindableCls()); + fRegistry.fill(HIST("Track/") + HIST(track_types[tracktype]) + HIST("hTPCNcls2Nf"), track.tpcFoundOverFindableCls()); + fRegistry.fill(HIST("Track/") + HIST(track_types[tracktype]) + HIST("hTPCNclsShared"), track.pt(), track.tpcFractionSharedCls()); + fRegistry.fill(HIST("Track/") + HIST(track_types[tracktype]) + HIST("hChi2TPC"), track.tpcChi2NCl()); + fRegistry.fill(HIST("Track/") + HIST(track_types[tracktype]) + HIST("hChi2ITS"), track.itsChi2NCl()); + fRegistry.fill(HIST("Track/") + HIST(track_types[tracktype]) + HIST("hITSClusterMap"), track.itsClusterMap()); + fRegistry.fill(HIST("Track/") + HIST(track_types[tracktype]) + HIST("hMeanClusterSizeITS"), track.p(), track.meanClusterSizeITS() * std::cos(std::atan(track.tgl()))); + fRegistry.fill(HIST("Track/") + HIST(track_types[tracktype]) + HIST("hTPCdEdx"), track.tpcInnerParam(), track.tpcSignal()); + fRegistry.fill(HIST("Track/") + HIST(track_types[tracktype]) + HIST("hTPCNsigmaEl"), track.tpcInnerParam(), track.tpcNSigmaEl()); + fRegistry.fill(HIST("Track/") + HIST(track_types[tracktype]) + HIST("hTPCNsigmaPi"), track.tpcInnerParam(), track.tpcNSigmaPi()); + fRegistry.fill(HIST("Track/") + HIST(track_types[tracktype]) + HIST("hTOFNsigmaEl"), track.p(), track.tofNSigmaEl()); + fRegistry.fill(HIST("Track/") + HIST(track_types[tracktype]) + HIST("hTOFNsigmaPi"), track.p(), track.tofNSigmaPi()); + fRegistry.fill(HIST("Track/") + HIST(track_types[tracktype]) + HIST("hTOFbeta"), track.p(), track.beta()); + fRegistry.fill(HIST("Track/") + HIST(track_types[tracktype]) + HIST("hPtGen_DeltaPtOverPtGen"), mctrack.pt(), (track.pt() - mctrack.pt()) / mctrack.pt()); + fRegistry.fill(HIST("Track/") + HIST(track_types[tracktype]) + HIST("hPtGen_DeltaEta"), mctrack.pt(), track.eta() - mctrack.eta()); + fRegistry.fill(HIST("Track/") + HIST(track_types[tracktype]) + HIST("hPtGen_DeltaPhi"), mctrack.pt(), track.phi() - mctrack.phi()); } std::vector used_trackIds; diff --git a/PWGEM/PhotonMeson/Tasks/pcmQC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQC.cxx index 81fbd5328ef..003e2062d8d 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQC.cxx @@ -215,8 +215,6 @@ struct PCMQC { fV0PhotonCut.RejectITSib(pcmcuts.cfg_reject_v0_on_itsib); // for track - fV0PhotonCut.SetTrackPtRange(pcmcuts.cfg_min_pt_v0 * 0.4, 1e+10f); - fV0PhotonCut.SetTrackEtaRange(pcmcuts.cfg_min_eta_v0, pcmcuts.cfg_max_eta_v0); fV0PhotonCut.SetMinNClustersTPC(pcmcuts.cfg_min_ncluster_tpc); fV0PhotonCut.SetMinNCrossedRowsTPC(pcmcuts.cfg_min_ncrossedrows); fV0PhotonCut.SetMinNCrossedRowsOverFindableClustersTPC(0.8); diff --git a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx index fe5b31cd975..8a38efa0992 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx @@ -204,9 +204,9 @@ struct PCMQCMC { fRegistry.add("V0/primary/hConvPoint_diffX", "conversion point diff X MC;X_{MC} (cm);X_{rec} - X_{MC} (cm)", kTH2F, {{200, -100, +100}, {100, -50.0f, 50.0f}}, true); fRegistry.add("V0/primary/hConvPoint_diffY", "conversion point diff Y MC;Y_{MC} (cm);Y_{rec} - Y_{MC} (cm)", kTH2F, {{200, -100, +100}, {100, -50.0f, 50.0f}}, true); fRegistry.add("V0/primary/hConvPoint_diffZ", "conversion point diff Z MC;Z_{MC} (cm);Z_{rec} - Z_{MC} (cm)", kTH2F, {{200, -100, +100}, {100, -50.0f, 50.0f}}, true); - fRegistry.add("V0/primary/hPtGen_DeltaPtOverPtGen", "photon p_{T} resolution;p_{T}^{gen} (GeV/c);(p_{T}^{rec} - p_{T}^{gen})/p_{T}^{gen}", kTH2F, {{1000, 0, 10}, {400, -1.0f, 1.0f}}, true); - fRegistry.add("V0/primary/hPtGen_DeltaEta", "photon #eta resolution;p_{T}^{gen} (GeV/c);#eta^{rec} - #eta^{gen}", kTH2F, {{1000, 0, 10}, {400, -1.0f, 1.0f}}, true); - fRegistry.add("V0/primary/hPtGen_DeltaPhi", "photon #varphi resolution;p_{T}^{gen} (GeV/c);#varphi^{rec} - #varphi^{gen} (rad.)", kTH2F, {{1000, 0, 10}, {400, -1.0f, 1.0f}}, true); + fRegistry.add("V0/primary/hPtGen_DeltaPtOverPtGen", "photon p_{T} resolution;p_{T}^{gen} (GeV/c);(p_{T}^{rec} - p_{T}^{gen})/p_{T}^{gen}", kTH2F, {{1000, 0, 10}, {200, -1.0f, 1.0f}}, true); + fRegistry.add("V0/primary/hPtGen_DeltaEta", "photon #eta resolution;p_{T}^{gen} (GeV/c);#eta^{rec} - #eta^{gen}", kTH2F, {{1000, 0, 10}, {100, -0.5f, 0.5f}}, true); + fRegistry.add("V0/primary/hPtGen_DeltaPhi", "photon #varphi resolution;p_{T}^{gen} (GeV/c);#varphi^{rec} - #varphi^{gen} (rad.)", kTH2F, {{1000, 0, 10}, {100, -0.5f, 0.5f}}, true); fRegistry.add("V0/primary/hXY_MC", "X vs. Y of true photon conversion point.;X (cm);Y (cm)", kTH2F, {{400, -100.0f, +100}, {400, -100, +100}}, true); fRegistry.add("V0/primary/hRZ_MC", "R vs. Z of true photon conversion point;Z (cm);R_{xy} (cm)", kTH2F, {{200, -100.0f, +100}, {200, 0, 100}}, true); fRegistry.add("V0/primary/hsConvPoint", "photon conversion point;r_{xy} (cm);#varphi (rad.);#eta;", kTHnSparseF, {{100, 0.0f, 100}, {90, 0, 2 * M_PI}, {80, -2, +2}}, false); @@ -215,6 +215,9 @@ struct PCMQCMC { fRegistry.addClone("V0/primary/", "V0/fromPi0Dalitz/"); // misidentified dielectron from pi0 dalitz decay fRegistry.addClone("V0/primary/", "V0/fromEtaDalitz/"); // misidentified dielectron from eta dalitz decay + fRegistry.addClone("V0/primary/hPt", "V0/candidate/hPt"); // only for purity + fRegistry.addClone("V0/primary/hEtaPhi", "V0/candidate/hEtaPhi"); // only for purity + // v0leg info fRegistry.add("V0Leg/primary/hPt", "pT;p_{T,e} (GeV/c)", kTH1F, {{1000, 0.0f, 10}}, false); fRegistry.add("V0Leg/primary/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{1000, -50, 50}}, false); @@ -236,13 +239,16 @@ struct PCMQCMC { fRegistry.add("V0Leg/primary/hXY", "X vs. Y;X (cm);Y (cm)", kTH2F, {{100, 0, 100}, {40, -20, 20}}, false); fRegistry.add("V0Leg/primary/hZX", "Z vs. X;Z (cm);X (cm)", kTH2F, {{200, -100, 100}, {100, 0, 100}}, false); fRegistry.add("V0Leg/primary/hZY", "Z vs. Y;Z (cm);Y (cm)", kTH2F, {{200, -100, 100}, {40, -20, 20}}, false); - fRegistry.add("V0Leg/primary/hPtGen_DeltaPtOverPtGen", "electron p_{T} resolution;p_{T}^{gen} (GeV/c);(p_{T}^{rec} - p_{T}^{gen})/p_{T}^{gen}", kTH2F, {{1000, 0, 10}, {400, -1.0f, 1.0f}}, true); - fRegistry.add("V0Leg/primary/hPtGen_DeltaEta", "electron #eta resolution;p_{T}^{gen} (GeV/c);#eta^{rec} - #eta^{gen}", kTH2F, {{1000, 0, 10}, {400, -1.0f, 1.0f}}, true); - fRegistry.add("V0Leg/primary/hPtGen_DeltaPhi", "electron #varphi resolution;p_{T}^{gen} (GeV/c);#varphi^{rec} - #varphi^{gen} (rad.)", kTH2F, {{1000, 0, 10}, {400, -1.0f, 1.0f}}, true); + fRegistry.add("V0Leg/primary/hPtGen_DeltaPtOverPtGen", "electron p_{T} resolution;p_{T}^{gen} (GeV/c);(p_{T}^{rec} - p_{T}^{gen})/p_{T}^{gen}", kTH2F, {{1000, 0, 10}, {200, -1.0f, 1.0f}}, true); + fRegistry.add("V0Leg/primary/hPtGen_DeltaEta", "electron #eta resolution;p_{T}^{gen} (GeV/c);#eta^{rec} - #eta^{gen}", kTH2F, {{1000, 0, 10}, {100, -0.5f, 0.5f}}, true); + fRegistry.add("V0Leg/primary/hPtGen_DeltaPhi", "electron #varphi resolution;p_{T}^{gen} (GeV/c);#varphi^{rec} - #varphi^{gen} (rad.)", kTH2F, {{1000, 0, 10}, {100, -0.5f, 0.5f}}, true); fRegistry.addClone("V0Leg/primary/", "V0Leg/fromWD/"); // from weak decay fRegistry.addClone("V0Leg/primary/", "V0Leg/fromHS/"); // from hadronic shower in detector materials fRegistry.addClone("V0Leg/primary/", "V0Leg/fromPi0Dalitz/"); // misidentified dielectron from pi0 dalitz decay fRegistry.addClone("V0Leg/primary/", "V0Leg/fromEtaDalitz/"); // misidentified dielectron from eta dalitz decay + + fRegistry.addClone("V0Leg/primary/hPt", "V0Leg/candidate/hPt"); // only for purity + fRegistry.addClone("V0Leg/primary/hEtaPhi", "V0Leg/candidate/hEtaPhi"); // only for purity } void DefineEMEventCut() @@ -278,8 +284,6 @@ struct PCMQCMC { fV0PhotonCut.RejectITSib(pcmcuts.cfg_reject_v0_on_itsib); // for track - fV0PhotonCut.SetTrackPtRange(pcmcuts.cfg_min_pt_v0 * 0.4, 1e+10f); - fV0PhotonCut.SetTrackEtaRange(pcmcuts.cfg_min_eta_v0, pcmcuts.cfg_max_eta_v0); fV0PhotonCut.SetMinNClustersTPC(pcmcuts.cfg_min_ncluster_tpc); fV0PhotonCut.SetMinNCrossedRowsTPC(pcmcuts.cfg_min_ncrossedrows); fV0PhotonCut.SetMinNCrossedRowsOverFindableClustersTPC(0.8); @@ -444,6 +448,14 @@ struct PCMQCMC { if (!fV0PhotonCut.IsSelected(v0)) { continue; } + + fRegistry.fill(HIST("V0/candidate/hPt"), v0.pt()); + fRegistry.fill(HIST("V0/candidate/hEtaPhi"), v0.phi(), v0.eta()); + for (auto& leg : {pos, ele}) { + fRegistry.fill(HIST("V0Leg/candidate/hPt"), leg.pt()); + fRegistry.fill(HIST("V0Leg/candidate/hEtaPhi"), leg.phi(), leg.eta()); + } + int photonid = FindCommonMotherFrom2Prongs(posmc, elemc, -11, 11, 22, mcparticles); int pi0id = FindCommonMotherFrom2Prongs(posmc, elemc, -11, 11, 111, mcparticles); // pi0 dalitz decay int etaid = FindCommonMotherFrom2Prongs(posmc, elemc, -11, 11, 221, mcparticles); // eta dalitz decay diff --git a/PWGEM/PhotonMeson/Tasks/prefilterPhoton.cxx b/PWGEM/PhotonMeson/Tasks/prefilterPhoton.cxx index 2727cb631bb..4b0ce098f6c 100644 --- a/PWGEM/PhotonMeson/Tasks/prefilterPhoton.cxx +++ b/PWGEM/PhotonMeson/Tasks/prefilterPhoton.cxx @@ -133,13 +133,15 @@ struct prefilterPhoton { Configurable cfg_max_pt_track{"cfg_max_pt_track", 1e+10, "max pT for single track"}; Configurable cfg_min_eta_track{"cfg_min_eta_track", -2.0, "min eta for single track"}; Configurable cfg_max_eta_track{"cfg_max_eta_track", 2.0, "max eta for single track"}; - Configurable cfg_min_ncluster_tpc{"cfg_min_ncluster_tpc", 40, "min ncluster tpc"}; Configurable cfg_min_ncluster_its{"cfg_min_ncluster_its", 5, "min ncluster its"}; + Configurable cfg_min_ncluster_tpc{"cfg_min_ncluster_tpc", 40, "min ncluster tpc"}; Configurable cfg_min_ncrossedrows{"cfg_min_ncrossedrows", 0, "min ncrossed rows"}; + Configurable cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 999.f, "max fraction of shared clusters in TPC"}; Configurable cfg_max_chi2tpc{"cfg_max_chi2tpc", 4.0, "max chi2/NclsTPC"}; Configurable cfg_max_chi2its{"cfg_max_chi2its", 5.0, "max chi2/NclsITS"}; - Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 0.05, "max dca XY for single track in cm"}; - Configurable cfg_max_dcaz{"cfg_max_dcaz", 0.05, "max dca Z for single track in cm"}; + Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 1.f, "max dca XY for single track in cm"}; + Configurable cfg_max_dcaz{"cfg_max_dcaz", 1.f, "max dca Z for single track in cm"}; + Configurable cfg_max_dca3dsigma_track{"cfg_max_dca3dsigma_track", 1.5, "max DCA 3D in sigma"}; Configurable cfg_pid_scheme{"cfg_pid_scheme", static_cast(DalitzEECut::PIDSchemes::kTOFif), "pid scheme [kTOFif : 0, kTPConly : 1]"}; Configurable cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -2.0, "min. TPC n sigma for electron inclusion"}; @@ -298,11 +300,13 @@ struct prefilterPhoton { fDileptonCut.SetMinNClustersTPC(dileptoncuts.cfg_min_ncluster_tpc); fDileptonCut.SetMinNCrossedRowsTPC(dileptoncuts.cfg_min_ncrossedrows); fDileptonCut.SetMinNCrossedRowsOverFindableClustersTPC(0.8); + fDileptonCut.SetMaxFracSharedClustersTPC(dileptoncuts.cfg_max_frac_shared_clusters_tpc); fDileptonCut.SetChi2PerClusterTPC(0.0, dileptoncuts.cfg_max_chi2tpc); fDileptonCut.SetChi2PerClusterITS(0.0, dileptoncuts.cfg_max_chi2its); fDileptonCut.SetNClustersITS(dileptoncuts.cfg_min_ncluster_its, 7); fDileptonCut.SetMaxDcaXY(dileptoncuts.cfg_max_dcaxy); fDileptonCut.SetMaxDcaZ(dileptoncuts.cfg_max_dcaz); + fDileptonCut.SetTrackDca3DRange(0.f, dileptoncuts.cfg_max_dca3dsigma_track); // in sigma // for eID fDileptonCut.SetPIDScheme(dileptoncuts.cfg_pid_scheme); From 8899dcb2931938945d8a65ff86a1cafc32dde93c Mon Sep 17 00:00:00 2001 From: Thorkj <154221526+Thorkj@users.noreply.github.com> Date: Sun, 16 Mar 2025 22:30:53 +0100 Subject: [PATCH 0713/1650] [PWGCF] added two track cut and MFT switch (#10499) --- .../Tasks/corrSparse.cxx | 196 +++++++++++++++--- 1 file changed, 168 insertions(+), 28 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx b/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx index 3bb184708da..630df5bf9c9 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx @@ -13,27 +13,33 @@ /// \brief Provides a sparse with usefull two particle correlation info /// \author Thor Jensen (thor.kjaersgaard.jensen@cern.ch) and Debojit Sarkar (debojit.sarkar@cern.ch) +#include +#include "TRandom3.h" #include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "Framework/ASoAHelpers.h" -#include "Framework/ASoA.h" +#include "Framework/StepTHn.h" #include "Framework/HistogramRegistry.h" #include "Framework/RunningWorkflowInfo.h" #include "CommonConstants/MathConstants.h" -#include "CCDB/BasicCCDBManager.h" #include "Common/Core/RecoDecay.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/Centrality.h" -#include "Common/DataModel/Multiplicity.h" #include "PWGCF/DataModel/CorrelationsDerived.h" +#include "Common/DataModel/CollisionAssociationTables.h" #include "PWGCF/Core/CorrelationContainer.h" #include "PWGCF/Core/PairCuts.h" +#include "DataFormatsParameters/GRPObject.h" +#include "DataFormatsParameters/GRPMagField.h" +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; namespace o2::aod { namespace corrsparse @@ -45,10 +51,6 @@ DECLARE_SOA_TABLE(Multiplicity, "AOD", "MULTIPLICITY", } // namespace o2::aod -using namespace o2; -using namespace o2::framework; -using namespace o2::framework::expressions; - // define the filtered collisions and tracks #define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable NAME{#NAME, DEFAULT, HELP}; @@ -56,7 +58,7 @@ struct CalcNch { O2_DEFINE_CONFIGURABLE(cfgZVtxCut, float, 10.0f, "Accepted z-vertex range") O2_DEFINE_CONFIGURABLE(cfgPtCutMin, float, 0.2f, "minimum accepted track pT") O2_DEFINE_CONFIGURABLE(cfgPtCutMax, float, 10.0f, "maximum accepted track pT") - O2_DEFINE_CONFIGURABLE(cfgEtaCut, float, 0.8f, "Eta cut") + O2_DEFINE_CONFIGURABLE(cfgEtaCut, float, 10.0f, "Eta cut") O2_DEFINE_CONFIGURABLE(cfgMinMixEventNum, int, 5, "Minimum number of events to mix") Filter trackFilter = (nabs(aod::track::eta) < cfgEtaCut) && (aod::track::pt > cfgPtCutMin) && (aod::track::pt < cfgPtCutMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)); @@ -79,6 +81,7 @@ struct CalcNch { void process(AodCollisions::iterator const& collision, AodTracks const& tracks) { + // LOGF(info, "multiplicity from tracks %d, multiplicity from collision %d", tracks.size(), collision.numContrib()); multiplicityNch(tracks.size()); registry.fill(HIST("Ncharge"), tracks.size()); registry.fill(HIST("zVtx_all"), collision.posZ()); @@ -86,6 +89,8 @@ struct CalcNch { }; struct CorrSparse { + Service ccdb; + O2_DEFINE_CONFIGURABLE(cfgZVtxCut, float, 10.0f, "Accepted z-vertex range") O2_DEFINE_CONFIGURABLE(cfgPtCutMin, float, 0.2f, "minimum accepted track pT") O2_DEFINE_CONFIGURABLE(cfgPtCutMax, float, 10.0f, "maximum accepted track pT") @@ -93,18 +98,28 @@ struct CorrSparse { O2_DEFINE_CONFIGURABLE(cfgMinMixEventNum, int, 5, "Minimum number of events to mix") O2_DEFINE_CONFIGURABLE(cfgMinMult, int, 0, "Minimum multiplicity for collision") O2_DEFINE_CONFIGURABLE(cfgMaxMult, int, 10, "Maximum multiplicity for collision") + O2_DEFINE_CONFIGURABLE(cfgMergingCut, float, 0.0, "Merging cut on track merge") + O2_DEFINE_CONFIGURABLE(cfgRadiusLow, float, 0.8, "Low radius for merging cut") + O2_DEFINE_CONFIGURABLE(cfgRadiusHigh, float, 2.5, "High radius for merging cut") + O2_DEFINE_CONFIGURABLE(etaMftTrackMin, float, -5.0, "Minimum eta for MFT track") + O2_DEFINE_CONFIGURABLE(etaMftTrackMax, float, 0.0, "Maximum eta for MFT track") + O2_DEFINE_CONFIGURABLE(nClustersMftTrack, int, 5, "Minimum number of clusters for MFT track") + O2_DEFINE_CONFIGURABLE(cfgSampleSize, double, 10, "Sample size for mixed event") + + Configurable processMFT{"processMFT", true, "Associate particle from MFT"}; ConfigurableAxis axisVertex{"axisVertex", {10, -10, 10}, "vertex axis for histograms"}; ConfigurableAxis axisEta{"axisEta", {40, -1., 1.}, "eta axis for histograms"}; ConfigurableAxis axisPhi{"axisPhi", {72, 0.0, constants::math::TwoPI}, "phi axis for histograms"}; ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt axis for histograms"}; ConfigurableAxis axisDeltaPhi{"axisDeltaPhi", {72, -PIHalf, PIHalf * 3}, "delta phi axis for histograms"}; - ConfigurableAxis axisDeltaEta{"axisDeltaEta", {40, -2, 2}, "delta eta axis for histograms"}; + ConfigurableAxis axisDeltaEta{"axisDeltaEta", {48, -2.4, 2.4}, "delta eta axis for histograms"}; ConfigurableAxis axisPtTrigger{"axisPtTrigger", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt trigger axis for histograms"}; ConfigurableAxis axisPtAssoc{"axisPtAssoc", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt associated axis for histograms"}; ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100}, "multiplicity / centrality axis for histograms"}; ConfigurableAxis vtxMix{"vtxMix", {VARIABLE_WIDTH, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "vertex axis for mixed event histograms"}; ConfigurableAxis multMix{"multMix", {VARIABLE_WIDTH, 0, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100}, "multiplicity / centrality axis for mixed event histograms"}; + ConfigurableAxis axisSample{"axisSample", {cfgSampleSize, 0, cfgSampleSize}, "sample axis for histograms"}; ConfigurableAxis axisVertexEfficiency{"axisVertexEfficiency", {10, -10, 10}, "vertex axis for efficiency histograms"}; ConfigurableAxis axisEtaEfficiency{"axisEtaEfficiency", {20, -1.0, 1.0}, "eta axis for efficiency histograms"}; @@ -114,18 +129,26 @@ struct CorrSparse { Filter collisionFilter = (nabs(aod::collision::posZ) < cfgZVtxCut) && (aod::corrsparse::multiplicity) > cfgMinMult && (aod::corrsparse::multiplicity) < cfgMaxMult && (aod::evsel::sel8) == true; Filter trackFilter = (nabs(aod::track::eta) < cfgEtaCut) && (aod::track::pt > cfgPtCutMin) && (aod::track::pt < cfgPtCutMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)); - using AodCollisions = soa::Filtered>; // aod::CentFT0Cs - using AodTracks = soa::Filtered>; - // Define the outputs OutputObj same{Form("sameEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult))}; OutputObj mixed{Form("mixedEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult))}; HistogramRegistry registry{"registry"}; + using AodCollisions = soa::Filtered>; // aod::CentFT0Cs + using AodTracks = soa::Filtered>; + void init(InitContext&) { + ccdb->setURL("http://alice-ccdb.cern.ch"); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + + auto now = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); + ccdb->setCreatedNotAfter(now); + LOGF(info, "Starting init"); + // Make histograms to check the distributions after cuts registry.add("deltaEta_deltaPhi_same", "", {HistType::kTH2D, {axisDeltaPhi, axisDeltaEta}}); // check to see the delta eta and delta phi distribution registry.add("deltaEta_deltaPhi_mixed", "", {HistType::kTH2D, {axisDeltaPhi, axisDeltaEta}}); @@ -139,7 +162,7 @@ struct CorrSparse { registry.add("eventcount", "bin", {HistType::kTH1F, {{3, 0, 3, "bin"}}}); // histogram to see how many events are in the same and mixed event - std::vector corrAxis = {{axisMultiplicity, "Nch"}, + std::vector corrAxis = {{axisSample, "Sample"}, {axisVertex, "z-vtx (cm)"}, {axisPtTrigger, "p_{T} (GeV/c)"}, {axisPtAssoc, "p_{T} (GeV/c)"}, @@ -160,6 +183,37 @@ struct CorrSparse { MixedEvent = 3 }; + template + bool isAcceptedMftTrack(TTrackAssoc const& mftTrack) + { + // cut on the eta of MFT tracks + if (mftTrack.eta() > etaMftTrackMax || mftTrack.eta() < etaMftTrackMin) { + return false; + } + + // cut on the number of clusters of the reconstructed MFT track + if (mftTrack.nClusters() < nClustersMftTrack) { + return false; + } + + return true; + } + + int getMagneticField(uint64_t timestamp) + { + // Get the magnetic field + static o2::parameters::GRPMagField* grpo = nullptr; + if (grpo == nullptr) { + grpo = ccdb->getForTimeStamp("/GLO/Config/GRPMagField", timestamp); + if (grpo == nullptr) { + LOGF(fatal, "GRP object not found for timestamp %llu", timestamp); + return 0; + } + LOGF(info, "Retrieved GRP for timestamp %llu with magnetic field of %d kG", timestamp, grpo->getNominalL3Field()); + } + return grpo->getNominalL3Field(); + } + // fill multiple histograms template void fillYield(TCollision collision, TTracks tracks) // function to fill the yield and etaphi histograms. @@ -174,9 +228,38 @@ struct CorrSparse { } } - template - void fillCorrelations(TTracks tracks1, TTracks tracks2, float posZ, int system, float Nch) // function to fill the Output functions (sparse) and the delta eta and delta phi histograms + template + float getDPhiStar(TTrack const& track1, TTrackAssoc const& track2, float radius, int magField) + { + float charge1 = track1.sign(); + float charge2 = track2.sign(); + + float phi1 = track1.phi(); + float phi2 = track2.phi(); + + float pt1 = track1.pt(); + float pt2 = track2.pt(); + + int fbSign = (magField > 0) ? 1 : -1; + + float dPhiStar = phi1 - phi2 - charge1 * fbSign * std::asin(0.075 * radius / pt1) + charge2 * fbSign * std::asin(0.075 * radius / pt2); + + if (dPhiStar > constants::math::PI) + dPhiStar = constants::math::TwoPI - dPhiStar; + if (dPhiStar < -constants::math::PI) + dPhiStar = -constants::math::TwoPI - dPhiStar; + + return dPhiStar; + } + + // + template + void fillCorrelations(TTracks tracks1, TTracksAssoc tracks2, float posZ, int system, float Nch, int magneticField) // function to fill the Output functions (sparse) and the delta eta and delta phi histograms { + TRandom3* gRandom = new TRandom3(); + + int fSampleIndex = gRandom->Uniform(0, cfgSampleSize); + // loop over all tracks for (auto const& track1 : tracks1) { @@ -187,47 +270,104 @@ struct CorrSparse { for (auto const& track2 : tracks2) { if (track1.pt() <= track2.pt()) - continue; // skip if the trigger pt is less than the associate p + continue; // skip if the trigger pt is less than the associate pt + + if (processMFT) { + if constexpr (std::is_same_v) { + if (!isAcceptedMftTrack(track2)) { + continue; + } + } + } float deltaPhi = RecoDecay::constrainAngle(track1.phi() - track2.phi(), -PIHalf); float deltaEta = track1.eta() - track2.eta(); + if (std::abs(deltaEta) < cfgMergingCut) { + + double dPhiStarHigh = getDPhiStar(track1, track2, cfgRadiusHigh, magneticField); + double dPhiStarLow = getDPhiStar(track1, track2, cfgRadiusLow, magneticField); + + const double kLimit = 3.0 * cfgMergingCut; + + bool bIsBelow = kFALSE; + + if (std::abs(dPhiStarLow) < kLimit || std::abs(dPhiStarHigh) < kLimit || dPhiStarLow * dPhiStarHigh < 0) { + for (double rad(cfgRadiusLow); rad < cfgRadiusHigh; rad += 0.01) { + double dPhiStar = getDPhiStar(track1, track2, rad, magneticField); + if (std::abs(dPhiStar) < kLimit) { + bIsBelow = kTRUE; + break; + } + } + if (bIsBelow) + continue; + } + } + // fill the right sparse and histograms if (system == SameEvent) { - same->getPairHist()->Fill(step, Nch, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta); + + same->getPairHist()->Fill(step, fSampleIndex, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta); registry.fill(HIST("deltaEta_deltaPhi_same"), deltaPhi, deltaEta); } else if (system == MixedEvent) { - mixed->getPairHist()->Fill(step, Nch, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta); + + mixed->getPairHist()->Fill(step, fSampleIndex, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta); registry.fill(HIST("deltaEta_deltaPhi_mixed"), deltaPhi, deltaEta); } } } } - void processSame(AodCollisions::iterator const& collision, AodTracks const& tracks) + void processSame(AodCollisions::iterator const& collision, AodTracks const& tracks, aod::MFTTracks const& mfts, aod::BCsWithTimestamps const&) { + auto bc = collision.bc_as(); + registry.fill(HIST("eventcount"), SameEvent); // because its same event i put it in the 1 bin fillYield(collision, tracks); - fillCorrelations(tracks, tracks, collision.posZ(), SameEvent, tracks.size()); // fill the SE histogram and Sparse + + if (processMFT) { + + fillCorrelations(tracks, mfts, collision.posZ(), SameEvent, tracks.size(), getMagneticField(bc.timestamp())); + + } else { + + fillCorrelations(tracks, tracks, collision.posZ(), SameEvent, tracks.size(), getMagneticField(bc.timestamp())); + } } PROCESS_SWITCH(CorrSparse, processSame, "Process same event", true); // event mixing - SliceCache cache; using MixedBinning = ColumnBinningPolicy; // the process for filling the mixed events - void processMixed(AodCollisions const& collisions, AodTracks const& tracks) + void processMixed(AodCollisions const& collisions, AodTracks const& tracks, aod::MFTTracks const& MFTtracks, aod::BCsWithTimestamps const&) { - MixedBinning binningOnVtxAndMult{{vtxMix, multMix}, true}; // true is for 'ignore overflows' (true by default) - auto tracksTuple = std::make_tuple(tracks); - SameKindPair pairs{binningOnVtxAndMult, cfgMinMixEventNum, -1, collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip - for (auto const& [collision1, tracks1, collision2, tracks2] : pairs) { - registry.fill(HIST("eventcount"), MixedEvent); // fill the mixed event in the 3 bin - fillCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent, tracks1.size()); + if (processMFT) { + MixedBinning binningOnVtxAndMult{{vtxMix, multMix}, true}; // true is for 'ignore overflows' (true by default) + auto tracksTuple = std::make_tuple(tracks, MFTtracks); + SameKindPair pairs{binningOnVtxAndMult, cfgMinMixEventNum, -1, collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip + + for (auto const& [collision1, tracks1, collision2, tracks2] : pairs) { + registry.fill(HIST("eventcount"), MixedEvent); // fill the mixed event in the 3 bin + auto bc = collision1.bc_as(); + + fillCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent, tracks1.size(), getMagneticField(bc.timestamp())); + } + } else { + MixedBinning binningOnVtxAndMult{{vtxMix, multMix}, true}; // true is for 'ignore overflows' (true by default) + auto tracksTuple = std::make_tuple(tracks, tracks); + SameKindPair pairs{binningOnVtxAndMult, cfgMinMixEventNum, -1, collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip + + for (auto const& [collision1, tracks1, collision2, tracks2] : pairs) { + registry.fill(HIST("eventcount"), MixedEvent); // fill the mixed event in the 3 bin + auto bc = collision1.bc_as(); + + fillCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent, tracks1.size(), getMagneticField(bc.timestamp())); + } } } PROCESS_SWITCH(CorrSparse, processMixed, "Process mixed events", true); From 4b39afbb67d3f7002eb2da89ccbd7f2811468bfe Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Mon, 17 Mar 2025 05:32:01 +0800 Subject: [PATCH 0714/1650] [PWGCF] put track density parameters in configurables (#10522) --- PWGCF/Flow/Tasks/flowQa.cxx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowQa.cxx b/PWGCF/Flow/Tasks/flowQa.cxx index 53ec6673643..1eaa6d8437d 100644 --- a/PWGCF/Flow/Tasks/flowQa.cxx +++ b/PWGCF/Flow/Tasks/flowQa.cxx @@ -100,6 +100,8 @@ struct FlowQa { Configurable> cfgUserDefineGFWCorr{"cfgUserDefineGFWCorr", std::vector{"refN02 {2} refP02 {-2}", "refN12 {2} refP12 {-2}"}, "User defined GFW CorrelatorConfig"}; Configurable> cfgUserDefineGFWName{"cfgUserDefineGFWName", std::vector{"Ch02Gap22", "Ch12Gap22"}, "User defined GFW Name"}; Configurable> cfgRunRemoveList{"cfgRunRemoveList", std::vector{-1}, "excluded run numbers"}; + Configurable> cfgTrackDensityP0{"cfgTrackDensityP0", std::vector{0.6003720411, 0.6152630970, 0.6288860646, 0.6360694031, 0.6409494798, 0.6450540203, 0.6482117301, 0.6512592056, 0.6640008690, 0.6862631416, 0.7005738691, 0.7106567432, 0.7170728333}, "parameter 0 for track density efficiency correction"}; + Configurable> cfgTrackDensityP1{"cfgTrackDensityP1", std::vector{-1.007592e-05, -8.932635e-06, -9.114538e-06, -1.054818e-05, -1.220212e-05, -1.312304e-05, -1.376433e-05, -1.412813e-05, -1.289562e-05, -1.050065e-05, -8.635725e-06, -7.380821e-06, -6.201250e-06}, "parameter 1 for track density efficiency correction"}; ConfigurableAxis axisPtHist{"axisPtHist", {100, 0., 10.}, "pt axis for histograms"}; ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.2, 2.4, 2.6, 2.8, 3, 3.5, 4, 5, 6, 8, 10}, "pt axis for histograms"}; @@ -370,8 +372,8 @@ struct FlowQa { hFindPtBin = new TH1D("hFindPtBin", "hFindPtBin", pTEffBins.size() - 1, &pTEffBins[0]); funcEff.resize(pTEffBins.size() - 1); // LHC24g3 Eff - std::vector f1p0 = {0.7217476707, 0.7384792571, 0.7542625668, 0.7640680200, 0.7701951667, 0.7755299053, 0.7805901710, 0.7849446786, 0.7957356586, 0.8113039262, 0.8211968966, 0.8280558878, 0.8329342135}; - std::vector f1p1 = {-2.169488e-05, -2.191913e-05, -2.295484e-05, -2.556538e-05, -2.754463e-05, -2.816832e-05, -2.846502e-05, -2.843857e-05, -2.705974e-05, -2.477018e-05, -2.321730e-05, -2.203315e-05, -2.109474e-05}; + std::vector f1p0 = cfgTrackDensityP0; + std::vector f1p1 = cfgTrackDensityP1; for (uint ifunc = 0; ifunc < pTEffBins.size() - 1; ifunc++) { funcEff[ifunc] = new TF1(Form("funcEff%i", ifunc), "[0]+[1]*x", 0, 3000); funcEff[ifunc]->SetParameters(f1p0[ifunc], f1p1[ifunc] * cfgTrackDensityCorrSlopeFactor); From 96b867d5e7e57115c807dd086c697895d0a4aba7 Mon Sep 17 00:00:00 2001 From: Swati <69241911+SwatiSaha-1997@users.noreply.github.com> Date: Mon, 17 Mar 2025 03:13:04 +0530 Subject: [PATCH 0715/1650] [PWGCF] Track to collision association (#10524) --- .../Tasks/antiprotonCumulantsMc.cxx | 21 +++++++++++++++++++ .../Tasks/netprotonCumulantsMc.cxx | 19 +++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/PWGCF/EbyEFluctuations/Tasks/antiprotonCumulantsMc.cxx b/PWGCF/EbyEFluctuations/Tasks/antiprotonCumulantsMc.cxx index 918f794fb65..7980ff63ed4 100644 --- a/PWGCF/EbyEFluctuations/Tasks/antiprotonCumulantsMc.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/antiprotonCumulantsMc.cxx @@ -990,6 +990,11 @@ struct AntiprotonCumulantsMc { float nAntiprot = 0.0; for (const auto& mcParticle : mcParticles) { + if (!mcParticle.has_mcCollision()) + continue; + if (!(mcParticle.mcCollision().globalIndex() == mcCollision.globalIndex())) + continue; + if (mcParticle.isPhysicalPrimary()) { if ((mcParticle.pt() > cfgCutPtLower) && (mcParticle.pt() < 5.0f) && (std::abs(mcParticle.eta()) < cfgCutEta)) { histos.fill(HIST("hgenPtAll"), mcParticle.pt()); @@ -1096,6 +1101,13 @@ struct AntiprotonCumulantsMc { // Start of the Monte-Carlo reconstructed tracks for (const auto& track : tracks) { + if (!track.has_collision()) { + continue; + } + if (!(track.collision().globalIndex() == collision.globalIndex())) { + continue; + } + if (!track.has_mcParticle()) //! check if track has corresponding MC particle { continue; @@ -1106,6 +1118,9 @@ struct AntiprotonCumulantsMc { } auto particle = track.mcParticle(); + if (!particle.has_mcCollision()) + continue; + if ((particle.pt() < cfgCutPtLower) || (particle.pt() > 5.0f) || (std::abs(particle.eta()) > cfgCutEta)) { continue; } @@ -2037,6 +2052,12 @@ struct AntiprotonCumulantsMc { // Start of the Monte-Carlo reconstructed tracks for (const auto& track : inputTracks) { + if (!track.has_collision()) { + continue; + } + if (!(track.collision().globalIndex() == coll.globalIndex())) { + continue; + } if (!track.isPVContributor()) //! track check as used in data { continue; diff --git a/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx b/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx index 99b775a0203..020e80e5bc2 100644 --- a/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx @@ -990,6 +990,11 @@ struct NetprotonCumulantsMc { float nAntiprot = 0.0; for (const auto& mcParticle : mcParticles) { + if (!mcParticle.has_mcCollision()) + continue; + if (!(mcParticle.mcCollision().globalIndex() == mcCollision.globalIndex())) + continue; + if (mcParticle.isPhysicalPrimary()) { if ((mcParticle.pt() > cfgCutPtLower) && (mcParticle.pt() < 5.0f) && (std::abs(mcParticle.eta()) < cfgCutEta)) { histos.fill(HIST("hgenPtAll"), mcParticle.pt()); @@ -1096,6 +1101,12 @@ struct NetprotonCumulantsMc { // Start of the Monte-Carlo reconstructed tracks for (const auto& track : tracks) { + if (!track.has_collision()) { + continue; + } + if (!(track.collision().globalIndex() == collision.globalIndex())) { + continue; + } if (!track.has_mcParticle()) //! check if track has corresponding MC particle { continue; @@ -1106,6 +1117,8 @@ struct NetprotonCumulantsMc { } auto particle = track.mcParticle(); + if (!particle.has_mcCollision()) + continue; if ((particle.pt() < cfgCutPtLower) || (particle.pt() > 5.0f) || (std::abs(particle.eta()) > cfgCutEta)) { continue; } @@ -2037,6 +2050,12 @@ struct NetprotonCumulantsMc { // Start of the Monte-Carlo reconstructed tracks for (const auto& track : inputTracks) { + if (!track.has_collision()) { + continue; + } + if (!(track.collision().globalIndex() == coll.globalIndex())) { + continue; + } if (!track.isPVContributor()) //! track check as used in data { continue; From 9280692106cc8e496e9e229a400225633adc1270 Mon Sep 17 00:00:00 2001 From: nzardosh Date: Sun, 16 Mar 2025 23:09:35 +0100 Subject: [PATCH 0716/1650] [PWGJE] fixing boolean in filter (#10525) --- PWGJE/JetFinders/jetFinder.cxx | 4 ++-- PWGJE/JetFinders/jetFinderHF.cxx | 4 ++-- PWGJE/JetFinders/jetFinderV0.cxx | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/PWGJE/JetFinders/jetFinder.cxx b/PWGJE/JetFinders/jetFinder.cxx index c2a63538bf2..4482509804b 100644 --- a/PWGJE/JetFinders/jetFinder.cxx +++ b/PWGJE/JetFinders/jetFinder.cxx @@ -143,8 +143,8 @@ struct JetFinderTask { } aod::EMCALClusterDefinition clusterDefinition = aod::emcalcluster::getClusterDefinitionFromString(clusterDefinitionS.value); - Filter collisionFilter = (nabs(aod::jcollision::posZ) < vertexZCut && aod::jcollision::centrality >= centralityMin && aod::jcollision::centrality < centralityMax && aod::jcollision::trackOccupancyInTimeRange <= trackOccupancyInTimeRangeMax && (!skipMBGapEvents || aod::jcollision::subGeneratorId != static_cast(jetderiveddatautilities::JCollisionSubGeneratorId::mbGap))); - Filter mcCollisionFilter = (!skipMBGapEvents || aod::jmccollision::subGeneratorId != static_cast(jetderiveddatautilities::JCollisionSubGeneratorId::mbGap)); // should we add a posZ vtx cut here or leave it to analysers? + Filter collisionFilter = (nabs(aod::jcollision::posZ) < vertexZCut && aod::jcollision::centrality >= centralityMin && aod::jcollision::centrality < centralityMax && aod::jcollision::trackOccupancyInTimeRange <= trackOccupancyInTimeRangeMax && ((skipMBGapEvents.node() == false) || (aod::jcollision::subGeneratorId != static_cast(jetderiveddatautilities::JCollisionSubGeneratorId::mbGap)))); + Filter mcCollisionFilter = ((skipMBGapEvents.node() == false) || (aod::jmccollision::subGeneratorId != static_cast(jetderiveddatautilities::JCollisionSubGeneratorId::mbGap))); // should we add a posZ vtx cut here or leave it to analysers? Filter trackCuts = (aod::jtrack::pt >= trackPtMin && aod::jtrack::pt < trackPtMax && aod::jtrack::eta >= trackEtaMin && aod::jtrack::eta <= trackEtaMax && aod::jtrack::phi >= trackPhiMin && aod::jtrack::phi <= trackPhiMax); // do we need eta cut both here and in globalselection? Filter partCuts = (aod::jmcparticle::pt >= trackPtMin && aod::jmcparticle::pt < trackPtMax && aod::jmcparticle::eta >= trackEtaMin && aod::jmcparticle::eta <= trackEtaMax && aod::jmcparticle::phi >= trackPhiMin && aod::jmcparticle::phi <= trackPhiMax); Filter clusterFilter = (aod::jcluster::definition == static_cast(clusterDefinition) && aod::jcluster::eta >= clusterEtaMin && aod::jcluster::eta <= clusterEtaMax && aod::jcluster::phi >= clusterPhiMin && aod::jcluster::phi <= clusterPhiMax && aod::jcluster::energy >= clusterEnergyMin && aod::jcluster::time > clusterTimeMin && aod::jcluster::time < clusterTimeMax && (clusterRejectExotics && aod::jcluster::isExotic != true)); diff --git a/PWGJE/JetFinders/jetFinderHF.cxx b/PWGJE/JetFinders/jetFinderHF.cxx index 55590bc2f11..0b8fc666607 100644 --- a/PWGJE/JetFinders/jetFinderHF.cxx +++ b/PWGJE/JetFinders/jetFinderHF.cxx @@ -153,8 +153,8 @@ struct JetFinderHFTask { } aod::EMCALClusterDefinition clusterDefinition = aod::emcalcluster::getClusterDefinitionFromString(clusterDefinitionS.value); - Filter collisionFilter = (nabs(aod::jcollision::posZ) < vertexZCut && aod::jcollision::centrality >= centralityMin && aod::jcollision::centrality < centralityMax && aod::jcollision::trackOccupancyInTimeRange <= trackOccupancyInTimeRangeMax && (!skipMBGapEvents || aod::jcollision::subGeneratorId != static_cast(jetderiveddatautilities::JCollisionSubGeneratorId::mbGap))); - Filter mcCollisionFilter = (!skipMBGapEvents || aod::jmccollision::subGeneratorId != static_cast(jetderiveddatautilities::JCollisionSubGeneratorId::mbGap)); // should we add a posZ vtx cut here or leave it to analysers? + Filter collisionFilter = (nabs(aod::jcollision::posZ) < vertexZCut && aod::jcollision::centrality >= centralityMin && aod::jcollision::centrality < centralityMax && aod::jcollision::trackOccupancyInTimeRange <= trackOccupancyInTimeRangeMax && ((skipMBGapEvents.node() == false) || (aod::jcollision::subGeneratorId != static_cast(jetderiveddatautilities::JCollisionSubGeneratorId::mbGap)))); + Filter mcCollisionFilter = ((skipMBGapEvents.node() == false) || (aod::jmccollision::subGeneratorId != static_cast(jetderiveddatautilities::JCollisionSubGeneratorId::mbGap))); // should we add a posZ vtx cut here or leave it to analysers? Filter trackCuts = (aod::jtrack::pt >= trackPtMin && aod::jtrack::pt < trackPtMax && aod::jtrack::eta >= trackEtaMin && aod::jtrack::eta <= trackEtaMax && aod::jtrack::phi >= trackPhiMin && aod::jtrack::phi <= trackPhiMax); Filter partCuts = (aod::jmcparticle::pt >= trackPtMin && aod::jmcparticle::pt < trackPtMax && aod::jmcparticle::eta >= trackEtaMin && aod::jmcparticle::eta <= trackEtaMax && aod::jmcparticle::phi >= trackPhiMin && aod::jmcparticle::phi <= trackPhiMax); Filter clusterFilter = (aod::jcluster::definition == static_cast(clusterDefinition) && aod::jcluster::eta >= clusterEtaMin && aod::jcluster::eta <= clusterEtaMax && aod::jcluster::phi >= clusterPhiMin && aod::jcluster::phi <= clusterPhiMax && aod::jcluster::energy >= clusterEnergyMin && aod::jcluster::time > clusterTimeMin && aod::jcluster::time < clusterTimeMax && (clusterRejectExotics && aod::jcluster::isExotic != true)); diff --git a/PWGJE/JetFinders/jetFinderV0.cxx b/PWGJE/JetFinders/jetFinderV0.cxx index 62b03b83129..60c1f63bef4 100644 --- a/PWGJE/JetFinders/jetFinderV0.cxx +++ b/PWGJE/JetFinders/jetFinderV0.cxx @@ -144,8 +144,8 @@ struct JetFinderV0Task { registry.add("hJetMCP", "sparse for mcp jets", {HistType::kTHnC, {{jetRadiiBins, ""}, {jetPtBinNumber, jetPtMinDouble, jetPtMaxDouble}, {40, -1.0, 1.0}, {18, 0.0, 7.0}}}); } - Filter collisionFilter = (nabs(aod::jcollision::posZ) < vertexZCut && aod::jcollision::centrality >= centralityMin && aod::jcollision::centrality < centralityMax && aod::jcollision::trackOccupancyInTimeRange <= trackOccupancyInTimeRangeMax && (!skipMBGapEvents || aod::jcollision::subGeneratorId != static_cast(jetderiveddatautilities::JCollisionSubGeneratorId::mbGap))); - Filter mcCollisionFilter = (!skipMBGapEvents || aod::jmccollision::subGeneratorId != static_cast(jetderiveddatautilities::JCollisionSubGeneratorId::mbGap)); // should we add a posZ vtx cut here or leave it to analysers? + Filter collisionFilter = (nabs(aod::jcollision::posZ) < vertexZCut && aod::jcollision::centrality >= centralityMin && aod::jcollision::centrality < centralityMax && aod::jcollision::trackOccupancyInTimeRange <= trackOccupancyInTimeRangeMax && ((skipMBGapEvents.node() == false) || (aod::jcollision::subGeneratorId != static_cast(jetderiveddatautilities::JCollisionSubGeneratorId::mbGap)))); + Filter mcCollisionFilter = ((skipMBGapEvents.node() == false) || (aod::jmccollision::subGeneratorId != static_cast(jetderiveddatautilities::JCollisionSubGeneratorId::mbGap))); // should we add a posZ vtx cut here or leave it to analysers? Filter trackCuts = (aod::jtrack::pt >= trackPtMin && aod::jtrack::pt < trackPtMax && aod::jtrack::eta >= trackEtaMin && aod::jtrack::eta <= trackEtaMax && aod::jtrack::phi >= trackPhiMin && aod::jtrack::phi <= trackPhiMax); Filter partCuts = (aod::jmcparticle::pt >= trackPtMin && aod::jmcparticle::pt < trackPtMax && aod::jmcparticle::eta >= trackEtaMin && aod::jmcparticle::eta <= trackEtaMax && aod::jmcparticle::phi >= trackPhiMin && aod::jmcparticle::phi <= trackPhiMax); // Filter candidateCuts = (aod::hfcand::pt >= candPtMin && aod::hfcand::pt < candPtMax && aod::hfcand::y >= candYMin && aod::hfcand::y < candYMax); From 613d48196e8e397871d9840e96d282e6da7bb8b3 Mon Sep 17 00:00:00 2001 From: Ionut Cristian Arsene Date: Mon, 17 Mar 2025 00:32:38 +0100 Subject: [PATCH 0717/1650] =?UTF-8?q?[PWGDQ]=20fix=20bug=20for=20MCmatched?= =?UTF-8?q?=20histogram=20groups=20in=20dilepton-track=20task;=20adding?= =?UTF-8?q?=E2=80=A6=20(#10529)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ionut Cristian Arsene Co-authored-by: ALICE Action Bot --- PWGDQ/Core/MCSignalLibrary.cxx | 46 ++++++++++++++++++ PWGDQ/Tasks/dqEfficiency_withAssoc.cxx | 65 ++++++++++++++++++++++---- 2 files changed, 101 insertions(+), 10 deletions(-) diff --git a/PWGDQ/Core/MCSignalLibrary.cxx b/PWGDQ/Core/MCSignalLibrary.cxx index 1778d4ceadc..4cf7100d86d 100644 --- a/PWGDQ/Core/MCSignalLibrary.cxx +++ b/PWGDQ/Core/MCSignalLibrary.cxx @@ -1144,6 +1144,33 @@ MCSignal* o2::aod::dqmcsignals::GetMCSignal(const char* name) return signal; } + if (!nameStr.compare("kaonFromBplusHistory")) { + MCProng prong(1, {321}, {true}, {false}, {0}, {0}, {false}, false, {521}, {false}); + signal = new MCSignal(name, "Kaons from B+ decays", {prong}, {-1}); + return signal; + } + + if (!nameStr.compare("kaonPrimaryFromBplusHistory")) { + MCProng prong(1, {321}, {true}, {false}, {0}, {0}, {false}, false, {521}, {false}); + prong.SetSourceBit(0, MCProng::kPhysicalPrimary); + signal = new MCSignal(name, "Kaons from B+ decays", {prong}, {-1}); + return signal; + } + + if (!nameStr.compare("kaonPrimaryFromBplusFS")) { + MCProng prong(2, {321, 521}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); + prong.SetSourceBit(0, MCProng::kPhysicalPrimary); + prong.SetSourceBit(1, MCProng::kHEPMCFinalState); + signal = new MCSignal(name, "Kaons from B+ decays", {prong}, {-1}); + return signal; + } + + if (!nameStr.compare("kaonFromAnyBHistory")) { + MCProng prong(1, {321}, {true}, {false}, {0}, {0}, {false}, false, {503}, {false}); + signal = new MCSignal(name, "Kaons from B+ decays", {prong}, {-1}); + return signal; + } + if (!nameStr.compare("JpsiFromBplus")) { MCProng prong(2, {443, 521}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); signal = new MCSignal(name, "Jpsi from B+ decays", {prong}, {1}); @@ -1156,6 +1183,18 @@ MCSignal* o2::aod::dqmcsignals::GetMCSignal(const char* name) return signal; } + if (!nameStr.compare("electronFromJpsiFromBplus")) { + MCProng prong(3, {11, 443, 521}, {false, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}); + signal = new MCSignal(name, "Electrons from Jpsi from B+ decays", {prong}, {1}); + return signal; + } + + if (!nameStr.compare("positronFromJpsiFromBplus")) { + MCProng prong(3, {-11, 443, 521}, {false, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}); + signal = new MCSignal(name, "Positrons from Jpsi from B+ decays", {prong}, {1}); + return signal; + } + if (!nameStr.compare("eeFromJpsiFromBplus")) { MCProng prong(3, {11, 443, 521}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}); signal = new MCSignal(name, "Electron pair from Jpsi from B+ decays", {prong, prong}, {1, 1}); @@ -1169,6 +1208,13 @@ MCSignal* o2::aod::dqmcsignals::GetMCSignal(const char* name) return signal; } + if (!nameStr.compare("eeFromJpsiKaonAny")) { + MCProng pronge(2, {11, 443}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); + MCProng prongKaon(1, {321}, {true}, {false}, {0}, {0}, {false}); + signal = new MCSignal(name, "Kaon and electron pair", {pronge, pronge, prongKaon}, {-1, -1, -1}); + return signal; + } + if (!nameStr.compare("eeKaonFromBplusExclusive")) { MCProng pronge(3, {11, 443, 521}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}); MCProng prongKaon(2, {321, 521}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); diff --git a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx index 139442814a5..99f508a8b1e 100644 --- a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx +++ b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx @@ -3118,6 +3118,13 @@ struct AnalysisDileptonTrack { Configurable fConfigMCGenSignals{"cfgMCGenSignals", "", "Comma separated list of MC signals (generated)"}; Configurable fConfigMCRecSignalsJSON{"cfgMCRecSignalsJSON", "", "Additional list of MC signals (reconstructed) via JSON"}; Configurable fConfigMCGenSignalsJSON{"cfgMCGenSignalsJSON", "", "Comma separated list of MC signals (generated) via JSON"}; + Configurable fConfigMCGenSignalDileptonLegPos{"cfgMCGenSignalDileptonLegPos", 0, "generator level positive dilepton leg signal (bit number according to table-maker)"}; + Configurable fConfigMCGenSignalDileptonLegNeg{"cfgMCGenSignalDileptonLegNeg", 0, "generator level negative dilepton leg signal (bit number according to table-maker)"}; + Configurable fConfigMCGenSignalHadron{"cfgMCGenSignalHadron", 0, "generator level associated hadron signal (bit number according to table-maker)"}; + Configurable fConfigMCGenDileptonLegPtMin{"cfgMCGenDileptonLegPtMin", 1.0f, "minimum pt for the dilepton leg"}; + Configurable fConfigMCGenHadronPtMin{"cfgMCGenHadronPtMin", 1.0f, "minimum pt for the hadron"}; + Configurable fConfigMCGenDileptonLegEtaAbs{"cfgMCGenDileptonLegEtaAbs", 0.9f, "eta abs range for the dilepton leg"}; + Configurable fConfigMCGenHadronEtaAbs{"cfgMCGenHadronEtaAbs", 0.9f, "eta abs range for the hadron"}; int fCurrentRun; // needed to detect if the run changed and trigger update of calibrations etc. int fNCuts; @@ -3401,6 +3408,7 @@ struct AnalysisDileptonTrack { DefineHistograms(fHistMan, Form("MCTruthGen_%s", sig->GetName()), ""); DefineHistograms(fHistMan, Form("MCTruthGenSel_%s", sig->GetName()), ""); } + DefineHistograms(fHistMan, "MCTruthGenAccepted", ""); } TString addHistsStr = fConfigAddJSONHistograms.value; @@ -3592,7 +3600,7 @@ struct AnalysisDileptonTrack { fHistMan->FillHistClass(Form("DileptonTrack_%s_%s", fTrackCutNames[icut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); for (uint32_t isig = 0; isig < fRecMCSignals.size(); isig++) { if (mcDecision & (uint32_t(1) << isig)) { - fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s", fTrackCutNames[icut].Data(), fTrackCutNames[iTrackCut].Data(), fRecMCSignals[isig]->GetName()), fValuesHadron); + fHistMan->FillHistClass(Form("DileptonTrackMCMatched_%s_%s_%s", fTrackCutNames[icut].Data(), fTrackCutNames[iTrackCut].Data(), fRecMCSignals[isig]->GetName()), fValuesHadron); } } @@ -3602,7 +3610,7 @@ struct AnalysisDileptonTrack { fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); for (uint32_t isig = 0; isig < fRecMCSignals.size(); isig++) { if (mcDecision & (uint32_t(1) << isig)) { - fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fTrackCutNames[iTrackCut].Data(), fRecMCSignals[isig]->GetName()), fValuesHadron); + fHistMan->FillHistClass(Form("DileptonTrackMCMatched_%s_%s_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fTrackCutNames[iTrackCut].Data(), fRecMCSignals[isig]->GetName()), fValuesHadron); } } } @@ -3612,7 +3620,7 @@ struct AnalysisDileptonTrack { fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s", fTrackCutNames[icut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); for (uint32_t isig = 0; isig < fRecMCSignals.size(); isig++) { if (mcDecision & (uint32_t(1) << isig)) { - fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s_%s", fTrackCutNames[icut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data(), fRecMCSignals[isig]->GetName()), fValuesHadron); + fHistMan->FillHistClass(Form("DileptonTrackMCMatched_%s_%s_%s_%s", fTrackCutNames[icut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data(), fRecMCSignals[isig]->GetName()), fValuesHadron); } } for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; iCommonCut++) { @@ -3620,7 +3628,7 @@ struct AnalysisDileptonTrack { fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); for (uint32_t isig = 0; isig < fRecMCSignals.size(); isig++) { if (mcDecision & (uint32_t(1) << isig)) { - fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data(), fRecMCSignals[isig]->GetName()), fValuesHadron); + fHistMan->FillHistClass(Form("DileptonTrackMCMatched_%s_%s_%s_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data(), fRecMCSignals[isig]->GetName()), fValuesHadron); } } } @@ -3719,10 +3727,12 @@ struct AnalysisDileptonTrack { // auto groupedMCTracks = tracksMC.sliceBy(aod::reducedtrackMC::reducedMCeventId, event.reducedMCevent().globalIndex()); for (auto& mctrack : mcTracks) { - /*if ((std::abs(mctrack.pdgCode())>400 && std::abs(mctrack.pdgCode())<599) || - (std::abs(mctrack.pdgCode())>4000 && std::abs(mctrack.pdgCode())<5999) || - std::abs(mctrack.pdgCode())>5999) { - cout << ">>>>>>>>>>>>>>>>>>>>>>> track idx / pdg: " << mctrack.globalIndex() << " / " << mctrack.pdgCode() << endl; + if ((std::abs(mctrack.pdgCode()) > 400 && std::abs(mctrack.pdgCode()) < 599) || + (std::abs(mctrack.pdgCode()) > 4000 && std::abs(mctrack.pdgCode()) < 5999) || + mctrack.mcReducedFlags() > 0) { + /*cout << ">>>>>>>>>>>>>>>>>>>>>>> track idx / pdg / selections: " << mctrack.globalIndex() << " / " << mctrack.pdgCode() << " / "; + PrintBitMap(mctrack.mcReducedFlags(), 16); + cout << endl; if (mctrack.has_mothers()) { for (auto& m : mctrack.mothersIds()) { if (m < mcTracks.size()) { // protect against bad mother indices @@ -3739,8 +3749,8 @@ struct AnalysisDileptonTrack { cout << "<<<<<< daughter idx / pdg: " << d << " / " << aDaughter.pdgCode() << endl; } } - } - }*/ + }*/ + } VarManager::FillTrackMC(mcTracks, mctrack); // NOTE: Signals are checked here mostly based on the skimmed MC stack, so depending on the requested signal, the stack could be incomplete. @@ -3780,6 +3790,41 @@ struct AnalysisDileptonTrack { } } } + + /*for (auto& [t1, t2, t3] : combinations(groupedMCTracks, groupedMCTracks, groupedMCTracks)) { + + if (! (t1.mcReducedFlags() & (uint16_t(1) << fConfigMCGenSignalDileptonLegPos.value))) { + continue; + } + if (t1.pt() < fConfigMCGenDileptonLegPtMin.value) { + continue; + } + if (std::abs(t1.eta()) > fConfigMCGenDileptonLegEtaAbs.value) { + continue; + } + + if (! (t2.mcReducedFlags() & (uint16_t(1) << fConfigMCGenSignalDileptonLegNeg.value))) { + continue; + } + if (t2.pt() < fConfigMCGenDileptonLegPtMin.value) { + continue; + } + if (std::abs(t2.eta()) > fConfigMCGenDileptonLegEtaAbs.value) { + continue; + } + + if (! (t3.mcReducedFlags() & (uint16_t(1) << fConfigMCGenSignalHadron.value))) { + continue; + } + if (t3.pt() < fConfigMCGenHadronPtMin.value) { + continue; + } + if (std::abs(t3.eta()) > fConfigMCGenHadronEtaAbs.value) { + continue; + } + + fHistMan->FillHistClass("MCTruthGenSelAccepted", VarManager::fgValues); + }*/ } // end loop over reconstructed events } From d94049427a36cb6669122d51efe8e294ef8afc3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Karpi=C5=84ski?= <40724893+davkk@users.noreply.github.com> Date: Mon, 17 Mar 2025 08:48:51 +0100 Subject: [PATCH 0718/1650] [PWGCF/FemtoUniverse] Add `EfficiencyCorrection` class & fix pT binning in `FemtoUniverseParticleHisto` (#10528) --- .../Core/FemtoUniverseEfficiencyCalculator.h | 39 +++-- .../Core/FemtoUniverseEfficiencyCorrection.h | 154 ++++++++++++++++++ .../Core/FemtoUniverseParticleHisto.h | 4 +- ...emtoUniversePairTaskTrackTrackExtended.cxx | 22 +-- 4 files changed, 189 insertions(+), 30 deletions(-) create mode 100644 PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCorrection.h diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCalculator.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCalculator.h index 4c3599de001..186173ba615 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCalculator.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCalculator.h @@ -19,6 +19,7 @@ #include #include #include +#include #include "Framework/Configurable.h" #include "CCDB/BasicCCDBManager.h" @@ -29,7 +30,7 @@ namespace o2::analysis::femto_universe::efficiency { enum ParticleNo : size_t { ONE = 1, - TWO + TWO, }; template @@ -50,8 +51,8 @@ consteval auto getHistDim() -> int struct EfficiencyConfigurableGroup : ConfigurableGroup { Configurable confEfficiencyApplyCorrections{"confEfficiencyApplyCorrections", false, "Should apply corrections from efficiency"}; - Configurable confEfficiencyCCDBTrainNumber{"confEfficiencyCCDBTrainNumber", -1, "Train number for which to query CCDB objects (set to -1 to ignore)"}; - Configurable> confEfficiencyCCDBTimestamps{"confEfficiencyCCDBTimestamps", {}, "Timestamps of efficiency histograms in CCDB, to query for specific objects (default: ['-1', '-1'], gets the latest valid objects for both)"}; + Configurable confEfficiencyCCDBTrainNumber{"confEfficiencyCCDBTrainNumber", 0, "Train number for which to query CCDB objects (set 0 to ignore)"}; + Configurable> confEfficiencyCCDBTimestamps{"confEfficiencyCCDBTimestamps", {}, "Timestamps of efficiency histograms in CCDB, to query for specific objects (default: [], set 0 to ignore, useful when running subwagons)"}; // NOTE: in the future we might move the below configurables to a separate struct, eg. CCDBConfigurableGroup Configurable confCCDBUrl{"confCCDBUrl", "http://alice-ccdb.cern.ch", "CCDB URL to be used"}; @@ -73,17 +74,23 @@ class EfficiencyCalculator ccdb.setLocalObjectValidityChecking(); ccdb.setFatalWhenNull(false); - int64_t now = duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); + auto now = duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); ccdb.setCreatedNotAfter(now); shouldApplyCorrections = config->confEfficiencyApplyCorrections; if (config->confEfficiencyApplyCorrections && !config->confEfficiencyCCDBTimestamps.value.empty()) { - for (const auto& timestamp : config->confEfficiencyCCDBTimestamps.value) { - hLoaded.push_back(loadEfficiencyFromCCDB(std::stol(timestamp))); + for (auto idx = 0UL; idx < config->confEfficiencyCCDBTimestamps.value.size(); idx++) { + auto timestamp = 0L; + try { + timestamp = std::max(0L, std::stol(config->confEfficiencyCCDBTimestamps.value[idx])); + } catch (const std::exception&) { + LOGF(error, notify("Could not parse CCDB timestamp \"%s\""), config->confEfficiencyCCDBTimestamps.value[idx]); + continue; + } + + hLoaded[idx] = timestamp > 0 ? loadEfficiencyFromCCDB(timestamp) : nullptr; } - - LOGF(info, notify("Successfully loaded %d efficiency histogram(s)"), hLoaded.size()); } } @@ -92,15 +99,12 @@ class EfficiencyCalculator auto getWeight(ParticleNo partNo, const BinVars&... binVars) const -> float { auto weight = 1.0f; + auto hEff = hLoaded[partNo - 1]; - if (partNo - 1 < config->confEfficiencyCCDBTimestamps.value.size()) { - auto hEff = hLoaded[partNo - 1]; - - if (shouldApplyCorrections && hEff) { - auto bin = hEff->FindBin(binVars...); - auto eff = hEff->GetBinContent(bin); - weight /= eff > 0 ? eff : 1.0f; - } + if (shouldApplyCorrections && hEff) { + auto bin = hEff->FindBin(binVars...); + auto eff = hEff->GetBinContent(bin); + weight /= eff > 0 ? eff : 1.0f; } return weight; @@ -143,6 +147,7 @@ class EfficiencyCalculator LOGF(warn, notify("Histogram \"%s/%ld\" has been loaded, but it is empty"), config->confCCDBPath.value, timestamp); } + LOGF(info, notify("Successfully loaded %ld"), timestamp); return hEff; } @@ -151,7 +156,7 @@ class EfficiencyCalculator bool shouldApplyCorrections = false; o2::ccdb::BasicCCDBManager& ccdb{o2::ccdb::BasicCCDBManager::instance()}; - std::vector hLoaded{}; + std::array hLoaded{}; }; } // namespace o2::analysis::femto_universe::efficiency diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCorrection.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCorrection.h new file mode 100644 index 00000000000..b866649ab04 --- /dev/null +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCorrection.h @@ -0,0 +1,154 @@ +// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file FemtoUniverseEfficiencyCorrection.h +/// \brief Abstraction for applying efficiency corrections based on weights from CCDB +/// \author Dawid Karpiński, WUT Warsaw, dawid.karpinski@cern.ch + +#ifndef PWGCF_FEMTOUNIVERSE_CORE_FEMTOUNIVERSEEFFICIENCYCORRECTION_H_ +#define PWGCF_FEMTOUNIVERSE_CORE_FEMTOUNIVERSEEFFICIENCYCORRECTION_H_ + +#include +#include +#include + +#include "Framework/Configurable.h" +#include "CCDB/BasicCCDBManager.h" +#include "TH1.h" +#include "TH2.h" +#include "TH3.h" + +namespace o2::analysis::femto_universe::efficiency_correction +{ +enum ParticleNo : size_t { + ONE = 1, + TWO, +}; + +template +concept isOneOrTwo = T == ParticleNo::ONE || T == ParticleNo::TWO; + +template +consteval auto getHistDim() -> int +{ + if (std::is_same_v) + return 1; + else if (std::is_same_v) + return 2; + else if (std::is_same_v) + return 3; + else + return -1; +} + +struct EffCorConfigurableGroup : framework::ConfigurableGroup { + framework::Configurable confEffCorApply{"confEffCorApply", false, "[Efficiency Correction] Should apply efficiency corrections"}; + framework::Configurable confEffCorCCDBUrl{"confEffCorCCDBUrl", "http://alice-ccdb.cern.ch", "[Efficiency Correction] CCDB URL to use"}; + framework::Configurable confEffCorCCDBPath{"confEffCorCCDBPath", "", "[Efficiency Correction] CCDB path to histograms"}; + framework::Configurable> confEffCorCCDBTimestamps{"confEffCorCCDBTimestamps", {}, "[Efficiency Correction] Timestamps of histograms in CCDB (0 can be used as a placeholder, e.g. when running subwagons)"}; +}; + +template + requires std::is_base_of_v +class EfficiencyCorrection +{ + public: + explicit EfficiencyCorrection(EffCorConfigurableGroup* config) : config(config) // o2-linter: disable=name/function-variable + { + } + + auto init() -> void + { + ccdb.setURL(config->confEffCorCCDBUrl); + ccdb.setLocalObjectValidityChecking(); + ccdb.setFatalWhenNull(false); + + auto now = duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); + ccdb.setCreatedNotAfter(now); + + shouldApplyCorrection = config->confEffCorApply; + + if (shouldApplyCorrection && !config->confEffCorCCDBTimestamps.value.empty()) { + for (auto idx = 0UL; idx < config->confEffCorCCDBTimestamps.value.size(); idx++) { + auto timestamp = 0L; + try { + timestamp = std::max(0L, std::stol(config->confEffCorCCDBTimestamps.value[idx])); + } catch (const std::exception&) { + LOGF(error, notify("Could not parse CCDB timestamp \"%s\""), config->confEffCorCCDBTimestamps.value[idx]); + continue; + } + + hLoaded[idx] = timestamp > 0 ? loadHistFromCCDB(timestamp) : nullptr; + } + } + } + + template + requires(sizeof...(BinVars) == getHistDim()) + auto getWeight(ParticleNo partNo, const BinVars&... binVars) const -> float + { + auto weight = 1.0f; + auto hWeights = hLoaded[partNo - 1]; + + if (shouldApplyCorrection && hWeights) { + auto bin = hWeights->FindBin(binVars...); + weight = hWeights->GetBinContent(bin); + } + + return weight; + } + + private: + static inline auto notify(const std::string& msg) -> const std::string + { + return fmt::format("[EFFICIENCY CORRECTION] {}", msg); + } + + static auto isHistEmpty(HistType* hist) -> bool + { + if (!hist) { + return true; + } + for (auto idx = 0; idx <= hist->GetNbinsX() + 1; idx++) { + if (hist->GetBinContent(idx) > 0) { + return false; + } + } + return true; + } + + auto loadHistFromCCDB(const int64_t timestamp) const -> HistType* + { + auto hWeights = ccdb.getForTimeStamp(config->confEffCorCCDBPath, timestamp); + if (!hWeights || hWeights->IsZombie()) { + LOGF(error, notify("Could not load histogram \"%s/%ld\""), config->confEffCorCCDBPath.value, timestamp); + return nullptr; + } + + if (isHistEmpty(hWeights)) { + LOGF(warn, notify("Histogram \"%s/%ld\" has been loaded, but it is empty"), config->confEffCorCCDBUrl.value, timestamp); + } + + LOGF(info, notify("Successfully loaded %ld"), timestamp); + return hWeights; + } + + EffCorConfigurableGroup* config{}; + + bool shouldApplyCorrection = false; + + o2::ccdb::BasicCCDBManager& ccdb{o2::ccdb::BasicCCDBManager::instance()}; + std::array hLoaded{}; +}; + +} // namespace o2::analysis::femto_universe::efficiency_correction + +#endif // PWGCF_FEMTOUNIVERSE_CORE_FEMTOUNIVERSEEFFICIENCYCORRECTION_H_ diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h index 284cba6df83..a2c5dd020db 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h @@ -55,7 +55,7 @@ class FemtoUniverseParticleHisto { std::string folderSuffix = static_cast(o2::aod::femtouniverse_mc_particle::MCTypeName[mc]).c_str(); /// Histograms of the kinematic properties - mHistogramRegistry->add((folderName + folderSuffix + "/hPt").c_str(), "; #it{p}_{T} (GeV/#it{c}); Entries", kTH1F, {{240, 0, 6}}); + mHistogramRegistry->add((folderName + folderSuffix + "/hPt").c_str(), "; #it{p}_{T} (GeV/#it{c}); Entries", kTH1F, {tempFitVarpTAxis}); mHistogramRegistry->add((folderName + folderSuffix + "/hEta").c_str(), "; #eta; Entries", kTH1F, {{200, -1.5, 1.5}}); mHistogramRegistry->add((folderName + folderSuffix + "/hPhi").c_str(), "; #phi; Entries", kTH1F, {{200, 0, o2::constants::math::TwoPI}}); mHistogramRegistry->add((folderName + folderSuffix + "/hPhiEta").c_str(), "; #phi; #eta", kTH2F, {{200, 0, o2::constants::math::TwoPI}, {200, -1.5, 1.5}}); @@ -135,7 +135,7 @@ class FemtoUniverseParticleHisto /// Particle-type specific histograms std::string folderSuffix = static_cast(o2::aod::femtouniverse_mc_particle::MCTypeName[o2::aod::femtouniverse_mc_particle::MCType::kTruth]).c_str(); - mHistogramRegistry->add((folderName + folderSuffix + "/hPt_ReconNoFake").c_str(), "; #it{p}_{T} (GeV/#it{c}); Entries", kTH1F, {{240, 0, 6}}); + mHistogramRegistry->add((folderName + folderSuffix + "/hPt_ReconNoFake").c_str(), "; #it{p}_{T} (GeV/#it{c}); Entries", kTH1F, {tempFitVarpTAxis}); if constexpr (mParticleType == o2::aod::femtouniverseparticle::ParticleType::kTrack || mParticleType == o2::aod::femtouniverseparticle::ParticleType::kV0Child || mParticleType == o2::aod::femtouniverseparticle::ParticleType::kCascadeBachelor || mParticleType == o2::aod::femtouniverseparticle::ParticleType::kMCTruthTrack) { /// Track histograms diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackExtended.cxx index af908d13829..27e865ce552 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackExtended.cxx @@ -33,11 +33,11 @@ #include "PWGCF/FemtoUniverse/Core/FemtoUniverseContainer.h" #include "PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h" #include "PWGCF/FemtoUniverse/Core/FemtoUniverseTrackSelection.h" -#include "PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCalculator.h" +#include "PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCorrection.h" using namespace o2; using namespace o2::analysis::femto_universe; -using namespace o2::analysis::femto_universe::efficiency; +using namespace o2::analysis::femto_universe::efficiency_correction; using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::soa; @@ -177,8 +177,8 @@ struct FemtoUniversePairTaskTrackTrackExtended { HistogramRegistry resultRegistry{"Correlations", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry mixQaRegistry{"mixQaRegistry", {}, OutputObjHandlingPolicy::AnalysisObject}; - EfficiencyConfigurableGroup effConfGroup; - EfficiencyCalculator efficiencyCalculator{&effConfGroup}; + EffCorConfigurableGroup effCorConfGroup; + EfficiencyCorrection effCorrection{&effCorConfGroup}; /// @brief Counter for particle swapping int fNeventsProcessed = 0; @@ -328,7 +328,7 @@ struct FemtoUniversePairTaskTrackTrackExtended { hMCTruth2.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarPDGBins, false, tracktwofilter.confPDGCodePartTwo, false); } } - efficiencyCalculator.init(); + effCorrection.init(); eventHisto.init(&qaRegistry); trackHistoPartOne.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarBins, twotracksconfigs.confIsMC, trackonefilter.confPDGCodePartOne, true); // last true = isDebug @@ -505,9 +505,9 @@ struct FemtoUniversePairTaskTrackTrackExtended { continue; } - float weight = efficiencyCalculator.getWeight(ParticleNo::ONE, p1.pt()); + float weight = effCorrection.getWeight(ParticleNo::ONE, p1.pt()); if (!confIsSame) { - weight *= efficiencyCalculator.getWeight(ParticleNo::TWO, p2.pt()); + weight *= effCorrection.getWeight(ParticleNo::TWO, p2.pt()); } if (swpart) @@ -566,9 +566,9 @@ struct FemtoUniversePairTaskTrackTrackExtended { continue; } - float weight = efficiencyCalculator.getWeight(ParticleNo::ONE, p1.pt()); + float weight = effCorrection.getWeight(ParticleNo::ONE, p1.pt()); if (!confIsSame) { - weight *= efficiencyCalculator.getWeight(ParticleNo::TWO, p2.pt()); + weight *= effCorrection.getWeight(ParticleNo::TWO, p2.pt()); } sameEventCont.setPair(p1, p2, multCol, twotracksconfigs.confUse3D, weight); @@ -674,9 +674,9 @@ struct FemtoUniversePairTaskTrackTrackExtended { } } - float weight = efficiencyCalculator.getWeight(ParticleNo::ONE, p1.pt()); + float weight = effCorrection.getWeight(ParticleNo::ONE, p1.pt()); if (!confIsSame) { - weight *= efficiencyCalculator.getWeight(ParticleNo::TWO, p2.pt()); + weight *= effCorrection.getWeight(ParticleNo::TWO, p2.pt()); } if (swpart) From c012abf886dd12405a75e5cc5bf07113a23af35c Mon Sep 17 00:00:00 2001 From: Chiara Pinto <48326672+chiarapinto@users.noreply.github.com> Date: Mon, 17 Mar 2025 09:41:35 +0100 Subject: [PATCH 0719/1650] [PWGLF] fixing o2linter complaints (#10518) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Nuspex/antinucleiInJets.cxx | 59 ++++++++++++++----------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx index 3c216f3f54b..40e7f7c1be3 100644 --- a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx +++ b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx @@ -469,14 +469,15 @@ struct AntinucleiInJets { // loop over reconstructed jets bool isAtLeastOneJetSelected = false; - for (auto& jet : jets) { // o2-linter: disable=[const-ref-in-for-loop] + for (const auto& jet : jets) { // jet must be fully contained in the acceptance if ((std::fabs(jet.eta()) + rJet) > (maxEta - deltaEtaEdge)) continue; // jet pt must be larger than threshold - fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jet, rhoPerp, rhoMPerp); + auto jetForSub = jet; + fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jetForSub, rhoPerp, rhoMPerp); if (getCorrectedPt(jetMinusBkg.pt()) < minJetPt) continue; isAtLeastOneJetSelected = true; @@ -694,7 +695,7 @@ struct AntinucleiInJets { // loop over reconstructed jets int njetsInAcc(0); int njetsHighPt(0); - for (auto& jet : jets) { // o2-linter: disable=[const-ref-in-for-loop] + for (const auto& jet : jets) { // jet must be fully contained in the acceptance if ((std::fabs(jet.eta()) + rJet) > (maxEta - deltaEtaEdge)) @@ -704,7 +705,8 @@ struct AntinucleiInJets { double ptJetBeforeSub = jet.pt(); // jet pt must be larger than threshold - fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jet, rhoPerp, rhoMPerp); + auto jetForSub = jet; + fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jetForSub, rhoPerp, rhoMPerp); double ptJetAfterSub = jet.pt(); registryQC.fill(HIST("jetPtDifference"), ptJetAfterSub - ptJetBeforeSub); @@ -785,7 +787,7 @@ struct AntinucleiInJets { if (!particle.isPhysicalPrimary()) continue; - if (particle.pdgCode() == -2212) { + if (particle.pdgCode() == kProtonBar) { registryMC.fill(HIST("antiproton_eta_pt_pythia"), particle.pt(), particle.eta()); } @@ -793,19 +795,19 @@ struct AntinucleiInJets { continue; switch (particle.pdgCode()) { - case -2212: + case kProtonBar: registryMC.fill(HIST("antiproton_incl_gen"), particle.pt()); break; - case 1000010020: + case o2::constants::physics::Pdg::kDeuteron: registryMC.fill(HIST("deuteron_incl_gen"), particle.pt()); break; - case -1000010020: + case -o2::constants::physics::Pdg::kDeuteron: registryMC.fill(HIST("antideuteron_incl_gen"), particle.pt()); break; - case 1000020030: + case o2::constants::physics::Pdg::kHelium3: registryMC.fill(HIST("helium3_incl_gen"), particle.pt()); break; - case -1000020030: + case -o2::constants::physics::Pdg::kHelium3: registryMC.fill(HIST("antihelium3_incl_gen"), particle.pt()); break; } @@ -860,17 +862,17 @@ struct AntinucleiInJets { if ((2.0 * track.pt()) > ptMaxItsPidHel) passedItsPidHel = true; - if (particle.pdgCode() == -2212) + if (particle.pdgCode() == kProtonBar) registryMC.fill(HIST("antiproton_incl_all"), track.pt()); if (!particle.isPhysicalPrimary()) continue; - if (particle.pdgCode() == -2212) + if (particle.pdgCode() == kProtonBar) registryMC.fill(HIST("antiproton_incl_prim"), track.pt()); // antiprotons - if (particle.pdgCode() == -2212 && passedItsPidProt) { + if (particle.pdgCode() == kProtonBar && passedItsPidProt) { if (nsigmaTPCPr > minNsigmaTpc && nsigmaTPCPr < maxNsigmaTpc) { registryMC.fill(HIST("antiproton_incl_rec_tpc"), track.pt()); if (track.hasTOF() && nsigmaTOFPr > minNsigmaTof && nsigmaTOFPr < maxNsigmaTof) @@ -879,7 +881,7 @@ struct AntinucleiInJets { } // antideuterons - if (particle.pdgCode() == -1000010020 && passedItsPidDeut) { + if (particle.pdgCode() == -o2::constants::physics::Pdg::kDeuteron && passedItsPidDeut) { if (nsigmaTPCDe > minNsigmaTpc && nsigmaTPCDe < maxNsigmaTpc) { registryMC.fill(HIST("antideuteron_incl_rec_tpc"), track.pt()); if (track.hasTOF() && nsigmaTOFDe > minNsigmaTof && nsigmaTOFDe < maxNsigmaTof) @@ -888,7 +890,7 @@ struct AntinucleiInJets { } // deuterons - if (particle.pdgCode() == 1000010020 && passedItsPidDeut) { + if (particle.pdgCode() == o2::constants::physics::Pdg::kDeuteron && passedItsPidDeut) { if (nsigmaTPCDe > minNsigmaTpc && nsigmaTPCDe < maxNsigmaTpc) { registryMC.fill(HIST("deuteron_incl_rec_tpc"), track.pt()); if (track.hasTOF() && nsigmaTOFDe > minNsigmaTof && nsigmaTOFDe < maxNsigmaTof) @@ -897,14 +899,14 @@ struct AntinucleiInJets { } // antihelium3 - if (particle.pdgCode() == -1000020030 && passedItsPidHel) { + if (particle.pdgCode() == -o2::constants::physics::Pdg::kHelium3 && passedItsPidHel) { if (nsigmaTPCHe > minNsigmaTpc && nsigmaTPCHe < maxNsigmaTpc) { registryMC.fill(HIST("antihelium3_incl_rec_tpc"), 2.0 * track.pt()); } } // helium3 - if (particle.pdgCode() == 1000020030 && passedItsPidHel) { + if (particle.pdgCode() == o2::constants::physics::Pdg::kHelium3 && passedItsPidHel) { if (nsigmaTPCHe > minNsigmaTpc && nsigmaTPCHe < maxNsigmaTpc) { registryMC.fill(HIST("helium3_incl_rec_tpc"), 2.0 * track.pt()); } @@ -947,14 +949,15 @@ struct AntinucleiInJets { auto [rhoPerp, rhoMPerp] = backgroundSub.estimateRhoPerpCone(fjParticles, jets); // loop over jets - for (auto& jet : jets) { // o2-linter: disable=[const-ref-in-for-loop] + for (const auto& jet : jets) { // jet must be fully contained in the acceptance if ((std::fabs(jet.eta()) + rJet) > (maxEta - deltaEtaEdge)) continue; // jet pt must be larger than threshold - fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jet, rhoPerp, rhoMPerp); + auto jetForSub = jet; + fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jetForSub, rhoPerp, rhoMPerp); if (jetMinusBkg.pt() < minJetPt) continue; @@ -970,7 +973,7 @@ struct AntinucleiInJets { // loop over jet constituents for (const auto& particle : jetConstituents) { - if (particle.user_index() != -2212) + if (particle.user_index() != kProtonBar) continue; registryMC.fill(HIST("antiproton_jet_gen"), particle.pt()); registryMC.fill(HIST("antiproton_eta_pt_jet"), particle.pt(), particle.eta()); @@ -993,7 +996,7 @@ struct AntinucleiInJets { if (deltaRUe1 > coneRadius && deltaRUe2 > coneRadius) continue; - if (particle.pdgCode() != -2212) + if (particle.pdgCode() != kProtonBar) continue; registryMC.fill(HIST("antiproton_ue_gen"), particle.pt()); @@ -1037,7 +1040,7 @@ struct AntinucleiInJets { auto [rhoPerp, rhoMPerp] = backgroundSub.estimateRhoPerpCone(fjParticles, jets); // loop over reconstructed jets - for (auto& jet : jets) { // o2-linter: disable=[const-ref-in-for-loop] + for (const auto& jet : jets) { // get jet constituents std::vector jetConstituents = jet.constituents(); @@ -1062,7 +1065,8 @@ struct AntinucleiInJets { registryMC.fill(HIST("detectorResponseMatrix"), jetPtGen, jetPtGen - jet.pt()); // maybe it should be filled after bkg sub // jet pt must be larger than threshold - fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jet, rhoPerp, rhoMPerp); + auto jetForSub = jet; + fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jetForSub, rhoPerp, rhoMPerp); if (getCorrectedPt(jetMinusBkg.pt()) < minJetPt) continue; @@ -1090,7 +1094,7 @@ struct AntinucleiInJets { if (!track.has_mcParticle()) continue; const auto mcparticle = track.mcParticle(); - if (mcparticle.pdgCode() != -2212) + if (mcparticle.pdgCode() != kProtonBar) continue; // variables @@ -1135,7 +1139,7 @@ struct AntinucleiInJets { if (!track.has_mcParticle()) continue; const auto mcparticle = track.mcParticle(); - if (mcparticle.pdgCode() != -2212) + if (mcparticle.pdgCode() != kProtonBar) continue; double deltaEtaUe1 = track.eta() - ueAxis1.Eta(); @@ -1218,14 +1222,15 @@ struct AntinucleiInJets { auto [rhoPerp, rhoMPerp] = backgroundSub.estimateRhoPerpCone(fjParticles, jets); // loop over reconstructed jets - for (auto& jet : jets) { + for (const auto& jet : jets) { // jet must be fully contained in the acceptance if ((std::fabs(jet.eta()) + rJet) > (maxEta - deltaEtaEdge)) continue; // jet pt must be larger than threshold - fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jet, rhoPerp, rhoMPerp); + auto jetForSub = jet; + fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jetForSub, rhoPerp, rhoMPerp); if (getCorrectedPt(jetMinusBkg.pt()) < minJetPt) continue; From 32bf94b5e9ce1a9d1073c69b97f88c38b2a074bf Mon Sep 17 00:00:00 2001 From: amaringarcia Date: Mon, 17 Mar 2025 10:38:58 +0100 Subject: [PATCH 0720/1650] =?UTF-8?q?[DPG]=20adding=20two=20proccess=20to?= =?UTF-8?q?=20save=20the=20trackQA=20variables=20to=20the=20standar?= =?UTF-8?q?=E2=80=A6=20(#10451)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ana Marin --- DPG/Tasks/TPC/tpcSkimsTableCreator.cxx | 320 ++++++++++++++++++++++++- DPG/Tasks/TPC/tpcSkimsTableCreator.h | 74 ++++++ 2 files changed, 381 insertions(+), 13 deletions(-) diff --git a/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx b/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx index 5f1a85e607f..cbf1631d8aa 100644 --- a/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx +++ b/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx @@ -19,6 +19,7 @@ #include "tpcSkimsTableCreator.h" #include #include +#include /// ROOT #include "TRandom3.h" /// O2 @@ -36,6 +37,7 @@ #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/EventSelection.h" #include "Common/CCDB/ctpRateFetcher.h" +#include "Common/DataModel/OccupancyTables.h" using namespace o2; using namespace o2::framework; @@ -48,10 +50,12 @@ struct TreeWriterTpcV0 { Service ccdb; using Trks = soa::Join; - using Coll = soa::Join; + using Colls = soa::Join; + using MyBCTable = soa::Join; /// Tables to be produced Produces rowTPCTree; + Produces rowTPCTreeWithTrkQA; /// Configurables Configurable nSigmaTOFdautrack{"nSigmaTOFdautrack", 999., "n-sigma TOF cut on the proton daughter tracks. Set 999 to switch it off."}; @@ -129,6 +133,68 @@ struct TreeWriterTpcV0 { } }; + /// Function to fill skimmed tables + template + void fillSkimmedV0TableWithTrQA(V0 const& v0, T const& track, TQA const& trackQA, bool existTrkQA, C const& collision, const float nSigmaTPC, const float nSigmaTOF, const float dEdxExp, const o2::track::PID::ID id, int runnumber, double dwnSmplFactor, float hadronicRate, int bcGlobalIndex, int bcTimeFrameId, int bcBcInTimeFrame) + { + + const double ncl = track.tpcNClsFound(); + const double p = track.tpcInnerParam(); + const double mass = o2::track::pid_constants::sMasses[id]; + const double bg = p / mass; + const int multTPC = collision.multTPC(); + auto trackocc = collision.trackOccupancyInTimeRange(); + auto ft0occ = collision.ft0cOccupancyInTimeRange(); + + const float alpha = v0.alpha(); + const float qt = v0.qtarm(); + const float cosPA = v0.v0cosPA(); + const float pT = v0.pt(); + const float v0radius = v0.v0radius(); + const float gammapsipair = v0.psipair(); + + const double pseudoRndm = track.pt() * 1000. - static_cast(track.pt() * 1000); + if (pseudoRndm < dwnSmplFactor) { + rowTPCTreeWithTrkQA(track.tpcSignal(), + 1. / dEdxExp, + track.tpcInnerParam(), + track.tgl(), + track.signed1Pt(), + track.eta(), + track.phi(), + track.y(), + mass, + bg, + multTPC / 11000., + std::sqrt(nClNorm / ncl), + id, + nSigmaTPC, + nSigmaTOF, + alpha, + qt, + cosPA, + pT, + v0radius, + gammapsipair, + runnumber, + trackocc, + ft0occ, + hadronicRate, + bcGlobalIndex, + bcTimeFrameId, + bcBcInTimeFrame, + existTrkQA ? trackQA.tpcClusterByteMask() : -999, + existTrkQA ? trackQA.tpcdEdxMax0R() : -999, + existTrkQA ? trackQA.tpcdEdxMax1R() : -999, + existTrkQA ? trackQA.tpcdEdxMax2R() : -999, + existTrkQA ? trackQA.tpcdEdxMax3R() : -999, + existTrkQA ? trackQA.tpcdEdxTot0R() : -999, + existTrkQA ? trackQA.tpcdEdxTot1R() : -999, + existTrkQA ? trackQA.tpcdEdxTot2R() : -999, + existTrkQA ? trackQA.tpcdEdxTot3R() : -999); + } + }; + double tsalisCharged(double pt, double mass, double sqrts) { const double a = 6.81, b = 59.24; @@ -185,7 +251,7 @@ struct TreeWriterTpcV0 { } /// Apply a track quality selection with a filter! - void process(Coll::iterator const& collision, soa::Filtered const& tracks, aod::V0Datas const& v0s, aod::BCsWithTimestamps const&) + void processStandard(Colls::iterator const& collision, soa::Filtered const& tracks, aod::V0Datas const& v0s, aod::BCsWithTimestamps const&) { /// Check event slection if (!isEventSelected(collision, tracks)) { @@ -198,7 +264,7 @@ struct TreeWriterTpcV0 { rowTPCTree.reserve(tracks.size()); /// Loop over v0 candidates - for (auto v0 : v0s) { + for (const auto& v0 : v0s) { auto posTrack = v0.posTrack_as>(); auto negTrack = v0.negTrack_as>(); // gamma @@ -222,7 +288,7 @@ struct TreeWriterTpcV0 { // Lambda if (static_cast(posTrack.pidbit() & (1 << 2)) && static_cast(negTrack.pidbit() & (1 << 2))) { if (downsampleTsalisCharged(posTrack.pt(), downsamplingTsalisProtons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Proton], maxPt4dwnsmplTsalisProtons)) { - if (TMath::Abs(posTrack.tofNSigmaPr()) <= nSigmaTOFdautrack) { + if (std::abs(posTrack.tofNSigmaPr()) <= nSigmaTOFdautrack) { fillSkimmedV0Table(v0, posTrack, collision, posTrack.tpcNSigmaPr(), posTrack.tofNSigmaPr(), posTrack.tpcExpSignalPr(posTrack.tpcSignal()), o2::track::PID::Proton, runnumber, dwnSmplFactor_Pr, hadronicRate); } } @@ -236,24 +302,128 @@ struct TreeWriterTpcV0 { fillSkimmedV0Table(v0, posTrack, collision, posTrack.tpcNSigmaPi(), posTrack.tofNSigmaPi(), posTrack.tpcExpSignalPi(posTrack.tpcSignal()), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate); } if (downsampleTsalisCharged(negTrack.pt(), downsamplingTsalisProtons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Proton], maxPt4dwnsmplTsalisProtons)) { - if (TMath::Abs(negTrack.tofNSigmaPr()) <= nSigmaTOFdautrack) { + if (std::abs(negTrack.tofNSigmaPr()) <= nSigmaTOFdautrack) { fillSkimmedV0Table(v0, negTrack, collision, negTrack.tpcNSigmaPr(), negTrack.tofNSigmaPr(), negTrack.tpcExpSignalPr(negTrack.tpcSignal()), o2::track::PID::Proton, runnumber, dwnSmplFactor_Pr, hadronicRate); } } } } - } /// process + } /// process Standard + PROCESS_SWITCH(TreeWriterTpcV0, processStandard, "Standard V0 Samples for PID", true); + + Preslice perCollisionTracks = aod::track::collisionId; + Preslice perCollisionV0s = aod::v0data::collisionId; + void processWithTrQA(Colls const& collisions, Trks const& myTracks, aod::V0Datas const& myV0s, MyBCTable const&, aod::TracksQA_002 const& tracksQA) + { + std::vector labelTrack2TrackQA; + labelTrack2TrackQA.clear(); + labelTrack2TrackQA.resize(myTracks.size(), -1); + for (const auto& trackQA : tracksQA) { + int64_t trackId = trackQA.trackId(); + int64_t trackQAIndex = trackQA.globalIndex(); + labelTrack2TrackQA[trackId] = trackQAIndex; + } + for (const auto& collision : collisions) { + auto tracks = myTracks.sliceBy(perCollisionTracks, collision.globalIndex()); + auto v0s = myV0s.sliceBy(perCollisionV0s, collision.globalIndex()); + + /// Check event slection + if (!isEventSelected(collision, tracks)) { + continue; + } + auto bc = collision.bc_as(); + const int runnumber = bc.runNumber(); + float hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), runnumber, "ZNC hadronic") * 1.e-3; + const int bcGlobalIndex = bc.globalIndex(); + const int bcTimeFrameId = bc.tfId(); + const int bcBcInTimeFrame = bc.bcInTF(); + rowTPCTreeWithTrkQA.reserve(tracks.size()); + /// Loop over v0 candidates + for (const auto& v0 : v0s) { + auto posTrack = v0.posTrack_as(); + auto negTrack = v0.negTrack_as(); + + aod::TracksQA_002::iterator posTrackQA; + aod::TracksQA_002::iterator negTrackQA; + bool existPosTrkQA; + bool existNegTrkQA; + if (labelTrack2TrackQA[posTrack.globalIndex()] != -1) { + posTrackQA = tracksQA.iteratorAt(labelTrack2TrackQA[posTrack.globalIndex()]); + existPosTrkQA = true; + } else { + posTrackQA = tracksQA.iteratorAt(0); + existPosTrkQA = false; + } + if (labelTrack2TrackQA[negTrack.globalIndex()] != -1) { + negTrackQA = tracksQA.iteratorAt(labelTrack2TrackQA[negTrack.globalIndex()]); + existNegTrkQA = true; + } else { + negTrackQA = tracksQA.iteratorAt(0); + existNegTrkQA = false; + } + + // gamma + if (static_cast(posTrack.pidbit() & (1 << 0)) && static_cast(negTrack.pidbit() & (1 << 0))) { + if (downsampleTsalisCharged(posTrack.pt(), downsamplingTsalisElectrons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Electron], maxPt4dwnsmplTsalisElectrons)) { + fillSkimmedV0TableWithTrQA(v0, posTrack, posTrackQA, existPosTrkQA, collision, posTrack.tpcNSigmaEl(), posTrack.tofNSigmaEl(), posTrack.tpcExpSignalEl(posTrack.tpcSignal()), o2::track::PID::Electron, runnumber, dwnSmplFactor_El, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + } + if (downsampleTsalisCharged(negTrack.pt(), downsamplingTsalisElectrons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Electron], maxPt4dwnsmplTsalisElectrons)) { + fillSkimmedV0TableWithTrQA(v0, negTrack, negTrackQA, existNegTrkQA, collision, negTrack.tpcNSigmaEl(), negTrack.tofNSigmaEl(), negTrack.tpcExpSignalEl(negTrack.tpcSignal()), o2::track::PID::Electron, runnumber, dwnSmplFactor_El, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + } + } + // Ks0 + if (static_cast(posTrack.pidbit() & (1 << 1)) && static_cast(negTrack.pidbit() & (1 << 1))) { + if (downsampleTsalisCharged(posTrack.pt(), downsamplingTsalisPions, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Pion], maxPt4dwnsmplTsalisPions)) { + fillSkimmedV0TableWithTrQA(v0, posTrack, posTrackQA, existPosTrkQA, collision, posTrack.tpcNSigmaPi(), posTrack.tofNSigmaPi(), posTrack.tpcExpSignalPi(posTrack.tpcSignal()), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + } + if (downsampleTsalisCharged(negTrack.pt(), downsamplingTsalisPions, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Pion], maxPt4dwnsmplTsalisPions)) { + fillSkimmedV0TableWithTrQA(v0, negTrack, negTrackQA, existNegTrkQA, collision, negTrack.tpcNSigmaPi(), negTrack.tofNSigmaPi(), negTrack.tpcExpSignalPi(negTrack.tpcSignal()), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + } + } + // Lambda + if (static_cast(posTrack.pidbit() & (1 << 2)) && static_cast(negTrack.pidbit() & (1 << 2))) { + if (downsampleTsalisCharged(posTrack.pt(), downsamplingTsalisProtons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Proton], maxPt4dwnsmplTsalisProtons)) { + if (std::abs(posTrack.tofNSigmaPr()) <= nSigmaTOFdautrack) { + fillSkimmedV0TableWithTrQA(v0, posTrack, posTrackQA, existPosTrkQA, collision, posTrack.tpcNSigmaPr(), posTrack.tofNSigmaPr(), posTrack.tpcExpSignalPr(posTrack.tpcSignal()), o2::track::PID::Proton, runnumber, dwnSmplFactor_Pr, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + } + } + if (downsampleTsalisCharged(negTrack.pt(), downsamplingTsalisPions, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Pion], maxPt4dwnsmplTsalisPions)) { + fillSkimmedV0TableWithTrQA(v0, negTrack, negTrackQA, existNegTrkQA, collision, negTrack.tpcNSigmaPi(), negTrack.tofNSigmaPi(), negTrack.tpcExpSignalPi(negTrack.tpcSignal()), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + } + } + // Antilambda + if (static_cast(posTrack.pidbit() & (1 << 3)) && static_cast(negTrack.pidbit() & (1 << 3))) { + if (downsampleTsalisCharged(posTrack.pt(), downsamplingTsalisPions, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Pion], maxPt4dwnsmplTsalisPions)) { + fillSkimmedV0TableWithTrQA(v0, posTrack, posTrackQA, existPosTrkQA, collision, posTrack.tpcNSigmaPi(), posTrack.tofNSigmaPi(), posTrack.tpcExpSignalPi(posTrack.tpcSignal()), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + } + if (downsampleTsalisCharged(negTrack.pt(), downsamplingTsalisProtons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Proton], maxPt4dwnsmplTsalisProtons)) { + if (std::abs(negTrack.tofNSigmaPr()) <= nSigmaTOFdautrack) { + fillSkimmedV0TableWithTrQA(v0, negTrack, negTrackQA, existNegTrkQA, collision, negTrack.tpcNSigmaPr(), negTrack.tofNSigmaPr(), negTrack.tpcExpSignalPr(negTrack.tpcSignal()), o2::track::PID::Proton, runnumber, dwnSmplFactor_Pr, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + } + } + } + } + } + } /// process with TrackQA + PROCESS_SWITCH(TreeWriterTpcV0, processWithTrQA, "Standard V0 Samples with Track QA for PID", false); }; /// struct TreeWriterTpcV0 struct TreeWriterTPCTOF { Service ccdb; - using Trks = soa::Join; - using Coll = soa::Join; + using Trks = soa::Join; + using Colls = soa::Join; + using MyBCTable = soa::Join; /// Tables to be produced Produces rowTPCTOFTree; + Produces rowTPCTOFTreeWithTrkQA; /// Configurables Configurable nClNorm{"nClNorm", 152., "Number of cluster normalization. Run 2: 159, Run 3 152"}; @@ -318,7 +488,7 @@ struct TreeWriterTPCTOF { double n = a + b / sqrts; double T = c + d / sqrts; double p0 = n * T; - double result = pow((1. + mt / p0), -n); + double result = std::pow((1. + mt / p0), -n); return result; }; @@ -375,6 +545,54 @@ struct TreeWriterTPCTOF { hadronicRate); } }; + /// Function to fill trees + template + void fillSkimmedTPCTOFTableWithTrkQA(T const& track, TQA const& trackQA, bool existTrkQA, C const& collision, const float nSigmaTPC, const float nSigmaTOF, const float dEdxExp, const o2::track::PID::ID id, int runnumber, double dwnSmplFactor, double hadronicRate, int bcGlobalIndex, int bcTimeFrameId, int bcBcInTimeFrame) + { + + const double ncl = track.tpcNClsFound(); + const double p = track.tpcInnerParam(); + const double mass = o2::track::pid_constants::sMasses[id]; + const double bg = p / mass; + const int multTPC = collision.multTPC(); + auto trackocc = collision.trackOccupancyInTimeRange(); + auto ft0occ = collision.ft0cOccupancyInTimeRange(); + + const double pseudoRndm = track.pt() * 1000. - static_cast(track.pt() * 1000); + if (pseudoRndm < dwnSmplFactor) { + rowTPCTOFTreeWithTrkQA(track.tpcSignal(), + 1. / dEdxExp, + track.tpcInnerParam(), + track.tgl(), + track.signed1Pt(), + track.eta(), + track.phi(), + track.y(), + mass, + bg, + multTPC / 11000., + std::sqrt(nClNorm / ncl), + id, + nSigmaTPC, + nSigmaTOF, + runnumber, + trackocc, + ft0occ, + hadronicRate, + bcGlobalIndex, + bcTimeFrameId, + bcBcInTimeFrame, + existTrkQA ? trackQA.tpcClusterByteMask() : -999, + existTrkQA ? trackQA.tpcdEdxMax0R() : -999, + existTrkQA ? trackQA.tpcdEdxMax1R() : -999, + existTrkQA ? trackQA.tpcdEdxMax2R() : -999, + existTrkQA ? trackQA.tpcdEdxMax3R() : -999, + existTrkQA ? trackQA.tpcdEdxTot0R() : -999, + existTrkQA ? trackQA.tpcdEdxTot1R() : -999, + existTrkQA ? trackQA.tpcdEdxTot2R() : -999, + existTrkQA ? trackQA.tpcdEdxTot3R() : -999); + } + }; /// Event selection template @@ -399,13 +617,12 @@ struct TreeWriterTPCTOF { ccdb->setFatalWhenNull(false); } - void process(Coll::iterator const& collision, soa::Filtered const& tracks, aod::BCsWithTimestamps const&) + void processStandard(Colls::iterator const& collision, soa::Filtered const& tracks, aod::BCsWithTimestamps const&) { /// Check event selection if (!isEventSelected(collision, tracks)) { return; } - auto bc = collision.bc_as(); const int runnumber = bc.runNumber(); float hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), runnumber, "ZNC hadronic") * 1.e-3; @@ -444,8 +661,85 @@ struct TreeWriterTPCTOF { } } /// Loop tracks } /// process -}; /// struct TreeWriterTPCTOF - + PROCESS_SWITCH(TreeWriterTPCTOF, processStandard, "Standard Samples for PID", true); + Preslice perCollisionTracks = aod::track::collisionId; + void processWithTrQA(Colls const& collisions, Trks const& myTracks, MyBCTable const&, aod::TracksQA_002 const& tracksQA) + { + std::vector labelTrack2TrackQA; + labelTrack2TrackQA.clear(); + labelTrack2TrackQA.resize(myTracks.size(), -1); + for (const auto& trackQA : tracksQA) { + int64_t trackId = trackQA.trackId(); + int64_t trackQAIndex = trackQA.globalIndex(); + labelTrack2TrackQA[trackId] = trackQAIndex; + } + for (const auto& collision : collisions) { + auto tracks = myTracks.sliceBy(perCollisionTracks, collision.globalIndex()); + /// Check event selection + if (!isEventSelected(collision, tracks)) { + continue; + } + auto bc = collision.bc_as(); + const int runnumber = bc.runNumber(); + float hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), runnumber, "ZNC hadronic") * 1.e-3; + const int bcGlobalIndex = bc.globalIndex(); + const int bcTimeFrameId = bc.tfId(); + const int bcBcInTimeFrame = bc.bcInTF(); + rowTPCTOFTreeWithTrkQA.reserve(tracks.size()); + for (auto const& trk : tracks) { + if (!((trackSelection == 0) || + ((trackSelection == 1) && trk.isGlobalTrack()) || + ((trackSelection == 2) && trk.isGlobalTrackWoPtEta()) || + ((trackSelection == 3) && trk.isGlobalTrackWoDCA()) || + ((trackSelection == 4) && trk.isQualityTrack()) || + ((trackSelection == 5) && trk.isInAcceptanceTrack()))) { + continue; + } + // get the corresponding trackQA using labelTracks2TracKQA and get variables of interest + aod::TracksQA_002::iterator trackQA; + bool existTrkQA; + if (labelTrack2TrackQA[trk.globalIndex()] != -1) { + trackQA = tracksQA.iteratorAt(labelTrack2TrackQA[trk.globalIndex()]); + existTrkQA = true; + } else { + trackQA = tracksQA.iteratorAt(0); + existTrkQA = false; + } + /// Fill tree for tritons + if (trk.tpcInnerParam() < maxMomHardCutOnlyTr && trk.tpcInnerParam() <= maxMomTPCOnlyTr && std::abs(trk.tpcNSigmaTr()) < nSigmaTPCOnlyTr && downsampleTsalisCharged(trk.pt(), downsamplingTsalisProtons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Triton])) { + fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaTr(), trk.tofNSigmaTr(), trk.tpcExpSignalTr(trk.tpcSignal()), o2::track::PID::Triton, runnumber, dwnSmplFactor_Tr, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + } else if (trk.tpcInnerParam() < maxMomHardCutOnlyTr && trk.tpcInnerParam() > maxMomTPCOnlyTr && std::abs(trk.tofNSigmaTr()) < nSigmaTOF_TPCTOF_Tr && std::abs(trk.tpcNSigmaTr()) < nSigmaTPC_TPCTOF_Tr && downsampleTsalisCharged(trk.pt(), downsamplingTsalisProtons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Triton])) { + fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaTr(), trk.tofNSigmaTr(), trk.tpcExpSignalTr(trk.tpcSignal()), o2::track::PID::Triton, runnumber, dwnSmplFactor_Tr, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + } + /// Fill tree for deuterons + if (trk.tpcInnerParam() < maxMomHardCutOnlyDe && trk.tpcInnerParam() <= maxMomTPCOnlyDe && std::abs(trk.tpcNSigmaDe()) < nSigmaTPCOnlyDe && downsampleTsalisCharged(trk.pt(), downsamplingTsalisProtons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Deuteron])) { + fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaDe(), trk.tofNSigmaDe(), trk.tpcExpSignalDe(trk.tpcSignal()), o2::track::PID::Deuteron, runnumber, dwnSmplFactor_De, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + } else if (trk.tpcInnerParam() < maxMomHardCutOnlyDe && trk.tpcInnerParam() > maxMomTPCOnlyDe && std::abs(trk.tofNSigmaDe()) < nSigmaTOF_TPCTOF_De && std::abs(trk.tpcNSigmaDe()) < nSigmaTPC_TPCTOF_De && downsampleTsalisCharged(trk.pt(), downsamplingTsalisProtons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Deuteron])) { + fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaDe(), trk.tofNSigmaDe(), trk.tpcExpSignalDe(trk.tpcSignal()), o2::track::PID::Deuteron, runnumber, dwnSmplFactor_De, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + } + /// Fill tree for protons + if (trk.tpcInnerParam() <= maxMomTPCOnlyPr && std::abs(trk.tpcNSigmaPr()) < nSigmaTPCOnlyPr && downsampleTsalisCharged(trk.pt(), downsamplingTsalisProtons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Proton])) { + fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaPr(), trk.tofNSigmaPr(), trk.tpcExpSignalPr(trk.tpcSignal()), o2::track::PID::Proton, runnumber, dwnSmplFactor_Pr, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + } else if (trk.tpcInnerParam() > maxMomTPCOnlyPr && std::abs(trk.tofNSigmaPr()) < nSigmaTOF_TPCTOF_Pr && std::abs(trk.tpcNSigmaPr()) < nSigmaTPC_TPCTOF_Pr && downsampleTsalisCharged(trk.pt(), downsamplingTsalisProtons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Proton])) { + fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaPr(), trk.tofNSigmaPr(), trk.tpcExpSignalPr(trk.tpcSignal()), o2::track::PID::Proton, runnumber, dwnSmplFactor_Pr, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + } + /// Fill tree for kaons + if (trk.tpcInnerParam() < maxMomHardCutOnlyKa && trk.tpcInnerParam() <= maxMomTPCOnlyKa && std::abs(trk.tpcNSigmaKa()) < nSigmaTPCOnlyKa && downsampleTsalisCharged(trk.pt(), downsamplingTsalisKaons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Kaon])) { + fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaKa(), trk.tofNSigmaKa(), trk.tpcExpSignalKa(trk.tpcSignal()), o2::track::PID::Kaon, runnumber, dwnSmplFactor_Ka, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + } else if (trk.tpcInnerParam() < maxMomHardCutOnlyKa && trk.tpcInnerParam() > maxMomTPCOnlyKa && std::abs(trk.tofNSigmaKa()) < nSigmaTOF_TPCTOF_Ka && std::abs(trk.tpcNSigmaKa()) < nSigmaTPC_TPCTOF_Ka && downsampleTsalisCharged(trk.pt(), downsamplingTsalisKaons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Kaon])) { + fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaKa(), trk.tofNSigmaKa(), trk.tpcExpSignalKa(trk.tpcSignal()), o2::track::PID::Kaon, runnumber, dwnSmplFactor_Ka, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + } + /// Fill tree pions + if (trk.tpcInnerParam() <= maxMomTPCOnlyPi && std::abs(trk.tpcNSigmaPi()) < nSigmaTPCOnlyPi && downsampleTsalisCharged(trk.pt(), downsamplingTsalisPions, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Pion])) { + fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaPi(), trk.tofNSigmaPi(), trk.tpcExpSignalPi(trk.tpcSignal()), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + } else if (trk.tpcInnerParam() > maxMomTPCOnlyPi && std::abs(trk.tofNSigmaPi()) < nSigmaTOF_TPCTOF_Pi && std::abs(trk.tpcNSigmaPi()) < nSigmaTPC_TPCTOF_Pi && downsampleTsalisCharged(trk.pt(), downsamplingTsalisPions, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Pion])) { + fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaPi(), trk.tofNSigmaPi(), trk.tpcExpSignalPi(trk.tpcSignal()), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + } + } /// Loop tracks + } + } /// process + PROCESS_SWITCH(TreeWriterTPCTOF, processWithTrQA, "Samples for PID with TrackQA info", false); +}; /// struct TreeWriterTPCTOF WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { auto workflow = WorkflowSpec{adaptAnalysisTask(cfgc)}; diff --git a/DPG/Tasks/TPC/tpcSkimsTableCreator.h b/DPG/Tasks/TPC/tpcSkimsTableCreator.h index 7c770602efd..4a4d8995593 100644 --- a/DPG/Tasks/TPC/tpcSkimsTableCreator.h +++ b/DPG/Tasks/TPC/tpcSkimsTableCreator.h @@ -44,6 +44,9 @@ DECLARE_SOA_COLUMN(RunNumber, runNumber, int); DECLARE_SOA_COLUMN(TrackOcc, trackOcc, float); DECLARE_SOA_COLUMN(Ft0Occ, ft0Occ, float); DECLARE_SOA_COLUMN(HadronicRate, hadronicRate, float); +DECLARE_SOA_COLUMN(BcGlobalIndex, bcGlobalIndex, int); +DECLARE_SOA_COLUMN(BcTimeFrameId, bcTimeFrameId, int); +DECLARE_SOA_COLUMN(BcBcInTimeFrame, bcBcInTimeFrame, int); } // namespace tpcskims DECLARE_SOA_TABLE(SkimmedTPCV0Tree, "AOD", "TPCSKIMV0TREE", o2::aod::track::TPCSignal, @@ -71,6 +74,44 @@ DECLARE_SOA_TABLE(SkimmedTPCV0Tree, "AOD", "TPCSKIMV0TREE", tpcskims::TrackOcc, tpcskims::Ft0Occ, tpcskims::HadronicRate); +DECLARE_SOA_TABLE(SkimmedTPCV0TreeWithTrkQA, "AOD", "TPCSKIMV0WQA", + o2::aod::track::TPCSignal, + tpcskims::InvDeDxExpTPC, + o2::aod::track::TPCInnerParam, + o2::aod::track::Tgl, + o2::aod::track::Signed1Pt, + o2::aod::track::Eta, + o2::aod::track::Phi, + o2::aod::track::Y, + tpcskims::Mass, + tpcskims::BetaGamma, + tpcskims::NormMultTPC, + tpcskims::NormNClustersTPC, + tpcskims::PidIndex, + tpcskims::NSigTPC, + tpcskims::NSigTOF, + tpcskims::AlphaV0, + tpcskims::QtV0, + tpcskims::CosPAV0, + tpcskims::PtV0, + tpcskims::RadiusV0, + tpcskims::GammaPsiPair, + tpcskims::RunNumber, + tpcskims::TrackOcc, + tpcskims::Ft0Occ, + tpcskims::HadronicRate, + tpcskims::BcGlobalIndex, + tpcskims::BcTimeFrameId, + tpcskims::BcBcInTimeFrame, + o2::aod::trackqa::TPCClusterByteMask, + o2::aod::trackqa::TPCdEdxMax0R, + o2::aod::trackqa::TPCdEdxMax1R, + o2::aod::trackqa::TPCdEdxMax2R, + o2::aod::trackqa::TPCdEdxMax3R, + o2::aod::trackqa::TPCdEdxTot0R, + o2::aod::trackqa::TPCdEdxTot1R, + o2::aod::trackqa::TPCdEdxTot2R, + o2::aod::trackqa::TPCdEdxTot3R); DECLARE_SOA_TABLE(SkimmedTPCTOFTree, "AOD", "TPCTOFSKIMTREE", o2::aod::track::TPCSignal, @@ -92,5 +133,38 @@ DECLARE_SOA_TABLE(SkimmedTPCTOFTree, "AOD", "TPCTOFSKIMTREE", tpcskims::TrackOcc, tpcskims::Ft0Occ, tpcskims::HadronicRate); + +DECLARE_SOA_TABLE(SkimmedTPCTOFTreeWithTrkQA, "AOD", "TPCTOFSKIMWQA", + o2::aod::track::TPCSignal, + tpcskims::InvDeDxExpTPC, + o2::aod::track::TPCInnerParam, + o2::aod::track::Tgl, + o2::aod::track::Signed1Pt, + o2::aod::track::Eta, + o2::aod::track::Phi, + o2::aod::track::Y, + tpcskims::Mass, + tpcskims::BetaGamma, + tpcskims::NormMultTPC, + tpcskims::NormNClustersTPC, + tpcskims::PidIndex, + tpcskims::NSigTPC, + tpcskims::NSigTOF, + tpcskims::RunNumber, + tpcskims::TrackOcc, + tpcskims::Ft0Occ, + tpcskims::HadronicRate, + tpcskims::BcGlobalIndex, + tpcskims::BcTimeFrameId, + tpcskims::BcBcInTimeFrame, + o2::aod::trackqa::TPCClusterByteMask, + o2::aod::trackqa::TPCdEdxMax0R, + o2::aod::trackqa::TPCdEdxMax1R, + o2::aod::trackqa::TPCdEdxMax2R, + o2::aod::trackqa::TPCdEdxMax3R, + o2::aod::trackqa::TPCdEdxTot0R, + o2::aod::trackqa::TPCdEdxTot1R, + o2::aod::trackqa::TPCdEdxTot2R, + o2::aod::trackqa::TPCdEdxTot3R); } // namespace o2::aod #endif // DPG_TASKS_TPC_TPCSKIMSTABLECREATOR_H_ From ab35839563898b3613afe482c3c3dd56ee6e7b0d Mon Sep 17 00:00:00 2001 From: Marvin Hemmer <53471402+mhemmer-cern@users.noreply.github.com> Date: Mon, 17 Mar 2025 14:38:14 +0100 Subject: [PATCH 0721/1650] =?UTF-8?q?[PWGEM,PWGEM-36]=20Pi0FlowEMC=20-=20A?= =?UTF-8?q?dd=20Histogram=20to=20QA=20effects=20in=20and=20out=20=E2=80=A6?= =?UTF-8?q?=20(#10531)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PWGEM/PhotonMeson/Tasks/taskPi0FlowEMC.cxx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/PWGEM/PhotonMeson/Tasks/taskPi0FlowEMC.cxx b/PWGEM/PhotonMeson/Tasks/taskPi0FlowEMC.cxx index 5394eb19deb..28adf43ece8 100644 --- a/PWGEM/PhotonMeson/Tasks/taskPi0FlowEMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/taskPi0FlowEMC.cxx @@ -97,13 +97,14 @@ struct TaskPi0FlowEMC { Configurable cfgDistanceToEdge{"cfgDistanceToEdge", 1, "Distance to edge in cells required for rotated cluster to be accepted"}; Configurable cfgDoM02{"cfgDoM02", false, "Flag to enable flow vs M02 for single photons"}; Configurable cfgDoReverseScaling{"cfgDoReverseScaling", false, "Flag to reverse the scaling that is possibly applied during NonLin"}; + Configurable cfgDoPlaneQA{"cfgDoPlaneQA", false, "Flag to enable QA plots comparing in and out of plane"}; // configurable axis ConfigurableAxis thnConfigAxisInvMass{"thnConfigAxisInvMass", {400, 0.0, 0.8}, ""}; ConfigurableAxis thnConfigAxisPt{"thnConfigAxisPt", {100, 0., 20.}, ""}; ConfigurableAxis thnConfigAxisCent{"thnConfigAxisCent", {20, 0., 100.}, ""}; ConfigurableAxis thnConfigAxisCosNPhi{"thnConfigAxisCosNPhi", {100, -1., 1.}, ""}; - ConfigurableAxis thnConfigAxisCosDeltaPhi{"thnConfigAxisCosDeltaPhi", {100, -1., 1.}, ""}; + ConfigurableAxis thnConfigAxisCosDeltaPhi{"thnConfigAxisCosDeltaPhi", {8, -1., 1.}, ""}; ConfigurableAxis thnConfigAxisScalarProd{"thnConfigAxisScalarProd", {100, -5., 5.}, ""}; ConfigurableAxis thnConfigAxisM02{"thnConfigAxisM02", {200, 0., 5.}, ""}; @@ -303,6 +304,9 @@ struct TaskPi0FlowEMC { registry.add("hSparseBkgRotFlow", "THn for SP", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisCent, thnAxisScalarProd}); registry.add("hSparseBkgMixFlow", "THn for SP", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisCent, thnAxisScalarProd}); registry.add("h3DMixingCount", "THn Event Mixing QA", HistType::kTH3D, {thnAxisMixingVtx, thnAxisMixingCent, thnAxisMixingEP}); + if (cfgDoPlaneQA.value) { + registry.add("hSparsePi0FlowPlane", "THn for SP", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisCent, thnAxisCosDeltaPhi}); + } auto hClusterCuts = registry.add("hClusterCuts", "hClusterCuts;;Counts", kTH1D, {{6, 0.5, 6.5}}, false); hClusterCuts->GetXaxis()->SetBinLabel(1, "in"); hClusterCuts->GetXaxis()->SetBinLabel(2, "opening angle"); @@ -850,6 +854,12 @@ struct TaskPi0FlowEMC { scalprodCand = scalprodCand / h1SPResolution->GetBinContent(h1SPResolution->FindBin(cent + epsilon)); } + if (cfgDoPlaneQA.value && histType == 0) { + float epAngle = epHelper.GetEventPlane(xQVec, yQVec, harmonic); + float cosDeltaPhi = std::cos(harmonic * getDeltaPsiInRange(phiCand, epAngle)); + registry.fill(HIST("hSparsePi0FlowPlane"), massCand, ptCand, cent, cosDeltaPhi); + } + fillThn(massCand, ptCand, cent, scalprodCand); return; } From 2c88ece2867de4ce7c62b05a8fd31173808cf5aa Mon Sep 17 00:00:00 2001 From: Swati <69241911+SwatiSaha-1997@users.noreply.github.com> Date: Mon, 17 Mar 2025 20:07:45 +0530 Subject: [PATCH 0722/1650] [PWGCF] PDG linter error fix and correction in Filter check (#10530) --- .../Tasks/antiprotonCumulantsMc.cxx | 23 +++++++----------- .../Tasks/netprotonCumulantsMc.cxx | 24 +++++++------------ 2 files changed, 17 insertions(+), 30 deletions(-) diff --git a/PWGCF/EbyEFluctuations/Tasks/antiprotonCumulantsMc.cxx b/PWGCF/EbyEFluctuations/Tasks/antiprotonCumulantsMc.cxx index 7980ff63ed4..f0398450cae 100644 --- a/PWGCF/EbyEFluctuations/Tasks/antiprotonCumulantsMc.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/antiprotonCumulantsMc.cxx @@ -117,7 +117,7 @@ struct AntiprotonCumulantsMc { // Filter command for rec (data)*********** Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; - Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtLower) && (aod::track::pt < 5.0f) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::tpcChi2NCl < cfgCutTpcChi2NCl) && (aod::track::itsChi2NCl < cfgCutItsChi2NCl) && (aod::track::dcaZ < cfgCutDCAz) && (aod::track::dcaXY < cfgCutDCAxy); + Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtLower) && (aod::track::pt < 5.0f) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::tpcChi2NCl < cfgCutTpcChi2NCl) && (aod::track::itsChi2NCl < cfgCutItsChi2NCl) && (nabs(aod::track::dcaZ) < cfgCutDCAz) && (nabs(aod::track::dcaXY) < cfgCutDCAxy); // filtering collisions and tracks for real data*********** using AodCollisions = soa::Filtered>; @@ -946,7 +946,7 @@ struct AntiprotonCumulantsMc { int nchInel = 0; for (const auto& mcParticle : mcParticles) { auto pdgcode = std::abs(mcParticle.pdgCode()); - if (mcParticle.isPhysicalPrimary() && (pdgcode == 211 || pdgcode == 321 || pdgcode == 2212 || pdgcode == 11 || pdgcode == 13)) { + if (mcParticle.isPhysicalPrimary() && (pdgcode == PDG_t::kPiPlus || pdgcode == PDG_t::kKPlus || pdgcode == PDG_t::kProton || pdgcode == PDG_t::kElectron || pdgcode == PDG_t::kMuonMinus)) { if (std::abs(mcParticle.eta()) < 1.0) { nchInel = nchInel + 1; } @@ -992,8 +992,6 @@ struct AntiprotonCumulantsMc { for (const auto& mcParticle : mcParticles) { if (!mcParticle.has_mcCollision()) continue; - if (!(mcParticle.mcCollision().globalIndex() == mcCollision.globalIndex())) - continue; if (mcParticle.isPhysicalPrimary()) { if ((mcParticle.pt() > cfgCutPtLower) && (mcParticle.pt() < 5.0f) && (std::abs(mcParticle.eta()) < cfgCutEta)) { @@ -1001,8 +999,8 @@ struct AntiprotonCumulantsMc { histos.fill(HIST("hgenEtaAll"), mcParticle.eta()); histos.fill(HIST("hgenPhiAll"), mcParticle.phi()); - if (std::abs(mcParticle.pdgCode()) == 2212 /*&& std::abs(mcParticle.y()) < 0.5*/) { - if (mcParticle.pdgCode() == 2212) { + if (std::abs(mcParticle.pdgCode()) == PDG_t::kProton /*&& std::abs(mcParticle.y()) < 0.5*/) { + if (mcParticle.pdgCode() == PDG_t::kProton) { histos.fill(HIST("hgenPtProton"), mcParticle.pt()); //! hist for p gen histos.fill(HIST("hgenPtDistProtonVsCentrality"), mcParticle.pt(), cent); histos.fill(HIST("hgen2DEtaVsPtProton"), mcParticle.pt(), mcParticle.eta()); @@ -1011,7 +1009,7 @@ struct AntiprotonCumulantsMc { if (mcParticle.pt() < cfgCutPtUpper) nProt = nProt + 1.0; } - if (mcParticle.pdgCode() == -2212) { + if (mcParticle.pdgCode() == PDG_t::kProtonBar) { histos.fill(HIST("hgenPtAntiproton"), mcParticle.pt()); //! hist for anti-p gen histos.fill(HIST("hgenPtDistAntiprotonVsCentrality"), mcParticle.pt(), cent); histos.fill(HIST("hgen2DEtaVsPtAntiproton"), mcParticle.pt(), mcParticle.eta()); @@ -1104,9 +1102,6 @@ struct AntiprotonCumulantsMc { if (!track.has_collision()) { continue; } - if (!(track.collision().globalIndex() == collision.globalIndex())) { - continue; - } if (!track.has_mcParticle()) //! check if track has corresponding MC particle { @@ -1181,7 +1176,7 @@ struct AntiprotonCumulantsMc { } } } - if (particle.pdgCode() == 2212) { + if (particle.pdgCode() == PDG_t::kProton) { histos.fill(HIST("hrecTruePtProton"), particle.pt()); //! hist for p purity } } @@ -1203,7 +1198,7 @@ struct AntiprotonCumulantsMc { } } } - if (particle.pdgCode() == -2212) { + if (particle.pdgCode() == PDG_t::kProtonBar) { histos.fill(HIST("hrecTruePtAntiproton"), particle.pt()); //! hist for anti-p purity } } @@ -2055,9 +2050,7 @@ struct AntiprotonCumulantsMc { if (!track.has_collision()) { continue; } - if (!(track.collision().globalIndex() == coll.globalIndex())) { - continue; - } + if (!track.isPVContributor()) //! track check as used in data { continue; diff --git a/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx b/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx index 020e80e5bc2..36a797a17a9 100644 --- a/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/netprotonCumulantsMc.cxx @@ -117,7 +117,7 @@ struct NetprotonCumulantsMc { // Filter command for rec (data)*********** Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; - Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtLower) && (aod::track::pt < 5.0f) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::tpcChi2NCl < cfgCutTpcChi2NCl) && (aod::track::itsChi2NCl < cfgCutItsChi2NCl) && (aod::track::dcaZ < cfgCutDCAz) && (aod::track::dcaXY < cfgCutDCAxy); + Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtLower) && (aod::track::pt < 5.0f) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::tpcChi2NCl < cfgCutTpcChi2NCl) && (aod::track::itsChi2NCl < cfgCutItsChi2NCl) && (nabs(aod::track::dcaZ) < cfgCutDCAz) && (nabs(aod::track::dcaXY) < cfgCutDCAxy); // filtering collisions and tracks for real data*********** using AodCollisions = soa::Filtered>; @@ -946,7 +946,7 @@ struct NetprotonCumulantsMc { int nchInel = 0; for (const auto& mcParticle : mcParticles) { auto pdgcode = std::abs(mcParticle.pdgCode()); - if (mcParticle.isPhysicalPrimary() && (pdgcode == 211 || pdgcode == 321 || pdgcode == 2212 || pdgcode == 11 || pdgcode == 13)) { + if (mcParticle.isPhysicalPrimary() && (pdgcode == PDG_t::kPiPlus || pdgcode == PDG_t::kKPlus || pdgcode == PDG_t::kProton || pdgcode == PDG_t::kElectron || pdgcode == PDG_t::kMuonMinus)) { if (std::abs(mcParticle.eta()) < 1.0) { nchInel = nchInel + 1; } @@ -992,8 +992,6 @@ struct NetprotonCumulantsMc { for (const auto& mcParticle : mcParticles) { if (!mcParticle.has_mcCollision()) continue; - if (!(mcParticle.mcCollision().globalIndex() == mcCollision.globalIndex())) - continue; if (mcParticle.isPhysicalPrimary()) { if ((mcParticle.pt() > cfgCutPtLower) && (mcParticle.pt() < 5.0f) && (std::abs(mcParticle.eta()) < cfgCutEta)) { @@ -1001,8 +999,8 @@ struct NetprotonCumulantsMc { histos.fill(HIST("hgenEtaAll"), mcParticle.eta()); histos.fill(HIST("hgenPhiAll"), mcParticle.phi()); - if (std::abs(mcParticle.pdgCode()) == 2212 /*&& std::abs(mcParticle.y()) < 0.5*/) { - if (mcParticle.pdgCode() == 2212) { + if (std::abs(mcParticle.pdgCode()) == PDG_t::kProton /*&& std::abs(mcParticle.y()) < 0.5*/) { + if (mcParticle.pdgCode() == PDG_t::kProton) { histos.fill(HIST("hgenPtProton"), mcParticle.pt()); //! hist for p gen histos.fill(HIST("hgenPtDistProtonVsCentrality"), mcParticle.pt(), cent); histos.fill(HIST("hgen2DEtaVsPtProton"), mcParticle.pt(), mcParticle.eta()); @@ -1011,7 +1009,7 @@ struct NetprotonCumulantsMc { if (mcParticle.pt() < cfgCutPtUpper) nProt = nProt + 1.0; } - if (mcParticle.pdgCode() == -2212) { + if (mcParticle.pdgCode() == PDG_t::kProtonBar) { histos.fill(HIST("hgenPtAntiproton"), mcParticle.pt()); //! hist for anti-p gen histos.fill(HIST("hgenPtDistAntiprotonVsCentrality"), mcParticle.pt(), cent); histos.fill(HIST("hgen2DEtaVsPtAntiproton"), mcParticle.pt(), mcParticle.eta()); @@ -1104,9 +1102,7 @@ struct NetprotonCumulantsMc { if (!track.has_collision()) { continue; } - if (!(track.collision().globalIndex() == collision.globalIndex())) { - continue; - } + if (!track.has_mcParticle()) //! check if track has corresponding MC particle { continue; @@ -1179,7 +1175,7 @@ struct NetprotonCumulantsMc { } } } - if (particle.pdgCode() == 2212) { + if (particle.pdgCode() == PDG_t::kProton) { histos.fill(HIST("hrecTruePtProton"), particle.pt()); //! hist for p purity } } @@ -1201,7 +1197,7 @@ struct NetprotonCumulantsMc { } } } - if (particle.pdgCode() == -2212) { + if (particle.pdgCode() == PDG_t::kProtonBar) { histos.fill(HIST("hrecTruePtAntiproton"), particle.pt()); //! hist for anti-p purity } } @@ -2053,9 +2049,7 @@ struct NetprotonCumulantsMc { if (!track.has_collision()) { continue; } - if (!(track.collision().globalIndex() == coll.globalIndex())) { - continue; - } + if (!track.isPVContributor()) //! track check as used in data { continue; From c1fe1012a30e410e039c45115b155054bfe82e97 Mon Sep 17 00:00:00 2001 From: Zuzanna Chochulska <87480906+zchochul@users.noreply.github.com> Date: Mon, 17 Mar 2025 18:17:04 +0100 Subject: [PATCH 0723/1650] [PWGCF] FemtoUniverse: Adding configs for kaon PID in the producer and minv cut on the phi meson (#10532) Co-authored-by: Zuzanna <01150674@pw.edu.pl> --- .../femtoUniverseProducerTask.cxx | 41 ++++++++++++------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx index efd4a17a0c8..8ea7b735773 100644 --- a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx +++ b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx @@ -287,15 +287,25 @@ struct FemtoUniverseProducerTask { FemtoUniversePhiSelection phiCuts; struct : o2::framework::ConfigurableGroup { /// Phi meson - Configurable confPtLowLimitPhi{"confPtLowLimitPhi", 0.8, "Lower limit of the Phi pT."}; - Configurable confPtHighLimitPhi{"confPtHighLimitPhi", 4.0, "Higher limit of the Phi pT."}; + Configurable confPhiPtLowLimit{"confPhiPtLowLimit", 0.8, "Lower limit of the Phi pT."}; + Configurable confPhiPtHighLimit{"confPhiPtHighLimit", 4.0, "Higher limit of the Phi pT."}; + Configurable confPhiInvMassLowLimit{"confPhiInvMassLowLimit", 1.011, "Lower limit of the Phi invariant mass"}; + Configurable confPhiInvMassUpLimit{"confPhiInvMassUpLimit", 1.027, "Upper limit of the Phi invariant mass"}; // Phi meson daughters Configurable confLooseTPCNSigma{"confLooseTPCNSigma", false, "Use loose TPC N sigmas for Kaon PID."}; Configurable confLooseTPCNSigmaValue{"confLooseTPCNSigmaValue", 10, "Value for the loose TPC N Sigma for Kaon PID."}; Configurable confLooseTOFNSigma{"confLooseTOFNSigma", false, "Use loose TPC N sigmas for Kaon PID."}; - Configurable confNsigmaRejectPion{"confNsigmaRejectPion", 3.0, "Reject if particle could be a Pion combined nsigma value."}; - Configurable confNsigmaRejectProton{"confNsigmaRejectProton", 3.0, "Reject if particle could be a Proton combined nsigma value."}; + Configurable confTrackPionNsigmaReject{"confTrackPionNsigmaReject", 3.0, "Reject if particle could be a Pion combined nsigma value."}; + Configurable confTrackProtonNsigmaReject{"confTrackProtonNsigmaReject", 3.0, "Reject if particle could be a Proton combined nsigma value."}; Configurable confLooseTOFNSigmaValue{"confLooseTOFNSigmaValue", 10, "Value for the loose TOF N Sigma for Kaon PID."}; + // Kaons + Configurable confTrackKaonNsigmaTPCfrom0_0to0_3{"confTrackKaonNsigmaTPCfrom0_0to0_3", 3.0, "Reject if Kaons in 0.0-0.3 are have TPC n sigma above this value."}; + Configurable confTrackKaonNsigmaTPCfrom0_3to0_45{"confTrackKaonNsigmaTPCfrom0_3to0_45", 2.0, "Reject if Kaons in 0.3-0.45 are have TPC n sigma above this value."}; + Configurable confTrackKaonNsigmaTPCfrom0_45to0_55{"confTrackKaonNsigmaTPCfrom0_45to0_55", 1.0, "Reject if Kaons in 0.45-0.55 are have TPC n sigma above this value."}; + Configurable confTrackKaonNsigmaTPCfrom0_55to1_5{"confTrackKaonNsigmaTPCfrom0_55to1_5", 3.0, "Reject if Kaons in 0.55-1.5 are have TPC n sigma above this value."}; + Configurable confTrackKaonNsigmaTOFfrom0_55to1_5{"confTrackKaonNsigmaTOFfrom0_55to1_5", 3.0, "Reject if Kaons in 0.55-1.5 are have TOF n sigma above this value."}; + Configurable confTrackKaonNsigmaTPCfrom1_5{"confTrackKaonNsigmaTPCfrom1_5", 3.0, "Reject if Kaons above 1.5 are have TPC n sigma above this value."}; + Configurable confTrackKaonNsigmaTOFfrom1_5{"confTrackKaonNsigmaTOFfrom1_5", 3.0, "Reject if Kaons above 1.5 are have TOF n sigma above this value."}; } ConfPhiSelection; // PDG codes for fillMCParticle function @@ -317,25 +327,25 @@ struct FemtoUniverseProducerTask { { if (mom < 0.3) { // 0.0-0.3 - if (std::abs(nsigmaTPCK) < 3.0) { + if (std::abs(nsigmaTPCK) < ConfPhiSelection.confTrackKaonNsigmaTPCfrom0_0to0_3) { return true; } else { return false; } } else if (mom < 0.45) { // 0.30 - 0.45 - if (std::abs(nsigmaTPCK) < 2.0) { + if (std::abs(nsigmaTPCK) < ConfPhiSelection.confTrackKaonNsigmaTPCfrom0_3to0_45) { return true; } else { return false; } } else if (mom < 0.55) { // 0.45-0.55 - if (std::abs(nsigmaTPCK) < 1.0) { + if (std::abs(nsigmaTPCK) < ConfPhiSelection.confTrackKaonNsigmaTPCfrom0_45to0_55) { return true; } else { return false; } } else if (mom < 1.5) { // 0.55-1.5 (now we use TPC and TOF) - if ((std::abs(nsigmaTOFK) < 3.0) && (std::abs(nsigmaTPCK) < 3.0)) { + if ((std::abs(nsigmaTOFK) < ConfPhiSelection.confTrackKaonNsigmaTOFfrom0_55to1_5) && (std::abs(nsigmaTPCK) < ConfPhiSelection.confTrackKaonNsigmaTPCfrom0_55to1_5)) { { return true; } @@ -343,7 +353,7 @@ struct FemtoUniverseProducerTask { return false; } } else if (mom > 1.5) { // 1.5 - - if ((std::abs(nsigmaTOFK) < 2.0) && (std::abs(nsigmaTPCK) < 3.0)) { + if ((std::abs(nsigmaTOFK) < ConfPhiSelection.confTrackKaonNsigmaTOFfrom1_5) && (std::abs(nsigmaTPCK) < ConfPhiSelection.confTrackKaonNsigmaTPCfrom1_5)) { return true; } else { return false; @@ -433,16 +443,16 @@ struct FemtoUniverseProducerTask { bool isKaonRejected(float mom, float nsigmaTPCPr, float nsigmaTOFPr, float nsigmaTPCPi, float nsigmaTOFPi) { if (mom < 0.5) { - if (std::abs(nsigmaTPCPi) < ConfPhiSelection.confNsigmaRejectPion.value) { + if (std::abs(nsigmaTPCPi) < ConfPhiSelection.confTrackPionNsigmaReject.value) { return true; - } else if (std::abs(nsigmaTPCPr) < ConfPhiSelection.confNsigmaRejectProton.value) { + } else if (std::abs(nsigmaTPCPr) < ConfPhiSelection.confTrackProtonNsigmaReject.value) { return true; } } if (mom > 0.5) { - if (std::hypot(nsigmaTOFPi, nsigmaTPCPi) < ConfPhiSelection.confNsigmaRejectPion.value) { + if (std::hypot(nsigmaTOFPi, nsigmaTPCPi) < ConfPhiSelection.confTrackPionNsigmaReject.value) { return true; - } else if (std::hypot(nsigmaTOFPr, nsigmaTPCPr) < ConfPhiSelection.confNsigmaRejectProton.value) { + } else if (std::hypot(nsigmaTOFPr, nsigmaTPCPr) < ConfPhiSelection.confTrackProtonNsigmaReject.value) { return true; } else { return false; @@ -1644,13 +1654,16 @@ struct FemtoUniverseProducerTask { } float phiPt = sumVec.Pt(); - if ((phiPt < ConfPhiSelection.confPtLowLimitPhi.value) || (phiPt > ConfPhiSelection.confPtHighLimitPhi.value)) { + if ((phiPt < ConfPhiSelection.confPhiPtLowLimit.value) || (phiPt > ConfPhiSelection.confPhiPtHighLimit.value)) { continue; } float phiPhi = RecoDecay::constrainAngle(sumVec.Phi(), 0); float phiM = sumVec.M(); + if ((phiM < ConfPhiSelection.confPhiInvMassLowLimit) || (phiM > ConfPhiSelection.confPhiInvMassUpLimit)) + continue; + phiCuts.fillQA(col, p1, p1, p2, 321, -321); ///\todo fill QA also for daughters int postrackID = p1.globalIndex(); From cb3e826c685ca0158c5273efe5a46f27f73650e8 Mon Sep 17 00:00:00 2001 From: altsybee Date: Mon, 17 Mar 2025 19:09:34 +0100 Subject: [PATCH 0724/1650] [DPG] Update timeDependentQa.cxx - additional configurables, fixes (#10534) --- DPG/Tasks/AOTEvent/timeDependentQa.cxx | 93 +++++++++++++++++--------- 1 file changed, 60 insertions(+), 33 deletions(-) diff --git a/DPG/Tasks/AOTEvent/timeDependentQa.cxx b/DPG/Tasks/AOTEvent/timeDependentQa.cxx index f1b8f6141bd..0b70149a284 100644 --- a/DPG/Tasks/AOTEvent/timeDependentQa.cxx +++ b/DPG/Tasks/AOTEvent/timeDependentQa.cxx @@ -54,9 +54,11 @@ const AxisSpec axisSparseDcaZ{100, -1., 1., "DCA_{z}, cm"}; struct TimeDependentQaTask { Configurable confTimeBinWidthInSec{"TimeBinWidthInSec", 0.25, "Width of time bins in seconds"}; // o2-linter: disable=name/configurable (temporary fix) Configurable confTakeVerticesWithUPCsettings{"ConsiderVerticesWithUPCsettings", 0, "Take vertices: 0 - all , 1 - only without UPC settings, 2 - only with UPC settings"}; // o2-linter: disable=name/configurable (temporary fix) - Configurable confFillPhiVsTimeHist{"FlagFillPhiVsTimeHist", 2, "0 - don't fill , 1 - fill only for global/7cls/TRD/TOF tracks, 2 - fill also layer-by-layer"}; // o2-linter: disable=name/configurable (temporary fix) - Configurable confFillEtaPhiVsTimeHist{"FlagFillEtaPhiVsTimeHist", 0, "0 - don't fill , 1 - fill"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confFlagFillPhiVsTimeHist{"FlagFillPhiVsTimeHist", 2, "0 - don't fill , 1 - fill only for global/7cls/TRD/TOF tracks, 2 - fill also layer-by-layer"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confFlagFillEtaPhiVsTimeHist{"FlagFillEtaPhiVsTimeHist", 0, "0 - don't fill , 1 - fill"}; // o2-linter: disable=name/configurable (temporary fix) Configurable confCutOnNtpcClsForSharedFractAndDeDxCalc{"CutOnNtpcClsForSharedFractAndDeDxCalc", 70, ""}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confFlagCheckMshape{"FlagCheckMshape", 0, "0 - don't check , 1 - check"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confFlagCheckQoverPtHist{"FlagCheckQoverPtHist", 1, "0 - don't check , 1 - check"}; // o2-linter: disable=name/configurable (temporary fix) enum EvSelBitsToMonitor { enCollisionsAll = 0, @@ -124,12 +126,14 @@ struct TimeDependentQaTask { ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); histos.add("allTracks/hQoverPt", "", kTH1F, {axisQoverPt}); + if (confFlagCheckQoverPtHist) { + histos.add("allTracks/hQoverPtDcaR", "", kTH2F, {axisSparseQoverPt, axisSparseDcaR}); + histos.add("allTracks/hQoverPtDcaZ", "", kTH2F, {axisSparseQoverPt, axisSparseDcaZ}); + } histos.add("allTracks/hDcaR", "", kTH1F, {axisDcaR}); histos.add("allTracks/hDcaZ", "", kTH1F, {axisDcaZ}); histos.add("allTracks/hDcaRafterCuts", "", kTH1F, {axisDcaR}); histos.add("allTracks/hDcaZafterCuts", "", kTH1F, {axisDcaZ}); - histos.add("allTracks/hQoverPtDcaR", "", kTH2F, {axisSparseQoverPt, axisSparseDcaR}); - histos.add("allTracks/hQoverPtDcaZ", "", kTH2F, {axisSparseQoverPt, axisSparseDcaZ}); histos.add("PVcontrib/hDcaRafterCuts", "", kTH1F, {axisDcaR}); histos.add("PVcontrib/hDcaZafterCuts", "", kTH1F, {axisDcaZ}); @@ -145,6 +149,8 @@ struct TimeDependentQaTask { histos.add("C/globalPV/hDcaZafterCuts", "", kTH1F, {axisDcaZ}); } + Preslice perCollision = aod::track::collisionId; + void processRun3( ColEvSels const& cols, BarrelTracks const& tracks, @@ -195,8 +201,9 @@ struct TimeDependentQaTask { histos.add("hSecondsOccupancyByFT0C", "", kTH1D, {axisSeconds}); // QA for UPC settings - histos.add("hSecondsUPCverticesBeforeSel8", "", kTH2F, {axisSeconds, {2, -0.5, 1.5, "Is vertex with UPC settings"}}); - histos.add("hSecondsUPCvertices", "", kTH2F, {axisSeconds, {2, -0.5, 1.5, "Is vertex with UPC settings after sel8"}}); + histos.add("hSecondsUPCverticesBeforeAllCuts", "", kTH2F, {axisSeconds, {2, -0.5, 1.5, "Is vertex with UPC settings"}}); + histos.add("hSecondsUPCverticesBeforeSel8", "", kTH2F, {axisSeconds, {2, -0.5, 1.5, "Is vertex with UPC settings after |vZ|<10 cut"}}); + histos.add("hSecondsUPCvertices", "", kTH2F, {axisSeconds, {2, -0.5, 1.5, "Is vertex with UPC settings after |vZ|<10 and sel8 cuts"}}); // ### QA event selection bits int nEvSelBits = enNumEvSelBits; @@ -277,14 +284,17 @@ struct TimeDependentQaTask { const AxisSpec axisNclsTPC{40, -0.5, 159.5, "n TPC cls"}; const AxisSpec axisFraction{20, 0, 1., "Fraction shared cls Tpc"}; histos.add("allTracks/hSecondsTracks", "", kTH1D, {axisSeconds}); - histos.add("allTracks/hSecondsQoverPtSumDcaR", "", kTH2D, {axisSeconds, axisSparseQoverPt}); - histos.add("allTracks/hSecondsQoverPtSumDcaZ", "", kTH2D, {axisSeconds, axisSparseQoverPt}); + if (confFlagCheckQoverPtHist) { + histos.add("allTracks/hSecondsQoverPtSumDcaR", "", kTH2D, {axisSeconds, axisSparseQoverPt}); + histos.add("allTracks/hSecondsQoverPtSumDcaZ", "", kTH2D, {axisSeconds, axisSparseQoverPt}); + } histos.add("allTracks/hSecondsSumDcaR", "", kTH1D, {axisSeconds}); histos.add("allTracks/hSecondsSumDcaZ", "", kTH1D, {axisSeconds}); histos.add("allTracks/hSecondsSumPt", "", kTH1D, {axisSeconds}); histos.add("allTracks/hSecondsNumClsIts", "", kTH2D, {axisSeconds, axisNclsITS}); histos.add("allTracks/hSecondsChi2NClIts", "", kTH1D, {axisSeconds}); - histos.add("allTracks/hSecondsTracksMshape", "", kTH1D, {axisSeconds}); + if (confFlagCheckMshape) + histos.add("allTracks/hSecondsTracksMshape", "", kTH1D, {axisSeconds}); // QA for PV contributors histos.add("PVcontrib/hSecondsTracks", "", kTH1D, {axisSeconds}); @@ -300,8 +310,10 @@ struct TimeDependentQaTask { // ### A side // global tracks histos.add("A/global/hSecondsNumTracks", "", kTH1D, {axisSeconds}); - histos.add("A/global/hSecondsQoverPtSumDcaR", "", kTH2D, {axisSeconds, axisSparseQoverPt}); - histos.add("A/global/hSecondsQoverPtSumDcaZ", "", kTH2D, {axisSeconds, axisSparseQoverPt}); + if (confFlagCheckQoverPtHist) { + histos.add("A/global/hSecondsQoverPtSumDcaR", "", kTH2D, {axisSeconds, axisSparseQoverPt}); + histos.add("A/global/hSecondsQoverPtSumDcaZ", "", kTH2D, {axisSeconds, axisSparseQoverPt}); + } histos.add("A/global/hSecondsSumDcaR", "", kTH1D, {axisSeconds}); histos.add("A/global/hSecondsSumDcaZ", "", kTH1D, {axisSeconds}); histos.add("A/global/hSecondsSumPt", "", kTH1D, {axisSeconds}); @@ -327,8 +339,10 @@ struct TimeDependentQaTask { // ### C side // global tracks histos.add("C/global/hSecondsNumTracks", "", kTH1D, {axisSeconds}); - histos.add("C/global/hSecondsQoverPtSumDcaR", "", kTH2D, {axisSeconds, axisSparseQoverPt}); - histos.add("C/global/hSecondsQoverPtSumDcaZ", "", kTH2D, {axisSeconds, axisSparseQoverPt}); + if (confFlagCheckQoverPtHist) { + histos.add("C/global/hSecondsQoverPtSumDcaR", "", kTH2D, {axisSeconds, axisSparseQoverPt}); + histos.add("C/global/hSecondsQoverPtSumDcaZ", "", kTH2D, {axisSeconds, axisSparseQoverPt}); + } histos.add("C/global/hSecondsSumDcaR", "", kTH1D, {axisSeconds}); histos.add("C/global/hSecondsSumDcaZ", "", kTH1D, {axisSeconds}); histos.add("C/global/hSecondsSumPt", "", kTH1D, {axisSeconds}); @@ -354,7 +368,7 @@ struct TimeDependentQaTask { // phi holes vs time const AxisSpec axisPhi{64, 0, TMath::TwoPi(), "#varphi"}; // o2-linter: disable=external-pi (temporary fix) const AxisSpec axisEta{10, -0.8, 0.8, "#eta"}; - if (confFillPhiVsTimeHist == 2) { + if (confFlagFillPhiVsTimeHist == 2) { histos.add("hSecondsITSlayer0vsPhi", "", kTH2F, {axisSeconds, axisPhi}); histos.add("hSecondsITSlayer1vsPhi", "", kTH2F, {axisSeconds, axisPhi}); histos.add("hSecondsITSlayer2vsPhi", "", kTH2F, {axisSeconds, axisPhi}); @@ -363,13 +377,13 @@ struct TimeDependentQaTask { histos.add("hSecondsITSlayer5vsPhi", "", kTH2F, {axisSeconds, axisPhi}); histos.add("hSecondsITSlayer6vsPhi", "", kTH2F, {axisSeconds, axisPhi}); } - if (confFillPhiVsTimeHist > 0) { + if (confFlagFillPhiVsTimeHist > 0) { histos.add("hSecondsITS7clsVsPhi", "", kTH2F, {axisSeconds, axisPhi}); histos.add("hSecondsITSglobalVsPhi", "", kTH2F, {axisSeconds, axisPhi}); histos.add("hSecondsITSTRDVsPhi", "", kTH2F, {axisSeconds, axisPhi}); histos.add("hSecondsITSTOFVsPhi", "", kTH2F, {axisSeconds, axisPhi}); } - if (confFillEtaPhiVsTimeHist) + if (confFlagFillEtaPhiVsTimeHist) histos.add("hSecondsITSglobalVsEtaPhi", "", kTH3F, {axisSeconds, axisEta, axisPhi}); } @@ -412,6 +426,8 @@ struct TimeDependentQaTask { if (col.selection_bit(kIsTriggerTVX) && col.selection_bit(kNoTimeFrameBorder)) histos.fill(HIST("hSecondsCollisionsTVXTFborderCutNoVzCut"), secFromSOR); + histos.fill(HIST("hSecondsUPCverticesBeforeAllCuts"), secFromSOR, isVertexUPC ? 1 : 0); + if (std::fabs(col.posZ()) > 10) continue; @@ -494,12 +510,16 @@ struct TimeDependentQaTask { histos.fill(HIST("hSecondsIR"), secFromSOR, hadronicRate); // checking mShape flags in time: - auto mShapeTree = ccdb->getForTimeStamp("TPC/Calib/MShapePotential", ts); - mshape.setFromTree(*mShapeTree); - bool isMshape = !mshape.getBoundaryPotential(ts).mPotential.empty(); + bool isMshape = false; + if (confFlagCheckMshape) { + auto mShapeTree = ccdb->getForTimeStamp("TPC/Calib/MShapePotential", ts); + mshape.setFromTree(*mShapeTree); + isMshape = !mshape.getBoundaryPotential(ts).mPotential.empty(); + } // ##### track loop - for (const auto& track : tracks) { + auto tracksGrouped = tracks.sliceBy(perCollision, col.globalIndex()); + for (const auto& track : tracksGrouped) { // if (!track.hasTPC() || !track.hasITS()) // continue; if (std::fabs(track.eta()) > 0.8 || std::fabs(track.pt()) < 0.2) @@ -522,9 +542,10 @@ struct TimeDependentQaTask { double qpt = track.signed1Pt(); histos.fill(HIST("allTracks/hQoverPt"), qpt); - histos.fill(HIST("allTracks/hQoverPtDcaR"), qpt, dcaR); - histos.fill(HIST("allTracks/hQoverPtDcaZ"), qpt, dcaZ); - + if (confFlagCheckQoverPtHist) { + histos.fill(HIST("allTracks/hQoverPtDcaR"), qpt, dcaR); + histos.fill(HIST("allTracks/hQoverPtDcaZ"), qpt, dcaZ); + } // now consider only abs values for DCAs: double dcaRabs = std::fabs(dcaR); double dcaZabs = std::fabs(dcaZ); @@ -532,11 +553,13 @@ struct TimeDependentQaTask { histos.fill(HIST("allTracks/hSecondsSumDcaR"), secFromSOR, dcaRabs); histos.fill(HIST("allTracks/hSecondsSumDcaZ"), secFromSOR, dcaZabs); histos.fill(HIST("allTracks/hSecondsSumPt"), secFromSOR, track.pt()); - histos.fill(HIST("allTracks/hSecondsQoverPtSumDcaR"), secFromSOR, qpt, dcaRabs); - histos.fill(HIST("allTracks/hSecondsQoverPtSumDcaZ"), secFromSOR, qpt, dcaZabs); + if (confFlagCheckQoverPtHist) { + histos.fill(HIST("allTracks/hSecondsQoverPtSumDcaR"), secFromSOR, qpt, dcaRabs); + histos.fill(HIST("allTracks/hSecondsQoverPtSumDcaZ"), secFromSOR, qpt, dcaZabs); + } histos.fill(HIST("allTracks/hSecondsNumClsIts"), secFromSOR, track.itsNCls()); histos.fill(HIST("allTracks/hSecondsChi2NClIts"), secFromSOR, track.itsChi2NCl()); - if (isMshape) { + if (confFlagCheckMshape && isMshape) { histos.fill(HIST("allTracks/hSecondsTracksMshape"), secFromSOR); } @@ -563,8 +586,10 @@ struct TimeDependentQaTask { histos.fill(HIST("A/global/hDcaZafterCuts"), dcaZ); histos.fill(HIST("A/global/hSecondsNumTracks"), secFromSOR); - histos.fill(HIST("A/global/hSecondsQoverPtSumDcaR"), secFromSOR, qpt, dcaRabs); - histos.fill(HIST("A/global/hSecondsQoverPtSumDcaZ"), secFromSOR, qpt, dcaZabs); + if (confFlagCheckQoverPtHist) { + histos.fill(HIST("A/global/hSecondsQoverPtSumDcaR"), secFromSOR, qpt, dcaRabs); + histos.fill(HIST("A/global/hSecondsQoverPtSumDcaZ"), secFromSOR, qpt, dcaZabs); + } histos.fill(HIST("A/global/hSecondsSumDcaR"), secFromSOR, dcaRabs); histos.fill(HIST("A/global/hSecondsSumDcaZ"), secFromSOR, dcaZabs); histos.fill(HIST("A/global/hSecondsSumPt"), secFromSOR, track.pt()); @@ -601,8 +626,10 @@ struct TimeDependentQaTask { histos.fill(HIST("C/global/hDcaZafterCuts"), dcaZ); histos.fill(HIST("C/global/hSecondsNumTracks"), secFromSOR); - histos.fill(HIST("C/global/hSecondsQoverPtSumDcaR"), secFromSOR, qpt, dcaRabs); - histos.fill(HIST("C/global/hSecondsQoverPtSumDcaZ"), secFromSOR, qpt, dcaZabs); + if (confFlagCheckQoverPtHist) { + histos.fill(HIST("C/global/hSecondsQoverPtSumDcaR"), secFromSOR, qpt, dcaRabs); + histos.fill(HIST("C/global/hSecondsQoverPtSumDcaZ"), secFromSOR, qpt, dcaZabs); + } histos.fill(HIST("C/global/hSecondsSumDcaR"), secFromSOR, dcaRabs); histos.fill(HIST("C/global/hSecondsSumDcaZ"), secFromSOR, dcaZabs); histos.fill(HIST("C/global/hSecondsSumPt"), secFromSOR, track.pt()); @@ -640,7 +667,7 @@ struct TimeDependentQaTask { // study ITS cluster pattern vs phi vs time (pt>1 GeV/c cut selects straight tracks) if (track.isPVContributor() && track.pt() > 1) { // layer-by-layer check - if (confFillPhiVsTimeHist == 2) { + if (confFlagFillPhiVsTimeHist == 2) { if (track.itsClusterMap() & (1 << 0)) histos.fill(HIST("hSecondsITSlayer0vsPhi"), secFromSOR, track.phi()); if (track.itsClusterMap() & (1 << 1)) @@ -657,7 +684,7 @@ struct TimeDependentQaTask { histos.fill(HIST("hSecondsITSlayer6vsPhi"), secFromSOR, track.phi()); } // tracks with conditions - if (confFillPhiVsTimeHist > 0) { + if (confFlagFillPhiVsTimeHist > 0) { if (track.itsNCls() == 7) histos.fill(HIST("hSecondsITS7clsVsPhi"), secFromSOR, track.phi()); if (track.isGlobalTrack()) @@ -668,7 +695,7 @@ struct TimeDependentQaTask { histos.fill(HIST("hSecondsITSTOFVsPhi"), secFromSOR, track.phi()); } // eta-phi histogram for global tracks - if (confFillEtaPhiVsTimeHist && track.isGlobalTrack()) { + if (confFlagFillEtaPhiVsTimeHist && track.isGlobalTrack()) { histos.fill(HIST("hSecondsITSglobalVsEtaPhi"), secFromSOR, track.eta(), track.phi()); } } From 91fa737881f0b33cc44d9c9bd76c6b3e993ea815 Mon Sep 17 00:00:00 2001 From: abilandz Date: Mon, 17 Mar 2025 19:20:05 +0100 Subject: [PATCH 0725/1650] [PWGCF] - improved memory management based on valgrind + massif profiling (#10533) --- .../Core/MuPa-Configurables.h | 185 ++--- .../Core/MuPa-DataMembers.h | 49 +- .../Core/MuPa-Enums.h | 26 +- .../Core/MuPa-MemberFunctions.h | 678 +++++++++++++++--- .../Tasks/multiparticle-correlations-ab.cxx | 3 + 5 files changed, 730 insertions(+), 211 deletions(-) diff --git a/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h b/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h index 785a62ff62e..90ad11ed80a 100644 --- a/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h +++ b/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h @@ -19,8 +19,8 @@ // *) Task configuration: struct : ConfigurableGroup { // std::string prefix = "Task configuration"; // AA: now these configurables also appear grouped on hyperloop => TBI 20240522 check if this work, and if further modifications in init are needed - Configurable cfTaskIsConfiguredFromJson{"cfTaskIsConfiguredFromJson", "no", "always set manaully to \"yes\" via JSON, merely to ensure that settings are not ignored silently"}; - Configurable cfTaskName{"cfTaskName", "Default task name", "set task name - use eventually to determine weights for this task"}; + Configurable cfTaskIsConfiguredFromJson{"cfTaskIsConfiguredFromJson", "no", "always set manaully to \"yes\" via JSON, merely to ensure that settings are not ignored silently"}; + Configurable cfTaskName{"cfTaskName", "Default task name", "set task name - use eventually to determine weights for this task"}; Configurable cfDryRun{"cfDryRun", false, "book all histos and run without storing and calculating anything"}; Configurable cfVerbose{"cfVerbose", false, "run or not in verbose mode (but not for simple utility functions or function calls per particle)"}; Configurable cfVerboseUtility{"cfVerboseUtility", false, "run or not in verbose mode, also for simple utility functions (but not for function calls per particle)"}; @@ -37,8 +37,8 @@ struct : ConfigurableGroup { Configurable cfFloatingPointPrecision{"cfFloatingPointPrecision", 0.000001, "two floats are the same if TMath::Abs(f1 - f2) < fFloatingPointPrecision"}; Configurable cfSequentialBailout{"cfSequentialBailout", 0, "if fSequentialBailout > 0, then each fSequentialBailout events the function BailOut() is called. Can be used for real analysis and for IV"}; Configurable cfUseSpecificCuts{"cfUseSpecificCuts", false, "if true, analysis-specific cuts set via configurable cfWhichSpecificCuts are applied after DefaultCuts(). "}; - Configurable cfWhichSpecificCuts{"cfWhichSpecificCuts", "some supported set of analysis-specific cuts (e.g. LHC23zzh, ...)", "determine which set of analysis-specific cuts will be applied after DefaultCuts(). Use in combination with tc.fUseSpecificCuts"}; - + Configurable cfWhichSpecificCuts{"cfWhichSpecificCuts", "some supported set of analysis-specific cuts (e.g. LHC23zzh, ...)", "determine which set of analysis-specific cuts will be applied after DefaultCuts(). Use in combination with tc.fUseSpecificCuts"}; + Configurable cfSkipTheseRuns{"cfSkipTheseRuns", "", "Set here via comma-separated list which runs will be skipped during hl analysis (a.k.a. \"bad runs\"). Leave empty to ignore. Example format and list for LHC23zzh: \"544116,544091\""}; } cf_tc; // *) QA: @@ -46,55 +46,60 @@ struct : ConfigurableGroup { Configurable cfCheckUnderflowAndOverflow{"cfCheckUnderflowAndOverflow", false, "check and bail out if in event and particle histograms there are entries which went to underflow or overflow bins (use only locally)"}; Configurable cfRebin{"cfRebin", 1, "number of bins of selected heavy 2D histograms are devided with this number"}; Configurable cfFillQAEventHistograms2D{"cfFillQAEventHistograms2D", false, "if false, all QA 2D event histograms are not filled. if true, only the ones for which fBookQAEventHistograms2D[...] is true, are filled"}; - Configurable> cfBookQAEventHistograms2D{"cfBookQAEventHistograms2D", {"1-Multiplicity_vs_ReferenceMultiplicity", "1-Multiplicity_vs_NContributors", "1-Multiplicity_vs_Centrality", "1-Multiplicity_vs_Vertex_z", "1-Multiplicity_vs_Occupancy", "1-ReferenceMultiplicity_vs_NContributors", "1-ReferenceMultiplicity_vs_Centrality", "1-ReferenceMultiplicity_vs_Vertex_z", "1-ReferenceMultiplicity_vs_Occupancy", "1-NContributors_vs_Centrality", "1-NContributors_vs_Vertex_z", "1-NContributors_vs_Occupancy", "1-Centrality_vs_Vertex_z", "1-Centrality_vs_Occupancy", "0-Centrality_vs_ImpactParameter", "1-Vertex_z_vs_Occupancy", "0-MultNTracksPV_vs_MultNTracksGlobal", "1-CentFT0C_vs_CentFT0CVariant1", "1-CentFT0C_vs_CentFT0M", "1-CentFT0C_vs_CentFV0A", "0-CentFT0C_vs_CentNTPV", "0-CentFT0C_vs_CentNGlobal", "0-CentFT0M_vs_CentNTPV", "0-CentRun2V0M_vs_CentRun2SPDTracklets", "1-TrackOccupancyInTimeRange_vs_FT0COccupancyInTimeRange", "1-CurrentRunDuration_vs_InteractionRate"}, "book (1) or do not book (0) this QA 2D event histogram"}; + Configurable> cfBookQAEventHistograms2D{"cfBookQAEventHistograms2D", {"1-Multiplicity_vs_ReferenceMultiplicity", "1-Multiplicity_vs_NContributors", "1-Multiplicity_vs_Centrality", "1-Multiplicity_vs_Vertex_z", "1-Multiplicity_vs_Occupancy", "1-ReferenceMultiplicity_vs_NContributors", "1-ReferenceMultiplicity_vs_Centrality", "1-ReferenceMultiplicity_vs_Vertex_z", "1-ReferenceMultiplicity_vs_Occupancy", "1-NContributors_vs_Centrality", "1-NContributors_vs_Vertex_z", "1-NContributors_vs_Occupancy", "1-Centrality_vs_Vertex_z", "1-Centrality_vs_Occupancy", "0-Centrality_vs_ImpactParameter", "1-Vertex_z_vs_Occupancy", "0-MultNTracksPV_vs_MultNTracksGlobal", "1-CentFT0C_vs_CentFT0CVariant1", "1-CentFT0C_vs_CentFT0M", "1-CentFT0C_vs_CentFV0A", "0-CentFT0C_vs_CentNTPV", "0-CentFT0C_vs_CentNGlobal", "0-CentFT0M_vs_CentNTPV", "0-CentRun2V0M_vs_CentRun2SPDTracklets", "1-TrackOccupancyInTimeRange_vs_FT0COccupancyInTimeRange", "1-CurrentRunDuration_vs_InteractionRate"}, "book (1) or do not book (0) this QA 2D event histogram"}; Configurable cfFillQAParticleHistograms2D{"cfFillQAParticleHistograms2D", false, "if false, all QA 2D particle histograms are not filled. if true, only the ones for which fBookQAParticleHistograms2D[...] is true, are filled"}; - Configurable> cfBookQAParticleHistograms2D{"cfBookQAParticleHistograms2D", {"1-Pt_vs_dcaXY"}, "book (1) or do not book (0) this QA 2D particle histogram"}; + Configurable> cfBookQAParticleHistograms2D{"cfBookQAParticleHistograms2D", {"1-Pt_vs_dcaXY"}, "book (1) or do not book (0) this QA 2D particle histogram"}; Configurable cfFillQAParticleEventHistograms2D{"cfFillQAParticleEventHistograms2D", false, "if false, all QA 2D particle event histograms are not filled. if true, only the ones for which fBookQAParticleEventHistograms2D[...] is true, are filled"}; - Configurable> cfBookQAParticleEventHistograms2D{"cfBookQAParticleEventHistograms2D", {"1-CurrentRunDuration_vs_itsNCls", "1-CurrentRunDuration_vs_itsNClsNegEtaEbyE", "1-CurrentRunDuration_vs_itsNClsPosEtaEbyE", "1-CurrentRunDuration_vs_Eta0804EbyE", "1-CurrentRunDuration_vs_Eta0400EbyE", "1-CurrentRunDuration_vs_Eta0004EbyE", "1-CurrentRunDuration_vs_Eta0408EbyE", "1-CurrentRunDuration_vs_Pt0005EbyE", "1-CurrentRunDuration_vs_Pt0510EbyE", "1-CurrentRunDuration_vs_Pt1050EbyE"}, "book (1) or do not book (0) this QA 2D particle event histogram"}; + Configurable> cfBookQAParticleEventHistograms2D{"cfBookQAParticleEventHistograms2D", {"1-CurrentRunDuration_vs_itsNCls", "1-CurrentRunDuration_vs_itsNClsNegEtaEbyE", "1-CurrentRunDuration_vs_itsNClsPosEtaEbyE", "1-CurrentRunDuration_vs_Eta0804EbyE", "1-CurrentRunDuration_vs_Eta0400EbyE", "1-CurrentRunDuration_vs_Eta0004EbyE", "1-CurrentRunDuration_vs_Eta0408EbyE", "1-CurrentRunDuration_vs_Pt0005EbyE", "1-CurrentRunDuration_vs_Pt0510EbyE", "1-CurrentRunDuration_vs_Pt1050EbyE"}, "book (1) or do not book (0) this QA 2D particle event histogram"}; - Configurable cfFillQACorrelationsVsHistograms2D{"cfFillQACorrelationsVsHistograms2D", true, "if false, all QA 2D histograms of this category are not filled. if true, only the ones for which fBookQACorrelationsVsHistograms2D[...] is true, are filled"}; + Configurable cfFillQACorrelationsVsHistograms2D{"cfFillQACorrelationsVsHistograms2D", false, "if false, all QA 2D histograms of this category are not filled. if true, only the ones for which fBookQACorrelationsVsHistograms2D[...] is true, are filled"}; Configurable> cfBookQACorrelationsVsHistograms2D{"cfBookQACorrelationsVsHistograms2D", {"1-Correlations_vs_Multiplicity", "1-Correlations_vs_ReferenceMultiplicity", "1-Correlations_vs_Centrality", "1-Correlations_vs_Phi", "1-Correlations_vs_Pt", "1-Correlations_vs_Eta"}, "book (1) or do not book (0) this QA 2D histogram"}; - Configurable> cfQACorrelationsVsHistogramsMinMaxHarmonic{"cfQACorrelationsVsHistogramsMinMaxHarmonic", {1, 5}, "harmonics are filled for min <= harmonic < max"}; + Configurable> cfQACorrelationsVsHistogramsMinMaxHarmonic{"cfQACorrelationsVsHistogramsMinMaxHarmonic", {1, 5}, "harmonics are filled for min <= harmonic < max"}; + + Configurable cfFillQACorrelationsVsInteractionRateVsProfiles2D{"cfFillQACorrelationsVsInteractionRateVsProfiles2D", false, "if false, all QA 2D profiles of this category are not filled. if true, only the ones for which fBookQACorrelationsVsInteractionRateVsProfiles2D[...] is true, are filled"}; + Configurable> cfBookQACorrelationsVsInteractionRateVsProfiles2D{"cfBookQACorrelationsVsInteractionRateVsProfiles2D", {"1-CorrVsIR_vs_CurrentRunDuration", "1-CorrVsIR_vs_Multiplicity", "1-CorrVsIR_vs_ReferenceMultiplicity", "1-CorrVsIR_vs_Centrality", "1-CorrVsIR_vs_MeanPhi", "1-CorrVsIR_vs_SigmaMeanPhi", "1-CorrVsIR_vs_MeanPt", "1-CorrVsIR_vs_SigmaMeanPt", "1-CorrVsIR_vs_MeanEta", "1-CorrVsIR_vs_SigmaMeanEta"}, "book (1) or do not book (0) this QA 2D profile"}; + Configurable> cfQACorrelationsVsInteractionRateVsProfilesMinMaxHarmonic{"cfQACorrelationsVsInteractionRateVsProfilesMinMaxHarmonic", {1, 5}, "harmonics are filled for min <= harmonic < max"}; + } cf_qa; // *) Event histograms: struct : ConfigurableGroup { Configurable cfFillEventHistograms{"cfFillEventHistograms", true, "if false, all event histograms are not filled. if true, only the ones for which fBookEventHistograms[...] is true, are filled"}; - Configurable> cfBookEventHistograms{"cfBookEventHistograms", {"1-NumberOfEvents", "1-TotalMultiplicity", "1-Multiplicity", "1-ReferenceMultiplicity", "1-Centrality", "1-Vertex_x", "1-Vertex_y", "1-Vertex_z", "1-NContributors", "0-ImpactParameter", "0-EventPlaneAngle", "1-Occupancy", "1-InteractionRate", "1-CurrentRunDuration", "0-MultMCNParticlesEta08"}, "Book (1) or do not book (0) event histogram"}; + Configurable> cfBookEventHistograms{"cfBookEventHistograms", {"1-NumberOfEvents", "1-TotalMultiplicity", "1-Multiplicity", "1-ReferenceMultiplicity", "1-Centrality", "1-Vertex_x", "1-Vertex_y", "1-Vertex_z", "1-NContributors", "0-ImpactParameter", "0-EventPlaneAngle", "1-Occupancy", "1-InteractionRate", "1-CurrentRunDuration", "0-MultMCNParticlesEta08"}, "Book (1) or do not book (0) event histogram"}; } cf_eh; // *) Event cuts: struct : ConfigurableGroup { - Configurable> cfUseEventCuts{"cfUseEventCuts", {"1-NumberOfEvents", "1-TotalMultiplicity", "1-Multiplicity", "1-ReferenceMultiplicity", "1-Centrality", "1-Vertex_x", "1-Vertex_y", "1-Vertex_z", "1-NContributors", "1-ImpactParameter", "0-EventPlaneAngle", "1-Occupancy", "1-InteractionRate", "1-CurrentRunDuration", "0-MultMCNParticlesEta08", "0-Trigger", "0-Sel7", "1-Sel8", "1-MultiplicityEstimator", "1-ReferenceMultiplicityEstimator", "1-CentralityEstimator", "1-SelectedEvents", "1-NoSameBunchPileup", "1-IsGoodZvtxFT0vsPV", "1-IsVertexITSTPC", "1-IsVertexTOFmatched", "1-IsVertexTRDmatched", "0-NoCollInTimeRangeStrict", "0-NoCollInTimeRangeStandard", "0-NoCollInRofStrict", "0-NoCollInRofStandard", "0-NoHighMultCollInPrevRof", "0-IsGoodITSLayer3", "0-IsGoodITSLayer0123", "0-IsGoodITSLayersAll", "1-OccupancyEstimator", "1-MinVertexDistanceFromIP", "1-CentralityWeights"}, "use (1) or do not use (0) event cuts"}; + Configurable> cfUseEventCuts{"cfUseEventCuts", {"1-NumberOfEvents", "1-TotalMultiplicity", "1-Multiplicity", "1-ReferenceMultiplicity", "1-Centrality", "1-Vertex_x", "1-Vertex_y", "1-Vertex_z", "1-NContributors", "1-ImpactParameter", "0-EventPlaneAngle", "1-Occupancy", "1-InteractionRate", "1-CurrentRunDuration", "0-MultMCNParticlesEta08", "0-Trigger", "0-Sel7", "1-Sel8", "1-MultiplicityEstimator", "1-ReferenceMultiplicityEstimator", "1-CentralityEstimator", "1-SelectedEvents", "1-NoSameBunchPileup", "1-IsGoodZvtxFT0vsPV", "1-IsVertexITSTPC", "1-IsVertexTOFmatched", "1-IsVertexTRDmatched", "0-NoCollInTimeRangeStrict", "0-NoCollInTimeRangeStandard", "0-NoCollInRofStrict", "0-NoCollInRofStandard", "0-NoHighMultCollInPrevRof", "0-IsGoodITSLayer3", "0-IsGoodITSLayer0123", "0-IsGoodITSLayersAll", "1-OccupancyEstimator", "1-MinVertexDistanceFromIP", "1-CentralityWeights"}, "use (1) or do not use (0) event cuts"}; Configurable cfUseEventCutCounterAbsolute{"cfUseEventCutCounterAbsolute", false, "profile and save how many times each event cut counter triggered (absolute). Use with care, as this is computationally heavy"}; Configurable cfUseEventCutCounterSequential{"cfUseEventCutCounterSequential", false, "profile and save how many times each event cut counter triggered (sequential). Use with care, as this is computationally heavy"}; Configurable cfPrintCutCounterContent{"cfPrintCutCounterContent", false, "if true, prints on the screen after each event the content of fEventCutCounterHist[*][*] (all which were booked)"}; // Remark: Preserve below the same ordering as in enum's eEventHistograms + eEventCuts. In hyperloop, in any case this ordering is lost, because there it's alphabetical TBI 20240521 check this, after I added now std::string prefix thingie - Configurable> cfNumberOfEvents{"cfNumberOfEvents", {-1, 1000000000}, "total number of events to process (whether or not they survive event cuts): {min, max}, with convention: min <= N < max"}; - Configurable> cfTotalMultiplicity{"cfTotalMultiplicity", {-1, 1000000000}, "total multiplicity range: {min, max}, with convention: min <= M < max"}; - Configurable> cfMultiplicity{"cfMultiplicity", {-1., 1000000000.}, "multiplicity (defined via cfMultiplicityEstimator) range {min, max}, with convention: min <= M < max"}; - Configurable> cfReferenceMultiplicity{"cfReferenceMultiplicity", {-1., 1000000000.}, "reference multiplicity (defined via cfReferenceMultiplicityEstimator) range {min, max}, with convention: min <= M < max"}; - Configurable> cfCentrality{"cfCentrality", {-10., 110.}, "centrality range: {min, max}, with convention: min <= cent < max"}; - Configurable> cfVertex_x{"cfVertex_x", {-10., 10.}, "vertex x position range: {min, max}[cm], with convention: min <= Vx < max"}; - Configurable> cfVertex_y{"cfVertex_y", {-10., 10.}, "vertex y position range: {min, max}[cm], with convention: min <= Vy < max"}; - Configurable> cfVertex_z{"cfVertex_z", {-10, 10.}, "vertex z position range: {min, max}[cm], with convention: min <= Vz < max"}; + Configurable> cfNumberOfEvents{"cfNumberOfEvents", {-1, 1000000000}, "total number of events to process (whether or not they survive event cuts): {min, max}, with convention: min <= N < max"}; + Configurable> cfTotalMultiplicity{"cfTotalMultiplicity", {-1, 1000000000}, "total multiplicity range: {min, max}, with convention: min <= M < max"}; + Configurable> cfMultiplicity{"cfMultiplicity", {-1., 1000000000.}, "multiplicity (defined via cfMultiplicityEstimator) range {min, max}, with convention: min <= M < max"}; + Configurable> cfReferenceMultiplicity{"cfReferenceMultiplicity", {-1., 1000000000.}, "reference multiplicity (defined via cfReferenceMultiplicityEstimator) range {min, max}, with convention: min <= M < max"}; + Configurable> cfCentrality{"cfCentrality", {-10., 110.}, "centrality range: {min, max}, with convention: min <= cent < max"}; + Configurable> cfVertex_x{"cfVertex_x", {-10., 10.}, "vertex x position range: {min, max}[cm], with convention: min <= Vx < max"}; + Configurable> cfVertex_y{"cfVertex_y", {-10., 10.}, "vertex y position range: {min, max}[cm], with convention: min <= Vy < max"}; + Configurable> cfVertex_z{"cfVertex_z", {-10, 10.}, "vertex z position range: {min, max}[cm], with convention: min <= Vz < max"}; Configurable cfMinVertexDistanceFromIP{"cfMinVertexDistanceFromIP", {0.000001}, "if sqrt(vx^2+vy^2+vz^2) < cfMinVertexDistanceFromIP [cm], the event is reject. IP = nominal Interaction Point."}; - Configurable> cfNContributors{"cfNContributors", {2, 1000000000}, "Number of vertex contributors: {min, max}, with convention: min <= N < max"}; - Configurable> cfImpactParameter{"cfImpactParameter", {-1, 1000000000}, "Impact parameter range (can be used only for sim): {min, max}, with convention: min <= IP < max"}; - Configurable> cfEventPlaneAngle{"cfEventPlaneAngle", {-o2::constants::math::PI, o2::constants::math::TwoPI}, "Event Plane Angle range (can be used only for sim): {min, max}, with convention: min <= EP < max"}; - Configurable> cfOccupancy{"cfOccupancy", {-0.0001, 1000000000}, "Range for occupancy (use cfOccupancyEstimator to set specific estimator): {min, max}, with convention: min <= X < max. Important: remember that 0. has to be included, therefore I set -0.0001 by default for low edge"}; - Configurable> cfInteractionRate{"cfInteractionRate", {0., 1000000000.}, "Range for interaction rate: {min, max}, with convention: min <= X < max"}; - Configurable> cfCurrentRunDuration{"cfCurrentRunDuration", {-2, 1000000000}, "Range for current run duration (i.e. seconds since start of run) in seconds: {min, max}, with convention: min <= X < max. Only collisions taken in this range (measured from SOR) are taken for analysis"}; - Configurable> cfMultMCNParticlesEta08{"cfMultMCNParticlesEta08", {-1, 1000000000}, "Range for MultMCNParticlesEta08 : {min, max}, with convention: min <= X < max"}; - Configurable cfTrigger{"cfTrigger", "some supported trigger (e.g. INT7 for Run 2, TVXinTRD for Run 3, etc...)", "set here some supported trigger"}; + Configurable> cfNContributors{"cfNContributors", {2, 1000000000}, "Number of vertex contributors: {min, max}, with convention: min <= N < max"}; + Configurable> cfImpactParameter{"cfImpactParameter", {-1, 1000000000}, "Impact parameter range (can be used only for sim): {min, max}, with convention: min <= IP < max"}; + Configurable> cfEventPlaneAngle{"cfEventPlaneAngle", {-o2::constants::math::PI, o2::constants::math::TwoPI}, "Event Plane Angle range (can be used only for sim): {min, max}, with convention: min <= EP < max"}; + Configurable> cfOccupancy{"cfOccupancy", {-0.0001, 1000000000}, "Range for occupancy (use cfOccupancyEstimator to set specific estimator): {min, max}, with convention: min <= X < max. Important: remember that 0. has to be included, therefore I set -0.0001 by default for low edge"}; + Configurable> cfInteractionRate{"cfInteractionRate", {0., 1000000000.}, "Range for interaction rate: {min, max}, with convention: min <= X < max"}; + Configurable> cfCurrentRunDuration{"cfCurrentRunDuration", {-2, 1000000000}, "Range for current run duration (i.e. seconds since start of run) in seconds: {min, max}, with convention: min <= X < max. Only collisions taken in this range (measured from SOR) are taken for analysis"}; + Configurable> cfMultMCNParticlesEta08{"cfMultMCNParticlesEta08", {-1, 1000000000}, "Range for MultMCNParticlesEta08 : {min, max}, with convention: min <= X < max"}; + Configurable cfTrigger{"cfTrigger", "some supported trigger (e.g. INT7 for Run 2, TVXinTRD for Run 3, etc...)", "set here some supported trigger"}; Configurable cfUseSel7{"cfUseSel7", false, "use for Run 1 and 2 data and MC (see official doc)"}; Configurable cfUseSel8{"cfUseSel8", false, "use for Run 3 data and MC (see official doc)"}; - Configurable cfMultiplicityEstimator{"cfMultiplicityEstimator", "SelectedTracks", "all results vs. mult are calculated against this multiplicity. Can be set to SelectedTracks (calculated internally), ReferenceMultiplicity (calculated outside of my code), etc."}; - // Configurable cfReferenceMultiplicityEstimator{"cfReferenceMultiplicityEstimator", "some supported option for ref. mult. (MultFT0C, MultFV0M, MultTPC, etc.)", "Reference multiplicity, calculated outside of my code. Can be MultFT0C, MultFV0M, MultTPC, etc."}; - Configurable cfReferenceMultiplicityEstimator{"cfReferenceMultiplicityEstimator", "MultFT0C", "Reference multiplicity, calculated outside of my code. Can be MultFT0C, MultFV0M, MultTPC, etc."}; - // Configurable cfCentralityEstimator{"cfCentralityEstimator", "some supported centrality estimator (e.g. CentFT0C, ...)", "set here some supported centrality estimator (CentFT0C, CentFT0M, CentFV0A, CentNTPV, ... for Run 3, and CentRun2V0M, CentRun2SPDTracklets, ..., for Run 2 and 1) "}; - Configurable cfCentralityEstimator{"cfCentralityEstimator", "CentFT0C", "set here some supported centrality estimator (CentFT0C, CentFT0M, CentFV0A, CentNTPV, ... for Run 3, and CentRun2V0M, CentRun2SPDTracklets, ..., for Run 2 and 1) "}; - Configurable> cfSelectedEvents{"cfSelectedEvents", {-1, 1000000000}, "Selected number of events to process (i.e. only events which survive event cuts): {min, max}, with convention: min <= N < max"}; + Configurable cfMultiplicityEstimator{"cfMultiplicityEstimator", "SelectedTracks", "all results vs. mult are calculated against this multiplicity. Can be set to SelectedTracks (calculated internally), ReferenceMultiplicity (calculated outside of my code), etc."}; + // Configurable cfReferenceMultiplicityEstimator{"cfReferenceMultiplicityEstimator", "some supported option for ref. mult. (MultFT0C, MultFV0M, MultTPC, etc.)", "Reference multiplicity, calculated outside of my code. Can be MultFT0C, MultFV0M, MultTPC, etc."}; + Configurable cfReferenceMultiplicityEstimator{"cfReferenceMultiplicityEstimator", "MultFT0C", "Reference multiplicity, calculated outside of my code. Can be MultFT0C, MultFV0M, MultTPC, etc."}; + // Configurable cfCentralityEstimator{"cfCentralityEstimator", "some supported centrality estimator (e.g. CentFT0C, ...)", "set here some supported centrality estimator (CentFT0C, CentFT0M, CentFV0A, CentNTPV, ... for Run 3, and CentRun2V0M, CentRun2SPDTracklets, ..., for Run 2 and 1) "}; + Configurable cfCentralityEstimator{"cfCentralityEstimator", "CentFT0C", "set here some supported centrality estimator (CentFT0C, CentFT0M, CentFV0A, CentNTPV, ... for Run 3, and CentRun2V0M, CentRun2SPDTracklets, ..., for Run 2 and 1) "}; + Configurable> cfSelectedEvents{"cfSelectedEvents", {-1, 1000000000}, "Selected number of events to process (i.e. only events which survive event cuts): {min, max}, with convention: min <= N < max"}; Configurable cfUseNoSameBunchPileup{"cfUseNoSameBunchPileup", false, "TBI 20240521 explanation"}; Configurable cfUseIsGoodZvtxFT0vsPV{"cfUseIsGoodZvtxFT0vsPV", false, "TBI 20240521 explanation"}; Configurable cfUseIsVertexITSTPC{"cfUseIsVertexITSTPC", false, "TBI 20240521 explanation"}; @@ -108,43 +113,43 @@ struct : ConfigurableGroup { Configurable cfUseIsGoodITSLayer3{"cfUseIsGoodITSLayer3", false, "TBI 20241220 explanation (or see enum)"}; Configurable cfUseIsGoodITSLayer0123{"cfUseIsGoodITSLayer0123", false, "TBI 20241220 explanation (or see enum)"}; Configurable cfUseIsGoodITSLayersAll{"cfUseIsGoodITSLayersAll", false, "TBI 20241220 explanation (or see enum)"}; - Configurable cfOccupancyEstimator{"cfOccupancyEstimator", "FT0COccupancyInTimeRange", "set here some supported occupancy estimator (TrackOccupancyInTimeRange, FT0COccupancyInTimeRange, ..."}; + Configurable cfOccupancyEstimator{"cfOccupancyEstimator", "FT0COccupancyInTimeRange", "set here some supported occupancy estimator (TrackOccupancyInTimeRange, FT0COccupancyInTimeRange, ..."}; } cf_ec; // *) Particle histograms: struct : ConfigurableGroup { Configurable cfFillParticleHistograms{"cfFillParticleHistograms", true, "if false, all 1D particle histograms are not filled. if kTRUE, the ones for which fBookParticleHistograms[...] is kTRUE, are filled"}; - Configurable> cfBookParticleHistograms{"cfBookParticleHistograms", {"1-Phi", "1-Pt", "1-Eta", "1-Charge", "1-tpcNClsFindable", "1-tpcNClsShared", "1-itsChi2NCl", "1-tpcNClsFound", "1-tpcNClsCrossedRows", "1-itsNCls", "1-itsNClsInnerBarrel", "1-tpcCrossedRowsOverFindableCls", "1-tpcFoundOverFindableCls", "1-tpcFractionSharedCls", "1-tpcChi2NCl", "1-dcaXY", "1-dcaZ", "0-PDG"}, "Book (1) or do not book (0) particle histogram"}; + Configurable> cfBookParticleHistograms{"cfBookParticleHistograms", {"1-Phi", "1-Pt", "1-Eta", "1-Charge", "1-tpcNClsFindable", "1-tpcNClsShared", "1-itsChi2NCl", "1-tpcNClsFound", "1-tpcNClsCrossedRows", "1-itsNCls", "1-itsNClsInnerBarrel", "1-tpcCrossedRowsOverFindableCls", "1-tpcFoundOverFindableCls", "1-tpcFractionSharedCls", "1-tpcChi2NCl", "1-dcaXY", "1-dcaZ", "0-PDG"}, "Book (1) or do not book (0) particle histogram"}; Configurable cfFillParticleHistograms2D{"cfFillParticleHistograms2D", false, "if false, all 2D particle histograms are not filled. if kTRUE, the ones for which fBookParticleHistograms2D[...] is kTRUE, are filled"}; - Configurable> cfBookParticleHistograms2D{"cfBookParticleHistograms2D", {"1-Phi_vs_Pt", "1-Phi_vs_Eta"}, "Book (1) or do not book (0) 2D particle histograms"}; + Configurable> cfBookParticleHistograms2D{"cfBookParticleHistograms2D", {"1-Phi_vs_Pt", "1-Phi_vs_Eta"}, "Book (1) or do not book (0) 2D particle histograms"}; Configurable cfRebinSparse{"cfRebinSparse", 1, "used only for all fixed-length bins which are implemented directly for sparse histograms (i.e. not inherited from results histograms)"}; - Configurable> cfBookParticleSparseHistograms{"cfBookParticleSparseHistograms", {"0-DWPhi", "0-DWPt", "0-DWEta"}, "Book (1) or do not book (0) particular category of sparse histograms"}; + Configurable> cfBookParticleSparseHistograms{"cfBookParticleSparseHistograms", {"0-DWPhi", "0-DWPt", "0-DWEta"}, "Book (1) or do not book (0) particular category of sparse histograms"}; // TBI 20250223 add eventually configurable for FillParticleSparseHistogramsDimension } cf_ph; // *) Particle cuts: struct : ConfigurableGroup { - Configurable> cfUseParticleCuts{"cfUseParticleCuts", {"1-Phi", "1-Pt", "1-Eta", "1-Charge", "1-tpcNClsFindable", "1-tpcNClsShared", "1-itsChi2NCl", "1-tpcNClsFound", "1-tpcNClsCrossedRows", "1-itsNCls", "1-itsNClsInnerBarrel", "1-tpcCrossedRowsOverFindableCls", "1-tpcFoundOverFindableCls", "1-tpcFractionSharedCls", "1-tpcChi2NCl", "1-dcaXY", "1-dcaZ", "1-PDG", "0-trackCutFlag", "0-trackCutFlagFb1", "0-trackCutFlagFb2", "0-isQualityTrack", "0-isPrimaryTrack", "0-isInAcceptanceTrack", "0-isGlobalTrack", "1-isPVContributor", "0-PtDependentDCAxyParameterization"}, "Use (1) or do not use (0) particle cuts"}; + Configurable> cfUseParticleCuts{"cfUseParticleCuts", {"1-Phi", "1-Pt", "1-Eta", "1-Charge", "1-tpcNClsFindable", "1-tpcNClsShared", "1-itsChi2NCl", "1-tpcNClsFound", "1-tpcNClsCrossedRows", "1-itsNCls", "1-itsNClsInnerBarrel", "1-tpcCrossedRowsOverFindableCls", "1-tpcFoundOverFindableCls", "1-tpcFractionSharedCls", "1-tpcChi2NCl", "1-dcaXY", "1-dcaZ", "1-PDG", "0-trackCutFlag", "0-trackCutFlagFb1", "0-trackCutFlagFb2", "0-isQualityTrack", "0-isPrimaryTrack", "0-isInAcceptanceTrack", "0-isGlobalTrack", "1-isPVContributor", "0-PtDependentDCAxyParameterization"}, "Use (1) or do not use (0) particle cuts"}; Configurable cfUseParticleCutCounterAbsolute{"cfUseParticleCutCounterAbsolute", false, "profile and save how many times each particle cut counter triggered (absolute). Use with care, as this is computationally heavy"}; Configurable cfUseParticleCutCounterSequential{"cfUseParticleCutCounterSequential", false, "profile and save how many times each particle cut counter triggered (sequential). Use with care, as this is computationally heavy"}; - Configurable> cfPhi{"cfPhi", {0.0, o2::constants::math::TwoPI}, "phi range: {min, max}[rad], with convention: min <= phi < max"}; - Configurable> cfPt{"cfPt", {0.2, 5.0}, "pt range: {min, max}[GeV], with convention: min <= pt < max"}; - Configurable> cfEta{"cfEta", {-0.8, 0.8}, "eta range: {min, max}, with convention: min <= eta < max"}; - Configurable> cfCharge{"cfCharge", {-1.5, 1.5}, "particle charge. {-1.5,0} = only negative, {0,1.5} = only positive"}; - Configurable> cftpcNClsFindable{"cftpcNClsFindable", {-1000., 1000.}, "tpcNClsFindable range: {min, max}, with convention: min <= cftpcNClsFindable < max"}; - Configurable> cftpcNClsShared{"cftpcNClsShared", {-1000., 1000.}, "tpcNClsShared range: {min, max}, with convention: min <= cftpcNClsShared < max"}; - Configurable> cfitsChi2NCl{"cfitsChi2NCl", {-1000., 1000.}, "itsChi2NCl range: {min, max}, with convention: min <= cfitsChi2NCl < max"}; - Configurable> cftpcNClsFound{"cftpcNClsFound", {70., 1000.}, "tpcNClsFound range: {min, max}, with convention: min <= cftpcNClsFound < max"}; - Configurable> cftpcNClsCrossedRows{"cftpcNClsCrossedRows", {70., 1000.}, "tpcNClsCrossedRows range: {min, max}, with convention: min <= tpcNClsCrossedRows < max"}; - Configurable> cfitsNCls{"cfitsNCls", {5., 1000.}, "itsNCls range: {min, max}, with convention: min <= itsNCls < max"}; - Configurable> cfitsNClsInnerBarrel{"cfitsNClsInnerBarrel", {-1000., 1000.}, "itsNClsInnerBarrel range: {min, max}, with convention: min <= cfitsNClsInnerBarrel < max"}; - Configurable> cftpcCrossedRowsOverFindableCls{"cftpcCrossedRowsOverFindableCls", {0.8, 1000.}, "tpcCrossedRowsOverFindableCls range: {min, max}, with convention: min <= cftpcCrossedRowsOverFindableCls < max"}; - Configurable> cftpcFoundOverFindableCls{"cftpcFoundOverFindableCls", {0.8, 1000.}, "tpcFoundOverFindableCls range: {min, max}, with convention: min <= cftpcFoundOverFindableCls < max"}; - Configurable> cftpcFractionSharedCls{"cftpcFractionSharedCls", {-1000., 0.4}, "tpcFractionSharedCls range: {min, max}, with convention: min <= cftpcFractionSharedCls < max"}; - Configurable> cftpcChi2NCl{"cftpcChi2NCl", {-1000., 4.}, "tpcChi2NCl range: {min, max}, with convention: min <= cftpcChi2NCl < max"}; - Configurable> cfdcaXY{"cfdcaXY", {-2.4, 2.4}, "dcaXY range: {min, max}, with convention: min <= dcaXY < max (yes, DCA can be negative!)"}; - Configurable> cfdcaZ{"cfdcaZ", {-3.2, 3.2}, "dcaZ range: {min, max}, with convention: min <= dcaZ < max (yes, DCA can be negative!)"}; - Configurable> cfPDG{"cfPDG", {-5000., 5000.}, "PDG code"}; + Configurable> cfPhi{"cfPhi", {0.0, o2::constants::math::TwoPI}, "phi range: {min, max}[rad], with convention: min <= phi < max"}; + Configurable> cfPt{"cfPt", {0.2, 5.0}, "pt range: {min, max}[GeV], with convention: min <= pt < max"}; + Configurable> cfEta{"cfEta", {-0.8, 0.8}, "eta range: {min, max}, with convention: min <= eta < max"}; + Configurable> cfCharge{"cfCharge", {-1.5, 1.5}, "particle charge. {-1.5,0} = only negative, {0,1.5} = only positive"}; + Configurable> cftpcNClsFindable{"cftpcNClsFindable", {-1000., 1000.}, "tpcNClsFindable range: {min, max}, with convention: min <= cftpcNClsFindable < max"}; + Configurable> cftpcNClsShared{"cftpcNClsShared", {-1000., 1000.}, "tpcNClsShared range: {min, max}, with convention: min <= cftpcNClsShared < max"}; + Configurable> cfitsChi2NCl{"cfitsChi2NCl", {-1000., 1000.}, "itsChi2NCl range: {min, max}, with convention: min <= cfitsChi2NCl < max"}; + Configurable> cftpcNClsFound{"cftpcNClsFound", {70., 1000.}, "tpcNClsFound range: {min, max}, with convention: min <= cftpcNClsFound < max"}; + Configurable> cftpcNClsCrossedRows{"cftpcNClsCrossedRows", {70., 1000.}, "tpcNClsCrossedRows range: {min, max}, with convention: min <= tpcNClsCrossedRows < max"}; + Configurable> cfitsNCls{"cfitsNCls", {5., 1000.}, "itsNCls range: {min, max}, with convention: min <= itsNCls < max"}; + Configurable> cfitsNClsInnerBarrel{"cfitsNClsInnerBarrel", {-1000., 1000.}, "itsNClsInnerBarrel range: {min, max}, with convention: min <= cfitsNClsInnerBarrel < max"}; + Configurable> cftpcCrossedRowsOverFindableCls{"cftpcCrossedRowsOverFindableCls", {0.8, 1000.}, "tpcCrossedRowsOverFindableCls range: {min, max}, with convention: min <= cftpcCrossedRowsOverFindableCls < max"}; + Configurable> cftpcFoundOverFindableCls{"cftpcFoundOverFindableCls", {0.8, 1000.}, "tpcFoundOverFindableCls range: {min, max}, with convention: min <= cftpcFoundOverFindableCls < max"}; + Configurable> cftpcFractionSharedCls{"cftpcFractionSharedCls", {-1000., 0.4}, "tpcFractionSharedCls range: {min, max}, with convention: min <= cftpcFractionSharedCls < max"}; + Configurable> cftpcChi2NCl{"cftpcChi2NCl", {-1000., 4.}, "tpcChi2NCl range: {min, max}, with convention: min <= cftpcChi2NCl < max"}; + Configurable> cfdcaXY{"cfdcaXY", {-2.4, 2.4}, "dcaXY range: {min, max}, with convention: min <= dcaXY < max (yes, DCA can be negative!)"}; + Configurable> cfdcaZ{"cfdcaZ", {-3.2, 3.2}, "dcaZ range: {min, max}, with convention: min <= dcaZ < max (yes, DCA can be negative!)"}; + Configurable> cfPDG{"cfPDG", {-5000., 5000.}, "PDG code"}; Configurable cftrackCutFlag{"cftrackCutFlag", false, "general selection, particle cuts are tuned centrally. Use only in Run 3."}; Configurable cftrackCutFlagFb1{"cftrackCutFlagFb1", false, "general selection + 1 point in ITS IB. Use only in Run 3."}; Configurable cftrackCutFlagFb2{"cftrackCutFlagFb2", false, "general selection + 2 point in ITS IB. Use only in Run 3."}; @@ -153,7 +158,7 @@ struct : ConfigurableGroup { Configurable cfisInAcceptanceTrack{"cfisInAcceptanceTrack", false, "TBI 20250113 obsolete - see enum, to be removed"}; Configurable cfisGlobalTrack{"cfisGlobalTrack", false, "TBI 20240510 add description"}; Configurable cfisPVContributor{"cfisPVContributor", false, "Has this track contributed to the collision vertex fit"}; - Configurable cfPtDependentDCAxyParameterization{"cfPtDependentDCAxyParameterization", "some formula TBI add some default formula, e.g. 0.0105+0.0350/x^1.1", "set here formula for pt-dependence DCAxy cut, in the following example format 0.0105+0.0350/x^1.1"}; + Configurable cfPtDependentDCAxyParameterization{"cfPtDependentDCAxyParameterization", "some formula TBI add some default formula, e.g. 0.0105+0.0350/x^1.1", "set here formula for pt-dependence DCAxy cut, in the following example format 0.0105+0.0350/x^1.1"}; // TBI 20240426 do I need to add separate support for booleans to use each specific cut? } cf_pc; @@ -188,9 +193,9 @@ struct : ConfigurableGroup { Configurable cfCalculateTest0AsFunctionOfInteractionRate{"cfCalculateTest0AsFunctionOfInteractionRate", false, "calculate or not Test0 as a function of interaction rate"}; Configurable cfCalculateTest0AsFunctionOfCurrentRunDuration{"cfCalculateTest0AsFunctionOfCurrentRunDuration", false, "calculate or not Test0 as a function of current run duration (i.e. vs. seconds since start of run)"}; Configurable cfCalculateTest0AsFunctionOfVz{"cfCalculateTest0AsFunctionOfVz", false, "calculate or not Test0 as a function of vertex z position"}; - Configurable cfFileWithLabels{"cfFileWithLabels", "/home/abilandz/DatasetsO2/labels.root", "path to external ROOT file which specifies all labels"}; // for AliEn file prepend "/alice/cern.ch/", for CCDB prepend "/alice-ccdb.cern.ch" + Configurable cfFileWithLabels{"cfFileWithLabels", "/home/abilandz/DatasetsO2/labels.root", "path to external ROOT file which specifies all labels"}; // for AliEn file prepend "/alice/cern.ch/", for CCDB prepend "/alice-ccdb.cern.ch" Configurable cfUseDefaultLabels{"cfUseDefaultLabels", false, "use default internally hardwired labels, only for testing purposes"}; - Configurable cfWhichDefaultLabels{"cfWhichDefaultLabels", "standard", "only for testing purposes, select one set of default labels, see GetDefaultObjArrayWithLabels for supported options"}; + Configurable cfWhichDefaultLabels{"cfWhichDefaultLabels", "standard", "only for testing purposes, select one set of default labels, see GetDefaultObjArrayWithLabels for supported options"}; } cf_t0; // *) Eta separation: @@ -205,8 +210,8 @@ struct : ConfigurableGroup { Configurable cfCalculateEtaSeparationsAsFunctionOfInteractionRate{"cfCalculateEtaSeparationsAsFunctionOfInteractionRate", false, "calculate or not 2p corr. vs. eta separations as a function of interaction rate"}; Configurable cfCalculateEtaSeparationsAsFunctionOfCurrentRunDuration{"cfCalculateEtaSeparationsAsFunctionOfCurrentRunDuration", false, "calculate or not 2p corr. vs. eta separations as a function of current run duration (i.e. vs. seconds since start of run)"}; Configurable cfCalculateEtaSeparationsAsFunctionOfVz{"cfCalculateEtaSeparationsAsFunctionOfVz", false, "calculate or not 2p corr. vs. eta separations as a function of vertex z position"}; - Configurable> cfEtaSeparationsValues{"cfEtaSeparationsValues", {0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8}, "Eta separation between interval A (-eta) and B (+eta)"}; - Configurable> cfEtaSeparationsSkipHarmonics{"cfEtaSeparationsSkipHarmonics", {"0-v1", "0-v2", "0-v3", "0-v4", "1-v5", "1-v6", "1-v7", "1-v8", "1-v9"}, "For calculation of 2p correlation with eta separation these harmonics will be skipped (if first flag = \"0-v1\", v1 will be NOT be skipped in the calculus of 2p correlations with eta separations, etc.)"}; + Configurable> cfEtaSeparationsValues{"cfEtaSeparationsValues", {0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8}, "Eta separation between interval A (-eta) and B (+eta)"}; + Configurable> cfEtaSeparationsSkipHarmonics{"cfEtaSeparationsSkipHarmonics", {"0-v1", "0-v2", "0-v3", "0-v4", "1-v5", "1-v6", "1-v7", "1-v8", "1-v9"}, "For calculation of 2p correlation with eta separation these harmonics will be skipped (if first flag = \"0-v1\", v1 will be NOT be skipped in the calculus of 2p correlations with eta separations, etc.)"}; } cf_es; // *) Particle weights: @@ -216,16 +221,16 @@ struct : ConfigurableGroup { Configurable cfUseEtaWeights{"cfUseEtaWeights", false, "use or not eta weights"}; Configurable cfUseDiffPhiPtWeights{"cfUseDiffPhiPtWeights", false, "use or not differential phi(pt) weights"}; Configurable cfUseDiffPhiEtaWeights{"cfUseDiffPhiEtaWeights", false, "use or not differential phi(eta) weights"}; - Configurable> cfWhichDiffPhiWeights{"cfWhichDiffPhiWeights", {"1-wPhi", "1-wPt", "1-wEta", "1-wCharge", "1-wCentrality", "1-wVertex_z"}, "use (1) or do not use (0) differential phi weight for particular dimension. If only phi is set to 1, integrated phi weights are used. If phi is set to 0, ALL dimensions are switched off (yes!)"}; - Configurable> cfWhichDiffPtWeights{"cfWhichDiffPtWeights", {"1-wPt"}, "use (1) or do not use (0) differential pt weight for particular dimension. If only pt is set to 1, integrated pt weights are used. If pt is set to 0, ALL dimensions are switched off (yes!)"}; - Configurable> cfWhichDiffEtaWeights{"cfWhichDiffEtaWeights", {"1-wEta"}, "use (1) or do not use (0) differential eta weight for particular dimension. If only eta is set to 1, integrated eta weights are used. If eta is set to 0, ALL dimensions are switched off (yes!)"}; - Configurable cfFileWithWeights{"cfFileWithWeights", "/home/abilandz/DatasetsO2/weights.root", "path to external ROOT file which holds all particle weights in O2 format"}; // for AliEn file prepend "/alice/cern.ch/", for CCDB prepend "/alice-ccdb.cern.ch" + Configurable> cfWhichDiffPhiWeights{"cfWhichDiffPhiWeights", {"1-wPhi", "1-wPt", "1-wEta", "1-wCharge", "1-wCentrality", "1-wVertex_z"}, "use (1) or do not use (0) differential phi weight for particular dimension. If only phi is set to 1, integrated phi weights are used. If phi is set to 0, ALL dimensions are switched off (yes!)"}; + Configurable> cfWhichDiffPtWeights{"cfWhichDiffPtWeights", {"1-wPt"}, "use (1) or do not use (0) differential pt weight for particular dimension. If only pt is set to 1, integrated pt weights are used. If pt is set to 0, ALL dimensions are switched off (yes!)"}; + Configurable> cfWhichDiffEtaWeights{"cfWhichDiffEtaWeights", {"1-wEta"}, "use (1) or do not use (0) differential eta weight for particular dimension. If only eta is set to 1, integrated eta weights are used. If eta is set to 0, ALL dimensions are switched off (yes!)"}; + Configurable cfFileWithWeights{"cfFileWithWeights", "/home/abilandz/DatasetsO2/weights.root", "path to external ROOT file which holds all particle weights in O2 format"}; // for AliEn file prepend "/alice/cern.ch/", for CCDB prepend "/alice-ccdb.cern.ch" } cf_pw; // *) Centrality weights: struct : ConfigurableGroup { Configurable cfUseCentralityWeights{"cfUseCentralityWeights", false, "use or not centrality weights"}; - Configurable cfFileWithCentralityWeights{"cfFileWithCentralityWeights", "/home/abilandz/DatasetsO2/centralityWeights.root", "path to external ROOT file which holds centrality weights in O2 format"}; // for AliEn file prepend "/alice/cern.ch/", for CCDB prepend "/alice-ccdb.cern.ch" + Configurable cfFileWithCentralityWeights{"cfFileWithCentralityWeights", "/home/abilandz/DatasetsO2/centralityWeights.root", "path to external ROOT file which holds centrality weights in O2 format"}; // for AliEn file prepend "/alice/cern.ch/", for CCDB prepend "/alice-ccdb.cern.ch" } cf_cw; // *) Nested loops: @@ -238,10 +243,10 @@ struct : ConfigurableGroup { // *) Toy NUA: struct : ConfigurableGroup { - Configurable> cfApplyNUAPDF{"cfApplyNUAPDF", {0, 0, 0}, "Apply (1) or do not apply (0) NUA on variable, ordering is the same as in enum eNUAPDF (phi, pt, eta)"}; - Configurable> cfUseDefaultNUAPDF{"cfUseDefaultNUAPDF", {1, 1, 1}, "Use (1) or do not use (0) default NUA profile, ordering is the same as in enum eNUAPDF (phi, pt, eta)"}; - Configurable> cfCustomNUAPDFHistNames{"cfCustomNUAPDFHistNames", {"a", "bb", "ccc"}, "the names of histograms holding custom NUA in an external file."}; - Configurable cfFileWithCustomNUA{"cfFileWithCustomNUA", "/home/abilandz/DatasetsO2/customNUA.root", "path to external ROOT file which holds all histograms with custom NUA"}; // for AliEn file prepend "/alice/cern.ch/", for CCDB prepend "/alice-ccdb.cern.ch" + Configurable> cfApplyNUAPDF{"cfApplyNUAPDF", {0, 0, 0}, "Apply (1) or do not apply (0) NUA on variable, ordering is the same as in enum eNUAPDF (phi, pt, eta)"}; + Configurable> cfUseDefaultNUAPDF{"cfUseDefaultNUAPDF", {1, 1, 1}, "Use (1) or do not use (0) default NUA profile, ordering is the same as in enum eNUAPDF (phi, pt, eta)"}; + Configurable> cfCustomNUAPDFHistNames{"cfCustomNUAPDFHistNames", {"a", "bb", "ccc"}, "the names of histograms holding custom NUA in an external file."}; + Configurable cfFileWithCustomNUA{"cfFileWithCustomNUA", "/home/abilandz/DatasetsO2/customNUA.root", "path to external ROOT file which holds all histograms with custom NUA"}; // for AliEn file prepend "/alice/cern.ch/", for CCDB prepend "/alice-ccdb.cern.ch" } cf_nua; // *) Internal validation: @@ -249,11 +254,11 @@ struct : ConfigurableGroup { Configurable cfUseInternalValidation{"cfUseInternalValidation", false, "perform internal validation using flow analysis on-the-fly"}; Configurable cfInternalValidationForceBailout{"cfInternalValidationForceBailout", false, "force bailout (use only locally, since there is no graceful exit (yet))"}; Configurable cfnEventsInternalValidation{"cfnEventsInternalValidation", 0, "number of events simulated on-the-fly for internal validation"}; - Configurable cfHarmonicsOptionInternalValidation{"cfHarmonicsOptionInternalValidation", "constant", "for internal validation, supported options are \"constant\", \"correlated\" and \"persistent\""}; + Configurable cfHarmonicsOptionInternalValidation{"cfHarmonicsOptionInternalValidation", "constant", "for internal validation, supported options are \"constant\", \"correlated\" and \"persistent\""}; Configurable cfRescaleWithTheoreticalInput{"cfRescaleWithTheoreticalInput", false, "if kTRUE, all correlators are rescaled with theoretical input, so that all results in profiles are 1"}; - Configurable> cfInternalValidationAmplitudes{"cfInternalValidationAmplitudes", {0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09}, "{v1, v2, v3, v4, ...} + has an effect only in combination with cfHarmonicsOptionInternalValidation = \"constant\". Max number of vn's is gMaxHarmonic."}; - Configurable> cfInternalValidationPlanes{"cfInternalValidationPlanes", {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, "{Psi1, Psi2, Psi3, Psi4, ...} + has an effect only in combination with cfHarmonicsOptionInternalValidation = \"constant\". Max number of Psin's is gMaxHarmonic."}; - Configurable> cfMultRangeInternalValidation{"cfMultRangeInternalValidation", {1000, 1001}, "{min, max}, with convention: min <= M < max"}; + Configurable> cfInternalValidationAmplitudes{"cfInternalValidationAmplitudes", {0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09}, "{v1, v2, v3, v4, ...} + has an effect only in combination with cfHarmonicsOptionInternalValidation = \"constant\". Max number of vn's is gMaxHarmonic."}; + Configurable> cfInternalValidationPlanes{"cfInternalValidationPlanes", {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, "{Psi1, Psi2, Psi3, Psi4, ...} + has an effect only in combination with cfHarmonicsOptionInternalValidation = \"constant\". Max number of Psin's is gMaxHarmonic."}; + Configurable> cfMultRangeInternalValidation{"cfMultRangeInternalValidation", {1000, 1001}, "{min, max}, with convention: min <= M < max"}; } cf_iv; // *) Results histograms: @@ -261,32 +266,32 @@ struct : ConfigurableGroup { Configurable cfSaveResultsHistograms{"cfSaveResultsHistograms", false, "save or not results histograms"}; // Fixed-length binning (default): - Configurable> cfFixedLength_mult_bins{"cfFixedLength_mult_bins", {2000, 0., 20000.}, "nMultBins, multMin, multMax (only for results histograms)"}; - Configurable> cfFixedLength_cent_bins{"cfFixedLength_cent_bins", {110, 0., 110.}, "nCentBins, centMin, centMax (only for results histograms)"}; - Configurable> cfFixedLength_pt_bins{"cfFixedLength_pt_bins", {1000, 0., 10.}, "nPtBins, ptMin, ptMax (only for results histograms)"}; - Configurable> cfFixedLength_eta_bins{"cfFixedLength_eta_bins", {80, -2., 2.}, "nEtaBins, etaMin, etaMax (only for results histograms)"}; - Configurable> cfFixedLength_occu_bins{"cfFixedLength_occu_bins", {200, 0., 60000.}, "nOccuBins, occuMin, occuMax (only for results histograms)"}; - Configurable> cfFixedLength_ir_bins{"cfFixedLength_ir_bins", {1000, 0., 100.}, "nirBins, irMin, irMax (only for results histograms)"}; - Configurable> cfFixedLength_crd_bins{"cfFixedLength_crd_bins", {100000, 0., 100000.}, "ncrdBins, crdMin, crdMax (only for results histograms)"}; - Configurable> cfFixedLength_vz_bins{"cfFixedLength_vz_bins", {400, -20., 20.}, "nvzBins, vzMin, vzMax (only for results histograms)"}; + Configurable> cfFixedLength_mult_bins{"cfFixedLength_mult_bins", {2000, 0., 20000.}, "nMultBins, multMin, multMax (only for results histograms)"}; + Configurable> cfFixedLength_cent_bins{"cfFixedLength_cent_bins", {110, 0., 110.}, "nCentBins, centMin, centMax (only for results histograms)"}; + Configurable> cfFixedLength_pt_bins{"cfFixedLength_pt_bins", {1000, 0., 10.}, "nPtBins, ptMin, ptMax (only for results histograms)"}; + Configurable> cfFixedLength_eta_bins{"cfFixedLength_eta_bins", {80, -2., 2.}, "nEtaBins, etaMin, etaMax (only for results histograms)"}; + Configurable> cfFixedLength_occu_bins{"cfFixedLength_occu_bins", {200, 0., 60000.}, "nOccuBins, occuMin, occuMax (only for results histograms)"}; + Configurable> cfFixedLength_ir_bins{"cfFixedLength_ir_bins", {1000, 0., 100.}, "nirBins, irMin, irMax (only for results histograms)"}; + Configurable> cfFixedLength_crd_bins{"cfFixedLength_crd_bins", {100000, 0., 100000.}, "ncrdBins, crdMin, crdMax (only for results histograms)"}; + Configurable> cfFixedLength_vz_bins{"cfFixedLength_vz_bins", {400, -20., 20.}, "nvzBins, vzMin, vzMax (only for results histograms)"}; // Variable-length binning (per request): Configurable cfUseVariableLength_mult_bins{"cfUseVariableLength_mult_bins", false, "use or not variable-length multiplicity bins"}; - Configurable> cfVariableLength_mult_bins{"cfVariableLength_mult_bins", {0., 5., 6., 7., 8., 9., 100., 200., 500., 1000., 10000.}, "variable-length multiplicity bins"}; + Configurable> cfVariableLength_mult_bins{"cfVariableLength_mult_bins", {0., 5., 6., 7., 8., 9., 100., 200., 500., 1000., 10000.}, "variable-length multiplicity bins"}; Configurable cfUseVariableLength_cent_bins{"cfUseVariableLength_cent_bins", false, "use or not variable-length centrality bins"}; - Configurable> cfVariableLength_cent_bins{"cfVariableLength_cent_bins", {0., 10., 50., 100.}, "variable-length centrality bins"}; + Configurable> cfVariableLength_cent_bins{"cfVariableLength_cent_bins", {0., 10., 50., 100.}, "variable-length centrality bins"}; Configurable cfUseVariableLength_pt_bins{"cfUseVariableLength_pt_bins", true, "use or not variable-length pt bins"}; - Configurable> cfVariableLength_pt_bins{"cfVariableLength_pt_bins", {0.20, 0.25, 0.30, 0.35, 0.40, 0.50, 0.60, 0.80, 1.00, 1.25, 1.50, 1.75, 2.00, 2.50, 3.00, 4.00, 5.00}, "variable-length pt bins"}; + Configurable> cfVariableLength_pt_bins{"cfVariableLength_pt_bins", {0.20, 0.25, 0.30, 0.35, 0.40, 0.50, 0.60, 0.80, 1.00, 1.25, 1.50, 1.75, 2.00, 2.50, 3.00, 4.00, 5.00}, "variable-length pt bins"}; Configurable cfUseVariableLength_eta_bins{"cfUseVariableLength_eta_bins", true, "use or not variable-length eta bins"}; - Configurable> cfVariableLength_eta_bins{"cfVariableLength_eta_bins", {-0.8, -0.6, -0.4, -0.3, -0.2, -0.1, 0.0, 0.1, 0.2, 0.3, 0.4, 0.6, 0.8}, "variable-length eta bins"}; + Configurable> cfVariableLength_eta_bins{"cfVariableLength_eta_bins", {-0.8, -0.6, -0.4, -0.3, -0.2, -0.1, 0.0, 0.1, 0.2, 0.3, 0.4, 0.6, 0.8}, "variable-length eta bins"}; Configurable cfUseVariableLength_occu_bins{"cfUseVariableLength_occu_bins", false, "use or not variable-length occupancy bins"}; - Configurable> cfVariableLength_occu_bins{"cfVariableLength_occu_bins", {0., 5., 6., 7., 8., 9., 100., 200., 500., 1000., 10000.}, "variable-length occupancy bins"}; + Configurable> cfVariableLength_occu_bins{"cfVariableLength_occu_bins", {0., 5., 6., 7., 8., 9., 100., 200., 500., 1000., 10000.}, "variable-length occupancy bins"}; Configurable cfUseVariableLength_ir_bins{"cfUseVariableLength_ir_bins", false, "use or not variable-length interaction rate bins"}; - Configurable> cfVariableLength_ir_bins{"cfVariableLength_ir_bins", {0., 5., 10., 50., 100., 200.}, "variable-length ineraction rate bins"}; + Configurable> cfVariableLength_ir_bins{"cfVariableLength_ir_bins", {0., 5., 10., 50., 100., 200.}, "variable-length ineraction rate bins"}; Configurable cfUseVariableLength_crd_bins{"cfUseVariableLength_crd_bins", false, "use or not variable-length current run duration bins"}; - Configurable> cfVariableLength_crd_bins{"cfVariableLength_crd_bins", {0., 5., 10., 50., 100., 500.}, "variable-length current run duration bins"}; + Configurable> cfVariableLength_crd_bins{"cfVariableLength_crd_bins", {0., 5., 10., 50., 100., 500.}, "variable-length current run duration bins"}; Configurable cfUseVariableLength_vz_bins{"cfUseVariableLength_vz_bins", false, "use or not variable-length vertex z bins"}; - Configurable> cfVariableLength_vz_bins{"cfVariableLength_vz_bins", {-10., -8., -6., -4, -2., -1., 0., 1., 2., 4., 6., 8., 10.}, "variable-length vertex z bins"}; + Configurable> cfVariableLength_vz_bins{"cfVariableLength_vz_bins", {-10., -8., -6., -4, -2., -1., 0., 1., 2., 4., 6., 8., 10.}, "variable-length vertex z bins"}; } cf_res; diff --git a/PWGCF/MultiparticleCorrelations/Core/MuPa-DataMembers.h b/PWGCF/MultiparticleCorrelations/Core/MuPa-DataMembers.h index ff0d65afce6..5cfb9f1fde0 100644 --- a/PWGCF/MultiparticleCorrelations/Core/MuPa-DataMembers.h +++ b/PWGCF/MultiparticleCorrelations/Core/MuPa-DataMembers.h @@ -61,14 +61,17 @@ struct TaskConfiguration { UInt_t fRandomSeed = 0; // argument for TRandom3 constructor. By default it is 0 (seed is guaranteed to be unique in time and space) bool fUseFisherYates = false; // algorithm used to randomize particle indices, set via configurable TArrayI* fRandomIndices = NULL; // array to store random indices obtained from Fisher-Yates algorithm - int fFixedNumberOfRandomlySelectedTracks = -1; // use a fixed number of randomly selected particles in each event. It is set and applied, if > 0. Set to <=0 to ignore. - bool fUseStopwatch = false; // do some basing profiling with TStopwatch for where the execution time is going - TStopwatch* fTimer[eTimer_N] = {NULL}; // stopwatch, global (overal execution time) and local - float fFloatingPointPrecision = 1.e-6; // two floats are the same if TMath::Abs(f1 - f2) < fFloatingPointPrecision (there is configurable for it) - int fSequentialBailout = 0; // if fSequentialBailout > 0, then each fSequentialBailout events the function BailOut() is called. Can be used for real analysis and for IV. - bool fUseSpecificCuts = false; // apply after DefaultCuts() also hardwired analysis-specific cuts, determined via tc.fWhichSpecificCuts - TString fWhichSpecificCuts = ""; // determine which set of analysis-specific cuts will be applied after DefaultCuts(). Use in combination with tc.fUseSpecificCuts -} tc; // "tc" labels an instance of this group of variables. + int fFixedNumberOfRandomlySelectedTracks = -1; // use a fixed number of randomly selected particles in each event, applies to all centralities. It is set and applied if > 0. Set to <=0 to ignore. + + bool fUseStopwatch = false; // do some basing profiling with TStopwatch for where the execution time is going + TStopwatch* fTimer[eTimer_N] = {NULL}; // stopwatch, global (overal execution time) and local + float fFloatingPointPrecision = 1.e-6; // two floats are the same if TMath::Abs(f1 - f2) < fFloatingPointPrecision (there is configurable for it) + int fSequentialBailout = 0; // if fSequentialBailout > 0, then each fSequentialBailout events the function BailOut() is called. Can be used for real analysis and for IV. + bool fUseSpecificCuts = false; // apply after DefaultCuts() also hardwired analysis-specific cuts, determined via tc.fWhichSpecificCuts + TString fWhichSpecificCuts = ""; // determine which set of analysis-specific cuts will be applied after DefaultCuts(). Use in combination with tc.fUseSpecificCuts + TString fSkipTheseRuns = ""; // comma-separated list of runs which will be skipped during analysis in hl (a.k.a. "bad runs") + bool fSkipRun = false; // based on the content of fWhichSpecificCuts, skip or not the current run +} tc; // "tc" labels an instance of this group of variables. // *) Event-by-event quantities: struct EventByEventQuantities { @@ -119,7 +122,7 @@ struct QualityAssurance { TProfile* fQAParticleEventProEbyE[2][2] = {{NULL}}; // helper profile to calculate event-by-event // [reco, sim][before, after]. Type dimension is bin. - TList* fQACorrelationsVsList = NULL; //! in 2D profile spanned by IR vs. some-other-observable (IR is always x axis) + // For instance: <2> is filled in TProfile2D spanned by IR vs. CurrentRunDuration (crd) + // <2> is filled in TProfile2D spanned by IR vs. , where is calculated from all particles in that event + // Remark 1: If I would ever need the same thingie for <4>, <6>, etc., just introduce new dimension in 2D profile + // Remark 2: All < ... > over particles are calculated with helper TProfile fQAParticleEventProEbyE + eCorrelationsVsInteractionRate_vs_CurrentRunDuration = 0, + eCorrelationsVsInteractionRate_vs_Multiplicity, + eCorrelationsVsInteractionRate_vs_ReferenceMultiplicity, + eCorrelationsVsInteractionRate_vs_Centrality, + // ... + eCorrelationsVsInteractionRate_vs_MeanPhi, + eCorrelationsVsInteractionRate_vs_SigmaMeanPhi, + eCorrelationsVsInteractionRate_vs_MeanPt, + eCorrelationsVsInteractionRate_vs_SigmaMeanPt, + eCorrelationsVsInteractionRate_vs_MeanEta, + eCorrelationsVsInteractionRate_vs_SigmaMeanEta, + // ... + eQACorrelationsVsInteractionRateVsProfiles2D_N +}; + enum eReferenceMultiplicityEstimators { // Run 3: eMultTPC = 0, @@ -453,6 +475,8 @@ enum eSpecificCuts { eLHC15o, // Run 1: // ... + // Cuts for minimal subscription, "processTest": "true in JSON + eTestCuts, eSpecificCuts_N }; diff --git a/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h b/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h index a2d9c0d3281..7faf8c5c42d 100644 --- a/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h +++ b/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h @@ -100,6 +100,8 @@ void BookBaseList() fBasePro->GetXaxis()->SetBinLabel(eWhichSpecificCuts, Form("WhichSpecificCuts = %s", tc.fWhichSpecificCuts.Data())); + fBasePro->GetXaxis()->SetBinLabel(eSkipTheseRuns, Form("SkipTheseRuns = %s", tc.fSkipTheseRuns.Data())); + fBaseList->Add(fBasePro); if (tc.fVerbose) { @@ -222,6 +224,7 @@ void DefaultConfiguration() tc.fSequentialBailout = cf_tc.cfSequentialBailout; tc.fUseSpecificCuts = cf_tc.cfUseSpecificCuts; tc.fWhichSpecificCuts = cf_tc.cfWhichSpecificCuts; + tc.fSkipTheseRuns = cf_tc.cfSkipTheseRuns; // *) Event histograms (for QA see below): eh.fEventHistogramsName[eNumberOfEvents] = "NumberOfEvents"; @@ -481,7 +484,7 @@ void DefaultConfiguration() // ... // *) Toy NUA: - auto lApplyNUAPDF = (vector)cf_nua.cfApplyNUAPDF; + auto lApplyNUAPDF = (std::vector)cf_nua.cfApplyNUAPDF; if (lApplyNUAPDF.size() != eNUAPDF_N) { LOGF(info, "\033[1;31m lApplyNUAPDF.size() = %d\033[0m", lApplyNUAPDF.size()); LOGF(info, "\033[1;31m eNUAPDF_N = %d\033[0m", static_cast(eNUAPDF_N)); @@ -494,7 +497,7 @@ void DefaultConfiguration() // **) Execute the lines below, only if toy NUA (either default or custom) is requested for at least one kine variable: if (nua.fApplyNUAPDF[ePhiNUAPDF] || nua.fApplyNUAPDF[ePtNUAPDF] || nua.fApplyNUAPDF[eEtaNUAPDF]) { - auto lUseDefaultNUAPDF = (vector)cf_nua.cfUseDefaultNUAPDF; + auto lUseDefaultNUAPDF = (std::vector)cf_nua.cfUseDefaultNUAPDF; if (lUseDefaultNUAPDF.size() != eNUAPDF_N) { LOGF(info, "\033[1;31m lUseDefaultNUAPDF.size() = %d\033[0m", lUseDefaultNUAPDF.size()); LOGF(info, "\033[1;31m eNUAPDF_N = %d\033[0m", static_cast(eNUAPDF_N)); @@ -515,7 +518,7 @@ void DefaultConfiguration() nua.fFileWithCustomNUA = TString(cf_nua.cfFileWithCustomNUA); // *) histogram names with custom NUA distributions in that file + get those histograms immediately here: - auto lCustomNUAPDFHistNames = (vector)cf_nua.cfCustomNUAPDFHistNames; + auto lCustomNUAPDFHistNames = (std::vector)cf_nua.cfCustomNUAPDFHistNames; // TBI 20241115 For some reason, the default values of configurable "cfCustomNUAPDFHistNames" are not correctly propagated in the local variables, but I can circumvent that with JSON settings for the time being if (lCustomNUAPDFHistNames.size() != eNUAPDF_N) { LOGF(info, "\033[1;31m lCustomNUAPDFHistNames.size() = %d\033[0m", lCustomNUAPDFHistNames.size()); @@ -689,6 +692,28 @@ void DefaultConfiguration() } } + // **) Names of QA 2D "correlations vs. IR vs. " profiles: + qa.fQACorrelationsVsInteractionRateVsProfilesName2D[eCorrelationsVsInteractionRate_vs_CurrentRunDuration] = TString::Format("%s_vs_%s", "CorrVsIR", eh.fEventHistogramsName[eCurrentRunDuration].Data()).Data(); + qa.fQACorrelationsVsInteractionRateVsProfilesName2D[eCorrelationsVsInteractionRate_vs_Multiplicity] = TString::Format("%s_vs_%s", "CorrVsIR", eh.fEventHistogramsName[eMultiplicity].Data()).Data(); + qa.fQACorrelationsVsInteractionRateVsProfilesName2D[eCorrelationsVsInteractionRate_vs_ReferenceMultiplicity] = TString::Format("%s_vs_%s", "CorrVsIR", eh.fEventHistogramsName[eReferenceMultiplicity].Data()).Data(); + qa.fQACorrelationsVsInteractionRateVsProfilesName2D[eCorrelationsVsInteractionRate_vs_Centrality] = TString::Format("%s_vs_%s", "CorrVsIR", eh.fEventHistogramsName[eCentrality].Data()).Data(); + // ... + qa.fQACorrelationsVsInteractionRateVsProfilesName2D[eCorrelationsVsInteractionRate_vs_MeanPhi] = TString::Format("%s_vs_Mean%s", "CorrVsIR", ph.fParticleHistogramsName[ePhi].Data()).Data(); + qa.fQACorrelationsVsInteractionRateVsProfilesName2D[eCorrelationsVsInteractionRate_vs_SigmaMeanPhi] = TString::Format("%s_vs_SigmaMean%s", "CorrVsIR", ph.fParticleHistogramsName[ePhi].Data()).Data(); + qa.fQACorrelationsVsInteractionRateVsProfilesName2D[eCorrelationsVsInteractionRate_vs_MeanPt] = TString::Format("%s_vs_Mean%s", "CorrVsIR", ph.fParticleHistogramsName[ePt].Data()).Data(); + qa.fQACorrelationsVsInteractionRateVsProfilesName2D[eCorrelationsVsInteractionRate_vs_SigmaMeanPt] = TString::Format("%s_vs_SigmaMean%s", "CorrVsIR", ph.fParticleHistogramsName[ePt].Data()).Data(); + qa.fQACorrelationsVsInteractionRateVsProfilesName2D[eCorrelationsVsInteractionRate_vs_MeanEta] = TString::Format("%s_vs_Mean%s", "CorrVsIR", ph.fParticleHistogramsName[eEta].Data()).Data(); + qa.fQACorrelationsVsInteractionRateVsProfilesName2D[eCorrelationsVsInteractionRate_vs_SigmaMeanEta] = TString::Format("%s_vs_SigmaMean%s", "CorrVsIR", ph.fParticleHistogramsName[eEta].Data()).Data(); + + // ... + + // ***) Quick insanity check that all names are set: + for (int t = 0; t < eQACorrelationsVsInteractionRateVsProfiles2D_N; t++) { + if (qa.fQACorrelationsVsInteractionRateVsProfilesName2D[t].EqualTo("")) { + LOGF(fatal, "\033[1;31m%s at line %d : qa.fQACorrelationsVsInteractionRateVsProfilesName2D[%d] is not set, check corresponding enum eQACorrelationsVsInteractionRateVsProfiles2D \033[0m", __FUNCTION__, __LINE__, t); + } + } + // **) Names and titles of all categories of sparse histograms: ph.fParticleSparseHistogramsName[eDWPhi] = "fParticleSparseHistograms_DWPhi"; ph.fParticleSparseHistogramsTitle[eDWPhi] = "sparse histogram for differential #phi weights,"; @@ -1102,6 +1127,51 @@ void DefaultBooking() LOGF(fatal, "\033[1;31m%s at line %d : wrong setting for min and max harmonics: min = %d, max = %d \033[0m", __FUNCTION__, __LINE__, qa.fQACorrelationsVsHistogramsMinMaxHarmonic[eMin], qa.fQACorrelationsVsHistogramsMinMaxHarmonic[eMax]); } + // **) QA 2D "correlations vs. IR vs. " profiles: + qa.fFillQACorrelationsVsInteractionRateVsProfiles2D = cf_qa.cfFillQACorrelationsVsInteractionRateVsProfiles2D; + + // *) If you do not want particular 2D correlations vs. IR vs. " profile to be booked, use configurable array cfBookQACorrelationsVsInteractionRateVsProfiles2D, where you can specify flags 1 (book) or 0 (do not book). + // Ordering of the flags in that array is interpreted through ordering of enums in enum eQACorrelationsVsInteractionRateVsProfiles2D. + auto lBookQACorrelationsVsInteractionRateVsProfiles2D = cf_qa.cfBookQACorrelationsVsInteractionRateVsProfiles2D.value; // this is now the local version of that string array from configurable + if (lBookQACorrelationsVsInteractionRateVsProfiles2D.size() != eQACorrelationsVsInteractionRateVsProfiles2D_N) { + LOGF(info, "\033[1;31m lBookQACorrelationsVsInteractionRateVsProfiles2D.size() = %d\033[0m", lBookQACorrelationsVsInteractionRateVsProfiles2D.size()); + LOGF(info, "\033[1;31m eQACorrelationsVsInteractionRateVsProfiles2D_N = %d\033[0m", static_cast(eQACorrelationsVsInteractionRateVsProfiles2D_N)); + LOGF(fatal, "in function \033[1;31m%s at line %d Mismatch in the number of flags in configurable cfBookQACorrelationsVsInteractionRateVsProfiles2D, and number of entries in enum eCorrelationsVsInteractionRateVsProfiles2D \n \033[0m", __FUNCTION__, __LINE__); + } + + // *) Insanity check on the content and ordering of QA 2D "correlations vs. IR vs. " profiles in the initialization in configurable cfBookQACorrelationsVsInteractionRateVsProfiles2D: + // TBI 20240518 I do not need this in fact, I can automate initialization even without ordering in configurable, but it feels with the ordering enforced, it's much safer. + for (int name = 0; name < eQACorrelationsVsInteractionRateVsProfiles2D_N; name++) { + // TBI 20240518 I could implement even a strickter EqualTo instead of EndsWith, but then I need to tokenize, etc., etc. This shall be safe enough. + if (!TString(lBookQACorrelationsVsInteractionRateVsProfiles2D[name]).EndsWith(qa.fQACorrelationsVsInteractionRateVsProfilesName2D[name].Data())) { + LOGF(fatal, "\033[1;31m%s at line %d : Wrong content or ordering of contents in configurable cfBookQACorrelationsVsInteractionRateVsProfiles2D => name = %d, lBookQACorrelationsVsInteractionRateVsProfiles2D[name] = \"%s\", qa.fCorrelationsVsInteractionRateVsProfilesName2D[name] = \"%s\" \n Check if you are using an up to date tag. \033[0m", __FUNCTION__, __LINE__, name, TString(lBookQACorrelationsVsInteractionRateVsProfiles2D[name]).Data(), qa.fQACorrelationsVsInteractionRateVsProfilesName2D[name].Data()); + } + } + + // I append "&& qa.fFillQACorrelationsVsInteractionRateVsProfiles2D" below, to switch off booking of all 2D "correlations vs. IR vs. " profiles with one common flag: + qa.fBookQACorrelationsVsInteractionRateVsProfiles2D[eCorrelationsVsInteractionRate_vs_CurrentRunDuration] = Alright(lBookQACorrelationsVsInteractionRateVsProfiles2D[eCorrelationsVsInteractionRate_vs_CurrentRunDuration]) && qa.fFillQACorrelationsVsInteractionRateVsProfiles2D; + qa.fBookQACorrelationsVsInteractionRateVsProfiles2D[eCorrelationsVsInteractionRate_vs_Multiplicity] = Alright(lBookQACorrelationsVsInteractionRateVsProfiles2D[eCorrelationsVsInteractionRate_vs_Multiplicity]) && qa.fFillQACorrelationsVsInteractionRateVsProfiles2D; + qa.fBookQACorrelationsVsInteractionRateVsProfiles2D[eCorrelationsVsInteractionRate_vs_ReferenceMultiplicity] = Alright(lBookQACorrelationsVsInteractionRateVsProfiles2D[eCorrelationsVsInteractionRate_vs_ReferenceMultiplicity]) && qa.fFillQACorrelationsVsInteractionRateVsProfiles2D; + qa.fBookQACorrelationsVsInteractionRateVsProfiles2D[eCorrelationsVsInteractionRate_vs_Centrality] = Alright(lBookQACorrelationsVsInteractionRateVsProfiles2D[eCorrelationsVsInteractionRate_vs_Centrality]) && qa.fFillQACorrelationsVsInteractionRateVsProfiles2D; + // ..... + qa.fBookQACorrelationsVsInteractionRateVsProfiles2D[eCorrelationsVsInteractionRate_vs_MeanPhi] = Alright(lBookQACorrelationsVsInteractionRateVsProfiles2D[eCorrelationsVsInteractionRate_vs_MeanPhi]) && qa.fFillQACorrelationsVsInteractionRateVsProfiles2D; + qa.fBookQACorrelationsVsInteractionRateVsProfiles2D[eCorrelationsVsInteractionRate_vs_SigmaMeanPhi] = Alright(lBookQACorrelationsVsInteractionRateVsProfiles2D[eCorrelationsVsInteractionRate_vs_SigmaMeanPhi]) && qa.fFillQACorrelationsVsInteractionRateVsProfiles2D; + qa.fBookQACorrelationsVsInteractionRateVsProfiles2D[eCorrelationsVsInteractionRate_vs_MeanPt] = Alright(lBookQACorrelationsVsInteractionRateVsProfiles2D[eCorrelationsVsInteractionRate_vs_MeanPt]) && qa.fFillQACorrelationsVsInteractionRateVsProfiles2D; + qa.fBookQACorrelationsVsInteractionRateVsProfiles2D[eCorrelationsVsInteractionRate_vs_SigmaMeanPt] = Alright(lBookQACorrelationsVsInteractionRateVsProfiles2D[eCorrelationsVsInteractionRate_vs_SigmaMeanPt]) && qa.fFillQACorrelationsVsInteractionRateVsProfiles2D; + qa.fBookQACorrelationsVsInteractionRateVsProfiles2D[eCorrelationsVsInteractionRate_vs_MeanEta] = Alright(lBookQACorrelationsVsInteractionRateVsProfiles2D[eCorrelationsVsInteractionRate_vs_MeanEta]) && qa.fFillQACorrelationsVsInteractionRateVsProfiles2D; + qa.fBookQACorrelationsVsInteractionRateVsProfiles2D[eCorrelationsVsInteractionRate_vs_SigmaMeanEta] = Alright(lBookQACorrelationsVsInteractionRateVsProfiles2D[eCorrelationsVsInteractionRate_vs_SigmaMeanEta]) && qa.fFillQACorrelationsVsInteractionRateVsProfiles2D; + + // ..... + + // *) min and max harmonics for which this series of histograms will be booked: + auto lQACorrelationsVsInteractionRateVsProfilesMinMaxHarmonic = cf_qa.cfQACorrelationsVsInteractionRateVsProfilesMinMaxHarmonic.value; + qa.fQACorrelationsVsInteractionRateVsProfilesMinMaxHarmonic[eMin] = lQACorrelationsVsInteractionRateVsProfilesMinMaxHarmonic[eMin]; + qa.fQACorrelationsVsInteractionRateVsProfilesMinMaxHarmonic[eMax] = lQACorrelationsVsInteractionRateVsProfilesMinMaxHarmonic[eMax]; + // **) insanity check: + if (!(qa.fQACorrelationsVsInteractionRateVsProfilesMinMaxHarmonic[eMin] < qa.fQACorrelationsVsInteractionRateVsProfilesMinMaxHarmonic[eMax])) { + LOGF(fatal, "\033[1;31m%s at line %d : wrong setting for min and max harmonics: min = %d, max = %d \033[0m", __FUNCTION__, __LINE__, qa.fQACorrelationsVsInteractionRateVsProfilesMinMaxHarmonic[eMin], qa.fQACorrelationsVsInteractionRateVsProfilesMinMaxHarmonic[eMax]); + } + // ... if (tc.fVerbose) { @@ -1352,37 +1422,46 @@ void InitializeFixedLengthBins(eAsFunctionOf AFO) } // Common local vector for all fixed-length bins: - vector lFixedLength_bins; + std::vector lFixedLength_bins; switch (AFO) { - case AFO_MULTIPLICITY: + case AFO_MULTIPLICITY: { lFixedLength_bins = cf_res.cfFixedLength_mult_bins.value; break; - case AFO_CENTRALITY: + } + case AFO_CENTRALITY: { lFixedLength_bins = cf_res.cfFixedLength_cent_bins.value; break; - case AFO_PT: + } + case AFO_PT: { lFixedLength_bins = cf_res.cfFixedLength_pt_bins.value; break; - case AFO_ETA: + } + case AFO_ETA: { lFixedLength_bins = cf_res.cfFixedLength_eta_bins.value; break; - case AFO_OCCUPANCY: + } + case AFO_OCCUPANCY: { lFixedLength_bins = cf_res.cfFixedLength_occu_bins.value; break; - case AFO_INTERACTIONRATE: + } + case AFO_INTERACTIONRATE: { lFixedLength_bins = cf_res.cfFixedLength_ir_bins.value; break; - case AFO_CURRENTRUNDURATION: + } + case AFO_CURRENTRUNDURATION: { lFixedLength_bins = cf_res.cfFixedLength_crd_bins.value; break; - case AFO_VZ: + } + case AFO_VZ: { lFixedLength_bins = cf_res.cfFixedLength_vz_bins.value; break; + } // ... - default: + default: { LOGF(fatal, "\033[1;31m%s at line %d : This enum AFO = %d is not supported yet. \033[0m", __FUNCTION__, __LINE__, static_cast(AFO)); break; + } } // switch(AFO) // From this point onward, the code is the same for any AFO variable: @@ -1415,37 +1494,46 @@ void InitializeVariableLengthBins(eAsFunctionOf AFO) } // Common local vector for all variable-length bins: - vector lVariableLength_bins; + std::vector lVariableLength_bins; switch (AFO) { - case AFO_MULTIPLICITY: + case AFO_MULTIPLICITY: { lVariableLength_bins = cf_res.cfVariableLength_mult_bins.value; break; - case AFO_CENTRALITY: + } + case AFO_CENTRALITY: { lVariableLength_bins = cf_res.cfVariableLength_cent_bins.value; break; - case AFO_PT: + } + case AFO_PT: { lVariableLength_bins = cf_res.cfVariableLength_pt_bins.value; break; - case AFO_ETA: + } + case AFO_ETA: { lVariableLength_bins = cf_res.cfVariableLength_eta_bins.value; break; - case AFO_OCCUPANCY: + } + case AFO_OCCUPANCY: { lVariableLength_bins = cf_res.cfVariableLength_occu_bins.value; break; - case AFO_INTERACTIONRATE: + } + case AFO_INTERACTIONRATE: { lVariableLength_bins = cf_res.cfVariableLength_ir_bins.value; break; - case AFO_CURRENTRUNDURATION: + } + case AFO_CURRENTRUNDURATION: { lVariableLength_bins = cf_res.cfVariableLength_crd_bins.value; break; - case AFO_VZ: + } + case AFO_VZ: { lVariableLength_bins = cf_res.cfVariableLength_vz_bins.value; break; + } // ... - default: + default: { LOGF(fatal, "\033[1;31m%s at line %d : This enum AFO = %d is not supported yet. \033[0m", __FUNCTION__, __LINE__, static_cast(AFO)); break; + } } // switch(AFO) // From this point onward, the code is the same for any AFO variable: @@ -1523,7 +1611,7 @@ void DefaultCuts() // *) Use or do not use a cut enumerated in eEventHistograms + eEventCuts. // Default cuts are set in configurable cfUseEventCuts - auto lUseEventCuts = (vector)cf_ec.cfUseEventCuts; + auto lUseEventCuts = (std::vector)cf_ec.cfUseEventCuts; if (lUseEventCuts.size() != eEventCuts_N) { LOGF(info, "\033[1;31m lUseEventCuts.size() = %d\033[0m", lUseEventCuts.size()); LOGF(info, "\033[1;31m eEventCuts_N = %d\033[0m", static_cast(eEventCuts_N)); @@ -1613,6 +1701,10 @@ void DefaultCuts() auto lMultiplicity = (std::vector)cf_ec.cfMultiplicity; ec.fdEventCuts[eMultiplicity][eMin] = lMultiplicity[eMin]; ec.fdEventCuts[eMultiplicity][eMax] = lMultiplicity[eMax]; + // If I have requested fFixedNumberOfRandomlySelectedTracks, then I do not care about events with smaller number of particles: + if (tc.fFixedNumberOfRandomlySelectedTracks > 0) { + ec.fdEventCuts[eMultiplicity][eMin] = tc.fFixedNumberOfRandomlySelectedTracks; + } auto lReferenceMultiplicity = (std::vector)cf_ec.cfReferenceMultiplicity; ec.fdEventCuts[eReferenceMultiplicity][eMin] = lReferenceMultiplicity[eMin]; @@ -1682,7 +1774,7 @@ void DefaultCuts() // *) Use or do not use a cut enumerated in eParticleHistograms + eParticleCuts. // Default cuts are set in configurable cfUseParticleCuts - auto lUseParticleCuts = (std::vector)cf_pc.cfUseParticleCuts; + auto lUseParticleCuts = (std::vector)cf_pc.cfUseParticleCuts; if (lUseParticleCuts.size() != eParticleCuts_N) { LOGF(info, "\033[1;31m lUseParticleCuts.size() = %d\033[0m", lUseParticleCuts.size()); LOGF(info, "\033[1;31m eParticleCuts_N = %d\033[0m", static_cast(eParticleCuts_N)); @@ -1847,6 +1939,8 @@ void SpecificCuts(TString whichSpecificCuts) specificCuts = eLHC24as; } else if (whichSpecificCuts.EqualTo("LHC15o")) { specificCuts = eLHC15o; + } else if (whichSpecificCuts.EqualTo("Test")) { + specificCuts = eTestCuts; } else { LOGF(fatal, "\033[1;31m%s at line %d : whichSpecificCuts = %s is not supported \033[0m", __FUNCTION__, __LINE__, whichSpecificCuts.Data()); } @@ -1860,7 +1954,7 @@ void SpecificCuts(TString whichSpecificCuts) // Remark #3: Most up-to-date documentation of each cut is in enum file. switch (specificCuts) { - case eLHC23zzh: + case eLHC23zzh: { // In this branch I implement default cuts and settings for PbPb Run 3 datasets collected in 2023. // If I change some cut here, keep in sync. with other branches (e.g. for 2024 data). @@ -1917,9 +2011,10 @@ void SpecificCuts(TString whichSpecificCuts) pc.fUseParticleCuts[eisPVContributor] = true; break; + } case eLHC24ar: - case eLHC24as: + case eLHC24as: { // In this branch I implement default cuts and settings for PbPb Run 3 datasets collected in 2024: // If I change some cut here, keep in sync. with other branches (e.g. for 2023 data). @@ -1979,8 +2074,9 @@ void SpecificCuts(TString whichSpecificCuts) pc.fUseParticleCuts[eisPVContributor] = true; break; + } - case eLHC15o: + case eLHC15o: { // In this branch I implement default cuts and settings for Run 2 datasets: @@ -2030,13 +2126,67 @@ void SpecificCuts(TString whichSpecificCuts) // ... break; + } + + // ... + + case eTestCuts: { + + // In this branch I implement default cuts and settings for minimal subscription, "processTest": "true in JSON + + // Event cuts: + // ec.fUseEventCuts[eSel7] = true; // TBI 20250115 ehen i procees in "Rec" some converted Run 2 MC, it removes 99% of events, see enum + ec.fUseEventCuts[eSel8] = false; + ec.fUseEventCuts[eNoSameBunchPileup] = false; + ec.fUseEventCuts[eIsGoodZvtxFT0vsPV] = false; + ec.fUseEventCuts[eIsVertexITSTPC] = false; + ec.fUseEventCuts[eNoCollInTimeRangeStrict] = false; + ec.fUseEventCuts[eNoCollInRofStrict] = false; + ec.fUseEventCuts[eNoHighMultCollInPrevRof] = false; + ec.fUseEventCuts[eNoCollInTimeRangeStandard] = false; + ec.fUseEventCuts[eNoCollInRofStrict] = false; + ec.fUseEventCuts[eNoCollInRofStandard] = false; + ec.fUseEventCuts[eNoCollInRofStandard] = false; + ec.fUseEventCuts[eIsGoodITSLayer3] = false; + ec.fUseEventCuts[eIsGoodITSLayer0123] = false; + ec.fUseEventCuts[eIsGoodITSLayersAll] = false; + + // ec.fUseEventCuts[eTrigger] = true; + // ec.fsEventCuts[eTrigger] = "kINT7"; // TBI 20250115 cannot be used when i procees in "Rec" some converted Run 2 MC, see enum // ... - default: + // Particle cuts: + pc.fUseParticleCuts[eisInAcceptanceTrack] = false; // see enum + pc.fUseParticleCuts[etrackCutFlagFb1] = false; // only for Run 3 + pc.fUseParticleCuts[etrackCutFlagFb2] = false; // only for Run 3 + pc.fUseParticleCuts[eisPVContributor] = false; // only for Run 3 + + // ... + + // The rest: + mupa.fCalculateCorrelationsAsFunctionOf[AFO_OCCUPANCY] = false; + mupa.fCalculateCorrelationsAsFunctionOf[AFO_INTERACTIONRATE] = false; + mupa.fCalculateCorrelationsAsFunctionOf[AFO_CURRENTRUNDURATION] = false; + + t0.fCalculateTest0AsFunctionOf[AFO_OCCUPANCY] = false; + t0.fCalculateTest0AsFunctionOf[AFO_INTERACTIONRATE] = false; + t0.fCalculateTest0AsFunctionOf[AFO_CURRENTRUNDURATION] = false; + + es.fCalculateEtaSeparationsAsFunctionOf[AFO_OCCUPANCY] = false; + es.fCalculateEtaSeparationsAsFunctionOf[AFO_INTERACTIONRATE] = false; + es.fCalculateEtaSeparationsAsFunctionOf[AFO_CURRENTRUNDURATION] = false; + + // ... + + break; + } + + default: { LOGF(fatal, "\033[1;31m%s at line %d : specificCuts = %d is not supported yet \033[0m", __FUNCTION__, __LINE__, static_cast(specificCuts)); break; - } // switch((specificCuts)) + } + } // switch (specificCuts) if (tc.fVerbose) { ExitFunction(__FUNCTION__); @@ -2186,9 +2336,14 @@ void InsanityChecksBeforeBooking() } } - // **) Enforce that if fixed number of randomly selected tracks is used in the analysis, that Fisher-Yates algorithm is enabled: + // **) Enforce that if the fixed number of randomly selected tracks is used in the analysis, that Fisher-Yates algorithm is enabled: if (tc.fFixedNumberOfRandomlySelectedTracks > 0 && !tc.fUseFisherYates) { - LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); + LOGF(fatal, "\033[1;31m%s at line %d\033[0m : Did you forget to enable Fisher-Yates algorithm?", __FUNCTION__, __LINE__); + } + + // **) Enforce that if the fixed number of randomly selected tracks is used that Toy NUA is disabled: + if (tc.fFixedNumberOfRandomlySelectedTracks > 0 && (nua.fApplyNUAPDF[ePhiNUAPDF] || nua.fApplyNUAPDF[ePtNUAPDF] || nua.fApplyNUAPDF[eEtaNUAPDF])) { + LOGF(fatal, "\033[1;31m%s at line %d : Not supported at the moment: use FixedNumberOfRandomlySelectedTracks + Toy NUA enabled.\nI cannot in an easy way ensure that ParticleCuts behave exactly the same in the Main and Banishment loops, because e.g. I call consequtively for same partcile gRandom->Uniform(...) in ParticleCuts, and that can't work.\033[0m", __FUNCTION__, __LINE__); } // **) When it comes to DCAxy cut, ensure that either flat or pt-dependent cut is used, but not both: @@ -2627,6 +2782,8 @@ void BookAndNestAllLists() // **) QA event histograms; // **) QA particle histograms; // **) QA particle event histograms; + // **) QA "correlations vs." histograms: + // **) QA "correlations vs. IR vs. " profiles; // *) Control event histograms; // *) Control particle histograms; // *) Correlations; @@ -2650,7 +2807,7 @@ void BookAndNestAllLists() qa.fQAList->SetOwner(true); fBaseList->Add(qa.fQAList); - // **) QA event histograms; + // **) QA event histograms: if (qa.fFillQAEventHistograms2D) { qa.fQAEventList = new TList(); qa.fQAEventList->SetName("QAEvent"); @@ -2658,7 +2815,7 @@ void BookAndNestAllLists() qa.fQAList->Add(qa.fQAEventList); // yes, this one is nested within base QA TList } - // **) QA particle histograms; + // **) QA particle histograms: if (qa.fFillQAParticleHistograms2D) { qa.fQAParticleList = new TList(); qa.fQAParticleList->SetName("QAParticle"); @@ -2666,7 +2823,7 @@ void BookAndNestAllLists() qa.fQAList->Add(qa.fQAParticleList); // yes, this one is nested within base QA TList } - // **) QA particle event histograms; + // **) QA particle event histograms: if (qa.fFillQAParticleEventHistograms2D) { qa.fQAParticleEventList = new TList(); qa.fQAParticleEventList->SetName("QAParticleEvent"); @@ -2674,7 +2831,7 @@ void BookAndNestAllLists() qa.fQAList->Add(qa.fQAParticleEventList); // yes, this one is nested within base QA TList } - // **) QA "correlations vs." histograms; + // **) QA "correlations vs." histograms: if (qa.fFillQACorrelationsVsHistograms2D) { qa.fQACorrelationsVsList = new TList(); qa.fQACorrelationsVsList->SetName("QACorrelationsVs"); @@ -2682,6 +2839,14 @@ void BookAndNestAllLists() qa.fQAList->Add(qa.fQACorrelationsVsList); // yes, this one is nested within base QA TList } + // **) QA "correlations vs. IR vs. " profiles: + if (qa.fFillQACorrelationsVsInteractionRateVsProfiles2D) { + qa.fQACorrelationsVsInteractionRateVsList = new TList(); + qa.fQACorrelationsVsInteractionRateVsList->SetName("QACorrelationsVsInteractionRateVsList"); + qa.fQACorrelationsVsInteractionRateVsList->SetOwner(true); + qa.fQAList->Add(qa.fQACorrelationsVsInteractionRateVsList); // yes, this one is nested within base QA TList + } + // *) Event cuts: ec.fEventCutsList = new TList(); ec.fEventCutsList->SetName("EventCuts"); @@ -2785,7 +2950,8 @@ void BookQAHistograms() // c) Book specific QA 2D event histograms; // d) Book specific QA 2D particle histograms; // e) Book specific QA 2D particle event histograms; - // f) Book specific QA 2D "correlations vs." histograms. + // f) Book specific QA 2D "correlations vs." histograms; + // g) Book specific QA 2D "correlations vs. IR vs. " profiles. if (tc.fVerbose) { StartFunction(__FUNCTION__); @@ -2804,7 +2970,7 @@ void BookQAHistograms() } // a) Book the profile holding flags: - qa.fQAHistogramsPro = new TProfile("fQAHistogramsPro", "flags for QA histograms", 6, 0., 6.); + qa.fQAHistogramsPro = new TProfile("fQAHistogramsPro", "flags for QA histograms", 7, 0., 7.); qa.fQAHistogramsPro->SetStats(false); qa.fQAHistogramsPro->SetLineColor(eColor); qa.fQAHistogramsPro->SetFillColor(eFillColor); @@ -2818,8 +2984,10 @@ void BookQAHistograms() qa.fQAHistogramsPro->Fill(3.5, static_cast(qa.fFillQAParticleEventHistograms2D)); qa.fQAHistogramsPro->GetXaxis()->SetBinLabel(5, "fFillQACorrelationsVsHistograms2D"); qa.fQAHistogramsPro->Fill(4.5, static_cast(qa.fFillQACorrelationsVsHistograms2D)); - qa.fQAHistogramsPro->GetXaxis()->SetBinLabel(6, "fRebin"); - qa.fQAHistogramsPro->Fill(5.5, static_cast(qa.fRebin)); + qa.fQAHistogramsPro->GetXaxis()->SetBinLabel(6, "fFillQACorrelationsVsInteractionRateVsProfiles2D"); + qa.fQAHistogramsPro->Fill(5.5, static_cast(qa.fFillQACorrelationsVsInteractionRateVsProfiles2D)); + qa.fQAHistogramsPro->GetXaxis()->SetBinLabel(7, "fRebin"); + qa.fQAHistogramsPro->Fill(6.5, static_cast(qa.fRebin)); // ... @@ -3148,6 +3316,7 @@ void BookQAHistograms() continue; } + // valgrind --tool=massif => ~9.8 MiB (Last check: 20250315) qa.fQAEventHistograms2D[t][rs][ba] = new TH2F( TString::Format("fQAEventHistograms2D[%s][%s][%s]", qa.fEventHistogramsName2D[t].Data(), gc.srs[rs].Data(), gc.sba[ba].Data()), TString::Format("%s, %s, %s", "__RUN_NUMBER__", gc.srs_long[rs].Data(), gc.sba_long[ba].Data()), // __RUN_NUMBER__ is handled in PropagateRunNumber(...) @@ -3212,6 +3381,7 @@ void BookQAHistograms() for (int ba = 0; ba < 2; ba++) // before/after cuts { + // valgrind --tool=massif => ~30.6 MiB (Last check: 20250315) qa.fQAParticleHistograms2D[t][rs][ba] = new TH2F( TString::Format("fQAParticleHistograms2D[%s][%s][%s]", qa.fParticleHistogramsName2D[t].Data(), gc.srs[rs].Data(), gc.sba[ba].Data()), TString::Format("%s, %s, %s", "__RUN_NUMBER__", gc.srs_long[rs].Data(), gc.sba_long[ba].Data()), // __RUN_NUMBER__ is handled in PropagateRunNumber(...) @@ -3372,6 +3542,7 @@ void BookQAHistograms() continue; } + // valgrind --tool=massif => ~70.2 MiB (Last check: 20250315) qa.fQAParticleEventHistograms2D[t][rs][ba] = new TH2F( TString::Format("fQAParticleEventHistograms2D[%s][%s][%s]", qa.fQAParticleEventHistogramsName2D[t].Data(), gc.srs[rs].Data(), gc.sba[ba].Data()), TString::Format("%s, %s, %s", "__RUN_NUMBER__", gc.srs_long[rs].Data(), gc.sba_long[ba].Data()), // __RUN_NUMBER__ is handled in PropagateRunNumber(...) @@ -3502,6 +3673,7 @@ void BookQAHistograms() continue; } + // valgrind --tool=massif => ~58.7 MiB (Last check: 20250315) qa.fQACorrelationsVsHistograms2D[t][h][rs] = new TH2F( TString::Format("fQACorrelationsVsHistograms2D[%s][%d][%s]", qa.fQACorrelationsVsHistogramsName2D[t].Data(), h, gc.srs[rs].Data()), TString::Format("%s, %s", "__RUN_NUMBER__", gc.srs_long[rs].Data()), // __RUN_NUMBER__ is handled in PropagateRunNumber(...) @@ -3519,6 +3691,133 @@ void BookQAHistograms() } // for(int t=0;t(eh.fEventHistogramsBins[eInteractionRate][0] / qa.fRebin); + double min_x_CorrelationsVsInteractionRateVs = eh.fEventHistogramsBins[eInteractionRate][1]; + double max_x_CorrelationsVsInteractionRateVs = eh.fEventHistogramsBins[eInteractionRate][2]; + TString title_x_CorrelationsVsInteractionRateVs = "interaction rate"; + int nBins_y_CorrelationsVsInteractionRateVs[eQACorrelationsVsInteractionRateVsProfiles2D_N] = {0}; + double min_y_CorrelationsVsInteractionRateVs[eQACorrelationsVsInteractionRateVsProfiles2D_N] = {0.}; + double max_y_CorrelationsVsInteractionRateVs[eQACorrelationsVsInteractionRateVsProfiles2D_N] = {0.}; + TString title_y_CorrelationsVsInteractionRateVs[eQACorrelationsVsInteractionRateVsProfiles2D_N] = {""}; + + // *) "eCorrelationsVsInteractionRate_vs_CurrentRunDuration": + nBins_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_CurrentRunDuration] = static_cast(eh.fEventHistogramsBins[eCurrentRunDuration][0] / qa.fRebin); + min_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_CurrentRunDuration] = eh.fEventHistogramsBins[eCurrentRunDuration][1]; + max_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_CurrentRunDuration] = eh.fEventHistogramsBins[eCurrentRunDuration][2]; + title_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_CurrentRunDuration] = FancyFormatting(eh.fEventHistogramsName[eCurrentRunDuration].Data()); + + // *) "eCorrelationsVsInteractionRate_vs_Multiplicity": + nBins_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_Multiplicity] = static_cast(eh.fEventHistogramsBins[eMultiplicity][0] / qa.fRebin); + min_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_Multiplicity] = eh.fEventHistogramsBins[eMultiplicity][1]; + max_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_Multiplicity] = eh.fEventHistogramsBins[eMultiplicity][2]; + title_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_Multiplicity] = FancyFormatting(eh.fEventHistogramsName[eMultiplicity].Data()); + + // *) "eCorrelationsVsInteractionRate_vs_ReferenceMultiplicity": + nBins_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_ReferenceMultiplicity] = static_cast(eh.fEventHistogramsBins[eReferenceMultiplicity][0] / qa.fRebin); + min_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_ReferenceMultiplicity] = eh.fEventHistogramsBins[eReferenceMultiplicity][1]; + max_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_ReferenceMultiplicity] = eh.fEventHistogramsBins[eReferenceMultiplicity][2]; + title_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_ReferenceMultiplicity] = FancyFormatting(eh.fEventHistogramsName[eReferenceMultiplicity].Data()); + + // *) "eCorrelationsVsInteractionRate_vs_Centrality": + nBins_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_Centrality] = static_cast(eh.fEventHistogramsBins[eCentrality][0]); + min_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_Centrality] = eh.fEventHistogramsBins[eCentrality][1]; + max_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_Centrality] = eh.fEventHistogramsBins[eCentrality][2]; + title_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_Centrality] = FancyFormatting(eh.fEventHistogramsName[eCentrality].Data()); + + // ..... + + // *) "eCorrelationsVsInteractionRate_vs_MeanPhi": + nBins_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_MeanPhi] = 200; + min_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_MeanPhi] = 0.; + max_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_MeanPhi] = o2::constants::math::TwoPI; + title_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_MeanPhi] = FancyFormatting(ph.fParticleHistogramsName[ePhi].Data()); + + // *) "eCorrelationsVsInteractionRate_vs_SigmaMeanPhi": + nBins_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_SigmaMeanPhi] = 200; + min_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_SigmaMeanPhi] = 0.; + max_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_SigmaMeanPhi] = 1.0; + title_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_SigmaMeanPhi] = TString::Format("#sigma_{%s}", FancyFormatting(ph.fParticleHistogramsName[ePhi].Data())); + + // *) "eCorrelationsVsInteractionRate_vs_MeanPt": + nBins_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_MeanPt] = 200; + min_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_MeanPt] = 0.0; + max_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_MeanPt] = 2.0; + title_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_MeanPt] = FancyFormatting(ph.fParticleHistogramsName[ePt].Data()); + + // *) "eCorrelationsVsInteractionRate_vs_SigmaMeanPt": + nBins_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_SigmaMeanPt] = 200; + min_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_SigmaMeanPt] = 0.; + max_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_SigmaMeanPt] = 1.0; + title_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_SigmaMeanPt] = TString::Format("#sigma_{%s}", FancyFormatting(ph.fParticleHistogramsName[ePt].Data())); + + // *) "eCorrelationsVsInteractionRate_vs_MeanEta": + nBins_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_MeanEta] = 600; + min_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_MeanEta] = -0.5; + max_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_MeanEta] = 0.5; + title_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_MeanEta] = FancyFormatting(ph.fParticleHistogramsName[eEta].Data()); + + // *) "eCorrelationsVsInteractionRate_vs_SigmaMeanEta": + nBins_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_SigmaMeanEta] = 200; + min_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_SigmaMeanEta] = 0.; + max_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_SigmaMeanEta] = 1.0; + title_y_CorrelationsVsInteractionRateVs[eCorrelationsVsInteractionRate_vs_SigmaMeanEta] = TString::Format("#sigma_{%s}", FancyFormatting(ph.fParticleHistogramsName[eEta].Data())); + + // ..... + + // *) Quick insanity check on title_x_CorrelationsVsInteractionRateVs and title_y_CorrelationsVsInteractionRateVs: + if (title_x_CorrelationsVsInteractionRateVs.EqualTo("")) { + LOGF(fatal, "\033[1;31m%s at line %d : title_x_CorrelationsVsInteractionRateVs is not set, check corresponding enum \033[0m", __FUNCTION__, __LINE__); + } + for (int t = 0; t < eQACorrelationsVsInteractionRateVsProfiles2D_N; t++) { + if (title_y_CorrelationsVsInteractionRateVs[t].EqualTo("")) { + LOGF(fatal, "\033[1;31m%s at line %d : title_y_CorrelationsVsInteractionRateVs[%d] is not set, check corresponding enum \033[0m", __FUNCTION__, __LINE__, t); + } + } + + // Okay, let's book 'em all: + for (int t = 0; t < eQACorrelationsVsInteractionRateVsProfiles2D_N; t++) // type, see enum eQACorrelationsVsInteractionRateVsProfiles2D + { + if (!qa.fBookQACorrelationsVsInteractionRateVsProfiles2D[t]) { + continue; + } + + for (int h = 0; h < gMaxHarmonic; h++) { + + if (h + 1 < qa.fQACorrelationsVsInteractionRateVsProfilesMinMaxHarmonic[eMin] || h + 1 >= qa.fQACorrelationsVsInteractionRateVsProfilesMinMaxHarmonic[eMax]) { + continue; + } + + for (int rs = 0; rs < 2; rs++) // reco/sim + { + + if (Skip(rs)) { + continue; + } + + // TBI 20250317 documet here the output of profiling using valgrind --tool=massif + qa.fQACorrVsIRVsProfiles2D[t][h][rs] = new TProfile2D( + TString::Format("fQACorrVsIRVsProfiles2D[%s][%d][%s]", qa.fQACorrelationsVsInteractionRateVsProfilesName2D[t].Data(), h, gc.srs[rs].Data()), + TString::Format("%s, %s", "__RUN_NUMBER__", gc.srs_long[rs].Data()), // __RUN_NUMBER__ is handled in PropagateRunNumber(...) + nBins_x_CorrelationsVsInteractionRateVs, min_x_CorrelationsVsInteractionRateVs, max_x_CorrelationsVsInteractionRateVs, nBins_y_CorrelationsVsInteractionRateVs[t], min_y_CorrelationsVsInteractionRateVs[t], max_y_CorrelationsVsInteractionRateVs[t]); + + TString tmp = qa.fQACorrVsIRVsProfiles2D[t][h][rs]->GetTitle(); // translating e.g. "544114, reconstructed" into "<<2>> (harmonic = 2), 544114, reconstructed" + qa.fQACorrVsIRVsProfiles2D[t][h][rs]->SetTitle(TString::Format("#LT#LT2#GT#GT (harmonic = %d), %s", h + 1, tmp.Data())); + qa.fQACorrVsIRVsProfiles2D[t][h][rs]->GetXaxis()->SetTitle(title_x_CorrelationsVsInteractionRateVs.Data()); + qa.fQACorrVsIRVsProfiles2D[t][h][rs]->GetYaxis()->SetTitle(title_y_CorrelationsVsInteractionRateVs[t].Data()); + qa.fQACorrVsIRVsProfiles2D[t][h][rs]->SetLineColor(ec.fBeforeAfterColor[eAfter]); + qa.fQACorrVsIRVsProfiles2D[t][h][rs]->SetFillColor(ec.fBeforeAfterColor[eAfter] - 10); + qa.fQACorrVsIRVsProfiles2D[t][h][rs]->SetOption("col"); + qa.fQACorrelationsVsInteractionRateVsList->Add(qa.fQACorrVsIRVsProfiles2D[t][h][rs]); + } // for(int rs=0;rs<2;rs++) // reco/sim + + } // for (int h = 0; h < gMaxHarmonic; h++) { + + } // for(int t=0;t(eEventCuts_N) + 0.5); // I cast in double the last argument, because that's what this particular TH1I constructor expects. And yes, +0.5, because eEventCuts kicks off from 0 + ec.fEventCutCounterHist[rs][cc] = new TH1F(TString::Format("fEventCutCounterHist[%s][%s]", gc.srs[rs].Data(), gc.scc[cc].Data()), TString::Format("%s, %s, event cut counter (%s)", "__RUN_NUMBER__", gc.srs_long[rs].Data(), gc.scc_long[cc].Data()), eEventCuts_N, 0.5, static_cast(eEventCuts_N) + 0.5); // I cast in double the last argument, because that's what this particular TH1I constructor expects. And yes, +0.5, because eEventCuts kicks off from 0 ec.fEventCutCounterHist[rs][cc]->SetStats(false); ec.fEventCutCounterHist[rs][cc]->SetLineColor(eColor); ec.fEventCutCounterHist[rs][cc]->SetFillColor(eFillColor); @@ -4705,7 +5004,7 @@ void BookInternalValidationHistograms() // b) Book and fill container vn amplitudes: iv.fInternalValidationVnPsin[eVn] = new TArrayD(gMaxHarmonic); - auto lInternalValidationAmplitudes = (vector)cf_iv.cfInternalValidationAmplitudes; // this is now the local version of that array from configurable + auto lInternalValidationAmplitudes = (std::vector)cf_iv.cfInternalValidationAmplitudes; // this is now the local version of that array from configurable if (lInternalValidationAmplitudes.size() < 1) { LOGF(fatal, "\033[1;31m%s at line %d : set at least one vn amplitude in array cfInternalValidationAmplitudes\n \033[0m", __FUNCTION__, __LINE__); } @@ -4718,7 +5017,7 @@ void BookInternalValidationHistograms() // c) Book and fill container for Psin planes: iv.fInternalValidationVnPsin[ePsin] = new TArrayD(gMaxHarmonic); - auto lInternalValidationPlanes = (vector)cf_iv.cfInternalValidationPlanes; + auto lInternalValidationPlanes = (std::vector)cf_iv.cfInternalValidationPlanes; if (lInternalValidationPlanes.size() < 1) { LOGF(fatal, "\033[1;31m%s at line : %d set at least one Psi plane in array cfInternalValidationPlanes\n \033[0m", __FUNCTION__, __LINE__); } @@ -4733,7 +5032,7 @@ void BookInternalValidationHistograms() } // d) Handle multiplicity for internal validation: - auto lMultRangeInternalValidation = (vector)cf_iv.cfMultRangeInternalValidation; + auto lMultRangeInternalValidation = (std::vector)cf_iv.cfMultRangeInternalValidation; iv.fMultRangeInternalValidation[eMin] = lMultRangeInternalValidation[eMin]; iv.fMultRangeInternalValidation[eMax] = lMultRangeInternalValidation[eMax]; if (iv.fMultRangeInternalValidation[eMin] >= iv.fMultRangeInternalValidation[eMax]) { @@ -5507,6 +5806,17 @@ void Preprocess(T1 const& collision, T2 const& bcs) CheckCurrentRunNumber(collision, bcs); } + // *) Check whether this run shall be skipped later from further processing in Steer(): + if (!tc.fSkipTheseRuns.EqualTo("")) { + // If tc.fSkipTheseRuns is not empty, that means it holds comma-separated list of runs to be skipped. Let's check it out... + SkipThisRun(); // I set inside the data member tc.fSkipRun , which serves then as a switch later all over the place + if (tc.fSkipRun) { + return; // yes, I bail out immediately from Preprocess, so that I do not waste time on fetching weights for this run + } + // TBI 20250316 Same comment here: At the moment I can access run number info only in process(...), but not in init(...) + // Once I can access run number info in init(...), this function shall be called in init(...), not in process(...) + } // if (!tc.fSkipTheseRuns.EqualTo("")) + // *) Fetch the weights for this particular run number. Do it only once. // TBI 20231012 If eventualy I can access programatically run number in init(...) at run time, this shall go there. if (!pw.fParticleWeightsAreFetched) { @@ -5591,8 +5901,12 @@ void DetermineRunNumber(T1 const& collision, T2 const&) LOGF(fatal, "\033[1;31m%s at line %d : tc.fRunTime[eDurationInSec] = %d is not positive\033[0m", __FUNCTION__, __LINE__, tc.fRunTime[eDurationInSec]); } + } else if constexpr (rs == eTest) { + LOGF(warning, "\033[1;33m%s at line %d : RunNumber cannot be determined for eTest mode, due to minimal subscription. Setting run number manually to some dummy value. If you do not like this, extend subscription to more tables.\033[0m", __FUNCTION__, __LINE__); + tc.fRunNumber = "123456"; } else { - // b) Determine run number for the rest. TBI 20241126 differentiate this support as well, e.g. for eRecSim and eSim. + // b) Determine run number for the rest. + // TBI 20241126 differentiate this support as well, e.g. for eRecSim and eSim. LOGF(fatal, "\033[1;31m%s at line %d : bc.runNumber() is not validated yet for this case\033[0m", __FUNCTION__, __LINE__); } tc.fRunNumberIsDetermined = true; @@ -5750,6 +6064,24 @@ void PropagateRunNumber() } // for (int h = 0; h < gMaxHarmonic; h++) } // for (int t = 0; t < eQACorrelationsVsHistograms2D_N; t++) // type, see enum eCorrelationsVsHistograms2D + // *) "correlations vs. IR vs. " profiles 2D: + for (int t = 0; t < eQACorrelationsVsInteractionRateVsProfiles2D_N; t++) // type, see enum eCorrelationsVsInteractionRateVsProfiles2D + { + for (int h = 0; h < gMaxHarmonic; h++) { + for (int rs = 0; rs < 2; rs++) // reco/sim + { + if (!qa.fQACorrVsIRVsProfiles2D[t][h][rs]) { + continue; + } + histTitle = qa.fQACorrVsIRVsProfiles2D[t][h][rs]->GetTitle(); + if (histTitle.Contains("__RUN_NUMBER__")) { + histTitle.ReplaceAll("__RUN_NUMBER__", tc.fRunNumber.Data()); // it replaces in-place + qa.fQACorrVsIRVsProfiles2D[t][h][rs]->SetTitle(histTitle.Data()); + } + } // for(int rs=0;rs<2;rs++) // reco/sim + } // for (int h = 0; h < gMaxHarmonic; h++) + } // for (int t = 0; t < eQACorrelationsVsInteractionRateVsProfiles2D_N; t++) // type, see enum eCorrelationsVsInteractionRateVsProfiles2D + // *) particle cuts: for (int rs = 0; rs < 2; rs++) // reco/sim { @@ -5879,6 +6211,8 @@ void CheckCurrentRunNumber(T1 const& collision, T2 const&) LOGF(fatal, "tc.fRunTime[eDurationInSec] = %d, durationInSec = %d", tc.fRunTime[eDurationInSec], durationInSec); } + } else if constexpr (rs == eTest) { + LOGF(warning, "\033[1;33m%s at line %d : RunNumber cannot be checked in eTest mode, due to minimal subscription. Simply skipping this check. If you do not like this, extend subscription to more tables.\033[0m", __FUNCTION__, __LINE__); } else { // b) The rest: @@ -6144,7 +6478,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) // d) Event cuts on simulated (Run 3 specific); // e) Event cuts on reconstructed, and corresponding MC truth simulated (Run 1 and 2 specific); // In case there is some corner case between Run 1 and Run 2, simply branch further this one // f) Event cuts on simulated (Run 1 and 2 specific); // In case there is some corner case between Run 1 and Run 2, simply branch further this one - // *) Event cuts on Test case. + // *) Event cuts for Test case. if (tc.fVerbose) { StartFunction(__FUNCTION__); @@ -6720,9 +7054,9 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) // *) Vertex_z: if (ec.fUseEventCuts[eVertex_z]) { if (cutModus == eCutCounterBinning) { - EventCut(eSim, eVertex_z, eCutCounterBinning); + EventCut(eRec, eVertex_z, eCutCounterBinning); } else if (collision.posZ() < ec.fdEventCuts[eVertex_z][eMin] || collision.posZ() > ec.fdEventCuts[eVertex_z][eMax] || TMath::Abs(collision.posZ() - ec.fdEventCuts[eVertex_z][eMax]) < tc.fFloatingPointPrecision) { - if (!EventCut(eSim, eVertex_z, cutModus)) { + if (!EventCut(eRec, eVertex_z, cutModus)) { return false; } } @@ -6768,29 +7102,34 @@ bool EventCut(int rs, int eventCut, eCutModus cutModus) // *) Do the thing: switch (cutModus) { - case eCut: + case eCut: { if (tc.fVerboseEventCut) { LOGF(info, "\033[1;31mEvent didn't survive the cut: %s\033[0m", ec.fEventCutName[eventCut].Data()); } return false; break; - case eCutCounterBinning: + } + case eCutCounterBinning: { ec.fEventCutCounterMap[rs]->Add(ec.fEventCutCounterBinNumber[rs], eventCut); ec.fEventCutCounterMapInverse[rs]->Add(eventCut, ec.fEventCutCounterBinNumber[rs]); ec.fEventCutCounterBinNumber[rs]++; // yes return true; break; - case eCutCounterAbsolute: + } + case eCutCounterAbsolute: { ec.fEventCutCounterHist[rs][eAbsolute]->Fill(ec.fEventCutCounterMapInverse[rs]->GetValue(eventCut)); return true; // yes, so that I can proceed with another cut in EventCuts break; - case eCutCounterSequential: + } + case eCutCounterSequential: { ec.fEventCutCounterHist[rs][eSequential]->Fill(ec.fEventCutCounterMapInverse[rs]->GetValue(eventCut)); return false; // yes, so that I bail out from EventCuts break; - default: + } + default: { LOGF(fatal, "\033[1;31m%s at line %d : This cutModus = %d is not supported yet. \033[0m", __FUNCTION__, __LINE__, static_cast(cutModus)); break; + } } // switch(cutModus) return false; // obsolete, but it suppresses the warning... @@ -6953,9 +7292,9 @@ void FillEventHistograms(T1 const& collision, T2 const& tracks, eBeforeAfter ba) if (wTwo > 0.0) { twoC /= wTwo; } else { - LOGF(fatal, "In function \033[1;31m%s at line %d, wTwo = %f <=0. ebye.fSelectedTracks = %d\033[0m", __FUNCTION__, __LINE__, wTwo, ebye.fSelectedTracks); + LOGF(fatal, "In function \033[1;31m%s at line %d : wTwo = %f <=0. ebye.fSelectedTracks = %d.\nDid you forget to enable fCalculateQvectors = true?\033[0m", __FUNCTION__, __LINE__, wTwo, ebye.fSelectedTracks); } - !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_Multiplicity][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_Multiplicity][h - 1][eRec]->Fill(twoC, ebye.fMultiplicity); + !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_Multiplicity][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_Multiplicity][h - 1][eRec]->Fill(twoC, ebye.fMultiplicity); // Remark: I have exceptionally divided above already twoC /= wTwo , since I do not use here any particular weight !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_ReferenceMultiplicity][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_ReferenceMultiplicity][h - 1][eRec]->Fill(twoC, ebye.fReferenceMultiplicity); !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_Centrality][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_Centrality][h - 1][eRec]->Fill(twoC, ebye.fCentrality); // ..... @@ -6970,6 +7309,49 @@ void FillEventHistograms(T1 const& collision, T2 const& tracks, eBeforeAfter ba) } // if (qa.fFillQACorrelationsVsHistograms2D && qa.fQAParticleEventProEbyE[eRec][ba] && ba == eAfter) { + if (qa.fFillQACorrelationsVsInteractionRateVsProfiles2D && qa.fQAParticleEventProEbyE[eRec][ba] && ba == eAfter) { // fill only for eAfter, because I do not calculate Q-vectors before cuts + + // Calculate quickly 2-p correlation in harmonic h for this event: TBI 20250114 shall I add this also to some EbyE variable? There is no really much of a code bloat for the time being... + + // Flush 'n' fill the generic Q-vectors: + ResetQ(); + int lMaxCorrelator = 2; // used only here locally + for (int h = 0; h < gMaxHarmonic * lMaxCorrelator + 1; h++) { + for (int wp = 0; wp < lMaxCorrelator + 1; wp++) // weight power + { + qv.fQ[h][wp] = qv.fQvector[h][wp]; + } + } + + for (int h = 1; h <= gMaxHarmonic; h++) { + TComplex two = Two(h, -h); + double twoC = two.Re(); // cos + // double twoS = two.Im(); // sin + double wTwo = Two(0, 0).Re(); // Weight is 'number of combinations' by default TBI + // 20220809 add support for other weights + if (!(wTwo > 0.0)) { + LOGF(fatal, "In function \033[1;31m%s at line %d : wTwo = %f <=0. ebye.fSelectedTracks = %d.\nDid you forget to enable fCalculateQvectors = true?\033[0m", __FUNCTION__, __LINE__, wTwo, ebye.fSelectedTracks); + } + + !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_CurrentRunDuration][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_CurrentRunDuration][h - 1][eRec]->Fill(ebye.fInteractionRate, ebye.fCurrentRunDuration, twoC / wTwo, wTwo); + !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_Multiplicity][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_Multiplicity][h - 1][eRec]->Fill(ebye.fInteractionRate, ebye.fMultiplicity, twoC / wTwo, wTwo); + !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_ReferenceMultiplicity][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_ReferenceMultiplicity][h - 1][eRec]->Fill(ebye.fInteractionRate, ebye.fReferenceMultiplicity, twoC / wTwo, wTwo); + !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_Centrality][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_Centrality][h - 1][eRec]->Fill(ebye.fInteractionRate, ebye.fCentrality, twoC / wTwo, wTwo); + // ..... + !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_MeanPhi][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_MeanPhi][h - 1][eRec]->Fill(ebye.fInteractionRate, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeanPhi), twoC / wTwo, wTwo); + !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_SigmaMeanPhi][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_SigmaMeanPhi][h - 1][eRec]->Fill(ebye.fInteractionRate, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinError(eMeanPhi), twoC / wTwo, wTwo); + !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_MeanPt][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_MeanPt][h - 1][eRec]->Fill(ebye.fInteractionRate, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeanPt), twoC / wTwo, wTwo); + !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_SigmaMeanPt][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_SigmaMeanPt][h - 1][eRec]->Fill(ebye.fInteractionRate, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinError(eMeanPt), twoC / wTwo, wTwo); + !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_MeanEta][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_MeanEta][h - 1][eRec]->Fill(ebye.fInteractionRate, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeanEta), twoC / wTwo, wTwo); + !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_SigmaMeanEta][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_SigmaMeanEta][h - 1][eRec]->Fill(ebye.fInteractionRate, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinError(eMeanEta), twoC / wTwo, wTwo); + // ..... + } + + // Flush the generic Q-vectors: + ResetQ(); + + } // if (qa.fFillQACorrelationsVsInteractionRateVsProfiles2D && qa.fQAParticleEventProEbyE[eRec][ba] && ba == eAfter) { + // ... and corresponding MC truth simulated (common to Run 3, Run 2 and Run 1) ( see https://github.com/AliceO2Group/O2Physics/blob/master/Tutorials/src/mcHistograms.cxx ): if constexpr (rs == eRecAndSim || rs == eRecAndSim_Run2 || rs == eRecAndSim_Run1) { if (!collision.has_mcCollision()) { @@ -7130,6 +7512,7 @@ void FillEventHistograms(T1 const& collision, T2 const& tracks, eBeforeAfter ba) // TBI 20240223 for the time being, eTest fills only eRec histos: // A few example histograms, just to check if I access corresponding tables: if (eh.fFillEventHistograms) { + !eh.fEventHistograms[eNumberOfEvents][eRec][ba] ? true : eh.fEventHistograms[eNumberOfEvents][eRec][ba]->Fill(0.5); !eh.fEventHistograms[eVertex_z][eRec][ba] ? true : eh.fEventHistograms[eVertex_z][eRec][ba]->Fill(collision.posZ()); !eh.fEventHistograms[eTotalMultiplicity][eRec][ba] ? true : eh.fEventHistograms[eTotalMultiplicity][eRec][ba]->Fill(tracks.size()); !eh.fEventHistograms[eCentrality][eRec][ba] ? true : eh.fEventHistograms[eCentrality][eRec][ba]->Fill(ebye.fCentrality); @@ -8107,29 +8490,34 @@ bool ParticleCut(int rs, int particleCut, eCutModus cutModus) // Remark: Remember that as a second argument I cannot use enum eParticleCuts, because here in one go I take both enum eParticleCuts and enum eParticleHistograms . switch (cutModus) { - case eCut: + case eCut: { if (tc.fVerboseForEachParticle) { LOGF(info, "\033[1;31mParticle didn't pass the cut: %s\033[0m", pc.fParticleCutName[particleCut].Data()); } return false; break; - case eCutCounterBinning: + } + case eCutCounterBinning: { pc.fParticleCutCounterMap[rs]->Add(pc.fParticleCutCounterBinNumber[rs], particleCut); pc.fParticleCutCounterMapInverse[rs]->Add(particleCut, pc.fParticleCutCounterBinNumber[rs]); pc.fParticleCutCounterBinNumber[rs]++; // yes return true; break; - case eCutCounterAbsolute: + } + case eCutCounterAbsolute: { pc.fParticleCutCounterHist[rs][eAbsolute]->Fill(pc.fParticleCutCounterMapInverse[rs]->GetValue(particleCut)); return true; // yes, so that I can proceed with another cut in ParticleCuts break; - case eCutCounterSequential: + } + case eCutCounterSequential: { pc.fParticleCutCounterHist[rs][eSequential]->Fill(pc.fParticleCutCounterMapInverse[rs]->GetValue(particleCut)); return false; // yes, so that I bail out from ParticleCuts break; - default: + } + default: { LOGF(fatal, "\033[1;31m%s at line %d : This cutModus = %d is not supported yet. \033[0m", __FUNCTION__, __LINE__, static_cast(cutModus)); break; + } } // switch(cutModus) return false; // obsolete, but it suppresses the warning... @@ -8235,7 +8623,7 @@ void FillParticleHistograms(T const& track, eBeforeAfter ba, int weight = 1) if (qa.fFillQAParticleHistograms2D) { !qa.fQAParticleHistograms2D[ePt_vs_dcaXY][eRec][ba] ? true : qa.fQAParticleHistograms2D[ePt_vs_dcaXY][eRec][ba]->Fill(track.pt(), track.dcaXY(), weight); } - if ((qa.fFillQAParticleEventHistograms2D || qa.fFillQACorrelationsVsHistograms2D) && qa.fQAParticleEventProEbyE[eRec][ba]) { + if ((qa.fFillQAParticleEventHistograms2D || qa.fFillQACorrelationsVsHistograms2D || qa.fFillQACorrelationsVsInteractionRateVsProfiles2D) && qa.fQAParticleEventProEbyE[eRec][ba]) { // Here I only fill the helper profile to get average of requested particle variable for current event: qa.fQAParticleEventProEbyE[eRec][ba]->Fill(static_cast(eitsNClsEbyE) - 0.5, track.itsNCls(), weight); @@ -8777,17 +9165,20 @@ void CalculateKineCorrelations(eAsFunctionOf AFO_variable) // int nBins = -1; // TBI 20241111 temporarily commented out just to suppress warnings switch (AFO_variable) { - case AFO_PT: + case AFO_PT: { qvKine = PTq; // nBins = res.fResultsPro[AFO_PT]->GetNbinsX(); // TBI 20241111 temporarily commented out just to suppress warnings break; - case AFO_ETA: + } + case AFO_ETA: { qvKine = ETAq; // nBins = res.fResultsPro[AFO_ETA]->GetNbinsX(); // TBI 20241111 temporarily commented out just to suppress warnings break; - default: + } + default: { LOGF(fatal, "\033[1;31m%s at line %d : This AFO_variable = %d is not supported yet. \033[0m", __FUNCTION__, __LINE__, static_cast(AFO_variable)); break; + } } // switch(AFO_variable) // *) Insanity checks on above settings: @@ -9058,17 +9449,20 @@ void CalculateKineTest0(eAsFunctionOf AFO_variable) int nBins = -1; switch (AFO_variable) { - case AFO_PT: + case AFO_PT: { qvKine = PTq; nBins = res.fResultsPro[AFO_PT]->GetNbinsX(); break; - case AFO_ETA: + } + case AFO_ETA: { qvKine = ETAq; nBins = res.fResultsPro[AFO_ETA]->GetNbinsX(); break; - default: + } + default: { LOGF(fatal, "\033[1;31m%s at line %d : This AFO_variable = %d is not supported yet. \033[0m", __FUNCTION__, __LINE__, static_cast(AFO_variable)); break; + } } // switch(AFO_variable) // *) Insanity checks on above settings: @@ -9348,16 +9742,19 @@ void CalculateKineEtaSeparations(eAsFunctionOf AFO_variable) int nBins = -1; switch (AFO_variable) { - case AFO_PT: + case AFO_PT: { qvKine = PTq; nBins = res.fResultsPro[AFO_PT]->GetNbinsX(); break; - case AFO_ETA: + } + case AFO_ETA: { LOGF(fatal, "\033[1;31m%s at line %d : It doesn't make sense (i.e. AFO_ETA cannot be used here). \033[0m", __FUNCTION__, __LINE__, static_cast(AFO_variable)); break; // obsolete, but it supresses the warning - default: + } + default: { LOGF(fatal, "\033[1;31m%s at line %d : This AFO_variable = %d is not supported yet. \033[0m", __FUNCTION__, __LINE__, static_cast(AFO_variable)); break; + } } // switch(AFO_variable) // *) Insanity checks on above settings: @@ -10118,7 +10515,7 @@ void SetWeightsHist(TH1D* const hist, eWeights whichWeight) // Finally: hist->SetDirectory(0); - pw.fWeightsHist[whichWeight] = reinterpret_cast(hist->Clone()); + pw.fWeightsHist[whichWeight] = reinterpret_cast(hist); if (!pw.fWeightsHist[whichWeight]) { LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); @@ -10163,7 +10560,7 @@ void SetDiffWeightsHist(TH1D* const hist, eDiffWeights whichDiffWeight, int bin) // Finally: hist->SetDirectory(0); - pw.fDiffWeightsHist[whichDiffWeight][bin] = reinterpret_cast(hist->Clone()); + pw.fDiffWeightsHist[whichDiffWeight][bin] = reinterpret_cast(hist); if (!pw.fDiffWeightsHist[whichDiffWeight][bin]) { LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); @@ -10208,7 +10605,7 @@ void SetDiffWeightsSparse(THnSparseF* const sparse, eDiffWeightCategory dwc) // Finally: // sparse->SetDirectory(0); I cannot use this for sparse - pw.fDiffWeightsSparse[dwc] = reinterpret_cast(sparse->Clone()); + pw.fDiffWeightsSparse[dwc] = reinterpret_cast(sparse); if (!pw.fDiffWeightsSparse[dwc]) { LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); @@ -10265,7 +10662,7 @@ void SetCentralityWeightsHist(TH1D* const hist) // Finally: hist->SetDirectory(0); - cw.fCentralityWeightsHist = reinterpret_cast(hist->Clone()); + cw.fCentralityWeightsHist = reinterpret_cast(hist); if (!cw.fCentralityWeightsHist) { LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); @@ -10338,7 +10735,8 @@ TH1D* GetHistogramWithWeights(const char* filePath, const char* runNumber, const // d) Handle the AliEn case; // e) Handle the CCDB case; // f) Handle the local case; - // g) The final touch on histogram with weights. + // g) The final touch on histogram with weights; + // h) Clone histogram and delete baseList (realising back the memory). if (tc.fVerbose) { StartFunction(__FUNCTION__); @@ -10555,7 +10953,7 @@ TH1D* GetHistogramWithWeights(const char* filePath, const char* runNumber, const AFO = AFO_ETA; lVariableName = FancyFormatting("Eta"); } else { - LOGF(fatal, "\033[1;31m%s at line %d : name = %s is not supported yet. \033[0m", __FUNCTION__, __LINE__, static_cast(variable)); + LOGF(fatal, "\033[1;31m%s at line %d : name = %s is not supported yet. \033[0m", __FUNCTION__, __LINE__, static_cast(variable)); } // Get min and max value for bin, stored locally: @@ -10585,11 +10983,16 @@ TH1D* GetHistogramWithWeights(const char* filePath, const char* runNumber, const // TBI 20241021 if I need to split hist title across two lines, use this technique: // hist->SetTitle(Form("#splitline{#scale[0.6]{%s}}{#scale[0.4]{%s}}",hist->GetTitle(),filePath)); + // h) Clone histogram and delete baseList (realising back the memory): + // Remark: Yes, I have to clone here. + TH1D* histClone = reinterpret_cast(hist->Clone()); + delete baseList; // release back the memory + if (tc.fVerbose) { ExitFunction(__FUNCTION__); } - return hist; + return histClone; } // TH1D* GetHistogramWithWeights(const char* filePath, const char* runNumber, const char* variable, int bin = -1) @@ -10623,7 +11026,8 @@ THnSparseF* GetSparseHistogramWithWeights(const char* filePath, const char* runN // d) Handle the AliEn case; // e) Handle the CCDB case; // f) Handle the local case; - // g) The final touch on histogram with weights. + // g) The final touch on sparse histogram with weights; + // h) Clone histogram and delete baseList (realising back the memory). if (tc.fVerbose) { StartFunction(__FUNCTION__); @@ -10830,7 +11234,7 @@ THnSparseF* GetSparseHistogramWithWeights(const char* filePath, const char* runN AFO = AFO_ETA; lVariableName = FancyFormatting("Eta"); } else { - LOGF(fatal, "\033[1;31m%s at line %d : name = %s is not supported yet. \033[0m", __FUNCTION__, __LINE__, static_cast(variable)); + LOGF(fatal, "\033[1;31m%s at line %d : name = %s is not supported yet. \033[0m", __FUNCTION__, __LINE__, static_cast(variable)); } // Get min and max value for bin, stored locally: @@ -10859,11 +11263,16 @@ THnSparseF* GetSparseHistogramWithWeights(const char* filePath, const char* runN // TBI 20241021 if I need to split hist title across two lines, use this technique: // hist->SetTitle(Form("#splitline{#scale[0.6]{%s}}{#scale[0.4]{%s}}",hist->GetTitle(),filePath)); + // h) Clone histogram and delete baseList (realising back the memory): + // Remark: Yes, I have to clone here. + THnSparseF* sparseHistClone = reinterpret_cast(sparseHist->Clone()); + delete baseList; // release back the memory + if (tc.fVerbose) { ExitFunction(__FUNCTION__); } - return sparseHist; + return sparseHistClone; } // THnSparseF* GetSparseHistogramWithWeights(const char* filePath, const char* runNumber, const char* whichCategory, const char* whichDimensions) @@ -10884,7 +11293,8 @@ TH1D* GetHistogramWithCentralityWeights(const char* filePath, const char* runNum // d) Handle the AliEn case; // e) Handle the CCDB case; // f) Handle the local case; - // g) The final touch on histogram with centrality weights. + // g) The final touch on histogram with centrality weights; + // h) Clone histogram and delete baseList (realising back the memory). if (tc.fVerbose) { StartFunction(__FUNCTION__); @@ -11079,7 +11489,12 @@ TH1D* GetHistogramWithCentralityWeights(const char* filePath, const char* runNum ExitFunction(__FUNCTION__); } - return hist; + // h) Clone histogram and delete baseList (realising back the memory): + // Remark: Yes, I have to clone here. + TH1D* histClone = reinterpret_cast(hist->Clone()); + delete baseList; // release back the memory + + return histClone; } // TH1D* GetHistogramWithCentralityWeights(const char* filePath, const char* runNumber) @@ -11318,7 +11733,8 @@ void GetHistogramWithCustomNUA(const char* filePath, eNUAPDF variable) // d) Handle the AliEn case; // e) Handle the CCDB case; // f) Handle the local case; - // g) The final touch. + // g) The final touch; + // h) Clone histogram and delete baseList (realising back the memory). if (tc.fVerbose) { StartFunction(__FUNCTION__); @@ -11428,9 +11844,14 @@ void GetHistogramWithCustomNUA(const char* filePath, eNUAPDF variable) LOGF(info, "\033[1;31m nua.fCustomNUAPDFHistNames[variable]->Data() = %s\033[0m", nua.fCustomNUAPDFHistNames[variable]->Data()); LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); } + + // h) Clone histogram and delete baseList (realising back the memory). + // TBI 20250315 here I did it a bit differently than e.g. in GetHistogramWithWeights or in GetSparseHistogramWithWeights . + // If it's failing here, redo it in exactly the same way as I did it there. hist->SetDirectory(0); nua.fCustomNUAPDF[variable] = reinterpret_cast(hist->Clone()); nua.fCustomNUAPDF[variable]->SetTitle(Form("%s", filePath)); + delete baseList; // TBI 20240501 if additional cosmetics is needed, it can be implemented here @@ -12138,20 +12559,23 @@ bool MaxNumberOfEvents(eBeforeAfter ba) // *) Okay, do the thing: switch (ba) { - case eBefore: + case eBefore: { if (eh.fEventHistograms[eNumberOfEvents][rs][eBefore] && eh.fEventHistograms[eNumberOfEvents][rs][eBefore]->GetBinContent(1) == ec.fdEventCuts[eNumberOfEvents][eMax]) { reachedMaxNumberOfEvents = true; } break; - case eAfter: + } + case eAfter: { if (eh.fEventHistograms[eNumberOfEvents][rs][eAfter] && eh.fEventHistograms[eNumberOfEvents][rs][eAfter]->GetBinContent(1) == ec.fdEventCuts[eSelectedEvents][eMax]) { reachedMaxNumberOfEvents = true; } break; - default: + } + default: { LOGF(fatal, "\033[1;31m%s at line %d : enum ba = %d is not supported yet. \033[0m", __FUNCTION__, __LINE__, static_cast(ba)); break; - } + } + } // switch (ba) // *) Hasta la vista: if (tc.fVerbose) { @@ -12174,24 +12598,27 @@ void PrintEventCounter(eBeforeAfter ba) // *) Print or die: switch (ba) { - case eBefore: + case eBefore: { if (!tc.fPlainPrintout) { LOGF(info, "\033[1;32m%s : processing event %d ....\033[0m", __FUNCTION__, eh.fEventCounter[eTotal]); } else { LOGF(info, "%s : processing event %d ....", __FUNCTION__, eh.fEventCounter[eTotal]); } break; - case eAfter: + } + case eAfter: { if (!tc.fPlainPrintout) { LOGF(info, "\033[1;32m%s : event passed all cuts %d/%d\033[0m", __FUNCTION__, eh.fEventCounter[eProcessed], eh.fEventCounter[eTotal]); } else { LOGF(info, "%s : event passed all cuts %d/%d", __FUNCTION__, eh.fEventCounter[eProcessed], eh.fEventCounter[eTotal]); } break; - default: + } + default: { LOGF(fatal, "\033[1;31m%s at line %d : enum ba = %d is not supported yet. \033[0m", __FUNCTION__, __LINE__, static_cast(ba)); break; - } + } + } // switch (ba) if (tc.fVerbose) { ExitFunction(__FUNCTION__); @@ -12216,12 +12643,13 @@ void EventCounterForDryRun(eEventCounterForDryRun eVar) } switch (eVar) { - case eFill: + case eFill: { // Fill event counter: !eh.fEventHistograms[eNumberOfEvents][eRec][eAfter] ? true : eh.fEventHistograms[eNumberOfEvents][eRec][eAfter]->Fill(0.5); !eh.fEventHistograms[eNumberOfEvents][eSim][eAfter] ? true : eh.fEventHistograms[eNumberOfEvents][eSim][eAfter]->Fill(0.5); break; - case ePrint: + } + case ePrint: { // Print current status of event counter: // Remark: if I am processing RecSim, the counter is corresponding to Rec. if (eh.fEventHistograms[eNumberOfEvents][eRec][eAfter]) { @@ -12230,9 +12658,11 @@ void EventCounterForDryRun(eEventCounterForDryRun eVar) LOGF(info, "Processing event %d (dry run) ....", static_cast(eh.fEventHistograms[eNumberOfEvents][eSim][eAfter]->GetBinContent(1))); } break; - default: + } + default: { LOGF(fatal, "\033[1;31m%s at line %d : enum eVar = %d is not supported yet in eEventCounter. \033[0m", __FUNCTION__, __LINE__, static_cast(eVar)); break; + } } // switch(eVar) if (tc.fVerbose) { @@ -12547,17 +12977,20 @@ double CalculateKineCustomNestedLoops(TArrayI* harmonics, eAsFunctionOf AFO_vari eqvectorKine qvKine = eqvectorKine_N; // which component of q-vector TString kineVarName = ""; switch (AFO_variable) { - case AFO_PT: + case AFO_PT: { qvKine = PTq; kineVarName = "pt"; break; - case AFO_ETA: + } + case AFO_ETA: { qvKine = ETAq; kineVarName = "eta"; break; - default: + } + default: { LOGF(fatal, "\033[1;31m%s at line %d : This AFO_variable = %d is not supported yet. \033[0m", __FUNCTION__, __LINE__, static_cast(AFO_variable)); break; + } } // switch(AFO_variable) // *) Insanity checks on above settings: @@ -13258,7 +13691,7 @@ void BanishmentLoopOverParticles(T const& tracks) // *) Quick insanity checks (mandatory!): if (lSelectedTracks != ebye.fSelectedTracks) { - LOGF(fatal, "\033[1;31m%s at line %d : lSelectedTracks != ebye.fSelectedTracks , lSelectedTracks = %d, ebye.fSelectedTracks = %d \033[0m", __FUNCTION__, __LINE__, lSelectedTracks, ebye.fSelectedTracks); + LOGF(fatal, "\033[1;31m%s at line %d : lSelectedTracks != ebye.fSelectedTracks , lSelectedTracks = %d, ebye.fSelectedTracks = %d\nDid you accidentally enable Toy NUA? \033[0m", __FUNCTION__, __LINE__, lSelectedTracks, ebye.fSelectedTracks); } if (tc.fVerbose) { @@ -13683,19 +14116,22 @@ void Fillqvector(const double& dPhi, const double& kineVarValue, eqvectorKine ki eWeights AFO_weight = eWeights_N; // this local variable determines the enum "eWeights" which corresponds to enum "eqvectorKine" eDiffWeights AFO_diffWeight = eDiffWeights_N; // this local variable determines the enum "eDiffWeights" which corresponds to enum "eqvectorKine" switch (kineVarChoice) { - case PTq: + case PTq: { AFO_var = AFO_PT; AFO_weight = wPT; AFO_diffWeight = wPHIPT; break; - case ETAq: + } + case ETAq: { AFO_var = AFO_ETA; AFO_weight = wETA; AFO_diffWeight = wPHIETA; break; - default: + } + default: { LOGF(fatal, "\033[1;31m%s at line %d : this kineVarChoice = %d is not supported yet. \033[0m", __FUNCTION__, __LINE__, static_cast(kineVarChoice)); break; + } } // switch(kineVarChoice) // *) Insanity checks on above settings: @@ -13871,6 +14307,40 @@ void CalculateEverything() //============================================================ +void SkipThisRun() +{ + // Skip or not the current run from furher processing. + + // a) Insanity checks; + // b) Do the check. + + if (tc.fVerbose) { + StartFunction(__FUNCTION__); + } + // a) Insanity checks: + if (tc.fRunNumber.EqualTo("")) { + LOGF(fatal, "\033[1;31m%s at line %d : tc.fRunNumber is empty. In case you are running something on-the-fly, empty the string fSkipTheseRuns .\033[0m", __FUNCTION__, __LINE__); + } + + // TBI 20250516 Shall I implement some insanity check on fSkipTheseRuns? I commented in configurable that the format is comma-separated list of runs, + // but I am nowhere really enforcing that... + + // b) Do the check: + if (tc.fSkipTheseRuns.Contains(tc.fRunNumber.Data())) { + // TBI 20250316 I think this check is safe enough. If not, tokenize fSkipTheseRuns with respect to "," etc. + tc.fSkipRun = true; + } else { + tc.fSkipRun = false; + } + + if (tc.fVerbose) { + ExitFunction(__FUNCTION__); + } + +} // void SkipThisRun() + +//============================================================ + template void MainLoopOverParticles(T const& tracks) { @@ -14061,6 +14531,12 @@ void Steer(T1 const& collision, T2 const& bcs, T3 const& tracks) // *) Do all thingies before starting to process data from this collision (e.g. cut on number of events (both total and selected), fetch the run number, etc.): Preprocess(collision, bcs); + // *) It was explicitly requested, skip this particular run: + if (tc.fSkipRun) { + LOGF(info, "\033[1;33mPer exlicit request via configurable cfSkipTheseRuns, skipping run %s from further processing.\033[0m", tc.fRunNumber.Data()); + return; + } + // *) Determine collision reference multiplicity: DetermineReferenceMultiplicity(collision); diff --git a/PWGCF/MultiparticleCorrelations/Tasks/multiparticle-correlations-ab.cxx b/PWGCF/MultiparticleCorrelations/Tasks/multiparticle-correlations-ab.cxx index 4facc37f7c2..10c79bf8789 100644 --- a/PWGCF/MultiparticleCorrelations/Tasks/multiparticle-correlations-ab.cxx +++ b/PWGCF/MultiparticleCorrelations/Tasks/multiparticle-correlations-ab.cxx @@ -64,6 +64,7 @@ using CollisionRecSim_Run1 = soa::Join #include #include +#include #include #include #include @@ -274,6 +275,8 @@ struct MultiparticleCorrelationsAB // this name is used in lower-case format to // ------------------------------------------- // J) Process data with minimum subscription to the tables, for testing purposes: + // Remark: To keep this branch as simple as possible, I do not subscribe to centrality table. Therefore, when running with "processTest": "true" in JSON, + // I have to remove "| o2-analysis-centrality-table $JsonFile \" from workflow (yes, remove, not comment out!) void processTest(aod::Collision const& collision, aod::BCs const& bcs, aod::Tracks const& tracks) { Steer(collision, bcs, tracks); From 5e53440f847e17ef296bbc633bc1481eca95637d Mon Sep 17 00:00:00 2001 From: blacwovie Date: Tue, 18 Mar 2025 02:51:35 +0800 Subject: [PATCH 0726/1650] [PWGLF] add ITS Ncluster configurable (#10517) --- PWGLF/TableProducer/Nuspex/he3HadronFemto.cxx | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/PWGLF/TableProducer/Nuspex/he3HadronFemto.cxx b/PWGLF/TableProducer/Nuspex/he3HadronFemto.cxx index 016dec7e81d..41c1cf5ca58 100644 --- a/PWGLF/TableProducer/Nuspex/he3HadronFemto.cxx +++ b/PWGLF/TableProducer/Nuspex/he3HadronFemto.cxx @@ -138,6 +138,9 @@ struct he3HadCandidate { uint32_t itsClSizeHe3 = 0u; uint32_t itsClSizeHad = 0u; + uint8_t NClsITSHe3 = 0u; + uint8_t NClsITSHad = 0u; + bool isBkgUS = false; // unlike sign bool isBkgEM = false; // event mixing @@ -174,6 +177,7 @@ struct he3hadronfemto { Configurable setting_cutInvMass{"setting_cutInvMass", 0.0f, "Invariant mass upper limit"}; Configurable setting_cutPtMinhe3Had{"setting_cutPtMinhe3Had", 0.0f, "Minimum PT cut on he3Had4"}; Configurable setting_cutClSizeItsHe3{"setting_cutClSizeItsHe3", 4.0f, "Minimum ITS cluster size for He3"}; + Configurable setting_cutNCls{"setting_cutNCls", 5.0f, "Minimum ITS Ncluster for tracks"}; Configurable setting_cutNsigmaTPC{"setting_cutNsigmaTPC", 3.0f, "Value of the TPC Nsigma cut"}; Configurable setting_cutNsigmaITS{"setting_cutNsigmaITS", -1.5f, "Value of the TPC Nsigma cut"}; Configurable setting_cutPtMinTOFHad{"setting_cutPtMinTOFHad", 0.4f, "Minimum pT to apply the TOF cut on hadrons"}; @@ -239,6 +243,8 @@ struct he3hadronfemto { {"hEmptyPool", "svPoolCreator did not find track pairs false/true", {HistType::kTH1F, {{2, -0.5, 1.5}}}}, {"hDCAxyHe3", ";DCA_{xy} (cm)", {HistType::kTH1F, {{200, -1.0f, 1.0f}}}}, {"hDCAzHe3", ";DCA_{z} (cm)", {HistType::kTH1F, {{200, -1.0f, 1.0f}}}}, + {"hNClsHe3ITS", ";N_{ITS} Cluster", {HistType::kTH1F, {{20, -10.0f, 10.0f}}}}, + {"hNClsHadITS", ";N_{ITS} Cluster", {HistType::kTH1F, {{20, -10.0f, 10.0f}}}}, {"hhe3HadtInvMass", "; M(^{3}He + p) (GeV/#it{c}^{2})", {HistType::kTH1F, {{300, 3.74f, 4.34f}}}}, {"hHe3Pt", "#it{p}_{T} distribution; #it{p}_{T} (GeV/#it{c})", {HistType::kTH1F, {{240, -6.0f, 6.0f}}}}, {"hHadronPt", "Pt distribution; #it{p}_{T} (GeV/#it{c})", {HistType::kTH1F, {{120, -3.0f, 3.0f}}}}, @@ -377,7 +383,7 @@ struct he3hadronfemto { if (std::abs(candidate.eta()) > setting_cutEta) { return false; } - if (candidate.itsNCls() < 5 || + if (candidate.itsNCls() < setting_cutNCls || candidate.tpcNClsFound() < 90 || candidate.tpcNClsCrossedRows() < 70 || candidate.tpcNClsCrossedRows() < 0.8 * candidate.tpcNClsFindable() || @@ -578,6 +584,9 @@ struct he3hadronfemto { he3Hadcand.itsClSizeHe3 = trackHe3.itsClusterSizes(); he3Hadcand.itsClSizeHad = trackHad.itsClusterSizes(); + he3Hadcand.NClsITSHe3 = trackHe3.itsNCls(); + he3Hadcand.NClsITSHad = trackHad.itsNCls(); + he3Hadcand.sharedClustersHe3 = trackHe3.tpcNClsShared(); he3Hadcand.sharedClustersHad = trackHad.tpcNClsShared(); @@ -750,6 +759,8 @@ struct he3hadronfemto { m_qaRegistry.fill(HIST("hhe3HadtInvMass"), he3Hadcand.invMass); m_qaRegistry.fill(HIST("hDCAxyHe3"), he3Hadcand.DCAxyHe3); m_qaRegistry.fill(HIST("hDCAzHe3"), he3Hadcand.DCAzHe3); + m_qaRegistry.fill(HIST("hNClsHe3ITS"), he3Hadcand.NClsITSHe3); + m_qaRegistry.fill(HIST("hNClsHadITS"), he3Hadcand.NClsITSHad); } // ================================================================================================================== From b83cfaad8483526ac714a9280a470319755d6c97 Mon Sep 17 00:00:00 2001 From: rutuparnarath <105280001+rutuparnarath@users.noreply.github.com> Date: Mon, 17 Mar 2025 19:52:24 +0100 Subject: [PATCH 0727/1650] [PWGLF] Added functionality to estimate SL and EL (#10481) --- PWGLF/Tasks/Nuspex/LFNucleiBATask.cxx | 81 +++++++++++++++++++++++++-- 1 file changed, 77 insertions(+), 4 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/LFNucleiBATask.cxx b/PWGLF/Tasks/Nuspex/LFNucleiBATask.cxx index 22f1e5dcea2..f3f57325bac 100644 --- a/PWGLF/Tasks/Nuspex/LFNucleiBATask.cxx +++ b/PWGLF/Tasks/Nuspex/LFNucleiBATask.cxx @@ -57,6 +57,7 @@ struct LFNucleiBATask { HistogramRegistry spectraGen{"spectraGen", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; HistogramRegistry debugHistos{"debugHistos", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry evtimeHistos{"evtimeHistos", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry evLossHistos{"evLossHistos", {}, OutputObjHandlingPolicy::AnalysisObject}; // Enable particle for analysis Configurable enablePr{"enablePr", true, "Flag to enable proton analysis."}; @@ -268,6 +269,19 @@ struct LFNucleiBATask { if (doprocessData == true && doprocessMCReco == true) { LOG(fatal) << "Can't enable processData and processMCReco in the same time, pick one!"; } + if (doprocessEvSgLossMC) { + evLossHistos.add("evLoss/hEvent", "Event loss histograms; ; counts", HistType::kTH1F, {{3, 0., 3.}}); + evLossHistos.get(HIST("evLoss/hEvent"))->GetXaxis()->SetBinLabel(1, "All Gen."); + evLossHistos.get(HIST("evLoss/hEvent"))->GetXaxis()->SetBinLabel(2, "TVX (reco.)"); + evLossHistos.get(HIST("evLoss/hEvent"))->GetXaxis()->SetBinLabel(3, "Sel8 (reco.)"); + + evLossHistos.add("evLoss/pt/hDeuteronTriggeredTVX", "Track #it{p}_{T}; #it{p}_{T} (GeV/#it{c}); counts", HistType::kTH1F, {{100, 0., 5.}}); + evLossHistos.add("evLoss/pt/hDeuteronTriggeredSel8", "Track #it{p}_{T}; #it{p}_{T} (GeV/#it{c}); counts", HistType::kTH1F, {{100, 0., 5.}}); + evLossHistos.add("evLoss/pt/hDeuteronGen", "Track #it{p}_{T}; #it{p}_{T} (GeV/#it{c}); counts", HistType::kTH1F, {{100, 0., 5.}}); + evLossHistos.add("evLoss/pt/hAntiDeuteronTriggeredTVX", "Track #it{p}_{T}; #it{p}_{T} (GeV/#it{c}); counts", HistType::kTH1F, {{100, 0., 5.}}); + evLossHistos.add("evLoss/pt/hAntiDeuteronTriggeredSel8", "Track #it{p}_{T}; #it{p}_{T} (GeV/#it{c}); counts", HistType::kTH1F, {{100, 0., 5.}}); + evLossHistos.add("evLoss/pt/hAntiDeuteronGen", "Track #it{p}_{T}; #it{p}_{T} (GeV/#it{c}); counts", HistType::kTH1F, {{100, 0., 5.}}); + } spectraGen.add("LfEv/pT_nocut", "Track #it{p}_{T}; #it{p}_{T} (GeV/#it{c}); counts", HistType::kTH1F, {{ptHeAxis}}); spectraGen.add("LfEv/pT_TVXtrigger", "Track #it{p}_{T}; #it{p}_{T} (GeV/#it{c}); counts", HistType::kTH1F, {{ptHeAxis}}); spectraGen.add("LfEv/pT_TFrameBorder", "Track #it{p}_{T}; #it{p}_{T} (GeV/#it{c}); counts", HistType::kTH1F, {{ptHeAxis}}); @@ -2267,10 +2281,12 @@ struct LFNucleiBATask { break; } - float nITSTr, nITSHe; - nITSTr = track.itsNSigmaTr(); - nITSHe = track.itsNSigmaHe(); - + float nITSTr = 99.f; + float nITSHe = 99.f; + if (!IsFilteredData) { + nITSTr = track.itsNSigmaTr(); + nITSHe = track.itsNSigmaHe(); + } heP = track.p(); antiheP = track.p(); heTPCmomentum = track.tpcInnerParam(); @@ -6131,6 +6147,63 @@ struct LFNucleiBATask { } } // Close processMCGen PROCESS_SWITCH(LFNucleiBATask, processMCGen, "process MC Generated", true); + void processEvSgLossMC(aod::McCollision const& mcCollision, + aod::McParticles const& mcParticles, + const soa::SmallGroups& recoColls) + { + if (std::abs(mcCollision.posZ()) < cfgHighCutVertex) { + evLossHistos.fill(HIST("evLoss/hEvent"), 0.5); + } + + bool isSel8Event = false; + bool isTvxEvent = false; + + // Check if there is an event reconstructed for a generated event + for (const auto& recoColl : recoColls) { + if (std::abs(recoColl.posZ()) > cfgHighCutVertex) + continue; + if (recoColl.selection_bit(o2::aod::evsel::kIsTriggerTVX)) { + isTvxEvent = true; + } + if (recoColl.sel8()) { + isSel8Event = true; + } + } + + if (isTvxEvent) { + evLossHistos.fill(HIST("evLoss/hEvent"), 1.5); + } + if (isSel8Event) { + evLossHistos.fill(HIST("evLoss/hEvent"), 2.5); + } + + // Loop over all the Generated level particles + for (const auto& mcPart : mcParticles) { + if (!mcPart.isPhysicalPrimary()) + continue; + if (std::abs(mcPart.y()) >= 0.5) + continue; + if (mcPart.pdgCode() == PDGDeuteron) { + evLossHistos.fill(HIST("evLoss/pt/hDeuteronGen"), mcPart.pt()); + if (isTvxEvent) { + evLossHistos.fill(HIST("evLoss/pt/hDeuteronTriggeredTVX"), mcPart.pt()); + } + if (isSel8Event) { + evLossHistos.fill(HIST("evLoss/pt/hDeuteronTriggeredSel8"), mcPart.pt()); + } + } + if (mcPart.pdgCode() == -PDGDeuteron) { + evLossHistos.fill(HIST("evLoss/pt/hAntiDeuteronGen"), mcPart.pt()); + if (isTvxEvent) { + evLossHistos.fill(HIST("evLoss/pt/hAntiDeuteronTriggeredTVX"), mcPart.pt()); + } + if (isSel8Event) { + evLossHistos.fill(HIST("evLoss/pt/hAntiDeuteronTriggeredSel8"), mcPart.pt()); + } + } + } // MC particles + } + PROCESS_SWITCH(LFNucleiBATask, processEvSgLossMC, "process MC Sig Event", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From dbdf5fb39c0c7b22c06552ebd9aa22c14de09ce9 Mon Sep 17 00:00:00 2001 From: amatyja Date: Mon, 17 Mar 2025 20:35:30 +0100 Subject: [PATCH 0728/1650] [PWGUD] Occupancy, UPC flag, chi2TOF, ZDC added (#10502) --- PWGUD/Tasks/upcTauTau13topo.cxx | 724 ++++++++++++++++++++++++-------- 1 file changed, 552 insertions(+), 172 deletions(-) diff --git a/PWGUD/Tasks/upcTauTau13topo.cxx b/PWGUD/Tasks/upcTauTau13topo.cxx index efdd3257c71..d25e5616c82 100644 --- a/PWGUD/Tasks/upcTauTau13topo.cxx +++ b/PWGUD/Tasks/upcTauTau13topo.cxx @@ -64,7 +64,7 @@ struct TauTau13topo { // cut selection configurables Configurable zvertexcut{"zvertexcut", 10., "Z vertex cut"}; Configurable trkEtacut{"trkEtacut", 0.9, "max track eta cut"}; - Configurable sameSign{"sameSign", {}, "Switch: same(true) or opposite(false) sign"}; + Configurable sameSign{"sameSign", {}, "Switch: same (true) - BG or opposite (false) - SIGNAL sign"}; Configurable ptTotcut{"ptTotcut", 0.15, "min pt of all 4 tracks cut"}; Configurable minAnglecut{"minAnglecut", 0.05, "min angle between tracks cut"}; Configurable minNsigmaElcut{"minNsigmaElcut", -2., "min Nsigma for Electrons cut"}; @@ -85,8 +85,11 @@ struct TauTau13topo { Configurable deltaPhiMincut{"deltaPhiMincut", 0., "delta phi electron - 3 pi direction cut"}; Configurable nTPCcrossedRowsMinCut{"nTPCcrossedRowsMinCut", 50, "min N_crossed TPC rows for electron candidate"}; Configurable nSigma3piMaxCut{"nSigma3piMaxCut", 5., "n sigma 3 pi max cut"}; + Configurable whichPIDCut{"whichPIDCut", 1., "type of PID selection: 1-TPC,2-sigma(TPC+TOF),3-hardcoded ptCut,default=1"}; Configurable generatorIDMC{"generatorIDMC", -1, "MC generator ID"}; + Configurable removeNoTOFrunsInData{"removeNoTOFrunsInData", 1, "1-remove or 0-keep no TOF runs"}; + Configurable occupancyCut{"occupancyCut", 10000., "occupancy cut"}; // Configurable DGactive{"DGactive", false, "Switch on DGproducer"}; // Configurable SGactive{"SGactive", true, "Switch on SGproducer"}; @@ -143,6 +146,7 @@ struct TauTau13topo { registry.add("global/hTrackPtPV", ";p_T^{trk}; Entries", {HistType::kTH1F, {axispt}}); registry.add("global/hTrackEtaPhiPV", ";Eta;Phi;", {HistType::kTH2D, {axiseta, {140, -3.5, 3.5}}}); registry.add("global/hTrackEfficiencyPVGlobal", "0-All,1-ntpc,2-rat,3-chitpc,4chiits,5-dcaz,6-dcaxy,7pt,8eta;Track efficiency; Entries", {HistType::kTH1F, {{15, 0, 15}}}); + registry.add("global/hTrackPVGood", "0-All,1-ntpc,2-rat,3-chitpc,4chiits,5-dcaz,6-dcaxy,7pt,8eta;Track efficiency; Entries", {HistType::kTH1F, {{15, 0, 15}}}); registry.add("global/hTrackEtaPhiPVGlobal", ";Eta;Phi;", {HistType::kTH2D, {axiseta, {140, -3.5, 3.5}}}); registry.add("global/hSignalTPCvsPtPV", ";Pt;TPC Signal", {HistType::kTH2F, {axispt, {200, 0., 200}}}); @@ -179,6 +183,9 @@ struct TauTau13topo { registry.add("control/cut0/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); registry.add("control/cut0/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); registry.add("control/cut0/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry.add("control/cut0/hsigma3PiNew", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry.add("control/cut0/hsigma2PiNew", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}};#sigma^{2#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry.add("control/cut0/hsigma1PiNew", "#sqrt{#sigma_{1}^{2 }};#sigma^{1#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); registry.add("control/cut0/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); registry.add("control/cut0/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); registry.add("control/cut0/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); @@ -309,25 +316,25 @@ struct TauTau13topo { registry.add("control/cut22/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {{40, 0., 5.}}}); registry.add("control/cut22/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // // cut23 - // registry.add("control/cut23/h3piMassComb", "3#pi mass, 1 entry per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - // registry.add("control/cut23/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - // registry.add("control/cut23/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - // registry.add("control/cut23/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - // registry.add("control/cut23/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - // registry.add("control/cut23/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - // // registry.add("control/cut23/h13EtaSum", ";#eta^{1-prong}+#eta^{3-prong};entries", {HistType::kTH1F, {{100, -4., 4.}}}); - // registry.add("control/cut23/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - // registry.add("control/cut23/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registry.add("control/cut23/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registry.add("control/cut23/h3piMassVsPt", "3#pi mass vs Pt, 1 entry per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); - // registry.add("control/cut23/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); - // registry.add("control/cut23/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registry.add("control/cut23/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); - // registry.add("control/cut23/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - // registry.add("control/cut23/hZNACenergy", "ZNA vs ZNC energy; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); - // registry.add("control/cut23/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {{40, 0., 5.}}}); - // registry.add("control/cut23/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // cut23 occupancy + registry.add("control/cut23/h3piMassComb", "3#pi mass, 1 entry per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registry.add("control/cut23/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registry.add("control/cut23/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registry.add("control/cut23/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registry.add("control/cut23/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registry.add("control/cut23/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + // registry.add("control/cut23/h13EtaSum", ";#eta^{1-prong}+#eta^{3-prong};entries", {HistType::kTH1F, {{100, -4., 4.}}}); + registry.add("control/cut23/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registry.add("control/cut23/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry.add("control/cut23/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry.add("control/cut23/h3piMassVsPt", "3#pi mass vs Pt, 1 entry per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registry.add("control/cut23/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registry.add("control/cut23/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry.add("control/cut23/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + registry.add("control/cut23/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registry.add("control/cut23/hZNACenergy", "ZNA vs ZNC energy; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registry.add("control/cut23/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {{40, 0., 5.}}}); + registry.add("control/cut23/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); // cut24 registry.add("control/cut24/h3piMassComb", "3#pi mass, 1 entry per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); @@ -549,6 +556,66 @@ struct TauTau13topo { registry.add("control/cut34/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {{40, 0., 5.}}}); registry.add("control/cut34/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // cut35 + registry.add("control/cut35/h3piMassComb", "3#pi mass, 1 entry per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registry.add("control/cut35/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registry.add("control/cut35/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registry.add("control/cut35/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registry.add("control/cut35/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registry.add("control/cut35/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + // registry.add("control/cut35/h13EtaSum", ";#eta^{1-prong}+#eta^{3-prong};entries", {HistType::kTH1F, {{100, -4., 4.}}}); + registry.add("control/cut35/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registry.add("control/cut35/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry.add("control/cut35/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry.add("control/cut35/h3piMassVsPt", "3#pi mass vs Pt, 1 entry per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registry.add("control/cut35/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registry.add("control/cut35/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry.add("control/cut35/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + registry.add("control/cut35/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registry.add("control/cut35/hZNACenergy", "ZNA vs ZNC energy; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registry.add("control/cut35/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {{40, 0., 5.}}}); + registry.add("control/cut35/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // // cut36 + // registry.add("control/cut36/h3piMassComb", "3#pi mass, 1 entry per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + // registry.add("control/cut36/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + // registry.add("control/cut36/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + // registry.add("control/cut36/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + // registry.add("control/cut36/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + // registry.add("control/cut36/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + // // registry.add("control/cut36/h13EtaSum", ";#eta^{1-prong}+#eta^{3-prong};entries", {HistType::kTH1F, {{100, -4., 4.}}}); + // registry.add("control/cut36/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + // registry.add("control/cut36/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registry.add("control/cut36/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registry.add("control/cut36/h3piMassVsPt", "3#pi mass vs Pt, 1 entry per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + // registry.add("control/cut36/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + // registry.add("control/cut36/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registry.add("control/cut36/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registry.add("control/cut36/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + // registry.add("control/cut36/hZNACenergy", "ZNA vs ZNC energy; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + // registry.add("control/cut36/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {{40, 0., 5.}}}); + // registry.add("control/cut36/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + // // cut37 + // registry.add("control/cut37/h3piMassComb", "3#pi mass, 1 entry per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + // registry.add("control/cut37/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + // registry.add("control/cut37/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + // registry.add("control/cut37/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + // registry.add("control/cut37/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + // registry.add("control/cut37/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + // // registry.add("control/cut37/h13EtaSum", ";#eta^{1-prong}+#eta^{3-prong};entries", {HistType::kTH1F, {{100, -4., 4.}}}); + // registry.add("control/cut37/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + // registry.add("control/cut37/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registry.add("control/cut37/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registry.add("control/cut37/h3piMassVsPt", "3#pi mass vs Pt, 1 entry per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + // registry.add("control/cut37/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + // registry.add("control/cut37/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registry.add("control/cut37/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registry.add("control/cut37/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + // registry.add("control/cut37/hZNACenergy", "ZNA vs ZNC energy; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + // registry.add("control/cut37/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {{40, 0., 5.}}}); + // registry.add("control/cut37/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // pid El registry.add("pidTPC/hpvsdedxElHipCut0", "In hip ;#it{p}_{trk}(GeV/#it{c});dE/dx_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); registry.add("pidTPC/hpvsdedxElHipCut0CohPsi2s", "In hip ;#it{p}_{trk}(GeV/#it{c});dE/dx_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); @@ -572,7 +639,7 @@ struct TauTau13topo { registry.add("pidTPC/hpvsdedxElHipCut20", "El hip; #it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); registry.add("pidTPC/hpvsdedxElHipCut21", "vPi+20 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); registry.add("pidTPC/hpvsdedxElHipCut22", "vVc+21 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registry.add("pidTPC/hpvsdedxElHipCut23", "Pt+22 hip; #it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registry.add("pidTPC/hpvsdedxElHipCut23", "Occ+35 hip; #it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); registry.add("pidTPC/hpvsdedxElHipCut24", "vPr+23 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); registry.add("pidTPC/hpvsdedxElHipCut25", "vKa+24 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); registry.add("pidTPC/hpvsdedxElHipCut26", "IM+25 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); @@ -584,6 +651,9 @@ struct TauTau13topo { registry.add("pidTPC/hpvsdedxElHipCut32", "TOF+31 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); registry.add("pidTPC/hpvsdedxElHipCut33", "eTOF+1 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); registry.add("pidTPC/hpvsdedxElHipCut34", "piTOF+33 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registry.add("pidTPC/hpvsdedxElHipCut35", "ZDC+27 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registry.add("pidTPC/hpvsdedxElHipCut36", "Good+35 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + // registry.add("pidTPC/hpvsdedxElHipCut37", "TOFgood+36 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); registry.add("pidTPC/hpvsdedxElHipCut40", "All from gamma hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); @@ -634,19 +704,26 @@ struct TauTau13topo { registry.add("pidTOF/hpvsNsigmaElHipCut34", "piTOF+26 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); registry.add("pidTOF/hpvsNsigmaElHipCut30", "ptTot+34 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); registry.add("pidTOF/hpvsNsigmaElHipCut27", "DP+30 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); - // registry.add("pidTOF/hpvsNsigmaElHipCut35", "ZDC+27 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100,-5.,5.}}}); + registry.add("pidTOF/hpvsNsigmaElHipCut35", "ZDC+27 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry.add("pidTOF/hpvsNsigmaElHipCut23", "Occ+35 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry.add("pidTOF/hpvsNsigmaElHipCut36", "Good+23 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + // registry.add("pidTOF/hpvsNsigmaElHipCut37", "GoodTof+36 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); registry.add("pidTOF/h3piTOFchi2", "tof chi2;chi2 TOF;events", {HistType::kTH1F, {{100, 0., 10.}}}); registry.add("pidTOF/h3piTOFchi2Cut34", "tof chi2;chi2 TOF;events", {HistType::kTH1F, {{100, 0., 10.}}}); registry.add("pidTOF/h3piTOFchi2Cut30", "tof chi2;chi2 TOF;events", {HistType::kTH1F, {{100, 0., 10.}}}); registry.add("pidTOF/h3piTOFchi2Cut27", "tof chi2;chi2 TOF;events", {HistType::kTH1F, {{100, 0., 10.}}}); + registry.add("pidTOF/h3piTOFchi2Cut35", "tof chi2;chi2 TOF;events", {HistType::kTH1F, {{100, 0., 10.}}}); + registry.add("pidTOF/h3piTOFchi2Cut23", "tof chi2;chi2 TOF;events", {HistType::kTH1F, {{100, 0., 10.}}}); + registry.add("pidTOF/h3piTOFchi2Cut36", "tof chi2;chi2 TOF;events", {HistType::kTH1F, {{100, 0., 10.}}}); + // registry.add("pidTOF/h3piTOFchi2Cut37", "tof chi2;chi2 TOF;events", {HistType::kTH1F, {{100, 0., 10.}}}); // MC part // histograms filled by processSimpleMCSG // CollisionMC histograms registry1MC.add("globalMC/hGeneratorID", ";Generator ID;events", {HistType::kTH1F, {{100, 0., 1000.}}}); registryMC.add("globalMC/hMCZvertex", ";V_{Z}^{MC} (cm);events", {HistType::kTH1F, {{100, -25., 25.}}}); - registryMC.add("globalMC/hMCefficiency", ";Cut Number;events", {HistType::kTH1F, {{12, 0., 12.}}}); + registryMC.add("globalMC/hMCefficiency", ";Cut Number;events", {HistType::kTH1F, {{20, 0., 20.}}}); registryMC.add("globalMC/hMCnPart", ";N_{part};Type;events", {HistType::kTH2F, {{25, 0., 25.}, {10, 0, 10}}}); registryMC.add("globalMC/hMCetaGen", ";#eta^{gen};N^{MC particles}", {HistType::kTH1F, {{100, -5., 5.}}}); registryMC.add("globalMC/hMCphiGen", ";#phi^{gen};N^{MC particles}", {HistType::kTH1F, {{100, 0., 6.4}}}); @@ -726,15 +803,16 @@ struct TauTau13topo { registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut25", "vKa+24 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut28", "CR+25 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut22", "vVc+28 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - // registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut23", "Pt+22 hip; #it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut29", "s3pi+22 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut26", "IM+29 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut34", "piTOF+26 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut30", "ptTot+34 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut27", "DP+30 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut35", "ZDC+27 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut23", "Occ+35 hip; #it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + // registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut31", "FIT+27 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); // registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut32", "TOF+31 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut35", "ZDC+27 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); // pid Pi in MC true registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut0", "In hip ;#it{p}_{trk}(GeV/#it{c});dE/dx_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); @@ -745,15 +823,16 @@ struct TauTau13topo { registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut25", "vKa+24 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut28", "CR+25 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut22", "vVc+28 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - // registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut23", "Pt+22 hip; #it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut29", "s3pi+22 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut26", "IM+29 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut34", "piTOF+26 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut30", "ptTot+34 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut27", "DP+30 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut35", "ZDC+27 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut23", "Occ+35 hip; #it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + // registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut31", "FIT+27 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); // registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut32", "TOF+31 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut35", "ZDC+27 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); // El PID in TOF MC true registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut0", "In hip ;#it{p}_{trk}(GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); @@ -770,6 +849,7 @@ struct TauTau13topo { registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut30", "ptTot+34 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut27", "DP+30 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut35", "ZDC+27 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut23", "Occ+27 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); // cut0 registryMC.add("controlMCtrue/cut0/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); @@ -784,6 +864,10 @@ struct TauTau13topo { registryMC.add("controlMCtrue/cut0/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); registryMC.add("controlMCtrue/cut0/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); registryMC.add("controlMCtrue/cut0/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut0/hsigma3PiNew", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut0/hsigma2PiNew", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}};#sigma^{2#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut0/hsigma1PiNew", "#sqrt{#sigma_{1}^{2 }};#sigma^{1#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut0/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); registryMC.add("controlMCtrue/cut0/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); registryMC.add("controlMCtrue/cut0/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); @@ -967,34 +1051,6 @@ struct TauTau13topo { registryMC.add("controlMCcomb/cut22/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); registry1MC.add("controlMCcomb/cut22/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // //cut23 MC - // registryMC.add("controlMCtrue/cut23/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registryMC.add("controlMCtrue/cut23/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - // registryMC.add("controlMCtrue/cut23/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); - // registryMC.add("controlMCtrue/cut23/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); - // registryMC.add("controlMCtrue/cut23/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - // registryMC.add("controlMCtrue/cut23/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - // registryMC.add("controlMCtrue/cut23/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - // registryMC.add("controlMCtrue/cut23/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - // registryMC.add("controlMCtrue/cut23/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - // registryMC.add("controlMCtrue/cut23/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - // registryMC.add("controlMCtrue/cut23/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - // registryMC.add("controlMCtrue/cut23/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); - // registryMC.add("controlMCtrue/cut23/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registry1MC.add("controlMCtrue/cut23/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // // registryMC.add("controlMCtrue/cut23/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); - // // registryMC.add("controlMCtrue/cut23/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // // - // registryMC.add("controlMCcomb/cut23/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - // registryMC.add("controlMCcomb/cut23/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - // registryMC.add("controlMCcomb/cut23/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - // registryMC.add("controlMCcomb/cut23/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - // registryMC.add("controlMCcomb/cut23/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - // registryMC.add("controlMCcomb/cut23/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - // registryMC.add("controlMCcomb/cut23/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - // registryMC.add("controlMCcomb/cut23/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registry1MC.add("controlMCcomb/cut23/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // cut29 MC registryMC.add("controlMCtrue/cut29/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); registryMC.add("controlMCtrue/cut29/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); @@ -1249,6 +1305,34 @@ struct TauTau13topo { registryMC.add("controlMCcomb/cut35/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); registry1MC.add("controlMCcomb/cut35/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // cut23 MC + registryMC.add("controlMCtrue/cut23/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut23/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut23/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut23/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut23/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut23/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut23/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut23/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut23/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut23/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut23/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut23/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut23/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut23/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut23/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut23/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut23/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut23/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut23/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut23/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut23/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut23/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut23/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut23/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut23/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // ptSpectrum of electron for MC true and combinatorics registryMC.add("controlMCtrue/cut0/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); registryMC.add("controlMCtrue/cut20/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); @@ -1552,10 +1636,197 @@ struct TauTau13topo { return -1; } + // global track check + histogram cuts separatelly + template + bool isGlobalTrackCheck(T track) + { + bool isGlobalTrack = true; + registry.get(HIST("global/hTrackEfficiencyPVGlobal"))->Fill(0., 1.); + if (track.tpcNClsCrossedRows() > 70) { + registry.get(HIST("global/hTrackEfficiencyPVGlobal"))->Fill(1., 1.); + } else { + isGlobalTrack = false; + } + if (track.tpcNClsFindable() == 0) { + isGlobalTrack = false; + } else { + if (track.tpcNClsCrossedRows() / track.tpcNClsFindable() > 0.8) { + registry.get(HIST("global/hTrackEfficiencyPVGlobal"))->Fill(2., 1.); + } else { + isGlobalTrack = false; + } + } + if (track.tpcChi2NCl() < 4.) { + registry.get(HIST("global/hTrackEfficiencyPVGlobal"))->Fill(3., 1.); + } else { + isGlobalTrack = false; + } + if (track.itsChi2NCl() < 36.) { + registry.get(HIST("global/hTrackEfficiencyPVGlobal"))->Fill(4., 1.); + } else { + isGlobalTrack = false; + } + if (track.dcaZ() < 2.) { + registry.get(HIST("global/hTrackEfficiencyPVGlobal"))->Fill(5., 1.); + } else { + isGlobalTrack = false; + } + if (track.dcaXY() < 0.0105 * 0.035 / std::pow(track.pt(), 1.1)) { + registry.get(HIST("global/hTrackEfficiencyPVGlobal"))->Fill(6., 1.); + } else { + isGlobalTrack = false; + } + if (track.pt() > 0.1) { + registry.get(HIST("global/hTrackEfficiencyPVGlobal"))->Fill(7., 1.); + } else { + isGlobalTrack = false; + } + if (std::abs(eta(track.px(), track.py(), track.pz())) < 0.8) { + registry.get(HIST("global/hTrackEfficiencyPVGlobal"))->Fill(8., 1.); + } else { + isGlobalTrack = false; + } + if (track.hasITS()) { + registry.get(HIST("global/hTrackEfficiencyPVGlobal"))->Fill(9., 1.); + // old version + // clustermap1 = trk.itsClusterMap(); + // for (int bitNo = 0; bitNo < 7; bitNo++) { + // if (TESTBIT(clustermap1, bitNo)) { // check ITS bits/layers for each PV track + // registry.get(HIST("global/hITSbitPVtrk"))->Fill(bitNo, 1.); + // registry.get(HIST("global/hITSbitVsEtaPVtrk"))->Fill(p.Eta(), bitNo, 1.); + // nITSbits++; + // } + // } // end of loop over ITS bits + // + // isInnerITS = TESTBIT(clustermap1, 0) || TESTBIT(clustermap1, 1) || TESTBIT(clustermap1, 2); + // if (isInnerITS) { + // registry.get(HIST("global/hTrackEfficiencyPVGlobal"))->Fill(10., 1.); + // } else { + // isGlobalTrack = false; + // } + // + } else { + isGlobalTrack = false; + } + if (track.hasTPC()) { + registry.get(HIST("global/hTrackEfficiencyPVGlobal"))->Fill(11., 1.); + } else { + isGlobalTrack = false; + } + // final global track + if (isGlobalTrack) { + registry.get(HIST("global/hTrackEfficiencyPVGlobal"))->Fill(13., 1.); + } + return isGlobalTrack; + } // end of function + + // analysis track quality check with histogram filling + template + bool isGoodTrackCheckHisto(T track) + { + bool isGoodTrack = true; + registry.get(HIST("global/hTrackPVGood"))->Fill(0., 1.); + if (track.hasTPC()) { + registry.get(HIST("global/hTrackPVGood"))->Fill(1., 1.); + } else { + isGoodTrack = false; + } + if (track.tpcChi2NCl() < 4.) { + registry.get(HIST("global/hTrackPVGood"))->Fill(2., 1.); + } else { + isGoodTrack = false; + } + if (track.itsChi2NCl() < 36.) { + registry.get(HIST("global/hTrackPVGood"))->Fill(3., 1.); + } else { + isGoodTrack = false; + } + if (track.dcaZ() < 2.) { + registry.get(HIST("global/hTrackPVGood"))->Fill(4., 1.); + } else { + isGoodTrack = false; + } + if (track.dcaXY() < 0.0105 * 0.035 / std::pow(track.pt(), 1.1)) { + registry.get(HIST("global/hTrackPVGood"))->Fill(5., 1.); + } else { + isGoodTrack = false; + } + + if (track.tpcNClsCrossedRows() > 50) { + registry.get(HIST("global/hTrackPVGood"))->Fill(6., 1.); + } else { + isGoodTrack = false; + } + if (track.tpcNClsFindable() == 0) { + isGoodTrack = false; + } else { + if (track.tpcNClsCrossedRows() / track.tpcNClsFindable() > 0.8) { + registry.get(HIST("global/hTrackPVGood"))->Fill(7., 1.); + } else { + isGoodTrack = false; + } + } + if (isGoodTrack) { + registry.get(HIST("global/hTrackPVGood"))->Fill(13., 1.); + } + return isGoodTrack; + } + + // analysis track quality check + template + bool isGoodTrackCheck(T track) + { + if (!track.hasTPC()) + return false; + if (track.tpcChi2NCl() >= 4.) + return false; + if (track.itsChi2NCl() >= 36.) + return false; + // if (track.dcaZ() >= 2.) return false; + // if (track.dcaXY() >= 0.0105 * 0.035 / std::pow(track.pt(), 1.1)) return false; + if (track.tpcNClsCrossedRows() <= 50) + return false; + if (track.tpcNClsFindable() == 0) + return false; + if (track.tpcNClsCrossedRows() / track.tpcNClsFindable() <= 0.8) + return false; + return true; + } + + // analysis track quality check + template + bool isGoodTOFTrackCheckHisto(T track) + { + bool isGoodTrack = true; + if (track.hasTOF()) { + registry.get(HIST("global/hTrackPVGood"))->Fill(8., 1.); + } else { + isGoodTrack = false; + } + if (track.hasTOF() && track.tofChi2() < 3) { + registry.get(HIST("global/hTrackPVGood"))->Fill(9., 1.); + } else { + isGoodTrack = false; + } + return isGoodTrack; + } + + // analysis track quality check + template + bool isGoodTOFTrackCheck(T track) + { + if (!track.hasTOF()) + return false; + if (track.tofChi2() >= 3) + return false; + return true; + } + // using UDCollisionsFull = soa::Join; // using UDCollisionFull = UDCollisionsFull::iterator; using UDTracksFull = soa::Join; - using UDCollisionsFull2 = soa::Join; + // using UDCollisionsFull2 = soa::Join; // without occupancy cut + using UDCollisionsFull2 = soa::Join; using UDCollisionFull2 = UDCollisionsFull2::iterator; // PVContributors @@ -1566,8 +1837,8 @@ struct TauTau13topo { using LabeledTracks = soa::Join; Preslice perCollision = aod::udtrack::udCollisionId; // PVContributors in MC handling - Filter pVContributorFilterMC = aod::udtrack::isPVContributor == true; - using PVTracksMC = soa::Filtered; + // Filter pVContributorFilterMC = aod::udtrack::isPVContributor == true; + // using PVTracksMC = soa::Filtered; // void processDG(UDCollisionFull const& dgcand, UDTracksFull const& dgtracks) // { @@ -1579,10 +1850,19 @@ struct TauTau13topo { // void processSG(UDCollisionFull2 const& dgcand, UDTracksFull const& dgtracks) void processDataSG(UDCollisionFull2 const& dgcand, UDTracksFull const& dgtracks, PVTracks const& PVContributors) { - registry.get(HIST("global/hEventEff"))->Fill(0., 1.); + registry.get(HIST("global/hEventEff"))->Fill(-2., 1.); registry.get(HIST("global/RunNumber"))->Fill(dgcand.runNumber()); + if (removeNoTOFrunsInData) { + if (dgcand.runNumber() == 544091 || dgcand.runNumber() == 544095 || dgcand.runNumber() == 544121 || dgcand.runNumber() == 544451) + return; + } + registry.get(HIST("global/hEventEff"))->Fill(-1., 1.); registry.get(HIST("global/hRecFlag"))->Fill(dgcand.flags()); // reconstruction with upc settings flag - // registry.get(HIST("global/hOccupancyInTime"))->Fill(dgcand.occupancyInTime()); + registry.get(HIST("global/hOccupancyInTime"))->Fill(dgcand.occupancyInTime()); + + if (dgcand.occupancyInTime() >= occupancyCut) + return; + registry.get(HIST("global/hEventEff"))->Fill(0., 1.); int gapSide = dgcand.gapSide(); int truegapSide = sgSelector.trueGap(dgcand, cutFV0, cutFT0A, cutFT0C, cutZDC); @@ -1637,7 +1917,7 @@ struct TauTau13topo { // auto const pionMass = MassPiPlus; // auto const electronMass = MassElectron; bool flagGlobalCheck = true; - bool isGlobalTrack = true; + // bool isGlobalTrack = true; int qtot = 0; // loop over PV contributors for (const auto& trk : PVContributors) { @@ -1652,96 +1932,15 @@ struct TauTau13topo { npT100++; if (flagGlobalCheck) { - registry.get(HIST("global/hTrackEfficiencyPVGlobal"))->Fill(0., 1.); - if (trk.tpcNClsCrossedRows() > 70) { - registry.get(HIST("global/hTrackEfficiencyPVGlobal"))->Fill(1., 1.); - } else { - isGlobalTrack = false; - } - - if (trk.tpcNClsFindable() == 0) { - isGlobalTrack = false; - } else { - if (trk.tpcNClsCrossedRows() / trk.tpcNClsFindable() > 0.8) { - registry.get(HIST("global/hTrackEfficiencyPVGlobal"))->Fill(2., 1.); - } else { - isGlobalTrack = false; - } - } - - if (trk.tpcChi2NCl() < 4.) { - registry.get(HIST("global/hTrackEfficiencyPVGlobal"))->Fill(3., 1.); - } else { - isGlobalTrack = false; - } - - if (trk.itsChi2NCl() < 36.) { - registry.get(HIST("global/hTrackEfficiencyPVGlobal"))->Fill(4., 1.); - } else { - isGlobalTrack = false; - } - - if (trk.dcaZ() < 2.) { - registry.get(HIST("global/hTrackEfficiencyPVGlobal"))->Fill(5., 1.); - } else { - isGlobalTrack = false; - } - - if (trk.dcaXY() < 0.0105 * 0.035 / std::pow(trk.pt(), 1.1)) { - registry.get(HIST("global/hTrackEfficiencyPVGlobal"))->Fill(6., 1.); - } else { - isGlobalTrack = false; - } - - if (trk.pt() > 0.1) { - registry.get(HIST("global/hTrackEfficiencyPVGlobal"))->Fill(7., 1.); - } else { - isGlobalTrack = false; - } - - if (std::abs(p.Eta()) < 0.8) { - registry.get(HIST("global/hTrackEfficiencyPVGlobal"))->Fill(8., 1.); - } else { - isGlobalTrack = false; - } - - if (trk.hasITS()) { - registry.get(HIST("global/hTrackEfficiencyPVGlobal"))->Fill(9., 1.); - - // old version - // clustermap1 = trk.itsClusterMap(); - // for (int bitNo = 0; bitNo < 7; bitNo++) { - // if (TESTBIT(clustermap1, bitNo)) { // check ITS bits/layers for each PV track - // registry.get(HIST("global/hITSbitPVtrk"))->Fill(bitNo, 1.); - // registry.get(HIST("global/hITSbitVsEtaPVtrk"))->Fill(p.Eta(), bitNo, 1.); - // nITSbits++; - // } - // } // end of loop over ITS bits - // - // isInnerITS = TESTBIT(clustermap1, 0) || TESTBIT(clustermap1, 1) || TESTBIT(clustermap1, 2); - // if (isInnerITS) { - // registry.get(HIST("global/hTrackEfficiencyPVGlobal"))->Fill(10., 1.); - // } else { - // isGlobalTrack = false; - // } - // - } else { - isGlobalTrack = false; - } - - if (trk.hasTPC()) { - registry.get(HIST("global/hTrackEfficiencyPVGlobal"))->Fill(11., 1.); - } else { - isGlobalTrack = false; - } - - // final global track - if (isGlobalTrack) { - registry.get(HIST("global/hTrackEfficiencyPVGlobal"))->Fill(13., 1.); + if (isGlobalTrackCheck(trk)) { registry.get(HIST("global/hTrackEtaPhiPVGlobal"))->Fill(p.Eta(), p.Phi()); } } // end of flag check global + // check track selection + isGoodTrackCheckHisto(trk); + isGoodTOFTrackCheckHisto(trk); + // new version if (trk.hasITS()) { // ITS track nITSbits = -1; @@ -1934,21 +2133,24 @@ struct TauTau13topo { float nSigmaEl[4]; float nSigmaPi[4]; float nSigma3Pi[4] = {0., 0., 0., 0.}; + float nSigma3PiNew[4] = {0., 0., 0., 0.}; float nSigmaPr[4]; float nSigmaKa[4]; // float dcaZ[4]; // float dcaXY[4]; // float chi2TPC[4]; // float chi2ITS[4]; - float chi2TOF[4]; + float chi2TOF[4] = {-1., -1., -1., -1.}; // float nclTPCfind[4]; float nclTPCcrossedRows[4]; bool trkHasTof[4]; + bool trkHasTpc[4]; float mass3pi1e[4]; double trkTime[4]; float trkTimeRes[4]; double trkTimeTot = 0.; float trkTimeResTot = 10000.; + int nPiHasTPC[4] = {0, 0, 0, 0}; // 2 gamma from 4 electrons // 12 34 | 01 23 |//1 //6 | 0 5 |counter<3?counter:5-counter counter<3?0:1 @@ -1965,6 +2167,8 @@ struct TauTau13topo { for (const auto& trk1 : PVContributors) { if (trk.index() >= trk1.index()) continue; + if (trk1.hasTPC()) + nPiHasTPC[trk.index()]++; p1.SetXYZM(trk1.px(), trk1.py(), trk1.pz(), MassElectron); invMass2El[(counterTmp < 3 ? counterTmp : 5 - counterTmp)][(counterTmp < 3 ? 0 : 1)] = (p + p1).Mag2(); gammaPair[(counterTmp < 3 ? counterTmp : 5 - counterTmp)][(counterTmp < 3 ? 0 : 1)] = (p + p1); @@ -1994,10 +2198,16 @@ struct TauTau13topo { // remove combinatoric bool flagVcalPV[4] = {false, false, false, false}; + // bool trkIsGood[4] = {false, false, false, false}; + bool trkIsTOFGood[4] = {false, false, false, false}; + // second loop to calculate 1 by 1 each combinatorial variable counterTmp = 0; int tmpTrkCheck = -1; for (const auto& trk : PVContributors) { + // trkIsGood[counterTmp] = + isGoodTrackCheck(trk); + trkIsTOFGood[counterTmp] = isGoodTOFTrackCheck(trk); tmpTrkCheck = trackCheck(trk); // check detectors associated to track registry.get(HIST("global/hTrkCheck"))->Fill(tmpTrkCheck); @@ -2020,18 +2230,34 @@ struct TauTau13topo { nSigmaEl[counterTmp] = trk.tpcNSigmaEl(); nSigmaPi[counterTmp] = trk.tpcNSigmaPi(); nSigma3Pi[3] += (nSigmaPi[counterTmp] * nSigmaPi[counterTmp]); - // nSigmaPr[counterTmp] = trk.tpcNSigmaPr(); - nSigmaPr[counterTmp] = std::sqrt(trk.tofNSigmaPr() * trk.tofNSigmaPr() + trk.tpcNSigmaPr() * trk.tpcNSigmaPr()); - // nSigmaKa[counterTmp] = trk.tpcNSigmaKa(); - nSigmaKa[counterTmp] = std::sqrt(trk.tofNSigmaKa() * trk.tofNSigmaKa() + trk.tpcNSigmaKa() * trk.tpcNSigmaKa()); + if (trk.hasTPC()) + nSigma3PiNew[3] += (nSigmaPi[counterTmp] * nSigmaPi[counterTmp]); + + if (whichPIDCut == 1) { // TPC only + nSigmaPr[counterTmp] = trk.tpcNSigmaPr(); + nSigmaKa[counterTmp] = trk.tpcNSigmaKa(); + } else if (whichPIDCut == 2) { // TPC + TOF sigma + nSigmaPr[counterTmp] = std::sqrt(trk.tofNSigmaPr() * trk.tofNSigmaPr() + trk.tpcNSigmaPr() * trk.tpcNSigmaPr()); + nSigmaKa[counterTmp] = std::sqrt(trk.tofNSigmaKa() * trk.tofNSigmaKa() + trk.tpcNSigmaKa() * trk.tpcNSigmaKa()); + } else if (whichPIDCut == 3) { // TPC + TOF hardcoded pt + nSigmaPr[counterTmp] = (trk.pt() < 1.5 ? trk.tofNSigmaPr() : trk.tpcNSigmaPr()); + nSigmaKa[counterTmp] = (trk.pt() < 1.3 ? trk.tofNSigmaKa() : trk.tpcNSigmaKa()); + } else { + nSigmaPr[counterTmp] = trk.tpcNSigmaPr(); + nSigmaKa[counterTmp] = trk.tpcNSigmaKa(); + } + // dcaZ[counterTmp] = trk.dcaZ(); // dcaXY[counterTmp] = trk.dcaXY(); // chi2TPC[counterTmp] = trk.tpcChi2NCl(); // chi2ITS[counterTmp] = trk.itsChi2NCl(); - chi2TOF[counterTmp] = trk.tofChi2(); + if (trk.hasTOF()) + chi2TOF[counterTmp] = trk.tofChi2(); // nclTPCfind[counterTmp] = trk.tpcNClsFindable(); nclTPCcrossedRows[counterTmp] = trk.tpcNClsCrossedRows(); - trkHasTof[counterTmp] = trk.hasTOF(); + // trkHasTof[counterTmp] = trk.hasTOF(); + trkHasTof[counterTmp] = isGoodTOFTrackCheck(trk); + trkHasTpc[counterTmp] = trk.hasTPC(); trkTime[counterTmp] = trk.trackTime(); trkTimeRes[counterTmp] = trk.trackTimeRes(); @@ -2084,6 +2310,19 @@ struct TauTau13topo { nSigma3Pi[i] = nSigma3Pi[3] - (nSigmaPi[i] * nSigmaPi[i]); nSigma3Pi[i] = std::sqrt(nSigma3Pi[i]); registry.get(HIST("control/cut0/hsigma3Pi"))->Fill(nSigma3Pi[i]); + // nsigma3PiNew calculation + if (trkHasTpc[i]) { + nSigma3PiNew[i] = nSigma3PiNew[3] - (nSigmaPi[i] * nSigmaPi[i]); + } + nSigma3PiNew[i] = std::sqrt(nSigma3PiNew[i]); + + if (nPiHasTPC[i] == 3) + registry.get(HIST("control/cut0/hsigma3PiNew"))->Fill(nSigma3PiNew[i]); + if (nPiHasTPC[i] == 2) + registry.get(HIST("control/cut0/hsigma2PiNew"))->Fill(nSigma3PiNew[i]); + if (nPiHasTPC[i] == 1) + registry.get(HIST("control/cut0/hsigma1PiNew"))->Fill(nSigma3PiNew[i]); + // registry.get(HIST("control/cut0/h3pi1eMass"))->Fill(mass3pi1e[i]); } // end of loop over 4 tracks @@ -2590,7 +2829,8 @@ struct TauTau13topo { for (int j = 0; j < 4; j++) { if (i == j) continue; - if (trkHasTof[j]) { + // if (trkHasTof[j]) { + if (trkIsTOFGood[j]) { otherTOFtracks[i]++; registry.get(HIST("pidTOF/h3piTOFchi2"))->Fill(chi2TOF[j]); } @@ -2701,6 +2941,64 @@ struct TauTau13topo { return; } // end of Dphi + // + // skip events with znac energy cut 35 + // + if (energyZNA >= 1. && energyZNC >= 1.) { + if (verbose) { + LOGF(info, " Candidate rejected: ZNA, ZNC are %f, %f", energyZNA, energyZNC); + } + return; + } else { + registry.get(HIST("global/hEventEff"))->Fill(22., 1.); + registry.get(HIST("control/cut35/h4trkPtTot"))->Fill(pttot); + registry.get(HIST("control/cut35/h4piMass"))->Fill(mass4pi); + registry.get(HIST("control/cut35/h4trkMassVsPt"))->Fill(mass4pi, pttot); + registry.get(HIST("control/cut35/hNtofTrk"))->Fill(nTofTrk); + registry.get(HIST("control/cut35/hZNACenergy"))->Fill(energyZNA, energyZNC); + for (int i = 0; i < 4; i++) { + if (flagEl[i] && trkHasTof[i] && flagPi[i] && flagPr[i] && flagKa[i] && flagCR[i] && !flagVcalPV[i] && flagS3pi[i] && flagIM[i] && (otherTOFtracks[i] >= 1) && flagDP[i]) { + registry.get(HIST("pidTPC/hpvsdedxElHipCut35"))->Fill(tmpMomentum[i], tmpDedx[i]); + registry.get(HIST("pidTOF/hpvsNsigmaElHipCut35"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + fillControlHistos<35>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registry.get(HIST("control/cut35/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + registry.get(HIST("control/cut35/hsigma3Pi"))->Fill(nSigma3Pi[i]); + registry.get(HIST("control/cut35/h3pi1eMass"))->Fill(mass3pi1e[i]); + } else if (!flagEl[i] && trkHasTof[i]) { + registry.get(HIST("pidTOF/h3piTOFchi2Cut35"))->Fill(chi2TOF[i]); + } + } + } // end of ZNAC energy cut35 + + // + // skip events with occupancy >=1000 + // + if (dgcand.occupancyInTime() >= 1000) { + if (verbose) { + LOGF(info, " Candidate rejected: occupancy is %f", dgcand.occupancyInTime()); + } + return; + } else { + registry.get(HIST("global/hEventEff"))->Fill(23., 1.); + registry.get(HIST("control/cut23/h4trkPtTot"))->Fill(pttot); + registry.get(HIST("control/cut23/h4piMass"))->Fill(mass4pi); + registry.get(HIST("control/cut23/h4trkMassVsPt"))->Fill(mass4pi, pttot); + registry.get(HIST("control/cut23/hNtofTrk"))->Fill(nTofTrk); + registry.get(HIST("control/cut23/hZNACenergy"))->Fill(energyZNA, energyZNC); + for (int i = 0; i < 4; i++) { + if (flagEl[i] && trkHasTof[i] && flagPi[i] && flagPr[i] && flagKa[i] && flagCR[i] && !flagVcalPV[i] && flagS3pi[i] && flagIM[i] && (otherTOFtracks[i] >= 1) && flagDP[i]) { + registry.get(HIST("pidTPC/hpvsdedxElHipCut23"))->Fill(tmpMomentum[i], tmpDedx[i]); + registry.get(HIST("pidTOF/hpvsNsigmaElHipCut23"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + fillControlHistos<23>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registry.get(HIST("control/cut23/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + registry.get(HIST("control/cut23/hsigma3Pi"))->Fill(nSigma3Pi[i]); + registry.get(HIST("control/cut23/h3pi1eMass"))->Fill(mass3pi1e[i]); + } else if (!flagEl[i] && trkHasTof[i]) { + registry.get(HIST("pidTOF/h3piTOFchi2Cut23"))->Fill(chi2TOF[i]); + } + } + } // end of occupancy < 1000 cut23 + // // only 1 electron // if (counterTotal == 1) { // registry.get(HIST("global/hEventEff"))->Fill(19., 1.); @@ -2997,7 +3295,8 @@ struct TauTau13topo { } // end of processSimpleMCSG void processEfficiencyMCSG(aod::UDMcCollision const& mcCollision, - soa::SmallGroups> const& collisions, + // soa::SmallGroups> const& collisions, + soa::SmallGroups> const& collisions, LabeledTracks const& tracks, aod::UDMcParticles const& mcParticles) { @@ -3007,6 +3306,7 @@ struct TauTau13topo { // LOGF(info," GeneratorIDtot %d, GenID %d, subGenID %d, source %d", mcCollision.generatorsID(), mcCollision.getGeneratorId(), mcCollision.getSubGeneratorId(), mcCollision.getSourceId()); } registry1MC.get(HIST("globalMC/hGeneratorID"))->Fill(mcCollision.generatorsID()); + registryMC.get(HIST("globalMC/hMCefficiency"))->Fill(10., 1.); if (!(generatorIDMC < 0)) { // do not check generatorsID process if generatorIDMC < 0 if (mcCollision.generatorsID() != generatorIDMC) return; @@ -3025,15 +3325,20 @@ struct TauTau13topo { bool tauInRapidity = true; bool partFromTauInEta = true; + TLorentzVector tmp(0., 0., 0., 0.); + for (const auto& mcParticle : mcParticles) { if (mcParticle.isPhysicalPrimary()) { if (mcParticle.pdgCode() != 22 && std::abs(mcParticle.pdgCode()) != 12 && std::abs(mcParticle.pdgCode()) != 14 && std::abs(mcParticle.pdgCode()) != 16 && mcParticle.pdgCode() != 130 && mcParticle.pdgCode() != 111) { if (mcParticle.has_mothers()) { auto const& mother = mcParticle.mothers_first_as(); + tmp.SetPxPyPzE(mother.px(), mother.py(), mother.pz(), mother.e()); if (std::abs(mother.pdgCode()) == 15) { if (std::abs(rapidity(mother.e(), mother.pz())) > 0.9) + // if (std::abs(tmp.Rapidity()) > 0.9) tauInRapidity = false; if (std::abs(eta(mcParticle.px(), mcParticle.py(), mcParticle.pz())) > 0.9) + // if (std::abs(tmp.Eta()) > 0.9) partFromTauInEta = false; if (std::abs(mcParticle.pdgCode()) == 11) { @@ -3065,13 +3370,16 @@ struct TauTau13topo { } // end loop over mcParticle + registryMC.get(HIST("globalMC/hMCefficiency"))->Fill(11., 1.); if (count != 4) return; + registryMC.get(HIST("globalMC/hMCefficiency"))->Fill(12., 1.); if (!tauInRapidity) return; + registryMC.get(HIST("globalMC/hMCefficiency"))->Fill(13., 1.); if (!partFromTauInEta) return; - registryMC.get(HIST("globalMC/hMCefficiency"))->Fill(10., 1.); // just to confirm there is exactly the same selection + registryMC.get(HIST("globalMC/hMCefficiency"))->Fill(14., 1.); // just to confirm there is exactly the same selection if (index1ProngMC < 0) { // pion case + 3pi // bool onlyPi = true; @@ -3193,7 +3501,7 @@ struct TauTau13topo { // reconstructed event if (collisions.size() < 1) return; - registryMC.get(HIST("globalMC/hMCefficiency"))->Fill(11., 1.); // there is at least 1 collision associated to MC collision + registryMC.get(HIST("globalMC/hMCefficiency"))->Fill(15., 1.); // there is at least 1 collision associated to MC collision if (is1ProngElectronMC && is3prong3PiMC) { registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(4., 1.); if (collisions.size() == 1) @@ -3251,7 +3559,7 @@ struct TauTau13topo { } // end of loop over FIT bits registry1MC.get(HIST("globalMCrec/hRecFlag"))->Fill(collision.flags()); // reconstruction with upc settings flag - // registry1MC.get(HIST("globalMCrec/hOccupancyInTime"))->Fill(collision.occupancyInTime()); + registry1MC.get(HIST("globalMCrec/hOccupancyInTime"))->Fill(collision.occupancyInTime()); matchedElIndexToData = -1; reconstructedPtElMatchedToMC = -1; @@ -3458,20 +3766,23 @@ struct TauTau13topo { bool flagVcalPV[4] = {false, false, false, false}; float deltaphi = 0; bool trkHasTof[4] = {false, false, false, false}; - + int nPiHasTPC[4] = {0, 0, 0, 0}; // // second loop, only over PV tracks // for (int i = 0; i < 4; i++) { auto const tmptrack = groupedTracks.begin() + trackId[i]; - if (tmptrack.hasTOF()) - trkHasTof[i] = true; + // if (tmptrack.hasTOF()) + // trkHasTof[i] = true; + trkHasTof[i] = isGoodTOFTrackCheck(tmptrack); v1.SetXYZ(tmptrack.px(), tmptrack.py(), tmptrack.pz()); // second loop to calculate virtual calorimeter for (int j = 0; j < 4; j++) { if (i == j) continue; auto const tmptrack2 = groupedTracks.begin() + trackId[j]; + if (tmptrack2.hasTPC()) + nPiHasTPC[i]++; v2.SetXYZ(tmptrack2.px(), tmptrack2.py(), tmptrack2.pz()); deltaphi = v1.Angle(v2); if (deltaphi < minAnglecut) { // default 0.05 @@ -3606,13 +3917,14 @@ struct TauTau13topo { float nSigmaEl[4]; float nSigmaPi[4]; float nSigma3Pi[4] = {0., 0., 0., 0.}; + float nSigma3PiNew[4] = {0., 0., 0., 0.}; float nSigmaPr[4]; float nSigmaKa[4]; // float dcaZ[4]; // float dcaXY[4]; // float chi2TPC[4]; // float chi2ITS[4]; - float chi2TOF[4]; + float chi2TOF[4] = {-1., -1., -1., -1.}; // float nclTPCfind[4]; float nclTPCcrossedRows[4]; // bool tmpHasTOF[4]; @@ -3633,6 +3945,7 @@ struct TauTau13topo { float pi3scalar[4]; // bool trkHasTof[4] = {false, false, false, false}; + bool trkHasTpc[4] = {false, false, false, false}; // float mass3pi1e[4]; // double trkTimeTot = 0.; @@ -3649,22 +3962,33 @@ struct TauTau13topo { nSigmaEl[counterTmp] = tmptrack.tpcNSigmaEl(); nSigmaPi[counterTmp] = tmptrack.tpcNSigmaPi(); nSigma3Pi[3] += (nSigmaPi[counterTmp] * nSigmaPi[counterTmp]); - // nSigmaPr[counterTmp] = tmptrack.tpcNSigmaPr(); - // nSigmaPr[counterTmp] = (tmptrack.pt() < 1.5 ? tmptrack.tofNSigmaPr() : tmptrack.tpcNSigmaPr() ); - nSigmaPr[counterTmp] = std::sqrt(tmptrack.tofNSigmaPr() * tmptrack.tofNSigmaPr() + tmptrack.tpcNSigmaPr() * tmptrack.tpcNSigmaPr()); - // nSigmaKa[counterTmp] = tmptrack.tpcNSigmaKa(); - // nSigmaKa[counterTmp] = (tmptrack.pt() < 1.3 ? tmptrack.tofNSigmaKa() : tmptrack.tpcNSigmaKa() ); - nSigmaKa[counterTmp] = std::sqrt(tmptrack.tofNSigmaKa() * tmptrack.tofNSigmaKa() + tmptrack.tpcNSigmaKa() * tmptrack.tpcNSigmaKa()); + if (tmptrack.hasTPC()) + nSigma3PiNew[3] += (nSigmaPi[counterTmp] * nSigmaPi[counterTmp]); + if (whichPIDCut == 1) { // TPC only + nSigmaPr[counterTmp] = tmptrack.tpcNSigmaPr(); + nSigmaKa[counterTmp] = tmptrack.tpcNSigmaKa(); + } else if (whichPIDCut == 2) { // TPC + TOF sigma + nSigmaPr[counterTmp] = std::sqrt(tmptrack.tofNSigmaPr() * tmptrack.tofNSigmaPr() + tmptrack.tpcNSigmaPr() * tmptrack.tpcNSigmaPr()); + nSigmaKa[counterTmp] = std::sqrt(tmptrack.tofNSigmaKa() * tmptrack.tofNSigmaKa() + tmptrack.tpcNSigmaKa() * tmptrack.tpcNSigmaKa()); + } else if (whichPIDCut == 3) { // TPC + TOF hardcoded pt + nSigmaPr[counterTmp] = (tmptrack.pt() < 1.5 ? tmptrack.tofNSigmaPr() : tmptrack.tpcNSigmaPr()); + nSigmaKa[counterTmp] = (tmptrack.pt() < 1.3 ? tmptrack.tofNSigmaKa() : tmptrack.tpcNSigmaKa()); + } else { + nSigmaPr[counterTmp] = tmptrack.tpcNSigmaPr(); + nSigmaKa[counterTmp] = tmptrack.tpcNSigmaKa(); + } // dcaZ[counterTmp] = tmptrack.dcaZ(); // dcaXY[counterTmp] = tmptrack.dcaXY(); // chi2TPC[counterTmp] = tmptrack.tpcChi2NCl(); // chi2ITS[counterTmp] = tmptrack.itsChi2NCl(); - chi2TOF[counterTmp] = tmptrack.tofChi2(); + if (tmptrack.hasTOF()) + chi2TOF[counterTmp] = tmptrack.tofChi2(); // nclTPCfind[counterTmp] = tmptrack.tpcNClsFindable(); nclTPCcrossedRows[counterTmp] = tmptrack.tpcNClsCrossedRows(); // tmpHasTOF[counterTmp] = tmptrack.hasTOF(); + trkHasTpc[counterTmp] = tmptrack.hasTPC(); // trkTime[counterTmp] = tmptrack.trackTime(); // trkTimeRes[counterTmp] = tmptrack.trackTimeRes(); @@ -3686,13 +4010,27 @@ struct TauTau13topo { // fill the histograms with true information for (int i = 0; i < 4; i++) { + // nsigma3Pi calculation nSigma3Pi[i] = nSigma3Pi[3] - (nSigmaPi[i] * nSigmaPi[i]); nSigma3Pi[i] = std::sqrt(nSigma3Pi[i]); + // nsigma3PiNew calculation + if (trkHasTpc[i]) { + nSigma3PiNew[i] = nSigma3PiNew[3] - (nSigmaPi[i] * nSigmaPi[i]); + } + nSigma3PiNew[i] = std::sqrt(nSigma3PiNew[i]); + if (i == matchedElIndexToData) { fillControlHistosMCtrue<0>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); registryMC.get(HIST("controlMCtrue/cut0/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); registryMC.get(HIST("pidTPCMCEltrue/hpvsdedxElHipCut0"))->Fill(tmpMomentum[i], tmpDedx[i]); registryMC.get(HIST("controlMCtrue/cut0/hsigma3Pi"))->Fill(nSigma3Pi[i]); + if (nPiHasTPC[i] == 3) + registry1MC.get(HIST("controlMCtrue/cut0/hsigma3PiNew"))->Fill(nSigma3PiNew[i]); + if (nPiHasTPC[i] == 2) + registry1MC.get(HIST("controlMCtrue/cut0/hsigma2PiNew"))->Fill(nSigma3PiNew[i]); + if (nPiHasTPC[i] == 1) + registry1MC.get(HIST("controlMCtrue/cut0/hsigma1PiNew"))->Fill(nSigma3PiNew[i]); + registry1MC.get(HIST("pidTOFMCEltrue/hpvsNsigmaElHipCut0"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); // registryMC.get(HIST("control/cut0/h3pi1eMass"))->Fill(mass3pi1e[i]); } else { // only for 1prong = electron true @@ -4232,6 +4570,7 @@ struct TauTau13topo { registryMC.get(HIST("controlMCtrue/cut30/h4trkMassVsPt"))->Fill(mass4pi, pttot); registryMC.get(HIST("controlMCtrue/cut30/hZNACenergy"))->Fill(energyZNA, energyZNC); // registryMC.get(HIST("controlMCtrue/cut30/hNtofTrk"))->Fill(nTofTrk); + registry1MC.get(HIST("globalMCrec/hRecFlag"))->Fill(5 + 2 + collision.flags()); // reconstruction with upc settings flag } for (int i = 0; i < 4; i++) { if (tracksMatchedToMC && flagEl[i] && trkHasTof[i] && flagPi[i] && flagPr[i] && flagKa[i] && flagCR[i] && !flagVcalPV[i] && flagS3pi[i] && flagIM[i] && (i == matchedElIndexToData)) { @@ -4275,6 +4614,7 @@ struct TauTau13topo { registryMC.get(HIST("controlMCtrue/cut27/h4trkMassVsPt"))->Fill(mass4pi, pttot); registryMC.get(HIST("controlMCtrue/cut27/hZNACenergy"))->Fill(energyZNA, energyZNC); // registryMC.get(HIST("controlMCtrue/cut27/hNtofTrk"))->Fill(nTofTrk); + registry1MC.get(HIST("globalMCrec/hRecFlag"))->Fill(5 + 2 + 2 + collision.flags()); // reconstruction with upc settings flag } for (int i = 0; i < 4; i++) { if (tracksMatchedToMC && flagEl[i] && trkHasTof[i] && flagPi[i] && flagPr[i] && flagKa[i] && flagCR[i] && !flagVcalPV[i] && flagS3pi[i] && flagIM[i] && flagDP[i] && (i == matchedElIndexToData)) { @@ -4291,7 +4631,7 @@ struct TauTau13topo { } // end of loop over 4 PV tracks } else { if (verbose) { - LOGF(debug, " Candidate rejected: all electrons vetoed by piPID+Vcal+pT+prPID+KaPID+IM"); + LOGF(debug, " Candidate rejected: all electrons vetoed by Dphi"); } return; } // end of dphi 3pi-e cut, cut27 @@ -4330,11 +4670,50 @@ struct TauTau13topo { } // end of loop over 4 PV tracks } else { if (verbose) { - LOGF(debug, " Candidate rejected: zdc cut "); + LOGF(debug, " Candidate rejected: zdc cut "); } return; } // end of zdc, cut35 + // + // occupancy cut 23 + // + if (collision.occupancyInTime() < 1000) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(65., 1.); // electron identified + if (tracksMatchedToMC) + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(66., 1.); // electron identified, tracks match to MC Particles + if (tracksMatchedToMC && flagEl[matchedElIndexToData] && flagPi[matchedElIndexToData] && + flagPr[matchedElIndexToData] && flagKa[matchedElIndexToData] && flagCR[matchedElIndexToData] && + !flagVcalPV[matchedElIndexToData] && flagS3pi[matchedElIndexToData] && + flagIM[matchedElIndexToData] && flagDP[matchedElIndexToData] && trkHasTof[matchedElIndexToData]) { + registryMC.get(HIST("efficiencyMCEl/effiEl"))->Fill(67., 1.); // zdc cut, tracks match to MC Particles, El is MC El true + + registryMC.get(HIST("controlMCtrue/cut23/h4piMass"))->Fill(mass4pi); + registryMC.get(HIST("controlMCtrue/cut23/h4trkPtTot"))->Fill(pttot); + registryMC.get(HIST("controlMCtrue/cut23/h4trkMassVsPt"))->Fill(mass4pi, pttot); + registryMC.get(HIST("controlMCtrue/cut23/hZNACenergy"))->Fill(energyZNA, energyZNC); + // registryMC.get(HIST("controlMCtrue/cut23/hNtofTrk"))->Fill(nTofTrk); + } + for (int i = 0; i < 4; i++) { + if (tracksMatchedToMC && flagEl[i] && flagPi[i] && flagPr[i] && flagKa[i] && flagCR[i] && !flagVcalPV[i] && flagS3pi[i] && flagIM[i] && flagDP[i] && trkHasTof[i] && (i == matchedElIndexToData)) { + registryMC.get(HIST("pidTPCMCEltrue/hpvsdedxElHipCut23"))->Fill(tmpMomentum[i], tmpDedx[i]); + fillControlHistosMCtrue<23>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("controlMCtrue/cut23/h3piMassVsPt"))->Fill(pi3invMass[i], pi3pt[i]); + registryMC.get(HIST("controlMCtrue/cut23/hsigma3Pi"))->Fill(nSigma3Pi[i]); + registry1MC.get(HIST("pidTOFMCEltrue/hpvsNsigmaElHipCut23"))->Fill(tmpMomentum[i], tmpTofNsigmaEl[i]); + } else if (tracksMatchedToMC && (i != matchedElIndexToData)) { + fillControlHistosMCcomb<23>(pi3invMass[i], pi3pt[i], pi3deltaPhi[i], pi3assymav[i], pi3vector[i], pi3scalar[i], nclTPCcrossedRows[i], tmpPt[i], chi2TOF[i]); + registryMC.get(HIST("pidTPCMCPitrue/hpvsdedxElHipCut23"))->Fill(tmpMomentum[i], tmpDedx[i]); + registryMC.get(HIST("controlMCcomb/cut23/hsigma3Pi"))->Fill(nSigma3Pi[i]); + } + } // end of loop over 4 PV tracks + } else { + if (verbose) { + LOGF(debug, " Candidate rejected: occupancy cut "); + } + return; + } // end of occupancy cut23 + } // end of loop over collisions } // end of electron + 3pi @@ -4349,4 +4728,5 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ adaptAnalysisTask(cfgc, TaskName{"TauTau13topo"})}; + // adaptAnalysisTask(cfgc)}; } From 4f01aac27fab8b7f12609d87c2f9ab0e487590ac Mon Sep 17 00:00:00 2001 From: Mingrui Zhao Date: Tue, 18 Mar 2025 03:43:35 +0800 Subject: [PATCH 0729/1650] [PWGUD] Initial task for flow in UPC (#10507) --- PWGUD/Tasks/CMakeLists.txt | 7 + PWGUD/Tasks/flowCumulantsUpc.cxx | 869 +++++++++++++++++++++++++++++++ 2 files changed, 876 insertions(+) create mode 100644 PWGUD/Tasks/flowCumulantsUpc.cxx diff --git a/PWGUD/Tasks/CMakeLists.txt b/PWGUD/Tasks/CMakeLists.txt index c875ce1aa25..919787c8256 100644 --- a/PWGUD/Tasks/CMakeLists.txt +++ b/PWGUD/Tasks/CMakeLists.txt @@ -238,3 +238,10 @@ o2physics_add_dpl_workflow(decaytree-analyzer SOURCES decayTreeAnalyzer.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::UDGoodRunSelector O2Physics::decayTree COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(flow-cumulants-upc + SOURCES flowCumulantsUpc.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::AnalysisCCDB O2Physics::GFWCore + COMPONENT_NAME Analysis) + + diff --git a/PWGUD/Tasks/flowCumulantsUpc.cxx b/PWGUD/Tasks/flowCumulantsUpc.cxx new file mode 100644 index 00000000000..c80c5ad9397 --- /dev/null +++ b/PWGUD/Tasks/flowCumulantsUpc.cxx @@ -0,0 +1,869 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file flowCumulantsUpc.cxx +/// \author Mingrui Zhao (mingrui.zhao@mail.labz0.org, mingrui.zhao@cern.ch) +/// \since Mar/2025 +/// \brief jira: , task to measure flow observables with cumulant method + +#include +#include +#include +#include +#include +#include +#include +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/RunningWorkflowInfo.h" +#include "Framework/HistogramRegistry.h" + +#include "Common/DataModel/EventSelection.h" +#include "Common/Core/TrackSelection.h" +#include "Common/Core/TrackSelectionDefaults.h" +#include "Common/Core/RecoDecay.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/CCDB/ctpRateFetcher.h" + +#include "PWGUD/DataModel/UDTables.h" +#include "PWGUD/Core/SGSelector.h" +#include "TVector3.h" + +#include "GFWPowerArray.h" +#include "GFW.h" +#include "GFWCumulant.h" +#include "GFWWeights.h" +#include "FlowContainer.h" +#include "TList.h" +#include +#include +#include +#include + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +#define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable NAME{#NAME, DEFAULT, HELP}; + +struct FlowCumulantsUpc { + + O2_DEFINE_CONFIGURABLE(cfgCutVertex, float, 10.0f, "Accepted z-vertex range") + O2_DEFINE_CONFIGURABLE(cfgCentEstimator, int, 0, "0:FT0C; 1:FT0CVariant1; 2:FT0M; 3:FT0A") + O2_DEFINE_CONFIGURABLE(cfgCentFT0CMin, float, 0.0f, "Minimum centrality (FT0C) to cut events in filter") + O2_DEFINE_CONFIGURABLE(cfgCentFT0CMax, float, 100.0f, "Maximum centrality (FT0C) to cut events in filter") + O2_DEFINE_CONFIGURABLE(cfgCutPtPOIMin, float, 0.2f, "Minimal pT for poi tracks") + O2_DEFINE_CONFIGURABLE(cfgCutPtPOIMax, float, 10.0f, "Maximal pT for poi tracks") + O2_DEFINE_CONFIGURABLE(cfgCutPtRefMin, float, 0.2f, "Minimal pT for ref tracks") + O2_DEFINE_CONFIGURABLE(cfgCutPtRefMax, float, 3.0f, "Maximal pT for ref tracks") + O2_DEFINE_CONFIGURABLE(cfgCutPtMin, float, 0.2f, "Minimal pT for all tracks") + O2_DEFINE_CONFIGURABLE(cfgCutPtMax, float, 10.0f, "Maximal pT for all tracks") + O2_DEFINE_CONFIGURABLE(cfgCutEta, float, 0.8f, "Eta range for tracks") + O2_DEFINE_CONFIGURABLE(cfgCutChi2prTPCcls, float, 2.5f, "max chi2 per TPC clusters") + O2_DEFINE_CONFIGURABLE(cfgCutTPCclu, float, 70.0f, "minimum TPC clusters") + O2_DEFINE_CONFIGURABLE(cfgCutITSclu, float, 5.0f, "minimum ITS clusters") + O2_DEFINE_CONFIGURABLE(cfgCutDCAz, float, 2.0f, "max DCA to vertex z") + O2_DEFINE_CONFIGURABLE(cfgCutDCAxyppPass3Enabled, bool, false, "switch of ppPass3 DCAxy pt dependent cut") + O2_DEFINE_CONFIGURABLE(cfgCutDCAzPtDepEnabled, bool, false, "switch of DCAz pt dependent cut") + O2_DEFINE_CONFIGURABLE(cfgTrkSelSwitch, bool, false, "switch for self-defined track selection") + O2_DEFINE_CONFIGURABLE(cfgUseAdditionalEventCut, bool, false, "Use additional event cut on mult correlations") + O2_DEFINE_CONFIGURABLE(cfgUseTentativeEventCounter, bool, false, "After sel8(), count events regardless of real event selection") + O2_DEFINE_CONFIGURABLE(cfgEvSelkNoSameBunchPileup, bool, false, "rejects collisions which are associated with the same found-by-T0 bunch crossing") + O2_DEFINE_CONFIGURABLE(cfgEvSelkIsGoodZvtxFT0vsPV, bool, false, "removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference, use this cut at low multiplicities with caution") + O2_DEFINE_CONFIGURABLE(cfgEvSelkNoCollInTimeRangeStandard, bool, false, "no collisions in specified time range") + O2_DEFINE_CONFIGURABLE(cfgEvSelkIsGoodITSLayersAll, bool, true, "cut time intervals with dead ITS staves") + O2_DEFINE_CONFIGURABLE(cfgEvSelkNoCollInRofStandard, bool, false, "no other collisions in this Readout Frame with per-collision multiplicity above threshold") + O2_DEFINE_CONFIGURABLE(cfgEvSelkNoHighMultCollInPrevRof, bool, false, "veto an event if FT0C amplitude in previous ITS ROF is above threshold") + O2_DEFINE_CONFIGURABLE(cfgEvSelMultCorrelation, bool, true, "Multiplicity correlation cut") + O2_DEFINE_CONFIGURABLE(cfgEvSelV0AT0ACut, bool, true, "V0A T0A 5 sigma cut") + O2_DEFINE_CONFIGURABLE(cfgGetInteractionRate, bool, false, "Get interaction rate from CCDB") + O2_DEFINE_CONFIGURABLE(cfgUseInteractionRateCut, bool, false, "Use events with low interaction rate") + O2_DEFINE_CONFIGURABLE(cfgCutMaxIR, float, 50.0f, "maximum interaction rate (kHz)") + O2_DEFINE_CONFIGURABLE(cfgCutMinIR, float, 0.0f, "minimum interaction rate (kHz)") + O2_DEFINE_CONFIGURABLE(cfgUseNch, bool, false, "Use Nch for flow observables") + O2_DEFINE_CONFIGURABLE(cfgNbootstrap, int, 30, "Number of subsamples") + O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeights, bool, false, "Fill and output NUA weights") + O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeightsRefPt, bool, false, "NUA weights are filled in ref pt bins") + O2_DEFINE_CONFIGURABLE(cfgEfficiency, std::string, "", "CCDB path to efficiency object") + O2_DEFINE_CONFIGURABLE(cfgAcceptance, std::string, "", "CCDB path to acceptance object") + O2_DEFINE_CONFIGURABLE(cfgAcceptanceList, std::string, "", "CCDB path to acceptance lsit object") + O2_DEFINE_CONFIGURABLE(cfgAcceptanceListEnabled, bool, false, "switch of acceptance list") + O2_DEFINE_CONFIGURABLE(cfgEvSelOccupancy, bool, true, "Occupancy cut") + O2_DEFINE_CONFIGURABLE(cfgCutOccupancyHigh, int, 500, "High cut on TPC occupancy") + O2_DEFINE_CONFIGURABLE(cfgCutOccupancyLow, int, 0, "Low cut on TPC occupancy") + O2_DEFINE_CONFIGURABLE(cfgUseSmallMemory, bool, false, "Use small memory mode") + Configurable> cfgUserDefineGFWCorr{"cfgUserDefineGFWCorr", std::vector{"refN02 {2} refP02 {-2}", "refN12 {2} refP12 {-2}"}, "User defined GFW CorrelatorConfig"}; + Configurable> cfgUserDefineGFWName{"cfgUserDefineGFWName", std::vector{"Ch02Gap22", "Ch12Gap22"}, "User defined GFW Name"}; + Configurable> cfgRunRemoveList{"cfgRunRemoveList", std::vector{-1}, "excluded run numbers"}; + + ConfigurableAxis axisPtHist{"axisPtHist", {100, 0., 10.}, "pt axis for histograms"}; + ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.2, 2.4, 2.6, 2.8, 3, 3.5, 4, 5, 6, 8, 10}, "pt axis for histograms"}; + ConfigurableAxis axisIndependent{"axisIndependent", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90}, "X axis for histograms"}; + ConfigurableAxis axisNch{"axisNch", {4000, 0, 4000}, "N_{ch}"}; + ConfigurableAxis axisDCAz{"axisDCAz", {200, -2, 2}, "DCA_{z} (cm)"}; + ConfigurableAxis axisDCAxy{"axisDCAxy", {200, -1, 1}, "DCA_{xy} (cm)"}; + + // Added UPC Cuts + SGSelector sgSelector; + Configurable cfgCutFV0{"cfgCutFV0", 50., "FV0A threshold"}; + Configurable cfgCutFT0A{"cfgCutFT0A", 150., "FT0A threshold"}; + Configurable cfgCutFT0C{"cfgCutFT0C", 50., "FT0C threshold"}; + Configurable cfgCutZDC{"cfgCutZDC", 10., "ZDC threshold"}; + Configurable cfgGapSideSelection{"cfgGapSideSelection", 2, "gap selection"}; + + // Filter collisionFilter = (nabs(aod::collision::posZ) < cfgCutVertex) && (aod::cent::centFT0C > cfgCentFT0CMin) && (aod::cent::centFT0C < cfgCentFT0CMax); + // Filter trackFilter = ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls) && (nabs(aod::track::dcaZ) < cfgCutDCAz); + + // Corrections + TH1D* mEfficiency = nullptr; + GFWWeights* mAcceptance = nullptr; + TObjArray* mAcceptanceList = nullptr; + bool correctionsLoaded = false; + + // Connect to ccdb + Service ccdb; + Configurable ccdbNoLaterThan{"ccdbNoLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + + // Define output + OutputObj fFC{FlowContainer("FlowContainer")}; + OutputObj fWeights{GFWWeights("weights")}; + HistogramRegistry registry{"registry"}; + + // define global variables + GFW* fGFW = new GFW(); + std::vector corrconfigs; + TAxis* fPtAxis; + TRandom3* fRndm = new TRandom3(0); + enum CentEstimators { + kCentFT0C = 0, + kCentFT0CVariant1, + kCentFT0M, + kCentFV0A, + // Count the total number of enum + kCount_CentEstimators + }; + int mRunNumber{-1}; + uint64_t mSOR{0}; + double mMinSeconds{-1.}; + std::unordered_map gHadronicRate; + ctpRateFetcher mRateFetcher; + TH2* gCurrentHadronicRate; + + // using AodCollisions = soa::Filtered>; + // using AodTracks = soa::Filtered>; + // + using UdTracks = soa::Join; + using UdTracksFull = soa::Join; + using UDCollisionsFull = soa::Join; + + // Track selection + TrackSelection myTrackSel; + TF1* fPhiCutLow = nullptr; + TF1* fPhiCutHigh = nullptr; + // Additional Event selection cuts - Copy from flowGenericFramework.cxx + TF1* fMultPVCutLow = nullptr; + TF1* fMultPVCutHigh = nullptr; + TF1* fMultCutLow = nullptr; + TF1* fMultCutHigh = nullptr; + TF1* fMultMultPVCut = nullptr; + TF1* fT0AV0AMean = nullptr; + TF1* fT0AV0ASigma = nullptr; + + void init(InitContext const&) + { + const AxisSpec axisVertex{40, -20, 20, "Vtxz (cm)"}; + const AxisSpec axisPhi{60, 0.0, constants::math::TwoPI, "#varphi"}; + const AxisSpec axisEta{40, -1., 1., "#eta"}; + const AxisSpec axisCentForQA{100, 0, 100, "centrality (%)"}; + const AxisSpec axisT0C{70, 0, 70000, "N_{ch} (T0C)"}; + const AxisSpec axisT0A{200, 0, 200000, "N_{ch} (T0A)"}; + + ccdb->setURL(ccdbUrl.value); + ccdb->setCaching(true); + ccdb->setCreatedNotAfter(ccdbNoLaterThan.value); + + // Add some output objects to the histogram registry + // Event QA + registry.add("hEventCount", "Number of Event;; Count", {HistType::kTH1D, {{5, 0, 5}}}); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(1, "Filtered event"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(2, "after sel8"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(3, "after supicious Runs removal"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(4, "after additional event cut"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(5, "after correction loads"); + registry.add("hEventCountSpecific", "Number of Event;; Count", {HistType::kTH1D, {{10, 0, 10}}}); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(1, "after sel8"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(2, "kNoSameBunchPileup"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(3, "kIsGoodZvtxFT0vsPV"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(4, "kNoCollInTimeRangeStandard"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(5, "kIsGoodITSLayersAll"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(6, "kNoCollInRofStandard"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(7, "kNoHighMultCollInPrevRof"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(8, "occupancy"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(9, "MultCorrelation"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(10, "cfgEvSelV0AT0ACut"); + if (cfgUseTentativeEventCounter) { + registry.add("hEventCountTentative", "Number of Event;; Count", {HistType::kTH1D, {{10, 0, 10}}}); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(1, "after sel8"); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(2, "kNoSameBunchPileup"); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(3, "kIsGoodZvtxFT0vsPV"); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(4, "kNoCollInTimeRangeStandard"); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(5, "kIsGoodITSLayersAll"); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(6, "kNoCollInRofStandard"); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(7, "kNoHighMultCollInPrevRof"); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(8, "occupancy"); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(9, "MultCorrelation"); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(10, "cfgEvSelV0AT0ACut"); + } + registry.add("hVtxZ", "Vexter Z distribution", {HistType::kTH1D, {axisVertex}}); + registry.add("hMult", "Multiplicity distribution", {HistType::kTH1D, {{3000, 0.5, 3000.5}}}); + std::string hCentTitle = "Centrality distribution, Estimator " + std::to_string(cfgCentEstimator); + registry.add("hCent", hCentTitle.c_str(), {HistType::kTH1D, {{90, 0, 90}}}); + if (!cfgUseSmallMemory) { + registry.add("BeforeSel8_globalTracks_centT0C", "before sel8;Centrality T0C;mulplicity global tracks", {HistType::kTH2D, {axisCentForQA, axisNch}}); + registry.add("BeforeCut_globalTracks_centT0C", "before cut;Centrality T0C;mulplicity global tracks", {HistType::kTH2D, {axisCentForQA, axisNch}}); + registry.add("BeforeCut_PVTracks_centT0C", "before cut;Centrality T0C;mulplicity PV tracks", {HistType::kTH2D, {axisCentForQA, axisNch}}); + registry.add("BeforeCut_globalTracks_PVTracks", "before cut;mulplicity PV tracks;mulplicity global tracks", {HistType::kTH2D, {axisNch, axisNch}}); + registry.add("BeforeCut_globalTracks_multT0A", "before cut;mulplicity T0A;mulplicity global tracks", {HistType::kTH2D, {axisT0A, axisNch}}); + registry.add("BeforeCut_globalTracks_multV0A", "before cut;mulplicity V0A;mulplicity global tracks", {HistType::kTH2D, {axisT0A, axisNch}}); + registry.add("BeforeCut_multV0A_multT0A", "before cut;mulplicity T0A;mulplicity V0A", {HistType::kTH2D, {axisT0A, axisT0A}}); + registry.add("BeforeCut_multT0C_centT0C", "before cut;Centrality T0C;mulplicity T0C", {HistType::kTH2D, {axisCentForQA, axisT0C}}); + registry.add("globalTracks_centT0C", "after cut;Centrality T0C;mulplicity global tracks", {HistType::kTH2D, {axisCentForQA, axisNch}}); + registry.add("PVTracks_centT0C", "after cut;Centrality T0C;mulplicity PV tracks", {HistType::kTH2D, {axisCentForQA, axisNch}}); + registry.add("globalTracks_PVTracks", "after cut;mulplicity PV tracks;mulplicity global tracks", {HistType::kTH2D, {axisNch, axisNch}}); + registry.add("globalTracks_multT0A", "after cut;mulplicity T0A;mulplicity global tracks", {HistType::kTH2D, {axisT0A, axisNch}}); + registry.add("globalTracks_multV0A", "after cut;mulplicity V0A;mulplicity global tracks", {HistType::kTH2D, {axisT0A, axisNch}}); + registry.add("multV0A_multT0A", "after cut;mulplicity T0A;mulplicity V0A", {HistType::kTH2D, {axisT0A, axisT0A}}); + registry.add("multT0C_centT0C", "after cut;Centrality T0C;mulplicity T0C", {HistType::kTH2D, {axisCentForQA, axisT0C}}); + registry.add("centFT0CVar_centFT0C", "after cut;Centrality T0C;Centrality T0C Var", {HistType::kTH2D, {axisCentForQA, axisCentForQA}}); + registry.add("centFT0M_centFT0C", "after cut;Centrality T0C;Centrality T0M", {HistType::kTH2D, {axisCentForQA, axisCentForQA}}); + registry.add("centFV0A_centFT0C", "after cut;Centrality T0C;Centrality V0A", {HistType::kTH2D, {axisCentForQA, axisCentForQA}}); + } + // Track QA + registry.add("hPhi", "#phi distribution", {HistType::kTH1D, {axisPhi}}); + registry.add("hPhiWeighted", "corrected #phi distribution", {HistType::kTH1D, {axisPhi}}); + registry.add("hEta", "#eta distribution", {HistType::kTH1D, {axisEta}}); + registry.add("hPt", "p_{T} distribution before cut", {HistType::kTH1D, {axisPtHist}}); + registry.add("hPtRef", "p_{T} distribution after cut", {HistType::kTH1D, {axisPtHist}}); + registry.add("hChi2prTPCcls", "#chi^{2}/cluster for the TPC track segment", {HistType::kTH1D, {{100, 0., 5.}}}); + registry.add("hChi2prITScls", "#chi^{2}/cluster for the ITS track", {HistType::kTH1D, {{100, 0., 50.}}}); + registry.add("hnTPCClu", "Number of found TPC clusters", {HistType::kTH1D, {{100, 40, 180}}}); + registry.add("hnITSClu", "Number of found ITS clusters", {HistType::kTH1D, {{100, 0, 20}}}); + registry.add("hnTPCCrossedRow", "Number of crossed TPC Rows", {HistType::kTH1D, {{100, 40, 180}}}); + registry.add("hDCAz", "DCAz after cuts; DCAz (cm); Pt", {HistType::kTH2D, {{200, -0.5, 0.5}, {200, 0, 5}}}); + registry.add("hDCAxy", "DCAxy after cuts; DCAxy (cm); Pt", {HistType::kTH2D, {{200, -0.5, 0.5}, {200, 0, 5}}}); + registry.add("hTrackCorrection2d", "Correlation table for number of tracks table; uncorrected track; corrected track", {HistType::kTH2D, {axisNch, axisNch}}); + + o2::framework::AxisSpec axis = axisPt; + int nPtBins = axis.binEdges.size() - 1; + double* ptBins = &(axis.binEdges)[0]; + fPtAxis = new TAxis(nPtBins, ptBins); + + if (cfgOutputNUAWeights) { + fWeights->setPtBins(nPtBins, ptBins); + fWeights->init(true, false); + } + + // add in FlowContainer to Get boostrap sample automatically + TObjArray* oba = new TObjArray(); + oba->Add(new TNamed("ChGap22", "ChGap22")); + oba->Add(new TNamed("ChFull22", "ChFull22")); + oba->Add(new TNamed("ChFull32", "ChFull32")); + oba->Add(new TNamed("ChFull42", "ChFull42")); + oba->Add(new TNamed("ChFull24", "ChFull24")); + oba->Add(new TNamed("ChFull26", "ChFull26")); + for (auto i = 0; i < fPtAxis->GetNbins(); i++) + oba->Add(new TNamed(Form("ChFull22_pt_%i", i + 1), "ChFull22_pTDiff")); + for (auto i = 0; i < fPtAxis->GetNbins(); i++) + oba->Add(new TNamed(Form("ChFull24_pt_%i", i + 1), "ChFull24_pTDiff")); + for (auto i = 0; i < fPtAxis->GetNbins(); i++) + oba->Add(new TNamed(Form("ChFull26_pt_%i", i + 1), "ChFull26_pTDiff")); + oba->Add(new TNamed("Ch04Gap22", "Ch04Gap22")); + oba->Add(new TNamed("Ch06Gap22", "Ch06Gap22")); + oba->Add(new TNamed("Ch08Gap22", "Ch08Gap22")); + oba->Add(new TNamed("Ch10Gap22", "Ch10Gap22")); + for (auto i = 0; i < fPtAxis->GetNbins(); i++) + oba->Add(new TNamed(Form("Ch10Gap22_pt_%i", i + 1), "Ch10Gap22_pTDiff")); + oba->Add(new TNamed("Ch12Gap22", "Ch12Gap22")); + oba->Add(new TNamed("Ch04Gap32", "Ch04Gap32")); + oba->Add(new TNamed("Ch06Gap32", "Ch06Gap32")); + oba->Add(new TNamed("Ch08Gap32", "Ch08Gap32")); + oba->Add(new TNamed("Ch10Gap32", "Ch10Gap32")); + for (auto i = 0; i < fPtAxis->GetNbins(); i++) + oba->Add(new TNamed(Form("Ch10Gap32_pt_%i", i + 1), "Ch10Gap32_pTDiff")); + oba->Add(new TNamed("Ch12Gap32", "Ch12Gap32")); + oba->Add(new TNamed("Ch04Gap42", "Ch04Gap42")); + oba->Add(new TNamed("Ch06Gap42", "Ch06Gap42")); + oba->Add(new TNamed("Ch08Gap42", "Ch08Gap42")); + oba->Add(new TNamed("Ch10Gap42", "Ch10Gap42")); + for (auto i = 0; i < fPtAxis->GetNbins(); i++) + oba->Add(new TNamed(Form("Ch10Gap42_pt_%i", i + 1), "Ch10Gap42_pTDiff")); + oba->Add(new TNamed("Ch12Gap42", "Ch12Gap42")); + oba->Add(new TNamed("ChFull422", "ChFull422")); + oba->Add(new TNamed("Ch04GapA422", "Ch04GapA422")); + oba->Add(new TNamed("Ch04GapB422", "Ch04GapB422")); + oba->Add(new TNamed("Ch10GapA422", "Ch10GapA422")); + oba->Add(new TNamed("Ch10GapB422", "Ch10GapB422")); + oba->Add(new TNamed("ChFull3232", "ChFull3232")); + oba->Add(new TNamed("ChFull4242", "ChFull4242")); + oba->Add(new TNamed("Ch04Gap3232", "Ch04Gap3232")); + oba->Add(new TNamed("Ch04Gap4242", "Ch04Gap4242")); + oba->Add(new TNamed("Ch04Gap24", "Ch04Gap24")); + oba->Add(new TNamed("Ch10Gap3232", "Ch10Gap3232")); + oba->Add(new TNamed("Ch10Gap4242", "Ch10Gap4242")); + oba->Add(new TNamed("Ch10Gap24", "Ch10Gap24")); + for (auto i = 0; i < fPtAxis->GetNbins(); i++) + oba->Add(new TNamed(Form("Ch10Gap24_pt_%i", i + 1), "Ch10Gap24_pTDiff")); + std::vector userDefineGFWCorr = cfgUserDefineGFWCorr; + std::vector userDefineGFWName = cfgUserDefineGFWName; + if (!userDefineGFWCorr.empty() && !userDefineGFWName.empty()) { + for (uint i = 0; i < userDefineGFWName.size(); i++) { + oba->Add(new TNamed(userDefineGFWName.at(i).c_str(), userDefineGFWName.at(i).c_str())); + } + } + fFC->SetName("FlowContainer"); + fFC->SetXAxis(fPtAxis); + fFC->Initialize(oba, axisIndependent, cfgNbootstrap); + delete oba; + + // eta region + fGFW->AddRegion("full", -0.8, 0.8, 1, 1); + fGFW->AddRegion("refN00", -0.8, 0., 1, 1); // gap0 negative region + fGFW->AddRegion("refP00", 0., 0.8, 1, 1); // gap0 positve region + fGFW->AddRegion("refN02", -0.8, -0.1, 1, 1); // gap2 negative region + fGFW->AddRegion("refP02", 0.1, 0.8, 1, 1); // gap2 positve region + fGFW->AddRegion("refN04", -0.8, -0.2, 1, 1); // gap4 negative region + fGFW->AddRegion("refP04", 0.2, 0.8, 1, 1); // gap4 positve region + fGFW->AddRegion("refN06", -0.8, -0.3, 1, 1); // gap6 negative region + fGFW->AddRegion("refP06", 0.3, 0.8, 1, 1); // gap6 positve region + fGFW->AddRegion("refN08", -0.8, -0.4, 1, 1); + fGFW->AddRegion("refP08", 0.4, 0.8, 1, 1); + fGFW->AddRegion("refN10", -0.8, -0.5, 1, 1); + fGFW->AddRegion("refP10", 0.5, 0.8, 1, 1); + fGFW->AddRegion("refN12", -0.8, -0.6, 1, 1); + fGFW->AddRegion("refP12", 0.6, 0.8, 1, 1); + fGFW->AddRegion("refN14", -0.8, -0.7, 1, 1); + fGFW->AddRegion("refP14", 0.7, 0.8, 1, 1); + fGFW->AddRegion("refN", -0.8, -0.4, 1, 1); + fGFW->AddRegion("refP", 0.4, 0.8, 1, 1); + fGFW->AddRegion("refM", -0.4, 0.4, 1, 1); + fGFW->AddRegion("poiN", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 2); + fGFW->AddRegion("poiN10", -0.8, -0.5, 1 + fPtAxis->GetNbins(), 2); + fGFW->AddRegion("poifull", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 2); + fGFW->AddRegion("olN", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 4); + fGFW->AddRegion("olN10", -0.8, -0.5, 1 + fPtAxis->GetNbins(), 4); + fGFW->AddRegion("olfull", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 4); + + corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {2 -2}", "ChFull22", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {3 -3}", "ChFull32", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {4 -4}", "ChFull42", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {2 2 -2 -2}", "ChFull24", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {2 2 2 -2 -2 -2}", "ChFull26", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN04 {2} refP04 {-2}", "Ch04Gap22", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN06 {2} refP06 {-2}", "Ch06Gap22", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Ch08Gap22", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN10 {2} refP10 {-2}", "Ch10Gap22", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN12 {2} refP12 {-2}", "Ch12Gap22", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN04 {3} refP04 {-3}", "Ch04Gap32", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN06 {3} refP06 {-3}", "Ch06Gap32", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {3} refP08 {-3}", "Ch08Gap32", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN10 {3} refP10 {-3}", "Ch10Gap32", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN12 {3} refP12 {-3}", "Ch12Gap32", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN04 {4} refP04 {-4}", "Ch04Gap42", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN06 {4} refP06 {-4}", "Ch06Gap42", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {4} refP08 {-4}", "Ch08Gap42", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN10 {4} refP10 {-4}", "Ch10Gap42", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN12 {4} refP12 {-4}", "Ch12Gap42", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN {2} refP {-2}", "ChGap22", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poifull full | olfull {2 -2}", "ChFull22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poifull full | olfull {2 2 -2 -2}", "ChFull24", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poifull full | olfull {2 2 2 -2 -2 -2}", "ChFull26", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiN10 refN10 | olN10 {2} refP10 {-2}", "Ch10Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiN10 refN10 | olN10 {3} refP10 {-3}", "Ch10Gap32", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiN10 refN10 | olN10 {4} refP10 {-4}", "Ch10Gap42", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {4 -2 -2}", "ChFull422", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN04 {-2 -2} refP04 {4}", "Ch04GapA422", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN04 {4} refP04 {-2 -2}", "Ch04GapB422", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN10 {-2 -2} refP10 {4}", "Ch10GapA422", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN10 {4} refP10 {-2 -2}", "Ch10GapB422", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {3 2 -3 -2}", "ChFull3232", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {4 2 -4 -2}", "ChFull4242", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN04 {3 2} refP04 {-3 -2}", "Ch04Gap3232", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN04 {4 2} refP04 {-4 -2}", "Ch04Gap4242", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN04 {2 2} refP04 {-2 -2}", "Ch04Gap24", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN10 {3 2} refP10 {-3 -2}", "Ch10Gap3232", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN10 {4 2} refP10 {-4 -2}", "Ch10Gap4242", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN10 {2 2} refP10 {-2 -2}", "Ch10Gap24", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiN10 refN10 | olN10 {2 2} refP10 {-2 -2}", "Ch10Gap24", kTRUE)); + if (!userDefineGFWCorr.empty() && !userDefineGFWName.empty()) { + LOGF(info, "User adding GFW CorrelatorConfig:"); + // attentaion: here we follow the index of cfgUserDefineGFWCorr + for (uint i = 0; i < userDefineGFWCorr.size(); i++) { + if (i >= userDefineGFWName.size()) { + LOGF(fatal, "The names you provided are more than configurations. userDefineGFWName.size(): %d > userDefineGFWCorr.size(): %d", userDefineGFWName.size(), userDefineGFWCorr.size()); + break; + } + LOGF(info, "%d: %s %s", i, userDefineGFWCorr.at(i).c_str(), userDefineGFWName.at(i).c_str()); + corrconfigs.push_back(fGFW->GetCorrelatorConfig(userDefineGFWCorr.at(i).c_str(), userDefineGFWName.at(i).c_str(), kFALSE)); + } + } + fGFW->CreateRegions(); + + if (cfgUseAdditionalEventCut) { + fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x - 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); + fMultPVCutLow->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); + fMultPVCutHigh = new TF1("fMultPVCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x + 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); + fMultPVCutHigh->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); + + fMultCutLow = new TF1("fMultCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x - 2.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); + fMultCutLow->SetParameters(1654.46, -47.2379, 0.449833, -0.0014125, 150.773, -3.67334, 0.0530503, -0.000614061, 3.15956e-06); + fMultCutHigh = new TF1("fMultCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x + 3.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); + fMultCutHigh->SetParameters(1654.46, -47.2379, 0.449833, -0.0014125, 150.773, -3.67334, 0.0530503, -0.000614061, 3.15956e-06); + + fT0AV0AMean = new TF1("fT0AV0AMean", "[0]+[1]*x", 0, 200000); + fT0AV0AMean->SetParameters(-1601.0581, 9.417652e-01); + fT0AV0ASigma = new TF1("fT0AV0ASigma", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 200000); + fT0AV0ASigma->SetParameters(463.4144, 6.796509e-02, -9.097136e-07, 7.971088e-12, -2.600581e-17); + } + + myTrackSel = getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibAny, TrackSelection::GlobalTrackRun3DCAxyCut::Default); + myTrackSel.SetMinNClustersTPC(cfgCutTPCclu); + myTrackSel.SetMinNClustersITS(cfgCutITSclu); + if (cfgCutDCAxyppPass3Enabled) + myTrackSel.SetMaxDcaXYPtDep([](float pt) { return 0.004f + 0.013f / pt; }); // Tuned on the LHC22f anchored MC LHC23d1d on primary pions. 7 Sigmas of the resolution + } + + template + void fillProfile(const GFW::CorrConfig& corrconf, const ConstStr& tarName, const double& cent) + { + double dnx, val; + dnx = fGFW->Calculate(corrconf, 0, kTRUE).real(); + if (dnx == 0) { + return; + } + if (!corrconf.pTDif) { + val = fGFW->Calculate(corrconf, 0, kFALSE).real() / dnx; + if (std::fabs(val) < 1) { + registry.fill(tarName, cent, val, dnx); + } + return; + } + return; + } + + void fillFC(const GFW::CorrConfig& corrconf, const double& cent, const double& rndm) + { + double dnx, val; + dnx = fGFW->Calculate(corrconf, 0, kTRUE).real(); + if (!corrconf.pTDif) { + if (dnx == 0) { + return; + } + val = fGFW->Calculate(corrconf, 0, kFALSE).real() / dnx; + if (std::fabs(val) < 1) { + fFC->FillProfile(corrconf.Head.c_str(), cent, val, dnx, rndm); + } + return; + } + for (auto i = 1; i <= fPtAxis->GetNbins(); i++) { + dnx = fGFW->Calculate(corrconf, i - 1, kTRUE).real(); + if (dnx == 0) { + continue; + } + val = fGFW->Calculate(corrconf, i - 1, kFALSE).real() / dnx; + if (std::fabs(val) < 1) { + fFC->FillProfile(Form("%s_pt_%i", corrconf.Head.c_str(), i), cent, val, dnx, rndm); + } + } + return; + } + + void loadCorrections(uint64_t timestamp, int runNumber) + { + if (correctionsLoaded) { + return; + } + if (!cfgAcceptanceListEnabled && cfgAcceptance.value.empty() == false) { + mAcceptance = ccdb->getForTimeStamp(cfgAcceptance, timestamp); + if (mAcceptance) { + LOGF(info, "Loaded acceptance weights from %s (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance); + } else { + LOGF(warning, "Could not load acceptance weights from %s (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance); + } + } + if (cfgAcceptanceListEnabled && cfgAcceptanceList.value.empty() == false) { + mAcceptanceList = ccdb->getForTimeStamp(cfgAcceptanceList, timestamp); + if (mAcceptanceList == nullptr) { + LOGF(fatal, "Could not load acceptance weights list from %s", cfgAcceptanceList.value.c_str()); + } + LOGF(info, "Loaded acceptance weights list from %s (%p)", cfgAcceptanceList.value.c_str(), (void*)mAcceptanceList); + + mAcceptance = static_cast(mAcceptanceList->FindObject(Form("%d", runNumber))); + if (mAcceptance == nullptr) { + LOGF(fatal, "Could not find acceptance weights for run %d in acceptance list", runNumber); + } + LOGF(info, "Loaded acceptance weights (%p) for run %d from list (%p)", (void*)mAcceptance, runNumber, (void*)mAcceptanceList); + } + if (cfgEfficiency.value.empty() == false) { + mEfficiency = ccdb->getForTimeStamp(cfgEfficiency, timestamp); + if (mEfficiency == nullptr) { + LOGF(fatal, "Could not load efficiency histogram for trigger particles from %s", cfgEfficiency.value.c_str()); + } + LOGF(info, "Loaded efficiency histogram from %s (%p)", cfgEfficiency.value.c_str(), (void*)mEfficiency); + } + correctionsLoaded = true; + } + + bool setCurrentParticleWeights(float& weight_nue, float& weight_nua, float phi, float eta, float pt, float vtxz) + { + float eff = 1.; + if (mEfficiency) + eff = mEfficiency->GetBinContent(mEfficiency->FindBin(pt)); + else + eff = 1.0; + if (eff == 0) + return false; + weight_nue = 1. / eff; + + if (mAcceptance) + weight_nua = mAcceptance->getNUA(phi, eta, vtxz); + else + weight_nua = 1; + return true; + } + + template + bool eventSelected(TCollision collision, const int multTrk, const float centrality) + { + registry.fill(HIST("hEventCountSpecific"), 0.5); + if (cfgEvSelkNoSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { + // rejects collisions which are associated with the same "found-by-T0" bunch crossing + // https://indico.cern.ch/event/1396220/#1-event-selection-with-its-rof + return 0; + } + if (cfgEvSelkNoSameBunchPileup) { + registry.fill(HIST("hEventCountSpecific"), 1.5); + } + if (cfgEvSelkIsGoodZvtxFT0vsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { + // removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference + // use this cut at low multiplicities with caution + return 0; + } + if (cfgEvSelkIsGoodZvtxFT0vsPV) { + registry.fill(HIST("hEventCountSpecific"), 2.5); + } + if (cfgEvSelkNoCollInTimeRangeStandard && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + // no collisions in specified time range + return 0; + } + if (cfgEvSelkNoCollInTimeRangeStandard) { + registry.fill(HIST("hEventCountSpecific"), 3.5); + } + if (cfgEvSelkIsGoodITSLayersAll && !collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + // from Jan 9 2025 AOT meeting + // cut time intervals with dead ITS staves + return 0; + } + if (cfgEvSelkIsGoodITSLayersAll) { + registry.fill(HIST("hEventCountSpecific"), 4.5); + } + if (cfgEvSelkNoCollInRofStandard && !collision.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { + // no other collisions in this Readout Frame with per-collision multiplicity above threshold + return 0; + } + if (cfgEvSelkNoCollInRofStandard) { + registry.fill(HIST("hEventCountSpecific"), 5.5); + } + if (cfgEvSelkNoHighMultCollInPrevRof && !collision.selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof)) { + // veto an event if FT0C amplitude in previous ITS ROF is above threshold + return 0; + } + if (cfgEvSelkNoHighMultCollInPrevRof) { + registry.fill(HIST("hEventCountSpecific"), 6.5); + } + auto multNTracksPV = collision.multNTracksPV(); + auto occupancy = collision.trackOccupancyInTimeRange(); + if (cfgEvSelOccupancy && (occupancy < cfgCutOccupancyLow || occupancy > cfgCutOccupancyHigh)) { + return 0; + } + if (cfgEvSelOccupancy) { + registry.fill(HIST("hEventCountSpecific"), 7.5); + } + + if (cfgEvSelMultCorrelation) { + if (multNTracksPV < fMultPVCutLow->Eval(centrality)) + return 0; + if (multNTracksPV > fMultPVCutHigh->Eval(centrality)) + return 0; + if (multTrk < fMultCutLow->Eval(centrality)) + return 0; + if (multTrk > fMultCutHigh->Eval(centrality)) + return 0; + } + if (cfgEvSelMultCorrelation) { + registry.fill(HIST("hEventCountSpecific"), 8.5); + } + + // V0A T0A 5 sigma cut + if (cfgEvSelV0AT0ACut && (std::fabs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > 5 * fT0AV0ASigma->Eval(collision.multFT0A()))) { + return 0; + } + if (cfgEvSelV0AT0ACut) { + registry.fill(HIST("hEventCountSpecific"), 9.5); + } + + return 1; + } + + template + void eventCounterQA(TCollision collision, const int multTrk, const float centrality) + { + registry.fill(HIST("hEventCountTentative"), 0.5); + // Regradless of the event selection, fill the event counter histograms + if (collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { + registry.fill(HIST("hEventCountTentative"), 1.5); + } + if (collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { + registry.fill(HIST("hEventCountTentative"), 2.5); + } + if (collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + registry.fill(HIST("hEventCountTentative"), 3.5); + } + if (collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + registry.fill(HIST("hEventCountTentative"), 4.5); + } + if (collision.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { + registry.fill(HIST("hEventCountTentative"), 5.5); + } + if (collision.selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof)) { + registry.fill(HIST("hEventCountTentative"), 6.5); + } + auto multNTracksPV = collision.multNTracksPV(); + auto occupancy = collision.trackOccupancyInTimeRange(); + if (!(occupancy < cfgCutOccupancyLow || occupancy > cfgCutOccupancyHigh)) { + registry.fill(HIST("hEventCountTentative"), 7.5); + } + if (!((multNTracksPV < fMultPVCutLow->Eval(centrality)) || (multNTracksPV > fMultPVCutHigh->Eval(centrality)) || (multTrk < fMultCutLow->Eval(centrality)) || (multTrk > fMultCutHigh->Eval(centrality)))) { + registry.fill(HIST("hEventCountTentative"), 8.5); + } + if (!(std::fabs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > 5 * fT0AV0ASigma->Eval(collision.multFT0A()))) { + registry.fill(HIST("hEventCountTentative"), 9.5); + } + } + + template + bool trackSelected(TTrack track) + { + // UPC selection + if (!track.isPVContributor()) { + return false; + } + if (!(std::fabs(track.dcaZ()) < 2.)) { + return false; + } + double dcaLimit = 0.0105 + 0.035 / std::pow(track.pt(), 1.1); + if (!(std::fabs(track.dcaXY()) < dcaLimit)) { + return false; + } + return true; + + // if (cfgCutDCAzPtDepEnabled && (std::fabs(track.dcaZ()) > (0.004f + 0.013f / track.pt()))) + // return false; + + // if (cfgTrkSelSwitch) { + // return myTrackSel.IsSelected(track); + // } else { + // return ((track.tpcNClsFound() >= cfgCutTPCclu) && (track.itsNCls() >= cfgCutITSclu)); + // } + } + + void initHadronicRate(aod::BCsWithTimestamps::iterator const& bc) + { + if (mRunNumber == bc.runNumber()) { + return; + } + mRunNumber = bc.runNumber(); + if (gHadronicRate.find(mRunNumber) == gHadronicRate.end()) { + auto runDuration = ccdb->getRunDuration(mRunNumber); + mSOR = runDuration.first; + mMinSeconds = std::floor(mSOR * 1.e-3); /// round tsSOR to the highest integer lower than tsSOR + double maxSec = std::ceil(runDuration.second * 1.e-3); /// round tsEOR to the lowest integer higher than tsEOR + const AxisSpec axisSeconds{static_cast((maxSec - mMinSeconds) / 20.f), 0, maxSec - mMinSeconds, "Seconds since SOR"}; + gHadronicRate[mRunNumber] = registry.add(Form("HadronicRate/%i", mRunNumber), ";Time since SOR (s);Hadronic rate (kHz)", kTH2D, {axisSeconds, {510, 0., 51.}}).get(); + } + gCurrentHadronicRate = gHadronicRate[mRunNumber]; + } + + // void process(AodCollisions::iterator const& collision, aod::BCsWithTimestamps const&, AodTracks const& tracks) + void process(UDCollisionsFull::iterator const& collision, aod::BCsWithTimestamps const&, UdTracksFull const& tracks) + { + + registry.fill(HIST("hEventCount"), 0.5); + int gapSide = collision.gapSide(); + if (gapSide < 0 || gapSide > 2) { + return; + } + + int trueGapSide = sgSelector.trueGap(collision, cfgCutFV0, cfgCutFT0A, cfgCutFT0C, cfgCutZDC); + gapSide = trueGapSide; + if (gapSide == 2) { + return; + } + + // if (!cfgUseSmallMemory && tracks.size() >= 1) { + // registry.fill(HIST("BeforeSel8_globalTracks_centT0C"), collision.centFT0C(), tracks.size()); + // } + // if (!collision.sel8()) + // return; + // if (tracks.size() < 1) + // return; + registry.fill(HIST("hEventCount"), 1.5); + // auto bc = collision.bc_as(); + // int currentRunNumber = bc.runNumber(); + // for (const auto& ExcludedRun : cfgRunRemoveList.value) { + // if (currentRunNumber == ExcludedRun) { + // return; + // } + // } + // registry.fill(HIST("hEventCount"), 2.5); + // if (!cfgUseSmallMemory) { + // registry.fill(HIST("BeforeCut_globalTracks_centT0C"), collision.centFT0C(), tracks.size()); + // registry.fill(HIST("BeforeCut_PVTracks_centT0C"), collision.centFT0C(), collision.multNTracksPV()); + // registry.fill(HIST("BeforeCut_globalTracks_PVTracks"), collision.multNTracksPV(), tracks.size()); + // registry.fill(HIST("BeforeCut_globalTracks_multT0A"), collision.multFT0A(), tracks.size()); + // registry.fill(HIST("BeforeCut_globalTracks_multV0A"), collision.multFV0A(), tracks.size()); + // registry.fill(HIST("BeforeCut_multV0A_multT0A"), collision.multFT0A(), collision.multFV0A()); + // registry.fill(HIST("BeforeCut_multT0C_centT0C"), collision.centFT0C(), collision.multFT0C()); + // } + float cent = 100; + // switch (cfgCentEstimator) { + // case kCentFT0C: + // cent = collision.centFT0C(); + // break; + // case kCentFT0CVariant1: + // cent = collision.centFT0CVariant1(); + // break; + // case kCentFT0M: + // cent = collision.centFT0M(); + // break; + // case kCentFV0A: + // cent = collision.centFV0A(); + // break; + // default: + // cent = collision.centFT0C(); + // } + // if (cfgUseTentativeEventCounter) + // eventCounterQA(collision, tracks.size(), cent); + // if (cfgUseAdditionalEventCut && !eventSelected(collision, tracks.size(), cent)) + // return; + // registry.fill(HIST("hEventCount"), 3.5); + float lRandom = fRndm->Rndm(); + float vtxz = collision.posZ(); + registry.fill(HIST("hVtxZ"), vtxz); + registry.fill(HIST("hMult"), tracks.size()); + registry.fill(HIST("hCent"), cent); + fGFW->Clear(); + // if (cfgGetInteractionRate) { + // initHadronicRate(bc); + // double hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), mRunNumber, "ZNC hadronic") * 1.e-3; // + // double seconds = bc.timestamp() * 1.e-3 - mMinSeconds; + // if (cfgUseInteractionRateCut && (hadronicRate < cfgCutMinIR || hadronicRate > cfgCutMaxIR)) // cut on hadronic rate + // return; + // gCurrentHadronicRate->Fill(seconds, hadronicRate); + // } + // loadCorrections(bc.timestamp(), currentRunNumber); + // registry.fill(HIST("hEventCount"), 4.5); + + // // fill event QA + // if (!cfgUseSmallMemory) { + // registry.fill(HIST("globalTracks_centT0C"), collision.centFT0C(), tracks.size()); + // registry.fill(HIST("PVTracks_centT0C"), collision.centFT0C(), collision.multNTracksPV()); + // registry.fill(HIST("globalTracks_PVTracks"), collision.multNTracksPV(), tracks.size()); + // registry.fill(HIST("globalTracks_multT0A"), collision.multFT0A(), tracks.size()); + // registry.fill(HIST("globalTracks_multV0A"), collision.multFV0A(), tracks.size()); + // registry.fill(HIST("multV0A_multT0A"), collision.multFT0A(), collision.multFV0A()); + // registry.fill(HIST("multT0C_centT0C"), collision.centFT0C(), collision.multFT0C()); + // registry.fill(HIST("centFT0CVar_centFT0C"), collision.centFT0C(), collision.centFT0CVariant1()); + // registry.fill(HIST("centFT0M_centFT0C"), collision.centFT0C(), collision.centFT0M()); + // registry.fill(HIST("centFV0A_centFT0C"), collision.centFT0C(), collision.centFV0A()); + // } + + // // track weights + float weff = 1, wacc = 1; + double nTracksCorrected = 0; + float independent = cent; + if (cfgUseNch) { + independent = static_cast(tracks.size()); + } + + for (const auto& track : tracks) { + if (!trackSelected(track)) + continue; + auto momentum = std::array{track.px(), track.py(), track.pz()}; + double pt = RecoDecay::pt(momentum); + double phi = RecoDecay::phi(momentum); + double eta = RecoDecay::eta(momentum); + bool withinPtPOI = (cfgCutPtPOIMin < pt) && (pt < cfgCutPtPOIMax); // within POI pT range + bool withinPtRef = (cfgCutPtRefMin < pt) && (pt < cfgCutPtRefMax); // within RF pT range + if (cfgOutputNUAWeights) { + if (cfgOutputNUAWeightsRefPt) { + if (withinPtRef) { + fWeights->fill(phi, eta, vtxz, pt, cent, 0); + } + } else { + fWeights->fill(phi, eta, vtxz, pt, cent, 0); + } + } + if (!setCurrentParticleWeights(weff, wacc, phi, eta, pt, vtxz)) { + continue; + } + registry.fill(HIST("hPt"), track.pt()); + if (withinPtRef) { + registry.fill(HIST("hPhi"), phi); + registry.fill(HIST("hPhiWeighted"), phi, wacc); + registry.fill(HIST("hEta"), eta); + registry.fill(HIST("hPtRef"), pt); + // registry.fill(HIST("hChi2prTPCcls"), track.tpcChi2NCl()); + // registry.fill(HIST("hChi2prITScls"), track.itsChi2NCl()); + // registry.fill(HIST("hnTPCClu"), track.tpcNClsFound()); + // registry.fill(HIST("hnITSClu"), track.itsNCls()); + // registry.fill(HIST("hnTPCCrossedRow"), track.tpcNClsCrossedRows()); + registry.fill(HIST("hDCAz"), track.dcaZ(), track.pt()); + registry.fill(HIST("hDCAxy"), track.dcaXY(), track.pt()); + nTracksCorrected += weff; + } + if (withinPtRef) { + fGFW->Fill(eta, fPtAxis->FindBin(pt) - 1, phi, wacc * weff, 1); + } + if (withinPtPOI) { + fGFW->Fill(eta, fPtAxis->FindBin(pt) - 1, phi, wacc * weff, 2); + } + if (withinPtPOI && withinPtRef) { + fGFW->Fill(eta, fPtAxis->FindBin(pt) - 1, phi, wacc * weff, 4); + } + } + registry.fill(HIST("hTrackCorrection2d"), tracks.size(), nTracksCorrected); + + // Filling Flow Container + for (uint l_ind = 0; l_ind < corrconfigs.size(); l_ind++) { + fillFC(corrconfigs.at(l_ind), independent, lRandom); + } + } +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc)}; +} From d8cc7cad519ec80a753060c8afdfd5e88539000d Mon Sep 17 00:00:00 2001 From: Sandeep Dudi <69388148+sdudi123@users.noreply.github.com> Date: Mon, 17 Mar 2025 20:54:19 +0100 Subject: [PATCH 0730/1650] [PWGUD] Efficiency calculation part is included (#10475) Co-authored-by: Sandeep Dudi Co-authored-by: Sandeep Dudi Co-authored-by: sandeep dudi --- PWGUD/Tasks/sginclusivePhiKstarSD.cxx | 870 ++++++++++++++++++++------ 1 file changed, 678 insertions(+), 192 deletions(-) diff --git a/PWGUD/Tasks/sginclusivePhiKstarSD.cxx b/PWGUD/Tasks/sginclusivePhiKstarSD.cxx index 16df12dced3..a3dfa861c31 100644 --- a/PWGUD/Tasks/sginclusivePhiKstarSD.cxx +++ b/PWGUD/Tasks/sginclusivePhiKstarSD.cxx @@ -8,24 +8,27 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -// \Single Gap Event Analyzer -// \author Sandeep Dudi, sandeep.dudi3@gmail.com -// \since May 2024 +// +/// \file sginclusivePhiKstarSD.cxx +/// \brief Single Gap Event Analyzer for phi and Kstar +/// \author Sandeep Dudi, sandeep.dudi3@gmail.com +/// \since May 2024 #include #include #include -#include #include #include "Math/Vector4D.h" #include "Math/Vector3D.h" #include "Math/GenVector/Boost.h" +#include "TPDGCode.h" #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "Framework/ASoA.h" #include "Framework/ASoAHelpers.h" +#include "Framework/O2DatabasePDGPlugin.h" #include "ReconstructionDataFormats/Vertex.h" #include "PWGUD/DataModel/UDTables.h" @@ -40,65 +43,73 @@ using namespace o2; using namespace o2::aod; using namespace o2::framework; using namespace o2::framework::expressions; -#define mpion 0.1396 -#define mkaon 0.4937 -#define mproton 0.9383 -#define mmuon 0.1057 +using namespace o2::constants::physics; -struct SGResonanceAnalyzer { +struct SginclusivePhiKstarSD { SGSelector sgSelector; + Service pdg; + Configurable verbosity{"verbosity", 0, "Determines level of verbosity"}; + HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; - Configurable FV0_cut{"FV0", 50., "FV0A threshold"}; - Configurable FT0A_cut{"FT0A", 100., "FT0A threshold"}; - Configurable FT0C_cut{"FT0C", 50., "FT0C threshold"}; - Configurable FDDA_cut{"FDDA", 10000., "FDDA threshold"}; - Configurable FDDC_cut{"FDDC", 10000., "FDDC threshold"}; - Configurable ZDC_cut{"ZDC", 0., "ZDC threshold"}; - Configurable Vz_cut{"Vz_cut", 10., "Vz position"}; - Configurable OccT_cut{"OccT", 1000., "Occupancy cut"}; + Configurable fv0Cut{"fv0Cut", 50., "FV0A threshold"}; + Configurable ft0aCut{"ft0aCut", 100., "FT0A threshold"}; + Configurable ft0cCut{"ft0cCut", 50., "FT0C threshold"}; + Configurable fddaCut{"fddaCut", 10000., "FDDA threshold"}; + Configurable fddcCut{"fddcCut", 10000., "FDDC threshold"}; + Configurable zdcCut{"zdcCut", 0., "ZDC threshold"}; + Configurable vzCut{"vzCut", 10., "Vz position"}; + Configurable occCut{"occCut", 1000., "Occupancy cut"}; // Track Selections - Configurable PV_cut{"PV_cut", 1.0, "Use Only PV tracks"}; - Configurable dcaZ_cut{"dcaZ_cut", 2.0, "dcaZ cut"}; - Configurable dcaXY_cut{"dcaXY_cut", 0.0, "dcaXY cut (0 for Pt-function)"}; - Configurable tpcChi2_cut{"tpcChi2_cut", 4, "Max tpcChi2NCl"}; - Configurable tpcNClsFindable_cut{"tpcNClsFindable_cut", 70, "Min tpcNClsFindable"}; - Configurable itsChi2_cut{"itsChi2_cut", 36, "Max itsChi2NCl"}; - Configurable eta_cut{"eta_cut", 0.9, "Track Pseudorapidity"}; - Configurable pt_cut{"pt_cut", 0.15, "Track pt cut"}; + Configurable pvCut{"pvCut", 1.0, "Use Only PV tracks"}; + Configurable dcazCut{"dcazCut", 2.0, "dcaZ cut"}; + Configurable dcaxyCut{"dcaxyCut", 0.0, "dcaXY cut (0 for Pt-function)"}; + Configurable tpcChi2Cut{"tpcChi2Cut", 4, "Max tpcChi2NCl"}; + Configurable tpcNClsFindableCut{"tpcNClsFindableCut", 70, "Min tpcNClsFindable"}; + Configurable itsChi2Cut{"itsChi2Cut", 36, "Max itsChi2NCl"}; + Configurable etaCut{"etaCut", 0.9, "Track Pseudorapidity"}; + Configurable ptCut{"ptCut", 0.15, "Track pt cut"}; Configurable pt1{"pt1", 0.3, "pid selection pt1"}; Configurable pt2{"pt2", 0.4, "pid selection pt2"}; Configurable pt3{"pt3", 0.5, "pid selection pt3"}; - Configurable EtaGapMin{"EtaGapMin", 0.0, "Track eta min"}; - Configurable EtaGapMax{"EtaGapMax", 0.9, "Track eta min"}; - Configurable EtaDG{"EtaDG", 0.5, "Track eta DG"}; + Configurable etaGapMin{"etaGapMin", 0.0, "Track eta min"}; + Configurable etaGapMax{"etaGapMax", 0.9, "Track eta max"}; + Configurable etaDG{"etaDG", 0.5, "Track eta DG"}; + + Configurable nsigmaTpcCut1{"nsigmaTpcCut1", 3.0, "nsigma tpc cut1"}; + Configurable nsigmaTpcCut2{"nsigmaTpcCut2", 3.0, "nsigma tpc cut2"}; + Configurable nsigmaTpcCut3{"nsigmaTpcCut3", 3.0, "nsigma tpc cut3"}; + Configurable nsigmaTpcCut4{"nsigmaTpcCut4", 3.0, "nsigma tpc cut4"}; + Configurable nsigmaTpcCut{"nsigmaTpcCut", 3.0, "nsigma tpc cut"}; + Configurable nsigmaTofCut{"nsigmaTofCut", 9.0, "nsigma tpc+tof cut"}; + Configurable nsigmaTofCut1{"nsigmaTofCut1", 3.0, "nsigma tof cut"}; + Configurable pionNsigmaCut{"pionNsigmaCut", 3.0, "nsigma tpc cut for kaon"}; - Configurable nsigmatpc_cut1{"nsigmatpc1", 3.0, "nsigma tpc cut1"}; - Configurable nsigmatpc_cut2{"nsigmatpc2", 3.0, "nsigma tpc cut2"}; - Configurable nsigmatpc_cut3{"nsigmatpc3", 3.0, "nsigma tpc cut3"}; - Configurable nsigmatpc_cut{"nsigmatpc", 3.0, "nsigma tpc cut"}; - Configurable nsigmatof_cut{"nsigmatof", 9.0, "nsigma tof cut"}; + Configurable mintrack{"mintrack", 1, "min track"}; + Configurable maxtrack{"maxtrack", 50, "max track"}; + Configurable useTof{"useTof", true, "TOF PID"}; + Configurable ccut{"ccut", true, "TPC + TOF PID"}; + Configurable kaoncut{"kaoncut", true, " kaon slection cut for kstar "}; - Configurable mintrack{"min_track", 1, "min track"}; - Configurable maxtrack{"max_track", 50, "max track"}; - Configurable use_tof{"Use_TOF", true, "TOF PID"}; - Configurable QA{"QA", true, ""}; - Configurable rapidity_gap{"rapidity_gap", true, ""}; + Configurable qa{"qa", true, ""}; + Configurable rapidityGap{"rapidityGap", true, ""}; Configurable phi{"phi", true, ""}; Configurable rho{"rho", true, ""}; Configurable kstar{"kstar", true, ""}; Configurable fourpion{"fourpion", true, ""}; + Configurable mc{"mc", true, ""}; + Configurable gapsideMC{"gapsideMC", 1, "gapside MC"}; Configurable cfgNoMixedEvents{"cfgNoMixedEvents", 1, "Number of mixed events per event"}; Configurable nBkgRotations{"nBkgRotations", 9, "Number of rotated copies (background) per each original candidate"}; Configurable fillRotation{"fillRotation", true, "fill rotation"}; - Configurable confMinRot{"confMinRot", 5.0 * TMath::Pi() / 6.0, "Minimum of rotation"}; - Configurable confMaxRot{"confMaxRot", 7.0 * TMath::Pi() / 6.0, "Maximum of rotation"}; + Configurable confMinRot{"confMinRot", 5.0 * o2::constants::math::PI / 6.0, "Minimum of rotation"}; + Configurable confMaxRot{"confMaxRot", 7.0 * o2::constants::math::PI / 6.0, "Maximum of rotation"}; - void init(InitContext const&) + void init(InitContext const& context) { registry.add("GapSide", "Gap Side; Entries", kTH1F, {{4, -1.5, 2.5}}); registry.add("TrueGapSide", "Gap Side; Entries", kTH1F, {{4, -1.5, 2.5}}); @@ -143,10 +154,10 @@ struct SGResonanceAnalyzer { registry.add("os_pk_ls_pT_1", "pion-kaon like sign", kTH3F, {{400, 0.0, 2.0}, {80, -2.0, 2.0}, {100, 0, 10}}); registry.add("os_pk_ls_pT_2", "pion-kaon like sign", kTH3F, {{400, 0.0, 2.0}, {80, -2.0, 2.0}, {100, 0, 10}}); - registry.add("hRotation", "hRotation", kTH1F, {{360, 0.0, 2.0 * TMath::Pi()}}); + registry.add("hRotation", "hRotation", kTH1F, {{360, 0.0, o2::constants::math::TwoPI}}); } - // QA plots - if (QA) { + // qa plots + if (qa) { registry.add("tpc_dedx", "p vs dE/dx", kTH2F, {{100, 0.0, 10.0}, {5000, 0.0, 5000.0}}); registry.add("tof_beta", "p vs beta", kTH2F, {{100, 0.0, 10.0}, {5000, 0.0, 5000.0}}); @@ -162,6 +173,10 @@ struct SGResonanceAnalyzer { registry.add("tof_nsigma_kaon", "p#k n#sigma", kTH2F, {{100, 0.0, 10.0}, {100, -10.0, 10.0}}); registry.add("tof_nsigma_pion", "p#pi n#sigma", kTH2F, {{100, 0.0, 10.0}, {100, -10.0, 10.0}}); + registry.add("tof_nsigma_kaon_f", "p#k n#sigma", kTH2F, {{100, 0.0, 10.0}, {100, -10.0, 10.0}}); + registry.add("tof_nsigma_pion_f", "p#pi n#sigma", kTH2F, {{100, 0.0, 10.0}, {100, -10.0, 10.0}}); + registry.add("tpc_nsigma_kaon_f", "p#k n#sigma", kTH2F, {{100, 0.0, 10.0}, {100, -10.0, 10.0}}); + registry.add("tpc_nsigma_pion_f", "p#pi n#sigma", kTH2F, {{100, 0.0, 10.0}, {100, -10.0, 10.0}}); registry.add("FT0A", "T0A amplitude", kTH1F, {{500, 0.0, 500.0}}); registry.add("FT0A_0", "T0A amplitude", kTH1F, {{500, 0.0, 500.0}}); @@ -178,7 +193,7 @@ struct SGResonanceAnalyzer { registry.add("V0A", "V0A amplitude", kTH1F, {{1000, 0.0, 1000.0}}); registry.add("V0A_0", "V0A amplitude", kTH1F, {{1000, 0.0, 1000.0}}); registry.add("V0A_1", "V0A amplitude", kTH1F, {{1000, 0.0, 1000.0}}); - if (rapidity_gap) { + if (rapidityGap) { registry.add("mult_0", "mult0", kTH1F, {{150, 0, 150}}); registry.add("mult_1", "mult1", kTH1F, {{150, 0, 150}}); registry.add("mult_2", "mult2", kTH1F, {{150, 0, 150}}); @@ -194,12 +209,11 @@ struct SGResonanceAnalyzer { registry.add("rap2_mult3", "rap2_mult3", kTH1F, {{150, 0, 150}}); } } - registry.add("gap_mult0", "Mult 0", kTH1F, {{100, 0.0, 100.0}}); registry.add("gap_mult1", "Mult 1", kTH1F, {{100, 0.0, 100.0}}); registry.add("gap_mult2", "Mult 2", kTH1F, {{100, 0.0, 100.0}}); // Multiplicity plot - if (rapidity_gap && phi) { + if (rapidityGap && phi) { registry.add("os_kk_mass_rap", "phi mass1", kTH3F, {{220, 0.98, 1.2}, {80, -2.0, 2.0}, {100, 0, 10}}); registry.add("os_kk_mass_rap1", "phi mass2", kTH3F, {{220, 0.98, 1.2}, {80, -2.0, 2.0}, {100, 0, 10}}); registry.add("os_kk_mass_rap2", "phi mass3", kTH3F, {{220, 0.98, 1.2}, {80, -2.0, 2.0}, {100, 0, 10}}); @@ -222,7 +236,7 @@ struct SGResonanceAnalyzer { registry.add("os_kk_ls_mass2_rap2", "phi ls mass3 DG", kTH3F, {{220, 0.98, 1.2}, {80, -2.0, 2.0}, {100, 0, 10}}); } - if (rapidity_gap && kstar) { + if (rapidityGap && kstar) { registry.add("os_kp_mass_rap", "kstar mass1", kTH3F, {{400, 0.0, 2.0}, {80, -2.0, 2.0}, {100, 0, 10}}); registry.add("os_kp_mass_rap1", "kstar mass2", kTH3F, {{400, 0.0, 2.0}, {80, -2.0, 2.0}, {100, 0, 10}}); registry.add("os_kp_mass_rap2", "kstar mass3", kTH3F, {{400, 0.0, 2.0}, {80, -2.0, 2.0}, {100, 0, 10}}); @@ -259,60 +273,142 @@ struct SGResonanceAnalyzer { registry.add("costheta_dis1", "costheta_dis1", kTH1F, {{40, -1.0, 1.0}}); registry.add("costheta_vs_phi1", "costheta_vs_phi1", kTH2F, {{40, -1.0, 1.0}, {360, 0.0, 6.28}}); } + if (mc) { + // add histograms for the different process functions + if (context.mOptions.get("processMCTruth")) { + registry.add("MC/Stat", "Count generated events; ; Entries", {HistType::kTH1F, {{1, -0.5, 0.5}}}); + registry.add("MC/recCols", "Number of reconstructed collisions; Number of reconstructed collisions; Entries", {HistType::kTH1F, {{31, -0.5, 30.5}}}); + registry.add("MC/nParts", "Number of McParticles per collision; Number of McParticles; Entries", {HistType::kTH1F, {{1001, -0.5, 1000.5}}}); + registry.add("MC/nRecTracks", "Number of reconstructed tracks per McParticle; Number of reconstructed tracks per McParticle; Entries", {HistType::kTH1F, {{11, -0.5, 10.5}}}); + registry.add("MC/genEtaPt", "Generated events; eta (1); Pt (GeV/c)", {HistType::kTH2F, {{60, -1.5, 1.5}, {250, 0.0, 5.0}}}); + registry.add("MC/genRap", "Generated events; Rapidity (1)", {HistType::kTH1F, {{60, -1.5, 1.5}}}); + registry.add("MC/genMPt", "Generated events; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH2F, {{220, 0.98, 1.2}, {200, 0.0, 10.0}}}); + registry.add("MC/genM", "Generated events; Mass (GeV/c^2)", {HistType::kTH1F, {{220, 0.98, 1.2}}}); + registry.add("MC/genM_1", "Generated events; Mass (GeV/c^2)", {HistType::kTH1F, {{220, 0.98, 1.2}}}); + + registry.add("MC/accMPtRap_phi_G", "Generated Phi; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH3F, {{220, 0.98, 1.20}, {200, 0.0, 10.0}, {60, -1.5, 1.5}}}); + registry.add("MC/accEtaPt", "Generated events in acceptance; eta (1); Pt (GeV/c)", {HistType::kTH2F, {{60, -1.5, 1.5}, {250, 0.0, 5.0}}}); + registry.add("MC/accRap", "Generated events in acceptance; Rapidity (1)", {HistType::kTH1F, {{60, -1.5, 1.5}}}); + registry.add("MC/accMPt", "Generated events in acceptance; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH2F, {{220, 0.98, 1.20}, {200, 0.0, 10.0}}}); + registry.add("MC/accMPtRap", "Generated events in acceptance; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH3F, {{220, 0.98, 1.20}, {200, 0.0, 10.0}, {60, -1.5, 1.5}}}); + registry.add("MC/accM", "Generated events in acceptance; Mass (GeV/c^2)", {HistType::kTH1F, {{220, 0.98, 1.20}}}); + registry.add("MC/selEtaPt", "Selected events in acceptance; eta (1); Pt (GeV/c)", {HistType::kTH2F, {{60, -1.5, 1.5}, {250, 0.0, 5.0}}}); + registry.add("MC/selRap", "Selected events in acceptance; Rapidity (1)", {HistType::kTH1F, {{60, -1.5, 1.5}}}); + registry.add("MC/selMPt", "Selected events in acceptance; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH2F, {{250, 2.5, 5.0}, {100, 0.0, 1.0}}}); + registry.add("MC/pDiff", "McTruth - reconstructed track momentum; McTruth - reconstructed track momentum; Entries", {HistType::kTH2F, {{240, -6., 6.}, {3, -1.5, 1.5}}}); + // K*0 + registry.add("MC/accMPtRap_kstar_G", "Generated K*0; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH3F, {{400, 0., 2.0}, {200, 0.0, 10.0}, {60, -1.5, 1.5}}}); + registry.add("MC/genEtaPt_k", "Generated events; eta (1); Pt (GeV/c)", {HistType::kTH2F, {{60, -1.5, 1.5}, {250, 0.0, 5.0}}}); + registry.add("MC/genRap_k", "Generated events; Rapidity (1)", {HistType::kTH1F, {{60, -1.5, 1.5}}}); + registry.add("MC/genMPt_k", "Generated events; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH2F, {{400, 0., 2.0}, {200, 0.0, 10.0}}}); + registry.add("MC/genM_k", "Generated events; Mass (GeV/c^2)", {HistType::kTH1F, {{400, 0., 2.0}}}); + registry.add("MC/genM_1_k", "Generated events; Mass (GeV/c^2)", {HistType::kTH1F, {{400, 0., 2.0}}}); + + registry.add("MC/accEtaPt_k", "Generated events in acceptance; eta (1); Pt (GeV/c)", {HistType::kTH2F, {{60, -1.5, 1.5}, {250, 0.0, 5.0}}}); + registry.add("MC/accRap_k", "Generated events in acceptance; Rapidity (1)", {HistType::kTH1F, {{60, -1.5, 1.5}}}); + registry.add("MC/accMPt_k", "Generated events in acceptance; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH2F, {{400, 0., 2.0}, {200, 0.0, 10.0}}}); + registry.add("MC/accMPtRap_k", "Generated events in acceptance; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH3F, {{400, 0., 2.0}, {200, 0.0, 10.0}, {60, -1.5, 1.5}}}); + registry.add("MC/accM_k", "Generated events in acceptance; Mass (GeV/c^2)", {HistType::kTH1F, {{400, 0., 2.0}}}); + } + if (context.mOptions.get("processReco")) { + registry.add("Reco/Stat", "Count reconstruted events; ; Entries", {HistType::kTH1F, {{5, -0.5, 4.5}}}); + registry.add("Reco/nPVContributors", "Number of PV contributors per collision; Number of PV contributors; Entries", {HistType::kTH1F, {{51, -0.5, 50.5}}}); + registry.add("Reco/selEtaPt", "Selected events in acceptance; eta (1); Pt (GeV/c)", {HistType::kTH2F, {{300, -1.5, 1.5}, {250, 0.0, 5.0}}}); + registry.add("Reco/selRap", "Selected events in acceptance; Rapidity (1)", {HistType::kTH1F, {{60, -1.5, 1.5}}}); + registry.add("Reco/selMPt", "Reconstructed events in acceptance; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH2F, {{220, 0.98, 1.20}, {200, 0.0, 10.0}}}); + registry.add("Reco/selMPtRap", "Reconstructed events in acceptance; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH3F, {{220, 0.98, 1.20}, {200, 0.0, 10.0}, {60, -1.5, 1.5}}}); + registry.add("Reco/selMPtRap_gen", "Reconstructed(gen) events in acceptance; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH3F, {{220, 0.98, 1.20}, {200, 0.0, 10.0}, {60, -1.5, 1.5}}}); + registry.add("Reco/selPt", "Reconstructed events in acceptance;Pt (GeV/c)", {HistType::kTH1F, {{200, 0.0, 10.0}}}); + registry.add("Reco/selM", "Reconstructed events in acceptance; Mass (GeV/c^2); ", {HistType::kTH1F, {{220, 0.98, 1.20}}}); + registry.add("Reco/mcEtaPt", "Generated events in acceptance; eta (1); Pt (GeV/c)", {HistType::kTH2F, {{60, -1.5, 1.5}, {250, 0.0, 5.0}}}); + registry.add("Reco/mcRap", "Generated events in acceptance; Rapidity (1)", {HistType::kTH1F, {{60, -1.5, 1.5}}}); + registry.add("Reco/mcMPt", "Generated events in acceptance; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH2F, {{250, 2.5, 5.0}, {100, 0.0, 1.0}}}); + registry.add("Reco/pDiff", "McTruth - reconstructed track momentum; McTruth - reconstructed track momentum; Entries", {HistType::kTH2F, {{240, -6., 6.}, {3, -1.5, 1.5}}}); + + registry.add("Reco/selEtaPt_k", "Selected events in acceptance; eta (1); Pt (GeV/c)", {HistType::kTH2F, {{300, -1.5, 1.5}, {250, 0.0, 5.0}}}); + registry.add("Reco/selRap_k", "Selected events in acceptance; Rapidity (1)", {HistType::kTH1F, {{60, -1.5, 1.5}}}); + registry.add("Reco/selMPt_k", "Reconstructed events in acceptance; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH2F, {{400, 0., 2.0}, {200, 0.0, 10.0}}}); + registry.add("Reco/selMPtRap_k", "Reconstructed events in acceptance; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH3F, {{400, 0., 2.0}, {200, 0.0, 10.0}, {60, -1.5, 1.5}}}); + registry.add("Reco/selMPtRap_k_gen", "Reconstructed(gen) events in acceptance; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH3F, {{400, 0., 2.0}, {200, 0.0, 10.0}, {60, -1.5, 1.5}}}); + registry.add("Reco/selPt_k", "Reconstructed events in acceptance;Pt (GeV/c)", {HistType::kTH1F, {{200, 0.0, 10.0}}}); + registry.add("Reco/selM_k", "Reconstructed events in acceptance; Mass (GeV/c^2); ", {HistType::kTH1F, {{400, 0., 2.0}}}); + registry.add("Reco/selM_k_K", "Reconstructed events in acceptance; Mass (GeV/c^2); ", {HistType::kTH1F, {{400, 0., 2.0}}}); + + registry.add("Reco/nTracks", "Number of reconstructed tracks per collision; Number of reconstructed tracks; Entries", {HistType::kTH1F, {{101, -0.5, 100.5}}}); + registry.add("Reco/treta_k", "track kaon eta", {HistType::kTH1F, {{200, -5.0, 5.0}}}); + registry.add("Reco/trpt_k", "rec kaon track pt", {HistType::kTH1F, {{200, 0.0, 10.0}}}); + registry.add("Reco/trpt", "rec track pt", {HistType::kTH1F, {{200, 0.0, 10.0}}}); + + registry.add("Reco/tr_dcaz_1", "dcaz-", {HistType::kTH1F, {{1000, -5.0, 5.0}}}); + registry.add("Reco/tr_dcaxy_1", "dcaxy-", {HistType::kTH1F, {{1000, -5.0, 5.0}}}); + registry.add("Reco/tr_chi2ncl_1", "chi2ncl-", {HistType::kTH1F, {{100, 0.0, 100.0}}}); + registry.add("Reco/tr_tpcnclfind_1", "tpcnclfind-", {HistType::kTH1F, {{300, 0.0, 300.0}}}); + registry.add("Reco/tr_itsChi2NCl_1", "itsChi2NCl-", {HistType::kTH1F, {{200, 0.0, 200.0}}}); + registry.add("Reco/tr_Eta_1", " eta -", {HistType::kTH1F, {{300, 1.5, 1.5}}}); + + registry.add("Reco/tr_dcaz_2", "dcaz", {HistType::kTH1F, {{1000, -5.0, 5.0}}}); + registry.add("Reco/tr_dcaxy_2", "dcaxy", {HistType::kTH1F, {{1000, -5.0, 5.0}}}); + registry.add("Reco/tr_chi2ncl_2", "chi2ncl", {HistType::kTH1F, {{100, 0.0, 100.0}}}); + registry.add("Reco/tr_tpcnclfind_2", "tpcnclfind", {HistType::kTH1F, {{300, 0.0, 300.0}}}); + registry.add("Reco/tr_itsChi2NCl_2", "itsChi2NCl", {HistType::kTH1F, {{200, 0.0, 200.0}}}); + } + } } //_____________________________________________________________________________ - Double_t CosThetaCollinsSoperFrame(ROOT::Math::PtEtaPhiMVector pair1, - ROOT::Math::PtEtaPhiMVector pair2, - ROOT::Math::PtEtaPhiMVector fourpion) + double cosThetaCollinsSoperFrame(TLorentzVector pair1, + TLorentzVector pair2, + TLorentzVector fourpion) { - Double_t HalfSqrtSnn = 2680.; - Double_t MassOfLead208 = 193.6823; - Double_t MomentumBeam = TMath::Sqrt(HalfSqrtSnn * HalfSqrtSnn * 208 * 208 - MassOfLead208 * MassOfLead208); + double halfSqrtSnn = 2680.; + double massOfLead208 = 193.6823; + double momentumBeam = std::sqrt(halfSqrtSnn * halfSqrtSnn * 208 * 208 - massOfLead208 * massOfLead208); - TLorentzVector pProjCM(0., 0., -MomentumBeam, HalfSqrtSnn * 208); // projectile - TLorentzVector pTargCM(0., 0., MomentumBeam, HalfSqrtSnn * 208); // target + ROOT::Math::PxPyPzEVector pProjCM(0., 0., -momentumBeam, halfSqrtSnn * 208); // projectile + ROOT::Math::PxPyPzEVector pTargCM(0., 0., momentumBeam, halfSqrtSnn * 208); // target - // TVector3 beta = (-1. / fourpion.E()) * fourpion.Vect(); - ROOT::Math::PtEtaPhiMVector v1 = pair1; - ROOT::Math::PtEtaPhiMVector v2 = pair2; - ROOT::Math::PtEtaPhiMVector v12 = fourpion; + ROOT::Math::PxPyPzMVector v1 = ROOT::Math::PxPyPzMVector(pair1.Px(), pair1.Py(), pair1.Pz(), pair1.M()); + ROOT::Math::PxPyPzMVector v2 = ROOT::Math::PxPyPzMVector(pair2.Px(), pair2.Py(), pair2.Pz(), pair2.M()); + ROOT::Math::PxPyPzMVector v12 = ROOT::Math::PxPyPzMVector(fourpion.Px(), fourpion.Py(), fourpion.Pz(), fourpion.M()); // Boost to center of mass frame ROOT::Math::Boost boostv12{v12.BoostToCM()}; - ROOT::Math::XYZVectorF v1_CM{(boostv12(v1).Vect()).Unit()}; - ROOT::Math::XYZVectorF v2_CM{(boostv12(v2).Vect()).Unit()}; - ROOT::Math::XYZVectorF Beam1_CM{(boostv12(pProjCM).Vect()).Unit()}; - ROOT::Math::XYZVectorF Beam2_CM{(boostv12(pTargCM).Vect()).Unit()}; - + ROOT::Math::XYZVectorF v1Cm{(boostv12(v1).Vect()).Unit()}; + ROOT::Math::XYZVectorF v2Cm{(boostv12(v2).Vect()).Unit()}; + ROOT::Math::XYZVectorF beam1Cm{(boostv12(pProjCM).Vect()).Unit()}; + ROOT::Math::XYZVectorF beam2Cm{(boostv12(pTargCM).Vect()).Unit()}; // Axes - ROOT::Math::XYZVectorF zaxis_CS{((Beam1_CM.Unit() - Beam2_CM.Unit()).Unit())}; + ROOT::Math::XYZVectorF zaxisCs{((beam1Cm.Unit() - beam2Cm.Unit()).Unit())}; - Double_t CosThetaCS = zaxis_CS.Dot((v1_CM)); - return CosThetaCS; + double cosThetaCs = zaxisCs.Dot((v1Cm)); + return cosThetaCs; } template bool selectionPIDKaon1(const T& candidate) { - auto pt = TMath::Sqrt(candidate.px() * candidate.px() + candidate.py() * candidate.py()); + auto pt = std::sqrt(candidate.px() * candidate.px() + candidate.py() * candidate.py()); // float pt1, pt2, pt3 , nsigmatpc_cut1, nsigmatpc_cut2, nsigmatpc_cut3; - if (use_tof && pt < pt1 && std::abs(candidate.tpcNSigmaKa()) < nsigmatpc_cut1) { + if (useTof && pt < pt1 && std::abs(candidate.tpcNSigmaKa()) < nsigmaTpcCut1) { return true; } - if (use_tof && pt >= pt1 && pt < pt2 && std::abs(candidate.tpcNSigmaKa()) < nsigmatpc_cut2) { + if (useTof && pt >= pt1 && pt < pt2 && std::abs(candidate.tpcNSigmaKa()) < nsigmaTpcCut2) { return true; } - if (use_tof && pt >= pt2 && pt < pt3 && std::abs(candidate.tpcNSigmaKa()) < nsigmatpc_cut3) { + if (useTof && pt >= pt2 && pt < pt3 && std::abs(candidate.tpcNSigmaKa()) < nsigmaTpcCut3) { return true; } - if (use_tof && pt >= pt3 && !candidate.hasTOF() && std::abs(candidate.tpcNSigmaKa()) < nsigmatpc_cut) { + if (useTof && pt >= pt3 && !candidate.hasTOF() && std::abs(candidate.tpcNSigmaKa()) < nsigmaTpcCut) { return true; } - if (use_tof && candidate.hasTOF() && (candidate.tofNSigmaKa() * candidate.tofNSigmaKa() + candidate.tpcNSigmaKa() * candidate.tpcNSigmaKa()) < nsigmatof_cut) { + if (useTof && candidate.hasTOF() && ccut && (candidate.tofNSigmaKa() * candidate.tofNSigmaKa() + candidate.tpcNSigmaKa() * candidate.tpcNSigmaKa()) < nsigmaTofCut) { return true; } - if (!use_tof && std::abs(candidate.tpcNSigmaKa()) < nsigmatpc_cut) { + if (useTof && candidate.hasTOF() && !ccut && std::abs(candidate.tpcNSigmaKa()) < nsigmaTpcCut && std::abs(candidate.tofNSigmaKa()) < nsigmaTofCut1) { + return true; + } + + if (!useTof && std::abs(candidate.tpcNSigmaKa()) < nsigmaTpcCut) { return true; } return false; @@ -321,96 +417,99 @@ struct SGResonanceAnalyzer { template bool selectionPIDPion1(const T& candidate) { - auto pt = TMath::Sqrt(candidate.px() * candidate.px() + candidate.py() * candidate.py()); + auto pt = std::sqrt(candidate.px() * candidate.px() + candidate.py() * candidate.py()); - if (use_tof && pt < pt1 && std::abs(candidate.tpcNSigmaPi()) < nsigmatpc_cut1) { + if (useTof && pt < pt1 && std::abs(candidate.tpcNSigmaPi()) < nsigmaTpcCut1) { + return true; + } + if (useTof && pt >= pt1 && pt < pt2 && std::abs(candidate.tpcNSigmaPi()) < nsigmaTpcCut2) { return true; } - if (use_tof && pt >= pt1 && pt < pt2 && std::abs(candidate.tpcNSigmaPi()) < nsigmatpc_cut2) { + if (useTof && pt >= pt2 && pt < pt3 && std::abs(candidate.tpcNSigmaPi()) < nsigmaTpcCut3) { return true; } - if (use_tof && pt >= pt2 && pt < pt3 && std::abs(candidate.tpcNSigmaPi()) < nsigmatpc_cut3) { + if (useTof && pt >= pt3 && !candidate.hasTOF() && std::abs(candidate.tpcNSigmaPi()) < nsigmaTpcCut) { return true; } - if (use_tof && pt >= pt3 && !candidate.hasTOF() && std::abs(candidate.tpcNSigmaPi()) < nsigmatpc_cut) { + if (useTof && candidate.hasTOF() && ccut && (candidate.tofNSigmaPi() * candidate.tofNSigmaPi() + candidate.tpcNSigmaPi() * candidate.tpcNSigmaPi()) < nsigmaTofCut) { return true; } - if (use_tof && candidate.hasTOF() && (candidate.tofNSigmaPi() * candidate.tofNSigmaPi() + candidate.tpcNSigmaPi() * candidate.tpcNSigmaPi()) < nsigmatof_cut) { + if (useTof && candidate.hasTOF() && !ccut && std::abs(candidate.tpcNSigmaKa()) < nsigmaTpcCut && std::abs(candidate.tofNSigmaKa()) < nsigmaTofCut1) { return true; } - if (!use_tof && std::abs(candidate.tpcNSigmaPi()) < nsigmatpc_cut) { + if (!useTof && std::abs(candidate.tpcNSigmaPi()) < nsigmaTpcCut) { return true; } return false; } //------------------------------------------------------------------------------------------------------ - Double_t PhiCollinsSoperFrame(ROOT::Math::PtEtaPhiMVector pair1, ROOT::Math::PtEtaPhiMVector pair2, ROOT::Math::PtEtaPhiMVector fourpion) + double phiCollinsSoperFrame(TLorentzVector pair1, TLorentzVector pair2, TLorentzVector fourpion) { // Half of the energy per pair of the colliding nucleons. - Double_t HalfSqrtSnn = 2680.; - Double_t MassOfLead208 = 193.6823; - Double_t MomentumBeam = TMath::Sqrt(HalfSqrtSnn * HalfSqrtSnn * 208 * 208 - MassOfLead208 * MassOfLead208); - - TLorentzVector pProjCM(0., 0., -MomentumBeam, HalfSqrtSnn * 208); // projectile - TLorentzVector pTargCM(0., 0., MomentumBeam, HalfSqrtSnn * 208); // target - ROOT::Math::PtEtaPhiMVector v1 = pair1; - ROOT::Math::PtEtaPhiMVector v2 = pair2; - ROOT::Math::PtEtaPhiMVector v12 = fourpion; + double halfSqrtSnn = 2680.; + double massOfLead208 = 193.6823; + double momentumBeam = std::sqrt(halfSqrtSnn * halfSqrtSnn * 208 * 208 - massOfLead208 * massOfLead208); + + ROOT::Math::PxPyPzEVector pProjCM(0., 0., -momentumBeam, halfSqrtSnn * 208); // projectile + ROOT::Math::PxPyPzEVector pTargCM(0., 0., momentumBeam, halfSqrtSnn * 208); // target + + ROOT::Math::PxPyPzMVector v1 = ROOT::Math::PxPyPzMVector(pair1.Px(), pair1.Py(), pair1.Pz(), pair1.M()); + ROOT::Math::PxPyPzMVector v2 = ROOT::Math::PxPyPzMVector(pair2.Px(), pair2.Py(), pair2.Pz(), pair2.M()); + ROOT::Math::PxPyPzMVector v12 = ROOT::Math::PxPyPzMVector(fourpion.Px(), fourpion.Py(), fourpion.Pz(), fourpion.M()); + // Boost to center of mass frame ROOT::Math::Boost boostv12{v12.BoostToCM()}; - ROOT::Math::XYZVectorF v1_CM{(boostv12(v1).Vect()).Unit()}; - ROOT::Math::XYZVectorF v2_CM{(boostv12(v2).Vect()).Unit()}; - ROOT::Math::XYZVectorF Beam1_CM{(boostv12(pProjCM).Vect()).Unit()}; - ROOT::Math::XYZVectorF Beam2_CM{(boostv12(pTargCM).Vect()).Unit()}; + ROOT::Math::XYZVectorF v1Cm{(boostv12(v1).Vect()).Unit()}; + ROOT::Math::XYZVectorF v2Cm{(boostv12(v2).Vect()).Unit()}; + ROOT::Math::XYZVectorF beam1Cm{(boostv12(pProjCM).Vect()).Unit()}; + ROOT::Math::XYZVectorF beam2Cm{(boostv12(pTargCM).Vect()).Unit()}; // Axes - ROOT::Math::XYZVectorF zaxis_CS{((Beam1_CM.Unit() - Beam2_CM.Unit()).Unit())}; - ROOT::Math::XYZVectorF yaxis_CS{(Beam1_CM.Cross(Beam2_CM)).Unit()}; - ROOT::Math::XYZVectorF xaxis_CS{(yaxis_CS.Cross(zaxis_CS)).Unit()}; + ROOT::Math::XYZVectorF zaxisCs{((beam1Cm.Unit() - beam2Cm.Unit()).Unit())}; + ROOT::Math::XYZVectorF yaxisCs{(beam1Cm.Cross(beam2Cm)).Unit()}; + ROOT::Math::XYZVectorF xaxisCs{(yaxisCs.Cross(zaxisCs)).Unit()}; - Double_t phi = TMath::ATan2(yaxis_CS.Dot(v1_CM), xaxis_CS.Dot(v1_CM)); + double phi = std::atan2(yaxisCs.Dot(v1Cm), xaxisCs.Dot(v1Cm)); return phi; } - using udtracks = soa::Join; - using udtracksfull = soa::Join; + using UDtracksfull = soa::Join; using UDCollisionsFull = soa::Join; // using UDCollisionFull = UDCollisionsFull::iterator; - void process(UDCollisionFull const& collision, udtracksfull const& tracks) + void process(UDCollisionFull const& collision, UDtracksfull const& tracks) { TLorentzVector v0; TLorentzVector v1; TLorentzVector v01; - TLorentzVector v0_1; int gapSide = collision.gapSide(); - float FIT_cut[5] = {FV0_cut, FT0A_cut, FT0C_cut, FDDA_cut, FDDC_cut}; - std::vector parameters = {PV_cut, dcaZ_cut, dcaXY_cut, tpcChi2_cut, tpcNClsFindable_cut, itsChi2_cut, eta_cut, pt_cut}; - int truegapSide = sgSelector.trueGap(collision, FIT_cut[0], FIT_cut[1], FIT_cut[2], ZDC_cut); + float fitCut[5] = {fv0Cut, ft0aCut, ft0cCut, fddaCut, fddcCut}; + std::vector parameters = {pvCut, dcazCut, dcaxyCut, tpcChi2Cut, tpcNClsFindableCut, itsChi2Cut, etaCut, ptCut}; + int truegapSide = sgSelector.trueGap(collision, fitCut[0], fitCut[1], fitCut[2], zdcCut); - ROOT::Math::PtEtaPhiMVector phiv; - ROOT::Math::PtEtaPhiMVector phiv1; + TLorentzVector phiv; + TLorentzVector phiv1; - std::vector onlyPionTracks_p; - std::vector rawPionTracks_p; + std::vector onlyPionTracksp; + std::vector rawPionTracksp; - std::vector onlyPionTracks_pm; - std::vector rawPionTracks_pm; + std::vector onlyPionTrackspm; + std::vector rawPionTrackspm; - std::vector onlyPionTracks_n; - std::vector rawPionTracks_n; + std::vector onlyPionTracksn; + std::vector rawPionTracksn; registry.fill(HIST("GapSide"), gapSide); registry.fill(HIST("TrueGapSide"), truegapSide); gapSide = truegapSide; if (gapSide < 0 || gapSide > 2) return; - if (std::abs(collision.posZ()) > Vz_cut) + if (std::abs(collision.posZ()) > vzCut) return; - if (std::abs(collision.occupancyInTime()) > OccT_cut) + if (std::abs(collision.occupancyInTime()) > occCut) return; - Int_t mult = collision.numContrib(); + int mult = collision.numContrib(); if (gapSide == 0) { registry.fill(HIST("gap_mult0"), mult); } @@ -422,29 +521,28 @@ struct SGResonanceAnalyzer { } if (mult < mintrack || mult > maxtrack) return; - Int_t mult0 = 0; - Int_t mult1 = 0; - Int_t mult2 = 0; - Int_t trackgapA = 0; - Int_t trackgapC = 0; - Int_t trackDG = 0; - Int_t trackextra = 0; - Int_t trackextraDG = 0; - for (auto track1 : tracks) { + int mult0 = 0; + int mult1 = 0; + int mult2 = 0; + int trackgapA = 0; + int trackgapC = 0; + int trackDG = 0; + int trackextra = 0; + int trackextraDG = 0; + for (const auto& track1 : tracks) { if (!trackselector(track1, parameters)) continue; v0.SetXYZM(track1.px(), track1.py(), track1.pz(), o2::constants::physics::MassPionCharged); - ROOT::Math::PtEtaPhiMVector vv1(v0.Pt(), v0.Eta(), v0.Phi(), o2::constants::physics::MassPionCharged); if (selectionPIDPion1(track1)) { - onlyPionTracks_pm.push_back(vv1); - rawPionTracks_pm.push_back(track1); + onlyPionTrackspm.push_back(v0); + rawPionTrackspm.push_back(track1); if (track1.sign() == 1) { - onlyPionTracks_p.push_back(vv1); - rawPionTracks_p.push_back(track1); + onlyPionTracksp.push_back(v0); + rawPionTracksp.push_back(track1); } if (track1.sign() == -1) { - onlyPionTracks_n.push_back(vv1); - rawPionTracks_n.push_back(track1); + onlyPionTracksn.push_back(v0); + rawPionTracksn.push_back(track1); } } @@ -457,49 +555,46 @@ struct SGResonanceAnalyzer { if (gapSide == 2) { mult2++; } - if (TMath::Abs(v0.Eta()) < EtaDG) { + if (std::abs(v0.Eta()) < etaDG) { trackDG++; } - if (v0.Eta() > EtaGapMin && v0.Eta() < EtaGapMax) { + if (v0.Eta() > etaGapMin && v0.Eta() < etaGapMax) { trackgapA++; } - if (v0.Eta() < EtaGapMin && v0.Eta() > -EtaGapMax) { + if (v0.Eta() < etaGapMin && v0.Eta() > -etaGapMax) { trackgapC++; } - if (TMath::Abs(v0.Eta()) > EtaGapMax || TMath::Abs(v0.Eta()) < EtaGapMin) { + if (std::abs(v0.Eta()) > etaGapMax || std::abs(v0.Eta()) < etaGapMin) { trackextra++; } - if (TMath::Abs(v0.Eta()) > EtaDG) { + if (std::abs(v0.Eta()) > etaDG) { trackextraDG++; } - if (QA) { + if (qa) { registry.fill(HIST("tpc_dedx"), v0.P(), track1.tpcSignal()); registry.fill(HIST("tof_beta"), v0.P(), track1.beta()); - registry.fill(HIST("tof_nsigma_kaon"), v0.Pt(), track1.tofNSigmaKa()); - registry.fill(HIST("tof_nsigma_pion"), v0.Pt(), track1.tofNSigmaPi()); + registry.fill(HIST("tof_nsigma_kaon_f"), v0.Pt(), track1.tofNSigmaKa()); + registry.fill(HIST("tof_nsigma_pion_f"), v0.Pt(), track1.tofNSigmaPi()); + registry.fill(HIST("tpc_nsigma_kaon_f"), v0.Pt(), track1.tpcNSigmaKa()); + registry.fill(HIST("tpc_nsigma_pion_f"), v0.Pt(), track1.tpcNSigmaPi()); - if (std::abs(track1.tpcNSigmaKa()) < 3.0) { - registry.fill(HIST("tpc_dedx_kaon"), v0.P(), track1.tpcSignal()); - } else if (std::abs(track1.tpcNSigmaPi()) < 3.0) { - registry.fill(HIST("tpc_dedx_pion"), v0.P(), track1.tpcSignal()); - } if (selectionPIDKaon1(track1)) { registry.fill(HIST("tpc_dedx_kaon_1"), v0.P(), track1.tpcSignal()); registry.fill(HIST("tpc_nsigma_kaon"), v0.Pt(), track1.tpcNSigmaKa()); + registry.fill(HIST("tof_nsigma_kaon"), v0.Pt(), track1.tofNSigmaKa()); registry.fill(HIST("tpc_tof_nsigma_kaon"), track1.tpcNSigmaKa(), track1.tofNSigmaKa()); } - if (selectionPIDKaon1(track1) && std::abs(track1.tpcNSigmaPi()) > 3.0) { - registry.fill(HIST("tpc_dedx_kaon_2"), v0.P(), track1.tpcSignal()); - } + if (selectionPIDPion1(track1)) { registry.fill(HIST("tpc_dedx_pion_1"), v0.P(), track1.tpcSignal()); registry.fill(HIST("tpc_nsigma_pion"), v0.Pt(), track1.tpcNSigmaPi()); + registry.fill(HIST("tof_nsigma_pion"), v0.Pt(), track1.tofNSigmaPi()); registry.fill(HIST("tpc_tof_nsigma_pion"), track1.tpcNSigmaPi(), track1.tofNSigmaPi()); } } } - if (QA) { + if (qa) { if (gapSide == 0) { registry.fill(HIST("V0A_0"), collision.totalFV0AmplitudeA()); registry.fill(HIST("FT0A_0"), collision.totalFT0AmplitudeA()); @@ -524,7 +619,7 @@ struct SGResonanceAnalyzer { registry.fill(HIST("ZDC_C"), collision.energyCommonZNC()); registry.fill(HIST("mult_2"), mult2); } - if (rapidity_gap) { + if (rapidityGap) { if (trackgapC > 0 && trackgapA == 0 && trackextra == 0) { if (gapSide == 0) { registry.fill(HIST("event_rap_gap"), 1); @@ -570,9 +665,9 @@ struct SGResonanceAnalyzer { } } - if (rapidity_gap) { + if (rapidityGap) { if (trackgapC > 0 && trackgapA == 0 && trackextra == 0) { - for (auto& [t0, t1] : combinations(tracks, tracks)) { + for (const auto& [t0, t1] : combinations(tracks, tracks)) { if (!trackselector(t0, parameters) || !trackselector(t1, parameters)) continue; if (phi && selectionPIDKaon1(t0) && selectionPIDKaon1(t1)) { @@ -605,7 +700,7 @@ struct SGResonanceAnalyzer { } } } - for (auto& [t0, t1] : combinations(o2::soa::CombinationsFullIndexPolicy(tracks, tracks))) { + for (const auto& [t0, t1] : combinations(o2::soa::CombinationsFullIndexPolicy(tracks, tracks))) { if (!trackselector(t0, parameters) || !trackselector(t1, parameters)) continue; if (t0.globalIndex() == t1.globalIndex()) @@ -643,7 +738,7 @@ struct SGResonanceAnalyzer { } if (trackgapC == 0 && trackgapA > 0 && trackextra == 0) { - for (auto& [t0, t1] : combinations(tracks, tracks)) { + for (const auto& [t0, t1] : combinations(tracks, tracks)) { if (!trackselector(t0, parameters) || !trackselector(t1, parameters)) continue; if (phi && selectionPIDKaon1(t0) && selectionPIDKaon1(t1)) { @@ -676,7 +771,7 @@ struct SGResonanceAnalyzer { } } } - for (auto& [t0, t1] : combinations(o2::soa::CombinationsFullIndexPolicy(tracks, tracks))) { + for (const auto& [t0, t1] : combinations(o2::soa::CombinationsFullIndexPolicy(tracks, tracks))) { if (!trackselector(t0, parameters) || !trackselector(t1, parameters)) continue; if (t0.globalIndex() == t1.globalIndex()) @@ -713,7 +808,7 @@ struct SGResonanceAnalyzer { } } if (trackDG > 0 && trackextraDG == 0) { - for (auto& [t0, t1] : combinations(tracks, tracks)) { + for (const auto& [t0, t1] : combinations(tracks, tracks)) { if (!trackselector(t0, parameters) || !trackselector(t1, parameters)) continue; if (phi && selectionPIDKaon1(t0) && selectionPIDKaon1(t1)) { @@ -746,7 +841,7 @@ struct SGResonanceAnalyzer { } } } - for (auto& [t0, t1] : combinations(o2::soa::CombinationsFullIndexPolicy(tracks, tracks))) { + for (const auto& [t0, t1] : combinations(o2::soa::CombinationsFullIndexPolicy(tracks, tracks))) { if (!trackselector(t0, parameters) || !trackselector(t1, parameters)) continue; if (t0.globalIndex() == t1.globalIndex()) @@ -784,7 +879,7 @@ struct SGResonanceAnalyzer { } } - for (auto& [t0, t1] : combinations(tracks, tracks)) { + for (const auto& [t0, t1] : combinations(tracks, tracks)) { if (!trackselector(t0, parameters) || !trackselector(t1, parameters)) continue; @@ -847,13 +942,13 @@ struct SGResonanceAnalyzer { } } } - for (auto& [t0, t1] : combinations(o2::soa::CombinationsFullIndexPolicy(tracks, tracks))) { + for (const auto& [t0, t1] : combinations(o2::soa::CombinationsFullIndexPolicy(tracks, tracks))) { if (!trackselector(t0, parameters) || !trackselector(t1, parameters)) continue; if (t0.globalIndex() == t1.globalIndex()) continue; - if (rho && selectionPIDProton(t0, use_tof, nsigmatpc_cut, nsigmatof_cut) && selectionPIDPion1(t1)) { - v0.SetXYZM(t0.px(), t0.py(), t0.pz(), mproton); + if (rho && selectionPIDProton(t0, useTof, nsigmaTpcCut, nsigmaTofCut) && selectionPIDPion1(t1)) { + v0.SetXYZM(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassProton); v1.SetXYZM(t1.px(), t1.py(), t1.pz(), o2::constants::physics::MassPionCharged); v01 = v0 + v1; // Opposite sign pairs @@ -881,6 +976,8 @@ struct SGResonanceAnalyzer { } } if (kstar && selectionPIDKaon1(t0) && selectionPIDPion1(t1)) { + if (kaoncut && t0.tpcNSigmaPi() < pionNsigmaCut) + continue; v0.SetXYZM(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassKaonCharged); v1.SetXYZM(t1.px(), t1.py(), t1.pz(), o2::constants::physics::MassPionCharged); v01 = v0 + v1; @@ -938,13 +1035,12 @@ struct SGResonanceAnalyzer { } if (fourpion) { if (gapSide == 2 && mult2 == 4) { - - ROOT::Math::PtEtaPhiMVector pair1, pair2, pair3, pair4; - if (onlyPionTracks_p.size() == 2 && onlyPionTracks_n.size() == 2) { - ROOT::Math::PtEtaPhiMVector k1 = onlyPionTracks_p.at(0); - ROOT::Math::PtEtaPhiMVector k2 = onlyPionTracks_p.at(1); - ROOT::Math::PtEtaPhiMVector k3 = onlyPionTracks_n.at(0); - ROOT::Math::PtEtaPhiMVector k4 = onlyPionTracks_n.at(1); + TLorentzVector pair1, pair2, pair3, pair4; + if (onlyPionTracksp.size() == 2 && onlyPionTracksn.size() == 2) { + TLorentzVector k1 = onlyPionTracksp.at(0); + TLorentzVector k2 = onlyPionTracksp.at(1); + TLorentzVector k3 = onlyPionTracksn.at(0); + TLorentzVector k4 = onlyPionTracksn.at(1); phiv = k1 + k2 + k3 + k4; pair1 = k1 + k3; pair2 = k2 + k4; @@ -953,53 +1049,53 @@ struct SGResonanceAnalyzer { registry.fill(HIST("os_pppp_pT_2"), phiv.M(), phiv.Pt(), phiv.Rapidity()); registry.fill(HIST("os_pp_vs_pp_mass"), pair1.M(), pair2.M()); registry.fill(HIST("os_pp_vs_pp_pt"), pair1.Pt(), pair2.Pt()); - auto costhetaPair = CosThetaCollinsSoperFrame(pair1, pair2, phiv); - auto phiPair = 1. * TMath::Pi() + PhiCollinsSoperFrame(pair1, pair2, phiv); + auto costhetaPair = cosThetaCollinsSoperFrame(pair1, pair2, phiv); + auto phiPair = 1. * o2::constants::math::PI + phiCollinsSoperFrame(pair1, pair2, phiv); registry.fill(HIST("phi_dis"), phiPair); registry.fill(HIST("costheta_dis"), costhetaPair); registry.fill(HIST("costheta_vs_phi"), costhetaPair, phiPair); registry.fill(HIST("os_pp_vs_pp_mass1"), pair3.M(), pair4.M()); registry.fill(HIST("os_pp_vs_pp_pt1"), pair3.Pt(), pair4.Pt()); - auto costhetaPair1 = CosThetaCollinsSoperFrame(pair3, pair4, phiv); - auto phiPair1 = 1. * TMath::Pi() + PhiCollinsSoperFrame(pair3, pair4, phiv); + auto costhetaPair1 = cosThetaCollinsSoperFrame(pair3, pair4, phiv); + auto phiPair1 = 1. * o2::constants::math::PI + phiCollinsSoperFrame(pair3, pair4, phiv); registry.fill(HIST("phi_dis1"), phiPair1); registry.fill(HIST("costheta_dis1"), costhetaPair1); registry.fill(HIST("costheta_vs_phi1"), costhetaPair1, phiPair1); } - if (onlyPionTracks_p.size() != 2 && onlyPionTracks_n.size() != 2) { - if (onlyPionTracks_p.size() + onlyPionTracks_n.size() != 4) + if (onlyPionTracksp.size() != 2 && onlyPionTracksn.size() != 2) { + if (onlyPionTracksp.size() + onlyPionTracksn.size() != 4) return; - ROOT::Math::PtEtaPhiMVector l1 = onlyPionTracks_pm.at(0); - ROOT::Math::PtEtaPhiMVector l2 = onlyPionTracks_pm.at(1); - ROOT::Math::PtEtaPhiMVector l3 = onlyPionTracks_pm.at(2); - ROOT::Math::PtEtaPhiMVector l4 = onlyPionTracks_pm.at(3); + TLorentzVector l1 = onlyPionTrackspm.at(0); + TLorentzVector l2 = onlyPionTrackspm.at(1); + TLorentzVector l3 = onlyPionTrackspm.at(2); + TLorentzVector l4 = onlyPionTrackspm.at(3); phiv1 = l1 + l2 + l3 + l4; registry.fill(HIST("os_pppp_pT_2_ls"), phiv1.M(), phiv1.Pt(), phiv1.Rapidity()); } } } } - PROCESS_SWITCH(SGResonanceAnalyzer, process, "Process unlike event", false); + PROCESS_SWITCH(SginclusivePhiKstarSD, process, "Process unlike event", false); using UDCollisionsFull1 = soa::Join; // SliceCache cache; - Partition posTracks = aod::udtrack::sign > 0; - Partition negTracks = aod::udtrack::sign < 0; + Partition posTracks = aod::udtrack::sign > 0; + Partition negTracks = aod::udtrack::sign < 0; ConfigurableAxis axisVertex{"axisVertex", {10, -10, 10}, "vertex axis for bin"}; ConfigurableAxis axisMultiplicityClass{"axisMultiplicityClass", {10, 0, 100}, "multiplicity percentile for bin"}; using BinningTypeVertexContributor = ColumnBinningPolicy; - void mixprocess(UDCollisionsFull1 const& collisions, udtracksfull const& /*track*/) + void mixprocess(UDCollisionsFull1 const& collisions, UDtracksfull const& /*track*/) { TLorentzVector v0; TLorentzVector v1; TLorentzVector v01; - float FIT_cut[5] = {FV0_cut, FT0A_cut, FT0C_cut, FDDA_cut, FDDC_cut}; - std::vector parameters = {PV_cut, dcaZ_cut, dcaXY_cut, tpcChi2_cut, tpcNClsFindable_cut, itsChi2_cut, eta_cut, pt_cut}; + float fitCut[5] = {fv0Cut, ft0aCut, ft0cCut, fddaCut, fddcCut}; + std::vector parameters = {pvCut, dcazCut, dcaxyCut, tpcChi2Cut, tpcNClsFindableCut, itsChi2Cut, etaCut, ptCut}; BinningTypeVertexContributor binningOnPositions{{axisVertex, axisMultiplicityClass}, true}; for (auto const& [collision1, collision2] : o2::soa::selfCombinations(binningOnPositions, cfgNoMixedEvents, -1, collisions, collisions)) { - int truegapSide1 = sgSelector.trueGap(collision1, FIT_cut[0], FIT_cut[1], FIT_cut[2], ZDC_cut); - int truegapSide2 = sgSelector.trueGap(collision2, FIT_cut[0], FIT_cut[1], FIT_cut[2], ZDC_cut); + int truegapSide1 = sgSelector.trueGap(collision1, fitCut[0], fitCut[1], fitCut[2], zdcCut); + int truegapSide2 = sgSelector.trueGap(collision2, fitCut[0], fitCut[1], fitCut[2], zdcCut); if (truegapSide1 != truegapSide2) continue; if (truegapSide1 == -1) @@ -1007,7 +1103,7 @@ struct SGResonanceAnalyzer { auto posThisColl = posTracks->sliceByCached(aod::udtrack::udCollisionId, collision1.globalIndex(), cache); auto negThisColl = negTracks->sliceByCached(aod::udtrack::udCollisionId, collision2.globalIndex(), cache); // for (auto& [track1, track2] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(posThisColl, negThisColl))) { - for (auto& [track1, track2] : o2::soa::combinations(posThisColl, negThisColl)) { + for (const auto& [track1, track2] : o2::soa::combinations(posThisColl, negThisColl)) { if (!trackselector(track1, parameters) || !trackselector(track2, parameters)) continue; if (selectionPIDKaon1(track1) && selectionPIDKaon1(track2)) { @@ -1028,7 +1124,7 @@ struct SGResonanceAnalyzer { } } } - for (auto& [track1, track2] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(posThisColl, negThisColl))) { + for (const auto& [track1, track2] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(posThisColl, negThisColl))) { if (!trackselector(track1, parameters) || !trackselector(track2, parameters)) continue; if (track1.globalIndex() == track2.globalIndex()) @@ -1053,11 +1149,401 @@ struct SGResonanceAnalyzer { } } } - PROCESS_SWITCH(SGResonanceAnalyzer, mixprocess, "Process Mixed event", false); + PROCESS_SWITCH(SginclusivePhiKstarSD, mixprocess, "Process Mixed event", false); + + // define abbreviations , aod::UDCollisions_001, + using CCs = soa::Join; + using CC = CCs::iterator; + // using TCs = soa::Join; + using TCs = soa::Join; + using TC = TCs::iterator; + + PresliceUnsorted partPerMcCollision = aod::udmcparticle::udMcCollisionId; + PresliceUnsorted colPerMcCollision = aod::udcollision::udMcCollisionId; + PresliceUnsorted trackPerMcParticle = aod::udmctracklabel::udMcParticleId; + + void processMCTruth(aod::UDMcCollisions const& mccollisions, CCs const& collisions, aod::UDMcParticles const& McParts, TCs const& tracks) + { + // number of McCollisions in DF + if (verbosity > 0) { + LOGF(info, "Number of MC collisions %d", mccollisions.size()); + } + TLorentzVector v0; + TLorentzVector v1; + TLorentzVector v01; + TLorentzVector vkstar; + TLorentzVector vphi; + + // loop over all generated collisions + for (const auto& mccollision : mccollisions) { + registry.get(HIST("MC/Stat"))->Fill(0., 1.); + // get reconstructed collision which belongs to mccollision + auto colSlice = collisions.sliceBy(colPerMcCollision, mccollision.globalIndex()); + registry.get(HIST("MC/recCols"))->Fill(colSlice.size(), 1.); + + // get McParticles which belong to mccollision + auto partSlice = McParts.sliceBy(partPerMcCollision, mccollision.globalIndex()); + registry.get(HIST("MC/nParts"))->Fill(partSlice.size(), 1.); + if (verbosity > 0) { + LOGF(info, "Number of McParts %d", partSlice.size()); + } + for (const auto& [tr1, tr2] : combinations(partSlice, partSlice)) { + if ((tr1.pdgCode() == kKPlus && tr2.pdgCode() == kPiMinus) || (tr1.pdgCode() == kKMinus && tr2.pdgCode() == kPiPlus) || (tr1.pdgCode() == kPiPlus && tr2.pdgCode() == kKMinus) || (tr1.pdgCode() == kPiMinus && tr2.pdgCode() == kKPlus)) { + if (std::abs(tr1.pdgCode()) == kKPlus) { + v0.SetXYZM(tr1.px(), tr1.py(), tr1.pz(), o2::constants::physics::MassKaonCharged); + v1.SetXYZM(tr2.px(), tr2.py(), tr2.pz(), o2::constants::physics::MassPionCharged); + } else { + v0.SetXYZM(tr1.px(), tr1.py(), tr1.pz(), o2::constants::physics::MassPionCharged); + v1.SetXYZM(tr2.px(), tr2.py(), tr2.pz(), o2::constants::physics::MassKaonCharged); + } + if (!tr1.isPhysicalPrimary() || !tr2.isPhysicalPrimary()) + continue; + v01 = v0 + v1; + if (tr1.globalIndex() + 1 != tr2.globalIndex()) { + registry.get(HIST("MC/genM_1_k"))->Fill(v01.M(), 1.); + } + if (std::abs(tr1.globalIndex() - tr2.globalIndex()) != 1) + continue; + bool flag = false; + bool flag1 = false; + if (tr1.has_mothers() && tr2.has_mothers()) { + for (const auto& mother : tr1.mothers_as()) { + if (std::abs(mother.pdgCode()) == o2::constants::physics::Pdg::kK0Star892) { + vkstar.SetXYZM(mother.px(), mother.py(), mother.pz(), o2::constants::physics::MassK0Star892); + registry.get(HIST("MC/accMPtRap_kstar_G"))->Fill(vkstar.M(), vkstar.Pt(), vkstar.Rapidity(), 1.); + flag = true; + } + } + for (const auto& mother1 : tr2.mothers_as()) { + if (std::abs(mother1.pdgCode()) == o2::constants::physics::Pdg::kK0Star892) { + flag1 = true; + } + } + } + if (flag && flag1) { + registry.get(HIST("MC/genRap_k"))->Fill(v01.Rapidity(), 1.); + registry.get(HIST("MC/genMPt_k"))->Fill(v01.M(), v01.Pt(), 1.); + registry.get(HIST("MC/genM_k"))->Fill(v01.M(), 1.); + if (std::abs(v0.Eta()) < 0.8 && std::abs(v1.Eta()) < 0.8 && v0.Pt() > 0.15 && v1.Pt() > 0.15) { + registry.get(HIST("MC/accRap_k"))->Fill(v01.Rapidity(), 1.); + registry.get(HIST("MC/accMPt_k"))->Fill(v01.M(), v01.Pt(), 1.); + registry.get(HIST("MC/accM_k"))->Fill(v01.M(), 1.); + registry.get(HIST("MC/accMPtRap_k"))->Fill(v01.M(), v01.Pt(), v01.Rapidity(), 1.); + } + } + } + if (std::abs(tr1.pdgCode()) != kKPlus || std::abs(tr2.pdgCode()) != kKPlus) + continue; + v0.SetXYZM(tr1.px(), tr1.py(), tr1.pz(), o2::constants::physics::MassKaonCharged); + v1.SetXYZM(tr2.px(), tr2.py(), tr2.pz(), o2::constants::physics::MassKaonCharged); + if (tr1.pdgCode() == tr2.pdgCode()) + continue; + v01 = v0 + v1; + if (!tr1.isPhysicalPrimary() || !tr2.isPhysicalPrimary()) + continue; + if (tr1.globalIndex() + 1 != tr2.globalIndex()) { + registry.get(HIST("MC/genM_1"))->Fill(v01.M(), 1.); + } + if (std::abs(tr1.globalIndex() - tr2.globalIndex()) != 1) + continue; + bool flag = false; + bool flag1 = false; + if (tr1.has_mothers() && tr2.has_mothers()) { + for (const auto& mother : tr1.mothers_as()) { + if (std::abs(mother.pdgCode()) == o2::constants::physics::Pdg::kPhi) { + vphi.SetXYZM(mother.px(), mother.py(), mother.pz(), o2::constants::physics::MassPhi); + registry.get(HIST("MC/accMPtRap_phi_G"))->Fill(vphi.M(), vphi.Pt(), vphi.Rapidity(), 1.); + flag = true; + } + } + for (const auto& mother1 : tr2.mothers_as()) { + if (std::abs(mother1.pdgCode()) == o2::constants::physics::Pdg::kPhi) { + flag1 = true; + } + } + } + if (flag && flag1) { + registry.get(HIST("MC/genRap"))->Fill(v01.Rapidity(), 1.); + registry.get(HIST("MC/genMPt"))->Fill(v01.M(), v01.Pt(), 1.); + registry.get(HIST("MC/genM"))->Fill(v01.M(), 1.); + if (std::abs(v0.Eta()) < 0.8 && std::abs(v1.Eta()) < 0.8 && v0.Pt() > 0.15 && v1.Pt() > 0.15) { + registry.get(HIST("MC/accRap"))->Fill(v01.Rapidity(), 1.); + registry.get(HIST("MC/accMPt"))->Fill(v01.M(), v01.Pt(), 1.); + registry.get(HIST("MC/accM"))->Fill(v01.M(), 1.); + registry.get(HIST("MC/accMPtRap"))->Fill(v01.M(), v01.Pt(), v01.Rapidity(), 1.); + } + } + } + // compute the difference between generated and reconstructed particle momentum + for (const auto& McPart : partSlice) { + // get track which corresponds to McPart + auto trackSlice = tracks.sliceBy(trackPerMcParticle, McPart.globalIndex()); + registry.get(HIST("MC/nRecTracks"))->Fill(trackSlice.size(), 1.); + // compute momentum difference between MCTruth and Reconstruction + if (trackSlice.size() > 0) { + for (const auto& track : trackSlice) { + // std::cout<(HIST("MC/pDiff"))->Fill(pDiff, track.isPVContributor(), 1.); + if (verbosity > 0) { + LOGF(info, " PID: %d Generated: %d Process: %d PV contributor: %d dP: %f", McPart.pdgCode(), McPart.producedByGenerator(), McPart.getProcess(), track.isPVContributor(), pDiff); + } + } + } else { + registry.get(HIST("MC/pDiff"))->Fill(-5.9, -1, 1.); + if (verbosity > 0) { + LOGF(info, " PID: %d Generated: %d Process: %d PV contributor: No dP: nan", McPart.pdgCode(), McPart.producedByGenerator(), McPart.getProcess()); + } + } + } + if (verbosity > 0) { + LOGF(info, ""); + } + } + } + PROCESS_SWITCH(SginclusivePhiKstarSD, processMCTruth, "Process MC truth", true); + // ............................................................................................................... + void processReco(CC const& collision, TCs const& tracks, aod::UDMcCollisions const& /*mccollisions*/, aod::UDMcParticles const& /*McParts*/) + { + // number of McCollisions in DF + if (verbosity > 0) { + LOGF(info, "Number of MC collisions %d", collision.size()); + } + float fitCut[5] = {fv0Cut, ft0aCut, ft0cCut, fddaCut, fddcCut}; + std::vector parameters = {pvCut, dcazCut, dcaxyCut, tpcChi2Cut, tpcNClsFindableCut, itsChi2Cut, etaCut, ptCut}; + int truegapSide = sgSelector.trueGap(collision, fitCut[0], fitCut[1], fitCut[2], zdcCut); + registry.get(HIST("Reco/Stat"))->Fill(4.0, 1.); + Partition pvContributors = aod::udtrack::isPVContributor == true; + pvContributors.bindTable(tracks); + if (std::abs(collision.posZ()) > vzCut) + return; + if (std::abs(collision.occupancyInTime()) > occCut) + return; + registry.get(HIST("Reco/Stat"))->Fill(truegapSide, 1.); + if (truegapSide != gapsideMC) + return; + registry.get(HIST("Reco/nPVContributors"))->Fill(pvContributors.size(), 1.); + TLorentzVector vphi; + TLorentzVector vkstar; + TLorentzVector v0; + TLorentzVector vr0; + TLorentzVector vr1; + TLorentzVector vr01; + TLorentzVector vr0g; + TLorentzVector vr1g; + TLorentzVector vr01g; + int t1 = 0; + if (qa) { + if (truegapSide == 0) { + registry.fill(HIST("V0A_0"), collision.totalFV0AmplitudeA()); + registry.fill(HIST("FT0A_0"), collision.totalFT0AmplitudeA()); + registry.fill(HIST("FT0C_0"), collision.totalFT0AmplitudeC()); + registry.fill(HIST("ZDC_A_0"), collision.energyCommonZNA()); + registry.fill(HIST("ZDC_C_0"), collision.energyCommonZNC()); + } + if (truegapSide == 1) { + registry.fill(HIST("V0A_1"), collision.totalFV0AmplitudeA()); + registry.fill(HIST("FT0A_1"), collision.totalFT0AmplitudeA()); + registry.fill(HIST("FT0C_1"), collision.totalFT0AmplitudeC()); + registry.fill(HIST("ZDC_A_1"), collision.energyCommonZNA()); + registry.fill(HIST("ZDC_C_1"), collision.energyCommonZNC()); + } + } + for (const auto& tr1 : tracks) { + if (!tr1.has_udMcParticle()) + continue; + auto mcPart1 = tr1.udMcParticle(); + registry.get(HIST("Reco/tr_dcaz_1"))->Fill(tr1.dcaZ(), 1.); + registry.get(HIST("Reco/tr_dcaxy_1"))->Fill(tr1.dcaXY(), 1.); + registry.get(HIST("Reco/tr_chi2ncl_1"))->Fill(tr1.tpcChi2NCl(), 1.); + registry.get(HIST("Reco/tr_tpcnclfind_1"))->Fill(tr1.tpcNClsFindable(), 1.); + registry.get(HIST("Reco/tr_itsChi2NCl_1"))->Fill(tr1.itsChi2NCl(), 1.); + + if (!trackselector(tr1, parameters)) + continue; + + registry.get(HIST("Reco/tr_dcaz_2"))->Fill(tr1.dcaZ(), 1.); + registry.get(HIST("Reco/tr_dcaxy_2"))->Fill(tr1.dcaXY(), 1.); + registry.get(HIST("Reco/tr_chi2ncl_2"))->Fill(tr1.tpcChi2NCl(), 1.); + registry.get(HIST("Reco/tr_tpcnclfind_2"))->Fill(tr1.tpcNClsFindable(), 1.); + registry.get(HIST("Reco/tr_itsChi2NCl_2"))->Fill(tr1.itsChi2NCl(), 1.); + v0.SetXYZM(tr1.px(), tr1.py(), tr1.pz(), o2::constants::physics::MassPionCharged); + if (qa) { + registry.fill(HIST("tpc_dedx"), v0.P(), tr1.tpcSignal()); + registry.fill(HIST("tof_beta"), v0.P(), tr1.beta()); + registry.fill(HIST("tof_nsigma_kaon_f"), v0.Pt(), tr1.tofNSigmaKa()); + registry.fill(HIST("tof_nsigma_pion_f"), v0.Pt(), tr1.tofNSigmaPi()); + registry.fill(HIST("tpc_nsigma_kaon_f"), v0.Pt(), tr1.tpcNSigmaKa()); + registry.fill(HIST("tpc_nsigma_pion_f"), v0.Pt(), tr1.tpcNSigmaPi()); + if (selectionPIDKaon1(tr1)) { + registry.fill(HIST("tpc_dedx_kaon_1"), v0.P(), tr1.tpcSignal()); + registry.fill(HIST("tpc_nsigma_kaon"), v0.Pt(), tr1.tpcNSigmaKa()); + registry.fill(HIST("tof_nsigma_kaon"), v0.Pt(), tr1.tofNSigmaKa()); + registry.fill(HIST("tpc_tof_nsigma_kaon"), tr1.tpcNSigmaKa(), tr1.tofNSigmaKa()); + } + if (selectionPIDPion1(tr1)) { + registry.fill(HIST("tpc_dedx_pion_1"), v0.P(), tr1.tpcSignal()); + registry.fill(HIST("tpc_nsigma_pion"), v0.Pt(), tr1.tpcNSigmaPi()); + registry.fill(HIST("tof_nsigma_pion"), v0.Pt(), tr1.tofNSigmaPi()); + registry.fill(HIST("tpc_tof_nsigma_pion"), tr1.tpcNSigmaPi(), tr1.tofNSigmaPi()); + } + } + t1++; + vr0.SetXYZM(tr1.px(), tr1.py(), tr1.pz(), o2::constants::physics::MassKaonCharged); + registry.get(HIST("Reco/trpt"))->Fill(vr0.Pt(), 1.); + registry.get(HIST("Reco/treta_k"))->Fill(vr0.Eta(), 1.); + if (!selectionPIDKaon1(tr1)) + continue; + registry.get(HIST("Reco/trpt_k"))->Fill(vr0.Pt(), 1.); + int t2 = 0; + for (const auto& tr2 : tracks) { + if (!tr2.has_udMcParticle()) + continue; + if (!trackselector(tr2, parameters)) + continue; + t2++; + if (t2 > t1) { + if (!selectionPIDKaon1(tr2)) + continue; + vr1.SetXYZM(tr2.px(), tr2.py(), tr2.pz(), o2::constants::physics::MassKaonCharged); + auto mcPart2 = tr2.udMcParticle(); + if (std::abs(mcPart2.globalIndex() - mcPart1.globalIndex()) != 1) + continue; + if (std::abs(mcPart1.pdgCode()) != kKPlus || std::abs(mcPart2.pdgCode()) != kKPlus) + continue; + if (mcPart1.pdgCode() == mcPart2.pdgCode()) + continue; + if (!mcPart1.isPhysicalPrimary() || !mcPart2.isPhysicalPrimary()) + continue; + bool flag = false; + bool flag1 = false; + if (mcPart1.has_mothers() && mcPart2.has_mothers()) { + for (const auto& mother : mcPart1.mothers_as()) { + if (std::abs(mother.pdgCode()) == o2::constants::physics::Pdg::kPhi) { + vphi.SetXYZM(mother.px(), mother.py(), mother.pz(), o2::constants::physics::MassPhi); + registry.get(HIST("MC/accMPtRap_phi_T"))->Fill(vphi.M(), vphi.Pt(), vphi.Rapidity(), 1.); + flag = true; + } + } + for (const auto& mother1 : mcPart1.mothers_as()) { + if (std::abs(mother1.pdgCode()) == o2::constants::physics::Pdg::kPhi) { + flag1 = true; + } + } + } + if (flag && flag1) { + vr0g.SetXYZM(mcPart1.px(), mcPart1.py(), mcPart1.pz(), o2::constants::physics::MassKaonCharged); + vr1g.SetXYZM(mcPart2.px(), mcPart2.py(), mcPart2.pz(), o2::constants::physics::MassKaonCharged); + vr01g = vr0g + vr1g; + vr01 = vr0 + vr1; + registry.get(HIST("Reco/selRap"))->Fill(vr01.Rapidity(), 1.); + registry.get(HIST("Reco/selMPt"))->Fill(vr01.M(), vr01.Pt(), 1.); + registry.get(HIST("Reco/selMPtRap"))->Fill(vr01.M(), vr01.Pt(), vr01.Rapidity(), 1.); + registry.get(HIST("Reco/selPt"))->Fill(vr01.Pt(), 1.); + registry.get(HIST("Reco/selM"))->Fill(vr01.M(), 1.); + registry.get(HIST("Reco/selMPtRap_gen"))->Fill(vr01g.M(), vr01g.Pt(), vr01g.Rapidity(), 1.); + } + } + } + } + // KStar + for (const auto& [tr1, tr2] : combinations(o2::soa::CombinationsFullIndexPolicy(tracks, tracks))) { + if (!tr1.has_udMcParticle() || !tr2.has_udMcParticle()) + continue; + if (!selectionPIDPion1(tr1) || !selectionPIDKaon1(tr2)) + continue; + // if (tr1.index() == tr2.index()) + // continue; // We need to run (0,1), (1,0) pairs as well. but same id pairs are not needed. + auto mcPart1 = tr1.udMcParticle(); + auto mcPart2 = tr2.udMcParticle(); + if (std::abs(mcPart1.pdgCode()) != kPiPlus || std::abs(mcPart2.pdgCode()) != kKPlus) + continue; + if (!mcPart1.isPhysicalPrimary() || !mcPart2.isPhysicalPrimary()) + continue; + if (std::abs(mcPart2.globalIndex() - mcPart1.globalIndex()) != 1) + continue; + + if (tr1.sign() * tr2.sign() > 0) + continue; + + vr0.SetXYZM(tr1.px(), tr1.py(), tr1.pz(), o2::constants::physics::MassPionCharged); + vr1.SetXYZM(tr2.px(), tr2.py(), tr2.pz(), o2::constants::physics::MassKaonCharged); + vr0g.SetXYZM(mcPart1.px(), mcPart1.py(), mcPart1.pz(), o2::constants::physics::MassPionCharged); + vr1g.SetXYZM(mcPart2.px(), mcPart2.py(), mcPart2.pz(), o2::constants::physics::MassKaonCharged); + vr01g = vr0g + vr1g; + vr01 = vr0 + vr1; + if (!trackselector(tr1, parameters) || !trackselector(tr2, parameters)) { + registry.get(HIST("Reco/selM_k"))->Fill(vr01.M(), 1.); + } + if (trackselector(tr1, parameters) && trackselector(tr2, parameters)) { + bool flag = false; + bool flag1 = false; + if (mcPart1.has_mothers() && mcPart2.has_mothers()) { + for (const auto& mother : mcPart1.mothers_as()) { + if (std::abs(mother.pdgCode()) == o2::constants::physics::Pdg::kK0Star892) { + vkstar.SetXYZM(mother.px(), mother.py(), mother.pz(), o2::constants::physics::MassK0Star892); + registry.get(HIST("MC/accMPtRap_kstar_T"))->Fill(vkstar.M(), vkstar.Pt(), vkstar.Rapidity(), 1.); + flag = true; + } + } + for (const auto& mother1 : mcPart2.mothers_as()) { + if (std::abs(mother1.pdgCode()) == o2::constants::physics::Pdg::kK0Star892) { + flag1 = true; + } + } + } + if (flag && flag1) { + registry.get(HIST("Reco/selM_k_K"))->Fill(vr01.M(), 1.); + registry.get(HIST("Reco/selRap_k"))->Fill(vr01.Rapidity(), 1.); + registry.get(HIST("Reco/selMPt_k"))->Fill(vr01.M(), vr01.Pt(), 1.); + registry.get(HIST("Reco/selMPtRap_k"))->Fill(vr01.M(), vr01.Pt(), vr01.Rapidity(), 1.); + registry.get(HIST("Reco/selPt_k"))->Fill(vr01.Pt(), 1.); + // registry.get(HIST("Reco/selM_k"))->Fill(vr01_g.M(), 1.); + registry.get(HIST("Reco/selMPtRap_k_gen"))->Fill(vr01g.M(), vr01g.Pt(), vr01g.Rapidity(), 1.); + } + } + } + registry.get(HIST("Reco/nTracks"))->Fill(t1, 1.); + // now access the McTruth information + // get McCollision belonging to collision + if (collision.has_udMcCollision()) { + // auto mccollision = collision.udMcCollision(); + registry.get(HIST("Reco/Stat"))->Fill(3., 1.); + } else { + if (verbosity > 0) { + LOGF(info, "This collision has no associated McCollision"); + } + } + // compute the difference between generated and reconstructed momentum + for (const auto& track : tracks) { + // is there an associated McParticle? + if (track.has_udMcParticle()) { + auto pTrack = std::sqrt(track.px() * track.px() + track.py() * track.py() + track.pz() * track.pz()); + auto mcPart = track.udMcParticle(); + auto pPart = std::sqrt(mcPart.px() * mcPart.px() + mcPart.py() * mcPart.py() + mcPart.pz() * mcPart.pz()); + auto pDiff = pTrack - pPart; + registry.get(HIST("Reco/pDiff"))->Fill(pDiff, track.isPVContributor(), 1.); + if (verbosity > 0) { + LOGF(info, " PID: %d Generated: %d Process: %d PV contributor: %d dP: %f", mcPart.pdgCode(), mcPart.producedByGenerator(), mcPart.getProcess(), track.isPVContributor(), pDiff); + } + } else { + registry.get(HIST("Reco/pDiff"))->Fill(-5.9, -1, 1.); + if (verbosity > 0) { + LOGF(info, " This track has no associated McParticle"); + } + } + } + if (verbosity > 0) { + LOGF(info, ""); + } + } + PROCESS_SWITCH(SginclusivePhiKstarSD, processReco, "Process reconstructed data", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc)}; + adaptAnalysisTask(cfgc)}; } From e002fdf1d06261b81d7ff6253dfaed560eb7cf5b Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Mon, 17 Mar 2025 21:26:23 +0100 Subject: [PATCH 0731/1650] [PWGCF] jFlucEfficiencyTask - Add run2 event cut option (#10543) --- PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx b/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx index 41403ff443c..129635cda75 100644 --- a/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx +++ b/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx @@ -66,6 +66,8 @@ struct JFlucEfficiencyTask { Configurable cfgEvtPileupRejection{"cfgEvtPileupRejection", true, "Evt sel: apply pileup rejection"}; Configurable cfgEvtNoITSROBorderCut{"cfgEvtNoITSROBorderCut", false, "Evt sel: apply NoITSRO border cut"}; Configurable cfgEvtCollInTimeRangeStandard{"cfgEvtCollInTimeRangeStandard", true, "Evt sel: apply NoCollInTimeRangeStandard"}; + Configurable cfgEvtRun2AliEventCuts{"cfgEvtRun2AliEventCuts", true, "Evt sel: apply Run2 Ali event cuts"}; + Configurable cfgEvtRun2INELgtZERO{"cfgEvtRun2INELgtZERO", false, "Evt sel: apply Run2 INEL>0 event cuts"}; } EventCuts; // Configurable for track selection @@ -125,8 +127,11 @@ struct JFlucEfficiencyTask { if (debugMode) { LOGF(info, "Initializing JFlucEfficiencyTask"); } - - colCuts.setCuts(EventCuts.cfgEvtZvtx, EventCuts.cfgEvtTriggerCheck, EventCuts.cfgEvtOfflineCheck, /*checkRun3*/ true, /*triggerTVXsel*/ false, EventCuts.cfgEvtOccupancyInTimeRangeMax, EventCuts.cfgEvtOccupancyInTimeRangeMin); + if (!doprocessMCRun2 && !doprocessDataRun2) { + colCuts.setCuts(EventCuts.cfgEvtZvtx, EventCuts.cfgEvtTriggerCheck, EventCuts.cfgEvtOfflineCheck, /*checkRun3*/ true, /*triggerTVXsel*/ false, EventCuts.cfgEvtOccupancyInTimeRangeMax, EventCuts.cfgEvtOccupancyInTimeRangeMin); + } else { + colCuts.setCuts(EventCuts.cfgEvtZvtx, EventCuts.cfgEvtTriggerCheck, EventCuts.cfgEvtOfflineCheck, false); + } colCuts.init(®istry); colCuts.setTriggerTVX(EventCuts.cfgEvtTriggerTVXSel); colCuts.setApplyTFBorderCut(EventCuts.cfgEvtTFBorderCut); @@ -135,6 +140,8 @@ struct JFlucEfficiencyTask { colCuts.setApplyPileupRejection(EventCuts.cfgEvtPileupRejection); colCuts.setApplyNoITSROBorderCut(EventCuts.cfgEvtNoITSROBorderCut); colCuts.setApplyCollInTimeRangeStandard(EventCuts.cfgEvtCollInTimeRangeStandard); + colCuts.setApplyRun2AliEventCuts(EventCuts.cfgEvtRun2AliEventCuts); + colCuts.setApplyRun2INELgtZERO(EventCuts.cfgEvtRun2INELgtZERO); colCuts.printCuts(); if (doprocessDerivedMC || doprocessMC) { From 27a954061a06b47190d80c347bbc6e29a5e65f64 Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Tue, 18 Mar 2025 04:30:39 +0800 Subject: [PATCH 0732/1650] [PWGCF] use improved MC parameters (#10538) --- PWGCF/Flow/Tasks/flowTask.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowTask.cxx b/PWGCF/Flow/Tasks/flowTask.cxx index 109758bf3af..9cd332be5c5 100644 --- a/PWGCF/Flow/Tasks/flowTask.cxx +++ b/PWGCF/Flow/Tasks/flowTask.cxx @@ -432,8 +432,8 @@ struct FlowTask { hFindPtBin = new TH1D("hFindPtBin", "hFindPtBin", pTEffBins.size() - 1, &pTEffBins[0]); funcEff.resize(pTEffBins.size() - 1); // LHC24g3 Eff - std::vector f1p0 = {0.7217476707, 0.7384792571, 0.7542625668, 0.7640680200, 0.7701951667, 0.7755299053, 0.7805901710, 0.7849446786, 0.7957356586, 0.8113039262, 0.8211968966, 0.8280558878, 0.8329342135}; - std::vector f1p1 = {-2.169488e-05, -2.191913e-05, -2.295484e-05, -2.556538e-05, -2.754463e-05, -2.816832e-05, -2.846502e-05, -2.843857e-05, -2.705974e-05, -2.477018e-05, -2.321730e-05, -2.203315e-05, -2.109474e-05}; + std::vector f1p0 = {0.6003720411, 0.6152630970, 0.6288860646, 0.6360694031, 0.6409494798, 0.6450540203, 0.6482117301, 0.6512592056, 0.6640008690, 0.6862631416, 0.7005738691, 0.7106567432, 0.7170728333}; + std::vector f1p1 = {-1.007592e-05, -8.932635e-06, -9.114538e-06, -1.054818e-05, -1.220212e-05, -1.312304e-05, -1.376433e-05, -1.412813e-05, -1.289562e-05, -1.050065e-05, -8.635725e-06, -7.380821e-06, -6.201250e-06}; for (uint ifunc = 0; ifunc < pTEffBins.size() - 1; ifunc++) { funcEff[ifunc] = new TF1(Form("funcEff%i", ifunc), "[0]+[1]*x", 0, 3000); funcEff[ifunc]->SetParameters(f1p0[ifunc], f1p1[ifunc]); From 04c9ab0998a93f8f621db00d7bce8941e206cefd Mon Sep 17 00:00:00 2001 From: Victor Gonzalez Date: Mon, 17 Mar 2025 22:05:06 +0100 Subject: [PATCH 0733/1650] [PWGCF] DptDpt - Efficient access to the pT ranges of interest (#10544) Co-authored-by: Victor --- .../Tasks/dptDptEfficiencyAndQc.cxx | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx index f543b4673f9..62ace1ab9ad 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx @@ -588,6 +588,7 @@ struct QAExtraDataCollectingEngine { std::vector>>> fhPhiPhiA{2, {nsp, {nsp, nullptr}}}; std::vector>>> fhEtaEtaA{2, {nsp, {nsp, nullptr}}}; TAxis ptAxis{analysis::dptdptfilter::ptbins, analysis::dptdptfilter::ptlow, analysis::dptdptfilter::ptup}; + std::vector ptOfInterestBinMap{analysis::dptdptfilter::ptbins + 1, -1}; std::vector>>> fhInSectorDeltaPhiVsPhiPhiPerPtBinA{2, {nsp, {nsp, nullptr}}}; std::vector>>> fhInSectorDeltaPhiVsEtaEtaPerPtBinA{2, {nsp, {nsp, nullptr}}}; @@ -604,6 +605,15 @@ struct QAExtraDataCollectingEngine { AxisSpec etaAxis = {etabins, etalow, etaup, "#eta"}; AxisSpec ptOfInterestAxis = {static_cast(ptBinsOfInterest.size()), 0.5f, static_cast(ptBinsOfInterest.size()) + 0.5f, "#it{p}_{T} (GeV/#it{c})"}; + /* the mapping between pT bins of interest and internal representation, and histogram title to keep track of them offline */ + std::string hPtRangesOfInterestTitle; + for (size_t ix = 0; ix < ptBinsOfInterest.size(); ++ix) { + TString ptRange = TString::Format("%s%.2f-%.2f", ix == 0 ? "" : ",", ptAxis.GetBinLowEdge(ptBinsOfInterest[ix]), ptAxis.GetBinUpEdge(ptBinsOfInterest[ix])); + /* remember our internal axis starts in 0.5 value, i.e. its first central value is 1 */ + ptOfInterestBinMap[ptBinsOfInterest[ix]] = ix + 1; + hPtRangesOfInterestTitle += ptRange.Data(); + } + /* the reconstructed and generated levels histograms */ std::string recogen = (kindOfData == kReco) ? "Reco" : "Gen"; for (uint isp = 0; isp < nsp; ++isp) { @@ -614,10 +624,11 @@ struct QAExtraDataCollectingEngine { HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTH2F, {etaAxis, etaAxis}); /* first resize them to the actual configured size */ fhInSectorDeltaPhiVsPhiPhiPerPtBinA[kindOfData][isp][jsp] = ADDHISTOGRAM(THnSparse, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("DeltaPhiVsPhiPhiPt_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), - HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTHnSparseF, {phiSectorAxis, phiSectorAxis, deltaPhiInSectorAxis, ptOfInterestAxis, ptOfInterestAxis}); - // TODO: after checking the consumed execution memory - // fhInSectorDeltaPhiVsEtaEtaPerPtBinA[kindOfData][isp][jsp] = ADDHISTOGRAM(THnSparse, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("DeltaPhiVsEtaEtaPt_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), - // HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTHnSparseF, {etaAxis, etaAxis, deltaPhiInSectorAxis, ptOfInterestAxis, ptOfInterestAxis}); + HTITLESTRING("%s%s pairs, #it{p}_{T}: %s", tnames[isp].c_str(), tnames[jsp].c_str(), hPtRangesOfInterestTitle.c_str()), + kTHnSparseF, {phiSectorAxis, phiSectorAxis, deltaPhiInSectorAxis, ptOfInterestAxis, ptOfInterestAxis}); + fhInSectorDeltaPhiVsEtaEtaPerPtBinA[kindOfData][isp][jsp] = ADDHISTOGRAM(THnSparse, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("DeltaPhiVsEtaEtaPt_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), + HTITLESTRING("%s%s pairs, #it{p}_{T}: %s", tnames[isp].c_str(), tnames[jsp].c_str(), hPtRangesOfInterestTitle.c_str()), + kTHnSparseF, {etaAxis, etaAxis, deltaPhiInSectorAxis, ptOfInterestAxis, ptOfInterestAxis}); } } } @@ -631,13 +642,7 @@ struct QAExtraDataCollectingEngine { /* we should only receive accepted tracks */ for (auto const& track1 : tracks1) { auto binForPt = [&](auto const& track) { - int ptBin = ptAxis.FindFixBin(track.pt()); - if (std::find(ptBinsOfInterest.begin(), ptBinsOfInterest.end(), ptBin) != ptBinsOfInterest.end()) { - /* of interest */ - return ptBin; - } else { - return -1; - } + return ptOfInterestBinMap[ptAxis.FindFixBin(track.pt())]; }; int ptBin1 = binForPt(track1); if (ptBin1 > 0) { @@ -657,10 +662,9 @@ struct QAExtraDataCollectingEngine { float inTpcSectorPhi2 = std::fmod(track2.phi(), kTpcPhiSectorWidth); float deltaPhi = inTpcSectorPhi1 - inTpcSectorPhi2; double values[] = {inTpcSectorPhi1, inTpcSectorPhi2, deltaPhi, static_cast(ptBin1), static_cast(ptBin2)}; - fhInSectorDeltaPhiVsPhiPhiPerPtBinA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(values); - // TODO: after checking the consumed execution memory - // fhInSectorDeltaPhiVsEtaEtaPerPtBinA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(track1.eta(), track2.eta(), deltaPhi); + values[0] = track1.eta(), values[1] = track2.eta(); + fhInSectorDeltaPhiVsEtaEtaPerPtBinA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(values); } } } @@ -1014,6 +1018,7 @@ struct DptDptEfficiencyAndQc { !doprocessGeneratorLevelNotStored && !doprocessExtraGeneratorLevelNotStored && !doprocessReconstructedNotStored && + !doprocessExtraReconstructedNotStored && !doprocessReconstructedNotStoredPID && !doprocessReconstructedNotStoredPIDExtra) { return; From 53f50485e931c5f6d2cd7d1e16523f6a0f83e4e4 Mon Sep 17 00:00:00 2001 From: Chiara Pinto <48326672+chiarapinto@users.noreply.github.com> Date: Mon, 17 Mar 2025 22:28:53 +0100 Subject: [PATCH 0734/1650] [PWGLF] added efficiency for syst variations (#10535) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Nuspex/antinucleiInJets.cxx | 148 +++++++++++++++++++++++- 1 file changed, 142 insertions(+), 6 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx index 40e7f7c1be3..aa7715f67fb 100644 --- a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx +++ b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx @@ -196,12 +196,6 @@ struct AntinucleiInJets { // helium-3 registryData.add("helium3_jet_tpc", "helium3_jet_tpc", HistType::kTH2F, {{nbins, min * 3, max * 3, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}}); registryData.add("helium3_ue_tpc", "helium3_ue_tpc", HistType::kTH2F, {{nbins, min * 3, max * 3, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}}); - - // systematic variations - registryData.add("antiproton_tpc_syst", "antiproton_tpc_syst", HistType::kTHnSparseF, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}, {10, 0, 10, "systematic uncertainty"}}); - registryData.add("antiproton_tof_syst", "antiproton_tof_syst", HistType::kTHnSparseF, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TOF}"}, {10, 0, 10, "systematic uncertainty"}}); - registryData.add("antideuteron_tpc_syst", "antideuteron_tpc_syst", HistType::kTHnSparseF, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}, {10, 0, 10, "systematic uncertainty"}}); - registryData.add("antideuteron_tof_syst", "antideuteron_tof_syst", HistType::kTHnSparseF, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TOF}"}, {10, 0, 10, "systematic uncertainty"}}); } // monte carlo histograms @@ -257,6 +251,24 @@ struct AntinucleiInJets { // detector response matrix registryMC.add("detectorResponseMatrix", "detectorResponseMatrix", HistType::kTH2F, {{1000, 0.0, 100.0, "#it{p}_{T}^{gen} (GeV/#it{c})"}, {2000, -20.0, 20.0, "#it{p}_{T}^{gen} - #it{p}_{T}^{rec} (GeV/#it{c})"}}); } + + // systematic uncertainties + if (doprocessSystematicsData) { + registryData.add("antiproton_tpc_syst", "antiproton_tpc_syst", HistType::kTHnSparseF, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}, {10, 0, 10, "systematic uncertainty"}}); + registryData.add("antiproton_tof_syst", "antiproton_tof_syst", HistType::kTHnSparseF, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TOF}"}, {10, 0, 10, "systematic uncertainty"}}); + registryData.add("antideuteron_tpc_syst", "antideuteron_tpc_syst", HistType::kTHnSparseF, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}, {10, 0, 10, "systematic uncertainty"}}); + registryData.add("antideuteron_tof_syst", "antideuteron_tof_syst", HistType::kTHnSparseF, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TOF}"}, {10, 0, 10, "systematic uncertainty"}}); + } + + if (doprocessSystematicsEfficiency) { + registryMC.add("antiproton_incl_gen_syst", "antiproton_incl_gen_syst", HistType::kTHnSparseF, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {10, 0, 10, "systematic uncertainty"}}); + registryMC.add("antideuteron_incl_gen_syst", "antideuteron_incl_gen_syst", HistType::kTHnSparseF, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}, {10, 0, 10, "systematic uncertainty"}}); + registryMC.add("antiproton_incl_prim_syst", "antiproton_incl_prim_syst", HistType::kTHnSparseF, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {10, 0, 10, "systematic uncertainty"}}); + registryMC.add("antiproton_incl_rec_tpc_syst", "antiproton_incl_rec_tpc_syst", HistType::kTHnSparseF, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}, {10, 0, 10, "systematic uncertainty"}}); + registryMC.add("antiproton_incl_rec_tof_syst", "antiproton_incl_rec_tof_syst", HistType::kTHnSparseF, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TOF}"}, {10, 0, 10, "systematic uncertainty"}}); + registryMC.add("antideuteron_incl_rec_tpc_syst", "antideuteron_incl_rec_tpc_syst", HistType::kTHnSparseF, {{nbins, 2 * min, 2 * max, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}, {10, 0, 10, "systematic uncertainty"}}); + registryMC.add("antideuteron_incl_rec_tof_syst", "antideuteron_incl_rec_tof_syst", HistType::kTHnSparseF, {{nbins, 2 * min, 2 * max, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TOF}"}, {10, 0, 10, "systematic uncertainty"}}); + } } void getPerpendicularAxis(TVector3 p, TVector3& u, double sign) @@ -1312,6 +1324,130 @@ struct AntinucleiInJets { } } PROCESS_SWITCH(AntinucleiInJets, processSystematicsData, "Process Systematics", false); + + void processSystematicsEfficiency(SimCollisions const& collisions, MCTracks const& mcTracks, aod::McParticles const& mcParticles) + { + const int nSystematics = 10; + int itsNclustersSyst[nSystematics] = {5, 6, 5, 4, 5, 3, 5, 6, 3, 4}; + float tpcNcrossedRowsSyst[nSystematics] = {100, 85, 80, 110, 95, 90, 105, 95, 100, 105}; + float dcaxySyst[nSystematics] = {0.05, 0.07, 0.10, 0.03, 0.06, 0.15, 0.08, 0.04, 0.09, 0.10}; + float dcazSyst[nSystematics] = {0.1, 0.15, 0.3, 0.075, 0.12, 0.18, 0.2, 0.1, 0.15, 0.2}; + + for (const auto& collision : collisions) { + + if (!collision.sel8() || std::fabs(collision.posZ()) > zVtx) + continue; + + // generated + for (const auto& particle : mcParticles) { + + if (!particle.isPhysicalPrimary()) + continue; + + if (particle.eta() < minEta || particle.eta() > maxEta) + continue; + + switch (particle.pdgCode()) { + case kProtonBar: + registryMC.fill(HIST("antiproton_incl_gen_syst"), particle.pt()); + break; + case -o2::constants::physics::Pdg::kDeuteron: + registryMC.fill(HIST("antideuteron_incl_gen_syst"), particle.pt()); + break; + } + } + + // ITS pid using cluster size + o2::aod::ITSResponse itsResponse; + + // Reconstructed Tracks + for (auto const& track : mcTracks) { + + // Get MC Particle + if (!track.has_mcParticle()) + continue; + const auto particle = track.mcParticle(); + + // Variables + double nsigmaTPCPr = track.tpcNSigmaPr(); + double nsigmaTOFPr = track.tofNSigmaPr(); + double nsigmaTPCDe = track.tpcNSigmaDe(); + double nsigmaTOFDe = track.tofNSigmaDe(); + double dcaxy = track.dcaXY(); + double dcaz = track.dcaZ(); + + for (int i = 0; i < nSystematics; i++) { + + // Track Selection + if (requirePvContributor && !(track.isPVContributor())) + continue; + if (!track.hasITS()) + continue; + if (track.itsNCls() < itsNclustersSyst[i]) + continue; + if (!track.hasTPC()) + continue; + if (track.tpcNClsCrossedRows() < tpcNcrossedRowsSyst[i]) + continue; + if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < minTpcNcrossedRowsOverFindable) + continue; + if (track.tpcChi2NCl() > maxChiSquareTpc) + continue; + if (track.itsChi2NCl() > maxChiSquareIts) + continue; + if (track.eta() < minEta || track.eta() > maxEta) + continue; + if (track.pt() < minPt) + continue; + if (std::fabs(dcaxy) > dcaxySyst[i]) + continue; + if (std::fabs(dcaz) > dcazSyst[i]) + continue; + + // particle identification using the ITS cluster size + bool passedItsPidProt(false), passedItsPidDeut(false); + if (itsResponse.nSigmaITS(track) > nSigmaItsMin && itsResponse.nSigmaITS(track) < nSigmaItsMax) { + passedItsPidProt = true; + } + if (itsResponse.nSigmaITS(track) > nSigmaItsMin && itsResponse.nSigmaITS(track) < nSigmaItsMax) { + passedItsPidDeut = true; + } + if (!applyItsPid) { + passedItsPidProt = true; + passedItsPidDeut = true; + } + if (track.pt() > ptMaxItsPidProt) + passedItsPidProt = true; + if (track.pt() > ptMaxItsPidDeut) + passedItsPidDeut = true; + if (!particle.isPhysicalPrimary()) + continue; + + if (particle.pdgCode() == kProtonBar) + registryMC.fill(HIST("antiproton_incl_prim_syst"), track.pt(), i); + + // antiprotons + if (particle.pdgCode() == kProtonBar && passedItsPidProt) { + if (nsigmaTPCPr > minNsigmaTpc && nsigmaTPCPr < maxNsigmaTpc) { + registryMC.fill(HIST("antiproton_incl_rec_tpc_syst"), track.pt(), i); + if (track.hasTOF() && nsigmaTOFPr > minNsigmaTof && nsigmaTOFPr < maxNsigmaTof) + registryMC.fill(HIST("antiproton_incl_rec_tof_syst"), track.pt(), i); + } + } + + // antideuterons + if (particle.pdgCode() == -o2::constants::physics::Pdg::kDeuteron && passedItsPidDeut) { + if (nsigmaTPCDe > minNsigmaTpc && nsigmaTPCDe < maxNsigmaTpc) { + registryMC.fill(HIST("antideuteron_incl_rec_tpc_syst"), track.pt(), i); + if (track.hasTOF() && nsigmaTOFDe > minNsigmaTof && nsigmaTOFDe < maxNsigmaTof) + registryMC.fill(HIST("antideuteron_incl_rec_tof_syst"), track.pt(), i); + } + } + } + } + } + } + PROCESS_SWITCH(AntinucleiInJets, processSystematicsEfficiency, "process efficiency for systematics", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 436aee22943be4573d96579d1e2bc2a94b1a3068 Mon Sep 17 00:00:00 2001 From: Tanu Gahlaut <154991749+TGahlaut1@users.noreply.github.com> Date: Tue, 18 Mar 2025 04:38:04 +0530 Subject: [PATCH 0735/1650] [PWGCF] update changes in efficiency correction (#10545) --- PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx | 443 +++++++----------- 1 file changed, 163 insertions(+), 280 deletions(-) diff --git a/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx b/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx index ee045fdac6a..30179b402da 100644 --- a/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx @@ -72,10 +72,10 @@ struct MeanPtFlucId { Configurable cfgCutPrP1{"cfgCutPrP1", 0.9, "proton p cut-1"}; Configurable cfgCutPrP2{"cfgCutPrP2", 1.0, "proton p cut-2"}; Configurable cfgLoadEff{"cfgLoadEff", true, "Load efficiency"}; - Configurable cfgEffPtCh{"cfgEffPtCh", true, "Efficiency correction (pT) for charged particles"}; - Configurable cfgEffPtId{"cfgEffPtId", false, "Efficiency correction (pT) "}; - Configurable cfgEffPtYId{"cfgEffPtYId", false, "Efficiency correction (pT, rap) "}; - Configurable cfgEffPtEtaId{"cfgEffPtEtaId", true, "Efficiency correction (pT, Eta) "}; + Configurable cfgWeightPtCh{"cfgWeightPtCh", true, "Efficiency correction (pT) for charged particles"}; + Configurable cfgWeightPtId{"cfgWeightPtId", false, "Efficiency correction (pT) "}; + Configurable cfgWeightPtYId{"cfgWeightPtYId", false, "Efficiency correction (pT, rap) "}; + Configurable cfgWeightPtEtaId{"cfgWeightPtEtaId", true, "Efficiency correction (pT, Eta) "}; Configurable cfgPurityId{"cfgPurityId", false, "Purity correction"}; Configurable cfgMCReco{"cfgMCReco", false, ""}; Configurable cfgMCTruth{"cfgMCTruth", false, ""}; @@ -84,8 +84,6 @@ struct MeanPtFlucId { Configurable cfgNoSameBunchPileup{"cfgNoSameBunchPileup", true, "kNoSameBunchPileup"}; Configurable cfgIsVertexITSTPC{"cfgIsVertexITSTPC", true, "kIsVertexITSTPC"}; Configurable cfgRejTrk{"cfgRejTrk", true, "Rejected Tracks"}; - Configurable cfgSelOld{"cfgSelOld", true, " Non-circular Cuts"}; - Configurable cfgSelNew{"cfgSelNew", false, "Circular Cuts"}; ConfigurableAxis multTPCBins{"multTPCBins", {150, 0, 150}, "TPC Multiplicity bins"}; ConfigurableAxis multFT0MBins{"multFT0MBins", {1000, 0, 5000}, "Forward Multiplicity bins"}; ConfigurableAxis multFT0MMCBins{"multFT0MMCBins", {250, 0, 250}, "Forward Multiplicity bins"}; @@ -99,7 +97,7 @@ struct MeanPtFlucId { Configurable> rapBins{"rapBins", {-0.6, -0.55, -0.5, -0.45, -0.4, -0.35, -0.3, -0.25, -0.2, -0.15, -0.1, -0.05, 0.0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6}, "#rap bins"}; Configurable cfgUrlCCDB{"cfgUrlCCDB", "http://ccdb-test.cern.ch:8080", "url of ccdb"}; - Configurable cfgPathCCDB{"cfgPathCCDB", "Users/t/tgahlaut/", "Path for ccdb-object"}; + Configurable cfgPathCCDB{"cfgPathCCDB", "Users/t/tgahlaut/weightCorr/", "Path for ccdb-object"}; Service ccdb; @@ -118,22 +116,22 @@ struct MeanPtFlucId { HistogramRegistry hist{"hist", {}, OutputObjHandlingPolicy::AnalysisObject}; - TH1D* hEffPt = nullptr; + TH1D* hWeightPt = nullptr; TH1D* hPurePt = nullptr; - TH2D* hEffPtRap = nullptr; - TH2D* hEffPtEta = nullptr; - TH1D* hEffPtPi = nullptr; - TH1D* hEffPtKa = nullptr; - TH1D* hEffPtPr = nullptr; + TH2D* hWeightPtRap = nullptr; + TH2D* hWeightPtEta = nullptr; + TH1D* hWeightPtPi = nullptr; + TH1D* hWeightPtKa = nullptr; + TH1D* hWeightPtPr = nullptr; TH1D* hPurePtPi = nullptr; TH1D* hPurePtKa = nullptr; TH1D* hPurePtPr = nullptr; - TH2D* hEffPtRapPi = nullptr; - TH2D* hEffPtRapKa = nullptr; - TH2D* hEffPtRapPr = nullptr; - TH2D* hEffPtEtaPi = nullptr; - TH2D* hEffPtEtaKa = nullptr; - TH2D* hEffPtEtaPr = nullptr; + TH2D* hWeightPtRapPi = nullptr; + TH2D* hWeightPtRapKa = nullptr; + TH2D* hWeightPtRapPr = nullptr; + TH2D* hWeightPtEtaPi = nullptr; + TH2D* hWeightPtEtaKa = nullptr; + TH2D* hWeightPtEtaPr = nullptr; void init(InitContext const&) { @@ -143,21 +141,21 @@ struct MeanPtFlucId { ccdb->setCaching(true); TList* lst = ccdb->getForTimeStamp(cfgPathCCDB.value, -1); - hEffPt = reinterpret_cast(lst->FindObject("hEffPt")); - hEffPtPi = reinterpret_cast(lst->FindObject("hEffPtPi")); - hEffPtKa = reinterpret_cast(lst->FindObject("hEffPtKa")); - hEffPtPr = reinterpret_cast(lst->FindObject("hEffPtPr")); + hWeightPt = reinterpret_cast(lst->FindObject("hWeightPt")); + hWeightPtPi = reinterpret_cast(lst->FindObject("hWeightPtPi")); + hWeightPtKa = reinterpret_cast(lst->FindObject("hWeightPtKa")); + hWeightPtPr = reinterpret_cast(lst->FindObject("hWeightPtPr")); hPurePtPi = reinterpret_cast(lst->FindObject("hPurePtPi")); hPurePtKa = reinterpret_cast(lst->FindObject("hPurePtKa")); hPurePtPr = reinterpret_cast(lst->FindObject("hPurePtPr")); - hEffPtRapPi = reinterpret_cast(lst->FindObject("hEffPtRapPi")); - hEffPtRapKa = reinterpret_cast(lst->FindObject("hEffPtRapKa")); - hEffPtRapPr = reinterpret_cast(lst->FindObject("hEffPtRapPr")); - hEffPtEtaPi = reinterpret_cast(lst->FindObject("hEffPtEtaPi")); - hEffPtEtaKa = reinterpret_cast(lst->FindObject("hEffPtEtaKa")); - hEffPtEtaPr = reinterpret_cast(lst->FindObject("hEffPtEtaPr")); - - if (!hEffPt || !hEffPtPi || !hEffPtKa || !hEffPtPr || !hEffPtRapPi || !hEffPtRapKa || !hEffPtRapPr || !hEffPtEtaPi || !hEffPtEtaKa || !hEffPtEtaPr || !hPurePtPi || !hPurePtKa || !hPurePtPr) { + hWeightPtRapPi = reinterpret_cast(lst->FindObject("hWeightPtRapPi")); + hWeightPtRapKa = reinterpret_cast(lst->FindObject("hWeightPtRapKa")); + hWeightPtRapPr = reinterpret_cast(lst->FindObject("hWeightPtRapPr")); + hWeightPtEtaPi = reinterpret_cast(lst->FindObject("hWeightPtEtaPi")); + hWeightPtEtaKa = reinterpret_cast(lst->FindObject("hWeightPtEtaKa")); + hWeightPtEtaPr = reinterpret_cast(lst->FindObject("hWeightPtEtaPr")); + + if (!hWeightPt || !hWeightPtPi || !hWeightPtKa || !hWeightPtPr || !hWeightPtRapPi || !hWeightPtRapKa || !hWeightPtRapPr || !hWeightPtEtaPi || !hWeightPtEtaKa || !hWeightPtEtaPr || !hPurePtPi || !hPurePtKa || !hPurePtPr) { LOGF(info, "FATAL!! Could not find required histograms in CCDB"); } } @@ -167,6 +165,7 @@ struct MeanPtFlucId { const AxisSpec axisPhi{nPhiBins, 0., +7., "#phi (rad)"}; const AxisSpec axisY{rapBins, "y"}; const AxisSpec axisPt{ptBins, "p_{T} (GeV/c)"}; + const AxisSpec axisPt2{40, 0., 4., "p_{T}^2 (GeV/c)^2"}; const AxisSpec axisP{nPBins, 0., 3., "p (GeV/c)"}; const AxisSpec axisInnerParam{nPBins, 0., 3., "p_{InnerParam } (GeV/c)"}; const AxisSpec axisPart{nPartBins, 0., 18., " "}; @@ -250,16 +249,14 @@ struct MeanPtFlucId { hist.add("QA/after/h2_NTPC_Cent", "N_{TPC} vs FT0C(%)", kTH2D, {{axisCentFT0C}, {axisMultTPC}}); hist.add("QA/after/h2_NTPC_NFT0M", "N_{TPC} vs N_{FT0M}", kTH2D, {{axisMultFT0M}, {axisMultTPC}}); hist.add("QA/after/h2_NTPC_NFT0C", "N_{TPC} vs N_{FT0C}", kTH2D, {{axisMultFT0M}, {axisMultTPC}}); - hist.add("QA/after/h2_NTPC_NCh", "N_{ch} vs N_{TPC}", kTH2D, {{axisMultTPC}, {axisMultTPC}}); - hist.add("QA/after/h2_NTPC_NPi", "N_{Pi} vs N_{TPC}", kTH2D, {{axisMultTPC}, {axisMultTPC}}); - hist.add("QA/after/h2_NTPC_NKa", "N_{Ka} vs N_{TPC}", kTH2D, {{axisMultTPC}, {axisMultTPC}}); - hist.add("QA/after/h2_NTPC_NPr", "N_{Pr} vs N_{TPC}", kTH2D, {{axisMultTPC}, {axisMultTPC}}); hist.add("QA/after/p_NTPC_NFT0M", "N_{TPC} vs N_{FT0M} (Profile)", kTProfile, {axisMultFT0M}); hist.add("QA/after/p_NTPC_NFT0C", "N_{TPC} vs N_{FT0C} (Profile)", kTProfile, {axisMultFT0M}); hist.add("QA/after/p_NTPC_Cent", "N_{TPC} vs FT0C(%) (Profile)", kTProfile, {axisCentFT0C}); + hist.add("QA/after/h_Pt2", "p_{T}^2", kTH1D, {axisPt2}); hist.add("QA/after/h_Pt_weighted", "weighted pT distribution", kTH1D, {axisPt}); + hist.add("QA/after/h_Pt2_weighted", "weighted pT distribution", kTH1D, {axisPt2}); hist.add("QA/after/h2_Pt_NFT0M", "p_{T} in Multiplicity Classes ", kTH2D, {{axisPt}, {axisMultFT0M}}); hist.add("QA/after/h2_pt_nch", "Truth", kTH2D, {{axisMult}, {axisPt}}); hist.add("QA/after/h3_nft0m_pt_nch", "Reco", kTHnSparseD, {{axisMult}, {axisPt}, {axisMultFT0M}}); @@ -277,12 +274,15 @@ struct MeanPtFlucId { hist.add("QA/Pion/h_DcaZ", "DCA_{z}", kTH1D, {axisDCAz}); hist.add("QA/Pion/h_DcaXY", "DCA_{xy}", kTH1D, {axisDCAxy}); hist.add("QA/Pion/h_Pt", "p_{T} ", kTH1D, {axisPt}); + hist.add("QA/Pion/h_Pt2", "p_{T}^2 ", kTH1D, {axisPt2}); hist.add("QA/Pion/h_PtPos", "p_{T} (positive) ", kTH1D, {axisPt}); hist.add("QA/Pion/h_PtNeg", "p_{T} (negative) ", kTH1D, {axisPt}); hist.add("QA/Pion/h_PtTruth", "p_{T} ", kTH1D, {axisPt}); + hist.add("QA/Pion/h_PtTruth2", "p_{T}^2 ", kTH1D, {axisPt2}); hist.add("QA/Pion/h_PtPosTruth", "p_{T} (positive) ", kTH1D, {axisPt}); hist.add("QA/Pion/h_PtNegTruth", "p_{T} (negative) ", kTH1D, {axisPt}); hist.add("QA/Pion/h_Pt_weighted", "weighted pT distribution", kTH1D, {axisPt}); + hist.add("QA/Pion/h_Pt2_weighted", "weighted pT distribution", kTH1D, {axisPt2}); hist.add("QA/Pion/h2_Pt_Rap", "p_{T} vs y", kTH2D, {{axisY}, {axisPt}}); hist.add("QA/Pion/h2_PtTruth_Rap", "p_{T} vs y", kTH2D, {{axisY}, {axisPt}}); @@ -351,6 +351,9 @@ struct MeanPtFlucId { hist.add("Analysis/Charged/h_threepart_Mult_kurto", "Threepart vs N_{TPC} ", partHist); hist.add("Analysis/Charged/h_fourpart_Mult_kurto", "Fourpart vs N_{TPC} ", partHist); + hist.add("Analysis/Charged/p_twopart_MultFT0M", "Twopart vs N_{FT0M} ", kTProfile, {axisMultFT0M}); + hist.add("Analysis/Charged/p_mean_pT_MultFT0M", " vs N_{FT0M} ", kTProfile, {axisMultFT0M}); + hist.addClone("Analysis/Charged/", "Analysis/Pion/"); hist.addClone("Analysis/Charged/", "Analysis/Kaon/"); hist.addClone("Analysis/Charged/", "Analysis/Proton/"); @@ -377,6 +380,7 @@ struct MeanPtFlucId { hist.add("Gen/Charged/h_EtaTruth", "#eta ", kTH1D, {axisEta}); hist.add("Gen/Charged/h_PhiTruth", "#phi ", kTH1D, {axisPhi}); hist.add("Gen/Charged/h_PtTruth", "p_{T} ", kTH1D, {axisPt}); + hist.add("Gen/Charged/h_PtTruth2", "p_{T}^2 ", kTH1D, {axisPt2}); hist.add("Gen/Charged/h2_PtTruth_Eta", "p_{T} vs #eta", kTH2D, {{axisEta}, {axisPt}}); hist.add("Gen/Charged/h2_PtTruth_NFT0M", "p_{T} in Multiplicity Classes", kTH2D, {{axisPt}, {axisMultFT0M}}); @@ -408,6 +412,8 @@ struct MeanPtFlucId { hist.add("Gen/Charged/h_threepart_Mult_skew", "Threepart vs N_{TPC} ", partMCHist); hist.add("Gen/Charged/h_threepart_Mult_kurto", "Threepart vs N_{TPC} ", partMCHist); hist.add("Gen/Charged/h_fourpart_Mult_kurto", "Fourpart vs N_{TPC} ", partMCHist); + hist.add("Gen/Charged/p_twopart_MultFT0M", "Twopart vs N_{TPC} ", kTProfile, {axisMultFT0M}); + hist.add("Gen/Charged/p_mean_pT_MultFT0M", " vs N_{TPC} ", kTProfile, {axisMultFT0M}); hist.addClone("Gen/Charged/", "Gen/Pion/"); @@ -423,7 +429,8 @@ struct MeanPtFlucId { } enum Mode { - QA_Pion = 0, + QA_Charged = 0, + QA_Pion, QA_Kaon, QA_Proton, Analysis_Charged, @@ -437,6 +444,7 @@ struct MeanPtFlucId { }; static constexpr std::string_view Dire[] = { + "QA/after/", "QA/Pion/", "QA/Kaon/", "QA/Proton/", @@ -619,84 +627,6 @@ struct MeanPtFlucId { return false; } - // PID selction cuts for High momentum Protons - template - bool selCirPi(T const& track) - { - double nTPCTOF = std::pow(track.tpcNSigmaPi(), 2) + std::pow(track.tofNSigmaPi(), 2); - if (track.pt() >= cfgCutPiPtMin && - track.p() <= cfgCutPiThrsldP) { - if (!track.hasTOF() && - std::fabs(track.tpcNSigmaPi()) < cfgCutNSig2) { - return true; - } - - if (track.hasTOF() && - std::fabs(track.tpcNSigmaPi()) < cfgCutNSig2 && - std::fabs(track.tofNSigmaPi()) < cfgCutNSig3) { - return true; - } - } else if (track.p() > cfgCutPiThrsldP && - nTPCTOF < cfgCutNSig3) { - return true; - } - - return false; - } - - // PID selction cuts for High momentum Kaons - template - bool selCirKa(T const& track) - { - double nTPCTOF = std::pow(track.tpcNSigmaPi(), 2) + std::pow(track.tofNSigmaPi(), 2); - if (track.pt() >= cfgCutKaPtMin && - track.p() <= cfgCutKaThrsldP) { - if (!track.hasTOF() && - std::fabs(track.tpcNSigmaKa()) < cfgCutNSig2) { - return true; - } - - if (track.hasTOF() && - std::fabs(track.tpcNSigmaKa()) < cfgCutNSig2 && - std::fabs(track.tofNSigmaKa()) < cfgCutNSig3) { - return true; - } - } else if (track.p() > cfgCutPiThrsldP && - ((nTPCTOF < cfgCutNSig3 && track.p() <= cfgCutKaP3) || - (nTPCTOF < cfgCutNSig2 && track.p() > cfgCutKaP3))) { - return true; - } - - return false; - } - - // PID selction cuts for High momentum Protons - template - bool selCirPr(T const& track) - { - double nTPCTOF = std::pow(track.tpcNSigmaPi(), 2) + std::pow(track.tofNSigmaPi(), 2); - if (track.pt() >= cfgCutPrPtMin && - track.p() <= cfgCutPrThrsldP) { - if (!track.hasTOF() && - std::fabs(track.tpcNSigmaPr()) < cfgCutNSig2) { - return true; - } - - if (track.hasTOF() && - std::fabs(track.tpcNSigmaPr()) < cfgCutNSig2 && - std::fabs(track.tofNSigmaPr()) < cfgCutNSig3) { - return true; - } - } else if (track.hasTOF() && - track.p() > cfgCutPrThrsldP && - nTPCTOF < cfgCutNSig3) { - - return true; - } - - return false; - } - // Fill hist before selection cuts: template void fillBeforeQAHistos(T const& col, U const& tracks) @@ -744,6 +674,7 @@ struct MeanPtFlucId { hist.fill(HIST("QA/after/h_Eta"), track.eta()); hist.fill(HIST("QA/after/h_Phi"), track.phi()); hist.fill(HIST("QA/after/h_Pt"), track.pt()); + hist.fill(HIST("QA/after/h_Pt2"), track.pt() * track.pt()); hist.fill(HIST("QA/after/h2_Pt_NFT0M"), track.pt(), nFT0M); hist.fill(HIST("QA/after/h2_PvsPinner"), track.p(), track.tpcInnerParam()); hist.fill(HIST("QA/after/h2_Pt_Eta"), track.eta(), track.pt()); @@ -800,7 +731,7 @@ struct MeanPtFlucId { } template - float getCorrectedWeight(T1 hEffPt, T1 hPurePt, T2 hEffPtY, T2 hEffPtEta, double pt, double rap, double eta, bool cfgEffPt, bool cfgEffPtY, bool cfgEffPtEta, bool cfgPurity) + float getCorrectedWeight(T1 hWeightPt, T1 hPurePt, T2 hWeightPtY, T2 hWeightPtEta, double pt, double rap, double eta, bool cfgWeightPt, bool cfgWeightPtY, bool cfgWeightPtEta, bool cfgPurity) { float weight = 1.0; float purity = 1.0; @@ -810,21 +741,15 @@ struct MeanPtFlucId { purity = 1.0; } - if (cfgEffPt) { - float effPt = hEffPt->GetBinContent(hEffPt->FindBin(pt)); - if (effPt > 0) { - weight = purity / effPt; - } - } else if (cfgEffPtY) { - float effPtY = hEffPtY->GetBinContent(hEffPtY->FindBin(rap, pt)); - if (effPtY > 0) { - weight = purity / effPtY; - } - } else if (cfgEffPtEta) { - float effPtEta = hEffPtEta->GetBinContent(hEffPtEta->FindBin(eta, pt)); - if (effPtEta > 0) { - weight = purity / effPtEta; - } + if (cfgWeightPt) { + float weightPt = hWeightPt->GetBinContent(hWeightPt->FindBin(pt)); + weight = purity / weightPt; + } else if (cfgWeightPtY) { + float weightPtY = hWeightPtY->GetBinContent(hWeightPtY->FindBin(rap, pt)); + weight = purity / weightPtY; + } else if (cfgWeightPtEta) { + float weightPtEta = hWeightPtEta->GetBinContent(hWeightPtEta->FindBin(eta, pt)); + weight = purity / weightPtEta; } else { weight = 1.0; } @@ -833,11 +758,11 @@ struct MeanPtFlucId { // Fill after PID cut QA hist: template - void fillIdParticleQAHistos(T const& track, double rap, double nSigmaTPC, double nSigmaTOF, int nFT0M, T1 hEffPt, T1 hPurePt, T2 hEffPtY, T2 hEffPtEta, bool cfgEffPtId, bool cfgEffPtYId, bool cfgEffPtEtaId, bool cfgPurityId, int& N, int& NW, double& Q1, double& Q2, double& Q3, double& Q4, float& weight) + void fillIdParticleQAHistos(T const& track, double rap, double nSigmaTPC, double nSigmaTOF, int nFT0M, T1 hWeightPt, T1 hPurePt, T2 hWeightPtY, T2 hWeightPtEta, bool cfgWeightPtId, bool cfgWeightPtYId, bool cfgWeightPtEtaId, bool cfgPurityId, int& N, double& NW, double& Q1, double& Q2, double& Q3, double& Q4, float& weight) { double pt = track.pt(); double eta = track.eta(); - weight = getCorrectedWeight(hEffPt, hPurePt, hEffPtY, hEffPtEta, pt, rap, eta, cfgEffPtId, cfgEffPtYId, cfgEffPtEtaId, cfgPurityId); + weight = getCorrectedWeight(hWeightPt, hPurePt, hWeightPtY, hWeightPtEta, pt, rap, eta, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId); if (weight == 0) return; @@ -845,18 +770,17 @@ struct MeanPtFlucId { N++; moments(pt, weight, Q1, Q2, Q3, Q4); - if (cfgEffPtYId) + if (cfgWeightPtYId) hist.fill(HIST(Dire[Mode]) + HIST("h2_Pt_Rap_weighted"), rap, pt, weight); - if (cfgEffPtEtaId) + if (cfgWeightPtEtaId) hist.fill(HIST(Dire[Mode]) + HIST("h2_Pt_Eta_weighted"), eta, pt, weight); hist.fill(HIST(Dire[Mode]) + HIST("h_Pt_weighted"), pt, weight); - hist.fill(HIST(Dire[Mode]) + HIST("h2_pt_nch"), N, pt, weight); - hist.fill(HIST(Dire[Mode]) + HIST("h3_nft0m_pt_nch"), N, pt, nFT0M, weight); - hist.fill(HIST(Dire[Mode]) + HIST("h2_pt_nch_prof"), N, pt, weight); + hist.fill(HIST(Dire[Mode]) + HIST("h_Pt2_weighted"), pt * pt, weight); hist.fill(HIST(Dire[Mode]) + HIST("h_Pt"), pt); + hist.fill(HIST(Dire[Mode]) + HIST("h_Pt2"), pt * pt); hist.fill(HIST(Dire[Mode]) + HIST("h2_Pt_NFT0M"), pt, nFT0M); hist.fill(HIST(Dire[Mode]) + HIST("h2_Pt_Eta"), eta, pt); if (track.sign() > 0) { @@ -906,6 +830,7 @@ struct MeanPtFlucId { void fillPtMCHist(double pt, double eta, double rap, int nFT0M, int pid, int pdgCodePos, int pdgCodeNeg) { hist.fill(HIST(Dire[Mode]) + HIST("h_PtTruth"), pt); + hist.fill(HIST(Dire[Mode]) + HIST("h_PtTruth2"), pt * pt); hist.fill(HIST(Dire[Mode]) + HIST("h_EtaTruth"), eta); hist.fill(HIST(Dire[Mode]) + HIST("h_RapTruth"), rap); hist.fill(HIST(Dire[Mode]) + HIST("h2_PtTruth_NFT0M"), pt, nFT0M); @@ -923,7 +848,7 @@ struct MeanPtFlucId { } template - void fillAnalysisHistos(int nTPC, int nFT0M, int N, int NW, double Q1, double Q2, double Q3, double Q4) + void fillAnalysisHistos(int nTPC, int nFT0M, int N, double NW, double Q1, double Q2, double Q3, double Q4) { if (N == 0) { return; @@ -938,35 +863,35 @@ struct MeanPtFlucId { hist.fill(HIST(Dire[Mode]) + HIST("h_Q2"), nTPC, Q2, nFT0M); hist.fill(HIST(Dire[Mode]) + HIST("h_Q3"), nTPC, Q3, nFT0M); hist.fill(HIST(Dire[Mode]) + HIST("h_Q4"), nTPC, Q4, nFT0M); - double meanPt = Q1 / static_cast(NW); - hist.fill(HIST(Dire[Mode]) + HIST("p_mean_pT_Mult_var"), nTPC, meanPt); //////need to check if (N > 1) { - // double meanPt = Q1 / static_cast(NW); - double nPair = (static_cast(NW) * (static_cast(NW) - 1)); + double meanPt = Q1 / NW; + double nPair = (NW * (NW - 1)); double twopart = twopart1 / nPair; - double checkNDenoVar = (1 / std::sqrt(1 - (1 / static_cast(NW)))); + double checkNDenoVar = (1 / std::sqrt(1 - (1 / NW))); hist.fill(HIST(Dire[Mode]) + HIST("h_mean_pT"), meanPt); hist.fill(HIST(Dire[Mode]) + HIST("p_mean_pT_Mult_var"), nTPC, meanPt); + hist.fill(HIST(Dire[Mode]) + HIST("p_mean_pT_MultFT0M"), nFT0M, meanPt); + hist.fill(HIST(Dire[Mode]) + HIST("h_mean_pT_Mult_var"), nTPC, meanPt, nFT0M); hist.fill(HIST(Dire[Mode]) + HIST("h_Q1_var"), nTPC, Q1, nFT0M); hist.fill(HIST(Dire[Mode]) + HIST("h_N_var"), nTPC, N, nFT0M); hist.fill(HIST(Dire[Mode]) + HIST("h_twopart_nume_Mult_var"), nTPC, twopart1, nFT0M); hist.fill(HIST(Dire[Mode]) + HIST("h_twopart_deno_Mult_var"), nTPC, nPair, nFT0M); - hist.fill(HIST(Dire[Mode]) + HIST("h_mean_pT_Mult_var"), nTPC, meanPt, nFT0M); hist.fill(HIST(Dire[Mode]) + HIST("h_twopart_Mult_var"), nTPC, twopart, nFT0M); hist.fill(HIST(Dire[Mode]) + HIST("p_CheckNCh"), nTPC, checkNDenoVar); hist.fill(HIST(Dire[Mode]) + HIST("h_CheckNCh"), nTPC, checkNDenoVar, nFT0M); + hist.fill(HIST(Dire[Mode]) + HIST("p_twopart_MultFT0M"), nFT0M, twopart); if (N > 2) { - double nTriplet = (static_cast(N) * (static_cast(N) - 1) * (static_cast(N) - 2)); + double nTriplet = (NW * (NW - 1) * (NW - 2)); double threepart = threepart1 / nTriplet; hist.fill(HIST(Dire[Mode]) + HIST("h_mean_pT_Mult_skew"), nTPC, meanPt, nFT0M); hist.fill(HIST(Dire[Mode]) + HIST("h_twopart_Mult_skew"), nTPC, twopart, nFT0M); hist.fill(HIST(Dire[Mode]) + HIST("h_threepart_Mult_skew"), nTPC, threepart, nFT0M); if (N > 3) { - double nQuad = (static_cast(N) * (static_cast(N) - 1) * (static_cast(N) - 2) * (static_cast(N) - 3)); + double nQuad = (NW * (NW - 1) * (NW - 2) * (NW - 3)); double fourpart = fourpart1 / nQuad; hist.fill(HIST(Dire[Mode]) + HIST("h_mean_pT_Mult_kurto"), nTPC, meanPt, nFT0M); hist.fill(HIST(Dire[Mode]) + HIST("h_twopart_Mult_kurto"), nTPC, twopart, nFT0M); @@ -977,14 +902,30 @@ struct MeanPtFlucId { } } + template + void fillMeanPtCorr(std::vector ptVal, std::vector weightVal, int N, int nFT0M, bool cfgWeight) + { + for (int i = 0; i < N; i++) { + float w = 1.0; + if (cfgWeight) { + w = weightVal[i]; + } + double pt = ptVal[i]; + + hist.fill(HIST(Dire[Mode]) + HIST("h2_pt_nch"), N, pt, w); + hist.fill(HIST(Dire[Mode]) + HIST("h2_pt_nch_prof"), N, pt, w); + hist.fill(HIST(Dire[Mode]) + HIST("h3_nft0m_pt_nch"), N, pt, nFT0M, w); + } + } + template void fillHistos(T const& col, U const& tracks) { int nCh = 0, nTPC = 0, nFT0M = 0, nFT0C = 0; - int nChW = 0; + double nChW = 0; int nPi = 0, nKa = 0, nPr = 0; - int nPiW = 0, nKaW = 0, nPrW = 0; + double nPiW = 0, nKaW = 0, nPrW = 0; double ptCh = 0, q1Ch = 0, q2Ch = 0, q3Ch = 0, q4Ch = 0; double ptPi = 0, q1Pi = 0, q2Pi = 0, q3Pi = 0, q4Pi = 0; double ptPr = 0, q1Pr = 0, q2Pr = 0, q3Pr = 0, q4Pr = 0; @@ -1000,13 +941,15 @@ struct MeanPtFlucId { float wghtCh = 1.0, wghtPi = 1.0, wghtKa = 1.0, wghtPr = 1.0; - fillAfterQAHistos(col); + std::vector ptValCh, ptValPi, ptValKa, ptValPr; + std::vector weightValCh, weightValPi, weightValKa, weightValPr; if constexpr (DataFlag) { nTPC = col.multNTracksHasTPC(); nFT0M = col.multFT0M(); nFT0C = col.multFT0C(); + fillAfterQAHistos(col); for (const auto& track : tracks) { if (!selTrack(track)) { continue; @@ -1024,15 +967,12 @@ struct MeanPtFlucId { if (std::fabs(track.eta()) < 0.8) { ptCh = track.pt(); - wghtCh = getCorrectedWeight(hEffPt, hPurePt, hEffPtRap, hEffPtEta, ptCh, 0.0, eta, cfgEffPtCh, false, false, false); + wghtCh = getCorrectedWeight(hWeightPt, hPurePt, hWeightPtRap, hWeightPtEta, ptCh, 0.0, eta, cfgWeightPtCh, false, false, false); nChW += wghtCh; nCh++; moments(ptCh, wghtCh, q1Ch, q2Ch, q3Ch, q4Ch); hist.fill(HIST("QA/after/h_Pt_weighted"), ptCh, wghtCh); - hist.fill(HIST("QA/after/h2_pt_nch"), nCh, ptCh, wghtCh); - hist.fill(HIST("QA/after/h3_nft0m_pt_nch"), nCh, ptCh, nFT0M, wghtCh); - hist.fill(HIST("QA/after/h2_pt_nch_prof"), nCh, ptCh, wghtCh); fillChargedQAHistos(track, nFT0M); @@ -1042,34 +982,16 @@ struct MeanPtFlucId { return; } - if (cfgSelOld) { - if (selPi(track)) { - fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, hEffPtPi, hPurePtPi, hEffPtRapPi, hEffPtEtaPi, cfgEffPtId, cfgEffPtYId, cfgEffPtEtaId, cfgPurityId, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi, wghtPi); - } - } else if (cfgSelNew) { - if (selCirPi(track)) { - fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, hEffPtPi, hPurePtPi, hEffPtRapPi, hEffPtEtaPi, cfgEffPtId, cfgEffPtYId, cfgEffPtEtaId, cfgPurityId, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi, wghtPi); - } + if (selPi(track)) { + fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, hWeightPtPi, hPurePtPi, hWeightPtRapPi, hWeightPtEtaPi, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi, wghtPi); } - if (cfgSelOld) { - if (selKa(track)) { - fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, hEffPtKa, hPurePtKa, hEffPtRapKa, hEffPtEtaKa, cfgEffPtId, cfgEffPtYId, cfgEffPtEtaId, cfgPurityId, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka, wghtKa); - } - } else if (cfgSelNew) { - if (selCirKa(track)) { - fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, hEffPtKa, hPurePtKa, hEffPtRapKa, hEffPtEtaKa, cfgEffPtId, cfgEffPtYId, cfgEffPtEtaId, cfgPurityId, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka, wghtKa); - } + if (selKa(track)) { + fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, hWeightPtKa, hPurePtKa, hWeightPtRapKa, hWeightPtEtaKa, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka, wghtKa); } - if (cfgSelOld) { - if (selPr(track)) { - fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, hEffPtPr, hPurePtPr, hEffPtRapPr, hEffPtEtaPr, cfgEffPtId, cfgEffPtYId, cfgEffPtEtaId, cfgPurityId, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr, wghtPr); - } - } else if (cfgSelNew) { - if (selCirPr(track)) { - fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, hEffPtPr, hPurePtPr, hEffPtRapPr, hEffPtEtaPr, cfgEffPtId, cfgEffPtYId, cfgEffPtEtaId, cfgPurityId, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr, wghtPr); - } + if (selPr(track)) { + fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, hWeightPtPr, hPurePtPr, hWeightPtRapPr, hWeightPtEtaPr, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr, wghtPr); } } } @@ -1081,7 +1003,9 @@ struct MeanPtFlucId { nTPC = col.multNTracksHasTPC(); nFT0M = col.multFT0M(); nFT0C = col.multFT0C(); + std::vector ptValChSim, ptValPiSim, ptValKaSim, ptValPrSim; + fillAfterQAHistos(col); for (const auto& track : tracks) { if (!track.has_mcParticle()) { LOGF(warning, "No MC Particle for this track, skip..."); @@ -1093,10 +1017,6 @@ struct MeanPtFlucId { continue; } - // if (std::abs(track.eta()) < 0.8) { - // nTPC++; - // } - double nSigmaTPCPi = track.tpcNSigmaPi(); double nSigmaTPCKa = track.tpcNSigmaKa(); double nSigmaTPCPr = track.tpcNSigmaPr(); @@ -1113,16 +1033,16 @@ struct MeanPtFlucId { eta = track.eta(); ptCh = track.pt(); - wghtCh = getCorrectedWeight(hEffPt, hPurePt, hEffPtRap, hEffPtEta, ptCh, 0.0, eta, cfgEffPtCh, false, false, false); + wghtCh = getCorrectedWeight(hWeightPt, hPurePt, hWeightPtRap, hWeightPtEta, ptCh, 0.0, eta, cfgWeightPtCh, false, false, false); + ptValCh.push_back(track.pt()); + weightValCh.push_back(wghtCh); nChW += wghtCh; nCh++; moments(ptCh, wghtCh, q1Ch, q2Ch, q3Ch, q4Ch); fillChargedQAHistos(track, nFT0M); hist.fill(HIST("QA/after/h_Pt_weighted"), ptCh, wghtCh); - hist.fill(HIST("QA/after/h2_pt_nch"), nCh, ptCh, wghtCh); - hist.fill(HIST("QA/after/h3_nft0m_pt_nch"), nCh, ptCh, nFT0M, wghtCh); - hist.fill(HIST("QA/after/h2_pt_nch_prof"), nCh, ptCh, wghtCh); + hist.fill(HIST("QA/after/h_Pt2_weighted"), ptCh * ptCh, wghtCh); fillBeforePIDQAHistos(track); @@ -1130,57 +1050,32 @@ struct MeanPtFlucId { return; } - if (cfgSelOld) { - if (selPi(track)) { - ptPi = track.pt(); - fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, hEffPtPi, hPurePtPi, hEffPtRapPi, hEffPtEtaPi, cfgEffPtId, cfgEffPtYId, cfgEffPtEtaId, cfgPurityId, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi, wghtPi); - if (std::abs(pid) == kPiPlus) { - fillPtMCHist(ptPi, eta, rapPi, nFT0M, pid, kPiPlus, kPiMinus); - } - } - } else if (cfgSelNew) { - if (selCirPi(track)) { - ptPi = track.pt(); - fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, hEffPtPi, hPurePtPi, hEffPtRapPi, hEffPtEtaPi, cfgEffPtId, cfgEffPtYId, cfgEffPtEtaId, cfgPurityId, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi, wghtPi); - if (std::abs(pid) == kPiPlus) { - fillPtMCHist(ptPi, eta, rapPi, nFT0M, pid, kPiPlus, kPiMinus); - } + if (selPi(track)) { + ptPi = track.pt(); + fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, hWeightPtPi, hPurePtPi, hWeightPtRapPi, hWeightPtEtaPi, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi, wghtPi); + ptValPi.push_back(track.pt()); + weightValPi.push_back(wghtPi); + if (std::abs(pid) == kPiPlus) { + fillPtMCHist(ptPi, eta, rapPi, nFT0M, pid, kPiPlus, kPiMinus); } } - - if (cfgSelOld) { - if (selKa(track)) { - ptKa = track.pt(); - fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, hEffPtKa, hPurePtKa, hEffPtRapKa, hEffPtEtaKa, cfgEffPtId, cfgEffPtYId, cfgEffPtEtaId, cfgPurityId, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka, wghtKa); - if (std::abs(pid) == kKPlus) { - fillPtMCHist(ptKa, eta, rapKa, nFT0M, pid, kKPlus, kKMinus); - } - } - } else if (cfgSelNew) { - if (selCirKa(track)) { - ptKa = track.pt(); - fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, hEffPtKa, hPurePtKa, hEffPtRapKa, hEffPtEtaKa, cfgEffPtId, cfgEffPtYId, cfgEffPtEtaId, cfgPurityId, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka, wghtKa); - if (std::abs(pid) == kKPlus) { - fillPtMCHist(ptKa, eta, rapKa, nFT0M, pid, kKPlus, kKMinus); - } + if (selKa(track)) { + ptKa = track.pt(); + fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, hWeightPtKa, hPurePtKa, hWeightPtRapKa, hWeightPtEtaKa, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka, wghtKa); + ptValKa.push_back(track.pt()); + weightValKa.push_back(wghtKa); + if (std::abs(pid) == kKPlus) { + fillPtMCHist(ptKa, eta, rapKa, nFT0M, pid, kKPlus, kKMinus); } } - if (cfgSelOld) { - if (selPr(track)) { - ptPr = track.pt(); - fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, hEffPtPr, hPurePtPr, hEffPtRapPr, hEffPtEtaPr, cfgEffPtId, cfgEffPtYId, cfgEffPtEtaId, cfgPurityId, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr, wghtPr); - if (std::abs(pid) == kProton) { - fillPtMCHist(ptPr, eta, rapPr, nFT0M, pid, kProton, kProtonBar); - } - } - } else if (cfgSelNew) { - if (selCirPr(track)) { - ptPr = track.pt(); - fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, hEffPtPr, hPurePtPr, hEffPtRapPr, hEffPtEtaPr, cfgEffPtId, cfgEffPtYId, cfgEffPtEtaId, cfgPurityId, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr, wghtPr); - if (std::abs(pid) == kProton) { - fillPtMCHist(ptPr, eta, rapPr, nFT0M, pid, kProton, kProtonBar); - } + if (selPr(track)) { + ptPr = track.pt(); + fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, hWeightPtPr, hPurePtPr, hWeightPtRapPr, hWeightPtEtaPr, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr, wghtPr); + ptValPr.push_back(track.pt()); + weightValPr.push_back(wghtPr); + if (std::abs(pid) == kProton) { + fillPtMCHist(ptPr, eta, rapPr, nFT0M, pid, kProton, kProtonBar); } } } @@ -1211,8 +1106,10 @@ struct MeanPtFlucId { if (std::abs(mcPart.eta()) < 0.8) { nChSim++; ptChSim = mcPart.pt(); + ptValChSim.push_back(ptChSim); moments(ptChSim, 1.0, q1ChSim, q2ChSim, q3ChSim, q4ChSim); hist.fill(HIST("Gen/Charged/h_PtTruth"), mcPart.pt()); + hist.fill(HIST("Gen/Charged/h_PtTruth2"), ptChSim * ptChSim); hist.fill(HIST("Gen/Charged/h2_PtTruth_NFT0M"), mcPart.pt(), nFT0M); hist.fill(HIST("Gen/Charged/h2_PtTruth_Eta"), mcPart.eta(), mcPart.pt()); hist.fill(HIST("Gen/Charged/h_EtaTruth"), mcPart.eta()); @@ -1227,37 +1124,31 @@ struct MeanPtFlucId { rapSim = mcPart.y(); nPiSim++; ptPiSim = mcPart.pt(); + ptValPiSim.push_back(ptPiSim); moments(ptPiSim, 1.0, q1PiSim, q2PiSim, q3PiSim, q4PiSim); fillPtMCHist(ptPiSim, etaSim, rapSim, nFT0M, pid, kPiPlus, kPiMinus); hist.fill(HIST("Gen/Pion/h_PhiTruth"), mcPart.phi()); - hist.fill(HIST("Gen/Pion/h2_pt_nch"), nPiSim, mcPart.pt()); - hist.fill(HIST("Gen/Pion/h3_nft0m_pt_nch"), nPiSim, mcPart.pt(), nFT0M); - hist.fill(HIST("Gen/Pion/h2_pt_nch_prof"), nPiSim, mcPart.pt()); } if (std::abs(pid) == kKPlus && mcPart.pt() >= cfgCutKaPtMin) { nKaSim++; ptKaSim = mcPart.pt(); + ptValKaSim.push_back(ptKaSim); moments(ptKaSim, 1.0, q1KaSim, q2KaSim, q3KaSim, q4KaSim); fillPtMCHist(ptKaSim, etaSim, rapSim, nFT0M, pid, kKPlus, kKMinus); hist.fill(HIST("Gen/Kaon/h_PhiTruth"), mcPart.phi()); - hist.fill(HIST("Gen/Kaon/h2_pt_nch"), nKaSim, mcPart.pt()); - hist.fill(HIST("Gen/Kaon/h3_nft0m_pt_nch"), nKaSim, mcPart.pt(), nFT0M); - hist.fill(HIST("Gen/Kaon/h2_pt_nch_prof"), nKaSim, mcPart.pt()); } if (std::abs(pid) == kProton && mcPart.pt() >= cfgCutPrPtMin) { nPrSim++; ptPrSim = mcPart.pt(); + ptValPrSim.push_back(ptPrSim); moments(ptPrSim, 1.0, q1PrSim, q2PrSim, q3PrSim, q4PrSim); fillPtMCHist(ptPrSim, etaSim, rapSim, nFT0M, pid, kProton, kProtonBar); hist.fill(HIST("Gen/Proton/h_PhiTruth"), mcPart.phi()); - hist.fill(HIST("Gen/Proton/h2_pt_nch"), nPrSim, mcPart.pt()); - hist.fill(HIST("Gen/Proton/h3_nft0m_pt_nch"), nPrSim, mcPart.pt(), nFT0M); - hist.fill(HIST("Gen/Proton/h2_pt_nch_prof"), nPrSim, mcPart.pt()); } } } @@ -1276,30 +1167,6 @@ struct MeanPtFlucId { if (nSim > 0 && nTPC > 0) hist.fill(HIST("Gen/h2_NTPC_NSim"), nSim, nTPC); - if (nChSim > 0 && nTPC > 0) - hist.fill(HIST("Gen/h2_NTPC_NChSim"), nTPC, nChSim); - - if (nPiSim > 0 && nTPC > 0) - hist.fill(HIST("Gen/h2_NTPC_NPiSim"), nTPC, nPiSim); - - if (nKaSim > 0 && nTPC > 0) - hist.fill(HIST("Gen/h2_NTPC_NKaSim"), nTPC, nKaSim); - - if (nPrSim > 0 && nTPC > 0) - hist.fill(HIST("Gen/h2_NTPC_NPrSim"), nTPC, nPrSim); - - if (nChSim > 0 && nCh > 0) - hist.fill(HIST("Gen/Charged/h2_Nid_NidSim"), nChSim, nCh, wghtCh); - - if (nPi > 0 && nPiSim > 0) - hist.fill(HIST("Gen/Pion/h2_Nid_NidSim"), nPiSim, nPi, wghtPi); - - if (nKa > 0 && nKaSim > 0) - hist.fill(HIST("Gen/Kaon/h2_Nid_NidSim"), nKaSim, nKa, wghtKa); - - if (nPr > 0 && nPrSim > 0) - hist.fill(HIST("Gen/Proton/h2_Nid_NidSim"), nPrSim, nPr, wghtPr); - hist.fill(HIST("Gen/h_NTPC"), nTPC); hist.fill(HIST("Gen/h_NFT0C"), nFT0CSim); hist.fill(HIST("Gen/h2_NTPC_NFT0C"), nFT0CSim, nTPC); @@ -1308,28 +1175,44 @@ struct MeanPtFlucId { if (nFT0C != 0 && nFT0CSim != 0) hist.fill(HIST("Gen/h2_NFT0C_NFT0CSim"), nFT0CSim, nFT0C); - fillAnalysisHistos(nTPC, nFT0M, nChSim, nChSim, q1ChSim, q2ChSim, q3ChSim, q4ChSim); - fillAnalysisHistos(nTPC, nFT0M, nPiSim, nPiSim, q1PiSim, q2PiSim, q3PiSim, q4PiSim); - fillAnalysisHistos(nTPC, nFT0M, nKaSim, nKaSim, q1KaSim, q2KaSim, q3KaSim, q4KaSim); - fillAnalysisHistos(nTPC, nFT0M, nPrSim, nPrSim, q1PrSim, q2PrSim, q3PrSim, q4PrSim); + double nChSim1 = static_cast(nChSim); + double nPiSim1 = static_cast(nPiSim); + double nKaSim1 = static_cast(nKaSim); + double nPrSim1 = static_cast(nPrSim); + + fillAnalysisHistos(nTPC, nFT0M, nChSim, nChSim1, q1ChSim, q2ChSim, q3ChSim, q4ChSim); + fillAnalysisHistos(nTPC, nFT0M, nPiSim, nPiSim1, q1PiSim, q2PiSim, q3PiSim, q4PiSim); + fillAnalysisHistos(nTPC, nFT0M, nKaSim, nKaSim1, q1KaSim, q2KaSim, q3KaSim, q4KaSim); + fillAnalysisHistos(nTPC, nFT0M, nPrSim, nPrSim1, q1PrSim, q2PrSim, q3PrSim, q4PrSim); + + fillMeanPtCorr(ptValChSim, {}, nChSim, nFT0M, false); + fillMeanPtCorr(ptValPiSim, {}, nPiSim, nFT0M, false); + fillMeanPtCorr(ptValKaSim, {}, nKaSim, nFT0M, false); + fillMeanPtCorr(ptValPrSim, {}, nPrSim, nFT0M, false); + + ptValChSim.clear(); + ptValPiSim.clear(); + ptValKaSim.clear(); + ptValPrSim.clear(); } - - if (nTPC > 0 && nCh > 0) - hist.fill(HIST("QA/after/h2_NTPC_NCh"), nTPC, nCh, wghtCh); - - if (nPi > 0 && nTPC > 0) - hist.fill(HIST("QA/after/h2_NTPC_NPi"), nTPC, nPi, wghtPi); - - if (nKa > 0 && nTPC > 0) - hist.fill(HIST("QA/after/h2_NTPC_NKa"), nTPC, nKa, wghtKa); - - if (nPr > 0 && nTPC > 0) - hist.fill(HIST("QA/after/h2_NTPC_NPr"), nTPC, nPr, wghtPr); + fillMeanPtCorr(ptValCh, weightValCh, nCh, nFT0M, true); + fillMeanPtCorr(ptValPi, weightValPi, nPi, nFT0M, true); + fillMeanPtCorr(ptValKa, weightValKa, nKa, nFT0M, true); + fillMeanPtCorr(ptValPr, weightValPr, nPr, nFT0M, true); fillAnalysisHistos(nTPC, nFT0M, nCh, nChW, q1Ch, q2Ch, q3Ch, q4Ch); fillAnalysisHistos(nTPC, nFT0M, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi); fillAnalysisHistos(nTPC, nFT0M, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka); fillAnalysisHistos(nTPC, nFT0M, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr); + + ptValCh.clear(); + ptValPi.clear(); + ptValKa.clear(); + ptValPr.clear(); + weightValCh.clear(); + weightValPi.clear(); + weightValKa.clear(); + weightValPr.clear(); } void processRun3(MyRun3Collisions::iterator const& col, MyAllTracks const& tracks) From 7bf5c3bc559f3ca0ee3bdc7f5312de96b9547d67 Mon Sep 17 00:00:00 2001 From: nepeivodaRS <94179174+nepeivodaRS@users.noreply.github.com> Date: Tue, 18 Mar 2025 09:36:58 +0100 Subject: [PATCH 0736/1650] [PWGLF] generatorsID in UPC task (#10537) --- .../Tasks/Strangeness/derivedupcanalysis.cxx | 210 +++++++++++++++--- 1 file changed, 176 insertions(+), 34 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/derivedupcanalysis.cxx b/PWGLF/Tasks/Strangeness/derivedupcanalysis.cxx index e8a08c185f0..88d2a893fab 100644 --- a/PWGLF/Tasks/Strangeness/derivedupcanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/derivedupcanalysis.cxx @@ -78,6 +78,8 @@ struct Derivedupcanalysis { Configurable analyseOmega{"analyseOmega", true, "process Omega-like candidates"}; Configurable analyseAntiOmega{"analyseAntiOmega", true, "process AntiOmega-like candidates"}; + Configurable> generatorIds{"generatorIds", std::vector{-1}, "MC generatorIds to process"}; + // Event selections Configurable rejectITSROFBorder{"rejectITSROFBorder", true, "reject events at ITS ROF border"}; Configurable rejectTFBorder{"rejectTFBorder", true, "reject events at TF border"}; @@ -861,6 +863,7 @@ struct Derivedupcanalysis { histos.add("eventQA/hTracksPVeta1VsTracksGlobal", "hTracksPVeta1VsTracksGlobal", kTH3F, {axisNTracksPVeta1, axisNTracksGlobal, axisSelGap}); histos.add("eventQA/hCentralityVsTracksGlobal", "hCentralityVsTracksGlobal", kTH3F, {axisFT0Cqa, axisNTracksGlobal, axisSelGap}); histos.add("eventQA/hGapSide", "Gap side; Entries", kTH1F, {{5, -0.5, 4.5}}); + histos.add("eventQA/hRawGapSide", "Raw Gap side; Entries", kTH1F, {{6, -1.5, 4.5}}); histos.add("eventQA/hSelGapSide", "Selected gap side; Entries", kTH1F, {axisSelGap}); histos.add("eventQA/hPosX", "Vertex position in x", kTH2F, {{100, -0.1, 0.1}, axisSelGap}); histos.add("eventQA/hPosY", "Vertex position in y", kTH2F, {{100, -0.1, 0.1}, axisSelGap}); @@ -977,14 +980,16 @@ struct Derivedupcanalysis { } template - int getGapSide(TCollision const& collision) + int getGapSide(TCollision const& collision, bool fillQA) { int selGapSide = sgSelector.trueGap(collision, upcCuts.fv0a, upcCuts.ft0a, upcCuts.ft0c, upcCuts.zdc); - histos.fill(HIST("eventQA/hGapSide"), collision.gapSide()); - histos.fill(HIST("eventQA/hSelGapSide"), selGapSide); - histos.fill(HIST("eventQA/hFT0"), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), selGapSide); - histos.fill(HIST("eventQA/hFDD"), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), selGapSide); - histos.fill(HIST("eventQA/hZN"), collision.energyCommonZNA(), collision.energyCommonZNC(), selGapSide); + if (fillQA) { + histos.fill(HIST("eventQA/hGapSide"), collision.gapSide()); + histos.fill(HIST("eventQA/hSelGapSide"), selGapSide); + histos.fill(HIST("eventQA/hFT0"), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), selGapSide); + histos.fill(HIST("eventQA/hFDD"), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), selGapSide); + histos.fill(HIST("eventQA/hZN"), collision.energyCommonZNA(), collision.energyCommonZNC(), selGapSide); + } return selGapSide; } @@ -1014,7 +1019,7 @@ struct Derivedupcanalysis { float qaBin; }; - const std::array checks = {{ + const std::array checks = {{ {true, true, 0.0}, // All collisions {requireIsTriggerTVX, collision.selection_bit(aod::evsel::kIsTriggerTVX), 1.0}, // Triggered by FT0M {true, std::fabs(collision.posZ()) < maxZVtxPosition, 2.0}, // Vertex-Z selected @@ -1029,7 +1034,6 @@ struct Derivedupcanalysis { {requireNoCollInTimeRangeNarrow, collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeNarrow), 11.0}, // No collision within +-4 µs {minOccupancy >= 0, collision.trackOccupancyInTimeRange() >= minOccupancy, 12.0}, // Above min occupancy {maxOccupancy > 0, collision.trackOccupancyInTimeRange() < maxOccupancy, 13.0}, // Below max occupancy - {studyUPConly, collision.isUPC(), 14.0}, // Study UPC collisions only }}; for (const auto& check : checks) { @@ -1041,6 +1045,12 @@ struct Derivedupcanalysis { } } + if (studyUPConly && !collision.isUPC()) { + return false; + } else if (collision.isUPC()) { + histos.fill(HIST("eventQA/hEventSelection"), 14.0); // is UPC compatible + } + // Additional check for UPC collision flag if (useUPCflag && collision.flags() < 1) { return false; @@ -1511,27 +1521,27 @@ struct Derivedupcanalysis { const int pdgV0 = v0.pdgCode(); const bool isPhysPrim = v0.isPhysicalPrimary(); - const bool isPositiveProton = (pdgPos == 2212); - const bool isPositivePion = (pdgPos == 211) || (doTreatPiToMuon && pdgPos == -13); - const bool isNegativeProton = (pdgNeg == -2212); - const bool isNegativePion = (pdgNeg == -211) || (doTreatPiToMuon && pdgNeg == 13); + const bool isPositiveProton = (pdgPos == PDG_t::kProton); + const bool isPositivePion = (pdgPos == PDG_t::kPiPlus) || (doTreatPiToMuon && pdgPos == PDG_t::kMuonPlus); + const bool isNegativeProton = (pdgNeg == kProtonBar); + const bool isNegativePion = (pdgNeg == PDG_t::kPiMinus) || (doTreatPiToMuon && pdgNeg == PDG_t::kMuonMinus); switch (pdgV0) { - case 310: // K0Short + case PDG_t::kK0Short: // K0Short if (isPositivePion && isNegativePion) { bitMap.set(selConsiderK0Short); if (isPhysPrim) bitMap.set(selPhysPrimK0Short); } break; - case 3122: // Lambda + case PDG_t::kLambda0: // Lambda if (isPositiveProton && isNegativePion) { bitMap.set(selConsiderLambda); if (isPhysPrim) bitMap.set(selPhysPrimLambda); } break; - case -3122: // AntiLambda + case PDG_t::kLambda0Bar: // AntiLambda if (isPositivePion && isNegativeProton) { bitMap.set(selConsiderAntiLambda); if (isPhysPrim) @@ -1541,6 +1551,60 @@ struct Derivedupcanalysis { } } + template + void computeCascadeMCAssociation(const TCasc& casc, std::bitset& bitMap) + { + const int pdgPos = casc.pdgCodePositive(); + const int pdgNeg = casc.pdgCodeNegative(); + const int pdgBach = casc.pdgCodeBachelor(); + const int pdgCasc = casc.pdgCode(); + const bool isPhysPrim = casc.isPhysicalPrimary(); + + const bool isPositiveProton = (pdgPos == PDG_t::kProton); + + const bool isPositivePion = (pdgPos == PDG_t::kPiPlus); + const bool isBachelorPositivePion = (pdgBach == PDG_t::kPiPlus); + + const bool isNegativeProton = (pdgNeg == kProtonBar); + + const bool isNegativePion = (pdgNeg == PDG_t::kPiMinus); + const bool isBachelorNegativePion = (pdgBach == PDG_t::kPiMinus); + + const bool isBachelorPositiveKaon = (pdgBach == PDG_t::kKPlus); + const bool isBachelorNegativeKaon = (pdgBach == PDG_t::kKMinus); + + switch (pdgCasc) { + case PDG_t::kXiMinus: // Xi + if (isPositiveProton && isNegativePion && isBachelorNegativePion) { + bitMap.set(selConsiderXi); + if (isPhysPrim) + bitMap.set(selPhysPrimXi); + } + break; + case PDG_t::kXiPlusBar: // Anti-Xi + if (isNegativeProton && isPositivePion && isBachelorPositivePion) { + bitMap.set(selConsiderAntiXi); + if (isPhysPrim) + bitMap.set(selPhysPrimAntiXi); + } + break; + case PDG_t::kOmegaMinus: // Omega + if (isPositiveProton && isNegativePion && isBachelorNegativeKaon) { + bitMap.set(selConsiderOmega); + if (isPhysPrim) + bitMap.set(selPhysPrimOmega); + } + break; + case PDG_t::kOmegaPlusBar: // Anti-Omega + if (isNegativeProton && isPositivePion && isBachelorPositiveKaon) { + bitMap.set(selConsiderAntiOmega); + if (isPhysPrim) + bitMap.set(selPhysPrimAntiOmega); + } + break; + } + } + template void analyseV0Candidate(TV0 const& v0, TCollision const& coll, int const& gap, std::bitset const& selMap) { @@ -1585,6 +1649,9 @@ struct Derivedupcanalysis { std::vector listBestCollisionIds(mcCollisions.size(), -1); for (auto const& mcCollision : mcCollisions) { + if (std::find(generatorIds->begin(), generatorIds->end(), mcCollision.generatorsID()) == generatorIds->end()) { + continue; + } auto groupedCollisions = collisions.sliceBy(perMcCollision, mcCollision.globalIndex()); // Find the collision with the biggest nbr of PV contributors // Follows what was done here: https://github.com/AliceO2Group/O2Physics/blob/master/Common/TableProducer/mcCollsExtra.cxx#L93 @@ -1595,7 +1662,7 @@ struct Derivedupcanalysis { continue; } - int selGapSide = collision.isUPC() ? getGapSide(collision) : -1; + int selGapSide = collision.isUPC() ? getGapSide(collision, false) : -1; if (studyUPConly && (selGapSide < -0.5)) continue; @@ -1613,6 +1680,11 @@ struct Derivedupcanalysis { void fillGenMCHistogramsQA(StraMCCollisionsFull const& mcCollisions, StraCollisonsFullMC const& collisions) { for (auto const& mcCollision : mcCollisions) { + // LOGF(info, "Generator ID is %i", mcCollision.generatorsID()); + if (std::find(generatorIds->begin(), generatorIds->end(), mcCollision.generatorsID()) == generatorIds->end()) { + continue; + } + histos.fill(HIST("eventQA/mc/hEventSelectionMC"), 0.0); histos.fill(HIST("eventQA/mc/hMCNParticlesEta10"), mcCollision.multMCNParticlesEta10(), 0 /* all gen. events*/); @@ -1636,7 +1708,7 @@ struct Derivedupcanalysis { continue; } - int selGapSide = collision.isUPC() ? getGapSide(collision) : -1; + int selGapSide = collision.isUPC() ? getGapSide(collision, false) : -1; if (studyUPConly && (selGapSide < -0.5)) continue; @@ -1670,7 +1742,9 @@ struct Derivedupcanalysis { return; } // event is accepted - int selGapSide = collision.isUPC() ? getGapSide(collision) : -1; + histos.fill(HIST("eventQA/hRawGapSide"), collision.gapSide()); + + int selGapSide = collision.isUPC() ? getGapSide(collision, true) : -1; if (studyUPConly && (selGapSide < -0.5)) return; @@ -1697,15 +1771,22 @@ struct Derivedupcanalysis { StraMCCollisionsFull const&, V0MCCoresFull const&) { + if (!collision.has_straMCCollision()) { + histos.fill(HIST("eventQA/mc/hFakeEvents"), 0); // no assoc. MC collisions + } else { + const auto& mcCollision = collision.straMCCollision_as(); + if (std::find(generatorIds->begin(), generatorIds->end(), mcCollision.generatorsID()) == generatorIds->end()) { + return; + } + } + if (!acceptEvent(collision, true)) { return; } // event is accepted - if (!collision.has_straMCCollision()) { - histos.fill(HIST("eventQA/mc/hFakeEvents"), 0); // no assoc. MC collisions - } + histos.fill(HIST("eventQA/hRawGapSide"), collision.gapSide()); - int selGapSide = collision.isUPC() ? getGapSide(collision) : -1; + int selGapSide = collision.isUPC() ? getGapSide(collision, true) : -1; if (studyUPConly && (selGapSide < -0.5)) return; @@ -1748,7 +1829,9 @@ struct Derivedupcanalysis { return; } // event is accepted - int selGapSide = collision.isUPC() ? getGapSide(collision) : -1; + histos.fill(HIST("eventQA/hRawGapSide"), collision.gapSide()); + + int selGapSide = collision.isUPC() ? getGapSide(collision, true) : -1; if (studyUPConly && (selGapSide < -0.5)) return; @@ -1764,6 +1847,60 @@ struct Derivedupcanalysis { } // end casc loop } + void processCascadesMC(StraCollisonFullMC const& collision, + CascadeCandidatesMC const& fullCascades, + DauTracks const&, + aod::MotherMCParts const&, + StraMCCollisionsFull const&, + CascMCCoresFull const&) + { + if (!collision.has_straMCCollision()) { + histos.fill(HIST("eventQA/mc/hFakeEvents"), 0); // no assoc. MC collisions + } else { + const auto& mcCollision = collision.straMCCollision_as(); + if (std::find(generatorIds->begin(), generatorIds->end(), mcCollision.generatorsID()) == generatorIds->end()) { + return; + } + } + + if (!acceptEvent(collision, true)) { + return; + } // event is accepted + + histos.fill(HIST("eventQA/hRawGapSide"), collision.gapSide()); + + int selGapSide = collision.isUPC() ? getGapSide(collision, true) : -1; + if (studyUPConly && (selGapSide < -0.5)) + return; + + fillHistogramsQA(collision, selGapSide); + + if (collision.has_straMCCollision()) { + const auto& mcCollision = collision.straMCCollision_as(); + histos.fill(HIST("eventQA/mc/hNTracksGlobalvsMCNParticlesEta10rec"), collision.multNTracksGlobal(), mcCollision.multMCNParticlesEta10()); + histos.fill(HIST("eventQA/mc/hNTracksPVeta1vsMCNParticlesEta10rec"), collision.multNTracksPVeta1(), mcCollision.multMCNParticlesEta10()); + histos.fill(HIST("eventQA/mc/hNTracksGlobalvstotalMultMCParticles"), collision.multNTracksGlobal(), mcCollision.totalMultMCParticles()); + histos.fill(HIST("eventQA/mc/hNTracksPVeta1vstotalMultMCParticles"), collision.multNTracksPVeta1(), mcCollision.totalMultMCParticles()); + } + + for (const auto& casc : fullCascades) { + std::bitset selMap = computeBitmapCascade(casc, collision); + + if (doMCAssociation) { + if (casc.has_cascMCCore()) { + const auto& cascMC = casc.cascMCCore_as(); + computeCascadeMCAssociation(cascMC, selMap); + } + } else { + // the candidate may belong to any particle species + setBits(selMap, {selConsiderXi, selConsiderAntiXi, selConsiderOmega, selConsiderAntiOmega, + selPhysPrimXi, selPhysPrimAntiXi, selPhysPrimOmega, selPhysPrimAntiOmega}); + } + + analyseCascCandidate(casc, collision, selGapSide, selMap); + } // end casc loop + } + void processGenerated(StraMCCollisionsFull const& mcCollisions, V0MCCoresFull const& V0MCCores, CascMCCoresFull const& CascMCCores, @@ -1780,9 +1917,9 @@ struct Derivedupcanalysis { // Kinematics (|y| < rapidityCut) float pTmc = v0MC.ptMC(); float ymc = 1e3; - if (v0MC.pdgCode() == 310) + if (v0MC.pdgCode() == PDG_t::kK0Short) ymc = v0MC.rapidityMC(0); - else if (std::abs(v0MC.pdgCode()) == 3122) + else if (std::abs(v0MC.pdgCode()) == PDG_t::kLambda0) ymc = v0MC.rapidityMC(1); if (std::abs(ymc) > rapidityCut) continue; @@ -1792,6 +1929,11 @@ struct Derivedupcanalysis { if (std::abs(mcCollision.posZ()) > maxZVtxPosition) continue; + // Collision is of the proccess of interest + if (std::find(generatorIds->begin(), generatorIds->end(), mcCollision.generatorsID()) == generatorIds->end()) { + continue; + } + float centrality = -1.f; int nTracksGlobal = -1; @@ -1802,13 +1944,13 @@ struct Derivedupcanalysis { } // Fill histograms - if (v0MC.pdgCode() == 310) { + if (v0MC.pdgCode() == PDG_t::kK0Short) { histos.fill(HIST(kParticlenames[0]) + HIST("/mc/h6dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc); } - if (v0MC.pdgCode() == 3122) { + if (v0MC.pdgCode() == PDG_t::kLambda0) { histos.fill(HIST(kParticlenames[1]) + HIST("/mc/h6dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc); } - if (v0MC.pdgCode() == -3122) { + if (v0MC.pdgCode() == PDG_t::kLambda0Bar) { histos.fill(HIST(kParticlenames[2]) + HIST("/mc/h6dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc); } } // V0 end @@ -1821,9 +1963,9 @@ struct Derivedupcanalysis { // Kinematics (|y| < rapidityCut) float pTmc = cascMC.ptMC(); float ymc = 1e3; - if (std::abs(cascMC.pdgCode()) == 3312) + if (std::abs(cascMC.pdgCode()) == PDG_t::kXiMinus) ymc = RecoDecay::y(std::array{cascMC.pxMC(), cascMC.pyMC(), cascMC.pzMC()}, o2::constants::physics::MassXiMinus); - else if (std::abs(cascMC.pdgCode()) == 3334) + else if (std::abs(cascMC.pdgCode()) == PDG_t::kOmegaMinus) ymc = RecoDecay::y(std::array{cascMC.pxMC(), cascMC.pyMC(), cascMC.pzMC()}, o2::constants::physics::MassOmegaMinus); if (std::abs(ymc) > rapidityCut) continue; @@ -1842,16 +1984,16 @@ struct Derivedupcanalysis { } // Fill histograms - if (cascMC.pdgCode() == 3312) { + if (cascMC.pdgCode() == PDG_t::kXiMinus) { histos.fill(HIST(kParticlenames[3]) + HIST("/mc/h6dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc); } - if (cascMC.pdgCode() == -3312) { + if (cascMC.pdgCode() == PDG_t::kXiPlusBar) { histos.fill(HIST(kParticlenames[4]) + HIST("/mc/h6dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc); } - if (cascMC.pdgCode() == 3334) { + if (cascMC.pdgCode() == PDG_t::kOmegaMinus) { histos.fill(HIST(kParticlenames[5]) + HIST("/mc/h6dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc); } - if (cascMC.pdgCode() == -3334) { + if (cascMC.pdgCode() == PDG_t::kOmegaPlusBar) { histos.fill(HIST(kParticlenames[6]) + HIST("/mc/h6dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc); } } // Cascade end From af37c46ea4ce0e1136845349d907f2ee477dbc76 Mon Sep 17 00:00:00 2001 From: spolitan <59452587+stefanopolitano@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:50:44 +0100 Subject: [PATCH 0737/1650] [PWGHF] Adding azimuthal info of D and Xic (#10548) Co-authored-by: ALICE Action Bot --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 82 ++++++++++++++++++++++-- 1 file changed, 75 insertions(+), 7 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 7c79e56010b..862b4910c72 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -46,7 +46,10 @@ enum DecayChannel { DplusToPiKPi = 0, D0ToPiK, D0ToKPi, LcToPKPi, - LcToPiKP }; + LcToPiKP, + XicToPKPi, + XicToPiKP +}; enum QvecEstimator { FV0A = 0, FT0M, @@ -66,6 +69,7 @@ struct HfTaskFlowCharmHadrons { Configurable storeEP{"storeEP", false, "Flag to store EP-related axis"}; Configurable storeMl{"storeMl", false, "Flag to store ML scores"}; Configurable storeResoOccu{"storeResoOccu", false, "Flag to store Occupancy in resolution ThnSparse"}; + Configurable storeEpCosSin{"storeEpCosSin", false, "Flag to store cos and sin of EP angle in ThnSparse"}; Configurable occEstimator{"occEstimator", 0, "Occupancy estimation (0: None, 1: ITS, 2: FT0C)"}; Configurable saveEpResoHisto{"saveEpResoHisto", false, "Flag to save event plane resolution histogram"}; Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; @@ -75,6 +79,7 @@ struct HfTaskFlowCharmHadrons { ConfigurableAxis thnConfigAxisPt{"thnConfigAxisPt", {10, 0., 10.}, ""}; ConfigurableAxis thnConfigAxisCent{"thnConfigAxisCent", {10000, 0., 100.}, ""}; ConfigurableAxis thnConfigAxisCosNPhi{"thnConfigAxisCosNPhi", {100, -1., 1.}, ""}; + ConfigurableAxis thnConfigAxisPsi{"thnConfigAxisPsi", {6000, 2. * TMath::Pi(), 2. * TMath::Pi()}, ""}; ConfigurableAxis thnConfigAxisCosDeltaPhi{"thnConfigAxisCosDeltaPhi", {100, -1., 1.}, ""}; ConfigurableAxis thnConfigAxisScalarProd{"thnConfigAxisScalarProd", {100, 0., 1.}, ""}; ConfigurableAxis thnConfigAxisMlOne{"thnConfigAxisMlOne", {1000, 0., 1.}, ""}; @@ -96,6 +101,8 @@ struct HfTaskFlowCharmHadrons { using CandDplusData = soa::Filtered>; using CandLcData = soa::Filtered>; using CandLcDataWMl = soa::Filtered>; + using CandXicData = soa::Filtered>; + using CandXicDataWMl = soa::Filtered>; using CandD0DataWMl = soa::Filtered>; using CandD0Data = soa::Filtered>; using CollsWithQvecs = soa::Join; @@ -104,6 +111,7 @@ struct HfTaskFlowCharmHadrons { Filter filterSelectDplusCandidates = aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlag; Filter filterSelectD0Candidates = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlag || aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlag; Filter filterSelectLcCandidates = aod::hf_sel_candidate_lc::isSelLcToPKPi >= selectionFlag || aod::hf_sel_candidate_lc::isSelLcToPiKP >= selectionFlag; + Filter filterSelectXicCandidates = aod::hf_sel_candidate_xic::isSelXicToPKPi >= selectionFlag || aod::hf_sel_candidate_xic::isSelXicToPiKP >= selectionFlag; Partition selectedDsToKKPi = aod::hf_sel_candidate_ds::isSelDsToKKPi >= selectionFlag; Partition selectedDsToPiKK = aod::hf_sel_candidate_ds::isSelDsToPiKK >= selectionFlag; @@ -117,6 +125,10 @@ struct HfTaskFlowCharmHadrons { Partition selectedLcToPiKP = aod::hf_sel_candidate_lc::isSelLcToPiKP >= selectionFlag; Partition selectedLcToPKPiWMl = aod::hf_sel_candidate_lc::isSelLcToPKPi >= selectionFlag; Partition selectedLcToPiKPWMl = aod::hf_sel_candidate_lc::isSelLcToPiKP >= selectionFlag; + Partition selectedXicToPKPi = aod::hf_sel_candidate_xic::isSelXicToPKPi >= selectionFlag; + Partition selectedXicToPiKP = aod::hf_sel_candidate_xic::isSelXicToPiKP >= selectionFlag; + Partition selectedXicToPKPiWMl = aod::hf_sel_candidate_xic::isSelXicToPKPi >= selectionFlag; + Partition selectedXicToPiKPWMl = aod::hf_sel_candidate_xic::isSelXicToPiKP >= selectionFlag; SliceCache cache; HfHelper hfHelper; @@ -135,6 +147,8 @@ struct HfTaskFlowCharmHadrons { const AxisSpec thnAxisPt{thnConfigAxisPt, "#it{p}_{T} (GeV/#it{c})"}; const AxisSpec thnAxisCent{thnConfigAxisCent, "Centrality"}; const AxisSpec thnAxisCosNPhi{thnConfigAxisCosNPhi, Form("cos(%d#varphi)", harmonic.value)}; + const AxisSpec thnAxisSinNPhi{thnConfigAxisCosNPhi, Form("sin(%d#varphi)", harmonic.value)}; + const AxisSpec thnAxisPsi{thnConfigAxisPsi, Form("#Psi_{%d}", harmonic.value)}; const AxisSpec thnAxisCosDeltaPhi{thnConfigAxisCosDeltaPhi, Form("cos(%d(#varphi - #Psi_{sub}))", harmonic.value)}; const AxisSpec thnAxisScalarProd{thnConfigAxisScalarProd, "SP"}; const AxisSpec thnAxisMlOne{thnConfigAxisMlOne, "Bkg score"}; @@ -153,7 +167,7 @@ struct HfTaskFlowCharmHadrons { std::vector axes = {thnAxisInvMass, thnAxisPt, thnAxisCent, thnAxisScalarProd}; if (storeEP) { - axes.insert(axes.end(), {thnAxisCosNPhi, thnAxisCosDeltaPhi}); + axes.insert(axes.end(), {thnAxisCosNPhi, thnAxisSinNPhi, thnAxisCosDeltaPhi}); } if (storeMl) { axes.insert(axes.end(), {thnAxisMlOne, thnAxisMlTwo}); @@ -173,6 +187,10 @@ struct HfTaskFlowCharmHadrons { registry.add("trackOccVsFT0COcc", "trackOccVsFT0COcc; trackOcc; FT0COcc", {HistType::kTH2F, {thnAxisOccupancyITS, thnAxisOccupancyFT0C}}); } + if (storeEpCosSin) { + registry.add("ep/hSparseEp", "THn for Event Plane distirbution", {HistType::kTHnSparseF, {thnAxisCent, thnAxisPsi, thnAxisCosNPhi, thnAxisSinNPhi}}); + } + if (doprocessResolution) { // enable resolution histograms only for resolution process registry.add("spReso/hSpResoFT0cFT0a", "hSpResoFT0cFT0a; centrality; Q_{FT0c} #bullet Q_{FT0a}", {HistType::kTH2F, {thnAxisCent, thnAxisScalarProd}}); registry.add("spReso/hSpResoFT0cFV0a", "hSpResoFT0cFV0a; centrality; Q_{FT0c} #bullet Q_{FV0a}", {HistType::kTH2F, {thnAxisCent, thnAxisScalarProd}}); @@ -300,6 +318,7 @@ struct HfTaskFlowCharmHadrons { /// \param pt is the transverse momentum of the candidate /// \param cent is the centrality of the collision /// \param cosNPhi is the cosine of the n*phi angle + /// \param sinNPhi is the sine of the n*phi angle /// \param cosDeltaPhi is the cosine of the n*(phi - evtPl) angle /// \param sp is the scalar product /// \param outputMl are the ML scores @@ -309,6 +328,7 @@ struct HfTaskFlowCharmHadrons { float& pt, float& cent, float& cosNPhi, + float& sinNPhi, float& cosDeltaPhi, float& sp, std::vector& outputMl, @@ -319,7 +339,7 @@ struct HfTaskFlowCharmHadrons { std::vector evtSelFlags = getEventSelectionFlags(hfevselflag); if (storeMl) { if (storeEP) { - registry.fill(HIST("hSparseFlowCharm"), mass, pt, cent, sp, cosNPhi, cosDeltaPhi, outputMl[0], outputMl[1], occupancy, + registry.fill(HIST("hSparseFlowCharm"), mass, pt, cent, sp, cosNPhi, sinNPhi, cosDeltaPhi, outputMl[0], outputMl[1], occupancy, evtSelFlags[0], evtSelFlags[1], evtSelFlags[2], evtSelFlags[3], evtSelFlags[4]); } else { registry.fill(HIST("hSparseFlowCharm"), mass, pt, cent, sp, outputMl[0], outputMl[1], occupancy, @@ -327,7 +347,7 @@ struct HfTaskFlowCharmHadrons { } } else { if (storeEP) { - registry.fill(HIST("hSparseFlowCharm"), mass, pt, cent, sp, cosNPhi, cosDeltaPhi, occupancy, + registry.fill(HIST("hSparseFlowCharm"), mass, pt, cent, sp, cosNPhi, sinNPhi, cosDeltaPhi, occupancy, evtSelFlags[0], evtSelFlags[1], evtSelFlags[2], evtSelFlags[3], evtSelFlags[4]); } else { registry.fill(HIST("hSparseFlowCharm"), mass, pt, cent, sp, occupancy, @@ -337,13 +357,13 @@ struct HfTaskFlowCharmHadrons { } else { if (storeMl) { if (storeEP) { - registry.fill(HIST("hSparseFlowCharm"), mass, pt, cent, sp, cosNPhi, cosDeltaPhi, outputMl[0], outputMl[1]); + registry.fill(HIST("hSparseFlowCharm"), mass, pt, cent, sp, cosNPhi, sinNPhi, cosDeltaPhi, outputMl[0], outputMl[1]); } else { registry.fill(HIST("hSparseFlowCharm"), mass, pt, cent, sp, outputMl[0], outputMl[1]); } } else { if (storeEP) { - registry.fill(HIST("hSparseFlowCharm"), mass, pt, cent, sp, cosNPhi, cosDeltaPhi); + registry.fill(HIST("hSparseFlowCharm"), mass, pt, cent, sp, cosNPhi, sinNPhi, cosDeltaPhi); } else { registry.fill(HIST("hSparseFlowCharm"), mass, pt, cent, sp); } @@ -513,6 +533,25 @@ struct HfTaskFlowCharmHadrons { default: break; } + } else if constexpr (std::is_same_v || std::is_same_v) { + switch (channel) { + case DecayChannel::XicToPKPi: + massCand = hfHelper.invMassXicToPKPi(candidate); + if constexpr (std::is_same_v) { + for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) + outputMl[iclass] = candidate.mlProbXicToPKPi()[classMl->at(iclass)]; + } + break; + case DecayChannel::XicToPiKP: + massCand = hfHelper.invMassXicToPiKP(candidate); + if constexpr (std::is_same_v) { + for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) + outputMl[iclass] = candidate.mlProbXicToPiKP()[classMl->at(iclass)]; + } + break; + default: + break; + } } float ptCand = candidate.pt(); @@ -536,7 +575,7 @@ struct HfTaskFlowCharmHadrons { float scalprodCand = cosNPhi * xQVec + sinNPhi * yQVec; float cosDeltaPhi = std::cos(harmonic * (phiCand - evtPl)); - fillThn(massCand, ptCand, cent, cosNPhi, cosDeltaPhi, scalprodCand, outputMl, occupancy, hfevflag); + fillThn(massCand, ptCand, cent, cosNPhi, sinNPhi, cosDeltaPhi, scalprodCand, outputMl, occupancy, hfevflag); } } @@ -622,6 +661,28 @@ struct HfTaskFlowCharmHadrons { } PROCESS_SWITCH(HfTaskFlowCharmHadrons, processLc, "Process Lc candidates", false); + // Xic with ML + void processXicMl(CollsWithQvecs::iterator const& collision, + CandXicDataWMl const&) + { + auto candsXicToPKPiWMl = selectedXicToPKPiWMl->sliceByCached(aod::hf_cand::collisionId, collision.globalIndex(), cache); + auto candsXicToPiKPWMl = selectedXicToPiKPWMl->sliceByCached(aod::hf_cand::collisionId, collision.globalIndex(), cache); + runFlowAnalysis(collision, candsXicToPKPiWMl); + runFlowAnalysis(collision, candsXicToPiKPWMl); + } + PROCESS_SWITCH(HfTaskFlowCharmHadrons, processXicMl, "Process Xic candidates with ML", false); + + // Xic with rectangular cuts + void processXic(CollsWithQvecs::iterator const& collision, + CandXicData const&) + { + auto candsXicToPKPi = selectedXicToPKPi->sliceByCached(aod::hf_cand::collisionId, collision.globalIndex(), cache); + auto candsXicToPiKP = selectedXicToPiKP->sliceByCached(aod::hf_cand::collisionId, collision.globalIndex(), cache); + runFlowAnalysis(collision, candsXicToPKPi); + runFlowAnalysis(collision, candsXicToPiKP); + } + PROCESS_SWITCH(HfTaskFlowCharmHadrons, processXic, "Process Xic candidates", false); + // Resolution void processResolution(CollsWithQvecs::iterator const& collision, aod::BCsWithTimestamps const& bcs) @@ -705,6 +766,13 @@ struct HfTaskFlowCharmHadrons { registry.fill(HIST("epReso/hEpResoFV0aTPCtot"), centrality, std::cos(harmonic * getDeltaPsiInRange(epFV0a, epBTots))); registry.fill(HIST("epReso/hEpResoTPCposTPCneg"), centrality, std::cos(harmonic * getDeltaPsiInRange(epBPoss, epBNegs))); } + + if (storeEpCosSin) { + registry.fill(HIST("ep/hSparseEp"), centrality, + epHelper.GetEventPlane(xQVecFT0c, yQVecFT0c, harmonic), + std::cos(harmonic * epHelper.GetEventPlane(xQVecFT0c, yQVecFT0c, harmonic)), + std::sin(harmonic * epHelper.GetEventPlane(xQVecFT0c, yQVecFT0c, harmonic))); + } } PROCESS_SWITCH(HfTaskFlowCharmHadrons, processResolution, "Process resolution", false); From cc948fdfae476e305e10e7ef699467d30fb03132 Mon Sep 17 00:00:00 2001 From: altsybee Date: Tue, 18 Mar 2025 11:30:46 +0100 Subject: [PATCH 0738/1650] [DPG] Update timeDependentQa.cxx - adjusting binning for 2D histos (#10550) --- DPG/Tasks/AOTEvent/timeDependentQa.cxx | 79 ++++++++++++++++++-------- 1 file changed, 54 insertions(+), 25 deletions(-) diff --git a/DPG/Tasks/AOTEvent/timeDependentQa.cxx b/DPG/Tasks/AOTEvent/timeDependentQa.cxx index 0b70149a284..e742ee040fd 100644 --- a/DPG/Tasks/AOTEvent/timeDependentQa.cxx +++ b/DPG/Tasks/AOTEvent/timeDependentQa.cxx @@ -52,7 +52,8 @@ const AxisSpec axisSparseDcaR{100, -1., 1., "DCA_{r}, cm"}; const AxisSpec axisSparseDcaZ{100, -1., 1., "DCA_{z}, cm"}; struct TimeDependentQaTask { - Configurable confTimeBinWidthInSec{"TimeBinWidthInSec", 0.25, "Width of time bins in seconds"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confTimeBinWidthInSec{"TimeBinWidthInSec", 0.5, "Width of time bins in seconds"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confTimeWiderBinFactor{"TimeWideBinFactor", 4, "Factor for wider time bins for some 2D histograms"}; // o2-linter: disable=name/configurable (temporary fix) Configurable confTakeVerticesWithUPCsettings{"ConsiderVerticesWithUPCsettings", 0, "Take vertices: 0 - all , 1 - only without UPC settings, 2 - only with UPC settings"}; // o2-linter: disable=name/configurable (temporary fix) Configurable confFlagFillPhiVsTimeHist{"FlagFillPhiVsTimeHist", 2, "0 - don't fill , 1 - fill only for global/7cls/TRD/TOF tracks, 2 - fill also layer-by-layer"}; // o2-linter: disable=name/configurable (temporary fix) Configurable confFlagFillEtaPhiVsTimeHist{"FlagFillEtaPhiVsTimeHist", 0, "0 - don't fill , 1 - fill"}; // o2-linter: disable=name/configurable (temporary fix) @@ -179,9 +180,11 @@ struct TimeDependentQaTask { minSec = floor(tsSOR / 1000.); maxSec = ceil(tsEOR / 1000.); int nTimeBins = static_cast((maxSec - minSec) / confTimeBinWidthInSec); + int nTimeWideBins = static_cast((maxSec - minSec) / confTimeBinWidthInSec / confTimeWiderBinFactor); double timeInterval = nTimeBins * confTimeBinWidthInSec; const AxisSpec axisSeconds{nTimeBins, 0, timeInterval, "seconds"}; + const AxisSpec axisSecondsWideBins{nTimeWideBins, 0, timeInterval, "seconds"}; histos.add("hSecondsBCsTVX", "", kTH1D, {axisSeconds}); histos.add("hSecondsBCsTVXandTFborderCuts", "", kTH1D, {axisSeconds}); @@ -207,7 +210,7 @@ struct TimeDependentQaTask { // ### QA event selection bits int nEvSelBits = enNumEvSelBits; - histos.add("hSecondsEventSelBits", "", kTH2F, {axisSeconds, {nEvSelBits, -0.5, nEvSelBits - 0.5, "Monitoring of event selection bits"}}); + histos.add("hSecondsEventSelBits", "", kTH2F, {axisSecondsWideBins, {nEvSelBits, -0.5, nEvSelBits - 0.5, "Monitoring of event selection bits"}}); TAxis* axSelBits = reinterpret_cast(histos.get(HIST("hSecondsEventSelBits"))->GetYaxis()); axSelBits->SetBinLabel(1 + enCollisionsAll, "collisionsAll"); axSelBits->SetBinLabel(1 + enIsTriggerTVX, "IsTriggerTVX"); @@ -243,7 +246,7 @@ struct TimeDependentQaTask { // ### QA RCT flags int nRctFlagsTotal = enNumRctFlagsTotal; - histos.add("hSecondsRCTflags", "", kTH2F, {axisSeconds, {nRctFlagsTotal + 1, -0.5, nRctFlagsTotal + 1 - 0.5, "Monitoring of RCT flags"}}); + histos.add("hSecondsRCTflags", "", kTH2F, {axisSecondsWideBins, {nRctFlagsTotal + 1, -0.5, nRctFlagsTotal + 1 - 0.5, "Monitoring of RCT flags"}}); axRctFlags = reinterpret_cast(histos.get(HIST("hSecondsRCTflags"))->GetYaxis()); axRctFlags->SetBinLabel(1, "NcollisionsSel8"); axRctFlags->SetBinLabel(2 + kCPVBad, "CPVBad"); @@ -285,25 +288,25 @@ struct TimeDependentQaTask { const AxisSpec axisFraction{20, 0, 1., "Fraction shared cls Tpc"}; histos.add("allTracks/hSecondsTracks", "", kTH1D, {axisSeconds}); if (confFlagCheckQoverPtHist) { - histos.add("allTracks/hSecondsQoverPtSumDcaR", "", kTH2D, {axisSeconds, axisSparseQoverPt}); - histos.add("allTracks/hSecondsQoverPtSumDcaZ", "", kTH2D, {axisSeconds, axisSparseQoverPt}); + histos.add("allTracks/hSecondsQoverPtSumDcaR", "", kTH2D, {axisSecondsWideBins, axisSparseQoverPt}); + histos.add("allTracks/hSecondsQoverPtSumDcaZ", "", kTH2D, {axisSecondsWideBins, axisSparseQoverPt}); } histos.add("allTracks/hSecondsSumDcaR", "", kTH1D, {axisSeconds}); histos.add("allTracks/hSecondsSumDcaZ", "", kTH1D, {axisSeconds}); histos.add("allTracks/hSecondsSumPt", "", kTH1D, {axisSeconds}); - histos.add("allTracks/hSecondsNumClsIts", "", kTH2D, {axisSeconds, axisNclsITS}); + histos.add("allTracks/hSecondsNumClsIts", "", kTH1D, {axisSeconds}); + histos.add("allTracks/hSeconds2DNumClsIts", "", kTH2D, {axisSecondsWideBins, axisNclsITS}); histos.add("allTracks/hSecondsChi2NClIts", "", kTH1D, {axisSeconds}); if (confFlagCheckMshape) histos.add("allTracks/hSecondsTracksMshape", "", kTH1D, {axisSeconds}); // QA for PV contributors histos.add("PVcontrib/hSecondsTracks", "", kTH1D, {axisSeconds}); - // histos.add("PVcontrib/hSecondsQoverPtSumDcaR", "", kTH2D, {axisSeconds, axisSparseQoverPt}); - // histos.add("PVcontrib/hSecondsQoverPtSumDcaZ", "", kTH2D, {axisSeconds, axisSparseQoverPt}); histos.add("PVcontrib/hSecondsSumDcaR", "", kTH1D, {axisSeconds}); histos.add("PVcontrib/hSecondsSumDcaZ", "", kTH1D, {axisSeconds}); histos.add("PVcontrib/hSecondsSumPt", "", kTH1D, {axisSeconds}); - histos.add("PVcontrib/hSecondsNumClsIts", "", kTH2D, {axisSeconds, axisNclsITS}); + histos.add("PVcontrib/hSecondsNumClsIts", "", kTH1D, {axisSeconds}); + histos.add("PVcontrib/hSeconds2DNumClsIts", "", kTH2D, {axisSecondsWideBins, axisNclsITS}); histos.add("PVcontrib/hSecondsChi2NClIts", "", kTH1D, {axisSeconds}); // QA for global tracks @@ -311,17 +314,20 @@ struct TimeDependentQaTask { // global tracks histos.add("A/global/hSecondsNumTracks", "", kTH1D, {axisSeconds}); if (confFlagCheckQoverPtHist) { - histos.add("A/global/hSecondsQoverPtSumDcaR", "", kTH2D, {axisSeconds, axisSparseQoverPt}); - histos.add("A/global/hSecondsQoverPtSumDcaZ", "", kTH2D, {axisSeconds, axisSparseQoverPt}); + histos.add("A/global/hSecondsQoverPtSumDcaR", "", kTH2D, {axisSecondsWideBins, axisSparseQoverPt}); + histos.add("A/global/hSecondsQoverPtSumDcaZ", "", kTH2D, {axisSecondsWideBins, axisSparseQoverPt}); } histos.add("A/global/hSecondsSumDcaR", "", kTH1D, {axisSeconds}); histos.add("A/global/hSecondsSumDcaZ", "", kTH1D, {axisSeconds}); histos.add("A/global/hSecondsSumPt", "", kTH1D, {axisSeconds}); - histos.add("A/global/hSecondsNumClsIts", "", kTH2D, {axisSeconds, axisNclsITS}); + histos.add("A/global/hSecondsNumClsIts", "", kTH1D, {axisSeconds}); + histos.add("A/global/hSeconds2DNumClsIts", "", kTH2D, {axisSecondsWideBins, axisNclsITS}); histos.add("A/global/hSecondsChi2NClIts", "", kTH1D, {axisSeconds}); - histos.add("A/global/hSecondsNumClsTpc", "", kTH2D, {axisSeconds, axisNclsTPC}); + histos.add("A/global/hSecondsNumClsTpc", "", kTH1D, {axisSeconds}); + histos.add("A/global/hSeconds2DNumClsTpc", "", kTH2D, {axisSecondsWideBins, axisNclsTPC}); histos.add("A/global/hSecondsChi2NClTpc", "", kTH1D, {axisSeconds}); - histos.add("A/global/hSecondsTpcFractionSharedCls", "", kTH2D, {axisSeconds, axisFraction}); + histos.add("A/global/hSecondsTpcFractionSharedCls", "", kTH1D, {axisSeconds}); + histos.add("A/global/hSeconds2DTpcFractionSharedCls", "", kTH2D, {axisSecondsWideBins, axisFraction}); histos.add("A/global/hSecondsDeDx", "", kTH1D, {axisSeconds}); // global && PV tracks @@ -329,28 +335,34 @@ struct TimeDependentQaTask { histos.add("A/globalPV/hSecondsSumDcaR", "", kTH1D, {axisSeconds}); histos.add("A/globalPV/hSecondsSumDcaZ", "", kTH1D, {axisSeconds}); histos.add("A/globalPV/hSecondsSumPt", "", kTH1D, {axisSeconds}); - histos.add("A/globalPV/hSecondsNumClsIts", "", kTH2D, {axisSeconds, axisNclsITS}); + histos.add("A/globalPV/hSecondsNumClsIts", "", kTH1D, {axisSeconds}); + histos.add("A/globalPV/hSeconds2DNumClsIts", "", kTH2D, {axisSecondsWideBins, axisNclsITS}); histos.add("A/globalPV/hSecondsChi2NClIts", "", kTH1D, {axisSeconds}); - histos.add("A/globalPV/hSecondsNumClsTpc", "", kTH2D, {axisSeconds, axisNclsTPC}); + histos.add("A/globalPV/hSecondsNumClsTpc", "", kTH1D, {axisSeconds}); + histos.add("A/globalPV/hSeconds2DNumClsTpc", "", kTH2D, {axisSecondsWideBins, axisNclsTPC}); histos.add("A/globalPV/hSecondsChi2NClTpc", "", kTH1D, {axisSeconds}); - histos.add("A/globalPV/hSecondsTpcFractionSharedCls", "", kTH2D, {axisSeconds, axisFraction}); + histos.add("A/globalPV/hSecondsTpcFractionSharedCls", "", kTH1D, {axisSeconds}); + histos.add("A/globalPV/hSeconds2DTpcFractionSharedCls", "", kTH2D, {axisSecondsWideBins, axisFraction}); histos.add("A/globalPV/hSecondsDeDx", "", kTH1D, {axisSeconds}); // ### C side // global tracks histos.add("C/global/hSecondsNumTracks", "", kTH1D, {axisSeconds}); if (confFlagCheckQoverPtHist) { - histos.add("C/global/hSecondsQoverPtSumDcaR", "", kTH2D, {axisSeconds, axisSparseQoverPt}); - histos.add("C/global/hSecondsQoverPtSumDcaZ", "", kTH2D, {axisSeconds, axisSparseQoverPt}); + histos.add("C/global/hSecondsQoverPtSumDcaR", "", kTH2D, {axisSecondsWideBins, axisSparseQoverPt}); + histos.add("C/global/hSecondsQoverPtSumDcaZ", "", kTH2D, {axisSecondsWideBins, axisSparseQoverPt}); } histos.add("C/global/hSecondsSumDcaR", "", kTH1D, {axisSeconds}); histos.add("C/global/hSecondsSumDcaZ", "", kTH1D, {axisSeconds}); histos.add("C/global/hSecondsSumPt", "", kTH1D, {axisSeconds}); - histos.add("C/global/hSecondsNumClsIts", "", kTH2D, {axisSeconds, axisNclsITS}); + histos.add("C/global/hSecondsNumClsIts", "", kTH1D, {axisSeconds}); + histos.add("C/global/hSeconds2DNumClsIts", "", kTH2D, {axisSecondsWideBins, axisNclsITS}); histos.add("C/global/hSecondsChi2NClIts", "", kTH1D, {axisSeconds}); - histos.add("C/global/hSecondsNumClsTpc", "", kTH2D, {axisSeconds, axisNclsTPC}); + histos.add("C/global/hSecondsNumClsTpc", "", kTH1D, {axisSeconds}); + histos.add("C/global/hSeconds2DNumClsTpc", "", kTH2D, {axisSecondsWideBins, axisNclsTPC}); histos.add("C/global/hSecondsChi2NClTpc", "", kTH1D, {axisSeconds}); - histos.add("C/global/hSecondsTpcFractionSharedCls", "", kTH2D, {axisSeconds, axisFraction}); + histos.add("C/global/hSecondsTpcFractionSharedCls", "", kTH1D, {axisSeconds}); + histos.add("C/global/hSeconds2DTpcFractionSharedCls", "", kTH2D, {axisSecondsWideBins, axisFraction}); histos.add("C/global/hSecondsDeDx", "", kTH1D, {axisSeconds}); // global && PV tracks @@ -358,11 +370,14 @@ struct TimeDependentQaTask { histos.add("C/globalPV/hSecondsSumDcaR", "", kTH1D, {axisSeconds}); histos.add("C/globalPV/hSecondsSumDcaZ", "", kTH1D, {axisSeconds}); histos.add("C/globalPV/hSecondsSumPt", "", kTH1D, {axisSeconds}); - histos.add("C/globalPV/hSecondsNumClsIts", "", kTH2D, {axisSeconds, axisNclsITS}); + histos.add("C/globalPV/hSecondsNumClsIts", "", kTH1D, {axisSeconds}); + histos.add("C/globalPV/hSeconds2DNumClsIts", "", kTH2D, {axisSecondsWideBins, axisNclsITS}); histos.add("C/globalPV/hSecondsChi2NClIts", "", kTH1D, {axisSeconds}); - histos.add("C/globalPV/hSecondsNumClsTpc", "", kTH2D, {axisSeconds, axisNclsTPC}); + histos.add("C/globalPV/hSecondsNumClsTpc", "", kTH1D, {axisSeconds}); + histos.add("C/globalPV/hSeconds2DNumClsTpc", "", kTH2D, {axisSecondsWideBins, axisNclsTPC}); histos.add("C/globalPV/hSecondsChi2NClTpc", "", kTH1D, {axisSeconds}); - histos.add("C/globalPV/hSecondsTpcFractionSharedCls", "", kTH2D, {axisSeconds, axisFraction}); + histos.add("C/globalPV/hSecondsTpcFractionSharedCls", "", kTH1D, {axisSeconds}); + histos.add("C/globalPV/hSeconds2DTpcFractionSharedCls", "", kTH2D, {axisSecondsWideBins, axisFraction}); histos.add("C/globalPV/hSecondsDeDx", "", kTH1D, {axisSeconds}); // phi holes vs time @@ -558,6 +573,7 @@ struct TimeDependentQaTask { histos.fill(HIST("allTracks/hSecondsQoverPtSumDcaZ"), secFromSOR, qpt, dcaZabs); } histos.fill(HIST("allTracks/hSecondsNumClsIts"), secFromSOR, track.itsNCls()); + histos.fill(HIST("allTracks/hSeconds2DNumClsIts"), secFromSOR, track.itsNCls()); histos.fill(HIST("allTracks/hSecondsChi2NClIts"), secFromSOR, track.itsChi2NCl()); if (confFlagCheckMshape && isMshape) { histos.fill(HIST("allTracks/hSecondsTracksMshape"), secFromSOR); @@ -575,6 +591,7 @@ struct TimeDependentQaTask { // histos.fill(HIST("PVcontrib/hSecondsQoverPtSumDcaR"), secFromSOR, qpt, dcaRabs); // histos.fill(HIST("PVcontrib/hSecondsQoverPtSumDcaZ"), secFromSOR, qpt, dcaZabs); histos.fill(HIST("PVcontrib/hSecondsNumClsIts"), secFromSOR, track.itsNCls()); + histos.fill(HIST("PVcontrib/hSeconds2DNumClsIts"), secFromSOR, track.itsNCls()); histos.fill(HIST("PVcontrib/hSecondsChi2NClIts"), secFromSOR, track.itsChi2NCl()); } @@ -594,11 +611,14 @@ struct TimeDependentQaTask { histos.fill(HIST("A/global/hSecondsSumDcaZ"), secFromSOR, dcaZabs); histos.fill(HIST("A/global/hSecondsSumPt"), secFromSOR, track.pt()); histos.fill(HIST("A/global/hSecondsNumClsIts"), secFromSOR, track.itsNCls()); + histos.fill(HIST("A/global/hSeconds2DNumClsIts"), secFromSOR, track.itsNCls()); histos.fill(HIST("A/global/hSecondsChi2NClIts"), secFromSOR, track.itsChi2NCl()); histos.fill(HIST("A/global/hSecondsNumClsTpc"), secFromSOR, track.tpcNClsFound()); + histos.fill(HIST("A/global/hSeconds2DNumClsTpc"), secFromSOR, track.tpcNClsFound()); histos.fill(HIST("A/global/hSecondsChi2NClTpc"), secFromSOR, track.tpcChi2NCl()); if (track.tpcNClsFound() >= confCutOnNtpcClsForSharedFractAndDeDxCalc) { histos.fill(HIST("A/global/hSecondsTpcFractionSharedCls"), secFromSOR, track.tpcFractionSharedCls()); + histos.fill(HIST("A/global/hSeconds2DTpcFractionSharedCls"), secFromSOR, track.tpcFractionSharedCls()); if (dedx < 1.e4) // protection from weird values histos.fill(HIST("A/global/hSecondsDeDx"), secFromSOR, dedx); } @@ -612,11 +632,14 @@ struct TimeDependentQaTask { histos.fill(HIST("A/globalPV/hSecondsSumDcaZ"), secFromSOR, dcaZabs); histos.fill(HIST("A/globalPV/hSecondsSumPt"), secFromSOR, track.pt()); histos.fill(HIST("A/globalPV/hSecondsNumClsIts"), secFromSOR, track.itsNCls()); + histos.fill(HIST("A/globalPV/hSeconds2DNumClsIts"), secFromSOR, track.itsNCls()); histos.fill(HIST("A/globalPV/hSecondsChi2NClIts"), secFromSOR, track.itsChi2NCl()); histos.fill(HIST("A/globalPV/hSecondsNumClsTpc"), secFromSOR, track.tpcNClsFound()); + histos.fill(HIST("A/globalPV/hSeconds2DNumClsTpc"), secFromSOR, track.tpcNClsFound()); histos.fill(HIST("A/globalPV/hSecondsChi2NClTpc"), secFromSOR, track.tpcChi2NCl()); if (track.tpcNClsFound() >= confCutOnNtpcClsForSharedFractAndDeDxCalc) { histos.fill(HIST("A/globalPV/hSecondsTpcFractionSharedCls"), secFromSOR, track.tpcFractionSharedCls()); + histos.fill(HIST("A/globalPV/hSeconds2DTpcFractionSharedCls"), secFromSOR, track.tpcFractionSharedCls()); if (dedx < 1.e4) // protection from weird values histos.fill(HIST("A/globalPV/hSecondsDeDx"), secFromSOR, dedx); } @@ -634,11 +657,14 @@ struct TimeDependentQaTask { histos.fill(HIST("C/global/hSecondsSumDcaZ"), secFromSOR, dcaZabs); histos.fill(HIST("C/global/hSecondsSumPt"), secFromSOR, track.pt()); histos.fill(HIST("C/global/hSecondsNumClsIts"), secFromSOR, track.itsNCls()); + histos.fill(HIST("C/global/hSeconds2DNumClsIts"), secFromSOR, track.itsNCls()); histos.fill(HIST("C/global/hSecondsChi2NClIts"), secFromSOR, track.itsChi2NCl()); histos.fill(HIST("C/global/hSecondsNumClsTpc"), secFromSOR, track.tpcNClsFound()); + histos.fill(HIST("C/global/hSeconds2DNumClsTpc"), secFromSOR, track.tpcNClsFound()); histos.fill(HIST("C/global/hSecondsChi2NClTpc"), secFromSOR, track.tpcChi2NCl()); if (track.tpcNClsFound() >= confCutOnNtpcClsForSharedFractAndDeDxCalc) { histos.fill(HIST("C/global/hSecondsTpcFractionSharedCls"), secFromSOR, track.tpcFractionSharedCls()); + histos.fill(HIST("C/global/hSeconds2DTpcFractionSharedCls"), secFromSOR, track.tpcFractionSharedCls()); if (dedx < 1.e4) // protection from weird values histos.fill(HIST("C/global/hSecondsDeDx"), secFromSOR, dedx); } @@ -652,11 +678,14 @@ struct TimeDependentQaTask { histos.fill(HIST("C/globalPV/hSecondsSumDcaZ"), secFromSOR, dcaZabs); histos.fill(HIST("C/globalPV/hSecondsSumPt"), secFromSOR, track.pt()); histos.fill(HIST("C/globalPV/hSecondsNumClsIts"), secFromSOR, track.itsNCls()); + histos.fill(HIST("C/globalPV/hSeconds2DNumClsIts"), secFromSOR, track.itsNCls()); histos.fill(HIST("C/globalPV/hSecondsChi2NClIts"), secFromSOR, track.itsChi2NCl()); histos.fill(HIST("C/globalPV/hSecondsNumClsTpc"), secFromSOR, track.tpcNClsFound()); + histos.fill(HIST("C/globalPV/hSeconds2DNumClsTpc"), secFromSOR, track.tpcNClsFound()); histos.fill(HIST("C/globalPV/hSecondsChi2NClTpc"), secFromSOR, track.tpcChi2NCl()); if (track.tpcNClsFound() >= confCutOnNtpcClsForSharedFractAndDeDxCalc) { histos.fill(HIST("C/globalPV/hSecondsTpcFractionSharedCls"), secFromSOR, track.tpcFractionSharedCls()); + histos.fill(HIST("C/globalPV/hSeconds2DTpcFractionSharedCls"), secFromSOR, track.tpcFractionSharedCls()); if (dedx < 1.e4) // protection from weird values histos.fill(HIST("C/globalPV/hSecondsDeDx"), secFromSOR, dedx); } From b0f8031e055822b64a6a56de8e1652c245bf3353 Mon Sep 17 00:00:00 2001 From: Chiara Pinto <48326672+chiarapinto@users.noreply.github.com> Date: Tue, 18 Mar 2025 12:10:32 +0100 Subject: [PATCH 0739/1650] [PWGLF] change dcaxy histo ranges (#10551) --- PWGLF/Tasks/Nuspex/NucleiHistTask.cxx | 60 +++++++++++++-------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/NucleiHistTask.cxx b/PWGLF/Tasks/Nuspex/NucleiHistTask.cxx index ecc7607c4d0..055b869928a 100644 --- a/PWGLF/Tasks/Nuspex/NucleiHistTask.cxx +++ b/PWGLF/Tasks/Nuspex/NucleiHistTask.cxx @@ -141,9 +141,9 @@ struct NucleiHistTask { spectra_reg.add("histRecVtxZData", "collision z position", HistType::kTH1F, {{200, -20., +20., "z position (cm)"}}); spectra_reg.add("histTpcSignalData", "Specific energy loss", HistType::kTH2F, {{600, -6., 6., "#it{p*} (GeV/#it{c})"}, {5000, 0, 5000, "d#it{E} / d#it{X} (a. u.)"}}); spectra_reg.add("histTofSignalData", "TOF signal", HistType::kTH2F, {{600, -6., 6., "#it{p*} (GeV/#it{c})"}, {550, 0.0, 1.1, "#beta (TOF)"}}); - spectra_reg.add("histDcaVsPtData_particle", "dcaXY vs Pt (particle)", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + spectra_reg.add("histDcaVsPtData_particle", "dcaXY vs Pt (particle)", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); spectra_reg.add("histDcaZVsPtData_particle", "dcaZ vs Pt (particle)", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); - spectra_reg.add("histDcaVsPtData_antiparticle", "dcaXY vs Pt (antiparticle)", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + spectra_reg.add("histDcaVsPtData_antiparticle", "dcaXY vs Pt (antiparticle)", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); spectra_reg.add("histDcaZVsPtData_antiparticle", "dcaZ vs Pt (antiparticle)", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); spectra_reg.add("histTOFm2", "TOF m^2 vs P", HistType::kTH2F, {pAxis, {400, 0.0, 10.0, "m^2"}}); spectra_reg.add("histNClusterTPC", "Number of Clusters in TPC vs Pt", HistType::kTH2F, {ptAxis, {160, 0.0, 160.0, "nCluster"}}); @@ -159,9 +159,9 @@ struct NucleiHistTask { // histograms for pi⁺ pion_reg.add("histTpcSignalData", "Specific energy loss (#pi^{+})", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {5000, 0, 5000, "d#it{E} / d#it{X} (a. u.)"}}); pion_reg.add("histTofSignalData", "TOF signal (#pi^{+})", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {550, 0.0, 1.1, "#beta (TOF)"}}); - pion_reg.add("histDcaVsPtData", "dcaXY vs Pt (#pi^{+})", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + pion_reg.add("histDcaVsPtData", "dcaXY vs Pt (#pi^{+})", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); pion_reg.add("histDcaZVsPtData", "dcaZ vs Pt (#pi^{+})", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); - pion_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (#pi^{+}) after cut", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + pion_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (#pi^{+}) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); pion_reg.add("histDcaZVsPtData_after_cut", "dcaZ vs Pt (#pi^{+}) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); pion_reg.add("histTOFm2", "TOF m^2 vs Pt (#pi^{+})", HistType::kTH2F, {pAxis, {400, 0.0, 10.0, "m^2"}}); pion_reg.add("histTpcNsigmaData", "n-sigma TPC (#pi^{+})", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{#pi^{+}}"}}); @@ -181,9 +181,9 @@ struct NucleiHistTask { // histograms for pi⁻ apion_reg.add("histTpcSignalData", "Specific energy loss (#pi^{-})", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {5000, 0, 5000, "d#it{E} / d#it{X} (a. u.)"}}); apion_reg.add("histTofSignalData", "TOF signal (#pi^{-})", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {550, 0.0, 1.1, "#beta (TOF)"}}); - apion_reg.add("histDcaVsPtData", "dcaXY vs Pt (#pi^{-})", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + apion_reg.add("histDcaVsPtData", "dcaXY vs Pt (#pi^{-})", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); apion_reg.add("histDcaZVsPtData", "dcaZ vs Pt (#pi^{-})", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); - apion_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (#pi^{-}) after cut", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + apion_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (#pi^{-}) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); apion_reg.add("histDcaZVsPtData_after_cut", "dcaZ vs Pt (#pi^{-}) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); apion_reg.add("histTOFm2", "TOF m^2 vs Pt (#pi^{-})", HistType::kTH2F, {pAxis, {400, 0.0, 10.0, "m^2"}}); apion_reg.add("histTpcNsigmaData", "n-sigma TPC (#pi^{-})", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{#pi^{+}}"}}); @@ -203,9 +203,9 @@ struct NucleiHistTask { // histograms for Proton proton_reg.add("histTpcSignalData", "Specific energy loss (p)", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {5000, 0, 5000, "d#it{E} / d#it{X} (a. u.)"}}); proton_reg.add("histTofSignalData", "TOF signal (p)", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {550, 0.0, 1.1, "#beta (TOF)"}}); - proton_reg.add("histDcaVsPtData", "dcaXY vs Pt (p)", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + proton_reg.add("histDcaVsPtData", "dcaXY vs Pt (p)", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); proton_reg.add("histDcaZVsPtData", "dcaZ vs Pt (p)", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); - proton_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (p) after cut", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + proton_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (p) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); proton_reg.add("histDcaZVsPtData_after_cut", "dcaZ vs Pt (p) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); proton_reg.add("histTOFm2", "TOF m^2 vs Pt (p)", HistType::kTH2F, {pAxis, {400, 0.0, 10.0, "m^2"}}); proton_reg.add("histTpcNsigmaData", "n-sigma TPC (p)", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{p}"}}); @@ -225,9 +225,9 @@ struct NucleiHistTask { // histograms for antiProton aproton_reg.add("histTpcSignalData", "Specific energy loss (#bar{p})", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {5000, 0, 5000, "d#it{E} / d#it{X} (a. u.)"}}); aproton_reg.add("histTofSignalData", "TOF signal (#bar{p})", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {550, 0.0, 1.1, "#beta (TOF)"}}); - aproton_reg.add("histDcaVsPtData", "dcaXY vs Pt (#bar{p})", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + aproton_reg.add("histDcaVsPtData", "dcaXY vs Pt (#bar{p})", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); aproton_reg.add("histDcaZVsPtData", "dcaZ vs Pt (#bar{p})", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); - aproton_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (#bar{p}) after cut", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + aproton_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (#bar{p}) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); aproton_reg.add("histDcaZVsPtData_after_cut", "dcaZ vs Pt (#bar{p}) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); aproton_reg.add("histTOFm2", "TOF m^2 vs Pt (#bar{p})", HistType::kTH2F, {pAxis, {400, 0.0, 10.0, "m^2"}}); aproton_reg.add("histTpcNsigmaData", "n-sigma TPC (#bar{p})", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{#bar{p}}"}}); @@ -247,9 +247,9 @@ struct NucleiHistTask { // histograms for Deuterons deuteron_reg.add("histTpcSignalData", "Specific energy loss (d)", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {5000, 0, 5000, "d#it{E} / d#it{X} (a. u.)"}}); deuteron_reg.add("histTofSignalData", "TOF signal (d)", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {550, 0.0, 1.1, "#beta (TOF)"}}); - deuteron_reg.add("histDcaVsPtData", "dcaXY vs Pt (d)", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + deuteron_reg.add("histDcaVsPtData", "dcaXY vs Pt (d)", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); deuteron_reg.add("histDcaZVsPtData", "dcaZ vs Pt (d)", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); - deuteron_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (d) after cut", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + deuteron_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (d) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); deuteron_reg.add("histDcaZVsPtData_after_cut", "dcaZ vs Pt (d) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); deuteron_reg.add("histTOFm2", "TOF m^2 vs Pt (d)", HistType::kTH2F, {pAxis, {400, 0.0, 10.0, "m^2"}}); deuteron_reg.add("histTpcNsigmaData", "n-sigma TPC (d)", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{d}"}}); @@ -269,9 +269,9 @@ struct NucleiHistTask { // histograms for antiDeuterons adeuteron_reg.add("histTpcSignalData", "Specific energy loss (#bar{d})", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {5000, 0, 5000, "d#it{E} / d#it{X} (a. u.)"}}); adeuteron_reg.add("histTofSignalData", "TOF signal (#bar{d})", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {550, 0.0, 1.1, "#beta (TOF)"}}); - adeuteron_reg.add("histDcaVsPtData", "dcaXY vs Pt (#bar{d})", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + adeuteron_reg.add("histDcaVsPtData", "dcaXY vs Pt (#bar{d})", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); adeuteron_reg.add("histDcaZVsPtData", "dcaZ vs Pt (#bar{d})", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); - adeuteron_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (#bar{d}) after cut", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + adeuteron_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (#bar{d}) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); adeuteron_reg.add("histDcaZVsPtData_after_cut", "dcaZ vs Pt (#bar{d}) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); adeuteron_reg.add("histTOFm2", "TOF m^2 vs Pt (#bar{d})", HistType::kTH2F, {pAxis, {400, 0.0, 10.0, "m^2"}}); adeuteron_reg.add("histTpcNsigmaData", "n-sigma TPC (#bar{d})", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{#bar{d}}"}}); @@ -291,9 +291,9 @@ struct NucleiHistTask { // histograms for Triton triton_reg.add("histTpcSignalData", "Specific energy loss (t)", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {5000, 0, 5000, "d#it{E} / d#it{X} (a. u.)"}}); triton_reg.add("histTofSignalData", "TOF signal (t)", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {550, 0.0, 1.1, "#beta (TOF)"}}); - triton_reg.add("histDcaVsPtData", "dcaXY vs Pt (t)", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + triton_reg.add("histDcaVsPtData", "dcaXY vs Pt (t)", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); triton_reg.add("histDcaZVsPtData", "dcaZ vs Pt (t)", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); - triton_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (t) after cut", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + triton_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (t) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); triton_reg.add("histDcaZVsPtData_after_cut", "dcaZ vs Pt (t) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); triton_reg.add("histTOFm2", "TOF m^2 vs Pt (t)", HistType::kTH2F, {pAxis, {400, 0.0, 10.0, "m^2"}}); triton_reg.add("histTpcNsigmaData", "n-sigma TPC (t)", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{t}"}}); @@ -313,9 +313,9 @@ struct NucleiHistTask { // histograms for antiTriton atriton_reg.add("histTpcSignalData", "Specific energy loss (#bar{t})", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {5000, 0, 5000, "d#it{E} / d#it{X} (a. u.)"}}); atriton_reg.add("histTofSignalData", "TOF signal (#bar{t})", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {550, 0.0, 1.1, "#beta (TOF)"}}); - atriton_reg.add("histDcaVsPtData", "dcaXY vs Pt (#bar{t})", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + atriton_reg.add("histDcaVsPtData", "dcaXY vs Pt (#bar{t})", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); atriton_reg.add("histDcaZVsPtData", "dcaZ vs Pt (#bar{t})", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); - atriton_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (#bar{t}) after cut", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + atriton_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (#bar{t}) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); atriton_reg.add("histDcaZVsPtData_after_cut", "dcaZ vs Pt (#bar{t}) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); atriton_reg.add("histTOFm2", "TOF m^2 vs Pt (#bar{t})", HistType::kTH2F, {pAxis, {400, 0.0, 10.0, "m^2"}}); atriton_reg.add("histTpcNsigmaData", "n-sigma TPC (#bar{t})", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{#bar{t}}"}}); @@ -335,9 +335,9 @@ struct NucleiHistTask { // histograms for Helium-3 Helium3_reg.add("histTpcSignalData", "Specific energy loss (^{3}He)", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {5000, 0, 5000, "d#it{E} / d#it{X} (a. u.)"}}); Helium3_reg.add("histTofSignalData", "TOF signal (^{3}He)", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {550, 0.0, 1.1, "#beta (TOF)"}}); - Helium3_reg.add("histDcaVsPtData", "dcaXY vs Pt (^{3}He)", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + Helium3_reg.add("histDcaVsPtData", "dcaXY vs Pt (^{3}He)", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); Helium3_reg.add("histDcaZVsPtData", "dcaZ vs Pt (^{3}He)", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); - Helium3_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (^{3}He) after cut", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + Helium3_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (^{3}He) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); Helium3_reg.add("histDcaZVsPtData_after_cut", "dcaZ vs Pt (^{3}He) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); Helium3_reg.add("histTOFm2", "TOF m^2 vs Pt (^{3}He)", HistType::kTH2F, {pAxis, {400, 0.0, 10.0, "m^2"}}); Helium3_reg.add("histTpcNsigmaData", "n-sigma TPC (^{3}He)", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{^{3}He}"}}); @@ -357,9 +357,9 @@ struct NucleiHistTask { // histograms for antiHelium-3 aHelium3_reg.add("histTpcSignalData", "Specific energy loss (^{3}#bar{He})", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {5000, 0, 5000, "d#it{E} / d#it{X} (a. u.)"}}); aHelium3_reg.add("histTofSignalData", "TOF signal (^{3}#bar{He})", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {550, 0.0, 1.1, "#beta (TOF)"}}); - aHelium3_reg.add("histDcaVsPtData", "dcaXY vs Pt (^{3}#bar{He})", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + aHelium3_reg.add("histDcaVsPtData", "dcaXY vs Pt (^{3}#bar{He})", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); aHelium3_reg.add("histDcaZVsPtData", "dcaZ vs Pt (^{3}#bar{He})", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); - aHelium3_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (^{3}#bar{He}) after cut", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + aHelium3_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (^{3}#bar{He}) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); aHelium3_reg.add("histDcaZVsPtData_after_cut", "dcaZ vs Pt (^{3}#bar{He}) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); aHelium3_reg.add("histTOFm2", "TOF m^2 vs Pt (^{3}#bar{He})", HistType::kTH2F, {pAxis, {400, 0.0, 10.0, "m^2"}}); aHelium3_reg.add("histTpcNsigmaData", "n-sigma TPC (^{3}#bar{He})", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{^{3}He}"}}); @@ -379,9 +379,9 @@ struct NucleiHistTask { // histograms for Helium-4 (alpha) Helium4_reg.add("histTpcSignalData", "Specific energy loss (^{4}He)", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {5000, 0, 5000, "d#it{E} / d#it{X} (a. u.)"}}); Helium4_reg.add("histTofSignalData", "TOF signal (^{4}He)", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {550, 0.0, 1.1, "#beta (TOF)"}}); - Helium4_reg.add("histDcaVsPtData", "dcaXY vs Pt (^{4}He)", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + Helium4_reg.add("histDcaVsPtData", "dcaXY vs Pt (^{4}He)", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); Helium4_reg.add("histDcaZVsPtData", "dcaZ vs Pt (^{4}He)", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); - Helium4_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (^{4}He) after cut", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + Helium4_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (^{4}He) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); Helium4_reg.add("histDcaZVsPtData_after_cut", "dcaZ vs Pt (^{4}He) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); Helium4_reg.add("histTOFm2", "TOF m^2 vs Pt (^{4}He)", HistType::kTH2F, {pAxis, {400, 0.0, 10.0, "m^2"}}); Helium4_reg.add("histTpcNsigmaData", "n-sigma TPC (^{4}He)", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{^{4}He}"}}); @@ -401,9 +401,9 @@ struct NucleiHistTask { // histograms for antiHelium-4 (alpha) aHelium4_reg.add("histTpcSignalData", "Specific energy loss (^{4}#bar{He})", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {5000, 0, 5000, "d#it{E} / d#it{X} (a. u.)"}}); aHelium4_reg.add("histTofSignalData", "TOF signal (^{4}#bar{He})", HistType::kTH2F, {{600, 0., 6., "#it{p} (GeV/#it{c})"}, {550, 0.0, 1.1, "#beta (TOF)"}}); - aHelium4_reg.add("histDcaVsPtData", "dcaXY vs Pt (^{4}#bar{He})", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + aHelium4_reg.add("histDcaVsPtData", "dcaXY vs Pt (^{4}#bar{He})", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); aHelium4_reg.add("histDcaZVsPtData", "dcaZ vs Pt (^{4}#bar{He})", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); - aHelium4_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (^{4}#bar{He}) after cut", HistType::kTH2F, {ptAxis, {250, -0.5, 0.5, "dca"}}); + aHelium4_reg.add("histDcaVsPtData_after_cut", "dcaXY vs Pt (^{4}#bar{He}) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); aHelium4_reg.add("histDcaZVsPtData_after_cut", "dcaZ vs Pt (^{4}#bar{He}) after cut", HistType::kTH2F, {ptAxis, {1000, -2.0, 2.0, "dca"}}); aHelium4_reg.add("histTOFm2", "TOF m^2 vs Pt (^{4}#bar{He})", HistType::kTH2F, {pAxis, {400, 0.0, 10.0, "m^2"}}); aHelium4_reg.add("histTpcNsigmaData", "n-sigma TPC (^{4}#bar{He})", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{antiHe-4}"}}); @@ -433,7 +433,7 @@ struct NucleiHistTask { MC_recon_reg.add("histCentrality", "Centrality", HistType::kTH1F, {centralityAxis}); MC_recon_reg.add("histEta", "#eta", HistType::kTH2F, {{102, -2.01, 2.01}, PDGBINNING}); MC_recon_reg.add("histPt", "p_{t}", HistType::kTH2F, {ptAxis, PDGBINNING}); - MC_recon_reg.add("histDCA", "DCA xy", HistType::kTH3F, {ptAxis, {250, -0.5, 0.5, "dca"}, PDGBINNING}); + MC_recon_reg.add("histDCA", "DCA xy", HistType::kTH3F, {ptAxis, {1000, -2.0, 2.0, "dca"}, PDGBINNING}); MC_recon_reg.add("histDCAz", "DCA z", HistType::kTH3F, {ptAxis, {1000, -2.0, 2.0, "dca"}, PDGBINNING}); MC_recon_reg.add("histTpcSignalData", "Specific energy loss", HistType::kTH3F, {{600, -6., 6., "#it{p} (GeV/#it{c})"}, {5000, 0, 5000, "d#it{E} / d#it{X} (a. u.)"}, PDGBINNING}); MC_recon_reg.add("histTofSignalData", "TOF signal", HistType::kTH3F, {{600, -6., 6., "#it{p} (GeV/#it{c})"}, {550, 0.0, 1.1, "#beta (TOF)"}, PDGBINNING}); @@ -472,11 +472,11 @@ struct NucleiHistTask { MC_recon_reg.add("histTofNsigmaDataaAl", "TOF nSigma (^{4}#bar{He})", HistType::kTH2F, {pAxis, {160, -20., +20., "n#sigma_{^{4}He}"}}); MC_DCA.add("histEta", "#eta", HistType::kTH2F, {{204, -2.01, 2.01}, PDGBINNING}); - MC_DCA.add("histDCA_prim", "DCA xy", HistType::kTH3F, {ptAxis, {250, -0.5, 0.5, "dca"}, PDGBINNING}); + MC_DCA.add("histDCA_prim", "DCA xy", HistType::kTH3F, {ptAxis, {1000, -2.0, 2.0, "dca"}, PDGBINNING}); MC_DCA.add("histDCAz_prim", "DCA z", HistType::kTH3F, {ptAxis, {1000, -2.0, 2.0, "dca"}, PDGBINNING}); - MC_DCA.add("histDCA_weak", "DCA xy", HistType::kTH3F, {ptAxis, {250, -0.5, 0.5, "dca"}, PDGBINNING}); + MC_DCA.add("histDCA_weak", "DCA xy", HistType::kTH3F, {ptAxis, {1000, -2.0, 2.0, "dca"}, PDGBINNING}); MC_DCA.add("histDCAz_weak", "DCA z", HistType::kTH3F, {ptAxis, {1000, -2.0, 2.0, "dca"}, PDGBINNING}); - MC_DCA.add("histDCA_mat", "DCA xy", HistType::kTH3F, {ptAxis, {250, -0.5, 0.5, "dca"}, PDGBINNING}); + MC_DCA.add("histDCA_mat", "DCA xy", HistType::kTH3F, {ptAxis, {1000, -2.0, 2.0, "dca"}, PDGBINNING}); MC_DCA.add("histDCAz_mat", "DCA z", HistType::kTH3F, {ptAxis, {1000, -2.0, 2.0, "dca"}, PDGBINNING}); } From 18c562d1084eadfcdffa1d27504333729d685c8e Mon Sep 17 00:00:00 2001 From: Suraj Prasad Date: Tue, 18 Mar 2025 18:18:00 +0530 Subject: [PATCH 0740/1650] [PWGLF] Adding configurables for inv. mass endpoints (#10542) --- .../Strangeness/lambdak0sflattenicity.cxx | 64 ++++++++++--------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdak0sflattenicity.cxx b/PWGLF/Tasks/Strangeness/lambdak0sflattenicity.cxx index 4841ede993d..4114d614b90 100755 --- a/PWGLF/Tasks/Strangeness/lambdak0sflattenicity.cxx +++ b/PWGLF/Tasks/Strangeness/lambdak0sflattenicity.cxx @@ -101,10 +101,14 @@ struct Lambdak0sflattenicity { // Configurable for histograms Configurable nBinsVz{"nBinsVz", 100, "N bins in Vz"}; - Configurable nBinsK0sMass{"nBinsK0sMass", 200, "N bins in K0sMass"}; - Configurable nBinsLambdaMass{"nBinsLambdaMass", 200, + Configurable nBinsK0sMass{"nBinsK0sMass", 400, "N bins in K0sMass"}; + Configurable nBinsLambdaMass{"nBinsLambdaMass", 400, "N bins in LambdaMass"}; - Configurable nBinsXiMass{"nBinsXiMass", 200, "N bins in XiMass"}; + Configurable nBinsXiMass{"nBinsXiMass", 400, "N bins in XiMass"}; + + Configurable kK0sEPshiftfromMass{"kK0sEPshiftfromMass", 0.1, "distance of K0s Inv mass histogram start and end points from PDG mass"}; + Configurable kLambdaEPshiftfromMass{"kLambdaEPshiftfromMass", 0.05, "distance of Lambda Inv mass histogram start and end points from PDG mass"}; + Configurable kXiEPshiftfromMass{"kXiEPshiftfromMass", 0.05, "distance of Xi Inv mass histogram start and end points from PDG mass"}; Configurable nBinspT{"nBinspT", 250, "N bins in pT"}; Configurable nBinsFlattenicity{"nBinsFlattenicity", 100, "N bins in Flattenicity"}; @@ -215,13 +219,13 @@ struct Lambdak0sflattenicity { void init(InitContext const&) { // Axes - AxisSpec k0sMassAxis = {nBinsK0sMass, 0.45f, 0.55f, + AxisSpec k0sMassAxis = {nBinsK0sMass, 0.49f - kK0sEPshiftfromMass, 0.49f + kK0sEPshiftfromMass, "#it{M}_{#pi^{+}#pi^{-}} [GeV/#it{c}^{2}]"}; - AxisSpec lambdaMassAxis = {nBinsLambdaMass, 1.015f, 1.215f, + AxisSpec lambdaMassAxis = {nBinsLambdaMass, 1.115f - kLambdaEPshiftfromMass, 1.115f + kLambdaEPshiftfromMass, "#it{M}_{p#pi^{-}} [GeV/#it{c}^{2}]"}; - AxisSpec antilambdaMassAxis = {nBinsLambdaMass, 1.015f, 1.215f, + AxisSpec antilambdaMassAxis = {nBinsLambdaMass, 1.115f - kLambdaEPshiftfromMass, 1.115f + kLambdaEPshiftfromMass, "#it{M}_{#pi^{+}#bar{p}} [GeV/#it{c}^{2}]"}; - AxisSpec xiMassAxis = {nBinsXiMass, 1.3f, 1.34f, + AxisSpec xiMassAxis = {nBinsXiMass, 1.32f - kXiEPshiftfromMass, 1.32f + kXiEPshiftfromMass, "#it{M}_{#Lambda#pi} [GeV/#it{c}^{2}]"}; AxisSpec vertexZAxis = {nBinsVz, -15., 15., "vrtx_{Z} [cm]"}; AxisSpec ptAxis = {nBinspT, 0.0f, 25.0f, "#it{p}_{T} (GeV/#it{c})"}; @@ -1524,7 +1528,7 @@ struct Lambdak0sflattenicity { auto v0mcParticle = v0.mcParticle(); // Cut on dynamic columns for K0s - if (v0mcParticle.pdgCode() == 310 && v0.v0cosPA() >= v0settingCosPAK0s && + if (v0mcParticle.pdgCode() == PDG_t::kK0Short && v0.v0cosPA() >= v0settingCosPAK0s && v0.v0radius() >= v0settingRadiusK0s && std::abs(posDaughterTrack.tpcNSigmaPi()) <= nSigmaTPCPion && std::abs(negDaughterTrack.tpcNSigmaPi()) <= nSigmaTPCPion && @@ -1557,7 +1561,7 @@ struct Lambdak0sflattenicity { } // Cut on dynamic columns for Lambda - if (v0mcParticle.pdgCode() == 3122 && + if (v0mcParticle.pdgCode() == PDG_t::kLambda0 && v0.v0cosPA() >= v0settingCosPALambda && v0.v0radius() >= v0settingRadiusLambda && std::abs(posDaughterTrack.tpcNSigmaPr()) <= nSigmaTPCProton && @@ -1587,7 +1591,7 @@ struct Lambdak0sflattenicity { } // Cut on dynamic columns for AntiLambda - if (v0mcParticle.pdgCode() == -3122 && + if (v0mcParticle.pdgCode() == PDG_t::kLambda0Bar && v0.v0cosPA() >= v0settingCosPALambda && v0.v0radius() >= v0settingRadiusLambda && std::abs(posDaughterTrack.tpcNSigmaPi()) <= nSigmaTPCPion && @@ -1633,13 +1637,13 @@ struct Lambdak0sflattenicity { continue; } - if (mcParticle.pdgCode() == 310) { + if (mcParticle.pdgCode() == PDG_t::kK0Short) { rKzeroShort.fill(HIST("Generated_MCRecoCollCheck_INEL_K0Short"), mcParticle.pt(), flattenicity); // K0s } - if (mcParticle.pdgCode() == 3122) { + if (mcParticle.pdgCode() == PDG_t::kLambda0) { rLambda.fill(HIST("Generated_MCRecoCollCheck_INEL_Lambda"), mcParticle.pt(), flattenicity); // Lambda } - if (mcParticle.pdgCode() == -3122) { + if (mcParticle.pdgCode() == PDG_t::kLambda0Bar) { rAntiLambda.fill(HIST("Generated_MCRecoCollCheck_INEL_AntiLambda"), mcParticle.pt(), flattenicity); // AntiLambda } } @@ -1700,25 +1704,25 @@ struct Lambdak0sflattenicity { continue; } - if (mcParticle.pdgCode() == 310) { + if (mcParticle.pdgCode() == PDG_t::kK0Short) { rKzeroShort.fill(HIST("pGen_MCGenColl_INEL_K0Short"), mcParticle.pt(), flattenicity); // K0s if (isINELgt0true) { rKzeroShort.fill(HIST("pGen_MCGenColl_INELgt0_K0Short"), mcParticle.pt(), flattenicity); // K0s } } - if (mcParticle.pdgCode() == 3122) { + if (mcParticle.pdgCode() == PDG_t::kLambda0) { rLambda.fill(HIST("pGen_MCGenColl_INEL_Lambda"), mcParticle.pt(), flattenicity); // Lambda if (isINELgt0true) { rLambda.fill(HIST("pGen_MCGenColl_INELgt0_Lambda"), mcParticle.pt(), flattenicity); // Lambda } } - if (mcParticle.pdgCode() == -3122) { + if (mcParticle.pdgCode() == PDG_t::kLambda0Bar) { rAntiLambda.fill(HIST("pGen_MCGenColl_INEL_AntiLambda"), mcParticle.pt(), flattenicity); // AntiLambda if (isINELgt0true) { rAntiLambda.fill(HIST("pGen_MCGenColl_INELgt0_AntiLambda"), mcParticle.pt(), flattenicity); // AntiLambda } } - if (std::abs(mcParticle.pdgCode()) == 3312) { + if (std::abs(mcParticle.pdgCode()) == PDG_t::kXiPlusBar) { rXi.fill(HIST("pGen_MCGenColl_INEL_Xi"), mcParticle.pt(), flattenicity); // Xi if (isINELgt0true) { rXi.fill(HIST("pGen_MCGenColl_INELgt0_Xi"), mcParticle.pt(), flattenicity); // Xi @@ -1765,25 +1769,25 @@ struct Lambdak0sflattenicity { continue; } - if (mcParticle.pdgCode() == 310) { + if (mcParticle.pdgCode() == PDG_t::kK0Short) { rKzeroShort.fill(HIST("Generated_MCRecoColl_INEL_K0Short"), mcParticle.pt(), flattenicity); // K0s if (recoCollIndexINELgt0 > 0) { rKzeroShort.fill(HIST("Generated_MCRecoColl_INELgt0_K0Short"), mcParticle.pt(), flattenicity); // K0s } } - if (mcParticle.pdgCode() == 3122) { + if (mcParticle.pdgCode() == PDG_t::kLambda0) { rLambda.fill(HIST("Generated_MCRecoColl_INEL_Lambda"), mcParticle.pt(), flattenicity); // Lambda if (recoCollIndexINELgt0 > 0) { rLambda.fill(HIST("Generated_MCRecoColl_INELgt0_Lambda"), mcParticle.pt(), flattenicity); // Lambda } } - if (mcParticle.pdgCode() == -3122) { + if (mcParticle.pdgCode() == PDG_t::kLambda0Bar) { rAntiLambda.fill(HIST("Generated_MCRecoColl_INEL_AntiLambda"), mcParticle.pt(), flattenicity); // AntiLambda if (recoCollIndexINELgt0 > 0) { rAntiLambda.fill(HIST("Generated_MCRecoColl_INELgt0_AntiLambda"), mcParticle.pt(), flattenicity); // AntiLambda } } - if (std::abs(mcParticle.pdgCode()) == 3312) { + if (std::abs(mcParticle.pdgCode()) == PDG_t::kXiPlusBar) { rXi.fill(HIST("Generated_MCRecoColl_INEL_Xi"), mcParticle.pt(), flattenicity); // Xi if (recoCollIndexINELgt0 > 0) { rXi.fill(HIST("Generated_MCRecoColl_INELgt0_Xi"), mcParticle.pt(), flattenicity); // Xi @@ -1823,25 +1827,25 @@ struct Lambdak0sflattenicity { continue; } - if (mcParticle.pdgCode() == 310) { + if (mcParticle.pdgCode() == PDG_t::kK0Short) { rKzeroShort.fill(HIST("pGen_MCGenRecoColl_INEL_K0Short"), mcParticle.pt(), flattenicity); // K0s if (recoCollIndexINELgt0 > 0) { rKzeroShort.fill(HIST("pGen_MCGenRecoColl_INELgt0_K0Short"), mcParticle.pt(), flattenicity); // K0s } } - if (mcParticle.pdgCode() == 3122) { + if (mcParticle.pdgCode() == PDG_t::kLambda0) { rLambda.fill(HIST("pGen_MCGenRecoColl_INEL_Lambda"), mcParticle.pt(), flattenicity); // Lambda if (recoCollIndexINELgt0 > 0) { rLambda.fill(HIST("pGen_MCGenRecoColl_INELgt0_Lambda"), mcParticle.pt(), flattenicity); // Lambda } } - if (mcParticle.pdgCode() == -3122) { + if (mcParticle.pdgCode() == PDG_t::kLambda0Bar) { rAntiLambda.fill(HIST("pGen_MCGenRecoColl_INEL_AntiLambda"), mcParticle.pt(), flattenicity); // AntiLambda if (recoCollIndexINELgt0 > 0) { rAntiLambda.fill(HIST("pGen_MCGenRecoColl_INELgt0_AntiLambda"), mcParticle.pt(), flattenicity); // AntiLambda } } - if (std::abs(mcParticle.pdgCode()) == 3312) { + if (std::abs(mcParticle.pdgCode()) == PDG_t::kXiPlusBar) { rXi.fill(HIST("pGen_MCGenRecoColl_INEL_Xi"), mcParticle.pt(), flattenicity); // Xi if (recoCollIndexINELgt0 > 0) { rXi.fill(HIST("pGen_MCGenRecoColl_INELgt0_Xi"), mcParticle.pt(), flattenicity); // Xi @@ -1853,8 +1857,8 @@ struct Lambdak0sflattenicity { // Cascade Analysis Starts here using DauTracks = soa::Join; using LabeledCascades = soa::Join; - float ctauxiPDG = 4.91; // from PDG - float ctauomegaPDG = 2.461; // from PDG + // float ctauxiPDG = 4.91; // from PDG + // float ctauomegaPDG = 2.461; // from PDG void processDataRun3Cascade(soa::Join::iterator const& collision, @@ -1902,7 +1906,7 @@ struct Lambdak0sflattenicity { casc.dcapostopv() > v0settingDCApostopv && casc.dcanegtopv() > v0settingDCAnegtopv && casc.dcabachtopv() > v0settingDCAbactopv && casc.dcaV0daughters() < v0settingDCAv0dau && dcav0pv > cascsettingDCAv0toPV && casc.dcacascdaughters() < cascsettingDCAv0bach && casc.bachBaryonDCAxyToPV() < cascsettingDCAxybaryonbach && cosPAcasc > cascsettingCosPAcascPV && cosPAv0 > cascsettingCosPAv0PV && casc.cascradius() > cascsettingcascradius && casc.v0radius() > cascsettingv0radius && - std::abs(casc.yXi()) < cascsettingRapidity && ctauXi < ctauxiPDG * cascsettingproplifetime && + std::abs(casc.yXi()) < cascsettingRapidity && ctauXi < 4.91 * cascsettingproplifetime && std::abs(casc.mLambda() - pdgmassLambda) < cascsettingMassRejectionLambdaXi && std::abs(casc.mOmega() - pdgmassOmega) > cascsettingMassRejectioOmegaXi) { rXi.fill(HIST("hMassXiSelected"), massXi); @@ -1969,7 +1973,7 @@ struct Lambdak0sflattenicity { casc.dcapostopv() > v0settingDCApostopv && casc.dcanegtopv() > v0settingDCAnegtopv && casc.dcabachtopv() > v0settingDCAbactopv && casc.dcaV0daughters() < v0settingDCAv0dau && dcav0pv > cascsettingDCAv0toPV && casc.dcacascdaughters() < cascsettingDCAv0bach && casc.bachBaryonDCAxyToPV() < cascsettingDCAxybaryonbach && cosPAcasc > cascsettingCosPAcascPV && cosPAv0 > cascsettingCosPAv0PV && casc.cascradius() > cascsettingcascradius && casc.v0radius() > cascsettingv0radius && - std::abs(casc.yXi()) < cascsettingRapidity && ctauXi < ctauxiPDG * cascsettingproplifetime && + std::abs(casc.yXi()) < cascsettingRapidity && ctauXi < 4.91 * cascsettingproplifetime && std::abs(casc.mLambda() - pdgmassLambda) < cascsettingMassRejectionLambdaXi && std::abs(casc.mOmega() - pdgmassOmega) > cascsettingMassRejectioOmegaXi) { rXi.fill(HIST("hMassXiSelected"), massXi); @@ -1988,7 +1992,7 @@ struct Lambdak0sflattenicity { rEventSelection.fill(HIST("hFlattenicity_Corr_Gen_vs_Rec"), flattenicityMCGen, flattenicity); for (const auto& mcParticle : particlesInCollision) { - if (mcParticle.isPhysicalPrimary() && std::abs(mcParticle.y()) < 0.5f && std::abs(mcParticle.pdgCode()) == 3312) { + if (mcParticle.isPhysicalPrimary() && std::abs(mcParticle.y()) < 0.5f && std::abs(mcParticle.pdgCode()) == PDG_t::kXiPlusBar) { rXi.fill(HIST("Generated_MCRecoCollCheck_INEL_Xi"), mcParticle.pt(), flattenicity); // K0s } } From 689c1b12d30d76e7bec723ecdaf6951af3aa1f95 Mon Sep 17 00:00:00 2001 From: Noor Koster <82090643+cnkoster@users.noreply.github.com> Date: Tue, 18 Mar 2025 14:44:42 +0100 Subject: [PATCH 0741/1650] [PWGCF] Reversed sign for track.eta selection (#10552) --- PWGCF/Flow/Tasks/flowSP.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGCF/Flow/Tasks/flowSP.cxx b/PWGCF/Flow/Tasks/flowSP.cxx index cf92af61d3f..d867e865b0c 100644 --- a/PWGCF/Flow/Tasks/flowSP.cxx +++ b/PWGCF/Flow/Tasks/flowSP.cxx @@ -657,7 +657,7 @@ struct FlowSP { template bool trackSelected(TrackObject track, const int& field) { - if (std::fabs(track.eta()) < cfgEta) + if (std::fabs(track.eta()) > cfgEta) return false; registry.fill(HIST("hTrackCount"), trackSel_Eta); From 23f351eb0784bc6ce27486b65365a791cd6e2e5b Mon Sep 17 00:00:00 2001 From: ilikmeta <152337132+ilikmeta@users.noreply.github.com> Date: Tue, 18 Mar 2025 08:45:38 -0500 Subject: [PATCH 0742/1650] [PWGCF] Add UCC efficiencies (#10549) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/flowGfwTask.cxx | 37 ++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowGfwTask.cxx b/PWGCF/Flow/Tasks/flowGfwTask.cxx index c9f46203f14..b67cc49f6d6 100644 --- a/PWGCF/Flow/Tasks/flowGfwTask.cxx +++ b/PWGCF/Flow/Tasks/flowGfwTask.cxx @@ -104,7 +104,7 @@ struct FlowGfwTask { O2_DEFINE_CONFIGURABLE(cfgOccupancy, bool, false, "Bool for event selection on detector occupancy"); O2_DEFINE_CONFIGURABLE(cfgMultCut, bool, false, "Use additional event cut on mult correlations"); O2_DEFINE_CONFIGURABLE(cfgV0AT0A5Sigma, bool, false, "V0A T0A 5 sigma cut") - O2_DEFINE_CONFIGURABLE(cfgGlobalplusITS, bool, false, "Global and ITS tracks") + O2_DEFINE_CONFIGURABLE(cfgGlobalplusITS, bool, true, "Global and ITS tracks") O2_DEFINE_CONFIGURABLE(cfgGlobalonly, bool, false, "Global only tracks") O2_DEFINE_CONFIGURABLE(cfgITSonly, bool, false, "ITS only tracks") O2_DEFINE_CONFIGURABLE(cfgFineBinning, bool, false, "Manually change to fine binning") @@ -242,15 +242,15 @@ struct FlowGfwTask { bool isStable(int pdg) { - if (std::abs(pdg) == PDG_t::kPiPlus) + if (std::abs(pdg) == kPiPlus) return true; - if (std::abs(pdg) == PDG_t::kKPlus) + if (std::abs(pdg) == kKPlus) return true; - if (std::abs(pdg) == PDG_t::kProton) + if (std::abs(pdg) == kProton) return true; - if (std::abs(pdg) == PDG_t::kElectron) + if (std::abs(pdg) == kElectron) return true; - if (std::abs(pdg) == PDG_t::kMuonMinus) + if (std::abs(pdg) == kMuonMinus) return true; return false; } @@ -410,6 +410,9 @@ struct FlowGfwTask { registry.add("hPtMCRec", "Monte Carlo Reco; pT (GeV/c)", {HistType::kTH1D, {axisPt}}); registry.add("hCenMCRec", "Monte Carlo Reco; Centrality (%)", {HistType::kTH1D, {axisCentrality}}); registry.add("hPtNchMCRec", "Reco production; pT (GeV/c); Multiplicity", {HistType::kTH2D, {axisPt, axisNch}}); + registry.add("hPtMCRec05", "Monte Carlo Reco 0-5%; pT (GeV/c)", {HistType::kTH1D, {axisPt}}); + registry.add("hCenMCRec05", "Monte Carlo Reco 0-5%; Centrality (%)", {HistType::kTH1D, {axisCentrality}}); + registry.add("hPtNchMCRec05", "Reco production 0-5%; pT (GeV/c); Multiplicity", {HistType::kTH2D, {axisPt, axisNch}}); registry.add("Pt_pi", "", kTH2F, {{axisCentrality}, {axisPt}}); registry.add("Pt_ka", "", kTH2F, {{axisCentrality}, {axisPt}}); registry.add("Pt_pr", "", kTH2F, {{axisCentrality}, {axisPt}}); @@ -424,6 +427,9 @@ struct FlowGfwTask { registry.add("hPtMCGen", "Monte Carlo Truth; pT (GeV/c)", {HistType::kTH1D, {axisPt}}); registry.add("hCenMCGen", "Monte Carlo Truth; Centrality (%)", {HistType::kTH1D, {axisCentrality}}); registry.add("hPtNchMCGen", "Truth production; pT (GeV/c); multiplicity", {HistType::kTH2D, {axisPt, axisNch}}); + registry.add("hPtMCGen05", "Monte Carlo Truth 0-5%; pT (GeV/c)", {HistType::kTH1D, {axisPt}}); + registry.add("hCenMCGen05", "Monte Carlo Truth 0-5%; Centrality (%)", {HistType::kTH1D, {axisCentrality}}); + registry.add("hPtNchMCGen05", "Truth production 0-5%; pT (GeV/c); multiplicity", {HistType::kTH2D, {axisPt, axisNch}}); registry.add("PtMC_pi", "", kTH2F, {{axisCentrality}, {axisPt}}); registry.add("PtMC_ka", "", kTH2F, {{axisCentrality}, {axisPt}}); registry.add("PtMC_pr", "", kTH2F, {{axisCentrality}, {axisPt}}); @@ -1087,14 +1093,14 @@ struct FlowGfwTask { { // MC reconstructed for (const auto& collision : collisions) { - const auto& centrality = collision.centFT0C(); - if (!collision.sel8()) return; if (tracks.size() < 1) return; + const auto& centrality = collision.centFT0C(); + if (cfgUseAdditionalEventCut && !eventSelected(o2::aod::mult::MultNTracksPV(), collision, tracks.size(), centrality)) { return; } @@ -1118,10 +1124,17 @@ struct FlowGfwTask { const auto& particle = track.mcParticle(); if (isStable(particle.pdgCode())) { + registry.fill(HIST("hEventCounterMCRec"), 0.5); registry.fill(HIST("hPtMCRec"), track.pt()); registry.fill(HIST("hCenMCRec"), centrality); registry.fill(HIST("hPtNchMCRec"), track.pt(), track.size()); + + if (centrality >= 0 && centrality <= 5) { + registry.fill(HIST("hPtMCRec05"), track.pt()); + registry.fill(HIST("hCenMCRec05"), centrality); + registry.fill(HIST("hPtNchMCRec05"), track.pt(), track.size()); + } } registry.fill(HIST("Pt_all_ch"), centrality, track.pt()); @@ -1181,6 +1194,12 @@ struct FlowGfwTask { registry.fill(HIST("hPtMCGen"), particle.pt()); registry.fill(HIST("hCenMCGen"), centrality); + if (centrality >= 0 && centrality <= 5) { + registry.fill(HIST("hPtMCGen05"), particle.pt()); + registry.fill(HIST("hCenMCGen05"), centrality); + registry.fill(HIST("hPtNchMCGen05"), particle.pt(), numberOfTracks[0]); + } + if (collisions.size() > 0) { registry.fill(HIST("hPtNchMCGen"), particle.pt(), numberOfTracks[0]); } @@ -1210,7 +1229,7 @@ struct FlowGfwTask { } } } - PROCESS_SWITCH(FlowGfwTask, processpTEff, "Process pT Eff", false); + PROCESS_SWITCH(FlowGfwTask, processpTEff, "Process pT Eff", true); }; // End of struct From e22aa202cfda7d4469e81bd2ae6d3f04d26311ae Mon Sep 17 00:00:00 2001 From: Junlee Kim Date: Tue, 18 Mar 2025 14:09:33 +0000 Subject: [PATCH 0743/1650] [PWGLF] fix bug (#10553) --- PWGLF/Tasks/Strangeness/lambdalambda.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Strangeness/lambdalambda.cxx b/PWGLF/Tasks/Strangeness/lambdalambda.cxx index f51ddeb86c6..6cfe10f7b3e 100644 --- a/PWGLF/Tasks/Strangeness/lambdalambda.cxx +++ b/PWGLF/Tasks/Strangeness/lambdalambda.cxx @@ -295,7 +295,7 @@ struct lambdalambda { return false; if (getCPA(v01, v02) < cfgV0V0CPA) return false; - if (getDistance(v01, v02) < cfgV0V0Distance) + if (getDistance(v01, v02) > cfgV0V0Distance) return false; if (getRadius(v01, v02) > cfgV0V0Radius) return false; From a65dd724d2ea502c3a13a1ccfe829034cdae8d82 Mon Sep 17 00:00:00 2001 From: altsybee Date: Tue, 18 Mar 2025 17:24:27 +0100 Subject: [PATCH 0744/1650] [DPG] Update eventSelectionQa.cxx - add ROF border and occupancy QA, small updates and cleanups (#10558) --- DPG/Tasks/AOTEvent/eventSelectionQa.cxx | 249 +++++++++++++++++++----- 1 file changed, 202 insertions(+), 47 deletions(-) diff --git a/DPG/Tasks/AOTEvent/eventSelectionQa.cxx b/DPG/Tasks/AOTEvent/eventSelectionQa.cxx index de37d37c00b..002bc1eb614 100644 --- a/DPG/Tasks/AOTEvent/eventSelectionQa.cxx +++ b/DPG/Tasks/AOTEvent/eventSelectionQa.cxx @@ -32,6 +32,9 @@ #include "DataFormatsParameters/AggregatedRunInfo.h" #include "DataFormatsITSMFT/NoiseMap.h" // missing include in TimeDeadMap.h #include "DataFormatsITSMFT/TimeDeadMap.h" +#include "DataFormatsITSMFT/ROFRecord.h" +#include "ReconstructionDataFormats/Vertex.h" +#include "ITSMFTBase/DPLAlpideParam.h" #include "ITSMFTReconstruction/ChipMappingITS.h" #include "TH1F.h" #include "TH2F.h" @@ -61,6 +64,8 @@ struct EventSelectionQaTask { int64_t bcSOR = 0; // global bc of the start of the first orbit, setting 0 for unanchored MC int32_t nOrbitsPerTF = 128; // 128 in 2022, 32 in 2023, setting 128 for unanchored MC int64_t nBCsPerTF = nOrbitsPerTF * nBCsPerOrbit; // duration of TF in bcs + int rofOffset = -1; // ITS ROF offset, in bc + int rofLength = -1; // ITS ROF length, in bc std::bitset bcPatternA; std::bitset bcPatternC; @@ -282,17 +287,22 @@ struct EventSelectionQaTask { histos.add("hNcontribAccTRD", "", kTH1F, {axisNcontrib}); histos.add("hNcontribMisTOF", "", kTH1F, {axisNcontrib}); - histos.add("hMultT0MVsNcontribAcc", "", kTH2F, {axisMultT0M, axisNcontrib}); // before ITS RO Frame border cut - histos.add("hMultT0MVsNcontribCut", "", kTH2F, {axisMultT0M, axisNcontrib}); // after ITS RO Frame border cut + histos.add("hMultT0MVsNcontribTVX", "", kTH2F, {axisMultT0M, axisNcontrib}); // before ITS RO Frame border cut + histos.add("hMultT0MVsNcontribTVXTFcuts", "", kTH2F, {axisMultT0M, axisNcontrib}); // before ITS RO Frame border cut + histos.add("hMultT0MVsNcontribTVXROFcuts", "", kTH2F, {axisMultT0M, axisNcontrib}); // after ITS RO Frame border cut + histos.add("hMultT0MVsNcontribTVXTFROFcuts", "", kTH2F, {axisMultT0M, axisNcontrib}); // after ITS RO Frame border cut + // histos.add("hMultT0MVsNcontribAcc", "", kTH2F, {axisMultT0M, axisNcontrib}); // before ITS RO Frame border cut - histos.add("hMultV0AVsNcontribAcc", "", kTH2F, {axisMultV0A, axisNcontrib}); // before ITS RO Frame border cut - histos.add("hMultV0AVsNcontribCut", "", kTH2F, {axisMultV0A, axisNcontrib}); // after ITS RO Frame border cut - histos.add("hMultV0AVsNcontribAfterVertex", "", kTH2F, {axisMultV0A, axisNcontrib}); // after good vertex cut - histos.add("hMultV0AVsNcontribGood", "", kTH2F, {axisMultV0A, axisNcontrib}); // after pileup check + histos.add("hMultV0AVsNcontribTVX", "", kTH2F, {axisMultV0A, axisNcontrib}); // before ITS RO Frame border cut + histos.add("hMultV0AVsNcontribTVXTFcuts", "", kTH2F, {axisMultV0A, axisNcontrib}); // before ITS RO Frame border cut + histos.add("hMultV0AVsNcontribTVXROFcuts", "", kTH2F, {axisMultV0A, axisNcontrib}); // before ITS RO Frame border cut + histos.add("hMultV0AVsNcontribTVXTFROFcuts", "", kTH2F, {axisMultV0A, axisNcontrib}); // after ITS RO Frame border cut + histos.add("hMultV0AVsNcontribIsVertexITSTPC", "", kTH2F, {axisMultV0A, axisNcontrib}); // after good vertex cut + histos.add("hMultV0AVsNcontribGood", "", kTH2F, {axisMultV0A, axisNcontrib}); // after pileup check - histos.add("hBcForMultV0AVsNcontribAcc", "", kTH1F, {axisBCs}); // bc distribution for V0A-vs-Ncontrib accepted - histos.add("hBcForMultV0AVsNcontribOutliers", "", kTH1F, {axisBCs}); // bc distribution for V0A-vs-Ncontrib outliers - histos.add("hBcForMultV0AVsNcontribCut", "", kTH1F, {axisBCs}); // bc distribution for V0A-vs-Ncontrib after ITS-ROF border cut + // histos.add("hFoundBcForMultV0AVsNcontribAcc", "", kTH1F, {axisBCs}); // bc distribution for V0A-vs-Ncontrib accepted + histos.add("hFoundBcForMultV0AVsNcontribOutliers", "", kTH1F, {axisBCs}); // bc distribution for V0A-vs-Ncontrib outliers + histos.add("hFoundBcAfterROFborderCut", "", kTH1F, {axisBCs}); // bc distribution for V0A-vs-Ncontrib after ITS-ROF border cut histos.add("hVtxFT0VsVtxCol", "", kTH2F, {axisVtxZ, axisVtxZ}); // FT0-vertex vs z-vertex from collisions histos.add("hVtxFT0MinusVtxCol", "", kTH1F, {axisVtxZ}); // FT0-vertex minus z-vertex from collisions @@ -324,6 +334,29 @@ struct EventSelectionQaTask { histos.get(HIST("hColCounterAcc"))->GetXaxis()->SetBinLabel(i + 1, aliasLabels[i].data()); histos.get(HIST("hBcCounterAll"))->GetXaxis()->SetBinLabel(i + 1, aliasLabels[i].data()); } + + // ROF border QA + histos.add("ITSROFborderQA/hFoundBC_kTVX_counter_ITSTPCtracks", "", kTH1D, {axisBCs}); + histos.add("ITSROFborderQA/hFoundBC_kTVX_nITSlayers_for_ITSTPCtracks", "", kTH1D, {axisBCs}); + + // occupancy QA + if (!isLowFlux) { + histos.add("occupancyQA/hOccupancyByTracks", "", kTH1D, {{15002, -1.5, 15000.5}}); + histos.add("occupancyQA/hOccupancyByFT0C", "", kTH1D, {{15002, -20, 150000}}); + histos.add("occupancyQA/hOccupancyByFT0CvsByTracks", "", kTH2D, {{150, 0, 15000}, {150, 0, 150000}}); + + // 3D histograms: nGlobalTracks with cls567 as y-axis, V0A as x-axis: + const AxisSpec axisNtracks{160, -0.5, 4000 - 0.5, "n tracks"}; + const AxisSpec axisNtracksGlobal{120, -0.5, 3000 - 0.5, "n tracks"}; + const AxisSpec axisMultV0AForOccup{20, 0., static_cast(200000), "mult V0A"}; + const AxisSpec axisOccupancyTracks{150, 0., 15000, "occupancy (n ITS tracks weighted)"}; + histos.add("occupancyQA/hNumTracksPV_vs_V0A_vs_occupancy", "", kTH3F, {axisMultV0AForOccup, axisNtracks, axisOccupancyTracks}); + histos.add("occupancyQA/hNumTracksPVTPC_vs_V0A_vs_occupancy", "", kTH3F, {axisMultV0AForOccup, axisNtracksGlobal, axisOccupancyTracks}); + + histos.add("occupancyQA/hITSTracks_ev1_vs_ev2_2coll_in_ROF", ";nITStracks event #1;nITStracks event #2", kTH2D, {{200, 0., 6000}, {200, 0., 6000}}); + histos.add("occupancyQA/hITSTracks_ev1_vs_ev2_2coll_in_ROF_UPC", ";nITStracks event #1;nITStracks event #2", kTH2D, {{41, -0.5, 40.5}, {41, -0.5, 40.5}}); + histos.add("occupancyQA/hITSTracks_ev1_vs_ev2_2coll_in_ROF_nonUPC", ";nITStracks event #1;nITStracks event #2", kTH2D, {{200, 0., 6000}, {200, 0., 6000}}); + } } void processRun2( @@ -561,6 +594,13 @@ struct EventSelectionQaTask { // end-of-run timestamp tsEOR = runInfo.eor; + // extract ITS ROF parameters + int64_t ts = bcs.iteratorAt(0).timestamp(); + auto alppar = ccdb->getForTimeStamp>("ITS/Config/AlpideParam", ts); + rofOffset = alppar->roFrameBiasInBC; + rofLength = alppar->roFrameLengthInBC; + LOGP(debug, "rofOffset={} rofLength={}", rofOffset, rofLength); + // bc patterns auto grplhcif = ccdb->getForTimeStamp("GLO/Config/GRPLHCIF", (tsSOR + tsEOR) / 2); auto beamPatternA = grplhcif->getBunchFilling().getBeamPattern(0); @@ -669,6 +709,7 @@ struct EventSelectionQaTask { histos.add("hNcontribAfterCutsVsBcInTF", ";bc in TF; n vertex contributors", kTH1F, {axisBCinTF}); histos.add("hNcolMCVsBcInTF", ";bc in TF; n MC collisions", kTH1F, {axisBCinTF}); histos.add("hNcolVsBcInTF", ";bc in TF; n collisions", kTH1F, {axisBCinTF}); + histos.add("hNcolVsBcInTFafterTFborderCut", ";bc in TF; n collisions", kTH1F, {axisBCinTF}); histos.add("hNtvxVsBcInTF", ";bc in TF; n TVX triggers", kTH1F, {axisBCinTF}); double minSec = floor(tsSOR / 1000.); @@ -932,6 +973,10 @@ struct EventSelectionQaTask { } // collision-based event selection qa + std::vector vFoundGlobalBC(cols.size(), 0); // global BCs for collisions + std::vector vCollVz(cols.size(), 0); // vector with vZ positions for each collision + std::vector vIsSel8(cols.size(), 0); // vector with sel8 decisions + std::vector vTracksITS567perColl(cols.size(), 0); // counter of tracks per collision for occupancy studies for (const auto& col : cols) { for (int iAlias = 0; iAlias < kNaliases; iAlias++) { if (!col.alias_bit(iAlias)) { @@ -959,41 +1004,23 @@ struct EventSelectionQaTask { histos.fill(HIST("hOrbitAcc"), orbit - orbitSOR); } + int32_t colIndex = col.globalIndex(); + vFoundGlobalBC[colIndex] = globalBC; + vCollVz[colIndex] = col.posZ(); + vIsSel8[colIndex] = col.sel8(); + // search for nearest ft0a&ft0c entry int32_t indexClosestTVX = findClosest(globalBC, mapGlobalBcWithTVX); int bcDiff = static_cast(globalBC - vGlobalBCs[indexClosestTVX]); - // count tracks of different types - auto tracksGrouped = tracks.sliceBy(perCollision, col.globalIndex()); - int nContributorsAfterEtaTPCCuts = 0; - for (const auto& track : tracksGrouped) { - int trackBcDiff = bcDiff + track.trackTime() / o2::constants::lhc::LHCBunchSpacingNS; - if (!track.isPVContributor()) - continue; - if (std::fabs(track.eta()) < 0.8 && track.tpcNClsFound() > 80 && track.tpcNClsCrossedRows() > 100) - nContributorsAfterEtaTPCCuts++; - if (!track.hasTPC()) - histos.fill(HIST("hITStrackBcDiff"), trackBcDiff); - if (track.hasTOF()) { - histos.fill(HIST("hBcTrackTOF"), (globalBC + TMath::FloorNint(track.trackTime() / o2::constants::lhc::LHCBunchSpacingNS)) % nBCsPerOrbit); - } else if (track.hasTRD()) { - histos.fill(HIST("hBcTrackTRD"), (globalBC + TMath::Nint(track.trackTime() / o2::constants::lhc::LHCBunchSpacingNS)) % nBCsPerOrbit); - } - if (track.hasTOF() || track.hasTRD() || !track.hasITS() || !track.hasTPC() || track.pt() < 1) - continue; - histos.fill(HIST("hTrackBcDiffVsEta"), track.eta(), trackBcDiff); - if (track.eta() < -0.2 || track.eta() > 0.2) - continue; - histos.fill(HIST("hSecondsTVXvsBcDif"), bc.timestamp() / 1000., trackBcDiff); - } - int nContributors = col.numContrib(); float timeRes = col.collisionTimeRes(); int64_t bcInTF = (globalBC - bcSOR) % nBCsPerTF; histos.fill(HIST("hNcontribCol"), nContributors); histos.fill(HIST("hNcontribVsBcInTF"), bcInTF, nContributors); - histos.fill(HIST("hNcontribAfterCutsVsBcInTF"), bcInTF, nContributorsAfterEtaTPCCuts); histos.fill(HIST("hNcolVsBcInTF"), bcInTF); + if (col.selection_bit(kNoTimeFrameBorder)) + histos.fill(HIST("hNcolVsBcInTFafterTFborderCut"), bcInTF); histos.fill(HIST("hColBcDiffVsNcontrib"), nContributors, bcDiff); histos.fill(HIST("hColTimeResVsNcontrib"), nContributors, timeRes); if (!col.selection_bit(kIsVertexITSTPC)) { @@ -1076,10 +1103,64 @@ struct EventSelectionQaTask { histos.fill(HIST("hMultZNAcol"), multZNA); histos.fill(HIST("hMultZNCcol"), multZNC); + // count tracks of different types + auto tracksGrouped = tracks.sliceBy(perCollision, colIndex); + int nPV = 0; + int nContributorsAfterEtaTPCCuts = 0; + bool isTVX = col.selection_bit(kIsTriggerTVX); + for (const auto& track : tracksGrouped) { + int trackBcDiff = bcDiff + track.trackTime() / o2::constants::lhc::LHCBunchSpacingNS; + if (!track.isPVContributor()) + continue; + + if (track.itsNCls() >= 5) + vTracksITS567perColl[colIndex]++; + + // high-quality contributors for ROF border QA and occupancy study + if (isTVX && std::fabs(track.eta()) < 0.8 && track.pt() > 0.2 && track.itsNCls() >= 5) { + nPV++; + if (track.tpcNClsFound() > 70 && track.tpcNClsCrossedRows() > 80 && track.itsChi2NCl() < 36 && track.tpcChi2NCl() < 4) { + nContributorsAfterEtaTPCCuts++; + // ROF border QA + histos.fill(HIST("ITSROFborderQA/hFoundBC_kTVX_nITSlayers_for_ITSTPCtracks"), localBC, track.itsNCls()); + histos.fill(HIST("ITSROFborderQA/hFoundBC_kTVX_counter_ITSTPCtracks"), localBC); + } + } + if (!track.hasTPC()) + histos.fill(HIST("hITStrackBcDiff"), trackBcDiff); + if (track.hasTOF()) { + histos.fill(HIST("hBcTrackTOF"), (globalBC + TMath::FloorNint(track.trackTime() / o2::constants::lhc::LHCBunchSpacingNS)) % nBCsPerOrbit); + } else if (track.hasTRD()) { + histos.fill(HIST("hBcTrackTRD"), (globalBC + TMath::Nint(track.trackTime() / o2::constants::lhc::LHCBunchSpacingNS)) % nBCsPerOrbit); + } + if (track.hasTOF() || track.hasTRD() || !track.hasITS() || !track.hasTPC() || track.pt() < 1) + continue; + histos.fill(HIST("hTrackBcDiffVsEta"), track.eta(), trackBcDiff); + if (track.eta() < -0.2 || track.eta() > 0.2) + continue; + histos.fill(HIST("hSecondsTVXvsBcDif"), bc.timestamp() / 1000., trackBcDiff); + } // end of track loop + + histos.fill(HIST("hNcontribAfterCutsVsBcInTF"), bcInTF, nContributorsAfterEtaTPCCuts); + + if (!isLowFlux && col.sel8()) { + int occupancyByTracks = col.trackOccupancyInTimeRange(); + histos.fill(HIST("occupancyQA/hOccupancyByTracks"), occupancyByTracks); + float occupancyByFT0C = col.ft0cOccupancyInTimeRange(); + histos.fill(HIST("occupancyQA/hOccupancyByFT0C"), occupancyByFT0C); + if (occupancyByTracks >= 0) { + histos.fill(HIST("occupancyQA/hOccupancyByFT0CvsByTracks"), occupancyByTracks, occupancyByFT0C); + histos.fill(HIST("occupancyQA/hNumTracksPV_vs_V0A_vs_occupancy"), multV0A, nPV, occupancyByTracks); + histos.fill(HIST("occupancyQA/hNumTracksPVTPC_vs_V0A_vs_occupancy"), multV0A, nContributorsAfterEtaTPCCuts, occupancyByTracks); + } + } + // filling plots for events passing basic TVX selection - if (!col.selection_bit(kIsTriggerTVX)) { + if (!isTVX) { continue; } + histos.fill(HIST("hMultT0MVsNcontribTVX"), multT0A + multT0C, nContributors); + histos.fill(HIST("hMultV0AVsNcontribTVX"), multV0A, nContributors); // z-vertex from FT0 vs PV if (foundBC.has_ft0()) { @@ -1090,9 +1171,16 @@ struct EventSelectionQaTask { int foundLocalBC = foundBC.globalBC() % nBCsPerOrbit; + if (col.selection_bit(kNoITSROFrameBorder)) { + histos.fill(HIST("hMultT0MVsNcontribTVXROFcuts"), multT0A + multT0C, nContributors); + histos.fill(HIST("hMultV0AVsNcontribTVXROFcuts"), multV0A, nContributors); + } + if (col.selection_bit(kNoTimeFrameBorder)) { - histos.fill(HIST("hMultV0AVsNcontribAcc"), multV0A, nContributors); - histos.fill(HIST("hBcForMultV0AVsNcontribAcc"), foundLocalBC); + histos.fill(HIST("hMultT0MVsNcontribTVXTFcuts"), multT0A + multT0C, nContributors); + histos.fill(HIST("hMultV0AVsNcontribTVXTFcuts"), multV0A, nContributors); + + // histos.fill(HIST("hFoundBcForMultV0AVsNcontribAcc"), foundLocalBC); histos.fill(HIST("hFoundBc"), foundLocalBC); histos.fill(HIST("hFoundBcNcontrib"), foundLocalBC, nContributors); if (col.selection_bit(kIsVertexTOFmatched)) { @@ -1100,16 +1188,14 @@ struct EventSelectionQaTask { histos.fill(HIST("hFoundBcNcontribTOF"), foundLocalBC, nContributors); } if (nContributors < 0.043 * multV0A - 860) { - histos.fill(HIST("hBcForMultV0AVsNcontribOutliers"), foundLocalBC); + histos.fill(HIST("hFoundBcForMultV0AVsNcontribOutliers"), foundLocalBC); } if (col.selection_bit(kNoITSROFrameBorder)) { - histos.fill(HIST("hMultV0AVsNcontribCut"), multV0A, nContributors); - histos.fill(HIST("hBcForMultV0AVsNcontribCut"), foundLocalBC); - } - } + histos.fill(HIST("hMultT0MVsNcontribTVXTFROFcuts"), multT0A + multT0C, nContributors); + histos.fill(HIST("hMultV0AVsNcontribTVXTFROFcuts"), multV0A, nContributors); - if (col.selection_bit(kNoITSROFrameBorder)) { - histos.fill(HIST("hMultT0MVsNcontribCut"), multT0A + multT0C, nContributors); + histos.fill(HIST("hFoundBcAfterROFborderCut"), foundLocalBC); + } } // filling plots for accepted events @@ -1118,7 +1204,7 @@ struct EventSelectionQaTask { } if (col.selection_bit(kIsVertexITSTPC)) { - histos.fill(HIST("hMultV0AVsNcontribAfterVertex"), multV0A, nContributors); + histos.fill(HIST("hMultV0AVsNcontribIsVertexITSTPC"), multV0A, nContributors); if (col.selection_bit(kNoSameBunchPileup)) { histos.fill(HIST("hMultV0AVsNcontribGood"), multV0A, nContributors); } @@ -1128,7 +1214,7 @@ struct EventSelectionQaTask { histos.fill(HIST("hMultT0Mpup"), multT0A + multT0C); } - histos.fill(HIST("hMultT0MVsNcontribAcc"), multT0A + multT0C, nContributors); + // histos.fill(HIST("hMultT0MVsNcontribAcc"), multT0A + multT0C, nContributors); histos.fill(HIST("hTimeV0Aacc"), timeV0A); histos.fill(HIST("hTimeZNAacc"), timeZNA); histos.fill(HIST("hTimeZNCacc"), timeZNC); @@ -1145,9 +1231,78 @@ struct EventSelectionQaTask { histos.fill(HIST("hMultZNAacc"), multZNA); histos.fill(HIST("hMultZNCacc"), multZNC); histos.fill(HIST("hNcontribAcc"), nContributors); - } // collisions + // ### in-ROF occupancy QA + if (!isLowFlux) { + std::vector> vCollsInSameITSROF; + // save indices of collisions in same ROF + for (const auto& col : cols) { + int32_t colIndex = col.globalIndex(); + int64_t foundGlobalBC = vFoundGlobalBC[colIndex]; + int64_t tfId = (foundGlobalBC - bcSOR) / nBCsPerTF; + int64_t rofId = (foundGlobalBC + 3564 - rofOffset) / rofLength; + std::vector vAssocToSameROF; + // find all collisions in the same ROF before a given collision + int32_t minColIndex = colIndex - 1; + while (minColIndex >= 0) { + int64_t thisBC = vFoundGlobalBC[minColIndex]; + // check if this is still the same TF + int64_t thisTFid = (thisBC - bcSOR) / nBCsPerTF; + if (thisTFid != tfId) + break; + int64_t thisRofId = (thisBC + 3564 - rofOffset) / rofLength; + + // check if we are within the same ROF + if (thisRofId != rofId) + break; + vAssocToSameROF.push_back(minColIndex); + minColIndex--; + } + // find all collisions in the same ROF after the current one + int32_t maxColIndex = colIndex + 1; + while (maxColIndex < cols.size()) { + int64_t thisBC = vFoundGlobalBC[maxColIndex]; + int64_t thisTFid = (thisBC - bcSOR) / nBCsPerTF; + if (thisTFid != tfId) + break; + int64_t thisRofId = (thisBC + 3564 - rofOffset) / rofLength; + if (thisRofId != rofId) + break; + vAssocToSameROF.push_back(maxColIndex); + maxColIndex++; + } + vCollsInSameITSROF.push_back(vAssocToSameROF); + } // end of in-ROF occupancy 1st loop + + // nTrack correlations in ROFs with 2 collisions inside + for (const auto& col : cols) { + int32_t colIndex = col.globalIndex(); + if (!col.sel8() || !col.selection_bit(kNoSameBunchPileup)) + continue; + if (vCollsInSameITSROF[colIndex].size() != 1) // analyse only cases with 2 collisions in the same ROF + continue; + float vZ = col.posZ(); + float nPV = vTracksITS567perColl[colIndex]; + + ushort flags = col.flags(); + bool isVertexUPC = flags & dataformats::Vertex>::Flags::UPCMode; // is vertex with UPC settings + + // the second collision in ROF + std::vector vAssocToSameROF = vCollsInSameITSROF[colIndex]; + int thisColIndex = vAssocToSameROF[0]; + float vZassoc = vCollVz[thisColIndex]; // vZ of the second collision in the same ROF + float nPVassoc = vTracksITS567perColl[thisColIndex]; // n PV tracks of the second collision in the same ROF + if (std::fabs(vZ) < 10 && std::fabs(vZassoc) < 10 && thisColIndex > colIndex && vIsSel8[thisColIndex]) { + histos.fill(HIST("occupancyQA/hITSTracks_ev1_vs_ev2_2coll_in_ROF"), nPV, nPVassoc); + if (isVertexUPC) + histos.fill(HIST("occupancyQA/hITSTracks_ev1_vs_ev2_2coll_in_ROF_UPC"), nPV, nPVassoc); + else + histos.fill(HIST("occupancyQA/hITSTracks_ev1_vs_ev2_2coll_in_ROF_nonUPC"), nPV, nPVassoc); + } + } + } // end of in-ROF occupancy QA + // TVX efficiency after TF and ITS ROF border cuts for (const auto& col : cols) { if (!col.selection_bit(kNoTimeFrameBorder) || !col.selection_bit(kNoITSROFrameBorder)) From 01b0f2ef123a02665089cd008e2f5c93500a33e6 Mon Sep 17 00:00:00 2001 From: Chiara Pinto <48326672+chiarapinto@users.noreply.github.com> Date: Tue, 18 Mar 2025 17:49:12 +0100 Subject: [PATCH 0745/1650] [PWGLF] fix bug in histo definition (#10563) --- PWGLF/Tasks/Nuspex/antinucleiInJets.cxx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx index aa7715f67fb..b73fcdec818 100644 --- a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx +++ b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx @@ -261,13 +261,13 @@ struct AntinucleiInJets { } if (doprocessSystematicsEfficiency) { - registryMC.add("antiproton_incl_gen_syst", "antiproton_incl_gen_syst", HistType::kTHnSparseF, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {10, 0, 10, "systematic uncertainty"}}); - registryMC.add("antideuteron_incl_gen_syst", "antideuteron_incl_gen_syst", HistType::kTHnSparseF, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}, {10, 0, 10, "systematic uncertainty"}}); + registryMC.add("antiproton_incl_gen_syst", "antiproton_incl_gen_syst", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antideuteron_incl_gen_syst", "antideuteron_incl_gen_syst", HistType::kTH1F, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}}); registryMC.add("antiproton_incl_prim_syst", "antiproton_incl_prim_syst", HistType::kTHnSparseF, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {10, 0, 10, "systematic uncertainty"}}); - registryMC.add("antiproton_incl_rec_tpc_syst", "antiproton_incl_rec_tpc_syst", HistType::kTHnSparseF, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}, {10, 0, 10, "systematic uncertainty"}}); - registryMC.add("antiproton_incl_rec_tof_syst", "antiproton_incl_rec_tof_syst", HistType::kTHnSparseF, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TOF}"}, {10, 0, 10, "systematic uncertainty"}}); - registryMC.add("antideuteron_incl_rec_tpc_syst", "antideuteron_incl_rec_tpc_syst", HistType::kTHnSparseF, {{nbins, 2 * min, 2 * max, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}, {10, 0, 10, "systematic uncertainty"}}); - registryMC.add("antideuteron_incl_rec_tof_syst", "antideuteron_incl_rec_tof_syst", HistType::kTHnSparseF, {{nbins, 2 * min, 2 * max, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TOF}"}, {10, 0, 10, "systematic uncertainty"}}); + registryMC.add("antiproton_incl_rec_tpc_syst", "antiproton_incl_rec_tpc_syst", HistType::kTHnSparseF, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {10, 0, 10, "systematic uncertainty"}}); + registryMC.add("antiproton_incl_rec_tof_syst", "antiproton_incl_rec_tof_syst", HistType::kTHnSparseF, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {10, 0, 10, "systematic uncertainty"}}); + registryMC.add("antideuteron_incl_rec_tpc_syst", "antideuteron_incl_rec_tpc_syst", HistType::kTHnSparseF, {{nbins, 2 * min, 2 * max, "#it{p}_{T} (GeV/#it{c})"}, {10, 0, 10, "systematic uncertainty"}}); + registryMC.add("antideuteron_incl_rec_tof_syst", "antideuteron_incl_rec_tof_syst", HistType::kTHnSparseF, {{nbins, 2 * min, 2 * max, "#it{p}_{T} (GeV/#it{c})"}, {10, 0, 10, "systematic uncertainty"}}); } } From 1de27f67e8bab4a1aea5983ea489f47f3263ec07 Mon Sep 17 00:00:00 2001 From: suyoupeng <109774812+15071832337@users.noreply.github.com> Date: Wed, 19 Mar 2025 01:18:03 +0800 Subject: [PATCH 0746/1650] [PWGLF] Lambda local polarization induced by jet in pp collision 13.6 TeV (#10547) --- PWGLF/DataModel/lambdaJetpolarization.h | 4 ++ .../lambdaJetpolarizationbuilder.cxx | 13 +++-- .../Strangeness/lambdaJetpolarization.cxx | 52 +++++++++++++++++++ 3 files changed, 64 insertions(+), 5 deletions(-) diff --git a/PWGLF/DataModel/lambdaJetpolarization.h b/PWGLF/DataModel/lambdaJetpolarization.h index eb69f9e3b77..41bd7e26b15 100644 --- a/PWGLF/DataModel/lambdaJetpolarization.h +++ b/PWGLF/DataModel/lambdaJetpolarization.h @@ -67,6 +67,10 @@ DECLARE_SOA_TABLE(MyTable, "AOD", "MYTABLE", o2::soa::Index<>, myTable::MyCollisionId, myTable::MyCollisionV0, myTable::V0px, myTable::V0py, myTable::V0pz, myTable::V0pT, myTable::V0Lambdamass, myTable::V0protonpx, myTable::V0protonpy, myTable::V0protonpz); +DECLARE_SOA_TABLE(MyTableAnti, "AOD", "MYTABLEAnti", o2::soa::Index<>, + myTable::MyCollisionId, myTable::MyCollisionV0, myTable::V0px, myTable::V0py, myTable::V0pz, myTable::V0pT, myTable::V0Lambdamass, + myTable::V0protonpx, myTable::V0protonpy, myTable::V0protonpz); + DECLARE_SOA_TABLE(MyTableJet, "AOD", "MYTABLEJet", o2::soa::Index<>, myTable::MyCollisionId, myTable::MyCollisionJet, myTable::Jetpx, myTable::Jetpy, myTable::Jetpz, myTable::JetpT); diff --git a/PWGLF/TableProducer/Strangeness/lambdaJetpolarizationbuilder.cxx b/PWGLF/TableProducer/Strangeness/lambdaJetpolarizationbuilder.cxx index b28936d609c..6ed3673fb9c 100644 --- a/PWGLF/TableProducer/Strangeness/lambdaJetpolarizationbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/lambdaJetpolarizationbuilder.cxx @@ -40,6 +40,7 @@ using namespace o2::framework::expressions; struct myAnalysis { Produces myTable; + Produces myTableanti; Produces myTableJet; Produces outputCollisions; Produces outputCollisionsV0; @@ -95,7 +96,8 @@ struct myAnalysis { Configurable v0rejLambda{"v0rejLambda", 0.01, "V0 rej K0s"}; Configurable CtauLambda{"ctauLambda", 30, "C tau Lambda (cm)"}; Configurable ifpasslambda{"passedLambdaSelection", 1, "passedLambdaSelection"}; - Configurable ifpassantilambda{"passedANtiLambdaSelection", 1, "passedAntiLambdaSelection"}; + Configurable ifpassantilambda{"passedAntiLambdaSelection", 1, "passedAntiLambdaSelection"}; + Configurable ifinitpasslambda{"ifinitpasslambda", 0, "ifinitpasslambda"}; // Event Selection///////////////////////////////// Configurable cutzvertex{"cutzvertex", 10.0f, "Accepted z-vertex range (cm)"}; Configurable sel8{"sel8", 0, "Apply sel8 event selection"}; @@ -600,7 +602,7 @@ struct myAnalysis { JEhistos.fill(HIST("V0DCANegToPV"), v0.dcanegtopv()); JEhistos.fill(HIST("V0DCAPosToPV"), v0.dcapostopv()); JEhistos.fill(HIST("V0DCAV0Daughters"), v0.dcaV0daughters()); - } else if (passedInitLambdaSelection(v0, pos, neg)) { + } else if (passedInitLambdaSelection(v0, pos, neg) && ifinitpasslambda) { JEhistos.fill(HIST("hPt"), v0.pt()); JEhistos.fill(HIST("V0Radius"), v0.v0radius()); JEhistos.fill(HIST("CosPA"), v0.v0cosPA()); @@ -621,7 +623,7 @@ struct myAnalysis { JEhistos.fill(HIST("v0Lambdapz"), v0.pz()); myTable(outputCollisionsV0.lastIndex(), v0.collisionId(), v0.px(), v0.py(), v0.pz(), v0.pt(), v0.mLambda(), pos.px(), pos.py(), pos.pz()); JEhistos.fill(HIST("hV0Lambda"), nEventsV0, v0.px(), v0.py(), v0.pz(), v0.mLambda(), pos.px(), pos.py(), pos.pz()); - } else if (passedInitLambdaSelection(v0, pos, neg)) { + } else if (passedInitLambdaSelection(v0, pos, neg) && ifinitpasslambda) { V0LambdaNumbers = V0LambdaNumbers + 1; JEhistos.fill(HIST("hMassVsPtLambda"), v0.pt(), v0.mLambda()); JEhistos.fill(HIST("hMassLambda"), v0.mLambda()); @@ -635,7 +637,6 @@ struct myAnalysis { JEhistos.fill(HIST("hV0Lambda"), nEventsV0, v0.px(), v0.py(), v0.pz(), v0.mLambda(), pos.px(), pos.py(), pos.pz()); } if (passedAntiLambdaSelection(v0, pos, neg) && ifpassantilambda) { - JEhistos.fill(HIST("hMassVsPtAntiLambda"), v0.pt(), v0.mAntiLambda()); JEhistos.fill(HIST("hMassAntiLambda"), v0.mAntiLambda()); JEhistos.fill(HIST("TPCNSigmaPosPi"), pos.tpcNSigmaPi()); @@ -644,7 +645,8 @@ struct myAnalysis { JEhistos.fill(HIST("v0AntiLambdapx"), v0.px()); JEhistos.fill(HIST("v0AntiLambdapy"), v0.py()); JEhistos.fill(HIST("v0AntiLambdapz"), v0.pz()); - } else if (passedInitLambdaSelection(v0, pos, neg)) { + myTableanti(outputCollisionsV0.lastIndex(), v0.collisionId(), v0.px(), v0.py(), v0.pz(), v0.pt(), v0.mAntiLambda(), pos.px(), pos.py(), pos.pz()); + } else if (passedInitLambdaSelection(v0, pos, neg) && ifinitpasslambda) { JEhistos.fill(HIST("hMassVsPtAntiLambda"), v0.pt(), v0.mAntiLambda()); JEhistos.fill(HIST("hMassAntiLambda"), v0.mAntiLambda()); JEhistos.fill(HIST("TPCNSigmaPosPi"), pos.tpcNSigmaPi()); @@ -653,6 +655,7 @@ struct myAnalysis { JEhistos.fill(HIST("v0AntiLambdapx"), v0.px()); JEhistos.fill(HIST("v0AntiLambdapy"), v0.py()); JEhistos.fill(HIST("v0AntiLambdapz"), v0.pz()); + myTableanti(outputCollisionsV0.lastIndex(), v0.collisionId(), v0.px(), v0.py(), v0.pz(), v0.pt(), v0.mLambda(), pos.px(), pos.py(), pos.pz()); } } JEhistos.fill(HIST("V0Counts"), V0NumbersPerEvent); diff --git a/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx b/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx index 89851c88af7..ec63b8f01a0 100644 --- a/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx +++ b/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx @@ -50,6 +50,7 @@ struct LfMyV0s { registry.add("hMassLambda", "hMassLambda", {HistType::kTH1F, {{200, 0.9f, 1.2f}}}); registry.add("V0pTInLab", "V0pTInLab", kTH1F, {axisPT}); registry.add("hMassVsPtLambda", "hMassVsPtLambda", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {200, 1.016f, 1.216f}}}); + registry.add("hMassVsPtAntiLambda", "hMassVsPtAntiLambda", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {200, 1.016f, 1.216f}}}); registry.add("V0pxInLab", "V0pxInLab", kTH1F, {axisPx}); registry.add("V0pyInLab", "V0pyInLab", kTH1F, {axisPy}); @@ -84,13 +85,16 @@ struct LfMyV0s { registry.add("V0protonpyInJetV0frame", "V0protonpyInJetV0frame", kTH1F, {axisPy}); registry.add("V0protonpzInJetV0frame", "V0protonpzInJetV0frame", kTH1F, {axisPz}); registry.add("V0protonphiInJetV0frame", "V0protonphiInJetV0frame", kTH1F, {axisPhi}); + registry.add("V0antiprotonphiInJetV0frame", "V0antiprotonphiInJetV0frame", kTH1F, {axisPhi}); registry.add("V0LambdapxInJetV0frame", "V0LambdapxInJetV0frame", kTH1F, {axisPx}); registry.add("V0LambdapyInJetV0frame", "V0LambdapyInJetV0frame", kTH1F, {axisPy}); registry.add("V0LambdapzInJetV0frame", "V0LambdapzInJetV0frame", kTH1F, {axisPz}); registry.add("hLambdamassandSinPhi", "hLambdamassandSinPhi", kTH2F, {{200, 0.9, 1.2}, {200, -1, 1}}); + registry.add("hAntiLambdamassandSinPhi", "hAntiLambdamassandSinPhi", kTH2F, {{200, 0.9, 1.2}, {200, -1, 1}}); registry.add("profile", "Invariant Mass vs sin(phi)", {HistType::kTProfile, {{200, 0.9, 1.2}}}); + registry.add("profileAntiV0", "Invariant Mass vs sin(phi)", {HistType::kTProfile, {{200, 0.9, 1.2}}}); } double massPr = o2::constants::physics::MassProton; double massLambda = o2::constants::physics::MassLambda; @@ -264,6 +268,54 @@ struct LfMyV0s { } } PROCESS_SWITCH(LfMyV0s, processLeadingJetV0Analysis, "processLeadingJetV0Analysis", true); + + void processLeadingJetAntiV0Analysis(aod::MyTableAnti const& myv0s, aod::MyTableLeadingJet const& myleadingJets) + { + for (auto& LeadingJet : myleadingJets) { + int V0Numbers = 0; + double protonsinPhiInJetV0frame = 0; + for (auto& candidate : myv0s) { + if (candidate.mycollisionv0() == LeadingJet.mycollisionleadingjet()) { + V0Numbers = V0Numbers + 1; + double PLambda = sqrt(candidate.v0px() * candidate.v0px() + candidate.v0py() * candidate.v0py() + candidate.v0pz() * candidate.v0pz()); + double ELambda = sqrt(candidate.v0Lambdamass() * candidate.v0Lambdamass() + PLambda * PLambda); + double protonE = sqrt(massPr * massPr + candidate.v0protonpx() * candidate.v0protonpx() + candidate.v0protonpy() * candidate.v0protonpy() + candidate.v0protonpz() * candidate.v0protonpz()); + + TMatrixD pLabV0(4, 1); + pLabV0(0, 0) = ELambda; + pLabV0(1, 0) = candidate.v0px(); + pLabV0(2, 0) = candidate.v0py(); + pLabV0(3, 0) = candidate.v0pz(); + + TMatrixD lambdaInJet(4, 1); + lambdaInJet = MyTMatrixTranslationToJet(LeadingJet.leadingjetpx(), LeadingJet.leadingjetpy(), LeadingJet.leadingjetpz(), candidate.v0px(), candidate.v0py(), candidate.v0pz()) * pLabV0; + + TMatrixD lambdaInJetV0(4, 1); + lambdaInJetV0 = LorentzTransInV0frame(ELambda, lambdaInJet(1, 0), lambdaInJet(2, 0), lambdaInJet(3, 0)) * MyTMatrixTranslationToJet(LeadingJet.leadingjetpx(), LeadingJet.leadingjetpy(), LeadingJet.leadingjetpz(), candidate.v0px(), candidate.v0py(), candidate.v0pz()) * pLabV0; + + TMatrixD pLabproton(4, 1); + pLabproton(0, 0) = protonE; + pLabproton(1, 0) = candidate.v0protonpx(); + pLabproton(2, 0) = candidate.v0protonpy(); + pLabproton(3, 0) = candidate.v0protonpz(); + TMatrixD protonInJetV0(4, 1); + protonInJetV0 = LorentzTransInV0frame(ELambda, lambdaInJet(1, 0), lambdaInJet(2, 0), lambdaInJet(3, 0)) * MyTMatrixTranslationToJet(LeadingJet.leadingjetpx(), LeadingJet.leadingjetpy(), LeadingJet.leadingjetpz(), candidate.v0px(), candidate.v0py(), candidate.v0pz()) * pLabproton; + protonsinPhiInJetV0frame = protonsinPhiInJetV0frame + protonInJetV0(2, 0) / sqrt(protonInJetV0(1, 0) * protonInJetV0(1, 0) + protonInJetV0(2, 0) * protonInJetV0(2, 0)); + } + } + for (auto& candidate : myv0s) { + if (candidate.mycollisionv0() == LeadingJet.mycollisionleadingjet()) { + registry.fill(HIST("V0antiprotonphiInJetV0frame"), protonsinPhiInJetV0frame / V0Numbers); + registry.fill(HIST("hAntiLambdamassandSinPhi"), candidate.v0Lambdamass(), protonsinPhiInJetV0frame / V0Numbers); + registry.fill(HIST("profileAntiV0"), candidate.v0Lambdamass(), protonsinPhiInJetV0frame / V0Numbers); + } + } + } + for (auto& candidate : myv0s) { + registry.fill(HIST("hMassVsPtAntiLambda"), candidate.v0pt(), candidate.v0Lambdamass()); + } + } + PROCESS_SWITCH(LfMyV0s, processLeadingJetAntiV0Analysis, "processLeadingJetAntiV0Analysis", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 8443c218e76e9677ddeda781dda28e9fa3f93952 Mon Sep 17 00:00:00 2001 From: Gyula Bencedi Date: Tue, 18 Mar 2025 20:10:22 +0100 Subject: [PATCH 0747/1650] [PWGLF] PWGMM: Updated efficiency calculations (#10566) Co-authored-by: ALICE Action Bot --- PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx | 132 +++++++++++++---------------- 1 file changed, 61 insertions(+), 71 deletions(-) diff --git a/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx b/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx index c9e1f52e63e..6c4a6775b8e 100644 --- a/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx +++ b/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx @@ -522,15 +522,19 @@ struct DndetaMFTPbPb { "; p_{T} (GeV/c); #eta; occupancy", {HistType::kTHnSparseF, {ptAxis, etaAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/hPtEtaEffRec", + qaregistry.add({"Tracks/hPtEtaEffPrim", "; p_{T} (GeV/c); #eta; occupancy", {HistType::kTHnSparseF, {ptAxis, etaAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/hPtEtaEffDuplicates", + qaregistry.add({"Tracks/hPtEtaEffSec", "; p_{T} (GeV/c); #eta; occupancy", {HistType::kTHnSparseF, {ptAxis, etaAxis, occupancyAxis}}}); - qaregistry.add({"Tracks/hPtEtaEffGenDuplicates", + qaregistry.add({"Tracks/hPtEtaEffGenDupl", + "; p_{T} (GeV/c); #eta; occupancy", + {HistType::kTHnSparseF, + {ptAxis, etaAxis, occupancyAxis}}}); + qaregistry.add({"Tracks/hPtEtaEffDupl", "; p_{T} (GeV/c); #eta; occupancy", {HistType::kTHnSparseF, {ptAxis, etaAxis, occupancyAxis}}}); @@ -547,19 +551,25 @@ struct DndetaMFTPbPb { {HistType::kTHnSparseF, {ptAxis, etaAxis, centralityAxis, occupancyAxis}}}); qaregistry.add( - {"Tracks/Centrality/hPtEtaEffRec", + {"Tracks/Centrality/hPtEtaEffPrim", "; p_{T} (GeV/c); #eta; centrality; " "occupancy", {HistType::kTHnSparseF, {ptAxis, etaAxis, centralityAxis, occupancyAxis}}}); qaregistry.add( - {"Tracks/Centrality/hPtEtaEffDuplicates", + {"Tracks/Centrality/hPtEtaEffSec", "; p_{T} (GeV/c); #eta; Z_{vtx} (cm); centrality; " "occupancy", {HistType::kTHnSparseF, {ptAxis, etaAxis, centralityAxis, occupancyAxis}}}); qaregistry.add( - {"Tracks/Centrality/hPtEtaEffGenDuplicates", + {"Tracks/Centrality/hPtEtaEffGenDupl", + "; p_{T} (GeV/c); #eta; centrality; " + "occupancy", + {HistType::kTHnSparseF, + {ptAxis, etaAxis, centralityAxis, occupancyAxis}}}); + qaregistry.add( + {"Tracks/Centrality/hPtEtaEffDupl", "; p_{T} (GeV/c); #eta; centrality; " "occupancy", {HistType::kTHnSparseF, @@ -1702,31 +1712,6 @@ struct DndetaMFTPbPb { auto occrec = getOccupancy(collision, eventCuts.occupancyEstimator); auto mcCollision = collision.mcCollision(); - float cgen = -1; - if constexpr (has_reco_cent) { - float crec_min = 105.f; - for (const auto& collision : collisions) { - if (isGoodEvent(collision)) { - float c = getRecoCent(collision); - if (c < crec_min) { - crec_min = c; - } - } - } - if (cgen < 0) - cgen = crec_min; - } - - float occgen = -1.; - for (const auto& collision : collisions) { - if (isGoodEvent(collision)) { - float o = getOccupancy(collision, eventCuts.occupancyEstimator); - if (o > occgen) { - occgen = o; - } - } - } - auto partsPerCol = primariesI->sliceByCached( aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); partsPerCol.bindExternalIndices(&tracks); @@ -1738,68 +1723,73 @@ struct DndetaMFTPbPb { // MC gen if constexpr (has_reco_cent) { - qaregistry.fill(HIST("Tracks/Centrality/hPtEtaEffGen"), - particle.pt(), particle.eta(), - cgen, occgen); + if (particle.eta() > trackCuts.minEta && particle.eta() < trackCuts.maxEta) { + if (std::abs(mcCollision.posZ()) < eventCuts.maxZvtx) { + qaregistry.fill(HIST("Tracks/Centrality/hPtEtaEffGen"), particle.pt(), particle.eta(), crec, occrec); + } + } } else { - qaregistry.fill(HIST("Tracks/hPtEtaEffGen"), particle.pt(), - particle.eta(), - occgen); + if (particle.eta() > trackCuts.minEta && particle.eta() < trackCuts.maxEta) { + if (std::abs(mcCollision.posZ()) < eventCuts.maxZvtx) { + qaregistry.fill(HIST("Tracks/hPtEtaEffGen"), particle.pt(), particle.eta(), occrec); + } + } } // MC rec if (particle.has_mfttracks()) { auto iscounted = false; auto ncnt = 0; - auto relatedTracks = - particle.template mfttracks_as(); + auto relatedTracks = particle.template mfttracks_as(); for (auto const& track : relatedTracks) { - if (!isTrackSelected(track)) { - continue; - } ++ncnt; if constexpr (has_reco_cent) { - if (!iscounted) { // primaries - qaregistry.fill(HIST("Tracks/Centrality/hPtEtaEffRec"), - particle.pt(), particle.eta(), - crec, occrec); - iscounted = true; + if (track.eta() > trackCuts.minEta && track.eta() < trackCuts.maxEta) { + if (!iscounted) { // primaries + if (std::abs(mcCollision.posZ()) < eventCuts.maxZvtx) { + qaregistry.fill(HIST("Tracks/Centrality/hPtEtaEffPrim"), particle.pt(), particle.eta(), crec, occrec); + } + iscounted = true; + } } - if (ncnt > 1) { // duplicates - qaregistry.fill( - HIST("Tracks/Centrality/hPtEtaEffDuplicates"), - particle.pt(), particle.eta(), - crec, occrec); + if (ncnt > 1) { // secondaries + if (track.eta() > trackCuts.minEta && track.eta() < trackCuts.maxEta) { + qaregistry.fill(HIST("Tracks/Centrality/hPtEtaEffSec"), particle.pt(), particle.eta(), crec, occrec); + } } } else { - if (!iscounted) { // primaries - qaregistry.fill(HIST("Tracks/hPtEtaEffRec"), - particle.pt(), particle.eta(), - occrec); - iscounted = true; + if (track.eta() > trackCuts.minEta && track.eta() < trackCuts.maxEta) { + if (!iscounted) { // primaries + if (std::abs(mcCollision.posZ()) < eventCuts.maxZvtx) { + qaregistry.fill(HIST("Tracks/hPtEtaEffPrim"), particle.pt(), particle.eta(), occrec); + } + iscounted = true; + } } - if (ncnt > 1) { // duplicates - qaregistry.fill(HIST("Tracks/hPtEtaEffDuplicates"), - particle.pt(), particle.eta(), - occrec); + if (ncnt > 1) { // secondaries + if (track.eta() > trackCuts.minEta && track.eta() < trackCuts.maxEta) { + qaregistry.fill(HIST("Tracks/hPtEtaEffSec"), particle.pt(), particle.eta(), occrec); + } } } } + if constexpr (has_reco_cent) { - qaregistry.fill(HIST("Tracks/Centrality/NmftTrkPerPart"), ncnt, - crec, occrec); + qaregistry.fill(HIST("Tracks/Centrality/NmftTrkPerPart"), ncnt, crec, occrec); } else { qaregistry.fill(HIST("Tracks/NmftTrkPerPart"), ncnt, occrec); } - if (relatedTracks.size() > 1) { + + if (relatedTracks.size() > 1) { // duplicates if constexpr (has_reco_cent) { - qaregistry.fill( - HIST("Tracks/Centrality/hPtEtaEffGenDuplicates"), - particle.pt(), particle.eta(), - crec, occrec); + qaregistry.fill(HIST("Tracks/Centrality/hPtEtaEffGenDupl"), particle.pt(), particle.eta(), crec, occrec); + for (auto const& track : relatedTracks) { + qaregistry.fill(HIST("Tracks/Centrality/hPtEtaEffDupl"), track.pt(), track.eta(), crec, occrec); + } } else { - qaregistry.fill(HIST("Tracks/hPtEtaEffGenDuplicates"), - particle.pt(), particle.eta(), - occrec); + qaregistry.fill(HIST("Tracks/hPtEtaEffGenDupl"), particle.pt(), particle.eta(), occrec); + for (auto const& track : relatedTracks) { + qaregistry.fill(HIST("Tracks/hPtEtaEffDupl"), track.pt(), track.eta(), occrec); + } } } } From 42dad97751213713eef637e57058ebb9e88292bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Tue, 18 Mar 2025 20:10:57 +0100 Subject: [PATCH 0748/1650] [PWGHF,Trigger] fix a small mistake of the 3pfemto in the HF filter task (#10555) --- EventFiltering/PWGHF/HFFilter.cxx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/EventFiltering/PWGHF/HFFilter.cxx b/EventFiltering/PWGHF/HFFilter.cxx index a8edb09fab1..b03c61c1276 100644 --- a/EventFiltering/PWGHF/HFFilter.cxx +++ b/EventFiltering/PWGHF/HFFilter.cxx @@ -1317,7 +1317,8 @@ struct HfFilter { // Main struct for HF triggers } } } - } else if (isDeuteron && track.collisionId() == thisCollId) { + } + if (isDeuteron && track.collisionId() == thisCollId) { for (int iHypo{0}; iHypo < kNCharmParticles - 1 && !keepEvent[kFemto3P]; ++iHypo) { if (isCharmTagged[iHypo] && enableFemtoChannels->get(1u, iHypo + 1)) { float relativeMomentum = helper.computeRelativeMomentum(pVecFourth, pVec3Prong, massCharmHypos[iHypo]); From a544375f380f489f0d642c1e9c313f8e2b014cc6 Mon Sep 17 00:00:00 2001 From: Anantha Padmanabhan M Nair <82643666+ananthapadmanabhan18@users.noreply.github.com> Date: Wed, 19 Mar 2025 01:15:26 +0530 Subject: [PATCH 0749/1650] [PWGUD] Added new Process function and modified the tables (#10546) --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 1445 +++++++++++++++++++++-------- 1 file changed, 1067 insertions(+), 378 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index 7b23bfe2e7c..783c80c14eb 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -33,6 +33,7 @@ #include "Math/Vector3D.h" #include "Math/GenVector/Boost.h" #include "CommonConstants/PhysicsConstants.h" +#include "TPDGCode.h" using namespace std; using namespace o2; @@ -44,24 +45,40 @@ namespace o2::aod { namespace branch { + +DECLARE_SOA_COLUMN(PosX, posX, double); +DECLARE_SOA_COLUMN(PosY, posY, double); +DECLARE_SOA_COLUMN(PosZ, posZ, double); + DECLARE_SOA_COLUMN(Fv0signal, fv0signal, double); DECLARE_SOA_COLUMN(Ft0asignal, ft0asignal, double); DECLARE_SOA_COLUMN(Ft0csignal, ft0csignal, double); DECLARE_SOA_COLUMN(Fddasignal, fddasignal, double); DECLARE_SOA_COLUMN(Fddcsignal, fddcsignal, double); +DECLARE_SOA_COLUMN(TimeFv0, timeFv0, double); +DECLARE_SOA_COLUMN(TimeFt0a, timeFt0a, double); +DECLARE_SOA_COLUMN(TimeFt0c, timeFt0c, double); +DECLARE_SOA_COLUMN(TimeFdda, timeFdda, double); +DECLARE_SOA_COLUMN(TimeFddc, timeFddc, double); + +DECLARE_SOA_COLUMN(TimeZna, timeZna, double); +DECLARE_SOA_COLUMN(TimeZnc, timeZnc, double); + DECLARE_SOA_COLUMN(Dcaxy, dcaxy, std::vector); DECLARE_SOA_COLUMN(Dcaz, dcaz, std::vector); +DECLARE_SOA_COLUMN(TpcNsigmaPi, tpcNsigmaPi, std::vector); DECLARE_SOA_COLUMN(TpcNsigmaKa, tpcNsigmaKa, std::vector); DECLARE_SOA_COLUMN(TpcNsigmaPr, tpcNsigmaPr, std::vector); -DECLARE_SOA_COLUMN(TpcNsigmaMu, tpcNsigmaMu, std::vector); DECLARE_SOA_COLUMN(TpcNsigmaEl, tpcNsigmaEl, std::vector); +DECLARE_SOA_COLUMN(TpcNsigmaMu, tpcNsigmaMu, std::vector); +DECLARE_SOA_COLUMN(TofNsigmaPi, tofNsigmaPi, std::vector); DECLARE_SOA_COLUMN(TofNsigmaKa, tofNsigmaKa, std::vector); DECLARE_SOA_COLUMN(TofNsigmaPr, tofNsigmaPr, std::vector); -DECLARE_SOA_COLUMN(TofNsigmaMu, tofNsigmaMu, std::vector); DECLARE_SOA_COLUMN(TofNsigmaEl, tofNsigmaEl, std::vector); +DECLARE_SOA_COLUMN(TofNsigmaMu, tofNsigmaMu, std::vector); DECLARE_SOA_COLUMN(TpcChi2, tpcChi2, std::vector); DECLARE_SOA_COLUMN(TpcNClsFindable, tpcNClsFindable, std::vector); @@ -69,84 +86,115 @@ DECLARE_SOA_COLUMN(ItsChi2, itsChi2, std::vector); DECLARE_SOA_COLUMN(PionPt, pionPt, std::vector); DECLARE_SOA_COLUMN(PionEta, pionEta, std::vector); +DECLARE_SOA_COLUMN(PionPhi, pionPhi, std::vector); DECLARE_SOA_COLUMN(PionRapidity, pionRapidity, std::vector); DECLARE_SOA_COLUMN(FourPionPt, fourPionPt, double); DECLARE_SOA_COLUMN(FourPionEta, fourPionEta, double); +DECLARE_SOA_COLUMN(FourPionPhi, fourPionPhi, double); DECLARE_SOA_COLUMN(FourPionRapidity, fourPionRapidity, double); + DECLARE_SOA_COLUMN(FourPionMass, fourPionMass, double); -DECLARE_SOA_COLUMN(FourPionPhi, fourPionPhi, double); DECLARE_SOA_COLUMN(FourPionPhiPair1, fourPionPhiPair1, double); DECLARE_SOA_COLUMN(FourPionPhiPair2, fourPionPhiPair2, double); DECLARE_SOA_COLUMN(FourPionCosThetaPair1, fourPionCosThetaPair1, double); DECLARE_SOA_COLUMN(FourPionCosThetaPair2, fourPionCosThetaPair2, double); } // namespace branch -DECLARE_SOA_TABLE(UDTree0c, "AOD", "UD0Charge", + +DECLARE_SOA_TABLE(SignalData, "AOD", "signalData", + branch::PosX, + branch::PosY, + branch::PosZ, branch::Fv0signal, branch::Ft0asignal, branch::Ft0csignal, branch::Fddasignal, branch::Fddcsignal, + branch::TimeFv0, + branch::TimeFt0a, + branch::TimeFt0c, + branch::TimeFdda, + branch::TimeFddc, + branch::TimeZna, + branch::TimeZnc, branch::Dcaxy, branch::Dcaz, + branch::TpcNsigmaPi, branch::TpcNsigmaKa, branch::TpcNsigmaPr, - branch::TpcNsigmaMu, branch::TpcNsigmaEl, + branch::TpcNsigmaMu, + branch::TofNsigmaPi, branch::TofNsigmaKa, branch::TofNsigmaPr, - branch::TofNsigmaMu, branch::TofNsigmaEl, + branch::TofNsigmaMu, branch::TpcChi2, branch::TpcNClsFindable, branch::ItsChi2, branch::PionPt, branch::PionEta, + branch::PionPhi, branch::PionRapidity, branch::FourPionPt, branch::FourPionEta, + branch::FourPionPhi, branch::FourPionRapidity, branch::FourPionMass, - branch::FourPionPhi, branch::FourPionPhiPair1, branch::FourPionPhiPair2, branch::FourPionCosThetaPair1, branch::FourPionCosThetaPair2); -DECLARE_SOA_TABLE(UDTreen0c, "AOD", "UDn0Charge", +DECLARE_SOA_TABLE(BkgroundData, "AOD", "bkgroundData", + branch::PosX, + branch::PosY, + branch::PosZ, branch::Fv0signal, branch::Ft0asignal, branch::Ft0csignal, branch::Fddasignal, branch::Fddcsignal, + branch::TimeFv0, + branch::TimeFt0a, + branch::TimeFt0c, + branch::TimeFdda, + branch::TimeFddc, + branch::TimeZna, + branch::TimeZnc, branch::Dcaxy, branch::Dcaz, + branch::TpcNsigmaPi, branch::TpcNsigmaKa, branch::TpcNsigmaPr, - branch::TpcNsigmaMu, branch::TpcNsigmaEl, + branch::TpcNsigmaMu, + branch::TofNsigmaPi, branch::TofNsigmaKa, branch::TofNsigmaPr, - branch::TofNsigmaMu, branch::TofNsigmaEl, + branch::TofNsigmaMu, branch::TpcChi2, branch::TpcNClsFindable, branch::ItsChi2, branch::PionPt, branch::PionEta, + branch::PionPhi, branch::PionRapidity, branch::FourPionPt, branch::FourPionEta, + branch::FourPionPhi, branch::FourPionRapidity, - branch::FourPionMass, - branch::FourPionPhi); + branch::FourPionMass); -DECLARE_SOA_TABLE(MCTree, "AOD", "MC0Charge", +DECLARE_SOA_TABLE(MCgen, "AOD", "MCgen", branch::PionPt, branch::PionEta, + branch::PionPhi, branch::PionRapidity, branch::FourPionPt, branch::FourPionEta, + branch::FourPionPhi, branch::FourPionRapidity, branch::FourPionMass, branch::FourPionPhiPair1, @@ -154,33 +202,46 @@ DECLARE_SOA_TABLE(MCTree, "AOD", "MC0Charge", branch::FourPionCosThetaPair1, branch::FourPionCosThetaPair2); -DECLARE_SOA_TABLE(MCUDTree, "AOD", "UDMC0Charge", +DECLARE_SOA_TABLE(SignalMCreco, "AOD", "SignalMCreco", + branch::PosX, + branch::PosY, + branch::PosZ, branch::Fv0signal, branch::Ft0asignal, branch::Ft0csignal, branch::Fddasignal, branch::Fddcsignal, + branch::TimeFv0, + branch::TimeFt0a, + branch::TimeFt0c, + branch::TimeFdda, + branch::TimeFddc, + branch::TimeZna, + branch::TimeZnc, branch::Dcaxy, branch::Dcaz, + branch::TpcNsigmaPi, branch::TpcNsigmaKa, branch::TpcNsigmaPr, - branch::TpcNsigmaMu, branch::TpcNsigmaEl, + branch::TpcNsigmaMu, + branch::TofNsigmaPi, branch::TofNsigmaKa, branch::TofNsigmaPr, - branch::TofNsigmaMu, branch::TofNsigmaEl, + branch::TofNsigmaMu, branch::TpcChi2, branch::TpcNClsFindable, branch::ItsChi2, branch::PionPt, branch::PionEta, + branch::PionPhi, branch::PionRapidity, branch::FourPionPt, branch::FourPionEta, + branch::FourPionPhi, branch::FourPionRapidity, branch::FourPionMass, - branch::FourPionPhi, branch::FourPionPhiPair1, branch::FourPionPhiPair2, branch::FourPionCosThetaPair1, @@ -190,29 +251,27 @@ DECLARE_SOA_TABLE(MCUDTree, "AOD", "UDMC0Charge", ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// struct ExclusiveRhoTo4Pi { SGSelector sgSelector; - int kPiPlus = 211; - int kPiMinus = -211; - int kRhoPrime1700 = 30113; - Produces zeroChargeEventsData; - Produces nonzeroChargeEventsData; - Produces zeroChargeEventsMCgen; - Produces zeroChargeEventsMCreco; + int rhoPrime = 30113; + uint16_t numPVContrib = 4; + Produces sigFromData; + Produces bkgFromData; + Produces generatedMC; + Produces sigFromMC; HistogramRegistry histosData{"histosData", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry histosMCgen{"histosMCgen", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry histosMCreco{"histosMCreco", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry histosFast{"histosFast", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Configurable fv0Cut{"fv0Cut", 50., "FV0A threshold"}; Configurable ft0aCut{"ft0aCut", 150., "FT0A threshold"}; Configurable ft0cCut{"ft0cCut", 50., "FT0C threshold"}; - Configurable fddaCut{"fddaCut", 10000., "FDDA threshold"}; - Configurable fddcCut{"fddcCut", 10000., "FDDC threshold"}; Configurable zdcCut{"zdcCut", 1., "ZDC threshold"}; Configurable pvCut{"pvCut", 1.0, "Use Only PV tracks"}; Configurable dcaZcut{"dcaZcut", 2, "dcaZ cut"}; - Configurable dcaXYcut{"dcaXYcut", 0, "dcaXY cut (0 for Pt-function)"}; + Configurable dcaXYcut{"dcaXYcut", 0, "dcaXY cut"}; Configurable tpcChi2Cut{"tpcChi2Cut", 4, "Max tpcChi2NCl"}; Configurable tpcNClsFindableCut{"tpcNClsFindableCut", 70, "Min tpcNClsFindable"}; Configurable itsChi2Cut{"itsChi2Cut", 36, "Max itsChi2NCl"}; @@ -221,7 +280,6 @@ struct ExclusiveRhoTo4Pi { Configurable nSigmaTPCcut{"nSigmaTPCcut", 3, "TPC cut"}; Configurable nSigmaTOFcut{"nSigmaTOFcut", 3, "TOF cut"}; - Configurable strictEventSelection{"strictEventSelection", true, "Event Selection"}; Configurable nBinsPt{"nBinsPt", 1000, "Number of bins for pT"}; Configurable nBinsInvariantMass{"nBinsInvariantMass", 1000, "Number of bins for Invariant Mass"}; @@ -343,30 +401,34 @@ struct ExclusiveRhoTo4Pi { histosMCgen.add("rhoPrimeCounts", "Total Rho prime Events; Events", kTH1F, {{10, 0, 10}}); // Track Stuff - histosMCgen.add("MCgen_particle_pT", "Generated pT; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 10}}); - histosMCgen.add("MCgen_particle_pT_contributed", "Generated pT; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 10}}); - histosMCgen.add("MCgen_particle_rapidity", "Generated Rapidity; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); - histosMCgen.add("MCgen_particle_rapidity_contributed", "Generated Rapidity; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + histosMCgen.add("pion_pT", "Generated pT; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 10}}); + histosMCgen.add("pion_eta", "Generated Pseudorapidity; #eta; Events", kTH1F, {{1000, -2.5, 2.5}}); + histosMCgen.add("pion_rapidity", "Generated Rapidity; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); // Pair Invariant Mass - histosMCgen.add("MCgen_invMass_pair_1", "Invariant Mass Distribution of 2 pions 1 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); - histosMCgen.add("MCgen_invMass_pair_2", "Invariant Mass Distribution of 2 pions 2 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); - histosMCgen.add("MCgen_invMass_pair_3", "Invariant Mass Distribution of 2 pions 3 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); - histosMCgen.add("MCgen_invMass_pair_4", "Invariant Mass Distribution of 2 pions 4 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); + histosMCgen.add("twoPion_invMass_pair_1", "Invariant Mass Distribution of 2 pions 1 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); + histosMCgen.add("twoPion_invMass_pair_2", "Invariant Mass Distribution of 2 pions 2 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); + histosMCgen.add("twoPion_invMass_pair_3", "Invariant Mass Distribution of 2 pions 3 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); + histosMCgen.add("twoPion_invMass_pair_4", "Invariant Mass Distribution of 2 pions 4 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); // Generated Transverse Momentum, Rapidty and Invariant Mass - histosMCgen.add("MCgen_rhoPrime_pT", "Generated pT; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); - histosMCgen.add("MCgen_4pion_pT", "Generated pT; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); - histosMCgen.add("MCgen_4pion_rapidity", "Generated Rapidity; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); - histosMCgen.add("MCgen_4pion_invmass", "Invariant Mass of 4-Pions; m(4-pion); Events", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); + histosMCgen.add("rhoPrime_pT", "Generated pT; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); + histosMCgen.add("rhoPrime_eta", "Generated pT; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); + histosMCgen.add("rhoPrime_rapidity", "Generated pT; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); + histosMCgen.add("rhoPrime_invmass", "Generated pT; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); + + histosMCgen.add("fourPion_pT", "Generated pT; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); + histosMCgen.add("fourPion_eta", "Generated Pseudorapidity; #eta; Events", kTH1F, {{1000, -2.5, 2.5}}); + histosMCgen.add("fourPion_rapidity", "Generated Rapidity; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + histosMCgen.add("fourPion_invmass", "Invariant Mass of 4-Pions; m(4-pion); Events", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // Collin Soper Theta and Phi - histosMCgen.add("MCgen_CS_phi_pair_1", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); - histosMCgen.add("MCgen_CS_phi_pair_2", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); - histosMCgen.add("MCgen_CS_costheta_pair_1", "#theta Distribution;cos(#theta); Events", kTH1F, {{nBinsCosTheta, -1, 1}}); - histosMCgen.add("MCgen_CS_costheta_pair_2", "#theta Distribution;cos(#theta); Events", kTH1F, {{nBinsCosTheta, -1, 1}}); - histosMCgen.add("MCgen_phi_cosTheta_pair_1", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); - histosMCgen.add("MCgen_phi_cosTheta_pair_2", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); + histosMCgen.add("fourPion_phi_pair_1", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); + histosMCgen.add("fourPion_phi_pair_2", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); + histosMCgen.add("fourPion_costheta_pair_1", "#theta Distribution;cos(#theta); Events", kTH1F, {{nBinsCosTheta, -1, 1}}); + histosMCgen.add("fourPion_costheta_pair_2", "#theta Distribution;cos(#theta); Events", kTH1F, {{nBinsCosTheta, -1, 1}}); + histosMCgen.add("phi_cosTheta_pair_1", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); + histosMCgen.add("phi_cosTheta_pair_2", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); // MC Reco Stuff @@ -470,6 +532,11 @@ struct ExclusiveRhoTo4Pi { histosMCreco.add("phi_cosTheta_pair_1", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); histosMCreco.add("phi_cosTheta_pair_2", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); + histosFast.add("4PionMassWithCut", "", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); + histosFast.add("4PionMassFull", "", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); + histosFast.add("4PionPt", "", kTH1F, {{nBinsPt, 0, 10}}); + histosFast.add("4PionRapidity", "", kTH1F, {{nBinsRapidity, -1, 1}}); + } // End of init function //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -545,9 +612,8 @@ struct ExclusiveRhoTo4Pi { } int gapSide = collision.gapSide(); - float fitCuts[5] = {fv0Cut, ft0aCut, ft0cCut, fddaCut, fddcCut}; std::vector parameters = {pvCut, dcaZcut, dcaXYcut, tpcChi2Cut, tpcNClsFindableCut, itsChi2Cut, etaCut, pTcut}; - int truegapSide = sgSelector.trueGap(collision, fitCuts[0], fitCuts[1], fitCuts[2], zdcCut); + int truegapSide = sgSelector.trueGap(collision, fv0Cut, ft0aCut, ft0cCut, zdcCut); histosData.fill(HIST("GapSide"), gapSide); histosData.fill(HIST("TrueGapSide"), truegapSide); histosData.fill(HIST("EventCounts"), 1); @@ -556,6 +622,7 @@ struct ExclusiveRhoTo4Pi { if ((gapSide != 2)) { return; } + histosData.fill(HIST("vertexZ"), collision.posZ()); histosData.fill(HIST("V0A"), collision.totalFV0AmplitudeA()); histosData.fill(HIST("FT0A"), collision.totalFT0AmplitudeA()); @@ -563,14 +630,8 @@ struct ExclusiveRhoTo4Pi { histosData.fill(HIST("ZDC_A"), collision.energyCommonZNA()); histosData.fill(HIST("ZDC_C"), collision.energyCommonZNC()); - if (strictEventSelection) { - if (collision.numContrib() != 4) { - return; - } - } else { - if (collision.numContrib() >= 10) { - return; - } + if (collision.numContrib() != 4) { + return; } std::vector WOTS_tracks; @@ -661,34 +722,32 @@ struct ExclusiveRhoTo4Pi { return; } - std::vector pidcaXY; - std::vector pidcaZ; + // Selecting Events with net charge = 0 + if (numPionMinusTRacks == 2 && numPiPlusTracks == 2) { - std::vector tpcNsigKa; - std::vector tpcNsigPr; - std::vector tpcNsigEl; - std::vector tpcNsigMu; + std::vector dcaxy; + std::vector dcaz; - std::vector tofNsigKa; - std::vector tofNsigPr; - std::vector tofNsigEl; - std::vector tofNsigMu; + std::vector tpcnsigPi; + std::vector tpcnsigKa; + std::vector tpcnsigPr; + std::vector tpcnsigEl; + std::vector tpcnsigMu; - std::vector tpcchi2; - std::vector itschi2; - std::vector tpcNFindableCls; + std::vector tofnsigPi; + std::vector tofnsigKa; + std::vector tofnsigPr; + std::vector tofnsigEl; + std::vector tofnsigMu; - std::vector piPt; - std::vector piEta; - std::vector piRapidity; + std::vector tpcchi2; + std::vector tpcnclsfindable; + std::vector itschi2; - double fourPiPhiPair1 = 0; - double fourPiPhiPair2 = 0; - double fourPiCosThetaPair1 = 0; - double fourPiCosThetaPair2 = 0; - - // Selecting Events with net charge = 0 - if (numPionMinusTRacks == 2 && numPiPlusTracks == 2) { + std::vector pipt; + std::vector pieta; + std::vector piphi; + std::vector pirapidity; TLorentzVector p1, p2, p3, p4, p1234; ROOT::Math::PtEtaPhiMVector k1, k2, k3, k4, k1234, k13, k14, k23, k24; @@ -698,100 +757,115 @@ struct ExclusiveRhoTo4Pi { p3.SetXYZM(Pi_minus_tracks[0].px(), Pi_minus_tracks[0].py(), Pi_minus_tracks[0].pz(), o2::constants::physics::MassPionCharged); p4.SetXYZM(Pi_minus_tracks[1].px(), Pi_minus_tracks[1].py(), Pi_minus_tracks[1].pz(), o2::constants::physics::MassPionCharged); - pidcaXY.push_back(Pi_plus_tracks[0].dcaXY()); - pidcaXY.push_back(Pi_plus_tracks[1].dcaXY()); - pidcaXY.push_back(Pi_minus_tracks[0].dcaXY()); - pidcaXY.push_back(Pi_minus_tracks[1].dcaXY()); - - pidcaZ.push_back(Pi_plus_tracks[0].dcaZ()); - pidcaZ.push_back(Pi_plus_tracks[1].dcaZ()); - pidcaZ.push_back(Pi_minus_tracks[0].dcaZ()); - pidcaZ.push_back(Pi_minus_tracks[1].dcaZ()); - - tpcNsigKa.push_back(Pi_plus_tracks[0].tpcNSigmaKa()); - tpcNsigKa.push_back(Pi_plus_tracks[1].tpcNSigmaKa()); - tpcNsigKa.push_back(Pi_minus_tracks[0].tpcNSigmaKa()); - tpcNsigKa.push_back(Pi_minus_tracks[1].tpcNSigmaKa()); - - tpcNsigPr.push_back(Pi_plus_tracks[0].tpcNSigmaPr()); - tpcNsigPr.push_back(Pi_plus_tracks[1].tpcNSigmaPr()); - tpcNsigPr.push_back(Pi_minus_tracks[0].tpcNSigmaPr()); - tpcNsigPr.push_back(Pi_minus_tracks[1].tpcNSigmaPr()); - - tpcNsigEl.push_back(Pi_plus_tracks[0].tpcNSigmaEl()); - tpcNsigEl.push_back(Pi_plus_tracks[1].tpcNSigmaEl()); - tpcNsigEl.push_back(Pi_minus_tracks[0].tpcNSigmaEl()); - tpcNsigEl.push_back(Pi_minus_tracks[1].tpcNSigmaEl()); - - tpcNsigMu.push_back(Pi_plus_tracks[0].tpcNSigmaMu()); - tpcNsigMu.push_back(Pi_plus_tracks[1].tpcNSigmaMu()); - tpcNsigMu.push_back(Pi_minus_tracks[0].tpcNSigmaMu()); - tpcNsigMu.push_back(Pi_minus_tracks[1].tpcNSigmaMu()); - - tofNsigKa.push_back(Pi_plus_tracks[0].tofNSigmaKa()); - tofNsigKa.push_back(Pi_plus_tracks[1].tofNSigmaKa()); - tofNsigKa.push_back(Pi_minus_tracks[0].tofNSigmaKa()); - tofNsigKa.push_back(Pi_minus_tracks[1].tofNSigmaKa()); - - tofNsigPr.push_back(Pi_plus_tracks[0].tofNSigmaPr()); - tofNsigPr.push_back(Pi_plus_tracks[1].tofNSigmaPr()); - tofNsigPr.push_back(Pi_minus_tracks[0].tofNSigmaPr()); - tofNsigPr.push_back(Pi_minus_tracks[1].tofNSigmaPr()); - - tofNsigEl.push_back(Pi_plus_tracks[0].tofNSigmaEl()); - tofNsigEl.push_back(Pi_plus_tracks[1].tofNSigmaEl()); - tofNsigEl.push_back(Pi_minus_tracks[0].tofNSigmaEl()); - tofNsigEl.push_back(Pi_minus_tracks[1].tofNSigmaEl()); - - tofNsigMu.push_back(Pi_plus_tracks[0].tofNSigmaMu()); - tofNsigMu.push_back(Pi_plus_tracks[1].tofNSigmaMu()); - tofNsigMu.push_back(Pi_minus_tracks[0].tofNSigmaMu()); - tofNsigMu.push_back(Pi_minus_tracks[1].tofNSigmaMu()); + histosData.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p1.Pt()); + histosData.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p2.Pt()); + histosData.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p3.Pt()); + histosData.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p4.Pt()); + + histosData.fill(HIST("rapidity_track_WTS_PID_Pi_contributed"), p1.Rapidity()); + histosData.fill(HIST("rapidity_track_WTS_PID_Pi_contributed"), p2.Rapidity()); + histosData.fill(HIST("rapidity_track_WTS_PID_Pi_contributed"), p3.Rapidity()); + histosData.fill(HIST("rapidity_track_WTS_PID_Pi_contributed"), p4.Rapidity()); + + k1.SetCoordinates(p1.Pt(), p1.Eta(), p1.Phi(), o2::constants::physics::MassPionCharged); + k2.SetCoordinates(p2.Pt(), p2.Eta(), p2.Phi(), o2::constants::physics::MassPionCharged); + k3.SetCoordinates(p3.Pt(), p3.Eta(), p3.Phi(), o2::constants::physics::MassPionCharged); + k4.SetCoordinates(p4.Pt(), p4.Eta(), p4.Phi(), o2::constants::physics::MassPionCharged); + + dcaxy.push_back(Pi_plus_tracks[0].dcaXY()); + dcaxy.push_back(Pi_plus_tracks[1].dcaXY()); + dcaxy.push_back(Pi_minus_tracks[0].dcaXY()); + dcaxy.push_back(Pi_minus_tracks[1].dcaXY()); + + dcaz.push_back(Pi_plus_tracks[0].dcaZ()); + dcaz.push_back(Pi_plus_tracks[1].dcaZ()); + dcaz.push_back(Pi_minus_tracks[0].dcaZ()); + dcaz.push_back(Pi_minus_tracks[1].dcaZ()); + + tpcnsigPi.push_back(Pi_plus_tracks[0].tpcNSigmaPi()); + tpcnsigPi.push_back(Pi_plus_tracks[1].tpcNSigmaPi()); + tpcnsigPi.push_back(Pi_minus_tracks[0].tpcNSigmaPi()); + tpcnsigPi.push_back(Pi_minus_tracks[1].tpcNSigmaPi()); + + tpcnsigKa.push_back(Pi_plus_tracks[0].tpcNSigmaKa()); + tpcnsigKa.push_back(Pi_plus_tracks[1].tpcNSigmaKa()); + tpcnsigKa.push_back(Pi_minus_tracks[0].tpcNSigmaKa()); + tpcnsigKa.push_back(Pi_minus_tracks[1].tpcNSigmaKa()); + + tpcnsigPr.push_back(Pi_plus_tracks[0].tpcNSigmaPr()); + tpcnsigPr.push_back(Pi_plus_tracks[1].tpcNSigmaPr()); + tpcnsigPr.push_back(Pi_minus_tracks[0].tpcNSigmaPr()); + tpcnsigPr.push_back(Pi_minus_tracks[1].tpcNSigmaPr()); + + tpcnsigEl.push_back(Pi_plus_tracks[0].tpcNSigmaEl()); + tpcnsigEl.push_back(Pi_plus_tracks[1].tpcNSigmaEl()); + tpcnsigEl.push_back(Pi_minus_tracks[0].tpcNSigmaEl()); + tpcnsigEl.push_back(Pi_minus_tracks[1].tpcNSigmaEl()); + + tpcnsigMu.push_back(Pi_plus_tracks[0].tpcNSigmaMu()); + tpcnsigMu.push_back(Pi_plus_tracks[1].tpcNSigmaMu()); + tpcnsigMu.push_back(Pi_minus_tracks[0].tpcNSigmaMu()); + tpcnsigMu.push_back(Pi_minus_tracks[1].tpcNSigmaMu()); + + tofnsigPi.push_back(Pi_plus_tracks[0].tofNSigmaPi()); + tofnsigPi.push_back(Pi_plus_tracks[1].tofNSigmaPi()); + tofnsigPi.push_back(Pi_minus_tracks[0].tofNSigmaPi()); + tofnsigPi.push_back(Pi_minus_tracks[1].tofNSigmaPi()); + + tofnsigKa.push_back(Pi_plus_tracks[0].tofNSigmaKa()); + tofnsigKa.push_back(Pi_plus_tracks[1].tofNSigmaKa()); + tofnsigKa.push_back(Pi_minus_tracks[0].tofNSigmaKa()); + tofnsigKa.push_back(Pi_minus_tracks[1].tofNSigmaKa()); + + tofnsigPr.push_back(Pi_plus_tracks[0].tofNSigmaPr()); + tofnsigPr.push_back(Pi_plus_tracks[1].tofNSigmaPr()); + tofnsigPr.push_back(Pi_minus_tracks[0].tofNSigmaPr()); + tofnsigPr.push_back(Pi_minus_tracks[1].tofNSigmaPr()); + + tofnsigEl.push_back(Pi_plus_tracks[0].tofNSigmaEl()); + tofnsigEl.push_back(Pi_plus_tracks[1].tofNSigmaEl()); + tofnsigEl.push_back(Pi_minus_tracks[0].tofNSigmaEl()); + tofnsigEl.push_back(Pi_minus_tracks[1].tofNSigmaEl()); + + tofnsigMu.push_back(Pi_plus_tracks[0].tofNSigmaMu()); + tofnsigMu.push_back(Pi_plus_tracks[1].tofNSigmaMu()); + tofnsigMu.push_back(Pi_minus_tracks[0].tofNSigmaMu()); + tofnsigMu.push_back(Pi_minus_tracks[1].tofNSigmaMu()); tpcchi2.push_back(Pi_plus_tracks[0].tpcChi2NCl()); tpcchi2.push_back(Pi_plus_tracks[1].tpcChi2NCl()); tpcchi2.push_back(Pi_minus_tracks[0].tpcChi2NCl()); tpcchi2.push_back(Pi_minus_tracks[1].tpcChi2NCl()); - tpcNFindableCls.push_back(Pi_plus_tracks[0].tpcNClsFindable()); - tpcNFindableCls.push_back(Pi_plus_tracks[1].tpcNClsFindable()); - tpcNFindableCls.push_back(Pi_minus_tracks[0].tpcNClsFindable()); - tpcNFindableCls.push_back(Pi_minus_tracks[1].tpcNClsFindable()); + tpcnclsfindable.push_back(Pi_plus_tracks[0].tpcNClsFindable()); + tpcnclsfindable.push_back(Pi_plus_tracks[1].tpcNClsFindable()); + tpcnclsfindable.push_back(Pi_minus_tracks[0].tpcNClsFindable()); + tpcnclsfindable.push_back(Pi_minus_tracks[1].tpcNClsFindable()); itschi2.push_back(Pi_plus_tracks[0].itsChi2NCl()); itschi2.push_back(Pi_plus_tracks[1].itsChi2NCl()); itschi2.push_back(Pi_minus_tracks[0].itsChi2NCl()); itschi2.push_back(Pi_minus_tracks[1].itsChi2NCl()); - piPt.push_back(p1.Pt()); - piPt.push_back(p2.Pt()); - piPt.push_back(p3.Pt()); - piPt.push_back(p4.Pt()); + pipt.push_back(p1.Pt()); + pipt.push_back(p2.Pt()); + pipt.push_back(p3.Pt()); + pipt.push_back(p4.Pt()); - piEta.push_back(p1.Eta()); - piEta.push_back(p2.Eta()); - piEta.push_back(p3.Eta()); - piEta.push_back(p4.Eta()); + pieta.push_back(p1.Eta()); + pieta.push_back(p2.Eta()); + pieta.push_back(p3.Eta()); + pieta.push_back(p4.Eta()); - piRapidity.push_back(p1.Rapidity()); - piRapidity.push_back(p2.Rapidity()); - piRapidity.push_back(p3.Rapidity()); - piRapidity.push_back(p4.Rapidity()); + piphi.push_back(p1.Phi()); + piphi.push_back(p2.Phi()); + piphi.push_back(p3.Phi()); + piphi.push_back(p4.Phi()); - histosData.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p1.Pt()); - histosData.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p2.Pt()); - histosData.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p3.Pt()); - histosData.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p4.Pt()); - - histosData.fill(HIST("rapidity_track_WTS_PID_Pi_contributed"), p1.Rapidity()); - histosData.fill(HIST("rapidity_track_WTS_PID_Pi_contributed"), p2.Rapidity()); - histosData.fill(HIST("rapidity_track_WTS_PID_Pi_contributed"), p3.Rapidity()); - histosData.fill(HIST("rapidity_track_WTS_PID_Pi_contributed"), p4.Rapidity()); - - k1.SetCoordinates(p1.Pt(), p1.Eta(), p1.Phi(), o2::constants::physics::MassPionCharged); - k2.SetCoordinates(p2.Pt(), p2.Eta(), p2.Phi(), o2::constants::physics::MassPionCharged); - k3.SetCoordinates(p3.Pt(), p3.Eta(), p3.Phi(), o2::constants::physics::MassPionCharged); - k4.SetCoordinates(p4.Pt(), p4.Eta(), p4.Phi(), o2::constants::physics::MassPionCharged); + pirapidity.push_back(p1.Rapidity()); + pirapidity.push_back(p2.Rapidity()); + pirapidity.push_back(p3.Rapidity()); + pirapidity.push_back(p4.Rapidity()); p1234 = p1 + p2 + p3 + p4; k1234 = k1 + k2 + k3 + k4; @@ -801,19 +875,22 @@ struct ExclusiveRhoTo4Pi { k23 = k2 + k3; k24 = k2 + k4; - fourPiPhiPair1 = phiCollinsSoperFrame(k13, k24, k1234); - fourPiPhiPair2 = phiCollinsSoperFrame(k14, k23, k1234); - fourPiCosThetaPair1 = cosThetaCollinsSoperFrame(k13, k24, k1234); - fourPiCosThetaPair2 = cosThetaCollinsSoperFrame(k14, k23, k1234); + double fourPiPhiPair1 = phiCollinsSoperFrame(k13, k24, k1234); + double fourPiPhiPair2 = phiCollinsSoperFrame(k14, k23, k1234); + double fourPiCosThetaPair1 = cosThetaCollinsSoperFrame(k13, k24, k1234); + double fourPiCosThetaPair2 = cosThetaCollinsSoperFrame(k14, k23, k1234); - zeroChargeEventsData( + sigFromData( + collision.posX(), collision.posY(), collision.posZ(), collision.totalFV0AmplitudeA(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), - pidcaXY, pidcaZ, - tpcNsigKa, tpcNsigPr, tpcNsigEl, tpcNsigMu, - tofNsigKa, tofNsigPr, tofNsigEl, tofNsigMu, - tpcchi2, tpcNFindableCls, itschi2, - piPt, piEta, piRapidity, - p1234.Pt(), p1234.Eta(), p1234.Rapidity(), p1234.M(), p1234.Phi(), + collision.timeFV0A(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFDDA(), collision.timeFDDC(), + collision.timeZNA(), collision.timeZNC(), + dcaxy, dcaz, + tpcnsigPi, tpcnsigKa, tpcnsigPr, tpcnsigEl, tpcnsigMu, + tofnsigPi, tofnsigKa, tofnsigPr, tofnsigEl, tofnsigMu, + tpcchi2, tpcnclsfindable, itschi2, + pipt, pieta, piphi, pirapidity, + p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiPhiPair1, fourPiPhiPair2, fourPiCosThetaPair1, fourPiCosThetaPair2); if (std::fabs(p1234.Rapidity()) < 0.5) { @@ -850,22 +927,30 @@ struct ExclusiveRhoTo4Pi { // Selecting Events with net charge != 0 for estimation of background if (numPionMinusTRacks != 2 && numPiPlusTracks != 2) { - std::vector pidcaXY; - std::vector pidcaZ; - std::vector tpcNsigKa; - std::vector tpcNsigPr; - std::vector tpcNsigEl; - std::vector tpcNsigMu; - std::vector tofNsigKa; - std::vector tofNsigPr; - std::vector tofNsigEl; - std::vector tofNsigMu; + std::vector dcaxy; + std::vector dcaz; + + std::vector tpcnsigPi; + std::vector tpcnsigKa; + std::vector tpcnsigPr; + std::vector tpcnsigEl; + std::vector tpcnsigMu; + + std::vector tofnsigPi; + std::vector tofnsigKa; + std::vector tofnsigPr; + std::vector tofnsigEl; + std::vector tofnsigMu; + std::vector tpcchi2; + std::vector tpcnclsfindable; std::vector itschi2; - std::vector tpcNFindableCls; - std::vector piPt; - std::vector piEta; - std::vector piRapidity; + + std::vector pipt; + std::vector pieta; + std::vector piphi; + std::vector pirapidity; + TLorentzVector p1, p2, p3, p4, p1234; TLorentzVector tempVec; p1.SetXYZM(WTS_PID_Pi_tracks[0].px(), WTS_PID_Pi_tracks[0].py(), WTS_PID_Pi_tracks[0].pz(), o2::constants::physics::MassPionCharged); @@ -873,36 +958,114 @@ struct ExclusiveRhoTo4Pi { p3.SetXYZM(WTS_PID_Pi_tracks[2].px(), WTS_PID_Pi_tracks[2].py(), WTS_PID_Pi_tracks[2].pz(), o2::constants::physics::MassPionCharged); p4.SetXYZM(WTS_PID_Pi_tracks[3].px(), WTS_PID_Pi_tracks[3].py(), WTS_PID_Pi_tracks[3].pz(), o2::constants::physics::MassPionCharged); - p1234 = p1 + p2 + p3 + p4; + dcaxy.push_back(WTS_PID_Pi_tracks[0].dcaXY()); + dcaxy.push_back(WTS_PID_Pi_tracks[1].dcaXY()); + dcaxy.push_back(WTS_PID_Pi_tracks[2].dcaXY()); + dcaxy.push_back(WTS_PID_Pi_tracks[3].dcaXY()); + + dcaz.push_back(WTS_PID_Pi_tracks[0].dcaZ()); + dcaz.push_back(WTS_PID_Pi_tracks[1].dcaZ()); + dcaz.push_back(WTS_PID_Pi_tracks[2].dcaZ()); + dcaz.push_back(WTS_PID_Pi_tracks[3].dcaZ()); + + tpcnsigPi.push_back(WTS_PID_Pi_tracks[0].tpcNSigmaPi()); + tpcnsigPi.push_back(WTS_PID_Pi_tracks[1].tpcNSigmaPi()); + tpcnsigPi.push_back(WTS_PID_Pi_tracks[2].tpcNSigmaPi()); + tpcnsigPi.push_back(WTS_PID_Pi_tracks[3].tpcNSigmaPi()); + + tpcnsigKa.push_back(WTS_PID_Pi_tracks[0].tpcNSigmaKa()); + tpcnsigKa.push_back(WTS_PID_Pi_tracks[1].tpcNSigmaKa()); + tpcnsigKa.push_back(WTS_PID_Pi_tracks[2].tpcNSigmaKa()); + tpcnsigKa.push_back(WTS_PID_Pi_tracks[3].tpcNSigmaKa()); + + tpcnsigPr.push_back(WTS_PID_Pi_tracks[0].tpcNSigmaPr()); + tpcnsigPr.push_back(WTS_PID_Pi_tracks[1].tpcNSigmaPr()); + tpcnsigPr.push_back(WTS_PID_Pi_tracks[2].tpcNSigmaPr()); + tpcnsigPr.push_back(WTS_PID_Pi_tracks[3].tpcNSigmaPr()); + + tpcnsigEl.push_back(WTS_PID_Pi_tracks[0].tpcNSigmaEl()); + tpcnsigEl.push_back(WTS_PID_Pi_tracks[1].tpcNSigmaEl()); + tpcnsigEl.push_back(WTS_PID_Pi_tracks[2].tpcNSigmaEl()); + tpcnsigEl.push_back(WTS_PID_Pi_tracks[3].tpcNSigmaEl()); + + tpcnsigMu.push_back(WTS_PID_Pi_tracks[0].tpcNSigmaMu()); + tpcnsigMu.push_back(WTS_PID_Pi_tracks[1].tpcNSigmaMu()); + tpcnsigMu.push_back(WTS_PID_Pi_tracks[2].tpcNSigmaMu()); + tpcnsigMu.push_back(WTS_PID_Pi_tracks[3].tpcNSigmaMu()); + + tofnsigPi.push_back(WTS_PID_Pi_tracks[0].tofNSigmaPi()); + tofnsigPi.push_back(WTS_PID_Pi_tracks[1].tofNSigmaPi()); + tofnsigPi.push_back(WTS_PID_Pi_tracks[2].tofNSigmaPi()); + tofnsigPi.push_back(WTS_PID_Pi_tracks[3].tofNSigmaPi()); + + tofnsigKa.push_back(WTS_PID_Pi_tracks[0].tofNSigmaKa()); + tofnsigKa.push_back(WTS_PID_Pi_tracks[1].tofNSigmaKa()); + tofnsigKa.push_back(WTS_PID_Pi_tracks[2].tofNSigmaKa()); + tofnsigKa.push_back(WTS_PID_Pi_tracks[3].tofNSigmaKa()); + + tofnsigPr.push_back(WTS_PID_Pi_tracks[0].tofNSigmaPr()); + tofnsigPr.push_back(WTS_PID_Pi_tracks[1].tofNSigmaPr()); + tofnsigPr.push_back(WTS_PID_Pi_tracks[2].tofNSigmaPr()); + tofnsigPr.push_back(WTS_PID_Pi_tracks[3].tofNSigmaPr()); + + tofnsigEl.push_back(WTS_PID_Pi_tracks[0].tofNSigmaEl()); + tofnsigEl.push_back(WTS_PID_Pi_tracks[1].tofNSigmaEl()); + tofnsigEl.push_back(WTS_PID_Pi_tracks[2].tofNSigmaEl()); + tofnsigEl.push_back(WTS_PID_Pi_tracks[3].tofNSigmaEl()); + + tofnsigMu.push_back(WTS_PID_Pi_tracks[0].tofNSigmaMu()); + tofnsigMu.push_back(WTS_PID_Pi_tracks[1].tofNSigmaMu()); + tofnsigMu.push_back(WTS_PID_Pi_tracks[2].tofNSigmaMu()); + tofnsigMu.push_back(WTS_PID_Pi_tracks[3].tofNSigmaMu()); + + tpcchi2.push_back(WTS_PID_Pi_tracks[0].tpcChi2NCl()); + tpcchi2.push_back(WTS_PID_Pi_tracks[1].tpcChi2NCl()); + tpcchi2.push_back(WTS_PID_Pi_tracks[2].tpcChi2NCl()); + tpcchi2.push_back(WTS_PID_Pi_tracks[3].tpcChi2NCl()); + + tpcnclsfindable.push_back(WTS_PID_Pi_tracks[0].tpcNClsFindable()); + tpcnclsfindable.push_back(WTS_PID_Pi_tracks[1].tpcNClsFindable()); + tpcnclsfindable.push_back(WTS_PID_Pi_tracks[2].tpcNClsFindable()); + tpcnclsfindable.push_back(WTS_PID_Pi_tracks[3].tpcNClsFindable()); + + itschi2.push_back(WTS_PID_Pi_tracks[0].itsChi2NCl()); + itschi2.push_back(WTS_PID_Pi_tracks[1].itsChi2NCl()); + itschi2.push_back(WTS_PID_Pi_tracks[2].itsChi2NCl()); + itschi2.push_back(WTS_PID_Pi_tracks[3].itsChi2NCl()); + + pipt.push_back(p1.Pt()); + pipt.push_back(p2.Pt()); + pipt.push_back(p3.Pt()); + pipt.push_back(p4.Pt()); + + pieta.push_back(p1.Eta()); + pieta.push_back(p2.Eta()); + pieta.push_back(p3.Eta()); + pieta.push_back(p4.Eta()); + + piphi.push_back(p1.Phi()); + piphi.push_back(p2.Phi()); + piphi.push_back(p3.Phi()); + piphi.push_back(p4.Phi()); + + pirapidity.push_back(p1.Rapidity()); + pirapidity.push_back(p2.Rapidity()); + pirapidity.push_back(p3.Rapidity()); + pirapidity.push_back(p4.Rapidity()); - for (int i = 0; i < 4; i++) { - tempVec.SetXYZM(WTS_PID_Pi_tracks[i].px(), WTS_PID_Pi_tracks[i].py(), WTS_PID_Pi_tracks[i].pz(), o2::constants::physics::MassPionCharged); - pidcaXY.push_back(WTS_PID_Pi_tracks[i].dcaXY()); - pidcaZ.push_back(WTS_PID_Pi_tracks[i].dcaZ()); - tpcNsigKa.push_back(WTS_PID_Pi_tracks[i].tpcNSigmaKa()); - tpcNsigPr.push_back(WTS_PID_Pi_tracks[i].tpcNSigmaPr()); - tpcNsigEl.push_back(WTS_PID_Pi_tracks[i].tpcNSigmaEl()); - tpcNsigMu.push_back(WTS_PID_Pi_tracks[i].tpcNSigmaMu()); - tofNsigKa.push_back(WTS_PID_Pi_tracks[i].tofNSigmaKa()); - tofNsigPr.push_back(WTS_PID_Pi_tracks[i].tofNSigmaPr()); - tofNsigEl.push_back(WTS_PID_Pi_tracks[i].tofNSigmaEl()); - tofNsigMu.push_back(WTS_PID_Pi_tracks[i].tofNSigmaMu()); - tpcchi2.push_back(WTS_PID_Pi_tracks[i].tpcChi2NCl()); - itschi2.push_back(WTS_PID_Pi_tracks[i].itsChi2NCl()); - tpcNFindableCls.push_back(WTS_PID_Pi_tracks[i].tpcNClsFindable()); - piPt.push_back(tempVec.Pt()); - piEta.push_back(tempVec.Eta()); - piRapidity.push_back(tempVec.Rapidity()); - } + p1234 = p1 + p2 + p3 + p4; - nonzeroChargeEventsData( + bkgFromData( + collision.posX(), collision.posY(), collision.posZ(), collision.totalFV0AmplitudeA(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), - pidcaXY, pidcaZ, - tpcNsigKa, tpcNsigPr, tpcNsigMu, tpcNsigEl, - tofNsigKa, tofNsigPr, tofNsigMu, tofNsigEl, - tpcchi2, tpcNFindableCls, itschi2, - piPt, piEta, piRapidity, - p1234.Pt(), p1234.Eta(), p1234.Rapidity(), p1234.M(), p1234.Phi()); + collision.timeFV0A(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFDDA(), collision.timeFDDC(), + collision.timeZNA(), collision.timeZNC(), + dcaxy, dcaz, + tpcnsigPi, tpcnsigKa, tpcnsigPr, tpcnsigEl, tpcnsigMu, + tofnsigPi, tofnsigKa, tofnsigPr, tofnsigEl, tofnsigMu, + tpcchi2, tpcnclsfindable, itschi2, + pipt, pieta, piphi, pirapidity, + p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M()); if (std::fabs(p1234.Rapidity()) < 0.5) { histosData.fill(HIST("pT_event_non0charge_WTS_PID_Pi"), p1234.Pt()); @@ -927,80 +1090,387 @@ struct ExclusiveRhoTo4Pi { PROCESS_SWITCH(ExclusiveRhoTo4Pi, processData, "The Process for 4 Pion Analysis from data", true); //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Filter collCuts = (nabs(o2::aod::collision::posZ) < 10.0f) && (o2::aod::collision::numContrib == numPVContrib); + Filter fitCuts = (o2::aod::udcollision::totalFT0AmplitudeA < ft0aCut) && (o2::aod::udcollision::totalFT0AmplitudeC < ft0cCut) && (o2::aod::udcollision::totalFV0AmplitudeA < fv0Cut); + Filter zdcCuts = (o2::aod::udzdc::energyCommonZNA < zdcCut) && (o2::aod::udzdc::energyCommonZNC < zdcCut); + Filter trackCuts = (o2::aod::track::tpcChi2NCl < tpcChi2Cut) && (o2::aod::track::tpcNClsFindable > tpcNClsFindableCut) && (o2::aod::track::itsChi2NCl < itsChi2Cut) && (nabs(o2::aod::track::eta) < etaCut) && (o2::aod::track::pt > pTcut) && (nabs(o2::aod::track::dcaZ) < dcaZcut) && (nabs(o2::aod::track::dcaXY) < dcaXYcut); + Filter udtrackCuts = (o2::aod::udtrack::isPVContributor == true); + Filter pidCuts = (nabs(o2::aod::pidtpc::tpcNSigmaPi) < nSigmaTPCcut); + using FilteredTracks = soa::Filtered>; + using FilteredCollisions = soa::Filtered>; + using FilteredCollisionsFull = FilteredCollisions::iterator; + + // // Begin of FAST Process function-------------------------------------------------------------------------------------------------------------------------------------------------- + void processDataFast(FilteredCollisionsFull const& collision, FilteredTracks const& tracks) + { + + if (tracks.size() != 4) { + return; + } + + std::vector pionPlusTracks; + std::vector pionMinusTracks; + + for (const auto& track : tracks) { + if ((!selectionPIDPion(track, true, nSigmaTPCcut, nSigmaTOFcut))) { + continue; + } + if (track.sign() == 1) { + pionPlusTracks.push_back(track); + } + if (track.sign() == -1) { + pionMinusTracks.push_back(track); + } + } // end of loop over tracks + + if ((pionPlusTracks.size() + pionMinusTracks.size()) != 4) { + return; + } + + if (pionPlusTracks.size() == 2 || pionMinusTracks.size() == 2) { + + std::vector dcaxy; + std::vector dcaz; + + std::vector tpcnsigPi; + std::vector tpcnsigKa; + std::vector tpcnsigPr; + std::vector tpcnsigEl; + std::vector tpcnsigMu; + + std::vector tofnsigPi; + std::vector tofnsigKa; + std::vector tofnsigPr; + std::vector tofnsigEl; + std::vector tofnsigMu; + + std::vector tpcchi2; + std::vector tpcnclsfindable; + std::vector itschi2; + + std::vector pipt; + std::vector pieta; + std::vector piphi; + std::vector pirapidity; + + TLorentzVector p1, p2, p3, p4, p1234; + ROOT::Math::PtEtaPhiMVector k1, k2, k3, k4, k1234, k13, k14, k23, k24; + + p1.SetXYZM(pionPlusTracks[0].px(), pionPlusTracks[0].py(), pionPlusTracks[0].pz(), o2::constants::physics::MassPionCharged); + p2.SetXYZM(pionPlusTracks[1].px(), pionPlusTracks[1].py(), pionPlusTracks[1].pz(), o2::constants::physics::MassPionCharged); + p3.SetXYZM(pionMinusTracks[0].px(), pionMinusTracks[0].py(), pionMinusTracks[0].pz(), o2::constants::physics::MassPionCharged); + p4.SetXYZM(pionMinusTracks[1].px(), pionMinusTracks[1].py(), pionMinusTracks[1].pz(), o2::constants::physics::MassPionCharged); + + k1.SetCoordinates(p1.Pt(), p1.Eta(), p1.Phi(), o2::constants::physics::MassPionCharged); + k2.SetCoordinates(p2.Pt(), p2.Eta(), p2.Phi(), o2::constants::physics::MassPionCharged); + k3.SetCoordinates(p3.Pt(), p3.Eta(), p3.Phi(), o2::constants::physics::MassPionCharged); + k4.SetCoordinates(p4.Pt(), p4.Eta(), p4.Phi(), o2::constants::physics::MassPionCharged); + + dcaxy.push_back(pionPlusTracks[0].dcaXY()); + dcaxy.push_back(pionPlusTracks[1].dcaXY()); + dcaxy.push_back(pionMinusTracks[0].dcaXY()); + dcaxy.push_back(pionMinusTracks[1].dcaXY()); + + dcaz.push_back(pionPlusTracks[0].dcaZ()); + dcaz.push_back(pionPlusTracks[1].dcaZ()); + dcaz.push_back(pionMinusTracks[0].dcaZ()); + dcaz.push_back(pionMinusTracks[1].dcaZ()); + + tpcnsigPi.push_back(pionPlusTracks[0].tpcNSigmaPi()); + tpcnsigPi.push_back(pionPlusTracks[1].tpcNSigmaPi()); + tpcnsigPi.push_back(pionMinusTracks[0].tpcNSigmaPi()); + tpcnsigPi.push_back(pionMinusTracks[1].tpcNSigmaPi()); + + tpcnsigKa.push_back(pionPlusTracks[0].tpcNSigmaKa()); + tpcnsigKa.push_back(pionPlusTracks[1].tpcNSigmaKa()); + tpcnsigKa.push_back(pionMinusTracks[0].tpcNSigmaKa()); + tpcnsigKa.push_back(pionMinusTracks[1].tpcNSigmaKa()); + + tpcnsigPr.push_back(pionPlusTracks[0].tpcNSigmaPr()); + tpcnsigPr.push_back(pionPlusTracks[1].tpcNSigmaPr()); + tpcnsigPr.push_back(pionMinusTracks[0].tpcNSigmaPr()); + tpcnsigPr.push_back(pionMinusTracks[1].tpcNSigmaPr()); + + tpcnsigEl.push_back(pionPlusTracks[0].tpcNSigmaEl()); + tpcnsigEl.push_back(pionPlusTracks[1].tpcNSigmaEl()); + tpcnsigEl.push_back(pionMinusTracks[0].tpcNSigmaEl()); + tpcnsigEl.push_back(pionMinusTracks[1].tpcNSigmaEl()); + + tpcnsigMu.push_back(pionPlusTracks[0].tpcNSigmaMu()); + tpcnsigMu.push_back(pionPlusTracks[1].tpcNSigmaMu()); + tpcnsigMu.push_back(pionMinusTracks[0].tpcNSigmaMu()); + tpcnsigMu.push_back(pionMinusTracks[1].tpcNSigmaMu()); + + tofnsigPi.push_back(pionPlusTracks[0].tofNSigmaPi()); + tofnsigPi.push_back(pionPlusTracks[1].tofNSigmaPi()); + tofnsigPi.push_back(pionMinusTracks[0].tofNSigmaPi()); + tofnsigPi.push_back(pionMinusTracks[1].tofNSigmaPi()); + + tofnsigKa.push_back(pionPlusTracks[0].tofNSigmaKa()); + tofnsigKa.push_back(pionPlusTracks[1].tofNSigmaKa()); + tofnsigKa.push_back(pionMinusTracks[0].tofNSigmaKa()); + tofnsigKa.push_back(pionMinusTracks[1].tofNSigmaKa()); + + tofnsigPr.push_back(pionPlusTracks[0].tofNSigmaPr()); + tofnsigPr.push_back(pionPlusTracks[1].tofNSigmaPr()); + tofnsigPr.push_back(pionMinusTracks[0].tofNSigmaPr()); + tofnsigPr.push_back(pionMinusTracks[1].tofNSigmaPr()); + + tofnsigEl.push_back(pionPlusTracks[0].tofNSigmaEl()); + tofnsigEl.push_back(pionPlusTracks[1].tofNSigmaEl()); + tofnsigEl.push_back(pionMinusTracks[0].tofNSigmaEl()); + tofnsigEl.push_back(pionMinusTracks[1].tofNSigmaEl()); + + tofnsigMu.push_back(pionPlusTracks[0].tofNSigmaMu()); + tofnsigMu.push_back(pionPlusTracks[1].tofNSigmaMu()); + tofnsigMu.push_back(pionMinusTracks[0].tofNSigmaMu()); + tofnsigMu.push_back(pionMinusTracks[1].tofNSigmaMu()); + + tpcchi2.push_back(pionPlusTracks[0].tpcChi2NCl()); + tpcchi2.push_back(pionPlusTracks[1].tpcChi2NCl()); + tpcchi2.push_back(pionMinusTracks[0].tpcChi2NCl()); + tpcchi2.push_back(pionMinusTracks[1].tpcChi2NCl()); + + tpcnclsfindable.push_back(pionPlusTracks[0].tpcNClsFindable()); + tpcnclsfindable.push_back(pionPlusTracks[1].tpcNClsFindable()); + tpcnclsfindable.push_back(pionMinusTracks[0].tpcNClsFindable()); + tpcnclsfindable.push_back(pionMinusTracks[1].tpcNClsFindable()); + + itschi2.push_back(pionPlusTracks[0].itsChi2NCl()); + itschi2.push_back(pionPlusTracks[1].itsChi2NCl()); + itschi2.push_back(pionMinusTracks[0].itsChi2NCl()); + itschi2.push_back(pionMinusTracks[1].itsChi2NCl()); + + pipt.push_back(p1.Pt()); + pipt.push_back(p2.Pt()); + pipt.push_back(p3.Pt()); + pipt.push_back(p4.Pt()); + + pieta.push_back(p1.Eta()); + pieta.push_back(p2.Eta()); + pieta.push_back(p3.Eta()); + pieta.push_back(p4.Eta()); + + piphi.push_back(p1.Phi()); + piphi.push_back(p2.Phi()); + piphi.push_back(p3.Phi()); + piphi.push_back(p4.Phi()); + + pirapidity.push_back(p1.Rapidity()); + pirapidity.push_back(p2.Rapidity()); + pirapidity.push_back(p3.Rapidity()); + pirapidity.push_back(p4.Rapidity()); + + p1234 = p1 + p2 + p3 + p4; + k1234 = k1 + k2 + k3 + k4; + + k13 = k1 + k3; + k14 = k1 + k4; + k23 = k2 + k3; + k24 = k2 + k4; + + double fourPiPhiPair1 = phiCollinsSoperFrame(k13, k24, k1234); + double fourPiPhiPair2 = phiCollinsSoperFrame(k14, k23, k1234); + double fourPiCosThetaPair1 = cosThetaCollinsSoperFrame(k13, k24, k1234); + double fourPiCosThetaPair2 = cosThetaCollinsSoperFrame(k14, k23, k1234); + + sigFromData( + collision.posX(), collision.posY(), collision.posZ(), + collision.totalFV0AmplitudeA(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), + collision.timeFV0A(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFDDA(), collision.timeFDDC(), + collision.timeZNA(), collision.timeZNC(), + dcaxy, dcaz, + tpcnsigPi, tpcnsigKa, tpcnsigPr, tpcnsigEl, tpcnsigMu, + tofnsigPi, tofnsigKa, tofnsigPr, tofnsigEl, tofnsigMu, + tpcchi2, tpcnclsfindable, itschi2, + pipt, pieta, piphi, pirapidity, + p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), + fourPiPhiPair1, fourPiPhiPair2, fourPiCosThetaPair1, fourPiCosThetaPair2); + + histosFast.fill(HIST("4PionPt"), p1234.Pt()); + histosFast.fill(HIST("4PionRapidity"), p1234.Rapidity()); + histosFast.fill(HIST("4PionMassFull"), p1234.M()); + + if ((p1234.Pt() < 0.15) && (std::abs(p1234.Rapidity()) < 0.5)) { + histosFast.fill(HIST("4PionMassWithCut"), p1234.M()); + } + } // End 0 charge event + + if (pionPlusTracks.size() != 2 && pionMinusTracks.size() != 2) { + std::vector allTracks; + int piPlussize = static_cast(pionPlusTracks.size()); + int piMinussize = static_cast(pionMinusTracks.size()); + + for (int i = 0; i < piPlussize; i++) { + allTracks.push_back(pionPlusTracks[i]); + } + for (int i = 0; i < piMinussize; i++) { + allTracks.push_back(pionMinusTracks[i]); + } + + int allTRackSize = static_cast(allTracks.size()); + + TLorentzVector p1, p2, p3, p4, p1234; + + p1.SetXYZM(allTracks[0].px(), allTracks[0].py(), allTracks[0].pz(), o2::constants::physics::MassPionCharged); + p2.SetXYZM(allTracks[1].px(), allTracks[1].py(), allTracks[1].pz(), o2::constants::physics::MassPionCharged); + p3.SetXYZM(allTracks[2].px(), allTracks[2].py(), allTracks[2].pz(), o2::constants::physics::MassPionCharged); + p4.SetXYZM(allTracks[3].px(), allTracks[3].py(), allTracks[3].pz(), o2::constants::physics::MassPionCharged); + + std::vector dcaxy; + std::vector dcaz; + + std::vector tpcnsigPi; + std::vector tpcnsigKa; + std::vector tpcnsigPr; + std::vector tpcnsigEl; + std::vector tpcnsigMu; + + std::vector tofnsigPi; + std::vector tofnsigKa; + std::vector tofnsigPr; + std::vector tofnsigEl; + std::vector tofnsigMu; + + std::vector tpcchi2; + std::vector tpcnclsfindable; + std::vector itschi2; + + std::vector pipt; + std::vector pieta; + std::vector piphi; + std::vector pirapidity; + + TLorentzVector tempPionVect; + for (int i = 0; i < allTRackSize; i++) { + tempPionVect.SetXYZM(allTracks[i].px(), allTracks[i].py(), allTracks[i].pz(), o2::constants::physics::MassPionCharged); + dcaxy.push_back(allTracks[i].dcaXY()); + dcaz.push_back(allTracks[i].dcaZ()); + tpcnsigPi.push_back(allTracks[i].tpcNSigmaPi()); + tpcnsigKa.push_back(allTracks[i].tpcNSigmaKa()); + tpcnsigPr.push_back(allTracks[i].tpcNSigmaPr()); + tpcnsigEl.push_back(allTracks[i].tpcNSigmaEl()); + tpcnsigMu.push_back(allTracks[i].tpcNSigmaMu()); + tofnsigPi.push_back(allTracks[i].tofNSigmaPi()); + tofnsigKa.push_back(allTracks[i].tofNSigmaKa()); + tofnsigPr.push_back(allTracks[i].tofNSigmaPr()); + tofnsigEl.push_back(allTracks[i].tofNSigmaEl()); + tofnsigMu.push_back(allTracks[i].tofNSigmaMu()); + tpcchi2.push_back(allTracks[i].tpcChi2NCl()); + tpcnclsfindable.push_back(allTracks[i].tpcNClsFindable()); + itschi2.push_back(allTracks[i].itsChi2NCl()); + pipt.push_back(tempPionVect.Pt()); + pieta.push_back(tempPionVect.Eta()); + piphi.push_back(tempPionVect.Phi()); + pirapidity.push_back(tempPionVect.Rapidity()); + } + + p1234 = p1 + p2 + p3 + p4; + + bkgFromData( + collision.posX(), collision.posY(), collision.posZ(), + collision.totalFV0AmplitudeA(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), + collision.timeFV0A(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFDDA(), collision.timeFDDC(), + collision.timeZNA(), collision.timeZNC(), + dcaxy, dcaz, + tpcnsigPi, tpcnsigKa, tpcnsigPr, tpcnsigEl, tpcnsigMu, + tofnsigPi, tofnsigKa, tofnsigPr, tofnsigEl, tofnsigMu, + tpcchi2, tpcnclsfindable, itschi2, + pipt, pieta, piphi, pirapidity, + p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M()); + + } // end of non 0 charge event + + } // End of 4 Pion Analysis Process function for Fast Data + PROCESS_SWITCH(ExclusiveRhoTo4Pi, processDataFast, "The Process for 4 Pion Analysis from data fast", true); + // //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + // Begin of MC Generation function----------------------------------------------------------------------------------------------------------------------------------------------- void processMCgen(aod::UDMcCollisions::iterator const&, aod::UDMcParticles const& mcParts) { std::vector piPlusvectors; std::vector piMinusvectors; - TLorentzVector motherVector, tempVector, p1, p2, p3, p4; - TLorentzVector p1234; - - std::vector piPt; - std::vector piEta; - std::vector piRapidity; - - bool flag = false; + TLorentzVector daughterVector; + TVector3 particleVector; for (const auto& particle : mcParts) { - tempVector.SetXYZM(particle.px(), particle.py(), particle.pz(), o2::constants::physics::MassPionCharged); - if (!particle.has_mothers()) { + if ((particle.pdgCode() != rhoPrime) || (particle.daughters_as().size() != 4)) { continue; } - for (const auto& mother : particle.mothers_as()) { - if (mother.pdgCode() == kRhoPrime1700) { - motherVector.SetXYZM(mother.px(), mother.py(), mother.pz(), o2::constants::physics::MassPionCharged); - histosMCgen.fill(HIST("MCgen_rhoPrime_pT"), motherVector.Pt()); + particleVector.SetXYZ(particle.px(), particle.py(), particle.pz()); + histosMCgen.fill(HIST("rhoPrimeCounts"), 1); + histosMCgen.fill(HIST("rhoPrime_pT"), particleVector.Pt()); + histosMCgen.fill(HIST("rhoPrime_eta"), particleVector.Eta()); + + for (const auto& daughter : particle.daughters_as()) { + daughterVector.SetXYZM(daughter.px(), daughter.py(), daughter.pz(), o2::constants::physics::MassPionCharged); + if (daughter.pdgCode() == PDG_t::kPiPlus) { + piPlusvectors.push_back(daughterVector); + } + if (daughter.pdgCode() == PDG_t::kPiMinus) { + piMinusvectors.push_back(daughterVector); + } + } // End of loop over daughters - if (flag == false) { - histosMCgen.fill(HIST("rhoPrimeCounts"), 5); - } - flag = true; - if (particle.pdgCode() == kPiPlus) { - histosMCgen.fill(HIST("MCgen_particle_pT"), tempVector.Pt()); - histosMCgen.fill(HIST("MCgen_particle_rapidity"), tempVector.Rapidity()); - piPlusvectors.push_back(tempVector); - piPt.push_back(tempVector.Pt()); - piEta.push_back(tempVector.Eta()); - piRapidity.push_back(tempVector.Rapidity()); - } - if (particle.pdgCode() == kPiMinus) { - histosMCgen.fill(HIST("MCgen_particle_pT"), tempVector.Pt()); - histosMCgen.fill(HIST("MCgen_particle_rapidity"), tempVector.Rapidity()); - piMinusvectors.push_back(tempVector); - piPt.push_back(tempVector.Pt()); - piEta.push_back(tempVector.Eta()); - piRapidity.push_back(tempVector.Rapidity()); - } - } // End of Mother ID 30113 rho prime - } // End of loop over mothers } // End of loop over MC particles if (piPlusvectors.size() != 2 || piMinusvectors.size() != 2) { return; } - p1234 = piPlusvectors[0] + piPlusvectors[1] + piMinusvectors[0] + piMinusvectors[1]; - - histosMCgen.fill(HIST("MCgen_particle_pT_contributed"), piPlusvectors[0].Pt()); - histosMCgen.fill(HIST("MCgen_particle_pT_contributed"), piPlusvectors[1].Pt()); - histosMCgen.fill(HIST("MCgen_particle_pT_contributed"), piMinusvectors[0].Pt()); - histosMCgen.fill(HIST("MCgen_particle_pT_contributed"), piMinusvectors[1].Pt()); - - histosMCgen.fill(HIST("MCgen_particle_rapidity_contributed"), piPlusvectors[0].Rapidity()); - histosMCgen.fill(HIST("MCgen_particle_rapidity_contributed"), piPlusvectors[1].Rapidity()); - histosMCgen.fill(HIST("MCgen_particle_rapidity_contributed"), piMinusvectors[0].Rapidity()); - histosMCgen.fill(HIST("MCgen_particle_rapidity_contributed"), piMinusvectors[1].Rapidity()); - - histosMCgen.fill(HIST("MCgen_4pion_pT"), p1234.Pt()); - histosMCgen.fill(HIST("MCgen_4pion_rapidity"), p1234.Rapidity()); - histosMCgen.fill(HIST("MCgen_4pion_invmass"), p1234.M()); - - histosMCgen.fill(HIST("MCgen_invMass_pair_1"), (piPlusvectors[0] + piMinusvectors[0]).M()); - histosMCgen.fill(HIST("MCgen_invMass_pair_2"), (piPlusvectors[0] + piMinusvectors[1]).M()); - histosMCgen.fill(HIST("MCgen_invMass_pair_3"), (piPlusvectors[1] + piMinusvectors[0]).M()); - histosMCgen.fill(HIST("MCgen_invMass_pair_4"), (piPlusvectors[1] + piMinusvectors[1]).M()); + std::vector pipt; + std::vector pieta; + std::vector piphi; + std::vector pirapidity; + + pipt.push_back(piPlusvectors[0].Pt()); + pipt.push_back(piPlusvectors[1].Pt()); + pipt.push_back(piMinusvectors[0].Pt()); + pipt.push_back(piMinusvectors[1].Pt()); + + pieta.push_back(piPlusvectors[0].Eta()); + pieta.push_back(piPlusvectors[1].Eta()); + pieta.push_back(piMinusvectors[0].Eta()); + pieta.push_back(piMinusvectors[1].Eta()); + + piphi.push_back(piPlusvectors[0].Phi()); + piphi.push_back(piPlusvectors[1].Phi()); + piphi.push_back(piMinusvectors[0].Phi()); + piphi.push_back(piMinusvectors[1].Phi()); + + pirapidity.push_back(piPlusvectors[0].Rapidity()); + pirapidity.push_back(piPlusvectors[1].Rapidity()); + pirapidity.push_back(piMinusvectors[0].Rapidity()); + pirapidity.push_back(piMinusvectors[1].Rapidity()); + + TLorentzVector p1234 = piPlusvectors[0] + piPlusvectors[1] + piMinusvectors[0] + piMinusvectors[1]; + + histosMCgen.fill(HIST("pion_pT"), piPlusvectors[0].Pt()); + histosMCgen.fill(HIST("pion_pT"), piPlusvectors[1].Pt()); + histosMCgen.fill(HIST("pion_pT"), piMinusvectors[0].Pt()); + histosMCgen.fill(HIST("pion_pT"), piMinusvectors[1].Pt()); + + histosMCgen.fill(HIST("pion_eta"), piPlusvectors[0].Eta()); + histosMCgen.fill(HIST("pion_eta"), piPlusvectors[1].Eta()); + histosMCgen.fill(HIST("pion_eta"), piMinusvectors[0].Eta()); + histosMCgen.fill(HIST("pion_eta"), piMinusvectors[1].Eta()); + + histosMCgen.fill(HIST("pion_rapidity"), piPlusvectors[0].Rapidity()); + histosMCgen.fill(HIST("pion_rapidity"), piPlusvectors[1].Rapidity()); + histosMCgen.fill(HIST("pion_rapidity"), piMinusvectors[0].Rapidity()); + histosMCgen.fill(HIST("pion_rapidity"), piMinusvectors[1].Rapidity()); + + histosMCgen.fill(HIST("fourPion_pT"), p1234.Pt()); + histosMCgen.fill(HIST("fourPion_eta"), p1234.Eta()); + histosMCgen.fill(HIST("fourPion_rapidity"), p1234.Rapidity()); + histosMCgen.fill(HIST("fourPion_invmass"), p1234.M()); + + histosMCgen.fill(HIST("twoPion_invMass_pair_1"), (piPlusvectors[0] + piMinusvectors[0]).M()); + histosMCgen.fill(HIST("twoPion_invMass_pair_2"), (piPlusvectors[0] + piMinusvectors[1]).M()); + histosMCgen.fill(HIST("twoPion_invMass_pair_3"), (piPlusvectors[1] + piMinusvectors[0]).M()); + histosMCgen.fill(HIST("twoPion_invMass_pair_4"), (piPlusvectors[1] + piMinusvectors[1]).M()); ROOT::Math::PtEtaPhiMVector k1, k2, k3, k4, k1234, k13, k14, k23, k24; @@ -1021,16 +1491,17 @@ struct ExclusiveRhoTo4Pi { auto cosThetaPair1 = cosThetaCollinsSoperFrame(k13, k24, k1234); auto cosThetaPair2 = cosThetaCollinsSoperFrame(k14, k23, k1234); - histosMCgen.fill(HIST("MCgen_CS_phi_pair_1"), phiPair1); - histosMCgen.fill(HIST("MCgen_CS_phi_pair_2"), phiPair2); - histosMCgen.fill(HIST("MCgen_CS_costheta_pair_1"), cosThetaPair1); - histosMCgen.fill(HIST("MCgen_CS_costheta_pair_2"), cosThetaPair2); - histosMCgen.fill(HIST("MCgen_phi_cosTheta_pair_1"), phiPair1, cosThetaPair1); - histosMCgen.fill(HIST("MCgen_phi_cosTheta_pair_2"), phiPair2, cosThetaPair2); + generatedMC( + pipt, pieta, piphi, pirapidity, + p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), + phiPair1, phiPair2, cosThetaPair1, cosThetaPair2); - zeroChargeEventsMCgen(piPt, piEta, piRapidity, - p1234.Pt(), p1234.Eta(), p1234.Rapidity(), p1234.M(), - phiPair1, phiPair2, cosThetaPair1, cosThetaPair2); + histosMCgen.fill(HIST("fourPion_phi_pair_1"), phiPair1); + histosMCgen.fill(HIST("fourPion_phi_pair_2"), phiPair2); + histosMCgen.fill(HIST("fourPion_costheta_pair_1"), cosThetaPair1); + histosMCgen.fill(HIST("fourPion_costheta_pair_2"), cosThetaPair2); + histosMCgen.fill(HIST("phi_cosTheta_pair_1"), phiPair1, cosThetaPair1); + histosMCgen.fill(HIST("phi_cosTheta_pair_2"), phiPair2, cosThetaPair2); } // End of 4 Pion MC Generation Process function PROCESS_SWITCH(ExclusiveRhoTo4Pi, processMCgen, "The Process for 4 Pion Analysis from MC Generation", false); @@ -1051,9 +1522,8 @@ struct ExclusiveRhoTo4Pi { } int gapSide = collision.gapSide(); - float fitCuts[5] = {fv0Cut, ft0aCut, ft0cCut, fddaCut, fddcCut}; std::vector parameters = {pvCut, dcaZcut, dcaXYcut, tpcChi2Cut, tpcNClsFindableCut, itsChi2Cut, etaCut, pTcut}; - int truegapSide = sgSelector.trueGap(collision, fitCuts[0], fitCuts[1], fitCuts[2], zdcCut); + int truegapSide = sgSelector.trueGap(collision, fv0Cut, ft0aCut, ft0cCut, zdcCut); histosMCreco.fill(HIST("GapSide"), gapSide); histosMCreco.fill(HIST("TrueGapSide"), truegapSide); histosMCreco.fill(HIST("EventCounts"), 1); @@ -1070,14 +1540,8 @@ struct ExclusiveRhoTo4Pi { histosMCreco.fill(HIST("ZDC_A"), collision.energyCommonZNA()); histosMCreco.fill(HIST("ZDC_C"), collision.energyCommonZNC()); - if (strictEventSelection) { - if (collision.numContrib() != 4) { - return; - } - } else { - if (collision.numContrib() >= 10) { - return; - } + if (collision.numContrib() != 4) { + return; } std::vector WOTS_tracks; @@ -1171,6 +1635,30 @@ struct ExclusiveRhoTo4Pi { // Selecting Events with net charge = 0 if (numPionMinusTRacks == 2 && numPiPlusTracks == 2) { + std::vector dcaxy; + std::vector dcaz; + + std::vector tpcnsigPi; + std::vector tpcnsigKa; + std::vector tpcnsigPr; + std::vector tpcnsigEl; + std::vector tpcnsigMu; + + std::vector tofnsigPi; + std::vector tofnsigKa; + std::vector tofnsigPr; + std::vector tofnsigEl; + std::vector tofnsigMu; + + std::vector tpcchi2; + std::vector tpcnclsfindable; + std::vector itschi2; + + std::vector pipt; + std::vector pieta; + std::vector piphi; + std::vector pirapidity; + TLorentzVector p1, p2, p3, p4, p1234; ROOT::Math::PtEtaPhiMVector k1, k2, k3, k4, k1234, k13, k14, k23, k24; @@ -1194,38 +1682,6 @@ struct ExclusiveRhoTo4Pi { k3.SetCoordinates(p3.Pt(), p3.Eta(), p3.Phi(), o2::constants::physics::MassPionCharged); k4.SetCoordinates(p4.Pt(), p4.Eta(), p4.Phi(), o2::constants::physics::MassPionCharged); - p1234 = p1 + p2 + p3 + p4; - k1234 = k1 + k2 + k3 + k4; - - k13 = k1 + k3; - k14 = k1 + k4; - k23 = k2 + k3; - k24 = k2 + k4; - - auto phiPair1 = phiCollinsSoperFrame(k13, k24, k1234); - auto phiPair2 = phiCollinsSoperFrame(k14, k23, k1234); - auto cosThetaPair1 = cosThetaCollinsSoperFrame(k13, k24, k1234); - auto cosThetaPair2 = cosThetaCollinsSoperFrame(k14, k23, k1234); - - std::vector dcaxy; - std::vector dcaz; - - std::vector tpcNsigKa; - std::vector tpcNsigPr; - std::vector tpcNsigEl; - std::vector tpcNsigMu; - std::vector tofNsigKa; - std::vector tofNsigPr; - std::vector tofNsigEl; - std::vector tofNsigMu; - std::vector tpcchi2; - std::vector itschi2; - std::vector tpcNFindableCls; - - std::vector piPt; - std::vector piEta; - std::vector piRapidity; - dcaxy.push_back(Pi_plus_tracks[0].dcaXY()); dcaxy.push_back(Pi_plus_tracks[1].dcaXY()); dcaxy.push_back(Pi_minus_tracks[0].dcaXY()); @@ -1236,84 +1692,115 @@ struct ExclusiveRhoTo4Pi { dcaz.push_back(Pi_minus_tracks[0].dcaZ()); dcaz.push_back(Pi_minus_tracks[1].dcaZ()); - tpcNsigKa.push_back(Pi_plus_tracks[0].tpcNSigmaKa()); - tpcNsigKa.push_back(Pi_plus_tracks[1].tpcNSigmaKa()); - tpcNsigKa.push_back(Pi_minus_tracks[0].tpcNSigmaKa()); - tpcNsigKa.push_back(Pi_minus_tracks[1].tpcNSigmaKa()); - - tpcNsigPr.push_back(Pi_plus_tracks[0].tpcNSigmaPr()); - tpcNsigPr.push_back(Pi_plus_tracks[1].tpcNSigmaPr()); - tpcNsigPr.push_back(Pi_minus_tracks[0].tpcNSigmaPr()); - tpcNsigPr.push_back(Pi_minus_tracks[1].tpcNSigmaPr()); - - tpcNsigEl.push_back(Pi_plus_tracks[0].tpcNSigmaEl()); - tpcNsigEl.push_back(Pi_plus_tracks[1].tpcNSigmaEl()); - tpcNsigEl.push_back(Pi_minus_tracks[0].tpcNSigmaEl()); - tpcNsigEl.push_back(Pi_minus_tracks[1].tpcNSigmaEl()); - - tpcNsigMu.push_back(Pi_plus_tracks[0].tpcNSigmaMu()); - tpcNsigMu.push_back(Pi_plus_tracks[1].tpcNSigmaMu()); - tpcNsigMu.push_back(Pi_minus_tracks[0].tpcNSigmaMu()); - tpcNsigMu.push_back(Pi_minus_tracks[1].tpcNSigmaMu()); - - tofNsigKa.push_back(Pi_plus_tracks[0].tofNSigmaKa()); - tofNsigKa.push_back(Pi_plus_tracks[1].tofNSigmaKa()); - tofNsigKa.push_back(Pi_minus_tracks[0].tofNSigmaKa()); - tofNsigKa.push_back(Pi_minus_tracks[1].tofNSigmaKa()); - - tofNsigPr.push_back(Pi_plus_tracks[0].tofNSigmaPr()); - tofNsigPr.push_back(Pi_plus_tracks[1].tofNSigmaPr()); - tofNsigPr.push_back(Pi_minus_tracks[0].tofNSigmaPr()); - tofNsigPr.push_back(Pi_minus_tracks[1].tofNSigmaPr()); - - tofNsigEl.push_back(Pi_plus_tracks[0].tofNSigmaEl()); - tofNsigEl.push_back(Pi_plus_tracks[1].tofNSigmaEl()); - tofNsigEl.push_back(Pi_minus_tracks[0].tofNSigmaEl()); - tofNsigEl.push_back(Pi_minus_tracks[1].tofNSigmaEl()); - - tofNsigMu.push_back(Pi_plus_tracks[0].tofNSigmaMu()); - tofNsigMu.push_back(Pi_plus_tracks[1].tofNSigmaMu()); - tofNsigMu.push_back(Pi_minus_tracks[0].tofNSigmaMu()); - tofNsigMu.push_back(Pi_minus_tracks[1].tofNSigmaMu()); + tpcnsigPi.push_back(Pi_plus_tracks[0].tpcNSigmaPi()); + tpcnsigPi.push_back(Pi_plus_tracks[1].tpcNSigmaPi()); + tpcnsigPi.push_back(Pi_minus_tracks[0].tpcNSigmaPi()); + tpcnsigPi.push_back(Pi_minus_tracks[1].tpcNSigmaPi()); + + tpcnsigKa.push_back(Pi_plus_tracks[0].tpcNSigmaKa()); + tpcnsigKa.push_back(Pi_plus_tracks[1].tpcNSigmaKa()); + tpcnsigKa.push_back(Pi_minus_tracks[0].tpcNSigmaKa()); + tpcnsigKa.push_back(Pi_minus_tracks[1].tpcNSigmaKa()); + + tpcnsigPr.push_back(Pi_plus_tracks[0].tpcNSigmaPr()); + tpcnsigPr.push_back(Pi_plus_tracks[1].tpcNSigmaPr()); + tpcnsigPr.push_back(Pi_minus_tracks[0].tpcNSigmaPr()); + tpcnsigPr.push_back(Pi_minus_tracks[1].tpcNSigmaPr()); + + tpcnsigEl.push_back(Pi_plus_tracks[0].tpcNSigmaEl()); + tpcnsigEl.push_back(Pi_plus_tracks[1].tpcNSigmaEl()); + tpcnsigEl.push_back(Pi_minus_tracks[0].tpcNSigmaEl()); + tpcnsigEl.push_back(Pi_minus_tracks[1].tpcNSigmaEl()); + + tpcnsigMu.push_back(Pi_plus_tracks[0].tpcNSigmaMu()); + tpcnsigMu.push_back(Pi_plus_tracks[1].tpcNSigmaMu()); + tpcnsigMu.push_back(Pi_minus_tracks[0].tpcNSigmaMu()); + tpcnsigMu.push_back(Pi_minus_tracks[1].tpcNSigmaMu()); + + tofnsigPi.push_back(Pi_plus_tracks[0].tofNSigmaPi()); + tofnsigPi.push_back(Pi_plus_tracks[1].tofNSigmaPi()); + tofnsigPi.push_back(Pi_minus_tracks[0].tofNSigmaPi()); + tofnsigPi.push_back(Pi_minus_tracks[1].tofNSigmaPi()); + + tofnsigKa.push_back(Pi_plus_tracks[0].tofNSigmaKa()); + tofnsigKa.push_back(Pi_plus_tracks[1].tofNSigmaKa()); + tofnsigKa.push_back(Pi_minus_tracks[0].tofNSigmaKa()); + tofnsigKa.push_back(Pi_minus_tracks[1].tofNSigmaKa()); + + tofnsigPr.push_back(Pi_plus_tracks[0].tofNSigmaPr()); + tofnsigPr.push_back(Pi_plus_tracks[1].tofNSigmaPr()); + tofnsigPr.push_back(Pi_minus_tracks[0].tofNSigmaPr()); + tofnsigPr.push_back(Pi_minus_tracks[1].tofNSigmaPr()); + + tofnsigEl.push_back(Pi_plus_tracks[0].tofNSigmaEl()); + tofnsigEl.push_back(Pi_plus_tracks[1].tofNSigmaEl()); + tofnsigEl.push_back(Pi_minus_tracks[0].tofNSigmaEl()); + tofnsigEl.push_back(Pi_minus_tracks[1].tofNSigmaEl()); + + tofnsigMu.push_back(Pi_plus_tracks[0].tofNSigmaMu()); + tofnsigMu.push_back(Pi_plus_tracks[1].tofNSigmaMu()); + tofnsigMu.push_back(Pi_minus_tracks[0].tofNSigmaMu()); + tofnsigMu.push_back(Pi_minus_tracks[1].tofNSigmaMu()); tpcchi2.push_back(Pi_plus_tracks[0].tpcChi2NCl()); tpcchi2.push_back(Pi_plus_tracks[1].tpcChi2NCl()); tpcchi2.push_back(Pi_minus_tracks[0].tpcChi2NCl()); tpcchi2.push_back(Pi_minus_tracks[1].tpcChi2NCl()); - tpcNFindableCls.push_back(Pi_plus_tracks[0].tpcNClsFindable()); - tpcNFindableCls.push_back(Pi_plus_tracks[1].tpcNClsFindable()); - tpcNFindableCls.push_back(Pi_minus_tracks[0].tpcNClsFindable()); - tpcNFindableCls.push_back(Pi_minus_tracks[1].tpcNClsFindable()); + tpcnclsfindable.push_back(Pi_plus_tracks[0].tpcNClsFindable()); + tpcnclsfindable.push_back(Pi_plus_tracks[1].tpcNClsFindable()); + tpcnclsfindable.push_back(Pi_minus_tracks[0].tpcNClsFindable()); + tpcnclsfindable.push_back(Pi_minus_tracks[1].tpcNClsFindable()); itschi2.push_back(Pi_plus_tracks[0].itsChi2NCl()); itschi2.push_back(Pi_plus_tracks[1].itsChi2NCl()); itschi2.push_back(Pi_minus_tracks[0].itsChi2NCl()); itschi2.push_back(Pi_minus_tracks[1].itsChi2NCl()); - piPt.push_back(p1.Pt()); - piPt.push_back(p2.Pt()); - piPt.push_back(p3.Pt()); - piPt.push_back(p4.Pt()); + pipt.push_back(p1.Pt()); + pipt.push_back(p2.Pt()); + pipt.push_back(p3.Pt()); + pipt.push_back(p4.Pt()); + + pieta.push_back(p1.Eta()); + pieta.push_back(p2.Eta()); + pieta.push_back(p3.Eta()); + pieta.push_back(p4.Eta()); - piEta.push_back(p1.Eta()); - piEta.push_back(p2.Eta()); - piEta.push_back(p3.Eta()); - piEta.push_back(p4.Eta()); + piphi.push_back(p1.Phi()); + piphi.push_back(p2.Phi()); + piphi.push_back(p3.Phi()); + piphi.push_back(p4.Phi()); - piRapidity.push_back(p1.Rapidity()); - piRapidity.push_back(p2.Rapidity()); - piRapidity.push_back(p3.Rapidity()); - piRapidity.push_back(p4.Rapidity()); + pirapidity.push_back(p1.Rapidity()); + pirapidity.push_back(p2.Rapidity()); + pirapidity.push_back(p3.Rapidity()); + pirapidity.push_back(p4.Rapidity()); - zeroChargeEventsMCreco( + p1234 = p1 + p2 + p3 + p4; + k1234 = k1 + k2 + k3 + k4; + + k13 = k1 + k3; + k14 = k1 + k4; + k23 = k2 + k3; + k24 = k2 + k4; + + double phiPair1 = phiCollinsSoperFrame(k13, k24, k1234); + double phiPair2 = phiCollinsSoperFrame(k14, k23, k1234); + double cosThetaPair1 = cosThetaCollinsSoperFrame(k13, k24, k1234); + double cosThetaPair2 = cosThetaCollinsSoperFrame(k14, k23, k1234); + + sigFromMC( + collision.posX(), collision.posY(), collision.posZ(), collision.totalFV0AmplitudeA(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), + collision.timeFV0A(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFDDA(), collision.timeFDDC(), + collision.timeZNA(), collision.timeZNC(), dcaxy, dcaz, - tpcNsigKa, tpcNsigPr, tpcNsigMu, tpcNsigEl, - tofNsigKa, tofNsigPr, tofNsigMu, tofNsigEl, - tpcchi2, tpcNFindableCls, itschi2, - piPt, piEta, piRapidity, - p1234.Pt(), p1234.Eta(), p1234.Rapidity(), p1234.M(), p1234.Phi(), + tpcnsigPi, tpcnsigKa, tpcnsigPr, tpcnsigEl, tpcnsigMu, + tofnsigPi, tofnsigKa, tofnsigPr, tofnsigEl, tofnsigMu, + tpcchi2, tpcnclsfindable, itschi2, + pipt, pieta, piphi, pirapidity, + p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), phiPair1, phiPair2, cosThetaPair1, cosThetaPair2); if (std::fabs(p1234.Rapidity()) < 0.5) { @@ -1379,6 +1866,208 @@ struct ExclusiveRhoTo4Pi { } // End of 4 Pion Analysis Process function for MC Reconstruction PROCESS_SWITCH(ExclusiveRhoTo4Pi, processMCrec, "The Process for 4 Pion Analysis from MC Reconstruction", false); + using FilteredTrackStuff = soa::Filtered>; + using FilteredCollisionStuff = soa::Filtered>; + using FilteredCollisionTotal = FilteredCollisionStuff::iterator; + + void processMCrecFast(FilteredCollisionTotal const& collision, FilteredTrackStuff const& tracks) + { + + if ((tracks.size() != 4) || (!collision.has_udMcCollision())) { + return; + } + + std::vector pionPlusTracks; + std::vector pionMinusTracks; + + for (const auto& track : tracks) { + if ((!selectionPIDPion(track, true, nSigmaTPCcut, nSigmaTOFcut)) || (!track.has_udMcParticle())) { + continue; + } + if (track.sign() == 1) { + pionPlusTracks.push_back(track); + } + if (track.sign() == -1) { + pionMinusTracks.push_back(track); + } + } // end of loop over tracks + + if ((pionPlusTracks.size() + pionMinusTracks.size()) != 4) { + return; + } + + if (pionPlusTracks.size() == 2 || pionMinusTracks.size() == 2) { + + std::vector dcaxy; + std::vector dcaz; + + std::vector tpcnsigPi; + std::vector tpcnsigKa; + std::vector tpcnsigPr; + std::vector tpcnsigEl; + std::vector tpcnsigMu; + + std::vector tofnsigPi; + std::vector tofnsigKa; + std::vector tofnsigPr; + std::vector tofnsigEl; + std::vector tofnsigMu; + + std::vector tpcchi2; + std::vector tpcnclsfindable; + std::vector itschi2; + + std::vector pipt; + std::vector pieta; + std::vector piphi; + std::vector pirapidity; + + TLorentzVector p1, p2, p3, p4, p1234; + ROOT::Math::PtEtaPhiMVector k1, k2, k3, k4, k1234, k13, k14, k23, k24; + + p1.SetXYZM(pionPlusTracks[0].px(), pionPlusTracks[0].py(), pionPlusTracks[0].pz(), o2::constants::physics::MassPionCharged); + p2.SetXYZM(pionPlusTracks[1].px(), pionPlusTracks[1].py(), pionPlusTracks[1].pz(), o2::constants::physics::MassPionCharged); + p3.SetXYZM(pionMinusTracks[0].px(), pionMinusTracks[0].py(), pionMinusTracks[0].pz(), o2::constants::physics::MassPionCharged); + p4.SetXYZM(pionMinusTracks[1].px(), pionMinusTracks[1].py(), pionMinusTracks[1].pz(), o2::constants::physics::MassPionCharged); + + k1.SetCoordinates(p1.Pt(), p1.Eta(), p1.Phi(), o2::constants::physics::MassPionCharged); + k2.SetCoordinates(p2.Pt(), p2.Eta(), p2.Phi(), o2::constants::physics::MassPionCharged); + k3.SetCoordinates(p3.Pt(), p3.Eta(), p3.Phi(), o2::constants::physics::MassPionCharged); + k4.SetCoordinates(p4.Pt(), p4.Eta(), p4.Phi(), o2::constants::physics::MassPionCharged); + + dcaxy.push_back(pionPlusTracks[0].dcaXY()); + dcaxy.push_back(pionPlusTracks[1].dcaXY()); + dcaxy.push_back(pionMinusTracks[0].dcaXY()); + dcaxy.push_back(pionMinusTracks[1].dcaXY()); + + dcaz.push_back(pionPlusTracks[0].dcaZ()); + dcaz.push_back(pionPlusTracks[1].dcaZ()); + dcaz.push_back(pionMinusTracks[0].dcaZ()); + dcaz.push_back(pionMinusTracks[1].dcaZ()); + + tpcnsigPi.push_back(pionPlusTracks[0].tpcNSigmaPi()); + tpcnsigPi.push_back(pionPlusTracks[1].tpcNSigmaPi()); + tpcnsigPi.push_back(pionMinusTracks[0].tpcNSigmaPi()); + tpcnsigPi.push_back(pionMinusTracks[1].tpcNSigmaPi()); + + tpcnsigKa.push_back(pionPlusTracks[0].tpcNSigmaKa()); + tpcnsigKa.push_back(pionPlusTracks[1].tpcNSigmaKa()); + tpcnsigKa.push_back(pionMinusTracks[0].tpcNSigmaKa()); + tpcnsigKa.push_back(pionMinusTracks[1].tpcNSigmaKa()); + + tpcnsigPr.push_back(pionPlusTracks[0].tpcNSigmaPr()); + tpcnsigPr.push_back(pionPlusTracks[1].tpcNSigmaPr()); + tpcnsigPr.push_back(pionMinusTracks[0].tpcNSigmaPr()); + tpcnsigPr.push_back(pionMinusTracks[1].tpcNSigmaPr()); + + tpcnsigEl.push_back(pionPlusTracks[0].tpcNSigmaEl()); + tpcnsigEl.push_back(pionPlusTracks[1].tpcNSigmaEl()); + tpcnsigEl.push_back(pionMinusTracks[0].tpcNSigmaEl()); + tpcnsigEl.push_back(pionMinusTracks[1].tpcNSigmaEl()); + + tpcnsigMu.push_back(pionPlusTracks[0].tpcNSigmaMu()); + tpcnsigMu.push_back(pionPlusTracks[1].tpcNSigmaMu()); + tpcnsigMu.push_back(pionMinusTracks[0].tpcNSigmaMu()); + tpcnsigMu.push_back(pionMinusTracks[1].tpcNSigmaMu()); + + tofnsigPi.push_back(pionPlusTracks[0].tofNSigmaPi()); + tofnsigPi.push_back(pionPlusTracks[1].tofNSigmaPi()); + tofnsigPi.push_back(pionMinusTracks[0].tofNSigmaPi()); + tofnsigPi.push_back(pionMinusTracks[1].tofNSigmaPi()); + + tofnsigKa.push_back(pionPlusTracks[0].tofNSigmaKa()); + tofnsigKa.push_back(pionPlusTracks[1].tofNSigmaKa()); + tofnsigKa.push_back(pionMinusTracks[0].tofNSigmaKa()); + tofnsigKa.push_back(pionMinusTracks[1].tofNSigmaKa()); + + tofnsigPr.push_back(pionPlusTracks[0].tofNSigmaPr()); + tofnsigPr.push_back(pionPlusTracks[1].tofNSigmaPr()); + tofnsigPr.push_back(pionMinusTracks[0].tofNSigmaPr()); + tofnsigPr.push_back(pionMinusTracks[1].tofNSigmaPr()); + + tofnsigEl.push_back(pionPlusTracks[0].tofNSigmaEl()); + tofnsigEl.push_back(pionPlusTracks[1].tofNSigmaEl()); + tofnsigEl.push_back(pionMinusTracks[0].tofNSigmaEl()); + tofnsigEl.push_back(pionMinusTracks[1].tofNSigmaEl()); + + tofnsigMu.push_back(pionPlusTracks[0].tofNSigmaMu()); + tofnsigMu.push_back(pionPlusTracks[1].tofNSigmaMu()); + tofnsigMu.push_back(pionMinusTracks[0].tofNSigmaMu()); + tofnsigMu.push_back(pionMinusTracks[1].tofNSigmaMu()); + + tpcchi2.push_back(pionPlusTracks[0].tpcChi2NCl()); + tpcchi2.push_back(pionPlusTracks[1].tpcChi2NCl()); + tpcchi2.push_back(pionMinusTracks[0].tpcChi2NCl()); + tpcchi2.push_back(pionMinusTracks[1].tpcChi2NCl()); + + tpcnclsfindable.push_back(pionPlusTracks[0].tpcNClsFindable()); + tpcnclsfindable.push_back(pionPlusTracks[1].tpcNClsFindable()); + tpcnclsfindable.push_back(pionMinusTracks[0].tpcNClsFindable()); + tpcnclsfindable.push_back(pionMinusTracks[1].tpcNClsFindable()); + + itschi2.push_back(pionPlusTracks[0].itsChi2NCl()); + itschi2.push_back(pionPlusTracks[1].itsChi2NCl()); + itschi2.push_back(pionMinusTracks[0].itsChi2NCl()); + itschi2.push_back(pionMinusTracks[1].itsChi2NCl()); + + pipt.push_back(p1.Pt()); + pipt.push_back(p2.Pt()); + pipt.push_back(p3.Pt()); + pipt.push_back(p4.Pt()); + + pieta.push_back(p1.Eta()); + pieta.push_back(p2.Eta()); + pieta.push_back(p3.Eta()); + pieta.push_back(p4.Eta()); + + piphi.push_back(p1.Phi()); + piphi.push_back(p2.Phi()); + piphi.push_back(p3.Phi()); + piphi.push_back(p4.Phi()); + + pirapidity.push_back(p1.Rapidity()); + pirapidity.push_back(p2.Rapidity()); + pirapidity.push_back(p3.Rapidity()); + pirapidity.push_back(p4.Rapidity()); + + p1234 = p1 + p2 + p3 + p4; + k1234 = k1 + k2 + k3 + k4; + + k13 = k1 + k3; + k14 = k1 + k4; + k23 = k2 + k3; + k24 = k2 + k4; + + double fourPiPhiPair1 = phiCollinsSoperFrame(k13, k24, k1234); + double fourPiPhiPair2 = phiCollinsSoperFrame(k14, k23, k1234); + double fourPiCosThetaPair1 = cosThetaCollinsSoperFrame(k13, k24, k1234); + double fourPiCosThetaPair2 = cosThetaCollinsSoperFrame(k14, k23, k1234); + + sigFromMC( + collision.posX(), collision.posY(), collision.posZ(), + collision.totalFV0AmplitudeA(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), + collision.timeFV0A(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFDDA(), collision.timeFDDC(), + collision.timeZNA(), collision.timeZNC(), + dcaxy, dcaz, + tpcnsigPi, tpcnsigKa, tpcnsigPr, tpcnsigEl, tpcnsigMu, + tofnsigPi, tofnsigKa, tofnsigPr, tofnsigEl, tofnsigMu, + tpcchi2, tpcnclsfindable, itschi2, + pipt, pieta, piphi, pirapidity, + p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), + fourPiPhiPair1, fourPiPhiPair2, fourPiCosThetaPair1, fourPiCosThetaPair2); + + histosFast.fill(HIST("4PionPt"), p1234.Pt()); + histosFast.fill(HIST("4PionRapidity"), p1234.Rapidity()); + histosFast.fill(HIST("4PionMassFull"), p1234.M()); + + if ((p1234.Pt() < 0.15) && (std::abs(p1234.Rapidity()) < 0.5)) { + histosFast.fill(HIST("4PionMassWithCut"), p1234.M()); + } + } // End 0 charge event + } // End of 4 Pion Analysis Process function for Fast MC Reconstruction + + PROCESS_SWITCH(ExclusiveRhoTo4Pi, processMCrecFast, "The Process for 4 Pion Analysis from Fast MC Reconstruction", false); + }; // End of Struct exclusiveRhoTo4Pi ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// From 3c9529cf3fc11e779250db9b602589210abc3f7e Mon Sep 17 00:00:00 2001 From: abilandz Date: Tue, 18 Mar 2025 22:24:20 +0100 Subject: [PATCH 0750/1650] [PWGCF] - added additional QA histograms vs ir (#10560) --- .../Core/MuPa-Configurables.h | 7 +- .../Core/MuPa-Enums.h | 15 +- .../Core/MuPa-MemberFunctions.h | 288 ++++++++++++++---- 3 files changed, 244 insertions(+), 66 deletions(-) diff --git a/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h b/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h index 90ad11ed80a..9da2b5cfda3 100644 --- a/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h +++ b/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h @@ -46,7 +46,7 @@ struct : ConfigurableGroup { Configurable cfCheckUnderflowAndOverflow{"cfCheckUnderflowAndOverflow", false, "check and bail out if in event and particle histograms there are entries which went to underflow or overflow bins (use only locally)"}; Configurable cfRebin{"cfRebin", 1, "number of bins of selected heavy 2D histograms are devided with this number"}; Configurable cfFillQAEventHistograms2D{"cfFillQAEventHistograms2D", false, "if false, all QA 2D event histograms are not filled. if true, only the ones for which fBookQAEventHistograms2D[...] is true, are filled"}; - Configurable> cfBookQAEventHistograms2D{"cfBookQAEventHistograms2D", {"1-Multiplicity_vs_ReferenceMultiplicity", "1-Multiplicity_vs_NContributors", "1-Multiplicity_vs_Centrality", "1-Multiplicity_vs_Vertex_z", "1-Multiplicity_vs_Occupancy", "1-ReferenceMultiplicity_vs_NContributors", "1-ReferenceMultiplicity_vs_Centrality", "1-ReferenceMultiplicity_vs_Vertex_z", "1-ReferenceMultiplicity_vs_Occupancy", "1-NContributors_vs_Centrality", "1-NContributors_vs_Vertex_z", "1-NContributors_vs_Occupancy", "1-Centrality_vs_Vertex_z", "1-Centrality_vs_Occupancy", "0-Centrality_vs_ImpactParameter", "1-Vertex_z_vs_Occupancy", "0-MultNTracksPV_vs_MultNTracksGlobal", "1-CentFT0C_vs_CentFT0CVariant1", "1-CentFT0C_vs_CentFT0M", "1-CentFT0C_vs_CentFV0A", "0-CentFT0C_vs_CentNTPV", "0-CentFT0C_vs_CentNGlobal", "0-CentFT0M_vs_CentNTPV", "0-CentRun2V0M_vs_CentRun2SPDTracklets", "1-TrackOccupancyInTimeRange_vs_FT0COccupancyInTimeRange", "1-CurrentRunDuration_vs_InteractionRate"}, "book (1) or do not book (0) this QA 2D event histogram"}; + Configurable> cfBookQAEventHistograms2D{"cfBookQAEventHistograms2D", {"1-Multiplicity_vs_ReferenceMultiplicity", "1-Multiplicity_vs_NContributors", "1-Multiplicity_vs_Centrality", "1-Multiplicity_vs_Vertex_z", "1-Multiplicity_vs_Occupancy", "1-Multiplicity_vs_InteractionRate", "1-ReferenceMultiplicity_vs_NContributors", "1-ReferenceMultiplicity_vs_Centrality", "1-ReferenceMultiplicity_vs_Vertex_z", "1-ReferenceMultiplicity_vs_Occupancy", "1-ReferenceMultiplicity_vs_InteractionRate", "1-NContributors_vs_Centrality", "1-NContributors_vs_Vertex_z", "1-NContributors_vs_Occupancy", "1-NContributors_vs_InteractionRate", "1-Centrality_vs_Vertex_z", "1-Centrality_vs_Occupancy", "0-Centrality_vs_ImpactParameter", "1-Centrality_vs_InteractionRate", "1-Vertex_z_vs_Occupancy", "1-Vertex_z_vs_InteractionRate", "0-MultNTracksPV_vs_MultNTracksGlobal", "1-CentFT0C_vs_CentFT0CVariant1", "1-CentFT0C_vs_CentFT0M", "1-CentFT0C_vs_CentFV0A", "0-CentFT0C_vs_CentNTPV", "0-CentFT0C_vs_CentNGlobal", "0-CentFT0M_vs_CentNTPV", "0-CentRun2V0M_vs_CentRun2SPDTracklets", "1-TrackOccupancyInTimeRange_vs_FT0COccupancyInTimeRange", "1-CurrentRunDuration_vs_InteractionRate"}, "book (1) or do not book (0) this QA 2D event histogram"}; Configurable cfFillQAParticleHistograms2D{"cfFillQAParticleHistograms2D", false, "if false, all QA 2D particle histograms are not filled. if true, only the ones for which fBookQAParticleHistograms2D[...] is true, are filled"}; Configurable> cfBookQAParticleHistograms2D{"cfBookQAParticleHistograms2D", {"1-Pt_vs_dcaXY"}, "book (1) or do not book (0) this QA 2D particle histogram"}; Configurable cfFillQAParticleEventHistograms2D{"cfFillQAParticleEventHistograms2D", false, "if false, all QA 2D particle event histograms are not filled. if true, only the ones for which fBookQAParticleEventHistograms2D[...] is true, are filled"}; @@ -70,7 +70,7 @@ struct : ConfigurableGroup { // *) Event cuts: struct : ConfigurableGroup { - Configurable> cfUseEventCuts{"cfUseEventCuts", {"1-NumberOfEvents", "1-TotalMultiplicity", "1-Multiplicity", "1-ReferenceMultiplicity", "1-Centrality", "1-Vertex_x", "1-Vertex_y", "1-Vertex_z", "1-NContributors", "1-ImpactParameter", "0-EventPlaneAngle", "1-Occupancy", "1-InteractionRate", "1-CurrentRunDuration", "0-MultMCNParticlesEta08", "0-Trigger", "0-Sel7", "1-Sel8", "1-MultiplicityEstimator", "1-ReferenceMultiplicityEstimator", "1-CentralityEstimator", "1-SelectedEvents", "1-NoSameBunchPileup", "1-IsGoodZvtxFT0vsPV", "1-IsVertexITSTPC", "1-IsVertexTOFmatched", "1-IsVertexTRDmatched", "0-NoCollInTimeRangeStrict", "0-NoCollInTimeRangeStandard", "0-NoCollInRofStrict", "0-NoCollInRofStandard", "0-NoHighMultCollInPrevRof", "0-IsGoodITSLayer3", "0-IsGoodITSLayer0123", "0-IsGoodITSLayersAll", "1-OccupancyEstimator", "1-MinVertexDistanceFromIP", "1-CentralityWeights"}, "use (1) or do not use (0) event cuts"}; + Configurable> cfUseEventCuts{"cfUseEventCuts", {"1-NumberOfEvents", "1-TotalMultiplicity", "1-Multiplicity", "1-ReferenceMultiplicity", "1-Centrality", "1-Vertex_x", "1-Vertex_y", "1-Vertex_z", "1-NContributors", "1-ImpactParameter", "0-EventPlaneAngle", "1-Occupancy", "1-InteractionRate", "1-CurrentRunDuration", "0-MultMCNParticlesEta08", "0-Trigger", "0-Sel7", "1-Sel8", "1-MultiplicityEstimator", "1-ReferenceMultiplicityEstimator", "1-CentralityEstimator", "1-SelectedEvents", "1-NoSameBunchPileup", "1-IsGoodZvtxFT0vsPV", "1-IsVertexITSTPC", "1-IsVertexTOFmatched", "1-IsVertexTRDmatched", "0-NoCollInTimeRangeStrict", "0-NoCollInTimeRangeStandard", "0-NoCollInRofStrict", "0-NoCollInRofStandard", "0-NoHighMultCollInPrevRof", "0-IsGoodITSLayer3", "0-IsGoodITSLayer0123", "0-IsGoodITSLayersAll", "1-OccupancyEstimator", "1-MinVertexDistanceFromIP", "0-NoPileupTPC", "0-NoPileupFromSPD", "0-NoSPDOnVsOfPileup", "1-CentralityWeights"}, "use (1) or do not use (0) event cuts"}; Configurable cfUseEventCutCounterAbsolute{"cfUseEventCutCounterAbsolute", false, "profile and save how many times each event cut counter triggered (absolute). Use with care, as this is computationally heavy"}; Configurable cfUseEventCutCounterSequential{"cfUseEventCutCounterSequential", false, "profile and save how many times each event cut counter triggered (sequential). Use with care, as this is computationally heavy"}; Configurable cfPrintCutCounterContent{"cfPrintCutCounterContent", false, "if true, prints on the screen after each event the content of fEventCutCounterHist[*][*] (all which were booked)"}; @@ -113,6 +113,9 @@ struct : ConfigurableGroup { Configurable cfUseIsGoodITSLayer3{"cfUseIsGoodITSLayer3", false, "TBI 20241220 explanation (or see enum)"}; Configurable cfUseIsGoodITSLayer0123{"cfUseIsGoodITSLayer0123", false, "TBI 20241220 explanation (or see enum)"}; Configurable cfUseIsGoodITSLayersAll{"cfUseIsGoodITSLayersAll", false, "TBI 20241220 explanation (or see enum)"}; + Configurable cfUseNoPileupTPC{"cfUseNoPileupTPC", false, "TBI 20250318 explanation"}; + Configurable cfUseNoPileupFromSPD{"cfUseNoPileupFromSPD", false, "TBI 20250318 explanation"}; + Configurable cfUseNoSPDOnVsOfPileup{"cfUseNoSPDOnVsOfPileup", false, "TBI 20250318 explanation"}; Configurable cfOccupancyEstimator{"cfOccupancyEstimator", "FT0COccupancyInTimeRange", "set here some supported occupancy estimator (TrackOccupancyInTimeRange, FT0COccupancyInTimeRange, ..."}; } cf_ec; diff --git a/PWGCF/MultiparticleCorrelations/Core/MuPa-Enums.h b/PWGCF/MultiparticleCorrelations/Core/MuPa-Enums.h index 65904fe9e07..0f64abc86ff 100644 --- a/PWGCF/MultiparticleCorrelations/Core/MuPa-Enums.h +++ b/PWGCF/MultiparticleCorrelations/Core/MuPa-Enums.h @@ -143,11 +143,11 @@ enum eEventHistograms { }; enum eEventCuts { - // a) For available event selection bits, check https://github.com/AliceO2Group/O2Physics/blob/master/Common/CCDB/EventSelectionParams.cxx + // a) For available event selection bits, check https://github.com/AliceO2Group/O2Physics/blob/master/Common/CCDB/EventSelectionParams.cxx (and .h for better documentation) // b) Some settings are configurable, check: https://github.com/AliceO2Group/O2Physics/blob/master/Common/TableProducer/eventSelection.cxx eTrigger = eEventHistograms_N, // Implemented and validated so far: // a) Run 3: "kTVXinTRD" (use optionally for systematics, and only in real data) - // b) Run 2: "kINT7" (at the moment the usage of this one is enfored in fact) + // b) Run 2: "kINT7" (at the moment there is a warning if not used in real data.). Not validated in Monte Carlo. // c) Run 1: TBI 20241209 check if I can use kINT7 also for Run 1 eSel7, // See def. of sel7 in Ref. b) above. Event selection decision based on V0A & V0C => use only in Run 2 and Run 1. // TBI 20250115 it removes 99% of events in MC LHC21i6a, check this further @@ -179,6 +179,9 @@ enum eEventCuts { eIsGoodITSLayersAll, // numbers of inactive chips on all ITS layers are below maximum allowed values eOccupancyEstimator, // the default Occupancy estimator, set via configurable. All supported centrality estimators, for QA, etc, are in enum eOccupancyEstimators eMinVertexDistanceFromIP, // if sqrt(vx^2+vy^2+vz^2) < MinVertexDistanceFromIP, the event is rejected. This way, I remove suspicious events with |vertex| = 0. + eNoPileupTPC, // no pileup in TPC + eNoPileupFromSPD, // no pileup according to SPD vertexer + eNoSPDOnVsOfPileup, // no out-of-bunch pileup according to online-vs-offline SPD correlation // ... eCentralityWeights, // used for centrality flattening. Remember that this event cut must be implemented very last, // therefore I have it separately implemented for Run 3,2,1 in EventCuts() at the very end in each case. @@ -241,7 +244,7 @@ enum eParticleCuts { etrackCutFlagFb2, // Global tracks in Run 3, similar as etrackCutFlagFb1, but more stringent (since 2 points in ITS are required in inner barrel (IB)). // Unlike etrackCutFlagFb1 (1 ITS point is required), it produces a 20% dip in azimuthal acceptance for 1.2 < phi < 1.6, in LHC24ar/559545 // DCAxy and z are significantly further depleted, when compared to etrackCutFlagFb1 - eisQualityTrack, // Do not use in Run 3, but it can be used in Run 2 and Run 1 (for the latter, it yields to large NUA - TBI 20250114 check this again) + eisQualityTrack, // Do not use in Run 3, but it can be used in Run 2 and Run 1 eisPrimaryTrack, // Validated in Run 3. See also isPVContributor eisInAcceptanceTrack, // kInAcceptanceTracks = kPtRange | kEtaRange . Pt is open, and |eta| < 0.8. // But after I already cut directly on 0.2 < pt < 5.0 and |eta| < 0.8, it has no effect. @@ -259,6 +262,7 @@ enum eParticleCuts { // This cut affects significantly distributions of other tracking parameters. Most notably, after using this cut, DCAz distribution is reduced to ~ 1mm range. // But for global tracks in any case we request very stringent DCA cut. // pt and eta distributions are only mildly affected. + // Do not use in Run 2 and Run 1. // It's not the same as isPrimaryTrack cut, albeit there is an overlap. // special treatment: ePtDependentDCAxyParameterization, @@ -323,17 +327,22 @@ enum eQAEventHistograms2D { eMultiplicity_vs_Centrality, eMultiplicity_vs_Vertex_z, eMultiplicity_vs_Occupancy, + eMultiplicity_vs_InteractionRate, eReferenceMultiplicity_vs_NContributors, eReferenceMultiplicity_vs_Centrality, eReferenceMultiplicity_vs_Vertex_z, eReferenceMultiplicity_vs_Occupancy, + eReferenceMultiplicity_vs_InteractionRate, eNContributors_vs_Centrality, eNContributors_vs_Vertex_z, eNContributors_vs_Occupancy, + eNContributors_vs_InteractionRate, eCentrality_vs_Vertex_z, eCentrality_vs_Occupancy, eCentrality_vs_ImpactParameter, // [sim] = reconstructed centrality vs. simulated impact parameter. [rec] = ... TBI 20241210 + eCentrality_vs_InteractionRate, eVertex_z_vs_Occupancy, + eVertex_z_vs_InteractionRate, // ... // Specific (everything is hardwired): eMultNTracksPV_vs_MultNTracksGlobal, // Run 3 multiplicity diff --git a/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h b/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h index 7faf8c5c42d..5bbbc101a7b 100644 --- a/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h +++ b/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h @@ -292,6 +292,9 @@ void DefaultConfiguration() ec.fEventCutName[eIsGoodITSLayersAll] = "IsGoodITSLayersAll"; ec.fEventCutName[eOccupancyEstimator] = "OccupancyEstimator"; ec.fEventCutName[eMinVertexDistanceFromIP] = "MinVertexDistanceFromIP"; + ec.fEventCutName[eNoPileupTPC] = "NoPileupTPC"; + ec.fEventCutName[eNoPileupFromSPD] = "NoPileupFromSPD"; + ec.fEventCutName[eNoSPDOnVsOfPileup] = "NoSPDOnVsOfPileup"; ec.fEventCutName[eCentralityWeights] = "CentralityWeights"; for (int t = 0; t < eEventCuts_N; t++) { if (ec.fEventCutName[t].EqualTo("")) { @@ -617,17 +620,22 @@ void DefaultConfiguration() qa.fEventHistogramsName2D[eMultiplicity_vs_Centrality] = Form("%s_vs_%s", eh.fEventHistogramsName[eMultiplicity].Data(), eh.fEventHistogramsName[eCentrality].Data()); qa.fEventHistogramsName2D[eMultiplicity_vs_Vertex_z] = Form("%s_vs_%s", eh.fEventHistogramsName[eMultiplicity].Data(), eh.fEventHistogramsName[eVertex_z].Data()); qa.fEventHistogramsName2D[eMultiplicity_vs_Occupancy] = Form("%s_vs_%s", eh.fEventHistogramsName[eMultiplicity].Data(), eh.fEventHistogramsName[eOccupancy].Data()); + qa.fEventHistogramsName2D[eMultiplicity_vs_InteractionRate] = Form("%s_vs_%s", eh.fEventHistogramsName[eMultiplicity].Data(), eh.fEventHistogramsName[eInteractionRate].Data()); qa.fEventHistogramsName2D[eReferenceMultiplicity_vs_NContributors] = Form("%s_vs_%s", eh.fEventHistogramsName[eReferenceMultiplicity].Data(), eh.fEventHistogramsName[eNContributors].Data()); qa.fEventHistogramsName2D[eReferenceMultiplicity_vs_Centrality] = Form("%s_vs_%s", eh.fEventHistogramsName[eReferenceMultiplicity].Data(), eh.fEventHistogramsName[eCentrality].Data()); qa.fEventHistogramsName2D[eReferenceMultiplicity_vs_Vertex_z] = Form("%s_vs_%s", eh.fEventHistogramsName[eReferenceMultiplicity].Data(), eh.fEventHistogramsName[eVertex_z].Data()); qa.fEventHistogramsName2D[eReferenceMultiplicity_vs_Occupancy] = Form("%s_vs_%s", eh.fEventHistogramsName[eReferenceMultiplicity].Data(), eh.fEventHistogramsName[eOccupancy].Data()); + qa.fEventHistogramsName2D[eReferenceMultiplicity_vs_InteractionRate] = Form("%s_vs_%s", eh.fEventHistogramsName[eReferenceMultiplicity].Data(), eh.fEventHistogramsName[eInteractionRate].Data()); qa.fEventHistogramsName2D[eNContributors_vs_Centrality] = Form("%s_vs_%s", eh.fEventHistogramsName[eNContributors].Data(), eh.fEventHistogramsName[eCentrality].Data()); qa.fEventHistogramsName2D[eNContributors_vs_Vertex_z] = Form("%s_vs_%s", eh.fEventHistogramsName[eNContributors].Data(), eh.fEventHistogramsName[eVertex_z].Data()); qa.fEventHistogramsName2D[eNContributors_vs_Occupancy] = Form("%s_vs_%s", eh.fEventHistogramsName[eNContributors].Data(), eh.fEventHistogramsName[eOccupancy].Data()); + qa.fEventHistogramsName2D[eNContributors_vs_InteractionRate] = Form("%s_vs_%s", eh.fEventHistogramsName[eNContributors].Data(), eh.fEventHistogramsName[eInteractionRate].Data()); qa.fEventHistogramsName2D[eCentrality_vs_Vertex_z] = Form("%s_vs_%s", eh.fEventHistogramsName[eCentrality].Data(), eh.fEventHistogramsName[eVertex_z].Data()); qa.fEventHistogramsName2D[eCentrality_vs_Occupancy] = Form("%s_vs_%s", eh.fEventHistogramsName[eCentrality].Data(), eh.fEventHistogramsName[eOccupancy].Data()); qa.fEventHistogramsName2D[eCentrality_vs_ImpactParameter] = Form("%s_vs_%s", eh.fEventHistogramsName[eCentrality].Data(), eh.fEventHistogramsName[eImpactParameter].Data()); + qa.fEventHistogramsName2D[eCentrality_vs_InteractionRate] = Form("%s_vs_%s", eh.fEventHistogramsName[eCentrality].Data(), eh.fEventHistogramsName[eInteractionRate].Data()); qa.fEventHistogramsName2D[eVertex_z_vs_Occupancy] = Form("%s_vs_%s", eh.fEventHistogramsName[eVertex_z].Data(), eh.fEventHistogramsName[eOccupancy].Data()); + qa.fEventHistogramsName2D[eVertex_z_vs_InteractionRate] = Form("%s_vs_%s", eh.fEventHistogramsName[eVertex_z].Data(), eh.fEventHistogramsName[eInteractionRate].Data()); qa.fEventHistogramsName2D[eMultNTracksPV_vs_MultNTracksGlobal] = Form("%s_vs_%s", qa.fReferenceMultiplicityEstimatorName[eMultNTracksPV].Data(), qa.fReferenceMultiplicityEstimatorName[eMultNTracksGlobal].Data()); qa.fEventHistogramsName2D[eCentFT0C_vs_CentFT0CVariant1] = Form("%s_vs_%s", qa.fCentralityEstimatorName[eCentFT0C].Data(), qa.fCentralityEstimatorName[eCentFT0CVariant1].Data()); qa.fEventHistogramsName2D[eCentFT0C_vs_CentFT0M] = Form("%s_vs_%s", qa.fCentralityEstimatorName[eCentFT0C].Data(), qa.fCentralityEstimatorName[eCentFT0M].Data()); @@ -1008,17 +1016,22 @@ void DefaultBooking() qa.fBookQAEventHistograms2D[eMultiplicity_vs_Centrality] = Alright(lBookQAEventHistograms2D[eMultiplicity_vs_Centrality]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eMultiplicity_vs_Vertex_z] = Alright(lBookQAEventHistograms2D[eMultiplicity_vs_Vertex_z]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eMultiplicity_vs_Occupancy] = Alright(lBookQAEventHistograms2D[eMultiplicity_vs_Occupancy]) && qa.fFillQAEventHistograms2D; + qa.fBookQAEventHistograms2D[eMultiplicity_vs_InteractionRate] = Alright(lBookQAEventHistograms2D[eMultiplicity_vs_InteractionRate]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eReferenceMultiplicity_vs_NContributors] = Alright(lBookQAEventHistograms2D[eReferenceMultiplicity_vs_NContributors]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eReferenceMultiplicity_vs_Centrality] = Alright(lBookQAEventHistograms2D[eReferenceMultiplicity_vs_Centrality]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eReferenceMultiplicity_vs_Vertex_z] = Alright(lBookQAEventHistograms2D[eReferenceMultiplicity_vs_Vertex_z]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eReferenceMultiplicity_vs_Occupancy] = Alright(lBookQAEventHistograms2D[eReferenceMultiplicity_vs_Occupancy]) && qa.fFillQAEventHistograms2D; + qa.fBookQAEventHistograms2D[eReferenceMultiplicity_vs_InteractionRate] = Alright(lBookQAEventHistograms2D[eReferenceMultiplicity_vs_InteractionRate]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eNContributors_vs_Centrality] = Alright(lBookQAEventHistograms2D[eNContributors_vs_Centrality]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eNContributors_vs_Vertex_z] = Alright(lBookQAEventHistograms2D[eNContributors_vs_Vertex_z]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eNContributors_vs_Occupancy] = Alright(lBookQAEventHistograms2D[eNContributors_vs_Occupancy]) && qa.fFillQAEventHistograms2D; + qa.fBookQAEventHistograms2D[eNContributors_vs_InteractionRate] = Alright(lBookQAEventHistograms2D[eNContributors_vs_InteractionRate]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eCentrality_vs_Vertex_z] = Alright(lBookQAEventHistograms2D[eCentrality_vs_Vertex_z]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eCentrality_vs_Occupancy] = Alright(lBookQAEventHistograms2D[eCentrality_vs_Occupancy]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eCentrality_vs_ImpactParameter] = Alright(lBookQAEventHistograms2D[eCentrality_vs_ImpactParameter]) && qa.fFillQAEventHistograms2D; + qa.fBookQAEventHistograms2D[eCentrality_vs_InteractionRate] = Alright(lBookQAEventHistograms2D[eCentrality_vs_InteractionRate]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eVertex_z_vs_Occupancy] = Alright(lBookQAEventHistograms2D[eVertex_z_vs_Occupancy]) && qa.fFillQAEventHistograms2D; + qa.fBookQAEventHistograms2D[eVertex_z_vs_InteractionRate] = Alright(lBookQAEventHistograms2D[eVertex_z_vs_InteractionRate]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eMultNTracksPV_vs_MultNTracksGlobal] = Alright(lBookQAEventHistograms2D[eMultNTracksPV_vs_MultNTracksGlobal]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eCentFT0C_vs_CentFT0CVariant1] = Alright(lBookQAEventHistograms2D[eCentFT0C_vs_CentFT0CVariant1]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eCentFT0C_vs_CentFT0M] = Alright(lBookQAEventHistograms2D[eCentFT0C_vs_CentFT0M]) && qa.fFillQAEventHistograms2D; @@ -1123,7 +1136,7 @@ void DefaultBooking() qa.fQACorrelationsVsHistogramsMinMaxHarmonic[eMin] = lQACorrelationsVsHistogramsMinMaxHarmonic[eMin]; qa.fQACorrelationsVsHistogramsMinMaxHarmonic[eMax] = lQACorrelationsVsHistogramsMinMaxHarmonic[eMax]; // **) insanity check: - if (!(qa.fQACorrelationsVsHistogramsMinMaxHarmonic[eMin] < qa.fQACorrelationsVsHistogramsMinMaxHarmonic[eMax])) { + if (!(qa.fQACorrelationsVsHistogramsMinMaxHarmonic[eMin] <= qa.fQACorrelationsVsHistogramsMinMaxHarmonic[eMax])) { LOGF(fatal, "\033[1;31m%s at line %d : wrong setting for min and max harmonics: min = %d, max = %d \033[0m", __FUNCTION__, __LINE__, qa.fQACorrelationsVsHistogramsMinMaxHarmonic[eMin], qa.fQACorrelationsVsHistogramsMinMaxHarmonic[eMax]); } @@ -1667,6 +1680,9 @@ void DefaultCuts() ec.fUseEventCuts[eIsGoodITSLayersAll] = Alright(lUseEventCuts[eIsGoodITSLayersAll]); ec.fUseEventCuts[eOccupancyEstimator] = Alright(lUseEventCuts[eOccupancyEstimator]); ec.fUseEventCuts[eMinVertexDistanceFromIP] = Alright(lUseEventCuts[eMinVertexDistanceFromIP]); + ec.fUseEventCuts[eNoPileupTPC] = Alright(lUseEventCuts[eNoPileupTPC]); + ec.fUseEventCuts[eNoPileupFromSPD] = Alright(lUseEventCuts[eNoPileupFromSPD]); + ec.fUseEventCuts[eNoSPDOnVsOfPileup] = Alright(lUseEventCuts[eNoSPDOnVsOfPileup]); ec.fUseEventCuts[eCentralityWeights] = Alright(lUseEventCuts[eCentralityWeights]); // **) event cuts defined via booleans: @@ -1685,6 +1701,9 @@ void DefaultCuts() ec.fUseEventCuts[eIsGoodITSLayer3] = ec.fUseEventCuts[eIsGoodITSLayer3] && cf_ec.cfUseIsGoodITSLayer3; ec.fUseEventCuts[eIsGoodITSLayer0123] = ec.fUseEventCuts[eIsGoodITSLayer0123] && cf_ec.cfUseIsGoodITSLayer0123; ec.fUseEventCuts[eIsGoodITSLayersAll] = ec.fUseEventCuts[eIsGoodITSLayersAll] && cf_ec.cfUseIsGoodITSLayersAll; + ec.fUseEventCuts[eNoPileupTPC] = ec.fUseEventCuts[eNoPileupTPC] && cf_ec.cfUseNoPileupTPC; + ec.fUseEventCuts[eNoPileupFromSPD] = ec.fUseEventCuts[eNoPileupFromSPD] && cf_ec.cfUseNoPileupFromSPD; + ec.fUseEventCuts[eNoSPDOnVsOfPileup] = ec.fUseEventCuts[eNoSPDOnVsOfPileup] && cf_ec.cfUseNoSPDOnVsOfPileup; ec.fUseEventCuts[eCentralityWeights] = ec.fUseEventCuts[eCentralityWeights] && cf_cw.cfUseCentralityWeights; // **) event cuts defined via [min, max): @@ -1968,6 +1987,9 @@ void SpecificCuts(TString whichSpecificCuts) ec.fUseEventCuts[eNoCollInTimeRangeStrict] = false; ec.fUseEventCuts[eNoCollInRofStandard] = true; ec.fUseEventCuts[eNoCollInRofStrict] = false; + ec.fUseEventCuts[eNoPileupTPC] = false; // Run 2 + ec.fUseEventCuts[eNoPileupFromSPD] = false; // Run 2 + ec.fUseEventCuts[eNoSPDOnVsOfPileup] = false; // Run 2 // Particle cuts: pc.fUseParticleCuts[eitsNCls] = true; @@ -2031,6 +2053,9 @@ void SpecificCuts(TString whichSpecificCuts) ec.fUseEventCuts[eNoCollInRofStrict] = false; ec.fUseEventCuts[eIsGoodZvtxFT0vsPV] = false; // diff commpared to 2023 ec.fUseEventCuts[eNoHighMultCollInPrevRof] = false; // diff commpared to 2023 + ec.fUseEventCuts[eNoPileupTPC] = false; // Run 2 + ec.fUseEventCuts[eNoPileupFromSPD] = false; // Run 2 + ec.fUseEventCuts[eNoSPDOnVsOfPileup] = false; // Run 2 // Particle cuts: pc.fUseParticleCuts[eitsNCls] = true; @@ -2476,6 +2501,41 @@ void InsanityChecksBeforeBooking() } } + // **) Print a warning if kINT7 trigger is not used in reconstructed Run 2: + // TBI 20250318 shall I expand the check also to Run 1? In 2011 there were dedicated kCentral and kSemiCentral triggers only... + // TBI 20250318 shall I make it fatal instead? Without this trigger, a lot of histos are just meaningles (e.g. nContributores vs centrality, etc.) + if (tc.fProcess[eProcessRec_Run2]) { + if (!(ec.fUseEventCuts[eTrigger] && ec.fsEventCuts[eTrigger].EqualTo("kINT7"))) { + LOGF(warning, "\033[1;31m%s at line %d : kINT7 trigger in Run 2 is not selected - by default it should be used.\033[0m", __FUNCTION__, __LINE__); + } + } + + // **) Bail out if kINT7 trigger is used in Run 2 Monte Carlo: + // TBI 20250318 shall I expand the check also to Run 1? In 2011 there were dedicated kCentral and kSemiCentral triggers only... + if (tc.fProcess[eProcessRecSim_Run2] || tc.fProcess[eProcessSim_Run2]) { + if (ec.fUseEventCuts[eTrigger] && ec.fsEventCuts[eTrigger].EqualTo("kINT7")) { + LOGF(fatal, "\033[1;31m%s at line %d : kINT7 trigger in Run 2 Monte Carlo is not validated - use it at your own peril.\033[0m", __FUNCTION__, __LINE__); + } + } + + if (ec.fUseEventCuts[eNoPileupTPC]) { + if (tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim]) { + LOGF(fatal, "\033[1;31m%s at line %d : cannot use NoPileupTPC in Run 3\033[0m", __FUNCTION__, __LINE__); + } + } + + if (ec.fUseEventCuts[eNoPileupFromSPD]) { + if (tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim]) { + LOGF(fatal, "\033[1;31m%s at line %d : cannot use NoPileupFromSPD in Run 3\033[0m", __FUNCTION__, __LINE__); + } + } + + if (ec.fUseEventCuts[eNoSPDOnVsOfPileup]) { + if (tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim]) { + LOGF(fatal, "\033[1;31m%s at line %d : cannot use NoSPDOnVsOfPileup in Run 3\033[0m", __FUNCTION__, __LINE__); + } + } + // ... // c) Ensure that Run 3 specific cuts and flags are used only in Run 3 (both data and sim): @@ -2625,6 +2685,18 @@ void InsanityChecksBeforeBooking() } } + // **) Protection for histograms which are meaningfull only in Run 3: + // ***) interaction rate is available only in Run 3: + if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim])) { + if (qa.fFillQACorrelationsVsInteractionRateVsProfiles2D) { + LOGF(fatal, "\033[1;31m%s at line %d : fFillQACorrelationsVsInteractionRateVsProfiles2D can be used only in Run 3, because only there ir is available.\033[0m", __FUNCTION__, __LINE__); + } + if (qa.fFillQAParticleEventHistograms2D) { + LOGF(fatal, "\033[1;31m%s at line %d : qa.fFillQAParticleEventHistograms2D can be used only in Run 3, because only there crd is available.\033[0m", __FUNCTION__, __LINE__); + } + // ... + } // if (! (tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim])) { + // ... // d) Insanity checks on binning: @@ -3057,6 +3129,16 @@ void BookQAHistograms() max_y_Event[eMultiplicity_vs_Occupancy] = eh.fEventHistogramsBins[eOccupancy][2]; title_y_Event[eMultiplicity_vs_Occupancy] = FancyFormatting(eh.fEventHistogramsName[eOccupancy].Data()); + // *) "Multiplicity_vs_InteractionRate": + nBins_x_Event[eMultiplicity_vs_InteractionRate] = static_cast(eh.fEventHistogramsBins[eMultiplicity][0] / qa.fRebin); + min_x_Event[eMultiplicity_vs_InteractionRate] = eh.fEventHistogramsBins[eMultiplicity][1]; + max_x_Event[eMultiplicity_vs_InteractionRate] = eh.fEventHistogramsBins[eMultiplicity][2]; + title_x_Event[eMultiplicity_vs_InteractionRate] = FancyFormatting(eh.fEventHistogramsName[eMultiplicity].Data()); + nBins_y_Event[eMultiplicity_vs_InteractionRate] = static_cast(eh.fEventHistogramsBins[eInteractionRate][0] / qa.fRebin); + min_y_Event[eMultiplicity_vs_InteractionRate] = eh.fEventHistogramsBins[eInteractionRate][1]; + max_y_Event[eMultiplicity_vs_InteractionRate] = eh.fEventHistogramsBins[eInteractionRate][2]; + title_y_Event[eMultiplicity_vs_InteractionRate] = FancyFormatting(eh.fEventHistogramsName[eInteractionRate].Data()); + // *) "ReferenceMultiplicity_vs_NContributors": nBins_x_Event[eReferenceMultiplicity_vs_NContributors] = static_cast(eh.fEventHistogramsBins[eReferenceMultiplicity][0] / qa.fRebin); min_x_Event[eReferenceMultiplicity_vs_NContributors] = eh.fEventHistogramsBins[eReferenceMultiplicity][1]; @@ -3097,6 +3179,16 @@ void BookQAHistograms() max_y_Event[eReferenceMultiplicity_vs_Occupancy] = eh.fEventHistogramsBins[eOccupancy][2]; title_y_Event[eReferenceMultiplicity_vs_Occupancy] = FancyFormatting(eh.fEventHistogramsName[eOccupancy].Data()); + // *) "ReferenceMultiplicity_vs_InteractionRate": + nBins_x_Event[eReferenceMultiplicity_vs_InteractionRate] = static_cast(eh.fEventHistogramsBins[eReferenceMultiplicity][0] / qa.fRebin); + min_x_Event[eReferenceMultiplicity_vs_InteractionRate] = eh.fEventHistogramsBins[eReferenceMultiplicity][1]; + max_x_Event[eReferenceMultiplicity_vs_InteractionRate] = eh.fEventHistogramsBins[eReferenceMultiplicity][2]; + title_x_Event[eReferenceMultiplicity_vs_InteractionRate] = FancyFormatting(eh.fEventHistogramsName[eReferenceMultiplicity].Data()); + nBins_y_Event[eReferenceMultiplicity_vs_InteractionRate] = static_cast(eh.fEventHistogramsBins[eInteractionRate][0] / qa.fRebin); + min_y_Event[eReferenceMultiplicity_vs_InteractionRate] = eh.fEventHistogramsBins[eInteractionRate][1]; + max_y_Event[eReferenceMultiplicity_vs_InteractionRate] = eh.fEventHistogramsBins[eInteractionRate][2]; + title_y_Event[eReferenceMultiplicity_vs_InteractionRate] = FancyFormatting(eh.fEventHistogramsName[eInteractionRate].Data()); + // *) "NContributors_vs_Centrality": nBins_x_Event[eNContributors_vs_Centrality] = static_cast(eh.fEventHistogramsBins[eNContributors][0] / qa.fRebin); min_x_Event[eNContributors_vs_Centrality] = eh.fEventHistogramsBins[eNContributors][1]; @@ -3127,6 +3219,16 @@ void BookQAHistograms() max_y_Event[eNContributors_vs_Occupancy] = eh.fEventHistogramsBins[eOccupancy][2]; title_y_Event[eNContributors_vs_Occupancy] = FancyFormatting(eh.fEventHistogramsName[eOccupancy].Data()); + // *) "NContributors_vs_InteractionRate": + nBins_x_Event[eNContributors_vs_InteractionRate] = static_cast(eh.fEventHistogramsBins[eNContributors][0] / qa.fRebin); + min_x_Event[eNContributors_vs_InteractionRate] = eh.fEventHistogramsBins[eNContributors][1]; + max_x_Event[eNContributors_vs_InteractionRate] = eh.fEventHistogramsBins[eNContributors][2]; + title_x_Event[eNContributors_vs_InteractionRate] = FancyFormatting(eh.fEventHistogramsName[eNContributors].Data()); + nBins_y_Event[eNContributors_vs_InteractionRate] = static_cast(eh.fEventHistogramsBins[eInteractionRate][0] / qa.fRebin); + min_y_Event[eNContributors_vs_InteractionRate] = eh.fEventHistogramsBins[eInteractionRate][1]; + max_y_Event[eNContributors_vs_InteractionRate] = eh.fEventHistogramsBins[eInteractionRate][2]; + title_y_Event[eNContributors_vs_InteractionRate] = FancyFormatting(eh.fEventHistogramsName[eInteractionRate].Data()); + // *) "Centrality_vs_Vertex_z": nBins_x_Event[eCentrality_vs_Vertex_z] = static_cast(eh.fEventHistogramsBins[eCentrality][0]); min_x_Event[eCentrality_vs_Vertex_z] = eh.fEventHistogramsBins[eCentrality][1]; @@ -3157,6 +3259,16 @@ void BookQAHistograms() max_y_Event[eCentrality_vs_ImpactParameter] = eh.fEventHistogramsBins[eImpactParameter][2]; title_y_Event[eCentrality_vs_ImpactParameter] = FancyFormatting(eh.fEventHistogramsName[eImpactParameter].Data()); + // *) "Centrality_vs_InteractionRate": + nBins_x_Event[eCentrality_vs_InteractionRate] = static_cast(eh.fEventHistogramsBins[eCentrality][0]); + min_x_Event[eCentrality_vs_InteractionRate] = eh.fEventHistogramsBins[eCentrality][1]; + max_x_Event[eCentrality_vs_InteractionRate] = eh.fEventHistogramsBins[eCentrality][2]; + title_x_Event[eCentrality_vs_InteractionRate] = FancyFormatting(eh.fEventHistogramsName[eCentrality].Data()); + nBins_y_Event[eCentrality_vs_InteractionRate] = static_cast(eh.fEventHistogramsBins[eInteractionRate][0] / qa.fRebin); + min_y_Event[eCentrality_vs_InteractionRate] = eh.fEventHistogramsBins[eInteractionRate][1]; + max_y_Event[eCentrality_vs_InteractionRate] = eh.fEventHistogramsBins[eInteractionRate][2]; + title_y_Event[eCentrality_vs_InteractionRate] = FancyFormatting(eh.fEventHistogramsName[eInteractionRate].Data()); + // *) "Vertex_z_vs_Occupancy": nBins_x_Event[eVertex_z_vs_Occupancy] = static_cast(eh.fEventHistogramsBins[eVertex_z][0]); min_x_Event[eVertex_z_vs_Occupancy] = eh.fEventHistogramsBins[eVertex_z][1]; @@ -3167,6 +3279,16 @@ void BookQAHistograms() max_y_Event[eVertex_z_vs_Occupancy] = eh.fEventHistogramsBins[eOccupancy][2]; title_y_Event[eVertex_z_vs_Occupancy] = FancyFormatting(eh.fEventHistogramsName[eOccupancy].Data()); + // *) "Vertex_z_vs_InteractionRate": + nBins_x_Event[eVertex_z_vs_InteractionRate] = static_cast(eh.fEventHistogramsBins[eVertex_z][0]); + min_x_Event[eVertex_z_vs_InteractionRate] = eh.fEventHistogramsBins[eVertex_z][1]; + max_x_Event[eVertex_z_vs_InteractionRate] = eh.fEventHistogramsBins[eVertex_z][2]; + title_x_Event[eVertex_z_vs_InteractionRate] = FancyFormatting(eh.fEventHistogramsName[eVertex_z].Data()); + nBins_y_Event[eVertex_z_vs_InteractionRate] = static_cast(eh.fEventHistogramsBins[eInteractionRate][0] / qa.fRebin); + min_y_Event[eVertex_z_vs_InteractionRate] = eh.fEventHistogramsBins[eInteractionRate][1]; + max_y_Event[eVertex_z_vs_InteractionRate] = eh.fEventHistogramsBins[eInteractionRate][2]; + title_y_Event[eVertex_z_vs_InteractionRate] = FancyFormatting(eh.fEventHistogramsName[eInteractionRate].Data()); + // *) "eMultNTracksPV_vs_MultNTracksGlobal": nBins_x_Event[eMultNTracksPV_vs_MultNTracksGlobal] = static_cast(eh.fEventHistogramsBins[eMultiplicity][0] / qa.fRebin); min_x_Event[eMultNTracksPV_vs_MultNTracksGlobal] = eh.fEventHistogramsBins[eMultiplicity][1]; @@ -6775,7 +6897,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) } } - // *) NoSameBunchPileup: // see O2Physics/Common/CCDB/EventSelectionParams.cxx + // *) NoSameBunchPileup: // see O2Physics/Common/CCDB/EventSelectionParams.cxx (and .h for better documentation) if (ec.fUseEventCuts[eNoSameBunchPileup]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eNoSameBunchPileup, eCutCounterBinning); @@ -6786,7 +6908,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) } } - // *) IsGoodZvtxFT0vsPV: // see O2Physics/Common/CCDB/EventSelectionParams.cxx + // *) IsGoodZvtxFT0vsPV: // see O2Physics/Common/CCDB/EventSelectionParams.cxx (and .h for better documentation) if (ec.fUseEventCuts[eIsGoodZvtxFT0vsPV]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eIsGoodZvtxFT0vsPV, eCutCounterBinning); @@ -6797,7 +6919,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) } } - // *) IsVertexITSTPC: // see O2Physics/Common/CCDB/EventSelectionParams.cxx + // *) IsVertexITSTPC: // see O2Physics/Common/CCDB/EventSelectionParams.cxx (and .h for better documentation) if (ec.fUseEventCuts[eIsVertexITSTPC]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eIsVertexITSTPC, eCutCounterBinning); @@ -6808,7 +6930,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) } } - // *) IsVertexTOFmatched: // see O2Physics/Common/CCDB/EventSelectionParams.cxx + // *) IsVertexTOFmatched: // see O2Physics/Common/CCDB/EventSelectionParams.cxx (and .h for better documentation) if (ec.fUseEventCuts[eIsVertexTOFmatched]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eIsVertexTOFmatched, eCutCounterBinning); @@ -6819,7 +6941,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) } } - // *) IsVertexTRDmatched: // see O2Physics/Common/CCDB/EventSelectionParams.cxx + // *) IsVertexTRDmatched: // see O2Physics/Common/CCDB/EventSelectionParams.cxx (and .h for better documentation) if (ec.fUseEventCuts[eIsVertexTRDmatched]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eIsVertexTRDmatched, eCutCounterBinning); @@ -6830,7 +6952,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) } } - // *) NoCollInTimeRangeStrict: // see O2Physics/Common/CCDB/EventSelectionParams.cxx + // *) NoCollInTimeRangeStrict: // see O2Physics/Common/CCDB/EventSelectionParams.cxx (and .h for better documentation) if (ec.fUseEventCuts[eNoCollInTimeRangeStrict]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eNoCollInTimeRangeStrict, eCutCounterBinning); @@ -6841,7 +6963,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) } } - // *) NoCollInTimeRangeStandard: // see O2Physics/Common/CCDB/EventSelectionParams.cxx + // *) NoCollInTimeRangeStandard: // see O2Physics/Common/CCDB/EventSelectionParams.cxx (and .h for better documentation) if (ec.fUseEventCuts[eNoCollInTimeRangeStandard]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eNoCollInTimeRangeStandard, eCutCounterBinning); @@ -6852,7 +6974,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) } } - // *) NoCollInRofStrict: // see O2Physics/Common/CCDB/EventSelectionParams.cxx + // *) NoCollInRofStrict: // see O2Physics/Common/CCDB/EventSelectionParams.cxx (and .h for better documentation) if (ec.fUseEventCuts[eNoCollInRofStrict]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eNoCollInRofStrict, eCutCounterBinning); @@ -6863,7 +6985,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) } } - // *) NoCollInRofStandard: // see O2Physics/Common/CCDB/EventSelectionParams.cxx + // *) NoCollInRofStandard: // see O2Physics/Common/CCDB/EventSelectionParams.cxx (and .h for better documentation) if (ec.fUseEventCuts[eNoCollInRofStandard]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eNoCollInRofStandard, eCutCounterBinning); @@ -6874,7 +6996,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) } } - // *) NoHighMultCollInPrevRof: // see O2Physics/Common/CCDB/EventSelectionParams.cxx + // *) NoHighMultCollInPrevRof: // see O2Physics/Common/CCDB/EventSelectionParams.cxx (and .h for better documentation) if (ec.fUseEventCuts[eNoHighMultCollInPrevRof]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eNoHighMultCollInPrevRof, eCutCounterBinning); @@ -6885,7 +7007,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) } } - // *) IsGoodITSLayer3: // see O2Physics/Common/CCDB/EventSelectionParams.cxx + // *) IsGoodITSLayer3: // see O2Physics/Common/CCDB/EventSelectionParams.cxx (and .h for better documentation) if (ec.fUseEventCuts[eIsGoodITSLayer3]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eIsGoodITSLayer3, eCutCounterBinning); @@ -6896,7 +7018,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) } } - // *) IsGoodITSLayer0123: // see O2Physics/Common/CCDB/EventSelectionParams.cxx + // *) IsGoodITSLayer0123: // see O2Physics/Common/CCDB/EventSelectionParams.cxx (and .h for better documentation) if (ec.fUseEventCuts[eIsGoodITSLayer0123]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eIsGoodITSLayer0123, eCutCounterBinning); @@ -6907,7 +7029,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) } } - // *) IsGoodITSLayersAll: // see O2Physics/Common/CCDB/EventSelectionParams.cxx + // *) IsGoodITSLayersAll: // see O2Physics/Common/CCDB/EventSelectionParams.cxx (and .h for better documentation) if (ec.fUseEventCuts[eIsGoodITSLayersAll]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eIsGoodITSLayersAll, eCutCounterBinning); @@ -6984,6 +7106,39 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) } } + // *) NoPileupTPC: // see O2Physics/Common/CCDB/EventSelectionParams.cxx (and .h for better documentation) + if (ec.fUseEventCuts[eNoPileupTPC]) { + if (cutModus == eCutCounterBinning) { + EventCut(eRec, eNoPileupTPC, eCutCounterBinning); + } else if (!collision.selection_bit(o2::aod::evsel::kNoPileupTPC)) { + if (!EventCut(eRec, eNoPileupTPC, cutModus)) { + return false; + } + } + } + + // *) NoPileupFromSPD: // see O2Physics/Common/CCDB/EventSelectionParams.cxx (and .h for better documentation) + if (ec.fUseEventCuts[eNoPileupFromSPD]) { + if (cutModus == eCutCounterBinning) { + EventCut(eRec, eNoPileupFromSPD, eCutCounterBinning); + } else if (!collision.selection_bit(o2::aod::evsel::kNoPileupFromSPD)) { + if (!EventCut(eRec, eNoPileupFromSPD, cutModus)) { + return false; + } + } + } + + // *) NoSPDOnVsOfPileup: // see O2Physics/Common/CCDB/EventSelectionParams.cxx (and .h for better documentation) + if (ec.fUseEventCuts[eNoSPDOnVsOfPileup]) { + if (cutModus == eCutCounterBinning) { + EventCut(eRec, eNoSPDOnVsOfPileup, eCutCounterBinning); + } else if (!collision.selection_bit(o2::aod::evsel::kNoSPDOnVsOfPileup)) { + if (!EventCut(eRec, eNoSPDOnVsOfPileup, cutModus)) { + return false; + } + } + } + // ... // *) Centrality weights (flattening): @@ -7307,50 +7462,9 @@ void FillEventHistograms(T1 const& collision, T2 const& tracks, eBeforeAfter ba) // Flush the generic Q-vectors: ResetQ(); - } // if (qa.fFillQACorrelationsVsHistograms2D && qa.fQAParticleEventProEbyE[eRec][ba] && ba == eAfter) { - - if (qa.fFillQACorrelationsVsInteractionRateVsProfiles2D && qa.fQAParticleEventProEbyE[eRec][ba] && ba == eAfter) { // fill only for eAfter, because I do not calculate Q-vectors before cuts - - // Calculate quickly 2-p correlation in harmonic h for this event: TBI 20250114 shall I add this also to some EbyE variable? There is no really much of a code bloat for the time being... - - // Flush 'n' fill the generic Q-vectors: - ResetQ(); - int lMaxCorrelator = 2; // used only here locally - for (int h = 0; h < gMaxHarmonic * lMaxCorrelator + 1; h++) { - for (int wp = 0; wp < lMaxCorrelator + 1; wp++) // weight power - { - qv.fQ[h][wp] = qv.fQvector[h][wp]; - } - } - - for (int h = 1; h <= gMaxHarmonic; h++) { - TComplex two = Two(h, -h); - double twoC = two.Re(); // cos - // double twoS = two.Im(); // sin - double wTwo = Two(0, 0).Re(); // Weight is 'number of combinations' by default TBI - // 20220809 add support for other weights - if (!(wTwo > 0.0)) { - LOGF(fatal, "In function \033[1;31m%s at line %d : wTwo = %f <=0. ebye.fSelectedTracks = %d.\nDid you forget to enable fCalculateQvectors = true?\033[0m", __FUNCTION__, __LINE__, wTwo, ebye.fSelectedTracks); - } - - !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_CurrentRunDuration][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_CurrentRunDuration][h - 1][eRec]->Fill(ebye.fInteractionRate, ebye.fCurrentRunDuration, twoC / wTwo, wTwo); - !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_Multiplicity][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_Multiplicity][h - 1][eRec]->Fill(ebye.fInteractionRate, ebye.fMultiplicity, twoC / wTwo, wTwo); - !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_ReferenceMultiplicity][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_ReferenceMultiplicity][h - 1][eRec]->Fill(ebye.fInteractionRate, ebye.fReferenceMultiplicity, twoC / wTwo, wTwo); - !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_Centrality][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_Centrality][h - 1][eRec]->Fill(ebye.fInteractionRate, ebye.fCentrality, twoC / wTwo, wTwo); - // ..... - !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_MeanPhi][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_MeanPhi][h - 1][eRec]->Fill(ebye.fInteractionRate, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeanPhi), twoC / wTwo, wTwo); - !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_SigmaMeanPhi][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_SigmaMeanPhi][h - 1][eRec]->Fill(ebye.fInteractionRate, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinError(eMeanPhi), twoC / wTwo, wTwo); - !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_MeanPt][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_MeanPt][h - 1][eRec]->Fill(ebye.fInteractionRate, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeanPt), twoC / wTwo, wTwo); - !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_SigmaMeanPt][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_SigmaMeanPt][h - 1][eRec]->Fill(ebye.fInteractionRate, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinError(eMeanPt), twoC / wTwo, wTwo); - !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_MeanEta][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_MeanEta][h - 1][eRec]->Fill(ebye.fInteractionRate, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeanEta), twoC / wTwo, wTwo); - !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_SigmaMeanEta][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_SigmaMeanEta][h - 1][eRec]->Fill(ebye.fInteractionRate, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinError(eMeanEta), twoC / wTwo, wTwo); - // ..... - } - - // Flush the generic Q-vectors: - ResetQ(); + } // if (qa.fFillQACorrelationsVsHistograms2D && qa.fQAParticleEventProEbyE[eRec][ba] && ba == eAfter) - } // if (qa.fFillQACorrelationsVsInteractionRateVsProfiles2D && qa.fQAParticleEventProEbyE[eRec][ba] && ba == eAfter) { + // ... // ... and corresponding MC truth simulated (common to Run 3, Run 2 and Run 1) ( see https://github.com/AliceO2Group/O2Physics/blob/master/Tutorials/src/mcHistograms.cxx ): if constexpr (rs == eRecAndSim || rs == eRecAndSim_Run2 || rs == eRecAndSim_Run1) { @@ -7414,11 +7528,21 @@ void FillEventHistograms(T1 const& collision, T2 const& tracks, eBeforeAfter ba) // QA: if (qa.fFillQAEventHistograms2D) { // General (estimators can be chosen via configurables): + + // **) vs occupancy: !qa.fQAEventHistograms2D[eMultiplicity_vs_Occupancy][eRec][ba] ? true : qa.fQAEventHistograms2D[eMultiplicity_vs_Occupancy][eRec][ba]->Fill(ebye.fMultiplicity, ebye.fOccupancy); !qa.fQAEventHistograms2D[eReferenceMultiplicity_vs_Occupancy][eRec][ba] ? true : qa.fQAEventHistograms2D[eReferenceMultiplicity_vs_Occupancy][eRec][ba]->Fill(ebye.fReferenceMultiplicity, ebye.fOccupancy); !qa.fQAEventHistograms2D[eNContributors_vs_Occupancy][eRec][ba] ? true : qa.fQAEventHistograms2D[eNContributors_vs_Occupancy][eRec][ba]->Fill(collision.numContrib(), ebye.fOccupancy); !qa.fQAEventHistograms2D[eCentrality_vs_Occupancy][eRec][ba] ? true : qa.fQAEventHistograms2D[eCentrality_vs_Occupancy][eRec][ba]->Fill(ebye.fCentrality, ebye.fOccupancy); !qa.fQAEventHistograms2D[eVertex_z_vs_Occupancy][eRec][ba] ? true : qa.fQAEventHistograms2D[eVertex_z_vs_Occupancy][eRec][ba]->Fill(collision.posZ(), ebye.fOccupancy); + + // **) vs interaction rate: + !qa.fQAEventHistograms2D[eMultiplicity_vs_InteractionRate][eRec][ba] ? true : qa.fQAEventHistograms2D[eMultiplicity_vs_InteractionRate][eRec][ba]->Fill(ebye.fMultiplicity, ebye.fInteractionRate); + !qa.fQAEventHistograms2D[eReferenceMultiplicity_vs_InteractionRate][eRec][ba] ? true : qa.fQAEventHistograms2D[eReferenceMultiplicity_vs_InteractionRate][eRec][ba]->Fill(ebye.fReferenceMultiplicity, ebye.fInteractionRate); + !qa.fQAEventHistograms2D[eNContributors_vs_InteractionRate][eRec][ba] ? true : qa.fQAEventHistograms2D[eNContributors_vs_InteractionRate][eRec][ba]->Fill(collision.numContrib(), ebye.fInteractionRate); + !qa.fQAEventHistograms2D[eCentrality_vs_InteractionRate][eRec][ba] ? true : qa.fQAEventHistograms2D[eCentrality_vs_InteractionRate][eRec][ba]->Fill(ebye.fCentrality, ebye.fInteractionRate); + !qa.fQAEventHistograms2D[eVertex_z_vs_InteractionRate][eRec][ba] ? true : qa.fQAEventHistograms2D[eVertex_z_vs_InteractionRate][eRec][ba]->Fill(collision.posZ(), ebye.fInteractionRate); + // ... // Specific (estimators are hardwired): @@ -7446,10 +7570,52 @@ void FillEventHistograms(T1 const& collision, T2 const& tracks, eBeforeAfter ba) !qa.fQAParticleEventHistograms2D[eCurrentRunDuration_vs_Pt0005EbyE][eRec][ba] ? true : qa.fQAParticleEventHistograms2D[eCurrentRunDuration_vs_Pt0005EbyE][eRec][ba]->Fill(ebye.fCurrentRunDuration, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(ePt0005EbyE), qa.fQAParticleEventProEbyE[eRec][ba]->GetBinEntries(ePt0005EbyE)); !qa.fQAParticleEventHistograms2D[eCurrentRunDuration_vs_Pt0510EbyE][eRec][ba] ? true : qa.fQAParticleEventHistograms2D[eCurrentRunDuration_vs_Pt0510EbyE][eRec][ba]->Fill(ebye.fCurrentRunDuration, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(ePt0510EbyE), qa.fQAParticleEventProEbyE[eRec][ba]->GetBinEntries(ePt0510EbyE)); !qa.fQAParticleEventHistograms2D[eCurrentRunDuration_vs_Pt1050EbyE][eRec][ba] ? true : qa.fQAParticleEventHistograms2D[eCurrentRunDuration_vs_Pt1050EbyE][eRec][ba]->Fill(ebye.fCurrentRunDuration, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(ePt1050EbyE), qa.fQAParticleEventProEbyE[eRec][ba]->GetBinEntries(ePt1050EbyE)); + } // if (qa.fFillQAParticleEventHistograms2D && qa.fQAParticleEventProEbyE[eRec][ba]) { - // ... + if (qa.fFillQACorrelationsVsInteractionRateVsProfiles2D && qa.fQAParticleEventProEbyE[eRec][ba] && ba == eAfter) { // fill only for eAfter, because I do not calculate Q-vectors before cuts - } // if (qa.fFillQAParticleEventHistograms2D && qa.fQAParticleEventProEbyE[eRec][ba]) { + // Calculate quickly 2-p correlation in harmonic h for this event: TBI 20250114 shall I add this also to some EbyE variable? There is no really much of a code bloat for the time being... + + // Flush 'n' fill the generic Q-vectors: + ResetQ(); + int lMaxCorrelator = 2; // used only here locally + for (int h = 0; h < gMaxHarmonic * lMaxCorrelator + 1; h++) { + for (int wp = 0; wp < lMaxCorrelator + 1; wp++) // weight power + { + qv.fQ[h][wp] = qv.fQvector[h][wp]; + } + } + + for (int h = 1; h <= gMaxHarmonic; h++) { + TComplex two = Two(h, -h); + double twoC = two.Re(); // cos + // double twoS = two.Im(); // sin + double wTwo = Two(0, 0).Re(); // Weight is 'number of combinations' by default TBI + // 20220809 add support for other weights + if (!(wTwo > 0.0)) { + LOGF(fatal, "In function \033[1;31m%s at line %d : wTwo = %f <=0. ebye.fSelectedTracks = %d.\nDid you forget to enable fCalculateQvectors = true?\033[0m", __FUNCTION__, __LINE__, wTwo, ebye.fSelectedTracks); + } + + !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_CurrentRunDuration][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_CurrentRunDuration][h - 1][eRec]->Fill(ebye.fInteractionRate, ebye.fCurrentRunDuration, twoC / wTwo, wTwo); + !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_Multiplicity][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_Multiplicity][h - 1][eRec]->Fill(ebye.fInteractionRate, ebye.fMultiplicity, twoC / wTwo, wTwo); + !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_ReferenceMultiplicity][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_ReferenceMultiplicity][h - 1][eRec]->Fill(ebye.fInteractionRate, ebye.fReferenceMultiplicity, twoC / wTwo, wTwo); + !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_Centrality][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_Centrality][h - 1][eRec]->Fill(ebye.fInteractionRate, ebye.fCentrality, twoC / wTwo, wTwo); + // ..... + !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_MeanPhi][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_MeanPhi][h - 1][eRec]->Fill(ebye.fInteractionRate, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeanPhi), twoC / wTwo, wTwo); + !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_SigmaMeanPhi][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_SigmaMeanPhi][h - 1][eRec]->Fill(ebye.fInteractionRate, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinError(eMeanPhi), twoC / wTwo, wTwo); + !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_MeanPt][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_MeanPt][h - 1][eRec]->Fill(ebye.fInteractionRate, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeanPt), twoC / wTwo, wTwo); + !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_SigmaMeanPt][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_SigmaMeanPt][h - 1][eRec]->Fill(ebye.fInteractionRate, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinError(eMeanPt), twoC / wTwo, wTwo); + !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_MeanEta][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_MeanEta][h - 1][eRec]->Fill(ebye.fInteractionRate, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeanEta), twoC / wTwo, wTwo); + !qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_SigmaMeanEta][h - 1][eRec] ? true : qa.fQACorrVsIRVsProfiles2D[eCorrelationsVsInteractionRate_vs_SigmaMeanEta][h - 1][eRec]->Fill(ebye.fInteractionRate, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinError(eMeanEta), twoC / wTwo, wTwo); + // ..... + } + + // Flush the generic Q-vectors: + ResetQ(); + + } // if (qa.fFillQACorrelationsVsInteractionRateVsProfiles2D && qa.fQAParticleEventProEbyE[eRec][ba] && ba == eAfter) { + + // ... // ... and corresponding MC truth simulated (Run 3 specific) // See https://github.com/AliceO2Group/O2Physics/blob/master/Tutorials/src/mcHistograms.cxx @@ -11871,7 +12037,7 @@ void StoreLabelsInPlaceholder() // b) Fetch TObjArray with labels from an external file; // c) Book the placeholder fTest0LabelsPlaceholder for all labels; // d) Finally, store the labels from external source into placeholder; - // e) Insantity check on labels. + // e) Insanity check on labels. if (tc.fVerbose) { StartFunction(__FUNCTION__); @@ -11929,7 +12095,7 @@ void StoreLabelsInPlaceholder() // cout<GetEntries()<GetXaxis()->GetNbins(); b++) { TObjArray* temp = TString(t0.fTest0LabelsPlaceholder->GetXaxis()->GetBinLabel(b)).Tokenize(" "); From 34236318fbaff14bfaf9597ab921a18c08a47171 Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Tue, 18 Mar 2025 23:01:47 +0100 Subject: [PATCH 0751/1650] [Trigger] Fix covariance matrix filling for 128bits words (#10562) --- EventFiltering/cefpTask.cxx | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/EventFiltering/cefpTask.cxx b/EventFiltering/cefpTask.cxx index 56c75c2a047..6482d2232c2 100644 --- a/EventFiltering/cefpTask.cxx +++ b/EventFiltering/cefpTask.cxx @@ -359,21 +359,24 @@ struct centralEventFilterTask { mFiltered->SetBinContent(1, mFiltered->GetBinContent(1) + nEvents - startCollision); for (uint64_t iE{0}; iE < outTrigger.size(); ++iE) { + const auto& triggerWord{outTrigger[iE]}; bool triggered{false}, selected{false}; - for (uint64_t iD{0}; iD < outTrigger[0].size(); ++iD) { + for (uint64_t iD{0}; iD < triggerWord.size(); ++iD) { for (int iB{0}; iB < 64; ++iB) { - if (!(outTrigger[iE][iD] & BIT(iB))) { + if (!(triggerWord[iD] & BIT(iB))) { continue; } - for (uint64_t jD{0}; jD < outTrigger[0].size(); ++jD) { - for (int iC{iB}; iC < 64; ++iC) { - if (outTrigger[iE][iD] & BIT(iC)) { - mCovariance->Fill(iD * 64 + iB, jD * 64 + iC); + uint64_t xIndex{iD * 64 + iB}; + for (uint64_t jD{0}; jD < triggerWord.size(); ++jD) { + for (int jB{0}; jB < 64; ++jB) { + uint64_t yIndex{jD * 64 + jB}; + if (xIndex <= yIndex && triggerWord[jD] & BIT(jB)) { + mCovariance->Fill(iD * 64 + iB, jD * 64 + jB); } } } } - triggered = triggered || outTrigger[iE][iD]; + triggered = triggered || triggerWord[iD]; selected = selected || outDecision[iE][iD]; } if (triggered) { From 1bd866f64dc3c8ffec90d86f11adf314b0e2ce95 Mon Sep 17 00:00:00 2001 From: bghanley1995 Date: Tue, 18 Mar 2025 19:07:53 -0400 Subject: [PATCH 0752/1650] [PWGCF] identifiedbf.cxx Added histograms for purity testing (#10557) Co-authored-by: ALICE Action Bot --- .../TableProducer/identifiedBfFilter.cxx | 54 +- .../Tasks/identifiedbf.cxx | 590 ++++++++++-------- 2 files changed, 364 insertions(+), 280 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx b/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx index ea0ad92e8f2..75dadf7966b 100644 --- a/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx +++ b/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx @@ -1381,34 +1381,47 @@ template void fillNSigmaHistos(TrackObject const& track) { - float actualTPCNSigmaEl = track.tpcNSigmaEl(); - float actualTPCNSigmaPi = track.tpcNSigmaPi(); - float actualTPCNSigmaKa = track.tpcNSigmaKa(); - float actualTPCNSigmaPr = track.tpcNSigmaPr(); + float actualTPCNSigma[kIdBfNoOfSpecies]; + + actualTPCNSigma[kIdBfElectron] = track.tpcNSigmaEl(); + actualTPCNSigma[kIdBfPion] = track.tpcNSigmaPi(); + actualTPCNSigma[kIdBfKaon] = track.tpcNSigmaKa(); + actualTPCNSigma[kIdBfProton] = track.tpcNSigmaPr(); + + float actualTOFNSigma[kIdBfNoOfSpecies]; + + actualTOFNSigma[kIdBfElectron] = track.tofNSigmaEl(); + actualTOFNSigma[kIdBfPion] = track.tofNSigmaPi(); + actualTOFNSigma[kIdBfKaon] = track.tofNSigmaKa(); + actualTOFNSigma[kIdBfProton] = track.tofNSigmaPr(); if (loadfromccdb) { - actualTPCNSigmaEl = actualTPCNSigmaEl - fhNSigmaCorrection[kIdBfElectron]->GetBinContent(fhNSigmaCorrection[kIdBfElectron]->FindBin(track.tpcInnerParam())); - actualTPCNSigmaPi = actualTPCNSigmaPi - fhNSigmaCorrection[kIdBfPion]->GetBinContent(fhNSigmaCorrection[kIdBfPion]->FindBin(track.tpcInnerParam())); - actualTPCNSigmaKa = actualTPCNSigmaKa - fhNSigmaCorrection[kIdBfKaon]->GetBinContent(fhNSigmaCorrection[kIdBfKaon]->FindBin(track.tpcInnerParam())); - actualTPCNSigmaPr = actualTPCNSigmaPr - fhNSigmaCorrection[kIdBfProton]->GetBinContent(fhNSigmaCorrection[kIdBfProton]->FindBin(track.tpcInnerParam())); + actualTPCNSigma[kIdBfElectron] = actualTPCNSigma[kIdBfElectron] - fhNSigmaCorrection[kIdBfElectron]->GetBinContent(fhNSigmaCorrection[kIdBfElectron]->FindBin(track.tpcInnerParam())); + actualTPCNSigma[kIdBfPion] = actualTPCNSigma[kIdBfPion] - fhNSigmaCorrection[kIdBfPion]->GetBinContent(fhNSigmaCorrection[kIdBfPion]->FindBin(track.tpcInnerParam())); + actualTPCNSigma[kIdBfKaon] = actualTPCNSigma[kIdBfKaon] - fhNSigmaCorrection[kIdBfKaon]->GetBinContent(fhNSigmaCorrection[kIdBfKaon]->FindBin(track.tpcInnerParam())); + actualTPCNSigma[kIdBfProton] = actualTPCNSigma[kIdBfProton] - fhNSigmaCorrection[kIdBfProton]->GetBinContent(fhNSigmaCorrection[kIdBfProton]->FindBin(track.tpcInnerParam())); } - fhNSigmaTPC[kIdBfElectron]->Fill(actualTPCNSigmaEl, track.tpcInnerParam()); - fhNSigmaTPC[kIdBfPion]->Fill(actualTPCNSigmaPi, track.tpcInnerParam()); - fhNSigmaTPC[kIdBfKaon]->Fill(actualTPCNSigmaKa, track.tpcInnerParam()); - fhNSigmaTPC[kIdBfProton]->Fill(actualTPCNSigmaPr, track.tpcInnerParam()); + fhNSigmaTPC[kIdBfElectron]->Fill(actualTPCNSigma[kIdBfElectron], track.tpcInnerParam()); + fhNSigmaTPC[kIdBfPion]->Fill(actualTPCNSigma[kIdBfPion], track.tpcInnerParam()); + fhNSigmaTPC[kIdBfKaon]->Fill(actualTPCNSigma[kIdBfKaon], track.tpcInnerParam()); + fhNSigmaTPC[kIdBfProton]->Fill(actualTPCNSigma[kIdBfProton], track.tpcInnerParam()); - fhNSigmaTOF[kIdBfElectron]->Fill(track.tofNSigmaEl(), track.tpcInnerParam()); - fhNSigmaTOF[kIdBfPion]->Fill(track.tofNSigmaPi(), track.tpcInnerParam()); + fhNSigmaTOF[kIdBfElectron]->Fill(actualTOFNSigma[kIdBfElectron], track.tpcInnerParam()); + fhNSigmaTOF[kIdBfPion]->Fill(actualTOFNSigma[kIdBfPion], track.tpcInnerParam()); fhNSigmaTOF[kIdBfKaon]->Fill(track.tofNSigmaKa(), track.tpcInnerParam()); fhNSigmaTOF[kIdBfProton]->Fill(track.tofNSigmaPr(), track.tpcInnerParam()); - fhNSigmaCombo[kIdBfElectron]->Fill(sqrtf(track.tofNSigmaEl() * track.tofNSigmaEl() + actualTPCNSigmaEl * actualTPCNSigmaEl), track.tpcInnerParam()); - fhNSigmaCombo[kIdBfPion]->Fill(sqrtf(track.tofNSigmaPi() * track.tofNSigmaPi() + actualTPCNSigmaPi * actualTPCNSigmaPi), track.tpcInnerParam()); - fhNSigmaCombo[kIdBfKaon]->Fill(sqrtf(track.tofNSigmaKa() * track.tofNSigmaKa() + actualTPCNSigmaKa * actualTPCNSigmaKa), track.tpcInnerParam()); - fhNSigmaCombo[kIdBfProton]->Fill(sqrtf(track.tofNSigmaPr() * track.tofNSigmaPr() + actualTPCNSigmaPr * actualTPCNSigmaPr), track.tpcInnerParam()); + fhNSigmaCombo[kIdBfElectron]->Fill(sqrtf(actualTOFNSigma[kIdBfElectron] * actualTOFNSigma[kIdBfElectron] + actualTPCNSigma[kIdBfElectron] * actualTPCNSigma[kIdBfElectron]), track.tpcInnerParam()); + fhNSigmaCombo[kIdBfPion]->Fill(sqrtf(actualTOFNSigma[kIdBfPion] * actualTOFNSigma[kIdBfPion] + actualTPCNSigma[kIdBfPion] * actualTPCNSigma[kIdBfPion]), track.tpcInnerParam()); + fhNSigmaCombo[kIdBfKaon]->Fill(sqrtf(actualTOFNSigma[kIdBfKaon] * actualTOFNSigma[kIdBfKaon] + actualTPCNSigma[kIdBfKaon] * actualTPCNSigma[kIdBfKaon]), track.tpcInnerParam()); + fhNSigmaCombo[kIdBfProton]->Fill(sqrtf(actualTOFNSigma[kIdBfProton] * actualTOFNSigma[kIdBfProton] + actualTPCNSigma[kIdBfProton] * actualTPCNSigma[kIdBfProton]), track.tpcInnerParam()); } +/// \brief Identifies the passed track with TPC and TOF data +/// \param track the track of interest +/// \return the internal track id, -1 if not accepted + template inline MatchRecoGenSpecies IdentifiedBfFilterTracks::identifyTrack(TrackObject const& track) { @@ -1518,10 +1531,7 @@ inline MatchRecoGenSpecies IdentifiedBfFilterTracks::identifyTrack(TrackObject c /// \brief Accepts or not the passed track /// \param track the track of interest /// \return the internal track id, -1 if not accepted -/// TODO: the PID implementation -/// For the time being we keep the convention -/// - positive track pid even -/// - negative track pid odd + template inline int8_t IdentifiedBfFilterTracks::acceptTrack(TrackObject const& track) { diff --git a/PWGCF/TwoParticleCorrelations/Tasks/identifiedbf.cxx b/PWGCF/TwoParticleCorrelations/Tasks/identifiedbf.cxx index 83bd0629020..f87d6b1c966 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/identifiedbf.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/identifiedbf.cxx @@ -9,8 +9,10 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +/// \file identifiedbf.cxx +/// \brief Fills histograms with particles and tracks to calculate the Balance Function +/// \author bghanley1995@gmail.com #include -#include #include #include #include @@ -23,16 +25,21 @@ #include #include #include +#include +#include +#include #include "Common/Core/TrackSelection.h" #include "Common/DataModel/Centrality.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/TrackSelectionTables.h" +#include "Common/Core/RecoDecay.h" #include "DataFormatsParameters/GRPObject.h" #include "Framework/ASoAHelpers.h" #include "Framework/AnalysisDataModel.h" #include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" +#include "Framework/O2DatabasePDGPlugin.h" #include "PWGCF/Core/AnalysisConfigurableCuts.h" #include "PWGCF/Core/PairCuts.h" #include "PWGCF/TwoParticleCorrelations/DataModel/IdentifiedBfFiltered.h" @@ -72,7 +79,7 @@ std::vector tname = {"e+", "e-", "pi+", "pi-", "K+", "K-", "p+", "p } // namespace correlationstask // Task for building correlations -struct IdentifiedBfCorrelationsTask { +struct IdentifiedbfTask { /* the data collecting engine */ template @@ -85,31 +92,33 @@ struct IdentifiedBfCorrelationsTask { //============================================================================================ /* histograms */ TH1F* fhVertexZA; //! fhN1_vsPt{nch, nullptr}; //! fhN1_vsEtaPhi{nch, nullptr}; //! fhSum1Pt_vsEtaPhi{nch, nullptr}; //! fhN1_vsZEtaPhiPt{nch, nullptr}; //! fhSum1Pt_vsZEtaPhiPt{nch, nullptr}; //! fhNuaNue_vsZEtaPhiPt{nch, nullptr}; //! fhPtAvg_vsEtaPhi{nch, nullptr}; //!> fhN2_vsPtPt{nch, {nch, nullptr}}; //!> fhN2_vsDEtaDPhi{nch, {nch, nullptr}}; //!> fhN2cont_vsDEtaDPhi{nch, {nch, nullptr}}; //!> fhSum2PtPt_vsDEtaDPhi{nch, {nch, nullptr}}; //!> fhSum2DptDpt_vsDEtaDPhi{nch, {nch, nullptr}}; //!) ({p_T}_2 - <{p_T}_2>) \f$ distribution vs \f$\Delta\eta,\;\Delta\phi\f$ for the different species combinations - std::vector> fhSupN1N1_vsDEtaDPhi{nch, {nch, nullptr}}; //!> fhSupPt1Pt1_vsDEtaDPhi{nch, {nch, nullptr}}; //! fhN1VsPt{nch, nullptr}; //! fhN1VsEtaPhi{nch, nullptr}; //! fhSum1PtVsEtaPhi{nch, nullptr}; //! fhN1VsZEtaPhiPt{nch, nullptr}; //! fhN1VsZEtaPhiPtPrimary{nch, nullptr}; //! fhN1VsZEtaPhiPtSecondary{nch, nullptr}; //! fhSum1PtVsZEtaPhiPt{nch, nullptr}; //! fhNuaNueVsZEtaPhiPt{nch, nullptr}; //! fhPtAvgVsEtaPhi{nch, nullptr}; //!> fhN2VsPtPt{nch, {nch, nullptr}}; //!> fhN2VsDEtaDPhi{nch, {nch, nullptr}}; //!> fhN2ContVsDEtaDPhi{nch, {nch, nullptr}}; //!> fhSum2PtPtVsDEtaDPhi{nch, {nch, nullptr}}; //!> fhSum2DptDptVsDEtaDPhi{nch, {nch, nullptr}}; //!) ({p_T}_2 - <{p_T}_2>) \f$ distribution vs \f$\Delta\eta,\;\Delta\phi\f$ for the different species combinations + std::vector> fhSupN1N1VsDEtaDPhi{nch, {nch, nullptr}}; //!> fhSupPt1Pt1VsDEtaDPhi{nch, {nch, nullptr}}; //! fhN1_vsC{nch, nullptr}; //! fhSum1Pt_vsC{nch, nullptr}; //! fhN1nw_vsC{nch, nullptr}; //! fhSum1Ptnw_vsC{nch, nullptr}; //!> fhN2_vsC{nch, {nch, nullptr}}; //!> fhSum2PtPt_vsC{nch, {nch, nullptr}}; //!> fhSum2DptDpt_vsC{nch, {nch, nullptr}}; //!) ({p_T}_2 - <{p_T}_2>) \f$ distribution vs event centrality/multiplicity 1-1,1-2,2-1,2-2, combinations - std::vector> fhN2nw_vsC{nch, {nch, nullptr}}; //!> fhSum2PtPtnw_vsC{nch, {nch, nullptr}}; //!> fhSum2DptDptnw_vsC{nch, {nch, nullptr}}; //!) ({p_T}_2 - <{p_T}_2>) \f$ distribution vs \f$\Delta\eta,\;\Delta\phi\f$ distribution vs event centrality/multiplicity 1-1,1-2,2-1,2-2, combinations + std::vector fhN1VsC{nch, nullptr}; //! fhSum1PtVsC{nch, nullptr}; //! fhN1NWVsC{nch, nullptr}; //! fhSum1PtNWVsC{nch, nullptr}; //!> fhN2VsC{nch, {nch, nullptr}}; //!> fhSum2PtPtVsC{nch, {nch, nullptr}}; //!> fhSum2DptDptVsC{nch, {nch, nullptr}}; //!) ({p_T}_2 - <{p_T}_2>) \f$ distribution vs event centrality/multiplicity 1-1,1-2,2-1,2-2, combinations + std::vector> fhN2NWVsC{nch, {nch, nullptr}}; //!> fhSum2PtPtNWVsC{nch, {nch, nullptr}}; //!> fhSum2DptDptNWVsC{nch, {nch, nullptr}}; //!) ({p_T}_2 - <{p_T}_2>) \f$ distribution vs \f$\Delta\eta,\;\Delta\phi\f$ distribution vs event centrality/multiplicity 1-1,1-2,2-1,2-2, combinations std::vector> chargePairsNames = {{"OO", "OT"}, {"TO", "TT"}}; std::vector> speciesPairNames = {{"e+e+", "e+e-", "e+pi+", "e+pi-", "e+K+", "e+K-", "e+p+", "e+p-"}, @@ -130,15 +139,12 @@ struct IdentifiedBfCorrelationsTask { /// \brief Returns the potentially phi origin shifted phi /// \param phi the track azimuthal angle /// \return the track phi origin shifted azimuthal angle - float GetShiftedPhi(float phi) + float getShiftedPhi(float phi) { using namespace correlationstask; using namespace o2::analysis::identifiedbffilter; - if (!(phi < phiup)) { - return phi - constants::math::TwoPI; - } else { - return phi; - } + phi = RecoDecay::constrainAngle(phi, philow, 1U); + return phi; } /// \brief Returns the zero based bin index of the eta phi passed track @@ -154,14 +160,14 @@ struct IdentifiedBfCorrelationsTask { /// the track has been accepted and it is within that ranges /// IF THAT IS NOT THE CASE THE ROUTINE WILL PRODUCE NONSENSE RESULTS template - int GetEtaPhiIndex(TrackObject const& t) + int getEtaPhiIndex(TrackObject const& t) { using namespace correlationstask; using namespace o2::analysis::identifiedbffilter; int etaix = static_cast((t.eta() - etalow) / etabinwidth); /* consider a potential phi origin shift */ - float phi = GetShiftedPhi(t.phi()); + float phi = getShiftedPhi(t.phi()); int phiix = static_cast((phi - philow) / phibinwidth); return etaix * phibins + phiix; } @@ -176,28 +182,28 @@ struct IdentifiedBfCorrelationsTask { /// the tracks have been accepted and they are within that ranges /// IF THAT IS NOT THE CASE THE ROUTINE WILL PRODUCE NONSENSE RESULTS template - int GetDEtaDPhiGlobalIndex(TrackObject const& t1, TrackObject const& t2) + int getDEtaDPhiGlobalIndex(TrackObject const& t1, TrackObject const& t2) { using namespace correlationstask; using namespace o2::analysis::identifiedbffilter; /* rule: ix are always zero based while bins are always one based */ - int etaix_1 = static_cast((t1.eta() - etalow) / etabinwidth); + int etaix1 = static_cast((t1.eta() - etalow) / etabinwidth); /* consider a potential phi origin shift */ - float phi = GetShiftedPhi(t1.phi()); - int phiix_1 = static_cast((phi - philow) / phibinwidth); - int etaix_2 = static_cast((t2.eta() - etalow) / etabinwidth); + float phi = getShiftedPhi(t1.phi()); + int phiix1 = static_cast((phi - philow) / phibinwidth); + int etaix2 = static_cast((t2.eta() - etalow) / etabinwidth); /* consider a potential phi origin shift */ - phi = GetShiftedPhi(t2.phi()); - int phiix_2 = static_cast((phi - philow) / phibinwidth); + phi = getShiftedPhi(t2.phi()); + int phiix2 = static_cast((phi - philow) / phibinwidth); - int deltaeta_ix = etaix_1 - etaix_2 + etabins - 1; - int deltaphi_ix = phiix_1 - phiix_2; - if (deltaphi_ix < 0) { - deltaphi_ix += phibins; + int deltaetaix = etaix1 - etaix2 + etabins - 1; + int deltaphiix = phiix1 - phiix2; + if (deltaphiix < 0) { + deltaphiix += phibins; } - return fhN2_vsDEtaDPhi[0][0]->GetBin(deltaeta_ix + 1, deltaphi_ix + 1); + return fhN2VsDEtaDPhi[0][0]->GetBin(deltaetaix + 1, deltaphiix + 1); } void storeTrackCorrections(std::vector corrs) @@ -205,15 +211,15 @@ struct IdentifiedBfCorrelationsTask { LOGF(info, "Stored NUA&NUE corrections for %d track ids", corrs.size()); for (uint i = 0; i < corrs.size(); ++i) { LOGF(info, " Stored NUA&NUE corrections %s for track id %d %s", corrs[i] != nullptr ? corrs[i]->GetName() : "nullptr", i, corrs[i] != nullptr ? "yes" : "no"); - fhNuaNue_vsZEtaPhiPt[i] = corrs[i]; - if (fhNuaNue_vsZEtaPhiPt[i] != nullptr) { + fhNuaNueVsZEtaPhiPt[i] = corrs[i]; + if (fhNuaNueVsZEtaPhiPt[i] != nullptr) { int nbins = 0; double avg = 0.0; - for (int ix = 0; ix < fhNuaNue_vsZEtaPhiPt[i]->GetNbinsX(); ++ix) { - for (int iy = 0; iy < fhNuaNue_vsZEtaPhiPt[i]->GetNbinsY(); ++iy) { - for (int iz = 0; iz < fhNuaNue_vsZEtaPhiPt[i]->GetNbinsZ(); ++iz) { + for (int ix = 0; ix < fhNuaNueVsZEtaPhiPt[i]->GetNbinsX(); ++ix) { + for (int iy = 0; iy < fhNuaNueVsZEtaPhiPt[i]->GetNbinsY(); ++iy) { + for (int iz = 0; iz < fhNuaNueVsZEtaPhiPt[i]->GetNbinsZ(); ++iz) { nbins++; - avg += fhNuaNue_vsZEtaPhiPt[i]->GetBinContent(ix + 1, iy + 1, iz + 1); + avg += fhNuaNueVsZEtaPhiPt[i]->GetBinContent(ix + 1, iy + 1, iz + 1); } } } @@ -228,7 +234,7 @@ struct IdentifiedBfCorrelationsTask { LOGF(info, "Stored pT average for %d track ids", ptavgs.size()); for (uint i = 0; i < ptavgs.size(); ++i) { LOGF(info, " Stored pT average for track id %d %s", i, ptavgs[i] != nullptr ? "yes" : "no"); - fhPtAvg_vsEtaPhi[i] = ptavgs[i]; + fhPtAvgVsEtaPhi[i] = ptavgs[i]; } ccdbstored = true; } @@ -238,9 +244,9 @@ struct IdentifiedBfCorrelationsTask { { std::vector* corr = new std::vector(tracks.size(), 1.0f); int index = 0; - for (auto& t : tracks) { - if (fhNuaNue_vsZEtaPhiPt[t.trackacceptedid()] != nullptr) { - (*corr)[index] = fhNuaNue_vsZEtaPhiPt[t.trackacceptedid()]->GetBinContent(fhNuaNue_vsZEtaPhiPt[t.trackacceptedid()]->FindFixBin(zvtx, GetEtaPhiIndex(t) + 0.5, t.pt())); + for (const auto& t : tracks) { + if (fhNuaNueVsZEtaPhiPt[t.trackacceptedid()] != nullptr) { + (*corr)[index] = fhNuaNueVsZEtaPhiPt[t.trackacceptedid()]->GetBinContent(fhNuaNueVsZEtaPhiPt[t.trackacceptedid()]->FindFixBin(zvtx, getEtaPhiIndex(t) + 0.5, t.pt())); } index++; } @@ -252,15 +258,37 @@ struct IdentifiedBfCorrelationsTask { { std::vector* ptavg = new std::vector(tracks.size(), 0.0f); int index = 0; - for (auto& t : tracks) { - if (fhPtAvg_vsEtaPhi[t.trackacceptedid()] != nullptr) { - (*ptavg)[index] = fhPtAvg_vsEtaPhi[t.trackacceptedid()]->GetBinContent(fhPtAvg_vsEtaPhi[t.trackacceptedid()]->FindFixBin(t.eta(), t.phi())); + for (const auto& t : tracks) { + if (fhPtAvgVsEtaPhi[t.trackacceptedid()] != nullptr) { + (*ptavg)[index] = fhPtAvgVsEtaPhi[t.trackacceptedid()]->GetBinContent(fhPtAvgVsEtaPhi[t.trackacceptedid()]->FindFixBin(t.eta(), t.phi())); index++; } } return ptavg; } + /// \brief checks whether MC track is a physical primary or secondary + /// \param track passed MC track converted to MCParticle + template + void trackPrimaryCheck(TrackObject const& track, float zvtx, float corr) + { + if constexpr (framework::has_type_v) { + if (isPrimaryCheck(track.template mcParticle_as())) { + fhN1VsZEtaPhiPtPrimary[track.trackacceptedid()]->Fill(zvtx, getEtaPhiIndex(track) + 0.5, track.pt(), corr); + } else { + fhN1VsZEtaPhiPtSecondary[track.trackacceptedid()]->Fill(zvtx, getEtaPhiIndex(track) + 0.5, track.pt(), corr); + } + } + } + + /// \brief checks whether MC track is a physical primary or secondary + /// \param particle passed MC track converted to MCParticle + template + bool isPrimaryCheck(ParticleObject const& particle) + { + return particle.isPhysicalPrimary(); + } + /// \brief fills the singles histograms in singles execution mode /// \param passedtracks filtered table with the tracks associated to the passed index /// \param tix index, in the singles histogram bank, for the passed filetered track table @@ -268,15 +296,16 @@ struct IdentifiedBfCorrelationsTask { void processSingles(TrackListObject const& passedtracks, std::vector* corrs, float zvtx) { int index = 0; - for (auto& track : passedtracks) { + for (const auto& track : passedtracks) { float corr = (*corrs)[index]; - fhN1_vsPt[track.trackacceptedid()]->Fill(track.pt(), corr); + fhN1VsPt[track.trackacceptedid()]->Fill(track.pt(), corr); if constexpr (smallsingles) { - fhN1_vsEtaPhi[track.trackacceptedid()]->Fill(track.eta(), GetShiftedPhi(track.phi()), corr); - fhSum1Pt_vsEtaPhi[track.trackacceptedid()]->Fill(track.eta(), GetShiftedPhi(track.phi()), track.pt() * corr); + fhN1VsEtaPhi[track.trackacceptedid()]->Fill(track.eta(), getShiftedPhi(track.phi()), corr); + fhSum1PtVsEtaPhi[track.trackacceptedid()]->Fill(track.eta(), getShiftedPhi(track.phi()), track.pt() * corr); } else { - fhN1_vsZEtaPhiPt[track.trackacceptedid()]->Fill(zvtx, GetEtaPhiIndex(track) + 0.5, track.pt(), corr); - fhSum1Pt_vsZEtaPhiPt[track.trackacceptedid()]->Fill(zvtx, GetEtaPhiIndex(track) + 0.5, track.pt(), track.pt() * corr); + fhN1VsZEtaPhiPt[track.trackacceptedid()]->Fill(zvtx, getEtaPhiIndex(track) + 0.5, track.pt(), corr); + fhSum1PtVsZEtaPhiPt[track.trackacceptedid()]->Fill(zvtx, getEtaPhiIndex(track) + 0.5, track.pt(), track.pt() * corr); + trackPrimaryCheck(track, zvtx, corr); } index++; } @@ -297,22 +326,22 @@ struct IdentifiedBfCorrelationsTask { std::vector n1nw(nch, 0.0); ///< not weighted number of single tracks for current collision std::vector sum1Ptnw(nch, 0.0); ///< accumulated sum of not weighted single \f$p_T\f$ for current collision int index = 0; - for (auto& track : passedtracks) { + for (const auto& track : passedtracks) { float corr = (*corrs)[index]; n1[track.trackacceptedid()] += corr; sum1Pt[track.trackacceptedid()] += track.pt() * corr; n1nw[track.trackacceptedid()] += 1; sum1Ptnw[track.trackacceptedid()] += track.pt(); - fhN1_vsEtaPhi[track.trackacceptedid()]->Fill(track.eta(), GetShiftedPhi(track.phi()), corr); - fhSum1Pt_vsEtaPhi[track.trackacceptedid()]->Fill(track.eta(), GetShiftedPhi(track.phi()), track.pt() * corr); + fhN1VsEtaPhi[track.trackacceptedid()]->Fill(track.eta(), getShiftedPhi(track.phi()), corr); + fhSum1PtVsEtaPhi[track.trackacceptedid()]->Fill(track.eta(), getShiftedPhi(track.phi()), track.pt() * corr); index++; } for (uint tid = 0; tid < nch; ++tid) { - fhN1_vsC[tid]->Fill(cmul, n1[tid]); - fhSum1Pt_vsC[tid]->Fill(cmul, sum1Pt[tid]); - fhN1nw_vsC[tid]->Fill(cmul, n1nw[tid]); - fhSum1Ptnw_vsC[tid]->Fill(cmul, sum1Ptnw[tid]); + fhN1VsC[tid]->Fill(cmul, n1[tid]); + fhSum1PtVsC[tid]->Fill(cmul, sum1Pt[tid]); + fhN1NWVsC[tid]->Fill(cmul, n1nw[tid]); + fhSum1PtNWVsC[tid]->Fill(cmul, sum1Ptnw[tid]); } } @@ -336,11 +365,11 @@ struct IdentifiedBfCorrelationsTask { std::vector> sum2DptDptnw(nch, std::vector(nch, 0.0)); ///< accumulated sum of not weighted number of track 1 tracks times not weighted track 2 \f$p_T\f$ for current collision int index1 = 0; - for (auto& track1 : trks1) { - double ptavg_1 = (*ptavgs1)[index1]; + for (const auto& track1 : trks1) { + double ptavg1 = (*ptavgs1)[index1]; double corr1 = (*corrs1)[index1]; int index2 = 0; - for (auto& track2 : trks2) { + for (const auto& track2 : trks2) { /* checking the same track id condition */ if (track1 == track2) { /* exclude autocorrelations */ @@ -353,26 +382,21 @@ struct IdentifiedBfCorrelationsTask { } } /* process pair magnitudes */ - double ptavg_2 = (*ptavgs2)[index2]; + double ptavg2 = (*ptavgs2)[index2]; double corr2 = (*corrs2)[index2]; double corr = corr1 * corr2; - double dptdptnw = (track1.pt() - ptavg_1) * (track2.pt() - ptavg_2); - double dptdptw = (corr1 * track1.pt() - ptavg_1) * (corr2 * track2.pt() - ptavg_2); + double dptdptnw = (track1.pt() - ptavg1) * (track2.pt() - ptavg2); + double dptdptw = (corr1 * track1.pt() - ptavg1) * (corr2 * track2.pt() - ptavg2); /* get the global bin for filling the differential histograms */ - int globalbin = GetDEtaDPhiGlobalIndex(track1, track2); + int globalbin = getDEtaDPhiGlobalIndex(track1, track2); float deltaeta = track1.eta() - track2.eta(); float deltaphi = track1.phi() - track2.phi(); - while (deltaphi >= deltaphiup) { - deltaphi -= constants::math::TwoPI; - } - while (deltaphi < deltaphilow) { - deltaphi += constants::math::TwoPI; - } + deltaphi = RecoDecay::constrainAngle(deltaphi, deltaphilow, 1U); if ((fUseConversionCuts && fPairCuts.conversionCuts(track1, track2)) || (fUseTwoTrackCut && fPairCuts.twoTrackCut(track1, track2, bfield))) { /* suppress the pair */ - fhSupN1N1_vsDEtaDPhi[track1.trackacceptedid()][track2.trackacceptedid()]->AddBinContent(globalbin, corr); - fhSupPt1Pt1_vsDEtaDPhi[track1.trackacceptedid()][track2.trackacceptedid()]->AddBinContent(globalbin, track1.pt() * track2.pt() * corr); + fhSupN1N1VsDEtaDPhi[track1.trackacceptedid()][track2.trackacceptedid()]->AddBinContent(globalbin, corr); + fhSupPt1Pt1VsDEtaDPhi[track1.trackacceptedid()][track2.trackacceptedid()]->AddBinContent(globalbin, track1.pt() * track2.pt() * corr); n2sup[track1.trackacceptedid()][track2.trackacceptedid()] += corr; } else { /* count the pair */ @@ -383,30 +407,30 @@ struct IdentifiedBfCorrelationsTask { sum2PtPtnw[track1.trackacceptedid()][track2.trackacceptedid()] += track1.pt() * track2.pt(); sum2DptDptnw[track1.trackacceptedid()][track2.trackacceptedid()] += dptdptnw; - fhN2_vsDEtaDPhi[track1.trackacceptedid()][track2.trackacceptedid()]->AddBinContent(globalbin, corr); - fhN2cont_vsDEtaDPhi[track1.trackacceptedid()][track2.trackacceptedid()]->Fill(deltaeta, deltaphi, corr); - fhSum2DptDpt_vsDEtaDPhi[track1.trackacceptedid()][track2.trackacceptedid()]->AddBinContent(globalbin, dptdptw); - fhSum2PtPt_vsDEtaDPhi[track1.trackacceptedid()][track2.trackacceptedid()]->AddBinContent(globalbin, track1.pt() * track2.pt() * corr); + fhN2VsDEtaDPhi[track1.trackacceptedid()][track2.trackacceptedid()]->AddBinContent(globalbin, corr); + fhN2ContVsDEtaDPhi[track1.trackacceptedid()][track2.trackacceptedid()]->Fill(deltaeta, deltaphi, corr); + fhSum2DptDptVsDEtaDPhi[track1.trackacceptedid()][track2.trackacceptedid()]->AddBinContent(globalbin, dptdptw); + fhSum2PtPtVsDEtaDPhi[track1.trackacceptedid()][track2.trackacceptedid()]->AddBinContent(globalbin, track1.pt() * track2.pt() * corr); } - fhN2_vsPtPt[track1.trackacceptedid()][track2.trackacceptedid()]->Fill(track1.pt(), track2.pt(), corr); + fhN2VsPtPt[track1.trackacceptedid()][track2.trackacceptedid()]->Fill(track1.pt(), track2.pt(), corr); index2++; } index1++; } for (uint pid1 = 0; pid1 < nch; ++pid1) { for (uint pid2 = 0; pid2 < nch; ++pid2) { - fhN2_vsC[pid1][pid2]->Fill(cmul, n2[pid1][pid2]); - fhSum2PtPt_vsC[pid1][pid2]->Fill(cmul, sum2PtPt[pid1][pid2]); - fhSum2DptDpt_vsC[pid1][pid2]->Fill(cmul, sum2DptDpt[pid1][pid2]); - fhN2nw_vsC[pid1][pid2]->Fill(cmul, n2nw[pid1][pid2]); - fhSum2PtPtnw_vsC[pid1][pid2]->Fill(cmul, sum2PtPtnw[pid1][pid2]); - fhSum2DptDptnw_vsC[pid1][pid2]->Fill(cmul, sum2DptDptnw[pid1][pid2]); + fhN2VsC[pid1][pid2]->Fill(cmul, n2[pid1][pid2]); + fhSum2PtPtVsC[pid1][pid2]->Fill(cmul, sum2PtPt[pid1][pid2]); + fhSum2DptDptVsC[pid1][pid2]->Fill(cmul, sum2DptDpt[pid1][pid2]); + fhN2NWVsC[pid1][pid2]->Fill(cmul, n2nw[pid1][pid2]); + fhSum2PtPtNWVsC[pid1][pid2]->Fill(cmul, sum2PtPtnw[pid1][pid2]); + fhSum2DptDptNWVsC[pid1][pid2]->Fill(cmul, sum2DptDptnw[pid1][pid2]); /* let's also update the number of entries in the differential histograms */ - fhN2_vsDEtaDPhi[pid1][pid2]->SetEntries(fhN2_vsDEtaDPhi[pid1][pid2]->GetEntries() + n2[pid1][pid2]); - fhSum2DptDpt_vsDEtaDPhi[pid1][pid2]->SetEntries(fhSum2DptDpt_vsDEtaDPhi[pid1][pid2]->GetEntries() + n2[pid1][pid2]); - fhSum2PtPt_vsDEtaDPhi[pid1][pid2]->SetEntries(fhSum2PtPt_vsDEtaDPhi[pid1][pid2]->GetEntries() + n2[pid1][pid2]); - fhSupN1N1_vsDEtaDPhi[pid1][pid2]->SetEntries(fhSupN1N1_vsDEtaDPhi[pid1][pid2]->GetEntries() + n2sup[pid1][pid2]); - fhSupPt1Pt1_vsDEtaDPhi[pid1][pid2]->SetEntries(fhSupPt1Pt1_vsDEtaDPhi[pid1][pid2]->GetEntries() + n2sup[pid1][pid2]); + fhN2VsDEtaDPhi[pid1][pid2]->SetEntries(fhN2VsDEtaDPhi[pid1][pid2]->GetEntries() + n2[pid1][pid2]); + fhSum2DptDptVsDEtaDPhi[pid1][pid2]->SetEntries(fhSum2DptDptVsDEtaDPhi[pid1][pid2]->GetEntries() + n2[pid1][pid2]); + fhSum2PtPtVsDEtaDPhi[pid1][pid2]->SetEntries(fhSum2PtPtVsDEtaDPhi[pid1][pid2]->GetEntries() + n2[pid1][pid2]); + fhSupN1N1VsDEtaDPhi[pid1][pid2]->SetEntries(fhSupN1N1VsDEtaDPhi[pid1][pid2]->GetEntries() + n2sup[pid1][pid2]); + fhSupPt1Pt1VsDEtaDPhi[pid1][pid2]->SetEntries(fhSupPt1Pt1VsDEtaDPhi[pid1][pid2]->GetEntries() + n2sup[pid1][pid2]); } } } @@ -475,7 +499,7 @@ struct IdentifiedBfCorrelationsTask { using namespace o2::analysis::identifiedbffilter; /* create the histograms */ - Bool_t oldstatus = TH1::AddDirectoryStatus(); + bool oldstatus = TH1::AddDirectoryStatus(); TH1::AddDirectory(kFALSE); if (!processpairs) { @@ -483,23 +507,23 @@ struct IdentifiedBfCorrelationsTask { fOutputList->Add(fhVertexZA); for (uint i = 0; i < nch; ++i) { /* histograms for each track, one and two */ - fhN1_vsPt[i] = new TH1F(TString::Format("n1_%s_vsPt", tname[i].c_str()).Data(), - TString::Format("#LT n_{1} #GT;p_{t,%s} (GeV/c);#LT n_{1} #GT", tname[i].c_str()).Data(), - ptbins, ptlow, ptup); + fhN1VsPt[i] = new TH1F(TString::Format("n1_%s_vsPt", tname[i].c_str()).Data(), + TString::Format("#LT n_{1} #GT;p_{t,%s} (GeV/c);#LT n_{1} #GT", tname[i].c_str()).Data(), + ptbins, ptlow, ptup); /* we don't want the Sumw2 structure being created here */ bool defSumw2 = TH1::GetDefaultSumw2(); if constexpr (smallsingles) { - fhN1_vsEtaPhi[i] = new TH2F(TString::Format("n1_%s_vsEtaPhi", tname[i].c_str()).Data(), - TString::Format("#LT n_{1} #GT;#eta_{%s};#varphi_{%s} (radian);#LT n_{1} #GT", tname[i].c_str(), tname[i].c_str()).Data(), - etabins, etalow, etaup, phibins, philow, phiup); - fhSum1Pt_vsEtaPhi[i] = new TH2F(TString::Format("sumPt_%s_vsEtaPhi", tname[i].c_str()).Data(), - TString::Format("#LT #Sigma p_{t,%s} #GT;#eta_{%s};#varphi_{%s} (radian);#LT #Sigma p_{t,%s} #GT (GeV/c)", - tname[i].c_str(), tname[i].c_str(), tname[i].c_str(), tname[i].c_str()) - .Data(), - etabins, etalow, etaup, phibins, philow, phiup); + fhN1VsEtaPhi[i] = new TH2F(TString::Format("n1_%s_vsEtaPhi", tname[i].c_str()).Data(), + TString::Format("#LT n_{1} #GT;#eta_{%s};#varphi_{%s} (radian);#LT n_{1} #GT", tname[i].c_str(), tname[i].c_str()).Data(), + etabins, etalow, etaup, phibins, philow, phiup); + fhSum1PtVsEtaPhi[i] = new TH2F(TString::Format("sumPt_%s_vsEtaPhi", tname[i].c_str()).Data(), + TString::Format("#LT #Sigma p_{t,%s} #GT;#eta_{%s};#varphi_{%s} (radian);#LT #Sigma p_{t,%s} #GT (GeV/c)", + tname[i].c_str(), tname[i].c_str(), tname[i].c_str(), tname[i].c_str()) + .Data(), + etabins, etalow, etaup, phibins, philow, phiup); } else { TH1::SetDefaultSumw2(false); - fhN1_vsZEtaPhiPt[i] = new TH3F( + fhN1VsZEtaPhiPt[i] = new TH3F( TString::Format("n1_%s_vsZ_vsEtaPhi_vsPt", tname[i].c_str()).Data(), TString::Format("#LT n_{1} #GT;vtx_{z};#eta_{%s}#times#varphi_{%s};p_{t,%s} (GeV/c)", tname[i].c_str(), @@ -515,7 +539,42 @@ struct IdentifiedBfCorrelationsTask { ptbins, ptlow, ptup); - fhSum1Pt_vsZEtaPhiPt[i] = new TH3F( + + fhN1VsZEtaPhiPtPrimary[i] = new TH3F( + TString::Format("n1_%s_Primary_vsZ_vsEtaPhi_vsPt", tname[i].c_str()).Data(), + TString::Format("#LT n_{1} Primary #GT;vtx_{z};#eta_{%s}#times#varphi_{%s};p_{t,%s} (GeV/c)", + tname[i].c_str(), + tname[i].c_str(), + tname[i].c_str()) + .Data(), + zvtxbins, + zvtxlow, + zvtxup, + etabins * phibins, + 0.0, + static_cast(etabins * phibins), + ptbins, + ptlow, + ptup); + + fhN1VsZEtaPhiPtSecondary[i] = new TH3F( + TString::Format("n1_%s_Secondary_vsZ_vsEtaPhi_vsPt", tname[i].c_str()).Data(), + TString::Format("#LT n_{1} Secondary #GT;vtx_{z};#eta_{%s}#times#varphi_{%s};p_{t,%s} (GeV/c)", + tname[i].c_str(), + tname[i].c_str(), + tname[i].c_str()) + .Data(), + zvtxbins, + zvtxlow, + zvtxup, + etabins * phibins, + 0.0, + static_cast(etabins * phibins), + ptbins, + ptlow, + ptup); + + fhSum1PtVsZEtaPhiPt[i] = new TH3F( TString::Format("sumPt1_%s_vsZ_vsEtaPhi_vsPt", tname[i].c_str()).Data(), TString::Format( "#LT #Sigma p_{t,%s}#GT;vtx_{z};#eta_{%s}#times#varphi_{%s};p_{t,%s} (GeV/c)", @@ -539,58 +598,64 @@ struct IdentifiedBfCorrelationsTask { /* the statistical uncertainties will be estimated by the subsamples method so let's get rid of the error tracking */ if constexpr (smallsingles) { - fhN1_vsEtaPhi[i]->SetBit(TH1::kIsNotW); - fhN1_vsEtaPhi[i]->Sumw2(false); - fhSum1Pt_vsEtaPhi[i]->SetBit(TH1::kIsNotW); - fhSum1Pt_vsEtaPhi[i]->Sumw2(false); + fhN1VsEtaPhi[i]->SetBit(TH1::kIsNotW); + fhN1VsEtaPhi[i]->Sumw2(false); + fhSum1PtVsEtaPhi[i]->SetBit(TH1::kIsNotW); + fhSum1PtVsEtaPhi[i]->Sumw2(false); } else { - fhN1_vsZEtaPhiPt[i]->SetBit(TH1::kIsNotW); - fhN1_vsZEtaPhiPt[i]->Sumw2(false); - fhSum1Pt_vsZEtaPhiPt[i]->SetBit(TH1::kIsNotW); - fhSum1Pt_vsZEtaPhiPt[i]->Sumw2(false); + fhN1VsZEtaPhiPt[i]->SetBit(TH1::kIsNotW); + fhN1VsZEtaPhiPt[i]->Sumw2(false); + fhN1VsZEtaPhiPtPrimary[i]->SetBit(TH1::kIsNotW); + fhN1VsZEtaPhiPtPrimary[i]->Sumw2(false); + fhN1VsZEtaPhiPtSecondary[i]->SetBit(TH1::kIsNotW); + fhN1VsZEtaPhiPtSecondary[i]->Sumw2(false); + fhSum1PtVsZEtaPhiPt[i]->SetBit(TH1::kIsNotW); + fhSum1PtVsZEtaPhiPt[i]->Sumw2(false); } - fhNuaNue_vsZEtaPhiPt[i] = nullptr; - fhPtAvg_vsEtaPhi[i] = nullptr; + fhNuaNueVsZEtaPhiPt[i] = nullptr; + fhPtAvgVsEtaPhi[i] = nullptr; - fOutputList->Add(fhN1_vsPt[i]); + fOutputList->Add(fhN1VsPt[i]); if constexpr (smallsingles) { - fOutputList->Add(fhN1_vsEtaPhi[i]); - fOutputList->Add(fhSum1Pt_vsEtaPhi[i]); + fOutputList->Add(fhN1VsEtaPhi[i]); + fOutputList->Add(fhSum1PtVsEtaPhi[i]); } else { - fOutputList->Add(fhN1_vsZEtaPhiPt[i]); - fOutputList->Add(fhSum1Pt_vsZEtaPhiPt[i]); + fOutputList->Add(fhN1VsZEtaPhiPt[i]); + fOutputList->Add(fhN1VsZEtaPhiPtPrimary[i]); + fOutputList->Add(fhN1VsZEtaPhiPtSecondary[i]); + fOutputList->Add(fhSum1PtVsZEtaPhiPt[i]); } } } else { for (uint i = 0; i < nch; ++i) { /* histograms for each track species */ - fhN1_vsEtaPhi[i] = new TH2F(TString::Format("n1_%s_vsEtaPhi", tname[i].c_str()).Data(), - TString::Format("#LT n_{1} #GT;#eta_{%s};#varphi_{%s} (radian);#LT n_{1} #GT", tname[i].c_str(), tname[i].c_str()).Data(), - etabins, etalow, etaup, phibins, philow, phiup); - fhSum1Pt_vsEtaPhi[i] = new TH2F(TString::Format("sumPt_%s_vsEtaPhi", tname[i].c_str()).Data(), - TString::Format("#LT #Sigma p_{t,%s} #GT;#eta_{%s};#varphi_{%s} (radian);#LT #Sigma p_{t,%s} #GT (GeV/c)", - tname[i].c_str(), tname[i].c_str(), tname[i].c_str(), tname[i].c_str()) - .Data(), - etabins, etalow, etaup, phibins, philow, phiup); - fhN1_vsC[i] = new TProfile(TString::Format("n1_%s_vsM", tname[i].c_str()).Data(), - TString::Format("#LT n_{1} #GT (weighted);Centrality/Multiplicity (%%);#LT n_{1} #GT").Data(), - 100, 0.0, 100.0); - fhSum1Pt_vsC[i] = new TProfile(TString::Format("sumPt_%s_vsM", tname[i].c_str()), - TString::Format("#LT #Sigma p_{t,%s} #GT (weighted);Centrality/Multiplicity (%%);#LT #Sigma p_{t,%s} #GT (GeV/c)", tname[i].c_str(), tname[i].c_str()).Data(), - 100, 0.0, 100.0); - fhN1nw_vsC[i] = new TProfile(TString::Format("n1Nw_%s_vsM", tname[i].c_str()).Data(), - TString::Format("#LT n_{1} #GT;Centrality/Multiplicity (%%);#LT n_{1} #GT").Data(), - 100, 0.0, 100.0); - fhSum1Ptnw_vsC[i] = new TProfile(TString::Format("sumPtNw_%s_vsM", tname[i].c_str()).Data(), - TString::Format("#LT #Sigma p_{t,%s} #GT;Centrality/Multiplicity (%%);#LT #Sigma p_{t,%s} #GT (GeV/c)", tname[i].c_str(), tname[i].c_str()).Data(), 100, 0.0, 100.0); - fhNuaNue_vsZEtaPhiPt[i] = nullptr; - fhPtAvg_vsEtaPhi[i] = nullptr; - fOutputList->Add(fhN1_vsEtaPhi[i]); - fOutputList->Add(fhSum1Pt_vsEtaPhi[i]); - fOutputList->Add(fhN1_vsC[i]); - fOutputList->Add(fhSum1Pt_vsC[i]); - fOutputList->Add(fhN1nw_vsC[i]); - fOutputList->Add(fhSum1Ptnw_vsC[i]); + fhN1VsEtaPhi[i] = new TH2F(TString::Format("n1_%s_vsEtaPhi", tname[i].c_str()).Data(), + TString::Format("#LT n_{1} #GT;#eta_{%s};#varphi_{%s} (radian);#LT n_{1} #GT", tname[i].c_str(), tname[i].c_str()).Data(), + etabins, etalow, etaup, phibins, philow, phiup); + fhSum1PtVsEtaPhi[i] = new TH2F(TString::Format("sumPt_%s_vsEtaPhi", tname[i].c_str()).Data(), + TString::Format("#LT #Sigma p_{t,%s} #GT;#eta_{%s};#varphi_{%s} (radian);#LT #Sigma p_{t,%s} #GT (GeV/c)", + tname[i].c_str(), tname[i].c_str(), tname[i].c_str(), tname[i].c_str()) + .Data(), + etabins, etalow, etaup, phibins, philow, phiup); + fhN1VsC[i] = new TProfile(TString::Format("n1_%s_vsM", tname[i].c_str()).Data(), + TString::Format("#LT n_{1} #GT (weighted);Centrality/Multiplicity (%%);#LT n_{1} #GT").Data(), + 100, 0.0, 100.0); + fhSum1PtVsC[i] = new TProfile(TString::Format("sumPt_%s_vsM", tname[i].c_str()), + TString::Format("#LT #Sigma p_{t,%s} #GT (weighted);Centrality/Multiplicity (%%);#LT #Sigma p_{t,%s} #GT (GeV/c)", tname[i].c_str(), tname[i].c_str()).Data(), + 100, 0.0, 100.0); + fhN1NWVsC[i] = new TProfile(TString::Format("n1Nw_%s_vsM", tname[i].c_str()).Data(), + TString::Format("#LT n_{1} #GT;Centrality/Multiplicity (%%);#LT n_{1} #GT").Data(), + 100, 0.0, 100.0); + fhSum1PtNWVsC[i] = new TProfile(TString::Format("sumPtNw_%s_vsM", tname[i].c_str()).Data(), + TString::Format("#LT #Sigma p_{t,%s} #GT;Centrality/Multiplicity (%%);#LT #Sigma p_{t,%s} #GT (GeV/c)", tname[i].c_str(), tname[i].c_str()).Data(), 100, 0.0, 100.0); + fhNuaNueVsZEtaPhiPt[i] = nullptr; + fhPtAvgVsEtaPhi[i] = nullptr; + fOutputList->Add(fhN1VsEtaPhi[i]); + fOutputList->Add(fhSum1PtVsEtaPhi[i]); + fOutputList->Add(fhN1VsC[i]); + fOutputList->Add(fhSum1PtVsC[i]); + fOutputList->Add(fhN1NWVsC[i]); + fOutputList->Add(fhSum1PtNWVsC[i]); } for (uint i = 0; i < nch; ++i) { for (uint j = 0; j < nch; ++j) { @@ -600,58 +665,58 @@ struct IdentifiedBfCorrelationsTask { TH1::SetDefaultSumw2(false); // const char* pname = chargePairsNames[i][j].c_str(); const char* pname = speciesPairNames[i][j].c_str(); - fhN2_vsDEtaDPhi[i][j] = new TH2F(TString::Format("n2_12_vsDEtaDPhi_%s", pname), TString::Format("#LT n_{2} #GT (%s);#Delta#eta;#Delta#varphi;#LT n_{2} #GT", pname), - deltaetabins, deltaetalow, deltaetaup, deltaphibins, deltaphilow, deltaphiup); - fhN2cont_vsDEtaDPhi[i][j] = new TH2F(TString::Format("n2_12cont_vsDEtaDPhi_%s", pname), TString::Format("#LT n_{2} #GT (%s);#Delta#eta;#Delta#varphi;#LT n_{2} #GT", pname), - deltaetabins, deltaetalow, deltaetaup, deltaphibins, deltaphilow, deltaphiup); - fhSum2PtPt_vsDEtaDPhi[i][j] = new TH2F(TString::Format("sumPtPt_12_vsDEtaDPhi_%s", pname), TString::Format("#LT #Sigma p_{t,1}p_{t,2} #GT (%s);#Delta#eta;#Delta#varphi;#LT #Sigma p_{t,1}p_{t,2} #GT (GeV^{2})", pname), - deltaetabins, deltaetalow, deltaetaup, deltaphibins, deltaphilow, deltaphiup); - fhSum2DptDpt_vsDEtaDPhi[i][j] = new TH2F(TString::Format("sumDptDpt_12_vsDEtaDPhi_%s", pname), TString::Format("#LT #Sigma (p_{t,1} - #LT p_{t,1} #GT)(p_{t,2} - #LT p_{t,2} #GT) #GT (%s);#Delta#eta;#Delta#varphi;#LT #Sigma (p_{t,1} - #LT p_{t,1} #GT)(p_{t,2} - #LT p_{t,2} #GT) #GT (GeV^{2})", pname), - deltaetabins, deltaetalow, deltaetaup, deltaphibins, deltaphilow, deltaphiup); - fhSupN1N1_vsDEtaDPhi[i][j] = new TH2F(TString::Format("suppn1n1_12_vsDEtaDPhi_%s", pname), TString::Format("Suppressed #LT n_{1} #GT#LT n_{1} #GT (%s);#Delta#eta;#Delta#varphi;#LT n_{1} #GT#LT n_{1} #GT", pname), + fhN2VsDEtaDPhi[i][j] = new TH2F(TString::Format("n2_12_vsDEtaDPhi_%s", pname), TString::Format("#LT n_{2} #GT (%s);#Delta#eta;#Delta#varphi;#LT n_{2} #GT", pname), + deltaetabins, deltaetalow, deltaetaup, deltaphibins, deltaphilow, deltaphiup); + fhN2ContVsDEtaDPhi[i][j] = new TH2F(TString::Format("n2_12cont_vsDEtaDPhi_%s", pname), TString::Format("#LT n_{2} #GT (%s);#Delta#eta;#Delta#varphi;#LT n_{2} #GT", pname), + deltaetabins, deltaetalow, deltaetaup, deltaphibins, deltaphilow, deltaphiup); + fhSum2PtPtVsDEtaDPhi[i][j] = new TH2F(TString::Format("sumPtPt_12_vsDEtaDPhi_%s", pname), TString::Format("#LT #Sigma p_{t,1}p_{t,2} #GT (%s);#Delta#eta;#Delta#varphi;#LT #Sigma p_{t,1}p_{t,2} #GT (GeV^{2})", pname), deltaetabins, deltaetalow, deltaetaup, deltaphibins, deltaphilow, deltaphiup); - fhSupPt1Pt1_vsDEtaDPhi[i][j] = new TH2F(TString::Format("suppPtPt_12_vsDEtaDPhi_%s", pname), TString::Format("Suppressed #LT p_{t,1} #GT#LT p_{t,2} #GT (%s);#Delta#eta;#Delta#varphi;#LT p_{t,1} #GT#LT p_{t,2} #GT (GeV^{2})", pname), + fhSum2DptDptVsDEtaDPhi[i][j] = new TH2F(TString::Format("sumDptDpt_12_vsDEtaDPhi_%s", pname), TString::Format("#LT #Sigma (p_{t,1} - #LT p_{t,1} #GT)(p_{t,2} - #LT p_{t,2} #GT) #GT (%s);#Delta#eta;#Delta#varphi;#LT #Sigma (p_{t,1} - #LT p_{t,1} #GT)(p_{t,2} - #LT p_{t,2} #GT) #GT (GeV^{2})", pname), deltaetabins, deltaetalow, deltaetaup, deltaphibins, deltaphilow, deltaphiup); + fhSupN1N1VsDEtaDPhi[i][j] = new TH2F(TString::Format("suppn1n1_12_vsDEtaDPhi_%s", pname), TString::Format("Suppressed #LT n_{1} #GT#LT n_{1} #GT (%s);#Delta#eta;#Delta#varphi;#LT n_{1} #GT#LT n_{1} #GT", pname), + deltaetabins, deltaetalow, deltaetaup, deltaphibins, deltaphilow, deltaphiup); + fhSupPt1Pt1VsDEtaDPhi[i][j] = new TH2F(TString::Format("suppPtPt_12_vsDEtaDPhi_%s", pname), TString::Format("Suppressed #LT p_{t,1} #GT#LT p_{t,2} #GT (%s);#Delta#eta;#Delta#varphi;#LT p_{t,1} #GT#LT p_{t,2} #GT (GeV^{2})", pname), + deltaetabins, deltaetalow, deltaetaup, deltaphibins, deltaphilow, deltaphiup); /* we return it back to previuos state */ TH1::SetDefaultSumw2(defSumw2); - fhN2_vsPtPt[i][j] = new TH2F(TString::Format("n2_12_vsPtVsPt_%s", pname), TString::Format("#LT n_{2} #GT (%s);p_{t,1} (GeV/c);p_{t,2} (GeV/c);#LT n_{2} #GT", pname), - ptbins, ptlow, ptup, ptbins, ptlow, ptup); + fhN2VsPtPt[i][j] = new TH2F(TString::Format("n2_12_vsPtVsPt_%s", pname), TString::Format("#LT n_{2} #GT (%s);p_{t,1} (GeV/c);p_{t,2} (GeV/c);#LT n_{2} #GT", pname), + ptbins, ptlow, ptup, ptbins, ptlow, ptup); - fhN2_vsC[i][j] = new TProfile(TString::Format("n2_12_vsM_%s", pname), TString::Format("#LT n_{2} #GT (%s) (weighted);Centrality/Multiplicity (%%);#LT n_{2} #GT", pname), 100, 0.0, 100.0); - fhSum2PtPt_vsC[i][j] = new TProfile(TString::Format("sumPtPt_12_vsM_%s", pname), TString::Format("#LT #Sigma p_{t,1}p_{t,2} #GT (%s) (weighted);Centrality/Multiplicity (%%);#LT #Sigma p_{t,1}p_{t,2} #GT (GeV^{2})", pname), 100, 0.0, 100.0); - fhSum2DptDpt_vsC[i][j] = new TProfile(TString::Format("sumDptDpt_12_vsM_%s", pname), TString::Format("#LT #Sigma (p_{t,1} - #LT p_{t,1} #GT)(p_{t,2} - #LT p_{t,2} #GT) #GT (%s) (weighted);Centrality/Multiplicity (%%);#LT #Sigma (p_{t,1} - #LT p_{t,1} #GT)(p_{t,2} - #LT p_{t,2} #GT) #GT (GeV^{2})", pname), 100, 0.0, 100.0); - fhN2nw_vsC[i][j] = new TProfile(TString::Format("n2Nw_12_vsM_%s", pname), TString::Format("#LT n_{2} #GT (%s);Centrality/Multiplicity (%%);#LT n_{2} #GT", pname), 100, 0.0, 100.0); - fhSum2PtPtnw_vsC[i][j] = new TProfile(TString::Format("sumPtPtNw_12_vsM_%s", pname), TString::Format("#LT #Sigma p_{t,1}p_{t,2} #GT (%s);Centrality/Multiplicity (%%);#LT #Sigma p_{t,1}p_{t,2} #GT (GeV^{2})", pname), 100, 0.0, 100.0); - fhSum2DptDptnw_vsC[i][j] = new TProfile(TString::Format("sumDptDptNw_12_vsM_%s", pname), TString::Format("#LT #Sigma (p_{t,1} - #LT p_{t,1} #GT)(p_{t,2} - #LT p_{t,2} #GT) #GT (%s);Centrality/Multiplicity (%%);#LT #Sigma (p_{t,1} - #LT p_{t,1} #GT)(p_{t,2} - #LT p_{t,2} #GT) #GT (GeV^{2})", pname), 100, 0.0, 100.0); + fhN2VsC[i][j] = new TProfile(TString::Format("n2_12_vsM_%s", pname), TString::Format("#LT n_{2} #GT (%s) (weighted);Centrality/Multiplicity (%%);#LT n_{2} #GT", pname), 100, 0.0, 100.0); + fhSum2PtPtVsC[i][j] = new TProfile(TString::Format("sumPtPt_12_vsM_%s", pname), TString::Format("#LT #Sigma p_{t,1}p_{t,2} #GT (%s) (weighted);Centrality/Multiplicity (%%);#LT #Sigma p_{t,1}p_{t,2} #GT (GeV^{2})", pname), 100, 0.0, 100.0); + fhSum2DptDptVsC[i][j] = new TProfile(TString::Format("sumDptDpt_12_vsM_%s", pname), TString::Format("#LT #Sigma (p_{t,1} - #LT p_{t,1} #GT)(p_{t,2} - #LT p_{t,2} #GT) #GT (%s) (weighted);Centrality/Multiplicity (%%);#LT #Sigma (p_{t,1} - #LT p_{t,1} #GT)(p_{t,2} - #LT p_{t,2} #GT) #GT (GeV^{2})", pname), 100, 0.0, 100.0); + fhN2NWVsC[i][j] = new TProfile(TString::Format("n2Nw_12_vsM_%s", pname), TString::Format("#LT n_{2} #GT (%s);Centrality/Multiplicity (%%);#LT n_{2} #GT", pname), 100, 0.0, 100.0); + fhSum2PtPtNWVsC[i][j] = new TProfile(TString::Format("sumPtPtNw_12_vsM_%s", pname), TString::Format("#LT #Sigma p_{t,1}p_{t,2} #GT (%s);Centrality/Multiplicity (%%);#LT #Sigma p_{t,1}p_{t,2} #GT (GeV^{2})", pname), 100, 0.0, 100.0); + fhSum2DptDptNWVsC[i][j] = new TProfile(TString::Format("sumDptDptNw_12_vsM_%s", pname), TString::Format("#LT #Sigma (p_{t,1} - #LT p_{t,1} #GT)(p_{t,2} - #LT p_{t,2} #GT) #GT (%s);Centrality/Multiplicity (%%);#LT #Sigma (p_{t,1} - #LT p_{t,1} #GT)(p_{t,2} - #LT p_{t,2} #GT) #GT (GeV^{2})", pname), 100, 0.0, 100.0); /* the statistical uncertainties will be estimated by the subsamples method so let's get rid of the error tracking */ - fhN2_vsDEtaDPhi[i][j]->SetBit(TH1::kIsNotW); - fhN2_vsDEtaDPhi[i][j]->Sumw2(false); - fhN2cont_vsDEtaDPhi[i][j]->SetBit(TH1::kIsNotW); - fhN2cont_vsDEtaDPhi[i][j]->Sumw2(false); - fhSum2PtPt_vsDEtaDPhi[i][j]->SetBit(TH1::kIsNotW); - fhSum2PtPt_vsDEtaDPhi[i][j]->Sumw2(false); - fhSum2DptDpt_vsDEtaDPhi[i][j]->SetBit(TH1::kIsNotW); - fhSum2DptDpt_vsDEtaDPhi[i][j]->Sumw2(false); - fhSupN1N1_vsDEtaDPhi[i][j]->SetBit(TH1::kIsNotW); - fhSupN1N1_vsDEtaDPhi[i][j]->Sumw2(false); - fhSupPt1Pt1_vsDEtaDPhi[i][j]->SetBit(TH1::kIsNotW); - fhSupPt1Pt1_vsDEtaDPhi[i][j]->Sumw2(false); - - fOutputList->Add(fhN2_vsDEtaDPhi[i][j]); - fOutputList->Add(fhN2cont_vsDEtaDPhi[i][j]); - fOutputList->Add(fhSum2PtPt_vsDEtaDPhi[i][j]); - fOutputList->Add(fhSum2DptDpt_vsDEtaDPhi[i][j]); - fOutputList->Add(fhSupN1N1_vsDEtaDPhi[i][j]); - fOutputList->Add(fhSupPt1Pt1_vsDEtaDPhi[i][j]); - fOutputList->Add(fhN2_vsPtPt[i][j]); - fOutputList->Add(fhN2_vsC[i][j]); - fOutputList->Add(fhSum2PtPt_vsC[i][j]); - fOutputList->Add(fhSum2DptDpt_vsC[i][j]); - fOutputList->Add(fhN2nw_vsC[i][j]); - fOutputList->Add(fhSum2PtPtnw_vsC[i][j]); - fOutputList->Add(fhSum2DptDptnw_vsC[i][j]); + fhN2VsDEtaDPhi[i][j]->SetBit(TH1::kIsNotW); + fhN2VsDEtaDPhi[i][j]->Sumw2(false); + fhN2ContVsDEtaDPhi[i][j]->SetBit(TH1::kIsNotW); + fhN2ContVsDEtaDPhi[i][j]->Sumw2(false); + fhSum2PtPtVsDEtaDPhi[i][j]->SetBit(TH1::kIsNotW); + fhSum2PtPtVsDEtaDPhi[i][j]->Sumw2(false); + fhSum2DptDptVsDEtaDPhi[i][j]->SetBit(TH1::kIsNotW); + fhSum2DptDptVsDEtaDPhi[i][j]->Sumw2(false); + fhSupN1N1VsDEtaDPhi[i][j]->SetBit(TH1::kIsNotW); + fhSupN1N1VsDEtaDPhi[i][j]->Sumw2(false); + fhSupPt1Pt1VsDEtaDPhi[i][j]->SetBit(TH1::kIsNotW); + fhSupPt1Pt1VsDEtaDPhi[i][j]->Sumw2(false); + + fOutputList->Add(fhN2VsDEtaDPhi[i][j]); + fOutputList->Add(fhN2ContVsDEtaDPhi[i][j]); + fOutputList->Add(fhSum2PtPtVsDEtaDPhi[i][j]); + fOutputList->Add(fhSum2DptDptVsDEtaDPhi[i][j]); + fOutputList->Add(fhSupN1N1VsDEtaDPhi[i][j]); + fOutputList->Add(fhSupPt1Pt1VsDEtaDPhi[i][j]); + fOutputList->Add(fhN2VsPtPt[i][j]); + fOutputList->Add(fhN2VsC[i][j]); + fOutputList->Add(fhSum2PtPtVsC[i][j]); + fOutputList->Add(fhSum2DptDptVsC[i][j]); + fOutputList->Add(fhN2NWVsC[i][j]); + fOutputList->Add(fhSum2PtPtNWVsC[i][j]); + fOutputList->Add(fhSum2DptDptNWVsC[i][j]); } } } @@ -669,7 +734,7 @@ struct IdentifiedBfCorrelationsTask { /* the data collecting engine instances */ DataCollectingEngine** dataCE; - DataCollectingEngine** dataCE_small; + DataCollectingEngine** dataCESmall; DataCollectingEngine** dataCEME; /* the input file structure from CCDB */ @@ -677,25 +742,25 @@ struct IdentifiedBfCorrelationsTask { bool loadfromccdb = false; /* pair conversion suppression defaults */ - static constexpr float cfgPairCutDefaults[1][5] = {{-1, -1, -1, -1, -1}}; - Configurable> cfgPairCut{"paircut", {cfgPairCutDefaults[0], 5, {"Photon", "K0", "Lambda", "Phi", "Rho"}}, "Conversion suppressions"}; + static constexpr float PairCutDefaults[1][5] = {{-1, -1, -1, -1, -1}}; + Configurable> cfgPairCut{"cfgPairCut", {PairCutDefaults[0], 5, {"Photon", "K0", "Lambda", "Phi", "Rho"}}, "Conversion suppressions"}; /* two tracks cut */ - Configurable cfgTwoTrackCut{"twotrackcut", -1, "Two-tracks cut: -1 = off; >0 otherwise distance value (suggested: 0.02"}; - Configurable cfgTwoTrackCutMinRadius{"twotrackcutminradius", 0.8f, "Two-tracks cut: radius in m from which two-tracks cut is applied"}; + Configurable cfgTwoTrackCut{"cfgTwoTrackCut", -1, "Two-tracks cut: -1 = off; >0 otherwise distance value (suggested: 0.02"}; + Configurable cfgTwoTrackCutMinRadius{"cfgTwoTrackCutMinRadius", 0.8f, "Two-tracks cut: radius in m from which two-tracks cut is applied"}; - Configurable cfgSmallDCE{"smalldce", true, "Use small data collecting engine for singles processing, true = yes. Default = true"}; - Configurable cfgProcessPairs{"processpairs", false, "Process pairs: false = no, just singles, true = yes, process pairs"}; - Configurable cfgProcessME{"processmixedevents", false, "Process mixed events: false = no, just same event, true = yes, also process mixed events"}; - Configurable cfgCentSpec{"centralities", "00-05,05-10,10-20,20-30,30-40,40-50,50-60,60-70,70-80", "Centrality/multiplicity ranges in min-max separated by commas"}; + Configurable cfgSmallDCE{"cfgSmallDCE", true, "Use small data collecting engine for singles processing, true = yes. Default = true"}; + Configurable cfgProcessPairs{"cfgProcessPairs", false, "Process pairs: false = no, just singles, true = yes, process pairs"}; + Configurable cfgProcessME{"cfgProcessME", false, "Process mixed events: false = no, just same event, true = yes, also process mixed events"}; + Configurable cfgCentSpec{"cfgCentSpec", "00-05,05-10,10-20,20-30,30-40,40-50,50-60,60-70,70-80", "Centrality/multiplicity ranges in min-max separated by commas"}; - Configurable cfgBinning{"binning", + Configurable cfgBinning{"cfgBinning", {28, -7.0, 7.0, 18, 0.2, 2.0, 16, -0.8, 0.8, 72, 0.5}, "triplets - nbins, min, max - for z_vtx, pT, eta and phi, binning plus bin fraction of phi origin shift"}; - Configurable cfgPtOrder{"ptorder", false, "enforce pT_1 < pT_2. Defalut: false"}; + Configurable cfgPtOrder{"cfgPtOrder", false, "enforce pT_1 < pT_2. Defalut: false"}; struct : ConfigurableGroup { - Configurable cfgCCDBUrl{"input_ccdburl", "http://ccdb-test.cern.ch:8080", "The CCDB url for the input file"}; - Configurable cfgCCDBPathName{"input_ccdbpath", "", "The CCDB path for the input file. Default \"\", i.e. don't load from CCDB"}; - Configurable cfgCCDBDate{"input_ccdbdate", "20220307", "The CCDB date for the input file"}; + Configurable cfgCCDBUrl{"cfgCCDBUrl", "http://ccdb-test.cern.ch:8080", "The CCDB url for the input file"}; + Configurable cfgCCDBPathName{"cfgCCDBPathName", "", "The CCDB path for the input file. Default \"\", i.e. don't load from CCDB"}; + Configurable cfgCCDBDate{"cfgCCDBDate", "20220307", "The CCDB date for the input file"}; } cfginputfile; OutputObj fOutput{"IdentifiedBfCorrelationsData", OutputObjHandlingPolicy::AnalysisObject, OutputObjSourceType::OutputObjSource}; @@ -770,7 +835,7 @@ struct IdentifiedBfCorrelationsTask { fCentMultMax = new float[ncmranges]; dataCE = new DataCollectingEngine*[ncmranges]; if (cfgSmallDCE) { - dataCE_small = new DataCollectingEngine*[ncmranges]; + dataCESmall = new DataCollectingEngine*[ncmranges]; } else { dataCE = new DataCollectingEngine*[ncmranges]; } @@ -807,7 +872,7 @@ struct IdentifiedBfCorrelationsTask { if (processpairs) { LOGF(fatal, "Processing pairs cannot be used with the small DCE, please configure properly!!"); } - dataCE_small[i] = builSmallDCEInstance(tokens->At(i)->GetName()); + dataCESmall[i] = builSmallDCEInstance(tokens->At(i)->GetName()); } else { dataCE[i] = buildCEInstance(tokens->At(i)->GetName()); } @@ -922,7 +987,7 @@ struct IdentifiedBfCorrelationsTask { .Data())); } if (cfgSmallDCE.value) { - dataCE_small[ixDCE]->storePtAverages(ptavgs); + dataCESmall[ixDCE]->storePtAverages(ptavgs); } else { dataCE[ixDCE]->storePtAverages(ptavgs); } @@ -937,7 +1002,7 @@ struct IdentifiedBfCorrelationsTask { .Data())); } if (cfgSmallDCE.value) { - dataCE_small[ixDCE]->storeTrackCorrections(corrs); + dataCESmall[ixDCE]->storeTrackCorrections(corrs); } else { dataCE[ixDCE]->storeTrackCorrections(corrs); } @@ -952,7 +1017,7 @@ struct IdentifiedBfCorrelationsTask { .Data())); } if (cfgSmallDCE.value) { - dataCE_small[ixDCE]->storePtAverages(ptavgs); + dataCESmall[ixDCE]->storePtAverages(ptavgs); } else { dataCE[ixDCE]->storePtAverages(ptavgs); } @@ -976,7 +1041,7 @@ struct IdentifiedBfCorrelationsTask { bfield = (fUseConversionCuts || fUseTwoTrackCut) ? getMagneticField(timestamp) : 0; } if (cfgSmallDCE.value) { - dataCE_small[ixDCE]->processCollision(tracks, tracks, collision.posZ(), collision.centmult(), bfield); + dataCESmall[ixDCE]->processCollision(tracks, tracks, collision.posZ(), collision.centmult(), bfield); } else { dataCE[ixDCE]->processCollision(tracks, tracks, collision.posZ(), collision.centmult(), bfield); } @@ -1059,20 +1124,20 @@ struct IdentifiedBfCorrelationsTask { Filter onlyacceptedcollisions = (aod::identifiedbffilter::collisionaccepted == uint8_t(true)); Filter onlyacceptedtracks = (aod::identifiedbffilter::trackacceptedid >= int8_t(0)); - void processRecLevel(soa::Filtered::iterator const& collision, aod::BCsWithTimestamps const&, soa::Filtered& tracks) + void processRecLevel(soa::Filtered::iterator const& collision, aod::BCsWithTimestamps const&, soa::Filtered const& tracks, aod::McParticles const&) { processSame(collision, tracks, collision.bc_as().timestamp()); } - PROCESS_SWITCH(IdentifiedBfCorrelationsTask, processRecLevel, "Process reco level correlations", false); + PROCESS_SWITCH(IdentifiedbfTask, processRecLevel, "Process reco level correlations", false); - void processRecLevelCheck(aod::Collisions const& collisions, aod::Tracks& tracks) + void processRecLevelCheck(aod::Collisions const& collisions, aod::Tracks const& tracks, aod::McParticles const&) { int nAssignedTracks = 0; int nNotAssignedTracks = 0; int64_t firstNotAssignedIndex = -1; int64_t lastNotAssignedIndex = -1; - for (auto track : tracks) { + for (const auto& track : tracks) { if (track.has_collision()) { nAssignedTracks++; } else { @@ -1090,16 +1155,16 @@ struct IdentifiedBfCorrelationsTask { LOGF(info, " First not assigned track index %d", firstNotAssignedIndex); LOGF(info, " Last not assigned track index %d", lastNotAssignedIndex); } - PROCESS_SWITCH(IdentifiedBfCorrelationsTask, processRecLevelCheck, "Process reco level checks", true); + PROCESS_SWITCH(IdentifiedbfTask, processRecLevelCheck, "Process reco level checks", true); - void processGenLevelCheck(aod::McCollisions const& mccollisions, aod::McParticles& particles) + void processGenLevelCheck(aod::McCollisions const& mccollisions, aod::McParticles const& particles) { int nAssignedParticles = 0; int nNotAssignedParticles = 0; int64_t firstNotAssignedIndex = -1; int64_t lastNotAssignedIndex = -1; - for (auto particle : particles) { + for (const auto& particle : particles) { if (particle.has_mcCollision()) { nAssignedParticles++; } else { @@ -1117,36 +1182,47 @@ struct IdentifiedBfCorrelationsTask { LOGF(info, " First not assigned track index %d", firstNotAssignedIndex); LOGF(info, " Last not assigned track index %d", lastNotAssignedIndex); } - PROCESS_SWITCH(IdentifiedBfCorrelationsTask, processGenLevelCheck, "Process generator level checks", true); + PROCESS_SWITCH(IdentifiedbfTask, processGenLevelCheck, "Process generator level checks", true); void processRecLevelNotStored( soa::Filtered>::iterator const& collision, aod::BCsWithTimestamps const&, - soa::Filtered>& tracks) + soa::Filtered> const& tracks, + aod::McParticles const&) { processSame(collision, tracks, collision.bc_as().timestamp()); } - PROCESS_SWITCH(IdentifiedBfCorrelationsTask, - processRecLevelNotStored, + PROCESS_SWITCH(IdentifiedbfTask, processRecLevelNotStored, "Process reco level correlations for not stored derived data", true); + void processDetLevelNotStored( + soa::Filtered>::iterator const& collision, + aod::BCsWithTimestamps const&, + soa::Filtered> const& tracks, + aod::McParticles const&) + { + processSame(collision, tracks, collision.bc_as().timestamp()); + } + PROCESS_SWITCH(IdentifiedbfTask, processDetLevelNotStored, + "Process detecotr level correlations for not stored derived data", + true); + void processGenLevel( soa::Filtered::iterator const& collision, - soa::Filtered>& tracks) + soa::Filtered> const& tracks) { processSame(collision, tracks); } - PROCESS_SWITCH(IdentifiedBfCorrelationsTask, processGenLevel, "Process generator level correlations", false); + PROCESS_SWITCH(IdentifiedbfTask, processGenLevel, "Process generator level correlations", false); void processGenLevelNotStored( soa::Filtered>::iterator const& collision, - soa::Filtered>& particles) + soa::Filtered> const& particles) { processSame(collision, particles); } - PROCESS_SWITCH(IdentifiedBfCorrelationsTask, - processGenLevelNotStored, + PROCESS_SWITCH(IdentifiedbfTask, processGenLevelNotStored, "Process generator level correlations for not stored derived data", false); @@ -1157,14 +1233,14 @@ struct IdentifiedBfCorrelationsTask { using BinningZVtxMultRec = ColumnBinningPolicy; BinningZVtxMultRec bindingOnVtxAndMultRec{{vtxBinsEdges, multBinsEdges}, true}; // true is for 'ignore overflows' (true by default) - void processRecLevelMixed(soa::Filtered& collisions, aod::BCsWithTimestamps const&, soa::Filtered& tracks) + void processRecLevelMixed(soa::Filtered const& collisions, aod::BCsWithTimestamps const&, soa::Filtered const& tracks) { auto tracksTuple = std::make_tuple(tracks); SameKindPair, soa::Filtered, BinningZVtxMultRec> pairreco{bindingOnVtxAndMultRec, 5, -1, collisions, tracksTuple, &cache}; // indicates that 5 events should be mixed and under/overflow (-1) to be ignored LOGF(IDENTIFIEDBFLOGCOLLISIONS, "Received %d collisions", collisions.size()); int logcomb = 0; - for (auto& [collision1, tracks1, collision2, tracks2] : pairreco) { + for (const auto& [collision1, tracks1, collision2, tracks2] : pairreco) { if (logcomb < 10) { LOGF(IDENTIFIEDBFLOGCOLLISIONS, "Received collision pair: %ld (%f, %f): %s, %ld (%f, %f): %s", collision1.globalIndex(), collision1.posZ(), collision1.centmult(), collision1.collisionaccepted() ? "accepted" : "not accepted", @@ -1179,12 +1255,12 @@ struct IdentifiedBfCorrelationsTask { processMixed(collision1, tracks1, tracks2, collision1.bc_as().timestamp()); } } - PROCESS_SWITCH(IdentifiedBfCorrelationsTask, processRecLevelMixed, "Process reco level mixed events correlations", false); + PROCESS_SWITCH(IdentifiedbfTask, processRecLevelMixed, "Process reco level mixed events correlations", false); void processRecLevelMixedNotStored( - soa::Filtered>& collisions, + soa::Filtered> const& collisions, aod::BCsWithTimestamps const&, - soa::Filtered>& tracks) + soa::Filtered> const& tracks) { auto tracksTuple = std::make_tuple(tracks); SameKindPair>, @@ -1199,7 +1275,7 @@ struct IdentifiedBfCorrelationsTask { LOGF(IDENTIFIEDBFLOGCOLLISIONS, "Received %d collisions", collisions.size()); int logcomb = 0; - for (auto& [collision1, tracks1, collision2, tracks2] : pairreco) { + for (const auto& [collision1, tracks1, collision2, tracks2] : pairreco) { if (logcomb < 10) { LOGF(IDENTIFIEDBFLOGCOLLISIONS, "Received collision pair: %ld (%f, %f): %s, %ld (%f, %f): %s", @@ -1231,22 +1307,21 @@ struct IdentifiedBfCorrelationsTask { collision1.bc_as().timestamp()); } } - PROCESS_SWITCH(IdentifiedBfCorrelationsTask, - processRecLevelMixedNotStored, + PROCESS_SWITCH(IdentifiedbfTask, processRecLevelMixedNotStored, "Process reco level mixed events correlations for not stored derived data", false); using BinningZVtxMultGen = ColumnBinningPolicy; BinningZVtxMultGen bindingOnVtxAndMultGen{{vtxBinsEdges, multBinsEdges}, true}; // true is for 'ignore overflows' (true by default) - void processGenLevelMixed(soa::Filtered& collisions, soa::Filtered& tracks) + void processGenLevelMixed(soa::Filtered const& collisions, soa::Filtered const& tracks) { auto tracksTuple = std::make_tuple(tracks); SameKindPair, soa::Filtered, BinningZVtxMultGen> pairgen{bindingOnVtxAndMultGen, 5, -1, collisions, tracksTuple, &cache}; // indicates that 5 events should be mixed and under/overflow (-1) to be ignored LOGF(IDENTIFIEDBFLOGCOLLISIONS, "Received %d generated collisions", collisions.size()); int logcomb = 0; - for (auto& [collision1, tracks1, collision2, tracks2] : pairgen) { + for (const auto& [collision1, tracks1, collision2, tracks2] : pairgen) { if (logcomb < 10) { LOGF(IDENTIFIEDBFLOGCOLLISIONS, "Received generated collision pair: %ld (%f, %f): %s, %ld (%f, %f): %s", collision1.globalIndex(), collision1.posZ(), collision1.centmult(), collision1.collisionaccepted() ? "accepted" : "not accepted", @@ -1260,11 +1335,11 @@ struct IdentifiedBfCorrelationsTask { processMixed(collision1, tracks1, tracks2); } } - PROCESS_SWITCH(IdentifiedBfCorrelationsTask, processGenLevelMixed, "Process generator level mixed events correlations", false); + PROCESS_SWITCH(IdentifiedbfTask, processGenLevelMixed, "Process generator level mixed events correlations", false); void processGenLevelMixedNotStored( - soa::Filtered>& collisions, - soa::Filtered>& tracks) + soa::Filtered> const& collisions, + soa::Filtered> const& tracks) { auto tracksTuple = std::make_tuple(tracks); SameKindPair>, @@ -1279,7 +1354,7 @@ struct IdentifiedBfCorrelationsTask { LOGF(IDENTIFIEDBFLOGCOLLISIONS, "Received %d generated collisions", collisions.size()); int logcomb = 0; - for (auto& [collision1, tracks1, collision2, tracks2] : pairgen) { + for (const auto& [collision1, tracks1, collision2, tracks2] : pairgen) { if (logcomb < 10) { LOGF(IDENTIFIEDBFLOGCOLLISIONS, "Received generated collision pair: %ld (%f, %f): %s, %ld (%f, %f): %s", @@ -1307,8 +1382,7 @@ struct IdentifiedBfCorrelationsTask { processMixed(collision1, tracks1, tracks2); } } - PROCESS_SWITCH(IdentifiedBfCorrelationsTask, - processGenLevelMixedNotStored, + PROCESS_SWITCH(IdentifiedbfTask, processGenLevelMixedNotStored, "Process generator level mixed events correlations for not stored derived data", false); @@ -1318,13 +1392,13 @@ struct IdentifiedBfCorrelationsTask { LOGF(IDENTIFIEDBFLOGCOLLISIONS, "Got %d new collisions", colls.size()); fOutput->Clear(); } - PROCESS_SWITCH(IdentifiedBfCorrelationsTask, processCleaner, "Cleaner process for not used output", false); + PROCESS_SWITCH(IdentifiedbfTask, processCleaner, "Cleaner process for not used output", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { WorkflowSpec workflow{ - adaptAnalysisTask(cfgc, TaskName{"IdentifiedBfCorrelationsTaskRec"}, SetDefaultProcesses{{{"processRecLevel", true}, {"processRecLevelMixed", false}, {"processCleaner", false}}}), - adaptAnalysisTask(cfgc, TaskName{"IdentifiedBfCorrelationsTaskGen"}, SetDefaultProcesses{{{"processGenLevel", false}, {"processGenLevelMixed", false}, {"processCleaner", true}}})}; + adaptAnalysisTask(cfgc, TaskName{"IdentifiedbfTaskRec"}, SetDefaultProcesses{{{"processRecLevel", true}, {"processRecLevelMixed", false}, {"processCleaner", false}}}), // o2-linter: disable=name/o2-task (Task is adapted multiple times) + adaptAnalysisTask(cfgc, TaskName{"IdentifiedbfTaskGen"}, SetDefaultProcesses{{{"processGenLevel", false}, {"processGenLevelMixed", false}, {"processCleaner", true}}})}; // o2-linter: disable=name/o2-task (Task is adapted multiple times) return workflow; } From 24e24834ca7e6111b4a50bae5872b17f6580b571 Mon Sep 17 00:00:00 2001 From: Tanu Gahlaut <154991749+TGahlaut1@users.noreply.github.com> Date: Wed, 19 Mar 2025 05:14:37 +0530 Subject: [PATCH 0753/1650] [PWGCF] fix memory issues and remove uneccesary histograms (#10568) --- PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx | 253 ++++++++++-------- 1 file changed, 134 insertions(+), 119 deletions(-) diff --git a/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx b/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx index 30179b402da..d7aa4698068 100644 --- a/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx @@ -55,7 +55,6 @@ struct MeanPtFlucId { Configurable cfgCutRap{"cfgCutRap", 0.5, "Rapidity Cut"}; Configurable cfgCutDcaZ{"cfgCutDcaZ", 0.3, "DCAz cut"}; Configurable cfgCutPosZ{"cfgCutPosZ", 10.0, "cut for vertex Z"}; - Configurable cfgGammaCut{"cfgGammaCut", 0.003, "Gamma inv Mass Cut for electron-positron rejection"}; Configurable cfgCutNSig2{"cfgCutNSig2", 2.0, "nSigma cut (2)"}; Configurable cfgCutNSig3{"cfgCutNSig3", 3.0, "nSigma cut (3)"}; Configurable cfgCutPiPtMin{"cfgCutPiPtMin", 0.2, "Minimum pion p_{T} cut"}; @@ -189,7 +188,6 @@ struct MeanPtFlucId { const AxisSpec axisChi2{40, 0., 40., "Chi2"}; const AxisSpec axisCrossedTPC{300, 0, 300, "Crossed TPC"}; const AxisSpec axisM2{100, 0., 1.4, "#it{m}^{2} (GeV/#it{c}^{2})^{2}"}; - const AxisSpec axisMass{1000, 0., 0.1, "M_{inv} (GeV/#it{c}^2)"}; HistogramConfigSpec qNHist({HistType::kTHnSparseD, {axisMultTPC, axisQn, axisMultFT0M}}); HistogramConfigSpec partHist({HistType::kTHnSparseD, {axisMultTPC, axisPart, axisMultFT0M}}); @@ -239,25 +237,24 @@ struct MeanPtFlucId { hist.add("QA/after/h_TPCChi2perCluster", "TPC #Chi^{2}/Cluster", kTH1D, {axisChi2}); hist.add("QA/after/h_ITSChi2perCluster", "ITS #Chi^{2}/Cluster", kTH1D, {axisChi2}); hist.add("QA/after/h_crossedTPC", "Crossed TPC", kTH1D, {axisCrossedTPC}); - hist.add("QA/after/h_NFT0C", "FT0C Multiplicity", kTH1D, {axisMultFT0M}); - hist.add("QA/after/h_invMass_gamma", "Inv Mass of #gamma", kTH1D, {axisMass}); hist.add("QA/after/h_counts_evSelCuts", "Event selection cuts", kTH1D, {axisEvents}); hist.add("QA/after/h_VtxZReco", "Simulated Vertex Z", kTH1D, {axisVtxZ}); hist.add("QA/after/h2_PvsPinner", "p_{InnerParam} vs p", kTH2D, {{axisP}, {axisInnerParam}}); hist.add("QA/after/h2_Pt_Eta", "p_{T} vs #eta ", kTH2D, {{axisEta}, {axisPt}}); hist.add("QA/after/h2_NTPC_Cent", "N_{TPC} vs FT0C(%)", kTH2D, {{axisCentFT0C}, {axisMultTPC}}); + hist.add("QA/after/h2_NTPC_CentM", "N_{TPC} vs FT0M(%)", kTH2D, {{axisCentFT0C}, {axisMultTPC}}); hist.add("QA/after/h2_NTPC_NFT0M", "N_{TPC} vs N_{FT0M}", kTH2D, {{axisMultFT0M}, {axisMultTPC}}); - hist.add("QA/after/h2_NTPC_NFT0C", "N_{TPC} vs N_{FT0C}", kTH2D, {{axisMultFT0M}, {axisMultTPC}}); hist.add("QA/after/p_NTPC_NFT0M", "N_{TPC} vs N_{FT0M} (Profile)", kTProfile, {axisMultFT0M}); - hist.add("QA/after/p_NTPC_NFT0C", "N_{TPC} vs N_{FT0C} (Profile)", kTProfile, {axisMultFT0M}); hist.add("QA/after/p_NTPC_Cent", "N_{TPC} vs FT0C(%) (Profile)", kTProfile, {axisCentFT0C}); hist.add("QA/after/h_Pt2", "p_{T}^2", kTH1D, {axisPt2}); hist.add("QA/after/h_Pt_weighted", "weighted pT distribution", kTH1D, {axisPt}); hist.add("QA/after/h_Pt2_weighted", "weighted pT distribution", kTH1D, {axisPt2}); hist.add("QA/after/h2_Pt_NFT0M", "p_{T} in Multiplicity Classes ", kTH2D, {{axisPt}, {axisMultFT0M}}); + hist.add("QA/after/h_PtEtaVz_NFT0M", "p_{T}, #eta, #phi in Multiplicity Classes ", kTHnSparseD, {{axisPt}, {axisEta}, {axisPhi}, {axisMultFT0M}}); + hist.add("QA/after/h_PtEtaVz_centFT0M", "p_{T}, #eta, #phi in centrality Classes ", kTHnSparseD, {{axisPt}, {axisEta}, {axisPhi}, {axisCentFT0C}}); hist.add("QA/after/h2_pt_nch", "Truth", kTH2D, {{axisMult}, {axisPt}}); hist.add("QA/after/h3_nft0m_pt_nch", "Reco", kTHnSparseD, {{axisMult}, {axisPt}, {axisMultFT0M}}); hist.add("QA/after/h2_pt_nch_prof", "Truth", kTProfile, {axisMult}); @@ -293,11 +290,11 @@ struct MeanPtFlucId { hist.add("QA/Pion/h2_Pt_Rap_weighted", "p_{T} vs y weighted", kTH2D, {{axisY}, {axisPt}}); hist.add("QA/Pion/h2_Pt_Eta_weighted", "p_{T} vs #eta weighted", kTH2D, {{axisEta}, {axisPt}}); hist.add("QA/Pion/h2_Pt_NFT0M", "p_{T} in Multiplicity Classes ", kTH2D, {{axisPt}, {axisMultFT0M}}); - hist.add("QA/Pion/h2_PtPos_NFT0M", "p_{T} in Multiplicity Classes ", kTH2D, {{axisPt}, {axisMultFT0M}}); - hist.add("QA/Pion/h2_PtNeg_NFT0M", "p_{T} in Multiplicity Classes ", kTH2D, {{axisPt}, {axisMultFT0M}}); + + hist.add("QA/Pion/h_PtEtaVz_NFT0M", "p_{T}, #eta, #phi in Multiplicity Classes ", kTHnSparseD, {{axisPt}, {axisEta}, {axisPhi}, {axisMultFT0M}}); + hist.add("QA/Pion/h_PtEtaVz_centFT0M", "p_{T}, #eta, #phi in centrality Classes ", kTHnSparseD, {{axisPt}, {axisEta}, {axisPhi}, {axisCentFT0C}}); + hist.add("QA/Pion/h2_PtTruth_NFT0M", "p_{T} in Multiplicity Classes ", kTH2D, {{axisPt}, {axisMultFT0M}}); - hist.add("QA/Pion/h2_PtPosTruth_NFT0M", "p_{T} in Multiplicity Classes ", kTH2D, {{axisPt}, {axisMultFT0M}}); - hist.add("QA/Pion/h2_PtNegTruth_NFT0M", "p_{T} in Multiplicity Classes ", kTH2D, {{axisPt}, {axisMultFT0M}}); hist.add("QA/Pion/h2_pt_nch", "Reco", kTH2D, {{axisMult}, {axisPt}}); hist.add("QA/Pion/h3_nft0m_pt_nch", "Reco", kTHnSparseD, {{axisMult}, {axisPt}, {axisMultFT0M}}); hist.add("QA/Pion/h2_pt_nch_prof", "Reco", kTProfile, {axisMult}); @@ -364,19 +361,14 @@ struct MeanPtFlucId { hist.add("Gen/h_VtxZ_b", "Vertex Z ", kTH1D, {axisVtxZ}); hist.add("Gen/h_NTPC", "Mid rapidity Multiplicity", kTH1D, {axisMultTPC}); hist.add("Gen/h_NFT0C", "Forward Multiplicity", kTH1D, {axisMultFT0MMC}); - hist.add("Gen/h2_NTPC_NFT0C", "N_{TPC} vs N_{FT0C}", kTH2D, {{axisMultFT0MMC}, {axisMultTPC}}); - hist.add("Gen/h2_NTPC_NFT0M", "N_{TPC} vs N_{FT0M} Reco", kTH2D, {{axisMultFT0M}, {axisMultTPC}}); + hist.add("Gen/h2_NTPC_NFT0M", "NTPC vs Forward Multiplicity", kTH2D, {{axisMultFT0M}, {axisMultTPC}}); hist.add("Gen/h_NSim", "Truth Multiplicity TPC", kTH1D, {axisMultTPC}); hist.add("Gen/h2_NTPC_NSim", "Reco vs Truth Multiplicty TPC", kTH2D, {{axisMultTPC}, {axisMultTPC}}); hist.add("Gen/h2_NChSim_NSim", "Truth Multiplicty NCh vs NTPC", kTH2D, {{axisMultTPC}, {axisMultTPC}}); - hist.add("Gen/h2_NTPC_NChSim", "Truth Multiplicty NCh vs Reco NTPC", kTH2D, {{axisMultTPC}, {axisMultTPC}}); - hist.add("Gen/h2_NTPC_NPiSim", "Truth Multiplicty NPi vs Reco NTPC", kTH2D, {{axisMultTPC}, {axisMultTPC}}); - hist.add("Gen/h2_NTPC_NKaSim", "Truth Multiplicty NKa vs Reco NTPC", kTH2D, {{axisMultTPC}, {axisMultTPC}}); - hist.add("Gen/h2_NTPC_NPrSim", "Truth Multiplicty NPr vs Reco NTPC", kTH2D, {{axisMultTPC}, {axisMultTPC}}); - hist.add("Gen/h2_NFT0C_NFT0CSim", "Reco vs Truth Multplicity FT0C", kTH2D, {{axisMultFT0MMC}, {axisMultFT0M}}); - hist.add("Gen/Charged/h2_Nid_NidSim", "reco vs truth multiplicity", kTH2D, {{axisMultTPC}, {axisMultTPC}}); + hist.add("Gen/Charged/h_PtEtaVz_NFT0M", "p_{T}, #eta, #phi in Multiplicity Classes ", kTHnSparseD, {{axisPt}, {axisEta}, {axisPhi}, {axisMultFT0M}}); + hist.add("Gen/Charged/h_PtEtaVz_centFT0M", "p_{T}, #eta, #phi in centrality Classes ", kTHnSparseD, {{axisPt}, {axisEta}, {axisPhi}, {axisCentFT0C}}); hist.add("Gen/Charged/h_EtaTruth", "#eta ", kTH1D, {axisEta}); hist.add("Gen/Charged/h_PhiTruth", "#phi ", kTH1D, {axisPhi}); hist.add("Gen/Charged/h_PtTruth", "p_{T} ", kTH1D, {axisPt}); @@ -386,6 +378,7 @@ struct MeanPtFlucId { hist.add("Gen/Charged/h_Mult", "Multiplicity", kTH1D, {axisMult}); hist.add("Gen/Charged/h_Mult_weighted", "Multiplicity", kTH1D, {axisMult}); + hist.add("Gen/Charged/h2_pt_nch", "Truth", kTH2D, {{axisMult}, {axisPt}}); hist.add("Gen/Charged/h3_nft0m_pt_nch", "Truth", kTHnSparseD, {{axisMult}, {axisPt}, {axisMultFT0M}}); hist.add("Gen/Charged/h2_pt_nch_prof", "Truth", kTProfile, {axisMult}); @@ -419,10 +412,8 @@ struct MeanPtFlucId { hist.add("Gen/Pion/h_RapTruth", "y", kTH1D, {axisY}); hist.add("Gen/Pion/h2_PtTruth_Rap", "p_{T} vs y", kTH2D, {{axisY}, {axisPt}}); - hist.add("Gen/Pion/h_PtPosTruth", "p_{T} (Positive)", kTH1D, {axisPt}); - hist.add("Gen/Pion/h_PtNegTruth", "p_{T} (negative)", kTH1D, {axisPt}); - hist.add("Gen/Pion/h2_PtPosTruth_NFT0M", "p_{T} in Multiplicity Classes ", kTH2D, {{axisPt}, {axisMultFT0M}}); - hist.add("Gen/Pion/h2_PtNegTruth_NFT0M", "p_{T} in Multiplicity Classes ", kTH2D, {{axisPt}, {axisMultFT0M}}); + hist.add("Gen/Pion/h_PtPosTruth", "p_{T} (positive) ", kTH1D, {axisPt}); + hist.add("Gen/Pion/h_PtNegTruth", "p_{T} (negative) ", kTH1D, {axisPt}); hist.addClone("Gen/Pion/", "Gen/Kaon/"); hist.addClone("Gen/Pion/", "Gen/Proton/"); @@ -512,8 +503,10 @@ struct MeanPtFlucId { if (std::fabs(track.dcaZ()) > cfgCutDcaZ) return false; - if (std::abs(track.eta()) >= cfgCutEta) - return false; + if (std::fabs(track.dcaZ()) > (0.0105 + 0.035 / std::pow(track.p(), 1.1))) + + if (std::abs(track.eta()) >= cfgCutEta) + return false; return true; } @@ -658,24 +651,24 @@ struct MeanPtFlucId { hist.fill(HIST("QA/after/h_Cent"), col.centFT0C()); hist.fill(HIST("QA/after/h_CentM"), col.centFT0M()); hist.fill(HIST("QA/after/h_NFT0M"), col.multFT0M()); - hist.fill(HIST("QA/after/h_NFT0C"), col.multFT0C()); hist.fill(HIST("QA/after/h2_NTPC_NFT0M"), col.multFT0M(), col.multNTracksHasTPC()); - hist.fill(HIST("QA/after/h2_NTPC_NFT0C"), col.multFT0C(), col.multNTracksHasTPC()); hist.fill(HIST("QA/after/h2_NTPC_Cent"), col.centFT0C(), col.multNTracksHasTPC()); + hist.fill(HIST("QA/after/h2_NTPC_CentM"), col.centFT0M(), col.multNTracksHasTPC()); hist.fill(HIST("QA/after/p_NTPC_Cent"), col.centFT0C(), col.multNTracksHasTPC()); hist.fill(HIST("QA/after/p_NTPC_NFT0M"), col.multFT0M(), col.multNTracksHasTPC()); - hist.fill(HIST("QA/after/p_NTPC_NFT0C"), col.multFT0C(), col.multNTracksHasTPC()); } // Fill Charged particles QA: template - void fillChargedQAHistos(T const& track, int nFT0M) + void fillChargedQAHistos(T const& track, int nFT0M, double centFT0M) { hist.fill(HIST("QA/after/h_Eta"), track.eta()); hist.fill(HIST("QA/after/h_Phi"), track.phi()); hist.fill(HIST("QA/after/h_Pt"), track.pt()); hist.fill(HIST("QA/after/h_Pt2"), track.pt() * track.pt()); hist.fill(HIST("QA/after/h2_Pt_NFT0M"), track.pt(), nFT0M); + hist.fill(HIST("QA/after/h_PtEtaVz_NFT0M"), track.pt(), track.eta(), track.phi(), nFT0M); + hist.fill(HIST("QA/after/h_PtEtaVz_centFT0M"), track.pt(), track.eta(), track.phi(), centFT0M); hist.fill(HIST("QA/after/h2_PvsPinner"), track.p(), track.tpcInnerParam()); hist.fill(HIST("QA/after/h2_Pt_Eta"), track.eta(), track.pt()); hist.fill(HIST("QA/after/h_DcaZ"), track.dcaZ()); @@ -743,13 +736,13 @@ struct MeanPtFlucId { if (cfgWeightPt) { float weightPt = hWeightPt->GetBinContent(hWeightPt->FindBin(pt)); - weight = purity / weightPt; + weight = purity * weightPt; } else if (cfgWeightPtY) { float weightPtY = hWeightPtY->GetBinContent(hWeightPtY->FindBin(rap, pt)); - weight = purity / weightPtY; + weight = purity * weightPtY; } else if (cfgWeightPtEta) { float weightPtEta = hWeightPtEta->GetBinContent(hWeightPtEta->FindBin(eta, pt)); - weight = purity / weightPtEta; + weight = purity * weightPtEta; } else { weight = 1.0; } @@ -758,7 +751,7 @@ struct MeanPtFlucId { // Fill after PID cut QA hist: template - void fillIdParticleQAHistos(T const& track, double rap, double nSigmaTPC, double nSigmaTOF, int nFT0M, T1 hWeightPt, T1 hPurePt, T2 hWeightPtY, T2 hWeightPtEta, bool cfgWeightPtId, bool cfgWeightPtYId, bool cfgWeightPtEtaId, bool cfgPurityId, int& N, double& NW, double& Q1, double& Q2, double& Q3, double& Q4, float& weight) + void fillIdParticleQAHistos(T const& track, double rap, double nSigmaTPC, double nSigmaTOF, int nFT0M, double vtxZ, double centFT0M, T1 hWeightPt, T1 hPurePt, T2 hWeightPtY, T2 hWeightPtEta, bool cfgWeightPtId, bool cfgWeightPtYId, bool cfgWeightPtEtaId, bool cfgPurityId, int& N, double& NW, double& Q1, double& Q2, double& Q3, double& Q4, float& weight) { double pt = track.pt(); double eta = track.eta(); @@ -782,14 +775,14 @@ struct MeanPtFlucId { hist.fill(HIST(Dire[Mode]) + HIST("h_Pt"), pt); hist.fill(HIST(Dire[Mode]) + HIST("h_Pt2"), pt * pt); hist.fill(HIST(Dire[Mode]) + HIST("h2_Pt_NFT0M"), pt, nFT0M); + hist.fill(HIST(Dire[Mode]) + HIST("h_PtEtaVz_NFT0M"), pt, eta, vtxZ, nFT0M); + hist.fill(HIST(Dire[Mode]) + HIST("h_PtEtaVz_centFT0M"), pt, eta, vtxZ, centFT0M); hist.fill(HIST(Dire[Mode]) + HIST("h2_Pt_Eta"), eta, pt); if (track.sign() > 0) { hist.fill(HIST(Dire[Mode]) + HIST("h_PtPos"), pt); - hist.fill(HIST(Dire[Mode]) + HIST("h2_PtPos_NFT0M"), pt, nFT0M); } if (track.sign() < 0) { hist.fill(HIST(Dire[Mode]) + HIST("h_PtNeg"), pt); - hist.fill(HIST(Dire[Mode]) + HIST("h2_PtNeg_NFT0M"), pt, nFT0M); } hist.fill(HIST(Dire[Mode]) + HIST("h_Eta"), eta); @@ -839,18 +832,16 @@ struct MeanPtFlucId { if (pid == pdgCodePos) { hist.fill(HIST(Dire[Mode]) + HIST("h_PtPosTruth"), pt); - hist.fill(HIST(Dire[Mode]) + HIST("h2_PtPosTruth_NFT0M"), pt, nFT0M); } if (pid == pdgCodeNeg) { hist.fill(HIST(Dire[Mode]) + HIST("h_PtNegTruth"), pt); - hist.fill(HIST(Dire[Mode]) + HIST("h2_PtNegTruth_NFT0M"), pt, nFT0M); } } template void fillAnalysisHistos(int nTPC, int nFT0M, int N, double NW, double Q1, double Q2, double Q3, double Q4) { - if (N == 0) { + if (NW == 0) { return; } double twopart1 = ((Q1 * Q1) - Q2); @@ -864,7 +855,7 @@ struct MeanPtFlucId { hist.fill(HIST(Dire[Mode]) + HIST("h_Q3"), nTPC, Q3, nFT0M); hist.fill(HIST(Dire[Mode]) + HIST("h_Q4"), nTPC, Q4, nFT0M); - if (N > 1) { + if (NW > 1) { double meanPt = Q1 / NW; double nPair = (NW * (NW - 1)); double twopart = twopart1 / nPair; @@ -883,14 +874,14 @@ struct MeanPtFlucId { hist.fill(HIST(Dire[Mode]) + HIST("h_CheckNCh"), nTPC, checkNDenoVar, nFT0M); hist.fill(HIST(Dire[Mode]) + HIST("p_twopart_MultFT0M"), nFT0M, twopart); - if (N > 2) { + if (NW > 2) { double nTriplet = (NW * (NW - 1) * (NW - 2)); double threepart = threepart1 / nTriplet; hist.fill(HIST(Dire[Mode]) + HIST("h_mean_pT_Mult_skew"), nTPC, meanPt, nFT0M); hist.fill(HIST(Dire[Mode]) + HIST("h_twopart_Mult_skew"), nTPC, twopart, nFT0M); hist.fill(HIST(Dire[Mode]) + HIST("h_threepart_Mult_skew"), nTPC, threepart, nFT0M); - if (N > 3) { + if (NW > 3) { double nQuad = (NW * (NW - 1) * (NW - 2) * (NW - 3)); double fourpart = fourpart1 / nQuad; hist.fill(HIST(Dire[Mode]) + HIST("h_mean_pT_Mult_kurto"), nTPC, meanPt, nFT0M); @@ -903,25 +894,18 @@ struct MeanPtFlucId { } template - void fillMeanPtCorr(std::vector ptVal, std::vector weightVal, int N, int nFT0M, bool cfgWeight) + void fillMeanPt(int N, int nFT0M, double pt, float w) { - for (int i = 0; i < N; i++) { - float w = 1.0; - if (cfgWeight) { - w = weightVal[i]; - } - double pt = ptVal[i]; - - hist.fill(HIST(Dire[Mode]) + HIST("h2_pt_nch"), N, pt, w); - hist.fill(HIST(Dire[Mode]) + HIST("h2_pt_nch_prof"), N, pt, w); - hist.fill(HIST(Dire[Mode]) + HIST("h3_nft0m_pt_nch"), N, pt, nFT0M, w); - } + hist.fill(HIST(Dire[Mode]) + HIST("h2_pt_nch"), N, pt, w); + hist.fill(HIST(Dire[Mode]) + HIST("h2_pt_nch_prof"), N, pt, w); + hist.fill(HIST(Dire[Mode]) + HIST("h3_nft0m_pt_nch"), N, pt, nFT0M, w); } template void fillHistos(T const& col, U const& tracks) { - int nCh = 0, nTPC = 0, nFT0M = 0, nFT0C = 0; + int nCh = 0, nTPC = 0, nFT0M = 0; + double centFT0M = 0, vtxZ = 0, vtxZSim = 0; double nChW = 0; int nPi = 0, nKa = 0, nPr = 0; @@ -941,13 +925,11 @@ struct MeanPtFlucId { float wghtCh = 1.0, wghtPi = 1.0, wghtKa = 1.0, wghtPr = 1.0; - std::vector ptValCh, ptValPi, ptValKa, ptValPr; - std::vector weightValCh, weightValPi, weightValKa, weightValPr; - if constexpr (DataFlag) { nTPC = col.multNTracksHasTPC(); nFT0M = col.multFT0M(); - nFT0C = col.multFT0C(); + centFT0M = col.centFT0M(); + vtxZ = col.posZ(); fillAfterQAHistos(col); for (const auto& track : tracks) { @@ -973,8 +955,9 @@ struct MeanPtFlucId { moments(ptCh, wghtCh, q1Ch, q2Ch, q3Ch, q4Ch); hist.fill(HIST("QA/after/h_Pt_weighted"), ptCh, wghtCh); + hist.fill(HIST("QA/after/h_Pt2_weighted"), ptCh * ptCh, wghtCh); - fillChargedQAHistos(track, nFT0M); + fillChargedQAHistos(track, nFT0M, centFT0M); fillBeforePIDQAHistos(track); @@ -983,15 +966,15 @@ struct MeanPtFlucId { } if (selPi(track)) { - fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, hWeightPtPi, hPurePtPi, hWeightPtRapPi, hWeightPtEtaPi, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi, wghtPi); + fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, vtxZ, centFT0M, hWeightPtPi, hPurePtPi, hWeightPtRapPi, hWeightPtEtaPi, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi, wghtPi); } if (selKa(track)) { - fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, hWeightPtKa, hPurePtKa, hWeightPtRapKa, hWeightPtEtaKa, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka, wghtKa); + fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, vtxZ, centFT0M, hWeightPtKa, hPurePtKa, hWeightPtRapKa, hWeightPtEtaKa, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka, wghtKa); } if (selPr(track)) { - fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, hWeightPtPr, hPurePtPr, hWeightPtRapPr, hWeightPtEtaPr, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr, wghtPr); + fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, vtxZ, centFT0M, hWeightPtPr, hPurePtPr, hWeightPtRapPr, hWeightPtEtaPr, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr, wghtPr); } } } @@ -1002,10 +985,12 @@ struct MeanPtFlucId { } nTPC = col.multNTracksHasTPC(); nFT0M = col.multFT0M(); - nFT0C = col.multFT0C(); - std::vector ptValChSim, ptValPiSim, ptValKaSim, ptValPrSim; + centFT0M = col.centFT0M(); + vtxZ = col.posZ(); fillAfterQAHistos(col); + + vtxZSim = col.mcCollision().posZ(); for (const auto& track : tracks) { if (!track.has_mcParticle()) { LOGF(warning, "No MC Particle for this track, skip..."); @@ -1013,9 +998,6 @@ struct MeanPtFlucId { } auto mcPart = track.mcParticle(); int pid = mcPart.pdgCode(); - if (!mcPart.isPhysicalPrimary()) { - continue; - } double nSigmaTPCPi = track.tpcNSigmaPi(); double nSigmaTPCKa = track.tpcNSigmaKa(); @@ -1034,12 +1016,10 @@ struct MeanPtFlucId { eta = track.eta(); ptCh = track.pt(); wghtCh = getCorrectedWeight(hWeightPt, hPurePt, hWeightPtRap, hWeightPtEta, ptCh, 0.0, eta, cfgWeightPtCh, false, false, false); - ptValCh.push_back(track.pt()); - weightValCh.push_back(wghtCh); nChW += wghtCh; nCh++; moments(ptCh, wghtCh, q1Ch, q2Ch, q3Ch, q4Ch); - fillChargedQAHistos(track, nFT0M); + fillChargedQAHistos(track, nFT0M, centFT0M); hist.fill(HIST("QA/after/h_Pt_weighted"), ptCh, wghtCh); hist.fill(HIST("QA/after/h_Pt2_weighted"), ptCh * ptCh, wghtCh); @@ -1052,18 +1032,14 @@ struct MeanPtFlucId { if (selPi(track)) { ptPi = track.pt(); - fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, hWeightPtPi, hPurePtPi, hWeightPtRapPi, hWeightPtEtaPi, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi, wghtPi); - ptValPi.push_back(track.pt()); - weightValPi.push_back(wghtPi); + fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, vtxZ, centFT0M, hWeightPtPi, hPurePtPi, hWeightPtRapPi, hWeightPtEtaPi, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi, wghtPi); if (std::abs(pid) == kPiPlus) { fillPtMCHist(ptPi, eta, rapPi, nFT0M, pid, kPiPlus, kPiMinus); } } if (selKa(track)) { ptKa = track.pt(); - fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, hWeightPtKa, hPurePtKa, hWeightPtRapKa, hWeightPtEtaKa, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka, wghtKa); - ptValKa.push_back(track.pt()); - weightValKa.push_back(wghtKa); + fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, vtxZ, centFT0M, hWeightPtKa, hPurePtKa, hWeightPtRapKa, hWeightPtEtaKa, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka, wghtKa); if (std::abs(pid) == kKPlus) { fillPtMCHist(ptKa, eta, rapKa, nFT0M, pid, kKPlus, kKMinus); } @@ -1071,9 +1047,7 @@ struct MeanPtFlucId { if (selPr(track)) { ptPr = track.pt(); - fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, hWeightPtPr, hPurePtPr, hWeightPtRapPr, hWeightPtEtaPr, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr, wghtPr); - ptValPr.push_back(track.pt()); - weightValPr.push_back(wghtPr); + fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, vtxZ, centFT0M, hWeightPtPr, hPurePtPr, hWeightPtRapPr, hWeightPtEtaPr, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr, wghtPr); if (std::abs(pid) == kProton) { fillPtMCHist(ptPr, eta, rapPr, nFT0M, pid, kProton, kProtonBar); } @@ -1081,6 +1055,9 @@ struct MeanPtFlucId { } //___________________________________Truth Level____________________________________________________// + if (!mcPart.isPhysicalPrimary()) { + continue; + } auto charge = 0.; auto* pd = pdg->GetParticle(pid); if (pd != nullptr) { @@ -1106,57 +1083,122 @@ struct MeanPtFlucId { if (std::abs(mcPart.eta()) < 0.8) { nChSim++; ptChSim = mcPart.pt(); - ptValChSim.push_back(ptChSim); + etaSim = mcPart.eta(); moments(ptChSim, 1.0, q1ChSim, q2ChSim, q3ChSim, q4ChSim); - hist.fill(HIST("Gen/Charged/h_PtTruth"), mcPart.pt()); + hist.fill(HIST("Gen/Charged/h_PtTruth"), ptChSim); hist.fill(HIST("Gen/Charged/h_PtTruth2"), ptChSim * ptChSim); - hist.fill(HIST("Gen/Charged/h2_PtTruth_NFT0M"), mcPart.pt(), nFT0M); - hist.fill(HIST("Gen/Charged/h2_PtTruth_Eta"), mcPart.eta(), mcPart.pt()); - hist.fill(HIST("Gen/Charged/h_EtaTruth"), mcPart.eta()); + hist.fill(HIST("Gen/Charged/h2_PtTruth_NFT0M"), ptChSim, nFT0M); + hist.fill(HIST("Gen/Charged/h2_PtTruth_Eta"), etaSim, ptChSim); + hist.fill(HIST("Gen/Charged/h_EtaTruth"), etaSim); hist.fill(HIST("Gen/Charged/h_PhiTruth"), mcPart.phi()); - hist.fill(HIST("Gen/Charged/h2_pt_nch"), nChSim, mcPart.pt()); - hist.fill(HIST("Gen/Charged/h3_nft0m_pt_nch"), nChSim, mcPart.pt(), nFT0M); - hist.fill(HIST("Gen/Charged/h2_pt_nch_prof"), nChSim, mcPart.pt()); + hist.fill(HIST("Gen/Pion/h_PhiTruth"), mcPart.phi()); + hist.fill(HIST("Gen/Pion/h_PtEtaVz_NFT0M"), ptChSim, etaSim, mcPart.phi(), nFT0M); + hist.fill(HIST("Gen/Pion/h_PtEtaVz_centFT0M"), ptChSim, etaSim, mcPart.phi(), centFT0M); if (std::abs(pid) == kPiPlus && mcPart.pt() >= cfgCutPiPtMin) { - etaSim = mcPart.eta(); rapSim = mcPart.y(); nPiSim++; ptPiSim = mcPart.pt(); - ptValPiSim.push_back(ptPiSim); moments(ptPiSim, 1.0, q1PiSim, q2PiSim, q3PiSim, q4PiSim); fillPtMCHist(ptPiSim, etaSim, rapSim, nFT0M, pid, kPiPlus, kPiMinus); hist.fill(HIST("Gen/Pion/h_PhiTruth"), mcPart.phi()); + hist.fill(HIST("Gen/Pion/h_PtEtaVz_NFT0M"), ptPiSim, etaSim, mcPart.phi(), nFT0M); + hist.fill(HIST("Gen/Pion/h_PtEtaVz_centFT0M"), ptPiSim, etaSim, mcPart.phi(), centFT0M); } if (std::abs(pid) == kKPlus && mcPart.pt() >= cfgCutKaPtMin) { nKaSim++; ptKaSim = mcPart.pt(); - ptValKaSim.push_back(ptKaSim); moments(ptKaSim, 1.0, q1KaSim, q2KaSim, q3KaSim, q4KaSim); fillPtMCHist(ptKaSim, etaSim, rapSim, nFT0M, pid, kKPlus, kKMinus); hist.fill(HIST("Gen/Kaon/h_PhiTruth"), mcPart.phi()); + hist.fill(HIST("Gen/Kaon/h_PtEtaVz_NFT0M"), ptKaSim, etaSim, mcPart.phi(), nFT0M); + hist.fill(HIST("Gen/Kaon/h_PtEtaVz_centFT0M"), ptKaSim, etaSim, mcPart.phi(), centFT0M); } if (std::abs(pid) == kProton && mcPart.pt() >= cfgCutPrPtMin) { nPrSim++; ptPrSim = mcPart.pt(); - ptValPrSim.push_back(ptPrSim); moments(ptPrSim, 1.0, q1PrSim, q2PrSim, q3PrSim, q4PrSim); fillPtMCHist(ptPrSim, etaSim, rapSim, nFT0M, pid, kProton, kProtonBar); hist.fill(HIST("Gen/Proton/h_PhiTruth"), mcPart.phi()); + hist.fill(HIST("Gen/Proton/h_PtEtaVz_NFT0M"), ptPrSim, etaSim, mcPart.phi(), nFT0M); + hist.fill(HIST("Gen/Proton/h_PtEtaVz_centFT0M"), ptPrSim, etaSim, mcPart.phi(), centFT0M); + } + } + } + } + + for (const auto& track : tracks) { + if (!track.has_mcParticle()) { + LOGF(warning, "No MC Particle for this track, skip..."); + continue; + } + auto mcPart = track.mcParticle(); + int pid = mcPart.pdgCode(); + + if (selTrack(track)) { + double pt = track.pt(); + double eta = track.eta(); + float wght = getCorrectedWeight(hWeightPt, hPurePt, hWeightPtRap, hWeightPtEta, pt, 0.0, eta, cfgWeightPtCh, false, false, false); + fillMeanPt(nCh, nFT0M, pt, wght); + + if (selPi(track)) { + float wghtId = getCorrectedWeight(hWeightPtPi, hPurePtPi, hWeightPtRapPi, hWeightPtEtaPi, pt, 0.0, eta, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId); + fillMeanPt(nPi, nFT0M, pt, wghtId); + } + if (selKa(track)) { + float wghtId = getCorrectedWeight(hWeightPtKa, hPurePtKa, hWeightPtRapKa, hWeightPtEtaKa, pt, 0.0, eta, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId); + fillMeanPt(nKa, nFT0M, pt, wghtId); + } + if (selPr(track)) { + float wghtId = getCorrectedWeight(hWeightPtPr, hPurePtPr, hWeightPtRapPr, hWeightPtEtaPr, pt, 0.0, eta, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId); + fillMeanPt(nPr, nFT0M, pt, wghtId); + } + } + + if (!mcPart.isPhysicalPrimary()) { + continue; + } + auto charge = 0.; + auto* pd = pdg->GetParticle(pid); + if (pd != nullptr) { + charge = pd->Charge(); + } + if (std::fabs(charge) < 1e-3) { + continue; + } + if (std::abs(pid) != kElectron && std::abs(pid) != kMuonMinus && std::abs(pid) != kPiPlus && std::abs(pid) != kKPlus && std::abs(pid) != kProton) { + continue; + } + + if (mcPart.pt() > cfgCutPtMin && mcPart.pt() < cfgCutPtMax) { + + if (std::abs(mcPart.eta()) < 0.8) { + double pt = mcPart.pt(); + float wght = 1.0; + fillMeanPt(nChSim, nFT0M, pt, wght); + + if (std::abs(pid) == kPiPlus && mcPart.pt() >= cfgCutPiPtMin) { + fillMeanPt(nPiSim, nFT0M, pt, wght); + } + if (std::abs(pid) == kKPlus && mcPart.pt() >= cfgCutKaPtMin) { + fillMeanPt(nKaSim, nFT0M, pt, wght); + } + if (std::abs(pid) == kProton && mcPart.pt() >= cfgCutPrPtMin) { + fillMeanPt(nPrSim, nFT0M, pt, wght); } } } } hist.fill(HIST("Gen/h_Counts"), 2); - hist.fill(HIST("QA/after/h_VtxZReco"), col.posZ()); - hist.fill(HIST("Gen/h_VtxZ"), col.mcCollision().posZ()); + hist.fill(HIST("QA/after/h_VtxZReco"), vtxZ); + hist.fill(HIST("Gen/h_VtxZ"), vtxZSim); if (nSim > 0) hist.fill(HIST("Gen/h_NSim"), nSim); @@ -1169,12 +1211,8 @@ struct MeanPtFlucId { hist.fill(HIST("Gen/h_NTPC"), nTPC); hist.fill(HIST("Gen/h_NFT0C"), nFT0CSim); - hist.fill(HIST("Gen/h2_NTPC_NFT0C"), nFT0CSim, nTPC); hist.fill(HIST("Gen/h2_NTPC_NFT0M"), nFT0M, nTPC); - if (nFT0C != 0 && nFT0CSim != 0) - hist.fill(HIST("Gen/h2_NFT0C_NFT0CSim"), nFT0CSim, nFT0C); - double nChSim1 = static_cast(nChSim); double nPiSim1 = static_cast(nPiSim); double nKaSim1 = static_cast(nKaSim); @@ -1184,35 +1222,12 @@ struct MeanPtFlucId { fillAnalysisHistos(nTPC, nFT0M, nPiSim, nPiSim1, q1PiSim, q2PiSim, q3PiSim, q4PiSim); fillAnalysisHistos(nTPC, nFT0M, nKaSim, nKaSim1, q1KaSim, q2KaSim, q3KaSim, q4KaSim); fillAnalysisHistos(nTPC, nFT0M, nPrSim, nPrSim1, q1PrSim, q2PrSim, q3PrSim, q4PrSim); - - fillMeanPtCorr(ptValChSim, {}, nChSim, nFT0M, false); - fillMeanPtCorr(ptValPiSim, {}, nPiSim, nFT0M, false); - fillMeanPtCorr(ptValKaSim, {}, nKaSim, nFT0M, false); - fillMeanPtCorr(ptValPrSim, {}, nPrSim, nFT0M, false); - - ptValChSim.clear(); - ptValPiSim.clear(); - ptValKaSim.clear(); - ptValPrSim.clear(); } - fillMeanPtCorr(ptValCh, weightValCh, nCh, nFT0M, true); - fillMeanPtCorr(ptValPi, weightValPi, nPi, nFT0M, true); - fillMeanPtCorr(ptValKa, weightValKa, nKa, nFT0M, true); - fillMeanPtCorr(ptValPr, weightValPr, nPr, nFT0M, true); fillAnalysisHistos(nTPC, nFT0M, nCh, nChW, q1Ch, q2Ch, q3Ch, q4Ch); fillAnalysisHistos(nTPC, nFT0M, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi); fillAnalysisHistos(nTPC, nFT0M, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka); fillAnalysisHistos(nTPC, nFT0M, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr); - - ptValCh.clear(); - ptValPi.clear(); - ptValKa.clear(); - ptValPr.clear(); - weightValCh.clear(); - weightValPi.clear(); - weightValKa.clear(); - weightValPr.clear(); } void processRun3(MyRun3Collisions::iterator const& col, MyAllTracks const& tracks) From 366862d120b4df030965e44cc915fbba0bfe8a0c Mon Sep 17 00:00:00 2001 From: Mingrui Zhao Date: Wed, 19 Mar 2025 16:53:32 +0800 Subject: [PATCH 0754/1650] [PWGUD] Remove BCsWithTimestamps, and define the run number (#10559) --- PWGUD/Tasks/flowCumulantsUpc.cxx | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/PWGUD/Tasks/flowCumulantsUpc.cxx b/PWGUD/Tasks/flowCumulantsUpc.cxx index c80c5ad9397..723f9910cc9 100644 --- a/PWGUD/Tasks/flowCumulantsUpc.cxx +++ b/PWGUD/Tasks/flowCumulantsUpc.cxx @@ -706,9 +706,25 @@ struct FlowCumulantsUpc { } // void process(AodCollisions::iterator const& collision, aod::BCsWithTimestamps const&, AodTracks const& tracks) - void process(UDCollisionsFull::iterator const& collision, aod::BCsWithTimestamps const&, UdTracksFull const& tracks) + void process(UDCollisionsFull::iterator const& collision, UdTracksFull const& tracks) { + // Runnumber loading test + // accept only selected run numbers + // int run = collision.runNumber(); + + // extract bc pattern from CCDB for data or anchored MC only + // if (run != lastRun && run >= 500000) { + // LOGF(info, "Updating bcPattern %d ...", run); + // auto tss = ccdb->getRunDuration(run); + // auto grplhcif = ccdb->getForTimeStamp("GLO/Config/GRPLHCIF", tss.first); + // bcPatternB = grplhcif->getBunchFilling().getBCPattern(); + // lastRun = run; + // LOGF(info, "done!"); + // } + + // auto bcnum = collision.globalBC(); + registry.fill(HIST("hEventCount"), 0.5); int gapSide = collision.gapSide(); if (gapSide < 0 || gapSide > 2) { From 97728867f0653a1e4eacd84f1782ebf85ed6c9d3 Mon Sep 17 00:00:00 2001 From: nepeivodaRS <94179174+nepeivodaRS@users.noreply.github.com> Date: Wed, 19 Mar 2025 10:03:28 +0100 Subject: [PATCH 0755/1650] [PWGLF] update xi in pp and UPC analyses (#10561) --- PWGLF/DataModel/cascqaanalysis.h | 4 + .../Strangeness/cascqaanalysis.cxx | 140 +++++++++--------- .../Tasks/Strangeness/derivedupcanalysis.cxx | 85 ++++++++--- PWGLF/Utils/strangenessMasks.h | 4 + 4 files changed, 143 insertions(+), 90 deletions(-) diff --git a/PWGLF/DataModel/cascqaanalysis.h b/PWGLF/DataModel/cascqaanalysis.h index d9acf815a7e..efe98908517 100644 --- a/PWGLF/DataModel/cascqaanalysis.h +++ b/PWGLF/DataModel/cascqaanalysis.h @@ -100,6 +100,8 @@ DECLARE_SOA_COLUMN(IsPrimary, isPrimary, int); //! -1 unkn DECLARE_SOA_COLUMN(BachBaryonCosPA, bachBaryonCosPA, float); //! avoid bach-baryon correlated inv mass structure in analysis DECLARE_SOA_COLUMN(BachBaryonDCAxyToPV, bachBaryonDCAxyToPV, float); //! avoid bach-baryon correlated inv mass structure in analysis DECLARE_SOA_COLUMN(EventSelFilterBitMask, eventSelFilterBitMask, uint8_t); +DECLARE_SOA_COLUMN(GenPt, genPt, float); +DECLARE_SOA_COLUMN(GenY, genY, float); DECLARE_SOA_DYNAMIC_COLUMN(IsINEL, isINEL, //! True if the Event belongs to the INEL event class [](uint8_t flags) -> bool { return (flags & EvFlags::EvINEL) == EvFlags::EvINEL; }); @@ -158,6 +160,8 @@ DECLARE_SOA_TABLE(MyCascades, "AOD", "MYCASCADES", o2::soa::Index<>, mycascades::McPdgCode, mycascades::IsPrimary, mycascades::BachBaryonCosPA, mycascades::BachBaryonDCAxyToPV, mycascades::EventSelFilterBitMask, + mycascades::GenPt, + mycascades::GenY, mycascades::IsINEL, mycascades::IsINELgt0, mycascades::IsINELgt1); diff --git a/PWGLF/TableProducer/Strangeness/cascqaanalysis.cxx b/PWGLF/TableProducer/Strangeness/cascqaanalysis.cxx index 0e14c0f491f..a46f977c93a 100644 --- a/PWGLF/TableProducer/Strangeness/cascqaanalysis.cxx +++ b/PWGLF/TableProducer/Strangeness/cascqaanalysis.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // @@ -8,16 +8,14 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// -/// \brief QA task for Cascade analysis using derived data -/// -/// \author Chiara De Martin (chiara.de.martin@cern.ch) -/// \author Francesca Ercolessi (francesca.ercolessi@cern.ch) -/// \modified by Roman Nepeivoda (roman.nepeivoda@cern.ch) -/// \since June 1, 2023 +// +/// \file cascqaanalysis.cxx +/// \brief Analysis of cascades in pp collisions +/// \author Roman Nepeivoda (roman.nepeivoda@cern.ch) #include #include +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -42,7 +40,7 @@ using TrkPidInfo = soa::Join; using LabeledCascades = soa::Join; -struct cascqaanalysis { +struct Cascqaanalysis { // Tables to produce Produces mycascades; @@ -102,10 +100,10 @@ struct cascqaanalysis { { AxisSpec ptAxis = {200, 0.0f, 10.0f, "#it{p}_{T} (GeV/#it{c})"}; AxisSpec rapidityAxis = {200, -2.0f, 2.0f, "y"}; - ConfigurableAxis centFT0MAxis{"FT0M", + ConfigurableAxis centFT0MAxis{"centFT0MAxis", {VARIABLE_WIDTH, 0., 0.01, 0.05, 0.1, 0.5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 105.5}, "FT0M (%)"}; - ConfigurableAxis centFV0AAxis{"FV0A", + ConfigurableAxis centFV0AAxis{"centFV0AAxis", {VARIABLE_WIDTH, 0., 0.01, 0.05, 0.1, 0.5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 105.5}, "FV0A (%)"}; AxisSpec eventTypeAxis = {3, -0.5f, 2.5f, "Event Type"}; @@ -123,13 +121,13 @@ struct cascqaanalysis { registry.add("hNEvents", "hNEvents", {HistType::kTH1F, {{13, 0.f, 13.f}}}); - for (Int_t n = 1; n <= registry.get(HIST("hNEvents"))->GetNbinsX(); n++) { + for (int n = 1; n <= registry.get(HIST("hNEvents"))->GetNbinsX(); n++) { registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(n, hNEventsLabels[n - 1]); } registry.add("hZCollision", "hZCollision", {HistType::kTH1F, {{200, -20.f, 20.f}}}); registry.add("hCandidateCounter", "hCandidateCounter", {HistType::kTH1F, {{4, 0.0f, 4.0f}}}); - for (Int_t n = 1; n <= registry.get(HIST("hCandidateCounter"))->GetNbinsX(); n++) { + for (int n = 1; n <= registry.get(HIST("hCandidateCounter"))->GetNbinsX(); n++) { registry.get(HIST("hCandidateCounter"))->GetXaxis()->SetBinLabel(n, hCandidateCounterLabels[n - 1]); } if (isMC) { @@ -139,7 +137,7 @@ struct cascqaanalysis { registry.add("hNchFV0APVContr", "hNchFV0APVContr", {HistType::kTH3F, {nChargedFV0AGenAxis, multNTracksAxis, eventTypeAxis}}); // Gen. lvl registry.add("hNEventsMC", "hNEventsMC", {HistType::kTH1F, {{6, 0.0f, 6.0f}}}); - for (Int_t n = 1; n <= registry.get(HIST("hNEventsMC"))->GetNbinsX(); n++) { + for (int n = 1; n <= registry.get(HIST("hNEventsMC"))->GetNbinsX(); n++) { registry.get(HIST("hNEventsMC"))->GetXaxis()->SetBinLabel(n, hNEventsMCLabels[n - 1]); } registry.add("hZCollisionGen", "hZCollisionGen", {HistType::kTH1F, {{200, -20.f, 20.f}}}); @@ -182,7 +180,7 @@ struct cascqaanalysis { Partition globalTracksIUEta05 = (nabs(aod::track::eta) < 0.5f) && (requireGlobalTrackInFilter()); template - bool AcceptCascCandidate(TCascade const& cascCand, float const& pvx, float const& pvy, float const& pvz) + bool acceptCascCandidate(TCascade const& cascCand, float const& pvx, float const& pvy, float const& pvz) { // Access daughter tracks auto posdau = cascCand.template posTrack_as(); @@ -194,9 +192,9 @@ struct cascqaanalysis { cascCand.v0radius() > v0radius && cascCand.casccosPA(pvx, pvy, pvz) > casccospa && cascCand.v0cosPA(pvx, pvy, pvz) > v0cospa && - TMath::Abs(posdau.eta()) < etadau && - TMath::Abs(negdau.eta()) < etadau && - TMath::Abs(bachelor.eta()) < etadau) { + std::fabs(posdau.eta()) < etadau && + std::fabs(negdau.eta()) < etadau && + std::fabs(bachelor.eta()) < etadau) { return true; } else { return false; @@ -204,11 +202,11 @@ struct cascqaanalysis { } template - uint16_t GetGenNchInFT0Mregion(TMcParticles particles) + uint16_t getGenNchInFT0Mregion(TMcParticles particles) { // Particle counting in FITFT0: -3.3<η<-2.1; 3.5<η<4.9 uint16_t nchFT0 = 0; - for (auto& mcParticle : particles) { + for (const auto& mcParticle : particles) { if (!mcParticle.isPhysicalPrimary()) { continue; } @@ -228,11 +226,11 @@ struct cascqaanalysis { } template - uint16_t GetGenNchInFV0Aregion(TMcParticles particles) + uint16_t getGenNchInFV0Aregion(TMcParticles particles) { // Particle counting in FV0A: 2.2<η<5.1 uint16_t nchFV0A = 0; - for (auto& mcParticle : particles) { + for (const auto& mcParticle : particles) { if (!mcParticle.isPhysicalPrimary()) { continue; } @@ -252,7 +250,7 @@ struct cascqaanalysis { } template - int GetEventTypeFlag(TCollision const& collision) + int getEventTypeFlag(TCollision const& collision) { // 0 - INEL, 1 - INEL>0, 2 - INEL>1 int evFlag = 0; @@ -269,7 +267,7 @@ struct cascqaanalysis { } template - bool AcceptEvent(TCollision const& collision, bool isFillEventSelectionQA) + bool acceptEvent(TCollision const& collision, bool isFillEventSelectionQA) { if (isFillEventSelectionQA) { registry.fill(HIST("hNEvents"), 0.5); @@ -339,7 +337,7 @@ struct cascqaanalysis { } // Z vertex selection - if (TMath::Abs(collision.posZ()) > cutzvertex) { + if (std::fabs(collision.posZ()) > cutzvertex) { return false; } if (isFillEventSelectionQA) { @@ -357,11 +355,11 @@ struct cascqaanalysis { aod::V0Datas const&, DauTracks const&) { - if (!AcceptEvent(collision, 1)) { + if (!acceptEvent(collision, 1)) { return; } - int evType = GetEventTypeFlag(collision); + int evType = getEventTypeFlag(collision); auto tracksGroupedPVcontr = pvContribTracksIUEta1->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); int nTracksPVcontr = tracksGroupedPVcontr.size(); @@ -387,7 +385,7 @@ struct cascqaanalysis { for (const auto& casc : Cascades) { // loop over Cascades registry.fill(HIST("hCandidateCounter"), 0.5); // all candidates nCandAll++; - if (AcceptCascCandidate(casc, collision.posX(), collision.posY(), collision.posZ())) { + if (acceptCascCandidate(casc, collision.posX(), collision.posY(), collision.posZ())) { registry.fill(HIST("hCandidateCounter"), 1.5); // passed topo cuts nCandSel++; // Fill table @@ -422,8 +420,8 @@ struct cascqaanalysis { // c x tau float cascpos = std::hypot(casc.x() - collision.posX(), casc.y() - collision.posY(), casc.z() - collision.posZ()); float cascptotmom = std::hypot(casc.px(), casc.py(), casc.pz()); - float ctauXi = pdgDB->Mass(3312) * cascpos / (cascptotmom + 1e-13); - float ctauOmega = pdgDB->Mass(3334) * cascpos / (cascptotmom + 1e-13); + float ctauXi = o2::constants::physics::MassXiMinus * cascpos / (cascptotmom + 1e-13); + float ctauOmega = o2::constants::physics::MassOmegaMinus * cascpos / (cascptotmom + 1e-13); mycascades(collision.posZ(), collision.centFT0M(), collision.centFV0A(), @@ -438,7 +436,7 @@ struct cascqaanalysis { posdau.tpcNClsFound(), negdau.tpcNClsFound(), bachelor.tpcNClsFound(), posdau.tpcNClsCrossedRows(), negdau.tpcNClsCrossedRows(), bachelor.tpcNClsCrossedRows(), posdau.hasTOF(), negdau.hasTOF(), bachelor.hasTOF(), - posdau.pt(), negdau.pt(), bachelor.pt(), -1, -1, casc.bachBaryonCosPA(), casc.bachBaryonDCAxyToPV(), evFlag); + posdau.pt(), negdau.pt(), bachelor.pt(), -1, -1, casc.bachBaryonCosPA(), casc.bachBaryonDCAxyToPV(), evFlag, 1e3, 1e3); } } } @@ -460,7 +458,7 @@ struct cascqaanalysis { soa::Join const&, // aod::McCentFV0As to be added aod::McParticles const& mcParticles) { - if (!AcceptEvent(collision, 1)) { + if (!acceptEvent(collision, 1)) { return; } @@ -479,8 +477,8 @@ struct cascqaanalysis { // N charged in FT0M region in corresponding gen. MC collision auto mcPartSlice = mcParticles.sliceBy(perMcCollision, collision.mcCollision_as>().globalIndex()); // mcCollision.centFV0A() to be added - uint16_t nchFT0 = GetGenNchInFT0Mregion(mcPartSlice); - uint16_t nchFV0 = GetGenNchInFV0Aregion(mcPartSlice); + uint16_t nchFT0 = getGenNchInFT0Mregion(mcPartSlice); + uint16_t nchFV0 = getGenNchInFV0Aregion(mcPartSlice); int evType = 0; registry.fill(HIST("hNEvents"), 10.5); // INEL @@ -516,19 +514,23 @@ struct cascqaanalysis { for (const auto& casc : Cascades) { // loop over Cascades registry.fill(HIST("hCandidateCounter"), 0.5); // all candidates nCandAll++; - if (AcceptCascCandidate(casc, collision.posX(), collision.posY(), collision.posZ())) { + if (acceptCascCandidate(casc, collision.posX(), collision.posY(), collision.posZ())) { registry.fill(HIST("hCandidateCounter"), 1.5); // passed topo cuts nCandSel++; // Check mc association - float lPDG = -1; + float lPDG = 1e3; + float genPt = 1e3; + float genY = 1e3; float isPrimary = -1; if (casc.has_mcParticle()) { registry.fill(HIST("hCandidateCounter"), 2.5); // has associated MC particle auto cascmc = casc.mcParticle(); - if (TMath::Abs(cascmc.pdgCode()) == 3312 || TMath::Abs(cascmc.pdgCode()) == 3334) { + if (std::abs(cascmc.pdgCode()) == PDG_t::kXiMinus || std::abs(cascmc.pdgCode()) == PDG_t::kOmegaMinus) { registry.fill(HIST("hCandidateCounter"), 3.5); // associated with Xi or Omega lPDG = cascmc.pdgCode(); isPrimary = cascmc.isPhysicalPrimary() ? 1 : 0; + genPt = cascmc.pt(); + genY = cascmc.y(); } } if (fRand->Rndm() < lEventScale) { @@ -564,8 +566,8 @@ struct cascqaanalysis { // c x tau float cascpos = std::hypot(casc.x() - collision.posX(), casc.y() - collision.posY(), casc.z() - collision.posZ()); float cascptotmom = std::hypot(casc.px(), casc.py(), casc.pz()); - float ctauXi = pdgDB->Mass(3312) * cascpos / (cascptotmom + 1e-13); - float ctauOmega = pdgDB->Mass(3334) * cascpos / (cascptotmom + 1e-13); + float ctauXi = o2::constants::physics::MassXiMinus * cascpos / (cascptotmom + 1e-13); + float ctauOmega = o2::constants::physics::MassOmegaMinus * cascpos / (cascptotmom + 1e-13); mycascades(collision.posZ(), mcCollision.centFT0M(), 0, // mcCollision.centFV0A() to be added @@ -580,7 +582,7 @@ struct cascqaanalysis { posdau.tpcNClsFound(), negdau.tpcNClsFound(), bachelor.tpcNClsFound(), posdau.tpcNClsCrossedRows(), negdau.tpcNClsCrossedRows(), bachelor.tpcNClsCrossedRows(), posdau.hasTOF(), negdau.hasTOF(), bachelor.hasTOF(), - posdau.pt(), negdau.pt(), bachelor.pt(), lPDG, isPrimary, casc.bachBaryonCosPA(), casc.bachBaryonDCAxyToPV(), evFlag); + posdau.pt(), negdau.pt(), bachelor.pt(), lPDG, isPrimary, casc.bachBaryonCosPA(), casc.bachBaryonDCAxyToPV(), evFlag, genPt, genY); } } } @@ -600,7 +602,7 @@ struct cascqaanalysis { registry.fill(HIST("hNEventsMC"), 0.5); // Generated with accepted z vertex - if (TMath::Abs(mcCollision.posZ()) > cutzvertex) { + if (std::fabs(mcCollision.posZ()) > cutzvertex) { return; } registry.fill(HIST("hZCollisionGen"), mcCollision.posZ()); @@ -626,18 +628,18 @@ struct cascqaanalysis { registry.fill(HIST("hCentFT0M_genMC"), mcCollision.centFT0M(), evType); - uint16_t nchFT0 = GetGenNchInFT0Mregion(mcParticles); - uint16_t nchFV0 = GetGenNchInFV0Aregion(mcParticles); + uint16_t nchFT0 = getGenNchInFT0Mregion(mcParticles); + uint16_t nchFV0 = getGenNchInFV0Aregion(mcParticles); registry.fill(HIST("hNchFT0MGenEvType"), nchFT0, evType); registry.fill(HIST("hNchFV0AGenEvType"), nchFV0, evType); - std::vector SelectedEvents(collisions.size()); - std::vector NumberOfContributors; + std::vector selectedEvents(collisions.size()); + std::vector numberOfContributors; int nevts = 0; int nAssocColl = 0; for (const auto& collision : collisions) { CollisionIndexAndType collWithType = {0, 0x0}; - if (!AcceptEvent(collision, 0)) { + if (!acceptEvent(collision, 0)) { continue; } collWithType.index = collision.mcCollision_as>().globalIndex(); // mcCollision.centFV0A() to be added @@ -650,30 +652,30 @@ struct cascqaanalysis { collWithType.typeFlag |= o2::aod::myMCcascades::EvFlags::EvINELgt1; } - SelectedEvents[nevts++] = collWithType; + selectedEvents[nevts++] = collWithType; if (collision.mcCollision_as>().globalIndex() == mcCollision.globalIndex()) { // mcCollision.centFV0A() to be added nAssocColl++; - NumberOfContributors.push_back(collision.numContrib()); + numberOfContributors.push_back(collision.numContrib()); } } - SelectedEvents.resize(nevts); + selectedEvents.resize(nevts); registry.fill(HIST("hNchFT0MNAssocMCCollisions"), nchFT0, nAssocColl, evType); - if (NumberOfContributors.size() == 2) { - std::sort(NumberOfContributors.begin(), NumberOfContributors.end()); - registry.fill(HIST("hNContributorsCorrelation"), NumberOfContributors[0], NumberOfContributors[1]); + if (numberOfContributors.size() == 2) { + std::sort(numberOfContributors.begin(), numberOfContributors.end()); + registry.fill(HIST("hNContributorsCorrelation"), numberOfContributors[0], numberOfContributors[1]); } auto isAssocToINEL = [&mcCollision](CollisionIndexAndType i) { return (i.index == mcCollision.globalIndex()) && ((i.typeFlag & o2::aod::myMCcascades::EvFlags::EvINEL) == o2::aod::myMCcascades::EvFlags::EvINEL); }; auto isAssocToINELgt0 = [&mcCollision](CollisionIndexAndType i) { return (i.index == mcCollision.globalIndex()) && ((i.typeFlag & o2::aod::myMCcascades::EvFlags::EvINELgt0) == o2::aod::myMCcascades::EvFlags::EvINELgt0); }; auto isAssocToINELgt1 = [&mcCollision](CollisionIndexAndType i) { return (i.index == mcCollision.globalIndex()) && ((i.typeFlag & o2::aod::myMCcascades::EvFlags::EvINELgt1) == o2::aod::myMCcascades::EvFlags::EvINELgt1); }; // number of reconstructed INEL events that have the same global index as mcCollision - const auto evtReconstructedAndINEL = std::count_if(SelectedEvents.begin(), SelectedEvents.end(), isAssocToINEL); + const auto evtReconstructedAndINEL = std::count_if(selectedEvents.begin(), selectedEvents.end(), isAssocToINEL); // number of reconstructed INEL > 0 events that have the same global index as mcCollision - const auto evtReconstructedAndINELgt0 = std::count_if(SelectedEvents.begin(), SelectedEvents.end(), isAssocToINELgt0); + const auto evtReconstructedAndINELgt0 = std::count_if(selectedEvents.begin(), selectedEvents.end(), isAssocToINELgt0); // number of reconstructed INEL > 1 events that have the same global index as mcCollision - const auto evtReconstructedAndINELgt1 = std::count_if(SelectedEvents.begin(), SelectedEvents.end(), isAssocToINELgt1); + const auto evtReconstructedAndINELgt1 = std::count_if(selectedEvents.begin(), selectedEvents.end(), isAssocToINELgt1); switch (evType) { case 0: { @@ -707,9 +709,9 @@ struct cascqaanalysis { for (const auto& mcParticle : mcParticles) { float sign = 0; - if (mcParticle.pdgCode() == -3312 || mcParticle.pdgCode() == -3334) { + if (mcParticle.pdgCode() == PDG_t::kXiPlusBar || mcParticle.pdgCode() == PDG_t::kOmegaPlusBar) { sign = 1; - } else if (mcParticle.pdgCode() == 3312 || mcParticle.pdgCode() == 3334) { + } else if (mcParticle.pdgCode() == PDG_t::kXiMinus || mcParticle.pdgCode() == PDG_t::kOmegaMinus) { sign = -1; } else { continue; @@ -724,12 +726,12 @@ struct cascqaanalysis { } } - PROCESS_SWITCH(cascqaanalysis, processData, "Process Run 3 data", true); - PROCESS_SWITCH(cascqaanalysis, processMCrec, "Process Run 3 mc, reconstructed", false); - PROCESS_SWITCH(cascqaanalysis, processMCgen, "Process Run 3 mc, genereated", false); + PROCESS_SWITCH(Cascqaanalysis, processData, "Process Run 3 data", true); + PROCESS_SWITCH(Cascqaanalysis, processMCrec, "Process Run 3 mc, reconstructed", false); + PROCESS_SWITCH(Cascqaanalysis, processMCgen, "Process Run 3 mc, genereated", false); }; -struct myCascades { +struct MyCascades { HistogramRegistry registry{"registry"}; @@ -738,7 +740,7 @@ struct myCascades { void init(InitContext const&) { - TString PGDlabels[3] = {"Unknown", "3312", "3334"}; + TString pdglabels[3] = {"Unknown", "3312", "3334"}; registry.add("hPt", "hPt", {HistType::kTH1F, {{100, 0.0f, 10.0f}}}); registry.add("hMassXi", "hMassXi", {HistType::kTH1F, {{1000, 1.0f, 2.0f}}}); registry.add("hMassOmega", "hMassOmega", {HistType::kTH1F, {{1000, 1.0f, 2.0f}}}); @@ -769,8 +771,8 @@ struct myCascades { registry.add("hBachITSHits", "hBachITSHits", {HistType::kTH1F, {{8, -0.5f, 7.5f}}}); registry.add("hIsPrimary", "hIsPrimary", {HistType::kTH1F, {{3, -1.5f, 1.5f}}}); registry.add("hPDGcode", "hPDGcode", {HistType::kTH1F, {{3, -1.5f, 1.5f}}}); - for (Int_t n = 1; n <= registry.get(HIST("hPDGcode"))->GetNbinsX(); n++) { - registry.get(HIST("hPDGcode"))->GetXaxis()->SetBinLabel(n, PGDlabels[n - 1]); + for (int n = 1; n <= registry.get(HIST("hPDGcode"))->GetNbinsX(); n++) { + registry.get(HIST("hPDGcode"))->GetXaxis()->SetBinLabel(n, pdglabels[n - 1]); } registry.add("hBachBaryonCosPA", "hBachBaryonCosPA", {HistType::kTH1F, {{100, 0.0f, 1.0f}}}); registry.add("hBachBaryonDCAxyToPV", "hBachBaryonDCAxyToPV", {HistType::kTH1F, {{300, -3.0f, 3.0f}}}); @@ -779,7 +781,7 @@ struct myCascades { void process(aod::MyCascades const& mycascades) { - for (auto& candidate : mycascades) { + for (const auto& candidate : mycascades) { registry.fill(HIST("hMassXi"), candidate.massxi()); registry.fill(HIST("hMassOmega"), candidate.massomega()); @@ -813,8 +815,8 @@ struct myCascades { registry.fill(HIST("hBachBaryonCosPA"), candidate.bachBaryonCosPA()); registry.fill(HIST("hBachBaryonDCAxyToPV"), candidate.bachBaryonDCAxyToPV()); - if (TMath::Abs(candidate.mcPdgCode()) == 3312 || TMath::Abs(candidate.mcPdgCode()) == 3334) { - registry.fill(HIST("hPDGcode"), TMath::Abs(candidate.mcPdgCode()) == 3312 ? 0 : 1); // 0 if Xi, 1 if Omega + if (std::abs(candidate.mcPdgCode()) == PDG_t::kXiMinus || std::abs(candidate.mcPdgCode()) == PDG_t::kOmegaMinus) { + registry.fill(HIST("hPDGcode"), std::abs(candidate.mcPdgCode()) == PDG_t::kXiMinus ? 0 : 1); // 0 if Xi, 1 if Omega } else { registry.fill(HIST("hPDGcode"), -1); // -1 if unknown } @@ -826,6 +828,6 @@ struct myCascades { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"lf-cascqaanalysis"}), - adaptAnalysisTask(cfgc, TaskName{"lf-mycascades"})}; + adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc)}; } diff --git a/PWGLF/Tasks/Strangeness/derivedupcanalysis.cxx b/PWGLF/Tasks/Strangeness/derivedupcanalysis.cxx index 88d2a893fab..af47c618d7a 100644 --- a/PWGLF/Tasks/Strangeness/derivedupcanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/derivedupcanalysis.cxx @@ -195,6 +195,8 @@ struct Derivedupcanalysis { // for MC Configurable doMCAssociation{"doMCAssociation", true, "if MC, do MC association"}; Configurable doTreatPiToMuon{"doTreatPiToMuon", false, "Take pi decay into muon into account in MC"}; + Configurable calculateFeeddownMatrix{"calculateFeeddownMatrix", true, "fill feeddown matrix if MC"}; + ConfigurableAxis axisGeneratorIds{"axisGeneratorIds", {256, -0.5f, 255.5f}, "axis for generatorIds"}; // fast check on occupancy Configurable minOccupancy{"minOccupancy", -1, "minimum occupancy from neighbouring collisions"}; @@ -700,7 +702,7 @@ struct Derivedupcanalysis { LOG(fatal) << "Unable to analyze both v0s and cascades simultaneously. Please enable only one process at a time"; } - if ((doprocessV0sMC || doprocessGenerated) && (doprocessV0s || doprocessCascades)) { + if ((doprocessV0sMC || doprocessCascadesMC || doprocessGenerated) && (doprocessV0s || doprocessCascades)) { LOG(fatal) << "Cannot analyze both data and MC simultaneously. Please select one of them."; } @@ -835,6 +837,10 @@ struct Derivedupcanalysis { maskSelectionOmega = maskTopologicalCasc | maskKinematicCasc | maskTrackPropertiesCasc | maskOmegaSpecific | (std::bitset(1) << selPhysPrimOmega); maskSelectionAntiOmega = maskTopologicalCasc | maskKinematicCasc | maskTrackPropertiesCasc | maskAntiOmegaSpecific | (std::bitset(1) << selPhysPrimAntiOmega); + // No primary requirement for feeddown matrix + secondaryMaskSelectionLambda = maskTopologicalV0 | maskKinematicV0 | maskTrackPropertiesV0 | maskLambdaSpecific; + secondaryMaskSelectionAntiLambda = maskTopologicalV0 | maskKinematicV0 | maskTrackPropertiesV0 | maskAntiLambdaSpecific; + // Event Counter histos.add("eventQA/hEventSelection", "hEventSelection", kTH1F, {{16, -0.5f, +15.5f}}); histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(1, "All collisions"); @@ -873,12 +879,11 @@ struct Derivedupcanalysis { histos.add("eventQA/hZN", "hZN", kTH3F, {axisDetectors.axisZNAampl, axisDetectors.axisZNCampl, axisSelGap}); if (doprocessGenerated) { - // Event Counter - histos.add("eventQA/mc/hEventSelectionMC", "hEventSelectionMC", kTH1F, {{2, -0.5f, +1.5f}}); - histos.get(HIST("eventQA/mc/hEventSelectionMC"))->GetXaxis()->SetBinLabel(1, "All collisions"); - histos.get(HIST("eventQA/mc/hEventSelectionMC"))->GetXaxis()->SetBinLabel(2, "posZ cut"); + histos.add("eventQA/mc/hEventSelectionMC", "hEventSelectionMC", kTH3F, {{3, -0.5, 2.5}, axisNTracksPVeta1, axisGeneratorIds}); + histos.get(HIST("eventQA/mc/hEventSelectionMC"))->GetXaxis()->SetBinLabel(1, "All collisions"); + histos.get(HIST("eventQA/mc/hEventSelectionMC"))->GetXaxis()->SetBinLabel(2, "posZ cut"); + histos.get(HIST("eventQA/mc/hEventSelectionMC"))->GetXaxis()->SetBinLabel(3, "rec. at least once"); - histos.add("eventQA/mc/hMCNParticlesEta10", "hMCNParticlesEta10", kTH2F, {axisNTracksPVeta1, {2, -0.5, 1.5}}); histos.add("eventQA/mc/hTracksGlobalvsMCNParticlesEta10gen", "hTracksGlobalvsMCNParticlesEta10gen", kTH2F, {axisNTracksGlobal, axisNTracksPVeta1}); histos.add("eventQA/mc/hTracksGlobalVsNcoll_beforeEvSel", "hTracksGlobalVsNcoll_beforeEvSel", kTH2F, {axisNTracksGlobal, axisNAssocColl}); histos.add("eventQA/mc/hTracksGlobalVsNcoll_afterEvSel", "hTracksGlobalVsNcoll_afterEvSel", kTH2F, {axisNTracksGlobal, axisNAssocColl}); @@ -887,7 +892,7 @@ struct Derivedupcanalysis { histos.add("eventQA/mc/hGenEventCentrality", "hGenEventCentrality", kTH1F, {axisFT0Cqa}); } - if (doprocessV0sMC) { + if (doprocessV0sMC || doprocessCascadesMC) { // Event QA histos.add("eventQA/mc/hFakeEvents", "hFakeEvents", {kTH1F, {{1, -0.5f, 0.5f}}}); histos.add("eventQA/mc/hNTracksGlobalvsMCNParticlesEta10rec", "hNTracksGlobalvsMCNParticlesEta10rec", kTH2F, {axisNTracksGlobal, axisNTracksPVeta1}); @@ -896,9 +901,16 @@ struct Derivedupcanalysis { histos.add("eventQA/mc/hNTracksPVeta1vstotalMultMCParticles", "hNTracksPVeta1vstotalMultMCParticles", kTH2F, {axisNTracksPVeta1, axisNchInvMass}); } + if (doprocessV0sMC) { + if (analyseLambda && calculateFeeddownMatrix) + histos.add(Form("%s/h3dLambdaFeeddown", kParticlenames[1].data()), "h3dLambdaFeeddown", kTH3F, {axisNTracksGlobal, axisPt, axisPtXi}); + if (analyseAntiLambda && calculateFeeddownMatrix) + histos.add(Form("%s/h3dAntiLambdaFeeddown", kParticlenames[2].data()), "h3dAntiLambdaFeeddown", kTH3F, {axisNTracksGlobal, axisPt, axisPtXi}); + } + if (doprocessGenerated) { for (int partID = 0; partID <= 6; partID++) { - histos.add(Form("%s/mc/h6dGen", kParticlenames[partID].data()), "h6dGen", kTHnSparseF, {axisFT0Cqa, axisNchInvMass, axisNchInvMass, axisPt, axisSelGap, axisRap}); + histos.add(Form("%s/mc/h7dGen", kParticlenames[partID].data()), "h7dGen", kTHnSparseF, {axisFT0Cqa, axisNchInvMass, axisNchInvMass, axisPt, axisSelGap, axisRap, axisGeneratorIds}); } } @@ -933,7 +945,7 @@ struct Derivedupcanalysis { } } - if (doprocessCascades) { + if (doprocessCascades || doprocessCascadesMC) { // For all candidates if (doPlainTopoQA) { histos.add("generalQA/hPt", "hPt", kTH1F, {axisPtCoarse}); @@ -1047,7 +1059,7 @@ struct Derivedupcanalysis { if (studyUPConly && !collision.isUPC()) { return false; - } else if (collision.isUPC()) { + } else if (collision.isUPC() && fillQA) { histos.fill(HIST("eventQA/hEventSelection"), 14.0); // is UPC compatible } @@ -1685,13 +1697,12 @@ struct Derivedupcanalysis { continue; } - histos.fill(HIST("eventQA/mc/hEventSelectionMC"), 0.0); - histos.fill(HIST("eventQA/mc/hMCNParticlesEta10"), mcCollision.multMCNParticlesEta10(), 0 /* all gen. events*/); + histos.fill(HIST("eventQA/mc/hEventSelectionMC"), 0.0, mcCollision.multMCNParticlesEta10(), mcCollision.generatorsID()); if (std::abs(mcCollision.posZ()) > maxZVtxPosition) continue; - histos.fill(HIST("eventQA/mc/hEventSelectionMC"), 1.0); + histos.fill(HIST("eventQA/mc/hEventSelectionMC"), 1.0, mcCollision.multMCNParticlesEta10(), mcCollision.generatorsID()); // Group collisions by MC collision index auto groupedCollisions = collisions.sliceBy(perMcCollision, mcCollision.globalIndex()); @@ -1730,12 +1741,40 @@ struct Derivedupcanalysis { histos.fill(HIST("eventQA/mc/hEventPVzMC"), mcCollision.posZ()); if (atLeastOne) { - histos.fill(HIST("eventQA/mc/hMCNParticlesEta10"), mcCollision.multMCNParticlesEta10(), 1 /* at least 1 rec. event*/); + histos.fill(HIST("eventQA/mc/hEventSelectionMC"), 2.0, mcCollision.multMCNParticlesEta10(), mcCollision.generatorsID()); histos.fill(HIST("eventQA/mc/hGenEventCentrality"), centrality); } } } + template + void fillFeeddownMatrix(TCollision const& collision, TV0 const& v0, std::bitset const& selMap) + { + if (!v0.has_motherMCPart()) { + return; + } + + auto v0mother = v0.motherMCPart(); + const float rapidityXi = RecoDecay::y(std::array{v0mother.px(), v0mother.py(), v0mother.pz()}, o2::constants::physics::MassXiMinus); + if (std::fabs(rapidityXi) > 0.5f) { + return; + } + + const float mult = collision.multNTracksGlobal(); + const float v0pt = v0.pt(); + const float motherPt = std::hypot(v0mother.px(), v0mother.py()); + + if (analyseLambda && verifyMask(selMap, secondaryMaskSelectionLambda) && + v0mother.pdgCode() == PDG_t::kXiMinus && v0mother.isPhysicalPrimary()) { + histos.fill(HIST("h3dLambdaFeeddown"), mult, v0pt, motherPt); + } + + if (analyseAntiLambda && verifyMask(selMap, secondaryMaskSelectionAntiLambda) && + v0mother.pdgCode() == PDG_t::kXiPlusBar && v0mother.isPhysicalPrimary()) { + histos.fill(HIST("h3dAntiLambdaFeeddown"), mult, v0pt, motherPt); + } + } + void processV0s(StraCollisonFull const& collision, V0Candidates const& fullV0s, DauTracks const&) { if (!acceptEvent(collision, true)) { @@ -1810,6 +1849,9 @@ struct Derivedupcanalysis { if (v0.has_v0MCCore()) { const auto& v0MC = v0.v0MCCore_as(); computeV0MCAssociation(v0MC, selMap); + if (calculateFeeddownMatrix) { + fillFeeddownMatrix(collision, v0, selMap); + } } } else { // consider all species for the candidate @@ -1945,13 +1987,13 @@ struct Derivedupcanalysis { // Fill histograms if (v0MC.pdgCode() == PDG_t::kK0Short) { - histos.fill(HIST(kParticlenames[0]) + HIST("/mc/h6dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc); + histos.fill(HIST(kParticlenames[0]) + HIST("/mc/h7dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc, mcCollision.generatorsID()); } if (v0MC.pdgCode() == PDG_t::kLambda0) { - histos.fill(HIST(kParticlenames[1]) + HIST("/mc/h6dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc); + histos.fill(HIST(kParticlenames[1]) + HIST("/mc/h7dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc, mcCollision.generatorsID()); } if (v0MC.pdgCode() == PDG_t::kLambda0Bar) { - histos.fill(HIST(kParticlenames[2]) + HIST("/mc/h6dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc); + histos.fill(HIST(kParticlenames[2]) + HIST("/mc/h7dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc, mcCollision.generatorsID()); } } // V0 end @@ -1985,16 +2027,16 @@ struct Derivedupcanalysis { // Fill histograms if (cascMC.pdgCode() == PDG_t::kXiMinus) { - histos.fill(HIST(kParticlenames[3]) + HIST("/mc/h6dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc); + histos.fill(HIST(kParticlenames[3]) + HIST("/mc/h7dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc, mcCollision.generatorsID()); } if (cascMC.pdgCode() == PDG_t::kXiPlusBar) { - histos.fill(HIST(kParticlenames[4]) + HIST("/mc/h6dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc); + histos.fill(HIST(kParticlenames[4]) + HIST("/mc/h7dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc, mcCollision.generatorsID()); } if (cascMC.pdgCode() == PDG_t::kOmegaMinus) { - histos.fill(HIST(kParticlenames[5]) + HIST("/mc/h6dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc); + histos.fill(HIST(kParticlenames[5]) + HIST("/mc/h7dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc, mcCollision.generatorsID()); } if (cascMC.pdgCode() == PDG_t::kOmegaPlusBar) { - histos.fill(HIST(kParticlenames[6]) + HIST("/mc/h6dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc); + histos.fill(HIST(kParticlenames[6]) + HIST("/mc/h7dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc, mcCollision.generatorsID()); } } // Cascade end } @@ -2002,6 +2044,7 @@ struct Derivedupcanalysis { PROCESS_SWITCH(Derivedupcanalysis, processV0s, "Process V0s", true); PROCESS_SWITCH(Derivedupcanalysis, processV0sMC, "Process V0s MC", false); PROCESS_SWITCH(Derivedupcanalysis, processCascades, "Process Cascades", false); + PROCESS_SWITCH(Derivedupcanalysis, processCascadesMC, "Process Cascades MC", false); PROCESS_SWITCH(Derivedupcanalysis, processGenerated, "Process Generated Level", false); }; diff --git a/PWGLF/Utils/strangenessMasks.h b/PWGLF/Utils/strangenessMasks.h index 423fd7f5228..ef224c8e5fa 100644 --- a/PWGLF/Utils/strangenessMasks.h +++ b/PWGLF/Utils/strangenessMasks.h @@ -144,6 +144,10 @@ std::bitset maskAntiOmegaSpecific; std::bitset maskSelectionK0Short; std::bitset maskSelectionLambda; std::bitset maskSelectionAntiLambda; + +std::bitset secondaryMaskSelectionLambda; +std::bitset secondaryMaskSelectionAntiLambda; + std::bitset maskSelectionXi; std::bitset maskSelectionAntiXi; std::bitset maskSelectionOmega; From c6c4a86695d8c7947e6f9a25593d23f211a7190f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Wed, 19 Mar 2025 10:13:01 +0100 Subject: [PATCH 0756/1650] [PWGLF] Restore histos in spectraTOF.cxx (#10503) --- PWGLF/Tasks/Nuspex/spectraTOF.cxx | 173 ++++++++++++++++++++++-------- 1 file changed, 129 insertions(+), 44 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/spectraTOF.cxx b/PWGLF/Tasks/Nuspex/spectraTOF.cxx index ef8209d99f7..aef1eb50832 100644 --- a/PWGLF/Tasks/Nuspex/spectraTOF.cxx +++ b/PWGLF/Tasks/Nuspex/spectraTOF.cxx @@ -69,7 +69,9 @@ std::array, NpCharge> hDecayLengthMCCharm; // Decay Length std::array, NpCharge> hDecayLengthMCBeauty; // Decay Length in the MC for particles from charm std::array, NpCharge> hDecayLengthMCNotHF; // Decay Length in the MC for particles from not a HF -// Spectra tas +std::array, NpCharge> hPtNumTOFMatchWithPIDSignalPrm; // Pt distribution of particles with a hit in the TOF and a compatible signal + +// Spectra task struct tofSpectra { struct : ConfigurableGroup { Configurable cfgCutVertex{"cfgCutVertex", 10.0f, "Accepted z-vertex range"}; @@ -218,9 +220,9 @@ struct tofSpectra { LOG(info) << "\tminChi2PerClusterTPC=" << minChi2PerClusterTPC.value; LOG(info) << "\tminNCrossedRowsTPC=" << minNCrossedRowsTPC.value; LOG(info) << "\tmin_ITS_nClusters=" << min_ITS_nClusters.value; + LOG(info) << "\tminTPCNClsFound=" << minTPCNClsFound.value; LOG(info) << "\tmaxChi2PerClusterITS=" << maxChi2PerClusterITS.value; LOG(info) << "\tmaxDcaZ=" << maxDcaZ.value; - LOG(info) << "\tmaxDcaZ=" << maxDcaZ.value; LOG(info) << "\tmakeTHnSparseChoice=" << makeTHnSparseChoice.value; customTrackCuts = getGlobalTrackSelectionRun3ITSMatch(itsPattern.value); @@ -440,20 +442,22 @@ struct tofSpectra { histos.add("Data/cent/neg/pt/its_tof", "neg ITS-TOF", kTH3D, {ptAxis, multAxis, occupancyAxis}); } const AxisSpec nsigmaTPCAxisOccupancy{binsOptions.binsnsigmaTPC, "nsigmaTPC"}; - histos.add("nsigmatpc/mc_closure/pos/pi", "mc_closure dependent pion", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); - histos.add("nsigmatpc/mc_closure/neg/pi", "mc_closure dependent pion", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); - histos.add("nsigmatof/mc_closure/pos/pi", "mc_closure dependent pion", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); - histos.add("nsigmatof/mc_closure/neg/pi", "mc_closure dependent pion", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); + if (doprocessMCclosure) { + histos.add("nsigmatpc/mc_closure/pos/pi", "mc_closure dependent pion", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); + histos.add("nsigmatpc/mc_closure/neg/pi", "mc_closure dependent pion", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); + histos.add("nsigmatof/mc_closure/pos/pi", "mc_closure dependent pion", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); + histos.add("nsigmatof/mc_closure/neg/pi", "mc_closure dependent pion", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); - histos.add("nsigmatpc/mc_closure/pos/ka", "mc_closure dependent kaon", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); - histos.add("nsigmatpc/mc_closure/neg/ka", "mc_closure dependent kaon", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); - histos.add("nsigmatof/mc_closure/pos/ka", "mc_closure dependent kaon", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); - histos.add("nsigmatof/mc_closure/neg/ka", "mc_closure dependent kaon", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); + histos.add("nsigmatpc/mc_closure/pos/ka", "mc_closure dependent kaon", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); + histos.add("nsigmatpc/mc_closure/neg/ka", "mc_closure dependent kaon", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); + histos.add("nsigmatof/mc_closure/pos/ka", "mc_closure dependent kaon", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); + histos.add("nsigmatof/mc_closure/neg/ka", "mc_closure dependent kaon", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); - histos.add("nsigmatpc/mc_closure/pos/pr", "mc_closure dependent proton", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); - histos.add("nsigmatpc/mc_closure/neg/pr", "mc_closure dependent proton", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); - histos.add("nsigmatof/mc_closure/pos/pr", "mc_closure dependent proton", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); - histos.add("nsigmatof/mc_closure/neg/pr", "mc_closure dependent proton", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); + histos.add("nsigmatpc/mc_closure/pos/pr", "mc_closure dependent proton", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); + histos.add("nsigmatpc/mc_closure/neg/pr", "mc_closure dependent proton", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); + histos.add("nsigmatof/mc_closure/pos/pr", "mc_closure dependent proton", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); + histos.add("nsigmatof/mc_closure/neg/pr", "mc_closure dependent proton", kTHnSparseD, {ptAxis, nsigmaTPCAxisOccupancy, multAxis}); + } if (doprocessOccupancy) { histos.add("nsigmatpc/test_occupancy/Mult_vs_Occupancy", "occuppancy vs Multiplicity", kTHnSparseD, {multAxis, occupancyAxis}); @@ -502,6 +506,12 @@ struct tofSpectra { histos.add("MC/withPID/ka/neg/prm/pt/numtof", "recons. MC K^{-}", kTHnSparseD, {ptAxis, impParamAxis}); histos.add("MC/withPID/pr/pos/prm/pt/numtof", "recons. MC p", kTHnSparseD, {ptAxis, impParamAxis}); histos.add("MC/withPID/pr/neg/prm/pt/numtof", "recons. MC #bar{p}", kTHnSparseD, {ptAxis, impParamAxis}); + histos.add("MC/withPID/pi/pos/prm/pt/numtof_matched", "recons. MC #pi^{+}", kTHnSparseD, {ptAxis, impParamAxis}); + histos.add("MC/withPID/pi/neg/prm/pt/numtof_matched", "recons. MC #pi^{-}", kTHnSparseD, {ptAxis, impParamAxis}); + histos.add("MC/withPID/ka/pos/prm/pt/numtof_matched", "recons. MC K^{+}", kTHnSparseD, {ptAxis, impParamAxis}); + histos.add("MC/withPID/ka/neg/prm/pt/numtof_matched", "recons. MC K^{-}", kTHnSparseD, {ptAxis, impParamAxis}); + histos.add("MC/withPID/pr/pos/prm/pt/numtof_matched", "recons. MC p", kTHnSparseD, {ptAxis, impParamAxis}); + histos.add("MC/withPID/pr/neg/prm/pt/numtof_matched", "recons. MC #bar{p}", kTHnSparseD, {ptAxis, impParamAxis}); } else { histos.add("MC/withPID/pi/pos/prm/pt/num", "recons. MC #pi^{+}", kTHnSparseD, {ptAxis, multAxis}); histos.add("MC/withPID/pi/neg/prm/pt/num", "recons. MC #pi^{-}", kTHnSparseD, {ptAxis, multAxis}); @@ -527,6 +537,12 @@ struct tofSpectra { histos.add("MC/withPID/ka/neg/prm/pt/numtof", "recons. MC K^{-}", kTHnSparseD, {ptAxis, multAxis}); histos.add("MC/withPID/pr/pos/prm/pt/numtof", "recons. MC p", kTHnSparseD, {ptAxis, multAxis}); histos.add("MC/withPID/pr/neg/prm/pt/numtof", "recons. MC #bar{p}", kTHnSparseD, {ptAxis, multAxis}); + histos.add("MC/withPID/pi/pos/prm/pt/numtof_matched", "recons. MC #pi^{+}", kTHnSparseD, {ptAxis, multAxis}); + histos.add("MC/withPID/pi/neg/prm/pt/numtof_matched", "recons. MC #pi^{-}", kTHnSparseD, {ptAxis, multAxis}); + histos.add("MC/withPID/ka/pos/prm/pt/numtof_matched", "recons. MC K^{+}", kTHnSparseD, {ptAxis, multAxis}); + histos.add("MC/withPID/ka/neg/prm/pt/numtof_matched", "recons. MC K^{-}", kTHnSparseD, {ptAxis, multAxis}); + histos.add("MC/withPID/pr/pos/prm/pt/numtof_matched", "recons. MC p", kTHnSparseD, {ptAxis, multAxis}); + histos.add("MC/withPID/pr/neg/prm/pt/numtof_matched", "recons. MC #bar{p}", kTHnSparseD, {ptAxis, multAxis}); } if (doprocessMCgen) { histos.add("MC/test/pi/pos/prm/pt/den", "generated MC #pi^{+}", kTHnSparseD, {ptAxis, impParamAxis}); @@ -679,6 +695,7 @@ struct tofSpectra { } if (doprocessMC) { + const std::string cpName = Form("/%s/%s", (i < Np) ? "pos" : "neg", pN[i % Np]); if (includeCentralityMC) { //*************************************RD********************************************** @@ -720,6 +737,7 @@ struct tofSpectra { histos.add(hpt_numtof_mat[i].data(), pTCharge[i], kTH2D, {ptAxis, multAxis}); histos.add(hpt_numtofgoodmatch_prm[i].data(), pTCharge[i], kTH2D, {ptAxis, multAxis}); + hPtNumTOFMatchWithPIDSignalPrm[i] = histos.add("MC" + cpName + "/prm/pt/numtofwithpid", pTCharge[i], kTH2D, {ptAxis, multAxis}); histos.add(hpt_den_prm[i].data(), pTCharge[i], kTH2D, {ptAxis, multAxis}); histos.add(hpt_den_str[i].data(), pTCharge[i], kTH2D, {ptAxis, multAxis}); @@ -731,7 +749,6 @@ struct tofSpectra { } histos.add(hpt_den_prm_mcgoodev[i].data(), pTCharge[i], kTH2D, {ptAxis, multAxis}); histos.add(hpt_den_prm_mcbadev[i].data(), pTCharge[i], kTH2D, {ptAxis, multAxis}); - const std::string cpName = Form("/%s/%s", (i < Np) ? "pos" : "neg", pN[i % Np]); if (enableDCAxyzHistograms) { hDcaXYZPrm[i] = histos.add("dcaprm" + cpName, pTCharge[i], kTH3D, {ptAxis, dcaXyAxis, dcaZAxis}); hDcaXYZStr[i] = histos.add("dcastr" + cpName, pTCharge[i], kTH3D, {ptAxis, dcaXyAxis, dcaZAxis}); @@ -1550,6 +1567,7 @@ struct tofSpectra { } } PROCESS_SWITCH(tofSpectra, processMCclosure, "MC closure test", true); + void processOccupancy(CollisionCandidates::iterator const& collision, soa::Join(track); - ; const auto& nsigmaTPCKa = o2::aod::pidutils::tpcNSigma<3>(track); const auto& nsigmaTPCPr = o2::aod::pidutils::tpcNSigma<4>(track); - bool isTPCPion = std::abs(nsigmaTPCPi) < trkselOptions.cfgCutNsigma; - bool isTPCKaon = std::abs(nsigmaTPCKa) < trkselOptions.cfgCutNsigma; - bool isTPCProton = std::abs(nsigmaTPCPr) < trkselOptions.cfgCutNsigma; + const bool isTPCPion = std::abs(nsigmaTPCPi) < trkselOptions.cfgCutNsigma; + const bool isTPCKaon = std::abs(nsigmaTPCKa) < trkselOptions.cfgCutNsigma; + const bool isTPCProton = std::abs(nsigmaTPCPr) < trkselOptions.cfgCutNsigma; const auto& nsigmaTOFPi = o2::aod::pidutils::tofNSigma<2>(track); const auto& nsigmaTOFKa = o2::aod::pidutils::tofNSigma<3>(track); const auto& nsigmaTOFPr = o2::aod::pidutils::tofNSigma<4>(track); - bool isTOFPion = track.hasTOF() && std::abs(nsigmaTOFPi) < trkselOptions.cfgCutNsigma; - bool isTOFKaon = track.hasTOF() && std::abs(nsigmaTOFKa) < trkselOptions.cfgCutNsigma; - bool isTOFProton = track.hasTOF() && std::abs(nsigmaTOFPr) < trkselOptions.cfgCutNsigma; + const bool isTOFPion = track.hasTOF() && std::abs(nsigmaTOFPi) < trkselOptions.cfgCutNsigma; + const bool isTOFKaon = track.hasTOF() && std::abs(nsigmaTOFKa) < trkselOptions.cfgCutNsigma; + const bool isTOFProton = track.hasTOF() && std::abs(nsigmaTOFPr) < trkselOptions.cfgCutNsigma; // Apply rapidity cut for identified particles if (isTPCPion && std::abs(track.rapidity(PID::getMass(2))) < trkselOptions.cfgCutY) { @@ -1873,7 +1890,7 @@ struct tofSpectra { const auto& mcCollision = collision.mcCollision_as(); const float multiplicity = getMultiplicityMC(mcCollision); - int occupancy = collision.trackOccupancyInTimeRange(); + const int occupancy = collision.trackOccupancyInTimeRange(); //************************************RD************************************************** const float impParam = mcCollision.impactParameter(); //************************************RD************************************************** @@ -1881,6 +1898,7 @@ struct tofSpectra { if (mcParticle.pdgCode() != PDGs[i]) { return; } + if (track.eta() < trkselOptions.cfgCutEtaMin || track.eta() > trkselOptions.cfgCutEtaMax) { return; } @@ -1890,12 +1908,10 @@ struct tofSpectra { } const auto& nsigmaTPCKa = o2::aod::pidutils::tpcNSigma<3>(track); - - bool isKaonTPC = std::abs(nsigmaTPCKa) < trkselOptions.cfgCutNsigma; + const bool isKaonTPC = std::abs(nsigmaTPCKa) < trkselOptions.cfgCutNsigma; const auto& nsigmaTOFKa = o2::aod::pidutils::tofNSigma<3>(track); - - bool isKaonTOF = std::abs(nsigmaTOFKa) < trkselOptions.cfgCutNsigma; + const bool isKaonTOF = std::abs(nsigmaTOFKa) < trkselOptions.cfgCutNsigma; // Filling DCA info with the TPC+TOF PID bool isDCAPureSample = (std::sqrt(nsigmaTOFKa * nsigmaTOFKa + nsigmaTPCKa * nsigmaTPCKa) < 2.f); @@ -1910,7 +1926,7 @@ struct tofSpectra { } if (!mcParticle.isPhysicalPrimary()) { // Secondaries (weak decays and material) - if (mcParticle.getProcess() == 4) { + if (mcParticle.getProcess() == 4) { // Particles from decay if (enableDCAxyzHistograms) { hDcaXYZStr[i]->Fill(track.pt(), track.dcaXY(), track.dcaZ()); } else { @@ -1927,7 +1943,7 @@ struct tofSpectra { hDecayLengthStr[i]->Fill(track.pt(), decayLength); } } - } else { + } else { // Particles from the material if (enableDCAxyzHistograms) { hDcaXYZMat[i]->Fill(track.pt(), track.dcaXY(), track.dcaZ()); } else { @@ -2031,21 +2047,21 @@ struct tofSpectra { if (!passesDCAxyCut(track)) { // Skipping tracks that don't pass the standard cuts return; } - int pdgCode = mcParticle.pdgCode(); + const int pdgCode = mcParticle.pdgCode(); const auto& nsigmaTPCPi = o2::aod::pidutils::tpcNSigma<2>(track); const auto& nsigmaTPCPr = o2::aod::pidutils::tpcNSigma<4>(track); - bool isPionTPC = std::abs(nsigmaTPCPi) < trkselOptions.cfgCutNsigma; - bool isProtonTPC = std::abs(nsigmaTPCPr) < trkselOptions.cfgCutNsigma; + const bool isPionTPC = std::abs(nsigmaTPCPi) < trkselOptions.cfgCutNsigma; + const bool isProtonTPC = std::abs(nsigmaTPCPr) < trkselOptions.cfgCutNsigma; const auto& nsigmaTOFPi = o2::aod::pidutils::tofNSigma<2>(track); const auto& nsigmaTOFPr = o2::aod::pidutils::tofNSigma<4>(track); - bool isPionTOF = std::abs(nsigmaTOFPi) < trkselOptions.cfgCutNsigma; - bool isProtonTOF = std::abs(nsigmaTOFPr) < trkselOptions.cfgCutNsigma; + const bool isPionTOF = std::abs(nsigmaTOFPi) < trkselOptions.cfgCutNsigma; + const bool isProtonTOF = std::abs(nsigmaTOFPr) < trkselOptions.cfgCutNsigma; - if (!mcParticle.isPhysicalPrimary()) { - if (mcParticle.getProcess() == 4) { + if (!mcParticle.isPhysicalPrimary()) { // Is not physical primary + if (mcParticle.getProcess() == 4) { // Is from decay if (includeCentralityMC) { if (includeCentralityMC) { histos.fill(HIST(hpt_num_str[i]), track.pt(), multiplicity, track.dcaXY()); @@ -2073,7 +2089,7 @@ struct tofSpectra { } } } - } else { + } else { // Is physical primary if (includeCentralityMC) { if (isImpactParam) { histos.fill(HIST(hpt_num_prm[i]), track.pt(), impParam, track.dcaXY(), occupancy); @@ -2220,42 +2236,90 @@ struct tofSpectra { } if (track.hasTOF()) { if (isPionTOF || isKaonTOF || isProtonTOF) { + // Proton (positive) if (pdgCode == 2212) { if (isImpactParam) { histos.fill(HIST("MC/withPID/pr/pos/prm/pt/numtof"), track.pt(), impParam); } else { histos.fill(HIST("MC/withPID/pr/pos/prm/pt/numtof"), track.pt(), multiplicity); } + // Matched proton condition + if (!(track.mcMask() & (1 << 11))) { + if (isImpactParam) { + histos.fill(HIST("MC/withPID/pr/pos/prm/pt/numtof_matched"), track.pt(), impParam); + } else { + histos.fill(HIST("MC/withPID/pr/pos/prm/pt/numtof_matched"), track.pt(), multiplicity); + } + } } else if (pdgCode == -2212) { if (isImpactParam) { histos.fill(HIST("MC/withPID/pr/neg/prm/pt/numtof"), track.pt(), impParam); } else { histos.fill(HIST("MC/withPID/pr/neg/prm/pt/numtof"), track.pt(), multiplicity); } + if (!(track.mcMask() & (1 << 11))) { + if (isImpactParam) { + histos.fill(HIST("MC/withPID/pr/neg/prm/pt/numtof_matched"), track.pt(), impParam); + } else { + histos.fill(HIST("MC/withPID/pr/neg/prm/pt/numtof_matched"), track.pt(), multiplicity); + } + } } else if (pdgCode == 211) { if (isImpactParam) { histos.fill(HIST("MC/withPID/pi/pos/prm/pt/numtof"), track.pt(), impParam); } else { histos.fill(HIST("MC/withPID/pi/pos/prm/pt/numtof"), track.pt(), multiplicity); } + // Matched pion condition + if (!(track.mcMask() & (1 << 11))) { + if (isImpactParam) { + histos.fill(HIST("MC/withPID/pi/pos/prm/pt/numtof_matched"), track.pt(), impParam); + } else { + histos.fill(HIST("MC/withPID/pi/pos/prm/pt/numtof_matched"), track.pt(), multiplicity); + } + } } else if (pdgCode == -211) { if (isImpactParam) { histos.fill(HIST("MC/withPID/pi/neg/prm/pt/numtof"), track.pt(), impParam); } else { histos.fill(HIST("MC/withPID/pi/neg/prm/pt/numtof"), track.pt(), multiplicity); } + // Matched pion condition + if (!(track.mcMask() & (1 << 11))) { + if (isImpactParam) { + histos.fill(HIST("MC/withPID/pi/neg/prm/pt/numtof_matched"), track.pt(), impParam); + } else { + histos.fill(HIST("MC/withPID/pi/neg/prm/pt/numtof_matched"), track.pt(), multiplicity); + } + } } else if (pdgCode == 321) { if (isImpactParam) { histos.fill(HIST("MC/withPID/ka/pos/prm/pt/numtof"), track.pt(), impParam); } else { histos.fill(HIST("MC/withPID/ka/pos/prm/pt/numtof"), track.pt(), multiplicity); } + // Matched kaon condition + if (!(track.mcMask() & (1 << 11))) { + if (isImpactParam) { + histos.fill(HIST("MC/withPID/ka/pos/prm/pt/numtof_matched"), track.pt(), impParam); + } else { + histos.fill(HIST("MC/withPID/ka/pos/prm/pt/numtof_matched"), track.pt(), multiplicity); + } + } } else if (pdgCode == -321) { if (isImpactParam) { histos.fill(HIST("MC/withPID/ka/neg/prm/pt/numtof"), track.pt(), impParam); } else { histos.fill(HIST("MC/withPID/ka/neg/prm/pt/numtof"), track.pt(), multiplicity); } + // Matched kaon condition + if (!(track.mcMask() & (1 << 11))) { + if (isImpactParam) { + histos.fill(HIST("MC/withPID/ka/neg/prm/pt/numtof_matched"), track.pt(), impParam); + } else { + histos.fill(HIST("MC/withPID/ka/neg/prm/pt/numtof_matched"), track.pt(), multiplicity); + } + } } } if (includeCentralityMC) { @@ -2274,6 +2338,28 @@ struct tofSpectra { histos.fill(HIST(hpt_numtofgoodmatch_prm[i]), track.pt(), multiplicity); } } + // Check if the signal is compatible with the PID hypothesis + float nsigma = 0.f; + switch (i) { + case 2: + case Np + 2: + nsigma = track.tofNSigmaPi(); + break; + case 3: + case Np + 3: + nsigma = track.tofNSigmaKa(); + break; + case 4: + case Np + 4: + nsigma = track.tofNSigmaPr(); + break; + default: + break; + } + if (std::abs(nsigma) <= trkselOptions.cfgCutNsigma) { + if (hPtNumTOFMatchWithPIDSignalPrm[i]) + hPtNumTOFMatchWithPIDSignalPrm[i]->Fill(track.pt(), multiplicity); + } } // Filling mismatched info for primary tracks @@ -2629,21 +2715,20 @@ struct tofSpectra { } const auto& nsigmaTPCPi = o2::aod::pidutils::tpcNSigma<2>(track); - ; const auto& nsigmaTPCKa = o2::aod::pidutils::tpcNSigma<3>(track); const auto& nsigmaTPCPr = o2::aod::pidutils::tpcNSigma<4>(track); - bool isPionTPC = std::abs(nsigmaTPCPi) < trkselOptions.cfgCutNsigma; - bool isKaonTPC = std::abs(nsigmaTPCKa) < trkselOptions.cfgCutNsigma; - bool isProtonTPC = std::abs(nsigmaTPCPr) < trkselOptions.cfgCutNsigma; + const bool isPionTPC = std::abs(nsigmaTPCPi) < trkselOptions.cfgCutNsigma; + const bool isKaonTPC = std::abs(nsigmaTPCKa) < trkselOptions.cfgCutNsigma; + const bool isProtonTPC = std::abs(nsigmaTPCPr) < trkselOptions.cfgCutNsigma; const auto& nsigmaTOFPi = o2::aod::pidutils::tofNSigma<2>(track); const auto& nsigmaTOFKa = o2::aod::pidutils::tofNSigma<3>(track); const auto& nsigmaTOFPr = o2::aod::pidutils::tofNSigma<4>(track); - bool isPionTOF = track.hasTOF() && std::abs(nsigmaTOFPi) < trkselOptions.cfgCutNsigma; - bool isKaonTOF = track.hasTOF() && std::abs(nsigmaTOFKa) < trkselOptions.cfgCutNsigma; - bool isProtonTOF = track.hasTOF() && std::abs(nsigmaTOFPr) < trkselOptions.cfgCutNsigma; + const bool isPionTOF = track.hasTOF() && std::abs(nsigmaTOFPi) < trkselOptions.cfgCutNsigma; + const bool isKaonTOF = track.hasTOF() && std::abs(nsigmaTOFKa) < trkselOptions.cfgCutNsigma; + const bool isProtonTOF = track.hasTOF() && std::abs(nsigmaTOFPr) < trkselOptions.cfgCutNsigma; if (isPionTPC || isKaonTPC || isProtonTPC) { if (pdgCode == 2212) { From 16d8cb98005b3f293e986c3fd7f1e701321ec387 Mon Sep 17 00:00:00 2001 From: basiach <74355517+basiach@users.noreply.github.com> Date: Wed, 19 Mar 2025 10:56:47 +0100 Subject: [PATCH 0757/1650] [PWGCF] FemtoUniverse - Adding an inv Mass vs pT histogram to cascade task (#10541) Co-authored-by: Barbara Chytla --- .../Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx index 6d4bb3dbfad..ac6959b3837 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx @@ -237,6 +237,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/st rXiQA.add("hDcaNegtoPV", "hDcaNegtoPV", {HistType::kTH1F, {aDCAToPVAxis}}); rXiQA.add("hDcaBachtoPV", "hDcaBachtoPV", {HistType::kTH1F, {aDCAToPVAxis}}); rXiQA.add("hDcaV0toPV", "hDcaV0toPV", {HistType::kTH1F, {aDCAToPVAxis}}); + rXiQA.add("hInvMpT", "hInvMpT", kTH2F, {{ptAxis}, {aXiMassAxis}}); eventHisto.init(&qaRegistry); qaRegistry.add("Tracks_pos/nSigmaTPC", "; #it{p} (GeV/#it{c}); n#sigma_{TPC}", kTH2F, {{100, 0, 10}, {200, -4.975, 5.025}}); @@ -339,6 +340,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/st rXiQA.fill(HIST("hDcaNegtoPV"), casc.dcanegtopv()); rXiQA.fill(HIST("hDcaBachtoPV"), casc.dcabachtopv()); rXiQA.fill(HIST("hDcaV0toPV"), casc.dcav0topv()); + rXiQA.fill(HIST("hInvMpT"), casc.pt(), casc.mLambda()); posChildHistos.fillQA(posChild); negChildHistos.fillQA(negChild); From 05d6bc32c5165a63f23e7fef27ae27a9c690a3f8 Mon Sep 17 00:00:00 2001 From: Debadatta3337 Date: Wed, 19 Mar 2025 16:27:25 +0530 Subject: [PATCH 0758/1650] [PWGDQ] Remove unnecessary histograms from HistogramLibrery (#10571) Co-authored-by: Debadatta3337 --- PWGDQ/Core/HistogramsLibrary.cxx | 6 ------ 1 file changed, 6 deletions(-) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 42028192825..1b180349c7a 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -943,12 +943,6 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h if (subGroupStr.Contains("mult")) { hm->AddHistogram(histClass, "Mass_Pt_MultFV0A", "", false, 200, 0.0, 5.0, VarManager::kMass, 40, 0.0, 40.0, VarManager::kPt, 100, 0.0, 25000.0, VarManager::kMultFV0A); hm->AddHistogram(histClass, "Mass_VtxNcontribReal", "Mass vs VtxNcontribReal", false, 200, 0.0, 5.0, VarManager::kMass, 200, 0, 200.0, VarManager::kVtxNcontribReal); - hm->AddHistogram(histClass, "MultITSWithPV", "MultITSWithPV", false, 200, 0, 200.0, VarManager::kMultNTracksHasITS); - hm->AddHistogram(histClass, "MultTPCWithPV", "MultTPCWithPV", false, 200, 0, 200.0, VarManager::kMultNTracksHasTPC); - hm->AddHistogram(histClass, "MultITSTPCWithPV", "MultITSTPCWithPV", false, 200, 0, 200.0, VarManager::kMultNTracksITSTPC); - hm->AddHistogram(histClass, "Mass_MultITSWithPV", "Mass vs MultITSWithPV", false, 200, 0.0, 5.0, VarManager::kMass, 200, 0, 200.0, VarManager::kMultNTracksHasITS); - hm->AddHistogram(histClass, "Mass_MultTPCWithPV", "Mass vs MultTPCWithPV", false, 200, 0.0, 5.0, VarManager::kMass, 200, 0, 200.0, VarManager::kMultNTracksHasTPC); - hm->AddHistogram(histClass, "Mass_MultITSTPCWithPV", "Mass vs MultITSTPCWithPV", false, 200, 0.0, 5.0, VarManager::kMass, 200, 0, 200.0, VarManager::kMultNTracksITSTPC); } if (subGroupStr.Contains("polarization")) { hm->AddHistogram(histClass, "cosThetaHE", "", false, 100, -1., 1., VarManager::kCosThetaHE); From 8b4dc59ecd6a1b0089ea021406cbbb6b00acfdce Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Wed, 19 Mar 2025 20:58:07 +0900 Subject: [PATCH 0759/1650] [PWGEM/PhotonMeson] fix in pcmQCMC.cxx (#10573) --- PWGEM/PhotonMeson/Tasks/pcmQC.cxx | 2 +- PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx | 28 ++++++++++++++++------------ 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/PWGEM/PhotonMeson/Tasks/pcmQC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQC.cxx index 003e2062d8d..9d9d2f6496e 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQC.cxx @@ -298,7 +298,7 @@ struct PCMQC { fRegistry.fill(HIST("V0/hThetaResolution"), v0.p(), getThetaResolution(v0)); fRegistry.fill(HIST("V0/hPhiResolution"), v0.p(), getPhiResolution(v0)); - float phi_cp = atan2(v0.vy(), v0.vx()); + float phi_cp = std::atan2(v0.vy(), v0.vx()); o2::math_utils::bringTo02Pi(phi_cp); float eta_cp = std::atanh(v0.vz() / std::sqrt(std::pow(v0.vx(), 2) + std::pow(v0.vy(), 2) + std::pow(v0.vz(), 2))); fRegistry.fill(HIST("V0/hsConvPoint"), v0.v0radius(), phi_cp, eta_cp); diff --git a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx index 8a38efa0992..93b8324ab6d 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx @@ -376,7 +376,7 @@ struct PCMQCMC { fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hXY_MC"), mcleg.vx(), mcleg.vy()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hRZ_MC"), mcleg.vz(), std::sqrt(std::pow(mcleg.vx(), 2) + std::pow(mcleg.vy(), 2))); - float phi_cp = atan2(v0.vy(), v0.vx()); + float phi_cp = std::atan2(v0.vy(), v0.vx()); o2::math_utils::bringTo02Pi(phi_cp); float eta_cp = std::atanh(v0.vz() / std::sqrt(std::pow(v0.vx(), 2) + std::pow(v0.vy(), 2) + std::pow(v0.vz(), 2))); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hsConvPoint"), v0.v0radius(), phi_cp, eta_cp); @@ -490,25 +490,29 @@ struct PCMQCMC { // LOGF(info, "mcphoton.vx() = %f, mcphoton.vy() = %f, mcphoton.vz() = %f, mother_pdg = %d", mcphoton.vx(), mcphoton.vy(), mcphoton.vz(), mother_pdg); } } else if (pi0id > 0) { - auto mcpi0 = mcparticles.iteratorAt(photonid); + auto mcpi0 = mcparticles.iteratorAt(pi0id); if (cfgRequireTrueAssociation && (mcpi0.emmceventId() != collision.emmceventId())) { continue; } - fillV0Info<3>(v0, mcpi0, elemc); - for (auto& leg : {pos, ele}) { - fillV0LegInfo<3>(leg); + if (mcpi0.isPhysicalPrimary() || mcpi0.producedByGenerator()) { + fillV0Info<3>(v0, mcpi0, elemc); + for (auto& leg : {pos, ele}) { + fillV0LegInfo<3>(leg); + } + nee_pi0++; } - nee_pi0++; } else if (etaid > 0) { - auto mceta = mcparticles.iteratorAt(photonid); + auto mceta = mcparticles.iteratorAt(etaid); if (cfgRequireTrueAssociation && (mceta.emmceventId() != collision.emmceventId())) { continue; } - fillV0Info<4>(v0, mceta, elemc); - for (auto& leg : {pos, ele}) { - fillV0LegInfo<4>(leg); + if (mceta.isPhysicalPrimary() || mceta.producedByGenerator()) { + fillV0Info<4>(v0, mceta, elemc); + for (auto& leg : {pos, ele}) { + fillV0LegInfo<4>(leg); + } + nee_eta++; } - nee_eta++; } } // end of v0 loop fRegistry.fill(HIST("V0/primary/hNgamma"), ng_primary); @@ -573,7 +577,7 @@ struct PCMQCMC { if (std::abs(mctrack.pdgCode()) == 22 && (mctrack.isPhysicalPrimary() || mctrack.producedByGenerator())) { auto daughter = mcparticles.iteratorAt(mctrack.daughtersIds()[0]); // choose ele or pos. float rxy_gen_e = std::sqrt(std::pow(daughter.vx(), 2) + std::pow(daughter.vy(), 2)); - float phi_cp = atan2(daughter.vy(), daughter.vx()); + float phi_cp = std::atan2(daughter.vy(), daughter.vx()); o2::math_utils::bringTo02Pi(phi_cp); float eta_cp = std::atanh(daughter.vz() / std::sqrt(std::pow(daughter.vx(), 2) + std::pow(daughter.vy(), 2) + std::pow(daughter.vz(), 2))); From e02ed27e615dbaf200137846c0da1287170bb8e0 Mon Sep 17 00:00:00 2001 From: Marvin Hemmer <53471402+mhemmer-cern@users.noreply.github.com> Date: Wed, 19 Mar 2025 14:04:13 +0100 Subject: [PATCH 0760/1650] [PWGEM,PWGEM-36] Pi0Flow - ensure bool config is correctly used (#10574) --- PWGEM/PhotonMeson/Tasks/taskPi0FlowEMC.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PWGEM/PhotonMeson/Tasks/taskPi0FlowEMC.cxx b/PWGEM/PhotonMeson/Tasks/taskPi0FlowEMC.cxx index 28adf43ece8..2e64bd6ebe2 100644 --- a/PWGEM/PhotonMeson/Tasks/taskPi0FlowEMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/taskPi0FlowEMC.cxx @@ -949,7 +949,7 @@ struct TaskPi0FlowEMC { ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.); ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.); - if (cfgDoReverseScaling) { + if (cfgDoReverseScaling.value) { // Convert to PxPyPzEVector to modify energy ROOT::Math::PxPyPzEVector v1Mod(v1); v1Mod.SetE(v1Mod.E() * 1.0505); @@ -1057,7 +1057,7 @@ struct TaskPi0FlowEMC { ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.); ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.); - if (cfgDoReverseScaling) { + if (cfgDoReverseScaling.value) { // Convert to PxPyPzEVector to modify energy ROOT::Math::PxPyPzEVector v1Mod(v1); v1Mod.SetE(v1Mod.E() * 1.0505); @@ -1283,7 +1283,7 @@ struct TaskPi0FlowEMC { ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.); ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.); - if (cfgDoReverseScaling) { + if (cfgDoReverseScaling.value) { // Convert to PxPyPzEVector to modify energy ROOT::Math::PxPyPzEVector v1Mod(v1); v1Mod.SetE(v1Mod.E() * 1.0505); From b0a60ae3f44a0526e19c265a3bd799af8765d85c Mon Sep 17 00:00:00 2001 From: Fabrizio Date: Wed, 19 Mar 2025 14:09:46 +0100 Subject: [PATCH 0761/1650] [PWGHF,Trigger] Add the possibility to use TPC PID in BDT for HFfilters + minor changes to selections (#10572) --- EventFiltering/PWGHF/HFFilter.cxx | 54 ++++++++++++++--- EventFiltering/PWGHF/HFFilterHelpers.h | 8 ++- PWGHF/TableProducer/trackIndexSkimCreator.cxx | 60 +++++++++++++++++-- 3 files changed, 106 insertions(+), 16 deletions(-) diff --git a/EventFiltering/PWGHF/HFFilter.cxx b/EventFiltering/PWGHF/HFFilter.cxx index b03c61c1276..21d5fa643b9 100644 --- a/EventFiltering/PWGHF/HFFilter.cxx +++ b/EventFiltering/PWGHF/HFFilter.cxx @@ -104,7 +104,7 @@ struct HfFilter { // Main struct for HF triggers Configurable forceTofDeuteronForFemto{"forceTofDeuteronForFemto", false, "flag to force TOF PID for deuterons"}; // double charm - Configurable> enableDoubleCharmChannels{"enableDoubleCharmChannels", {activeDoubleCharmChannels[0], 1, 3, labelsEmpty, labelsColumnsDoubleCharmChannels}, "Flags to enable/disable double charm channels"}; + Configurable> enableDoubleCharmChannels{"enableDoubleCharmChannels", {activeDoubleCharmChannels[0], 2, 3, labelsRowsDoubleCharmChannels, labelsColumnsDoubleCharmChannels}, "Flags to enable/disable double charm channels"}; Configurable keepOnlyDplusForDouble3Prongs{"keepOnlyDplusForDouble3Prongs", false, "Flag to enable/disable to keep only D+ in double charm 3-prongs trigger"}; // parameters for resonance triggers @@ -425,7 +425,7 @@ struct HfFilter { // Main struct for HF triggers hProcessedEvents->Fill(0); - std::vector> indicesDau2Prong{}; + std::vector> indicesDau2Prong{}, indicesDau2ProngPrompt{}; auto cand2ProngsThisColl = cand2Prongs.sliceBy(hf2ProngPerCollision, thisCollId); for (const auto& cand2Prong : cand2ProngsThisColl) { // start loop over 2 prongs @@ -516,8 +516,9 @@ struct HfFilter { // Main struct for HF triggers } } // multi-charm selection + indicesDau2Prong.push_back(std::vector{trackPos.globalIndex(), trackNeg.globalIndex()}); if (isD0CharmTagged) { - indicesDau2Prong.push_back(std::vector{trackPos.globalIndex(), trackNeg.globalIndex()}); + indicesDau2ProngPrompt.push_back(std::vector{trackPos.globalIndex(), trackNeg.globalIndex()}); } if (applyOptimisation) { @@ -946,6 +947,11 @@ struct HfFilter { // Main struct for HF triggers if (trackProton.globalIndex() == trackPos.globalIndex() || trackProton.globalIndex() == trackNeg.globalIndex()) { continue; } + // minimal track selections + if (!trackProton.isGlobalTrackWoDCA() || std::fabs(trackProton.pt()) < 0.3f) { + continue; + } + // PID selection bool isProton = helper.isSelectedProton4CharmOrBeautyBaryons(trackProton); if (isProton) { if (!keepEvent[kPrCharm2P]) { @@ -1074,7 +1080,7 @@ struct HfFilter { // Main struct for HF triggers } // end loop over 2-prong candidates - std::vector> indicesDau3Prong{}; + std::vector> indicesDau3Prong{}, indicesDau3ProngPrompt{}; auto cand3ProngsThisColl = cand3Prongs.sliceBy(hf3ProngPerCollision, thisCollId); for (const auto& cand3Prong : cand3ProngsThisColl) { // start loop over 3 prongs std::array is3Prong = { @@ -1171,8 +1177,18 @@ struct HfFilter { // Main struct for HF triggers keepEvent[kSingleNonPromptCharm3P] = true; } - if ((!keepOnlyDplusForDouble3Prongs && std::accumulate(isCharmTagged.begin(), isCharmTagged.end(), 0)) || (keepOnlyDplusForDouble3Prongs && isCharmTagged[kDplus - 1])) { + if (!keepOnlyDplusForDouble3Prongs) { indicesDau3Prong.push_back(std::vector{trackFirst.globalIndex(), trackSecond.globalIndex(), trackThird.globalIndex()}); + if (std::accumulate(isCharmTagged.begin(), isCharmTagged.end(), 0)) { + indicesDau3ProngPrompt.push_back(std::vector{trackFirst.globalIndex(), trackSecond.globalIndex(), trackThird.globalIndex()}); + } + } else { + if (isSignalTagged[kDplus - 1]) { + indicesDau3Prong.push_back(std::vector{trackFirst.globalIndex(), trackSecond.globalIndex(), trackThird.globalIndex()}); + if (isCharmTagged[kDplus - 1]) { + indicesDau3ProngPrompt.push_back(std::vector{trackFirst.globalIndex(), trackSecond.globalIndex(), trackThird.globalIndex()}); + } + } } // end multiple 3-prong selection auto pVec3Prong = RecoDecay::pVec(pVecFirst, pVecSecond, pVecThird); @@ -1778,9 +1794,13 @@ struct HfFilter { // Main struct for HF triggers } auto n2Prongs = helper.computeNumberOfCandidates(indicesDau2Prong); + auto n2ProngsPrompt = helper.computeNumberOfCandidates(indicesDau2ProngPrompt); auto n3Prongs = helper.computeNumberOfCandidates(indicesDau3Prong); + auto n3ProngsPrompt = helper.computeNumberOfCandidates(indicesDau3ProngPrompt); indicesDau2Prong.insert(indicesDau2Prong.end(), indicesDau3Prong.begin(), indicesDau3Prong.end()); auto n23Prongs = helper.computeNumberOfCandidates(indicesDau2Prong); + indicesDau2ProngPrompt.insert(indicesDau2ProngPrompt.end(), indicesDau3ProngPrompt.begin(), indicesDau3ProngPrompt.end()); + auto n23ProngsPrompt = helper.computeNumberOfCandidates(indicesDau2ProngPrompt); if (activateQA) { hN2ProngCharmCand->Fill(n2Prongs); @@ -1788,13 +1808,31 @@ struct HfFilter { // Main struct for HF triggers } if (n2Prongs > 1 && enableDoubleCharmChannels->get(0u, 0u)) { - keepEvent[kDoubleCharm2P] = true; + if (enableDoubleCharmChannels->get(1u, 0u)) { + keepEvent[kDoubleCharm2P] = true; + } else { + if (n2ProngsPrompt > 1) { + keepEvent[kDoubleCharm2P] = true; + } + } } if (n3Prongs > 1 && enableDoubleCharmChannels->get(0u, 1u)) { - keepEvent[kDoubleCharm3P] = true; + if (enableDoubleCharmChannels->get(1u, 1u)) { + keepEvent[kDoubleCharm3P] = true; + } else { + if (n3ProngsPrompt > 1) { + keepEvent[kDoubleCharm3P] = true; + } + } } if (n23Prongs > 1 && enableDoubleCharmChannels->get(0u, 2u)) { - keepEvent[kDoubleCharmMix] = true; + if (enableDoubleCharmChannels->get(1u, 2u)) { + keepEvent[kDoubleCharmMix] = true; + } else { + if (n23ProngsPrompt > 1) { + keepEvent[kDoubleCharmMix] = true; + } + } } // apply downscale factors, if required diff --git a/EventFiltering/PWGHF/HFFilterHelpers.h b/EventFiltering/PWGHF/HFFilterHelpers.h index 04050908016..f3fbe237f7a 100644 --- a/EventFiltering/PWGHF/HFFilterHelpers.h +++ b/EventFiltering/PWGHF/HFFilterHelpers.h @@ -343,8 +343,9 @@ static const std::vector labelsColumnsCutsBeautyToJPsi = {"minPtMuo } // namespace hf_trigger_cuts_presel_beauty // double charm -constexpr int activeDoubleCharmChannels[1][3] = {{1, 1, 1}}; // kDoubleCharm2P, kDoubleCharm3P, kDoubleCharmMix +constexpr int activeDoubleCharmChannels[2][3] = {{1, 1, 1}, {1, 1, 0}}; // kDoubleCharm2P, kDoubleCharm3P, kDoubleCharmMix (second column to keep non-prompt) static const std::vector labelsColumnsDoubleCharmChannels = {"DoubleCharm2Prong", "DoubleCharm3Prong", "DoubleCharmMix"}; +static const std::vector labelsRowsDoubleCharmChannels = {"", "KeepNonprompt"}; // charm resonances constexpr float cutsCharmReso[3][13] = {{0.0, 0.0, 0.0, 0.0, 0.4, 0., 0.0, 0.00, 0.21, 0.21, 0.0, 0.7, 0.7}, @@ -932,12 +933,13 @@ inline bool HfFilterHelper::isSelectedTrack4Femto(const T1& track, const T2& tra // For deuterons: Determine whether to apply TOF based on pt threshold if (trackSpecies == kDeuteronForFemto) { // Apply different PID strategy in different pt range + // one side selection only if (pt <= ptThresholdPidStrategy) { - if (std::fabs(NSigmaTPC) > nSigmaCuts[0] || NSigmaITS < nSigmaCuts[3]) { // Use TPC and ITS below the threshold, NSigmaITS for deuteron with a lower limit + if (NSigmaTPC < -nSigmaCuts[0] || NSigmaITS < -nSigmaCuts[3]) { // Use TPC and ITS below the threshold, NSigmaITS for deuteron with a lower limit return false; } } else { - if (NSigma > nSigmaCuts[2]) { // Use combined TPC and TOF above the threshold + if (NSigmaTOF > nSigmaCuts[2] || NSigmaTPC < -nSigmaCuts[0]) { // Use combined TPC and TOF above the threshold return false; } } diff --git a/PWGHF/TableProducer/trackIndexSkimCreator.cxx b/PWGHF/TableProducer/trackIndexSkimCreator.cxx index 29aab0c1a6d..8f0cc57f9f6 100644 --- a/PWGHF/TableProducer/trackIndexSkimCreator.cxx +++ b/PWGHF/TableProducer/trackIndexSkimCreator.cxx @@ -1766,9 +1766,12 @@ struct HfTrackIndexSkimCreator { /// Method to perform ML selections for 2-prong candidates after the rectangular selections /// \param featuresCand is the vector with the candidate features + /// \param featuresCandPid is the vector with the candidate PID features /// \param outputScores is the array of vectors with the output scores to be filled /// \param isSelected ia s bitmap with selection outcome - void applyMlSelectionForHfFilters3Prong(std::vector featuresCand, std::array, kN3ProngDecays>& outputScores, int& isSelected) + /// \param usePidForHfFiltersBdt is the flag to determine whether to use also the PID features for the Lc BDT + template + void applyMlSelectionForHfFilters3Prong(std::vector featuresCand, std::vector featuresCandPid, std::array, kN3ProngDecays>& outputScores, int& isSelected) { if (isSelected == 0) { return; @@ -1777,7 +1780,18 @@ struct HfTrackIndexSkimCreator { const float ptDummy = 1.; // dummy pT value (only one pT bin) for (int iDecay3P{0}; iDecay3P < kN3ProngDecays; ++iDecay3P) { if (TESTBIT(isSelected, iDecay3P) && hasMlModel3Prong[iDecay3P]) { - bool isMlSel = hfMlResponse3Prongs[iDecay3P].isSelectedMl(featuresCand, ptDummy, outputScores[iDecay3P]); + bool isMlSel = false; + if constexpr (usePidForHfFiltersBdt) { + if (iDecay3P != hf_cand_3prong::DecayType::LcToPKPi && iDecay3P != hf_cand_3prong::DecayType::XicToPKPi) { + hfMlResponse3Prongs[iDecay3P].isSelectedMl(featuresCand, ptDummy, outputScores[iDecay3P]); + } else { + std::vector featuresCandWithPid = featuresCand; + featuresCandWithPid.insert(featuresCandWithPid.end(), featuresCandPid.begin(), featuresCandPid.end()); + hfMlResponse3Prongs[iDecay3P].isSelectedMl(featuresCandWithPid, ptDummy, outputScores[iDecay3P]); + } + } else { + isMlSel = hfMlResponse3Prongs[iDecay3P].isSelectedMl(featuresCand, ptDummy, outputScores[iDecay3P]); + } if (config.fillHistograms) { switch (iDecay3P) { case hf_cand_3prong::DecayType::DplusToPiKPi: { @@ -2002,7 +2016,7 @@ struct HfTrackIndexSkimCreator { return; } /// end of performPvRefitCandProngs function - template + template void run2And3Prongs(SelectedCollisions const& collisions, aod::BCsWithTimestamps const& bcWithTimeStamps, FilteredTrackAssocSel const&, @@ -2506,7 +2520,15 @@ struct HfTrackIndexSkimCreator { std::array, kN3ProngDecays> mlScores3Prongs; if (config.applyMlForHfFilters) { std::vector inputFeatures{trackParVarPcaPos1.getPt(), dcaInfoPos1[0], dcaInfoPos1[1], trackParVarPcaNeg1.getPt(), dcaInfoNeg1[0], dcaInfoNeg1[1], trackParVarPcaPos2.getPt(), dcaInfoPos2[0], dcaInfoPos2[1]}; - applyMlSelectionForHfFilters3Prong(inputFeatures, mlScores3Prongs, isSelected3ProngCand); + std::vector inputFeaturesLcPid{}; + if constexpr (usePidForHfFiltersBdt) { + inputFeaturesLcPid.push_back(trackPos1.tpcNSigmaPr()); + inputFeaturesLcPid.push_back(trackPos2.tpcNSigmaPr()); + inputFeaturesLcPid.push_back(trackPos1.tpcNSigmaPi()); + inputFeaturesLcPid.push_back(trackPos2.tpcNSigmaPi()); + inputFeaturesLcPid.push_back(trackNeg1.tpcNSigmaKa()); + } + applyMlSelectionForHfFilters3Prong(inputFeatures, inputFeaturesLcPid, mlScores3Prongs, isSelected3ProngCand); } if (!config.debug && isSelected3ProngCand == 0) { @@ -2751,7 +2773,15 @@ struct HfTrackIndexSkimCreator { std::array, kN3ProngDecays> mlScores3Prongs; if (config.applyMlForHfFilters) { std::vector inputFeatures{trackParVarPcaNeg1.getPt(), dcaInfoNeg1[0], dcaInfoNeg1[1], trackParVarPcaPos1.getPt(), dcaInfoPos1[0], dcaInfoPos1[1], trackParVarPcaNeg2.getPt(), dcaInfoNeg2[0], dcaInfoNeg2[1]}; - applyMlSelectionForHfFilters3Prong(inputFeatures, mlScores3Prongs, isSelected3ProngCand); + std::vector inputFeaturesLcPid{}; + if constexpr (usePidForHfFiltersBdt) { + inputFeaturesLcPid.push_back(trackNeg1.tpcNSigmaPr()); + inputFeaturesLcPid.push_back(trackNeg2.tpcNSigmaPr()); + inputFeaturesLcPid.push_back(trackNeg1.tpcNSigmaPi()); + inputFeaturesLcPid.push_back(trackNeg2.tpcNSigmaPi()); + inputFeaturesLcPid.push_back(trackPos1.tpcNSigmaKa()); + } + applyMlSelectionForHfFilters3Prong(inputFeatures, inputFeaturesLcPid, mlScores3Prongs, isSelected3ProngCand); } if (!config.debug && isSelected3ProngCand == 0) { @@ -2945,6 +2975,26 @@ struct HfTrackIndexSkimCreator { run2And3Prongs(collisions, bcWithTimeStamps, trackIndices, tracks); } PROCESS_SWITCH(HfTrackIndexSkimCreator, process2And3ProngsNoPvRefit, "Process 2-prong and 3-prong skim without PV refit", true); + + void process2And3ProngsWithPvRefitWithPidForHfFiltersBdt( // soa::Join::iterator const& collision, //FIXME add centrality when option for variations to the process function appears + SelectedCollisions const& collisions, + aod::BCsWithTimestamps const& bcWithTimeStamps, + FilteredTrackAssocSel const& trackIndices, + soa::Join const& tracks) + { + run2And3Prongs(collisions, bcWithTimeStamps, trackIndices, tracks); + } + PROCESS_SWITCH(HfTrackIndexSkimCreator, process2And3ProngsWithPvRefitWithPidForHfFiltersBdt, "Process 2-prong and 3-prong skim with PV refit and PID for software trigger BDTs (Lc and Xic only)", false); + + void process2And3ProngsNoPvRefitWithPidForHfFiltersBdt( // soa::Join::iterator const& collision, //FIXME add centrality when option for variations to the process function appears + SelectedCollisions const& collisions, + aod::BCsWithTimestamps const& bcWithTimeStamps, + FilteredTrackAssocSel const& trackIndices, + soa::Join const& tracks) + { + run2And3Prongs(collisions, bcWithTimeStamps, trackIndices, tracks); + } + PROCESS_SWITCH(HfTrackIndexSkimCreator, process2And3ProngsNoPvRefitWithPidForHfFiltersBdt, "Process 2-prong and 3-prong skim without PV refit and PID for software trigger BDTs (Lc and Xic only)", false); }; //________________________________________________________________________________________________________________________ From a4461dfc73dfa758844b59ee913235824c206944 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Wed, 19 Mar 2025 18:37:25 +0100 Subject: [PATCH 0762/1650] [PWGLF] Add selection for systematic (#10577) --- PWGLF/Tasks/Resonances/phipbpb.cxx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Resonances/phipbpb.cxx b/PWGLF/Tasks/Resonances/phipbpb.cxx index e0e53d4b4fa..c842017274d 100644 --- a/PWGLF/Tasks/Resonances/phipbpb.cxx +++ b/PWGLF/Tasks/Resonances/phipbpb.cxx @@ -93,6 +93,7 @@ struct phipbpb { Configurable cfgCutOccupancy{"cfgCutOccupancy", 3000, "Occupancy cut"}; // track Configurable useSP{"useSP", false, "use SP"}; + Configurable useDcaSyst{"useDcaSyst", false, "useDcaSyst"}; Configurable additionalEvsel{"additionalEvsel", false, "Additional event selcection"}; Configurable additionalEvselITS{"additionalEvselITS", true, "Additional event selcection for ITS"}; Configurable removefaketrak{"removefaketrack", true, "Remove fake track from momentum difference"}; @@ -358,7 +359,10 @@ struct phipbpb { template bool selectionTrack(const T& candidate) { - if (useGlobalTrack && !(candidate.isGlobalTrack() && candidate.isPVContributor() && candidate.itsNCls() > cfgITScluster && candidate.tpcNClsCrossedRows() > cfgTPCcluster && candidate.tpcFractionSharedCls() < cfgTPCSharedcluster)) { + if (useGlobalTrack && !useDcaSyst && !(candidate.isGlobalTrack() && candidate.isPVContributor() && candidate.itsNCls() > cfgITScluster && candidate.tpcNClsCrossedRows() > cfgTPCcluster && candidate.tpcFractionSharedCls() < cfgTPCSharedcluster)) { + return false; + } + if (useGlobalTrack && useDcaSyst && !(candidate.itsNCls() > cfgITScluster && candidate.tpcNClsCrossedRows() > cfgTPCcluster && candidate.tpcFractionSharedCls() < cfgTPCSharedcluster)) { return false; } if (!useGlobalTrack && !(candidate.tpcNClsFound() > cfgTPCcluster)) { From fd598f3bc5236ed78102d16bf474cc4319c10725 Mon Sep 17 00:00:00 2001 From: Steffimro <63045530+Steffimro@users.noreply.github.com> Date: Wed, 19 Mar 2025 18:48:44 +0100 Subject: [PATCH 0763/1650] [PWGEM] PWGEM:Added further resolution histograms for Rxy differential study (#10576) Co-authored-by: Stefanie Mrozinski --- PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx index 93b8324ab6d..df7ba5be443 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx @@ -207,14 +207,16 @@ struct PCMQCMC { fRegistry.add("V0/primary/hPtGen_DeltaPtOverPtGen", "photon p_{T} resolution;p_{T}^{gen} (GeV/c);(p_{T}^{rec} - p_{T}^{gen})/p_{T}^{gen}", kTH2F, {{1000, 0, 10}, {200, -1.0f, 1.0f}}, true); fRegistry.add("V0/primary/hPtGen_DeltaEta", "photon #eta resolution;p_{T}^{gen} (GeV/c);#eta^{rec} - #eta^{gen}", kTH2F, {{1000, 0, 10}, {100, -0.5f, 0.5f}}, true); fRegistry.add("V0/primary/hPtGen_DeltaPhi", "photon #varphi resolution;p_{T}^{gen} (GeV/c);#varphi^{rec} - #varphi^{gen} (rad.)", kTH2F, {{1000, 0, 10}, {100, -0.5f, 0.5f}}, true); + fRegistry.add("V0/primary/hRxyGen_DeltaPtOverPtGen", "photon p_{T} resolution; R_{xy}^{gen} (cm);(p_{T}^{rec} - p_{T}^{gen})/p_{T}^{gen}", kTH2F, {{1000, 0, 90}, {200, -1.0f, 1.0f}}, true); + fRegistry.add("V0/primary/hRxyGen_DeltaEta", "photon #eta resolution;R_{xy}^{gen} (cm);#eta^{rec} - #eta^{gen}", kTH2F, {{1000, 0, 90}, {100, -0.5f, 0.5f}}, true); + fRegistry.add("V0/primary/hRxyGen_DeltaPhi", "photon #varphi resolution;R_{xy}^{gen} (cm);#varphi^{rec} - #varphi^{gen} (rad.)", kTH2F, {{1000, 0, 90}, {100, -0.5f, 0.5f}}, true); fRegistry.add("V0/primary/hXY_MC", "X vs. Y of true photon conversion point.;X (cm);Y (cm)", kTH2F, {{400, -100.0f, +100}, {400, -100, +100}}, true); fRegistry.add("V0/primary/hRZ_MC", "R vs. Z of true photon conversion point;Z (cm);R_{xy} (cm)", kTH2F, {{200, -100.0f, +100}, {200, 0, 100}}, true); fRegistry.add("V0/primary/hsConvPoint", "photon conversion point;r_{xy} (cm);#varphi (rad.);#eta;", kTHnSparseF, {{100, 0.0f, 100}, {90, 0, 2 * M_PI}, {80, -2, +2}}, false); - fRegistry.addClone("V0/primary/", "V0/fromWD/"); // from weak decay - fRegistry.addClone("V0/primary/", "V0/fromHS/"); // from hadronic shower in detector materials - fRegistry.addClone("V0/primary/", "V0/fromPi0Dalitz/"); // misidentified dielectron from pi0 dalitz decay - fRegistry.addClone("V0/primary/", "V0/fromEtaDalitz/"); // misidentified dielectron from eta dalitz decay - + fRegistry.addClone("V0/primary/", "V0/fromWD/"); // from weak decay + fRegistry.addClone("V0/primary/", "V0/fromHS/"); // from hadronic shower in detector materials + fRegistry.addClone("V0/primary/", "V0/fromPi0Dalitz/"); // misidentified dielectron from pi0 dalitz decay + fRegistry.addClone("V0/primary/", "V0/fromEtaDalitz/"); // misidentified dielectron from eta dalitz decay fRegistry.addClone("V0/primary/hPt", "V0/candidate/hPt"); // only for purity fRegistry.addClone("V0/primary/hEtaPhi", "V0/candidate/hEtaPhi"); // only for purity @@ -370,6 +372,10 @@ struct PCMQCMC { fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hPtGen_DeltaPtOverPtGen"), mcphoton.pt(), (v0.pt() - mcphoton.pt()) / mcphoton.pt()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hPtGen_DeltaEta"), mcphoton.pt(), v0.eta() - mcphoton.eta()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hPtGen_DeltaPhi"), mcphoton.pt(), v0.phi() - mcphoton.phi()); + fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hRxyGen_DeltaPtOverPtGen"), v0.v0radius(), (v0.pt() - mcphoton.pt()) / mcphoton.pt()); + fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hRxyGen_DeltaEta"), v0.v0radius(), v0.eta() - mcphoton.eta()); + fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hRxyGen_DeltaPhi"), v0.v0radius(), v0.phi() - mcphoton.phi()); + fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hConvPoint_diffX"), mcleg.vx(), v0.vx() - mcleg.vx()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hConvPoint_diffY"), mcleg.vy(), v0.vy() - mcleg.vy()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hConvPoint_diffZ"), mcleg.vz(), v0.vz() - mcleg.vz()); From 1ec5447dfa54803785f930723239933e4278f45c Mon Sep 17 00:00:00 2001 From: fuchuncui <162277233+fuchuncui@users.noreply.github.com> Date: Thu, 20 Mar 2025 03:07:10 +0800 Subject: [PATCH 0764/1650] [PWGCF] Add mass axis in MCRec histos (#10570) --- PWGCF/Flow/Tasks/flowEfficiencyCasc.cxx | 47 +++++++++++++++---------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowEfficiencyCasc.cxx b/PWGCF/Flow/Tasks/flowEfficiencyCasc.cxx index 1587a3b386c..e3de908686b 100644 --- a/PWGCF/Flow/Tasks/flowEfficiencyCasc.cxx +++ b/PWGCF/Flow/Tasks/flowEfficiencyCasc.cxx @@ -67,6 +67,7 @@ struct FlowEfficiencyCasc { O2_DEFINE_CONFIGURABLE(cfgtpccrossoverfindable, int, 0, "minimum number of Ratio crossed rows over findable clusters") O2_DEFINE_CONFIGURABLE(cfgcheckDauTPC, bool, true, "check daughter tracks TPC or not") O2_DEFINE_CONFIGURABLE(cfgcheckDauTOF, bool, false, "check daughter tracks TOF or not") + O2_DEFINE_CONFIGURABLE(cfgcheckMCParticle, bool, false, "check the particle and deacy channel match or not") O2_DEFINE_CONFIGURABLE(cfgCasc_rapidity, float, 0.5, "rapidity") O2_DEFINE_CONFIGURABLE(cfgNSigmatpctof, std::vector, (std::vector{3, 3, 3}), "tpc and tof NSigma for Pion Kaon Proton") @@ -76,8 +77,14 @@ struct FlowEfficiencyCasc { ConfigurableAxis cfgaxisPtOmega{"cfgaxisPtOmega", {VARIABLE_WIDTH, 0, 0.1, 0.5, 0.9, 1.1, 1.3, 1.5, 1.7, 1.9, 2.1, 2.3, 2.5, 2.7, 2.9, 3.9, 4.9, 5.9, 9.9}, "pt (GeV)"}; ConfigurableAxis cfgaxisPtV0{"cfgaxisPtV0", {VARIABLE_WIDTH, 0, 0.1, 0.5, 0.9, 1.1, 1.3, 1.5, 1.7, 1.9, 2.1, 2.3, 2.5, 2.7, 2.9, 3.9, 4.9, 5.9, 9.9}, "pt (GeV)"}; ConfigurableAxis cfgaxisMultiplicity{"cfgaxisMultiplicity", {1000, 0, 5000}, "Nch"}; + ConfigurableAxis cfgaxisCentrality{"cfgaxisCentrality", {0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90}, "Centrality (%)"}; - using MyCollisions = soa::Join; + AxisSpec axisOmegaMass = {80, 1.63f, 1.71f, "Inv. Mass (GeV)"}; + AxisSpec axisXiMass = {70, 1.3f, 1.37f, "Inv. Mass (GeV)"}; + AxisSpec axisK0sMass = {400, 0.4f, 0.6f, "Inv. Mass (GeV)"}; + AxisSpec axisLambdaMass = {160, 1.08f, 1.16f, "Inv. Mass (GeV)"}; + + using MyCollisions = soa::Join; using MyMcCollisions = soa::Join; using CascMCCandidates = soa::Join; using V0MCCandidates = soa::Join; @@ -94,15 +101,16 @@ struct FlowEfficiencyCasc { // create histograms registry.add("eventCounter", "eventCounter", kTH1F, {axisCounter}); registry.add("mcEventCounter", "Monte Carlo Truth EventCounter", kTH1F, {axisCounter}); + registry.add("h2DCentvsNch", "", {HistType::kTH2D, {cfgaxisCentrality, cfgaxisMultiplicity}}); registry.add("h2DGenK0s", "", {HistType::kTH2D, {cfgaxisPtV0, cfgaxisMultiplicity}}); registry.add("h2DGenLambda", "", {HistType::kTH2D, {cfgaxisPtV0, cfgaxisMultiplicity}}); registry.add("h2DGenXi", "", {HistType::kTH2D, {cfgaxisPtXi, cfgaxisMultiplicity}}); registry.add("h2DGenOmega", "", {HistType::kTH2D, {cfgaxisPtOmega, cfgaxisMultiplicity}}); - registry.add("h2DRecK0s", "", {HistType::kTH2D, {cfgaxisPtV0, cfgaxisMultiplicity}}); - registry.add("h2DRecLambda", "", {HistType::kTH2D, {cfgaxisPtV0, cfgaxisMultiplicity}}); - registry.add("h2DRecXi", "", {HistType::kTH2D, {cfgaxisPtXi, cfgaxisMultiplicity}}); - registry.add("h2DRecOmega", "", {HistType::kTH2D, {cfgaxisPtOmega, cfgaxisMultiplicity}}); + registry.add("h3DRecK0s", "", {HistType::kTH3D, {cfgaxisPtV0, cfgaxisMultiplicity, axisK0sMass}}); + registry.add("h3DRecLambda", "", {HistType::kTH3D, {cfgaxisPtV0, cfgaxisMultiplicity, axisLambdaMass}}); + registry.add("h3DRecXi", "", {HistType::kTH3D, {cfgaxisPtXi, cfgaxisMultiplicity, axisXiMass}}); + registry.add("h3DRecOmega", "", {HistType::kTH3D, {cfgaxisPtOmega, cfgaxisMultiplicity, axisOmegaMass}}); } void processRec(MyCollisions::iterator const& collision, V0MCCandidates const& V0s, CascMCCandidates const& Cascades, DaughterTracks const&, soa::Join const&, soa::Join const&) @@ -111,6 +119,7 @@ struct FlowEfficiencyCasc { if (!collision.sel8()) return; int rectracknum = collision.multNTracksGlobal(); + registry.fill(HIST("h2DCentvsNch"), collision.centFT0C(), rectracknum); for (const auto& casc : Cascades) { if (!casc.has_cascMCCore()) continue; @@ -150,23 +159,23 @@ struct FlowEfficiencyCasc { continue; // Omega and antiOmega int pdgCode{cascMC.pdgCode()}; - if (std::abs(pdgCode) == kOmegaMinus && std::abs(cascMC.pdgCodeV0()) == kLambda0 && std::abs(cascMC.pdgCodeBachelor()) == kKPlus) { + if (!cfgcheckMCParticle || (std::abs(pdgCode) == kOmegaMinus && std::abs(cascMC.pdgCodeV0()) == kLambda0 && std::abs(cascMC.pdgCodeBachelor()) == kKPlus)) { if (casc.sign() < 0 && (casc.mOmega() > 1.63) && (casc.mOmega() < 1.71) && std::fabs(casc.yOmega()) < cfgCasc_rapidity && (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { - registry.fill(HIST("h2DRecOmega"), casc.pt(), rectracknum); + registry.fill(HIST("h2DRecOmega"), casc.pt(), rectracknum, casc.mOmega()); } else if (casc.sign() < 0 && (casc.mOmega() > 1.63) && (casc.mOmega() < 1.71) && std::fabs(casc.yOmega()) < cfgCasc_rapidity && (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0]))) { - registry.fill(HIST("h2DRecOmega"), casc.pt(), rectracknum); + registry.fill(HIST("h2DRecOmega"), casc.pt(), rectracknum, casc.mOmega()); } } // Xi and antiXi - if (std::abs(pdgCode) == kXiMinus && std::abs(cascMC.pdgCodeV0()) == kLambda0 && std::abs(cascMC.pdgCodeBachelor()) == kPiPlus) { + if (!cfgcheckMCParticle || (std::abs(pdgCode) == kXiMinus && std::abs(cascMC.pdgCodeV0()) == kLambda0 && std::abs(cascMC.pdgCodeBachelor()) == kPiPlus)) { if (casc.sign() < 0 && (casc.mXi() > 1.30) && (casc.mXi() < 1.37) && std::fabs(casc.yXi()) < cfgCasc_rapidity && (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { - registry.fill(HIST("h2DRecXi"), casc.pt(), rectracknum); + registry.fill(HIST("h2DRecXi"), casc.pt(), rectracknum, casc.mXi()); } else if (casc.sign() < 0 && (casc.mXi() > 1.30) && (casc.mXi() < 1.37) && std::fabs(casc.yXi()) < cfgCasc_rapidity && (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0]))) { - registry.fill(HIST("h2DRecXi"), casc.pt(), rectracknum); + registry.fill(HIST("h2DRecXi"), casc.pt(), rectracknum, casc.mXi()); } } } @@ -207,21 +216,21 @@ struct FlowEfficiencyCasc { int pdgCode{v0MC.pdgCode()}; // K0short - if (std::abs(pdgCode) == kK0Short && v0MC.pdgCodePositive() == kPiPlus && v0MC.pdgCodeNegative() == kPiMinus) { + if (!cfgcheckMCParticle || (std::abs(pdgCode) == kK0Short && v0MC.pdgCodePositive() == kPiPlus && v0MC.pdgCodeNegative() == kPiMinus)) { if (v0.qtarm() / std::fabs(v0.alpha()) > cfgv0_ArmPodocut && std::fabs(v0.y()) < 0.5 && std::fabs(v0.mK0Short() - o2::constants::physics::MassK0Short) < cfgv0_mk0swindow && (!cfgcheckDauTPC || (std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { - registry.fill(HIST("h2DRecK0s"), v0.pt(), rectracknum); + registry.fill(HIST("h2DRecK0s"), v0.pt(), rectracknum, v0.mK0Short()); } } // Lambda and antiLambda - if (std::fabs(v0.y()) < 0.5 && std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < cfgv0_mlambdawindow && + if (std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < cfgv0_mlambdawindow && (!cfgcheckDauTPC || (std::fabs(v0posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { - if (std::abs(pdgCode) == kLambda0 && v0MC.pdgCodePositive() == kProton && v0MC.pdgCodeNegative() == kPiMinus) - registry.fill(HIST("h2DRecLambda"), v0.pt(), rectracknum); - } else if (std::fabs(v0.y()) < 0.5 && std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < cfgv0_mlambdawindow && + if (!cfgcheckMCParticle || (std::abs(pdgCode) == kLambda0 && v0MC.pdgCodePositive() == kProton && v0MC.pdgCodeNegative() == kPiMinus)) + registry.fill(HIST("h2DRecLambda"), v0.pt(), rectracknum, v0.mLambda()); + } else if (std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < cfgv0_mlambdawindow && (!cfgcheckDauTPC || (std::fabs(v0negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0]))) { - if (std::abs(pdgCode) == kLambda0 && v0MC.pdgCodePositive() == kPiPlus && v0MC.pdgCodeNegative() == kProtonBar) - registry.fill(HIST("h2DRecLambda"), v0.pt(), rectracknum); + if (!cfgcheckMCParticle || (std::abs(pdgCode) == kLambda0 && v0MC.pdgCodePositive() == kPiPlus && v0MC.pdgCodeNegative() == kProtonBar)) + registry.fill(HIST("h2DRecLambda"), v0.pt(), rectracknum, v0.mLambda()); } } } From fbb7832f1645343fd91f2d68974616d727b85034 Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Thu, 20 Mar 2025 03:07:58 +0800 Subject: [PATCH 0765/1650] [PWGCF] add track density correction in MC (#10578) --- PWGCF/Flow/Tasks/flowMc.cxx | 69 +++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/PWGCF/Flow/Tasks/flowMc.cxx b/PWGCF/Flow/Tasks/flowMc.cxx index cad20c9bf55..63e7b81c60b 100644 --- a/PWGCF/Flow/Tasks/flowMc.cxx +++ b/PWGCF/Flow/Tasks/flowMc.cxx @@ -41,6 +41,7 @@ #include #include #include +#include using namespace o2; using namespace o2::framework; @@ -66,6 +67,10 @@ struct FlowMc { O2_DEFINE_CONFIGURABLE(cfgIsGlobalTrack, bool, false, "Use global tracks instead of hasTPC&&hasITS") O2_DEFINE_CONFIGURABLE(cfgFlowCumulantEnabled, bool, false, "switch of calculating flow") O2_DEFINE_CONFIGURABLE(cfgFlowCumulantNbootstrap, int, 30, "Number of subsamples") + O2_DEFINE_CONFIGURABLE(cfgTrackDensityCorrUse, bool, false, "Use track density efficiency correction") + O2_DEFINE_CONFIGURABLE(cfgTrackDensityCorrSlopeFactor, float, 1.0f, "A factor to scale the track density efficiency slope") + Configurable> cfgTrackDensityP0{"cfgTrackDensityP0", std::vector{0.6003720411, 0.6152630970, 0.6288860646, 0.6360694031, 0.6409494798, 0.6450540203, 0.6482117301, 0.6512592056, 0.6640008690, 0.6862631416, 0.7005738691, 0.7106567432, 0.7170728333}, "parameter 0 for track density efficiency correction"}; + Configurable> cfgTrackDensityP1{"cfgTrackDensityP1", std::vector{-1.007592e-05, -8.932635e-06, -9.114538e-06, -1.054818e-05, -1.220212e-05, -1.312304e-05, -1.376433e-05, -1.412813e-05, -1.289562e-05, -1.050065e-05, -8.635725e-06, -7.380821e-06, -6.201250e-06}, "parameter 1 for track density efficiency correction"}; ConfigurableAxis axisB{"axisB", {100, 0.0f, 20.0f}, ""}; ConfigurableAxis axisCentrality{"axisCentrality", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90}, "X axis for histograms"}; @@ -83,6 +88,12 @@ struct FlowMc { GFWWeights* mAcceptance = nullptr; bool correctionsLoaded = false; + std::vector funcEff; + TH1D* hFindPtBin; + TF1* funcV2; + TF1* funcV3; + TF1* funcV4; + // Connect to ccdb Service ccdb; Configurable ccdbNoLaterThan{"ccdbNoLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; @@ -134,6 +145,7 @@ struct FlowMc { histos.add("hPtNchGlobal", "Global production; pT (GeV/c); multiplicity", HistType::kTH2D, {axisPt, axisNch}); histos.add("hPtMCGen", "Monte Carlo Truth; pT (GeV/c);", {HistType::kTH1D, {axisPt}}); histos.add("hPtMCGlobal", "Monte Carlo Global; pT (GeV/c);", {HistType::kTH1D, {axisPt}}); + histos.add("hPhiWeightedTrDen", "corrected #phi distribution, considering track density", {HistType::kTH1D, {axisPhi}}); o2::framework::AxisSpec axis = axisPt; int nPtBins = axis.binEdges.size() - 1; @@ -187,6 +199,25 @@ struct FlowMc { corrconfigsReco.push_back(fGFWReco->GetCorrelatorConfig("poiN10 refN10 | olN10 {2} refP10 {-2}", "Ch10Gap22", kTRUE)); fGFWReco->CreateRegions(); } + + if (cfgTrackDensityCorrUse) { + std::vector pTEffBins = {0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.4, 1.8, 2.2, 2.6, 3.0}; + hFindPtBin = new TH1D("hFindPtBin", "hFindPtBin", pTEffBins.size() - 1, &pTEffBins[0]); + funcEff.resize(pTEffBins.size() - 1); + // LHC24g3 Eff + std::vector f1p0 = cfgTrackDensityP0; + std::vector f1p1 = cfgTrackDensityP1; + for (uint ifunc = 0; ifunc < pTEffBins.size() - 1; ifunc++) { + funcEff[ifunc] = new TF1(Form("funcEff%i", ifunc), "[0]+[1]*x", 0, 3000); + funcEff[ifunc]->SetParameters(f1p0[ifunc], f1p1[ifunc] * cfgTrackDensityCorrSlopeFactor); + } + funcV2 = new TF1("funcV2", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); + funcV2->SetParameters(0.0186111, 0.00351907, -4.38264e-05, 1.35383e-07, -3.96266e-10); + funcV3 = new TF1("funcV3", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); + funcV3->SetParameters(0.0174056, 0.000703329, -1.45044e-05, 1.91991e-07, -1.62137e-09); + funcV4 = new TF1("funcV4", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); + funcV4->SetParameters(0.008845, 0.000259668, -3.24435e-06, 4.54837e-08, -6.01825e-10); + } } void loadCorrections(uint64_t timestamp) @@ -305,6 +336,12 @@ struct FlowMc { fGFWReco->Clear(); } + double psi2Est = 0, psi3Est = 0, psi4Est = 0; + float wEPeff = 1; + double v2 = 0, v3 = 0, v4 = 0; + double q2x = 0, q2y = 0; + double q3x = 0, q3y = 0; + double q4x = 0, q4y = 0; for (auto const& mcParticle : mcParticles) { int pdgCode = std::abs(mcParticle.pdgCode()); if (pdgCode != PDG_t::kElectron && pdgCode != PDG_t::kMuonMinus && pdgCode != PDG_t::kPiPlus && pdgCode != kKPlus && pdgCode != PDG_t::kProton) @@ -318,9 +355,28 @@ struct FlowMc { for (auto const& track : tracks) { if (track.hasTPC() && track.hasITS()) nChGlobal++; + if (cfgTrackDensityCorrUse && cfgFlowCumulantEnabled) { + bool withinPtRef = (cfgCutPtRefMin < track.pt()) && (track.pt() < cfgCutPtRefMax); // within RF pT rang + if (withinPtRef) { + q2x += std::cos(2 * track.phi()); + q2y += std::sin(2 * track.phi()); + q3x += std::cos(3 * track.phi()); + q3y += std::sin(3 * track.phi()); + q4x += std::cos(4 * track.phi()); + q4y += std::sin(4 * track.phi()); + } + } } } } + if (cfgTrackDensityCorrUse && cfgFlowCumulantEnabled) { + psi2Est = std::atan2(q2y, q2x) / 2.; + psi3Est = std::atan2(q3y, q3x) / 3.; + psi4Est = std::atan2(q4y, q4x) / 4.; + v2 = funcV2->Eval(centrality); + v3 = funcV3->Eval(centrality); + v4 = funcV4->Eval(centrality); + } for (auto const& mcParticle : mcParticles) { // focus on bulk: e, mu, pi, k, p @@ -382,6 +438,19 @@ struct FlowMc { fWeights->fill(mcParticle.phi(), mcParticle.eta(), vtxz, mcParticle.pt(), 0, 0); if (!setCurrentParticleWeights(weff, wacc, mcParticle.phi(), mcParticle.eta(), mcParticle.pt(), vtxz)) continue; + if (cfgTrackDensityCorrUse && cfgFlowCumulantEnabled && withinPtRef) { + double fphi = v2 * std::cos(2 * (mcParticle.phi() - psi2Est)) + v3 * std::cos(3 * (mcParticle.phi() - psi3Est)) + v4 * std::cos(4 * (mcParticle.phi() - psi4Est)); + fphi = (1 + 2 * fphi); + int pTBinForEff = hFindPtBin->FindBin(mcParticle.pt()); + if (pTBinForEff >= 1 && pTBinForEff <= hFindPtBin->GetNbinsX()) { + wEPeff = funcEff[pTBinForEff - 1]->Eval(fphi * nChGlobal); + if (wEPeff > 0.) { + wEPeff = 1. / wEPeff; + weff *= wEPeff; + histos.fill(HIST("hPhiWeightedTrDen"), mcParticle.phi(), wacc * wEPeff); + } + } + } if (cfgFlowCumulantEnabled) { if (withinPtRef) From 5df0583caece54b1c1f484c0dcdcaaf9d8d9069e Mon Sep 17 00:00:00 2001 From: Victor Gonzalez Date: Wed, 19 Mar 2025 23:00:20 +0100 Subject: [PATCH 0766/1650] [PWGCF] DptDpt - DeltaPhi tracking, limited acceptance compensation (#10584) Co-authored-by: Victor --- PWGCF/TableProducer/dptdptfilter.h | 6 ++++++ .../Tasks/dptDptEfficiencyAndQc.cxx | 21 +++++++++++++------ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/PWGCF/TableProducer/dptdptfilter.h b/PWGCF/TableProducer/dptdptfilter.h index 576757499c4..474e341907d 100644 --- a/PWGCF/TableProducer/dptdptfilter.h +++ b/PWGCF/TableProducer/dptdptfilter.h @@ -254,6 +254,10 @@ struct DptDptTrackSelection { { maxDcazPtDep = ptDepCut; } + void setRequirePvContributor(bool pvc = true) + { + requirePvContributor = pvc; + } template bool isSelected(TrackObject const& track) const @@ -366,11 +370,13 @@ struct DptDptTrackSelection { globalRun3->stdTrackSelection->SetTrackType(o2::aod::track::TrackTypeEnum::Track); globalRun3->stdTrackSelection->ResetITSRequirements(); globalRun3->stdTrackSelection->SetRequireHitsInITSLayers(1, {0, 1, 2}); + globalRun3->setRequirePvContributor(true); DptDptTrackSelection* globalSDDRun3 = new DptDptTrackSelection(new TrackSelection(getGlobalTrackSelection()), outputList, "TType10Sdd"); globalSDDRun3->stdTrackSelection->SetTrackType(o2::aod::track::TrackTypeEnum::Track); globalSDDRun3->stdTrackSelection->ResetITSRequirements(); globalSDDRun3->stdTrackSelection->SetRequireNoHitsInITSLayers({0, 1, 2}); globalSDDRun3->stdTrackSelection->SetRequireHitsInITSLayers(1, {3}); + globalSDDRun3->setRequirePvContributor(true); addTrackFilter(globalRun3); addTrackFilter(globalSDDRun3); } break; diff --git a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx index 62ace1ab9ad..1ffb4edab80 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx @@ -587,6 +587,7 @@ struct QAExtraDataCollectingEngine { /* pairs histograms */ std::vector>>> fhPhiPhiA{2, {nsp, {nsp, nullptr}}}; std::vector>>> fhEtaEtaA{2, {nsp, {nsp, nullptr}}}; + std::vector>>> fhN2VsDeltaEtaVsDeltaPhi{2, {nsp, {nsp, nullptr}}}; TAxis ptAxis{analysis::dptdptfilter::ptbins, analysis::dptdptfilter::ptlow, analysis::dptdptfilter::ptup}; std::vector ptOfInterestBinMap{analysis::dptdptfilter::ptbins + 1, -1}; std::vector>>> fhInSectorDeltaPhiVsPhiPhiPerPtBinA{2, {nsp, {nsp, nullptr}}}; @@ -601,6 +602,7 @@ struct QAExtraDataCollectingEngine { AxisSpec phiAxis = {phibins, 0.0f, constants::math::TwoPI, "#varphi"}; AxisSpec phiSectorAxis = {72, 0.0f, kTpcPhiSectorWidth, "#varphi (mod(2#pi/18)) (rad)"}; AxisSpec deltaPhiAxis = {phibins, 0.0f, constants::math::TwoPI, "#Delta#varphi (rad)"}; + AxisSpec deltaEtaAxis = {2 * etabins - 1, etalow - etaup, etaup - etalow, "#Delta#eta"}; AxisSpec deltaPhiInSectorAxis = {144, -kTpcPhiSectorWidth, kTpcPhiSectorWidth, "#Delta#varphi (rad)"}; AxisSpec etaAxis = {etabins, etalow, etaup, "#eta"}; AxisSpec ptOfInterestAxis = {static_cast(ptBinsOfInterest.size()), 0.5f, static_cast(ptBinsOfInterest.size()) + 0.5f, "#it{p}_{T} (GeV/#it{c})"}; @@ -622,7 +624,8 @@ struct QAExtraDataCollectingEngine { HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTH2F, {phiAxis, phiAxis}); fhEtaEtaA[kindOfData][isp][jsp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("EtaEta_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTH2F, {etaAxis, etaAxis}); - /* first resize them to the actual configured size */ + fhN2VsDeltaEtaVsDeltaPhi[kindOfData][isp][jsp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("N2VsDeltaEtaDeltaPhi_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), + HTITLESTRING("%s%s pairs", tnames[isp].c_str(), tnames[jsp].c_str()), kTH2F, {deltaEtaAxis, deltaPhiAxis}); fhInSectorDeltaPhiVsPhiPhiPerPtBinA[kindOfData][isp][jsp] = ADDHISTOGRAM(THnSparse, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("DeltaPhiVsPhiPhiPt_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), HTITLESTRING("%s%s pairs, #it{p}_{T}: %s", tnames[isp].c_str(), tnames[jsp].c_str(), hPtRangesOfInterestTitle.c_str()), kTHnSparseF, {phiSectorAxis, phiSectorAxis, deltaPhiInSectorAxis, ptOfInterestAxis, ptOfInterestAxis}); @@ -638,6 +641,7 @@ struct QAExtraDataCollectingEngine { { using namespace efficiencyandqatask; using namespace analysis::dptdptfilter; + float deltaEtaSpan = etaup - etalow; /* we should only receive accepted tracks */ for (auto const& track1 : tracks1) { @@ -655,16 +659,21 @@ struct QAExtraDataCollectingEngine { } int ptBin2 = binForPt(track2); if (ptBin2 > 0) { - fhPhiPhiA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(track1.phi(), track2.phi()); + float deltaPhi = RecoDecay::constrainAngle(track1.phi() - track2.phi()); + float deltaEta = track1.eta() - track2.eta(); + float preWeight = 1 - std::abs(deltaEta) / deltaEtaSpan; + float weight = preWeight != 0 ? 1.0f / preWeight : 0.0f; + fhPhiPhiA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(track1.phi(), track2.phi(), weight); fhEtaEtaA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(track1.eta(), track2.eta()); + fhN2VsDeltaEtaVsDeltaPhi[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(deltaEta, deltaPhi, weight); if (static_cast(track1.phi() / kTpcPhiSectorWidth) == static_cast(track2.phi() / kTpcPhiSectorWidth)) { /* only if, for sure, both tracks are within the same sector */ float inTpcSectorPhi2 = std::fmod(track2.phi(), kTpcPhiSectorWidth); - float deltaPhi = inTpcSectorPhi1 - inTpcSectorPhi2; - double values[] = {inTpcSectorPhi1, inTpcSectorPhi2, deltaPhi, static_cast(ptBin1), static_cast(ptBin2)}; - fhInSectorDeltaPhiVsPhiPhiPerPtBinA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(values); + float inTpcSectorDeltaPhi = inTpcSectorPhi1 - inTpcSectorPhi2; + double values[] = {inTpcSectorPhi1, inTpcSectorPhi2, inTpcSectorDeltaPhi, static_cast(ptBin1), static_cast(ptBin2)}; + fhInSectorDeltaPhiVsPhiPhiPerPtBinA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(values, weight); values[0] = track1.eta(), values[1] = track2.eta(); - fhInSectorDeltaPhiVsEtaEtaPerPtBinA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(values); + fhInSectorDeltaPhiVsEtaEtaPerPtBinA[kindOfData][track1.trackacceptedid()][track2.trackacceptedid()]->Fill(values, weight); } } } From 057c86dd491c3d4fd5ace459e6b0e2ed8d9d612b Mon Sep 17 00:00:00 2001 From: Tanu Gahlaut <154991749+TGahlaut1@users.noreply.github.com> Date: Thu, 20 Mar 2025 03:33:52 +0530 Subject: [PATCH 0767/1650] [PWGCF] [PWGCF} Correction in histograms (#10582) --- PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx b/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx index d7aa4698068..c2b1a3d71ab 100644 --- a/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx @@ -253,8 +253,8 @@ struct MeanPtFlucId { hist.add("QA/after/h_Pt_weighted", "weighted pT distribution", kTH1D, {axisPt}); hist.add("QA/after/h_Pt2_weighted", "weighted pT distribution", kTH1D, {axisPt2}); hist.add("QA/after/h2_Pt_NFT0M", "p_{T} in Multiplicity Classes ", kTH2D, {{axisPt}, {axisMultFT0M}}); - hist.add("QA/after/h_PtEtaVz_NFT0M", "p_{T}, #eta, #phi in Multiplicity Classes ", kTHnSparseD, {{axisPt}, {axisEta}, {axisPhi}, {axisMultFT0M}}); - hist.add("QA/after/h_PtEtaVz_centFT0M", "p_{T}, #eta, #phi in centrality Classes ", kTHnSparseD, {{axisPt}, {axisEta}, {axisPhi}, {axisCentFT0C}}); + hist.add("QA/after/h_PtEtaPhi_NFT0M", "p_{T}, #eta, #phi in Multiplicity Classes ", kTHnSparseD, {{axisPt}, {axisEta}, {axisPhi}, {axisMultFT0M}}); + hist.add("QA/after/h_PtEtaPhi_centFT0M", "p_{T}, #eta, #phi in centrality Classes ", kTHnSparseD, {{axisPt}, {axisEta}, {axisPhi}, {axisCentFT0C}}); hist.add("QA/after/h2_pt_nch", "Truth", kTH2D, {{axisMult}, {axisPt}}); hist.add("QA/after/h3_nft0m_pt_nch", "Reco", kTHnSparseD, {{axisMult}, {axisPt}, {axisMultFT0M}}); hist.add("QA/after/h2_pt_nch_prof", "Truth", kTProfile, {axisMult}); @@ -291,8 +291,8 @@ struct MeanPtFlucId { hist.add("QA/Pion/h2_Pt_Eta_weighted", "p_{T} vs #eta weighted", kTH2D, {{axisEta}, {axisPt}}); hist.add("QA/Pion/h2_Pt_NFT0M", "p_{T} in Multiplicity Classes ", kTH2D, {{axisPt}, {axisMultFT0M}}); - hist.add("QA/Pion/h_PtEtaVz_NFT0M", "p_{T}, #eta, #phi in Multiplicity Classes ", kTHnSparseD, {{axisPt}, {axisEta}, {axisPhi}, {axisMultFT0M}}); - hist.add("QA/Pion/h_PtEtaVz_centFT0M", "p_{T}, #eta, #phi in centrality Classes ", kTHnSparseD, {{axisPt}, {axisEta}, {axisPhi}, {axisCentFT0C}}); + hist.add("QA/Pion/h_PtEtaPhi_NFT0M", "p_{T}, #eta, #phi in Multiplicity Classes ", kTHnSparseD, {{axisPt}, {axisEta}, {axisPhi}, {axisMultFT0M}}); + hist.add("QA/Pion/h_PtEtaPhi_centFT0M", "p_{T}, #eta, #phi in centrality Classes ", kTHnSparseD, {{axisPt}, {axisEta}, {axisPhi}, {axisCentFT0C}}); hist.add("QA/Pion/h2_PtTruth_NFT0M", "p_{T} in Multiplicity Classes ", kTH2D, {{axisPt}, {axisMultFT0M}}); hist.add("QA/Pion/h2_pt_nch", "Reco", kTH2D, {{axisMult}, {axisPt}}); @@ -367,8 +367,8 @@ struct MeanPtFlucId { hist.add("Gen/h2_NTPC_NSim", "Reco vs Truth Multiplicty TPC", kTH2D, {{axisMultTPC}, {axisMultTPC}}); hist.add("Gen/h2_NChSim_NSim", "Truth Multiplicty NCh vs NTPC", kTH2D, {{axisMultTPC}, {axisMultTPC}}); - hist.add("Gen/Charged/h_PtEtaVz_NFT0M", "p_{T}, #eta, #phi in Multiplicity Classes ", kTHnSparseD, {{axisPt}, {axisEta}, {axisPhi}, {axisMultFT0M}}); - hist.add("Gen/Charged/h_PtEtaVz_centFT0M", "p_{T}, #eta, #phi in centrality Classes ", kTHnSparseD, {{axisPt}, {axisEta}, {axisPhi}, {axisCentFT0C}}); + hist.add("Gen/Charged/h_PtEtaPhi_NFT0M", "p_{T}, #eta, #phi in Multiplicity Classes ", kTHnSparseD, {{axisPt}, {axisEta}, {axisPhi}, {axisMultFT0M}}); + hist.add("Gen/Charged/h_PtEtaPhi_centFT0M", "p_{T}, #eta, #phi in centrality Classes ", kTHnSparseD, {{axisPt}, {axisEta}, {axisPhi}, {axisCentFT0C}}); hist.add("Gen/Charged/h_EtaTruth", "#eta ", kTH1D, {axisEta}); hist.add("Gen/Charged/h_PhiTruth", "#phi ", kTH1D, {axisPhi}); hist.add("Gen/Charged/h_PtTruth", "p_{T} ", kTH1D, {axisPt}); @@ -667,8 +667,8 @@ struct MeanPtFlucId { hist.fill(HIST("QA/after/h_Pt"), track.pt()); hist.fill(HIST("QA/after/h_Pt2"), track.pt() * track.pt()); hist.fill(HIST("QA/after/h2_Pt_NFT0M"), track.pt(), nFT0M); - hist.fill(HIST("QA/after/h_PtEtaVz_NFT0M"), track.pt(), track.eta(), track.phi(), nFT0M); - hist.fill(HIST("QA/after/h_PtEtaVz_centFT0M"), track.pt(), track.eta(), track.phi(), centFT0M); + hist.fill(HIST("QA/after/h_PtEtaPhi_NFT0M"), track.pt(), track.eta(), track.phi(), nFT0M); + hist.fill(HIST("QA/after/h_PtEtaPhi_centFT0M"), track.pt(), track.eta(), track.phi(), centFT0M); hist.fill(HIST("QA/after/h2_PvsPinner"), track.p(), track.tpcInnerParam()); hist.fill(HIST("QA/after/h2_Pt_Eta"), track.eta(), track.pt()); hist.fill(HIST("QA/after/h_DcaZ"), track.dcaZ()); @@ -751,7 +751,7 @@ struct MeanPtFlucId { // Fill after PID cut QA hist: template - void fillIdParticleQAHistos(T const& track, double rap, double nSigmaTPC, double nSigmaTOF, int nFT0M, double vtxZ, double centFT0M, T1 hWeightPt, T1 hPurePt, T2 hWeightPtY, T2 hWeightPtEta, bool cfgWeightPtId, bool cfgWeightPtYId, bool cfgWeightPtEtaId, bool cfgPurityId, int& N, double& NW, double& Q1, double& Q2, double& Q3, double& Q4, float& weight) + void fillIdParticleQAHistos(T const& track, double rap, double nSigmaTPC, double nSigmaTOF, int nFT0M, double centFT0M, T1 hWeightPt, T1 hPurePt, T2 hWeightPtY, T2 hWeightPtEta, bool cfgWeightPtId, bool cfgWeightPtYId, bool cfgWeightPtEtaId, bool cfgPurityId, int& N, double& NW, double& Q1, double& Q2, double& Q3, double& Q4, float& weight) { double pt = track.pt(); double eta = track.eta(); @@ -775,8 +775,8 @@ struct MeanPtFlucId { hist.fill(HIST(Dire[Mode]) + HIST("h_Pt"), pt); hist.fill(HIST(Dire[Mode]) + HIST("h_Pt2"), pt * pt); hist.fill(HIST(Dire[Mode]) + HIST("h2_Pt_NFT0M"), pt, nFT0M); - hist.fill(HIST(Dire[Mode]) + HIST("h_PtEtaVz_NFT0M"), pt, eta, vtxZ, nFT0M); - hist.fill(HIST(Dire[Mode]) + HIST("h_PtEtaVz_centFT0M"), pt, eta, vtxZ, centFT0M); + hist.fill(HIST(Dire[Mode]) + HIST("h_PtEtaPhi_NFT0M"), pt, eta, track.phi(), nFT0M); + hist.fill(HIST(Dire[Mode]) + HIST("h_PtEtaPhi_centFT0M"), pt, eta, track.phi(), centFT0M); hist.fill(HIST(Dire[Mode]) + HIST("h2_Pt_Eta"), eta, pt); if (track.sign() > 0) { hist.fill(HIST(Dire[Mode]) + HIST("h_PtPos"), pt); @@ -966,15 +966,15 @@ struct MeanPtFlucId { } if (selPi(track)) { - fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, vtxZ, centFT0M, hWeightPtPi, hPurePtPi, hWeightPtRapPi, hWeightPtEtaPi, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi, wghtPi); + fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, centFT0M, hWeightPtPi, hPurePtPi, hWeightPtRapPi, hWeightPtEtaPi, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi, wghtPi); } if (selKa(track)) { - fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, vtxZ, centFT0M, hWeightPtKa, hPurePtKa, hWeightPtRapKa, hWeightPtEtaKa, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka, wghtKa); + fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, centFT0M, hWeightPtKa, hPurePtKa, hWeightPtRapKa, hWeightPtEtaKa, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka, wghtKa); } if (selPr(track)) { - fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, vtxZ, centFT0M, hWeightPtPr, hPurePtPr, hWeightPtRapPr, hWeightPtEtaPr, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr, wghtPr); + fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, centFT0M, hWeightPtPr, hPurePtPr, hWeightPtRapPr, hWeightPtEtaPr, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr, wghtPr); } } } @@ -1032,14 +1032,14 @@ struct MeanPtFlucId { if (selPi(track)) { ptPi = track.pt(); - fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, vtxZ, centFT0M, hWeightPtPi, hPurePtPi, hWeightPtRapPi, hWeightPtEtaPi, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi, wghtPi); + fillIdParticleQAHistos(track, rapPi, nSigmaTPCPi, nSigmaTOFPi, nFT0M, centFT0M, hWeightPtPi, hPurePtPi, hWeightPtRapPi, hWeightPtEtaPi, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nPi, nPiW, q1Pi, q2Pi, q3Pi, q4Pi, wghtPi); if (std::abs(pid) == kPiPlus) { fillPtMCHist(ptPi, eta, rapPi, nFT0M, pid, kPiPlus, kPiMinus); } } if (selKa(track)) { ptKa = track.pt(); - fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, vtxZ, centFT0M, hWeightPtKa, hPurePtKa, hWeightPtRapKa, hWeightPtEtaKa, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka, wghtKa); + fillIdParticleQAHistos(track, rapKa, nSigmaTPCKa, nSigmaTOFKa, nFT0M, centFT0M, hWeightPtKa, hPurePtKa, hWeightPtRapKa, hWeightPtEtaKa, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nKa, nKaW, q1Ka, q2Ka, q3Ka, q4Ka, wghtKa); if (std::abs(pid) == kKPlus) { fillPtMCHist(ptKa, eta, rapKa, nFT0M, pid, kKPlus, kKMinus); } @@ -1047,7 +1047,7 @@ struct MeanPtFlucId { if (selPr(track)) { ptPr = track.pt(); - fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, vtxZ, centFT0M, hWeightPtPr, hPurePtPr, hWeightPtRapPr, hWeightPtEtaPr, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr, wghtPr); + fillIdParticleQAHistos(track, rapPr, nSigmaTPCPr, nSigmaTOFPr, nFT0M, centFT0M, hWeightPtPr, hPurePtPr, hWeightPtRapPr, hWeightPtEtaPr, cfgWeightPtId, cfgWeightPtYId, cfgWeightPtEtaId, cfgPurityId, nPr, nPrW, q1Pr, q2Pr, q3Pr, q4Pr, wghtPr); if (std::abs(pid) == kProton) { fillPtMCHist(ptPr, eta, rapPr, nFT0M, pid, kProton, kProtonBar); } @@ -1092,9 +1092,9 @@ struct MeanPtFlucId { hist.fill(HIST("Gen/Charged/h_EtaTruth"), etaSim); hist.fill(HIST("Gen/Charged/h_PhiTruth"), mcPart.phi()); - hist.fill(HIST("Gen/Pion/h_PhiTruth"), mcPart.phi()); - hist.fill(HIST("Gen/Pion/h_PtEtaVz_NFT0M"), ptChSim, etaSim, mcPart.phi(), nFT0M); - hist.fill(HIST("Gen/Pion/h_PtEtaVz_centFT0M"), ptChSim, etaSim, mcPart.phi(), centFT0M); + hist.fill(HIST("Gen/Charged/h_PhiTruth"), mcPart.phi()); + hist.fill(HIST("Gen/Charged/h_PtEtaPhi_NFT0M"), ptChSim, etaSim, mcPart.phi(), nFT0M); + hist.fill(HIST("Gen/Charged/h_PtEtaPhi_centFT0M"), ptChSim, etaSim, mcPart.phi(), centFT0M); if (std::abs(pid) == kPiPlus && mcPart.pt() >= cfgCutPiPtMin) { rapSim = mcPart.y(); @@ -1104,8 +1104,8 @@ struct MeanPtFlucId { fillPtMCHist(ptPiSim, etaSim, rapSim, nFT0M, pid, kPiPlus, kPiMinus); hist.fill(HIST("Gen/Pion/h_PhiTruth"), mcPart.phi()); - hist.fill(HIST("Gen/Pion/h_PtEtaVz_NFT0M"), ptPiSim, etaSim, mcPart.phi(), nFT0M); - hist.fill(HIST("Gen/Pion/h_PtEtaVz_centFT0M"), ptPiSim, etaSim, mcPart.phi(), centFT0M); + hist.fill(HIST("Gen/Pion/h_PtEtaPhi_NFT0M"), ptPiSim, etaSim, mcPart.phi(), nFT0M); + hist.fill(HIST("Gen/Pion/h_PtEtaPhi_centFT0M"), ptPiSim, etaSim, mcPart.phi(), centFT0M); } if (std::abs(pid) == kKPlus && mcPart.pt() >= cfgCutKaPtMin) { @@ -1115,8 +1115,8 @@ struct MeanPtFlucId { fillPtMCHist(ptKaSim, etaSim, rapSim, nFT0M, pid, kKPlus, kKMinus); hist.fill(HIST("Gen/Kaon/h_PhiTruth"), mcPart.phi()); - hist.fill(HIST("Gen/Kaon/h_PtEtaVz_NFT0M"), ptKaSim, etaSim, mcPart.phi(), nFT0M); - hist.fill(HIST("Gen/Kaon/h_PtEtaVz_centFT0M"), ptKaSim, etaSim, mcPart.phi(), centFT0M); + hist.fill(HIST("Gen/Kaon/h_PtEtaPhi_NFT0M"), ptKaSim, etaSim, mcPart.phi(), nFT0M); + hist.fill(HIST("Gen/Kaon/h_PtEtaPhi_centFT0M"), ptKaSim, etaSim, mcPart.phi(), centFT0M); } if (std::abs(pid) == kProton && mcPart.pt() >= cfgCutPrPtMin) { @@ -1126,8 +1126,8 @@ struct MeanPtFlucId { fillPtMCHist(ptPrSim, etaSim, rapSim, nFT0M, pid, kProton, kProtonBar); hist.fill(HIST("Gen/Proton/h_PhiTruth"), mcPart.phi()); - hist.fill(HIST("Gen/Proton/h_PtEtaVz_NFT0M"), ptPrSim, etaSim, mcPart.phi(), nFT0M); - hist.fill(HIST("Gen/Proton/h_PtEtaVz_centFT0M"), ptPrSim, etaSim, mcPart.phi(), centFT0M); + hist.fill(HIST("Gen/Proton/h_PtEtaPhi_NFT0M"), ptPrSim, etaSim, mcPart.phi(), nFT0M); + hist.fill(HIST("Gen/Proton/h_PtEtaPhi_centFT0M"), ptPrSim, etaSim, mcPart.phi(), centFT0M); } } } From 9670f3062d08efb3a557ad804c7fc138d502d43f Mon Sep 17 00:00:00 2001 From: aimeric-landou <46970521+aimeric-landou@users.noreply.github.com> Date: Thu, 20 Mar 2025 01:07:13 +0100 Subject: [PATCH 0768/1650] [PWGJE] jetSpectraCharged: eta selection fixes for efficiency and purity, checkLeadConstituentPtForMcpJets fixes (#10579) --- PWGJE/Tasks/jetSpectraCharged.cxx | 173 ++++++++++++++++++------------ 1 file changed, 102 insertions(+), 71 deletions(-) diff --git a/PWGJE/Tasks/jetSpectraCharged.cxx b/PWGJE/Tasks/jetSpectraCharged.cxx index afcdbf31ea2..60319609ec4 100644 --- a/PWGJE/Tasks/jetSpectraCharged.cxx +++ b/PWGJE/Tasks/jetSpectraCharged.cxx @@ -83,7 +83,8 @@ struct JetSpectraCharged { Configurable checkGeoPtMatched{"checkGeoPtMatched", false, "0: turn off geometry and pT matching, 1: do geometry and pT matching"}; Configurable acceptSplitCollisions{"acceptSplitCollisions", 0, "0: only look at mcCollisions that are not split; 1: accept split mcCollisions, 2: accept split mcCollisions but only look at the first reco collision associated with it"}; Configurable skipMBGapEvents{"skipMBGapEvents", false, "flag to choose to reject min. bias gap events; jet-level rejection can also be applied at the jet finder level for jets only, here rejection is applied for collision and track process functions for the first time, and on jets in case it was set to false at the jet finder level"}; - Configurable checkLeadConstituentMinPtForMcpJets{"checkLeadConstituentMinPtForMcpJets", false, "flag to choose whether particle level jets should have their lead track pt above leadingConstituentPtMin to be accepted; off by default, as leadingConstituentPtMin cut is only applied on MCD jets for the Pb-Pb analysis using pp MC anchored to Pb-Pb for the response matrix"}; + Configurable checkLeadConstituentPtForMcpJets{"checkLeadConstituentPtForMcpJets", false, "flag to choose whether particle level jets should have their lead track pt above leadingConstituentPtMin to be accepted; off by default, as leadingConstituentPtMin cut is only applied on MCD jets for the Pb-Pb analysis using pp MC anchored to Pb-Pb for the response matrix"}; + Configurable checkMcdEtaForMatchedJets{"checkMcdEtaForMatchedJets", false, "flag to choose whether matched jets should have the eta of the mcd jet within acceptance; off by default, as it sould not be checked for mcd jets for efficiency and response matrix: https://alice-notes.web.cern.ch/system/files/notes/analysis/34/2013-Sep-19-analysis_note-AnalysisNoteChargedJets.pdf"}; std::vector eventSelectionBits; int trackSelection = -1; @@ -195,27 +196,33 @@ struct JetSpectraCharged { if (doprocessJetsMatched || doprocessJetsMatchedWeighted) { if (checkGeoMatched) { - registry.add("h2_jet_pt_mcd_jet_pt_mcp_matchedgeo", "pT mcd vs. pT mcp;#it{p}_{T,jet}^{mcd} (GeV/#it{c});#it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, jetPtAxis}}); + registry.add("h2_jet_pt_mcd_jet_pt_mcp_matchedgeo_mcdetaconstraint", "pT mcd vs. pT mcp;#it{p}_{T,jet}^{mcd} (GeV/#it{c});#it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, jetPtAxis}}); + registry.add("h2_jet_pt_mcd_jet_pt_mcp_matchedgeo_mcpetaconstraint", "pT mcd vs. pT mcp;#it{p}_{T,jet}^{mcd} (GeV/#it{c});#it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, jetPtAxis}}); registry.add("h2_jet_eta_mcd_jet_eta_mcp_matchedgeo", "Eta mcd vs. Eta mcp;#eta_{jet}^{mcd};#eta_{jet}^{mcp}", {HistType::kTH2F, {jetEtaAxis, jetEtaAxis}}); - registry.add("h2_jet_phi_mcd_jet_phi_mcp_matchedgeo", "Phi mcd vs. Phi mcp;#varphi_{jet}^{mcd};#varphi_{jet}^{mcp}", {HistType::kTH2F, {phiAxis, phiAxis}}); + registry.add("h2_jet_phi_mcd_jet_phi_mcp_matchedgeo_mcdetaconstraint", "Phi mcd vs. Phi mcp;#varphi_{jet}^{mcd};#varphi_{jet}^{mcp}", {HistType::kTH2F, {phiAxis, phiAxis}}); + registry.add("h2_jet_phi_mcd_jet_phi_mcp_matchedgeo_mcpetaconstraint", "Phi mcd vs. Phi mcp;#varphi_{jet}^{mcd};#varphi_{jet}^{mcp}", {HistType::kTH2F, {phiAxis, phiAxis}}); registry.add("h2_jet_ntracks_mcd_jet_ntracks_mcp_matchedgeo", "Ntracks mcd vs. Ntracks mcp;N_{jet tracks}^{mcd};N_{jet tracks}^{mcp}", {HistType::kTH2F, {{200, -0.5, 199.5}, {200, -0.5, 199.5}}}); registry.add("h2_jet_pt_mcp_jet_pt_diff_matchedgeo", "jet mcp pT vs. delta pT / jet mcp pt;#it{p}_{T,jet}^{mcp} (GeV/#it{c}); (#it{p}_{T,jet}^{mcp} (GeV/#it{c}) - #it{p}_{T,jet}^{mcd} (GeV/#it{c})) / #it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, {1000, -5.0, 2.0}}}); registry.add("h2_jet_pt_mcd_jet_pt_diff_matchedgeo", "jet mcd pT vs. delta pT / jet mcd pt;#it{p}_{T,jet}^{mcd} (GeV/#it{c}); (#it{p}_{T,jet}^{mcd} (GeV/#it{c}) - #it{p}_{T,jet}^{mcp} (GeV/#it{c})) / #it{p}_{T,jet}^{mcd} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, {1000, -5.0, 2.0}}}); registry.add("h2_jet_pt_mcp_jet_pt_ratio_matchedgeo", "jet mcp pT vs. jet mcd pT / jet mcp pt;#it{p}_{T,jet}^{mcp} (GeV/#it{c}); #it{p}_{T,jet}^{mcd} (GeV/#it{c}) / #it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, {1000, -5.0, 5.0}}}); } if (checkPtMatched) { - registry.add("h2_jet_pt_mcd_jet_pt_mcp_matchedpt", "pT mcd vs. pT mcp;#it{p}_{T,jet}^{mcd} (GeV/#it{c});#it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, jetPtAxis}}); + registry.add("h2_jet_pt_mcd_jet_pt_mcp_matchedpt_mcdetaconstraint", "pT mcd vs. pT mcp;#it{p}_{T,jet}^{mcd} (GeV/#it{c});#it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, jetPtAxis}}); + registry.add("h2_jet_pt_mcd_jet_pt_mcp_matchedpt_mcpetaconstraint", "pT mcd vs. pT mcp;#it{p}_{T,jet}^{mcd} (GeV/#it{c});#it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, jetPtAxis}}); registry.add("h2_jet_eta_mcd_jet_eta_mcp_matchedpt", "Eta mcd vs. Eta mcp;#eta_{jet}^{mcd};#eta_{jet}^{mcp}", {HistType::kTH2F, {jetEtaAxis, jetEtaAxis}}); - registry.add("h2_jet_phi_mcd_jet_phi_mcp_matchedgpt", "Phi mcd vs. Phi mcp;#varphi_{jet}^{mcd};#varphi_{jet}^{mcp}", {HistType::kTH2F, {phiAxis, phiAxis}}); + registry.add("h2_jet_phi_mcd_jet_phi_mcp_matchedgpt_mcdetaconstraint", "Phi mcd vs. Phi mcp;#varphi_{jet}^{mcd};#varphi_{jet}^{mcp}", {HistType::kTH2F, {phiAxis, phiAxis}}); + registry.add("h2_jet_phi_mcd_jet_phi_mcp_matchedgpt_mcpetaconstraint", "Phi mcd vs. Phi mcp;#varphi_{jet}^{mcd};#varphi_{jet}^{mcp}", {HistType::kTH2F, {phiAxis, phiAxis}}); registry.add("h2_jet_ntracks_mcd_jet_ntracks_mcp_matchedpt", "Ntracks mcd vs. Ntracks mcp;N_{jet tracks}^{mcd};N_{jet tracks}^{mcp}", {HistType::kTH2F, {{200, -0.5, 199.5}, {200, -0.5, 199.5}}}); registry.add("h2_jet_pt_mcp_jet_pt_diff_matchedpt", "jet mcp pT vs. delta pT / jet mcp pt;#it{p}_{T,jet}^{mcp} (GeV/#it{c}); (#it{p}_{T,jet}^{mcp} (GeV/#it{c}) - #it{p}_{T,jet}^{mcd} (GeV/#it{c})) / #it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, {1000, -5.0, 2.0}}}); registry.add("h2_jet_pt_mcd_jet_pt_diff_matchedpt", "jet mcd pT vs. delta pT / jet mcd pt;#it{p}_{T,jet}^{mcd} (GeV/#it{c}); (#it{p}_{T,jet}^{mcd} (GeV/#it{c}) - #it{p}_{T,jet}^{mcp} (GeV/#it{c})) / #it{p}_{T,jet}^{mcd} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, {1000, -5.0, 2.0}}}); registry.add("h2_jet_pt_mcp_jet_pt_ratio_matchedpt", "jet mcp pT vs. jet mcd pT / jet mcp pt;#it{p}_{T,jet}^{mcp} (GeV/#it{c}); #it{p}_{T,jet}^{mcd} (GeV/#it{c}) / #it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, {1000, -5.0, 5.0}}}); } if (checkGeoPtMatched) { - registry.add("h2_jet_pt_mcd_jet_pt_mcp_matchedgeopt", "pT mcd vs. pT mcp;#it{p}_{T,jet}^{mcd} (GeV/#it{c});#it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, jetPtAxis}}); + registry.add("h2_jet_pt_mcd_jet_pt_mcp_matchedgeopt_mcdetaconstraint", "pT mcd vs. pT mcp;#it{p}_{T,jet}^{mcd} (GeV/#it{c});#it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, jetPtAxis}}); + registry.add("h2_jet_pt_mcd_jet_pt_mcp_matchedgeopt_mcpetaconstraint", "pT mcd vs. pT mcp;#it{p}_{T,jet}^{mcd} (GeV/#it{c});#it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, jetPtAxis}}); registry.add("h2_jet_eta_mcd_jet_eta_mcp_matchedgeopt", "Eta mcd vs. Eta mcp;#eta_{jet}^{mcd};#eta_{jet}^{mcp}", {HistType::kTH2F, {jetEtaAxis, jetEtaAxis}}); - registry.add("h2_jet_phi_mcd_jet_phi_mcp_matchedgeopt", "Phi mcd vs. Phi mcp;#varphi_{jet}^{mcd};#varphi_{jet}^{mcp}", {HistType::kTH2F, {phiAxis, phiAxis}}); + registry.add("h2_jet_phi_mcd_jet_phi_mcp_matchedgeopt_mcdetaconstraint", "Phi mcd vs. Phi mcp;#varphi_{jet}^{mcd};#varphi_{jet}^{mcp}", {HistType::kTH2F, {phiAxis, phiAxis}}); + registry.add("h2_jet_phi_mcd_jet_phi_mcp_matchedgeopt_mcpetaconstraint", "Phi mcd vs. Phi mcp;#varphi_{jet}^{mcd};#varphi_{jet}^{mcp}", {HistType::kTH2F, {phiAxis, phiAxis}}); registry.add("h2_jet_ntracks_mcd_jet_ntracks_mcp_matchedgeopt", "Ntracks mcd vs. Ntracks mcp;N_{jet tracks}^{mcd};N_{jet tracks}^{mcp}", {HistType::kTH2F, {{200, -0.5, 199.5}, {200, -0.5, 199.5}}}); registry.add("h2_jet_pt_mcp_jet_pt_diff_matchedgeopt", "jet mcp pT vs. delta pT / jet mcp pt;#it{p}_{T,jet}^{mcp} (GeV/#it{c}); (#it{p}_{T,jet}^{mcp} (GeV/#it{c}) - #it{p}_{T,jet}^{mcd} (GeV/#it{c})) / #it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, {1000, -5.0, 2.0}}}); registry.add("h2_jet_pt_mcd_jet_pt_diff_matchedgeopt", "jet mcd pT vs. delta pT / jet mcd pt;#it{p}_{T,jet}^{mcd} (GeV/#it{c}); (#it{p}_{T,jet}^{mcd} (GeV/#it{c}) - #it{p}_{T,jet}^{mcp} (GeV/#it{c})) / #it{p}_{T,jet}^{mcd} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxis, {1000, -5.0, 2.0}}}); @@ -227,10 +234,11 @@ struct JetSpectraCharged { registry.add("h_mc_collisions_matched", "mc collisions status;event status;entries", {HistType::kTH1F, {{5, 0.0, 5.0}}}); registry.add("h_mcd_events_matched", "mcd event status;event status;entries", {HistType::kTH1F, {{5, 0.0, 5.0}}}); registry.add("h_mc_rho_matched", "mc collision rho;#rho (GeV/#it{c}); counts", {HistType::kTH1F, {{500, -100.0, 500.0}}}); - registry.add("h2_mcd_jet_pt_mcp_jet_pt_matchedgeo_rhoareasubtracted", "corr pT mcd vs. corr cpT mcp;#it{p}_{T,jet}^{mcd} (GeV/#it{c});#it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxisRhoAreaSub, jetPtAxisRhoAreaSub}}); - registry.add("h2_mcp_jet_pt_jet_pt_diff_matchedgeo_rhoareasubtracted", "jet mcp corr pT vs. corr delta pT / jet mcp corr pt;#it{p}_{T,jet}^{mcp} (GeV/#it{c}); (#it{p}_{T,jet}^{mcp} (GeV/#it{c}) - #it{p}_{T,jet}^{mcd} (GeV/#it{c})) / #it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxisRhoAreaSub, {1000, -5.0, 5.0}}}); - registry.add("h2_mcd_jet_pt_jet_pt_diff_matchedgeo_rhoareasubtracted", "jet mcd corr pT vs. corr delta pT / jet mcd corr pt;#it{p}_{T,jet}^{mcd} (GeV/#it{c}); (#it{p}_{T,jet}^{mcd} (GeV/#it{c}) - #it{p}_{T,jet}^{mcp} (GeV/#it{c})) / #it{p}_{T,jet}^{mcd} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxisRhoAreaSub, {1000, -5.0, 5.0}}}); - registry.add("h2_mcp_jet_pt_jet_pt_ratio_matchedgeo_rhoareasubtracted", "jet mcp corr pT vs. jet mcd corr pT / jet mcp corr pt;#it{p}_{T,jet}^{mcp} (GeV/#it{c}); #it{p}_{T,jet}^{mcd} (GeV/#it{c}) / #it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxisRhoAreaSub, {1000, -5.0, 5.0}}}); + registry.add("h2_jet_pt_mcd_jet_pt_mcp_matchedgeo_rhoareasubtracted_mcdetaconstraint", "corr pT mcd vs. corr cpT mcp;#it{p}_{T,jet}^{mcd} (GeV/#it{c});#it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxisRhoAreaSub, jetPtAxisRhoAreaSub}}); + registry.add("h2_jet_pt_mcd_jet_pt_mcp_matchedgeo_rhoareasubtracted_mcpetaconstraint", "corr pT mcd vs. corr cpT mcp;#it{p}_{T,jet}^{mcd} (GeV/#it{c});#it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxisRhoAreaSub, jetPtAxisRhoAreaSub}}); + registry.add("h2_jet_pt_mcp_jet_pt_diff_matchedgeo_rhoareasubtracted", "jet mcp corr pT vs. corr delta pT / jet mcp corr pt;#it{p}_{T,jet}^{mcp} (GeV/#it{c}); (#it{p}_{T,jet}^{mcp} (GeV/#it{c}) - #it{p}_{T,jet}^{mcd} (GeV/#it{c})) / #it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxisRhoAreaSub, {1000, -5.0, 5.0}}}); + registry.add("h2_jet_pt_mcd_jet_pt_diff_matchedgeo_rhoareasubtracted", "jet mcd corr pT vs. corr delta pT / jet mcd corr pt;#it{p}_{T,jet}^{mcd} (GeV/#it{c}); (#it{p}_{T,jet}^{mcd} (GeV/#it{c}) - #it{p}_{T,jet}^{mcp} (GeV/#it{c})) / #it{p}_{T,jet}^{mcd} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxisRhoAreaSub, {1000, -5.0, 5.0}}}); + registry.add("h2_jet_pt_mcp_jet_pt_ratio_matchedgeo_rhoareasubtracted", "jet mcp corr pT vs. jet mcd corr pT / jet mcp corr pt;#it{p}_{T,jet}^{mcp} (GeV/#it{c}); #it{p}_{T,jet}^{mcd} (GeV/#it{c}) / #it{p}_{T,jet}^{mcp} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxisRhoAreaSub, {1000, -5.0, 5.0}}}); } } @@ -252,6 +260,9 @@ struct JetSpectraCharged { if (!checkConstituentMinPt && !checkConstituentMaxPt) { checkConstituentPt = false; } + if (mcLevelIsParticleLevel && !checkLeadConstituentPtForMcpJets) { + checkConstituentPt = false; + } if (checkConstituentPt) { bool isMinLeadingConstituent = !checkConstituentMinPt; @@ -260,7 +271,7 @@ struct JetSpectraCharged { for (const auto& constituent : jet.template tracks_as()) { double pt = constituent.pt(); - if ((!checkLeadConstituentMinPtForMcpJets && mcLevelIsParticleLevel) || (checkConstituentMinPt && pt >= leadingConstituentPtMin)) { // if the jet is mcp level and checkLeadConstituentMinPtForMcpJets is true, then the pt of the leading track of that jet does not need to be below the defined leadingConstituentPtMin cut + if (checkConstituentMinPt && pt >= leadingConstituentPtMin) { isMinLeadingConstituent = true; } if (checkConstituentMaxPt && pt > leadingConstituentPtMax) { @@ -369,68 +380,92 @@ struct JetSpectraCharged { } template - void fillMatchedHistograms(TBase const& jetBase, float weight = 1.0) + void fillMatchedHistograms(TBase const& jetMCD, float weight = 1.0) { float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); - if (jetBase.pt() > pTHatMaxMCD * pTHat) { + if (jetMCD.pt() > pTHatMaxMCD * pTHat) { return; } // fill geometry matched histograms if (checkGeoMatched) { - if (jetBase.has_matchedJetGeo()) { - for (const auto& jetTag : jetBase.template matchedJetGeo_as>()) { - if (jetTag.pt() > pTHatMaxMCD * pTHat) { + if (jetMCD.has_matchedJetGeo()) { + for (const auto& jetMCP : jetMCD.template matchedJetGeo_as>()) { + if (jetMCP.pt() > pTHatMaxMCP * pTHat) { continue; } - if (jetBase.r() == round(selectedJetsRadius * 100.0f)) { - double dpt = jetTag.pt() - jetBase.pt(); - registry.fill(HIST("h2_jet_pt_mcd_jet_pt_mcp_matchedgeo"), jetBase.pt(), jetTag.pt(), weight); - registry.fill(HIST("h2_jet_eta_mcd_jet_eta_mcp_matchedgeo"), jetBase.eta(), jetTag.eta(), weight); - registry.fill(HIST("h2_jet_phi_mcd_jet_phi_mcp_matchedgeo"), jetBase.phi(), jetTag.phi(), weight); - registry.fill(HIST("h2_jet_ntracks_mcd_jet_ntracks_mcp_matchedgeo"), jetBase.tracksIds().size(), jetTag.tracksIds().size(), weight); - registry.fill(HIST("h2_jet_pt_mcp_jet_pt_diff_matchedgeo"), jetTag.pt(), dpt / jetTag.pt(), weight); - registry.fill(HIST("h2_jet_pt_mcd_jet_pt_diff_matchedgeo"), jetBase.pt(), dpt / jetBase.pt(), weight); - registry.fill(HIST("h2_jet_pt_mcp_jet_pt_ratio_matchedgeo"), jetTag.pt(), jetBase.pt() / jetTag.pt(), weight); + if (jetMCD.r() == round(selectedJetsRadius * 100.0f)) { + double dpt = jetMCP.pt() - jetMCD.pt(); + if (jetfindingutilities::isInEtaAcceptance(jetMCD, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + registry.fill(HIST("h2_jet_pt_mcd_jet_pt_mcp_matchedgeo_mcdetaconstraint"), jetMCD.pt(), jetMCP.pt(), weight); + registry.fill(HIST("h2_jet_phi_mcd_jet_phi_mcp_matchedgeo_mcdetaconstraint"), jetMCD.phi(), jetMCP.phi(), weight); + registry.fill(HIST("h2_jet_pt_mcd_jet_pt_diff_matchedgeo"), jetMCD.pt(), dpt / jetMCD.pt(), weight); + registry.fill(HIST("h2_jet_ntracks_mcd_jet_ntracks_mcp_matchedgeo"), jetMCD.tracksIds().size(), jetMCP.tracksIds().size(), weight); + } + if (jetfindingutilities::isInEtaAcceptance(jetMCP, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + registry.fill(HIST("h2_jet_pt_mcd_jet_pt_mcp_matchedgeo_mcpetaconstraint"), jetMCD.pt(), jetMCP.pt(), weight); + registry.fill(HIST("h2_jet_phi_mcd_jet_phi_mcp_matchedgeo_mcpetaconstraint"), jetMCD.phi(), jetMCP.phi(), weight); + registry.fill(HIST("h2_jet_pt_mcp_jet_pt_diff_matchedgeo"), jetMCP.pt(), dpt / jetMCP.pt(), weight); + registry.fill(HIST("h2_jet_pt_mcp_jet_pt_ratio_matchedgeo"), jetMCP.pt(), jetMCD.pt() / jetMCP.pt(), weight); + } + registry.fill(HIST("h2_jet_eta_mcd_jet_eta_mcp_matchedgeo"), jetMCD.eta(), jetMCP.eta(), weight); } } } } // fill pt matched histograms if (checkPtMatched) { - if (jetBase.has_matchedJetPt()) { - for (const auto& jetTag : jetBase.template matchedJetPt_as>()) { - if (jetTag.pt() > pTHatMaxMCD * pTHat) { + if (jetMCD.has_matchedJetPt()) { + for (const auto& jetMCP : jetMCD.template matchedJetPt_as>()) { + if (jetMCP.pt() > pTHatMaxMCP * pTHat) { + continue; + } + if (!jetfindingutilities::isInEtaAcceptance(jetMCP, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { continue; } - if (jetBase.r() == round(selectedJetsRadius * 100.0f)) { - double dpt = jetTag.pt() - jetBase.pt(); - registry.fill(HIST("h2_jet_pt_mcd_jet_pt_mcp_matchedpt"), jetBase.pt(), jetTag.pt(), weight); - registry.fill(HIST("h2_jet_eta_mcd_jet_eta_mcp_matchedpt"), jetBase.eta(), jetTag.eta(), weight); - registry.fill(HIST("h2_jet_phi_mcd_jet_phi_mcp_matchedpt"), jetBase.phi(), jetTag.phi(), weight); - registry.fill(HIST("h2_jet_ntracks_mcd_jet_ntracks_mcp_matchedpt"), jetBase.tracksIds().size(), jetTag.tracksIds().size(), weight); - registry.fill(HIST("h2_jet_pt_mcp_jet_pt_diff_matchedpt"), jetTag.pt(), dpt / jetTag.pt(), weight); - registry.fill(HIST("h2_jet_pt_mcd_jet_pt_diff_matchedpt"), jetBase.pt(), dpt / jetBase.pt(), weight); - registry.fill(HIST("h2_jet_pt_mcp_jet_pt_ratio_matchedpt"), jetTag.pt(), jetBase.pt() / jetTag.pt(), weight); + if (jetMCD.r() == round(selectedJetsRadius * 100.0f)) { + double dpt = jetMCP.pt() - jetMCD.pt(); + if (jetfindingutilities::isInEtaAcceptance(jetMCD, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + registry.fill(HIST("h2_jet_pt_mcd_jet_pt_mcp_matchedpt_mcdetaconstraint"), jetMCD.pt(), jetMCP.pt(), weight); + registry.fill(HIST("h2_jet_phi_mcd_jet_phi_mcp_matchedpt_mcdetaconstraint"), jetMCD.phi(), jetMCP.phi(), weight); + registry.fill(HIST("h2_jet_pt_mcd_jet_pt_diff_matchedpt"), jetMCD.pt(), dpt / jetMCD.pt(), weight); + registry.fill(HIST("h2_jet_ntracks_mcd_jet_ntracks_mcp_matchedpt"), jetMCD.tracksIds().size(), jetMCP.tracksIds().size(), weight); + } + if (jetfindingutilities::isInEtaAcceptance(jetMCP, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + registry.fill(HIST("h2_jet_pt_mcd_jet_pt_mcp_matchedpt_mcpetaconstraint"), jetMCD.pt(), jetMCP.pt(), weight); + registry.fill(HIST("h2_jet_phi_mcd_jet_phi_mcp_matchedpt_mcpetaconstraint"), jetMCD.phi(), jetMCP.phi(), weight); + registry.fill(HIST("h2_jet_pt_mcp_jet_pt_diff_matchedpt"), jetMCP.pt(), dpt / jetMCP.pt(), weight); + registry.fill(HIST("h2_jet_pt_mcp_jet_pt_ratio_matchedpt"), jetMCP.pt(), jetMCD.pt() / jetMCP.pt(), weight); + } + registry.fill(HIST("h2_jet_eta_mcd_jet_eta_mcp_matchedpt"), jetMCD.eta(), jetMCP.eta(), weight); } } } } // fill geometry and pt histograms if (checkGeoPtMatched) { - if (jetBase.has_matchedJetGeo() && jetBase.has_matchedJetPt()) { - for (const auto& jetTag : jetBase.template matchedJetGeo_as>()) { - if (jetTag.pt() > pTHatMaxMCD * pTHat) { + if (jetMCD.has_matchedJetGeo() && jetMCD.has_matchedJetPt()) { + for (const auto& jetMCP : jetMCD.template matchedJetGeo_as>()) { + if (jetMCP.pt() > pTHatMaxMCP * pTHat) { continue; } - if (jetBase.template matchedJetGeo_first_as>().globalIndex() == jetBase.template matchedJetPt_first_as>().globalIndex()) { // not a good way to do this - double dpt = jetTag.pt() - jetBase.pt(); - registry.fill(HIST("h2_jet_pt_mcd_jet_pt_mcp_matchedgeopt"), jetBase.pt(), jetTag.pt(), weight); - registry.fill(HIST("h2_jet_eta_mcd_jet_eta_mcp_matchedgeopt"), jetBase.eta(), jetTag.eta(), weight); - registry.fill(HIST("h2_jet_phi_mcd_jet_phi_mcp_matchedgeopt"), jetBase.phi(), jetTag.phi(), weight); - registry.fill(HIST("h2_jet_ntracks_mcd_jet_ntracks_mcp_matchedgeopt"), jetBase.tracksIds().size(), jetTag.tracksIds().size(), weight); - registry.fill(HIST("h2_jet_pt_mcp_jet_pt_diff_matchedgeopt"), jetTag.pt(), dpt / jetTag.pt(), weight); - registry.fill(HIST("h2_jet_pt_mcd_jet_pt_diff_matchedgeopt"), jetBase.pt(), dpt / jetBase.pt(), weight); - registry.fill(HIST("h2_jet_pt_mcp_jet_pt_ratio_matchedgeopt"), jetTag.pt(), jetBase.pt() / jetTag.pt(), weight); + if (!jetfindingutilities::isInEtaAcceptance(jetMCP, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + if (jetMCD.template matchedJetGeo_first_as>().globalIndex() == jetMCD.template matchedJetPt_first_as>().globalIndex()) { // not a good way to do this + double dpt = jetMCP.pt() - jetMCD.pt(); + if (jetfindingutilities::isInEtaAcceptance(jetMCD, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + registry.fill(HIST("h2_jet_pt_mcd_jet_pt_mcp_matchedgeopt_mcdetaconstraint"), jetMCD.pt(), jetMCP.pt(), weight); + registry.fill(HIST("h2_jet_phi_mcd_jet_phi_mcp_matchedgeopt_mcdetaconstraint"), jetMCD.phi(), jetMCP.phi(), weight); + registry.fill(HIST("h2_jet_pt_mcd_jet_pt_diff_matchedgeopt"), jetMCD.pt(), dpt / jetMCD.pt(), weight); + registry.fill(HIST("h2_jet_ntracks_mcd_jet_ntracks_mcp_matchedgeopt"), jetMCD.tracksIds().size(), jetMCP.tracksIds().size(), weight); + } + if (jetfindingutilities::isInEtaAcceptance(jetMCP, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + registry.fill(HIST("h2_jet_pt_mcd_jet_pt_mcp_matchedgeopt_mcpetaconstraint"), jetMCD.pt(), jetMCP.pt(), weight); + registry.fill(HIST("h2_jet_phi_mcd_jet_phi_mcp_matchedgeopt_mcpetaconstraint"), jetMCD.phi(), jetMCP.phi(), weight); + registry.fill(HIST("h2_jet_pt_mcp_jet_pt_diff_matchedgeopt"), jetMCP.pt(), dpt / jetMCP.pt(), weight); + registry.fill(HIST("h2_jet_pt_mcp_jet_pt_ratio_matchedgeopt"), jetMCP.pt(), jetMCD.pt() / jetMCP.pt(), weight); + } + registry.fill(HIST("h2_jet_eta_mcd_jet_eta_mcp_matchedpt"), jetMCD.eta(), jetMCP.eta(), weight); } } } @@ -438,25 +473,30 @@ struct JetSpectraCharged { } template - void fillGeoMatchedCorrHistograms(TBase const& jetBase, float rho, float mcrho = 0.0, float weight = 1.0) + void fillGeoMatchedCorrHistograms(TBase const& jetMCD, float rho, float mcrho = 0.0, float weight = 1.0) { float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); - if (jetBase.pt() > pTHatMaxMCD * pTHat) { + if (jetMCD.pt() > pTHatMaxMCD * pTHat) { return; } - if (jetBase.has_matchedJetGeo()) { - for (const auto& jetTag : jetBase.template matchedJetGeo_as>()) { - if (jetTag.pt() > pTHatMaxMCD * pTHat) { + if (jetMCD.has_matchedJetGeo()) { + for (const auto& jetMCP : jetMCD.template matchedJetGeo_as>()) { + if (jetMCP.pt() > pTHatMaxMCD * pTHat) { continue; } - if (jetBase.r() == round(selectedJetsRadius * 100.0f)) { - double corrTagjetpt = jetTag.pt() - (mcrho * jetTag.area()); - double corrBasejetpt = jetBase.pt() - (rho * jetBase.area()); + if (jetMCD.r() == round(selectedJetsRadius * 100.0f)) { + double corrTagjetpt = jetMCP.pt() - (mcrho * jetMCP.area()); + double corrBasejetpt = jetMCD.pt() - (rho * jetMCD.area()); double dcorrpt = corrTagjetpt - corrBasejetpt; - registry.fill(HIST("h2_mcd_jet_pt_mcp_jet_pt_matchedgeo_rhoareasubtracted"), corrBasejetpt, corrTagjetpt, weight); - registry.fill(HIST("h2_mcp_jet_pt_jet_pt_diff_matchedgeo_rhoareasubtracted"), corrTagjetpt, dcorrpt / corrTagjetpt, weight); - registry.fill(HIST("h2_mcd_jet_pt_jet_pt_diff_matchedgeo_rhoareasubtracted"), corrBasejetpt, dcorrpt / corrBasejetpt, weight); - registry.fill(HIST("h2_mcp_jet_pt_jet_pt_ratio_matchedgeo_rhoareasubtracted"), corrTagjetpt, corrBasejetpt / corrTagjetpt, weight); + if (jetfindingutilities::isInEtaAcceptance(jetMCD, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + registry.fill(HIST("h2_jet_pt_mcd_jet_pt_mcp_matchedgeo_rhoareasubtracted_mcdetaconstraint"), corrBasejetpt, corrTagjetpt, weight); + registry.fill(HIST("h2_jet_pt_mcd_jet_pt_diff_matchedgeo_rhoareasubtracted"), corrBasejetpt, dcorrpt / corrBasejetpt, weight); + } + if (jetfindingutilities::isInEtaAcceptance(jetMCP, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + registry.fill(HIST("h2_jet_pt_mcd_jet_pt_mcp_matchedgeo_rhoareasubtracted_mcpetaconstraint"), corrBasejetpt, corrTagjetpt, weight); + registry.fill(HIST("h2_jet_pt_mcp_jet_pt_diff_matchedgeo_rhoareasubtracted"), corrTagjetpt, dcorrpt / corrTagjetpt, weight); + registry.fill(HIST("h2_jet_pt_mcp_jet_pt_ratio_matchedgeo_rhoareasubtracted"), corrTagjetpt, corrBasejetpt / corrTagjetpt, weight); + } } } } @@ -891,9 +931,6 @@ struct JetSpectraCharged { } for (const auto& mcdjet : mcdjets) { - if (!jetfindingutilities::isInEtaAcceptance(mcdjet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { - continue; - } if (!isAcceptedJet(mcdjet)) { continue; } @@ -914,9 +951,6 @@ struct JetSpectraCharged { return; } for (const auto& mcdjet : mcdjets) { - if (!jetfindingutilities::isInEtaAcceptance(mcdjet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { - continue; - } if (!isAcceptedJet(mcdjet)) { continue; } @@ -959,9 +993,6 @@ struct JetSpectraCharged { auto collmcdjets = mcdjets.sliceBy(mcdjetsPerJCollision, collision.globalIndex()); for (const auto& mcdjet : collmcdjets) { - if (!jetfindingutilities::isInEtaAcceptance(mcdjet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { - continue; - } if (!isAcceptedJet(mcdjet)) { continue; } From b44cee0280dc98038294d9fea673737805229f06 Mon Sep 17 00:00:00 2001 From: Joachim Carlo Kristian Bjerg Hansen <50103987+joachimckh@users.noreply.github.com> Date: Thu, 20 Mar 2025 01:07:50 +0100 Subject: [PATCH 0769/1650] [PWGJE] mc dev, fix bugs (#10583) --- PWGJE/Tasks/jetSpectraEseTask.cxx | 222 ++++++++++++++++++++---------- 1 file changed, 153 insertions(+), 69 deletions(-) diff --git a/PWGJE/Tasks/jetSpectraEseTask.cxx b/PWGJE/Tasks/jetSpectraEseTask.cxx index dd64d3cf8e4..81741c3b0e1 100644 --- a/PWGJE/Tasks/jetSpectraEseTask.cxx +++ b/PWGJE/Tasks/jetSpectraEseTask.cxx @@ -68,17 +68,23 @@ struct JetSpectraEseTask { Configurable vertexZCut{"vertexZCut", 10.0, "vertex z cut"}; Configurable> centRange{"centRange", {0, 90}, "centrality region of interest"}; Configurable cfgSelCentrality{"cfgSelCentrality", true, "Flag for centrality selection"}; - Configurable leadingTrackPtCut{"leadingTrackPtCut", 5.0, "leading jet pT cut"}; - Configurable jetAreaFractionMin{"jetAreaFractionMin", 0.56, "used to make a cut on the jet areas"}; - Configurable fjetAreaCut{"fjetAreaCut", true, "Flag for jet area cut"}; + // Configurable leadingTrackPtCut{"leadingTrackPtCut", 5.0, "leading jet pT cut"}; + Configurable jetAreaFractionMin{"jetAreaFractionMin", -99, "used to make a cut on the jet areas"}; Configurable cfgCentVariant{"cfgCentVariant", false, "Flag for centrality variant 1"}; Configurable cfgisPbPb{"cfgisPbPb", false, "Flag for using MC centrality in PbPb"}; Configurable cfgbkgSubMC{"cfgbkgSubMC", true, "Flag for MC background subtraction"}; + Configurable cfgUseMCEventWeights{"cfgUseMCEventWeights", false, "Flag for using MC event weights"}; + Configurable leadingConstituentPtMin{"leadingConstituentPtMin", -99.0, "minimum pT selection on jet constituent"}; + Configurable leadingConstituentPtMax{"leadingConstituentPtMax", 9999.0, "maximum pT selection on jet constituent"}; + Configurable checkLeadConstituentMinPtForMcpJets{"checkLeadConstituentMinPtForMcpJets", false, "flag to choose whether particle level jets should have their lead track pt above leadingConstituentPtMin to be accepted; off by default, as leadingConstituentPtMin cut is only applied on MCD jets for the Pb-Pb analysis using pp MC anchored to Pb-Pb for the response matrix"}; + Configurable pTHatMaxMCD{"pTHatMaxMCD", 999.0, "maximum fraction of hard scattering for jet acceptance in detector MC"}; + Configurable pTHatMaxMCP{"pTHatMaxMCP", 999.0, "maximum fraction of hard scattering for jet acceptance in particle MC"}; + Configurable pTHatExponent{"pTHatExponent", 6.0, "exponent of the event weight for the calculation of pTHat"}; Configurable trackEtaMin{"trackEtaMin", -0.9, "minimum eta acceptance for tracks"}; Configurable trackEtaMax{"trackEtaMax", 0.9, "maximum eta acceptance for tracks"}; Configurable trackPtMin{"trackPtMin", 0.15, "minimum pT acceptance for tracks"}; - Configurable trackPtMax{"trackPtMax", 100.0, "maximum pT acceptance for tracks"}; + Configurable trackPtMax{"trackPtMax", 200.0, "maximum pT acceptance for tracks"}; Configurable jetEtaMin{"jetEtaMin", -0.7, "minimum jet pseudorapidity"}; Configurable jetEtaMax{"jetEtaMax", 0.7, "maximum jet pseudorapidity"}; @@ -118,10 +124,11 @@ struct JetSpectraEseTask { std::vector eventSelectionBits; int trackSelection{-1}; + Filter trackCuts = (aod::jtrack::pt >= trackPtMin && aod::jtrack::pt < trackPtMax && aod::jtrack::eta > trackEtaMin && aod::jtrack::eta < trackEtaMax); Filter jetCuts = aod::jet::pt > jetPtMin&& aod::jet::r == nround(jetR.node() * 100.0f) && nabs(aod::jet::eta) < 0.9f - jetR; Filter colFilter = nabs(aod::jcollision::posZ) < vertexZCut; Filter mcCollisionFilter = nabs(aod::jmccollision::posZ) < vertexZCut; - using ChargedMCDJets = soa::Filtered>; + using ChargedMCDJets = soa::Filtered>; Preslice mcdjetsPerJCollision = o2::aod::jet::collisionId; enum class DetID { FT0C, @@ -247,7 +254,9 @@ struct JetSpectraEseTask { LOGF(info, "JetSpectraEseTask::init() - MC Charged Matched"); registry.add("mcm/hJetSparse", ";Centrality;#it{p}_{T,jet det}; #eta; #phi", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {etaAxis}, {phiAxis}}}); /* detector level */ - registry.add("mcm/hPartSparseMatch", ";Centrality;#it{p}_{T,jet part}; #eta; #phi", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {etaAxis}, {phiAxis}}}); + // registry.add("mcm/hPartSparseMatch", ";Centrality;#it{p}_{T,jet part}; #eta; #phi", {HistType::kTHnSparseF, {{centAxis}, {jetPtAxis}, {etaAxis}, {phiAxis}}}); + registry.addClone("mcm/hJetSparse", "mcm/hDetSparseMatch"); + registry.addClone("mcm/hJetSparse", "mcm/hPartSparseMatch"); registry.add("mcm/hMCEventCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); registry.add("mcm/hMCDMatchedEventCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); @@ -284,7 +293,7 @@ struct JetSpectraEseTask { } void processESEDataCharged(soa::Join::iterator const& collision, - soa::Filtered const& jets, + soa::Filtered> const& jets, aod::JetTracks const& tracks) { float counter{0.5f}; @@ -307,10 +316,6 @@ struct JetSpectraEseTask { if (qPerc[0] < 0) return; registry.fill(HIST("hEventCounter"), counter++); - - if (!isAcceptedLeadTrack(tracks)) - return; - std::unique_ptr rhoFit{nullptr}; if (cfgrhoPhi) { rhoFit = fitRho(collision, psi, tracks, jets); @@ -322,10 +327,11 @@ struct JetSpectraEseTask { registry.fill(HIST("hRho"), centrality, collision.rho()); registry.fill(HIST("hCentralityAnalyzed"), centrality); for (auto const& jet : jets) { - if (fjetAreaCut && !isJetAreaAccepted(jet)) - continue; if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) continue; + if (!isAcceptedJet(jet)) { + continue; + } registry.fill(HIST("hJetPt"), jet.pt()); registry.fill(HIST("hJetPt_bkgsub"), jet.pt() - collision.rho() * jet.area()); registry.fill(HIST("hJetEta"), jet.eta()); @@ -405,7 +411,8 @@ struct JetSpectraEseTask { void processMCParticleLevel(soa::Filtered>::iterator const& mcCollision, soa::SmallGroups const& collisions, - soa::Filtered const& jets) + soa::Filtered> const& jets, + aod::JetParticles const&) { float counter{0.5f}; registry.fill(HIST("mcp/hEventCounter"), counter++); @@ -420,24 +427,31 @@ struct JetSpectraEseTask { registry.fill(HIST("mcp/hEventCounter"), counter++); auto centrality{-1}; bool fOccupancy = true; + bool eventSel = true; for (const auto& col : collisions) { if (cfgisPbPb) centrality = col.centrality(); if (cfgEvSelOccupancy && !isOccupancyAccepted(col)) fOccupancy = false; + if (!jetderiveddatautilities::selectCollision(col, eventSelectionBits)) + eventSel = false; } if (cfgEvSelOccupancy && !fOccupancy) return; + if (!(std::abs(mcCollision.posZ()) < vertexZCut)) { + return; + } + if (!eventSel) + return; registry.fill(HIST("mcp/hEventCounter"), counter++); registry.fill(HIST("mcp/hCentralitySel"), centrality); - - jetLoop(jets, centrality, mcCollision.rho()); + jetLoopMCP(jets, centrality, mcCollision.rho()); } PROCESS_SWITCH(JetSpectraEseTask, processMCParticleLevel, "jets on particle level MC", false); - void processMCDetectorLevel(soa::Join::iterator const& collision, + void processMCDetectorLevel(soa::Filtered>::iterator const& collision, ChargedMCDJets const& mcdjets, aod::JetTracks const&, aod::JetParticles const&) @@ -451,11 +465,14 @@ struct JetSpectraEseTask { return; registry.fill(HIST("mcd/hEventCounter"), counter++); + if (!(std::abs(collision.posZ()) < vertexZCut)) { + return; + } + auto centrality = cfgisPbPb ? collision.centrality() : -1; registry.fill(HIST("mcd/hCentralitySel"), centrality); - - jetLoop(mcdjets, centrality, collision.rho()); + jetLoopMCD(mcdjets, centrality, collision.rho()); } PROCESS_SWITCH(JetSpectraEseTask, processMCDetectorLevel, "jets on detector level", false); @@ -472,6 +489,9 @@ struct JetSpectraEseTask { if (mcCol.size() < 1) { return; } + if (collisions.size() != 1) { + return; + } registry.fill(HIST("mcm/hMCEventCounter"), counter++); if (!(std::abs(mcCol.posZ()) < vertexZCut)) { return; @@ -500,13 +520,7 @@ struct JetSpectraEseTask { registry.fill(HIST("mcm/hMCDMatchedEventCounter"), secCount++); registry.fill(HIST("mcm/hCentralityAnalyzed"), centrality); - - jetLoop( - mcdjets.sliceBy(mcdjetsPerJCollision, collision.globalIndex()), - centrality, - collision.rho(), - [](const auto& jet) { return jet.template matchedJetGeo_as(); }, - mcCol.rho()); + matchedJetLoop(mcdjets.sliceBy(mcdjetsPerJCollision, collision.globalIndex()), centrality, collision.rho(), mcCol.rho()); registry.fill(HIST("mcm/hMCDMatchedEventCounter"), secCount++); } @@ -514,30 +528,6 @@ struct JetSpectraEseTask { } PROCESS_SWITCH(JetSpectraEseTask, processMCChargedMatched, "jet MC process: geometrically matched MCP and MCD for response matrix and efficiency", false); - template - bool isAcceptedLeadTrack(T const& tracks) - { - double leadingTrackPt = 0.0; - for (const auto& track : tracks) { - if (track.pt() > leadingTrackPtCut) { - if (track.pt() > leadingTrackPt) { - leadingTrackPt = track.pt(); - } - } - } - if (leadingTrackPt == 0.0) - return false; - else - return true; - } - template - bool isJetAreaAccepted(const Jet& jet) - { - if (jet.area() < jetAreaFractionMin * o2::constants::math::PI * (jet.r() / 100.0) * (jet.r() / 100.0)) - return false; - else - return true; - } // template template EventPlane procEP(EPCol const& vec) @@ -663,8 +653,8 @@ struct JetSpectraEseTask { return true; } - template - std::unique_ptr fitRho(const C& col, const EventPlane& ep, T const& tracks, J const& jets) + template + std::unique_ptr fitRho(const Col& col, const EventPlane& ep, TTracks const& tracks, Jets const& jets) { float leadingJetPt = 0.0; float leadingJetEta = 0.0; @@ -864,40 +854,134 @@ struct JetSpectraEseTask { return false; } - static constexpr std::string_view LevelJets[] = {"mcd/", "mcp/", "mcm/"}; - enum JetType { MCP = 0, - MCD = 1, - MCM = 2 }; - template - void jetLoop(const Jets& jets, const float& centrality, const float& rho, matchJet matchjet = nullptr, const float& rho2 = 0) + // static constexpr std::string_view LevelJets[] = {"mcd/", "mcp/"}; + // enum JetType { MCP = 0, + // MCD = 1 + // }; + // template + template + void jetLoopMCD(const Jets& jets, const float& centrality, const float& rho) + { + float weight = 1.0; + for (const auto& jet : jets) { + if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + if (!isAcceptedJet(jet)) { + continue; + } + auto pt = jet.pt(); + if (cfgbkgSubMC) { + pt = jet.pt() - (rho * jet.area()); + } + if (cfgUseMCEventWeights) { + weight = jet.eventWeight(); + } + registry.fill(/*HIST(LevelJets[jetLvl]) +*/ HIST("mcd/hJetSparse"), centrality, pt, jet.eta(), jet.phi(), weight); /* detector level mcm*/ + } + } + + template + void jetLoopMCP(const Jets& jets, const float& centrality, const float& rho) { + bool mcLevelIsParticleLevel = true; + float weight = 1.0; + for (const auto& jet : jets) { + if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + if (!isAcceptedJet(jet, mcLevelIsParticleLevel)) { + continue; + } + auto pt = jet.pt(); + if (cfgbkgSubMC) { + pt = jet.pt() - (rho * jet.area()); + } + if (cfgUseMCEventWeights) { + weight = jet.eventWeight(); + } + registry.fill(/*HIST(LevelJets[jetLvl]) +*/ HIST("mcp/hJetSparse"), centrality, pt, jet.eta(), jet.phi(), weight); /* detector level mcm*/ + } + } + template + void matchedJetLoop(const Jets& jets, const float& centrality, const float& rho, const float& rho2) + { + float weight = 1.0; for (const auto& jet : jets) { + if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + if (!isAcceptedJet(jet)) { + continue; + } + float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); + if (jet.pt() > pTHatMaxMCD * pTHat) { + return; + } + auto pt = jet.pt(); if (cfgbkgSubMC) { pt = jet.pt() - (rho * jet.area()); } - // registry.fill(HIST(levelJets[jetLvl]) + HIST("hJetSparse"), centrality, jet.pt(), jet.eta(), jet.phi()); - registry.fill(HIST(LevelJets[jetLvl]) + HIST("hJetSparse"), centrality, pt, jet.eta(), jet.phi()); /* detector level mcm*/ + if (cfgUseMCEventWeights) { + weight = jet.eventWeight(); + } + registry.fill(HIST("mcm/hJetSparse"), centrality, pt, jet.eta(), jet.phi(), weight); /* detector level mcm*/ - if constexpr (jetLvl == MCM && !std::is_same_v) { - for (const auto& matchedJet : matchjet(jet)) { + if (jet.has_matchedJetGeo()) { + registry.fill(HIST("mcm/hDetSparseMatch"), centrality, pt, jet.eta(), jet.phi(), weight); + for (const auto& matchedJet : jet.template matchedJetGeo_as()) { + if (matchedJet.pt() > pTHatMaxMCD * pTHat) + continue; auto matchedpt = matchedJet.pt(); if (cfgbkgSubMC) { matchedpt = matchedJet.pt() - (rho2 * matchedJet.area()); } - registry.fill(HIST("mcm/hPartSparseMatch"), centrality, matchedpt, matchedJet.eta(), matchedJet.phi()); + registry.fill(HIST("mcm/hPartSparseMatch"), centrality, matchedpt, matchedJet.eta(), matchedJet.phi(), weight); + registry.fill(HIST("mcm/hMatchedJetsPtDelta"), matchedJet.pt(), jet.pt() - matchedJet.pt(), weight); + registry.fill(HIST("mcm/hMatchedJetsPhiDelta"), matchedJet.phi(), jet.phi() - matchedJet.phi(), weight); + registry.fill(HIST("mcm/hMatchedJetsEtaDelta"), matchedJet.eta(), jet.eta() - matchedJet.eta(), weight); + registry.fill(HIST("mcm/hGenMatchedJetsPtDeltadPt"), centrality, matchedpt, (pt - matchedpt) / matchedpt, weight); + registry.fill(HIST("mcm/hRecoMatchedJetsPtDeltadPt"), centrality, pt, (pt - matchedpt) / pt, weight); + registry.fill(HIST("mcm/hRespMcDMcPMatch"), centrality, pt, matchedpt, weight); + } + } + } + } + + template + bool isAcceptedJet(TJets const& jet, bool mcLevelIsParticleLevel = false) + { + if (jetAreaFractionMin > -98.0) { + if (jet.area() < jetAreaFractionMin * o2::constants::math::PI * (jet.r() / 100.0) * (jet.r() / 100.0)) { + return false; + } + } + bool checkConstituentPt = true; + bool checkConstituentMinPt = (leadingConstituentPtMin > -98.0); + bool checkConstituentMaxPt = (leadingConstituentPtMax < 9998.0); + if (!checkConstituentMinPt && !checkConstituentMaxPt) { + checkConstituentPt = false; + } - registry.fill(HIST("mcm/hMatchedJetsPtDelta"), matchedJet.pt(), jet.pt() - matchedJet.pt()); - registry.fill(HIST("mcm/hMatchedJetsPhiDelta"), matchedJet.phi(), jet.phi() - matchedJet.phi()); - registry.fill(HIST("mcm/hMatchedJetsEtaDelta"), matchedJet.eta(), jet.eta() - matchedJet.eta()); - registry.fill(HIST("mcm/hGenMatchedJetsPtDeltadPt"), centrality, matchedpt, (pt - matchedpt) / matchedpt); - registry.fill(HIST("mcm/hRecoMatchedJetsPtDeltadPt"), centrality, pt, (pt - matchedpt) / pt); + if (checkConstituentPt) { + bool isMinLeadingConstituent = !checkConstituentMinPt; + bool isMaxLeadingConstituent = true; - registry.fill(HIST("mcm/hRespMcDMcPMatch"), centrality, pt, matchedpt); + for (const auto& constituent : jet.template tracks_as()) { + double pt = constituent.pt(); + + if ((!checkLeadConstituentMinPtForMcpJets && mcLevelIsParticleLevel) || (checkConstituentMinPt && pt >= leadingConstituentPtMin)) { // if the jet is mcp level and checkLeadConstituentMinPtForMcpJets is true, then the pt of the leading track of that jet does not need to be below the defined leadingConstituentPtMin cut + isMinLeadingConstituent = true; + } + if (checkConstituentMaxPt && pt > leadingConstituentPtMax) { + isMaxLeadingConstituent = false; } } + return isMinLeadingConstituent && isMaxLeadingConstituent; } + return true; } }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From 6dd60b0714927f055317f2a4203de4bbda900153 Mon Sep 17 00:00:00 2001 From: dajones2 <140733426+dajones2@users.noreply.github.com> Date: Thu, 20 Mar 2025 00:08:12 +0000 Subject: [PATCH 0770/1650] [PWGJE] Adding leading track cut (#10540) --- PWGJE/Tasks/jetHadronRecoil.cxx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/PWGJE/Tasks/jetHadronRecoil.cxx b/PWGJE/Tasks/jetHadronRecoil.cxx index e4cc16b0e8a..e798b406ed8 100644 --- a/PWGJE/Tasks/jetHadronRecoil.cxx +++ b/PWGJE/Tasks/jetHadronRecoil.cxx @@ -53,6 +53,7 @@ struct JetHadronRecoil { Configurable trackPtMax{"trackPtMax", 100.0, "maximum pT acceptance for tracks"}; Configurable trackEtaMin{"trackEtaMin", -0.9, "minimum eta acceptance for tracks"}; Configurable trackEtaMax{"trackEtaMax", 0.9, "maximum eta acceptance for tracks"}; + Configurable maxLeadingTrackPt{"maxLeadingTrackPt", 1000.0, "maximum acceptance for leading track in jets"}; Configurable centralityMin{"centralityMin", -999.0, "minimum centrality"}; Configurable centralityMax{"centralityMax", 999.0, "maximum centrality"}; Configurable vertexZCut{"vertexZCut", 10.0f, "Accepted z-vertex range"}; @@ -183,6 +184,7 @@ struct JetHadronRecoil { double phiTT = 0; int trigNumber = 0; int nTT = 0; + double leadingPT = 0; float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); float rhoReference = rho + rhoReferenceShift; @@ -230,9 +232,17 @@ struct JetHadronRecoil { } for (const auto& jet : jets) { + for (const auto& constituent : jet.template tracks_as()) { + if (constituent.pt() > leadingPT) { + leadingPT = constituent.pt(); + } + } if (jet.pt() > pTHatMaxMCD * pTHat) { continue; } + if (leadingPT > maxLeadingTrackPt) { + continue; + } registry.fill(HIST("hJetPt"), jet.pt() - (rho * jet.area()), weight); registry.fill(HIST("hJetEta"), jet.eta(), weight); registry.fill(HIST("hJetPhi"), jet.phi(), weight); From 23cc5829f462571e60a2a9eab5c74a952b89a0d5 Mon Sep 17 00:00:00 2001 From: Sandeep Dudi <69388148+sdudi123@users.noreply.github.com> Date: Thu, 20 Mar 2025 08:20:46 +0100 Subject: [PATCH 0771/1650] [PWGUD] Error related to verbosity is solved (#10580) Co-authored-by: Sandeep Dudi Co-authored-by: Sandeep Dudi Co-authored-by: sandeep dudi --- PWGUD/Tasks/sginclusivePhiKstarSD.cxx | 35 +++------------------------ 1 file changed, 3 insertions(+), 32 deletions(-) diff --git a/PWGUD/Tasks/sginclusivePhiKstarSD.cxx b/PWGUD/Tasks/sginclusivePhiKstarSD.cxx index a3dfa861c31..0621f6e5438 100644 --- a/PWGUD/Tasks/sginclusivePhiKstarSD.cxx +++ b/PWGUD/Tasks/sginclusivePhiKstarSD.cxx @@ -48,7 +48,6 @@ using namespace o2::constants::physics; struct SginclusivePhiKstarSD { SGSelector sgSelector; Service pdg; - Configurable verbosity{"verbosity", 0, "Determines level of verbosity"}; HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; @@ -287,6 +286,8 @@ struct SginclusivePhiKstarSD { registry.add("MC/genM_1", "Generated events; Mass (GeV/c^2)", {HistType::kTH1F, {{220, 0.98, 1.2}}}); registry.add("MC/accMPtRap_phi_G", "Generated Phi; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH3F, {{220, 0.98, 1.20}, {200, 0.0, 10.0}, {60, -1.5, 1.5}}}); + registry.add("MC/accMPtRap_phi_T", "Reconstrcted Phi; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH3F, {{220, 0.98, 1.20}, {200, 0.0, 10.0}, {60, -1.5, 1.5}}}); + registry.add("MC/accEtaPt", "Generated events in acceptance; eta (1); Pt (GeV/c)", {HistType::kTH2F, {{60, -1.5, 1.5}, {250, 0.0, 5.0}}}); registry.add("MC/accRap", "Generated events in acceptance; Rapidity (1)", {HistType::kTH1F, {{60, -1.5, 1.5}}}); registry.add("MC/accMPt", "Generated events in acceptance; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH2F, {{220, 0.98, 1.20}, {200, 0.0, 10.0}}}); @@ -298,6 +299,7 @@ struct SginclusivePhiKstarSD { registry.add("MC/pDiff", "McTruth - reconstructed track momentum; McTruth - reconstructed track momentum; Entries", {HistType::kTH2F, {{240, -6., 6.}, {3, -1.5, 1.5}}}); // K*0 registry.add("MC/accMPtRap_kstar_G", "Generated K*0; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH3F, {{400, 0., 2.0}, {200, 0.0, 10.0}, {60, -1.5, 1.5}}}); + registry.add("MC/accMPtRap_kstar_T", "Reconstructed K*0; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH3F, {{400, 0., 2.0}, {200, 0.0, 10.0}, {60, -1.5, 1.5}}}); registry.add("MC/genEtaPt_k", "Generated events; eta (1); Pt (GeV/c)", {HistType::kTH2F, {{60, -1.5, 1.5}, {250, 0.0, 5.0}}}); registry.add("MC/genRap_k", "Generated events; Rapidity (1)", {HistType::kTH1F, {{60, -1.5, 1.5}}}); registry.add("MC/genMPt_k", "Generated events; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH2F, {{400, 0., 2.0}, {200, 0.0, 10.0}}}); @@ -1165,9 +1167,6 @@ struct SginclusivePhiKstarSD { void processMCTruth(aod::UDMcCollisions const& mccollisions, CCs const& collisions, aod::UDMcParticles const& McParts, TCs const& tracks) { // number of McCollisions in DF - if (verbosity > 0) { - LOGF(info, "Number of MC collisions %d", mccollisions.size()); - } TLorentzVector v0; TLorentzVector v1; TLorentzVector v01; @@ -1184,9 +1183,6 @@ struct SginclusivePhiKstarSD { // get McParticles which belong to mccollision auto partSlice = McParts.sliceBy(partPerMcCollision, mccollision.globalIndex()); registry.get(HIST("MC/nParts"))->Fill(partSlice.size(), 1.); - if (verbosity > 0) { - LOGF(info, "Number of McParts %d", partSlice.size()); - } for (const auto& [tr1, tr2] : combinations(partSlice, partSlice)) { if ((tr1.pdgCode() == kKPlus && tr2.pdgCode() == kPiMinus) || (tr1.pdgCode() == kKMinus && tr2.pdgCode() == kPiPlus) || (tr1.pdgCode() == kPiPlus && tr2.pdgCode() == kKMinus) || (tr1.pdgCode() == kPiMinus && tr2.pdgCode() == kKPlus)) { if (std::abs(tr1.pdgCode()) == kKPlus) { @@ -1287,20 +1283,11 @@ struct SginclusivePhiKstarSD { auto pPart = std::sqrt(McPart.px() * McPart.px() + McPart.py() * McPart.py() + McPart.pz() * McPart.pz()); auto pDiff = pTrack - pPart; registry.get(HIST("MC/pDiff"))->Fill(pDiff, track.isPVContributor(), 1.); - if (verbosity > 0) { - LOGF(info, " PID: %d Generated: %d Process: %d PV contributor: %d dP: %f", McPart.pdgCode(), McPart.producedByGenerator(), McPart.getProcess(), track.isPVContributor(), pDiff); - } } } else { registry.get(HIST("MC/pDiff"))->Fill(-5.9, -1, 1.); - if (verbosity > 0) { - LOGF(info, " PID: %d Generated: %d Process: %d PV contributor: No dP: nan", McPart.pdgCode(), McPart.producedByGenerator(), McPart.getProcess()); - } } } - if (verbosity > 0) { - LOGF(info, ""); - } } } PROCESS_SWITCH(SginclusivePhiKstarSD, processMCTruth, "Process MC truth", true); @@ -1308,9 +1295,6 @@ struct SginclusivePhiKstarSD { void processReco(CC const& collision, TCs const& tracks, aod::UDMcCollisions const& /*mccollisions*/, aod::UDMcParticles const& /*McParts*/) { // number of McCollisions in DF - if (verbosity > 0) { - LOGF(info, "Number of MC collisions %d", collision.size()); - } float fitCut[5] = {fv0Cut, ft0aCut, ft0cCut, fddaCut, fddcCut}; std::vector parameters = {pvCut, dcazCut, dcaxyCut, tpcChi2Cut, tpcNClsFindableCut, itsChi2Cut, etaCut, ptCut}; int truegapSide = sgSelector.trueGap(collision, fitCut[0], fitCut[1], fitCut[2], zdcCut); @@ -1511,10 +1495,6 @@ struct SginclusivePhiKstarSD { if (collision.has_udMcCollision()) { // auto mccollision = collision.udMcCollision(); registry.get(HIST("Reco/Stat"))->Fill(3., 1.); - } else { - if (verbosity > 0) { - LOGF(info, "This collision has no associated McCollision"); - } } // compute the difference between generated and reconstructed momentum for (const auto& track : tracks) { @@ -1525,19 +1505,10 @@ struct SginclusivePhiKstarSD { auto pPart = std::sqrt(mcPart.px() * mcPart.px() + mcPart.py() * mcPart.py() + mcPart.pz() * mcPart.pz()); auto pDiff = pTrack - pPart; registry.get(HIST("Reco/pDiff"))->Fill(pDiff, track.isPVContributor(), 1.); - if (verbosity > 0) { - LOGF(info, " PID: %d Generated: %d Process: %d PV contributor: %d dP: %f", mcPart.pdgCode(), mcPart.producedByGenerator(), mcPart.getProcess(), track.isPVContributor(), pDiff); - } } else { registry.get(HIST("Reco/pDiff"))->Fill(-5.9, -1, 1.); - if (verbosity > 0) { - LOGF(info, " This track has no associated McParticle"); - } } } - if (verbosity > 0) { - LOGF(info, ""); - } } PROCESS_SWITCH(SginclusivePhiKstarSD, processReco, "Process reconstructed data", true); }; From beaa3278cdbc06794940fa0a2c54a1ac337ac826 Mon Sep 17 00:00:00 2001 From: Yunfan Liu Date: Thu, 20 Mar 2025 09:04:19 +0100 Subject: [PATCH 0772/1650] [PWGHF] add deviation of pi from Omega_c for Omega_c -> OmegaPi and remove the cuts on negative chi2 (#10567) Co-authored-by: ALICE Action Bot --- .../DataModel/CandidateReconstructionTables.h | 3 +- .../candidateCreatorXic0Omegac0.cxx | 23 ++++++----- .../treeCreatorOmegacToOmegaPi.cxx | 39 ++++++++++++------- 3 files changed, 39 insertions(+), 26 deletions(-) diff --git a/PWGHF/DataModel/CandidateReconstructionTables.h b/PWGHF/DataModel/CandidateReconstructionTables.h index 455f695ed94..ea2eb1b37a5 100644 --- a/PWGHF/DataModel/CandidateReconstructionTables.h +++ b/PWGHF/DataModel/CandidateReconstructionTables.h @@ -1328,6 +1328,7 @@ DECLARE_SOA_COLUMN(Chi2TopoCascToPv, chi2TopoCascToPv, float); DECLARE_SOA_COLUMN(Chi2TopoPiFromOmegacToPv, chi2TopoPiFromOmegacToPv, float); DECLARE_SOA_COLUMN(Chi2TopoPiFromXicToPv, chi2TopoPiFromXicToPv, float); DECLARE_SOA_COLUMN(Chi2TopoOmegacToPv, chi2TopoOmegacToPv, float); +DECLARE_SOA_COLUMN(DeviationPiFromOmegacToPv, deviationPiFromOmegacToPv, float); DECLARE_SOA_COLUMN(Chi2TopoXicToPv, chi2TopoXicToPv, float); DECLARE_SOA_COLUMN(Chi2TopoV0ToCasc, chi2TopoV0ToCasc, float); DECLARE_SOA_COLUMN(Chi2TopoCascToOmegac, chi2TopoCascToOmegac, float); @@ -1500,7 +1501,7 @@ DECLARE_SOA_TABLE(HfOmegacKf, "AOD", "HFOMEGACKF", //! hf_cand_xic0_omegac0::Chi2GeoV0, hf_cand_xic0_omegac0::Chi2GeoCasc, hf_cand_xic0_omegac0::Chi2GeoOmegac, hf_cand_xic0_omegac0::Chi2MassV0, hf_cand_xic0_omegac0::Chi2MassCasc, hf_cand_xic0_omegac0::V0ldl, hf_cand_xic0_omegac0::Cascldl, hf_cand_xic0_omegac0::Omegacldl, - hf_cand_xic0_omegac0::Chi2TopoV0ToPv, hf_cand_xic0_omegac0::Chi2TopoCascToPv, hf_cand_xic0_omegac0::Chi2TopoPiFromOmegacToPv, hf_cand_xic0_omegac0::Chi2TopoOmegacToPv, + hf_cand_xic0_omegac0::Chi2TopoV0ToPv, hf_cand_xic0_omegac0::Chi2TopoCascToPv, hf_cand_xic0_omegac0::Chi2TopoPiFromOmegacToPv, hf_cand_xic0_omegac0::Chi2TopoOmegacToPv, hf_cand_xic0_omegac0::DeviationPiFromOmegacToPv, hf_cand_xic0_omegac0::Chi2TopoV0ToCasc, hf_cand_xic0_omegac0::Chi2TopoCascToOmegac, hf_cand_xic0_omegac0::DecayLenXYLambda, hf_cand_xic0_omegac0::DecayLenXYCasc, hf_cand_xic0_omegac0::DecayLenXYOmegac, hf_cand_xic0_omegac0::CosPaV0ToCasc, hf_cand_xic0_omegac0::CosPaCascToOmegac, hf_cand_xic0_omegac0::CosPaXYV0ToCasc, hf_cand_xic0_omegac0::CosPaXYCascToOmegac, diff --git a/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx b/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx index 31f873a6e96..f112f0f71ee 100644 --- a/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx +++ b/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx @@ -160,6 +160,7 @@ struct HfCandidateCreatorXic0Omegac0 { float massOmegac; float cosThetaStarPiFromOmegac; float chi2NdfTopoPiFromOmegacToPv; + float deviationPiFromOmegacToPv; float kfDcaXYPiFromOmegac; float chi2NdfTopoV0ToCasc; float chi2NdfTopoCascToOmegac; @@ -281,6 +282,10 @@ struct HfCandidateCreatorXic0Omegac0 { // KFParticle Variables Histograms registry.add("hKFParticleV0TopoChi2", "hKFParticleV0TopoChi2", kTH1D, {{1000, -0.10f, 100.0f}}); registry.add("hKFParticleCascTopoChi2", "hKFParticleCascTopoChi2", kTH1D, {{1000, -0.1f, 100.0f}}); + registry.add("hKfChi2TopoPiFromCharmBaryon", "hKfChi2TopoPifromCharmBaryon", kTH1F, {{2000, -0.1f, 1000.0f}}); + registry.add("hKfNdfPiFromCharmBaryon", "hKfNDfPifromCharmBaryon", kTH1F, {{2000, -0.1f, 200.0f}}); + registry.add("hKfChi2OverNdfPiFromCharmBaryon", "hKfChi2OverNdfPifromCharmBaryon", kTH1F, {{1000, -0.1f, 200.0f}}); + registry.add("hKfDeviationPiFromCharmBaryon", "hKfChi2OverNdfPifromCharmBaryon", kTH1F, {{1000, -0.1f, 200.0f}}); registry.add("hKFParticleCascBachTopoChi2", "hKFParticleCascBachTopoChi2", kTH1D, {{1000, -0.1f, 100.0f}}); registry.add("hKFParticleDcaCharmBaryonDau", "hKFParticleDcaCharmBaryonDau", kTH1D, {{1000, -0.1f, 1.0f}}); registry.add("hKFParticleDcaXYCascBachToPv", "hKFParticleDcaXYCascBachToPv", kTH1D, {{1000, -0.1f, 15.0f}}); @@ -802,9 +807,6 @@ struct HfCandidateCreatorXic0Omegac0 { // err_mass>0 of Lambda if (sigLam <= 0) continue; - // chi2>0 && NDF>0 for selecting Lambda - if ((kfV0.GetNDF() <= 0 || kfV0.GetChi2() <= 0)) - continue; kfOmegac0Candidate.chi2GeoV0 = kfV0.GetChi2(); KFParticle kfV0MassConstrained = kfV0; kfV0MassConstrained.SetNonlinearMassConstraint(o2::constants::physics::MassLambda); // set mass constrain to Lambda @@ -838,9 +840,7 @@ struct HfCandidateCreatorXic0Omegac0 { continue; if (std::abs(massCasc - MassOmegaMinus) > massToleranceCascade) continue; - // chi2>0 && NDF>0 - if (kfOmega.GetNDF() <= 0 || kfOmega.GetChi2() <= 0) - continue; + kfOmegac0Candidate.chi2GeoCasc = kfOmega.GetChi2(); kfOmegac0Candidate.cascRejectInvmass = massCascrej; registry.fill(HIST("hInvMassXiMinus_rej"), massCascrej); // rej @@ -874,9 +874,7 @@ struct HfCandidateCreatorXic0Omegac0 { kfOmegaC0.GetMass(massOmegaC0, sigOmegaC0); if (sigOmegaC0 <= 0) continue; - // chi2>0 && NDF>0 - if (kfOmegaC0.GetNDF() <= 0 || kfOmegaC0.GetChi2() <= 0) - continue; + hFitterStatus->Fill(0); hCandidateCounter->Fill(2); kfOmegaC0.TransportToDecayVertex(); @@ -1019,6 +1017,7 @@ struct HfCandidateCreatorXic0Omegac0 { kfOmegac0Candidate.chi2NdfTopoCascToPv = kfOmegaToPv.GetChi2() / kfOmegaToPv.GetNDF(); kfOmegac0Candidate.chi2NdfTopoPiFromOmegacToPv = kfPiFromOmegacToPv.GetChi2() / kfPiFromOmegacToPv.GetNDF(); kfOmegac0Candidate.chi2NdfTopoOmegacToPv = kfOmegac0ToPv.GetChi2() / kfOmegac0ToPv.GetNDF(); + kfOmegac0Candidate.deviationPiFromOmegacToPv = kfCalculateChi2ToPrimaryVertex(kfOmegaC0, kfPV); auto cascBachTopoChi2Ndf = kfBachKaonToOmega.GetChi2() / kfBachKaonToOmega.GetNDF(); kfOmegac0Candidate.chi2NdfTopoV0ToCasc = kfV0ToCasc.GetChi2() / kfV0ToCasc.GetNDF(); @@ -1098,6 +1097,10 @@ struct HfCandidateCreatorXic0Omegac0 { registry.fill(HIST("hKfOmega_ldl"), kfOmegac0Candidate.ldlCasc); registry.fill(HIST("hKfOmegaC0_ldl"), kfOmegac0Candidate.ldlOmegac); registry.fill(HIST("hDcaXYCascadeToPVKf"), kfOmegac0Candidate.kfDcaXYCascToPv); + registry.fill(HIST("hKfChi2TopoPiFromCharmBaryon"), kfPiFromOmegacToPv.GetChi2()); + registry.fill(HIST("hKfNdfPiFromCharmBaryon"), kfPiFromOmegacToPv.GetNDF()); + registry.fill(HIST("hKfChi2OverNdfPiFromCharmBaryon"), kfOmegac0Candidate.chi2NdfTopoPiFromOmegacToPv); + registry.fill(HIST("hKfDeviationPiFromCharmBaryon"), kfOmegac0Candidate.deviationPiFromOmegacToPv); // Additional histograms if (fillAllHist) { registry.fill(HIST("hEtaV0PosDau"), kfPos.GetEta()); @@ -1161,7 +1164,7 @@ struct HfCandidateCreatorXic0Omegac0 { kfCandidateData(kfOmegac0Candidate.kfDcaXYPiFromOmegac, kfOmegac0Candidate.kfDcaXYCascToPv, kfOmegac0Candidate.chi2GeoV0, kfOmegac0Candidate.chi2GeoCasc, kfOmegac0Candidate.chi2GeoOmegac, kfOmegac0Candidate.chi2MassV0, kfOmegac0Candidate.chi2MassCasc, kfOmegac0Candidate.ldlV0, kfOmegac0Candidate.ldlCasc, kfOmegac0Candidate.ldlOmegac, - kfOmegac0Candidate.chi2NdfTopoV0ToPv, kfOmegac0Candidate.chi2NdfTopoCascToPv, kfOmegac0Candidate.chi2NdfTopoPiFromOmegacToPv, kfOmegac0Candidate.chi2NdfTopoOmegacToPv, + kfOmegac0Candidate.chi2NdfTopoV0ToPv, kfOmegac0Candidate.chi2NdfTopoCascToPv, kfOmegac0Candidate.chi2NdfTopoPiFromOmegacToPv, kfOmegac0Candidate.chi2NdfTopoOmegacToPv, kfOmegac0Candidate.deviationPiFromOmegacToPv, kfOmegac0Candidate.chi2NdfTopoV0ToCasc, kfOmegac0Candidate.chi2NdfTopoCascToOmegac, kfOmegac0Candidate.decayLenXYLambda, kfOmegac0Candidate.decayLenXYCasc, kfOmegac0Candidate.decayLenXYOmegac, kfOmegac0Candidate.cosPaV0ToCasc, kfOmegac0Candidate.cosPaCascToOmegac, kfOmegac0Candidate.cosPaXYV0ToCasc, kfOmegac0Candidate.cosPaXYCascToOmegac, diff --git a/PWGHF/TableProducer/treeCreatorOmegacToOmegaPi.cxx b/PWGHF/TableProducer/treeCreatorOmegacToOmegaPi.cxx index 223e9a65ea7..48c965826e3 100644 --- a/PWGHF/TableProducer/treeCreatorOmegacToOmegaPi.cxx +++ b/PWGHF/TableProducer/treeCreatorOmegacToOmegaPi.cxx @@ -121,6 +121,7 @@ DECLARE_SOA_COLUMN(Chi2TopoV0ToPv, chi2TopoV0ToPv, float); DECLARE_SOA_COLUMN(Chi2TopoCascToPv, chi2TopoCascToPv, float); DECLARE_SOA_COLUMN(Chi2TopoPiFromOmegacToPv, chi2TopoPiFromOmegacToPv, float); DECLARE_SOA_COLUMN(Chi2TopoOmegacToPv, chi2TopoOmegacToPv, float); +DECLARE_SOA_COLUMN(DeviationPiFromOmegacToPv, deviationPiFromOmegacToPv, float); DECLARE_SOA_COLUMN(Chi2TopoV0ToCasc, chi2TopoV0ToCasc, float); DECLARE_SOA_COLUMN(Chi2TopoCascToOmegac, chi2TopoCascToOmegac, float); DECLARE_SOA_COLUMN(DecayLenXYLambda, decayLenXYLambda, float); @@ -185,7 +186,7 @@ DECLARE_SOA_TABLE(HfKfOmegacFulls, "AOD", "HFKFOMEGACFULL", full::Chi2GeoV0, full::Chi2GeoCasc, full::Chi2GeoOmegac, full::Chi2MassV0, full::Chi2MassCasc, full::V0ldl, full::Cascldl, full::Omegacldl, - full::Chi2TopoV0ToPv, full::Chi2TopoCascToPv, full::Chi2TopoPiFromOmegacToPv, full::Chi2TopoOmegacToPv, + full::Chi2TopoV0ToPv, full::Chi2TopoCascToPv, full::Chi2TopoPiFromOmegacToPv, full::Chi2TopoOmegacToPv, full::DeviationPiFromOmegacToPv, full::Chi2TopoV0ToCasc, full::Chi2TopoCascToOmegac, full::DecayLenXYLambda, full::DecayLenXYCasc, full::DecayLenXYOmegac, full::CosPaV0ToCasc, full::CosPaV0ToPv, full::CosPaCascToOmegac, full::CosPaCascToPv, full::CosPaOmegacToPv, @@ -201,20 +202,20 @@ DECLARE_SOA_TABLE(HfKfOmegacFulls, "AOD", "HFKFOMEGACFULL", DECLARE_SOA_TABLE(HfKfOmegacLites, "AOD", "HFKFOMEGACLITE", full::NSigmaTPCPiFromOmegac, full::NSigmaTOFPiFromOmegac, full::NSigmaTPCKaFromCasc, full::NSigmaTOFKaFromCasc, full::NSigmaTPCPiFromV0, full::NSigmaTPCPrFromV0, - full::KfDcaXYPiFromOmegac, full::DcaCharmBaryonDau, full::KfDcaXYCascToPv, - full::V0ldl, full::Cascldl, full::Omegacldl, full::Chi2TopoPiFromOmegacToPv, + full::KfDcaXYPiFromOmegac, full::DcaCharmBaryonDau, full::KfDcaXYCascToPv, full::DcaCascDau, + full::V0ldl, full::Cascldl, full::Omegacldl, full::Chi2TopoPiFromOmegacToPv, full::Chi2TopoOmegacToPv, full::DeviationPiFromOmegacToPv, full::DecayLenXYOmegac, full::CosPaCascToPv, full::CosPaOmegacToPv, full::InvMassCascade, full::InvMassCharmBaryon, full::KfptPiFromOmegac, full::KfptOmegac, full::CosThetaStarPiFromOmegac, full::CtOmegac, full::EtaOmegac, full::V0Chi2OverNdf, full::CascChi2OverNdf, full::OmegacChi2OverNdf, - full::MassV0Chi2OverNdf, full::MassCascChi2OverNdf, full::CascRejectInvmass, + full::CascRejectInvmass, full::FlagMcMatchRec, full::OriginRec, full::CollisionMatched); } // namespace o2::aod /// Writes the full information in an output TTree -struct HfTreeCreatorOmegac0ToOmegaPi { +struct HfTreeCreatorOmegacToOmegaPi { Produces rowCandidateLite; Produces rowKfCandidateFull; @@ -342,6 +343,7 @@ struct HfTreeCreatorOmegac0ToOmegaPi { candidate.chi2TopoCascToPv(), candidate.chi2TopoPiFromOmegacToPv(), candidate.chi2TopoOmegacToPv(), + candidate.deviationPiFromOmegacToPv(), candidate.chi2TopoV0ToCasc(), candidate.chi2TopoCascToOmegac(), candidate.decayLenXYLambda(), @@ -393,10 +395,13 @@ struct HfTreeCreatorOmegac0ToOmegaPi { candidate.kfDcaXYPiFromOmegac(), candidate.dcaCharmBaryonDau(), candidate.kfDcaXYCascToPv(), + candidate.dcaCascDau(), candidate.v0ldl(), candidate.cascldl(), candidate.omegacldl(), candidate.chi2TopoPiFromOmegacToPv(), + candidate.chi2TopoOmegacToPv(), + candidate.deviationPiFromOmegacToPv(), candidate.decayLenXYOmegac(), candidate.cosPACasc(), candidate.cosPACharmBaryon(), @@ -410,8 +415,6 @@ struct HfTreeCreatorOmegac0ToOmegaPi { candidate.v0Chi2OverNdf(), candidate.cascChi2OverNdf(), candidate.omegacChi2OverNdf(), - candidate.massV0Chi2OverNdf(), - candidate.massCascChi2OverNdf(), candidate.cascRejectInvmass(), flagMc, originMc, @@ -434,7 +437,7 @@ struct HfTreeCreatorOmegac0ToOmegaPi { fillCandidateLite(candidate, -7, RecoDecay::OriginType::None, false); } } - PROCESS_SWITCH(HfTreeCreatorOmegac0ToOmegaPi, processDataLite, "Process data", true); + PROCESS_SWITCH(HfTreeCreatorOmegacToOmegaPi, processDataLite, "Process data", true); void processKfDataFull(MyEventTable const& collisions, MyTrackTable const&, soa::Join const& candidates) @@ -451,7 +454,7 @@ struct HfTreeCreatorOmegac0ToOmegaPi { fillKfCandidate(candidate, -7, RecoDecay::OriginType::None, false); } } - PROCESS_SWITCH(HfTreeCreatorOmegac0ToOmegaPi, processKfDataFull, "Process KF data", false); + PROCESS_SWITCH(HfTreeCreatorOmegacToOmegaPi, processKfDataFull, "Process KF data", false); void processKfDataLite(MyEventTable const& collisions, MyTrackTable const&, soa::Join const& candidates) @@ -468,7 +471,7 @@ struct HfTreeCreatorOmegac0ToOmegaPi { fillKfCandidateLite(candidate, -7, RecoDecay::OriginType::None, false); } } - PROCESS_SWITCH(HfTreeCreatorOmegac0ToOmegaPi, processKfDataLite, "Process KF data Lite", false); + PROCESS_SWITCH(HfTreeCreatorOmegacToOmegaPi, processKfDataLite, "Process KF data Lite", false); void processMcLite(MyEventTable const& collisions, MyTrackTable const&, soa::Join const& candidates) @@ -485,7 +488,7 @@ struct HfTreeCreatorOmegac0ToOmegaPi { fillCandidateLite(candidate, candidate.flagMcMatchRec(), candidate.originRec(), candidate.collisionMatched()); } } - PROCESS_SWITCH(HfTreeCreatorOmegac0ToOmegaPi, processMcLite, "Process MC", false); + PROCESS_SWITCH(HfTreeCreatorOmegacToOmegaPi, processMcLite, "Process MC", false); void processKFMcFull(MyEventTable const& collisions, MyTrackTable const&, soa::Join const& candidates) @@ -508,7 +511,7 @@ struct HfTreeCreatorOmegac0ToOmegaPi { } } } - PROCESS_SWITCH(HfTreeCreatorOmegac0ToOmegaPi, processKFMcFull, "Process KF MC", false); + PROCESS_SWITCH(HfTreeCreatorOmegacToOmegaPi, processKFMcFull, "Process KF MC", false); void processKFMcLite(MyEventTable const& collisions, MyTrackTable const&, soa::Join const& candidates) @@ -522,15 +525,21 @@ struct HfTreeCreatorOmegac0ToOmegaPi { // Filling candidate properties rowCandidateLite.reserve(candidates.size()); for (const auto& candidate : candidates) { - fillKfCandidateLite(candidate, candidate.flagMcMatchRec(), candidate.originRec(), candidate.collisionMatched()); + if (keepOnlyMcSignal) { + if (candidate.originRec() != 0) { + fillKfCandidateLite(candidate, candidate.flagMcMatchRec(), candidate.originRec(), candidate.collisionMatched()); + } + } else { + fillKfCandidateLite(candidate, candidate.flagMcMatchRec(), candidate.originRec(), candidate.collisionMatched()); + } } } - PROCESS_SWITCH(HfTreeCreatorOmegac0ToOmegaPi, processKFMcLite, "Process KF MC Lite", false); + PROCESS_SWITCH(HfTreeCreatorOmegacToOmegaPi, processKFMcLite, "Process KF MC Lite", false); }; // end of struct WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc)}; + adaptAnalysisTask(cfgc)}; } From 25ace3427a102ec4e8cd023e14357a2bf0f9cf78 Mon Sep 17 00:00:00 2001 From: fuchuncui <162277233+fuchuncui@users.noreply.github.com> Date: Thu, 20 Mar 2025 16:56:47 +0800 Subject: [PATCH 0773/1650] [PWGCF] Fix a bug (#10586) --- PWGCF/Flow/Tasks/flowEfficiencyCasc.cxx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowEfficiencyCasc.cxx b/PWGCF/Flow/Tasks/flowEfficiencyCasc.cxx index e3de908686b..134b017203a 100644 --- a/PWGCF/Flow/Tasks/flowEfficiencyCasc.cxx +++ b/PWGCF/Flow/Tasks/flowEfficiencyCasc.cxx @@ -162,20 +162,20 @@ struct FlowEfficiencyCasc { if (!cfgcheckMCParticle || (std::abs(pdgCode) == kOmegaMinus && std::abs(cascMC.pdgCodeV0()) == kLambda0 && std::abs(cascMC.pdgCodeBachelor()) == kKPlus)) { if (casc.sign() < 0 && (casc.mOmega() > 1.63) && (casc.mOmega() < 1.71) && std::fabs(casc.yOmega()) < cfgCasc_rapidity && (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { - registry.fill(HIST("h2DRecOmega"), casc.pt(), rectracknum, casc.mOmega()); + registry.fill(HIST("h3DRecOmega"), casc.pt(), rectracknum, casc.mOmega()); } else if (casc.sign() < 0 && (casc.mOmega() > 1.63) && (casc.mOmega() < 1.71) && std::fabs(casc.yOmega()) < cfgCasc_rapidity && (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0]))) { - registry.fill(HIST("h2DRecOmega"), casc.pt(), rectracknum, casc.mOmega()); + registry.fill(HIST("h3DRecOmega"), casc.pt(), rectracknum, casc.mOmega()); } } // Xi and antiXi if (!cfgcheckMCParticle || (std::abs(pdgCode) == kXiMinus && std::abs(cascMC.pdgCodeV0()) == kLambda0 && std::abs(cascMC.pdgCodeBachelor()) == kPiPlus)) { if (casc.sign() < 0 && (casc.mXi() > 1.30) && (casc.mXi() < 1.37) && std::fabs(casc.yXi()) < cfgCasc_rapidity && (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { - registry.fill(HIST("h2DRecXi"), casc.pt(), rectracknum, casc.mXi()); + registry.fill(HIST("h3DRecXi"), casc.pt(), rectracknum, casc.mXi()); } else if (casc.sign() < 0 && (casc.mXi() > 1.30) && (casc.mXi() < 1.37) && std::fabs(casc.yXi()) < cfgCasc_rapidity && (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0]))) { - registry.fill(HIST("h2DRecXi"), casc.pt(), rectracknum, casc.mXi()); + registry.fill(HIST("h3DRecXi"), casc.pt(), rectracknum, casc.mXi()); } } } @@ -219,18 +219,18 @@ struct FlowEfficiencyCasc { if (!cfgcheckMCParticle || (std::abs(pdgCode) == kK0Short && v0MC.pdgCodePositive() == kPiPlus && v0MC.pdgCodeNegative() == kPiMinus)) { if (v0.qtarm() / std::fabs(v0.alpha()) > cfgv0_ArmPodocut && std::fabs(v0.y()) < 0.5 && std::fabs(v0.mK0Short() - o2::constants::physics::MassK0Short) < cfgv0_mk0swindow && (!cfgcheckDauTPC || (std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { - registry.fill(HIST("h2DRecK0s"), v0.pt(), rectracknum, v0.mK0Short()); + registry.fill(HIST("h3DRecK0s"), v0.pt(), rectracknum, v0.mK0Short()); } } // Lambda and antiLambda if (std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < cfgv0_mlambdawindow && (!cfgcheckDauTPC || (std::fabs(v0posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { if (!cfgcheckMCParticle || (std::abs(pdgCode) == kLambda0 && v0MC.pdgCodePositive() == kProton && v0MC.pdgCodeNegative() == kPiMinus)) - registry.fill(HIST("h2DRecLambda"), v0.pt(), rectracknum, v0.mLambda()); + registry.fill(HIST("h3DRecLambda"), v0.pt(), rectracknum, v0.mLambda()); } else if (std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < cfgv0_mlambdawindow && (!cfgcheckDauTPC || (std::fabs(v0negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0]))) { if (!cfgcheckMCParticle || (std::abs(pdgCode) == kLambda0 && v0MC.pdgCodePositive() == kPiPlus && v0MC.pdgCodeNegative() == kProtonBar)) - registry.fill(HIST("h2DRecLambda"), v0.pt(), rectracknum, v0.mLambda()); + registry.fill(HIST("h3DRecLambda"), v0.pt(), rectracknum, v0.mLambda()); } } } From 9b4d746765cbc9ab348e0e3af525687d1c609506 Mon Sep 17 00:00:00 2001 From: Kai Cui <129373281+kcui1@users.noreply.github.com> Date: Thu, 20 Mar 2025 18:12:15 +0800 Subject: [PATCH 0774/1650] [PWGLF] Bug Fixing for Closure Test of H-Strangeness Correlation (#10569) --- PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx index d3359190587..8d8821059b1 100644 --- a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx +++ b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx @@ -1378,7 +1378,7 @@ struct HStrangeCorrelation { } if (!doAssocPhysicalPrimary || mcParticle.isPhysicalPrimary()) { - if (std::abs(mcParticle.pdgCode()) == 310 && doCorrelationK0Short) { + if (mcParticle.pdgCode() == 310 && doCorrelationK0Short) { histos.fill(HIST("hGeneratedQAPtAssociatedK0"), gpt, 0.0f); // step 1: before all selections } } @@ -1471,7 +1471,7 @@ struct HStrangeCorrelation { } if (!doAssocPhysicalPrimary || mcParticle.isPhysicalPrimary()) { - if (std::abs(mcParticle.pdgCode()) == 310 && doCorrelationK0Short) { + if (mcParticle.pdgCode() == 310 && doCorrelationK0Short) { histos.fill(HIST("hGeneratedQAPtAssociatedK0"), gpt, 1.0f); // step 2: before all selections } } @@ -1531,7 +1531,7 @@ struct HStrangeCorrelation { } if (!doAssocPhysicalPrimary || mcParticle.isPhysicalPrimary()) { - if (std::abs(mcParticle.pdgCode()) == 310 && doCorrelationK0Short) { + if (mcParticle.pdgCode() == 310 && doCorrelationK0Short) { histos.fill(HIST("hClosureQAPtAssociatedK0"), gpt, 0.0f); // step 1: no event selection whatsoever } } @@ -1590,7 +1590,7 @@ struct HStrangeCorrelation { } if (!doAssocPhysicalPrimary || mcParticle.isPhysicalPrimary()) { - if (std::abs(mcParticle.pdgCode()) == 310 && doCorrelationK0Short) { + if (mcParticle.pdgCode() == 310 && doCorrelationK0Short) { histos.fill(HIST("hClosureQAPtAssociatedK0"), gpt, 1.0f); // step 2: after event selection } } @@ -1616,7 +1616,7 @@ struct HStrangeCorrelation { piIndices.emplace_back(iteratorNum); histos.fill(HIST("ClosureTest/hPion"), gpt, geta, gphi); } - if (std::abs(mcParticle.pdgCode()) == 310 && doCorrelationK0Short) { + if (mcParticle.pdgCode() == 310 && doCorrelationK0Short) { k0ShortIndices.emplace_back(iteratorNum); histos.fill(HIST("ClosureTest/hK0Short"), gpt, geta, gphi); } From 69de5fbbe7f240eb2a871e953cd681aaf44d8366 Mon Sep 17 00:00:00 2001 From: Gyula Bencedi Date: Thu, 20 Mar 2025 11:24:52 +0100 Subject: [PATCH 0775/1650] [PWGLF] Fix missing centrality axis in hEff histos (#10587) Co-authored-by: ALICE Action Bot --- PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx b/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx index 6c4a6775b8e..13ae6acbc83 100644 --- a/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx +++ b/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx @@ -679,13 +679,13 @@ struct DndetaMFTPbPb { if (doprocessEfficiencyCentFT0C) { qaregistry.add({"Tracks/Centrality/hEffRec", - "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", + "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); centrality; occupancy", {HistType::kTHnSparseF, - {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); + {ptAxis, phiAxis, etaAxis, zAxis, centralityAxis, occupancyAxis}}}); qaregistry.add({"Tracks/Centrality/hEffFake", - "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); occupancy", + "; p_{T} (GeV/c); #varphi; #eta; Z_{vtx} (cm); centrality; occupancy", {HistType::kTHnSparseF, - {ptAxis, phiAxis, etaAxis, zAxis, occupancyAxis}}}); + {ptAxis, phiAxis, etaAxis, zAxis, centralityAxis, occupancyAxis}}}); } } From a5ad13a2fb82eccc4efd3cd639e0b29423d305db Mon Sep 17 00:00:00 2001 From: Rafael Manhart <56776511+RafRaf11@users.noreply.github.com> Date: Thu, 20 Mar 2025 12:12:39 +0100 Subject: [PATCH 0776/1650] [PWGLF] Update NucleiHistTask.cxx (#10575) --- PWGLF/Tasks/Nuspex/NucleiHistTask.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Nuspex/NucleiHistTask.cxx b/PWGLF/Tasks/Nuspex/NucleiHistTask.cxx index 055b869928a..e3152c05cfb 100644 --- a/PWGLF/Tasks/Nuspex/NucleiHistTask.cxx +++ b/PWGLF/Tasks/Nuspex/NucleiHistTask.cxx @@ -779,7 +779,7 @@ struct NucleiHistTask { histTrackcuts_data_particle->AddBinContent(12); - if (TPCnSigma_particle > nsigmacutLow && TPCnSigma_particle < nsigmacutHigh && TMath::Abs(track.dcaZ()) < 2.0 && TMath::Abs(track.dcaXY()) < 0.5) { + if (TPCnSigma_particle > nsigmacutLow && TPCnSigma_particle < nsigmacutHigh) { if (track.sign() > 0) { particle_reg.fill(HIST("histDcaVsPtData"), momentum, track.dcaXY()); particle_reg.fill(HIST("histDcaZVsPtData"), momentum, track.dcaZ()); From c969debc84d2339ae92e5f908af2b543eec1226b Mon Sep 17 00:00:00 2001 From: ilikmeta <152337132+ilikmeta@users.noreply.github.com> Date: Thu, 20 Mar 2025 06:26:20 -0500 Subject: [PATCH 0777/1650] [PWGCF] Add correlation matrix for MC (#10585) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/flowGfwTask.cxx | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowGfwTask.cxx b/PWGCF/Flow/Tasks/flowGfwTask.cxx index b67cc49f6d6..c4bcae74e12 100644 --- a/PWGCF/Flow/Tasks/flowGfwTask.cxx +++ b/PWGCF/Flow/Tasks/flowGfwTask.cxx @@ -104,7 +104,7 @@ struct FlowGfwTask { O2_DEFINE_CONFIGURABLE(cfgOccupancy, bool, false, "Bool for event selection on detector occupancy"); O2_DEFINE_CONFIGURABLE(cfgMultCut, bool, false, "Use additional event cut on mult correlations"); O2_DEFINE_CONFIGURABLE(cfgV0AT0A5Sigma, bool, false, "V0A T0A 5 sigma cut") - O2_DEFINE_CONFIGURABLE(cfgGlobalplusITS, bool, true, "Global and ITS tracks") + O2_DEFINE_CONFIGURABLE(cfgGlobalplusITS, bool, false, "Global and ITS tracks") O2_DEFINE_CONFIGURABLE(cfgGlobalonly, bool, false, "Global only tracks") O2_DEFINE_CONFIGURABLE(cfgITSonly, bool, false, "ITS only tracks") O2_DEFINE_CONFIGURABLE(cfgFineBinning, bool, false, "Manually change to fine binning") @@ -430,6 +430,10 @@ struct FlowGfwTask { registry.add("hPtMCGen05", "Monte Carlo Truth 0-5%; pT (GeV/c)", {HistType::kTH1D, {axisPt}}); registry.add("hCenMCGen05", "Monte Carlo Truth 0-5%; Centrality (%)", {HistType::kTH1D, {axisCentrality}}); registry.add("hPtNchMCGen05", "Truth production 0-5%; pT (GeV/c); multiplicity", {HistType::kTH2D, {axisPt, axisNch}}); + + registry.add("hCorr", "Correlation Matrix; N_{ch True}; N_{ch Reco}", {HistType::kTH2D, {axisNch, axisNch}}); + registry.add("hCorr05", "Correlation Matrix 0-5%; N_{ch True}; N_{ch Reco}", {HistType::kTH2D, {axisNch, axisNch}}); + registry.add("PtMC_pi", "", kTH2F, {{axisCentrality}, {axisPt}}); registry.add("PtMC_ka", "", kTH2F, {{axisCentrality}, {axisPt}}); registry.add("PtMC_pr", "", kTH2F, {{axisCentrality}, {axisPt}}); @@ -1112,8 +1116,8 @@ struct FlowGfwTask { registry.fill(HIST("nRecColvsCent"), collisions.size(), collision.centFT0C()); registry.fill(HIST("T0Ccent"), centrality); - const auto& groupedTracks = tracks.sliceBy(perCollision, collision.globalIndex()); - for (const auto& track : groupedTracks) { + const auto& groupedTracksReco = tracks.sliceBy(perCollision, collision.globalIndex()); + for (const auto& track : groupedTracksReco) { if (!trackSelected(track)) continue; @@ -1205,6 +1209,14 @@ struct FlowGfwTask { } } + for (const auto& track : groupedTracksReco) { + + registry.fill(HIST("hCorr"), numberOfTracks[0], track.size()); + if (centrality >= 0 && centrality <= 5) { + registry.fill(HIST("hCorr05"), numberOfTracks[0], track.size()); + } + } + registry.fill(HIST("PtMC_ch"), centrality, particle.pt()); if (particle.pdgCode() == kPiPlus || particle.pdgCode() == kPiMinus) { // pion @@ -1229,7 +1241,7 @@ struct FlowGfwTask { } } } - PROCESS_SWITCH(FlowGfwTask, processpTEff, "Process pT Eff", true); + PROCESS_SWITCH(FlowGfwTask, processpTEff, "Process pT Eff", false); }; // End of struct From 9de499c0c76aafc644dd2d377fd668209745fc61 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Thu, 20 Mar 2025 13:13:38 +0100 Subject: [PATCH 0778/1650] [PWGLF] Modify histogram bining (#10589) --- PWGLF/Tasks/Resonances/f1protoncorrelation.cxx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/PWGLF/Tasks/Resonances/f1protoncorrelation.cxx b/PWGLF/Tasks/Resonances/f1protoncorrelation.cxx index 4d1a9bb094f..16077599205 100644 --- a/PWGLF/Tasks/Resonances/f1protoncorrelation.cxx +++ b/PWGLF/Tasks/Resonances/f1protoncorrelation.cxx @@ -84,13 +84,13 @@ struct f1protoncorrelation { histos.add("hNsigmaPionKaonTPC", "Nsigma Pion Kaon TPC correlation", kTH2F, {{100, -5.0f, 5.0f}, {100, -5.0f, 5.0f}}); histos.add("h2SameEventPtCorrelation", "Pt correlation of F1 and proton", kTH3F, {{100, 0.0f, 1.0f}, {100, 0.0, 10.0}, {100, 0.0, 10.0}}); - histos.add("h2SameEventInvariantMassUnlike_mass", "Unlike Sign Invariant mass of f1 same event", kTH3F, {{300, 0.0f, 3.0f}, {100, 0.0, 10.0}, {800, 1.0, 1.8}}); - histos.add("h2SameEventInvariantMassLike_mass", "Like Sign Invariant mass of f1 same event", kTH3F, {{300, 0.0f, 3.0f}, {100, 0.0, 10.0}, {800, 1.0, 1.8}}); - histos.add("h2SameEventInvariantMassRot_mass", "Rotational Invariant mass of f1 same event", kTH3F, {{300, 0.0f, 3.0f}, {100, 0.0, 10.0}, {800, 1.0, 1.8}}); + histos.add("h2SameEventInvariantMassUnlike_mass", "Unlike Sign Invariant mass of f1 same event", kTH3F, {{300, 0.0f, 3.0f}, {500, 0.0, 100.0}, {800, 1.0, 1.8}}); + histos.add("h2SameEventInvariantMassLike_mass", "Like Sign Invariant mass of f1 same event", kTH3F, {{300, 0.0f, 3.0f}, {500, 0.0, 100.0}, {800, 1.0, 1.8}}); + histos.add("h2SameEventInvariantMassRot_mass", "Rotational Invariant mass of f1 same event", kTH3F, {{300, 0.0f, 3.0f}, {500, 0.0, 100.0}, {800, 1.0, 1.8}}); - histos.add("h2MixEventInvariantMassUnlike_mass", "Unlike Sign Invariant mass of f1 mix event", kTH3F, {{300, 0.0f, 3.0f}, {100, 0.0, 10.0}, {800, 1.0, 1.8}}); - histos.add("h2MixEventInvariantMassLike_mass", "Like Sign Invariant mass of f1 mix event", kTH3F, {{300, 0.0f, 3.0f}, {100, 0.0, 10.0}, {800, 1.0, 1.8}}); - histos.add("h2MixEventInvariantMassRot_mass", "Rotational Sign Invariant mass of f1 mix event", kTH3F, {{300, 0.0f, 3.0f}, {100, 0.0, 10.0}, {800, 1.0, 1.8}}); + histos.add("h2MixEventInvariantMassUnlike_mass", "Unlike Sign Invariant mass of f1 mix event", kTH3F, {{300, 0.0f, 3.0f}, {500, 0.0, 100.0}, {800, 1.0, 1.8}}); + histos.add("h2MixEventInvariantMassLike_mass", "Like Sign Invariant mass of f1 mix event", kTH3F, {{300, 0.0f, 3.0f}, {500, 0.0, 100.0}, {800, 1.0, 1.8}}); + histos.add("h2MixEventInvariantMassRot_mass", "Rotational Sign Invariant mass of f1 mix event", kTH3F, {{300, 0.0f, 3.0f}, {500, 0.0, 100.0}, {800, 1.0, 1.8}}); const AxisSpec thnAxisInvMass{configThnAxisInvMass, "#it{M} (GeV/#it{c}^{2})"}; const AxisSpec thnAxisPt{configThnAxisPt, "#it{p}_{T} (GeV/#it{c})"}; From 5bc5149527e44a135c82414c7f8fcc5d1e2ba3e3 Mon Sep 17 00:00:00 2001 From: Fabrizio Date: Thu, 20 Mar 2025 13:50:34 +0100 Subject: [PATCH 0779/1650] [PWGHF] Add missing conditions for different process functions (#10590) --- PWGHF/TableProducer/trackIndexSkimCreator.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PWGHF/TableProducer/trackIndexSkimCreator.cxx b/PWGHF/TableProducer/trackIndexSkimCreator.cxx index 8f0cc57f9f6..a384b076bac 100644 --- a/PWGHF/TableProducer/trackIndexSkimCreator.cxx +++ b/PWGHF/TableProducer/trackIndexSkimCreator.cxx @@ -1268,7 +1268,7 @@ struct HfTrackIndexSkimCreator { void init(InitContext const&) { - if (!doprocess2And3ProngsWithPvRefit && !doprocess2And3ProngsNoPvRefit) { + if (!doprocess2And3ProngsWithPvRefit && !doprocess2And3ProngsNoPvRefit && !doprocess2And3ProngsWithPvRefitWithPidForHfFiltersBdt && !doprocess2And3ProngsNoPvRefitWithPidForHfFiltersBdt) { return; } @@ -1356,7 +1356,7 @@ struct HfTrackIndexSkimCreator { registry.add("hMassDstarToD0Pi", "D^{*#plus} candidates;inv. mass (K #pi #pi) - mass (K #pi) (GeV/#it{c}^{2});entries", {HistType::kTH1D, {{500, 0.135, 0.185}}}); // needed for PV refitting - if (doprocess2And3ProngsWithPvRefit) { + if (doprocess2And3ProngsWithPvRefit || doprocess2And3ProngsWithPvRefitWithPidForHfFiltersBdt) { AxisSpec axisCollisionX{100, -20.f, 20.f, "X (cm)"}; AxisSpec axisCollisionY{100, -20.f, 20.f, "Y (cm)"}; AxisSpec axisCollisionZ{100, -20.f, 20.f, "Z (cm)"}; @@ -1916,7 +1916,7 @@ struct HfTrackIndexSkimCreator { bool pvRefitDoable = vertexer.prepareVertexRefit(vecPvContributorTrackParCov, primVtx); if (!pvRefitDoable) { LOG(info) << "Not enough tracks accepted for the refit"; - if (doprocess2And3ProngsWithPvRefit && config.fillHistograms) { + if ((doprocess2And3ProngsWithPvRefit || doprocess2And3ProngsWithPvRefitWithPidForHfFiltersBdt) && config.fillHistograms) { registry.fill(HIST("PvRefit/hNContribPvRefitNotDoable"), collision.numContrib()); } } @@ -1927,7 +1927,7 @@ struct HfTrackIndexSkimCreator { /// PV refitting, if the tracks contributed to this at the beginning o2::dataformats::VertexBase primVtxBaseRecalc; bool recalcPvRefit = false; - if (doprocess2And3ProngsWithPvRefit && pvRefitDoable) { + if ((doprocess2And3ProngsWithPvRefit || doprocess2And3ProngsWithPvRefitWithPidForHfFiltersBdt) && pvRefitDoable) { if (config.fillHistograms) { registry.fill(HIST("PvRefit/verticesPerCandidate"), 2); } From 98eac9112684d8f409de7f61a9abc297fdc10d93 Mon Sep 17 00:00:00 2001 From: suyoupeng <109774812+15071832337@users.noreply.github.com> Date: Thu, 20 Mar 2025 21:01:32 +0800 Subject: [PATCH 0780/1650] [PWGLF] Lambda local polarization induced by jet in pp collision 13.6 TeV (#10588) --- .../Strangeness/lambdaJetpolarizationbuilder.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/lambdaJetpolarizationbuilder.cxx b/PWGLF/TableProducer/Strangeness/lambdaJetpolarizationbuilder.cxx index 6ed3673fb9c..b7202d35142 100644 --- a/PWGLF/TableProducer/Strangeness/lambdaJetpolarizationbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/lambdaJetpolarizationbuilder.cxx @@ -645,7 +645,7 @@ struct myAnalysis { JEhistos.fill(HIST("v0AntiLambdapx"), v0.px()); JEhistos.fill(HIST("v0AntiLambdapy"), v0.py()); JEhistos.fill(HIST("v0AntiLambdapz"), v0.pz()); - myTableanti(outputCollisionsV0.lastIndex(), v0.collisionId(), v0.px(), v0.py(), v0.pz(), v0.pt(), v0.mAntiLambda(), pos.px(), pos.py(), pos.pz()); + myTableanti(outputCollisionsV0.lastIndex(), v0.collisionId(), v0.px(), v0.py(), v0.pz(), v0.pt(), v0.mAntiLambda(), neg.px(), neg.py(), neg.pz()); } else if (passedInitLambdaSelection(v0, pos, neg) && ifinitpasslambda) { JEhistos.fill(HIST("hMassVsPtAntiLambda"), v0.pt(), v0.mAntiLambda()); JEhistos.fill(HIST("hMassAntiLambda"), v0.mAntiLambda()); @@ -655,7 +655,7 @@ struct myAnalysis { JEhistos.fill(HIST("v0AntiLambdapx"), v0.px()); JEhistos.fill(HIST("v0AntiLambdapy"), v0.py()); JEhistos.fill(HIST("v0AntiLambdapz"), v0.pz()); - myTableanti(outputCollisionsV0.lastIndex(), v0.collisionId(), v0.px(), v0.py(), v0.pz(), v0.pt(), v0.mLambda(), pos.px(), pos.py(), pos.pz()); + myTableanti(outputCollisionsV0.lastIndex(), v0.collisionId(), v0.px(), v0.py(), v0.pz(), v0.pt(), v0.mAntiLambda(), neg.px(), neg.py(), neg.pz()); } } JEhistos.fill(HIST("V0Counts"), V0NumbersPerEvent); From 0efdd5f6d11c215514aa2e30ea6794b8f5065397 Mon Sep 17 00:00:00 2001 From: Francesca Ercolessi Date: Thu, 20 Mar 2025 14:27:47 +0100 Subject: [PATCH 0781/1650] [PWGLF] [WIP] [PWGLF] nuclei-proton correlation: add pp correlation in mc gen (#10591) --- .../Tasks/Nuspex/hadronnucleicorrelation.cxx | 145 +++++++++++++++--- 1 file changed, 126 insertions(+), 19 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx b/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx index 60b64d1a650..fc52760aa3c 100644 --- a/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx +++ b/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx @@ -162,6 +162,9 @@ struct hadronnucleicorrelation { std::vector> hPIDEtaPhiRec_AntiDeAntiPr_ME; std::vector> hPIDEtaPhiGen_AntiDeAntiPr_ME; + std::vector> hEtaPhiGen_AntiPrAntiPr_SE; + std::vector> hEtaPhiGen_AntiPrAntiPr_ME; + int nBinspT; TH2F* hEffpTEta_proton; TH2F* hEffpTEta_antiproton; @@ -238,6 +241,13 @@ struct hadronnucleicorrelation { auto htempMEGen_AntiDeAntiPr = registry.add(Form("hEtaPhiGen_AntiDeAntiPr_ME_pt%02.0f%02.0f", pTBins.value.at(i) * 10, pTBins.value.at(i + 1) * 10), Form("Gen #Delta#eta#Delta#phi (%.1f(Form("hEtaPhiGen_AntiPrAntiPr_SE_pt%02.0f%02.0f", pTBins.value.at(i) * 10, pTBins.value.at(i + 1) * 10), + Form("Gen #Delta#eta#Delta#phi (%.1f(Form("hEtaPhiGen_AntiPrAntiPr_ME_pt%02.0f%02.0f", pTBins.value.at(i) * 10, pTBins.value.at(i + 1) * 10), + Form("Gen #Delta#eta#Delta#phi (%.1f(HIST("Generated/hNEventsMC"))->GetXaxis()->SetBinLabel(1, "All"); + + registry.add("Generated/hQAProtons", "hQAProtons", {HistType::kTH1D, {{5, 0.f, 5.f}}}); + registry.get(HIST("Generated/hQAProtons"))->GetXaxis()->SetBinLabel(1, "All"); + registry.get(HIST("Generated/hQAProtons"))->GetXaxis()->SetBinLabel(2, "PhysicalPrimary"); + registry.get(HIST("Generated/hQAProtons"))->GetXaxis()->SetBinLabel(3, "|#eta|<0.8"); + registry.get(HIST("Generated/hQAProtons"))->GetXaxis()->SetBinLabel(4, "no daughters"); + registry.get(HIST("Generated/hQAProtons"))->GetXaxis()->SetBinLabel(5, "d daughter"); + + registry.add("Generated/hQADeuterons", "hQADeuterons", {HistType::kTH1D, {{3, 0.f, 3.f}}}); + registry.get(HIST("Generated/hQADeuterons"))->GetXaxis()->SetBinLabel(1, "All"); + registry.get(HIST("Generated/hQADeuterons"))->GetXaxis()->SetBinLabel(2, "PhysicalPrimary"); + registry.get(HIST("Generated/hQADeuterons"))->GetXaxis()->SetBinLabel(3, "|#eta|<0.8"); } } @@ -583,6 +605,34 @@ struct hadronnucleicorrelation { } } + template + void mixMCParticlesIdentical(Type const& particles1, Type const& particles2) + { + for (auto it1 : particles1) { + for (auto it2 : particles2) { + // Calculate Delta-eta Delta-phi (gen) + float deltaEtaGen = it2->eta() - it1->eta(); + float deltaPhiGen = getDeltaPhi(it2->phi() - it1->phi()); + + if (!ME && std::abs(deltaPhiGen) < 0.001 && std::abs(deltaEtaGen) < 0.001) { + continue; + } + + // Loop over pT bins + for (int k = 0; k < nBinspT; k++) { + if (it1->pt() >= pTBins.value.at(k) && it1->pt() < pTBins.value.at(k + 1)) { + // Use correct histogram based on ME flag + if constexpr (ME) { + hEtaPhiGen_AntiPrAntiPr_ME[k]->Fill(deltaEtaGen, deltaPhiGen, it2->pt()); + } else { + hEtaPhiGen_AntiPrAntiPr_SE[k]->Fill(deltaEtaGen, deltaPhiGen, it2->pt()); + } + } + } + } + } + } + float getDeltaPhi(float deltaPhi) { if (deltaPhi < -TMath::Pi() / 2) { @@ -1289,13 +1339,32 @@ struct hadronnucleicorrelation { { for (auto particle : mcParticles) { + if (particle.pdgCode() == pdgProton) { + registry.fill(HIST("Generated/hQAProtons"), 0.5); + } + if (particle.pdgCode() == pdgDeuteron) { + registry.fill(HIST("Generated/hQADeuterons"), 0.5); + } + if (isPrim && !particle.isPhysicalPrimary()) { continue; } + if (particle.pdgCode() == pdgProton) { + registry.fill(HIST("Generated/hQAProtons"), 1.5); + } + if (particle.pdgCode() == pdgDeuteron) { + registry.fill(HIST("Generated/hQADeuterons"), 1.5); + } if (std::abs(particle.eta()) > etacut) { continue; } + if (particle.pdgCode() == pdgProton) { + registry.fill(HIST("Generated/hQAProtons"), 2.5); + } + if (particle.pdgCode() == pdgDeuteron) { + registry.fill(HIST("Generated/hQADeuterons"), 2.5); + } if (particle.pdgCode() == pdgDeuteron) { selectedparticlesMC_d[particle.mcCollisionId()].push_back(std::make_shared(particle)); @@ -1306,35 +1375,22 @@ struct hadronnucleicorrelation { if (particle.pdgCode() == pdgProton) { if (!particle.has_daughters()) { selectedparticlesMC_p[particle.mcCollisionId()].push_back(std::make_shared(particle)); + registry.fill(HIST("Generated/hQAProtons"), 3.5); } else { - bool isp = false; - + bool isd = false; for (auto& dau : particle.daughters_as()) { - if (dau.pdgCode() == pdgProton) { - isp = true; + if (dau.pdgCode() == pdgDeuteron) { + isd = true; } } - - if (isp) { - selectedparticlesMC_p[particle.mcCollisionId()].push_back(std::make_shared(particle)); + if (isd) { + registry.fill(HIST("Generated/hQAProtons"), 4.5); } } } if (particle.pdgCode() == -pdgProton) { if (!particle.has_daughters()) { selectedparticlesMC_antip[particle.mcCollisionId()].push_back(std::make_shared(particle)); - } else { - bool isantip = false; - - for (auto& dau : particle.daughters_as()) { - if (dau.pdgCode() == -pdgProton) { - isantip = true; - } - } - - if (isantip) { - selectedparticlesMC_antip[particle.mcCollisionId()].push_back(std::make_shared(particle)); - } } } } @@ -1396,6 +1452,57 @@ struct hadronnucleicorrelation { } } } + + // anti-p - anti-p correlation + if (selectedparticlesMC_antip.find(collision1.globalIndex()) != selectedparticlesMC_antip.end()) { + + mixMCParticlesIdentical<0>(selectedparticlesMC_antip[collision1.globalIndex()], selectedparticlesMC_antip[collision1.globalIndex()]); // mixing SE + + int stop3 = 0; + + for (auto collision2 : mcCollisions) { // nested loop on collisions + + if (collision1.globalIndex() == collision2.globalIndex()) { + continue; + } + + if (stop3 > maxmixcollsGen) { + break; + } + + if (selectedparticlesMC_antip.find(collision2.globalIndex()) != selectedparticlesMC_antip.end()) { + mixMCParticlesIdentical<1>(selectedparticlesMC_antip[collision1.globalIndex()], selectedparticlesMC_antip[collision2.globalIndex()]); // mixing ME + } + + stop3++; + } + } + // p - p correlation + if (domatterGen) { + if (selectedparticlesMC_p.find(collision1.globalIndex()) != selectedparticlesMC_p.end()) { + + mixMCParticlesIdentical<0>(selectedparticlesMC_p[collision1.globalIndex()], selectedparticlesMC_p[collision1.globalIndex()]); // mixing SE + + int stop4 = 0; + + for (auto collision2 : mcCollisions) { // nested loop on collisions + + if (collision1.globalIndex() == collision2.globalIndex()) { + continue; + } + + if (stop4 > maxmixcollsGen) { + break; + } + + if (selectedparticlesMC_p.find(collision2.globalIndex()) != selectedparticlesMC_p.end()) { + mixMCParticlesIdentical<1>(selectedparticlesMC_p[collision1.globalIndex()], selectedparticlesMC_p[collision2.globalIndex()]); // mixing ME + } + + stop4++; + } + } + } } // clearing up From de37f6d5ee03d283633cb9863c6ae864343ec78b Mon Sep 17 00:00:00 2001 From: Zuzanna Chochulska <87480906+zchochul@users.noreply.github.com> Date: Thu, 20 Mar 2025 15:41:55 +0100 Subject: [PATCH 0782/1650] PWGCF: FemtoUniverse -- pPhi event historgam filling fix (#10593) Co-authored-by: Zuzanna <01150674@pw.edu.pl> --- PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx index c1dcdf969eb..7dd0de272fe 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx @@ -628,7 +628,7 @@ struct FemtoUniversePairTaskTrackPhi { auto thegroupPartsPhi = partsPhi->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); // auto thegroupPartsPhiDaugh = partsPhiDaugh->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); // auto thegroupPartsKaons = partsKaons->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - + eventHisto.fillQA(col); doSameEvent(thegroupPartsTrack, thegroupPartsPhi, parts, col.magField(), col.multNtr()); } PROCESS_SWITCH(FemtoUniversePairTaskTrackPhi, processSameEvent, "Enable processing same event", true); @@ -662,6 +662,7 @@ struct FemtoUniversePairTaskTrackPhi { auto thegroupPartsPhi = partsPhiMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); // auto thegroupPartsPhiDaugh = partsPhiDaugh->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); // auto thegroupPartsKaons = partsKaons->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + eventHisto.fillQA(col); doSameEvent(thegroupPartsTrack, thegroupPartsPhi, parts, col.magField(), col.multNtr(), mcparts); } PROCESS_SWITCH(FemtoUniversePairTaskTrackPhi, processSameEventMCReco, "Enable processing same event for MC Reco", true); From 588236e0d5f3125a9839414c06cd6bce6c16c6b2 Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Thu, 20 Mar 2025 16:10:22 +0100 Subject: [PATCH 0783/1650] [PWGLF] Adds QA, preparation for modular stra builder (#10581) Co-authored-by: ALICE Builder Co-authored-by: gianniliveraro --- .../Strangeness/lambdakzerobuilder.cxx | 77 +++- .../Strangeness/strangenessbuilder.cxx | 330 +++++++++--------- 2 files changed, 234 insertions(+), 173 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/lambdakzerobuilder.cxx b/PWGLF/TableProducer/Strangeness/lambdakzerobuilder.cxx index 7351501e66c..c1de2354aa4 100644 --- a/PWGLF/TableProducer/Strangeness/lambdakzerobuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/lambdakzerobuilder.cxx @@ -1380,6 +1380,9 @@ struct lambdakzeroPreselector { Configurable forceITSOnlyMesons{"forceITSOnlyMesons", false, "force meson-like daughters to be ITS-only to pass Lambda/AntiLambda selections (yes/no)"}; Configurable minITSCluITSOnly{"minITSCluITSOnly", 0, "minimum number of ITS clusters to ask for if daughter track does not have TPC"}; + // qa coll assoc directly from AO2D (MC mode exclusive) + Configurable qaCollisionAssociation{"qaCollisionAssociation", false, "QA collision association"}; + // for bit-packed maps std::vector selectionMask; enum v0bit { bitInteresting = 0, @@ -1419,6 +1422,30 @@ struct lambdakzeroPreselector { h->GetXaxis()->SetBinLabel(4, "dEdx OK"); h->GetXaxis()->SetBinLabel(5, "Used in Casc"); h->GetXaxis()->SetBinLabel(6, "Used in Tra-Casc"); + + if (qaCollisionAssociation) { + auto hCollAssocQA = histos.add("hCollAssocQA", "hCollAssocQA", kTH2D, {{6, -0.5f, 5.5f}, {2, -0.5f, 1.5f}}); + hCollAssocQA->GetXaxis()->SetBinLabel(1, "K0"); + hCollAssocQA->GetXaxis()->SetBinLabel(2, "Lambda"); + hCollAssocQA->GetXaxis()->SetBinLabel(3, "AntiLambda"); + hCollAssocQA->GetXaxis()->SetBinLabel(4, "Gamma"); + hCollAssocQA->GetYaxis()->SetBinLabel(1, "Wrong collision"); + hCollAssocQA->GetYaxis()->SetBinLabel(2, "Correct collision"); + + auto h2dPtVsCollAssocK0Short = histos.add("h2dPtVsCollAssocK0Short", "h2dPtVsCollAssocK0Short", kTH2D, {{100, 0.0f, 10.0f}, {2, -0.5f, 1.5f}}); + auto h2dPtVsCollAssocLambda = histos.add("h2dPtVsCollAssocLambda", "h2dPtVsCollAssocLambda", kTH2D, {{100, 0.0f, 10.0f}, {2, -0.5f, 1.5f}}); + auto h2dPtVsCollAssocAntiLambda = histos.add("h2dPtVsCollAssocAntiLambda", "h2dPtVsCollAssocAntiLambda", kTH2D, {{100, 0.0f, 10.0f}, {2, -0.5f, 1.5f}}); + auto h2dPtVsCollAssocGamma = histos.add("h2dPtVsCollAssocGamma", "h2dPtVsCollAssocGamma", kTH2D, {{100, 0.0f, 10.0f}, {2, -0.5f, 1.5f}}); + + h2dPtVsCollAssocK0Short->GetYaxis()->SetBinLabel(1, "Wrong collision"); + h2dPtVsCollAssocK0Short->GetYaxis()->SetBinLabel(2, "Correct collision"); + h2dPtVsCollAssocLambda->GetYaxis()->SetBinLabel(1, "Wrong collision"); + h2dPtVsCollAssocLambda->GetYaxis()->SetBinLabel(2, "Correct collision"); + h2dPtVsCollAssocAntiLambda->GetYaxis()->SetBinLabel(1, "Wrong collision"); + h2dPtVsCollAssocAntiLambda->GetYaxis()->SetBinLabel(2, "Correct collision"); + h2dPtVsCollAssocGamma->GetYaxis()->SetBinLabel(1, "Wrong collision"); + h2dPtVsCollAssocGamma->GetYaxis()->SetBinLabel(2, "Correct collision"); + } } //*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+* @@ -1467,9 +1494,11 @@ struct lambdakzeroPreselector { //*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+* /// function to check PDG association template - void checkPDG(TV0Object const& lV0Candidate, uint32_t& maskElement) + void checkPDG(TV0Object const& lV0Candidate, uint32_t& maskElement, int mcCollisionId) { int lPDG = -1; + int correctMcCollisionIndex = -1; + float mcpt = -1.0; bool physicalPrimary = false; auto lNegTrack = lV0Candidate.template negTrack_as(); auto lPosTrack = lV0Candidate.template posTrack_as(); @@ -1484,7 +1513,9 @@ struct lambdakzeroPreselector { for (auto& lPosMother : lMCPosTrack.template mothers_as()) { if (lNegMother.globalIndex() == lPosMother.globalIndex() && (!dIfMCselectPhysicalPrimary || lNegMother.isPhysicalPrimary())) { lPDG = lNegMother.pdgCode(); + correctMcCollisionIndex = lNegMother.mcCollisionId(); physicalPrimary = lNegMother.isPhysicalPrimary(); + mcpt = lNegMother.pt(); // additionally check PDG of the mother particle if requested if (dIfMCselectV0MotherPDG != 0) { @@ -1502,14 +1533,40 @@ struct lambdakzeroPreselector { } } } // end association check - if (lPDG == 310) + + bool collisionAssociationOK = false; + if (correctMcCollisionIndex > -1 && correctMcCollisionIndex == mcCollisionId) { + collisionAssociationOK = true; + } + + if (lPDG == 310) { bitset(maskElement, bitTrueK0Short); - if (lPDG == 3122) + if (qaCollisionAssociation) { + histos.fill(HIST("hCollAssocQA"), 0.0f, collisionAssociationOK); + histos.fill(HIST("h2dPtVsCollAssocK0Short"), mcpt, collisionAssociationOK); + } + } + if (lPDG == 3122) { bitset(maskElement, bitTrueLambda); - if (lPDG == -3122) + if (qaCollisionAssociation) { + histos.fill(HIST("hCollAssocQA"), 1.0f, collisionAssociationOK); + histos.fill(HIST("h2dPtVsCollAssocLambda"), mcpt, collisionAssociationOK); + } + } + if (lPDG == -3122) { bitset(maskElement, bitTrueAntiLambda); - if (lPDG == 22) + if (qaCollisionAssociation) { + histos.fill(HIST("hCollAssocQA"), 2.0f, collisionAssociationOK); + histos.fill(HIST("h2dPtVsCollAssocAntiLambda"), mcpt, collisionAssociationOK); + } + } + if (lPDG == 22) { bitset(maskElement, bitTrueGamma); + if (qaCollisionAssociation) { + histos.fill(HIST("hCollAssocQA"), 3.0f, collisionAssociationOK); + histos.fill(HIST("h2dPtVsCollAssocGamma"), mcpt, collisionAssociationOK); + } + } if (lPDG == 1010010030) bitset(maskElement, bitTrueHypertriton); if (lPDG == -1010010030) @@ -1622,11 +1679,12 @@ struct lambdakzeroPreselector { checkAndFinalize(); } //*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+* - void processBuildMCAssociated(aod::Collisions const& /*collisions*/, aod::V0s const& v0table, LabeledTracksExtra const&, aod::McParticles const& /*particlesMC*/) + void processBuildMCAssociated(soa::Join const& /*collisions*/, aod::V0s const& v0table, LabeledTracksExtra const&, aod::McParticles const& /*particlesMC*/) { initializeMasks(v0table.size()); for (auto const& v0 : v0table) { - checkPDG(v0, selectionMask[v0.globalIndex()]); + auto collision = v0.collision_as>(); + checkPDG(v0, selectionMask[v0.globalIndex()], collision.mcCollisionId()); checkTrackQuality(v0, selectionMask[v0.globalIndex()], true); } if (!doprocessSkipV0sNotUsedInCascades && !doprocessSkipV0sNotUsedInTrackedCascades) @@ -1644,11 +1702,12 @@ struct lambdakzeroPreselector { checkAndFinalize(); } //*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+* - void processBuildValiddEdxMCAssociated(aod::Collisions const& /*collisions*/, aod::V0s const& v0table, TracksExtraWithPIDandLabels const&, aod::McParticles const&) + void processBuildValiddEdxMCAssociated(soa::Join const& /*collisions*/, aod::V0s const& v0table, TracksExtraWithPIDandLabels const&, aod::McParticles const&) { initializeMasks(v0table.size()); for (auto const& v0 : v0table) { - checkPDG(v0, selectionMask[v0.globalIndex()]); + auto collision = v0.collision_as>(); + checkPDG(v0, selectionMask[v0.globalIndex()], collision.mcCollisionId()); checkdEdx(v0, selectionMask[v0.globalIndex()]); checkTrackQuality(v0, selectionMask[v0.globalIndex()]); } diff --git a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx index fb0475025aa..897f0d5e557 100644 --- a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx @@ -187,73 +187,75 @@ struct StrangenessBuilder { kCascFoundTags, nTables }; - //__________________________________________________ - // V0 tables - Produces v0indices; // standard part of V0Datas - Produces v0cores; // standard part of V0Datas - Produces v0covs; // for decay chain reco - - //__________________________________________________ - // cascade tables - Produces cascidx; // standard part of CascDatas - Produces kfcascidx; // standard part of KFCascDatas - Produces tracascidx; // standard part of TraCascDatas - Produces cascdata; // standard part of CascDatas - Produces kfcascdata; // standard part of KFCascDatas - Produces tracascdata; // standard part of TraCascDatas - Produces casccovs; // for decay chain reco - Produces kfcasccovs; // for decay chain reco - Produces tracasccovs; // for decay chain reco - - //__________________________________________________ - // interlink tables - Produces v0dataLink; // de-refs V0s -> V0Data - Produces cascdataLink; // de-refs Cascades -> CascData - Produces kfcascdataLink; // de-refs Cascades -> KFCascData - Produces tracascdataLink; // de-refs Cascades -> TraCascData - - //__________________________________________________ - // secondary auxiliary tables - Produces v0trackXs; // for decay chain reco - Produces cascTrackXs; // for decay chain reco - - //__________________________________________________ - // further auxiliary / optional if desired - Produces cascbb; - Produces v0daucovs; // covariances of daughter tracks - Produces v0daucovIUs; // covariances of daughter tracks - Produces v0dauPositions; // auxiliary debug information - Produces v0dauPositionsIU; // auxiliary debug information - Produces v0ivanovs; // information for Marian's tests - - //__________________________________________________ - // MC information: V0 - Produces v0labels; // MC labels for V0s - Produces v0mccores; // mc info storage - Produces v0CoreMCLabels; // interlink V0Cores -> V0MCCores - Produces v0mccollref; // references collisions from V0MCCores - - // MC information: Cascades - Produces casclabels; // MC labels for cascades - Produces kfcasclabels; // MC labels for KF cascades - Produces tracasclabels; // MC labels for tracked cascades - Produces bbtags; // bb tags (inv structure tagging in mc) - Produces cascmccores; // mc info storage - Produces cascCoreMClabels; // interlink CascCores -> CascMCCores - Produces cascmccollrefs; // references MC collisions from MC cascades - - //__________________________________________________ - // cascade interlinks - // FIXME: commented out until strangederivedbuilder adjusted accordingly - // Produces cascToTraRefs; // cascades -> tracked - // Produces cascToKFRefs; // cascades -> KF - // Produces traToCascRefs; // tracked -> cascades - // Produces kfToCascRefs; // KF -> cascades - - //__________________________________________________ - // Findable tags - Produces v0FoundTag; - Produces cascFoundTag; + struct : ProducesGroup { + //__________________________________________________ + // V0 tables + Produces v0indices; // standard part of V0Datas + Produces v0cores; // standard part of V0Datas + Produces v0covs; // for decay chain reco + + //__________________________________________________ + // cascade tables + Produces cascidx; // standard part of CascDatas + Produces kfcascidx; // standard part of KFCascDatas + Produces tracascidx; // standard part of TraCascDatas + Produces cascdata; // standard part of CascDatas + Produces kfcascdata; // standard part of KFCascDatas + Produces tracascdata; // standard part of TraCascDatas + Produces casccovs; // for decay chain reco + Produces kfcasccovs; // for decay chain reco + Produces tracasccovs; // for decay chain reco + + //__________________________________________________ + // interlink tables + Produces v0dataLink; // de-refs V0s -> V0Data + Produces cascdataLink; // de-refs Cascades -> CascData + Produces kfcascdataLink; // de-refs Cascades -> KFCascData + Produces tracascdataLink; // de-refs Cascades -> TraCascData + + //__________________________________________________ + // secondary auxiliary tables + Produces v0trackXs; // for decay chain reco + Produces cascTrackXs; // for decay chain reco + + //__________________________________________________ + // further auxiliary / optional if desired + Produces cascbb; + Produces v0daucovs; // covariances of daughter tracks + Produces v0daucovIUs; // covariances of daughter tracks + Produces v0dauPositions; // auxiliary debug information + Produces v0dauPositionsIU; // auxiliary debug information + Produces v0ivanovs; // information for Marian's tests + + //__________________________________________________ + // MC information: V0 + Produces v0labels; // MC labels for V0s + Produces v0mccores; // mc info storage + Produces v0CoreMCLabels; // interlink V0Cores -> V0MCCores + Produces v0mccollref; // references collisions from V0MCCores + + // MC information: Cascades + Produces casclabels; // MC labels for cascades + Produces kfcasclabels; // MC labels for KF cascades + Produces tracasclabels; // MC labels for tracked cascades + Produces bbtags; // bb tags (inv structure tagging in mc) + Produces cascmccores; // mc info storage + Produces cascCoreMClabels; // interlink CascCores -> CascMCCores + Produces cascmccollrefs; // references MC collisions from MC cascades + + //__________________________________________________ + // cascade interlinks + // FIXME: commented out until strangederivedbuilder adjusted accordingly + // Produces cascToTraRefs; // cascades -> tracked + // Produces cascToKFRefs; // cascades -> KF + // Produces traToCascRefs; // tracked -> cascades + // Produces kfToCascRefs; // KF -> cascades + + //__________________________________________________ + // Findable tags + Produces v0FoundTag; + Produces cascFoundTag; + } products; Configurable> enabledTables{"enabledTables", {defaultParameters[0], nTables, nParameters, tableNames, parameterNames}, @@ -1116,7 +1118,7 @@ struct StrangenessBuilder { if (!mEnabledTables[kV0CoresBase] && v0Map[iv0] == -2) { // this v0 hasn't been used by cascades and we're not generating V0s, so skip it - v0dataLink(-1, -1); + products.v0dataLink(-1, -1); continue; } @@ -1133,7 +1135,7 @@ struct StrangenessBuilder { auto const& posTrack = tracks.rawIteratorAt(v0.posTrackId); auto const& negTrack = tracks.rawIteratorAt(v0.negTrackId); if (!straHelper.buildV0Candidate(v0.collisionId, pvX, pvY, pvZ, posTrack, negTrack, v0.isCollinearV0, mEnabledTables[kV0Covs])) { - v0dataLink(-1, -1); + products.v0dataLink(-1, -1); continue; } if (v0Map[iv0] == -1) { @@ -1145,33 +1147,33 @@ struct StrangenessBuilder { nV0s++; if (mEnabledTables[kV0Indices]) { // for referencing (especially - but not only - when using derived data) - v0indices(v0.posTrackId, v0.negTrackId, - v0.collisionId, iv0); + products.v0indices(v0.posTrackId, v0.negTrackId, + v0.collisionId, iv0); histos.fill(HIST("hTableBuildingStatistics"), kV0Indices); } if (mEnabledTables[kV0TrackXs]) { // further decay chains may need this - v0trackXs(straHelper.v0.positiveTrackX, straHelper.v0.negativeTrackX); + products.v0trackXs(straHelper.v0.positiveTrackX, straHelper.v0.negativeTrackX); histos.fill(HIST("hTableBuildingStatistics"), kV0TrackXs); } if (mEnabledTables[kV0CoresBase]) { // standard analysis - v0cores(straHelper.v0.position[0], straHelper.v0.position[1], straHelper.v0.position[2], - straHelper.v0.positiveMomentum[0], straHelper.v0.positiveMomentum[1], straHelper.v0.positiveMomentum[2], - straHelper.v0.negativeMomentum[0], straHelper.v0.negativeMomentum[1], straHelper.v0.negativeMomentum[2], - straHelper.v0.daughterDCA, - straHelper.v0.positiveDCAxy, - straHelper.v0.negativeDCAxy, - TMath::Cos(straHelper.v0.pointingAngle), - straHelper.v0.dcaXY, - v0.v0Type); - v0dataLink(v0cores.lastIndex(), -1); + products.v0cores(straHelper.v0.position[0], straHelper.v0.position[1], straHelper.v0.position[2], + straHelper.v0.positiveMomentum[0], straHelper.v0.positiveMomentum[1], straHelper.v0.positiveMomentum[2], + straHelper.v0.negativeMomentum[0], straHelper.v0.negativeMomentum[1], straHelper.v0.negativeMomentum[2], + straHelper.v0.daughterDCA, + straHelper.v0.positiveDCAxy, + straHelper.v0.negativeDCAxy, + TMath::Cos(straHelper.v0.pointingAngle), + straHelper.v0.dcaXY, + v0.v0Type); + products.v0dataLink(products.v0cores.lastIndex(), -1); histos.fill(HIST("hTableBuildingStatistics"), kV0CoresBase); } if (mEnabledTables[kV0TraPosAtDCAs]) { // for tracking studies - v0dauPositions(straHelper.v0.positivePosition[0], straHelper.v0.positivePosition[1], straHelper.v0.positivePosition[2], - straHelper.v0.negativePosition[0], straHelper.v0.negativePosition[1], straHelper.v0.negativePosition[2]); + products.v0dauPositions(straHelper.v0.positivePosition[0], straHelper.v0.positivePosition[1], straHelper.v0.positivePosition[2], + straHelper.v0.negativePosition[0], straHelper.v0.negativePosition[1], straHelper.v0.negativePosition[2]); histos.fill(HIST("hTableBuildingStatistics"), kV0TraPosAtDCAs); } if (mEnabledTables[kV0TraPosAtIUs]) { @@ -1182,12 +1184,12 @@ struct StrangenessBuilder { o2::track::TrackPar negativeTrackParam = getTrackPar(negTrack); positiveTrackParam.getXYZGlo(positivePositionIU); negativeTrackParam.getXYZGlo(negativePositionIU); - v0dauPositionsIU(positivePositionIU[0], positivePositionIU[1], positivePositionIU[2], - negativePositionIU[0], negativePositionIU[1], negativePositionIU[2]); + products.v0dauPositionsIU(positivePositionIU[0], positivePositionIU[1], positivePositionIU[2], + negativePositionIU[0], negativePositionIU[1], negativePositionIU[2]); histos.fill(HIST("hTableBuildingStatistics"), kV0TraPosAtIUs); } if (mEnabledTables[kV0Covs]) { - v0covs(straHelper.v0.positionCovariance, straHelper.v0.momentumCovariance); + products.v0covs(straHelper.v0.positionCovariance, straHelper.v0.momentumCovariance); histos.fill(HIST("hTableBuildingStatistics"), kV0Covs); } @@ -1263,13 +1265,13 @@ struct StrangenessBuilder { } // end association check // Construct label table (note: this will be joinable with V0Datas!) if (mEnabledTables[kMcV0Labels]) { - v0labels(thisInfo.label, thisInfo.motherLabel); + products.v0labels(thisInfo.label, thisInfo.motherLabel); histos.fill(HIST("hTableBuildingStatistics"), kMcV0Labels); } // Construct found tag if (mEnabledTables[kV0FoundTags]) { - v0FoundTag(v0.found); + products.v0FoundTag(v0.found); histos.fill(HIST("hTableBuildingStatistics"), kV0FoundTags); } @@ -1284,7 +1286,7 @@ struct StrangenessBuilder { // and it might use more disk space unnecessarily. if (v0BuilderOpts.mc_populateV0MCCoresSymmetric) { if (mEnabledTables[kV0MCCores]) { - v0mccores( + products.v0mccores( thisInfo.label, thisInfo.pdgCode, thisInfo.pdgCodeMother, thisInfo.pdgCodePositive, thisInfo.pdgCodeNegative, thisInfo.isPhysicalPrimary, thisInfo.xyz[0], thisInfo.xyz[1], thisInfo.xyz[2], @@ -1294,7 +1296,7 @@ struct StrangenessBuilder { histos.fill(HIST("hTableBuildingStatistics"), kV0MCCores); } if (mEnabledTables[kV0MCCollRefs]) { - v0mccollref(thisInfo.mcCollision); + products.v0mccollref(thisInfo.mcCollision); histos.fill(HIST("hTableBuildingStatistics"), kV0MCCollRefs); } @@ -1302,7 +1304,7 @@ struct StrangenessBuilder { // code that is agnostic with respect to the joinability of // V0Cores and V0MCCores (always dereference -> safe) if (mEnabledTables[kV0CoreMCLabels]) { - v0CoreMCLabels(iv0); // interlink index + products.v0CoreMCLabels(iv0); // interlink index histos.fill(HIST("hTableBuildingStatistics"), kV0CoreMCLabels); } } @@ -1326,7 +1328,7 @@ struct StrangenessBuilder { mcV0infos.push_back(thisInfo); } if (mEnabledTables[kV0CoreMCLabels]) { - v0CoreMCLabels(thisV0MCCoreIndex); // interlink index + products.v0CoreMCLabels(thisV0MCCoreIndex); // interlink index histos.fill(HIST("hTableBuildingStatistics"), kV0CoreMCLabels); } } @@ -1415,7 +1417,7 @@ struct StrangenessBuilder { for (const auto& info : mcV0infos) { if (mEnabledTables[kV0MCCores]) { - v0mccores( + products.v0mccores( info.label, info.pdgCode, info.pdgCodeMother, info.pdgCodePositive, info.pdgCodeNegative, info.isPhysicalPrimary, info.xyz[0], info.xyz[1], info.xyz[2], @@ -1425,7 +1427,7 @@ struct StrangenessBuilder { histos.fill(HIST("hTableBuildingStatistics"), kV0MCCores); } if (mEnabledTables[kV0MCCollRefs]) { - v0mccollref(info.mcCollision); + products.v0mccollref(info.mcCollision); histos.fill(HIST("hTableBuildingStatistics"), kV0MCCollRefs); } } @@ -1566,7 +1568,7 @@ struct StrangenessBuilder { auto const& bachTrack = tracks.rawIteratorAt(cascade.bachTrackId); if (v0Map[cascade.v0Id] < 0) { // this V0 hasn't been stored / cached - cascdataLink(-1); + products.cascdataLink(-1); interlinks.cascadeToCascCores.push_back(-1); continue; // didn't work out, skip } @@ -1578,7 +1580,7 @@ struct StrangenessBuilder { mEnabledTables[kCascBBs], cascadeBuilderOpts.useCascadeMomentumAtPrimVtx, mEnabledTables[kCascCovs])) { - cascdataLink(-1); + products.cascdataLink(-1); interlinks.cascadeToCascCores.push_back(-1); continue; // didn't work out, skip } @@ -1586,40 +1588,40 @@ struct StrangenessBuilder { // generate analysis tables as required if (mEnabledTables[kCascIndices]) { - cascidx(cascade.globalId, - straHelper.cascade.positiveTrack, straHelper.cascade.negativeTrack, - straHelper.cascade.bachelorTrack, straHelper.cascade.collisionId); + products.cascidx(cascade.globalId, + straHelper.cascade.positiveTrack, straHelper.cascade.negativeTrack, + straHelper.cascade.bachelorTrack, straHelper.cascade.collisionId); histos.fill(HIST("hTableBuildingStatistics"), kCascIndices); } if (mEnabledTables[kStoredCascCores]) { - cascdata(straHelper.cascade.charge, straHelper.cascade.massXi, straHelper.cascade.massOmega, - straHelper.cascade.cascadePosition[0], straHelper.cascade.cascadePosition[1], straHelper.cascade.cascadePosition[2], - straHelper.cascade.v0Position[0], straHelper.cascade.v0Position[1], straHelper.cascade.v0Position[2], - straHelper.cascade.positiveMomentum[0], straHelper.cascade.positiveMomentum[1], straHelper.cascade.positiveMomentum[2], - straHelper.cascade.negativeMomentum[0], straHelper.cascade.negativeMomentum[1], straHelper.cascade.negativeMomentum[2], - straHelper.cascade.bachelorMomentum[0], straHelper.cascade.bachelorMomentum[1], straHelper.cascade.bachelorMomentum[2], - straHelper.cascade.cascadeMomentum[0], straHelper.cascade.cascadeMomentum[1], straHelper.cascade.cascadeMomentum[2], - straHelper.cascade.v0DaughterDCA, straHelper.cascade.cascadeDaughterDCA, - straHelper.cascade.positiveDCAxy, straHelper.cascade.negativeDCAxy, - straHelper.cascade.bachelorDCAxy, straHelper.cascade.cascadeDCAxy, straHelper.cascade.cascadeDCAz); + products.cascdata(straHelper.cascade.charge, straHelper.cascade.massXi, straHelper.cascade.massOmega, + straHelper.cascade.cascadePosition[0], straHelper.cascade.cascadePosition[1], straHelper.cascade.cascadePosition[2], + straHelper.cascade.v0Position[0], straHelper.cascade.v0Position[1], straHelper.cascade.v0Position[2], + straHelper.cascade.positiveMomentum[0], straHelper.cascade.positiveMomentum[1], straHelper.cascade.positiveMomentum[2], + straHelper.cascade.negativeMomentum[0], straHelper.cascade.negativeMomentum[1], straHelper.cascade.negativeMomentum[2], + straHelper.cascade.bachelorMomentum[0], straHelper.cascade.bachelorMomentum[1], straHelper.cascade.bachelorMomentum[2], + straHelper.cascade.cascadeMomentum[0], straHelper.cascade.cascadeMomentum[1], straHelper.cascade.cascadeMomentum[2], + straHelper.cascade.v0DaughterDCA, straHelper.cascade.cascadeDaughterDCA, + straHelper.cascade.positiveDCAxy, straHelper.cascade.negativeDCAxy, + straHelper.cascade.bachelorDCAxy, straHelper.cascade.cascadeDCAxy, straHelper.cascade.cascadeDCAz); histos.fill(HIST("hTableBuildingStatistics"), kStoredCascCores); // interlink always produced if cascades generated - cascdataLink(cascdata.lastIndex()); + products.cascdataLink(products.cascdata.lastIndex()); interlinks.cascCoreToCascades.push_back(cascade.globalId); - interlinks.cascadeToCascCores.push_back(cascdata.lastIndex()); + interlinks.cascadeToCascCores.push_back(products.cascdata.lastIndex()); } if (mEnabledTables[kCascTrackXs]) { - cascTrackXs(straHelper.cascade.positiveTrackX, straHelper.cascade.negativeTrackX, straHelper.cascade.bachelorTrackX); + products.cascTrackXs(straHelper.cascade.positiveTrackX, straHelper.cascade.negativeTrackX, straHelper.cascade.bachelorTrackX); histos.fill(HIST("hTableBuildingStatistics"), kCascTrackXs); } if (mEnabledTables[kCascBBs]) { - cascbb(straHelper.cascade.bachBaryonCosPA, straHelper.cascade.bachBaryonDCAxyToPV); + products.cascbb(straHelper.cascade.bachBaryonCosPA, straHelper.cascade.bachBaryonDCAxyToPV); histos.fill(HIST("hTableBuildingStatistics"), kCascBBs); } if (mEnabledTables[kCascCovs]) { - casccovs(straHelper.cascade.covariance); + products.casccovs(straHelper.cascade.covariance); histos.fill(HIST("hTableBuildingStatistics"), kCascCovs); } @@ -1632,14 +1634,14 @@ struct StrangenessBuilder { // Construct label table (note: this will be joinable with CascDatas) if (mEnabledTables[kMcCascLabels]) { - casclabels( + products.casclabels( thisCascInfo.label, thisCascInfo.motherLabel); histos.fill(HIST("hTableBuildingStatistics"), kMcCascLabels); } // Construct found tag if (mEnabledTables[kCascFoundTags]) { - cascFoundTag(cascade.found); + products.cascFoundTag(cascade.found); histos.fill(HIST("hTableBuildingStatistics"), kCascFoundTags); } @@ -1650,7 +1652,7 @@ struct StrangenessBuilder { if (cascadeBuilderOpts.mc_populateCascMCCoresSymmetric) { if (mEnabledTables[kCascMCCores]) { - cascmccores( + products.cascmccores( thisCascInfo.pdgCode, thisCascInfo.pdgCodeMother, thisCascInfo.pdgCodeV0, thisCascInfo.isPhysicalPrimary, thisCascInfo.pdgCodePositive, thisCascInfo.pdgCodeNegative, thisCascInfo.pdgCodeBachelor, thisCascInfo.xyz[0], thisCascInfo.xyz[1], thisCascInfo.xyz[2], @@ -1662,7 +1664,7 @@ struct StrangenessBuilder { histos.fill(HIST("hTableBuildingStatistics"), kCascMCCores); } if (mEnabledTables[kCascMCCollRefs]) { - cascmccollrefs(thisCascInfo.mcCollision); + products.cascmccollrefs(thisCascInfo.mcCollision); histos.fill(HIST("hTableBuildingStatistics"), kCascMCCollRefs); } } @@ -1683,7 +1685,7 @@ struct StrangenessBuilder { mcCascinfos.push_back(thisCascInfo); } if (mEnabledTables[kCascCoreMCLabels]) { - cascCoreMClabels(thisCascMCCoreIndex); // interlink: reconstructed -> MC index + products.cascCoreMClabels(thisCascMCCoreIndex); // interlink: reconstructed -> MC index histos.fill(HIST("hTableBuildingStatistics"), kCascCoreMCLabels); } } @@ -1725,7 +1727,7 @@ struct StrangenessBuilder { } // end if-pion } // end bachelor has mcparticle // Construct label table (note: this will be joinable with CascDatas) - bbtags(bbTag); + products.bbtags(bbTag); histos.fill(HIST("hTableBuildingStatistics"), kMcCascBBTags); } // end BB tag table enabled check @@ -1831,7 +1833,7 @@ struct StrangenessBuilder { for (const auto& thisInfoToFill : mcCascinfos) { if (mEnabledTables[kCascMCCores]) { - cascmccores( // a lot of the info below will be compressed in case of not-recoed MC (good!) + products.cascmccores( // a lot of the info below will be compressed in case of not-recoed MC (good!) thisInfoToFill.pdgCode, thisInfoToFill.pdgCodeMother, thisInfoToFill.pdgCodeV0, thisInfoToFill.isPhysicalPrimary, thisInfoToFill.pdgCodePositive, thisInfoToFill.pdgCodeNegative, thisInfoToFill.pdgCodeBachelor, thisInfoToFill.xyz[0], thisInfoToFill.xyz[1], thisInfoToFill.xyz[2], @@ -1843,7 +1845,7 @@ struct StrangenessBuilder { histos.fill(HIST("hTableBuildingStatistics"), kCascMCCores); } if (mEnabledTables[kCascMCCollRefs]) { - cascmccollrefs(thisInfoToFill.mcCollision); + products.cascmccollrefs(thisInfoToFill.mcCollision); histos.fill(HIST("hTableBuildingStatistics"), kCascMCCollRefs); } } @@ -1890,7 +1892,7 @@ struct StrangenessBuilder { cascadeBuilderOpts.kfUseCascadeMassConstraint, cascadeBuilderOpts.kfDoDCAFitterPreMinimV0, cascadeBuilderOpts.kfDoDCAFitterPreMinimCasc)) { - kfcascdataLink(-1); + products.kfcascdataLink(-1); interlinks.cascadeToKFCascCores.push_back(-1); continue; // didn't work out, skip } @@ -1898,35 +1900,35 @@ struct StrangenessBuilder { // generate analysis tables as required if (mEnabledTables[kKFCascIndices]) { - kfcascidx(cascade.globalId, - straHelper.cascade.positiveTrack, straHelper.cascade.negativeTrack, - straHelper.cascade.bachelorTrack, straHelper.cascade.collisionId); + products.kfcascidx(cascade.globalId, + straHelper.cascade.positiveTrack, straHelper.cascade.negativeTrack, + straHelper.cascade.bachelorTrack, straHelper.cascade.collisionId); histos.fill(HIST("hTableBuildingStatistics"), kKFCascIndices); } if (mEnabledTables[kStoredKFCascCores]) { - kfcascdata(straHelper.cascade.charge, straHelper.cascade.massXi, straHelper.cascade.massOmega, - straHelper.cascade.cascadePosition[0], straHelper.cascade.cascadePosition[1], straHelper.cascade.cascadePosition[2], - straHelper.cascade.v0Position[0], straHelper.cascade.v0Position[1], straHelper.cascade.v0Position[2], - straHelper.cascade.positivePosition[0], straHelper.cascade.positivePosition[1], straHelper.cascade.positivePosition[2], - straHelper.cascade.negativePosition[0], straHelper.cascade.negativePosition[1], straHelper.cascade.negativePosition[2], - straHelper.cascade.positiveMomentum[0], straHelper.cascade.positiveMomentum[1], straHelper.cascade.positiveMomentum[2], - straHelper.cascade.negativeMomentum[0], straHelper.cascade.negativeMomentum[1], straHelper.cascade.negativeMomentum[2], - straHelper.cascade.bachelorMomentum[0], straHelper.cascade.bachelorMomentum[1], straHelper.cascade.bachelorMomentum[2], - straHelper.cascade.v0Momentum[0], straHelper.cascade.v0Momentum[1], straHelper.cascade.v0Momentum[2], - straHelper.cascade.cascadeMomentum[0], straHelper.cascade.cascadeMomentum[1], straHelper.cascade.cascadeMomentum[2], - straHelper.cascade.v0DaughterDCA, straHelper.cascade.cascadeDaughterDCA, - straHelper.cascade.positiveDCAxy, straHelper.cascade.negativeDCAxy, - straHelper.cascade.bachelorDCAxy, straHelper.cascade.cascadeDCAxy, straHelper.cascade.cascadeDCAz, - straHelper.cascade.kfMLambda, straHelper.cascade.kfV0Chi2, straHelper.cascade.kfCascadeChi2); + products.kfcascdata(straHelper.cascade.charge, straHelper.cascade.massXi, straHelper.cascade.massOmega, + straHelper.cascade.cascadePosition[0], straHelper.cascade.cascadePosition[1], straHelper.cascade.cascadePosition[2], + straHelper.cascade.v0Position[0], straHelper.cascade.v0Position[1], straHelper.cascade.v0Position[2], + straHelper.cascade.positivePosition[0], straHelper.cascade.positivePosition[1], straHelper.cascade.positivePosition[2], + straHelper.cascade.negativePosition[0], straHelper.cascade.negativePosition[1], straHelper.cascade.negativePosition[2], + straHelper.cascade.positiveMomentum[0], straHelper.cascade.positiveMomentum[1], straHelper.cascade.positiveMomentum[2], + straHelper.cascade.negativeMomentum[0], straHelper.cascade.negativeMomentum[1], straHelper.cascade.negativeMomentum[2], + straHelper.cascade.bachelorMomentum[0], straHelper.cascade.bachelorMomentum[1], straHelper.cascade.bachelorMomentum[2], + straHelper.cascade.v0Momentum[0], straHelper.cascade.v0Momentum[1], straHelper.cascade.v0Momentum[2], + straHelper.cascade.cascadeMomentum[0], straHelper.cascade.cascadeMomentum[1], straHelper.cascade.cascadeMomentum[2], + straHelper.cascade.v0DaughterDCA, straHelper.cascade.cascadeDaughterDCA, + straHelper.cascade.positiveDCAxy, straHelper.cascade.negativeDCAxy, + straHelper.cascade.bachelorDCAxy, straHelper.cascade.cascadeDCAxy, straHelper.cascade.cascadeDCAz, + straHelper.cascade.kfMLambda, straHelper.cascade.kfV0Chi2, straHelper.cascade.kfCascadeChi2); histos.fill(HIST("hTableBuildingStatistics"), kStoredKFCascCores); // interlink always produced if cascades generated - kfcascdataLink(kfcascdata.lastIndex()); + products.kfcascdataLink(products.kfcascdata.lastIndex()); interlinks.kfCascCoreToCascades.push_back(cascade.globalId); - interlinks.cascadeToKFCascCores.push_back(kfcascdata.lastIndex()); + interlinks.cascadeToKFCascCores.push_back(products.kfcascdata.lastIndex()); } if (mEnabledTables[kKFCascCovs]) { - kfcasccovs(straHelper.cascade.covariance, straHelper.cascade.kfTrackCovarianceV0, straHelper.cascade.kfTrackCovariancePos, straHelper.cascade.kfTrackCovarianceNeg); + products.kfcasccovs(straHelper.cascade.covariance, straHelper.cascade.kfTrackCovarianceV0, straHelper.cascade.kfTrackCovariancePos, straHelper.cascade.kfTrackCovarianceNeg); histos.fill(HIST("hTableBuildingStatistics"), kKFCascCovs); } @@ -1938,7 +1940,7 @@ struct StrangenessBuilder { extractMonteCarloProperties(posTrack, negTrack, bachTrack, mcParticles); // Construct label table (note: this will be joinable with KFCascDatas) - kfcasclabels(thisCascInfo.label); + products.kfcasclabels(thisCascInfo.label); histos.fill(HIST("hTableBuildingStatistics"), kMcKFCascLabels); } // enabled tables check } // constexpr requires mcParticles check @@ -1985,7 +1987,7 @@ struct StrangenessBuilder { mEnabledTables[kCascBBs], cascadeBuilderOpts.useCascadeMomentumAtPrimVtx, mEnabledTables[kCascCovs])) { - tracascdataLink(-1); + products.tracascdataLink(-1); interlinks.cascadeToTraCascCores.push_back(-1); continue; // didn't work out, skip } @@ -2006,29 +2008,29 @@ struct StrangenessBuilder { // generate analysis tables as required if (mEnabledTables[kTraCascIndices]) { - tracascidx(cascade.globalIndex(), - straHelper.cascade.positiveTrack, straHelper.cascade.negativeTrack, - straHelper.cascade.bachelorTrack, cascadeTrack.trackId(), straHelper.cascade.collisionId); + products.tracascidx(cascade.globalIndex(), + straHelper.cascade.positiveTrack, straHelper.cascade.negativeTrack, + straHelper.cascade.bachelorTrack, cascadeTrack.trackId(), straHelper.cascade.collisionId); histos.fill(HIST("hTableBuildingStatistics"), kTraCascIndices); } if (mEnabledTables[kStoredTraCascCores]) { - tracascdata(straHelper.cascade.charge, cascadeTrack.xiMass(), cascadeTrack.omegaMass(), - cascadeTrack.decayX(), cascadeTrack.decayY(), cascadeTrack.decayZ(), - straHelper.cascade.v0Position[0], straHelper.cascade.v0Position[1], straHelper.cascade.v0Position[2], - straHelper.cascade.positiveMomentum[0], straHelper.cascade.positiveMomentum[1], straHelper.cascade.positiveMomentum[2], - straHelper.cascade.negativeMomentum[0], straHelper.cascade.negativeMomentum[1], straHelper.cascade.negativeMomentum[2], - straHelper.cascade.bachelorMomentum[0], straHelper.cascade.bachelorMomentum[1], straHelper.cascade.bachelorMomentum[2], - straHelper.cascade.cascadeMomentum[0], straHelper.cascade.cascadeMomentum[1], straHelper.cascade.cascadeMomentum[2], - straHelper.cascade.v0DaughterDCA, straHelper.cascade.cascadeDaughterDCA, - straHelper.cascade.positiveDCAxy, straHelper.cascade.negativeDCAxy, - straHelper.cascade.bachelorDCAxy, straHelper.cascade.cascadeDCAxy, straHelper.cascade.cascadeDCAz, - cascadeTrack.matchingChi2(), cascadeTrack.topologyChi2(), cascadeTrack.itsClsSize()); + products.tracascdata(straHelper.cascade.charge, cascadeTrack.xiMass(), cascadeTrack.omegaMass(), + cascadeTrack.decayX(), cascadeTrack.decayY(), cascadeTrack.decayZ(), + straHelper.cascade.v0Position[0], straHelper.cascade.v0Position[1], straHelper.cascade.v0Position[2], + straHelper.cascade.positiveMomentum[0], straHelper.cascade.positiveMomentum[1], straHelper.cascade.positiveMomentum[2], + straHelper.cascade.negativeMomentum[0], straHelper.cascade.negativeMomentum[1], straHelper.cascade.negativeMomentum[2], + straHelper.cascade.bachelorMomentum[0], straHelper.cascade.bachelorMomentum[1], straHelper.cascade.bachelorMomentum[2], + straHelper.cascade.cascadeMomentum[0], straHelper.cascade.cascadeMomentum[1], straHelper.cascade.cascadeMomentum[2], + straHelper.cascade.v0DaughterDCA, straHelper.cascade.cascadeDaughterDCA, + straHelper.cascade.positiveDCAxy, straHelper.cascade.negativeDCAxy, + straHelper.cascade.bachelorDCAxy, straHelper.cascade.cascadeDCAxy, straHelper.cascade.cascadeDCAz, + cascadeTrack.matchingChi2(), cascadeTrack.topologyChi2(), cascadeTrack.itsClsSize()); histos.fill(HIST("hTableBuildingStatistics"), kStoredTraCascCores); // interlink always produced if base core table generated - tracascdataLink(tracascdata.lastIndex()); + products.tracascdataLink(products.tracascdata.lastIndex()); interlinks.traCascCoreToCascades.push_back(cascade.globalIndex()); - interlinks.cascadeToTraCascCores.push_back(tracascdata.lastIndex()); + interlinks.cascadeToTraCascCores.push_back(products.tracascdata.lastIndex()); } if (mEnabledTables[kCascCovs]) { std::array traCovMat = {0.}; @@ -2037,7 +2039,7 @@ struct StrangenessBuilder { for (int ii = 0; ii < 21; ii++) { traCovMatArray[ii] = traCovMat[ii]; } - tracasccovs(traCovMatArray); + products.tracasccovs(traCovMatArray); histos.fill(HIST("hTableBuildingStatistics"), kCascCovs); } @@ -2049,7 +2051,7 @@ struct StrangenessBuilder { extractMonteCarloProperties(posTrack, negTrack, bachTrack, mcParticles); // Construct label table (note: this will be joinable with KFCascDatas) - tracasclabels(thisCascInfo.label); + products.tracasclabels(thisCascInfo.label); histos.fill(HIST("hTableBuildingStatistics"), kMcTraCascLabels); } // enabled tables check } // constexpr requires mcParticles check From d0d579a7acdf3812fc48687c529ca670e93c300c Mon Sep 17 00:00:00 2001 From: Fabrizio Date: Thu, 20 Mar 2025 16:19:37 +0100 Subject: [PATCH 0784/1650] Fix minor bug (#10594) --- PWGHF/TableProducer/trackIndexSkimCreator.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGHF/TableProducer/trackIndexSkimCreator.cxx b/PWGHF/TableProducer/trackIndexSkimCreator.cxx index a384b076bac..d5994cfbad3 100644 --- a/PWGHF/TableProducer/trackIndexSkimCreator.cxx +++ b/PWGHF/TableProducer/trackIndexSkimCreator.cxx @@ -1783,11 +1783,11 @@ struct HfTrackIndexSkimCreator { bool isMlSel = false; if constexpr (usePidForHfFiltersBdt) { if (iDecay3P != hf_cand_3prong::DecayType::LcToPKPi && iDecay3P != hf_cand_3prong::DecayType::XicToPKPi) { - hfMlResponse3Prongs[iDecay3P].isSelectedMl(featuresCand, ptDummy, outputScores[iDecay3P]); + isMlSel = hfMlResponse3Prongs[iDecay3P].isSelectedMl(featuresCand, ptDummy, outputScores[iDecay3P]); } else { std::vector featuresCandWithPid = featuresCand; featuresCandWithPid.insert(featuresCandWithPid.end(), featuresCandPid.begin(), featuresCandPid.end()); - hfMlResponse3Prongs[iDecay3P].isSelectedMl(featuresCandWithPid, ptDummy, outputScores[iDecay3P]); + isMlSel = hfMlResponse3Prongs[iDecay3P].isSelectedMl(featuresCandWithPid, ptDummy, outputScores[iDecay3P]); } } else { isMlSel = hfMlResponse3Prongs[iDecay3P].isSelectedMl(featuresCand, ptDummy, outputScores[iDecay3P]); From f497a971b2657b9b45053d75d2b613b4e340d229 Mon Sep 17 00:00:00 2001 From: Chiara Pinto <48326672+chiarapinto@users.noreply.github.com> Date: Thu, 20 Mar 2025 16:56:08 +0100 Subject: [PATCH 0785/1650] [PWGLF] added event rejection (#10595) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Nuspex/antinucleiInJets.cxx | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx index b73fcdec818..4a17fcfeaef 100644 --- a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx +++ b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx @@ -24,6 +24,7 @@ #include #include #include "TGrid.h" +#include #include "CCDB/BasicCCDBManager.h" #include "CCDB/CcdbApi.h" @@ -93,6 +94,8 @@ struct AntinucleiInJets { // track parameters Configurable requirePvContributor{"requirePvContributor", false, "require that the track is a PV contributor"}; Configurable applyItsPid{"applyItsPid", true, "apply ITS PID"}; + Configurable rejectEvents{"rejectEvents", false, "reject some events"}; + Configurable rejectionPercentage{"rejectionPercentage", 3, "percentage of events to reject"}; Configurable minItsNclusters{"minItsNclusters", 5, "minimum number of ITS clusters"}; Configurable minTpcNcrossedRows{"minTpcNcrossedRows", 80, "minimum number of TPC crossed pad rows"}; Configurable minTpcNcrossedRowsOverFindable{"minTpcNcrossedRowsOverFindable", 0.8, "crossed rows/findable"}; @@ -440,9 +443,24 @@ struct AntinucleiInJets { LOGP(info, "Opened histogram {}", Form("%s_antiproton", histname_antip_ue.Data())); } + bool shouldRejectEvent() + { + static std::random_device rd; + static std::mt19937 gen(rd()); + static std::uniform_int_distribution<> dis(0, 99); + int randomNumber = dis(gen); + if (randomNumber <= rejectionPercentage) { + return false; + } + return true; + } + // Process Data void processData(SelectedCollisions::iterator const& collision, FullNucleiTracks const& tracks) { + if (rejectEvents && shouldRejectEvent()) + return; + // event counter: before event selection registryData.fill(HIST("number_of_events_data"), 0.5); @@ -1198,6 +1216,9 @@ struct AntinucleiInJets { // Process Systematics void processSystematicsData(SelectedCollisions::iterator const& collision, FullNucleiTracks const& tracks) { + if (rejectEvents && shouldRejectEvent()) + return; + const int nSystematics = 10; int itsNclustersSyst[nSystematics] = {5, 6, 5, 4, 5, 3, 5, 6, 3, 4}; float tpcNcrossedRowsSyst[nSystematics] = {100, 85, 80, 110, 95, 90, 105, 95, 100, 105}; From 98eea7111d02691c3ed06fa2f96d57808742255b Mon Sep 17 00:00:00 2001 From: Antonio Palasciano <52152842+apalasciano@users.noreply.github.com> Date: Thu, 20 Mar 2025 17:16:33 +0100 Subject: [PATCH 0786/1650] [PWGHF,Trigger] Add bachelor ptcuts in Lc resonances (#10596) Co-authored-by: ALICE Action Bot --- EventFiltering/PWGHF/HFFilter.cxx | 31 ++++++++-------- EventFiltering/PWGHF/HFFilterHelpers.h | 49 ++++++++++++++++++-------- 2 files changed, 51 insertions(+), 29 deletions(-) diff --git a/EventFiltering/PWGHF/HFFilter.cxx b/EventFiltering/PWGHF/HFFilter.cxx index 21d5fa643b9..034109b0efb 100644 --- a/EventFiltering/PWGHF/HFFilter.cxx +++ b/EventFiltering/PWGHF/HFFilter.cxx @@ -75,7 +75,7 @@ struct HfFilter { // Main struct for HF triggers // nsigma PID (except for V0 and cascades) Configurable> nSigmaPidCuts{"nSigmaPidCuts", {cutsNsigma[0], 4, 8, labelsRowsNsigma, labelsColumnsNsigma}, "Nsigma cuts for ITS/TPC/TOF PID (except for V0 and cascades)"}; // min and max pts for tracks and bachelors (except for V0 and cascades) - Configurable> ptCuts{"ptCuts", {cutsPt[0], 2, 8, labelsRowsCutsPt, labelsColumnsCutsPt}, "minimum and maximum pT for bachelor tracks (except for V0 and cascades)"}; + Configurable> ptCuts{"ptCuts", {cutsPt[0], 2, 9, labelsRowsCutsPt, labelsColumnsCutsPt}, "minimum and maximum pT for bachelor tracks (except for V0 and cascades)"}; // parameters for high-pT triggers Configurable> ptThresholds{"ptThresholds", {cutsHighPtThresholds[0], 1, 2, labelsEmpty, labelsColumnsHighPtThresholds}, "pT treshold for high pT charm hadron candidates for kHighPt triggers in GeV/c"}; @@ -204,6 +204,7 @@ struct HfFilter { // Main struct for HF triggers helper.setPtLimitsProtonForFemto(ptCuts->get(0u, 2u), ptCuts->get(1u, 2u)); helper.setPtLimitsDeuteronForFemto(ptCuts->get(0u, 6u), ptCuts->get(1u, 6u)); helper.setPtLimitsCharmBaryonBachelor(ptCuts->get(0u, 3u), ptCuts->get(1u, 3u)); + helper.setPtLimitsLcResonanceBachelor(ptCuts->get(0u, 8u), ptCuts->get(1u, 8u)); helper.setCutsSingleTrackBeauty(cutsTrackBeauty3Prong, cutsTrackBeauty4Prong, cutsTrackBeauty4Prong); helper.setCutsSingleTrackCharmBaryonBachelor(cutsTrackCharmBaryonBachelor); helper.setCutsBhadrons(cutsBplus, cutsBzeroToDstar, cutsBzero, cutsBs, cutsLb, cutsXib); @@ -549,7 +550,7 @@ struct HfFilter { // Main struct for HF triggers // Beauty with D0 if (!keepEvent[kBeauty3P] && isD0BeautyTagged) { - auto isTrackSelected = helper.isSelectedTrackForSoftPionOrBeauty(track, trackParThird, dcaThird); + int16_t isTrackSelected = helper.isSelectedTrackForSoftPionOrBeauty(track, trackParThird, dcaThird); if (TESTBIT(isTrackSelected, kForBeauty) && ((TESTBIT(selD0InMass, 0) && track.sign() < 0) || (TESTBIT(selD0InMass, 1) && track.sign() > 0))) { // D0 pi- and D0bar pi+ auto massCand = RecoDecay::m(std::array{pVec2Prong, pVecThird}, std::array{massD0, massPi}); auto pVecBeauty3Prong = RecoDecay::pVec(pVec2Prong, pVecThird); @@ -857,7 +858,7 @@ struct HfFilter { // Main struct for HF triggers getPxPyPz(trackParBachelor, pVecBachelor); } - int isTrackSelected = helper.isSelectedTrackForSoftPionOrBeauty(trackBachelor, trackParBachelor, dcaBachelor); + auto isTrackSelected = helper.isSelectedTrackForSoftPionOrBeauty(trackBachelor, trackParBachelor, dcaBachelor); if (TESTBIT(isTrackSelected, kSoftPion) && ((TESTBIT(selD0InMass, 0) && trackBachelor.sign() > 0) || (TESTBIT(selD0InMass, 1) && trackBachelor.sign() < 0))) { std::array massDausD0{massPi, massKa}; auto massD0dau = massD0Cand; @@ -943,17 +944,17 @@ struct HfFilter { // Main struct for HF triggers if (!keepEvent[kPrCharm2P] && isD0SignalTagged && (TESTBIT(selD0InMass, 0) || TESTBIT(selD0InMass, 1))) { for (const auto& trackProtonId : trackIdsThisCollision) { // start loop over tracks selecting only protons auto trackProton = tracks.rawIteratorAt(trackProtonId.trackId()); - std::array pVecProton = trackProton.pVector(); + auto trackParBachelorProton = getTrackPar(trackProton); if (trackProton.globalIndex() == trackPos.globalIndex() || trackProton.globalIndex() == trackNeg.globalIndex()) { continue; } - // minimal track selections - if (!trackProton.isGlobalTrackWoDCA() || std::fabs(trackProton.pt()) < 0.3f) { - continue; + gpu::gpustd::array dcaInfoBachProton; + if (trackProton.collisionId() != thisCollId) { + o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParBachelorProton, 2.f, noMatCorr, &dcaInfoBachProton); } - // PID selection - bool isProton = helper.isSelectedProton4CharmOrBeautyBaryons(trackProton); - if (isProton) { + std::array pVecProton = trackProton.pVector(); + auto isSelProton = helper.isSelectedBachelorForCharmBaryon(trackProton, dcaInfoBachProton); + if (isSelProton == kProtonForCharmBaryon) { if (!keepEvent[kPrCharm2P]) { // we first look for a D*+ for (const auto& trackBachelorId : trackIdsThisCollision) { // start loop over tracks to find bachelor pion @@ -968,7 +969,7 @@ struct HfFilter { // Main struct for HF triggers o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParBachelor, 2.f, noMatCorr, &dcaBachelor); getPxPyPz(trackParBachelor, pVecBachelor); } - int isTrackSelected = helper.isSelectedTrackForSoftPionOrBeauty(trackBachelor, trackParBachelor, dcaBachelor); + auto isTrackSelected = helper.isSelectedTrackForSoftPionOrBeauty(trackBachelor, trackParBachelor, dcaBachelor); if (TESTBIT(isTrackSelected, kSoftPion) && ((TESTBIT(selD0InMass, 0) && trackBachelor.sign() > 0) || (TESTBIT(selD0InMass, 1) && trackBachelor.sign() < 0))) { std::array massDausD0{massPi, massKa}; auto massD0dau = massD0Cand; @@ -1390,7 +1391,7 @@ struct HfFilter { // Main struct for HF triggers o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParSoftPi, 2.f, noMatCorr, &dcaSoftPi); getPxPyPz(trackParSoftPi, pVecSoftPi); } - int8_t isSoftPionSelected = helper.isSelectedTrackForSoftPionOrBeauty(trackSoftPi, trackParSoftPi, dcaSoftPi); + int16_t isSoftPionSelected = helper.isSelectedTrackForSoftPionOrBeauty(trackSoftPi, trackParSoftPi, dcaSoftPi); if (TESTBIT(isSoftPionSelected, kSoftPionForSigmaC) /*&& (TESTBIT(is3Prong[2], 0) || TESTBIT(is3Prong[2], 1))*/) { // check the mass of the SigmaC++ candidate @@ -1596,7 +1597,7 @@ struct HfFilter { // Main struct for HF triggers o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParSoftPi, 2.f, noMatCorr, &dcaSoftPi); getPxPyPz(trackParSoftPi, pVecSoftPi); } - int8_t isSoftPionSelected = helper.isSelectedTrackForSoftPionOrBeauty(trackSoftPi, trackParSoftPi, dcaSoftPi); + int16_t isSoftPionSelected = helper.isSelectedTrackForSoftPionOrBeauty(trackSoftPi, trackParSoftPi, dcaSoftPi); if (TESTBIT(isSoftPionSelected, kSoftPionForSigmaC) /*&& (TESTBIT(is3Prong[2], 0) || TESTBIT(is3Prong[2], 1))*/) { // check the mass of the SigmaC0 candidate @@ -1725,7 +1726,7 @@ struct HfFilter { // Main struct for HF triggers o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParBachelor, 2.f, noMatCorr, &dcaInfoBach); } - auto isSelBachelor = helper.isSelectedBachelorForCharmBaryon(track, dcaInfoBach); + auto isSelBachelor = helper.isSelectedBachelorForCharmBaryon(track, dcaInfoBach); if (isSelBachelor == kRejected) { continue; } @@ -1769,7 +1770,7 @@ struct HfFilter { // Main struct for HF triggers o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParBachelorSecond, 2.f, noMatCorr, &dcaInfoBachSecond); } - auto isSelBachelorSecond = helper.isSelectedBachelorForCharmBaryon(trackSecond, dcaInfoBachSecond); + auto isSelBachelorSecond = helper.isSelectedBachelorForCharmBaryon(trackSecond, dcaInfoBachSecond); if (!TESTBIT(isSelBachelorSecond, kPionForCharmBaryon)) { continue; } diff --git a/EventFiltering/PWGHF/HFFilterHelpers.h b/EventFiltering/PWGHF/HFFilterHelpers.h index f3fbe237f7a..c5d35286ac0 100644 --- a/EventFiltering/PWGHF/HFFilterHelpers.h +++ b/EventFiltering/PWGHF/HFFilterHelpers.h @@ -127,6 +127,7 @@ enum bachelorTrackSelection { kSoftPionForBeauty, kPionForCharmBaryon, kKaonForCharmBaryon, + kProtonForCharmBaryon, kSoftPionForSigmaC }; @@ -296,9 +297,9 @@ constexpr float cutsPtThresholdsForFemto[1][2] = {{8., 1.4}}; // proton, deutero static const std::vector labelsColumnsPtThresholdsForFemto = {"Proton", "Deuteron"}; // min and max pT for all tracks combined (except for V0 and cascades) -constexpr float cutsPt[2][8] = {{1., 0.1, 0.8, 0.5, 0.1, 0.2, 0.4, 0.5}, - {100000., 100000., 5., 100000., 100000., 100000., 100000., 100000.}}; // beauty, D*, femto, SigmaC, Xic*+ -> SigmaC++K-, beauty to JPsi -static const std::vector labelsColumnsCutsPt = {"Beauty", "DstarPlus", "PrForFemto", "CharmBaryon", "SoftPiSigmaC", "SoftKaonXicResoToSigmaC", "DeForFemto", "BeautyToJPsi"}; +constexpr float cutsPt[2][9] = {{1., 0.1, 0.8, 0.5, 0.1, 0.2, 0.4, 0.5, 0.3}, + {100000., 100000., 5., 100000., 100000., 100000., 100000., 100000., 100000.}}; // beauty, D*, femto, SigmaC, Xic*+ -> SigmaC++K-, beauty to JPsi, Lc*->D0p +static const std::vector labelsColumnsCutsPt = {"Beauty", "DstarPlus", "PrForFemto", "CharmBaryon", "SoftPiSigmaC", "SoftKaonXicResoToSigmaC", "DeForFemto", "BeautyToJPsi", "PrForLcReso"}; static const std::vector labelsRowsCutsPt = {"Minimum", "Maximum"}; // PID cuts @@ -472,6 +473,11 @@ class HfFilterHelper mPtMinCharmBaryonBachelor = minPt; mPtMaxCharmBaryonBachelor = maxPt; } + void setPtLimitsLcResonanceBachelor(float minPt, float maxPt) + { + mPtMinLcResonanceBachelor = minPt; + mPtMaxLcResonanceBachelor = maxPt; + } void setNsigmaProtonCutsForFemto(std::array nSigmaCuts) { mNSigmaPrCutsForFemto = nSigmaCuts; } void setNsigmaDeuteronCutsForFemto(std::array nSigmaCuts) { mNSigmaDeCutsForFemto = nSigmaCuts; } @@ -565,7 +571,7 @@ class HfFilterHelper template bool isSelectedHighPt3Prong(const T& pt); template - int8_t isSelectedTrackForSoftPionOrBeauty(const T& track, const T1& trackPar, const T2& dca); + int16_t isSelectedTrackForSoftPionOrBeauty(const T& track, const T1& trackPar, const T2& dca); template bool isSelectedTrack4Femto(const T1& track, const T2& trackPar, const int& activateQA, H2 hTPCPID, H2 hTOFPID, const int& trackSpecies); template @@ -594,8 +600,8 @@ class HfFilterHelper bool isSelectedPhoton(const Photon& photon, const std::array& dauTracks, const int& activateQA, H2 hV0Selected, std::array& hArmPod); template bool isSelectedCascade(const Casc& casc); - template - int8_t isSelectedBachelorForCharmBaryon(const T& track, const T2& dca); + template + int16_t isSelectedBachelorForCharmBaryon(const T& track, const T2& dca); template bool isSelectedProton4CharmOrBeautyBaryons(const T& track); template @@ -668,12 +674,14 @@ class HfFilterHelper float mPtMinProtonForFemto{0.8}; // minimum pt for the proton for femto float mPtMinDeuteronForFemto{0.8}; // minimum pt for the deuteron for femto float mPtMinCharmBaryonBachelor{0.5}; // minimum pt for the bachelor pion from Xic/Omegac decays + float mPtMinLcResonanceBachelor{0.3}; // minimum pt for the bachelor proton from Lc resonance decays float mPtMaxSoftPionForDstar{2.}; // maximum pt for the D*+ soft pion float mPtMaxBeautyBachelor{100000.}; // maximum pt for the b-hadron pion daughter float mPtMaxBeautyToJPsiBachelor{100000.}; // maximum pt for the b-hadron -> JPsi X daughters (not the muons) float mPtMaxProtonForFemto{5.0}; // maximum pt for the proton for femto float mPtMaxDeuteronForFemto{5.0}; // maximum pt for the deuteron for femto float mPtMaxCharmBaryonBachelor{100000.}; // maximum pt for the bachelor pion from Xic/Omegac decays + float mPtMaxLcResonanceBachelor{100000.}; // maximum pt for the bachelor proton from Lc resonance decays float mPtThresholdProtonForFemto{8.}; // pt threshold to change strategy for proton PID for femto float mPtThresholdDeuteronForFemto{1.4}; // pt threshold to change strategy for deuteron PID for femto float mPtMinSigmaCZero{0.f}; // pt min SigmaC0 candidate @@ -766,10 +774,10 @@ inline bool HfFilterHelper::isSelectedHighPt3Prong(const T& pt) /// \param dca is the 2d array with dcaXY and dcaZ of the track /// \return a flag that encodes the selection for soft pions BIT(kSoftPion), tracks for beauty BIT(kForBeauty), or soft pions for beauty BIT(kSoftPionForBeauty) template -inline int8_t HfFilterHelper::isSelectedTrackForSoftPionOrBeauty(const T& track, const T1& trackPar, const T2& dca) +inline int16_t HfFilterHelper::isSelectedTrackForSoftPionOrBeauty(const T& track, const T1& trackPar, const T2& dca) { - int8_t retValue{BIT(kSoftPion) | BIT(kForBeauty) | BIT(kSoftPionForBeauty) | BIT(kSoftPionForSigmaC)}; + int16_t retValue{BIT(kSoftPion) | BIT(kForBeauty) | BIT(kSoftPionForBeauty) | BIT(kSoftPionForSigmaC)}; if (!track.isGlobalTrackWoDCA()) { return kRejected; @@ -939,7 +947,7 @@ inline bool HfFilterHelper::isSelectedTrack4Femto(const T1& track, const T2& tra return false; } } else { - if (NSigmaTOF > nSigmaCuts[2] || NSigmaTPC < -nSigmaCuts[0]) { // Use combined TPC and TOF above the threshold + if (NSigmaTOF < -nSigmaCuts[1] || NSigmaTPC < -nSigmaCuts[0]) { // Use combined TPC and TOF above the threshold return false; } } @@ -1625,18 +1633,24 @@ inline bool HfFilterHelper::isSelectedCascade(const Casc& casc) /// \param track is a track /// \param dca is the 2d array with dcaXY and dcaZ of the track /// \return 0 if rejected, or a bitmap that contains the information whether it is selected as pion and/or kaon -template -inline int8_t HfFilterHelper::isSelectedBachelorForCharmBaryon(const T& track, const T2& dca) +template +inline int16_t HfFilterHelper::isSelectedBachelorForCharmBaryon(const T& track, const T2& dca) { - int8_t retValue{BIT(kPionForCharmBaryon) | BIT(kKaonForCharmBaryon)}; + int16_t retValue{BIT(kPionForCharmBaryon) | BIT(kKaonForCharmBaryon) | BIT(kProtonForCharmBaryon)}; if (!track.isGlobalTrackWoDCA()) { return kRejected; } float pt = track.pt(); - if (pt < mPtMinCharmBaryonBachelor || pt > mPtMaxCharmBaryonBachelor) { - return kRejected; + if constexpr (whichTrigger == kCharmBarToXiBach) { + if (pt < mPtMinCharmBaryonBachelor || pt > mPtMaxCharmBaryonBachelor) { + return kRejected; + } + } else if constexpr (whichTrigger == kPrCharm2P) { + if (pt < mPtMinLcResonanceBachelor || pt > mPtMaxLcResonanceBachelor) { + return kRejected; + } } auto pTBinTrack = findBin(mPtBinsTracks, pt); @@ -1665,14 +1679,18 @@ inline int8_t HfFilterHelper::isSelectedBachelorForCharmBaryon(const T& track, c float nSigmaPiTpc = track.tpcNSigmaPi(); float nSigmaKaTpc = track.tpcNSigmaKa(); + float nSigmaPrTpc = track.tpcNSigmaPr(); float nSigmaPiTof = track.tofNSigmaPi(); float nSigmaKaTof = track.tofNSigmaKa(); + float nSigmaPrTof = track.tofNSigmaPr(); if (mTpcPidCalibrationOption == 1) { nSigmaPiTpc = getTPCPostCalib(track, kPi); nSigmaKaTpc = getTPCPostCalib(track, kKa); + nSigmaPrTpc = getTPCPostCalib(track, kPr); } else if (mTpcPidCalibrationOption == 2) { nSigmaPiTpc = getTPCSplineCalib(track, (track.sign() > 0) ? kPi : kAntiPi); nSigmaKaTpc = getTPCSplineCalib(track, (track.sign() > 0) ? kKa : kAntiKa); + nSigmaPrTpc = getTPCSplineCalib(track, (track.sign() > 0) ? kPr : kAntiPr); } if ((track.hasTPC() && std::fabs(nSigmaPiTpc) > mNSigmaTpcPiCharmBaryonBachelor) && (track.hasTOF() && std::fabs(nSigmaPiTof) > mNSigmaTofPiCharmBaryonBachelor)) { @@ -1681,6 +1699,9 @@ inline int8_t HfFilterHelper::isSelectedBachelorForCharmBaryon(const T& track, c if ((track.hasTPC() && std::fabs(nSigmaKaTpc) > mNSigmaTpcPiCharmBaryonBachelor) && (track.hasTOF() && std::fabs(nSigmaKaTof) > mNSigmaTofPiCharmBaryonBachelor)) { CLRBIT(retValue, kKaonForCharmBaryon); } + if ((track.hasTPC() && std::fabs(nSigmaPrTpc) > mNSigmaTpcPiCharmBaryonBachelor) && (track.hasTOF() && std::fabs(nSigmaPrTof) > mNSigmaTpcPiCharmBaryonBachelor)) { + CLRBIT(retValue, kProtonForCharmBaryon); + } return retValue; } From 7669002b105ad61938ed42ff5ac65b324bffbb31 Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Fri, 21 Mar 2025 05:01:34 +0800 Subject: [PATCH 0787/1650] [PWGCF] fix MC (#10597) --- PWGCF/Flow/Tasks/flowMc.cxx | 9 ++++++++- PWGCF/Flow/Tasks/flowTask.cxx | 6 ++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowMc.cxx b/PWGCF/Flow/Tasks/flowMc.cxx index 63e7b81c60b..5b12e6f45d2 100644 --- a/PWGCF/Flow/Tasks/flowMc.cxx +++ b/PWGCF/Flow/Tasks/flowMc.cxx @@ -353,8 +353,15 @@ struct FlowMc { if (mcParticle.has_tracks()) { auto const& tracks = mcParticle.tracks_as(); for (auto const& track : tracks) { - if (track.hasTPC() && track.hasITS()) + if (!((track.tpcNClsFound() >= cfgCutTPCclu) && (track.itsNCls() >= cfgCutITSclu))) { + continue; + } + if (cfgIsGlobalTrack && track.isGlobalTrack()) { nChGlobal++; + } + if (!cfgIsGlobalTrack && track.hasTPC() && track.hasITS()) { + nChGlobal++; + } if (cfgTrackDensityCorrUse && cfgFlowCumulantEnabled) { bool withinPtRef = (cfgCutPtRefMin < track.pt()) && (track.pt() < cfgCutPtRefMax); // within RF pT rang if (withinPtRef) { diff --git a/PWGCF/Flow/Tasks/flowTask.cxx b/PWGCF/Flow/Tasks/flowTask.cxx index 9cd332be5c5..91c7402cf90 100644 --- a/PWGCF/Flow/Tasks/flowTask.cxx +++ b/PWGCF/Flow/Tasks/flowTask.cxx @@ -101,6 +101,8 @@ struct FlowTask { Configurable> cfgUserDefineGFWCorr{"cfgUserDefineGFWCorr", std::vector{"refN02 {2} refP02 {-2}", "refN12 {2} refP12 {-2}"}, "User defined GFW CorrelatorConfig"}; Configurable> cfgUserDefineGFWName{"cfgUserDefineGFWName", std::vector{"Ch02Gap22", "Ch12Gap22"}, "User defined GFW Name"}; Configurable> cfgRunRemoveList{"cfgRunRemoveList", std::vector{-1}, "excluded run numbers"}; + Configurable> cfgTrackDensityP0{"cfgTrackDensityP0", std::vector{0.7217476707, 0.7384792571, 0.7542625668, 0.7640680200, 0.7701951667, 0.7755299053, 0.7805901710, 0.7849446786, 0.7957356586, 0.8113039262, 0.8211968966, 0.8280558878, 0.8329342135}, "parameter 0 for track density efficiency correction"}; + Configurable> cfgTrackDensityP1{"cfgTrackDensityP1", std::vector{-2.169488e-05, -2.191913e-05, -2.295484e-05, -2.556538e-05, -2.754463e-05, -2.816832e-05, -2.846502e-05, -2.843857e-05, -2.705974e-05, -2.477018e-05, -2.321730e-05, -2.203315e-05, -2.109474e-05}, "parameter 1 for track density efficiency correction"}; ConfigurableAxis axisPtHist{"axisPtHist", {100, 0., 10.}, "pt axis for histograms"}; ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.2, 2.4, 2.6, 2.8, 3, 3.5, 4, 5, 6, 8, 10}, "pt axis for histograms"}; @@ -432,8 +434,8 @@ struct FlowTask { hFindPtBin = new TH1D("hFindPtBin", "hFindPtBin", pTEffBins.size() - 1, &pTEffBins[0]); funcEff.resize(pTEffBins.size() - 1); // LHC24g3 Eff - std::vector f1p0 = {0.6003720411, 0.6152630970, 0.6288860646, 0.6360694031, 0.6409494798, 0.6450540203, 0.6482117301, 0.6512592056, 0.6640008690, 0.6862631416, 0.7005738691, 0.7106567432, 0.7170728333}; - std::vector f1p1 = {-1.007592e-05, -8.932635e-06, -9.114538e-06, -1.054818e-05, -1.220212e-05, -1.312304e-05, -1.376433e-05, -1.412813e-05, -1.289562e-05, -1.050065e-05, -8.635725e-06, -7.380821e-06, -6.201250e-06}; + std::vector f1p0 = cfgTrackDensityP0; + std::vector f1p1 = cfgTrackDensityP1; for (uint ifunc = 0; ifunc < pTEffBins.size() - 1; ifunc++) { funcEff[ifunc] = new TF1(Form("funcEff%i", ifunc), "[0]+[1]*x", 0, 3000); funcEff[ifunc]->SetParameters(f1p0[ifunc], f1p1[ifunc]); From 2dfcda0fd82d142ed02dd5f5a510035ece14a2db Mon Sep 17 00:00:00 2001 From: ilikmeta <152337132+ilikmeta@users.noreply.github.com> Date: Thu, 20 Mar 2025 16:03:20 -0500 Subject: [PATCH 0788/1650] [PWGCF] Correct for Nch efficiency (#10600) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/flowGfwTask.cxx | 130 ++++++++++++++++++++----------- 1 file changed, 84 insertions(+), 46 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowGfwTask.cxx b/PWGCF/Flow/Tasks/flowGfwTask.cxx index c4bcae74e12..b9987dd61e4 100644 --- a/PWGCF/Flow/Tasks/flowGfwTask.cxx +++ b/PWGCF/Flow/Tasks/flowGfwTask.cxx @@ -87,6 +87,7 @@ struct FlowGfwTask { O2_DEFINE_CONFIGURABLE(cfgNbootstrap, int, 10, "Number of subsamples") O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeights, bool, false, "Fill and output NUA weights") O2_DEFINE_CONFIGURABLE(cfgEfficiency, std::string, "", "CCDB path to efficiency object") + O2_DEFINE_CONFIGURABLE(cfgEfficiencyNch, std::string, "", "CCDB path to Nch efficiency object") O2_DEFINE_CONFIGURABLE(cfgAcceptance, std::string, "", "CCDB path to acceptance object") O2_DEFINE_CONFIGURABLE(cfgMagnetField, std::string, "GLO/Config/GRPMagField", "CCDB path to Magnet field object") O2_DEFINE_CONFIGURABLE(cfgCutOccupancyHigh, int, 500, "High cut on TPC occupancy") @@ -138,6 +139,7 @@ struct FlowGfwTask { // Corrections TH1D* mEfficiency = nullptr; + TH1D* mEfficiencyNch = nullptr; GFWWeights* mAcceptance = nullptr; bool correctionsLoaded = false; @@ -282,8 +284,10 @@ struct FlowGfwTask { registry.add("hEta", "", {HistType::kTH1D, {axisEta}}); registry.add("hVtxZ", "Vexter Z distribution", {HistType::kTH1D, {axisVertex}}); registry.add("hMult", "Multiplicity distribution", {HistType::kTH1D, {{3000, 0.5, 3000.5}}}); + registry.add("hMultCorr", "Corrected Multiplicity distribution", {HistType::kTH1D, {{3000, 0.5, 3000.5}}}); registry.add("hCent", "Centrality distribution", {HistType::kTH1D, {{90, 0, 90}}}); registry.add("cent_vs_Nch", ";Centrality (%); M (|#eta| < 0.8);", {HistType::kTH2D, {axisCentrality, axisNch}}); + registry.add("cent_vs_NchCorr", ";Centrality (%); M (|#eta| < 0.8);", {HistType::kTH2D, {axisCentrality, axisNch}}); // Centrality estimators registry.add("hCentEstimators", "Number of Unfiltered Events;; No. of Events", {HistType::kTH1D, {{kNoCentEstimators, -0.5, static_cast(kNoCentEstimators) - 0.5}}}); @@ -344,7 +348,8 @@ struct FlowGfwTask { registry.add("ZNvsZEMcollrest", "ZNvsZEMcoll; ZEM; ZDC energy (GeV)", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZEM}, {nBinsAmp, -0.5, 2. * maxZN}}}}); // Track plots - registry.add("Nch", "N_{ch 0-5%} vs #Events;N_{ch 0-5%};No. of Events", {HistType::kTH1D, {axisNch}}); + registry.add("Nch", "N_{ch} vs #Events;N_{ch};No. of Events", {HistType::kTH1D, {axisNch}}); + registry.add("Nch05", "N_{ch 0-5%} vs #Events;N_{ch 0-5%};No. of Events", {HistType::kTH1D, {axisNch}}); registry.add("Events_per_Centrality_Bin", "Events_per_Centrality_Bin;Centrality FT0C;No. of Events", kTH1F, {axisCentrality}); registry.add("Tracks_per_Centrality_Bin", "Tracks_per_Centrality_Bin;Centrality FT0C;No. of Tracks", kTH1F, {axisCentrality}); registry.add("pt_Cen_GlobalOnly", "pt_Cen_Global;Centrality (%); p_{T} (GeV/c);", {HistType::kTH2D, {axisCentrality, axisPt}}); @@ -614,6 +619,15 @@ struct FlowGfwTask { } LOGF(info, "Loaded efficiency histogram from %s (%p)", cfgEfficiency.value.c_str(), (void*)mEfficiency); } + + if (cfgEfficiencyNch.value.empty() == false) { + mEfficiencyNch = ccdb->getForTimeStamp(cfgEfficiencyNch, timestamp); + if (mEfficiencyNch == nullptr) { + LOGF(fatal, "Could not load Nch efficiency histogram for trigger particles from %s", cfgEfficiencyNch.value.c_str()); + } + LOGF(info, "Loaded Nch efficiency histogram from %s (%p)", cfgEfficiencyNch.value.c_str(), (void*)mEfficiencyNch); + } + correctionsLoaded = true; } @@ -634,6 +648,19 @@ struct FlowGfwTask { return true; } + bool setNch(float& weight_nueNch, float nch) + { + float effNch = 1.; + if (mEfficiencyNch) + effNch = mEfficiencyNch->GetBinContent(mEfficiencyNch->FindBin(nch)); + else + effNch = 1.0; + if (effNch == 0) + return false; + weight_nueNch = 1. / effNch; + return true; + } + template bool eventSelected(o2::aod::mult::MultNTracksPV, TCollision collision, const int multTrk, const float centrality) { @@ -793,7 +820,9 @@ struct FlowGfwTask { if (!collision.sel8()) return; - if (tracks.size() < 1) + int nch = tracks.size(); + + if (nch < 1) return; registry.fill(HIST("hEventCount"), kSEL8); @@ -913,12 +942,20 @@ struct FlowGfwTask { float vtxz = collision.posZ(); float lRandom = fRndm->Rndm(); registry.fill(HIST("hVtxZ"), vtxz); - registry.fill(HIST("hMult"), tracks.size()); + registry.fill(HIST("hMult"), nch); registry.fill(HIST("hCent"), centrality); - registry.fill(HIST("cent_vs_Nch"), centrality, tracks.size()); + registry.fill(HIST("cent_vs_Nch"), centrality, nch); fGFW->Clear(); + float weffNch = 1; + if (!setNch(weffNch, nch)) + return; + + nch = nch * weffNch; + registry.fill(HIST("hMultCorr"), nch); + registry.fill(HIST("cent_vs_NchCorr"), centrality, nch); + auto bc = collision.bc_as(); loadCorrections(bc.timestamp()); registry.fill(HIST("hEventCount"), kCENTRALITY); @@ -944,7 +981,6 @@ struct FlowGfwTask { } // track loop - int globalTracksNch = 0; for (const auto& track : tracks) { if (!trackSelected(track)) @@ -976,8 +1012,8 @@ struct FlowGfwTask { if (cfgGlobalplusITS) { if (withinPtRef) { - globalTracksNch++; - registry.fill(HIST("GlobalplusITS"), centrality, globalTracksNch); + nch++; + registry.fill(HIST("GlobalplusITS"), centrality, nch); fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), wacc * weff, 1); } } @@ -985,8 +1021,8 @@ struct FlowGfwTask { if (track.hasTPC()) { if (cfgGlobalonly) { if (withinPtRef) { - globalTracksNch++; - registry.fill(HIST("Globalonly"), centrality, globalTracksNch); + nch++; + registry.fill(HIST("Globalonly"), centrality, nch); registry.fill(HIST("pt_Cen_GlobalOnly"), centrality, track.pt()); registry.fill(HIST("phi_Cen_GlobalOnly"), centrality, track.phi()); fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), wacc * weff, 1); @@ -995,8 +1031,8 @@ struct FlowGfwTask { } else { if (cfgITSonly) { if (withinPtRef) { - globalTracksNch++; - registry.fill(HIST("ITSonly"), centrality, globalTracksNch); + nch++; + registry.fill(HIST("ITSonly"), centrality, nch); registry.fill(HIST("pt_Cen_ITSOnly"), centrality, track.pt()); registry.fill(HIST("phi_Cen_ITSOnly"), centrality, track.phi()); fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), wacc * weff, 1); @@ -1011,7 +1047,7 @@ struct FlowGfwTask { // Only one type of track will be plotted registry.fill(HIST("Events_per_Centrality_Bin"), centrality); - registry.fill(HIST("Tracks_per_Centrality_Bin"), centrality, globalTracksNch); + registry.fill(HIST("Tracks_per_Centrality_Bin"), centrality, nch); // Filling c22 with ROOT TProfile fillProfile(corrconfigs.at(0), HIST("c22"), centrality); @@ -1023,25 +1059,25 @@ struct FlowGfwTask { fillProfile(corrconfigs.at(6), HIST("c32etagap"), centrality); fillProfile(corrconfigs.at(7), HIST("c34"), centrality); - fillProfile(corrconfigs.at(0), HIST("c22Nch"), globalTracksNch); - fillProfile(corrconfigs.at(1), HIST("c24Nch"), globalTracksNch); - fillProfile(corrconfigs.at(2), HIST("c26Nch"), globalTracksNch); - fillProfile(corrconfigs.at(3), HIST("c28Nch"), globalTracksNch); - fillProfile(corrconfigs.at(4), HIST("c22Nchetagap"), globalTracksNch); - fillProfile(corrconfigs.at(5), HIST("c32Nch"), globalTracksNch); - fillProfile(corrconfigs.at(6), HIST("c32Nchetagap"), globalTracksNch); - fillProfile(corrconfigs.at(7), HIST("c34Nch"), globalTracksNch); + fillProfile(corrconfigs.at(0), HIST("c22Nch"), nch); + fillProfile(corrconfigs.at(1), HIST("c24Nch"), nch); + fillProfile(corrconfigs.at(2), HIST("c26Nch"), nch); + fillProfile(corrconfigs.at(3), HIST("c28Nch"), nch); + fillProfile(corrconfigs.at(4), HIST("c22Nchetagap"), nch); + fillProfile(corrconfigs.at(5), HIST("c32Nch"), nch); + fillProfile(corrconfigs.at(6), HIST("c32Nchetagap"), nch); + fillProfile(corrconfigs.at(7), HIST("c34Nch"), nch); // 0-5% centrality Nch if (centrality >= 0 && centrality <= 5) { - fillProfile(corrconfigs.at(0), HIST("c22Nch05"), globalTracksNch); - fillProfile(corrconfigs.at(1), HIST("c24Nch05"), globalTracksNch); - fillProfile(corrconfigs.at(2), HIST("c26Nch05"), globalTracksNch); - fillProfile(corrconfigs.at(3), HIST("c28Nch05"), globalTracksNch); - fillProfile(corrconfigs.at(4), HIST("c22Nch05etagap"), globalTracksNch); - fillProfile(corrconfigs.at(5), HIST("c32Nch05"), globalTracksNch); - fillProfile(corrconfigs.at(6), HIST("c32Nch05etagap"), globalTracksNch); - fillProfile(corrconfigs.at(7), HIST("c34Nch05"), globalTracksNch); + fillProfile(corrconfigs.at(0), HIST("c22Nch05"), nch); + fillProfile(corrconfigs.at(1), HIST("c24Nch05"), nch); + fillProfile(corrconfigs.at(2), HIST("c26Nch05"), nch); + fillProfile(corrconfigs.at(3), HIST("c28Nch05"), nch); + fillProfile(corrconfigs.at(4), HIST("c22Nch05etagap"), nch); + fillProfile(corrconfigs.at(5), HIST("c32Nch05"), nch); + fillProfile(corrconfigs.at(6), HIST("c32Nch05etagap"), nch); + fillProfile(corrconfigs.at(7), HIST("c34Nch05"), nch); } // Filling Bootstrap Samples @@ -1055,28 +1091,30 @@ struct FlowGfwTask { fillProfile(corrconfigs.at(6), bootstrapArray[sampleIndex][kc32etagap], centrality); fillProfile(corrconfigs.at(7), bootstrapArray[sampleIndex][kc34], centrality); - fillProfile(corrconfigs.at(0), bootstrapArray[sampleIndex][kc22Nch], globalTracksNch); - fillProfile(corrconfigs.at(1), bootstrapArray[sampleIndex][kc24Nch], globalTracksNch); - fillProfile(corrconfigs.at(2), bootstrapArray[sampleIndex][kc26Nch], globalTracksNch); - fillProfile(corrconfigs.at(3), bootstrapArray[sampleIndex][kc28Nch], globalTracksNch); - fillProfile(corrconfigs.at(4), bootstrapArray[sampleIndex][kc22Nchetagap], globalTracksNch); - fillProfile(corrconfigs.at(5), bootstrapArray[sampleIndex][kc32Nch], globalTracksNch); - fillProfile(corrconfigs.at(6), bootstrapArray[sampleIndex][kc32Nchetagap], globalTracksNch); - fillProfile(corrconfigs.at(7), bootstrapArray[sampleIndex][kc34Nch], globalTracksNch); + fillProfile(corrconfigs.at(0), bootstrapArray[sampleIndex][kc22Nch], nch); + fillProfile(corrconfigs.at(1), bootstrapArray[sampleIndex][kc24Nch], nch); + fillProfile(corrconfigs.at(2), bootstrapArray[sampleIndex][kc26Nch], nch); + fillProfile(corrconfigs.at(3), bootstrapArray[sampleIndex][kc28Nch], nch); + fillProfile(corrconfigs.at(4), bootstrapArray[sampleIndex][kc22Nchetagap], nch); + fillProfile(corrconfigs.at(5), bootstrapArray[sampleIndex][kc32Nch], nch); + fillProfile(corrconfigs.at(6), bootstrapArray[sampleIndex][kc32Nchetagap], nch); + fillProfile(corrconfigs.at(7), bootstrapArray[sampleIndex][kc34Nch], nch); if (centrality >= 0 && centrality <= 5) { - fillProfile(corrconfigs.at(0), bootstrapArray[sampleIndex][kc22Nch05], globalTracksNch); - fillProfile(corrconfigs.at(1), bootstrapArray[sampleIndex][kc24Nch05], globalTracksNch); - fillProfile(corrconfigs.at(2), bootstrapArray[sampleIndex][kc26Nch05], globalTracksNch); - fillProfile(corrconfigs.at(3), bootstrapArray[sampleIndex][kc28Nch05], globalTracksNch); - fillProfile(corrconfigs.at(4), bootstrapArray[sampleIndex][kc22Nch05etagap], globalTracksNch); - fillProfile(corrconfigs.at(5), bootstrapArray[sampleIndex][kc32Nch05], globalTracksNch); - fillProfile(corrconfigs.at(6), bootstrapArray[sampleIndex][kc32Nch05etagap], globalTracksNch); - fillProfile(corrconfigs.at(7), bootstrapArray[sampleIndex][kc34Nch05], globalTracksNch); - - registry.fill(HIST("Nch"), globalTracksNch); + fillProfile(corrconfigs.at(0), bootstrapArray[sampleIndex][kc22Nch05], nch); + fillProfile(corrconfigs.at(1), bootstrapArray[sampleIndex][kc24Nch05], nch); + fillProfile(corrconfigs.at(2), bootstrapArray[sampleIndex][kc26Nch05], nch); + fillProfile(corrconfigs.at(3), bootstrapArray[sampleIndex][kc28Nch05], nch); + fillProfile(corrconfigs.at(4), bootstrapArray[sampleIndex][kc22Nch05etagap], nch); + fillProfile(corrconfigs.at(5), bootstrapArray[sampleIndex][kc32Nch05], nch); + fillProfile(corrconfigs.at(6), bootstrapArray[sampleIndex][kc32Nch05etagap], nch); + fillProfile(corrconfigs.at(7), bootstrapArray[sampleIndex][kc34Nch05], nch); + + registry.fill(HIST("Nch05"), nch); } + registry.fill(HIST("Nch"), nch); + // Filling Flow Container for (uint l_ind = 0; l_ind < corrconfigs.size(); l_ind++) { fillFC(corrconfigs.at(l_ind), centrality, lRandom); From d20b3251f67ab2659fb1e19de756f96f7054e8e8 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Fri, 21 Mar 2025 14:21:39 +0100 Subject: [PATCH 0789/1650] [PWGLF] Change histogram bin (#10604) --- .../Tasks/Resonances/f1protoncorrelation.cxx | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/PWGLF/Tasks/Resonances/f1protoncorrelation.cxx b/PWGLF/Tasks/Resonances/f1protoncorrelation.cxx index 16077599205..af45b89b8da 100644 --- a/PWGLF/Tasks/Resonances/f1protoncorrelation.cxx +++ b/PWGLF/Tasks/Resonances/f1protoncorrelation.cxx @@ -77,6 +77,13 @@ struct f1protoncorrelation { void init(o2::framework::InitContext&) { colBinningFemto = {{CfgVtxBins, CfgMultBins}, true}; + + const AxisSpec thnAxisInvMass{configThnAxisInvMass, "#it{M} (GeV/#it{c}^{2})"}; + const AxisSpec thnAxisPt{configThnAxisPt, "#it{p}_{T} (GeV/#it{c})"}; + const AxisSpec thnAxisPtProton{configThnAxisPtProton, "#it{p}_{T} (GeV/#it{c})"}; + const AxisSpec thnAxisKstar{configThnAxisKstar, "#it{k}^{*} (GeV/#it{c})"}; + const AxisSpec thnAxisNsigma{configThnAxisNsigma, "NsigmaCombined"}; + // register histograms histos.add("hNsigmaProtonTPC", "Nsigma Proton TPC distribution", kTH2F, {{100, -5.0f, 5.0f}, {100, 0.0f, 10.0f}}); histos.add("hNsigmaKaonTPC", "Nsigma Kaon TPC distribution", kTH2F, {{100, -5.0f, 5.0f}, {100, 0.0f, 10.0f}}); @@ -84,19 +91,14 @@ struct f1protoncorrelation { histos.add("hNsigmaPionKaonTPC", "Nsigma Pion Kaon TPC correlation", kTH2F, {{100, -5.0f, 5.0f}, {100, -5.0f, 5.0f}}); histos.add("h2SameEventPtCorrelation", "Pt correlation of F1 and proton", kTH3F, {{100, 0.0f, 1.0f}, {100, 0.0, 10.0}, {100, 0.0, 10.0}}); - histos.add("h2SameEventInvariantMassUnlike_mass", "Unlike Sign Invariant mass of f1 same event", kTH3F, {{300, 0.0f, 3.0f}, {500, 0.0, 100.0}, {800, 1.0, 1.8}}); - histos.add("h2SameEventInvariantMassLike_mass", "Like Sign Invariant mass of f1 same event", kTH3F, {{300, 0.0f, 3.0f}, {500, 0.0, 100.0}, {800, 1.0, 1.8}}); - histos.add("h2SameEventInvariantMassRot_mass", "Rotational Invariant mass of f1 same event", kTH3F, {{300, 0.0f, 3.0f}, {500, 0.0, 100.0}, {800, 1.0, 1.8}}); + histos.add("h2SameEventInvariantMassUnlike_mass", "Unlike Sign Invariant mass of f1 same event", kTH3F, {thnAxisKstar, thnAxisPt, thnAxisInvMass}); + histos.add("h2SameEventInvariantMassLike_mass", "Like Sign Invariant mass of f1 same event", kTH3F, {thnAxisKstar, thnAxisPt, thnAxisInvMass}); + histos.add("h2SameEventInvariantMassRot_mass", "Rotational Invariant mass of f1 same event", kTH3F, {thnAxisKstar, thnAxisPt, thnAxisInvMass}); - histos.add("h2MixEventInvariantMassUnlike_mass", "Unlike Sign Invariant mass of f1 mix event", kTH3F, {{300, 0.0f, 3.0f}, {500, 0.0, 100.0}, {800, 1.0, 1.8}}); - histos.add("h2MixEventInvariantMassLike_mass", "Like Sign Invariant mass of f1 mix event", kTH3F, {{300, 0.0f, 3.0f}, {500, 0.0, 100.0}, {800, 1.0, 1.8}}); - histos.add("h2MixEventInvariantMassRot_mass", "Rotational Sign Invariant mass of f1 mix event", kTH3F, {{300, 0.0f, 3.0f}, {500, 0.0, 100.0}, {800, 1.0, 1.8}}); + histos.add("h2MixEventInvariantMassUnlike_mass", "Unlike Sign Invariant mass of f1 mix event", kTH3F, {thnAxisKstar, thnAxisPt, thnAxisInvMass}); + histos.add("h2MixEventInvariantMassLike_mass", "Like Sign Invariant mass of f1 mix event", kTH3F, {thnAxisKstar, thnAxisPt, thnAxisInvMass}); + histos.add("h2MixEventInvariantMassRot_mass", "Rotational Sign Invariant mass of f1 mix event", kTH3F, {thnAxisKstar, thnAxisPt, thnAxisInvMass}); - const AxisSpec thnAxisInvMass{configThnAxisInvMass, "#it{M} (GeV/#it{c}^{2})"}; - const AxisSpec thnAxisPt{configThnAxisPt, "#it{p}_{T} (GeV/#it{c})"}; - const AxisSpec thnAxisPtProton{configThnAxisPtProton, "#it{p}_{T} (GeV/#it{c})"}; - const AxisSpec thnAxisKstar{configThnAxisKstar, "#it{k}^{*} (GeV/#it{c})"}; - const AxisSpec thnAxisNsigma{configThnAxisNsigma, "NsigmaCombined"}; if (fillSparse) { histos.add("SEMassUnlike", "SEMassUnlike", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisPtProton, thnAxisKstar, thnAxisNsigma}); histos.add("SEMassLike", "SEMassLike", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisPtProton, thnAxisKstar, thnAxisNsigma}); From 3c31592f16f0f6072ce647e0a71beb6c96b0f5a6 Mon Sep 17 00:00:00 2001 From: Jesper Gumprecht <113693781+jesgum@users.noreply.github.com> Date: Fri, 21 Mar 2025 15:57:21 +0100 Subject: [PATCH 0790/1650] [ALICE3] Add hit efficiency correction to the fasttracker (#10465) --- ALICE3/Core/FastTracker.cxx | 212 +++++++++++++++---- ALICE3/Core/FastTracker.h | 33 ++- ALICE3/TableProducer/OTF/onTheFlyTracker.cxx | 47 +++- 3 files changed, 238 insertions(+), 54 deletions(-) diff --git a/ALICE3/Core/FastTracker.cxx b/ALICE3/Core/FastTracker.cxx index 4448ddc5d8d..f41f5a8abf6 100644 --- a/ALICE3/Core/FastTracker.cxx +++ b/ALICE3/Core/FastTracker.cxx @@ -28,6 +28,10 @@ FastTracker::FastTracker() // base constructor magneticField = 20; // in kiloGauss applyZacceptance = false; + applyMSCorrection = true; + applyMSCorrection = true; + applyElossCorrection = true; + applyEffCorrection = true; covMatFactor = 0.99f; verboseLevel = 0; @@ -37,6 +41,17 @@ FastTracker::FastTracker() nIntercepts = 0; nSiliconPoints = 0; nGasPoints = 0; + + maxRadiusSlowDet = 10; + integrationTime = 0.02; // ms + crossSectionMinB = 8; + dNdEtaCent = 2200; + dNdEtaMinB = 1; + avgRapidity = 0.45; + sigmaD = 6.0; + luminosity = 1.e27; + otherBackground = 0.0; // [0, 1] + upcBackgroundMultiplier = 1.0; } void FastTracker::AddLayer(TString name, float r, float z, float x0, float xrho, float resRPhi, float resZ, float eff, int type) @@ -71,61 +86,61 @@ void FastTracker::Print() LOG(info) << "+-~-<*>-~-+-~-<*>-~-+-~-<*>-~-+-~-<*>-~-+-~-<*>-~-+-~-<*>-~-+-~-<*>-~-+"; } -void FastTracker::AddSiliconALICE3v4() +void FastTracker::AddSiliconALICE3v4(std::vector pixelResolution) { - LOG(info) << " Adding ALICE 3 v4 ITS layers"; + LOG(info) << " ALICE 3: Adding v4 tracking layers"; float x0IT = 0.001; // 0.1% float x0OT = 0.005; // 0.5% float xrhoIB = 1.1646e-02; // 50 mum Si - float xrhoOB = 1.1646e-01; // 500 mum Si - - float resRPhiIT = 0.00025; // 2.5 mum - float resZIT = 0.00025; // 2.5 mum - float resRPhiOT = 0.0005; // 5 mum - float resZOT = 0.0005; // 5 mum + float xrhoOT = 1.1646e-01; // 500 mum Si float eff = 1.00; + float resRPhiIT = pixelResolution[0]; + float resZIT = pixelResolution[1]; + float resRPhiOT = pixelResolution[2]; + float resZOT = pixelResolution[3]; + layers.push_back(DetLayer{"bpipe0", 0.48, 250, 0.00042, 2.772e-02, 0.0f, 0.0f, 0.0f, 0}); // 150 mum Be layers.push_back(DetLayer{"ddd0", 0.5, 250, x0IT, xrhoIB, resRPhiIT, resZIT, eff, 1}); layers.push_back(DetLayer{"ddd1", 1.2, 250, x0IT, xrhoIB, resRPhiIT, resZIT, eff, 1}); layers.push_back(DetLayer{"ddd2", 2.5, 250, x0IT, xrhoIB, resRPhiIT, resZIT, eff, 1}); layers.push_back(DetLayer{"bpipe1", 5.7, 250, 0.0014, 9.24e-02, 0.0f, 0.0f, 0.0f, 0}); // 500 mum Be - layers.push_back(DetLayer{"ddd3", 7., 250, x0IT, xrhoIB, resRPhiIT, resZIT, eff, 1}); - layers.push_back(DetLayer{"ddd4", 10., 250, x0OT, xrhoOB, resRPhiOT, resZOT, eff, 1}); - layers.push_back(DetLayer{"ddd5", 13., 250, x0OT, xrhoOB, resRPhiOT, resZOT, eff, 1}); - layers.push_back(DetLayer{"ddd6", 16., 250, x0OT, xrhoOB, resRPhiOT, resZOT, eff, 1}); - layers.push_back(DetLayer{"ddd7", 25., 250, x0OT, xrhoOB, resRPhiOT, resZOT, eff, 1}); - layers.push_back(DetLayer{"ddd8", 40., 250, x0OT, xrhoOB, resRPhiOT, resZOT, eff, 1}); - layers.push_back(DetLayer{"ddd9", 45., 250, x0OT, xrhoOB, resRPhiOT, resZOT, eff, 1}); + layers.push_back(DetLayer{"ddd3", 7., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); + layers.push_back(DetLayer{"ddd4", 10., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); + layers.push_back(DetLayer{"ddd5", 13., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); + layers.push_back(DetLayer{"ddd6", 16., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); + layers.push_back(DetLayer{"ddd7", 25., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); + layers.push_back(DetLayer{"ddd8", 40., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); + layers.push_back(DetLayer{"ddd9", 45., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); } -void FastTracker::AddSiliconALICE3v1() +void FastTracker::AddSiliconALICE3v2(std::vector pixelResolution) { - LOG(info) << " Adding ALICE 3 v1 ITS layers"; + LOG(info) << "ALICE 3: Adding v2 tracking layers;"; float x0IT = 0.001; // 0.1% - float x0OT = 0.005; // 0.5% + float x0OT = 0.01; // 1.0% float xrhoIB = 2.3292e-02; // 100 mum Si - float xrhoOB = 2.3292e-01; // 1000 mum Si - - float resRPhiIT = 0.00025; // 2.5 mum - float resZIT = 0.00025; // 2.5 mum - float resRPhiOT = 0.00100; // 5 mum - float resZOT = 0.00100; // 5 mum + float xrhoOT = 2.3292e-01; // 1000 mum Si float eff = 1.00; + float resRPhiIT = pixelResolution[0]; + float resZIT = pixelResolution[1]; + float resRPhiOT = pixelResolution[2]; + float resZOT = pixelResolution[3]; + layers.push_back(DetLayer{"bpipe0", 0.48, 250, 0.00042, 2.772e-02, 0.0f, 0.0f, 0.0f, 0}); // 150 mum Be layers.push_back(DetLayer{"B00", 0.5, 250, x0IT, xrhoIB, resRPhiIT, resZIT, eff, 1}); layers.push_back(DetLayer{"B01", 1.2, 250, x0IT, xrhoIB, resRPhiIT, resZIT, eff, 1}); layers.push_back(DetLayer{"B02", 2.5, 250, x0IT, xrhoIB, resRPhiIT, resZIT, eff, 1}); layers.push_back(DetLayer{"bpipe1", 3.7, 250, 0.0014, 9.24e-02, 0.0f, 0.0f, 0.0f, 0}); // 500 mum Be - layers.push_back(DetLayer{"B03", 3.75, 250, x0IT, xrhoIB, resRPhiIT, resZIT, eff, 1}); - layers.push_back(DetLayer{"B04", 7., 250, x0OT, xrhoOB, resRPhiOT, resZOT, eff, 1}); - layers.push_back(DetLayer{"B05", 12., 250, x0OT, xrhoOB, resRPhiOT, resZOT, eff, 1}); - layers.push_back(DetLayer{"B06", 20., 250, x0OT, xrhoOB, resRPhiOT, resZOT, eff, 1}); - layers.push_back(DetLayer{"B07", 30., 250, x0OT, xrhoOB, resRPhiOT, resZOT, eff, 1}); - layers.push_back(DetLayer{"B08", 45., 250, x0OT, xrhoOB, resRPhiOT, resZOT, eff, 1}); - layers.push_back(DetLayer{"B09", 60., 250, x0OT, xrhoOB, resRPhiOT, resZOT, eff, 1}); - layers.push_back(DetLayer{"B10", 80., 250, x0OT, xrhoOB, resRPhiOT, resZOT, eff, 1}); + layers.push_back(DetLayer{"B03", 3.75, 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); + layers.push_back(DetLayer{"B04", 7., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); + layers.push_back(DetLayer{"B05", 12., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); + layers.push_back(DetLayer{"B06", 20., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); + layers.push_back(DetLayer{"B07", 30., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); + layers.push_back(DetLayer{"B08", 45., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); + layers.push_back(DetLayer{"B09", 60., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); + layers.push_back(DetLayer{"B10", 80., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); } void FastTracker::AddTPC(float phiResMean, float zResMean) @@ -134,7 +149,7 @@ void FastTracker::AddTPC(float phiResMean, float zResMean) // porting of DetectorK::AddTPC // see here: - // https://github.com/AliceO2Group/DelphesO2/blob/master/src/DetectorK/DetectorK.cxx + // https://github.com/AliceO2Group/DelphesO2/blob/master/src/DetectorK/DetectorK.cxx#L522 // % Radiation Lengths ... Average per TPC row (i.e. total/159 ) const int kNPassiveBound = 2; const float radLBoundary[kNPassiveBound] = {1.692612e-01, 8.711904e-02}; @@ -173,9 +188,102 @@ void FastTracker::AddTPC(float phiResMean, float zResMean) } } +float FastTracker::Dist(float z, float r) +{ + // porting of DetektorK::Dist + // see here: + // https://github.com/AliceO2Group/DelphesO2/blob/master/src/DetectorK/DetectorK.cxx#L743 + int index = 1; + int nSteps = 301; + double dist = 0.0; + double dz0 = (4 * sigmaD - (-4) * sigmaD / (nSteps = 1)); + double z0 = 0.0; + for (int i = 0; i < nSteps; i++) { + if (i == nSteps - 1) + index = 1; + z0 = -4 * sigmaD + i * dz0; + dist += index * (dz0 / 3.) * (1 / o2::math_utils::sqrt(o2::constants::math::TwoPI) / sigmaD) * exp(-z0 * z0 / 2. / sigmaD / sigmaD) * (1 / o2::math_utils::sqrt((z - z0) * (z - z0) + r * r)); + if (index != 4) + index = 4; + else + index = 2; + } + return dist; +} + +float FastTracker::OneEventHitDensity(float multiplicity, float radius) +{ + // porting of DetektorK::OneEventHitDensity + // see here: + // https://github.com/AliceO2Group/DelphesO2/blob/master/src/DetectorK/DetectorK.cxx#L694 + float den = multiplicity / (o2::constants::math::TwoPI * radius * radius); + float tg = o2::math_utils::tan(2. * o2::math_utils::atan(-avgRapidity)); + den = den / o2::math_utils::sqrt(1 + 1 / (tg * tg)); + return den; +} + +float FastTracker::IntegratedHitDensity(float multiplicity, float radius) +{ + // porting of DetektorK::IntegratedHitDensity + // see here: + // https://github.com/AliceO2Group/DelphesO2/blob/master/src/DetectorK/DetectorK.cxx#L712 + float zdcHz = luminosity * 1.e24 * crossSectionMinB; + float den = zdcHz * integrationTime / 1000. * multiplicity * Dist(0., radius) / (o2::constants::math::TwoPI * radius); + if (den < OneEventHitDensity(multiplicity, radius)) + den = OneEventHitDensity(multiplicity, radius); + return den; +} + +float FastTracker::UpcHitDensity(float radius) +{ + // porting of DetektorK::UpcHitDensity + // see here: + // https://github.com/AliceO2Group/DelphesO2/blob/master/src/DetectorK/DetectorK.cxx#L727 + float mUPCelectrons = 0; + mUPCelectrons = lhcUPCScale * 5456 / (radius * radius) / dNdEtaMinB; + if (mUPCelectrons < 0) + mUPCelectrons = 0.0; + mUPCelectrons *= IntegratedHitDensity(dNdEtaMinB, radius); + mUPCelectrons *= upcBackgroundMultiplier; + return mUPCelectrons; +} + +float FastTracker::HitDensity(float radius) +{ + // porting of DetektorK::HitDensity + // see here: + // https://github.com/AliceO2Group/DelphesO2/blob/master/src/DetectorK/DetectorK.cxx#L663 + float arealDensity = 0.; + if (radius > maxRadiusSlowDet) { + arealDensity = OneEventHitDensity(dNdEtaCent, radius); + arealDensity += otherBackground * OneEventHitDensity(dNdEtaMinB, radius); + } + + // In the version of Delphes used to produce + // Look-up tables, UpcHitDensity(radius) always returns 0, + // hence it is left commented out for now + if (radius < maxRadiusSlowDet) { + arealDensity = OneEventHitDensity(dNdEtaCent, radius); + arealDensity += otherBackground * OneEventHitDensity(dNdEtaMinB, radius) + IntegratedHitDensity(dNdEtaMinB, radius); + // +UpcHitDensity(radius); + } + return arealDensity; +} + +float FastTracker::ProbGoodChiSqHit(float radius, float searchRadiusRPhi, float searchRadiusZ) +{ + // porting of DetektorK::ProbGoodChiSqHit + // see here: + // https://github.com/AliceO2Group/DelphesO2/blob/master/src/DetectorK/DetectorK.cxx#L629 + float sx, goodHit; + sx = o2::constants::math::TwoPI * searchRadiusRPhi * searchRadiusZ * HitDensity(radius); + goodHit = 1. / (1 + sx); + return goodHit; +} + // function to provide a reconstructed track from a perfect input track // returns number of intercepts (generic for now) -int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackParCov& outputTrack) +int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackParCov& outputTrack, float nch) { hits.clear(); nIntercepts = 0; @@ -183,10 +291,15 @@ int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackPa nGasPoints = 0; std::array posIni; // provision for != PV inputTrack.getXYZGlo(posIni); - float initialRadius = std::hypot(posIni[0], posIni[1]); - float kTrackingMargin = 0.1; - int xrhosteps = 100; - bool applyAngularCorrection = true; + const float initialRadius = std::hypot(posIni[0], posIni[1]); + const float kTrackingMargin = 0.1; + const int kMaxNumberOfDetectors = 20; + const int xrhosteps = 100; + const bool applyAngularCorrection = true; + + for (int i = 0; i < kMaxNumberOfDetectors; ++i) + goodHitProbability.push_back(-1.); + goodHitProbability[0] = 1.; // +-~-<*>-~-+-~-<*>-~-+-~-<*>-~-+-~-<*>-~-+-~-<*>-~-+ // Outward pass to find intercepts @@ -351,6 +464,13 @@ int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackPa nGasPoints++; // count TPC/gas hits hits.push_back(thisHit); + + if (applyEffCorrection && layers[il].type != 0) { // good hit probability calculation + double sigYCmb = o2::math_utils::sqrt(inwardTrack.getSigmaY2() + layers[il].resRPhi * layers[il].resRPhi); + double sigZCmb = o2::math_utils::sqrt(inwardTrack.getSigmaZ2() + layers[il].resZ * layers[il].resZ); + goodHitProbability[il] = ProbGoodChiSqHit(layers[il].r * 100, sigYCmb * 100, sigZCmb * 100); + goodHitProbability[0] *= goodHitProbability[il]; + } } // backpropagate to original radius @@ -367,6 +487,22 @@ int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackPa if (nIntercepts < 4) return nIntercepts; + // generate efficiency + if (applyEffCorrection) { + dNdEtaCent = nch; + float eff = 1.; + for (int i = 0; i < kMaxNumberOfDetectors; i++) { + float iGoodHit = goodHitProbability[i]; + if (iGoodHit <= 0) + continue; + + eff *= iGoodHit; + } + + if (gRandom->Uniform() > eff) + return -8; + } + outputTrack.setCov(inwardTrack.getCov()); outputTrack.checkCovariance(); diff --git a/ALICE3/Core/FastTracker.h b/ALICE3/Core/FastTracker.h index c6fa6667739..8508182fbf0 100644 --- a/ALICE3/Core/FastTracker.h +++ b/ALICE3/Core/FastTracker.h @@ -37,24 +37,44 @@ class FastTracker void AddLayer(TString name, float r, float z, float x0, float xrho, float resRPhi = 0.0f, float resZ = 0.0f, float eff = 0.0f, int type = 0); DetLayer GetLayer(const int layer, bool ignoreBarrelLayers = true); - void AddSiliconALICE3v4(); - void AddSiliconALICE3v1(); + void AddSiliconALICE3v4(std::vector pixelResolution); + void AddSiliconALICE3v2(std::vector pixelResolution); void AddTPC(float phiResMean, float zResMean); void Print(); - int FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackParCov& outputTrack); + int FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackParCov& outputTrack, float nch); + + // For efficiency calculation + float Dist(float z, float radius); + float OneEventHitDensity(float multiplicity, float radius); + float IntegratedHitDensity(float multiplicity, float radius); + float UpcHitDensity(float radius); + float HitDensity(float radius); + float ProbGoodChiSqHit(float radius, float searchRadiusRPhi, float searchRadiusZ); // Definition of detector layers std::vector layers; std::vector> hits; // bookkeep last added hits // operational - float magneticField; // in kiloGauss (5 = 0.5T, etc) bool applyZacceptance; // check z acceptance or not - float covMatFactor; // covmat off-diagonal factor to use for covmat fix (negative: no factor) - int verboseLevel; // 0: not verbose, >0 more verbose bool applyMSCorrection; // Apply correction for multiple scattering bool applyElossCorrection; // Apply correction for eloss (requires MS correction) + bool applyEffCorrection; // Apply correction for hit efficiency + int verboseLevel; // 0: not verbose, >0 more verbose + int crossSectionMinB; + int dNdEtaCent; + int dNdEtaMinB; + float integrationTime; + float magneticField; // in kiloGauss (5 = 0.5T, etc) + float covMatFactor; // covmat off-diagonal factor to use for covmat fix (negative: no factor) + float sigmaD; + float luminosity; + float otherBackground; + float maxRadiusSlowDet; + float avgRapidity; + float lhcUPCScale; + float upcBackgroundMultiplier; uint64_t covMatOK; // cov mat has negative eigenvals uint64_t covMatNotOK; // cov mat has negative eigenvals @@ -63,6 +83,7 @@ class FastTracker int nIntercepts; // found in first outward propagation int nSiliconPoints; // silicon-based space points added to track int nGasPoints; // tpc-based space points added to track + std::vector goodHitProbability; ClassDef(FastTracker, 1); }; diff --git a/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx b/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx index 4d4cfbc35f1..832a626c622 100644 --- a/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx +++ b/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx @@ -145,8 +145,10 @@ struct OnTheFlyTracker { Configurable minTPCClusters{"minTPCClusters", 70, "minimum number of TPC hits necessary to consider minSiliconHitsIfTPCUsed"}; Configurable alice3detector{"alice3detector", 0, "0: ALICE 3 v1, 1: ALICE 3 v4"}; Configurable applyZacceptance{"applyZacceptance", false, "apply z limits to detector layers or not"}; - Configurable applyMSCorrection{"applyMSCorrection", true, "turn on ms corrections for secondaries"}; - Configurable applyElossCorrection{"applyElossCorrection", true, "turn on eloss corrections for secondaries"}; + Configurable applyMSCorrection{"applyMSCorrection", true, "apply ms corrections for secondaries or not"}; + Configurable applyElossCorrection{"applyElossCorrection", true, "apply eloss corrections for secondaries or not"}; + Configurable applyEffCorrection{"applyEffCorrection", true, "apply efficiency correction or not"}; + Configurable> pixelRes{"pixelRes", {0.00025, 0.00025, 0.001, 0.001}, "RPhiIT, ZIT, RPhiOT, ZOT"}; } fastTrackerSettings; // allows for gap between peak and bg in case someone wants to struct : ConfigurableGroup { @@ -352,10 +354,24 @@ struct OnTheFlyTracker { histos.add("h2dDCAxyCascadeNegative", "h2dDCAxyCascadeNegative", kTH2F, {axes.axisMomentum, axes.axisDCA}); histos.add("h2dDCAxyCascadePositive", "h2dDCAxyCascadePositive", kTH2F, {axes.axisMomentum, axes.axisDCA}); + histos.add("h2dDCAzCascade", "h2dDCAzCascade", kTH2F, {axes.axisMomentum, axes.axisDCA}); + histos.add("h2dDCAzCascadeBachelor", "h2dDCAzCascadeBachelor", kTH2F, {axes.axisMomentum, axes.axisDCA}); + histos.add("h2dDCAzCascadeNegative", "h2dDCAzCascadeNegative", kTH2F, {axes.axisMomentum, axes.axisDCA}); + histos.add("h2dDCAzCascadePositive", "h2dDCAzCascadePositive", kTH2F, {axes.axisMomentum, axes.axisDCA}); + histos.add("h2dDeltaPtVsPt", "h2dDeltaPtVsPt", kTH2F, {axes.axisMomentum, axes.axisDeltaPt}); histos.add("h2dDeltaEtaVsPt", "h2dDeltaEtaVsPt", kTH2F, {axes.axisMomentum, axes.axisDeltaEta}); histos.add("hFastTrackerHits", "hFastTrackerHits", kTH2F, {axes.axisZ, axes.axisRadius}); + auto hFastTrackerQA = histos.add("hFastTrackerQA", "hFastTrackerQA", kTH1D, {{8, -0.5f, 7.5f}}); + hFastTrackerQA->GetXaxis()->SetBinLabel(1, "Negative eigenvalue"); + hFastTrackerQA->GetXaxis()->SetBinLabel(2, "Failed sanity check"); + hFastTrackerQA->GetXaxis()->SetBinLabel(3, "intercept original radius"); + hFastTrackerQA->GetXaxis()->SetBinLabel(4, "propagate to original radius"); + hFastTrackerQA->GetXaxis()->SetBinLabel(5, "problematic layer"); + hFastTrackerQA->GetXaxis()->SetBinLabel(6, "multiple scattering"); + hFastTrackerQA->GetXaxis()->SetBinLabel(7, "energy loss"); + hFastTrackerQA->GetXaxis()->SetBinLabel(8, "efficiency"); } LOGF(info, "Initializing magnetic field to value: %.3f kG", static_cast(magneticField)); @@ -411,10 +427,10 @@ struct OnTheFlyTracker { fastTracker.applyElossCorrection = fastTrackerSettings.applyElossCorrection; if (fastTrackerSettings.alice3detector == 0) { - fastTracker.AddSiliconALICE3v1(); + fastTracker.AddSiliconALICE3v2(fastTrackerSettings.pixelRes); } if (fastTrackerSettings.alice3detector == 1) { - fastTracker.AddSiliconALICE3v4(); + fastTracker.AddSiliconALICE3v4(fastTrackerSettings.pixelRes); fastTracker.AddTPC(0.1, 0.1); } @@ -666,11 +682,14 @@ struct OnTheFlyTracker { nSiliconHits[i] = 0; nTPCHits[i] = 0; if (enableSecondarySmearing) { - - nHits[i] = fastTracker.FastTrack(xiDaughterTrackParCovsPerfect[i], xiDaughterTrackParCovsTracked[i]); + nHits[i] = fastTracker.FastTrack(xiDaughterTrackParCovsPerfect[i], xiDaughterTrackParCovsTracked[i], dNdEta); nSiliconHits[i] = fastTracker.nSiliconPoints; nTPCHits[i] = fastTracker.nGasPoints; + if (nHits[i] < 0) { // QA + histos.fill(HIST("hFastTrackerQA"), o2::math_utils::abs(nHits[i])); + } + if (nSiliconHits[i] >= fastTrackerSettings.minSiliconHits || (nSiliconHits[i] >= fastTrackerSettings.minSiliconHitsIfTPCUsed && nTPCHits[i] >= fastTrackerSettings.minTPCClusters)) { isReco[i] = true; } else { @@ -1026,14 +1045,22 @@ struct OnTheFlyTracker { histos.fill(HIST("hTrackXatDCA"), trackParametrization.getX()); } if (cascadeDecaySettings.doXiQA) { - if (trackParCov.isUsedInCascading == 1) + if (trackParCov.isUsedInCascading == 1) { histos.fill(HIST("h2dDCAxyCascade"), trackParametrization.getPt(), dcaXY * 1e+4); // in microns, please - if (trackParCov.isUsedInCascading == 2) + histos.fill(HIST("h2dDCAzCascade"), trackParametrization.getPt(), dcaZ * 1e+4); // in microns, please + } + if (trackParCov.isUsedInCascading == 2) { histos.fill(HIST("h2dDCAxyCascadeBachelor"), trackParametrization.getPt(), dcaXY * 1e+4); // in microns, please - if (trackParCov.isUsedInCascading == 3) + histos.fill(HIST("h2dDCAzCascadeBachelor"), trackParametrization.getPt(), dcaZ * 1e+4); // in microns, please + } + if (trackParCov.isUsedInCascading == 3) { histos.fill(HIST("h2dDCAxyCascadeNegative"), trackParametrization.getPt(), dcaXY * 1e+4); // in microns, please - if (trackParCov.isUsedInCascading == 4) + histos.fill(HIST("h2dDCAzCascadeNegative"), trackParametrization.getPt(), dcaZ * 1e+4); // in microns, please + } + if (trackParCov.isUsedInCascading == 4) { histos.fill(HIST("h2dDCAxyCascadePositive"), trackParametrization.getPt(), dcaXY * 1e+4); // in microns, please + histos.fill(HIST("h2dDCAzCascadePositive"), trackParametrization.getPt(), dcaZ * 1e+4); // in microns, please + } } tracksDCA(dcaXY, dcaZ); if (populateTracksDCACov) { From 6ebe6f492d36e02ec7ca1891b077449dc36b5e51 Mon Sep 17 00:00:00 2001 From: Chiara Pinto <48326672+chiarapinto@users.noreply.github.com> Date: Fri, 21 Mar 2025 16:30:58 +0100 Subject: [PATCH 0791/1650] [PWGLF] added control histogram for evt rejection (#10606) --- PWGLF/Tasks/Nuspex/antinucleiInJets.cxx | 26 +++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx index 4a17fcfeaef..7f3e3d74356 100644 --- a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx +++ b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx @@ -173,6 +173,7 @@ struct AntinucleiInJets { // event counter data registryData.add("number_of_events_data", "number of events in data", HistType::kTH1F, {{10, 0, 10, "counter"}}); + registryData.add("number_of_rejected_events", "check on number of events rejected", HistType::kTH1F, {{10, 0, 10, "counter"}}); // antiprotons registryData.add("antiproton_jet_tpc", "antiproton_jet_tpc", HistType::kTH2F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}}); @@ -257,6 +258,7 @@ struct AntinucleiInJets { // systematic uncertainties if (doprocessSystematicsData) { + registryData.add("number_of_rejected_events_syst", "check on number of events rejected", HistType::kTH1F, {{10, 0, 10, "counter"}}); registryData.add("antiproton_tpc_syst", "antiproton_tpc_syst", HistType::kTHnSparseF, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}, {10, 0, 10, "systematic uncertainty"}}); registryData.add("antiproton_tof_syst", "antiproton_tof_syst", HistType::kTHnSparseF, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TOF}"}, {10, 0, 10, "systematic uncertainty"}}); registryData.add("antideuteron_tpc_syst", "antideuteron_tpc_syst", HistType::kTHnSparseF, {{nbins, min * 2, max * 2, "#it{p}_{T} (GeV/#it{c})"}, {400, -20.0, 20.0, "n#sigma_{TPC}"}, {10, 0, 10, "systematic uncertainty"}}); @@ -458,8 +460,16 @@ struct AntinucleiInJets { // Process Data void processData(SelectedCollisions::iterator const& collision, FullNucleiTracks const& tracks) { - if (rejectEvents && shouldRejectEvent()) - return; + if (rejectEvents) { + // event counter: before event rejection + registryData.fill(HIST("number_of_rejected_events"), 0.5); + + if (shouldRejectEvent()) + return; + + // event counter: after event rejection + registryData.fill(HIST("number_of_rejected_events"), 1.5); + } // event counter: before event selection registryData.fill(HIST("number_of_events_data"), 0.5); @@ -1216,8 +1226,16 @@ struct AntinucleiInJets { // Process Systematics void processSystematicsData(SelectedCollisions::iterator const& collision, FullNucleiTracks const& tracks) { - if (rejectEvents && shouldRejectEvent()) - return; + if (rejectEvents) { + // event counter: before event rejection + registryData.fill(HIST("number_of_rejected_events_syst"), 0.5); + + if (shouldRejectEvent()) + return; + + // event counter: after event rejection + registryData.fill(HIST("number_of_rejected_events_syst"), 1.5); + } const int nSystematics = 10; int itsNclustersSyst[nSystematics] = {5, 6, 5, 4, 5, 3, 5, 6, 3, 4}; From dec08db97ae9f3b26939f98f3f5e47818092a887 Mon Sep 17 00:00:00 2001 From: Gianni Shigeru Setoue Liveraro <81832939+gianniliveraro@users.noreply.github.com> Date: Fri, 21 Mar 2025 13:52:45 -0300 Subject: [PATCH 0792/1650] [Common] Add option to prevent fatal error in ctpRateFetcher::fetch() (#10598) --- Common/CCDB/ctpRateFetcher.cxx | 4 ++-- Common/CCDB/ctpRateFetcher.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Common/CCDB/ctpRateFetcher.cxx b/Common/CCDB/ctpRateFetcher.cxx index 49d3c7ecd97..e20fc41616c 100644 --- a/Common/CCDB/ctpRateFetcher.cxx +++ b/Common/CCDB/ctpRateFetcher.cxx @@ -22,7 +22,7 @@ namespace o2 { -double ctpRateFetcher::fetch(o2::ccdb::BasicCCDBManager* ccdb, uint64_t timeStamp, int runNumber, std::string sourceName) +double ctpRateFetcher::fetch(o2::ccdb::BasicCCDBManager* ccdb, uint64_t timeStamp, int runNumber, std::string sourceName, bool fCrashOnNull) { setupRun(runNumber, ccdb, timeStamp); if (sourceName.find("ZNC") != std::string::npos) { @@ -43,7 +43,7 @@ double ctpRateFetcher::fetch(o2::ccdb::BasicCCDBManager* ccdb, uint64_t timeStam if (ret < 0.) { LOG(info) << "Trying different class"; ret = fetchCTPratesClasses(ccdb, timeStamp, runNumber, "CMTVX-NONE"); - if (ret < 0) { + if ((ret < 0) && fCrashOnNull) { LOG(fatal) << "None of the classes used for lumi found"; } } diff --git a/Common/CCDB/ctpRateFetcher.h b/Common/CCDB/ctpRateFetcher.h index 412c1e7a424..6aaf5e3ebaa 100644 --- a/Common/CCDB/ctpRateFetcher.h +++ b/Common/CCDB/ctpRateFetcher.h @@ -34,7 +34,7 @@ class ctpRateFetcher { public: ctpRateFetcher() = default; - double fetch(o2::ccdb::BasicCCDBManager* ccdb, uint64_t timeStamp, int runNumber, std::string sourceName); + double fetch(o2::ccdb::BasicCCDBManager* ccdb, uint64_t timeStamp, int runNumber, std::string sourceName, bool fCrashOnNull = true); void setManualCleanup(bool manualCleanup = true) { mManualCleanup = manualCleanup; } From 2ecb4b3e4337485eee862ad79f04cd911494040d Mon Sep 17 00:00:00 2001 From: JStaa <39123272+JStaa@users.noreply.github.com> Date: Fri, 21 Mar 2025 18:25:22 +0100 Subject: [PATCH 0793/1650] [PWGCF] Changed histogram Doubles to histogram Floats (#10602) --- .../Tasks/threeParticleCorrelations.cxx | 185 +++++++++--------- 1 file changed, 93 insertions(+), 92 deletions(-) diff --git a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx index 302e25943d3..2f128f7d92a 100644 --- a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx +++ b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx @@ -118,95 +118,96 @@ struct ThreeParticleCorrelations { const AxisSpec etaAxis{32, -1.52, 1.52}; const AxisSpec v0PtAxis{114, 0.6, 12}; const AxisSpec trackPtAxis{28, 0.2, 3}; + const AxisSpec trackEtaAxis{32, -0.8, 0.8}; const AxisSpec lambdaInvMassAxis{100, 1.08, 1.16}; // QA & PID - rQARegistry.add("hTrackPt", "hTrackPt", {HistType::kTH1D, {{100, 0, 4}}}); - rQARegistry.add("hTrackEta", "hTrackEta", {HistType::kTH1D, {{100, -1, 1}}}); - rQARegistry.add("hTrackPhi", "hTrackPhi", {HistType::kTH1D, {{100, (-1. / 2) * constants::math::PI, (5. / 2) * constants::math::PI}}}); - rQARegistry.add("hEventCentrality", "hEventCentrality", {HistType::kTH1D, {{centralityAxis}}}); - rQARegistry.add("hEventCentrality_MC", "hEventCentrality_MC", {HistType::kTH1D, {{centralityAxis}}}); - rQARegistry.add("hEventZvtx", "hEventZvtx", {HistType::kTH1D, {{zvtxAxis}}}); - - rQARegistry.add("hdEdx", "hdEdx", {HistType::kTH2D, {{56, 0.2, 3.0}, {180, 20, 200}}}); - rQARegistry.add("hdEdxPion", "hdEdxPion", {HistType::kTH2D, {{56, 0.2, 3.0}, {180, 20, 200}}}); - rQARegistry.add("hdEdxKaon", "hdEdxKaon", {HistType::kTH2D, {{56, 0.2, 3.0}, {180, 20, 200}}}); - rQARegistry.add("hdEdxProton", "hdEdxProton", {HistType::kTH2D, {{56, 0.2, 3.0}, {180, 20, 200}}}); - rQARegistry.add("hBeta", "hBeta", {HistType::kTH2D, {{56, 0.2, 3.0}, {70, 0.4, 1.1}}}); - rQARegistry.add("hBetaPion", "hBetaPion", {HistType::kTH2D, {{56, 0.2, 3.0}, {70, 0.4, 1.1}}}); - rQARegistry.add("hBetaKaon", "hBetaKaon", {HistType::kTH2D, {{56, 0.2, 3.0}, {70, 0.4, 1.1}}}); - rQARegistry.add("hBetaProton", "hBetaProton", {HistType::kTH2D, {{56, 0.2, 3.0}, {70, 0.4, 1.1}}}); - rQARegistry.add("hNSigmaPion", "hNSigmaPion", {HistType::kTH2D, {{201, -5.025, 5.025}, {201, -5.025, 5.025}}}); - rQARegistry.add("hNSigmaKaon", "hNSigmaKaon", {HistType::kTH2D, {{201, -5.025, 5.025}, {201, -5.025, 5.025}}}); - rQARegistry.add("hNSigmaProton", "hNSigmaProton", {HistType::kTH2D, {{201, -5.025, 5.025}, {201, -5.025, 5.025}}}); - - rQARegistry.add("hTPCPion", "hTPCPion", {HistType::kTH2D, {{trackPtAxis}, {241, -6, 6}}}); - rQARegistry.add("hTPCKaon", "hTPCKaon", {HistType::kTH2D, {{trackPtAxis}, {241, -6, 6}}}); - rQARegistry.add("hTPCProton", "hTPCProton", {HistType::kTH2D, {{trackPtAxis}, {241, -6, 6}}}); - rQARegistry.add("hTOFPion", "hTOFPion", {HistType::kTH2D, {{trackPtAxis}, {1000, -50, 50}}}); - rQARegistry.add("hTOFKaon", "hTOFKaon", {HistType::kTH2D, {{trackPtAxis}, {1000, -50, 50}}}); - rQARegistry.add("hTOFProton", "hTOFProton", {HistType::kTH2D, {{trackPtAxis}, {1000, -50, 50}}}); - - rQARegistry.add("hInvMassLambda", "hInvMassLambda", {HistType::kTH3D, {{lambdaInvMassAxis}, {v0PtAxis}, {centralityAxis}}}); - rQARegistry.add("hInvMassAntiLambda", "hInvMassAntiLambda", {HistType::kTH3D, {{lambdaInvMassAxis}, {v0PtAxis}, {centralityAxis}}}); - rQARegistry.add("hNLambdas", "hNLambdas", {HistType::kTH3D, {{2, -2, 2}, {v0PtAxis}, {centralityAxis}}}); + rQARegistry.add("hTrackPt", "hTrackPt", {HistType::kTH1F, {{100, 0, 4}}}); + rQARegistry.add("hTrackEta", "hTrackEta", {HistType::kTH1F, {{100, -1, 1}}}); + rQARegistry.add("hTrackPhi", "hTrackPhi", {HistType::kTH1F, {{100, (-1. / 2) * constants::math::PI, (5. / 2) * constants::math::PI}}}); + rQARegistry.add("hEventCentrality", "hEventCentrality", {HistType::kTH1F, {{centralityAxis}}}); + rQARegistry.add("hEventCentrality_MC", "hEventCentrality_MC", {HistType::kTH1F, {{centralityAxis}}}); + rQARegistry.add("hEventZvtx", "hEventZvtx", {HistType::kTH1F, {{zvtxAxis}}}); + + rQARegistry.add("hdEdx", "hdEdx", {HistType::kTH2F, {{56, 0.2, 3.0}, {180, 20, 200}}}); + rQARegistry.add("hdEdxPion", "hdEdxPion", {HistType::kTH2F, {{56, 0.2, 3.0}, {180, 20, 200}}}); + rQARegistry.add("hdEdxKaon", "hdEdxKaon", {HistType::kTH2F, {{56, 0.2, 3.0}, {180, 20, 200}}}); + rQARegistry.add("hdEdxProton", "hdEdxProton", {HistType::kTH2F, {{56, 0.2, 3.0}, {180, 20, 200}}}); + rQARegistry.add("hBeta", "hBeta", {HistType::kTH2F, {{56, 0.2, 3.0}, {70, 0.4, 1.1}}}); + rQARegistry.add("hBetaPion", "hBetaPion", {HistType::kTH2F, {{56, 0.2, 3.0}, {70, 0.4, 1.1}}}); + rQARegistry.add("hBetaKaon", "hBetaKaon", {HistType::kTH2F, {{56, 0.2, 3.0}, {70, 0.4, 1.1}}}); + rQARegistry.add("hBetaProton", "hBetaProton", {HistType::kTH2F, {{56, 0.2, 3.0}, {70, 0.4, 1.1}}}); + rQARegistry.add("hNSigmaPion", "hNSigmaPion", {HistType::kTH2F, {{201, -5.025, 5.025}, {201, -5.025, 5.025}}}); + rQARegistry.add("hNSigmaKaon", "hNSigmaKaon", {HistType::kTH2F, {{201, -5.025, 5.025}, {201, -5.025, 5.025}}}); + rQARegistry.add("hNSigmaProton", "hNSigmaProton", {HistType::kTH2F, {{201, -5.025, 5.025}, {201, -5.025, 5.025}}}); + + rQARegistry.add("hTPCPion", "hTPCPion", {HistType::kTH2F, {{trackPtAxis}, {241, -6, 6}}}); + rQARegistry.add("hTPCKaon", "hTPCKaon", {HistType::kTH2F, {{trackPtAxis}, {241, -6, 6}}}); + rQARegistry.add("hTPCProton", "hTPCProton", {HistType::kTH2F, {{trackPtAxis}, {241, -6, 6}}}); + rQARegistry.add("hTOFPion", "hTOFPion", {HistType::kTH2F, {{trackPtAxis}, {1000, -50, 50}}}); + rQARegistry.add("hTOFKaon", "hTOFKaon", {HistType::kTH2F, {{trackPtAxis}, {1000, -50, 50}}}); + rQARegistry.add("hTOFProton", "hTOFProton", {HistType::kTH2F, {{trackPtAxis}, {1000, -50, 50}}}); + + rQARegistry.add("hInvMassLambda", "hInvMassLambda", {HistType::kTH3F, {{lambdaInvMassAxis}, {v0PtAxis}, {centralityAxis}}}); + rQARegistry.add("hInvMassAntiLambda", "hInvMassAntiLambda", {HistType::kTH3F, {{lambdaInvMassAxis}, {v0PtAxis}, {centralityAxis}}}); + rQARegistry.add("hNLambdas", "hNLambdas", {HistType::kTH3F, {{2, -2, 2}, {v0PtAxis}, {centralityAxis}}}); // PhiStar - rPhiStarRegistry.add("hSEProtonPreCut", "hSEProtonPreCut", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); - rPhiStarRegistry.add("hSEProtonPostCut", "hSEProtonPostCut", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); - rPhiStarRegistry.add("hMEProtonPreCut", "hMEProtonPreCut", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); - rPhiStarRegistry.add("hMEProtonPostCut", "hMEProtonPostCut", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); + rPhiStarRegistry.add("hSEProtonPreCut", "hSEProtonPreCut", {HistType::kTH2F, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); + rPhiStarRegistry.add("hSEProtonPostCut", "hSEProtonPostCut", {HistType::kTH2F, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); + rPhiStarRegistry.add("hMEProtonPreCut", "hMEProtonPreCut", {HistType::kTH2F, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); + rPhiStarRegistry.add("hMEProtonPostCut", "hMEProtonPostCut", {HistType::kTH2F, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); // Efficiency - rMCRegistry.add("hGenerated", "hGenerated", {HistType::kTH1D, {trackPtAxis}}); - rMCRegistry.add("hGenPionP", "hGenPionP", {HistType::kTH1D, {trackPtAxis}}); - rMCRegistry.add("hGenPionN", "hGenPionN", {HistType::kTH1D, {trackPtAxis}}); - rMCRegistry.add("hGenKaonP", "hGenKaonP", {HistType::kTH1D, {trackPtAxis}}); - rMCRegistry.add("hGenKaonN", "hGenKaonN", {HistType::kTH1D, {trackPtAxis}}); - rMCRegistry.add("hGenProtonP", "hGenProtonP", {HistType::kTH1D, {trackPtAxis}}); - rMCRegistry.add("hGenProtonN", "hGenProtonN", {HistType::kTH1D, {trackPtAxis}}); - rMCRegistry.add("hReconstructed", "hReconstructed", {HistType::kTH1D, {trackPtAxis}}); - rMCRegistry.add("hRecPionP", "hRecPionP", {HistType::kTH1D, {trackPtAxis}}); - rMCRegistry.add("hRecPionN", "hRecPionN", {HistType::kTH1D, {trackPtAxis}}); - rMCRegistry.add("hRecKaonP", "hRecKaonP", {HistType::kTH1D, {trackPtAxis}}); - rMCRegistry.add("hRecKaonN", "hRecKaonN", {HistType::kTH1D, {trackPtAxis}}); - rMCRegistry.add("hRecProtonP", "hRecProtonP", {HistType::kTH1D, {trackPtAxis}}); - rMCRegistry.add("hRecProtonN", "hRecProtonN", {HistType::kTH1D, {trackPtAxis}}); + rMCRegistry.add("hGenerated", "hGenerated", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hGenPionP", "hGenPionP", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hGenPionN", "hGenPionN", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hGenKaonP", "hGenKaonP", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hGenKaonN", "hGenKaonN", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hGenProtonP", "hGenProtonP", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hGenProtonN", "hGenProtonN", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hReconstructed", "hReconstructed", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hRecPionP", "hRecPionP", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hRecPionN", "hRecPionN", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hRecKaonP", "hRecKaonP", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hRecKaonN", "hRecKaonN", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hRecProtonP", "hRecProtonP", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hRecProtonN", "hRecProtonN", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); // Purity - rMCRegistry.add("hSelectPionP", "hSelectPionP", {HistType::kTH1D, {trackPtAxis}}); - rMCRegistry.add("hSelectPionN", "hSelectPionN", {HistType::kTH1D, {trackPtAxis}}); - rMCRegistry.add("hSelectKaonP", "hSelectKaonP", {HistType::kTH1D, {trackPtAxis}}); - rMCRegistry.add("hSelectKaonN", "hSelectKaonN", {HistType::kTH1D, {trackPtAxis}}); - rMCRegistry.add("hSelectProtonP", "hSelectProtonP", {HistType::kTH1D, {trackPtAxis}}); - rMCRegistry.add("hSelectProtonN", "hSelectProtonN", {HistType::kTH1D, {trackPtAxis}}); - rMCRegistry.add("hTrueSelectPionP", "hTrueSelectPionP", {HistType::kTH1D, {trackPtAxis}}); - rMCRegistry.add("hTrueSelectPionN", "hTrueSelectPionN", {HistType::kTH1D, {trackPtAxis}}); - rMCRegistry.add("hTrueSelectKaonP", "hTrueSelectKaonP", {HistType::kTH1D, {trackPtAxis}}); - rMCRegistry.add("hTrueSelectKaonN", "hTrueSelectKaonN", {HistType::kTH1D, {trackPtAxis}}); - rMCRegistry.add("hTrueSelectProtonP", "hTrueSelectProtonP", {HistType::kTH1D, {trackPtAxis}}); - rMCRegistry.add("hTrueSelectProtonN", "hTrueSelectProtonN", {HistType::kTH1D, {trackPtAxis}}); + rMCRegistry.add("hSelectPionP", "hSelectPionP", {HistType::kTH1F, {trackPtAxis}}); + rMCRegistry.add("hSelectPionN", "hSelectPionN", {HistType::kTH1F, {trackPtAxis}}); + rMCRegistry.add("hSelectKaonP", "hSelectKaonP", {HistType::kTH1F, {trackPtAxis}}); + rMCRegistry.add("hSelectKaonN", "hSelectKaonN", {HistType::kTH1F, {trackPtAxis}}); + rMCRegistry.add("hSelectProtonP", "hSelectProtonP", {HistType::kTH1F, {trackPtAxis}}); + rMCRegistry.add("hSelectProtonN", "hSelectProtonN", {HistType::kTH1F, {trackPtAxis}}); + rMCRegistry.add("hTrueSelectPionP", "hTrueSelectPionP", {HistType::kTH1F, {trackPtAxis}}); + rMCRegistry.add("hTrueSelectPionN", "hTrueSelectPionN", {HistType::kTH1F, {trackPtAxis}}); + rMCRegistry.add("hTrueSelectKaonP", "hTrueSelectKaonP", {HistType::kTH1F, {trackPtAxis}}); + rMCRegistry.add("hTrueSelectKaonN", "hTrueSelectKaonN", {HistType::kTH1F, {trackPtAxis}}); + rMCRegistry.add("hTrueSelectProtonP", "hTrueSelectProtonP", {HistType::kTH1F, {trackPtAxis}}); + rMCRegistry.add("hTrueSelectProtonN", "hTrueSelectProtonN", {HistType::kTH1F, {trackPtAxis}}); // Correlations - rSECorrRegistry.add("hSameLambdaPion_SGNL", "Same-event #Lambda - #pi correlator (SGNL region)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rSECorrRegistry.add("hSameLambdaPion_SB", "Same-event #Lambda - #pi correlator (SB region)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rSECorrRegistry.add("hSameLambdaKaon_SGNL", "Same-event #Lambda - K correlator (SGNL region)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rSECorrRegistry.add("hSameLambdaKaon_SB", "Same-event #Lambda - K correlator (SB region)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rSECorrRegistry.add("hSameLambdaProton_SGNL", "Same-event #Lambda - p correlator (SGNL region)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rSECorrRegistry.add("hSameLambdaProton_SB", "Same-event #Lambda - p correlator (SB region)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rSECorrRegistry.add("hSameLambdaPion_MC", "Same-event #Lambda - #pi correlator (MC)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rSECorrRegistry.add("hSameLambdaKaon_MC", "Same-event #Lambda - K correlator (MC)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rSECorrRegistry.add("hSameLambdaProton_MC", "Same-event #Lambda - p correlator (MC)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - - rMECorrRegistry.add("hMixLambdaPion_SGNL", "Mixed-event #Lambda - #pi correlator (SGNL region)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rMECorrRegistry.add("hMixLambdaPion_SB", "Mixed-event #Lambda - #pi correlator (SB region)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rMECorrRegistry.add("hMixLambdaKaon_SGNL", "Mixed-event #Lambda - K correlator (SGNL region)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rMECorrRegistry.add("hMixLambdaKaon_SB", "Mixed-event #Lambda - K correlator (SB region)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rMECorrRegistry.add("hMixLambdaProton_SGNL", "Mixed-event #Lambda - p correlator (SGNL region)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rMECorrRegistry.add("hMixLambdaProton_SB", "Mixed-event #Lambda - p correlator (SB region)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rMECorrRegistry.add("hMixLambdaPion_MC", "Mixed-event #Lambda - #pi correlator (MC)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rMECorrRegistry.add("hMixLambdaKaon_MC", "Mixed-event #Lambda - K correlator (MC)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rMECorrRegistry.add("hMixLambdaProton_MC", "Mixed-event #Lambda - p correlator (MC)", {HistType::kTHnSparseD, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaPion_SGNL", "Same-event #Lambda - #pi correlator (SGNL region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaPion_SB", "Same-event #Lambda - #pi correlator (SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaKaon_SGNL", "Same-event #Lambda - K correlator (SGNL region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaKaon_SB", "Same-event #Lambda - K correlator (SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaProton_SGNL", "Same-event #Lambda - p correlator (SGNL region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaProton_SB", "Same-event #Lambda - p correlator (SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaPion_MC", "Same-event #Lambda - #pi correlator (MC)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaKaon_MC", "Same-event #Lambda - K correlator (MC)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaProton_MC", "Same-event #Lambda - p correlator (MC)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + + rMECorrRegistry.add("hMixLambdaPion_SGNL", "Mixed-event #Lambda - #pi correlator (SGNL region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaPion_SB", "Mixed-event #Lambda - #pi correlator (SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaKaon_SGNL", "Mixed-event #Lambda - K correlator (SGNL region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaKaon_SB", "Mixed-event #Lambda - K correlator (SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaProton_SGNL", "Mixed-event #Lambda - p correlator (SGNL region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaProton_SB", "Mixed-event #Lambda - p correlator (SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaPion_MC", "Mixed-event #Lambda - #pi correlator (MC)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaKaon_MC", "Mixed-event #Lambda - K correlator (MC)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaProton_MC", "Mixed-event #Lambda - p correlator (MC)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); ccdb->setURL("http://alice-ccdb.cern.ch"); ccdb->setCaching(true); @@ -464,19 +465,19 @@ struct ThreeParticleCorrelations { if (particle.isPhysicalPrimary()) { // Efficiency - Generated - rMCRegistry.fill(HIST("hGenerated"), particle.pt()); + rMCRegistry.fill(HIST("hGenerated"), particle.pt(), particle.eta()); if (particle.pdgCode() == kPiPlus) { // Pos pions - rMCRegistry.fill(HIST("hGenPionP"), particle.pt()); + rMCRegistry.fill(HIST("hGenPionP"), particle.pt(), particle.eta()); } else if (particle.pdgCode() == kPiMinus) { // Neg pions - rMCRegistry.fill(HIST("hGenPionN"), particle.pt()); + rMCRegistry.fill(HIST("hGenPionN"), particle.pt(), particle.eta()); } else if (particle.pdgCode() == kKPlus) { // Pos kaons - rMCRegistry.fill(HIST("hGenKaonP"), particle.pt()); + rMCRegistry.fill(HIST("hGenKaonP"), particle.pt(), particle.eta()); } else if (particle.pdgCode() == kKMinus) { // Neg kaons - rMCRegistry.fill(HIST("hGenKaonN"), particle.pt()); + rMCRegistry.fill(HIST("hGenKaonN"), particle.pt(), particle.eta()); } else if (particle.pdgCode() == kProton) { // Pos protons - rMCRegistry.fill(HIST("hGenProtonP"), particle.pt()); + rMCRegistry.fill(HIST("hGenProtonP"), particle.pt(), particle.eta()); } else if (particle.pdgCode() == kProtonBar) { // Neg protons - rMCRegistry.fill(HIST("hGenProtonN"), particle.pt()); + rMCRegistry.fill(HIST("hGenProtonN"), particle.pt(), particle.eta()); } } } @@ -501,19 +502,19 @@ struct ThreeParticleCorrelations { if (particle.isPhysicalPrimary()) { // Efficiency - Reconstructed - rMCRegistry.fill(HIST("hReconstructed"), track.pt()); + rMCRegistry.fill(HIST("hReconstructed"), track.pt(), track.eta()); if (particle.pdgCode() == kPiPlus) { // Pos pions - rMCRegistry.fill(HIST("hRecPionP"), track.pt()); + rMCRegistry.fill(HIST("hRecPionP"), track.pt(), track.eta()); } else if (particle.pdgCode() == kPiMinus) { // Neg pions - rMCRegistry.fill(HIST("hRecPionN"), track.pt()); + rMCRegistry.fill(HIST("hRecPionN"), track.pt(), track.eta()); } else if (particle.pdgCode() == kKPlus) { // Pos kaons - rMCRegistry.fill(HIST("hRecKaonP"), track.pt()); + rMCRegistry.fill(HIST("hRecKaonP"), track.pt(), track.eta()); } else if (particle.pdgCode() == kKMinus) { // Neg kaons - rMCRegistry.fill(HIST("hRecKaonN"), track.pt()); + rMCRegistry.fill(HIST("hRecKaonN"), track.pt(), track.eta()); } else if (particle.pdgCode() == kProton) { // Pos protons - rMCRegistry.fill(HIST("hRecProtonP"), track.pt()); + rMCRegistry.fill(HIST("hRecProtonP"), track.pt(), track.eta()); } else if (particle.pdgCode() == kProtonBar) { // Neg protons - rMCRegistry.fill(HIST("hRecProtonN"), track.pt()); + rMCRegistry.fill(HIST("hRecProtonN"), track.pt(), track.eta()); } // Purity (PID) From 35f9806ebd965d5c7fff21c562cae131afae59ae Mon Sep 17 00:00:00 2001 From: Noor Koster <82090643+cnkoster@users.noreply.github.com> Date: Fri, 21 Mar 2025 18:26:52 +0100 Subject: [PATCH 0794/1650] [PWGCF] fixed memory leak in getcorrection (#10601) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/TableProducer/zdcQVectors.cxx | 84 +++++++++++------------- 1 file changed, 37 insertions(+), 47 deletions(-) diff --git a/PWGCF/Flow/TableProducer/zdcQVectors.cxx b/PWGCF/Flow/TableProducer/zdcQVectors.cxx index ca5389167ce..13c2064e28f 100644 --- a/PWGCF/Flow/TableProducer/zdcQVectors.cxx +++ b/PWGCF/Flow/TableProducer/zdcQVectors.cxx @@ -70,12 +70,8 @@ using BCsRun3 = soa::Join Energy calib -std::shared_ptr energyZN[10] = {{nullptr}}; - // Define histogrm names here to use same names for creating and later uploading and retrieving data from ccdb // Energy calibration: std::vector namesEcal(10, ""); @@ -88,8 +84,7 @@ std::vector pyZDC = {-1.75, -1.75, 1.75, 1.75}; double alphaZDC = 0.395; // q-vectors before (q) and after (qRec) recentering. -std::vector q(4); // start values of [QxA, QyA, QxC, QyC] -std::vector qRec(4); // Recentered values of [QxA, QyA, QxC, QyC] +std::vector q(4); // start values of [QxA, QyA, QxC, QyC] // for energy calibration std::vector eZN(8); // uncalibrated energy for the 2x4 towers (a1, a2, a3, a4, c1, c2, c3, c4) @@ -178,7 +173,7 @@ struct ZdcQVectors { // Tower mean energies vs. centrality used for tower gain equalisation for (int tower = 0; tower < 10; tower++) { namesEcal[tower] = TString::Format("hZN%s_mean_t%i_cent", sides[(tower < 5) ? 0 : 1], tower % 5); - energyZN[tower] = registry.add(Form("Energy/%s", namesEcal[tower].Data()), Form("%s", namesEcal[tower].Data()), kTProfile2D, {{1, 0, 1}, axisCent}); + registry.add(Form("Energy/%s", namesEcal[tower].Data()), Form("%s", namesEcal[tower].Data()), kTProfile2D, {{1, 0, 1}, axisCent}); } registry.add(Form("before/QA/hSPplaneA"), "hSPplaneA", kTH2D, {{100, -4, 4}, axisCent10}); @@ -293,8 +288,8 @@ struct ZdcQVectors { } } // Try to cast to TProfile - if (TProfile* profile2D = dynamic_cast(obj)) { - if (profile2D->GetEntries() < 1) { + if (TProfile* profile = dynamic_cast(obj)) { + if (profile->GetEntries() < 1) { if (counter < 1) LOGF(info, "%s (TProfile) is empty! Produce calibration file at given step", names[i].Data()); cal.calibfilesLoaded[iteration][step] = false; @@ -385,14 +380,19 @@ struct ZdcQVectors { for (std::size_t i = 0; i < sparsePars.size(); i++) { h->GetAxis(i)->SetRange(sparsePars[i], sparsePars[i]); } - calibConstant = h->Projection(4)->GetMean(); - if (h->Projection(4)->GetEntries() < cfgMinEntriesSparseBin) { + TH1D* tempProj = h->Projection(4); + calibConstant = tempProj->GetMean(); + + if (tempProj->GetEntries() < cfgMinEntriesSparseBin) { LOGF(debug, "1 entry in sparse bin! Not used... (increase binsize)"); calibConstant = 0; isSelected = false; } + + delete tempProj; } + return calibConstant; } @@ -422,6 +422,7 @@ struct ZdcQVectors { if (cent < 0 || cent > 90) { isSelected = false; spTableZDC(runnumber, cent, v[0], v[1], v[2], 0, 0, 0, 0, isSelected, 0, 0); + counter++; return; } @@ -432,6 +433,7 @@ struct ZdcQVectors { if (!foundBC.has_zdc()) { isSelected = false; spTableZDC(runnumber, cent, v[0], v[1], v[2], 0, 0, 0, 0, isSelected, 0, 0); + counter++; return; } @@ -443,7 +445,11 @@ struct ZdcQVectors { // load new calibrations for new runs only if (runnumber != lastRunNumber) { - cal.calibfilesLoaded = std::vector>(7, std::vector(8, false)); + cal.calibfilesLoaded.clear(); + cal.calibfilesLoaded.resize(7, std::vector(8, false)); + + cal.calibList.clear(); + cal.calibList.resize(7, std::vector(8, nullptr)); lastRunNumber = runnumber; } @@ -473,9 +479,6 @@ struct ZdcQVectors { registry.get(HIST("vmean/hvertex_vz"))->Fill(Form("%d", runnumber), v[2]); } - if (counter < 1) - LOGF(info, "=====================> .....Start Energy Calibration..... <====================="); - bool isZNAhit = true; bool isZNChit = true; @@ -492,20 +495,19 @@ struct ZdcQVectors { isZNChit = false; // Fill to get mean energy per tower in 1% centrality bins - for (int tower = 0; tower < 5; tower++) { - if (tower == 0) { - if (isZNAhit) - energyZN[tower]->Fill(Form("%d", runnumber), cent, zdcCol.energyCommonZNA(), 1); - if (isZNChit) - energyZN[tower + 5]->Fill(Form("%d", runnumber), cent, zdcCol.energyCommonZNC(), 1); - LOGF(debug, "Common A tower filled with: %i, %.2f, %.2f", runnumber, cent, zdcCol.energyCommonZNA()); - } else { - if (isZNAhit) - energyZN[tower]->Fill(Form("%d", runnumber), cent, eZN[tower - 1], 1); - if (isZNChit) - energyZN[tower + 5]->Fill(Form("%d", runnumber), cent, eZN[tower - 1 + 4], 1); - LOGF(debug, "Tower ZNC[%i] filled with: %i, %.2f, %.2f", tower, runnumber, cent, eZN[tower - 1 + 4]); - } + if (isZNAhit) { + registry.get(HIST("Energy/hZNA_mean_t0_cent"))->Fill(Form("%d", runnumber), cent, zdcCol.energyCommonZNA(), 1); + registry.get(HIST("Energy/hZNA_mean_t1_cent"))->Fill(Form("%d", runnumber), cent, eZN[0], 1); + registry.get(HIST("Energy/hZNA_mean_t2_cent"))->Fill(Form("%d", runnumber), cent, eZN[1], 1); + registry.get(HIST("Energy/hZNA_mean_t3_cent"))->Fill(Form("%d", runnumber), cent, eZN[2], 1); + registry.get(HIST("Energy/hZNA_mean_t4_cent"))->Fill(Form("%d", runnumber), cent, eZN[3], 1); + } + if (isZNChit) { + registry.get(HIST("Energy/hZNC_mean_t0_cent"))->Fill(Form("%d", runnumber), cent, zdcCol.energyCommonZNC(), 1); + registry.get(HIST("Energy/hZNC_mean_t1_cent"))->Fill(Form("%d", runnumber), cent, eZN[4], 1); + registry.get(HIST("Energy/hZNC_mean_t2_cent"))->Fill(Form("%d", runnumber), cent, eZN[5], 1); + registry.get(HIST("Energy/hZNC_mean_t3_cent"))->Fill(Form("%d", runnumber), cent, eZN[6], 1); + registry.get(HIST("Energy/hZNC_mean_t4_cent"))->Fill(Form("%d", runnumber), cent, eZN[7], 1); } // if ZNA or ZNC not hit correctly.. do not use event in q-vector calculation @@ -523,13 +525,6 @@ struct ZdcQVectors { return; } - if (counter < 1) - LOGF(info, "files for step 0 (energy Calibraton) are open!"); - - if (counter < 1) { - LOGF(info, "=====================> .....Start Calculating Q-Vectors..... <====================="); - } - // Now start gain equalisation! // Fill the list with calibration constants. for (int tower = 0; tower < 10; tower++) { @@ -575,8 +570,6 @@ struct ZdcQVectors { } if (cal.calibfilesLoaded[0][1]) { - if (counter < 1) - LOGF(info, "=====================> Setting v to vmean!"); v[0] = v[0] - getCorrection(0, 1, vnames[0].Data()); v[1] = v[1] - getCorrection(0, 1, vnames[1].Data()); } @@ -599,21 +592,17 @@ struct ZdcQVectors { } } - if (counter < 1) - LOGF(info, "We evaluate cal.atIteration=%i and cal.atStep=%i ", cal.atIteration, cal.atStep); + std::vector qRec(q); if (cal.atIteration == 0) { - if (counter < 1) - LOGF(warning, "Calibation files missing!!! Output created with q-vectors right after energy gain eq. !!"); if (isSelected) fillCommonRegistry(q[0], q[1], q[2], q[3], v, centrality); + spTableZDC(runnumber, centrality, v[0], v[1], v[2], q[0], q[1], q[2], q[3], isSelected, 0, 0); counter++; return; } else if (cal.atIteration == 5 && cal.atStep == 4) { - std::vector qRec(4); fillCommonRegistry(q[0], q[1], q[2], q[3], v, centrality); - qRec = q; // vector of 4 std::vector corrQxA; @@ -628,7 +617,6 @@ struct ZdcQVectors { corrQyA.push_back(getCorrection(it, 0, names[0][1].Data())); corrQxC.push_back(getCorrection(it, 0, names[0][2].Data())); corrQyC.push_back(getCorrection(it, 0, names[0][3].Data())); - pb++; for (int step = 1; step < 5; step++) { @@ -647,13 +635,15 @@ struct ZdcQVectors { qRec[3] -= corrQyC[cor]; } - if (counter < 1) - LOGF(info, "Output created with q-vectors at iteration %i and step %i!!!!", cal.atIteration, cal.atStep + 1); if (isSelected) { fillCommonRegistry(qRec[0], qRec[1], qRec[2], qRec[3], v, centrality); registry.fill(HIST("QA/centrality_after"), centrality); } + spTableZDC(runnumber, centrality, v[0], v[1], v[2], qRec[0], qRec[1], qRec[2], qRec[3], isSelected, cal.atIteration, cal.atStep); + + qRec.clear(); + counter++; return; } else { From 541124f084614af901ed3d020fa6383fdbe580c5 Mon Sep 17 00:00:00 2001 From: JStaa <39123272+JStaa@users.noreply.github.com> Date: Fri, 21 Mar 2025 19:41:32 +0100 Subject: [PATCH 0795/1650] [PWGCF] Changed several histograms back to Doubles (#10608) --- .../Tasks/threeParticleCorrelations.cxx | 118 +++++++++--------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx index 2f128f7d92a..96a3ed2ffc3 100644 --- a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx +++ b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx @@ -122,71 +122,71 @@ struct ThreeParticleCorrelations { const AxisSpec lambdaInvMassAxis{100, 1.08, 1.16}; // QA & PID - rQARegistry.add("hTrackPt", "hTrackPt", {HistType::kTH1F, {{100, 0, 4}}}); - rQARegistry.add("hTrackEta", "hTrackEta", {HistType::kTH1F, {{100, -1, 1}}}); - rQARegistry.add("hTrackPhi", "hTrackPhi", {HistType::kTH1F, {{100, (-1. / 2) * constants::math::PI, (5. / 2) * constants::math::PI}}}); - rQARegistry.add("hEventCentrality", "hEventCentrality", {HistType::kTH1F, {{centralityAxis}}}); - rQARegistry.add("hEventCentrality_MC", "hEventCentrality_MC", {HistType::kTH1F, {{centralityAxis}}}); - rQARegistry.add("hEventZvtx", "hEventZvtx", {HistType::kTH1F, {{zvtxAxis}}}); - - rQARegistry.add("hdEdx", "hdEdx", {HistType::kTH2F, {{56, 0.2, 3.0}, {180, 20, 200}}}); - rQARegistry.add("hdEdxPion", "hdEdxPion", {HistType::kTH2F, {{56, 0.2, 3.0}, {180, 20, 200}}}); - rQARegistry.add("hdEdxKaon", "hdEdxKaon", {HistType::kTH2F, {{56, 0.2, 3.0}, {180, 20, 200}}}); - rQARegistry.add("hdEdxProton", "hdEdxProton", {HistType::kTH2F, {{56, 0.2, 3.0}, {180, 20, 200}}}); - rQARegistry.add("hBeta", "hBeta", {HistType::kTH2F, {{56, 0.2, 3.0}, {70, 0.4, 1.1}}}); - rQARegistry.add("hBetaPion", "hBetaPion", {HistType::kTH2F, {{56, 0.2, 3.0}, {70, 0.4, 1.1}}}); - rQARegistry.add("hBetaKaon", "hBetaKaon", {HistType::kTH2F, {{56, 0.2, 3.0}, {70, 0.4, 1.1}}}); - rQARegistry.add("hBetaProton", "hBetaProton", {HistType::kTH2F, {{56, 0.2, 3.0}, {70, 0.4, 1.1}}}); - rQARegistry.add("hNSigmaPion", "hNSigmaPion", {HistType::kTH2F, {{201, -5.025, 5.025}, {201, -5.025, 5.025}}}); - rQARegistry.add("hNSigmaKaon", "hNSigmaKaon", {HistType::kTH2F, {{201, -5.025, 5.025}, {201, -5.025, 5.025}}}); - rQARegistry.add("hNSigmaProton", "hNSigmaProton", {HistType::kTH2F, {{201, -5.025, 5.025}, {201, -5.025, 5.025}}}); - - rQARegistry.add("hTPCPion", "hTPCPion", {HistType::kTH2F, {{trackPtAxis}, {241, -6, 6}}}); - rQARegistry.add("hTPCKaon", "hTPCKaon", {HistType::kTH2F, {{trackPtAxis}, {241, -6, 6}}}); - rQARegistry.add("hTPCProton", "hTPCProton", {HistType::kTH2F, {{trackPtAxis}, {241, -6, 6}}}); - rQARegistry.add("hTOFPion", "hTOFPion", {HistType::kTH2F, {{trackPtAxis}, {1000, -50, 50}}}); - rQARegistry.add("hTOFKaon", "hTOFKaon", {HistType::kTH2F, {{trackPtAxis}, {1000, -50, 50}}}); - rQARegistry.add("hTOFProton", "hTOFProton", {HistType::kTH2F, {{trackPtAxis}, {1000, -50, 50}}}); - - rQARegistry.add("hInvMassLambda", "hInvMassLambda", {HistType::kTH3F, {{lambdaInvMassAxis}, {v0PtAxis}, {centralityAxis}}}); - rQARegistry.add("hInvMassAntiLambda", "hInvMassAntiLambda", {HistType::kTH3F, {{lambdaInvMassAxis}, {v0PtAxis}, {centralityAxis}}}); - rQARegistry.add("hNLambdas", "hNLambdas", {HistType::kTH3F, {{2, -2, 2}, {v0PtAxis}, {centralityAxis}}}); + rQARegistry.add("hTrackPt", "hTrackPt", {HistType::kTH1D, {{100, 0, 4}}}); + rQARegistry.add("hTrackEta", "hTrackEta", {HistType::kTH1D, {{100, -1, 1}}}); + rQARegistry.add("hTrackPhi", "hTrackPhi", {HistType::kTH1D, {{100, (-1. / 2) * constants::math::PI, (5. / 2) * constants::math::PI}}}); + rQARegistry.add("hEventCentrality", "hEventCentrality", {HistType::kTH1D, {{centralityAxis}}}); + rQARegistry.add("hEventCentrality_MC", "hEventCentrality_MC", {HistType::kTH1D, {{centralityAxis}}}); + rQARegistry.add("hEventZvtx", "hEventZvtx", {HistType::kTH1D, {{zvtxAxis}}}); + + rQARegistry.add("hdEdx", "hdEdx", {HistType::kTH2D, {{56, 0.2, 3.0}, {180, 20, 200}}}); + rQARegistry.add("hdEdxPion", "hdEdxPion", {HistType::kTH2D, {{56, 0.2, 3.0}, {180, 20, 200}}}); + rQARegistry.add("hdEdxKaon", "hdEdxKaon", {HistType::kTH2D, {{56, 0.2, 3.0}, {180, 20, 200}}}); + rQARegistry.add("hdEdxProton", "hdEdxProton", {HistType::kTH2D, {{56, 0.2, 3.0}, {180, 20, 200}}}); + rQARegistry.add("hBeta", "hBeta", {HistType::kTH2D, {{56, 0.2, 3.0}, {70, 0.4, 1.1}}}); + rQARegistry.add("hBetaPion", "hBetaPion", {HistType::kTH2D, {{56, 0.2, 3.0}, {70, 0.4, 1.1}}}); + rQARegistry.add("hBetaKaon", "hBetaKaon", {HistType::kTH2D, {{56, 0.2, 3.0}, {70, 0.4, 1.1}}}); + rQARegistry.add("hBetaProton", "hBetaProton", {HistType::kTH2D, {{56, 0.2, 3.0}, {70, 0.4, 1.1}}}); + rQARegistry.add("hNSigmaPion", "hNSigmaPion", {HistType::kTH2D, {{201, -5.025, 5.025}, {201, -5.025, 5.025}}}); + rQARegistry.add("hNSigmaKaon", "hNSigmaKaon", {HistType::kTH2D, {{201, -5.025, 5.025}, {201, -5.025, 5.025}}}); + rQARegistry.add("hNSigmaProton", "hNSigmaProton", {HistType::kTH2D, {{201, -5.025, 5.025}, {201, -5.025, 5.025}}}); + + rQARegistry.add("hTPCPion", "hTPCPion", {HistType::kTH2D, {{trackPtAxis}, {241, -6, 6}}}); + rQARegistry.add("hTPCKaon", "hTPCKaon", {HistType::kTH2D, {{trackPtAxis}, {241, -6, 6}}}); + rQARegistry.add("hTPCProton", "hTPCProton", {HistType::kTH2D, {{trackPtAxis}, {241, -6, 6}}}); + rQARegistry.add("hTOFPion", "hTOFPion", {HistType::kTH2D, {{trackPtAxis}, {1000, -50, 50}}}); + rQARegistry.add("hTOFKaon", "hTOFKaon", {HistType::kTH2D, {{trackPtAxis}, {1000, -50, 50}}}); + rQARegistry.add("hTOFProton", "hTOFProton", {HistType::kTH2D, {{trackPtAxis}, {1000, -50, 50}}}); + + rQARegistry.add("hInvMassLambda", "hInvMassLambda", {HistType::kTH3D, {{lambdaInvMassAxis}, {v0PtAxis}, {centralityAxis}}}); + rQARegistry.add("hInvMassAntiLambda", "hInvMassAntiLambda", {HistType::kTH3D, {{lambdaInvMassAxis}, {v0PtAxis}, {centralityAxis}}}); + rQARegistry.add("hNLambdas", "hNLambdas", {HistType::kTH3D, {{2, -2, 2}, {v0PtAxis}, {centralityAxis}}}); // PhiStar - rPhiStarRegistry.add("hSEProtonPreCut", "hSEProtonPreCut", {HistType::kTH2F, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); - rPhiStarRegistry.add("hSEProtonPostCut", "hSEProtonPostCut", {HistType::kTH2F, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); - rPhiStarRegistry.add("hMEProtonPreCut", "hMEProtonPreCut", {HistType::kTH2F, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); - rPhiStarRegistry.add("hMEProtonPostCut", "hMEProtonPostCut", {HistType::kTH2F, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); + rPhiStarRegistry.add("hSEProtonPreCut", "hSEProtonPreCut", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); + rPhiStarRegistry.add("hSEProtonPostCut", "hSEProtonPostCut", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); + rPhiStarRegistry.add("hMEProtonPreCut", "hMEProtonPreCut", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); + rPhiStarRegistry.add("hMEProtonPostCut", "hMEProtonPostCut", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); // Efficiency - rMCRegistry.add("hGenerated", "hGenerated", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); - rMCRegistry.add("hGenPionP", "hGenPionP", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); - rMCRegistry.add("hGenPionN", "hGenPionN", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); - rMCRegistry.add("hGenKaonP", "hGenKaonP", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); - rMCRegistry.add("hGenKaonN", "hGenKaonN", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); - rMCRegistry.add("hGenProtonP", "hGenProtonP", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); - rMCRegistry.add("hGenProtonN", "hGenProtonN", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); - rMCRegistry.add("hReconstructed", "hReconstructed", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); - rMCRegistry.add("hRecPionP", "hRecPionP", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); - rMCRegistry.add("hRecPionN", "hRecPionN", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); - rMCRegistry.add("hRecKaonP", "hRecKaonP", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); - rMCRegistry.add("hRecKaonN", "hRecKaonN", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); - rMCRegistry.add("hRecProtonP", "hRecProtonP", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); - rMCRegistry.add("hRecProtonN", "hRecProtonN", {HistType::kTH2F, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hGenerated", "hGenerated", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hGenPionP", "hGenPionP", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hGenPionN", "hGenPionN", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hGenKaonP", "hGenKaonP", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hGenKaonN", "hGenKaonN", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hGenProtonP", "hGenProtonP", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hGenProtonN", "hGenProtonN", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hReconstructed", "hReconstructed", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hRecPionP", "hRecPionP", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hRecPionN", "hRecPionN", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hRecKaonP", "hRecKaonP", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hRecKaonN", "hRecKaonN", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hRecProtonP", "hRecProtonP", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hRecProtonN", "hRecProtonN", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); // Purity - rMCRegistry.add("hSelectPionP", "hSelectPionP", {HistType::kTH1F, {trackPtAxis}}); - rMCRegistry.add("hSelectPionN", "hSelectPionN", {HistType::kTH1F, {trackPtAxis}}); - rMCRegistry.add("hSelectKaonP", "hSelectKaonP", {HistType::kTH1F, {trackPtAxis}}); - rMCRegistry.add("hSelectKaonN", "hSelectKaonN", {HistType::kTH1F, {trackPtAxis}}); - rMCRegistry.add("hSelectProtonP", "hSelectProtonP", {HistType::kTH1F, {trackPtAxis}}); - rMCRegistry.add("hSelectProtonN", "hSelectProtonN", {HistType::kTH1F, {trackPtAxis}}); - rMCRegistry.add("hTrueSelectPionP", "hTrueSelectPionP", {HistType::kTH1F, {trackPtAxis}}); - rMCRegistry.add("hTrueSelectPionN", "hTrueSelectPionN", {HistType::kTH1F, {trackPtAxis}}); - rMCRegistry.add("hTrueSelectKaonP", "hTrueSelectKaonP", {HistType::kTH1F, {trackPtAxis}}); - rMCRegistry.add("hTrueSelectKaonN", "hTrueSelectKaonN", {HistType::kTH1F, {trackPtAxis}}); - rMCRegistry.add("hTrueSelectProtonP", "hTrueSelectProtonP", {HistType::kTH1F, {trackPtAxis}}); - rMCRegistry.add("hTrueSelectProtonN", "hTrueSelectProtonN", {HistType::kTH1F, {trackPtAxis}}); + rMCRegistry.add("hSelectPionP", "hSelectPionP", {HistType::kTH1D, {trackPtAxis}}); + rMCRegistry.add("hSelectPionN", "hSelectPionN", {HistType::kTH1D, {trackPtAxis}}); + rMCRegistry.add("hSelectKaonP", "hSelectKaonP", {HistType::kTH1D, {trackPtAxis}}); + rMCRegistry.add("hSelectKaonN", "hSelectKaonN", {HistType::kTH1D, {trackPtAxis}}); + rMCRegistry.add("hSelectProtonP", "hSelectProtonP", {HistType::kTH1D, {trackPtAxis}}); + rMCRegistry.add("hSelectProtonN", "hSelectProtonN", {HistType::kTH1D, {trackPtAxis}}); + rMCRegistry.add("hTrueSelectPionP", "hTrueSelectPionP", {HistType::kTH1D, {trackPtAxis}}); + rMCRegistry.add("hTrueSelectPionN", "hTrueSelectPionN", {HistType::kTH1D, {trackPtAxis}}); + rMCRegistry.add("hTrueSelectKaonP", "hTrueSelectKaonP", {HistType::kTH1D, {trackPtAxis}}); + rMCRegistry.add("hTrueSelectKaonN", "hTrueSelectKaonN", {HistType::kTH1D, {trackPtAxis}}); + rMCRegistry.add("hTrueSelectProtonP", "hTrueSelectProtonP", {HistType::kTH1D, {trackPtAxis}}); + rMCRegistry.add("hTrueSelectProtonN", "hTrueSelectProtonN", {HistType::kTH1D, {trackPtAxis}}); // Correlations rSECorrRegistry.add("hSameLambdaPion_SGNL", "Same-event #Lambda - #pi correlator (SGNL region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); From 508f7ee31e1247c1c4f2a8b0f66f352f6c0f1f2b Mon Sep 17 00:00:00 2001 From: Anantha Padmanabhan M Nair <82643666+ananthapadmanabhan18@users.noreply.github.com> Date: Sat, 22 Mar 2025 03:11:52 +0530 Subject: [PATCH 0796/1650] [PWGUD] Changed the std vectors in the AOD tables to individual branches. (#10611) --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 1270 +++++++++++------------------ 1 file changed, 465 insertions(+), 805 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index 783c80c14eb..57509889089 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -46,48 +46,111 @@ namespace o2::aod namespace branch { +// vertex Position DECLARE_SOA_COLUMN(PosX, posX, double); DECLARE_SOA_COLUMN(PosY, posY, double); DECLARE_SOA_COLUMN(PosZ, posZ, double); +// FIT signals DECLARE_SOA_COLUMN(Fv0signal, fv0signal, double); DECLARE_SOA_COLUMN(Ft0asignal, ft0asignal, double); DECLARE_SOA_COLUMN(Ft0csignal, ft0csignal, double); DECLARE_SOA_COLUMN(Fddasignal, fddasignal, double); DECLARE_SOA_COLUMN(Fddcsignal, fddcsignal, double); +// FIT times DECLARE_SOA_COLUMN(TimeFv0, timeFv0, double); DECLARE_SOA_COLUMN(TimeFt0a, timeFt0a, double); DECLARE_SOA_COLUMN(TimeFt0c, timeFt0c, double); DECLARE_SOA_COLUMN(TimeFdda, timeFdda, double); DECLARE_SOA_COLUMN(TimeFddc, timeFddc, double); +// ZDC times DECLARE_SOA_COLUMN(TimeZna, timeZna, double); DECLARE_SOA_COLUMN(TimeZnc, timeZnc, double); -DECLARE_SOA_COLUMN(Dcaxy, dcaxy, std::vector); -DECLARE_SOA_COLUMN(Dcaz, dcaz, std::vector); - -DECLARE_SOA_COLUMN(TpcNsigmaPi, tpcNsigmaPi, std::vector); -DECLARE_SOA_COLUMN(TpcNsigmaKa, tpcNsigmaKa, std::vector); -DECLARE_SOA_COLUMN(TpcNsigmaPr, tpcNsigmaPr, std::vector); -DECLARE_SOA_COLUMN(TpcNsigmaEl, tpcNsigmaEl, std::vector); -DECLARE_SOA_COLUMN(TpcNsigmaMu, tpcNsigmaMu, std::vector); - -DECLARE_SOA_COLUMN(TofNsigmaPi, tofNsigmaPi, std::vector); -DECLARE_SOA_COLUMN(TofNsigmaKa, tofNsigmaKa, std::vector); -DECLARE_SOA_COLUMN(TofNsigmaPr, tofNsigmaPr, std::vector); -DECLARE_SOA_COLUMN(TofNsigmaEl, tofNsigmaEl, std::vector); -DECLARE_SOA_COLUMN(TofNsigmaMu, tofNsigmaMu, std::vector); - -DECLARE_SOA_COLUMN(TpcChi2, tpcChi2, std::vector); -DECLARE_SOA_COLUMN(TpcNClsFindable, tpcNClsFindable, std::vector); -DECLARE_SOA_COLUMN(ItsChi2, itsChi2, std::vector); - -DECLARE_SOA_COLUMN(PionPt, pionPt, std::vector); -DECLARE_SOA_COLUMN(PionEta, pionEta, std::vector); -DECLARE_SOA_COLUMN(PionPhi, pionPhi, std::vector); -DECLARE_SOA_COLUMN(PionRapidity, pionRapidity, std::vector); +// DCA +DECLARE_SOA_COLUMN(Dcaxy1, dcaxy1, double); +DECLARE_SOA_COLUMN(Dcaxy2, dcaxy2, double); +DECLARE_SOA_COLUMN(Dcaxy3, dcaxy3, double); +DECLARE_SOA_COLUMN(Dcaxy4, dcaxy4, double); + +DECLARE_SOA_COLUMN(Dcaz1, dcaz1, double); +DECLARE_SOA_COLUMN(Dcaz2, dcaz2, double); +DECLARE_SOA_COLUMN(Dcaz3, dcaz3, double); +DECLARE_SOA_COLUMN(Dcaz4, dcaz4, double); + +// TPC nSigmaPi +DECLARE_SOA_COLUMN(TpcNsigmaPi1, tpcNsigmaPi1, double); +DECLARE_SOA_COLUMN(TpcNsigmaPi2, tpcNsigmaPi2, double); +DECLARE_SOA_COLUMN(TpcNsigmaPi3, tpcNsigmaPi3, double); +DECLARE_SOA_COLUMN(TpcNsigmaPi4, tpcNsigmaPi4, double); + +// TPC nSigmaKa +DECLARE_SOA_COLUMN(TpcNsigmaKa1, tpcNsigmaKa1, double); +DECLARE_SOA_COLUMN(TpcNsigmaKa2, tpcNsigmaKa2, double); +DECLARE_SOA_COLUMN(TpcNsigmaKa3, tpcNsigmaKa3, double); +DECLARE_SOA_COLUMN(TpcNsigmaKa4, tpcNsigmaKa4, double); + +// TPC nSigmaPr +DECLARE_SOA_COLUMN(TpcNsigmaPr1, tpcNsigmaPr1, double); +DECLARE_SOA_COLUMN(TpcNsigmaPr2, tpcNsigmaPr2, double); +DECLARE_SOA_COLUMN(TpcNsigmaPr3, tpcNsigmaPr3, double); +DECLARE_SOA_COLUMN(TpcNsigmaPr4, tpcNsigmaPr4, double); + +// TPC nSigmaEl +DECLARE_SOA_COLUMN(TpcNsigmaEl1, tpcNsigmaEl1, double); +DECLARE_SOA_COLUMN(TpcNsigmaEl2, tpcNsigmaEl2, double); +DECLARE_SOA_COLUMN(TpcNsigmaEl3, tpcNsigmaEl3, double); +DECLARE_SOA_COLUMN(TpcNsigmaEl4, tpcNsigmaEl4, double); + +// TPC nSigmaMu +DECLARE_SOA_COLUMN(TpcNsigmaMu1, tpcNsigmaMu1, double); +DECLARE_SOA_COLUMN(TpcNsigmaMu2, tpcNsigmaMu2, double); +DECLARE_SOA_COLUMN(TpcNsigmaMu3, tpcNsigmaMu3, double); +DECLARE_SOA_COLUMN(TpcNsigmaMu4, tpcNsigmaMu4, double); + +// TPC Chi2 +DECLARE_SOA_COLUMN(TpcChi21, tpcChi21, double); +DECLARE_SOA_COLUMN(TpcChi22, tpcChi22, double); +DECLARE_SOA_COLUMN(TpcChi23, tpcChi23, double); +DECLARE_SOA_COLUMN(TpcChi24, tpcChi24, double); + +// TPC NClsFindable +DECLARE_SOA_COLUMN(TpcNClsFindable1, tpcNClsFindable1, double); +DECLARE_SOA_COLUMN(TpcNClsFindable2, tpcNClsFindable2, double); +DECLARE_SOA_COLUMN(TpcNClsFindable3, tpcNClsFindable3, double); +DECLARE_SOA_COLUMN(TpcNClsFindable4, tpcNClsFindable4, double); + +// ITS Chi2 +DECLARE_SOA_COLUMN(ItsChi21, itsChi21, double); +DECLARE_SOA_COLUMN(ItsChi22, itsChi22, double); +DECLARE_SOA_COLUMN(ItsChi23, itsChi23, double); +DECLARE_SOA_COLUMN(ItsChi24, itsChi24, double); + +// PionPt +DECLARE_SOA_COLUMN(PionPt1, pionPt1, double); +DECLARE_SOA_COLUMN(PionPt2, pionPt2, double); +DECLARE_SOA_COLUMN(PionPt3, pionPt3, double); +DECLARE_SOA_COLUMN(PionPt4, pionPt4, double); + +// Pion Eta +DECLARE_SOA_COLUMN(PionEta1, pionEta1, double); +DECLARE_SOA_COLUMN(PionEta2, pionEta2, double); +DECLARE_SOA_COLUMN(PionEta3, pionEta3, double); +DECLARE_SOA_COLUMN(PionEta4, pionEta4, double); + +// Pion Phi +DECLARE_SOA_COLUMN(PionPhi1, pionPhi1, double); +DECLARE_SOA_COLUMN(PionPhi2, pionPhi2, double); +DECLARE_SOA_COLUMN(PionPhi3, pionPhi3, double); +DECLARE_SOA_COLUMN(PionPhi4, pionPhi4, double); + +// Pion Rapidity +DECLARE_SOA_COLUMN(PionRapidity1, pionRapidity1, double); +DECLARE_SOA_COLUMN(PionRapidity2, pionRapidity2, double); +DECLARE_SOA_COLUMN(PionRapidity3, pionRapidity3, double); +DECLARE_SOA_COLUMN(PionRapidity4, pionRapidity4, double); DECLARE_SOA_COLUMN(FourPionPt, fourPionPt, double); DECLARE_SOA_COLUMN(FourPionEta, fourPionEta, double); @@ -105,11 +168,13 @@ DECLARE_SOA_TABLE(SignalData, "AOD", "signalData", branch::PosX, branch::PosY, branch::PosZ, + branch::Fv0signal, branch::Ft0asignal, branch::Ft0csignal, branch::Fddasignal, branch::Fddcsignal, + branch::TimeFv0, branch::TimeFt0a, branch::TimeFt0c, @@ -117,25 +182,77 @@ DECLARE_SOA_TABLE(SignalData, "AOD", "signalData", branch::TimeFddc, branch::TimeZna, branch::TimeZnc, - branch::Dcaxy, - branch::Dcaz, - branch::TpcNsigmaPi, - branch::TpcNsigmaKa, - branch::TpcNsigmaPr, - branch::TpcNsigmaEl, - branch::TpcNsigmaMu, - branch::TofNsigmaPi, - branch::TofNsigmaKa, - branch::TofNsigmaPr, - branch::TofNsigmaEl, - branch::TofNsigmaMu, - branch::TpcChi2, - branch::TpcNClsFindable, - branch::ItsChi2, - branch::PionPt, - branch::PionEta, - branch::PionPhi, - branch::PionRapidity, + + branch::Dcaxy1, + branch::Dcaxy2, + branch::Dcaxy3, + branch::Dcaxy4, + + branch::Dcaz1, + branch::Dcaz2, + branch::Dcaz3, + branch::Dcaz4, + + branch::TpcNsigmaPi1, + branch::TpcNsigmaPi2, + branch::TpcNsigmaPi3, + branch::TpcNsigmaPi4, + + branch::TpcNsigmaKa1, + branch::TpcNsigmaKa2, + branch::TpcNsigmaKa3, + branch::TpcNsigmaKa4, + + branch::TpcNsigmaPr1, + branch::TpcNsigmaPr2, + branch::TpcNsigmaPr3, + branch::TpcNsigmaPr4, + + branch::TpcNsigmaEl1, + branch::TpcNsigmaEl2, + branch::TpcNsigmaEl3, + branch::TpcNsigmaEl4, + + branch::TpcNsigmaMu1, + branch::TpcNsigmaMu2, + branch::TpcNsigmaMu3, + branch::TpcNsigmaMu4, + + branch::TpcChi21, + branch::TpcChi22, + branch::TpcChi23, + branch::TpcChi24, + + branch::TpcNClsFindable1, + branch::TpcNClsFindable2, + branch::TpcNClsFindable3, + branch::TpcNClsFindable4, + + branch::ItsChi21, + branch::ItsChi22, + branch::ItsChi23, + branch::ItsChi24, + + branch::PionPt1, + branch::PionPt2, + branch::PionPt3, + branch::PionPt4, + + branch::PionEta1, + branch::PionEta2, + branch::PionEta3, + branch::PionEta4, + + branch::PionPhi1, + branch::PionPhi2, + branch::PionPhi3, + branch::PionPhi4, + + branch::PionRapidity1, + branch::PionRapidity2, + branch::PionRapidity3, + branch::PionRapidity4, + branch::FourPionPt, branch::FourPionEta, branch::FourPionPhi, @@ -147,14 +264,17 @@ DECLARE_SOA_TABLE(SignalData, "AOD", "signalData", branch::FourPionCosThetaPair2); DECLARE_SOA_TABLE(BkgroundData, "AOD", "bkgroundData", + branch::PosX, branch::PosY, branch::PosZ, + branch::Fv0signal, branch::Ft0asignal, branch::Ft0csignal, branch::Fddasignal, branch::Fddcsignal, + branch::TimeFv0, branch::TimeFt0a, branch::TimeFt0c, @@ -162,25 +282,77 @@ DECLARE_SOA_TABLE(BkgroundData, "AOD", "bkgroundData", branch::TimeFddc, branch::TimeZna, branch::TimeZnc, - branch::Dcaxy, - branch::Dcaz, - branch::TpcNsigmaPi, - branch::TpcNsigmaKa, - branch::TpcNsigmaPr, - branch::TpcNsigmaEl, - branch::TpcNsigmaMu, - branch::TofNsigmaPi, - branch::TofNsigmaKa, - branch::TofNsigmaPr, - branch::TofNsigmaEl, - branch::TofNsigmaMu, - branch::TpcChi2, - branch::TpcNClsFindable, - branch::ItsChi2, - branch::PionPt, - branch::PionEta, - branch::PionPhi, - branch::PionRapidity, + + branch::Dcaxy1, + branch::Dcaxy2, + branch::Dcaxy3, + branch::Dcaxy4, + + branch::Dcaz1, + branch::Dcaz2, + branch::Dcaz3, + branch::Dcaz4, + + branch::TpcNsigmaPi1, + branch::TpcNsigmaPi2, + branch::TpcNsigmaPi3, + branch::TpcNsigmaPi4, + + branch::TpcNsigmaKa1, + branch::TpcNsigmaKa2, + branch::TpcNsigmaKa3, + branch::TpcNsigmaKa4, + + branch::TpcNsigmaPr1, + branch::TpcNsigmaPr2, + branch::TpcNsigmaPr3, + branch::TpcNsigmaPr4, + + branch::TpcNsigmaEl1, + branch::TpcNsigmaEl2, + branch::TpcNsigmaEl3, + branch::TpcNsigmaEl4, + + branch::TpcNsigmaMu1, + branch::TpcNsigmaMu2, + branch::TpcNsigmaMu3, + branch::TpcNsigmaMu4, + + branch::TpcChi21, + branch::TpcChi22, + branch::TpcChi23, + branch::TpcChi24, + + branch::TpcNClsFindable1, + branch::TpcNClsFindable2, + branch::TpcNClsFindable3, + branch::TpcNClsFindable4, + + branch::ItsChi21, + branch::ItsChi22, + branch::ItsChi23, + branch::ItsChi24, + + branch::PionPt1, + branch::PionPt2, + branch::PionPt3, + branch::PionPt4, + + branch::PionEta1, + branch::PionEta2, + branch::PionEta3, + branch::PionEta4, + + branch::PionPhi1, + branch::PionPhi2, + branch::PionPhi3, + branch::PionPhi4, + + branch::PionRapidity1, + branch::PionRapidity2, + branch::PionRapidity3, + branch::PionRapidity4, + branch::FourPionPt, branch::FourPionEta, branch::FourPionPhi, @@ -188,10 +360,26 @@ DECLARE_SOA_TABLE(BkgroundData, "AOD", "bkgroundData", branch::FourPionMass); DECLARE_SOA_TABLE(MCgen, "AOD", "MCgen", - branch::PionPt, - branch::PionEta, - branch::PionPhi, - branch::PionRapidity, + branch::PionPt1, + branch::PionPt2, + branch::PionPt3, + branch::PionPt4, + + branch::PionEta1, + branch::PionEta2, + branch::PionEta3, + branch::PionEta4, + + branch::PionPhi1, + branch::PionPhi2, + branch::PionPhi3, + branch::PionPhi4, + + branch::PionRapidity1, + branch::PionRapidity2, + branch::PionRapidity3, + branch::PionRapidity4, + branch::FourPionPt, branch::FourPionEta, branch::FourPionPhi, @@ -206,11 +394,13 @@ DECLARE_SOA_TABLE(SignalMCreco, "AOD", "SignalMCreco", branch::PosX, branch::PosY, branch::PosZ, + branch::Fv0signal, branch::Ft0asignal, branch::Ft0csignal, branch::Fddasignal, branch::Fddcsignal, + branch::TimeFv0, branch::TimeFt0a, branch::TimeFt0c, @@ -218,25 +408,77 @@ DECLARE_SOA_TABLE(SignalMCreco, "AOD", "SignalMCreco", branch::TimeFddc, branch::TimeZna, branch::TimeZnc, - branch::Dcaxy, - branch::Dcaz, - branch::TpcNsigmaPi, - branch::TpcNsigmaKa, - branch::TpcNsigmaPr, - branch::TpcNsigmaEl, - branch::TpcNsigmaMu, - branch::TofNsigmaPi, - branch::TofNsigmaKa, - branch::TofNsigmaPr, - branch::TofNsigmaEl, - branch::TofNsigmaMu, - branch::TpcChi2, - branch::TpcNClsFindable, - branch::ItsChi2, - branch::PionPt, - branch::PionEta, - branch::PionPhi, - branch::PionRapidity, + + branch::Dcaxy1, + branch::Dcaxy2, + branch::Dcaxy3, + branch::Dcaxy4, + + branch::Dcaz1, + branch::Dcaz2, + branch::Dcaz3, + branch::Dcaz4, + + branch::TpcNsigmaPi1, + branch::TpcNsigmaPi2, + branch::TpcNsigmaPi3, + branch::TpcNsigmaPi4, + + branch::TpcNsigmaKa1, + branch::TpcNsigmaKa2, + branch::TpcNsigmaKa3, + branch::TpcNsigmaKa4, + + branch::TpcNsigmaPr1, + branch::TpcNsigmaPr2, + branch::TpcNsigmaPr3, + branch::TpcNsigmaPr4, + + branch::TpcNsigmaEl1, + branch::TpcNsigmaEl2, + branch::TpcNsigmaEl3, + branch::TpcNsigmaEl4, + + branch::TpcNsigmaMu1, + branch::TpcNsigmaMu2, + branch::TpcNsigmaMu3, + branch::TpcNsigmaMu4, + + branch::TpcChi21, + branch::TpcChi22, + branch::TpcChi23, + branch::TpcChi24, + + branch::TpcNClsFindable1, + branch::TpcNClsFindable2, + branch::TpcNClsFindable3, + branch::TpcNClsFindable4, + + branch::ItsChi21, + branch::ItsChi22, + branch::ItsChi23, + branch::ItsChi24, + + branch::PionPt1, + branch::PionPt2, + branch::PionPt3, + branch::PionPt4, + + branch::PionEta1, + branch::PionEta2, + branch::PionEta3, + branch::PionEta4, + + branch::PionPhi1, + branch::PionPhi2, + branch::PionPhi3, + branch::PionPhi4, + + branch::PionRapidity1, + branch::PionRapidity2, + branch::PionRapidity3, + branch::PionRapidity4, + branch::FourPionPt, branch::FourPionEta, branch::FourPionPhi, @@ -261,7 +503,8 @@ struct ExclusiveRhoTo4Pi { HistogramRegistry histosData{"histosData", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry histosMCgen{"histosMCgen", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry histosMCreco{"histosMCreco", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; - HistogramRegistry histosFast{"histosFast", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry histosFastData{"histosFastData", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry histosFastMCreco{"histosFastMCreco", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Configurable fv0Cut{"fv0Cut", 50., "FV0A threshold"}; @@ -288,7 +531,6 @@ struct ExclusiveRhoTo4Pi { Configurable nBinsRapidity{"nBinsRapidity", 1000, "Number of bins for Rapidity"}; Configurable nBinsPhi{"nBinsPhi", 360, "Number of bins for Phi"}; Configurable nBinsCosTheta{"nBinsCosTheta", 360, "Number of bins for cos Theta"}; - //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- // Begin of Init Function----------------------------------------------------------------------------------------------------------------------------------------------------- @@ -532,10 +774,17 @@ struct ExclusiveRhoTo4Pi { histosMCreco.add("phi_cosTheta_pair_1", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); histosMCreco.add("phi_cosTheta_pair_2", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); - histosFast.add("4PionMassWithCut", "", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); - histosFast.add("4PionMassFull", "", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); - histosFast.add("4PionPt", "", kTH1F, {{nBinsPt, 0, 10}}); - histosFast.add("4PionRapidity", "", kTH1F, {{nBinsRapidity, -1, 1}}); + // Fast Data Stuff + histosFastData.add("4PionMassWithCut", "", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); + histosFastData.add("4PionMassFull", "", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); + histosFastData.add("4PionPt", "", kTH1F, {{nBinsPt, 0, 10}}); + histosFastData.add("4PionRapidity", "", kTH1F, {{nBinsRapidity, -1, 1}}); + + // Fast MC reco Stuff + histosFastMCreco.add("4PionMassWithCut", "", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); + histosFastMCreco.add("4PionMassFull", "", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); + histosFastMCreco.add("4PionPt", "", kTH1F, {{nBinsPt, 0, 10}}); + histosFastMCreco.add("4PionRapidity", "", kTH1F, {{nBinsRapidity, -1, 1}}); } // End of init function //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -725,30 +974,6 @@ struct ExclusiveRhoTo4Pi { // Selecting Events with net charge = 0 if (numPionMinusTRacks == 2 && numPiPlusTracks == 2) { - std::vector dcaxy; - std::vector dcaz; - - std::vector tpcnsigPi; - std::vector tpcnsigKa; - std::vector tpcnsigPr; - std::vector tpcnsigEl; - std::vector tpcnsigMu; - - std::vector tofnsigPi; - std::vector tofnsigKa; - std::vector tofnsigPr; - std::vector tofnsigEl; - std::vector tofnsigMu; - - std::vector tpcchi2; - std::vector tpcnclsfindable; - std::vector itschi2; - - std::vector pipt; - std::vector pieta; - std::vector piphi; - std::vector pirapidity; - TLorentzVector p1, p2, p3, p4, p1234; ROOT::Math::PtEtaPhiMVector k1, k2, k3, k4, k1234, k13, k14, k23, k24; @@ -772,101 +997,6 @@ struct ExclusiveRhoTo4Pi { k3.SetCoordinates(p3.Pt(), p3.Eta(), p3.Phi(), o2::constants::physics::MassPionCharged); k4.SetCoordinates(p4.Pt(), p4.Eta(), p4.Phi(), o2::constants::physics::MassPionCharged); - dcaxy.push_back(Pi_plus_tracks[0].dcaXY()); - dcaxy.push_back(Pi_plus_tracks[1].dcaXY()); - dcaxy.push_back(Pi_minus_tracks[0].dcaXY()); - dcaxy.push_back(Pi_minus_tracks[1].dcaXY()); - - dcaz.push_back(Pi_plus_tracks[0].dcaZ()); - dcaz.push_back(Pi_plus_tracks[1].dcaZ()); - dcaz.push_back(Pi_minus_tracks[0].dcaZ()); - dcaz.push_back(Pi_minus_tracks[1].dcaZ()); - - tpcnsigPi.push_back(Pi_plus_tracks[0].tpcNSigmaPi()); - tpcnsigPi.push_back(Pi_plus_tracks[1].tpcNSigmaPi()); - tpcnsigPi.push_back(Pi_minus_tracks[0].tpcNSigmaPi()); - tpcnsigPi.push_back(Pi_minus_tracks[1].tpcNSigmaPi()); - - tpcnsigKa.push_back(Pi_plus_tracks[0].tpcNSigmaKa()); - tpcnsigKa.push_back(Pi_plus_tracks[1].tpcNSigmaKa()); - tpcnsigKa.push_back(Pi_minus_tracks[0].tpcNSigmaKa()); - tpcnsigKa.push_back(Pi_minus_tracks[1].tpcNSigmaKa()); - - tpcnsigPr.push_back(Pi_plus_tracks[0].tpcNSigmaPr()); - tpcnsigPr.push_back(Pi_plus_tracks[1].tpcNSigmaPr()); - tpcnsigPr.push_back(Pi_minus_tracks[0].tpcNSigmaPr()); - tpcnsigPr.push_back(Pi_minus_tracks[1].tpcNSigmaPr()); - - tpcnsigEl.push_back(Pi_plus_tracks[0].tpcNSigmaEl()); - tpcnsigEl.push_back(Pi_plus_tracks[1].tpcNSigmaEl()); - tpcnsigEl.push_back(Pi_minus_tracks[0].tpcNSigmaEl()); - tpcnsigEl.push_back(Pi_minus_tracks[1].tpcNSigmaEl()); - - tpcnsigMu.push_back(Pi_plus_tracks[0].tpcNSigmaMu()); - tpcnsigMu.push_back(Pi_plus_tracks[1].tpcNSigmaMu()); - tpcnsigMu.push_back(Pi_minus_tracks[0].tpcNSigmaMu()); - tpcnsigMu.push_back(Pi_minus_tracks[1].tpcNSigmaMu()); - - tofnsigPi.push_back(Pi_plus_tracks[0].tofNSigmaPi()); - tofnsigPi.push_back(Pi_plus_tracks[1].tofNSigmaPi()); - tofnsigPi.push_back(Pi_minus_tracks[0].tofNSigmaPi()); - tofnsigPi.push_back(Pi_minus_tracks[1].tofNSigmaPi()); - - tofnsigKa.push_back(Pi_plus_tracks[0].tofNSigmaKa()); - tofnsigKa.push_back(Pi_plus_tracks[1].tofNSigmaKa()); - tofnsigKa.push_back(Pi_minus_tracks[0].tofNSigmaKa()); - tofnsigKa.push_back(Pi_minus_tracks[1].tofNSigmaKa()); - - tofnsigPr.push_back(Pi_plus_tracks[0].tofNSigmaPr()); - tofnsigPr.push_back(Pi_plus_tracks[1].tofNSigmaPr()); - tofnsigPr.push_back(Pi_minus_tracks[0].tofNSigmaPr()); - tofnsigPr.push_back(Pi_minus_tracks[1].tofNSigmaPr()); - - tofnsigEl.push_back(Pi_plus_tracks[0].tofNSigmaEl()); - tofnsigEl.push_back(Pi_plus_tracks[1].tofNSigmaEl()); - tofnsigEl.push_back(Pi_minus_tracks[0].tofNSigmaEl()); - tofnsigEl.push_back(Pi_minus_tracks[1].tofNSigmaEl()); - - tofnsigMu.push_back(Pi_plus_tracks[0].tofNSigmaMu()); - tofnsigMu.push_back(Pi_plus_tracks[1].tofNSigmaMu()); - tofnsigMu.push_back(Pi_minus_tracks[0].tofNSigmaMu()); - tofnsigMu.push_back(Pi_minus_tracks[1].tofNSigmaMu()); - - tpcchi2.push_back(Pi_plus_tracks[0].tpcChi2NCl()); - tpcchi2.push_back(Pi_plus_tracks[1].tpcChi2NCl()); - tpcchi2.push_back(Pi_minus_tracks[0].tpcChi2NCl()); - tpcchi2.push_back(Pi_minus_tracks[1].tpcChi2NCl()); - - tpcnclsfindable.push_back(Pi_plus_tracks[0].tpcNClsFindable()); - tpcnclsfindable.push_back(Pi_plus_tracks[1].tpcNClsFindable()); - tpcnclsfindable.push_back(Pi_minus_tracks[0].tpcNClsFindable()); - tpcnclsfindable.push_back(Pi_minus_tracks[1].tpcNClsFindable()); - - itschi2.push_back(Pi_plus_tracks[0].itsChi2NCl()); - itschi2.push_back(Pi_plus_tracks[1].itsChi2NCl()); - itschi2.push_back(Pi_minus_tracks[0].itsChi2NCl()); - itschi2.push_back(Pi_minus_tracks[1].itsChi2NCl()); - - pipt.push_back(p1.Pt()); - pipt.push_back(p2.Pt()); - pipt.push_back(p3.Pt()); - pipt.push_back(p4.Pt()); - - pieta.push_back(p1.Eta()); - pieta.push_back(p2.Eta()); - pieta.push_back(p3.Eta()); - pieta.push_back(p4.Eta()); - - piphi.push_back(p1.Phi()); - piphi.push_back(p2.Phi()); - piphi.push_back(p3.Phi()); - piphi.push_back(p4.Phi()); - - pirapidity.push_back(p1.Rapidity()); - pirapidity.push_back(p2.Rapidity()); - pirapidity.push_back(p3.Rapidity()); - pirapidity.push_back(p4.Rapidity()); - p1234 = p1 + p2 + p3 + p4; k1234 = k1 + k2 + k3 + k4; @@ -883,13 +1013,31 @@ struct ExclusiveRhoTo4Pi { sigFromData( collision.posX(), collision.posY(), collision.posZ(), collision.totalFV0AmplitudeA(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), - collision.timeFV0A(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFDDA(), collision.timeFDDC(), - collision.timeZNA(), collision.timeZNC(), - dcaxy, dcaz, - tpcnsigPi, tpcnsigKa, tpcnsigPr, tpcnsigEl, tpcnsigMu, - tofnsigPi, tofnsigKa, tofnsigPr, tofnsigEl, tofnsigMu, - tpcchi2, tpcnclsfindable, itschi2, - pipt, pieta, piphi, pirapidity, + collision.timeFV0A(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFDDA(), collision.timeFDDC(), collision.timeZNA(), collision.timeZNC(), + Pi_plus_tracks[0].dcaXY(), Pi_plus_tracks[1].dcaXY(), Pi_minus_tracks[0].dcaXY(), Pi_minus_tracks[1].dcaXY(), + + Pi_plus_tracks[0].dcaZ(), Pi_plus_tracks[1].dcaZ(), Pi_minus_tracks[0].dcaZ(), Pi_minus_tracks[1].dcaZ(), + + Pi_plus_tracks[0].tpcNSigmaPi(), Pi_plus_tracks[1].tpcNSigmaPi(), Pi_minus_tracks[0].tpcNSigmaPi(), Pi_minus_tracks[1].tpcNSigmaPi(), + + Pi_plus_tracks[0].tpcNSigmaKa(), Pi_plus_tracks[1].tpcNSigmaKa(), Pi_minus_tracks[0].tpcNSigmaKa(), Pi_minus_tracks[1].tpcNSigmaKa(), + + Pi_plus_tracks[0].tpcNSigmaPr(), Pi_plus_tracks[1].tpcNSigmaPr(), Pi_minus_tracks[0].tpcNSigmaPr(), Pi_minus_tracks[1].tpcNSigmaPr(), + + Pi_plus_tracks[0].tpcNSigmaEl(), Pi_plus_tracks[1].tpcNSigmaEl(), Pi_minus_tracks[0].tpcNSigmaEl(), Pi_minus_tracks[1].tpcNSigmaEl(), + + Pi_plus_tracks[0].tpcNSigmaMu(), Pi_plus_tracks[1].tpcNSigmaMu(), Pi_minus_tracks[0].tpcNSigmaMu(), Pi_minus_tracks[1].tpcNSigmaMu(), + + Pi_plus_tracks[0].tpcChi2NCl(), Pi_plus_tracks[1].tpcChi2NCl(), Pi_minus_tracks[0].tpcChi2NCl(), Pi_minus_tracks[1].tpcChi2NCl(), + + Pi_plus_tracks[0].tpcNClsFindable(), Pi_plus_tracks[1].tpcNClsFindable(), Pi_minus_tracks[0].tpcNClsFindable(), Pi_minus_tracks[1].tpcNClsFindable(), + + Pi_plus_tracks[0].itsChi2NCl(), Pi_plus_tracks[1].itsChi2NCl(), Pi_minus_tracks[0].itsChi2NCl(), Pi_minus_tracks[1].itsChi2NCl(), + + p1.Pt(), p2.Pt(), p3.Pt(), p4.Pt(), + p1.Eta(), p2.Eta(), p3.Eta(), p4.Eta(), + p1.Phi(), p2.Phi(), p3.Phi(), p4.Phi(), + p1.Rapidity(), p2.Rapidity(), p3.Rapidity(), p4.Rapidity(), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiPhiPair1, fourPiPhiPair2, fourPiCosThetaPair1, fourPiCosThetaPair2); @@ -927,30 +1075,6 @@ struct ExclusiveRhoTo4Pi { // Selecting Events with net charge != 0 for estimation of background if (numPionMinusTRacks != 2 && numPiPlusTracks != 2) { - std::vector dcaxy; - std::vector dcaz; - - std::vector tpcnsigPi; - std::vector tpcnsigKa; - std::vector tpcnsigPr; - std::vector tpcnsigEl; - std::vector tpcnsigMu; - - std::vector tofnsigPi; - std::vector tofnsigKa; - std::vector tofnsigPr; - std::vector tofnsigEl; - std::vector tofnsigMu; - - std::vector tpcchi2; - std::vector tpcnclsfindable; - std::vector itschi2; - - std::vector pipt; - std::vector pieta; - std::vector piphi; - std::vector pirapidity; - TLorentzVector p1, p2, p3, p4, p1234; TLorentzVector tempVec; p1.SetXYZM(WTS_PID_Pi_tracks[0].px(), WTS_PID_Pi_tracks[0].py(), WTS_PID_Pi_tracks[0].pz(), o2::constants::physics::MassPionCharged); @@ -958,101 +1082,6 @@ struct ExclusiveRhoTo4Pi { p3.SetXYZM(WTS_PID_Pi_tracks[2].px(), WTS_PID_Pi_tracks[2].py(), WTS_PID_Pi_tracks[2].pz(), o2::constants::physics::MassPionCharged); p4.SetXYZM(WTS_PID_Pi_tracks[3].px(), WTS_PID_Pi_tracks[3].py(), WTS_PID_Pi_tracks[3].pz(), o2::constants::physics::MassPionCharged); - dcaxy.push_back(WTS_PID_Pi_tracks[0].dcaXY()); - dcaxy.push_back(WTS_PID_Pi_tracks[1].dcaXY()); - dcaxy.push_back(WTS_PID_Pi_tracks[2].dcaXY()); - dcaxy.push_back(WTS_PID_Pi_tracks[3].dcaXY()); - - dcaz.push_back(WTS_PID_Pi_tracks[0].dcaZ()); - dcaz.push_back(WTS_PID_Pi_tracks[1].dcaZ()); - dcaz.push_back(WTS_PID_Pi_tracks[2].dcaZ()); - dcaz.push_back(WTS_PID_Pi_tracks[3].dcaZ()); - - tpcnsigPi.push_back(WTS_PID_Pi_tracks[0].tpcNSigmaPi()); - tpcnsigPi.push_back(WTS_PID_Pi_tracks[1].tpcNSigmaPi()); - tpcnsigPi.push_back(WTS_PID_Pi_tracks[2].tpcNSigmaPi()); - tpcnsigPi.push_back(WTS_PID_Pi_tracks[3].tpcNSigmaPi()); - - tpcnsigKa.push_back(WTS_PID_Pi_tracks[0].tpcNSigmaKa()); - tpcnsigKa.push_back(WTS_PID_Pi_tracks[1].tpcNSigmaKa()); - tpcnsigKa.push_back(WTS_PID_Pi_tracks[2].tpcNSigmaKa()); - tpcnsigKa.push_back(WTS_PID_Pi_tracks[3].tpcNSigmaKa()); - - tpcnsigPr.push_back(WTS_PID_Pi_tracks[0].tpcNSigmaPr()); - tpcnsigPr.push_back(WTS_PID_Pi_tracks[1].tpcNSigmaPr()); - tpcnsigPr.push_back(WTS_PID_Pi_tracks[2].tpcNSigmaPr()); - tpcnsigPr.push_back(WTS_PID_Pi_tracks[3].tpcNSigmaPr()); - - tpcnsigEl.push_back(WTS_PID_Pi_tracks[0].tpcNSigmaEl()); - tpcnsigEl.push_back(WTS_PID_Pi_tracks[1].tpcNSigmaEl()); - tpcnsigEl.push_back(WTS_PID_Pi_tracks[2].tpcNSigmaEl()); - tpcnsigEl.push_back(WTS_PID_Pi_tracks[3].tpcNSigmaEl()); - - tpcnsigMu.push_back(WTS_PID_Pi_tracks[0].tpcNSigmaMu()); - tpcnsigMu.push_back(WTS_PID_Pi_tracks[1].tpcNSigmaMu()); - tpcnsigMu.push_back(WTS_PID_Pi_tracks[2].tpcNSigmaMu()); - tpcnsigMu.push_back(WTS_PID_Pi_tracks[3].tpcNSigmaMu()); - - tofnsigPi.push_back(WTS_PID_Pi_tracks[0].tofNSigmaPi()); - tofnsigPi.push_back(WTS_PID_Pi_tracks[1].tofNSigmaPi()); - tofnsigPi.push_back(WTS_PID_Pi_tracks[2].tofNSigmaPi()); - tofnsigPi.push_back(WTS_PID_Pi_tracks[3].tofNSigmaPi()); - - tofnsigKa.push_back(WTS_PID_Pi_tracks[0].tofNSigmaKa()); - tofnsigKa.push_back(WTS_PID_Pi_tracks[1].tofNSigmaKa()); - tofnsigKa.push_back(WTS_PID_Pi_tracks[2].tofNSigmaKa()); - tofnsigKa.push_back(WTS_PID_Pi_tracks[3].tofNSigmaKa()); - - tofnsigPr.push_back(WTS_PID_Pi_tracks[0].tofNSigmaPr()); - tofnsigPr.push_back(WTS_PID_Pi_tracks[1].tofNSigmaPr()); - tofnsigPr.push_back(WTS_PID_Pi_tracks[2].tofNSigmaPr()); - tofnsigPr.push_back(WTS_PID_Pi_tracks[3].tofNSigmaPr()); - - tofnsigEl.push_back(WTS_PID_Pi_tracks[0].tofNSigmaEl()); - tofnsigEl.push_back(WTS_PID_Pi_tracks[1].tofNSigmaEl()); - tofnsigEl.push_back(WTS_PID_Pi_tracks[2].tofNSigmaEl()); - tofnsigEl.push_back(WTS_PID_Pi_tracks[3].tofNSigmaEl()); - - tofnsigMu.push_back(WTS_PID_Pi_tracks[0].tofNSigmaMu()); - tofnsigMu.push_back(WTS_PID_Pi_tracks[1].tofNSigmaMu()); - tofnsigMu.push_back(WTS_PID_Pi_tracks[2].tofNSigmaMu()); - tofnsigMu.push_back(WTS_PID_Pi_tracks[3].tofNSigmaMu()); - - tpcchi2.push_back(WTS_PID_Pi_tracks[0].tpcChi2NCl()); - tpcchi2.push_back(WTS_PID_Pi_tracks[1].tpcChi2NCl()); - tpcchi2.push_back(WTS_PID_Pi_tracks[2].tpcChi2NCl()); - tpcchi2.push_back(WTS_PID_Pi_tracks[3].tpcChi2NCl()); - - tpcnclsfindable.push_back(WTS_PID_Pi_tracks[0].tpcNClsFindable()); - tpcnclsfindable.push_back(WTS_PID_Pi_tracks[1].tpcNClsFindable()); - tpcnclsfindable.push_back(WTS_PID_Pi_tracks[2].tpcNClsFindable()); - tpcnclsfindable.push_back(WTS_PID_Pi_tracks[3].tpcNClsFindable()); - - itschi2.push_back(WTS_PID_Pi_tracks[0].itsChi2NCl()); - itschi2.push_back(WTS_PID_Pi_tracks[1].itsChi2NCl()); - itschi2.push_back(WTS_PID_Pi_tracks[2].itsChi2NCl()); - itschi2.push_back(WTS_PID_Pi_tracks[3].itsChi2NCl()); - - pipt.push_back(p1.Pt()); - pipt.push_back(p2.Pt()); - pipt.push_back(p3.Pt()); - pipt.push_back(p4.Pt()); - - pieta.push_back(p1.Eta()); - pieta.push_back(p2.Eta()); - pieta.push_back(p3.Eta()); - pieta.push_back(p4.Eta()); - - piphi.push_back(p1.Phi()); - piphi.push_back(p2.Phi()); - piphi.push_back(p3.Phi()); - piphi.push_back(p4.Phi()); - - pirapidity.push_back(p1.Rapidity()); - pirapidity.push_back(p2.Rapidity()); - pirapidity.push_back(p3.Rapidity()); - pirapidity.push_back(p4.Rapidity()); - p1234 = p1 + p2 + p3 + p4; bkgFromData( @@ -1060,11 +1089,20 @@ struct ExclusiveRhoTo4Pi { collision.totalFV0AmplitudeA(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), collision.timeFV0A(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFDDA(), collision.timeFDDC(), collision.timeZNA(), collision.timeZNC(), - dcaxy, dcaz, - tpcnsigPi, tpcnsigKa, tpcnsigPr, tpcnsigEl, tpcnsigMu, - tofnsigPi, tofnsigKa, tofnsigPr, tofnsigEl, tofnsigMu, - tpcchi2, tpcnclsfindable, itschi2, - pipt, pieta, piphi, pirapidity, + WTS_PID_Pi_tracks[0].dcaXY(), WTS_PID_Pi_tracks[1].dcaXY(), WTS_PID_Pi_tracks[0].dcaXY(), WTS_PID_Pi_tracks[1].dcaXY(), + WTS_PID_Pi_tracks[0].dcaZ(), WTS_PID_Pi_tracks[1].dcaZ(), WTS_PID_Pi_tracks[0].dcaZ(), WTS_PID_Pi_tracks[1].dcaZ(), + WTS_PID_Pi_tracks[0].tpcNSigmaPi(), WTS_PID_Pi_tracks[1].tpcNSigmaPi(), WTS_PID_Pi_tracks[0].tpcNSigmaPi(), WTS_PID_Pi_tracks[1].tpcNSigmaPi(), + WTS_PID_Pi_tracks[0].tpcNSigmaKa(), WTS_PID_Pi_tracks[1].tpcNSigmaKa(), WTS_PID_Pi_tracks[0].tpcNSigmaKa(), WTS_PID_Pi_tracks[1].tpcNSigmaKa(), + WTS_PID_Pi_tracks[0].tpcNSigmaPr(), WTS_PID_Pi_tracks[1].tpcNSigmaPr(), WTS_PID_Pi_tracks[0].tpcNSigmaPr(), WTS_PID_Pi_tracks[1].tpcNSigmaPr(), + WTS_PID_Pi_tracks[0].tpcNSigmaEl(), WTS_PID_Pi_tracks[1].tpcNSigmaEl(), WTS_PID_Pi_tracks[0].tpcNSigmaEl(), WTS_PID_Pi_tracks[1].tpcNSigmaEl(), + WTS_PID_Pi_tracks[0].tpcNSigmaMu(), WTS_PID_Pi_tracks[1].tpcNSigmaMu(), WTS_PID_Pi_tracks[0].tpcNSigmaMu(), WTS_PID_Pi_tracks[1].tpcNSigmaMu(), + WTS_PID_Pi_tracks[0].itsChi2NCl(), WTS_PID_Pi_tracks[1].itsChi2NCl(), WTS_PID_Pi_tracks[0].itsChi2NCl(), WTS_PID_Pi_tracks[1].itsChi2NCl(), + WTS_PID_Pi_tracks[0].tpcChi2NCl(), WTS_PID_Pi_tracks[1].tpcChi2NCl(), WTS_PID_Pi_tracks[0].tpcChi2NCl(), WTS_PID_Pi_tracks[1].tpcChi2NCl(), + WTS_PID_Pi_tracks[0].tpcNClsFindable(), WTS_PID_Pi_tracks[1].tpcNClsFindable(), WTS_PID_Pi_tracks[0].tpcNClsFindable(), WTS_PID_Pi_tracks[1].tpcNClsFindable(), + p1.Pt(), p2.Pt(), p3.Pt(), p4.Pt(), + p1.Eta(), p2.Eta(), p3.Eta(), p4.Eta(), + p1.Phi(), p2.Phi(), p3.Phi(), p4.Phi(), + p1.Rapidity(), p2.Rapidity(), p3.Rapidity(), p4.Rapidity(), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M()); if (std::fabs(p1234.Rapidity()) < 0.5) { @@ -1129,30 +1167,6 @@ struct ExclusiveRhoTo4Pi { if (pionPlusTracks.size() == 2 || pionMinusTracks.size() == 2) { - std::vector dcaxy; - std::vector dcaz; - - std::vector tpcnsigPi; - std::vector tpcnsigKa; - std::vector tpcnsigPr; - std::vector tpcnsigEl; - std::vector tpcnsigMu; - - std::vector tofnsigPi; - std::vector tofnsigKa; - std::vector tofnsigPr; - std::vector tofnsigEl; - std::vector tofnsigMu; - - std::vector tpcchi2; - std::vector tpcnclsfindable; - std::vector itschi2; - - std::vector pipt; - std::vector pieta; - std::vector piphi; - std::vector pirapidity; - TLorentzVector p1, p2, p3, p4, p1234; ROOT::Math::PtEtaPhiMVector k1, k2, k3, k4, k1234, k13, k14, k23, k24; @@ -1166,101 +1180,6 @@ struct ExclusiveRhoTo4Pi { k3.SetCoordinates(p3.Pt(), p3.Eta(), p3.Phi(), o2::constants::physics::MassPionCharged); k4.SetCoordinates(p4.Pt(), p4.Eta(), p4.Phi(), o2::constants::physics::MassPionCharged); - dcaxy.push_back(pionPlusTracks[0].dcaXY()); - dcaxy.push_back(pionPlusTracks[1].dcaXY()); - dcaxy.push_back(pionMinusTracks[0].dcaXY()); - dcaxy.push_back(pionMinusTracks[1].dcaXY()); - - dcaz.push_back(pionPlusTracks[0].dcaZ()); - dcaz.push_back(pionPlusTracks[1].dcaZ()); - dcaz.push_back(pionMinusTracks[0].dcaZ()); - dcaz.push_back(pionMinusTracks[1].dcaZ()); - - tpcnsigPi.push_back(pionPlusTracks[0].tpcNSigmaPi()); - tpcnsigPi.push_back(pionPlusTracks[1].tpcNSigmaPi()); - tpcnsigPi.push_back(pionMinusTracks[0].tpcNSigmaPi()); - tpcnsigPi.push_back(pionMinusTracks[1].tpcNSigmaPi()); - - tpcnsigKa.push_back(pionPlusTracks[0].tpcNSigmaKa()); - tpcnsigKa.push_back(pionPlusTracks[1].tpcNSigmaKa()); - tpcnsigKa.push_back(pionMinusTracks[0].tpcNSigmaKa()); - tpcnsigKa.push_back(pionMinusTracks[1].tpcNSigmaKa()); - - tpcnsigPr.push_back(pionPlusTracks[0].tpcNSigmaPr()); - tpcnsigPr.push_back(pionPlusTracks[1].tpcNSigmaPr()); - tpcnsigPr.push_back(pionMinusTracks[0].tpcNSigmaPr()); - tpcnsigPr.push_back(pionMinusTracks[1].tpcNSigmaPr()); - - tpcnsigEl.push_back(pionPlusTracks[0].tpcNSigmaEl()); - tpcnsigEl.push_back(pionPlusTracks[1].tpcNSigmaEl()); - tpcnsigEl.push_back(pionMinusTracks[0].tpcNSigmaEl()); - tpcnsigEl.push_back(pionMinusTracks[1].tpcNSigmaEl()); - - tpcnsigMu.push_back(pionPlusTracks[0].tpcNSigmaMu()); - tpcnsigMu.push_back(pionPlusTracks[1].tpcNSigmaMu()); - tpcnsigMu.push_back(pionMinusTracks[0].tpcNSigmaMu()); - tpcnsigMu.push_back(pionMinusTracks[1].tpcNSigmaMu()); - - tofnsigPi.push_back(pionPlusTracks[0].tofNSigmaPi()); - tofnsigPi.push_back(pionPlusTracks[1].tofNSigmaPi()); - tofnsigPi.push_back(pionMinusTracks[0].tofNSigmaPi()); - tofnsigPi.push_back(pionMinusTracks[1].tofNSigmaPi()); - - tofnsigKa.push_back(pionPlusTracks[0].tofNSigmaKa()); - tofnsigKa.push_back(pionPlusTracks[1].tofNSigmaKa()); - tofnsigKa.push_back(pionMinusTracks[0].tofNSigmaKa()); - tofnsigKa.push_back(pionMinusTracks[1].tofNSigmaKa()); - - tofnsigPr.push_back(pionPlusTracks[0].tofNSigmaPr()); - tofnsigPr.push_back(pionPlusTracks[1].tofNSigmaPr()); - tofnsigPr.push_back(pionMinusTracks[0].tofNSigmaPr()); - tofnsigPr.push_back(pionMinusTracks[1].tofNSigmaPr()); - - tofnsigEl.push_back(pionPlusTracks[0].tofNSigmaEl()); - tofnsigEl.push_back(pionPlusTracks[1].tofNSigmaEl()); - tofnsigEl.push_back(pionMinusTracks[0].tofNSigmaEl()); - tofnsigEl.push_back(pionMinusTracks[1].tofNSigmaEl()); - - tofnsigMu.push_back(pionPlusTracks[0].tofNSigmaMu()); - tofnsigMu.push_back(pionPlusTracks[1].tofNSigmaMu()); - tofnsigMu.push_back(pionMinusTracks[0].tofNSigmaMu()); - tofnsigMu.push_back(pionMinusTracks[1].tofNSigmaMu()); - - tpcchi2.push_back(pionPlusTracks[0].tpcChi2NCl()); - tpcchi2.push_back(pionPlusTracks[1].tpcChi2NCl()); - tpcchi2.push_back(pionMinusTracks[0].tpcChi2NCl()); - tpcchi2.push_back(pionMinusTracks[1].tpcChi2NCl()); - - tpcnclsfindable.push_back(pionPlusTracks[0].tpcNClsFindable()); - tpcnclsfindable.push_back(pionPlusTracks[1].tpcNClsFindable()); - tpcnclsfindable.push_back(pionMinusTracks[0].tpcNClsFindable()); - tpcnclsfindable.push_back(pionMinusTracks[1].tpcNClsFindable()); - - itschi2.push_back(pionPlusTracks[0].itsChi2NCl()); - itschi2.push_back(pionPlusTracks[1].itsChi2NCl()); - itschi2.push_back(pionMinusTracks[0].itsChi2NCl()); - itschi2.push_back(pionMinusTracks[1].itsChi2NCl()); - - pipt.push_back(p1.Pt()); - pipt.push_back(p2.Pt()); - pipt.push_back(p3.Pt()); - pipt.push_back(p4.Pt()); - - pieta.push_back(p1.Eta()); - pieta.push_back(p2.Eta()); - pieta.push_back(p3.Eta()); - pieta.push_back(p4.Eta()); - - piphi.push_back(p1.Phi()); - piphi.push_back(p2.Phi()); - piphi.push_back(p3.Phi()); - piphi.push_back(p4.Phi()); - - pirapidity.push_back(p1.Rapidity()); - pirapidity.push_back(p2.Rapidity()); - pirapidity.push_back(p3.Rapidity()); - pirapidity.push_back(p4.Rapidity()); - p1234 = p1 + p2 + p3 + p4; k1234 = k1 + k2 + k3 + k4; @@ -1279,20 +1198,29 @@ struct ExclusiveRhoTo4Pi { collision.totalFV0AmplitudeA(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), collision.timeFV0A(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFDDA(), collision.timeFDDC(), collision.timeZNA(), collision.timeZNC(), - dcaxy, dcaz, - tpcnsigPi, tpcnsigKa, tpcnsigPr, tpcnsigEl, tpcnsigMu, - tofnsigPi, tofnsigKa, tofnsigPr, tofnsigEl, tofnsigMu, - tpcchi2, tpcnclsfindable, itschi2, - pipt, pieta, piphi, pirapidity, + pionPlusTracks[0].dcaXY(), pionPlusTracks[1].dcaXY(), pionMinusTracks[0].dcaXY(), pionMinusTracks[1].dcaXY(), + pionPlusTracks[0].dcaZ(), pionPlusTracks[1].dcaZ(), pionMinusTracks[0].dcaZ(), pionMinusTracks[1].dcaZ(), + pionPlusTracks[0].tpcNSigmaPi(), pionPlusTracks[1].tpcNSigmaPi(), pionMinusTracks[0].tpcNSigmaPi(), pionMinusTracks[1].tpcNSigmaPi(), + pionPlusTracks[0].tpcNSigmaKa(), pionPlusTracks[1].tpcNSigmaKa(), pionMinusTracks[0].tpcNSigmaKa(), pionMinusTracks[1].tpcNSigmaKa(), + pionPlusTracks[0].tpcNSigmaPr(), pionPlusTracks[1].tpcNSigmaPr(), pionMinusTracks[0].tpcNSigmaPr(), pionMinusTracks[1].tpcNSigmaPr(), + pionPlusTracks[0].tpcNSigmaEl(), pionPlusTracks[1].tpcNSigmaEl(), pionMinusTracks[0].tpcNSigmaEl(), pionMinusTracks[1].tpcNSigmaEl(), + pionPlusTracks[0].tpcNSigmaMu(), pionPlusTracks[1].tpcNSigmaMu(), pionMinusTracks[0].tpcNSigmaMu(), pionMinusTracks[1].tpcNSigmaMu(), + pionPlusTracks[0].tpcChi2NCl(), pionPlusTracks[1].tpcChi2NCl(), pionMinusTracks[0].tpcChi2NCl(), pionMinusTracks[1].tpcChi2NCl(), + pionPlusTracks[0].tpcNClsFindable(), pionPlusTracks[1].tpcNClsFindable(), pionMinusTracks[0].tpcNClsFindable(), pionMinusTracks[1].tpcNClsFindable(), + pionPlusTracks[0].itsChi2NCl(), pionPlusTracks[1].itsChi2NCl(), pionMinusTracks[0].itsChi2NCl(), pionMinusTracks[1].itsChi2NCl(), + p1.Pt(), p2.Pt(), p3.Pt(), p4.Pt(), + p1.Eta(), p2.Eta(), p3.Eta(), p4.Eta(), + p1.Phi(), p2.Phi(), p3.Phi(), p4.Phi(), + p1.Rapidity(), p2.Rapidity(), p3.Rapidity(), p4.Rapidity(), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiPhiPair1, fourPiPhiPair2, fourPiCosThetaPair1, fourPiCosThetaPair2); - histosFast.fill(HIST("4PionPt"), p1234.Pt()); - histosFast.fill(HIST("4PionRapidity"), p1234.Rapidity()); - histosFast.fill(HIST("4PionMassFull"), p1234.M()); + histosFastData.fill(HIST("4PionPt"), p1234.Pt()); + histosFastData.fill(HIST("4PionRapidity"), p1234.Rapidity()); + histosFastData.fill(HIST("4PionMassFull"), p1234.M()); if ((p1234.Pt() < 0.15) && (std::abs(p1234.Rapidity()) < 0.5)) { - histosFast.fill(HIST("4PionMassWithCut"), p1234.M()); + histosFastData.fill(HIST("4PionMassWithCut"), p1234.M()); } } // End 0 charge event @@ -1308,8 +1236,6 @@ struct ExclusiveRhoTo4Pi { allTracks.push_back(pionMinusTracks[i]); } - int allTRackSize = static_cast(allTracks.size()); - TLorentzVector p1, p2, p3, p4, p1234; p1.SetXYZM(allTracks[0].px(), allTracks[0].py(), allTracks[0].pz(), o2::constants::physics::MassPionCharged); @@ -1317,66 +1243,36 @@ struct ExclusiveRhoTo4Pi { p3.SetXYZM(allTracks[2].px(), allTracks[2].py(), allTracks[2].pz(), o2::constants::physics::MassPionCharged); p4.SetXYZM(allTracks[3].px(), allTracks[3].py(), allTracks[3].pz(), o2::constants::physics::MassPionCharged); - std::vector dcaxy; - std::vector dcaz; - - std::vector tpcnsigPi; - std::vector tpcnsigKa; - std::vector tpcnsigPr; - std::vector tpcnsigEl; - std::vector tpcnsigMu; - - std::vector tofnsigPi; - std::vector tofnsigKa; - std::vector tofnsigPr; - std::vector tofnsigEl; - std::vector tofnsigMu; - - std::vector tpcchi2; - std::vector tpcnclsfindable; - std::vector itschi2; - - std::vector pipt; - std::vector pieta; - std::vector piphi; - std::vector pirapidity; - - TLorentzVector tempPionVect; - for (int i = 0; i < allTRackSize; i++) { - tempPionVect.SetXYZM(allTracks[i].px(), allTracks[i].py(), allTracks[i].pz(), o2::constants::physics::MassPionCharged); - dcaxy.push_back(allTracks[i].dcaXY()); - dcaz.push_back(allTracks[i].dcaZ()); - tpcnsigPi.push_back(allTracks[i].tpcNSigmaPi()); - tpcnsigKa.push_back(allTracks[i].tpcNSigmaKa()); - tpcnsigPr.push_back(allTracks[i].tpcNSigmaPr()); - tpcnsigEl.push_back(allTracks[i].tpcNSigmaEl()); - tpcnsigMu.push_back(allTracks[i].tpcNSigmaMu()); - tofnsigPi.push_back(allTracks[i].tofNSigmaPi()); - tofnsigKa.push_back(allTracks[i].tofNSigmaKa()); - tofnsigPr.push_back(allTracks[i].tofNSigmaPr()); - tofnsigEl.push_back(allTracks[i].tofNSigmaEl()); - tofnsigMu.push_back(allTracks[i].tofNSigmaMu()); - tpcchi2.push_back(allTracks[i].tpcChi2NCl()); - tpcnclsfindable.push_back(allTracks[i].tpcNClsFindable()); - itschi2.push_back(allTracks[i].itsChi2NCl()); - pipt.push_back(tempPionVect.Pt()); - pieta.push_back(tempPionVect.Eta()); - piphi.push_back(tempPionVect.Phi()); - pirapidity.push_back(tempPionVect.Rapidity()); - } - p1234 = p1 + p2 + p3 + p4; bkgFromData( collision.posX(), collision.posY(), collision.posZ(), collision.totalFV0AmplitudeA(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), - collision.timeFV0A(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFDDA(), collision.timeFDDC(), - collision.timeZNA(), collision.timeZNC(), - dcaxy, dcaz, - tpcnsigPi, tpcnsigKa, tpcnsigPr, tpcnsigEl, tpcnsigMu, - tofnsigPi, tofnsigKa, tofnsigPr, tofnsigEl, tofnsigMu, - tpcchi2, tpcnclsfindable, itschi2, - pipt, pieta, piphi, pirapidity, + collision.timeFV0A(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFDDA(), collision.timeFDDC(), collision.timeZNA(), collision.timeZNC(), + allTracks[0].dcaXY(), allTracks[1].dcaXY(), allTracks[2].dcaXY(), allTracks[3].dcaXY(), + + allTracks[0].dcaZ(), allTracks[1].dcaZ(), allTracks[2].dcaZ(), allTracks[3].dcaZ(), + + allTracks[0].tpcNSigmaPi(), allTracks[1].tpcNSigmaPi(), allTracks[2].tpcNSigmaPi(), allTracks[3].tpcNSigmaPi(), + + allTracks[0].tpcNSigmaKa(), allTracks[1].tpcNSigmaKa(), allTracks[2].tpcNSigmaKa(), allTracks[3].tpcNSigmaKa(), + + allTracks[0].tpcNSigmaPr(), allTracks[1].tpcNSigmaPr(), allTracks[2].tpcNSigmaPr(), allTracks[3].tpcNSigmaPr(), + + allTracks[0].tpcNSigmaEl(), allTracks[1].tpcNSigmaEl(), allTracks[2].tpcNSigmaEl(), allTracks[3].tpcNSigmaEl(), + + allTracks[0].tpcNSigmaMu(), allTracks[1].tpcNSigmaMu(), allTracks[2].tpcNSigmaMu(), allTracks[3].tpcNSigmaMu(), + + allTracks[0].tpcChi2NCl(), allTracks[1].tpcChi2NCl(), allTracks[2].tpcChi2NCl(), allTracks[3].tpcChi2NCl(), + + allTracks[0].tpcNClsFindable(), allTracks[1].tpcNClsFindable(), allTracks[2].tpcNClsFindable(), allTracks[3].tpcNClsFindable(), + + allTracks[0].itsChi2NCl(), allTracks[1].itsChi2NCl(), allTracks[2].itsChi2NCl(), allTracks[3].itsChi2NCl(), + + p1.Pt(), p2.Pt(), p3.Pt(), p4.Pt(), + p1.Eta(), p2.Eta(), p3.Eta(), p4.Eta(), + p1.Phi(), p2.Phi(), p3.Phi(), p4.Phi(), + p1.Rapidity(), p2.Rapidity(), p3.Rapidity(), p4.Rapidity(), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M()); } // end of non 0 charge event @@ -1420,31 +1316,6 @@ struct ExclusiveRhoTo4Pi { return; } - std::vector pipt; - std::vector pieta; - std::vector piphi; - std::vector pirapidity; - - pipt.push_back(piPlusvectors[0].Pt()); - pipt.push_back(piPlusvectors[1].Pt()); - pipt.push_back(piMinusvectors[0].Pt()); - pipt.push_back(piMinusvectors[1].Pt()); - - pieta.push_back(piPlusvectors[0].Eta()); - pieta.push_back(piPlusvectors[1].Eta()); - pieta.push_back(piMinusvectors[0].Eta()); - pieta.push_back(piMinusvectors[1].Eta()); - - piphi.push_back(piPlusvectors[0].Phi()); - piphi.push_back(piPlusvectors[1].Phi()); - piphi.push_back(piMinusvectors[0].Phi()); - piphi.push_back(piMinusvectors[1].Phi()); - - pirapidity.push_back(piPlusvectors[0].Rapidity()); - pirapidity.push_back(piPlusvectors[1].Rapidity()); - pirapidity.push_back(piMinusvectors[0].Rapidity()); - pirapidity.push_back(piMinusvectors[1].Rapidity()); - TLorentzVector p1234 = piPlusvectors[0] + piPlusvectors[1] + piMinusvectors[0] + piMinusvectors[1]; histosMCgen.fill(HIST("pion_pT"), piPlusvectors[0].Pt()); @@ -1492,7 +1363,10 @@ struct ExclusiveRhoTo4Pi { auto cosThetaPair2 = cosThetaCollinsSoperFrame(k14, k23, k1234); generatedMC( - pipt, pieta, piphi, pirapidity, + piPlusvectors[0].Pt(), piPlusvectors[1].Pt(), piMinusvectors[0].Pt(), piMinusvectors[1].Pt(), + piPlusvectors[0].Eta(), piPlusvectors[1].Eta(), piMinusvectors[0].Eta(), piMinusvectors[1].Eta(), + piPlusvectors[0].Phi(), piPlusvectors[1].Phi(), piMinusvectors[0].Phi(), piMinusvectors[1].Phi(), + piPlusvectors[0].Rapidity(), piPlusvectors[1].Rapidity(), piMinusvectors[0].Rapidity(), piMinusvectors[1].Rapidity(), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), phiPair1, phiPair2, cosThetaPair1, cosThetaPair2); @@ -1635,30 +1509,6 @@ struct ExclusiveRhoTo4Pi { // Selecting Events with net charge = 0 if (numPionMinusTRacks == 2 && numPiPlusTracks == 2) { - std::vector dcaxy; - std::vector dcaz; - - std::vector tpcnsigPi; - std::vector tpcnsigKa; - std::vector tpcnsigPr; - std::vector tpcnsigEl; - std::vector tpcnsigMu; - - std::vector tofnsigPi; - std::vector tofnsigKa; - std::vector tofnsigPr; - std::vector tofnsigEl; - std::vector tofnsigMu; - - std::vector tpcchi2; - std::vector tpcnclsfindable; - std::vector itschi2; - - std::vector pipt; - std::vector pieta; - std::vector piphi; - std::vector pirapidity; - TLorentzVector p1, p2, p3, p4, p1234; ROOT::Math::PtEtaPhiMVector k1, k2, k3, k4, k1234, k13, k14, k23, k24; @@ -1682,101 +1532,6 @@ struct ExclusiveRhoTo4Pi { k3.SetCoordinates(p3.Pt(), p3.Eta(), p3.Phi(), o2::constants::physics::MassPionCharged); k4.SetCoordinates(p4.Pt(), p4.Eta(), p4.Phi(), o2::constants::physics::MassPionCharged); - dcaxy.push_back(Pi_plus_tracks[0].dcaXY()); - dcaxy.push_back(Pi_plus_tracks[1].dcaXY()); - dcaxy.push_back(Pi_minus_tracks[0].dcaXY()); - dcaxy.push_back(Pi_minus_tracks[1].dcaXY()); - - dcaz.push_back(Pi_plus_tracks[0].dcaZ()); - dcaz.push_back(Pi_plus_tracks[1].dcaZ()); - dcaz.push_back(Pi_minus_tracks[0].dcaZ()); - dcaz.push_back(Pi_minus_tracks[1].dcaZ()); - - tpcnsigPi.push_back(Pi_plus_tracks[0].tpcNSigmaPi()); - tpcnsigPi.push_back(Pi_plus_tracks[1].tpcNSigmaPi()); - tpcnsigPi.push_back(Pi_minus_tracks[0].tpcNSigmaPi()); - tpcnsigPi.push_back(Pi_minus_tracks[1].tpcNSigmaPi()); - - tpcnsigKa.push_back(Pi_plus_tracks[0].tpcNSigmaKa()); - tpcnsigKa.push_back(Pi_plus_tracks[1].tpcNSigmaKa()); - tpcnsigKa.push_back(Pi_minus_tracks[0].tpcNSigmaKa()); - tpcnsigKa.push_back(Pi_minus_tracks[1].tpcNSigmaKa()); - - tpcnsigPr.push_back(Pi_plus_tracks[0].tpcNSigmaPr()); - tpcnsigPr.push_back(Pi_plus_tracks[1].tpcNSigmaPr()); - tpcnsigPr.push_back(Pi_minus_tracks[0].tpcNSigmaPr()); - tpcnsigPr.push_back(Pi_minus_tracks[1].tpcNSigmaPr()); - - tpcnsigEl.push_back(Pi_plus_tracks[0].tpcNSigmaEl()); - tpcnsigEl.push_back(Pi_plus_tracks[1].tpcNSigmaEl()); - tpcnsigEl.push_back(Pi_minus_tracks[0].tpcNSigmaEl()); - tpcnsigEl.push_back(Pi_minus_tracks[1].tpcNSigmaEl()); - - tpcnsigMu.push_back(Pi_plus_tracks[0].tpcNSigmaMu()); - tpcnsigMu.push_back(Pi_plus_tracks[1].tpcNSigmaMu()); - tpcnsigMu.push_back(Pi_minus_tracks[0].tpcNSigmaMu()); - tpcnsigMu.push_back(Pi_minus_tracks[1].tpcNSigmaMu()); - - tofnsigPi.push_back(Pi_plus_tracks[0].tofNSigmaPi()); - tofnsigPi.push_back(Pi_plus_tracks[1].tofNSigmaPi()); - tofnsigPi.push_back(Pi_minus_tracks[0].tofNSigmaPi()); - tofnsigPi.push_back(Pi_minus_tracks[1].tofNSigmaPi()); - - tofnsigKa.push_back(Pi_plus_tracks[0].tofNSigmaKa()); - tofnsigKa.push_back(Pi_plus_tracks[1].tofNSigmaKa()); - tofnsigKa.push_back(Pi_minus_tracks[0].tofNSigmaKa()); - tofnsigKa.push_back(Pi_minus_tracks[1].tofNSigmaKa()); - - tofnsigPr.push_back(Pi_plus_tracks[0].tofNSigmaPr()); - tofnsigPr.push_back(Pi_plus_tracks[1].tofNSigmaPr()); - tofnsigPr.push_back(Pi_minus_tracks[0].tofNSigmaPr()); - tofnsigPr.push_back(Pi_minus_tracks[1].tofNSigmaPr()); - - tofnsigEl.push_back(Pi_plus_tracks[0].tofNSigmaEl()); - tofnsigEl.push_back(Pi_plus_tracks[1].tofNSigmaEl()); - tofnsigEl.push_back(Pi_minus_tracks[0].tofNSigmaEl()); - tofnsigEl.push_back(Pi_minus_tracks[1].tofNSigmaEl()); - - tofnsigMu.push_back(Pi_plus_tracks[0].tofNSigmaMu()); - tofnsigMu.push_back(Pi_plus_tracks[1].tofNSigmaMu()); - tofnsigMu.push_back(Pi_minus_tracks[0].tofNSigmaMu()); - tofnsigMu.push_back(Pi_minus_tracks[1].tofNSigmaMu()); - - tpcchi2.push_back(Pi_plus_tracks[0].tpcChi2NCl()); - tpcchi2.push_back(Pi_plus_tracks[1].tpcChi2NCl()); - tpcchi2.push_back(Pi_minus_tracks[0].tpcChi2NCl()); - tpcchi2.push_back(Pi_minus_tracks[1].tpcChi2NCl()); - - tpcnclsfindable.push_back(Pi_plus_tracks[0].tpcNClsFindable()); - tpcnclsfindable.push_back(Pi_plus_tracks[1].tpcNClsFindable()); - tpcnclsfindable.push_back(Pi_minus_tracks[0].tpcNClsFindable()); - tpcnclsfindable.push_back(Pi_minus_tracks[1].tpcNClsFindable()); - - itschi2.push_back(Pi_plus_tracks[0].itsChi2NCl()); - itschi2.push_back(Pi_plus_tracks[1].itsChi2NCl()); - itschi2.push_back(Pi_minus_tracks[0].itsChi2NCl()); - itschi2.push_back(Pi_minus_tracks[1].itsChi2NCl()); - - pipt.push_back(p1.Pt()); - pipt.push_back(p2.Pt()); - pipt.push_back(p3.Pt()); - pipt.push_back(p4.Pt()); - - pieta.push_back(p1.Eta()); - pieta.push_back(p2.Eta()); - pieta.push_back(p3.Eta()); - pieta.push_back(p4.Eta()); - - piphi.push_back(p1.Phi()); - piphi.push_back(p2.Phi()); - piphi.push_back(p3.Phi()); - piphi.push_back(p4.Phi()); - - pirapidity.push_back(p1.Rapidity()); - pirapidity.push_back(p2.Rapidity()); - pirapidity.push_back(p3.Rapidity()); - pirapidity.push_back(p4.Rapidity()); - p1234 = p1 + p2 + p3 + p4; k1234 = k1 + k2 + k3 + k4; @@ -1795,11 +1550,20 @@ struct ExclusiveRhoTo4Pi { collision.totalFV0AmplitudeA(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), collision.timeFV0A(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFDDA(), collision.timeFDDC(), collision.timeZNA(), collision.timeZNC(), - dcaxy, dcaz, - tpcnsigPi, tpcnsigKa, tpcnsigPr, tpcnsigEl, tpcnsigMu, - tofnsigPi, tofnsigKa, tofnsigPr, tofnsigEl, tofnsigMu, - tpcchi2, tpcnclsfindable, itschi2, - pipt, pieta, piphi, pirapidity, + Pi_plus_tracks[0].dcaXY(), Pi_plus_tracks[1].dcaXY(), Pi_minus_tracks[0].dcaXY(), Pi_minus_tracks[1].dcaXY(), + Pi_plus_tracks[0].dcaZ(), Pi_plus_tracks[1].dcaZ(), Pi_minus_tracks[0].dcaZ(), Pi_minus_tracks[1].dcaZ(), + Pi_plus_tracks[0].tpcNSigmaPi(), Pi_plus_tracks[1].tpcNSigmaPi(), Pi_minus_tracks[0].tpcNSigmaPi(), Pi_minus_tracks[1].tpcNSigmaPi(), + Pi_plus_tracks[0].tpcNSigmaKa(), Pi_plus_tracks[1].tpcNSigmaKa(), Pi_minus_tracks[0].tpcNSigmaKa(), Pi_minus_tracks[1].tpcNSigmaKa(), + Pi_plus_tracks[0].tpcNSigmaPr(), Pi_plus_tracks[1].tpcNSigmaPr(), Pi_minus_tracks[0].tpcNSigmaPr(), Pi_minus_tracks[1].tpcNSigmaPr(), + Pi_plus_tracks[0].tpcNSigmaEl(), Pi_plus_tracks[1].tpcNSigmaEl(), Pi_minus_tracks[0].tpcNSigmaEl(), Pi_minus_tracks[1].tpcNSigmaEl(), + Pi_plus_tracks[0].tpcNSigmaMu(), Pi_plus_tracks[1].tpcNSigmaMu(), Pi_minus_tracks[0].tpcNSigmaMu(), Pi_minus_tracks[1].tpcNSigmaMu(), + Pi_plus_tracks[0].tpcChi2NCl(), Pi_plus_tracks[1].tpcChi2NCl(), Pi_minus_tracks[0].tpcChi2NCl(), Pi_minus_tracks[1].tpcChi2NCl(), + Pi_plus_tracks[0].tpcNClsFindable(), Pi_plus_tracks[1].tpcNClsFindable(), Pi_minus_tracks[0].tpcNClsFindable(), Pi_minus_tracks[1].tpcNClsFindable(), + Pi_plus_tracks[0].itsChi2NCl(), Pi_plus_tracks[1].itsChi2NCl(), Pi_minus_tracks[0].itsChi2NCl(), Pi_minus_tracks[1].itsChi2NCl(), + p1.Pt(), p2.Pt(), p3.Pt(), p4.Pt(), + p1.Eta(), p2.Eta(), p3.Eta(), p4.Eta(), + p1.Phi(), p2.Phi(), p3.Phi(), p4.Phi(), + p1.Rapidity(), p2.Rapidity(), p3.Rapidity(), p4.Rapidity(), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), phiPair1, phiPair2, cosThetaPair1, cosThetaPair2); @@ -1898,30 +1662,6 @@ struct ExclusiveRhoTo4Pi { if (pionPlusTracks.size() == 2 || pionMinusTracks.size() == 2) { - std::vector dcaxy; - std::vector dcaz; - - std::vector tpcnsigPi; - std::vector tpcnsigKa; - std::vector tpcnsigPr; - std::vector tpcnsigEl; - std::vector tpcnsigMu; - - std::vector tofnsigPi; - std::vector tofnsigKa; - std::vector tofnsigPr; - std::vector tofnsigEl; - std::vector tofnsigMu; - - std::vector tpcchi2; - std::vector tpcnclsfindable; - std::vector itschi2; - - std::vector pipt; - std::vector pieta; - std::vector piphi; - std::vector pirapidity; - TLorentzVector p1, p2, p3, p4, p1234; ROOT::Math::PtEtaPhiMVector k1, k2, k3, k4, k1234, k13, k14, k23, k24; @@ -1935,101 +1675,6 @@ struct ExclusiveRhoTo4Pi { k3.SetCoordinates(p3.Pt(), p3.Eta(), p3.Phi(), o2::constants::physics::MassPionCharged); k4.SetCoordinates(p4.Pt(), p4.Eta(), p4.Phi(), o2::constants::physics::MassPionCharged); - dcaxy.push_back(pionPlusTracks[0].dcaXY()); - dcaxy.push_back(pionPlusTracks[1].dcaXY()); - dcaxy.push_back(pionMinusTracks[0].dcaXY()); - dcaxy.push_back(pionMinusTracks[1].dcaXY()); - - dcaz.push_back(pionPlusTracks[0].dcaZ()); - dcaz.push_back(pionPlusTracks[1].dcaZ()); - dcaz.push_back(pionMinusTracks[0].dcaZ()); - dcaz.push_back(pionMinusTracks[1].dcaZ()); - - tpcnsigPi.push_back(pionPlusTracks[0].tpcNSigmaPi()); - tpcnsigPi.push_back(pionPlusTracks[1].tpcNSigmaPi()); - tpcnsigPi.push_back(pionMinusTracks[0].tpcNSigmaPi()); - tpcnsigPi.push_back(pionMinusTracks[1].tpcNSigmaPi()); - - tpcnsigKa.push_back(pionPlusTracks[0].tpcNSigmaKa()); - tpcnsigKa.push_back(pionPlusTracks[1].tpcNSigmaKa()); - tpcnsigKa.push_back(pionMinusTracks[0].tpcNSigmaKa()); - tpcnsigKa.push_back(pionMinusTracks[1].tpcNSigmaKa()); - - tpcnsigPr.push_back(pionPlusTracks[0].tpcNSigmaPr()); - tpcnsigPr.push_back(pionPlusTracks[1].tpcNSigmaPr()); - tpcnsigPr.push_back(pionMinusTracks[0].tpcNSigmaPr()); - tpcnsigPr.push_back(pionMinusTracks[1].tpcNSigmaPr()); - - tpcnsigEl.push_back(pionPlusTracks[0].tpcNSigmaEl()); - tpcnsigEl.push_back(pionPlusTracks[1].tpcNSigmaEl()); - tpcnsigEl.push_back(pionMinusTracks[0].tpcNSigmaEl()); - tpcnsigEl.push_back(pionMinusTracks[1].tpcNSigmaEl()); - - tpcnsigMu.push_back(pionPlusTracks[0].tpcNSigmaMu()); - tpcnsigMu.push_back(pionPlusTracks[1].tpcNSigmaMu()); - tpcnsigMu.push_back(pionMinusTracks[0].tpcNSigmaMu()); - tpcnsigMu.push_back(pionMinusTracks[1].tpcNSigmaMu()); - - tofnsigPi.push_back(pionPlusTracks[0].tofNSigmaPi()); - tofnsigPi.push_back(pionPlusTracks[1].tofNSigmaPi()); - tofnsigPi.push_back(pionMinusTracks[0].tofNSigmaPi()); - tofnsigPi.push_back(pionMinusTracks[1].tofNSigmaPi()); - - tofnsigKa.push_back(pionPlusTracks[0].tofNSigmaKa()); - tofnsigKa.push_back(pionPlusTracks[1].tofNSigmaKa()); - tofnsigKa.push_back(pionMinusTracks[0].tofNSigmaKa()); - tofnsigKa.push_back(pionMinusTracks[1].tofNSigmaKa()); - - tofnsigPr.push_back(pionPlusTracks[0].tofNSigmaPr()); - tofnsigPr.push_back(pionPlusTracks[1].tofNSigmaPr()); - tofnsigPr.push_back(pionMinusTracks[0].tofNSigmaPr()); - tofnsigPr.push_back(pionMinusTracks[1].tofNSigmaPr()); - - tofnsigEl.push_back(pionPlusTracks[0].tofNSigmaEl()); - tofnsigEl.push_back(pionPlusTracks[1].tofNSigmaEl()); - tofnsigEl.push_back(pionMinusTracks[0].tofNSigmaEl()); - tofnsigEl.push_back(pionMinusTracks[1].tofNSigmaEl()); - - tofnsigMu.push_back(pionPlusTracks[0].tofNSigmaMu()); - tofnsigMu.push_back(pionPlusTracks[1].tofNSigmaMu()); - tofnsigMu.push_back(pionMinusTracks[0].tofNSigmaMu()); - tofnsigMu.push_back(pionMinusTracks[1].tofNSigmaMu()); - - tpcchi2.push_back(pionPlusTracks[0].tpcChi2NCl()); - tpcchi2.push_back(pionPlusTracks[1].tpcChi2NCl()); - tpcchi2.push_back(pionMinusTracks[0].tpcChi2NCl()); - tpcchi2.push_back(pionMinusTracks[1].tpcChi2NCl()); - - tpcnclsfindable.push_back(pionPlusTracks[0].tpcNClsFindable()); - tpcnclsfindable.push_back(pionPlusTracks[1].tpcNClsFindable()); - tpcnclsfindable.push_back(pionMinusTracks[0].tpcNClsFindable()); - tpcnclsfindable.push_back(pionMinusTracks[1].tpcNClsFindable()); - - itschi2.push_back(pionPlusTracks[0].itsChi2NCl()); - itschi2.push_back(pionPlusTracks[1].itsChi2NCl()); - itschi2.push_back(pionMinusTracks[0].itsChi2NCl()); - itschi2.push_back(pionMinusTracks[1].itsChi2NCl()); - - pipt.push_back(p1.Pt()); - pipt.push_back(p2.Pt()); - pipt.push_back(p3.Pt()); - pipt.push_back(p4.Pt()); - - pieta.push_back(p1.Eta()); - pieta.push_back(p2.Eta()); - pieta.push_back(p3.Eta()); - pieta.push_back(p4.Eta()); - - piphi.push_back(p1.Phi()); - piphi.push_back(p2.Phi()); - piphi.push_back(p3.Phi()); - piphi.push_back(p4.Phi()); - - pirapidity.push_back(p1.Rapidity()); - pirapidity.push_back(p2.Rapidity()); - pirapidity.push_back(p3.Rapidity()); - pirapidity.push_back(p4.Rapidity()); - p1234 = p1 + p2 + p3 + p4; k1234 = k1 + k2 + k3 + k4; @@ -2046,22 +1691,37 @@ struct ExclusiveRhoTo4Pi { sigFromMC( collision.posX(), collision.posY(), collision.posZ(), collision.totalFV0AmplitudeA(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), - collision.timeFV0A(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFDDA(), collision.timeFDDC(), - collision.timeZNA(), collision.timeZNC(), - dcaxy, dcaz, - tpcnsigPi, tpcnsigKa, tpcnsigPr, tpcnsigEl, tpcnsigMu, - tofnsigPi, tofnsigKa, tofnsigPr, tofnsigEl, tofnsigMu, - tpcchi2, tpcnclsfindable, itschi2, - pipt, pieta, piphi, pirapidity, + collision.timeFV0A(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFDDA(), collision.timeFDDC(), collision.timeZNA(), collision.timeZNC(), + pionPlusTracks[0].dcaXY(), pionPlusTracks[1].dcaXY(), pionMinusTracks[0].dcaXY(), pionMinusTracks[1].dcaXY(), + + pionPlusTracks[0].dcaZ(), pionPlusTracks[1].dcaZ(), pionMinusTracks[0].dcaZ(), pionMinusTracks[1].dcaZ(), + + pionPlusTracks[0].tpcNSigmaPi(), pionPlusTracks[1].tpcNSigmaPi(), pionMinusTracks[0].tpcNSigmaPi(), pionMinusTracks[1].tpcNSigmaPi(), + + pionPlusTracks[0].tpcNSigmaKa(), pionPlusTracks[1].tpcNSigmaKa(), pionMinusTracks[0].tpcNSigmaKa(), pionMinusTracks[1].tpcNSigmaKa(), + + pionPlusTracks[0].tpcNSigmaPr(), pionPlusTracks[1].tpcNSigmaPr(), pionMinusTracks[0].tpcNSigmaPr(), pionMinusTracks[1].tpcNSigmaPr(), + + pionPlusTracks[0].tpcNSigmaEl(), pionPlusTracks[1].tpcNSigmaEl(), pionMinusTracks[0].tpcNSigmaEl(), pionMinusTracks[1].tpcNSigmaEl(), + + pionPlusTracks[0].tpcNSigmaMu(), pionPlusTracks[1].tpcNSigmaMu(), pionMinusTracks[0].tpcNSigmaMu(), pionMinusTracks[1].tpcNSigmaMu(), + + pionPlusTracks[0].tpcChi2NCl(), pionPlusTracks[1].tpcChi2NCl(), pionMinusTracks[0].tpcChi2NCl(), pionMinusTracks[1].tpcChi2NCl(), + pionPlusTracks[0].tpcNClsFindable(), pionPlusTracks[1].tpcNClsFindable(), pionMinusTracks[0].tpcNClsFindable(), pionMinusTracks[1].tpcNClsFindable(), + pionPlusTracks[0].itsChi2NCl(), pionPlusTracks[1].itsChi2NCl(), pionMinusTracks[0].itsChi2NCl(), pionMinusTracks[1].itsChi2NCl(), + p1.Pt(), p2.Pt(), p3.Pt(), p4.Pt(), + p1.Eta(), p2.Eta(), p3.Eta(), p4.Eta(), + p1.Phi(), p2.Phi(), p3.Phi(), p4.Phi(), + p1.Rapidity(), p2.Rapidity(), p3.Rapidity(), p4.Rapidity(), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiPhiPair1, fourPiPhiPair2, fourPiCosThetaPair1, fourPiCosThetaPair2); - histosFast.fill(HIST("4PionPt"), p1234.Pt()); - histosFast.fill(HIST("4PionRapidity"), p1234.Rapidity()); - histosFast.fill(HIST("4PionMassFull"), p1234.M()); + histosFastMCreco.fill(HIST("4PionPt"), p1234.Pt()); + histosFastMCreco.fill(HIST("4PionRapidity"), p1234.Rapidity()); + histosFastMCreco.fill(HIST("4PionMassFull"), p1234.M()); if ((p1234.Pt() < 0.15) && (std::abs(p1234.Rapidity()) < 0.5)) { - histosFast.fill(HIST("4PionMassWithCut"), p1234.M()); + histosFastMCreco.fill(HIST("4PionMassWithCut"), p1234.M()); } } // End 0 charge event } // End of 4 Pion Analysis Process function for Fast MC Reconstruction From b334a5f1f6421bfc54d6da10d6fe8e41d76ed223 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Sat, 22 Mar 2025 12:36:45 +0900 Subject: [PATCH 0797/1650] PWGEM/PhotonMeson: fix histogram name in pcmQCMC.cxx (#10612) --- PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx index df7ba5be443..98eb7a44219 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx @@ -114,7 +114,7 @@ struct PCMQCMC { HistogramRegistry fRegistry{"output", {}, OutputObjHandlingPolicy::AnalysisObject, false, false}; static constexpr std::string_view event_types[2] = {"before/", "after/"}; - static constexpr std::string_view mcphoton_types[5] = {"primary/", "fromWD/", "fromHS/", "fromPi0Dalitz/", "fromEtaDalitz"}; + static constexpr std::string_view mcphoton_types[5] = {"primary/", "fromWD/", "fromHS/", "fromPi0Dalitz/", "fromEtaDalitz/"}; void init(InitContext&) { From 2264e3e684736301cc7c2370c8dbf768c562511b Mon Sep 17 00:00:00 2001 From: Chiara Pinto <48326672+chiarapinto@users.noreply.github.com> Date: Sat, 22 Mar 2025 15:56:11 +0100 Subject: [PATCH 0798/1650] [PWGLF] small change to match logics and naming (#10615) --- PWGLF/Tasks/Nuspex/antinucleiInJets.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx index 7f3e3d74356..a6cb0ad90fa 100644 --- a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx +++ b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx @@ -451,10 +451,10 @@ struct AntinucleiInJets { static std::mt19937 gen(rd()); static std::uniform_int_distribution<> dis(0, 99); int randomNumber = dis(gen); - if (randomNumber <= rejectionPercentage) { - return false; + if (randomNumber > rejectionPercentage) { + return false; // accept event } - return true; + return true; // reject event } // Process Data From 6b543d74ceed9afee9d9db1e441cb092987145e7 Mon Sep 17 00:00:00 2001 From: Francesca Ercolessi Date: Sat, 22 Mar 2025 15:56:25 +0100 Subject: [PATCH 0799/1650] [PWGLF] nuclei-proton correlation, add de spectrum (#10613) --- .../Tasks/Nuspex/hadronnucleicorrelation.cxx | 34 ++++++++++++------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx b/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx index fc52760aa3c..6407e12a3c9 100644 --- a/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx +++ b/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx @@ -193,12 +193,12 @@ struct hadronnucleicorrelation { AxisSpec ptBinnedAxis = {pTBins, "#it{p}_{T} of #bar{p} (GeV/c)"}; AxisSpec etaAxis = {100, -1., 1., "#eta"}; - AxisSpec phiAxis = {157, 0., 2 * TMath::Pi(), "#phi (rad)"}; + AxisSpec phiAxis = {157, 0., 2 * o2::constants::math::PI, "#phi (rad)"}; AxisSpec pTAxis = {200, -10.f, 10.f, "p_{T} GeV/c"}; AxisSpec pTAxis_small = {100, -5.f, 5.f, "p_{T} GeV/c"}; AxisSpec DeltaEtaAxis = {100, -1.5, 1.5, "#Delta#eta"}; - AxisSpec DeltaPhiAxis = {60, -TMath::Pi() / 2, 1.5 * TMath::Pi(), "#Delta#phi (rad)"}; + AxisSpec DeltaPhiAxis = {60, -o2::constants::math::PI / 2, 1.5 * o2::constants::math::PI, "#Delta#phi (rad)"}; registry.add("hNEvents", "hNEvents", {HistType::kTH1D, {{5, 0.f, 5.f}}}); registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(1, "Selected"); @@ -329,12 +329,12 @@ struct hadronnucleicorrelation { if (doMCQA) { registry.add("hResEta_Proton", "; #eta(gen); #eta(reco) - #eta(gen) ", {HistType::kTH2F, {{100, -1.f, 1.f, "#eta(gen)"}, {200, -0.5f, 0.5f, "#eta(reco) - #eta(gen) "}}}); registry.add("hResEta_Deuteron", "; #eta(gen); #eta(reco) - #eta(gen) ", {HistType::kTH2F, {{100, -1.f, 1.f, "#eta(gen)"}, {200, -0.5f, 0.5f, "#eta(reco) - #eta(gen) "}}}); - registry.add("hResPhi_Proton", "; #phi(gen); #phi(reco) - #phi(gen)", {HistType::kTH2F, {{100, 0.f, 2 * TMath::Pi(), "#phi(gen)"}, {200, -0.5f, 0.5f, "#phi(reco) - #phi(gen)"}}}); - registry.add("hResPhi_Deuteron", "; #phi(gen); #phi(reco) - #phi(gen)", {HistType::kTH2F, {{100, 0.f, 2 * TMath::Pi(), "#phi(gen)"}, {200, -0.5f, 0.5f, "#phi(reco) - #phi(gen)"}}}); + registry.add("hResPhi_Proton", "; #phi(gen); #phi(reco) - #phi(gen)", {HistType::kTH2F, {{100, 0.f, 2 * o2::constants::math::PI, "#phi(gen)"}, {200, -0.5f, 0.5f, "#phi(reco) - #phi(gen)"}}}); + registry.add("hResPhi_Deuteron", "; #phi(gen); #phi(reco) - #phi(gen)", {HistType::kTH2F, {{100, 0.f, 2 * o2::constants::math::PI, "#phi(gen)"}, {200, -0.5f, 0.5f, "#phi(reco) - #phi(gen)"}}}); registry.add("hResEta_AntiProton", "; #eta(gen); #eta(reco) - #eta(gen) ", {HistType::kTH2F, {{100, -1.f, 1.f, "#eta(gen)"}, {200, -0.5f, 0.5f, "#eta(reco) - #eta(gen) "}}}); registry.add("hResEta_AntiDeuteron", "; #eta(gen); #eta(reco) - #eta(gen) ", {HistType::kTH2F, {{100, -1.f, 1.f, "#eta(gen)"}, {200, -0.5f, 0.5f, "#eta(reco) - #eta(gen) "}}}); - registry.add("hResPhi_AntiProton", "; #phi(gen); #phi(reco) - #phi(gen)", {HistType::kTH2F, {{100, 0.f, 2 * TMath::Pi(), "#phi(gen)"}, {200, -0.5f, 0.5f, "#phi(reco) - #phi(gen)"}}}); - registry.add("hResPhi_AntiDeuteron", "; #phi(gen); #phi(reco) - #phi(gen)", {HistType::kTH2F, {{100, 0.f, 2 * TMath::Pi(), "#phi(gen)"}, {200, -0.5f, 0.5f, "#phi(reco) - #phi(gen)"}}}); + registry.add("hResPhi_AntiProton", "; #phi(gen); #phi(reco) - #phi(gen)", {HistType::kTH2F, {{100, 0.f, 2 * o2::constants::math::PI, "#phi(gen)"}, {200, -0.5f, 0.5f, "#phi(reco) - #phi(gen)"}}}); + registry.add("hResPhi_AntiDeuteron", "; #phi(gen); #phi(reco) - #phi(gen)", {HistType::kTH2F, {{100, 0.f, 2 * o2::constants::math::PI, "#phi(gen)"}, {200, -0.5f, 0.5f, "#phi(reco) - #phi(gen)"}}}); registry.add("hNumeratorPurity_Proton_TPC", " p(#bar{p}); p_{T} (GeV/c);S", {HistType::kTH1F, {pTAxis_small}}); registry.add("hNumeratorPurity_Deuteron_TPC", " d(#bar{d}); p_{T} (GeV/c);S", {HistType::kTH1F, {pTAxis_small}}); @@ -385,6 +385,9 @@ struct hadronnucleicorrelation { registry.get(HIST("Generated/hQADeuterons"))->GetXaxis()->SetBinLabel(1, "All"); registry.get(HIST("Generated/hQADeuterons"))->GetXaxis()->SetBinLabel(2, "PhysicalPrimary"); registry.get(HIST("Generated/hQADeuterons"))->GetXaxis()->SetBinLabel(3, "|#eta|<0.8"); + + registry.add("Generated/hDeuteronsVsPt", "hDeuteronsVsPt; p_{T} (GeV/c);", {HistType::kTH1D, {{100, 0.f, 10.f}}}); + registry.add("Generated/hAntiDeuteronsVsPt", "hAntiDeuteronsVsPt; p_{T} (GeV/c);", {HistType::kTH1D, {{100, 0.f, 10.f}}}); } } @@ -509,9 +512,9 @@ struct hadronnucleicorrelation { { bool passcut = true; // pt-dependent selection - if (TMath::Abs(track.dcaXY()) > (par0 + par1 / track.pt())) + if (std::abs(track.dcaXY()) > (par0 + par1 / track.pt())) passcut = false; - if (TMath::Abs(track.dcaZ()) > (par0 + par1 / track.pt())) + if (std::abs(track.dcaZ()) > (par0 + par1 / track.pt())) passcut = false; return passcut; @@ -635,10 +638,10 @@ struct hadronnucleicorrelation { float getDeltaPhi(float deltaPhi) { - if (deltaPhi < -TMath::Pi() / 2) { - return deltaPhi += 2 * TMath::Pi(); - } else if (deltaPhi >= 3 * TMath::Pi() / 2) { - return deltaPhi -= 2 * TMath::Pi(); + if (deltaPhi < -o2::constants::math::PI / 2) { + return deltaPhi += 2 * o2::constants::math::PI; + } else if (deltaPhi >= 3 * o2::constants::math::PI / 2) { + return deltaPhi -= 2 * o2::constants::math::PI; } return deltaPhi; } @@ -1356,6 +1359,13 @@ struct hadronnucleicorrelation { registry.fill(HIST("Generated/hQADeuterons"), 1.5); } + if (particle.pdgCode() == pdgDeuteron && std::abs(particle.y()) < 0.5) { + registry.fill(HIST("Generated/hDeuteronsVsPt"), particle.pt()); + } + if (particle.pdgCode() == -pdgDeuteron && std::abs(particle.y()) < 0.5) { + registry.fill(HIST("Generated/hAntiDeuteronsVsPt"), particle.pt()); + } + if (std::abs(particle.eta()) > etacut) { continue; } From b084e5834c57f2f6f90b5e06b30e7809521af151 Mon Sep 17 00:00:00 2001 From: Debadatta3337 Date: Sun, 23 Mar 2025 15:46:46 +0530 Subject: [PATCH 0800/1650] [PWGDQ] Added mass vs VtxNContrib 2D plot (#10614) Co-authored-by: Debadatta3337 --- PWGDQ/Core/HistogramsLibrary.cxx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 1b180349c7a..8d92572197e 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -915,6 +915,9 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h } if (!groupStr.CompareTo("pair")) { + if (subGroupStr.Contains("mult_pvcontrib")) { + hm->AddHistogram(histClass, "Mass_VtxNcontribReal", "Mass vs VtxNcontribReal", false, 200, 2.0, 5.0, VarManager::kMass, 200, 0, 200.0, VarManager::kVtxNcontribReal); + } if (subGroupStr.Contains("barrel")) { hm->AddHistogram(histClass, "Mass", "", false, 500, 0.0, 5.0, VarManager::kMass); hm->AddHistogram(histClass, "Mass_HighRange", "", false, 375, 0.0, 15.0, VarManager::kMass); From d4249bf88620c438dae4b4ea2ab846211a2289b9 Mon Sep 17 00:00:00 2001 From: basiach <74355517+basiach@users.noreply.github.com> Date: Sun, 23 Mar 2025 15:05:51 +0100 Subject: [PATCH 0801/1650] [PWGCF] FemtoUniverse - Adding a TOF nSigma cut to cascade correlations (#10619) Co-authored-by: Barbara Chytla --- .../Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx index ac6959b3837..5c35aeccbd2 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx @@ -415,6 +415,8 @@ struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/st /// Child particles must pass this condition to be selected if (!isParticleTPC(posChild, CascChildTable[confCascType1][0]) || !isParticleTPC(negChild, CascChildTable[confCascType1][1]) || !isParticleTPC(bachelor, CascChildTable[confCascType1][2])) continue; + if (!isParticleTOF(posChild, CascChildTable[confCascType1][0]) || !isParticleTOF(negChild, CascChildTable[confCascType1][1]) || !isParticleTOF(bachelor, CascChildTable[confCascType1][2])) + continue; sameEventCont.setPair(p1, p2, multCol, confUse3D, 1.0f); } @@ -527,6 +529,9 @@ struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/st /// Child particles must pass this condition to be selected if (!isParticleTPC(posChild, CascChildTable[confCascType1][0]) || !isParticleTPC(negChild, CascChildTable[confCascType1][1]) || !isParticleTPC(bachelor, CascChildTable[confCascType1][2])) continue; + if (!isParticleTOF(posChild, CascChildTable[confCascType1][0]) || !isParticleTOF(negChild, CascChildTable[confCascType1][1]) || !isParticleTOF(bachelor, CascChildTable[confCascType1][2])) + continue; + // track cleaning if (!pairCleaner.isCleanPair(p1, p2, parts)) { continue; From ed1c8cfeb821bae0b8afae3b216656f001dbcd54 Mon Sep 17 00:00:00 2001 From: ilikmeta <152337132+ilikmeta@users.noreply.github.com> Date: Sun, 23 Mar 2025 15:01:30 -0500 Subject: [PATCH 0802/1650] [PWGCF] Remove Nch sum from track selection (#10617) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/flowGfwTask.cxx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowGfwTask.cxx b/PWGCF/Flow/Tasks/flowGfwTask.cxx index b9987dd61e4..51be0daaa0d 100644 --- a/PWGCF/Flow/Tasks/flowGfwTask.cxx +++ b/PWGCF/Flow/Tasks/flowGfwTask.cxx @@ -655,7 +655,7 @@ struct FlowGfwTask { effNch = mEfficiencyNch->GetBinContent(mEfficiencyNch->FindBin(nch)); else effNch = 1.0; - if (effNch == 0) + if (effNch == 0.0) return false; weight_nueNch = 1. / effNch; return true; @@ -1012,7 +1012,6 @@ struct FlowGfwTask { if (cfgGlobalplusITS) { if (withinPtRef) { - nch++; registry.fill(HIST("GlobalplusITS"), centrality, nch); fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), wacc * weff, 1); } @@ -1021,7 +1020,6 @@ struct FlowGfwTask { if (track.hasTPC()) { if (cfgGlobalonly) { if (withinPtRef) { - nch++; registry.fill(HIST("Globalonly"), centrality, nch); registry.fill(HIST("pt_Cen_GlobalOnly"), centrality, track.pt()); registry.fill(HIST("phi_Cen_GlobalOnly"), centrality, track.phi()); @@ -1031,7 +1029,6 @@ struct FlowGfwTask { } else { if (cfgITSonly) { if (withinPtRef) { - nch++; registry.fill(HIST("ITSonly"), centrality, nch); registry.fill(HIST("pt_Cen_ITSOnly"), centrality, track.pt()); registry.fill(HIST("phi_Cen_ITSOnly"), centrality, track.phi()); From e48f0d12ec2b737f7ccd3b48655eea5d4c79aac1 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Mon, 24 Mar 2025 09:39:39 +0100 Subject: [PATCH 0803/1650] [PWGLF,Trigger] Trigger task to select events with 2 phi meson (#10607) --- EventFiltering/CMakeLists.txt | 7 +- EventFiltering/PWGLF/filterdoublephi.cxx | 279 +++++++++++++++++++++++ EventFiltering/filterTables.h | 18 +- 3 files changed, 298 insertions(+), 6 deletions(-) create mode 100644 EventFiltering/PWGLF/filterdoublephi.cxx diff --git a/EventFiltering/CMakeLists.txt b/EventFiltering/CMakeLists.txt index af42d63b16c..fdb15598747 100644 --- a/EventFiltering/CMakeLists.txt +++ b/EventFiltering/CMakeLists.txt @@ -112,6 +112,11 @@ o2physics_add_dpl_workflow(lf-f1proton-filter PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DetectorsBase COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(lf-doublephi-filter + SOURCES PWGLF/filterdoublephi.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DetectorsBase + COMPONENT_NAME Analysis) + o2physics_add_library(EventFilteringUtils SOURCES Zorro.cxx ZorroSummary.cxx INSTALL_HEADERS ZorroHelper.h ZorroSummary.h @@ -119,4 +124,4 @@ o2physics_add_library(EventFilteringUtils o2physics_target_root_dictionary(EventFilteringUtils HEADERS ZorroHelper.h ZorroSummary.h - LINKDEF EventFilteringUtilsLinkDef.h) \ No newline at end of file + LINKDEF EventFilteringUtilsLinkDef.h) diff --git a/EventFiltering/PWGLF/filterdoublephi.cxx b/EventFiltering/PWGLF/filterdoublephi.cxx new file mode 100644 index 00000000000..e6561a07c8c --- /dev/null +++ b/EventFiltering/PWGLF/filterdoublephi.cxx @@ -0,0 +1,279 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file filterdoublephi.cxx +/// \brief Selection of events with triplets and pairs for femtoscopic studies +/// +/// \author Sourav Kundu, sourav.kundu@cern.ch + +#include +#include +#include +#include +#include +#include // FIXME +#include // FIXME + +#include +#include +#include +#include + +#include "../filterTables.h" +#include "PWGLF/DataModel/ReducedDoublePhiTables.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/runDataProcessing.h" +#include "CommonConstants/MathConstants.h" +#include "Common/Core/TrackSelection.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/PIDResponse.h" +#include "DataFormatsTPC/BetheBlochAleph.h" +#include "CCDB/BasicCCDBManager.h" +#include "CCDB/CcdbApi.h" +#include "Common/DataModel/PIDResponseITS.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +struct filterdoublephi { + + // Produce derived tables + Produces tags; + + // events + Configurable cfgCutVertex{"cfgCutVertex", 10.0f, "Accepted z-vertex range"}; + // Configurable cfgCutCentralityMax{"cfgCutCentralityMax", 0.0f, "Accepted maximum Centrality"}; + // Configurable cfgCutCentralityMin{"cfgCutCentralityMin", 100.0f, "Accepted minimum Centrality"}; + // track + Configurable isPtdepPID1{"isPtdepPID1", false, "use pt dep PID kplus"}; + Configurable isPtdepPID2{"isPtdepPID2", false, "use pt dep PID kminus"}; + Configurable useGlobalTrack{"useGlobalTrack", true, "use Global track"}; + Configurable cfgCutTOFBeta{"cfgCutTOFBeta", 0.0, "cut TOF beta"}; + Configurable cfgCutCharge{"cfgCutCharge", 0.0, "cut on Charge"}; + Configurable cfgCutPT{"cfgCutPT", 0.2, "PT cut on daughter track"}; + Configurable cfgCutEta{"cfgCutEta", 0.8, "Eta cut on daughter track"}; + Configurable cfgCutDCAxy{"cfgCutDCAxy", 2.0f, "DCAxy range for tracks"}; + Configurable cfgCutDCAz{"cfgCutDCAz", 2.0f, "DCAz range for tracks"}; + Configurable nsigmaCutTPC{"nsigmacutTPC", -2.0, "Value of the TPC Nsigma cut"}; + Configurable nsigmaCutTPCPreSel{"nsigmacutTPCPreSel", 3.0, "Value of the TPC Nsigma cut Pre selection"}; + Configurable nsigmaCutTOF{"nsigmaCutTOF", 3.0, "Value of the TOF Nsigma cut"}; + Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; + Configurable cfgTPCcluster{"cfgTPCcluster", 70, "Number of TPC cluster"}; + Configurable isDeepAngle{"isDeepAngle", true, "Deep Angle cut"}; + Configurable cfgDeepAngle{"cfgDeepAngle", 0.04, "Deep Angle cut value"}; + ConfigurableAxis configThnAxisInvMass{"configThnAxisInvMass", {120, 0.98, 1.1}, "#it{M} (GeV/#it{c}^{2})"}; + ConfigurableAxis configThnAxisPt{"configThnAxisPt", {100, 0.0, 10.}, "#it{p}_{T} (GeV/#it{c})"}; + Configurable minPhiMass{"minPhiMass", 1.01, "Minimum phi mass"}; + Configurable maxPhiMass{"maxPhiMass", 1.03, "Maximum phi mass"}; + Configurable MinPhiPairPt{"MinPhiPairPt", 2.0, "Minimum phi pair Pt"}; + Configurable MinPhiPairMass{"MinPhiPairMass", 2.5, "Minimum phi pair mass"}; + Configurable MaxPhiPairMass{"MaxPhiPairMass", 3.0, "Max phi pair mass"}; + + // Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; + // Filter centralityFilter = (nabs(aod::cent::centFT0C) < cfgCutCentralityMax && nabs(aod::cent::centFT0C) > cfgCutCentralityMin); + Filter acceptanceFilter = (nabs(aod::track::eta) < cfgCutEta && nabs(aod::track::pt) > cfgCutPT); + Filter DCAcutFilter = (nabs(aod::track::dcaXY) < cfgCutDCAxy) && (nabs(aod::track::dcaZ) < cfgCutDCAz); + Filter PIDcutFilter = nabs(aod::pidtpc::tpcNSigmaKa) < nsigmaCutTPCPreSel; + + // using EventCandidates = soa::Filtered>; + using EventCandidates = soa::Join; + using TrackCandidates = soa::Filtered>; + + SliceCache cache; + Partition posTracks = aod::track::signed1Pt > cfgCutCharge; + Partition negTracks = aod::track::signed1Pt < cfgCutCharge; + + // Histogram + OutputObj hProcessedEvents{TH1D("hProcessedEvents", ";; Number of events", 3, 0.0f, 3.0f)}; + HistogramRegistry qaRegistry{"QAHistos", { + {"hInvMassPhi", "hInvMassPhi", {HistType::kTH2F, {{40, 1.0f, 1.04f}, {100, 0.0f, 10.0f}}}}, + {"hInvMassDoublePhi", "hInvMassDoublePhi", {HistType::kTH2F, {{1000, 2.0f, 3.0f}, {100, 0.0f, 10.0f}}}}, + {"hNsigmaPtkaonTPC", "hNsigmaPtkaonTPC", {HistType::kTH2F, {{200, -10.0f, 10.0f}, {100, 0.0f, 10.0f}}}}, + {"hNsigmaPtkaonTOF", "hNsigmaPtkaonTOF", {HistType::kTH2F, {{200, -10.0f, 10.0f}, {100, 0.0f, 10.0f}}}}, + }, + OutputObjHandlingPolicy::AnalysisObject}; + + double massKa = o2::constants::physics::MassKPlus; + + void init(o2::framework::InitContext&) + { + hProcessedEvents->GetXaxis()->SetBinLabel(1, "All events"); + hProcessedEvents->GetXaxis()->SetBinLabel(2, "Events with double Phi without sel."); + hProcessedEvents->GetXaxis()->SetBinLabel(3, aod::filtering::TriggerEventDoublePhi::columnLabel()); + } + + template + bool selectionTrack(const T& candidate) + { + if (useGlobalTrack && !(candidate.isGlobalTrack() && candidate.isPVContributor() && candidate.itsNCls() > cfgITScluster && candidate.tpcNClsCrossedRows() > cfgTPCcluster)) { + return false; + } + return true; + } + template + bool selectionPID(const T& candidate) + { + if (candidate.pt() < 0.5 && candidate.tpcNSigmaKa() > nsigmaCutTPC && candidate.tpcNSigmaKa() < 3.0) { + return true; + } + if (candidate.pt() >= 0.5) { + if (!candidate.hasTOF() && candidate.tpcNSigmaKa() > nsigmaCutTPC && candidate.tpcNSigmaKa() < 3.0) { + return true; + } + if (candidate.hasTOF() && candidate.beta() > cfgCutTOFBeta && candidate.tpcNSigmaKa() > nsigmaCutTPC && candidate.tpcNSigmaKa() < 3.0 && TMath::Abs(candidate.tofNSigmaKa()) < nsigmaCutTOF) { + return true; + } + } + return false; + } + template + bool selectionPID2(const T& candidate) + { + if (candidate.pt() < 0.5 && candidate.tpcNSigmaKa() > nsigmaCutTPC && candidate.tpcNSigmaKa() < 3.0) { + return true; + } + if (candidate.pt() >= 0.5) { + if (candidate.hasTOF() && candidate.beta() > cfgCutTOFBeta && candidate.tpcNSigmaKa() > nsigmaCutTPC && candidate.tpcNSigmaKa() < 3.0 && TMath::Abs(candidate.tofNSigmaKa()) < nsigmaCutTOF) { + return true; + } + } + return false; + } + // deep angle cut on pair to remove photon conversion + template + bool selectionPair(const T1& candidate1, const T2& candidate2) + { + double pt1, pt2, pz1, pz2, p1, p2, angle; + pt1 = candidate1.pt(); + pt2 = candidate2.pt(); + pz1 = candidate1.pz(); + pz2 = candidate2.pz(); + p1 = candidate1.p(); + p2 = candidate2.p(); + angle = TMath::ACos((pt1 * pt2 + pz1 * pz2) / (p1 * p2)); + if (isDeepAngle && angle < cfgDeepAngle) { + return false; + } + return true; + } + + ROOT::Math::PxPyPzMVector KaonPlus, KaonMinus, PhiMesonMother, PhiVectorDummy, PhiVectorDummy2, PhiPair; + void processPhiReducedTable(EventCandidates::iterator const& collision, TrackCandidates const&, aod::BCsWithTimestamps const&) + { + bool keepEventDoublePhi = false; + int numberPhi = 0; + o2::aod::ITSResponse itsResponse; + std::vector Phid1Index = {}; + std::vector Phid2Index = {}; + std::vector phiresonance, phiresonanced1, phiresonanced2; + int Npostrack = 0; + int Nnegtrack = 0; + hProcessedEvents->Fill(0.5); + if (collision.sel8()) { + auto posThisColl = posTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + auto negThisColl = negTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + for (auto track1 : posThisColl) { + // track selection + if (!selectionTrack(track1)) { + continue; + } + // PID check + if (isPtdepPID1 && !selectionPID2(track1)) { + continue; + } + if (!isPtdepPID1 && !selectionPID(track1)) { + continue; + } + if (track1.pt() > 0.4 && track1.pt() < 1.0 && !(itsResponse.nSigmaITS(track1) > -2.0 && itsResponse.nSigmaITS(track1) < 3.0)) { + continue; + } + Npostrack = Npostrack + 1; + qaRegistry.fill(HIST("hNsigmaPtkaonTPC"), track1.tpcNSigmaKa(), track1.pt()); + if (track1.hasTOF()) { + qaRegistry.fill(HIST("hNsigmaPtkaonTOF"), track1.tofNSigmaKa(), track1.pt()); + } + auto track1ID = track1.globalIndex(); + for (auto track2 : negThisColl) { + // track selection + if (!selectionTrack(track2)) { + continue; + } + // PID check + if (isPtdepPID2 && !selectionPID2(track2)) { + continue; + } + if (!isPtdepPID2 && !selectionPID(track2)) { + continue; + } + if (track2.pt() > 0.4 && track2.pt() < 1.0 && !(itsResponse.nSigmaITS(track2) > -2.0 && itsResponse.nSigmaITS(track2) < 3.0)) { + continue; + } + if (Npostrack == 1) { + Nnegtrack = Nnegtrack + 1; + } + auto track2ID = track2.globalIndex(); + if (track2ID == track1ID) { + continue; + } + if (!selectionPair(track1, track2)) { + continue; + } + KaonPlus = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); + KaonMinus = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massKa); + PhiMesonMother = KaonPlus + KaonMinus; + if (PhiMesonMother.M() > minPhiMass && PhiMesonMother.M() < maxPhiMass) { + numberPhi = numberPhi + 1; + ROOT::Math::PtEtaPhiMVector temp1(track1.pt(), track1.eta(), track1.phi(), massKa); + ROOT::Math::PtEtaPhiMVector temp2(track2.pt(), track2.eta(), track2.phi(), massKa); + ROOT::Math::PtEtaPhiMVector temp3(PhiMesonMother.pt(), PhiMesonMother.eta(), PhiMesonMother.phi(), PhiMesonMother.M()); + phiresonanced1.push_back(temp1); + phiresonanced2.push_back(temp2); + phiresonance.push_back(temp3); + Phid1Index.push_back(track1.globalIndex()); + Phid2Index.push_back(track2.globalIndex()); + qaRegistry.fill(HIST("hInvMassPhi"), PhiMesonMother.M(), PhiMesonMother.Pt()); + } + } + } + } // select collision + if (numberPhi > 1 && Npostrack > 1 && Nnegtrack > 1 && (phiresonance.size() == phiresonanced1.size()) && (phiresonance.size() == phiresonanced2.size())) { + hProcessedEvents->Fill(1.5); + for (auto if1 = phiresonance.begin(); if1 != phiresonance.end(); ++if1) { + auto i5 = std::distance(phiresonance.begin(), if1); + PhiVectorDummy = phiresonance.at(i5); + for (auto if2 = if1 + 1; if2 != phiresonance.end(); ++if2) { + auto i6 = std::distance(phiresonance.begin(), if2); + PhiVectorDummy2 = phiresonance.at(i6); + PhiPair = PhiVectorDummy + PhiVectorDummy2; + if ((Phid1Index.at(i5) != Phid1Index.at(i6)) && (Phid2Index.at(i5) != Phid2Index.at(i6)) && PhiPair.M() > MinPhiPairMass && PhiPair.M() < MaxPhiPairMass && PhiPair.Pt() > MinPhiPairPt) { + qaRegistry.fill(HIST("hInvMassDoublePhi"), PhiPair.M(), PhiPair.Pt()); + keepEventDoublePhi = true; + } + } + } + } + if (keepEventDoublePhi) { + hProcessedEvents->Fill(2.5); + } + tags(keepEventDoublePhi); + } // process + PROCESS_SWITCH(filterdoublephi, processPhiReducedTable, "Process table creation for double phi", true); +}; +WorkflowSpec defineDataProcessing(ConfigContext const& cfg) +{ + return WorkflowSpec{adaptAnalysisTask(cfg, TaskName{"lf-doublephi-filter"})}; +} diff --git a/EventFiltering/filterTables.h b/EventFiltering/filterTables.h index eca0a1b4d5f..745394561e8 100644 --- a/EventFiltering/filterTables.h +++ b/EventFiltering/filterTables.h @@ -156,6 +156,9 @@ DECLARE_SOA_COLUMN(OmegaHighMult, hasOmegaHighMult, bool); //! at least 1 // F1-proton DECLARE_SOA_COLUMN(TriggerEventF1Proton, triggereventf1proton, bool); //! F1 - proton femto trigger event +// Double Phi +DECLARE_SOA_COLUMN(TriggerEventDoublePhi, triggereventdoublephi, bool); //! Double Phi trigger event + // multiplicity DECLARE_SOA_COLUMN(HighTrackMult, hasHighTrackMult, bool); //! high trk muliplicity DECLARE_SOA_COLUMN(HighMultFv0, hasHighMultFv0, bool); //! high FV0 muliplicity @@ -294,6 +297,11 @@ DECLARE_SOA_TABLE(F1ProtonFilters, "AOD", "F1ProtonFilters", //! filtering::TriggerEventF1Proton); using F1ProtonFilter = F1ProtonFilters::iterator; +// Double Phi +DECLARE_SOA_TABLE(DoublePhiFilters, "AOD", "DoublePhiFilters", //! + filtering::TriggerEventDoublePhi); +using DoublePhiFilter = DoublePhiFilters::iterator; + // multiplicity DECLARE_SOA_TABLE(MultFilters, "AOD", "MultFilters", //! filtering::HighTrackMult, filtering::HighMultFv0, filtering::HighFt0Mult, filtering::HighFt0Flat, filtering::HighFt0cFv0Mult, filtering::HighFt0cFv0Flat, filtering::LeadingPtTrack); @@ -324,11 +332,11 @@ DECLARE_SOA_TABLE(BCRanges, "AOD", "BCRanges", //! using BCRange = BCRanges::iterator; /// List of the available filters, the description of their tables and the name of the tasks -constexpr int NumberOfFilters{13}; -constexpr std::array AvailableFilters{"NucleiFilters", "DiffractionFilters", "DqFilters", "HfFilters", "CFFilters", "JetFilters", "JetHFFilters", "FullJetFilters", "StrangenessFilters", "MultFilters", "PhotonFilters", "F1ProtonFilters", "HeavyNeutralMesonFilters"}; -constexpr std::array FilterDescriptions{"NucleiFilters", "DiffFilters", "DqFilters", "HfFilters", "CFFilters", "JetFilters", "JetHFFilters", "FullJetFilters", "LFStrgFilters", "MultFilters", "PhotonFilters", "F1ProtonFilters", "HNMesonFilters"}; -constexpr std::array FilteringTaskNames{"o2-analysis-nuclei-filter", "o2-analysis-diffraction-filter", "o2-analysis-dq-filter-pp-with-association", "o2-analysis-hf-filter", "o2-analysis-cf-filter", "o2-analysis-je-filter", "o2-analysis-je-hf-filter", "o2-analysis-fje-filter", "o2-analysis-lf-strangeness-filter", "o2-analysis-mult-filter", "o2-analysis-em-photon-filter", "o2-analysis-lf-f1proton-filter", "o2-analysis-heavy-meson-filter"}; -constexpr o2::framework::pack FiltersPack; +constexpr int NumberOfFilters{14}; +constexpr std::array AvailableFilters{"NucleiFilters", "DiffractionFilters", "DqFilters", "HfFilters", "CFFilters", "JetFilters", "JetHFFilters", "FullJetFilters", "StrangenessFilters", "MultFilters", "PhotonFilters", "F1ProtonFilters", "DoublePhiFilters", "HeavyNeutralMesonFilters"}; +constexpr std::array FilterDescriptions{"NucleiFilters", "DiffFilters", "DqFilters", "HfFilters", "CFFilters", "JetFilters", "JetHFFilters", "FullJetFilters", "LFStrgFilters", "MultFilters", "PhotonFilters", "F1ProtonFilters", "2PhiFilters", "HNMesonFilters"}; +constexpr std::array FilteringTaskNames{"o2-analysis-nuclei-filter", "o2-analysis-diffraction-filter", "o2-analysis-dq-filter-pp-with-association", "o2-analysis-hf-filter", "o2-analysis-cf-filter", "o2-analysis-je-filter", "o2-analysis-je-hf-filter", "o2-analysis-fje-filter", "o2-analysis-lf-strangeness-filter", "o2-analysis-mult-filter", "o2-analysis-em-photon-filter", "o2-analysis-lf-f1proton-filter", "o2-analysis-lf-doublephi-filter", "o2-analysis-heavy-meson-filter"}; +constexpr o2::framework::pack FiltersPack; static_assert(o2::framework::pack_size(FiltersPack) == NumberOfFilters); template From 4e90159504a3978600c3495fef01d4c123cdc9c8 Mon Sep 17 00:00:00 2001 From: Lucia Anna Tarasovicova Date: Mon, 24 Mar 2025 11:28:51 +0100 Subject: [PATCH 0804/1650] [PWGLF] Change in hStrangeCorrelation.cxx (#10621) Co-authored-by: Lucia Anna Tarasovicova --- .../Tasks/Strangeness/hStrangeCorrelation.cxx | 95 ++++++++++++++++++- 1 file changed, 91 insertions(+), 4 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx index 8d8821059b1..e5ae0c911ba 100644 --- a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx +++ b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx @@ -74,6 +74,7 @@ struct HStrangeCorrelation { Configurable doGenEventSelection{"doGenEventSelection", true, "use event selections when performing closure test for the gen events"}; Configurable selectINELgtZERO{"selectINELgtZERO", true, "select INEL>0 events"}; Configurable zVertexCut{"zVertexCut", 10, "Cut on PV position"}; + Configurable requireAllGoodITSLayers{"requireAllGoodITSLayers", false, " require that in the event all ITS are good"}; Configurable skipUnderOverflowInTHn{"skipUnderOverflowInTHn", false, "skip under/overflow in THns"}; Configurable mixingParameter{"mixingParameter", 10, "how many events are mixed"}; Configurable doMCassociation{"doMCassociation", false, "fill everything only for MC associated"}; @@ -119,13 +120,19 @@ struct HStrangeCorrelation { Configurable minTPCNCrossedRowsTrigger{"minTPCNCrossedRowsTrigger", 70, "Minimum TPC crossed rows (trigger)"}; Configurable minTPCNCrossedRowsAssociated{"minTPCNCrossedRowsAssociated", 70, "Minimum TPC crossed rows (associated)"}; Configurable triggerRequireITS{"triggerRequireITS", true, "require ITS signal in trigger tracks"}; + Configurable assocRequireITS{"assocRequireITS", true, "require ITS signal in associated primary tracks"}; Configurable triggerMaxTPCSharedClusters{"triggerMaxTPCSharedClusters", 200, "maximum number of shared TPC clusters (inclusive)"}; + Configurable assocMaxTPCSharedClusters{"assocMaxTPCSharedClusters", 200, "maximum number of shared TPC clusters (inclusive) for assoc primary tracks"}; Configurable triggerRequireL0{"triggerRequireL0", false, "require ITS L0 cluster for trigger"}; + Configurable assocRequireL0{"assocRequireL0", true, "require ITS L0 cluster for assoc primary track"}; // --- Trigger: DCA variation from basic formula: |DCAxy| < 0.004f + (0.013f / pt) Configurable dcaXYconstant{"dcaXYconstant", 0.004, "[0] in |DCAxy| < [0]+[1]/pT"}; Configurable dcaXYpTdep{"dcaXYpTdep", 0.013, "[1] in |DCAxy| < [0]+[1]/pT"}; + Configurable dcaXYconstantAssoc{"dcaXYconstantAssoc", 0.004, "[0] in |DCAxy| < [0]+[1]/pT"}; + Configurable dcaXYpTdepAssoc{"dcaXYpTdepAssoc", 0.013, "[1] in |DCAxy| < [0]+[1]/pT"}; + // --- Associated: topological variable variation (OK to vary all-at-once, at least for first study) Configurable v0cospa{"v0cospa", 0.97, "V0 CosPA"}; // double -> N.B. dcos(x)/dx = 0 at x=0) Configurable dcaV0dau{"dcaV0dau", 1.0, "DCA V0 Daughters"}; @@ -265,6 +272,30 @@ struct HStrangeCorrelation { } return true; } + template + bool isValidAssocHadron(TTrack track) + { + if (track.tpcNClsCrossedRows() < systCuts.minTPCNCrossedRowsAssociated) { + return false; // crossed rows + } + if (!track.hasITS() && systCuts.assocRequireITS) { + return false; // skip, doesn't have ITS signal (skips lots of TPC-only!) + } + if (track.tpcNClsShared() > systCuts.assocMaxTPCSharedClusters) { + return false; // skip, has shared clusters + } + if (!(TESTBIT(track.itsClusterMap(), 0)) && systCuts.assocRequireL0) { + return false; // skip, doesn't have cluster in ITS L0 + } + // systematic variations: trigger DCAxy + if (std::abs(track.dcaXY()) > systCuts.dcaXYconstantAssoc + systCuts.dcaXYpTdepAssoc * std::abs(track.signed1Pt())) { + return false; + } + if (track.pt() > axisRanges[2][1] || track.pt() < axisRanges[2][0]) { + return false; + } + return true; + } void fillCorrelationsV0(aod::TriggerTracks const& triggers, aod::AssocV0s const& assocs, bool mixing, float pvz, float mult) { for (auto const& triggerTrack : triggers) { @@ -278,6 +309,9 @@ struct HStrangeCorrelation { float efficiency = 1.0f; if (applyEfficiencyForTrigger) { efficiency = hEfficiencyTrigger->Interpolate(trigg.pt(), trigg.eta()); + if (efficiency == 0) { // check for zero efficiency, do not apply if the case + efficiency = 1; + } } float weight = (applyEfficiencyForTrigger) ? 1. / efficiency : 1.0f; histos.fill(HIST("sameEvent/TriggerParticlesV0"), trigg.pt(), mult, weight); @@ -336,6 +370,9 @@ struct HStrangeCorrelation { if (applyEfficiencyForTrigger) { efficiency = efficiency * hEfficiencyTrigger->Interpolate(pttrigger, trigg.eta()); } + if (efficiency == 0) { // check for zero efficiency, do not apply if the case + efficiency = 1; + } float weight = (applyEfficiencyCorrection || applyEfficiencyForTrigger) ? 1. / efficiency : 1.0f; if (TESTBIT(doCorrelation, Index) && (!applyEfficiencyCorrection || efficiency != 0)) { @@ -379,6 +416,9 @@ struct HStrangeCorrelation { float efficiency = 1.0f; if (applyEfficiencyForTrigger) { efficiency = hEfficiencyTrigger->Interpolate(trigg.pt(), trigg.eta()); + if (efficiency == 0) { // check for zero efficiency, do not apply if the case + efficiency = 1; + } } float weight = (applyEfficiencyForTrigger) ? 1. / efficiency : 1.0f; histos.fill(HIST("sameEvent/TriggerParticlesCascade"), trigg.pt(), mult, weight); @@ -450,6 +490,9 @@ struct HStrangeCorrelation { if (applyEfficiencyForTrigger) { efficiency = efficiency * hEfficiencyTrigger->Interpolate(pttrigger, trigg.eta()); } + if (efficiency == 0) { // check for zero efficiency, do not apply if the case + efficiency = 1; + } float weight = (applyEfficiencyCorrection || applyEfficiencyForTrigger) ? 1. / efficiency : 1.0f; if (TESTBIT(doCorrelation, Index + 3) && (!applyEfficiencyCorrection || efficiency != 0)) { if (assocCandidate.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(Index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && !mixing && -massWindowConfigurations.maxBgNSigma < assocCandidate.invMassNSigma(Index) && assocCandidate.invMassNSigma(Index) < -massWindowConfigurations.minBgNSigma) @@ -484,6 +527,9 @@ struct HStrangeCorrelation { float efficiency = 1.0f; if (applyEfficiencyForTrigger) { efficiency = hEfficiencyTrigger->Interpolate(trigg.pt(), trigg.eta()); + if (efficiency == 0) { // check for zero efficiency, do not apply if the case + efficiency = 1; + } } float weight = (applyEfficiencyForTrigger) ? 1. / efficiency : 1.0f; if constexpr (requires { triggerTrack.extra(); }) @@ -504,11 +550,12 @@ struct HStrangeCorrelation { continue; } } - //---] track quality check [--- - if (assoc.tpcNClsCrossedRows() < systCuts.minTPCNCrossedRowsAssociated) + if (!isValidAssocHadron(assoc)) continue; - + if (doAssocPhysicalPrimary && !assocTrack.mcPhysicalPrimary()) { + continue; + } float deltaphi = computeDeltaPhi(trigg.phi(), assoc.phi()); float deltaeta = trigg.eta() - assoc.eta(); float ptassoc = assoc.pt(); @@ -533,6 +580,9 @@ struct HStrangeCorrelation { if (applyEfficiencyForTrigger) { efficiency = efficiency * hEfficiencyTrigger->Interpolate(pttrigger, trigg.eta()); } + if (efficiency == 0) { // check for zero efficiency, do not apply if the case + efficiency = 1; + } float weight = (applyEfficiencyCorrection || applyEfficiencyForTrigger) ? 1. / efficiency : 1.0f; if (!mixing) { @@ -770,6 +820,7 @@ struct HStrangeCorrelation { histos.add("hTriggerPtResolution", ";p_{T}^{reconstructed} (GeV/c); p_{T}^{generated} (GeV/c)", kTH2F, {axisPtQA, axisPtQA}); histos.add("hTriggerPrimaryEtaVsPt", "hTriggerPrimaryEtaVsPt", kTH3F, {axisPtQA, axisEta, axisMult}); histos.add("hTrackEtaVsPtVsPhi", "hTrackEtaVsPtVsPhi", kTH3F, {axisPtQA, axisEta, axisPhi}); + histos.add("hAssocTrackEtaVsPtVsPhi", "hAssocTrackEtaVsPtVsPhi", kTH3F, {axisPtQA, axisEta, axisPhi}); histos.add("hTrackAttempt", "Attempt", kTH3F, {axisPtQA, axisEta, axisPhi}); bool hStrange = false; @@ -863,6 +914,9 @@ struct HStrangeCorrelation { if (!collision.isInelGt0() && selectINELgtZERO) { return false; } + if (!collision.selection_bit(aod::evsel::kIsGoodITSLayersAll) && requireAllGoodITSLayers) { + return false; + } if (zorroMask.value != "") { auto bc = collision.template bc_as(); initZorro(bc); @@ -946,12 +1000,39 @@ struct HStrangeCorrelation { auto track = triggerTrack.track_as(); if (!isValidTrigger(track)) continue; + float efficiency = 1.0f; + if (applyEfficiencyCorrection) { + efficiency = hEfficiencyTrigger->Interpolate(track.pt(), track.eta()); + } + if (efficiency == 0) { // check for zero efficiency, do not apply if the case + efficiency = 1; + } + float weight = applyEfficiencyCorrection ? 1. / efficiency : 1.0f; histos.fill(HIST("hTriggerAllSelectedEtaVsPt"), track.pt(), track.eta(), collision.centFT0M()); histos.fill(HIST("hTriggerPtResolution"), track.pt(), triggerTrack.mcOriginalPt()); if (doTriggPhysicalPrimary && !triggerTrack.mcPhysicalPrimary()) continue; histos.fill(HIST("hTriggerPrimaryEtaVsPt"), track.pt(), track.eta(), collision.centFT0M()); - histos.fill(HIST("hTrackEtaVsPtVsPhi"), track.pt(), track.eta(), track.phi()); + histos.fill(HIST("hTrackEtaVsPtVsPhi"), track.pt(), track.eta(), track.phi(), weight); + } + for (auto const& assocTrack : assocHadrons) { + auto assoc = assocTrack.track_as(); + if (!isValidAssocHadron(assoc)) + continue; + float efficiency = 1.0f; + if (applyEfficiencyCorrection) { + efficiency = hEfficiencyHadron->Interpolate(assoc.pt(), assoc.eta()); + } + if (efficiency == 0) { // check for zero efficiency, do not apply if the case + efficiency = 1; + } + float weight = applyEfficiencyCorrection ? 1. / efficiency : 1.0f; + histos.fill(HIST("hAssocHadronsAllSelectedEtaVsPt"), assoc.pt(), assoc.eta(), collision.centFT0M()); + histos.fill(HIST("hAssocPtResolution"), assoc.pt(), assocTrack.mcOriginalPt()); + if (doAssocPhysicalPrimary && !assocTrack.mcPhysicalPrimary()) + continue; + histos.fill(HIST("hAssocPrimaryEtaVsPt"), assoc.pt(), assoc.eta(), collision.centFT0M()); + histos.fill(HIST("hAsssocTrackEtaVsPtVsPhi"), assoc.pt(), assoc.eta(), assoc.phi(), weight); } } @@ -1014,6 +1095,9 @@ struct HStrangeCorrelation { if (applyEfficiencyCorrection) { efficiency = hEfficiencyV0[Index]->Interpolate(v0Data.pt(), v0Data.eta()); } + if (efficiency == 0) { // check for zero efficiency, do not apply if the case + efficiency = 1; + } float weight = applyEfficiencyCorrection ? 1. / efficiency : 1.0f; if (v0.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || v0.mcTrue(Index)) && (!doAssocPhysicalPrimary || v0.mcPhysicalPrimary()) && (!applyEfficiencyCorrection || efficiency != 0)) { if (TESTBIT(doCorrelation, Index)) { @@ -1109,6 +1193,9 @@ struct HStrangeCorrelation { if (applyEfficiencyCorrection) { efficiency = hEfficiencyCascade[Index]->Interpolate(cascData.pt(), cascData.eta()); } + if (efficiency == 0) { // check for zero efficiency, do not apply if the case + efficiency = 1; + } float weight = applyEfficiencyCorrection ? 1. / efficiency : 1.0f; if (casc.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || casc.mcTrue(Index)) && (!doAssocPhysicalPrimary || casc.mcPhysicalPrimary()) && (!applyEfficiencyCorrection || efficiency != 0)) { if (TESTBIT(doCorrelation, Index + 3)) { From ad9903135b010c3d384741a31f4d0453df65df62 Mon Sep 17 00:00:00 2001 From: blacwovie Date: Mon, 24 Mar 2025 18:54:27 +0800 Subject: [PATCH 0805/1650] [PWGLF] add setting_cutChi2NClITS configurable (#10620) Co-authored-by: blacw --- PWGLF/TableProducer/Nuspex/he3HadronFemto.cxx | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/PWGLF/TableProducer/Nuspex/he3HadronFemto.cxx b/PWGLF/TableProducer/Nuspex/he3HadronFemto.cxx index 41c1cf5ca58..a008bf422cf 100644 --- a/PWGLF/TableProducer/Nuspex/he3HadronFemto.cxx +++ b/PWGLF/TableProducer/Nuspex/he3HadronFemto.cxx @@ -140,6 +140,8 @@ struct he3HadCandidate { uint8_t NClsITSHe3 = 0u; uint8_t NClsITSHad = 0u; + float Chi2NClITSHe3 = -10.f; + float Chi2NClITSHad = -10.f; bool isBkgUS = false; // unlike sign bool isBkgEM = false; // event mixing @@ -178,6 +180,7 @@ struct he3hadronfemto { Configurable setting_cutPtMinhe3Had{"setting_cutPtMinhe3Had", 0.0f, "Minimum PT cut on he3Had4"}; Configurable setting_cutClSizeItsHe3{"setting_cutClSizeItsHe3", 4.0f, "Minimum ITS cluster size for He3"}; Configurable setting_cutNCls{"setting_cutNCls", 5.0f, "Minimum ITS Ncluster for tracks"}; + Configurable setting_cutChi2NClITS{"setting_cutChi2NClITS", 36.f, "Maximum ITS Chi2 for tracks"}; Configurable setting_cutNsigmaTPC{"setting_cutNsigmaTPC", 3.0f, "Value of the TPC Nsigma cut"}; Configurable setting_cutNsigmaITS{"setting_cutNsigmaITS", -1.5f, "Value of the TPC Nsigma cut"}; Configurable setting_cutPtMinTOFHad{"setting_cutPtMinTOFHad", 0.4f, "Minimum pT to apply the TOF cut on hadrons"}; @@ -245,6 +248,8 @@ struct he3hadronfemto { {"hDCAzHe3", ";DCA_{z} (cm)", {HistType::kTH1F, {{200, -1.0f, 1.0f}}}}, {"hNClsHe3ITS", ";N_{ITS} Cluster", {HistType::kTH1F, {{20, -10.0f, 10.0f}}}}, {"hNClsHadITS", ";N_{ITS} Cluster", {HistType::kTH1F, {{20, -10.0f, 10.0f}}}}, + {"hChi2NClHe3ITS", ";Chi2_{ITS} Ncluster", {HistType::kTH1F, {{100, 0, 100.0f}}}}, + {"hChi2NClHadITS", ";Chi2_{ITS} Ncluster", {HistType::kTH1F, {{100, 0, 100.0f}}}}, {"hhe3HadtInvMass", "; M(^{3}He + p) (GeV/#it{c}^{2})", {HistType::kTH1F, {{300, 3.74f, 4.34f}}}}, {"hHe3Pt", "#it{p}_{T} distribution; #it{p}_{T} (GeV/#it{c})", {HistType::kTH1F, {{240, -6.0f, 6.0f}}}}, {"hHadronPt", "Pt distribution; #it{p}_{T} (GeV/#it{c})", {HistType::kTH1F, {{120, -3.0f, 3.0f}}}}, @@ -389,7 +394,7 @@ struct he3hadronfemto { candidate.tpcNClsCrossedRows() < 0.8 * candidate.tpcNClsFindable() || candidate.tpcChi2NCl() > 4.f || candidate.tpcChi2NCl() < setting_cutChi2tpcLow || - candidate.itsChi2NCl() > 36.f) { + candidate.itsChi2NCl() > setting_cutChi2NClITS) { return false; } @@ -586,6 +591,8 @@ struct he3hadronfemto { he3Hadcand.NClsITSHe3 = trackHe3.itsNCls(); he3Hadcand.NClsITSHad = trackHad.itsNCls(); + he3Hadcand.Chi2NClITSHe3 = trackHe3.itsChi2NCl(); + he3Hadcand.Chi2NClITSHad = trackHad.itsChi2NCl(); he3Hadcand.sharedClustersHe3 = trackHe3.tpcNClsShared(); he3Hadcand.sharedClustersHad = trackHad.tpcNClsShared(); @@ -761,6 +768,8 @@ struct he3hadronfemto { m_qaRegistry.fill(HIST("hDCAzHe3"), he3Hadcand.DCAzHe3); m_qaRegistry.fill(HIST("hNClsHe3ITS"), he3Hadcand.NClsITSHe3); m_qaRegistry.fill(HIST("hNClsHadITS"), he3Hadcand.NClsITSHad); + m_qaRegistry.fill(HIST("hChi2NClHe3ITS"), he3Hadcand.Chi2NClITSHe3); + m_qaRegistry.fill(HIST("hChi2NClHadITS"), he3Hadcand.Chi2NClITSHad); } // ================================================================================================================== From e2001ba0250d132f31943e581859009516f63dc3 Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Mon, 24 Mar 2025 12:39:41 +0100 Subject: [PATCH 0806/1650] [PWGLF] chk892Flow - hot fix of EP resolution (#10622) --- PWGLF/Tasks/Resonances/chk892Flow.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PWGLF/Tasks/Resonances/chk892Flow.cxx b/PWGLF/Tasks/Resonances/chk892Flow.cxx index 4d4c4d349f5..79ae1de5381 100644 --- a/PWGLF/Tasks/Resonances/chk892Flow.cxx +++ b/PWGLF/Tasks/Resonances/chk892Flow.cxx @@ -805,9 +805,9 @@ struct Chk892Flow { histos.fill(HIST("QA/EP/hEPResBC"), lCentrality, lEPResBC); // Scalar product method if (AnalysisConfig.cfgUseScalProduct) { - double lEPSPResAB = (collision.qvecRe()[lQvecDetInd] * collision.qvecRe()[lQvecRefAInd] + collision.qvecIm()[lQvecDetInd] * collision.qvecIm()[lQvecRefAInd]) * lEPResAB; - double lEPSPResAC = (collision.qvecRe()[lQvecDetInd] * collision.qvecRe()[lQvecRefBInd] + collision.qvecIm()[lQvecDetInd] * collision.qvecIm()[lQvecRefBInd]) * lEPResAC; - double lEPSPResBC = (collision.qvecRe()[lQvecRefAInd] * collision.qvecRe()[lQvecRefBInd] + collision.qvecIm()[lQvecRefAInd] * collision.qvecIm()[lQvecRefBInd]) * lEPResBC; + double lEPSPResAB = (collision.qvecRe()[lQvecDetInd] * collision.qvecRe()[lQvecRefAInd] + collision.qvecIm()[lQvecDetInd] * collision.qvecIm()[lQvecRefAInd]); + double lEPSPResAC = (collision.qvecRe()[lQvecDetInd] * collision.qvecRe()[lQvecRefBInd] + collision.qvecIm()[lQvecDetInd] * collision.qvecIm()[lQvecRefBInd]); + double lEPSPResBC = (collision.qvecRe()[lQvecRefAInd] * collision.qvecRe()[lQvecRefBInd] + collision.qvecIm()[lQvecRefAInd] * collision.qvecIm()[lQvecRefBInd]); histos.fill(HIST("QA/EP/hEPSPResAB"), lCentrality, lEPSPResAB); histos.fill(HIST("QA/EP/hEPSPResAC"), lCentrality, lEPSPResAC); From 86fd2dc44cd599886ea649e982b1fd4588d1a590 Mon Sep 17 00:00:00 2001 From: Rik Spijkers <78484875+rspijkers@users.noreply.github.com> Date: Mon, 24 Mar 2025 14:43:00 +0100 Subject: [PATCH 0807/1650] [PWGLF] Add MC closure, remove obsolete V0 tables (#10605) --- .../Tasks/Strangeness/cascadecorrelations.cxx | 83 +++++++++++++++++-- 1 file changed, 78 insertions(+), 5 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx b/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx index 6e8dfbd7832..ebeed8a76a0 100644 --- a/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx +++ b/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx @@ -26,6 +26,7 @@ #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "Framework/ASoAHelpers.h" +#include "Framework/O2DatabasePDGPlugin.h" #include "ReconstructionDataFormats/Track.h" #include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" @@ -38,6 +39,7 @@ #include "Common/DataModel/PIDResponse.h" #include "CCDB/BasicCCDBManager.h" #include "EventFiltering/Zorro.h" +#include "PWGLF/Utils/inelGt.h" #include #include @@ -78,6 +80,7 @@ using CascDataExtSelected = soa::Join; using MyCollisions = soa::Join; using MyCollisionsMult = soa::Join; using MyCascades = soa::Filtered; +using LabeledCascades = soa::Join; struct CascadeSelector { Service ccdb; @@ -399,6 +402,10 @@ struct CascadeCorrelations { TH1D* hEffOmegaMin; TH1D* hEffOmegaPlus; + // used in MC closure test + Service pdgDB; + o2::pwglf::ParticleCounter mCounter; + void init(InitContext const&) { ccdb->setURL(ccdbUrl); @@ -415,6 +422,9 @@ struct CascadeCorrelations { } zorroSummary.setObject(zorro.getZorroSummary()); + + mCounter.mPdgDatabase = pdgDB.service; + mCounter.mSelectPrimaries = true; } double getEfficiency(TH1D* h, double pT) @@ -489,6 +499,16 @@ struct CascadeCorrelations { {"MixedEvents/hMEOmXiSS", "hMEOmXiSS", {HistType::kTHnSparseF, {deltaPhiAxis, deltaYAxis, ptAxis, ptAxis, invMassAxis, invMassAxis, vertexAxis, multiplicityAxis}}, true}, {"MixedEvents/hMEOmOmOS", "hMEOmOmOS", {HistType::kTHnSparseF, {deltaPhiAxis, deltaYAxis, ptAxis, ptAxis, invMassAxis, invMassAxis, vertexAxis, multiplicityAxis}}, true}, {"MixedEvents/hMEOmOmSS", "hMEOmOmSS", {HistType::kTHnSparseF, {deltaPhiAxis, deltaYAxis, ptAxis, ptAxis, invMassAxis, invMassAxis, vertexAxis, multiplicityAxis}}, true}, + + // MC closure + {"MC/hMCPlusMinus", "hMCPlusMinus", {HistType::kTHnSparseF, {deltaPhiAxis, deltaYAxis, ptAxis, ptAxis, vertexAxis, multiplicityAxis}}, true}, + {"MC/hMCPlusPlus", "hMCPlusPlus", {HistType::kTHnSparseF, {deltaPhiAxis, deltaYAxis, ptAxis, ptAxis, vertexAxis, multiplicityAxis}}, true}, + {"MC/hMCMinusPlus", "hMCMinusPlus", {HistType::kTHnSparseF, {deltaPhiAxis, deltaYAxis, ptAxis, ptAxis, vertexAxis, multiplicityAxis}}, true}, + {"MC/hMCMinusMinus", "hMCMinusMinus", {HistType::kTHnSparseF, {deltaPhiAxis, deltaYAxis, ptAxis, ptAxis, vertexAxis, multiplicityAxis}}, true}, + + {"MC/hGenMultNoReco", "hGenMultNoReco", {HistType::kTH1I, {{100, 0, 100, "Number of generated charged primaries"}}}}, + {"MC/hGenMultOneReco", "hGenMultOneReco", {HistType::kTH1I, {{100, 0, 100, "Number of generated charged primaries"}}}}, + {"MC/hSplitEvents", "hSplitEvents", {HistType::kTH1I, {{10, 0, 10, "Number of rec. events per gen event"}}}}, }, }; @@ -503,9 +523,8 @@ struct CascadeCorrelations { // BinningType colBinning{{axisVtxZ, axisMult}, true}; // true is for 'ignore overflows' (true by default). Underflows and overflows will have bin -1. using BinningType = ColumnBinningPolicy; BinningType colBinning{{axisVtxZ}, true}; // true is for 'ignore overflows' (true by default). Underflows and overflows will have bin -1. - SameKindPair pair{colBinning, nMixedEvents, -1, &cache}; - void processSameEvent(MyCollisionsMult::iterator const& collision, MyCascades const& Cascades, aod::V0sLinked const&, aod::V0Datas const&, FullTracksExtIU const&, aod::BCsWithTimestamps const&) + void processSameEvent(MyCollisionsMult::iterator const& collision, MyCascades const& Cascades, FullTracksExtIU const&, aod::BCsWithTimestamps const&) { if (useTrigger) { auto bc = collision.bc_as(); @@ -713,11 +732,13 @@ struct CascadeCorrelations { } } } // correlations - } // process same event + } // process same event - void processMixedEvent(MyCollisionsMult const& /*collisions*/, MyCascades const& /*Cascades*/, - aod::V0sLinked const&, aod::V0Datas const&, FullTracksExtIU const&) + void processMixedEvent(MyCollisionsMult const& collisions, MyCascades const& Cascades, FullTracksExtIU const&) { + auto cascadesTuple = std::make_tuple(Cascades); + SameKindPair pair{colBinning, nMixedEvents, -1, collisions, cascadesTuple, &cache}; + for (auto const& [col1, cascades1, col2, cascades2] : pair) { if (!col1.sel8() || !col2.sel8()) continue; @@ -891,8 +912,60 @@ struct CascadeCorrelations { } // collisions } // process mixed events + Filter genCascadesFilter = nabs(aod::mcparticle::pdgCode) == 3312; + + void processMC(aod::McCollision const&, soa::SmallGroups> const& collisions, soa::Filtered const& genCascades, aod::McParticles const& mcParticles) + { + // Let's do some logic on matched reconstructed collisions - if there less or more than one, fill some QA and skip the rest + double FT0mult = -1; // non-sensible default value just in case + double vtxz = -999.; // non-sensible default value just in case + if (collisions.size() < 1) { + registry.fill(HIST("MC/hSplitEvents"), 0); + registry.fill(HIST("MC/hGenMultNoReco"), mCounter.countFT0A(mcParticles) + mCounter.countFT0C(mcParticles)); + return; + } else if (collisions.size() == 1) { + registry.fill(HIST("MC/hSplitEvents"), 1); + registry.fill(HIST("MC/hGenMultOneReco"), mCounter.countFT0A(mcParticles) + mCounter.countFT0C(mcParticles)); + for (auto const& collision : collisions) { // not really a loop, as there is only one collision + FT0mult = collision.multFT0M(); + vtxz = collision.posZ(); + } + } else if (collisions.size() > 1) { + registry.fill(HIST("MC/hSplitEvents"), collisions.size()); + return; + } + + for (auto& [c0, c1] : combinations(genCascades, genCascades)) { // combinations automatically applies strictly upper in case of 2 identical tables + // Define the trigger as the particle with the highest pT. As we can't swap the cascade tables themselves, we swap the addresses and later dereference them + auto* triggerAddress = &c0; + auto* assocAddress = &c1; + if (assocAddress->pt() > triggerAddress->pt()) { + std::swap(triggerAddress, assocAddress); + } + auto trigger = *triggerAddress; + auto assoc = *assocAddress; + + double dphi = RecoDecay::constrainAngle(trigger.phi() - assoc.phi(), -PIHalf); + + if (trigger.pdgCode() < 0) { // anti-trigg --> Plus + if (assoc.pdgCode() < 0) { // anti-assoc --> Plus + registry.fill(HIST("MC/hMCPlusPlus"), dphi, trigger.y() - assoc.y(), trigger.pt(), assoc.pt(), vtxz, FT0mult); + } else { // assoc --> Minus + registry.fill(HIST("MC/hMCPlusMinus"), dphi, trigger.y() - assoc.y(), trigger.pt(), assoc.pt(), vtxz, FT0mult); + } + } else { // trig --> Minus + if (assoc.pdgCode() < 0) { // anti-assoc --> Plus + registry.fill(HIST("MC/hMCMinusPlus"), dphi, trigger.y() - assoc.y(), trigger.pt(), assoc.pt(), vtxz, FT0mult); + } else { + registry.fill(HIST("MC/hMCMinusMinus"), dphi, trigger.y() - assoc.y(), trigger.pt(), assoc.pt(), vtxz, FT0mult); + } + } + } + } + PROCESS_SWITCH(CascadeCorrelations, processSameEvent, "Process same events", true); PROCESS_SWITCH(CascadeCorrelations, processMixedEvent, "Process mixed events", true); + PROCESS_SWITCH(CascadeCorrelations, processMC, "Process MC", false); }; // struct From f328c5b47a5f3dcc23c286034e30398512479a9a Mon Sep 17 00:00:00 2001 From: amatyja Date: Mon, 24 Mar 2025 15:01:31 +0100 Subject: [PATCH 0808/1650] [PWGUD] TauTau 1+3 topo skimmer (#10623) --- PWGUD/Tasks/upcTauTau13topo.cxx | 244 +++++++++++++++++++++++++++++++- 1 file changed, 240 insertions(+), 4 deletions(-) diff --git a/PWGUD/Tasks/upcTauTau13topo.cxx b/PWGUD/Tasks/upcTauTau13topo.cxx index d25e5616c82..7a7c41dea2b 100644 --- a/PWGUD/Tasks/upcTauTau13topo.cxx +++ b/PWGUD/Tasks/upcTauTau13topo.cxx @@ -43,7 +43,88 @@ using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::constants::physics; +// derived tables for tautau->4 (=1+3) tracks +namespace o2::aod +{ +namespace tau_tree +{ +// event info +DECLARE_SOA_COLUMN(RunNumber, runNumber, int32_t); +DECLARE_SOA_COLUMN(Bc, bc, int); +DECLARE_SOA_COLUMN(TotalTracks, totalTracks, int); +DECLARE_SOA_COLUMN(NumContrib, numContrib, int); +// DECLARE_SOA_COLUMN(GlobalNonPVtracks, globalNonPVtracks, int); +// DECLARE_SOA_COLUMN(PosX, posX, float); +// DECLARE_SOA_COLUMN(PosY, posY, float); +DECLARE_SOA_COLUMN(PosZ, posZ, float); +DECLARE_SOA_COLUMN(FlagUPC, flagUPC, bool); +DECLARE_SOA_COLUMN(OccupancyInTime, occupancyInTime, int); +DECLARE_SOA_COLUMN(HadronicRate, hadronicRate, double); +DECLARE_SOA_COLUMN(Trs, trs, bool); +DECLARE_SOA_COLUMN(Trofs, trofs, bool); +DECLARE_SOA_COLUMN(Hmpr, hmpr, bool); +// DECLARE_SOA_COLUMN(Tfb, tfb, int); +// DECLARE_SOA_COLUMN(ItsRofb, itsRofb, int); +// DECLARE_SOA_COLUMN(Sbp, sbp, int); +// DECLARE_SOA_COLUMN(ZvtxFT0vsPv, zvtxFT0vsPv, int); +// DECLARE_SOA_COLUMN(VtxITSTPC, vtxITSTPC, int); +DECLARE_SOA_COLUMN(ZdcAenergy, zdcAenergy, float); +DECLARE_SOA_COLUMN(ZdcCenergy, zdcCenergy, float); +DECLARE_SOA_COLUMN(Qtot, qtot, short); +// FIT info +DECLARE_SOA_COLUMN(TotalFT0AmplitudeA, totalFT0AmplitudeA, float); +DECLARE_SOA_COLUMN(TotalFT0AmplitudeC, totalFT0AmplitudeC, float); +DECLARE_SOA_COLUMN(TotalFV0AmplitudeA, totalFV0AmplitudeA, float); +// DECLARE_SOA_COLUMN(TimeFT0A, timeFT0A, float); +// DECLARE_SOA_COLUMN(TimeFT0C, timeFT0C, float); +// DECLARE_SOA_COLUMN(TimeFV0A, timeFV0A, float); +// tracks +DECLARE_SOA_COLUMN(TrkPx, trkPx, float[4]); +DECLARE_SOA_COLUMN(TrkPy, trkPy, float[4]); +DECLARE_SOA_COLUMN(TrkPz, trkPz, float[4]); +// DECLARE_SOA_COLUMN(TrkSign, trkSign, int[4]); +// DECLARE_SOA_COLUMN(TrkDCAxy, trkDCAxy, float[4]); +// DECLARE_SOA_COLUMN(TrkDCAz, trkDCAz, float[4]); +DECLARE_SOA_COLUMN(TrkTPCcr, trkTPCcr, int[4]); +DECLARE_SOA_COLUMN(TrkTPCsignal, trkTPCsignal, float[4]); +DECLARE_SOA_COLUMN(TrkTPCnSigmaEl, trkTPCnSigmaEl, float[4]); +// DECLARE_SOA_COLUMN(TrkTPCnSigmaMu, trkTPCnSigmaMu, float[4]); +DECLARE_SOA_COLUMN(TrkTPCnSigmaPi, trkTPCnSigmaPi, float[4]); +DECLARE_SOA_COLUMN(TrkTPCnSigmaKa, trkTPCnSigmaKa, float[4]); +DECLARE_SOA_COLUMN(TrkTPCnSigmaPr, trkTPCnSigmaPr, float[4]); +DECLARE_SOA_COLUMN(TrkTOFbeta, trkTOFbeta, float[4]); +DECLARE_SOA_COLUMN(TrkTOFnSigmaEl, trkTOFnSigmaEl, float[4]); +// DECLARE_SOA_COLUMN(TrkTOFnSigmaMu, trkTOFnSigmaMu, float[4]); +DECLARE_SOA_COLUMN(TrkTOFnSigmaPi, trkTOFnSigmaPi, float[4]); +DECLARE_SOA_COLUMN(TrkTOFnSigmaKa, trkTOFnSigmaKa, float[4]); +DECLARE_SOA_COLUMN(TrkTOFnSigmaPr, trkTOFnSigmaPr, float[4]); +DECLARE_SOA_COLUMN(TrkTOFchi2, trkTOFchi2, float[4]); + +} // end of namespace tau_tree +DECLARE_SOA_TABLE(TauFourTracks, "AOD", "TAUFOURTRACK", + tau_tree::RunNumber, tau_tree::Bc, tau_tree::TotalTracks, tau_tree::NumContrib, + // tau_tree::GlobalNonPVtracks, + // tau_tree::PosX, tau_tree::PosY, + tau_tree::PosZ, + tau_tree::FlagUPC, tau_tree::OccupancyInTime, tau_tree::HadronicRate, tau_tree::ZdcAenergy, tau_tree::ZdcCenergy, + tau_tree::Qtot, + tau_tree::Trs, tau_tree::Trofs, tau_tree::Hmpr, + // tau_tree::Tfb, tau_tree::ItsRofb, tau_tree::Sbp, tau_tree::ZvtxFT0vsPv, tau_tree::VtxITSTPC, + tau_tree::TotalFT0AmplitudeA, tau_tree::TotalFT0AmplitudeC, tau_tree::TotalFV0AmplitudeA, + // tau_tree::TimeFT0A, tau_tree::TimeFT0C, tau_tree::TimeFV0A, + tau_tree::TrkPx, tau_tree::TrkPy, tau_tree::TrkPz, + // tau_tree::TrkSign, + // tau_tree::TrkDCAxy, tau_tree::TrkDCAz, + tau_tree::TrkTPCcr, + tau_tree::TrkTPCsignal, tau_tree::TrkTPCnSigmaEl, tau_tree::TrkTPCnSigmaPi, tau_tree::TrkTPCnSigmaKa, tau_tree::TrkTPCnSigmaPr, + tau_tree::TrkTOFbeta, tau_tree::TrkTOFnSigmaEl, tau_tree::TrkTOFnSigmaPi, tau_tree::TrkTOFnSigmaKa, tau_tree::TrkTOFnSigmaPr, + tau_tree::TrkTOFchi2); + +} // end of namespace o2::aod + struct TauTau13topo { + Produces tauFourTracks; + SGSelector sgSelector; // configurables Configurable cutFV0{"cutFV0", 10000., "FV0A threshold"}; @@ -652,7 +733,7 @@ struct TauTau13topo { registry.add("pidTPC/hpvsdedxElHipCut33", "eTOF+1 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); registry.add("pidTPC/hpvsdedxElHipCut34", "piTOF+33 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); registry.add("pidTPC/hpvsdedxElHipCut35", "ZDC+27 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registry.add("pidTPC/hpvsdedxElHipCut36", "Good+35 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + // registry.add("pidTPC/hpvsdedxElHipCut36", "Good+35 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); // registry.add("pidTPC/hpvsdedxElHipCut37", "TOFgood+36 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); registry.add("pidTPC/hpvsdedxElHipCut40", "All from gamma hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); @@ -706,7 +787,7 @@ struct TauTau13topo { registry.add("pidTOF/hpvsNsigmaElHipCut27", "DP+30 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); registry.add("pidTOF/hpvsNsigmaElHipCut35", "ZDC+27 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); registry.add("pidTOF/hpvsNsigmaElHipCut23", "Occ+35 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); - registry.add("pidTOF/hpvsNsigmaElHipCut36", "Good+23 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + // registry.add("pidTOF/hpvsNsigmaElHipCut36", "Good+23 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); // registry.add("pidTOF/hpvsNsigmaElHipCut37", "GoodTof+36 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); registry.add("pidTOF/h3piTOFchi2", "tof chi2;chi2 TOF;events", {HistType::kTH1F, {{100, 0., 10.}}}); @@ -715,7 +796,7 @@ struct TauTau13topo { registry.add("pidTOF/h3piTOFchi2Cut27", "tof chi2;chi2 TOF;events", {HistType::kTH1F, {{100, 0., 10.}}}); registry.add("pidTOF/h3piTOFchi2Cut35", "tof chi2;chi2 TOF;events", {HistType::kTH1F, {{100, 0., 10.}}}); registry.add("pidTOF/h3piTOFchi2Cut23", "tof chi2;chi2 TOF;events", {HistType::kTH1F, {{100, 0., 10.}}}); - registry.add("pidTOF/h3piTOFchi2Cut36", "tof chi2;chi2 TOF;events", {HistType::kTH1F, {{100, 0., 10.}}}); + // registry.add("pidTOF/h3piTOFchi2Cut36", "tof chi2;chi2 TOF;events", {HistType::kTH1F, {{100, 0., 10.}}}); // registry.add("pidTOF/h3piTOFchi2Cut37", "tof chi2;chi2 TOF;events", {HistType::kTH1F, {{100, 0., 10.}}}); // MC part @@ -2889,6 +2970,7 @@ struct TauTau13topo { registry.get(HIST("control/cut30/h4trkMassVsPt"))->Fill(mass4pi, pttot); registry.get(HIST("control/cut30/hNtofTrk"))->Fill(nTofTrk); registry.get(HIST("control/cut30/hZNACenergy"))->Fill(energyZNA, energyZNC); + registry.get(HIST("global/hRecFlag"))->Fill(5 + 2 + dgcand.flags()); // reconstruction with upc settings flag for (int i = 0; i < 4; i++) { if (flagEl[i] && trkHasTof[i] && flagPi[i] && flagPr[i] && flagKa[i] && flagCR[i] && !flagVcalPV[i] && flagS3pi[i] && flagIM[i] && (otherTOFtracks[i] >= 1)) { registry.get(HIST("pidTPC/hpvsdedxElHipCut30"))->Fill(tmpMomentum[i], tmpDedx[i]); @@ -2917,6 +2999,7 @@ struct TauTau13topo { registry.get(HIST("control/cut27/h4trkMassVsPt"))->Fill(mass4pi, pttot); registry.get(HIST("control/cut27/hNtofTrk"))->Fill(nTofTrk); registry.get(HIST("control/cut27/hZNACenergy"))->Fill(energyZNA, energyZNC); + registry.get(HIST("global/hRecFlag"))->Fill(5 + 2 + 2 + dgcand.flags()); // reconstruction with upc settings flag for (int i = 0; i < 4; i++) { if (flagEl[i] && trkHasTof[i] && flagPi[i] && flagPr[i] && flagKa[i] && flagCR[i] && !flagVcalPV[i] && flagS3pi[i] && flagIM[i] && (otherTOFtracks[i] >= 1) && flagDP[i]) { registry.get(HIST("pidTPC/hpvsdedxElHipCut27"))->Fill(tmpMomentum[i], tmpDedx[i]); @@ -2944,7 +3027,7 @@ struct TauTau13topo { // // skip events with znac energy cut 35 // - if (energyZNA >= 1. && energyZNC >= 1.) { + if (energyZNA >= 1. || energyZNC >= 1.) { if (verbose) { LOGF(info, " Candidate rejected: ZNA, ZNC are %f, %f", energyZNA, energyZNC); } @@ -4719,9 +4802,162 @@ struct TauTau13topo { } // end of processEfficiencyMCSG + // skimming: only 4 tracks selection + void processDoSkim(UDCollisionFull2 const& dgcand, UDTracksFull const& dgtracks, PVTracks const& PVContributors) + { + int gapSide = dgcand.gapSide(); + int truegapSide = sgSelector.trueGap(dgcand, cutFV0, cutFT0A, cutFT0C, cutZDC); + if (gapSide < 0 || gapSide > 2) + return; + gapSide = truegapSide; + if (gapSide != mGapSide) + return; + + // zdc information + float energyZNA = dgcand.energyCommonZNA(); + float energyZNC = dgcand.energyCommonZNC(); + if (energyZNA < 0) + energyZNA = -1.; + if (energyZNC < 0) + energyZNC = -1.; + + int nTofTrk = 0; + int nEtaIn15 = 0; + int npT100 = 0; + // int qtot = 0; + short qtot = 0; + TLorentzVector p; + for (const auto& trk : PVContributors) { + qtot += trk.sign(); + p.SetXYZM(trk.px(), trk.py(), trk.pz(), MassPiPlus); + if (std::abs(p.Eta()) < trkEtacut) + nEtaIn15++; // 0.9 is a default + if (trk.pt() > 0.1) + npT100++; + if (trk.hasTOF()) + nTofTrk++; + } // end of loop over PV tracks + + if (PVContributors.size() != 4) + return; + if (nEtaIn15 != 4) + return; + if (npT100 != 4) + return; + if (nTofTrk < nTofTrkMinCut) + return; + + // + // FIT informaton + // + auto bitMin = 16 - mFITvetoWindow; // default is +- 1 bc (1 bit) + auto bitMax = 16 + mFITvetoWindow; + bool flagFITveto = false; + // check FIT information + for (auto bit = bitMin; bit <= bitMax; bit++) { + if (TESTBIT(dgcand.bbFT0Apf(), bit)) + flagFITveto = true; + if (TESTBIT(dgcand.bbFT0Cpf(), bit)) + flagFITveto = true; + if (useFV0ForVeto && TESTBIT(dgcand.bbFV0Apf(), bit)) + flagFITveto = true; + if (useFDDAForVeto && TESTBIT(dgcand.bbFDDApf(), bit)) + flagFITveto = true; + if (useFDDCForVeto && TESTBIT(dgcand.bbFDDCpf(), bit)) + flagFITveto = true; + } // end of loop over FIT bits + + if (mFITvetoFlag && flagFITveto) + return; + + // + // variables per track + // + int counterTmp = 0; + float px[4], py[4], pz[4]; + // int sign[4]; + // float dcaZ[4]; + // float dcaXY[4]; + + float tmpDedx[4]; + float tmpTofNsigmaEl[4]; + float tmpTofNsigmaPi[4]; + float tmpTofNsigmaKa[4]; + float tmpTofNsigmaPr[4]; + + float nSigmaEl[4]; + float nSigmaPi[4]; + float nSigmaPr[4]; + float nSigmaKa[4]; + // float chi2TPC[4]; + // float chi2ITS[4]; + float chi2TOF[4] = {-1., -1., -1., -1.}; + // float nclTPCfind[4]; + int nclTPCcrossedRows[4]; + // double trkTime[4]; + // float trkTimeRes[4]; + float trkTofSignal[4]; + + for (const auto& trk : PVContributors) { + + px[counterTmp] = trk.px(); + py[counterTmp] = trk.py(); + pz[counterTmp] = trk.pz(); + // sign[counterTmp] = trk.sign(); + // dcaZ[counterTmp] = trk.dcaZ(); + // dcaXY[counterTmp] = trk.dcaXY(); + + tmpDedx[counterTmp] = trk.tpcSignal(); + nSigmaEl[counterTmp] = trk.tpcNSigmaEl(); + nSigmaPi[counterTmp] = trk.tpcNSigmaPi(); + nSigmaPr[counterTmp] = trk.tpcNSigmaPr(); + nSigmaKa[counterTmp] = trk.tpcNSigmaKa(); + + trkTofSignal[counterTmp] = trk.beta(); + tmpTofNsigmaEl[counterTmp] = trk.tofNSigmaEl(); + tmpTofNsigmaPi[counterTmp] = trk.tofNSigmaPi(); + tmpTofNsigmaKa[counterTmp] = trk.tofNSigmaKa(); + tmpTofNsigmaPr[counterTmp] = trk.tofNSigmaPr(); + + // chi2TPC[counterTmp] = trk.tpcChi2NCl(); + // chi2ITS[counterTmp] = trk.itsChi2NCl(); + if (trk.hasTOF()) + chi2TOF[counterTmp] = trk.tofChi2(); + // nclTPCfind[counterTmp] = trk.tpcNClsFindable(); + nclTPCcrossedRows[counterTmp] = trk.tpcNClsCrossedRows(); + + // trkTime[counterTmp] = trk.trackTime(); + // trkTimeRes[counterTmp] = trk.trackTimeRes(); + counterTmp++; + } + + tauFourTracks(dgcand.runNumber(), + dgcand.globalBC(), // is it necessary + dgtracks.size(), + dgcand.numContrib(), + // dgcand.posX(), dgcand.posY(), + dgcand.posZ(), + dgcand.flags(), + dgcand.occupancyInTime(), + dgcand.hadronicRate(), // is it necessary + energyZNA, energyZNC, + qtot, + dgcand.trs(), dgcand.trofs(), dgcand.hmpr(), // to test it + // dgcand.tfb(), dgcand.itsROFb(), dgcand.sbp(), dgcand.zVtxFT0vPV(), dgcand.vtxITSTPC(), + dgcand.totalFT0AmplitudeA(), dgcand.totalFT0AmplitudeC(), dgcand.totalFV0AmplitudeA(), + // dgcand.timeFT0A(), dgcand.timeFT0C(), dgcand.timeFV0A(), + px, py, pz, // sign, + // dcaXY, dcaZ, + nclTPCcrossedRows, + tmpDedx, nSigmaEl, nSigmaPi, nSigmaKa, nSigmaPr, + trkTofSignal, tmpTofNsigmaEl, tmpTofNsigmaPi, tmpTofNsigmaKa, tmpTofNsigmaPr, + chi2TOF); + } // end of skim process + PROCESS_SWITCH(TauTau13topo, processDataSG, "Run over SG Producer tables in reco level (reconstructed data or MC)", true); PROCESS_SWITCH(TauTau13topo, processSimpleMCSG, "Run over SG Producer tables in true level (MC true only)", false); PROCESS_SWITCH(TauTau13topo, processEfficiencyMCSG, "Run over SG Producer tables in true and reco level (MC true and reconstructed)", false); + PROCESS_SWITCH(TauTau13topo, processDoSkim, "Run over SG Producer tables to produce skimmed data", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 84c7c5e942af5379b1b23d1e8e0cf8c7f44013ac Mon Sep 17 00:00:00 2001 From: nzardosh Date: Mon, 24 Mar 2025 15:42:18 +0100 Subject: [PATCH 0809/1650] [PWGJE] check to stop bug in powheg (#10626) --- PWGJE/Core/JetCandidateUtilities.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/PWGJE/Core/JetCandidateUtilities.h b/PWGJE/Core/JetCandidateUtilities.h index 7a958fff88f..ad7f178b9f0 100644 --- a/PWGJE/Core/JetCandidateUtilities.h +++ b/PWGJE/Core/JetCandidateUtilities.h @@ -166,6 +166,9 @@ bool isDaughterTrack(T& track, U& candidate, V const& tracks) template bool isDaughterParticle(const T& particle, int globalIndex) { + if (!particle.has_daughters()) { + return false; + } for (auto daughter : particle.template daughters_as::parent_t>()) { if (daughter.globalIndex() == globalIndex) { return true; From 13ea3ba1175b8bfe341c127f5882861636336ffe Mon Sep 17 00:00:00 2001 From: Chiara Pinto <48326672+chiarapinto@users.noreply.github.com> Date: Mon, 24 Mar 2025 17:32:57 +0100 Subject: [PATCH 0810/1650] [PWGLF] added QA histograms (#10628) --- PWGLF/Tasks/Nuspex/antinucleiInJets.cxx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx index a6cb0ad90fa..4db5c685986 100644 --- a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx +++ b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx @@ -155,6 +155,8 @@ struct AntinucleiInJets { if (doprocessQC) { registryQC.add("deltaEta_deltaPhi_jet", "deltaEta_deltaPhi_jet", HistType::kTH2F, {{200, -0.5, 0.5, "#Delta#eta"}, {200, 0, PIHalf, "#Delta#phi"}}); registryQC.add("deltaEta_deltaPhi_ue", "deltaEta_deltaPhi_ue", HistType::kTH2F, {{200, -0.5, 0.5, "#Delta#eta"}, {200, 0, PIHalf, "#Delta#phi"}}); + registryQC.add("eta_phi_jet", "eta_phi_jet", HistType::kTH2F, {{200, -0.5, 0.5, "#eta_{jet}"}, {200, 0, TwoPI, "#phi_{jet}"}}); + registryQC.add("eta_phi_ue", "eta_phi_ue", HistType::kTH2F, {{200, -0.5, 0.5, "#eta_{UE}"}, {200, 0, TwoPI, "#phi_{UE}"}}); registryQC.add("NchJetCone", "NchJetCone", HistType::kTH1F, {{100, 0, 100, "#it{N}_{ch}"}}); registryQC.add("NchJet", "NchJet", HistType::kTH1F, {{100, 0, 100, "#it{N}_{ch}"}}); registryQC.add("NchUE", "NchUE", HistType::kTH1F, {{100, 0, 100, "#it{N}_{ch}"}}); @@ -747,7 +749,7 @@ struct AntinucleiInJets { // jet pt must be larger than threshold auto jetForSub = jet; fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jetForSub, rhoPerp, rhoMPerp); - double ptJetAfterSub = jet.pt(); + double ptJetAfterSub = jetForSub.pt(); registryQC.fill(HIST("jetPtDifference"), ptJetAfterSub - ptJetBeforeSub); if (getCorrectedPt(jetMinusBkg.pt()) < minJetPt) @@ -773,6 +775,7 @@ struct AntinucleiInJets { double deltaEta = particle.eta() - jetAxis.Eta(); double deltaPhi = getDeltaPhi(particle.phi(), jetAxis.Phi()); registryQC.fill(HIST("deltaEta_deltaPhi_jet"), deltaEta, deltaPhi); + registryQC.fill(HIST("eta_phi_jet"), particle.eta(), particle.phi()); } // loop over particles in perpendicular cones @@ -796,6 +799,7 @@ struct AntinucleiInJets { nParticlesPerp++; registryQC.fill(HIST("deltaEta_deltaPhi_ue"), deltaEtaUe1, deltaPhiUe1); registryQC.fill(HIST("deltaEta_deltaPhi_ue"), deltaEtaUe2, deltaPhiUe2); + registryQC.fill(HIST("eta_phi_ue"), track.eta(), track.phi()); } registryQC.fill(HIST("NchUE"), 0.5 * nParticlesPerp); registryQC.fill(HIST("NchJet"), static_cast(jetConstituents.size()) - 0.5 * nParticlesPerp); From d04fa039fc83f06c4260b1878dce518b8c2917a6 Mon Sep 17 00:00:00 2001 From: Nicolas Strangmann <77485327+nstrangm@users.noreply.github.com> Date: Mon, 24 Mar 2025 19:25:23 +0100 Subject: [PATCH 0811/1650] [PWGEM/PhotonMeson] Add true eta from HS and WD histograms (#10630) Co-authored-by: Nicolas Strangmann --- PWGEM/PhotonMeson/Utils/NMHistograms.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/PWGEM/PhotonMeson/Utils/NMHistograms.h b/PWGEM/PhotonMeson/Utils/NMHistograms.h index 9dbeb77c4f6..88df03a3aed 100644 --- a/PWGEM/PhotonMeson/Utils/NMHistograms.h +++ b/PWGEM/PhotonMeson/Utils/NMHistograms.h @@ -51,6 +51,8 @@ void addNMHistograms(HistogramRegistry* fRegistry, bool isMC, const char* pairna fRegistry->add("Pair/Pi0/hs_FromSameGamma", "Two clusters from same gamma that is a pi0 daughter (conversion)", kTHnSparseD, {axis_mass, axis_pt}, true); fRegistry->add("Pair/Eta/hs_FromSameGamma", "Two clusters from same gamma that is a eta daughter (conversion)", kTHnSparseD, {axis_mass, axis_pt}, true); fRegistry->add("Pair/Eta/hs_Primary", "rec. true eta", kTHnSparseD, {axis_mass, axis_pt}, true); + fRegistry->add("Pair/Eta/hs_FromWD", "rec. true eta from weak decay", kTHnSparseD, {axis_mass, axis_pt}, true); + fRegistry->add("Pair/Eta/hs_FromHS", "rec. true eta from hadronic shower in material", kTHnSparseD, {axis_mass, axis_pt}, true); const AxisSpec axis_rapidity{{0.0, +0.8, +0.9}, "rapidity |y|"}; fRegistry->add("Generated/Pi0/hPt", "pT;p_{T} (GeV/c)", kTH1F, {axis_pt}, true); @@ -74,9 +76,9 @@ void fillTruePairInfo(HistogramRegistry* fRegistry, TDiphoton const& v12, TMCPar { int pdg = std::abs(mcparticle.pdgCode()); float weight = eventWeight; + int motherid_strhad = IsFromWD(mcparticle.template emmcevent_as(), mcparticle, mcparticles); switch (pdg) { case 111: { - int motherid_strhad = IsFromWD(mcparticle.template emmcevent_as(), mcparticle, mcparticles); if (mcparticle.isPhysicalPrimary() || mcparticle.producedByGenerator()) { fRegistry->fill(HIST("Pair/Pi0/hs_Primary"), v12.M(), v12.Pt(), weight); } else if (motherid_strhad > 0) { @@ -93,6 +95,10 @@ void fillTruePairInfo(HistogramRegistry* fRegistry, TDiphoton const& v12, TMCPar case 221: { if (mcparticle.isPhysicalPrimary() || mcparticle.producedByGenerator()) { fRegistry->fill(HIST("Pair/Eta/hs_Primary"), v12.M(), v12.Pt(), weight); + } else if (motherid_strhad > 0) { + fRegistry->fill(HIST("Pair/Eta/hs_FromWD"), v12.M(), v12.Pt(), weight); + } else { + fRegistry->fill(HIST("Pair/Eta/hs_FromHS"), v12.M(), v12.Pt(), weight); } break; } From b78f4ccf8244287033c70e26f73d7773c1f6b0b5 Mon Sep 17 00:00:00 2001 From: Antonio Palasciano <52152842+apalasciano@users.noreply.github.com> Date: Mon, 24 Mar 2025 19:35:24 +0100 Subject: [PATCH 0812/1650] [PWGHF,Trigger] Fix proton bachelor selection in D0p and adjust beauty ranges (#10625) --- EventFiltering/PWGHF/HFFilter.cxx | 4 ++-- EventFiltering/PWGHF/HFFilterHelpers.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/EventFiltering/PWGHF/HFFilter.cxx b/EventFiltering/PWGHF/HFFilter.cxx index 034109b0efb..b1666812d52 100644 --- a/EventFiltering/PWGHF/HFFilter.cxx +++ b/EventFiltering/PWGHF/HFFilter.cxx @@ -173,7 +173,7 @@ struct HfFilter { // Main struct for HF triggers std::array, kNCharmParticles> hCharmProtonKstarDistr{}; std::array, kNCharmParticles> hCharmDeuteronKstarDistr{}; std::array, nTotBeautyParts> hMassVsPtB{}; - std::array, kNCharmParticles + 22> hMassVsPtC{}; // +9 for resonances (D*+, D*0, Ds*+, Ds1+, Ds2*+, Xic+* right sign, Xic+* wrong sign, Xic0* right sign, Xic0* wrong sign) +2 for SigmaC (SigmaC++, SigmaC0) +2 for SigmaCK pairs (SigmaC++K-, SigmaC0K0s) +3 for charm baryons (Xi+Pi, Xi+Ka, Xi+Pi+Pi) + JPsi + 4 for charm baryons (D0+p, D0+pWrongSign, D*0p, D*0+pWrongSign) + std::array, kNCharmParticles + 23> hMassVsPtC{}; // +9 for resonances (D*+, D*0, Ds*+, Ds1+, Ds2*+, Xic+* right sign, Xic+* wrong sign, Xic0* right sign, Xic0* wrong sign) +2 for SigmaC (SigmaC++, SigmaC0) +2 for SigmaCK pairs (SigmaC++K-, SigmaC0K0s) +3 for charm baryons (Xi+Pi, Xi+Ka, Xi+Pi+Pi) + JPsi + 4 for charm baryons (D0+p, D0+pWrongSign, D*0p, D*0+pWrongSign) std::array, 4> hPrDePID; // proton TPC, proton TOF, deuteron TPC, deuteron TOF std::array, kNCharmParticles> hBDTScoreBkg{}; std::array, kNCharmParticles> hBDTScorePrompt{}; @@ -954,7 +954,7 @@ struct HfFilter { // Main struct for HF triggers } std::array pVecProton = trackProton.pVector(); auto isSelProton = helper.isSelectedBachelorForCharmBaryon(trackProton, dcaInfoBachProton); - if (isSelProton == kProtonForCharmBaryon) { + if (TESTBIT(isSelProton, kProtonForCharmBaryon)) { if (!keepEvent[kPrCharm2P]) { // we first look for a D*+ for (const auto& trackBachelorId : trackIdsThisCollision) { // start loop over tracks to find bachelor pion diff --git a/EventFiltering/PWGHF/HFFilterHelpers.h b/EventFiltering/PWGHF/HFFilterHelpers.h index c5d35286ac0..affa81f2815 100644 --- a/EventFiltering/PWGHF/HFFilterHelpers.h +++ b/EventFiltering/PWGHF/HFFilterHelpers.h @@ -285,7 +285,7 @@ static const o2::framework::AxisSpec qtAxis{100, 0.f, 0.25f}; static const o2::framework::AxisSpec bdtAxis{100, 0.f, 1.f}; static const o2::framework::AxisSpec phiAxis{36, 0., o2::constants::math::TwoPI}; static const std::array massAxisC = {o2::framework::AxisSpec{250, 1.65f, 2.15f}, o2::framework::AxisSpec{250, 1.65f, 2.15f}, o2::framework::AxisSpec{250, 1.75f, 2.25f}, o2::framework::AxisSpec{250, 2.05f, 2.55f}, o2::framework::AxisSpec{250, 2.25f, 2.75f}, o2::framework::AxisSpec{200, 0.139f, 0.159f}, o2::framework::AxisSpec{250, 0.f, 0.25f}, o2::framework::AxisSpec{250, 0.f, 0.25f}, o2::framework::AxisSpec{200, 0.48f, 0.88f}, o2::framework::AxisSpec{200, 0.48f, 0.88f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{170, 0.13f, 0.3f}, o2::framework::AxisSpec{170, 0.13f, 0.3f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{350, 2.3f, 3.0f}, o2::framework::AxisSpec{350, 2.3f, 3.0f}, o2::framework::AxisSpec{350, 2.3f, 3.0f}, o2::framework::AxisSpec{240, 2.4f, 3.6f}, o2::framework::AxisSpec{300, 0.7f, 1.3f}, o2::framework::AxisSpec{300, 0.7f, 1.3f}, o2::framework::AxisSpec{300, 0.7f, 1.3f}, o2::framework::AxisSpec{300, 0.7f, 1.3f}}; -static const std::array massAxisB = {o2::framework::AxisSpec{240, 4.8f, 6.0f}, o2::framework::AxisSpec{240, 4.8f, 6.0f}, o2::framework::AxisSpec{240, 4.8f, 6.0f}, o2::framework::AxisSpec{240, 4.8f, 6.0f}, o2::framework::AxisSpec{240, 5.0f, 6.2f}, o2::framework::AxisSpec{240, 5.0f, 6.2f}, o2::framework::AxisSpec{240, 4.8f, 6.0f}, o2::framework::AxisSpec{240, 4.8f, 6.0f}, o2::framework::AxisSpec{240, 5.0f, 6.2f}, o2::framework::AxisSpec{240, 5.0f, 6.2f}, o2::framework::AxisSpec{240, 5.8f, 7.0f}}; +static const std::array massAxisB = {o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{240, 5.0f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{240, 5.0f, 6.2f}, o2::framework::AxisSpec{240, 5.8f, 7.0f}}; // default values for configurables // channels to trigger on for femto From 9891b01c74a9b16ab91f41d611ee20f80529c12a Mon Sep 17 00:00:00 2001 From: altsybee Date: Mon, 24 Mar 2025 22:47:32 +0100 Subject: [PATCH 0813/1650] [DPG] Update detectorOccupancyQa.cxx - add configs to suppress heavy histos (#10632) --- DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx | 170 ++++++++++++--------- 1 file changed, 95 insertions(+), 75 deletions(-) diff --git a/DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx b/DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx index bdfbde3f74e..2feefb4ac41 100644 --- a/DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx +++ b/DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx @@ -51,44 +51,46 @@ using FullTracksIU = soa::Join confAddBasicQAhistos{"AddBasicQAhistos", true, "0 - add basic histograms, 1 - skip"}; // o2-linter: disable=name/configurable - Configurable confTimeIntervalForOccupancyCalculation{"TimeIntervalForOccupancyCalculation", 100, "Time interval for TPC occupancy calculation, us"}; // o2-linter: disable=name/configurable - Configurable confOccupancyHistCoeffNtracksForOccupancy{"HistCoeffNtracksForOccupancy", 1., "Coefficient for max nTracks in occupancy histos"}; // o2-linter: disable=name/configurable - Configurable confOccupancyHistCoeffNbins2D{"HistCoeffNbins2D", 1., "Coefficient for nBins in occupancy 2D histos"}; // o2-linter: disable=name/configurable - Configurable confOccupancyHistCoeffNbins3D{"HistCoeffNbins3D", 1., "Coefficient for nBins in occupancy 3D histos"}; // o2-linter: disable=name/configurable - Configurable confCoeffMaxNtracksThisEvent{"CoeffMaxNtracksThisEvent", 1., "Coefficient for max nTracks or FT0 ampl in histos in a given event"}; // o2-linter: disable=name/configurable - Configurable confFlagApplyROFborderCut{"ApplyROFborderCut", true, "Use ROF border cut for a current event"}; // o2-linter: disable=name/configurable - Configurable confFlagApplyTFborderCut{"ApplyTFborderCut", true, "Use TF border cut for a current event"}; // o2-linter: disable=name/configurable - Configurable confFlagWhichTimeRange{"FlagWhichTimeRange", 0, "Whicn time range for occupancy calculation: 0 - symmetric, 1 - only past, 2 - only future"}; // o2-linter: disable=name/configurable - Configurable confFlagUseGlobalTracks{"FlagUseGlobalTracks", false, "For small time bins, use global tracks counter instead of ITSTPC tracks"}; // o2-linter: disable=name/configurable - Configurable confFlagUseNoCollInRofStrict{"FlagUseNoCollInRofStrict", false, "Suppress same-ROF events for occupancy historams"}; // o2-linter: disable=name/configurable - Configurable confFlagUseNoHighMultCollInPrevRof{"FlagUseNoHighMultCollInPrevRof", false, "Suppress high-multiplicity prev-ROF events for occupancy historams"}; // o2-linter: disable=name/configurable + Configurable confAddBasicQAhistos{"AddBasicQAhistos", true, "0 - add basic histograms, 1 - skip"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confTimeIntervalForOccupancyCalculation{"TimeIntervalForOccupancyCalculation", 100, "Time interval for TPC occupancy calculation, us"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confOccupancyHistCoeffNtracksForOccupancy{"HistCoeffNtracksForOccupancy", 1., "Coefficient for max nTracks in occupancy histos"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confOccupancyHistCoeffNbins2D{"HistCoeffNbins2D", 1., "Coefficient for nBins in occupancy 2D histos"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confOccupancyHistCoeffNbins3D{"HistCoeffNbins3D", 1., "Coefficient for nBins in occupancy 3D histos"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confCoeffMaxNtracksThisEvent{"CoeffMaxNtracksThisEvent", 1., "Coefficient for max nTracks or FT0 ampl in histos in a given event"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confFlagApplyROFborderCut{"ApplyROFborderCut", true, "Use ROF border cut for a current event"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confFlagApplyTFborderCut{"ApplyTFborderCut", true, "Use TF border cut for a current event"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confFlagWhichTimeRange{"FlagWhichTimeRange", 0, "Whicn time range for occupancy calculation: 0 - symmetric, 1 - only past, 2 - only future"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confFlagUseGlobalTracks{"FlagUseGlobalTracks", false, "For small time bins, use global tracks counter instead of ITSTPC tracks"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confFlagUseNoCollInRofStrict{"FlagUseNoCollInRofStrict", false, "Suppress same-ROF events for occupancy historams"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confFlagUseNoHighMultCollInPrevRof{"FlagUseNoHighMultCollInPrevRof", false, "Suppress high-multiplicity prev-ROF events for occupancy historams"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confFlagCentralityIsAvailable{"FlagCentralityIsAvailable", true, "Fill centrality-related historams"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confFlagManyHeavyHistos{"FlagManyHeavyHistos", true, "Fill more TH2, TH3, THn historams"}; // o2-linter: disable=name/configurable (temporary fix) // configuration for small time binning - Configurable confTimeIntervalForSmallBins{"TimeIntervalForSmallBins", 100, "Time interval for TPC occupancy calculation in small bins, +/-, us"}; // o2-linter: disable=name/configurable - Configurable confNumberOfSmallTimeBins{"nSmallTimeBins", 40, "Number of small time bins"}; // o2-linter: disable=name/configurable + Configurable confTimeIntervalForSmallBins{"TimeIntervalForSmallBins", 100, "Time interval for TPC occupancy calculation in small bins, +/-, us"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confNumberOfSmallTimeBins{"nSmallTimeBins", 40, "Number of small time bins"}; // o2-linter: disable=name/configurable (temporary fix) // event and track cuts for given event - Configurable confCutVertZMinThisEvent{"VzMinThisEvent", -10, "vZ cut for a current event"}; // o2-linter: disable=name/configurable - Configurable confCutVertZMaxThisEvent{"VzMaxThisEvent", 10, "vZ cut for a current event"}; // o2-linter: disable=name/configurable - Configurable confCutPtMinThisEvent{"PtMinThisEvent", 0.2, "pt cut for particles in a current event"}; // o2-linter: disable=name/configurable - Configurable confCutPtMaxThisEvent{"PtMaxThisEvent", 100., "pt cut for particles in a current event"}; // o2-linter: disable=name/configurable - Configurable confCutEtaMinTracksThisEvent{"EtaMinTracksThisEvent", -0.8, "eta cut for particles in a current event"}; // o2-linter: disable=name/configurable - Configurable confCutEtaMaxTracksThisEvent{"EtaMaxTracksThisEvent", 0.8, "eta cut for particles in a current event"}; // o2-linter: disable=name/configurable - Configurable confCutMinTPCcls{"MinNumTPCcls", 70, "min number of TPC clusters for a current event"}; // o2-linter: disable=name/configurable + Configurable confCutVertZMinThisEvent{"VzMinThisEvent", -10, "vZ cut for a current event"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confCutVertZMaxThisEvent{"VzMaxThisEvent", 10, "vZ cut for a current event"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confCutPtMinThisEvent{"PtMinThisEvent", 0.2, "pt cut for particles in a current event"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confCutPtMaxThisEvent{"PtMaxThisEvent", 100., "pt cut for particles in a current event"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confCutEtaMinTracksThisEvent{"EtaMinTracksThisEvent", -0.8, "eta cut for particles in a current event"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confCutEtaMaxTracksThisEvent{"EtaMaxTracksThisEvent", 0.8, "eta cut for particles in a current event"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confCutMinTPCcls{"MinNumTPCcls", 70, "min number of TPC clusters for a current event"}; // o2-linter: disable=name/configurable (temporary fix) // config for QA histograms - Configurable confAddTracksVsFwdHistos{"AddTracksVsFwdHistos", true, "0 - add histograms, 1 - skip"}; // o2-linter: disable=name/configurable - Configurable nBinsTracks{"nBinsTracks", 400, "N bins in n tracks histo"}; // o2-linter: disable=name/configurable - Configurable nMaxTracks{"nMaxTracks", 8000, "N max in n tracks histo"}; // o2-linter: disable=name/configurable - Configurable nMaxGlobalTracks{"nMaxGlobalTracks", 3000, "N max in n tracks histo"}; // o2-linter: disable=name/configurable - Configurable nBinsMultFwd{"nBinsMultFwd", 400, "N bins in mult fwd histo"}; // o2-linter: disable=name/configurable - Configurable nMaxMultFwd{"nMaxMultFwd", 200000, "N max in mult fwd histo"}; // o2-linter: disable=name/configurable + Configurable confAddTracksVsFwdHistos{"AddTracksVsFwdHistos", true, "0 - add histograms, 1 - skip"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable nBinsTracks{"nBinsTracks", 400, "N bins in n tracks histo"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable nMaxTracks{"nMaxTracks", 8000, "N max in n tracks histo"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable nMaxGlobalTracks{"nMaxGlobalTracks", 3000, "N max in n tracks histo"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable nBinsMultFwd{"nBinsMultFwd", 400, "N bins in mult fwd histo"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable nMaxMultFwd{"nMaxMultFwd", 200000, "N max in mult fwd histo"}; // o2-linter: disable=name/configurable (temporary fix) - Configurable nBinsOccupancy{"nBinsOccupancy", 150, "N bins for occupancy axis"}; // o2-linter: disable=name/configurable - Configurable nMaxOccupancy{"nMaxOccupancy", 15000, "N for max of the occupancy axis"}; // o2-linter: disable=name/configurable + Configurable nBinsOccupancy{"nBinsOccupancy", 150, "N bins for occupancy axis"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable nMaxOccupancy{"nMaxOccupancy", 15000, "N for max of the occupancy axis"}; // o2-linter: disable=name/configurable (temporary fix) - Configurable nMaxBcInTFforAnalysis{"nMaxBcInTFforAnalysis", -1, "When to stop taking collisions in TF, if -1: take all collisions"}; // o2-linter: disable=name/configurable + Configurable nMaxBcInTFforAnalysis{"nMaxBcInTFforAnalysis", -1, "When to stop taking collisions in TF, if -1: take all collisions"}; // o2-linter: disable=name/configurable (temporary fix) uint64_t minGlobalBC = 0; Service ccdb; @@ -149,8 +151,10 @@ struct DetectorOccupancyQaTask { histos.add("dEdx_vs_Momentum_occupAbove4000", "dE/dx", kTH2F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, {800, 0.0, 800.0, "dE/dx (a. u.)"}}); AxisSpec axisBinsOccupStudydEdx{{0., 500, 1000, 2000, 4000, 6000, 8000, 15000}, "p_{T}"}; histos.add("dEdx_vs_Momentum_vs_occup", "dE/dx", kTH3F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, {800, 0.0, 800.0, "dE/dx (a. u.)"}, axisBinsOccupStudydEdx}); - histos.add("dEdx_vs_Momentum_vs_occup_eta_02_04", "dE/dx", kTH3F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, {800, 0.0, 800.0, "dE/dx (a. u.)"}, axisBinsOccupStudydEdx}); - histos.add("dEdx_vs_Momentum_vs_occup_eta_04_02", "dE/dx", kTH3F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, {800, 0.0, 800.0, "dE/dx (a. u.)"}, axisBinsOccupStudydEdx}); + if (confFlagManyHeavyHistos) { + histos.add("dEdx_vs_Momentum_vs_occup_eta_02_04", "dE/dx", kTH3F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, {800, 0.0, 800.0, "dE/dx (a. u.)"}, axisBinsOccupStudydEdx}); + histos.add("dEdx_vs_Momentum_vs_occup_eta_04_02", "dE/dx", kTH3F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, {800, 0.0, 800.0, "dE/dx (a. u.)"}, axisBinsOccupStudydEdx}); + } histos.add("dEdx_vs_centr_vs_occup_narrow_p_win", "dE/dx", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, {60, 0, 15000, "occupancy"}, {800, 0.0, 800.0, "dE/dx (a. u.)"}}); @@ -172,7 +176,7 @@ struct DetectorOccupancyQaTask { histos.add("track_distr_nITStrThisEv_above_2000/hEta_highOccupInNeighbourEvents", ";#eta;n tracks", kTH1D, {{nEtaBins, -1.0, 1.0}}); const int nPhiBins = 800; - AxisSpec axisPhi{nPhiBins, 0, TMath::TwoPi(), "#varphi"}; // o2-linter: disable=external-pi + AxisSpec axisPhi{nPhiBins, 0, TMath::TwoPi(), "#varphi"}; // o2-linter: disable=external-pi (temporary fix) histos.add("track_distr_nITStrThisEv_10_200/hPhi_lowOccupInTPC", ";#varphi;n tracks", kTH1D, {axisPhi}); histos.add("track_distr_nITStrThisEv_10_200/hPhi_highOccupInRecentPast", ";#varphi;n tracks", kTH1D, {axisPhi}); histos.add("track_distr_nITStrThisEv_10_200/hPhi_highOccupInCloseFuture", ";#varphi;n tracks", kTH1D, {axisPhi}); @@ -201,10 +205,12 @@ struct DetectorOccupancyQaTask { histos.add("track_distr_nITStrThisEv_above_2000/hPt_highOccupInNeighbourEvents", ";p_{T};n tracks", kTH1D, {axisLogPt}); // 3D: pt vs centr vs occup - histos.add("ptGlobal_vs_centr_vs_occup", "", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, {60, 0, 15000, "occupancy"}, axisLogPt}); - histos.add("ptPV_vs_centr_vs_occup", "", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, {60, 0, 15000, "occupancy"}, axisLogPt}); - histos.add("ptGlobal_vs_centr_vs_occup_NoCollStd", "", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, {60, 0, 15000, "occupancy"}, axisLogPt}); - histos.add("ptPV_vs_centr_vs_occup_NoCollStd", "", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, {60, 0, 15000, "occupancy"}, axisLogPt}); + if (confFlagManyHeavyHistos) { + histos.add("ptGlobal_vs_centr_vs_occup", "", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, {60, 0, 15000, "occupancy"}, axisLogPt}); + histos.add("ptPV_vs_centr_vs_occup", "", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, {60, 0, 15000, "occupancy"}, axisLogPt}); + histos.add("ptGlobal_vs_centr_vs_occup_NoCollStd", "", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, {60, 0, 15000, "occupancy"}, axisLogPt}); + histos.add("ptPV_vs_centr_vs_occup_NoCollStd", "", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, {60, 0, 15000, "occupancy"}, axisLogPt}); + } } // 2D int nBins3D = 80 * confOccupancyHistCoeffNbins3D; @@ -245,19 +251,22 @@ struct DetectorOccupancyQaTask { const AxisSpec axisTimeBins{arrTimeBins, "#Delta t, #mus"}; int nBinsX = 20; int nBinsY = 40; - histos.add("occupancyInTimeBins_BEFORE_sel", ";time bin (#mus);n ITS tracks with 5,6,7 cls, this collision;n ITS-TPC tracks, this collision;ITS tracks with 5,6,7 cls in time window", kTHnF, {axisTimeBins, {nBinsX, 0, kMaxThisEv * 4000}, {nBinsY, 0, kMaxThisEv * 4000}, {nBins3DoccupancyAxis, 0, kMaxOccup * 10000}}); - histos.add("occupancyInTimeBins_occupByFT0_BEFORE_sel", ";time bin (#mus);n ITS tracks with 5,6,7 cls, this collision;n ITS-TPC tracks, this collision;sum FT0 in time window", kTHnF, {axisTimeBins, {nBinsX, 0, kMaxThisEv * 4000}, {nBinsY, 0, kMaxThisEv * 4000}, {nBins3DoccupancyAxis, 0, kMaxOccup * 100000}}); - histos.add("occupancyInTimeBins", ";time bin (#mus);n ITS tracks with 5,6,7 cls, this collision;n ITS-TPC tracks, this collision;ITS tracks with 5,6,7 cls in time window", kTHnF, {axisTimeBins, {nBinsX, 0, kMaxThisEv * 4000}, {nBinsY, 0, kMaxThisEv * 4000}, {nBins3DoccupancyAxis, 0, kMaxOccup * 10000}}); - histos.add("occupancyInTimeBins_occupByFT0", ";time bin (#mus);n ITS tracks with 5,6,7 cls, this collision;n ITS-TPC tracks, this collision;sum FT0 in time window", kTHnF, {axisTimeBins, {nBinsX, 0, kMaxThisEv * 4000}, {nBinsY, 0, kMaxThisEv * 4000}, {nBins3DoccupancyAxis, 0, kMaxOccup * 100000}}); - histos.add("occupancyInTimeBins_occupByFT0_kNoCollInTimeRangeNarrow", ";time bin (#mus);n ITS tracks with 5,6,7 cls, this collision;n ITS-TPC tracks, this collision;sum FT0 in time window", kTHnF, {axisTimeBins, {nBinsX, 0, kMaxThisEv * 4000}, {nBinsY, 0, kMaxThisEv * 4000}, {nBins3DoccupancyAxis, 0, kMaxOccup * 100000}}); - histos.add("occupancyInTimeBins_vs_FT0thisCol_kNoCollInTimeRangeNarrow", ";time bin (#mus);FT0C this collision, this collision;n ITS-TPC tracks, this collision;ITS tracks with 5,6,7 cls in time window", kTHnF, {axisTimeBins, {nBins3D, 0, kMaxThisEv * 100000}, {nBinsY, 0, kMaxThisEv * 4000}, {nBins3DoccupancyAxis, 0, kMaxOccup * 10000}}); - histos.add("occupancyInTimeBins_vs_FT0thisCol_occupByFT0_kNoCollInTimeRangeNarrow", ";time bin (#mus);FT0C this collision, this collision;n ITS-TPC tracks, this collision;sum FT0 in time window", kTHnF, {axisTimeBins, {nBins3D, 0, kMaxThisEv * 100000}, {nBinsY, 0, kMaxThisEv * 4000}, {nBins3DoccupancyAxis, 0, kMaxOccup * 100000}}); - histos.add("occupancyInTimeBins_nITS567_vs_FT0thisCol_kNoCollInTimeRangeNarrow", ";time bin (#mus);FT0C this collision, this collision;n ITS567cls tracks, this collision;ITS tracks with 5,6,7 cls in time window", kTHnF, {axisTimeBins, {nBins3D, 0, kMaxThisEv * 100000}, {nBinsY, 0, kMaxThisEv * 4000}, {nBins3DoccupancyAxis, 0, kMaxOccup * 10000}}); - histos.add("occupancyInTimeBins_nITS567_vs_FT0thisCol_occupByFT0_kNoCollInTimeRangeNarrow", ";time bin (#mus);FT0C this collision, this collision;n ITS567cls tracks, this collision;sum FT0 in time window", kTHnF, {axisTimeBins, {nBins3D, 0, kMaxThisEv * 100000}, {nBinsY, 0, kMaxThisEv * 4000}, {nBins3DoccupancyAxis, 0, kMaxOccup * 100000}}); - histos.add("occupancyInTimeBins_nITS567_vs_FT0thisCol_occupByFT0_kNoCollInTimeRangeNarrow_NoCollInRofStrict", ";time bin (#mus);FT0C this collision, this collision;n ITS567cls tracks, this collision;sum FT0 in time window", kTHnF, {axisTimeBins, {nBins3D, 0, kMaxThisEv * 100000}, {nBinsY, 0, kMaxThisEv * 4000}, {nBins3DoccupancyAxis, 0, kMaxOccup * 100000}}); + + if (confFlagManyHeavyHistos) { + histos.add("occupancyInTimeBins_BEFORE_sel", ";time bin (#mus);n ITS tracks with 5,6,7 cls, this collision;n ITS-TPC tracks, this collision;ITS tracks with 5,6,7 cls in time window", kTHnF, {axisTimeBins, {nBinsX, 0, kMaxThisEv * 4000}, {nBinsY, 0, kMaxThisEv * 4000}, {nBins3DoccupancyAxis, 0, kMaxOccup * 10000}}); + histos.add("occupancyInTimeBins_occupByFT0_BEFORE_sel", ";time bin (#mus);n ITS tracks with 5,6,7 cls, this collision;n ITS-TPC tracks, this collision;sum FT0 in time window", kTHnF, {axisTimeBins, {nBinsX, 0, kMaxThisEv * 4000}, {nBinsY, 0, kMaxThisEv * 4000}, {nBins3DoccupancyAxis, 0, kMaxOccup * 100000}}); + + histos.add("occupancyInTimeBins_occupByFT0", ";time bin (#mus);n ITS tracks with 5,6,7 cls, this collision;n ITS-TPC tracks, this collision;sum FT0 in time window", kTHnF, {axisTimeBins, {nBinsX, 0, kMaxThisEv * 4000}, {nBinsY, 0, kMaxThisEv * 4000}, {nBins3DoccupancyAxis, 0, kMaxOccup * 100000}}); + histos.add("occupancyInTimeBins_occupByFT0_kNoCollInTimeRangeNarrow", ";time bin (#mus);n ITS tracks with 5,6,7 cls, this collision;n ITS-TPC tracks, this collision;sum FT0 in time window", kTHnF, {axisTimeBins, {nBinsX, 0, kMaxThisEv * 4000}, {nBinsY, 0, kMaxThisEv * 4000}, {nBins3DoccupancyAxis, 0, kMaxOccup * 100000}}); + + histos.add("occupancyInTimeBins_vs_FT0thisCol_occupByFT0_kNoCollInTimeRangeNarrow", ";time bin (#mus);FT0C this collision, this collision;n ITS-TPC tracks, this collision;sum FT0 in time window", kTHnF, {axisTimeBins, {nBins3D, 0, kMaxThisEv * 100000}, {nBinsY, 0, kMaxThisEv * 4000}, {nBins3DoccupancyAxis, 0, kMaxOccup * 100000}}); + + histos.add("occupancyInTimeBins_nITS567_vs_FT0thisCol_occupByFT0_kNoCollInTimeRangeNarrow", ";time bin (#mus);FT0C this collision, this collision;n ITS567cls tracks, this collision;sum FT0 in time window", kTHnF, {axisTimeBins, {nBins3D, 0, kMaxThisEv * 100000}, {nBinsY, 0, kMaxThisEv * 4000}, {nBins3DoccupancyAxis, 0, kMaxOccup * 100000}}); + histos.add("occupancyInTimeBins_nITS567_vs_FT0thisCol_occupByFT0_kNoCollInTimeRangeNarrow_NoCollInRofStrict", ";time bin (#mus);FT0C this collision, this collision;n ITS567cls tracks, this collision;sum FT0 in time window", kTHnF, {axisTimeBins, {nBins3D, 0, kMaxThisEv * 100000}, {nBinsY, 0, kMaxThisEv * 4000}, {nBins3DoccupancyAxis, 0, kMaxOccup * 100000}}); + } histos.add("thisEventITStracksInTimeBins", ";time bin (#mus);n tracks", kTH1F, {axisTimeBins}); histos.add("thisEventITSTPCtracksInTimeBins", ";time bin (#mus);n tracks", kTH1F, {axisTimeBins}); @@ -276,9 +285,11 @@ struct DetectorOccupancyQaTask { histos.add("hOccupancyVsOrbit", ";orbit id;weighted occupancy;n events", kTH2F, {{128, -0.5, 127.5}, {600, 0, 15000}}); AxisSpec axisOccupancyTracks{nBinsOccupancy, 0., nMaxOccupancy, "occupancy (n ITS tracks weighted)"}; - AxisSpec axisCentrality{100, 0, 100, "centrality, %"}; - histos.add("hCentrVsOccupancy", "hCentrVsOccupancy", kTH2F, {axisCentrality, axisOccupancyTracks}); - histos.add("hCentrVsOccupancyNoCollStd", "hCentrVsOccupancyNoCollStd", kTH2F, {axisCentrality, axisOccupancyTracks}); + if (confFlagCentralityIsAvailable) { + AxisSpec axisCentrality{100, 0, 100, "centrality, %"}; + histos.add("hCentrVsOccupancy", "hCentrVsOccupancy", kTH2F, {axisCentrality, axisOccupancyTracks}); + histos.add("hCentrVsOccupancyNoCollStd", "hCentrVsOccupancyNoCollStd", kTH2F, {axisCentrality, axisOccupancyTracks}); + } if (confAddTracksVsFwdHistos) { AxisSpec axisNtracks{nBinsTracks, -0.5, nMaxTracks - 0.5, "n tracks"}; @@ -725,9 +736,10 @@ struct DetectorOccupancyQaTask { int nFT0CInTimeBin = histos.get(HIST("thisEventFT0CInTimeBins"))->GetBinContent(iT + 1); - histos.fill(HIST("occupancyInTimeBins_BEFORE_sel"), dt, vTracksITS567perCollPtEtaCuts[colIndex], confFlagUseGlobalTracks ? vTracksGlobalPerCollPtEtaCuts[colIndex] : vTracksITSTPCperCollPtEtaCuts[colIndex], nITStrInTimeBin); - histos.fill(HIST("occupancyInTimeBins_occupByFT0_BEFORE_sel"), dt, vTracksITS567perCollPtEtaCuts[colIndex], confFlagUseGlobalTracks ? vTracksGlobalPerCollPtEtaCuts[colIndex] : vTracksITSTPCperCollPtEtaCuts[colIndex], nFT0CInTimeBin); - + if (confFlagManyHeavyHistos) { + histos.fill(HIST("occupancyInTimeBins_BEFORE_sel"), dt, vTracksITS567perCollPtEtaCuts[colIndex], confFlagUseGlobalTracks ? vTracksGlobalPerCollPtEtaCuts[colIndex] : vTracksITSTPCperCollPtEtaCuts[colIndex], nITStrInTimeBin); + histos.fill(HIST("occupancyInTimeBins_occupByFT0_BEFORE_sel"), dt, vTracksITS567perCollPtEtaCuts[colIndex], confFlagUseGlobalTracks ? vTracksGlobalPerCollPtEtaCuts[colIndex] : vTracksITSTPCperCollPtEtaCuts[colIndex], nFT0CInTimeBin); + } bool flagFillOccupVsDt = true; if (confFlagUseNoCollInRofStrict && !col.selection_bit(kNoCollInRofStrict)) flagFillOccupVsDt = false; @@ -736,17 +748,20 @@ struct DetectorOccupancyQaTask { if (sel && std::fabs(col.posZ()) < 10 && flagFillOccupVsDt) { histos.fill(HIST("occupancyInTimeBins"), dt, vTracksITS567perCollPtEtaCuts[colIndex], confFlagUseGlobalTracks ? vTracksGlobalPerCollPtEtaCuts[colIndex] : vTracksITSTPCperCollPtEtaCuts[colIndex], nITStrInTimeBin); - histos.fill(HIST("occupancyInTimeBins_occupByFT0"), dt, vTracksITS567perCollPtEtaCuts[colIndex], confFlagUseGlobalTracks ? vTracksGlobalPerCollPtEtaCuts[colIndex] : vTracksITSTPCperCollPtEtaCuts[colIndex], nFT0CInTimeBin); + if (confFlagManyHeavyHistos) + histos.fill(HIST("occupancyInTimeBins_occupByFT0"), dt, vTracksITS567perCollPtEtaCuts[colIndex], confFlagUseGlobalTracks ? vTracksGlobalPerCollPtEtaCuts[colIndex] : vTracksITSTPCperCollPtEtaCuts[colIndex], nFT0CInTimeBin); if (col.selection_bit(kNoCollInTimeRangeNarrow)) { - histos.fill(HIST("occupancyInTimeBins_occupByFT0_kNoCollInTimeRangeNarrow"), dt, vTracksITS567perCollPtEtaCuts[colIndex], confFlagUseGlobalTracks ? vTracksGlobalPerCollPtEtaCuts[colIndex] : vTracksITSTPCperCollPtEtaCuts[colIndex], nFT0CInTimeBin); histos.fill(HIST("occupancyInTimeBins_vs_FT0thisCol_kNoCollInTimeRangeNarrow"), dt, vAmpFT0CperColl[colIndex], confFlagUseGlobalTracks ? vTracksGlobalPerCollPtEtaCuts[colIndex] : vTracksITSTPCperCollPtEtaCuts[colIndex], nITStrInTimeBin); - histos.fill(HIST("occupancyInTimeBins_vs_FT0thisCol_occupByFT0_kNoCollInTimeRangeNarrow"), dt, vAmpFT0CperColl[colIndex], confFlagUseGlobalTracks ? vTracksGlobalPerCollPtEtaCuts[colIndex] : vTracksITSTPCperCollPtEtaCuts[colIndex], nFT0CInTimeBin); - histos.fill(HIST("occupancyInTimeBins_nITS567_vs_FT0thisCol_kNoCollInTimeRangeNarrow"), dt, vAmpFT0CperColl[colIndex], vTracksITS567perCollPtEtaCuts[colIndex], nITStrInTimeBin); - histos.fill(HIST("occupancyInTimeBins_nITS567_vs_FT0thisCol_occupByFT0_kNoCollInTimeRangeNarrow"), dt, vAmpFT0CperColl[colIndex], vTracksITS567perCollPtEtaCuts[colIndex], nFT0CInTimeBin); - if (col.selection_bit(kNoCollInRofStrict)) - histos.fill(HIST("occupancyInTimeBins_nITS567_vs_FT0thisCol_occupByFT0_kNoCollInTimeRangeNarrow_NoCollInRofStrict"), dt, vAmpFT0CperColl[colIndex], vTracksITS567perCollPtEtaCuts[colIndex], nFT0CInTimeBin); + if (confFlagManyHeavyHistos) { + histos.fill(HIST("occupancyInTimeBins_occupByFT0_kNoCollInTimeRangeNarrow"), dt, vTracksITS567perCollPtEtaCuts[colIndex], confFlagUseGlobalTracks ? vTracksGlobalPerCollPtEtaCuts[colIndex] : vTracksITSTPCperCollPtEtaCuts[colIndex], nFT0CInTimeBin); + histos.fill(HIST("occupancyInTimeBins_vs_FT0thisCol_occupByFT0_kNoCollInTimeRangeNarrow"), dt, vAmpFT0CperColl[colIndex], confFlagUseGlobalTracks ? vTracksGlobalPerCollPtEtaCuts[colIndex] : vTracksITSTPCperCollPtEtaCuts[colIndex], nFT0CInTimeBin); + + histos.fill(HIST("occupancyInTimeBins_nITS567_vs_FT0thisCol_occupByFT0_kNoCollInTimeRangeNarrow"), dt, vAmpFT0CperColl[colIndex], vTracksITS567perCollPtEtaCuts[colIndex], nFT0CInTimeBin); + if (col.selection_bit(kNoCollInRofStrict)) + histos.fill(HIST("occupancyInTimeBins_nITS567_vs_FT0thisCol_occupByFT0_kNoCollInTimeRangeNarrow_NoCollInRofStrict"), dt, vAmpFT0CperColl[colIndex], vTracksITS567perCollPtEtaCuts[colIndex], nFT0CInTimeBin); + } } } @@ -831,11 +846,12 @@ struct DetectorOccupancyQaTask { if (occupancy >= 0) { histos.fill(HIST("dEdx_vs_Momentum_vs_occup"), signedP, track.tpcSignal(), occupancy); - if (track.eta() > 0.2 && track.eta() < 0.4) - histos.fill(HIST("dEdx_vs_Momentum_vs_occup_eta_02_04"), signedP, track.tpcSignal(), occupancy); - if (track.eta() > -0.4 && track.eta() < -0.2) - histos.fill(HIST("dEdx_vs_Momentum_vs_occup_eta_04_02"), signedP, track.tpcSignal(), occupancy); - + if (confFlagManyHeavyHistos) { + if (track.eta() > 0.2 && track.eta() < 0.4) + histos.fill(HIST("dEdx_vs_Momentum_vs_occup_eta_02_04"), signedP, track.tpcSignal(), occupancy); + if (track.eta() > -0.4 && track.eta() < -0.2) + histos.fill(HIST("dEdx_vs_Momentum_vs_occup_eta_04_02"), signedP, track.tpcSignal(), occupancy); + } // dE/dx in narrow mom bin vs centrality and occupancy if (signedP > 0.38 && signedP < 0.4) histos.fill(HIST("dEdx_vs_centr_vs_occup_narrow_p_win"), nPV, occupancy, track.tpcSignal()); @@ -894,11 +910,13 @@ struct DetectorOccupancyQaTask { // pt vs centr vs occup if (occupancy >= 0) { - histos.fill(HIST("ptGlobal_vs_centr_vs_occup"), nPV, occupancy, track.pt()); - histos.fill(HIST("ptPV_vs_centr_vs_occup"), nPV, occupancy, track.pt()); - if (col.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { - histos.fill(HIST("ptGlobal_vs_centr_vs_occup_NoCollStd"), nPV, occupancy, track.pt()); - histos.fill(HIST("ptPV_vs_centr_vs_occup_NoCollStd"), nPV, occupancy, track.pt()); + if (confFlagManyHeavyHistos) { + histos.fill(HIST("ptGlobal_vs_centr_vs_occup"), nPV, occupancy, track.pt()); + histos.fill(HIST("ptPV_vs_centr_vs_occup"), nPV, occupancy, track.pt()); + if (col.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + histos.fill(HIST("ptGlobal_vs_centr_vs_occup_NoCollStd"), nPV, occupancy, track.pt()); + histos.fill(HIST("ptPV_vs_centr_vs_occup_NoCollStd"), nPV, occupancy, track.pt()); + } } if (nPV >= 10 && nPV < 200) { @@ -959,11 +977,13 @@ struct DetectorOccupancyQaTask { } // end of spec track loop to fill track histograms // occupancy vs centrality - auto t0cCentr = col.centFT0C(); - if (occupancy >= 0) { - histos.fill(HIST("hCentrVsOccupancy"), t0cCentr, occupancy); - if (col.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) - histos.fill(HIST("hCentrVsOccupancyNoCollStd"), t0cCentr, occupancy); + if (confFlagCentralityIsAvailable) { + auto t0cCentr = col.centFT0C(); + if (occupancy >= 0) { + histos.fill(HIST("hCentrVsOccupancy"), t0cCentr, occupancy); + if (col.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) + histos.fill(HIST("hCentrVsOccupancyNoCollStd"), t0cCentr, occupancy); + } } if (!confAddTracksVsFwdHistos) { From 19f1482f98d1be4fca70fb1cb219228d9381594e Mon Sep 17 00:00:00 2001 From: Preet-Bhanjan Date: Mon, 24 Mar 2025 23:10:43 +0100 Subject: [PATCH 0814/1650] [PWGCF] Addition of more correlators (#10629) Co-authored-by: Preet Pati Co-authored-by: Preet Pati --- PWGCF/Flow/Tasks/resonancesGfwFlow.cxx | 205 ++++++++++++++++++------- 1 file changed, 152 insertions(+), 53 deletions(-) diff --git a/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx b/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx index 949c7a49757..b107c8fdcfc 100644 --- a/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx +++ b/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx @@ -107,8 +107,8 @@ struct ResonancesGfwFlow { O2_DEFINE_CONFIGURABLE(cfgDCAK0PosToPVMin, float, 0.06f, "minimum DCA to PV for K0 positive track") O2_DEFINE_CONFIGURABLE(cfgDCAK0NegToPVMin, float, 0.06f, "minimum DCA to PV for K0 negative track") O2_DEFINE_CONFIGURABLE(cfgDCAK0BetDaug, int, 1, "Maximum DCA between K0 daughter tracks") - O2_DEFINE_CONFIGURABLE(cfgMassLambdaMin, float, 1.08f, "minimum lambda mass") - O2_DEFINE_CONFIGURABLE(cfgMassLambdaMax, float, 1.15f, "maximum lambda mass") + O2_DEFINE_CONFIGURABLE(cfgMassLambdaMin, float, 1.1f, "minimum lambda mass") + O2_DEFINE_CONFIGURABLE(cfgMassLambdaMax, float, 1.16f, "maximum lambda mass") O2_DEFINE_CONFIGURABLE(cfgMassK0Min, float, 0.44f, "minimum K0short mass") O2_DEFINE_CONFIGURABLE(cfgMassK0Max, float, 0.56f, "maximum K0short mass") O2_DEFINE_CONFIGURABLE(cfgUseMCCLambda, bool, false, "Use mass cross check for lambda") @@ -188,7 +188,7 @@ struct ResonancesGfwFlow { histos.add("hAntiLambdaPhi", "", {HistType::kTH1D, {axisPhi}}); histos.add("hAntiLambdaEta", "", {HistType::kTH1D, {axisEta}}); histos.add("hAntiLambdaMass_sparse", "", {HistType::kTHnSparseF, {{axisLambdaMass, axisPt, axisMultiplicity}}}); - histos.add("hLambdaCount", "", {HistType::kTH1D, {singleCount}}); + histos.add("hLambdas", "", {HistType::kTH1D, {singleCount}}); histos.add("PlusTPC_K0", "", {HistType::kTH2D, {{axisPt, axisTPCsignal}}}); histos.add("MinusTPC_K0", "", {HistType::kTH2D, {{axisPt, axisTPCsignal}}}); @@ -197,27 +197,63 @@ struct ResonancesGfwFlow { histos.add("hK0Phi", "", {HistType::kTH1D, {axisPhi}}); histos.add("hK0Eta", "", {HistType::kTH1D, {axisEta}}); histos.add("hK0Mass_sparse", "", {HistType::kTHnSparseF, {{axisK0Mass, axisPt, axisMultiplicity}}}); - histos.add("hK0Count", "", {HistType::kTH1D, {singleCount}}); + histos.add("hK0s", "", {HistType::kTH1D, {singleCount}}); histos.add("Phic22", "", {HistType::kTProfile, {axisMultiplicity}}); histos.add("Phic24", "", {HistType::kTProfile, {axisMultiplicity}}); - histos.add("Phiv22pt", "", {HistType::kTProfile3D, {{axisPt, axisPhiMass, axisMultiplicity}}}); - histos.add("Phiv24pt", "", {HistType::kTProfile3D, {{axisPt, axisPhiMass, axisMultiplicity}}}); + histos.add("Phiv22pt", "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); + histos.add("Phiv24pt", "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); histos.add("K0c22", "", {HistType::kTProfile, {axisMultiplicity}}); histos.add("K0c24", "", {HistType::kTProfile, {axisMultiplicity}}); - histos.add("K0v22pt", "", {HistType::kTProfile3D, {{axisPt, axisK0Mass, axisMultiplicity}}}); - histos.add("K0v24pt", "", {HistType::kTProfile3D, {{axisPt, axisK0Mass, axisMultiplicity}}}); + histos.add("K0v22pt", "", {HistType::kTProfile3D, {axisPt, axisK0Mass, axisMultiplicity}}); + histos.add("K0v24pt", "", {HistType::kTProfile3D, {axisPt, axisK0Mass, axisMultiplicity}}); histos.add("Lambdac22", "", {HistType::kTProfile, {axisMultiplicity}}); histos.add("Lambdac24", "", {HistType::kTProfile, {axisMultiplicity}}); - histos.add("Lambdav22pt", "", {HistType::kTProfile3D, {{axisPt, axisLambdaMass, axisMultiplicity}}}); - histos.add("Lambdav24pt", "", {HistType::kTProfile3D, {{axisPt, axisLambdaMass, axisMultiplicity}}}); + histos.add("Lambdav22pt", "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); + histos.add("Lambdav24pt", "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); histos.add("AnLambdac22", "", {HistType::kTProfile, {axisMultiplicity}}); histos.add("AnLambdac24", "", {HistType::kTProfile, {axisMultiplicity}}); - histos.add("AnLambdav22pt", "", {HistType::kTProfile3D, {{axisPt, axisLambdaMass, axisMultiplicity}}}); - histos.add("AnLambdav24pt", "", {HistType::kTProfile3D, {{axisPt, axisLambdaMass, axisMultiplicity}}}); + histos.add("AnLambdav22pt", "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); + histos.add("AnLambdav24pt", "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); + + histos.add("hEventCount", "Number of Event;; Count", {HistType::kTH1D, {{8, 0, 8}}}); + histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(1, "Filtered event"); + histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(2, "After sel8"); + histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(3, "kNoTimeFrameBorder"); + histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(4, "kNoITSROFrameBorder"); + histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(5, "kNoSameBunchPileup"); + histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(6, "kIsGoodZvtxFT0vsPV"); + histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(7, "kNoCollInTimeRangeStandard"); + histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(8, "After Occupancy"); + + histos.add("hLambdaCount", "Number of Lambda;; Count", {HistType::kTH1D, {{11, 0, 11}}}); + histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(1, "Lambda candidates"); + histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(2, "Daughter pt"); + histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(3, "Mass cut"); + histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(4, "Rapidity cut"); + histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(5, "DCA to PV"); + histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(6, "DCA between daughters"); + histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(7, "V0radius"); + histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(8, "CosPA"); + histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(9, "Proper lifetime"); + histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(10, "Daughter track selection"); + histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(11, "Mass cross check"); + + histos.add("hK0Count", "Number of K0;; Count", {HistType::kTH1D, {{11, 0, 11}}}); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(1, "K0 candidates"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(2, "Daughter pt"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(3, "Mass cut"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(4, "Rapidity cut"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(5, "DCA to PV"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(6, "DCA between daughters"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(7, "V0radius"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(8, "CosPA"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(9, "Proper lifetime"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(10, "Daughter track selection"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(11, "Mass cross check"); o2::framework::AxisSpec axis = axisPt; int nPtBins = axis.binEdges.size() - 1; @@ -239,40 +275,66 @@ struct ResonancesGfwFlow { // phi fGFW->AddRegion("poiNphi", -0.8, -0.4, 1 + nPhisPtMassBins, 2); + fGFW->AddRegion("poiPphi", -0.8, -0.4, 1 + nPhisPtMassBins, 2); fGFW->AddRegion("olNphi", -0.8, -0.4, 1 + nPhisPtMassBins, 32); + fGFW->AddRegion("olPphi", -0.8, -0.4, 1 + nPhisPtMassBins, 32); // kshort fGFW->AddRegion("poiNk0", -0.8, -0.4, 1 + nK0sPtMassBins, 4); + fGFW->AddRegion("poiPk0", -0.8, -0.4, 1 + nK0sPtMassBins, 4); fGFW->AddRegion("olNk0", -0.8, -0.4, 1 + nK0sPtMassBins, 64); + fGFW->AddRegion("olPk0", -0.8, -0.4, 1 + nK0sPtMassBins, 64); // lambda fGFW->AddRegion("poiNlam", -0.8, -0.4, 1 + nLambdasPtMassBins, 8); + fGFW->AddRegion("poiPlam", -0.8, -0.4, 1 + nLambdasPtMassBins, 8); fGFW->AddRegion("olNlam", -0.8, -0.4, 1 + nLambdasPtMassBins, 128); + fGFW->AddRegion("olPlam", -0.8, -0.4, 1 + nLambdasPtMassBins, 128); // antilambda fGFW->AddRegion("poiNantilam", -0.8, -0.4, 1 + nLambdasPtMassBins, 16); + fGFW->AddRegion("poiPantilam", -0.8, -0.4, 1 + nLambdasPtMassBins, 16); fGFW->AddRegion("olNantilam", -0.8, -0.4, 1 + nLambdasPtMassBins, 256); + fGFW->AddRegion("olPantilam", -0.8, -0.4, 1 + nLambdasPtMassBins, 256); //********** Defining the correlations ************ - // reference particles - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Phi08Gap22", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Ks08Gap22", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Lam08Gap22", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "AnLam08Gap22", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2 2} refP08 {-2 -2}", "Phi08Gap24", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2 2} refP08 {-2 -2}", "Ks08Gap24", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2 2} refP08 {-2 -2}", "Lam08Gap24", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2 2} refP08 {-2 -2}", "AnLam08Gap24", kFALSE)); - - // pt differential pois - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2} refP08 {-2}", "Phi08Gap22", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2} refP08 {-2}", "Ks08Gap22", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2} refP08 {-2}", "Lam08Gap22", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2} refP08 {-2}", "AnLam08Gap22", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2 2} refP08 {-2 -2}", "Phi08Gap24", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2 2} refP08 {-2 -2}", "Ks08Gap24", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2 2} refP08 {-2 -2}", "Lam08Gap24", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2 2} refP08 {-2 -2}", "AnLam08Gap24", kTRUE)); + // NAMING CONVENTION: + // F: Forward --> REF from negative eta + POI from negative eta correlated to REF from positive eta + // B: Backward --> REF from negative eta correlated to REF from positive eta + POI from positive eta + + //--------- reference particles + // Forward and Backward correlations are the same for reference particles + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "PhiF08Gap22", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "KsF08Gap22", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "LamF08Gap22", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "AnLamF08Gap22", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2 2} refP08 {-2 -2}", "PhiF08Gap24", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2 2} refP08 {-2 -2}", "KsF08Gap24", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2 2} refP08 {-2 -2}", "LamF08Gap24", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2 2} refP08 {-2 -2}", "AnLamF08Gap24", kFALSE)); + + //--------- pt differential pois + // Forward + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2} refP08 {-2}", "PhiF08Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNk0 refN08 | olNk0 {2} refP08 {-2}", "KsF08Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNlam refN08 | olNlam {2} refP08 {-2}", "LamF08Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNantilam refN08 | olNantilam {2} refP08 {-2}", "AnLamF08Gap22", kTRUE)); + + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2 2} refP08 {-2 -2}", "PhiF08Gap24", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNk0 refN08 | olNk0 {2 2} refP08 {-2 -2}", "KsF08Gap24", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNlam refN08 | olNlam {2 2} refP08 {-2 -2}", "LamF08Gap24", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNantilam refN08 | olNantilam {2 2} refP08 {-2 -2}", "AnLamF08Gap24", kTRUE)); + + // Backward + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPphi refP08 | olPphi {2} refN08 {-2}", "PhiB08Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPk0 refP08 | olPk0 {2} refN08 {-2}", "KsB08Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPlam refP08 | olPlam {2} refN08 {-2}", "LamB08Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPantilam refP08 | olPantilam {2} refN08 {-2}", "AnLamB08Gap22", kTRUE)); + + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPphi refP08 | olPphi {2 2} refN08 {-2 -2}", "PhiB08Gap24", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPk0 refP08 | olPk0 {2 2} refN08 {-2 -2}", "KsB08Gap24", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPlam refP08 | olPlam {2 2} refN08 {-2 -2}", "LamB08Gap24", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPantilam refP08 | olPantilam {2 2} refN08 {-2 -2}", "AnLamB08Gap24", kTRUE)); fGFW->CreateRegions(); } @@ -440,9 +502,11 @@ struct ResonancesGfwFlow { auto postrack = candidate.template posTrack_as(); auto negtrack = candidate.template negTrack_as(); + histos.fill(HIST("hLambdaCount"), 0.5); if (postrack.pt() < 0.15 || negtrack.pt() < 0.15) return false; + histos.fill(HIST("hLambdaCount"), 1.5); if (mlambda > cfgMassLambdaMin && mlambda < cfgMassLambdaMax) isL = true; if (mantilambda > cfgMassLambdaMin && mantilambda < cfgMassLambdaMax) @@ -451,11 +515,12 @@ struct ResonancesGfwFlow { if (!isL && !isAL) { return false; } + histos.fill(HIST("hLambdaCount"), 2.5); // Rapidity correction if (candidate.yLambda() > 0.5) return false; - + histos.fill(HIST("hLambdaCount"), 3.5); // DCA cuts for lambda and antilambda if (isL) { if (std::abs(candidate.dcapostopv()) < cfgDCALambdaPosToPVMin || std::abs(candidate.dcanegtopv()) < cfgDCALambdaNegToPVMin) @@ -465,21 +530,22 @@ struct ResonancesGfwFlow { if (std::abs(candidate.dcapostopv()) < cfgDCALambdaNegToPVMin || std::abs(candidate.dcanegtopv()) < cfgDCALambdaPosToPVMin) return false; } + histos.fill(HIST("hLambdaCount"), 4.5); if (std::abs(candidate.dcaV0daughters()) > cfgDCALambdaBetDaug) return false; - + histos.fill(HIST("hLambdaCount"), 5.5); // v0 radius cuts if (cfgUseV0Radius && (candidate.v0radius() < cfgLambdaRadiusMin || candidate.v0radius() > cfgLambdaRadiusMax)) return false; - + histos.fill(HIST("hLambdaCount"), 6.5); // cosine pointing angle cuts if (candidate.v0cosPA() < cfgLambdaCosPA) return false; - + histos.fill(HIST("hLambdaCount"), 7.5); // Proper lifetime if (cfgUseProperLifetime && candidate.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * massLambda > cfgLambdaLifeTime) return false; - + histos.fill(HIST("hLambdaCount"), 8.5); if (isL) { if (!selectionV0Daughter(postrack, 1) || !selectionV0Daughter(negtrack, 0)) return false; @@ -488,11 +554,11 @@ struct ResonancesGfwFlow { if (!selectionV0Daughter(postrack, 0) || !selectionV0Daughter(negtrack, 1)) return false; } - + histos.fill(HIST("hLambdaCount"), 9.5); // Mass cross check if (cfgUseMCCLambda && std::abs(massK0Short - 0.497614) < 0.01) return false; - + histos.fill(HIST("hLambdaCount"), 10.5); bool withinPtPOI = (cfgCutPtPOIMin < candidate.pt()) && (candidate.pt() < cfgCutPtPOIMax); // within POI pT range bool withinPtRef = (cfgCutPtMin < candidate.pt()) && (candidate.pt() < cfgCutPtMax); @@ -536,44 +602,45 @@ struct ResonancesGfwFlow { auto postrack = candidate.template posTrack_as(); auto negtrack = candidate.template negTrack_as(); + histos.fill(HIST("hK0Count"), 0.5); if (postrack.pt() < 0.15 || negtrack.pt() < 0.15) return false; - + histos.fill(HIST("hK0Count"), 1.5); if (mk0 < cfgMassK0Min && mk0 > cfgMassK0Max) return false; - + histos.fill(HIST("hK0Count"), 2.5); // Rapidity correction if (candidate.yK0Short() > 0.5) return false; - + histos.fill(HIST("hK0Count"), 3.5); // DCA cuts for K0short if (std::abs(candidate.dcapostopv()) < cfgDCAK0PosToPVMin || std::abs(candidate.dcanegtopv()) < cfgDCAK0NegToPVMin) return false; - + histos.fill(HIST("hK0Count"), 4.5); if (std::abs(candidate.dcaV0daughters()) > cfgDCAK0BetDaug) return false; - + histos.fill(HIST("hK0Count"), 5.5); // v0 radius cuts if (cfgUseV0Radius && (candidate.v0radius() < cfgK0RadiusMin || candidate.v0radius() > cfgK0RadiusMax)) return false; - + histos.fill(HIST("hK0Count"), 6.5); // cosine pointing angle cuts if (candidate.v0cosPA() < cfgK0CosPA) return false; - + histos.fill(HIST("hK0Count"), 7.5); // Proper lifetime if (cfgUseProperLifetime && candidate.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * massK0Short > cfgK0LifeTime) return false; - + histos.fill(HIST("hK0Count"), 8.5); if (!selectionV0Daughter(postrack, 0) || !selectionV0Daughter(negtrack, 0)) return false; - + histos.fill(HIST("hK0Count"), 9.5); // Mass cross check if (cfgUseMCCK0 && std::abs(massLambda - 1.11568) < 0.005) return false; if (cfgUseMCCK0 && std::abs(massLambda - 1.11568) < 0.005) return false; - + histos.fill(HIST("hK0Count"), 10.5); bool withinPtPOI = (cfgCutPtPOIMin < candidate.pt()) && (candidate.pt() < cfgCutPtPOIMax); // within POI pT range bool withinPtRef = (cfgCutPtMin < candidate.pt()) && (candidate.pt() < cfgCutPtMax); @@ -601,16 +668,39 @@ struct ResonancesGfwFlow { void process(AodCollisions::iterator const& collision, aod::BCsWithTimestamps const&, AodTracksWithoutBayes const& tracks, aod::V0Datas const& V0s) { + histos.fill(HIST("hEventCount"), 0.5); int nTot = tracks.size(); if (nTot < 1) return; - if (!collision.sel8() || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(aod::evsel::kNoITSROFrameBorder) || !collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV) || !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) + if (!collision.sel8()) + return; + histos.fill(HIST("hEventCount"), 1.5); + + if (!collision.selection_bit(aod::evsel::kNoTimeFrameBorder)) + return; + histos.fill(HIST("hEventCount"), 2.5); + + if (!collision.selection_bit(aod::evsel::kNoITSROFrameBorder)) + return; + histos.fill(HIST("hEventCount"), 3.5); + + if (!collision.selection_bit(aod::evsel::kNoSameBunchPileup)) + return; + histos.fill(HIST("hEventCount"), 4.5); + + if (!collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) + return; + histos.fill(HIST("hEventCount"), 5.5); + + if (!collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) return; + histos.fill(HIST("hEventCount"), 6.5); int occupancy = collision.trackOccupancyInTimeRange(); if (occupancy > cfgCutOccupancy) return; + histos.fill(HIST("hEventCount"), 7.5); const auto cent = collision.centFT0C(); float vtxz = collision.posZ(); @@ -639,17 +729,15 @@ struct ResonancesGfwFlow { for (auto const& v0s : V0s) { if (selectionLambda(collision, v0s) == true) - histos.fill(HIST("hLambdaCount"), 1); + histos.fill(HIST("hLambdas"), 1); if (selectionK0(collision, v0s) == true) - histos.fill(HIST("hK0Count"), 1); - + histos.fill(HIST("hK0s"), 1); } // End of v0 loop fillResoProfile(corrconfigs.at(0), HIST("Phic22"), cent, fPhiMassAxis); fillResoProfile(corrconfigs.at(1), HIST("K0c22"), cent, fK0MassAxis); fillResoProfile(corrconfigs.at(2), HIST("Lambdac22"), cent, fLambdaMassAxis); fillResoProfile(corrconfigs.at(3), HIST("AnLambdac22"), cent, fLambdaMassAxis); - fillResoProfile(corrconfigs.at(4), HIST("Phic24"), cent, fPhiMassAxis); fillResoProfile(corrconfigs.at(5), HIST("K0c24"), cent, fK0MassAxis); fillResoProfile(corrconfigs.at(6), HIST("Lambdac24"), cent, fLambdaMassAxis); @@ -664,6 +752,17 @@ struct ResonancesGfwFlow { fillResoProfile(corrconfigs.at(13), HIST("K0v24pt"), cent, fK0MassAxis); fillResoProfile(corrconfigs.at(14), HIST("Lambdav24pt"), cent, fLambdaMassAxis); fillResoProfile(corrconfigs.at(15), HIST("AnLambdav24pt"), cent, fLambdaMassAxis); + + fillResoProfile(corrconfigs.at(16), HIST("Phiv22pt"), cent, fPhiMassAxis); + fillResoProfile(corrconfigs.at(17), HIST("K0v22pt"), cent, fK0MassAxis); + fillResoProfile(corrconfigs.at(18), HIST("Lambdav22pt"), cent, fLambdaMassAxis); + fillResoProfile(corrconfigs.at(19), HIST("AnLambdav22pt"), cent, fLambdaMassAxis); + + fillResoProfile(corrconfigs.at(20), HIST("Phiv24pt"), cent, fPhiMassAxis); + fillResoProfile(corrconfigs.at(21), HIST("K0v24pt"), cent, fK0MassAxis); + fillResoProfile(corrconfigs.at(22), HIST("Lambdav24pt"), cent, fLambdaMassAxis); + fillResoProfile(corrconfigs.at(23), HIST("AnLambdav24pt"), cent, fLambdaMassAxis); + } // end of process }; From b0f877dd173dff69fdc7165a5614b1e6a93a5a0e Mon Sep 17 00:00:00 2001 From: ilikmeta <152337132+ilikmeta@users.noreply.github.com> Date: Mon, 24 Mar 2025 17:11:47 -0500 Subject: [PATCH 0815/1650] [PWGCF] Fix Nch efficiency (#10631) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/flowGfwTask.cxx | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowGfwTask.cxx b/PWGCF/Flow/Tasks/flowGfwTask.cxx index 51be0daaa0d..4ba8c7c599c 100644 --- a/PWGCF/Flow/Tasks/flowGfwTask.cxx +++ b/PWGCF/Flow/Tasks/flowGfwTask.cxx @@ -283,8 +283,8 @@ struct FlowGfwTask { registry.add("hPhiWeighted", "corrected #phi distribution", {HistType::kTH1D, {axisPhi}}); registry.add("hEta", "", {HistType::kTH1D, {axisEta}}); registry.add("hVtxZ", "Vexter Z distribution", {HistType::kTH1D, {axisVertex}}); - registry.add("hMult", "Multiplicity distribution", {HistType::kTH1D, {{3000, 0.5, 3000.5}}}); - registry.add("hMultCorr", "Corrected Multiplicity distribution", {HistType::kTH1D, {{3000, 0.5, 3000.5}}}); + registry.add("hMult", "Multiplicity distribution", {HistType::kTH1D, {axisNch}}); + registry.add("hMultCorr", "Corrected Multiplicity distribution", {HistType::kTH1D, {axisNch}}); registry.add("hCent", "Centrality distribution", {HistType::kTH1D, {{90, 0, 90}}}); registry.add("cent_vs_Nch", ";Centrality (%); M (|#eta| < 0.8);", {HistType::kTH2D, {axisCentrality, axisNch}}); registry.add("cent_vs_NchCorr", ";Centrality (%); M (|#eta| < 0.8);", {HistType::kTH2D, {axisCentrality, axisNch}}); @@ -820,9 +820,7 @@ struct FlowGfwTask { if (!collision.sel8()) return; - int nch = tracks.size(); - - if (nch < 1) + if (tracks.size() < 1) return; registry.fill(HIST("hEventCount"), kSEL8); @@ -942,20 +940,21 @@ struct FlowGfwTask { float vtxz = collision.posZ(); float lRandom = fRndm->Rndm(); registry.fill(HIST("hVtxZ"), vtxz); - registry.fill(HIST("hMult"), nch); + registry.fill(HIST("hMult"), tracks.size()); registry.fill(HIST("hCent"), centrality); - registry.fill(HIST("cent_vs_Nch"), centrality, nch); - - fGFW->Clear(); + registry.fill(HIST("cent_vs_Nch"), centrality, tracks.size()); float weffNch = 1; - if (!setNch(weffNch, nch)) + if (!setNch(weffNch, tracks.size())) return; - nch = nch * weffNch; + // Corrected nch + float nch = tracks.size() * weffNch; registry.fill(HIST("hMultCorr"), nch); registry.fill(HIST("cent_vs_NchCorr"), centrality, nch); + fGFW->Clear(); + auto bc = collision.bc_as(); loadCorrections(bc.timestamp()); registry.fill(HIST("hEventCount"), kCENTRALITY); From 731e2afc3f243b8e16bcffc56fcbe8ab96f701b2 Mon Sep 17 00:00:00 2001 From: Rahul Verma <110929992+rahulverma012@users.noreply.github.com> Date: Tue, 25 Mar 2025 03:49:15 +0530 Subject: [PATCH 0816/1650] [PWGCF] Kaon isospin fluctuation : Added new Identification cuts and simulation Analysis for MC (#10634) Co-authored-by: Victor Gonzalez --- .../Tasks/kaonIsospinFluctuations.cxx | 664 ++++++++++++------ 1 file changed, 443 insertions(+), 221 deletions(-) diff --git a/PWGCF/EbyEFluctuations/Tasks/kaonIsospinFluctuations.cxx b/PWGCF/EbyEFluctuations/Tasks/kaonIsospinFluctuations.cxx index 114eee65041..4170d078843 100644 --- a/PWGCF/EbyEFluctuations/Tasks/kaonIsospinFluctuations.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/kaonIsospinFluctuations.cxx @@ -78,20 +78,37 @@ struct KaonIsospinFluctuations { Configurable v0settingCosPA{"v0settingCosPA", 0.98, "V0 CosPA"}; Configurable v0settingRadius{"v0settingRadius", 0.5, "v0radius"}; - // Configurable K0s //0.480-0.515 GeV/c2 - Configurable mLowK0s{"mLowK0s", 0.48, "mLowK0s"}; - Configurable mHighK0s{"mHighK0s", 0.515, "mHighK0s"}; + // Configurable K0s + struct : ConfigurableGroup { + Configurable cfgK0sMLow{"cfgK0sMLow", 0.48, "cfgK0sMLow"}; + Configurable cfgK0sMHigh{"cfgK0sMHigh", 0.515, "cfgK0sMHigh"}; + Configurable cfgK0sLowPt{"cfgK0sLowPt", 0.1, "cfgK0sLowPt"}; + Configurable cfgK0sHighPt{"cfgK0sHighPt", 1.5, "cfgK0sHighPt"}; + Configurable cfgK0sRapitidy{"cfgK0sRapitidy", 0.5, "cfgK0sRapitidy"}; + Configurable cfgK0sARMcut{"cfgK0sARMcut", 0.2, "cfgK0sARMcut"}; + } k0sSelCut; // Histogram Configurables - Configurable centBins{"centBins", 1020, "No of bins in centrality axis"}; - Configurable centBinsxLow{"centBinsxLow", -1.0f, "centBinsxLow"}; - Configurable centBinsxUp{"centBinsxUp", 101.0, "centBinsxUp"}; - - Configurable centAxisType{"centAxisType", 0, "centAxisType"}; + struct : ConfigurableGroup { + Configurable centBins{"centBins", 1020, "No of bins in centrality axis"}; + Configurable centBinsxLow{"centBinsxLow", -1.0, "centBinsxLow"}; + Configurable centBinsxUp{"centBinsxUp", 101.0, "centBinsxUp"}; + Configurable centAxisType{"centAxisType", 0, "centAxisType"}; + } cfgCentAxis; + // Track Configurables + struct : ConfigurableGroup { + Configurable cfgTrkTpcNClsCrossedRows{"cfgTrkTpcNClsCrossedRows", 70, "cfgTrkTpcNClsCrossedRows"}; + Configurable cfgTrkdcaXY{"cfgTrkdcaXY", 0.2, "cfgTrkdcaXY"}; + Configurable cfgDoVGselTrackCheck{"cfgDoVGselTrackCheck", false, "cfgDoVGselTrackCheck"}; + Configurable cfgTrackEta{"cfgTrackEta", 0.8, "cfgTrackEta"}; + Configurable cfgTrackPtLow{"cfgTrackPtLow", 0.15, "cfgTrackPtLow"}; + Configurable cfgTrackPtHigh{"cfgTrackPtHigh", 2.0, "cfgTrackPtHigh"}; + } cfgTrackCuts; // Configurables for particle Identification Configurable cfgCheckVetoCut{"cfgCheckVetoCut", false, "cfgCheckVetoCut"}; - Configurable cfgDoElAndDeRejection{"cfgDoElAndDeRejection", false, "cfgDoElAndDeRejection"}; + Configurable cfgDoElRejection{"cfgDoElRejection", true, "cfgDoElRejection"}; + Configurable cfgDoDeRejection{"cfgDoDeRejection", false, "cfgDoDeRejection"}; Configurable cfgDoPdependentId{"cfgDoPdependentId", true, "cfgDoPdependentId"}; Configurable cfgDoTpcInnerParamId{"cfgDoTpcInnerParamId", false, "cfgDoTpcInnerParamId"}; @@ -153,6 +170,15 @@ struct KaonIsospinFluctuations { Configurable cfgFillSparsenewDynmK0sKa{"cfgFillSparsenewDynmK0sKa", true, "cfgFillSparsenewDynmK0sKa"}; Configurable cfgFillSparsenewDynmKpKm{"cfgFillSparsenewDynmKpKm", true, "cfgFillSparsenewDynmKpKm"}; + Configurable cfgVtxZCheck{"cfgVtxZCheck", 0, "cfgVtxZCheck"}; + Configurable cfgCountFinalParticles{"cfgCountFinalParticles", 1, "cfgCountFinalParticles"}; + Configurable cfgCountNonFinalParticles{"cfgCountNonFinalParticles", 0, "cfgCountNonFinalParticles"}; + Configurable cfgCountPhysicalPrimAndFinalParticles{"cfgCountPhysicalPrimAndFinalParticles", 0, "cfgCountPhysicalPrimAndFinalParticles"}; + Configurable doFWDPtDependentCheck{"doFWDPtDependentCheck", 1, "doFWDPtDependentCheck"}; + Configurable cfgFWDPtCut{"cfgFWDPtCut", 0.2, "cfgFWDPtCut"}; + Configurable> cfgFinalParticleIdList{"cfgFinalParticleIdList", {11, -11, 13, -13, 15, -15, 211, -211, 321, -321, 2212, -2212}, "cfgFinalParticleIdList"}; + Configurable> cfgNonFinalParticleIdList{"cfgNonFinalParticleIdList", {11, -11, 13, -13, 15, -15, 211, -211, 321, -321, 2212, -2212}, "cfgNonFinalParticleIdList"}; + void init(InitContext const&) { // Axes @@ -160,15 +186,15 @@ struct KaonIsospinFluctuations { const AxisSpec axisLambdaMass = {200, 1.f, 1.2f, "#it{M}_{inv} [GeV/#it{c}^{2}]"}; const AxisSpec axisVertexZ = {30, -15., 15., "vrtx_{Z} [cm]"}; - AxisSpec axisCent = {centBins, centBinsxLow, centBinsxUp, "centFT0C(percentile)"}; - if (centAxisType == 1) { - axisCent = {centBins, centBinsxLow, centBinsxUp, "centFT0M(percentile)"}; + AxisSpec axisCent = {cfgCentAxis.centBins, cfgCentAxis.centBinsxLow, cfgCentAxis.centBinsxUp, "centFT0C(percentile)"}; + if (cfgCentAxis.centAxisType == 1) { + axisCent = {cfgCentAxis.centBins, cfgCentAxis.centBinsxLow, cfgCentAxis.centBinsxUp, "centFT0M(percentile)"}; } - if (centAxisType == 2) { - axisCent = {centBins, centBinsxLow, centBinsxUp, "multFT0M"}; + if (cfgCentAxis.centAxisType == 2) { + axisCent = {cfgCentAxis.centBins, cfgCentAxis.centBinsxLow, cfgCentAxis.centBinsxUp, "multFT0M"}; } - if (centAxisType == 3) { - axisCent = {centBins, centBinsxLow, centBinsxUp, "multFT0C"}; + if (cfgCentAxis.centAxisType == 3) { + axisCent = {cfgCentAxis.centBins, cfgCentAxis.centBinsxLow, cfgCentAxis.centBinsxUp, "multFT0C"}; } const AxisSpec axisP = {200, 0.0f, 10.0f, "#it{p} (GeV/#it{c})"}; @@ -212,6 +238,9 @@ struct KaonIsospinFluctuations { const AxisSpec axisParticleCount2 = {260, -10, 250, "particleCount"}; const AxisSpec axisParticleCount3 = {1060, -10, 1050, "particleCount"}; + const AxisSpec axisArmenterosAlpha = {100, -1.0, 1.0, "ArmenterosAlpha"}; + const AxisSpec axisArmenterosQt = {150, 0, 0.3, "ArmenterosQt"}; + HistogramConfigSpec histPDcaXY({HistType::kTH2F, {axisP, axisDcaXY}}); HistogramConfigSpec histPtDcaXY({HistType::kTH2F, {axisPt, axisDcaXY}}); HistogramConfigSpec histTpcInnerParamDcaXY({HistType::kTH2F, {axisTPCInnerParam, axisDcaXY}}); @@ -264,6 +293,10 @@ struct KaonIsospinFluctuations { recoV0s.add("v0Table/Full/h14_eta", "eta", kTH1F, {axisEta}); recoV0s.add("v0Table/Full/h15_phi", "phi", kTH1F, {axisPhi}); recoV0s.add("v0Table/Full/h16_rapidity", "rapidity", kTH1F, {axisRapidity}); + recoV0s.add("v0Table/Full/h17_alpha", "alpha", kTH1F, {axisArmenterosAlpha}); + recoV0s.add("v0Table/Full/h18_qtarm", "qtarm", kTH1F, {axisArmenterosQt}); + recoV0s.add("v0Table/Full/h19_alpha_qtarm", "alpha_qtarm", kTH2F, {axisArmenterosAlpha, axisArmenterosQt}); + recoV0s.add("v0Table/Full/h20_pt_eta", "pt_eta", kTH2F, {axisPt, axisEta}); // K0s-Daughter Info recoV0s.add("v0Table/Full/Pi/tpcId/h01_p", "p", kTH1F, {axisP}); @@ -284,7 +317,7 @@ struct KaonIsospinFluctuations { recoV0s.add("v0Table/Full/Pi/tpcId/h15_pt_dcaZ", "pt_dcaZ", kTH2F, {axisP, axisDcaZ}); recoV0s.add("v0Table/Full/Pi/tpcId/h16_dcaXYwide", "dcaXYwide", kTH1F, {axisDcaXYwide}); recoV0s.add("v0Table/Full/Pi/tpcId/h17_dcaZwide", "dcaZwide", kTH1F, {axisDcaZwide}); - + recoV0s.add("v0Table/Full/Pi/tpcId/h20_pt_eta", "pt_eta", kTH2F, {axisPt, axisEta}); // K0s-Daughter identification // momemtum recoV0s.add("v0Table/Full/Pi/tpcId/h20_p_pt", "p_pt", histPPt); @@ -309,12 +342,18 @@ struct KaonIsospinFluctuations { recoV0s.add("v0Table/Full/Pi/tpcId/h36_tofExpMom_tofNSigma", "tofExpMom_tofNSigma", histTofExpMomTofNSigma); recoV0s.add("v0Table/Full/Pi/tpcId/h37_tpcNSigma_tofNSigma", "tpcNSigma_tofNSigma", histTpcNSigmaTofNSigma); - recoV0s.addClone("v0Table/Full/Pi/tpcId/", "v0Table/Full/Pi/tofId/"); // for identification using tof+tpc - recoV0s.addClone("v0Table/Full/Pi/tpcId/", "v0Table/Full/Pi/NoId/"); // for unidentified case // to observe and debug + recoV0s.addClone("v0Table/Full/Pi/tpcId/", "v0Table/Full/Pi/tpctofId/"); // for identification using tof+tpc + recoV0s.addClone("v0Table/Full/Pi/tpcId/", "v0Table/Full/Pi/NoId/"); // for unidentified case // to observe and debug - recoV0s.addClone("v0Table/Full/", "v0Table/postK0sCheck/"); - recoV0s.addClone("v0Table/Full/", "v0Table/postMassCut/"); - recoV0s.addClone("v0Table/Full/", "v0Table/postSelectionCut/"); + if (cfgFillV0TablePostK0sCheck) { + recoV0s.addClone("v0Table/Full/", "v0Table/postK0sCheck/"); + } + if (cfgFillV0TablePostMassCut) { + recoV0s.addClone("v0Table/Full/", "v0Table/postMassCut/"); + } + if (cfgFillV0TablePostSelectionCut) { + recoV0s.addClone("v0Table/Full/", "v0Table/postSelectionCut/"); + } recoV0s.add("v0Table/postSelectionCut/hTrueV0TagCount", "hTrueV0TagCount", {HistType::kTH1F, {{12, -2, 10}}}); // 001 = Kaon, 010 = Lambda, 100 = AnitLambda recoV0s.add("v0Table/postSelectionCut/nCommonPionOfDifferentK0s", "nCommonPionOfDifferentK0s", {HistType::kTH1D, {{44, -2, 20}}}); @@ -363,6 +402,10 @@ struct KaonIsospinFluctuations { recoK0s.add("recoK0s/PreSel/h14_eta", "eta", kTH1F, {axisEta}); recoK0s.add("recoK0s/PreSel/h15_phi", "phi", kTH1F, {axisPhi}); recoK0s.add("recoK0s/PreSel/h16_rapidity", "rapidity", kTH1F, {axisRapidity}); + recoK0s.add("recoK0s/PreSel/h17_alpha", "alpha", kTH1F, {axisArmenterosAlpha}); + recoK0s.add("recoK0s/PreSel/h18_qtarm", "qtarm", kTH1F, {axisArmenterosQt}); + recoK0s.add("recoK0s/PreSel/h19_alpha_qtarm", "alpha_qtarm", kTH2F, {axisArmenterosAlpha, axisArmenterosQt}); + recoK0s.add("recoK0s/PreSel/h20_pt_eta", "pt_eta", kTH2F, {axisPt, axisEta}); // K0s-Daughter Info recoK0s.add("recoK0s/PreSel/Pi/tpcId/h01_p", "p", kTH1F, {axisP}); @@ -383,6 +426,7 @@ struct KaonIsospinFluctuations { recoK0s.add("recoK0s/PreSel/Pi/tpcId/h16_dcaXYwide", "dcaXYwide", kTH1F, {axisDcaXYwide}); recoK0s.add("recoK0s/PreSel/Pi/tpcId/h17_dcaZwide", "dcaZwide", kTH1F, {axisDcaZwide}); + recoK0s.add("recoK0s/PreSel/Pi/tpcId/h20_pt_eta", "pt_eta", kTH2F, {axisPt, axisEta}); // K0s-Daughter identification // momemtum recoK0s.add("recoK0s/PreSel/Pi/tpcId/h20_p_pt", "p_pt", histPPt); @@ -407,8 +451,8 @@ struct KaonIsospinFluctuations { recoK0s.add("recoK0s/PreSel/Pi/tpcId/h36_tofExpMom_tofNSigma", "tofExpMom_tofNSigma", histTofExpMomTofNSigma); recoK0s.add("recoK0s/PreSel/Pi/tpcId/h37_tpcNSigma_tofNSigma", "tpcNSigma_tofNSigma", histTpcNSigmaTofNSigma); - recoK0s.addClone("recoK0s/PreSel/Pi/tpcId/", "recoK0s/PreSel/Pi/tofId/"); // for identification using tof+tpc - recoK0s.addClone("recoK0s/PreSel/Pi/tpcId/", "recoK0s/PreSel/Pi/NoId/"); // for unidentified case // to observe and debug + recoK0s.addClone("recoK0s/PreSel/Pi/tpcId/", "recoK0s/PreSel/Pi/tpctofId/"); // for identification using tof+tpc + recoK0s.addClone("recoK0s/PreSel/Pi/tpcId/", "recoK0s/PreSel/Pi/NoId/"); // for unidentified case // to observe and debug recoK0s.addClone("recoK0s/PreSel/", "recoK0s/PostSel/"); // for unidentified case // to observe and debug @@ -438,6 +482,7 @@ struct KaonIsospinFluctuations { recoTracks.add("recoTracks/PreSel/h16_tpcInnerParam_dcaZ", "tpcInnerParam_dcaZ", histTpcInnerParamDcaZ); recoTracks.add("recoTracks/PreSel/h17_tofExpMom_dcaZ", "tofExpMom_dcaZ", histTofExpMomDcaZ); + recoTracks.add("recoTracks/PreSel/h20_pt_eta", "pt_eta", kTH2F, {axisPt, axisEta}); // momemtum recoTracks.add("recoTracks/PreSel/h20_p_pt", "p_pt", histPPt); recoTracks.add("recoTracks/PreSel/h21_p_tpcInnerParam", "p_tpcInnerParam", histPTpcInnerParam); @@ -477,6 +522,7 @@ struct KaonIsospinFluctuations { // // Analysis + recoAnalysis.add("recoAnalysis/Pi/tpcId/h20_pt_eta", "pt_eta", kTH2F, {axisPt, axisEta}); // momemtum recoAnalysis.add("recoAnalysis/Pi/tpcId/h20_p_pt", "p_pt", histPPt); recoAnalysis.add("recoAnalysis/Pi/tpcId/h21_p_tpcInnerParam", "p_tpcInnerParam", histPTpcInnerParam); @@ -500,7 +546,7 @@ struct KaonIsospinFluctuations { recoAnalysis.add("recoAnalysis/Pi/tpcId/h36_tofExpMom_tofNSigma", "tofExpMom_tofNSigma", histTofExpMomTofNSigma); recoAnalysis.add("recoAnalysis/Pi/tpcId/h37_tpcNSigma_tofNSigma", "tpcNSigma_tofNSigma", histTpcNSigmaTofNSigma); - recoAnalysis.addClone("recoAnalysis/Pi/tpcId/", "recoAnalysis/Pi/tofId/"); + recoAnalysis.addClone("recoAnalysis/Pi/tpcId/", "recoAnalysis/Pi/tpctofId/"); recoAnalysis.addClone("recoAnalysis/Pi/tpcId/", "recoAnalysis/Pi/NoId/"); recoAnalysis.addClone("recoAnalysis/Pi/", "recoAnalysis/Ka/"); // Kaon recoAnalysis.addClone("recoAnalysis/Pi/", "recoAnalysis/Pr/"); // Proton @@ -527,7 +573,7 @@ struct KaonIsospinFluctuations { genAnalysis.add("genAnalysis/K0s/h14_eta", "eta", kTH1F, {axisEta}); genAnalysis.add("genAnalysis/K0s/h15_phi", "phi", kTH1F, {axisPhi}); genAnalysis.add("genAnalysis/K0s/h16_rapidity", "rapidity", kTH1F, {axisRapidity}); - + genAnalysis.add("genAnalysis/K0s/h20_pt_eta", "pt_eta", kTH2F, {axisPt, axisEta}); genAnalysis.addClone("genAnalysis/K0s/", "genAnalysis/Pi/"); genAnalysis.addClone("genAnalysis/K0s/", "genAnalysis/Ka/"); genAnalysis.addClone("genAnalysis/K0s/", "genAnalysis/Pr/"); @@ -550,9 +596,21 @@ struct KaonIsospinFluctuations { genAnalysis.print(); } + enum RejectionTagEnum { + kPassed = 0, + kFailTpcNClsCrossedRows, + kFailTrkdcaXY, + kFailGlobalTrack, + kFailVGSelCheck, + kFailK0ShortDaughter, + kFailPhiDaughter, + }; + enum IdentificationType { kTPCidentified = 0, - kTOFidentified + kTOFidentified, + kTPCTOFidentified, + kUnidentified }; enum TpcTofCutType { @@ -564,7 +622,9 @@ struct KaonIsospinFluctuations { enum ProcessTypeEnum { doDataProcessing = 0, doRecoProcessing, - doPurityProcessing + doPurityProcessing, + doGenProcessing, + doSimProcessing }; enum HistRegEnum { @@ -612,12 +672,14 @@ struct KaonIsospinFluctuations { enum DetEnum { tpcId = 0, tofId, + tpctofId, NoId }; static constexpr std::string_view DetDire[] = { "tpcId/", "tofId/", + "tpctofId/", "NoId/"}; // vetoRejection for particles //From Victor Luis Gonzalez Sebastian's analysis note for balance functions @@ -649,16 +711,18 @@ struct KaonIsospinFluctuations { if (std::fabs(track.tpcNSigmaPr()) < 3.0) return false; } - if (cfgDoElAndDeRejection) { - if (pidMode != kDe) { - if (std::fabs(track.tpcNSigmaDe()) < 3.0) - return false; - } + if (cfgDoElRejection) { if (pidMode != kEl) { if (std::fabs(track.tpcNSigmaEl()) < 3.0) return false; } } + if (cfgDoDeRejection) { + if (pidMode != kDe) { + if (std::fabs(track.tpcNSigmaDe()) < 3.0) + return false; + } + } return true; } @@ -677,16 +741,18 @@ struct KaonIsospinFluctuations { if (std::fabs(track.tofNSigmaPr()) < 3.0) return false; } - if (cfgDoElAndDeRejection) { - if (pidMode != kDe) { - if (std::fabs(track.tofNSigmaDe()) < 3.0) - return false; - } + if (cfgDoElRejection) { if (pidMode != kEl) { if (std::fabs(track.tofNSigmaEl()) < 3.0) return false; } } + if (cfgDoDeRejection) { + if (pidMode != kDe) { + if (std::fabs(track.tofNSigmaDe()) < 3.0) + return false; + } + } return true; } @@ -705,16 +771,18 @@ struct KaonIsospinFluctuations { if (std::fabs(track.tpcNSigmaPr()) < 3.0 && std::fabs(track.tofNSigmaPr()) < 3.0) return false; } - if (cfgDoElAndDeRejection) { - if (pidMode != kDe) { - if (std::fabs(track.tpcNSigmaDe()) < 3.0 && std::fabs(track.tofNSigmaDe()) < 3.0) - return false; - } + if (cfgDoElRejection) { if (pidMode != kEl) { if (std::fabs(track.tpcNSigmaEl()) < 3.0 && std::fabs(track.tofNSigmaEl()) < 3.0) return false; } } + if (cfgDoDeRejection) { + if (pidMode != kDe) { + if (std::fabs(track.tpcNSigmaDe()) < 3.0 && std::fabs(track.tofNSigmaDe()) < 3.0) + return false; + } + } return true; } @@ -848,7 +916,7 @@ struct KaonIsospinFluctuations { if (track.p() < cfgPiThrPforTOF) { if (checkReliableTOF(track)) { if (idTPCTOF(track, cfgPiIdCutTypeLowP, cfgPiNSigmaTPCLowP, cfgPiNSigmaTOFLowP, cfgPiNSigmaRadLowP)) { - IdMethod = kTOFidentified; + IdMethod = kTPCTOFidentified; return true; } return false; @@ -862,7 +930,7 @@ struct KaonIsospinFluctuations { } else { if (checkReliableTOF(track)) { if (idTPCTOF(track, cfgPiIdCutTypeHighP, cfgPiNSigmaTPCHighP, cfgPiNSigmaTOFHighP, cfgPiNSigmaRadHighP)) { - IdMethod = kTOFidentified; + IdMethod = kTPCTOFidentified; return true; } return false; @@ -877,7 +945,7 @@ struct KaonIsospinFluctuations { if (track.p() < cfgKaThrPforTOF) { if (checkReliableTOF(track)) { if (idTPCTOF(track, cfgKaIdCutTypeLowP, cfgKaNSigmaTPCLowP, cfgKaNSigmaTOFLowP, cfgKaNSigmaRadLowP)) { - IdMethod = kTOFidentified; + IdMethod = kTPCTOFidentified; return true; } return false; @@ -891,7 +959,7 @@ struct KaonIsospinFluctuations { } else { if (checkReliableTOF(track)) { if (idTPCTOF(track, cfgKaIdCutTypeHighP, cfgKaNSigmaTPCHighP, cfgKaNSigmaTOFHighP, cfgKaNSigmaRadHighP)) { - IdMethod = kTOFidentified; + IdMethod = kTPCTOFidentified; return true; } return false; @@ -906,7 +974,7 @@ struct KaonIsospinFluctuations { if (track.p() < cfgPrThrPforTOF) { if (checkReliableTOF(track)) { if (idTPCTOF(track, cfgPrIdCutTypeLowP, cfgPrNSigmaTPCLowP, cfgPrNSigmaTOFLowP, cfgPrNSigmaRadLowP)) { - IdMethod = kTOFidentified; + IdMethod = kTPCTOFidentified; return true; } return false; @@ -920,7 +988,7 @@ struct KaonIsospinFluctuations { } else { if (checkReliableTOF(track)) { if (idTPCTOF(track, cfgPrIdCutTypeHighP, cfgPrNSigmaTPCHighP, cfgPrNSigmaTOFHighP, cfgPrNSigmaRadHighP)) { - IdMethod = kTOFidentified; + IdMethod = kTPCTOFidentified; return true; } return false; @@ -1228,7 +1296,10 @@ struct KaonIsospinFluctuations { template bool selK0s(T v0) { - if (mLowK0s < v0.mK0Short() && v0.mK0Short() < mHighK0s && 0.1 < v0.pt() && v0.pt() < 1.5 && std::abs(v0.rapidity(MassK0Short)) < 0.5) { + if (k0sSelCut.cfgK0sMLow < v0.mK0Short() && v0.mK0Short() < k0sSelCut.cfgK0sMHigh && + k0sSelCut.cfgK0sLowPt < v0.pt() && v0.pt() < k0sSelCut.cfgK0sHighPt && + std::abs(v0.rapidity(MassK0Short)) < k0sSelCut.cfgK0sRapitidy && + v0.qtarm() > (k0sSelCut.cfgK0sARMcut * std::abs(v0.alpha()))) { return true; } else { return false; @@ -1253,37 +1324,39 @@ struct KaonIsospinFluctuations { } template - bool checkTrackSelection(const T& track, const std::vector& DauParticleList, uint& skippingPosition, int& rejectionTag) + bool checkTrackSelection(const T& track, int& rejectionTag) { - if (track.tpcNClsCrossedRows() < 70) { - rejectionTag = 1; + if (track.tpcNClsCrossedRows() < cfgTrackCuts.cfgTrkTpcNClsCrossedRows) { + rejectionTag = kFailTpcNClsCrossedRows; return false; } - if (std::fabs(track.dcaXY()) > 0.2) { - rejectionTag = 2; + if (std::fabs(track.dcaXY()) > cfgTrackCuts.cfgTrkdcaXY) { + rejectionTag = kFailTrkdcaXY; return false; } if (!track.isGlobalTrack()) { - rejectionTag = 3; - return false; - } - - bool flagDaughterTrack = false; - if (track.globalIndex() == DauParticleList[skippingPosition]) { - flagDaughterTrack = true; - skippingPosition++; - } - if (flagDaughterTrack) { - rejectionTag = 4; + rejectionTag = kFailGlobalTrack; return false; } - // Event and Pt filter will filter out some tracks and collisions used for v0 reconstruction. - if (track.globalIndex() > DauParticleList[skippingPosition] && skippingPosition < DauParticleList.size()) { - skippingPosition++; + if (cfgTrackCuts.cfgDoVGselTrackCheck) { + if (!selTrackForId(track)) { + rejectionTag = kFailVGSelCheck; + return false; + } } return true; } + template + bool checkTrackInList(const T& track, const std::vector& vecList, int& rejectionTag, const int& listTagValue) + { + if (std::binary_search(vecList.begin(), vecList.end(), track.globalIndex())) { + rejectionTag = listTagValue; + return true; // Binary Search is fastest search in a sorted array. + } + return false; + } + template void fillIdentificationQA(H histReg, const T& track) { @@ -1376,6 +1449,7 @@ struct KaonIsospinFluctuations { recoTracks.fill(HIST(HistRegDire[Mode]) + HIST("h16_tpcInnerParam_dcaZ"), track.tpcInnerParam(), track.dcaZ()); recoTracks.fill(HIST(HistRegDire[Mode]) + HIST("h17_tofExpMom_dcaZ"), track.tofExpMom(), track.dcaZ()); + recoTracks.fill(HIST(HistRegDire[Mode]) + HIST("h20_pt_eta"), track.pt(), track.eta()); // momemtum recoTracks.fill(HIST(HistRegDire[Mode]) + HIST("h20_p_pt"), track.p(), track.pt()); recoTracks.fill(HIST(HistRegDire[Mode]) + HIST("h21_p_tpcInnerParam"), track.p(), track.tpcInnerParam()); @@ -1420,6 +1494,8 @@ struct KaonIsospinFluctuations { histReg.fill(HIST(HistRegDire[Mode]) + HIST(PidDire[pidMode]) + HIST(DetDire[detMode]) + HIST("h16_dcaXYwide"), track.dcaXY()); histReg.fill(HIST(HistRegDire[Mode]) + HIST(PidDire[pidMode]) + HIST(DetDire[detMode]) + HIST("h17_dcaZwide"), track.dcaZ()); + histReg.fill(HIST(HistRegDire[Mode]) + HIST(PidDire[pidMode]) + HIST(DetDire[detMode]) + HIST("h20_pt_eta"), track.pt(), track.eta()); + fillIdentificationQA(histReg, track); } @@ -1446,20 +1522,24 @@ struct KaonIsospinFluctuations { histReg.fill(HIST(HistRegDire[Mode]) + HIST("h14_eta"), v0.eta()); histReg.fill(HIST(HistRegDire[Mode]) + HIST("h15_phi"), v0.phi()); histReg.fill(HIST(HistRegDire[Mode]) + HIST("h16_rapidity"), v0.rapidity(MassK0Short)); + histReg.fill(HIST(HistRegDire[Mode]) + HIST("h17_alpha"), v0.alpha()); + histReg.fill(HIST(HistRegDire[Mode]) + HIST("h18_qtarm"), v0.qtarm()); + histReg.fill(HIST(HistRegDire[Mode]) + HIST("h19_alpha_qtarm"), v0.alpha(), v0.qtarm()); + histReg.fill(HIST(HistRegDire[Mode]) + HIST("h20_pt_eta"), v0.pt(), v0.eta()); - if (posPiIdMethod == 0) { + if (posPiIdMethod == kTPCidentified) { fillV0DaughterQA(histReg, posDaughterTrack, MassProton); - } else if (posPiIdMethod == 1) { - fillV0DaughterQA(histReg, posDaughterTrack, MassProton); - } else if (posPiIdMethod == -1) { + } else if (posPiIdMethod == kTPCTOFidentified) { + fillV0DaughterQA(histReg, posDaughterTrack, MassProton); + } else if (posPiIdMethod == kUnidentified) { fillV0DaughterQA(histReg, posDaughterTrack, MassProton); } - if (negPiIdMethod == 0) { + if (negPiIdMethod == kTPCidentified) { fillV0DaughterQA(histReg, negDaughterTrack, MassProton); - } else if (negPiIdMethod == 1) { - fillV0DaughterQA(histReg, negDaughterTrack, MassProton); - } else if (negPiIdMethod == -1) { + } else if (negPiIdMethod == kTPCTOFidentified) { + fillV0DaughterQA(histReg, negDaughterTrack, MassProton); + } else if (negPiIdMethod == kUnidentified) { fillV0DaughterQA(histReg, negDaughterTrack, MassProton); } } @@ -1472,6 +1552,7 @@ struct KaonIsospinFluctuations { histReg.fill(HIST(HistRegDire[Mode]) + HIST(PidDire[pidMode]) + HIST("h14_eta"), mcTrack.eta()); histReg.fill(HIST(HistRegDire[Mode]) + HIST(PidDire[pidMode]) + HIST("h15_phi"), mcTrack.phi()); histReg.fill(HIST(HistRegDire[Mode]) + HIST(PidDire[pidMode]) + HIST("h16_rapidity"), mcTrack.y()); + histReg.fill(HIST(HistRegDire[Mode]) + HIST(PidDire[pidMode]) + HIST("h20_pt_eta"), mcTrack.pt(), mcTrack.eta()); } template @@ -1480,10 +1561,10 @@ struct KaonIsospinFluctuations { int& v0Tag, int& trueV0TagValue, bool& isK0s, int& v0DauCollisionIndexTag, auto& k0sPosDauList, auto& k0sNegDauList) { - posPiIdMethod = -1; - posPrIdMethod = -1; - negPiIdMethod = -1; - negPrIdMethod = -1; + posPiIdMethod = kUnidentified; + posPrIdMethod = kUnidentified; + negPiIdMethod = kUnidentified; + negPrIdMethod = kUnidentified; v0Tag = findV0Tag(posDaughterTrack, negDaughterTrack, posPiIdMethod, posPrIdMethod, negPiIdMethod, negPrIdMethod); v0DauCollisionIndexTag = findCollisionIndexTag(v0, posDaughterTrack, negDaughterTrack); @@ -1507,7 +1588,7 @@ struct KaonIsospinFluctuations { } // K0s mass cut if (cfgFillV0TablePostMassCut) { - if (mLowK0s < v0.mK0Short() && v0.mK0Short() < mHighK0s) { + if (k0sSelCut.cfgK0sMLow < v0.mK0Short() && v0.mK0Short() < k0sSelCut.cfgK0sMHigh) { fillV0QA(recoV0s, v0, posDaughterTrack, negDaughterTrack, v0Tag, v0DauCollisionIndexTag, posPiIdMethod, negPiIdMethod); } } @@ -1524,14 +1605,15 @@ struct KaonIsospinFluctuations { } // End of K0s block } - void executeSortK0sDaughters(const auto& k0sPosDauList, const auto& k0sNegDauList, auto& fullDauList) + template + void executeSortPairDaughters(const auto& posDauList, const auto& negDauList, auto& fullDauList, const T& hist) { - findRepeatedEntries(k0sPosDauList, recoV0s.get(HIST(HistRegDire[v0TablePostSelectionCut]) + HIST("nCommonPionOfDifferentK0s"))); - findRepeatedEntries(k0sNegDauList, recoV0s.get(HIST(HistRegDire[v0TablePostSelectionCut]) + HIST("nCommonPionOfDifferentK0s"))); + findRepeatedEntries(posDauList, hist); + findRepeatedEntries(negDauList, hist); // Obtain one single new daughter vector to remove double counting - fullDauList.insert(fullDauList.end(), k0sPosDauList.begin(), k0sPosDauList.end()); - fullDauList.insert(fullDauList.end(), k0sNegDauList.begin(), k0sNegDauList.end()); + fullDauList.insert(fullDauList.end(), posDauList.begin(), posDauList.end()); + fullDauList.insert(fullDauList.end(), negDauList.begin(), negDauList.end()); // Sort and Remove repeated entries std::sort(fullDauList.begin(), fullDauList.end()); @@ -1547,7 +1629,7 @@ struct KaonIsospinFluctuations { template //, typename H> void executeV0InCollisionloop(const T& posDaughterTrack, const T& negDaughterTrack, const U& v0, int& posPiIdMethod, int& posPrIdMethod, int& negPiIdMethod, int& negPrIdMethod, - int& v0Tag, bool& isK0s, int& v0DauCollisionIndexTag, int& nK0s, const float& centrality) + int& v0Tag, bool& isK0s, int& v0DauCollisionIndexTag, float& nK0s, const float& centrality) { if (v0.v0cosPA() < v0settingCosPA) return; // for continue; // cut on dynamic columns for v0 particles @@ -1555,10 +1637,10 @@ struct KaonIsospinFluctuations { return; // for continue; isK0s = false; - posPiIdMethod = -1; - posPrIdMethod = -1; - negPiIdMethod = -1; - negPrIdMethod = -1; + posPiIdMethod = kUnidentified; + posPrIdMethod = kUnidentified; + negPiIdMethod = kUnidentified; + negPrIdMethod = kUnidentified; v0Tag = findV0Tag(posDaughterTrack, negDaughterTrack, posPiIdMethod, posPrIdMethod, negPiIdMethod, negPrIdMethod); v0DauCollisionIndexTag = findCollisionIndexTag(v0, posDaughterTrack, negDaughterTrack); @@ -1578,24 +1660,25 @@ struct KaonIsospinFluctuations { } template - void executeTrackQAPart(const T& track, const auto& fullDauList, int& rejectionTag, uint& skippingPosition, int& nRejectedPiMinus, int& nRejectedPiPlus, int& nTrack, bool& isAcceptedTrack) + void executeTrackQAPart(const T& track, const auto& fullDauList, int& rejectionTag, float& nRejectedPiMinus, float& nRejectedPiPlus, int& nTrack, bool& isAcceptedTrack) { if (cfgFillRecoTrackPreSel) { fillTrackQA(track); } rejectionTag = 0; - if (!checkTrackSelection(track, fullDauList, skippingPosition, rejectionTag)) { - if (rejectionTag == 4) { - if (track.sign() > 0) { - nRejectedPiPlus++; - } - if (track.sign() < 0) { - nRejectedPiMinus++; - } - } + if (!checkTrackSelection(track, rejectionTag)) { recoAnalysis.fill(HIST("recoAnalysis/RejectedTrack_RejectionTag"), rejectionTag); isAcceptedTrack = false; return; // for continue; + } else if (checkTrackInList(track, fullDauList, rejectionTag, kFailK0ShortDaughter)) { + recoAnalysis.fill(HIST("recoAnalysis/RejectedTrack_RejectionTag"), rejectionTag); + if (track.signed1Pt() > 0) { + nRejectedPiPlus++; // DOEFFCORR + } else if (track.signed1Pt() < 0) { + nRejectedPiMinus++; // DOEFFCORR + } + isAcceptedTrack = false; + return; // for continue; } isAcceptedTrack = true; if (cfgFillRecoTrackPostSel) { @@ -1606,75 +1689,76 @@ struct KaonIsospinFluctuations { template void executeTrackAnalysisPart(const T& track, const int& trackIdTag, - const int& idMethodPi, const bool& trackIsPion, int& nPiMinus, int& nPiPlus, - const int& idMethodKa, const bool& trackIsKaon, int& nKaMinus, int& nKaPlus, - const int& idMethodPr, const bool& trackIsProton, int& nProton, int& nPBar, - const int& idMethodEl, const bool& trackIsElectron, int& nElPlus, int& nElMinus, - const int& idMethodDe, const bool& trackIsDeuteron, int& nDePlus, int& nDeMinus) + const int& idMethodPi, const bool& trackIsPion, float& nPiMinus, float& nPiPlus, + const int& idMethodKa, const bool& trackIsKaon, float& nKaMinus, float& nKaPlus, + const int& idMethodPr, const bool& trackIsProton, float& nProton, float& nPBar, + const int& idMethodEl, const bool& trackIsElectron, float& nElPlus, float& nElMinus, + const int& idMethodDe, const bool& trackIsDeuteron, float& nDePlus, float& nDeMinus) { if (trackIsPion) { - if (idMethodPi == -1) - fillIdentificationQA(recoAnalysis, track); - if (idMethodPi == 0) + if (idMethodPi == kTPCidentified) { fillIdentificationQA(recoAnalysis, track); - if (idMethodPi == 1) - fillIdentificationQA(recoAnalysis, track); + } else if (idMethodPi == kTPCTOFidentified) { + fillIdentificationQA(recoAnalysis, track); + } else if (idMethodPi == kUnidentified) { + fillIdentificationQA(recoAnalysis, track); + } if (track.sign() > 0) { nPiPlus++; - } - if (track.sign() < 0) { + } else if (track.sign() < 0) { nPiMinus++; } } if (trackIsKaon) { - if (idMethodKa == -1) - fillIdentificationQA(recoAnalysis, track); - if (idMethodKa == 0) + if (idMethodKa == kTPCidentified) { fillIdentificationQA(recoAnalysis, track); - if (idMethodKa == 1) - fillIdentificationQA(recoAnalysis, track); + } else if (idMethodKa == kTPCTOFidentified) { + fillIdentificationQA(recoAnalysis, track); + } else if (idMethodKa == kUnidentified) { + fillIdentificationQA(recoAnalysis, track); + } if (track.sign() > 0) { nKaPlus++; - } - if (track.sign() < 0) { + } else if (track.sign() < 0) { nKaMinus++; } } if (trackIsProton) { - if (idMethodPr == -1) - fillIdentificationQA(recoAnalysis, track); - if (idMethodPr == 0) + if (idMethodPr == kTPCidentified) { fillIdentificationQA(recoAnalysis, track); - if (idMethodPr == 1) - fillIdentificationQA(recoAnalysis, track); + } else if (idMethodPr == kTPCTOFidentified) { + fillIdentificationQA(recoAnalysis, track); + } else if (idMethodPr == kUnidentified) { + fillIdentificationQA(recoAnalysis, track); + } if (track.sign() > 0) { nProton++; - } - if (track.sign() < 0) { + } else if (track.sign() < 0) { nPBar++; } } if (trackIsElectron) { - if (idMethodEl == -1) - fillIdentificationQA(recoAnalysis, track); - if (idMethodEl == 0) + if (idMethodEl == kTPCidentified) { fillIdentificationQA(recoAnalysis, track); - if (idMethodEl == 1) - fillIdentificationQA(recoAnalysis, track); + } else if (idMethodEl == kTPCTOFidentified) { + fillIdentificationQA(recoAnalysis, track); + } else if (idMethodEl == kUnidentified) { + fillIdentificationQA(recoAnalysis, track); + } if (track.sign() > 0) { nElPlus++; - } - if (track.sign() < 0) { + } else if (track.sign() < 0) { nElMinus++; } } if (trackIsDeuteron) { - if (idMethodDe == -1) - fillIdentificationQA(recoAnalysis, track); - if (idMethodDe == 0) + if (idMethodDe == kTPCidentified) { fillIdentificationQA(recoAnalysis, track); - if (idMethodDe == 1) - fillIdentificationQA(recoAnalysis, track); + } else if (idMethodDe == kTPCTOFidentified) { + fillIdentificationQA(recoAnalysis, track); + } else if (idMethodDe == kUnidentified) { + fillIdentificationQA(recoAnalysis, track); + } if (track.sign() > 0) { nDePlus++; } @@ -1685,10 +1769,10 @@ struct KaonIsospinFluctuations { recoAnalysis.fill(HIST("recoAnalysis/SelectedTrack_IdentificationTag"), trackIdTag); } - void executeSparseAnalysisPart(const float& centFT0C, const int& nTrack, const int& nK0s, - const int& nRejectedPiPlus, const int& nRejectedPiMinus, int& nKaon, - const int& nPiPlus, const int& nKaPlus, const int& nProton, const int& nElPlus, const int& nDePlus, - const int& nPiMinus, const int& nKaMinus, const int& nPBar, const int& nElMinus, const int& nDeMinus) + void executeSparseAnalysisPart(const float& centFT0C, const float& nTrack, const float& nK0s, + const float& nRejectedPiPlus, const float& nRejectedPiMinus, float& nKaon, + const float& nPiPlus, const float& nKaPlus, const float& nProton, const float& nElPlus, const float& nDePlus, + const float& nPiMinus, const float& nKaMinus, const float& nPBar, const float& nElMinus, const float& nDeMinus) { nKaon = nKaPlus + nKaMinus; if (cfgFillSparseFullK0sPiKa) { @@ -1777,8 +1861,8 @@ struct KaonIsospinFluctuations { Filter posZFilter = (nabs(o2::aod::collision::posZ) < cutZvertex); // Track Filter - Filter ptFilter = (o2::aod::track::pt) > 0.15f && (o2::aod::track::pt) < 2.0f; - Filter etaFilter = (nabs(o2::aod::track::eta) < 0.8f); + Filter ptFilter = (o2::aod::track::pt) > cfgTrackCuts.cfgTrackPtLow && (o2::aod::track::pt) < cfgTrackCuts.cfgTrackPtHigh; + Filter etaFilter = (nabs(o2::aod::track::eta) < cfgTrackCuts.cfgTrackEta); // Filters on V0s Filter preFilterv0 = (nabs(aod::v0data::dcapostopv) > v0settingDcaPosToPV && @@ -1812,19 +1896,19 @@ struct KaonIsospinFluctuations { // Declaring vectors outside the process to avoid slight overhead for stack allocation and deallocation during each iteration. std::vector k0sPosDauList; std::vector k0sNegDauList; - std::vector fullDauList; + std::vector k0sFullDauList; template void executeAnalysis(const C& collisions, const V& V0s, const T& tracks) { k0sPosDauList.clear(); k0sNegDauList.clear(); - fullDauList.clear(); + k0sFullDauList.clear(); - int posPiIdMethod = -1; - int posPrIdMethod = -1; - int negPiIdMethod = -1; - int negPrIdMethod = -1; + int posPiIdMethod = kUnidentified; + int posPrIdMethod = kUnidentified; + int negPiIdMethod = kUnidentified; + int negPrIdMethod = kUnidentified; bool isK0s = false; @@ -1833,25 +1917,26 @@ struct KaonIsospinFluctuations { int v0DauCollisionIndexTag = 0; // Declaring variables outside the loop to avoid slight overhead for stack allocation and deallocation during each iteration. - uint skippingPosition = 0; - int nK0s = 0; - int nPiPlus = 0; - int nPiMinus = 0; - int nKaPlus = 0; - int nKaMinus = 0; - int nProton = 0; - int nPBar = 0; - int nElPlus = 0; - int nElMinus = 0; - int nDePlus = 0; - int nDeMinus = 0; + float nK0s = 0; + float nPiPlus = 0; + float nPiMinus = 0; + float nKaPlus = 0; + float nKaMinus = 0; + float nProton = 0; + float nPBar = 0; + float nElPlus = 0; + float nElMinus = 0; + float nDePlus = 0; + float nDeMinus = 0; + + float nKaon = 0; int nTrack = 0; - int nKaon = 0; + float centrality = 0; - int nRejectedPiPlus = 0; - int nRejectedPiMinus = 0; + float nRejectedPiPlus = 0; + float nRejectedPiMinus = 0; int rejectionTag = 0; bool trackIsPion = false; @@ -1861,11 +1946,11 @@ struct KaonIsospinFluctuations { bool trackIsDeuteron = false; int trackIdTag = 0; - int idMethodPi = -1; - int idMethodKa = -1; - int idMethodPr = -1; - int idMethodEl = -1; - int idMethodDe = -1; + int idMethodPi = kUnidentified; + int idMethodKa = kUnidentified; + int idMethodPr = kUnidentified; + int idMethodEl = kUnidentified; + int idMethodDe = kUnidentified; if constexpr (analysisType == doDataProcessing) { for (const auto& v0 : V0s) { @@ -1878,7 +1963,7 @@ struct KaonIsospinFluctuations { k0sPosDauList, k0sNegDauList); } // End of V0s Loop - executeSortK0sDaughters(k0sPosDauList, k0sNegDauList, fullDauList); + executeSortPairDaughters(k0sPosDauList, k0sNegDauList, k0sFullDauList, recoV0s.get(HIST(HistRegDire[v0TablePostSelectionCut]) + HIST("nCommonPionOfDifferentK0s"))); for (const auto& collision : collisions) { @@ -1897,11 +1982,11 @@ struct KaonIsospinFluctuations { nKaon = 0; centrality = collision.centFT0C(); - if (centAxisType == 1) { + if (cfgCentAxis.centAxisType == 1) { centrality = collision.centFT0M(); - } else if (centAxisType == 2) { + } else if (cfgCentAxis.centAxisType == 2) { centrality = collision.multFT0M(); - } else if (centAxisType == 3) { + } else if (cfgCentAxis.centAxisType == 3) { centrality = collision.multFT0C(); } @@ -1925,7 +2010,7 @@ struct KaonIsospinFluctuations { nRejectedPiMinus = 0; for (const auto& track : tracksTablePerColl) { bool isAcceptedTrack = true; - executeTrackQAPart(track, fullDauList, rejectionTag, skippingPosition, nRejectedPiMinus, nRejectedPiPlus, nTrack, isAcceptedTrack); + executeTrackQAPart(track, k0sFullDauList, rejectionTag, nRejectedPiMinus, nRejectedPiPlus, nTrack, isAcceptedTrack); if (!isAcceptedTrack) { continue; } @@ -1938,11 +2023,11 @@ struct KaonIsospinFluctuations { trackIsDeuteron = false; trackIdTag = 0; - idMethodPi = -1; - idMethodKa = -1; - idMethodPr = -1; - idMethodEl = -1; - idMethodDe = -1; + idMethodPi = kUnidentified; + idMethodKa = kUnidentified; + idMethodPr = kUnidentified; + idMethodEl = kUnidentified; + idMethodDe = kUnidentified; if (selPion(track, idMethodPi)) { trackIsPion = true; @@ -2009,7 +2094,7 @@ struct KaonIsospinFluctuations { v0Tag, trueV0TagValue, isK0s, v0DauCollisionIndexTag, k0sPosDauList, k0sNegDauList); } // End of V0s Loop - executeSortK0sDaughters(k0sPosDauList, k0sNegDauList, fullDauList); + executeSortPairDaughters(k0sPosDauList, k0sNegDauList, k0sFullDauList, recoV0s.get(HIST(HistRegDire[v0TablePostSelectionCut]) + HIST("nCommonPionOfDifferentK0s"))); for (const auto& collision : collisions) { if (!collision.has_mcCollision()) { @@ -2032,11 +2117,11 @@ struct KaonIsospinFluctuations { nKaon = 0; centrality = collision.centFT0C(); - if (centAxisType == 1) { + if (cfgCentAxis.centAxisType == 1) { centrality = collision.centFT0M(); - } else if (centAxisType == 2) { + } else if (cfgCentAxis.centAxisType == 2) { centrality = collision.multFT0M(); - } else if (centAxisType == 3) { + } else if (cfgCentAxis.centAxisType == 3) { centrality = collision.multFT0C(); } @@ -2085,7 +2170,7 @@ struct KaonIsospinFluctuations { } bool isAcceptedTrack = true; - executeTrackQAPart(track, fullDauList, rejectionTag, skippingPosition, nRejectedPiMinus, nRejectedPiPlus, nTrack, isAcceptedTrack); + executeTrackQAPart(track, k0sFullDauList, rejectionTag, nRejectedPiMinus, nRejectedPiPlus, nTrack, isAcceptedTrack); if (!isAcceptedTrack) { continue; } @@ -2098,11 +2183,11 @@ struct KaonIsospinFluctuations { trackIsDeuteron = false; trackIdTag = 0; - idMethodPi = -1; - idMethodKa = -1; - idMethodPr = -1; - idMethodEl = -1; - idMethodDe = -1; + idMethodPi = kUnidentified; + idMethodKa = kUnidentified; + idMethodPr = kUnidentified; + idMethodEl = kUnidentified; + idMethodDe = kUnidentified; if (selPion(track, idMethodPi)) { trackIsPion = true; @@ -2191,11 +2276,9 @@ struct KaonIsospinFluctuations { //____________________________________Process Funtion For Analysis Starts Here____________________________________// - void processData(MyCollisions const& collisions, - MyV0s const& V0s, - MyTracks const& tracks) + void processData(MyCollisions const& collisions, MyV0s const& V0s, MyTracks const& tracks) { - recoEvent.fill(HIST("recoEvent/ProcessType"), 1); + recoEvent.fill(HIST("recoEvent/ProcessType"), doDataProcessing); executeAnalysis(collisions, V0s, tracks); } // Process Function Ends @@ -2203,7 +2286,7 @@ struct KaonIsospinFluctuations { void processReco(MyCollisionsWithMcLabels const& collisions, MyV0sWithMcLabels const& V0s, MyTracksWithMcLabels const& tracks, aod::McParticles const&) { - recoEvent.fill(HIST("recoEvent/ProcessType"), 2); + recoEvent.fill(HIST("recoEvent/ProcessType"), doRecoProcessing); executeAnalysis(collisions, V0s, tracks); } // Process function is over @@ -2211,7 +2294,7 @@ struct KaonIsospinFluctuations { void processPurity(MyCollisionsWithMcLabels const& collisions, MyV0sWithMcLabels const& V0s, MyTracksWithMcLabels const& tracks, aod::McParticles const&) { - recoEvent.fill(HIST("recoEvent/ProcessType"), 4); + recoEvent.fill(HIST("recoEvent/ProcessType"), doPurityProcessing); executeAnalysis(collisions, V0s, tracks); } // Process function is over @@ -2222,7 +2305,7 @@ struct KaonIsospinFluctuations { using MyMcCollisions = aod::McCollisions; void processGen(MyMcCollisions const&, MyCollisionsWithMcLabels const& collisions, aod::McParticles const& mcParticles) { - recoEvent.fill(HIST("recoEvent/ProcessType"), 3); + recoEvent.fill(HIST("recoEvent/ProcessType"), doGenProcessing); float centrality = -1; for (const auto& collision : collisions) { if (!collision.has_mcCollision()) { @@ -2232,33 +2315,33 @@ struct KaonIsospinFluctuations { const auto& mcColl = collision.mcCollision(); centrality = collision.centFT0C(); - if (centAxisType == 1) { + if (cfgCentAxis.centAxisType == 1) { centrality = collision.centFT0M(); - } else if (centAxisType == 2) { + } else if (cfgCentAxis.centAxisType == 2) { centrality = collision.multFT0M(); - } else if (centAxisType == 3) { + } else if (cfgCentAxis.centAxisType == 3) { centrality = collision.multFT0C(); } // group over mcParticles const auto mcTracksTablePerMcColl = mcParticles.sliceBy(mcTracksPerMcCollisionPreslice, mcColl.globalIndex()); - int nRejectedPiPlus = 0; - int nRejectedPiMinus = 0; - - int nK0s = 0; - int nPiPlus = 0; - int nPiMinus = 0; - int nKaPlus = 0; - int nKaMinus = 0; - int nProton = 0; - int nPBar = 0; - int nElPlus = 0; - int nElMinus = 0; - int nDePlus = 0; - int nDeMinus = 0; - int nTrack = 0; - int nKaon = 0; + float nRejectedPiPlus = 0; + float nRejectedPiMinus = 0; + + float nK0s = 0; + float nPiPlus = 0; + float nPiMinus = 0; + float nKaPlus = 0; + float nKaMinus = 0; + float nProton = 0; + float nPBar = 0; + float nElPlus = 0; + float nElMinus = 0; + float nDePlus = 0; + float nDeMinus = 0; + float nTrack = 0; + float nKaon = 0; for (const auto& mcTrack : mcTracksTablePerMcColl) { if (!mcTrack.isPhysicalPrimary()) { @@ -2266,13 +2349,13 @@ struct KaonIsospinFluctuations { } if (mcTrack.pdgCode() == kK0Short && - 0.1 < mcTrack.pt() && mcTrack.pt() < 1.5 && - std::abs(mcTrack.y()) < 0.5) { + k0sSelCut.cfgK0sLowPt < mcTrack.pt() && mcTrack.pt() < k0sSelCut.cfgK0sHighPt && + std::abs(mcTrack.y()) < k0sSelCut.cfgK0sRapitidy) { nK0s++; fillGenTrackQA(genAnalysis, mcTrack); } - if (mcTrack.pt() <= 0.15 || mcTrack.pt() >= 2.0 || std::abs(mcTrack.eta()) >= 0.8) { + if (mcTrack.pt() <= cfgTrackCuts.cfgTrackPtLow || mcTrack.pt() >= cfgTrackCuts.cfgTrackPtHigh || std::abs(mcTrack.eta()) >= cfgTrackCuts.cfgTrackEta) { continue; } @@ -2323,6 +2406,145 @@ struct KaonIsospinFluctuations { } // collision loop is over } PROCESS_SWITCH(KaonIsospinFluctuations, processGen, "Process for Gen", false); + + template + void getV0MCount(const T& mcTrack, float& multV0M) + { + if ((-3.7 < mcTrack.eta() && mcTrack.eta() < -1.7) || (2.8 < mcTrack.eta() && mcTrack.eta() < 5.1)) { + if (doFWDPtDependentCheck) { + if (mcTrack.pt() > cfgFWDPtCut) { + multV0M++; // V0C: at -3.7 < η < -1.7 (backward direction). + // V0A: at 2.8 < η < 5.1 (forward direction). + } + } else { + multV0M++; + } + } + } + + void processSim(MyMcCollisions const& mcCollisions, aod::McParticles const& mcParticles) + { + auto finalParticleIdList = (std::vector)cfgFinalParticleIdList; + auto nonFinalParticleIdList = (std::vector)cfgNonFinalParticleIdList; + std::sort(finalParticleIdList.begin(), finalParticleIdList.end()); + std::sort(nonFinalParticleIdList.begin(), nonFinalParticleIdList.end()); + + recoEvent.fill(HIST("recoEvent/ProcessType"), doSimProcessing); + float centrality = -1; + for (const auto& mcColl : mcCollisions) { + centrality = -1; + + if (cfgVtxZCheck) { + if (std::abs(mcColl.posZ()) >= cutZvertex) { + continue; + } + } + // group over mcParticles + const auto mcTracksTablePerMcColl = mcParticles.sliceBy(mcTracksPerMcCollisionPreslice, mcColl.globalIndex()); + + float nRejectedPiPlus = 0; + float nRejectedPiMinus = 0; + float nK0s = 0; + float nPiPlus = 0; + float nPiMinus = 0; + float nKaPlus = 0; + float nKaMinus = 0; + float nProton = 0; + float nPBar = 0; + float nElPlus = 0; + float nElMinus = 0; + float nDePlus = 0; + float nDeMinus = 0; + float nTrack = 0; + float nKaon = 0; + + float multV0M = 0; + + for (const auto& mcTrack : mcTracksTablePerMcColl) { + + if (cfgCountFinalParticles) { + if (!mcTrack.has_daughters() && std::binary_search(finalParticleIdList.begin(), finalParticleIdList.end(), mcTrack.pdgCode())) { + getV0MCount(mcTrack, multV0M); + } + } + if (cfgCountNonFinalParticles) { + if (mcTrack.has_daughters() && std::binary_search(nonFinalParticleIdList.begin(), nonFinalParticleIdList.end(), mcTrack.pdgCode())) { + getV0MCount(mcTrack, multV0M); + } + } + + if (cfgCountPhysicalPrimAndFinalParticles) { + if (!mcTrack.has_daughters() && mcTrack.isPhysicalPrimary()) { + if (!(std::abs(mcTrack.pdgCode()) == kNuE || std::abs(mcTrack.pdgCode()) == kNuMu || std::abs(mcTrack.pdgCode()) == kNuTau)) { + // Removed invisible neutrinos; + getV0MCount(mcTrack, multV0M); + } + } + } + + if (!mcTrack.isPhysicalPrimary()) { + continue; + } + + if (mcTrack.pdgCode() == kK0Short && + k0sSelCut.cfgK0sLowPt < mcTrack.pt() && mcTrack.pt() < k0sSelCut.cfgK0sHighPt && + std::abs(mcTrack.y()) < k0sSelCut.cfgK0sRapitidy) { + nK0s++; + fillGenTrackQA(genAnalysis, mcTrack); + } + + if (mcTrack.pt() <= cfgTrackCuts.cfgTrackPtLow || mcTrack.pt() >= cfgTrackCuts.cfgTrackPtHigh || std::abs(mcTrack.eta()) >= cfgTrackCuts.cfgTrackEta) { + continue; + } + + if (mcTrack.pdgCode() == kPiPlus) { + fillGenTrackQA(genAnalysis, mcTrack); + nPiPlus++; + } else if (mcTrack.pdgCode() == kPiMinus) { + fillGenTrackQA(genAnalysis, mcTrack); + nPiMinus++; + } else if (mcTrack.pdgCode() == kKPlus) { + fillGenTrackQA(genAnalysis, mcTrack); + nKaPlus++; + } else if (mcTrack.pdgCode() == kKMinus) { + fillGenTrackQA(genAnalysis, mcTrack); + nKaMinus++; + } else if (mcTrack.pdgCode() == kProton) { + fillGenTrackQA(genAnalysis, mcTrack); + nProton++; + } else if (mcTrack.pdgCode() == kProtonBar) { + fillGenTrackQA(genAnalysis, mcTrack); + nPBar++; + } else if (mcTrack.pdgCode() == kElectron) { + fillGenTrackQA(genAnalysis, mcTrack); + nElPlus++; + } else if (mcTrack.pdgCode() == kPositron) { + fillGenTrackQA(genAnalysis, mcTrack); + nElMinus++; + } else if (mcTrack.pdgCode() == kDeuteron) { + fillGenTrackQA(genAnalysis, mcTrack); + nDePlus++; + } else if (mcTrack.pdgCode() == -kDeuteron) { + fillGenTrackQA(genAnalysis, mcTrack); + nDeMinus++; + } + + nTrack++; + } // mcTrack loop is over + nKaon = nKaPlus + nKaMinus; + centrality = multV0M; + executeSparseAnalysisPart(centrality, nTrack, nK0s, + nRejectedPiPlus, nRejectedPiMinus, nKaon, + nPiPlus, nKaPlus, nProton, nElPlus, nDePlus, + nPiMinus, nKaMinus, nPBar, nElMinus, nDeMinus); + + executeEventInfoPart(mcColl, centrality, 0, mcTracksTablePerMcColl, + nTrack, nK0s, + nPiPlus, nKaPlus, nProton, nElPlus, nDePlus, + nPiMinus, nKaMinus, nPBar, nElMinus, nDeMinus); + } // collision loop is over + } + PROCESS_SWITCH(KaonIsospinFluctuations, processSim, "Process for Sim", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 981ed21a89b34e313d1ef20a5892e7b00d0e8e07 Mon Sep 17 00:00:00 2001 From: jaelpark Date: Tue, 25 Mar 2025 01:36:12 +0100 Subject: [PATCH 0817/1650] [PWGCF] track--2-prong correlations with ML scores (#10635) --- PWGCF/Tasks/correlations.cxx | 42 ++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/PWGCF/Tasks/correlations.cxx b/PWGCF/Tasks/correlations.cxx index b901eaa61be..c2dc06d5a13 100644 --- a/PWGCF/Tasks/correlations.cxx +++ b/PWGCF/Tasks/correlations.cxx @@ -159,7 +159,7 @@ struct CorrelationTask { { registry.add("yields", "multiplicity/centrality vs pT vs eta", {HistType::kTH3F, {{100, 0, 100, "/multiplicity/centrality"}, {40, 0, 20, "p_{T}"}, {100, -2, 2, "#eta"}}}); registry.add("etaphi", "multiplicity/centrality vs eta vs phi", {HistType::kTH3F, {{100, 0, 100, "multiplicity/centrality"}, {100, -2, 2, "#eta"}, {200, 0, o2::constants::math::TwoPI, "#varphi"}}}); - if (doprocessSame2ProngDerived || doprocessSame2Prong2Prong || doprocessSame2Prong2ProngML) { + if (doprocessSame2ProngDerived || doprocessSame2ProngDerivedML || doprocessSame2Prong2Prong || doprocessSame2Prong2ProngML) { registry.add("yieldsTrigger", "multiplicity/centrality vs pT vs eta (triggers)", {HistType::kTH3F, {{100, 0, 100, "/multiplicity/centrality"}, {40, 0, 20, "p_{T}"}, {100, -2, 2, "#eta"}}}); registry.add("etaphiTrigger", "multiplicity/centrality vs eta vs phi (triggers)", {HistType::kTH3F, {{100, 0, 100, "multiplicity/centrality"}, {100, -2, 2, "#eta"}, {200, 0, o2::constants::math::TwoPI, "#varphi"}}}); registry.add("invMass", "2-prong invariant mass (GeV/c^2)", {HistType::kTH3F, {axisInvMassHistogram, axisPtTrigger, axisMultiplicity}}); @@ -412,7 +412,7 @@ struct CorrelationTask { } if constexpr (std::experimental::is_detected::value) { - if (doprocessSame2Prong2ProngML || doprocessMixed2Prong2ProngML) { + if (doprocessSame2ProngDerivedML || doprocessSame2Prong2ProngML || doprocessMixed2ProngDerivedML || doprocessMixed2Prong2ProngML) { auto it = std::lower_bound(cfgPtDepMLbkg->begin(), cfgPtDepMLbkg->end(), track1.pt()); int idx = std::distance(cfgPtDepMLbkg->begin(), it) - 1; if (track1.decay() == 0 && track1.mlProbD0()[0] > cfgPtCentDepMLbkgSel->at(idx)) { @@ -536,7 +536,7 @@ struct CorrelationTask { float deltaPhi = RecoDecay::constrainAngle(track1.phi() - track2.phi(), -o2::constants::math::PIHalf); if constexpr (std::experimental::is_detected::value) { - if (doprocessSame2Prong2ProngML || doprocessMixed2Prong2ProngML) { + if (doprocessSame2ProngDerivedML || doprocessSame2Prong2ProngML || doprocessMixed2ProngDerivedML || doprocessMixed2Prong2ProngML) { auto it = std::lower_bound(cfgPtDepMLbkg->begin(), cfgPtDepMLbkg->end(), track2.pt()); int idx = std::distance(cfgPtDepMLbkg->begin(), it) - 1; if (track2.decay() == 0 && track2.mlProbD0()[0] > cfgPtCentDepMLbkgSel->at(idx)) { @@ -548,7 +548,7 @@ struct CorrelationTask { } // ML selection // last param is the weight - if (cfgMassAxis && (doprocessSame2Prong2Prong || doprocessMixed2Prong2Prong || doprocessSame2Prong2ProngML || doprocessMixed2Prong2ProngML) && !(doprocessSame2ProngDerived || doprocessMixed2ProngDerived)) { + if (cfgMassAxis && (doprocessSame2Prong2Prong || doprocessMixed2Prong2Prong || doprocessSame2Prong2ProngML || doprocessMixed2Prong2ProngML) && !(doprocessSame2ProngDerived || doprocessSame2ProngDerivedML || doprocessMixed2ProngDerived || doprocessMixed2ProngDerivedML)) { if constexpr (std::experimental::is_detected::value && std::experimental::is_detected::value) target->getPairHist()->Fill(step, track1.eta() - track2.eta(), track2.pt(), track1.pt(), multiplicity, deltaPhi, posZ, track2.invMass(), track1.invMass(), associatedWeight); else @@ -659,7 +659,8 @@ struct CorrelationTask { } PROCESS_SWITCH(CorrelationTask, processSameDerived, "Process same event on derived data", false); - void processSame2ProngDerived(DerivedCollisions::iterator const& collision, soa::Filtered const& tracks, soa::Filtered const& p2tracks) + template + void processSame2ProngDerivedT(DerivedCollisions::iterator const& collision, soa::Filtered const& tracks, p2type const& p2tracks) { BinningTypeDerived configurableBinningDerived{{axisVertex, axisMultiplicity}, true}; // true is for 'ignore overflows' (true by default). Underflows and overflows will have bin -1. if (cfgVerbosity > 0) { @@ -681,8 +682,19 @@ struct CorrelationTask { fillCorrelations(same, p2tracks, tracks, multiplicity, collision.posZ(), 0, 1.0f); } } + + void processSame2ProngDerived(DerivedCollisions::iterator const& collision, soa::Filtered const& tracks, soa::Filtered const& p2tracks) + { + processSame2ProngDerivedT(collision, tracks, p2tracks); + } PROCESS_SWITCH(CorrelationTask, processSame2ProngDerived, "Process same event on derived data", false); + void processSame2ProngDerivedML(DerivedCollisions::iterator const& collision, soa::Filtered const& tracks, soa::Filtered> const& p2tracks) + { + processSame2ProngDerivedT(collision, tracks, p2tracks); + } + PROCESS_SWITCH(CorrelationTask, processSame2ProngDerivedML, "Process same event on derived data with ML scores", false); + template void processSame2Prong2ProngT(DerivedCollisions::iterator const& collision, p2type const& p2tracks) { @@ -717,7 +729,7 @@ struct CorrelationTask { { processSame2Prong2ProngT(collision, p2tracks); } - PROCESS_SWITCH(CorrelationTask, processSame2Prong2ProngML, "Process same event on derived data", false); + PROCESS_SWITCH(CorrelationTask, processSame2Prong2ProngML, "Process same event on derived data with ML scores", false); using BinningTypeAOD = ColumnBinningPolicy; void processMixedAOD(AodCollisions const& collisions, AodTracks const& tracks, aod::BCsWithTimestamps const&) @@ -804,12 +816,13 @@ struct CorrelationTask { } PROCESS_SWITCH(CorrelationTask, processMixedDerived, "Process mixed events on derived data", false); - void processMixed2ProngDerived(DerivedCollisions const& collisions, DerivedTracks const& tracks, soa::Filtered const& p2tracks) + template + void processMixed2ProngDerivedT(DerivedCollisions const& collisions, DerivedTracks const& tracks, p2type const& p2tracks) { BinningTypeDerived configurableBinningDerived{{axisVertex, axisMultiplicity}, true}; // true is for 'ignore overflows' (true by default). Underflows and overflows will have bin -1. // Strictly upper categorised collisions, for cfgNoMixedEvents combinations per bin, skipping those in entry -1 auto tracksTuple = std::make_tuple(p2tracks, tracks); - Pair, DerivedTracks, BinningTypeDerived> pairs{configurableBinningDerived, cfgNoMixedEvents, -1, collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip + Pair pairs{configurableBinningDerived, cfgNoMixedEvents, -1, collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip for (auto it = pairs.begin(); it != pairs.end(); it++) { auto& [collision1, tracks1, collision2, tracks2] = *it; @@ -841,8 +854,19 @@ struct CorrelationTask { } } } + + void processMixed2ProngDerived(DerivedCollisions const& collisions, DerivedTracks const& tracks, soa::Filtered const& p2tracks) + { + processMixed2ProngDerivedT(collisions, tracks, p2tracks); + } PROCESS_SWITCH(CorrelationTask, processMixed2ProngDerived, "Process mixed events on derived data", false); + void processMixed2ProngDerivedML(DerivedCollisions const& collisions, DerivedTracks const& tracks, soa::Filtered> const& p2tracks) + { + processMixed2ProngDerivedT(collisions, tracks, p2tracks); + } + PROCESS_SWITCH(CorrelationTask, processMixed2ProngDerivedML, "Process mixed events on derived data with ML scores", false); + template void processMixed2Prong2ProngT(DerivedCollisions const& collisions, p2type const& p2tracks) { @@ -892,7 +916,7 @@ struct CorrelationTask { { processMixed2Prong2ProngT(collisions, p2tracks); } - PROCESS_SWITCH(CorrelationTask, processMixed2Prong2ProngML, "Process mixed events on derived data", false); + PROCESS_SWITCH(CorrelationTask, processMixed2Prong2ProngML, "Process mixed events on derived data with ML scores", false); // Version with combinations /*void processWithCombinations(soa::Join::iterator const& collision, aod::BCsWithTimestamps const&, soa::Filtered const& tracks) From ac0a322bd5c36949d0edc4b5dc7ba336bee951d6 Mon Sep 17 00:00:00 2001 From: tutripat <73981392+tutripat@users.noreply.github.com> Date: Tue, 25 Mar 2025 11:50:08 +0100 Subject: [PATCH 0818/1650] [PWGLF] Test for INEL>0 events (#10637) --- .../GlobalEventProperties/dndeta-mft-pp.cxx | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/dndeta-mft-pp.cxx b/PWGLF/Tasks/GlobalEventProperties/dndeta-mft-pp.cxx index 6c0ece4adba..b168c1d2abc 100644 --- a/PWGLF/Tasks/GlobalEventProperties/dndeta-mft-pp.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/dndeta-mft-pp.cxx @@ -123,7 +123,7 @@ struct PseudorapidityDensityMFT { {HistType::kTH2F, {PtAxis, EtaAxis}}}, // {"EventSelection", ";status;events", - {HistType::kTH1F, {{10, 0.5, 10.5}}}}, + {HistType::kTH1F, {{15, 0.5, 15.5}}}}, {"EventCounts", ";status;events", {HistType::kTH1F, {{2, 0.5, 2.5}}}}, @@ -146,13 +146,16 @@ struct PseudorapidityDensityMFT { auto* x = hstat->GetXaxis(); x->SetBinLabel(1, "All"); x->SetBinLabel(2, "Selected"); - x->SetBinLabel(3, "Selected INEL>0"); - x->SetBinLabel(4, "Vz cut Sel INEL>0"); + x->SetBinLabel(3, "Selected Vz Cut"); + x->SetBinLabel(4, "Sel8+Vz+INEL>0"); x->SetBinLabel(5, "Sel INEL,INEL_fwd>0"); x->SetBinLabel(6, "Rejected"); x->SetBinLabel(7, "Good BCs"); x->SetBinLabel(8, "BCs with collisions"); x->SetBinLabel(9, "BCs with pile-up/splitting"); + x->SetBinLabel(10, "midtracks>0"); + x->SetBinLabel(11, "percollisionSample>0"); + x->SetBinLabel(12, "midtracks+percollisionSample>0"); registry.add({"EventsNtrkZvtx", "; N_{trk}; #it{z}_{vtx} (cm); events", {HistType::kTH2F, {MultAxis, ZAxis}}}); @@ -452,7 +455,7 @@ struct PseudorapidityDensityMFT { Partition sample = (aod::fwdtrack::eta < -2.8f) && (aod::fwdtrack::eta > -3.2f); - Partition sampleCentral = (nabs(aod::track::eta) < 1.1f); + Partition sampleCentral = (nabs(aod::track::eta) < 1.f); expressions::Filter atrackFilter = (aod::fwdtrack::bestCollisionId >= 0) && (aod::fwdtrack::eta < -2.0f) && @@ -553,9 +556,16 @@ struct PseudorapidityDensityMFT { registry.fill(HIST("EventsNtrkZvtx"), Ntrk, z); if (midtracks.size() > 0) { registry.fill(HIST("EventSelection"), 4.); + registry.fill(HIST("EventSelection"), 10.); registry.fill(HIST("EventsNtrkZvtx_gt0"), Ntrk, z); eventsInel.insert(collision.globalIndex()); } + if (perCollisionSample.size() > 0) { + registry.fill(HIST("EventSelection"), 11.); + } + if (midtracks.size() > 0 && perCollisionSample.size() > 0) { + registry.fill(HIST("EventSelection"), 12.); + } int64_t i = 0.0, j = 0.0, k = 0.0; if (retracks.size() > 0) { registry.fill(HIST("EventSelection"), 5.); From 0fb2c1c22b911f016e05481554eabf1e3d9e081c Mon Sep 17 00:00:00 2001 From: Junlee Kim Date: Tue, 25 Mar 2025 15:30:18 +0000 Subject: [PATCH 0819/1650] [PWGLF] separating lambda and anti-lambda (#10624) --- PWGLF/Tasks/Resonances/heptaquark.cxx | 34 +++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/PWGLF/Tasks/Resonances/heptaquark.cxx b/PWGLF/Tasks/Resonances/heptaquark.cxx index a2be19c65ce..407c3199073 100644 --- a/PWGLF/Tasks/Resonances/heptaquark.cxx +++ b/PWGLF/Tasks/Resonances/heptaquark.cxx @@ -80,8 +80,8 @@ struct heptaquark { histos.add("h_InvMass_rotLambda", "h_InvMass_rotLambda", {HistType::kTH3F, {massAxis, ptAxis, centAxis}}); histos.add("h_InvMass_rotPhiLambda", "h_InvMass_rotPhiLambda", {HistType::kTH3F, {massAxis, ptAxis, centAxis}}); - histos.add("hDalitz", "hDalitz", {HistType::kTHnSparseF, {massPPAxis, massPLAxis, massAxis, ptAxis, centAxis}}); - histos.add("hDalitzRot", "hDalitzRot", {HistType::kTHnSparseF, {massPPAxis, massPLAxis, massAxis, ptAxis, centAxis}}); + histos.add("hDalitz", "hDalitz", {HistType::kTHnSparseF, {massPPAxis, massPLAxis, massAxis, ptAxis, {2, -0.5f, 1.5f}, centAxis}}); + histos.add("hDalitzRot", "hDalitzRot", {HistType::kTHnSparseF, {massPPAxis, massPLAxis, massAxis, ptAxis, {2, -0.5f, 1.5f}, centAxis}}); } double massLambda = o2::constants::physics::MassLambda; @@ -172,6 +172,30 @@ struct heptaquark { return false; } + template + ROOT::Math::XYZVector getDCAofV0V0(V01 const& v01, V02 const& v02) + { + ROOT::Math::XYZVector v01pos, v02pos, v01mom, v02mom; + v01pos.SetXYZ(v01.x(), v01.y(), v01.z()); + v02pos.SetXYZ(v02.x(), v02.y(), v02.z()); + v01mom.SetXYZ(v01.px(), v01.py(), v01.pz()); + v02mom.SetXYZ(v02.px(), v02.py(), v02.pz()); + + ROOT::Math::XYZVector posdiff = v02pos - v01pos; + ROOT::Math::XYZVector cross = v01mom.Cross(v02mom); + ROOT::Math::XYZVector dcaVec = (posdiff.Dot(cross) / cross.Mag2()) * cross; + return dcaVec; + } + + template + float getCPA(V01 const& v01, V02 const& v02) + { + ROOT::Math::XYZVector v01mom, v02mom; + v01mom.SetXYZ(v01.px() / v01.p(), v01.py() / v01.p(), v01.pz() / v01.p()); + v02mom.SetXYZ(v02.px() / v02.p(), v02.py() / v02.p(), v02.pz() / v02.p()); + return v01mom.Dot(v02mom); + } + ROOT::Math::PxPyPzMVector DauVec1, DauVec2; TLorentzVector exotic, HQ1, HQ2, HQ3; @@ -257,6 +281,8 @@ struct heptaquark { if (hqtrackd3.hqMass() < minLambdaMass || hqtrackd3.hqMass() > maxLambdaMass) continue; + int isLambda = static_cast(hqtrackd3.hqId() < 0); + if (hqtrackd3.hqId() > 0) { DauVec1 = ROOT::Math::PxPyPzMVector(hqtrackd3.hqd1Px(), hqtrackd3.hqd1Py(), hqtrackd3.hqd1Pz(), massPr); DauVec2 = ROOT::Math::PxPyPzMVector(hqtrackd3.hqd2Px(), hqtrackd3.hqd2Py(), hqtrackd3.hqd2Pz(), massPi); @@ -296,7 +322,7 @@ struct heptaquark { HQ13 = HQ1 + HQ3; histos.fill(HIST("h_InvMass_same"), exotic.M(), exotic.Pt(), collision.centrality()); - histos.fill(HIST("hDalitz"), HQ12.M2(), HQ13.M2(), exotic.M(), exotic.Pt(), collision.centrality()); + histos.fill(HIST("hDalitz"), HQ12.M2(), HQ13.M2(), exotic.M(), exotic.Pt(), isLambda, collision.centrality()); if (cfgRotBkg) { for (int nr = 0; nr < cfgNRotBkg; nr++) { @@ -319,7 +345,7 @@ struct heptaquark { histos.fill(HIST("h_InvMass_rotPhi"), exoticRot2.M(), exoticRot2.Pt(), collision.centrality()); histos.fill(HIST("h_InvMass_rotLambda"), exoticRot3.M(), exoticRot3.Pt(), collision.centrality()); histos.fill(HIST("h_InvMass_rotPhiLambda"), exoticRot23.M(), exoticRot23.Pt(), collision.centrality()); - histos.fill(HIST("hDalitzRot"), HQ12Rot.M2(), HQ13Rot.M2(), exoticRot23.M(), exoticRot23.Pt(), collision.centrality()); + histos.fill(HIST("hDalitzRot"), HQ12Rot.M2(), HQ13Rot.M2(), exoticRot23.M(), exoticRot23.Pt(), isLambda, collision.centrality()); } } } From da883557d85107dce162c0de7f5fae619b9a2f4a Mon Sep 17 00:00:00 2001 From: Antonio Palasciano <52152842+apalasciano@users.noreply.github.com> Date: Tue, 25 Mar 2025 16:47:43 +0100 Subject: [PATCH 0820/1650] [PWGHF,Trigger] Fix selection and revert changes (#10633) --- EventFiltering/PWGHF/HFFilter.cxx | 8 ++--- EventFiltering/PWGHF/HFFilterHelpers.h | 45 +++++++++++++++----------- 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/EventFiltering/PWGHF/HFFilter.cxx b/EventFiltering/PWGHF/HFFilter.cxx index b1666812d52..40b2ea4ebf2 100644 --- a/EventFiltering/PWGHF/HFFilter.cxx +++ b/EventFiltering/PWGHF/HFFilter.cxx @@ -953,8 +953,8 @@ struct HfFilter { // Main struct for HF triggers o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParBachelorProton, 2.f, noMatCorr, &dcaInfoBachProton); } std::array pVecProton = trackProton.pVector(); - auto isSelProton = helper.isSelectedBachelorForCharmBaryon(trackProton, dcaInfoBachProton); - if (TESTBIT(isSelProton, kProtonForCharmBaryon)) { + bool isSelProton = helper.isSelectedProtonFromLcReso(trackProton); + if (isSelProton) { if (!keepEvent[kPrCharm2P]) { // we first look for a D*+ for (const auto& trackBachelorId : trackIdsThisCollision) { // start loop over tracks to find bachelor pion @@ -1726,7 +1726,7 @@ struct HfFilter { // Main struct for HF triggers o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParBachelor, 2.f, noMatCorr, &dcaInfoBach); } - auto isSelBachelor = helper.isSelectedBachelorForCharmBaryon(track, dcaInfoBach); + auto isSelBachelor = helper.isSelectedBachelorForCharmBaryon(track, dcaInfoBach); if (isSelBachelor == kRejected) { continue; } @@ -1770,7 +1770,7 @@ struct HfFilter { // Main struct for HF triggers o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParBachelorSecond, 2.f, noMatCorr, &dcaInfoBachSecond); } - auto isSelBachelorSecond = helper.isSelectedBachelorForCharmBaryon(trackSecond, dcaInfoBachSecond); + auto isSelBachelorSecond = helper.isSelectedBachelorForCharmBaryon(trackSecond, dcaInfoBachSecond); if (!TESTBIT(isSelBachelorSecond, kPionForCharmBaryon)) { continue; } diff --git a/EventFiltering/PWGHF/HFFilterHelpers.h b/EventFiltering/PWGHF/HFFilterHelpers.h index affa81f2815..f72ec03431e 100644 --- a/EventFiltering/PWGHF/HFFilterHelpers.h +++ b/EventFiltering/PWGHF/HFFilterHelpers.h @@ -600,7 +600,7 @@ class HfFilterHelper bool isSelectedPhoton(const Photon& photon, const std::array& dauTracks, const int& activateQA, H2 hV0Selected, std::array& hArmPod); template bool isSelectedCascade(const Casc& casc); - template + template int16_t isSelectedBachelorForCharmBaryon(const T& track, const T2& dca); template bool isSelectedProton4CharmOrBeautyBaryons(const T& track); @@ -622,7 +622,8 @@ class HfFilterHelper bool isSelectedXiBach(T const& trackParCasc, T const& trackParBachelor, int8_t isSelBachelor, C const& collision, o2::vertexing::DCAFitterN<2>& dcaFitter, const int& activateQA, H2 hMassVsPtXiPi, H2 hMassVsPtXiKa); template bool isSelectedXiBachBach(T const& trackParCasc, std::array const& trackParBachelor, C const& collision, o2::vertexing::DCAFitterN& dcaFitter, const int& activateQA, H2 hMassVsPtXiPiPi); - + template + bool isSelectedProtonFromLcReso(const T& track); // helpers template T computeRelativeMomentum(const std::array& pTrack, const std::array& CharmCandMomentum, const T& CharmMass); @@ -1633,24 +1634,18 @@ inline bool HfFilterHelper::isSelectedCascade(const Casc& casc) /// \param track is a track /// \param dca is the 2d array with dcaXY and dcaZ of the track /// \return 0 if rejected, or a bitmap that contains the information whether it is selected as pion and/or kaon -template +template inline int16_t HfFilterHelper::isSelectedBachelorForCharmBaryon(const T& track, const T2& dca) { - int16_t retValue{BIT(kPionForCharmBaryon) | BIT(kKaonForCharmBaryon) | BIT(kProtonForCharmBaryon)}; + int16_t retValue{BIT(kPionForCharmBaryon) | BIT(kKaonForCharmBaryon)}; if (!track.isGlobalTrackWoDCA()) { return kRejected; } float pt = track.pt(); - if constexpr (whichTrigger == kCharmBarToXiBach) { - if (pt < mPtMinCharmBaryonBachelor || pt > mPtMaxCharmBaryonBachelor) { - return kRejected; - } - } else if constexpr (whichTrigger == kPrCharm2P) { - if (pt < mPtMinLcResonanceBachelor || pt > mPtMaxLcResonanceBachelor) { - return kRejected; - } + if (pt < mPtMinCharmBaryonBachelor || pt > mPtMaxCharmBaryonBachelor) { + return kRejected; } auto pTBinTrack = findBin(mPtBinsTracks, pt); @@ -1679,18 +1674,14 @@ inline int16_t HfFilterHelper::isSelectedBachelorForCharmBaryon(const T& track, float nSigmaPiTpc = track.tpcNSigmaPi(); float nSigmaKaTpc = track.tpcNSigmaKa(); - float nSigmaPrTpc = track.tpcNSigmaPr(); float nSigmaPiTof = track.tofNSigmaPi(); float nSigmaKaTof = track.tofNSigmaKa(); - float nSigmaPrTof = track.tofNSigmaPr(); if (mTpcPidCalibrationOption == 1) { nSigmaPiTpc = getTPCPostCalib(track, kPi); nSigmaKaTpc = getTPCPostCalib(track, kKa); - nSigmaPrTpc = getTPCPostCalib(track, kPr); } else if (mTpcPidCalibrationOption == 2) { nSigmaPiTpc = getTPCSplineCalib(track, (track.sign() > 0) ? kPi : kAntiPi); nSigmaKaTpc = getTPCSplineCalib(track, (track.sign() > 0) ? kKa : kAntiKa); - nSigmaPrTpc = getTPCSplineCalib(track, (track.sign() > 0) ? kPr : kAntiPr); } if ((track.hasTPC() && std::fabs(nSigmaPiTpc) > mNSigmaTpcPiCharmBaryonBachelor) && (track.hasTOF() && std::fabs(nSigmaPiTof) > mNSigmaTofPiCharmBaryonBachelor)) { @@ -1699,9 +1690,6 @@ inline int16_t HfFilterHelper::isSelectedBachelorForCharmBaryon(const T& track, if ((track.hasTPC() && std::fabs(nSigmaKaTpc) > mNSigmaTpcPiCharmBaryonBachelor) && (track.hasTOF() && std::fabs(nSigmaKaTof) > mNSigmaTofPiCharmBaryonBachelor)) { CLRBIT(retValue, kKaonForCharmBaryon); } - if ((track.hasTPC() && std::fabs(nSigmaPrTpc) > mNSigmaTpcPiCharmBaryonBachelor) && (track.hasTOF() && std::fabs(nSigmaPrTof) > mNSigmaTpcPiCharmBaryonBachelor)) { - CLRBIT(retValue, kProtonForCharmBaryon); - } return retValue; } @@ -1947,6 +1935,25 @@ inline bool HfFilterHelper::isSelectedKaon4Charm3ProngOrBeautyToJPsi(const T& tr return true; } +/// Basic selection of proton candidates forLc and ThetaC decays +/// \param track is a track +/// \return true if track passes all cuts +template +inline bool HfFilterHelper::isSelectedProtonFromLcReso(const T& track) +{ + + // pt selections + float pt = track.pt(); + if (pt < mPtMinLcResonanceBachelor || pt > mPtMaxLcResonanceBachelor) { + return false; + } + + /// PID selection + return isSelectedProton4CharmOrBeautyBaryons(track); + + return true; +} + /// Method to perform selections for B+ candidates after vertex reconstruction /// \param pVecTrack0 is the array for the candidate D daughter momentum after reconstruction of secondary vertex /// \param pVecTrack1 is the array for the candidate bachelor pion momentum after reconstruction of secondary vertex From 1065bada416f60519434d72c7505070582dcaa93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Tue, 25 Mar 2025 17:10:42 +0100 Subject: [PATCH 0821/1650] [PWGHF] Keep only one tag for the ambiguous case of D0 in the Tcc tree creator (#10643) --- PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx b/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx index e50597e7c9f..3d4f12dba49 100644 --- a/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx +++ b/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx @@ -291,8 +291,8 @@ struct HfTreeCreatorTccToD0D0Pi { candFlagD1 = (candidateD1.isSelD0bar()) ? 3 : 1; std::copy(candidateD1.mlProbD0().begin(), candidateD1.mlProbD0().end(), std::back_inserter(mlScoresD1)); massD01 = hfHelper.invMassD0ToPiK(candidateD1); - } else if (candidateD1.isSelD0bar()) { - candFlagD1 = (candidateD1.isSelD0()) ? 4 : 2; + } + if (candidateD1.isSelD0bar()) { std::copy(candidateD1.mlProbD0bar().begin(), candidateD1.mlProbD0bar().end(), std::back_inserter(mlScoresD1)); massD01 = hfHelper.invMassD0barToKPi(candidateD1); } @@ -301,9 +301,8 @@ struct HfTreeCreatorTccToD0D0Pi { candFlagD2 = (candidateD2.isSelD0bar()) ? 3 : 1; std::copy(candidateD2.mlProbD0().begin(), candidateD2.mlProbD0().end(), std::back_inserter(mlScoresD2)); massD02 = hfHelper.invMassD0ToPiK(candidateD2); - - } else if (candidateD2.isSelD0bar()) { - candFlagD2 = (candidateD2.isSelD0()) ? 4 : 2; + } + if (candidateD2.isSelD0bar()) { std::copy(candidateD2.mlProbD0bar().begin(), candidateD2.mlProbD0bar().end(), std::back_inserter(mlScoresD2)); massD02 = hfHelper.invMassD0barToKPi(candidateD2); } From 88f65897b578b632a0bc98a9f0f02fa2dd8f48f9 Mon Sep 17 00:00:00 2001 From: glromane <95305986+glromane@users.noreply.github.com> Date: Tue, 25 Mar 2025 17:32:18 +0100 Subject: [PATCH 0822/1650] [PWGCF] adding SFINAE checks for PID + optimisation of the tasks (#10640) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Nicolò Jacazio --- PWGCF/Femto3D/DataModel/PIDutils.h | 255 ++++++++++++++++++ PWGCF/Femto3D/DataModel/singletrackselector.h | 125 +-------- PWGCF/Femto3D/Tasks/femto3dPairTask.cxx | 80 +++--- PWGCF/Femto3D/Tasks/femto3dQA.cxx | 86 ++---- 4 files changed, 306 insertions(+), 240 deletions(-) create mode 100644 PWGCF/Femto3D/DataModel/PIDutils.h diff --git a/PWGCF/Femto3D/DataModel/PIDutils.h b/PWGCF/Femto3D/DataModel/PIDutils.h new file mode 100644 index 00000000000..9e28f7b5863 --- /dev/null +++ b/PWGCF/Femto3D/DataModel/PIDutils.h @@ -0,0 +1,255 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// +/// \file PIDutils.h +/// \author Gleb Romanenko gleb.romanenko@cern.ch +/// \brief SFINAE checks for existance of PID info +/// \since 24/03/2025 +/// + +#ifndef PWGCF_FEMTO3D_DATAMODEL_PIDUTILS_H_ +#define PWGCF_FEMTO3D_DATAMODEL_PIDUTILS_H_ + +#include +#include +#include +#include "Common/DataModel/PIDResponse.h" + +namespace o2::aod::singletrackselector +{ +namespace pidutils +{ + +//========================================== SFINAE checks ========================================== + +template +struct hasTPCPi : std::false_type { +}; +template +struct hasTPCPi>> : std::true_type { +}; + +template +struct hasTPCKa : std::false_type { +}; +template +struct hasTPCKa>> : std::true_type { +}; + +template +struct hasTPCPr : std::false_type { +}; +template +struct hasTPCPr>> : std::true_type { +}; + +template +struct hasTPCDe : std::false_type { +}; +template +struct hasTPCDe>> : std::true_type { +}; + +template +struct hasTPCTr : std::false_type { +}; +template +struct hasTPCTr>> : std::true_type { +}; + +template +struct hasTPCHe : std::false_type { +}; +template +struct hasTPCHe>> : std::true_type { +}; + +template +struct hasTOFPi : std::false_type { +}; +template +struct hasTOFPi>> : std::true_type { +}; + +template +struct hasTOFKa : std::false_type { +}; +template +struct hasTOFKa>> : std::true_type { +}; + +template +struct hasTOFPr : std::false_type { +}; +template +struct hasTOFPr>> : std::true_type { +}; + +template +struct hasTOFDe : std::false_type { +}; +template +struct hasTOFDe>> : std::true_type { +}; + +template +struct hasTOFTr : std::false_type { +}; +template +struct hasTOFTr>> : std::true_type { +}; + +template +struct hasTOFHe : std::false_type { +}; +template +struct hasTOFHe>> : std::true_type { +}; + +} // namespace pidutils + +//========================================== ITS PID ========================================== + +template +inline float getITSNsigma(TrackType const& track, int const& PDG) +{ + switch (PDG) { + case 211: + return track.itsNSigmaPi(); + case 321: + return track.itsNSigmaKa(); + case 2212: + return track.itsNSigmaPr(); + case 1000010020: + return track.itsNSigmaDe(); + case 1000020030: + return track.itsNSigmaHe(); + case 1000010030: + return track.itsNSigmaTr(); + case 0: + return -1000.0; + default: + LOG(fatal) << "Cannot interpret PDG for ITS selection: " << PDG; + return -1000.0; + } +} + +template +inline bool ITSselection(TrackType const& track, std::pair> const& PIDcuts) +{ + float Nsigma = getITSNsigma(track, PIDcuts.first); + + if (Nsigma > PIDcuts.second[0] && Nsigma < PIDcuts.second[1]) { + return true; + } + return false; +} + +//========================================== TPC PID ========================================== + +template +inline float getTPCNsigma(TrackType const& track, int const& PDG) +{ + switch (PDG) { + case 211: + if constexpr (o2::aod::singletrackselector::pidutils::hasTPCPi::value) + return track.tpcNSigmaPi(); + case 321: + if constexpr (o2::aod::singletrackselector::pidutils::hasTPCKa::value) + return track.tpcNSigmaKa(); + case 2212: + if constexpr (o2::aod::singletrackselector::pidutils::hasTPCPr::value) + return track.tpcNSigmaPr(); + case 1000010020: + if constexpr (o2::aod::singletrackselector::pidutils::hasTPCDe::value) + return track.tpcNSigmaDe(); + case 1000020030: + if constexpr (o2::aod::singletrackselector::pidutils::hasTPCHe::value) + return track.tpcNSigmaHe(); + case 1000010030: + if constexpr (o2::aod::singletrackselector::pidutils::hasTPCTr::value) + return track.tpcNSigmaTr(); + case 0: + return -1000.0; + default: + LOG(fatal) << "Cannot interpret PDG for TPC selection: " << PDG; + return -1000.0; + } +} + +template +inline bool TPCselection(TrackType const& track, std::pair> const& PIDcuts, std::vector const& ITSCut = std::vector{}) +{ + int PDG = PIDcuts.first; + + if constexpr (useITS) { + if (ITSCut.size() != 0 && !ITSselection(track, std::make_pair(PDG, ITSCut))) + return false; + } + + float Nsigma = getTPCNsigma(track, PDG); + + if (Nsigma > PIDcuts.second[0] && Nsigma < PIDcuts.second[1]) { + return true; + } + return false; +} + +//========================================== TOF PID ========================================== + +template +inline float getTOFNsigma(TrackType const& track, int const& PDG) +{ + switch (PDG) { + case 211: + if constexpr (o2::aod::singletrackselector::pidutils::hasTOFPi::value) + return track.tofNSigmaPi(); + case 321: + if constexpr (o2::aod::singletrackselector::pidutils::hasTOFKa::value) + return track.tofNSigmaKa(); + case 2212: + if constexpr (o2::aod::singletrackselector::pidutils::hasTOFPr::value) + return track.tofNSigmaPr(); + case 1000010020: + if constexpr (o2::aod::singletrackselector::pidutils::hasTOFDe::value) + return track.tofNSigmaDe(); + case 1000020030: + if constexpr (o2::aod::singletrackselector::pidutils::hasTOFHe::value) + return track.tofNSigmaHe(); + case 1000010030: + if constexpr (o2::aod::singletrackselector::pidutils::hasTOFTr::value) + return track.tofNSigmaTr(); + case 0: + return -1000.0; + default: + LOG(fatal) << "Cannot interpret PDG for TOF selection: " << PDG; + return -1000.0; + } +} + +template +inline bool TOFselection(TrackType const& track, std::pair> const& PIDcuts, std::vector const& TPCresidualCut = std::vector{-5.0f, 5.0f}) +{ + int PDG = PIDcuts.first; + if (!TPCselection(track, std::make_pair(PDG, TPCresidualCut))) + return false; + + float Nsigma = getTOFNsigma(track, PDG); + + if (Nsigma > PIDcuts.second[0] && Nsigma < PIDcuts.second[1]) { + return true; + } + return false; +} +} // namespace o2::aod::singletrackselector + +#endif // PWGCF_FEMTO3D_DATAMODEL_PIDUTILS_H_ diff --git a/PWGCF/Femto3D/DataModel/singletrackselector.h b/PWGCF/Femto3D/DataModel/singletrackselector.h index 958c1ecf14c..c7323d15a32 100644 --- a/PWGCF/Femto3D/DataModel/singletrackselector.h +++ b/PWGCF/Femto3D/DataModel/singletrackselector.h @@ -16,7 +16,7 @@ #ifndef PWGCF_FEMTO3D_DATAMODEL_SINGLETRACKSELECTOR_H_ #define PWGCF_FEMTO3D_DATAMODEL_SINGLETRACKSELECTOR_H_ -#include +// #include #include #include @@ -26,6 +26,7 @@ #include "Common/DataModel/PIDResponseITS.h" #include "Framework/Logger.h" #include "Common/DataModel/Multiplicity.h" +#include "PWGCF/Femto3D/DataModel/PIDutils.h" namespace o2::aod { @@ -514,125 +515,3 @@ DECLARE_SOA_TABLE(SingleTrkMCs, "AOD", "SINGLETRKMC", // Table with generatad in } // namespace o2::aod #endif // PWGCF_FEMTO3D_DATAMODEL_SINGLETRACKSELECTOR_H_ - -namespace o2::aod::singletrackselector -{ -template -inline bool ITSselection(TrackType const& track, std::pair> const& PIDcuts) -{ - int PDG = PIDcuts.first; - - float Nsigma = -1000; - switch (PDG) { - case 2212: - Nsigma = track.itsNSigmaPr(); - break; - case 1000010020: - Nsigma = track.itsNSigmaDe(); - break; - case 1000020030: - Nsigma = track.itsNSigmaHe(); - break; - case 1000010030: - Nsigma = track.itsNSigmaTr(); - break; - case 211: - Nsigma = track.itsNSigmaPi(); - break; - case 321: - Nsigma = track.itsNSigmaKa(); - break; - case 0: - return false; - default: - LOG(fatal) << "Cannot interpret PDG for ITS selection: " << PIDcuts.first; - } - - if (Nsigma > PIDcuts.second[0] && Nsigma < PIDcuts.second[1]) { - return true; - } - return false; -} - -template -inline bool TPCselection(TrackType const& track, std::pair> const& PIDcuts, std::vector const& ITSCut = std::vector{}) -{ - int PDG = PIDcuts.first; - - if constexpr (useITS) { - if (ITSCut.size() != 0 && !ITSselection(track, std::make_pair(PDG, ITSCut))) - return false; - } - - float Nsigma = -1000; - switch (PDG) { - case 2212: - Nsigma = track.tpcNSigmaPr(); - break; - case 1000010020: - Nsigma = track.tpcNSigmaDe(); - break; - case 1000020030: - Nsigma = track.tpcNSigmaHe(); - break; - case 1000010030: - Nsigma = track.tpcNSigmaTr(); - break; - case 211: - Nsigma = track.tpcNSigmaPi(); - break; - case 321: - Nsigma = track.tpcNSigmaKa(); - break; - case 0: - return false; - default: - LOG(fatal) << "Cannot interpret PDG for TPC selection: " << PIDcuts.first; - } - - if (Nsigma > PIDcuts.second[0] && Nsigma < PIDcuts.second[1]) { - return true; - } - return false; -} - -template -inline bool TOFselection(TrackType const& track, std::pair> const& PIDcuts, std::vector const& TPCresidualCut = std::vector{-5.0f, 5.0f}) -{ - int PDG = PIDcuts.first; - if (!TPCselection(track, std::make_pair(PDG, TPCresidualCut))) - return false; - - float Nsigma = -1000; - switch (PDG) { - case 2212: - Nsigma = track.tofNSigmaPr(); - break; - case 1000010020: - Nsigma = track.tofNSigmaDe(); - break; - case 1000020030: - Nsigma = track.tofNSigmaHe(); - break; - case 1000010030: - Nsigma = track.tofNSigmaTr(); - break; - case 211: - Nsigma = track.tofNSigmaPi(); - break; - case 321: - Nsigma = track.tofNSigmaKa(); - break; - case 0: - return false; - default: - LOG(fatal) << "Cannot interpret PDG for TOF selection: " << PIDcuts.first; - } - - if (Nsigma > PIDcuts.second[0] && Nsigma < PIDcuts.second[1]) { - return true; - } - return false; -} - -} // namespace o2::aod::singletrackselector diff --git a/PWGCF/Femto3D/Tasks/femto3dPairTask.cxx b/PWGCF/Femto3D/Tasks/femto3dPairTask.cxx index 968ed384c7a..bc91f8a25c2 100644 --- a/PWGCF/Femto3D/Tasks/femto3dPairTask.cxx +++ b/PWGCF/Femto3D/Tasks/femto3dPairTask.cxx @@ -123,7 +123,8 @@ struct FemtoCorrelations { std::pair> TOFcuts_2; using FilteredCollisions = soa::Join; - using FilteredTracks = soa::Join; + // using FilteredTracks = soa::Join; // main + using FilteredTracks = soa::Join; // tmp solution till the HL is fixed typedef std::shared_ptr::iterator> trkType; typedef std::shared_ptr::iterator> colType; @@ -145,6 +146,16 @@ struct FemtoCorrelations { Filter vertexFilter = nabs(o2::aod::singletrackselector::posZ) < _vertexZ; + std::shared_ptr pHisto_first; // momentum histogram for the first particle + std::shared_ptr ITShisto_first; + std::shared_ptr TPChisto_first; + std::shared_ptr TOFhisto_first; + + std::shared_ptr pHisto_second; // momentum histogram for the second particle + std::shared_ptr ITShisto_second; + std::shared_ptr TPChisto_second; + std::shared_ptr TOFhisto_second; + std::vector> MultHistos; std::vector>> kThistos; std::vector>> mThistos; // test @@ -262,13 +273,16 @@ struct FemtoCorrelations { } } - registry.add("p_first", Form("p_%i", static_cast(_particlePDG_1)), kTH1F, {{100, 0., 5., "p"}}); - registry.add("nsigmaTOF_first", Form("nsigmaTOF_%i", static_cast(_particlePDG_1)), kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); - registry.add("nsigmaTPC_first", Form("nsigmaTPC_%i", static_cast(_particlePDG_1)), kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); + pHisto_first = registry.add(Form("p_%i", _particlePDG_1.value), Form("p_%i", _particlePDG_1.value), kTH1F, {{100, 0., 5., "p"}}); + ITShisto_first = registry.add(Form("nsigmaITS_PDG%i", _particlePDG_1.value), Form("nsigmaITS_PDG%i", _particlePDG_1.value), kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); + TPChisto_first = registry.add(Form("nsigmaTPC_PDG%i", _particlePDG_1.value), Form("nsigmaTPC_PDG%i", _particlePDG_1.value), kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); + TOFhisto_first = registry.add(Form("nsigmaTOF_PDG%i", _particlePDG_1.value), Form("nsigmaTOF_PDG%i", _particlePDG_1.value), kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); + if (!IsIdentical) { - registry.add("p_second", Form("p_%i", static_cast(_particlePDG_2)), kTH1F, {{100, 0., 5., "p"}}); - registry.add("nsigmaTOF_second", Form("nsigmaTOF_%i", static_cast(_particlePDG_2)), kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); - registry.add("nsigmaTPC_second", Form("nsigmaTPC_%i", static_cast(_particlePDG_2)), kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); + pHisto_second = registry.add(Form("p_%i", _particlePDG_2.value), Form("p_%i", _particlePDG_2.value), kTH1F, {{100, 0., 5., "p"}}); + ITShisto_second = registry.add(Form("nsigmaITS_PDG%i", _particlePDG_2.value), Form("nsigmaITS_PDG%i", _particlePDG_2.value), kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); + TPChisto_second = registry.add(Form("nsigmaTPC_PDG%i", _particlePDG_2.value), Form("nsigmaTPC_PDG%i", _particlePDG_2.value), kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); + TOFhisto_second = registry.add(Form("nsigmaTOF_PDG%i", _particlePDG_2.value), Form("nsigmaTOF_PDG%i", _particlePDG_2.value), kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); } } @@ -395,7 +409,7 @@ struct FemtoCorrelations { if (_particlePDG_1 == 0 || _particlePDG_2 == 0) LOGF(fatal, "One of passed PDG is 0!!!"); - for (auto track : tracks) { + for (const auto& track : tracks) { if (std::fabs(track.template singleCollSel_as>().posZ()) > _vertexZ) continue; if (_removeSameBunchPileup && !track.template singleCollSel_as>().isNoSameBunchPileup()) @@ -420,53 +434,27 @@ struct FemtoCorrelations { continue; if (track.sign() == _sign_1 && (track.p() < _PIDtrshld_1 ? o2::aod::singletrackselector::TPCselection(track, TPCcuts_1, _itsNSigma_1.value) : o2::aod::singletrackselector::TOFselection(track, TOFcuts_1, _tpcNSigmaResidual_1.value))) { // filling the map: eventID <-> selected particles1 - selectedtracks_1[track.singleCollSelId()].push_back(std::make_shared(track)); + selectedtracks_1[track.singleCollSelId()].push_back(std::make_shared::iterator>(track)); - registry.fill(HIST("p_first"), track.p()); - if (_particlePDG_1 == 211) { - registry.fill(HIST("nsigmaTOF_first"), track.p(), track.tofNSigmaPi()); - registry.fill(HIST("nsigmaTPC_first"), track.p(), track.tpcNSigmaPi()); - } - if (_particlePDG_1 == 321) { - registry.fill(HIST("nsigmaTOF_first"), track.p(), track.tofNSigmaKa()); - registry.fill(HIST("nsigmaTPC_first"), track.p(), track.tpcNSigmaKa()); - } - if (_particlePDG_1 == 2212) { - registry.fill(HIST("nsigmaTOF_first"), track.p(), track.tofNSigmaPr()); - registry.fill(HIST("nsigmaTPC_first"), track.p(), track.tpcNSigmaPr()); - } - if (_particlePDG_1 == 1000010020) { - registry.fill(HIST("nsigmaTOF_first"), track.p(), track.tofNSigmaDe()); - registry.fill(HIST("nsigmaTPC_first"), track.p(), track.tpcNSigmaDe()); - } + pHisto_first->Fill(track.p()); + ITShisto_first->Fill(track.p(), o2::aod::singletrackselector::getITSNsigma(track, _particlePDG_1)); + TPChisto_first->Fill(track.p(), o2::aod::singletrackselector::getTPCNsigma(track, _particlePDG_1)); + TOFhisto_first->Fill(track.p(), o2::aod::singletrackselector::getTOFNsigma(track, _particlePDG_1)); } if (IsIdentical) { continue; } else if (track.sign() != _sign_2 && !TOFselection(track, std::make_pair(_particlePDGtoReject, _rejectWithinNsigmaTOF)) && (track.p() < _PIDtrshld_2 ? o2::aod::singletrackselector::TPCselection(track, TPCcuts_2, _itsNSigma_2.value) : o2::aod::singletrackselector::TOFselection(track, TOFcuts_2, _tpcNSigmaResidual_2.value))) { // filling the map: eventID <-> selected particles2 if (see condition above ^) - selectedtracks_2[track.singleCollSelId()].push_back(std::make_shared(track)); + selectedtracks_2[track.singleCollSelId()].push_back(std::make_shared::iterator>(track)); - registry.fill(HIST("p_second"), track.p()); - if (_particlePDG_2 == 211) { - registry.fill(HIST("nsigmaTOF_second"), track.p(), track.tofNSigmaPi()); - registry.fill(HIST("nsigmaTPC_second"), track.p(), track.tpcNSigmaPi()); - } - if (_particlePDG_2 == 321) { - registry.fill(HIST("nsigmaTOF_second"), track.p(), track.tofNSigmaKa()); - registry.fill(HIST("nsigmaTPC_second"), track.p(), track.tpcNSigmaKa()); - } - if (_particlePDG_2 == 2212) { - registry.fill(HIST("nsigmaTOF_second"), track.p(), track.tofNSigmaPr()); - registry.fill(HIST("nsigmaTPC_second"), track.p(), track.tpcNSigmaPr()); - } - if (_particlePDG_2 == 1000010020) { - registry.fill(HIST("nsigmaTOF_second"), track.p(), track.tofNSigmaDe()); - registry.fill(HIST("nsigmaTPC_second"), track.p(), track.tpcNSigmaDe()); - } + pHisto_second->Fill(track.p()); + ITShisto_second->Fill(track.p(), o2::aod::singletrackselector::getITSNsigma(track, _particlePDG_2)); + TPChisto_second->Fill(track.p(), o2::aod::singletrackselector::getTPCNsigma(track, _particlePDG_2)); + TOFhisto_second->Fill(track.p(), o2::aod::singletrackselector::getTOFNsigma(track, _particlePDG_2)); } } - for (auto collision : collisions) { + for (const auto& collision : collisions) { if (collision.multPerc() < *_centBins.value.begin() || collision.multPerc() >= *(_centBins.value.end() - 1)) continue; if (collision.hadronicRate() < _IRcut.value.first || collision.hadronicRate() >= _IRcut.value.second) @@ -494,7 +482,7 @@ struct FemtoCorrelations { int vertexBinToMix = std::floor((collision.posZ() + _vertexZ) / (2 * _vertexZ / _vertexNbinsToMix)); float centBinToMix = o2::aod::singletrackselector::getBinIndex(collision.multPerc(), _centBins, _multNsubBins); - mixbins[std::pair{vertexBinToMix, centBinToMix}].push_back(std::make_shared(collision)); + mixbins[std::pair{vertexBinToMix, centBinToMix}].push_back(std::make_shared::iterator>(collision)); } //====================================== mixing starts here ====================================== diff --git a/PWGCF/Femto3D/Tasks/femto3dQA.cxx b/PWGCF/Femto3D/Tasks/femto3dQA.cxx index 22fab0e58b0..6923ae91cb6 100644 --- a/PWGCF/Femto3D/Tasks/femto3dQA.cxx +++ b/PWGCF/Femto3D/Tasks/femto3dQA.cxx @@ -83,6 +83,10 @@ struct QAHistograms { std::pair> TPCcuts; std::pair> TOFcuts; + std::shared_ptr ITShisto; + std::shared_ptr TPChisto; + std::shared_ptr TOFhisto; + Filter signFilter = o2::aod::singletrackselector::sign == _sign; Filter pFilter = o2::aod::singletrackselector::p > _min_P&& o2::aod::singletrackselector::p < _max_P; Filter etaFilter = nabs(o2::aod::singletrackselector::eta) < _eta; @@ -145,40 +149,9 @@ struct QAHistograms { registry.add("TPCSignal", "TPC Signal", kTH2F, {{{200, 0., 5.0, "#it{p}_{inner} (GeV/#it{c})"}, {1000, 0., 1000.0, "dE/dx in TPC (arbitrary units)"}}}); registry.add("TOFSignal", "TOF Signal", kTH2F, {{200, 0., 5.0, "#it{p} (GeV/#it{c})"}, {100, 0., 1.5, "#beta"}}); - switch (_particlePDG) { - case 211: - registry.add("nsigmaTOFPi", "nsigmaTOFPi", kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); - registry.add("nsigmaTPCPi", "nsigmaTPCPi", kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); - registry.add("nsigmaITSPi", "nsigmaITSPi", kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); - break; - case 321: - registry.add("nsigmaTOFKa", "nsigmaTOFKa", kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); - registry.add("nsigmaTPCKa", "nsigmaTPCKa", kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); - registry.add("nsigmaITSKa", "nsigmaITSKa", kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); - break; - case 2212: - registry.add("nsigmaTOFPr", "nsigmaTOFPr", kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); - registry.add("nsigmaTPCPr", "nsigmaTPCPr", kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); - registry.add("nsigmaITSPr", "nsigmaITSPr", kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); - break; - case 1000010020: - registry.add("nsigmaTOFDe", "nsigmaTOFDe", kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); - registry.add("nsigmaTPCDe", "nsigmaTPCDe", kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); - registry.add("nsigmaITSDe", "nsigmaITSDe", kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); - break; - case 1000010030: - registry.add("nsigmaTOFTr", "nsigmaTOFTr", kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); - registry.add("nsigmaTPCTr", "nsigmaTPCTr", kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); - registry.add("nsigmaITSTr", "nsigmaITSTr", kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); - break; - case 1000020030: - registry.add("nsigmaTOFHe", "nsigmaTOFHe", kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); - registry.add("nsigmaTPCHe", "nsigmaTPCHe", kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); - registry.add("nsigmaITSHe", "nsigmaITSHe", kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); - break; - default: - break; - } + ITShisto = registry.add(Form("nsigmaITS_PDG%i", _particlePDG.value), Form("nsigmaITS_PDG%i", _particlePDG.value), kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); + TPChisto = registry.add(Form("nsigmaTPC_PDG%i", _particlePDG.value), Form("nsigmaTPC_PDG%i", _particlePDG.value), kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); + TOFhisto = registry.add(Form("nsigmaTOF_PDG%i", _particlePDG.value), Form("nsigmaTOF_PDG%i", _particlePDG.value), kTH2F, {{100, 0., 5.}, {100, -10., 10.}}); const AxisSpec axisMult{5001, -0.5, 5000.5, "mult."}; const AxisSpec axisPerc{101, -0.5, 100.5, "percentile"}; @@ -215,7 +188,7 @@ struct QAHistograms { registry.fill(HIST("IRvsOccupancy"), collision.occupancy(), collision.hadronicRate()); } - for (auto& track : tracks) { + for (const auto& track : tracks) { if (_removeSameBunchPileup && !track.template singleCollSel_as().isNoSameBunchPileup()) continue; @@ -266,40 +239,9 @@ struct QAHistograms { registry.fill(HIST("ITSchi2"), track.itsChi2NCl()); registry.fill(HIST("TPCchi2"), track.tpcChi2NCl()); - switch (_particlePDG) { - case 211: - registry.fill(HIST("nsigmaTOFPi"), track.p(), track.tofNSigmaPi()); - registry.fill(HIST("nsigmaTPCPi"), track.p(), track.tpcNSigmaPi()); - registry.fill(HIST("nsigmaITSPi"), track.p(), track.itsNSigmaPi()); - break; - case 321: - registry.fill(HIST("nsigmaTOFKa"), track.p(), track.tofNSigmaKa()); - registry.fill(HIST("nsigmaTPCKa"), track.p(), track.tpcNSigmaKa()); - registry.fill(HIST("nsigmaITSKa"), track.p(), track.itsNSigmaKa()); - break; - case 2212: - registry.fill(HIST("nsigmaTOFPr"), track.p(), track.tofNSigmaPr()); - registry.fill(HIST("nsigmaTPCPr"), track.p(), track.tpcNSigmaPr()); - registry.fill(HIST("nsigmaITSPr"), track.p(), track.itsNSigmaPr()); - break; - case 1000010020: - registry.fill(HIST("nsigmaTOFDe"), track.p(), track.tofNSigmaDe()); - registry.fill(HIST("nsigmaTPCDe"), track.p(), track.tpcNSigmaDe()); - registry.fill(HIST("nsigmaITSDe"), track.p(), track.itsNSigmaDe()); - break; - case 1000010030: - registry.fill(HIST("nsigmaTOFTr"), track.p(), track.tofNSigmaTr()); - registry.fill(HIST("nsigmaTPCTr"), track.p(), track.tpcNSigmaTr()); - registry.fill(HIST("nsigmaITSTr"), track.p(), track.itsNSigmaTr()); - break; - case 1000020030: - registry.fill(HIST("nsigmaTOFHe"), track.p(), track.tofNSigmaHe()); - registry.fill(HIST("nsigmaTPCHe"), track.p(), track.tpcNSigmaHe()); - registry.fill(HIST("nsigmaITSHe"), track.p(), track.itsNSigmaHe()); - break; - default: - break; - } + ITShisto->Fill(track.p(), o2::aod::singletrackselector::getITSNsigma(track, _particlePDG)); + TPChisto->Fill(track.p(), o2::aod::singletrackselector::getTPCNsigma(track, _particlePDG)); + TOFhisto->Fill(track.p(), o2::aod::singletrackselector::getTOFNsigma(track, _particlePDG)); if constexpr (FillExtra) { registry.fill(HIST("TPCSignal"), track.tpcInnerParam(), track.tpcSignal()); @@ -309,13 +251,15 @@ struct QAHistograms { } } - void processDefault(soa::Filtered> const& collisions, soa::Filtered> const& tracks) + // void processDefault(soa::Filtered> const& collisions, soa::Filtered> const& tracks) // main + void processDefault(soa::Filtered> const& collisions, soa::Filtered> const& tracks) // tmp solution till the HL is fixed { fillHistograms(collisions, tracks); } PROCESS_SWITCH(QAHistograms, processDefault, "process default", true); - void processExtra(soa::Filtered> const& collisions, soa::Filtered> const& tracks) + // void processExtra(soa::Filtered> const& collisions, soa::Filtered> const& tracks) // main + void processExtra(soa::Filtered> const& collisions, soa::Filtered> const& tracks) // tmp solution till the HL is fixed { fillHistograms(collisions, tracks); } From 33c9b2af05c9d290fc82e35c7cc77dc76a337e4d Mon Sep 17 00:00:00 2001 From: Fabrizio Date: Tue, 25 Mar 2025 18:17:16 +0100 Subject: [PATCH 0823/1650] [PWGHF,Trigger] Add configurables for max mass in Xi+bachelor(s) trigger + minor changes in QA (#10645) --- EventFiltering/PWGHF/HFFilter.cxx | 10 +++++----- EventFiltering/PWGHF/HFFilterHelpers.h | 18 +++++++++++------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/EventFiltering/PWGHF/HFFilter.cxx b/EventFiltering/PWGHF/HFFilter.cxx index 40b2ea4ebf2..2e88cbb9d25 100644 --- a/EventFiltering/PWGHF/HFFilter.cxx +++ b/EventFiltering/PWGHF/HFFilter.cxx @@ -116,7 +116,7 @@ struct HfFilter { // Main struct for HF triggers // parameters for charm baryons to Xi bachelor Configurable> cutsXiCascades{"cutsXiCascades", {cutsCascades[0], 1, 8, labelsEmpty, labelsColumnsCascades}, "Selections for cascades (Xi) for Xi+bachelor triggers"}; - Configurable> cutsXiBachelor{"cutsXiBachelor", {cutsCharmBaryons[0], 1, 8, labelsEmpty, labelsColumnsCharmBarCuts}, "Selections for charm baryons (Xi+Pi, Xi+Ka, Xi+Pi+Pi)"}; + Configurable> cutsXiBachelor{"cutsXiBachelor", {cutsCharmBaryons[0], 1, 11, labelsEmpty, labelsColumnsCharmBarCuts}, "Selections for charm baryons (Xi+Pi, Xi+Ka, Xi+Pi+Pi)"}; Configurable> cutsTrackCharmBaryonBachelor{"cutsTrackCharmBaryonBachelor", {hf_cuts_single_track::CutsTrack[0], hf_cuts_single_track::NBinsPtTrack, hf_cuts_single_track::NCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for charm-baryon bachelor candidates"}; Configurable> requireStrangenessTracking{"requireStrangenessTracking", {requireStrangenessTrackedXi[0], 1, 2, labelsEmpty, labelsColumnsCharmBaryons}, "Flags to require strangeness tracking for channels with Xi"}; @@ -218,7 +218,7 @@ struct HfFilter { // Main struct for HF triggers helper.setForceTofForFemto(forceTofProtonForFemto, forceTofDeuteronForFemto); helper.setV0Selections(cutsGammaK0sLambda->get(0u, 0u), cutsGammaK0sLambda->get(0u, 1u), cutsGammaK0sLambda->get(0u, 2u), cutsGammaK0sLambda->get(0u, 3u), cutsGammaK0sLambda->get(0u, 4u), cutsGammaK0sLambda->get(0u, 5u)); helper.setXiSelections(cutsXiCascades->get(0u, 0u), cutsXiCascades->get(0u, 1u), cutsXiCascades->get(0u, 2u), cutsXiCascades->get(0u, 3u), cutsXiCascades->get(0u, 4u), cutsXiCascades->get(0u, 5u), cutsXiCascades->get(0u, 6u), cutsXiCascades->get(0u, 7u)); - helper.setXiBachelorSelections(cutsXiBachelor->get(0u, 0u), cutsXiBachelor->get(0u, 1u), cutsXiBachelor->get(0u, 2u), cutsXiBachelor->get(0u, 3u), cutsXiBachelor->get(0u, 4u), cutsXiBachelor->get(0u, 5u), cutsXiBachelor->get(0u, 6u), cutsXiBachelor->get(0u, 7u)); + helper.setXiBachelorSelections(cutsXiBachelor->get(0u, 0u), cutsXiBachelor->get(0u, 1u), cutsXiBachelor->get(0u, 2u), cutsXiBachelor->get(0u, 3u), cutsXiBachelor->get(0u, 4u), cutsXiBachelor->get(0u, 5u), cutsXiBachelor->get(0u, 6u), cutsXiBachelor->get(0u, 7u), cutsXiBachelor->get(0u, 8u), cutsXiBachelor->get(0u, 9u), cutsXiBachelor->get(0u, 10u)); helper.setNsigmaPiCutsForCharmBaryonBachelor(nSigmaPidCuts->get(0u, 4u), nSigmaPidCuts->get(1u, 4u)); helper.setTpcPidCalibrationOption(setTPCCalib); helper.setMassResolParametrisation(paramCharmMassShape); @@ -291,10 +291,10 @@ struct HfFilter { // Main struct for HF triggers for (int iBeautyPart{0}; iBeautyPart < kNBeautyParticles; ++iBeautyPart) { hMassVsPtB[iBeautyPart] = registry.add(Form("fMassVsPt%s", beautyParticleNames[iBeautyPart].data()), Form("#it{M} vs. #it{p}_{T} distribution of triggered %s candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", beautyParticleNames[iBeautyPart].data()), HistType::kTH2D, {ptAxis, massAxisB[iBeautyPart]}); - hCpaVsPtB[iBeautyPart] = registry.add(Form("fCpaVsPt%s", beautyParticleNames[iBeautyPart].data()), Form("CPA vs. #it{p}_{T} distribution of triggered %s candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", beautyParticleNames[iBeautyPart].data()), HistType::kTH2D, {ptAxis, {100, -1, 1}}); - hDecayLengthVsPtB[iBeautyPart] = registry.add(Form("fDecayLengthVsPt%s", beautyParticleNames[iBeautyPart].data()), Form("DecayLength vs. #it{p}_{T} distribution of triggered %s candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", beautyParticleNames[iBeautyPart].data()), HistType::kTH2D, {ptAxis, {100, 0, 20}}); + hCpaVsPtB[iBeautyPart] = registry.add(Form("fCpaVsPt%s", beautyParticleNames[iBeautyPart].data()), Form("CPA vs. #it{p}_{T} distribution of triggered %s candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", beautyParticleNames[iBeautyPart].data()), HistType::kTH2D, {ptAxis, {500, 0., 1}}); + hDecayLengthVsPtB[iBeautyPart] = registry.add(Form("fDecayLengthVsPt%s", beautyParticleNames[iBeautyPart].data()), Form("DecayLength vs. #it{p}_{T} distribution of triggered %s candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", beautyParticleNames[iBeautyPart].data()), HistType::kTH2D, {ptAxis, {500, 0, 0.5}}); if (iBeautyPart != kB0toDStar) { - hImpactParamProductVsPtB[iBeautyPart] = registry.add(Form("fImpactParamProductVsPt%s", beautyParticleNames[iBeautyPart].data()), Form("ImpactParamProduct vs. #it{p}_{T} distribution of triggered %s candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", beautyParticleNames[iBeautyPart].data()), HistType::kTH2D, {ptAxis, {100, -2.5, +2.5}}); + hImpactParamProductVsPtB[iBeautyPart] = registry.add(Form("fImpactParamProductVsPt%s", beautyParticleNames[iBeautyPart].data()), Form("ImpactParamProduct vs. #it{p}_{T} distribution of triggered %s candidates;#it{p}_{T} (GeV/#it{c});#it{M} (GeV/#it{c}^{2});counts", beautyParticleNames[iBeautyPart].data()), HistType::kTH2D, {ptAxis, {500, -2.5e-3, +2.5e-3}}); } } for (int iBeautyPart{kNBeautyParticles}; iBeautyPart < nTotBeautyParts; ++iBeautyPart) { diff --git a/EventFiltering/PWGHF/HFFilterHelpers.h b/EventFiltering/PWGHF/HFFilterHelpers.h index f72ec03431e..ce95d24e5cd 100644 --- a/EventFiltering/PWGHF/HFFilterHelpers.h +++ b/EventFiltering/PWGHF/HFFilterHelpers.h @@ -285,7 +285,7 @@ static const o2::framework::AxisSpec qtAxis{100, 0.f, 0.25f}; static const o2::framework::AxisSpec bdtAxis{100, 0.f, 1.f}; static const o2::framework::AxisSpec phiAxis{36, 0., o2::constants::math::TwoPI}; static const std::array massAxisC = {o2::framework::AxisSpec{250, 1.65f, 2.15f}, o2::framework::AxisSpec{250, 1.65f, 2.15f}, o2::framework::AxisSpec{250, 1.75f, 2.25f}, o2::framework::AxisSpec{250, 2.05f, 2.55f}, o2::framework::AxisSpec{250, 2.25f, 2.75f}, o2::framework::AxisSpec{200, 0.139f, 0.159f}, o2::framework::AxisSpec{250, 0.f, 0.25f}, o2::framework::AxisSpec{250, 0.f, 0.25f}, o2::framework::AxisSpec{200, 0.48f, 0.88f}, o2::framework::AxisSpec{200, 0.48f, 0.88f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{170, 0.13f, 0.3f}, o2::framework::AxisSpec{170, 0.13f, 0.3f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{350, 2.3f, 3.0f}, o2::framework::AxisSpec{350, 2.3f, 3.0f}, o2::framework::AxisSpec{350, 2.3f, 3.0f}, o2::framework::AxisSpec{240, 2.4f, 3.6f}, o2::framework::AxisSpec{300, 0.7f, 1.3f}, o2::framework::AxisSpec{300, 0.7f, 1.3f}, o2::framework::AxisSpec{300, 0.7f, 1.3f}, o2::framework::AxisSpec{300, 0.7f, 1.3f}}; -static const std::array massAxisB = {o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{240, 5.0f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{240, 5.0f, 6.2f}, o2::framework::AxisSpec{240, 5.8f, 7.0f}}; +static const std::array massAxisB = {o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.4f, 6.4f}, o2::framework::AxisSpec{400, 5.0f, 6.6f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{400, 5.0f, 6.6f}, o2::framework::AxisSpec{240, 5.8f, 7.0f}}; // default values for configurables // channels to trigger on for femto @@ -361,8 +361,8 @@ static const std::vector labelsColumnsV0s = {"CosPaGamma", "CosPaK0 // cascades for Xi + bachelor triggers constexpr float cutsCascades[1][8] = {{0.2, 1., 0.01, 0.01, 0.99, 0.99, 0.3, 3.}}; // ptXiBachelor, deltaMassXi, deltaMassLambda, cosPaXi, cosPaLambda, DCAxyXi, nSigmaPid static const std::vector labelsColumnsCascades = {"PtBachelor", "PtXi", "DeltaMassXi", "DeltaMassLambda", "CosPAXi", "CosPaLambda", "DCAxyXi", "NsigmaPid"}; -constexpr float cutsCharmBaryons[1][8] = {{5., 5., 1000., 2.35, 2.60, 2.35, -2., -2.}}; // MinPtXiPi, MinPtXiKa, MinPtXiPiPi, MinMassXiPi, MinMassXiKa, MinMassXiPiPi, CosPaXiBach, CosPaXiBachBach -static const std::vector labelsColumnsCharmBarCuts = {"MinPtXiPi", "MinPtXiKa", "MinPtXiPiPi", "MinMassXiPi", "MinMassXiKa", "MinMassXiPiPi", "CosPaXiBach", "CosPaXiBachBach"}; +constexpr float cutsCharmBaryons[1][11] = {{5., 5., 1000., 2.35, 2.60, 2.35, 3., 3., 2.7, -2., -2.}}; // MinPtXiPi, MinPtXiKa, MinPtXiPiPi, MinMassXiPi, MinMassXiKa, MinMassXiPiPi, MaxMassXiPi, MaxMassXiKa, MaxMassXiPiPi, CosPaXiBach, CosPaXiBachBach +static const std::vector labelsColumnsCharmBarCuts = {"MinPtXiPi", "MinPtXiKa", "MinPtXiPiPi", "MinMassXiPi", "MinMassXiKa", "MinMassXiPiPi", "MaxMassXiPi", "MaxMassXiKa", "MaxMassXiPiPi", "CosPaXiBach", "CosPaXiBachBach"}; constexpr int requireStrangenessTrackedXi[1][2] = {{1, 0}}; static const std::vector labelsColumnsCharmBaryons = {"CharmBarToXiBach", "CharmBarToXiBachBach"}; @@ -533,7 +533,7 @@ class HfFilterHelper mNSigmaTofKaonFromXicResoToSigmaC = nSigmaTof; } - void setXiBachelorSelections(float ptMinXiPi, float ptMinXiKa, float ptMinXiPiPi, float massMinXiPi, float massMinXiKa, float massMinXiPiPi, float cosPaMinXiBach, float cosPaMinXiBachBach) + void setXiBachelorSelections(float ptMinXiPi, float ptMinXiKa, float ptMinXiPiPi, float massMinXiPi, float massMinXiKa, float massMinXiPiPi, float massMaxXiPi, float massMaxXiKa, float massMaxXiPiPi, float cosPaMinXiBach, float cosPaMinXiBachBach) { mPtMinXiBach[0] = ptMinXiPi; mPtMinXiBach[1] = ptMinXiKa; @@ -541,6 +541,9 @@ class HfFilterHelper mMassMinXiBach[0] = massMinXiPi; mMassMinXiBach[1] = massMinXiKa; mMassMinXiBach[2] = massMinXiPiPi; + mMassMaxXiBach[0] = massMaxXiPi; + mMassMaxXiBach[1] = massMaxXiKa; + mMassMaxXiBach[2] = massMaxXiPiPi; mCosPaMinXiBach[0] = cosPaMinXiBach; mCosPaMinXiBach[1] = cosPaMinXiBachBach; } @@ -737,6 +740,7 @@ class HfFilterHelper bool mForceTofDeuteronForFemto = false; // flag to force TOF PID for deuterons std::array mPtMinXiBach{5., 5., 5.}; // minimum pT for XiBachelor candidates std::array mMassMinXiBach{2.35, 2.6, 2.35}; // minimum invariant-mass for XiBachelor candidates + std::array mMassMaxXiBach{3.0, 3.0, 2.7}; // maximum invariant-mass for XiBachelor candidates std::array mCosPaMinXiBach{-2.f, -2.f}; // minimum cosine of pointing angle for XiBachelor candidates std::array, kNBeautyParticles> mCutsBhad{}; // selections for B-hadron candidates (DeltaMass, CPA, DecayLength, ImpactParameterProduct) o2::framework::LabeledArray mCutsBhadToJPsi{}; // selections for B->JPsi candidates (PtMinMu, DeltaMass, CPA, DecayLength) @@ -2248,7 +2252,7 @@ inline bool HfFilterHelper::isSelectedXiBach(T const& trackParCasc, T const& tra float massXiPi{0.f}; if (TESTBIT(isSelBachelor, kPionForCharmBaryon)) { massXiPi = RecoDecay::m(std::array{pVecCascade, pVecBachelor}, std::array{massXi, massPi}); - if (ptXiBach >= mPtMinXiBach[0] && massXiPi >= mMassMinXiBach[0] && massXiPi <= 3.f) { + if (ptXiBach >= mPtMinXiBach[0] && massXiPi >= mMassMinXiBach[0] && massXiPi <= mMassMaxXiBach[0]) { isSelectedXiPi = true; } } @@ -2257,7 +2261,7 @@ inline bool HfFilterHelper::isSelectedXiBach(T const& trackParCasc, T const& tra float massXiKa{0.f}; if (TESTBIT(isSelBachelor, kKaonForCharmBaryon)) { massXiKa = RecoDecay::m(std::array{pVecCascade, pVecBachelor}, std::array{massXi, massKa}); - if (ptXiBach >= mPtMinXiBach[1] && massXiKa >= mMassMinXiBach[1] && massXiKa <= 3.f) { + if (ptXiBach >= mPtMinXiBach[1] && massXiKa >= mMassMinXiBach[1] && massXiKa <= mMassMaxXiBach[1]) { isSelectedXiKa = true; } } @@ -2325,7 +2329,7 @@ inline bool HfFilterHelper::isSelectedXiBachBach(T const& trackParCasc, std::arr // compute mass float massXiPiPi = RecoDecay::m(std::array{pVecCascade, pVecBachelorFirst, pVecBachelorSecond}, std::array{massXi, massPi, massPi}); - if (massXiPiPi < mMassMinXiBach[2] || massXiPiPi > 3.f) { + if (massXiPiPi < mMassMinXiBach[2] || massXiPiPi > mMassMaxXiBach[2]) { return false; } From 6d53e1b6a42c29bfb5820090bb05c6ac76b94007 Mon Sep 17 00:00:00 2001 From: rolavick Date: Tue, 25 Mar 2025 20:26:31 +0100 Subject: [PATCH 0824/1650] [PWGUD] personal task modification (#10644) Co-authored-by: ALICE Action Bot --- PWGUD/Tasks/upcTauRl.cxx | 214 +++++++++++++++++++++++++++++++++++---- 1 file changed, 195 insertions(+), 19 deletions(-) diff --git a/PWGUD/Tasks/upcTauRl.cxx b/PWGUD/Tasks/upcTauRl.cxx index 248d44506db..2189f0a84d3 100644 --- a/PWGUD/Tasks/upcTauRl.cxx +++ b/PWGUD/Tasks/upcTauRl.cxx @@ -89,18 +89,21 @@ DECLARE_SOA_COLUMN(TrkPz, trkPz, float[2]); DECLARE_SOA_COLUMN(TrkSign, trkSign, int[2]); DECLARE_SOA_COLUMN(TrkDCAxy, trkDCAxy, float[2]); DECLARE_SOA_COLUMN(TrkDCAz, trkDCAz, float[2]); +DECLARE_SOA_COLUMN(TrkTimeRes, trkTimeRes, float[2]); DECLARE_SOA_COLUMN(TrkTPCsignal, trkTPCsignal, float[2]); DECLARE_SOA_COLUMN(TrkTPCnSigmaEl, trkTPCnSigmaEl, float[2]); DECLARE_SOA_COLUMN(TrkTPCnSigmaMu, trkTPCnSigmaMu, float[2]); DECLARE_SOA_COLUMN(TrkTPCnSigmaPi, trkTPCnSigmaPi, float[2]); DECLARE_SOA_COLUMN(TrkTPCnSigmaKa, trkTPCnSigmaKa, float[2]); DECLARE_SOA_COLUMN(TrkTPCnSigmaPr, trkTPCnSigmaPr, float[2]); +DECLARE_SOA_COLUMN(TrkTPCinnerParam, trkTPCinnerParam, float[2]); DECLARE_SOA_COLUMN(TrkTOFsignal, trkTOFsignal, float[2]); DECLARE_SOA_COLUMN(TrkTOFnSigmaEl, trkTOFnSigmaEl, float[2]); DECLARE_SOA_COLUMN(TrkTOFnSigmaMu, trkTOFnSigmaMu, float[2]); DECLARE_SOA_COLUMN(TrkTOFnSigmaPi, trkTOFnSigmaPi, float[2]); DECLARE_SOA_COLUMN(TrkTOFnSigmaKa, trkTOFnSigmaKa, float[2]); DECLARE_SOA_COLUMN(TrkTOFnSigmaPr, trkTOFnSigmaPr, float[2]); +DECLARE_SOA_COLUMN(TrkTPCexpMom, trkTPCexpMom, float[2]); } // namespace tau_tree DECLARE_SOA_TABLE(TauTwoTracks, "AOD", "TAUTWOTRACK", @@ -109,9 +112,9 @@ DECLARE_SOA_TABLE(TauTwoTracks, "AOD", "TAUTWOTRACK", tau_tree::Trs, tau_tree::Trofs, tau_tree::Hmpr, tau_tree::Tfb, tau_tree::ItsRofb, tau_tree::Sbp, tau_tree::ZvtxFT0vsPv, tau_tree::VtxITSTPC, tau_tree::TotalFT0AmplitudeA, tau_tree::TotalFT0AmplitudeC, tau_tree::TotalFV0AmplitudeA, tau_tree::TimeFT0A, tau_tree::TimeFT0C, tau_tree::TimeFV0A, - tau_tree::TrkPx, tau_tree::TrkPy, tau_tree::TrkPz, tau_tree::TrkSign, tau_tree::TrkDCAxy, tau_tree::TrkDCAz, - tau_tree::TrkTPCsignal, tau_tree::TrkTPCnSigmaEl, tau_tree::TrkTPCnSigmaMu, tau_tree::TrkTPCnSigmaPi, tau_tree::TrkTPCnSigmaKa, tau_tree::TrkTPCnSigmaPr, - tau_tree::TrkTOFsignal, tau_tree::TrkTOFnSigmaEl, tau_tree::TrkTOFnSigmaMu, tau_tree::TrkTOFnSigmaPi, tau_tree::TrkTOFnSigmaKa, tau_tree::TrkTOFnSigmaPr); + tau_tree::TrkPx, tau_tree::TrkPy, tau_tree::TrkPz, tau_tree::TrkSign, tau_tree::TrkDCAxy, tau_tree::TrkDCAz, tau_tree::TrkTimeRes, + tau_tree::TrkTPCsignal, tau_tree::TrkTPCnSigmaEl, tau_tree::TrkTPCnSigmaMu, tau_tree::TrkTPCnSigmaPi, tau_tree::TrkTPCnSigmaKa, tau_tree::TrkTPCnSigmaPr, tau_tree::TrkTPCinnerParam, + tau_tree::TrkTOFsignal, tau_tree::TrkTOFnSigmaEl, tau_tree::TrkTOFnSigmaMu, tau_tree::TrkTOFnSigmaPi, tau_tree::TrkTOFnSigmaKa, tau_tree::TrkTOFnSigmaPr, tau_tree::TrkTPCexpMom); } // namespace o2::aod @@ -119,7 +122,6 @@ struct UpcTauRl { Produces tauTwoTracks; // Global varialbes - bool isMC = false; Service pdg; SGSelector sgSelector; @@ -213,6 +215,17 @@ struct UpcTauRl { Configurable cutElectronPt{"cutElectronPt", 0.9, {"Pt, where PiKaon invariant mass histos will split."}}; } cutTauEvent; + struct : ConfigurableGroup { + Configurable cutCanMinElectronNsigmaEl{"cutCanMinElectronNsigmaEl", 4.0, {"Good el candidate hypo in. Upper n sigma cut on el hypo of selected electron. What is more goes away."}}; + Configurable cutCanMaxElectronNsigmaEl{"cutCanMaxElectronNsigmaEl", -2.0, {"Good el candidate hypo in. Lower n sigma cut on el hypo of selected electron. What is less goes away."}}; + Configurable cutCanElectronHasTOF{"cutCanElectronHasTOF", true, {"Electron candidated is required to hit TOF."}}; + Configurable cutCanMinPionNsigmaEl{"cutCanMinPionNsigmaEl", 5.0, {"Good pi candidate hypo in. Upper n sigma cut on pi hypo of selected electron. What is more goes away."}}; + Configurable cutCanMaxPionNsigmaEl{"cutCanMaxPionNsigmaEl", -5.0, {"Good pi candidate hypo in. Lower n sigma cut on pi hypo of selected electron. What is less goes away."}}; + Configurable cutCanMinMuonNsigmaEl{"cutCanMinMuonNsigmaEl", 5.0, {"Good pi candidate hypo in. Upper n sigma cut on pi hypo of selected electron. What is more goes away."}}; + Configurable cutCanMaxMuonNsigmaEl{"cutCanMaxMuonNsigmaEl", -5.0, {"Good pi candidate hypo in. Lower n sigma cut on pi hypo of selected electron. What is less goes away."}}; + Configurable cutCanMupionHasTOF{"cutCanMupionHasTOF", true, {"Mupion candidate is required to hit TOF."}}; + } cutPreselect; + struct : ConfigurableGroup { Configurable usePIDwTOF{"usePIDwTOF", false, {"Determine whether also TOF should be used in testPIDhypothesis"}}; Configurable useScutTOFinTPC{"useScutTOFinTPC", true, {"Determine whether cut on TOF n sigma should be used after TPC-based decision in testPIDhypothesis"}}; @@ -252,6 +265,8 @@ struct UpcTauRl { ConfigurableAxis zzAxisFITamplitude{"zzAxisFITamplitude", {1000, 0., 1000.}, "FIT amplitude"}; AxisSpec zzAxisChannels{CH_ENUM_COUNTER, -0.5, +CH_ENUM_COUNTER - 0.5, "Channels (-)"}; + AxisSpec zzAxisSelections{40, -0.5, 39.5, "Selections (-)"}; + } confAxis; using FullUDTracks = soa::Join; @@ -632,6 +647,14 @@ struct UpcTauRl { histos.add("Tracks/Truth/hPionEta", ";Pion #eta (-);Number of events (-)", HistType::kTH1D, {confAxis.zzAxisEta}); } + // histos.add("ProcessDataDG/hSelections", ";Selection (-);Number of passed collision (-)", HistType::kTH1D, {confAxis.zzAxisSelections}); + // histos.add("ProcessDataSG/hSelections", ";Selection (-);Number of passed collision (-)", HistType::kTH1D, {confAxis.zzAxisSelections}); + // histos.add("ProcessMCrecDG/hSelections", ";Selection (-);Number of passed collision (-)", HistType::kTH1D, {confAxis.zzAxisSelections}); + // histos.add("ProcessMCrecSG/hSelections", ";Selection (-);Number of passed collision (-)", HistType::kTH1D, {confAxis.zzAxisSelections}); + // histos.add("ProcessMCgen/hSelections", ";Selection (-);Number of passed collision (-)", HistType::kTH1D, {confAxis.zzAxisSelections}); + // histos.add("OutputTable/hSelections", ";Selection (-);Number of passed collision (-)", HistType::kTH1D, {confAxis.zzAxisSelections}); + histos.add("OutputTable/hRejections", ";Rejections (-);Number of passed collision (-)", HistType::kTH1D, {confAxis.zzAxisSelections}); + } // end init // run (always called before process :( ) @@ -849,28 +872,85 @@ struct UpcTauRl { return true; } + unsigned int bitsRejection = 0; + unsigned int bitsRejectElCan = 0; + unsigned int bitsRejectMuPiCan = 0; + unsigned int bitsRejectTauEvent = 0; + + void outputGlobalRejectionHistogram() + { + + for (int i{0}; i < 10; i++) { + if (bitsRejection & (1 << i)) + histos.get(HIST("OutputTable/hRejections"))->Fill(i); + } + } + + void outputDetailedRejectionHistogram() + { + + for (int i{0}; i < 10; i++) { + if (bitsRejectTauEvent & (1 << i)) + histos.get(HIST("OutputTable/hRejections"))->Fill(i + 10); + } + + for (int i{0}; i < 10; i++) { + if (bitsRejectElCan & (1 << i)) + histos.get(HIST("OutputTable/hRejections"))->Fill(i + 20); + } + + for (int i{0}; i < 10; i++) { + if (bitsRejectMuPiCan & (1 << i)) + histos.get(HIST("OutputTable/hRejections"))->Fill(i + 30); + } + } + + template + void fillRejectElectronCandidate(T const& electronCandidate) + // Fill reasons of rejecting electron candidate + { + if (electronCandidate.tpcNSigmaEl() < cutPreselect.cutCanMaxElectronNsigmaEl || electronCandidate.tpcNSigmaEl() > cutPreselect.cutCanMinElectronNsigmaEl) + bitsRejectElCan |= (1 << 0); + if (cutPreselect.cutCanElectronHasTOF && !electronCandidate.hasTOF()) + bitsRejectElCan |= (1 << 1); + } + template bool isElectronCandidate(T const& electronCandidate) // Loose criterium to find electron-like particle // Requiring TOF to avoid double-counting pions/electrons and for better timing { - if (electronCandidate.tpcNSigmaEl() < -2.0 || electronCandidate.tpcNSigmaEl() > 4.0) + fillRejectElectronCandidate(electronCandidate); + if (electronCandidate.tpcNSigmaEl() < cutPreselect.cutCanMaxElectronNsigmaEl || electronCandidate.tpcNSigmaEl() > cutPreselect.cutCanMinElectronNsigmaEl) return false; - if (!electronCandidate.hasTOF()) + if (cutPreselect.cutCanElectronHasTOF && !electronCandidate.hasTOF()) return false; return true; } + template + bool fillRejectMuPionCandidate(T const& muPionCandidate) + // Fill reasons of rejecting mupion candidate + { + if (muPionCandidate.tpcNSigmaMu() < cutPreselect.cutCanMaxMuonNsigmaEl || muPionCandidate.tpcNSigmaMu() > cutPreselect.cutCanMinMuonNsigmaEl) + bitsRejectMuPiCan |= (1 << 0); + if (muPionCandidate.tpcNSigmaPi() < cutPreselect.cutCanMaxPionNsigmaEl || muPionCandidate.tpcNSigmaPi() > cutPreselect.cutCanMinPionNsigmaEl) + bitsRejectMuPiCan |= (1 << 1); + if (cutPreselect.cutCanMupionHasTOF && !muPionCandidate.hasTOF()) + bitsRejectMuPiCan |= (1 << 2); + return true; + } + template bool isMuPionCandidate(T const& muPionCandidate) // Loose criterium to find muon/pion-like particle // Requiring TOF for better timing { - if (muPionCandidate.tpcNSigmaMu() < -5.0 || muPionCandidate.tpcNSigmaMu() > 5.0) + if (muPionCandidate.tpcNSigmaMu() < cutPreselect.cutCanMaxMuonNsigmaEl || muPionCandidate.tpcNSigmaMu() > cutPreselect.cutCanMinMuonNsigmaEl) return false; - if (muPionCandidate.tpcNSigmaPi() < -5.0 || muPionCandidate.tpcNSigmaPi() > 5.0) + if (muPionCandidate.tpcNSigmaPi() < cutPreselect.cutCanMaxPionNsigmaEl || muPionCandidate.tpcNSigmaPi() > cutPreselect.cutCanMinPionNsigmaEl) return false; - if (!muPionCandidate.hasTOF()) + if (cutPreselect.cutCanMupionHasTOF && !muPionCandidate.hasTOF()) return false; return true; } @@ -1633,7 +1713,7 @@ struct UpcTauRl { } } if (trkDaug1.hasTPC() && trkDaug2.hasTPC()) { - if (!isMC && isElEl) { + if ((doprocessDataDG || doprocessDataSG) && isElEl) { if (daug[0].P() > daug[1].P()) { histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTPCsignalVsLP"))->Fill(daug[0].P(), trkDaug1.tpcSignal()); histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTPCsignalVsOP"))->Fill(daug[1].P(), trkDaug2.tpcSignal()); @@ -1662,7 +1742,7 @@ struct UpcTauRl { } } } - if (!isMC && isElMuPion) { + if ((doprocessDataSG || doprocessDataDG) && isElMuPion) { double electronPt = (cutTauEvent.useThresholdsPID ? isElectronCandidate(trkDaug1) : enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? daug[0].Pt() : daug[1].Pt(); double electronPID = (cutTauEvent.useThresholdsPID ? isElectronCandidate(trkDaug1) : enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? trkDaug1.tpcSignal() : trkDaug2.tpcSignal(); double electronNsigmaEl = (cutTauEvent.useThresholdsPID ? isElectronCandidate(trkDaug1) : enumMyParticle(trackPDG(trkDaug1, cutPID.cutSiTPC, cutPID.cutSiTOF, cutPID.usePIDwTOF, cutPID.useScutTOFinTPC)) == P_ELECTRON) ? trkDaug1.tpcNSigmaEl() : trkDaug2.tpcNSigmaEl(); @@ -1774,7 +1854,7 @@ struct UpcTauRl { daug[1].SetPxPyPzE(trkDaug2.px(), trkDaug2.py(), trkDaug2.pz(), energy(MassPionCharged, trkDaug2.px(), trkDaug2.py(), trkDaug2.pz())); } if (trkDaug1.hasTPC() && trkDaug2.hasTPC()) { - if (isMC && isElEl) { + if ((doprocessMCgen || doprocessMCrecSG || doprocessMCrecDG) && isElEl) { if (daug[0].P() > daug[1].P()) { histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTPCsignalVsLP"))->Fill(daug[0].P(), trkDaug1.tpcSignal()); histos.get(HIST("EventTwoTracks/TwoElectrons/PID/hTPCsignalVsOP"))->Fill(daug[1].P(), trkDaug2.tpcSignal()); @@ -1803,7 +1883,7 @@ struct UpcTauRl { } } } - if (isMC && isElMuPion) { + if ((doprocessMCgen || doprocessMCrecSG || doprocessMCrecDG) && isElMuPion) { int pid = 0; if (trkDaug1.has_udMcParticle()) { const auto& part = trkDaug1.udMcParticle(); @@ -2036,33 +2116,118 @@ struct UpcTauRl { int sign[2] = {trk1.sign(), trk2.sign()}; float dcaxy[2] = {trk1.dcaXY(), trk2.dcaXY()}; float dcaz[2] = {trk1.dcaZ(), trk2.dcaZ()}; + float trkTimeRes[2] = {trk1.trackTimeRes(), trk2.trackTimeRes()}; float tpcSignal[2] = {trk1.tpcSignal(), trk2.tpcSignal()}; float tpcEl[2] = {trk1.tpcNSigmaEl(), trk2.tpcNSigmaEl()}; float tpcMu[2] = {trk1.tpcNSigmaMu(), trk2.tpcNSigmaMu()}; float tpcPi[2] = {trk1.tpcNSigmaPi(), trk2.tpcNSigmaPi()}; float tpcKa[2] = {trk1.tpcNSigmaKa(), trk2.tpcNSigmaKa()}; float tpcPr[2] = {trk1.tpcNSigmaPr(), trk2.tpcNSigmaPr()}; + float tpcIP[2] = {trk1.tpcInnerParam(), trk2.tpcInnerParam()}; float tofSignal[2] = {trk1.tofSignal(), trk2.tofSignal()}; float tofEl[2] = {trk1.tofNSigmaEl(), trk2.tofNSigmaEl()}; float tofMu[2] = {trk1.tofNSigmaMu(), trk2.tofNSigmaMu()}; float tofPi[2] = {trk1.tofNSigmaPi(), trk2.tofNSigmaPi()}; float tofKa[2] = {trk1.tofNSigmaKa(), trk2.tofNSigmaKa()}; float tofPr[2] = {trk1.tofNSigmaPr(), trk2.tofNSigmaPr()}; + float tofEP[2] = {trk1.tofExpMom(), trk2.tofExpMom()}; tauTwoTracks(collision.runNumber(), collision.globalBC(), countTracksPerCollision, collision.numContrib(), countGoodNonPVtracks, collision.posX(), collision.posY(), collision.posZ(), collision.flags(), collision.occupancyInTime(), collision.hadronicRate(), collision.trs(), collision.trofs(), collision.hmpr(), collision.tfb(), collision.itsROFb(), collision.sbp(), collision.zVtxFT0vPV(), collision.vtxITSTPC(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFV0AmplitudeA(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), - px, py, pz, sign, dcaxy, dcaz, - tpcSignal, tpcEl, tpcMu, tpcPi, tpcKa, tpcPr, - tofSignal, tofEl, tofMu, tofPi, tofKa, tofPr); + px, py, pz, sign, dcaxy, dcaz, trkTimeRes, + tpcSignal, tpcEl, tpcMu, tpcPi, tpcKa, tpcPr, tpcIP, + tofSignal, tofEl, tofMu, tofPi, tofKa, tofPr, tofEP); + } else { + // Store info on what would rejected events + bitsRejectTauEvent |= (1 << 0); + + int countTrksPerCol = 0; + int countNonPVtracks = 0; + int countBadTracks = 0; + // Loop over tracks with selections + for (const auto& track : tracks) { + countTrksPerCol++; + if (!isGlobalTrackReinstatement(track)) { + countBadTracks++; + } + if (!track.isPVContributor()) { + countNonPVtracks++; + } + } // Loop over tracks with selections + if (countTrksPerCol - countBadTracks != 2) + bitsRejectTauEvent |= (1 << 1); + if (countTrksPerCol - countNonPVtracks != 2) + bitsRejectTauEvent |= (1 << 2); } } + template + void fillRejectionReasonDG(C const& collision) + { + if (!isGoodROFtime(collision)) + bitsRejection |= (1 << 1); + + if (!isGoodFITtime(collision, cutSample.cutFITtime)) + bitsRejection |= (1 << 2); + + if (cutSample.useNumContribs && (collision.numContrib() != cutSample.cutNumContribs)) + bitsRejection |= (1 << 3); + + if (cutSample.useRecoFlag && (collision.flags() != cutSample.cutRecoFlag)) + bitsRejection |= (1 << 4); + } + + template + void fillRejectionReasonSG(C const& collision) + { + int gapSide = collision.gapSide(); + + if (cutSample.useTrueGap) + gapSide = sgSelector.trueGap(collision, cutSample.cutTrueGapSideFV0, cutSample.cutTrueGapSideFT0A, cutSample.cutTrueGapSideFT0C, cutSample.cutTrueGapSideZDC); + + if (gapSide != cutSample.whichGapSide) + bitsRejection |= (1 << 0); + + if (!isGoodROFtime(collision)) + bitsRejection |= (1 << 1); + + if (!isGoodFITtime(collision, cutSample.cutFITtime)) + bitsRejection |= (1 << 2); + + if (cutSample.useNumContribs && (collision.numContrib() != cutSample.cutNumContribs)) + bitsRejection |= (1 << 3); + + if (cutSample.useRecoFlag && (collision.flags() != cutSample.cutRecoFlag)) + bitsRejection |= (1 << 4); + } + + template + void fillRejectionReasonMCSG(C const& collision) + { + if (collision.gapSide() != cutSample.whichGapSide) + bitsRejection |= (1 << 0); + + if (!isGoodROFtime(collision)) + bitsRejection |= (1 << 1); + + if (!isGoodFITtime(collision, cutSample.cutFITtime)) + bitsRejection |= (1 << 2); + + if (cutSample.useNumContribs && (collision.numContrib() != cutSample.cutNumContribs)) + bitsRejection |= (1 << 3); + + if (cutSample.useRecoFlag && (collision.flags() != cutSample.cutRecoFlag)) + bitsRejection |= (1 << 4); + } + void processDataDG(FullUDCollision const& reconstructedCollision, FullUDTracks const& reconstructedBarrelTracks) { + fillRejectionReasonDG(reconstructedCollision); + outputGlobalRejectionHistogram(); if (!isGoodROFtime(reconstructedCollision)) return; @@ -2087,11 +2252,15 @@ struct UpcTauRl { if (doOutputTauEvents) outputTauEventCandidates(reconstructedCollision, reconstructedBarrelTracks); + outputDetailedRejectionHistogram(); + } // end processDataDG void processDataSG(FullSGUDCollision const& reconstructedCollision, FullUDTracks const& reconstructedBarrelTracks) { + fillRejectionReasonSG(reconstructedCollision); + outputGlobalRejectionHistogram(); int gapSide = reconstructedCollision.gapSide(); int trueGapSide = sgSelector.trueGap(reconstructedCollision, cutSample.cutTrueGapSideFV0, cutSample.cutTrueGapSideFT0A, cutSample.cutTrueGapSideFT0C, cutSample.cutTrueGapSideZDC); @@ -2127,13 +2296,16 @@ struct UpcTauRl { if (doOutputTauEvents) outputTauEventCandidates(reconstructedCollision, reconstructedBarrelTracks); + outputDetailedRejectionHistogram(); + } // end processDataSG void processMCrecDG(FullMCUDCollision const& reconstructedCollision, FullMCUDTracks const& reconstructedBarrelTracks, aod::UDMcParticles const&) { - isMC = true; + fillRejectionReasonDG(reconstructedCollision); + outputGlobalRejectionHistogram(); if (!isGoodROFtime(reconstructedCollision)) return; @@ -2169,13 +2341,16 @@ struct UpcTauRl { if (doOutputTauEvents) outputTauEventCandidates(reconstructedCollision, reconstructedBarrelTracks); + outputDetailedRejectionHistogram(); + } // end processMCrecDG void processMCrecSG(FullMCSGUDCollision const& reconstructedCollision, FullMCUDTracks const& reconstructedBarrelTracks, aod::UDMcParticles const&) { - isMC = true; + fillRejectionReasonMCSG(reconstructedCollision); + outputGlobalRejectionHistogram(); int gapSide = reconstructedCollision.gapSide(); @@ -2217,12 +2392,13 @@ struct UpcTauRl { if (doOutputTauEvents) outputTauEventCandidates(reconstructedCollision, reconstructedBarrelTracks); + outputDetailedRejectionHistogram(); + } // end processMCrecDG void processMCgen(aod::UDMcCollision const& /*generatedCollision*/, aod::UDMcParticles const& particles) { - isMC = true; if (cutSample.applyAcceptanceSelection) { for (const auto& particle : particles) { From 23183d94fdc4878a1330756754195f3bc8c36a6a Mon Sep 17 00:00:00 2001 From: fuchuncui <162277233+fuchuncui@users.noreply.github.com> Date: Wed, 26 Mar 2025 05:46:40 +0800 Subject: [PATCH 0825/1650] [PWGCF] Add some QA histos and event selection cut (#10638) --- PWGCF/Flow/Tasks/flowEfficiencyCasc.cxx | 111 +++++++++++++++++++++++- PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx | 93 +++++++++++++------- 2 files changed, 170 insertions(+), 34 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowEfficiencyCasc.cxx b/PWGCF/Flow/Tasks/flowEfficiencyCasc.cxx index 134b017203a..25e23838586 100644 --- a/PWGCF/Flow/Tasks/flowEfficiencyCasc.cxx +++ b/PWGCF/Flow/Tasks/flowEfficiencyCasc.cxx @@ -43,6 +43,7 @@ struct FlowEfficiencyCasc { O2_DEFINE_CONFIGURABLE(cfgCutPtMax, float, 3.0f, "Maximal pT for tracks") O2_DEFINE_CONFIGURABLE(cfgCutEta, float, 0.8f, "Eta range for tracks") O2_DEFINE_CONFIGURABLE(cfgCutChi2prTPCcls, float, 2.5f, "max chi2 per TPC clusters") + O2_DEFINE_CONFIGURABLE(cfgCutOccupancyHigh, int, 500, "High cut on TPC occupancy") // topological cut for V0 O2_DEFINE_CONFIGURABLE(cfgv0_radius, float, 5.0f, "minimum decay radius") O2_DEFINE_CONFIGURABLE(cfgv0_v0cospa, float, 0.995f, "minimum cosine of pointing angle") @@ -97,7 +98,7 @@ struct FlowEfficiencyCasc { void init(InitContext const&) { - const AxisSpec axisCounter{1, 0, +1, ""}; + const AxisSpec axisCounter{2, 0, 2, ""}; // create histograms registry.add("eventCounter", "eventCounter", kTH1F, {axisCounter}); registry.add("mcEventCounter", "Monte Carlo Truth EventCounter", kTH1F, {axisCounter}); @@ -111,6 +112,79 @@ struct FlowEfficiencyCasc { registry.add("h3DRecLambda", "", {HistType::kTH3D, {cfgaxisPtV0, cfgaxisMultiplicity, axisLambdaMass}}); registry.add("h3DRecXi", "", {HistType::kTH3D, {cfgaxisPtXi, cfgaxisMultiplicity, axisXiMass}}); registry.add("h3DRecOmega", "", {HistType::kTH3D, {cfgaxisPtOmega, cfgaxisMultiplicity, axisOmegaMass}}); + + // V0 QA + registry.add("QAhisto/V0/hqaV0radiusbefore", "", {HistType::kTH1D, {{200, 0, 200}}}); + registry.add("QAhisto/V0/hqaV0radiusafter", "", {HistType::kTH1D, {{200, 0, 200}}}); + registry.add("QAhisto/V0/hqaV0cosPAbefore", "", {HistType::kTH1D, {{1000, 0.95, 1}}}); + registry.add("QAhisto/V0/hqaV0cosPAafter", "", {HistType::kTH1D, {{1000, 0.95, 1}}}); + registry.add("QAhisto/V0/hqadcaV0daubefore", "", {HistType::kTH1D, {{100, 0, 1}}}); + registry.add("QAhisto/V0/hqadcaV0dauafter", "", {HistType::kTH1D, {{100, 0, 1}}}); + registry.add("QAhisto/V0/hqaarm_podobefore", "", {HistType::kTH2D, {{100, -1, 1}, {50, 0, 0.3}}}); + registry.add("QAhisto/V0/hqaarm_podoafter", "", {HistType::kTH2D, {{100, -1, 1}, {50, 0, 0.3}}}); + registry.add("QAhisto/V0/hqadcapostoPVbefore", "", {HistType::kTH1D, {{1000, -10, 10}}}); + registry.add("QAhisto/V0/hqadcapostoPVafter", "", {HistType::kTH1D, {{1000, -10, 10}}}); + registry.add("QAhisto/V0/hqadcanegtoPVbefore", "", {HistType::kTH1D, {{1000, -10, 10}}}); + registry.add("QAhisto/V0/hqadcanegtoPVafter", "", {HistType::kTH1D, {{1000, -10, 10}}}); + // Cascade QA + registry.add("QAhisto/Casc/hqaCasccosPAbefore", "", {HistType::kTH1D, {{1000, 0.95, 1}}}); + registry.add("QAhisto/Casc/hqaCasccosPAafter", "", {HistType::kTH1D, {{1000, 0.95, 1}}}); + registry.add("QAhisto/Casc/hqaCascV0cosPAbefore", "", {HistType::kTH1D, {{1000, 0.95, 1}}}); + registry.add("QAhisto/Casc/hqaCascV0cosPAafter", "", {HistType::kTH1D, {{1000, 0.95, 1}}}); + registry.add("QAhisto/Casc/hqadcaCascV0toPVbefore", "", {HistType::kTH1D, {{1000, -10, 10}}}); + registry.add("QAhisto/Casc/hqadcaCascV0toPVafter", "", {HistType::kTH1D, {{1000, -10, 10}}}); + registry.add("QAhisto/Casc/hqadcaCascBachtoPVbefore", "", {HistType::kTH1D, {{1000, -10, 10}}}); + registry.add("QAhisto/Casc/hqadcaCascBachtoPVafter", "", {HistType::kTH1D, {{1000, -10, 10}}}); + registry.add("QAhisto/Casc/hqadcaCascdaubefore", "", {HistType::kTH1D, {{100, 0, 1}}}); + registry.add("QAhisto/Casc/hqadcaCascdauafter", "", {HistType::kTH1D, {{100, 0, 1}}}); + registry.add("QAhisto/Casc/hqadcaCascV0daubefore", "", {HistType::kTH1D, {{100, 0, 1}}}); + registry.add("QAhisto/Casc/hqadcaCascV0dauafter", "", {HistType::kTH1D, {{100, 0, 1}}}); + } + template + bool eventSelected(TCollision collision) + { + if (collision.alias_bit(kTVXinTRD)) { + // TRD triggered + return false; + } + if (!collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { + // reject collisions close to Time Frame borders + // https://its.cern.ch/jira/browse/O2-4623 + return false; + } + if (!collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { + // reject events affected by the ITS ROF border + // https://its.cern.ch/jira/browse/O2-4309 + return false; + } + if (!collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { + // rejects collisions which are associated with the same "found-by-T0" bunch crossing + // https://indico.cern.ch/event/1396220/#1-event-selection-with-its-rof + return false; + } + if (!collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { + // removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference + // use this cut at low multiplicities with caution + return false; + } + if (!collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + // no collisions in specified time range + return false; + } + if (!collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + // cut time intervals with dead ITS staves + return false; + } + + auto occupancy = collision.trackOccupancyInTimeRange(); + if (occupancy > cfgCutOccupancyHigh) + return false; + + // // V0A T0A 5 sigma cut + // if (std::fabs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > 5 * fT0AV0ASigma->Eval(collision.multFT0A())) + // return false; + + return true; } void processRec(MyCollisions::iterator const& collision, V0MCCandidates const& V0s, CascMCCandidates const& Cascades, DaughterTracks const&, soa::Join const&, soa::Join const&) @@ -118,6 +192,9 @@ struct FlowEfficiencyCasc { registry.fill(HIST("eventCounter"), 0.5); if (!collision.sel8()) return; + if (eventSelected(collision)) + return; + registry.fill(HIST("eventCounter"), 1.5); int rectracknum = collision.multNTracksGlobal(); registry.fill(HIST("h2DCentvsNch"), collision.centFT0C(), rectracknum); for (const auto& casc : Cascades) { @@ -127,6 +204,13 @@ struct FlowEfficiencyCasc { auto negdau = casc.negTrackExtra_as(); auto posdau = casc.posTrackExtra_as(); auto bachelor = casc.bachTrackExtra_as(); + // fill QA + registry.fill(HIST("QAhisto/Casc/hqaCasccosPAbefore"), casc.casccosPA(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqaCascV0cosPAbefore"), casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqadcaCascV0toPVbefore"), casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqadcaCascBachtoPVbefore"), casc.dcabachtopv()); + registry.fill(HIST("QAhisto/Casc/hqadcaCascdaubefore"), casc.dcacascdaughters()); + registry.fill(HIST("QAhisto/Casc/hqadcaCascV0daubefore"), casc.dcaV0daughters()); // track quality check if (bachelor.tpcNClsFound() < cfgtpcclusters) continue; @@ -157,13 +241,20 @@ struct FlowEfficiencyCasc { continue; if (std::fabs(casc.mLambda() - o2::constants::physics::MassLambda0) > cfgcasc_mlambdawindow) continue; + // fill QA + registry.fill(HIST("QAhisto/Casc/hqaCasccosPAafter"), casc.casccosPA(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqaCascV0cosPAafter"), casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqadcaCascV0toPVafter"), casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqadcaCascBachtoPVafter"), casc.dcabachtopv()); + registry.fill(HIST("QAhisto/Casc/hqadcaCascdauafter"), casc.dcacascdaughters()); + registry.fill(HIST("QAhisto/Casc/hqadcaCascV0dauafter"), casc.dcaV0daughters()); // Omega and antiOmega int pdgCode{cascMC.pdgCode()}; if (!cfgcheckMCParticle || (std::abs(pdgCode) == kOmegaMinus && std::abs(cascMC.pdgCodeV0()) == kLambda0 && std::abs(cascMC.pdgCodeBachelor()) == kKPlus)) { if (casc.sign() < 0 && (casc.mOmega() > 1.63) && (casc.mOmega() < 1.71) && std::fabs(casc.yOmega()) < cfgCasc_rapidity && (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { registry.fill(HIST("h3DRecOmega"), casc.pt(), rectracknum, casc.mOmega()); - } else if (casc.sign() < 0 && (casc.mOmega() > 1.63) && (casc.mOmega() < 1.71) && std::fabs(casc.yOmega()) < cfgCasc_rapidity && + } else if (casc.sign() > 0 && (casc.mOmega() > 1.63) && (casc.mOmega() < 1.71) && std::fabs(casc.yOmega()) < cfgCasc_rapidity && (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0]))) { registry.fill(HIST("h3DRecOmega"), casc.pt(), rectracknum, casc.mOmega()); } @@ -173,7 +264,7 @@ struct FlowEfficiencyCasc { if (casc.sign() < 0 && (casc.mXi() > 1.30) && (casc.mXi() < 1.37) && std::fabs(casc.yXi()) < cfgCasc_rapidity && (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { registry.fill(HIST("h3DRecXi"), casc.pt(), rectracknum, casc.mXi()); - } else if (casc.sign() < 0 && (casc.mXi() > 1.30) && (casc.mXi() < 1.37) && std::fabs(casc.yXi()) < cfgCasc_rapidity && + } else if (casc.sign() > 0 && (casc.mXi() > 1.30) && (casc.mXi() < 1.37) && std::fabs(casc.yXi()) < cfgCasc_rapidity && (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0]))) { registry.fill(HIST("h3DRecXi"), casc.pt(), rectracknum, casc.mXi()); } @@ -187,6 +278,13 @@ struct FlowEfficiencyCasc { auto v0negdau = v0.negTrackExtra_as(); auto v0posdau = v0.posTrackExtra_as(); + // fill QA before cut + registry.fill(HIST("QAhisto/V0/hqaV0radiusbefore"), v0.v0radius()); + registry.fill(HIST("QAhisto/V0/hqaV0cosPAbefore"), v0.v0cosPA()); + registry.fill(HIST("QAhisto/V0/hqadcaV0daubefore"), v0.dcaV0daughters()); + registry.fill(HIST("QAhisto/V0/hqadcapostoPVbefore"), v0.dcapostopv()); + registry.fill(HIST("QAhisto/V0/hqadcanegtoPVbefore"), v0.dcanegtopv()); + registry.fill(HIST("QAhisto/V0/hqaarm_podobefore"), v0.alpha(), v0.qtarm()); // track quality check if (v0posdau.tpcNClsFound() < cfgtpcclusters) continue; @@ -213,6 +311,12 @@ struct FlowEfficiencyCasc { continue; if (std::fabs(v0.dcanegtopv()) < cfgv0_dcadautopv) continue; + // fill QA after cut + registry.fill(HIST("QAhisto/V0/hqaV0radiusafter"), v0.v0radius()); + registry.fill(HIST("QAhisto/V0/hqaV0cosPAafter"), v0.v0cosPA()); + registry.fill(HIST("QAhisto/V0/hqadcaV0dauafter"), v0.dcaV0daughters()); + registry.fill(HIST("QAhisto/V0/hqadcapostoPVafter"), v0.dcapostopv()); + registry.fill(HIST("QAhisto/V0/hqadcanegtoPVafter"), v0.dcanegtopv()); int pdgCode{v0MC.pdgCode()}; // K0short @@ -220,6 +324,7 @@ struct FlowEfficiencyCasc { if (v0.qtarm() / std::fabs(v0.alpha()) > cfgv0_ArmPodocut && std::fabs(v0.y()) < 0.5 && std::fabs(v0.mK0Short() - o2::constants::physics::MassK0Short) < cfgv0_mk0swindow && (!cfgcheckDauTPC || (std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { registry.fill(HIST("h3DRecK0s"), v0.pt(), rectracknum, v0.mK0Short()); + registry.fill(HIST("QAhisto/V0/hqaarm_podoafter"), v0.alpha(), v0.qtarm()); } } // Lambda and antiLambda diff --git a/PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx b/PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx index 2620dab69bd..d331a661e40 100644 --- a/PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx +++ b/PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx @@ -187,9 +187,6 @@ struct FlowGfwOmegaXi { int nMultBins = 0; TAxis* fMultAxis = nullptr; - int nPhiBins = 60; - TAxis* fPhiAxis = new TAxis(nPhiBins, 0, constants::math::TwoPI); - TAxis* fOmegaMass = nullptr; TAxis* fXiMass = nullptr; @@ -211,6 +208,7 @@ struct FlowGfwOmegaXi { registry.add("hVtxZ", "", {HistType::kTH1D, {cfgaxisVertex}}); registry.add("hMult", "", {HistType::kTH1D, {{3000, 0.5, 3000.5}}}); registry.add("hCent", "", {HistType::kTH1D, {{90, 0, 90}}}); + registry.add("hCentvsNch", "", {HistType::kTH2D, {{90, 0, 90}, {3000, 0.5, 3000.5}}}); registry.add("hPt", "", {HistType::kTH1D, {cfgaxisPt}}); registry.add("hEtaPhiVtxzREF", "", {HistType::kTH3D, {cfgaxisPhi, cfgaxisEta, {20, -10, 10}}}); registry.add("hEtaPhiVtxzPOIXi", "", {HistType::kTH3D, {cfgaxisPhi, cfgaxisEta, {20, -10, 10}}}); @@ -228,18 +226,32 @@ struct FlowGfwOmegaXi { registry.get(HIST("hEventCount"))->GetYaxis()->SetBinLabel(4, "Omega"); // QA - registry.add("hqaV0radiusbefore", "", {HistType::kTH1D, {{200, 0, 200}}}); - registry.add("hqaV0radiusafter", "", {HistType::kTH1D, {{200, 0, 200}}}); - registry.add("hqaV0cosPAbefore", "", {HistType::kTH1D, {{1000, 0.95, 1}}}); - registry.add("hqaV0cosPAafter", "", {HistType::kTH1D, {{1000, 0.95, 1}}}); - registry.add("hqadcaV0daubefore", "", {HistType::kTH1D, {{100, 0, 1}}}); - registry.add("hqadcaV0dauafter", "", {HistType::kTH1D, {{100, 0, 1}}}); - registry.add("hqaarm_podobefore", "", {HistType::kTH2D, {{100, -1, 1}, {50, 0, 0.3}}}); - registry.add("hqaarm_podoafter", "", {HistType::kTH2D, {{100, -1, 1}, {50, 0, 0.3}}}); - registry.add("hqadcapostoPVbefore", "", {HistType::kTH1D, {{1000, -10, 10}}}); - registry.add("hqadcapostoPVafter", "", {HistType::kTH1D, {{1000, -10, 10}}}); - registry.add("hqadcanegtoPVbefore", "", {HistType::kTH1D, {{1000, -10, 10}}}); - registry.add("hqadcanegtoPVafter", "", {HistType::kTH1D, {{1000, -10, 10}}}); + // V0 QA + registry.add("QAhisto/V0/hqaV0radiusbefore", "", {HistType::kTH1D, {{200, 0, 200}}}); + registry.add("QAhisto/V0/hqaV0radiusafter", "", {HistType::kTH1D, {{200, 0, 200}}}); + registry.add("QAhisto/V0/hqaV0cosPAbefore", "", {HistType::kTH1D, {{1000, 0.95, 1}}}); + registry.add("QAhisto/V0/hqaV0cosPAafter", "", {HistType::kTH1D, {{1000, 0.95, 1}}}); + registry.add("QAhisto/V0/hqadcaV0daubefore", "", {HistType::kTH1D, {{100, 0, 1}}}); + registry.add("QAhisto/V0/hqadcaV0dauafter", "", {HistType::kTH1D, {{100, 0, 1}}}); + registry.add("QAhisto/V0/hqaarm_podobefore", "", {HistType::kTH2D, {{100, -1, 1}, {50, 0, 0.3}}}); + registry.add("QAhisto/V0/hqaarm_podoafter", "", {HistType::kTH2D, {{100, -1, 1}, {50, 0, 0.3}}}); + registry.add("QAhisto/V0/hqadcapostoPVbefore", "", {HistType::kTH1D, {{1000, -10, 10}}}); + registry.add("QAhisto/V0/hqadcapostoPVafter", "", {HistType::kTH1D, {{1000, -10, 10}}}); + registry.add("QAhisto/V0/hqadcanegtoPVbefore", "", {HistType::kTH1D, {{1000, -10, 10}}}); + registry.add("QAhisto/V0/hqadcanegtoPVafter", "", {HistType::kTH1D, {{1000, -10, 10}}}); + // Cascade QA + registry.add("QAhisto/Casc/hqaCasccosPAbefore", "", {HistType::kTH1D, {{1000, 0.95, 1}}}); + registry.add("QAhisto/Casc/hqaCasccosPAafter", "", {HistType::kTH1D, {{1000, 0.95, 1}}}); + registry.add("QAhisto/Casc/hqaCascV0cosPAbefore", "", {HistType::kTH1D, {{1000, 0.95, 1}}}); + registry.add("QAhisto/Casc/hqaCascV0cosPAafter", "", {HistType::kTH1D, {{1000, 0.95, 1}}}); + registry.add("QAhisto/Casc/hqadcaCascV0toPVbefore", "", {HistType::kTH1D, {{1000, -10, 10}}}); + registry.add("QAhisto/Casc/hqadcaCascV0toPVafter", "", {HistType::kTH1D, {{1000, -10, 10}}}); + registry.add("QAhisto/Casc/hqadcaCascBachtoPVbefore", "", {HistType::kTH1D, {{1000, -10, 10}}}); + registry.add("QAhisto/Casc/hqadcaCascBachtoPVafter", "", {HistType::kTH1D, {{1000, -10, 10}}}); + registry.add("QAhisto/Casc/hqadcaCascdaubefore", "", {HistType::kTH1D, {{100, 0, 1}}}); + registry.add("QAhisto/Casc/hqadcaCascdauafter", "", {HistType::kTH1D, {{100, 0, 1}}}); + registry.add("QAhisto/Casc/hqadcaCascV0daubefore", "", {HistType::kTH1D, {{100, 0, 1}}}); + registry.add("QAhisto/Casc/hqadcaCascV0dauafter", "", {HistType::kTH1D, {{100, 0, 1}}}); // cumulant of flow registry.add("c22", ";Centrality (%) ; C_{2}{2} ", {HistType::kTProfile, {axisMultiplicity}}); @@ -706,6 +718,8 @@ struct FlowGfwOmegaXi { if (cfgOutputNUAWeights) fWeightsREF->fill(track.phi(), track.eta(), vtxz, track.pt(), cent, 0); } + double nch = hLocalDensity->Integral() / 2; + registry.fill(HIST("hCentvsNch"), cent, nch); // fill GFW of V0 flow for (const auto& v0 : V0s) { auto v0posdau = v0.posTrack_as(); @@ -714,25 +728,25 @@ struct FlowGfwOmegaXi { bool isK0s = false; bool isLambda = false; // fill QA - registry.fill(HIST("hqaarm_podobefore"), v0.alpha(), v0.qtarm()); + registry.fill(HIST("QAhisto/V0/hqaarm_podobefore"), v0.alpha(), v0.qtarm()); // check daughter TPC and TOF // K0short - if (v0.qtarm() / std::fabs(v0.alpha()) > cfgv0_ArmPodocut && std::fabs(v0.y()) < 0.5 && std::fabs(v0.mK0Short() - o2::constants::physics::MassK0Short) < cfgv0_mk0swindow && + if (v0.qtarm() / std::fabs(v0.alpha()) > cfgv0_ArmPodocut && std::fabs(v0.mK0Short() - o2::constants::physics::MassK0Short) < cfgv0_mk0swindow && (!cfgcheckDauTPC || (std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0])) && (!cfgcheckDauTOF || ((std::fabs(v0posdau.tofNSigmaPi()) < cfgNSigma[3] || v0posdau.pt() < 0.4) && (std::fabs(v0negdau.tofNSigmaPi()) < cfgNSigma[3] || v0negdau.pt() < 0.4)))) { registry.fill(HIST("InvMassK0s_all"), v0.pt(), v0.mK0Short(), v0.eta(), cent); isK0s = true; candNumAll[0] = candNumAll[0] + 1; - registry.fill(HIST("hqaarm_podoafter"), v0.alpha(), v0.qtarm()); + registry.fill(HIST("QAhisto/V0/hqaarm_podoafter"), v0.alpha(), v0.qtarm()); } // Lambda and antiLambda - if (std::fabs(v0.y()) < 0.5 && std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < cfgv0_mlambdawindow && + if (std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < cfgv0_mlambdawindow && (!cfgcheckDauTPC || (std::fabs(v0posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0])) && (!cfgcheckDauTOF || ((std::fabs(v0posdau.tofNSigmaPr()) < cfgNSigma[4] || v0posdau.pt() < 0.4) && (std::fabs(v0negdau.tofNSigmaPi()) < cfgNSigma[3] || v0negdau.pt() < 0.4)))) { registry.fill(HIST("InvMassLambda_all"), v0.pt(), v0.mLambda(), v0.eta(), cent); isLambda = true; candNumAll[1] = candNumAll[1] + 1; - } else if (std::fabs(v0.y()) < 0.5 && std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < cfgv0_mlambdawindow && + } else if (std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < cfgv0_mlambdawindow && (!cfgcheckDauTPC || (std::fabs(v0negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0])) && (!cfgcheckDauTOF || ((std::fabs(v0negdau.tofNSigmaPr()) < cfgNSigma[4] || v0negdau.pt() < 0.4) && (std::fabs(v0posdau.tofNSigmaPi()) < cfgNSigma[3] || v0posdau.pt() < 0.4)))) { registry.fill(HIST("InvMassLambda_all"), v0.pt(), v0.mLambda(), v0.eta(), cent); @@ -740,12 +754,13 @@ struct FlowGfwOmegaXi { candNumAll[1] = candNumAll[1] + 1; } // fill QA before cut - registry.fill(HIST("hqaV0radiusbefore"), v0.v0radius()); - registry.fill(HIST("hqaV0cosPAbefore"), v0.v0cosPA()); - registry.fill(HIST("hqadcaV0daubefore"), v0.dcaV0daughters()); - registry.fill(HIST("hqadcapostoPVbefore"), v0.dcapostopv()); - registry.fill(HIST("hqadcanegtoPVbefore"), v0.dcanegtopv()); - + registry.fill(HIST("QAhisto/V0/hqaV0radiusbefore"), v0.v0radius()); + registry.fill(HIST("QAhisto/V0/hqaV0cosPAbefore"), v0.v0cosPA()); + registry.fill(HIST("QAhisto/V0/hqadcaV0daubefore"), v0.dcaV0daughters()); + registry.fill(HIST("QAhisto/V0/hqadcapostoPVbefore"), v0.dcapostopv()); + registry.fill(HIST("QAhisto/V0/hqadcanegtoPVbefore"), v0.dcanegtopv()); + if (!isK0s && !isLambda) + continue; // track quality check if (v0posdau.tpcNClsFound() < cfgtpcclusters) continue; @@ -773,11 +788,11 @@ struct FlowGfwOmegaXi { if (std::fabs(v0.dcanegtopv()) < cfgv0_dcadautopv) continue; // fill QA after cut - registry.fill(HIST("hqaV0radiusafter"), v0.v0radius()); - registry.fill(HIST("hqaV0cosPAafter"), v0.v0cosPA()); - registry.fill(HIST("hqadcaV0dauafter"), v0.dcaV0daughters()); - registry.fill(HIST("hqadcapostoPVafter"), v0.dcapostopv()); - registry.fill(HIST("hqadcanegtoPVafter"), v0.dcanegtopv()); + registry.fill(HIST("QAhisto/V0/hqaV0radiusafter"), v0.v0radius()); + registry.fill(HIST("QAhisto/V0/hqaV0cosPAafter"), v0.v0cosPA()); + registry.fill(HIST("QAhisto/V0/hqadcaV0dauafter"), v0.dcaV0daughters()); + registry.fill(HIST("QAhisto/V0/hqadcapostoPVafter"), v0.dcapostopv()); + registry.fill(HIST("QAhisto/V0/hqadcanegtoPVafter"), v0.dcanegtopv()); if (isK0s) { setCurrentParticleWeights(weff, wacc, v0, vtxz, 1); int phibin = -999; @@ -850,6 +865,15 @@ struct FlowGfwOmegaXi { isXi = true; candNumAll[2] = candNumAll[2] + 1; } + // fill QA + registry.fill(HIST("QAhisto/Casc/hqaCasccosPAbefore"), casc.casccosPA(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqaCascV0cosPAbefore"), casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqadcaCascV0toPVbefore"), casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqadcaCascBachtoPVbefore"), casc.dcabachtopv()); + registry.fill(HIST("QAhisto/Casc/hqadcaCascdaubefore"), casc.dcacascdaughters()); + registry.fill(HIST("QAhisto/Casc/hqadcaCascV0daubefore"), casc.dcaV0daughters()); + if (!isXi && !isOmega) + continue; // topological cut if (casc.cascradius() < cfgcasc_radius) continue; @@ -880,6 +904,13 @@ struct FlowGfwOmegaXi { continue; if (negdau.itsNCls() < cfgitsclusters) continue; + // fill QA + registry.fill(HIST("QAhisto/Casc/hqaCasccosPAafter"), casc.casccosPA(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqaCascV0cosPAafter"), casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqadcaCascV0toPVafter"), casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqadcaCascBachtoPVafter"), casc.dcabachtopv()); + registry.fill(HIST("QAhisto/Casc/hqadcaCascdauafter"), casc.dcacascdaughters()); + registry.fill(HIST("QAhisto/Casc/hqadcaCascV0dauafter"), casc.dcaV0daughters()); if (isOmega) { setCurrentParticleWeights(weff, wacc, casc, vtxz, 4); int phibin = -999; From 72abe8ba23eaf77d535c6c5c179a6db088fbdc7e Mon Sep 17 00:00:00 2001 From: jaelpark Date: Tue, 25 Mar 2025 23:12:49 +0100 Subject: [PATCH 0826/1650] [PWGCF] ML scores for invariant mass histogram (#10647) --- PWGCF/Tasks/correlations.cxx | 38 +++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/PWGCF/Tasks/correlations.cxx b/PWGCF/Tasks/correlations.cxx index c2dc06d5a13..f0ef51ff0d7 100644 --- a/PWGCF/Tasks/correlations.cxx +++ b/PWGCF/Tasks/correlations.cxx @@ -252,6 +252,14 @@ struct CorrelationTask { return grpo->getNominalL3Field(); } + template + bool passMLScore(const p2typeIterator& track) + { + auto it = std::lower_bound(cfgPtDepMLbkg->begin(), cfgPtDepMLbkg->end(), track.pt()); + int idx = std::distance(cfgPtDepMLbkg->begin(), it) - 1; + return !((track.decay() == 0 && track.mlProbD0()[0] > cfgPtCentDepMLbkgSel->at(idx)) || (track.decay() == 1 && track.mlProbD0bar()[0] > cfgPtCentDepMLbkgSel->at(idx))); + } + template void fillQA(const TCollision& /*collision*/, float multiplicity, const TTracks& tracks) { @@ -274,12 +282,20 @@ struct CorrelationTask { if constexpr (std::experimental::is_detected::value && std::experimental::is_detected::value) { if (cfgDecayParticleMask != 0 && (cfgDecayParticleMask & (1u << static_cast(track1.decay()))) == 0u) continue; + if constexpr (std::experimental::is_detected::value) { + if (!passMLScore(track1)) + continue; + } registry.fill(HIST("invMass"), track1.invMass(), track1.pt(), multiplicity); for (const auto& track2 : tracks2) { if constexpr (std::experimental::is_detected::value && std::experimental::is_detected::value) { if (doprocessSame2Prong2Prong || doprocessMixed2Prong2Prong || doprocessSame2Prong2ProngML || doprocessMixed2Prong2ProngML) { if (cfgDecayParticleMask != 0 && (cfgDecayParticleMask & (1u << static_cast(track1.decay()))) == 0u) continue; + if constexpr (std::experimental::is_detected::value) { + if (!passMLScore(track2)) + continue; + } if constexpr (std::experimental::is_detected::value) { if constexpr (std::experimental::is_detected::value) { @@ -412,15 +428,8 @@ struct CorrelationTask { } if constexpr (std::experimental::is_detected::value) { - if (doprocessSame2ProngDerivedML || doprocessSame2Prong2ProngML || doprocessMixed2ProngDerivedML || doprocessMixed2Prong2ProngML) { - auto it = std::lower_bound(cfgPtDepMLbkg->begin(), cfgPtDepMLbkg->end(), track1.pt()); - int idx = std::distance(cfgPtDepMLbkg->begin(), it) - 1; - if (track1.decay() == 0 && track1.mlProbD0()[0] > cfgPtCentDepMLbkgSel->at(idx)) { - continue; - } else if (track1.decay() == 1 && track1.mlProbD0bar()[0] > cfgPtCentDepMLbkgSel->at(idx)) { - continue; - } - } + if ((doprocessSame2ProngDerivedML || doprocessSame2Prong2ProngML || doprocessMixed2ProngDerivedML || doprocessMixed2Prong2ProngML) && !passMLScore(track1)) + continue; } // ML selection if (cfgMassAxis) { @@ -536,15 +545,8 @@ struct CorrelationTask { float deltaPhi = RecoDecay::constrainAngle(track1.phi() - track2.phi(), -o2::constants::math::PIHalf); if constexpr (std::experimental::is_detected::value) { - if (doprocessSame2ProngDerivedML || doprocessSame2Prong2ProngML || doprocessMixed2ProngDerivedML || doprocessMixed2Prong2ProngML) { - auto it = std::lower_bound(cfgPtDepMLbkg->begin(), cfgPtDepMLbkg->end(), track2.pt()); - int idx = std::distance(cfgPtDepMLbkg->begin(), it) - 1; - if (track2.decay() == 0 && track2.mlProbD0()[0] > cfgPtCentDepMLbkgSel->at(idx)) { - continue; - } else if (track2.decay() == 1 && track2.mlProbD0bar()[0] > cfgPtCentDepMLbkgSel->at(idx)) { - continue; - } - } + if ((doprocessSame2ProngDerivedML || doprocessSame2Prong2ProngML || doprocessMixed2ProngDerivedML || doprocessMixed2Prong2ProngML) && !passMLScore(track2)) + continue; } // ML selection // last param is the weight From 4f13a1901f95a0afa93ed7ea585d6a0f934c0823 Mon Sep 17 00:00:00 2001 From: arvindkhuntia <31609955+arvindkhuntia@users.noreply.github.com> Date: Tue, 25 Mar 2025 23:16:34 +0100 Subject: [PATCH 0827/1650] [PWGJE] Added histograms for MC study (#10627) Co-authored-by: Arvind Khuntia --- PWGJE/Tasks/nucleiInJets.cxx | 439 ++++++++++++++++++++++++++--------- 1 file changed, 330 insertions(+), 109 deletions(-) diff --git a/PWGJE/Tasks/nucleiInJets.cxx b/PWGJE/Tasks/nucleiInJets.cxx index 4c6edc5e3ad..e6d7c6f197f 100644 --- a/PWGJE/Tasks/nucleiInJets.cxx +++ b/PWGJE/Tasks/nucleiInJets.cxx @@ -11,6 +11,9 @@ // author: Arvind Khuntia (arvind.khuntia@cern.ch) INFN Bologna, Italy +#include +#include +#include #include #include #include @@ -126,15 +129,22 @@ struct nucleiInJets { Configurable cfgnTPCPIDHe{"cfgnTPCPIDHe", 3, "nTPC PID He"}; Configurable cfgnTPCPIDTr{"cfgnTPCPIDTr", 3, "nTPC PID Tr"}; + Configurable cfgnTPCPIDPrTOF{"cfgnTPCPIDPrTOF", 3, "nTPC PID Pr"}; + Configurable cfgnTPCPIDDeTOF{"cfgnTPCPIDDeTOF", 3, "nTPC PID De"}; + Configurable cfgnTPCPIDHeTOF{"cfgnTPCPIDHeTOF", 3, "nTPC PID He"}; + Configurable cfgnTPCPIDTrTOF{"cfgnTPCPIDTrTOF", 3, "nTPC PID Tr"}; + Configurable cEnableProtonQA{"cEnableProtonQA", true, "nTPC PID Pr"}; Configurable cEnableDeuteronQA{"cEnableDeuteronQA", true, "nTPC PID De"}; Configurable cEnableHeliumQA{"cEnableHeliumQA", true, "nTPC PID He"}; Configurable cEnableTritonQA{"cEnableTritonQA", true, "nTPC PID Tr"}; Configurable addTOFplots{"addTOFplots", true, "add TOF plots"}; Configurable useTPCpreSel{"useTPCpreSel", 3, "add TPC nsgma preselection for TOF: (0) no selection (!0) selction on TPC"}; + Configurable useLeadingJetDetLevelValue{"useLeadingJetDetLevelValue", false, "true: use det level value for leading jet, false: use part level value"}; + Configurable useDcaxyPtDepCut{"useDcaxyPtDepCut", true, "true: use pt dependent DCAxy cut, false: use constant DCAxy cut"}; + Configurable useTOFNsigmaPreSel{"useTOFNsigmaPreSel", true, "true: use TOF nsgma preselection, false: no TOF nsgma preselection"}; Configurable addpik{"addpik", true, "add pion and kaon hist"}; - ConfigurableAxis binsDCA{"binsDCA", {400, -1.f, 1.f}, ""}; ConfigurableAxis binsdEdx{"binsdEdx", {1000, 0.f, 1000.f}, ""}; ConfigurableAxis binsBeta{"binsBeta", {120, 0.0, 1.2}, ""}; @@ -186,8 +196,13 @@ struct nucleiInJets { void init(o2::framework::InitContext&) { + + if (doprocessJetTracksData && doprocessJetTracksDataLfPid) { + LOGP(fatal, "only one process function should be enabled!!!"); + } + const AxisSpec PtAxis = {100, 0, 10.0}; - const AxisSpec PtJetAxis = {300, 0, 30.0}; + const AxisSpec PtJetAxis = {100, 0, 100.0}; const AxisSpec MultAxis = {100, 0, 100}; const AxisSpec dRAxis = {100, 0, 3.6}; const AxisSpec dcaxyAxis{binsDCA, "DCAxy (cm)"}; @@ -513,20 +528,29 @@ struct nucleiInJets { ///////// jetHist.add("recmatched/hRecJetPt", "matched jet pT (Rec level);#it{p}_{T,jet part} (GeV/#it{c}); #it{p}_{T,jet part} - #it{p}_{T,jet det}", HistType::kTH1F, {{100, 0., 100.}}); jetHist.add("recmatched/hGenJetPt", "matched jet pT (Rec level);#it{p}_{T,jet part} (GeV/#it{c}); #it{p}_{T,jet part} - #it{p}_{T,jet det}", HistType::kTH1F, {{100, 0., 100.}}); - jetHist.add("recmatched/pt/PtParticleType", "Pt (p) vs jetflag vs particletype", HistType::kTH3D, {{100, 0.f, 10.f}, {2, 0, 2}, {14, -7, 7}}); + jetHist.add("eff/recmatched/pt/PtParticleType", "Pt (p) vs jetflag vs particletype", HistType::kTH3D, {{100, 0.f, 10.f}, {2, 0, 2}, {14, -7, 7}}); + jetHist.add("eff/recmatched/pt/PtParticleTypeTPC", "Pt (p) vs jetflag vs particletype", HistType::kTH3D, {{100, 0.f, 10.f}, {2, 0, 2}, {14, -7, 7}}); + jetHist.add("eff/recmatched/pt/PtParticleTypeTOF", "Pt (p) vs jetflag vs particletype", HistType::kTH3D, {{100, 0.f, 10.f}, {2, 0, 2}, {14, -7, 7}}); + jetHist.add("eff/recmatched/pt/PtParticleTypeTPCTOF", "Pt (p) vs jetflag vs particletype", HistType::kTH3D, {{100, 0.f, 10.f}, {2, 0, 2}, {14, -7, 7}}); + jetHist.add("eff/recmatched/perpCone/pt/PtParticleType", "Pt (p) vs particletype", HistType::kTH2D, {{100, 0.f, 10.f}, {14, -7, 7}}); + jetHist.add("eff/recmatched/perpCone/pt/PtParticleTypeTPC", "Pt (p) vs particletype", HistType::kTH2D, {{100, 0.f, 10.f}, {14, -7, 7}}); + jetHist.add("eff/recmatched/perpCone/pt/PtParticleTypeTOF", "Pt (p) vs particletype", HistType::kTH2D, {{100, 0.f, 10.f}, {14, -7, 7}}); + jetHist.add("eff/recmatched/perpCone/pt/PtParticleTypeTPCTOF", "Pt (p) vs particletype", HistType::kTH2D, {{100, 0.f, 10.f}, {14, -7, 7}}); + + jetHist.add("eff/recmatched/gen/pt/PtParticleType", "Pt (p) vs jetflag vs particletype", HistType::kTH3D, {{100, 0.f, 10.f}, {2, 0, 2}, {14, -7, 7}}); + jetHist.add("eff/recmatched/gen/perpCone/pt/PtParticleType", "Pt (p) vs particletype", HistType::kTH2D, {{100, 0.f, 10.f}, {14, -7, 7}}); // gen matched jetHist.add("genmatched/hRecMatchedJetPt", "matched jet pT (Rec level);#it{p}_{T,jet part} (GeV/#it{c}); #it{p}_{T,jet part} - #it{p}_{T,jet det}", HistType::kTH2F, {{100, 0., 100.}, {400, -20., 20.}}); jetHist.add("genmatched/hRecMatchedJetPhi", "matched jet #varphi (Rec level);#varphi_{T,jet part}; #varphi_{jet part}-#varphi_{jet det}", HistType::kTH2F, {{700, 0., 7.}, {200, -5., 5.}}); jetHist.add("genmatched/hRecMatchedJetEta", "matched jet #eta (Rec level);#eta_{T,jet part}; #eta_{jet part}-#eta_{jet det} ", HistType::kTH2F, {{200, -1., 1.}, {500, -2.5, 2.5}}); - - ///////// jetHist.add("genmatched/hRecJetPt", "matched jet pT (Rec level);#it{p}_{T,jet part} (GeV/#it{c}); #it{p}_{T,jet part} - #it{p}_{T,jet det}", HistType::kTH1F, {{100, 0., 100.}}); jetHist.add("genmatched/hGenJetPt", "matched jet pT (Rec level);#it{p}_{T,jet part} (GeV/#it{c}); #it{p}_{T,jet part} - #it{p}_{T,jet det}", HistType::kTH1F, {{100, 0., 100.}}); + jetHist.add("genmatched/leadingJet/hGenJetPt", "matched jet pT (Rec level);#it{p}_{T,jet part} (GeV/#it{c}); #it{p}_{T,jet part} - #it{p}_{T,jet det}", HistType::kTH1F, {{100, 0., 100.}}); jetHist.add("genmatched/hRecJetWithGenPt", "matched jet pT (Rec level);#it{p}_{T,jet part} (GeV/#it{c}); #it{p}_{T,jet part} - #it{p}_{T,jet det}", HistType::kTH1F, {{100, 0., 100.}}); jetHist.add("genmatched/hGenJetPtMatched", "matched jet pT (Rec level);#it{p}_{T,jet part} (GeV/#it{c}); #it{p}_{T,jet part} - #it{p}_{T,jet det}", HistType::kTH1F, {{100, 0., 100.}}); - + jetHist.add("genmatched/leadingJet/hGenJetPtMatched", "matched jet pT (Rec level);#it{p}_{T,jet part} (GeV/#it{c}); #it{p}_{T,jet part} - #it{p}_{T,jet det}", HistType::kTH1F, {{100, 0., 100.}}); jetHist.add("genmatched/pt/PtParticleType", "Pt (p) vs jetflag vs particletype", HistType::kTH3D, {{100, 0.f, 10.f}, {2, 0, 2}, {14, -7, 7}}); } } @@ -548,6 +572,11 @@ struct nucleiInJets { return PerpendicularConeAxisPhi; } + float dcaXYPtDepCut(float trackPt) + { + return 0.0105f + 0.0350f / pow(trackPt, 1.1f); + } + template bool isTrackSelected(const TrackType track) { @@ -556,7 +585,9 @@ struct nucleiInJets { return false; if (std::abs(track.eta()) > cfgtrkMaxEta) return false; - if (std::abs(track.dcaXY()) > cfgMaxDCArToPVcut) + if (std::abs(track.dcaXY()) > cfgMaxDCArToPVcut && !useDcaxyPtDepCut) + return false; + if (std::abs(track.dcaXY()) > dcaXYPtDepCut(track.pt()) && useDcaxyPtDepCut) return false; if (std::abs(track.dcaZ()) > cfgMaxDCAzToPVcut) return false; @@ -613,10 +644,8 @@ struct nucleiInJets { } } // tof - // float gamma =-999; float massTOF = -999; if (trk.hasTOF()) { - // gamma = 1.f / TMath::Sqrt(1.f - (trk.beta() * trk.beta())); massTOF = trk.p() * TMath::Sqrt(1.f / (trk.beta() * trk.beta()) - 1.f); } @@ -633,10 +662,22 @@ struct nucleiInJets { jetHist.fill(HIST("tracks/pion/h3PtVsPionNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaPi(), jetPt); jetHist.fill(HIST("tracks/kaon/h3PtVsKaonNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaKa(), jetPt); } - jetHist.fill(HIST("tracks/proton/h3PtVsProtonNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaPr(), jetPt); - jetHist.fill(HIST("tracks/deuteron/h3PtVsDeuteronNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaDe(), jetPt); - jetHist.fill(HIST("tracks/helium/h3PtVsHeliumNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaHe(), jetPt); - jetHist.fill(HIST("tracks/triton/h3PtVsTritonNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaTr(), jetPt); + + if (useTOFNsigmaPreSel && trk.hasTOF()) { + if (std::abs(trk.tofNSigmaPr()) < cfgnTPCPIDPrTOF) + jetHist.fill(HIST("tracks/proton/h3PtVsProtonNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaPr(), jetPt); + if (std::abs(trk.tofNSigmaDe()) < cfgnTPCPIDDeTOF) + jetHist.fill(HIST("tracks/deuteron/h3PtVsDeuteronNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaDe(), jetPt); + if (std::abs(trk.tofNSigmaHe()) < cfgnTPCPIDHeTOF) + jetHist.fill(HIST("tracks/helium/h3PtVsHeliumNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaHe(), jetPt); + if (std::abs(trk.tofNSigmaTr()) < cfgnTPCPIDTrTOF) + jetHist.fill(HIST("tracks/triton/h3PtVsTritonNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaTr(), jetPt); + } else if (!useTOFNsigmaPreSel) { + jetHist.fill(HIST("tracks/proton/h3PtVsProtonNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaPr(), jetPt); + jetHist.fill(HIST("tracks/deuteron/h3PtVsDeuteronNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaDe(), jetPt); + jetHist.fill(HIST("tracks/helium/h3PtVsHeliumNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaHe(), jetPt); + jetHist.fill(HIST("tracks/triton/h3PtVsTritonNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaTr(), jetPt); + } if (cEnableProtonQA && std::abs(trk.tpcNSigmaPr()) < cfgnTPCPIDPr) { jetHist.fill(HIST("tracks/proton/dca/after/hDCAxyVsPtProton_jet"), trk.dcaXY(), trk.pt()); @@ -659,16 +700,12 @@ struct nucleiInJets { if (!useTPCpreSel) { jetHist.fill(HIST("tracks/proton/h2TOFmassProtonVsPt_jet"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/proton/h2TOFmass2ProtonVsPt_jet"), massTOF * massTOF - gMassProton * gMassProton, trk.pt()); - jetHist.fill(HIST("tracks/deuteron/h2TOFmassDeuteronVsPt_jet"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/deuteron/h2TOFmass2DeuteronVsPt_jet"), massTOF * massTOF - gMassDeuteron * gMassDeuteron, trk.pt()); - jetHist.fill(HIST("tracks/triton/h2TOFmassTritonVsPt_jet"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/triton/h2TOFmass2TritonVsPt_jet"), massTOF * massTOF - gMassTriton * gMassTriton, trk.pt()); - jetHist.fill(HIST("tracks/helium/h2TOFmassHeliumVsPt_jet"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/helium/h2TOFmass2HeliumVsPt_jet"), massTOF * massTOF - gMassHelium * gMassHelium, trk.pt()); - jetHist.fill(HIST("tracks/proton/h2TofNsigmaProtonVsPt_jet"), trk.tofNSigmaPr(), trk.pt()); jetHist.fill(HIST("tracks/deuteron/h2TofNsigmaDeuteronVsPt_jet"), trk.tofNSigmaDe(), trk.pt()); jetHist.fill(HIST("tracks/helium/h2TofNsigmaHeliumVsPt_jet"), trk.tofNSigmaHe(), trk.pt()); @@ -689,12 +726,12 @@ struct nucleiInJets { if (trk.tpcNSigmaTr() < useTPCpreSel) { jetHist.fill(HIST("tracks/triton/h2TOFmassTritonVsPt_jet"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/triton/h2TOFmass2TritonVsPt_jet"), massTOF * massTOF - gMassTriton * gMassTriton, trk.pt()); - jetHist.fill(HIST("tracks/helium/h2TofNsigmaHeliumVsPt_jet"), trk.tofNSigmaHe(), trk.pt()); + jetHist.fill(HIST("tracks/triton/h2TofNsigmaTritonVsPt_jet"), trk.tofNSigmaTr(), trk.pt()); } if (trk.tpcNSigmaHe() < useTPCpreSel) { jetHist.fill(HIST("tracks/helium/h2TOFmassHeliumVsPt_jet"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/helium/h2TOFmass2HeliumVsPt_jet"), massTOF * massTOF - gMassHelium * gMassHelium, trk.pt()); - jetHist.fill(HIST("tracks/triton/h2TofNsigmaTritonVsPt_jet"), trk.tofNSigmaTr(), trk.pt()); + jetHist.fill(HIST("tracks/helium/h2TofNsigmaHeliumVsPt_jet"), trk.tofNSigmaHe(), trk.pt()); } } // nSigma @@ -710,10 +747,22 @@ struct nucleiInJets { jetHist.fill(HIST("tracks/antiPion/h3PtVsPionNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaPi(), jetPt); jetHist.fill(HIST("tracks/antiKaon/h3PtVsKaonNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaKa(), jetPt); } - jetHist.fill(HIST("tracks/antiProton/h3PtVsantiProtonNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaPr(), jetPt); - jetHist.fill(HIST("tracks/antiDeuteron/h3PtVsantiDeuteronNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaDe(), jetPt); - jetHist.fill(HIST("tracks/antiHelium/h3PtVsantiHeliumNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaHe(), jetPt); - jetHist.fill(HIST("tracks/antiTriton/h3PtVsantiTritonNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaTr(), jetPt); + + if (useTOFNsigmaPreSel && trk.hasTOF()) { + if (std::abs(trk.tofNSigmaPr()) < cfgnTPCPIDPrTOF) + jetHist.fill(HIST("tracks/antiProton/h3PtVsantiProtonNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaPr(), jetPt); + if (std::abs(trk.tofNSigmaDe()) < cfgnTPCPIDDeTOF) + jetHist.fill(HIST("tracks/antiDeuteron/h3PtVsantiDeuteronNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaDe(), jetPt); + if (std::abs(trk.tofNSigmaHe()) < cfgnTPCPIDHeTOF) + jetHist.fill(HIST("tracks/antiHelium/h3PtVsantiHeliumNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaHe(), jetPt); + if (std::abs(trk.tofNSigmaTr()) < cfgnTPCPIDTrTOF) + jetHist.fill(HIST("tracks/antiTriton/h3PtVsantiTritonNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaTr(), jetPt); + } else if (!useTOFNsigmaPreSel) { + jetHist.fill(HIST("tracks/antiProton/h3PtVsantiProtonNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaPr(), jetPt); + jetHist.fill(HIST("tracks/antiDeuteron/h3PtVsantiDeuteronNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaDe(), jetPt); + jetHist.fill(HIST("tracks/antiHelium/h3PtVsantiHeliumNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaHe(), jetPt); + jetHist.fill(HIST("tracks/antiTriton/h3PtVsantiTritonNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaTr(), jetPt); + } if (cEnableProtonQA && std::abs(trk.tpcNSigmaPr()) < cfgnTPCPIDPr) { jetHist.fill(HIST("tracks/antiProton/dca/after/hDCAxyVsPtantiProton_jet"), trk.dcaXY(), trk.pt()); @@ -771,7 +820,6 @@ struct nucleiInJets { jetHist.fill(HIST("tracks/antiHelium/h2TofNsigmaantiHeliumVsPt_jet"), trk.tofNSigmaHe(), trk.pt()); } } - if (addpik) { if (!useTPCpreSel) { jetHist.fill(HIST("tracks/antiPion/h2TofNsigmaantiPionVsPt_jet"), trk.tofNSigmaPi(), trk.pt()); @@ -805,10 +853,21 @@ struct nucleiInJets { jetHist.fill(HIST("tracks/triton/h3PtVsTritonNSigmaTPC"), trk.pt(), trk.tpcNSigmaTr()); // Tr // perpCone if (jetFlagPerpCone && isWithLeadingJet) { - jetHist.fill(HIST("tracks/perpCone/proton/h3PtVsProtonNSigmaTPCVsPtJet"), trk.pt(), trk.tpcNSigmaPr(), jetPt); // Pr - jetHist.fill(HIST("tracks/perpCone/deuteron/h3PtVsDeuteronNSigmaTPCVsPtJet"), trk.pt(), trk.tpcNSigmaDe(), jetPt); // De - jetHist.fill(HIST("tracks/perpCone/helium/h3PtVsHeliumNSigmaTPCVsPtJet"), trk.pt(), trk.tpcNSigmaHe(), jetPt); // He - jetHist.fill(HIST("tracks/perpCone/triton/h3PtVsTritonNSigmaTPCVsPtJet"), trk.pt(), trk.tpcNSigmaTr(), jetPt); // Tr + if (useTOFNsigmaPreSel && trk.hasTOF()) { + if (std::abs(trk.tofNSigmaPr()) < cfgnTPCPIDPrTOF) + jetHist.fill(HIST("tracks/perpCone/proton/h3PtVsProtonNSigmaTPCVsPtJet"), trk.pt(), trk.tpcNSigmaPr(), jetPt); // Pr + if (std::abs(trk.tofNSigmaDe()) < cfgnTPCPIDDeTOF) + jetHist.fill(HIST("tracks/perpCone/deuteron/h3PtVsDeuteronNSigmaTPCVsPtJet"), trk.pt(), trk.tpcNSigmaDe(), jetPt); // De + if (std::abs(trk.tofNSigmaHe()) < cfgnTPCPIDHeTOF) + jetHist.fill(HIST("tracks/perpCone/helium/h3PtVsHeliumNSigmaTPCVsPtJet"), trk.pt(), trk.tpcNSigmaHe(), jetPt); // He + if (std::abs(trk.tofNSigmaTr()) < cfgnTPCPIDTrTOF) + jetHist.fill(HIST("tracks/perpCone/triton/h3PtVsTritonNSigmaTPCVsPtJet"), trk.pt(), trk.tpcNSigmaTr(), jetPt); // Tr + } else if (!useTOFNsigmaPreSel) { + jetHist.fill(HIST("tracks/perpCone/proton/h3PtVsProtonNSigmaTPCVsPtJet"), trk.pt(), trk.tpcNSigmaPr(), jetPt); // Pr + jetHist.fill(HIST("tracks/perpCone/deuteron/h3PtVsDeuteronNSigmaTPCVsPtJet"), trk.pt(), trk.tpcNSigmaDe(), jetPt); // De + jetHist.fill(HIST("tracks/perpCone/helium/h3PtVsHeliumNSigmaTPCVsPtJet"), trk.pt(), trk.tpcNSigmaHe(), jetPt); // He + jetHist.fill(HIST("tracks/perpCone/triton/h3PtVsTritonNSigmaTPCVsPtJet"), trk.pt(), trk.tpcNSigmaTr(), jetPt); // Tr + } } if (cEnableProtonQA && std::abs(trk.tpcNSigmaPr()) < cfgnTPCPIDPr) { @@ -874,7 +933,6 @@ struct nucleiInJets { jetHist.fill(HIST("tracks/perpCone/helium/h2TofNsigmaHeliumVsPt"), trk.tofNSigmaHe(), trk.pt()); } } - } // tof info } else { jetHist.fill(HIST("tracks/antiProton/h3PtVsantiProtonNSigmaTPC"), trk.pt(), trk.tpcNSigmaPr()); // Pr @@ -885,10 +943,21 @@ struct nucleiInJets { // perpCone if (jetFlagPerpCone && isWithLeadingJet) { // antiparticle info - jetHist.fill(HIST("tracks/perpCone/antiProton/h3PtVsantiProtonNSigmaTPCVsPtJet"), trk.pt(), trk.tpcNSigmaPr(), jetPt); // Pr - jetHist.fill(HIST("tracks/perpCone/antiDeuteron/h3PtVsantiDeuteronNSigmaTPCVsPtJet"), trk.pt(), trk.tpcNSigmaDe(), jetPt); // De - jetHist.fill(HIST("tracks/perpCone/antiHelium/h3PtVsantiHeliumNSigmaTPCVsPtJet"), trk.pt(), trk.tpcNSigmaHe(), jetPt); // He - jetHist.fill(HIST("tracks/perpCone/antiTriton/h3PtVsantiTritonNSigmaTPCVsPtJet"), trk.pt(), trk.tpcNSigmaTr(), jetPt); // Tr + if (useTOFNsigmaPreSel && trk.hasTOF()) { + if (std::abs(trk.tofNSigmaPr()) < cfgnTPCPIDPrTOF) + jetHist.fill(HIST("tracks/perpCone/antiProton/h3PtVsantiProtonNSigmaTPCVsPtJet"), trk.pt(), trk.tpcNSigmaPr(), jetPt); // Pr + if (std::abs(trk.tofNSigmaDe()) < cfgnTPCPIDDeTOF) + jetHist.fill(HIST("tracks/perpCone/antiDeuteron/h3PtVsantiDeuteronNSigmaTPCVsPtJet"), trk.pt(), trk.tpcNSigmaDe(), jetPt); // De + if (std::abs(trk.tofNSigmaHe()) < cfgnTPCPIDHeTOF) + jetHist.fill(HIST("tracks/perpCone/antiHelium/h3PtVsantiHeliumNSigmaTPCVsPtJet"), trk.pt(), trk.tpcNSigmaHe(), jetPt); // He + if (std::abs(trk.tofNSigmaTr()) < cfgnTPCPIDTrTOF) + jetHist.fill(HIST("tracks/perpCone/antiTriton/h3PtVsantiTritonNSigmaTPCVsPtJet"), trk.pt(), trk.tpcNSigmaTr(), jetPt); // Tr + } else if (!useTOFNsigmaPreSel) { + jetHist.fill(HIST("tracks/perpCone/antiProton/h3PtVsantiProtonNSigmaTPCVsPtJet"), trk.pt(), trk.tpcNSigmaPr(), jetPt); // Pr + jetHist.fill(HIST("tracks/perpCone/antiDeuteron/h3PtVsantiDeuteronNSigmaTPCVsPtJet"), trk.pt(), trk.tpcNSigmaDe(), jetPt); // De + jetHist.fill(HIST("tracks/perpCone/antiHelium/h3PtVsantiHeliumNSigmaTPCVsPtJet"), trk.pt(), trk.tpcNSigmaHe(), jetPt); // He + jetHist.fill(HIST("tracks/perpCone/antiTriton/h3PtVsantiTritonNSigmaTPCVsPtJet"), trk.pt(), trk.tpcNSigmaTr(), jetPt); // Tr + } } if (cEnableProtonQA && std::abs(trk.tpcNSigmaPr()) < cfgnTPCPIDPr) { @@ -907,7 +976,6 @@ struct nucleiInJets { jetHist.fill(HIST("tracks/antiHelium/dca/after/hDCAxyVsPtantiHelium"), trk.dcaXY(), trk.pt()); jetHist.fill(HIST("tracks/antiHelium/dca/after/hDCAzVsPtantiHelium"), trk.dcaZ(), trk.pt()); } - if (addTOFplots && trk.hasTOF()) { if (!useTPCpreSel) { jetHist.fill(HIST("tracks/antiProton/h2TOFmassantiProtonVsPt"), massTOF, trk.pt()); @@ -957,18 +1025,16 @@ struct nucleiInJets { } } } - } //////////////////////////////////////// // outside jet end //////////////////////////////////////// } - void processJetTracksData(soa::Join::iterator const& collision, chargedJetstrack const& chargedjets, soa::Join const& tracks, TrackCandidates const&, - TrackCandidatesLfPid const&, aod::JBCs const&) + void processJetTracksData(soa::Join::iterator const& collision, + chargedJetstrack const& chargedjets, soa::Join const& tracks, TrackCandidates const&, aod::JBCs const&) { auto bc = collision.bc_as(); initCCDB(bc); - if (applySkim) { jetHist.fill(HIST("hNEvents"), 0.5); bool zorroSelected = zorro.isSelected(bc.globalBC()); @@ -977,15 +1043,12 @@ struct nucleiInJets { } jetHist.fill(HIST("hNEvents"), 1.5); } - if (fabs(collision.posZ()) > 10) return; - jetHist.fill(HIST("hNEvents"), 2.5); if (!jetderiveddatautilities::selectCollision(collision, jetderiveddatautilities::initialiseEventSelectionBits("sel8"))) return; jetHist.fill(HIST("hNEvents"), 3.5); - int nJets = 0; std::vector leadingJetWithPtEtaPhi(3); float leadingJetPt = -1.0f; @@ -1001,30 +1064,70 @@ struct nucleiInJets { } nJets++; } - jetHist.fill(HIST("jet/nJetsPerEvent"), nJets); jetHist.fill(HIST("vertexZ"), collision.posZ()); - if (nJets > 0) { jetHist.fill(HIST("jet/vertexZ"), collision.posZ()); jetHist.fill(HIST("hNEvents"), 4.5); } else { jetHist.fill(HIST("jetOut/vertexZ"), collision.posZ()); } - if (isWithJetEvents && nJets == 0) return; - jetHist.fill(HIST("jet/h1JetEvents"), 0.5); - for (auto& track : tracks) { - if (useLfTpcPid) { - auto trk = track.track_as(); - fillTrackInfo(trk, chargedjets, leadingJetWithPtEtaPhi); - } else { - auto trk = track.track_as(); - fillTrackInfo(trk, chargedjets, leadingJetWithPtEtaPhi); + auto trk = track.track_as(); + fillTrackInfo(trk, chargedjets, leadingJetWithPtEtaPhi); + } + } + + void processJetTracksDataLfPid(soa::Join::iterator const& collision, + chargedJetstrack const& chargedjets, soa::Join const& tracks, TrackCandidatesLfPid const&, aod::JBCs const&) + { + auto bc = collision.bc_as(); + initCCDB(bc); + if (applySkim) { + jetHist.fill(HIST("hNEvents"), 0.5); + bool zorroSelected = zorro.isSelected(bc.globalBC()); + if (!zorroSelected) { + return; + } + jetHist.fill(HIST("hNEvents"), 1.5); + } + if (fabs(collision.posZ()) > 10) + return; + jetHist.fill(HIST("hNEvents"), 2.5); + if (!jetderiveddatautilities::selectCollision(collision, jetderiveddatautilities::initialiseEventSelectionBits("sel8"))) + return; + jetHist.fill(HIST("hNEvents"), 3.5); + int nJets = 0; + std::vector leadingJetWithPtEtaPhi(3); + float leadingJetPt = -1.0f; + for (const auto& chargedjet : chargedjets) { + jetHist.fill(HIST("jet/h1JetPt"), chargedjet.pt()); + jetHist.fill(HIST("jet/h1JetEta"), chargedjet.eta()); + jetHist.fill(HIST("jet/h1JetPhi"), chargedjet.phi()); + if (chargedjet.pt() > leadingJetPt) { + leadingJetWithPtEtaPhi[0] = chargedjet.pt(); + leadingJetWithPtEtaPhi[1] = chargedjet.eta(); + leadingJetWithPtEtaPhi[2] = chargedjet.phi(); } + nJets++; + } + jetHist.fill(HIST("jet/nJetsPerEvent"), nJets); + jetHist.fill(HIST("vertexZ"), collision.posZ()); + if (nJets > 0) { + jetHist.fill(HIST("jet/vertexZ"), collision.posZ()); + jetHist.fill(HIST("hNEvents"), 4.5); + } else { + jetHist.fill(HIST("jetOut/vertexZ"), collision.posZ()); + } + if (isWithJetEvents && nJets == 0) + return; + jetHist.fill(HIST("jet/h1JetEvents"), 0.5); + for (auto& track : tracks) { + auto trk = track.track_as(); + fillTrackInfo(trk, chargedjets, leadingJetWithPtEtaPhi); } } @@ -1049,7 +1152,6 @@ struct nucleiInJets { } if (!INELgt0) // not true INEL return; - jetHist.fill(HIST("mcpJet/eventStat"), 3.5); int nJets = 0; @@ -1062,7 +1164,6 @@ struct nucleiInJets { jetHist.fill(HIST("mcpJet/nJetsPerEvent"), nJets); for (const auto& mcParticle : mcParticles) { - if (!mcParticle.isPhysicalPrimary()) continue; if (fabs(mcParticle.eta()) > cfgtrkMaxEta) @@ -1084,7 +1185,6 @@ struct nucleiInJets { if (mapPDGToValue(mcParticle.pdgCode()) != 0) { jetHist.fill(HIST("mcpJet/pt/PtParticleType"), mcParticle.pt(), jetFlag, mapPDGToValue(mcParticle.pdgCode())); } - } // track } // process mc @@ -1092,12 +1192,9 @@ struct nucleiInJets { soa::Filtered const& mcdjets, TrackCandidatesMC const&, aod::JetParticles const&) { jetHist.fill(HIST("mcdJet/eventStat"), 0.5); - // JEhistos.fill(HIST("nEvents_MCRec"), 0.5); - if (!jetderiveddatautilities::selectCollision(collisionJet, jetderiveddatautilities::initialiseEventSelectionBits("sel8"))) return; // bool jetFlag = kFALSE; - jetHist.fill(HIST("mcdJet/eventStat"), 1.5); if (fabs(collisionJet.posZ()) > 10) @@ -1128,13 +1225,10 @@ struct nucleiInJets { } nJets++; } - jetHist.fill(HIST("mcdJet/vertexZ"), collisionJet.posZ()); jetHist.fill(HIST("mcdJet/nJetsPerEvent"), nJets); - if (isWithJetEvents && nJets == 0) return; - for (auto& track : tracks) { auto fullTrack = track.track_as(); if (!isTrackSelected(fullTrack)) @@ -1146,7 +1240,6 @@ struct nucleiInJets { continue; if (!mcTrack.isPhysicalPrimary()) continue; - bool jetFlag = false; bool jetFlagPerpCone = false; // float jetPt = -999.; @@ -1174,19 +1267,18 @@ struct nucleiInJets { break; } // jet } - if (mapPDGToValue(mcTrack.pdgCode()) != 0) { jetHist.fill(HIST("mcdJet/pt/PtParticleType"), mcTrack.pt(), jetFlag, mapPDGToValue(mcTrack.pdgCode())); if (jetFlagPerpCone) jetHist.fill(HIST("mcdJet/pt/perpCone/PtParticleType"), mcTrack.pt(), mapPDGToValue(mcTrack.pdgCode())); } - } // tracks } - void processRecMatched(aod::JetCollision const& collision, JetMCDetTable const& mcdjets, + Preslice> perMCCol = aod::jmcparticle::mcCollisionId; + void processRecMatched(aod::JetCollisionMCD const& collision, JetMCDetTable const& mcdjets, soa::Join const& tracks, - JetMCPartTable const&, TrackCandidatesMC const&, aod::JetParticles const&) + JetMCPartTable const&, TrackCandidatesMC const&, aod::JetParticles const& particleTracks, aod::JMcCollisions const&) { if (fabs(collision.posZ()) > 10) return; @@ -1211,13 +1303,21 @@ struct nucleiInJets { std::vector mcpJetPhi{}; std::vector mcpJetEta{}; - for (auto& mcdjet : mcdjets) { + if (mcdjets.size() == 0) + return; + // LOG(info) <<" size(mcd) "< leadingJetWithPtEtaPhi(3); + for (auto& mcdjet : mcdjets) { if (!mcdjet.has_matchedJetGeo()) continue; + // LOG(info)<<" jet pT "<()) { if (!mcpjet.has_matchedJetGeo()) continue; + // LOG(info)<<" jet pT(part.) "<(); if (fabs(completeTrack.eta()) > cfgtrkMaxEta) @@ -1247,52 +1364,132 @@ struct nucleiInJets { if (!track.has_mcParticle()) continue; auto mcTrack = track.mcParticle_as(); - // add pid later + if (!mcTrack.isPhysicalPrimary()) + continue; + if (fabs(mcTrack.y()) > cfgtrkMaxRap) + continue; + + bool isTpcPassed(true); + bool isTof(completeTrack.hasTOF()); + bool isTOFAndTPCPreSel(completeTrack.hasTOF() && + (completeTrack.tpcNSigmaPr() < cfgnTPCPIDPrTOF || completeTrack.tpcNSigmaDe() < cfgnTPCPIDDeTOF || completeTrack.tpcNSigmaHe() < cfgnTPCPIDHeTOF || completeTrack.tpcNSigmaTr() < cfgnTPCPIDTrTOF)); bool jetFlag = false; - for (std::size_t iDJet = 0; iDJet < mcdJetPt.size(); iDJet++) { - double delPhi = TVector2::Phi_mpi_pi(mcdJetPhi[iDJet] - track.phi()); - double delEta = mcdJetEta[iDJet] - track.eta(); + bool jetFlagPerpCone = false; + if (isWithLeadingJet) { + double delPhi = TVector2::Phi_mpi_pi(leadingJetWithPtEtaPhi[2] - track.phi()); + double delEta = leadingJetWithPtEtaPhi[1] - track.eta(); double R = TMath::Sqrt((delEta * delEta) + (delPhi * delPhi)); - - if (R < cfgjetR) { + if (R < cfgjetR) jetFlag = true; - break; + std::array perpConePhiJet = getPerpendicuarPhi(leadingJetWithPtEtaPhi[2]); + double delPhiPerpCone1 = TVector2::Phi_mpi_pi(perpConePhiJet[0] - track.phi()); + double delPhiPerpCone2 = TVector2::Phi_mpi_pi(perpConePhiJet[1] - track.phi()); + double RPerpCone1 = TMath::Sqrt((delEta * delEta) + (delPhiPerpCone1 * delPhiPerpCone1)); + double RPerpCone2 = TMath::Sqrt((delEta * delEta) + (delPhiPerpCone2 * delPhiPerpCone2)); + if (RPerpCone1 < cfgjetR || RPerpCone2 < cfgjetR) + jetFlagPerpCone = true; + } else { + + for (std::size_t iDJet = 0; iDJet < mcdJetPt.size(); iDJet++) { + double delPhi = TVector2::Phi_mpi_pi(mcdJetPhi[iDJet] - track.phi()); + double delEta = mcdJetEta[iDJet] - track.eta(); + double R = TMath::Sqrt((delEta * delEta) + (delPhi * delPhi)); + + if (R < cfgjetR) { + jetFlag = true; + break; + } } - } + } // jet if (mapPDGToValue(mcTrack.pdgCode()) != 0) { - jetHist.fill(HIST("recmatched/pt/PtParticleType"), mcTrack.pt(), jetFlag, mapPDGToValue(mcTrack.pdgCode())); + jetHist.fill(HIST("eff/recmatched/pt/PtParticleType"), mcTrack.pt(), jetFlag, mapPDGToValue(mcTrack.pdgCode())); + if (isTpcPassed) + jetHist.fill(HIST("eff/recmatched/pt/PtParticleTypeTPC"), mcTrack.pt(), jetFlag, mapPDGToValue(mcTrack.pdgCode())); + if (isTof) + jetHist.fill(HIST("eff/recmatched/pt/PtParticleTypeTOF"), mcTrack.pt(), jetFlag, mapPDGToValue(mcTrack.pdgCode())); + if (isTOFAndTPCPreSel) + jetHist.fill(HIST("eff/recmatched/pt/PtParticleTypeTPCTOF"), mcTrack.pt(), jetFlag, mapPDGToValue(mcTrack.pdgCode())); + + if (jetFlagPerpCone) { + jetHist.fill(HIST("eff/recmatched/perpCone/pt/PtParticleType"), mcTrack.pt(), mapPDGToValue(mcTrack.pdgCode())); + if (isTpcPassed) + jetHist.fill(HIST("eff/recmatched/perpCone/pt/PtParticleTypeTPC"), mcTrack.pt(), mapPDGToValue(mcTrack.pdgCode())); + if (isTof) + jetHist.fill(HIST("eff/recmatched/perpCone/pt/PtParticleTypeTOF"), mcTrack.pt(), mapPDGToValue(mcTrack.pdgCode())); + if (isTOFAndTPCPreSel) + jetHist.fill(HIST("eff/recmatched/perpCone/pt/PtParticleTypeTPCTOF"), mcTrack.pt(), mapPDGToValue(mcTrack.pdgCode())); + } } } // tracks + + auto mcParticles_per_coll = particleTracks.sliceBy(perMCCol, collision.mcCollision().globalIndex()); + for (const auto& mcParticle : mcParticles_per_coll) { + if (!mcParticle.isPhysicalPrimary()) + continue; + if (fabs(mcParticle.eta()) > cfgtrkMaxEta) + continue; + if (fabs(mcParticle.y()) > cfgtrkMaxRap) + continue; + bool jetFlagMC = false; + bool jetFlagPerpConeMC = false; + if (isWithLeadingJet) { + double delPhi = TVector2::Phi_mpi_pi(leadingJetWithPtEtaPhi[2] - mcParticle.phi()); + double delEta = leadingJetWithPtEtaPhi[1] - mcParticle.eta(); + double R = TMath::Sqrt((delEta * delEta) + (delPhi * delPhi)); + if (R < cfgjetR) + jetFlagMC = true; + std::array perpConePhiJet = getPerpendicuarPhi(leadingJetWithPtEtaPhi[2]); + double delPhiPerpCone1 = TVector2::Phi_mpi_pi(perpConePhiJet[0] - mcParticle.phi()); + double delPhiPerpCone2 = TVector2::Phi_mpi_pi(perpConePhiJet[1] - mcParticle.phi()); + double RPerpCone1 = TMath::Sqrt((delEta * delEta) + (delPhiPerpCone1 * delPhiPerpCone1)); + double RPerpCone2 = TMath::Sqrt((delEta * delEta) + (delPhiPerpCone2 * delPhiPerpCone2)); + if (RPerpCone1 < cfgjetR || RPerpCone2 < cfgjetR) + jetFlagPerpConeMC = true; + } else { + + for (std::size_t iDJet = 0; iDJet < mcdJetPt.size(); iDJet++) { + double delPhi = TVector2::Phi_mpi_pi(mcdJetPhi[iDJet] - mcParticle.phi()); + double delEta = mcdJetEta[iDJet] - mcParticle.eta(); + double R = TMath::Sqrt((delEta * delEta) + (delPhi * delPhi)); + if (R < cfgjetR) { + jetFlagMC = true; + break; + } + } + } // jet + + if (mapPDGToValue(mcParticle.pdgCode()) != 0) { + jetHist.fill(HIST("eff/recmatched/gen/pt/PtParticleType"), mcParticle.pt(), jetFlagMC, mapPDGToValue(mcParticle.pdgCode())); + if (jetFlagPerpConeMC) { + jetHist.fill(HIST("eff/recmatched/gen/perpCone/pt/PtParticleType"), mcParticle.pt(), mapPDGToValue(mcParticle.pdgCode())); + } + } + + } // mcParticle } // process int nprocessSimJEEvents = 0; void processGenMatched(aod::JetMcCollision const& collision, - /*soa::SmallGroups> const& recocolls,*/ + soa::SmallGroups> const& recocolls, JetMCDetTable const&, JetMCPartTable const& mcpjets, aod::JetParticles const& mcParticles) { - if (cDebugLevel > 0) { nprocessSimJEEvents++; if ((nprocessSimJEEvents + 1) % 100000 == 0) LOG(debug) << "Jet Events: " << nprocessSimJEEvents; } - if (fabs(collision.posZ()) > 10) + if (recocolls.size() <= 0) // not reconstructed return; - jetHist.fill(HIST("genmatched/vertexZ"), collision.posZ()); - - bool INELgt0 = false; - for (const auto& mcParticle : mcParticles) { - if (fabs(mcParticle.eta()) < cfgtrkMaxEta) { - INELgt0 = true; - break; - } + for (const auto& recocoll : recocolls) { // return if not reconstructed event based on our selection + if (!jetderiveddatautilities::selectCollision(recocoll, jetderiveddatautilities::initialiseEventSelectionBits("sel8"))) + return; } - if (!INELgt0) + if (fabs(collision.posZ()) > 10) return; - + jetHist.fill(HIST("genmatched/vertexZ"), collision.posZ()); std::vector mcdJetPt{}; std::vector mcdJetPhi{}; std::vector mcdJetEta{}; @@ -1300,29 +1497,52 @@ struct nucleiInJets { std::vector mcpJetPhi{}; std::vector mcpJetEta{}; - for (auto& mcpjet : mcpjets) { + // Find the mcpjet with the highest pt + auto itLeadPtJet = mcpjets.begin(); + float maxPt = -1.0f; + + for (auto it = mcpjets.begin(); it != mcpjets.end(); ++it) { + if (it.pt() > maxPt) { + maxPt = it.pt(); + itLeadPtJet = it; + LOG(debug) << " mcp jet pT " << it.pt() << " " << __LINE__; + } + } + // Process all MCP jets for general histograms + for (const auto& mcpjet : mcpjets) { jetHist.fill(HIST("genmatched/hGenJetPt"), mcpjet.pt()); if (!mcpjet.has_matchedJetGeo()) continue; jetHist.fill(HIST("genmatched/hGenJetPtMatched"), mcpjet.pt()); - for (auto& mcdjet : mcpjet.template matchedJetGeo_as()) { - if (!mcdjet.has_matchedJetGeo()) - continue; - mcdJetPt.push_back(mcdjet.pt()); - mcdJetPhi.push_back(mcdjet.phi()); - mcdJetEta.push_back(mcdjet.eta()); - mcpJetPt.push_back(mcpjet.pt()); - mcpJetPhi.push_back(mcpjet.phi()); - mcpJetEta.push_back(mcpjet.eta()); - - jetHist.fill(HIST("genmatched/hRecJetPt"), mcpjet.pt()); - jetHist.fill(HIST("genmatched/hRecJetWithGenPt"), mcdjet.pt()); - jetHist.fill(HIST("genmatched/hRecMatchedJetPt"), mcpjet.pt(), mcpjet.pt() - mcdjet.pt()); - jetHist.fill(HIST("genmatched/hRecMatchedJetPhi"), mcpjet.phi(), mcpjet.phi() - mcdjet.phi()); - jetHist.fill(HIST("genmatched/hRecMatchedJetEta"), mcpjet.eta(), mcpjet.eta() - mcdjet.eta()); + } - } // mcdJet - } // mcpJet + // Process ONLY the leading jet's matched detector jets (if valid) + if (itLeadPtJet != mcpjets.end()) { + const auto& leadingMCPJet = *itLeadPtJet; + jetHist.fill(HIST("genmatched/leadingJet/hGenJetPt"), leadingMCPJet.pt()); + if (leadingMCPJet.has_matchedJetGeo()) { + jetHist.fill(HIST("genmatched/leadingJet/hGenJetPtMatched"), leadingMCPJet.pt()); + for (auto& mcdjet : leadingMCPJet.template matchedJetGeo_as()) { + // Assuming matchedJetGeo_as returns valid MCD jets; no redundant has check needed + // Store jet properties + mcdJetPt.push_back(mcdjet.pt()); + mcdJetPhi.push_back(mcdjet.phi()); + mcdJetEta.push_back(mcdjet.eta()); + mcpJetPt.push_back(leadingMCPJet.pt()); + mcpJetPhi.push_back(leadingMCPJet.phi()); + mcpJetEta.push_back(leadingMCPJet.eta()); + + // Fill histograms with MCD (reco) and MCP (gen) properties + jetHist.fill(HIST("genmatched/hRecJetPt"), mcdjet.pt()); + jetHist.fill(HIST("genmatched/hRecJetWithGenPt"), leadingMCPJet.pt()); + + // Resolution plots: Gen - Reco + jetHist.fill(HIST("genmatched/hRecMatchedJetPt"), leadingMCPJet.pt(), leadingMCPJet.pt() - mcdjet.pt()); + jetHist.fill(HIST("genmatched/hRecMatchedJetPhi"), leadingMCPJet.phi(), leadingMCPJet.phi() - mcdjet.phi()); + jetHist.fill(HIST("genmatched/hRecMatchedJetEta"), leadingMCPJet.eta(), leadingMCPJet.eta() - mcdjet.eta()); + } // End loop over mcdjet + } + } // leading jet only for (const auto& mcParticle : mcParticles) { if (fabs(mcParticle.eta()) > cfgtrkMaxEta) @@ -1348,6 +1568,7 @@ struct nucleiInJets { } // process PROCESS_SWITCH(nucleiInJets, processJetTracksData, "nuclei in Jets data", true); + PROCESS_SWITCH(nucleiInJets, processJetTracksDataLfPid, "nuclei in Jets data", false); PROCESS_SWITCH(nucleiInJets, processMCRec, "nuclei in Jets for detectorlevel Jets", false); PROCESS_SWITCH(nucleiInJets, processMCGen, "nuclei in Jets MC particlelevel Jets", false); PROCESS_SWITCH(nucleiInJets, processRecMatched, "nuclei in Jets rec matched", false); From da1a018e7cf21ea99a4d3a01c39f666969fb4012 Mon Sep 17 00:00:00 2001 From: Paola Vargas Torres <88360333+PaolaVT@users.noreply.github.com> Date: Tue, 25 Mar 2025 18:03:09 -0600 Subject: [PATCH 0828/1650] [PWGLF] Standard track cuts were included (#10649) --- PWGMM/UE/Tasks/dedxAnalysis.cxx | 206 +++++++++++++++++++++++++------- 1 file changed, 163 insertions(+), 43 deletions(-) diff --git a/PWGMM/UE/Tasks/dedxAnalysis.cxx b/PWGMM/UE/Tasks/dedxAnalysis.cxx index 8194ce386bc..5bf47f2021b 100644 --- a/PWGMM/UE/Tasks/dedxAnalysis.cxx +++ b/PWGMM/UE/Tasks/dedxAnalysis.cxx @@ -28,14 +28,15 @@ #include "Framework/runDataProcessing.h" #include "PWGLF/DataModel/LFStrangenessTables.h" #include "ReconstructionDataFormats/Track.h" +#include "Common/Core/TrackSelectionDefaults.h" using namespace o2; using namespace o2::framework; using namespace constants::physics; using PIDTracks = soa::Join< - aod::Tracks, aod::TracksExtra, aod::TrackSelectionExtension, - aod::pidTOFFullPi, aod::pidTOFFullPr, aod::pidTOFFullEl>; + aod::Tracks, aod::TracksExtra, aod::TrackSelectionExtension, aod::TracksDCA, aod::TrackSelection, + aod::pidTOFFullPi, aod::pidTOFFullPr, aod::pidTOFFullEl, aod::pidTOFbeta>; using SelectedCollisions = soa::Join; @@ -50,16 +51,19 @@ struct DedxAnalysis { true}; // Configurable Parameters + // Tracks cuts Configurable minTPCnClsFound{"minTPCnClsFound", 70.0f, "min number of found TPC clusters"}; Configurable minNCrossedRowsTPC{"minNCrossedRowsTPC", 70.0f, "min number of found TPC crossed rows"}; - Configurable minNClsTPCdEdx{"minNClsTPCdEdx", 50.0f, "min number of TPC clusters for PID"}; Configurable maxChi2TPC{"maxChi2TPC", 4.0f, "max chi2 per cluster TPC"}; Configurable maxChi2ITS{"maxChi2ITS", 36.0f, "max chi2 per cluster ITS"}; Configurable etaMin{"etaMin", -0.8f, "etaMin"}; Configurable etaMax{"etaMax", +0.8f, "etaMax"}; + Configurable minNCrossedRowsOverFindableClustersTPC{"minNCrossedRowsOverFindableClustersTPC", 0.8f, "Additional cut on the minimum value of the ratio between crossed rows and findable clusters in the TPC"}; + Configurable maxDCAz{"maxDCAz", 2.f, "maxDCAz"}; + // v0 cuts Configurable v0cospaMin{"v0cospaMin", 0.998f, "Minimum V0 CosPA"}; Configurable minimumV0Radius{"minimumV0Radius", 0.5f, "Minimum V0 Radius"}; @@ -78,49 +82,115 @@ struct DedxAnalysis { "Minimum Mass Gamma"}; Configurable maxMassGamma{"maxMassGamma", 0.002022f, "Maximum Mass Gamma"}; - Configurable minReqClusterITS{"minReqClusterITS", 4.0f, "min number of clusters required in ITS"}; - Configurable maxDCAxy{"maxDCAxy", 0.1f, "maxDCAxy"}; - Configurable maxDCAz{"maxDCAz", 0.1f, "maxDCAz"}; - Configurable eventSelection{"eventSelection", true, "event selection"}; Configurable calibrationMode{"calibrationMode", false, "calibration mode"}; // Histograms names static constexpr std::string_view kDedxvsMomentumPos[4] = {"dEdx_vs_Momentum_all_Pos", "dEdx_vs_Momentum_Pi_v0_Pos", "dEdx_vs_Momentum_Pr_v0_Pos", "dEdx_vs_Momentum_El_v0_Pos"}; static constexpr std::string_view kDedxvsMomentumNeg[4] = {"dEdx_vs_Momentum_all_Neg", "dEdx_vs_Momentum_Pi_v0_Neg", "dEdx_vs_Momentum_Pr_v0_Neg", "dEdx_vs_Momentum_El_v0_Neg"}; static constexpr double EtaCut[9] = {-0.8, -0.6, -0.4, -0.2, 0.0, 0.2, 0.4, 0.6, 0.8}; - Configurable> calibrationFactor{"calibrationFactor", {50.8263, 51.0122, 50.7456, 50.0372, 49.699, 50.2222, 50.7263, 50.8073}, "calibration factors"}; + Configurable> calibrationFactorNeg{"calibrationFactorNeg", {50.4011, 50.4764, 50.186, 49.2955, 48.8222, 49.4273, 49.9292, 50.0556}, "negative calibration factors"}; + Configurable> calibrationFactorPos{"calibrationFactorPos", {50.5157, 50.6359, 50.3198, 49.3345, 48.9197, 49.4931, 50.0188, 50.1406}, "positive calibration factors"}; ConfigurableAxis binP{"binP", {VARIABLE_WIDTH, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 18.0, 20.0}, ""}; + TrackSelection myTrackSelection() + { + TrackSelection selectedTracks; + selectedTracks.SetPtRange(0.1f, 1e10f); + selectedTracks.SetEtaRange(etaMin, etaMax); + selectedTracks.SetRequireITSRefit(true); + selectedTracks.SetRequireTPCRefit(true); + selectedTracks.SetMinNCrossedRowsTPC(minNCrossedRowsTPC); + selectedTracks.SetMinNCrossedRowsOverFindableClustersTPC(minNCrossedRowsOverFindableClustersTPC); + selectedTracks.SetMaxChi2PerClusterTPC(maxChi2TPC); + selectedTracks.SetRequireHitsInITSLayers(1, {0, 1}); + selectedTracks.SetMaxChi2PerClusterITS(maxChi2ITS); + selectedTracks.SetMaxDcaXYPtDep([](float pt) { return 0.0105f + 0.0350f / std::pow(pt, 1.1f); }); + selectedTracks.SetMaxDcaZ(maxDCAz); + + return selectedTracks; + } + + TrackSelection mySelectionPrim; + void init(InitContext const&) { + AxisSpec dedxAxis{100, 0.0, 100.0, "dE/dx MIP (a. u.)"}; + AxisSpec etaAxis{8, -0.8, 0.8, "#eta"}; + AxisSpec pAxis = {binP, "#it{p}/Z (GeV/c)"}; if (calibrationMode) { // MIP for pions registryDeDx.add( - "hdEdxMIP_vs_eta", "dE/dx", HistType::kTH2F, - {{8, -0.8, 0.8, "#eta"}, {100, 0.0, 100.0, "dE/dx MIP (a. u.)"}}); + "hdEdx_vs_eta_Neg_Pi", "dE/dx", HistType::kTH2F, + {{etaAxis}, {dedxAxis}}); + registryDeDx.add( + "hdEdx_vs_eta_Pos_Pi", "dE/dx", HistType::kTH2F, + {{etaAxis}, {dedxAxis}}); + // MIP for electrons + registryDeDx.add( + "hdEdx_vs_eta_vs_p_Neg_El", "dE/dx", HistType::kTH3F, + {{etaAxis}, {dedxAxis}, {pAxis}}); + registryDeDx.add( + "hdEdx_vs_eta_vs_p_Pos_El", "dE/dx", HistType::kTH3F, + {{etaAxis}, {dedxAxis}, {pAxis}}); + // Pions from TOF registryDeDx.add( - "hdEdxMIP_vs_phi", "dE/dx", HistType::kTH2F, - {{100, 0.0, 6.4, "#phi"}, {100, 0.0, 100.0, "dE/dx MIP (a. u.)"}}); + "hdEdx_vs_eta_vs_p_Neg_TOF", "dE/dx", HistType::kTH3F, + {{etaAxis}, {dedxAxis}, {pAxis}}); + registryDeDx.add( + "hdEdx_vs_eta_vs_p_Pos_TOF", "dE/dx", HistType::kTH3F, + {{etaAxis}, {dedxAxis}, {pAxis}}); } else { - AxisSpec pAxis = {binP, "#it{p}/Z (GeV/c)"}; + // MIP for pions + registryDeDx.add( + "hdEdx_vs_eta_Neg_calibrated_Pi", "dE/dx", HistType::kTH2F, + {{etaAxis}, {dedxAxis}}); registryDeDx.add( - "hdEdxMIP_vs_eta_calibrated", "dE/dx", HistType::kTH2F, - {{8, -0.8, 0.8, "#eta"}, {100, 0.0, 100.0, "dE/dx MIP (a. u.)"}}); + "hdEdx_vs_eta_Pos_calibrated_Pi", "dE/dx", HistType::kTH2F, + {{etaAxis}, {dedxAxis}}); + + // MIP for electrons registryDeDx.add( - "hdEdxMIP_vs_phi", "dE/dx", HistType::kTH2F, - {{100, 0.0, 6.4, "#phi"}, {100, 0.0, 100.0, "dE/dx MIP (a. u.)"}}); + "hdEdx_vs_eta_vs_p_Neg_calibrated_El", "dE/dx", HistType::kTH3F, + {{etaAxis}, {dedxAxis}, {pAxis}}); + + registryDeDx.add( + "hdEdx_vs_eta_vs_p_Pos_calibrated_El", "dE/dx", HistType::kTH3F, + {{etaAxis}, {dedxAxis}, {pAxis}}); + + // Pions from TOF + registryDeDx.add( + "hdEdx_vs_eta_vs_p_Neg_calibrated_TOF", "dE/dx", HistType::kTH3F, + {{etaAxis}, {dedxAxis}, {pAxis}}); + + registryDeDx.add( + "hdEdx_vs_eta_vs_p_Pos_calibrated_TOF", "dE/dx", HistType::kTH3F, + {{etaAxis}, {dedxAxis}, {pAxis}}); // De/Dx for ch and v0 particles for (int i = 0; i < 4; ++i) { registryDeDx.add(kDedxvsMomentumPos[i].data(), "dE/dx", HistType::kTH3F, - {{pAxis}, {100, 0.0, 100.0, "dE/dx (a. u.)"}, {8, -0.8, 0.8, "#eta"}}); + {{pAxis}, {dedxAxis}, {etaAxis}}); registryDeDx.add(kDedxvsMomentumNeg[i].data(), "dE/dx", HistType::kTH3F, - {{pAxis}, {100, 0.0, 100.0, "dE/dx (a. u.)"}, {8, -0.8, 0.8, "#eta"}}); + {{pAxis}, {dedxAxis}, {etaAxis}}); } } + + registryDeDx.add( + "hdEdx_vs_phi", "dE/dx", HistType::kTH2F, + {{100, 0.0, 6.4, "#phi"}, {dedxAxis}}); + + registryDeDx.add( + "hbeta_vs_p_Neg", "beta", HistType::kTH2F, + {{pAxis}, {100, 0.0, 1.1, "#beta"}}); + + registryDeDx.add( + "hbeta_vs_p_Pos", "beta", HistType::kTH2F, + {{pAxis}, {100, 0.0, 1.1, "#beta"}}); // Event Counter registryDeDx.add("histRecVtxZData", "collision z position", HistType::kTH1F, {{100, -20.0, +20.0, "z_{vtx} (cm)"}}); + + mySelectionPrim = myTrackSelection(); } // Single-Track Selection @@ -302,34 +372,92 @@ struct DedxAnalysis { // Kaons for (const auto& trk : tracks) { + // track Selection if (!passedSingleTrackSelection(trk, collision)) continue; - if (!trk.passedTPCRefit()) + + if (!mySelectionPrim.IsSelected(trk)) continue; + float signedP = trk.sign() * trk.tpcInnerParam(); - // MIP for pions + // MIP calibration for pions if (trk.tpcInnerParam() >= 0.35 && trk.tpcInnerParam() <= 0.45) { if (calibrationMode) { - registryDeDx.fill(HIST("hdEdxMIP_vs_eta"), trk.eta(), trk.tpcSignal()); - registryDeDx.fill(HIST("hdEdxMIP_vs_phi"), trk.phi(), trk.tpcSignal()); + if (signedP < 0) { + registryDeDx.fill(HIST("hdEdx_vs_eta_Neg_Pi"), trk.eta(), trk.tpcSignal()); + } else { + registryDeDx.fill(HIST("hdEdx_vs_eta_Pos_Pi"), trk.eta(), trk.tpcSignal()); + } + + } else { + for (int i = 0; i < 8; ++i) { + if (trk.eta() > EtaCut[i] && trk.eta() < EtaCut[i + 1]) { + if (signedP < 0) { + registryDeDx.fill(HIST("hdEdx_vs_eta_Neg_calibrated_Pi"), trk.eta(), trk.tpcSignal() * 50 / calibrationFactorNeg->at(i)); + } else { + registryDeDx.fill(HIST("hdEdx_vs_eta_Pos_calibrated_Pi"), trk.eta(), trk.tpcSignal() * 50 / calibrationFactorPos->at(i)); + } + } + } + } + } + // Beta from TOF + if (signedP < 0) { + registryDeDx.fill(HIST("hbeta_vs_p_Neg"), std::abs(signedP), trk.beta()); + } else { + registryDeDx.fill(HIST("hbeta_vs_p_Pos"), signedP, trk.beta()); + } + // Electrons from TOF + if (std::abs(trk.beta() - 1) < 0.1) { // beta cut + if (calibrationMode) { + if (signedP < 0) { + registryDeDx.fill(HIST("hdEdx_vs_eta_vs_p_Neg_El"), trk.eta(), trk.tpcSignal(), std::abs(signedP)); + } else { + registryDeDx.fill(HIST("hdEdx_vs_eta_vs_p_Pos_El"), trk.eta(), trk.tpcSignal(), signedP); + } } else { - registryDeDx.fill(HIST("hdEdxMIP_vs_phi"), trk.phi(), trk.tpcSignal()); for (int i = 0; i < 8; ++i) { if (trk.eta() > EtaCut[i] && trk.eta() < EtaCut[i + 1]) { - registryDeDx.fill(HIST("hdEdxMIP_vs_eta_calibrated"), trk.eta(), trk.tpcSignal() * 50 / calibrationFactor->at(i)); + if (signedP < 0) { + registryDeDx.fill(HIST("hdEdx_vs_eta_vs_p_Neg_calibrated_El"), trk.eta(), trk.tpcSignal() * 50 / calibrationFactorNeg->at(i), std::abs(signedP)); + } else { + registryDeDx.fill(HIST("hdEdx_vs_eta_vs_p_Pos_calibrated_El"), trk.eta(), trk.tpcSignal() * 50 / calibrationFactorPos->at(i), signedP); + } + } + } + } + } + // pions from TOF + if (trk.beta() > 1. && trk.beta() < 1.05) { // beta cut + if (calibrationMode) { + if (signedP < 0) { + registryDeDx.fill(HIST("hdEdx_vs_eta_vs_p_Neg_TOF"), trk.eta(), trk.tpcSignal(), std::abs(signedP)); + } else { + registryDeDx.fill(HIST("hdEdx_vs_eta_vs_p_Pos_TOF"), trk.eta(), trk.tpcSignal(), signedP); + } + } else { + for (int i = 0; i < 8; ++i) { + if (trk.eta() > EtaCut[i] && trk.eta() < EtaCut[i + 1]) { + if (signedP < 0) { + registryDeDx.fill(HIST("hdEdx_vs_eta_vs_p_Neg_calibrated_TOF"), trk.eta(), trk.tpcSignal() * 50 / calibrationFactorNeg->at(i), std::abs(signedP)); + } else { + registryDeDx.fill(HIST("hdEdx_vs_eta_vs_p_Pos_calibrated_TOF"), trk.eta(), trk.tpcSignal() * 50 / calibrationFactorPos->at(i), signedP); + } } } } } + registryDeDx.fill(HIST("hdEdx_vs_phi"), trk.phi(), trk.tpcSignal()); + if (!calibrationMode) { for (int i = 0; i < 8; ++i) { if (trk.eta() > EtaCut[i] && trk.eta() < EtaCut[i + 1]) { if (signedP > 0) { - registryDeDx.fill(HIST(kDedxvsMomentumPos[0]), signedP, trk.tpcSignal() * 50 / calibrationFactor->at(i), trk.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumPos[0]), signedP, trk.tpcSignal() * 50 / calibrationFactorPos->at(i), trk.eta()); } else { - registryDeDx.fill(HIST(kDedxvsMomentumNeg[0]), std::abs(signedP), trk.tpcSignal() * 50 / calibrationFactor->at(i), trk.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumNeg[0]), std::abs(signedP), trk.tpcSignal() * 50 / calibrationFactorNeg->at(i), trk.eta()); } } } @@ -384,12 +512,10 @@ struct DedxAnalysis { for (int i = 0; i < 8; ++i) { if (negTrack.eta() > EtaCut[i] && negTrack.eta() < EtaCut[i + 1]) { - - registryDeDx.fill(HIST(kDedxvsMomentumNeg[1]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactor->at(i), negTrack.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumNeg[1]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactorNeg->at(i), negTrack.eta()); } if (posTrack.eta() > EtaCut[i] && posTrack.eta() < EtaCut[i + 1]) { - - registryDeDx.fill(HIST(kDedxvsMomentumPos[1]), signedPpos, posTrack.tpcSignal() * 50 / calibrationFactor->at(i), posTrack.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumPos[1]), signedPpos, posTrack.tpcSignal() * 50 / calibrationFactorPos->at(i), posTrack.eta()); } } } @@ -408,12 +534,10 @@ struct DedxAnalysis { for (int i = 0; i < 8; ++i) { if (negTrack.eta() > EtaCut[i] && negTrack.eta() < EtaCut[i + 1]) { - - registryDeDx.fill(HIST(kDedxvsMomentumNeg[1]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactor->at(i), negTrack.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumNeg[1]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactorNeg->at(i), negTrack.eta()); } if (posTrack.eta() > EtaCut[i] && posTrack.eta() < EtaCut[i + 1]) { - - registryDeDx.fill(HIST(kDedxvsMomentumPos[2]), signedPpos, posTrack.tpcSignal() * 50 / calibrationFactor->at(i), posTrack.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumPos[2]), signedPpos, posTrack.tpcSignal() * 50 / calibrationFactorPos->at(i), posTrack.eta()); } } } @@ -432,12 +556,10 @@ struct DedxAnalysis { for (int i = 0; i < 8; ++i) { if (negTrack.eta() > EtaCut[i] && negTrack.eta() < EtaCut[i + 1]) { - - registryDeDx.fill(HIST(kDedxvsMomentumNeg[2]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactor->at(i), negTrack.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumNeg[2]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactorNeg->at(i), negTrack.eta()); } if (posTrack.eta() > EtaCut[i] && posTrack.eta() < EtaCut[i + 1]) { - - registryDeDx.fill(HIST(kDedxvsMomentumPos[1]), signedPpos, posTrack.tpcSignal() * 50 / calibrationFactor->at(i), posTrack.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumPos[1]), signedPpos, posTrack.tpcSignal() * 50 / calibrationFactorPos->at(i), posTrack.eta()); } } } @@ -456,12 +578,10 @@ struct DedxAnalysis { for (int i = 0; i < 8; ++i) { if (negTrack.eta() > EtaCut[i] && negTrack.eta() < EtaCut[i + 1]) { - - registryDeDx.fill(HIST(kDedxvsMomentumNeg[3]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactor->at(i), negTrack.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumNeg[3]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactorNeg->at(i), negTrack.eta()); } if (posTrack.eta() > EtaCut[i] && posTrack.eta() < EtaCut[i + 1]) { - - registryDeDx.fill(HIST(kDedxvsMomentumPos[3]), signedPpos, posTrack.tpcSignal() * 50 / calibrationFactor->at(i), posTrack.eta()); + registryDeDx.fill(HIST(kDedxvsMomentumPos[3]), signedPpos, posTrack.tpcSignal() * 50 / calibrationFactorPos->at(i), posTrack.eta()); } } } From 7290e0c7c9cbb813c3409eb2e5258185e7e30e27 Mon Sep 17 00:00:00 2001 From: alcaliva <32872606+alcaliva@users.noreply.github.com> Date: Wed, 26 Mar 2025 05:20:48 +0100 Subject: [PATCH 0829/1650] [PWGLF] added function to compute 2d weights (#10646) --- PWGLF/Tasks/Strangeness/strangenessInJets.cxx | 312 ++++++------------ 1 file changed, 110 insertions(+), 202 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/strangenessInJets.cxx b/PWGLF/Tasks/Strangeness/strangenessInJets.cxx index db7f3013eff..d865890d034 100644 --- a/PWGLF/Tasks/Strangeness/strangenessInJets.cxx +++ b/PWGLF/Tasks/Strangeness/strangenessInJets.cxx @@ -1881,262 +1881,170 @@ struct StrangenessInJets { } PROCESS_SWITCH(StrangenessInJets, processMCefficiency, "Process MC Efficiency", false); - /* void processGen(o2::aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) { for (const auto& mccollision : mcCollisions) { - registryMC.fill(HIST("number_of_events_mc"), 3.5); - // Selection on z_{vertex} - if (std::fabs(mccollision.posZ()) > 10) + if (std::fabs(mccollision.posZ()) > 10.0) continue; - registryMC.fill(HIST("number_of_events_mc"), 4.5); // MC Particles per Collision auto mcParticlesPerColl = mcParticles.sliceBy(perMCCollision, mccollision.globalIndex()); - // List of Tracks - std::vector trk; - std::vector ntrk; - + // loop over generated MC particles + std::vector fjParticles; for (const auto& particle : mcParticlesPerColl) { - // Select Primary Particles - double dx = particle.vx() - mccollision.posX(); - double dy = particle.vy() - mccollision.posY(); - double dz = particle.vz() - mccollision.posZ(); - double dcaxy = std::sqrt(dx * dx + dy * dy); - double dcaz = std::fabs(dz); - if (dcaxy > 0.25) - continue; - if (dcaz > 2.0) + if (!particle.isPhysicalPrimary()) continue; if (std::fabs(particle.eta()) > 0.8) continue; - if (particle.pt() < 0.15) + if (particle.pt() < 0.1) continue; - // PDG Selection - int pdg = std::fabs(particle.pdgCode()); - if ((pdg != 11) && (pdg != 211) && (pdg != 321) && (pdg != 2212)) - continue; - - TVector3 momentum(particle.px(), particle.py(), particle.pz()); - trk.push_back(momentum); - ntrk.push_back(1); + // 4-momentum representation of a particle + double energy = std::sqrt(particle.p() * particle.p() + MassPionCharged * MassPionCharged); + fastjet::PseudoJet fourMomentum(particle.px(), particle.py(), particle.pz(), energy); + fjParticles.emplace_back(fourMomentum); } + // reject empty events + if (fjParticles.size() < 1) + continue; + + // cluster particles using the anti-kt algorithm + fastjet::JetDefinition jetDef(fastjet::antikt_algorithm, rJet); + fastjet::AreaDefinition areaDef(fastjet::active_area, fastjet::GhostedAreaSpec(1.0)); + fastjet::ClusterSequenceArea cs(fjParticles, jetDef, areaDef); + std::vector jets = fastjet::sorted_by_pt(cs.inclusive_jets()); + auto [rhoPerp, rhoMPerp] = backgroundSub.estimateRhoPerpCone(fjParticles, jets); - // Anti-kt Jet Finder - int nParticlesRemoved(0); - std::vector jet; + // jet selection + bool isAtLeastOneJetSelected = false; + std::vector selectedJet; std::vector ue1; std::vector ue2; - std::vector nParticlesInjet; - - do { - double dijMin(1e+06), diBmin(1e+06); - int iMin(0), jMin(0), iBmin(0); - for (int i = 0; i < static_cast(trk.size()); i++) { - if (trk[i].Mag() == 0) - continue; - double diB = 1.0 / (trk[i].Pt() * trk[i].Pt()); - if (diB < diBmin) { - diBmin = diB; - iBmin = i; - } - for (int j = (i + 1); j < static_cast(trk.size()); j++) { - if (trk[j].Mag() == 0) - continue; - double dij = calculateDij(trk[i], trk[j], rJet); - if (dij < dijMin) { - dijMin = dij; - iMin = i; - jMin = j; - } - } - } - if (dijMin < diBmin) { - trk[iMin] = trk[iMin] + trk[jMin]; - ntrk[iMin] = ntrk[iMin] + ntrk[jMin]; - trk[jMin].SetXYZ(0, 0, 0); - ntrk[jMin] = 0; - nParticlesRemoved++; - } - if (dijMin > diBmin) { - jet.push_back(trk[iBmin]); - nParticlesInjet.push_back(ntrk[iBmin]); - trk[iBmin].SetXYZ(0, 0, 0); - nParticlesRemoved++; - } - } while (nParticlesRemoved < static_cast(trk.size())); - // Jet Selection - std::vector isSelected; - int nJetsSelected(0); - for (int i = 0; i < static_cast(jet.size()); i++) { + for (auto& jet : jets) { // o2-linter: disable=[const-ref-in-for-loop] - // Initialization - isSelected.push_back(0); - - // Jet fully contained inside acceptance - if ((std::fabs(jet[i].Eta()) + rJet) > (etaMax - 0.5)) + // jet must be fully contained in the acceptance + if ((std::fabs(jet.eta()) + rJet) > (etaMax - deltaEtaEdge)) continue; - if (nParticlesInjet[i] < 2) + + // jet pt must be larger than threshold + fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jet, rhoPerp, rhoMPerp); + if (getCorrectedPt(jetMinusBkg.pt()) < minJetPt) continue; + isAtLeastOneJetSelected = true; - // Perpendicular cones + // perpendicular cone + TVector3 jetAxis(jet.px(), jet.py(), jet.pz()); TVector3 ueAxis1(0, 0, 0); TVector3 ueAxis2(0, 0, 0); - getPerpendicularAxis(jet[i], ueAxis1, +1); - getPerpendicularAxis(jet[i], ueAxis2, -1); - ue1.push_back(ueAxis1); - ue2.push_back(ueAxis2); - - double ptJetCorr = jet[i].Pt() - 0.5; - if (ptJetCorr < minJetPt) - continue; - - nJetsSelected++; - isSelected[i] = 1; + getPerpendicularAxis(jetAxis, ueAxis1, +1); + getPerpendicularAxis(jetAxis, ueAxis2, -1); + selectedJet.emplace_back(jetAxis); + ue1.emplace_back(ueAxis1); + ue2.emplace_back(ueAxis2); } - if (nJetsSelected == 0) + if (!isAtLeastOneJetSelected) continue; - for (int i = 0; i < static_cast(jet.size()); i++) { - - if (isSelected[i] == 0) - continue; - - // Generated Particles + // loop over selected jets / UE + for (int i = 0; i < static_cast(selectedJet.size()); i++) { for (const auto& particle : mcParticlesPerColl) { if (!particle.isPhysicalPrimary()) continue; + if (std::fabs(particle.eta()) > 0.8) + continue; + if (particle.pt() < 0.1) + continue; TVector3 particleDir(particle.px(), particle.py(), particle.pz()); - const double deltaEtaJet = particleDir.Eta() - jet[i].Eta(); - const double deltaPhiJet = getDeltaPhi(particleDir.Phi(), jet[i].Phi()); - const double deltaRjet = std::sqrt(deltaEtaJet * deltaEtaJet + deltaPhiJet * deltaPhiJet); - const double deltaEtaUe1 = particleDir.Eta() - ue1[i].Eta(); - const double deltaPhiUe1 = getDeltaPhi(particleDir.Phi(), ue1[i].Phi()); - const double deltaRue1 = std::sqrt(deltaEtaUe1 * deltaEtaUe1 + deltaPhiUe1 * deltaPhiUe1); - const double deltaEtaUe2 = particleDir.Eta() - ue2[i].Eta(); - const double deltaPhiUe2 = getDeltaPhi(particleDir.Phi(), ue2[i].Phi()); - const double deltaRue2 = std::sqrt(deltaEtaUe2 * deltaEtaUe2 + deltaPhiUe2 * deltaPhiUe2); - - switch (particle.pdgCode()) { - case 211: - if (deltaRjet < rJet) { - registryMC.fill(HIST("pi_plus_eta_pt_jet"), particle.pt(), particle.eta()); - } - if (deltaRue1 < rJet || deltaRue2 < rJet) { - registryMC.fill(HIST("pi_plus_eta_pt_ue"), particle.pt(), particle.eta()); - } - break; - case -211: - if (deltaRjet < rJet) { - registryMC.fill(HIST("pi_minus_eta_pt_jet"), particle.pt(), particle.eta()); - } - if (deltaRue1 < rJet || deltaRue2 < rJet) { - registryMC.fill(HIST("pi_minus_eta_pt_ue"), particle.pt(), particle.eta()); - } - break; - case 321: - if (deltaRjet < rJet) { + float deltaEtaJet = particleDir.Eta() - selectedJet[i].Eta(); + float deltaPhiJet = getDeltaPhi(particleDir.Phi(), selectedJet[i].Phi()); + float deltaRjet = std::sqrt(deltaEtaJet * deltaEtaJet + deltaPhiJet * deltaPhiJet); + float deltaEtaUe1 = particleDir.Eta() - ue1[i].Eta(); + float deltaPhiUe1 = getDeltaPhi(particleDir.Phi(), ue1[i].Phi()); + float deltaRue1 = std::sqrt(deltaEtaUe1 * deltaEtaUe1 + deltaPhiUe1 * deltaPhiUe1); + float deltaEtaUe2 = particleDir.Eta() - ue2[i].Eta(); + float deltaPhiUe2 = getDeltaPhi(particleDir.Phi(), ue2[i].Phi()); + float deltaRue2 = std::sqrt(deltaEtaUe2 * deltaEtaUe2 + deltaPhiUe2 * deltaPhiUe2); + + // In jet + if (deltaRjet < rJet) { + switch (particle.pdgCode()) { + case 211: registryMC.fill(HIST("pi_plus_eta_pt_jet"), particle.pt(), particle.eta()); - } - if (deltaRue1 < rJet || deltaRue2 < rJet) { - registryMC.fill(HIST("pi_plus_eta_pt_ue"), particle.pt(), particle.eta()); - } - break; - case -321: - if (deltaRjet < rJet) { + break; + case -211: registryMC.fill(HIST("pi_minus_eta_pt_jet"), particle.pt(), particle.eta()); - } - if (deltaRue1 < rJet || deltaRue2 < rJet) { - registryMC.fill(HIST("pi_minus_eta_pt_ue"), particle.pt(), particle.eta()); - } - break; - case 2212: - if (deltaRjet < rJet) { - registryMC.fill(HIST("pi_plus_eta_pt_jet"), particle.pt(), particle.eta()); - } - if (deltaRue1 < rJet || deltaRue2 < rJet) { + break; + case 310: + registryMC.fill(HIST("K0s_eta_pt_jet"), particle.pt(), particle.eta()); + break; + case 3122: + registryMC.fill(HIST("Lambda_eta_pt_jet"), particle.pt(), particle.eta()); + break; + case -3122: + registryMC.fill(HIST("AntiLambda_eta_pt_jet"), particle.pt(), particle.eta()); + break; + case 3312: + registryMC.fill(HIST("Xi_eta_pt_jet"), particle.pt(), particle.eta()); + break; + case -3312: + registryMC.fill(HIST("AntiXi_eta_pt_jet"), particle.pt(), particle.eta()); + break; + case 3334: + registryMC.fill(HIST("Omega_eta_pt_jet"), particle.pt(), particle.eta()); + break; + case -3334: + registryMC.fill(HIST("AntiOmega_eta_pt_jet"), particle.pt(), particle.eta()); + break; + default: + continue; + } + } + + if (deltaRue1 < rJet || deltaRue2 < rJet) { + switch (particle.pdgCode()) { + case 211: registryMC.fill(HIST("pi_plus_eta_pt_ue"), particle.pt(), particle.eta()); - } - break; - case -2212: - if (deltaRjet < rJet) { - registryMC.fill(HIST("pi_minus_eta_pt_jet"), particle.pt(), particle.eta()); - } - if (deltaRue1 < rJet || deltaRue2 < rJet) { + break; + case -211: registryMC.fill(HIST("pi_minus_eta_pt_ue"), particle.pt(), particle.eta()); - } - break; - case 310: - if (deltaRjet < rJet) { - registryMC.fill(HIST("K0s_eta_pt_jet"), particle.pt(), particle.eta()); - } - if (deltaRue1 < rJet || deltaRue2 < rJet) { + break; + case 310: registryMC.fill(HIST("K0s_eta_pt_ue"), particle.pt(), particle.eta()); - } - break; - case 3122: - if (deltaRjet < rJet) { - registryMC.fill(HIST("Lambda_eta_pt_jet"), particle.pt(), particle.eta()); - } - if (deltaRue1 < rJet || deltaRue2 < rJet) { + break; + case 3122: registryMC.fill(HIST("Lambda_eta_pt_ue"), particle.pt(), particle.eta()); - } - break; - case -3122: - if (deltaRjet < rJet) { - registryMC.fill(HIST("AntiLambda_eta_pt_jet"), particle.pt(), particle.eta()); - } - if (deltaRue1 < rJet || deltaRue2 < rJet) { + break; + case -3122: registryMC.fill(HIST("AntiLambda_eta_pt_ue"), particle.pt(), particle.eta()); - } - break; - case 3312: - if (deltaRjet < rJet) { - registryMC.fill(HIST("Xi_eta_pt_jet"), particle.pt(), particle.eta()); - } - if (deltaRue1 < rJet || deltaRue2 < rJet) { + break; + case 3312: registryMC.fill(HIST("Xi_eta_pt_ue"), particle.pt(), particle.eta()); - } - break; - case -3312: - if (deltaRjet < rJet) { - registryMC.fill(HIST("AntiXi_eta_pt_jet"), particle.pt(), particle.eta()); - } - if (deltaRue1 < rJet || deltaRue2 < rJet) { + break; + case -3312: registryMC.fill(HIST("AntiXi_eta_pt_ue"), particle.pt(), particle.eta()); - } - break; - case 3334: - if (deltaRjet < rJet) { - registryMC.fill(HIST("Omega_eta_pt_jet"), particle.pt(), particle.eta()); - } - if (deltaRue1 < rJet || deltaRue2 < rJet) { + break; + case 3334: registryMC.fill(HIST("Omega_eta_pt_ue"), particle.pt(), particle.eta()); - } - break; - case -3334: - if (deltaRjet < rJet) { - registryMC.fill(HIST("AntiOmega_eta_pt_jet"), particle.pt(), particle.eta()); - } - if (deltaRue1 < rJet || deltaRue2 < rJet) { + break; + case -3334: registryMC.fill(HIST("AntiOmega_eta_pt_ue"), particle.pt(), particle.eta()); - } - break; + break; + default: + continue; + } } } } } } PROCESS_SWITCH(StrangenessInJets, processGen, "Process generated MC", false); - */ }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 009599afc1cb34a954248da035704ca49a51ea58 Mon Sep 17 00:00:00 2001 From: amaringarcia Date: Wed, 26 Mar 2025 14:16:20 +0100 Subject: [PATCH 0830/1650] [DPG] adding dummy proccess, and ITS PID to the derived data (#10641) --- DPG/Tasks/TPC/tpcSkimsTableCreator.cxx | 38 ++++++++++++++++---------- DPG/Tasks/TPC/tpcSkimsTableCreator.h | 4 +++ 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx b/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx index cbf1631d8aa..77b563c5567 100644 --- a/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx +++ b/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx @@ -31,6 +31,7 @@ /// O2Physics #include "Common/Core/trackUtilities.h" #include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/PIDResponseITS.h" #include "Common/DataModel/TrackSelectionTables.h" #include "PWGLF/DataModel/LFStrangenessTables.h" #include "PWGDQ/DataModel/ReducedInfoTables.h" @@ -326,7 +327,6 @@ struct TreeWriterTpcV0 { for (const auto& collision : collisions) { auto tracks = myTracks.sliceBy(perCollisionTracks, collision.globalIndex()); auto v0s = myV0s.sliceBy(perCollisionV0s, collision.globalIndex()); - /// Check event slection if (!isEventSelected(collision, tracks)) { continue; @@ -342,7 +342,6 @@ struct TreeWriterTpcV0 { for (const auto& v0 : v0s) { auto posTrack = v0.posTrack_as(); auto negTrack = v0.negTrack_as(); - aod::TracksQA_002::iterator posTrackQA; aod::TracksQA_002::iterator negTrackQA; bool existPosTrkQA; @@ -406,6 +405,9 @@ struct TreeWriterTpcV0 { } } /// process with TrackQA PROCESS_SWITCH(TreeWriterTpcV0, processWithTrQA, "Standard V0 Samples with Track QA for PID", false); + void processDummy(Colls const&) {} + PROCESS_SWITCH(TreeWriterTpcV0, processDummy, "Dummy function", false); + }; /// struct TreeWriterTpcV0 struct TreeWriterTPCTOF { @@ -547,7 +549,7 @@ struct TreeWriterTPCTOF { }; /// Function to fill trees template - void fillSkimmedTPCTOFTableWithTrkQA(T const& track, TQA const& trackQA, bool existTrkQA, C const& collision, const float nSigmaTPC, const float nSigmaTOF, const float dEdxExp, const o2::track::PID::ID id, int runnumber, double dwnSmplFactor, double hadronicRate, int bcGlobalIndex, int bcTimeFrameId, int bcBcInTimeFrame) + void fillSkimmedTPCTOFTableWithTrkQA(T const& track, TQA const& trackQA, bool existTrkQA, C const& collision, const float nSigmaTPC, const float nSigmaTOF, const float nSigmaITS, const float dEdxExp, const o2::track::PID::ID id, int runnumber, double dwnSmplFactor, double hadronicRate, int bcGlobalIndex, int bcTimeFrameId, int bcBcInTimeFrame) { const double ncl = track.tpcNClsFound(); @@ -575,6 +577,7 @@ struct TreeWriterTPCTOF { id, nSigmaTPC, nSigmaTOF, + nSigmaITS, runnumber, trackocc, ft0occ, @@ -675,6 +678,10 @@ struct TreeWriterTPCTOF { } for (const auto& collision : collisions) { auto tracks = myTracks.sliceBy(perCollisionTracks, collision.globalIndex()); + auto tracksWithITSPid = soa::Attach(tracks); /// Check event selection if (!isEventSelected(collision, tracks)) { continue; @@ -686,7 +693,7 @@ struct TreeWriterTPCTOF { const int bcTimeFrameId = bc.tfId(); const int bcBcInTimeFrame = bc.bcInTF(); rowTPCTOFTreeWithTrkQA.reserve(tracks.size()); - for (auto const& trk : tracks) { + for (auto const& trk : tracksWithITSPid) { if (!((trackSelection == 0) || ((trackSelection == 1) && trk.isGlobalTrack()) || ((trackSelection == 2) && trk.isGlobalTrackWoPtEta()) || @@ -707,38 +714,41 @@ struct TreeWriterTPCTOF { } /// Fill tree for tritons if (trk.tpcInnerParam() < maxMomHardCutOnlyTr && trk.tpcInnerParam() <= maxMomTPCOnlyTr && std::abs(trk.tpcNSigmaTr()) < nSigmaTPCOnlyTr && downsampleTsalisCharged(trk.pt(), downsamplingTsalisProtons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Triton])) { - fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaTr(), trk.tofNSigmaTr(), trk.tpcExpSignalTr(trk.tpcSignal()), o2::track::PID::Triton, runnumber, dwnSmplFactor_Tr, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaTr(), trk.tofNSigmaTr(), trk.itsNSigmaTr(), trk.tpcExpSignalTr(trk.tpcSignal()), o2::track::PID::Triton, runnumber, dwnSmplFactor_Tr, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); } else if (trk.tpcInnerParam() < maxMomHardCutOnlyTr && trk.tpcInnerParam() > maxMomTPCOnlyTr && std::abs(trk.tofNSigmaTr()) < nSigmaTOF_TPCTOF_Tr && std::abs(trk.tpcNSigmaTr()) < nSigmaTPC_TPCTOF_Tr && downsampleTsalisCharged(trk.pt(), downsamplingTsalisProtons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Triton])) { - fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaTr(), trk.tofNSigmaTr(), trk.tpcExpSignalTr(trk.tpcSignal()), o2::track::PID::Triton, runnumber, dwnSmplFactor_Tr, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaTr(), trk.tofNSigmaTr(), trk.itsNSigmaTr(), trk.tpcExpSignalTr(trk.tpcSignal()), o2::track::PID::Triton, runnumber, dwnSmplFactor_Tr, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); } /// Fill tree for deuterons if (trk.tpcInnerParam() < maxMomHardCutOnlyDe && trk.tpcInnerParam() <= maxMomTPCOnlyDe && std::abs(trk.tpcNSigmaDe()) < nSigmaTPCOnlyDe && downsampleTsalisCharged(trk.pt(), downsamplingTsalisProtons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Deuteron])) { - fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaDe(), trk.tofNSigmaDe(), trk.tpcExpSignalDe(trk.tpcSignal()), o2::track::PID::Deuteron, runnumber, dwnSmplFactor_De, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaDe(), trk.tofNSigmaDe(), trk.itsNSigmaDe(), trk.tpcExpSignalDe(trk.tpcSignal()), o2::track::PID::Deuteron, runnumber, dwnSmplFactor_De, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); } else if (trk.tpcInnerParam() < maxMomHardCutOnlyDe && trk.tpcInnerParam() > maxMomTPCOnlyDe && std::abs(trk.tofNSigmaDe()) < nSigmaTOF_TPCTOF_De && std::abs(trk.tpcNSigmaDe()) < nSigmaTPC_TPCTOF_De && downsampleTsalisCharged(trk.pt(), downsamplingTsalisProtons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Deuteron])) { - fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaDe(), trk.tofNSigmaDe(), trk.tpcExpSignalDe(trk.tpcSignal()), o2::track::PID::Deuteron, runnumber, dwnSmplFactor_De, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaDe(), trk.tofNSigmaDe(), trk.itsNSigmaDe(), trk.tpcExpSignalDe(trk.tpcSignal()), o2::track::PID::Deuteron, runnumber, dwnSmplFactor_De, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); } /// Fill tree for protons if (trk.tpcInnerParam() <= maxMomTPCOnlyPr && std::abs(trk.tpcNSigmaPr()) < nSigmaTPCOnlyPr && downsampleTsalisCharged(trk.pt(), downsamplingTsalisProtons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Proton])) { - fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaPr(), trk.tofNSigmaPr(), trk.tpcExpSignalPr(trk.tpcSignal()), o2::track::PID::Proton, runnumber, dwnSmplFactor_Pr, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaPr(), trk.tofNSigmaPr(), trk.itsNSigmaPr(), trk.tpcExpSignalPr(trk.tpcSignal()), o2::track::PID::Proton, runnumber, dwnSmplFactor_Pr, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); } else if (trk.tpcInnerParam() > maxMomTPCOnlyPr && std::abs(trk.tofNSigmaPr()) < nSigmaTOF_TPCTOF_Pr && std::abs(trk.tpcNSigmaPr()) < nSigmaTPC_TPCTOF_Pr && downsampleTsalisCharged(trk.pt(), downsamplingTsalisProtons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Proton])) { - fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaPr(), trk.tofNSigmaPr(), trk.tpcExpSignalPr(trk.tpcSignal()), o2::track::PID::Proton, runnumber, dwnSmplFactor_Pr, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaPr(), trk.tofNSigmaPr(), trk.itsNSigmaPr(), trk.tpcExpSignalPr(trk.tpcSignal()), o2::track::PID::Proton, runnumber, dwnSmplFactor_Pr, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); } /// Fill tree for kaons if (trk.tpcInnerParam() < maxMomHardCutOnlyKa && trk.tpcInnerParam() <= maxMomTPCOnlyKa && std::abs(trk.tpcNSigmaKa()) < nSigmaTPCOnlyKa && downsampleTsalisCharged(trk.pt(), downsamplingTsalisKaons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Kaon])) { - fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaKa(), trk.tofNSigmaKa(), trk.tpcExpSignalKa(trk.tpcSignal()), o2::track::PID::Kaon, runnumber, dwnSmplFactor_Ka, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaKa(), trk.tofNSigmaKa(), trk.itsNSigmaKa(), trk.tpcExpSignalKa(trk.tpcSignal()), o2::track::PID::Kaon, runnumber, dwnSmplFactor_Ka, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); } else if (trk.tpcInnerParam() < maxMomHardCutOnlyKa && trk.tpcInnerParam() > maxMomTPCOnlyKa && std::abs(trk.tofNSigmaKa()) < nSigmaTOF_TPCTOF_Ka && std::abs(trk.tpcNSigmaKa()) < nSigmaTPC_TPCTOF_Ka && downsampleTsalisCharged(trk.pt(), downsamplingTsalisKaons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Kaon])) { - fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaKa(), trk.tofNSigmaKa(), trk.tpcExpSignalKa(trk.tpcSignal()), o2::track::PID::Kaon, runnumber, dwnSmplFactor_Ka, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaKa(), trk.tofNSigmaKa(), trk.itsNSigmaKa(), trk.tpcExpSignalKa(trk.tpcSignal()), o2::track::PID::Kaon, runnumber, dwnSmplFactor_Ka, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); } /// Fill tree pions if (trk.tpcInnerParam() <= maxMomTPCOnlyPi && std::abs(trk.tpcNSigmaPi()) < nSigmaTPCOnlyPi && downsampleTsalisCharged(trk.pt(), downsamplingTsalisPions, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Pion])) { - fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaPi(), trk.tofNSigmaPi(), trk.tpcExpSignalPi(trk.tpcSignal()), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaPi(), trk.tofNSigmaPi(), trk.itsNSigmaPi(), trk.tpcExpSignalPi(trk.tpcSignal()), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); } else if (trk.tpcInnerParam() > maxMomTPCOnlyPi && std::abs(trk.tofNSigmaPi()) < nSigmaTOF_TPCTOF_Pi && std::abs(trk.tpcNSigmaPi()) < nSigmaTPC_TPCTOF_Pi && downsampleTsalisCharged(trk.pt(), downsamplingTsalisPions, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Pion])) { - fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaPi(), trk.tofNSigmaPi(), trk.tpcExpSignalPi(trk.tpcSignal()), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); + fillSkimmedTPCTOFTableWithTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaPi(), trk.tofNSigmaPi(), trk.itsNSigmaPi(), trk.tpcExpSignalPi(trk.tpcSignal()), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate, bcGlobalIndex, bcTimeFrameId, bcBcInTimeFrame); } } /// Loop tracks } } /// process PROCESS_SWITCH(TreeWriterTPCTOF, processWithTrQA, "Samples for PID with TrackQA info", false); + void processDummy(Colls const&) {} + PROCESS_SWITCH(TreeWriterTPCTOF, processDummy, "Dummy function", false); + }; /// struct TreeWriterTPCTOF WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/DPG/Tasks/TPC/tpcSkimsTableCreator.h b/DPG/Tasks/TPC/tpcSkimsTableCreator.h index 4a4d8995593..0f7e2264a25 100644 --- a/DPG/Tasks/TPC/tpcSkimsTableCreator.h +++ b/DPG/Tasks/TPC/tpcSkimsTableCreator.h @@ -13,6 +13,8 @@ /// \author Annalena Kalteyer /// \author Christian Sonnabend /// \author Jeremy Wilkinson +/// \author Ana Marin +/// \brief Creates clean samples of particles for PID fits #ifndef DPG_TASKS_TPC_TPCSKIMSTABLECREATOR_H_ #define DPG_TASKS_TPC_TPCSKIMSTABLECREATOR_H_ @@ -34,6 +36,7 @@ DECLARE_SOA_COLUMN(NormNClustersTPC, normNClustersTPC, float); DECLARE_SOA_COLUMN(PidIndex, pidIndexTPC, uint8_t); DECLARE_SOA_COLUMN(NSigTPC, nsigTPC, float); DECLARE_SOA_COLUMN(NSigTOF, nsigTOF, float); +DECLARE_SOA_COLUMN(NSigITS, nsigITS, float); DECLARE_SOA_COLUMN(AlphaV0, alphaV0, float); DECLARE_SOA_COLUMN(QtV0, qtV0, float); DECLARE_SOA_COLUMN(CosPAV0, cosPAV0, float); @@ -150,6 +153,7 @@ DECLARE_SOA_TABLE(SkimmedTPCTOFTreeWithTrkQA, "AOD", "TPCTOFSKIMWQA", tpcskims::PidIndex, tpcskims::NSigTPC, tpcskims::NSigTOF, + tpcskims::NSigITS, tpcskims::RunNumber, tpcskims::TrackOcc, tpcskims::Ft0Occ, From b011737b122bfb4778ef449e843009826b171e7d Mon Sep 17 00:00:00 2001 From: amatyja Date: Wed, 26 Mar 2025 15:55:07 +0100 Subject: [PATCH 0831/1650] [PWGUD] FIT veto eneabled be default + efficiency skim histo (#10657) --- PWGUD/Tasks/upcTauTau13topo.cxx | 2612 ++++++++++++++++--------------- 1 file changed, 1322 insertions(+), 1290 deletions(-) diff --git a/PWGUD/Tasks/upcTauTau13topo.cxx b/PWGUD/Tasks/upcTauTau13topo.cxx index 7a7c41dea2b..0d18b316b8b 100644 --- a/PWGUD/Tasks/upcTauTau13topo.cxx +++ b/PWGUD/Tasks/upcTauTau13topo.cxx @@ -70,7 +70,7 @@ DECLARE_SOA_COLUMN(Hmpr, hmpr, bool); // DECLARE_SOA_COLUMN(VtxITSTPC, vtxITSTPC, int); DECLARE_SOA_COLUMN(ZdcAenergy, zdcAenergy, float); DECLARE_SOA_COLUMN(ZdcCenergy, zdcCenergy, float); -DECLARE_SOA_COLUMN(Qtot, qtot, short); +DECLARE_SOA_COLUMN(Qtot, qtot, int16_t); // FIT info DECLARE_SOA_COLUMN(TotalFT0AmplitudeA, totalFT0AmplitudeA, float); DECLARE_SOA_COLUMN(TotalFT0AmplitudeC, totalFT0AmplitudeC, float); @@ -92,12 +92,14 @@ DECLARE_SOA_COLUMN(TrkTPCnSigmaEl, trkTPCnSigmaEl, float[4]); DECLARE_SOA_COLUMN(TrkTPCnSigmaPi, trkTPCnSigmaPi, float[4]); DECLARE_SOA_COLUMN(TrkTPCnSigmaKa, trkTPCnSigmaKa, float[4]); DECLARE_SOA_COLUMN(TrkTPCnSigmaPr, trkTPCnSigmaPr, float[4]); +DECLARE_SOA_COLUMN(TrkTPCnSigmaMu, trkTPCnSigmaMu, float[4]); DECLARE_SOA_COLUMN(TrkTOFbeta, trkTOFbeta, float[4]); DECLARE_SOA_COLUMN(TrkTOFnSigmaEl, trkTOFnSigmaEl, float[4]); // DECLARE_SOA_COLUMN(TrkTOFnSigmaMu, trkTOFnSigmaMu, float[4]); DECLARE_SOA_COLUMN(TrkTOFnSigmaPi, trkTOFnSigmaPi, float[4]); DECLARE_SOA_COLUMN(TrkTOFnSigmaKa, trkTOFnSigmaKa, float[4]); DECLARE_SOA_COLUMN(TrkTOFnSigmaPr, trkTOFnSigmaPr, float[4]); +DECLARE_SOA_COLUMN(TrkTOFnSigmaMu, trkTOFnSigmaMu, float[4]); DECLARE_SOA_COLUMN(TrkTOFchi2, trkTOFchi2, float[4]); } // end of namespace tau_tree @@ -116,8 +118,8 @@ DECLARE_SOA_TABLE(TauFourTracks, "AOD", "TAUFOURTRACK", // tau_tree::TrkSign, // tau_tree::TrkDCAxy, tau_tree::TrkDCAz, tau_tree::TrkTPCcr, - tau_tree::TrkTPCsignal, tau_tree::TrkTPCnSigmaEl, tau_tree::TrkTPCnSigmaPi, tau_tree::TrkTPCnSigmaKa, tau_tree::TrkTPCnSigmaPr, - tau_tree::TrkTOFbeta, tau_tree::TrkTOFnSigmaEl, tau_tree::TrkTOFnSigmaPi, tau_tree::TrkTOFnSigmaKa, tau_tree::TrkTOFnSigmaPr, + tau_tree::TrkTPCsignal, tau_tree::TrkTPCnSigmaEl, tau_tree::TrkTPCnSigmaPi, tau_tree::TrkTPCnSigmaKa, tau_tree::TrkTPCnSigmaPr, tau_tree::TrkTPCnSigmaMu, + tau_tree::TrkTOFbeta, tau_tree::TrkTOFnSigmaEl, tau_tree::TrkTOFnSigmaPi, tau_tree::TrkTOFnSigmaKa, tau_tree::TrkTOFnSigmaPr, tau_tree::TrkTOFnSigmaMu, tau_tree::TrkTOFchi2); } // end of namespace o2::aod @@ -154,8 +156,8 @@ struct TauTau13topo { Configurable maxNsigmaPrVetocut{"maxNsigmaPrVetocut", 3., "max Nsigma for Proton veto cut"}; Configurable maxNsigmaKaVetocut{"maxNsigmaKaVetocut", 3., "max Nsigma for Kaon veto cut"}; Configurable minPtEtrkcut{"minPtEtrkcut", 0.25, "min Pt for El track cut"}; - Configurable mFITvetoFlag{"mFITvetoFlag", {}, "To apply FIT veto"}; - Configurable mFITvetoWindow{"mFITvetoWindow", 6, "FIT veto window"}; + Configurable mFITvetoFlag{"mFITvetoFlag", true, "To apply FIT veto"}; + Configurable mFITvetoWindow{"mFITvetoWindow", 2, "FIT veto window"}; Configurable useFV0ForVeto{"useFV0ForVeto", 0, "use FV0 for veto"}; Configurable useFDDAForVeto{"useFDDAForVeto", 0, "use FDDA for veto"}; Configurable useFDDCForVeto{"useFDDCForVeto", 0, "use FDDC for veto"}; @@ -191,6 +193,10 @@ struct TauTau13topo { "registry1MC", {}}; + HistogramRegistry registrySkim{ + "registrySkim", + {}}; + void init(InitContext&) { // pdg = TDatabasePDG::Instance(); @@ -210,1293 +216,1303 @@ struct TauTau13topo { const AxisSpec axisZDC{50, -1., 14., "#it{E} (TeV)"}; const AxisSpec axisInvMass4trk{160, 0.5, 8.5, "#it{M}^{4trk}_{inv} (GeV/#it{c}^{2})"}; - registry.add("global/RunNumber", "Run number; Run; Collisions", {HistType::kTH1F, {{150, 544013, 545367}}}); - registry.add("global/GapSide", "Associated gap side; gap index; Collisions", {HistType::kTH1F, {{5, -1, 4}}}); - registry.add("global/GapSideTrue", "Recalculated gap side; gap index; Collisions", {HistType::kTH1F, {{5, -1, 4}}}); - - registry.add("global/hZNACenergy", "ZNA vs ZNC energy; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); - registry.add("global/hZNACtime", "ZNA vs ZNC time; #it{time}_{ZNA} (ns); #it{time}_{ZNC} (ns); Collisions", {HistType::kTH2F, {{100, -10., 10.}, {100, -10., 10.}}}); - // registry.add("global/hZNACenergyTest", "ZNA or ZNC energy; #it{E}_{ZNA,ZNC} (GeV); Collisions", {HistType::kTH1F, {{100,-1000,0}}}); - - registry.add("global/hVertexXY", "Vertex position in x and y direction; #it{V}_{x} (cm); #it{V}_{y} (cm); Collisions", {HistType::kTH2F, {{50, -0.05, 0.05}, {50, -0.02, 0.02}}}); - registry.add("global/hVertexZ", "Vertex position in z direction; #it{V}_{z} (cm); Collisions", {HistType::kTH1F, {{100, -25., 25.}}}); - registry.add("global/hNTracks", ";N_{tracks};events", {HistType::kTH1D, {{20, 0., 20.}}}); - // registry.add("global/hNTracksGlobal", ";N_{tracks,global};events", {HistType::kTH1D, {{20, 0., 20.}}}); - registry.add("global/hNTracksPV", ";N_{tracks,PV};events", {HistType::kTH1D, {{20, 0., 20.}}}); - registry.add("global/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); - registry.add("global/hTrackPtPV", ";p_T^{trk}; Entries", {HistType::kTH1F, {axispt}}); - registry.add("global/hTrackEtaPhiPV", ";Eta;Phi;", {HistType::kTH2D, {axiseta, {140, -3.5, 3.5}}}); - registry.add("global/hTrackEfficiencyPVGlobal", "0-All,1-ntpc,2-rat,3-chitpc,4chiits,5-dcaz,6-dcaxy,7pt,8eta;Track efficiency; Entries", {HistType::kTH1F, {{15, 0, 15}}}); - registry.add("global/hTrackPVGood", "0-All,1-ntpc,2-rat,3-chitpc,4chiits,5-dcaz,6-dcaxy,7pt,8eta;Track efficiency; Entries", {HistType::kTH1F, {{15, 0, 15}}}); - registry.add("global/hTrackEtaPhiPVGlobal", ";Eta;Phi;", {HistType::kTH2D, {axiseta, {140, -3.5, 3.5}}}); - - registry.add("global/hSignalTPCvsPtPV", ";Pt;TPC Signal", {HistType::kTH2F, {axispt, {200, 0., 200}}}); - registry.add("global/hITSbitPVtrk", "ITS bit for PV tracks; Layer hit;Entries", {HistType::kTH1F, {{10, 0., 10.}}}); - registry.add("global/hITSnbitsVsEtaPVtrk", "n ITS bits vs #eta for PV tracks; #eta;Layer hit;Entries", {HistType::kTH2F, {axiseta, {8, -1., 7.}}}); - registry.add("global/hITSbitVsEtaPVtrk", "ITS bit vs #eta for PV tracks; #eta;Layer hit;Entries", {HistType::kTH2F, {axiseta, {8, 0., 8.}}}); - registry.add("global/hEventEff", "Event cut efficiency: 0-All,1-PV=4,2-Qtot=0,3-El;Cut;entries", {HistType::kTH1F, {{27, -2., 25.}}}); - registry.add("global/hNCombAfterCut", "Combinations after cut: 0-All,5-M3pi,10-Dphi,15-N_{e},20-N_{v#pi},25-Pt,30-Vcal,35-N_{vp},40-N_{vK},45-Tot;N_{comb};entries", {HistType::kTH1F, {{60, 0., 60.}}}); - // registry.add("global/hInvMassElTrack", ";M_{inv}^{2};entries", {HistType::kTH1F, {{100, -0.01, 0.49}}}); - registry.add("global/hDeltaAngleTrackPV", ";#Delta#alpha;entries", {HistType::kTH1F, {{136, 0., 3.2}}}); // 0.49 - registry.add("global/hTrkCheck", ";track type;entries", {HistType::kTH1F, {{16, -1, 15}}}); - - registry.add("global/hRecFlag", ";Reconstruction Flag;events", {HistType::kTH1F, {{10, 0., 10.}}}); - registry.add("global/hOccupancyInTime", ";Occupancy;events", {HistType::kTH1F, {{100, 0., 10000.}}}); - - registry.add("global1/hVertexZ", "Vertex position in z direction; #it{V}_{z} (cm); Collisions", {HistType::kTH1F, {{100, -25., 25.}}}); - registry.add("global1/hNTracks", ";N_{tracks};events", {HistType::kTH1D, {{20, 0., 20.}}}); - registry.add("global1/hNTracksPV", ";N_{tracks,PV};events", {HistType::kTH1D, {{20, 0., 20.}}}); - registry.add("global1/hTrackPtPV", ";p_T^{trk}; Entries", {HistType::kTH1F, {axispt}}); - registry.add("global1/hTrackEtaPhiPV", ";Eta;Phi;", {HistType::kTH2D, {axiseta, {140, -3.5, 3.5}}}); - registry.add("global1/hTrackPVTotCharge", "Q_{Tot};Q_{Tot}; Entries", {HistType::kTH1F, {{11, -5, 6}}}); - - // cut0 - registry.add("control/cut0/h3piMassComb", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registry.add("control/cut0/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registry.add("control/cut0/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registry.add("control/cut0/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registry.add("control/cut0/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registry.add("control/cut0/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - // registry.add("control/cut0/h13EtaSum", ";#eta^{1-prong}+#eta^{3-prong};entries", {HistType::kTH1F, {{100, -4., 4.}}}); - registry.add("control/cut0/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registry.add("control/cut0/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry.add("control/cut0/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry.add("control/cut0/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); - registry.add("control/cut0/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); - registry.add("control/cut0/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry.add("control/cut0/hsigma3PiNew", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry.add("control/cut0/hsigma2PiNew", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}};#sigma^{2#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry.add("control/cut0/hsigma1PiNew", "#sqrt{#sigma_{1}^{2 }};#sigma^{1#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry.add("control/cut0/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); - registry.add("control/cut0/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registry.add("control/cut0/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); - registry.add("control/cut0/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {{40, 0., 5.}}}); - registry.add("control/cut0/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - - registry.add("control/cut0/hInvMass2ElAll", "Inv Mass of 2 Electrons from coherent peak;M_{inv}^{2e};entries", {HistType::kTH1F, {{150, -0.1, 9.}}}); - registry.add("control/cut0/hInvMass2ElCoh", "Inv Mass of 2 Electrons from coherent peak;M_{inv}^{2e};entries", {HistType::kTH1F, {{150, -0.1, 4.}}}); - registry.add("control/cut0/hGamPtCoh", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registry.add("control/cut0/hGamPtCohIM0", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registry.add("control/cut0/hN2gamma", "Number of gamma pairs among 3 comb;N_{#gamma#gamma};entries", {HistType::kTH1F, {{20, 0., 20.}}}); - registry.add("control/cut0/hGamAS", ";A_{S};entries", {HistType::kTH1F, {{100, 0, 0.2}}}); - registry.add("control/cut0/hGamAV", ";A_{V};entries", {HistType::kTH1F, {{100, 0, 0.2}}}); - registry.add("control/cut0/hInvMass2GamCoh", "Inv Mass of 2 Gamma from coherent peak;M_{inv}^{2#gamma};entries", {HistType::kTH1F, {{160, 0.5, 4.5}}}); - registry.add("control/cut0/hDeltaPhi2GamCoh", "Delta Phi of 2 Gamma from coherent peak;#Delta#phi^{2#gamma};entries", {HistType::kTH1F, {phiAxis}}); - - // // cut1 - // registry.add("control/cut1/h3piMassComb", "3#pi mass, 1 entry per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - // registry.add("control/cut1/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - // registry.add("control/cut1/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - // registry.add("control/cut1/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - // registry.add("control/cut1/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - // registry.add("control/cut1/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - // // registry.add("control/cut1/h13EtaSum", ";#eta^{1-prong}+#eta^{3-prong};entries", {HistType::kTH1F, {{100, -4., 4.}}}); - // registry.add("control/cut1/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - // registry.add("control/cut1/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registry.add("control/cut1/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registry.add("control/cut1/h3piMassVsPt", "3#pi mass vs Pt, 1 entry per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); - // registry.add("control/cut1/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); - // registry.add("control/cut1/hDcaZ", "All 4 tracks dca ;dca_{Z};entries", {HistType::kTH1F, {{100, -0.05, 0.05}}}); - // registry.add("control/cut1/hDcaXY", "All 4 tracks dca ;dca_{XY};entries", {HistType::kTH1F, {{100, -0.05, 0.05}}}); - // registry.add("control/cut1/hChi2TPC", "All 4 tracks Chi2 ;Chi2_{TPC};entries", {HistType::kTH1F, {{48, -2, 10.}}}); - // registry.add("control/cut1/hChi2ITS", "All 4 tracks Chi2 ;Chi2_{ITS};entries", {HistType::kTH1F, {{44, -2, 20.}}}); - // registry.add("control/cut1/hChi2TOF", "All 4 tracks Chi2 ;Chi2_{TOF};entries", {HistType::kTH1F, {{48, -2, 10.}}}); - // registry.add("control/cut1/hTPCnclsFindable", "All 4 tracks NclFind ;N_{TPC,cl,findable};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - // registry.add("control/cut1/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registry.add("control/cut1/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); - // registry.add("control/cut1/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - // registry.add("control/cut1/hZNACenergy", "ZNA vs ZNC energy; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); - // registry.add("control/cut1/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {{40, 0., 5.}}}); - // registry.add("control/cut1/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - - // // cut1a for 20 - registryMC.add("globalMCrec/hPtSpectrumElRec9", "Rec9;#it{p}_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); // effiEl = 23, FIT empty - - // global1 when we require SGProducer + double gap + nPVtracks=4 - registryMC.add("global1MCrec/hVertexZ", "Vertex position in z direction; #it{V}_{z} (cm); Collisions", {HistType::kTH1F, {{100, -25., 25.}}}); - registryMC.add("global1MCrec/hNTracks", ";N_{tracks};events", {HistType::kTH1D, {{20, 0., 20.}}}); - registryMC.add("global1MCrec/hNTracksPV", ";N_{tracks,PV};events", {HistType::kTH1D, {{20, 0., 20.}}}); - registryMC.add("global1MCrec/hTrackPtPV", ";p_T^{trk}; Entries", {HistType::kTH1F, {axispt}}); - registryMC.add("global1MCrec/hTrackEtaPhiPV", ";Eta;Phi;", {HistType::kTH2D, {axiseta, {128, -0.05, 6.35}}}); - registryMC.add("global1MCrec/hTrackPVTotCharge", "Q_{Tot};Q_{Tot}; Entries", {HistType::kTH1F, {{11, -5, 6}}}); - - registryMC.add("global1MCrec/hpTGenRecTracksPV", ";p_{T}^{Rec. tracks,PV} (GeV/c);p_{T}^{Gen} (GeV/c);events", {HistType::kTH2D, {{100, 0., 4.}, {100, 0., 4.}}}); - registryMC.add("global1MCrec/hDeltapTGenRecVsRecpTTracksPV", ";#Delta p_{T}^{Rec.-Gen. tracks,PV} (GeV/c);p_{T}^{Rec. tracks,PV} (GeV/c);events", {HistType::kTH2D, {{100, -4., 4.}, {100, 0., 4.}}}); - registryMC.add("global1MCrec/hEtaGenRecTracksPV", ";#eta^{Rec. tracks,PV} (GeV/c);#eta^{Gen} (GeV/c);events", {HistType::kTH2D, {{100, -2., 2.}, {100, -2., 2.}}}); - registryMC.add("global1MCrec/hDeltaEtaGenRecVsRecpTTracksPV", ";#Delta #eta^{Rec.-Gen. tracks,PV} (GeV/c);p_{T}^{Rec. tracks,PV} (GeV/c);events", {HistType::kTH2D, {{100, -0.25, 0.25}, {100, 0., 4.}}}); - registryMC.add("global1MCrec/hPhiGenRecTracksPV", ";#phi^{Rec. tracks,PV} (GeV/c);#phi^{Gen} (GeV/c);events", {HistType::kTH2D, {{100, 0., 6.4}, {100, 0., 6.4}}}); - registryMC.add("global1MCrec/hDeltaPhiGenRecVsRecpTTracksPV", ";#Delta #phi^{Rec.-Gen. tracks,PV} (GeV/c);p_{T}^{Rec. tracks,PV} (GeV/c);events", {HistType::kTH2D, {{100, -0.5, 0.5}, {100, 0., 4.}}}); - - // pid El in MC true - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut0", "In hip ;#it{p}_{trk}(GeV/#it{c});dE/dx_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut1", "All hip;#it{p}_{trk}(GeV/#it{c});dE/dx_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - // pid separately for each cut (what we reject) - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut2", "rejected, IM hip; #it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut3", "rejected, DP hip; #it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut4", "rejected, El hip; #it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut5", "rejected, vPi hip;#it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut6", "rejected, Pt hip; #it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut7", "rejected, vVc hip;#it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut8", "rejected, pTot hip;#it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut9", "rejected, vPr hip;#it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut10", "rejected, vKa hip;#it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut11", "rejected, nCR hip;#it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut12", "rejected, s3pi hip;#it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - // pid sequentialy - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut20", "El hip; #it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut33", "eTOF+20 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut21", "vPi+33 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut24", "vPr+21 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut25", "vKa+24 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut28", "CR+25 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut22", "vVc+28 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut29", "s3pi+22 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut26", "IM+29 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut34", "piTOF+26 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut30", "ptTot+34 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut27", "DP+30 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut35", "ZDC+27 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut23", "Occ+35 hip; #it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - - // registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut31", "FIT+27 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - // registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut32", "TOF+31 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - - // pid Pi in MC true - registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut0", "In hip ;#it{p}_{trk}(GeV/#it{c});dE/dx_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut20", "El hip; #it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut33", "eTOF+20 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut21", "vPi+33 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut24", "vPr+21 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut25", "vKa+24 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut28", "CR+25 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut22", "vVc+28 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut29", "s3pi+22 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut26", "IM+29 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut34", "piTOF+26 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut30", "ptTot+34 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut27", "DP+30 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut35", "ZDC+27 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut23", "Occ+35 hip; #it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - - // registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut31", "FIT+27 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - // registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut32", "TOF+31 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); - - // El PID in TOF MC true - registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut0", "In hip ;#it{p}_{trk}(GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); - registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut20", "El hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); - registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut33", "eTOF+20 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); - registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut21", "vPi+33 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); - registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut24", "vPr+21 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); - registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut25", "vKa+24 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); - registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut28", "CR+25 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); - registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut22", "vVc+28 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); - registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut29", "s3pi+22 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); - registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut26", "IM+29 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); - registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut34", "piTOF+26 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); - registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut30", "ptTot+34 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); - registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut27", "DP+30 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); - registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut35", "ZDC+27 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); - registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut23", "Occ+27 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); - - // cut0 - registryMC.add("controlMCtrue/cut0/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCtrue/cut0/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCtrue/cut0/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCtrue/cut0/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCtrue/cut0/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCtrue/cut0/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCtrue/cut0/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut0/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registryMC.add("controlMCtrue/cut0/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registryMC.add("controlMCtrue/cut0/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); - registryMC.add("controlMCtrue/cut0/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); - registryMC.add("controlMCtrue/cut0/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCtrue/cut0/hsigma3PiNew", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCtrue/cut0/hsigma2PiNew", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}};#sigma^{2#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCtrue/cut0/hsigma1PiNew", "#sqrt{#sigma_{1}^{2 }};#sigma^{1#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - - registryMC.add("controlMCtrue/cut0/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); - registryMC.add("controlMCtrue/cut0/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCtrue/cut0/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); - registry1MC.add("controlMCtrue/cut0/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // - registryMC.add("controlMCcomb/cut0/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCcomb/cut0/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCcomb/cut0/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCcomb/cut0/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCcomb/cut0/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCcomb/cut0/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCcomb/cut0/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registryMC.add("controlMCcomb/cut0/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registry1MC.add("controlMCcomb/cut0/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - - // cut20 MC - registryMC.add("controlMCtrue/cut20/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registryMC.add("controlMCtrue/cut20/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut20/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); - registryMC.add("controlMCtrue/cut20/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); - registryMC.add("controlMCtrue/cut20/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCtrue/cut20/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCtrue/cut20/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCtrue/cut20/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCtrue/cut20/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCtrue/cut20/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCtrue/cut20/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCtrue/cut20/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); - registryMC.add("controlMCtrue/cut20/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCtrue/cut20/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registryMC.add("controlMCtrue/cut20/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); - // registryMC.add("controlMCtrue/cut20/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // - registryMC.add("controlMCcomb/cut20/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCcomb/cut20/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCcomb/cut20/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCcomb/cut20/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCcomb/cut20/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCcomb/cut20/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCcomb/cut20/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCcomb/cut20/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCcomb/cut20/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - - // cut21 MC - registryMC.add("controlMCtrue/cut21/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registryMC.add("controlMCtrue/cut21/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut21/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); - registryMC.add("controlMCtrue/cut21/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); - registryMC.add("controlMCtrue/cut21/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCtrue/cut21/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCtrue/cut21/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCtrue/cut21/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCtrue/cut21/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCtrue/cut21/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCtrue/cut21/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCtrue/cut21/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); - registryMC.add("controlMCtrue/cut21/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCtrue/cut21/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registryMC.add("controlMCtrue/cut21/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); - // registryMC.add("controlMCtrue/cut21/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // - registryMC.add("controlMCcomb/cut21/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCcomb/cut21/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCcomb/cut21/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCcomb/cut21/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCcomb/cut21/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCcomb/cut21/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCcomb/cut21/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCcomb/cut21/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCcomb/cut21/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - - // cut24 MC - registryMC.add("controlMCtrue/cut24/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registryMC.add("controlMCtrue/cut24/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut24/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); - registryMC.add("controlMCtrue/cut24/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); - registryMC.add("controlMCtrue/cut24/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCtrue/cut24/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCtrue/cut24/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCtrue/cut24/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCtrue/cut24/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCtrue/cut24/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCtrue/cut24/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCtrue/cut24/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); - registryMC.add("controlMCtrue/cut24/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCtrue/cut24/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registryMC.add("controlMCtrue/cut24/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); - // registryMC.add("controlMCtrue/cut24/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // - registryMC.add("controlMCcomb/cut24/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCcomb/cut24/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCcomb/cut24/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCcomb/cut24/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCcomb/cut24/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCcomb/cut24/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCcomb/cut24/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCcomb/cut24/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCcomb/cut24/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - - // cut25 MC - registryMC.add("controlMCtrue/cut25/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registryMC.add("controlMCtrue/cut25/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut25/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); - registryMC.add("controlMCtrue/cut25/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); - registryMC.add("controlMCtrue/cut25/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCtrue/cut25/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCtrue/cut25/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCtrue/cut25/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCtrue/cut25/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCtrue/cut25/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCtrue/cut25/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCtrue/cut25/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); - registryMC.add("controlMCtrue/cut25/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCtrue/cut25/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registryMC.add("controlMCtrue/cut25/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); - // registryMC.add("controlMCtrue/cut25/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // - registryMC.add("controlMCcomb/cut25/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCcomb/cut25/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCcomb/cut25/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCcomb/cut25/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCcomb/cut25/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCcomb/cut25/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCcomb/cut25/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCcomb/cut25/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCcomb/cut25/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - - // cut28 MC - registryMC.add("controlMCtrue/cut28/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registryMC.add("controlMCtrue/cut28/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut28/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); - registryMC.add("controlMCtrue/cut28/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); - registryMC.add("controlMCtrue/cut28/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCtrue/cut28/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCtrue/cut28/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCtrue/cut28/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCtrue/cut28/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCtrue/cut28/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCtrue/cut28/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCtrue/cut28/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); - registryMC.add("controlMCtrue/cut28/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCtrue/cut28/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registryMC.add("controlMCtrue/cut28/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); - // registryMC.add("controlMCtrue/cut28/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // - registryMC.add("controlMCcomb/cut28/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCcomb/cut28/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCcomb/cut28/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCcomb/cut28/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCcomb/cut28/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCcomb/cut28/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCcomb/cut28/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCcomb/cut28/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCcomb/cut28/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - - // cut22 MC - registryMC.add("controlMCtrue/cut22/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registryMC.add("controlMCtrue/cut22/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut22/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); - registryMC.add("controlMCtrue/cut22/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); - registryMC.add("controlMCtrue/cut22/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCtrue/cut22/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCtrue/cut22/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCtrue/cut22/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCtrue/cut22/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCtrue/cut22/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCtrue/cut22/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCtrue/cut22/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); - registryMC.add("controlMCtrue/cut22/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCtrue/cut22/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registryMC.add("controlMCtrue/cut22/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); - // registryMC.add("controlMCtrue/cut22/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // - registryMC.add("controlMCcomb/cut22/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCcomb/cut22/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCcomb/cut22/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCcomb/cut22/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCcomb/cut22/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCcomb/cut22/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCcomb/cut22/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCcomb/cut22/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCcomb/cut22/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - - // cut29 MC - registryMC.add("controlMCtrue/cut29/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registryMC.add("controlMCtrue/cut29/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut29/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); - registryMC.add("controlMCtrue/cut29/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); - registryMC.add("controlMCtrue/cut29/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCtrue/cut29/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCtrue/cut29/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCtrue/cut29/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCtrue/cut29/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCtrue/cut29/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCtrue/cut29/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCtrue/cut29/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); - registryMC.add("controlMCtrue/cut29/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCtrue/cut29/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registryMC.add("controlMCtrue/cut29/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); - // registryMC.add("controlMCtrue/cut29/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // - registryMC.add("controlMCcomb/cut29/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCcomb/cut29/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCcomb/cut29/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCcomb/cut29/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCcomb/cut29/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCcomb/cut29/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCcomb/cut29/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCcomb/cut29/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCcomb/cut29/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - - // cut26 MC - registryMC.add("controlMCtrue/cut26/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registryMC.add("controlMCtrue/cut26/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut26/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); - registryMC.add("controlMCtrue/cut26/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); - registryMC.add("controlMCtrue/cut26/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCtrue/cut26/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCtrue/cut26/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCtrue/cut26/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCtrue/cut26/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCtrue/cut26/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCtrue/cut26/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCtrue/cut26/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); - registryMC.add("controlMCtrue/cut26/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCtrue/cut26/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registryMC.add("controlMCtrue/cut26/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); - // registryMC.add("controlMCtrue/cut26/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // - registryMC.add("controlMCcomb/cut26/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCcomb/cut26/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCcomb/cut26/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCcomb/cut26/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCcomb/cut26/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCcomb/cut26/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCcomb/cut26/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCcomb/cut26/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCcomb/cut26/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - - // cut30 MC - registryMC.add("controlMCtrue/cut30/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registryMC.add("controlMCtrue/cut30/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut30/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); - registryMC.add("controlMCtrue/cut30/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); - registryMC.add("controlMCtrue/cut30/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCtrue/cut30/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCtrue/cut30/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCtrue/cut30/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCtrue/cut30/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCtrue/cut30/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCtrue/cut30/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCtrue/cut30/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); - registryMC.add("controlMCtrue/cut30/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCtrue/cut30/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registryMC.add("controlMCtrue/cut30/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); - // registryMC.add("controlMCtrue/cut30/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // - registryMC.add("controlMCcomb/cut30/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCcomb/cut30/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCcomb/cut30/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCcomb/cut30/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCcomb/cut30/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCcomb/cut30/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCcomb/cut30/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCcomb/cut30/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCcomb/cut30/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - - // cut27 MC - registryMC.add("controlMCtrue/cut27/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registryMC.add("controlMCtrue/cut27/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut27/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); - registryMC.add("controlMCtrue/cut27/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); - registryMC.add("controlMCtrue/cut27/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCtrue/cut27/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCtrue/cut27/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCtrue/cut27/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCtrue/cut27/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCtrue/cut27/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCtrue/cut27/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCtrue/cut27/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); - registryMC.add("controlMCtrue/cut27/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCtrue/cut27/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registryMC.add("controlMCtrue/cut27/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); - // registryMC.add("controlMCtrue/cut27/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // - registryMC.add("controlMCcomb/cut27/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCcomb/cut27/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCcomb/cut27/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCcomb/cut27/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCcomb/cut27/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCcomb/cut27/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCcomb/cut27/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCcomb/cut27/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCcomb/cut27/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - - // //cut31 MC - // registryMC.add("controlMCtrue/cut31/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registryMC.add("controlMCtrue/cut31/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - // registryMC.add("controlMCtrue/cut31/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); - // registryMC.add("controlMCtrue/cut31/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); - // registryMC.add("controlMCtrue/cut31/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - // registryMC.add("controlMCtrue/cut31/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - // registryMC.add("controlMCtrue/cut31/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - // registryMC.add("controlMCtrue/cut31/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - // registryMC.add("controlMCtrue/cut31/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - // registryMC.add("controlMCtrue/cut31/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - // registryMC.add("controlMCtrue/cut31/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - // registryMC.add("controlMCtrue/cut31/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); - // registryMC.add("controlMCtrue/cut31/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registry1MC.add("controlMCtrue/cut31/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // // registryMC.add("controlMCtrue/cut31/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); - // // registryMC.add("controlMCtrue/cut31/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // // - // registryMC.add("controlMCcomb/cut31/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - // registryMC.add("controlMCcomb/cut31/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - // registryMC.add("controlMCcomb/cut31/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - // registryMC.add("controlMCcomb/cut31/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - // registryMC.add("controlMCcomb/cut31/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - // registryMC.add("controlMCcomb/cut31/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - // registryMC.add("controlMCcomb/cut31/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - // registryMC.add("controlMCcomb/cut31/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registry1MC.add("controlMCcomb/cut31/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - - // //cut32 MC - // registryMC.add("controlMCtrue/cut32/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registryMC.add("controlMCtrue/cut32/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - // registryMC.add("controlMCtrue/cut32/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); - // registryMC.add("controlMCtrue/cut32/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); - // registryMC.add("controlMCtrue/cut32/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - // registryMC.add("controlMCtrue/cut32/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - // registryMC.add("controlMCtrue/cut32/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - // registryMC.add("controlMCtrue/cut32/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - // registryMC.add("controlMCtrue/cut32/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - // registryMC.add("controlMCtrue/cut32/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - // registryMC.add("controlMCtrue/cut32/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - // registryMC.add("controlMCtrue/cut32/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); - // registryMC.add("controlMCtrue/cut32/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registry1MC.add("controlMCtrue/cut32/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // // registryMC.add("controlMCtrue/cut32/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); - // // registryMC.add("controlMCtrue/cut32/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // // - // registryMC.add("controlMCcomb/cut32/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - // registryMC.add("controlMCcomb/cut32/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - // registryMC.add("controlMCcomb/cut32/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - // registryMC.add("controlMCcomb/cut32/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - // registryMC.add("controlMCcomb/cut32/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - // registryMC.add("controlMCcomb/cut32/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - // registryMC.add("controlMCcomb/cut32/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - // registryMC.add("controlMCcomb/cut32/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registry1MC.add("controlMCcomb/cut32/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - - // cut33 MC - registryMC.add("controlMCtrue/cut33/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registryMC.add("controlMCtrue/cut33/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut33/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); - registryMC.add("controlMCtrue/cut33/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); - registryMC.add("controlMCtrue/cut33/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCtrue/cut33/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCtrue/cut33/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCtrue/cut33/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCtrue/cut33/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCtrue/cut33/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCtrue/cut33/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCtrue/cut33/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); - registryMC.add("controlMCtrue/cut33/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCtrue/cut33/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registryMC.add("controlMCtrue/cut33/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); - // registryMC.add("controlMCtrue/cut33/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // - registryMC.add("controlMCcomb/cut33/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCcomb/cut33/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCcomb/cut33/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCcomb/cut33/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCcomb/cut33/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCcomb/cut33/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCcomb/cut33/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCcomb/cut33/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCcomb/cut33/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - - // cut34 MC - // registryMC.add("controlMCtrue/cut34/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registryMC.add("controlMCtrue/cut34/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {axisInvMass4trk}}); - registryMC.add("controlMCtrue/cut34/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut34/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); - registryMC.add("controlMCtrue/cut34/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); - registryMC.add("controlMCtrue/cut34/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCtrue/cut34/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCtrue/cut34/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCtrue/cut34/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCtrue/cut34/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCtrue/cut34/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCtrue/cut34/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCtrue/cut34/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); - registryMC.add("controlMCtrue/cut34/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCtrue/cut34/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registryMC.add("controlMCtrue/cut34/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); - // registryMC.add("controlMCtrue/cut34/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // - registryMC.add("controlMCcomb/cut34/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCcomb/cut34/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCcomb/cut34/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCcomb/cut34/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCcomb/cut34/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCcomb/cut34/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCcomb/cut34/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCcomb/cut34/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCcomb/cut34/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - - // cut35 MC - // registryMC.add("controlMCtrue/cut34/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registryMC.add("controlMCtrue/cut35/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {axisInvMass4trk}}); - registryMC.add("controlMCtrue/cut35/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut35/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); - registryMC.add("controlMCtrue/cut35/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); - registryMC.add("controlMCtrue/cut35/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCtrue/cut35/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCtrue/cut35/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCtrue/cut35/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCtrue/cut35/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCtrue/cut35/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCtrue/cut35/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCtrue/cut35/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); - registryMC.add("controlMCtrue/cut35/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCtrue/cut35/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registryMC.add("controlMCtrue/cut35/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); - // registryMC.add("controlMCtrue/cut35/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // - registryMC.add("controlMCcomb/cut35/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCcomb/cut35/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCcomb/cut35/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCcomb/cut35/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCcomb/cut35/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCcomb/cut35/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCcomb/cut35/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCcomb/cut35/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCcomb/cut35/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - - // cut23 MC - registryMC.add("controlMCtrue/cut23/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registryMC.add("controlMCtrue/cut23/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut23/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); - registryMC.add("controlMCtrue/cut23/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); - registryMC.add("controlMCtrue/cut23/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCtrue/cut23/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCtrue/cut23/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCtrue/cut23/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCtrue/cut23/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCtrue/cut23/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCtrue/cut23/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCtrue/cut23/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); - registryMC.add("controlMCtrue/cut23/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCtrue/cut23/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // registryMC.add("controlMCtrue/cut23/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); - // registryMC.add("controlMCtrue/cut23/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - // - registryMC.add("controlMCcomb/cut23/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); - registryMC.add("controlMCcomb/cut23/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCcomb/cut23/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); - registryMC.add("controlMCcomb/cut23/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); - registryMC.add("controlMCcomb/cut23/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); - registryMC.add("controlMCcomb/cut23/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); - registryMC.add("controlMCcomb/cut23/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); - registryMC.add("controlMCcomb/cut23/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry1MC.add("controlMCcomb/cut23/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); - - // ptSpectrum of electron for MC true and combinatorics - registryMC.add("controlMCtrue/cut0/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut20/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut21/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut22/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut23/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut24/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut25/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut26/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut27/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut28/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut29/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut30/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut31/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - // registryMC.add("controlMCtrue/cut32/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut33/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut34/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCtrue/cut35/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - - registryMC.add("controlMCcomb/cut0/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); - registryMC.add("controlMCcomb/cut20/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCcomb/cut21/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCcomb/cut22/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCcomb/cut23/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCcomb/cut24/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCcomb/cut25/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCcomb/cut26/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCcomb/cut27/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCcomb/cut28/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCcomb/cut29/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCcomb/cut30/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCcomb/cut31/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCcomb/cut32/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCcomb/cut33/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCcomb/cut34/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - registryMC.add("controlMCcomb/cut35/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); - // zrobic hpTspectrumEl dla cut 0,20-35: registry.get(HIST("global/hFinalPtSpectrumEl"))->Fill(tmpPt[i]); - - // tau - registryMC.add("tauMC/hMCeta", ";#eta^{#tau};N^{#tau} ", {HistType::kTH1F, {{100, -5., 5.}}}); - registryMC.add("tauMC/hMCy", ";y^{#tau};N^{#tau}", {HistType::kTH1F, {{100, -5., 5.}}}); - registryMC.add("tauMC/hMCphi", ";#phi^{#tau};N^{#tau}", {HistType::kTH1F, {{100, 0., 6.4}}}); - registryMC.add("tauMC/hMCpt", ";#it{p}_{T}^{#tau};N^{#tau}", {HistType::kTH1F, {{100, 0., 10.}}}); - - registryMC.add("tauMC/hMCdeltaeta", ";#Delta#eta^{#tau};events ", {HistType::kTH1F, {{100, -5., 5.}}}); - registryMC.add("tauMC/hMCdeltaphi", ";#Delta#phi^{#tau}(deg.);events", {HistType::kTH1F, {{100, 131., 181}}}); + if (doprocessEfficiencyMCSG) { + registry1MC.add("globalMC/hGeneratorID", ";Generator ID;events", {HistType::kTH1F, {{100, 0., 1000.}}}); + registryMC.add("globalMC/hMCZvertex", ";V_{Z}^{MC} (cm);events", {HistType::kTH1F, {{100, -25., 25.}}}); + registryMC.add("globalMC/hMCefficiency", ";Cut Number;events", {HistType::kTH1F, {{20, 0., 20.}}}); + registryMC.add("globalMC/hMCnPart", ";N_{part};Type;events", {HistType::kTH2F, {{25, 0., 25.}, {10, 0, 10}}}); + registryMC.add("globalMC/hMCetaGen", ";#eta^{gen};N^{MC particles}", {HistType::kTH1F, {{100, -5., 5.}}}); + registryMC.add("globalMC/hMCphiGen", ";#phi^{gen};N^{MC particles}", {HistType::kTH1F, {{100, 0., 6.4}}}); + registryMC.add("globalMC/hMCyGen", ";y^{gen};N^{MC particles}", {HistType::kTH1F, {{100, -5., 5.}}}); + registryMC.add("globalMC/hMCptGen", ";p_{T}^{gen};N^{MC particles}", {HistType::kTH1F, {{100, 0., 4.}}}); + + // MC reconstructed with information from MC true + registryMC.add("globalMCrec/hMCetaGenCol", ";#eta^{genCol};events", {HistType::kTH1F, {{100, -5., 5.}}}); + registryMC.add("globalMCrec/hMCphiGenCol", ";#phi^{genCol};events", {HistType::kTH1F, {{100, 0., 6.4}}}); + registryMC.add("globalMCrec/hMCyGenCol", ";y^{genCol};events", {HistType::kTH1F, {{100, -5., 5.}}}); + registryMC.add("globalMCrec/hMCptGenCol", ";p_{T}^{genCol};events", {HistType::kTH1F, {{100, 0., 4.}}}); + + registryMC.add("globalMCrec/GapSide", "Associated gap side; gap index; Collisions", {HistType::kTH1F, {{5, -1, 4}}}); + registryMC.add("globalMCrec/GapSideTrue", "Recalculated gap side; gap index; Collisions", {HistType::kTH1F, {{5, -1, 4}}}); + registryMC.add("globalMCrec/hVertexXY", "Vertex position in x and y direction; #it{V}_{x} (cm); #it{V}_{y} (cm); Collisions", {HistType::kTH2F, {{50, -0.05, 0.05}, {50, -0.02, 0.02}}}); + registryMC.add("globalMCrec/hVertexZ", "Vertex position in z direction; #it{V}_{z} (cm); Collisions", {HistType::kTH1F, {{100, -25., 25.}}}); + registryMC.add("globalMCrec/hNTracks", ";N_{tracks};events", {HistType::kTH1D, {{20, 0., 20.}}}); + registryMC.add("globalMCrec/hNTracksPV", ";N_{tracks,PV};events", {HistType::kTH1D, {{20, 0., 20.}}}); + registryMC.add("globalMCrec/hNGhostTracks", ";N_{tracks};events", {HistType::kTH1D, {{10, 0., 10.}}}); + registryMC.add("globalMCrec/hNGhostTracksPV", ";N_{tracks,PV};events", {HistType::kTH1D, {{10, 0., 10.}}}); + registryMC.add("globalMCrec/hQtot", ";Q_{tot};events", {HistType::kTH1F, {{10, -5., 5.}}}); + registryMC.add("globalMCrec/hTrackToMCMatch", ";Match};events", {HistType::kTH1F, {{2, 0., 2.}}}); + registryMC.add("globalMCrec/hZNACenergy", "ZNA vs ZNC energy; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("globalMCrec/hZNACtime", "ZNA vs ZNC time; #it{time}_{ZNA} (ns); #it{time}_{ZNC} (ns); Collisions", {HistType::kTH2F, {{100, -10., 10.}, {100, -10., 10.}}}); + + registry1MC.add("globalMCrec/hRecFlag", ";Reconstruction Flag;events", {HistType::kTH1F, {{10, 0., 10.}}}); + registry1MC.add("globalMCrec/hOccupancyInTime", ";Occupancy;events", {HistType::kTH1F, {{100, 0., 10000.}}}); + + // registryMC.add("globalMCrec/hPtSpectrumElGen0", "Gen.;p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}});//effiEl = 3 // hpTelec + // registryMC.add("globalMCrec/hPtSpectrumElGen1", "Gen.;p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}});//effiEl = 4, but still on MC sample + registryMC.add("globalMCrec/hPtSpectrumElRec0", "Rec0;#it{p}_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); // effiEl = 4, reconstruction + registryMC.add("globalMCrec/hPtSpectrumElRec1", "Rec1;#it{p}_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); // effiEl = 7, SGProducer + registryMC.add("globalMCrec/hPtSpectrumElRec2", "Rec2;#it{p}_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); // effiEl = 9, DoubleGap + registryMC.add("globalMCrec/hPtSpectrumElRec3", "Rec3;#it{p}_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); // effiEl = 11, PVtracks=4 + registryMC.add("globalMCrec/hPtSpectrumElRec4", "Rec4;#it{p}_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); // effiEl = 13, Zvertex + registryMC.add("globalMCrec/hPtSpectrumElRec5", "Rec5;#it{p}_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); // effiEl = 15, eta acceptance + registryMC.add("globalMCrec/hPtSpectrumElRec6", "Rec6;#it{p}_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); // effiEl = 17, pT threshold + registryMC.add("globalMCrec/hPtSpectrumElRec7", "Rec7;#it{p}_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); // effiEl = 19, Qtot + registryMC.add("globalMCrec/hPtSpectrumElRec8", "Rec8;#it{p}_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); // effiEl = 21, NTOF>0 + registryMC.add("globalMCrec/hPtSpectrumElRec9", "Rec9;#it{p}_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); // effiEl = 23, FIT empty + + // global1 when we require SGProducer + double gap + nPVtracks=4 + registryMC.add("global1MCrec/hVertexZ", "Vertex position in z direction; #it{V}_{z} (cm); Collisions", {HistType::kTH1F, {{100, -25., 25.}}}); + registryMC.add("global1MCrec/hNTracks", ";N_{tracks};events", {HistType::kTH1D, {{20, 0., 20.}}}); + registryMC.add("global1MCrec/hNTracksPV", ";N_{tracks,PV};events", {HistType::kTH1D, {{20, 0., 20.}}}); + registryMC.add("global1MCrec/hTrackPtPV", ";p_T^{trk}; Entries", {HistType::kTH1F, {axispt}}); + registryMC.add("global1MCrec/hTrackEtaPhiPV", ";Eta;Phi;", {HistType::kTH2D, {axiseta, {128, -0.05, 6.35}}}); + registryMC.add("global1MCrec/hTrackPVTotCharge", "Q_{Tot};Q_{Tot}; Entries", {HistType::kTH1F, {{11, -5, 6}}}); + + registryMC.add("global1MCrec/hpTGenRecTracksPV", ";p_{T}^{Rec. tracks,PV} (GeV/c);p_{T}^{Gen} (GeV/c);events", {HistType::kTH2D, {{100, 0., 4.}, {100, 0., 4.}}}); + registryMC.add("global1MCrec/hDeltapTGenRecVsRecpTTracksPV", ";#Delta p_{T}^{Rec.-Gen. tracks,PV} (GeV/c);p_{T}^{Rec. tracks,PV} (GeV/c);events", {HistType::kTH2D, {{100, -4., 4.}, {100, 0., 4.}}}); + registryMC.add("global1MCrec/hEtaGenRecTracksPV", ";#eta^{Rec. tracks,PV} (GeV/c);#eta^{Gen} (GeV/c);events", {HistType::kTH2D, {{100, -2., 2.}, {100, -2., 2.}}}); + registryMC.add("global1MCrec/hDeltaEtaGenRecVsRecpTTracksPV", ";#Delta #eta^{Rec.-Gen. tracks,PV} (GeV/c);p_{T}^{Rec. tracks,PV} (GeV/c);events", {HistType::kTH2D, {{100, -0.25, 0.25}, {100, 0., 4.}}}); + registryMC.add("global1MCrec/hPhiGenRecTracksPV", ";#phi^{Rec. tracks,PV} (GeV/c);#phi^{Gen} (GeV/c);events", {HistType::kTH2D, {{100, 0., 6.4}, {100, 0., 6.4}}}); + registryMC.add("global1MCrec/hDeltaPhiGenRecVsRecpTTracksPV", ";#Delta #phi^{Rec.-Gen. tracks,PV} (GeV/c);p_{T}^{Rec. tracks,PV} (GeV/c);events", {HistType::kTH2D, {{100, -0.5, 0.5}, {100, 0., 4.}}}); + + // pid El in MC true + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut0", "In hip ;#it{p}_{trk}(GeV/#it{c});dE/dx_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut1", "All hip;#it{p}_{trk}(GeV/#it{c});dE/dx_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + // pid separately for each cut (what we reject) + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut2", "rejected, IM hip; #it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut3", "rejected, DP hip; #it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut4", "rejected, El hip; #it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut5", "rejected, vPi hip;#it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut6", "rejected, Pt hip; #it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut7", "rejected, vVc hip;#it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut8", "rejected, pTot hip;#it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut9", "rejected, vPr hip;#it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut10", "rejected, vKa hip;#it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut11", "rejected, nCR hip;#it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut12", "rejected, s3pi hip;#it{p}_{trk} (GeV/#it{c}); d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + // pid sequentialy + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut20", "El hip; #it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut33", "eTOF+20 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut21", "vPi+33 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut24", "vPr+21 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut25", "vKa+24 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut28", "CR+25 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut22", "vVc+28 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut29", "s3pi+22 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut26", "IM+29 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut34", "piTOF+26 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut30", "ptTot+34 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut27", "DP+30 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut35", "ZDC+27 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut23", "Occ+35 hip; #it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + + // registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut31", "FIT+27 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + // registryMC.add("pidTPCMCEltrue/hpvsdedxElHipCut32", "TOF+31 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + + // pid Pi in MC true + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut0", "In hip ;#it{p}_{trk}(GeV/#it{c});dE/dx_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut20", "El hip; #it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut33", "eTOF+20 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut21", "vPi+33 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut24", "vPr+21 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut25", "vKa+24 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut28", "CR+25 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut22", "vVc+28 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut29", "s3pi+22 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut26", "IM+29 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut34", "piTOF+26 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut30", "ptTot+34 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut27", "DP+30 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut35", "ZDC+27 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut23", "Occ+35 hip; #it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + + // registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut31", "FIT+27 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + // registryMC.add("pidTPCMCPitrue/hpvsdedxElHipCut32", "TOF+31 hip;#it{p}_{trk} (GeV/#it{c});d#it{E}/d#it{x}_{trk}", {HistType::kTH2F, {axisp, dedxAxis}}); + + // El PID in TOF MC true + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut0", "In hip ;#it{p}_{trk}(GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut20", "El hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut33", "eTOF+20 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut21", "vPi+33 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut24", "vPr+21 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut25", "vKa+24 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut28", "CR+25 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut22", "vVc+28 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut29", "s3pi+22 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut26", "IM+29 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut34", "piTOF+26 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut30", "ptTot+34 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut27", "DP+30 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut35", "ZDC+27 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + registry1MC.add("pidTOFMCEltrue/hpvsNsigmaElHipCut23", "Occ+27 hip;#it{p}_{trk} (GeV/#it{c});N#sigma El^{TOF}_{trk}", {HistType::kTH2F, {axisp, {100, -5., 5.}}}); + + // cut0 + registryMC.add("controlMCtrue/cut0/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut0/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut0/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut0/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut0/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut0/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut0/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut0/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut0/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut0/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut0/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut0/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut0/hsigma3PiNew", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut0/hsigma2PiNew", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}};#sigma^{2#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut0/hsigma1PiNew", "#sqrt{#sigma_{1}^{2 }};#sigma^{1#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + registryMC.add("controlMCtrue/cut0/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + registryMC.add("controlMCtrue/cut0/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut0/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registry1MC.add("controlMCtrue/cut0/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut0/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut0/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut0/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut0/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut0/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut0/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut0/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCcomb/cut0/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registry1MC.add("controlMCcomb/cut0/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // cut20 MC + registryMC.add("controlMCtrue/cut20/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut20/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut20/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut20/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut20/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut20/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut20/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut20/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut20/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut20/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut20/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut20/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut20/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut20/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut20/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut20/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut20/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut20/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut20/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut20/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut20/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut20/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut20/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut20/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut20/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // cut21 MC + registryMC.add("controlMCtrue/cut21/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut21/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut21/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut21/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut21/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut21/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut21/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut21/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut21/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut21/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut21/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut21/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut21/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut21/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut21/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut21/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut21/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut21/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut21/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut21/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut21/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut21/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut21/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut21/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut21/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // cut24 MC + registryMC.add("controlMCtrue/cut24/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut24/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut24/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut24/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut24/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut24/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut24/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut24/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut24/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut24/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut24/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut24/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut24/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut24/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut24/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut24/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut24/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut24/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut24/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut24/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut24/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut24/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut24/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut24/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut24/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // cut25 MC + registryMC.add("controlMCtrue/cut25/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut25/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut25/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut25/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut25/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut25/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut25/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut25/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut25/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut25/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut25/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut25/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut25/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut25/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut25/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut25/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut25/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut25/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut25/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut25/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut25/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut25/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut25/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut25/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut25/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // cut28 MC + registryMC.add("controlMCtrue/cut28/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut28/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut28/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut28/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut28/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut28/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut28/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut28/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut28/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut28/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut28/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut28/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut28/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut28/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut28/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut28/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut28/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut28/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut28/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut28/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut28/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut28/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut28/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut28/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut28/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // cut22 MC + registryMC.add("controlMCtrue/cut22/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut22/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut22/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut22/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut22/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut22/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut22/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut22/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut22/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut22/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut22/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut22/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut22/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut22/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut22/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut22/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut22/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut22/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut22/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut22/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut22/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut22/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut22/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut22/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut22/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // cut29 MC + registryMC.add("controlMCtrue/cut29/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut29/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut29/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut29/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut29/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut29/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut29/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut29/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut29/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut29/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut29/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut29/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut29/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut29/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut29/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut29/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut29/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut29/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut29/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut29/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut29/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut29/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut29/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut29/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut29/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // cut26 MC + registryMC.add("controlMCtrue/cut26/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut26/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut26/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut26/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut26/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut26/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut26/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut26/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut26/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut26/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut26/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut26/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut26/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut26/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut26/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut26/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut26/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut26/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut26/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut26/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut26/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut26/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut26/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut26/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut26/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // cut30 MC + registryMC.add("controlMCtrue/cut30/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut30/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut30/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut30/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut30/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut30/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut30/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut30/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut30/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut30/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut30/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut30/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut30/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut30/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut30/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut30/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut30/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut30/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut30/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut30/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut30/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut30/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut30/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut30/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut30/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // cut27 MC + registryMC.add("controlMCtrue/cut27/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut27/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut27/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut27/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut27/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut27/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut27/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut27/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut27/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut27/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut27/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut27/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut27/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut27/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut27/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut27/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut27/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut27/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut27/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut27/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut27/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut27/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut27/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut27/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut27/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // //cut31 MC + // registryMC.add("controlMCtrue/cut31/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut31/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + // registryMC.add("controlMCtrue/cut31/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + // registryMC.add("controlMCtrue/cut31/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + // registryMC.add("controlMCtrue/cut31/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + // registryMC.add("controlMCtrue/cut31/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + // registryMC.add("controlMCtrue/cut31/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + // registryMC.add("controlMCtrue/cut31/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + // registryMC.add("controlMCtrue/cut31/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + // registryMC.add("controlMCtrue/cut31/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + // registryMC.add("controlMCtrue/cut31/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + // registryMC.add("controlMCtrue/cut31/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + // registryMC.add("controlMCtrue/cut31/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registry1MC.add("controlMCtrue/cut31/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // // registryMC.add("controlMCtrue/cut31/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // // registryMC.add("controlMCtrue/cut31/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // // + // registryMC.add("controlMCcomb/cut31/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + // registryMC.add("controlMCcomb/cut31/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + // registryMC.add("controlMCcomb/cut31/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + // registryMC.add("controlMCcomb/cut31/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + // registryMC.add("controlMCcomb/cut31/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + // registryMC.add("controlMCcomb/cut31/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + // registryMC.add("controlMCcomb/cut31/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + // registryMC.add("controlMCcomb/cut31/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registry1MC.add("controlMCcomb/cut31/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // //cut32 MC + // registryMC.add("controlMCtrue/cut32/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut32/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + // registryMC.add("controlMCtrue/cut32/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + // registryMC.add("controlMCtrue/cut32/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + // registryMC.add("controlMCtrue/cut32/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + // registryMC.add("controlMCtrue/cut32/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + // registryMC.add("controlMCtrue/cut32/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + // registryMC.add("controlMCtrue/cut32/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + // registryMC.add("controlMCtrue/cut32/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + // registryMC.add("controlMCtrue/cut32/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + // registryMC.add("controlMCtrue/cut32/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + // registryMC.add("controlMCtrue/cut32/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + // registryMC.add("controlMCtrue/cut32/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registry1MC.add("controlMCtrue/cut32/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // // registryMC.add("controlMCtrue/cut32/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // // registryMC.add("controlMCtrue/cut32/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // // + // registryMC.add("controlMCcomb/cut32/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + // registryMC.add("controlMCcomb/cut32/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + // registryMC.add("controlMCcomb/cut32/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + // registryMC.add("controlMCcomb/cut32/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + // registryMC.add("controlMCcomb/cut32/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + // registryMC.add("controlMCcomb/cut32/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + // registryMC.add("controlMCcomb/cut32/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + // registryMC.add("controlMCcomb/cut32/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registry1MC.add("controlMCcomb/cut32/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // cut33 MC + registryMC.add("controlMCtrue/cut33/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut33/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut33/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut33/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut33/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut33/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut33/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut33/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut33/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut33/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut33/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut33/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut33/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut33/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut33/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut33/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut33/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut33/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut33/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut33/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut33/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut33/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut33/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut33/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut33/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // cut34 MC + // registryMC.add("controlMCtrue/cut34/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut34/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {axisInvMass4trk}}); + registryMC.add("controlMCtrue/cut34/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut34/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut34/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut34/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut34/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut34/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut34/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut34/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut34/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut34/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut34/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut34/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut34/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut34/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut34/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut34/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut34/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut34/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut34/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut34/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut34/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut34/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut34/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut34/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // cut35 MC + // registryMC.add("controlMCtrue/cut34/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut35/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {axisInvMass4trk}}); + registryMC.add("controlMCtrue/cut35/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut35/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut35/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut35/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut35/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut35/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut35/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut35/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut35/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut35/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut35/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut35/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut35/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut35/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut35/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut35/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut35/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut35/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut35/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut35/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut35/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut35/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut35/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut35/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // cut23 MC + registryMC.add("controlMCtrue/cut23/h4piMass", "4#pi mass;M_{inv}^{4#pi} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registryMC.add("controlMCtrue/cut23/h4trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut23/h4trkMassVsPt", "4-track mass vs Pt;M_{inv}^{4track} (GeV/c^{2});p_{T}^{4track} (GeV/c);entries", {HistType::kTH2F, {{100, 1, 5.}, axispt}}); + registryMC.add("controlMCtrue/cut23/hZNACenergy", "ZNA vs ZNC energy, cut0; #it{E}_{ZNA} (GeV); #it{E}_{ZNC} (GeV); Collisions", {HistType::kTH2F, {axisZDC, axisZDC}}); + registryMC.add("controlMCtrue/cut23/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCtrue/cut23/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCtrue/cut23/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCtrue/cut23/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCtrue/cut23/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCtrue/cut23/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCtrue/cut23/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCtrue/cut23/h3piMassVsPt", "3#pi mass vs Pt, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});p_{T}^{3#pi} (GeV/c);entries", {HistType::kTH2F, {minvAxis, axispt}}); + registryMC.add("controlMCtrue/cut23/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCtrue/cut23/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // registryMC.add("controlMCtrue/cut23/hNtofTrk", ";N_{TOF trk}; Entries", {HistType::kTH1F, {{7, 0., 7.}}}); + // registryMC.add("controlMCtrue/cut23/h3pi1eMass", "3#pi+e mass;M_{inv}^{3#pi+e} (GeV/c^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); + // + registryMC.add("controlMCcomb/cut23/h3piMass", "3#pi mass, up to 4 entries per event ;M_{inv}^{3#pi} (GeV/c^{2});entries", {HistType::kTH1F, {minvAxis}}); + registryMC.add("controlMCcomb/cut23/h3trkPtTot", ";p_{T} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut23/hDeltaPhi13topo", "#Delta #varphi 1+3 topo, 4 entries/event;#Delta#varphi^{1+3};entries", {HistType::kTH1F, {phiAxis}}); + registryMC.add("controlMCcomb/cut23/h13AssymPt1ProngAver", ";Delta Pt/Sum Pt (1Prong,Aver Pt)", {HistType::kTH1F, {{100, -1., 1.}}}); + registryMC.add("controlMCcomb/cut23/h13Vector", ";A_{V};entries", {HistType::kTH1F, {vectorAxis}}); + registryMC.add("controlMCcomb/cut23/h13Scalar", ";A_{S};entries", {HistType::kTH1F, {scalarAxis}}); + registryMC.add("controlMCcomb/cut23/hTPCnCrossedRows", "N crossed rows ;N_{TPC,crossed rows};entries", {HistType::kTH1F, {{160, 0, 160.}}}); + registryMC.add("controlMCcomb/cut23/hsigma3Pi", "#sqrt{#sigma_{1}^{2 }+#sigma_{2}^{2}+#sigma_{3}^{2}};#sigma^{3#pi};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + registry1MC.add("controlMCcomb/cut23/hTofChi2El", ";TOF #chi^{2};entries", {HistType::kTH1F, {{100, 0., 10.}}}); + + // ptSpectrum of electron for MC true and combinatorics + registryMC.add("controlMCtrue/cut0/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut20/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut21/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut22/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut23/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut24/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut25/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut26/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut27/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut28/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut29/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut30/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut31/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + // registryMC.add("controlMCtrue/cut32/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut33/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut34/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCtrue/cut35/hPtSpectrumEl", ";p_{T}^{e} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + + registryMC.add("controlMCcomb/cut0/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {ptAxis}}); + registryMC.add("controlMCcomb/cut20/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut21/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut22/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut23/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut24/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut25/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut26/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut27/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut28/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut29/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut30/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut31/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut32/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut33/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut34/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + registryMC.add("controlMCcomb/cut35/hPtSpectrumEl", ";p_{T}^{comb} (GeV/c);entries", {HistType::kTH1F, {axispt}}); + // zrobic hpTspectrumEl dla cut 0,20-35: registry.get(HIST("global/hFinalPtSpectrumEl"))->Fill(tmpPt[i]); + + // tau + registryMC.add("tauMC/hMCeta", ";#eta^{#tau};N^{#tau} ", {HistType::kTH1F, {{100, -5., 5.}}}); + registryMC.add("tauMC/hMCy", ";y^{#tau};N^{#tau}", {HistType::kTH1F, {{100, -5., 5.}}}); + registryMC.add("tauMC/hMCphi", ";#phi^{#tau};N^{#tau}", {HistType::kTH1F, {{100, 0., 6.4}}}); + registryMC.add("tauMC/hMCpt", ";#it{p}_{T}^{#tau};N^{#tau}", {HistType::kTH1F, {{100, 0., 10.}}}); + + registryMC.add("tauMC/hMCdeltaeta", ";#Delta#eta^{#tau};events ", {HistType::kTH1F, {{100, -5., 5.}}}); + registryMC.add("tauMC/hMCdeltaphi", ";#Delta#phi^{#tau}(deg.);events", {HistType::kTH1F, {{100, 131., 181}}}); + + // electron + registryMC.add("electronMC/hMCeta", ";#eta^{e};N^{e}", {HistType::kTH1F, {{100, -5., 5.}}}); + registryMC.add("electronMC/hMCy", ";y^{e};N^{e}", {HistType::kTH1F, {{100, -5., 5.}}}); + registryMC.add("electronMC/hMCphi", ";#phi^{e};N^{e}", {HistType::kTH1F, {{100, 0., 6.4}}}); + registryMC.add("electronMC/hMCpt", ";#it{p}_{T}^{e};N^{e}", {HistType::kTH1F, {{400, 0., 10.}}}); + + // efficiency mu + registryMC.add("efficiencyMCMu/effiMu", ";Efficiency #mu3#pi;events", {HistType::kTH1F, {{20, 0., 20.}}}); + registryMC.add("efficiencyMCMu/hpTmuon", ";p_{T}^{#mu, gen} (GeV/c);events", {HistType::kTH1F, {{200, 0., 5.}}}); + + // efficiency pi + registryMC.add("efficiencyMCPi/effiPi", ";Efficiency #pi3#pi;events", {HistType::kTH1F, {{20, 0., 20.}}}); + registryMC.add("efficiencyMCPi/hpTpi", ";p_{T}^{#pi, gen} (GeV/c);events", {HistType::kTH1F, {{200, 0., 5.}}}); + + // efficiency el + registryMC.add("efficiencyMCEl/effiEl", ";Efficiency e3#pi;events", {HistType::kTH1F, {{70, 0., 70.}}}); + registryMC.add("efficiencyMCEl/hpTelec", ";p_{T}^{e, gen} (GeV/c);events", {HistType::kTH1F, {axispt}}); + + // efficiency el + registryMC.add("efficiencyMCEl/hMCdeltaAlphaEpi", ";#Delta#alpha^{e-#pi(3x), gen} (rad);events", {HistType::kTH1F, {{100, -0.1, 3.2}}}); + registryMC.add("efficiencyMCEl/hMCdeltaAlphaPiPi", ";#Delta#alpha^{#pi-#pi(3x), gen} (rad);events", {HistType::kTH1F, {{100, -0.1, 3.2}}}); + registryMC.add("efficiencyMCEl/hMCdeltaPhiEpi", ";#Delta#phi^{e-#pi(3x), gen} (rad);events", {HistType::kTH1F, {{100, -0.1, 3.2}}}); + registryMC.add("efficiencyMCEl/hMCdeltaPhiPipi", ";#Delta#phi^{#pi-#pi(3x), gen} (rad);events", {HistType::kTH1F, {{100, -0.1, 3.2}}}); + registryMC.add("efficiencyMCEl/hMCvirtCal", ";virt Cal. #Delta #alpha^{#pi-#pi(3x), gen} (rad);events", {HistType::kTH1F, {{100, 0., 2.}}}); + registryMC.add("efficiencyMCEl/hMCScalar", ";A_{S}^{#pi-#pi(3x), gen};events", {HistType::kTH1F, {{100, 0., 1.}}}); + registryMC.add("efficiencyMCEl/hMCVector", ";A_{V}^{#pi-#pi(3x), gen};events", {HistType::kTH1F, {{100, 0., 2.}}}); + + // missing eta vs phi + registryMC.add("efficiencyMCEl/hMCptEl", ";p_{T}^{e, true} (GeV/c) ;events", {HistType::kTH1F, {{200, 0., 5.}}}); + // registryMC.add("efficiencyMCEl/hMCpt4trk",";p_{T}^{4 MC part.} (GeV/c) ;events",{HistType::kTH1F,{{100, 0., 5.}}}); + registryMC.add("efficiencyMCEl/hMCpt4trk", ";p_{T}^{4 MC part.} (GeV/c) ;events", {HistType::kTH1F, {axispt}}); + // registryMC.add("efficiencyMCEl/hMCinvmass4pi",";M_{inv}^{4#pi true} (GeV/c^{2}) ;events",{HistType::kTH1F,{{100, 0.4, 5.4}}}); + registryMC.add("efficiencyMCEl/hMCinvmass4pi", ";M_{inv}^{4#pi true} (GeV/c^{2}) ;events", {HistType::kTH1F, {axisInvMass4trk}}); + registryMC.add("efficiencyMCEl/hMCinvmass3pi", ";M_{inv}^{3#pi true} (GeV/c^{2}) ;events", {HistType::kTH1F, {{100, 0.4, 2.4}}}); + registryMC.add("efficiencyMCEl/hMCdeltaphi13", ";#Delta#phi^{1-3 true} ;events", {HistType::kTH1F, {{100, 0., 3.2}}}); + + } // end of MC histograms processEfficiencyMCSG + + if (doprocessDoSkim) { + registrySkim.add("skim/efficiency", ";efficeincy;events", {HistType::kTH1F, {{10, 0., 10.}}}); + } - // electron - registryMC.add("electronMC/hMCeta", ";#eta^{e};N^{e}", {HistType::kTH1F, {{100, -5., 5.}}}); - registryMC.add("electronMC/hMCy", ";y^{e};N^{e}", {HistType::kTH1F, {{100, -5., 5.}}}); - registryMC.add("electronMC/hMCphi", ";#phi^{e};N^{e}", {HistType::kTH1F, {{100, 0., 6.4}}}); - registryMC.add("electronMC/hMCpt", ";#it{p}_{T}^{e};N^{e}", {HistType::kTH1F, {{400, 0., 10.}}}); - - // efficiency mu - registryMC.add("efficiencyMCMu/effiMu", ";Efficiency #mu3#pi;events", {HistType::kTH1F, {{20, 0., 20.}}}); - registryMC.add("efficiencyMCMu/hpTmuon", ";p_{T}^{#mu, gen} (GeV/c);events", {HistType::kTH1F, {{200, 0., 5.}}}); - - // efficiency pi - registryMC.add("efficiencyMCPi/effiPi", ";Efficiency #pi3#pi;events", {HistType::kTH1F, {{20, 0., 20.}}}); - registryMC.add("efficiencyMCPi/hpTpi", ";p_{T}^{#pi, gen} (GeV/c);events", {HistType::kTH1F, {{200, 0., 5.}}}); - - // efficiency el - registryMC.add("efficiencyMCEl/effiEl", ";Efficiency e3#pi;events", {HistType::kTH1F, {{70, 0., 70.}}}); - registryMC.add("efficiencyMCEl/hpTelec", ";p_{T}^{e, gen} (GeV/c);events", {HistType::kTH1F, {axispt}}); - - // efficiency el - registryMC.add("efficiencyMCEl/hMCdeltaAlphaEpi", ";#Delta#alpha^{e-#pi(3x), gen} (rad);events", {HistType::kTH1F, {{100, -0.1, 3.2}}}); - registryMC.add("efficiencyMCEl/hMCdeltaAlphaPiPi", ";#Delta#alpha^{#pi-#pi(3x), gen} (rad);events", {HistType::kTH1F, {{100, -0.1, 3.2}}}); - registryMC.add("efficiencyMCEl/hMCdeltaPhiEpi", ";#Delta#phi^{e-#pi(3x), gen} (rad);events", {HistType::kTH1F, {{100, -0.1, 3.2}}}); - registryMC.add("efficiencyMCEl/hMCdeltaPhiPipi", ";#Delta#phi^{#pi-#pi(3x), gen} (rad);events", {HistType::kTH1F, {{100, -0.1, 3.2}}}); - registryMC.add("efficiencyMCEl/hMCvirtCal", ";virt Cal. #Delta #alpha^{#pi-#pi(3x), gen} (rad);events", {HistType::kTH1F, {{100, 0., 2.}}}); - registryMC.add("efficiencyMCEl/hMCScalar", ";A_{S}^{#pi-#pi(3x), gen};events", {HistType::kTH1F, {{100, 0., 1.}}}); - registryMC.add("efficiencyMCEl/hMCVector", ";A_{V}^{#pi-#pi(3x), gen};events", {HistType::kTH1F, {{100, 0., 2.}}}); - - // missing eta vs phi - registryMC.add("efficiencyMCEl/hMCptEl", ";p_{T}^{e, true} (GeV/c) ;events", {HistType::kTH1F, {{200, 0., 5.}}}); - // registryMC.add("efficiencyMCEl/hMCpt4trk",";p_{T}^{4 MC part.} (GeV/c) ;events",{HistType::kTH1F,{{100, 0., 5.}}}); - registryMC.add("efficiencyMCEl/hMCpt4trk", ";p_{T}^{4 MC part.} (GeV/c) ;events", {HistType::kTH1F, {axispt}}); - // registryMC.add("efficiencyMCEl/hMCinvmass4pi",";M_{inv}^{4#pi true} (GeV/c^{2}) ;events",{HistType::kTH1F,{{100, 0.4, 5.4}}}); - registryMC.add("efficiencyMCEl/hMCinvmass4pi", ";M_{inv}^{4#pi true} (GeV/c^{2}) ;events", {HistType::kTH1F, {axisInvMass4trk}}); - registryMC.add("efficiencyMCEl/hMCinvmass3pi", ";M_{inv}^{3#pi true} (GeV/c^{2}) ;events", {HistType::kTH1F, {{100, 0.4, 2.4}}}); - registryMC.add("efficiencyMCEl/hMCdeltaphi13", ";#Delta#phi^{1-3 true} ;events", {HistType::kTH1F, {{100, 0., 3.2}}}); - } + } // end of init method float eta(float px, float py, float pz) // Just a simple function to return pseudorapidity @@ -4805,13 +4821,17 @@ struct TauTau13topo { // skimming: only 4 tracks selection void processDoSkim(UDCollisionFull2 const& dgcand, UDTracksFull const& dgtracks, PVTracks const& PVContributors) { + registrySkim.get(HIST("skim/efficiency"))->Fill(0., 1.); int gapSide = dgcand.gapSide(); int truegapSide = sgSelector.trueGap(dgcand, cutFV0, cutFT0A, cutFT0C, cutZDC); if (gapSide < 0 || gapSide > 2) return; + registrySkim.get(HIST("skim/efficiency"))->Fill(1., 1.); + gapSide = truegapSide; if (gapSide != mGapSide) return; + registrySkim.get(HIST("skim/efficiency"))->Fill(2., 1.); // zdc information float energyZNA = dgcand.energyCommonZNA(); @@ -4825,7 +4845,7 @@ struct TauTau13topo { int nEtaIn15 = 0; int npT100 = 0; // int qtot = 0; - short qtot = 0; + int16_t qtot = 0; TLorentzVector p; for (const auto& trk : PVContributors) { qtot += trk.sign(); @@ -4840,12 +4860,19 @@ struct TauTau13topo { if (PVContributors.size() != 4) return; + registrySkim.get(HIST("skim/efficiency"))->Fill(3., 1.); + if (nEtaIn15 != 4) return; + registrySkim.get(HIST("skim/efficiency"))->Fill(4., 1.); + if (npT100 != 4) return; + registrySkim.get(HIST("skim/efficiency"))->Fill(5., 1.); + if (nTofTrk < nTofTrkMinCut) return; + registrySkim.get(HIST("skim/efficiency"))->Fill(6., 1.); // // FIT informaton @@ -4869,6 +4896,7 @@ struct TauTau13topo { if (mFITvetoFlag && flagFITveto) return; + registrySkim.get(HIST("skim/efficiency"))->Fill(7., 1.); // // variables per track @@ -4884,11 +4912,13 @@ struct TauTau13topo { float tmpTofNsigmaPi[4]; float tmpTofNsigmaKa[4]; float tmpTofNsigmaPr[4]; + float tmpTofNsigmaMu[4]; float nSigmaEl[4]; float nSigmaPi[4]; float nSigmaPr[4]; float nSigmaKa[4]; + float nSigmaMu[4]; // float chi2TPC[4]; // float chi2ITS[4]; float chi2TOF[4] = {-1., -1., -1., -1.}; @@ -4912,12 +4942,14 @@ struct TauTau13topo { nSigmaPi[counterTmp] = trk.tpcNSigmaPi(); nSigmaPr[counterTmp] = trk.tpcNSigmaPr(); nSigmaKa[counterTmp] = trk.tpcNSigmaKa(); + nSigmaMu[counterTmp] = trk.tpcNSigmaMu(); trkTofSignal[counterTmp] = trk.beta(); tmpTofNsigmaEl[counterTmp] = trk.tofNSigmaEl(); tmpTofNsigmaPi[counterTmp] = trk.tofNSigmaPi(); tmpTofNsigmaKa[counterTmp] = trk.tofNSigmaKa(); tmpTofNsigmaPr[counterTmp] = trk.tofNSigmaPr(); + tmpTofNsigmaMu[counterTmp] = trk.tofNSigmaMu(); // chi2TPC[counterTmp] = trk.tpcChi2NCl(); // chi2ITS[counterTmp] = trk.itsChi2NCl(); @@ -4949,8 +4981,8 @@ struct TauTau13topo { px, py, pz, // sign, // dcaXY, dcaZ, nclTPCcrossedRows, - tmpDedx, nSigmaEl, nSigmaPi, nSigmaKa, nSigmaPr, - trkTofSignal, tmpTofNsigmaEl, tmpTofNsigmaPi, tmpTofNsigmaKa, tmpTofNsigmaPr, + tmpDedx, nSigmaEl, nSigmaPi, nSigmaKa, nSigmaPr, nSigmaMu, + trkTofSignal, tmpTofNsigmaEl, tmpTofNsigmaPi, tmpTofNsigmaKa, tmpTofNsigmaPr, tmpTofNsigmaMu, chi2TOF); } // end of skim process From ea9eeb3fc7cdd6728484f9de1eb67536fc50d033 Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Wed, 26 Mar 2025 19:31:47 +0100 Subject: [PATCH 0832/1650] [PWGCF] jFlucEfficiencyTask - Subscribe b2 info for run2 converted data (#10652) --- PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx b/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx index 129635cda75..583f156f157 100644 --- a/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx +++ b/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx @@ -109,6 +109,7 @@ struct JFlucEfficiencyTask { using MCCollisionCandidates = soa::Join; using MCRun2CollisionCandidates = soa::Join; using MCTrackCandidates = soa::Join; + using BCsWithRun2Info = soa::Join; // Histogram Registry HistogramRegistry registry{ @@ -337,7 +338,8 @@ struct JFlucEfficiencyTask { void processMCRun2(aod::McCollisions::iterator const& mcCollision, soa::SmallGroups const& collisions, soa::Filtered const& mcTracks, - aod::McParticles const& mcParticles) + aod::McParticles const& mcParticles, + BCsWithRun2Info const&) { registry.fill(HIST("hEventCounterMC"), 0); if (!(std::abs(mcCollision.posZ()) < cfgCutVertex)) { @@ -431,7 +433,7 @@ struct JFlucEfficiencyTask { } } - void processDataRun2(CollisionRun2Candidates::iterator const& collision, soa::Filtered const& tracks) + void processDataRun2(CollisionRun2Candidates::iterator const& collision, soa::Filtered const& tracks, BCsWithRun2Info const&) { if (!colCuts.isSelected(collision)) // Default event selection return; From 29856117ae16bfe9bd51ee7faca178dd7d92b4fc Mon Sep 17 00:00:00 2001 From: bghanley1995 Date: Wed, 26 Mar 2025 14:49:42 -0400 Subject: [PATCH 0833/1650] [PWGCF] IdentifiedBfFilter Moved N Sigma Plots (#10650) Co-authored-by: ALICE Action Bot --- .../TableProducer/identifiedBfFilter.cxx | 94 ++++++++++++++----- 1 file changed, 69 insertions(+), 25 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx b/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx index 75dadf7966b..c38ef2a32b8 100644 --- a/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx +++ b/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx @@ -12,6 +12,7 @@ /// \file identifiedBfFilter.cxx /// \brief Filters collisions and tracks according to selection criteria /// \author bghanley1995@gmail.com + #include "PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.h" #include @@ -156,8 +157,8 @@ TH2F* fhCompatibleCollisionsZVtxRms = nullptr; TH2S* fhTruePIDMismatch = nullptr; TH1S* fhTruePIDCorrect = nullptr; -TH2F* fhTrueNSigmaTPC[kIdBfNoOfSpecies] = {nullptr}; -TH2F* fhTrueNSigmaTOF[kIdBfNoOfSpecies] = {nullptr}; +std::vector> fhTrueNSigmaTPC = {o2::analysis::identifiedbffilter::kIdBfNoOfSpecies, {o2::analysis::identifiedbffilter::kIdBfNoOfSpecies, nullptr}}; +std::vector> fhTrueNSigmaTOF = {o2::analysis::identifiedbffilter::kIdBfNoOfSpecies, {o2::analysis::identifiedbffilter::kIdBfNoOfSpecies, nullptr}}; TH1F* fhTrueCentMultB = nullptr; TH1F* fhTrueCentMultA = nullptr; @@ -1025,16 +1026,18 @@ struct IdentifiedBfFilterTracks { 79, -39.5, 39.5); } - for (int sp = 0; sp < kIdBfNoOfSpecies; ++sp) { - fhTrueNSigmaTPC[sp] = new TH2F(TString::Format("fhTrueNSigmaTPC_%s", speciesName[sp]).Data(), - TString::Format("N #sigma from TPC vs P for generated %s;N #sigma;p (GeV/c)", speciesTitle[sp]).Data(), - 48, -6, 6, - ptbins, ptlow, ptup); - - fhTrueNSigmaTOF[sp] = new TH2F(TString::Format("fhTrueNSigmaTOF_%s", speciesName[sp]).Data(), - TString::Format("N #sigma from TOF vs P for generated %s;N #sigma;p (GeV/c)", speciesTitle[sp]).Data(), - 48, -6, 6, - ptbins, ptlow, ptup); + for (int sp1 = 0; sp1 < kIdBfNoOfSpecies; ++sp1) { + for (int sp2 = 0; sp2 < kIdBfNoOfSpecies; ++sp2) { + fhTrueNSigmaTPC[sp1][sp2] = new TH2F(TString::Format("fhTrueNSigmaTPC%s_%s", speciesName[sp1], speciesName[sp2]).Data(), + TString::Format("N #sigma %s from TPC vs P for generated %s;N #sigma;p (GeV/c)", speciesTitle[sp1], speciesTitle[sp2]).Data(), + 48, -6, 6, + ptbins, ptlow, ptup); + + fhTrueNSigmaTOF[sp1][sp2] = new TH2F(TString::Format("fhTrueNSigmaTOF%s_%s", speciesName[sp1], speciesName[sp2]).Data(), + TString::Format("N #sigma %s from TOF vs P for generated %s;N #sigma;p (GeV/c)", speciesTitle[sp1], speciesTitle[sp2]).Data(), + 48, -6, 6, + ptbins, ptlow, ptup); + } } /* add the hstograms to the output list */ @@ -1073,9 +1076,11 @@ struct IdentifiedBfFilterTracks { fOutputList->Add(fhTrueNPosNegA[sp]); fOutputList->Add(fhTrueDeltaNA[sp]); } - for (int sp = 0; sp < kIdBfNoOfSpecies; ++sp) { - fOutputList->Add(fhTrueNSigmaTPC[sp]); - fOutputList->Add(fhTrueNSigmaTOF[sp]); + for (int sp1 = 0; sp1 < kIdBfNoOfSpecies; ++sp1) { + for (int sp2 = 0; sp2 < kIdBfNoOfSpecies; ++sp2) { + fOutputList->Add(fhTrueNSigmaTPC[sp1][sp2]); + fOutputList->Add(fhTrueNSigmaTOF[sp1][sp2]); + } } } /* initialize access to the CCDB */ @@ -1090,7 +1095,9 @@ struct IdentifiedBfFilterTracks { template int8_t selectTrackAmbiguousCheck(CollisionObjects const& collisions, TrackObject const& track); template - inline void identifyPIDMismatch(ParticleObject const& particle, MatchRecoGenSpecies const& trkId, float tpcNSigma[kIdBfNoOfSpecies], float tofNSigma[kIdBfNoOfSpecies], float tpcInnerParam); + inline void identifyPIDMismatch(ParticleObject const& particle, MatchRecoGenSpecies const& trkId); + template + inline void identifyRealNSigma(ParticleObject const& particle, std::vector tpcNSigma, std::vector tofNSigma, float tpcInnerParam); template inline MatchRecoGenSpecies identifyParticle(ParticleObject const& particle); template @@ -1338,7 +1345,7 @@ inline MatchRecoGenSpecies IdentifiedBfFilterTracks::identifyParticle(ParticleOb } template -inline void IdentifiedBfFilterTracks::identifyPIDMismatch(ParticleObject const& particle, MatchRecoGenSpecies const& trkId, float tpcNSigma[kIdBfNoOfSpecies], float tofNSigma[kIdBfNoOfSpecies], float tpcInnerParam) +inline void IdentifiedBfFilterTracks::identifyPIDMismatch(ParticleObject const& particle, MatchRecoGenSpecies const& trkId) { MatchRecoGenSpecies realPID = kWrongSpecies; int pdgcode = std::fabs(particle.pdgCode()); @@ -1369,11 +1376,44 @@ inline void IdentifiedBfFilterTracks::identifyPIDMismatch(ParticleObject const& } else { fhTruePIDMismatch->Fill(realPID, trkId); } + } +} - fhTrueNSigmaTPC[realPID]->Fill(tpcNSigma[realPID], tpcInnerParam); - fhTrueNSigmaTOF[realPID]->Fill(tofNSigma[realPID], tpcInnerParam); +template +inline void IdentifiedBfFilterTracks::identifyRealNSigma(ParticleObject const& particle, std::vector tpcNSigma, std::vector tofNSigma, float tpcInnerParam) +{ - // fill histo based on realTPC and tpcNSigma value for center align + MatchRecoGenSpecies realPID = kWrongSpecies; + int pdgcode = std::fabs(particle.pdgCode()); + switch (pdgcode) { + case pdgcodeEl: + realPID = kIdBfElectron; + break; + case pdgcodePi: + realPID = kIdBfPion; + break; + case pdgcodeKa: + realPID = kIdBfKaon; + break; + case pdgcodePr: + realPID = kIdBfProton; + break; + default: + if (traceOutOfSpeciesParticles) { + LOGF(info, "Wrong particle passed selection cuts. PDG code: %d", pdgcode); + } + realPID = kWrongSpecies; + break; + } + if (!(realPID < 0)) { + fhTrueNSigmaTPC[kIdBfElectron][realPID]->Fill(tpcNSigma[kIdBfElectron], tpcInnerParam); + fhTrueNSigmaTOF[kIdBfElectron][realPID]->Fill(tofNSigma[kIdBfElectron], tpcInnerParam); + fhTrueNSigmaTPC[kIdBfPion][realPID]->Fill(tpcNSigma[kIdBfPion], tpcInnerParam); + fhTrueNSigmaTOF[kIdBfPion][realPID]->Fill(tofNSigma[kIdBfPion], tpcInnerParam); + fhTrueNSigmaTPC[kIdBfKaon][realPID]->Fill(tpcNSigma[kIdBfKaon], tpcInnerParam); + fhTrueNSigmaTOF[kIdBfKaon][realPID]->Fill(tofNSigma[kIdBfKaon], tpcInnerParam); + fhTrueNSigmaTPC[kIdBfProton][realPID]->Fill(tpcNSigma[kIdBfProton], tpcInnerParam); + fhTrueNSigmaTOF[kIdBfProton][realPID]->Fill(tofNSigma[kIdBfProton], tpcInnerParam); } } @@ -1409,8 +1449,8 @@ void fillNSigmaHistos(TrackObject const& track) fhNSigmaTOF[kIdBfElectron]->Fill(actualTOFNSigma[kIdBfElectron], track.tpcInnerParam()); fhNSigmaTOF[kIdBfPion]->Fill(actualTOFNSigma[kIdBfPion], track.tpcInnerParam()); - fhNSigmaTOF[kIdBfKaon]->Fill(track.tofNSigmaKa(), track.tpcInnerParam()); - fhNSigmaTOF[kIdBfProton]->Fill(track.tofNSigmaPr(), track.tpcInnerParam()); + fhNSigmaTOF[kIdBfKaon]->Fill(actualTOFNSigma[kIdBfKaon], track.tpcInnerParam()); + fhNSigmaTOF[kIdBfProton]->Fill(actualTOFNSigma[kIdBfProton], track.tpcInnerParam()); fhNSigmaCombo[kIdBfElectron]->Fill(sqrtf(actualTOFNSigma[kIdBfElectron] * actualTOFNSigma[kIdBfElectron] + actualTPCNSigma[kIdBfElectron] * actualTPCNSigma[kIdBfElectron]), track.tpcInnerParam()); fhNSigmaCombo[kIdBfPion]->Fill(sqrtf(actualTOFNSigma[kIdBfPion] * actualTOFNSigma[kIdBfPion] + actualTPCNSigma[kIdBfPion] * actualTPCNSigma[kIdBfPion]), track.tpcInnerParam()); @@ -1429,14 +1469,14 @@ inline MatchRecoGenSpecies IdentifiedBfFilterTracks::identifyTrack(TrackObject c fillNSigmaHistos(track); - float actualTPCNSigma[kIdBfNoOfSpecies]; + std::vector actualTPCNSigma(kIdBfNoOfSpecies, 0.); actualTPCNSigma[kIdBfElectron] = track.tpcNSigmaEl(); actualTPCNSigma[kIdBfPion] = track.tpcNSigmaPi(); actualTPCNSigma[kIdBfKaon] = track.tpcNSigmaKa(); actualTPCNSigma[kIdBfProton] = track.tpcNSigmaPr(); - float actualTOFNSigma[kIdBfNoOfSpecies]; + std::vector actualTOFNSigma(kIdBfNoOfSpecies, 0.); actualTOFNSigma[kIdBfElectron] = track.tofNSigmaEl(); actualTOFNSigma[kIdBfPion] = track.tofNSigmaPi(); @@ -1445,6 +1485,10 @@ inline MatchRecoGenSpecies IdentifiedBfFilterTracks::identifyTrack(TrackObject c float nsigmas[kIdBfNoOfSpecies]; + if constexpr (framework::has_type_v) { + identifyRealNSigma(track.template mcParticle_as(), actualTPCNSigma, actualTOFNSigma, track.tpcInnerParam()); + } + if (loadfromccdb) { for (int iSp = 0; iSp < kIdBfNoOfSpecies; iSp++) { actualTPCNSigma[iSp] = actualTPCNSigma[iSp] - fhNSigmaCorrection[iSp]->GetBinContent(fhNSigmaCorrection[iSp]->FindBin(track.tpcInnerParam())); @@ -1519,7 +1563,7 @@ inline MatchRecoGenSpecies IdentifiedBfFilterTracks::identifyTrack(TrackObject c fhNSigmaTPCIdTrks[spMinNSigma]->Fill(actualTPCNSigma[spMinNSigma], track.tpcInnerParam()); if constexpr (framework::has_type_v) { - identifyPIDMismatch(track.template mcParticle_as(), spMinNSigma, actualTPCNSigma, actualTOFNSigma, track.tpcInnerParam()); + identifyPIDMismatch(track.template mcParticle_as(), spMinNSigma); } return spMinNSigma; } From 4a16bc133b733e058502452ab6fb607e26a94f0c Mon Sep 17 00:00:00 2001 From: Steffimro <63045530+Steffimro@users.noreply.github.com> Date: Wed, 26 Mar 2025 19:55:46 +0100 Subject: [PATCH 0834/1650] [PWGEM] Adjusted Binning and added new resolution histograms (#10592) Co-authored-by: Stefanie Mrozinski Co-authored-by: Stefanie Mrozinski --- PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx | 77 ++++++++++++++++++++++++++--- 1 file changed, 70 insertions(+), 7 deletions(-) diff --git a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx index 98eb7a44219..5dd3e438c89 100644 --- a/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx +++ b/PWGEM/PhotonMeson/Tasks/pcmQCMC.cxx @@ -59,6 +59,7 @@ struct PCMQCMC { Configurable maxRgen{"maxRgen", 90.f, "maximum radius for generated particles"}; Configurable margin_z_mc{"margin_z_mc", 7.0, "margin for z cut in cm for MC"}; Configurable cfgRequireTrueAssociation{"cfgRequireTrueAssociation", false, "flag to require true mc collision association"}; + Configurable cfg_fill_resolution{"cfg_fill_resoltion", false, "flag to fill resolution histogram"}; EMPhotonEventCut fEMEventCut; struct : ConfigurableGroup { @@ -207,9 +208,23 @@ struct PCMQCMC { fRegistry.add("V0/primary/hPtGen_DeltaPtOverPtGen", "photon p_{T} resolution;p_{T}^{gen} (GeV/c);(p_{T}^{rec} - p_{T}^{gen})/p_{T}^{gen}", kTH2F, {{1000, 0, 10}, {200, -1.0f, 1.0f}}, true); fRegistry.add("V0/primary/hPtGen_DeltaEta", "photon #eta resolution;p_{T}^{gen} (GeV/c);#eta^{rec} - #eta^{gen}", kTH2F, {{1000, 0, 10}, {100, -0.5f, 0.5f}}, true); fRegistry.add("V0/primary/hPtGen_DeltaPhi", "photon #varphi resolution;p_{T}^{gen} (GeV/c);#varphi^{rec} - #varphi^{gen} (rad.)", kTH2F, {{1000, 0, 10}, {100, -0.5f, 0.5f}}, true); - fRegistry.add("V0/primary/hRxyGen_DeltaPtOverPtGen", "photon p_{T} resolution; R_{xy}^{gen} (cm);(p_{T}^{rec} - p_{T}^{gen})/p_{T}^{gen}", kTH2F, {{1000, 0, 90}, {200, -1.0f, 1.0f}}, true); - fRegistry.add("V0/primary/hRxyGen_DeltaEta", "photon #eta resolution;R_{xy}^{gen} (cm);#eta^{rec} - #eta^{gen}", kTH2F, {{1000, 0, 90}, {100, -0.5f, 0.5f}}, true); - fRegistry.add("V0/primary/hRxyGen_DeltaPhi", "photon #varphi resolution;R_{xy}^{gen} (cm);#varphi^{rec} - #varphi^{gen} (rad.)", kTH2F, {{1000, 0, 90}, {100, -0.5f, 0.5f}}, true); + fRegistry.add("V0/primary/hRxyGen_DeltaPtOverPtGen", "photon p_{T} resolution; R_{xy}^{gen} (cm);(p_{T}^{rec} - p_{T}^{gen})/p_{T}^{gen}", kTH2F, {{100, 0, 100}, {200, -1.0f, 1.0f}}, true); + fRegistry.add("V0/primary/hsPhotonResolution", + "Photon resolution;p_{T};#eta;R_{xy};Z_{conv};Z_{vtx};#Deltap_{T}/p_{T};#Delta#eta;#Delta#phi", + kTHnSparseF, + {{100, 0, 10}, + {80, -1.6, 1.6}, + {100, 0, 100}, + {100, -50, 50}, + {100, -50, 50}, + {200, -1, 1}, + {100, -0.5, 0.5}, + {100, -0.5, 0.5}}, + false); + fRegistry.add("V0/primary/hRxyGen_DeltaEta", "photon #eta resolution;R_{xy}^{gen} (cm);#eta^{rec} - #eta^{gen}", kTH2F, {{100, 0, 100}, {100, -0.5f, 0.5f}}, true); + fRegistry.add("V0/primary/hRxyGen_DeltaPhi", "photon #varphi resolution;R_{xy}^{gen} (cm);#varphi^{rec} - #varphi^{gen} (rad.)", kTH2F, {{100, 0, 100}, {100, -0.5f, 0.5f}}, true); + fRegistry.add("V0/primary/hRxyGen_DeltaR", "photon #varphi resolution;R_{xy}^{gen} (cm);#varphi^{rec} - #varphi^{gen} (rad.)", kTH2F, {{100, 0, 100}, {100, 0, 100}}, true); + fRegistry.add("V0/primary/hsConvVtxZPtR", "z_{vtx} vs p_{T} vs R_{xy};z_{vtx} (cm);p_{T} (GeV/c);R_{xy} (cm)", kTHnSparseF, {{100, -20.0f, +20.0f}, {100, 0.0f, 10.0f}, {100, 0, 100}}, false); fRegistry.add("V0/primary/hXY_MC", "X vs. Y of true photon conversion point.;X (cm);Y (cm)", kTH2F, {{400, -100.0f, +100}, {400, -100, +100}}, true); fRegistry.add("V0/primary/hRZ_MC", "R vs. Z of true photon conversion point;Z (cm);R_{xy} (cm)", kTH2F, {{200, -100.0f, +100}, {200, 0, 100}}, true); fRegistry.add("V0/primary/hsConvPoint", "photon conversion point;r_{xy} (cm);#varphi (rad.);#eta;", kTHnSparseF, {{100, 0.0f, 100}, {90, 0, 2 * M_PI}, {80, -2, +2}}, false); @@ -243,7 +258,27 @@ struct PCMQCMC { fRegistry.add("V0Leg/primary/hZY", "Z vs. Y;Z (cm);Y (cm)", kTH2F, {{200, -100, 100}, {40, -20, 20}}, false); fRegistry.add("V0Leg/primary/hPtGen_DeltaPtOverPtGen", "electron p_{T} resolution;p_{T}^{gen} (GeV/c);(p_{T}^{rec} - p_{T}^{gen})/p_{T}^{gen}", kTH2F, {{1000, 0, 10}, {200, -1.0f, 1.0f}}, true); fRegistry.add("V0Leg/primary/hPtGen_DeltaEta", "electron #eta resolution;p_{T}^{gen} (GeV/c);#eta^{rec} - #eta^{gen}", kTH2F, {{1000, 0, 10}, {100, -0.5f, 0.5f}}, true); + if (cfg_fill_resolution) { + fRegistry.add("V0Leg/primary/hsPhotonResolution", + "Photon resolution;p_{T};#eta;R_{xy};Z_{conv};Z_{vtx};#Deltap_{T}/p_{T};#Delta#eta;#Delta#phi", + kTHnSparseF, + {{100, 0, 10}, + {80, -1.6, 1.6}, + {100, 0, 100}, + {100, -50, 50}, + {100, -50, 50}, + {200, -1, 1}, + {100, -0.5, 0.5}, + {100, -0.5, 0.5}}, + false); + } + fRegistry.add("V0Leg/primary/hPtGen_DeltaPhi", "electron #varphi resolution;p_{T}^{gen} (GeV/c);#varphi^{rec} - #varphi^{gen} (rad.)", kTH2F, {{1000, 0, 10}, {100, -0.5f, 0.5f}}, true); + fRegistry.add("V0Leg/primary/hRxyGen_DeltaPtOverPtGen", "photon p_{T} resolution; R_{xy}^{gen} (cm);(p_{T}^{rec} - p_{T}^{gen})/p_{T}^{gen}", kTH2F, {{100, 0, 100}, {200, -1.0f, 1.0f}}, true); + fRegistry.add("V0Leg/primary/hRxyGen_DeltaEta", "photon #eta resolution;R_{xy}^{gen} (cm);#eta^{rec} - #eta^{gen}", kTH2F, {{100, 0, 100}, {100, -0.5f, 0.5f}}, true); + fRegistry.add("V0Leg/primary/hRxyGen_DeltaPhi", "photon #varphi resolution;R_{xy}^{gen} (cm);#varphi^{rec} - #varphi^{gen} (rad.)", kTH2F, {{100, 0, 100}, {100, 0, 100}}, true); + fRegistry.add("V0Leg/primary/hRxyGen_DeltaR", "photon p_{T} resolution; R_{xy}^{gen} (cm);(p_{T}^{rec} - p_{T}^{gen})/p_{T}^{gen}", kTH2F, {{100, 0, 100}, {200, -1.0f, 1.0f}}, true); + fRegistry.addClone("V0Leg/primary/", "V0Leg/fromWD/"); // from weak decay fRegistry.addClone("V0Leg/primary/", "V0Leg/fromHS/"); // from hadronic shower in detector materials fRegistry.addClone("V0Leg/primary/", "V0Leg/fromPi0Dalitz/"); // misidentified dielectron from pi0 dalitz decay @@ -361,6 +396,9 @@ struct PCMQCMC { fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hMassGamma"), v0.v0radius(), v0.mGamma()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hKFChi2vsM"), v0.mGamma(), v0.chiSquareNDF()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hKFChi2vsR"), v0.v0radius(), v0.chiSquareNDF()); + fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hsConvVtxZPtR"), + v0.vz(), v0.pt(), v0.v0radius()); + fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hKFChi2vsX"), v0.vx(), v0.chiSquareNDF()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hKFChi2vsY"), v0.vy(), v0.chiSquareNDF()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hKFChi2vsZ"), v0.vz(), v0.chiSquareNDF()); @@ -372,10 +410,21 @@ struct PCMQCMC { fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hPtGen_DeltaPtOverPtGen"), mcphoton.pt(), (v0.pt() - mcphoton.pt()) / mcphoton.pt()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hPtGen_DeltaEta"), mcphoton.pt(), v0.eta() - mcphoton.eta()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hPtGen_DeltaPhi"), mcphoton.pt(), v0.phi() - mcphoton.phi()); - fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hRxyGen_DeltaPtOverPtGen"), v0.v0radius(), (v0.pt() - mcphoton.pt()) / mcphoton.pt()); - fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hRxyGen_DeltaEta"), v0.v0radius(), v0.eta() - mcphoton.eta()); - fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hRxyGen_DeltaPhi"), v0.v0radius(), v0.phi() - mcphoton.phi()); - + fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hRxyGen_DeltaPtOverPtGen"), std::sqrt(std::pow(mcleg.vx(), 2) + std::pow(mcleg.vy(), 2)), (v0.pt() - mcphoton.pt()) / mcphoton.pt()); + fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hRxyGen_DeltaEta"), std::sqrt(std::pow(mcleg.vx(), 2) + std::pow(mcleg.vy(), 2)), v0.eta() - mcphoton.eta()); + if (cfg_fill_resolution) { + fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hsPhotonResolution"), + mcphoton.pt(), + mcphoton.eta(), + std::sqrt(mcleg.vx() * mcleg.vx() + mcleg.vy() * mcleg.vy()), + mcleg.vz(), + v0.vz(), + (v0.pt() - mcphoton.pt()) / mcphoton.pt(), + v0.eta() - mcphoton.eta(), + TVector2::Phi_mpi_pi(v0.phi() - mcphoton.phi())); + } + fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hRxyGen_DeltaPhi"), std::sqrt(std::pow(mcleg.vx(), 2) + std::pow(mcleg.vy(), 2)), v0.phi() - mcphoton.phi()); + fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hRxyGen_DeltaR"), std::sqrt(std::pow(mcleg.vx(), 2) + std::pow(mcleg.vy(), 2)), v0.v0radius() - std::sqrt(std::pow(mcleg.vx(), 2) + std::pow(mcleg.vy(), 2))); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hConvPoint_diffX"), mcleg.vx(), v0.vx() - mcleg.vx()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hConvPoint_diffY"), mcleg.vy(), v0.vy() - mcleg.vy()); fRegistry.fill(HIST("V0/") + HIST(mcphoton_types[mctype]) + HIST("hConvPoint_diffZ"), mcleg.vz(), v0.vz() - mcleg.vz()); @@ -417,6 +466,20 @@ struct PCMQCMC { fRegistry.fill(HIST("V0Leg/") + HIST(mcphoton_types[mctype]) + HIST("hPtGen_DeltaPtOverPtGen"), mcleg.pt(), (leg.pt() - mcleg.pt()) / mcleg.pt()); fRegistry.fill(HIST("V0Leg/") + HIST(mcphoton_types[mctype]) + HIST("hPtGen_DeltaEta"), mcleg.pt(), leg.eta() - mcleg.eta()); fRegistry.fill(HIST("V0Leg/") + HIST(mcphoton_types[mctype]) + HIST("hPtGen_DeltaPhi"), mcleg.pt(), leg.phi() - mcleg.phi()); + fRegistry.fill(HIST("V0Leg/") + HIST(mcphoton_types[mctype]) + HIST("hRxyGen_DeltaPtOverPtGen"), std::sqrt(std::pow(mcleg.vx(), 2) + std::pow(mcleg.vy(), 2)), (leg.pt() - mcleg.pt()) / mcleg.pt()); + if (cfg_fill_resolution) { + fRegistry.fill(HIST("V0Leg/") + HIST(mcphoton_types[mctype]) + HIST("hsPhotonResolution"), + mcleg.pt(), + mcleg.eta(), + std::sqrt(mcleg.vx() * mcleg.vx() + mcleg.vy() * mcleg.vy()), + mcleg.vz(), + leg.z(), + (leg.pt() - mcleg.pt()) / mcleg.pt(), + leg.eta() - mcleg.eta(), + TVector2::Phi_mpi_pi(leg.phi() - mcleg.phi())); + } + fRegistry.fill(HIST("V0Leg/") + HIST(mcphoton_types[mctype]) + HIST("hRxyGen_DeltaEta"), std::sqrt(std::pow(mcleg.vx(), 2) + std::pow(mcleg.vy(), 2)), leg.eta() - mcleg.eta()); + fRegistry.fill(HIST("V0Leg/") + HIST(mcphoton_types[mctype]) + HIST("hRxyGen_DeltaPhi"), std::sqrt(std::pow(mcleg.vx(), 2) + std::pow(mcleg.vy(), 2)), leg.phi() - mcleg.phi()); } Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); From 072b139cc5319879749e99a3509715eb54b9ca62 Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Wed, 26 Mar 2025 20:25:43 +0100 Subject: [PATCH 0835/1650] [PWGLF] Improved treatment of photons in strangeness builder (#10654) Co-authored-by: ALICE Builder --- .../TableProducer/Strangeness/CMakeLists.txt | 2 +- .../Strangeness/strangenessbuilder.cxx | 56 +++- PWGLF/Utils/strangenessBuilderHelper.h | 250 ++++++++++++------ 3 files changed, 226 insertions(+), 82 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/CMakeLists.txt b/PWGLF/TableProducer/Strangeness/CMakeLists.txt index 565e4a7f19e..70a65b7198b 100644 --- a/PWGLF/TableProducer/Strangeness/CMakeLists.txt +++ b/PWGLF/TableProducer/Strangeness/CMakeLists.txt @@ -108,7 +108,7 @@ o2physics_add_dpl_workflow(strangederivedbuilder o2physics_add_dpl_workflow(strangenessbuilder SOURCES strangenessbuilder.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DCAFitter KFParticle::KFParticle + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DCAFitter KFParticle::KFParticle O2Physics::TPCDriftManager COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(v0-selector diff --git a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx index 897f0d5e557..30be3de8570 100644 --- a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx @@ -46,6 +46,7 @@ #include "CCDB/BasicCCDBManager.h" #include "DataFormatsParameters/GRPObject.h" #include "DataFormatsParameters/GRPMagField.h" +#include "Common/Core/TPCVDriftManager.h" using namespace o2; using namespace o2::framework; @@ -278,6 +279,7 @@ struct StrangenessBuilder { struct : ConfigurableGroup { std::string prefix = "v0BuilderOpts"; Configurable generatePhotonCandidates{"generatePhotonCandidates", false, "generate gamma conversion candidates (V0s using TPC-only tracks)"}; + Configurable moveTPCOnlyTracks{"moveTPCOnlyTracks", true, "if dealing with TPC-only tracks, move them according to TPC drift / time info"}; // baseline conditionals of V0 building Configurable minCrossedRows{"minCrossedRows", 50, "minimum TPC crossed rows for daughter tracks"}; @@ -341,6 +343,9 @@ struct StrangenessBuilder { int mRunNumber; o2::base::MatLayerCylSet* lut = nullptr; + // for handling TPC-only tracks (photons) + o2::aod::common::TPCVDriftManager mVDriftMgr; + // for tagging V0s used in cascades std::vector v0sFromCascades; // Vector of v0 candidates used in cascades std::vector v0Map; // index to relate V0s -> v0sFromCascades @@ -625,6 +630,12 @@ struct StrangenessBuilder { // mmark this run as configured mRunNumber = bc.runNumber(); + if (v0BuilderOpts.generatePhotonCandidates.value && v0BuilderOpts.moveTPCOnlyTracks.value) { + // initialize only if needed, avoid unnecessary CCDB calls + mVDriftMgr.init(&ccdb->instance()); + mVDriftMgr.update(timestamp); + } + return true; } @@ -1098,7 +1109,7 @@ struct StrangenessBuilder { } //__________________________________________________ - template + template void buildV0s(TCollisions const& collisions, TV0s const& v0s, TTracks const& tracks, TMCParticles const& mcParticles) { // prepare MC containers (not necessarily used) @@ -1134,7 +1145,38 @@ struct StrangenessBuilder { } auto const& posTrack = tracks.rawIteratorAt(v0.posTrackId); auto const& negTrack = tracks.rawIteratorAt(v0.negTrackId); - if (!straHelper.buildV0Candidate(v0.collisionId, pvX, pvY, pvZ, posTrack, negTrack, v0.isCollinearV0, mEnabledTables[kV0Covs])) { + + auto posTrackPar = getTrackParCov(posTrack); + auto negTrackPar = getTrackParCov(negTrack); + + // handle TPC-only tracks properly (photon conversions) + if (v0BuilderOpts.moveTPCOnlyTracks) { + bool isPosTPCOnly = (posTrack.hasTPC() && !posTrack.hasITS() && !posTrack.hasTRD() && !posTrack.hasTOF()); + if (isPosTPCOnly) { + // Nota bene: positive is TPC-only -> this entire V0 merits treatment as photon candidate + posTrackPar.setPID(o2::track::PID::Electron); + negTrackPar.setPID(o2::track::PID::Electron); + + auto const& collision = collisions.rawIteratorAt(v0.collisionId); + if (!mVDriftMgr.moveTPCTrack(collision, posTrack, posTrackPar)) { + return; + } + } + + bool isNegTPCOnly = (negTrack.hasTPC() && !negTrack.hasITS() && !negTrack.hasTRD() && !negTrack.hasTOF()); + if (isNegTPCOnly) { + // Nota bene: negative is TPC-only -> this entire V0 merits treatment as photon candidate + posTrackPar.setPID(o2::track::PID::Electron); + negTrackPar.setPID(o2::track::PID::Electron); + + auto const& collision = collisions.rawIteratorAt(v0.collisionId); + if (!mVDriftMgr.moveTPCTrack(collision, negTrack, negTrackPar)) { + return; + } + } + } + + if (!straHelper.buildV0Candidate(v0.collisionId, pvX, pvY, pvZ, posTrack, negTrack, posTrackPar, negTrackPar, v0.isCollinearV0, mEnabledTables[kV0Covs])) { products.v0dataLink(-1, -1); continue; } @@ -2107,7 +2149,7 @@ struct StrangenessBuilder { markV0sUsedInCascades(v0List, cascadeList, trackedCascades); // build V0s - buildV0s(collisions, v0List, tracks, mcParticles); + buildV0s(collisions, v0List, tracks, mcParticles); // build cascades buildCascades(collisions, cascadeList, tracks, mcParticles); @@ -2121,22 +2163,22 @@ struct StrangenessBuilder { populateCascadeInterlinks(); } - void processRealData(aod::Collisions const& collisions, aod::V0s const& v0s, aod::Cascades const& cascades, aod::TrackedCascades const& trackedCascades, FullTracksExtIU const& tracks, aod::BCsWithTimestamps const& bcs) + void processRealData(soa::Join const& collisions, aod::V0s const& v0s, aod::Cascades const& cascades, aod::TrackedCascades const& trackedCascades, FullTracksExtIU const& tracks, aod::BCsWithTimestamps const& bcs) { dataProcess(collisions, static_cast(nullptr), v0s, cascades, trackedCascades, tracks, bcs, static_cast(nullptr)); } - void processRealDataRun2(aod::Collisions const& collisions, aod::V0s const& v0s, aod::Cascades const& cascades, FullTracksExt const& tracks, aod::BCsWithTimestamps const& bcs) + void processRealDataRun2(soa::Join const& collisions, aod::V0s const& v0s, aod::Cascades const& cascades, FullTracksExt const& tracks, aod::BCsWithTimestamps const& bcs) { dataProcess(collisions, static_cast(nullptr), v0s, cascades, static_cast(nullptr), tracks, bcs, static_cast(nullptr)); } - void processMonteCarlo(soa::Join const& collisions, aod::McCollisions const& mccollisions, aod::V0s const& v0s, aod::Cascades const& cascades, aod::TrackedCascades const& trackedCascades, FullTracksExtLabeledIU const& tracks, aod::BCsWithTimestamps const& bcs, aod::McParticles const& mcParticles) + void processMonteCarlo(soa::Join const& collisions, aod::McCollisions const& mccollisions, aod::V0s const& v0s, aod::Cascades const& cascades, aod::TrackedCascades const& trackedCascades, FullTracksExtLabeledIU const& tracks, aod::BCsWithTimestamps const& bcs, aod::McParticles const& mcParticles) { dataProcess(collisions, mccollisions, v0s, cascades, trackedCascades, tracks, bcs, mcParticles); } - void processMonteCarloRun2(soa::Join const& collisions, aod::McCollisions const& mccollisions, aod::V0s const& v0s, aod::Cascades const& cascades, FullTracksExtLabeled const& tracks, aod::BCsWithTimestamps const& bcs, aod::McParticles const& mcParticles) + void processMonteCarloRun2(soa::Join const& collisions, aod::McCollisions const& mccollisions, aod::V0s const& v0s, aod::Cascades const& cascades, FullTracksExtLabeled const& tracks, aod::BCsWithTimestamps const& bcs, aod::McParticles const& mcParticles) { dataProcess(collisions, mccollisions, v0s, cascades, static_cast(nullptr), tracks, bcs, mcParticles); } diff --git a/PWGLF/Utils/strangenessBuilderHelper.h b/PWGLF/Utils/strangenessBuilderHelper.h index 289c8c32594..c0919f86825 100644 --- a/PWGLF/Utils/strangenessBuilderHelper.h +++ b/PWGLF/Utils/strangenessBuilderHelper.h @@ -21,6 +21,7 @@ #include "DetectorsBase/GeometryManager.h" #include "CommonConstants/PhysicsConstants.h" #include "Common/Core/trackUtilities.h" +#include "Tools/KFparticle/KFUtilities.h" #ifndef HomogeneousField #define HomogeneousField @@ -56,6 +57,7 @@ struct v0candidate { float negativeDCAxy = 0.0f; // V0 properties + std::array momentum = {0.0f, 0.0f, 0.0f}; // necessary for KF std::array position = {0.0f, 0.0f, 0.0f}; float daughterDCA = 1000.0f; float pointingAngle = 0.0f; @@ -161,11 +163,13 @@ class strangenessBuilderHelper fitter.setBz(-999.9f); // will NOT make sense if not changed }; - template + template bool buildV0Candidate(int collisionIndex, float pvX, float pvY, float pvZ, TTrack const& positiveTrack, TTrack const& negativeTrack, + TTrackParametrization& positiveTrackParam, + TTrackParametrization& negativeTrackParam, bool useCollinearFit = false, bool calculateCovariance = false) { @@ -185,28 +189,27 @@ class strangenessBuilderHelper return false; } - // Calculate DCA with respect to the collision associated to the V0, not individual tracks + // Calculate DCA with respect to the collision associated to the V0 gpu::gpustd::array dcaInfo; - auto posTrackPar = getTrackPar(positiveTrack); - o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, posTrackPar, 2.f, fitter.getMatCorrType(), &dcaInfo); + // do DCA to PV on copies instead of originals + auto positiveTrackParamCopy = positiveTrackParam; + auto negativeTrackParamCopy = negativeTrackParam; + + o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, positiveTrackParamCopy, 2.f, fitter.getMatCorrType(), &dcaInfo); v0.positiveDCAxy = dcaInfo[0]; if (std::fabs(v0.positiveDCAxy) < v0selections.dcanegtopv) { return false; } - auto negTrackPar = getTrackPar(negativeTrack); - o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, negTrackPar, 2.f, fitter.getMatCorrType(), &dcaInfo); + o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, negativeTrackParamCopy, 2.f, fitter.getMatCorrType(), &dcaInfo); v0.negativeDCAxy = dcaInfo[0]; if (std::fabs(v0.negativeDCAxy) < v0selections.dcanegtopv) { return false; } - o2::track::TrackParCov positiveTrackParam = getTrackParCov(positiveTrack); - o2::track::TrackParCov negativeTrackParam = getTrackParCov(negativeTrack); - // Perform DCA fit int nCand = 0; fitter.setCollinear(useCollinearFit); @@ -228,6 +231,10 @@ class strangenessBuilderHelper negativeTrackParam.getPxPyPzGlo(v0.negativeMomentum); positiveTrackParam.getXYZGlo(v0.positivePosition); negativeTrackParam.getXYZGlo(v0.negativePosition); + for (int i = 0; i < 3; i++) { + // avoids misuse if mixed with KF particle use + v0.momentum[i] = v0.positiveMomentum[i] + v0.negativeMomentum[i]; + } // get decay vertex coordinates const auto& vtx = fitter.getPCACandidate(); @@ -307,6 +314,161 @@ class strangenessBuilderHelper return true; } + template + bool buildV0CandidateWithKF(TCollision const& collision, + TTrack const& positiveTrack, + TTrack const& negativeTrack, + TTrackParametrization& positiveTrackParam, + TTrackParametrization& negativeTrackParam, + int kfConstructMethod = 2, // the typical used + float kfConstrainedMassValue = 0.0f, // negative: no constraint + bool kfConstrainToPrimaryVertex = true) + { + int collisionIndex = collision.globalIndex(); + float pvX = collision.posX(); + float pvY = collision.posY(); + float pvZ = collision.posZ(); + + // verify track quality + if (positiveTrack.tpcNClsCrossedRows() < v0selections.minCrossedRows) { + return false; + } + if (negativeTrack.tpcNClsCrossedRows() < v0selections.minCrossedRows) { + return false; + } + + // verify eta + if (std::fabs(positiveTrack.eta()) > v0selections.maxDaughterEta) { + return false; + } + if (std::fabs(negativeTrack.eta()) > v0selections.maxDaughterEta) { + return false; + } + + // Calculate DCA with respect to the collision associated to the V0 + gpu::gpustd::array dcaInfo; + + // do DCA to PV on copies instead of originals + auto positiveTrackParamCopy = positiveTrackParam; + auto negativeTrackParamCopy = negativeTrackParam; + + o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, positiveTrackParamCopy, 2.f, fitter.getMatCorrType(), &dcaInfo); + v0.positiveDCAxy = dcaInfo[0]; + + if (std::fabs(v0.positiveDCAxy) < v0selections.dcanegtopv) { + return false; + } + + o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, negativeTrackParamCopy, 2.f, fitter.getMatCorrType(), &dcaInfo); + v0.negativeDCAxy = dcaInfo[0]; + + if (std::fabs(v0.negativeDCAxy) < v0selections.dcanegtopv) { + return false; + } + + //__________________________________________ + //*>~<* do V0 with KF + // create KFParticle objects from trackParCovs + KFParticle kfpPos = createKFParticleFromTrackParCov(positiveTrackParam, positiveTrackParam.getCharge(), o2::constants::physics::MassElectron); + KFParticle kfpNeg = createKFParticleFromTrackParCov(negativeTrackParam, negativeTrackParam.getCharge(), o2::constants::physics::MassElectron); + + KFParticle kfpPos_DecayVtx = kfpPos; + KFParticle kfpNeg_DecayVtx = kfpNeg; + const KFParticle* V0Daughters[2] = {&kfpPos, &kfpNeg}; + + // construct V0 + KFParticle KFV0; + KFV0.SetConstructMethod(kfConstructMethod); + try { + KFV0.Construct(V0Daughters, 2); + } catch (std::runtime_error& e) { + LOG(debug) << "Failed to construct cascade V0 from daughter tracks: " << e.what(); + return false; + } + + if (kfConstrainedMassValue > -1e-4) { + // photon constraint: this one's got no mass + KFV0.SetNonlinearMassConstraint(kfConstrainedMassValue); + } + + // V0 constructed, now recovering TrackParCov for dca fitter minimization (with material correction) + KFV0.TransportToDecayVertex(); + o2::track::TrackParCov v0TrackParCov = getTrackParCovFromKFP(KFV0, o2::track::PID::Lambda, 0); + v0TrackParCov.setAbsCharge(0); // to be sure + + // estimate momentum of daughters (since KFParticle does not allow us to retrieve it directly...) + float xyz_decay[3] = {KFV0.GetX(), KFV0.GetY(), KFV0.GetZ()}; + kfpPos_DecayVtx.TransportToPoint(xyz_decay); + kfpNeg_DecayVtx.TransportToPoint(xyz_decay); + + v0.positiveMomentum = {kfpPos_DecayVtx.GetPx(), kfpPos_DecayVtx.GetPy(), kfpPos_DecayVtx.GetPz()}; + v0.negativeMomentum = {kfpNeg_DecayVtx.GetPx(), kfpNeg_DecayVtx.GetPy(), kfpNeg_DecayVtx.GetPz()}; + + v0.daughterDCA = std::hypot( + kfpPos_DecayVtx.GetX() - kfpNeg_DecayVtx.GetX(), + kfpPos_DecayVtx.GetY() - kfpNeg_DecayVtx.GetY(), + kfpPos_DecayVtx.GetZ() - kfpNeg_DecayVtx.GetZ()); + + if (v0.daughterDCA > v0selections.dcav0dau) { + return false; + } + + // check radius + for (int i = 0; i < 3; i++) { + v0.position[i] = xyz_decay[i]; + } + if (std::hypot(v0.position[0], v0.position[1]) < v0selections.v0radius) { + return false; + } + + KFPVertex kfpVertex = createKFPVertexFromCollision(collision); + KFParticle KFPV(kfpVertex); + + // deal with pointing angle + float cosPA = cpaFromKF(KFV0, KFPV); + if (cosPA < v0selections.v0cospa) { + return false; + } + v0.pointingAngle = TMath::ACos(cosPA); + + v0.dcaXY = CalculateDCAStraightToPV( + v0.position[0], v0.position[1], v0.position[2], + v0.momentum[0], v0.momentum[1], v0.momentum[2], + pvX, pvY, pvZ); + + // apply topological constraint to PV if requested + // might adjust px py pz + KFParticle KFV0_PV = KFV0; + if (kfConstrainToPrimaryVertex) { + KFV0_PV.SetProductionVertex(KFPV); + } + v0.momentum = {KFV0_PV.GetPx(), KFV0_PV.GetPy(), KFV0_PV.GetPz()}; + + // set collision Id correctly + v0.collisionId = collisionIndex; + + // Calculate masses + v0.massGamma = RecoDecay::m(std::array{ + std::array{v0.positiveMomentum[0], v0.positiveMomentum[1], v0.positiveMomentum[2]}, + std::array{v0.negativeMomentum[0], v0.negativeMomentum[1], v0.negativeMomentum[2]}}, + std::array{o2::constants::physics::MassElectron, o2::constants::physics::MassElectron}); + v0.massK0Short = RecoDecay::m(std::array{ + std::array{v0.positiveMomentum[0], v0.positiveMomentum[1], v0.positiveMomentum[2]}, + std::array{v0.negativeMomentum[0], v0.negativeMomentum[1], v0.negativeMomentum[2]}}, + std::array{o2::constants::physics::MassPionCharged, o2::constants::physics::MassPionCharged}); + v0.massLambda = RecoDecay::m(std::array{ + std::array{v0.positiveMomentum[0], v0.positiveMomentum[1], v0.positiveMomentum[2]}, + std::array{v0.negativeMomentum[0], v0.negativeMomentum[1], v0.negativeMomentum[2]}}, + std::array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged}); + v0.massAntiLambda = RecoDecay::m(std::array{ + std::array{v0.positiveMomentum[0], v0.positiveMomentum[1], v0.positiveMomentum[2]}, + std::array{v0.negativeMomentum[0], v0.negativeMomentum[1], v0.negativeMomentum[2]}}, + std::array{o2::constants::physics::MassPionCharged, o2::constants::physics::MassProton}); + + // information validated, V0 built successfully. Signal OK + return true; + } + // cascade builder creating a cascade from plain tracks template bool buildCascadeCandidate(int collisionIndex, @@ -318,7 +480,11 @@ class strangenessBuilderHelper bool useCascadeMomentumAtPV = false, bool processCovariances = false) { - if (!buildV0Candidate(collisionIndex, pvX, pvY, pvZ, positiveTrack, negativeTrack, false, processCovariances)) { + // no special treatment of positive and negative tracks when building V0s for cascades + auto posTrackPar = getTrackParCov(positiveTrack); + auto negTrackPar = getTrackParCov(negativeTrack); + + if (!buildV0Candidate(collisionIndex, pvX, pvY, pvZ, positiveTrack, negativeTrack, posTrackPar, negTrackPar, false, processCovariances)) { return false; } if (!buildCascadeCandidate(collisionIndex, pvX, pvY, pvZ, v0, positiveTrack, negativeTrack, bachelorTrack, calculateBachelorBaryonVariables, useCascadeMomentumAtPV, processCovariances)) { @@ -929,70 +1095,6 @@ class strangenessBuilderHelper // Potentially also to be considered: bachelor-baryon DCA (between the two tracks) // to be added here as complementary information in the future } - - // TrackParCov to KF converter - // FIXME: could be an utility somewhere else - // from Carolina Reetz (thank you!) - template - KFParticle createKFParticleFromTrackParCov(const o2::track::TrackParametrizationWithError& trackparCov, int charge, float mass) - { - std::array xyz, pxpypz; - float xyzpxpypz[6]; - trackparCov.getPxPyPzGlo(pxpypz); - trackparCov.getXYZGlo(xyz); - for (int i{0}; i < 3; ++i) { - xyzpxpypz[i] = xyz[i]; - xyzpxpypz[i + 3] = pxpypz[i]; - } - - std::array cv; - try { - trackparCov.getCovXYZPxPyPzGlo(cv); - } catch (std::runtime_error& e) { - LOG(debug) << "Failed to get cov matrix from TrackParCov" << e.what(); - } - - KFParticle kfPart; - float Mini, SigmaMini, M, SigmaM; - kfPart.GetMass(Mini, SigmaMini); - LOG(debug) << "Daughter KFParticle mass before creation: " << Mini << " +- " << SigmaMini; - - try { - kfPart.Create(xyzpxpypz, cv.data(), charge, mass); - } catch (std::runtime_error& e) { - LOG(debug) << "Failed to create KFParticle from daughter TrackParCov" << e.what(); - } - - kfPart.GetMass(M, SigmaM); - LOG(debug) << "Daughter KFParticle mass after creation: " << M << " +- " << SigmaM; - return kfPart; - } - - // KF to TrackParCov converter - // FIXME: could be an utility somewhere else - // from Carolina Reetz (thank you!) - o2::track::TrackParCov getTrackParCovFromKFP(const KFParticle& kfParticle, const o2::track::PID pid, const int sign) - { - o2::gpu::gpustd::array xyz, pxpypz; - o2::gpu::gpustd::array cv; - - // get parameters from kfParticle - xyz[0] = kfParticle.GetX(); - xyz[1] = kfParticle.GetY(); - xyz[2] = kfParticle.GetZ(); - pxpypz[0] = kfParticle.GetPx(); - pxpypz[1] = kfParticle.GetPy(); - pxpypz[2] = kfParticle.GetPz(); - - // set covariance matrix elements (lower triangle) - for (int i = 0; i < 21; i++) { - cv[i] = kfParticle.GetCovariance(i); - } - - // create TrackParCov track - o2::track::TrackParCov track = o2::track::TrackParCov(xyz, pxpypz, cv, sign, true, pid); - return track; - } }; } // namespace pwglf From 583020cd493b6653f75e6823ec5ce8262d607e21 Mon Sep 17 00:00:00 2001 From: Thorkj <154221526+Thorkj@users.noreply.github.com> Date: Wed, 26 Mar 2025 21:00:26 +0100 Subject: [PATCH 0836/1650] [PWGCF] Update corrSparse.cxx addressing possible memory leak (#10656) --- PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx b/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx index 630df5bf9c9..33cee50dbca 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx @@ -81,7 +81,6 @@ struct CalcNch { void process(AodCollisions::iterator const& collision, AodTracks const& tracks) { - // LOGF(info, "multiplicity from tracks %d, multiplicity from collision %d", tracks.size(), collision.numContrib()); multiplicityNch(tracks.size()); registry.fill(HIST("Ncharge"), tracks.size()); registry.fill(HIST("zVtx_all"), collision.posZ()); @@ -183,6 +182,8 @@ struct CorrSparse { MixedEvent = 3 }; + TRandom3* gRandom = new TRandom3(); + template bool isAcceptedMftTrack(TTrackAssoc const& mftTrack) { @@ -256,7 +257,6 @@ struct CorrSparse { template void fillCorrelations(TTracks tracks1, TTracksAssoc tracks2, float posZ, int system, float Nch, int magneticField) // function to fill the Output functions (sparse) and the delta eta and delta phi histograms { - TRandom3* gRandom = new TRandom3(); int fSampleIndex = gRandom->Uniform(0, cfgSampleSize); From f37175d41d11a7a168bec72908d506199ed1b3cd Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Wed, 26 Mar 2025 23:01:44 +0100 Subject: [PATCH 0837/1650] [Trigger] Add doublephi filter in cefp task (#10665) --- EventFiltering/cefpTask.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/EventFiltering/cefpTask.cxx b/EventFiltering/cefpTask.cxx index 6482d2232c2..64cf4435b85 100644 --- a/EventFiltering/cefpTask.cxx +++ b/EventFiltering/cefpTask.cxx @@ -217,6 +217,7 @@ struct centralEventFilterTask { Configurable cfgSkipUntriggeredEvents{"cfgSkipUntriggeredEvents", false, "Skip untriggered events"}; FILTER_CONFIGURABLE(F1ProtonFilters); + FILTER_CONFIGURABLE(DoublePhiFilters); FILTER_CONFIGURABLE(NucleiFilters); FILTER_CONFIGURABLE(DiffractionFilters); FILTER_CONFIGURABLE(DqFilters); From 85eae081661a5372b03ad81c3961a60880162270 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Thu, 27 Mar 2025 07:36:51 +0900 Subject: [PATCH 0838/1650] [Common] implement common muon-propagation task (#10618) --- Common/Core/fwdtrackUtilities.h | 94 ++++ Common/DataModel/CMakeLists.txt | 3 +- Common/DataModel/PropagatedFwdTrackTables.h | 83 ++++ Common/TableProducer/CMakeLists.txt | 8 +- Common/TableProducer/fwdtrackPropagation.cxx | 426 +++++++++++++++++++ 5 files changed, 612 insertions(+), 2 deletions(-) create mode 100644 Common/Core/fwdtrackUtilities.h create mode 100644 Common/DataModel/PropagatedFwdTrackTables.h create mode 100644 Common/TableProducer/fwdtrackPropagation.cxx diff --git a/Common/Core/fwdtrackUtilities.h b/Common/Core/fwdtrackUtilities.h new file mode 100644 index 00000000000..068eed51f17 --- /dev/null +++ b/Common/Core/fwdtrackUtilities.h @@ -0,0 +1,94 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file fwdtrackUtilities.h +/// \brief Utilities for manipulating parameters of fwdtracks +/// \author Maurice Coquet +/// \author Luca Micheletti +/// \author Daiki Sekihata + +#ifndef COMMON_CORE_FWDTRACKUTILITIES_H_ +#define COMMON_CORE_FWDTRACKUTILITIES_H_ + +#include +#include +#include "Math/SMatrix.h" +#include "TGeoGlobalMagField.h" + +namespace o2::aod +{ +namespace fwdtrackutils +{ +// Index used to set different options for muon propagation +enum class propagationPoint : int { + kToVertex = 0, + kToDCA = 1, + kToRabs = 2, +}; +using SMatrix55 = ROOT::Math::SMatrix>; +using SMatrix5 = ROOT::Math::SVector; + +/// propagate fwdtrack to a certain point. +template +o2::dataformats::GlobalFwdTrack propagateMuon(TFwdTrack const& muon, TCollision const& collision, const propagationPoint endPoint) +{ + double chi2 = muon.chi2(); + SMatrix5 tpars(muon.x(), muon.y(), muon.phi(), muon.tgl(), muon.signed1Pt()); + std::vector v1{muon.cXX(), muon.cXY(), muon.cYY(), muon.cPhiX(), muon.cPhiY(), + muon.cPhiPhi(), muon.cTglX(), muon.cTglY(), muon.cTglPhi(), muon.cTglTgl(), + muon.c1PtX(), muon.c1PtY(), muon.c1PtPhi(), muon.c1PtTgl(), muon.c1Pt21Pt2()}; + SMatrix55 tcovs(v1.begin(), v1.end()); + o2::track::TrackParCovFwd fwdtrack{muon.z(), tpars, tcovs, chi2}; + o2::dataformats::GlobalFwdTrack propmuon; + o2::globaltracking::MatchGlobalFwd mMatching; + + if (static_cast(muon.trackType()) > 2) { // MCH-MID or MCH standalone + o2::dataformats::GlobalFwdTrack track; + track.setParameters(tpars); + track.setZ(fwdtrack.getZ()); + track.setCovariances(tcovs); + auto mchTrack = mMatching.FwdtoMCH(track); + + if (endPoint == propagationPoint::kToVertex) { + o2::mch::TrackExtrap::extrapToVertex(mchTrack, collision.posX(), collision.posY(), collision.posZ(), collision.covXX(), collision.covYY()); + } + if (endPoint == propagationPoint::kToDCA) { + o2::mch::TrackExtrap::extrapToVertexWithoutBranson(mchTrack, collision.posZ()); + } + if (endPoint == propagationPoint::kToRabs) { + o2::mch::TrackExtrap::extrapToZ(mchTrack, -505.); + } + + auto proptrack = mMatching.MCHtoFwd(mchTrack); + propmuon.setParameters(proptrack.getParameters()); + propmuon.setZ(proptrack.getZ()); + propmuon.setCovariances(proptrack.getCovariances()); + } else if (static_cast(muon.trackType()) < 2) { // MFT-MCH-MID + const double centerMFT[3] = {0, 0, -61.4}; + o2::field::MagneticField* field = static_cast(TGeoGlobalMagField::Instance()->GetField()); + auto Bz = field->getBz(centerMFT); // Get field at centre of MFT + auto geoMan = o2::base::GeometryManager::meanMaterialBudget(muon.x(), muon.y(), muon.z(), collision.posX(), collision.posY(), collision.posZ()); + auto x2x0 = static_cast(geoMan.meanX2X0); + fwdtrack.propagateToVtxhelixWithMCS(collision.posZ(), {collision.posX(), collision.posY()}, {collision.covXX(), collision.covYY()}, Bz, x2x0); + propmuon.setParameters(fwdtrack.getParameters()); + propmuon.setZ(fwdtrack.getZ()); + propmuon.setCovariances(fwdtrack.getCovariances()); + } + + v1.clear(); + v1.shrink_to_fit(); + + return propmuon; +} +} // namespace fwdtrackutils +} // namespace o2::aod + +#endif // COMMON_CORE_FWDTRACKUTILITIES_H_ diff --git a/Common/DataModel/CMakeLists.txt b/Common/DataModel/CMakeLists.txt index da5fde3a3b0..4891b1a95e9 100644 --- a/Common/DataModel/CMakeLists.txt +++ b/Common/DataModel/CMakeLists.txt @@ -24,4 +24,5 @@ o2physics_add_header_only_library(DataModel MftmchMatchingML.h ZDCInterCalib.h EseTable.h - FwdTrackReAlignTables.h) + FwdTrackReAlignTables.h + PropagatedFwdTrackTables.h) diff --git a/Common/DataModel/PropagatedFwdTrackTables.h b/Common/DataModel/PropagatedFwdTrackTables.h new file mode 100644 index 00000000000..482ce065891 --- /dev/null +++ b/Common/DataModel/PropagatedFwdTrackTables.h @@ -0,0 +1,83 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file PropagatedFwdTrackTables.h +/// \brief Table definitions for propagated forward tracks +/// \author Maurice Coquet +/// \author Luca Micheletti +/// \author Daiki Sekihata + +#ifndef COMMON_DATAMODEL_PROPAGATEDFWDTRACKTABLES_H_ +#define COMMON_DATAMODEL_PROPAGATEDFWDTRACKTABLES_H_ + +#include "Framework/AnalysisDataModel.h" + +namespace o2::aod +{ +namespace propfwdtrack +{ +DECLARE_SOA_INDEX_COLUMN(FwdTrack, fwdtrack); //! FwdTrack index +DECLARE_SOA_COLUMN(CXXatDCA, cXXatDCA, float); //! DCAx resolution squared at DCA +DECLARE_SOA_COLUMN(CYYatDCA, cYYatDCA, float); //! DCAy resolution squared at DCA +DECLARE_SOA_COLUMN(CXYatDCA, cXYatDCA, float); //! correlation term of DCAx,y resolution at DCA +DECLARE_SOA_COLUMN(EtaMatchedMCHMID, etaMatchedMCHMID, float); //! eta of MCH-MID track in MFT-MCH-MID track at PV +DECLARE_SOA_COLUMN(PhiMatchedMCHMID, phiMatchedMCHMID, float); //! phi of MCH-MID track in MFT-MCH-MID track at PV +DECLARE_SOA_COLUMN(IsAssociatedToMPC, isAssociatedToMPC, bool); //! is assigned to the most probable collision (relevant to TTCA) +DECLARE_SOA_COLUMN(IsAmbiguous, isAmbiguous, bool); //! is ambiguous (relevant to TTCA) +} // namespace propfwdtrack + +DECLARE_SOA_TABLE_FULL(StoredPropagatedFwdTracks, "PropagatedFwdTracks", "AOD", "PROPFWDTRACK", + o2::soa::Index<>, fwdtrack::CollisionId, fwdtrack::TrackType, + fwdtrack::X, fwdtrack::Y, fwdtrack::Z, fwdtrack::Phi, fwdtrack::Tgl, + fwdtrack::Signed1Pt, fwdtrack::NClusters, fwdtrack::PDca, fwdtrack::RAtAbsorberEnd, + fwdtrack::Px, + fwdtrack::Py, + fwdtrack::Pz, + fwdtrack::Sign, + fwdtrack::Chi2, fwdtrack::Chi2MatchMCHMID, fwdtrack::Chi2MatchMCHMFT, + fwdtrack::MatchScoreMCHMFT, propfwdtrack::FwdTrackId, fwdtrack::MFTTrackId, fwdtrack::MCHTrackId, + fwdtrack::MCHBitMap, fwdtrack::MIDBitMap, fwdtrack::MIDBoards, + fwdtrack::TrackTime, fwdtrack::TrackTimeRes, + propfwdtrack::CXXatDCA, propfwdtrack::CYYatDCA, propfwdtrack::CXYatDCA, + propfwdtrack::EtaMatchedMCHMID, propfwdtrack::PhiMatchedMCHMID, + propfwdtrack::IsAssociatedToMPC, propfwdtrack::IsAmbiguous, o2::soa::Marker<1>); + +DECLARE_SOA_TABLE_FULL(StoredPropagatedFwdTracksCov, "PropagatedFwdTracksCov", "AOD", "PROPFWDTRACKCOV", //! + fwdtrack::SigmaX, fwdtrack::SigmaY, fwdtrack::SigmaPhi, fwdtrack::SigmaTgl, fwdtrack::Sigma1Pt, + fwdtrack::RhoXY, fwdtrack::RhoPhiY, fwdtrack::RhoPhiX, fwdtrack::RhoTglX, fwdtrack::RhoTglY, + fwdtrack::RhoTglPhi, fwdtrack::Rho1PtX, fwdtrack::Rho1PtY, fwdtrack::Rho1PtPhi, fwdtrack::Rho1PtTgl, o2::soa::Marker<1>); + +// extended table with expression columns that can be used as arguments of dynamic columns +DECLARE_SOA_EXTENDED_TABLE_USER(PropagatedFwdTracks, StoredPropagatedFwdTracks, "PROPFWDTRACKEXT", //! + fwdtrack::Pt, + fwdtrack::Eta, + fwdtrack::P); + +// extended table with expression columns that can be used as arguments of dynamic columns +DECLARE_SOA_EXTENDED_TABLE_USER(PropagatedFwdTracksCov, StoredPropagatedFwdTracksCov, "PROPFWDTRACKCOVEXT", //! + fwdtrack::CXX, + fwdtrack::CXY, + fwdtrack::CYY, + fwdtrack::CPhiX, + fwdtrack::CPhiY, + fwdtrack::CPhiPhi, + fwdtrack::CTglX, + fwdtrack::CTglY, + fwdtrack::CTglPhi, + fwdtrack::CTglTgl, + fwdtrack::C1PtX, + fwdtrack::C1PtY, + fwdtrack::C1PtPhi, + fwdtrack::C1PtTgl, + fwdtrack::C1Pt21Pt2); +} // namespace o2::aod + +#endif // COMMON_DATAMODEL_PROPAGATEDFWDTRACKTABLES_H_ diff --git a/Common/TableProducer/CMakeLists.txt b/Common/TableProducer/CMakeLists.txt index da33e33d0e4..4868bde02a0 100644 --- a/Common/TableProducer/CMakeLists.txt +++ b/Common/TableProducer/CMakeLists.txt @@ -148,4 +148,10 @@ o2physics_add_dpl_workflow(mftmch-matching-data-mc o2physics_add_dpl_workflow(muon-realignment SOURCES muonRealignment.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase O2::DetectorsCommonDataFormats O2::MathUtils O2::MCHTracking O2::DataFormatsMCH O2::GlobalTracking O2::MCHBase O2::MCHGeometryTransformer O2::CommonUtils - COMPONENT_NAME Analysis) \ No newline at end of file + COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(fwdtrack-propagation + SOURCES fwdtrackPropagation.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::GlobalTracking + COMPONENT_NAME Analysis) + diff --git a/Common/TableProducer/fwdtrackPropagation.cxx b/Common/TableProducer/fwdtrackPropagation.cxx new file mode 100644 index 00000000000..3868a29c365 --- /dev/null +++ b/Common/TableProducer/fwdtrackPropagation.cxx @@ -0,0 +1,426 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file fwdtrackPropagator.cxx +/// \brief Common task to produce propagated forward tracks +/// \author Maurice Coquet +/// \author Luca Micheletti +/// \author Daiki Sekihata + +#include +#include +#include + +#include "Framework/DataTypes.h" +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "TableHelper.h" +#include "CCDB/BasicCCDBManager.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "TGeoGlobalMagField.h" +#include "Field/MagneticField.h" + +#include "DetectorsBase/Propagator.h" +#include "GlobalTracking/MatchGlobalFwd.h" +#include "MCHTracking/TrackExtrap.h" +#include "MCHTracking/TrackParam.h" +#include "ReconstructionDataFormats/TrackFwd.h" + +#include "Common/DataModel/CollisionAssociationTables.h" +#include "Common/DataModel/PropagatedFwdTrackTables.h" +#include "Common/Core/fwdtrackUtilities.h" + +using namespace o2; +using namespace o2::aod; +using namespace o2::soa; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::aod::fwdtrackutils; + +struct FwdTrackPropagation { + using MyFwdTracks = soa::Join; + + Produces propfwdtracks; + Produces propfwdtrackscov; + + Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; + Configurable fillQAHistograms{"fillQAHistograms", true, "flag to fill QA histograms"}; + Configurable minPt{"minPt", 0.2, "min pt for muon"}; + Configurable maxPt{"maxPt", 1e+10, "max pt for muon"}; + Configurable minEtaSA{"minEtaSA", -4.0, "min. eta acceptance for MCH-MID"}; + Configurable maxEtaSA{"maxEtaSA", -2.5, "max. eta acceptance for MCH-MID"}; + Configurable minEtaGL{"minEtaGL", -3.6, "min. eta acceptance for MFT-MCH-MID"}; + Configurable maxEtaGL{"maxEtaGL", -2.5, "max. eta acceptance for MFT-MCH-MID"}; + Configurable minRabs{"minRabs", 17.6, "min. R at absorber end"}; + Configurable midRabs{"midRabs", 26.5, "middle R at absorber end for pDCA cut"}; + Configurable maxRabs{"maxRabs", 89.5, "max. R at absorber end"}; + Configurable maxPDCAforLargeR{"maxPDCAforLargeR", 324.f, "max. pDCA for large R at absorber end"}; + Configurable maxPDCAforSmallR{"maxPDCAforSmallR", 594.f, "max. pDCA for small R at absorber end"}; + Configurable maxMatchingChi2MCHMFT{"maxMatchingChi2MCHMFT", 50.f, "max. chi2 for MCH-MFT matching"}; + Configurable maxChi2{"maxChi2", 1e+6, "max. chi2 for muon tracking"}; + Configurable refitGlobalMuon{"refitGlobalMuon", false, "flag to refit global muon"}; + + HistogramRegistry fRegistry{"fRegistry"}; + static constexpr std::string_view muon_types[5] = {"MFTMCHMID/", "MFTMCHMIDOtherMatch/", "MFTMCH/", "MCHMID/", "MCH/"}; + + void init(o2::framework::InitContext&) + { + if (doprocessWithoutTTCA && doprocessWithTTCA) { + LOGF(fatal, "Cannot enable doprocessWithoutTTCA and doprocessWithTTCA at the same time. Please choose one."); + } + + ccdb->setURL(ccdburl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setFatalWhenNull(false); + ccdbApi.init(ccdburl); + + if (fillQAHistograms) { + addHistograms(); + } + } + + o2::ccdb::CcdbApi ccdbApi; + Service ccdb; + int mRunNumber = -1; + + template + void initCCDB(TBC const& bc) + { + if (mRunNumber == bc.runNumber()) { + return; + } + mRunNumber = bc.runNumber(); + LOGF(info, "mRunNumber = %d", mRunNumber); + std::map metadata; + auto soreor = o2::ccdb::BasicCCDBManager::getRunDuration(ccdbApi, mRunNumber); + auto ts = soreor.first; + auto grpmag = ccdbApi.retrieveFromTFileAny(grpmagPath, metadata, ts); + o2::base::Propagator::initFieldFromGRP(grpmag); + if (!o2::base::GeometryManager::isGeometryLoaded()) { + ccdb->get(geoPath); + } + o2::mch::TrackExtrap::setField(); + } + + void addHistograms() + { + auto hMuonType = fRegistry.add("hMuonType", "muon type", kTH1F, {{5, -0.5f, 4.5f}}, false); + hMuonType->GetXaxis()->SetBinLabel(1, "MFT-MCH-MID (global muon)"); + hMuonType->GetXaxis()->SetBinLabel(2, "MFT-MCH-MID (global muon other match)"); + hMuonType->GetXaxis()->SetBinLabel(3, "MFT-MCH"); + hMuonType->GetXaxis()->SetBinLabel(4, "MCH-MID"); + hMuonType->GetXaxis()->SetBinLabel(5, "MCH standalone"); + + fRegistry.add("MFTMCHMID/hPt", "pT;p_{T} (GeV/c)", kTH1F, {{100, 0.0f, 10}}, false); + fRegistry.add("MFTMCHMID/hRelDiffPt", "pT resolution;p_{T} (GeV/c);#Deltap_{T}/p_{T}", kTH2F, {{100, 0.0f, 10}, {200, 0, 0.2}}, false); + fRegistry.add("MFTMCHMID/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {60, -5.f, -2.f}}, false); + fRegistry.add("MFTMCHMID/hEtaPhi_MatchedMCHMID", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {60, -5.f, -2.f}}, false); + fRegistry.add("MFTMCHMID/hDiffCollId", "difference in collision index;collisionId_{TTCA} - collisionId_{MP}", kTH1F, {{41, -20.5, +20.5}}, false); + fRegistry.add("MFTMCHMID/hSign", "sign;sign", kTH1F, {{3, -1.5, +1.5}}, false); + fRegistry.add("MFTMCHMID/hNclusters", "Nclusters;Nclusters", kTH1F, {{21, -0.5f, 20.5}}, false); + fRegistry.add("MFTMCHMID/hNclustersMFT", "NclustersMFT;Nclusters MFT", kTH1F, {{11, -0.5f, 10.5}}, false); + fRegistry.add("MFTMCHMID/hRatAbsorberEnd", "R at absorber end;R at absorber end (cm)", kTH1F, {{100, 0.0f, 100}}, false); + fRegistry.add("MFTMCHMID/hPDCA_Rabs", "pDCA vs. Rabs;R at absorber end (cm);p #times DCA (GeV/c #upoint cm)", kTH2F, {{100, 0, 100}, {100, 0.0f, 1000}}, false); + fRegistry.add("MFTMCHMID/hChi2", "chi2;chi2", kTH1F, {{100, 0.0f, 100}}, false); + fRegistry.add("MFTMCHMID/hChi2MFT", "chi2 MFT;chi2 MFT", kTH1F, {{100, 0.0f, 100}}, false); + fRegistry.add("MFTMCHMID/hChi2MatchMCHMID", "chi2 match MCH-MID;chi2", kTH1F, {{100, 0.0f, 100}}, false); + fRegistry.add("MFTMCHMID/hChi2MatchMCHMFT", "chi2 match MCH-MFT;chi2", kTH1F, {{100, 0.0f, 100}}, false); + fRegistry.add("MFTMCHMID/hMatchScoreMCHMFT", "match score MCH-MFT;score", kTH1F, {{100, 0.0f, 100}}, false); + fRegistry.add("MFTMCHMID/hDCAxy2D", "DCA x vs. y;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -0.1, 0.1}, {200, -0.1, +0.1}}, false); + fRegistry.add("MFTMCHMID/hDCAxy2DinSigma", "DCA x vs. y in sigma;DCA_{x} (#sigma);DCA_{y} (#sigma)", kTH2F, {{200, -10, 10}, {200, -10, +10}}, false); + fRegistry.add("MFTMCHMID/hDCAxy", "DCAxy;DCA_{xy} (cm);", kTH1F, {{100, 0, 0.1}}, false); + fRegistry.add("MFTMCHMID/hDCAxyinSigma", "DCAxy in sigma;DCA_{xy} (#sigma);", kTH1F, {{100, 0, 10}}, false); + fRegistry.addClone("MFTMCHMID/", "MCHMID/"); + fRegistry.add("MFTMCHMID/hDCAxResolutionvsPt", "DCA_{x} vs. p_{T};p_{T} (GeV/c);DCA_{x} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 500}}, false); + fRegistry.add("MFTMCHMID/hDCAyResolutionvsPt", "DCA_{y} vs. p_{T};p_{T} (GeV/c);DCA_{y} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 500}}, false); + fRegistry.add("MCHMID/hDCAxResolutionvsPt", "DCA_{x} vs. p_{T};p_{T} (GeV/c);DCA_{x} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 5e+5}}, false); + fRegistry.add("MCHMID/hDCAyResolutionvsPt", "DCA_{y} vs. p_{T};p_{T} (GeV/c);DCA_{y} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 5e+5}}, false); + } + + bool isSelected(const float pt, const float eta, const float rAtAbsorberEnd, const float pDCA, const float chi2, const uint8_t trackType) + { + if (pt < minPt || maxPt < pt) { + return false; + } + + if (rAtAbsorberEnd < minRabs || maxRabs < rAtAbsorberEnd) { + return false; + } + + if (maxChi2 < chi2) { + return false; + } + + if (trackType == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack)) { + if (eta < minEtaGL || maxEtaGL < eta) { + return false; + } + } else if (trackType == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { + if (eta < minEtaSA || maxEtaSA < eta) { + return false; + } + } else { + return false; + } + + if (rAtAbsorberEnd < midRabs ? pDCA > maxPDCAforSmallR : pDCA > maxPDCAforLargeR) { + return false; + } + return true; + } + + template + void fillFwdTrackTable(TCollision const& collision, TFwdTrack fwdtrack, TFwdTracks const& fwdtracks, TMFTTracks const&, const bool isAmbiguous) + { + if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) { + std::map map_chi2MFTMCH; + const auto& matchedGlobalTracks = fwdtracks.sliceBy(perMFTTrack, fwdtrack.matchMFTTrackId()); // MFT-MCH-MID or MFT-MCH + for (const auto& matchedtrack : matchedGlobalTracks) { + if (matchedtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) { + map_chi2MFTMCH[matchedtrack.globalIndex()] = matchedtrack.chi2MatchMCHMFT(); + } + } + if (map_chi2MFTMCH.begin()->first != fwdtrack.globalIndex()) { // search for minimum chi2 + map_chi2MFTMCH.clear(); + return; + } + map_chi2MFTMCH.clear(); + + if (fwdtrack.chi2MatchMCHMFT() > maxMatchingChi2MCHMFT) { + return; + } + } // reduce useless propagation + + o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon(fwdtrack, collision, propagationPoint::kToVertex); + o2::dataformats::GlobalFwdTrack propmuonAtDCA = propagateMuon(fwdtrack, collision, propagationPoint::kToDCA); + + float pt = propmuonAtPV.getPt(); + float eta = propmuonAtPV.getEta(); + float phi = propmuonAtPV.getPhi(); + float tgl = propmuonAtPV.getTgl(); + o2::math_utils::bringTo02Pi(phi); + + float cXXatDCA = propmuonAtDCA.getSigma2X(); + float cYYatDCA = propmuonAtDCA.getSigma2Y(); + float cXYatDCA = propmuonAtDCA.getSigmaXY(); + + float dcaX = propmuonAtDCA.getX() - collision.posX(); + float dcaY = propmuonAtDCA.getY() - collision.posY(); + float rAtAbsorberEnd = fwdtrack.rAtAbsorberEnd(); // this works only for GlobalMuonTrack + float dcaXY = std::sqrt(dcaX * dcaX + dcaY * dcaY); + + float dFdx = 2.f * dcaX / dcaXY; + float dFdy = 2.f * dcaY / dcaXY; + float sigma_dcaXY = std::sqrt(cXXatDCA * dFdx * dFdx + cYYatDCA * dFdy * dFdy + 2.f * cXYatDCA * dFdx * dFdy); + + float pDCA = fwdtrack.p() * dcaXY; + int nClustersMFT = 0; + float etaMatchedMCHMID = propmuonAtPV.getEta(); + float phiMatchedMCHMID = propmuonAtPV.getPhi(); + o2::math_utils::bringTo02Pi(phiMatchedMCHMID); + float x = fwdtrack.x(); + float y = fwdtrack.y(); + float z = fwdtrack.z(); + float chi2mft = 0.f; + + if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) { + const auto& mchtrack = fwdtrack.template matchMCHTrack_as(); // MCH-MID + // etaMatchedMCHMID = mchtrack.eta(); + // phiMatchedMCHMID = mchtrack.phi(); + // o2::math_utils::bringTo02Pi(phiMatchedMCHMID); + o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToVertex); + etaMatchedMCHMID = propmuonAtPV_Matched.getEta(); + phiMatchedMCHMID = propmuonAtPV_Matched.getPhi(); + o2::math_utils::bringTo02Pi(phiMatchedMCHMID); + o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToDCA); + float dcaX_Matched = propmuonAtDCA_Matched.getX() - collision.posX(); + float dcaY_Matched = propmuonAtDCA_Matched.getY() - collision.posY(); + float dcaXY_Matched = std::sqrt(dcaX_Matched * dcaX_Matched + dcaY_Matched * dcaY_Matched); + pDCA = mchtrack.p() * dcaXY_Matched; + + const auto& mfttrack = fwdtrack.template matchMFTTrack_as(); + nClustersMFT = mfttrack.nClusters(); + if (refitGlobalMuon) { + eta = mfttrack.eta(); + phi = mfttrack.phi(); + o2::math_utils::bringTo02Pi(phi); + pt = propmuonAtPV.getP() * std::sin(2.f * std::atan(std::exp(-eta))); + + x = mfttrack.x(); + y = mfttrack.y(); + z = mfttrack.z(); + tgl = mfttrack.tgl(); + } + chi2mft = mfttrack.chi2(); + } else if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) { + o2::dataformats::GlobalFwdTrack propmuonAtRabs = propagateMuon(fwdtrack, collision, propagationPoint::kToRabs); // this is necessary only for MuonStandaloneTrack + float xAbs = propmuonAtRabs.getX(); + float yAbs = propmuonAtRabs.getY(); + rAtAbsorberEnd = std::sqrt(xAbs * xAbs + yAbs * yAbs); // Redo propagation only for muon tracks // propagation of MFT tracks alredy done in reconstruction + } else { + return; + } + + if (!isSelected(pt, eta, rAtAbsorberEnd, pDCA, fwdtrack.chi2(), fwdtrack.trackType())) { + return; + } + + const auto& fwdcov = propmuonAtPV.getCovariances(); // covatiant matrix at PV + const float sigX = std::sqrt(fwdcov(0, 0)); + const float sigY = std::sqrt(fwdcov(1, 1)); + const float sigPhi = std::sqrt(fwdcov(2, 2)); + const float sigTgl = std::sqrt(fwdcov(3, 3)); + const float sig1Pt = std::sqrt(fwdcov(4, 4)); + const float rhoXY = 128.f * fwdcov(0, 1) / (sigX * sigY); + const float rhoPhiX = 128.f * fwdcov(0, 2) / (sigPhi * sigX); + const float rhoPhiY = 128.f * fwdcov(1, 2) / (sigPhi * sigY); + const float rhoTglX = 128.f * fwdcov(0, 3) / (sigTgl * sigX); + const float rhoTglY = 128.f * fwdcov(1, 3) / (sigTgl * sigY); + const float rhoTglPhi = 128.f * fwdcov(2, 3) / (sigTgl * sigPhi); + const float rho1PtX = 128.f * fwdcov(0, 4) / (sig1Pt * sigX); + const float rho1PtY = 128.f * fwdcov(1, 4) / (sig1Pt * sigY); + const float rho1PtPhi = 128.f * fwdcov(2, 4) / (sig1Pt * sigPhi); + const float rho1PtTgl = 128.f * fwdcov(3, 4) / (sig1Pt * sigTgl); + + bool isAssociatedToMPC = fwdtrack.collisionId() == collision.globalIndex(); + // LOGF(info, "isAmbiguous = %d, isAssociatedToMPC = %d, fwdtrack.globalIndex() = %d, fwdtrack.collisionId() = %d, collision.globalIndex() = %d", isAmbiguous, isAssociatedToMPC, fwdtrack.globalIndex(), fwdtrack.collisionId(), collision.globalIndex()); + + propfwdtracks( + collision.globalIndex(), fwdtrack.trackType(), + x, y, z, phi, tgl, + fwdtrack.sign() / pt, fwdtrack.nClusters(), pDCA, rAtAbsorberEnd, + fwdtrack.chi2(), fwdtrack.chi2MatchMCHMID(), fwdtrack.chi2MatchMCHMFT(), + fwdtrack.matchScoreMCHMFT(), fwdtrack.globalIndex(), fwdtrack.matchMFTTrackId(), fwdtrack.matchMCHTrackId(), + fwdtrack.mchBitMap(), fwdtrack.midBitMap(), fwdtrack.midBoards(), fwdtrack.trackTime(), fwdtrack.trackTimeRes(), + cXXatDCA, cYYatDCA, cXYatDCA, etaMatchedMCHMID, phiMatchedMCHMID, isAssociatedToMPC, isAmbiguous); + + propfwdtrackscov( + sigX, sigY, sigPhi, sigTgl, sig1Pt, + rhoXY, rhoPhiX, rhoPhiY, rhoTglX, rhoTglY, + rhoTglPhi, rho1PtX, rho1PtY, rho1PtPhi, rho1PtTgl); + + if (fillQAHistograms) { + fRegistry.fill(HIST("hMuonType"), fwdtrack.trackType()); + if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) { + fRegistry.fill(HIST("MFTMCHMID/hPt"), pt); + fRegistry.fill(HIST("MFTMCHMID/hRelDiffPt"), pt, sig1Pt * pt); + fRegistry.fill(HIST("MFTMCHMID/hEtaPhi"), phi, eta); + fRegistry.fill(HIST("MFTMCHMID/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); + fRegistry.fill(HIST("MFTMCHMID/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); + fRegistry.fill(HIST("MFTMCHMID/hSign"), fwdtrack.sign()); + fRegistry.fill(HIST("MFTMCHMID/hNclusters"), fwdtrack.nClusters()); + fRegistry.fill(HIST("MFTMCHMID/hNclustersMFT"), nClustersMFT); + fRegistry.fill(HIST("MFTMCHMID/hPDCA_Rabs"), rAtAbsorberEnd, pDCA); + fRegistry.fill(HIST("MFTMCHMID/hRatAbsorberEnd"), rAtAbsorberEnd); + fRegistry.fill(HIST("MFTMCHMID/hChi2"), fwdtrack.chi2()); + fRegistry.fill(HIST("MFTMCHMID/hChi2MFT"), chi2mft); + fRegistry.fill(HIST("MFTMCHMID/hChi2MatchMCHMID"), fwdtrack.chi2MatchMCHMID()); + fRegistry.fill(HIST("MFTMCHMID/hChi2MatchMCHMFT"), fwdtrack.chi2MatchMCHMFT()); + fRegistry.fill(HIST("MFTMCHMID/hMatchScoreMCHMFT"), fwdtrack.matchScoreMCHMFT()); + fRegistry.fill(HIST("MFTMCHMID/hDCAxy2D"), dcaX, dcaY); + fRegistry.fill(HIST("MFTMCHMID/hDCAxy2DinSigma"), dcaX / std::sqrt(cXXatDCA), dcaY / std::sqrt(cYYatDCA)); + fRegistry.fill(HIST("MFTMCHMID/hDCAxy"), dcaXY); + fRegistry.fill(HIST("MFTMCHMID/hDCAxyinSigma"), dcaXY / sigma_dcaXY); + fRegistry.fill(HIST("MFTMCHMID/hDCAxResolutionvsPt"), pt, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/hDCAyResolutionvsPt"), pt, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um + } else if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) { + fRegistry.fill(HIST("MCHMID/hPt"), pt); + fRegistry.fill(HIST("MCHMID/hRelDiffPt"), pt, sig1Pt * pt); + fRegistry.fill(HIST("MCHMID/hEtaPhi"), phi, eta); + fRegistry.fill(HIST("MCHMID/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); + fRegistry.fill(HIST("MCHMID/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); + fRegistry.fill(HIST("MCHMID/hSign"), fwdtrack.sign()); + fRegistry.fill(HIST("MCHMID/hNclusters"), fwdtrack.nClusters()); + fRegistry.fill(HIST("MCHMID/hNclustersMFT"), nClustersMFT); + fRegistry.fill(HIST("MCHMID/hPDCA_Rabs"), rAtAbsorberEnd, pDCA); + fRegistry.fill(HIST("MCHMID/hRatAbsorberEnd"), rAtAbsorberEnd); + fRegistry.fill(HIST("MCHMID/hChi2"), fwdtrack.chi2()); + fRegistry.fill(HIST("MCHMID/hChi2MFT"), chi2mft); + fRegistry.fill(HIST("MCHMID/hChi2MatchMCHMID"), fwdtrack.chi2MatchMCHMID()); + fRegistry.fill(HIST("MCHMID/hChi2MatchMCHMFT"), fwdtrack.chi2MatchMCHMFT()); + fRegistry.fill(HIST("MCHMID/hMatchScoreMCHMFT"), fwdtrack.matchScoreMCHMFT()); + fRegistry.fill(HIST("MCHMID/hDCAxy2D"), dcaX, dcaY); + fRegistry.fill(HIST("MCHMID/hDCAxy2DinSigma"), dcaX / std::sqrt(cXXatDCA), dcaY / std::sqrt(cYYatDCA)); + fRegistry.fill(HIST("MCHMID/hDCAxy"), dcaXY); + fRegistry.fill(HIST("MCHMID/hDCAxyinSigma"), dcaXY / sigma_dcaXY); + fRegistry.fill(HIST("MCHMID/hDCAxResolutionvsPt"), pt, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um + fRegistry.fill(HIST("MCHMID/hDCAyResolutionvsPt"), pt, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um + } + } + } + + SliceCache cache; + PresliceUnsorted perMFTTrack = o2::aod::fwdtrack::matchMFTTrackId; + Preslice perCollision = o2::aod::fwdtrack::collisionId; + // Preslice perCollisionMFT = o2::aod::fwdtrack::collisionId; + Preslice fwdtrackIndicesPerCollision = aod::track_association::collisionId; + PresliceUnsorted fwdtrackIndicesPerFwdTrack = aod::track_association::fwdtrackId; + + void processWithoutTTCA(aod::Collisions const& collisions, MyFwdTracks const& fwdtracks, aod::MFTTracks const& mfttracks, aod::BCsWithTimestamps const&) + { + for (const auto& collision : collisions) { + const auto& bc = collision.template bc_as(); + initCCDB(bc); + + const auto& fwdtracks_per_coll = fwdtracks.sliceBy(perCollision, collision.globalIndex()); + for (const auto& fwdtrack : fwdtracks_per_coll) { + if (fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) { + continue; + } + fillFwdTrackTable(collision, fwdtrack, fwdtracks, mfttracks, false); + } // end of fwdtrack loop + } // end of collision loop + } + PROCESS_SWITCH(FwdTrackPropagation, processWithoutTTCA, "process without TTCA", true); + + void processWithTTCA(aod::Collisions const& collisions, MyFwdTracks const& fwdtracks, aod::MFTTracks const& mfttracks, aod::BCsWithTimestamps const&, aod::FwdTrackAssoc const& fwdtrackIndices) + { + std::unordered_map mapAmb; // fwdtrack.globalIndex() -> bool isAmb; + for (const auto& fwdtrack : fwdtracks) { + const auto& fwdtrackIdsPerFwdTrack = fwdtrackIndices.sliceBy(fwdtrackIndicesPerFwdTrack, fwdtrack.globalIndex()); + mapAmb[fwdtrack.globalIndex()] = fwdtrackIdsPerFwdTrack.size() > 1; + // LOGF(info, "fwdtrack.globalIndex() = %d, ntimes = %d, isAmbiguous = %d", fwdtrack.globalIndex(), fwdtrackIdsPerFwdTrack.size(), mapAmb[fwdtrack.globalIndex()]); + } // end of fwdtrack loop + + for (const auto& collision : collisions) { + const auto& bc = collision.template bc_as(); + initCCDB(bc); + + const auto& fwdtrackIdsThisCollision = fwdtrackIndices.sliceBy(fwdtrackIndicesPerCollision, collision.globalIndex()); + for (const auto& fwdtrackId : fwdtrackIdsThisCollision) { + const auto& fwdtrack = fwdtrackId.template fwdtrack_as(); + if (fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) { + continue; + } + fillFwdTrackTable(collision, fwdtrack, fwdtracks, mfttracks, mapAmb[fwdtrack.globalIndex()]); + } // end of fwdtrack loop + } // end of collision loop + mapAmb.clear(); + } + PROCESS_SWITCH(FwdTrackPropagation, processWithTTCA, "process with TTCA", false); +}; + +// Extends the PropagatedFwdTracks table for expression columns +struct PropagatedFwdTrackSpawner { + Spawns propFwdTracks; + Spawns propFwdTracksCov; + void init(InitContext const&) {} +}; +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc, TaskName{"fwdtrack-propagation"}), + adaptAnalysisTask(cfgc, TaskName{"propagated-fwdtrack-spawner"}), + }; +} From e98c56e09c3565ff0a7a4d320d4831a9b2af9a5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Thu, 27 Mar 2025 00:15:47 +0100 Subject: [PATCH 0839/1650] [PWGHF] fix a mistake in previous commit in tcc tree creator (#10666) Co-authored-by: ALICE Action Bot --- PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx b/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx index 3d4f12dba49..75526481a29 100644 --- a/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx +++ b/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx @@ -293,6 +293,7 @@ struct HfTreeCreatorTccToD0D0Pi { massD01 = hfHelper.invMassD0ToPiK(candidateD1); } if (candidateD1.isSelD0bar()) { + candFlagD1 = 2; std::copy(candidateD1.mlProbD0bar().begin(), candidateD1.mlProbD0bar().end(), std::back_inserter(mlScoresD1)); massD01 = hfHelper.invMassD0barToKPi(candidateD1); } @@ -303,6 +304,7 @@ struct HfTreeCreatorTccToD0D0Pi { massD02 = hfHelper.invMassD0ToPiK(candidateD2); } if (candidateD2.isSelD0bar()) { + candFlagD2 = 2; std::copy(candidateD2.mlProbD0bar().begin(), candidateD2.mlProbD0bar().end(), std::back_inserter(mlScoresD2)); massD02 = hfHelper.invMassD0barToKPi(candidateD2); } From 74f25ca966790a0ab8d18678640b2f36c02e654e Mon Sep 17 00:00:00 2001 From: yuanzhe <90246048+wang-yuanzhe@users.noreply.github.com> Date: Thu, 27 Mar 2025 08:53:58 +0100 Subject: [PATCH 0840/1650] [PWGLF] Add trigger selection for hypertriton 3body analysis (#10659) Co-authored-by: creetz16 Co-authored-by: creetz16 <79141119+creetz16@users.noreply.github.com> Co-authored-by: ALICE Action Bot --- .../Nuspex/decay3bodybuilder.cxx | 152 +++++++++++++++--- .../Nuspex/reduced3bodyCreator.cxx | 8 +- .../Nuspex/threebodyRecoTask.cxx | 9 +- 3 files changed, 147 insertions(+), 22 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx b/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx index 6bb7fe503cf..e4d05bbacd5 100644 --- a/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx +++ b/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx @@ -256,6 +256,8 @@ struct decay3bodyBuilder { // for KFParticle reconstruction struct : ConfigurableGroup { Configurable cfgSkimmedProcessing{"kfparticleConfigurations.cfgSkimmedProcessing", false, "Flag for skimmed dataset processing"}; + Configurable triggerList{"kfparticleConfigurations.triggerList", "fH3L3Body", "List of triggers used to select events"}; + Configurable cfgOnlyKeepInterestedTrigger{"kfparticleConfigurations.cfgOnlyKeepInterestedTrigger", false, "Flag to keep only interested trigger"}; Configurable fillCandidateFullTable{"kfparticleConfigurations.fillCandidateFullTable", false, "Switch to fill full table with candidate properties"}; Configurable doSel8selection{"kfparticleConfigurations.doSel8selection", true, "flag for sel8 event selection"}; Configurable doPosZselection{"kfparticleConfigurations.doPosZselection", true, "flag for posZ event selection"}; @@ -301,9 +303,13 @@ struct decay3bodyBuilder { Configurable nEvtMixing{"kfparticleConfigurations.nEvtMixing", 5, "Number of events to mix"}; ConfigurableAxis binsVtxZ{"kfparticleConfigurations.binsVtxZ", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; ConfigurableAxis binsMultiplicity{"kfparticleConfigurations.binsMultiplicity", {VARIABLE_WIDTH, 0.0f, 1.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f, 110.0f}, "Mixing bins - multiplicity"}; - ConfigurableAxis bins3BodyRadius{"kfparticleConfigurations.bins3BodyRadius", {VARIABLE_WIDTH, 0.0f, 0.5f, 1.0f, 1.5f, 2.0f, 2.5f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 12.0f, 14.0f, 16.0f, 18.0f, 20.0f, 30.0f, 40.0f, 50.0f, 100.0f}, "Mixing bins - 3body radius"}; - ConfigurableAxis bins3BodyPhi{"kfparticleConfigurations.bins3BodyPhi", {VARIABLE_WIDTH, 0.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f, 110.0f, 120.0f, 130.0f, 140.0f, 150.0f, 160.0f, 170.0f, 180.0f, 190.0f, 200.0f, 210.0f, 220.0f, 230.0f, 240.0f, 250.0f, 260.0f, 270.0f, 280.0f, 290.0f, 300.0f, 310.0f, 320.0f, 330.0f, 340.0f, 350.0f, 360.0f}, "Mixing bins - 3body phi"}; - ConfigurableAxis bins3BodyPosZ{"kfparticleConfigurations.bins3BodyPosZ", {VARIABLE_WIDTH, -500.0f, -200.0f, -100.0f, -70.0f, -60.0f, -50.0f, -40.0f, -35.0f, -30.0f, -25.0f, -20.0f, -15.0f, -13.0f, -10.0f, -8.0f, -6.0f, -4.0f, -2.0f, 0.0f, 2.0f, 4.0f, 6.0f, 8.0f, 10.0f, 13.0f, 15.0f, 20.0f, 25.0f, 30.0f, 35.0f, 40.0f, 50.0f, 60.0f, 70.0f, 100.0f, 200.0f, 500.0f}, "Mixing bins - 3body z position"}; + // 3body mixing + Configurable mixingType{"kfparticleConfigurations.mixingType", 0, "0: mix V0 from one event with bachelor from another, 1: mix pion and bachelor from one event with proton from another "}; + Configurable applySVertexerV0Cuts{"kfparticleConfigurations.applySVertexerV0Cuts", false, "Apply virtual V0 cuts applied in SVertexer in case of proton mixing"}; + ConfigurableAxis bins3BodyRadius{"kfparticleConfigurations.bins3BodyRadius", {VARIABLE_WIDTH, 0.0f, 0.5f, 1.0f, 1.5f, 2.0f, 3.0f, 4.0f, 6.0f, 8.0f, 10.0f, 12.0f, 14.0f, 16.0f, 18.0f, 20.0f, 30.0f, 1000.0}, "Mixing bins - 3body radius"}; + // ConfigurableAxis bins3BodyPhi{"kfparticleConfigurations.bins3BodyPhi", {VARIABLE_WIDTH, -180.0f*TMath::Pi()/180, -170.0f*TMath::Pi()/180, -160.0f*TMath::Pi()/180, -150.0f*TMath::Pi()/180, -140.0f*TMath::Pi()/180, -130.0f*TMath::Pi()/180, -120.0f*TMath::Pi()/180, -110.0f*TMath::Pi()/180, -100.0f*TMath::Pi()/180, -90.0f*TMath::Pi()/180, -80.0f*TMath::Pi()/180, -70.0f*TMath::Pi()/180, -60.0f*TMath::Pi()/180, -50.0f*TMath::Pi()/180, -40.0f*TMath::Pi()/180, -30.0f*TMath::Pi()/180, -20.0f*TMath::Pi()/180, -10.0f*TMath::Pi()/180, 0.0f, 10.0f*TMath::Pi()/180, 20.0f*TMath::Pi()/180, 30.0f*TMath::Pi()/180, 40.0f*TMath::Pi()/180, 50.0f*TMath::Pi()/180, 60.0f*TMath::Pi()/180, 70.0f*TMath::Pi()/180, 80.0f*TMath::Pi()/180, 90.0f*TMath::Pi()/180, 100.0f*TMath::Pi()/180, 110.0f*TMath::Pi()/180, 120.0f*TMath::Pi()/180, 130.0f*TMath::Pi()/180, 140.0f*TMath::Pi()/180, 150.0f*TMath::Pi()/180, 160.0f*TMath::Pi()/180, 170.0f*TMath::Pi()/180, 180.0f*TMath::Pi()/180}, "Mixing bins - 3body phi"}; + ConfigurableAxis bins3BodyPhi{"kfparticleConfigurations.bins3BodyPhi", {VARIABLE_WIDTH, -180.0f * TMath::Pi() / 180, -160.0f * TMath::Pi() / 180, -140.0f * TMath::Pi() / 180, -120.0f * TMath::Pi() / 180, -100.0f * TMath::Pi() / 180, -80.0f * TMath::Pi() / 180, -60.0f * TMath::Pi() / 180, -40.0f * TMath::Pi() / 180, -20.0f * TMath::Pi() / 180, 0.0f, 20.0f * TMath::Pi() / 180, 40.0f * TMath::Pi() / 180, 60.0f * TMath::Pi() / 180, 80.0f * TMath::Pi() / 180, 100.0f * TMath::Pi() / 180, 120.0f * TMath::Pi() / 180, 140.0f * TMath::Pi() / 180, 160.0f * TMath::Pi() / 180, 180.0f * TMath::Pi() / 180}, "Mixing bins - 3body phi"}; + ConfigurableAxis bins3BodyPosZ{"kfparticleConfigurations.bins3BodyPosZ", {VARIABLE_WIDTH, -300.0f, -42.0f, -13.0f, -6.0f, -4.0f, -2.0f, 0.0f, 2.0f, 4.0f, 6.0f, 13.0f, 42.0f, 300.0f}, "Mixing bins - 3body z position"}; Configurable selectVtxZ3bodyMixing{"kfparticleConfigurations.selectVtxZ3bodyMixing", true, "Select same VtxZ events in case of 3body mixing"}; Configurable VtxZBin3bodyMixing{"kfparticleConfigurations.VtxZBin3bodyMixing", 1., "Bin width for event vtx z position in case of 3body mixing"}; } kfparticleConfigurations; @@ -348,7 +354,8 @@ struct decay3bodyBuilder { using BinningTypeKF = ColumnBinningPolicy; // 3body mixing - using Binning3Body = ColumnBinningPolicy; + // using Binning3Body = ColumnBinningPolicy; + using Binning3Body = ColumnBinningPolicy; // Filters and slices Preslice perCollision = o2::aod::decay3body::collisionId; @@ -575,9 +582,20 @@ struct decay3bodyBuilder { if (doprocessRun3withKFParticleReduced3bodyMixing == true) { auto h3bodyCombinationCounter = registry.add("QA/EM/h3bodyCombinationCounter", "h3bodyCombinationCounter", HistType::kTH1D, {{4, 0.0f, 4.0f}}); h3bodyCombinationCounter->GetXaxis()->SetBinLabel(1, "total"); - h3bodyCombinationCounter->GetXaxis()->SetBinLabel(2, "bach sign/ID"); - h3bodyCombinationCounter->GetXaxis()->SetBinLabel(3, "not same collision"); - h3bodyCombinationCounter->GetXaxis()->SetBinLabel(4, "collision VtxZ"); + h3bodyCombinationCounter->GetXaxis()->SetBinLabel(2, "not same collision"); + h3bodyCombinationCounter->GetXaxis()->SetBinLabel(3, "collision VtxZ"); + h3bodyCombinationCounter->GetXaxis()->SetBinLabel(4, "bach sign/ID"); + h3bodyCombinationCounter->LabelsOption("v"); + // registry.add("QA/EM/h3bodyBinCounts", "h3bodyBinCounts", HistType::kTH3D, {{16, 0, 16, "bins radius"}, {36, 0, 36, "bins phi"}, {12, 0, 12, "bins pos Z"}}); + registry.add("QA/EM/h3bodyBinCounts", "h3bodyBinCounts", HistType::kTH2D, {{16, 0, 16, "bins radius"}, {18, 0, 18, "bins phi"}}); + + AxisSpec radiusAxis = {kfparticleConfigurations.bins3BodyRadius, "Radius (cm)"}; + AxisSpec phiAxis = {kfparticleConfigurations.bins3BodyPhi, "#phi (degree)"}; + AxisSpec posZAxis = {kfparticleConfigurations.bins3BodyPosZ, "position in z (cm)"}; + + registry.add("QA/EM/hRadius", "hRadius", HistType::kTH1F, {radiusAxis}); + registry.add("QA/EM/hPhi", "hPhi", HistType::kTH1F, {phiAxis}); + registry.add("QA/EM/hPosZ", "hPosZ", HistType::kTH1F, {posZAxis}); } } @@ -587,7 +605,7 @@ struct decay3bodyBuilder { return; } if (kfparticleConfigurations.cfgSkimmedProcessing) { - zorro.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), "Counter"); + zorro.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), kfparticleConfigurations.triggerList); zorro.populateHistRegistry(registry, bc.runNumber()); } @@ -748,6 +766,9 @@ struct decay3bodyBuilder { // setMatLUT only after magfield has been initalized o2::base::Propagator::Instance()->setMatLUT(lut); } + + // cache magnetic field info + ccdbCache[runNumber] = d_bz; } //------------------------------------------------------------------ @@ -1473,6 +1494,26 @@ struct decay3bodyBuilder { } registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxV0MassConst); + // apply virtual V0 cuts used in SVertexer in case of 3body mixing with proton track + if (kfparticleConfigurations.mixingType == 1 && kfparticleConfigurations.applySVertexerV0Cuts) { + // V0 radius + if (std::sqrt(KFV0.GetX() * KFV0.GetX() + KFV0.GetY() * KFV0.GetY()) <= 0.5) { + return; + } + // pT + if (KFV0.GetPt() <= 0.01) { + return; + } + // pz/pT + if (KFV0.GetPz() / KFV0.GetPt() >= 2) { + return; + } + // cos(PA) + if (cpaXYFromKF(KFV0, kfpv) <= 0.9 || cpaFromKF(KFV0, kfpv) <= 0.8) { + return; + } + } + // -------- STEP 3: fit three body vertex -------- // Create KFParticle object from deuteron track KFParticle kfpDeuteron; @@ -1898,6 +1939,10 @@ struct decay3bodyBuilder { isZorroSelected = zorro.isSelected(collision.template bc_as().globalBC()); if (isZorroSelected) { registry.fill(HIST("Counters/hEventCounterZorro"), 0.); + } else { + if (kfparticleConfigurations.cfgOnlyKeepInterestedTrigger) { + continue; + } } } @@ -2150,37 +2195,108 @@ struct decay3bodyBuilder { void processRun3withKFParticleReduced3bodyMixing(ReducedCollisionsMults const&, aod::RedIUTracks const&, soa::Join const& decay3bodys) { - Binning3Body binningOnRadPhiPosZ{{kfparticleConfigurations.bins3BodyRadius, kfparticleConfigurations.bins3BodyPhi, kfparticleConfigurations.bins3BodyPosZ}, true}; + // Define a 2D array to count 3bodies per bin (radius, phi, posZ) + std::vector> bin3bodyCounts(16, std::vector(36, 0)); + + // Function to find bin index (returns -1 if out of range) + auto findBin = [](float value, const std::vector& binEdges) -> int { + for (size_t i = 0; i < binEdges.size() - 1; ++i) { + if (value > binEdges[i] && value <= binEdges[i + 1]) { + return i; + } + } + return -1; // Out of range + }; + + int counter = 0; + // Loop over all collisions to count them in bins + for (auto& decay3body : decay3bodys) { + counter++; + float radius = decay3body.radius(); + float phi = decay3body.phi(); + float posZ = decay3body.posz(); + + registry.fill(HIST("QA/EM/hRadius"), radius); + registry.fill(HIST("QA/EM/hPhi"), phi); + registry.fill(HIST("QA/EM/hPosZ"), posZ); + + // float degToRad = TMath::Pi()/180; + + // Determine bin indices + int radiusBin = findBin(radius, {0.0f, 0.5f, 1.0f, 1.5f, 2.0f, 3.0f, 4.0f, 6.0f, 8.0f, 10.0f, 12.0f, 14.0f, 16.0f, 18.0f, 20.0f, 30.0f, 1000.0}); + int phiBin = findBin(phi, {-180.0f * TMath::Pi() / 180, -160.0f * TMath::Pi() / 180, -140.0f * TMath::Pi() / 180, -120.0f * TMath::Pi() / 180, -100.0f * TMath::Pi() / 180, -80.0f * TMath::Pi() / 180, -60.0f * TMath::Pi() / 180, -40.0f * TMath::Pi() / 180, -20.0f * TMath::Pi() / 180, 0.0f, 20.0f * TMath::Pi() / 180, 40.0f * TMath::Pi() / 180, 60.0f * TMath::Pi() / 180, 80.0f * TMath::Pi() / 180, 100.0f * TMath::Pi() / 180, 120.0f * TMath::Pi() / 180, 140.0f * TMath::Pi() / 180, 160.0f * TMath::Pi() / 180, 180.0f * TMath::Pi() / 180}); + if (radiusBin >= 0 && phiBin >= 0) { // && posZBin >= 0) { + bin3bodyCounts[radiusBin][phiBin]++; //[posZBin]++; + } + } + LOG(info) << "3body counter: " << counter; + + // Print out the number of 3-body decays per bin + LOG(info) << "3body count per bin (radius, phi, posZ):"; + for (size_t i = 0; i < bin3bodyCounts.size(); ++i) { + for (size_t j = 0; j < bin3bodyCounts[i].size(); ++j) { + LOG(info) << "Bin (" << i << ", " << j << "): " << bin3bodyCounts[i][j] << " 3bodies"; + } + } + // Fill 3D histogram with numbers per bin + for (size_t i = 0; i < bin3bodyCounts.size(); ++i) { + for (size_t j = 0; j < bin3bodyCounts[i].size(); ++j) { + registry.fill(HIST("QA/EM/h3bodyBinCounts"), i, j, bin3bodyCounts[i][j]); + } + } + LOG(info) << "Integral of h3bodyBinCounts: " << registry.get(HIST("QA/EM/h3bodyBinCounts"))->Integral(); + + Binning3Body binningOnRadPhi{{kfparticleConfigurations.bins3BodyRadius, kfparticleConfigurations.bins3BodyPhi}, true}; // Strictly upper index policy for decay3body objects binned by radius, phi and z position - for (auto& [decay3body1, decay3body2] : selfCombinations(binningOnRadPhiPosZ, kfparticleConfigurations.nEvtMixing, -1, decay3bodys, decay3bodys)) { + for (auto& [decay3body1, decay3body2] : selfPairCombinations(binningOnRadPhi, kfparticleConfigurations.nEvtMixing, -1, decay3bodys)) { auto trackPos1 = decay3body1.template track0_as(); auto trackNeg1 = decay3body1.template track1_as(); auto trackBach1 = decay3body1.template track2_as(); + auto trackPos2 = decay3body2.template track0_as(); + auto trackNeg2 = decay3body2.template track1_as(); auto trackBach2 = decay3body2.template track2_as(); registry.fill(HIST("QA/EM/h3bodyCombinationCounter"), 0.5); - // ---------- selections ---------- - if ((trackBach1.sign() > 0 && !(trackBach2.sign() > 0)) || (trackBach1.sign() < 0 && !(trackBach2.sign() < 0)) || trackBach1.globalIndex() == trackBach2.globalIndex()) { // only combine if trackBach2 has correct sign and is not same as trackBach1 + // collision vertex selections + auto collision1 = decay3body1.template collision_as(); + auto collision2 = decay3body2.template collision_as(); + initCCDBfromRunNumber(collision2.runNumber()); + initCCDBfromRunNumber(collision1.runNumber()); + + if (decay3body1.collisionId() == decay3body2.collisionId()) { // only combine if from different event continue; } registry.fill(HIST("QA/EM/h3bodyCombinationCounter"), 1.5); - - if (decay3body1.collisionId() == decay3body2.collisionId()) { // only combine if from different event + if (kfparticleConfigurations.selectVtxZ3bodyMixing && std::abs(collision1.posZ() - collision2.posZ()) > kfparticleConfigurations.VtxZBin3bodyMixing) { // only combine if collision similar in VtxZ continue; } registry.fill(HIST("QA/EM/h3bodyCombinationCounter"), 2.5); - auto collision1 = decay3body1.template collision_as(); - auto collision2 = decay3body2.template collision_as(); - if (kfparticleConfigurations.selectVtxZ3bodyMixing && std::abs(collision1.posZ() - collision2.posZ()) > kfparticleConfigurations.VtxZBin3bodyMixing) { // only combine if collision similar in VtxZ + // ---------- selections ---------- + if ((trackBach1.sign() > 0 && !(trackBach2.sign() > 0)) || (trackBach1.sign() < 0 && !(trackBach2.sign() < 0)) || trackBach1.globalIndex() == trackBach2.globalIndex()) { // only combine if trackBach2 has correct sign and is not same as trackBach1 continue; } registry.fill(HIST("QA/EM/h3bodyCombinationCounter"), 3.5); // ---------- do candidate analysis ---------- - buildVtx3BodyDataTableKFParticle(collision1, trackPos1, trackNeg1, trackBach2, -1 /*vtx3bodyID*/, bachelorcharge, trackBach2.tofNSigmaDe()); + bool isMatter1 = false; + if (trackBach1.sign() > 0) { + isMatter1 = true; + } + if (kfparticleConfigurations.mixingType == 0) { // mix deuteron + buildVtx3BodyDataTableKFParticle(collision1, trackPos1, trackNeg1, trackBach2, -1 /*vtx3bodyID*/, bachelorcharge, trackBach2.tofNSigmaDe()); + buildVtx3BodyDataTableKFParticle(collision2, trackPos2, trackNeg2, trackBach1, -1 /*vtx3bodyID*/, bachelorcharge, trackBach1.tofNSigmaDe()); + } else if (kfparticleConfigurations.mixingType == 1) { // mix proton + if (isMatter1 == true) { + buildVtx3BodyDataTableKFParticle(collision1, trackPos2, trackNeg1, trackBach1, -1 /*vtx3bodyID*/, bachelorcharge, trackBach1.tofNSigmaDe()); + buildVtx3BodyDataTableKFParticle(collision2, trackPos1, trackNeg2, trackBach2, -1 /*vtx3bodyID*/, bachelorcharge, trackBach2.tofNSigmaDe()); + } else if (isMatter1 == false) { + buildVtx3BodyDataTableKFParticle(collision1, trackPos1, trackNeg2, trackBach1, -1 /*vtx3bodyID*/, bachelorcharge, trackBach1.tofNSigmaDe()); + buildVtx3BodyDataTableKFParticle(collision2, trackPos2, trackNeg1, trackBach2, -1 /*vtx3bodyID*/, bachelorcharge, trackBach2.tofNSigmaDe()); + } + } } // end decay3body combinations loop } PROCESS_SWITCH(decay3bodyBuilder, processRun3withKFParticleReduced3bodyMixing, "Produce KFParticle mixed decay3body tables from derived decay3body data", false); diff --git a/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx b/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx index 0067195e9e7..f8d3d04856a 100644 --- a/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx +++ b/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx @@ -105,7 +105,9 @@ struct reduced3bodyCreator { // Zorro counting Configurable cfgSkimmedProcessing{"cfgSkimmedProcessing", false, "Skimmed dataset processing"}; // Flag for trigger - Configurable cfgOnlyKeepH3L3Body{"cfgOnlyKeepH3L3Body", false, "Flag to keep only H3L3Body trigger"}; + Configurable cfgOnlyKeepInterestedTrigger{"cfgOnlyKeepInterestedTrigger", false, "Flag to keep only interested trigger"}; + Configurable triggerList{"triggerList", "fH3L3Body", "List of triggers used to select events"}; + Configurable cfgMaterialCorrection{"cfgMaterialCorrection", static_cast(o2::base::Propagator::MatCorrType::USEMatCorrNONE), "Type of material correction for DCAFitter"}; int mRunNumber; @@ -152,7 +154,7 @@ struct reduced3bodyCreator { void initZorroBC(aod::BCsWithTimestamps::iterator const& bc) { if (cfgSkimmedProcessing) { - zorro.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), "fH3L3Body"); + zorro.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), triggerList); zorro.populateHistRegistry(registry, bc.runNumber()); } } @@ -352,7 +354,7 @@ struct reduced3bodyCreator { auto bc = collision.bc_as(); initCCDB(bc); - if (cfgSkimmedProcessing && cfgOnlyKeepH3L3Body) { + if (cfgSkimmedProcessing && cfgOnlyKeepInterestedTrigger) { if (triggeredCollisions[collision.globalIndex()] == false) { continue; } diff --git a/PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx b/PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx index c847730a795..91bdc538dea 100644 --- a/PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx +++ b/PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx @@ -101,6 +101,9 @@ struct ThreebodyRecoTask { //------------------------------------------------------------------ PresliceUnsorted perCollisionVtx3BodyDatas = o2::aod::vtx3body::collisionId; + // Configurable for trigger selection + Configurable triggerList{"triggerList", "fH3L3Body", "List of triggers used to select events"}; + Configurable cfgOnlyKeepInterestedTrigger{"cfgOnlyKeepInterestedTrigger", false, "Flag to keep only interested trigger"}; // Configuration to enable like-sign analysis Configurable cfgLikeSignAnalysis{"cfgLikeSignAnalysis", false, "Enable like-sign analysis"}; // Selection criteria @@ -275,7 +278,7 @@ struct ThreebodyRecoTask { } if (cfgSkimmedProcessing) { - zorro.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), "fH3L3Body"); + zorro.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), triggerList); zorro.populateHistRegistry(registry, bc.runNumber()); } @@ -337,6 +340,10 @@ struct ThreebodyRecoTask { bool zorroSelected = zorro.isSelected(bc.globalBC()); /// Just let Zorro do the accounting if (zorroSelected) { registry.fill(HIST("hEventCounter"), 3.5); + } else { + if (cfgOnlyKeepInterestedTrigger) { + return false; + } } } From 7f3559fa528c4ad758379f7f469a491d3cb94edf Mon Sep 17 00:00:00 2001 From: Samuele Cattaruzzi <124249902+scattaru@users.noreply.github.com> Date: Thu, 27 Mar 2025 09:01:46 +0100 Subject: [PATCH 0841/1650] [DPG] AOTTrack: Adding pID and DCA to cluster size histograms (#10664) --- DPG/Tasks/AOTTrack/qaImpPar.cxx | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/DPG/Tasks/AOTTrack/qaImpPar.cxx b/DPG/Tasks/AOTTrack/qaImpPar.cxx index c203638b657..228934bda7f 100644 --- a/DPG/Tasks/AOTTrack/qaImpPar.cxx +++ b/DPG/Tasks/AOTTrack/qaImpPar.cxx @@ -315,9 +315,9 @@ struct QaImpactPar { histograms.add("Reco/h4ImpPar", "", kTHnSparseD, {trackPtAxis, trackImpParRPhiAxis, trackEtaAxis, trackPhiAxis, trackPDGAxis, trackChargeAxis, axisVertexNumContrib, trackIsPvContrib}); histograms.add("Reco/h4ImpParZ", "", kTHnSparseD, {trackPtAxis, trackImpParZAxis, trackEtaAxis, trackPhiAxis, trackPDGAxis, trackChargeAxis, axisVertexNumContrib, trackIsPvContrib}); if (addTrackIUinfo) { - histograms.add("Reco/h4ClusterSizeIU", "", kTHnSparseD, {trackPaxis, trackIUposXaxis, trackIUposYaxis, trackIUposZaxis, trackIUclusterSize}); - histograms.add("Reco/h4ImpParIU", "", kTHnSparseD, {trackPaxis, trackImpParRPhiAxis, trackIUposXaxis, trackIUposYaxis, trackIUposZaxis}); - histograms.add("Reco/h4ImpParZIU", "", kTHnSparseD, {trackPaxis, trackImpParZAxis, trackIUposXaxis, trackIUposYaxis, trackIUposZaxis}); + histograms.add("Reco/h4ClusterSizeIU", "", kTHnD, {trackPaxis, trackImpParRPhiAxis, trackIUposXaxis, trackIUposYaxis, trackIUposZaxis, trackIUclusterSize}); + // histograms.add("Reco/h4ImpParIU", "", kTHnSparseD, {trackPaxis, trackImpParRPhiAxis, trackIUposXaxis, trackIUposYaxis, trackIUposZaxis}); + histograms.add("Reco/h4ImpParZIU", "", kTHnD, {trackPaxis, trackImpParZAxis, trackIUposXaxis, trackIUposYaxis, trackIUposZaxis}); } // if(fEnablePulls && !doPVrefit) { // LOGF(fatal, ">>> dca errors not stored after track propagation at the moment. Use fEnablePulls only if doPVrefit!"); @@ -328,16 +328,25 @@ struct QaImpactPar { } isPIDPionApplied = ((nSigmaTPCPionMin > -10.001 && nSigmaTPCPionMax < 10.001) || (nSigmaTOFPionMin > -10.001 && nSigmaTOFPionMax < 10.001)); if (isPIDPionApplied) { + if (addTrackIUinfo) { + histograms.add("Reco/h4ClusterSizeIU_Pion", "", kTHnD, {trackPaxis, trackImpParRPhiAxis, trackIUposXaxis, trackIUposYaxis, trackIUposZaxis, trackIUclusterSize}); + } histograms.add("Reco/h4ImpPar_Pion", "", kTHnSparseD, {trackPtAxis, trackImpParRPhiAxis, trackEtaAxis, trackPhiAxis, trackPDGAxis, trackChargeAxis, axisVertexNumContrib, trackIsPvContrib}); histograms.add("Reco/h4ImpParZ_Pion", "", kTHnSparseD, {trackPtAxis, trackImpParZAxis, trackEtaAxis, trackPhiAxis, trackPDGAxis, trackChargeAxis, axisVertexNumContrib, trackIsPvContrib}); } isPIDKaonApplied = ((nSigmaTPCKaonMin > -10.001 && nSigmaTPCKaonMax < 10.001) || (nSigmaTOFKaonMin > -10.001 && nSigmaTOFKaonMax < 10.001)); if (isPIDKaonApplied) { + if (addTrackIUinfo) { + histograms.add("Reco/h4ClusterSizeIU_Kaon", "", kTHnD, {trackPaxis, trackImpParRPhiAxis, trackIUposXaxis, trackIUposYaxis, trackIUposZaxis, trackIUclusterSize}); + } histograms.add("Reco/h4ImpPar_Kaon", "", kTHnSparseD, {trackPtAxis, trackImpParRPhiAxis, trackEtaAxis, trackPhiAxis, trackPDGAxis, trackChargeAxis, axisVertexNumContrib, trackIsPvContrib}); histograms.add("Reco/h4ImpParZ_Kaon", "", kTHnSparseD, {trackPtAxis, trackImpParZAxis, trackEtaAxis, trackPhiAxis, trackPDGAxis, trackChargeAxis, axisVertexNumContrib, trackIsPvContrib}); } isPIDProtonApplied = ((nSigmaTPCProtonMin > -10.001 && nSigmaTPCProtonMax < 10.001) || (nSigmaTOFProtonMin > -10.001 && nSigmaTOFProtonMax < 10.001)); if (isPIDProtonApplied) { + if (addTrackIUinfo) { + histograms.add("Reco/h4ClusterSizeIU_Proton", "", kTHnD, {trackPaxis, trackImpParRPhiAxis, trackIUposXaxis, trackIUposYaxis, trackIUposZaxis, trackIUclusterSize}); + } histograms.add("Reco/h4ImpPar_Proton", "", kTHnSparseD, {trackPtAxis, trackImpParRPhiAxis, trackEtaAxis, trackPhiAxis, trackPDGAxis, trackChargeAxis, axisVertexNumContrib, trackIsPvContrib}); histograms.add("Reco/h4ImpParZ_Proton", "", kTHnSparseD, {trackPtAxis, trackImpParZAxis, trackEtaAxis, trackPhiAxis, trackPDGAxis, trackChargeAxis, axisVertexNumContrib, trackIsPvContrib}); } @@ -704,8 +713,8 @@ struct QaImpactPar { histograms.fill(HIST("Reco/h4ImpPar"), pt, impParRPhi, track.eta(), track.phi(), pdgIndex, track.sign(), collision.numContrib(), track.isPVContributor()); histograms.fill(HIST("Reco/h4ImpParZ"), pt, impParZ, track.eta(), track.phi(), pdgIndex, track.sign(), collision.numContrib(), track.isPVContributor()); if (addTrackIUinfo) { - histograms.fill(HIST("Reco/h4ClusterSizeIU"), p, trackIuPosX, trackIuPosY, trackIuPosZ, clusterSizeInLayer0); - histograms.fill(HIST("Reco/h4ImpParIU"), p, impParRPhi, trackIuPosX, trackIuPosY, trackIuPosZ); + histograms.fill(HIST("Reco/h4ClusterSizeIU"), p, impParRPhi, trackIuPosX, trackIuPosY, trackIuPosZ, clusterSizeInLayer0); + // histograms.fill(HIST("Reco/h4ImpParIU"), p, impParRPhi, trackIuPosX, trackIuPosY, trackIuPosZ); histograms.fill(HIST("Reco/h4ImpParZIU"), p, impParZ, trackIuPosX, trackIuPosY, trackIuPosZ); } if (fEnablePulls) { @@ -715,6 +724,9 @@ struct QaImpactPar { if (isPIDPionApplied && nSigmaTPCPionMin < tpcNSigmaPion && tpcNSigmaPion < nSigmaTPCPionMax && nSigmaTOFPionMin < tofNSigmaPion && tofNSigmaPion < nSigmaTOFPionMax) { /// PID selected pions + if (addTrackIUinfo) { + histograms.fill(HIST("Reco/h4ClusterSizeIU_Pion"), p, impParRPhi, trackIuPosX, trackIuPosY, trackIuPosZ, clusterSizeInLayer0); + } histograms.fill(HIST("Reco/h4ImpPar_Pion"), pt, impParRPhi, track.eta(), track.phi(), pdgIndex, track.sign(), collision.numContrib(), track.isPVContributor()); histograms.fill(HIST("Reco/h4ImpParZ_Pion"), pt, impParZ, track.eta(), track.phi(), pdgIndex, track.sign(), collision.numContrib(), track.isPVContributor()); histograms.fill(HIST("Reco/hNSigmaTPCPion_afterPID"), pt, tpcNSigmaPion); @@ -722,6 +734,9 @@ struct QaImpactPar { } if (isPIDKaonApplied && nSigmaTPCKaonMin < tpcNSigmaKaon && tpcNSigmaKaon < nSigmaTPCKaonMax && nSigmaTOFKaonMin < tofNSigmaKaon && tofNSigmaKaon < nSigmaTOFKaonMax) { /// PID selected kaons + if (addTrackIUinfo) { + histograms.fill(HIST("Reco/h4ClusterSizeIU_Kaon"), p, impParRPhi, trackIuPosX, trackIuPosY, trackIuPosZ, clusterSizeInLayer0); + } histograms.fill(HIST("Reco/h4ImpPar_Kaon"), pt, impParRPhi, track.eta(), track.phi(), pdgIndex, track.sign(), collision.numContrib(), track.isPVContributor()); histograms.fill(HIST("Reco/h4ImpParZ_Kaon"), pt, impParZ, track.eta(), track.phi(), pdgIndex, track.sign(), collision.numContrib(), track.isPVContributor()); histograms.fill(HIST("Reco/hNSigmaTPCKaon_afterPID"), pt, tpcNSigmaKaon); @@ -729,6 +744,9 @@ struct QaImpactPar { } if (isPIDProtonApplied && nSigmaTPCProtonMin < tpcNSigmaProton && tpcNSigmaProton < nSigmaTPCProtonMax && nSigmaTOFProtonMin < tofNSigmaProton && tofNSigmaProton < nSigmaTOFProtonMax) { /// PID selected Protons + if (addTrackIUinfo) { + histograms.fill(HIST("Reco/h4ClusterSizeIU_Proton"), p, impParRPhi, trackIuPosX, trackIuPosY, trackIuPosZ, clusterSizeInLayer0); + } histograms.fill(HIST("Reco/h4ImpPar_Proton"), pt, impParRPhi, track.eta(), track.phi(), pdgIndex, track.sign(), collision.numContrib(), track.isPVContributor()); histograms.fill(HIST("Reco/h4ImpParZ_Proton"), pt, impParZ, track.eta(), track.phi(), pdgIndex, track.sign(), collision.numContrib(), track.isPVContributor()); histograms.fill(HIST("Reco/hNSigmaTPCProton_afterPID"), pt, tpcNSigmaProton); From e0edc09380b267cba5c0f4069108ff0ab46dd7ba Mon Sep 17 00:00:00 2001 From: alcaliva <32872606+alcaliva@users.noreply.github.com> Date: Thu, 27 Mar 2025 09:33:28 +0100 Subject: [PATCH 0842/1650] [PWGLF] fixed DCA calculation by using std::fabs(dca) (#10658) --- PWGLF/Tasks/Strangeness/strangenessInJets.cxx | 146 +++++++++--------- 1 file changed, 73 insertions(+), 73 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/strangenessInJets.cxx b/PWGLF/Tasks/Strangeness/strangenessInJets.cxx index d865890d034..1fca91dd44b 100644 --- a/PWGLF/Tasks/Strangeness/strangenessInJets.cxx +++ b/PWGLF/Tasks/Strangeness/strangenessInJets.cxx @@ -580,7 +580,7 @@ struct StrangenessInJets { return false; if (v0.v0radius() < minimumV0Radius || v0.v0radius() > maximumV0Radius) return false; - if (v0.dcaV0daughters() > dcaV0DaughtersMax) + if (std::fabs(v0.dcaV0daughters()) > dcaV0DaughtersMax) return false; if (std::fabs(v0.dcapostopv()) < dcapostoPVmin) return false; @@ -631,7 +631,7 @@ struct StrangenessInJets { return false; if (v0.v0radius() < minimumV0Radius || v0.v0radius() > maximumV0Radius) return false; - if (v0.dcaV0daughters() > dcaV0DaughtersMax) + if (std::fabs(v0.dcaV0daughters()) > dcaV0DaughtersMax) return false; if (std::fabs(v0.dcapostopv()) < dcapostoPVmin) return false; @@ -682,7 +682,7 @@ struct StrangenessInJets { return false; if (v0.v0radius() < minimumV0Radius || v0.v0radius() > maximumV0Radius) return false; - if (v0.dcaV0daughters() > dcaV0DaughtersMax) + if (std::fabs(v0.dcaV0daughters()) > dcaV0DaughtersMax) return false; if (std::fabs(v0.dcapostopv()) < dcapostoPVmin) return false; @@ -773,11 +773,11 @@ struct StrangenessInJets { return false; if (casc.v0radius() < minimumV0Radius || casc.v0radius() > maximumV0Radius) return false; - if (casc.dcaV0daughters() > dcaV0DaughtersMax) + if (std::fabs(casc.dcaV0daughters()) > dcaV0DaughtersMax) return false; - if (casc.dcapostopv() < dcapostoPVmin) + if (std::fabs(casc.dcapostopv()) < dcapostoPVmin) return false; - if (casc.dcanegtopv() < dcanegtoPVmin) + if (std::fabs(casc.dcanegtopv()) < dcanegtoPVmin) return false; // Cascade Selections @@ -785,11 +785,11 @@ struct StrangenessInJets { return false; if (casc.casccosPA(coll.posX(), coll.posY(), coll.posZ()) < casccospaMin) return false; - if (casc.dcabachtopv() < dcabachtopvMin) + if (std::fabs(casc.dcabachtopv()) < dcabachtopvMin) return false; - if (casc.dcav0topv(coll.posX(), coll.posY(), coll.posZ()) < dcaV0topvMin) + if (std::fabs(casc.dcav0topv(coll.posX(), coll.posY(), coll.posZ())) < dcaV0topvMin) return false; - if (casc.dcacascdaughters() > dcaCascDaughtersMax) + if (std::fabs(casc.dcacascdaughters()) > dcaCascDaughtersMax) return false; // PID Selection on bachelor @@ -872,11 +872,11 @@ struct StrangenessInJets { return false; if (casc.v0radius() < minimumV0Radius || casc.v0radius() > maximumV0Radius) return false; - if (casc.dcaV0daughters() > dcaV0DaughtersMax) + if (std::fabs(casc.dcaV0daughters()) > dcaV0DaughtersMax) return false; - if (casc.dcapostopv() < dcapostoPVmin) + if (std::fabs(casc.dcapostopv()) < dcapostoPVmin) return false; - if (casc.dcanegtopv() < dcanegtoPVmin) + if (std::fabs(casc.dcanegtopv()) < dcanegtoPVmin) return false; // Cascade Selections @@ -884,11 +884,11 @@ struct StrangenessInJets { return false; if (casc.casccosPA(coll.posX(), coll.posY(), coll.posZ()) < casccospaMin) return false; - if (casc.dcabachtopv() < dcabachtopvMin) + if (std::fabs(casc.dcabachtopv()) < dcabachtopvMin) return false; - if (casc.dcav0topv(coll.posX(), coll.posY(), coll.posZ()) < dcaV0topvMin) + if (std::fabs(casc.dcav0topv(coll.posX(), coll.posY(), coll.posZ())) < dcaV0topvMin) return false; - if (casc.dcacascdaughters() > dcaCascDaughtersMax) + if (std::fabs(casc.dcacascdaughters()) > dcaCascDaughtersMax) return false; // PID Selection on bachelor @@ -1053,7 +1053,7 @@ struct StrangenessInJets { std::vector ue1; std::vector ue2; - for (auto& jet : jets) { // o2-linter: disable=[const-ref-in-for-loop] + for (auto& jet : jets) { // o2-linter: disable=const-ref-in-for-loop (required by backgroundSub) // jet must be fully contained in the acceptance if ((std::fabs(jet.eta()) + rJet) > (etaMax - deltaEtaEdge)) @@ -1365,7 +1365,7 @@ struct StrangenessInJets { continue; registryQC.fill(HIST("survivedK0"), 8.5); - if (v0.dcaV0daughters() > dcaV0DaughtersMax) + if (std::fabs(v0.dcaV0daughters()) > dcaV0DaughtersMax) continue; registryQC.fill(HIST("survivedK0"), 9.5); @@ -1467,7 +1467,7 @@ struct StrangenessInJets { TVector3 momentumV0 = momentumPos + momentumNeg; // Feed-down for lambda - if (passedLambdaSelection(v0, pos, neg) && pdgParent == 3122) { + if (passedLambdaSelection(v0, pos, neg) && pdgParent == kLambda0) { if (!isPhysPrim) { double wSecLambdaInJet(1.0); double wSecLambdaInUe(1.0); @@ -1476,10 +1476,10 @@ struct StrangenessInJets { int idGrandMother = mother.mothersIds()[0]; const auto& grandMother = mcParticles.iteratorAt(idGrandMother); switch (grandMother.pdgCode()) { - case 3312: - case -3312: - case 3322: - case -3322: + case kXiMinus: + case kXiPlusBar: + // case 3322: + // case -3322: if (weightsXiInJet) { int ibinXiInJet = weightsXiInJet->GetXaxis()->FindBin(grandMother.pt()); wSecLambdaInJet = weightsXiInJet->GetBinContent(ibinXiInJet); @@ -1498,7 +1498,7 @@ struct StrangenessInJets { } // Feed-down for antilambda - if (passedAntiLambdaSelection(v0, pos, neg) && pdgParent == -3122) { + if (passedAntiLambdaSelection(v0, pos, neg) && pdgParent == kLambda0Bar) { if (!isPhysPrim) { double wSecAntiLambdaInJet(1.0); double wSecAntiLambdaInUe(1.0); @@ -1507,10 +1507,10 @@ struct StrangenessInJets { int idGrandMother = mother.mothersIds()[0]; const auto& grandMother = mcParticles.iteratorAt(idGrandMother); switch (grandMother.pdgCode()) { - case 3312: - case -3312: - case 3322: - case -3322: + case kXiMinus: + case kXiPlusBar: + // case 3322: + // case -3322: if (weightsAntiXiInJet) { int ibinAntiXiInJet = weightsAntiXiInJet->GetXaxis()->FindBin(grandMother.pt()); wSecAntiLambdaInJet = weightsAntiXiInJet->GetBinContent(ibinAntiXiInJet); @@ -1528,13 +1528,13 @@ struct StrangenessInJets { } } - if (passedK0ShortSelection(v0, pos, neg) && pdgParent == 310) { + if (passedK0ShortSelection(v0, pos, neg) && pdgParent == kK0Short) { registryMC.fill(HIST("K0s_reconstructed_incl"), multiplicity, v0.pt()); } - if (passedLambdaSelection(v0, pos, neg) && pdgParent == 3122) { + if (passedLambdaSelection(v0, pos, neg) && pdgParent == kLambda0) { registryMC.fill(HIST("Lambda_reconstructed_incl"), multiplicity, v0.pt()); } - if (passedAntiLambdaSelection(v0, pos, neg) && pdgParent == -3122) { + if (passedAntiLambdaSelection(v0, pos, neg) && pdgParent == kLambda0Bar) { registryMC.fill(HIST("AntiLambda_reconstructed_incl"), multiplicity, v0.pt()); } if (!isPhysPrim) @@ -1570,15 +1570,15 @@ struct StrangenessInJets { } } - if (passedK0ShortSelection(v0, pos, neg) && pdgParent == 310) { + if (passedK0ShortSelection(v0, pos, neg) && pdgParent == kK0Short) { registryMC.fill(HIST("K0s_reconstructed_jet"), multiplicity, v0.pt(), wK0jet); registryMC.fill(HIST("K0s_reconstructed_ue"), multiplicity, v0.pt(), wK0Ue); } - if (passedLambdaSelection(v0, pos, neg) && pdgParent == 3122) { + if (passedLambdaSelection(v0, pos, neg) && pdgParent == kLambda0) { registryMC.fill(HIST("Lambda_reconstructed_jet"), multiplicity, v0.pt(), wLambdaJet); registryMC.fill(HIST("Lambda_reconstructed_ue"), multiplicity, v0.pt(), wLambdaUe); } - if (passedAntiLambdaSelection(v0, pos, neg) && pdgParent == -3122) { + if (passedAntiLambdaSelection(v0, pos, neg) && pdgParent == kLambda0Bar) { registryMC.fill(HIST("AntiLambda_reconstructed_jet"), multiplicity, v0.pt(), wAntilambdaJet); registryMC.fill(HIST("AntiLambda_reconstructed_ue"), multiplicity, v0.pt(), wAntilambdaUe); } @@ -1613,7 +1613,7 @@ struct StrangenessInJets { for (const auto& particleMotherOfBach : bachParticle.mothers_as()) { if (particleMotherOfNeg != particleMotherOfPos) continue; - if (std::fabs(particleMotherOfNeg.pdgCode()) != 3122) + if (std::abs(particleMotherOfNeg.pdgCode()) != kLambda0) continue; if (!particleMotherOfBach.isPhysicalPrimary()) continue; @@ -1626,19 +1626,19 @@ struct StrangenessInJets { continue; // Xi+ - if (passedXiSelection(casc, pos, neg, bach, collision) && pdgParent == -3312) { + if (passedXiSelection(casc, pos, neg, bach, collision) && pdgParent == kXiPlusBar) { registryMC.fill(HIST("XiPos_reconstructed"), multiplicity, casc.pt()); } // Xi- - if (passedXiSelection(casc, pos, neg, bach, collision) && pdgParent == 3312) { + if (passedXiSelection(casc, pos, neg, bach, collision) && pdgParent == kXiMinus) { registryMC.fill(HIST("XiNeg_reconstructed"), multiplicity, casc.pt()); } // Omega+ - if (passedOmegaSelection(casc, pos, neg, bach, collision) && pdgParent == -3334) { + if (passedOmegaSelection(casc, pos, neg, bach, collision) && pdgParent == kOmegaPlusBar) { registryMC.fill(HIST("OmegaPos_reconstructed"), multiplicity, casc.pt()); } // Omega- - if (passedOmegaSelection(casc, pos, neg, bach, collision) && pdgParent == 3334) { + if (passedOmegaSelection(casc, pos, neg, bach, collision) && pdgParent == kOmegaMinus) { registryMC.fill(HIST("OmegaNeg_reconstructed"), multiplicity, casc.pt()); } } @@ -1655,7 +1655,7 @@ struct StrangenessInJets { const auto particle = track.mcParticle(); switch (std::abs(particle.pdgCode())) { - case 211: + case kPiPlus: if (particle.isPhysicalPrimary()) { if (track.sign() > 0) registryMC.fill(HIST("pi_plus_dcaxy/prm"), multiplicity, track.pt(), track.dcaXY()); @@ -1668,7 +1668,7 @@ struct StrangenessInJets { registryMC.fill(HIST("pi_minus_dcaxy/sec"), multiplicity, track.pt(), track.dcaXY()); } break; - case 321: + case kKPlus: if (particle.isPhysicalPrimary()) { if (track.sign() > 0) registryMC.fill(HIST("ka_plus_dcaxy/prm"), multiplicity, track.pt(), track.dcaXY()); @@ -1681,7 +1681,7 @@ struct StrangenessInJets { registryMC.fill(HIST("ka_minus_dcaxy/sec"), multiplicity, track.pt(), track.dcaXY()); } break; - case 2212: + case kProton: if (particle.isPhysicalPrimary()) { if (track.sign() > 0) registryMC.fill(HIST("pr_plus_dcaxy/prm"), multiplicity, track.pt(), track.dcaXY()); @@ -1814,64 +1814,64 @@ struct StrangenessInJets { } switch (mcParticle.pdgCode()) { - case 211: // Pi+ + case kPiPlus: // Pi+ registryMC.fill(HIST("mc_pi_plus/in_jet/gen"), multiplicity, mcParticle.pt(), wPiplusJet); registryMC.fill(HIST("mc_pi_plus/in_ue/gen"), multiplicity, mcParticle.pt(), wPiplusUe); registryMC.fill(HIST("pi_plus_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); break; - case -211: // Pi- + case kPiMinus: // Pi- registryMC.fill(HIST("mc_pi_minus/in_jet/gen"), multiplicity, mcParticle.pt(), wPiminusJet); registryMC.fill(HIST("mc_pi_minus/in_ue/gen"), multiplicity, mcParticle.pt(), wPiminusUe); registryMC.fill(HIST("pi_minus_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); break; - case 321: // Ka+ + case kKPlus: // Ka+ registryMC.fill(HIST("mc_ka_plus/in_jet/gen"), multiplicity, mcParticle.pt(), wKaplusJet); registryMC.fill(HIST("mc_ka_plus/in_ue/gen"), multiplicity, mcParticle.pt(), wKaplusUe); registryMC.fill(HIST("ka_plus_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); break; - case -321: // Ka- + case kKMinus: // Ka- registryMC.fill(HIST("mc_ka_minus/in_jet/gen"), multiplicity, mcParticle.pt(), wKaminusJet); registryMC.fill(HIST("mc_ka_minus/in_ue/gen"), multiplicity, mcParticle.pt(), wKaminusUe); registryMC.fill(HIST("ka_minus_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); break; - case 2212: // Pr+ + case kProton: // Pr+ registryMC.fill(HIST("mc_pr_plus/in_jet/gen"), multiplicity, mcParticle.pt(), wPrplusJet); registryMC.fill(HIST("mc_pr_plus/in_ue/gen"), multiplicity, mcParticle.pt(), wPrplusUe); registryMC.fill(HIST("pr_plus_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); break; - case -2212: // Pr- + case kProtonBar: // Pr- registryMC.fill(HIST("mc_pr_minus/in_jet/gen"), multiplicity, mcParticle.pt(), wPrminusJet); registryMC.fill(HIST("mc_pr_minus/in_ue/gen"), multiplicity, mcParticle.pt(), wPrminusUe); registryMC.fill(HIST("pr_minus_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); break; - case 310: // K0s + case kK0Short: // K0s registryMC.fill(HIST("K0s_generated_jet"), multiplicity, mcParticle.pt(), wK0jet); registryMC.fill(HIST("K0s_generated_ue"), multiplicity, mcParticle.pt(), wK0Ue); registryMC.fill(HIST("K0s_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); break; - case 3122: // Lambda + case kLambda0: // Lambda registryMC.fill(HIST("Lambda_generated_jet"), multiplicity, mcParticle.pt(), wLambdaJet); registryMC.fill(HIST("Lambda_generated_ue"), multiplicity, mcParticle.pt(), wLambdaUe); registryMC.fill(HIST("Lambda_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); break; - case -3122: // AntiLambda + case kLambda0Bar: // AntiLambda registryMC.fill(HIST("AntiLambda_generated_jet"), multiplicity, mcParticle.pt(), wAntilambdaJet); registryMC.fill(HIST("AntiLambda_generated_ue"), multiplicity, mcParticle.pt(), wAntilambdaUe); registryMC.fill(HIST("AntiLambda_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); break; - case -3312: // Xi Pos + case kXiPlusBar: // Xi Pos registryMC.fill(HIST("XiPos_generated"), multiplicity, mcParticle.pt()); registryMC.fill(HIST("Xi_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); break; - case 3312: // Xi Neg + case kXiMinus: // Xi Neg registryMC.fill(HIST("XiNeg_generated"), multiplicity, mcParticle.pt()); registryMC.fill(HIST("AntiXi_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); break; - case -3334: // Omega Pos + case kOmegaPlusBar: // Omega Pos registryMC.fill(HIST("OmegaPos_generated"), multiplicity, mcParticle.pt()); registryMC.fill(HIST("Omega_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); break; - case 3334: // Omega Neg + case kOmegaMinus: // Omega Neg registryMC.fill(HIST("OmegaNeg_generated"), multiplicity, mcParticle.pt()); registryMC.fill(HIST("AntiOmega_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); break; @@ -1925,7 +1925,7 @@ struct StrangenessInJets { std::vector ue1; std::vector ue2; - for (auto& jet : jets) { // o2-linter: disable=[const-ref-in-for-loop] + for (auto& jet : jets) { // o2-linter: disable=const-ref-in-for-loop (required by backgroundSub) // jet must be fully contained in the acceptance if ((std::fabs(jet.eta()) + rJet) > (etaMax - deltaEtaEdge)) @@ -1975,31 +1975,31 @@ struct StrangenessInJets { // In jet if (deltaRjet < rJet) { switch (particle.pdgCode()) { - case 211: + case kPiPlus: registryMC.fill(HIST("pi_plus_eta_pt_jet"), particle.pt(), particle.eta()); break; - case -211: + case kPiMinus: registryMC.fill(HIST("pi_minus_eta_pt_jet"), particle.pt(), particle.eta()); break; - case 310: + case kK0Short: registryMC.fill(HIST("K0s_eta_pt_jet"), particle.pt(), particle.eta()); break; - case 3122: + case kLambda0: registryMC.fill(HIST("Lambda_eta_pt_jet"), particle.pt(), particle.eta()); break; - case -3122: + case kLambda0Bar: registryMC.fill(HIST("AntiLambda_eta_pt_jet"), particle.pt(), particle.eta()); break; - case 3312: + case kXiMinus: registryMC.fill(HIST("Xi_eta_pt_jet"), particle.pt(), particle.eta()); break; - case -3312: + case kXiPlusBar: registryMC.fill(HIST("AntiXi_eta_pt_jet"), particle.pt(), particle.eta()); break; - case 3334: + case kOmegaMinus: registryMC.fill(HIST("Omega_eta_pt_jet"), particle.pt(), particle.eta()); break; - case -3334: + case kOmegaPlusBar: registryMC.fill(HIST("AntiOmega_eta_pt_jet"), particle.pt(), particle.eta()); break; default: @@ -2009,31 +2009,31 @@ struct StrangenessInJets { if (deltaRue1 < rJet || deltaRue2 < rJet) { switch (particle.pdgCode()) { - case 211: + case kPiPlus: registryMC.fill(HIST("pi_plus_eta_pt_ue"), particle.pt(), particle.eta()); break; - case -211: + case kPiMinus: registryMC.fill(HIST("pi_minus_eta_pt_ue"), particle.pt(), particle.eta()); break; - case 310: + case kK0Short: registryMC.fill(HIST("K0s_eta_pt_ue"), particle.pt(), particle.eta()); break; - case 3122: + case kLambda0: registryMC.fill(HIST("Lambda_eta_pt_ue"), particle.pt(), particle.eta()); break; - case -3122: + case kLambda0Bar: registryMC.fill(HIST("AntiLambda_eta_pt_ue"), particle.pt(), particle.eta()); break; - case 3312: + case kXiMinus: registryMC.fill(HIST("Xi_eta_pt_ue"), particle.pt(), particle.eta()); break; - case -3312: + case kXiPlusBar: registryMC.fill(HIST("AntiXi_eta_pt_ue"), particle.pt(), particle.eta()); break; - case 3334: + case kOmegaMinus: registryMC.fill(HIST("Omega_eta_pt_ue"), particle.pt(), particle.eta()); break; - case -3334: + case kOmegaPlusBar: registryMC.fill(HIST("AntiOmega_eta_pt_ue"), particle.pt(), particle.eta()); break; default: From 7c6336d4cb488f85a20e40b71ae55d5e626c6d4f Mon Sep 17 00:00:00 2001 From: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> Date: Thu, 27 Mar 2025 10:44:58 +0100 Subject: [PATCH 0843/1650] [PWGLF] Add task for on-the-fly production of centrality strangeness derived table (#10369) --- PWGLF/DataModel/LFStrangenessTables.h | 9 +- .../TableProducer/Strangeness/CMakeLists.txt | 5 + PWGLF/TableProducer/Strangeness/stracents.cxx | 587 ++++++++++++++++++ .../Strangeness/strangederivedbuilder.cxx | 40 +- 4 files changed, 623 insertions(+), 18 deletions(-) create mode 100644 PWGLF/TableProducer/Strangeness/stracents.cxx diff --git a/PWGLF/DataModel/LFStrangenessTables.h b/PWGLF/DataModel/LFStrangenessTables.h index 2e99b4c7500..6de090da8d9 100644 --- a/PWGLF/DataModel/LFStrangenessTables.h +++ b/PWGLF/DataModel/LFStrangenessTables.h @@ -226,11 +226,14 @@ DECLARE_SOA_TABLE_VERSIONED(StraEvSels_004, "AOD", "STRAEVSELS", 4, //! // stracollision::EnergyCommonZNC, stracollision::IsUPC); -DECLARE_SOA_TABLE(StraEvSelsRun2, "AOD", "STRAEVSELSRUN2", //! debug information - evsel::Sel8, evsel::Sel7, evsel::Selection, //! event selection: sel8 - mult::MultFT0A, mult::MultFT0C, mult::MultFV0A, // FIT detectors +DECLARE_SOA_TABLE(StraEvSelsRun2, "AOD", "STRAEVSELSRUN2", //! debug information + evsel::Sel8, evsel::Sel7, evsel::Selection, //! event selection: sel8 + mult::MultFT0A, mult::MultFT0C, // FIT detectors + mult::MultFV0A, mult::MultFV0C, mult::MultFDDA, mult::MultFDDC, + run2::SPDClustersL0, run2::SPDClustersL1, // SPD detectors mult::MultNTracksPVeta1, // track multiplicities with eta cut for INEL>0 + mult::MultTracklets, // multiplicity with tracklets (only Run2) mult::MultPVTotalContributors, // number of PV contribs total mult::MultNTracksGlobal, // global track multiplicities mult::MultNTracksITSTPC, // track multiplicities, PV contribs, no eta cut diff --git a/PWGLF/TableProducer/Strangeness/CMakeLists.txt b/PWGLF/TableProducer/Strangeness/CMakeLists.txt index 70a65b7198b..51205d29dcd 100644 --- a/PWGLF/TableProducer/Strangeness/CMakeLists.txt +++ b/PWGLF/TableProducer/Strangeness/CMakeLists.txt @@ -151,3 +151,8 @@ o2physics_add_dpl_workflow(lambdajetpolarizationbuilder SOURCES lambdaJetpolarizationbuilder.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(stracents + SOURCES stracents.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) \ No newline at end of file diff --git a/PWGLF/TableProducer/Strangeness/stracents.cxx b/PWGLF/TableProducer/Strangeness/stracents.cxx new file mode 100644 index 00000000000..e1b601fb4d8 --- /dev/null +++ b/PWGLF/TableProducer/Strangeness/stracents.cxx @@ -0,0 +1,587 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +// +/// \file straCents.cxx +/// \brief Task to re-produce the strangeness centrality tables, repeating what has been done the centralityTable.cxx and multiplicityTable.cxx tasks +/// +/// \author ALICE +// + +#include +#include +#include +#include + +#include +#include +#include +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/RunningWorkflowInfo.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" +#include "Framework/HistogramRegistry.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/EventSelection.h" +#include "MetadataHelper.h" +#include "TableHelper.h" +#include "TList.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +MetadataHelper metadataInfo; // Metadata helper + +struct straCents { + Produces strangeCents; + Produces strangeCentsRun2; + + Service ccdb; + + Configurable doVertexZeq{"doVertexZeq", 1, "if 1: do vertex Z eq mult table"}; + struct : ConfigurableGroup { + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "The CCDB endpoint url address"}; + Configurable ccdbPath_Centrality{"ccdbPath_Centrality", "Centrality/Estimators", "The CCDB path for centrality/multiplicity information"}; + Configurable ccdbPath_Multiplicity{"ccdbPath_Multiplicity", "Centrality/Calibration", "The CCDB path for centrality/multiplicity information"}; + Configurable genName{"genName", "", "Genearator name: HIJING, PYTHIA8, ... Default: \"\""}; + Configurable doNotCrashOnNull{"doNotCrashOnNull", false, {"Option to not crash on null and instead fill required tables with dummy info"}}; + Configurable reconstructionPass{"reconstructionPass", "", {"Apass to use when fetching the calibration tables. Empty (default) does not check for any pass. Use `metadata` to fetch it from the AO2D metadata. Otherwise it will override the metadata."}}; + } ccdbConfig; + + Configurable embedINELgtZEROselection{"embedINELgtZEROselection", false, {"Option to do percentile 100.5 if not INELgtZERO"}}; + Configurable produceHistograms{"produceHistograms", false, {"Option to produce debug histograms"}}; + ConfigurableAxis binsPercentile{"binsPercentile", {VARIABLE_WIDTH, 0, 0.001, 0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.009, 0.01, 0.011, 0.012, 0.013, 0.014, 0.015, 0.016, 0.017, 0.018, 0.019, 0.02, 0.021, 0.022, 0.023, 0.024, 0.025, 0.026, 0.027, 0.028, 0.029, 0.03, 0.031, 0.032, 0.033, 0.034, 0.035, 0.036, 0.037, 0.038, 0.039, 0.04, 0.041, 0.042, 0.043, 0.044, 0.045, 0.046, 0.047, 0.048, 0.049, 0.05, 0.051, 0.052, 0.053, 0.054, 0.055, 0.056, 0.057, 0.058, 0.059, 0.06, 0.061, 0.062, 0.063, 0.064, 0.065, 0.066, 0.067, 0.068, 0.069, 0.07, 0.071, 0.072, 0.073, 0.074, 0.075, 0.076, 0.077, 0.078, 0.079, 0.08, 0.081, 0.082, 0.083, 0.084, 0.085, 0.086, 0.087, 0.088, 0.089, 0.09, 0.091, 0.092, 0.093, 0.094, 0.095, 0.096, 0.097, 0.098, 0.099, 0.1, 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.2, 0.21, 0.22, 0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.3, 0.31, 0.32, 0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.4, 0.41, 0.42, 0.43, 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.5, 0.51, 0.52, 0.53, 0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.6, 0.61, 0.62, 0.63, 0.64, 0.65, 0.66, 0.67, 0.68, 0.69, 0.7, 0.71, 0.72, 0.73, 0.74, 0.75, 0.76, 0.77, 0.78, 0.79, 0.8, 0.81, 0.82, 0.83, 0.84, 0.85, 0.86, 0.87, 0.88, 0.89, 0.9, 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5.0, 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 6.0, 6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 6.7, 6.8, 6.9, 7.0, 7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 7.7, 7.8, 7.9, 8.0, 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9, 9.0, 9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7, 9.8, 9.9, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0, 26.0, 27.0, 28.0, 29.0, 30.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 41.0, 42.0, 43.0, 44.0, 45.0, 46.0, 47.0, 48.0, 49.0, 50.0, 51.0, 52.0, 53.0, 54.0, 55.0, 56.0, 57.0, 58.0, 59.0, 60.0, 61.0, 62.0, 63.0, 64.0, 65.0, 66.0, 67.0, 68.0, 69.0, 70.0, 71.0, 72.0, 73.0, 74.0, 75.0, 76.0, 77.0, 78.0, 79.0, 80.0, 81.0, 82.0, 83.0, 84.0, 85.0, 86.0, 87.0, 88.0, 89.0, 90.0, 91.0, 92.0, 93.0, 94.0, 95.0, 96.0, 97.0, 98.0, 99.0, 100.0}, "Binning of the percentile axis"}; + + struct TagRun2V0MCalibration { + bool mCalibrationStored = false; + TFormula* mMCScale = nullptr; + float mMCScalePars[6] = {0.0}; + TH1* mhVtxAmpCorrV0A = nullptr; + TH1* mhVtxAmpCorrV0C = nullptr; + TH1* mhMultSelCalib = nullptr; + } Run2V0MInfo; + struct TagRun2V0ACalibration { + bool mCalibrationStored = false; + TH1* mhVtxAmpCorrV0A = nullptr; + TH1* mhMultSelCalib = nullptr; + } Run2V0AInfo; + struct TagRun2SPDTrackletsCalibration { + bool mCalibrationStored = false; + TH1* mhVtxAmpCorr = nullptr; + TH1* mhMultSelCalib = nullptr; + } Run2SPDTksInfo; + struct TagRun2SPDClustersCalibration { + bool mCalibrationStored = false; + TH1* mhVtxAmpCorrCL0 = nullptr; + TH1* mhVtxAmpCorrCL1 = nullptr; + TH1* mhMultSelCalib = nullptr; + } Run2SPDClsInfo; + struct TagRun2CL0Calibration { + bool mCalibrationStored = false; + TH1* mhVtxAmpCorr = nullptr; + TH1* mhMultSelCalib = nullptr; + } Run2CL0Info; + struct TagRun2CL1Calibration { + bool mCalibrationStored = false; + TH1* mhVtxAmpCorr = nullptr; + TH1* mhMultSelCalib = nullptr; + } Run2CL1Info; + struct CalibrationInfo { + std::string name = ""; + bool mCalibrationStored = false; + TH1* mhMultSelCalib = nullptr; + float mMCScalePars[6] = {0.0}; + TFormula* mMCScale = nullptr; + explicit CalibrationInfo(std::string name) + : name(name), + mCalibrationStored(false), + mhMultSelCalib(nullptr), + mMCScalePars{0.0}, + mMCScale(nullptr) + { + } + bool isSane(bool fatalize = false) + { + if (!mhMultSelCalib) { + return true; + } + for (int i = 1; i < mhMultSelCalib->GetNbinsX() + 1; i++) { + if (mhMultSelCalib->GetXaxis()->GetBinLowEdge(i) > mhMultSelCalib->GetXaxis()->GetBinUpEdge(i)) { + if (fatalize) { + LOG(fatal) << "Centrality calibration table " << name << " has bins with low edge > up edge"; + } + LOG(warning) << "Centrality calibration table " << name << " has bins with low edge > up edge"; + return false; + } + } + return true; + } + }; + CalibrationInfo fv0aInfo = CalibrationInfo("FV0"); + CalibrationInfo ft0mInfo = CalibrationInfo("FT0"); + CalibrationInfo ft0aInfo = CalibrationInfo("FT0A"); + CalibrationInfo ft0cInfo = CalibrationInfo("FT0C"); + CalibrationInfo ft0cVariant1Info = CalibrationInfo("FT0Cvar1"); + CalibrationInfo fddmInfo = CalibrationInfo("FDD"); + CalibrationInfo ntpvInfo = CalibrationInfo("NTracksPV"); + CalibrationInfo nGlobalInfo = CalibrationInfo("NGlobal"); + CalibrationInfo mftInfo = CalibrationInfo("MFT"); + + int mRunNumber; + bool lCalibLoaded; + TProfile* hVtxZFV0A; + TProfile* hVtxZFT0A; + TProfile* hVtxZFT0C; + TProfile* hVtxZFDDA; + + TProfile* hVtxZFDDC; + TProfile* hVtxZNTracks; + + // Debug output + HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + OutputObj listCalib{"calib-list", OutputObjHandlingPolicy::QAObject}; + + void init(InitContext&) + { + LOG(info) << "Initializing centrality table producer"; + + if (metadataInfo.isFullyDefined() && !doprocessRun2 && !doprocessRun3) { // Check if the metadata is initialized (only if not forced from the workflow configuration) + if (metadataInfo.isRun3()) { + doprocessRun3.value = true; + } else { + doprocessRun2.value = false; + } + } + + if (doprocessRun2 == false && doprocessRun3 == false) { + LOGF(fatal, "Neither processRun2 nor processRun3 nor processRun3Complete enabled. Please choose one."); + } + if (doprocessRun2 == true && doprocessRun3 == true) { + LOGF(fatal, "Cannot enable processRun2 and processRun3 at the same time. Please choose one."); + } + + mRunNumber = 0; + lCalibLoaded = false; + + hVtxZFV0A = nullptr; + hVtxZFT0A = nullptr; + hVtxZFT0C = nullptr; + hVtxZFDDA = nullptr; + hVtxZFDDC = nullptr; + hVtxZNTracks = nullptr; + + ccdb->setURL(ccdbConfig.ccdbUrl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setFatalWhenNull(false); // don't fatal, please - exception is caught explicitly (as it should) + + if (produceHistograms) { + histos.add("FT0M/Mult", "FT0M mult.", HistType::kTH1D, {{1000, 0, 5000, "FT0M mult."}}); + histos.add("FT0M/percentile", "FT0M percentile.", HistType::kTH1D, {{binsPercentile, "FT0M percentile"}}); + histos.add("FT0M/percentilevsPV", "percentile vs PV mult.", HistType::kTH2D, {{binsPercentile, "FT0M percentile"}, {100, 0, 100, "PV mult."}}); + histos.add("FT0M/MultvsPV", "FT0M mult. vs PV mult.", HistType::kTH2D, {{1000, 0, 5000, "FT0M mult."}, {100, 0, 100, "PV mult."}}); + + histos.add("FT0A/Mult", "FT0A mult", HistType::kTH1D, {{1000, 0, 1000, "FT0A multiplicity"}}); + histos.add("FT0A/percentile", "FT0A percentile.", HistType::kTH1D, {{binsPercentile, "FT0A percentile"}}); + histos.add("FT0A/percentilevsPV", "percentile vs PV mult.", HistType::kTH2D, {{binsPercentile, "FT0A percentile"}, {100, 0, 100, "PV mult."}}); + histos.add("FT0A/MultvsPV", "FT0A mult. vs PV mult.", HistType::kTH2D, {{1000, 0, 5000, "FT0A mult."}, {100, 0, 100, "PV mult."}}); + + histos.add("FT0C/Mult", "FT0C mult", HistType::kTH1D, {{1000, 0, 5000, "FT0C multiplicity"}}); + histos.add("FT0C/percentile", "FT0C percentile.", HistType::kTH1D, {{binsPercentile, "FT0C percentile"}}); + histos.add("FT0C/percentilevsPV", "percentile vs PV mult.", HistType::kTH2D, {{binsPercentile, "FT0C percentile"}, {100, 0, 100, "PV mult."}}); + histos.add("FT0C/MultvsPV", "FT0C mult. vs PV mult.", HistType::kTH2D, {{1000, 0, 5000, "FT0C mult."}, {100, 0, 100, "PV mult."}}); + + histos.addClone("FT0M/", "sel8FT0M/"); + histos.addClone("FT0C/", "sel8FT0C/"); + histos.addClone("FT0A/", "sel8FT0A/"); + + histos.print(); + } + listCalib.setObject(new TList); + } + + template + void initCCDB(TCollision collision) + { + if (mRunNumber == collision.runNumber()) { + return; + } + + mRunNumber = collision.runNumber(); + LOGF(info, "timestamp=%llu, run number=%d", collision.timestamp(), collision.runNumber()); + + TList* lCalibObjects_Centrality = nullptr; + TList* lCalibObjects_Multiplicity = nullptr; + if (ccdbConfig.reconstructionPass.value == "") { + lCalibObjects_Centrality = ccdb->getForRun(ccdbConfig.ccdbPath_Centrality, mRunNumber); + lCalibObjects_Multiplicity = ccdb->getForRun(ccdbConfig.ccdbPath_Multiplicity, mRunNumber); + } else if (ccdbConfig.reconstructionPass.value == "metadata") { + std::map metadata; + metadata["RecoPassName"] = metadataInfo.get("RecoPassName"); + LOGF(info, "Loading CCDB for reconstruction pass (from metadata): %s", metadataInfo.get("RecoPassName")); + lCalibObjects_Centrality = ccdb->getSpecificForRun(ccdbConfig.ccdbPath_Centrality, mRunNumber, metadata); + lCalibObjects_Multiplicity = ccdb->getSpecificForRun(ccdbConfig.ccdbPath_Multiplicity, mRunNumber, metadata); + } else { + std::map metadata; + metadata["RecoPassName"] = ccdbConfig.reconstructionPass.value; + LOGF(info, "Loading CCDB for reconstruction pass (from provided argument): %s", ccdbConfig.reconstructionPass.value); + lCalibObjects_Centrality = ccdb->getSpecificForRun(ccdbConfig.ccdbPath_Centrality, mRunNumber, metadata); + lCalibObjects_Multiplicity = ccdb->getSpecificForRun(ccdbConfig.ccdbPath_Multiplicity, mRunNumber, metadata); + } + + fv0aInfo.mCalibrationStored = false; + ft0mInfo.mCalibrationStored = false; + ft0aInfo.mCalibrationStored = false; + ft0cInfo.mCalibrationStored = false; + ft0cVariant1Info.mCalibrationStored = false; + fddmInfo.mCalibrationStored = false; + ntpvInfo.mCalibrationStored = false; + nGlobalInfo.mCalibrationStored = false; + mftInfo.mCalibrationStored = false; + + Run2V0MInfo.mCalibrationStored = false; + Run2V0AInfo.mCalibrationStored = false; + Run2SPDTksInfo.mCalibrationStored = false; + Run2SPDClsInfo.mCalibrationStored = false; + Run2CL0Info.mCalibrationStored = false; + Run2CL1Info.mCalibrationStored = false; + + if (lCalibObjects_Centrality) { + if (produceHistograms) { + listCalib->Add(lCalibObjects_Centrality->Clone(Form("Centrality_%i", collision.runNumber()))); + } + + LOGF(info, "Getting new histograms with %d run number for %d run number", mRunNumber, collision.runNumber()); + + if constexpr (requires { collision.sel7(); }) { // check if we are in Run 2 + auto getccdb = [lCalibObjects_Centrality](const char* ccdbhname) { + TH1* h = reinterpret_cast(lCalibObjects_Centrality->FindObject(ccdbhname)); + return h; + }; + auto getformulaccdb = [lCalibObjects_Centrality](const char* ccdbhname) { + TFormula* f = reinterpret_cast(lCalibObjects_Centrality->FindObject(ccdbhname)); + return f; + }; + + // V0M + Run2V0MInfo.mhVtxAmpCorrV0A = getccdb("hVtx_fAmplitude_V0A_Normalized"); + Run2V0MInfo.mhVtxAmpCorrV0C = getccdb("hVtx_fAmplitude_V0C_Normalized"); + Run2V0MInfo.mhMultSelCalib = getccdb("hMultSelCalib_V0M"); + Run2V0MInfo.mMCScale = getformulaccdb(TString::Format("%s-V0M", ccdbConfig.genName->c_str()).Data()); + if ((Run2V0MInfo.mhVtxAmpCorrV0A != nullptr) && (Run2V0MInfo.mhVtxAmpCorrV0C != nullptr) && (Run2V0MInfo.mhMultSelCalib != nullptr)) { + if (ccdbConfig.genName->length() != 0) { + if (Run2V0MInfo.mMCScale != nullptr) { + for (int ixpar = 0; ixpar < 6; ++ixpar) { + Run2V0MInfo.mMCScalePars[ixpar] = Run2V0MInfo.mMCScale->GetParameter(ixpar); + } + } else { + if (!ccdbConfig.doNotCrashOnNull) { // default behaviour: crash + LOGF(fatal, "MC Scale information from V0M for run %d not available", collision.runNumber()); + } else { // only if asked: continue filling with non-valid values (105) + LOGF(warning, "MC Scale information from V0M for run %d not available", collision.runNumber()); + } + } + } + Run2V0MInfo.mCalibrationStored = true; + } else { + if (!ccdbConfig.doNotCrashOnNull) { // default behaviour: crash + LOGF(fatal, "Calibration information from V0M for run %d corrupted", collision.runNumber()); + } else { // only if asked: continue filling with non-valid values (105) + LOGF(warning, "Calibration information from V0M for run %d corrupted, will fill V0M tables with dummy values", collision.runNumber()); + } + } + + // V0A + Run2V0AInfo.mhVtxAmpCorrV0A = getccdb("hVtx_fAmplitude_V0A_Normalized"); + Run2V0AInfo.mhMultSelCalib = getccdb("hMultSelCalib_V0A"); + if ((Run2V0AInfo.mhVtxAmpCorrV0A != nullptr) && (Run2V0AInfo.mhMultSelCalib != nullptr)) { + Run2V0AInfo.mCalibrationStored = true; + } else { + if (!ccdbConfig.doNotCrashOnNull) { // default behaviour: crash + LOGF(fatal, "Calibration information from V0A for run %d corrupted", collision.runNumber()); + } else { // only if asked: continue filling with non-valid values (105) + LOGF(warning, "Calibration information from V0A for run %d corrupted, will fill V0A tables with dummy values", collision.runNumber()); + } + } + + // SPD tracklets + Run2SPDTksInfo.mhVtxAmpCorr = getccdb("hVtx_fnTracklets_Normalized"); + Run2SPDTksInfo.mhMultSelCalib = getccdb("hMultSelCalib_SPDTracklets"); + if ((Run2SPDTksInfo.mhVtxAmpCorr != nullptr) && (Run2SPDTksInfo.mhMultSelCalib != nullptr)) { + Run2SPDTksInfo.mCalibrationStored = true; + } else { + if (!ccdbConfig.doNotCrashOnNull) { // default behaviour: crash + LOGF(fatal, "Calibration information from SPD tracklets for run %d corrupted", collision.runNumber()); + } else { // only if asked: continue filling with non-valid values (105) + LOGF(warning, "Calibration information from SPD tracklets for run %d corrupted, will fill SPD tracklets tables with dummy values", collision.runNumber()); + } + } + + // SPD clusters + Run2SPDClsInfo.mhVtxAmpCorrCL0 = getccdb("hVtx_fnSPDClusters0_Normalized"); + Run2SPDClsInfo.mhVtxAmpCorrCL1 = getccdb("hVtx_fnSPDClusters1_Normalized"); + Run2SPDClsInfo.mhMultSelCalib = getccdb("hMultSelCalib_SPDClusters"); + if ((Run2SPDClsInfo.mhVtxAmpCorrCL0 != nullptr) && (Run2SPDClsInfo.mhVtxAmpCorrCL1 != nullptr) && (Run2SPDClsInfo.mhMultSelCalib != nullptr)) { + Run2SPDClsInfo.mCalibrationStored = true; + } else { + if (!ccdbConfig.doNotCrashOnNull) { // default behaviour: crash + LOGF(fatal, "Calibration information from SPD clusters for run %d corrupted", collision.runNumber()); + } else { // only if asked: continue filling with non-valid values (105) + LOGF(warning, "Calibration information from SPD clusters for run %d corrupted, will fill SPD clusters tables with dummy values", collision.runNumber()); + } + } + } else { + // we are in Run 3 + auto getccdb = [lCalibObjects_Centrality, collision](struct CalibrationInfo& estimator, const Configurable generatorName, const Configurable notCrashOnNull) { // TODO: to consider the name inside the estimator structure + estimator.mhMultSelCalib = reinterpret_cast(lCalibObjects_Centrality->FindObject(TString::Format("hCalibZeq%s", estimator.name.c_str()).Data())); + estimator.mMCScale = reinterpret_cast(lCalibObjects_Centrality->FindObject(TString::Format("%s-%s", generatorName->c_str(), estimator.name.c_str()).Data())); + if (estimator.mhMultSelCalib != nullptr) { + if (generatorName->length() != 0) { + LOGF(info, "Retrieving MC calibration for %d, generator name: %s", collision.runNumber(), generatorName->c_str()); + if (estimator.mMCScale != nullptr) { + for (int ixpar = 0; ixpar < 6; ++ixpar) { + estimator.mMCScalePars[ixpar] = estimator.mMCScale->GetParameter(ixpar); + LOGF(info, "Parameter index %i value %.5f", ixpar, estimator.mMCScalePars[ixpar]); + } + } else { + LOGF(warning, "MC Scale information from %s for run %d not available", estimator.name.c_str(), collision.runNumber()); + } + } + estimator.mCalibrationStored = true; + estimator.isSane(); + } else { + if (!notCrashOnNull.value) { // default behaviour: crash + LOGF(error, "Calibration information from %s for run %d not available", estimator.name.c_str(), collision.runNumber()); + } else { + LOGF(warning, "Calibration information from %s for run %d not available", estimator.name.c_str(), collision.runNumber()); + } + } + }; + getccdb(fv0aInfo, ccdbConfig.genName, ccdbConfig.doNotCrashOnNull); + getccdb(ft0mInfo, ccdbConfig.genName, ccdbConfig.doNotCrashOnNull); + getccdb(ft0aInfo, ccdbConfig.genName, ccdbConfig.doNotCrashOnNull); + getccdb(ft0cInfo, ccdbConfig.genName, ccdbConfig.doNotCrashOnNull); + getccdb(ft0cVariant1Info, ccdbConfig.genName, ccdbConfig.doNotCrashOnNull); + getccdb(fddmInfo, ccdbConfig.genName, ccdbConfig.doNotCrashOnNull); + getccdb(ntpvInfo, ccdbConfig.genName, ccdbConfig.doNotCrashOnNull); + getccdb(nGlobalInfo, ccdbConfig.genName, ccdbConfig.doNotCrashOnNull); + getccdb(mftInfo, ccdbConfig.genName, ccdbConfig.doNotCrashOnNull); + + if (lCalibObjects_Multiplicity) { + if (produceHistograms) { + listCalib->Add(lCalibObjects_Multiplicity->Clone(Form("Multiplicity_%i", collision.runNumber()))); + } + + hVtxZFV0A = static_cast(lCalibObjects_Multiplicity->FindObject("hVtxZFV0A")); + hVtxZFT0A = static_cast(lCalibObjects_Multiplicity->FindObject("hVtxZFT0A")); + hVtxZFT0C = static_cast(lCalibObjects_Multiplicity->FindObject("hVtxZFT0C")); + hVtxZFDDA = static_cast(lCalibObjects_Multiplicity->FindObject("hVtxZFDDA")); + hVtxZFDDC = static_cast(lCalibObjects_Multiplicity->FindObject("hVtxZFDDC")); + hVtxZNTracks = static_cast(lCalibObjects_Multiplicity->FindObject("hVtxZNTracksPV")); + lCalibLoaded = true; + // Capture error + if (!hVtxZFV0A || !hVtxZFT0A || !hVtxZFT0C || !hVtxZFDDA || !hVtxZFDDC || !hVtxZNTracks) { + LOGF(error, "Problem loading CCDB objects! Please check"); + lCalibLoaded = false; + } + } else { + if (!ccdbConfig.doNotCrashOnNull) { // default behaviour: crash + LOGF(fatal, "Multiplicity calibration is not available in CCDB for run=%d at timestamp=%llu", collision.runNumber(), collision.timestamp()); + } else { // only if asked: continue filling with non-valid values (105) + LOGF(warning, "Multiplicity calibration is not available in CCDB for run=%d at timestamp=%llu, will fill tables with dummy values", collision.runNumber(), collision.timestamp()); + } + lCalibLoaded = false; + } + } // end we are in Run 3 + } else { + if (!ccdbConfig.doNotCrashOnNull) { // default behaviour: crash + LOGF(fatal, "Centrality calibration is not available in CCDB for run=%d at timestamp=%llu", collision.runNumber(), collision.timestamp()); + } else { // only if asked: continue filling with non-valid values (105) + LOGF(warning, "Centrality calibration is not available in CCDB for run=%d at timestamp=%llu, will fill tables with dummy values", collision.runNumber(), collision.timestamp()); + } + lCalibLoaded = false; + } + } + + void processRun2(soa::Join const& collisions) + { + for (auto const& collision : collisions) { + if (doVertexZeq > 0) { + initCCDB(collision); + } + + float centRun2V0M = 105.0f; + float centRun2V0A = 105.0f; + float centRun2SPDTrks = 105.0f; + float centRun2SPDClss = 105.0f; + + auto scaleMC = [](float x, float pars[6]) { + return std::pow(((pars[0] + pars[1] * std::pow(x, pars[2])) - pars[3]) / pars[4], 1.0f / pars[5]); + }; + + // Run 2 V0M + if (Run2V0MInfo.mCalibrationStored) { + float v0m; + if (Run2V0MInfo.mMCScale != nullptr) { + v0m = scaleMC(collision.multFV0A() + collision.multFV0C(), Run2V0MInfo.mMCScalePars); + LOGF(debug, "Unscaled v0m: %f, scaled v0m: %f", collision.multFV0A() + collision.multFV0C(), v0m); + } else { + v0m = collision.multFV0A() * Run2V0MInfo.mhVtxAmpCorrV0A->GetBinContent(Run2V0MInfo.mhVtxAmpCorrV0A->FindFixBin(collision.posZ())) + + collision.multFV0C() * Run2V0MInfo.mhVtxAmpCorrV0C->GetBinContent(Run2V0MInfo.mhVtxAmpCorrV0C->FindFixBin(collision.posZ())); + } + centRun2V0M = Run2V0MInfo.mhMultSelCalib->GetBinContent(Run2V0MInfo.mhMultSelCalib->FindFixBin(v0m)); + } + LOGF(debug, "centRun2V0M=%.0f", centRun2V0M); + + // Run 2 V0A + if (Run2V0AInfo.mCalibrationStored) { + float v0a = collision.multFV0A() * Run2V0AInfo.mhVtxAmpCorrV0A->GetBinContent(Run2V0AInfo.mhVtxAmpCorrV0A->FindFixBin(collision.posZ())); + centRun2V0A = Run2V0AInfo.mhMultSelCalib->GetBinContent(Run2V0AInfo.mhMultSelCalib->FindFixBin(v0a)); + } + LOGF(debug, "centRun2V0A=%.0f", centRun2V0A); + + // Run 2 SPD tracklets + if (Run2SPDTksInfo.mCalibrationStored) { + float spdm = collision.multTracklets() * Run2SPDTksInfo.mhVtxAmpCorr->GetBinContent(Run2SPDTksInfo.mhVtxAmpCorr->FindFixBin(collision.posZ())); + centRun2SPDTrks = Run2SPDTksInfo.mhMultSelCalib->GetBinContent(Run2SPDTksInfo.mhMultSelCalib->FindFixBin(spdm)); + } + LOGF(debug, "centSPDTracklets=%.0f", centRun2SPDTrks); + + // Run 2 SPD Cls + if (Run2SPDClsInfo.mCalibrationStored) { + // spdClustersL0 and spdClustersL1 not available in strangeness data model + float spdm = collision.spdClustersL0() * Run2SPDClsInfo.mhVtxAmpCorrCL0->GetBinContent(Run2SPDClsInfo.mhVtxAmpCorrCL0->FindFixBin(collision.posZ())) + + collision.spdClustersL1() * Run2SPDClsInfo.mhVtxAmpCorrCL1->GetBinContent(Run2SPDClsInfo.mhVtxAmpCorrCL1->FindFixBin(collision.posZ())); + centRun2SPDClss = Run2SPDClsInfo.mhMultSelCalib->GetBinContent(Run2SPDClsInfo.mhMultSelCalib->FindFixBin(spdm)); + } + LOGF(debug, "centSPDClusters=%.0f", centRun2SPDClss); + + strangeCentsRun2(centRun2V0M, centRun2V0A, + centRun2SPDTrks, centRun2SPDClss); + } + } + + void processRun3(soa::Join const& collisions) + { + for (auto const& collision : collisions) { + if (doVertexZeq > 0) { + initCCDB(collision); + } + + float multZeqFV0A = 0.f; + float multZeqFT0A = 0.f; + float multZeqFT0C = 0.f; + // float multZeqFDDA = 0.f; + // float multZeqFDDC = 0.f; + + if (std::fabs(collision.posZ()) < 15.0f && hVtxZFV0A) { + multZeqFV0A = hVtxZFV0A->Interpolate(0.0) * collision.multFV0A() / hVtxZFV0A->Interpolate(collision.posZ()); + } + if (std::fabs(collision.posZ()) < 15.0f && hVtxZFT0A) { + multZeqFT0A = hVtxZFT0A->Interpolate(0.0) * collision.multFT0A() / hVtxZFT0A->Interpolate(collision.posZ()); + } + if (std::fabs(collision.posZ()) < 15.0f && hVtxZFT0C) { + multZeqFT0C = hVtxZFT0C->Interpolate(0.0) * collision.multFT0C() / hVtxZFT0C->Interpolate(collision.posZ()); + } + // if (std::fabs(collision.posZ()) < 15.0f && hVtxZFDDA) { + // multZeqFDDA = hVtxZFDDA->Interpolate(0.0) * collision.multFDDA() / hVtxZFDDA->Interpolate(collision.posZ()); + // } + // if (std::fabs(collision.posZ()) < 15.0f && hVtxZFDDC) { + // multZeqFDDC = hVtxZFDDC->Interpolate(0.0) * collision.multFDDC() / hVtxZFDDC->Interpolate(collision.posZ()); + // } + + /** + * @brief Get centrality value based on the given calibration information and multiplicity. + * Modified version of populateTable (https://github.com/AliceO2Group/O2Physics/blob/master/Common/TableProducer/centralityTable.cxx#L648) + * + * @param estimator The calibration information. + * @param multiplicity The multiplicity value. + */ + + auto getCentrality = [&](struct CalibrationInfo& estimator, float multiplicity) { + const bool assignOutOfRange = embedINELgtZEROselection && !(collision.multNTracksPVeta1() > 0); + auto scaleMC = [](float x, float pars[6]) { + return std::pow(((pars[0] + pars[1] * std::pow(x, pars[2])) - pars[3]) / pars[4], 1.0f / pars[5]); + }; + + float percentile = 105.0f; + float scaledMultiplicity = multiplicity; + if (estimator.mCalibrationStored) { + if (estimator.mMCScale != nullptr) { + scaledMultiplicity = scaleMC(multiplicity, estimator.mMCScalePars); + LOGF(debug, "Unscaled %s multiplicity: %f, scaled %s multiplicity: %f", estimator.name.c_str(), multiplicity, estimator.name.c_str(), scaledMultiplicity); + } + percentile = estimator.mhMultSelCalib->GetBinContent(estimator.mhMultSelCalib->FindFixBin(scaledMultiplicity)); + if (assignOutOfRange) + percentile = 100.5f; + } + LOGF(debug, "%s centrality/multiplicity percentile = %.0f for a zvtx eq %s value %.0f", estimator.name.c_str(), percentile, estimator.name.c_str(), scaledMultiplicity); + return percentile; + }; + + float centFT0M = getCentrality(ft0mInfo, multZeqFT0A + multZeqFT0C); + float centFT0A = getCentrality(ft0aInfo, multZeqFT0A); + float centFT0C = getCentrality(ft0cInfo, multZeqFT0C); + float centFV0A = getCentrality(fv0aInfo, multZeqFV0A); + float centFT0CVariant1 = getCentrality(ft0cVariant1Info, multZeqFT0C); + float centMFT = 100.5f; // missing mftNtracks in strangeness data model + float centNGlobal = getCentrality(nGlobalInfo, collision.multNTracksGlobal()); + + strangeCents(centFT0M, centFT0A, + centFT0C, centFV0A, centFT0CVariant1, + centMFT, centNGlobal); + + if (produceHistograms.value) { + histos.fill(HIST("FT0M/Mult"), multZeqFT0A + multZeqFT0C); + histos.fill(HIST("FT0M/percentile"), centFT0M); + histos.fill(HIST("FT0M/percentilevsPV"), centFT0M, collision.multNTracksPVeta1()); + histos.fill(HIST("FT0M/MultvsPV"), multZeqFT0A + multZeqFT0C, collision.multNTracksPVeta1()); + + histos.fill(HIST("FT0A/Mult"), multZeqFT0A); + histos.fill(HIST("FT0A/percentile"), centFT0A); + histos.fill(HIST("FT0A/percentilevsPV"), centFT0A, collision.multNTracksPVeta1()); + histos.fill(HIST("FT0A/MultvsPV"), multZeqFT0A, collision.multNTracksPVeta1()); + + histos.fill(HIST("FT0C/Mult"), multZeqFT0C); + histos.fill(HIST("FT0C/percentile"), centFT0C); + histos.fill(HIST("FT0C/percentilevsPV"), centFT0C, collision.multNTracksPVeta1()); + histos.fill(HIST("FT0C/MultvsPV"), multZeqFT0C, collision.multNTracksPVeta1()); + if (collision.sel8()) { + histos.fill(HIST("sel8FT0M/Mult"), multZeqFT0A + multZeqFT0C); + histos.fill(HIST("sel8FT0M/percentile"), centFT0M); + histos.fill(HIST("sel8FT0M/percentilevsPV"), centFT0M, collision.multNTracksPVeta1()); + histos.fill(HIST("sel8FT0M/MultvsPV"), multZeqFT0A + multZeqFT0C, collision.multNTracksPVeta1()); + + histos.fill(HIST("sel8FT0A/Mult"), multZeqFT0A); + histos.fill(HIST("sel8FT0A/percentile"), centFT0A); + histos.fill(HIST("sel8FT0A/percentilevsPV"), centFT0A, collision.multNTracksPVeta1()); + histos.fill(HIST("sel8FT0A/MultvsPV"), multZeqFT0A, collision.multNTracksPVeta1()); + + histos.fill(HIST("sel8FT0C/Mult"), multZeqFT0C); + histos.fill(HIST("sel8FT0C/percentile"), centFT0C); + histos.fill(HIST("sel8FT0C/percentilevsPV"), centFT0C, collision.multNTracksPVeta1()); + histos.fill(HIST("sel8FT0C/MultvsPV"), multZeqFT0C, collision.multNTracksPVeta1()); + } + } + } + } + + // Process switches + PROCESS_SWITCH(straCents, processRun2, "Provide Run2 calibrated centrality/multiplicity percentiles tables", false); + PROCESS_SWITCH(straCents, processRun3, "Provide Run3 calibrated centrality/multiplicity percentiles tables", true); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + metadataInfo.initMetadata(cfgc); + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} diff --git a/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx index 0f3c9ac49d1..297a6794a3b 100644 --- a/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx @@ -63,6 +63,8 @@ using FullTracksExtIUTOF = soa::Join; using UDCollisionsFull = soa::Join; +using BCsWithTimestampsAndRun2Infos = soa::Join; + // simple bit checkers #define bitset(var, nbit) ((var) |= (1 << (nbit))) #define bitcheck(var, nbit) ((var) & (1 << (nbit))) @@ -173,10 +175,14 @@ struct strangederivedbuilder { Configurable fillRawFT0A{"fillRawFT0A", false, "Fill raw FT0A information for debug"}; Configurable fillRawFT0C{"fillRawFT0C", true, "Fill raw FT0C information for debug"}; Configurable fillRawFV0A{"fillRawFV0A", false, "Fill raw FV0A information for debug"}; + Configurable fillRawFV0C{"fillRawFV0C", false, "Fill raw FV0C information for debug (only Run 2)"}; Configurable fillRawFDDA{"fillRawFDDA", false, "Fill raw FDDA information for debug"}; Configurable fillRawFDDC{"fillRawFDDC", false, "Fill raw FDDC information for debug"}; Configurable fillRawZDC{"fillRawZDC", false, "Fill raw ZDC information for debug"}; Configurable fillRawNTracksEta1{"fillRawNTracksEta1", true, "Fill raw NTracks |eta|<1 information for debug"}; + Configurable fillRawTrackletsRun2{"fillRawTrackletsRun2", true, "Fill raw tracklets information for debug (only Run 2)"}; + Configurable fillRawSPDclsL0Run2{"fillRawSPDclsL0Run2", true, "Fill raw SPD clusters at layer 0 information for debug (only Run 2)"}; + Configurable fillRawSPDclsL1Run2{"fillRawSPDclsL1Run2", true, "Fill raw SPD clusters at layer 1 information for debug (only Run 2)"}; Configurable fillRawNTracksForCorrelation{"fillRawNTracksForCorrelation", true, "Fill raw NTracks for correlation cuts"}; Configurable fillTOFInformation{"fillTOFInformation", true, "Fill Daughter Track TOF information"}; } fillTruncationOptions; @@ -404,8 +410,8 @@ struct strangederivedbuilder { } // master function to process a collision - template - void populateCollisionTables(coll const& collisions, udcoll const& udCollisions, v0d const& V0s, cad const& Cascades, kfcad const& KFCascades, tracad const& TraCascades) + template + void populateCollisionTables(coll const& collisions, udcoll const& udCollisions, v0d const& V0s, cad const& Cascades, kfcad const& KFCascades, tracad const& TraCascades, bcType const& /*bcs*/) { // create collision indices beforehand std::vector V0CollIndices(V0s.size(), -1); // index -1: no collision @@ -426,7 +432,7 @@ struct strangederivedbuilder { KFCascTable_thisColl.size() > 0 || TraCascTable_thisColl.size() > 0; - auto bc = collision.template bc_as(); + auto bc = collision.template bc_as(); int gapSide = -1; float totalFT0AmplitudeA = -999; @@ -518,9 +524,13 @@ struct strangederivedbuilder { collision.multFT0A() * static_cast(fillTruncationOptions.fillRawFT0A), collision.multFT0C() * static_cast(fillTruncationOptions.fillRawFT0C), collision.multFV0A() * static_cast(fillTruncationOptions.fillRawFV0A), + collision.multFV0C() * static_cast(fillTruncationOptions.fillRawFV0C), collision.multFDDA() * static_cast(fillTruncationOptions.fillRawFDDA), collision.multFDDC() * static_cast(fillTruncationOptions.fillRawFDDC), + bc.spdClustersL0() * static_cast(fillTruncationOptions.fillRawSPDclsL0Run2), + bc.spdClustersL1() * static_cast(fillTruncationOptions.fillRawSPDclsL1Run2), collision.multNTracksPVeta1() * static_cast(fillTruncationOptions.fillRawNTracksEta1), + collision.multTracklets() * static_cast(fillTruncationOptions.fillRawTrackletsRun2), -1, /* dummy number of PV contribs total while waiting for the multiplicity task to produce it */ -1, /* dummy global track multiplicities while waiting for the multiplicity task to produce it */ -1, /* dummy track multiplicities, PV contribs, no eta cut while waiting for the multiplicity task to produce it */ @@ -601,37 +611,37 @@ struct strangederivedbuilder { } } - void processCollisionsRun3(soa::Join const& collisions, aod::V0Datas const& V0s, aod::CascDatas const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, aod::BCsWithTimestamps const& /*bcs*/) + void processCollisionsRun3(soa::Join const& collisions, aod::V0Datas const& V0s, aod::CascDatas const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, aod::BCsWithTimestamps const& bcs) { - populateCollisionTables(collisions, collisions, V0s, Cascades, KFCascades, TraCascades); + populateCollisionTables(collisions, collisions, V0s, Cascades, KFCascades, TraCascades, bcs); } - void processCollisionsRun3WithUD(soa::Join const& collisions, aod::V0Datas const& V0s, aod::CascDatas const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, aod::BCsWithTimestamps const& /*bcs*/, UDCollisionsFull const& udCollisions) + void processCollisionsRun3WithUD(soa::Join const& collisions, aod::V0Datas const& V0s, aod::CascDatas const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, aod::BCsWithTimestamps const& bcs, UDCollisionsFull const& udCollisions) { - populateCollisionTables(collisions, udCollisions, V0s, Cascades, KFCascades, TraCascades); + populateCollisionTables(collisions, udCollisions, V0s, Cascades, KFCascades, TraCascades, bcs); } - void processCollisionsRun3WithMC(soa::Join const& collisions, soa::Join const& V0s, soa::Join const& /*V0MCCores*/, soa::Join const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, aod::BCsWithTimestamps const& /*bcs*/, soa::Join const& mcCollisions, aod::McParticles const& mcParticles) + void processCollisionsRun3WithMC(soa::Join const& collisions, soa::Join const& V0s, soa::Join const& /*V0MCCores*/, soa::Join const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, aod::BCsWithTimestamps const& bcs, soa::Join const& mcCollisions, aod::McParticles const& mcParticles) { populateMCCollisionTable(mcCollisions, mcParticles); - populateCollisionTables(collisions, collisions, V0s, Cascades, KFCascades, TraCascades); + populateCollisionTables(collisions, collisions, V0s, Cascades, KFCascades, TraCascades, bcs); } - void processCollisionsRun3WithUDWithMC(soa::Join const& collisions, soa::Join const& V0s, soa::Join const& /*V0MCCores*/, soa::Join const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, aod::BCsWithTimestamps const& /*bcs*/, UDCollisionsFull const& udCollisions, soa::Join const& mcCollisions, aod::McParticles const& mcParticles) + void processCollisionsRun3WithUDWithMC(soa::Join const& collisions, soa::Join const& V0s, soa::Join const& /*V0MCCores*/, soa::Join const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, aod::BCsWithTimestamps const& bcs, UDCollisionsFull const& udCollisions, soa::Join const& mcCollisions, aod::McParticles const& mcParticles) { populateMCCollisionTable(mcCollisions, mcParticles); - populateCollisionTables(collisions, udCollisions, V0s, Cascades, KFCascades, TraCascades); + populateCollisionTables(collisions, udCollisions, V0s, Cascades, KFCascades, TraCascades, bcs); } - void processCollisionsRun2(soa::Join const& collisions, aod::V0Datas const& V0s, aod::CascDatas const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, aod::BCsWithTimestamps const& /*bcs*/) + void processCollisionsRun2(soa::Join const& collisions, aod::V0Datas const& V0s, aod::CascDatas const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, BCsWithTimestampsAndRun2Infos const& bcs) { - populateCollisionTables(collisions, collisions, V0s, Cascades, KFCascades, TraCascades); + populateCollisionTables(collisions, collisions, V0s, Cascades, KFCascades, TraCascades, bcs); } - void processCollisionsRun2WithMC(soa::Join const& collisions, soa::Join const& V0s, soa::Join const& /*V0MCCores*/, soa::Join const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, aod::BCsWithTimestamps const& /*bcs*/, soa::Join const& mcCollisions, aod::McParticles const& mcParticles) + void processCollisionsRun2WithMC(soa::Join const& collisions, soa::Join const& V0s, soa::Join const& /*V0MCCores*/, soa::Join const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, BCsWithTimestampsAndRun2Infos const& bcs, soa::Join const& mcCollisions, aod::McParticles const& mcParticles) { populateMCCollisionTable(mcCollisions, mcParticles); - populateCollisionTables(collisions, collisions, V0s, Cascades, KFCascades, TraCascades); + populateCollisionTables(collisions, collisions, V0s, Cascades, KFCascades, TraCascades, bcs); } void processTrackExtrasV0sOnly(aod::V0Datas const& V0s, TracksWithExtra const& tracksExtra) From 79db000fc1bc1eaedcaa89dbeb206d0c8f87f819 Mon Sep 17 00:00:00 2001 From: smaff92 <33285879+smaff92@users.noreply.github.com> Date: Thu, 27 Mar 2025 19:21:56 +0900 Subject: [PATCH 0844/1650] [PWGJE] Added JE track filters (#10670) Co-authored-by: ALICE Action Bot --- PWGJE/Tasks/statPromptPhoton.cxx | 526 +++++++++++++++++-------------- 1 file changed, 291 insertions(+), 235 deletions(-) diff --git a/PWGJE/Tasks/statPromptPhoton.cxx b/PWGJE/Tasks/statPromptPhoton.cxx index d27b32b5b16..62d9bf72b97 100644 --- a/PWGJE/Tasks/statPromptPhoton.cxx +++ b/PWGJE/Tasks/statPromptPhoton.cxx @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -95,7 +96,13 @@ struct statPromptPhoton { Configurable cfgEmcTrigger{"cfgEmcTrigger", true, "Require EMC readout for event"}; Configurable cfgGeoCut{"cfgGeoCut", true, "Performs Geometric TPC cut"}; Configurable cfgPtClusterCut{"cfgPtClusterCut", true, "Performs Pt-dependent cluster-track matching"}; + Configurable cfgTrackFilter{"cfgTrackFilter", "globalTracks", "set track selections"}; + Configurable cfgJETracks{"cfgJETracks", false, "Enables running on derived JE data"}; + Configurable cfgGenHistograms{"cfgGenHistograms", false, "Enables Generated histograms"}; + Configurable cfgRecHistograms{"cfgRecHistograms", false, "Enables Reconstructed histograms"}; + Configurable cfgDataHistograms{"cfgDataHistograms", false, "Enables Data histograms"}; Configurable cfgDebug{"cfgDebug", false, "Enables debug information for local running"}; + int trackFilter = -1; // INIT void init(InitContext const&) @@ -103,164 +110,133 @@ struct statPromptPhoton { std::vector ptBinning = {0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.5, 3.0, 4.0, 5.0, 6.0, 8.0, 12.0, 16.0, 20.0, 25.0, 30.0, 40.0, 50.0, 75.0, 100.0, 150.0, 200.0, 300.0, 500.0}; AxisSpec pthadAxis = {ptBinning, "#it{p}_{T}^{had sum} [GeV/c]"}; - histos.add("REC_nEvents", "REC_nEvents", kTH1F, {{4, 0.0, 4.0}}); - histos.add("REC_Cluster_QA", "REC_Cluster_QA", kTH1F, {{10, -0.5, 9.5}}); - histos.add("REC_PtHadSum_Photon", "REC_PtHadSum_Photon", kTH1F, {pthadAxis}); - histos.add("REC_TrackPhi_photontrigger", "REC_TrackPhi_photontrigger", kTH1F, {{64, 0, 2 * TMath::Pi()}}); - histos.add("REC_TrackEta_photontrigger", "REC_TrackEta_photontrigger", kTH1F, {{100, -1, 1}}); - histos.add("REC_ClusterPhi", "REC_ClusterPhi", kTH1F, {{640 * 2, 0, 2 * TMath::Pi()}}); - histos.add("REC_ClusterEta", "REC_ClusterEta", kTH1F, {{100, -1, 1}}); - - histos.add("REC_Track_Pt", "REC_Track_Pt", kTH1F, {{82, -1.0, 40.0}}); - histos.add("REC_Track_Phi", "REC_Track_Phi", kTH1F, {{640 * 2, 0, 2 * TMath::Pi()}}); - histos.add("REC_Track_PhiPrime_Pt", "REC_Track_PhiPrime_Pt", kTH2F, {{640, 0, 2 * TMath::Pi()}, {82, -1.0, 40.0}}); - histos.add("REC_Cluster_PhiPrime_Pt", "REC_Cluster_PhiPrime_Pt", kTH2F, {{640, 0, 2 * TMath::Pi()}, {82, -1.0, 40.0}}); - histos.add("REC_Cluster_PhiPrime_Pt_AC", "REC_Cluster_PhiPrime_Pt_AC", kTH2F, {{640, 0, 2 * TMath::Pi()}, {82, -1.0, 40.0}}); - histos.add("REC_Cluster_PhiPrime_Pt_C", "REC_Cluster_PhiPrime_Pt_C", kTH2F, {{640, 0, 2 * TMath::Pi()}, {82, -1.0, 40.0}}); - - histos.add("REC_Cluster_Particle_Pt", "REC_Cluster_Particle_Pt", kTH1F, {{82, -1.0, 40.0}}); - histos.add("REC_Cluster_ParticleWITHtrack_Pt", "REC_Cluster_ParticleWITHtrack_Pt", kTH1F, {{82, -1.0, 40.0}}); - histos.add("REC_Cluster_ParticleWITHtrack_Phi", "REC_Cluster_ParticleWITHtrack_Phi", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("REC_Cluster_ParticleWITHtrack_Eta", "REC_Cluster_ParticleWITHtrack_Eta", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("REC_Cluster_ParticleWITHtrack_TrackPt", "REC_Cluster_ParticleWITHtrack_TrackPt", kTH1F, {{82, -1.0, 40.0}}); - histos.add("REC_Cluster_ParticleWITHtrack_Pt_Phi", "REC_Cluster_ParticleWITHtrack_Pt_Phi", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("REC_Cluster_ParticleWITHtrack_Pt_PhiPrime", "REC_Cluster_ParticleWITHtrack_Pt_PhiPrime", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("REC_Impurity_ParticleWITHtrack_Pt_PhiPrime", "REC_Impurity_ParticleWITHtrack_Pt_PhiPrime", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - - histos.add("REC_Cluster_ParticleWITHtrack_Pt_Eta", "REC_Cluster_ParticleWITHtrack_Pt_Eta", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - - histos.add("REC_Cluster_ParticleWITHOUTtrack_Pt", "REC_Cluster_ParticleWITHOUTtrack_Pt", kTH1F, {{82, -1.0, 40.0}}); - histos.add("REC_Cluster_ParticleWITHOUTtrack_Phi", "REC_Cluster_ParticleWITHOUTtrack_Phi", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("REC_Cluster_ParticleWITHOUTtrack_Eta", "REC_Cluster_ParticleWITHOUTtrack_Eta", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("REC_Cluster_ParticleWITHOUTtrack_Pt_Phi", "REC_Cluster_ParticleWITHOUTtrack_Pt_Phi", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("REC_Cluster_ParticleWITHOUTtrack_Pt_PhiPrime", "REC_Cluster_ParticleWITHOUTtrack_Pt_PhiPrime", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("REC_Cluster_ParticleWITHOUTtrack_Pt_Eta", "REC_Cluster_ParticleWITHOUTtrack_Pt_Eta", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("REC_Impurity_ParticleWITHOUTtrack_Pt_PhiPrime", "REC_Impurity_ParticleWITHOUTtrack_Pt_PhiPrime", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - - histos.add("REC_TrackPt_ClusterE", "REC_TrackPt_ClusterE", kTH2F, {{82, -1.0, 40.0}, {82, -1.0, 40.0}}); - histos.add("REC_ParticlePt_ClusterE", "REC_ParticlePt_ClusterE", kTH2F, {{82, -1.0, 40.0}, {82, -1.0, 40.0}}); - histos.add("REC_TrackPt_Phi_Eta", "REC_TrackPt_Phi_Eta", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("REC_ParticlePt_Phi_Eta", "REC_ParticlePt_Phi_Eta", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - - histos.add("REC_True_v_Cluster_Phi", "REC_True_v_Cluster_Phi", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("REC_True_v_Cluster_Eta", "REC_True_v_Cluster_Eta", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("REC_TrueImpurity_v_Cluster_Phi", "REC_TrueImpurity_v_Cluster_Phi", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("REC_TrueImpurity_v_Cluster_Eta", "REC_TrueImpurity_v_Cluster_Eta", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("REC_TrueImpurity_v_Cluster_PhiAbs", "REC_TrueImpurity_v_Cluster_PhiAbs", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("REC_TrueImpurity_v_Cluster_EtaAbs", "REC_TrueImpurity_v_Cluster_EtaAbs", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - - histos.add("REC_TrueImpurity_v_Cluster_Phi_Eta", "REC_TrueImpurity_v_Cluster_Phi_Eta", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - - histos.add("REC_Track_v_Cluster_Phi", "REC_Track_v_Cluster_Phi", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("REC_Track_v_Cluster_Eta", "REC_Track_v_Cluster_Eta", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("REC_Track_v_Cluster_Phi_Pt", "REC_Track_v_Cluster_Phi_Pt", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {82, -1.0, 40.0}}); - histos.add("REC_Track_v_Cluster_Eta_Pt", "REC_Track_v_Cluster_Eta_Pt", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {82, -1.0, 40.0}}); - - histos.add("REC_Track_v_Cluster_Phi_Eta", "REC_Track_v_Cluster_Phi_Eta", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - - histos.add("REC_Track_v_Cluster_Phi_AC", "REC_Track_v_Cluster_Phi_AC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("REC_Track_v_Cluster_Eta_AC", "REC_Track_v_Cluster_Eta_AC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("REC_Track_v_Cluster_Phi_Eta_AC", "REC_Track_v_Cluster_Phi_Eta_AC", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - - histos.add("REC_Track_v_Cluster_Phi_C", "REC_Track_v_Cluster_Phi_C", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("REC_Track_v_Cluster_Eta_C", "REC_Track_v_Cluster_Eta_C", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("REC_Track_v_Cluster_Phi_Eta_C", "REC_Track_v_Cluster_Phi_Eta_C", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - - histos.add("REC_SumPt_BC", "REC_SumPt_BC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("REC_SumPt_AC", "REC_SumPt_AC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("REC_M02_BC", "REC_M02_BC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("REC_M02_AC", "REC_M02_AC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - - histos.add("REC_Trigger_Purity", "REC_Trigger_Purity", kTH1F, {{4, 0.0, 4.0}}); - histos.add("REC_Trigger_Energy", "REC_Trigger_Energy", kTH1F, {{82, -1.0, 40.0}}); - - histos.add("REC_Trigger_Purity_v_Energy", "REC_Trigger_Purity_v_Energy", kTH2F, {{4, 0.0, 4.0}, {82, -1.0, 40.0}}); - - histos.add("REC_Trigger_Energy_GOOD", "REC_Trigger_Energy_GOOD", kTH1F, {{82, -1.0, 40.0}}); - histos.add("REC_Trigger_Energy_MISS", "REC_Trigger_Energy_MISS", kTH1F, {{82, -1.0, 40.0}}); - histos.add("REC_Trigger_Energy_FAKE", "REC_Trigger_Energy_FAKE", kTH1F, {{82, -1.0, 40.0}}); - - histos.add("REC_All_Energy", "REC_All_Energy", kTH1F, {{82, -1.0, 40.0}}); - histos.add("REC_Impurity_Energy", "REC_Impurity_Energy", kTH1F, {{82, -1.0, 40.0}}); - histos.add("REC_Impurity_Energy_v_Cluster_Phi", "REC_Impurity_Energy_v_Cluster_Phi", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("REC_Impurity_Energy_v_ClusterE_Phi", "REC_Impurity_Energy_v_ClusterE_Phi", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("REC_Impurity_Energy_v_ClusterEoP_Phi", "REC_Impurity_Energy_v_ClusterEoP_Phi", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - - histos.add("REC_Impurity_Energy_v_Cluster_Energy", "REC_Impurity_Energy_v_Cluster_Energy", kTH2F, {{82, -1.0, 40.0}, {82, -1.0, 40.0}}); - - histos.add("REC_True_Trigger_Energy", "REC_True_Trigger_Energy", kTH1F, {{82, -1.0, 40.0}}); - histos.add("REC_True_Prompt_Trigger_Energy", "REC_True_Prompt_Trigger_Energy", kTH1F, {{82, -1.0, 40.0}}); - - histos.add("REC_Trigger_V_PtHadSum_Stern", "REC_Trigger_V_PtHadSum_Stern", kTH2F, {{100, 0, 100}, pthadAxis}); - histos.add("REC_Trigger_V_PtHadSum_Photon", "REC_Trigger_V_PtHadSum_Photon", kTH2F, {{100, 0, 100}, pthadAxis}); - histos.add("REC_TrueTrigger_V_PtHadSum_Photon", "REC_Trigger_V_PtHadSum_Photon", kTH2F, {{100, 0, 100}, pthadAxis}); - histos.add("REC_dR_Photon", "REC_dR_Photon", kTH1F, {{628, 0.0, 2 * TMath::Pi()}}); - histos.add("REC_dR_Stern", "REC_dR_Stern", kTH1F, {{628, 0.0, 2 * TMath::Pi()}}); - - histos.add("GEN_nEvents", "GEN_nEvents", kTH1F, {{4, 0.0, 4.0}}); - - histos.add("GEN_Particle_Pt", "GEN_Particle_Pt", kTH1F, {{82, -1.0, 40.0}}); - histos.add("GEN_True_Photon_Energy", "GEN_True_Photon_Energy", kTH1F, {{8200, -1.0, 40.0}}); - histos.add("GEN_True_Prompt_Photon_Energy", "GEN_True_Prompt_Photon_Energy", kTH1F, {{8200, -1.0, 40.0}}); - histos.add("GEN_Trigger_V_PtHadSum_Stern", "GEN_Trigger_V_PtHadSum_Stern", kTH2F, {{100, 0, 100}, pthadAxis}); - histos.add("GEN_Trigger_V_PtHadSum_Photon", "GEN_Trigger_V_PtHadSum_Photon", kTH2F, {{100, 0, 100}, pthadAxis}); - histos.add("GEN_TrueTrigger_V_PtHadSum_Photon", "GEN_Trigger_V_PtHadSum_Photon", kTH2F, {{100, 0, 100}, pthadAxis}); - histos.add("GEN_dR_Photon", "GEN_dR_Photon", kTH1F, {{628, 0.0, 2 * TMath::Pi()}}); - histos.add("GEN_dR_Stern", "GEN_dR_Stern", kTH1F, {{628, 0.0, 2 * TMath::Pi()}}); - - histos.add("DATA_nEvents", "DATA_nEvents", kTH1F, {{4, 0.0, 4.0}}); - histos.add("DATA_M02_BC", "DATA_M02_BC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("DATA_M02_AC", "DATA_M02_AC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("DATA_Cluster_QA", "DATA_Cluster_QA", kTH1F, {{10, -0.5, 9.5}}); - histos.add("DATA_ClusterPhi", "DATA_ClusterPhi", kTH1F, {{640 * 2, 0, 2 * TMath::Pi()}}); - histos.add("DATA_ClusterEta", "DATA_ClusterEta", kTH1F, {{100, -1, 1}}); - histos.add("DATA_All_Energy", "DATA_All_Energy", kTH1F, {{82, -1.0, 40.0}}); - histos.add("DATA_Cluster_PhiPrime_Pt", "DATA_Cluster_PhiPrime_Pt", kTH2F, {{640, 0, 2 * TMath::Pi()}, {82, -1.0, 40.0}}); - histos.add("DATA_Cluster_PhiPrime_Pt_AC", "DATA_Cluster_PhiPrime_Pt_AC", kTH2F, {{640, 0, 2 * TMath::Pi()}, {82, -1.0, 40.0}}); - histos.add("DATA_Cluster_PhiPrime_Pt_C", "DATA_Cluster_PhiPrime_Pt_C", kTH2F, {{640, 0, 2 * TMath::Pi()}, {82, -1.0, 40.0}}); - histos.add("DATA_Track_v_Cluster_Phi", "DATA_Track_v_Cluster_Phi", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("DATA_Track_v_Cluster_Eta", "DATA_Track_v_Cluster_Eta", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("DATA_Track_v_Cluster_Phi_Pt", "DATA_Track_v_Cluster_Phi_Pt", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {82, -1.0, 40.0}}); - histos.add("DATA_Track_v_Cluster_Phi_Eta", "DATA_Track_v_Cluster_Phi_Eta", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("DATA_SumPt_BC", "DATA_SumPt_BC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("DATA_SumPt_AC", "DATA_SumPt_AC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); - histos.add("DATA_Trigger_V_PtHadSum_Photon", "DATA_Trigger_V_PtHadSum_Photon", kTH2F, {{100, 0, 100}, pthadAxis}); - histos.add("DATA_PtHadSum_Photon", "DATA_PtHadSum_Photon", kTH1F, {pthadAxis}); - histos.add("DATA_Trigger_Energy", "DATA_Trigger_Energy", kTH1F, {{82, -1.0, 40.0}}); - histos.add("DATA_Track_PhiPrime_Pt", "DATA_Track_PhiPrime_Pt", kTH2F, {{640, 0, 2 * TMath::Pi()}, {82, -1.0, 40.0}}); - histos.add("DATA_Track_Pt", "DATA_Track_Pt", kTH1F, {{82, -1.0, 40.0}}); - histos.add("DATA_Track_Phi", "DATA_Track_Phi", kTH1F, {{640 * 2, 0, 2 * TMath::Pi()}}); - histos.add("DATA_TrackPhi_photontrigger", "DATA_TrackPhi_photontrigger", kTH1F, {{64, 0, 2 * TMath::Pi()}}); - histos.add("DATA_TrackEta_photontrigger", "DATA_TrackEta_photontrigger", kTH1F, {{100, -1, 1}}); - histos.add("DATA_Trigger_V_PtHadSum_Stern", "DATA_Trigger_V_PtHadSum_Stern", kTH2F, {{100, 0, 100}, pthadAxis}); + if (cfgJETracks) { + trackFilter = jetderiveddatautilities::initialiseTrackSelection(static_cast(cfgTrackFilter)); + } + if (cfgRecHistograms) { + histos.add("REC_nEvents", "REC_nEvents", kTH1F, {{4, 0.0, 4.0}}); + histos.add("REC_Cluster_QA", "REC_Cluster_QA", kTH1F, {{10, -0.5, 9.5}}); + histos.add("REC_PtHadSum_Photon", "REC_PtHadSum_Photon", kTH1F, {pthadAxis}); + histos.add("REC_TrackPhi_photontrigger", "REC_TrackPhi_photontrigger", kTH1F, {{64, 0, 2 * TMath::Pi()}}); + histos.add("REC_TrackEta_photontrigger", "REC_TrackEta_photontrigger", kTH1F, {{100, -1, 1}}); + histos.add("REC_ClusterPhi", "REC_ClusterPhi", kTH1F, {{640 * 2, 0, 2 * TMath::Pi()}}); + histos.add("REC_ClusterEta", "REC_ClusterEta", kTH1F, {{100, -1, 1}}); + histos.add("REC_Track_Pt", "REC_Track_Pt", kTH1F, {{82, -1.0, 40.0}}); + histos.add("REC_Track_Phi", "REC_Track_Phi", kTH1F, {{640 * 2, 0, 2 * TMath::Pi()}}); + histos.add("REC_Track_PhiPrime_Pt", "REC_Track_PhiPrime_Pt", kTH2F, {{640, 0, 2 * TMath::Pi()}, {82, -1.0, 40.0}}); + histos.add("REC_Cluster_PhiPrime_Pt", "REC_Cluster_PhiPrime_Pt", kTH2F, {{640, 0, 2 * TMath::Pi()}, {82, -1.0, 40.0}}); + histos.add("REC_Cluster_PhiPrime_Pt_AC", "REC_Cluster_PhiPrime_Pt_AC", kTH2F, {{640, 0, 2 * TMath::Pi()}, {82, -1.0, 40.0}}); + histos.add("REC_Cluster_PhiPrime_Pt_C", "REC_Cluster_PhiPrime_Pt_C", kTH2F, {{640, 0, 2 * TMath::Pi()}, {82, -1.0, 40.0}}); + histos.add("REC_Cluster_Particle_Pt", "REC_Cluster_Particle_Pt", kTH1F, {{82, -1.0, 40.0}}); + histos.add("REC_Cluster_ParticleWITHtrack_Pt", "REC_Cluster_ParticleWITHtrack_Pt", kTH1F, {{82, -1.0, 40.0}}); + histos.add("REC_Cluster_ParticleWITHtrack_Phi", "REC_Cluster_ParticleWITHtrack_Phi", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Cluster_ParticleWITHtrack_Eta", "REC_Cluster_ParticleWITHtrack_Eta", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Cluster_ParticleWITHtrack_TrackPt", "REC_Cluster_ParticleWITHtrack_TrackPt", kTH1F, {{82, -1.0, 40.0}}); + histos.add("REC_Cluster_ParticleWITHtrack_Pt_Phi", "REC_Cluster_ParticleWITHtrack_Pt_Phi", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Cluster_ParticleWITHtrack_Pt_PhiPrime", "REC_Cluster_ParticleWITHtrack_Pt_PhiPrime", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Impurity_ParticleWITHtrack_Pt_PhiPrime", "REC_Impurity_ParticleWITHtrack_Pt_PhiPrime", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Cluster_ParticleWITHtrack_Pt_Eta", "REC_Cluster_ParticleWITHtrack_Pt_Eta", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Cluster_ParticleWITHOUTtrack_Pt", "REC_Cluster_ParticleWITHOUTtrack_Pt", kTH1F, {{82, -1.0, 40.0}}); + histos.add("REC_Cluster_ParticleWITHOUTtrack_Phi", "REC_Cluster_ParticleWITHOUTtrack_Phi", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Cluster_ParticleWITHOUTtrack_Eta", "REC_Cluster_ParticleWITHOUTtrack_Eta", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Cluster_ParticleWITHOUTtrack_Pt_Phi", "REC_Cluster_ParticleWITHOUTtrack_Pt_Phi", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Cluster_ParticleWITHOUTtrack_Pt_PhiPrime", "REC_Cluster_ParticleWITHOUTtrack_Pt_PhiPrime", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Cluster_ParticleWITHOUTtrack_Pt_Eta", "REC_Cluster_ParticleWITHOUTtrack_Pt_Eta", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Impurity_ParticleWITHOUTtrack_Pt_PhiPrime", "REC_Impurity_ParticleWITHOUTtrack_Pt_PhiPrime", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_TrackPt_ClusterE", "REC_TrackPt_ClusterE", kTH2F, {{82, -1.0, 40.0}, {82, -1.0, 40.0}}); + histos.add("REC_ParticlePt_ClusterE", "REC_ParticlePt_ClusterE", kTH2F, {{82, -1.0, 40.0}, {82, -1.0, 40.0}}); + histos.add("REC_TrackPt_Phi_Eta", "REC_TrackPt_Phi_Eta", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_ParticlePt_Phi_Eta", "REC_ParticlePt_Phi_Eta", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_True_v_Cluster_Phi", "REC_True_v_Cluster_Phi", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_True_v_Cluster_Eta", "REC_True_v_Cluster_Eta", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_TrueImpurity_v_Cluster_Phi", "REC_TrueImpurity_v_Cluster_Phi", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_TrueImpurity_v_Cluster_Eta", "REC_TrueImpurity_v_Cluster_Eta", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_TrueImpurity_v_Cluster_PhiAbs", "REC_TrueImpurity_v_Cluster_PhiAbs", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_TrueImpurity_v_Cluster_EtaAbs", "REC_TrueImpurity_v_Cluster_EtaAbs", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_TrueImpurity_v_Cluster_Phi_Eta", "REC_TrueImpurity_v_Cluster_Phi_Eta", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Track_v_Cluster_Phi", "REC_Track_v_Cluster_Phi", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Track_v_Cluster_Eta", "REC_Track_v_Cluster_Eta", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Track_v_Cluster_Phi_Pt", "REC_Track_v_Cluster_Phi_Pt", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {82, -1.0, 40.0}}); + histos.add("REC_Track_v_Cluster_Eta_Pt", "REC_Track_v_Cluster_Eta_Pt", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {82, -1.0, 40.0}}); + histos.add("REC_Track_v_Cluster_Phi_Eta", "REC_Track_v_Cluster_Phi_Eta", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Track_v_Cluster_Phi_AC", "REC_Track_v_Cluster_Phi_AC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Track_v_Cluster_Eta_AC", "REC_Track_v_Cluster_Eta_AC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Track_v_Cluster_Phi_Eta_AC", "REC_Track_v_Cluster_Phi_Eta_AC", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Track_v_Cluster_Phi_C", "REC_Track_v_Cluster_Phi_C", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Track_v_Cluster_Eta_C", "REC_Track_v_Cluster_Eta_C", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Track_v_Cluster_Phi_Eta_C", "REC_Track_v_Cluster_Phi_Eta_C", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_SumPt_BC", "REC_SumPt_BC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_SumPt_AC", "REC_SumPt_AC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_M02_BC", "REC_M02_BC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_M02_AC", "REC_M02_AC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Trigger_Purity", "REC_Trigger_Purity", kTH1F, {{4, 0.0, 4.0}}); + histos.add("REC_Trigger_Energy", "REC_Trigger_Energy", kTH1F, {{82, -1.0, 40.0}}); + histos.add("REC_Trigger_Purity_v_Energy", "REC_Trigger_Purity_v_Energy", kTH2F, {{4, 0.0, 4.0}, {82, -1.0, 40.0}}); + histos.add("REC_Trigger_Energy_GOOD", "REC_Trigger_Energy_GOOD", kTH1F, {{82, -1.0, 40.0}}); + histos.add("REC_Trigger_Energy_MISS", "REC_Trigger_Energy_MISS", kTH1F, {{82, -1.0, 40.0}}); + histos.add("REC_Trigger_Energy_FAKE", "REC_Trigger_Energy_FAKE", kTH1F, {{82, -1.0, 40.0}}); + histos.add("REC_All_Energy", "REC_All_Energy", kTH1F, {{82, -1.0, 40.0}}); + histos.add("REC_Impurity_Energy", "REC_Impurity_Energy", kTH1F, {{82, -1.0, 40.0}}); + histos.add("REC_Impurity_Energy_v_Cluster_Phi", "REC_Impurity_Energy_v_Cluster_Phi", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Impurity_Energy_v_ClusterE_Phi", "REC_Impurity_Energy_v_ClusterE_Phi", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Impurity_Energy_v_ClusterEoP_Phi", "REC_Impurity_Energy_v_ClusterEoP_Phi", kTH2F, {{82, -1.0, 40.0}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("REC_Impurity_Energy_v_Cluster_Energy", "REC_Impurity_Energy_v_Cluster_Energy", kTH2F, {{82, -1.0, 40.0}, {82, -1.0, 40.0}}); + histos.add("REC_True_Trigger_Energy", "REC_True_Trigger_Energy", kTH1F, {{82, -1.0, 40.0}}); + histos.add("REC_True_Prompt_Trigger_Energy", "REC_True_Prompt_Trigger_Energy", kTH1F, {{82, -1.0, 40.0}}); + histos.add("REC_Trigger_V_PtHadSum_Stern", "REC_Trigger_V_PtHadSum_Stern", kTH2F, {{100, 0, 100}, pthadAxis}); + histos.add("REC_Trigger_V_PtHadSum_Nch", "REC_Trigger_V_PtHadSum_Nch", kTH2F, {{100, 0, 100}, pthadAxis}); + histos.add("REC_Trigger_V_PtHadSum_Photon", "REC_Trigger_V_PtHadSum_Photon", kTH2F, {{100, 0, 100}, pthadAxis}); + histos.add("REC_TrueTrigger_V_PtHadSum_Photon", "REC_Trigger_V_PtHadSum_Photon", kTH2F, {{100, 0, 100}, pthadAxis}); + histos.add("REC_dR_Photon", "REC_dR_Photon", kTH1F, {{628, 0.0, 2 * TMath::Pi()}}); + histos.add("REC_dR_Stern", "REC_dR_Stern", kTH1F, {{628, 0.0, 2 * TMath::Pi()}}); + } + if (cfgGenHistograms) { + histos.add("GEN_nEvents", "GEN_nEvents", kTH1F, {{4, 0.0, 4.0}}); + histos.add("GEN_True_Trigger_Energy", "GEN_True_Trigger_Energy", kTH1F, {{82, -1.0, 40.0}}); + histos.add("GEN_Particle_Pt", "GEN_Particle_Pt", kTH1F, {{82, -1.0, 40.0}}); + histos.add("GEN_True_Photon_Energy", "GEN_True_Photon_Energy", kTH1F, {{8200, -1.0, 40.0}}); + histos.add("GEN_True_Prompt_Photon_Energy", "GEN_True_Prompt_Photon_Energy", kTH1F, {{8200, -1.0, 40.0}}); + histos.add("GEN_Trigger_V_PtHadSum_Stern", "GEN_Trigger_V_PtHadSum_Stern", kTH2F, {{100, 0, 100}, pthadAxis}); + histos.add("GEN_Trigger_V_PtHadSum_Photon", "GEN_Trigger_V_PtHadSum_Photon", kTH2F, {{100, 0, 100}, pthadAxis}); + histos.add("GEN_TrueTrigger_V_PtHadSum_Photon", "GEN_Trigger_V_PtHadSum_Photon", kTH2F, {{100, 0, 100}, pthadAxis}); + histos.add("GEN_dR_Photon", "GEN_dR_Photon", kTH1F, {{628, 0.0, 2 * TMath::Pi()}}); + histos.add("GEN_dR_Stern", "GEN_dR_Stern", kTH1F, {{628, 0.0, 2 * TMath::Pi()}}); + } + if (cfgDataHistograms) { + histos.add("DATA_nEvents", "DATA_nEvents", kTH1F, {{4, 0.0, 4.0}}); + histos.add("DATA_M02_BC", "DATA_M02_BC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("DATA_M02_AC", "DATA_M02_AC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("DATA_Cluster_QA", "DATA_Cluster_QA", kTH1F, {{10, -0.5, 9.5}}); + histos.add("DATA_ClusterPhi", "DATA_ClusterPhi", kTH1F, {{640 * 2, 0, 2 * TMath::Pi()}}); + histos.add("DATA_ClusterEta", "DATA_ClusterEta", kTH1F, {{100, -1, 1}}); + histos.add("DATA_All_Energy", "DATA_All_Energy", kTH1F, {{82, -1.0, 40.0}}); + histos.add("DATA_Cluster_PhiPrime_Pt", "DATA_Cluster_PhiPrime_Pt", kTH2F, {{640, 0, 2 * TMath::Pi()}, {82, -1.0, 40.0}}); + histos.add("DATA_Cluster_PhiPrime_Pt_AC", "DATA_Cluster_PhiPrime_Pt_AC", kTH2F, {{640, 0, 2 * TMath::Pi()}, {82, -1.0, 40.0}}); + histos.add("DATA_Cluster_PhiPrime_Pt_C", "DATA_Cluster_PhiPrime_Pt_C", kTH2F, {{640, 0, 2 * TMath::Pi()}, {82, -1.0, 40.0}}); + histos.add("DATA_Track_v_Cluster_Phi", "DATA_Track_v_Cluster_Phi", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("DATA_Track_v_Cluster_Eta", "DATA_Track_v_Cluster_Eta", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("DATA_Track_v_Cluster_Phi_Pt", "DATA_Track_v_Cluster_Phi_Pt", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {82, -1.0, 40.0}}); + histos.add("DATA_Track_v_Cluster_Phi_Eta", "DATA_Track_v_Cluster_Phi_Eta", kTH2F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}, {628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("DATA_SumPt_BC", "DATA_SumPt_BC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("DATA_SumPt_AC", "DATA_SumPt_AC", kTH1F, {{628, -2 * TMath::Pi(), 2 * TMath::Pi()}}); + histos.add("DATA_Trigger_V_PtHadSum_Photon", "DATA_Trigger_V_PtHadSum_Photon", kTH2F, {{100, 0, 100}, pthadAxis}); + histos.add("DATA_PtHadSum_Photon", "DATA_PtHadSum_Photon", kTH1F, {pthadAxis}); + histos.add("DATA_Trigger_Energy", "DATA_Trigger_Energy", kTH1F, {{82, -1.0, 40.0}}); + histos.add("DATA_Track_PhiPrime_Pt", "DATA_Track_PhiPrime_Pt", kTH2F, {{640, 0, 2 * TMath::Pi()}, {82, -1.0, 40.0}}); + histos.add("DATA_Track_Pt", "DATA_Track_Pt", kTH1F, {{82, -1.0, 40.0}}); + histos.add("DATA_Track_Phi", "DATA_Track_Phi", kTH1F, {{640 * 2, 0, 2 * TMath::Pi()}}); + histos.add("DATA_TrackPhi_photontrigger", "DATA_TrackPhi_photontrigger", kTH1F, {{64, 0, 2 * TMath::Pi()}}); + histos.add("DATA_TrackEta_photontrigger", "DATA_TrackEta_photontrigger", kTH1F, {{100, -1, 1}}); + histos.add("DATA_Trigger_V_PtHadSum_Stern", "DATA_Trigger_V_PtHadSum_Stern", kTH2F, {{100, 0, 100}, pthadAxis}); + histos.add("DATA_Trigger_V_PtHadSum_Nch", "DATA_Trigger_V_PtHadSum_Nch", kTH2F, {{100, 0, 100}, pthadAxis}); + histos.add("DATA_dR_Photon", "DATA_dR_Photon", kTH1F, {{628, 0.0, 2 * TMath::Pi()}}); + histos.add("DATA_dR_Stern", "DATA_dR_Stern", kTH1F, {{628, 0.0, 2 * TMath::Pi()}}); + } } // end of init - /* //Legacy non-je classes - Service ccdb; - std::string runs = ""; - double bfield = 0; - Filter clusterDefinitionSelection = (o2::aod::emcalcluster::definition == cfgClusterDefinition) && (o2::aod::emcalcluster::time >= cfgMinTime) && (o2::aod::emcalcluster::time <= cfgMaxTime) && (o2::aod::emcalcluster::energy > cfgMinClusterEnergy) && (o2::aod::emcalcluster::nCells >= cfgMinNCells) && (o2::aod::emcalcluster::nlm <= cfgMaxNLM) && (o2::aod::emcalcluster::isExotic == cfgExoticContribution); - Filter emccellfilter = aod::calo::caloType == 1; // mc emcal cell - Filter PosZFilter = nabs(aod::jcollision::posZ) < cfgVtxCut; - Filter mcPosZFilter = nabs(aod::jmccollision::posZ) < cfgVtxCut; - - using MCCells = o2::soa::Join; - using MCClusters = o2::soa::Join; - using Clusters = o2::aod::EMCALMCClusters; - - // using selectedCollisions = soa::Join; - using selectedMCCollisions = aod::JMcCollisions; - using TrackCandidates = soa::Join; - using BcCandidates = soa::Join; - using filteredMCCells = o2::soa::Filtered; - using filteredMCClusters = soa::Filtered; - using filteredClusters = soa::Filtered; - // using filteredCollisions = soa::Filtered; - using filteredMCCollisions = soa::Filtered; - */ - Filter PosZFilter_JE = nabs(aod::jcollision::posZ) < cfgVtxCut; + Filter mcPosZFilter = nabs(aod::jmccollision::posZ) < cfgVtxCut; Filter clusterDefinitionSelection_JE = (o2::aod::jcluster::definition == cfgClusterDefinition) && (o2::aod::jcluster::time >= cfgMinTime) && (o2::aod::jcluster::time <= cfgMaxTime) && (o2::aod::jcluster::energy > cfgMinClusterEnergy) && (o2::aod::jcluster::nCells >= cfgMinNCells) && (o2::aod::jcluster::nlm <= cfgMaxNLM) && (o2::aod::jcluster::isExotic == cfgExoticContribution); using selectedMCCollisions = aod::JMcCollisions; @@ -268,8 +244,9 @@ struct statPromptPhoton { using TrackCandidates = soa::Join; using BcCandidates = soa::Join; - // using jTrackCandidates = soa::Join; using jTrackCandidates = soa::Join; + using jEMCtracks = aod::JEMCTracks; + using jDataTrackCandidates = soa::Join; using jMCClusters = o2::soa::Join; @@ -279,7 +256,6 @@ struct statPromptPhoton { using jfilteredMCClusters = soa::Filtered; using jfilteredClusters = soa::Filtered; - // aod::JCollisions, aod::JCollisionPIs, aod::JCollisionBCs, aod::JEMCCollisionLbs Preslice perClusterMatchedTracks = o2::aod::emcalclustercell::emcalclusterId; // Helper functions @@ -310,14 +286,25 @@ struct statPromptPhoton { if (!IsParticle) { if constexpr (requires { track.trackId(); }) { - auto originaltrack = track.template track_as>(); - if (!trackSelection(originaltrack)) { - continue; + if (cfgJETracks) { + if (!jetderiveddatautilities::selectTrack(track, trackFilter)) { + continue; + } + } else { + auto originaltrack = track.template track_as>(); + if (!trackSelection(originaltrack)) { + continue; + } } // reject track } else if constexpr (requires { track.sign(); }) { // checking for JTrack - // done checking for JTrack, now default to normal tracks - if (!trackSelection(track)) { - continue; + if (cfgJETracks) { + if (!jetderiveddatautilities::selectTrack(track, trackFilter)) { + continue; + } + } else { + if (!trackSelection(track)) { + continue; + } } // reject track } // done checking for JTrack } else { @@ -353,11 +340,20 @@ struct statPromptPhoton { if (DodR) { if (dR > MinR && dR < MaxR) { if (!IsParticle) { - if (IsStern) { - histos.fill(HIST("REC_dR_Stern"), dR); - } - if (!IsStern) { - histos.fill(HIST("REC_dR_Photon"), dR); + if (cfgRecHistograms) { + if (IsStern) { + histos.fill(HIST("REC_dR_Stern"), dR); + } + if (!IsStern) { + histos.fill(HIST("REC_dR_Photon"), dR); + } + } else if (cfgDataHistograms) { + if (IsStern) { + histos.fill(HIST("DATA_dR_Stern"), dR); + } + if (!IsStern) { + histos.fill(HIST("DATA_dR_Photon"), dR); + } } } else { if (IsStern) { @@ -520,7 +516,7 @@ struct statPromptPhoton { } // now we do all PROMPT photons - histos.fill(HIST("REC_True_Trigger_Energy"), mcPhoton.e()); + histos.fill(HIST("GEN_True_Trigger_Energy"), mcPhoton.e()); int mompdg1 = 0; int momindex1 = 0; @@ -606,8 +602,9 @@ struct statPromptPhoton { PROCESS_SWITCH(statPromptPhoton, processMCGen, "process MC Gen", true); + PresliceUnsorted EMCTrackPerTrack = aod::jemctrack::trackId; int nEventsRecMC_JE = 0; - void processMCRec_JE(jfilteredCollisions::iterator const& collision, jfilteredMCClusters const& mcclusters, jTrackCandidates const& tracks, soa::Join const&, TrackCandidates const&, aod::JMcParticles const&, BcCandidates const&) + void processMCRec_JE(jfilteredCollisions::iterator const& collision, jfilteredMCClusters const& mcclusters, jTrackCandidates const& tracks, soa::Join const&, TrackCandidates const&, aod::JMcParticles const&, BcCandidates const&, jEMCtracks const& emctracks) { nEventsRecMC_JE++; @@ -634,12 +631,18 @@ struct statPromptPhoton { bool noTrk = true; for (auto& track : tracks) { - auto ogtrack = track.track_as(); - if (!trackSelection(ogtrack)) { - continue; - } - if (!ogtrack.isGlobalTrack()) { - continue; + if (cfgJETracks) { + if (!jetderiveddatautilities::selectTrack(track, trackFilter)) { + continue; + } + } else { + auto ogtrack = track.track_as(); + if (!trackSelection(ogtrack)) { + continue; + } + if (!ogtrack.isGlobalTrack()) { + continue; + } } noTrk = false; break; @@ -674,7 +677,6 @@ struct statPromptPhoton { // double photonPt = 0.0; double truephotonPt = 0.0; auto tracksofcluster = mccluster.matchedTracks_as>(); - /////////////// /////////////// /////////////// @@ -705,24 +707,35 @@ struct statPromptPhoton { double sumptT = 0; bool clusterqa = false; for (auto& ctrack : tracksofcluster) { - auto ogtrack = ctrack.track_as(); - if (!trackSelection(ogtrack)) { - continue; - } - if (!ogtrack.isGlobalTrack()) { - continue; + double etaT, phiT; + + if (cfgJETracks) { + if (!jetderiveddatautilities::selectTrack(ctrack, trackFilter)) { + continue; + } + auto emctracksPerTrack = emctracks.sliceBy(EMCTrackPerTrack, ctrack.globalIndex()); + auto emctrack = emctracksPerTrack.iteratorAt(0); + etaT = emctrack.etaEmcal(); + phiT = emctrack.phiEmcal(); + } else { + auto ogtrack = ctrack.track_as(); + if (!trackSelection(ogtrack)) { + continue; + } + if (!ogtrack.isGlobalTrack()) { + continue; + } + etaT = ogtrack.trackEtaEmcal(); + phiT = ogtrack.trackPhiEmcal(); } - // bool nodoublecount = false; - double etaT = ogtrack.trackEtaEmcal(); double etaC = mccluster.eta(); - double phiT = ogtrack.trackPhiEmcal(); double phiC = mccluster.phi(); double ptT = ctrack.pt(); bool etatrigger = false; bool phitrigger = false; - double phidiff = TVector2::Phi_mpi_pi(mccluster.phi() - ogtrack.phi()); - double etadiff = mccluster.eta() - ogtrack.eta(); + double phidiff = TVector2::Phi_mpi_pi(mccluster.phi() - ctrack.phi()); + double etadiff = mccluster.eta() - ctrack.eta(); if (cfgPtClusterCut) { if (fabs(etaT - etaC) < (0.010 + pow(ptT + 4.07, -2.5))) { @@ -781,19 +794,24 @@ struct statPromptPhoton { // check if cluster is good for (auto& ctrack : tracksofcluster) { - - auto ogtrack = ctrack.track_as(); - if (!trackSelection(ogtrack)) { - continue; - } - if (!ogtrack.isGlobalTrack()) { - continue; + if (cfgJETracks) { + if (!jetderiveddatautilities::selectTrack(ctrack, trackFilter)) { + continue; + } + } else { + auto ogtrack = ctrack.track_as(); + if (!trackSelection(ogtrack)) { + continue; + } + if (!ogtrack.isGlobalTrack()) { + continue; + } } bool etatrigger = false; bool phitrigger = false; // double ptT = ctrack.pt(); - double phidiff = TVector2::Phi_mpi_pi(mccluster.phi() - ogtrack.phi()); - double etadiff = mccluster.eta() - ogtrack.eta(); + double phidiff = TVector2::Phi_mpi_pi(mccluster.phi() - ctrack.phi()); + double etadiff = mccluster.eta() - ctrack.eta(); if (fabs(etadiff) < 0.05) { etatrigger = true; } @@ -847,7 +865,6 @@ struct statPromptPhoton { if (!clusterparticle.isPhysicalPrimary()) { continue; } - if (pdgcode == 211 || pdgcode == 321 || pdgcode == 2212 || pdgcode == 11) { bool notrack = true; histos.fill(HIST("REC_Cluster_Particle_Pt"), clusterparticle.pt()); @@ -862,12 +879,19 @@ struct statPromptPhoton { for (auto& track : tracks) { if (!track.has_mcParticle()) continue; - auto ogtrack = track.track_as(); - if (!trackSelection(ogtrack)) { - continue; - } - if (!ogtrack.isGlobalTrack()) { - continue; + + if (cfgJETracks) { + if (!jetderiveddatautilities::selectTrack(track, trackFilter)) { + continue; + } + } else { + auto ogtrack = track.track_as(); + if (!trackSelection(ogtrack)) { + continue; + } + if (!ogtrack.isGlobalTrack()) { + continue; + } } int tindex = track.mcParticleId(); @@ -1029,12 +1053,18 @@ struct statPromptPhoton { for (auto& track : tracks) { bool sterntrigger = false; double sternPt = 0.0; - auto ogtrack = track.track_as(); - if (!trackSelection(ogtrack)) { - continue; - } - if (!ogtrack.isGlobalTrack()) { - continue; + if (cfgJETracks) { + if (!jetderiveddatautilities::selectTrack(track, trackFilter)) { + continue; + } + } else { + auto ogtrack = track.track_as(); + if (!trackSelection(ogtrack)) { + continue; + } + if (!ogtrack.isGlobalTrack()) { + continue; + } } // Do stuff with geometric cuts @@ -1068,12 +1098,12 @@ struct statPromptPhoton { sternPt = track.pt(); } } - + double pthadsum = GetPtHadSum(tracks, track, cfgMinR, cfgMaxR, true, false, true); + histos.fill(HIST("REC_Trigger_V_PtHadSum_Nch"), sternPt, pthadsum); if (sterntrigger) { bool doStern = true; double sterncount = 1.0; while (doStern) { - double pthadsum = GetPtHadSum(tracks, track, cfgMinR, cfgMaxR, true, false, true); histos.fill(HIST("REC_Trigger_V_PtHadSum_Stern"), sterncount, pthadsum, 2.0 / sternPt); if (sterncount < sternPt) { sterncount++; @@ -1089,7 +1119,7 @@ struct statPromptPhoton { PROCESS_SWITCH(statPromptPhoton, processMCRec_JE, "processJE MC data", false); int nEventsData = 0; - void processData(jfilteredCollisions::iterator const& collision, jfilteredClusters const& clusters, jDataTrackCandidates const& tracks, soa::Join const&, TrackCandidates const&, BcCandidates const&) + void processData(jfilteredCollisions::iterator const& collision, jfilteredClusters const& clusters, jDataTrackCandidates const& tracks, soa::Join const&, TrackCandidates const&, BcCandidates const&, jEMCtracks const& emctracks) { nEventsData++; @@ -1119,17 +1149,23 @@ struct statPromptPhoton { bool noTrk = true; for (auto& track : tracks) { - auto ogtrack = track.track_as(); - if (!trackSelection(ogtrack)) { - continue; - } - if (!ogtrack.isGlobalTrack()) { - continue; + + if (cfgJETracks) { + if (!jetderiveddatautilities::selectTrack(track, trackFilter)) { + continue; + } + } else { + auto ogtrack = track.track_as(); + if (!trackSelection(ogtrack)) { + continue; + } + if (!ogtrack.isGlobalTrack()) { + continue; + } } noTrk = false; break; } - if (noTrk) return; @@ -1190,23 +1226,35 @@ struct statPromptPhoton { double sumptT = 0; bool clusterqa = false; for (auto& ctrack : tracksofcluster) { - auto ogtrack = ctrack.track_as(); - if (!trackSelection(ogtrack)) { - continue; - } - if (!ogtrack.isGlobalTrack()) { - continue; + double etaT, phiT; + if (cfgJETracks) { + if (!jetderiveddatautilities::selectTrack(ctrack, trackFilter)) { + continue; + } + auto emctracksPerTrack = emctracks.sliceBy(EMCTrackPerTrack, ctrack.globalIndex()); + auto emctrack = emctracksPerTrack.iteratorAt(0); + etaT = emctrack.etaEmcal(); + phiT = emctrack.phiEmcal(); + } else { + auto ogtrack = ctrack.track_as(); + if (!trackSelection(ogtrack)) { + continue; + } + if (!ogtrack.isGlobalTrack()) { + continue; + } + etaT = ogtrack.trackEtaEmcal(); + phiT = ogtrack.trackPhiEmcal(); } - double etaT = ogtrack.trackEtaEmcal(); double etaC = cluster.eta(); - double phiT = ogtrack.trackPhiEmcal(); double phiC = cluster.phi(); double ptT = ctrack.pt(); bool etatrigger = false; bool phitrigger = false; - double phidiff = TVector2::Phi_mpi_pi(cluster.phi() - ogtrack.phi()); - double etadiff = cluster.eta() - ogtrack.eta(); + double phidiff = TVector2::Phi_mpi_pi(cluster.phi() - ctrack.phi()); + double etadiff = cluster.eta() - ctrack.eta(); + if (cfgPtClusterCut) { if (fabs(etaT - etaC) < (0.010 + pow(ptT + 4.07, -2.5))) { etatrigger = true; @@ -1279,12 +1327,18 @@ struct statPromptPhoton { for (auto& track : tracks) { bool sterntrigger = false; double sternPt = 0.0; - auto ogtrack = track.track_as(); - if (!trackSelection(ogtrack)) { - continue; - } - if (!ogtrack.isGlobalTrack()) { - continue; + if (cfgJETracks) { + if (!jetderiveddatautilities::selectTrack(track, trackFilter)) { + continue; + } + } else { + auto ogtrack = track.track_as(); + if (!trackSelection(ogtrack)) { + continue; + } + if (!ogtrack.isGlobalTrack()) { + continue; + } } // Do stuff with geometric cuts @@ -1322,6 +1376,8 @@ struct statPromptPhoton { if (sterntrigger) { bool doStern = true; double sterncount = 1.0; + double pthadsum = GetPtHadSum(tracks, track, cfgMinR, cfgMaxR, true, false, true); + histos.fill(HIST("DATA_Trigger_V_PtHadSum_Nch"), sternPt, pthadsum); while (doStern) { double pthadsum = GetPtHadSum(tracks, track, cfgMinR, cfgMaxR, true, false, true); histos.fill(HIST("DATA_Trigger_V_PtHadSum_Stern"), sterncount, pthadsum, 2.0 / sternPt); From af0aad9ed81dbbee69b29c4529d71460f0a726e8 Mon Sep 17 00:00:00 2001 From: Chiara Pinto <48326672+chiarapinto@users.noreply.github.com> Date: Thu, 27 Mar 2025 11:30:41 +0100 Subject: [PATCH 0845/1650] [PWGLF] fix detector response matrix (#10671) --- PWGLF/Tasks/Nuspex/antinucleiInJets.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx index 4db5c685986..c1cd8348ce8 100644 --- a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx +++ b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx @@ -255,7 +255,7 @@ struct AntinucleiInJets { registryMC.add("antiproton_ue_rec_tof", "antiproton_ue_rec_tof", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); // detector response matrix - registryMC.add("detectorResponseMatrix", "detectorResponseMatrix", HistType::kTH2F, {{1000, 0.0, 100.0, "#it{p}_{T}^{gen} (GeV/#it{c})"}, {2000, -20.0, 20.0, "#it{p}_{T}^{gen} - #it{p}_{T}^{rec} (GeV/#it{c})"}}); + registryMC.add("detectorResponseMatrix", "detectorResponseMatrix", HistType::kTH2F, {{1000, 0.0, 100.0, "#it{p}_{T}^{rec} (GeV/#it{c})"}, {2000, -20.0, 20.0, "#it{p}_{T}^{gen} - #it{p}_{T}^{rec} (GeV/#it{c})"}}); } // systematic uncertainties @@ -1106,7 +1106,7 @@ struct AntinucleiInJets { continue; // fill detector response matrix - registryMC.fill(HIST("detectorResponseMatrix"), jetPtGen, jetPtGen - jet.pt()); // maybe it should be filled after bkg sub + registryMC.fill(HIST("detectorResponseMatrix"), jet.pt(), jetPtGen - jet.pt()); // maybe it should be filled after bkg sub // jet pt must be larger than threshold auto jetForSub = jet; From 977bbfa1b9848e28007c4898a474014ff3d2ef0d Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Thu, 27 Mar 2025 12:53:11 +0100 Subject: [PATCH 0846/1650] [PWGLF] fix missing _as in one specific subpath (#10676) --- PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx index 30be3de8570..261db051ca5 100644 --- a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx @@ -1992,7 +1992,7 @@ struct StrangenessBuilder { } //__________________________________________________ - template + template void buildTrackedCascades(TStrangeTracks const& cascadeTracks, TMCParticles const& mcParticles) { if (!mEnabledTables[kStoredTraCascCores] || mc_findableMode.value != 0) { @@ -2007,12 +2007,12 @@ struct StrangenessBuilder { continue; // safety (should be fine but depends on future stratrack dev) auto const& strangeTrack = cascadeTrack.template track_as(); - auto const& collision = strangeTrack.collision(); + auto const& collision = strangeTrack.template collision_as(); // if collisionId positive: get vertex, negative: origin // could be replaced by mean vertex (but without much benefit...) float pvX = 0.0f, pvY = 0.0f, pvZ = 0.0f; if (strangeTrack.has_collision()) { - auto const& collision = strangeTrack.collision(); + auto const& collision = strangeTrack.template collision_as(); pvX = collision.posX(); pvY = collision.posY(); pvZ = collision.posZ(); @@ -2157,7 +2157,7 @@ struct StrangenessBuilder { // build tracked cascades only if subscription is Run 3 like (doesn't exist in Run 2) if constexpr (soa::is_table) { - buildTrackedCascades(trackedCascades, mcParticles); + buildTrackedCascades(trackedCascades, mcParticles); } populateCascadeInterlinks(); From 9b75e5005b1184f357d9da2c5fd8a32ca4edbe1a Mon Sep 17 00:00:00 2001 From: Xu wang <113404602+1481014945@users.noreply.github.com> Date: Thu, 27 Mar 2025 19:53:24 +0800 Subject: [PATCH 0847/1650] [PWGHF] Remove the DCA cut on tracks only used to find leading particle (#10675) --- PWGHF/HFC/TableProducer/correlatorD0Hadrons.cxx | 4 ++-- PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx | 4 ++-- PWGHF/HFC/Utils/utilsCorrelations.h | 7 ++----- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/PWGHF/HFC/TableProducer/correlatorD0Hadrons.cxx b/PWGHF/HFC/TableProducer/correlatorD0Hadrons.cxx index 675a682b21b..7b6517f29dc 100644 --- a/PWGHF/HFC/TableProducer/correlatorD0Hadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorD0Hadrons.cxx @@ -329,7 +329,7 @@ struct HfCorrelatorD0Hadrons { { // find leading particle if (correlateD0WithLeadingParticle) { - leadingIndex = findLeadingParticle(tracks, dcaXYTrackMax.value, dcaZTrackMax.value, etaTrackMax.value); + leadingIndex = findLeadingParticle(tracks, etaTrackMax.value); } int poolBin = corrBinning.getBin(std::make_tuple(collision.posZ(), collision.multFT0M())); @@ -485,7 +485,7 @@ struct HfCorrelatorD0Hadrons { { // find leading particle if (correlateD0WithLeadingParticle) { - leadingIndex = findLeadingParticle(tracks, dcaXYTrackMax.value, dcaZTrackMax.value, etaTrackMax.value); + leadingIndex = findLeadingParticle(tracks, etaTrackMax.value); } int poolBin = corrBinning.getBin(std::make_tuple(collision.posZ(), collision.multFT0M())); registry.fill(HIST("hCollisionPoolBin"), poolBin); diff --git a/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx b/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx index fcd40d29e2f..e2fd6908916 100644 --- a/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx @@ -342,7 +342,7 @@ struct HfCorrelatorLcHadrons { // find leading particle if (correlateLcWithLeadingParticle) { - leadingIndex = findLeadingParticle(tracks, dcaXYTrackMax.value, dcaZTrackMax.value, etaTrackMax.value); + leadingIndex = findLeadingParticle(tracks, etaTrackMax.value); } auto bc = collision.bc_as(); int gCollisionId = collision.globalIndex(); @@ -490,7 +490,7 @@ struct HfCorrelatorLcHadrons { // find leading particle if (correlateLcWithLeadingParticle) { - leadingIndex = findLeadingParticle(tracks, dcaXYTrackMax.value, dcaZTrackMax.value, etaTrackMax.value); + leadingIndex = findLeadingParticle(tracks, etaTrackMax.value); } int poolBin = corrBinning.getBin(std::make_tuple(collision.posZ(), collision.multFT0M())); diff --git a/PWGHF/HFC/Utils/utilsCorrelations.h b/PWGHF/HFC/Utils/utilsCorrelations.h index 20d007b3e29..a38e36f7fc1 100644 --- a/PWGHF/HFC/Utils/utilsCorrelations.h +++ b/PWGHF/HFC/Utils/utilsCorrelations.h @@ -113,14 +113,11 @@ bool passPIDSelection(Atrack const& track, SpeciesContainer const mPIDspecies, } // ========= Find Leading Particle ============== -template -int findLeadingParticle(TTracks const& tracks, T1 const dcaXYTrackMax, T2 const dcaZTrackMax, T3 const etaTrackMax) +template //// FIXME: 14 days +int findLeadingParticle(TTracks const& tracks, T1 const etaTrackMax) { auto leadingParticle = tracks.begin(); for (auto const& track : tracks) { - if (std::abs(track.dcaXY()) >= dcaXYTrackMax || std::abs(track.dcaZ()) >= dcaZTrackMax) { - continue; - } if (std::abs(track.eta()) > etaTrackMax) { continue; } From 272d35dcf2bdf875498039a5493d1140cdff8cd8 Mon Sep 17 00:00:00 2001 From: Chiara Pinto <48326672+chiarapinto@users.noreply.github.com> Date: Thu, 27 Mar 2025 14:01:16 +0100 Subject: [PATCH 0848/1650] [PWGLF] adding correction of jet pT reconstructed (#10677) --- PWGLF/Tasks/Nuspex/antinucleiInJets.cxx | 31 +++++++++++++++++++------ 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx index c1cd8348ce8..776342f8107 100644 --- a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx +++ b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx @@ -420,10 +420,23 @@ struct AntinucleiInJets { return false; } - double getCorrectedPt(double ptRec) + double getCorrectedPt(double ptRec, TH2* responseMatrix) { - // to be developed - return ptRec; + + int binX = responseMatrix->GetXaxis()->FindBin(ptRec); + TH1D* proj = responseMatrix->ProjectionY("proj", binX, binX); + + // add a protection in case the projection is empty + if (proj->GetEntries() == 0) { + delete proj; + return ptRec; + } + + double deltaPt = proj->GetRandom(); + double ptGen = ptRec + deltaPt; + delete proj; + + return ptGen; } void getReweightingHistograms(o2::framework::Service const& ccdbObj, TString filepath, TString histname_antip_jet, TString histname_antip_ue) @@ -520,7 +533,8 @@ struct AntinucleiInJets { // jet pt must be larger than threshold auto jetForSub = jet; fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jetForSub, rhoPerp, rhoMPerp); - if (getCorrectedPt(jetMinusBkg.pt()) < minJetPt) + // if (getCorrectedPt(jetMinusBkg.pt()) < minJetPt) // while fixing the response matrix + if (jetMinusBkg.pt() < minJetPt) continue; isAtLeastOneJetSelected = true; @@ -752,7 +766,8 @@ struct AntinucleiInJets { double ptJetAfterSub = jetForSub.pt(); registryQC.fill(HIST("jetPtDifference"), ptJetAfterSub - ptJetBeforeSub); - if (getCorrectedPt(jetMinusBkg.pt()) < minJetPt) + // if (getCorrectedPt(jetMinusBkg.pt()) < minJetPt) // while fixing the response matrix + if (jetMinusBkg.pt() < minJetPt) continue; njetsHighPt++; registryQC.fill(HIST("sumPtJet"), jet.pt()); @@ -1111,7 +1126,8 @@ struct AntinucleiInJets { // jet pt must be larger than threshold auto jetForSub = jet; fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jetForSub, rhoPerp, rhoMPerp); - if (getCorrectedPt(jetMinusBkg.pt()) < minJetPt) + // if (getCorrectedPt(jetMinusBkg.pt()) < minJetPt) // while fixing the response matrix + if (jetMinusBkg.pt() < minJetPt) continue; // perpendicular cone @@ -1286,7 +1302,8 @@ struct AntinucleiInJets { // jet pt must be larger than threshold auto jetForSub = jet; fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jetForSub, rhoPerp, rhoMPerp); - if (getCorrectedPt(jetMinusBkg.pt()) < minJetPt) + // if (getCorrectedPt(jetMinusBkg.pt()) < minJetPt) // while fixing the response matrix + if (jetMinusBkg.pt() < minJetPt) continue; // get jet constituents From 066a4cdae9a2c5ac3eabdfb97febf952a5bf761b Mon Sep 17 00:00:00 2001 From: Junlee Kim Date: Thu, 27 Mar 2025 15:01:13 +0000 Subject: [PATCH 0849/1650] [PWGLF] initial commit of lambdalambda table producer (#10639) Co-authored-by: ALICE Action Bot --- PWGLF/DataModel/ReducedLambdaLambdaTables.h | 81 +++++ .../TableProducer/Strangeness/CMakeLists.txt | 5 + .../Strangeness/LambdaLambdatable.cxx | 299 ++++++++++++++++++ 3 files changed, 385 insertions(+) create mode 100644 PWGLF/DataModel/ReducedLambdaLambdaTables.h create mode 100644 PWGLF/TableProducer/Strangeness/LambdaLambdatable.cxx diff --git a/PWGLF/DataModel/ReducedLambdaLambdaTables.h b/PWGLF/DataModel/ReducedLambdaLambdaTables.h new file mode 100644 index 00000000000..88ea8fb0530 --- /dev/null +++ b/PWGLF/DataModel/ReducedLambdaLambdaTables.h @@ -0,0 +1,81 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// +/// \author Junlee Kim + +#ifndef PWGLF_DATAMODEL_REDUCEDLAMBDALAMBDATABLES_H_ +#define PWGLF_DATAMODEL_REDUCEDLAMBDALAMBDATABLES_H_ + +#include + +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/Core/RecoDecay.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/ASoA.h" + +namespace o2::aod +{ +namespace redllevent +{ +DECLARE_SOA_COLUMN(NumLambda, numLambda, int); //! Number of lambda +DECLARE_SOA_COLUMN(Centrality, centrality, float); //! +} // namespace redllevent +DECLARE_SOA_TABLE(RedLLEvents, "AOD", "REDLLEVENT", + o2::soa::Index<>, + bc::GlobalBC, + bc::RunNumber, + timestamp::Timestamp, + collision::PosZ, + collision::NumContrib, + redllevent::Centrality, + redllevent::NumLambda); +using RedLLEvent = RedLLEvents::iterator; + +namespace lltrack +{ +DECLARE_SOA_INDEX_COLUMN(RedLLEvent, redLLEvent); +DECLARE_SOA_COLUMN(LLdId, lldId, int); //! LL PID +DECLARE_SOA_COLUMN(LLdPx, lldPx, float); //! LL d Px +DECLARE_SOA_COLUMN(LLdPy, lldPy, float); //! LL d Py +DECLARE_SOA_COLUMN(LLdPz, lldPz, float); //! LL d Pz +DECLARE_SOA_COLUMN(LLdx, lldx, float); //! LL d x +DECLARE_SOA_COLUMN(LLdy, lldy, float); //! LL d y +DECLARE_SOA_COLUMN(LLdz, lldz, float); //! LL d z +DECLARE_SOA_COLUMN(LLdMass, lldMass, float); //! LL d Mass +DECLARE_SOA_COLUMN(LLdd1TPC, lldd1TPC, float); //! LL dd1 TPC nsigma +DECLARE_SOA_COLUMN(LLdd2TPC, lldd2TPC, float); //! LL dd2 TPC nsigma +DECLARE_SOA_COLUMN(LLdd1Index, lldd1Index, int64_t); //! LL dd1 global index +DECLARE_SOA_COLUMN(LLdd2Index, lldd2Index, int64_t); //! LL dd2 global index + +} // namespace lltrack +DECLARE_SOA_TABLE(LLTracks, "AOD", "LLTRACK", + o2::soa::Index<>, + lltrack::RedLLEventId, + lltrack::LLdId, + lltrack::LLdPx, + lltrack::LLdPy, + lltrack::LLdPz, + lltrack::LLdx, + lltrack::LLdy, + lltrack::LLdz, + lltrack::LLdMass, + lltrack::LLdd1TPC, + lltrack::LLdd2TPC, + lltrack::LLdd1Index, + lltrack::LLdd2Index); + +using LLTrack = LLTracks::iterator; +} // namespace o2::aod +#endif // PWGLF_DATAMODEL_REDUCEDLAMBDALAMBDATABLES_H_ diff --git a/PWGLF/TableProducer/Strangeness/CMakeLists.txt b/PWGLF/TableProducer/Strangeness/CMakeLists.txt index 51205d29dcd..84f22d54d1d 100644 --- a/PWGLF/TableProducer/Strangeness/CMakeLists.txt +++ b/PWGLF/TableProducer/Strangeness/CMakeLists.txt @@ -121,6 +121,11 @@ o2physics_add_dpl_workflow(v0qaanalysis PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(lambdalambdatable + SOURCES LambdaLambdatable.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DetectorsVertexing + COMPONENT_NAME Analysis) + # ML selection o2physics_add_dpl_workflow(lambdakzeromlselectiontreecreator SOURCES lambdakzeroMLSelectionTreeCreator.cxx diff --git a/PWGLF/TableProducer/Strangeness/LambdaLambdatable.cxx b/PWGLF/TableProducer/Strangeness/LambdaLambdatable.cxx new file mode 100644 index 00000000000..778f39ed442 --- /dev/null +++ b/PWGLF/TableProducer/Strangeness/LambdaLambdatable.cxx @@ -0,0 +1,299 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// +/// \author Junlee Kim, (junlee.kim@cern.ch) + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "EventFiltering/Zorro.h" +#include "EventFiltering/ZorroSummary.h" + +#include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/runDataProcessing.h" + +#include "CommonConstants/MathConstants.h" +#include "Common/Core/TrackSelection.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/PIDResponse.h" + +#include "CCDB/BasicCCDBManager.h" +#include "CCDB/CcdbApi.h" + +#include "PWGLF/DataModel/ReducedLambdaLambdaTables.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +struct lambdalambdatable { + + // Produce derived tables + Produces redLLEvents; + Produces llTrack; + + // events + Configurable cfgCutVertex{"cfgCutVertex", 10.0f, "Accepted z-vertex range"}; + + Configurable cfgUseGlobalTrack{"cfgUseGlobalTrack", true, "use Global track"}; + Configurable cfgCutPt{"cfgCutPt", 0.2, "PT cut on daughter track"}; + Configurable cfgCutEta{"cfgCutEta", 0.8, "Eta cut on daughter track"}; + Configurable cfgCutDCAxy{"cfgCutDCAxy", 0.2f, "DCAxy range for tracks"}; + Configurable cfgCutDCAz{"cfgCutDCAz", 0.2f, "DCAz range for tracks"}; + Configurable cfgTPCcluster{"cfgTPCcluster", 50, "Number of TPC cluster"}; + + Configurable cfgv0radiusMin{"cfgv0radiusMin", 1.2, "minimum decay radius"}; + Configurable cfgDCAPosToPVMin{"cfgDCAPosToPVMin", 0.05, "minimum DCA to PV for positive track"}; + Configurable cfgDCANegToPVMin{"cfgDCANegToPVMin", 0.2, "minimum DCA to PV for negative track"}; + Configurable cfgv0CosPA{"cfgv0CosPA", 0.995, "minimum v0 cosine"}; + Configurable cfgDCAV0Dau{"cfgDCAV0Dau", 1.0, "maximum DCA between daughters"}; + + Configurable cfgV0PtMin{"cfgV0PtMin", 0, "minimum pT for lambda"}; + Configurable cfgV0EtaMin{"cfgV0EtaMin", -0.5, "maximum rapidity"}; + Configurable cfgV0EtaMax{"cfgV0EtaMax", 0.5, "maximum rapidity"}; + Configurable cfgV0LifeTime{"cfgV0LifeTime", 30., "maximum lambda lifetime"}; + + Configurable cfgDaughTPCnclsMin{"cfgDaughTPCnclsMin", 50, "minimum fired crossed rows"}; + Configurable cfgDaughPIDCutsTPCPr{"cfgDaughPIDCutsTPCPr", 5, "proton nsigma for TPC"}; + Configurable cfgDaughPIDCutsTPCPi{"cfgDaughPIDCutsTPCPi", 5, "pion nsigma for TPC"}; + Configurable cfgDaughEtaMin{"cfgDaughEtaMin", -0.8, "minimum daughter eta"}; + Configurable cfgDaughEtaMax{"cfgDaughEtaMax", 0.8, "maximum daughter eta"}; + Configurable cfgDaughPrPt{"cfgDaughPrPt", 0.5, "minimum daughter proton pt"}; + Configurable cfgDaughPiPt{"cfgDaughPiPt", 0.2, "minimum daughter pion pt"}; + + Configurable cfgMinLambdaMass{"cfgMinLambdaMass", 1.105, "Minimum lambda mass"}; + Configurable cfgMaxLambdaMass{"cfgMaxLambdaMass", 1.125, "Maximum lambda mass"}; + + ConfigurableAxis massAxis{"massAxis", {200, 2.1, 2.3}, "Invariant mass axis"}; + ConfigurableAxis ptAxis{"ptAxis", {VARIABLE_WIDTH, 0.0, 1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 6.5, 8.0, 10.0, 100.0}, "Transverse momentum bins"}; + ConfigurableAxis centAxis{"centAxis", {VARIABLE_WIDTH, 0, 20, 50, 100}, "Centrality interval"}; + ConfigurableAxis vertexAxis{"vertexAxis", {10, -10, 10}, "vertex axis for mixing"}; + + Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; + Filter acceptanceFilter = (nabs(aod::track::eta) < cfgCutEta && nabs(aod::track::pt) > cfgCutPt); + Filter DCAcutFilter = (nabs(aod::track::dcaXY) < cfgCutDCAxy) && (nabs(aod::track::dcaZ) < cfgCutDCAz); + + using EventCandidates = soa::Filtered>; + using TrackCandidates = soa::Filtered>; + + HistogramRegistry histos{ + "histos", + {}, + OutputObjHandlingPolicy::AnalysisObject}; + + SliceCache cache; + + double massLambda = o2::constants::physics::MassLambda; + double massPr = o2::constants::physics::MassProton; + double massPi = o2::constants::physics::MassPionCharged; + + float centrality; + + void init(o2::framework::InitContext&) + { + histos.add("hEventstat", "", {HistType::kTH1F, {{3, 0, 3}}}); + } + + template + bool selectionTrack(const T& candidate) + { + if (cfgUseGlobalTrack && !(candidate.isGlobalTrack() && candidate.isPVContributor() && candidate.tpcNClsFound() > cfgTPCcluster)) { + return false; + } + return true; + } + + template + bool selectionPID(const T& candidate, int pid) + { + if (pid == 0) { + if (std::abs(candidate.tpcNSigmaPi()) > cfgDaughPIDCutsTPCPi) { + return false; + } + } else if (pid == 2) { + if (std::abs(candidate.tpcNSigmaPr()) > cfgDaughPIDCutsTPCPr) { + return false; + } + } + return true; + } + + template + bool selectionV0(TCollision const& collision, V0 const& candidate) + { + if (candidate.v0radius() < cfgv0radiusMin) + return false; + if (std::abs(candidate.dcapostopv()) < cfgDCAPosToPVMin) + return false; + if (std::abs(candidate.dcanegtopv()) < cfgDCANegToPVMin) + return false; + if (candidate.v0cosPA() < cfgv0CosPA) + return false; + if (std::abs(candidate.dcaV0daughters()) > cfgDCAV0Dau) + return false; + if (candidate.pt() < cfgV0PtMin) + return false; + if (candidate.yLambda() < cfgV0EtaMin) + return false; + if (candidate.yLambda() > cfgV0EtaMax) + return false; + if (candidate.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * massLambda > cfgV0LifeTime) + return false; + + return true; + } + + template + bool selectionV0Daughter(T const& track, int pid) // pid 0: proton, pid 1: pion + { + if (track.tpcNClsFound() < cfgDaughTPCnclsMin) + return false; + if (pid == 0 && std::abs(track.tpcNSigmaPr()) > cfgDaughPIDCutsTPCPr) + return false; + if (pid == 1 && std::abs(track.tpcNSigmaPi()) > cfgDaughPIDCutsTPCPi) + return false; + if (track.eta() > cfgDaughEtaMax) + return false; + if (track.eta() < cfgDaughEtaMin) + return false; + if (pid == 0 && track.pt() < cfgDaughPrPt) + return false; + if (pid == 1 && track.pt() < cfgDaughPiPt) + return false; + + return true; + } + + ROOT::Math::PxPyPzMVector DauVec1, DauVec2, LLMesonMother, LLVectorDummy, LLd1dummy, LLd2dummy; + + void processLLReducedTable(EventCandidates::iterator const& collision, TrackCandidates const& /*tracks*/, aod::V0Datas const& V0s, aod::BCsWithTimestamps const&) + { + bool keepEventLL = false; + int numberLambda = 0; + auto currentRunNumber = collision.bc_as().runNumber(); + auto bc = collision.bc_as(); + centrality = collision.centFT0M(); + + std::vector LLdId = {}; + + std::vector LLdd1Index = {}; + std::vector LLdd2Index = {}; + + std::vector LLdd1TPC = {}; + std::vector LLdd2TPC = {}; + + std::vector LLdx = {}; + std::vector LLdy = {}; + std::vector LLdz = {}; + + std::vector llresonance; + + histos.fill(HIST("hEventstat"), 0.5); + if (!(collision.sel8() && collision.selection_bit(aod::evsel::kNoTimeFrameBorder) && collision.selection_bit(aod::evsel::kNoITSROFrameBorder) && collision.selection_bit(aod::evsel::kNoSameBunchPileup) && collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) + return; + histos.fill(HIST("hEventstat"), 1.5); + + for (auto& v0 : V0s) { + auto postrack_v0 = v0.template posTrack_as(); + auto negtrack_v0 = v0.template negTrack_as(); + + int LambdaTag = 0; + int aLambdaTag = 0; + + if (selectionV0Daughter(postrack_v0, 0) && selectionV0Daughter(negtrack_v0, 1)) + LambdaTag = 1; + + if (selectionV0Daughter(negtrack_v0, 0) && selectionV0Daughter(postrack_v0, 1)) + aLambdaTag = 1; + + if (LambdaTag == aLambdaTag) + continue; + + if (!selectionV0(collision, v0)) + continue; + + if (LambdaTag) { + if (v0.mLambda() < cfgMinLambdaMass || v0.mLambda() > cfgMaxLambdaMass) { + continue; + } + DauVec1 = ROOT::Math::PxPyPzMVector(v0.pxpos(), v0.pypos(), v0.pzpos(), massPr); + DauVec2 = ROOT::Math::PxPyPzMVector(v0.pxneg(), v0.pyneg(), v0.pzneg(), massPi); + LLdId.push_back(3122); + } else if (aLambdaTag) { + if (v0.mAntiLambda() < cfgMinLambdaMass || v0.mAntiLambda() > cfgMaxLambdaMass) { + continue; + } + DauVec1 = ROOT::Math::PxPyPzMVector(v0.pxpos(), v0.pypos(), v0.pzpos(), massPi); + DauVec2 = ROOT::Math::PxPyPzMVector(v0.pxneg(), v0.pyneg(), v0.pzneg(), massPr); + LLdId.push_back(-3122); + } + numberLambda++; + + LLdx.push_back(v0.x()); + LLdy.push_back(v0.y()); + LLdz.push_back(v0.z()); + + LLMesonMother = DauVec1 + DauVec2; + + ROOT::Math::PtEtaPhiMVector temp3(LLMesonMother.Pt(), LLMesonMother.Eta(), LLMesonMother.Phi(), LLMesonMother.M()); + llresonance.push_back(temp3); + + if (LambdaTag) { + LLdd1TPC.push_back(postrack_v0.tpcNSigmaPr()); + LLdd2TPC.push_back(negtrack_v0.tpcNSigmaPi()); + } else if (aLambdaTag) { + LLdd1TPC.push_back(postrack_v0.tpcNSigmaPi()); + LLdd2TPC.push_back(negtrack_v0.tpcNSigmaPr()); + } + + LLdd1Index.push_back(postrack_v0.globalIndex()); + LLdd2Index.push_back(negtrack_v0.globalIndex()); + } // select collision + + if (numberLambda < 2) + return; + + keepEventLL = true; + + if (keepEventLL) { + histos.fill(HIST("hEventstat"), 2.5); + /////////// Fill collision table/////////////// + redLLEvents(bc.globalBC(), currentRunNumber, bc.timestamp(), collision.posZ(), collision.numContrib(), centrality, numberLambda); + auto indexEvent = redLLEvents.lastIndex(); + //// Fill track table for LL////////////////// + for (auto if1 = llresonance.begin(); if1 != llresonance.end(); ++if1) { + auto i5 = std::distance(llresonance.begin(), if1); + LLVectorDummy = llresonance.at(i5); + llTrack(indexEvent, LLdId.at(i5), LLVectorDummy.Px(), LLVectorDummy.Py(), LLVectorDummy.Pz(), LLdx.at(i5), LLdy.at(i5), LLdz.at(i5), LLVectorDummy.M(), LLdd1TPC.at(i5), LLdd2TPC.at(i5), LLdd1Index.at(i5), LLdd2Index.at(i5)); + } + } + } // process + PROCESS_SWITCH(lambdalambdatable, processLLReducedTable, "Process table creation for double ll", true); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfg) +{ + return WorkflowSpec{adaptAnalysisTask(cfg)}; +} From 49fcdfe650712a7f6c2b6d0d43fe9028cf12f43d Mon Sep 17 00:00:00 2001 From: Francesco Mazzaschi <43742195+fmazzasc@users.noreply.github.com> Date: Thu, 27 Mar 2025 16:36:00 +0100 Subject: [PATCH 0850/1650] [PWGLF] Add information to non prompt table (#10669) Co-authored-by: Francesco Mazzaschi Co-authored-by: ALICE Action Bot --- PWGLF/DataModel/LFNonPromptCascadeTables.h | 8 ++++++++ PWGLF/Tasks/Strangeness/nonPromptCascade.cxx | 17 +++++++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/PWGLF/DataModel/LFNonPromptCascadeTables.h b/PWGLF/DataModel/LFNonPromptCascadeTables.h index 1600ab0e733..e4a79fd07d7 100644 --- a/PWGLF/DataModel/LFNonPromptCascadeTables.h +++ b/PWGLF/DataModel/LFNonPromptCascadeTables.h @@ -26,6 +26,7 @@ namespace NPCascadeTable { DECLARE_SOA_COLUMN(MatchingChi2, matchingChi2, float); DECLARE_SOA_COLUMN(DeltaPtITSCascade, deltaPtITSCascade, float); +DECLARE_SOA_COLUMN(DeltaPtCascade, deltaPtCascade, float); DECLARE_SOA_COLUMN(ITSClusSize, itsClusSize, float); DECLARE_SOA_COLUMN(HasReassociatedCluster, hasReassociatedCluster, bool); DECLARE_SOA_COLUMN(IsGoodMatch, isGoodMatch, bool); @@ -103,12 +104,14 @@ DECLARE_SOA_COLUMN(DCAxMC, dcaXmc, float); DECLARE_SOA_COLUMN(DCAyMC, dcaYmc, float); DECLARE_SOA_COLUMN(DCAzMC, dcaZmc, float); DECLARE_SOA_COLUMN(MCcollisionMatch, mcCollisionMatch, bool); +DECLARE_SOA_COLUMN(HasFakeReassociation, hasFakeReassociation, bool); DECLARE_SOA_COLUMN(MotherDecayDaughters, motherDecayDaughters, int8_t); } // namespace NPCascadeTable DECLARE_SOA_TABLE(NPCascTable, "AOD", "NPCASCTABLE", NPCascadeTable::MatchingChi2, NPCascadeTable::DeltaPtITSCascade, + NPCascadeTable::DeltaPtCascade, NPCascadeTable::ITSClusSize, NPCascadeTable::HasReassociatedCluster, aod::collision::NumContrib, @@ -164,6 +167,7 @@ DECLARE_SOA_TABLE(NPCascTable, "AOD", "NPCASCTABLE", DECLARE_SOA_TABLE(NPCascTableNT, "AOD", "NPCASCTABLENT", NPCascadeTable::MatchingChi2, NPCascadeTable::DeltaPtITSCascade, + NPCascadeTable::DeltaPtCascade, NPCascadeTable::ITSClusSize, NPCascadeTable::HasReassociatedCluster, aod::collision::NumContrib, @@ -219,6 +223,7 @@ DECLARE_SOA_TABLE(NPCascTableNT, "AOD", "NPCASCTABLENT", DECLARE_SOA_TABLE(NPCascTableMC, "AOD", "NPCASCTABLEMC", NPCascadeTable::MatchingChi2, NPCascadeTable::DeltaPtITSCascade, + NPCascadeTable::DeltaPtCascade, NPCascadeTable::ITSClusSize, NPCascadeTable::HasReassociatedCluster, NPCascadeTable::IsGoodMatch, @@ -284,11 +289,13 @@ DECLARE_SOA_TABLE(NPCascTableMC, "AOD", "NPCASCTABLEMC", NPCascadeTable::DCAyMC, NPCascadeTable::DCAzMC, NPCascadeTable::MCcollisionMatch, + NPCascadeTable::HasFakeReassociation, NPCascadeTable::MotherDecayDaughters) DECLARE_SOA_TABLE(NPCascTableMCNT, "AOD", "NPCASCTABLEMCNT", NPCascadeTable::MatchingChi2, NPCascadeTable::DeltaPtITSCascade, + NPCascadeTable::DeltaPtCascade, NPCascadeTable::ITSClusSize, NPCascadeTable::HasReassociatedCluster, NPCascadeTable::IsGoodMatch, @@ -354,6 +361,7 @@ DECLARE_SOA_TABLE(NPCascTableMCNT, "AOD", "NPCASCTABLEMCNT", NPCascadeTable::DCAyMC, NPCascadeTable::DCAzMC, NPCascadeTable::MCcollisionMatch, + NPCascadeTable::HasFakeReassociation, NPCascadeTable::MotherDecayDaughters) DECLARE_SOA_TABLE(NPCascTableGen, "AOD", "NPCASCTABLEGen", diff --git a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx index 65f9f649afc..31711177d50 100644 --- a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx +++ b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx @@ -54,9 +54,11 @@ struct NPCascCandidate { int64_t trackITSID; int64_t collisionID; float matchingChi2; + float deltaPtITS; float deltaPt; float itsClusSize; bool hasReassociatedCluster; + bool hasFakeReassociation; bool isGoodMatch; bool isGoodCascade; int pdgCodeMom; @@ -389,6 +391,7 @@ struct NonPromptCascadeTask { if (v0part.mothersIds()[0] == bachelor.mcParticle().mothersIds()[0]) { if (std::abs(motherV0.pdgCode()) == 3312 || std::abs(motherV0.pdgCode()) == 3334) { isGoodCascade = true; + isOmega = (std::abs(motherV0.pdgCode()) == 3334); fromHF = isFromHF(motherV0); mcParticleID = v0part.mothersIds()[0]; @@ -413,8 +416,8 @@ struct NonPromptCascadeTask { o2::base::Propagator::Instance()->propagateToDCA(primaryVertex, pionTrkParCov, mBz, 2.f, matCorr, &pionDCA); o2::base::Propagator::Instance()->propagateToDCA(primaryVertex, bachTrkParCov, mBz, 2.f, matCorr, &bachDCA); - float deltaPtITSCascade{-1.e10f}, cascITSclsSize{-1.e10f}, matchingChi2{-1.e10f}; - bool hasReassociatedClusters{false}; + float deltaPtITSCascade{-1.e10f}, deltaPtCascade{-1.e10f}, cascITSclsSize{-1.e10f}, matchingChi2{-1.e10f}; + bool hasReassociatedClusters{false}, hasFakeReassociation{false}; int trackedCascGlobalIndex{-1}, itsTrackGlobalIndex{-1}, cascITSclusters{-1}; if constexpr (requires { candidate.track(); }) { const auto& track = candidate.template track_as(); @@ -424,6 +427,7 @@ struct NonPromptCascadeTask { hasReassociatedClusters = (track.itsNCls() != ITStrack.itsNCls()); cascadeLvector.SetCoordinates(track.pt(), track.eta(), track.phi(), 0); deltaPtITSCascade = std::hypot(cascadeMomentum[0], cascadeMomentum[1]) - ITStrack.pt(); + deltaPtCascade = std::hypot(cascadeMomentum[0], cascadeMomentum[1]) - track.pt(); trackedCascGlobalIndex = track.globalIndex(); itsTrackGlobalIndex = ITStrack.globalIndex(); cascITSclusters = track.itsNCls(); @@ -435,11 +439,12 @@ struct NonPromptCascadeTask { if (isGoodMatch) { pdgCodeMom = track.mcParticle().has_mothers() ? track.mcParticle().template mothers_as()[0].pdgCode() : 0; + hasFakeReassociation = track.mcMask() & (1 << 15); } itsTrackPDG = ITStrack.has_mcParticle() ? ITStrack.mcParticle().pdgCode() : 0; } } - candidates.emplace_back(NPCascCandidate{mcParticleID, trackedCascGlobalIndex, itsTrackGlobalIndex, candidate.collisionId(), matchingChi2, deltaPtITSCascade, cascITSclsSize, hasReassociatedClusters, isGoodMatch, isGoodCascade, pdgCodeMom, itsTrackPDG, fromHF[0], fromHF[1], + candidates.emplace_back(NPCascCandidate{mcParticleID, trackedCascGlobalIndex, itsTrackGlobalIndex, candidate.collisionId(), matchingChi2, deltaPtITSCascade, deltaPtCascade, cascITSclsSize, hasReassociatedClusters, hasFakeReassociation, isGoodMatch, isGoodCascade, pdgCodeMom, itsTrackPDG, fromHF[0], fromHF[1], collision.numContrib(), collision.collisionTimeRes(), primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ(), cascadeLvector.pt(), cascadeLvector.eta(), cascadeLvector.phi(), protonTrack.pt(), protonTrack.eta(), pionTrack.pt(), pionTrack.eta(), bachelor.pt(), bachelor.eta(), @@ -457,7 +462,7 @@ struct NonPromptCascadeTask { void fillDataTable(auto const& candidates) { for (const auto& c : candidates) { - getDataTable()(c.matchingChi2, c.deltaPt, c.itsClusSize, c.hasReassociatedCluster, + getDataTable()(c.matchingChi2, c.deltaPtITS, c.deltaPt, c.itsClusSize, c.hasReassociatedCluster, c.pvContributors, c.pvTimeResolution, c.pvX, c.pvY, c.pvZ, c.cascPt, c.cascEta, c.cascPhi, c.protonPt, c.protonEta, c.pionPt, c.pionEta, c.bachPt, c.bachEta, @@ -496,7 +501,7 @@ struct NonPromptCascadeTask { auto mcCollision = particle.template mcCollision_as(); auto recCollision = collisions.iteratorAt(c.collisionID); - getMCtable()(c.matchingChi2, c.deltaPt, c.itsClusSize, c.hasReassociatedCluster, c.isGoodMatch, c.isGoodCascade, c.pdgCodeMom, c.pdgCodeITStrack, c.isFromBeauty, c.isFromCharm, + getMCtable()(c.matchingChi2, c.deltaPtITS, c.deltaPt, c.itsClusSize, c.hasReassociatedCluster, c.isGoodMatch, c.isGoodCascade, c.pdgCodeMom, c.pdgCodeITStrack, c.isFromBeauty, c.isFromCharm, c.pvContributors, c.pvTimeResolution, c.pvX, c.pvY, c.pvZ, c.cascPt, c.cascEta, c.cascPhi, c.protonPt, c.protonEta, c.pionPt, c.pionEta, c.bachPt, c.bachEta, c.cascDCAxy, c.cascDCAz, c.protonDCAxy, c.protonDCAz, c.pionDCAxy, c.pionDCAz, c.bachDCAxy, c.bachDCAz, @@ -505,7 +510,7 @@ struct NonPromptCascadeTask { c.pionTPCNSigma, c.bachKaonTPCNSigma, c.bachPionTPCNSigma, c.protonHasTOF, c.pionHasTOF, c.bachHasTOF, c.protonTOFNSigma, c.pionTOFNSigma, c.bachKaonTOFNSigma, c.bachPionTOFNSigma, particle.pt(), particle.eta(), particle.phi(), particle.pdgCode(), mcCollision.posX() - particle.vx(), mcCollision.posY() - particle.vy(), - mcCollision.posZ() - particle.vz(), mcCollision.globalIndex() == recCollision.mcCollisionId(), motherDecayDaughters); + mcCollision.posZ() - particle.vz(), mcCollision.globalIndex() == recCollision.mcCollisionId(), c.hasFakeReassociation, motherDecayDaughters); } } From 9b3939221e13742dc4216897594c6698f344fd77 Mon Sep 17 00:00:00 2001 From: altsybee Date: Thu, 27 Mar 2025 17:38:12 +0100 Subject: [PATCH 0851/1650] [DPG] Update detectorOccupancyQa.cxx - more dEdx qa plots (#10678) --- DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx | 112 ++++++++++++++++++--- 1 file changed, 99 insertions(+), 13 deletions(-) diff --git a/DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx b/DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx index 2feefb4ac41..17482516003 100644 --- a/DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx +++ b/DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx @@ -144,19 +144,52 @@ struct DetectorOccupancyQaTask { histos.add("hNumUniqueBCInTimeWindow", ";n collisions;n events", kTH1D, {{201, -0.5, 200.5}}); + // track QA counters + histos.add("nTrackCounter_after_cuts_QA", "", kTH1D, {{12, -0.5, 11.5, "track QA"}}); + TAxis* axTrackCounters = reinterpret_cast(histos.get(HIST("nTrackCounter_after_cuts_QA"))->GetXaxis()); + axTrackCounters->SetBinLabel(1, "all"); + axTrackCounters->SetBinLabel(2, "PVcontrib"); + axTrackCounters->SetBinLabel(3, "ptCut"); + axTrackCounters->SetBinLabel(4, "etaCut"); + axTrackCounters->SetBinLabel(5, "itsNCls>=5"); + axTrackCounters->SetBinLabel(6, "isGlobal,nTPCcls>=70"); + axTrackCounters->SetBinLabel(7, "passedTPCRefit"); + axTrackCounters->SetBinLabel(8, "occupancy>=0"); + axTrackCounters->SetBinLabel(9, "fracton nClsNoPID (0,0.8)"); + axTrackCounters->SetBinLabel(10, "pos"); + axTrackCounters->SetBinLabel(11, "neg"); + // dE/dx - histos.add("dEdx_vs_Momentum", "dE/dx", kTH2F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, {800, 0.0, 800.0, "dE/dx (a. u.)"}}); - histos.add("dEdx_vs_Momentum_occupBelow200", "dE/dx", kTH2F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, {800, 0.0, 800.0, "dE/dx (a. u.)"}}); - histos.add("dEdx_vs_Momentum_occupBelow200_kNoCollStd", "dE/dx", kTH2F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, {800, 0.0, 800.0, "dE/dx (a. u.)"}}); - histos.add("dEdx_vs_Momentum_occupAbove4000", "dE/dx", kTH2F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, {800, 0.0, 800.0, "dE/dx (a. u.)"}}); + AxisSpec axisDeDx{800, 0.0, 800.0, "dE/dx (a. u.)"}; + histos.add("dEdx_vs_Momentum", "dE/dx", kTH2F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx}); + histos.add("dEdx_vs_Momentum_occupBelow200", "dE/dx", kTH2F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx}); + histos.add("dEdx_vs_Momentum_occupBelow200_kNoCollStd", "dE/dx", kTH2F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx}); + histos.add("dEdx_vs_Momentum_occupAbove4000", "dE/dx", kTH2F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx}); + histos.add("dEdx_vs_Momentum_NegativeFractionNclsPID", "dE/dx", kTH2F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx}); + histos.add("dEdx_vs_Momentum_HighFractionNclsNonPID", "dE/dx", kTH2F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx}); AxisSpec axisBinsOccupStudydEdx{{0., 500, 1000, 2000, 4000, 6000, 8000, 15000}, "p_{T}"}; - histos.add("dEdx_vs_Momentum_vs_occup", "dE/dx", kTH3F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, {800, 0.0, 800.0, "dE/dx (a. u.)"}, axisBinsOccupStudydEdx}); + histos.add("dEdx_vs_Momentum_vs_occup", "dE/dx", kTH3F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx, axisBinsOccupStudydEdx}); if (confFlagManyHeavyHistos) { - histos.add("dEdx_vs_Momentum_vs_occup_eta_02_04", "dE/dx", kTH3F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, {800, 0.0, 800.0, "dE/dx (a. u.)"}, axisBinsOccupStudydEdx}); - histos.add("dEdx_vs_Momentum_vs_occup_eta_04_02", "dE/dx", kTH3F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, {800, 0.0, 800.0, "dE/dx (a. u.)"}, axisBinsOccupStudydEdx}); + histos.add("dEdx_vs_Momentum_vs_occup_eta_02_04", "dE/dx", kTH3F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx, axisBinsOccupStudydEdx}); + histos.add("dEdx_vs_Momentum_vs_occup_eta_04_02", "dE/dx", kTH3F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx, axisBinsOccupStudydEdx}); } - histos.add("dEdx_vs_centr_vs_occup_narrow_p_win", "dE/dx", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, {60, 0, 15000, "occupancy"}, {800, 0.0, 800.0, "dE/dx (a. u.)"}}); + AxisSpec axisOccupancyForDeDxStudies{60, 0, 15000, "occupancy"}; + histos.add("dEdx_vs_centr_vs_occup_narrow_p_win", "dE/dx", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, axisOccupancyForDeDxStudies, axisDeDx}); + histos.add("dEdx_vs_centr_vs_occup_narrow_p_win_pos", "dE/dx", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, axisOccupancyForDeDxStudies, axisDeDx}); + histos.add("dEdx_vs_centr_vs_occup_narrow_p_win_neg", "dE/dx", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, axisOccupancyForDeDxStudies, axisDeDx}); + histos.add("dEdx_vs_centr_vs_occup_narrow_p_win_pos_FractionPIDclsInRange", "dE/dx", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, axisOccupancyForDeDxStudies, axisDeDx}); + histos.add("dEdx_vs_centr_vs_occup_narrow_p_win_neg_FractionPIDclsInRange", "dE/dx", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, axisOccupancyForDeDxStudies, axisDeDx}); + + AxisSpec axisFractionNclsFindableMinusPID{110, -1.1, 1.1, "TPC nClsFindableMinusPID / nClsFindable"}; + histos.add("fraction_tpcNClsFindableMinusPID_vs_occup", "", kTH2D, {axisOccupancyForDeDxStudies, axisFractionNclsFindableMinusPID}); + histos.add("fraction_tpcNClsFindableMinusPID_vs_occup_peripheralByV0A", "", kTH2D, {axisOccupancyForDeDxStudies, axisFractionNclsFindableMinusPID}); + histos.add("fraction_tpcNClsFindableMinusPID_vs_occup_centralByV0A", "", kTH2D, {axisOccupancyForDeDxStudies, axisFractionNclsFindableMinusPID}); + histos.add("fraction_tpcNClsFindableMinusPID_vs_occup_eta02", "", kTH2D, {axisOccupancyForDeDxStudies, axisFractionNclsFindableMinusPID}); + histos.add("fraction_tpcNClsFindableMinusPID_vs_occup_pos", "", kTH2D, {axisOccupancyForDeDxStudies, axisFractionNclsFindableMinusPID}); + histos.add("fraction_tpcNClsFindableMinusPID_vs_occup_neg", "", kTH2D, {axisOccupancyForDeDxStudies, axisFractionNclsFindableMinusPID}); + histos.add("fraction_tpcNClsFindableMinusPID_vs_occup_lowPt", "", kTH2D, {axisOccupancyForDeDxStudies, axisFractionNclsFindableMinusPID}); + histos.add("fraction_tpcNClsFindableMinusPID_vs_occup_highPt", "", kTH2D, {axisOccupancyForDeDxStudies, axisFractionNclsFindableMinusPID}); // ### kinematic distributions for events with high occupancy at specified dt ranges histos.add("track_distr_nITStrThisEv_10_200/hEventCount", ";delta-time bin id;n events", kTH1D, {{5, -0.5, 4.5}}); @@ -206,10 +239,10 @@ struct DetectorOccupancyQaTask { // 3D: pt vs centr vs occup if (confFlagManyHeavyHistos) { - histos.add("ptGlobal_vs_centr_vs_occup", "", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, {60, 0, 15000, "occupancy"}, axisLogPt}); - histos.add("ptPV_vs_centr_vs_occup", "", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, {60, 0, 15000, "occupancy"}, axisLogPt}); - histos.add("ptGlobal_vs_centr_vs_occup_NoCollStd", "", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, {60, 0, 15000, "occupancy"}, axisLogPt}); - histos.add("ptPV_vs_centr_vs_occup_NoCollStd", "", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, {60, 0, 15000, "occupancy"}, axisLogPt}); + histos.add("ptGlobal_vs_centr_vs_occup", "", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, axisOccupancyForDeDxStudies, axisLogPt}); + histos.add("ptPV_vs_centr_vs_occup", "", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, axisOccupancyForDeDxStudies, axisLogPt}); + histos.add("ptGlobal_vs_centr_vs_occup_NoCollStd", "", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, axisOccupancyForDeDxStudies, axisLogPt}); + histos.add("ptPV_vs_centr_vs_occup_NoCollStd", "", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, axisOccupancyForDeDxStudies, axisLogPt}); } } // 2D @@ -819,20 +852,28 @@ struct DetectorOccupancyQaTask { auto tracksGrouped = tracks.sliceBy(perCollision, col.globalIndex()); for (const auto& track : tracksGrouped) { + histos.fill(HIST("nTrackCounter_after_cuts_QA"), 0); if (!track.isPVContributor()) continue; + histos.fill(HIST("nTrackCounter_after_cuts_QA"), 1); if (track.pt() < confCutPtMinThisEvent || track.pt() > confCutPtMaxThisEvent) continue; + histos.fill(HIST("nTrackCounter_after_cuts_QA"), 2); if (track.eta() < confCutEtaMinTracksThisEvent || track.eta() > confCutEtaMaxTracksThisEvent) continue; + histos.fill(HIST("nTrackCounter_after_cuts_QA"), 3); if (track.itsNCls() < 5) continue; + histos.fill(HIST("nTrackCounter_after_cuts_QA"), 4); nPV++; if (track.isGlobalTrack() && track.tpcNClsFound() >= confCutMinTPCcls) { nGlobalTracks++; + histos.fill(HIST("nTrackCounter_after_cuts_QA"), 5); if (track.passedTPCRefit()) { + histos.fill(HIST("nTrackCounter_after_cuts_QA"), 6); + float signedP = track.sign() * track.tpcInnerParam(); histos.fill(HIST("dEdx_vs_Momentum"), signedP, track.tpcSignal()); if (occupancy >= 0 && occupancy < 200) { @@ -844,6 +885,8 @@ struct DetectorOccupancyQaTask { histos.fill(HIST("dEdx_vs_Momentum_occupAbove4000"), signedP, track.tpcSignal()); if (occupancy >= 0) { + histos.fill(HIST("nTrackCounter_after_cuts_QA"), 7); + histos.fill(HIST("dEdx_vs_Momentum_vs_occup"), signedP, track.tpcSignal(), occupancy); if (confFlagManyHeavyHistos) { @@ -852,9 +895,52 @@ struct DetectorOccupancyQaTask { if (track.eta() > -0.4 && track.eta() < -0.2) histos.fill(HIST("dEdx_vs_Momentum_vs_occup_eta_04_02"), signedP, track.tpcSignal(), occupancy); } + + // check ratio tpcNClsFindableMinusPID / tpcNClsFindable (https://github.com/AliceO2Group/AliceO2/blob/dev/Framework/Core/include/Framework/AnalysisDataModel.h#L242) + float fractionTPCcls = (1.0 * track.tpcNClsFindableMinusPID()) / track.tpcNClsFindable(); + histos.fill(HIST("fraction_tpcNClsFindableMinusPID_vs_occup"), occupancy, fractionTPCcls); + if (fractionTPCcls >= 0 && fractionTPCcls < 0.8) + histos.fill(HIST("nTrackCounter_after_cuts_QA"), 8); + if (fractionTPCcls < 0) + histos.fill(HIST("dEdx_vs_Momentum_HighFractionNclsNonPID"), signedP, track.tpcSignal()); + if (fractionTPCcls > 0.8) + histos.fill(HIST("dEdx_vs_Momentum_NegativeFractionNclsPID"), signedP, track.tpcSignal()); + + if (multV0A < 6800) + histos.fill(HIST("fraction_tpcNClsFindableMinusPID_vs_occup_peripheralByV0A"), occupancy, fractionTPCcls); + else if (multV0A > 82850) + histos.fill(HIST("fraction_tpcNClsFindableMinusPID_vs_occup_centralByV0A"), occupancy, fractionTPCcls); + + if (std::fabs(track.eta()) < 0.2) + histos.fill(HIST("fraction_tpcNClsFindableMinusPID_vs_occup_eta02"), occupancy, fractionTPCcls); + + // vs charge + if (signedP > 0) { + histos.fill(HIST("nTrackCounter_after_cuts_QA"), 9); + histos.fill(HIST("fraction_tpcNClsFindableMinusPID_vs_occup_pos"), occupancy, fractionTPCcls); + } else { + histos.fill(HIST("nTrackCounter_after_cuts_QA"), 10); + histos.fill(HIST("fraction_tpcNClsFindableMinusPID_vs_occup_neg"), occupancy, fractionTPCcls); + } + // vs pt + if (track.pt() > 0.2 && track.pt() < 0.8) + histos.fill(HIST("fraction_tpcNClsFindableMinusPID_vs_occup_lowPt"), occupancy, fractionTPCcls); + if (track.pt() > 0.8 && track.pt() < 10) + histos.fill(HIST("fraction_tpcNClsFindableMinusPID_vs_occup_highPt"), occupancy, fractionTPCcls); + // dE/dx in narrow mom bin vs centrality and occupancy - if (signedP > 0.38 && signedP < 0.4) + if (std::fabs(signedP) > 0.38 && std::fabs(signedP) < 0.4) histos.fill(HIST("dEdx_vs_centr_vs_occup_narrow_p_win"), nPV, occupancy, track.tpcSignal()); + // vs charge + if (signedP > 0.38 && signedP < 0.4) { + histos.fill(HIST("dEdx_vs_centr_vs_occup_narrow_p_win_pos"), nPV, occupancy, track.tpcSignal()); + if (fractionTPCcls >= 0 && fractionTPCcls < 0.8) + histos.fill(HIST("dEdx_vs_centr_vs_occup_narrow_p_win_pos_FractionPIDclsInRange"), nPV, occupancy, track.tpcSignal()); + } else if (signedP > -0.4 && signedP < -0.38) { + histos.fill(HIST("dEdx_vs_centr_vs_occup_narrow_p_win_neg"), nPV, occupancy, track.tpcSignal()); + if (fractionTPCcls >= 0 && fractionTPCcls < 0.8) + histos.fill(HIST("dEdx_vs_centr_vs_occup_narrow_p_win_neg_FractionPIDclsInRange"), nPV, occupancy, track.tpcSignal()); + } } } } From 5b0dc8494617ec1413d3a4e5cd55b4480c9a1fe0 Mon Sep 17 00:00:00 2001 From: ilikmeta <152337132+ilikmeta@users.noreply.github.com> Date: Thu, 27 Mar 2025 21:46:44 -0500 Subject: [PATCH 0852/1650] [PWGCF] Add parenthesis in event cuts. (#10682) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/flowGfwTask.cxx | 75 ++++++++++++++++---------------- 1 file changed, 38 insertions(+), 37 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowGfwTask.cxx b/PWGCF/Flow/Tasks/flowGfwTask.cxx index 4ba8c7c599c..e5854dcf43b 100644 --- a/PWGCF/Flow/Tasks/flowGfwTask.cxx +++ b/PWGCF/Flow/Tasks/flowGfwTask.cxx @@ -702,50 +702,51 @@ struct FlowGfwTask { return false; } registry.fill(HIST("hEventCount"), kISVERTEXITSTPC); - if (cfgNoCollInTimeRangeStandard) { - if (!collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { - // no collisions in specified time range - return false; - } - registry.fill(HIST("hEventCount"), kNOCOLLINTIMERANGESTANDART); + } + if (cfgNoCollInTimeRangeStandard) { + if (!collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + // no collisions in specified time range + return false; } - if (cfgEvSelkIsGoodITSLayersAll) { - if (cfgEvSelkIsGoodITSLayersAll && !collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { - // removes dead staves of ITS - return false; - } - registry.fill(HIST("hEventCount"), kISGOODITSLAYERSALL); + registry.fill(HIST("hEventCount"), kNOCOLLINTIMERANGESTANDART); + } + if (cfgEvSelkIsGoodITSLayersAll) { + if (cfgEvSelkIsGoodITSLayersAll && !collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + // removes dead staves of ITS + return false; } + registry.fill(HIST("hEventCount"), kISGOODITSLAYERSALL); + } - float vtxz = -999; - if (collision.numContrib() > 1) { - vtxz = collision.posZ(); - float zRes = std::sqrt(collision.covZZ()); - if (zRes > 0.25 && collision.numContrib() < 20) - vtxz = -999; - } + float vtxz = -999; + if (collision.numContrib() > 1) { + vtxz = collision.posZ(); + float zRes = std::sqrt(collision.covZZ()); + if (zRes > 0.25 && collision.numContrib() < 20) + vtxz = -999; + } - auto multNTracksPV = collision.multNTracksPV(); + auto multNTracksPV = collision.multNTracksPV(); - if (std::abs(vtxz) > cfgCutVertex) - return false; + if (std::abs(vtxz) > cfgCutVertex) + return false; - if (cfgMultCut) { - if (multNTracksPV < fMultPVCutLow->Eval(centrality)) - return false; - if (multNTracksPV > fMultPVCutHigh->Eval(centrality)) - return false; - if (multTrk < fMultCutLow->Eval(centrality)) - return false; - if (multTrk > fMultCutHigh->Eval(centrality)) - return false; - registry.fill(HIST("hEventCount"), kAFTERMULTCUTS); - } + if (cfgMultCut) { + if (multNTracksPV < fMultPVCutLow->Eval(centrality)) + return false; + if (multNTracksPV > fMultPVCutHigh->Eval(centrality)) + return false; + if (multTrk < fMultCutLow->Eval(centrality)) + return false; + if (multTrk > fMultCutHigh->Eval(centrality)) + return false; + registry.fill(HIST("hEventCount"), kAFTERMULTCUTS); + } - // V0A T0A 5 sigma cut - if (cfgV0AT0A5Sigma) - if (std::abs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > 5 * fT0AV0ASigma->Eval(collision.multFT0A())) - return false; + // V0A T0A 5 sigma cut + if (cfgV0AT0A5Sigma) { + if (std::abs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > 5 * fT0AV0ASigma->Eval(collision.multFT0A())) + return false; } return true; From b5b5ad14d8925903f7f26feb7d71eb547df224b5 Mon Sep 17 00:00:00 2001 From: Debadatta3337 Date: Fri, 28 Mar 2025 15:28:36 +0530 Subject: [PATCH 0853/1650] [PWGDQ] Update HistogramsLibrary.cxx (#10686) Co-authored-by: Debadatta3337 --- PWGDQ/Core/HistogramsLibrary.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 8d92572197e..7d5f1d6b5b4 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -946,6 +946,7 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h if (subGroupStr.Contains("mult")) { hm->AddHistogram(histClass, "Mass_Pt_MultFV0A", "", false, 200, 0.0, 5.0, VarManager::kMass, 40, 0.0, 40.0, VarManager::kPt, 100, 0.0, 25000.0, VarManager::kMultFV0A); hm->AddHistogram(histClass, "Mass_VtxNcontribReal", "Mass vs VtxNcontribReal", false, 200, 0.0, 5.0, VarManager::kMass, 200, 0, 200.0, VarManager::kVtxNcontribReal); + hm->AddHistogram(histClass, "VtxZ_VtxNcontribReal", "VtxZ vs VtxNcontribReal", false, 240, -12.0, 12.0, VarManager::kVtxZ, 200, 0, 200.0, VarManager::kVtxNcontribReal); } if (subGroupStr.Contains("polarization")) { hm->AddHistogram(histClass, "cosThetaHE", "", false, 100, -1., 1., VarManager::kCosThetaHE); From 3153c677acb2d1bbe3aff2ff4115ae7641ceec03 Mon Sep 17 00:00:00 2001 From: altsybee Date: Fri, 28 Mar 2025 11:06:11 +0100 Subject: [PATCH 0854/1650] [DPG] Update detectorOccupancyQa.cxx - fix PID column bug on the fly (#10683) --- DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx | 39 ++++++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx b/DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx index 17482516003..3f4f4f410c1 100644 --- a/DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx +++ b/DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx @@ -191,6 +191,19 @@ struct DetectorOccupancyQaTask { histos.add("fraction_tpcNClsFindableMinusPID_vs_occup_lowPt", "", kTH2D, {axisOccupancyForDeDxStudies, axisFractionNclsFindableMinusPID}); histos.add("fraction_tpcNClsFindableMinusPID_vs_occup_highPt", "", kTH2D, {axisOccupancyForDeDxStudies, axisFractionNclsFindableMinusPID}); + // more QA for TPC cls counting + histos.add("tpcNClsFindable", "", kTH1D, {{601, -300.5, 300.5}}); + histos.add("tpcNClsFindableMinusFound", "", kTH1D, {{601, -300.5, 300.5}}); + histos.add("tpcNClsFindableMinusCrossedRows", "", kTH1D, {{601, -300.5, 300.5}}); + histos.add("tpcNClsShared", "", kTH1D, {{601, -300.5, 300.5}}); + histos.add("tpcNClsFindableMinusPID", "", kTH1D, {{601, -300.5, 300.5}}); + histos.add("tpcNClsFindableMinusPID_CORRECTED", "", kTH1D, {{601, -300.5, 300.5}}); + histos.add("tpcNClUsedForPID", "", kTH1D, {{601, -300.5, 300.5}}); + + histos.add("tpcNClsUsedForPID_vs_Findable", ";tpcNClsFindable;tpcNClUsedForPID", kTH2D, {{601, -300.5, 300.5}, {601, -300.5, 300.5}}); + histos.add("tpcNClsShared_vs_Findable", ";tpcNClsFindable;tpcNClsShared", kTH2D, {{601, -300.5, 300.5}, {601, -300.5, 300.5}}); + histos.add("tpcNClsUsedForPID_vs_Shared", ";tpcNClsShared;tpcNClUsedForPID", kTH2D, {{601, -300.5, 300.5}, {601, -300.5, 300.5}}); + // ### kinematic distributions for events with high occupancy at specified dt ranges histos.add("track_distr_nITStrThisEv_10_200/hEventCount", ";delta-time bin id;n events", kTH1D, {{5, -0.5, 4.5}}); histos.add("track_distr_nITStrThisEv_above_2000/hEventCount", ";delta-time bin id;n events", kTH1D, {{5, -0.5, 4.5}}); @@ -895,9 +908,29 @@ struct DetectorOccupancyQaTask { if (track.eta() > -0.4 && track.eta() < -0.2) histos.fill(HIST("dEdx_vs_Momentum_vs_occup_eta_04_02"), signedP, track.tpcSignal(), occupancy); } - - // check ratio tpcNClsFindableMinusPID / tpcNClsFindable (https://github.com/AliceO2Group/AliceO2/blob/dev/Framework/Core/include/Framework/AnalysisDataModel.h#L242) - float fractionTPCcls = (1.0 * track.tpcNClsFindableMinusPID()) / track.tpcNClsFindable(); + // more QA for TPC cls counting + histos.fill(HIST("tpcNClsFindable"), track.tpcNClsFindable()); + histos.fill(HIST("tpcNClsFindableMinusFound"), track.tpcNClsFindableMinusFound()); + histos.fill(HIST("tpcNClsFindableMinusCrossedRows"), track.tpcNClsFindableMinusCrossedRows()); + histos.fill(HIST("tpcNClsShared"), track.tpcNClsShared()); + histos.fill(HIST("tpcNClsFindableMinusPID"), track.tpcNClsFindableMinusPID()); + int tpcNClUsedForPID = track.tpcNClsFindable() - track.tpcNClsFindableMinusPID(); + histos.fill(HIST("tpcNClUsedForPID"), tpcNClUsedForPID); + + histos.fill(HIST("tpcNClsUsedForPID_vs_Findable"), track.tpcNClsFindable(), tpcNClUsedForPID); + histos.fill(HIST("tpcNClsShared_vs_Findable"), track.tpcNClsFindable(), track.tpcNClsShared()); + histos.fill(HIST("tpcNClsUsedForPID_vs_Shared"), tpcNClUsedForPID, track.tpcNClsShared()); + + int tpcNClsCorrectedFindableMinusPID = track.tpcNClsFindableMinusPID(); + // correct for a buggy behaviour due to int8 and uint8 difference: + if (tpcNClsCorrectedFindableMinusPID < -70) + tpcNClsCorrectedFindableMinusPID += 256; + histos.fill(HIST("tpcNClsFindableMinusPID_CORRECTED"), tpcNClsCorrectedFindableMinusPID); + + // check ratio tpcNClsFindableMinusPID / tpcNClsFindable + // https://github.com/AliceO2Group/AliceO2/blob/dev/Framework/Core/include/Framework/AnalysisDataModel.h#L242) + // https://github.com/AliceO2Group/AliceO2/blob/dev/Detectors/AOD/src/AODProducerWorkflowSpec.cxx#L2553C21-L2553C44 + float fractionTPCcls = (1.0 * tpcNClsCorrectedFindableMinusPID) / track.tpcNClsFindable(); histos.fill(HIST("fraction_tpcNClsFindableMinusPID_vs_occup"), occupancy, fractionTPCcls); if (fractionTPCcls >= 0 && fractionTPCcls < 0.8) histos.fill(HIST("nTrackCounter_after_cuts_QA"), 8); From 89a8c9a2bc183e79db45e19531f5a08d503bfd30 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Fri, 28 Mar 2025 23:42:22 +0900 Subject: [PATCH 0855/1650] [Common] fix to #10618 (#10688) --- Common/DataModel/PropagatedFwdTrackTables.h | 22 +++++++++++--------- Common/TableProducer/fwdtrackPropagation.cxx | 14 ++++++------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/Common/DataModel/PropagatedFwdTrackTables.h b/Common/DataModel/PropagatedFwdTrackTables.h index 482ce065891..ab0b20b76cf 100644 --- a/Common/DataModel/PropagatedFwdTrackTables.h +++ b/Common/DataModel/PropagatedFwdTrackTables.h @@ -19,19 +19,21 @@ #define COMMON_DATAMODEL_PROPAGATEDFWDTRACKTABLES_H_ #include "Framework/AnalysisDataModel.h" +#include "TrackSelectionTables.h" namespace o2::aod { namespace propfwdtrack { -DECLARE_SOA_INDEX_COLUMN(FwdTrack, fwdtrack); //! FwdTrack index -DECLARE_SOA_COLUMN(CXXatDCA, cXXatDCA, float); //! DCAx resolution squared at DCA -DECLARE_SOA_COLUMN(CYYatDCA, cYYatDCA, float); //! DCAy resolution squared at DCA -DECLARE_SOA_COLUMN(CXYatDCA, cXYatDCA, float); //! correlation term of DCAx,y resolution at DCA -DECLARE_SOA_COLUMN(EtaMatchedMCHMID, etaMatchedMCHMID, float); //! eta of MCH-MID track in MFT-MCH-MID track at PV -DECLARE_SOA_COLUMN(PhiMatchedMCHMID, phiMatchedMCHMID, float); //! phi of MCH-MID track in MFT-MCH-MID track at PV -DECLARE_SOA_COLUMN(IsAssociatedToMPC, isAssociatedToMPC, bool); //! is assigned to the most probable collision (relevant to TTCA) -DECLARE_SOA_COLUMN(IsAmbiguous, isAmbiguous, bool); //! is ambiguous (relevant to TTCA) +DECLARE_SOA_INDEX_COLUMN(FwdTrack, fwdtrack); //! FwdTrack index +DECLARE_SOA_INDEX_COLUMN_FULL(MCHTrack, matchMCHTrack, int, FwdTracks, "_MatchMCHTrack"); //! Index of matched MCH track for GlobalMuonTracks and GlobalForwardTracks +DECLARE_SOA_COLUMN(CXXatDCA, cXXatDCA, float); //! DCAx resolution squared at DCA +DECLARE_SOA_COLUMN(CYYatDCA, cYYatDCA, float); //! DCAy resolution squared at DCA +DECLARE_SOA_COLUMN(CXYatDCA, cXYatDCA, float); //! correlation term of DCAx,y resolution at DCA +DECLARE_SOA_COLUMN(EtaMatchedMCHMID, etaMatchedMCHMID, float); //! eta of MCH-MID track in MFT-MCH-MID track at PV +DECLARE_SOA_COLUMN(PhiMatchedMCHMID, phiMatchedMCHMID, float); //! phi of MCH-MID track in MFT-MCH-MID track at PV +DECLARE_SOA_COLUMN(IsAssociatedToMPC, isAssociatedToMPC, bool); //! is assigned to the most probable collision (relevant to TTCA) +DECLARE_SOA_COLUMN(IsAmbiguous, isAmbiguous, bool); //! is ambiguous (relevant to TTCA) } // namespace propfwdtrack DECLARE_SOA_TABLE_FULL(StoredPropagatedFwdTracks, "PropagatedFwdTracks", "AOD", "PROPFWDTRACK", @@ -43,9 +45,9 @@ DECLARE_SOA_TABLE_FULL(StoredPropagatedFwdTracks, "PropagatedFwdTracks", "AOD", fwdtrack::Pz, fwdtrack::Sign, fwdtrack::Chi2, fwdtrack::Chi2MatchMCHMID, fwdtrack::Chi2MatchMCHMFT, - fwdtrack::MatchScoreMCHMFT, propfwdtrack::FwdTrackId, fwdtrack::MFTTrackId, fwdtrack::MCHTrackId, + fwdtrack::MatchScoreMCHMFT, propfwdtrack::FwdTrackId, fwdtrack::MFTTrackId, propfwdtrack::MCHTrackId, fwdtrack::MCHBitMap, fwdtrack::MIDBitMap, fwdtrack::MIDBoards, - fwdtrack::TrackTime, fwdtrack::TrackTimeRes, + fwdtrack::TrackTime, fwdtrack::TrackTimeRes, fwdtrack::FwdDcaX, fwdtrack::FwdDcaY, propfwdtrack::CXXatDCA, propfwdtrack::CYYatDCA, propfwdtrack::CXYatDCA, propfwdtrack::EtaMatchedMCHMID, propfwdtrack::PhiMatchedMCHMID, propfwdtrack::IsAssociatedToMPC, propfwdtrack::IsAmbiguous, o2::soa::Marker<1>); diff --git a/Common/TableProducer/fwdtrackPropagation.cxx b/Common/TableProducer/fwdtrackPropagation.cxx index 3868a29c365..f08304c789d 100644 --- a/Common/TableProducer/fwdtrackPropagation.cxx +++ b/Common/TableProducer/fwdtrackPropagation.cxx @@ -75,8 +75,8 @@ struct FwdTrackPropagation { void init(o2::framework::InitContext&) { - if (doprocessWithoutTTCA && doprocessWithTTCA) { - LOGF(fatal, "Cannot enable doprocessWithoutTTCA and doprocessWithTTCA at the same time. Please choose one."); + if (doprocessWithoutFTTCA && doprocessWithFTTCA) { + LOGF(fatal, "Cannot enable doprocessWithoutFTTCA and doprocessWithFTTCA at the same time. Please choose one."); } ccdb->setURL(ccdburl); @@ -302,7 +302,7 @@ struct FwdTrackPropagation { fwdtrack.sign() / pt, fwdtrack.nClusters(), pDCA, rAtAbsorberEnd, fwdtrack.chi2(), fwdtrack.chi2MatchMCHMID(), fwdtrack.chi2MatchMCHMFT(), fwdtrack.matchScoreMCHMFT(), fwdtrack.globalIndex(), fwdtrack.matchMFTTrackId(), fwdtrack.matchMCHTrackId(), - fwdtrack.mchBitMap(), fwdtrack.midBitMap(), fwdtrack.midBoards(), fwdtrack.trackTime(), fwdtrack.trackTimeRes(), + fwdtrack.mchBitMap(), fwdtrack.midBitMap(), fwdtrack.midBoards(), fwdtrack.trackTime(), fwdtrack.trackTimeRes(), dcaX, dcaY, cXXatDCA, cYYatDCA, cXYatDCA, etaMatchedMCHMID, phiMatchedMCHMID, isAssociatedToMPC, isAmbiguous); propfwdtrackscov( @@ -367,7 +367,7 @@ struct FwdTrackPropagation { Preslice fwdtrackIndicesPerCollision = aod::track_association::collisionId; PresliceUnsorted fwdtrackIndicesPerFwdTrack = aod::track_association::fwdtrackId; - void processWithoutTTCA(aod::Collisions const& collisions, MyFwdTracks const& fwdtracks, aod::MFTTracks const& mfttracks, aod::BCsWithTimestamps const&) + void processWithoutFTTCA(aod::Collisions const& collisions, MyFwdTracks const& fwdtracks, aod::MFTTracks const& mfttracks, aod::BCsWithTimestamps const&) { for (const auto& collision : collisions) { const auto& bc = collision.template bc_as(); @@ -382,9 +382,9 @@ struct FwdTrackPropagation { } // end of fwdtrack loop } // end of collision loop } - PROCESS_SWITCH(FwdTrackPropagation, processWithoutTTCA, "process without TTCA", true); + PROCESS_SWITCH(FwdTrackPropagation, processWithoutFTTCA, "process without FTTCA", true); - void processWithTTCA(aod::Collisions const& collisions, MyFwdTracks const& fwdtracks, aod::MFTTracks const& mfttracks, aod::BCsWithTimestamps const&, aod::FwdTrackAssoc const& fwdtrackIndices) + void processWithFTTCA(aod::Collisions const& collisions, MyFwdTracks const& fwdtracks, aod::MFTTracks const& mfttracks, aod::BCsWithTimestamps const&, aod::FwdTrackAssoc const& fwdtrackIndices) { std::unordered_map mapAmb; // fwdtrack.globalIndex() -> bool isAmb; for (const auto& fwdtrack : fwdtracks) { @@ -408,7 +408,7 @@ struct FwdTrackPropagation { } // end of collision loop mapAmb.clear(); } - PROCESS_SWITCH(FwdTrackPropagation, processWithTTCA, "process with TTCA", false); + PROCESS_SWITCH(FwdTrackPropagation, processWithFTTCA, "process with FTTCA", false); }; // Extends the PropagatedFwdTracks table for expression columns From b2e1c0bb8992f6255bc78279efd2396b81fa55fd Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Fri, 28 Mar 2025 16:22:39 +0100 Subject: [PATCH 0856/1650] [PWGLF] Add DCA of non-tracked cascades (#10692) --- PWGLF/Tasks/Strangeness/nonPromptCascade.cxx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx index 31711177d50..566829a4b85 100644 --- a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx +++ b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx @@ -337,13 +337,15 @@ struct NonPromptCascadeTask { o2::math_utils::SVector cascadePos, v0Pos; float cascCpa = -1, v0Cpa = -1; + o2::track::TrackParCov ntCascadeTrack; if (mDCAFitter.process(pionTrkParCov, protonTrkParCov)) { auto trackParCovV0 = mDCAFitter.createParentTrackParCov(0); // V0 track retrieved from p and pi daughters v0Pos = mDCAFitter.getPCACandidate(); if (mDCAFitter.process(trackParCovV0, bachTrkParCov)) { mDCAFitter.getTrackParamAtPCA(0).getPxPyPzGlo(momenta[0]); mDCAFitter.getTrackParamAtPCA(1).getPxPyPzGlo(momenta[1]); - mDCAFitter.createParentTrackParCov().getPxPyPzGlo(cascadeMomentum); + ntCascadeTrack = mDCAFitter.createParentTrackParCov(); + ntCascadeTrack.getPxPyPzGlo(cascadeMomentum); std::array pvPos = {primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ()}; cascadePos = mDCAFitter.getPCACandidate(); cascCpa = RecoDecay::cpa(pvPos, mDCAFitter.getPCACandidate(), cascadeMomentum); @@ -443,6 +445,8 @@ struct NonPromptCascadeTask { } itsTrackPDG = ITStrack.has_mcParticle() ? ITStrack.mcParticle().pdgCode() : 0; } + } else { + o2::base::Propagator::Instance()->propagateToDCA(primaryVertex, ntCascadeTrack, mBz, 2.f, matCorr, &motherDCA); } candidates.emplace_back(NPCascCandidate{mcParticleID, trackedCascGlobalIndex, itsTrackGlobalIndex, candidate.collisionId(), matchingChi2, deltaPtITSCascade, deltaPtCascade, cascITSclsSize, hasReassociatedClusters, hasFakeReassociation, isGoodMatch, isGoodCascade, pdgCodeMom, itsTrackPDG, fromHF[0], fromHF[1], collision.numContrib(), collision.collisionTimeRes(), primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ(), From 94d0e75a3b6eda1f1f88fcf42a894fedfe916937 Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Fri, 28 Mar 2025 16:35:40 +0100 Subject: [PATCH 0857/1650] [Common] Always initialize listCalib as it is serialized unconditionally (#10689) --- Common/TableProducer/centralityTable.cxx | 2 +- Common/TableProducer/multiplicityTable.cxx | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Common/TableProducer/centralityTable.cxx b/Common/TableProducer/centralityTable.cxx index a88944171f9..48f1598afc5 100644 --- a/Common/TableProducer/centralityTable.cxx +++ b/Common/TableProducer/centralityTable.cxx @@ -238,6 +238,7 @@ struct CentralityTable { ccdb->setLocalObjectValidityChecking(); ccdb->setFatalWhenNull(false); mRunNumber = 0; + listCalib.setObject(new TList); if (!produceHistograms.value) { return; } @@ -259,7 +260,6 @@ struct CentralityTable { histos.addClone("FT0A/", "sel8FT0A/"); histos.print(); - listCalib.setObject(new TList); } using BCsWithTimestampsAndRun2Infos = soa::Join; diff --git a/Common/TableProducer/multiplicityTable.cxx b/Common/TableProducer/multiplicityTable.cxx index e65348ecbf7..6deb146daab 100644 --- a/Common/TableProducer/multiplicityTable.cxx +++ b/Common/TableProducer/multiplicityTable.cxx @@ -227,6 +227,7 @@ struct MultiplicityTable { ccdb->setLocalObjectValidityChecking(); ccdb->setFatalWhenNull(false); // don't fatal, please - exception is caught explicitly (as it should) + listCalib.setObject(new TList); if (!produceHistograms.value) { return; } @@ -234,8 +235,6 @@ struct MultiplicityTable { histos.add("FT0C", "FT0C vs FT0C eq.", HistType::kTH2D, {{1000, 0, 1000, "FT0C multiplicity"}, {1000, 0, 1000, "FT0C multiplicity eq."}}); histos.add("FT0CMultvsPV", "FT0C vs mult.", HistType::kTH2D, {{1000, 0, 1000, "FT0C mult."}, {100, 0, 100, "PV mult."}}); histos.add("FT0AMultvsPV", "FT0A vs mult.", HistType::kTH2D, {{1000, 0, 1000, "FT0A mult."}, {100, 0, 100, "PV mult."}}); - - listCalib.setObject(new TList); } /// Dummy process function for BCs, needed in case both Run2 and Run3 process functions are disabled From a6a72e87f1b7fd605cfc4c9670bf6f9435d061dc Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Sat, 29 Mar 2025 03:17:31 +0900 Subject: [PATCH 0858/1650] [PWGEM/Dilepton] update derived data of muons (#10695) --- PWGEM/Dilepton/Core/Dilepton.h | 8 +- PWGEM/Dilepton/Core/DileptonMC.h | 8 +- PWGEM/Dilepton/Core/DimuonCut.cxx | 2 +- PWGEM/Dilepton/Core/SingleTrackQC.h | 39 +- PWGEM/Dilepton/Core/SingleTrackQCMC.h | 33 +- PWGEM/Dilepton/DataModel/dileptonTables.h | 26 +- .../TableProducer/skimmerPrimaryMuon.cxx | 732 +++--------------- PWGEM/Dilepton/Utils/EMTrackUtilities.h | 4 +- 8 files changed, 180 insertions(+), 672 deletions(-) diff --git a/PWGEM/Dilepton/Core/Dilepton.h b/PWGEM/Dilepton/Core/Dilepton.h index 4bc4172bfb4..9508029a148 100644 --- a/PWGEM/Dilepton/Core/Dilepton.h +++ b/PWGEM/Dilepton/Core/Dilepton.h @@ -261,7 +261,7 @@ struct Dilepton { Configurable cfg_min_dphi{"cfg_min_dphi", 0.02, "min dphi between 2 muons (elliptic cut)"}; Configurable cfg_track_type{"cfg_track_type", 3, "muon track type [0: MFT-MCH-MID, 3: MCH-MID]"}; - Configurable cfg_min_pt_track{"cfg_min_pt_track", 0.1, "min pT for single track"}; + Configurable cfg_min_pt_track{"cfg_min_pt_track", 0.2, "min pT for single track"}; Configurable cfg_max_pt_track{"cfg_max_pt_track", 1e+10, "max pT for single track"}; Configurable cfg_min_eta_track{"cfg_min_eta_track", -4.0, "min eta for single track"}; Configurable cfg_max_eta_track{"cfg_max_eta_track", -2.5, "max eta for single track"}; @@ -269,8 +269,8 @@ struct Dilepton { Configurable cfg_max_phi_track{"cfg_max_phi_track", 6.3, "max phi for single track"}; Configurable cfg_min_ncluster_mft{"cfg_min_ncluster_mft", 5, "min ncluster MFT"}; Configurable cfg_min_ncluster_mch{"cfg_min_ncluster_mch", 5, "min ncluster MCH"}; - Configurable cfg_max_chi2{"cfg_max_chi2", 1e+10, "max chi2"}; - Configurable cfg_max_matching_chi2_mftmch{"cfg_max_matching_chi2_mftmch", 1e+10, "max chi2 for MFT-MCH matching"}; + Configurable cfg_max_chi2{"cfg_max_chi2", 1e+6, "max chi2"}; + Configurable cfg_max_matching_chi2_mftmch{"cfg_max_matching_chi2_mftmch", 40, "max chi2 for MFT-MCH matching"}; Configurable cfg_max_matching_chi2_mchmid{"cfg_max_matching_chi2_mchmid", 1e+10, "max chi2 for MCH-MID matching"}; Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 1e+10, "max dca XY for single track in cm"}; Configurable cfg_min_rabs{"cfg_min_rabs", 17.6, "min Radius at the absorber end"}; @@ -1129,7 +1129,7 @@ struct Dilepton { Partition negative_electrons = o2::aod::emprimaryelectron::sign < int8_t(0); Preslice perCollision_muon = aod::emprimarymuon::emeventId; - Filter trackFilter_muon = o2::aod::fwdtrack::trackType == dimuoncuts.cfg_track_type && dimuoncuts.cfg_min_pt_track < o2::aod::fwdtrack::pt && dimuoncuts.cfg_min_eta_track < o2::aod::fwdtrack::eta && o2::aod::fwdtrack::eta < dimuoncuts.cfg_max_eta_track && dimuoncuts.cfg_min_phi_track < o2::aod::fwdtrack::phi && o2::aod::fwdtrack::phi < dimuoncuts.cfg_max_phi_track; + Filter trackFilter_muon = o2::aod::fwdtrack::trackType == static_cast(dimuoncuts.cfg_track_type) && dimuoncuts.cfg_min_pt_track < o2::aod::fwdtrack::pt && dimuoncuts.cfg_min_eta_track < o2::aod::fwdtrack::eta && o2::aod::fwdtrack::eta < dimuoncuts.cfg_max_eta_track && dimuoncuts.cfg_min_phi_track < o2::aod::fwdtrack::phi && o2::aod::fwdtrack::phi < dimuoncuts.cfg_max_phi_track; Filter ttcaFilter_muon = ifnode(dimuoncuts.enableTTCA.node(), o2::aod::emprimarymuon::isAssociatedToMPC == true || o2::aod::emprimarymuon::isAssociatedToMPC == false, o2::aod::emprimarymuon::isAssociatedToMPC == true); Partition positive_muons = o2::aod::emprimarymuon::sign > int8_t(0); Partition negative_muons = o2::aod::emprimarymuon::sign < int8_t(0); diff --git a/PWGEM/Dilepton/Core/DileptonMC.h b/PWGEM/Dilepton/Core/DileptonMC.h index f6600ed92c8..994f426adbf 100644 --- a/PWGEM/Dilepton/Core/DileptonMC.h +++ b/PWGEM/Dilepton/Core/DileptonMC.h @@ -253,7 +253,7 @@ struct DileptonMC { Configurable cfg_min_dphi{"cfg_min_dphi", 0.02, "min dphi between 2 muons (elliptic cut)"}; Configurable cfg_track_type{"cfg_track_type", 3, "muon track type [0: MFT-MCH-MID, 3: MCH-MID]"}; - Configurable cfg_min_pt_track{"cfg_min_pt_track", 0.1, "min pT for single track"}; + Configurable cfg_min_pt_track{"cfg_min_pt_track", 0.2, "min pT for single track"}; Configurable cfg_max_pt_track{"cfg_max_pt_track", 1e+10, "max pT for single track"}; Configurable cfg_min_eta_track{"cfg_min_eta_track", -4.0, "min eta for single track"}; Configurable cfg_max_eta_track{"cfg_max_eta_track", -2.5, "max eta for single track"}; @@ -261,8 +261,8 @@ struct DileptonMC { Configurable cfg_max_phi_track{"cfg_max_phi_track", 6.3, "max phi for single track"}; Configurable cfg_min_ncluster_mft{"cfg_min_ncluster_mft", 5, "min ncluster MFT"}; Configurable cfg_min_ncluster_mch{"cfg_min_ncluster_mch", 5, "min ncluster MCH"}; - Configurable cfg_max_chi2{"cfg_max_chi2", 1e+10, "max chi2"}; - Configurable cfg_max_matching_chi2_mftmch{"cfg_max_matching_chi2_mftmch", 1e+10, "max chi2 for MFT-MCH matching"}; + Configurable cfg_max_chi2{"cfg_max_chi2", 1e+6, "max chi2"}; + Configurable cfg_max_matching_chi2_mftmch{"cfg_max_matching_chi2_mftmch", 40, "max chi2 for MFT-MCH matching"}; Configurable cfg_max_matching_chi2_mchmid{"cfg_max_matching_chi2_mchmid", 1e+10, "max chi2 for MCH-MID matching"}; Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 1e+10, "max dca XY for single track in cm"}; Configurable cfg_min_rabs{"cfg_min_rabs", 17.6, "min Radius at the absorber end"}; @@ -1199,7 +1199,7 @@ struct DileptonMC { o2::aod::emprimaryelectron::pfb >= static_cast(0)); Preslice perCollision_muon = aod::emprimarymuon::emeventId; - Filter trackFilter_muon = o2::aod::fwdtrack::trackType == dimuoncuts.cfg_track_type && dimuoncuts.cfg_min_phi_track < o2::aod::fwdtrack::phi && o2::aod::fwdtrack::phi < dimuoncuts.cfg_max_phi_track; + Filter trackFilter_muon = o2::aod::fwdtrack::trackType == static_cast(dimuoncuts.cfg_track_type) && dimuoncuts.cfg_min_phi_track < o2::aod::fwdtrack::phi && o2::aod::fwdtrack::phi < dimuoncuts.cfg_max_phi_track; Filter ttcaFilter_muon = ifnode(dimuoncuts.enableTTCA.node(), o2::aod::emprimarymuon::isAssociatedToMPC == true || o2::aod::emprimarymuon::isAssociatedToMPC == false, o2::aod::emprimarymuon::isAssociatedToMPC == true); Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); diff --git a/PWGEM/Dilepton/Core/DimuonCut.cxx b/PWGEM/Dilepton/Core/DimuonCut.cxx index ec101afa855..ee18a8e4232 100644 --- a/PWGEM/Dilepton/Core/DimuonCut.cxx +++ b/PWGEM/Dilepton/Core/DimuonCut.cxx @@ -34,7 +34,7 @@ void DimuonCut::SetPairYRange(float minY, float maxY) { mMinPairY = minY; mMaxPairY = maxY; - LOG(info) << "Dimuon Cut, set pair eta range: " << mMinPairY << " - " << mMaxPairY; + LOG(info) << "Dimuon Cut, set pair rapidity range: " << mMinPairY << " - " << mMaxPairY; } void DimuonCut::SetPairDCAxyRange(float min, float max) { diff --git a/PWGEM/Dilepton/Core/SingleTrackQC.h b/PWGEM/Dilepton/Core/SingleTrackQC.h index a6943a656e0..b13b7593fa6 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQC.h @@ -179,15 +179,15 @@ struct SingleTrackQC { std::string prefix = "dimuoncut_group"; Configurable cfg_track_type{"cfg_track_type", 3, "muon track type [0: MFT-MCH-MID, 3: MCH-MID]"}; - Configurable cfg_min_pt_track{"cfg_min_pt_track", 0.1, "min pT for single track"}; + Configurable cfg_min_pt_track{"cfg_min_pt_track", 0.2, "min pT for single track"}; Configurable cfg_min_eta_track{"cfg_min_eta_track", -4.0, "min eta for single track"}; Configurable cfg_max_eta_track{"cfg_max_eta_track", -2.5, "max eta for single track"}; Configurable cfg_min_phi_track{"cfg_min_phi_track", 0.f, "max phi for single track"}; Configurable cfg_max_phi_track{"cfg_max_phi_track", 6.3, "max phi for single track"}; Configurable cfg_min_ncluster_mft{"cfg_min_ncluster_mft", 5, "min ncluster MFT"}; Configurable cfg_min_ncluster_mch{"cfg_min_ncluster_mch", 5, "min ncluster MCH"}; - Configurable cfg_max_chi2{"cfg_max_chi2", 1e+10, "max chi2"}; - Configurable cfg_max_matching_chi2_mftmch{"cfg_max_matching_chi2_mftmch", 1e+10, "max chi2 for MFT-MCH matching"}; + Configurable cfg_max_chi2{"cfg_max_chi2", 1e+6, "max chi2"}; + Configurable cfg_max_matching_chi2_mftmch{"cfg_max_matching_chi2_mftmch", 40, "max chi2 for MFT-MCH matching"}; Configurable cfg_max_matching_chi2_mchmid{"cfg_max_matching_chi2_mchmid", 1e+10, "max chi2 for MCH-MID matching"}; Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 1e+10, "max dca XY for single track in cm"}; Configurable cfg_min_rabs{"cfg_min_rabs", 17.6, "min Radius at the absorber end"}; @@ -265,21 +265,22 @@ struct SingleTrackQC { fRegistry.addClone("Track/positive/", "Track/negative/"); } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { const AxisSpec axis_pt{ConfPtlBins, "p_{T,#mu} (GeV/c)"}; - const AxisSpec axis_eta{25, -4.5, -2.0, "#eta_{#mu}"}; - const AxisSpec axis_phi{36, 0.0, 2 * M_PI, "#varphi_{#mu} (rad.)"}; + const AxisSpec axis_eta{40, -5, -1, "#eta_{#mu}"}; + const AxisSpec axis_phi{90, 0, 2 * M_PI, "#varphi_{#mu} (rad.)"}; const AxisSpec axis_dca{ConfDCABins, "DCA_{#mu}^{XY} (#sigma)"}; // track info fRegistry.add("Track/positive/hs", "rec. single muon", kTHnSparseD, {axis_pt, axis_eta, axis_phi, axis_dca}, true); + fRegistry.add("Track/positive/hEtaPhi_MatchMCHMID", "#eta vs. #varphi of matched MCHMID", kTH2F, {axis_phi, axis_eta}, false); fRegistry.add("Track/positive/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{400, -20, 20}}, false); fRegistry.add("Track/positive/hTrackType", "track type", kTH1F, {{6, -0.5f, 5.5}}, false); - fRegistry.add("Track/positive/hDCAxy", "DCA x vs. y;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -1.0f, 1.0f}, {200, -1.0f, 1.0f}}, false); + fRegistry.add("Track/positive/hDCAxy", "DCA x vs. y;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -0.1f, 0.1f}, {200, -0.1f, 0.1f}}, false); fRegistry.add("Track/positive/hDCAxySigma", "DCA x vs. y;DCA_{x} (#sigma);DCA_{y} (#sigma)", kTH2F, {{200, -10.0f, 10.0f}, {200, -10.0f, 10.0f}}, false); - fRegistry.add("Track/positive/hDCAxRes_Pt", "DCA_{x} resolution vs. pT;p_{T} (GeV/c);DCA_{x} resolution (#mum)", kTH2F, {{200, 0, 10}, {200, 0., 400}}, false); - fRegistry.add("Track/positive/hDCAyRes_Pt", "DCA_{y} resolution vs. pT;p_{T} (GeV/c);DCA_{y} resolution (#mum)", kTH2F, {{200, 0, 10}, {200, 0., 400}}, false); + fRegistry.add("Track/positive/hDCAxRes_Pt", "DCA_{x} resolution vs. pT;p_{T} (GeV/c);DCA_{x} resolution (#mum)", kTH2F, {{100, 0, 10}, {100, 0, 100}}, false); + fRegistry.add("Track/positive/hDCAyRes_Pt", "DCA_{y} resolution vs. pT;p_{T} (GeV/c);DCA_{y} resolution (#mum)", kTH2F, {{100, 0, 10}, {100, 0, 100}}, false); fRegistry.add("Track/positive/hNclsMCH", "number of MCH clusters", kTH1F, {{21, -0.5, 20.5}}, false); fRegistry.add("Track/positive/hNclsMFT", "number of MFT clusters", kTH1F, {{11, -0.5, 10.5}}, false); - fRegistry.add("Track/positive/hPDCA", "pDCA;p_{T} at PV (GeV/c);p #times DCA (GeV/c #upoint cm)", kTH2F, {{100, 0, 10}, {100, 0.0f, 1000}}, false); + fRegistry.add("Track/positive/hPDCA", "pDCA;r at absorber end (cm);p #times DCA (GeV/c #upoint cm)", kTH2F, {{100, 0, 100}, {100, 0.0f, 1000}}, false); fRegistry.add("Track/positive/hChi2", "chi2;chi2", kTH1F, {{100, 0.0f, 100}}, false); fRegistry.add("Track/positive/hChi2MatchMCHMID", "chi2 match MCH-MID;chi2", kTH1F, {{100, 0.0f, 100}}, false); fRegistry.add("Track/positive/hChi2MatchMCHMFT", "chi2 match MCH-MFT;chi2", kTH1F, {{100, 0.0f, 100}}, false); @@ -536,30 +537,32 @@ struct SingleTrackQC { float dca_xy = fwdDcaXYinSigma(track); if (track.sign() > 0) { fRegistry.fill(HIST("Track/positive/hs"), track.pt(), track.eta(), track.phi(), dca_xy, weight); + fRegistry.fill(HIST("Track/positive/hEtaPhi_MatchMCHMID"), track.phiMatchedMCHMID(), track.etaMatchedMCHMID(), weight); fRegistry.fill(HIST("Track/positive/hQoverPt"), track.sign() / track.pt()); fRegistry.fill(HIST("Track/positive/hTrackType"), track.trackType()); fRegistry.fill(HIST("Track/positive/hDCAxy"), track.fwdDcaX(), track.fwdDcaY()); - fRegistry.fill(HIST("Track/positive/hDCAxySigma"), track.fwdDcaX() / std::sqrt(track.cXX()), track.fwdDcaY() / std::sqrt(track.cYY())); - fRegistry.fill(HIST("Track/positive/hDCAxRes_Pt"), track.pt(), std::sqrt(track.cXX()) * 1e+4); - fRegistry.fill(HIST("Track/positive/hDCAyRes_Pt"), track.pt(), std::sqrt(track.cYY()) * 1e+4); + fRegistry.fill(HIST("Track/positive/hDCAxySigma"), track.fwdDcaX() / std::sqrt(track.cXXatDCA()), track.fwdDcaY() / std::sqrt(track.cYYatDCA())); + fRegistry.fill(HIST("Track/positive/hDCAxRes_Pt"), track.pt(), std::sqrt(track.cXXatDCA()) * 1e+4); + fRegistry.fill(HIST("Track/positive/hDCAyRes_Pt"), track.pt(), std::sqrt(track.cYYatDCA()) * 1e+4); fRegistry.fill(HIST("Track/positive/hNclsMCH"), track.nClusters()); fRegistry.fill(HIST("Track/positive/hNclsMFT"), track.nClustersMFT()); - fRegistry.fill(HIST("Track/positive/hPDCA"), track.pt(), track.pDca()); + fRegistry.fill(HIST("Track/positive/hPDCA"), track.rAtAbsorberEnd(), track.pDca()); fRegistry.fill(HIST("Track/positive/hChi2"), track.chi2()); fRegistry.fill(HIST("Track/positive/hChi2MatchMCHMID"), track.chi2MatchMCHMID()); fRegistry.fill(HIST("Track/positive/hChi2MatchMCHMFT"), track.chi2MatchMCHMFT()); fRegistry.fill(HIST("Track/positive/hMFTClusterMap"), track.mftClusterMap()); } else { fRegistry.fill(HIST("Track/negative/hs"), track.pt(), track.eta(), track.phi(), dca_xy, weight); + fRegistry.fill(HIST("Track/negative/hEtaPhi_MatchMCHMID"), track.phiMatchedMCHMID(), track.etaMatchedMCHMID(), weight); fRegistry.fill(HIST("Track/negative/hQoverPt"), track.sign() / track.pt()); fRegistry.fill(HIST("Track/negative/hTrackType"), track.trackType()); fRegistry.fill(HIST("Track/negative/hDCAxy"), track.fwdDcaX(), track.fwdDcaY()); - fRegistry.fill(HIST("Track/negative/hDCAxySigma"), track.fwdDcaX() / std::sqrt(track.cXX()), track.fwdDcaY() / std::sqrt(track.cYY())); - fRegistry.fill(HIST("Track/negative/hDCAxRes_Pt"), track.pt(), std::sqrt(track.cXX()) * 1e+4); - fRegistry.fill(HIST("Track/negative/hDCAyRes_Pt"), track.pt(), std::sqrt(track.cYY()) * 1e+4); + fRegistry.fill(HIST("Track/negative/hDCAxySigma"), track.fwdDcaX() / std::sqrt(track.cXXatDCA()), track.fwdDcaY() / std::sqrt(track.cYYatDCA())); + fRegistry.fill(HIST("Track/negative/hDCAxRes_Pt"), track.pt(), std::sqrt(track.cXXatDCA()) * 1e+4); + fRegistry.fill(HIST("Track/negative/hDCAyRes_Pt"), track.pt(), std::sqrt(track.cYYatDCA()) * 1e+4); fRegistry.fill(HIST("Track/negative/hNclsMCH"), track.nClusters()); fRegistry.fill(HIST("Track/negative/hNclsMFT"), track.nClustersMFT()); - fRegistry.fill(HIST("Track/negative/hPDCA"), track.pt(), track.pDca()); + fRegistry.fill(HIST("Track/negative/hPDCA"), track.rAtAbsorberEnd(), track.pDca()); fRegistry.fill(HIST("Track/negative/hChi2"), track.chi2()); fRegistry.fill(HIST("Track/negative/hChi2MatchMCHMID"), track.chi2MatchMCHMID()); fRegistry.fill(HIST("Track/negative/hChi2MatchMCHMFT"), track.chi2MatchMCHMFT()); @@ -700,7 +703,7 @@ struct SingleTrackQC { Filter ttcaFilter_electron = ifnode(dielectroncuts.enableTTCA.node(), o2::aod::emprimaryelectron::isAssociatedToMPC == true || o2::aod::emprimaryelectron::isAssociatedToMPC == false, o2::aod::emprimaryelectron::isAssociatedToMPC == true); Preslice perCollision_muon = aod::emprimarymuon::emeventId; - Filter trackFilter_muon = o2::aod::fwdtrack::trackType == dimuoncuts.cfg_track_type && dimuoncuts.cfg_min_pt_track < o2::aod::fwdtrack::pt && dimuoncuts.cfg_min_eta_track < o2::aod::fwdtrack::eta && o2::aod::fwdtrack::eta < dimuoncuts.cfg_max_eta_track && dimuoncuts.cfg_min_phi_track < o2::aod::fwdtrack::phi && o2::aod::fwdtrack::phi < dimuoncuts.cfg_max_phi_track; + Filter trackFilter_muon = o2::aod::fwdtrack::trackType == static_cast(dimuoncuts.cfg_track_type) && dimuoncuts.cfg_min_pt_track < o2::aod::fwdtrack::pt && dimuoncuts.cfg_min_eta_track < o2::aod::fwdtrack::eta && o2::aod::fwdtrack::eta < dimuoncuts.cfg_max_eta_track && dimuoncuts.cfg_min_phi_track < o2::aod::fwdtrack::phi && o2::aod::fwdtrack::phi < dimuoncuts.cfg_max_phi_track; Filter ttcaFilter_muon = ifnode(dimuoncuts.enableTTCA.node(), o2::aod::emprimarymuon::isAssociatedToMPC == true || o2::aod::emprimarymuon::isAssociatedToMPC == false, o2::aod::emprimarymuon::isAssociatedToMPC == true); Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); diff --git a/PWGEM/Dilepton/Core/SingleTrackQCMC.h b/PWGEM/Dilepton/Core/SingleTrackQCMC.h index b014746a35d..c8a18b1b4bf 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQCMC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQCMC.h @@ -192,8 +192,8 @@ struct SingleTrackQCMC { Configurable cfg_max_phi_track{"cfg_max_phi_track", 6.3, "max phi for single track"}; Configurable cfg_min_ncluster_mft{"cfg_min_ncluster_mft", 5, "min ncluster MFT"}; Configurable cfg_min_ncluster_mch{"cfg_min_ncluster_mch", 5, "min ncluster MCH"}; - Configurable cfg_max_chi2{"cfg_max_chi2", 1e+10, "max chi2"}; - Configurable cfg_max_matching_chi2_mftmch{"cfg_max_matching_chi2_mftmch", 1e+10, "max chi2 for MFT-MCH matching"}; + Configurable cfg_max_chi2{"cfg_max_chi2", 1e+6, "max chi2"}; + Configurable cfg_max_matching_chi2_mftmch{"cfg_max_matching_chi2_mftmch", 40, "max chi2 for MFT-MCH matching"}; Configurable cfg_max_matching_chi2_mchmid{"cfg_max_matching_chi2_mchmid", 1e+10, "max chi2 for MCH-MID matching"}; Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 1e+10, "max dca XY for single track in cm"}; Configurable cfg_min_rabs{"cfg_min_rabs", 17.6, "min Radius at the absorber end"}; @@ -328,15 +328,16 @@ struct SingleTrackQCMC { // track info fRegistry.add("Track/lf/positive/hs", "rec. single muon", kTHnSparseD, {axis_pt, axis_eta, axis_phi, axis_dca, axis_charge_gen}, true); if (cfgFillQA) { + fRegistry.add("Track/lf/positive/hEtaPhi_MatchMCHMID", "#eta vs. #varphi of matched MCHMID", kTH2F, {axis_phi, axis_eta}, false); fRegistry.add("Track/lf/positive/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{400, -20, 20}}, false); fRegistry.add("Track/lf/positive/hTrackType", "track type", kTH1F, {{6, -0.5f, 5.5}}, false); - fRegistry.add("Track/lf/positive/hDCAxy", "DCA x vs. y;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -1.0f, 1.0f}, {200, -1.0f, 1.0f}}, false); + fRegistry.add("Track/lf/positive/hDCAxy", "DCA x vs. y;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -0.1f, 0.1f}, {200, -0.1f, 0.1f}}, false); fRegistry.add("Track/lf/positive/hDCAxySigma", "DCA x vs. y;DCA_{x} (#sigma);DCA_{y} (#sigma)", kTH2F, {{200, -10.0f, 10.0f}, {200, -10.0f, 10.0f}}, false); - fRegistry.add("Track/lf/positive/hDCAxRes_Pt", "DCA_{x} resolution vs. pT;p_{T} (GeV/c);DCA_{x} resolution (#mum)", kTH2F, {{200, 0, 10}, {200, 0., 400}}, false); - fRegistry.add("Track/lf/positive/hDCAyRes_Pt", "DCA_{y} resolution vs. pT;p_{T} (GeV/c);DCA_{y} resolution (#mum)", kTH2F, {{200, 0, 10}, {200, 0., 400}}, false); + fRegistry.add("Track/lf/positive/hDCAxRes_Pt", "DCA_{x} resolution vs. pT;p_{T} (GeV/c);DCA_{x} resolution (#mum)", kTH2F, {{100, 0, 10}, {100, 0, 100}}, false); + fRegistry.add("Track/lf/positive/hDCAyRes_Pt", "DCA_{y} resolution vs. pT;p_{T} (GeV/c);DCA_{y} resolution (#mum)", kTH2F, {{100, 0, 10}, {100, 0, 100}}, false); fRegistry.add("Track/lf/positive/hNclsMCH", "number of MCH clusters", kTH1F, {{21, -0.5, 20.5}}, false); fRegistry.add("Track/lf/positive/hNclsMFT", "number of MFT clusters", kTH1F, {{11, -0.5, 10.5}}, false); - fRegistry.add("Track/lf/positive/hPDCA", "pDCA;p_{T} at PV (GeV/c);p #times DCA (GeV/c #upoint cm)", kTH2F, {{100, 0, 10}, {100, 0.0f, 1000}}, false); + fRegistry.add("Track/lf/positive/hPDCA", "pDCA;r at absorber (cm);p #times DCA (GeV/c #upoint cm)", kTH2F, {{100, 0, 100}, {100, 0.0f, 1000}}, false); fRegistry.add("Track/lf/positive/hChi2", "chi2;chi2", kTH1F, {{100, 0.0f, 100}}, false); fRegistry.add("Track/lf/positive/hChi2MatchMCHMID", "chi2 match MCH-MID;chi2", kTH1F, {{100, 0.0f, 100}}, false); fRegistry.add("Track/lf/positive/hChi2MatchMCHMFT", "chi2 match MCH-MFT;chi2", kTH1F, {{100, 0.0f, 100}}, false); @@ -654,15 +655,16 @@ struct SingleTrackQCMC { if (track.sign() > 0) { fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hs"), track.pt(), track.eta(), track.phi(), dca_xy, -mctrack.pdgCode() / pdg_lepton, weight); if (cfgFillQA) { + fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hEtaPhi_MatchMCHMID"), track.phiMatchedMCHMID(), track.etaMatchedMCHMID(), weight); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hQoverPt"), track.sign() / track.pt()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hTrackType"), track.trackType()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hDCAxy"), track.fwdDcaX(), track.fwdDcaY()); - fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hDCAxySigma"), track.fwdDcaX() / std::sqrt(track.cXX()), track.fwdDcaY() / std::sqrt(track.cYY())); - fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hDCAxRes_Pt"), track.pt(), std::sqrt(track.cXX()) * 1e+4); - fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hDCAyRes_Pt"), track.pt(), std::sqrt(track.cYY()) * 1e+4); + fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hDCAxySigma"), track.fwdDcaX() / std::sqrt(track.cXXatDCA()), track.fwdDcaY() / std::sqrt(track.cYYatDCA())); + fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hDCAxRes_Pt"), track.pt(), std::sqrt(track.cXXatDCA()) * 1e+4); + fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hDCAyRes_Pt"), track.pt(), std::sqrt(track.cYYatDCA()) * 1e+4); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hNclsMCH"), track.nClusters()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hNclsMFT"), track.nClustersMFT()); - fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hPDCA"), track.pt(), track.pDca()); + fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hPDCA"), track.rAtAbsorberEnd(), track.pDca()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hChi2"), track.chi2()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hChi2MatchMCHMID"), track.chi2MatchMCHMID()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hChi2MatchMCHMFT"), track.chi2MatchMCHMFT()); @@ -674,15 +676,16 @@ struct SingleTrackQCMC { } else { fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hs"), track.pt(), track.eta(), track.phi(), dca_xy, -mctrack.pdgCode() / pdg_lepton, weight); if (cfgFillQA) { + fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hEtaPhi_MatchMCHMID"), track.phiMatchedMCHMID(), track.etaMatchedMCHMID(), weight); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hQoverPt"), track.sign() / track.pt()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hTrackType"), track.trackType()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hDCAxy"), track.fwdDcaX(), track.fwdDcaY()); - fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hDCAxySigma"), track.fwdDcaX() / std::sqrt(track.cXX()), track.fwdDcaY() / std::sqrt(track.cYY())); - fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hDCAxRes_Pt"), track.pt(), std::sqrt(track.cXX()) * 1e+4); - fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hDCAyRes_Pt"), track.pt(), std::sqrt(track.cYY()) * 1e+4); + fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hDCAxySigma"), track.fwdDcaX() / std::sqrt(track.cXXatDCA()), track.fwdDcaY() / std::sqrt(track.cYYatDCA())); + fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hDCAxRes_Pt"), track.pt(), std::sqrt(track.cXXatDCA()) * 1e+4); + fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hDCAyRes_Pt"), track.pt(), std::sqrt(track.cYYatDCA()) * 1e+4); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hNclsMCH"), track.nClusters()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hNclsMFT"), track.nClustersMFT()); - fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hPDCA"), track.pt(), track.pDca()); + fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hPDCA"), track.rAtAbsorberEnd(), track.pDca()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hChi2"), track.chi2()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hChi2MatchMCHMID"), track.chi2MatchMCHMID()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hChi2MatchMCHMFT"), track.chi2MatchMCHMFT()); @@ -981,7 +984,7 @@ struct SingleTrackQCMC { Filter ttcaFilter_electron = ifnode(dielectroncuts.enableTTCA.node(), o2::aod::emprimaryelectron::isAssociatedToMPC == true || o2::aod::emprimaryelectron::isAssociatedToMPC == false, o2::aod::emprimaryelectron::isAssociatedToMPC == true); Preslice perCollision_muon = aod::emprimarymuon::emeventId; - Filter trackFilter_muon = o2::aod::fwdtrack::trackType == dimuoncuts.cfg_track_type && dimuoncuts.cfg_min_phi_track < o2::aod::fwdtrack::phi && o2::aod::fwdtrack::phi < dimuoncuts.cfg_max_phi_track; + Filter trackFilter_muon = o2::aod::fwdtrack::trackType == static_cast(dimuoncuts.cfg_track_type) && dimuoncuts.cfg_min_phi_track < o2::aod::fwdtrack::phi && o2::aod::fwdtrack::phi < dimuoncuts.cfg_max_phi_track; Filter ttcaFilter_muon = ifnode(dimuoncuts.enableTTCA.node(), o2::aod::emprimarymuon::isAssociatedToMPC == true || o2::aod::emprimarymuon::isAssociatedToMPC == false, o2::aod::emprimarymuon::isAssociatedToMPC == true); Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); diff --git a/PWGEM/Dilepton/DataModel/dileptonTables.h b/PWGEM/Dilepton/DataModel/dileptonTables.h index cc1c2a627d6..a0973df51b7 100644 --- a/PWGEM/Dilepton/DataModel/dileptonTables.h +++ b/PWGEM/Dilepton/DataModel/dileptonTables.h @@ -529,14 +529,21 @@ using EMPrimaryElectronPrefilterBitDerived = EMPrimaryElectronsPrefilterBitDeriv namespace emprimarymuon { -DECLARE_SOA_INDEX_COLUMN(EMEvent, emevent); //! -DECLARE_SOA_COLUMN(CollisionId, collisionId, int); //! -DECLARE_SOA_COLUMN(FwdTrackId, fwdtrackId, int); //! -DECLARE_SOA_SELF_INDEX_COLUMN_FULL(MCHTrack, matchMCHTrack, int, "EMPRIMARYMUs_MatchMCHTrack"); //! Index of matched MCH track for GlobalMuonTracks and GlobalForwardTracks +DECLARE_SOA_INDEX_COLUMN(EMEvent, emevent); //! +DECLARE_SOA_COLUMN(CollisionId, collisionId, int); //! +DECLARE_SOA_COLUMN(FwdTrackId, fwdtrackId, int); //! +DECLARE_SOA_COLUMN(MFTTrackId, mfttrackId, int); //! +DECLARE_SOA_COLUMN(MCHTrackId, mchtrackId, int); //! DECLARE_SOA_SELF_ARRAY_INDEX_COLUMN(AmbiguousMuons, ambiguousMuons); +DECLARE_SOA_COLUMN(CXXatDCA, cXXatDCA, float); //! DCAx resolution squared at DCA +DECLARE_SOA_COLUMN(CYYatDCA, cYYatDCA, float); //! DCAy resolution squared at DCA +DECLARE_SOA_COLUMN(CXYatDCA, cXYatDCA, float); //! correlation term of DCAx,y resolution at DCA +DECLARE_SOA_COLUMN(EtaMatchedMCHMID, etaMatchedMCHMID, float); //! eta of MCH-MID track in MFT-MCH-MID track at PV +DECLARE_SOA_COLUMN(PhiMatchedMCHMID, phiMatchedMCHMID, float); //! phi of MCH-MID track in MFT-MCH-MID track at PV DECLARE_SOA_COLUMN(IsAssociatedToMPC, isAssociatedToMPC, bool); //! is associated to most probable collision +DECLARE_SOA_COLUMN(IsAmbiguous, isAmbiguous, bool); //! is ambiguous DECLARE_SOA_COLUMN(Sign, sign, int8_t); //! -DECLARE_SOA_COLUMN(Chi2MFTsa, chi2MFTsa, float); //! chi2 of MFT standalone track +DECLARE_SOA_COLUMN(Chi2MFT, chi2MFT, float); //! chi2 of MFT standalone track DECLARE_SOA_DYNAMIC_COLUMN(Signed1Pt, signed1Pt, [](float pt, int8_t sign) -> float { return sign * 1. / pt; }); DECLARE_SOA_DYNAMIC_COLUMN(P, p, [](float pt, float eta) -> float { return pt * std::cosh(eta); }); DECLARE_SOA_DYNAMIC_COLUMN(Px, px, [](float pt, float phi) -> float { return pt * std::cos(phi); }); @@ -567,17 +574,16 @@ DECLARE_SOA_DYNAMIC_COLUMN(MFTClusterMap, mftClusterMap, //! MFT cluster map, on } // namespace emprimarymuon DECLARE_SOA_TABLE(EMPrimaryMuons, "AOD", "EMPRIMARYMU", //! o2::soa::Index<>, emprimarymuon::CollisionId, - emprimarymuon::FwdTrackId, fwdtrack::TrackType, + emprimarymuon::FwdTrackId, emprimarymuon::MFTTrackId, emprimarymuon::MCHTrackId, fwdtrack::TrackType, fwdtrack::Pt, fwdtrack::Eta, fwdtrack::Phi, emprimarymuon::Sign, - fwdtrack::FwdDcaX, fwdtrack::FwdDcaY, + fwdtrack::FwdDcaX, fwdtrack::FwdDcaY, emprimarymuon::CXXatDCA, emprimarymuon::CYYatDCA, emprimarymuon::CXYatDCA, + emprimarymuon::EtaMatchedMCHMID, emprimarymuon::PhiMatchedMCHMID, fwdtrack::X, fwdtrack::Y, fwdtrack::Z, fwdtrack::Tgl, fwdtrack::NClusters, fwdtrack::PDca, fwdtrack::RAtAbsorberEnd, fwdtrack::Chi2, fwdtrack::Chi2MatchMCHMID, fwdtrack::Chi2MatchMCHMFT, - // fwdtrack::MatchScoreMCHMFT, fwdtrack::MFTTrackId, fwdtrack::MCHTrackId, - emprimarymuon::MCHTrackId, fwdtrack::MCHBitMap, fwdtrack::MIDBitMap, fwdtrack::MIDBoards, - fwdtrack::MFTClusterSizesAndTrackFlags, emprimarymuon::Chi2MFTsa, emprimarymuon::IsAssociatedToMPC, + fwdtrack::MFTClusterSizesAndTrackFlags, emprimarymuon::Chi2MFT, emprimarymuon::IsAssociatedToMPC, emprimarymuon::IsAmbiguous, // dynamic column emprimarymuon::Signed1Pt, diff --git a/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx b/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx index fb0ada8e5cd..c4c5e7f3f5c 100644 --- a/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx +++ b/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx @@ -27,6 +27,7 @@ #include "CommonConstants/PhysicsConstants.h" #include "Common/DataModel/CollisionAssociationTables.h" #include "Common/Core/TableHelper.h" +#include "Common/DataModel/PropagatedFwdTrackTables.h" #include "CCDB/BasicCCDBManager.h" #include "DataFormatsParameters/GRPMagField.h" @@ -47,34 +48,28 @@ using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::constants::physics; -using MyCollisions = soa::Join; -using MyCollisionsWithSWT = soa::Join; +struct skimmerPrimaryMuon { + using MyCollisions = soa::Join; + using MyCollisionsWithSWT = soa::Join; -using MyTracks = soa::Join; // muon tracks are repeated. i.e. not exclusive. -using MyTrack = MyTracks::iterator; + using MyPropagatedFwdTracks = soa::Join; // muon tracks are repeated. i.e. not exclusive. + using MyPropagatedFwdTrack = MyPropagatedFwdTracks::iterator; -using MyTracksMC = soa::Join; -using MyTrackMC = MyTracksMC::iterator; + using MyFwdTracks = soa::Join; // muon tracks are repeated. i.e. not exclusive. + using MyFwdTrack = MyFwdTracks::iterator; -using MFTTracksMC = soa::Join; -using MFTTrackMC = MFTTracksMC::iterator; + using MyFwdTracksMC = soa::Join; + using MyFwdTrackMC = MyFwdTracksMC::iterator; -struct skimmerPrimaryMuon { - // Index used to set different options for Muon propagation - enum class MuonExtrapolation : int { - kToVertex = 0, // propagtion to vertex by default - kToDCA = 1, - kToRabs = 2, - }; + using MFTTracksMC = soa::Join; + using MFTTrackMC = MFTTracksMC::iterator; - using SMatrix55 = ROOT::Math::SMatrix>; - using SMatrix5 = ROOT::Math::SVector; + Produces emprimarymuons; + Produces emprimarymuonscov; SliceCache cache; - Preslice perCollision = o2::aod::fwdtrack::collisionId; + Preslice perCollision = o2::aod::fwdtrack::collisionId; Preslice perCollision_mft = o2::aod::fwdtrack::collisionId; - Produces emprimarymuons; - Produces emprimarymuonscov; // Configurables Configurable fillQAHistogram{"fillQAHistogram", false, "flag to fill QA histograms"}; @@ -132,7 +127,6 @@ struct skimmerPrimaryMuon { void addHistograms() { fRegistry.add("Event/hCollisionCounter", "collision counter", kTH1F, {{2, -0.5f, 1.5}}, false); - fRegistry.add("Event/hNmuon", "Number of #mu per event;N_{#mu^{#minus}};N_{#mu^{+}}", kTH2F, {{101, -0.5f, 100.5}, {101, -0.5f, 100.5}}, false); // for track if (fillQAHistogram) { @@ -147,274 +141,41 @@ struct skimmerPrimaryMuon { fRegistry.add("Track/MFTMCHMID/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{360, 0, 2 * M_PI}, {30, -5.0f, -2.0f}}, false); fRegistry.add("Track/MFTMCHMID/hNclusters", "Nclusters;Nclusters", kTH1F, {{21, -0.5f, 20.5}}, false); fRegistry.add("Track/MFTMCHMID/hNclustersMFT", "NclustersMFT;Nclusters MFT", kTH1F, {{11, -0.5f, 10.5}}, false); - fRegistry.add("Track/MFTMCHMID/hRatAbsorberEnd", "R at absorber end;R at absorber end (cm)", kTH1F, {{200, 0.0f, 200}}, false); - fRegistry.add("Track/MFTMCHMID/hPDCA", "pDCA;p_{T,#mu} at PV (GeV/c);p #times DCA (GeV/c #upoint cm)", kTH2F, {{100, 0, 10}, {100, 0.0f, 1000}}, false); - fRegistry.add("Track/MFTMCHMID/hPDCA_recalc", "pDCA relcalculated;p_{T,#mu} at PV (GeV/c);p #times DCA (GeV/c #upoint cm)", kTH2F, {{100, 0, 10}, {100, 0.0f, 1000}}, false); + fRegistry.add("Track/MFTMCHMID/hRatAbsorberEnd", "R at absorber end;R at absorber end (cm)", kTH1F, {{100, 0.0f, 100}}, false); + fRegistry.add("Track/MFTMCHMID/hPDCA", "pDCA;r at absorber (cm);p #times DCA (GeV/c #upoint cm)", kTH2F, {{100, 0, 100}, {100, 0.0f, 1000}}, false); fRegistry.add("Track/MFTMCHMID/hChi2", "chi2;chi2", kTH1F, {{100, 0.0f, 100}}, false); fRegistry.add("Track/MFTMCHMID/hChi2MatchMCHMID", "chi2 match MCH-MID;chi2", kTH1F, {{100, 0.0f, 100}}, false); fRegistry.add("Track/MFTMCHMID/hChi2MatchMCHMFT", "chi2 match MCH-MFT;chi2", kTH1F, {{100, 0.0f, 100}}, false); - fRegistry.add("Track/MFTMCHMID/hMatchScoreMCHMFT", "match score MCH-MFT;score", kTH1F, {{100, 0.0f, 100}}, false); fRegistry.add("Track/MFTMCHMID/hDCAxy2D", "DCA xy;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -10, 10}, {200, -10, +10}}, false); fRegistry.add("Track/MFTMCHMID/hDCAxy2DinSigma", "DCA xy;DCA_{x} (#sigma);DCA_{y} (#sigma)", kTH2F, {{200, -10, 10}, {200, -10, +10}}, false); - fRegistry.add("Track/MFTMCHMID/hDCAxySigma", "DCA_{xy};DCA_{xy} (#sigma);", kTH1F, {{100, 0, 10}}, false); fRegistry.add("Track/MFTMCHMID/hDCAxResolutionvsPt", "DCA_{x} vs. p_{T,#mu};p_{T,#mu} (GeV/c);DCA_{x} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {100, 0, 100}}, false); fRegistry.add("Track/MFTMCHMID/hDCAyResolutionvsPt", "DCA_{y} vs. p_{T,#mu};p_{T,#mu} (GeV/c);DCA_{y} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {100, 0, 100}}, false); - fRegistry.add("Track/MFTMCHMID/hChi2MatchMCHMFT_DCAxySigma", "chi2 match MCH-MFT;DCA_{xy,#mu} (#sigma);MFT-MCH matching chi2", kTH2F, {{100, 0, 10}, {100, 0.0f, 100}}, false); - fRegistry.add("Track/MFTMCHMID/hChi2MatchMCHMFT_Pt", "chi2 match MCH-MFT;p_{T,#mu} (GeV/c);MFT-MCH matching chi2", kTH2F, {{100, 0, 10}, {100, 0.0f, 100}}, false); fRegistry.addClone("Track/MFTMCHMID/", "Track/MCHMID/"); } } - template - void fillTrackHistogram(TTrack const& track, TCollision const& collision) + template + void fillTrackHistogram(TTrack const& track) { - o2::dataformats::GlobalFwdTrack propmuonAtPV = PropagateMuon(track, collision, skimmerPrimaryMuon::MuonExtrapolation::kToVertex); // this is for MCH-MID tracks that cannot see the primary vertex. - o2::dataformats::GlobalFwdTrack propmuonAtDCA = PropagateMuon(track, collision, skimmerPrimaryMuon::MuonExtrapolation::kToDCA); - - float p = propmuonAtPV.getP(); - float pt = propmuonAtPV.getPt(); - float eta = propmuonAtPV.getEta(); - float phi = propmuonAtPV.getPhi(); - - o2::math_utils::bringTo02Pi(phi); - if (phi < 0.f || 2.f * M_PI < phi) { - return; - } - - if (eta < mineta || maxeta < eta) { - return; - } - - if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack)) { - if (eta < mineta_mft || maxeta_mft < eta) { - return; - } - } - - float rAtAbsorberEnd = track.rAtAbsorberEnd(); - if (static_cast(track.trackType()) > 2) { // only for MUON standalone - o2::dataformats::GlobalFwdTrack propmuonAtRabs = PropagateMuon(track, collision, skimmerPrimaryMuon::MuonExtrapolation::kToRabs); - float xAbs = propmuonAtRabs.getX(); - float yAbs = propmuonAtRabs.getY(); - rAtAbsorberEnd = std::sqrt(xAbs * xAbs + yAbs * yAbs); - // Redo propagation only for muon tracks // propagation of MFT tracks alredy done in reconstruction - } - - if (rAtAbsorberEnd < minRabs || maxRabs < rAtAbsorberEnd) { - return; - } - - float dcaX = (propmuonAtDCA.getX() - collision.posX()); - float dcaY = (propmuonAtDCA.getY() - collision.posY()); - float dcaXY = std::sqrt(dcaX * dcaX + dcaY * dcaY); - float cXX = propmuonAtDCA.getSigma2X(); - float cYY = propmuonAtDCA.getSigma2Y(); - float cXY = propmuonAtDCA.getSigmaXY(); - - float dcaXYinSigma = 999.f; - float det = cXX * cYY - cXY * cXY; - if (det < 0) { - dcaXYinSigma = 999.f; - } else { - float chi2 = (dcaX * dcaX * cYY + dcaY * dcaY * cXX - 2. * dcaX * dcaY * cXY) / det; - dcaXYinSigma = std::sqrt(std::fabs(chi2) / 2.); // in sigma - } - fRegistry.fill(HIST("Track/hMuonType"), track.trackType()); - fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hPt"), pt); - fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hEtaPhi"), phi, eta); + fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hPt"), track.pt()); + fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hEtaPhi"), track.phi(), track.eta()); fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hNclusters"), track.nClusters()); - fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hPDCA"), pt, track.pDca()); - fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hPDCA_recalc"), pt, p * dcaXY); - fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hRatAbsorberEnd"), rAtAbsorberEnd); + fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hPDCA"), track.rAtAbsorberEnd(), track.pDca()); + fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hRatAbsorberEnd"), track.rAtAbsorberEnd()); fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hChi2"), track.chi2()); fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hChi2MatchMCHMID"), track.chi2MatchMCHMID()); fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hChi2MatchMCHMFT"), track.chi2MatchMCHMFT()); - fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hMatchScoreMCHMFT"), track.matchScoreMCHMFT()); - fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hDCAxy2D"), dcaX, dcaY); - fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hDCAxy2DinSigma"), dcaX / std::sqrt(cXX), dcaY / std::sqrt(cYY)); - fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hDCAxySigma"), dcaXYinSigma); - fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hChi2MatchMCHMFT_DCAxySigma"), dcaXYinSigma, track.chi2MatchMCHMFT()); - fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hChi2MatchMCHMFT_Pt"), pt, track.chi2MatchMCHMFT()); - fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hDCAxResolutionvsPt"), pt, std::sqrt(cXX) * 1e+4); // convert cm to um - fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hDCAyResolutionvsPt"), pt, std::sqrt(cYY) * 1e+4); // convert cm to um + fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hDCAxy2D"), track.fwdDcaX(), track.fwdDcaY()); + fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hDCAxy2DinSigma"), track.fwdDcaX() / std::sqrt(track.cXX()), track.fwdDcaY() / std::sqrt(track.cYY())); + fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hDCAxResolutionvsPt"), track.pt(), std::sqrt(track.cXXatDCA()) * 1e+4); // convert cm to um + fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hDCAyResolutionvsPt"), track.pt(), std::sqrt(track.cYYatDCA()) * 1e+4); // convert cm to um } - template - o2::dataformats::GlobalFwdTrack PropagateMuon(T const& muon, C const& collision, const skimmerPrimaryMuon::MuonExtrapolation endPoint) + template + void run(TCollisions const& collisions, TBCs const&, TSAMuons const& saMuons, TGlobalMuons const& glMuons, TFwdTracks const&, TMFTTracks const&) { - double chi2 = muon.chi2(); - SMatrix5 tpars(muon.x(), muon.y(), muon.phi(), muon.tgl(), muon.signed1Pt()); - std::vector v1{muon.cXX(), muon.cXY(), muon.cYY(), muon.cPhiX(), muon.cPhiY(), - muon.cPhiPhi(), muon.cTglX(), muon.cTglY(), muon.cTglPhi(), muon.cTglTgl(), - muon.c1PtX(), muon.c1PtY(), muon.c1PtPhi(), muon.c1PtTgl(), muon.c1Pt21Pt2()}; - SMatrix55 tcovs(v1.begin(), v1.end()); - o2::track::TrackParCovFwd fwdtrack{muon.z(), tpars, tcovs, chi2}; - o2::dataformats::GlobalFwdTrack propmuon; - - if (static_cast(muon.trackType()) > 2) { // MCH-MID or MCH standalone - o2::dataformats::GlobalFwdTrack track; - track.setParameters(tpars); - track.setZ(fwdtrack.getZ()); - track.setCovariances(tcovs); - auto mchTrack = mMatching.FwdtoMCH(track); - - if (endPoint == skimmerPrimaryMuon::MuonExtrapolation::kToVertex) { - o2::mch::TrackExtrap::extrapToVertex(mchTrack, collision.posX(), collision.posY(), collision.posZ(), collision.covXX(), collision.covYY()); - } - if (endPoint == skimmerPrimaryMuon::MuonExtrapolation::kToDCA) { - o2::mch::TrackExtrap::extrapToVertexWithoutBranson(mchTrack, collision.posZ()); - } - if (endPoint == skimmerPrimaryMuon::MuonExtrapolation::kToRabs) { - o2::mch::TrackExtrap::extrapToZ(mchTrack, -505.); - } - - auto proptrack = mMatching.MCHtoFwd(mchTrack); - propmuon.setParameters(proptrack.getParameters()); - propmuon.setZ(proptrack.getZ()); - propmuon.setCovariances(proptrack.getCovariances()); - } else if (static_cast(muon.trackType()) < 2) { // MFT-MCH-MID - double centerMFT[3] = {0, 0, -61.4}; - o2::field::MagneticField* field = static_cast(TGeoGlobalMagField::Instance()->GetField()); - auto Bz = field->getBz(centerMFT); // Get field at centre of MFT - auto geoMan = o2::base::GeometryManager::meanMaterialBudget(muon.x(), muon.y(), muon.z(), collision.posX(), collision.posY(), collision.posZ()); - auto x2x0 = static_cast(geoMan.meanX2X0); - fwdtrack.propagateToVtxhelixWithMCS(collision.posZ(), {collision.posX(), collision.posY()}, {collision.covXX(), collision.covYY()}, Bz, x2x0); - propmuon.setParameters(fwdtrack.getParameters()); - propmuon.setZ(fwdtrack.getZ()); - propmuon.setCovariances(fwdtrack.getCovariances()); - } - - v1.clear(); - v1.shrink_to_fit(); - - return propmuon; - } - - template - bool isSelected(TMuon const& muon, TCollision const& collision) - { - if constexpr (isMC) { - if (!muon.has_mcParticle()) { - return false; - } - } - - o2::dataformats::GlobalFwdTrack propmuonAtPV = PropagateMuon(muon, collision, skimmerPrimaryMuon::MuonExtrapolation::kToVertex); - - float pt = propmuonAtPV.getPt(); - float eta = propmuonAtPV.getEta(); - float phi = propmuonAtPV.getPhi(); - - if (pt < minpt) { - return false; - } - - if (eta < mineta || maxeta < eta) { - return false; - } - - o2::math_utils::bringTo02Pi(phi); - if (phi < 0.f || 2.f * M_PI < phi) { - return false; - } - - // float dcaX = propmuonAtDCA.getX() - collision.posX(); - // float dcaY = propmuonAtDCA.getY() - collision.posY(); - float rAtAbsorberEnd = muon.rAtAbsorberEnd(); - - if (muon.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack)) { - if (eta < mineta_mft || maxeta_mft < eta) { - return false; - } - } else if (muon.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { - o2::dataformats::GlobalFwdTrack propmuonAtRabs = PropagateMuon(muon, collision, skimmerPrimaryMuon::MuonExtrapolation::kToRabs); - float xAbs = propmuonAtRabs.getX(); - float yAbs = propmuonAtRabs.getY(); - rAtAbsorberEnd = std::sqrt(xAbs * xAbs + yAbs * yAbs); // Redo propagation only for muon tracks // propagation of MFT tracks alredy done in reconstruction - } else { - return false; - } - - if (rAtAbsorberEnd < minRabs || maxRabs < rAtAbsorberEnd) { - return false; - } - return true; - } - - template - void fillMuonTable(TMuon const& muon, TCollision const& collision, const int new_muon_sa_id) - { - o2::dataformats::GlobalFwdTrack propmuonAtPV = PropagateMuon(muon, collision, skimmerPrimaryMuon::MuonExtrapolation::kToVertex); - o2::dataformats::GlobalFwdTrack propmuonAtDCA = PropagateMuon(muon, collision, skimmerPrimaryMuon::MuonExtrapolation::kToDCA); - - float pt = propmuonAtPV.getPt(); - float eta = propmuonAtPV.getEta(); - float phi = propmuonAtPV.getPhi(); - - o2::math_utils::bringTo02Pi(phi); - - float dcaX = propmuonAtDCA.getX() - collision.posX(); - float dcaY = propmuonAtDCA.getY() - collision.posY(); - float rAtAbsorberEnd = muon.rAtAbsorberEnd(); - - if (muon.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { - o2::dataformats::GlobalFwdTrack propmuonAtRabs = PropagateMuon(muon, collision, skimmerPrimaryMuon::MuonExtrapolation::kToRabs); - float xAbs = propmuonAtRabs.getX(); - float yAbs = propmuonAtRabs.getY(); - rAtAbsorberEnd = std::sqrt(xAbs * xAbs + yAbs * yAbs); // Redo propagation only for muon tracks // propagation of MFT tracks alredy done in reconstruction - } - - bool isAssociatedToMPC = collision.globalIndex() == muon.collisionId(); - auto fwdcov = propmuonAtDCA.getCovariances(); - if (muon.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack)) { - auto mftsa_track = muon.template matchMFTTrack_as(); - - emprimarymuons(collision.globalIndex(), muon.globalIndex(), muon.trackType(), pt, eta, phi, muon.sign(), dcaX, dcaY, - propmuonAtDCA.getX(), propmuonAtDCA.getY(), propmuonAtDCA.getZ(), propmuonAtDCA.getTgl(), - muon.nClusters(), muon.pDca(), rAtAbsorberEnd, muon.chi2(), muon.chi2MatchMCHMID(), muon.chi2MatchMCHMFT(), - new_muon_sa_id, - muon.mchBitMap(), muon.midBitMap(), muon.midBoards(), mftsa_track.mftClusterSizesAndTrackFlags(), mftsa_track.chi2(), isAssociatedToMPC); - emprimarymuonscov( - fwdcov(0, 0), - fwdcov(0, 1), fwdcov(1, 1), - fwdcov(2, 0), fwdcov(2, 1), fwdcov(2, 2), - fwdcov(3, 0), fwdcov(3, 1), fwdcov(3, 2), fwdcov(3, 3), - fwdcov(4, 0), fwdcov(4, 1), fwdcov(4, 2), fwdcov(4, 3), fwdcov(4, 4)); - } else if (muon.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { - emprimarymuons(collision.globalIndex(), muon.globalIndex(), muon.trackType(), pt, eta, phi, muon.sign(), dcaX, dcaY, - propmuonAtDCA.getX(), propmuonAtDCA.getY(), propmuonAtDCA.getZ(), propmuonAtDCA.getTgl(), - muon.nClusters(), muon.pDca(), rAtAbsorberEnd, muon.chi2(), muon.chi2MatchMCHMID(), muon.chi2MatchMCHMFT(), - new_muon_sa_id, - muon.mchBitMap(), muon.midBitMap(), muon.midBoards(), 0, 999999.f, isAssociatedToMPC); - emprimarymuonscov( - fwdcov(0, 0), - fwdcov(0, 1), fwdcov(1, 1), - fwdcov(2, 0), fwdcov(2, 1), fwdcov(2, 2), - fwdcov(3, 0), fwdcov(3, 1), fwdcov(3, 2), fwdcov(3, 3), - fwdcov(4, 0), fwdcov(4, 1), fwdcov(4, 2), fwdcov(4, 3), fwdcov(4, 4)); - } - - // See definition DataFormats/Reconstruction/include/ReconstructionDataFormats/TrackFwd.h - /// Covariance matrix of track parameters, ordered as follows:

-    ///                                     
-    ///                                     
-    ///                            
-    ///                        
-    ///                 
, int> map_new_sa_muon_index; // new standalone muon index - - // Preslice fwdtrackIndicesPerMFTsa = aod::fwdtrack::matchMFTTrackId; - - Preslice fwdtrackIndicesPerCollision = aod::track_association::collisionId; - Partition global_muons = o2::aod::fwdtrack::trackType == uint8_t(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack); // MFT-MCH-MID - Partition sa_muons = o2::aod::fwdtrack::trackType == uint8_t(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack); // MCH-MID - - void processRec_SA(MyCollisions const& collisions, aod::BCsWithTimestamps const&, MyTracks const& tracks, aod::MFTTracks const&) - { - for (auto& collision : collisions) { + for (const auto& collision : collisions) { auto bc = collision.template foundBC_as(); initCCDB(bc); fRegistry.fill(HIST("Event/hCollisionCounter"), 0.f); @@ -422,376 +183,115 @@ struct skimmerPrimaryMuon { continue; } - auto sa_muons_per_coll = sa_muons->sliceByCached(o2::aod::fwdtrack::collisionId, collision.globalIndex(), cache); - auto global_muons_per_coll = global_muons->sliceByCached(o2::aod::fwdtrack::collisionId, collision.globalIndex(), cache); - - int counter = 0; - int offset = emprimarymuons.lastIndex() + 1; - - for (auto& track : sa_muons_per_coll) { - if (fillQAHistogram) { - fillTrackHistogram<3>(track, collision); - } - if (isSelected(track, collision)) { - map_new_sa_muon_index[std::make_pair(collision.globalIndex(), track.globalIndex())] = counter + offset; - counter++; - } - } // end of standalone muon loop - for (auto& track : global_muons_per_coll) { - if (fillQAHistogram) { - fillTrackHistogram<0>(track, collision); - } - - if (map_new_sa_muon_index.find(std::make_pair(collision.globalIndex(), track.matchMCHTrackId())) == map_new_sa_muon_index.end()) { // don't apply muon selection to MCH-MID track in MFT-MCH-MID track - map_new_sa_muon_index[std::make_pair(collision.globalIndex(), track.matchMCHTrackId())] = counter + offset; - counter++; - } - if (isSelected(track, collision)) { - map_new_sa_muon_index[std::make_pair(collision.globalIndex(), track.globalIndex())] = counter + offset; - counter++; - } - } // end of global muon loop - - // fill table after mapping - for (const auto& [key, value] : map_new_sa_muon_index) { - // int collisionId = std::get<0>(key); - // int fwdtrackId = std::get<1>(key); - // int new_fwdtrackId = value; - // LOGF(info, "collisionId = %d, fwdtrackId = %d, new_fwdtrackId = %d", collisionId, fwdtrackId, new_fwdtrackId); - auto track = tracks.iteratorAt(std::get<1>(key)); - if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { - fillMuonTable(track, collision, value); - } else if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack)) { - fillMuonTable(track, collision, map_new_sa_muon_index[std::make_pair(collision.globalIndex(), track.matchMCHTrackId())]); + if constexpr (isTriggerAnalysis) { + if (collision.swtaliastmp_raw() == 0) { + continue; } } - map_new_sa_muon_index.clear(); - } // end of collision loop - } - PROCESS_SWITCH(skimmerPrimaryMuon, processRec_SA, "process reconstructed info only with standalone", true); - - void processRec_TTCA(MyCollisions const& collisions, aod::BCsWithTimestamps const&, MyTracks const& tracks, aod::MFTTracks const&, aod::FwdTrackAssoc const& fwdtrackIndices) - { - for (auto& collision : collisions) { - auto bc = collision.template foundBC_as(); - initCCDB(bc); - fRegistry.fill(HIST("Event/hCollisionCounter"), 0.f); - if (!collision.isSelected()) { - continue; + if constexpr (isMC) { + if (!collision.has_mcCollision()) { + continue; + } } - int counter = 0; - int offset = emprimarymuons.lastIndex() + 1; + auto sa_muons_per_coll = saMuons.sliceByCached(o2::aod::fwdtrack::collisionId, collision.globalIndex(), cache); + auto global_muons_per_coll = glMuons.sliceByCached(o2::aod::fwdtrack::collisionId, collision.globalIndex(), cache); - auto fwdtrackIdsThisCollision = fwdtrackIndices.sliceBy(fwdtrackIndicesPerCollision, collision.globalIndex()); - for (auto& fwdtrackId : fwdtrackIdsThisCollision) { - auto track = fwdtrackId.template fwdtrack_as(); - // LOGF(info, "TTCA | collision.globalIndex() = %d, track.globalIndex() = %d, track.trackType() = %d, track.matchMFTTrackId() = %d, track.matchMCHTrackId() = %d, track.offsets() = %d", collision.globalIndex(), track.globalIndex(), track.trackType(), track.matchMFTTrackId(), track.matchMCHTrackId(), track.offsets()); + for (const auto& muon : sa_muons_per_coll) { + if (fillQAHistogram) { + fillTrackHistogram<3>(muon); + } - // auto collision_in_track = track.collision_as(); - // auto bc_in_track = collision_in_track.bc_as(); - // LOGF(info, "track.globalIndex() = %d , bc_in_track.globalBC() = %lld", track.globalIndex(), bc_in_track.globalBC()); + const auto& fwdtrack = muon.template fwdtrack_as(); - if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { - if (fillQAHistogram) { - fillTrackHistogram<3>(track, collision); - } - if (isSelected(track, collision)) { - map_new_sa_muon_index[std::make_pair(collision.globalIndex(), track.globalIndex())] = counter + offset; - counter++; - } - } else if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack)) { - if (fillQAHistogram) { - fillTrackHistogram<0>(track, collision); - } - if (map_new_sa_muon_index.find(std::make_pair(collision.globalIndex(), track.matchMCHTrackId())) == map_new_sa_muon_index.end()) { - map_new_sa_muon_index[std::make_pair(collision.globalIndex(), track.matchMCHTrackId())] = counter + offset; - counter++; - } - if (isSelected(track, collision)) { - map_new_sa_muon_index[std::make_pair(collision.globalIndex(), track.globalIndex())] = counter + offset; - counter++; + if constexpr (isMC) { + if (!fwdtrack.has_mcParticle()) { + continue; } } - } // end of track loop - - for (const auto& [key, value] : map_new_sa_muon_index) { - // int collisionId = std::get<0>(key); - // int fwdtrackId = std::get<1>(key); - // int new_fwdtrackId = value; - auto track = tracks.iteratorAt(std::get<1>(key)); - if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { - fillMuonTable(track, collision, value); - } else if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack)) { - fillMuonTable(track, collision, map_new_sa_muon_index[std::make_pair(collision.globalIndex(), track.matchMCHTrackId())]); - } - } - - map_new_sa_muon_index.clear(); - } // end of collision loop - } - PROCESS_SWITCH(skimmerPrimaryMuon, processRec_TTCA, "process reconstructed info only with TTCA", false); - - void processRec_SA_SWT(MyCollisionsWithSWT const& collisions, aod::BCsWithTimestamps const&, MyTracks const& tracks, aod::MFTTracks const&) - { - for (auto& collision : collisions) { - auto bc = collision.template foundBC_as(); - initCCDB(bc); - fRegistry.fill(HIST("Event/hCollisionCounter"), 0.f); - if (!collision.isSelected()) { - continue; - } - if (collision.swtaliastmp_raw() == 0) { - continue; - } - - auto sa_muons_per_coll = sa_muons->sliceByCached(o2::aod::fwdtrack::collisionId, collision.globalIndex(), cache); - auto global_muons_per_coll = global_muons->sliceByCached(o2::aod::fwdtrack::collisionId, collision.globalIndex(), cache); + emprimarymuons(collision.globalIndex(), fwdtrack.globalIndex(), -1, -1, muon.trackType(), + muon.pt(), muon.eta(), muon.phi(), muon.sign(), muon.fwdDcaX(), muon.fwdDcaY(), muon.cXXatDCA(), muon.cYYatDCA(), muon.cXYatDCA(), muon.etaMatchedMCHMID(), muon.phiMatchedMCHMID(), + muon.x(), muon.y(), muon.z(), muon.tgl(), + muon.nClusters(), muon.pDca(), muon.rAtAbsorberEnd(), muon.chi2(), muon.chi2MatchMCHMID(), muon.chi2MatchMCHMFT(), + muon.mchBitMap(), muon.midBitMap(), muon.midBoards(), 0, 999999.f, muon.isAssociatedToMPC(), muon.isAmbiguous()); + + emprimarymuonscov( + muon.cXX(), + muon.cXY(), + muon.cYY(), + muon.cPhiX(), + muon.cPhiY(), + muon.cPhiPhi(), + muon.cTglX(), + muon.cTglY(), + muon.cTglPhi(), + muon.cTglTgl(), + muon.c1PtX(), + muon.c1PtY(), + muon.c1PtPhi(), + muon.c1PtTgl(), + muon.c1Pt21Pt2()); - int counter = 0; - int offset = emprimarymuons.lastIndex() + 1; - - for (auto& track : sa_muons_per_coll) { - if (fillQAHistogram) { - fillTrackHistogram<3>(track, collision); - } - if (isSelected(track, collision)) { - map_new_sa_muon_index[std::make_pair(collision.globalIndex(), track.globalIndex())] = counter + offset; - counter++; - } } // end of standalone muon loop - for (auto& track : global_muons_per_coll) { + for (const auto& muon : global_muons_per_coll) { if (fillQAHistogram) { - fillTrackHistogram<0>(track, collision); + fillTrackHistogram<0>(muon); } - if (map_new_sa_muon_index.find(std::make_pair(collision.globalIndex(), track.matchMCHTrackId())) == map_new_sa_muon_index.end()) { // don't apply muon selection to MCH-MID track in MFT-MCH-MID track - map_new_sa_muon_index[std::make_pair(collision.globalIndex(), track.matchMCHTrackId())] = counter + offset; - counter++; - } - if (isSelected(track, collision)) { - map_new_sa_muon_index[std::make_pair(collision.globalIndex(), track.globalIndex())] = counter + offset; - counter++; - } - } // end of global muon loop - - // fill table after mapping - for (const auto& [key, value] : map_new_sa_muon_index) { - // int collisionId = std::get<0>(key); - // int fwdtrackId = std::get<1>(key); - // int new_fwdtrackId = value; - // LOGF(info, "collisionId = %d, fwdtrackId = %d, new_fwdtrackId = %d", collisionId, fwdtrackId, new_fwdtrackId); - auto track = tracks.iteratorAt(std::get<1>(key)); - if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { - fillMuonTable(track, collision, value); - } else if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack)) { - fillMuonTable(track, collision, map_new_sa_muon_index[std::make_pair(collision.globalIndex(), track.matchMCHTrackId())]); - } - } + const auto& fwdtrack = muon.template fwdtrack_as(); + const auto& mfttrack = muon.template matchMFTTrack_as(); + const auto& mchtrack = muon.template matchMCHTrack_as(); + + emprimarymuons(collision.globalIndex(), fwdtrack.globalIndex(), mfttrack.globalIndex(), mchtrack.globalIndex(), muon.trackType(), + muon.pt(), muon.eta(), muon.phi(), muon.sign(), muon.fwdDcaX(), muon.fwdDcaY(), muon.cXXatDCA(), muon.cYYatDCA(), muon.cXYatDCA(), muon.etaMatchedMCHMID(), muon.phiMatchedMCHMID(), + muon.x(), muon.y(), muon.z(), muon.tgl(), + muon.nClusters(), muon.pDca(), muon.rAtAbsorberEnd(), muon.chi2(), muon.chi2MatchMCHMID(), muon.chi2MatchMCHMFT(), + muon.mchBitMap(), muon.midBitMap(), muon.midBoards(), mfttrack.mftClusterSizesAndTrackFlags(), mfttrack.chi2(), muon.isAssociatedToMPC(), muon.isAmbiguous()); + + emprimarymuonscov( + muon.cXX(), + muon.cXY(), + muon.cYY(), + muon.cPhiX(), + muon.cPhiY(), + muon.cPhiPhi(), + muon.cTglX(), + muon.cTglY(), + muon.cTglPhi(), + muon.cTglTgl(), + muon.c1PtX(), + muon.c1PtY(), + muon.c1PtPhi(), + muon.c1PtTgl(), + muon.c1Pt21Pt2()); - map_new_sa_muon_index.clear(); + } // end of global muon loop } // end of collision loop } - PROCESS_SWITCH(skimmerPrimaryMuon, processRec_SA_SWT, "process reconstructed info only with standalone", false); - void processRec_TTCA_SWT(MyCollisionsWithSWT const& collisions, aod::BCsWithTimestamps const&, MyTracks const& tracks, aod::MFTTracks const&, aod::FwdTrackAssoc const& fwdtrackIndices) - { - for (auto& collision : collisions) { - auto bc = collision.template foundBC_as(); - initCCDB(bc); - fRegistry.fill(HIST("Event/hCollisionCounter"), 0.f); - if (!collision.isSelected()) { - continue; - } - if (collision.swtaliastmp_raw() == 0) { - continue; - } - - int counter = 0; - int offset = emprimarymuons.lastIndex() + 1; - - auto fwdtrackIdsThisCollision = fwdtrackIndices.sliceBy(fwdtrackIndicesPerCollision, collision.globalIndex()); - for (auto& fwdtrackId : fwdtrackIdsThisCollision) { - auto track = fwdtrackId.template fwdtrack_as(); - // LOGF(info, "TTCA | collision.globalIndex() = %d, track.globalIndex() = %d, track.trackType() = %d, track.matchMFTTrackId() = %d, track.matchMCHTrackId() = %d, track.offsets() = %d", collision.globalIndex(), track.globalIndex(), track.trackType(), track.matchMFTTrackId(), track.matchMCHTrackId(), track.offsets()); + std::map, int> map_new_sa_muon_index; // new standalone muon index - // auto collision_in_track = track.collision_as(); - // auto bc_in_track = collision_in_track.bc_as(); - // LOGF(info, "track.globalIndex() = %d , bc_in_track.globalBC() = %lld", track.globalIndex(), bc_in_track.globalBC()); + Partition global_muons = o2::aod::fwdtrack::trackType == uint8_t(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack); // MFT-MCH-MID + Partition sa_muons = o2::aod::fwdtrack::trackType == uint8_t(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack); // MCH-MID - if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { - if (fillQAHistogram) { - fillTrackHistogram<3>(track, collision); - } - if (isSelected(track, collision)) { - map_new_sa_muon_index[std::make_pair(collision.globalIndex(), track.globalIndex())] = counter + offset; - counter++; - } - } else if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack)) { - if (fillQAHistogram) { - fillTrackHistogram<0>(track, collision); - } - if (map_new_sa_muon_index.find(std::make_pair(collision.globalIndex(), track.matchMCHTrackId())) == map_new_sa_muon_index.end()) { - map_new_sa_muon_index[std::make_pair(collision.globalIndex(), track.matchMCHTrackId())] = counter + offset; - counter++; - } - if (isSelected(track, collision)) { - map_new_sa_muon_index[std::make_pair(collision.globalIndex(), track.globalIndex())] = counter + offset; - counter++; - } - } - } // end of track loop - - for (const auto& [key, value] : map_new_sa_muon_index) { - // int collisionId = std::get<0>(key); - // int fwdtrackId = std::get<1>(key); - // int new_fwdtrackId = value; - auto track = tracks.iteratorAt(std::get<1>(key)); - if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { - fillMuonTable(track, collision, value); - } else if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack)) { - fillMuonTable(track, collision, map_new_sa_muon_index[std::make_pair(collision.globalIndex(), track.matchMCHTrackId())]); - } - } - - map_new_sa_muon_index.clear(); - } // end of collision loop + void processRec(MyCollisions const& collisions, aod::BCsWithTimestamps const& bcs, MyPropagatedFwdTracks const&, MyFwdTracks const& fwdtracks, aod::MFTTracks const& mfttracks) + { + run(collisions, bcs, sa_muons, global_muons, fwdtracks, mfttracks); } - PROCESS_SWITCH(skimmerPrimaryMuon, processRec_TTCA_SWT, "process reconstructed info only with TTCA", false); - - Partition global_muons_mc = o2::aod::fwdtrack::trackType == uint8_t(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack); // MFT-MCH-MID - Partition sa_muons_mc = o2::aod::fwdtrack::trackType == uint8_t(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack); // MCH-MID + PROCESS_SWITCH(skimmerPrimaryMuon, processRec, "process reconstructed info", true); - void processMC_SA(soa::Join const& collisions, aod::BCsWithTimestamps const&, MyTracksMC const& tracks, MFTTracksMC const&) + void processRec_SWT(MyCollisionsWithSWT const& collisions, aod::BCsWithTimestamps const& bcs, MyPropagatedFwdTracks const&, MyFwdTracks const& fwdtracks, aod::MFTTracks const& mfttracks) { - for (auto& collision : collisions) { - if (!collision.has_mcCollision()) { - continue; - } - auto bc = collision.template foundBC_as(); - initCCDB(bc); - fRegistry.fill(HIST("Event/hCollisionCounter"), 0.f); - if (!collision.isSelected()) { - continue; - } - - auto sa_muons_mc_per_coll = sa_muons_mc->sliceByCached(o2::aod::fwdtrack::collisionId, collision.globalIndex(), cache); - auto global_muons_mc_per_coll = global_muons_mc->sliceByCached(o2::aod::fwdtrack::collisionId, collision.globalIndex(), cache); - - int counter = 0; - int offset = emprimarymuons.lastIndex() + 1; - - for (auto& track : sa_muons_mc_per_coll) { - if (fillQAHistogram) { - fillTrackHistogram<3>(track, collision); - } - if (isSelected(track, collision)) { - map_new_sa_muon_index[std::make_pair(collision.globalIndex(), track.globalIndex())] = counter + offset; - counter++; - } - } // end of standalone muon loop - for (auto& track : global_muons_mc_per_coll) { - auto sa_muon = tracks.iteratorAt(track.matchMCHTrackId()); - if (!sa_muon.has_mcParticle()) { - continue; - } - if (fillQAHistogram) { - fillTrackHistogram<0>(track, collision); - } - if (map_new_sa_muon_index.find(std::make_pair(collision.globalIndex(), track.matchMCHTrackId())) == map_new_sa_muon_index.end()) { // don't apply muon selection to MCH-MID track in MFT-MCH-MID track - map_new_sa_muon_index[std::make_pair(collision.globalIndex(), track.matchMCHTrackId())] = counter + offset; - counter++; - } - if (isSelected(track, collision)) { - map_new_sa_muon_index[std::make_pair(collision.globalIndex(), track.globalIndex())] = counter + offset; - counter++; - } - } // end of global muon loop - - // fill table after mapping - for (const auto& [key, value] : map_new_sa_muon_index) { - // int collisionId = std::get<0>(key); - // int fwdtrackId = std::get<1>(key); - // int new_fwdtrackId = value; - // LOGF(info, "collisionId = %d, fwdtrackId = %d, new_fwdtrackId = %d", collisionId, fwdtrackId, new_fwdtrackId); - auto track = tracks.iteratorAt(std::get<1>(key)); - if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { - fillMuonTable(track, collision, value); - } else if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack)) { - fillMuonTable(track, collision, map_new_sa_muon_index[std::make_pair(collision.globalIndex(), track.matchMCHTrackId())]); - } - } - - map_new_sa_muon_index.clear(); - } // end of collision loop + run(collisions, bcs, sa_muons, global_muons, fwdtracks, mfttracks); } - PROCESS_SWITCH(skimmerPrimaryMuon, processMC_SA, "process reconstructed and MC info", false); + PROCESS_SWITCH(skimmerPrimaryMuon, processRec_SWT, "process reconstructed info only with standalone", false); - void processMC_TTCA(soa::Join const& collisions, aod::BCsWithTimestamps const&, MyTracksMC const& tracks, MFTTracksMC const&, aod::FwdTrackAssoc const& fwdtrackIndices) + void processMC(soa::Join const& collisions, aod::BCsWithTimestamps const& bcs, MyFwdTracksMC const& fwdtracks, MFTTracksMC const& mfttracks) { - for (auto& collision : collisions) { - if (!collision.has_mcCollision()) { - continue; - } - auto bc = collision.template foundBC_as(); - initCCDB(bc); - fRegistry.fill(HIST("Event/hCollisionCounter"), 0.f); - if (!collision.isSelected()) { - continue; - } - - int counter = 0; - int offset = emprimarymuons.lastIndex() + 1; - - auto fwdtrackIdsThisCollision = fwdtrackIndices.sliceBy(fwdtrackIndicesPerCollision, collision.globalIndex()); - for (auto& fwdtrackId : fwdtrackIdsThisCollision) { - auto track = fwdtrackId.template fwdtrack_as(); - // LOGF(info, "TTCA | track.globalIndex() = %d, track.trackType() = %d, track.matchMFTTrackId() = %d, track.matchMCHTrackId() = %d, track.offsets() = %d", track.globalIndex(), track.trackType(), track.matchMFTTrackId(), track.matchMCHTrackId(), track.offsets()); - - if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { - if (fillQAHistogram) { - fillTrackHistogram<3>(track, collision); - } - if (isSelected(track, collision)) { - map_new_sa_muon_index[std::make_pair(collision.globalIndex(), track.globalIndex())] = counter + offset; - counter++; - } - } else if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack)) { - auto sa_muon = tracks.iteratorAt(track.matchMCHTrackId()); - if (!sa_muon.has_mcParticle()) { - continue; - } - if (fillQAHistogram) { - fillTrackHistogram<0>(track, collision); - } - if (map_new_sa_muon_index.find(std::make_pair(collision.globalIndex(), track.matchMCHTrackId())) == map_new_sa_muon_index.end()) { - map_new_sa_muon_index[std::make_pair(collision.globalIndex(), track.matchMCHTrackId())] = counter + offset; - counter++; - } - if (isSelected(track, collision)) { - map_new_sa_muon_index[std::make_pair(collision.globalIndex(), track.globalIndex())] = counter + offset; - counter++; - } - } - } // end of track loop - - for (const auto& [key, value] : map_new_sa_muon_index) { - // int collisionId = std::get<0>(key); - // int fwdtrackId = std::get<1>(key); - // int new_fwdtrackId = value; - auto track = tracks.iteratorAt(std::get<1>(key)); - if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { - fillMuonTable(track, collision, value); - } else if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack)) { - fillMuonTable(track, collision, map_new_sa_muon_index[std::make_pair(collision.globalIndex(), track.matchMCHTrackId())]); - } - } - - map_new_sa_muon_index.clear(); - } // end of collision loop + run(collisions, bcs, sa_muons, global_muons, fwdtracks, mfttracks); } - PROCESS_SWITCH(skimmerPrimaryMuon, processMC_TTCA, "process reconstructed and MC info with TTCA", false); + PROCESS_SWITCH(skimmerPrimaryMuon, processMC, "process reconstructed and MC info", false); }; struct associateAmbiguousMuon { Produces em_amb_muon_ids; @@ -815,15 +315,11 @@ struct associateAmbiguousMuon { ambmuon_self_Ids.clear(); ambmuon_self_Ids.shrink_to_fit(); } - - // for (auto& muon : muons) { - // auto sa_muon = muon.template matchMCHTrack_as(); - // LOGF(info, "muon.collisionId() = %d , muon.globalIndex() = %d, muon.fwdtrackId() = %d , muon.trackType() = %d, muon.matchMCHTrackId() = %d, sa_muon.fwdtrackId() = %d", muon.collisionId(), muon.globalIndex(), muon.fwdtrackId(), muon.trackType(), muon.matchMCHTrackId(), sa_muon.fwdtrackId()); - // } } }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{adaptAnalysisTask(cfgc, TaskName{"skimmer-primary-muon"}), - adaptAnalysisTask(cfgc, TaskName{"associate-ambiguous-muon"})}; + return WorkflowSpec{ + adaptAnalysisTask(cfgc, TaskName{"skimmer-primary-muon"}), + adaptAnalysisTask(cfgc, TaskName{"associate-ambiguous-muon"})}; } diff --git a/PWGEM/Dilepton/Utils/EMTrackUtilities.h b/PWGEM/Dilepton/Utils/EMTrackUtilities.h index e26e9760bab..f91fa9bb6cd 100644 --- a/PWGEM/Dilepton/Utils/EMTrackUtilities.h +++ b/PWGEM/Dilepton/Utils/EMTrackUtilities.h @@ -35,7 +35,7 @@ float dca3DinSigma(T const& track) if (det < 0) { return 999.f; } else { - return std::sqrt(std::abs((dcaXY * dcaXY * cZZ + dcaZ * dcaZ * cYY - 2. * dcaXY * dcaZ * cZY) / det / 2.)); // dca 3d in sigma + return std::sqrt(std::fabs((dcaXY * dcaXY * cZZ + dcaZ * dcaZ * cYY - 2. * dcaXY * dcaZ * cZY) / det / 2.)); // dca 3d in sigma } } //_______________________________________________________________________ @@ -64,7 +64,7 @@ float fwdDcaXYinSigma(T const& track) if (det < 0) { return 999.f; } else { - return std::sqrt(std::abs((dcaX * dcaX * cYY + dcaY * dcaY * cXX - 2. * dcaX * dcaY * cXY) / det / 2.)); // dca xy in sigma + return std::sqrt(std::fabs((dcaX * dcaX * cYY + dcaY * dcaY * cXX - 2. * dcaX * dcaY * cXY) / det / 2.)); // dca xy in sigma } } //_______________________________________________________________________ From e125bf461d2d4720b9f87755e82af083d531146e Mon Sep 17 00:00:00 2001 From: Preet-Bhanjan Date: Fri, 28 Mar 2025 21:33:53 +0100 Subject: [PATCH 0859/1650] [PWGCF] Bootstrap and weights added for resonance flow (#10687) --- PWGCF/Flow/Tasks/resonancesGfwFlow.cxx | 300 ++++++++++++++++++++++++- 1 file changed, 292 insertions(+), 8 deletions(-) diff --git a/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx b/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx index b107c8fdcfc..2c097b33af3 100644 --- a/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx +++ b/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx @@ -19,6 +19,7 @@ #include #include #include +#include #include "Math/Vector4D.h" @@ -61,6 +62,27 @@ using namespace o2::framework; using namespace o2::framework::expressions; using namespace std; +namespace +{ +std::shared_ptr phiC22Boot[10]; +std::shared_ptr phiC24Boot[10]; +std::shared_ptr k0C22Boot[10]; +std::shared_ptr k0C24Boot[10]; +std::shared_ptr lambdaC22Boot[10]; +std::shared_ptr lambdaC24Boot[10]; +std::shared_ptr anLambdaC22Boot[10]; +std::shared_ptr anLambdaC24Boot[10]; + +std::shared_ptr phiD22PtBoot[10]; +std::shared_ptr phiD24PtBoot[10]; +std::shared_ptr k0D22PtBoot[10]; +std::shared_ptr k0D24PtBoot[10]; +std::shared_ptr lambdaD22PtBoot[10]; +std::shared_ptr lambdaD24PtBoot[10]; +std::shared_ptr anLambdaD22PtBoot[10]; +std::shared_ptr anLambdaD24PtBoot[10]; +} // namespace + #define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable NAME{#NAME, DEFAULT, HELP}; struct ResonancesGfwFlow { @@ -118,6 +140,14 @@ struct ResonancesGfwFlow { O2_DEFINE_CONFIGURABLE(cfgNK0MassBins, double, 70, "Invasriant mass bins for K0") O2_DEFINE_CONFIGURABLE(cfgNLambdaMassBins, double, 70, "Invasriant mass bins for lambda") + O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeights, bool, true, "Fill and output NUA weights") + O2_DEFINE_CONFIGURABLE(cfgAcceptance, std::string, "", "CCDB path to acceptance object") + + O2_DEFINE_CONFIGURABLE(cfgUseWeightPhiEtaVtxz, bool, true, "Use Phi, Eta, VertexZ dependent NUA weights") + O2_DEFINE_CONFIGURABLE(cfgUseWeightPhiPtCent, bool, false, "Use Phi, Pt, Centrality dependent NUA weights") + O2_DEFINE_CONFIGURABLE(cfgUseWeightPhiEtaPt, bool, false, "Use Phi, Eta, Pt dependent NUA weights") + O2_DEFINE_CONFIGURABLE(cfgUseBootStrap, bool, true, "Use bootstrap for error estimation") + // Defining configurable axis ConfigurableAxis axisVertex{"axisVertex", {20, -10, 10}, "vertex axis for histograms"}; ConfigurableAxis axisPhi{"axisPhi", {60, 0.0, constants::math::TwoPI}, "phi axis for histograms"}; @@ -154,6 +184,18 @@ struct ResonancesGfwFlow { TAxis* fLambdaMassAxis; TRandom3* fRndm = new TRandom3(0); + enum OutputSpecies { + hRef = 0, + hK0 = 1, + hLambda = 2, + hAnLambda = 3, + hPhi = 4, + kCount_OutputSpecies + }; + + std::vector mAcceptance; + bool correctionsLoaded = false; + void init(InitContext const&) { ccdb->setURL(ccdbUrl.value); @@ -255,6 +297,48 @@ struct ResonancesGfwFlow { histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(10, "Daughter track selection"); histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(11, "Mass cross check"); + if (cfgOutputNUAWeights) { + histos.add("NUA/hPhiEtaVtxz_ref", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); + histos.add("NUA/hPhiEtaVtxz_k0", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); + histos.add("NUA/hPhiEtaVtxz_lambda", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); + histos.add("NUA/hPhiEtaVtxz_anlambda", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); + histos.add("NUA/hPhiEtaVtxz_phi", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); + + histos.add("NUA/hPhiPtCent_ref", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, {100, 0, 10}, {100, 0, 100}}}); + histos.add("NUA/hPhiPtCent_k0", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, {100, 0, 10}, {100, 0, 100}}}); + histos.add("NUA/hPhiPtCent_lambda", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, {100, 0, 10}, {100, 0, 100}}}); + histos.add("NUA/hPhiPtCent_anlambda", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, {100, 0, 10}, {100, 0, 100}}}); + histos.add("NUA/hPhiPtCent_phi", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, {100, 0, 10}, {100, 0, 100}}}); + + histos.add("NUA/hPhiEtaPt_ref", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {100, 0, 10}}}); + histos.add("NUA/hPhiEtaPt_k0", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {100, 0, 10}}}); + histos.add("NUA/hPhiEtaPt_lambda", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {100, 0, 10}}}); + histos.add("NUA/hPhiEtaPt_anlambda", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {100, 0, 10}}}); + histos.add("NUA/hPhiEtaPt_phi", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {100, 0, 10}}}); + } + + if (cfgUseBootStrap) { + for (int i = 0; i < 10; i++) { + phiC22Boot[i] = histos.add(Form("BootStrap/Phic22_bootstrap_%d", i), "", {HistType::kTProfile, {axisMultiplicity}}); + phiC24Boot[i] = histos.add(Form("BootStrap/Phic24_bootstrap_%d", i), "", {HistType::kTProfile, {axisMultiplicity}}); + k0C22Boot[i] = histos.add(Form("BootStrap/k0c22_bootstrap_%d", i), "", {HistType::kTProfile, {axisMultiplicity}}); + k0C24Boot[i] = histos.add(Form("BootStrap/k0c24_bootstrap_%d", i), "", {HistType::kTProfile, {axisMultiplicity}}); + lambdaC22Boot[i] = histos.add(Form("BootStrap/lambdac22_bootstrap_%d", i), "", {HistType::kTProfile, {axisMultiplicity}}); + lambdaC24Boot[i] = histos.add(Form("BootStrap/lambdac24_bootstrap_%d", i), "", {HistType::kTProfile, {axisMultiplicity}}); + anLambdaC22Boot[i] = histos.add(Form("BootStrap/anlambdac22_bootstrap_%d", i), "", {HistType::kTProfile, {axisMultiplicity}}); + anLambdaC24Boot[i] = histos.add(Form("BootStrap/anlambdac24_bootstrap_%d", i), "", {HistType::kTProfile, {axisMultiplicity}}); + + phiD22PtBoot[i] = histos.add(Form("BootStrap/Phid22pt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); + phiD24PtBoot[i] = histos.add(Form("BootStrap/Phid24pt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); + k0D22PtBoot[i] = histos.add(Form("BootStrap/k0d22pt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisK0Mass, axisMultiplicity}}); + k0D24PtBoot[i] = histos.add(Form("BootStrap/k0d24pt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisK0Mass, axisMultiplicity}}); + lambdaD22PtBoot[i] = histos.add(Form("BootStrap/lambdad22pt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); + lambdaD24PtBoot[i] = histos.add(Form("BootStrap/lambdad24pt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); + anLambdaD22PtBoot[i] = histos.add(Form("BootStrap/anlambdad22pt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); + anLambdaD24PtBoot[i] = histos.add(Form("BootStrap/anlambdad24pt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); + } + } + o2::framework::AxisSpec axis = axisPt; int nPtBins = axis.binEdges.size() - 1; double* ptBins = &(axis.binEdges)[0]; @@ -365,6 +449,36 @@ struct ResonancesGfwFlow { return; } + void fillProfileBoot(const GFW::CorrConfig& corrconf, std::shared_ptr profile, const double& cent) + { + double dnx, val; + if (!corrconf.pTDif) { + dnx = fGFW->Calculate(corrconf, 0, kTRUE).real(); + if (dnx == 0) + return; + val = fGFW->Calculate(corrconf, 0, kFALSE).real() / dnx; + if (std::fabs(val) < 1) + profile->Fill(cent, val, dnx); + return; + } + return; + } + + void fillProfileBoot3D(const GFW::CorrConfig& corrconf, std::shared_ptr profile, const double& cent, TAxis* partaxis) + { + double dnx, val; + for (int i = 1; i <= fPtAxis->GetNbins(); i++) { + for (int j = 1; j <= partaxis->GetNbins(); j++) { + dnx = fGFW->Calculate(corrconf, ((i - 1) * partaxis->GetNbins()) + (j - 1), kTRUE).real(); + if (dnx == 0) + continue; + val = fGFW->Calculate(corrconf, ((i - 1) * partaxis->GetNbins()) + (j - 1), kFALSE).real() / dnx; + if (std::fabs(val) < 1) + profile->Fill(fPtAxis->GetBinCenter(i), partaxis->GetBinCenter(j), cent, val, dnx); + } + } + return; + } // Cosine pointing angle cut template bool selectionPair(const TTrack1& track1, const TTrack2& track2) @@ -431,6 +545,118 @@ struct ResonancesGfwFlow { return pid + 1; // shift the pid by 1, 1 = pion, 2 = kaon, 3 = proton } + void loadCorrections(aod::BCsWithTimestamps::iterator const& bc) + { + if (correctionsLoaded) + return; + if (!cfgAcceptance.value.empty()) { + uint64_t timestamp = bc.timestamp(); + mAcceptance.clear(); + mAcceptance.resize(kCount_OutputSpecies); + + mAcceptance[hRef] = ccdb->getForTimeStamp(cfgAcceptance.value + "_ref", timestamp); + if (mAcceptance[hRef]) + LOGF(info, "Loaded acceptance weights from %s_ref (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hRef]); + else + LOGF(fatal, "Could not load acceptance weights from %s_ref (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hRef]); + + mAcceptance[hK0] = ccdb->getForTimeStamp(cfgAcceptance.value + "_k0", timestamp); + if (mAcceptance[hK0]) + LOGF(info, "Loaded acceptance weights from %s_k0 (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hK0]); + else + LOGF(fatal, "Could not load acceptance weights from %s_k0 (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hK0]); + + mAcceptance[hLambda] = ccdb->getForTimeStamp(cfgAcceptance.value + "_lambda", timestamp); + if (mAcceptance[hLambda]) + LOGF(info, "Loaded acceptance weights from %s_lambda (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hLambda]); + else + LOGF(fatal, "Could not load acceptance weights from %s_lambda (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hLambda]); + + mAcceptance[hAnLambda] = ccdb->getForTimeStamp(cfgAcceptance.value + "_hanlambda", timestamp); + if (mAcceptance[hAnLambda]) + LOGF(info, "Loaded acceptance weights from %s_anlambda (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hAnLambda]); + else + LOGF(fatal, "Could not load acceptance weights from %s_anlambda (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hAnLambda]); + + mAcceptance[hPhi] = ccdb->getForTimeStamp(cfgAcceptance.value + "_phi", timestamp); + if (mAcceptance[hPhi]) + LOGF(info, "Loaded acceptance weights from %s_phi (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hPhi]); + else + LOGF(fatal, "Could not load acceptance weights from %s_phi (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hPhi]); + } + + correctionsLoaded = true; + } + + template + double getAcceptance(TTrack track, const TCollision collision, int pid_index_reso) + { // 0 = ref, 1 = k0, 2 = lambda, 3 = anti-lambda, 4 = phi + if (pid_index_reso < 0 || pid_index_reso >= kCount_OutputSpecies) { + return 1; + } + + double wacc = 1; + double cent = collision.centFT0C(); + double vtxz = collision.posZ(); + + if ((cfgUseWeightPhiEtaVtxz && cfgUseWeightPhiPtCent) || (cfgUseWeightPhiEtaPt && cfgUseWeightPhiPtCent) || (cfgUseWeightPhiEtaVtxz && cfgUseWeightPhiEtaPt)) { + LOGF(fatal, "Only one of the three weight options can be used at a time"); + } + if (!mAcceptance.empty() && correctionsLoaded) { + if (!mAcceptance[pid_index_reso]) { + LOGF(fatal, "Acceptance weights not loaded for pidIndex %d", pid_index_reso); + return 1; + } + if (cfgUseWeightPhiEtaVtxz) + wacc = mAcceptance[pid_index_reso]->getNUA(track.phi(), track.eta(), vtxz); + if (cfgUseWeightPhiPtCent) + wacc = mAcceptance[pid_index_reso]->getNUA(track.phi(), track.pt(), cent); + if (cfgUseWeightPhiEtaPt) + wacc = mAcceptance[pid_index_reso]->getNUA(track.phi(), track.eta(), track.pt()); + } + return wacc; + } + + template + void fillWeights(const TTrack track, const TCollision collision, const int& pid_index_reso) + { + double cent = collision.centFT0C(); + double vtxz = collision.posZ(); + double pt = track.pt(); + bool withinPtPOI = (cfgCutPtPOIMin < pt) && (pt < cfgCutPtPOIMax); // within POI pT range + bool withinPtRef = (cfgCutPtMin < pt) && (pt < cfgCutPtMax); // within RF pT range + + if (withinPtRef && !pid_index_reso) + histos.fill(HIST("NUA/hPhiEtaVtxz_ref"), track.phi(), track.eta(), vtxz); // pt-subset of charged particles for ref flow + histos.fill(HIST("NUA/hPhiPtCent_ref"), track.phi(), track.pt(), cent); + histos.fill(HIST("NUA/hPhiEtaPt_ref"), track.phi(), track.eta(), track.pt()); + + if (withinPtPOI) { + switch (pid_index_reso) { + case hK0: + histos.fill(HIST("NUA/hPhiEtaVtxz_k0"), track.phi(), track.eta(), vtxz); // K0 weights + histos.fill(HIST("NUA/hPhiPtCent_k0"), track.phi(), track.pt(), cent); + histos.fill(HIST("NUA/hPhiEtaPt_k0"), track.phi(), track.eta(), track.pt()); + break; + case hLambda: + histos.fill(HIST("NUA/hPhiEtaVtxz_lambda"), track.phi(), track.eta(), vtxz); // Lambda weights + histos.fill(HIST("NUA/hPhiPtCent_lambda"), track.phi(), track.pt(), cent); + histos.fill(HIST("NUA/hPhiEtaPt_lambda"), track.phi(), track.eta(), track.pt()); + break; + case hAnLambda: + histos.fill(HIST("NUA/hPhiEtaVtxz_anlambda"), track.phi(), track.eta(), vtxz); // Anti-Lambda weights + histos.fill(HIST("NUA/hPhiPtCent_anlambda"), track.phi(), track.pt(), cent); + histos.fill(HIST("NUA/hPhiEtaPt_anlambda"), track.phi(), track.eta(), track.pt()); + break; + case hPhi: + histos.fill(HIST("NUA/hPhiEtaVtxz_phi"), track.phi(), track.eta(), vtxz); // Phi weights + histos.fill(HIST("NUA/hPhiPtCent_phi"), track.phi(), track.pt(), cent); + histos.fill(HIST("NUA/hPhiEtaPt_phi"), track.phi(), track.eta(), track.pt()); + break; + } + } + } + template void resurrectPhi(TTrack trackplus, TTrack trackminus, vector plusdaug, vector minusdaug, vector mom, double plusmass, const ConstStr& hist, const double cent) { @@ -562,11 +788,17 @@ struct ResonancesGfwFlow { bool withinPtPOI = (cfgCutPtPOIMin < candidate.pt()) && (candidate.pt() < cfgCutPtPOIMax); // within POI pT range bool withinPtRef = (cfgCutPtMin < candidate.pt()) && (candidate.pt() < cfgCutPtMax); + float weff = 1; + if (isL) { + if (cfgOutputNUAWeights) + fillWeights(candidate, collision, hLambda); + + double waccPOI = getAcceptance(candidate, collision, hLambda); if (withinPtPOI) - fGFW->Fill(candidate.eta(), ((fPtAxis->FindBin(candidate.pt()) - 1) * fLambdaMassAxis->GetNbins()) + (fLambdaMassAxis->FindBin(mlambda) - 1), candidate.phi(), 1.0, 8); + fGFW->Fill(candidate.eta(), ((fPtAxis->FindBin(candidate.pt()) - 1) * fLambdaMassAxis->GetNbins()) + (fLambdaMassAxis->FindBin(mlambda) - 1), candidate.phi(), waccPOI * weff, 8); if (withinPtPOI && withinPtRef) - fGFW->Fill(candidate.eta(), ((fPtAxis->FindBin(candidate.pt()) - 1) * fLambdaMassAxis->GetNbins()) + (fLambdaMassAxis->FindBin(mlambda) - 1), candidate.phi(), 1.0, 128); + fGFW->Fill(candidate.eta(), ((fPtAxis->FindBin(candidate.pt()) - 1) * fLambdaMassAxis->GetNbins()) + (fLambdaMassAxis->FindBin(mlambda) - 1), candidate.phi(), waccPOI * weff, 128); histos.fill(HIST("hLambdaMass_sparse"), mlambda, candidate.pt(), collision.centFT0C()); histos.fill(HIST("hLambdaPhi"), candidate.phi()); @@ -577,10 +809,14 @@ struct ResonancesGfwFlow { histos.fill(HIST("MinusTOF_L"), negtrack.pt(), negtrack.tofNSigmaKa()); } if (isAL) { + if (cfgOutputNUAWeights) + fillWeights(candidate, collision, hAnLambda); + + double waccPOI = getAcceptance(candidate, collision, hAnLambda); if (withinPtPOI) - fGFW->Fill(candidate.eta(), ((fPtAxis->FindBin(candidate.pt()) - 1) * fLambdaMassAxis->GetNbins()) + (fLambdaMassAxis->FindBin(mantilambda) - 1), candidate.phi(), 1.0, 16); + fGFW->Fill(candidate.eta(), ((fPtAxis->FindBin(candidate.pt()) - 1) * fLambdaMassAxis->GetNbins()) + (fLambdaMassAxis->FindBin(mantilambda) - 1), candidate.phi(), waccPOI * weff, 16); if (withinPtPOI && withinPtRef) - fGFW->Fill(candidate.eta(), ((fPtAxis->FindBin(candidate.pt()) - 1) * fLambdaMassAxis->GetNbins()) + (fLambdaMassAxis->FindBin(mantilambda) - 1), candidate.phi(), 1.0, 256); + fGFW->Fill(candidate.eta(), ((fPtAxis->FindBin(candidate.pt()) - 1) * fLambdaMassAxis->GetNbins()) + (fLambdaMassAxis->FindBin(mantilambda) - 1), candidate.phi(), waccPOI * weff, 256); histos.fill(HIST("hAntiLambdaMass_sparse"), mantilambda, candidate.pt(), collision.centFT0C()); histos.fill(HIST("hAntiLambdaPhi"), candidate.phi()); @@ -644,10 +880,16 @@ struct ResonancesGfwFlow { bool withinPtPOI = (cfgCutPtPOIMin < candidate.pt()) && (candidate.pt() < cfgCutPtPOIMax); // within POI pT range bool withinPtRef = (cfgCutPtMin < candidate.pt()) && (candidate.pt() < cfgCutPtMax); + if (cfgOutputNUAWeights) + fillWeights(candidate, collision, hK0); + + float weff = 1; + double waccPOI = getAcceptance(candidate, collision, hK0); + if (withinPtPOI) - fGFW->Fill(candidate.eta(), ((fPtAxis->FindBin(candidate.pt()) - 1) * fK0MassAxis->GetNbins()) + (fK0MassAxis->FindBin(mk0) - 1), candidate.phi(), 1.0, 4); + fGFW->Fill(candidate.eta(), ((fPtAxis->FindBin(candidate.pt()) - 1) * fK0MassAxis->GetNbins()) + (fK0MassAxis->FindBin(mk0) - 1), candidate.phi(), waccPOI * weff, 4); if (withinPtPOI && withinPtRef) - fGFW->Fill(candidate.eta(), ((fPtAxis->FindBin(candidate.pt()) - 1) * fK0MassAxis->GetNbins()) + (fK0MassAxis->FindBin(mk0) - 1), candidate.phi(), 1.0, 64); + fGFW->Fill(candidate.eta(), ((fPtAxis->FindBin(candidate.pt()) - 1) * fK0MassAxis->GetNbins()) + (fK0MassAxis->FindBin(mk0) - 1), candidate.phi(), waccPOI * weff, 64); histos.fill(HIST("hK0Mass_sparse"), mk0, candidate.pt(), collision.centFT0C()); histos.fill(HIST("hK0Phi"), candidate.phi()); @@ -704,13 +946,16 @@ struct ResonancesGfwFlow { const auto cent = collision.centFT0C(); float vtxz = collision.posZ(); + auto bc = collision.bc_as(); histos.fill(HIST("hVtxZ"), vtxz); histos.fill(HIST("hMult"), nTot); histos.fill(HIST("hCent"), cent); fGFW->Clear(); - float weff = 1, wacc = 1; + float weff = 1; + + loadCorrections(bc); // load corrections for the each event for (auto const& track : tracks) { if (!selectionTrack(track)) @@ -719,7 +964,11 @@ struct ResonancesGfwFlow { bool withinPtRef = (cfgCutPtMin < pt) && (pt < cfgCutPtMax); if (withinPtRef) - fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), wacc * weff, 1); + if (cfgOutputNUAWeights) + fillWeights(track, collision, hRef); + + double waccRef = getAcceptance(track, collision, 0); + fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), waccRef * weff, 1); } auto posSlicedTracks = posTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); @@ -763,6 +1012,41 @@ struct ResonancesGfwFlow { fillResoProfile(corrconfigs.at(22), HIST("Lambdav24pt"), cent, fLambdaMassAxis); fillResoProfile(corrconfigs.at(23), HIST("AnLambdav24pt"), cent, fLambdaMassAxis); + // bootstraping + if (cfgUseBootStrap) { + TRandom3* rand = new TRandom3(0); + double r = rand->Rndm(); + int bootId = static_cast(r * 10); + + fillProfileBoot(corrconfigs.at(0), phiC22Boot[bootId], cent); + fillProfileBoot(corrconfigs.at(1), k0C22Boot[bootId], cent); + fillProfileBoot(corrconfigs.at(2), lambdaC22Boot[bootId], cent); + fillProfileBoot(corrconfigs.at(3), anLambdaC22Boot[bootId], cent); + fillProfileBoot(corrconfigs.at(4), phiC24Boot[bootId], cent); + fillProfileBoot(corrconfigs.at(5), k0C24Boot[bootId], cent); + fillProfileBoot(corrconfigs.at(6), lambdaC24Boot[bootId], cent); + fillProfileBoot(corrconfigs.at(7), anLambdaC24Boot[bootId], cent); + + fillProfileBoot3D(corrconfigs.at(8), phiD22PtBoot[bootId], cent, fPhiMassAxis); + fillProfileBoot3D(corrconfigs.at(9), k0D22PtBoot[bootId], cent, fK0MassAxis); + fillProfileBoot3D(corrconfigs.at(10), lambdaD22PtBoot[bootId], cent, fLambdaMassAxis); + fillProfileBoot3D(corrconfigs.at(11), anLambdaD22PtBoot[bootId], cent, fLambdaMassAxis); + + fillProfileBoot3D(corrconfigs.at(12), phiD24PtBoot[bootId], cent, fPhiMassAxis); + fillProfileBoot3D(corrconfigs.at(13), k0D24PtBoot[bootId], cent, fK0MassAxis); + fillProfileBoot3D(corrconfigs.at(14), lambdaD24PtBoot[bootId], cent, fLambdaMassAxis); + fillProfileBoot3D(corrconfigs.at(15), anLambdaD24PtBoot[bootId], cent, fLambdaMassAxis); + + fillProfileBoot3D(corrconfigs.at(16), phiD22PtBoot[bootId], cent, fPhiMassAxis); + fillProfileBoot3D(corrconfigs.at(17), k0D22PtBoot[bootId], cent, fK0MassAxis); + fillProfileBoot3D(corrconfigs.at(18), lambdaD22PtBoot[bootId], cent, fLambdaMassAxis); + fillProfileBoot3D(corrconfigs.at(19), anLambdaD22PtBoot[bootId], cent, fLambdaMassAxis); + + fillProfileBoot3D(corrconfigs.at(20), phiD24PtBoot[bootId], cent, fPhiMassAxis); + fillProfileBoot3D(corrconfigs.at(21), k0D24PtBoot[bootId], cent, fK0MassAxis); + fillProfileBoot3D(corrconfigs.at(22), lambdaD24PtBoot[bootId], cent, fLambdaMassAxis); + fillProfileBoot3D(corrconfigs.at(23), anLambdaD24PtBoot[bootId], cent, fLambdaMassAxis); + } } // end of process }; From 97bacbe91f53d4937ee44381bfbc51399d1f96d9 Mon Sep 17 00:00:00 2001 From: Yunfan Liu Date: Fri, 28 Mar 2025 21:34:21 +0100 Subject: [PATCH 0860/1650] [PWGHF] check pion -> mu in MC match for Omegac0 To Omega Pi (#10651) --- PWGHF/D2H/Tasks/taskOmegac0ToOmegapi.cxx | 7 +- .../DataModel/CandidateReconstructionTables.h | 3 +- .../candidateCreatorXic0Omegac0.cxx | 238 ++++++++++-------- 3 files changed, 144 insertions(+), 104 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskOmegac0ToOmegapi.cxx b/PWGHF/D2H/Tasks/taskOmegac0ToOmegapi.cxx index e65bf9d590b..75eaec9a57e 100644 --- a/PWGHF/D2H/Tasks/taskOmegac0ToOmegapi.cxx +++ b/PWGHF/D2H/Tasks/taskOmegac0ToOmegapi.cxx @@ -66,6 +66,7 @@ struct HfTaskOmegac0ToOmegapi { ConfigurableAxis thnConfigAxisPt{"thnConfigAxisPt", {100, 0, 20}, "Cand. pT bins"}; ConfigurableAxis thnConfigAxisY{"thnConfigAxisY", {20, -1, 1}, "Cand. rapidity bins"}; ConfigurableAxis thnConfigAxisOrigin{"thnConfigAxisOrigin", {3, -0.5, 2.5}, "Cand. origin type"}; + ConfigurableAxis thnConfigAxisMatchFlag{"thnConfigAxisMatchFlag", {15, -7.5, 7.5}, "Cand. MC Match Flag type"}; ConfigurableAxis thnConfigAxisGenPtD{"thnConfigAxisGenPtD", {500, 0, 50}, "Gen Pt D"}; ConfigurableAxis thnConfigAxisGenPtB{"thnConfigAxisGenPtB", {1000, 0, 100}, "Gen Pt B"}; ConfigurableAxis thnConfigAxisNumPvContr{"thnConfigAxisNumPvContr", {200, -0.5, 199.5}, "Number of PV contributors"}; @@ -85,6 +86,7 @@ struct HfTaskOmegac0ToOmegapi { const AxisSpec thnAxisPtB{thnConfigAxisPtB, "#it{p}_{T}^{B} (GeV/#it{c})"}; const AxisSpec thnAxisY{thnConfigAxisY, "y"}; const AxisSpec thnAxisOrigin{thnConfigAxisOrigin, "Origin"}; + const AxisSpec thnAxisMatchFlag{thnConfigAxisMatchFlag, "MatchFlag"}; const AxisSpec thnAxisGenPtD{thnConfigAxisGenPtD, "#it{p}_{T} (GeV/#it{c})"}; const AxisSpec thnAxisGenPtB{thnConfigAxisGenPtB, "#it{p}_{T}^{B} (GeV/#it{c})"}; const AxisSpec thnAxisNumPvContr{thnConfigAxisNumPvContr, "Number of PV contributors"}; @@ -103,6 +105,7 @@ struct HfTaskOmegac0ToOmegapi { if (doprocessMcWithKFParticle || doprocessMcWithKFParticleMl) { axes.push_back(thnAxisPtB); axes.push_back(thnAxisOrigin); + axes.push_back(thnAxisMatchFlag); axes.push_back(thnAxisNumPvContr); } if (applyMl) { @@ -178,10 +181,10 @@ struct HfTaskOmegac0ToOmegapi { if (candidate.resultSelections() && !selectionFlagOmegac0) if (candidate.flagMcMatchRec() == (1 << aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi)) { if constexpr (applyMl) { - registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsOmegac0Type"), candidate.mlProbOmegac()[0], massOmegac0, ptCandidate, rapidityCandidate, candidate.ptBhadMotherPart(), candidate.originRec(), numPvContributors); + registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsOmegac0Type"), candidate.mlProbOmegac()[0], massOmegac0, ptCandidate, rapidityCandidate, candidate.ptBhadMotherPart(), candidate.originRec(), candidate.flagMcMatchRec(), numPvContributors); } else { - registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsOmegac0Type"), massOmegac0, ptCandidate, rapidityCandidate, candidate.ptBhadMotherPart(), candidate.originRec(), numPvContributors); + registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsOmegac0Type"), massOmegac0, ptCandidate, rapidityCandidate, candidate.ptBhadMotherPart(), candidate.originRec(), candidate.flagMcMatchRec(), numPvContributors); } } } diff --git a/PWGHF/DataModel/CandidateReconstructionTables.h b/PWGHF/DataModel/CandidateReconstructionTables.h index ea2eb1b37a5..b82e0195f42 100644 --- a/PWGHF/DataModel/CandidateReconstructionTables.h +++ b/PWGHF/DataModel/CandidateReconstructionTables.h @@ -1397,7 +1397,8 @@ DECLARE_SOA_DYNAMIC_COLUMN(PtKaFromCasc, ptKaFromCasc, enum DecayType { XiczeroToXiPi = 0, OmegaczeroToXiPi, OmegaczeroToOmegaPi, - OmegaczeroToOmegaK }; + OmegaczeroToOmegaK, + OmegaczeroToOmegaPiOneMu }; } // end of namespace hf_cand_xic0_omegac0 diff --git a/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx b/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx index f112f0f71ee..01a52fc073e 100644 --- a/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx +++ b/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx @@ -74,6 +74,13 @@ using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::hf_evsel; +enum McMatchFlag : uint8_t { + None = 0, + CharmbaryonUnmatched, + CascUnmatched, + V0Unmatched +}; + // Reconstruction of omegac0 and xic0 candidates struct HfCandidateCreatorXic0Omegac0 { Produces rowCandToXiPi; @@ -285,7 +292,10 @@ struct HfCandidateCreatorXic0Omegac0 { registry.add("hKfChi2TopoPiFromCharmBaryon", "hKfChi2TopoPifromCharmBaryon", kTH1F, {{2000, -0.1f, 1000.0f}}); registry.add("hKfNdfPiFromCharmBaryon", "hKfNDfPifromCharmBaryon", kTH1F, {{2000, -0.1f, 200.0f}}); registry.add("hKfChi2OverNdfPiFromCharmBaryon", "hKfChi2OverNdfPifromCharmBaryon", kTH1F, {{1000, -0.1f, 200.0f}}); - registry.add("hKfDeviationPiFromCharmBaryon", "hKfChi2OverNdfPifromCharmBaryon", kTH1F, {{1000, -0.1f, 200.0f}}); + registry.add("hKFParticlechi2TopoOmegacToPv", "hKFParticlechi2TopoOmegacToPv", kTH1D, {{1000, -0.1f, 100.0f}}); + registry.add("hKfNdfOmegacToPv", "hKfNDfOmegacToPv", kTH1F, {{2000, -0.1f, 200.0f}}); + registry.add("hKfChi2TopoOmegacToPv", "hKfChi2TopoOmegacToPv", kTH1F, {{1000, -0.1f, 200.0f}}); + registry.add("hKfDeviationPiFromCharmBaryon", "hKfDeviationPiFromCharmBaryon", kTH1F, {{1000, -0.1f, 200.0f}}); registry.add("hKFParticleCascBachTopoChi2", "hKFParticleCascBachTopoChi2", kTH1D, {{1000, -0.1f, 100.0f}}); registry.add("hKFParticleDcaCharmBaryonDau", "hKFParticleDcaCharmBaryonDau", kTH1D, {{1000, -0.1f, 1.0f}}); registry.add("hKFParticleDcaXYCascBachToPv", "hKFParticleDcaXYCascBachToPv", kTH1D, {{1000, -0.1f, 15.0f}}); @@ -298,39 +308,39 @@ struct HfCandidateCreatorXic0Omegac0 { registry.add("hInvMassOmegaMinus", "hInvMassOmegaMinus", kTH1D, {{1000, 1.6f, 2.0f}}); registry.add("hInvMassXiMinus", "hInvMassXiMinus", kTH1D, {{1000, 1.25f, 1.65f}}); registry.add("hInvMassXiMinus_rej", "hInvMassXiMinus_rej", kTH1D, {{1000, 1.25f, 1.65f}}); - - // Additional KFParticle Histograms - registry.add("hKFParticlechi2TopoOmegacToPv", "hKFParticlechi2TopoOmegacToPv", kTH1D, {{1000, -0.1f, 100.0f}}); registry.add("hKFParticlechi2TopoCascToPv", "hKFParticlechi2TopoCascToPv", kTH1D, {{1000, -0.1f, 100.0f}}); registry.add("hKFParticleDcaXYV0DauPosToPv", "hKFParticleDcaXYV0DauPosToPv", kTH1D, {{1000, -0.1f, 30.0f}}); registry.add("hKFParticleDcaXYV0DauNegToPv", "hKFParticleDcaXYV0DauNegToPv", kTH1D, {{1000, -0.1f, 30.0f}}); - registry.add("hEtaV0PosDau", "hEtaV0PosDau", kTH1D, {{1000, -5.0f, 5.0f}}); - registry.add("hEtaV0NegDau", "hEtaV0NegDau", kTH1D, {{1000, -5.0f, 5.0f}}); - registry.add("hEtaKaFromCasc", "hEtaKaFromCasc", kTH1D, {{1000, -5.0f, 5.0f}}); - registry.add("hEtaPiFromCharmBaryon", "hEtaPiFromCharmBaryon", kTH1D, {{1000, -5.0f, 5.0f}}); - registry.add("hCascradius", "hCascradius", kTH1D, {{1000, 0.0f, 50.0f}}); - registry.add("hV0radius", "hV0radius", kTH1D, {{1000, 0.0f, 50.0f}}); - registry.add("hCosPACasc", "hCosPACasc", kTH1D, {{5000, 0.8f, 1.1f}}); - registry.add("hCosPAV0", "hCosPAV0", kTH1D, {{5000, 0.8f, 1.1f}}); - registry.add("hDcaCascDau", "hDcaCascDau", kTH1D, {{1000, -0.1f, 10.0f}}); - registry.add("hDcaV0Dau", "hDcaV0Dau", kTH1D, {{1000, -0.1f, 10.0f}}); - registry.add("hDcaXYToPvKa", "hDcaXYToPvKa", kTH1D, {{1000, -0.1f, 10.0f}}); - registry.add("hImpactParBachFromCharmBaryonXY", "hImpactParBachFromCharmBaryonXY", kTH1D, {{1000, -1.0f, 1.0f}}); - registry.add("hImpactParBachFromCharmBaryonZ", "hImpactParBachFromCharmBaryonZ", kTH1D, {{1000, -2.0f, 2.0f}}); - registry.add("hImpactParCascXY", "hImpactParCascXY", kTH1D, {{1000, -4.0f, 4.0f}}); - registry.add("hImpactParCascZ", "hImpactParCascZ", kTH1D, {{1000, -5.0f, 5.0f}}); - registry.add("hPtKaFromCasc", "hPtKaFromCasc", kTH1D, {{1000, 0.0f, 5.0f}}); - registry.add("hPtPiFromCharmBaryon", "hPtPiFromCharmBaryon", kTH1D, {{1000, 0.0f, 5.0f}}); - registry.add("hCTauOmegac", "hCTauOmegac", kTH1D, {{1000, 0.0f, 0.1f}}); - registry.add("hKFGeoV0Chi2OverNdf", "hKFGeoV0Chi2OverNdf", kTH1D, {{1000, 0.0f, 100.0f}}); - registry.add("hKFGeoCascChi2OverNdf", "hKFGeoCascChi2OverNdf", kTH1D, {{1000, 0.0f, 100.0f}}); - registry.add("hKFGeoCharmbaryonChi2OverNdf", "hKFGeoCharmbaryonChi2OverNdf", kTH1D, {{1000, 0.0f, 100.0f}}); - registry.add("hKFdecayLenXYLambda", "hKFdecayLenXYLambda", kTH1D, {{1000, 0.0f, 50.0f}}); - registry.add("hKFdecayLenXYCasc", "hKFdecayLenXYCasc", kTH1D, {{1000, 0.0f, 50.0f}}); - registry.add("hKFdecayLenXYOmegac", "hKFdecayLenXYOmegac", kTH1D, {{1000, 0.0f, 50.0f}}); - registry.add("hKFcosPaV0ToCasc", "hKFcosPaV0ToCasc", kTH1D, {{5000, 0.8f, 1.1f}}); - registry.add("hKFcosPaCascToOmegac", "hKFcosPaCascToOmegac", kTH1D, {{5000, 0.8f, 1.1f}}); + // Additional KFParticle Histograms + if (fillAllHist) { + registry.add("hEtaV0PosDau", "hEtaV0PosDau", kTH1D, {{1000, -5.0f, 5.0f}}); + registry.add("hEtaV0NegDau", "hEtaV0NegDau", kTH1D, {{1000, -5.0f, 5.0f}}); + registry.add("hEtaKaFromCasc", "hEtaKaFromCasc", kTH1D, {{1000, -5.0f, 5.0f}}); + registry.add("hEtaPiFromCharmBaryon", "hEtaPiFromCharmBaryon", kTH1D, {{1000, -5.0f, 5.0f}}); + registry.add("hCascradius", "hCascradius", kTH1D, {{1000, 0.0f, 50.0f}}); + registry.add("hV0radius", "hV0radius", kTH1D, {{1000, 0.0f, 50.0f}}); + registry.add("hCosPACasc", "hCosPACasc", kTH1D, {{5000, 0.8f, 1.1f}}); + registry.add("hCosPAV0", "hCosPAV0", kTH1D, {{5000, 0.8f, 1.1f}}); + registry.add("hDcaCascDau", "hDcaCascDau", kTH1D, {{1000, -0.1f, 10.0f}}); + registry.add("hDcaV0Dau", "hDcaV0Dau", kTH1D, {{1000, -0.1f, 10.0f}}); + registry.add("hDcaXYToPvKa", "hDcaXYToPvKa", kTH1D, {{1000, -0.1f, 10.0f}}); + registry.add("hImpactParBachFromCharmBaryonXY", "hImpactParBachFromCharmBaryonXY", kTH1D, {{1000, -1.0f, 1.0f}}); + registry.add("hImpactParBachFromCharmBaryonZ", "hImpactParBachFromCharmBaryonZ", kTH1D, {{1000, -2.0f, 2.0f}}); + registry.add("hImpactParCascXY", "hImpactParCascXY", kTH1D, {{1000, -4.0f, 4.0f}}); + registry.add("hImpactParCascZ", "hImpactParCascZ", kTH1D, {{1000, -5.0f, 5.0f}}); + registry.add("hPtKaFromCasc", "hPtKaFromCasc", kTH1D, {{1000, 0.0f, 5.0f}}); + registry.add("hPtPiFromCharmBaryon", "hPtPiFromCharmBaryon", kTH1D, {{1000, 0.0f, 5.0f}}); + registry.add("hCTauOmegac", "hCTauOmegac", kTH1D, {{1000, 0.0f, 0.1f}}); + registry.add("hKFGeoV0Chi2OverNdf", "hKFGeoV0Chi2OverNdf", kTH1D, {{1000, 0.0f, 100.0f}}); + registry.add("hKFGeoCascChi2OverNdf", "hKFGeoCascChi2OverNdf", kTH1D, {{1000, 0.0f, 100.0f}}); + registry.add("hKFGeoCharmbaryonChi2OverNdf", "hKFGeoCharmbaryonChi2OverNdf", kTH1D, {{1000, 0.0f, 100.0f}}); + registry.add("hKFdecayLenXYLambda", "hKFdecayLenXYLambda", kTH1D, {{1000, 0.0f, 50.0f}}); + registry.add("hKFdecayLenXYCasc", "hKFdecayLenXYCasc", kTH1D, {{1000, 0.0f, 50.0f}}); + registry.add("hKFdecayLenXYOmegac", "hKFdecayLenXYOmegac", kTH1D, {{1000, 0.0f, 50.0f}}); + registry.add("hKFcosPaV0ToCasc", "hKFcosPaV0ToCasc", kTH1D, {{5000, 0.8f, 1.1f}}); + registry.add("hKFcosPaCascToOmegac", "hKFcosPaCascToOmegac", kTH1D, {{5000, 0.8f, 1.1f}}); + } hfEvSel.addHistograms(registry); // collision monitoring df.setPropagateToPCA(propagateToPCA); @@ -1088,6 +1098,8 @@ struct HfCandidateCreatorXic0Omegac0 { registry.fill(HIST("hKFParticleV0TopoChi2"), kfOmegac0Candidate.chi2NdfTopoV0ToCasc); registry.fill(HIST("hKFParticleCascTopoChi2"), kfOmegac0Candidate.chi2NdfTopoCascToOmegac); registry.fill(HIST("hKFParticlechi2TopoOmegacToPv"), kfOmegac0Candidate.chi2NdfTopoOmegacToPv); + registry.fill(HIST("hKfChi2TopoOmegacToPv"), kfOmegac0ToPv.GetChi2()); + registry.fill(HIST("hKfNdfOmegacToPv"), kfOmegac0ToPv.GetNDF()); registry.fill(HIST("hKFParticlechi2TopoCascToPv"), kfOmegac0Candidate.chi2NdfTopoCascToPv); registry.fill(HIST("hKFParticleDcaCharmBaryonDau"), kfOmegac0Candidate.kfDcaOmegacDau); registry.fill(HIST("hKFParticleDcaXYCascBachToPv"), dcaxyCascBachelor); @@ -1824,6 +1836,7 @@ struct HfCandidateCreatorXic0Omegac0Mc { // Configuration Configurable rejectBackground{"rejectBackground", true, "Reject particles from background events"}; + Configurable acceptTrackIntWithMaterial{"acceptTrackIntWithMaterial", false, " switch to accept candidates with final (i.e. p, K, pi) daughter tracks interacting with material"}; using MyTracksWMc = soa::Join; using McCollisionsNoCents = soa::Join; @@ -1902,28 +1915,19 @@ struct HfCandidateCreatorXic0Omegac0Mc { int8_t signV0 = -9; int8_t flag = 0; int8_t origin = 0; // to be used for prompt/non prompt - int8_t debug = 0; + McMatchFlag debug{McMatchFlag::None}; int8_t debugGenCharmBar = 0; int8_t debugGenCasc = 0; int8_t debugGenLambda = 0; + int8_t nPiToMuV0{0}, nPiToMuCasc{0}, nPiToMuOmegac0{0}; + int8_t nKaToPiCasc{0}, nKaToPiOmegac0{0}; bool collisionMatched = false; - int pdgCodeOmegac0 = Pdg::kOmegaC0; // 4332 - int pdgCodeXic0 = Pdg::kXiC0; // 4132 - int pdgCodeXiMinus = kXiMinus; // 3312 - int pdgCodeOmegaMinus = kOmegaMinus; // 3334 - int pdgCodeLambda = kLambda0; // 3122 - int pdgCodePiPlus = kPiPlus; // 211 - int pdgCodePiMinus = kPiMinus; // -211 - int pdgCodeProton = kProton; // 2212 - int pdgCodeKaonPlus = kKPlus; // 321 - int pdgCodeKaonMinus = kKMinus; // -321 - // Match reconstructed candidates. for (const auto& candidate : candidates) { flag = 0; origin = RecoDecay::OriginType::None; - debug = 0; + debug = McMatchFlag::None; collisionMatched = false; std::vector idxBhadMothers{}; @@ -1957,26 +1961,25 @@ struct HfCandidateCreatorXic0Omegac0Mc { continue; } } - // Xic0 -> xi pi matching if constexpr (decayChannel == aod::hf_cand_xic0_omegac0::DecayType::XiczeroToXiPi) { // Xic → pi pi pi p - indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, pdgCodeXic0, std::array{pdgCodePiPlus, pdgCodePiMinus, pdgCodeProton, pdgCodePiMinus}, true, &sign, 3); + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, +kXiC0, std::array{+kPiPlus, +kPiMinus, +kProton, +kPiMinus}, true, &sign, 3); indexRecCharmBaryon = indexRec; if (indexRec == -1) { - debug = 1; + debug = McMatchFlag::CharmbaryonUnmatched; } if (indexRec > -1) { // Xi- → pi pi p - indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersCasc, pdgCodeXiMinus, std::array{pdgCodePiMinus, pdgCodeProton, pdgCodePiMinus}, true, &signCasc, 2); + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersCasc, +kXiMinus, std::array{+kPiMinus, +kProton, +kPiMinus}, true, &signCasc, 2); if (indexRec == -1) { - debug = 2; + debug = McMatchFlag::CascUnmatched; } if (indexRec > -1) { // Lambda → p pi - indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersV0, pdgCodeLambda, std::array{pdgCodeProton, pdgCodePiMinus}, true, &signV0, 1); + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersV0, +kLambda0, std::array{+kProton, +kPiMinus}, true, &signV0, 1); if (indexRec == -1) { - debug = 3; + debug = McMatchFlag::V0Unmatched; } if (indexRec > -1) { flag = sign * (1 << aod::hf_cand_xic0_omegac0::DecayType::XiczeroToXiPi); @@ -1995,27 +1998,27 @@ struct HfCandidateCreatorXic0Omegac0Mc { } else { rowMCMatchRecXicToXiPi(flag, debug, origin, collisionMatched, -1.f, 0); } - if (debug == 2 || debug == 3) { + if (debug == McMatchFlag::CascUnmatched || debug == McMatchFlag::V0Unmatched) { LOGF(info, "WARNING: Xic0ToXiPi decays in the expected final state but the condition on the intermediate states are not fulfilled"); } } else if constexpr (decayChannel == aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToXiPi) { // Omegac -> xi pi matching // Omegac → pi pi pi p - indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, pdgCodeOmegac0, std::array{pdgCodePiPlus, pdgCodePiMinus, pdgCodeProton, pdgCodePiMinus}, true, &sign, 3); + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, +kOmegaC0, std::array{+kPiPlus, +kPiMinus, +kProton, +kPiMinus}, true, &sign, 3); indexRecCharmBaryon = indexRec; if (indexRec == -1) { - debug = 1; + debug = McMatchFlag::CharmbaryonUnmatched; } if (indexRec > -1) { // Xi- → pi pi p - indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersCasc, pdgCodeXiMinus, std::array{pdgCodePiMinus, pdgCodeProton, pdgCodePiMinus}, true, &signCasc, 2); + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersCasc, +kXiMinus, std::array{+kPiMinus, +kProton, +kPiMinus}, true, &signCasc, 2); if (indexRec == -1) { - debug = 2; + debug = McMatchFlag::CascUnmatched; } if (indexRec > -1) { // Lambda → p pi - indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersV0, pdgCodeLambda, std::array{pdgCodeProton, pdgCodePiMinus}, true, &signV0, 1); + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersV0, +kLambda0, std::array{+kProton, +kPiMinus}, true, &signV0, 1); if (indexRec == -1) { - debug = 3; + debug = McMatchFlag::V0Unmatched; } if (indexRec > -1) { flag = sign * (1 << aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToXiPi); @@ -2034,31 +2037,64 @@ struct HfCandidateCreatorXic0Omegac0Mc { } else { rowMCMatchRecOmegacToXiPi(flag, debug, origin, collisionMatched, -1.f, 0); } - if (debug == 2 || debug == 3) { + if (debug == McMatchFlag::CascUnmatched || debug == McMatchFlag::V0Unmatched) { LOGF(info, "WARNING: Omegac0ToXiPi decays in the expected final state but the condition on the intermediate states are not fulfilled"); } } else if constexpr (decayChannel == aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi) { // Omegac0 -> omega pi matching - // Omegac → pi K pi p - indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, pdgCodeOmegac0, std::array{pdgCodePiPlus, pdgCodeKaonMinus, pdgCodeProton, pdgCodePiMinus}, true, &sign, 3); - indexRecCharmBaryon = indexRec; - if (indexRec == -1) { - debug = 1; - } - if (indexRec > -1) { - // Omega- → K pi p - indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersCasc, pdgCodeOmegaMinus, std::array{pdgCodeKaonMinus, pdgCodeProton, pdgCodePiMinus}, true, &signCasc, 2); + if (acceptTrackIntWithMaterial) { + // Omegac → pi K pi p + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, +kOmegaC0, std::array{+kPiPlus, +kKMinus, +kProton, +kPiMinus}, true, &sign, 3, &nPiToMuOmegac0, &nKaToPiOmegac0); + indexRecCharmBaryon = indexRec; if (indexRec == -1) { - debug = 2; + debug = McMatchFlag::CharmbaryonUnmatched; } if (indexRec > -1) { - // Lambda → p pi - indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersV0, pdgCodeLambda, std::array{pdgCodeProton, pdgCodePiMinus}, true, &signV0, 1); + // Omega- → K pi p + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersCasc, +kOmegaMinus, std::array{+kKMinus, +kProton, +kPiMinus}, true, &signCasc, 2, &nPiToMuCasc, &nKaToPiCasc); if (indexRec == -1) { - debug = 3; + debug = McMatchFlag::CascUnmatched; } if (indexRec > -1) { - flag = sign * (1 << aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi); - collisionMatched = candidate.template collision_as().mcCollisionId() == mcParticles.iteratorAt(indexRecCharmBaryon).mcCollisionId(); + // Lambda → p pi + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersV0, +kLambda0, std::array{+kProton, +kPiMinus}, true, &signV0, 1, &nPiToMuV0); + if (indexRec == -1) { + debug = McMatchFlag::V0Unmatched; + } + if (indexRec > -1 && nPiToMuOmegac0 >= 1 && nKaToPiOmegac0 == 0) { + flag = sign * (1 << aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPiOneMu); + collisionMatched = candidate.template collision_as().mcCollisionId() == mcParticles.iteratorAt(indexRecCharmBaryon).mcCollisionId(); + } else if (indexRec > -1 && nPiToMuOmegac0 == 0 && nKaToPiOmegac0 == 0) { + flag = sign * (1 << aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi); + collisionMatched = candidate.template collision_as().mcCollisionId() == mcParticles.iteratorAt(indexRecCharmBaryon).mcCollisionId(); + } + } + } + } else { + // Omegac → pi K pi p + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, +kOmegaC0, std::array{+kPiPlus, +kKMinus, +kProton, +kPiMinus}, true, &sign, 3, &nPiToMuOmegac0, &nKaToPiOmegac0); + indexRecCharmBaryon = indexRec; + if (indexRec == -1) { + debug = McMatchFlag::CharmbaryonUnmatched; + } + if (indexRec > -1) { + // Omega- → K pi p + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersCasc, +kOmegaMinus, std::array{+kKMinus, +kProton, +kPiMinus}, true, &signCasc, 2, &nPiToMuCasc, &nKaToPiCasc); + if (indexRec == -1) { + debug = McMatchFlag::CascUnmatched; + } + if (indexRec > -1) { + // Lambda → p pi + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersV0, +kLambda0, std::array{+kProton, +kPiMinus}, true, &signV0, 1, &nPiToMuV0); + if (indexRec == -1) { + debug = McMatchFlag::V0Unmatched; + } + if (indexRec > -1 && nPiToMuOmegac0 >= 1 && nKaToPiOmegac0 == 0) { + flag = sign * (1 << aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPiOneMu); + collisionMatched = candidate.template collision_as().mcCollisionId() == mcParticles.iteratorAt(indexRecCharmBaryon).mcCollisionId(); + } else if (indexRec > -1 && nPiToMuOmegac0 == 0 && nKaToPiOmegac0 == 0) { + flag = sign * (1 << aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi); + collisionMatched = candidate.template collision_as().mcCollisionId() == mcParticles.iteratorAt(indexRecCharmBaryon).mcCollisionId(); + } } } } @@ -2073,27 +2109,27 @@ struct HfCandidateCreatorXic0Omegac0Mc { } else { rowMCMatchRecToOmegaPi(flag, debug, origin, collisionMatched, -1.f, 0); } - if (debug == 2 || debug == 3) { + if (debug == McMatchFlag::CascUnmatched || debug == McMatchFlag::V0Unmatched) { LOGF(info, "WARNING: Omegac0ToOmegaPi decays in the expected final state but the condition on the intermediate states are not fulfilled"); } } else if constexpr (decayChannel == aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaK) { // Omegac0 -> omega K matching // Omegac → K K pi p - indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, pdgCodeOmegac0, std::array{pdgCodeKaonPlus, pdgCodeKaonMinus, pdgCodeProton, pdgCodePiMinus}, true, &sign, 3); + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, +kOmegaC0, std::array{+kKPlus, +kKMinus, +kProton, +kPiMinus}, true, &sign, 3); indexRecCharmBaryon = indexRec; if (indexRec == -1) { - debug = 1; + debug = McMatchFlag::CharmbaryonUnmatched; } if (indexRec > -1) { // Omega- → K pi p - indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersCasc, pdgCodeOmegaMinus, std::array{pdgCodeKaonMinus, pdgCodeProton, pdgCodePiMinus}, true, &signCasc, 2); + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersCasc, +kOmegaMinus, std::array{+kKMinus, +kProton, +kPiMinus}, true, &signCasc, 2); if (indexRec == -1) { - debug = 2; + debug = McMatchFlag::CascUnmatched; } if (indexRec > -1) { // Lambda → p pi - indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersV0, pdgCodeLambda, std::array{pdgCodeProton, pdgCodePiMinus}, true, &signV0, 1); + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersV0, +kLambda0, std::array{+kProton, +kPiMinus}, true, &signV0, 1); if (indexRec == -1) { - debug = 3; + debug = McMatchFlag::V0Unmatched; } if (indexRec > -1) { flag = sign * (1 << aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaK); @@ -2112,7 +2148,7 @@ struct HfCandidateCreatorXic0Omegac0Mc { } else { rowMCMatchRecToOmegaK(flag, debug, origin, collisionMatched, -1.f, 0); } - if (debug == 2 || debug == 3) { + if (debug == McMatchFlag::CascUnmatched || debug == McMatchFlag::V0Unmatched) { LOGF(info, "WARNING: Omegac0ToOmegaK decays in the expected final state but the condition on the intermediate states are not fulfilled"); } } @@ -2180,23 +2216,23 @@ struct HfCandidateCreatorXic0Omegac0Mc { if constexpr (decayChannel == aod::hf_cand_xic0_omegac0::DecayType::XiczeroToXiPi) { // Xic → Xi pi - if (RecoDecay::isMatchedMCGen(mcParticles, particle, pdgCodeXic0, std::array{pdgCodeXiMinus, pdgCodePiPlus}, true, &sign)) { + if (RecoDecay::isMatchedMCGen(mcParticles, particle, +kXiC0, std::array{+kXiMinus, +kPiPlus}, true, &sign)) { debugGenCharmBar = 1; ptCharmBaryonGen = particle.pt(); rapidityCharmBaryonGen = particle.y(); for (const auto& daughterCharm : particle.template daughters_as()) { - if (std::abs(daughterCharm.pdgCode()) != pdgCodeXiMinus) { + if (std::abs(daughterCharm.pdgCode()) != +kXiMinus) { continue; } // Xi -> Lambda pi - if (RecoDecay::isMatchedMCGen(mcParticles, daughterCharm, pdgCodeXiMinus, std::array{pdgCodeLambda, pdgCodePiMinus}, true)) { + if (RecoDecay::isMatchedMCGen(mcParticles, daughterCharm, +kXiMinus, std::array{+kLambda0, +kPiMinus}, true)) { debugGenCasc = 1; for (const auto& daughterCascade : daughterCharm.template daughters_as()) { - if (std::abs(daughterCascade.pdgCode()) != pdgCodeLambda) { + if (std::abs(daughterCascade.pdgCode()) != +kLambda0) { continue; } // Lambda -> p pi - if (RecoDecay::isMatchedMCGen(mcParticles, daughterCascade, pdgCodeLambda, std::array{pdgCodeProton, pdgCodePiMinus}, true)) { + if (RecoDecay::isMatchedMCGen(mcParticles, daughterCascade, +kLambda0, std::array{+kProton, +kPiMinus}, true)) { debugGenLambda = 1; flag = sign * (1 << aod::hf_cand_xic0_omegac0::DecayType::XiczeroToXiPi); } @@ -2222,23 +2258,23 @@ struct HfCandidateCreatorXic0Omegac0Mc { } else if constexpr (decayChannel == aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToXiPi) { // Omegac → Xi pi - if (RecoDecay::isMatchedMCGen(mcParticles, particle, pdgCodeOmegac0, std::array{pdgCodeXiMinus, pdgCodePiPlus}, true, &sign)) { + if (RecoDecay::isMatchedMCGen(mcParticles, particle, +kOmegaC0, std::array{+kXiMinus, +kPiPlus}, true, &sign)) { debugGenCharmBar = 1; ptCharmBaryonGen = particle.pt(); rapidityCharmBaryonGen = particle.y(); for (const auto& daughterCharm : particle.template daughters_as()) { - if (std::abs(daughterCharm.pdgCode()) != pdgCodeXiMinus) { + if (std::abs(daughterCharm.pdgCode()) != +kXiMinus) { continue; } // Xi -> Lambda pi - if (RecoDecay::isMatchedMCGen(mcParticles, daughterCharm, pdgCodeXiMinus, std::array{pdgCodeLambda, pdgCodePiMinus}, true)) { + if (RecoDecay::isMatchedMCGen(mcParticles, daughterCharm, +kXiMinus, std::array{+kLambda0, +kPiMinus}, true)) { debugGenCasc = 1; for (const auto& daughterCascade : daughterCharm.template daughters_as()) { - if (std::abs(daughterCascade.pdgCode()) != pdgCodeLambda) { + if (std::abs(daughterCascade.pdgCode()) != +kLambda0) { continue; } // Lambda -> p pi - if (RecoDecay::isMatchedMCGen(mcParticles, daughterCascade, pdgCodeLambda, std::array{pdgCodeProton, pdgCodePiMinus}, true)) { + if (RecoDecay::isMatchedMCGen(mcParticles, daughterCascade, +kLambda0, std::array{+kProton, +kPiMinus}, true)) { debugGenLambda = 1; flag = sign * (1 << aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToXiPi); } @@ -2264,23 +2300,23 @@ struct HfCandidateCreatorXic0Omegac0Mc { } else if constexpr (decayChannel == aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi) { // Omegac → Omega pi - if (RecoDecay::isMatchedMCGen(mcParticles, particle, pdgCodeOmegac0, std::array{pdgCodeOmegaMinus, pdgCodePiPlus}, true, &sign)) { + if (RecoDecay::isMatchedMCGen(mcParticles, particle, +kOmegaC0, std::array{+kOmegaMinus, +kPiPlus}, true, &sign)) { debugGenCharmBar = 1; ptCharmBaryonGen = particle.pt(); rapidityCharmBaryonGen = particle.y(); for (const auto& daughterCharm : particle.template daughters_as()) { - if (std::abs(daughterCharm.pdgCode()) != pdgCodeOmegaMinus) { + if (std::abs(daughterCharm.pdgCode()) != +kOmegaMinus) { continue; } // Omega -> Lambda K - if (RecoDecay::isMatchedMCGen(mcParticles, daughterCharm, pdgCodeOmegaMinus, std::array{pdgCodeLambda, pdgCodeKaonMinus}, true)) { + if (RecoDecay::isMatchedMCGen(mcParticles, daughterCharm, +kOmegaMinus, std::array{+kLambda0, +kKMinus}, true)) { debugGenCasc = 1; for (const auto& daughterCascade : daughterCharm.template daughters_as()) { - if (std::abs(daughterCascade.pdgCode()) != pdgCodeLambda) { + if (std::abs(daughterCascade.pdgCode()) != +kLambda0) { continue; } // Lambda -> p pi - if (RecoDecay::isMatchedMCGen(mcParticles, daughterCascade, pdgCodeLambda, std::array{pdgCodeProton, pdgCodePiMinus}, true)) { + if (RecoDecay::isMatchedMCGen(mcParticles, daughterCascade, +kLambda0, std::array{+kProton, +kPiMinus}, true)) { debugGenLambda = 1; flag = sign * (1 << aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi); } @@ -2306,23 +2342,23 @@ struct HfCandidateCreatorXic0Omegac0Mc { } else if constexpr (decayChannel == aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaK) { // Omegac → Omega K - if (RecoDecay::isMatchedMCGen(mcParticles, particle, pdgCodeOmegac0, std::array{pdgCodeOmegaMinus, pdgCodeKaonPlus}, true, &sign)) { + if (RecoDecay::isMatchedMCGen(mcParticles, particle, +kOmegaC0, std::array{+kOmegaMinus, +kKPlus}, true, &sign)) { debugGenCharmBar = 1; ptCharmBaryonGen = particle.pt(); rapidityCharmBaryonGen = particle.y(); for (const auto& daughterCharm : particle.template daughters_as()) { - if (std::abs(daughterCharm.pdgCode()) != pdgCodeOmegaMinus) { + if (std::abs(daughterCharm.pdgCode()) != +kOmegaMinus) { continue; } // Omega -> Lambda K - if (RecoDecay::isMatchedMCGen(mcParticles, daughterCharm, pdgCodeOmegaMinus, std::array{pdgCodeLambda, pdgCodeKaonMinus}, true)) { + if (RecoDecay::isMatchedMCGen(mcParticles, daughterCharm, +kOmegaMinus, std::array{+kLambda0, +kKMinus}, true)) { debugGenCasc = 1; for (const auto& daughterCascade : daughterCharm.template daughters_as()) { - if (std::abs(daughterCascade.pdgCode()) != pdgCodeLambda) { + if (std::abs(daughterCascade.pdgCode()) != +kLambda0) { continue; } // Lambda -> p pi - if (RecoDecay::isMatchedMCGen(mcParticles, daughterCascade, pdgCodeLambda, std::array{pdgCodeProton, pdgCodePiMinus}, true)) { + if (RecoDecay::isMatchedMCGen(mcParticles, daughterCascade, +kLambda0, std::array{+kProton, +kPiMinus}, true)) { debugGenLambda = 1; flag = sign * (1 << aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaK); } From 4e86f3ef53db566d62b92d719621d9bffa68635f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Karpi=C5=84ski?= <40724893+davkk@users.noreply.github.com> Date: Sat, 29 Mar 2025 02:04:00 +0100 Subject: [PATCH 0861/1650] [PWGCF/FemtoUniverse] Add pT histo with only primaries. (#10681) --- PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h index a2c5dd020db..053d8f116dc 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h @@ -136,6 +136,7 @@ class FemtoUniverseParticleHisto std::string folderSuffix = static_cast(o2::aod::femtouniverse_mc_particle::MCTypeName[o2::aod::femtouniverse_mc_particle::MCType::kTruth]).c_str(); mHistogramRegistry->add((folderName + folderSuffix + "/hPt_ReconNoFake").c_str(), "; #it{p}_{T} (GeV/#it{c}); Entries", kTH1F, {tempFitVarpTAxis}); + mHistogramRegistry->add((folderName + folderSuffix + "/hPt_ReconPrimary").c_str(), "; #it{p}_{T} (GeV/#it{c}); Entries", kTH1F, {tempFitVarpTAxis}); if constexpr (mParticleType == o2::aod::femtouniverseparticle::ParticleType::kTrack || mParticleType == o2::aod::femtouniverseparticle::ParticleType::kV0Child || mParticleType == o2::aod::femtouniverseparticle::ParticleType::kCascadeBachelor || mParticleType == o2::aod::femtouniverseparticle::ParticleType::kMCTruthTrack) { /// Track histograms @@ -320,10 +321,14 @@ class FemtoUniverseParticleHisto if constexpr (mParticleType == o2::aod::femtouniverseparticle::ParticleType::kTrack || mParticleType == o2::aod::femtouniverseparticle::ParticleType::kV0Child || mParticleType == o2::aod::femtouniverseparticle::ParticleType::kCascadeBachelor || mParticleType == o2::aod::femtouniverseparticle::ParticleType::kMCTruthTrack) { /// Track histograms switch (mctruthorigin) { - case (o2::aod::femtouniverse_mc_particle::kPrimary): + case (o2::aod::femtouniverse_mc_particle::kPrimary): { + if (pdgcode == mPDG) { + mHistogramRegistry->fill(histFolder + HIST("_MC/hPt_Primary"), part.pt()); + } mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_Primary"), part.pt(), part.tempFitVar()); break; + } case (o2::aod::femtouniverse_mc_particle::kDaughter): mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_Daughter"), part.pt(), part.tempFitVar()); From 62652e906076729e8f0205fa21a2c20f22a69dd4 Mon Sep 17 00:00:00 2001 From: Phil Stahlhut <138057549+pstahlhu@users.noreply.github.com> Date: Sat, 29 Mar 2025 05:51:25 +0100 Subject: [PATCH 0862/1650] [PWGHF] XicToXiPiPi: Update KF workflow (#10661) Co-authored-by: pstahlhu --- .../DataModel/CandidateReconstructionTables.h | 5 +++++ .../candidateCreatorXicToXiPiPi.cxx | 20 ++++++++++++++++--- .../TableProducer/treeCreatorXicToXiPiPi.cxx | 16 +++++++-------- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/PWGHF/DataModel/CandidateReconstructionTables.h b/PWGHF/DataModel/CandidateReconstructionTables.h index b82e0195f42..648d15fa16c 100644 --- a/PWGHF/DataModel/CandidateReconstructionTables.h +++ b/PWGHF/DataModel/CandidateReconstructionTables.h @@ -1649,6 +1649,10 @@ DECLARE_SOA_COLUMN(Chi2TopoXicPlusToPV, chi2TopoXicPlusToPV, float); DECLARE_SOA_COLUMN(Chi2TopoXicPlusToPVBeforeConstraint, chi2TopoXicPlusToPVBeforeConstraint, float); DECLARE_SOA_COLUMN(Chi2TopoXiToXicPlus, chi2TopoXiToXicPlus, float); DECLARE_SOA_COLUMN(Chi2TopoXiToXicPlusBeforeConstraint, chi2TopoXiToXicPlusBeforeConstraint, float); +DECLARE_SOA_COLUMN(KfDecayLength, kfDecayLength, float); +DECLARE_SOA_COLUMN(KfDecayLengthNormalised, kfDecayLengthNormalised, float); +DECLARE_SOA_COLUMN(KfDecayLengthXY, kfDecayLengthXY, float); +DECLARE_SOA_COLUMN(KfDecayLengthXYNormalised, kfDecayLengthXYNormalised, float); // PID DECLARE_SOA_COLUMN(NSigTpcPiFromXicPlus0, nSigTpcPiFromXicPlus0, float); DECLARE_SOA_COLUMN(NSigTpcPiFromXicPlus1, nSigTpcPiFromXicPlus1, float); @@ -1743,6 +1747,7 @@ using HfCandXic = HfCandXicExt; DECLARE_SOA_TABLE(HfCandXicKF, "AOD", "HFCANDXICKF", cascdata::KFCascadeChi2, cascdata::KFV0Chi2, + hf_cand_xic_to_xi_pi_pi::KfDecayLength, hf_cand_xic_to_xi_pi_pi::KfDecayLengthNormalised, hf_cand_xic_to_xi_pi_pi::KfDecayLengthXY, hf_cand_xic_to_xi_pi_pi::KfDecayLengthXYNormalised, hf_cand_xic_to_xi_pi_pi::Chi2TopoXicPlusToPVBeforeConstraint, hf_cand_xic_to_xi_pi_pi::Chi2TopoXicPlusToPV, hf_cand_xic_to_xi_pi_pi::Chi2TopoXiToXicPlusBeforeConstraint, hf_cand_xic_to_xi_pi_pi::Chi2TopoXiToXicPlus, hf_cand_xic_to_xi_pi_pi::DcaXYPi0Pi1, hf_cand_xic_to_xi_pi_pi::DcaXYPi0Xi, hf_cand_xic_to_xi_pi_pi::DcaXYPi1Xi, hf_cand_xic_to_xi_pi_pi::DcaPi0Pi1, hf_cand_xic_to_xi_pi_pi::DcaPi0Xi, hf_cand_xic_to_xi_pi_pi::DcaPi1Xi); diff --git a/PWGHF/TableProducer/candidateCreatorXicToXiPiPi.cxx b/PWGHF/TableProducer/candidateCreatorXicToXiPiPi.cxx index 7d87dcd5888..22b43f88061 100644 --- a/PWGHF/TableProducer/candidateCreatorXicToXiPiPi.cxx +++ b/PWGHF/TableProducer/candidateCreatorXicToXiPiPi.cxx @@ -80,6 +80,7 @@ struct HfCandidateCreatorXicToXiPiPi { Configurable useAbsDCA{"useAbsDCA", false, "Minimise abs. distance rather than chi2"}; Configurable useWeightedFinalPCA{"useWeightedFinalPCA", false, "Recalculate vertex position using track covariances, effective only if useAbsDCA is true"}; // KFParticle + Configurable useXiMassConstraint{"useXiMassConstraint", true, "Use mass constraint for Xi"}; Configurable constrainXicPlusToPv{"constrainXicPlusToPv", false, "Constrain XicPlus to PV"}; Configurable constrainXiToXicPlus{"constrainXiToXicPlus", false, "Constrain Xi to XicPlus"}; Configurable kfConstructMethod{"kfConstructMethod", 2, "Construct method of XicPlus: 0 fast mathematics without constraint of fixed daughter particle masses, 2 daughter particle masses stay fixed in construction process"}; @@ -463,7 +464,11 @@ struct HfCandidateCreatorXicToXiPiPi { } // create KFParticle KFParticle kfXi; - kfXi.Create(parPosMom, casc.kfTrackCovMat(), casc.sign(), casc.mXi()); + float massXi = casc.mXi(); + kfXi.Create(parPosMom, casc.kfTrackCovMat(), casc.sign(), massXi); + if (useXiMassConstraint) { + kfXi.SetNonlinearMassConstraint(MassXiMinus); + } // create XicPlus as KFParticle object KFParticle kfXicPlus; @@ -580,6 +585,14 @@ struct HfCandidateCreatorXicToXiPiPi { float errMassXiPiPi; kfXicPlus.GetMass(massXiPiPi, errMassXiPiPi); + // decay length of XicPlus + // use XicPlus constrained to PV (kfXicPlusToPV), since production point must be set before calling GetDecayLength(XY) on KFParticle + float kfDecayLength = 0., errorKfDecayLength = 0., kfDecayLengthXY = 0., errorKfDecayLengthXY = 0.; + kfXicPlusToPV.GetDecayLength(kfDecayLength, errorKfDecayLength); + kfXicPlusToPV.GetDecayLengthXY(kfDecayLengthXY, errorKfDecayLengthXY); + float kfDecayLengthNormalised = ldlFromKF(kfXicPlus, kfPv); + float kfDecayLengthXYNormalised = ldlXYFromKF(kfXicPlus, kfPv); + //--------------------- get PID information----------------------- float nSigTpcPiFromXicPlus0 = trackCharmBachelor0.tpcNSigmaPi(); float nSigTofPiFromXicPlus0 = trackCharmBachelor0.tofNSigmaPi(); @@ -638,7 +651,7 @@ struct HfCandidateCreatorXicToXiPiPi { casc.bachelorId(), casc.posTrackId(), casc.negTrackId(), secondaryVertex[0], secondaryVertex[1], secondaryVertex[2], kfXicPlus.GetErrX(), kfXicPlus.GetErrY(), kfXicPlus.GetErrZ(), - kfXicPlus.GetErrDecayLength(), kfXicPlus.GetErrDecayLengthXY(), + errorKfDecayLength, errorKfDecayLengthXY, chi2GeoXicPlus, massXiPiPi, signXic, kfXi.GetPx(), kfXi.GetPy(), kfXi.GetPz(), kfCharmBachelor0.GetPx(), kfCharmBachelor0.GetPy(), kfCharmBachelor0.GetPz(), @@ -648,7 +661,7 @@ struct HfCandidateCreatorXicToXiPiPi { /*cascade specific columns*/ trackPionFromXi.p(), pPiFromLambda, pPrFromLambda, cpaXi, cpaXYXi, cpaLambda, cpaXYLambda, cpaLambdaToXi, cpaXYLambdaToXi, - casc.mXi(), casc.mLambda(), massXiPi0, massXiPi1, + massXi, casc.mLambda(), massXiPi0, massXiPi1, /*DCA information*/ casc.dcacascdaughters(), casc.dcaV0daughters(), casc.dcapostopv(), casc.dcanegtopv(), casc.dcabachtopv(), casc.dcaXYCascToPV(), casc.dcaZCascToPV(), @@ -656,6 +669,7 @@ struct HfCandidateCreatorXicToXiPiPi { nSigTpcPiFromXicPlus0, nSigTpcPiFromXicPlus1, nSigTpcBachelorPi, nSigTpcPiFromLambda, nSigTpcPrFromLambda, nSigTofPiFromXicPlus0, nSigTofPiFromXicPlus1, nSigTofBachelorPi, nSigTofPiFromLambda, nSigTofPrFromLambda); rowCandidateKF(casc.kfCascadeChi2(), casc.kfV0Chi2(), + kfDecayLength, kfDecayLengthNormalised, kfDecayLengthXY, kfDecayLengthXYNormalised, chi2topoXicPlusToPVBeforeConstraint, chi2topoXicPlusToPV, chi2topoXiToXicPlusBeforeConstraint, chi2topoXiToXicPlus, dcaXYPi0Pi1, dcaXYPi0Xi, dcaXYPi1Xi, dcaPi0Pi1, dcaPi0Xi, dcaPi1Xi); diff --git a/PWGHF/TableProducer/treeCreatorXicToXiPiPi.cxx b/PWGHF/TableProducer/treeCreatorXicToXiPiPi.cxx index 47b1c3f71d4..ff17d263413 100644 --- a/PWGHF/TableProducer/treeCreatorXicToXiPiPi.cxx +++ b/PWGHF/TableProducer/treeCreatorXicToXiPiPi.cxx @@ -540,10 +540,10 @@ struct HfTreeCreatorXicToXiPiPi { candidate.invMassXiPi1(), candidate.chi2PCA(), candidate.ct(o2::constants::physics::MassXiCPlus), - candidate.decayLength(), - candidate.decayLengthNormalised(), - candidate.decayLengthXY(), - candidate.decayLengthXYNormalised(), + candidate.kfDecayLength(), + candidate.kfDecayLengthNormalised(), + candidate.kfDecayLengthXY(), + candidate.kfDecayLengthXYNormalised(), candidate.cpa(), candidate.cpaXY(), candidate.cosPaXi(), @@ -592,10 +592,10 @@ struct HfTreeCreatorXicToXiPiPi { candidate.invMassXiPi1(), candidate.chi2PCA(), candidate.ct(o2::constants::physics::MassXiCPlus), - candidate.decayLength(), - candidate.decayLengthNormalised(), - candidate.decayLengthXY(), - candidate.decayLengthXYNormalised(), + candidate.kfDecayLength(), + candidate.kfDecayLengthNormalised(), + candidate.kfDecayLengthXY(), + candidate.kfDecayLengthXYNormalised(), candidate.cpa(), candidate.cpaXY(), candidate.cosPaXi(), From 5128a6ce9bcd6f22efb8b59e453032680072d9f2 Mon Sep 17 00:00:00 2001 From: Samuele Cattaruzzi <124249902+scattaru@users.noreply.github.com> Date: Sat, 29 Mar 2025 09:05:33 +0100 Subject: [PATCH 0863/1650] [DPG] AOTTrack Impact parameter: move THn to THnSparse (#10696) --- DPG/Tasks/AOTTrack/qaImpPar.cxx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/DPG/Tasks/AOTTrack/qaImpPar.cxx b/DPG/Tasks/AOTTrack/qaImpPar.cxx index 228934bda7f..8e93081727a 100644 --- a/DPG/Tasks/AOTTrack/qaImpPar.cxx +++ b/DPG/Tasks/AOTTrack/qaImpPar.cxx @@ -315,9 +315,9 @@ struct QaImpactPar { histograms.add("Reco/h4ImpPar", "", kTHnSparseD, {trackPtAxis, trackImpParRPhiAxis, trackEtaAxis, trackPhiAxis, trackPDGAxis, trackChargeAxis, axisVertexNumContrib, trackIsPvContrib}); histograms.add("Reco/h4ImpParZ", "", kTHnSparseD, {trackPtAxis, trackImpParZAxis, trackEtaAxis, trackPhiAxis, trackPDGAxis, trackChargeAxis, axisVertexNumContrib, trackIsPvContrib}); if (addTrackIUinfo) { - histograms.add("Reco/h4ClusterSizeIU", "", kTHnD, {trackPaxis, trackImpParRPhiAxis, trackIUposXaxis, trackIUposYaxis, trackIUposZaxis, trackIUclusterSize}); + histograms.add("Reco/h4ClusterSizeIU", "", kTHnSparseD, {trackPaxis, trackImpParRPhiAxis, trackIUposXaxis, trackIUposYaxis, trackIUposZaxis, trackIUclusterSize}); // histograms.add("Reco/h4ImpParIU", "", kTHnSparseD, {trackPaxis, trackImpParRPhiAxis, trackIUposXaxis, trackIUposYaxis, trackIUposZaxis}); - histograms.add("Reco/h4ImpParZIU", "", kTHnD, {trackPaxis, trackImpParZAxis, trackIUposXaxis, trackIUposYaxis, trackIUposZaxis}); + histograms.add("Reco/h4ImpParZIU", "", kTHnSparseD, {trackPaxis, trackImpParZAxis, trackIUposXaxis, trackIUposYaxis, trackIUposZaxis}); } // if(fEnablePulls && !doPVrefit) { // LOGF(fatal, ">>> dca errors not stored after track propagation at the moment. Use fEnablePulls only if doPVrefit!"); @@ -329,7 +329,7 @@ struct QaImpactPar { isPIDPionApplied = ((nSigmaTPCPionMin > -10.001 && nSigmaTPCPionMax < 10.001) || (nSigmaTOFPionMin > -10.001 && nSigmaTOFPionMax < 10.001)); if (isPIDPionApplied) { if (addTrackIUinfo) { - histograms.add("Reco/h4ClusterSizeIU_Pion", "", kTHnD, {trackPaxis, trackImpParRPhiAxis, trackIUposXaxis, trackIUposYaxis, trackIUposZaxis, trackIUclusterSize}); + histograms.add("Reco/h4ClusterSizeIU_Pion", "", kTHnSparseD, {trackPaxis, trackImpParRPhiAxis, trackIUposXaxis, trackIUposYaxis, trackIUposZaxis, trackIUclusterSize}); } histograms.add("Reco/h4ImpPar_Pion", "", kTHnSparseD, {trackPtAxis, trackImpParRPhiAxis, trackEtaAxis, trackPhiAxis, trackPDGAxis, trackChargeAxis, axisVertexNumContrib, trackIsPvContrib}); histograms.add("Reco/h4ImpParZ_Pion", "", kTHnSparseD, {trackPtAxis, trackImpParZAxis, trackEtaAxis, trackPhiAxis, trackPDGAxis, trackChargeAxis, axisVertexNumContrib, trackIsPvContrib}); @@ -337,7 +337,7 @@ struct QaImpactPar { isPIDKaonApplied = ((nSigmaTPCKaonMin > -10.001 && nSigmaTPCKaonMax < 10.001) || (nSigmaTOFKaonMin > -10.001 && nSigmaTOFKaonMax < 10.001)); if (isPIDKaonApplied) { if (addTrackIUinfo) { - histograms.add("Reco/h4ClusterSizeIU_Kaon", "", kTHnD, {trackPaxis, trackImpParRPhiAxis, trackIUposXaxis, trackIUposYaxis, trackIUposZaxis, trackIUclusterSize}); + histograms.add("Reco/h4ClusterSizeIU_Kaon", "", kTHnSparseD, {trackPaxis, trackImpParRPhiAxis, trackIUposXaxis, trackIUposYaxis, trackIUposZaxis, trackIUclusterSize}); } histograms.add("Reco/h4ImpPar_Kaon", "", kTHnSparseD, {trackPtAxis, trackImpParRPhiAxis, trackEtaAxis, trackPhiAxis, trackPDGAxis, trackChargeAxis, axisVertexNumContrib, trackIsPvContrib}); histograms.add("Reco/h4ImpParZ_Kaon", "", kTHnSparseD, {trackPtAxis, trackImpParZAxis, trackEtaAxis, trackPhiAxis, trackPDGAxis, trackChargeAxis, axisVertexNumContrib, trackIsPvContrib}); @@ -345,7 +345,7 @@ struct QaImpactPar { isPIDProtonApplied = ((nSigmaTPCProtonMin > -10.001 && nSigmaTPCProtonMax < 10.001) || (nSigmaTOFProtonMin > -10.001 && nSigmaTOFProtonMax < 10.001)); if (isPIDProtonApplied) { if (addTrackIUinfo) { - histograms.add("Reco/h4ClusterSizeIU_Proton", "", kTHnD, {trackPaxis, trackImpParRPhiAxis, trackIUposXaxis, trackIUposYaxis, trackIUposZaxis, trackIUclusterSize}); + histograms.add("Reco/h4ClusterSizeIU_Proton", "", kTHnSparseD, {trackPaxis, trackImpParRPhiAxis, trackIUposXaxis, trackIUposYaxis, trackIUposZaxis, trackIUclusterSize}); } histograms.add("Reco/h4ImpPar_Proton", "", kTHnSparseD, {trackPtAxis, trackImpParRPhiAxis, trackEtaAxis, trackPhiAxis, trackPDGAxis, trackChargeAxis, axisVertexNumContrib, trackIsPvContrib}); histograms.add("Reco/h4ImpParZ_Proton", "", kTHnSparseD, {trackPtAxis, trackImpParZAxis, trackEtaAxis, trackPhiAxis, trackPDGAxis, trackChargeAxis, axisVertexNumContrib, trackIsPvContrib}); From fcb2f4a29bfef695b8ae94a8c9aecef76fb97d62 Mon Sep 17 00:00:00 2001 From: Roman Lietava Date: Sat, 29 Mar 2025 10:03:27 +0100 Subject: [PATCH 0864/1650] [PWGLF,Trigger] Introduce normalised multiplicity for OmegaHighMult filter (#10679) --- EventFiltering/PWGLF/strangenessFilter.cxx | 76 ++++++++++++++++++++-- 1 file changed, 72 insertions(+), 4 deletions(-) diff --git a/EventFiltering/PWGLF/strangenessFilter.cxx b/EventFiltering/PWGLF/strangenessFilter.cxx index 1f615a54706..68bbfcccc70 100644 --- a/EventFiltering/PWGLF/strangenessFilter.cxx +++ b/EventFiltering/PWGLF/strangenessFilter.cxx @@ -109,6 +109,10 @@ struct strangenessFilter { Configurable sel7{"sel7", 0, "Apply sel7 event selection"}; Configurable sel8{"sel8", 0, "Apply sel8 event selection"}; Configurable LowLimitFT0MMult{"LowLimitFT0MMult", 3100, "FT0M selection for omega + high multiplicity trigger"}; + Configurable LowLimitFT0MMultNorm{"LowLimitFT0MMultNorm", 70, "FT0M selection for omega + high multiplicity trigger with Normalised FT0M"}; + Configurable useNormalisedMult{"useNormalisedMult", 1, "Use avarage multiplicity for HM omega like in multFilter.cxx"}; + Configurable avPyT0C{"avPyT0C", 8.83, "nch from pythia T0C"}; + Configurable avPyT0A{"avPyT0A", 8.16, "nch from pythia T0A"}; Configurable isTimeFrameBorderCut{"isTimeFrameBorderCut", 1, "Apply timeframe border cut"}; Configurable useSigmaBasedMassCutXi{"useSigmaBasedMassCutXi", true, "Mass window based on n*sigma instead of fixed"}; Configurable useSigmaBasedMassCutOmega{"useSigmaBasedMassCutOmega", true, "Mass window based on n*sigma instead of fixed"}; @@ -221,6 +225,7 @@ struct strangenessFilter { std::vector centBinning = {0., 1., 5., 10., 20., 30., 40., 50., 70., 100.}; AxisSpec multAxisNTPV = {100, 0.0f, 100.0f, "N. tracks PV estimator"}; AxisSpec multAxisT0M = {600, 0.0f, 6000.0f, "T0M multiplicity estimator"}; + AxisSpec multAxisT0MNorm = {150, 0.0f, 150.0f, "Normalised T0M multiplicity estimator"}; AxisSpec multAxisV0A = {500, 0.0f, 25000.0f, "V0A multiplicity estimator"}; AxisSpec ximassAxis = {200, 1.28f, 1.36f}; AxisSpec omegamassAxis = {200, 1.59f, 1.75f}; @@ -282,6 +287,10 @@ struct strangenessFilter { EventsvsMultiplicity.add("AllEventsvsMultiplicityFT0M", "T0M distribution of all events", HistType::kTH1F, {multAxisT0M}); EventsvsMultiplicity.add("AllEventsvsMultiplicityFT0MwOmega", "T0M distribution of events w/ Omega candidate", HistType::kTH1F, {multAxisT0M}); + EventsvsMultiplicity.add("AllEventsvsMultiplicityFT0MNorm", "T0M Normalised of all events", HistType::kTH1F, {multAxisT0MNorm}); + EventsvsMultiplicity.add("AllEventsvsMultiplicityFT0MwOmegaNorm", "T0M distribution of events w/ Omega candidate - Normalised FT0M", HistType::kTH1F, {multAxisT0MNorm}); + EventsvsMultiplicity.add("AllEventsvsMultiplicityFT0MNoFT0", "T0M distribution of events without FT0", HistType::kTH1F, {multAxisT0M}); + if (doextraQA) { EventsvsMultiplicity.add("AllEventsvsMultiplicityZeqV0A", "ZeqV0A distribution of all events", HistType::kTH1F, {multAxisV0A}); EventsvsMultiplicity.add("hadEventsvsMultiplicityZeqV0A", "ZeqV0A distribution of events with hight pT hadron", HistType::kTH1F, {multAxisV0A}); @@ -409,7 +418,7 @@ struct strangenessFilter { } void process(CollisionCandidatesRun3 const& collision, TrackCandidates const& tracks, Cascades const& fullCasc, DaughterTracks& /*dtracks*/, - aod::AssignedTrackedCascades const& trackedCascades, aod::Cascades const& /*cascades*/, aod::AssignedTrackedV0s const& /*trackedV0s*/, aod::AssignedTracked3Bodys const& /*tracked3Bodys*/, aod::V0s const&, aod::BCsWithTimestamps const&) + aod::AssignedTrackedCascades const& trackedCascades, aod::Cascades const& /*cascades*/, aod::AssignedTrackedV0s const& /*trackedV0s*/, aod::AssignedTracked3Bodys const& /*tracked3Bodys*/, aod::V0s const&, aod::BCsWithTimestamps const&, aod::FT0s const& /*ft0s*/) { // Is event good? [0] = Omega, [1] = high-pT hadron + Omega, [2] = 2Xi, [3] = 3Xi, [4] = 4Xi, [5] single-Xi, [6] Omega with high radius // [7] tracked Xi, [8] tracked Omega, [9] Omega + high mult event @@ -442,9 +451,66 @@ struct strangenessFilter { } Bool_t isHighMultEvent = 0; + float multFT0MNorm = 0.f; EventsvsMultiplicity.fill(HIST("AllEventsvsMultiplicityFT0M"), collision.multFT0M()); - if (collision.multFT0M() > LowLimitFT0MMult) - isHighMultEvent = 1; + if (!useNormalisedMult) { + if (collision.multFT0M() > LowLimitFT0MMult) { + isHighMultEvent = 1; + } + } else { + auto bc = collision.template bc_as(); + float meanMultT0C = 0.f; + float fac_FT0C_ebe = 1.; + auto vMeanMultT0C = ccdb->getForTimeStamp>("Users/e/ekryshen/meanT0C", bc.timestamp()); + meanMultT0C = (*vMeanMultT0C)[0]; + if (meanMultT0C > 0) { + fac_FT0C_ebe = avPyT0C / meanMultT0C; + } + float meanMultT0A = 0.f; + auto vMeanMultT0A = ccdb->getForTimeStamp>("Users/e/ekryshen/meanT0A", bc.timestamp()); + meanMultT0A = (*vMeanMultT0A)[0]; + float fac_FT0A_ebe = 1.; + if (meanMultT0A > 0) { + fac_FT0A_ebe = avPyT0A / meanMultT0A; + } + LOG(debug) << "Mean mults t0:" << fac_FT0A_ebe << " " << fac_FT0C_ebe; + if (collision.has_foundFT0()) { + auto ft0 = collision.foundFT0(); + float sumAmpFT0C = 0.f; + for (std::size_t i_c = 0; i_c < ft0.amplitudeC().size(); i_c++) { + float amplitude = ft0.amplitudeC()[i_c]; + sumAmpFT0C += amplitude; + } + float sumAmpFT0A = 0.f; + for (std::size_t i_a = 0; i_a < ft0.amplitudeA().size(); i_a++) { + float amplitude = ft0.amplitudeA()[i_a]; + sumAmpFT0A += amplitude; + } + const int nEta5 = 2; // FT0C + FT0A + float weigthsEta5[nEta5] = {0.0490638, 0.010958415}; + if (sumAmpFT0C >= 0 || sumAmpFT0A >= 0) { + if (meanMultT0A > 0 && meanMultT0C > 0) { + multFT0MNorm = sumAmpFT0C * fac_FT0C_ebe + sumAmpFT0A * fac_FT0A_ebe; + } else { + multFT0MNorm = sumAmpFT0C * weigthsEta5[0] + sumAmpFT0A * weigthsEta5[1]; + } + LOG(info) << "meanMult:" << multFT0MNorm << " multFT0M:" << collision.multFT0M(); + EventsvsMultiplicity.fill(HIST("AllEventsvsMultiplicityFT0MNorm"), multFT0MNorm); + if (multFT0MNorm > LowLimitFT0MMultNorm) { + isHighMultEvent = 1; + LOG(info) << "Found FT0 using aver mult"; + } + } else { + LOG(warn) << "Found FT0 but, amplitudes are 0 ?"; + EventsvsMultiplicity.fill(HIST("AllEventsvsMultiplicityFT0MNorm"), 148); + EventsvsMultiplicity.fill(HIST("AllEventsvsMultiplicityFT0MNoFT0"), collision.multFT0M()); + } + } else { + LOG(warn) << "FT0 not Found, using FT0M"; + EventsvsMultiplicity.fill(HIST("AllEventsvsMultiplicityFT0MNorm"), 149); + EventsvsMultiplicity.fill(HIST("AllEventsvsMultiplicityFT0MNoFT0"), collision.multFT0M()); + } + } // constants const float ctauxi = 4.91; // from PDG @@ -845,8 +911,10 @@ struct strangenessFilter { } // Omega in high multiplicity events - if (omegacounter > 0) + if (omegacounter > 0) { EventsvsMultiplicity.fill(HIST("AllEventsvsMultiplicityFT0MwOmega"), collision.multFT0M()); + EventsvsMultiplicity.fill(HIST("AllEventsvsMultiplicityFT0MwOmegaNorm"), multFT0MNorm); + } if (omegacounter > 0 && isHighMultEvent) { keepEvent[9] = true; } From 6f90bd826e427d425427430d1e54eb3d42a8330d Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Sat, 29 Mar 2025 18:56:24 +0900 Subject: [PATCH 0865/1650] [PWGEM/Dilepton] update muon analysis (#10698) --- PWGEM/Dilepton/Core/Dilepton.h | 33 ++++--- PWGEM/Dilepton/Core/DileptonMC.h | 12 +-- PWGEM/Dilepton/Core/DimuonCut.h | 72 +++++++-------- PWGEM/Dilepton/Core/SingleTrackQC.h | 31 ++++--- PWGEM/Dilepton/Core/SingleTrackQCMC.h | 29 ++++--- PWGEM/Dilepton/DataModel/dileptonTables.h | 8 +- PWGEM/Dilepton/TableProducer/filterEoI.cxx | 2 +- .../TableProducer/skimmerPrimaryMuon.cxx | 6 +- PWGEM/Dilepton/Utils/EMFwdTrack.h | 87 ++----------------- PWGEM/Dilepton/Utils/EMTrackUtilities.h | 6 +- 10 files changed, 110 insertions(+), 176 deletions(-) diff --git a/PWGEM/Dilepton/Core/Dilepton.h b/PWGEM/Dilepton/Core/Dilepton.h index 9508029a148..89586b397d8 100644 --- a/PWGEM/Dilepton/Core/Dilepton.h +++ b/PWGEM/Dilepton/Core/Dilepton.h @@ -80,13 +80,13 @@ using MyElectron = MyElectrons::iterator; using FilteredMyElectrons = soa::Filtered; using FilteredMyElectron = FilteredMyElectrons::iterator; -using MyMuons = soa::Join; +using MyMuons = soa::Join; using MyMuon = MyMuons::iterator; using FilteredMyMuons = soa::Filtered; using FilteredMyMuon = FilteredMyMuons::iterator; using MyEMH_electron = o2::aod::pwgem::dilepton::utils::EventMixingHandler, std::pair, EMTrackWithCov>; -using MyEMH_muon = o2::aod::pwgem::dilepton::utils::EventMixingHandler, std::pair, EMFwdTrackWithCov>; +using MyEMH_muon = o2::aod::pwgem::dilepton::utils::EventMixingHandler, std::pair, EMFwdTrack>; template struct Dilepton { @@ -260,7 +260,7 @@ struct Dilepton { Configurable cfg_min_deta{"cfg_min_deta", 0.02, "min deta between 2 muons (elliptic cut)"}; Configurable cfg_min_dphi{"cfg_min_dphi", 0.02, "min dphi between 2 muons (elliptic cut)"}; - Configurable cfg_track_type{"cfg_track_type", 3, "muon track type [0: MFT-MCH-MID, 3: MCH-MID]"}; + Configurable cfg_track_type{"cfg_track_type", 3, "muon track type [0: MFT-MCH-MID, 3: MCH-MID]"}; Configurable cfg_min_pt_track{"cfg_min_pt_track", 0.2, "min pT for single track"}; Configurable cfg_max_pt_track{"cfg_max_pt_track", 1e+10, "max pT for single track"}; Configurable cfg_min_eta_track{"cfg_min_eta_track", -4.0, "min eta for single track"}; @@ -418,8 +418,11 @@ struct Dilepton { // fwdfitter.setTGeoMat(false); } - fRegistry.addClone("Event/before/hCollisionCounter", "Event/norm/hCollisionCounter"); fRegistry.add("Pair/mix/hDiffBC", "diff. global BC in mixed event;|BC_{current} - BC_{mixed}|", kTH1D, {{10001, -0.5, 10000.5}}, true); + + if (doprocessNorm) { + fRegistry.addClone("Event/before/hCollisionCounter", "Event/norm/hCollisionCounter"); + } if (doprocessTriggerAnalysis) { fRegistry.add("Event/hNInspectedTVX", "N inspected TVX;run number;N_{TVX}", kTProfile, {{80000, 520000.5, 600000.5}}, true); } @@ -1071,13 +1074,11 @@ struct Dilepton { used_trackIds.emplace_back(pair_tmp_id1); if (cfgDoMix) { if (t1.sign() > 0) { - emh_pos->AddTrackToEventPool(key_df_collision, EMFwdTrackWithCov(ndf, t1.globalIndex(), collision.globalIndex(), t1.fwdtrackId(), t1.pt(), t1.eta(), t1.phi(), o2::constants::physics::MassMuon, t1.sign(), t1.fwdDcaX(), t1.fwdDcaY(), possibleIds1, - t1.x(), t1.y(), t1.z(), t1.tgl(), t1.cXX(), t1.cXY(), t1.cYY(), - t1.cPhiX(), t1.cPhiY(), t1.cPhiPhi(), t1.cTglX(), t1.cTglY(), t1.cTglPhi(), t1.cTglTgl(), t1.c1PtX(), t1.c1PtY(), t1.c1PtPhi(), t1.c1PtTgl(), t1.c1Pt21Pt2(), t1.chi2())); + emh_pos->AddTrackToEventPool(key_df_collision, EMFwdTrack(ndf, t1.globalIndex(), collision.globalIndex(), t1.fwdtrackId(), t1.pt(), t1.eta(), t1.phi(), o2::constants::physics::MassMuon, t1.sign(), t1.fwdDcaX(), t1.fwdDcaY(), possibleIds1, + t1.cXXatDCA(), t1.cXYatDCA(), t1.cYYatDCA())); } else { - emh_neg->AddTrackToEventPool(key_df_collision, EMFwdTrackWithCov(ndf, t1.globalIndex(), collision.globalIndex(), t1.fwdtrackId(), t1.pt(), t1.eta(), t1.phi(), o2::constants::physics::MassMuon, t1.sign(), t1.fwdDcaX(), t1.fwdDcaY(), possibleIds1, - t1.x(), t1.y(), t1.z(), t1.tgl(), t1.cXX(), t1.cXY(), t1.cYY(), - t1.cPhiX(), t1.cPhiY(), t1.cPhiPhi(), t1.cTglX(), t1.cTglY(), t1.cTglPhi(), t1.cTglTgl(), t1.c1PtX(), t1.c1PtY(), t1.c1PtPhi(), t1.c1PtTgl(), t1.c1Pt21Pt2(), t1.chi2())); + emh_neg->AddTrackToEventPool(key_df_collision, EMFwdTrack(ndf, t1.globalIndex(), collision.globalIndex(), t1.fwdtrackId(), t1.pt(), t1.eta(), t1.phi(), o2::constants::physics::MassMuon, t1.sign(), t1.fwdDcaX(), t1.fwdDcaY(), possibleIds1, + t1.cXXatDCA(), t1.cXYatDCA(), t1.cYYatDCA())); } } } @@ -1085,13 +1086,11 @@ struct Dilepton { used_trackIds.emplace_back(pair_tmp_id2); if (cfgDoMix) { if (t2.sign() > 0) { - emh_pos->AddTrackToEventPool(key_df_collision, EMFwdTrackWithCov(ndf, t2.globalIndex(), collision.globalIndex(), t2.fwdtrackId(), t2.pt(), t2.eta(), t2.phi(), o2::constants::physics::MassMuon, t2.sign(), t2.fwdDcaX(), t2.fwdDcaY(), possibleIds2, - t2.x(), t2.y(), t2.z(), t2.tgl(), t2.cXX(), t2.cXY(), t2.cYY(), - t2.cPhiX(), t2.cPhiY(), t2.cPhiPhi(), t2.cTglX(), t2.cTglY(), t2.cTglPhi(), t2.cTglTgl(), t2.c1PtX(), t2.c1PtY(), t2.c1PtPhi(), t2.c1PtTgl(), t2.c1Pt21Pt2(), t2.chi2())); + emh_pos->AddTrackToEventPool(key_df_collision, EMFwdTrack(ndf, t2.globalIndex(), collision.globalIndex(), t2.fwdtrackId(), t2.pt(), t2.eta(), t2.phi(), o2::constants::physics::MassMuon, t2.sign(), t2.fwdDcaX(), t2.fwdDcaY(), possibleIds2, + t2.cXXatDCA(), t2.cXYatDCA(), t2.cYYatDCA())); } else { - emh_neg->AddTrackToEventPool(key_df_collision, EMFwdTrackWithCov(ndf, t2.globalIndex(), collision.globalIndex(), t2.fwdtrackId(), t2.pt(), t2.eta(), t2.phi(), o2::constants::physics::MassMuon, t2.sign(), t2.fwdDcaX(), t2.fwdDcaY(), possibleIds2, - t2.x(), t2.y(), t2.z(), t2.tgl(), t2.cXX(), t2.cXY(), t2.cYY(), - t2.cPhiX(), t2.cPhiY(), t2.cPhiPhi(), t2.cTglX(), t2.cTglY(), t2.cTglPhi(), t2.cTglTgl(), t2.c1PtX(), t2.c1PtY(), t2.c1PtPhi(), t2.c1PtTgl(), t2.c1Pt21Pt2(), t2.chi2())); + emh_neg->AddTrackToEventPool(key_df_collision, EMFwdTrack(ndf, t2.globalIndex(), collision.globalIndex(), t2.fwdtrackId(), t2.pt(), t2.eta(), t2.phi(), o2::constants::physics::MassMuon, t2.sign(), t2.fwdDcaX(), t2.fwdDcaY(), possibleIds2, + t2.cXXatDCA(), t2.cXYatDCA(), t2.cYYatDCA())); } } } @@ -1129,7 +1128,7 @@ struct Dilepton { Partition negative_electrons = o2::aod::emprimaryelectron::sign < int8_t(0); Preslice perCollision_muon = aod::emprimarymuon::emeventId; - Filter trackFilter_muon = o2::aod::fwdtrack::trackType == static_cast(dimuoncuts.cfg_track_type) && dimuoncuts.cfg_min_pt_track < o2::aod::fwdtrack::pt && dimuoncuts.cfg_min_eta_track < o2::aod::fwdtrack::eta && o2::aod::fwdtrack::eta < dimuoncuts.cfg_max_eta_track && dimuoncuts.cfg_min_phi_track < o2::aod::fwdtrack::phi && o2::aod::fwdtrack::phi < dimuoncuts.cfg_max_phi_track; + Filter trackFilter_muon = o2::aod::fwdtrack::trackType == dimuoncuts.cfg_track_type && dimuoncuts.cfg_min_pt_track < o2::aod::fwdtrack::pt && o2::aod::fwdtrack::pt < dimuoncuts.cfg_max_pt_track && dimuoncuts.cfg_min_eta_track < o2::aod::fwdtrack::eta && o2::aod::fwdtrack::eta < dimuoncuts.cfg_max_eta_track && dimuoncuts.cfg_min_phi_track < o2::aod::fwdtrack::phi && o2::aod::fwdtrack::phi < dimuoncuts.cfg_max_phi_track; Filter ttcaFilter_muon = ifnode(dimuoncuts.enableTTCA.node(), o2::aod::emprimarymuon::isAssociatedToMPC == true || o2::aod::emprimarymuon::isAssociatedToMPC == false, o2::aod::emprimarymuon::isAssociatedToMPC == true); Partition positive_muons = o2::aod::emprimarymuon::sign > int8_t(0); Partition negative_muons = o2::aod::emprimarymuon::sign < int8_t(0); diff --git a/PWGEM/Dilepton/Core/DileptonMC.h b/PWGEM/Dilepton/Core/DileptonMC.h index 994f426adbf..a79d588b532 100644 --- a/PWGEM/Dilepton/Core/DileptonMC.h +++ b/PWGEM/Dilepton/Core/DileptonMC.h @@ -73,7 +73,7 @@ using MyMCElectron = MyMCElectrons::iterator; using FilteredMyMCElectrons = soa::Filtered; using FilteredMyMCElectron = FilteredMyMCElectrons::iterator; -using MyMCMuons = soa::Join; +using MyMCMuons = soa::Join; using MyMCMuon = MyMCMuons::iterator; using FilteredMyMCMuons = soa::Filtered; using FilteredMyMCMuon = FilteredMyMCMuons::iterator; @@ -252,7 +252,7 @@ struct DileptonMC { Configurable cfg_min_deta{"cfg_min_deta", 0.02, "min deta between 2 muons (elliptic cut)"}; Configurable cfg_min_dphi{"cfg_min_dphi", 0.02, "min dphi between 2 muons (elliptic cut)"}; - Configurable cfg_track_type{"cfg_track_type", 3, "muon track type [0: MFT-MCH-MID, 3: MCH-MID]"}; + Configurable cfg_track_type{"cfg_track_type", 3, "muon track type [0: MFT-MCH-MID, 3: MCH-MID]"}; Configurable cfg_min_pt_track{"cfg_min_pt_track", 0.2, "min pT for single track"}; Configurable cfg_max_pt_track{"cfg_max_pt_track", 1e+10, "max pT for single track"}; Configurable cfg_min_eta_track{"cfg_min_eta_track", -4.0, "min eta for single track"}; @@ -528,7 +528,9 @@ struct DileptonMC { // fwdfitter.setUseAbsDCA(true); // fwdfitter.setTGeoMat(false); } - fRegistry.addClone("Event/before/hCollisionCounter", "Event/norm/hCollisionCounter"); + if (doprocessNorm) { + fRegistry.addClone("Event/before/hCollisionCounter", "Event/norm/hCollisionCounter"); + } } template @@ -808,7 +810,7 @@ struct DileptonMC { return false; } } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { - if (!cut.template IsSelectedTrack(t1) || !cut.template IsSelectedTrack(t2)) { + if (!cut.template IsSelectedTrack(t1) || !cut.template IsSelectedTrack(t2)) { return false; } if (!cut.template IsSelectedPair(t1, t2)) { @@ -1199,7 +1201,7 @@ struct DileptonMC { o2::aod::emprimaryelectron::pfb >= static_cast(0)); Preslice perCollision_muon = aod::emprimarymuon::emeventId; - Filter trackFilter_muon = o2::aod::fwdtrack::trackType == static_cast(dimuoncuts.cfg_track_type) && dimuoncuts.cfg_min_phi_track < o2::aod::fwdtrack::phi && o2::aod::fwdtrack::phi < dimuoncuts.cfg_max_phi_track; + Filter trackFilter_muon = o2::aod::fwdtrack::trackType == dimuoncuts.cfg_track_type && dimuoncuts.cfg_min_phi_track < o2::aod::fwdtrack::phi && o2::aod::fwdtrack::phi < dimuoncuts.cfg_max_phi_track; Filter ttcaFilter_muon = ifnode(dimuoncuts.enableTTCA.node(), o2::aod::emprimarymuon::isAssociatedToMPC == true || o2::aod::emprimarymuon::isAssociatedToMPC == false, o2::aod::emprimarymuon::isAssociatedToMPC == true); Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); diff --git a/PWGEM/Dilepton/Core/DimuonCut.h b/PWGEM/Dilepton/Core/DimuonCut.h index b13569387da..41ba34f47a4 100644 --- a/PWGEM/Dilepton/Core/DimuonCut.h +++ b/PWGEM/Dilepton/Core/DimuonCut.h @@ -158,42 +158,42 @@ class DimuonCut : public TNamed return true; } - template - bool IsSelectedTrackWoPtEta(TTrack const& track) const - { - if (!IsSelectedTrack(track, DimuonCuts::kTrackType)) { - return false; - } - if (!IsSelectedTrack(track, DimuonCuts::kTrackPhiRange)) { - return false; - } - if (!IsSelectedTrack(track, DimuonCuts::kDCAxy)) { - return false; - } - if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) && !IsSelectedTrack(track, DimuonCuts::kMFTNCls)) { - return false; - } - if (!IsSelectedTrack(track, DimuonCuts::kMCHMIDNCls)) { - return false; - } - if (!IsSelectedTrack(track, DimuonCuts::kChi2)) { - return false; - } - if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) && !IsSelectedTrack(track, DimuonCuts::kMatchingChi2MCHMFT)) { - return false; - } - if (!IsSelectedTrack(track, DimuonCuts::kMatchingChi2MCHMID)) { - return false; - } - if (!IsSelectedTrack(track, DimuonCuts::kPDCA)) { - return false; - } - if (!IsSelectedTrack(track, DimuonCuts::kRabs)) { - return false; - } - - return true; - } + // template + // bool IsSelectedTrackWoPtEta(TTrack const& track) const + // { + // if (!IsSelectedTrack(track, DimuonCuts::kTrackType)) { + // return false; + // } + // if (!IsSelectedTrack(track, DimuonCuts::kTrackPhiRange)) { + // return false; + // } + // if (!IsSelectedTrack(track, DimuonCuts::kDCAxy)) { + // return false; + // } + // if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) && !IsSelectedTrack(track, DimuonCuts::kMFTNCls)) { + // return false; + // } + // if (!IsSelectedTrack(track, DimuonCuts::kMCHMIDNCls)) { + // return false; + // } + // if (!IsSelectedTrack(track, DimuonCuts::kChi2)) { + // return false; + // } + // if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) && !IsSelectedTrack(track, DimuonCuts::kMatchingChi2MCHMFT)) { + // return false; + // } + // if (!IsSelectedTrack(track, DimuonCuts::kMatchingChi2MCHMID)) { + // return false; + // } + // if (!IsSelectedTrack(track, DimuonCuts::kPDCA)) { + // return false; + // } + // if (!IsSelectedTrack(track, DimuonCuts::kRabs)) { + // return false; + // } + // + // return true; + // } template bool IsSelectedTrack(T const& track, const DimuonCuts& cut) const diff --git a/PWGEM/Dilepton/Core/SingleTrackQC.h b/PWGEM/Dilepton/Core/SingleTrackQC.h index b13b7593fa6..be971c95c41 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQC.h @@ -61,7 +61,7 @@ using MyElectron = MyElectrons::iterator; using FilteredMyElectrons = soa::Filtered; using FilteredMyElectron = FilteredMyElectrons::iterator; -using MyMuons = soa::Join; +using MyMuons = soa::Join; using MyMuon = MyMuons::iterator; using FilteredMyMuons = soa::Filtered; using FilteredMyMuon = FilteredMyMuons::iterator; @@ -178,8 +178,9 @@ struct SingleTrackQC { struct : ConfigurableGroup { std::string prefix = "dimuoncut_group"; - Configurable cfg_track_type{"cfg_track_type", 3, "muon track type [0: MFT-MCH-MID, 3: MCH-MID]"}; + Configurable cfg_track_type{"cfg_track_type", 3, "muon track type [0: MFT-MCH-MID, 3: MCH-MID]"}; Configurable cfg_min_pt_track{"cfg_min_pt_track", 0.2, "min pT for single track"}; + Configurable cfg_max_pt_track{"cfg_max_pt_track", 1e+10, "min pT for single track"}; Configurable cfg_min_eta_track{"cfg_min_eta_track", -4.0, "min eta for single track"}; Configurable cfg_max_eta_track{"cfg_max_eta_track", -2.5, "max eta for single track"}; Configurable cfg_min_phi_track{"cfg_min_phi_track", 0.f, "max phi for single track"}; @@ -303,7 +304,9 @@ struct SingleTrackQC { addhistograms(); mRunNumber = 0; - fRegistry.addClone("Event/before/hCollisionCounter", "Event/norm/hCollisionCounter"); + if (doprocessNorm) { + fRegistry.addClone("Event/before/hCollisionCounter", "Event/norm/hCollisionCounter"); + } if (doprocessQC_TriggeredData) { fRegistry.add("Event/hNInspectedTVX", "N inspected TVX;run number;N_{TVX}", kTProfile, {{80000, 520000.5, 600000.5}}, true); } @@ -418,7 +421,7 @@ struct SingleTrackQC { // for track fDimuonCut.SetTrackType(dimuoncuts.cfg_track_type); - fDimuonCut.SetTrackPtRange(dimuoncuts.cfg_min_pt_track, 1e10f); + fDimuonCut.SetTrackPtRange(dimuoncuts.cfg_min_pt_track, dimuoncuts.cfg_max_pt_track); fDimuonCut.SetTrackEtaRange(dimuoncuts.cfg_min_eta_track, dimuoncuts.cfg_max_eta_track); fDimuonCut.SetTrackPhiRange(dimuoncuts.cfg_min_phi_track, dimuoncuts.cfg_max_phi_track); fDimuonCut.SetNClustersMFT(dimuoncuts.cfg_min_ncluster_mft, 10); @@ -450,9 +453,9 @@ struct SingleTrackQC { fRegistry.fill(HIST("Track/positive/hs"), track.pt(), track.eta(), track.phi(), dca, weight); fRegistry.fill(HIST("Track/positive/hQoverPt"), track.sign() / track.pt()); fRegistry.fill(HIST("Track/positive/hDCAxyz"), track.dcaXY(), track.dcaZ()); - fRegistry.fill(HIST("Track/positive/hDCAxyzSigma"), track.dcaXY() / sqrt(track.cYY()), track.dcaZ() / sqrt(track.cZZ())); - fRegistry.fill(HIST("Track/positive/hDCAxyRes_Pt"), track.pt(), sqrt(track.cYY()) * 1e+4); // convert cm to um - fRegistry.fill(HIST("Track/positive/hDCAzRes_Pt"), track.pt(), sqrt(track.cZZ()) * 1e+4); // convert cm to um + fRegistry.fill(HIST("Track/positive/hDCAxyzSigma"), track.dcaXY() / std::sqrt(track.cYY()), track.dcaZ() / std::sqrt(track.cZZ())); + fRegistry.fill(HIST("Track/positive/hDCAxyRes_Pt"), track.pt(), std::sqrt(track.cYY()) * 1e+4); // convert cm to um + fRegistry.fill(HIST("Track/positive/hDCAzRes_Pt"), track.pt(), std::sqrt(track.cZZ()) * 1e+4); // convert cm to um fRegistry.fill(HIST("Track/positive/hNclsITS"), track.itsNCls()); fRegistry.fill(HIST("Track/positive/hNclsTPC"), track.tpcNClsFound()); fRegistry.fill(HIST("Track/positive/hNcrTPC"), track.tpcNClsCrossedRows()); @@ -489,9 +492,9 @@ struct SingleTrackQC { fRegistry.fill(HIST("Track/negative/hs"), track.pt(), track.eta(), track.phi(), dca, weight); fRegistry.fill(HIST("Track/negative/hQoverPt"), track.sign() / track.pt()); fRegistry.fill(HIST("Track/negative/hDCAxyz"), track.dcaXY(), track.dcaZ()); - fRegistry.fill(HIST("Track/negative/hDCAxyzSigma"), track.dcaXY() / sqrt(track.cYY()), track.dcaZ() / sqrt(track.cZZ())); - fRegistry.fill(HIST("Track/negative/hDCAxyRes_Pt"), track.pt(), sqrt(track.cYY()) * 1e+4); // convert cm to um - fRegistry.fill(HIST("Track/negative/hDCAzRes_Pt"), track.pt(), sqrt(track.cZZ()) * 1e+4); // convert cm to um + fRegistry.fill(HIST("Track/negative/hDCAxyzSigma"), track.dcaXY() / std::sqrt(track.cYY()), track.dcaZ() / std::sqrt(track.cZZ())); + fRegistry.fill(HIST("Track/negative/hDCAxyRes_Pt"), track.pt(), std::sqrt(track.cYY()) * 1e+4); // convert cm to um + fRegistry.fill(HIST("Track/negative/hDCAzRes_Pt"), track.pt(), std::sqrt(track.cZZ()) * 1e+4); // convert cm to um fRegistry.fill(HIST("Track/negative/hNclsITS"), track.itsNCls()); fRegistry.fill(HIST("Track/negative/hNclsTPC"), track.tpcNClsFound()); fRegistry.fill(HIST("Track/negative/hNcrTPC"), track.tpcNClsCrossedRows()); @@ -610,7 +613,7 @@ struct SingleTrackQC { } // end of track loop } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { for (auto& track : tracks_per_coll) { - if (!cut.template IsSelectedTrack(track)) { + if (!cut.template IsSelectedTrack(track)) { continue; } fillMuonInfo(track); @@ -658,7 +661,7 @@ struct SingleTrackQC { } // end of track loop } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { for (auto& track : tracks_per_coll) { - if (!cut.template IsSelectedTrack(track)) { + if (!cut.template IsSelectedTrack(track)) { continue; } passed_trackIds.emplace_back(track.globalIndex()); @@ -703,7 +706,7 @@ struct SingleTrackQC { Filter ttcaFilter_electron = ifnode(dielectroncuts.enableTTCA.node(), o2::aod::emprimaryelectron::isAssociatedToMPC == true || o2::aod::emprimaryelectron::isAssociatedToMPC == false, o2::aod::emprimaryelectron::isAssociatedToMPC == true); Preslice perCollision_muon = aod::emprimarymuon::emeventId; - Filter trackFilter_muon = o2::aod::fwdtrack::trackType == static_cast(dimuoncuts.cfg_track_type) && dimuoncuts.cfg_min_pt_track < o2::aod::fwdtrack::pt && dimuoncuts.cfg_min_eta_track < o2::aod::fwdtrack::eta && o2::aod::fwdtrack::eta < dimuoncuts.cfg_max_eta_track && dimuoncuts.cfg_min_phi_track < o2::aod::fwdtrack::phi && o2::aod::fwdtrack::phi < dimuoncuts.cfg_max_phi_track; + Filter trackFilter_muon = o2::aod::fwdtrack::trackType == dimuoncuts.cfg_track_type && dimuoncuts.cfg_min_pt_track < o2::aod::fwdtrack::pt && o2::aod::fwdtrack::pt < dimuoncuts.cfg_max_pt_track && dimuoncuts.cfg_min_eta_track < o2::aod::fwdtrack::eta && o2::aod::fwdtrack::eta < dimuoncuts.cfg_max_eta_track && dimuoncuts.cfg_min_phi_track < o2::aod::fwdtrack::phi && o2::aod::fwdtrack::phi < dimuoncuts.cfg_max_phi_track; Filter ttcaFilter_muon = ifnode(dimuoncuts.enableTTCA.node(), o2::aod::emprimarymuon::isAssociatedToMPC == true || o2::aod::emprimarymuon::isAssociatedToMPC == false, o2::aod::emprimarymuon::isAssociatedToMPC == true); Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); @@ -784,7 +787,7 @@ struct SingleTrackQC { if (collision.sel8()) { fRegistry.fill(HIST("Event/norm/hCollisionCounter"), 10.0); } - if (abs(collision.posZ()) < 10.0) { + if (std::fabs(collision.posZ()) < 10.0) { fRegistry.fill(HIST("Event/norm/hCollisionCounter"), 11.0); } if (collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { diff --git a/PWGEM/Dilepton/Core/SingleTrackQCMC.h b/PWGEM/Dilepton/Core/SingleTrackQCMC.h index c8a18b1b4bf..19b5fae615a 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQCMC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQCMC.h @@ -62,7 +62,7 @@ using MyMCElectrons = soa::Join; -using MyMCMuons = soa::Join; +using MyMCMuons = soa::Join; using MyMCMuon = MyMCMuons::iterator; using FilteredMyMCMuons = soa::Filtered; @@ -184,8 +184,9 @@ struct SingleTrackQCMC { DimuonCut fDimuonCut; struct : ConfigurableGroup { std::string prefix = "dimuoncut_group"; - Configurable cfg_track_type{"cfg_track_type", 3, "muon track type [0: MFT-MCH-MID, 3: MCH-MID]"}; + Configurable cfg_track_type{"cfg_track_type", 3, "muon track type [0: MFT-MCH-MID, 3: MCH-MID]"}; Configurable cfg_min_pt_track{"cfg_min_pt_track", 0.2, "min pT for single track"}; + Configurable cfg_max_pt_track{"cfg_max_pt_track", 1e+10, "max pT for single track"}; Configurable cfg_min_eta_track{"cfg_min_eta_track", -4.0, "min eta for single track"}; Configurable cfg_max_eta_track{"cfg_max_eta_track", -2.5, "max eta for single track"}; Configurable cfg_min_phi_track{"cfg_min_phi_track", 0.f, "max phi for single track"}; @@ -381,7 +382,9 @@ struct SingleTrackQCMC { pdg_lepton = 13; DefineDimuonCut(); } - fRegistry.addClone("Event/before/hCollisionCounter", "Event/norm/hCollisionCounter"); + if (doprocessNorm) { + fRegistry.addClone("Event/before/hCollisionCounter", "Event/norm/hCollisionCounter"); + } } void DefineEMEventCut() @@ -477,7 +480,7 @@ struct SingleTrackQCMC { // for track fDimuonCut.SetTrackType(dimuoncuts.cfg_track_type); - fDimuonCut.SetTrackPtRange(dimuoncuts.cfg_min_pt_track, 1e10f); + fDimuonCut.SetTrackPtRange(dimuoncuts.cfg_min_pt_track, dimuoncuts.cfg_max_pt_track); fDimuonCut.SetTrackEtaRange(dimuoncuts.cfg_min_eta_track, dimuoncuts.cfg_max_eta_track); fDimuonCut.SetTrackPhiRange(dimuoncuts.cfg_min_phi_track, dimuoncuts.cfg_max_phi_track); fDimuonCut.SetNClustersMFT(dimuoncuts.cfg_min_ncluster_mft, 10); @@ -554,9 +557,9 @@ struct SingleTrackQCMC { if (cfgFillQA) { fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hQoverPt"), track.sign() / track.pt()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hDCAxyz"), track.dcaXY(), track.dcaZ()); - fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hDCAxyzSigma"), track.dcaXY() / sqrt(track.cYY()), track.dcaZ() / sqrt(track.cZZ())); - fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hDCAxyRes_Pt"), track.pt(), sqrt(track.cYY()) * 1e+4); // convert cm to um - fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hDCAzRes_Pt"), track.pt(), sqrt(track.cZZ()) * 1e+4); // convert cm to um + fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hDCAxyzSigma"), track.dcaXY() / std::sqrt(track.cYY()), track.dcaZ() / std::sqrt(track.cZZ())); + fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hDCAxyRes_Pt"), track.pt(), std::sqrt(track.cYY()) * 1e+4); // convert cm to um + fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hDCAzRes_Pt"), track.pt(), std::sqrt(track.cZZ()) * 1e+4); // convert cm to um fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hNclsITS"), track.itsNCls()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hNclsTPC"), track.tpcNClsFound()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hNcrTPC"), track.tpcNClsCrossedRows()); @@ -598,9 +601,9 @@ struct SingleTrackQCMC { if (cfgFillQA) { fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hQoverPt"), track.sign() / track.pt()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hDCAxyz"), track.dcaXY(), track.dcaZ()); - fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hDCAxyzSigma"), track.dcaXY() / sqrt(track.cYY()), track.dcaZ() / sqrt(track.cZZ())); - fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hDCAxyRes_Pt"), track.pt(), sqrt(track.cYY()) * 1e+4); // convert cm to um - fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hDCAzRes_Pt"), track.pt(), sqrt(track.cZZ()) * 1e+4); // convert cm to um + fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hDCAxyzSigma"), track.dcaXY() / std::sqrt(track.cYY()), track.dcaZ() / std::sqrt(track.cZZ())); + fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hDCAxyRes_Pt"), track.pt(), std::sqrt(track.cYY()) * 1e+4); // convert cm to um + fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hDCAzRes_Pt"), track.pt(), std::sqrt(track.cZZ()) * 1e+4); // convert cm to um fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hNclsITS"), track.itsNCls()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hNclsTPC"), track.tpcNClsFound()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hNcrTPC"), track.tpcNClsCrossedRows()); @@ -746,7 +749,7 @@ struct SingleTrackQCMC { } } } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { - if (!cut.template IsSelectedTrack(track)) { + if (!cut.template IsSelectedTrack(track)) { continue; } } @@ -939,7 +942,7 @@ struct SingleTrackQCMC { continue; } - if (!cut.template IsSelectedTrack(track)) { + if (!cut.template IsSelectedTrack(track)) { continue; } passed_trackIds.emplace_back(track.globalIndex()); @@ -984,7 +987,7 @@ struct SingleTrackQCMC { Filter ttcaFilter_electron = ifnode(dielectroncuts.enableTTCA.node(), o2::aod::emprimaryelectron::isAssociatedToMPC == true || o2::aod::emprimaryelectron::isAssociatedToMPC == false, o2::aod::emprimaryelectron::isAssociatedToMPC == true); Preslice perCollision_muon = aod::emprimarymuon::emeventId; - Filter trackFilter_muon = o2::aod::fwdtrack::trackType == static_cast(dimuoncuts.cfg_track_type) && dimuoncuts.cfg_min_phi_track < o2::aod::fwdtrack::phi && o2::aod::fwdtrack::phi < dimuoncuts.cfg_max_phi_track; + Filter trackFilter_muon = o2::aod::fwdtrack::trackType == dimuoncuts.cfg_track_type && dimuoncuts.cfg_min_phi_track < o2::aod::fwdtrack::phi && o2::aod::fwdtrack::phi < dimuoncuts.cfg_max_phi_track; Filter ttcaFilter_muon = ifnode(dimuoncuts.enableTTCA.node(), o2::aod::emprimarymuon::isAssociatedToMPC == true || o2::aod::emprimarymuon::isAssociatedToMPC == false, o2::aod::emprimarymuon::isAssociatedToMPC == true); Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); diff --git a/PWGEM/Dilepton/DataModel/dileptonTables.h b/PWGEM/Dilepton/DataModel/dileptonTables.h index a0973df51b7..2084b0dbf4d 100644 --- a/PWGEM/Dilepton/DataModel/dileptonTables.h +++ b/PWGEM/Dilepton/DataModel/dileptonTables.h @@ -549,8 +549,6 @@ DECLARE_SOA_DYNAMIC_COLUMN(P, p, [](float pt, float eta) -> float { return pt * DECLARE_SOA_DYNAMIC_COLUMN(Px, px, [](float pt, float phi) -> float { return pt * std::cos(phi); }); DECLARE_SOA_DYNAMIC_COLUMN(Py, py, [](float pt, float phi) -> float { return pt * std::sin(phi); }); DECLARE_SOA_DYNAMIC_COLUMN(Pz, pz, [](float pt, float eta) -> float { return pt * std::sinh(eta); }); -DECLARE_SOA_DYNAMIC_COLUMN(Theta, theta, [](float tgl) -> float { return M_PI_2 - std::atan(tgl); }); -DECLARE_SOA_DYNAMIC_COLUMN(DcaXY, dcaXY, [](float dcaX, float dcaY) -> float { return std::sqrt(dcaX * dcaX + dcaY * dcaY); }); DECLARE_SOA_DYNAMIC_COLUMN(NClustersMFT, nClustersMFT, //! Number of MFT clusters [](uint64_t mftClusterSizesAndTrackFlags) -> uint8_t { uint8_t nClusters = 0; @@ -578,7 +576,7 @@ DECLARE_SOA_TABLE(EMPrimaryMuons, "AOD", "EMPRIMARYMU", //! fwdtrack::Pt, fwdtrack::Eta, fwdtrack::Phi, emprimarymuon::Sign, fwdtrack::FwdDcaX, fwdtrack::FwdDcaY, emprimarymuon::CXXatDCA, emprimarymuon::CYYatDCA, emprimarymuon::CXYatDCA, emprimarymuon::EtaMatchedMCHMID, emprimarymuon::PhiMatchedMCHMID, - fwdtrack::X, fwdtrack::Y, fwdtrack::Z, fwdtrack::Tgl, + // fwdtrack::X, fwdtrack::Y, fwdtrack::Z, fwdtrack::Tgl, fwdtrack::NClusters, fwdtrack::PDca, fwdtrack::RAtAbsorberEnd, fwdtrack::Chi2, fwdtrack::Chi2MatchMCHMID, fwdtrack::Chi2MatchMCHMFT, @@ -592,9 +590,7 @@ DECLARE_SOA_TABLE(EMPrimaryMuons, "AOD", "EMPRIMARYMU", //! emprimarymuon::P, emprimarymuon::Px, emprimarymuon::Py, - emprimarymuon::Pz, - emprimarymuon::Theta, - emprimarymuon::DcaXY); + emprimarymuon::Pz); // iterators using EMPrimaryMuon = EMPrimaryMuons::iterator; diff --git a/PWGEM/Dilepton/TableProducer/filterEoI.cxx b/PWGEM/Dilepton/TableProducer/filterEoI.cxx index ca7b524e19d..9edaeb784dc 100644 --- a/PWGEM/Dilepton/TableProducer/filterEoI.cxx +++ b/PWGEM/Dilepton/TableProducer/filterEoI.cxx @@ -50,7 +50,7 @@ struct filterEoI { template void selectEoI(TCollisions const& collisions, TElectrons const& electrons, TMuons const& muons) { - for (auto& collision : collisions) { + for (const auto& collision : collisions) { bool does_electron_exist = false; bool does_fwdmuon_exist = false; fRegistry.fill(HIST("hEventCounter"), 1); diff --git a/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx b/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx index c4c5e7f3f5c..fba3e527b5d 100644 --- a/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx +++ b/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx @@ -142,7 +142,7 @@ struct skimmerPrimaryMuon { fRegistry.add("Track/MFTMCHMID/hNclusters", "Nclusters;Nclusters", kTH1F, {{21, -0.5f, 20.5}}, false); fRegistry.add("Track/MFTMCHMID/hNclustersMFT", "NclustersMFT;Nclusters MFT", kTH1F, {{11, -0.5f, 10.5}}, false); fRegistry.add("Track/MFTMCHMID/hRatAbsorberEnd", "R at absorber end;R at absorber end (cm)", kTH1F, {{100, 0.0f, 100}}, false); - fRegistry.add("Track/MFTMCHMID/hPDCA", "pDCA;r at absorber (cm);p #times DCA (GeV/c #upoint cm)", kTH2F, {{100, 0, 100}, {100, 0.0f, 1000}}, false); + fRegistry.add("Track/MFTMCHMID/hPDCA", "pDCA;r at absorber end (cm);p #times DCA (GeV/c #upoint cm)", kTH2F, {{100, 0, 100}, {100, 0.0f, 1000}}, false); fRegistry.add("Track/MFTMCHMID/hChi2", "chi2;chi2", kTH1F, {{100, 0.0f, 100}}, false); fRegistry.add("Track/MFTMCHMID/hChi2MatchMCHMID", "chi2 match MCH-MID;chi2", kTH1F, {{100, 0.0f, 100}}, false); fRegistry.add("Track/MFTMCHMID/hChi2MatchMCHMFT", "chi2 match MCH-MFT;chi2", kTH1F, {{100, 0.0f, 100}}, false); @@ -212,7 +212,7 @@ struct skimmerPrimaryMuon { } emprimarymuons(collision.globalIndex(), fwdtrack.globalIndex(), -1, -1, muon.trackType(), muon.pt(), muon.eta(), muon.phi(), muon.sign(), muon.fwdDcaX(), muon.fwdDcaY(), muon.cXXatDCA(), muon.cYYatDCA(), muon.cXYatDCA(), muon.etaMatchedMCHMID(), muon.phiMatchedMCHMID(), - muon.x(), muon.y(), muon.z(), muon.tgl(), + // muon.x(), muon.y(), muon.z(), muon.tgl(), muon.nClusters(), muon.pDca(), muon.rAtAbsorberEnd(), muon.chi2(), muon.chi2MatchMCHMID(), muon.chi2MatchMCHMFT(), muon.mchBitMap(), muon.midBitMap(), muon.midBoards(), 0, 999999.f, muon.isAssociatedToMPC(), muon.isAmbiguous()); @@ -245,7 +245,7 @@ struct skimmerPrimaryMuon { emprimarymuons(collision.globalIndex(), fwdtrack.globalIndex(), mfttrack.globalIndex(), mchtrack.globalIndex(), muon.trackType(), muon.pt(), muon.eta(), muon.phi(), muon.sign(), muon.fwdDcaX(), muon.fwdDcaY(), muon.cXXatDCA(), muon.cYYatDCA(), muon.cXYatDCA(), muon.etaMatchedMCHMID(), muon.phiMatchedMCHMID(), - muon.x(), muon.y(), muon.z(), muon.tgl(), + // muon.x(), muon.y(), muon.z(), muon.tgl(), muon.nClusters(), muon.pDca(), muon.rAtAbsorberEnd(), muon.chi2(), muon.chi2MatchMCHMID(), muon.chi2MatchMCHMFT(), muon.mchBitMap(), muon.midBitMap(), muon.midBoards(), mfttrack.mftClusterSizesAndTrackFlags(), mfttrack.chi2(), muon.isAssociatedToMPC(), muon.isAmbiguous()); diff --git a/PWGEM/Dilepton/Utils/EMFwdTrack.h b/PWGEM/Dilepton/Utils/EMFwdTrack.h index 0aa590c6fb2..760441a08bf 100644 --- a/PWGEM/Dilepton/Utils/EMFwdTrack.h +++ b/PWGEM/Dilepton/Utils/EMFwdTrack.h @@ -22,7 +22,7 @@ namespace o2::aod::pwgem::dilepton::utils class EMFwdTrack { public: - EMFwdTrack(int dfId, int globalId, int collisionId, int trackId, float pt, float eta, float phi, float mass, int8_t charge = 0, float dcaX = 0.f, float dcaY = 0.f, std::vector amb_muon_self_ids = {}) + EMFwdTrack(int dfId, int globalId, int collisionId, int trackId, float pt, float eta, float phi, float mass, int8_t charge, float dcaX, float dcaY, std::vector amb_muon_self_ids, float cXX, float cXY, float cYY) { fDFId = dfId; fGlobalId = globalId; @@ -43,6 +43,10 @@ class EMFwdTrack } else { fIsAmbiguous = false; } + + fCXX = cXX; + fCXY = cXY; + fCYY = cYY; } ~EMFwdTrack() {} @@ -67,6 +71,10 @@ class EMFwdTrack std::vector ambiguousMuonsIds() const { return fAmbMuonSelfIds; } float signed1Pt() const { return fCharge * 1.f / fPt; } + float cXXatDCA() const { return fCXX; } + float cXYatDCA() const { return fCXY; } + float cYYatDCA() const { return fCYY; } + float pairDcaXYinSigmaOTF() const { return fPairDCAXYinSigmaOTF; } void setPairDcaXYinSigmaOTF(float dca) { fPairDCAXYinSigmaOTF = dca; } @@ -85,86 +93,9 @@ class EMFwdTrack float fPairDCAXYinSigmaOTF; bool fIsAmbiguous; std::vector fAmbMuonSelfIds; -}; - -class EMFwdTrackWithCov : public EMFwdTrack -{ - public: - EMFwdTrackWithCov(int dfId, int globalId, int collisionId, int trackId, float pt, float eta, float phi, float mass, int8_t charge = 0, float dcaX = 0.f, float dcaY = 0.f, std::vector amb_muon_self_ids = {}, - float X = 0.f, float Y = 0.f, float Z = 0.f, float Tgl = 0.f, - float CXX = 0.f, float CXY = 0.f, float CYY = 0.f, - float CPhiX = 0.f, float CPhiY = 0.f, float CPhiPhi = 0.f, - float CTglX = 0.f, float CTglY = 0.f, float CTglPhi = 0.f, float CTglTgl = 0.f, - float C1PtX = 0.f, float C1PtY = 0.f, float C1PtPhi = 0.f, float C1PtTgl = 0.f, float C1Pt21Pt2 = 0.f, float chi2 = 0.f) : EMFwdTrack(dfId, globalId, collisionId, trackId, pt, eta, phi, mass, charge, dcaX, dcaY, amb_muon_self_ids) - { - fX = X; - fY = Y; - fZ = Z; - fTgl = Tgl; - fCXX = CXX; - fCXY = CXY; - fCYY = CYY; - fCPhiX = CPhiX; - fCPhiY = CPhiY; - fCPhiPhi = CPhiPhi; - fCTglX = CTglX; - fCTglY = CTglY; - fCTglPhi = CTglPhi; - fCTglTgl = CTglTgl; - fC1PtX = C1PtX; - fC1PtY = C1PtY; - fC1PtPhi = C1PtPhi; - fC1PtTgl = C1PtTgl; - fC1Pt21Pt2 = C1Pt21Pt2; - fChi2 = chi2; - } - - float x() const { return fX; } - float y() const { return fY; } - float z() const { return fZ; } - float tgl() const { return fTgl; } - float cXX() const { return fCXX; } - float cXY() const { return fCXY; } - float cYY() const { return fCYY; } - float cPhiX() const { return fCPhiX; } - float cPhiY() const { return fCPhiY; } - float cPhiPhi() const { return fCPhiPhi; } - float cTglX() const { return fCTglX; } - float cTglY() const { return fCTglY; } - float cTglPhi() const { return fCTglPhi; } - float cTglTgl() const { return fCTglTgl; } - float c1PtX() const { return fC1PtX; } - float c1PtY() const { return fC1PtY; } - float c1PtPhi() const { return fC1PtPhi; } - float c1PtTgl() const { return fC1PtTgl; } - float c1Pt21Pt2() const { return fC1Pt21Pt2; } - float chi2() const { return fChi2; } - - void setCXX(float cXX) { fCXX = cXX; } - void setCXY(float cXY) { fCXY = cXY; } - void setCYY(float cYY) { fCYY = cYY; } - - protected: - float fX; - float fY; - float fZ; - float fTgl; float fCXX; float fCXY; float fCYY; - float fCPhiX; - float fCPhiY; - float fCPhiPhi; - float fCTglX; - float fCTglY; - float fCTglPhi; - float fCTglTgl; - float fC1PtX; - float fC1PtY; - float fC1PtPhi; - float fC1PtTgl; - float fC1Pt21Pt2; - float fChi2; }; } // namespace o2::aod::pwgem::dilepton::utils diff --git a/PWGEM/Dilepton/Utils/EMTrackUtilities.h b/PWGEM/Dilepton/Utils/EMTrackUtilities.h index f91fa9bb6cd..2792ef48eab 100644 --- a/PWGEM/Dilepton/Utils/EMTrackUtilities.h +++ b/PWGEM/Dilepton/Utils/EMTrackUtilities.h @@ -54,9 +54,9 @@ float dcaZinSigma(T const& track) template float fwdDcaXYinSigma(T const& track) { - float cXX = track.cXX(); - float cYY = track.cYY(); - float cXY = track.cXY(); + float cXX = track.cXXatDCA(); + float cYY = track.cYYatDCA(); + float cXY = track.cXYatDCA(); float dcaX = track.fwdDcaX(); // in cm float dcaY = track.fwdDcaY(); // in cm From 07aedd3d78bb4b61bbadd12a155a58d1dce928c3 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Sat, 29 Mar 2025 20:45:25 +0900 Subject: [PATCH 0866/1650] [PWGEM/Dilepton] reduce calling CCDB (#10699) --- .../TableProducer/skimmerPrimaryMuon.cxx | 96 +++++++++---------- 1 file changed, 46 insertions(+), 50 deletions(-) diff --git a/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx b/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx index fba3e527b5d..622ee6596bc 100644 --- a/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx +++ b/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx @@ -73,10 +73,10 @@ struct skimmerPrimaryMuon { // Configurables Configurable fillQAHistogram{"fillQAHistogram", false, "flag to fill QA histograms"}; - Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; - Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; - Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; - Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; + // Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + // Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; + // Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + // Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; Configurable minpt{"minpt", 0.2, "min pt for muon"}; Configurable mineta{"mineta", -4.0, "eta acceptance"}; Configurable maxeta{"maxeta", -2.5, "eta acceptance"}; @@ -85,24 +85,25 @@ struct skimmerPrimaryMuon { Configurable minRabs{"minRabs", 17.6, "min. R at absorber end"}; Configurable maxRabs{"maxRabs", 89.5, "max. R at absorber end"}; - o2::ccdb::CcdbApi ccdbApi; - Service ccdb; + // o2::ccdb::CcdbApi ccdbApi; + // Service ccdb; int mRunNumber; - o2::globaltracking::MatchGlobalFwd mMatching; + // o2::globaltracking::MatchGlobalFwd mMatching; HistogramRegistry fRegistry{"output", {}, OutputObjHandlingPolicy::AnalysisObject, false, false}; static constexpr std::string_view muon_types[5] = {"MFTMCHMID/", "MFTMCHMIDOtherMatch/", "MFTMCH/", "MCHMID/", "MCH/"}; void init(InitContext&) { - ccdb->setURL(ccdburl); - ccdb->setCaching(true); - ccdb->setLocalObjectValidityChecking(); - ccdb->setFatalWhenNull(false); - ccdbApi.init(ccdburl); - - addHistograms(); + // ccdb->setURL(ccdburl); + // ccdb->setCaching(true); + // ccdb->setLocalObjectValidityChecking(); + // ccdb->setFatalWhenNull(false); + // ccdbApi.init(ccdburl); + if (fillQAHistogram) { + addHistograms(); + } mRunNumber = 0; } @@ -111,47 +112,43 @@ struct skimmerPrimaryMuon { if (mRunNumber == bc.runNumber()) { return; } - mRunNumber = bc.runNumber(); - std::map metadata; - auto soreor = o2::ccdb::BasicCCDBManager::getRunDuration(ccdbApi, mRunNumber); - auto ts = soreor.first; - auto grpmag = ccdbApi.retrieveFromTFileAny(grpmagPath, metadata, ts); - o2::base::Propagator::initFieldFromGRP(grpmag); - if (!o2::base::GeometryManager::isGeometryLoaded()) { - ccdb->get(geoPath); - } - o2::mch::TrackExtrap::setField(); + + // std::map metadata; + // auto soreor = o2::ccdb::BasicCCDBManager::getRunDuration(ccdbApi, mRunNumber); + // auto ts = soreor.first; + // auto grpmag = ccdbApi.retrieveFromTFileAny(grpmagPath, metadata, ts); + // o2::base::Propagator::initFieldFromGRP(grpmag); + // if (!o2::base::GeometryManager::isGeometryLoaded()) { + // ccdb->get(geoPath); + // } + // o2::mch::TrackExtrap::setField(); } void addHistograms() { - fRegistry.add("Event/hCollisionCounter", "collision counter", kTH1F, {{2, -0.5f, 1.5}}, false); - // for track - if (fillQAHistogram) { - auto hMuonType = fRegistry.add("Track/hMuonType", "muon type", kTH1F, {{5, -0.5f, 4.5f}}); - hMuonType->GetXaxis()->SetBinLabel(1, "MFT-MCH-MID (global muon)"); - hMuonType->GetXaxis()->SetBinLabel(2, "MFT-MCH-MID (global muon other match)"); - hMuonType->GetXaxis()->SetBinLabel(3, "MFT-MCH"); - hMuonType->GetXaxis()->SetBinLabel(4, "MCH-MID"); - hMuonType->GetXaxis()->SetBinLabel(5, "MCH standalone"); - - fRegistry.add("Track/MFTMCHMID/hPt", "pT;p_{T} (GeV/c)", kTH1F, {{1000, 0.0f, 10}}, false); - fRegistry.add("Track/MFTMCHMID/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{360, 0, 2 * M_PI}, {30, -5.0f, -2.0f}}, false); - fRegistry.add("Track/MFTMCHMID/hNclusters", "Nclusters;Nclusters", kTH1F, {{21, -0.5f, 20.5}}, false); - fRegistry.add("Track/MFTMCHMID/hNclustersMFT", "NclustersMFT;Nclusters MFT", kTH1F, {{11, -0.5f, 10.5}}, false); - fRegistry.add("Track/MFTMCHMID/hRatAbsorberEnd", "R at absorber end;R at absorber end (cm)", kTH1F, {{100, 0.0f, 100}}, false); - fRegistry.add("Track/MFTMCHMID/hPDCA", "pDCA;r at absorber end (cm);p #times DCA (GeV/c #upoint cm)", kTH2F, {{100, 0, 100}, {100, 0.0f, 1000}}, false); - fRegistry.add("Track/MFTMCHMID/hChi2", "chi2;chi2", kTH1F, {{100, 0.0f, 100}}, false); - fRegistry.add("Track/MFTMCHMID/hChi2MatchMCHMID", "chi2 match MCH-MID;chi2", kTH1F, {{100, 0.0f, 100}}, false); - fRegistry.add("Track/MFTMCHMID/hChi2MatchMCHMFT", "chi2 match MCH-MFT;chi2", kTH1F, {{100, 0.0f, 100}}, false); - fRegistry.add("Track/MFTMCHMID/hDCAxy2D", "DCA xy;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -10, 10}, {200, -10, +10}}, false); - fRegistry.add("Track/MFTMCHMID/hDCAxy2DinSigma", "DCA xy;DCA_{x} (#sigma);DCA_{y} (#sigma)", kTH2F, {{200, -10, 10}, {200, -10, +10}}, false); - fRegistry.add("Track/MFTMCHMID/hDCAxResolutionvsPt", "DCA_{x} vs. p_{T,#mu};p_{T,#mu} (GeV/c);DCA_{x} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {100, 0, 100}}, false); - fRegistry.add("Track/MFTMCHMID/hDCAyResolutionvsPt", "DCA_{y} vs. p_{T,#mu};p_{T,#mu} (GeV/c);DCA_{y} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {100, 0, 100}}, false); - fRegistry.addClone("Track/MFTMCHMID/", "Track/MCHMID/"); - } + auto hMuonType = fRegistry.add("Track/hMuonType", "muon type", kTH1F, {{5, -0.5f, 4.5f}}); + hMuonType->GetXaxis()->SetBinLabel(1, "MFT-MCH-MID (global muon)"); + hMuonType->GetXaxis()->SetBinLabel(2, "MFT-MCH-MID (global muon other match)"); + hMuonType->GetXaxis()->SetBinLabel(3, "MFT-MCH"); + hMuonType->GetXaxis()->SetBinLabel(4, "MCH-MID"); + hMuonType->GetXaxis()->SetBinLabel(5, "MCH standalone"); + + fRegistry.add("Track/MFTMCHMID/hPt", "pT;p_{T} (GeV/c)", kTH1F, {{1000, 0.0f, 10}}, false); + fRegistry.add("Track/MFTMCHMID/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{360, 0, 2 * M_PI}, {30, -5.0f, -2.0f}}, false); + fRegistry.add("Track/MFTMCHMID/hNclusters", "Nclusters;Nclusters", kTH1F, {{21, -0.5f, 20.5}}, false); + fRegistry.add("Track/MFTMCHMID/hNclustersMFT", "NclustersMFT;Nclusters MFT", kTH1F, {{11, -0.5f, 10.5}}, false); + fRegistry.add("Track/MFTMCHMID/hRatAbsorberEnd", "R at absorber end;R at absorber end (cm)", kTH1F, {{100, 0.0f, 100}}, false); + fRegistry.add("Track/MFTMCHMID/hPDCA", "pDCA;r at absorber end (cm);p #times DCA (GeV/c #upoint cm)", kTH2F, {{100, 0, 100}, {100, 0.0f, 1000}}, false); + fRegistry.add("Track/MFTMCHMID/hChi2", "chi2;chi2", kTH1F, {{100, 0.0f, 100}}, false); + fRegistry.add("Track/MFTMCHMID/hChi2MatchMCHMID", "chi2 match MCH-MID;chi2", kTH1F, {{100, 0.0f, 100}}, false); + fRegistry.add("Track/MFTMCHMID/hChi2MatchMCHMFT", "chi2 match MCH-MFT;chi2", kTH1F, {{100, 0.0f, 100}}, false); + fRegistry.add("Track/MFTMCHMID/hDCAxy2D", "DCA xy;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -10, 10}, {200, -10, +10}}, false); + fRegistry.add("Track/MFTMCHMID/hDCAxy2DinSigma", "DCA xy;DCA_{x} (#sigma);DCA_{y} (#sigma)", kTH2F, {{200, -10, 10}, {200, -10, +10}}, false); + fRegistry.add("Track/MFTMCHMID/hDCAxResolutionvsPt", "DCA_{x} vs. p_{T,#mu};p_{T,#mu} (GeV/c);DCA_{x} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {100, 0, 100}}, false); + fRegistry.add("Track/MFTMCHMID/hDCAyResolutionvsPt", "DCA_{y} vs. p_{T,#mu};p_{T,#mu} (GeV/c);DCA_{y} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {100, 0, 100}}, false); + fRegistry.addClone("Track/MFTMCHMID/", "Track/MCHMID/"); } template @@ -178,7 +175,6 @@ struct skimmerPrimaryMuon { for (const auto& collision : collisions) { auto bc = collision.template foundBC_as(); initCCDB(bc); - fRegistry.fill(HIST("Event/hCollisionCounter"), 0.f); if (!collision.isSelected()) { continue; } From 5360c1c5ac18123df10159e2bf9881086012bd3c Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Sat, 29 Mar 2025 23:14:21 +0900 Subject: [PATCH 0867/1650] [PWGEM/Dilepton] bug fix in dimuon analyses (#10700) --- PWGEM/Dilepton/Core/Dilepton.h | 32 ++----------------------- PWGEM/Dilepton/Core/DileptonMC.h | 26 -------------------- PWGEM/Dilepton/Core/DimuonCut.h | 37 ----------------------------- PWGEM/Dilepton/Tasks/CMakeLists.txt | 8 +++---- 4 files changed, 6 insertions(+), 97 deletions(-) diff --git a/PWGEM/Dilepton/Core/Dilepton.h b/PWGEM/Dilepton/Core/Dilepton.h index 89586b397d8..4407399826b 100644 --- a/PWGEM/Dilepton/Core/Dilepton.h +++ b/PWGEM/Dilepton/Core/Dilepton.h @@ -34,8 +34,6 @@ #include "Framework/ASoAHelpers.h" #include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" -#include "DCAFitter/DCAFitterN.h" -#include "DCAFitter/FwdDCAFitterN.h" #include "CommonConstants/LHCConstants.h" #include "DataFormatsParameters/GRPLHCIFData.h" #include "DataFormatsParameters/GRPECSObject.h" @@ -282,8 +280,6 @@ struct Dilepton { Service ccdb; int mRunNumber; float d_bz; - // o2::vertexing::DCAFitterN<2> fitter; - // o2::vertexing::FwdDCAFitterN<2> fwdfitter; o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; HistogramRegistry fRegistry{"output", {}, OutputObjHandlingPolicy::AnalysisObject, false, false}; @@ -396,26 +392,10 @@ struct Dilepton { DefineDielectronCut(); leptonM1 = o2::constants::physics::MassElectron; leptonM2 = o2::constants::physics::MassElectron; - // fitter.setPropagateToPCA(true); - // fitter.setMaxR(5.f); - // fitter.setMinParamChange(1e-3); - // fitter.setMinRelChi2Change(0.9); - // fitter.setMaxDZIni(1e9); - // fitter.setMaxChi2(1e9); - // fitter.setUseAbsDCA(true); - // fitter.setWeightedFinalPCA(false); - // fitter.setMatCorrType(matCorr); } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { DefineDimuonCut(); leptonM1 = o2::constants::physics::MassMuon; leptonM2 = o2::constants::physics::MassMuon; - // fwdfitter.setPropagateToPCA(true); - // fwdfitter.setMaxR(90.f); - // fwdfitter.setMinParamChange(1e-3); - // fwdfitter.setMinRelChi2Change(0.9); - // fwdfitter.setMaxChi2(1e9); - // fwdfitter.setUseAbsDCA(true); - // fwdfitter.setTGeoMat(false); } fRegistry.add("Pair/mix/hDiffBC", "diff. global BC in mixed event;|BC_{current} - BC_{mixed}|", kTH1D, {{10001, -0.5, 10000.5}}, true); @@ -444,8 +424,6 @@ struct Dilepton { } o2::base::Propagator::initFieldFromGRP(&grpmag); mRunNumber = collision.runNumber(); - // fitter.setBz(d_bz); - // fwdfitter.setBz(d_bz); return; } @@ -470,8 +448,6 @@ struct Dilepton { LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; } mRunNumber = collision.runNumber(); - // fitter.setBz(d_bz); - // fwdfitter.setBz(d_bz); auto grplhcif = ccdb->getForTimeStamp("GLO/Config/GRPLHCIF", collision.timestamp()); int beamZ1 = grplhcif->getBeamZ(o2::constants::lhc::BeamC); @@ -746,7 +722,7 @@ struct Dilepton { fDimuonCut.SetTrackType(dimuoncuts.cfg_track_type); fDimuonCut.SetTrackPtRange(dimuoncuts.cfg_min_pt_track, dimuoncuts.cfg_max_pt_track); fDimuonCut.SetTrackEtaRange(dimuoncuts.cfg_min_eta_track, dimuoncuts.cfg_max_eta_track); - fDimuonCut.SetTrackEtaRange(dimuoncuts.cfg_min_phi_track, dimuoncuts.cfg_max_phi_track); + fDimuonCut.SetTrackPhiRange(dimuoncuts.cfg_min_phi_track, dimuoncuts.cfg_max_phi_track); fDimuonCut.SetNClustersMFT(dimuoncuts.cfg_min_ncluster_mft, 10); fDimuonCut.SetNClustersMCHMID(dimuoncuts.cfg_min_ncluster_mch, 16); fDimuonCut.SetChi2(0.f, dimuoncuts.cfg_max_chi2); @@ -834,7 +810,7 @@ struct Dilepton { } } } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { - if (!cut.template IsSelectedTrack(t1) || !cut.template IsSelectedTrack(t2)) { + if (!cut.template IsSelectedTrack(t1) || !cut.template IsSelectedTrack(t2)) { return false; } } @@ -850,10 +826,6 @@ struct Dilepton { } } - // float pca = 999.f, lxy = 999.f; // in unit of cm - // o2::aod::pwgem::dilepton::utils::pairutil::isSVFound(fitter, collision, t1, t2, pca, lxy); - // o2::aod::pwgem::dilepton::utils::pairutil::isSVFoundFwd(fwdfitter, collision, t1, t2, pca, lxy); - float weight = 1.f; if (cfgApplyWeightTTCA) { weight = map_weight[std::make_pair(t1.globalIndex(), t2.globalIndex())]; diff --git a/PWGEM/Dilepton/Core/DileptonMC.h b/PWGEM/Dilepton/Core/DileptonMC.h index a79d588b532..356c0538dfd 100644 --- a/PWGEM/Dilepton/Core/DileptonMC.h +++ b/PWGEM/Dilepton/Core/DileptonMC.h @@ -40,8 +40,6 @@ #include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" -#include "DCAFitter/DCAFitterN.h" -#include "DCAFitter/FwdDCAFitterN.h" #include "PWGEM/Dilepton/DataModel/dileptonTables.h" #include "PWGEM/Dilepton/Core/DielectronCut.h" @@ -272,8 +270,6 @@ struct DileptonMC { o2::ccdb::CcdbApi ccdbApi; Service ccdb; - // o2::vertexing::DCAFitterN<2> fitter; - // o2::vertexing::FwdDCAFitterN<2> fwdfitter; o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; int mRunNumber; float d_bz; @@ -506,27 +502,11 @@ struct DileptonMC { leptonM1 = o2::constants::physics::MassElectron; leptonM2 = o2::constants::physics::MassElectron; pdg_lepton = 11; - // fitter.setPropagateToPCA(true); - // fitter.setMaxR(5.f); - // fitter.setMinParamChange(1e-3); - // fitter.setMinRelChi2Change(0.9); - // fitter.setMaxDZIni(1e9); - // fitter.setMaxChi2(1e9); - // fitter.setUseAbsDCA(true); - // fitter.setWeightedFinalPCA(false); - // fitter.setMatCorrType(matCorr); } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { DefineDimuonCut(); leptonM1 = o2::constants::physics::MassMuon; leptonM2 = o2::constants::physics::MassMuon; pdg_lepton = 13; - // fwdfitter.setPropagateToPCA(true); - // fwdfitter.setMaxR(90.f); - // fwdfitter.setMinParamChange(1e-3); - // fwdfitter.setMinRelChi2Change(0.9); - // fwdfitter.setMaxChi2(1e9); - // fwdfitter.setUseAbsDCA(true); - // fwdfitter.setTGeoMat(false); } if (doprocessNorm) { fRegistry.addClone("Event/before/hCollisionCounter", "Event/norm/hCollisionCounter"); @@ -549,8 +529,6 @@ struct DileptonMC { } o2::base::Propagator::initFieldFromGRP(&grpmag); mRunNumber = collision.runNumber(); - // fitter.setBz(d_bz); - // fwdfitter.setBz(d_bz); return; } @@ -575,8 +553,6 @@ struct DileptonMC { LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; } mRunNumber = collision.runNumber(); - // fitter.setBz(d_bz); - // fwdfitter.setBz(d_bz); //// for muon // o2::base::Propagator::initFieldFromGRP(grpmag); @@ -818,8 +794,6 @@ struct DileptonMC { } } - // float pca = 999.f, lxy = 999.f; // in unit of cm - // o2::aod::pwgem::dilepton::utils::pairutil::isSVFound(fitter, collision, t1, t2, pca, lxy); float pt1 = 0.f, eta1 = 0.f, phi1 = 0.f, pt2 = 0.f, eta2 = 0.f, phi2 = 0.f; if constexpr (isSmeared) { if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { diff --git a/PWGEM/Dilepton/Core/DimuonCut.h b/PWGEM/Dilepton/Core/DimuonCut.h index 41ba34f47a4..4bb854c6b73 100644 --- a/PWGEM/Dilepton/Core/DimuonCut.h +++ b/PWGEM/Dilepton/Core/DimuonCut.h @@ -158,43 +158,6 @@ class DimuonCut : public TNamed return true; } - // template - // bool IsSelectedTrackWoPtEta(TTrack const& track) const - // { - // if (!IsSelectedTrack(track, DimuonCuts::kTrackType)) { - // return false; - // } - // if (!IsSelectedTrack(track, DimuonCuts::kTrackPhiRange)) { - // return false; - // } - // if (!IsSelectedTrack(track, DimuonCuts::kDCAxy)) { - // return false; - // } - // if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) && !IsSelectedTrack(track, DimuonCuts::kMFTNCls)) { - // return false; - // } - // if (!IsSelectedTrack(track, DimuonCuts::kMCHMIDNCls)) { - // return false; - // } - // if (!IsSelectedTrack(track, DimuonCuts::kChi2)) { - // return false; - // } - // if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) && !IsSelectedTrack(track, DimuonCuts::kMatchingChi2MCHMFT)) { - // return false; - // } - // if (!IsSelectedTrack(track, DimuonCuts::kMatchingChi2MCHMID)) { - // return false; - // } - // if (!IsSelectedTrack(track, DimuonCuts::kPDCA)) { - // return false; - // } - // if (!IsSelectedTrack(track, DimuonCuts::kRabs)) { - // return false; - // } - // - // return true; - // } - template bool IsSelectedTrack(T const& track, const DimuonCuts& cut) const { diff --git a/PWGEM/Dilepton/Tasks/CMakeLists.txt b/PWGEM/Dilepton/Tasks/CMakeLists.txt index 9a9067b6a6c..a27a00482f3 100644 --- a/PWGEM/Dilepton/Tasks/CMakeLists.txt +++ b/PWGEM/Dilepton/Tasks/CMakeLists.txt @@ -88,22 +88,22 @@ o2physics_add_dpl_workflow(single-muon-qc-mc o2physics_add_dpl_workflow(dielectron SOURCES dielectron.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2::DetectorsBase O2Physics::AnalysisCore O2Physics::MLCore O2::DCAFitter O2Physics::PWGEMDileptonCore + PUBLIC_LINK_LIBRARIES O2::Framework O2::DetectorsBase O2Physics::AnalysisCore O2Physics::MLCore O2Physics::PWGEMDileptonCore COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(dielectron-mc SOURCES dielectronMC.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2::DetectorsBase O2Physics::AnalysisCore O2Physics::MLCore O2::DCAFitter O2Physics::PWGEMDileptonCore + PUBLIC_LINK_LIBRARIES O2::Framework O2::DetectorsBase O2Physics::AnalysisCore O2Physics::MLCore O2Physics::PWGEMDileptonCore COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(dimuon SOURCES dimuon.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2::DetectorsBase O2Physics::AnalysisCore O2::DCAFitter O2Physics::PWGEMDileptonCore + PUBLIC_LINK_LIBRARIES O2::Framework O2::DetectorsBase O2Physics::AnalysisCore O2Physics::PWGEMDileptonCore COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(dimuon-mc SOURCES dimuonMC.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2::DetectorsBase O2Physics::AnalysisCore O2::DCAFitter O2Physics::PWGEMDileptonCore + PUBLIC_LINK_LIBRARIES O2::Framework O2::DetectorsBase O2Physics::AnalysisCore O2Physics::PWGEMDileptonCore COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(photon-hbt-pcmpcm From b8fda360a6b60f435579cf2a70fc963b2959663b Mon Sep 17 00:00:00 2001 From: yuanzhe <90246048+wang-yuanzhe@users.noreply.github.com> Date: Sat, 29 Mar 2025 21:25:01 +0100 Subject: [PATCH 0868/1650] [PWGLF] Add checks for the number of triggered events used in h3l 3body analysis (#10693) --- .../Nuspex/threebodyRecoTask.cxx | 67 +++++++++++++++---- 1 file changed, 55 insertions(+), 12 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx b/PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx index 91bdc538dea..36af287f95e 100644 --- a/PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx +++ b/PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx @@ -47,6 +47,25 @@ using ReducedCols = soa::Join; using FullTracksExtIU = soa::Join; using MCLabeledTracksIU = soa::Join; +std::vector triggerLabels = { + "fTriggerEventF1Proton", "fTrackedOmega", "fTrackedXi", "fOmegaLargeRadius", + "fDoubleOmega", "fOmegaHighMult", "fSingleXiYN", "fQuadrupleXi", "fDoubleXi", + "fhadronOmega", "fOmegaXi", "fTripleXi", "fOmega", "fGammaVeryLowPtEMCAL", + "fGammaVeryLowPtDCAL", "fGammaHighPtEMCAL", "fGammaLowPtEMCAL", "fGammaVeryHighPtDCAL", + "fGammaVeryHighPtEMCAL", "fGammaLowPtDCAL", "fJetNeutralLowPt", "fJetNeutralHighPt", + "fGammaHighPtDCAL", "fJetFullLowPt", "fJetFullHighPt", "fEMCALReadout", "fPCMandEE", + "fPHOSnbar", "fPCMHighPtPhoton", "fPHOSPhoton", "fLD", "fPPPHI", "fPD", "fLLL", "fPLL", + "fPPL", "fPPP", "fLeadingPtTrack", "fHighFt0cFv0Flat", "fHighFt0cFv0Mult", "fHighFt0Flat", + "fHighFt0Mult", "fHighMultFv0", "fHighTrackMult", "fHfSingleNonPromptCharm3P", + "fHfSingleNonPromptCharm2P", "fHfSingleCharm3P", "fHfPhotonCharm3P", "fHfHighPt2P", + "fHfSigmaC0K0", "fHfDoubleCharm2P", "fHfBeauty3P", "fHfFemto3P", "fHfFemto2P", + "fHfHighPt3P", "fHfSigmaCPPK", "fHfDoubleCharm3P", "fHfDoubleCharmMix", + "fHfPhotonCharm2P", "fHfV0Charm2P", "fHfBeauty4P", "fHfV0Charm3P", "fHfSingleCharm2P", + "fHfCharmBarToXiBach", "fSingleMuHigh", "fSingleMuLow", "fLMeeHMR", "fDiMuon", + "fDiElectron", "fLMeeIMR", "fSingleE", "fTrackHighPt", "fTrackLowPt", "fJetChHighPt", + "fJetChLowPt", "fUDdiffLarge", "fUDdiffSmall", "fITSextremeIonisation", + "fITSmildIonisation", "fH3L3Body", "fHe", "fH2"}; + struct Candidate3body { // Index int mcmotherId; @@ -102,8 +121,9 @@ struct ThreebodyRecoTask { PresliceUnsorted perCollisionVtx3BodyDatas = o2::aod::vtx3body::collisionId; // Configurable for trigger selection - Configurable triggerList{"triggerList", "fH3L3Body", "List of triggers used to select events"}; + Configurable triggerList{"triggerList", "fTriggerEventF1Proton, fTrackedOmega, fTrackedXi, fOmegaLargeRadius, fDoubleOmega, fOmegaHighMult, fSingleXiYN, fQuadrupleXi, fDoubleXi, fhadronOmega, fOmegaXi, fTripleXi, fOmega, fGammaVeryLowPtEMCAL, fGammaVeryLowPtDCAL, fGammaHighPtEMCAL, fGammaLowPtEMCAL, fGammaVeryHighPtDCAL, fGammaVeryHighPtEMCAL, fGammaLowPtDCAL, fJetNeutralLowPt, fJetNeutralHighPt, fGammaHighPtDCAL, fJetFullLowPt, fJetFullHighPt, fEMCALReadout, fPCMandEE, fPHOSnbar, fPCMHighPtPhoton, fPHOSPhoton, fLD, fPPPHI, fPD, fLLL, fPLL, fPPL, fPPP, fLeadingPtTrack, fHighFt0cFv0Flat, fHighFt0cFv0Mult, fHighFt0Flat, fHighFt0Mult, fHighMultFv0, fHighTrackMult, fHfSingleNonPromptCharm3P, fHfSingleNonPromptCharm2P, fHfSingleCharm3P, fHfPhotonCharm3P, fHfHighPt2P, fHfSigmaC0K0, fHfDoubleCharm2P, fHfBeauty3P, fHfFemto3P, fHfFemto2P, fHfHighPt3P, fHfSigmaCPPK, fHfDoubleCharm3P, fHfDoubleCharmMix, fHfPhotonCharm2P, fHfV0Charm2P, fHfBeauty4P, fHfV0Charm3P, fHfSingleCharm2P, fHfCharmBarToXiBach, fSingleMuHigh, fSingleMuLow, fLMeeHMR, fDiMuon, fDiElectron, fLMeeIMR, fSingleE, fTrackHighPt, fTrackLowPt, fJetChHighPt, fJetChLowPt, fUDdiffLarge, fUDdiffSmall, fITSextremeIonisation, fITSmildIonisation, fH3L3Body, fHe, fH2", "List of triggers used to select events"}; Configurable cfgOnlyKeepInterestedTrigger{"cfgOnlyKeepInterestedTrigger", false, "Flag to keep only interested trigger"}; + Configurable bcTolerance{"bcTolerance", 100, "Tolerance for BC in Zorro"}; // Configuration to enable like-sign analysis Configurable cfgLikeSignAnalysis{"cfgLikeSignAnalysis", false, "Enable like-sign analysis"}; // Selection criteria @@ -224,6 +244,7 @@ struct ThreebodyRecoTask { void init(InitContext const&) { zorroSummary.setObject(zorro.getZorroSummary()); + mRunNumber = 0; ccdb->setURL(ccdbUrl); @@ -243,6 +264,13 @@ struct ThreebodyRecoTask { registry.add("hDiffRVtxDeuteron", "hDiffRVtxDeuteron", HistType::kTH1F, {{100, -10, 10}}); // difference between the radius of decay vertex and minR of deuteron registry.add("hDiffDaughterR", "hDiffDaughterR", HistType::kTH1F, {{10000, -100, 100}}); // difference between minR of pion&proton and R of deuteron(bachelor) + // Check triggers + auto hEventTriggerCount = registry.add("hEventTriggerCount", "hEventTriggerCount", HistType::kTH1F, {{static_cast(triggerLabels.size() + 1), 0, static_cast(triggerLabels.size() + 1)}}); + for (size_t i = 0; i < triggerLabels.size(); i++) { + hEventTriggerCount->GetXaxis()->SetBinLabel(i + 1, triggerLabels[i].c_str()); + } + hEventTriggerCount->GetXaxis()->SetBinLabel(triggerLabels.size() + 1, "NoTrigger"); + if (cfgLikeSignAnalysis) { registry.add("hInvMassCorrectSign", "hInvMassCorrectSign", HistType::kTH1F, {{80, 2.96f, 3.04f}}); // check if there are contamination of possible signals which are caused by unexpected PID } @@ -282,6 +310,7 @@ struct ThreebodyRecoTask { zorro.populateHistRegistry(registry, bc.runNumber()); } + LOGF(info, "Initializing CCDB for run %d", bc.runNumber()); mRunNumber = bc.runNumber(); } @@ -296,13 +325,13 @@ struct ThreebodyRecoTask { bool haveProton = false, havePion = false, haveBachelor = false; bool haveAntiProton = false, haveAntiPion = false, haveAntiBachelor = false; for (const auto& mcparticleDaughter : particle.template daughters_as()) { - if (mcparticleDaughter.pdgCode() == 2212) + if (mcparticleDaughter.pdgCode() == PDG_t::kProton) haveProton = true; - if (mcparticleDaughter.pdgCode() == -2212) + if (mcparticleDaughter.pdgCode() == PDG_t::kProtonBar) haveAntiProton = true; - if (mcparticleDaughter.pdgCode() == 211) + if (mcparticleDaughter.pdgCode() == PDG_t::kPiPlus) havePion = true; - if (mcparticleDaughter.pdgCode() == -211) + if (mcparticleDaughter.pdgCode() == PDG_t::kPiMinus) haveAntiPion = true; if (mcparticleDaughter.pdgCode() == bachelorPdgCode) haveBachelor = true; @@ -642,13 +671,13 @@ struct ThreebodyRecoTask { bool haveAntiProton = false, havePionMinus = false, haveAntiDeuteron = false; double mcLifetime = -1; for (const auto& mcparticleDaughter : mcparticle.template daughters_as()) { - if (mcparticleDaughter.pdgCode() == 2212) + if (mcparticleDaughter.pdgCode() == PDG_t::kProton) haveProton = true; - if (mcparticleDaughter.pdgCode() == -2212) + if (mcparticleDaughter.pdgCode() == PDG_t::kProtonBar) haveAntiProton = true; - if (mcparticleDaughter.pdgCode() == 211) + if (mcparticleDaughter.pdgCode() == PDG_t::kPiPlus) havePionPlus = true; - if (mcparticleDaughter.pdgCode() == -211) + if (mcparticleDaughter.pdgCode() == -PDG_t::kPiPlus) havePionMinus = true; if (mcparticleDaughter.pdgCode() == bachelorPdgCode) { haveDeuteron = true; @@ -695,8 +724,20 @@ struct ThreebodyRecoTask { candidateAnalysis(collision, vtx, ifHasCandidate); } } - if (ifHasCandidate) + + if (ifHasCandidate) { + auto bc = collision.bc_as(); + auto triggerSelection = zorro.getTriggerOfInterestResults(bc.globalBC(), bcTolerance); + for (size_t i = 0; i < triggerSelection.size(); i++) { + if (triggerSelection[i]) { + registry.fill(HIST("hEventTriggerCount"), i + 0.5); + } + } + if (zorro.isNotSelectedByAny(bc.globalBC(), bcTolerance)) { + registry.fill(HIST("hEventTriggerCount"), triggerLabels.size() + 0.5); + } registry.fill(HIST("hEventCounter"), 4.5); + } fillHistos(); resetHistos(); @@ -713,6 +754,8 @@ struct ThreebodyRecoTask { { candidates3body.clear(); + registry.fill(HIST("hEventCounter"), 0.5, collisions.size()); + for (const auto& vtx : vtx3bodydatas) { const auto& collision = collisions.iteratorAt(vtx.collisionId()); if (cfgLikeSignAnalysis) { @@ -784,8 +827,8 @@ struct ThreebodyRecoTask { if (lMother0.globalIndex() == lMother1.globalIndex() && lMother0.globalIndex() == lMother2.globalIndex()) { lLabel = lMother0.globalIndex(); lPDG = lMother0.pdgCode(); - if ((lPDG == motherPdgCode && lMCTrack0.pdgCode() == 2212 && lMCTrack1.pdgCode() == -211 && lMCTrack2.pdgCode() == bachelorPdgCode) || - (lPDG == -motherPdgCode && lMCTrack0.pdgCode() == 211 && lMCTrack1.pdgCode() == -2212 && lMCTrack2.pdgCode() == -bachelorPdgCode)) { + if ((lPDG == motherPdgCode && lMCTrack0.pdgCode() == PDG_t::kProton && lMCTrack1.pdgCode() == PDG_t::kPiMinus && lMCTrack2.pdgCode() == bachelorPdgCode) || + (lPDG == -motherPdgCode && lMCTrack0.pdgCode() == PDG_t::kPiPlus && lMCTrack1.pdgCode() == PDG_t::kProtonBar && lMCTrack2.pdgCode() == -bachelorPdgCode)) { isTrueCand = true; mcLifetime = RecoDecay::sqrtSumOfSquares(lMCTrack2.vx() - lMother2.vx(), lMCTrack2.vy() - lMother2.vy(), lMCTrack2.vz() - lMother2.vz()) * o2::constants::physics::MassHyperTriton / lMother2.p(); lmother.SetXYZM(lMother0.px(), lMother0.py(), lMother0.pz(), o2::constants::physics::MassHyperTriton); From 667f9c14141cdb23129f792b81615e4b70753e4e Mon Sep 17 00:00:00 2001 From: Lars <146946151+ljoergen@users.noreply.github.com> Date: Sun, 30 Mar 2025 09:44:43 +0200 Subject: [PATCH 0869/1650] [PWGLF] angularCorrelationsInJets.cxx: lint-free, bug-fixed task with additional jet cuts (#10701) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Nuspex/CMakeLists.txt | 2 +- ...Jets.cxx => angularCorrelationsInJets.cxx} | 1244 ++++++++++------- 2 files changed, 742 insertions(+), 504 deletions(-) rename PWGLF/Tasks/Nuspex/{AngularCorrelationsInJets.cxx => angularCorrelationsInJets.cxx} (54%) diff --git a/PWGLF/Tasks/Nuspex/CMakeLists.txt b/PWGLF/Tasks/Nuspex/CMakeLists.txt index 4e5edc7e16b..8dcc27372a4 100644 --- a/PWGLF/Tasks/Nuspex/CMakeLists.txt +++ b/PWGLF/Tasks/Nuspex/CMakeLists.txt @@ -146,7 +146,7 @@ o2physics_add_dpl_workflow(nuclei-from-hypertriton-map if(FastJet_FOUND) o2physics_add_dpl_workflow(angular-correlations-in-jets - SOURCES AngularCorrelationsInJets.cxx + SOURCES angularCorrelationsInJets.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::PWGJECore FastJet::FastJet FastJet::Contrib COMPONENT_NAME Analysis) diff --git a/PWGLF/Tasks/Nuspex/AngularCorrelationsInJets.cxx b/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx similarity index 54% rename from PWGLF/Tasks/Nuspex/AngularCorrelationsInJets.cxx rename to PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx index b9cd9965a37..0f66b48ce6b 100644 --- a/PWGLF/Tasks/Nuspex/AngularCorrelationsInJets.cxx +++ b/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx @@ -8,8 +8,11 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -// -// author: Lars Jörgensen +/// +/// \file angularCorrelationsInJets.cxx +/// +/// \author Lars Jörgensen (lars.christian.joergensen@cern.ch) +/// \brief task for analysis of antinuclei in jets using Fastjet #include #include @@ -39,7 +42,6 @@ #include "fastjet/ClusterSequenceArea.hh" #include "fastjet/GhostedAreaSpec.hh" #include "PWGJE/Core/JetBkgSubUtils.h" -#include "TVector2.h" #include "TVector3.h" #include "TPDGCode.h" @@ -59,22 +61,37 @@ struct AxisSpecs { }; struct AngularCorrelationsInJets { - // Preliminary Cuts - Configurable minNCrossedRowsTPC{"minNCrossedRowsTPC", 70, "min number of crossed rows TPC"}; - Configurable minReqClusterITS{"minReqClusterITS", 2, "min number of clusters required in ITS"}; - Configurable minReqClusterTPC{"minReqClusterTPC", 70, "min number of clusters required in TPC"}; - Configurable minRatioCrossedRowsTPC{"minRatioCrossedRowsTPC", 0.7, "min ratio of crossed rows over findable clusters TPC"}; + // Switches + Configurable useRejectionCut{"useRejectionCut", true, "use nsigmaRejection for correlations"}; + Configurable deuteronAnalysis{"deuteronAnalysis", true, "true [false]: analyse (anti)deuterons [(anti)helium-3]"}; + Configurable measureYields{"measureYields", false, "measure yields"}; + Configurable measureCorrelations{"measureCorrelations", true, "measure correlations"}; + Configurable outputQC{"outputQC", true, "add QC output"}; + Configurable doppCorrelations{"doppCorrelations", true, "measure correlations for p-p"}; + Configurable doapapCorrelations{"doapapCorrelations", false, "measure correlations for pbar-pbar"}; + Configurable dopapCorrelations{"dopapCorrelations", false, "measure correlations for p-pbar"}; + Configurable dopipiCorrelations{"dopipiCorrelations", false, "measure correlations for pi+-p+, pi--pi-"}; + Configurable doJetCorrelations{"doJetCorrelations", false, "measure correlations for all particles inside jets"}; + Configurable doFullCorrelations{"doFullCorrelations", false, "measure correlations for all particles in an event"}; + Configurable measureKaons{"measureKaons", false, "measure correlations for K-K"}; + + // Track Cuts + Configurable minNCrossedRowsTPC{"minNCrossedRowsTPC", 80, "min number of crossed rows TPC"}; + Configurable minReqClusterITS{"minReqClusterITS", 5, "min number of clusters required in ITS"}; + Configurable minRatioCrossedRowsTPC{"minRatioCrossedRowsTPC", 0.8, "min ratio of crossed rows over findable clusters TPC"}; Configurable maxChi2ITS{"maxChi2ITS", 36.0, "max chi2 per cluster ITS"}; Configurable maxChi2TPC{"maxChi2TPC", 4.0, "max chi2 per cluster TPC"}; - Configurable maxDCAxy{"maxDCAxy", 0.5, "max DCA to vertex xy"}; - Configurable maxDCAz{"maxDCAz", 1.0, "max DCA to vertex z"}; - Configurable maxEta{"maxEta", 0.8, "max pseudorapidity"}; // consider jet cone? - Configurable minTrackPt{"minTrackPt", 0.1, "minimum track pT"}; + Configurable maxDCAxy{"maxDCAxy", 0.05, "max DCA to vertex xy"}; + Configurable maxDCAz{"maxDCAz", 0.05, "max DCA to vertex z"}; + Configurable maxEta{"maxEta", 0.8, "max pseudorapidity"}; // consider jet cone + Configurable deltaEtaEdge{"deltaEtaEdge", 0.05, "min eta distance of jet from acceptance edge"}; // consider jet cone + Configurable minTrackPt{"minTrackPt", 0.3, "minimum track pT"}; + Configurable requirePVContributor{"requirePVContributor", false, "require track to be PV contributor"}; // Jet Cuts Configurable jetR{"jetR", 0.4, "jet resolution parameter"}; - Configurable minJetPt{"minJetPt", 5.0, "minimum total pT to accept jet"}; - Configurable minJetParticlePt{"minJetParticlePt", 0.0, "minimum pT to accept jet particle"}; + Configurable minJetPt{"minJetPt", 10.0, "minimum total pT to accept jet"}; + // Configurable minJetParticlePt{"minJetParticlePt", 0.0, "minimum pT to accept jet particle"}; // Proton Cuts Configurable protonDCAxyYield{"protonDCAxyYield", 0.05, "[proton] DCAxy cut for yield"}; @@ -128,17 +145,12 @@ struct AngularCorrelationsInJets { Configurable kaonTPCnsigmaHighPt{"kaonTPCnsigmaHighPt", 3.0, "[kaon] max TPC nsigma with high pT"}; Configurable kaonTOFnsigma{"kaonTOFnsigma", 3.0, "[kaon] max TOF nsigma"}; - Configurable useRejectionCut{"useRejectionCut", true, "use nsigmaRejection"}; Configurable nsigmaRejection{"nsigmaRejection", 1.0, "reject tracks with nsigma < nsigmaRejection for >1 species"}; - Configurable deuteronAnalysis{"deuteronAnalysis", true, "true [false]: analyse (anti)deuterons [(anti)helium-3]"}; - Configurable measureYields{"measureYields", true, "measure yields"}; - Configurable measureCorrelations{"measureCorrelations", true, "measure correlations"}; - Configurable trackBufferSize{"trackBufferSize", 200, "Number of mixed-event tracks being stored"}; // QC Configurables Configurable zVtx{"zVtx", 10.0, "max zVertex"}; - Configurable Rmax{"Rmax", 0.4, "Maximum radius for jet and UE regions"}; + Configurable rMax{"rMax", 0.4, "Maximum radius for jet and UE regions"}; Service ccdb; int mRunNumber; @@ -163,11 +175,11 @@ struct AngularCorrelationsInJets { Filter prelimTrackCuts = (aod::track::itsChi2NCl < maxChi2ITS && aod::track::tpcChi2NCl < maxChi2TPC && nabs(aod::track::dcaXY) < maxDCAxy && - nabs(aod::track::dcaZ) < maxDCAz && - nabs(aod::track::eta) < maxEta && - aod::track::pt > minTrackPt); // add more preliminary cuts to filter if possible + nabs(aod::track::dcaZ) < 2.0f && + nabs(aod::track::eta) < 0.8f && + aod::track::pt > 0.1f); // add more preliminary cuts to filter if possible Filter collisionFilter = (nabs(aod::jcollision::posZ) < zVtx); - Filter jetTrackCuts = (nabs(aod::jtrack::eta) > maxEta && aod::jtrack::pt > minJetParticlePt); + Filter jetTrackCuts = (nabs(aod::jtrack::eta) > maxEta /* && aod::jtrack::pt > minJetParticlePt */); Filter jetFilter = (aod::jet::pt >= minJetPt && nabs(aod::jet::eta) < nabs(maxEta - aod::jet::r / 100.f)); Preslice perCollisionFullTracksRun2 = o2::aod::track::collisionId; @@ -177,9 +189,9 @@ struct AngularCorrelationsInJets { AxisSpecs axisSpecs; - HistogramRegistry registryData{"dataOutput", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; - HistogramRegistry registryMC{"MCOutput", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; - HistogramRegistry registryQA{"dataQA", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; + HistogramRegistry registryData{"data", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; + HistogramRegistry registryMC{"MC", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; + HistogramRegistry registryQC{"QC", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; JetBkgSubUtils bkgSub; std::vector eventSelection; @@ -201,133 +213,145 @@ struct AngularCorrelationsInJets { registryData.add("trackProtocol", "Track protocol", HistType::kTH1I, {{20, 0, 20}}); registryData.add("numPartInJet", "Number of particles in a jet", HistType::kTH1I, {{200, 0, 200}}); registryData.add("numJetsInEvent", "Number of jets selected", HistType::kTH1I, {{10, 0, 10}}); - - // (Pseudo)Rapidity registryData.add("jetRapidity", "Jet rapidity;#it{y}", HistType::kTH1F, {{200, -1, 1}}); + if (measureYields) { + registryData.add("tpcNSigmaProton", "TPC n#sigma for proton", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tofNSigmaProton", "TOF n#sigma for proton", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tpcNSigmaAntiproton", "TPC n#sigma for antiproton", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tofNSigmaAntiproton", "TOF n#sigma for antiproton", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tpcNSigmaNuclei", "TPC n#sigma for nuclei", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tofNSigmaNuclei", "TOF n#sigma for nuclei", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tpcNSigmaAntinuclei", "TPC n#sigma for antinuclei", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tofNSigmaAntinuclei", "TOF n#sigma for antinuclei", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + + registryData.add("ptJetProton", "p_{T} of protons", HistType::kTH1D, {axisSpecs.ptAxisPos}); + registryData.add("ptJetAntiproton", "p_{T} of antiprotons", HistType::kTH1D, {axisSpecs.ptAxisPos}); + registryData.add("ptJetNuclei", "p_{T} of nuclei", HistType::kTH1D, {axisSpecs.ptAxisPos}); + registryData.add("ptJetAntinuclei", "p_{T} of antinuclei", HistType::kTH1D, {axisSpecs.ptAxisPos}); + + registryData.add("dcaZJetNuclei", "DCA_{z} of high purity nuclei", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); + registryData.add("dcaZJetAntinuclei", "DCA_{z} of high purity antinuclei", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); + + registryQC.add("ptJetProtonVsTotalJet", "Proton p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); + registryQC.add("ptJetAntiprotonVsTotalJet", "Antiproton p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); + registryQC.add("ptJetNucleiVsTotalJet", "Nuclei p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); + registryQC.add("ptJetAntinucleiVsTotalJet", "Antinuclei p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); + } + + if (measureCorrelations) { + registryData.add("tpcNSigmaProtonCF", "TPC n#sigma for proton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tofNSigmaProtonCF", "TOF n#sigma for proton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tpcNSigmaAntiprotonCF", "TPC n#sigma for antiproton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tofNSigmaAntiprotonCF", "TOF n#sigma for antiproton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tpcNSigmaPion", "TPC n#sigma for pion", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tofNSigmaPion", "TOF n#sigma for pion", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + + registryData.add("deltaPhiSEFull", "#Delta#varphi of particles in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiSEJet", "#Delta#varphi of jet particles in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiSEProton", "#Delta#varphi of protons in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiSEAntiproton", "#Delta#varphi of antiprotons in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiSEPion", "#Delta#varphi of pions in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiSEProtonAntiproton", "#Delta#varphi of proton-antiproton in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + + registryData.add("deltaPhiMEFull", "#Delta#varphi of particles in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiMEJet", "#Delta#varphi of jet particles in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiMEProton", "#Delta#varphi of protons in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiMEAntiproton", "#Delta#varphi of antiprotons in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiMEPion", "#Delta#varphi of pions in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiMEProtonAntiproton", "#Delta#varphi of proton-antiproton in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + + registryData.add("deltaPhiEtaSEFull", "#Delta#varphi vs #Delta#eta of full particles in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaSEJet", "#Delta#varphi vs #Delta#eta of jet particles in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaSEProton", "#Delta#varphi vs #Delta#eta of protons in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaSEAntiproton", "#Delta#varphi vs #Delta#eta of antiprotons in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaSEPion", "#Delta#varphi vs #Delta#eta of pions in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaSEProtonAntiproton", "#Delta#varphi vs #Delta#eta of proton-antiproton in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + + registryData.add("deltaPhiEtaMEFull", "#Delta#varphi vs #Delta#eta of particles in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaMEJet", "#Delta#varphi vs #Delta#eta of jet particles in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaMEProton", "#Delta#varphi vs #Delta#eta of protons in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaMEAntiproton", "#Delta#varphi vs #Delta#eta of antiprotons in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaMEPion", "#Delta#varphi vs #Delta#eta of pions in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaMEProtonAntiproton", "#Delta#varphi vs #Delta#eta of proton-antiproton in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + + registryData.add("dcaZJetProton", "DCA_{z} of high purity protons", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); + registryData.add("dcaZJetAntiproton", "DCA_{z} of high purity antiprotons", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); + registryData.add("dcaZJetPion", "DCA_{z} of high purity pions", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); + } // pT registryData.add("ptJetParticle", "p_{T} of particles in jets", HistType::kTH1D, {axisSpecs.ptAxisPos}); registryData.add("ptTotalSubJetArea", "Subtracted full jet p_{T} (area)", HistType::kTH1D, {axisSpecs.ptAxisPos}); registryData.add("ptTotalSubJetPerp", "Subtracted full jet p_{T} (perpendicular)", HistType::kTH1D, {axisSpecs.ptAxisPos}); - registryData.add("ptJetProton", "p_{T} of protons", HistType::kTH1D, {axisSpecs.ptAxisPos}); - registryData.add("ptJetAntiproton", "p_{T} of antiprotons", HistType::kTH1D, {axisSpecs.ptAxisPos}); - registryData.add("ptJetNuclei", "p_{T} of nuclei", HistType::kTH1D, {axisSpecs.ptAxisPos}); - registryData.add("ptJetAntinuclei", "p_{T} of antinuclei", HistType::kTH1D, {axisSpecs.ptAxisPos}); registryData.add("ptTotalJet", "p_{T} of entire jet;#it{p}_{T} [GeV/#it{c}]", HistType::kTH1F, {{1000, 0, 500}}); - registryQA.add("ptJetProtonVsTotalJet", "Proton p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); - registryQA.add("ptJetAntiprotonVsTotalJet", "Antiproton p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); - registryQA.add("ptJetNucleiVsTotalJet", "Nuclei p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); - registryQA.add("ptJetAntinucleiVsTotalJet", "Antinuclei p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); - registryQA.add("ptJetPionVsTotalJet", "Pion p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); - registryQA.add("ptJetKaonVsTotalJet", "Kaon p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); + registryQC.add("ptJetPionVsTotalJet", "Pion p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); + registryQC.add("ptJetKaonVsTotalJet", "Kaon p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); // nSigma - registryData.add("tpcSignal", "TPC signal", HistType::kTH2F, {{1000, -100, 100, "#it{p} [GeV/#it{c}]"}, {1000, 0, 5000, "d#it{E}/d#it{X} (a.u.)"}}); - registryData.add("tofSignal", "TOF signal", HistType::kTH2F, {{1000, -100, 100, "#it{p} [GeV/#it{c}]"}, {550, 0, 1.1, "#beta (TOF)"}}); - registryData.add("tpcNSigmaProton", "TPC n#sigma for proton", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tofNSigmaProton", "TOF n#sigma for proton", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tpcNSigmaAntiproton", "TPC n#sigma for antiproton", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tofNSigmaAntiproton", "TOF n#sigma for antiproton", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tpcNSigmaNuclei", "TPC n#sigma for nuclei", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tofNSigmaNuclei", "TOF n#sigma for nuclei", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tpcNSigmaAntinuclei", "TPC n#sigma for antinuclei", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tofNSigmaAntinuclei", "TOF n#sigma for antinuclei", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tpcNSigmaProtonCF", "TPC n#sigma for proton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tofNSigmaProtonCF", "TOF n#sigma for proton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tpcNSigmaAntiprotonCF", "TPC n#sigma for antiproton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tofNSigmaAntiprotonCF", "TOF n#sigma for antiproton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tpcNSigmaPion", "TPC n#sigma for pion", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tofNSigmaPion", "TOF n#sigma for pion", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tpcSignal", "TPC signal", HistType::kTH2F, {{400, -10, 10, "#it{p} [GeV/#it{c}]"}, {1000, 0, 500, "d#it{E}/d#it{X} (a.u.)"}}); + registryData.add("tofSignal", "TOF signal", HistType::kTH2F, {{400, -20, 20, "#it{p} [GeV/#it{c}]"}, {400, 0.75, 1.05, "#beta (TOF)"}}); registryData.add("tpcNSigmaKaon", "TPC n#sigma for kaon", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); registryData.add("tofNSigmaKaon", "TOF n#sigma for kaon", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); // DCA registryData.add("dcaXYFullJet", "DCA_{xy} of full jet", HistType::kTH2F, {axisSpecs.ptAxisFull, axisSpecs.dcaxyAxis}); registryData.add("dcaZFullJet", "DCA_{z} of full jet", HistType::kTH2F, {axisSpecs.ptAxisFull, axisSpecs.dcazAxis}); - registryData.add("dcaZJetProton", "DCA_{z} of high purity protons", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); - registryData.add("dcaZJetAntiproton", "DCA_{z} of high purity antiprotons", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); - registryData.add("dcaZJetNuclei", "DCA_{z} of high purity nuclei", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); - registryData.add("dcaZJetAntinuclei", "DCA_{z} of high purity antinuclei", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); - registryData.add("dcaZJetPion", "DCA_{z} of high purity pions", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); registryData.add("dcaZJetKaon", "DCA_{z} of high purity kaons", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); // Angular Distributions - registryQA.add("phiFullEvent", "#varphi in full event", HistType::kTH1F, {{1000, 0, 6.3}}); - registryQA.add("phiPtFullEvent", "#varphi vs. p_{T} in full event", HistType::kTH2F, {axisSpecs.ptAxisPos, {1000, 0, 6.3}}); - registryQA.add("phiJet", "#varphi in jet", HistType::kTH1F, {{1000, 0, 6.3}}); - registryQA.add("phiPtJet", "#varphi vs. p_{T} in jet", HistType::kTH2F, {axisSpecs.ptAxisPos, {1000, 0, 6.3}}); - registryQA.add("etaFullEvent", "#eta in full event", HistType::kTH1F, {{1000, -1, 1}}); - registryQA.add("etaPtFullEvent", "#eta vs. p_{T} in full event", HistType::kTH2F, {axisSpecs.ptAxisPos, {1000, -1, 1}}); - registryQA.add("etaJet", "#eta in jet", HistType::kTH1F, {{1000, -1, 1}}); - registryQA.add("etaPtJet", "#eta vs. p_{T} in jet", HistType::kTH2F, {axisSpecs.ptAxisPos, {1000, -1, 1}}); - - registryData.add("deltaPhiSEFull", "#Delta#varphi of particles in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiSEJet", "#Delta#varphi of jet particles in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiSEProton", "#Delta#varphi of protons in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiSEAntiproton", "#Delta#varphi of antiprotons in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiMEFull", "#Delta#varphi of particles in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiMEJet", "#Delta#varphi of jet particles in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiMEProton", "#Delta#varphi of protons in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiMEAntiproton", "#Delta#varphi of antiprotons in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiEtaSEFull", "#Delta#varphi vs #Delta#eta of full particles in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaSEJet", "#Delta#varphi vs #Delta#eta of jet particles in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaSEProton", "#Delta#varphi vs #Delta#eta of protons in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaSEAntiproton", "#Delta#varphi vs #Delta#eta of antiprotons in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaMEFull", "#Delta#varphi vs #Delta#eta of particles in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaMEJet", "#Delta#varphi vs #Delta#eta of jet particles in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaMEProton", "#Delta#varphi vs #Delta#eta of protons in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaMEAntiproton", "#Delta#varphi vs #Delta#eta of antiprotons in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - - registryData.add("deltaPhiSEProtonAntiproton", "#Delta#varphi of proton-antiproton in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiMEProtonAntiproton", "#Delta#varphi of proton-antiproton in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiEtaSEProtonAntiproton", "#Delta#varphi vs #Delta#eta of proton-antiproton in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaMEProtonAntiproton", "#Delta#varphi vs #Delta#eta of proton-antiproton in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiSEPion", "#Delta#varphi of pions in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiMEPion", "#Delta#varphi of pions in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiEtaSEPion", "#Delta#varphi vs #Delta#eta of pions in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaMEPion", "#Delta#varphi vs #Delta#eta of pions in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryQC.add("phiFullEvent", "#varphi in full event", HistType::kTH1F, {{1000, 0, 6.3}}); + registryQC.add("phiPtFullEvent", "#varphi vs. p_{T} in full event", HistType::kTH2F, {axisSpecs.ptAxisPos, {1000, 0, 6.3}}); + registryQC.add("phiJet", "#varphi in jet", HistType::kTH1F, {{1000, 0, 6.3}}); + registryQC.add("phiPtJet", "#varphi vs. p_{T} in jet", HistType::kTH2F, {axisSpecs.ptAxisPos, {1000, 0, 6.3}}); + registryQC.add("etaFullEvent", "#eta in full event", HistType::kTH1F, {{1000, -1, 1}}); + registryQC.add("etaPtFullEvent", "#eta vs. p_{T} in full event", HistType::kTH2F, {axisSpecs.ptAxisPos, {1000, -1, 1}}); + registryQC.add("etaJet", "#eta in jet", HistType::kTH1F, {{1000, -1, 1}}); + registryQC.add("etaPtJet", "#eta vs. p_{T} in jet", HistType::kTH2F, {axisSpecs.ptAxisPos, {1000, -1, 1}}); // QA - registryQA.add("ptDiff", "p_{T} difference PseudoJet/original track;#it{p}_{T} [GeV/#it{c}]", HistType::kTH1D, {{100, -5, 5}}); - registryQA.add("jetConeRadius", "Jet Radius;#it{R}", HistType::kTH1F, {{100, 0, 1}}); - registryQA.add("maxRadiusVsPt", "Max Cone Radius vs p_{T}", HistType::kTH2F, {{axisSpecs.ptAxisPos}, {100, 0, 1}}); - registryQA.add("rhoEstimatePerp", "Background #rho (perp)", HistType::kTH2F, {{axisSpecs.ptAxisPos}, {200, 0, 20}}); - registryQA.add("rhoMEstimatePerp", "Background #rho_{m} (perp)", HistType::kTH2F, {{axisSpecs.ptAxisPos}, {200, 0, 20}}); - registryQA.add("rhoEstimateArea", "Background #rho (area)", HistType::kTH2F, {{axisSpecs.ptAxisPos}, {200, 0, 20}}); - registryQA.add("rhoMEstimateArea", "Background #rho_{m} (area)", HistType::kTH2F, {{axisSpecs.ptAxisPos}, {200, 0, 20}}); - registryQA.add("jetBkgDeltaPt", "#Delta p_{T} Clustered Cone - Pure Jet", HistType::kTH1F, {{200, 0, 10}}); - - registryQA.add("ptFullEvent", "p_{T} after basic cuts", HistType::kTH1F, {axisSpecs.ptAxisPos}); - registryQA.add("crossedRowsTPC", "Crossed rows TPC", HistType::kTH2I, {axisSpecs.ptAxisPos, {135, 65, 200}}); - registryQA.add("clusterITS", "ITS clusters", HistType::kTH2I, {axisSpecs.ptAxisPos, {10, 0, 10}}); - registryQA.add("clusterTPC", "TPC clusters", HistType::kTH2I, {axisSpecs.ptAxisPos, {135, 65, 200}}); - registryQA.add("ratioCrossedRowsTPC", "Ratio crossed rows/findable TPC", HistType::kTH2F, {axisSpecs.ptAxisPos, {100, 0.5, 1.5}}); - registryQA.add("chi2ITS", "ITS #chi^{2}", HistType::kTH2F, {axisSpecs.ptAxisPos, {400, 0, 40}}); - registryQA.add("chi2TPC", "TPC #chi^{2}", HistType::kTH2F, {axisSpecs.ptAxisPos, {50, 0, 5}}); - registryQA.add("dcaXYFullEvent", "DCA_{xy} of full event", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcaxyAxis}); - registryQA.add("dcaZFullEvent", "DCA_{z} of full event", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); - registryQA.add("jetPtVsNumPart", "Total jet p_{T} vs number of constituents", HistType::kTH2F, {axisSpecs.ptAxisPos, {100, 0, 100}}); - - // QA Histograms for Comparison with nuclei_in_jets.cxx - registryQA.add("multiplicityJetPlusUE", "multiplicityJetPlusUE", HistType::kTH1F, {{100, 0, 100, "#it{N}_{ch}"}}); - registryQA.add("multiplicityJet", "multiplicityJet", HistType::kTH1F, {{100, 0, 100, "#it{N}_{ch}"}}); - registryQA.add("multiplicityUE", "multiplicityUE", HistType::kTH1F, {{100, 0, 100, "#it{N}_{ch}"}}); - registryQA.add("ptJetPlusUE", "ptJetPlusUE", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); - registryQA.add("ptJet", "ptJet", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); - registryQA.add("ptUE", "ptUE", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); - registryQA.add("deltaEtadeltaPhiJet", "deltaEtadeltaPhiJet", HistType::kTH2F, {{200, -0.5, 0.5, "#Delta#eta"}, {200, 0, 0.5 * M_PI, "#Delta#phi"}}); - registryQA.add("deltaEtadeltaPhiUE", "deltaEtadeltaPhiUE", HistType::kTH2F, {{200, -0.5, 0.5, "#Delta#eta"}, {200, 0, 0.5 * M_PI, "#Delta#phi"}}); - registryQA.add("deltaJetPt", "deltaJetPt", HistType::kTH1F, {{200, -2, 2, "#Delta#it{p}_{T} (GeV/#it{c})"}}); - - registryQA.add("nParticlesClusteredInJet", "nParticlesClusteredInJet", HistType::kTH1F, {{50, 0, 50, "#it{N}_{ch}"}}); - registryQA.add("ptParticlesClusteredInJet", "ptParticlesClusteredInJet", HistType::kTH1F, {{200, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); - - // MC - registryMC.add("ptJetProtonMC", "Truth jet proton p_{T}", HistType::kTH1F, {axisSpecs.ptAxisPos}); - registryMC.add("ptJetAntiprotonMC", "Truth jet antiproton p_{T}", HistType::kTH1F, {axisSpecs.ptAxisPos}); - registryMC.add("ptJetNucleiMC", "Truth jet nuclei p_{T}", HistType::kTH1F, {axisSpecs.ptAxisPos}); - registryMC.add("ptJetAntinucleiMC", "Truth jet antinuclei p_{T}", HistType::kTH1F, {axisSpecs.ptAxisPos}); - registryMC.add("numberOfTruthParticles", "Truth yields (anti)p, (anti)d, (anti)He-3", HistType::kTH1I, {{6, 0, 6}}); + registryQC.add("rhoEstimatePerp", "Background #rho (perp)", HistType::kTH2F, {{axisSpecs.ptAxisPos}, {200, 0, 20}}); + registryQC.add("rhoMEstimatePerp", "Background #rho_{m} (perp)", HistType::kTH2F, {{axisSpecs.ptAxisPos}, {200, 0, 20}}); + registryQC.add("rhoEstimateArea", "Background #rho (area)", HistType::kTH2F, {{axisSpecs.ptAxisPos}, {200, 0, 20}}); + registryQC.add("rhoMEstimateArea", "Background #rho_{m} (area)", HistType::kTH2F, {{axisSpecs.ptAxisPos}, {200, 0, 20}}); + registryQC.add("jetPtVsNumPart", "Total jet p_{T} vs number of constituents", HistType::kTH2F, {axisSpecs.ptAxisPos, {100, 0, 100}}); + + if (doprocessRun3MCReco || doprocessMCRun2old || doprocessMCRun3old) { + registryMC.add("ptJetProtonMC", "Truth jet proton p_{T}", HistType::kTH1F, {axisSpecs.ptAxisPos}); + registryMC.add("ptJetAntiprotonMC", "Truth jet antiproton p_{T}", HistType::kTH1F, {axisSpecs.ptAxisPos}); + registryMC.add("ptJetNucleiMC", "Truth jet nuclei p_{T}", HistType::kTH1F, {axisSpecs.ptAxisPos}); + registryMC.add("ptJetAntinucleiMC", "Truth jet antinuclei p_{T}", HistType::kTH1F, {axisSpecs.ptAxisPos}); + registryMC.add("numberOfTruthParticles", "Truth yields (anti)p, (anti)d, (anti)He-3", HistType::kTH1I, {{6, 0, 6}}); + } + + if (outputQC) { + registryQC.add("ptDiff", "p_{T} difference PseudoJet/original track;#it{p}_{T} [GeV/#it{c}]", HistType::kTH1D, {{2000, -0.0001, 0.0001}}); + registryQC.add("jetConeRadius", "Jet Radius;#it{R}", HistType::kTH1F, {{100, 0, 1}}); + registryQC.add("maxRadiusVsPt", "Max Cone Radius vs p_{T}", HistType::kTH2F, {{axisSpecs.ptAxisPos}, {100, 0, 1}}); + registryQC.add("jetBkgDeltaPt", "#Delta p_{T} Clustered Cone - Pure Jet", HistType::kTH1F, {{200, 0, 10}}); + + registryQC.add("ptFullEvent", "p_{T} after basic cuts", HistType::kTH1F, {axisSpecs.ptAxisPos}); + registryQC.add("crossedRowsTPC", "Crossed rows TPC", HistType::kTH2I, {axisSpecs.ptAxisPos, {135, 65, 200}}); + registryQC.add("clusterITS", "ITS clusters", HistType::kTH2I, {axisSpecs.ptAxisPos, {10, 0, 10}}); + registryQC.add("clusterTPC", "TPC clusters", HistType::kTH2I, {axisSpecs.ptAxisPos, {135, 65, 200}}); + registryQC.add("ratioCrossedRowsTPC", "Ratio crossed rows/findable TPC", HistType::kTH2F, {axisSpecs.ptAxisPos, {100, 0.5, 1.5}}); + registryQC.add("chi2ITS", "ITS #chi^{2}", HistType::kTH2F, {axisSpecs.ptAxisPos, {400, 0, 40}}); + registryQC.add("chi2TPC", "TPC #chi^{2}", HistType::kTH2F, {axisSpecs.ptAxisPos, {50, 0, 5}}); + registryQC.add("dcaXYFullEvent", "DCA_{xy} of full event", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcaxyAxis}); + registryQC.add("dcaZFullEvent", "DCA_{z} of full event", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); + + // QA Histograms for Comparison with nuclei_in_jets.cxx + registryQC.add("multiplicityJetPlusUE", "multiplicityJetPlusUE", HistType::kTH1F, {{100, 0, 100, "#it{N}_{ch}"}}); + registryQC.add("multiplicityJet", "multiplicityJet", HistType::kTH1F, {{100, 0, 100, "#it{N}_{ch}"}}); + registryQC.add("multiplicityUE", "multiplicityUE", HistType::kTH1F, {{100, 0, 100, "#it{N}_{ch}"}}); + registryQC.add("ptJetPlusUE", "ptJetPlusUE", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); + registryQC.add("ptJet", "ptJet", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); + registryQC.add("ptUE", "ptUE", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); + registryQC.add("deltaEtadeltaPhiJet", "deltaEtadeltaPhiJet", HistType::kTH2F, {{200, -0.5, 0.5, "#Delta#eta"}, {200, 0, constants::math::PIHalf, "#Delta#phi"}}); + registryQC.add("deltaEtadeltaPhiUE", "deltaEtadeltaPhiUE", HistType::kTH2F, {{200, -0.5, 0.5, "#Delta#eta"}, {200, 0, constants::math::PIHalf, "#Delta#phi"}}); + registryQC.add("deltaJetPt", "deltaJetPt", HistType::kTH1F, {{200, -2, 2, "#Delta#it{p}_{T} (GeV/#it{c})"}}); + registryQC.add("nParticlesClusteredInJet", "nParticlesClusteredInJet", HistType::kTH1F, {{50, 0, 50, "#it{N}_{ch}"}}); + registryQC.add("ptParticlesClusteredInJet", "ptParticlesClusteredInJet", HistType::kTH1F, {{200, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); + } } std::vector> fBufferProton; @@ -346,15 +370,28 @@ struct AngularCorrelationsInJets { mRunNumber = bc.runNumber(); } - template - bool selectTrack(T const& track) // preliminary track selections + template + bool hasITSHit(const T& track, int layer) { - if (track.tpcNClsCrossedRows() < minRatioCrossedRowsTPC * track.tpcNClsFindable() || - track.tpcNClsCrossedRows() < minNCrossedRowsTPC || - track.tpcNClsFound() < minReqClusterTPC || - track.itsNCls() < minReqClusterITS) { + int bit = layer - 1; + return (track.itsClusterMap() & (1 << bit)); + } + + template + bool selectTrackForJetReco(const T& track) + { + if (!track.hasITS()) + return false; + if (!track.hasTPC()) + return false; + if (track.tpcNClsCrossedRows() < 70) + return false; + if ((!hasITSHit(track, 1)) && (!hasITSHit(track, 2)) && (!hasITSHit(track, 3))) + return false; + if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < 0.8) + return false; + if (std::fabs(track.dcaXY()) > (0.0105 + 0.035 / std::pow(track.pt(), 1.1))) return false; - } if (doprocessRun2old || doprocessMCRun2old) { if (!(track.trackType() & o2::aod::track::Run2Track) || !(track.flags() & o2::aod::track::TPCrefit) || @@ -365,9 +402,36 @@ struct AngularCorrelationsInJets { return true; } + template + bool selectTrack(const T& track) + { + if (requirePVContributor && !(track.isPVContributor())) + return false; + if (!track.hasITS()) + return false; + if (track.itsNCls() < minReqClusterITS) + return false; + if (!track.hasTPC()) + return false; + if (track.tpcNClsCrossedRows() < minNCrossedRowsTPC) + return false; + if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < minRatioCrossedRowsTPC) + return false; + if (track.tpcChi2NCl() > maxChi2TPC) + return false; + if (track.itsChi2NCl() > maxChi2ITS) + return false; + if (std::fabs(track.eta()) > maxEta) + return false; + if (track.pt() < minTrackPt) + return false; + + return true; + } + template - bool singleSpeciesTPCNSigma(T const& track) // make cut configurable - { // reject any track that has nsigma < 3 for more than 1 species + bool singleSpeciesTPCNSigma(T const& track) // reject any track that has TPC nsigma < 3 for more than 1 species + { if (useRejectionCut && (track.tpcNSigmaStoreEl() < nsigmaRejection || track.tpcNSigmaStoreMu() < nsigmaRejection || track.tpcNSigmaStorePi() < nsigmaRejection || track.tpcNSigmaStoreKa() < nsigmaRejection || track.tpcNSigmaStoreTr() < nsigmaRejection || track.tpcNSigmaStoreAl() < nsigmaRejection || track.tpcNSigmaDe() < nsigmaRejection || track.tpcNSigmaHe() < nsigmaRejection)) return false; return true; @@ -655,43 +719,40 @@ struct AngularCorrelationsInJets { for (int i = 0; i < static_cast(buffer.size()); i++) { // loop over tracks in buffer if (std::isnan(buffer.at(i).first)) continue; - if (buffer.at(i).first > 2 * M_PI || buffer.at(i).first < -2 * M_PI) { + if (buffer.at(i).first > constants::math::TwoPI || buffer.at(i).first < constants::math::TwoPI) { registryData.fill(HIST("trackProtocol"), 16); continue; } - double phiToAxis = TVector2::Phi_0_2pi(track.phi() - jetAxis.Phi()); + double phiToAxis = RecoDecay::constrainAngle(track.phi() - jetAxis.Phi(), 0); double etaToAxis = track.eta() - jetAxis.Eta(); - double DeltaPhi = TVector2::Phi_0_2pi(phiToAxis - buffer.at(i).first); - if (DeltaPhi > (1.5 * M_PI)) { // ensure range of [-pi/2, 3/2 pi] - DeltaPhi = DeltaPhi - 2 * M_PI; - } - double DeltaEta = etaToAxis - buffer.at(i).second; + double deltaPhi = RecoDecay::constrainAngle(phiToAxis - buffer.at(i).first, -constants::math::PIHalf); + double deltaEta = etaToAxis - buffer.at(i).second; switch (particleType) { case -1: - registryData.fill(HIST("deltaPhiMEFull"), DeltaPhi); - registryData.fill(HIST("deltaPhiEtaMEFull"), DeltaPhi, DeltaEta); + registryData.fill(HIST("deltaPhiMEFull"), deltaPhi); + registryData.fill(HIST("deltaPhiEtaMEFull"), deltaPhi, deltaEta); break; case 0: - registryData.fill(HIST("deltaPhiMEJet"), DeltaPhi); - registryData.fill(HIST("deltaPhiEtaMEJet"), DeltaPhi, DeltaEta); + registryData.fill(HIST("deltaPhiMEJet"), deltaPhi); + registryData.fill(HIST("deltaPhiEtaMEJet"), deltaPhi, deltaEta); break; case 1: - registryData.fill(HIST("deltaPhiMEProton"), DeltaPhi); - registryData.fill(HIST("deltaPhiEtaMEProton"), DeltaPhi, DeltaEta); + registryData.fill(HIST("deltaPhiMEProton"), deltaPhi); + registryData.fill(HIST("deltaPhiEtaMEProton"), deltaPhi, deltaEta); break; case 2: - registryData.fill(HIST("deltaPhiMEAntiproton"), DeltaPhi); - registryData.fill(HIST("deltaPhiEtaMEAntiproton"), DeltaPhi, DeltaEta); + registryData.fill(HIST("deltaPhiMEAntiproton"), deltaPhi); + registryData.fill(HIST("deltaPhiEtaMEAntiproton"), deltaPhi, deltaEta); break; case 3: - registryData.fill(HIST("deltaPhiMEPion"), DeltaPhi); - registryData.fill(HIST("deltaPhiEtaMEPion"), DeltaPhi, DeltaEta); + registryData.fill(HIST("deltaPhiMEPion"), deltaPhi); + registryData.fill(HIST("deltaPhiEtaMEPion"), deltaPhi, deltaEta); break; case 4: - registryData.fill(HIST("deltaPhiMEProtonAntiproton"), DeltaPhi); - registryData.fill(HIST("deltaPhiEtaMEProtonAntiproton"), DeltaPhi, DeltaEta); + registryData.fill(HIST("deltaPhiMEProtonAntiproton"), deltaPhi); + registryData.fill(HIST("deltaPhiEtaMEProtonAntiproton"), deltaPhi, deltaEta); break; } } // for (int i = 0; i < static_cast(buffer.size()); i++) @@ -704,45 +765,42 @@ struct AngularCorrelationsInJets { for (int i = 0; i < static_cast(particleVector.size()); i++) { if (std::isnan(particleVector.at(i).phi())) continue; - double phiToAxis = TVector2::Phi_0_2pi(particleVector.at(i).phi() - jetAxis.Phi()); + double phiToAxis = RecoDecay::constrainAngle(particleVector.at(i).phi() - jetAxis.Phi(), 0); double etaToAxis = particleVector.at(i).eta() - jetAxis.Eta(); - if (std::abs(particleVector.at(i).phi()) > 2 * M_PI) { + if (std::abs(particleVector.at(i).phi()) > constants::math::TwoPI) { registryData.fill(HIST("trackProtocol"), 14); continue; } for (int j = i + 1; j < static_cast(particleVector.size()); j++) { if ((j == static_cast(particleVector.size())) || std::isnan(particleVector.at(j).phi())) continue; - if (std::abs(particleVector.at(j).phi()) > 2 * M_PI) { + if (std::abs(particleVector.at(j).phi()) > constants::math::TwoPI) { registryData.fill(HIST("trackProtocol"), 15); continue; } - double DeltaPhi = TVector2::Phi_0_2pi(particleVector.at(i).phi() - particleVector.at(j).phi()); - double DeltaEta = particleVector.at(i).eta() - particleVector.at(j).eta(); - if (DeltaPhi > (1.5 * M_PI)) { - DeltaPhi = DeltaPhi - 2 * M_PI; - } + double deltaPhi = RecoDecay::constrainAngle(particleVector.at(i).phi() - particleVector.at(j).phi(), -constants::math::PIHalf); + double deltaEta = particleVector.at(i).eta() - particleVector.at(j).eta(); switch (particleType) { case -1: - registryData.fill(HIST("deltaPhiSEFull"), DeltaPhi); - registryData.fill(HIST("deltaPhiEtaSEFull"), DeltaPhi, DeltaEta); + registryData.fill(HIST("deltaPhiSEFull"), deltaPhi); + registryData.fill(HIST("deltaPhiEtaSEFull"), deltaPhi, deltaEta); break; case 0: - registryData.fill(HIST("deltaPhiSEJet"), DeltaPhi); - registryData.fill(HIST("deltaPhiEtaSEJet"), DeltaPhi, DeltaEta); + registryData.fill(HIST("deltaPhiSEJet"), deltaPhi); + registryData.fill(HIST("deltaPhiEtaSEJet"), deltaPhi, deltaEta); break; case 1: - registryData.fill(HIST("deltaPhiSEProton"), DeltaPhi); - registryData.fill(HIST("deltaPhiEtaSEProton"), DeltaPhi, DeltaEta); + registryData.fill(HIST("deltaPhiSEProton"), deltaPhi); + registryData.fill(HIST("deltaPhiEtaSEProton"), deltaPhi, deltaEta); break; case 2: - registryData.fill(HIST("deltaPhiSEAntiproton"), DeltaPhi); - registryData.fill(HIST("deltaPhiEtaSEAntiproton"), DeltaPhi, DeltaEta); + registryData.fill(HIST("deltaPhiSEAntiproton"), deltaPhi); + registryData.fill(HIST("deltaPhiEtaSEAntiproton"), deltaPhi, deltaEta); break; case 3: - registryData.fill(HIST("deltaPhiSEPion"), DeltaPhi); - registryData.fill(HIST("deltaPhiEtaSEPion"), DeltaPhi, DeltaEta); + registryData.fill(HIST("deltaPhiSEPion"), deltaPhi); + registryData.fill(HIST("deltaPhiEtaSEPion"), deltaPhi, deltaEta); break; } } @@ -758,27 +816,24 @@ struct AngularCorrelationsInJets { for (int i = 0; i < static_cast(particleVector.size()); i++) { if (std::isnan(particleVector.at(i).phi())) continue; - double phiToAxis = TVector2::Phi_0_2pi(particleVector.at(i).phi() - jetAxis.Phi()); + double phiToAxis = RecoDecay::constrainAngle(particleVector.at(i).phi() - jetAxis.Phi(), 0); double etaToAxis = particleVector.at(i).eta() - jetAxis.Eta(); - if (std::abs(particleVector.at(i).phi()) > 2 * M_PI) { + if (std::abs(particleVector.at(i).phi()) > constants::math::TwoPI) { registryData.fill(HIST("trackProtocol"), 14); continue; } for (int j = 0; j < static_cast(particleVectorAnti.size()); j++) { if (std::isnan(particleVectorAnti.at(j).phi())) continue; - if (std::abs(particleVectorAnti.at(j).phi()) > 2 * M_PI) { + if (std::abs(particleVectorAnti.at(j).phi()) > constants::math::TwoPI) { registryData.fill(HIST("trackProtocol"), 15); continue; } - double DeltaPhi = TVector2::Phi_0_2pi(particleVector.at(i).phi() - particleVectorAnti.at(j).phi()); - double DeltaEta = particleVector.at(i).eta() - particleVectorAnti.at(j).eta(); - if (DeltaPhi > (1.5 * M_PI)) { - DeltaPhi = DeltaPhi - 2 * M_PI; - } - registryData.fill(HIST("deltaPhiSEProtonAntiproton"), DeltaPhi); - registryData.fill(HIST("deltaPhiEtaSEProtonAntiproton"), DeltaPhi, DeltaEta); + double deltaPhi = RecoDecay::constrainAngle(particleVector.at(i).phi() - particleVectorAnti.at(j).phi(), -constants::math::PIHalf); + double deltaEta = particleVector.at(i).eta() - particleVectorAnti.at(j).eta(); + registryData.fill(HIST("deltaPhiSEProtonAntiproton"), deltaPhi); + registryData.fill(HIST("deltaPhiEtaSEProtonAntiproton"), deltaPhi, deltaEta); break; } fillMixedEventDeltas(particleVector.at(i), bufferAnti, 4, jetAxis); @@ -791,14 +846,14 @@ struct AngularCorrelationsInJets { if (std::isnan(a1) || std::isnan(a2) || a1 == -999 || a2 == -999) return -999; double deltaPhi(0); - double phi1 = TVector2::Phi_0_2pi(a1); - double phi2 = TVector2::Phi_0_2pi(a2); + double phi1 = RecoDecay::constrainAngle(a1, 0); + double phi2 = RecoDecay::constrainAngle(a2, 0); double diff = std::abs(phi1 - phi2); - if (diff <= M_PI) + if (diff <= constants::math::PI) deltaPhi = diff; - if (diff > M_PI) - deltaPhi = 2 * M_PI - diff; + if (diff > constants::math::PI) + deltaPhi = constants::math::TwoPI - diff; return deltaPhi; } @@ -815,7 +870,6 @@ struct AngularCorrelationsInJets { // Protection 1 if (px == 0 && py != 0) { - uy = -(pz * pz) / py; ux = sign * std::abs(py * py - (pz * pz * pz * pz) / (py * py)); uz = pz; @@ -825,7 +879,6 @@ struct AngularCorrelationsInJets { // Protection 2 if (py == 0 && px != 0) { - ux = -(pz * pz) / px; uy = sign * std::abs(px * px - (pz * pz * pz * pz) / (px * px)); uz = pz; @@ -863,14 +916,16 @@ struct AngularCorrelationsInJets { if (subtractedJetPerp.pt() < minJetPt) // cut on jet w/o bkg return jetCounter; + if ((std::fabs(jet.eta()) + jetR) > (maxEta - deltaEtaEdge)) + return jetCounter; + jetCounter++; registryData.fill(HIST("ptTotalSubJetPerp"), subtractedJetPerp.pt()); registryData.fill(HIST("ptTotalSubJetArea"), subtractedJetArea.pt()); - registryQA.fill(HIST("rhoEstimateArea"), jet.pt(), rho); // switch to subtracted jet pt - registryQA.fill(HIST("rhoMEstimateArea"), jet.pt(), rhoM); - registryQA.fill(HIST("rhoEstimatePerp"), jet.pt(), rhoPerp); - registryQA.fill(HIST("rhoMEstimatePerp"), jet.pt(), rhoMPerp); + registryQC.fill(HIST("rhoEstimateArea"), jet.pt(), rho); // switch to subtracted jet pt + registryQC.fill(HIST("rhoMEstimateArea"), jet.pt(), rhoM); + registryQC.fill(HIST("rhoEstimatePerp"), jet.pt(), rhoPerp); + registryQC.fill(HIST("rhoMEstimatePerp"), jet.pt(), rhoMPerp); double jetBkgDeltaPt = jet.pt() - subtractedJetPerp.pt(); - registryQA.fill(HIST("jetBkgDeltaPt"), jetBkgDeltaPt); registryData.fill(HIST("eventProtocol"), 4); std::vector constituents = jet.constituents(); @@ -880,95 +935,98 @@ struct AngularCorrelationsInJets { registryData.fill(HIST("ptTotalJet"), jet.pt()); registryData.fill(HIST("jetRapidity"), jet.rap()); registryData.fill(HIST("numPartInJet"), jet.constituents().size()); - registryQA.fill(HIST("jetPtVsNumPart"), jet.pt(), jet.constituents().size()); - - double maxRadius = 0; - for (const auto& constituent : constituents) { - registryData.fill(HIST("ptJetParticle"), constituent.pt()); - registryQA.fill(HIST("phiJet"), constituent.phi()); - registryQA.fill(HIST("phiPtJet"), constituent.pt(), constituent.phi()); - registryQA.fill(HIST("etaJet"), constituent.eta()); - registryQA.fill(HIST("etaPtJet"), constituent.pt(), constituent.eta()); - if (std::isnan(constituent.phi()) || std::isnan(jet.phi())) // geometric jet cone - continue; - double DeltaPhi = TVector2::Phi_0_2pi(constituent.phi() - jet.phi()); - if (DeltaPhi > M_PI) - DeltaPhi = DeltaPhi - 2 * M_PI; - double DeltaEta = constituent.eta() - jet.eta(); - double Delta = std::abs(DeltaPhi * DeltaPhi + DeltaEta * DeltaEta); - registryQA.fill(HIST("jetConeRadius"), Delta); - if (Delta > maxRadius) - maxRadius = Delta; - } - registryQA.fill(HIST("maxRadiusVsPt"), jet.pt(), maxRadius); - - // QA for comparison with nuclei_in_jets TVector3 pJet(0., 0., 0.); pJet.SetXYZ(jet.px(), jet.py(), jet.pz()); - TVector3 UEAxis1(0.0, 0.0, 0.0); - TVector3 UEAxis2(0.0, 0.0, 0.0); - getPerpendicularAxis(pJet, UEAxis1, +1.0); - getPerpendicularAxis(pJet, UEAxis2, -1.0); - - double NchJetPlusUE(0); - double NchJet(0); - double NchUE(0); - double ptJetPlusUE(0); - double ptJet(0); - double ptUE(0); - - for (const auto& [index, track] : particles) { - TVector3 particleDir(track.px(), track.py(), track.pz()); - double deltaEtaJet = particleDir.Eta() - pJet.Eta(); - double deltaPhiJet = getDeltaPhi(particleDir.Phi(), pJet.Phi()); - double deltaRJet = std::abs(deltaEtaJet * deltaEtaJet + deltaPhiJet * deltaPhiJet); - double deltaEtaUE1 = particleDir.Eta() - UEAxis1.Eta(); - double deltaPhiUE1 = getDeltaPhi(particleDir.Phi(), UEAxis1.Phi()); - double deltaRUE1 = std::abs(deltaEtaUE1 * deltaEtaUE1 + deltaPhiUE1 * deltaPhiUE1); - double deltaEtaUE2 = particleDir.Eta() - UEAxis2.Eta(); - double deltaPhiUE2 = getDeltaPhi(particleDir.Phi(), UEAxis2.Phi()); - double deltaRUE2 = std::abs(deltaEtaUE2 * deltaEtaUE2 + deltaPhiUE2 * deltaPhiUE2); - - if (deltaRJet < Rmax) { - if (deltaPhiJet != -999) - registryQA.fill(HIST("deltaEtadeltaPhiJet"), deltaEtaJet, deltaPhiJet); - NchJetPlusUE++; - ptJetPlusUE = ptJetPlusUE + track.pt(); - } - if (deltaRUE1 < Rmax) { - if (deltaPhiUE1 != -999) - registryQA.fill(HIST("deltaEtadeltaPhiUE"), deltaEtaUE1, deltaPhiUE1); - NchUE++; - ptUE = ptUE + track.pt(); - } - if (deltaRUE2 < Rmax) { - if (deltaPhiUE2 != -999) - registryQA.fill(HIST("deltaEtadeltaPhiUE"), deltaEtaUE2, deltaPhiUE2); - NchUE++; - ptUE = ptUE + track.pt(); + + if (outputQC) { + registryQC.fill(HIST("jetBkgDeltaPt"), jetBkgDeltaPt); + registryQC.fill(HIST("jetPtVsNumPart"), jet.pt(), jet.constituents().size()); + + double maxRadius = 0; + for (const auto& constituent : constituents) { + registryData.fill(HIST("ptJetParticle"), constituent.pt()); + registryQC.fill(HIST("phiJet"), constituent.phi()); + registryQC.fill(HIST("phiPtJet"), constituent.pt(), constituent.phi()); + registryQC.fill(HIST("etaJet"), constituent.eta()); + registryQC.fill(HIST("etaPtJet"), constituent.pt(), constituent.eta()); + + if (std::isnan(constituent.phi()) || std::isnan(jet.phi())) // geometric jet cone + continue; + double deltaPhi = RecoDecay::constrainAngle(constituent.phi() - jet.phi(), -constants::math::PIHalf); + double deltaEta = constituent.eta() - jet.eta(); + double delta = std::abs(deltaPhi * deltaPhi + deltaEta * deltaEta); + registryQC.fill(HIST("jetConeRadius"), delta); + if (delta > maxRadius) + maxRadius = delta; } - } // for (const auto& [index, track] : particles) + registryQC.fill(HIST("maxRadiusVsPt"), jet.pt(), maxRadius); + + // QA for comparison with nuclei_in_jets + TVector3 ueAxis1(0.0, 0.0, 0.0); + TVector3 ueAxis2(0.0, 0.0, 0.0); + getPerpendicularAxis(pJet, ueAxis1, +1.0); + getPerpendicularAxis(pJet, ueAxis2, -1.0); + + double nchJetPlusUE(0); + double nchJet(0); + double nchUE(0); + double ptJetPlusUE(0); + double ptJet(0); + double ptUE(0); + + for (const auto& [index, track] : particles) { + TVector3 particleDir(track.px(), track.py(), track.pz()); + double deltaEtaJet = particleDir.Eta() - pJet.Eta(); + double deltaPhiJet = getDeltaPhi(particleDir.Phi(), pJet.Phi()); + double deltaRJet = std::abs(deltaEtaJet * deltaEtaJet + deltaPhiJet * deltaPhiJet); + double deltaEtaUE1 = particleDir.Eta() - ueAxis1.Eta(); + double deltaPhiUE1 = getDeltaPhi(particleDir.Phi(), ueAxis1.Phi()); + double deltaRUE1 = std::abs(deltaEtaUE1 * deltaEtaUE1 + deltaPhiUE1 * deltaPhiUE1); + double deltaEtaUE2 = particleDir.Eta() - ueAxis2.Eta(); + double deltaPhiUE2 = getDeltaPhi(particleDir.Phi(), ueAxis2.Phi()); + double deltaRUE2 = std::abs(deltaEtaUE2 * deltaEtaUE2 + deltaPhiUE2 * deltaPhiUE2); + + if (deltaRJet < rMax) { + if (deltaPhiJet != -999) + registryQC.fill(HIST("deltaEtadeltaPhiJet"), deltaEtaJet, deltaPhiJet); + nchJetPlusUE++; + ptJetPlusUE = ptJetPlusUE + track.pt(); + } + if (deltaRUE1 < rMax) { + if (deltaPhiUE1 != -999) + registryQC.fill(HIST("deltaEtadeltaPhiUE"), deltaEtaUE1, deltaPhiUE1); + nchUE++; + ptUE = ptUE + track.pt(); + } + if (deltaRUE2 < rMax) { + if (deltaPhiUE2 != -999) + registryQC.fill(HIST("deltaEtadeltaPhiUE"), deltaEtaUE2, deltaPhiUE2); + nchUE++; + ptUE = ptUE + track.pt(); + } + } // for (const auto& [index, track] : particles) - NchJet = NchJetPlusUE - 0.5 * NchUE; - ptJet = ptJetPlusUE - 0.5 * ptUE; - registryQA.fill(HIST("multiplicityJetPlusUE"), NchJetPlusUE); - registryQA.fill(HIST("multiplicityJet"), NchJet); - registryQA.fill(HIST("multiplicityUE"), 0.5 * NchUE); - registryQA.fill(HIST("ptJetPlusUE"), ptJetPlusUE); - registryQA.fill(HIST("ptJet"), ptJet); - registryQA.fill(HIST("ptUE"), 0.5 * ptUE); - registryQA.fill(HIST("deltaJetPt"), jet.pt() - ptJetPlusUE); + nchJet = nchJetPlusUE - 0.5 * nchUE; + ptJet = ptJetPlusUE - 0.5 * ptUE; + registryQC.fill(HIST("multiplicityJetPlusUE"), nchJetPlusUE); + registryQC.fill(HIST("multiplicityJet"), nchJet); + registryQC.fill(HIST("multiplicityUE"), 0.5 * nchUE); + registryQC.fill(HIST("ptJetPlusUE"), ptJetPlusUE); + registryQC.fill(HIST("ptJet"), ptJet); + registryQC.fill(HIST("ptUE"), 0.5 * ptUE); + registryQC.fill(HIST("deltaJetPt"), jet.pt() - ptJetPlusUE); - int nPartClusteredJet = static_cast(constituents.size()); + int nPartClusteredJet = static_cast(constituents.size()); - // Fill QA Histograms - if (ptJetPlusUE < minJetPt) { // swap for sub pt? + // Fill QA Histograms + if (ptJetPlusUE < minJetPt) { // swap for sub pt? - registryQA.fill(HIST("nParticlesClusteredInJet"), nPartClusteredJet); + registryQC.fill(HIST("nParticlesClusteredInJet"), nPartClusteredJet); - for (const auto& track : constituents) { - registryQA.fill(HIST("ptParticlesClusteredInJet"), track.pt()); + for (const auto& track : constituents) { + registryQC.fill(HIST("ptParticlesClusteredInJet"), track.pt()); + } } } @@ -988,6 +1046,8 @@ struct AngularCorrelationsInJets { fastjet::PseudoJet pseudoParticle = constituents.at(i); int id = pseudoParticle.user_index(); const auto& jetParticle = particles.at(id); + if (!selectTrack(jetParticle)) + continue; jetAll.emplace_back(jetParticle); registryData.fill(HIST("dcaXYFullJet"), jetParticle.pt() * jetParticle.sign(), jetParticle.dcaXY()); @@ -996,77 +1056,94 @@ struct AngularCorrelationsInJets { if (jetParticle.hasTOF()) { registryData.fill(HIST("tofSignal"), jetParticle.pt() * jetParticle.sign(), jetParticle.beta()); } - double ptDiff = pseudoParticle.pt() - jetParticle.pt(); - registryQA.fill(HIST("ptDiff"), ptDiff); + if (outputQC) { + double ptDiff = pseudoParticle.pt() - jetParticle.pt(); + registryQC.fill(HIST("ptDiff"), ptDiff); + } - if (jetParticle.pt() < minJetParticlePt) - continue; - if (isProton(jetParticle, false)) { // collect protons in jet - registryData.fill(HIST("ptJetProton"), jetParticle.pt()); - registryQA.fill(HIST("ptJetProtonVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); - registryData.fill(HIST("trackProtocol"), 4); // # protons + // if (jetParticle.pt() < minJetParticlePt) + // continue; + if (measureYields) { + if (isProton(jetParticle, false)) { // collect protons in jet + registryData.fill(HIST("ptJetProton"), jetParticle.pt()); + registryQC.fill(HIST("ptJetProtonVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); + registryData.fill(HIST("trackProtocol"), 4); // # protons + } else if (isAntiproton(jetParticle, false)) { // collect antiprotons in jet + registryData.fill(HIST("ptJetAntiproton"), jetParticle.pt()); + registryQC.fill(HIST("ptJetAntiprotonVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); + registryData.fill(HIST("trackProtocol"), 6); // # antiprotons + } else if (isNucleus(jetParticle)) { // collect nuclei in jet + registryData.fill(HIST("ptJetNuclei"), jetParticle.pt()); + registryQC.fill(HIST("ptJetNucleiVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); + registryData.fill(HIST("trackProtocol"), 8); // # nuclei + registryData.fill(HIST("dcaZJetNuclei"), jetParticle.pt(), jetParticle.dcaZ()); + } else if (isAntinucleus(jetParticle)) { + registryData.fill(HIST("ptJetAntinuclei"), jetParticle.pt()); + registryQC.fill(HIST("ptJetAntinucleiVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); + registryData.fill(HIST("trackProtocol"), 10); // # antinuclei + registryData.fill(HIST("dcaZJetAntinuclei"), jetParticle.pt(), jetParticle.dcaZ()); + } + } + if (measureCorrelations) { if (isProton(jetParticle, true)) { registryData.fill(HIST("trackProtocol"), 5); // # high purity protons jetProtons.emplace_back(jetParticle); registryData.fill(HIST("dcaZJetProton"), jetParticle.pt(), jetParticle.dcaZ()); } - } else if (isAntiproton(jetParticle, false)) { // collect antiprotons in jet - registryData.fill(HIST("ptJetAntiproton"), jetParticle.pt()); - registryQA.fill(HIST("ptJetAntiprotonVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); - registryData.fill(HIST("trackProtocol"), 6); // # antiprotons if (isAntiproton(jetParticle, true)) { registryData.fill(HIST("trackProtocol"), 7); // # high purity antiprotons jetAntiprotons.emplace_back(jetParticle); registryData.fill(HIST("dcaZJetAntiproton"), jetParticle.pt(), jetParticle.dcaZ()); + } else if (isPion(jetParticle)) { + registryQC.fill(HIST("ptJetPionVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); + registryData.fill(HIST("trackProtocol"), 11); // # antinuclei + registryData.fill(HIST("dcaZJetPion"), jetParticle.pt(), jetParticle.dcaZ()); + if (jetParticle.sign() > 0) { + jetPiPlus.emplace_back(jetParticle); + } else if (jetParticle.sign() < 0) { + jetPiMinus.emplace_back(jetParticle); + } } - } else if (isNucleus(jetParticle)) { // collect nuclei in jet - registryData.fill(HIST("ptJetNuclei"), jetParticle.pt()); - registryQA.fill(HIST("ptJetNucleiVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); - registryData.fill(HIST("trackProtocol"), 8); // # nuclei - registryData.fill(HIST("dcaZJetNuclei"), jetParticle.pt(), jetParticle.dcaZ()); - } else if (isAntinucleus(jetParticle)) { - registryData.fill(HIST("ptJetAntinuclei"), jetParticle.pt()); - registryQA.fill(HIST("ptJetAntinucleiVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); - registryData.fill(HIST("trackProtocol"), 10); // # antinuclei - registryData.fill(HIST("dcaZJetAntinuclei"), jetParticle.pt(), jetParticle.dcaZ()); - } else if (isPion(jetParticle)) { - registryQA.fill(HIST("ptJetPionVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); - registryData.fill(HIST("trackProtocol"), 11); // # antinuclei - registryData.fill(HIST("dcaZJetPion"), jetParticle.pt(), jetParticle.dcaZ()); - if (jetParticle.sign() > 0) { - jetPiPlus.emplace_back(jetParticle); - } else if (jetParticle.sign() < 0) { - jetPiMinus.emplace_back(jetParticle); - } - } else if (isKaon(jetParticle)) { - registryQA.fill(HIST("ptJetKaonVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); + } + if (measureKaons && isKaon(jetParticle)) { + registryQC.fill(HIST("ptJetKaonVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); registryData.fill(HIST("trackProtocol"), 12); // # antinuclei registryData.fill(HIST("dcaZJetKaon"), jetParticle.pt(), jetParticle.dcaZ()); } } // for (int i=0; i(constituents.size()); i++) - if (jetAll.size() > 1) { // general correlation function + if (!measureCorrelations) + return jetCounter; + + if (doJetCorrelations && jetAll.size() > 1) { // general correlation function doCorrelations(jetAll, fBufferJet, fTempBufferJet, 0, pJet); setTrackBuffer(fTempBufferJet, fBufferJet); } - jetCounter++; - if ((jetProtons.size() > 0) && (jetAntiprotons.size() > 0)) { + if (dopapCorrelations && (jetProtons.size() > 0) && (jetAntiprotons.size() > 0)) { doCorrelationsAnti(jetProtons, jetAntiprotons, fBufferAntiproton, fTempBufferProton, pJet); doCorrelationsAnti(jetAntiprotons, jetProtons, fBufferProton, fTempBufferAntiproton, pJet); // divide SE distributions by 2 in post } - if ((jetProtons.size() < 2) && (jetAntiprotons.size() < 2)) + if ((jetProtons.size() < 2) && (jetAntiprotons.size() < 2) && (jetPiPlus.size() < 2) && (jetPiMinus.size() < 2)) return jetCounter; registryData.fill(HIST("eventProtocol"), 6); - if (jetProtons.size() > 1) { + if (doppCorrelations && jetProtons.size() > 1) { doCorrelations(jetProtons, fBufferProton, fTempBufferProton, 1, pJet); setTrackBuffer(fTempBufferProton, fBufferProton); } - if (jetAntiprotons.size() > 1) { + if (doapapCorrelations && jetAntiprotons.size() > 1) { doCorrelations(jetAntiprotons, fBufferAntiproton, fTempBufferAntiproton, 2, pJet); setTrackBuffer(fTempBufferAntiproton, fBufferAntiproton); } + if (dopipiCorrelations && jetPiPlus.size() > 1) { + doCorrelations(jetPiPlus, fBufferPiPlus, fTempBufferPiPlus, 3, pJet); + setTrackBuffer(fTempBufferPiPlus, fBufferPiPlus); + } + if (dopipiCorrelations && jetPiMinus.size() > 1) { + doCorrelations(jetPiMinus, fBufferPiMinus, fTempBufferPiMinus, 3, pJet); + setTrackBuffer(fTempBufferPiMinus, fBufferPiMinus); + } return jetCounter; } @@ -1096,31 +1173,35 @@ struct AngularCorrelationsInJets { jets.clear(); for (const auto& track : tracks) { - if (!selectTrack(track)) + if (!selectTrackForJetReco(track)) continue; double mass = 0.139; if (track.tpcNClsFindable() != 0) { - registryQA.fill(HIST("ratioCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows() / track.tpcNClsFindable()); + registryQC.fill(HIST("ratioCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows() / track.tpcNClsFindable()); } - registryQA.fill(HIST("ptFullEvent"), track.pt()); - registryQA.fill(HIST("crossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows()); - registryQA.fill(HIST("clusterITS"), track.pt(), track.itsNCls()); - registryQA.fill(HIST("clusterTPC"), track.pt(), track.tpcNClsFound()); - registryQA.fill(HIST("chi2ITS"), track.pt(), track.itsChi2NCl()); - registryQA.fill(HIST("chi2TPC"), track.pt(), track.tpcChi2NCl()); - registryQA.fill(HIST("dcaXYFullEvent"), track.pt(), track.dcaXY()); - registryQA.fill(HIST("dcaZFullEvent"), track.pt(), track.dcaZ()); - registryQA.fill(HIST("phiFullEvent"), track.phi()); - registryQA.fill(HIST("phiPtFullEvent"), track.pt(), track.phi()); - registryQA.fill(HIST("etaFullEvent"), track.eta()); - registryQA.fill(HIST("etaPtFullEvent"), track.pt(), track.eta()); + if (outputQC) { + registryQC.fill(HIST("ptFullEvent"), track.pt()); + registryQC.fill(HIST("crossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows()); + registryQC.fill(HIST("clusterITS"), track.pt(), track.itsNCls()); + registryQC.fill(HIST("clusterTPC"), track.pt(), track.tpcNClsFound()); + registryQC.fill(HIST("chi2ITS"), track.pt(), track.itsChi2NCl()); + registryQC.fill(HIST("chi2TPC"), track.pt(), track.tpcChi2NCl()); + registryQC.fill(HIST("dcaXYFullEvent"), track.pt(), track.dcaXY()); + registryQC.fill(HIST("dcaZFullEvent"), track.pt(), track.dcaZ()); + registryQC.fill(HIST("phiFullEvent"), track.phi()); + registryQC.fill(HIST("phiPtFullEvent"), track.pt(), track.phi()); + registryQC.fill(HIST("etaFullEvent"), track.eta()); + registryQC.fill(HIST("etaPtFullEvent"), track.pt(), track.eta()); + } fastjet::PseudoJet inputPseudoJet(track.px(), track.py(), track.pz(), track.energy(mass)); inputPseudoJet.set_user_index(index); particles[index] = track; - particlesForCF.emplace_back(track); + if (measureCorrelations) { + particlesForCF.emplace_back(track); + } jetInput.emplace_back(inputPseudoJet); index++; @@ -1131,13 +1212,13 @@ struct AngularCorrelationsInJets { registryData.fill(HIST("eventProtocol"), 2); // Reconstruct Jets - double ghost_maxrap = 1.0; - double ghost_area = 0.005; - int ghost_repeat = 1; + double ghostMaxrap = 1.0; + double ghostArea = 0.005; + int ghostRepeat = 1; fastjet::JetDefinition jetDef(fastjet::antikt_algorithm, jetR); fastjet::JetDefinition jetDefBkg(fastjet::kt_algorithm, jetR); - fastjet::AreaDefinition areaDef(fastjet::active_area, fastjet::GhostedAreaSpec(ghost_maxrap, ghost_repeat, ghost_area)); - fastjet::AreaDefinition areaDefBkg(fastjet::active_area_explicit_ghosts, fastjet::GhostedAreaSpec(ghost_maxrap)); + fastjet::AreaDefinition areaDef(fastjet::active_area, fastjet::GhostedAreaSpec(ghostMaxrap, ghostRepeat, ghostArea)); + fastjet::AreaDefinition areaDefBkg(fastjet::active_area_explicit_ghosts, fastjet::GhostedAreaSpec(ghostMaxrap)); fastjet::ClusterSequenceArea clusterSeq(jetInput, jetDef, areaDef); jets = sorted_by_pt(clusterSeq.inclusive_jets()); @@ -1156,61 +1237,44 @@ struct AngularCorrelationsInJets { registryData.fill(HIST("numJetsInEvent"), jetCounter); TVector3 hardestJetAxis(jets.at(0).px(), jets.at(0).py(), jets.at(0).pz()); // for full event, use hardest jet as orientation - doCorrelations(particlesForCF, fBufferFull, fTempBufferFull, -1, hardestJetAxis); - setTrackBuffer(fTempBufferFull, fBufferFull); + if (measureCorrelations) { + doCorrelations(particlesForCF, fBufferFull, fTempBufferFull, -1, hardestJetAxis); + setTrackBuffer(fTempBufferFull, fBufferFull); + } } template void fillHistogramsMC(U const& tracks) { - std::vector jetProtons; - std::vector jetAntiprotons; - std::vector jetPiPlus; - std::vector jetPiMinus; - std::vector jetAll; - jetProtons.clear(); - jetAntiprotons.clear(); - jetPiPlus.clear(); - jetPiMinus.clear(); - jetAll.clear(); - std::vector> fTempBufferFull; - fTempBufferFull.clear(); - std::vector jetInput; // input for jet finder - std::map particles; // all selected particles in event - std::vector particlesForCF; // particles for full event angular correlations + std::vector jetInput; // input for jet finder + std::map particles; // all selected particles in event jetInput.clear(); particles.clear(); int index = 0; - int jetCounter = 0; + double mass = 0.139; // pion mass for input because 80% is pions anyway std::vector jets; jets.clear(); for (const auto& track : tracks) { - if (!selectTrack(track)) - continue; - - double mass = 0.139; // pion mass for input because 80% is pions anyway - if (track.tpcNClsFindable() != 0) { - registryQA.fill(HIST("ratioCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows() / track.tpcNClsFindable()); + registryQC.fill(HIST("ratioCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows() / track.tpcNClsFindable()); } - registryQA.fill(HIST("ptFullEvent"), track.pt()); - registryQA.fill(HIST("crossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows()); - registryQA.fill(HIST("clusterITS"), track.pt(), track.itsNCls()); - registryQA.fill(HIST("clusterTPC"), track.pt(), track.tpcNClsFound()); - registryQA.fill(HIST("chi2ITS"), track.pt(), track.itsChi2NCl()); - registryQA.fill(HIST("chi2TPC"), track.pt(), track.tpcChi2NCl()); - registryQA.fill(HIST("dcaXYFullEvent"), track.pt(), track.dcaXY()); - registryQA.fill(HIST("dcaZFullEvent"), track.pt(), track.dcaZ()); - registryQA.fill(HIST("phiFullEvent"), track.phi()); - registryQA.fill(HIST("phiPtFullEvent"), track.pt(), track.phi()); - registryQA.fill(HIST("etaFullEvent"), track.eta()); - registryQA.fill(HIST("etaPtFullEvent"), track.pt(), track.eta()); + registryQC.fill(HIST("ptFullEvent"), track.pt()); + registryQC.fill(HIST("crossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows()); + registryQC.fill(HIST("clusterITS"), track.pt(), track.itsNCls()); + registryQC.fill(HIST("clusterTPC"), track.pt(), track.tpcNClsFound()); + registryQC.fill(HIST("chi2ITS"), track.pt(), track.itsChi2NCl()); + registryQC.fill(HIST("chi2TPC"), track.pt(), track.tpcChi2NCl()); + registryQC.fill(HIST("dcaXYFullEvent"), track.pt(), track.dcaXY()); + registryQC.fill(HIST("dcaZFullEvent"), track.pt(), track.dcaZ()); + registryQC.fill(HIST("phiFullEvent"), track.phi()); + registryQC.fill(HIST("phiPtFullEvent"), track.pt(), track.phi()); + registryQC.fill(HIST("etaFullEvent"), track.eta()); + registryQC.fill(HIST("etaPtFullEvent"), track.pt(), track.eta()); fastjet::PseudoJet inputPseudoJet(track.px(), track.py(), track.pz(), track.energy(mass)); inputPseudoJet.set_user_index(index); particles[index] = track; - particlesForCF.emplace_back(track); jetInput.emplace_back(inputPseudoJet); index++; @@ -1221,13 +1285,13 @@ struct AngularCorrelationsInJets { registryData.fill(HIST("eventProtocol"), 2); // Reconstruct Jets - double ghost_maxrap = 1.0; - double ghost_area = 0.005; - int ghost_repeat = 1; + double ghostMaxrap = 1.0; + double ghostArea = 0.005; + int ghostRepeat = 1; fastjet::JetDefinition jetDef(fastjet::antikt_algorithm, jetR); fastjet::JetDefinition jetDefBkg(fastjet::kt_algorithm, jetR); - fastjet::AreaDefinition areaDef(fastjet::active_area, fastjet::GhostedAreaSpec(ghost_maxrap, ghost_repeat, ghost_area)); - fastjet::AreaDefinition areaDefBkg(fastjet::active_area_explicit_ghosts, fastjet::GhostedAreaSpec(ghost_maxrap)); + fastjet::AreaDefinition areaDef(fastjet::active_area, fastjet::GhostedAreaSpec(ghostMaxrap, ghostRepeat, ghostArea)); + fastjet::AreaDefinition areaDefBkg(fastjet::active_area_explicit_ghosts, fastjet::GhostedAreaSpec(ghostMaxrap)); fastjet::ClusterSequenceArea clusterSeq(jetInput, jetDef, areaDef); jets = sorted_by_pt(clusterSeq.inclusive_jets()); @@ -1240,53 +1304,220 @@ struct AngularCorrelationsInJets { auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(jetInput, doSparse); auto [rhoPerp, rhoMPerp] = bkgSub.estimateRhoPerpCone(jetInput, jets); - for (auto& jet : jets) { - jetCounter = analyseJet(jetCounter, jet, particles, jetProtons, jetAntiprotons, jetPiPlus, jetPiMinus, jetAll, rho, rhoM, rhoPerp, rhoMPerp); - - // MC Truth Particles + for (auto& jet : jets) { // o2-linter: disable=const-ref-in-for-loop (jets are modified) + if (!jet.has_constituents()) + continue; fastjet::PseudoJet subtractedJetPerp(0., 0., 0., 0.); subtractedJetPerp = bkgSub.doRhoAreaSub(jet, rhoPerp, rhoMPerp); + fastjet::PseudoJet subtractedJetArea(0., 0., 0., 0.); + subtractedJetArea = bkgSub.doRhoAreaSub(jet, rho, rhoM); + if (subtractedJetPerp.pt() < minJetPt) // cut on jet w/o bkg continue; - for (const auto& constituent : jet.constituents()) { - const auto& jetParticle = particles.at(constituent.user_index()); + registryData.fill(HIST("ptTotalSubJetPerp"), subtractedJetPerp.pt()); + registryQC.fill(HIST("rhoEstimateArea"), jet.pt(), rho); // switch to subtracted jet pt + registryQC.fill(HIST("rhoMEstimateArea"), jet.pt(), rhoM); + registryQC.fill(HIST("rhoEstimatePerp"), jet.pt(), rhoPerp); + registryQC.fill(HIST("rhoMEstimatePerp"), jet.pt(), rhoMPerp); + double jetBkgDeltaPt = jet.pt() - subtractedJetPerp.pt(); + registryQC.fill(HIST("jetBkgDeltaPt"), jetBkgDeltaPt); + + registryData.fill(HIST("eventProtocol"), 4); + std::vector constituents = jet.constituents(); + + registryData.fill(HIST("eventProtocol"), 5); + registryData.fill(HIST("numberOfJets"), 0); + registryData.fill(HIST("ptTotalJet"), jet.pt()); + registryData.fill(HIST("jetRapidity"), jet.rap()); + registryData.fill(HIST("numPartInJet"), jet.constituents().size()); + registryQC.fill(HIST("jetPtVsNumPart"), jet.pt(), jet.constituents().size()); + + double maxRadius = 0; + for (const auto& constituent : constituents) { + registryData.fill(HIST("ptJetParticle"), constituent.pt()); + registryQC.fill(HIST("phiJet"), constituent.phi()); + registryQC.fill(HIST("phiPtJet"), constituent.pt(), constituent.phi()); + registryQC.fill(HIST("etaJet"), constituent.eta()); + registryQC.fill(HIST("etaPtJet"), constituent.pt(), constituent.eta()); + + if (std::isnan(constituent.phi()) || std::isnan(jet.phi())) // geometric jet cone + continue; + double deltaPhi = RecoDecay::constrainAngle(constituent.phi() - jet.phi(), -constants::math::PIHalf); + double deltaEta = constituent.eta() - jet.eta(); + double delta = std::abs(deltaPhi * deltaPhi + deltaEta * deltaEta); + registryQC.fill(HIST("jetConeRadius"), delta); + if (delta > maxRadius) + maxRadius = delta; + } + registryQC.fill(HIST("maxRadiusVsPt"), jet.pt(), maxRadius); + + // QA for comparison with nuclei_in_jets + TVector3 pJet(0., 0., 0.); + pJet.SetXYZ(jet.px(), jet.py(), jet.pz()); + TVector3 ueAxis1(0.0, 0.0, 0.0); + TVector3 ueAxis2(0.0, 0.0, 0.0); + getPerpendicularAxis(pJet, ueAxis1, +1.0); + getPerpendicularAxis(pJet, ueAxis2, -1.0); + + double nchJetPlusUE(0); + double nchJet(0); + double nchUE(0); + double ptJetPlusUE(0); + double ptJet(0); + double ptUE(0); + + for (const auto& [index, track] : particles) { + TVector3 particleDir(track.px(), track.py(), track.pz()); + double deltaEtaJet = particleDir.Eta() - pJet.Eta(); + double deltaPhiJet = getDeltaPhi(particleDir.Phi(), pJet.Phi()); + double deltaRJet = std::abs(deltaEtaJet * deltaEtaJet + deltaPhiJet * deltaPhiJet); + double deltaEtaUE1 = particleDir.Eta() - ueAxis1.Eta(); + double deltaPhiUE1 = getDeltaPhi(particleDir.Phi(), ueAxis1.Phi()); + double deltaRUE1 = std::abs(deltaEtaUE1 * deltaEtaUE1 + deltaPhiUE1 * deltaPhiUE1); + double deltaEtaUE2 = particleDir.Eta() - ueAxis2.Eta(); + double deltaPhiUE2 = getDeltaPhi(particleDir.Phi(), ueAxis2.Phi()); + double deltaRUE2 = std::abs(deltaEtaUE2 * deltaEtaUE2 + deltaPhiUE2 * deltaPhiUE2); + + if (deltaRJet < rMax) { + if (deltaPhiJet != -999) + registryQC.fill(HIST("deltaEtadeltaPhiJet"), deltaEtaJet, deltaPhiJet); + nchJetPlusUE++; + ptJetPlusUE = ptJetPlusUE + track.pt(); + } + if (deltaRUE1 < rMax) { + if (deltaPhiUE1 != -999) + registryQC.fill(HIST("deltaEtadeltaPhiUE"), deltaEtaUE1, deltaPhiUE1); + nchUE++; + ptUE = ptUE + track.pt(); + } + if (deltaRUE2 < rMax) { + if (deltaPhiUE2 != -999) + registryQC.fill(HIST("deltaEtadeltaPhiUE"), deltaEtaUE2, deltaPhiUE2); + nchUE++; + ptUE = ptUE + track.pt(); + } + } // for (const auto& [index, track] : particles) + + nchJet = nchJetPlusUE - 0.5 * nchUE; + ptJet = ptJetPlusUE - 0.5 * ptUE; + registryQC.fill(HIST("multiplicityJetPlusUE"), nchJetPlusUE); + registryQC.fill(HIST("multiplicityJet"), nchJet); + registryQC.fill(HIST("multiplicityUE"), 0.5 * nchUE); + registryQC.fill(HIST("ptJetPlusUE"), ptJetPlusUE); + registryQC.fill(HIST("ptJet"), ptJet); + registryQC.fill(HIST("ptUE"), 0.5 * ptUE); + registryQC.fill(HIST("deltaJetPt"), jet.pt() - ptJetPlusUE); + + int nPartClusteredJet = static_cast(constituents.size()); + + // Fill QA Histograms + if (ptJetPlusUE < minJetPt) { // swap for sub pt? + + registryQC.fill(HIST("nParticlesClusteredInJet"), nPartClusteredJet); + + for (const auto& track : constituents) { + registryQC.fill(HIST("ptParticlesClusteredInJet"), track.pt()); + } + } + + for (int i = 0; i < static_cast(constituents.size()); i++) { // analyse jet constituents - this is where the magic happens + registryData.fill(HIST("trackProtocol"), 3); + fastjet::PseudoJet pseudoParticle = constituents.at(i); + int id = pseudoParticle.user_index(); + const auto& jetParticle = particles.at(id); + if (!selectTrack(jetParticle)) + continue; + + registryData.fill(HIST("dcaXYFullJet"), jetParticle.pt() * jetParticle.sign(), jetParticle.dcaXY()); + registryData.fill(HIST("dcaZFullJet"), jetParticle.pt() * jetParticle.sign(), jetParticle.dcaZ()); + registryData.fill(HIST("tpcSignal"), jetParticle.pt() * jetParticle.sign(), jetParticle.tpcSignal()); + if (jetParticle.hasTOF()) { + registryData.fill(HIST("tofSignal"), jetParticle.pt() * jetParticle.sign(), jetParticle.beta()); + } + if (outputQC) { + double ptDiff = pseudoParticle.pt() - jetParticle.pt(); + registryQC.fill(HIST("ptDiff"), ptDiff); + } + + // if (jetParticle.pt() < minJetParticlePt) + // continue; if (!jetParticle.has_mcParticle()) continue; switch (jetParticle.mcParticle().pdgCode()) { - case 2212: + case kProton: registryMC.fill(HIST("numberOfTruthParticles"), 0); registryMC.fill(HIST("ptJetProtonMC"), jetParticle.pt()); break; - case -2212: + case kProtonBar: registryMC.fill(HIST("numberOfTruthParticles"), 1); registryMC.fill(HIST("ptJetAntiprotonMC"), jetParticle.pt()); break; - case 1000010020: + case o2::constants::physics::Pdg::kDeuteron: registryMC.fill(HIST("numberOfTruthParticles"), 2); registryMC.fill(HIST("ptJetNucleiMC"), jetParticle.pt()); break; - case -1000010020: + case -o2::constants::physics::Pdg::kDeuteron: registryMC.fill(HIST("numberOfTruthParticles"), 3); registryMC.fill(HIST("ptJetAntinucleiMC"), jetParticle.pt()); break; - case 1000020030: + case o2::constants::physics::Pdg::kHelium3: registryMC.fill(HIST("numberOfTruthParticles"), 4); registryMC.fill(HIST("ptJetNucleiMC"), jetParticle.pt()); break; - case -1000020030: + case -o2::constants::physics::Pdg::kHelium3: registryMC.fill(HIST("numberOfTruthParticles"), 5); registryMC.fill(HIST("ptJetAntinucleiMC"), jetParticle.pt()); break; default: continue; } - } // for (const auto& constituent : jet.constituents()) - } // for (const auto& jet : jets) - registryData.fill(HIST("numJetsInEvent"), jetCounter); - TVector3 hardestJetAxis(jets.at(0).px(), jets.at(0).py(), jets.at(0).pz()); // for full event, use hardest jet as orientation - doCorrelations(particlesForCF, fBufferFull, fTempBufferFull, -1, hardestJetAxis); - setTrackBuffer(fTempBufferFull, fBufferFull); + if (!selectTrackForJetReco(jetParticle)) + continue; + switch (jetParticle.mcParticle().pdgCode()) { + case kProton: + registryData.fill(HIST("ptJetProton"), jetParticle.pt()); + registryQC.fill(HIST("ptJetProtonVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); + registryData.fill(HIST("trackProtocol"), 4); // # protons + break; + case kProtonBar: + registryData.fill(HIST("ptJetAntiproton"), jetParticle.pt()); + registryQC.fill(HIST("ptJetAntiprotonVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); + registryData.fill(HIST("trackProtocol"), 6); // # antiprotons + break; + case o2::constants::physics::Pdg::kDeuteron: + if (deuteronAnalysis) { + registryData.fill(HIST("ptJetNuclei"), jetParticle.pt()); + registryQC.fill(HIST("ptJetNucleiVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); + registryData.fill(HIST("trackProtocol"), 8); // # nuclei + } + break; + case -o2::constants::physics::Pdg::kDeuteron: + if (deuteronAnalysis) { + registryData.fill(HIST("ptJetAntinuclei"), jetParticle.pt()); + registryQC.fill(HIST("ptJetAntinucleiVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); + registryData.fill(HIST("trackProtocol"), 10); // # antinuclei + } + break; + case o2::constants::physics::Pdg::kHelium3: + if (!deuteronAnalysis) { + registryData.fill(HIST("ptJetNuclei"), jetParticle.pt()); + registryQC.fill(HIST("ptJetNucleiVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); + registryData.fill(HIST("trackProtocol"), 8); // # nuclei + } + break; + case -o2::constants::physics::Pdg::kHelium3: + if (!deuteronAnalysis) { + registryData.fill(HIST("ptJetAntinuclei"), jetParticle.pt()); + registryQC.fill(HIST("ptJetAntinucleiVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); + registryData.fill(HIST("trackProtocol"), 10); // # antinuclei + } + break; + default: + continue; + } + } // for (int i=0; i(constituents.size()); i++) + } // for (const auto& jet : jets) } void processRun2old(soa::Join const& collisions, @@ -1331,8 +1562,9 @@ struct AngularCorrelationsInJets { void processRun3(soa::Filtered>::iterator const& collision, soa::Filtered> const& allJets, - soa::Filtered const&, - soa::Filtered const&) + soa::Filtered const& + /* , soa::Filtered const& */ + ) { registryData.fill(HIST("eventProtocol"), 0); if (!jetderiveddatautilities::selectCollision(collision, eventSelection)) @@ -1372,42 +1604,44 @@ struct AngularCorrelationsInJets { registryData.fill(HIST("ptTotalJet"), jet.pt()); registryData.fill(HIST("jetRapidity"), jet.eta()); registryData.fill(HIST("numPartInJet"), jet.tracksIds().size()); - registryQA.fill(HIST("jetPtVsNumPart"), jet.pt(), jet.tracksIds().size()); - registryQA.fill(HIST("maxRadiusVsPt"), jet.pt(), jet.r()); + registryQC.fill(HIST("jetPtVsNumPart"), jet.pt(), jet.tracksIds().size()); + registryQC.fill(HIST("maxRadiusVsPt"), jet.pt(), jet.r()); - for (const auto& jtrack : jet.template tracks_as()) { - const auto& track = jtrack.track_as(); + for (const auto& track /* jtrack */ : jet.template tracks_as()) { + // const auto& track = jtrack.track_as(); if (!selectTrack(track)) continue; if (track.tpcNClsFindable() != 0) { - registryQA.fill(HIST("ratioCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows() / track.tpcNClsFindable()); + registryQC.fill(HIST("ratioCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows() / track.tpcNClsFindable()); } - registryQA.fill(HIST("ptJetParticle"), track.pt()); - registryQA.fill(HIST("crossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows()); - registryQA.fill(HIST("clusterITS"), track.pt(), track.itsNCls()); - registryQA.fill(HIST("clusterTPC"), track.pt(), track.tpcNClsFound()); - registryQA.fill(HIST("chi2ITS"), track.pt(), track.itsChi2NCl()); - registryQA.fill(HIST("chi2TPC"), track.pt(), track.tpcChi2NCl()); - registryQA.fill(HIST("dcaXYFullEvent"), track.pt(), track.dcaXY()); - registryQA.fill(HIST("dcaZFullEvent"), track.pt(), track.dcaZ()); - registryQA.fill(HIST("phiJet"), track.phi()); - registryQA.fill(HIST("phiPtJet"), track.pt(), track.phi()); - registryQA.fill(HIST("etaJet"), track.eta()); - registryQA.fill(HIST("etaPtJet"), track.pt(), track.eta()); - - if (!std::isnan(track.phi()) && !std::isnan(jet.phi())) { // geometric jet cone - double DeltaPhi = TVector2::Phi_0_2pi(track.phi() - jet.phi()); - if (DeltaPhi > M_PI) - DeltaPhi = DeltaPhi - 2 * M_PI; - double DeltaEta = track.eta() - jet.eta(); - double Delta = std::abs(DeltaPhi * DeltaPhi + DeltaEta * DeltaEta); - registryQA.fill(HIST("jetConeRadius"), Delta); + if (outputQC) { + registryQC.fill(HIST("ptJetParticle"), track.pt()); + registryQC.fill(HIST("crossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows()); + registryQC.fill(HIST("clusterITS"), track.pt(), track.itsNCls()); + registryQC.fill(HIST("clusterTPC"), track.pt(), track.tpcNClsFound()); + registryQC.fill(HIST("chi2ITS"), track.pt(), track.itsChi2NCl()); + registryQC.fill(HIST("chi2TPC"), track.pt(), track.tpcChi2NCl()); + registryQC.fill(HIST("dcaXYFullEvent"), track.pt(), track.dcaXY()); + registryQC.fill(HIST("dcaZFullEvent"), track.pt(), track.dcaZ()); + registryQC.fill(HIST("phiJet"), track.phi()); + registryQC.fill(HIST("phiPtJet"), track.pt(), track.phi()); + registryQC.fill(HIST("etaJet"), track.eta()); + registryQC.fill(HIST("etaPtJet"), track.pt(), track.eta()); + + if (!std::isnan(track.phi()) && !std::isnan(jet.phi())) { // geometric jet cone + double deltaPhi = RecoDecay::constrainAngle(track.phi() - jet.phi(), -constants::math::PIHalf); + double deltaEta = track.eta() - jet.eta(); + double delta = std::abs(deltaPhi * deltaPhi + deltaEta * deltaEta); + registryQC.fill(HIST("jetConeRadius"), delta); + } } // analyse jet constituents - this is where the magic happens registryData.fill(HIST("trackProtocol"), 3); - jetAll.emplace_back(track); + if (doJetCorrelations) { + jetAll.emplace_back(track); + } registryData.fill(HIST("dcaXYFullJet"), track.pt() * track.sign(), track.dcaXY()); registryData.fill(HIST("dcaZFullJet"), track.pt() * track.sign(), track.dcaZ()); @@ -1416,49 +1650,55 @@ struct AngularCorrelationsInJets { registryData.fill(HIST("tofSignal"), track.pt() * track.sign(), track.beta()); } - if (measureYields && isProton(track, false)) { // collect protons in jet - registryData.fill(HIST("ptJetProton"), track.pt()); - registryQA.fill(HIST("ptJetProtonVsTotalJet"), track.pt(), jet.pt()); - registryData.fill(HIST("trackProtocol"), 4); // # protons - } else if (measureCorrelations && isProton(track, true)) { - registryData.fill(HIST("trackProtocol"), 5); // # high purity protons - jetProtons.emplace_back(track); - registryData.fill(HIST("dcaZJetProton"), track.pt(), track.dcaZ()); - } else if (measureYields && isAntiproton(track, false)) { // collect antiprotons in jet - registryData.fill(HIST("ptJetAntiproton"), track.pt()); - registryQA.fill(HIST("ptJetAntiprotonVsTotalJet"), track.pt(), jet.pt()); - registryData.fill(HIST("trackProtocol"), 6); // # antiprotons - } else if (measureCorrelations && isAntiproton(track, true)) { - registryData.fill(HIST("trackProtocol"), 7); // # high purity antiprotons - jetAntiprotons.emplace_back(track); - registryData.fill(HIST("dcaZJetAntiproton"), track.pt(), track.dcaZ()); - } else if (measureYields && isNucleus(track)) { // collect nuclei in jet - registryData.fill(HIST("ptJetNuclei"), track.pt()); - registryQA.fill(HIST("ptJetNucleiVsTotalJet"), track.pt(), jet.pt()); - registryData.fill(HIST("trackProtocol"), 8); // # nuclei - registryData.fill(HIST("dcaZJetNuclei"), track.pt(), track.dcaZ()); - } else if (measureYields && isAntinucleus(track)) { - registryData.fill(HIST("ptJetAntinuclei"), track.pt()); - registryQA.fill(HIST("ptJetAntinucleiVsTotalJet"), track.pt(), jet.pt()); - registryData.fill(HIST("trackProtocol"), 10); // # antinuclei - registryData.fill(HIST("dcaZJetAntinuclei"), track.pt(), track.dcaZ()); - } else if (measureCorrelations && isPion(track)) { - registryQA.fill(HIST("ptJetPionVsTotalJet"), track.pt(), jet.pt()); - registryData.fill(HIST("trackProtocol"), 11); // # antinuclei - registryData.fill(HIST("dcaZJetPion"), track.pt(), track.dcaZ()); - if (track.sign() > 0) { - jetPiPlus.emplace_back(track); - } else if (track.sign() < 0) { - jetPiMinus.emplace_back(track); + if (measureYields) { + if (isProton(track, false)) { // collect protons in jet + registryData.fill(HIST("ptJetProton"), track.pt()); + registryQC.fill(HIST("ptJetProtonVsTotalJet"), track.pt(), jet.pt()); + registryData.fill(HIST("trackProtocol"), 4); // # protons + } else if (isAntiproton(track, false)) { // collect antiprotons in jet + registryData.fill(HIST("ptJetAntiproton"), track.pt()); + registryQC.fill(HIST("ptJetAntiprotonVsTotalJet"), track.pt(), jet.pt()); + registryData.fill(HIST("trackProtocol"), 6); // # antiprotons + } else if (isNucleus(track)) { // collect nuclei in jet + registryData.fill(HIST("ptJetNuclei"), track.pt()); + registryQC.fill(HIST("ptJetNucleiVsTotalJet"), track.pt(), jet.pt()); + registryData.fill(HIST("trackProtocol"), 8); // # nuclei + registryData.fill(HIST("dcaZJetNuclei"), track.pt(), track.dcaZ()); + } else if (isAntinucleus(track)) { + registryData.fill(HIST("ptJetAntinuclei"), track.pt()); + registryQC.fill(HIST("ptJetAntinucleiVsTotalJet"), track.pt(), jet.pt()); + registryData.fill(HIST("trackProtocol"), 10); // # antinuclei + registryData.fill(HIST("dcaZJetAntinuclei"), track.pt(), track.dcaZ()); } - } else if (measureCorrelations && isKaon(track)) { - registryQA.fill(HIST("ptJetKaonVsTotalJet"), track.pt(), jet.pt()); + } + if (measureCorrelations) { + if (doppCorrelations && isProton(track, true)) { + registryData.fill(HIST("trackProtocol"), 5); // # high purity protons + jetProtons.emplace_back(track); + registryData.fill(HIST("dcaZJetProton"), track.pt(), track.dcaZ()); + } else if (doapapCorrelations && isAntiproton(track, true)) { + registryData.fill(HIST("trackProtocol"), 7); // # high purity antiprotons + jetAntiprotons.emplace_back(track); + registryData.fill(HIST("dcaZJetAntiproton"), track.pt(), track.dcaZ()); + } else if (dopipiCorrelations && isPion(track)) { + registryQC.fill(HIST("ptJetPionVsTotalJet"), track.pt(), jet.pt()); + registryData.fill(HIST("trackProtocol"), 11); // # antinuclei + registryData.fill(HIST("dcaZJetPion"), track.pt(), track.dcaZ()); + if (track.sign() > 0) { + jetPiPlus.emplace_back(track); + } else if (track.sign() < 0) { + jetPiMinus.emplace_back(track); + } + } + } + if (measureKaons && isKaon(track)) { + registryQC.fill(HIST("ptJetKaonVsTotalJet"), track.pt(), jet.pt()); registryData.fill(HIST("trackProtocol"), 12); // # antinuclei registryData.fill(HIST("dcaZJetKaon"), track.pt(), track.dcaZ()); } } // for (const auto& jtrack : jet.template tracks_as()) - if (jetAll.size() > 1) { // general correlation function + if (doJetCorrelations && jetAll.size() > 1) { // general correlation function doCorrelations(jetAll, fBufferJet, fTempBufferJet, 0, pJet); setTrackBuffer(fTempBufferJet, fBufferJet); } @@ -1466,7 +1706,7 @@ struct AngularCorrelationsInJets { if (!measureCorrelations) continue; - if ((jetProtons.size() > 0) && (jetAntiprotons.size() > 0)) { + if (dopapCorrelations && (jetProtons.size() > 0) && (jetAntiprotons.size() > 0)) { doCorrelationsAnti(jetProtons, jetAntiprotons, fBufferAntiproton, fTempBufferProton, pJet); doCorrelationsAnti(jetAntiprotons, jetProtons, fBufferProton, fTempBufferAntiproton, pJet); // divide SE distributions by 2 in post } @@ -1474,19 +1714,19 @@ struct AngularCorrelationsInJets { continue; registryData.fill(HIST("eventProtocol"), 6); - if (jetProtons.size() > 1) { + if (doppCorrelations && jetProtons.size() > 1) { doCorrelations(jetProtons, fBufferProton, fTempBufferProton, 1, pJet); setTrackBuffer(fTempBufferProton, fBufferProton); } - if (jetAntiprotons.size() > 1) { + if (doapapCorrelations && jetAntiprotons.size() > 1) { doCorrelations(jetAntiprotons, fBufferAntiproton, fTempBufferAntiproton, 2, pJet); setTrackBuffer(fTempBufferAntiproton, fBufferAntiproton); } - if (jetPiPlus.size() > 1) { + if (dopipiCorrelations && jetPiPlus.size() > 1) { doCorrelations(jetPiPlus, fBufferPiPlus, fTempBufferPiPlus, 1, pJet); setTrackBuffer(fTempBufferPiPlus, fBufferPiPlus); } - if (jetPiMinus.size() > 1) { + if (dopipiCorrelations && jetPiMinus.size() > 1) { doCorrelations(jetPiMinus, fBufferPiMinus, fTempBufferPiMinus, 1, pJet); setTrackBuffer(fTempBufferPiMinus, fBufferPiMinus); } @@ -1518,8 +1758,8 @@ struct AngularCorrelationsInJets { registryData.fill(HIST("ptTotalJet"), jet.pt()); registryData.fill(HIST("jetRapidity"), jet.eta()); registryData.fill(HIST("numPartInJet"), jet.tracksIds().size()); - registryQA.fill(HIST("jetPtVsNumPart"), jet.pt(), jet.tracksIds().size()); - registryQA.fill(HIST("maxRadiusVsPt"), jet.pt(), jet.r()); + registryQC.fill(HIST("jetPtVsNumPart"), jet.pt(), jet.tracksIds().size()); + registryQC.fill(HIST("maxRadiusVsPt"), jet.pt(), jet.r()); for (const auto& jtrack : jet.template tracks_as()) { const auto& track = jtrack.track_as(); @@ -1527,28 +1767,26 @@ struct AngularCorrelationsInJets { continue; if (track.tpcNClsFindable() != 0) { - registryQA.fill(HIST("ratioCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows() / track.tpcNClsFindable()); + registryQC.fill(HIST("ratioCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows() / track.tpcNClsFindable()); } - registryQA.fill(HIST("ptJetParticle"), track.pt()); - registryQA.fill(HIST("crossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows()); - registryQA.fill(HIST("clusterITS"), track.pt(), track.itsNCls()); - registryQA.fill(HIST("clusterTPC"), track.pt(), track.tpcNClsFound()); - registryQA.fill(HIST("chi2ITS"), track.pt(), track.itsChi2NCl()); - registryQA.fill(HIST("chi2TPC"), track.pt(), track.tpcChi2NCl()); - registryQA.fill(HIST("dcaXYFullEvent"), track.pt(), track.dcaXY()); - registryQA.fill(HIST("dcaZFullEvent"), track.pt(), track.dcaZ()); - registryQA.fill(HIST("phiJet"), track.phi()); - registryQA.fill(HIST("phiPtJet"), track.pt(), track.phi()); - registryQA.fill(HIST("etaJet"), track.eta()); - registryQA.fill(HIST("etaPtJet"), track.pt(), track.eta()); + registryQC.fill(HIST("ptJetParticle"), track.pt()); + registryQC.fill(HIST("crossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows()); + registryQC.fill(HIST("clusterITS"), track.pt(), track.itsNCls()); + registryQC.fill(HIST("clusterTPC"), track.pt(), track.tpcNClsFound()); + registryQC.fill(HIST("chi2ITS"), track.pt(), track.itsChi2NCl()); + registryQC.fill(HIST("chi2TPC"), track.pt(), track.tpcChi2NCl()); + registryQC.fill(HIST("dcaXYFullEvent"), track.pt(), track.dcaXY()); + registryQC.fill(HIST("dcaZFullEvent"), track.pt(), track.dcaZ()); + registryQC.fill(HIST("phiJet"), track.phi()); + registryQC.fill(HIST("phiPtJet"), track.pt(), track.phi()); + registryQC.fill(HIST("etaJet"), track.eta()); + registryQC.fill(HIST("etaPtJet"), track.pt(), track.eta()); if (!std::isnan(track.phi()) && !std::isnan(jet.phi())) { // geometric jet cone - double DeltaPhi = TVector2::Phi_0_2pi(track.phi() - jet.phi()); - if (DeltaPhi > M_PI) - DeltaPhi = DeltaPhi - 2 * M_PI; - double DeltaEta = track.eta() - jet.eta(); - double Delta = std::abs(DeltaPhi * DeltaPhi + DeltaEta * DeltaEta); - registryQA.fill(HIST("jetConeRadius"), Delta); + double deltaPhi = RecoDecay::constrainAngle(track.phi() - jet.phi(), -constants::math::PIHalf); + double deltaEta = track.eta() - jet.eta(); + double delta = std::abs(deltaPhi * deltaPhi + deltaEta * deltaEta); + registryQC.fill(HIST("jetConeRadius"), delta); } // analyse jet constituents - this is where the magic happens @@ -1564,30 +1802,30 @@ struct AngularCorrelationsInJets { if (!track.has_mcParticle()) continue; switch (track.mcParticle().pdgCode()) { - case 2212: + case kProton: registryMC.fill(HIST("numberOfTruthParticles"), 0); registryMC.fill(HIST("ptJetProtonMC"), track.pt()); break; - case -2212: + case kProtonBar: registryMC.fill(HIST("numberOfTruthParticles"), 1); registryMC.fill(HIST("ptJetAntiprotonMC"), track.pt()); break; - case 1000010020: + case o2::constants::physics::Pdg::kDeuteron: registryMC.fill(HIST("numberOfTruthParticles"), 2); if (deuteronAnalysis) registryMC.fill(HIST("ptJetNucleiMC"), track.pt()); break; - case -1000010020: + case -o2::constants::physics::Pdg::kDeuteron: registryMC.fill(HIST("numberOfTruthParticles"), 3); if (deuteronAnalysis) registryMC.fill(HIST("ptJetAntinucleiMC"), track.pt()); break; - case 1000020030: + case o2::constants::physics::Pdg::kHelium3: registryMC.fill(HIST("numberOfTruthParticles"), 4); if (!deuteronAnalysis) registryMC.fill(HIST("ptJetNucleiMC"), track.pt()); break; - case -1000020030: + case -o2::constants::physics::Pdg::kHelium3: registryMC.fill(HIST("numberOfTruthParticles"), 5); if (!deuteronAnalysis) registryMC.fill(HIST("ptJetAntinucleiMC"), track.pt()); @@ -1600,9 +1838,9 @@ struct AngularCorrelationsInJets { registryData.fill(HIST("numJetsInEvent"), jetCounter); } - PROCESS_SWITCH(AngularCorrelationsInJets, processRun3MCReco, "process Run 3 MC", false); + PROCESS_SWITCH(AngularCorrelationsInJets, processRun3MCReco, "process Run 3 MC, not currently usable", false); - void processMCRun2old(McCollisions const& collisions, soa::Filtered const& tracks, BCsWithRun2Info const&, aod::McParticles&, aod::McCollisions const&) + void processMCRun2old(McCollisions const& collisions, soa::Filtered const& tracks, BCsWithRun2Info const&, aod::McParticles const&, aod::McCollisions const&) { for (const auto& collision : collisions) { auto bc = collision.bc_as(); @@ -1619,9 +1857,9 @@ struct AngularCorrelationsInJets { fillHistogramsMC(slicedTracks); } } - PROCESS_SWITCH(AngularCorrelationsInJets, processMCRun2old, "process Run 2 MC w/o jet tables", false); + PROCESS_SWITCH(AngularCorrelationsInJets, processMCRun2old, "process Run 2 MC w/o jet tables, not currently usable", false); - void processMCRun3old(McCollisions const& collisions, soa::Filtered const& tracks, aod::McParticles&, aod::McCollisions const&) + void processMCRun3old(McCollisions const& collisions, soa::Filtered const& tracks, aod::McParticles const&, aod::McCollisions const&) { for (const auto& collision : collisions) { registryData.fill(HIST("eventProtocol"), 0); @@ -1637,7 +1875,7 @@ struct AngularCorrelationsInJets { fillHistogramsMC(slicedTracks); } } - PROCESS_SWITCH(AngularCorrelationsInJets, processMCRun3old, "process Run 3 MC w/o jet tables", false); + PROCESS_SWITCH(AngularCorrelationsInJets, processMCRun3old, "process Run 3 MC w/o jet tables, not currently usable", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 86b5b2b98116ada5fc98a938519753b144affcc1 Mon Sep 17 00:00:00 2001 From: lucamicheletti93 <38209984+lucamicheletti93@users.noreply.github.com> Date: Sun, 30 Mar 2025 11:51:26 +0200 Subject: [PATCH 0870/1650] [PWGDQ] Adding muonBasic process function for code optimization (#10702) Co-authored-by: Lucamicheletti93 --- PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx b/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx index 441ab311657..94f4691ba22 100644 --- a/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx +++ b/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx @@ -91,7 +91,7 @@ using MyEventsWithCentAndMults = soa::Join; // Declare bit maps containing information on the table joins content (used as argument in templated functions) -// constexpr static uint32_t gkEventFillMap = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision; +constexpr static uint32_t gkEventFillMap = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision; constexpr static uint32_t gkEventFillMapWithMults = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision | VarManager::ObjTypes::CollisionMult | VarManager::ObjTypes::CollisionMultExtra; // constexpr static uint32_t gkEventFillMapWithCent = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision | VarManager::ObjTypes::CollisionCent; constexpr static uint32_t gkEventFillMapWithCentAndMults = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision | VarManager::ObjTypes::CollisionCent | VarManager::CollisionMult | VarManager::CollisionMultExtra; @@ -237,7 +237,7 @@ struct TableMakerMC { // Check whether barrel or muon are enabled bool isProcessBCenabled = context.mOptions.get("processPP"); bool isBarrelEnabled = (context.mOptions.get("processPP") || context.mOptions.get("processPPBarrelOnly") || context.mOptions.get("processPbPbBarrelOnly")); - bool isMuonEnabled = (context.mOptions.get("processPP") || context.mOptions.get("processPPMuonOnly") || context.mOptions.get("processPbPbMuonOnly")); + bool isMuonEnabled = (context.mOptions.get("processPP") || context.mOptions.get("processPPMuonOnlyBasic") || context.mOptions.get("processPPMuonOnly") || context.mOptions.get("processPbPbMuonOnly")); // Make sure at least one process function is enabled if (!(isProcessBCenabled || isBarrelEnabled || isMuonEnabled)) { LOG(fatal) << "No process function was enabled for TableMakerMC. Check it out!!!"; @@ -1304,6 +1304,14 @@ struct TableMakerMC { fullSkimming(collisions, bcs, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr, mcCollisions, mcParticles); } + void processPPMuonOnlyBasic(MyEvents const& collisions, aod::BCsWithTimestamps const& bcs, + MyMuonsWithCov const& tracksMuon, MFTTrackLabeled const& mftTracks, + aod::FwdTrackAssoc const& fwdTrackAssocs, aod::MFTTrackAssoc const& mftAssocs, + aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) + { + fullSkimming(collisions, bcs, nullptr, tracksMuon, mftTracks, nullptr, fwdTrackAssocs, mftAssocs, mcCollisions, mcParticles); + } + void processPPMuonOnly(MyEventsWithMults const& collisions, aod::BCsWithTimestamps const& bcs, MyMuonsWithCov const& tracksMuon, MFTTrackLabeled const& mftTracks, aod::FwdTrackAssoc const& fwdTrackAssocs, aod::MFTTrackAssoc const& mftAssocs, @@ -1348,6 +1356,7 @@ struct TableMakerMC { PROCESS_SWITCH(TableMakerMC, processPP, "Produce both barrel and muon skims, pp settings", false); PROCESS_SWITCH(TableMakerMC, processPPBarrelOnly, "Produce only barrel skims, pp settings ", false); + PROCESS_SWITCH(TableMakerMC, processPPMuonOnlyBasic, "Produce only muon skims, pp settings, no multiplicity", false); PROCESS_SWITCH(TableMakerMC, processPPMuonOnly, "Produce only muon skims, pp settings", false); PROCESS_SWITCH(TableMakerMC, processPbPb, "Produce both barrel and muon skims, PbPb settings", false); PROCESS_SWITCH(TableMakerMC, processPbPbBarrelOnly, "Produce only barrel skims, PbPb settings", false); From 54919dc5394f21e23d343a66c53b90b014e6ddc3 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Sun, 30 Mar 2025 23:18:41 +0900 Subject: [PATCH 0871/1650] [PWGEM/Dilepton] fix in skimmerPrimaryMuon.cxx (#10704) --- PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx b/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx index 622ee6596bc..3e17b8845cc 100644 --- a/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx +++ b/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx @@ -239,6 +239,12 @@ struct skimmerPrimaryMuon { const auto& mfttrack = muon.template matchMFTTrack_as(); const auto& mchtrack = muon.template matchMCHTrack_as(); + if constexpr (isMC) { + if (!fwdtrack.has_mcParticle()) { + continue; + } + } + emprimarymuons(collision.globalIndex(), fwdtrack.globalIndex(), mfttrack.globalIndex(), mchtrack.globalIndex(), muon.trackType(), muon.pt(), muon.eta(), muon.phi(), muon.sign(), muon.fwdDcaX(), muon.fwdDcaY(), muon.cXXatDCA(), muon.cYYatDCA(), muon.cXYatDCA(), muon.etaMatchedMCHMID(), muon.phiMatchedMCHMID(), // muon.x(), muon.y(), muon.z(), muon.tgl(), @@ -283,7 +289,7 @@ struct skimmerPrimaryMuon { } PROCESS_SWITCH(skimmerPrimaryMuon, processRec_SWT, "process reconstructed info only with standalone", false); - void processMC(soa::Join const& collisions, aod::BCsWithTimestamps const& bcs, MyFwdTracksMC const& fwdtracks, MFTTracksMC const& mfttracks) + void processMC(soa::Join const& collisions, aod::BCsWithTimestamps const& bcs, MyPropagatedFwdTracks const&, MyFwdTracksMC const& fwdtracks, MFTTracksMC const& mfttracks) { run(collisions, bcs, sa_muons, global_muons, fwdtracks, mfttracks); } From 8bf0fc40592555349a442e95d23b1856bdab6488 Mon Sep 17 00:00:00 2001 From: prottayCMT <61418725+prottayCMT@users.noreply.github.com> Date: Sun, 30 Mar 2025 20:03:14 +0200 Subject: [PATCH 0872/1650] [PWGLF] commented out few not needed histograms and added acceptance corrections as a function of eta and pt (#10603) Co-authored-by: Prottay Das --- PWGLF/Tasks/Strangeness/lambdapolsp.cxx | 447 ++++++++++++++---------- 1 file changed, 254 insertions(+), 193 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdapolsp.cxx b/PWGLF/Tasks/Strangeness/lambdapolsp.cxx index 18c2b7b06da..3db63fbbdb3 100644 --- a/PWGLF/Tasks/Strangeness/lambdapolsp.cxx +++ b/PWGLF/Tasks/Strangeness/lambdapolsp.cxx @@ -11,6 +11,8 @@ // Lambda polarisation task // prottay.das@cern.ch +#include +#include #include #include #include @@ -21,10 +23,11 @@ #include #include #include -#include #include #include #include +#include +#include "Common/Core/RecoDecay.h" #include "TRandom3.h" #include "Math/Vector3D.h" @@ -32,7 +35,6 @@ #include "Math/GenVector/Boost.h" #include "TF1.h" -// #include "Common/DataModel/Qvectors.h" #include "PWGLF/DataModel/SPCalibrationTables.h" #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -68,8 +70,6 @@ using v0Candidates = soa::Join; struct lambdapolsp { int mRunNumber; - int multEstimator; - float d_bz; Service ccdb; Service pdg; @@ -88,6 +88,7 @@ struct lambdapolsp { Configurable cfgMinOccupancy{"cfgMinOccupancy", 0, "maximum occupancy of tracks in neighbouring collisions in a given time range"}; Configurable sys{"sys", 1, "flag to select systematic source"}; Configurable dosystematic{"dosystematic", false, "flag to perform systematic study"}; + Configurable needetaaxis{"needetaaxis", false, "flag to use last axis"}; // events Configurable cfgCutVertex{"cfgCutVertex", 10.0f, "Accepted z-vertex range"}; Configurable cfgCutCentralityMax{"cfgCutCentralityMax", 50.0f, "Accepted maximum Centrality"}; @@ -119,8 +120,11 @@ struct lambdapolsp { Configurable cfgDaughPrPt{"cfgDaughPrPt", 0.4, "minimum daughter proton pt"}; Configurable cfgDaughPiPt{"cfgDaughPiPt", 0.2, "minimum daughter pion pt"}; Configurable ConfDaughTPCnclsMin{"ConfDaughTPCnclsMin", 50.f, "V0 Daugh sel: Min. nCls TPC"}; - Configurable ConfDaughDCAMin{"ConfDaughDCAMin", 0.08f, "V0 Daugh sel: Max. DCA Daugh to PV (cm)"}; Configurable ConfDaughPIDCuts{"ConfDaughPIDCuts", 3, "PID selections for Lambda daughters"}; + Configurable usesubdet{"usesubdet", false, "use subdet"}; + Configurable useAccCorr{"useAccCorr", false, "use acceptance correction"}; + Configurable ConfAccPathL{"ConfAccPathL", "Users/p/prottay/My/Object/From379780/Fulldata/NewPbPbpass4_28032025/acccorrL", "Path to acceptance correction for Lambda"}; + Configurable ConfAccPathAL{"ConfAccPathAL", "Users/p/prottay/My/Object/From379780/Fulldata/NewPbPbpass4_28032025/acccorrAL", "Path to acceptance correction for AntiLambda"}; Configurable CentNbins{"CentNbins", 16, "Number of bins in cent histograms"}; Configurable lbinCent{"lbinCent", 0.0, "lower bin value in cent histograms"}; @@ -134,93 +138,87 @@ struct lambdapolsp { Configurable IMNbins{"IMNbins", 100, "Number of bins in invariant mass"}; Configurable lbinIM{"lbinIM", 1.0, "lower bin value in IM histograms"}; Configurable hbinIM{"hbinIM", 1.2, "higher bin value in IM histograms"}; - Configurable ptNbins{"ptNbins", 50, "Number of bins in pt"}; - Configurable lbinpt{"lbinpt", 0.0, "lower bin value in pt histograms"}; - Configurable hbinpt{"hbinpt", 10.0, "higher bin value in pt histograms"}; Configurable resNbins{"resNbins", 50, "Number of bins in reso"}; Configurable lbinres{"lbinres", 0.0, "lower bin value in reso histograms"}; Configurable hbinres{"hbinres", 10.0, "higher bin value in reso histograms"}; - Configurable etaNbins{"etaNbins", 20, "Number of bins in eta"}; - Configurable lbineta{"lbineta", -1.0, "lower bin value in eta histograms"}; - Configurable hbineta{"hbineta", 1.0, "higher bin value in eta histograms"}; Configurable spNbins{"spNbins", 2000, "Number of bins in sp"}; Configurable lbinsp{"lbinsp", -1.0, "lower bin value in sp histograms"}; Configurable hbinsp{"hbinsp", 1.0, "higher bin value in sp histograms"}; - Configurable pxNbins{"pxNbins", 500, "Number of bins in px"}; ConfigurableAxis configcentAxis{"configcentAxis", {VARIABLE_WIDTH, 0.0, 10.0, 40.0, 80.0}, "Cent V0M"}; ConfigurableAxis configthnAxispT{"configthnAxisPt", {VARIABLE_WIDTH, 0.2, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 6.5, 8.0, 10.0, 100.0}, "#it{p}_{T} (GeV/#it{c})"}; ConfigurableAxis configetaAxis{"configetaAxis", {VARIABLE_WIDTH, -0.8, -0.4, -0.2, 0, 0.2, 0.4, 0.8}, "Eta"}; ConfigurableAxis configthnAxisPol{"configthnAxisPol", {VARIABLE_WIDTH, -1.0, -0.6, -0.2, 0, 0.2, 0.4, 0.8}, "Pol"}; - ConfigurableAxis configphiAxis{"configphiAxis", {VARIABLE_WIDTH, 0.0, 0.2, 0.4, 0.8, 1.0, 2.0, 2.5, 3.0, 4.0, 5.0, 5.5, 6.28}, "PhiAxis"}; + ConfigurableAxis configbinAxis{"configbinAxis", {VARIABLE_WIDTH, -0.8, -0.4, -0.2, 0, 0.2, 0.4, 0.8}, "BA"}; + // ConfigurableAxis configphiAxis{"configphiAxis", {VARIABLE_WIDTH, 0.0, 0.2, 0.4, 0.8, 1.0, 2.0, 2.5, 3.0, 4.0, 5.0, 5.5, 6.28}, "PhiAxis"}; SliceCache cache; HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; void init(o2::framework::InitContext&) { - AxisSpec thnAxispT{ptNbins, lbinpt, hbinpt, "#it{p}_{T} (GeV/#it{c})"}; - AxisSpec thnAxisRap{100, -0.5, 0.5, "Rapidity"}; AxisSpec thnAxisres{resNbins, lbinres, hbinres, "Reso"}; AxisSpec thnAxisInvMass{IMNbins, lbinIM, hbinIM, "#it{M} (GeV/#it{c}^{2})"}; AxisSpec thnAxisCosThetaStar{SANbins, lbinSA, hbinSA, "SA"}; AxisSpec centAxis = {CentNbins, lbinCent, hbinCent, "V0M (%)"}; - AxisSpec pxAxis = {pxNbins, -10.0, 10.0, "Px"}; AxisSpec spAxis = {spNbins, lbinsp, hbinsp, "Sp"}; AxisSpec qxZDCAxis = {QxyNbins, lbinQxy, hbinQxy, "Qx"}; - AxisSpec binAxis = {10, 0, 10.0, "BA"}; + + std::vector runaxes = {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis}; + if (needetaaxis) + runaxes.insert(runaxes.end(), {configbinAxis}); if (checkwithpub) { if (useprofile == 2) { - histos.add("hpuxQxpvscentpteta", "hpuxQxpvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpuyQypvscentpteta", "hpuyQypvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpuxQxtvscentpteta", "hpuxQxtvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpuyQytvscentpteta", "hpuyQytvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpuxyQxytvscentpteta", "hpuxyQxytvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpuxyQxypvscentpteta", "hpuxyQxypvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpoddv1vscentpteta", "hpoddv1vscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpevenv1vscentpteta", "hpevenv1vscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpv21", "hpv21", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpv22", "hpv22", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpv23", "hpv23", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpx2Tx1Ax1Cvscentpteta", "hpx2Tx1Ax1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpx2Ty1Ay1Cvscentpteta", "hpx2Ty1Ay1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpy2Tx1Ay1Cvscentpteta", "hpy2Tx1Ay1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpy2Ty1Ax1Cvscentpteta", "hpy2Ty1Ax1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpx1Ax1Cvscentpteta", "hpx1Ax1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpy1Ay1Cvscentpteta", "hpy1Ay1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpx1Avscentpteta", "hpx1Avscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpx1Cvscentpteta", "hpx1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpy1Avscentpteta", "hpy1Avscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpy1Cvscentpteta", "hpy1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - - histos.add("hpx2Tx1Avscentpteta", "hpx2Tx1Avscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpx2Tx1Cvscentpteta", "hpx2Tx1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpx2Ty1Avscentpteta", "hpx2Ty1Avscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpx2Ty1Cvscentpteta", "hpx2Ty1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpy2Tx1Avscentpteta", "hpy2Tx1Avscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpy2Ty1Cvscentpteta", "hpy2Ty1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpy2Ty1Avscentpteta", "hpy2Ty1Avscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpy2Tx1Cvscentpteta", "hpy2Tx1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpx1Ay1Cvscentpteta", "hpx1Ay1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpy1Ax1Cvscentpteta", "hpy1Ax1Cvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpx2Tvscentpteta", "hpx2Tvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpy2Tvscentpteta", "hpy2Tvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - - histos.add("hpuxvscentpteta", "hpuxvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpuyvscentpteta", "hpuyvscentpteta", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpuxQxpvscentpteta", "hpuxQxpvscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpuyQypvscentpteta", "hpuyQypvscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpuxQxtvscentpteta", "hpuxQxtvscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpuyQytvscentpteta", "hpuyQytvscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpuxyQxytvscentpteta", "hpuxyQxytvscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpuxyQxypvscentpteta", "hpuxyQxypvscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpoddv1vscentpteta", "hpoddv1vscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpevenv1vscentpteta", "hpevenv1vscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpv21", "hpv21", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpv22", "hpv22", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpv23", "hpv23", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpx2Tx1Ax1Cvscentpteta", "hpx2Tx1Ax1Cvscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpx2Ty1Ay1Cvscentpteta", "hpx2Ty1Ay1Cvscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpy2Tx1Ay1Cvscentpteta", "hpy2Tx1Ay1Cvscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpy2Ty1Ax1Cvscentpteta", "hpy2Ty1Ax1Cvscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpx1Ax1Cvscentpteta", "hpx1Ax1Cvscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpy1Ay1Cvscentpteta", "hpy1Ay1Cvscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpx1Avscentpteta", "hpx1Avscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpx1Cvscentpteta", "hpx1Cvscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpy1Avscentpteta", "hpy1Avscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpy1Cvscentpteta", "hpy1Cvscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + + histos.add("hpx2Tx1Avscentpteta", "hpx2Tx1Avscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpx2Tx1Cvscentpteta", "hpx2Tx1Cvscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpx2Ty1Avscentpteta", "hpx2Ty1Avscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpx2Ty1Cvscentpteta", "hpx2Ty1Cvscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpy2Tx1Avscentpteta", "hpy2Tx1Avscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpy2Ty1Cvscentpteta", "hpy2Ty1Cvscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpy2Ty1Avscentpteta", "hpy2Ty1Avscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpy2Tx1Cvscentpteta", "hpy2Tx1Cvscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpx1Ay1Cvscentpteta", "hpx1Ay1Cvscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpy1Ax1Cvscentpteta", "hpy1Ax1Cvscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpx2Tvscentpteta", "hpx2Tvscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpy2Tvscentpteta", "hpy2Tvscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + + histos.add("hpuxvscentpteta", "hpuxvscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpuyvscentpteta", "hpuyvscentpteta", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); /* - histos.add("hpuxvscentptetaneg", "hpuxvscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpuyvscentptetaneg", "hpuyvscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - - histos.add("hpuxQxpvscentptetaneg", "hpuxQxpvscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpuyQypvscentptetaneg", "hpuyQypvscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpuxQxtvscentptetaneg", "hpuxQxtvscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpuyQytvscentptetaneg", "hpuyQytvscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpuxyQxytvscentptetaneg", "hpuxyQxytvscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpuxyQxypvscentptetaneg", "hpuxyQxypvscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpoddv1vscentptetaneg", "hpoddv1vscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); - histos.add("hpevenv1vscentptetaneg", "hpevenv1vscentptetaneg", HistType::kTHnSparseF, {centAxis, thnAxispT, configetaAxis, spAxis}, true); + histos.add("hpuxvscentptetaneg", "hpuxvscentptetaneg", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpuyvscentptetaneg", "hpuyvscentptetaneg", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + + histos.add("hpuxQxpvscentptetaneg", "hpuxQxpvscentptetaneg", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpuyQypvscentptetaneg", "hpuyQypvscentptetaneg", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpuxQxtvscentptetaneg", "hpuxQxtvscentptetaneg", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpuyQytvscentptetaneg", "hpuyQytvscentptetaneg", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpuxyQxytvscentptetaneg", "hpuxyQxytvscentptetaneg", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpuxyQxypvscentptetaneg", "hpuxyQxypvscentptetaneg", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpoddv1vscentptetaneg", "hpoddv1vscentptetaneg", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); + histos.add("hpevenv1vscentptetaneg", "hpevenv1vscentptetaneg", HistType::kTHnSparseF, {centAxis, configthnAxispT, configetaAxis, spAxis}, true); */ histos.add("hpQxtQxpvscent", "hpQxtQxpvscent", HistType::kTHnSparseF, {centAxis, spAxis}, true); @@ -293,37 +291,46 @@ struct lambdapolsp { histos.add("hcentQxZDCC", "hcentQxZDCC", kTH2F, {{centAxis}, {qxZDCAxis}}); histos.add("hcentQyZDCC", "hcentQyZDCC", kTH2F, {{centAxis}, {qxZDCAxis}});*/ - histos.add("hSparseLambdaCosPsiA", "hSparseLambdaCosPsiA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); - histos.add("hSparseLambdaSinPsiA", "hSparseLambdaSinPsiA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); - histos.add("hSparseLambdaCosPsiC", "hSparseLambdaCosPsiC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); - histos.add("hSparseLambdaSinPsiC", "hSparseLambdaSinPsiC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); - histos.add("hSparseLambdaCosPsi", "hSparseLambdaCosPsi", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); - histos.add("hSparseLambdaSinPsi", "hSparseLambdaSinPsi", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); - histos.add("hSparseAntiLambdaCosPsiA", "hSparseAntiLambdaCosPsiA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); - histos.add("hSparseAntiLambdaSinPsiA", "hSparseAntiLambdaSinPsiA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); - histos.add("hSparseAntiLambdaCosPsiC", "hSparseAntiLambdaCosPsiC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); - histos.add("hSparseAntiLambdaSinPsiC", "hSparseAntiLambdaSinPsiC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); - histos.add("hSparseAntiLambdaCosPsi", "hSparseAntiLambdaCosPsi", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); - histos.add("hSparseAntiLambdaSinPsi", "hSparseAntiLambdaSinPsi", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); - - histos.add("hSparseLambdaPol", "hSparseLambdaPol", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); - histos.add("hSparseLambdaPolA", "hSparseLambdaPolA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); - histos.add("hSparseLambdaPolC", "hSparseLambdaPolC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); - histos.add("hSparseAntiLambdaPol", "hSparseAntiLambdaPol", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); - histos.add("hSparseAntiLambdaPolA", "hSparseAntiLambdaPolA", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); - histos.add("hSparseAntiLambdaPolC", "hSparseAntiLambdaPolC", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); - - histos.add("hSparseLambda_corr1a", "hSparseLambda_corr1a", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); - histos.add("hSparseLambda_corr1b", "hSparseLambda_corr1b", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); - histos.add("hSparseLambda_corr1c", "hSparseLambda_corr1c", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configphiAxis, configcentAxis, binAxis}, true); - histos.add("hSparseAntiLambda_corr1a", "hSparseAntiLambda_corr1a", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); - histos.add("hSparseAntiLambda_corr1b", "hSparseAntiLambda_corr1b", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); - histos.add("hSparseAntiLambda_corr1c", "hSparseAntiLambda_corr1c", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configphiAxis, configcentAxis, binAxis}, true); - - histos.add("hSparseLambda_corr2a", "hSparseLambda_corr2a", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); - histos.add("hSparseLambda_corr2b", "hSparseLambda_corr2b", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); - histos.add("hSparseAntiLambda_corr2a", "hSparseAntiLambda_corr2a", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); - histos.add("hSparseAntiLambda_corr2b", "hSparseAntiLambda_corr2b", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configthnAxisPol, configcentAxis, binAxis}, true); + if (usesubdet) { + histos.add("hSparseLambdaCosPsiA", "hSparseLambdaCosPsiA", HistType::kTHnSparseF, runaxes, true); + histos.add("hSparseLambdaSinPsiA", "hSparseLambdaSinPsiA", HistType::kTHnSparseF, runaxes, true); + histos.add("hSparseLambdaCosPsiC", "hSparseLambdaCosPsiC", HistType::kTHnSparseF, runaxes, true); + histos.add("hSparseLambdaSinPsiC", "hSparseLambdaSinPsiC", HistType::kTHnSparseF, runaxes, true); + } + histos.add("hSparseLambdaCosPsi", "hSparseLambdaCosPsi", HistType::kTHnSparseF, runaxes, true); + histos.add("hSparseLambdaSinPsi", "hSparseLambdaSinPsi", HistType::kTHnSparseF, runaxes, true); + if (usesubdet) { + histos.add("hSparseAntiLambdaCosPsiA", "hSparseAntiLambdaCosPsiA", HistType::kTHnSparseF, runaxes, true); + histos.add("hSparseAntiLambdaSinPsiA", "hSparseAntiLambdaSinPsiA", HistType::kTHnSparseF, runaxes, true); + histos.add("hSparseAntiLambdaCosPsiC", "hSparseAntiLambdaCosPsiC", HistType::kTHnSparseF, runaxes, true); + histos.add("hSparseAntiLambdaSinPsiC", "hSparseAntiLambdaSinPsiC", HistType::kTHnSparseF, runaxes, true); + } + histos.add("hSparseAntiLambdaCosPsi", "hSparseAntiLambdaCosPsi", HistType::kTHnSparseF, runaxes, true); + histos.add("hSparseAntiLambdaSinPsi", "hSparseAntiLambdaSinPsi", HistType::kTHnSparseF, runaxes, true); + + histos.add("hSparseLambdaPol", "hSparseLambdaPol", HistType::kTHnSparseF, runaxes, true); + histos.add("hSparseLambdaPolwgt", "hSparseLambdaPolwgt", HistType::kTHnSparseF, runaxes, true); + if (usesubdet) { + histos.add("hSparseLambdaPolA", "hSparseLambdaPolA", HistType::kTHnSparseF, runaxes, true); + histos.add("hSparseLambdaPolC", "hSparseLambdaPolC", HistType::kTHnSparseF, runaxes, true); + } + histos.add("hSparseAntiLambdaPol", "hSparseAntiLambdaPol", HistType::kTHnSparseF, runaxes, true); + histos.add("hSparseAntiLambdaPolwgt", "hSparseAntiLambdaPolwgt", HistType::kTHnSparseF, runaxes, true); + if (usesubdet) { + histos.add("hSparseAntiLambdaPolA", "hSparseAntiLambdaPolA", HistType::kTHnSparseF, runaxes, true); + histos.add("hSparseAntiLambdaPolC", "hSparseAntiLambdaPolC", HistType::kTHnSparseF, runaxes, true); + } + histos.add("hSparseLambda_corr1a", "hSparseLambda_corr1a", HistType::kTHnSparseF, runaxes, true); + histos.add("hSparseLambda_corr1b", "hSparseLambda_corr1b", HistType::kTHnSparseF, runaxes, true); + // histos.add("hSparseLambda_corr1c", "hSparseLambda_corr1c", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configphiAxis, configcentAxis, configbinAxis}, true); + histos.add("hSparseAntiLambda_corr1a", "hSparseAntiLambda_corr1a", HistType::kTHnSparseF, runaxes, true); + histos.add("hSparseAntiLambda_corr1b", "hSparseAntiLambda_corr1b", HistType::kTHnSparseF, runaxes, true); + // histos.add("hSparseAntiLambda_corr1c", "hSparseAntiLambda_corr1c", HistType::kTHnSparseF, {thnAxisInvMass, configthnAxispT, configphiAxis, configcentAxis, configbinAxis}, true); + + histos.add("hSparseLambda_corr2a", "hSparseLambda_corr2a", HistType::kTHnSparseF, runaxes, true); + // histos.add("hSparseLambda_corr2b", "hSparseLambda_corr2b", HistType::kTHnSparseF, runaxes, true); + histos.add("hSparseAntiLambda_corr2a", "hSparseAntiLambda_corr2a", HistType::kTHnSparseF, runaxes, true); + // histos.add("hSparseAntiLambda_corr2b", "hSparseAntiLambda_corr2b", HistType::kTHnSparseF, runaxes, true); } } @@ -416,14 +423,6 @@ struct lambdapolsp { return false; } - /* - if (pid == 0 && pt < cfgDaughPrPt) { - return false; - } - if (pid == 1 && pt < cfgDaughPiPt) { - return false; - }*/ - return true; } @@ -479,13 +478,18 @@ struct lambdapolsp { double GetPhiInRange(double phi) { - double result = phi; - while (result < 0) { - result = result + 2. * TMath::Pi(); - } - while (result > 2. * TMath::Pi()) { - result = result - 2. * TMath::Pi(); - } + double result = RecoDecay::constrainAngle(phi); + + /* + double result = phi; + while (result < 0) { + // result = result + 2. * TMath::Pi(); + result = result + 2. * o2::constants::math::PI; + } + while (result > 2. * TMath::Pi()) { + // result = result - 2. * TMath::Pi(); + result = result - 2. * o2::constants::math::PI; + }*/ return result; } @@ -503,7 +507,7 @@ struct lambdapolsp { void fillHistograms(bool tag1, bool tag2, const ROOT::Math::PxPyPzMVector& particle, const ROOT::Math::PxPyPzMVector& daughter, double psiZDCC, double psiZDCA, double psiZDC, double centrality, - double candmass, double candpt, float desbinvalue) + double candmass, double candpt, float desbinvalue, double acvalue) { ROOT::Math::Boost boost{particle.BoostToCM()}; @@ -520,75 +524,104 @@ struct lambdapolsp { auto sinPhiStar = TMath::Sin(GetPhiInRange(phiangle)); auto cosPhiStar = TMath::Cos(GetPhiInRange(phiangle)); - auto sinThetaStarcosphiphiStar = sinThetaStar * TMath::Cos(2 * GetPhiInRange(particle.Phi() - phiangle)); - auto phiphiStar = GetPhiInRange(particle.Phi() - phiangle); + // auto sinThetaStarcosphiphiStar = sinThetaStar * TMath::Cos(2 * GetPhiInRange(particle.Phi() - phiangle)); + // auto phiphiStar = GetPhiInRange(particle.Phi() - phiangle); + + acvalue = (4 / 3.14) * acvalue; + // PolC = PolC / acvalue; + // PolA = PolA / acvalue; + // Pol = Pol / acvalue; + auto Polwgt = Pol / acvalue; // Fill histograms using constructed names if (tag2) { - - histos.fill(HIST("hSparseAntiLambdaCosPsiA"), candmass, candpt, (TMath::Cos(GetPhiInRange(psiZDCA))), centrality, desbinvalue); - histos.fill(HIST("hSparseAntiLambdaCosPsiC"), candmass, candpt, (TMath::Cos(GetPhiInRange(psiZDCC))), centrality, desbinvalue); - histos.fill(HIST("hSparseAntiLambdaSinPsiA"), candmass, candpt, (TMath::Sin(GetPhiInRange(psiZDCA))), centrality, desbinvalue); - histos.fill(HIST("hSparseAntiLambdaSinPsiC"), candmass, candpt, (TMath::Sin(GetPhiInRange(psiZDCC))), centrality, desbinvalue); - histos.fill(HIST("hSparseAntiLambdaCosPsi"), candmass, candpt, (TMath::Cos(GetPhiInRange(psiZDC))), centrality, desbinvalue); - histos.fill(HIST("hSparseAntiLambdaSinPsi"), candmass, candpt, (TMath::Sin(GetPhiInRange(psiZDC))), centrality, desbinvalue); - - histos.fill(HIST("hSparseAntiLambdaPolA"), candmass, candpt, PolA, centrality, desbinvalue); - histos.fill(HIST("hSparseAntiLambdaPolC"), candmass, candpt, PolC, centrality, desbinvalue); - histos.fill(HIST("hSparseAntiLambdaPol"), candmass, candpt, Pol, centrality, desbinvalue); - histos.fill(HIST("hSparseAntiLambda_corr1a"), candmass, candpt, sinPhiStar, centrality, desbinvalue); - histos.fill(HIST("hSparseAntiLambda_corr1b"), candmass, candpt, cosPhiStar, centrality, desbinvalue); - histos.fill(HIST("hSparseAntiLambda_corr1c"), candmass, candpt, phiphiStar, centrality, desbinvalue); - histos.fill(HIST("hSparseAntiLambda_corr2a"), candmass, candpt, sinThetaStar, centrality, desbinvalue); - histos.fill(HIST("hSparseAntiLambda_corr2b"), candmass, candpt, sinThetaStarcosphiphiStar, centrality, desbinvalue); + if (needetaaxis) { + if (usesubdet) { + histos.fill(HIST("hSparseAntiLambdaCosPsiA"), candmass, candpt, (TMath::Cos(GetPhiInRange(psiZDCA))), centrality, desbinvalue); + histos.fill(HIST("hSparseAntiLambdaCosPsiC"), candmass, candpt, (TMath::Cos(GetPhiInRange(psiZDCC))), centrality, desbinvalue); + histos.fill(HIST("hSparseAntiLambdaSinPsiA"), candmass, candpt, (TMath::Sin(GetPhiInRange(psiZDCA))), centrality, desbinvalue); + histos.fill(HIST("hSparseAntiLambdaSinPsiC"), candmass, candpt, (TMath::Sin(GetPhiInRange(psiZDCC))), centrality, desbinvalue); + } + histos.fill(HIST("hSparseAntiLambdaCosPsi"), candmass, candpt, (TMath::Cos(GetPhiInRange(psiZDC))), centrality, desbinvalue); + histos.fill(HIST("hSparseAntiLambdaSinPsi"), candmass, candpt, (TMath::Sin(GetPhiInRange(psiZDC))), centrality, desbinvalue); + if (usesubdet) { + histos.fill(HIST("hSparseAntiLambdaPolA"), candmass, candpt, PolA, centrality, desbinvalue); + histos.fill(HIST("hSparseAntiLambdaPolC"), candmass, candpt, PolC, centrality, desbinvalue); + } + histos.fill(HIST("hSparseAntiLambdaPol"), candmass, candpt, Pol, centrality, desbinvalue); + histos.fill(HIST("hSparseAntiLambdaPolwgt"), candmass, candpt, Polwgt, centrality, desbinvalue); + histos.fill(HIST("hSparseAntiLambda_corr1a"), candmass, candpt, sinPhiStar, centrality, desbinvalue); + histos.fill(HIST("hSparseAntiLambda_corr1b"), candmass, candpt, cosPhiStar, centrality, desbinvalue); + // histos.fill(HIST("hSparseAntiLambda_corr1c"), candmass, candpt, phiphiStar, centrality, desbinvalue); + histos.fill(HIST("hSparseAntiLambda_corr2a"), candmass, candpt, sinThetaStar, centrality, desbinvalue); + // histos.fill(HIST("hSparseAntiLambda_corr2b"), candmass, candpt, sinThetaStarcosphiphiStar, centrality, desbinvalue); + } else { + if (usesubdet) { + histos.fill(HIST("hSparseAntiLambdaCosPsiA"), candmass, candpt, (TMath::Cos(GetPhiInRange(psiZDCA))), centrality); + histos.fill(HIST("hSparseAntiLambdaCosPsiC"), candmass, candpt, (TMath::Cos(GetPhiInRange(psiZDCC))), centrality); + histos.fill(HIST("hSparseAntiLambdaSinPsiA"), candmass, candpt, (TMath::Sin(GetPhiInRange(psiZDCA))), centrality); + histos.fill(HIST("hSparseAntiLambdaSinPsiC"), candmass, candpt, (TMath::Sin(GetPhiInRange(psiZDCC))), centrality); + } + histos.fill(HIST("hSparseAntiLambdaCosPsi"), candmass, candpt, (TMath::Cos(GetPhiInRange(psiZDC))), centrality); + histos.fill(HIST("hSparseAntiLambdaSinPsi"), candmass, candpt, (TMath::Sin(GetPhiInRange(psiZDC))), centrality); + if (usesubdet) { + histos.fill(HIST("hSparseAntiLambdaPolA"), candmass, candpt, PolA, centrality); + histos.fill(HIST("hSparseAntiLambdaPolC"), candmass, candpt, PolC, centrality); + } + histos.fill(HIST("hSparseAntiLambdaPol"), candmass, candpt, Pol, centrality); + histos.fill(HIST("hSparseAntiLambdaPolwgt"), candmass, candpt, Polwgt, centrality); + histos.fill(HIST("hSparseAntiLambda_corr1a"), candmass, candpt, sinPhiStar, centrality); + histos.fill(HIST("hSparseAntiLambda_corr1b"), candmass, candpt, cosPhiStar, centrality); + // histos.fill(HIST("hSparseAntiLambda_corr1c"), candmass, candpt, phiphiStar, centrality); + histos.fill(HIST("hSparseAntiLambda_corr2a"), candmass, candpt, sinThetaStar, centrality); + // histos.fill(HIST("hSparseAntiLambda_corr2b"), candmass, candpt, sinThetaStarcosphiphiStar, centrality); + } } if (tag1) { - histos.fill(HIST("hSparseLambdaCosPsiA"), candmass, candpt, (TMath::Cos(GetPhiInRange(psiZDCA))), centrality, desbinvalue); - histos.fill(HIST("hSparseLambdaCosPsiC"), candmass, candpt, (TMath::Cos(GetPhiInRange(psiZDCC))), centrality, desbinvalue); - histos.fill(HIST("hSparseLambdaSinPsiA"), candmass, candpt, (TMath::Sin(GetPhiInRange(psiZDCA))), centrality, desbinvalue); - histos.fill(HIST("hSparseLambdaSinPsiC"), candmass, candpt, (TMath::Sin(GetPhiInRange(psiZDCC))), centrality, desbinvalue); - histos.fill(HIST("hSparseLambdaCosPsi"), candmass, candpt, (TMath::Cos(GetPhiInRange(psiZDC))), centrality, desbinvalue); - histos.fill(HIST("hSparseLambdaSinPsi"), candmass, candpt, (TMath::Sin(GetPhiInRange(psiZDC))), centrality, desbinvalue); - - histos.fill(HIST("hSparseLambdaPolA"), candmass, candpt, PolA, centrality, desbinvalue); - histos.fill(HIST("hSparseLambdaPolC"), candmass, candpt, PolC, centrality, desbinvalue); - histos.fill(HIST("hSparseLambdaPol"), candmass, candpt, Pol, centrality, desbinvalue); - histos.fill(HIST("hSparseLambda_corr1a"), candmass, candpt, sinPhiStar, centrality, desbinvalue); - histos.fill(HIST("hSparseLambda_corr1b"), candmass, candpt, cosPhiStar, centrality, desbinvalue); - histos.fill(HIST("hSparseLambda_corr1c"), candmass, candpt, phiphiStar, centrality, desbinvalue); - histos.fill(HIST("hSparseLambda_corr2a"), candmass, candpt, sinThetaStar, centrality, desbinvalue); - histos.fill(HIST("hSparseLambda_corr2b"), candmass, candpt, sinThetaStarcosphiphiStar, centrality, desbinvalue); + if (needetaaxis) { + if (usesubdet) { + histos.fill(HIST("hSparseLambdaCosPsiA"), candmass, candpt, (TMath::Cos(GetPhiInRange(psiZDCA))), centrality, desbinvalue); + histos.fill(HIST("hSparseLambdaCosPsiC"), candmass, candpt, (TMath::Cos(GetPhiInRange(psiZDCC))), centrality, desbinvalue); + histos.fill(HIST("hSparseLambdaSinPsiA"), candmass, candpt, (TMath::Sin(GetPhiInRange(psiZDCA))), centrality, desbinvalue); + histos.fill(HIST("hSparseLambdaSinPsiC"), candmass, candpt, (TMath::Sin(GetPhiInRange(psiZDCC))), centrality, desbinvalue); + } + histos.fill(HIST("hSparseLambdaCosPsi"), candmass, candpt, (TMath::Cos(GetPhiInRange(psiZDC))), centrality, desbinvalue); + histos.fill(HIST("hSparseLambdaSinPsi"), candmass, candpt, (TMath::Sin(GetPhiInRange(psiZDC))), centrality, desbinvalue); + if (usesubdet) { + histos.fill(HIST("hSparseLambdaPolA"), candmass, candpt, PolA, centrality, desbinvalue); + histos.fill(HIST("hSparseLambdaPolC"), candmass, candpt, PolC, centrality, desbinvalue); + } + histos.fill(HIST("hSparseLambdaPol"), candmass, candpt, Pol, centrality, desbinvalue); + histos.fill(HIST("hSparseLambdaPolwgt"), candmass, candpt, Polwgt, centrality, desbinvalue); + histos.fill(HIST("hSparseLambda_corr1a"), candmass, candpt, sinPhiStar, centrality, desbinvalue); + histos.fill(HIST("hSparseLambda_corr1b"), candmass, candpt, cosPhiStar, centrality, desbinvalue); + // histos.fill(HIST("hSparseLambda_corr1c"), candmass, candpt, phiphiStar, centrality, desbinvalue); + histos.fill(HIST("hSparseLambda_corr2a"), candmass, candpt, sinThetaStar, centrality, desbinvalue); + // histos.fill(HIST("hSparseLambda_corr2b"), candmass, candpt, sinThetaStarcosphiphiStar, centrality, desbinvalue); + } else { + if (usesubdet) { + histos.fill(HIST("hSparseLambdaCosPsiA"), candmass, candpt, (TMath::Cos(GetPhiInRange(psiZDCA))), centrality); + histos.fill(HIST("hSparseLambdaCosPsiC"), candmass, candpt, (TMath::Cos(GetPhiInRange(psiZDCC))), centrality); + histos.fill(HIST("hSparseLambdaSinPsiA"), candmass, candpt, (TMath::Sin(GetPhiInRange(psiZDCA))), centrality); + histos.fill(HIST("hSparseLambdaSinPsiC"), candmass, candpt, (TMath::Sin(GetPhiInRange(psiZDCC))), centrality); + } + histos.fill(HIST("hSparseLambdaCosPsi"), candmass, candpt, (TMath::Cos(GetPhiInRange(psiZDC))), centrality); + histos.fill(HIST("hSparseLambdaSinPsi"), candmass, candpt, (TMath::Sin(GetPhiInRange(psiZDC))), centrality); + if (usesubdet) { + histos.fill(HIST("hSparseLambdaPolA"), candmass, candpt, PolA, centrality); + histos.fill(HIST("hSparseLambdaPolC"), candmass, candpt, PolC, centrality); + } + histos.fill(HIST("hSparseLambdaPol"), candmass, candpt, Pol, centrality); + histos.fill(HIST("hSparseLambdaPolwgt"), candmass, candpt, Polwgt, centrality); + histos.fill(HIST("hSparseLambda_corr1a"), candmass, candpt, sinPhiStar, centrality); + histos.fill(HIST("hSparseLambda_corr1b"), candmass, candpt, cosPhiStar, centrality); + // histos.fill(HIST("hSparseLambda_corr1c"), candmass, candpt, phiphiStar, centrality); + histos.fill(HIST("hSparseLambda_corr2a"), candmass, candpt, sinThetaStar, centrality); + // histos.fill(HIST("hSparseLambda_corr2b"), candmass, candpt, sinThetaStarcosphiphiStar, centrality); + } } } - /* - double calculateAngleBetweenLorentzVectors(const ROOT::Math::PxPyPzMVector& vec1, - const ROOT::Math::PxPyPzMVector& vec2) { - // Extract spatial momenta (3D vectors) - ROOT::Math::XYZVector momentum1 = vec1.Vect(); - ROOT::Math::XYZVector momentum2 = vec2.Vect(); - - // Calculate the dot product - double dotProduct = momentum1.Dot(momentum2); - - // Calculate the magnitudes - double magnitude1 = std::sqrt(momentum1.Mag2()); - double magnitude2 = std::sqrt(momentum2.Mag2()); - - // Check for zero magnitudes to avoid division by zero - if (magnitude1 == 0 || magnitude2 == 0) { - std::cerr << "Error: One of the vectors has zero magnitude!" << std::endl; - return -999.0; // Return an invalid value - } - - // Compute cosine of the angle - double cosTheta = dotProduct / (magnitude1 * magnitude2); - - // Calculate and return the angle in radians - return cosTheta; - } - */ - ROOT::Math::PxPyPzMVector Lambda, AntiLambda, Lambdadummy, AntiLambdadummy, Proton, Pion, AntiProton, AntiPion, fourVecDauCM; ROOT::Math::XYZVector threeVecDauCM, threeVecDauCMXY; double phiangle = 0.0; @@ -604,13 +637,17 @@ struct lambdapolsp { Filter dcaCutFilter = (nabs(aod::track::dcaXY) < cfgCutDCAxy) && (nabs(aod::track::dcaZ) < cfgCutDCAz); using EventCandidates = soa::Filtered>; - // using AllTrackCandidates = soa::Join; - // using AllTrackCandidates = soa::Filtered>; using AllTrackCandidates = soa::Filtered>; using ResoV0s = aod::V0Datas; - // void processData(EventCandidates::iterator const& collision, AllTrackCandidates const&, ResoV0s const& V0s, aod::BCs const&) - void processData(EventCandidates::iterator const& collision, AllTrackCandidates const& tracks, ResoV0s const& V0s, aod::BCs const&) + TProfile2D* accprofileL; + TProfile2D* accprofileAL; + int currentRunNumber = -999; + int lastRunNumber = -999; + + using BCsRun3 = soa::Join; + + void processData(EventCandidates::iterator const& collision, AllTrackCandidates const& tracks, ResoV0s const& V0s, BCsRun3 const&) { if (!collision.sel8()) { @@ -627,7 +664,7 @@ struct lambdapolsp { return; } // histos.fill(HIST("hCentrality2"), centrality); - // if (additionalEvSel2 && (!collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard))) { + // if (additionalEvSel2 && (!collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard))) { if (additionalEvSel2 && (collision.trackOccupancyInTimeRange() > cfgMaxOccupancy || collision.trackOccupancyInTimeRange() < cfgMinOccupancy)) { return; } @@ -640,6 +677,9 @@ struct lambdapolsp { return; } + currentRunNumber = collision.foundBC_as().runNumber(); + auto bc = collision.foundBC_as(); + auto qxZDCA = collision.qxZDCA(); auto qxZDCC = collision.qxZDCC(); auto qyZDCA = collision.qyZDCA(); @@ -704,7 +744,7 @@ struct lambdapolsp { histos.fill(HIST("hpQypvscent"), centrality, modqyZDCA); histos.fill(HIST("hpQytvscent"), centrality, modqyZDCC); - for (auto track : tracks) { + for (const auto& track : tracks) { if (!selectionTrack(track)) { continue; } @@ -826,7 +866,7 @@ struct lambdapolsp { } } } else { - for (auto v0 : V0s) { + for (const auto& v0 : V0s) { auto postrack = v0.template posTrack_as(); auto negtrack = v0.template negTrack_as(); @@ -878,6 +918,11 @@ struct lambdapolsp { int taga = LambdaTag; int tagb = aLambdaTag; + if (useAccCorr && (currentRunNumber != lastRunNumber)) { + accprofileL = ccdb->getForTimeStamp(ConfAccPathL.value, bc.timestamp()); + accprofileAL = ccdb->getForTimeStamp(ConfAccPathAL.value, bc.timestamp()); + } + float desbinvalue = 0.0; if (dosystematic) { //////////////////////////////////////////////////// @@ -932,39 +977,42 @@ struct lambdapolsp { if (LambdaTag) { Lambda = Proton + AntiPion; tagb = 0; - fillHistograms(taga, tagb, Lambda, Proton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mLambda(), v0.pt(), desbinvalue); + double acvalue = accprofileL->GetBinContent(accprofileL->FindBin(v0.eta(), v0.pt())); + fillHistograms(taga, tagb, Lambda, Proton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mLambda(), v0.pt(), desbinvalue, acvalue); } tagb = aLambdaTag; if (aLambdaTag) { AntiLambda = AntiProton + Pion; taga = 0; - fillHistograms(taga, tagb, AntiLambda, AntiProton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mAntiLambda(), v0.pt(), desbinvalue); + double acvalue = accprofileAL->GetBinContent(accprofileAL->FindBin(v0.eta(), v0.pt())); + fillHistograms(taga, tagb, AntiLambda, AntiProton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mAntiLambda(), v0.pt(), desbinvalue, acvalue); } } - } - - else { + } else { if (LambdaTag) { Lambda = Proton + AntiPion; tagb = 0; - fillHistograms(taga, tagb, Lambda, Proton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mLambda(), v0.pt(), 0.0); + double acvalue = accprofileL->GetBinContent(accprofileL->FindBin(v0.eta(), v0.pt())); + fillHistograms(taga, tagb, Lambda, Proton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mLambda(), v0.pt(), v0.eta(), acvalue); } tagb = aLambdaTag; if (aLambdaTag) { AntiLambda = AntiProton + Pion; taga = 0; - fillHistograms(taga, tagb, AntiLambda, AntiProton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mAntiLambda(), v0.pt(), 0.0); + double acvalue = accprofileAL->GetBinContent(accprofileAL->FindBin(v0.eta(), v0.pt())); + fillHistograms(taga, tagb, AntiLambda, AntiProton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mAntiLambda(), v0.pt(), v0.eta(), acvalue); } } } } + lastRunNumber = currentRunNumber; } PROCESS_SWITCH(lambdapolsp, processData, "Process data", true); // process function for derived data - mimics the functionality of the original data - void processDerivedData(soa::Join::iterator const& collision, v0Candidates const& V0s, dauTracks const&) + void processDerivedData(soa::Join::iterator const& collision, v0Candidates const& V0s, dauTracks const&, BCsRun3 const&) { //___________________________________________________________________________________________________ // event selection @@ -993,6 +1041,14 @@ struct lambdapolsp { return; } + /*currentRunNumber = collision.foundBC_as().runNumber(); + auto bc = collision.foundBC_as(); + + if (useAccCorr && (currentRunNumber != lastRunNumber)) { + accprofileL = ccdb->getForTimeStamp(ConfAccPathL.value, bc.timestamp()); + accprofileAL = ccdb->getForTimeStamp(ConfAccPathAL.value, bc.timestamp()); + } + */ //___________________________________________________________________________________________________ // retrieve further info provided by StraZDCSP auto qxZDCA = collision.qxZDCA(); @@ -1034,7 +1090,7 @@ struct lambdapolsp { //___________________________________________________________________________________________________ // loop over V0s as necessary - for (auto v0 : V0s) { + for (const auto& v0 : V0s) { bool LambdaTag = isCompatible(v0, 0); bool aLambdaTag = isCompatible(v0, 1); @@ -1122,31 +1178,36 @@ struct lambdapolsp { if (LambdaTag) { Lambda = Proton + AntiPion; tagb = 0; - fillHistograms(taga, tagb, Lambda, Proton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mLambda(), v0.pt(), desbinvalue); + double acvalue = 1.0; + fillHistograms(taga, tagb, Lambda, Proton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mLambda(), v0.pt(), desbinvalue, acvalue); } tagb = aLambdaTag; if (aLambdaTag) { AntiLambda = AntiProton + Pion; taga = 0; - fillHistograms(taga, tagb, AntiLambda, AntiProton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mAntiLambda(), v0.pt(), desbinvalue); + double acvalue = 1.0; + fillHistograms(taga, tagb, AntiLambda, AntiProton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mAntiLambda(), v0.pt(), desbinvalue, acvalue); } } } else { if (LambdaTag) { Lambda = Proton + AntiPion; tagb = 0; - fillHistograms(taga, tagb, Lambda, Proton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mLambda(), v0.pt(), 0.0); + double acvalue = 1.0; + fillHistograms(taga, tagb, Lambda, Proton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mLambda(), v0.pt(), v0.eta(), acvalue); } tagb = aLambdaTag; if (aLambdaTag) { AntiLambda = AntiProton + Pion; taga = 0; - fillHistograms(taga, tagb, AntiLambda, AntiProton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mAntiLambda(), v0.pt(), 0.0); + double acvalue = 1.0; + fillHistograms(taga, tagb, AntiLambda, AntiProton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mAntiLambda(), v0.pt(), v0.eta(), acvalue); } } } + // lastRunNumber = currentRunNumber; } PROCESS_SWITCH(lambdapolsp, processDerivedData, "Process derived data", false); }; From cb43278ea446b2737739d4bd573d78438f8cf69c Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Mon, 31 Mar 2025 03:49:03 +0900 Subject: [PATCH 0873/1650] [Common] update refit global muon in fwdtrackPropagation.cxx (#10703) --- Common/TableProducer/fwdtrackPropagation.cxx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Common/TableProducer/fwdtrackPropagation.cxx b/Common/TableProducer/fwdtrackPropagation.cxx index f08304c789d..134b1f2eff2 100644 --- a/Common/TableProducer/fwdtrackPropagation.cxx +++ b/Common/TableProducer/fwdtrackPropagation.cxx @@ -69,6 +69,7 @@ struct FwdTrackPropagation { Configurable maxMatchingChi2MCHMFT{"maxMatchingChi2MCHMFT", 50.f, "max. chi2 for MCH-MFT matching"}; Configurable maxChi2{"maxChi2", 1e+6, "max. chi2 for muon tracking"}; Configurable refitGlobalMuon{"refitGlobalMuon", false, "flag to refit global muon"}; + Configurable applyEtaCutToSAinGL{"applyEtaCutToSAinGL", false, "flag to apply eta cut to samuon in global muon"}; HistogramRegistry fRegistry{"fRegistry"}; static constexpr std::string_view muon_types[5] = {"MFTMCHMID/", "MFTMCHMIDOtherMatch/", "MFTMCH/", "MCHMID/", "MCH/"}; @@ -148,7 +149,7 @@ struct FwdTrackPropagation { fRegistry.add("MCHMID/hDCAyResolutionvsPt", "DCA_{y} vs. p_{T};p_{T} (GeV/c);DCA_{y} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 5e+5}}, false); } - bool isSelected(const float pt, const float eta, const float rAtAbsorberEnd, const float pDCA, const float chi2, const uint8_t trackType) + bool isSelected(const float pt, const float eta, const float rAtAbsorberEnd, const float pDCA, const float chi2, const uint8_t trackType, const float etaMatchedMCHMID) { if (pt < minPt || maxPt < pt) { return false; @@ -166,6 +167,9 @@ struct FwdTrackPropagation { if (eta < minEtaGL || maxEtaGL < eta) { return false; } + if (applyEtaCutToSAinGL && (etaMatchedMCHMID < minEtaSA || maxEtaSA < etaMatchedMCHMID)) { + return false; + } } else if (trackType == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { if (eta < minEtaSA || maxEtaSA < eta) { return false; @@ -251,18 +255,18 @@ struct FwdTrackPropagation { const auto& mfttrack = fwdtrack.template matchMFTTrack_as(); nClustersMFT = mfttrack.nClusters(); + chi2mft = mfttrack.chi2(); if (refitGlobalMuon) { eta = mfttrack.eta(); phi = mfttrack.phi(); o2::math_utils::bringTo02Pi(phi); - pt = propmuonAtPV.getP() * std::sin(2.f * std::atan(std::exp(-eta))); + pt = propmuonAtPV_Matched.getP() * std::sin(2.f * std::atan(std::exp(-eta))); x = mfttrack.x(); y = mfttrack.y(); z = mfttrack.z(); tgl = mfttrack.tgl(); } - chi2mft = mfttrack.chi2(); } else if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) { o2::dataformats::GlobalFwdTrack propmuonAtRabs = propagateMuon(fwdtrack, collision, propagationPoint::kToRabs); // this is necessary only for MuonStandaloneTrack float xAbs = propmuonAtRabs.getX(); @@ -272,7 +276,7 @@ struct FwdTrackPropagation { return; } - if (!isSelected(pt, eta, rAtAbsorberEnd, pDCA, fwdtrack.chi2(), fwdtrack.trackType())) { + if (!isSelected(pt, eta, rAtAbsorberEnd, pDCA, fwdtrack.chi2(), fwdtrack.trackType(), etaMatchedMCHMID)) { return; } From 63c1bcc450594ef6546a52d143addcc89b20ff12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Karpi=C5=84ski?= <40724893+davkk@users.noreply.github.com> Date: Sun, 30 Mar 2025 22:12:38 +0200 Subject: [PATCH 0874/1650] [PWGCF/FemtoUniverse] Fix hPt_Primary histogram name (#10705) --- PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h index 053d8f116dc..668fd84714b 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h @@ -136,7 +136,7 @@ class FemtoUniverseParticleHisto std::string folderSuffix = static_cast(o2::aod::femtouniverse_mc_particle::MCTypeName[o2::aod::femtouniverse_mc_particle::MCType::kTruth]).c_str(); mHistogramRegistry->add((folderName + folderSuffix + "/hPt_ReconNoFake").c_str(), "; #it{p}_{T} (GeV/#it{c}); Entries", kTH1F, {tempFitVarpTAxis}); - mHistogramRegistry->add((folderName + folderSuffix + "/hPt_ReconPrimary").c_str(), "; #it{p}_{T} (GeV/#it{c}); Entries", kTH1F, {tempFitVarpTAxis}); + mHistogramRegistry->add((folderName + folderSuffix + "/hPt_Primary").c_str(), "; #it{p}_{T} (GeV/#it{c}); Entries", kTH1F, {tempFitVarpTAxis}); if constexpr (mParticleType == o2::aod::femtouniverseparticle::ParticleType::kTrack || mParticleType == o2::aod::femtouniverseparticle::ParticleType::kV0Child || mParticleType == o2::aod::femtouniverseparticle::ParticleType::kCascadeBachelor || mParticleType == o2::aod::femtouniverseparticle::ParticleType::kMCTruthTrack) { /// Track histograms From 0224a545455e877301fc30fd05b616636da1c2ac Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Sun, 30 Mar 2025 22:34:19 +0200 Subject: [PATCH 0875/1650] [PWGLF] doubleResonanceScan - Add new task (#10684) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Resonances/CMakeLists.txt | 5 + .../Tasks/Resonances/doubleResonanceScan.cxx | 548 ++++++++++++++++++ 2 files changed, 553 insertions(+) create mode 100644 PWGLF/Tasks/Resonances/doubleResonanceScan.cxx diff --git a/PWGLF/Tasks/Resonances/CMakeLists.txt b/PWGLF/Tasks/Resonances/CMakeLists.txt index 314fdf48072..aec43e97f65 100644 --- a/PWGLF/Tasks/Resonances/CMakeLists.txt +++ b/PWGLF/Tasks/Resonances/CMakeLists.txt @@ -203,3 +203,8 @@ o2physics_add_dpl_workflow(heptaquark SOURCES heptaquark.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(double-resonance-scan + SOURCES doubleResonanceScan.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) diff --git a/PWGLF/Tasks/Resonances/doubleResonanceScan.cxx b/PWGLF/Tasks/Resonances/doubleResonanceScan.cxx new file mode 100644 index 00000000000..5d8772ef7e9 --- /dev/null +++ b/PWGLF/Tasks/Resonances/doubleResonanceScan.cxx @@ -0,0 +1,548 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// +/// \file doubleResonanceScan.cxx +/// \brief Resonance Scanner with ResoTracks and ResoMicroTracks +/// \author Bong-Hwi Lim +/// \since 27/03/2025 +/// + +#include +#include + +#include "Framework/AnalysisTask.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/runDataProcessing.h" +#include "PWGLF/DataModel/LFResonanceTables.h" + +#include "CommonConstants/PhysicsConstants.h" +#include "CommonConstants/MathConstants.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::constants::physics; +using namespace o2::constants::math; +// Extract STEP +// Handle resomicrotracks +struct DoubleResonanceScan { + HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + + // Configurables + struct : ConfigurableGroup { + ConfigurableAxis cfgBinsPt{"cfgBinsPt", {VARIABLE_WIDTH, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5.0, 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 6.0, 6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 6.7, 6.8, 6.9, 7.0, 7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 7.7, 7.8, 7.9, 8.0, 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9, 9.0, 9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7, 9.8, 9.9, 10.0, 10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8, 10.9, 11.0, 11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7, 11.8, 11.9, 12.0, 12.1, 12.2, 12.3, 12.4, 12.5, 12.6, 12.7, 12.8, 12.9, 13.0, 13.1, 13.2, 13.3, 13.4, 13.5, 13.6, 13.7, 13.8, 13.9, 14.0, 14.1, 14.2, 14.3, 14.4, 14.5, 14.6, 14.7, 14.8, 14.9, 15.0}, "Binning of the pT axis"}; + ConfigurableAxis cfgBinsPtQA{"cfgBinsPtQA", {VARIABLE_WIDTH, 0.0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8, 5.0, 5.2, 5.4, 5.6, 5.8, 6.0, 6.2, 6.4, 6.6, 6.8, 7.0, 7.2, 7.4, 7.6, 7.8, 8.0, 8.2, 8.4, 8.6, 8.8, 9.0, 9.2, 9.4, 9.6, 9.8, 10.0}, "Binning of the pT axis"}; + ConfigurableAxis cfgBinsCent{"cfgBinsCent", {VARIABLE_WIDTH, 0.0, 1.0, 5.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0, 110.0}, "Binning of the centrality axis"}; + ConfigurableAxis cfgBinsVtxZ{"cfgBinsVtxZ", {VARIABLE_WIDTH, -10.0, -9.0, -8.0, -7.0, -6.0, -5.0, -4.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0}, "Binning of the z-vertex axis"}; + Configurable cNbinsDiv{"cNbinsDiv", 1, "Integer to divide the number of bins"}; + Configurable cNbinsDivQA{"cNbinsDivQA", 1, "Integer to divide the number of bins for QA"}; + Configurable cfgInvMassNBins1{"cfgInvMassNBins1", 400, "Number of bins for the invariant mass pair"}; + Configurable cfgInvMassPairStart1{"cfgInvMassPairStart1", 0.9, "Start of the invariant mass pair"}; + Configurable cfgInvMassPairEnd1{"cfgInvMassPairEnd1", 1.3, "Start of the invariant mass pair"}; + Configurable cfgInvMassNBins2{"cfgInvMassNBins2", 400, "Number of bins for the invariant mass pair"}; + Configurable cfgInvMassPairStart2{"cfgInvMassPairStart2", 0.9, "Start of the invariant mass pair"}; + Configurable cfgInvMassPairEnd2{"cfgInvMassPairEnd2", 1.3, "Start of the invariant mass pair"}; + Configurable cfgInvMassNBinsReso{"cfgInvMassNBinsReso", 800, "Number of bins for the invariant mass final pair"}; + Configurable cfgInvMassPairStartReso{"cfgInvMassPairStartReso", 2.4, "Start of the invariant mass final pair"}; + Configurable cfgInvMassPairEndReso{"cfgInvMassPairEndReso", 4.0, "Start of the invariant mass final pair"}; + } AxisConfig; + + struct : ConfigurableGroup { + Configurable cfgFillQAPlots{"cfgFillQAPlots", true, "Fill QA plots"}; + } AnalysisConfig; + + // Configurable for min pT cut + Configurable cMinPtcut{"cMinPtcut", 0.15, "Track minium pt cut"}; + + // Track selection + // primary track condition + Configurable cfgPrimaryTrack{"cfgPrimaryTrack", true, "Primary track selection"}; + Configurable cfgGlobalWoDCATrack{"cfgGlobalWoDCATrack", true, "Global track selection without DCA"}; + Configurable cfgPVContributor{"cfgPVContributor", false, "PV contributor track selection"}; + + // DCA Selections + Configurable cMaxDCArToPVcut{"cMaxDCArToPVcut", 0.15, "Track DCAr cut to PV Maximum"}; + Configurable cUsePtDependentDCArCut{"cUsePtDependentDCArCut", false, "Use Pt dependent DCAr cut"}; + Configurable cMaxDCAzToPVcut{"cMaxDCAzToPVcut", 0.15, "Track DCAz cut to PV Maximum"}; + + // PID selection + Configurable cfgFirstDaughter{"cfgFirstDaughter", 0, "code of the first daughter, 0: pion, 1: kaon, 2: proton"}; + Configurable cfgSecondDaughter{"cfgSecondDaughter", 0, "code of the second daughter, 0: pion, 1: kaon, 2: proton"}; + Configurable cfgThirdDaughter{"cfgThirdDaughter", 0, "code of the third daughter, 0: pion, 1: kaon, 2: proton"}; + Configurable cfgFourthDaughter{"cfgFourthDaughter", 0, "code of the fourth daughter, 0: pion, 1: kaon, 2: proton"}; + // PID selection values + Configurable nSigmaCutTPC{"nSigmaCutTPC", 3.0, "Value of the TPC Nsigma cut"}; + Configurable nSigmaCutTOF{"nSigmaCutTOF", 3.0, "Value of the TOF Nsigma cut, if negative, TOF is not used"}; + + struct : ConfigurableGroup { + Configurable> cfgPairMassesLow{"cfgPairMassesLow", {1.01, 1.01}, "Low mass cut for pair_1 pair_2"}; + Configurable> cfgPairMassesHigh{"cfgPairMassesHigh", {1.03, 1.03}, "High mass cut for pair_1 pair_2"}; + Configurable> cfgPairOACut{"cfgPairOACut", {0.04, 0.04}, "Opening angle cut for pair_1 pair_2"}; + } PairCuts; + + struct : ConfigurableGroup { + Configurable cfgPairOALow{"cfgPairOALow", -999, "Low opening angle cut for pair_1 pair_2"}; + Configurable cfgPairOAHigh{"cfgPairOAHigh", 999, "High opening angle cut for pair_1 pair_2"}; + } ResoCuts; + + /// Event Mixing + Configurable nEvtMixing{"nEvtMixing", 5, "Number of events to mix"}; + ConfigurableAxis cfgVtxBins{"cfgVtxBins", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; + ConfigurableAxis cfgMultBins{"cfgMultBins", {VARIABLE_WIDTH, 0.0f, 1.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f, 110.0f}, "Mixing bins - z-vertex"}; + + /// Rotation background + struct : ConfigurableGroup { + Configurable cfgFillRotBkg{"cfgFillRotBkg", true, "Fill rotated background"}; + Configurable cfgMinRot{"cfgMinRot", 5.0 * constants::math::PI / 6.0, "Minimum of rotation"}; + Configurable cfgMaxRot{"cfgMaxRot", 7.0 * constants::math::PI / 6.0, "Maximum of rotation"}; + Configurable cfgNrotBkg{"cfgNrotBkg", 9, "Number of rotated copies (background) per each original candidate"}; + } BkgEstimationConfig; + + float mass1{MassPionCharged}, mass2{MassPionCharged}, mass3{MassPionCharged}, mass4{MassPionCharged}; + + float getMassFromCode(int code) + { + switch (code) { + case 0: + return MassPionCharged; + case 1: + return MassKaonCharged; + case 2: + return MassProton; + default: + return 0.f; + } + } + void init(o2::framework::InitContext&) + { + LOG(info) << "Initializing DoubleResonanceScan"; + LOG(info) << "First Daughter: " << cfgFirstDaughter << " Second Daughter: " << cfgSecondDaughter << " Third Daughter: " << cfgThirdDaughter << " Fourth Daughter: " << cfgFourthDaughter; + mass1 = getMassFromCode(cfgFirstDaughter); + mass2 = getMassFromCode(cfgSecondDaughter); + mass3 = getMassFromCode(cfgThirdDaughter); + mass4 = getMassFromCode(cfgFourthDaughter); + LOG(info) << "Masses: " << mass1 << " " << mass2 << " " << mass3 << " " << mass4; + + AxisSpec centAxis = {AxisConfig.cfgBinsCent, "T0M (%)"}; + AxisSpec vtxzAxis = {AxisConfig.cfgBinsVtxZ, "Z Vertex (cm)"}; + AxisSpec ptAxis = {AxisConfig.cfgBinsPt, "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec ptAxisQA = {AxisConfig.cfgBinsPtQA, "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec dcaAxis = {200 / AxisConfig.cNbinsDivQA, 0, 2, "DCA (cm)"}; + AxisSpec dcaxyAxis = {100 / AxisConfig.cNbinsDivQA, 0, 1, "DCA_{#it{xy}} (cm)"}; + AxisSpec dcazAxis = {100 / AxisConfig.cNbinsDivQA, 0, 1, "DCA_{#it{z}} (cm)"}; + AxisSpec yAxis = {50, -1, 1, "Rapidity"}; + AxisSpec invMassAxisPair1 = {AxisConfig.cfgInvMassNBins1, AxisConfig.cfgInvMassPairStart1, AxisConfig.cfgInvMassPairEnd1, "Invariant Mass (GeV/#it{c}^2)"}; + AxisSpec invMassAxisPair2 = {AxisConfig.cfgInvMassNBins2, AxisConfig.cfgInvMassPairStart2, AxisConfig.cfgInvMassPairEnd2, "Invariant Mass (GeV/#it{c}^2)"}; + AxisSpec invMassAxisReso = {AxisConfig.cfgInvMassNBinsReso, AxisConfig.cfgInvMassPairStartReso, AxisConfig.cfgInvMassPairEndReso, "Invariant Mass (GeV/#it{c}^2)"}; + AxisSpec pidQAAxis = {130 / AxisConfig.cNbinsDivQA, -6.5, 6.5}; + // Event QA + histos.add("hVertexZ", "hVertexZ", HistType::kTH1F, {{300, -15., 15.}}); + histos.add("hMultiplicityPercent", "Multiplicity Percentile", kTH1F, {{120, 0.0f, 120.0f}}); + + if (AnalysisConfig.cfgFillQAPlots) { + // First Daughter + histos.add("hEta_1", "Eta distribution", kTH1F, {yAxis}); + histos.add("hPhi_1", "Phi distribution", kTH1F, {{200 / AxisConfig.cNbinsDivQA, 0, TwoPI}}); + histos.add("hPt_1", "Pt distribution", kTH1F, {ptAxisQA}); + histos.add("hDCAr_1", "DCAr distribution", kTH1F, {dcaxyAxis}); + histos.add("hDCAz_1", "DCAz distribution", kTH1F, {dcazAxis}); + histos.add("hNsigmaTPC_1", "nSigmaTPC distribution", kTH1F, {pidQAAxis}); + histos.add("hNsigmaTOF_1", "nSigmaTOF distribution", kTH1F, {pidQAAxis}); + + // Second Daughter + histos.add("hEta_2", "Eta distribution", kTH1F, {yAxis}); + histos.add("hPhi_2", "Phi distribution", kTH1F, {{200 / AxisConfig.cNbinsDivQA, 0, TwoPI}}); + histos.add("hPt_2", "Pt distribution", kTH1F, {ptAxisQA}); + histos.add("hDCAr_2", "DCAr distribution", kTH1F, {dcaxyAxis}); + histos.add("hDCAz_2", "DCAz distribution", kTH1F, {dcazAxis}); + histos.add("hNsigmaTPC_2", "nSigmaTPC distribution", kTH1F, {pidQAAxis}); + histos.add("hNsigmaTOF_2", "nSigmaTOF distribution", kTH1F, {pidQAAxis}); + + // Third Daughter + histos.add("hEta_3", "Eta distribution", kTH1F, {yAxis}); + histos.add("hPhi_3", "Phi distribution", kTH1F, {{200 / AxisConfig.cNbinsDivQA, 0, TwoPI}}); + histos.add("hPt_3", "Pt distribution", kTH1F, {ptAxisQA}); + histos.add("hDCAr_3", "DCAr distribution", kTH1F, {dcaxyAxis}); + histos.add("hDCAz_3", "DCAz distribution", kTH1F, {dcazAxis}); + histos.add("hNsigmaTPC_3", "nSigmaTPC distribution", kTH1F, {pidQAAxis}); + histos.add("hNsigmaTOF_3", "nSigmaTOF distribution", kTH1F, {pidQAAxis}); + + // Forth Daughter + histos.add("hEta_4", "Eta distribution", kTH1F, {yAxis}); + histos.add("hPhi_4", "Phi distribution", kTH1F, {{200 / AxisConfig.cNbinsDivQA, 0, TwoPI}}); + histos.add("hPt_4", "Pt distribution", kTH1F, {ptAxisQA}); + histos.add("hDCAr_4", "DCAr distribution", kTH1F, {dcaxyAxis}); + histos.add("hDCAz_4", "DCAz distribution", kTH1F, {dcazAxis}); + histos.add("hNsigmaTPC_4", "nSigmaTPC distribution", kTH1F, {pidQAAxis}); + histos.add("hNsigmaTOF_4", "nSigmaTOF distribution", kTH1F, {pidQAAxis}); + + // First Pair + histos.add("hPairInvMass_1", "Invariant mass distribution", kTH1F, {invMassAxisPair1}); + histos.add("hPairPt_1", "Pt distribution", kTH1F, {ptAxis}); + histos.add("hPairOA_1", "Opening angle distribution", kTH1F, {AxisSpec{100, 0, PI, "Opening Angle (rad)"}}); + + // Second Pair + histos.add("hPairInvMass_2", "Invariant mass distribution", kTH1F, {invMassAxisPair2}); + histos.add("hPairPt_2", "Pt distribution", kTH1F, {ptAxis}); + histos.add("hPairOA_2", "Opening angle distribution", kTH1F, {AxisSpec{100, 0, PI, "Opening Angle (rad)"}}); + + // Resonance + histos.add("h2PairInvMass", "Invariant mass distribution", kTH2F, {invMassAxisPair1, invMassAxisPair2}); + histos.add("hResoInvMass", "Invariant mass distribution", kTH1F, {invMassAxisReso}); + histos.add("hResoOA", "Opening angle distribution", kTH1F, {AxisSpec{100, 0, PI, "Opening Angle (rad)"}}); + histos.add("THnResoInvMass", "Invariant mass distribution with other axes", HistType::kTHnSparseD, {centAxis, ptAxis, invMassAxisReso}); + histos.add("THnResoInvMassBkg", "Invariant mass distribution with other axes", HistType::kTHnSparseD, {centAxis, ptAxis, invMassAxisReso}); + } + + LOG(info) << "Size of the histograms in double resonance scan with table combination:"; + histos.print(); + } + + template + bool trackCut(const TrackType track) + { + if constexpr (!IsResoMicrotrack) { + if (std::abs(track.pt()) < cMinPtcut) + return false; + if (cUsePtDependentDCArCut) { + // Tuned on the LHC22f anchored MC LHC23d1d on primary pions. 7 Sigmas of the resolution + if (std::abs(track.dcaXY()) > (0.004 + (0.013 / track.pt()))) + return false; + } else { + if (std::abs(track.dcaXY()) > cMaxDCArToPVcut) + return false; + } + if (std::abs(track.dcaZ()) > cMaxDCAzToPVcut) + return false; + if (cfgPrimaryTrack && !track.isPrimaryTrack()) + return false; + if (cfgGlobalWoDCATrack && !track.isGlobalTrackWoDCA()) + return false; + if (cfgPVContributor && !track.isPVContributor()) + return false; + } else { + if (std::abs(track.pt()) < cMinPtcut) + return false; + if (cUsePtDependentDCArCut) { + if (o2::aod::resodmciroaughter::ResoMicroTrackSelFlag::decodeDCAxy(track.trackSelectionFlags()) > -Epsilon) + return false; + } else { + if (o2::aod::resodmciroaughter::ResoMicroTrackSelFlag::decodeDCAxy(track.trackSelectionFlags()) > cMaxDCArToPVcut - Epsilon) + return false; + } + if (o2::aod::resodmciroaughter::ResoMicroTrackSelFlag::decodeDCAz(track.trackSelectionFlags()) > cMaxDCAzToPVcut - Epsilon) + return false; + if (cfgPrimaryTrack && !track.isPrimaryTrack()) + return false; + if (cfgGlobalWoDCATrack && !track.isGlobalTrackWoDCA()) + return false; + if (cfgPVContributor && !track.isPVContributor()) + return false; + } + return true; + } + + template + float getPIDTPC(const T& candidate, int particleType) + { + if constexpr (!IsResoMicrotrack) { + // switch based on particleType + switch (particleType) { + case 0: // pion + return candidate.tpcNSigmaPi(); + case 1: // kaon + return candidate.tpcNSigmaKa(); + case 2: // proton + return candidate.tpcNSigmaPr(); + default: + return -999; + } + } else { + switch (particleType) { + case 0: // pion + return o2::aod::resodmciroaughter::PidNSigma::getTPCnSigma(candidate.pidNSigmaPiFlag()); + case 1: // kaon + return o2::aod::resodmciroaughter::PidNSigma::getTPCnSigma(candidate.pidNSigmaKaFlag()); + case 2: // proton + return o2::aod::resodmciroaughter::PidNSigma::getTPCnSigma(candidate.pidNSigmaPrFlag()); + default: + return -999; + } + } + } + + template + float getPIDTOF(const T& candidate, int particleType) + { + if constexpr (!IsResoMicrotrack) { + // switch based on particleType + switch (particleType) { + case 0: // pion + return candidate.hasTOF() ? candidate.tofNSigmaPi() : -999; + case 1: // kaon + return candidate.hasTOF() ? candidate.tofNSigmaKa() : -999; + case 2: // proton + return candidate.hasTOF() ? candidate.tofNSigmaPr() : -999; + default: + return -999; + } + } else { + switch (particleType) { + case 0: // pion + return candidate.hasTOF() ? o2::aod::resodmciroaughter::PidNSigma::getTOFnSigma(candidate.pidNSigmaPiFlag()) : -999; + case 1: // kaon + return candidate.hasTOF() ? o2::aod::resodmciroaughter::PidNSigma::getTOFnSigma(candidate.pidNSigmaKaFlag()) : -999; + case 2: // proton + return candidate.hasTOF() ? o2::aod::resodmciroaughter::PidNSigma::getTOFnSigma(candidate.pidNSigmaPrFlag()) : -999; + default: + return -999; + } + } + } + + template + bool selectionPID(const T& candidate, int particleType) + { + bool tpcPass = std::abs(getPIDTPC(candidate, particleType)) < nSigmaCutTPC; + bool tofPass = (nSigmaCutTOF > 0) ? std::abs(getPIDTOF(candidate, particleType)) < nSigmaCutTOF : true; + if (tpcPass && tofPass) { + return true; + } + return false; + } + + template + std::vector selectTrackIndicesWithQA(const TracksType& dTracks, int daughterType, int daughterIndex) + { + std::vector selectedIndices; + for (auto const& track : dTracks) { + if (!trackCut(track)) { + continue; + } + if (!selectionPID(track, daughterType)) { + continue; + } + + if (AnalysisConfig.cfgFillQAPlots) { + auto dcaXY = -999; + auto dcaZ = -999; + if constexpr (!IsResoMicrotrack) { + dcaXY = track.dcaXY(); + dcaZ = track.dcaZ(); + } else { + dcaXY = o2::aod::resodmciroaughter::ResoMicroTrackSelFlag::decodeDCAxy(track.trackSelectionFlags()); + dcaZ = o2::aod::resodmciroaughter::ResoMicroTrackSelFlag::decodeDCAz(track.trackSelectionFlags()); + } + // FIXME: Apply better method + switch (daughterIndex) { + case 0: // First + histos.fill(HIST("hEta_1"), track.eta()); + histos.fill(HIST("hPhi_1"), track.phi()); + histos.fill(HIST("hPt_1"), track.pt()); + histos.fill(HIST("hDCAr_1"), dcaXY); + histos.fill(HIST("hDCAz_1"), dcaZ); + histos.fill(HIST("hNsigmaTPC_1"), getPIDTPC(track, daughterType)); + histos.fill(HIST("hNsigmaTOF_1"), getPIDTOF(track, daughterType)); + break; + case 1: // Second + histos.fill(HIST("hEta_2"), track.eta()); + histos.fill(HIST("hPhi_2"), track.phi()); + histos.fill(HIST("hPt_2"), track.pt()); + histos.fill(HIST("hDCAr_2"), dcaXY); + histos.fill(HIST("hDCAz_2"), dcaZ); + histos.fill(HIST("hNsigmaTPC_2"), getPIDTPC(track, daughterType)); + histos.fill(HIST("hNsigmaTOF_2"), getPIDTOF(track, daughterType)); + break; + case 2: // Third + histos.fill(HIST("hEta_3"), track.eta()); + histos.fill(HIST("hPhi_3"), track.phi()); + histos.fill(HIST("hPt_3"), track.pt()); + histos.fill(HIST("hDCAr_3"), dcaXY); + histos.fill(HIST("hDCAz_3"), dcaZ); + histos.fill(HIST("hNsigmaTPC_3"), getPIDTPC(track, daughterType)); + histos.fill(HIST("hNsigmaTOF_3"), getPIDTOF(track, daughterType)); + break; + case 3: // Forth + histos.fill(HIST("hEta_4"), track.eta()); + histos.fill(HIST("hPhi_4"), track.phi()); + histos.fill(HIST("hPt_4"), track.pt()); + histos.fill(HIST("hDCAr_4"), dcaXY); + histos.fill(HIST("hDCAz_4"), dcaZ); + histos.fill(HIST("hNsigmaTPC_4"), getPIDTPC(track, daughterType)); + histos.fill(HIST("hNsigmaTOF_4"), getPIDTOF(track, daughterType)); + break; + default: + break; + } + } + selectedIndices.push_back(track.index()); + } + return selectedIndices; + } + + bool isPairSelected(const TLorentzVector& lv1, const TLorentzVector& lv2, int pairType = 0) + { + TLorentzVector lvSum = lv1 + lv2; + // Mass window cut + auto pairMass = lvSum.M(); + auto pairMassesLow = PairCuts.cfgPairMassesLow.value; + auto pairMassesHigh = PairCuts.cfgPairMassesHigh.value; + if ((pairMassesLow[pairType] > 0) || (pairMassesHigh[pairType] > 0)) { + if (pairMass < pairMassesLow[pairType] || pairMass > pairMassesHigh[pairType]) { + return false; + } + } + // Opening angle cut + double angle = lv1.Vect().Angle(lv2.Vect()); + auto angleCut = PairCuts.cfgPairOACut.value; + if (angleCut[pairType] > 0) { + if (angle < angleCut[pairType]) { + return false; + } + } + if (AnalysisConfig.cfgFillQAPlots) { + // FIXME: Apply better method + if (pairType > 0) { + histos.fill(HIST("hPairInvMass_2"), pairMass); + histos.fill(HIST("hPairPt_2"), lvSum.Pt()); + histos.fill(HIST("hPairOA_2"), angle); + } else { + histos.fill(HIST("hPairInvMass_1"), pairMass); + histos.fill(HIST("hPairPt_1"), lvSum.Pt()); + histos.fill(HIST("hPairOA_1"), angle); + } + } + return true; + } + + template + std::vector> + getSelectedTrackPairs(const TracksType& dTracks, + const std::vector& indicesA, + const std::vector& indicesB, + float massA, float massB, + int pairType) + { + std::vector> selectedPairs; + TLorentzVector lv1, lv2; + for (const auto& indexA : indicesA) { + for (const auto& indexB : indicesB) { + if (indexA == indexB) { + continue; + } + + auto trackA = dTracks.rawIteratorAt(indexA); + auto trackB = dTracks.rawIteratorAt(indexB); + + lv1.SetXYZM(trackA.px(), trackA.py(), trackA.pz(), massA); + lv2.SetXYZM(trackB.px(), trackB.py(), trackB.pz(), massB); + + if (!isPairSelected(lv1, lv2, pairType)) { + continue; + } + selectedPairs.emplace_back(indexA, indexB); + } + } + return selectedPairs; + } + + bool isResoSelected(const TLorentzVector& par1, const TLorentzVector& pair2) + { + // Opening angle (3D) + double oa = par1.Vect().Angle(pair2.Vect()); + if (oa < ResoCuts.cfgPairOALow || oa > ResoCuts.cfgPairOAHigh) { + return false; + } + // Rapidity cut + TLorentzVector lvTotal = par1 + pair2; + if (lvTotal.Rapidity() < -0.5 || lvTotal.Rapidity() > 0.5) { + return false; + } + histos.fill(HIST("hResoOA"), oa); + return true; + } + + template + void fillHistograms(const CollisionType& collision, const TracksType& dTracks) + { + auto multiplicity = collision.cent(); + histos.fill(HIST("hVertexZ"), collision.posZ()); + histos.fill(HIST("hMultiplicityPercent"), multiplicity); + + auto trackIndices1 = selectTrackIndicesWithQA(dTracks, cfgFirstDaughter, 0); + auto trackIndices2 = selectTrackIndicesWithQA(dTracks, cfgSecondDaughter, 1); + auto trackIndices3 = selectTrackIndicesWithQA(dTracks, cfgThirdDaughter, 2); + auto trackIndices4 = selectTrackIndicesWithQA(dTracks, cfgFourthDaughter, 3); + + // First resconstructed pair + auto selectedPairs1 = getSelectedTrackPairs(dTracks, trackIndices1, trackIndices2, mass1, mass2, 0); + auto selectedPairs2 = getSelectedTrackPairs(dTracks, trackIndices3, trackIndices4, mass3, mass4, 1); + + // Resonance loop of selectedPairs1 and selectedPairs2 + for (const auto& pair1 : selectedPairs1) { + const auto& i1 = pair1.first; + const auto& i2 = pair1.second; + for (const auto& pair2 : selectedPairs2) { + const auto& j1 = pair2.first; + const auto& j2 = pair2.second; + // Remove the same track + if (i1 == j1 || i1 == j2 || i2 == j1 || i2 == j2) { + continue; + } + auto t1 = dTracks.rawIteratorAt(i1); + auto t2 = dTracks.rawIteratorAt(i2); + auto t3 = dTracks.rawIteratorAt(j1); + auto t4 = dTracks.rawIteratorAt(j2); + + TLorentzVector lv1, lv2, lv3, lv4, lvPair1, lvPair2, lvTotal, lResonanceRot; + lv1.SetXYZM(t1.px(), t1.py(), t1.pz(), mass1); + lv2.SetXYZM(t2.px(), t2.py(), t2.pz(), mass2); + lv3.SetXYZM(t3.px(), t3.py(), t3.pz(), mass3); + lv4.SetXYZM(t4.px(), t4.py(), t4.pz(), mass4); + lvPair1 = lv1 + lv2; + lvPair2 = lv3 + lv4; + if (!isResoSelected(lvPair1, lvPair2)) + continue; + lvTotal = lv1 + lv2 + lv3 + lv4; + histos.fill(HIST("h2PairInvMass"), lvPair1.M(), lvPair2.M()); + histos.fill(HIST("hResoInvMass"), lvTotal.M()); + histos.fill(HIST("THnResoInvMass"), multiplicity, lvTotal.Pt(), lvTotal.M()); + if (BkgEstimationConfig.cfgFillRotBkg) { + for (int i = 0; i < BkgEstimationConfig.cfgNrotBkg; i++) { + auto lRotAngle = BkgEstimationConfig.cfgMinRot + i * ((BkgEstimationConfig.cfgMaxRot - BkgEstimationConfig.cfgMinRot) / (BkgEstimationConfig.cfgNrotBkg - 1)); + lvPair2.RotateZ(lRotAngle); + lResonanceRot = lvPair1 + lvPair2; + histos.fill(HIST("THnResoInvMassBkg"), multiplicity, lResonanceRot.Pt(), lResonanceRot.M()); + } + } + } + } + } + + void processDummy(aod::ResoCollision const& /*collisions*/) + { + } + PROCESS_SWITCH(DoubleResonanceScan, processDummy, "Process Dummy", true); + + void processResoTracks(aod::ResoCollision const& collision, aod::ResoTracks const& resotracks) + { + fillHistograms(collision, resotracks); + } + PROCESS_SWITCH(DoubleResonanceScan, processResoTracks, "Process ResoTracks", false); + + void processResoMicroTracks(aod::ResoCollision const& collision, aod::ResoMicroTracks const& resomicrotracks) + { + fillHistograms(collision, resomicrotracks); + } + PROCESS_SWITCH(DoubleResonanceScan, processResoMicroTracks, "Process ResoMicroTracks", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From 544133153bc74d20bfe3c8d29575b7a1ed854b7b Mon Sep 17 00:00:00 2001 From: Antonio Palasciano <52152842+apalasciano@users.noreply.github.com> Date: Mon, 31 Mar 2025 16:45:56 +0200 Subject: [PATCH 0876/1650] [PWGHF] Add MC reco to charm hadron QA (#10653) Co-authored-by: ALICE Action Bot --- PWGHF/Tasks/taskCharmHadImpactPar.cxx | 99 +++++++++++++++++++++------ 1 file changed, 77 insertions(+), 22 deletions(-) diff --git a/PWGHF/Tasks/taskCharmHadImpactPar.cxx b/PWGHF/Tasks/taskCharmHadImpactPar.cxx index 1fb4daf3f73..051fdd0b7a2 100644 --- a/PWGHF/Tasks/taskCharmHadImpactPar.cxx +++ b/PWGHF/Tasks/taskCharmHadImpactPar.cxx @@ -55,6 +55,7 @@ DECLARE_SOA_COLUMN(Pt, pt, float); //! Transverse DECLARE_SOA_COLUMN(Y, y, float); //! Rapidity of candidate DECLARE_SOA_COLUMN(Phi, phi, float); //! Azimuth angle of candidate DECLARE_SOA_COLUMN(ImpactParameterXY, impactParameterXY, float); //! Dca XY of candidate +DECLARE_SOA_COLUMN(ImpactParameterZ, impactParameterZ, float); //! Dca Z of candidate DECLARE_SOA_COLUMN(MlScoreBkg, mlScoreBkg, float); //! ML score for background class DECLARE_SOA_COLUMN(MlScorePrompt, mlScorePrompt, float); //! ML Prompt score for prompt class DECLARE_SOA_COLUMN(MlScoreNonPrompt, mlScoreNonPrompt, float); //! ML Non Prompt score for non prompt class @@ -67,6 +68,7 @@ DECLARE_SOA_COLUMN(PhiProng2, phiProng2, float); //! Phi of the DECLARE_SOA_COLUMN(EtaProng0, etaProng0, float); //! Eta of the 1st daughter DECLARE_SOA_COLUMN(EtaProng1, etaProng1, float); //! Eta of the 2nd daughter DECLARE_SOA_COLUMN(EtaProng2, etaProng2, float); //! Eta of the 3rd daughter (if present) +DECLARE_SOA_COLUMN(FlagMcMatchRec, flagMcMatchRec, int8_t); //! Flag for reconstruction level matching } // namespace hf_charm_cand_lite DECLARE_SOA_TABLE(HfCharmCandLites, "AOD", "HFCHARMCANDLITE", //! Table with some charm hadron properties @@ -84,6 +86,7 @@ DECLARE_SOA_TABLE(HfCharmCandLites, "AOD", "HFCHARMCANDLITE", //! Table with som hf_charm_cand_lite::Y, hf_charm_cand_lite::Phi, hf_charm_cand_lite::ImpactParameterXY, + hf_charm_cand_lite::ImpactParameterZ, hf_charm_cand_lite::MlScoreBkg, hf_charm_cand_lite::MlScorePrompt, hf_charm_cand_lite::MlScoreNonPrompt, @@ -95,7 +98,8 @@ DECLARE_SOA_TABLE(HfCharmCandLites, "AOD", "HFCHARMCANDLITE", //! Table with som hf_charm_cand_lite::PhiProng2, hf_charm_cand_lite::EtaProng0, hf_charm_cand_lite::EtaProng1, - hf_charm_cand_lite::EtaProng2); + hf_charm_cand_lite::EtaProng2, + hf_charm_cand_lite::FlagMcMatchRec); } // namespace o2::aod struct HfTaskCharmHadImpactPar { @@ -105,6 +109,7 @@ struct HfTaskCharmHadImpactPar { Configurable fillLightTreeCandidate{"fillLightTreeCandidate", 0, "Flag to store charm hadron features"}; Configurable centEstimator{"centEstimator", 0, "Centrality estimation (None: 0, FT0C: 2, FT0M: 3)"}; Configurable occEstimator{"occEstimator", 0, "Occupancy estimation (None: 0, ITS: 1, FT0C: 2)"}; + Configurable fillOnlySignal{"fillOnlySignal", false, "Flag to store only matched candidates"}; HfHelper hfHelper; @@ -112,8 +117,12 @@ struct HfTaskCharmHadImpactPar { using CollisionsCent = soa::Join; using CandDplusData = soa::Filtered>; using CandDplusDataWithMl = soa::Filtered>; + using CandDplusMC = soa::Filtered>; + using CandDplusMCWithMl = soa::Filtered>; using CandDzeroData = soa::Filtered>; using CandDzeroDataWithMl = soa::Filtered>; + using CandDzeroMc = soa::Filtered>; + using CandDzeroMcWithMl = soa::Filtered>; Filter filterDplusFlag = aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlag; Filter filterDzeroFlag = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlag || aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlag; @@ -131,26 +140,33 @@ struct HfTaskCharmHadImpactPar { void init(InitContext&) { - std::array doprocess{doprocessDplus, doprocessDplusWithMl, doprocessDzero, doprocessDzeroWithMl}; + std::array doprocess{doprocessDataDplus, doprocessDataDplusWithMl, doprocessMCDplus, doprocessMCDplusWithMl, doprocessDataDzero, doprocessDataDzeroWithMl, doprocessMCDzero, doprocessMCDzeroWithMl}; if ((std::accumulate(doprocess.begin(), doprocess.end(), 0)) != 1) { LOGP(fatal, "Only one process function should be enabled! Please check your configuration!"); } - if (doprocessDplus || doprocessDzero) { + if (doprocessDataDplus || doprocessDataDzero || doprocessMCDplus || doprocessMCDzero) { registry.add("hMassPtImpParPhiY", ";#it{M} (GeV/#it{c}^{2});#it{p}_{T} (GeV/#it{c});dca XY (#mum); phi; y;", HistType::kTHnSparseF, {axisMass, axisPt, axisImpPar, axisPhi, axisY}); - } else if (doprocessDplusWithMl || doprocessDzeroWithMl) { + } else if (doprocessDataDplusWithMl || doprocessDataDzeroWithMl || doprocessMCDplusWithMl || doprocessMCDzeroWithMl) { registry.add("hMassPtImpParPhiY", ";#it{M} (GeV/#it{c}^{2});#it{p}_{T} (GeV/#it{c});dca XY (#mum); phi; y; ML score 0;ML score 1; ML score 2;", HistType::kTHnSparseF, {axisMass, axisPt, axisImpPar, axisPhi, axisY, axisMlScore0, axisMlScore1, axisMlScore2}); } } // Fill THnSparses for the ML analysis /// \param candidate is a particle candidate - template + template void fillSparse(const CCands& candidate) { std::vector outputMl = {-999., -999., -999.}; float invMass{-1.f}; float yCand{-999.f}; if constexpr (channel == Channel::DplusToKPiPi) { // D+ -> Kpipi + if constexpr (doMc) { + if (fillOnlySignal) { + if (std::abs(candidate.flagMcMatchRec()) != 1 << aod::hf_cand_3prong::DecayType::DplusToPiKPi) { + return; + } + } + } invMass = hfHelper.invMassDplusToPiKPi(candidate); yCand = hfHelper.yDplus(candidate); if constexpr (withMl) { @@ -163,6 +179,13 @@ struct HfTaskCharmHadImpactPar { } } else if constexpr (channel == Channel::DzeroToKPi) { if (candidate.isSelD0()) { // D0 -> Kpi + if constexpr (doMc) { + if (fillOnlySignal) { + if (std::abs(candidate.flagMcMatchRec()) != 1 << aod::hf_cand_2prong::DecayType::D0ToPiK) { + return; + } + } + } invMass = hfHelper.invMassD0ToPiK(candidate); yCand = hfHelper.yD0(candidate); if constexpr (withMl) { @@ -192,7 +215,7 @@ struct HfTaskCharmHadImpactPar { // Fill the TTree with both event and candidate properties /// \param candidate is a particle candidate /// \param collision is the respective collision - template + template void fillTree(const CCands& candidate, const CollType& collision) { std::vector outputMl = {-999., -999., -999.}; @@ -241,6 +264,12 @@ struct HfTaskCharmHadImpactPar { occupancy = getOccupancyColl(collision, occEstimator); } + int8_t flagMcMatchRec = 0; + if constexpr (doMc) { + flagMcMatchRec = candidate.flagMcMatchRec(); + } + double impParZ = candidate.impactParameterXY() * (-1) * candidate.pz() / candidate.pt(); + hfCharmCandLite( // Event features collision.numContrib(), @@ -258,6 +287,7 @@ struct HfTaskCharmHadImpactPar { yCand, candidate.phi(), candidate.impactParameterXY(), + impParZ, outputMl[0], outputMl[1], outputMl[2], @@ -270,46 +300,71 @@ struct HfTaskCharmHadImpactPar { phiProngs[2], etaProngs[0], etaProngs[1], - etaProngs[2]); + etaProngs[2], + flagMcMatchRec); } /// \param candidates are reconstructed candidates - template + template void runAnalysis(const CCands& candidates, CollisionsCent const&) { for (auto const& candidate : candidates) { auto collision = candidate.template collision_as(); - fillSparse(candidate); + fillSparse(candidate); if (fillLightTreeCandidate) { - fillTree(candidate, collision); + fillTree(candidate, collision); } } } // process functions - void processDplus(CandDplusData const& candidates, CollisionsCent const& collisions) + void processDataDplus(CandDplusData const& candidates, CollisionsCent const& collisions) + { + runAnalysis(candidates, collisions); + } + PROCESS_SWITCH(HfTaskCharmHadImpactPar, processDataDplus, "Process Data D+ w/o ML", false); + + void processDataDplusWithMl(CandDplusDataWithMl const& candidates, CollisionsCent const& collisions) + { + runAnalysis(candidates, collisions); + } + PROCESS_SWITCH(HfTaskCharmHadImpactPar, processDataDplusWithMl, "Process Data D+ with ML", true); + + void processMCDplus(CandDplusMC const& candidates, CollisionsCent const& collisions) + { + runAnalysis(candidates, collisions); + } + PROCESS_SWITCH(HfTaskCharmHadImpactPar, processMCDplus, "Process MC D+ w/o ML", false); + + void processMCDplusWithMl(CandDplusMCWithMl const& candidates, CollisionsCent const& collisions) + { + runAnalysis(candidates, collisions); + } + PROCESS_SWITCH(HfTaskCharmHadImpactPar, processMCDplusWithMl, "Process MC D+ with ML", false); + + void processDataDzero(CandDzeroData const& candidates, CollisionsCent const& collisions) { - runAnalysis(candidates, collisions); + runAnalysis(candidates, collisions); } - PROCESS_SWITCH(HfTaskCharmHadImpactPar, processDplus, "Process D+ w/o ML", false); + PROCESS_SWITCH(HfTaskCharmHadImpactPar, processDataDzero, "Process Data D0 w/o ML", false); - void processDplusWithMl(CandDplusDataWithMl const& candidates, CollisionsCent const& collisions) + void processDataDzeroWithMl(CandDzeroDataWithMl const& candidates, CollisionsCent const& collisions) { - runAnalysis(candidates, collisions); + runAnalysis(candidates, collisions); } - PROCESS_SWITCH(HfTaskCharmHadImpactPar, processDplusWithMl, "Process D+ with ML", true); + PROCESS_SWITCH(HfTaskCharmHadImpactPar, processDataDzeroWithMl, "Process Data D0 with ML", false); - void processDzero(CandDzeroData const& candidates, CollisionsCent const& collisions) + void processMCDzero(CandDzeroMc const& candidates, CollisionsCent const& collisions) { - runAnalysis(candidates, collisions); + runAnalysis(candidates, collisions); } - PROCESS_SWITCH(HfTaskCharmHadImpactPar, processDzero, "Process D0 w/o ML", false); + PROCESS_SWITCH(HfTaskCharmHadImpactPar, processMCDzero, "Process MC D0 w/o ML", false); - void processDzeroWithMl(CandDzeroDataWithMl const& candidates, CollisionsCent const& collisions) + void processMCDzeroWithMl(CandDzeroMcWithMl const& candidates, CollisionsCent const& collisions) { - runAnalysis(candidates, collisions); + runAnalysis(candidates, collisions); } - PROCESS_SWITCH(HfTaskCharmHadImpactPar, processDzeroWithMl, "Process D0 with ML", false); + PROCESS_SWITCH(HfTaskCharmHadImpactPar, processMCDzeroWithMl, "Process MC D0 with ML", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 90835177d5a18585dafe4ce1a85208f705744b05 Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Mon, 31 Mar 2025 23:10:55 +0200 Subject: [PATCH 0877/1650] [PWGCF] JFlucEfficiencyTask - Add MC histo flag check for run2 (#10706) --- PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx b/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx index 583f156f157..c2afc558b5a 100644 --- a/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx +++ b/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx @@ -145,7 +145,7 @@ struct JFlucEfficiencyTask { colCuts.setApplyRun2INELgtZERO(EventCuts.cfgEvtRun2INELgtZERO); colCuts.printCuts(); - if (doprocessDerivedMC || doprocessMC) { + if (doprocessDerivedMC || doprocessMC || doprocessMCRun2) { registry.add("hPtGen", "Generated p_{T} (all);p_{T} (GeV/c);Centrality (%);Counts", o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); registry.add("hEtaGen", "Generated #eta (all);#eta;Centrality (%);Counts", From a7a6e02b007d58e3206b316cec202a61313c7516 Mon Sep 17 00:00:00 2001 From: Preet-Bhanjan Date: Mon, 31 Mar 2025 23:11:53 +0200 Subject: [PATCH 0878/1650] [PWGCF] TRandom memory leak fix and new weight bins (#10708) Co-authored-by: Preet Pati --- PWGCF/Flow/Tasks/resonancesGfwFlow.cxx | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx b/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx index 2c097b33af3..27db0d00551 100644 --- a/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx +++ b/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx @@ -304,17 +304,17 @@ struct ResonancesGfwFlow { histos.add("NUA/hPhiEtaVtxz_anlambda", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); histos.add("NUA/hPhiEtaVtxz_phi", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); - histos.add("NUA/hPhiPtCent_ref", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, {100, 0, 10}, {100, 0, 100}}}); - histos.add("NUA/hPhiPtCent_k0", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, {100, 0, 10}, {100, 0, 100}}}); - histos.add("NUA/hPhiPtCent_lambda", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, {100, 0, 10}, {100, 0, 100}}}); - histos.add("NUA/hPhiPtCent_anlambda", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, {100, 0, 10}, {100, 0, 100}}}); - histos.add("NUA/hPhiPtCent_phi", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, {100, 0, 10}, {100, 0, 100}}}); - - histos.add("NUA/hPhiEtaPt_ref", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {100, 0, 10}}}); - histos.add("NUA/hPhiEtaPt_k0", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {100, 0, 10}}}); - histos.add("NUA/hPhiEtaPt_lambda", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {100, 0, 10}}}); - histos.add("NUA/hPhiEtaPt_anlambda", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {100, 0, 10}}}); - histos.add("NUA/hPhiEtaPt_phi", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {100, 0, 10}}}); + histos.add("NUA/hPhiPtCent_ref", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, axisPt, {20, 0, 100}}}); + histos.add("NUA/hPhiPtCent_k0", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, axisPt, {20, 0, 100}}}); + histos.add("NUA/hPhiPtCent_lambda", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, axisPt, {20, 0, 100}}}); + histos.add("NUA/hPhiPtCent_anlambda", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, axisPt, {20, 0, 100}}}); + histos.add("NUA/hPhiPtCent_phi", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, axisPt, {20, 0, 100}}}); + + histos.add("NUA/hPhiEtaPt_ref", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, axisPt}}); + histos.add("NUA/hPhiEtaPt_k0", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, axisPt}}); + histos.add("NUA/hPhiEtaPt_lambda", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, axisPt}}); + histos.add("NUA/hPhiEtaPt_anlambda", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, axisPt}}); + histos.add("NUA/hPhiEtaPt_phi", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, axisPt}}); } if (cfgUseBootStrap) { @@ -1014,8 +1014,7 @@ struct ResonancesGfwFlow { // bootstraping if (cfgUseBootStrap) { - TRandom3* rand = new TRandom3(0); - double r = rand->Rndm(); + double r = fRndm->Rndm(); int bootId = static_cast(r * 10); fillProfileBoot(corrconfigs.at(0), phiC22Boot[bootId], cent); From 7891b7c4ad678ea0cfb7972f9738e5569a1a7eef Mon Sep 17 00:00:00 2001 From: Yash Patley <52608802+yashpatley@users.noreply.github.com> Date: Tue, 1 Apr 2025 02:54:28 +0530 Subject: [PATCH 0879/1650] [PWGCF] Update lambdaR2Correlation.cxx (#10713) --- .../Tasks/lambdaR2Correlation.cxx | 199 ++++++++---------- 1 file changed, 88 insertions(+), 111 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx index 83a83531628..2aef9ae53f9 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx @@ -28,7 +28,6 @@ #include "Common/Core/RecoDecay.h" #include "CCDB/BasicCCDBManager.h" #include "TPDGCode.h" -#include "TRandom.h" using namespace o2; using namespace o2::framework; @@ -158,7 +157,7 @@ enum TrackLabels { kPassTrueLambdaSel, kEffCorrPt, kEffCorrPtRap, - kEffCorrPtRapVz, + kEffCorrPtRapPhi, kNoEffCorr, kGenTotAccLambda, kGenLambdaNoDau, @@ -220,16 +219,18 @@ struct LambdaTableProducer { Configurable cIsGoodITSLayers{"cIsGoodITSLayers", false, "Good ITS Layers All"}; // Tracks - Configurable cTrackMinPt{"cTrackMinPt", 0.2, "p_{T} minimum"}; + Configurable cTrackMinPt{"cTrackMinPt", 0.16, "p_{T} minimum"}; Configurable cTrackMaxPt{"cTrackMaxPt", 999.0, "p_{T} minimum"}; Configurable cTrackEtaCut{"cTrackEtaCut", 0.8, "Pseudorapidity cut"}; - Configurable cMinTpcCrossedRows{"cMinTpcCrossedRows", 70, "min crossed rows"}; - Configurable cTpcNsigmaCut{"cTpcNsigmaCut", 2.0, "TPC NSigma Selection Cut"}; - Configurable cIsGlobalTrackWoDca{"cIsGlobalTrackWoDca", true, "Check for Global Track"}; + Configurable cMinTpcCrossedRows{"cMinTpcCrossedRows", 80, "TPC Min Crossed Rows"}; + Configurable cMinTpcCROverCls{"cMinTpcCROverCls", 0.8, "Tpc Min Crossed Rows Over Findable Clusters"}; + Configurable cMaxTpcSharedClusters{"cMaxTpcSharedClusters", 0.4, "Tpc Max Shared Clusters"}; + Configurable cMaxChi2Tpc{"cMaxChi2Tpc", 4, "Max Chi2 Tpc"}; + Configurable cTpcNsigmaCut{"cTpcNsigmaCut", 5.0, "TPC NSigma Selection Cut"}; // V0s - Configurable cMinDcaProtonToPV{"cMinDcaProtonToPV", 0.05, "Minimum Proton DCAr to PV"}; - Configurable cMinDcaPionToPV{"cMinDcaPionToPV", 0.05, "Minimum Pion DCAr to PV"}; + Configurable cMinDcaProtonToPV{"cMinDcaProtonToPV", 0.02, "Minimum Proton DCAr to PV"}; + Configurable cMinDcaPionToPV{"cMinDcaPionToPV", 0.06, "Minimum Pion DCAr to PV"}; Configurable cMinV0DcaDaughters{"cMinV0DcaDaughters", 0., "Minimum DCA between V0 daughters"}; Configurable cMaxV0DcaDaughters{"cMaxV0DcaDaughters", 1., "Maximum DCA between V0 daughters"}; Configurable cMinDcaV0ToPV{"cMinDcaV0ToPV", 0.0, "Minimum DCA V0 to PV"}; @@ -245,24 +246,24 @@ struct LambdaTableProducer { // V0s kinmatic acceptance Configurable cMinV0Pt{"cMinV0Pt", 0.8, "Minimum V0 pT"}; - Configurable cMaxV0Pt{"cMaxV0Pt", 2.8, "Minimum V0 pT"}; - Configurable cMaxV0Rap{"cMaxV0Rap", 0.6, "|rap| cut"}; + Configurable cMaxV0Pt{"cMaxV0Pt", 4.2, "Minimum V0 pT"}; + Configurable cMaxV0Rap{"cMaxV0Rap", 0.5, "|rap| cut"}; Configurable cDoEtaAnalysis{"cDoEtaAnalysis", false, "Do Eta Analysis"}; // V0s MC Configurable cHasMcFlag{"cHasMcFlag", true, "Has Mc Tag"}; - Configurable cSelectTrueLambda{"cSelectTrueLambda", false, "Select True Lambda"}; + Configurable cSelectTrueLambda{"cSelectTrueLambda", true, "Select True Lambda"}; Configurable cSelectPrimaryV0{"cSelectPrimaryV0", true, "Select Primary V0"}; - Configurable cRecPrimaryLambda{"cRecPrimaryLambda", false, "Primary Reconstructed Lambda"}; + Configurable cRecPrimaryLambda{"cRecPrimaryLambda", true, "Primary Reconstructed Lambda"}; Configurable cRecSecondaryLambda{"cRecSecondaryLambda", false, "Secondary Reconstructed Lambda"}; Configurable cGenPrimaryLambda{"cGenPrimaryLambda", true, "Primary Generated Lambda"}; Configurable cGenSecondaryLambda{"cGenSecondaryLambda", false, "Secondary Generated Lambda"}; Configurable cGenDecayChannel{"cGenDecayChannel", true, "Gen Level Decay Channel Flag"}; - Configurable cMcGenDauTrackKinCutFlag{"cMcGenDauTrackKinCutFlag", false, "Gen Level Daughter Track Kinematic Cut Flag"}; // Mc Matching Configurable cSelMcMatchValue{"cSelMcMatchValue", 0.4, "Mc Matching Percentage"}; - Configurable cDoMcMatching{"cDoMcMatching", true, "Do Mc Matching Flag"}; + Configurable cDoEventMcMatching{"cDoEventMcMatching", true, "Do Event Mc Matching Flag"}; + Configurable cDoTrackMcMatching{"cDoTrackMcMatching", false, "Do Track Mc Matching Flag"}; // Efficiency Correction Configurable cCorrectionFlag{"cCorrectionFlag", false, "Efficiency Correction Flag"}; @@ -283,8 +284,8 @@ struct LambdaTableProducer { std::vector> vCorrFactStrings = {{"hEffVsPtLambda", "hEffVsPtAntiLambda"}, {"hEffVsPtYLambda", "hEffVsPtYAntiLambda"}, {"hEffVsPtEtaLambda", "hEffVsPtEtaAntiLambda"}, - {"hEffVsPtYVzLambda", "hEffVsPtYVzAntiLambda"}, - {"hEffVsPtEtaVzLambda", "hEffVsPtEtaVzAntiLambda"}}; + {"hEffVsPtYPhiLambda", "hEffVsPtYPhiAntiLambda"}, + {"hEffVsPtEtaPhiLambda", "hEffVsPtEtaPhiAntiLambda"}}; // Initialize Global Variables float cent = 0.; @@ -298,7 +299,7 @@ struct LambdaTableProducer { // initialize axis specifications const AxisSpec axisCols(5, 0.5, 5.5, ""); const AxisSpec axisTrks(25, 0.5, 25.5, ""); - const AxisSpec axisCent(105, 0, 105, "FT0M (%)"); + const AxisSpec axisCent(100, 0, 100, "FT0M (%)"); const AxisSpec axisMult(10, 0, 10, "N_{#Lambda}"); const AxisSpec axisVz(220, -11, 11, "V_{z} (cm)"); const AxisSpec axisPID(8000, -4000, 4000, "PdgCode"); @@ -392,6 +393,7 @@ struct LambdaTableProducer { histos.add("McGen/h1f_collision_recgen", "# of Reco Collision Associated to One Mc Generator Collision", kTH1F, {axisMult}); histos.add("McGen/h1f_collisions_info", "# of collisions", kTH1F, {axisCols}); histos.add("McGen/h2f_collision_posZ", "V_{z}-distribution", kTH2F, {axisVz, axisVz}); + histos.add("McGen/h2f_collision_cent", "FT0M Centrality", kTH2F, {axisCent, axisCent}); histos.add("McGen/h1f_lambda_daughter_PDG", "PDG Daughters", kTH1F, {axisPID}); histos.add("McGen/h1f_antilambda_daughter_PDG", "PDG Daughters", kTH1F, {axisPID}); @@ -437,7 +439,7 @@ struct LambdaTableProducer { histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kAllSelPassed, "kAllSelPassed"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kEffCorrPt, "kEffCorrPt"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kEffCorrPtRap, "kEffCorrPtRap"); - histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kEffCorrPtRapVz, "kEffCorrPtRapVz"); + histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kEffCorrPtRapPhi, "kEffCorrPtRapPhi"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kNoEffCorr, "kNoEffCorr"); } @@ -464,8 +466,7 @@ struct LambdaTableProducer { } } - // Multiplicity Selection - if (cent <= cMinMult || cent >= cMaxMult) { + if (cent <= cMinMult || cent >= cMaxMult) { // select centrality return false; } @@ -522,9 +523,15 @@ struct LambdaTableProducer { return false; } - // Apply further tpcCluster and other selection (To be done...) + if (track.tpcCrossedRowsOverFindableCls() < cMinTpcCROverCls) { + return false; + } - if (cIsGlobalTrackWoDca && !track.isGlobalTrackWoDCA()) { + if (track.tpcNClsShared() > cMaxTpcSharedClusters) { + return false; + } + + if (track.tpcChi2NCl() > cMaxChi2Tpc) { return false; } @@ -757,11 +764,11 @@ struct LambdaTableProducer { // get information about secondary lambdas if (cRecSecondaryLambda) { auto lambdaMothers = mcpart.template mothers_as(); - if (std::abs(lambdaMothers[0].pdgCode()) == 3112 || std::abs(lambdaMothers[0].pdgCode()) == 3212 || std::abs(lambdaMothers[0].pdgCode()) == 3222) { + if (std::abs(lambdaMothers[0].pdgCode()) == kSigmaMinus || std::abs(lambdaMothers[0].pdgCode()) == kSigma0 || std::abs(lambdaMothers[0].pdgCode()) == kSigmaPlus) { histos.fill(HIST("Tracks/h2f_lambda_from_sigma"), mcpart.pdgCode(), mcpart.pt()); - } else if (std::abs(lambdaMothers[0].pdgCode()) == 3312 || std::abs(lambdaMothers[0].pdgCode()) == 3322) { + } else if (std::abs(lambdaMothers[0].pdgCode()) == kXiMinus || std::abs(lambdaMothers[0].pdgCode()) == kXi0) { histos.fill(HIST("Tracks/h2f_lambda_from_cascade"), mcpart.pdgCode(), mcpart.pt()); - } else if (std::abs(lambdaMothers[0].pdgCode()) == 3334) { + } else if (std::abs(lambdaMothers[0].pdgCode()) == kOmegaMinus) { histos.fill(HIST("Tracks/h2f_lambda_from_omega"), mcpart.pdgCode(), mcpart.pt()); } } @@ -772,7 +779,7 @@ struct LambdaTableProducer { template bool getMcMatch(T const& vrec, T const& vgen) { - float v = std::abs(1. - (vrec / vgen)); + float v = std::abs(1. - (vgen / vrec)); if (v >= cSelMcMatchValue) { return false; @@ -805,8 +812,8 @@ struct LambdaTableProducer { return true; } - template - float getCorrectionFactors(C const& col, V const& v0) + template + float getCorrectionFactors(V const& v0) { // Check for efficiency correction flag and Rec/Gen Data if (!cCorrectionFlag) { @@ -828,15 +835,15 @@ struct LambdaTableProducer { float retVal = 0.; float rap = (cDoEtaCorr) ? v0.eta() : v0.yLambda(); - if (std::string(obj->ClassName()) == "TH1F") { + if (hist->GetDimension() == 1) { histos.fill(HIST("Tracks/h1f_tracks_info"), kEffCorrPt); retVal = hist->GetBinContent(hist->FindBin(v0.pt())); - } else if (std::string(obj->ClassName()) == "TH2F") { + } else if (hist->GetDimension() == 2) { histos.fill(HIST("Tracks/h1f_tracks_info"), kEffCorrPtRap); retVal = hist->GetBinContent(hist->FindBin(v0.pt(), rap)); - } else if (std::string(obj->ClassName()) == "TH3F") { - histos.fill(HIST("Tracks/h1f_tracks_info"), kEffCorrPtRapVz); - retVal = hist->GetBinContent(hist->FindBin(v0.pt(), rap, col.posZ())); + } else if (hist->GetDimension() == 3) { + histos.fill(HIST("Tracks/h1f_tracks_info"), kEffCorrPtRapPhi); + retVal = hist->GetBinContent(hist->FindBin(v0.pt(), rap, v0.phi())); } else { histos.fill(HIST("Tracks/h1f_tracks_info"), kNoEffCorr); LOGF(warning, "CCDB OBJECT IS NOT A HISTOGRAM !!!"); @@ -974,7 +981,7 @@ struct LambdaTableProducer { if (cSelectTrueLambda && !selTrueMcRecLambda(v0, tracks)) { // check for true Lambda/Anti-Lambda continue; } - if (cDoMcMatching && !passMcMatching(v0)) { // Do Mc Matching + if (cDoTrackMcMatching && !passMcMatching(v0)) { // Do Mc Matching continue; } // Fill MC Matching Histos (MC Matching Cuts to be implemented soon...) @@ -990,7 +997,7 @@ struct LambdaTableProducer { histos.fill(HIST("Tracks/h2f_armpod_after_sel"), v0.alpha(), v0.qtarm()); // get correction factors and mass - corr_fact = (v0Type == kLambda) ? getCorrectionFactors(collision, v0) : getCorrectionFactors(collision, v0); + corr_fact = (v0Type == kLambda) ? getCorrectionFactors(v0) : getCorrectionFactors(v0); mass = (v0Type == kLambda) ? v0.mLambda() : v0.mAntiLambda(); // fill lambda qa @@ -1061,13 +1068,8 @@ struct LambdaTableProducer { } auto dautracks = mcpart.template daughters_as(); std::vector daughterPDGs, daughterIDs; - bool dauKinCutFlag = true; std::vector vDauPt, vDauEta, vDauRap, vDauPhi; for (auto const& dautrack : dautracks) { - // check kinematic selection on daughters as well - if (!kinCutSelection(dautrack.pt(), std::abs(dautrack.eta()), cTrackMinPt, cTrackMaxPt, cTrackEtaCut)) { - dauKinCutFlag = false; - } daughterPDGs.push_back(dautrack.pdgCode()); daughterIDs.push_back(dautrack.globalIndex()); vDauPt.push_back(dautrack.pt()); @@ -1075,9 +1077,6 @@ struct LambdaTableProducer { vDauRap.push_back(dautrack.y()); vDauPhi.push_back(dautrack.phi()); } - if (cMcGenDauTrackKinCutFlag && !dauKinCutFlag) { // check daughter acceptance - continue; - } if (cGenDecayChannel) { // check decay channel if (v0Type == kLambda) { if (daughterPDGs[0] != kProton || daughterPDGs[1] != kPiMinus) { @@ -1130,7 +1129,7 @@ struct LambdaTableProducer { template void analyzeMcRecoGen(M const& mcCollision, C const& collisions, V const& V0s, T const& tracks, P const& mcParticles) { - // Number of Rec Collisions Associated to One Mc Gen Collision + // Number of Rec Collisions Associated to the McGen Collision int nRecCols = collisions.size(); if (nRecCols != 0) { histos.fill(HIST("McGen/h1f_collision_recgen"), nRecCols); @@ -1144,12 +1143,16 @@ struct LambdaTableProducer { if (!collisions.begin().has_mcCollision() || !selCollision(collisions.begin()) || collisions.begin().mcCollisionId() != mcCollision.globalIndex()) { return; } - // Mc Matching - if (cDoMcMatching && !getMcMatch(collisions.begin().posZ(), mcCollision.posZ())) { - return; + // MC Matching + if (cDoEventMcMatching) { + // Vz Matching + if (!getMcMatch(collisions.begin().posZ(), mcCollision.posZ())) { + return; + } } histos.fill(HIST("McGen/h1f_collisions_info"), kPassSelCol); histos.fill(HIST("McGen/h2f_collision_posZ"), mcCollision.posZ(), collisions.begin().posZ()); + histos.fill(HIST("McGen/h2f_collision_cent"), mcCollision.centFT0M(), cent); auto v0Tracks = V0s.sliceBy(perCollision, collisions.begin().globalIndex()); fillLambdaRecoTables(collisions.begin(), v0Tracks, tracks); fillLambdaMcGenTables(mcCollision, mcParticles); @@ -1371,10 +1374,6 @@ struct LambdaR2Correlation { Configurable cGenParticleFlag{"cGenParticleFlag", true, "Generator Number Flag"}; Configurable cGenParticles{"cGenParticles", 3, "Number of Truth Lambda to construct correlation"}; - // Rotation Angle Min/Max - Configurable cRotAngleMin{"cRotAngleMin", -0.12, "Rotation Angle Minimum"}; - Configurable cRotAngleMax{"cRotAngleMax", 0.12, "Rotation Angle Minimum"}; - // Histogram Registry. HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -1388,7 +1387,6 @@ struct LambdaR2Correlation { float rapbinwidth = 0.; float phibinwidth = 0.; float q = 0., e = 0., qinv = 0.; - TRandom* ran = new TRandom(); void init(InitContext const&) { @@ -1413,15 +1411,14 @@ struct LambdaR2Correlation { const AxisSpec axisPt(cNPtBins, cMinPt, cMaxPt, "p_{T} (GeV/#it{c})"); const AxisSpec axisEta(cNRapBins, cMinRap, cMaxRap, "#eta"); const AxisSpec axisRap(cNRapBins, cMinRap, cMaxRap, "y"); - const AxisSpec axisPhi(cNPhiBins, 0., TwoPI, "#phi (rad)"); - const AxisSpec axisRapPhi(knrapphibins, kminrapphi, kmaxrapphi, "y #phi"); + const AxisSpec axisPhi(cNPhiBins, 0., TwoPI, "#varphi (rad)"); + const AxisSpec axisRapPhi(knrapphibins, kminrapphi, kmaxrapphi, "y #varphi"); const AxisSpec axisQinv(100, 0, 10, "q_{inv} (GeV/#it{c})"); const AxisSpec axisEfPt(cNPtBins, cMinPt, cMaxPt, "p_{T}"); const AxisSpec axisEfEta(cNRapBins, cMinRap, cMaxRap, "#eta"); const AxisSpec axisEfRap(cNRapBins, cMinRap, cMaxRap, "y"); - const AxisSpec axisEfPosZ(10, -10., 10., "V_{Z}"); - const AxisSpec axisEfCent(10, 0, 100, "FT0M(%)"); + const AxisSpec axisEfPhi(cNPhiBins, 0., TwoPI, "#varphi"); // Create Histograms. // Event @@ -1434,14 +1431,10 @@ struct LambdaR2Correlation { // Single Particle Efficiencies histos.add("Reco/Efficiency/h1f_n1_pt_LaP", "#rho_{1}^{#Lambda}", kTH1F, {axisEfPt}); histos.add("Reco/Efficiency/h1f_n1_pt_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH1F, {axisEfPt}); - histos.add("Reco/Efficiency/h2f_n1_pteta_LaP", "#rho_{1}^{#Lambda}", kTH2F, {axisEfPt, axisEfEta}); - histos.add("Reco/Efficiency/h2f_n1_pteta_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH2F, {axisEfPt, axisEfEta}); - histos.add("Reco/Efficiency/h2f_n1_ptrap_LaP", "#rho_{1}^{#Lambda}", kTH2F, {axisEfPt, axisEfRap}); - histos.add("Reco/Efficiency/h2f_n1_ptrap_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH2F, {axisEfPt, axisEfRap}); - histos.add("Reco/Efficiency/h4f_n1_ptetavzmult_LaP", "#rho_{1}^{#Lambda}", kTHnSparseF, {axisEfPt, axisEfEta, axisEfPosZ, axisEfCent}); - histos.add("Reco/Efficiency/h4f_n1_ptetavzmult_LaM", "#rho_{1}^{#bar{#Lambda}}", kTHnSparseF, {axisEfPt, axisEfEta, axisEfPosZ, axisEfCent}); - histos.add("Reco/Efficiency/h4f_n1_ptrapvzmult_LaP", "#rho_{1}^{#Lambda}", kTHnSparseF, {axisEfPt, axisEfRap, axisEfPosZ, axisEfCent}); - histos.add("Reco/Efficiency/h4f_n1_ptrapvzmult_LaM", "#rho_{1}^{#bar{#Lambda}}", kTHnSparseF, {axisEfPt, axisEfRap, axisEfPosZ, axisEfCent}); + histos.add("Reco/Efficiency/h3f_n1_ptetaphi_LaP", "#rho_{1}^{#Lambda}", kTH3F, {axisEfPt, axisEfEta, axisEfPhi}); + histos.add("Reco/Efficiency/h3f_n1_ptetaphi_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH3F, {axisEfPt, axisEfEta, axisEfPhi}); + histos.add("Reco/Efficiency/h3f_n1_ptrapphi_LaP", "#rho_{1}^{#Lambda}", kTH3F, {axisEfPt, axisEfRap, axisEfPhi}); + histos.add("Reco/Efficiency/h3f_n1_ptrapphi_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH3F, {axisEfPt, axisEfRap, axisEfPhi}); // Single and Two Particle Densities // 1D Histograms @@ -1460,11 +1453,21 @@ struct LambdaR2Correlation { histos.add("Reco/h2d_n1_rapphi_LaP", "#rho_{1}^{#Lambda}", kTH2D, {axisRap, axisPhi}); histos.add("Reco/h2d_n1_rapphi_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH2D, {axisRap, axisPhi}); - // rho2 for R2 Rap1Phi1Rap2Phi2 histograms + // rho2 for numerator of R2 + histos.add("Reco/h2d_n2_ptpt_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisPt, axisPt}); + histos.add("Reco/h2d_n2_ptpt_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisPt, axisPt}); + histos.add("Reco/h2d_n2_ptpt_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisPt, axisPt}); + histos.add("Reco/h2d_n2_etaeta_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisEta, axisEta}); + histos.add("Reco/h2d_n2_etaeta_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisEta, axisEta}); + histos.add("Reco/h2d_n2_etaeta_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisEta, axisEta}); histos.add("Reco/h2d_n2_raprap_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisRap, axisRap}); histos.add("Reco/h2d_n2_raprap_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisRap, axisRap}); histos.add("Reco/h2d_n2_raprap_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisRap, axisRap}); + histos.add("Reco/h2d_n2_phiphi_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisPhi, axisPhi}); + histos.add("Reco/h2d_n2_phiphi_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisPhi, axisPhi}); + histos.add("Reco/h2d_n2_phiphi_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisPhi, axisPhi}); + // rho2 for R2 Rap1Phi1Rap2Phi2 histograms histos.add("Reco/h2d_n2_rapphi_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisRapPhi, axisRapPhi}); histos.add("Reco/h2d_n2_rapphi_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisRapPhi, axisRapPhi}); histos.add("Reco/h2d_n2_rapphi_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisRapPhi, axisRapPhi}); @@ -1473,9 +1476,6 @@ struct LambdaR2Correlation { histos.add("Reco/h1d_n2_qinv_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH1D, {axisQinv}); histos.add("Reco/h1d_n2_qinv_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH1D, {axisQinv}); histos.add("Reco/h1d_n2_qinv_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH1D, {axisQinv}); - histos.add("Reco/h1d_n1n1_qinv_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH1D, {axisQinv}); - histos.add("Reco/h1d_n1n1_qinv_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH1D, {axisQinv}); - histos.add("Reco/h1d_n1n1_qinv_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH1D, {axisQinv}); // MCGen if (doprocessMCGen) { @@ -1501,6 +1501,12 @@ struct LambdaR2Correlation { float corfac = p1.corrFact() * p2.corrFact(); + // fill rho2 histograms + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n2_ptpt_") + HIST(SubDirHist[part_pair]), p1.pt(), p2.pt(), corfac); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n2_etaeta_") + HIST(SubDirHist[part_pair]), p1.eta(), p2.eta(), corfac); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n2_raprap_") + HIST(SubDirHist[part_pair]), p1.rap(), p2.rap(), corfac); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n2_phiphi_") + HIST(SubDirHist[part_pair]), p1.phi(), p2.phi(), corfac); + if (rapbin1 >= 0 && rapbin2 >= 0 && phibin1 >= 0 && phibin2 >= 0 && rapbin1 < nrapbins && rapbin2 < nrapbins && phibin1 < nphibins && phibin2 < nphibins) { int rapphix = rapbin1 * nphibins + phibin1; @@ -1514,19 +1520,10 @@ struct LambdaR2Correlation { e = RecoDecay::e(p1.px(), p1.py(), p1.pz(), MassLambda0) - RecoDecay::e(p2.px(), p2.py(), p2.pz(), MassLambda0); qinv = std::sqrt(-RecoDecay::m2(q, e)); histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h1d_n2_qinv_") + HIST(SubDirHist[part_pair]), qinv, corfac); - - // Rotate momentum vector about z-axis to get N1N1_Qinv Histograms - float ranPhi = ran->Uniform(cRotAngleMin, cRotAngleMax); - float p2x = p2.pt() * std::cos(RecoDecay::constrainAngle((p2.phi() + ranPhi), 0)); - float p2y = p2.pt() * std::sin(RecoDecay::constrainAngle((p2.phi() + ranPhi), 0)); - q = RecoDecay::p((p1.px() - p2x), (p1.py() - p2y), (p1.pz() - p2.pz())); - e = RecoDecay::e(p1.px(), p1.py(), p1.pz(), MassLambda0) - RecoDecay::e(p2x, p2y, p2.pz(), MassLambda0); - qinv = std::sqrt(-RecoDecay::m2(q, e)); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h1d_n1n1_qinv_") + HIST(SubDirHist[part_pair]), qinv, corfac); } - template - void analyzeSingles(C const& col, T const& tracks) + template + void analyzeSingles(T const& tracks) { static constexpr std::string_view SubDirRecGen[] = {"Reco/", "McGen/"}; static constexpr std::string_view SubDirHist[] = {"LaP", "LaM"}; @@ -1537,6 +1534,11 @@ struct LambdaR2Correlation { // count tracks ++ntrk; + // Efficiency Plots + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("Efficiency/h1f_n1_pt_") + HIST(SubDirHist[part]), track.pt()); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("Efficiency/h3f_n1_ptetaphi_") + HIST(SubDirHist[part]), track.pt(), track.eta(), track.phi()); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("Efficiency/h3f_n1_ptrapphi_") + HIST(SubDirHist[part]), track.pt(), track.rap(), track.phi()); + // QA Plots histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h1d_n1_mass_") + HIST(SubDirHist[part]), track.mass()); histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h1d_n1_pt_") + HIST(SubDirHist[part]), track.pt(), track.corrFact()); @@ -1544,13 +1546,6 @@ struct LambdaR2Correlation { histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h1d_n1_phi_") + HIST(SubDirHist[part]), track.phi(), track.corrFact()); histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h1d_n1_rap_") + HIST(SubDirHist[part]), track.rap(), track.corrFact()); - // Efficiency Plots - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("Efficiency/h1f_n1_pt_") + HIST(SubDirHist[part]), track.pt()); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("Efficiency/h2f_n1_pteta_") + HIST(SubDirHist[part]), track.pt(), track.eta()); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("Efficiency/h2f_n1_ptrap_") + HIST(SubDirHist[part]), track.pt(), track.rap()); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("Efficiency/h4f_n1_ptetavzmult_") + HIST(SubDirHist[part]), track.pt(), track.eta(), col.posZ(), col.cent()); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("Efficiency/h4f_n1_ptrapvzmult_") + HIST(SubDirHist[part]), track.pt(), track.rap(), col.posZ(), col.cent()); - // Rho1 for N1RapPhi histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n1_rapphi_") + HIST(SubDirHist[part]), track.rap(), track.phi(), track.corrFact()); } @@ -1594,8 +1589,8 @@ struct LambdaR2Correlation { auto lambdaTracks = partLambdaTracks->sliceByCached(aod::lambdatrack::lambdaCollisionId, collision.globalIndex(), cache); auto antiLambdaTracks = partAntiLambdaTracks->sliceByCached(aod::lambdatrack::lambdaCollisionId, collision.globalIndex(), cache); - analyzeSingles(collision, lambdaTracks); - analyzeSingles(collision, antiLambdaTracks); + analyzeSingles(lambdaTracks); + analyzeSingles(antiLambdaTracks); analyzePairs(lambdaTracks, antiLambdaTracks); analyzePairs(lambdaTracks, lambdaTracks); analyzePairs(antiLambdaTracks, antiLambdaTracks); @@ -1618,30 +1613,12 @@ struct LambdaR2Correlation { auto lambdaMcGenTracks = partLambdaMcGenTracks->sliceByCached(aod::lambdamcgentrack::lambdaMcGenCollisionId, mcgencol.globalIndex(), cachemc); auto antiLambdaMcGenTracks = partAntiLambdaMcGenTracks->sliceByCached(aod::lambdamcgentrack::lambdaMcGenCollisionId, mcgencol.globalIndex(), cachemc); - bool lambdaFlag = true, antiLambdaFlag = true; + analyzeSingles(lambdaMcGenTracks); + analyzeSingles(antiLambdaMcGenTracks); - if (cGenParticleFlag) { - if (lambdaMcGenTracks.size() > cGenParticles) { - lambdaFlag = false; - } - if (antiLambdaMcGenTracks.size() > cGenParticles) { - antiLambdaFlag = false; - } - } - - if (lambdaFlag) { - analyzeSingles(mcgencol, lambdaMcGenTracks); - analyzePairs(lambdaMcGenTracks, lambdaMcGenTracks); - } - - if (antiLambdaFlag) { - analyzeSingles(mcgencol, antiLambdaMcGenTracks); - analyzePairs(antiLambdaMcGenTracks, antiLambdaMcGenTracks); - } - - if (lambdaFlag && antiLambdaFlag) { - analyzePairs(lambdaMcGenTracks, antiLambdaMcGenTracks); - } + analyzePairs(lambdaMcGenTracks, antiLambdaMcGenTracks); + analyzePairs(lambdaMcGenTracks, lambdaMcGenTracks); + analyzePairs(antiLambdaMcGenTracks, antiLambdaMcGenTracks); } PROCESS_SWITCH(LambdaR2Correlation, processMCGen, "Process for MC Generated", false); From 5d141fd7a585bd6663f68f7527341b5f585aebe6 Mon Sep 17 00:00:00 2001 From: Mingrui Zhao Date: Tue, 1 Apr 2025 12:33:22 +0800 Subject: [PATCH 0880/1650] [PWGUD] Add task for flow with dihadron correlation in UPC study (#10711) --- PWGUD/Tasks/CMakeLists.txt | 5 +- PWGUD/Tasks/flowCorrelationsUpc.cxx | 271 ++++++++++++++++++++++++++++ 2 files changed, 275 insertions(+), 1 deletion(-) create mode 100644 PWGUD/Tasks/flowCorrelationsUpc.cxx diff --git a/PWGUD/Tasks/CMakeLists.txt b/PWGUD/Tasks/CMakeLists.txt index 919787c8256..2f78f0629b4 100644 --- a/PWGUD/Tasks/CMakeLists.txt +++ b/PWGUD/Tasks/CMakeLists.txt @@ -244,4 +244,7 @@ o2physics_add_dpl_workflow(flow-cumulants-upc PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::AnalysisCCDB O2Physics::GFWCore COMPONENT_NAME Analysis) - +o2physics_add_dpl_workflow(flow-correlations-upc + SOURCES flowCorrelationsUpc.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::AnalysisCCDB O2Physics::PWGCFCore + COMPONENT_NAME Analysis) diff --git a/PWGUD/Tasks/flowCorrelationsUpc.cxx b/PWGUD/Tasks/flowCorrelationsUpc.cxx new file mode 100644 index 00000000000..aeb3ed95b4a --- /dev/null +++ b/PWGUD/Tasks/flowCorrelationsUpc.cxx @@ -0,0 +1,271 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file flowCorrelationsUpc.cxx +/// \brief Provides a sparse with usefull two particle correlation info +/// \author Mingrui Zhao (mingrui.zhao@cern.ch, mingrui.zhao@mail.labz0.org) +/// copied from Thor Jensen (thor.kjaersgaard.jensen@cern.ch) and Debojit Sarkar (debojit.sarkar@cern.ch) + +#include + +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/ASoA.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/RunningWorkflowInfo.h" +#include "CommonConstants/MathConstants.h" +#include "CCDB/BasicCCDBManager.h" +#include "Common/Core/RecoDecay.h" + +#include "PWGUD/DataModel/UDTables.h" +#include "PWGUD/Core/SGSelector.h" + +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/Multiplicity.h" +#include "PWGCF/DataModel/CorrelationsDerived.h" +#include "PWGCF/Core/CorrelationContainer.h" +#include "PWGCF/Core/PairCuts.h" + +namespace o2::aod +{ +namespace flowcorrupc +{ +DECLARE_SOA_COLUMN(Multiplicity, multiplicity, int); +} +DECLARE_SOA_TABLE(Multiplicity, "AOD", "MULTIPLICITY", + flowcorrupc::Multiplicity); + +} // namespace o2::aod + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +// define the filtered collisions and tracks +#define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable NAME{#NAME, DEFAULT, HELP}; + +struct CalcNchUpc { + O2_DEFINE_CONFIGURABLE(cfgZVtxCut, float, 10.0f, "Accepted z-vertex range") + O2_DEFINE_CONFIGURABLE(cfgPtCutMin, float, 0.2f, "minimum accepted track pT") + O2_DEFINE_CONFIGURABLE(cfgPtCutMax, float, 10.0f, "maximum accepted track pT") + O2_DEFINE_CONFIGURABLE(cfgEtaCut, float, 0.8f, "Eta cut") + O2_DEFINE_CONFIGURABLE(cfgMinMixEventNum, int, 5, "Minimum number of events to mix") + + // Filter trackFilter = (nabs(aod::track::eta) < cfgEtaCut) && (aod::track::pt > cfgPtCutMin) && (aod::track::pt < cfgPtCutMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)); + + using UdTracks = soa::Join; + using UdTracksFull = soa::Join; + using UDCollisionsFull = soa::Join; + + Produces multiplicityNch; + + HistogramRegistry registry{"registry"}; + + void init(InitContext&) + { + AxisSpec axisNch = {100, 0, 100}; + AxisSpec axisVrtx = {10, -10, 10}; + + registry.add("Ncharge", "N_{charge}", {HistType::kTH1D, {axisNch}}); + registry.add("zVtx_all", "zVtx_all", {HistType::kTH1D, {axisVrtx}}); + } + + void process(UDCollisionsFull::iterator const& collision, UdTracksFull const& tracks) + { + multiplicityNch(tracks.size()); + registry.fill(HIST("Ncharge"), tracks.size()); + registry.fill(HIST("zVtx_all"), collision.posZ()); + } +}; + +struct FlowCorrelationsUpc { + O2_DEFINE_CONFIGURABLE(cfgZVtxCut, float, 10.0f, "Accepted z-vertex range") + O2_DEFINE_CONFIGURABLE(cfgPtCutMin, float, 0.2f, "minimum accepted track pT") + O2_DEFINE_CONFIGURABLE(cfgPtCutMax, float, 10.0f, "maximum accepted track pT") + O2_DEFINE_CONFIGURABLE(cfgEtaCut, float, 0.8f, "Eta cut") + O2_DEFINE_CONFIGURABLE(cfgMinMixEventNum, int, 5, "Minimum number of events to mix") + O2_DEFINE_CONFIGURABLE(cfgMinMult, int, 0, "Minimum multiplicity for collision") + O2_DEFINE_CONFIGURABLE(cfgMaxMult, int, 10, "Maximum multiplicity for collision") + + ConfigurableAxis axisVertex{"axisVertex", {10, -10, 10}, "vertex axis for histograms"}; + ConfigurableAxis axisEta{"axisEta", {40, -1., 1.}, "eta axis for histograms"}; + ConfigurableAxis axisPhi{"axisPhi", {72, 0.0, constants::math::TwoPI}, "phi axis for histograms"}; + ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt axis for histograms"}; + ConfigurableAxis axisDeltaPhi{"axisDeltaPhi", {72, -PIHalf, PIHalf * 3}, "delta phi axis for histograms"}; + ConfigurableAxis axisDeltaEta{"axisDeltaEta", {40, -2, 2}, "delta eta axis for histograms"}; + ConfigurableAxis axisPtTrigger{"axisPtTrigger", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt trigger axis for histograms"}; + ConfigurableAxis axisPtAssoc{"axisPtAssoc", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt associated axis for histograms"}; + ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100}, "multiplicity / centrality axis for histograms"}; + ConfigurableAxis vtxMix{"vtxMix", {VARIABLE_WIDTH, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "vertex axis for mixed event histograms"}; + ConfigurableAxis multMix{"multMix", {VARIABLE_WIDTH, 0, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100}, "multiplicity / centrality axis for mixed event histograms"}; + + ConfigurableAxis axisVertexEfficiency{"axisVertexEfficiency", {10, -10, 10}, "vertex axis for efficiency histograms"}; + ConfigurableAxis axisEtaEfficiency{"axisEtaEfficiency", {20, -1.0, 1.0}, "eta axis for efficiency histograms"}; + ConfigurableAxis axisPtEfficiency{"axisPtEfficiency", {VARIABLE_WIDTH, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0}, "pt axis for efficiency histograms"}; + + // Added UPC Cuts + SGSelector sgSelector; + Configurable cfgCutFV0{"cfgCutFV0", 50., "FV0A threshold"}; + Configurable cfgCutFT0A{"cfgCutFT0A", 150., "FT0A threshold"}; + Configurable cfgCutFT0C{"cfgCutFT0C", 50., "FT0C threshold"}; + Configurable cfgCutZDC{"cfgCutZDC", 10., "ZDC threshold"}; + Configurable cfgGapSideSelection{"cfgGapSideSelection", 2, "gap selection"}; + + // make the filters and cuts. + // Filter collisionFilter = (nabs(aod::collision::posZ) < cfgZVtxCut) && (aod::flowcorrupc::multiplicity) > cfgMinMult && (aod::flowcorrupc::multiplicity) < cfgMaxMult && (aod::evsel::sel8) == true; + // Filter trackFilter = (nabs(aod::track::eta) < cfgEtaCut) && (aod::track::pt > cfgPtCutMin) && (aod::track::pt < cfgPtCutMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)); + + using UdTracks = soa::Join; + using UdTracksFull = soa::Join; + using UDCollisionsFull = soa::Join; + + // Define the outputs + OutputObj same{Form("sameEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult))}; + OutputObj mixed{Form("mixedEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult))}; + + HistogramRegistry registry{"registry"}; + + void init(InitContext&) + { + LOGF(info, "Starting init"); + // Make histograms to check the distributions after cuts + registry.add("deltaEta_deltaPhi_same", "", {HistType::kTH2D, {axisDeltaPhi, axisDeltaEta}}); // check to see the delta eta and delta phi distribution + registry.add("deltaEta_deltaPhi_mixed", "", {HistType::kTH2D, {axisDeltaPhi, axisDeltaEta}}); + registry.add("Phi", "Phi", {HistType::kTH1D, {axisPhi}}); + registry.add("Eta", "Eta", {HistType::kTH1D, {axisEta}}); + registry.add("pT", "pT", {HistType::kTH1D, {axisPtTrigger}}); + registry.add("Nch", "N_{ch}", {HistType::kTH1D, {axisMultiplicity}}); + registry.add("zVtx", "zVtx", {HistType::kTH1D, {axisVertex}}); + + registry.add("Trig_hist", "", {HistType::kTHnSparseF, {{axisMultiplicity, axisVertex, axisPtTrigger}}}); + + registry.add("eventcount", "bin", {HistType::kTH1F, {{3, 0, 3, "bin"}}}); // histogram to see how many events are in the same and mixed event + + std::vector corrAxis = {{axisMultiplicity, "Nch"}, + {axisVertex, "z-vtx (cm)"}, + {axisPtTrigger, "p_{T} (GeV/c)"}, + {axisPtAssoc, "p_{T} (GeV/c)"}, + {axisDeltaPhi, "#Delta#varphi (rad)"}, + {axisDeltaEta, "#Delta#eta"}}; + std::vector effAxis = { + {axisVertexEfficiency, "z-vtx (cm)"}, + {axisPtEfficiency, "p_{T} (GeV/c)"}, + {axisEtaEfficiency, "#eta"}, + }; + std::vector userAxis; + + same.setObject(new CorrelationContainer(Form("sameEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult)), Form("sameEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult)), corrAxis, effAxis, userAxis)); + mixed.setObject(new CorrelationContainer(Form("mixedEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult)), Form("mixedEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult)), corrAxis, effAxis, userAxis)); + } + enum EventType { + SameEvent = 1, + MixedEvent = 3 + }; + + // fill multiple histograms + template + void fillYield(TCollision collision, TTracks tracks) // function to fill the yield and etaphi histograms. + { + registry.fill(HIST("Nch"), tracks.size()); + registry.fill(HIST("zVtx"), collision.posZ()); + + for (auto const& track1 : tracks) { + auto momentum1 = std::array{track1.px(), track1.py(), track1.pz()}; + registry.fill(HIST("Phi"), RecoDecay::phi(momentum1)); + registry.fill(HIST("Eta"), RecoDecay::eta(momentum1)); + registry.fill(HIST("pT"), track1.pt()); + } + } + + template + void fillCorrelations(TTracks tracks1, TTracks tracks2, float posZ, int system, float Nch) // function to fill the Output functions (sparse) and the delta eta and delta phi histograms + { + // loop over all tracks + for (auto const& track1 : tracks1) { + + if (system == SameEvent) { + registry.fill(HIST("Trig_hist"), Nch, posZ, track1.pt()); + } + + for (auto const& track2 : tracks2) { + + if (track1.pt() <= track2.pt()) + continue; // skip if the trigger pt is less than the associate p + + auto momentum1 = std::array{track1.px(), track1.py(), track1.pz()}; + auto momentum2 = std::array{track2.px(), track2.py(), track2.pz()}; + double phi1 = RecoDecay::phi(momentum1); + double phi2 = RecoDecay::phi(momentum2); + float deltaPhi = RecoDecay::constrainAngle(phi1 - phi2, -PIHalf); + float deltaEta = RecoDecay::eta(momentum1) - RecoDecay::eta(momentum2); + + // fill the right sparse and histograms + if (system == SameEvent) { + same->getPairHist()->Fill(step, Nch, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta); + registry.fill(HIST("deltaEta_deltaPhi_same"), deltaPhi, deltaEta); + } else if (system == MixedEvent) { + mixed->getPairHist()->Fill(step, Nch, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta); + registry.fill(HIST("deltaEta_deltaPhi_mixed"), deltaPhi, deltaEta); + } + } + } + } + + void processSame(UDCollisionsFull::iterator const& collision, UdTracksFull const& tracks) + { + int gapSide = collision.gapSide(); + if (gapSide < 0 || gapSide > 2) { + return; + } + + int trueGapSide = sgSelector.trueGap(collision, cfgCutFV0, cfgCutFT0A, cfgCutFT0C, cfgCutZDC); + gapSide = trueGapSide; + if (gapSide == 2) { + return; + } + + registry.fill(HIST("eventcount"), SameEvent); // because its same event i put it in the 1 bin + fillYield(collision, tracks); + fillCorrelations(tracks, tracks, collision.posZ(), SameEvent, tracks.size()); // fill the SE histogram and Sparse + } + PROCESS_SWITCH(FlowCorrelationsUpc, processSame, "Process same event", true); + + // event mixing + + SliceCache cache; + using MixedBinning = ColumnBinningPolicy; + + // the process for filling the mixed events + void processMixed(UDCollisionsFull const& collisions, UdTracksFull const& tracks) + { + MixedBinning binningOnVtxAndMult{{vtxMix, multMix}, true}; // true is for 'ignore overflows' (true by default) + auto tracksTuple = std::make_tuple(tracks); + SameKindPair pairs{binningOnVtxAndMult, cfgMinMixEventNum, -1, collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip + + for (auto const& [collision1, tracks1, collision2, tracks2] : pairs) { + registry.fill(HIST("eventcount"), MixedEvent); // fill the mixed event in the 3 bin + fillCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent, tracks1.size()); + } + } + PROCESS_SWITCH(FlowCorrelationsUpc, processMixed, "Process mixed events", true); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc), + }; +} From 2a06f7e9a1fe23f7fac9c78cc6c864ed875cbcaa Mon Sep 17 00:00:00 2001 From: arossi81 Date: Tue, 1 Apr 2025 11:53:38 +0200 Subject: [PATCH 0881/1650] =?UTF-8?q?[Common]=20Adding=20possibility=20to?= =?UTF-8?q?=20use=20phi-dependent=20parametrizations.=20Number=20of=20p?= =?UTF-8?q?=E2=80=A6=20(#9872)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Andrea --- Common/Tools/TrackTuner.h | 177 ++++++++++++++++++++++++++------------ 1 file changed, 120 insertions(+), 57 deletions(-) diff --git a/Common/Tools/TrackTuner.h b/Common/Tools/TrackTuner.h index 9ccc0df9712..26937eb9131 100644 --- a/Common/Tools/TrackTuner.h +++ b/Common/Tools/TrackTuner.h @@ -24,6 +24,8 @@ #include #include #include +#include +#include #include "CCDB/BasicCCDBManager.h" #include "CCDB/CcdbApi.h" @@ -77,7 +79,7 @@ struct TrackTuner : o2::framework::ConfigurableGroup { o2::framework::Configurable cfgUsePvRefitCorrections{"usePvRefitCorrections", false, "Flag to establish whether to use corrections obtained with or w/o PV refit"}; o2::framework::Configurable cfgQOverPtMC{"qOverPtMC", -1., "Scaling factor on q/pt of MC"}; o2::framework::Configurable cfgQOverPtData{"qOverPtData", -1., "Scaling factor on q/pt of data"}; - + o2::framework::Configurable cfgNPhiBins{"nPhiBins", 0, "Number of phi bins"}; /////////////////////////////// /// parameters to be configured bool debugInfo = false; @@ -97,30 +99,31 @@ struct TrackTuner : o2::framework::ConfigurableGroup { /////////////////////////////// bool isConfigFromString = false; bool isConfigFromConfigurables = false; + int nPhiBins = 1; o2::ccdb::CcdbApi ccdbApi; std::map metadata; - std::unique_ptr grDcaXYResVsPtPionMC; - std::unique_ptr grDcaXYResVsPtPionData; + std::vector> grDcaXYResVsPtPionMC; + std::vector> grDcaXYResVsPtPionData; - std::unique_ptr grDcaZResVsPtPionMC; - std::unique_ptr grDcaZResVsPtPionData; + std::vector> grDcaZResVsPtPionMC; + std::vector> grDcaZResVsPtPionData; - std::unique_ptr grDcaXYMeanVsPtPionMC; - std::unique_ptr grDcaXYMeanVsPtPionData; + std::vector> grDcaXYMeanVsPtPionMC; + std::vector> grDcaXYMeanVsPtPionData; - std::unique_ptr grDcaZMeanVsPtPionMC; - std::unique_ptr grDcaZMeanVsPtPionData; + std::vector> grDcaZMeanVsPtPionMC; + std::vector> grDcaZMeanVsPtPionData; std::unique_ptr grOneOverPtPionMC; // MC std::unique_ptr grOneOverPtPionData; // Data - std::unique_ptr grDcaXYPullVsPtPionMC; - std::unique_ptr grDcaXYPullVsPtPionData; + std::vector> grDcaXYPullVsPtPionMC; + std::vector> grDcaXYPullVsPtPionData; - std::unique_ptr grDcaZPullVsPtPionMC; - std::unique_ptr grDcaZPullVsPtPionData; + std::vector> grDcaZPullVsPtPionMC; + std::vector> grDcaZPullVsPtPionData; /// @brief Function doing a few sanity-checks on the configurations void checkConfig() @@ -191,6 +194,7 @@ struct TrackTuner : o2::framework::ConfigurableGroup { UsePvRefitCorrections, QOverPtMC, QOverPtData, + NPhiBins, NPars }; std::map mapParNames = { std::make_pair(DebugInfo, "debugInfo"), @@ -206,7 +210,8 @@ struct TrackTuner : o2::framework::ConfigurableGroup { std::make_pair(NameFileQoverPt, "nameFileQoverPt"), std::make_pair(UsePvRefitCorrections, "usePvRefitCorrections"), std::make_pair(QOverPtMC, "qOverPtMC"), - std::make_pair(QOverPtData, "qOverPtData")}; + std::make_pair(QOverPtData, "qOverPtData"), + std::make_pair(NPhiBins, "nPhiBins")}; /////////////////////////////////////////////////////////////////////////////////// LOG(info) << "[TrackTuner]"; LOG(info) << "[TrackTuner] >>> Parameters before the custom settings"; @@ -224,6 +229,7 @@ struct TrackTuner : o2::framework::ConfigurableGroup { LOG(info) << "[TrackTuner] usePvRefitCorrections = " << usePvRefitCorrections; LOG(info) << "[TrackTuner] qOverPtMC = " << qOverPtMC; LOG(info) << "[TrackTuner] qOverPtData = " << qOverPtData; + LOG(info) << "[TrackTuner] nPhiBins = " << nPhiBins; // ############################################################################################## // ######## split the original string, separating substrings delimited by "|" symbol ######## @@ -245,7 +251,7 @@ struct TrackTuner : o2::framework::ConfigurableGroup { /// check if the number of input parameters is correct if (static_cast(slices.size()) != NPars) { - LOG(fatal) << "[TrackTuner] " << slices.size() << " parameters provided, while " << NPars << " are expected. Fix it!"; + LOG(fatal) << "[TrackTuner] " << slices.size() << " parameters provided, while " << static_cast(NPars) << " are expected. Fix it!"; } // ################################################################################################################### @@ -337,7 +343,12 @@ struct TrackTuner : o2::framework::ConfigurableGroup { qOverPtData = std::stof(getValueString(QOverPtData)); outputString += ", qOverPtData=" + std::to_string(qOverPtData); LOG(info) << "[TrackTuner] qOverPtData = " << qOverPtData; - + // Configure nPhiBins + nPhiBins = std::stoi(getValueString(NPhiBins)); + outputString += ", nPhiBins=" + std::to_string(nPhiBins); + if (nPhiBins < 0) + LOG(fatal) << "[TrackTuner] negative nPhiBins!" << nPhiBins; + LOG(info) << "[TrackTuner] nPhiBins = " << nPhiBins; /// declare that the configuration is done via an input string isConfigFromString = true; @@ -417,6 +428,12 @@ struct TrackTuner : o2::framework::ConfigurableGroup { qOverPtData = cfgQOverPtData; outputString += ", qOverPtData=" + std::to_string(qOverPtData); LOG(info) << "[TrackTuner] qOverPtData = " << qOverPtData; + // Configure nPhiBins + nPhiBins = cfgNPhiBins; + outputString += ", nPhiBins=" + std::to_string(nPhiBins); + if (nPhiBins < 0) + LOG(fatal) << "[TrackTuner] negative nPhiBins!" << nPhiBins; + LOG(info) << "[TrackTuner] nPhiBins = " << nPhiBins; /// declare that the configuration is done via the Configurables isConfigFromConfigurables = true; @@ -476,38 +493,72 @@ struct TrackTuner : o2::framework::ConfigurableGroup { LOG(fatal) << "TDirectory " << td << " not found in input file" << inputFile->GetName() << ". Fix it!"; } - std::string grDcaXYResNameMC = "resCurrentDcaXY"; - std::string grDcaXYMeanNameMC = "meanCurrentDcaXY"; - std::string grDcaXYPullNameMC = "pullsCurrentDcaXY"; - std::string grDcaXYResNameData = "resUpgrDcaXY"; - std::string grDcaXYMeanNameData = "meanUpgrDcaXY"; - std::string grDcaXYPullNameData = "pullsUpgrDcaXY"; - - grDcaXYResVsPtPionMC.reset(dynamic_cast(td->Get(grDcaXYResNameMC.c_str()))); - grDcaXYResVsPtPionData.reset(dynamic_cast(td->Get(grDcaXYResNameData.c_str()))); - grDcaXYMeanVsPtPionMC.reset(dynamic_cast(td->Get(grDcaXYMeanNameMC.c_str()))); - grDcaXYMeanVsPtPionData.reset(dynamic_cast(td->Get(grDcaXYMeanNameData.c_str()))); - grDcaXYPullVsPtPionMC.reset(dynamic_cast(td->Get(grDcaXYPullNameMC.c_str()))); - grDcaXYPullVsPtPionData.reset(dynamic_cast(td->Get(grDcaXYPullNameData.c_str()))); - if (!grDcaXYResVsPtPionMC.get() || !grDcaXYResVsPtPionData.get() || !grDcaXYMeanVsPtPionMC.get() || !grDcaXYMeanVsPtPionData.get() || !grDcaXYPullVsPtPionMC.get() || !grDcaXYPullVsPtPionData.get()) { - LOG(fatal) << "Something wrong with the names of the correction graphs for dcaXY. Fix it!"; + int inputNphiBins = nPhiBins; + if (inputNphiBins == 0) + nPhiBins = 1; // old phi_independent settings + + // reserve memory and initialize vector for needed number of graphs + grDcaXYResVsPtPionMC.resize(nPhiBins); + grDcaXYResVsPtPionData.resize(nPhiBins); + + grDcaZResVsPtPionMC.resize(nPhiBins); + grDcaZResVsPtPionData.resize(nPhiBins); + + grDcaXYMeanVsPtPionMC.resize(nPhiBins); + grDcaXYMeanVsPtPionData.resize(nPhiBins); + + grDcaZMeanVsPtPionMC.resize(nPhiBins); + grDcaZMeanVsPtPionData.resize(nPhiBins); + + grDcaXYPullVsPtPionMC.resize(nPhiBins); + grDcaXYPullVsPtPionData.resize(nPhiBins); + + grDcaZPullVsPtPionMC.resize(nPhiBins); + grDcaZPullVsPtPionData.resize(nPhiBins); + + /// Lambda expression to get the TGraphErrors from file + auto loadGraph = [&](int phiBin, const std::string& strBaseName) -> TGraphErrors* { + std::string strGraphName = inputNphiBins != 0 ? fmt::format("{}_{}", strBaseName, phiBin) : strBaseName; + TObject* obj = td->Get(strGraphName.c_str()); + if (!obj) { + LOG(fatal) << "[TrackTuner] TGraphErrors not found in the Input Root file: " << strGraphName; + td->ls(); + return nullptr; + } + return dynamic_cast(obj); + }; + + if (inputNphiBins != 0) { + LOG(info) << "[TrackTuner] Loading phi-dependent XY TGraphErrors"; } + for (int iPhiBin = 0; iPhiBin < nPhiBins; ++iPhiBin) { - std::string grDcaZResNameMC = "resCurrentDcaZ"; - std::string grDcaZMeanNameMC = "meanCurrentDcaZ"; - std::string grDcaZPullNameMC = "pullsCurrentDcaZ"; - std::string grDcaZResNameData = "resUpgrDcaZ"; - std::string grDcaZMeanNameData = "meanUpgrDcaZ"; - std::string grDcaZPullNameData = "pullsUpgrDcaZ"; - - grDcaZResVsPtPionMC.reset(dynamic_cast(td->Get(grDcaZResNameMC.c_str()))); - grDcaZResVsPtPionData.reset(dynamic_cast(td->Get(grDcaZResNameData.c_str()))); - grDcaZMeanVsPtPionMC.reset(dynamic_cast(td->Get(grDcaZMeanNameMC.c_str()))); - grDcaZMeanVsPtPionData.reset(dynamic_cast(td->Get(grDcaZMeanNameData.c_str()))); - grDcaZPullVsPtPionMC.reset(dynamic_cast(td->Get(grDcaZPullNameMC.c_str()))); - grDcaZPullVsPtPionData.reset(dynamic_cast(td->Get(grDcaZPullNameData.c_str()))); - if (!grDcaZResVsPtPionMC.get() || !grDcaZResVsPtPionData.get() || !grDcaZMeanVsPtPionMC.get() || !grDcaZMeanVsPtPionData.get() || !grDcaZPullVsPtPionMC.get() || !grDcaZPullVsPtPionData.get()) { - LOG(fatal) << "Something wrong with the names of the correction graphs for dcaZ. Fix it!"; + grDcaXYResVsPtPionMC[iPhiBin].reset(loadGraph(iPhiBin, "resCurrentDcaXY")); + grDcaXYResVsPtPionData[iPhiBin].reset(loadGraph(iPhiBin, "resUpgrDcaXY")); + grDcaXYMeanVsPtPionMC[iPhiBin].reset(loadGraph(iPhiBin, "meanCurrentDcaXY")); + grDcaXYMeanVsPtPionData[iPhiBin].reset(loadGraph(iPhiBin, "meanUpgrDcaXY")); + grDcaXYPullVsPtPionMC[iPhiBin].reset(loadGraph(iPhiBin, "pullsCurrentDcaXY")); + grDcaXYPullVsPtPionData[iPhiBin].reset(loadGraph(iPhiBin, "pullsUpgrDcaXY")); + + if (!grDcaXYResVsPtPionMC[iPhiBin].get() || !grDcaXYResVsPtPionData[iPhiBin].get() || !grDcaXYMeanVsPtPionMC[iPhiBin].get() || !grDcaXYMeanVsPtPionData[iPhiBin].get() || !grDcaXYPullVsPtPionMC[iPhiBin].get() || !grDcaXYPullVsPtPionData[iPhiBin].get()) { + LOG(fatal) << "[TrackTuner] Something wrong with the names of the correction graphs for dcaXY. Fix it! Problematic phi bin is" << iPhiBin; + } + } + + if (inputNphiBins != 0) { + LOG(info) << "[TrackTuner] Loading phi-dependent Z TGraphErrors"; + } + for (int iPhiBin = 0; iPhiBin < nPhiBins; ++iPhiBin) { + grDcaZResVsPtPionMC[iPhiBin].reset(loadGraph(iPhiBin, "resCurrentDcaZ")); + grDcaZMeanVsPtPionMC[iPhiBin].reset(loadGraph(iPhiBin, "meanCurrentDcaZ")); + grDcaZPullVsPtPionMC[iPhiBin].reset(loadGraph(iPhiBin, "pullsCurrentDcaZ")); + grDcaZResVsPtPionData[iPhiBin].reset(loadGraph(iPhiBin, "resUpgrDcaZ")); + grDcaZMeanVsPtPionData[iPhiBin].reset(loadGraph(iPhiBin, "meanUpgrDcaZ")); + grDcaZPullVsPtPionData[iPhiBin].reset(loadGraph(iPhiBin, "pullsUpgrDcaZ")); + + if (!grDcaZResVsPtPionMC[iPhiBin].get() || !grDcaZResVsPtPionData[iPhiBin].get() || !grDcaZMeanVsPtPionMC[iPhiBin].get() || !grDcaZMeanVsPtPionData[iPhiBin].get() || !grDcaZPullVsPtPionMC[iPhiBin].get() || !grDcaZPullVsPtPionData[iPhiBin].get()) { + LOG(fatal) << "[TrackTuner] Something wrong with the names of the correction graphs for dcaZ. Fix it! Problematic phi bin is" << iPhiBin; + } } std::string grOneOverPtPionNameMC = "sigmaVsPtMc"; @@ -538,11 +589,17 @@ struct TrackTuner : o2::framework::ConfigurableGroup { double dcaZPullMC = 1.0; double dcaZPullData = 1.0; - dcaXYResMC = evalGraph(ptMC, grDcaXYResVsPtPionMC.get()); - dcaXYResData = evalGraph(ptMC, grDcaXYResVsPtPionData.get()); + // get phibin + double phiMC = mcparticle.phi(); + if (phiMC < 0.) + phiMC += o2::constants::math::TwoPI; // 2 * std::numbers::pi;// + int phiBin = phiMC / (o2::constants::math::TwoPI + 0.0000001) * nPhiBins; // 0.0000001 just a numerical protection - dcaZResMC = evalGraph(ptMC, grDcaZResVsPtPionMC.get()); - dcaZResData = evalGraph(ptMC, grDcaZResVsPtPionData.get()); + dcaXYResMC = evalGraph(ptMC, grDcaXYResVsPtPionMC[phiBin].get()); + dcaXYResData = evalGraph(ptMC, grDcaXYResVsPtPionData[phiBin].get()); + + dcaZResMC = evalGraph(ptMC, grDcaZResVsPtPionMC[phiBin].get()); + dcaZResData = evalGraph(ptMC, grDcaZResVsPtPionData[phiBin].get()); // For Q/Pt corrections, files on CCDB will be used if both qOverPtMC and qOverPtData are null if (updateCurvature || updateCurvatureIU) { @@ -560,14 +617,15 @@ struct TrackTuner : o2::framework::ConfigurableGroup { } // updateCurvature, updateCurvatureIU block ends here if (updateTrackDCAs) { - dcaXYMeanMC = evalGraph(ptMC, grDcaXYMeanVsPtPionMC.get()); - dcaXYMeanData = evalGraph(ptMC, grDcaXYMeanVsPtPionData.get()); - dcaXYPullMC = evalGraph(ptMC, grDcaXYPullVsPtPionMC.get()); - dcaXYPullData = evalGraph(ptMC, grDcaXYPullVsPtPionData.get()); + dcaXYMeanMC = evalGraph(ptMC, grDcaXYMeanVsPtPionMC[phiBin].get()); + dcaXYMeanData = evalGraph(ptMC, grDcaXYMeanVsPtPionData[phiBin].get()); + + dcaXYPullMC = evalGraph(ptMC, grDcaXYPullVsPtPionMC[phiBin].get()); + dcaXYPullData = evalGraph(ptMC, grDcaXYPullVsPtPionData[phiBin].get()); - dcaZPullMC = evalGraph(ptMC, grDcaZPullVsPtPionMC.get()); - dcaZPullData = evalGraph(ptMC, grDcaZPullVsPtPionData.get()); + dcaZPullMC = evalGraph(ptMC, grDcaZPullVsPtPionMC[phiBin].get()); + dcaZPullData = evalGraph(ptMC, grDcaZPullVsPtPionData[phiBin].get()); } // Unit conversion, is it required ?? dcaXYResMC *= 1.e-4; @@ -676,12 +734,17 @@ struct TrackTuner : o2::framework::ConfigurableGroup { if (updateTrackDCAs) { // propagate to DCA with respect to the Production point o2::base::Propagator::Instance()->propagateToDCABxByBz(vtxMC, trackParCov, 2.f, matCorr, dcaInfoCov); + if (debugInfo) { + LOG(info) << "phi MC" << mcparticle.phi(); + LOG(info) << "alpha track" << trackParCov.getAlpha(); + } // double d0zo =param [1]; double trackParDcaZRec = trackParCov.getZ(); // double d0rpo =param [0]; double trackParDcaXYRec = trackParCov.getY(); float mcVxRotated = mcparticle.vx() * std::cos(trackParCov.getAlpha()) + mcparticle.vy() * std::sin(trackParCov.getAlpha()); // invert float mcVyRotated = mcparticle.vy() * std::cos(trackParCov.getAlpha()) - mcparticle.vx() * std::sin(trackParCov.getAlpha()); + if (debugInfo) { // LOG(info) << "mcVy " << mcparticle.vy() << std::endl; LOG(info) << "mcVxRotated " << mcVxRotated; @@ -954,7 +1017,7 @@ struct TrackTuner : o2::framework::ConfigurableGroup { { if (!graph) { - printf("\tevalGraph fails !\n"); + LOG(fatal) << "\t evalGraph fails !\n"; return 0.; } int nPoints = graph->GetN(); From c8c01f81f9d7d31246dca01a7b7aec538c6e6966 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Tue, 1 Apr 2025 12:25:16 +0200 Subject: [PATCH 0882/1650] [Infrastructure] Add pre-commit hook for cpplint (#10609) --- .pre-commit-config.yaml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index fb4294f6448..dd9ef707b95 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,6 +7,10 @@ repos: - id: trailing-whitespace - id: end-of-file-fixer - repo: https://github.com/pre-commit/mirrors-clang-format - rev: "v18.1.3" # clang-format version + rev: v18.1.3 # clang-format version hooks: - id: clang-format + - repo: https://github.com/cpplint/cpplint + rev: 2.0.0 + hooks: + - id: cpplint From 534cd40e1bf7c626f86df4d5797f4ee3d4dc133a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Tue, 1 Apr 2025 12:26:05 +0200 Subject: [PATCH 0883/1650] [Infrastructure] Configure dependabot to update GitHub actions (#10660) --- .github/dependabot.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000000..30ad6d8f005 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,10 @@ +--- +# Dependabot configuration +# Reference: https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 +updates: + - package-ecosystem: "github-actions" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "weekly" From 3651e9d97e5288e275107ee8bf0c5d96c5132df6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Tue, 1 Apr 2025 12:27:51 +0200 Subject: [PATCH 0884/1650] O2 linter: Add test for magic numbers (#10616) --- Scripts/o2_linter.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Scripts/o2_linter.py b/Scripts/o2_linter.py index dcf6ba82d1b..98167d7f77b 100644 --- a/Scripts/o2_linter.py +++ b/Scripts/o2_linter.py @@ -592,6 +592,24 @@ def test_file(self, path: str, content) -> bool: return True +class TestMagicNumber(TestSpec): + """Detect magic numbers.""" + + name = "magic-number" + message = "Avoid magic numbers in expressions. Assign the value to a clearly named variable or constant." + suffixes = [".h", ".cxx", ".C"] + + def test_line(self, line: str) -> bool: + if is_comment_cpp(line): + return True + line = remove_comment_cpp(line) + if not (match := re.search(r" ([<>]=?|[!=]=) [\+-]?([\d\.]+)", line)): + return True + number = match.group(2) + # Accept only 0 or 1 (int or float). + return re.match(r"[01](\.0?)?$", number) is not None + + # Documentation # Reference: https://rawgit.com/AliceO2Group/CodingGuidelines/master/comments_guidelines.html @@ -1435,6 +1453,7 @@ def main(): tests.append(TestConstRefInForLoop()) tests.append(TestConstRefInSubscription()) tests.append(TestWorkflowOptions()) + tests.append(TestMagicNumber()) # Documentation enable_documentation = True From c529a2806f9d43ccdeedb0bbac11da78a6f60a2d Mon Sep 17 00:00:00 2001 From: basiach <74355517+basiach@users.noreply.github.com> Date: Tue, 1 Apr 2025 12:48:00 +0200 Subject: [PATCH 0885/1650] [PWGCF] FemtoUniverse - Separating nSigma cuts for tracks and daughters (#10694) Co-authored-by: Barbara Chytla --- ...mtoUniversePairTaskTrackCascadeExtended.cxx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx index 5c35aeccbd2..781ff80ef9f 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx @@ -13,7 +13,6 @@ /// \brief Task for cascade correlations and QA /// \author Barbara Chytla, WUT Warsaw, barbara.chytla@cern.ch /// \author Shirajum Monira, WUT Warsaw, shirajum.monira@cern.ch -// o2-linter: disable=name/workflow-file #include #include "Framework/AnalysisTask.h" @@ -38,7 +37,7 @@ using namespace o2::framework::expressions; using namespace o2::analysis::femto_universe; using namespace o2::aod::pidutils; -struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/struct +struct femtoUniversePairTaskTrackCascadeExtended { Service pdgMC; SliceCache cache; @@ -79,9 +78,10 @@ struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/st Configurable confHPtPart2{"ConfHPtPart2", 4.0f, "higher limit for pt of particle 2"}; Configurable confLPtPart2{"ConfLPtPart2", 0.3f, "lower limit for pt of particle 2"}; Configurable confmom{"Confmom", 0.75, "momentum threshold for particle identification using TOF"}; - Configurable confNsigmaTPCParticle{"ConfNsigmaTPCParticle", 3.0, "TPC Sigma for particle momentum < Confmom"}; - Configurable confNsigmaTOFParticle{"ConfNsigmaTOFParticle", 3.0, "TOF Sigma for particle momentum > Confmom"}; - Configurable confNsigmaCombinedParticle{"ConfNsigmaCombinedParticle", 3.0, "TPC and TOF Sigma (combined) for particle momentum > Confmom"}; + Configurable confNsigmaTPCParticle{"ConfNsigmaTPCParticle", 3.0, "TPC Sigma for particle (track) momentum < Confmom"}; + Configurable confNsigmaCombinedParticle{"ConfNsigmaCombinedParticle", 3.0, "TPC and TOF Sigma (combined) for particle (track) momentum > Confmom"}; + Configurable confNsigmaTPCParticleChild{"ConfNsigmaTPCParticleChild", 3.0, "TPC Sigma for particle (daugh & bach) momentum < Confmom"}; + Configurable confNsigmaTOFParticleChild{"ConfNsigmaTOFParticleChild", 3.0, "TOF Sigma for particle (daugh & bach) momentum > Confmom"}; ConfigurableAxis confkstarBins{"ConfkstarBins", {1500, 0., 6.}, "binning kstar"}; ConfigurableAxis confMultBins{"ConfMultBins", {VARIABLE_WIDTH, 0.0f, 20.0f, 40.0f, 60.0f, 80.0f, 100.0f, 200.0f, 99999.f}, "Mixing bins - multiplicity"}; @@ -154,7 +154,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/st bool isNSigmaTPC(float nsigmaTPCParticle) { - if (std::abs(nsigmaTPCParticle) < confNsigmaTPCParticle) { + if (std::abs(nsigmaTPCParticle) < confNsigmaTPCParticleChild) { return true; } else { return false; @@ -163,9 +163,9 @@ struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/st bool isNSigmaTOF(float mom, float nsigmaTOFParticle, float hasTOF) { - // Cut only on tracks, that have TOF signal + // Cut only on daughter and bachelor tracks, that have TOF signal if (mom > confmom && hasTOF == 1) { - if (std::abs(nsigmaTOFParticle) < confNsigmaTOFParticle) { + if (std::abs(nsigmaTOFParticle) < confNsigmaTOFParticleChild) { return true; } else { return false; @@ -180,7 +180,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { // o2-linter: disable=name/st if (mom <= confmom) { return (std::abs(nsigmaTPCParticle) < confNsigmaTPCParticle); } else { - return (TMath::Hypot(nsigmaTOFParticle, nsigmaTPCParticle) < confNsigmaCombinedParticle); // o2-linter: disable=root-entity + return (TMath::Hypot(nsigmaTOFParticle, nsigmaTPCParticle) < confNsigmaCombinedParticle); } } From eb0096d9ef544e059e35cb19be191589f296e109 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Tue, 1 Apr 2025 20:36:01 +0900 Subject: [PATCH 0886/1650] [Common] update DCA with MFT (#10715) --- Common/Core/fwdtrackUtilities.h | 12 +++++++----- Common/TableProducer/fwdtrackPropagation.cxx | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Common/Core/fwdtrackUtilities.h b/Common/Core/fwdtrackUtilities.h index 068eed51f17..13fb27c5862 100644 --- a/Common/Core/fwdtrackUtilities.h +++ b/Common/Core/fwdtrackUtilities.h @@ -59,11 +59,9 @@ o2::dataformats::GlobalFwdTrack propagateMuon(TFwdTrack const& muon, TCollision if (endPoint == propagationPoint::kToVertex) { o2::mch::TrackExtrap::extrapToVertex(mchTrack, collision.posX(), collision.posY(), collision.posZ(), collision.covXX(), collision.covYY()); - } - if (endPoint == propagationPoint::kToDCA) { + } else if (endPoint == propagationPoint::kToDCA) { o2::mch::TrackExtrap::extrapToVertexWithoutBranson(mchTrack, collision.posZ()); - } - if (endPoint == propagationPoint::kToRabs) { + } else if (endPoint == propagationPoint::kToRabs) { o2::mch::TrackExtrap::extrapToZ(mchTrack, -505.); } @@ -77,7 +75,11 @@ o2::dataformats::GlobalFwdTrack propagateMuon(TFwdTrack const& muon, TCollision auto Bz = field->getBz(centerMFT); // Get field at centre of MFT auto geoMan = o2::base::GeometryManager::meanMaterialBudget(muon.x(), muon.y(), muon.z(), collision.posX(), collision.posY(), collision.posZ()); auto x2x0 = static_cast(geoMan.meanX2X0); - fwdtrack.propagateToVtxhelixWithMCS(collision.posZ(), {collision.posX(), collision.posY()}, {collision.covXX(), collision.covYY()}, Bz, x2x0); + if (endPoint == propagationPoint::kToVertex) { + fwdtrack.propagateToVtxhelixWithMCS(collision.posZ(), {collision.posX(), collision.posY()}, {collision.covXX(), collision.covYY()}, Bz, x2x0); + } else if (endPoint == propagationPoint::kToDCA) { + fwdtrack.propagateToZhelix(collision.posZ(), Bz); + } propmuon.setParameters(fwdtrack.getParameters()); propmuon.setZ(fwdtrack.getZ()); propmuon.setCovariances(fwdtrack.getCovariances()); diff --git a/Common/TableProducer/fwdtrackPropagation.cxx b/Common/TableProducer/fwdtrackPropagation.cxx index 134b1f2eff2..ae43c05c0f7 100644 --- a/Common/TableProducer/fwdtrackPropagation.cxx +++ b/Common/TableProducer/fwdtrackPropagation.cxx @@ -159,7 +159,7 @@ struct FwdTrackPropagation { return false; } - if (maxChi2 < chi2) { + if (chi2 < 0.f || maxChi2 < chi2) { return false; } From 0174b6cb183da4b66832d6708fc424a630069d74 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 15:41:35 +0200 Subject: [PATCH 0887/1650] [Infrastructure] Bump oxsecurity/megalinter from 8.4.2 to 8.5.0 (#10717) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/mega-linter.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/mega-linter.yml b/.github/workflows/mega-linter.yml index 026067e976a..68302e1f873 100644 --- a/.github/workflows/mega-linter.yml +++ b/.github/workflows/mega-linter.yml @@ -38,7 +38,7 @@ jobs: id: ml # You can override MegaLinter flavor used to have faster performances # More info at https://megalinter.io/flavors/ - uses: oxsecurity/megalinter@v8.4.2 + uses: oxsecurity/megalinter@v8.5.0 env: # All available variables are described in documentation: # https://megalinter.io/configuration/ From 2a4371cec6ec1b88ee2b91bde7b0b58db863db20 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 16:25:00 +0200 Subject: [PATCH 0888/1650] [Infrastructure] Bump actions/stale from 1 to 9 (#10718) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/stale.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 8056a231e90..24b650f65b5 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -12,7 +12,7 @@ jobs: stale: runs-on: ubuntu-latest steps: - - uses: actions/stale@v1 + - uses: actions/stale@v9 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-pr-message: 'This PR has not been updated in the last 30 days. Is it still needed? Unless further action is taken, it will be closed in 5 days.' From c09fbf11f6d1918d8e999d4dbd2d16c351dd5628 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Tue, 1 Apr 2025 23:36:07 +0900 Subject: [PATCH 0889/1650] [PWGEM/Dilepton] update DCA resolution for muon (#10721) --- PWGEM/Dilepton/Core/SingleTrackQC.h | 4 ++-- PWGEM/Dilepton/Core/SingleTrackQCMC.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/PWGEM/Dilepton/Core/SingleTrackQC.h b/PWGEM/Dilepton/Core/SingleTrackQC.h index be971c95c41..b5d268a383a 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQC.h @@ -277,8 +277,8 @@ struct SingleTrackQC { fRegistry.add("Track/positive/hTrackType", "track type", kTH1F, {{6, -0.5f, 5.5}}, false); fRegistry.add("Track/positive/hDCAxy", "DCA x vs. y;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -0.1f, 0.1f}, {200, -0.1f, 0.1f}}, false); fRegistry.add("Track/positive/hDCAxySigma", "DCA x vs. y;DCA_{x} (#sigma);DCA_{y} (#sigma)", kTH2F, {{200, -10.0f, 10.0f}, {200, -10.0f, 10.0f}}, false); - fRegistry.add("Track/positive/hDCAxRes_Pt", "DCA_{x} resolution vs. pT;p_{T} (GeV/c);DCA_{x} resolution (#mum)", kTH2F, {{100, 0, 10}, {100, 0, 100}}, false); - fRegistry.add("Track/positive/hDCAyRes_Pt", "DCA_{y} resolution vs. pT;p_{T} (GeV/c);DCA_{y} resolution (#mum)", kTH2F, {{100, 0, 10}, {100, 0, 100}}, false); + fRegistry.add("Track/positive/hDCAxRes_Pt", "DCA_{x} resolution vs. pT;p_{T} (GeV/c);DCA_{x} resolution (#mum)", kTH2F, {{100, 0, 10}, {500, 0, 500}}, false); + fRegistry.add("Track/positive/hDCAyRes_Pt", "DCA_{y} resolution vs. pT;p_{T} (GeV/c);DCA_{y} resolution (#mum)", kTH2F, {{100, 0, 10}, {500, 0, 500}}, false); fRegistry.add("Track/positive/hNclsMCH", "number of MCH clusters", kTH1F, {{21, -0.5, 20.5}}, false); fRegistry.add("Track/positive/hNclsMFT", "number of MFT clusters", kTH1F, {{11, -0.5, 10.5}}, false); fRegistry.add("Track/positive/hPDCA", "pDCA;r at absorber end (cm);p #times DCA (GeV/c #upoint cm)", kTH2F, {{100, 0, 100}, {100, 0.0f, 1000}}, false); diff --git a/PWGEM/Dilepton/Core/SingleTrackQCMC.h b/PWGEM/Dilepton/Core/SingleTrackQCMC.h index 19b5fae615a..71afef1511c 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQCMC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQCMC.h @@ -334,8 +334,8 @@ struct SingleTrackQCMC { fRegistry.add("Track/lf/positive/hTrackType", "track type", kTH1F, {{6, -0.5f, 5.5}}, false); fRegistry.add("Track/lf/positive/hDCAxy", "DCA x vs. y;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -0.1f, 0.1f}, {200, -0.1f, 0.1f}}, false); fRegistry.add("Track/lf/positive/hDCAxySigma", "DCA x vs. y;DCA_{x} (#sigma);DCA_{y} (#sigma)", kTH2F, {{200, -10.0f, 10.0f}, {200, -10.0f, 10.0f}}, false); - fRegistry.add("Track/lf/positive/hDCAxRes_Pt", "DCA_{x} resolution vs. pT;p_{T} (GeV/c);DCA_{x} resolution (#mum)", kTH2F, {{100, 0, 10}, {100, 0, 100}}, false); - fRegistry.add("Track/lf/positive/hDCAyRes_Pt", "DCA_{y} resolution vs. pT;p_{T} (GeV/c);DCA_{y} resolution (#mum)", kTH2F, {{100, 0, 10}, {100, 0, 100}}, false); + fRegistry.add("Track/lf/positive/hDCAxRes_Pt", "DCA_{x} resolution vs. pT;p_{T} (GeV/c);DCA_{x} resolution (#mum)", kTH2F, {{100, 0, 10}, {500, 0, 500}}, false); + fRegistry.add("Track/lf/positive/hDCAyRes_Pt", "DCA_{y} resolution vs. pT;p_{T} (GeV/c);DCA_{y} resolution (#mum)", kTH2F, {{100, 0, 10}, {500, 0, 500}}, false); fRegistry.add("Track/lf/positive/hNclsMCH", "number of MCH clusters", kTH1F, {{21, -0.5, 20.5}}, false); fRegistry.add("Track/lf/positive/hNclsMFT", "number of MFT clusters", kTH1F, {{11, -0.5, 10.5}}, false); fRegistry.add("Track/lf/positive/hPDCA", "pDCA;r at absorber (cm);p #times DCA (GeV/c #upoint cm)", kTH2F, {{100, 0, 100}, {100, 0.0f, 1000}}, false); From 50363612a9d8e2ca8cb422214a92da9423fb5f2a Mon Sep 17 00:00:00 2001 From: alicja-pp <101565842+alicja-pp@users.noreply.github.com> Date: Tue, 1 Apr 2025 17:09:25 +0200 Subject: [PATCH 0890/1650] [PWGCF] FemtoUniverse: Add pair fractions for V0V0 pairs (#10720) --- .../femtoUniversePairTaskTrackV0Extended.cxx | 109 ++++++++++++++---- 1 file changed, 88 insertions(+), 21 deletions(-) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx index 302cbc198cb..4b692eee6d9 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx @@ -31,6 +31,7 @@ #include "Framework/O2DatabasePDGPlugin.h" #include #include +#include using namespace o2; using namespace o2::soa; @@ -503,7 +504,7 @@ struct FemtoUniversePairTaskTrackV0Extended { /// Histogramming same event for (const auto& part : groupPartsTwo) { int pdgCode = static_cast(part.pidCut()); - if ((confV0Type1 == 0 && pdgCode != 3122) || (confV0Type1 == 1 && pdgCode != -3122)) + if ((confV0Type1 == 0 && pdgCode != kLambda0) || (confV0Type1 == 1 && pdgCode != kLambda0Bar)) continue; trackHistoPartTwo.fillQA(part); } @@ -529,7 +530,7 @@ struct FemtoUniversePairTaskTrackV0Extended { if (static_cast(p1.pidCut()) != confTrkPDGCodePartOne) continue; int pdgCode2 = static_cast(p2.pidCut()); - if ((confV0Type1 == 0 && pdgCode2 != 3122) || (confV0Type1 == 1 && pdgCode2 != -3122)) + if ((confV0Type1 == 0 && pdgCode2 != kLambda0) || (confV0Type1 == 1 && pdgCode2 != kLambda0Bar)) continue; // track cleaning if (confIsCPR.value) { @@ -556,14 +557,14 @@ struct FemtoUniversePairTaskTrackV0Extended { const auto& posChild = parts.iteratorAt(part.index() - 2); const auto& negChild = parts.iteratorAt(part.index() - 1); int pdgCode = static_cast(part.pidCut()); - if ((confV0Type1 == 0 && pdgCode == 3122) || (confV0Type1 == 1 && pdgCode == -3122)) { + if ((confV0Type1 == 0 && pdgCode == kLambda0) || (confV0Type1 == 1 && pdgCode == kLambda0Bar)) { trackHistoV0Type1.fillQABase(part, HIST("V0Type1")); posChildV0Type1.fillQABase(posChild, HIST("posChildV0Type1")); negChildV0Type1.fillQABase(negChild, HIST("negChildV0Type1")); qaRegistry.fill(HIST("V0Type1/hInvMassLambdaVsCent"), multCol, part.mLambda()); qaRegistry.fill(HIST("V0Type1/hInvMassAntiLambdaVsCent"), multCol, part.mAntiLambda()); } - if ((confV0Type2 == 0 && pdgCode == 3122) || (confV0Type2 == 1 && pdgCode == -3122)) { + if ((confV0Type2 == 0 && pdgCode == kLambda0) || (confV0Type2 == 1 && pdgCode == kLambda0Bar)) { trackHistoV0Type2.fillQABase(part, HIST("V0Type2")); posChildV0Type2.fillQABase(posChild, HIST("posChildV0Type2")); negChildV0Type2.fillQABase(negChild, HIST("negChildV0Type2")); @@ -574,10 +575,10 @@ struct FemtoUniversePairTaskTrackV0Extended { auto pairProcessFunc = [&](auto& p1, auto& p2) -> void { int pdgCode1 = static_cast(p1.pidCut()); - if ((confV0Type1 == 0 && pdgCode1 != 3122) || (confV0Type1 == 1 && pdgCode1 != -3122)) + if ((confV0Type1 == 0 && pdgCode1 != kLambda0) || (confV0Type1 == 1 && pdgCode1 != kLambda0Bar)) return; int pdgCode2 = static_cast(p2.pidCut()); - if ((confV0Type2 == 0 && pdgCode2 != 3122) || (confV0Type2 == 1 && pdgCode2 != -3122)) + if ((confV0Type2 == 0 && pdgCode2 != kLambda0) || (confV0Type2 == 1 && pdgCode2 != kLambda0Bar)) return; sameEventCont.setPair(p1, p2, multCol, confUse3D); }; @@ -782,7 +783,7 @@ struct FemtoUniversePairTaskTrackV0Extended { if (static_cast(p1.pidCut()) != confTrkPDGCodePartOne) continue; int pdgCode2 = static_cast(p2.pidCut()); - if ((confV0Type1 == 0 && pdgCode2 != 3122) || (confV0Type1 == 1 && pdgCode2 != -3122)) + if ((confV0Type1 == 0 && pdgCode2 != kLambda0) || (confV0Type1 == 1 && pdgCode2 != kLambda0Bar)) continue; if (confIsCPR.value) { if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla1, femto_universe_container::EventType::mixed)) { @@ -822,10 +823,10 @@ struct FemtoUniversePairTaskTrackV0Extended { for (const auto& [p1, p2] : combinations(CombinationsFullIndexPolicy(groupPartsOne, groupPartsTwo))) { int pdgCode1 = static_cast(p1.pidCut()); - if ((confV0Type1 == 0 && pdgCode1 != 3122) || (confV0Type1 == 1 && pdgCode1 != -3122)) + if ((confV0Type1 == 0 && pdgCode1 != kLambda0) || (confV0Type1 == 1 && pdgCode1 != kLambda0Bar)) continue; int pdgCode2 = static_cast(p2.pidCut()); - if ((confV0Type2 == 0 && pdgCode2 != 3122) || (confV0Type2 == 1 && pdgCode2 != -3122)) + if ((confV0Type2 == 0 && pdgCode2 != kLambda0) || (confV0Type2 == 1 && pdgCode2 != kLambda0Bar)) continue; mixedEventCont.setPair(p1, p2, multCol, confUse3D); } @@ -845,6 +846,7 @@ struct FemtoUniversePairTaskTrackV0Extended { } PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processMCMixedEventV0, "Enable processing mixed events for MC truth V0 - V0", false); + ///--------------------------------------------MC-------------------------------------------------/// /// This function fills MC truth particles from derived MC table @@ -860,10 +862,10 @@ struct FemtoUniversePairTaskTrackV0Extended { continue; } - if (pdgCode == 3122) { + if (pdgCode == kLambda0) { registryMCtruth.fill(HIST("plus/MCtruthLambda"), part.pt(), part.eta()); continue; - } else if (pdgCode == -3122) { + } else if (pdgCode == kLambda0Bar) { registryMCtruth.fill(HIST("minus/MCtruthLambda"), part.pt(), part.eta()); continue; } @@ -871,11 +873,11 @@ struct FemtoUniversePairTaskTrackV0Extended { if (pdgParticle->Charge() > 0.0) { registryMCtruth.fill(HIST("plus/MCtruthAllPt"), part.pt()); } - if (pdgCode == 211) { + if (pdgCode == kPiPlus) { registryMCtruth.fill(HIST("plus/MCtruthPi"), part.pt(), part.eta()); registryMCtruth.fill(HIST("plus/MCtruthPiPt"), part.pt()); } - if (pdgCode == 2212) { + if (pdgCode == kProton) { registryMCtruth.fill(HIST("plus/MCtruthPr"), part.pt(), part.eta()); registryMCtruth.fill(HIST("plus/MCtruthPrPt"), part.pt()); } @@ -883,11 +885,11 @@ struct FemtoUniversePairTaskTrackV0Extended { if (pdgParticle->Charge() < 0.0) { registryMCtruth.fill(HIST("minus/MCtruthAllPt"), part.pt()); } - if (pdgCode == -211) { + if (pdgCode == kPiMinus) { registryMCtruth.fill(HIST("minus/MCtruthPi"), part.pt(), part.eta()); registryMCtruth.fill(HIST("minus/MCtruthPiPt"), part.pt()); } - if (pdgCode == -2212) { + if (pdgCode == kProtonBar) { registryMCtruth.fill(HIST("minus/MCtruthPr"), part.pt(), part.eta()); registryMCtruth.fill(HIST("minus/MCtruthPrPt"), part.pt()); } @@ -946,6 +948,71 @@ struct FemtoUniversePairTaskTrackV0Extended { } PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processPairFractions, "Process MC data to obtain pair fractions", false); + void processPairFractionsV0(FilteredFDCollisions const& cols, FemtoRecoParticles const& parts) + { + + ColumnBinningPolicy colBinningMult{{confVtxBins, confMultBins}, true}; + ColumnBinningPolicy colBinningCent{{confVtxBins, confMultBins}, true}; + + auto mixedCollProcessFunc = [&](auto& collision1, auto& collision2) -> void { + auto groupPartsOne = partsTwoMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex(), cache); + auto groupPartsTwo = partsTwoMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision2.globalIndex(), cache); + + const auto& magFieldTesla1 = collision1.magField(); + const auto& magFieldTesla2 = collision2.magField(); + + if (magFieldTesla1 != magFieldTesla2) { + return; + } + + for (const auto& [p1, p2] : combinations(CombinationsFullIndexPolicy(groupPartsOne, groupPartsTwo))) { + // Lambda invariant mass cut for p1 + if (!invMLambda(p1.mLambda(), p1.mAntiLambda())) { + continue; + } + // Lambda invariant mass cut for p2 + if (!invMLambda(p2.mLambda(), p2.mAntiLambda())) { + continue; + } + + const auto& posChild1 = parts.iteratorAt(p1.globalIndex() - 2); + const auto& negChild1 = parts.iteratorAt(p1.globalIndex() - 1); + /// Daughters that do not pass this condition are not selected + if (!isParticleTPC(posChild1, V0ChildTable[confV0Type1][0]) || !isParticleTPC(negChild1, V0ChildTable[confV0Type1][1])) + continue; + + const auto& posChild2 = parts.iteratorAt(p2.globalIndex() - 2); + const auto& negChild2 = parts.iteratorAt(p2.globalIndex() - 1); + /// Daughters that do not pass this condition are not selected + if (!isParticleTPC(posChild2, V0ChildTable[confV0Type2][0]) || !isParticleTPC(negChild2, V0ChildTable[confV0Type2][1])) + continue; + + // track cleaning + if (!pairCleanerV0.isCleanPair(p1, p2, parts)) { + continue; + } + if (confIsCPR.value) { + if (pairCloseRejectionV0.isClosePair(p1, p2, parts, magFieldTesla1, femto_universe_container::EventType::mixed)) { + continue; + } + } + + registryMCreco.fill(HIST("motherParticle"), p1.motherPDG(), p2.motherPDG()); + } + }; + + if (confUseCent) { + for (const auto& [collision1, collision2] : soa::selfCombinations(colBinningCent, confNEventsMix, -1, cols, cols)) { + mixedCollProcessFunc(collision1, collision2); + } + } else { + for (const auto& [collision1, collision2] : soa::selfCombinations(colBinningMult, confNEventsMix, -1, cols, cols)) { + mixedCollProcessFunc(collision1, collision2); + } + } + } + PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processPairFractionsV0, "Process MC data to obtain pair fractions for V0V0 pairs", false); + void processMCReco(FemtoRecoParticles const& parts, aod::FdMCParticles const& mcparts) { for (const auto& part : parts) { @@ -955,7 +1022,7 @@ struct FemtoUniversePairTaskTrackV0Extended { const auto& mcpart = mcparts.iteratorAt(mcPartId); // if (part.partType() == aod::femtouniverseparticle::ParticleType::kV0) { - if (mcpart.pdgMCTruth() == 3122) { + if (mcpart.pdgMCTruth() == kLambda0) { const auto& posChild = parts.iteratorAt(part.globalIndex() - 2); const auto& negChild = parts.iteratorAt(part.globalIndex() - 1); /// Daughters that do not pass this condition are not selected @@ -970,7 +1037,7 @@ struct FemtoUniversePairTaskTrackV0Extended { registryMCreco.fill(HIST("plus/MCrecoLambdaChildPi"), mcpartChild.pt(), mcpartChild.eta()); // lambda pion child } } - } else if (mcpart.pdgMCTruth() == -3122) { + } else if (mcpart.pdgMCTruth() == kLambda0Bar) { const auto& posChild = parts.iteratorAt(part.globalIndex() - 2); const auto& negChild = parts.iteratorAt(part.globalIndex() - 1); /// Daughters that do not pass this condition are not selected @@ -989,10 +1056,10 @@ struct FemtoUniversePairTaskTrackV0Extended { } else if (part.partType() == aod::femtouniverseparticle::ParticleType::kTrack) { if (part.sign() > 0) { registryMCreco.fill(HIST("plus/MCrecoAllPt"), mcpart.pt()); - if (mcpart.pdgMCTruth() == 211 && isNSigmaCombined(part.p(), unPackInTable(part.tpcNSigmaStorePi()), unPackInTable(part.tofNSigmaStorePi()))) { + if (mcpart.pdgMCTruth() == kPiPlus && isNSigmaCombined(part.p(), unPackInTable(part.tpcNSigmaStorePi()), unPackInTable(part.tofNSigmaStorePi()))) { registryMCreco.fill(HIST("plus/MCrecoPi"), mcpart.pt(), mcpart.eta()); registryMCreco.fill(HIST("plus/MCrecoPiPt"), mcpart.pt()); - } else if (mcpart.pdgMCTruth() == 2212 && isNSigmaCombined(part.p(), unPackInTable(part.tpcNSigmaStorePr()), unPackInTable(part.tofNSigmaStorePr()))) { + } else if (mcpart.pdgMCTruth() == kProton && isNSigmaCombined(part.p(), unPackInTable(part.tpcNSigmaStorePr()), unPackInTable(part.tofNSigmaStorePr()))) { registryMCreco.fill(HIST("plus/MCrecoPr"), mcpart.pt(), mcpart.eta()); registryMCreco.fill(HIST("plus/MCrecoPrPt"), mcpart.pt()); } @@ -1000,10 +1067,10 @@ struct FemtoUniversePairTaskTrackV0Extended { if (part.sign() < 0) { registryMCreco.fill(HIST("minus/MCrecoAllPt"), mcpart.pt()); - if (mcpart.pdgMCTruth() == -211 && isNSigmaCombined(part.p(), unPackInTable(part.tpcNSigmaStorePi()), unPackInTable(part.tofNSigmaStorePi()))) { + if (mcpart.pdgMCTruth() == kPiMinus && isNSigmaCombined(part.p(), unPackInTable(part.tpcNSigmaStorePi()), unPackInTable(part.tofNSigmaStorePi()))) { registryMCreco.fill(HIST("minus/MCrecoPi"), mcpart.pt(), mcpart.eta()); registryMCreco.fill(HIST("minus/MCrecoPiPt"), mcpart.pt()); - } else if (mcpart.pdgMCTruth() == -2212 && isNSigmaCombined(part.p(), unPackInTable(part.tpcNSigmaStorePr()), unPackInTable(part.tofNSigmaStorePr()))) { + } else if (mcpart.pdgMCTruth() == kProtonBar && isNSigmaCombined(part.p(), unPackInTable(part.tpcNSigmaStorePr()), unPackInTable(part.tofNSigmaStorePr()))) { registryMCreco.fill(HIST("minus/MCrecoPr"), mcpart.pt(), mcpart.eta()); registryMCreco.fill(HIST("minus/MCrecoPrPt"), mcpart.pt()); } From b4382b74c4cef756882017dae5d43f344e8c7dce Mon Sep 17 00:00:00 2001 From: bghanley1995 Date: Tue, 1 Apr 2025 11:56:44 -0400 Subject: [PATCH 0891/1650] [PWGCF] Identified Bf, Changed how PID is performed, added configurables to improve performance (#10714) Co-authored-by: ALICE Action Bot --- .../TableProducer/identifiedBfFilter.cxx | 83 +++++++++++-------- .../TableProducer/identifiedBfFilter.h | 21 +++-- .../Tasks/identifiedbf.cxx | 24 +++++- 3 files changed, 80 insertions(+), 48 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx b/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx index c38ef2a32b8..8dc80ba268a 100644 --- a/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx +++ b/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx @@ -36,6 +36,7 @@ #include "Framework/O2DatabasePDGPlugin.h" #include #include +#include #include #include #include @@ -132,6 +133,7 @@ TH2F* fhdEdxB = nullptr; TH2F* fhdEdxIPTPCB = nullptr; TH2F* fhdEdxA[kIdBfNoOfSpecies + 2] = {nullptr}; TH2F* fhdEdxIPTPCA[kIdBfNoOfSpecies + 2] = {nullptr}; +TH2F* fhTrackTime[kIdBfNoOfSpecies + 2] = {nullptr}; TH1F* fhMassB = nullptr; TH1F* fhMassA[kIdBfNoOfSpecies + 1] = {nullptr}; @@ -177,6 +179,9 @@ TH1F* fhTruePtNegA[kIdBfNoOfSpecies + 1] = {nullptr}; TH2F* fhTrueNPosNegA[kIdBfNoOfSpecies + 1] = {nullptr}; TH1F* fhTrueDeltaNA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH2F* fhTruedEdx[kIdBfNoOfSpecies + 1] = {nullptr}; +TH2F* fhTrueTrackTime[kIdBfNoOfSpecies + 1] = {nullptr}; + TH2F* fhTruePtEtaPosA[kIdBfNoOfSpecies + 1] = {nullptr}; TH2F* fhTruePtEtaNegA[kIdBfNoOfSpecies + 1] = {nullptr}; @@ -421,7 +426,7 @@ void IdentifiedBfFilter::processReconstructed(CollisionObject const& collision, fhVertexZB->Fill(collision.posZ()); uint8_t acceptedevent = uint8_t(false); float centormult = tentativecentmult; - if (IsEvtSelected(collision, centormult)) { + if (isEvtSelected(collision, centormult)) { acceptedevent = true; fhCentMultA->Fill(centormult); fhMultA->Fill(mult); @@ -535,7 +540,7 @@ void IdentifiedBfFilter::processGenerated(CollisionObject const& mccollision, Pa using namespace identifiedbffilter; uint8_t acceptedevent = uint8_t(false); - if (IsEvtSelected(mccollision, centormult)) { + if (isEvtSelected(mccollision, centormult)) { acceptedevent = uint8_t(true); } if (fullDerivedData) { @@ -565,7 +570,7 @@ void IdentifiedBfFilter::processGeneratorLevel(aod::McCollision const& mccollisi if (tmpcollision.has_mcCollision()) { if (tmpcollision.mcCollisionId() == mccollision.globalIndex()) { typename AllCollisions::iterator const& collision = allcollisions.iteratorAt(tmpcollision.globalIndex()); - if (IsEvtSelected(collision, defaultcent)) { + if (isEvtSelected(collision, defaultcent)) { fhTrueVertexZAA->Fill(mccollision.posZ()); processGenerated(mccollision, mcparticles, defaultcent); processed = true; @@ -609,7 +614,7 @@ void IdentifiedBfFilter::processVertexGenerated(aod::McCollisions const& mccolli fhTrueVertexZB->Fill(mccollision.posZ()); /* we assign a default value */ float centmult = 50.0f; - if (IsEvtSelected(mccollision, centmult)) { + if (isEvtSelected(mccollision, centmult)) { fhTrueVertexZA->Fill((mccollision.posZ())); } } @@ -658,6 +663,7 @@ struct IdentifiedBfFilterTracks { return lst; } + Service fPDG; Produces scannedtracks; Produces tracksinfo; Produces scannedgentracks; @@ -689,6 +695,7 @@ struct IdentifiedBfFilterTracks { Configurable maxRejectSigma{"maxRejectSigma", 1.0, "Maximum required sigma for PID double match rejection"}; Configurable tofCut{"tofCut", 0.8, "Momentum under which we don't use TOF PID data"}; + Configurable makeNSigmaPlots{"makeNSigmaPlots", false, "Produce the N Sigma Plots for external storage. Default false"}; OutputObj fOutput{"IdentifiedBfFilterTracksInfo", OutputObjHandlingPolicy::AnalysisObject}; bool checkAmbiguousTracks = false; @@ -769,7 +776,6 @@ struct IdentifiedBfFilterTracks { /* if the system type is not known at this time, we have to put the initialization somewhere else */ fSystem = getSystemType(cfgSystem); fDataType = getDataType(cfgDataType); - fPDG = o2::O2DatabasePDG::Instance(); /* required ambiguous tracks checks? */ if (dofilterDetectorLevelWithoutPIDAmbiguous || dofilterDetectorLevelWithPIDAmbiguous || dofilterRecoWithoutPIDAmbiguous || dofilterRecoWithPIDAmbiguous) { @@ -1025,18 +1031,19 @@ struct IdentifiedBfFilterTracks { TString::Format("N(%s^{#plus}) #minus N(%s^{#minus}) distribution (truth);N(%s^{#plus}) #minus N(%s^{#minus})", speciesTitle[sp], speciesTitle[sp], speciesTitle[sp], speciesTitle[sp]).Data(), 79, -39.5, 39.5); } - - for (int sp1 = 0; sp1 < kIdBfNoOfSpecies; ++sp1) { - for (int sp2 = 0; sp2 < kIdBfNoOfSpecies; ++sp2) { - fhTrueNSigmaTPC[sp1][sp2] = new TH2F(TString::Format("fhTrueNSigmaTPC%s_%s", speciesName[sp1], speciesName[sp2]).Data(), - TString::Format("N #sigma %s from TPC vs P for generated %s;N #sigma;p (GeV/c)", speciesTitle[sp1], speciesTitle[sp2]).Data(), - 48, -6, 6, - ptbins, ptlow, ptup); - - fhTrueNSigmaTOF[sp1][sp2] = new TH2F(TString::Format("fhTrueNSigmaTOF%s_%s", speciesName[sp1], speciesName[sp2]).Data(), - TString::Format("N #sigma %s from TOF vs P for generated %s;N #sigma;p (GeV/c)", speciesTitle[sp1], speciesTitle[sp2]).Data(), - 48, -6, 6, - ptbins, ptlow, ptup); + if (makeNSigmaPlots) { + for (int sp1 = 0; sp1 < kIdBfNoOfSpecies; ++sp1) { + for (int sp2 = 0; sp2 < kIdBfNoOfSpecies; ++sp2) { + fhTrueNSigmaTPC[sp1][sp2] = new TH2F(TString::Format("fhTrueNSigmaTPC%s_%s", speciesName[sp1], speciesName[sp2]).Data(), + TString::Format("N #sigma %s from TPC vs P for generated %s;N #sigma;p (GeV/c)", speciesTitle[sp1], speciesTitle[sp2]).Data(), + 48, -6, 6, + ptbins, ptlow, ptup); + + fhTrueNSigmaTOF[sp1][sp2] = new TH2F(TString::Format("fhTrueNSigmaTOF%s_%s", speciesName[sp1], speciesName[sp2]).Data(), + TString::Format("N #sigma %s from TOF vs P for generated %s;N #sigma;p (GeV/c)", speciesTitle[sp1], speciesTitle[sp2]).Data(), + 48, -6, 6, + ptbins, ptlow, ptup); + } } } @@ -1076,10 +1083,12 @@ struct IdentifiedBfFilterTracks { fOutputList->Add(fhTrueNPosNegA[sp]); fOutputList->Add(fhTrueDeltaNA[sp]); } - for (int sp1 = 0; sp1 < kIdBfNoOfSpecies; ++sp1) { - for (int sp2 = 0; sp2 < kIdBfNoOfSpecies; ++sp2) { - fOutputList->Add(fhTrueNSigmaTPC[sp1][sp2]); - fOutputList->Add(fhTrueNSigmaTOF[sp1][sp2]); + if (makeNSigmaPlots) { + for (int sp1 = 0; sp1 < kIdBfNoOfSpecies; ++sp1) { + for (int sp2 = 0; sp2 < kIdBfNoOfSpecies; ++sp2) { + fOutputList->Add(fhTrueNSigmaTPC[sp1][sp2]); + fOutputList->Add(fhTrueNSigmaTOF[sp1][sp2]); + } } } } @@ -1321,17 +1330,17 @@ inline MatchRecoGenSpecies IdentifiedBfFilterTracks::identifyParticle(ParticleOb int pdgcode = std::fabs(particle.pdgCode()); switch (pdgcode) { - case pdgcodeEl: + case kPositron: return kIdBfElectron; break; - case pdgcodePi: + case kPiPlus: return kIdBfPion; break; - case pdgcodeKa: + case kKPlus: return kIdBfKaon; break; - case pdgcodePr: + case kProton: return kIdBfProton; break; @@ -1351,16 +1360,16 @@ inline void IdentifiedBfFilterTracks::identifyPIDMismatch(ParticleObject const& int pdgcode = std::fabs(particle.pdgCode()); switch (pdgcode) { - case pdgcodeEl: + case kPositron: realPID = kIdBfElectron; break; - case pdgcodePi: + case kPiPlus: realPID = kIdBfPion; break; - case pdgcodeKa: + case kKPlus: realPID = kIdBfKaon; break; - case pdgcodePr: + case kProton: realPID = kIdBfProton; break; default: @@ -1386,16 +1395,16 @@ inline void IdentifiedBfFilterTracks::identifyRealNSigma(ParticleObject const& p MatchRecoGenSpecies realPID = kWrongSpecies; int pdgcode = std::fabs(particle.pdgCode()); switch (pdgcode) { - case pdgcodeEl: + case kPositron: realPID = kIdBfElectron; break; - case pdgcodePi: + case kPiPlus: realPID = kIdBfPion; break; - case pdgcodeKa: + case kKPlus: realPID = kIdBfKaon; break; - case pdgcodePr: + case kProton: realPID = kIdBfProton; break; default: @@ -1486,7 +1495,9 @@ inline MatchRecoGenSpecies IdentifiedBfFilterTracks::identifyTrack(TrackObject c float nsigmas[kIdBfNoOfSpecies]; if constexpr (framework::has_type_v) { - identifyRealNSigma(track.template mcParticle_as(), actualTPCNSigma, actualTOFNSigma, track.tpcInnerParam()); + if (makeNSigmaPlots) { + identifyRealNSigma(track.template mcParticle_as(), actualTPCNSigma, actualTOFNSigma, track.tpcInnerParam()); + } } if (loadfromccdb) { @@ -1495,7 +1506,7 @@ inline MatchRecoGenSpecies IdentifiedBfFilterTracks::identifyTrack(TrackObject c } } - if (track.tpcInnerParam() < tofCut && !reqTOF && !onlyTOF) { + if (track.tpcInnerParam() < tofCut && !onlyTOF) { for (int iSp = 0; iSp < kIdBfNoOfSpecies; iSp++) { nsigmas[iSp] = actualTPCNSigma[iSp]; @@ -1507,7 +1518,7 @@ inline MatchRecoGenSpecies IdentifiedBfFilterTracks::identifyTrack(TrackObject c for (int iSp = 0; iSp < kIdBfNoOfSpecies; iSp++) { nsigmas[iSp] = sqrtf(actualTPCNSigma[iSp] * actualTPCNSigma[iSp] + actualTOFNSigma[iSp] * actualTOFNSigma[iSp]); } - } else if (!reqTOF || !onlyTOF) { + } else if (!track.hasTOF() && !reqTOF && !onlyTOF) { for (int iSp = 0; iSp < kIdBfNoOfSpecies; iSp++) { nsigmas[iSp] = actualTPCNSigma[iSp]; } diff --git a/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.h b/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.h index a0b89d3913a..f92ecbd813f 100644 --- a/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.h +++ b/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.h @@ -9,6 +9,10 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +/// \file identifiedBfFilter.h +/// \brief Filters collisions and tracks according to selection criteria +/// \author bghanley1995@gmail.com + #ifndef PWGCF_TWOPARTICLECORRELATIONS_TABLEPRODUCER_IDENTIFIEDBFFILTER_H_ #define PWGCF_TWOPARTICLECORRELATIONS_TABLEPRODUCER_IDENTIFIEDBFFILTER_H_ @@ -19,6 +23,8 @@ #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" +#include "Framework/runDataProcessing.h" +#include "Framework/O2DatabasePDGPlugin.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/Centrality.h" @@ -27,9 +33,9 @@ #include "Common/Core/TrackSelectionDefaults.h" #include "PWGCF/Core/AnalysisConfigurableCuts.h" #include "MathUtils/Utils.h" -#include namespace o2 + { namespace aod { @@ -60,11 +66,6 @@ enum MatchRecoGenSpecies { kWrongSpecies = -1 }; -constexpr int pdgcodeEl = 11; -constexpr int pdgcodePi = 211; -constexpr int pdgcodeKa = 321; -constexpr int pdgcodePr = 2212; - /// \enum SpeciesPairMatch /// \brief The species pair considered by the matching test enum SpeciesPairMatch { @@ -237,8 +238,6 @@ float particleMaxDCAxy = 999.9f; float particleMaxDCAZ = 999.9f; bool traceCollId0 = false; -TDatabasePDG* fPDG = nullptr; - inline TriggerSelectionType getTriggerSelection(std::string const& triggstr) { if (triggstr.empty() || triggstr == "MB") { @@ -685,7 +684,7 @@ inline bool centralitySelection(aod::McCollision const&, float ////////////////////////////////////////////////////////////////////////////////// template -inline bool IsEvtSelected(CollisionObject const& collision, float& centormult) +inline bool isEvtSelected(CollisionObject const& collision, float& centormult) { bool trigsel = triggerSelection(collision); @@ -710,7 +709,7 @@ inline bool matchTrackType(TrackObject const& track) if (useOwnTrackSelection) { return ownTrackSelection.IsSelected(track); } else { - for (auto filter : trackFilters) { + for (const auto& filter : trackFilters) { if (filter->IsSelected(track)) { if (dca2Dcut) { if (track.dcaXY() * track.dcaXY() / maxDCAxy / maxDCAxy + track.dcaZ() * track.dcaZ() / maxDCAz / maxDCAz > 1) { @@ -738,7 +737,7 @@ inline bool matchTrackType(TrackObject const& track) template void exploreMothers(ParticleObject& particle, MCCollisionObject& collision) { - for (auto& m : particle.template mothers_as()) { + for (const auto& m : particle.template mothers_as()) { LOGF(info, " mother index: %d", m.globalIndex()); LOGF(info, " Tracking back mother"); LOGF(info, " assigned collision Id: %d, looping on collision Id: %d", m.mcCollisionId(), collision.globalIndex()); diff --git a/PWGCF/TwoParticleCorrelations/Tasks/identifiedbf.cxx b/PWGCF/TwoParticleCorrelations/Tasks/identifiedbf.cxx index f87d6b1c966..71d6e40e2f3 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/identifiedbf.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/identifiedbf.cxx @@ -95,7 +95,7 @@ struct IdentifiedbfTask { std::vector fhN1VsPt{nch, nullptr}; //! fhN1VsEtaPhi{nch, nullptr}; //! fhSum1PtVsEtaPhi{nch, nullptr}; //! fhN1VsZEtaPhiPt{nch, nullptr}; //! fhN1VsZEtaPhiPt{nch + 1, nullptr}; //! fhN1VsZEtaPhiPtPrimary{nch, nullptr}; //! fhN1VsZEtaPhiPtSecondary{nch, nullptr}; //! fhSum1PtVsZEtaPhiPt{nch, nullptr}; //!Fill(track.eta(), getShiftedPhi(track.phi()), corr); fhSum1PtVsEtaPhi[track.trackacceptedid()]->Fill(track.eta(), getShiftedPhi(track.phi()), track.pt() * corr); } else { + fhN1VsZEtaPhiPt[nch]->Fill(zvtx, getEtaPhiIndex(track) + 0.5, track.pt(), corr); fhN1VsZEtaPhiPt[track.trackacceptedid()]->Fill(zvtx, getEtaPhiIndex(track) + 0.5, track.pt(), corr); fhSum1PtVsZEtaPhiPt[track.trackacceptedid()]->Fill(zvtx, getEtaPhiIndex(track) + 0.5, track.pt(), track.pt() * corr); trackPrimaryCheck(track, zvtx, corr); @@ -626,6 +627,27 @@ struct IdentifiedbfTask { fOutputList->Add(fhSum1PtVsZEtaPhiPt[i]); } } + if (!smallsingles) { + TH1::SetDefaultSumw2(false); + fhN1VsZEtaPhiPt[nch] = new TH3F( + TString::Format("n1_%s_vsZ_vsEtaPhi_vsPt", "h"), + TString::Format("#LT n_{1} #GT;vtx_{z};#eta_{%s}#times#varphi_{%s};p_{t,%s} (GeV/c)", + "h", + "h", + "h") + .Data(), + zvtxbins, + zvtxlow, + zvtxup, + etabins * phibins, + 0.0, + static_cast(etabins * phibins), + ptbins, + ptlow, + ptup); + fOutputList->Add(fhN1VsZEtaPhiPt[nch]); + } + } else { for (uint i = 0; i < nch; ++i) { /* histograms for each track species */ From 905e940561919890019cbeb6e2a1c3ab8a0cd06e Mon Sep 17 00:00:00 2001 From: abilandz Date: Tue, 1 Apr 2025 18:02:58 +0200 Subject: [PATCH 0892/1650] [PWGCF] o added support for geometrical HMO cuts on fRefMult_vs_NContr (#10722) --- .../Core/MuPa-Configurables.h | 23 +- .../Core/MuPa-DataMembers.h | 63 +- .../Core/MuPa-Enums.h | 85 ++- .../Core/MuPa-MemberFunctions.h | 700 +++++++++++++++--- .../Tasks/multiparticle-correlations-ab.cxx | 32 +- 5 files changed, 750 insertions(+), 153 deletions(-) diff --git a/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h b/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h index 9da2b5cfda3..1d32d75d4e5 100644 --- a/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h +++ b/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h @@ -46,14 +46,14 @@ struct : ConfigurableGroup { Configurable cfCheckUnderflowAndOverflow{"cfCheckUnderflowAndOverflow", false, "check and bail out if in event and particle histograms there are entries which went to underflow or overflow bins (use only locally)"}; Configurable cfRebin{"cfRebin", 1, "number of bins of selected heavy 2D histograms are devided with this number"}; Configurable cfFillQAEventHistograms2D{"cfFillQAEventHistograms2D", false, "if false, all QA 2D event histograms are not filled. if true, only the ones for which fBookQAEventHistograms2D[...] is true, are filled"}; - Configurable> cfBookQAEventHistograms2D{"cfBookQAEventHistograms2D", {"1-Multiplicity_vs_ReferenceMultiplicity", "1-Multiplicity_vs_NContributors", "1-Multiplicity_vs_Centrality", "1-Multiplicity_vs_Vertex_z", "1-Multiplicity_vs_Occupancy", "1-Multiplicity_vs_InteractionRate", "1-ReferenceMultiplicity_vs_NContributors", "1-ReferenceMultiplicity_vs_Centrality", "1-ReferenceMultiplicity_vs_Vertex_z", "1-ReferenceMultiplicity_vs_Occupancy", "1-ReferenceMultiplicity_vs_InteractionRate", "1-NContributors_vs_Centrality", "1-NContributors_vs_Vertex_z", "1-NContributors_vs_Occupancy", "1-NContributors_vs_InteractionRate", "1-Centrality_vs_Vertex_z", "1-Centrality_vs_Occupancy", "0-Centrality_vs_ImpactParameter", "1-Centrality_vs_InteractionRate", "1-Vertex_z_vs_Occupancy", "1-Vertex_z_vs_InteractionRate", "0-MultNTracksPV_vs_MultNTracksGlobal", "1-CentFT0C_vs_CentFT0CVariant1", "1-CentFT0C_vs_CentFT0M", "1-CentFT0C_vs_CentFV0A", "0-CentFT0C_vs_CentNTPV", "0-CentFT0C_vs_CentNGlobal", "0-CentFT0M_vs_CentNTPV", "0-CentRun2V0M_vs_CentRun2SPDTracklets", "1-TrackOccupancyInTimeRange_vs_FT0COccupancyInTimeRange", "1-CurrentRunDuration_vs_InteractionRate"}, "book (1) or do not book (0) this QA 2D event histogram"}; + Configurable> cfBookQAEventHistograms2D{"cfBookQAEventHistograms2D", {"1-Multiplicity_vs_ReferenceMultiplicity", "1-Multiplicity_vs_NContributors", "1-Multiplicity_vs_Centrality", "1-Multiplicity_vs_Vertex_z", "1-Multiplicity_vs_Occupancy", "1-Multiplicity_vs_InteractionRate", "1-ReferenceMultiplicity_vs_NContributors", "1-ReferenceMultiplicity_vs_Centrality", "1-ReferenceMultiplicity_vs_Vertex_z", "1-ReferenceMultiplicity_vs_Occupancy", "1-ReferenceMultiplicity_vs_InteractionRate", "1-NContributors_vs_Centrality", "1-NContributors_vs_Vertex_z", "1-NContributors_vs_Occupancy", "1-NContributors_vs_InteractionRate", "1-Centrality_vs_Vertex_z", "1-Centrality_vs_Occupancy", "0-Centrality_vs_ImpactParameter", "1-Centrality_vs_InteractionRate", "1-Vertex_z_vs_Occupancy", "1-Vertex_z_vs_InteractionRate", "0-MultNTracksPV_vs_MultNTracksGlobal", "1-CentFT0C_vs_CentFT0CVariant1", "1-CentFT0C_vs_CentFT0M", "1-CentFT0C_vs_CentFV0A", "0-CentFT0C_vs_CentNTPV", "0-CentFT0C_vs_CentNGlobal", "0-CentFT0M_vs_CentNTPV", "0-CentRun2V0M_vs_CentRun2SPDTracklets", "1-TrackOccupancyInTimeRange_vs_FT0COccupancyInTimeRange", "1-CurrentRunDuration_vs_InteractionRate", "1-Multiplicity_vs_FT0CAmplitudeOnFoundBC", "1-CentFT0C_vs_FT0CAmplitudeOnFoundBC"}, "book (1) or do not book (0) this QA 2D event histogram"}; Configurable cfFillQAParticleHistograms2D{"cfFillQAParticleHistograms2D", false, "if false, all QA 2D particle histograms are not filled. if true, only the ones for which fBookQAParticleHistograms2D[...] is true, are filled"}; Configurable> cfBookQAParticleHistograms2D{"cfBookQAParticleHistograms2D", {"1-Pt_vs_dcaXY"}, "book (1) or do not book (0) this QA 2D particle histogram"}; Configurable cfFillQAParticleEventHistograms2D{"cfFillQAParticleEventHistograms2D", false, "if false, all QA 2D particle event histograms are not filled. if true, only the ones for which fBookQAParticleEventHistograms2D[...] is true, are filled"}; Configurable> cfBookQAParticleEventHistograms2D{"cfBookQAParticleEventHistograms2D", {"1-CurrentRunDuration_vs_itsNCls", "1-CurrentRunDuration_vs_itsNClsNegEtaEbyE", "1-CurrentRunDuration_vs_itsNClsPosEtaEbyE", "1-CurrentRunDuration_vs_Eta0804EbyE", "1-CurrentRunDuration_vs_Eta0400EbyE", "1-CurrentRunDuration_vs_Eta0004EbyE", "1-CurrentRunDuration_vs_Eta0408EbyE", "1-CurrentRunDuration_vs_Pt0005EbyE", "1-CurrentRunDuration_vs_Pt0510EbyE", "1-CurrentRunDuration_vs_Pt1050EbyE"}, "book (1) or do not book (0) this QA 2D particle event histogram"}; Configurable cfFillQACorrelationsVsHistograms2D{"cfFillQACorrelationsVsHistograms2D", false, "if false, all QA 2D histograms of this category are not filled. if true, only the ones for which fBookQACorrelationsVsHistograms2D[...] is true, are filled"}; - Configurable> cfBookQACorrelationsVsHistograms2D{"cfBookQACorrelationsVsHistograms2D", {"1-Correlations_vs_Multiplicity", "1-Correlations_vs_ReferenceMultiplicity", "1-Correlations_vs_Centrality", "1-Correlations_vs_Phi", "1-Correlations_vs_Pt", "1-Correlations_vs_Eta"}, "book (1) or do not book (0) this QA 2D histogram"}; + Configurable> cfBookQACorrelationsVsHistograms2D{"cfBookQACorrelationsVsHistograms2D", {"1-Correlations_vs_Multiplicity", "1-Correlations_vs_ReferenceMultiplicity", "1-Correlations_vs_Centrality", "1-Correlations_vs_Phi", "1-Correlations_vs_Pt", "1-Correlations_vs_Eta", "1-Correlations_vs_Charge", "1-Correlations_vs_tpcNClsFindable", "1-Correlations_vs_tpcNClsShared", "1-Correlations_vs_itsChi2NCl", "1-Correlations_vs_tpcNClsFound", "1-Correlations_vs_tpcNClsCrossedRows", "1-Correlations_vs_itsNCls", "1-Correlations_vs_itsNClsInnerBarrel", "1-Correlations_vs_tpcCrossedRowsOverFindableCls", "1-Correlations_vs_tpcFoundOverFindableCls", "1-Correlations_vs_tpcFractionSharedCls", "1-Correlations_vs_tpcChi2NCl", "1-Correlations_vs_dcaXY", "1-Correlations_vs_dcaZ"}, "book (1) or do not book (0) this QA 2D histogram"}; Configurable> cfQACorrelationsVsHistogramsMinMaxHarmonic{"cfQACorrelationsVsHistogramsMinMaxHarmonic", {1, 5}, "harmonics are filled for min <= harmonic < max"}; Configurable cfFillQACorrelationsVsInteractionRateVsProfiles2D{"cfFillQACorrelationsVsInteractionRateVsProfiles2D", false, "if false, all QA 2D profiles of this category are not filled. if true, only the ones for which fBookQACorrelationsVsInteractionRateVsProfiles2D[...] is true, are filled"}; @@ -70,7 +70,7 @@ struct : ConfigurableGroup { // *) Event cuts: struct : ConfigurableGroup { - Configurable> cfUseEventCuts{"cfUseEventCuts", {"1-NumberOfEvents", "1-TotalMultiplicity", "1-Multiplicity", "1-ReferenceMultiplicity", "1-Centrality", "1-Vertex_x", "1-Vertex_y", "1-Vertex_z", "1-NContributors", "1-ImpactParameter", "0-EventPlaneAngle", "1-Occupancy", "1-InteractionRate", "1-CurrentRunDuration", "0-MultMCNParticlesEta08", "0-Trigger", "0-Sel7", "1-Sel8", "1-MultiplicityEstimator", "1-ReferenceMultiplicityEstimator", "1-CentralityEstimator", "1-SelectedEvents", "1-NoSameBunchPileup", "1-IsGoodZvtxFT0vsPV", "1-IsVertexITSTPC", "1-IsVertexTOFmatched", "1-IsVertexTRDmatched", "0-NoCollInTimeRangeStrict", "0-NoCollInTimeRangeStandard", "0-NoCollInRofStrict", "0-NoCollInRofStandard", "0-NoHighMultCollInPrevRof", "0-IsGoodITSLayer3", "0-IsGoodITSLayer0123", "0-IsGoodITSLayersAll", "1-OccupancyEstimator", "1-MinVertexDistanceFromIP", "0-NoPileupTPC", "0-NoPileupFromSPD", "0-NoSPDOnVsOfPileup", "1-CentralityWeights"}, "use (1) or do not use (0) event cuts"}; + Configurable> cfUseEventCuts{"cfUseEventCuts", {"1-NumberOfEvents", "1-TotalMultiplicity", "1-Multiplicity", "1-ReferenceMultiplicity", "1-Centrality", "1-Vertex_x", "1-Vertex_y", "1-Vertex_z", "1-NContributors", "1-ImpactParameter", "0-EventPlaneAngle", "1-Occupancy", "1-InteractionRate", "1-CurrentRunDuration", "0-MultMCNParticlesEta08", "0-Trigger", "0-Sel7", "1-Sel8", "1-MultiplicityEstimator", "1-ReferenceMultiplicityEstimator", "1-CentralityEstimator", "1-SelectedEvents", "1-NoSameBunchPileup", "1-IsGoodZvtxFT0vsPV", "1-IsVertexITSTPC", "1-IsVertexTOFmatched", "1-IsVertexTRDmatched", "0-NoCollInTimeRangeStrict", "0-NoCollInTimeRangeStandard", "0-NoCollInRofStrict", "0-NoCollInRofStandard", "0-NoHighMultCollInPrevRof", "0-IsGoodITSLayer3", "0-IsGoodITSLayer0123", "0-IsGoodITSLayersAll", "1-OccupancyEstimator", "1-MinVertexDistanceFromIP", "0-NoPileupTPC", "0-NoPileupFromSPD", "0-NoSPDOnVsOfPileup", "1-RefMult_vs_NContr_Up", "1-RefMult_vs_NContr_Down", "1-CentralityCorrelationsCut", "1-CentralityWeights"}, "use (1) or do not use (0) event cuts"}; Configurable cfUseEventCutCounterAbsolute{"cfUseEventCutCounterAbsolute", false, "profile and save how many times each event cut counter triggered (absolute). Use with care, as this is computationally heavy"}; Configurable cfUseEventCutCounterSequential{"cfUseEventCutCounterSequential", false, "profile and save how many times each event cut counter triggered (sequential). Use with care, as this is computationally heavy"}; Configurable cfPrintCutCounterContent{"cfPrintCutCounterContent", false, "if true, prints on the screen after each event the content of fEventCutCounterHist[*][*] (all which were booked)"}; @@ -88,14 +88,13 @@ struct : ConfigurableGroup { Configurable> cfImpactParameter{"cfImpactParameter", {-1, 1000000000}, "Impact parameter range (can be used only for sim): {min, max}, with convention: min <= IP < max"}; Configurable> cfEventPlaneAngle{"cfEventPlaneAngle", {-o2::constants::math::PI, o2::constants::math::TwoPI}, "Event Plane Angle range (can be used only for sim): {min, max}, with convention: min <= EP < max"}; Configurable> cfOccupancy{"cfOccupancy", {-0.0001, 1000000000}, "Range for occupancy (use cfOccupancyEstimator to set specific estimator): {min, max}, with convention: min <= X < max. Important: remember that 0. has to be included, therefore I set -0.0001 by default for low edge"}; - Configurable> cfInteractionRate{"cfInteractionRate", {0., 1000000000.}, "Range for interaction rate: {min, max}, with convention: min <= X < max"}; + Configurable> cfInteractionRate{"cfInteractionRate", {0.1, 1000000000.}, "Range for interaction rate (in kHz): {min, max}, with convention: min <= X < max"}; Configurable> cfCurrentRunDuration{"cfCurrentRunDuration", {-2, 1000000000}, "Range for current run duration (i.e. seconds since start of run) in seconds: {min, max}, with convention: min <= X < max. Only collisions taken in this range (measured from SOR) are taken for analysis"}; Configurable> cfMultMCNParticlesEta08{"cfMultMCNParticlesEta08", {-1, 1000000000}, "Range for MultMCNParticlesEta08 : {min, max}, with convention: min <= X < max"}; - Configurable cfTrigger{"cfTrigger", "some supported trigger (e.g. INT7 for Run 2, TVXinTRD for Run 3, etc...)", "set here some supported trigger"}; + Configurable cfTrigger{"cfTrigger", "some supported trigger (e.g. \"kINT7\" for Run 2, \"kTVXinTRD\" for Run 3, etc...)", "set here some supported trigger"}; Configurable cfUseSel7{"cfUseSel7", false, "use for Run 1 and 2 data and MC (see official doc)"}; Configurable cfUseSel8{"cfUseSel8", false, "use for Run 3 data and MC (see official doc)"}; Configurable cfMultiplicityEstimator{"cfMultiplicityEstimator", "SelectedTracks", "all results vs. mult are calculated against this multiplicity. Can be set to SelectedTracks (calculated internally), ReferenceMultiplicity (calculated outside of my code), etc."}; - // Configurable cfReferenceMultiplicityEstimator{"cfReferenceMultiplicityEstimator", "some supported option for ref. mult. (MultFT0C, MultFV0M, MultTPC, etc.)", "Reference multiplicity, calculated outside of my code. Can be MultFT0C, MultFV0M, MultTPC, etc."}; Configurable cfReferenceMultiplicityEstimator{"cfReferenceMultiplicityEstimator", "MultFT0C", "Reference multiplicity, calculated outside of my code. Can be MultFT0C, MultFV0M, MultTPC, etc."}; // Configurable cfCentralityEstimator{"cfCentralityEstimator", "some supported centrality estimator (e.g. CentFT0C, ...)", "set here some supported centrality estimator (CentFT0C, CentFT0M, CentFV0A, CentNTPV, ... for Run 3, and CentRun2V0M, CentRun2SPDTracklets, ..., for Run 2 and 1) "}; Configurable cfCentralityEstimator{"cfCentralityEstimator", "CentFT0C", "set here some supported centrality estimator (CentFT0C, CentFT0M, CentFV0A, CentNTPV, ... for Run 3, and CentRun2V0M, CentRun2SPDTracklets, ..., for Run 2 and 1) "}; @@ -117,6 +116,12 @@ struct : ConfigurableGroup { Configurable cfUseNoPileupFromSPD{"cfUseNoPileupFromSPD", false, "TBI 20250318 explanation"}; Configurable cfUseNoSPDOnVsOfPileup{"cfUseNoSPDOnVsOfPileup", false, "TBI 20250318 explanation"}; Configurable cfOccupancyEstimator{"cfOccupancyEstimator", "FT0COccupancyInTimeRange", "set here some supported occupancy estimator (TrackOccupancyInTimeRange, FT0COccupancyInTimeRange, ..."}; + Configurable cfRefMult_vs_NContr_Up{"cfRefMult_vs_NContr_Up", "1200. + 0.20*x", "set here some TF1 formula for the upper boundary cut in RefMult_vs_NContr correlation"}; + Configurable cfRefMult_vs_NContr_Low{"cfRefMult_vs_NContr_Low", "-650. + 0.08*x", "set here some TF1 formula for the lower boundary cut in RefMult_vs_NContr correlation"}; + Configurable cfCentralityCorrelationsCut{"cfCentralityCorrelationsCutr", "CentFT0C_CentFT0M", "Indicate two centrality estimators for the calculation of centrality correlation cut"}; + Configurable cfCentralityCorrelationsCutTreshold{"cfCentralityCorrelationsCutTreshold", 10.0, "set the treshold for centrality correlation cut"}; + Configurable cfCentralityCorrelationsCutVersion{"cfCentralityCorrelationsCutVersion", "Absolute", "set the version of centrality correlation cut. Supported: \"Relative\" and \"Absolute\""}; + } cf_ec; // *) Particle histograms: @@ -132,7 +137,7 @@ struct : ConfigurableGroup { // *) Particle cuts: struct : ConfigurableGroup { - Configurable> cfUseParticleCuts{"cfUseParticleCuts", {"1-Phi", "1-Pt", "1-Eta", "1-Charge", "1-tpcNClsFindable", "1-tpcNClsShared", "1-itsChi2NCl", "1-tpcNClsFound", "1-tpcNClsCrossedRows", "1-itsNCls", "1-itsNClsInnerBarrel", "1-tpcCrossedRowsOverFindableCls", "1-tpcFoundOverFindableCls", "1-tpcFractionSharedCls", "1-tpcChi2NCl", "1-dcaXY", "1-dcaZ", "1-PDG", "0-trackCutFlag", "0-trackCutFlagFb1", "0-trackCutFlagFb2", "0-isQualityTrack", "0-isPrimaryTrack", "0-isInAcceptanceTrack", "0-isGlobalTrack", "1-isPVContributor", "0-PtDependentDCAxyParameterization"}, "Use (1) or do not use (0) particle cuts"}; + Configurable> cfUseParticleCuts{"cfUseParticleCuts", {"1-Phi", "1-Pt", "1-Eta", "1-Charge", "1-tpcNClsFindable", "1-tpcNClsShared", "1-itsChi2NCl", "1-tpcNClsFound", "1-tpcNClsCrossedRows", "1-itsNCls", "1-itsNClsInnerBarrel", "1-tpcCrossedRowsOverFindableCls", "1-tpcFoundOverFindableCls", "1-tpcFractionSharedCls", "1-tpcChi2NCl", "1-dcaXY", "1-dcaZ", "1-PDG", "0-trackCutFlag", "0-trackCutFlagFb1", "0-trackCutFlagFb2", "0-isQualityTrack", "1-isPrimaryTrack", "0-isInAcceptanceTrack", "0-isGlobalTrack", "1-isPVContributor", "0-PtDependentDCAxyParameterization"}, "Use (1) or do not use (0) particle cuts"}; Configurable cfUseParticleCutCounterAbsolute{"cfUseParticleCutCounterAbsolute", false, "profile and save how many times each particle cut counter triggered (absolute). Use with care, as this is computationally heavy"}; Configurable cfUseParticleCutCounterSequential{"cfUseParticleCutCounterSequential", false, "profile and save how many times each particle cut counter triggered (sequential). Use with care, as this is computationally heavy"}; Configurable> cfPhi{"cfPhi", {0.0, o2::constants::math::TwoPI}, "phi range: {min, max}[rad], with convention: min <= phi < max"}; @@ -141,7 +146,7 @@ struct : ConfigurableGroup { Configurable> cfCharge{"cfCharge", {-1.5, 1.5}, "particle charge. {-1.5,0} = only negative, {0,1.5} = only positive"}; Configurable> cftpcNClsFindable{"cftpcNClsFindable", {-1000., 1000.}, "tpcNClsFindable range: {min, max}, with convention: min <= cftpcNClsFindable < max"}; Configurable> cftpcNClsShared{"cftpcNClsShared", {-1000., 1000.}, "tpcNClsShared range: {min, max}, with convention: min <= cftpcNClsShared < max"}; - Configurable> cfitsChi2NCl{"cfitsChi2NCl", {-1000., 1000.}, "itsChi2NCl range: {min, max}, with convention: min <= cfitsChi2NCl < max"}; + Configurable> cfitsChi2NCl{"cfitsChi2NCl", {-1000., 36.}, "itsChi2NCl range: {min, max}, with convention: min <= cfitsChi2NCl < max"}; Configurable> cftpcNClsFound{"cftpcNClsFound", {70., 1000.}, "tpcNClsFound range: {min, max}, with convention: min <= cftpcNClsFound < max"}; Configurable> cftpcNClsCrossedRows{"cftpcNClsCrossedRows", {70., 1000.}, "tpcNClsCrossedRows range: {min, max}, with convention: min <= tpcNClsCrossedRows < max"}; Configurable> cfitsNCls{"cfitsNCls", {5., 1000.}, "itsNCls range: {min, max}, with convention: min <= itsNCls < max"}; @@ -157,7 +162,7 @@ struct : ConfigurableGroup { Configurable cftrackCutFlagFb1{"cftrackCutFlagFb1", false, "general selection + 1 point in ITS IB. Use only in Run 3."}; Configurable cftrackCutFlagFb2{"cftrackCutFlagFb2", false, "general selection + 2 point in ITS IB. Use only in Run 3."}; Configurable cfisQualityTrack{"cfisQualityTrack", false, "TBI 20240510 add description"}; - Configurable cfisPrimaryTrack{"cfisPrimaryTrack", false, "TBI 20240510 add description"}; + Configurable cfisPrimaryTrack{"cfisPrimaryTrack", true, "Set to true by default both in Run 3 and Run 2 TBI 20250319 validate still for Run 1"}; Configurable cfisInAcceptanceTrack{"cfisInAcceptanceTrack", false, "TBI 20250113 obsolete - see enum, to be removed"}; Configurable cfisGlobalTrack{"cfisGlobalTrack", false, "TBI 20240510 add description"}; Configurable cfisPVContributor{"cfisPVContributor", false, "Has this track contributed to the collision vertex fit"}; diff --git a/PWGCF/MultiparticleCorrelations/Core/MuPa-DataMembers.h b/PWGCF/MultiparticleCorrelations/Core/MuPa-DataMembers.h index 5cfb9f1fde0..1a083a64471 100644 --- a/PWGCF/MultiparticleCorrelations/Core/MuPa-DataMembers.h +++ b/PWGCF/MultiparticleCorrelations/Core/MuPa-DataMembers.h @@ -75,19 +75,20 @@ struct TaskConfiguration { // *) Event-by-event quantities: struct EventByEventQuantities { - int fSelectedTracks = 0; // integer counter of tracks used to calculate Q-vectors, after all particle cuts have been applied - float fMultiplicity = 0.; // my internal multiplicity, can be set to fSelectedTracks (calculated internally), fReferenceMultiplicity (calculated outside of my code), etc. - // Results "vs. mult" are plotted against fMultiplicity, whatever it is set to. - // Use configurable cfMultiplicityEstimator[eMultiplicityEstimator] to define what is this multiplicity, by default it is "SelectedTracks" - float fReferenceMultiplicity = 0.; // reference multiplicity, calculated outside of my code. Can be "MultTPC", "MultFV0M", etc. - // Use configurable cfReferenceMultiplicityEstimator[eReferenceMultiplicityEstimator]" to define what is this multiplicity, by default it is "TBI 20241123 I do not know yet which estimator is best for ref. mult." - float fCentrality = 0.; // event-by-event centrality. Value of the default centrality estimator, set via configurable cfCentralityEstimator - float fOccupancy = 0.; // event-by-event occupancy. Value of the default occupancy estimator, set via configurable cfOccupancyEstimator. - // Remebmer that collision with occupanct 0. shall NOT be rejected, therefore in configurable I set -0.0001 for low edge by default. - float fInteractionRate = 0.; // event-by-event interaction rate - float fCurrentRunDuration = 0.; // how many seconds after start of run this collision was taken, i.e. seconds after start of run (SOR) - float fVz = 0.; // vertex z position -} ebye; // "ebye" is a common label for objects in this struct + int fSelectedTracks = 0; // integer counter of tracks used to calculate Q-vectors, after all particle cuts have been applied + float fMultiplicity = 0.; // my internal multiplicity, can be set to fSelectedTracks (calculated internally), fReferenceMultiplicity (calculated outside of my code), etc. + // Results "vs. mult" are plotted against fMultiplicity, whatever it is set to. + // Use configurable cfMultiplicityEstimator[eMultiplicityEstimator] to define what is this multiplicity, by default it is "SelectedTracks" + float fReferenceMultiplicity = 0.; // reference multiplicity, calculated outside of my code. Can be "MultTPC", "MultFV0M", etc. + // Use configurable cfReferenceMultiplicityEstimator[eReferenceMultiplicityEstimator]" to define what is this multiplicity, by default it is "TBI 20241123 I do not know yet which estimator is best for ref. mult." + float fCentrality = 0.; // event-by-event centrality. Value of the default centrality estimator, set via configurable cfCentralityEstimator + float fOccupancy = 0.; // event-by-event occupancy. Value of the default occupancy estimator, set via configurable cfOccupancyEstimator. + // Remebmer that collision with occupanct 0. shall NOT be rejected, therefore in configurable I set -0.0001 for low edge by default. + float fInteractionRate = 0.; // event-by-event interaction rate + float fCurrentRunDuration = 0.; // how many seconds after start of run this collision was taken, i.e. seconds after start of run (SOR) + float fVz = 0.; // vertex z position + float fFT0CAmplitudeOnFoundBC = 0.; // TBI20250331 finalize the comment here +} ebye; // "ebye" is a common label for objects in this struct // *) QA: // Remark 1: I keep new histograms in this group, until I need them permanently in the analysis. Then, they are moved to EventHistograms or ParticleHistograms (yes, even if they are 2D). @@ -165,22 +166,26 @@ struct EventHistograms { // *) Event cuts: struct EventCuts { - TList* fEventCutsList = NULL; //! in a given event (therefore "EbyE" is appended). Yes, from one, because it runs over bin content and entries in TProfile for most of the time. - eitsNClsNegEtaEbyE, // in a given event for eta < 0 - eitsNClsPosEtaEbyE, // in a given event for eta > 0 - eEta0804EbyE, // in a given event for -0.8 < eta < -0.4 - eEta0400EbyE, // in a given event for -0.4 < eta < 0.0 - eEta0004EbyE, // in a given event for 0.0 < eta < 0.4 - eEta0408EbyE, // in a given event for 0.4 < eta < 0.8 - ePt0005EbyE, // in a given event for 0.0 < pt < 0.5 - ePt0510EbyE, // in a given event for 0.5 < pt < 1.0 - ePt1050EbyE, // in a given event for 1.0 < pt < 5.0 - eMeanPhi, // in an event TBI 20250214 I need to unify naming convention for <> with previous enums in above in the series, but okay... - eMeanPt, // in an event - eMeanEta, // in an event + eitsNClsEbyE = 1, // Labels average in a given event (therefore "EbyE" is appended). Yes, from one, because it runs over bin content and entries in TProfile for most of the time. + eitsNClsNegEtaEbyE, // in a given event for eta < 0 + eitsNClsPosEtaEbyE, // in a given event for eta > 0 + eEta0804EbyE, // in a given event for -0.8 < eta < -0.4 + eEta0400EbyE, // in a given event for -0.4 < eta < 0.0 + eEta0004EbyE, // in a given event for 0.0 < eta < 0.4 + eEta0408EbyE, // in a given event for 0.4 < eta < 0.8 + ePt0005EbyE, // in a given event for 0.0 < pt < 0.5 + ePt0510EbyE, // in a given event for 0.5 < pt < 1.0 + ePt1050EbyE, // in a given event for 1.0 < pt < 5.0 + eMeanPhi, // in an event TBI 20250214 I need to unify naming convention for <> with previous enums in above in the series, but okay... + eMeanPt, // in an event + eMeanEta, // in an event + eMeanCharge, // in an event + eMeantpcNClsFindable, // in an event + eMeantpcNClsShared, // in an event + eMeanitsChi2NCl, // in an event + eMeantpcNClsFound, // in an event + eMeantpcNClsCrossedRows, // in an event + eMeanitsNCls, // in an event + eMeanitsNClsInnerBarrel, // in an event + eMeantpcCrossedRowsOverFindableCls, // in an event + eMeantpcFoundOverFindableCls, // in an event + eMeantpcFractionSharedCls, // in an event + eMeantpcChi2NCl, // in an event + eMeandcaXY, // in an event + eMeandcaZ, // in an event eQAParticleEventProEbyE_N }; @@ -411,6 +448,20 @@ enum eQACorrelationsVsHistograms2D { eCorrelations_vs_MeanPhi, eCorrelations_vs_MeanPt, eCorrelations_vs_MeanEta, + eCorrelations_vs_MeanCharge, + eCorrelations_vs_MeantpcNClsFindable, + eCorrelations_vs_MeantpcNClsShared, + eCorrelations_vs_MeanitsChi2NCl, + eCorrelations_vs_MeantpcNClsFound, + eCorrelations_vs_MeantpcNClsCrossedRows, + eCorrelations_vs_MeanitsNCls, + eCorrelations_vs_MeanitsNClsInnerBarrel, + eCorrelations_vs_MeantpcCrossedRowsOverFindableCls, + eCorrelations_vs_MeantpcFoundOverFindableCls, + eCorrelations_vs_MeantpcFractionSharedCls, + eCorrelations_vs_MeantpcChi2NCl, + eCorrelations_vs_MeandcaXY, + eCorrelations_vs_MeandcaZ, // ... eQACorrelationsVsHistograms2D_N }; diff --git a/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h b/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h index 5bbbc101a7b..85382069dbb 100644 --- a/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h +++ b/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h @@ -166,6 +166,7 @@ void DefaultConfiguration() tc.fProcess[eProcessRecSim_Run1] = doprocessRecSim_Run1; tc.fProcess[eProcessSim_Run1] = doprocessSim_Run1; tc.fProcess[eProcessTest] = doprocessTest; + tc.fProcess[eProcessQA] = doprocessQA; // Temporarary bailout protection against cases which are not implemented/validated yet: if (tc.fProcess[eProcessSim]) { @@ -189,7 +190,7 @@ void DefaultConfiguration() } // Set automatically generic flags, from above individual flags: - tc.fProcess[eGenericRec] = tc.fProcess[eProcessRec] || tc.fProcess[eProcessRec_Run2] || tc.fProcess[eProcessRec_Run1] || tc.fProcess[eProcessTest]; + tc.fProcess[eGenericRec] = tc.fProcess[eProcessRec] || tc.fProcess[eProcessRec_Run2] || tc.fProcess[eProcessRec_Run1] || tc.fProcess[eProcessTest] || tc.fProcess[eProcessQA]; tc.fProcess[eGenericRecSim] = tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessRecSim_Run2] || tc.fProcess[eProcessRecSim_Run1]; tc.fProcess[eGenericSim] = tc.fProcess[eProcessSim] || tc.fProcess[eProcessSim_Run2] || tc.fProcess[eProcessSim_Run1]; @@ -214,6 +215,8 @@ void DefaultConfiguration() tc.fWhichProcess = "ProcessSim_Run1"; } else if (tc.fProcess[eProcessTest]) { tc.fWhichProcess = "ProcessTest"; + } else if (tc.fProcess[eProcessQA]) { + tc.fWhichProcess = "ProcessQA"; } tc.fRandomSeed = cf_tc.cfRandomSeed; @@ -295,6 +298,9 @@ void DefaultConfiguration() ec.fEventCutName[eNoPileupTPC] = "NoPileupTPC"; ec.fEventCutName[eNoPileupFromSPD] = "NoPileupFromSPD"; ec.fEventCutName[eNoSPDOnVsOfPileup] = "NoSPDOnVsOfPileup"; + ec.fEventCutName[eRefMult_vs_NContr_Up] = "RefMult_vs_NContr_Up"; + ec.fEventCutName[eRefMult_vs_NContr_Low] = "RefMult_vs_NContr_Low"; + ec.fEventCutName[eCentralityCorrelationsCut] = "CentralityCorrelationsCut"; ec.fEventCutName[eCentralityWeights] = "CentralityWeights"; for (int t = 0; t < eEventCuts_N; t++) { if (ec.fEventCutName[t].EqualTo("")) { @@ -636,6 +642,8 @@ void DefaultConfiguration() qa.fEventHistogramsName2D[eCentrality_vs_InteractionRate] = Form("%s_vs_%s", eh.fEventHistogramsName[eCentrality].Data(), eh.fEventHistogramsName[eInteractionRate].Data()); qa.fEventHistogramsName2D[eVertex_z_vs_Occupancy] = Form("%s_vs_%s", eh.fEventHistogramsName[eVertex_z].Data(), eh.fEventHistogramsName[eOccupancy].Data()); qa.fEventHistogramsName2D[eVertex_z_vs_InteractionRate] = Form("%s_vs_%s", eh.fEventHistogramsName[eVertex_z].Data(), eh.fEventHistogramsName[eInteractionRate].Data()); + qa.fEventHistogramsName2D[eMultiplicity_vs_FT0CAmplitudeOnFoundBC] = Form("%s_vs_%s", eh.fEventHistogramsName[eMultiplicity].Data(), "FT0CAmplitudeOnFoundBC"); // TBI 20250331 hardwired string + qa.fEventHistogramsName2D[eCentFT0C_vs_FT0CAmplitudeOnFoundBC] = Form("%s_vs_%s", qa.fCentralityEstimatorName[eCentFT0C].Data(), "FT0CAmplitudeOnFoundBC"); // TBI 20250331 hardwired string qa.fEventHistogramsName2D[eMultNTracksPV_vs_MultNTracksGlobal] = Form("%s_vs_%s", qa.fReferenceMultiplicityEstimatorName[eMultNTracksPV].Data(), qa.fReferenceMultiplicityEstimatorName[eMultNTracksGlobal].Data()); qa.fEventHistogramsName2D[eCentFT0C_vs_CentFT0CVariant1] = Form("%s_vs_%s", qa.fCentralityEstimatorName[eCentFT0C].Data(), qa.fCentralityEstimatorName[eCentFT0CVariant1].Data()); qa.fEventHistogramsName2D[eCentFT0C_vs_CentFT0M] = Form("%s_vs_%s", qa.fCentralityEstimatorName[eCentFT0C].Data(), qa.fCentralityEstimatorName[eCentFT0M].Data()); @@ -691,6 +699,21 @@ void DefaultConfiguration() qa.fQACorrelationsVsHistogramsName2D[eCorrelations_vs_MeanPhi] = TString::Format("%s_vs_%s", "Correlations", ph.fParticleHistogramsName[ePhi].Data()).Data(); qa.fQACorrelationsVsHistogramsName2D[eCorrelations_vs_MeanPt] = TString::Format("%s_vs_%s", "Correlations", ph.fParticleHistogramsName[ePt].Data()).Data(); qa.fQACorrelationsVsHistogramsName2D[eCorrelations_vs_MeanEta] = TString::Format("%s_vs_%s", "Correlations", ph.fParticleHistogramsName[eEta].Data()).Data(); + qa.fQACorrelationsVsHistogramsName2D[eCorrelations_vs_MeanCharge] = TString::Format("%s_vs_%s", "Correlations", ph.fParticleHistogramsName[eCharge].Data()).Data(); + qa.fQACorrelationsVsHistogramsName2D[eCorrelations_vs_MeantpcNClsFindable] = TString::Format("%s_vs_%s", "Correlations", ph.fParticleHistogramsName[etpcNClsFindable].Data()).Data(); + qa.fQACorrelationsVsHistogramsName2D[eCorrelations_vs_MeantpcNClsShared] = TString::Format("%s_vs_%s", "Correlations", ph.fParticleHistogramsName[etpcNClsShared].Data()).Data(); + qa.fQACorrelationsVsHistogramsName2D[eCorrelations_vs_MeanitsChi2NCl] = TString::Format("%s_vs_%s", "Correlations", ph.fParticleHistogramsName[eitsChi2NCl].Data()).Data(); + qa.fQACorrelationsVsHistogramsName2D[eCorrelations_vs_MeantpcNClsFound] = TString::Format("%s_vs_%s", "Correlations", ph.fParticleHistogramsName[etpcNClsFound].Data()).Data(); + qa.fQACorrelationsVsHistogramsName2D[eCorrelations_vs_MeantpcNClsCrossedRows] = TString::Format("%s_vs_%s", "Correlations", ph.fParticleHistogramsName[etpcNClsCrossedRows].Data()).Data(); + qa.fQACorrelationsVsHistogramsName2D[eCorrelations_vs_MeanitsNCls] = TString::Format("%s_vs_%s", "Correlations", ph.fParticleHistogramsName[eitsNCls].Data()).Data(); + qa.fQACorrelationsVsHistogramsName2D[eCorrelations_vs_MeanitsNClsInnerBarrel] = TString::Format("%s_vs_%s", "Correlations", ph.fParticleHistogramsName[eitsNClsInnerBarrel].Data()).Data(); + qa.fQACorrelationsVsHistogramsName2D[eCorrelations_vs_MeantpcCrossedRowsOverFindableCls] = TString::Format("%s_vs_%s", "Correlations", ph.fParticleHistogramsName[etpcCrossedRowsOverFindableCls].Data()).Data(); + qa.fQACorrelationsVsHistogramsName2D[eCorrelations_vs_MeantpcFoundOverFindableCls] = TString::Format("%s_vs_%s", "Correlations", ph.fParticleHistogramsName[etpcFoundOverFindableCls].Data()).Data(); + qa.fQACorrelationsVsHistogramsName2D[eCorrelations_vs_MeantpcFractionSharedCls] = TString::Format("%s_vs_%s", "Correlations", ph.fParticleHistogramsName[etpcFractionSharedCls].Data()).Data(); + qa.fQACorrelationsVsHistogramsName2D[eCorrelations_vs_MeantpcChi2NCl] = TString::Format("%s_vs_%s", "Correlations", ph.fParticleHistogramsName[etpcChi2NCl].Data()).Data(); + qa.fQACorrelationsVsHistogramsName2D[eCorrelations_vs_MeandcaXY] = TString::Format("%s_vs_%s", "Correlations", ph.fParticleHistogramsName[edcaXY].Data()).Data(); + qa.fQACorrelationsVsHistogramsName2D[eCorrelations_vs_MeandcaZ] = TString::Format("%s_vs_%s", "Correlations", ph.fParticleHistogramsName[edcaZ].Data()).Data(); + // ... // ***) Quick insanity check that all names are set: @@ -1032,6 +1055,8 @@ void DefaultBooking() qa.fBookQAEventHistograms2D[eCentrality_vs_InteractionRate] = Alright(lBookQAEventHistograms2D[eCentrality_vs_InteractionRate]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eVertex_z_vs_Occupancy] = Alright(lBookQAEventHistograms2D[eVertex_z_vs_Occupancy]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eVertex_z_vs_InteractionRate] = Alright(lBookQAEventHistograms2D[eVertex_z_vs_InteractionRate]) && qa.fFillQAEventHistograms2D; + qa.fBookQAEventHistograms2D[eMultiplicity_vs_FT0CAmplitudeOnFoundBC] = Alright(lBookQAEventHistograms2D[eMultiplicity_vs_FT0CAmplitudeOnFoundBC]) && qa.fFillQAEventHistograms2D; + qa.fBookQAEventHistograms2D[eCentFT0C_vs_FT0CAmplitudeOnFoundBC] = Alright(lBookQAEventHistograms2D[eCentFT0C_vs_FT0CAmplitudeOnFoundBC]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eMultNTracksPV_vs_MultNTracksGlobal] = Alright(lBookQAEventHistograms2D[eMultNTracksPV_vs_MultNTracksGlobal]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eCentFT0C_vs_CentFT0CVariant1] = Alright(lBookQAEventHistograms2D[eCentFT0C_vs_CentFT0CVariant1]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eCentFT0C_vs_CentFT0M] = Alright(lBookQAEventHistograms2D[eCentFT0C_vs_CentFT0M]) && qa.fFillQAEventHistograms2D; @@ -1129,6 +1154,20 @@ void DefaultBooking() qa.fBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeanPhi] = Alright(lBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeanPhi]) && qa.fFillQACorrelationsVsHistograms2D; qa.fBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeanPt] = Alright(lBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeanPt]) && qa.fFillQACorrelationsVsHistograms2D; qa.fBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeanEta] = Alright(lBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeanEta]) && qa.fFillQACorrelationsVsHistograms2D; + qa.fBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeanCharge] = Alright(lBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeanCharge]) && qa.fFillQACorrelationsVsHistograms2D; + qa.fBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcNClsFindable] = Alright(lBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcNClsFindable]) && qa.fFillQACorrelationsVsHistograms2D; + qa.fBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcNClsShared] = Alright(lBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcNClsShared]) && qa.fFillQACorrelationsVsHistograms2D; + qa.fBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeanitsChi2NCl] = Alright(lBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeanitsChi2NCl]) && qa.fFillQACorrelationsVsHistograms2D; + qa.fBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcNClsFound] = Alright(lBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcNClsFound]) && qa.fFillQACorrelationsVsHistograms2D; + qa.fBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcNClsCrossedRows] = Alright(lBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcNClsCrossedRows]) && qa.fFillQACorrelationsVsHistograms2D; + qa.fBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeanitsNCls] = Alright(lBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeanitsNCls]) && qa.fFillQACorrelationsVsHistograms2D; + qa.fBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeanitsNClsInnerBarrel] = Alright(lBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeanitsNClsInnerBarrel]) && qa.fFillQACorrelationsVsHistograms2D; + qa.fBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcCrossedRowsOverFindableCls] = Alright(lBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcCrossedRowsOverFindableCls]) && qa.fFillQACorrelationsVsHistograms2D; + qa.fBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcFoundOverFindableCls] = Alright(lBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcFoundOverFindableCls]) && qa.fFillQACorrelationsVsHistograms2D; + qa.fBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcFractionSharedCls] = Alright(lBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcFractionSharedCls]) && qa.fFillQACorrelationsVsHistograms2D; + qa.fBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcChi2NCl] = Alright(lBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcChi2NCl]) && qa.fFillQACorrelationsVsHistograms2D; + qa.fBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeandcaXY] = Alright(lBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeandcaXY]) && qa.fFillQACorrelationsVsHistograms2D; + qa.fBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeandcaZ] = Alright(lBookQACorrelationsVsHistograms2D[eCorrelations_vs_MeandcaZ]) && qa.fFillQACorrelationsVsHistograms2D; // ..... // *) min and max harmonics for which this series of histograms will be booked: @@ -1226,9 +1265,9 @@ void DefaultBinning() eh.fEventHistogramsBins[eMultiplicity][1] = 0.; eh.fEventHistogramsBins[eMultiplicity][2] = 20000.; - eh.fEventHistogramsBins[eReferenceMultiplicity][0] = 6000.; + eh.fEventHistogramsBins[eReferenceMultiplicity][0] = 700.; // bin width is 100 eh.fEventHistogramsBins[eReferenceMultiplicity][1] = 0.; - eh.fEventHistogramsBins[eReferenceMultiplicity][2] = 60000.; + eh.fEventHistogramsBins[eReferenceMultiplicity][2] = 70000.; eh.fEventHistogramsBins[eCentrality][0] = 110; // intentionally, because if centrality is not determined, it's set to 105.0 at the moment eh.fEventHistogramsBins[eCentrality][1] = 0.; @@ -1246,9 +1285,9 @@ void DefaultBinning() eh.fEventHistogramsBins[eVertex_z][1] = -40.; eh.fEventHistogramsBins[eVertex_z][2] = 40.; - eh.fEventHistogramsBins[eNContributors][0] = 1000.; + eh.fEventHistogramsBins[eNContributors][0] = 600.; // bin width is 20 eh.fEventHistogramsBins[eNContributors][1] = 0.; - eh.fEventHistogramsBins[eNContributors][2] = 10000.; + eh.fEventHistogramsBins[eNContributors][2] = 12000.; eh.fEventHistogramsBins[eImpactParameter][0] = 1000; eh.fEventHistogramsBins[eImpactParameter][1] = 0.; @@ -1683,6 +1722,9 @@ void DefaultCuts() ec.fUseEventCuts[eNoPileupTPC] = Alright(lUseEventCuts[eNoPileupTPC]); ec.fUseEventCuts[eNoPileupFromSPD] = Alright(lUseEventCuts[eNoPileupFromSPD]); ec.fUseEventCuts[eNoSPDOnVsOfPileup] = Alright(lUseEventCuts[eNoSPDOnVsOfPileup]); + ec.fUseEventCuts[eRefMult_vs_NContr_Up] = Alright(lUseEventCuts[eRefMult_vs_NContr_Up]); + ec.fUseEventCuts[eRefMult_vs_NContr_Low] = Alright(lUseEventCuts[eRefMult_vs_NContr_Low]); + ec.fUseEventCuts[eCentralityCorrelationsCut] = Alright(lUseEventCuts[eCentralityCorrelationsCut]); ec.fUseEventCuts[eCentralityWeights] = Alright(lUseEventCuts[eCentralityWeights]); // **) event cuts defined via booleans: @@ -1778,7 +1820,7 @@ void DefaultCuts() ec.fdEventCuts[eSelectedEvents][eMax] = lSelectedEvents[eMax]; ec.fdEventCuts[eMinVertexDistanceFromIP][eMin] = cf_ec.cfMinVertexDistanceFromIP; // if vertex is closer to IP than this value, the event is rejected - ec.fdEventCuts[eMinVertexDistanceFromIP][eMax] = -1; // // this value is never checked in any case + ec.fdEventCuts[eMinVertexDistanceFromIP][eMax] = -1; // this value is never checked in any case // **) event cuts defined via string: ec.fsEventCuts[eMultiplicityEstimator] = cf_ec.cfMultiplicityEstimator; @@ -1786,6 +1828,13 @@ void DefaultCuts() ec.fsEventCuts[eCentralityEstimator] = cf_ec.cfCentralityEstimator; ec.fsEventCuts[eTrigger] = cf_ec.cfTrigger; ec.fsEventCuts[eOccupancyEstimator] = cf_ec.cfOccupancyEstimator; + ec.fsEventCuts[eRefMult_vs_NContr_Up] = cf_ec.cfRefMult_vs_NContr_Up; + ec.fsEventCuts[eRefMult_vs_NContr_Low] = cf_ec.cfRefMult_vs_NContr_Low; + ec.fsEventCuts[eCentralityCorrelationsCut] = cf_ec.cfCentralityCorrelationsCut; + + // **) additional info for some specific event cuts, which I didn't enumerate in enum eEventCuts, to trim down bookeeping: + ec.fCentralityCorrelationsCutTreshold = cf_ec.cfCentralityCorrelationsCutTreshold; + ec.fCentralityCorrelationsCutVersion = cf_ec.cfCentralityCorrelationsCutVersion; // ---------------------------------------------------------------------- @@ -1991,6 +2040,23 @@ void SpecificCuts(TString whichSpecificCuts) ec.fUseEventCuts[eNoPileupFromSPD] = false; // Run 2 ec.fUseEventCuts[eNoSPDOnVsOfPileup] = false; // Run 2 + ec.fUseEventCuts[eInteractionRate] = true; + ec.fdEventCuts[eInteractionRate][eMin] = 0.1; // there are some pathological non-physical events with IR = 0. See eCorrelationsVsInteractionRate_vs_ReferenceMultiplicity + ec.fdEventCuts[eInteractionRate][eMax] = 1000000000.; + + ec.fUseEventCuts[eRefMult_vs_NContr_Up] = true; + ec.fUseEventCuts[eRefMult_vs_NContr_Low] = true; + if (ec.fsEventCuts[eReferenceMultiplicityEstimator].EqualTo("MultFT0C")) { + ec.fsEventCuts[eRefMult_vs_NContr_Up] = "1200. + 0.20*x"; // TBI 20250401 not fine-tune, just an example + ec.fsEventCuts[eRefMult_vs_NContr_Low] = "-650. + 0.08*x"; // TBI 20250401 not fine-tune, just an example + // TBI 20250331 fine-tune this cut in the same spirit for other ref. mult. estimators + } + + ec.fUseEventCuts[eCentralityCorrelationsCut] = true; + ec.fsEventCuts[eCentralityCorrelationsCut] = "CentFT0C_CentFT0M"; + ec.fCentralityCorrelationsCutTreshold = 10.0; + ec.fCentralityCorrelationsCutVersion = "Absolute"; + // Particle cuts: pc.fUseParticleCuts[eitsNCls] = true; pc.fdParticleCuts[eitsNCls][eMin] = 5.; @@ -2021,12 +2087,12 @@ void SpecificCuts(TString whichSpecificCuts) pc.fdParticleCuts[etpcChi2NCl][eMax] = 4.0; pc.fUseParticleCuts[edcaXY] = true; - pc.fdParticleCuts[edcaXY][eMin] = -2.4; - pc.fdParticleCuts[edcaXY][eMax] = 2.4; + pc.fdParticleCuts[edcaXY][eMin] = -2.4; // TBI 20250401 check further + pc.fdParticleCuts[edcaXY][eMax] = 2.4; // TBI 20250401 check further pc.fUseParticleCuts[edcaZ] = true; - pc.fdParticleCuts[edcaZ][eMin] = -3.2; - pc.fdParticleCuts[edcaZ][eMax] = 3.2; + pc.fdParticleCuts[edcaZ][eMin] = -3.2; // TBI 20250401 check further + pc.fdParticleCuts[edcaZ][eMax] = 3.2; // TBI 20250401 check further pc.fUseParticleCuts[eisInAcceptanceTrack] = false; // see enum pc.fUseParticleCuts[eisGlobalTrack] = false; // only for Run 2 @@ -2057,6 +2123,23 @@ void SpecificCuts(TString whichSpecificCuts) ec.fUseEventCuts[eNoPileupFromSPD] = false; // Run 2 ec.fUseEventCuts[eNoSPDOnVsOfPileup] = false; // Run 2 + ec.fUseEventCuts[eInteractionRate] = true; + ec.fdEventCuts[eInteractionRate][eMin] = 0.1; // there are some pathological non-physical events with IR = 0. See eCorrelationsVsInteractionRate_vs_ReferenceMultiplicity + ec.fdEventCuts[eInteractionRate][eMax] = 1000000000.; + + ec.fUseEventCuts[eRefMult_vs_NContr_Up] = false; // TBI 20250331 set to true only when I fine-tune + ec.fUseEventCuts[eRefMult_vs_NContr_Low] = false; // TBI 20250331 set to true only when I fine-tune + if (ec.fsEventCuts[eReferenceMultiplicityEstimator].EqualTo("MultFT0C")) { + ec.fsEventCuts[eRefMult_vs_NContr_Up] = "..."; // TBI 20250329 I need to tune and validate for this dataset, and estimator + ec.fsEventCuts[eRefMult_vs_NContr_Low] = "..."; // TBI 20250329 I need to tune and validate for this dataset, and estimator + // TBI 20250331 fine-tune this cut in the same spirit for other ref. mult. estimators + } + + ec.fUseEventCuts[eCentralityCorrelationsCut] = false; // TBI 20250104 yes, because in 2024 I can use only FT0C at the moment + ec.fsEventCuts[eCentralityCorrelationsCut] = "CentFT0C_CentFT0M"; + ec.fCentralityCorrelationsCutTreshold = 10.0; + ec.fCentralityCorrelationsCutVersion = "Absolute"; + // Particle cuts: pc.fUseParticleCuts[eitsNCls] = true; pc.fdParticleCuts[eitsNCls][eMin] = 5.; @@ -2087,12 +2170,12 @@ void SpecificCuts(TString whichSpecificCuts) pc.fdParticleCuts[etpcChi2NCl][eMax] = 4.0; pc.fUseParticleCuts[edcaXY] = true; - pc.fdParticleCuts[edcaXY][eMin] = -2.4; - pc.fdParticleCuts[edcaXY][eMax] = 2.4; + pc.fdParticleCuts[edcaXY][eMin] = -2.4; // TBI 20250401 check further + pc.fdParticleCuts[edcaXY][eMax] = 2.4; // TBI 20250401 check further pc.fUseParticleCuts[edcaZ] = true; - pc.fdParticleCuts[edcaZ][eMin] = -3.2; - pc.fdParticleCuts[edcaZ][eMax] = 3.2; + pc.fdParticleCuts[edcaZ][eMin] = -3.2; // TBI 20250401 check further + pc.fdParticleCuts[edcaZ][eMax] = 3.2; // TBI 20250401 check further pc.fUseParticleCuts[eisInAcceptanceTrack] = false; // see enum pc.fUseParticleCuts[eisGlobalTrack] = false; // only for Run 2 @@ -2106,6 +2189,9 @@ void SpecificCuts(TString whichSpecificCuts) // In this branch I implement default cuts and settings for Run 2 datasets: // Event cuts: + ec.fUseEventCuts[eOccupancy] = false; + ec.fUseEventCuts[eInteractionRate] = false; + ec.fUseEventCuts[eCurrentRunDuration] = false; // ec.fUseEventCuts[eSel7] = true; // TBI 20250115 ehen i procees in "Rec" some converted Run 2 MC, it removes 99% of events, see enum ec.fUseEventCuts[eSel8] = false; ec.fUseEventCuts[eNoSameBunchPileup] = false; @@ -2122,8 +2208,24 @@ void SpecificCuts(TString whichSpecificCuts) ec.fUseEventCuts[eIsGoodITSLayer0123] = false; ec.fUseEventCuts[eIsGoodITSLayersAll] = false; - // ec.fUseEventCuts[eTrigger] = true; - // ec.fsEventCuts[eTrigger] = "kINT7"; // TBI 20250115 cannot be used when i procees in "Rec" some converted Run 2 MC, see enum + ec.fUseEventCuts[eTrigger] = true; + ec.fsEventCuts[eTrigger] = "kINT7"; // TBI 20250115 remember that it cannot be used when i procees in "Rec" some converted Run 2 MC, see enum + + ec.fsEventCuts[eReferenceMultiplicityEstimator] = "MultTracklets"; // default ref. mult. estimator in Run 2 + ec.fsEventCuts[eCentralityEstimator] = "CentRun2V0M"; // default centrality estimator in Run 2 + + ec.fUseEventCuts[eRefMult_vs_NContr_Up] = true; + ec.fUseEventCuts[eRefMult_vs_NContr_Low] = true; + if (ec.fsEventCuts[eReferenceMultiplicityEstimator].EqualTo("MultTracklets")) { + ec.fsEventCuts[eRefMult_vs_NContr_Up] = "700. + 0.95*x"; // TBI 20250401 not fine-tune, just an example + ec.fsEventCuts[eRefMult_vs_NContr_Low] = "-400. + 0.5*x"; // TBI 20250401 not fine-tune, just an example + // TBI 20250331 fine-tune this cut in the same spirit for other ref. mult. estimators + } + + ec.fUseEventCuts[eCentralityCorrelationsCut] = true; + ec.fsEventCuts[eCentralityCorrelationsCut] = "CentRun2V0M_vs_CentRun2SPDTracklets"; + ec.fCentralityCorrelationsCutTreshold = 10.0; + ec.fCentralityCorrelationsCutVersion = "Absolute"; // ... @@ -2148,6 +2250,30 @@ void SpecificCuts(TString whichSpecificCuts) es.fCalculateEtaSeparationsAsFunctionOf[AFO_INTERACTIONRATE] = false; es.fCalculateEtaSeparationsAsFunctionOf[AFO_CURRENTRUNDURATION] = false; + eh.fBookEventHistograms[eOccupancy] = false; + eh.fBookEventHistograms[eInteractionRate] = false; + eh.fBookEventHistograms[eCurrentRunDuration] = false; + + qa.fBookQAEventHistograms2D[eMultiplicity_vs_Occupancy] = false; + qa.fBookQAEventHistograms2D[eMultiplicity_vs_InteractionRate] = false; + qa.fBookQAEventHistograms2D[eReferenceMultiplicity_vs_Occupancy] = false; + qa.fBookQAEventHistograms2D[eReferenceMultiplicity_vs_InteractionRate] = false; + qa.fBookQAEventHistograms2D[eNContributors_vs_Occupancy] = false; + qa.fBookQAEventHistograms2D[eNContributors_vs_InteractionRate] = false; + qa.fBookQAEventHistograms2D[eCentrality_vs_Occupancy] = false; + qa.fBookQAEventHistograms2D[eCentrality_vs_InteractionRate] = false; + qa.fBookQAEventHistograms2D[eVertex_z_vs_Occupancy] = false; + qa.fBookQAEventHistograms2D[eVertex_z_vs_InteractionRate] = false; + qa.fBookQAEventHistograms2D[eMultiplicity_vs_FT0CAmplitudeOnFoundBC] = false; + qa.fBookQAEventHistograms2D[eCentFT0C_vs_FT0CAmplitudeOnFoundBC] = false; + qa.fBookQAEventHistograms2D[eCentFT0C_vs_CentFT0CVariant1] = false; + qa.fBookQAEventHistograms2D[eCentFT0C_vs_CentFT0M] = false; + qa.fBookQAEventHistograms2D[eCentFT0C_vs_CentFV0A] = false; + qa.fBookQAEventHistograms2D[eCentFT0C_vs_CentNTPV] = false; + qa.fBookQAEventHistograms2D[eCentFT0C_vs_CentNGlobal] = false; + qa.fBookQAEventHistograms2D[eCentFT0M_vs_CentNTPV] = false; + qa.fBookQAEventHistograms2D[eTrackOccupancyInTimeRange_vs_FT0COccupancyInTimeRange] = false; + // ... break; @@ -2474,7 +2600,7 @@ void InsanityChecksBeforeBooking() // **) Supported reference multiplicity estimators for Run 1 and 2 are enlisted here: if (tc.fProcess[eProcessRec_Run2] || tc.fProcess[eProcessRecSim_Run2] || tc.fProcess[eProcessRec_Run1] || tc.fProcess[eProcessRecSim_Run1]) { if (!(ec.fsEventCuts[eReferenceMultiplicityEstimator].EqualTo("MultTracklets", TString::kIgnoreCase))) { - LOGF(fatal, "\033[1;31m%s at line %d : reference multiplicity estimator = %s is not supported yet for Run 1 and 2 analysis.\nUse \"MultTracklets\"\033[0m", __FUNCTION__, __LINE__, ec.fsEventCuts[eReferenceMultiplicityEstimator].Data()); + LOGF(fatal, "\033[1;31m%s at line %d : reference multiplicity estimator = %s is not supported for Run 1 and 2 analysis.\nUse \"MultTracklets\"\033[0m", __FUNCTION__, __LINE__, ec.fsEventCuts[eReferenceMultiplicityEstimator].Data()); } } else if (tc.fProcess[eProcessSim_Run2] || tc.fProcess[eProcessSim_Run1]) { LOGF(fatal, "\033[1;31m%s at line %d : eProcessSim is not validated yet \033[0m", __FUNCTION__, __LINE__); @@ -2484,7 +2610,7 @@ void InsanityChecksBeforeBooking() if (tc.fProcess[eProcessRec_Run2] || tc.fProcess[eProcessRecSim_Run2] || tc.fProcess[eProcessSim_Run2] || tc.fProcess[eProcessRec_Run1] || tc.fProcess[eProcessRecSim_Run1] || tc.fProcess[eProcessSim_Run1]) { if (!(ec.fsEventCuts[eCentralityEstimator].EqualTo("centRun2V0M", TString::kIgnoreCase) || ec.fsEventCuts[eCentralityEstimator].EqualTo("centRun2SPDTracklets", TString::kIgnoreCase))) { - LOGF(fatal, "\033[1;31m%s at line %d : centrality estimator = %s is not supported yet for converted Run 2 and Run 1 analysis.\nUse either \"centRun2V0M\" or \"centRun2SPDTracklets\" (case sensitive!) \033[0m", __FUNCTION__, __LINE__, ec.fsEventCuts[eCentralityEstimator].Data()); + LOGF(fatal, "\033[1;31m%s at line %d : centrality estimator = %s is not supported for converted Run 2 and Run 1 analysis.\nUse either \"centRun2V0M\" or \"centRun2SPDTracklets\" (case sensitive!) \033[0m", __FUNCTION__, __LINE__, ec.fsEventCuts[eCentralityEstimator].Data()); } } @@ -2541,91 +2667,91 @@ void InsanityChecksBeforeBooking() // c) Ensure that Run 3 specific cuts and flags are used only in Run 3 (both data and sim): // **) Ensure that eSel8 is used only in Run 3 (both data and sim): if (ec.fUseEventCuts[eSel8]) { - if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim])) { + if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim] || tc.fProcess[eProcessQA])) { LOGF(fatal, "\033[1;31m%s at line %d : use eSel8 only for Run 3 data and MC\033[0m", __FUNCTION__, __LINE__); } } if (ec.fUseEventCuts[eNoSameBunchPileup]) { - if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim])) { + if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim] || tc.fProcess[eProcessQA])) { LOGF(fatal, "\033[1;31m%s at line %d : use eNoSameBunchPileup only for Run 3 data and MC\033[0m", __FUNCTION__, __LINE__); } } if (ec.fUseEventCuts[eIsGoodZvtxFT0vsPV]) { - if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim])) { + if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim] || tc.fProcess[eProcessQA])) { LOGF(fatal, "\033[1;31m%s at line %d : use eIsGoodZvtxFT0vsPV only for Run 3 data and MC\033[0m", __FUNCTION__, __LINE__); } } if (ec.fUseEventCuts[eIsVertexITSTPC]) { - if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim])) { + if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim] || tc.fProcess[eProcessQA])) { LOGF(fatal, "\033[1;31m%s at line %d : use eIsVertexITSTPC only for Run 3 data and MC\033[0m", __FUNCTION__, __LINE__); } } if (ec.fUseEventCuts[eIsVertexTOFmatched]) { - if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim])) { + if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim] || tc.fProcess[eProcessQA])) { LOGF(fatal, "\033[1;31m%s at line %d : use eIsVertexTOFmatched only for Run 3 data and MC\033[0m", __FUNCTION__, __LINE__); } } if (ec.fUseEventCuts[eIsVertexTRDmatched]) { - if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim])) { + if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim] || tc.fProcess[eProcessQA])) { LOGF(fatal, "\033[1;31m%s at line %d : use eIsVertexTRDmatched only for Run 3 data and MC\033[0m", __FUNCTION__, __LINE__); } } if (ec.fUseEventCuts[eNoCollInTimeRangeStrict]) { - if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim])) { + if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim] || tc.fProcess[eProcessQA])) { LOGF(fatal, "\033[1;31m%s at line %d : use eNoCollInTimeRangeStrict only for Run 3 data and MC\033[0m", __FUNCTION__, __LINE__); } } if (ec.fUseEventCuts[eNoCollInTimeRangeStandard]) { - if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim])) { + if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim] || tc.fProcess[eProcessQA])) { LOGF(fatal, "\033[1;31m%s at line %d : use eNoCollInTimeRangeStandard only for Run 3 data and MC\033[0m", __FUNCTION__, __LINE__); } } if (ec.fUseEventCuts[eNoCollInRofStrict]) { - if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim])) { + if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim] || tc.fProcess[eProcessQA])) { LOGF(fatal, "\033[1;31m%s at line %d : use eNoCollInRofStrict only for Run 3 data and MC\033[0m", __FUNCTION__, __LINE__); } } if (ec.fUseEventCuts[eNoCollInRofStandard]) { - if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim])) { + if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim] || tc.fProcess[eProcessQA])) { LOGF(fatal, "\033[1;31m%s at line %d : use eNoCollInRofStandard only for Run 3 data and MC\033[0m", __FUNCTION__, __LINE__); } } if (ec.fUseEventCuts[eNoHighMultCollInPrevRof]) { - if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim])) { + if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim] || tc.fProcess[eProcessQA])) { LOGF(fatal, "\033[1;31m%s at line %d : use eNoHighMultCollInPrevRof only for Run 3 data and MC\033[0m", __FUNCTION__, __LINE__); } } if (ec.fUseEventCuts[eIsGoodITSLayer3]) { - if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim])) { + if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim] || tc.fProcess[eProcessQA])) { LOGF(fatal, "\033[1;31m%s at line %d : use eIsGoodITSLayer3 only for Run 3 data and MC\033[0m", __FUNCTION__, __LINE__); } } if (ec.fUseEventCuts[eIsGoodITSLayer0123]) { - if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim])) { + if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim] || tc.fProcess[eProcessQA])) { LOGF(fatal, "\033[1;31m%s at line %d : use eIsGoodITSLayer0123 only for Run 3 data and MC\033[0m", __FUNCTION__, __LINE__); } } if (ec.fUseEventCuts[eIsGoodITSLayersAll]) { - if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim])) { + if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim] || tc.fProcess[eProcessQA])) { LOGF(fatal, "\033[1;31m%s at line %d : use eIsGoodITSLayersAll only for Run 3 data and MC\033[0m", __FUNCTION__, __LINE__); } } // **) Supported reference multiplicity estimators for Run 3 are enlisted here: - if (tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim]) { + if (tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessQA]) { if (!(ec.fsEventCuts[eReferenceMultiplicityEstimator].EqualTo("MultTPC", TString::kIgnoreCase) || ec.fsEventCuts[eReferenceMultiplicityEstimator].EqualTo("MultFV0M", TString::kIgnoreCase) || ec.fsEventCuts[eReferenceMultiplicityEstimator].EqualTo("MultFT0C", TString::kIgnoreCase) || @@ -2638,7 +2764,7 @@ void InsanityChecksBeforeBooking() } // **) Supported centrality estimators for Run 3 are enlisted here: - if (tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim]) { + if (tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessQA]) { if (!(ec.fsEventCuts[eCentralityEstimator].EqualTo("centFT0C", TString::kIgnoreCase) || ec.fsEventCuts[eCentralityEstimator].EqualTo("centFT0CVariant1", TString::kIgnoreCase) || ec.fsEventCuts[eCentralityEstimator].EqualTo("centFT0M", TString::kIgnoreCase) || @@ -2652,7 +2778,7 @@ void InsanityChecksBeforeBooking() } // **) Supported occupancy estimators for Run 3 are enlisted here: - if (tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim]) { + if (tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessQA]) { if (!(ec.fsEventCuts[eOccupancyEstimator].EqualTo("TrackOccupancyInTimeRange", TString::kIgnoreCase) || ec.fsEventCuts[eOccupancyEstimator].EqualTo("FT0COccupancyInTimeRange", TString::kIgnoreCase))) { LOGF(fatal, "\033[1;31m%s at line %d : occupancy estimator = %s is not supported yet for Run 3 analysis. \033[0m", __FUNCTION__, __LINE__, ec.fsEventCuts[eOccupancyEstimator].Data()); @@ -2660,7 +2786,7 @@ void InsanityChecksBeforeBooking() } // **) Protection against particle cuts which are available, but not yet validated, or are meaningless, in Run 3: - if (tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim]) { + if (tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim] || tc.fProcess[eProcessQA]) { if (pc.fUseParticleCuts[etrackCutFlag]) { LOGF(fatal, "\033[1;31m%s at line %d : particle cut trackCutFlag is not validated in Run 3 as of 20250113 => it has no effect\033[0m", __FUNCTION__, __LINE__); } @@ -2680,14 +2806,14 @@ void InsanityChecksBeforeBooking() // isPVContributor: if (pc.fUseParticleCuts[eisPVContributor]) { - if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim])) { + if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim] || tc.fProcess[eProcessQA])) { LOGF(fatal, "\033[1;31m%s at line %d : particle cut isPVContributor can be used only in Run 3\033[0m", __FUNCTION__, __LINE__); } } // **) Protection for histograms which are meaningfull only in Run 3: // ***) interaction rate is available only in Run 3: - if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim])) { + if (!(tc.fProcess[eProcessRec] || tc.fProcess[eProcessRecSim] || tc.fProcess[eProcessSim] || tc.fProcess[eProcessQA])) { if (qa.fFillQACorrelationsVsInteractionRateVsProfiles2D) { LOGF(fatal, "\033[1;31m%s at line %d : fFillQACorrelationsVsInteractionRateVsProfiles2D can be used only in Run 3, because only there ir is available.\033[0m", __FUNCTION__, __LINE__); } @@ -3139,12 +3265,12 @@ void BookQAHistograms() max_y_Event[eMultiplicity_vs_InteractionRate] = eh.fEventHistogramsBins[eInteractionRate][2]; title_y_Event[eMultiplicity_vs_InteractionRate] = FancyFormatting(eh.fEventHistogramsName[eInteractionRate].Data()); - // *) "ReferenceMultiplicity_vs_NContributors": - nBins_x_Event[eReferenceMultiplicity_vs_NContributors] = static_cast(eh.fEventHistogramsBins[eReferenceMultiplicity][0] / qa.fRebin); + // *) "ReferenceMultiplicity_vs_NContributors": // TBI 20250401 I use this one to calculate quantiles for HMO cut, therefore I keep it refined for the time being + nBins_x_Event[eReferenceMultiplicity_vs_NContributors] = static_cast(eh.fEventHistogramsBins[eReferenceMultiplicity][0]); min_x_Event[eReferenceMultiplicity_vs_NContributors] = eh.fEventHistogramsBins[eReferenceMultiplicity][1]; max_x_Event[eReferenceMultiplicity_vs_NContributors] = eh.fEventHistogramsBins[eReferenceMultiplicity][2]; title_x_Event[eReferenceMultiplicity_vs_NContributors] = FancyFormatting(eh.fEventHistogramsName[eReferenceMultiplicity].Data()); - nBins_y_Event[eReferenceMultiplicity_vs_NContributors] = static_cast(eh.fEventHistogramsBins[eNContributors][0] / qa.fRebin); + nBins_y_Event[eReferenceMultiplicity_vs_NContributors] = static_cast(eh.fEventHistogramsBins[eNContributors][0]); min_y_Event[eReferenceMultiplicity_vs_NContributors] = eh.fEventHistogramsBins[eNContributors][1]; max_y_Event[eReferenceMultiplicity_vs_NContributors] = eh.fEventHistogramsBins[eNContributors][2]; title_y_Event[eReferenceMultiplicity_vs_NContributors] = FancyFormatting(eh.fEventHistogramsName[eNContributors].Data()); @@ -3289,7 +3415,28 @@ void BookQAHistograms() max_y_Event[eVertex_z_vs_InteractionRate] = eh.fEventHistogramsBins[eInteractionRate][2]; title_y_Event[eVertex_z_vs_InteractionRate] = FancyFormatting(eh.fEventHistogramsName[eInteractionRate].Data()); - // *) "eMultNTracksPV_vs_MultNTracksGlobal": + // *) "Multiplicity_vs_FT0CAmplitudeOnFoundBC": + // nBins_x_Event[eMultiplicity_vs_FT0CAmplitudeOnFoundBC] = static_cast(eh.fEventHistogramsBins[eMultiplicity][0]); + nBins_x_Event[eMultiplicity_vs_FT0CAmplitudeOnFoundBC] = 2000.; // TBI 20250331 hardwired value + min_x_Event[eMultiplicity_vs_FT0CAmplitudeOnFoundBC] = eh.fEventHistogramsBins[eMultiplicity][1]; + max_x_Event[eMultiplicity_vs_FT0CAmplitudeOnFoundBC] = eh.fEventHistogramsBins[eMultiplicity][2]; + title_x_Event[eMultiplicity_vs_FT0CAmplitudeOnFoundBC] = FancyFormatting(eh.fEventHistogramsName[eMultiplicity].Data()); + nBins_y_Event[eMultiplicity_vs_FT0CAmplitudeOnFoundBC] = 1000; // TBI 20250331 hardwired value + min_y_Event[eMultiplicity_vs_FT0CAmplitudeOnFoundBC] = 0.; // TBI 20250331 hardwired value + max_y_Event[eMultiplicity_vs_FT0CAmplitudeOnFoundBC] = 100000.; // TBI 20250331 hardwired value + title_y_Event[eMultiplicity_vs_FT0CAmplitudeOnFoundBC] = "FT0CAmplitudeOnFoundBC"; // TBI 20250331 hardwired string + + // *) "CentFT0C_vs_FT0CAmplitudeOnFoundBC": + nBins_x_Event[eCentFT0C_vs_FT0CAmplitudeOnFoundBC] = eh.fEventHistogramsBins[eCentrality][0]; // yes, eCentrality, not eCentFT0C, just think of it ! + min_x_Event[eCentFT0C_vs_FT0CAmplitudeOnFoundBC] = eh.fEventHistogramsBins[eCentrality][1]; + max_x_Event[eCentFT0C_vs_FT0CAmplitudeOnFoundBC] = eh.fEventHistogramsBins[eCentrality][2]; + title_x_Event[eCentFT0C_vs_FT0CAmplitudeOnFoundBC] = FancyFormatting(qa.fCentralityEstimatorName[eCentFT0C].Data()); + nBins_y_Event[eCentFT0C_vs_FT0CAmplitudeOnFoundBC] = 1000; // TBI 20250331 hardwired value + min_y_Event[eCentFT0C_vs_FT0CAmplitudeOnFoundBC] = 0.; // TBI 20250331 hardwired value + max_y_Event[eCentFT0C_vs_FT0CAmplitudeOnFoundBC] = 100000.; // TBI 20250331 hardwired value + title_y_Event[eCentFT0C_vs_FT0CAmplitudeOnFoundBC] = "FT0CAmplitudeOnFoundBC"; // TBI 20250331 hardwired string + + // *) "MultNTracksPV_vs_MultNTracksGlobal": nBins_x_Event[eMultNTracksPV_vs_MultNTracksGlobal] = static_cast(eh.fEventHistogramsBins[eMultiplicity][0] / qa.fRebin); min_x_Event[eMultNTracksPV_vs_MultNTracksGlobal] = eh.fEventHistogramsBins[eMultiplicity][1]; max_x_Event[eMultNTracksPV_vs_MultNTracksGlobal] = eh.fEventHistogramsBins[eMultiplicity][2]; @@ -3299,7 +3446,7 @@ void BookQAHistograms() max_y_Event[eMultNTracksPV_vs_MultNTracksGlobal] = eh.fEventHistogramsBins[eMultiplicity][2]; title_y_Event[eMultNTracksPV_vs_MultNTracksGlobal] = FancyFormatting(qa.fReferenceMultiplicityEstimatorName[eMultNTracksGlobal].Data()); - // *) "eCentFT0C_vs_CentFT0CVariant1": + // *) "CentFT0C_vs_CentFT0CVariant1": nBins_x_Event[eCentFT0C_vs_CentFT0CVariant1] = static_cast(eh.fEventHistogramsBins[eCentrality][0]); min_x_Event[eCentFT0C_vs_CentFT0CVariant1] = eh.fEventHistogramsBins[eCentrality][1]; max_x_Event[eCentFT0C_vs_CentFT0CVariant1] = eh.fEventHistogramsBins[eCentrality][2]; @@ -3309,7 +3456,7 @@ void BookQAHistograms() max_y_Event[eCentFT0C_vs_CentFT0CVariant1] = eh.fEventHistogramsBins[eCentrality][2]; title_y_Event[eCentFT0C_vs_CentFT0CVariant1] = FancyFormatting(qa.fCentralityEstimatorName[eCentFT0CVariant1].Data()); - // *) "eCentFT0C_vs_CentFT0M": + // *) "CentFT0C_vs_CentFT0M": nBins_x_Event[eCentFT0C_vs_CentFT0M] = static_cast(eh.fEventHistogramsBins[eCentrality][0]); min_x_Event[eCentFT0C_vs_CentFT0M] = eh.fEventHistogramsBins[eCentrality][1]; max_x_Event[eCentFT0C_vs_CentFT0M] = eh.fEventHistogramsBins[eCentrality][2]; @@ -3319,7 +3466,7 @@ void BookQAHistograms() max_y_Event[eCentFT0C_vs_CentFT0M] = eh.fEventHistogramsBins[eCentrality][2]; title_y_Event[eCentFT0C_vs_CentFT0M] = FancyFormatting(qa.fCentralityEstimatorName[eCentFT0M].Data()); - // *) "eCentFT0C_vs_CentFV0A": + // *) "CentFT0C_vs_CentFV0A": nBins_x_Event[eCentFT0C_vs_CentFV0A] = static_cast(eh.fEventHistogramsBins[eCentrality][0]); min_x_Event[eCentFT0C_vs_CentFV0A] = eh.fEventHistogramsBins[eCentrality][1]; max_x_Event[eCentFT0C_vs_CentFV0A] = eh.fEventHistogramsBins[eCentrality][2]; @@ -3329,7 +3476,7 @@ void BookQAHistograms() max_y_Event[eCentFT0C_vs_CentFV0A] = eh.fEventHistogramsBins[eCentrality][2]; title_y_Event[eCentFT0C_vs_CentFV0A] = FancyFormatting(qa.fCentralityEstimatorName[eCentFV0A].Data()); - // *) "eCentFT0C_vs_CentNTPV": + // *) "CentFT0C_vs_CentNTPV": nBins_x_Event[eCentFT0C_vs_CentNTPV] = static_cast(eh.fEventHistogramsBins[eCentrality][0]); min_x_Event[eCentFT0C_vs_CentNTPV] = eh.fEventHistogramsBins[eCentrality][1]; max_x_Event[eCentFT0C_vs_CentNTPV] = eh.fEventHistogramsBins[eCentrality][2]; @@ -3339,7 +3486,7 @@ void BookQAHistograms() max_y_Event[eCentFT0C_vs_CentNTPV] = eh.fEventHistogramsBins[eCentrality][2]; title_y_Event[eCentFT0C_vs_CentNTPV] = FancyFormatting(qa.fCentralityEstimatorName[eCentNTPV].Data()); - // *) "eCentFT0C_vs_CentNGlobal": + // *) "CentFT0C_vs_CentNGlobal": nBins_x_Event[eCentFT0C_vs_CentNGlobal] = static_cast(eh.fEventHistogramsBins[eCentrality][0]); min_x_Event[eCentFT0C_vs_CentNGlobal] = eh.fEventHistogramsBins[eCentrality][1]; max_x_Event[eCentFT0C_vs_CentNGlobal] = eh.fEventHistogramsBins[eCentrality][2]; @@ -3349,7 +3496,7 @@ void BookQAHistograms() max_y_Event[eCentFT0C_vs_CentNGlobal] = eh.fEventHistogramsBins[eCentrality][2]; title_y_Event[eCentFT0C_vs_CentNGlobal] = FancyFormatting(qa.fCentralityEstimatorName[eCentNGlobal].Data()); - // *) "eCentFT0M_vs_CentNTPV": + // *) "CentFT0M_vs_CentNTPV": nBins_x_Event[eCentFT0M_vs_CentNTPV] = static_cast(eh.fEventHistogramsBins[eCentrality][0]); min_x_Event[eCentFT0M_vs_CentNTPV] = eh.fEventHistogramsBins[eCentrality][1]; max_x_Event[eCentFT0M_vs_CentNTPV] = eh.fEventHistogramsBins[eCentrality][2]; @@ -3359,7 +3506,7 @@ void BookQAHistograms() max_y_Event[eCentFT0M_vs_CentNTPV] = eh.fEventHistogramsBins[eCentrality][2]; title_y_Event[eCentFT0M_vs_CentNTPV] = FancyFormatting(qa.fCentralityEstimatorName[eCentNTPV].Data()); - // *) "eCentRun2V0M_vs_CentRun2SPDTracklets": + // *) "CentRun2V0M_vs_CentRun2SPDTracklets": nBins_x_Event[eCentRun2V0M_vs_CentRun2SPDTracklets] = static_cast(eh.fEventHistogramsBins[eCentrality][0]); min_x_Event[eCentRun2V0M_vs_CentRun2SPDTracklets] = eh.fEventHistogramsBins[eCentrality][1]; max_x_Event[eCentRun2V0M_vs_CentRun2SPDTracklets] = eh.fEventHistogramsBins[eCentrality][2]; @@ -3369,7 +3516,7 @@ void BookQAHistograms() max_y_Event[eCentRun2V0M_vs_CentRun2SPDTracklets] = eh.fEventHistogramsBins[eCentrality][2]; title_y_Event[eCentRun2V0M_vs_CentRun2SPDTracklets] = FancyFormatting(qa.fCentralityEstimatorName[eCentRun2SPDTracklets].Data()); - // *) "eTrackOccupancyInTimeRange_vs_FT0COccupancyInTimeRange": + // *) "TrackOccupancyInTimeRange_vs_FT0COccupancyInTimeRange": nBins_x_Event[eTrackOccupancyInTimeRange_vs_FT0COccupancyInTimeRange] = static_cast(eh.fEventHistogramsBins[eOccupancy][0] / qa.fRebin); min_x_Event[eTrackOccupancyInTimeRange_vs_FT0COccupancyInTimeRange] = eh.fEventHistogramsBins[eOccupancy][1]; max_x_Event[eTrackOccupancyInTimeRange_vs_FT0COccupancyInTimeRange] = eh.fEventHistogramsBins[eOccupancy][2]; @@ -3379,7 +3526,7 @@ void BookQAHistograms() max_y_Event[eTrackOccupancyInTimeRange_vs_FT0COccupancyInTimeRange] = eh.fEventHistogramsBins[eOccupancy][2]; title_y_Event[eTrackOccupancyInTimeRange_vs_FT0COccupancyInTimeRange] = FancyFormatting(qa.fOccupancyEstimatorName[eFT0COccupancyInTimeRange].Data()); - // *) "eCurrentRunDuration_vs_InteractionRate": + // *) "CurrentRunDuration_vs_InteractionRate": nBins_x_Event[eCurrentRunDuration_vs_InteractionRate] = static_cast(eh.fEventHistogramsBins[eCurrentRunDuration][0] / qa.fRebin); min_x_Event[eCurrentRunDuration_vs_InteractionRate] = eh.fEventHistogramsBins[eCurrentRunDuration][1]; max_x_Event[eCurrentRunDuration_vs_InteractionRate] = eh.fEventHistogramsBins[eCurrentRunDuration][2]; @@ -3726,13 +3873,13 @@ void BookQAHistograms() TString title_y_CorrelationsVs[eQACorrelationsVsHistograms2D_N] = {""}; // *) "eCorrelations_vs_Multiplicity": - nBins_y_CorrelationsVs[eCorrelations_vs_Multiplicity] = static_cast(eh.fEventHistogramsBins[eMultiplicity][0] / qa.fRebin); + nBins_y_CorrelationsVs[eCorrelations_vs_Multiplicity] = static_cast(eh.fEventHistogramsBins[eMultiplicity][0] / 10); // TBI 20250331 here I have temporarily hardwired rebin value min_y_CorrelationsVs[eCorrelations_vs_Multiplicity] = eh.fEventHistogramsBins[eMultiplicity][1]; max_y_CorrelationsVs[eCorrelations_vs_Multiplicity] = eh.fEventHistogramsBins[eMultiplicity][2]; title_y_CorrelationsVs[eCorrelations_vs_Multiplicity] = FancyFormatting(eh.fEventHistogramsName[eMultiplicity].Data()); // *) "eCorrelations_vs_ReferenceMultiplicity": - nBins_y_CorrelationsVs[eCorrelations_vs_ReferenceMultiplicity] = static_cast(eh.fEventHistogramsBins[eReferenceMultiplicity][0] / qa.fRebin); + nBins_y_CorrelationsVs[eCorrelations_vs_ReferenceMultiplicity] = static_cast(eh.fEventHistogramsBins[eReferenceMultiplicity][0] / 10); // TBI 20250331 here I have temporarily hardwired rebin value min_y_CorrelationsVs[eCorrelations_vs_ReferenceMultiplicity] = eh.fEventHistogramsBins[eReferenceMultiplicity][1]; max_y_CorrelationsVs[eCorrelations_vs_ReferenceMultiplicity] = eh.fEventHistogramsBins[eReferenceMultiplicity][2]; title_y_CorrelationsVs[eCorrelations_vs_ReferenceMultiplicity] = FancyFormatting(eh.fEventHistogramsName[eReferenceMultiplicity].Data()); @@ -3752,17 +3899,101 @@ void BookQAHistograms() title_y_CorrelationsVs[eCorrelations_vs_MeanPhi] = FancyFormatting(ph.fParticleHistogramsName[ePhi].Data()); // *) "eCorrelations_vs_MeanPt": - nBins_y_CorrelationsVs[eCorrelations_vs_MeanPt] = 200; + nBins_y_CorrelationsVs[eCorrelations_vs_MeanPt] = 100; min_y_CorrelationsVs[eCorrelations_vs_MeanPt] = 0.0; max_y_CorrelationsVs[eCorrelations_vs_MeanPt] = 2.0; title_y_CorrelationsVs[eCorrelations_vs_MeanPt] = FancyFormatting(ph.fParticleHistogramsName[ePt].Data()); // *) "eCorrelations_vs_MeanEta": - nBins_y_CorrelationsVs[eCorrelations_vs_MeanEta] = 600; + nBins_y_CorrelationsVs[eCorrelations_vs_MeanEta] = 200; min_y_CorrelationsVs[eCorrelations_vs_MeanEta] = -0.3; max_y_CorrelationsVs[eCorrelations_vs_MeanEta] = 0.3; title_y_CorrelationsVs[eCorrelations_vs_MeanEta] = FancyFormatting(ph.fParticleHistogramsName[eEta].Data()); + // *) "eCorrelations_vs_MeanCharge": + nBins_y_CorrelationsVs[eCorrelations_vs_MeanCharge] = 200; + min_y_CorrelationsVs[eCorrelations_vs_MeanCharge] = -1.; + max_y_CorrelationsVs[eCorrelations_vs_MeanCharge] = 1.; + title_y_CorrelationsVs[eCorrelations_vs_MeanCharge] = FancyFormatting(ph.fParticleHistogramsName[eCharge].Data()); + + // *) "eCorrelations_vs_MeantpcNClsFindable": + nBins_y_CorrelationsVs[eCorrelations_vs_MeantpcNClsFindable] = 400; + min_y_CorrelationsVs[eCorrelations_vs_MeantpcNClsFindable] = 50.; + max_y_CorrelationsVs[eCorrelations_vs_MeantpcNClsFindable] = 250.; + title_y_CorrelationsVs[eCorrelations_vs_MeantpcNClsFindable] = FancyFormatting(ph.fParticleHistogramsName[etpcNClsFindable].Data()); + + // *) "eCorrelations_vs_MeantpcNClsShared": + nBins_y_CorrelationsVs[eCorrelations_vs_MeantpcNClsShared] = 500; + min_y_CorrelationsVs[eCorrelations_vs_MeantpcNClsShared] = 0.; + max_y_CorrelationsVs[eCorrelations_vs_MeantpcNClsShared] = 100.; + title_y_CorrelationsVs[eCorrelations_vs_MeantpcNClsShared] = FancyFormatting(ph.fParticleHistogramsName[etpcNClsShared].Data()); + + // *) "eCorrelations_vs_MeanitsChi2NCl": + nBins_y_CorrelationsVs[eCorrelations_vs_MeanitsChi2NCl] = 200; + min_y_CorrelationsVs[eCorrelations_vs_MeanitsChi2NCl] = 0.; + max_y_CorrelationsVs[eCorrelations_vs_MeanitsChi2NCl] = 4.; + title_y_CorrelationsVs[eCorrelations_vs_MeanitsChi2NCl] = FancyFormatting(ph.fParticleHistogramsName[eitsChi2NCl].Data()); + + // *) "eCorrelations_vs_MeantpcNClsFound": + nBins_y_CorrelationsVs[eCorrelations_vs_MeantpcNClsFound] = 400; + min_y_CorrelationsVs[eCorrelations_vs_MeantpcNClsFound] = 50.; + max_y_CorrelationsVs[eCorrelations_vs_MeantpcNClsFound] = 250.; + title_y_CorrelationsVs[eCorrelations_vs_MeantpcNClsFound] = FancyFormatting(ph.fParticleHistogramsName[etpcNClsFound].Data()); + + // *) "eCorrelations_vs_MeantpcNClsCrossedRows": + nBins_y_CorrelationsVs[eCorrelations_vs_MeantpcNClsCrossedRows] = 400; + min_y_CorrelationsVs[eCorrelations_vs_MeantpcNClsCrossedRows] = 50.; + max_y_CorrelationsVs[eCorrelations_vs_MeantpcNClsCrossedRows] = 250.; + title_y_CorrelationsVs[eCorrelations_vs_MeantpcNClsCrossedRows] = FancyFormatting(ph.fParticleHistogramsName[etpcNClsCrossedRows].Data()); + + // *) "eCorrelations_vs_MeanitsNCls": + nBins_y_CorrelationsVs[eCorrelations_vs_MeanitsNCls] = 500; + min_y_CorrelationsVs[eCorrelations_vs_MeanitsNCls] = 0.; + max_y_CorrelationsVs[eCorrelations_vs_MeanitsNCls] = 10.; + title_y_CorrelationsVs[eCorrelations_vs_MeanitsNCls] = FancyFormatting(ph.fParticleHistogramsName[eitsNCls].Data()); + + // *) "eCorrelations_vs_MeanitsNClsInnerBarrel": + nBins_y_CorrelationsVs[eCorrelations_vs_MeanitsNClsInnerBarrel] = 400; + min_y_CorrelationsVs[eCorrelations_vs_MeanitsNClsInnerBarrel] = 0.; + max_y_CorrelationsVs[eCorrelations_vs_MeanitsNClsInnerBarrel] = 4.; + title_y_CorrelationsVs[eCorrelations_vs_MeanitsNClsInnerBarrel] = FancyFormatting(ph.fParticleHistogramsName[eitsNClsInnerBarrel].Data()); + + // *) "eCorrelations_vs_MeantpcCrossedRowsOverFindableCls": + nBins_y_CorrelationsVs[eCorrelations_vs_MeantpcCrossedRowsOverFindableCls] = 200; + min_y_CorrelationsVs[eCorrelations_vs_MeantpcCrossedRowsOverFindableCls] = 0.; + max_y_CorrelationsVs[eCorrelations_vs_MeantpcCrossedRowsOverFindableCls] = 2.; + title_y_CorrelationsVs[eCorrelations_vs_MeantpcCrossedRowsOverFindableCls] = FancyFormatting(ph.fParticleHistogramsName[etpcCrossedRowsOverFindableCls].Data()); + + // *) "eCorrelations_vs_MeantpcFoundOverFindableCls": + nBins_y_CorrelationsVs[eCorrelations_vs_MeantpcFoundOverFindableCls] = 200; + min_y_CorrelationsVs[eCorrelations_vs_MeantpcFoundOverFindableCls] = 0.8; + max_y_CorrelationsVs[eCorrelations_vs_MeantpcFoundOverFindableCls] = 1.2; + title_y_CorrelationsVs[eCorrelations_vs_MeantpcFoundOverFindableCls] = FancyFormatting(ph.fParticleHistogramsName[etpcFoundOverFindableCls].Data()); + + // *) "eCorrelations_vs_MeantpcFractionSharedCls": + nBins_y_CorrelationsVs[eCorrelations_vs_MeantpcFractionSharedCls] = 500; + min_y_CorrelationsVs[eCorrelations_vs_MeantpcFractionSharedCls] = 0.; + max_y_CorrelationsVs[eCorrelations_vs_MeantpcFractionSharedCls] = 1.; + title_y_CorrelationsVs[eCorrelations_vs_MeantpcFractionSharedCls] = FancyFormatting(ph.fParticleHistogramsName[etpcFractionSharedCls].Data()); + + // *) "eCorrelations_vs_MeantpcChi2NCl": + nBins_y_CorrelationsVs[eCorrelations_vs_MeantpcChi2NCl] = 200; + min_y_CorrelationsVs[eCorrelations_vs_MeantpcChi2NCl] = 0.; + max_y_CorrelationsVs[eCorrelations_vs_MeantpcChi2NCl] = 2.; + title_y_CorrelationsVs[eCorrelations_vs_MeantpcChi2NCl] = FancyFormatting(ph.fParticleHistogramsName[etpcChi2NCl].Data()); + + // *) "eCorrelations_vs_MeandcaXY": + nBins_y_CorrelationsVs[eCorrelations_vs_MeandcaXY] = 200; + min_y_CorrelationsVs[eCorrelations_vs_MeandcaXY] = -0.2; + max_y_CorrelationsVs[eCorrelations_vs_MeandcaXY] = 0.2; + title_y_CorrelationsVs[eCorrelations_vs_MeandcaXY] = FancyFormatting(ph.fParticleHistogramsName[edcaXY].Data()); + + // *) "eCorrelations_vs_MeandcaZ": + nBins_y_CorrelationsVs[eCorrelations_vs_MeandcaZ] = 200; + min_y_CorrelationsVs[eCorrelations_vs_MeandcaZ] = -0.2; + max_y_CorrelationsVs[eCorrelations_vs_MeandcaZ] = 0.2; + title_y_CorrelationsVs[eCorrelations_vs_MeandcaZ] = FancyFormatting(ph.fParticleHistogramsName[edcaZ].Data()); + // ..... // *) Quick insanity check on title_x_CorrelationsVs and title_y_CorrelationsVs: @@ -4022,7 +4253,8 @@ void BookEventCutsHistograms() // a) Book the profile holding event cuts flags; // b) Book event cut counter maps; - // c) Book event cut counter histograms. + // c) Book event cut counter histograms; + // d) Book the formulas for all event cuts defined via mathematical expressions. if (tc.fVerbose) { StartFunction(__FUNCTION__); @@ -4038,7 +4270,7 @@ void BookEventCutsHistograms() ec.fEventCutsPro->SetStats(false); ec.fEventCutsPro->SetLineColor(eColor); ec.fEventCutsPro->SetFillColor(eFillColor); - ec.fEventCutsPro->GetXaxis()->SetLabelSize(0.025); + ec.fEventCutsPro->GetXaxis()->SetLabelSize(0.020); for (int cut = 0; cut < eEventCuts_N; cut++) { ec.fEventCutsPro->GetXaxis()->SetBinLabel(1 + cut, ec.fEventCutName[cut].Data()); // Remark: check always if bin labels here correspond to ordering in enum eEventCuts ec.fEventCutsPro->Fill(cut, static_cast(ec.fUseEventCuts[cut])); @@ -4085,6 +4317,26 @@ void BookEventCutsHistograms() } // for (int rs = 0; rs < 2; rs++) // reco/sim + // d) Book the formulas for all event cuts defined via mathematical expressions: + + // **) eRefMult_vs_NContr_Up: + if (ec.fUseEventCuts[eRefMult_vs_NContr_Up]) { + ec.fEventCutsFormulas[eRefMult_vs_NContr_Up_Formula] = new TFormula("RefMult_vs_NContr_Up_Formula", ec.fsEventCuts[eRefMult_vs_NContr_Up].Data()); + // As a quick insanity check, try immediately to evaluate something from this formula: + if (std::isnan(ec.fEventCutsFormulas[eRefMult_vs_NContr_Up_Formula]->Eval(1.44))) { + LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); + } + } + + // **) eRefMult_vs_NContr_Low: + if (ec.fUseEventCuts[eRefMult_vs_NContr_Low]) { + ec.fEventCutsFormulas[eRefMult_vs_NContr_Low_Formula] = new TFormula("RefMult_vs_NContr_Low_Formula", ec.fsEventCuts[eRefMult_vs_NContr_Low].Data()); + // As a quick insanity check, try immediately to evaluate something from this formula: + if (std::isnan(ec.fEventCutsFormulas[eRefMult_vs_NContr_Low_Formula]->Eval(1.44))) { + LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); + } + } + if (tc.fVerbose) { ExitFunction(__FUNCTION__); } @@ -4545,7 +4797,7 @@ void BookQvectorHistograms() TString sEtaSep[2] = {"A", "B"}; // A <=> -eta , B <=> + eta TString sEtaSep_long[2] = {TString::Format("%.2f < #eta <", pc.fdParticleCuts[eEta][eMin]), TString::Format("< #eta < %.2f", pc.fdParticleCuts[eEta][eMax])}; // yes, here I define first the part of intervals as etaCutMin < eta < "subevent boundary", and "subevent" boundary < eta < etaCutMax - // Then below in the loop, I inject for "subevent boundary" the corresponding fEtaSeparationsValues (devided by 2, becaus it's symmetric round 0) + // Then below in the loop, I inject for "subevent boundary" the corresponding fEtaSeparationsValues (divided by 2, becaus it's symmetric round 0) for (int ab = 0; ab < 2; ab++) { // ab = 0 <=> -eta , ab = 1 <=> + eta for (int rs = 0; rs < 2; rs++) { // reco/sim if (Skip(rs)) { @@ -5363,11 +5615,12 @@ void InternalValidation() fPhiPDF->SetParameter(3, fReactionPlane); } // Remark: I do not need here anything for option "persistent", because RP is not used for that case. See below how 3 symmetry planes are introduced with persistent correlation - ebye.fCentrality = static_cast(gRandom->Uniform(0., 100.)); // this is perfectly fine for this exercise - ebye.fOccupancy = static_cast(gRandom->Uniform(0., 10000.)); // this is perfectly fine for this exercise - ebye.fInteractionRate = static_cast(gRandom->Uniform(0., 10000.)); // this is perfectly fine for this exercise - ebye.fCurrentRunDuration = static_cast(gRandom->Uniform(0., 86400.)); // this is perfectly fine for this exercise - ebye.fVz = static_cast(gRandom->Uniform(-20., 20.)); // this is perfectly fine for this exercise + ebye.fCentrality = static_cast(gRandom->Uniform(0., 100.)); // this is perfectly fine for this exercise + ebye.fOccupancy = static_cast(gRandom->Uniform(0., 10000.)); // this is perfectly fine for this exercise + ebye.fInteractionRate = static_cast(gRandom->Uniform(0., 10000.)); // this is perfectly fine for this exercise + ebye.fCurrentRunDuration = static_cast(gRandom->Uniform(0., 86400.)); // this is perfectly fine for this exercise + ebye.fVz = static_cast(gRandom->Uniform(-20., 20.)); // this is perfectly fine for this exercise + ebye.fFT0CAmplitudeOnFoundBC = static_cast(gRandom->Uniform(0., 100000.)); // this is perfectly fine for this exercise // b2) Fill event histograms before cuts: if (eh.fFillEventHistograms) { @@ -5993,8 +6246,8 @@ void DetermineRunNumber(T1 const& collision, T2 const&) StartFunction(__FUNCTION__); } - // a) Determine run number for Run 3 real data: - if constexpr (rs == eRec || rs == eRecAndSim || rs == eRec_Run2 || rs == eRecAndSim_Run2) { + // a) Determine run number for Run 3 and Run 2 real data; + if constexpr (rs == eRec || rs == eRecAndSim || rs == eRec_Run2 || rs == eRecAndSim_Run2 || rs == eQA) { // **) Determine run number: // Get start timestamp and end timemstamp for this run in miliseconds, and convert both of them in seconds: @@ -6300,7 +6553,7 @@ void CheckCurrentRunNumber(T1 const& collision, T2 const&) // a) Support for Run 3 and Run 2 real data: // TBI 20250112 enable other cases, after validating them // TBI 20250112 Remember that I can get total run duration in converted data, but not current run duration. - if constexpr (rs == eRec || rs == eRec_Run2) { + if constexpr (rs == eRec || rs == eRec_Run2 || rs == eQA) { // **) Check run number: auto bc = collision.template foundBC_as(); // I have the same code snippet at other places, keep in sync. @@ -6376,6 +6629,7 @@ void ResetEventByEventQuantities() ebye.fInteractionRate = 0.; ebye.fCurrentRunDuration = 0.; ebye.fVz = 0.; + ebye.fFT0CAmplitudeOnFoundBC = 0.; // b) Q-vectors: if (qv.fCalculateQvectors) { @@ -6602,12 +6856,14 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) // f) Event cuts on simulated (Run 1 and 2 specific); // In case there is some corner case between Run 1 and Run 2, simply branch further this one // *) Event cuts for Test case. + // 44:EventCuts + if (tc.fVerbose) { StartFunction(__FUNCTION__); } // a) Event cuts on reconstructed, and corresponding MC truth simulated (common to Run 3, Run 2 and Run 1) ... - if constexpr (rs == eRec || rs == eRecAndSim || rs == eRec_Run2 || rs == eRecAndSim_Run2 || rs == eRec_Run1 || rs == eRecAndSim_Run1) { + if constexpr (rs == eRec || rs == eRecAndSim || rs == eRec_Run2 || rs == eRecAndSim_Run2 || rs == eRec_Run1 || rs == eRecAndSim_Run1 || rs == eQA) { // *) NumberOfEvents: => this event cut is implemented directly in Steer(...) @@ -6742,6 +6998,39 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) } } + // *) RefMult_vs_NContr_Up: + if (ec.fUseEventCuts[eRefMult_vs_NContr_Up]) { + if (cutModus == eCutCounterBinning) { + EventCut(eRec, eRefMult_vs_NContr_Up, eCutCounterBinning); + } else if (collision.numContrib() > ec.fEventCutsFormulas[eRefMult_vs_NContr_Up_Formula]->Eval(ebye.fReferenceMultiplicity)) { + if (!EventCut(eRec, eRefMult_vs_NContr_Up, cutModus)) { + return false; + } + } + } + + // *) RefMult_vs_NContr_Low: + if (ec.fUseEventCuts[eRefMult_vs_NContr_Low]) { + if (cutModus == eCutCounterBinning) { + EventCut(eRec, eRefMult_vs_NContr_Low, eCutCounterBinning); + } else if (collision.numContrib() < ec.fEventCutsFormulas[eRefMult_vs_NContr_Low_Formula]->Eval(ebye.fReferenceMultiplicity)) { + if (!EventCut(eRec, eRefMult_vs_NContr_Low, cutModus)) { + return false; + } + } + } + + // *) CentralityCorrelationsCut: + if (ec.fUseEventCuts[eCentralityCorrelationsCut]) { + if (cutModus == eCutCounterBinning) { + EventCut(eRec, eCentralityCorrelationsCut, eCutCounterBinning); + } else if (!CentralityCorrelationCut()) { + if (!EventCut(eRec, eCentralityCorrelationsCut, cutModus)) { + return false; + } + } + } + // ... // ... and corresponding MC truth simulated: @@ -6857,7 +7146,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) // c) Event cuts on reconstructed, and corresponding MC truth simulated (Run 3 specific): // Remark: I implement here only the event cuts which are not already in group a) above, and which make sense only for Run 3 data. - if constexpr (rs == eRec || rs == eRecAndSim) { + if constexpr (rs == eRec || rs == eRecAndSim || rs == eQA) { // For Run 3 multiplicities, I subscribe to o2::aod::Mults // See how it is defined as Joined table at https://aliceo2group.github.io/analysis-framework/docs/datamodel/helperTaskTables.html#o2-analysis-multiplicity-table @@ -7352,7 +7641,7 @@ void FillSubeventMultiplicities() } // a) Fill reconstructed (common to Run 3, Run 2 and Run 1 + Test mode): - if constexpr (rs == eRec || rs == eRecAndSim || rs == eRec_Run2 || rs == eRecAndSim_Run2 || rs == eRec_Run1 || rs == eRecAndSim_Run1 || rs == eTest) { + if constexpr (rs == eRec || rs == eRecAndSim || rs == eRec_Run2 || rs == eRecAndSim_Run2 || rs == eRec_Run1 || rs == eRecAndSim_Run1 || rs == eTest || rs == eQA) { for (int ab = 0; ab < 2; ab++) { // ab = 0 <=> -eta , ab = 1 <=> + eta for (int e = 0; e < gMaxNumberEtaSeparations; e++) { // eta separation !qv.fMabDist[ab][eRec][eAfter][e] ? true : qv.fMabDist[ab][eRec][eAfter][e]->Fill(qv.fMab[ab][e]); @@ -7397,7 +7686,7 @@ void FillEventHistograms(T1 const& collision, T2 const& tracks, eBeforeAfter ba) } // a) Fill reconstructed ... (common to Run 3, Run 2 and Run 1): - if constexpr (rs == eRec || rs == eRecAndSim || rs == eRec_Run2 || rs == eRecAndSim_Run2 || rs == eRec_Run1 || rs == eRecAndSim_Run1) { + if constexpr (rs == eRec || rs == eRecAndSim || rs == eRec_Run2 || rs == eRecAndSim_Run2 || rs == eRec_Run1 || rs == eRecAndSim_Run1 || rs == eQA) { if (eh.fFillEventHistograms) { !eh.fEventHistograms[eNumberOfEvents][eRec][ba] ? true : eh.fEventHistograms[eNumberOfEvents][eRec][ba]->Fill(0.5); // basically, if histogram is not booked, do nothing. 'true' is a placeholder, for the time being !eh.fEventHistograms[eVertex_x][eRec][ba] ? true : eh.fEventHistograms[eVertex_x][eRec][ba]->Fill(collision.posX()); @@ -7444,18 +7733,30 @@ void FillEventHistograms(T1 const& collision, T2 const& tracks, eBeforeAfter ba) // double twoS = two.Im(); // sin double wTwo = Two(0, 0).Re(); // Weight is 'number of combinations' by default TBI // 20220809 add support for other weights - if (wTwo > 0.0) { - twoC /= wTwo; - } else { + if (!(wTwo > 0.0)) { LOGF(fatal, "In function \033[1;31m%s at line %d : wTwo = %f <=0. ebye.fSelectedTracks = %d.\nDid you forget to enable fCalculateQvectors = true?\033[0m", __FUNCTION__, __LINE__, wTwo, ebye.fSelectedTracks); } - !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_Multiplicity][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_Multiplicity][h - 1][eRec]->Fill(twoC, ebye.fMultiplicity); // Remark: I have exceptionally divided above already twoC /= wTwo , since I do not use here any particular weight - !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_ReferenceMultiplicity][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_ReferenceMultiplicity][h - 1][eRec]->Fill(twoC, ebye.fReferenceMultiplicity); - !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_Centrality][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_Centrality][h - 1][eRec]->Fill(twoC, ebye.fCentrality); + !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_Multiplicity][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_Multiplicity][h - 1][eRec]->Fill(twoC / wTwo, ebye.fMultiplicity, wTwo); + !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_ReferenceMultiplicity][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_ReferenceMultiplicity][h - 1][eRec]->Fill(twoC / wTwo, ebye.fReferenceMultiplicity, wTwo); + !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_Centrality][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_Centrality][h - 1][eRec]->Fill(twoC / wTwo, ebye.fCentrality, wTwo); // ..... - !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeanPhi][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeanPhi][h - 1][eRec]->Fill(twoC, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeanPhi)); - !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeanPt][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeanPt][h - 1][eRec]->Fill(twoC, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeanPt)); - !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeanEta][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeanEta][h - 1][eRec]->Fill(twoC, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeanEta)); + !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeanPhi][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeanPhi][h - 1][eRec]->Fill(twoC / wTwo, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeanPhi), wTwo); + !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeanPt][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeanPt][h - 1][eRec]->Fill(twoC / wTwo, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeanPt), wTwo); + !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeanEta][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeanEta][h - 1][eRec]->Fill(twoC / wTwo, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeanEta), wTwo); + !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeanCharge][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeanCharge][h - 1][eRec]->Fill(twoC / wTwo, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeanCharge), wTwo); + !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcNClsFindable][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcNClsFindable][h - 1][eRec]->Fill(twoC / wTwo, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeantpcNClsFindable), wTwo); + !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcNClsShared][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcNClsShared][h - 1][eRec]->Fill(twoC / wTwo, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeantpcNClsShared), wTwo); + !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeanitsChi2NCl][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeanitsChi2NCl][h - 1][eRec]->Fill(twoC / wTwo, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeanitsChi2NCl), wTwo); + !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcNClsFound][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcNClsFound][h - 1][eRec]->Fill(twoC / wTwo, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeantpcNClsFound), wTwo); + !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcNClsCrossedRows][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcNClsCrossedRows][h - 1][eRec]->Fill(twoC / wTwo, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeantpcNClsCrossedRows), wTwo); + !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeanitsNCls][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeanitsNCls][h - 1][eRec]->Fill(twoC / wTwo, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeanitsNCls), wTwo); + !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeanitsNClsInnerBarrel][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeanitsNClsInnerBarrel][h - 1][eRec]->Fill(twoC / wTwo, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeanitsNClsInnerBarrel), wTwo); + !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcCrossedRowsOverFindableCls][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcCrossedRowsOverFindableCls][h - 1][eRec]->Fill(twoC / wTwo, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeantpcCrossedRowsOverFindableCls), wTwo); + !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcFoundOverFindableCls][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcFoundOverFindableCls][h - 1][eRec]->Fill(twoC / wTwo, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeantpcFoundOverFindableCls), wTwo); + !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcFractionSharedCls][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcFractionSharedCls][h - 1][eRec]->Fill(twoC / wTwo, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeantpcFractionSharedCls), wTwo); + !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcChi2NCl][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeantpcChi2NCl][h - 1][eRec]->Fill(twoC / wTwo, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeantpcChi2NCl), wTwo); + !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeandcaXY][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeandcaXY][h - 1][eRec]->Fill(twoC / wTwo, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeandcaXY), wTwo); + !qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeandcaZ][h - 1][eRec] ? true : qa.fQACorrelationsVsHistograms2D[eCorrelations_vs_MeandcaZ][h - 1][eRec]->Fill(twoC / wTwo, qa.fQAParticleEventProEbyE[eRec][ba]->GetBinContent(eMeandcaZ), wTwo); // ..... } @@ -7519,7 +7820,7 @@ void FillEventHistograms(T1 const& collision, T2 const& tracks, eBeforeAfter ba) // ----------------------------------------------------------------------------- // c) Fill reconstructed (Run 3 specific): - if constexpr (rs == eRec || rs == eRecAndSim) { + if constexpr (rs == eRec || rs == eRecAndSim || rs == eQA) { if (eh.fFillEventHistograms) { !eh.fEventHistograms[eOccupancy][eRec][ba] ? true : eh.fEventHistograms[eOccupancy][eRec][ba]->Fill(ebye.fOccupancy); !eh.fEventHistograms[eInteractionRate][eRec][ba] ? true : eh.fEventHistograms[eInteractionRate][eRec][ba]->Fill(ebye.fInteractionRate); @@ -7543,6 +7844,10 @@ void FillEventHistograms(T1 const& collision, T2 const& tracks, eBeforeAfter ba) !qa.fQAEventHistograms2D[eCentrality_vs_InteractionRate][eRec][ba] ? true : qa.fQAEventHistograms2D[eCentrality_vs_InteractionRate][eRec][ba]->Fill(ebye.fCentrality, ebye.fInteractionRate); !qa.fQAEventHistograms2D[eVertex_z_vs_InteractionRate][eRec][ba] ? true : qa.fQAEventHistograms2D[eVertex_z_vs_InteractionRate][eRec][ba]->Fill(collision.posZ(), ebye.fInteractionRate); + // **) unsorted TBI 20250331 sort at some point + !qa.fQAEventHistograms2D[eMultiplicity_vs_FT0CAmplitudeOnFoundBC][eRec][ba] ? true : qa.fQAEventHistograms2D[eMultiplicity_vs_FT0CAmplitudeOnFoundBC][eRec][ba]->Fill(ebye.fMultiplicity, ebye.fFT0CAmplitudeOnFoundBC); + !qa.fQAEventHistograms2D[eCentFT0C_vs_FT0CAmplitudeOnFoundBC][eRec][ba] ? true : qa.fQAEventHistograms2D[eCentFT0C_vs_FT0CAmplitudeOnFoundBC][eRec][ba]->Fill(qa.fCentrality[eCentFT0C], ebye.fFT0CAmplitudeOnFoundBC); + // ... // Specific (estimators are hardwired): @@ -7919,7 +8224,7 @@ bool ValidTrack(T const& track) // a) Validity checks for tracks in Run 3: // *) Ensure that I am taking into account propagated tracks (and not e.g. track evaluated at innermost update): - if constexpr (rs == eRec || rs == eRecAndSim) { + if constexpr (rs == eRec || rs == eRecAndSim || rs == eQA) { if (!(track.trackType() == o2::aod::track::TrackTypeEnum::Track)) { if (tc.fVerboseForEachParticle) { LOGF(info, "\033[1;31m%s track.trackType() == o2::aod::track::TrackTypeEnum::Trac\033[0m", __FUNCTION__); @@ -7968,6 +8273,109 @@ bool ValidTrack(T const& track) //============================================================ +float GetCentralityPercentile(TString ce) +{ + // Helper function for CentralityCorrelationCut(), to reduce the code bloat there. + + if (tc.fVerbose) { + StartFunction(__FUNCTION__); + } + + // TBI 20250331 shall I add some insanity check on centrality estimator "ce" + + float centralityPercentile = -1.; + + // Run 3: + if (ce.EqualTo("centFT0C", TString::kIgnoreCase)) { + centralityPercentile = qa.fCentrality[eCentFT0C]; + } else if (ce.EqualTo("centFT0CVariant1", TString::kIgnoreCase)) { + centralityPercentile = qa.fCentrality[eCentFT0CVariant1]; + } else if (ce.EqualTo("centFT0M", TString::kIgnoreCase)) { + centralityPercentile = qa.fCentrality[eCentFT0M]; + } else if (ce.EqualTo("centFV0A", TString::kIgnoreCase)) { + centralityPercentile = qa.fCentrality[eCentFV0A]; + } else if (ce.EqualTo("centNTPV", TString::kIgnoreCase)) { + centralityPercentile = qa.fCentrality[eCentNTPV]; + } else if (ce.EqualTo("centNGlobal", TString::kIgnoreCase)) { + // centralityPercentile = qa.fCentrality[eCentNGlobal]; // TBI 20250331 enable eventually + + // ... ctd here with Run 3 estimators ... + + // Run 1 and Run 2: + } else if (ce.EqualTo("centRun2V0M", TString::kIgnoreCase)) { + centralityPercentile = qa.fCentrality[eCentRun2V0M]; + } else if (ce.EqualTo("centRun2SPDTracklets", TString::kIgnoreCase)) { + centralityPercentile = qa.fCentrality[eCentRun2SPDTracklets]; + + // ... ctd here with Run 1 and Run 2 estimators ... + + } else { + LOGF(fatal, "\033[1;31m%s at line %d : centrality estimator = %d is not supported yet. \033[0m", __FUNCTION__, __LINE__, ce.Data()); + } + + if (tc.fVerbose) { + ExitFunction(__FUNCTION__); + } + + return centralityPercentile; + +} // float GetCentralityPercentile(TString ce) + +//============================================================ + +bool CentralityCorrelationCut() +{ + // If centrality correlation cut was requested, in this function i decide whether the current event survives it or not. + // This function is called only in EventCuts(...). I implemented it here separately merely to keep code in EventCuts(...) as clean as possible. + // If makes sense to call this function, only if in DetermineCentrality(...) I have filled in qa.Centrality . + + // TBI 20250331 There is a bit of performance loss, because I need 2 centrality estimators to calculate correlation cut, and I fill in qa.Centrality values + // for all centrality estimators. But this way I can chain several centrality correlation cuts in the future with AND condition, if necessary. + + if (tc.fVerbose) { + StartFunction(__FUNCTION__); + } + + bool alright = true; // this local variable holds the return value for this function + + // Algorithm: I extract e.g. from "CentFT0C_CentFT0M" that the first estimator is "CentFT0C" and second "CentFT0M", and for each estimator I fetch the corresponding centrality percentile: + TObjArray* oa = ec.fsEventCuts[eCentralityCorrelationsCut].Tokenize("_"); // TBI 20250331 let's see for how long I can use "_" safely as IFS ... + if (!oa) { + LOGF(fatal, "\033[1;31m%s at line %d : oa is NULL , s = %s. Example format is e.g. \"CentFT0C_CentFT0M\"\033[0m", __FUNCTION__, __LINE__, ec.fsEventCuts[eCentralityCorrelationsCut].Data()); + } + ec.fCentralityValues[0] = GetCentralityPercentile(oa->At(0)->GetName()); + ec.fCentralityValues[1] = GetCentralityPercentile(oa->At(1)->GetName()); + delete oa; // yes + + // Okay, do the thing: + // *) "Relative" <=> |(firstEstimator-secondEstimator)/(firstEstimator+secondEstimator)| > treshold => reject the event => alright = false + // *) "Absolute" <=> |(firstEstimator-secondEstimator)| > treshold => reject the event => alright = false + // *) ... + if (ec.fCentralityValues[0] > 0. && ec.fCentralityValues[1] > 0.) { + if (ec.fCentralityCorrelationsCutVersion.EqualTo("Relative")) { + if (TMath::Abs((ec.fCentralityValues[0] - ec.fCentralityValues[1]) / (ec.fCentralityValues[0] + ec.fCentralityValues[1])) > ec.fCentralityCorrelationsCutTreshold) { + alright = false; + } + } else if (ec.fCentralityCorrelationsCutVersion.EqualTo("Absolute")) { + if (TMath::Abs((ec.fCentralityValues[0] - ec.fCentralityValues[1])) > ec.fCentralityCorrelationsCutTreshold) { + alright = false; + } + } else { + LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); + } + } // if(ec.fCentralityValues[0] > 0. && ec.fCentralityValues[1] > 0.) + + if (tc.fVerbose) { + LOGF(info, "\033[1;33m%s at line %d : %f, %f, %f, %d \033[0m", __FUNCTION__, __LINE__, ec.fCentralityValues[0], ec.fCentralityValues[1], ec.fCentralityCorrelationsCutTreshold, static_cast(alright)); + ExitFunction(__FUNCTION__); + } + + return alright; + +} // bool CentralityCorrelationCut() + +//============================================================ + template void ParticleCutsCounters(T const& track) { @@ -8049,12 +8457,14 @@ bool ParticleCuts(T const& track, eCutModus cutModus) // *) Particle cuts on Test case; // *) Toy NUA. + // 44:ParticleCuts + if (tc.fVerboseForEachParticle) { StartFunction(__FUNCTION__); } // a) Particle cuts on reconstructed, and corresponding MC truth simulated (common to Run 3, Run 2 and Run 1) ... - if constexpr (rs == eRec || rs == eRecAndSim || rs == eRec_Run2 || rs == eRecAndSim_Run2 || rs == eRec_Run1 || rs == eRecAndSim_Run1) { + if constexpr (rs == eRec || rs == eRecAndSim || rs == eRec_Run2 || rs == eRecAndSim_Run2 || rs == eRec_Run1 || rs == eRecAndSim_Run1 || rs == eQA) { // *) Phi: if (pc.fUseParticleCuts[ePhi]) { @@ -8456,7 +8866,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) // c) Particle cuts on reconstructed, and corresponding MC truth simulated (Run 3 specific): // Remark: I implement here only the particle cuts which are not already in group a) above, and which make sense only for Run 3 data. - if constexpr (rs == eRec || rs == eRecAndSim) { + if constexpr (rs == eRec || rs == eRecAndSim || rs == eQA) { // ... @@ -8725,7 +9135,7 @@ void FillParticleHistograms(T const& track, eBeforeAfter ba, int weight = 1) } // a) Fill reconstructed ... (common to Run 3, Run 2 and Run 1): - if constexpr (rs == eRec || rs == eRecAndSim || rs == eRec_Run2 || rs == eRecAndSim_Run2 || rs == eRec_Run1 || rs == eRecAndSim_Run1) { + if constexpr (rs == eRec || rs == eRecAndSim || rs == eRec_Run2 || rs == eRecAndSim_Run2 || rs == eRec_Run1 || rs == eRecAndSim_Run1 || rs == eQA) { // Remark: Remember to use only eRec and eSim as array indices in histos, also for rs == eRecAndSim, etc. TBI 20240504 shall I introduce generic enum egRec and egSim for this sake? // TBI 20240414 also here have to hardcode 'eRec', because 'rs' spans over all enums in eRecSim => I definitely need 'generic Rec' case, perhaps via TExMap ? // But I have already tc.fProcess[eGenericRec] and tc.fProcess[eGenericRecSim], available, shall I simply re-use them? @@ -8826,6 +9236,48 @@ void FillParticleHistograms(T const& track, eBeforeAfter ba, int weight = 1) // eMeanEta: qa.fQAParticleEventProEbyE[eRec][ba]->Fill(static_cast(eMeanEta) - 0.5, track.eta(), weight); + // eMeanCharge: + qa.fQAParticleEventProEbyE[eRec][ba]->Fill(static_cast(eMeanCharge) - 0.5, track.sign(), weight); + + // eMeantpcNClsFindable: + qa.fQAParticleEventProEbyE[eRec][ba]->Fill(static_cast(eMeantpcNClsFindable) - 0.5, track.tpcNClsFindable(), weight); + + // eMeantpcNClsShared: + qa.fQAParticleEventProEbyE[eRec][ba]->Fill(static_cast(eMeantpcNClsShared) - 0.5, track.tpcNClsShared(), weight); + + // eMeanitsChi2NCl: + qa.fQAParticleEventProEbyE[eRec][ba]->Fill(static_cast(eMeanitsChi2NCl) - 0.5, track.itsChi2NCl(), weight); + + // eMeantpcNClsFound: + qa.fQAParticleEventProEbyE[eRec][ba]->Fill(static_cast(eMeantpcNClsFound) - 0.5, track.tpcNClsFound(), weight); + + // eMeantpcNClsCrossedRow: + qa.fQAParticleEventProEbyE[eRec][ba]->Fill(static_cast(eMeantpcNClsCrossedRows) - 0.5, track.tpcNClsCrossedRows(), weight); + + // eMeanitsNCls: + qa.fQAParticleEventProEbyE[eRec][ba]->Fill(static_cast(eMeanitsNCls) - 0.5, track.itsNCls(), weight); + + // eMeanitsNClsInnerBarrel: + qa.fQAParticleEventProEbyE[eRec][ba]->Fill(static_cast(eMeanitsNClsInnerBarrel) - 0.5, track.itsNClsInnerBarrel(), weight); + + // eMeantpcCrossedRowsOverFindableCl: + qa.fQAParticleEventProEbyE[eRec][ba]->Fill(static_cast(eMeantpcCrossedRowsOverFindableCls) - 0.5, track.tpcCrossedRowsOverFindableCls(), weight); + + // eMeantpcFoundOverFindableCl: + qa.fQAParticleEventProEbyE[eRec][ba]->Fill(static_cast(eMeantpcFoundOverFindableCls) - 0.5, track.tpcFoundOverFindableCls(), weight); + + // eMeantpcFractionSharedCls: + qa.fQAParticleEventProEbyE[eRec][ba]->Fill(static_cast(eMeantpcFractionSharedCls) - 0.5, track.tpcFractionSharedCls(), weight); + + // eMeantpcChi2NCl: + qa.fQAParticleEventProEbyE[eRec][ba]->Fill(static_cast(eMeantpcChi2NCl) - 0.5, track.tpcChi2NCl(), weight); + + // eMeandcaXY: + qa.fQAParticleEventProEbyE[eRec][ba]->Fill(static_cast(eMeandcaXY) - 0.5, track.dcaXY(), weight); + + // eMeandcaZ: + qa.fQAParticleEventProEbyE[eRec][ba]->Fill(static_cast(eMeandcaZ) - 0.5, track.dcaZ(), weight); + // ... } // if ... @@ -8909,7 +9361,7 @@ void FillParticleHistograms(T const& track, eBeforeAfter ba, int weight = 1) // ----------------------------------------------------------------------------- // c) Fill reconstructed ... (Run 3 specific): - if constexpr (rs == eRec || rs == eRecAndSim) { + if constexpr (rs == eRec || rs == eRecAndSim || rs == eQA) { // TBI 20240511 check If I can use them for Run 2 and Run 1, but extending TracksRecSim_Run2 to Tracks_extra, etc. // Remark: Remember to use only eRec and eSim as array indices in histos, also for rs == eRecAndSim, etc. TBI 20240504 shall I introduce generic enum egRec and egSim for this sake? @@ -13414,7 +13866,7 @@ void DetermineReferenceMultiplicity(T const& collision) } // a) Determine reference multiplicity for real Run 3 data: - if constexpr (rs == eRec || rs == eRecAndSim) { + if constexpr (rs == eRec || rs == eRecAndSim || rs == eQA) { // Local convention for name of reference multiplicity estimator: use the same name as the getter, case insensitive. if (ec.fsEventCuts[eReferenceMultiplicityEstimator].EqualTo("multTPC", TString::kIgnoreCase)) { ebye.fReferenceMultiplicity = collision.multTPC(); @@ -13505,7 +13957,7 @@ void DetermineCentrality(T const& collision) } // a) For real data, determine centrality from default centrality estimator: - if constexpr (rs == eRec || rs == eRecAndSim) { + if constexpr (rs == eRec || rs == eRecAndSim || rs == eQA) { // Local convention for name of centrality estimator: use the same name as the getter, case insensitive. if (ec.fsEventCuts[eCentralityEstimator].EqualTo("centFT0C", TString::kIgnoreCase)) { ebye.fCentrality = collision.centFT0C(); @@ -13523,7 +13975,7 @@ void DetermineCentrality(T const& collision) LOGF(fatal, "\033[1;31m%s at line %d : centrality estimator = %d is not supported yet. \033[0m", __FUNCTION__, __LINE__, ec.fsEventCuts[eCentralityEstimator].Data()); } // QA: - if (qa.fFillQAEventHistograms2D) { + if (qa.fFillQAEventHistograms2D || ec.fUseEventCuts[eCentralityCorrelationsCut]) { // TBI 20250331 I re-use here qa.fCentrality for CentralityCorrelationsCut, why not... qa.fCentrality[eCentFT0C] = collision.centFT0C(); qa.fCentrality[eCentFT0CVariant1] = collision.centFT0CVariant1(); qa.fCentrality[eCentFT0M] = collision.centFT0M(); @@ -13533,7 +13985,8 @@ void DetermineCentrality(T const& collision) } // TBI 20240120 I could also here access also corresponding simulated centrality from impact parameter, if available through collision.has_mcCollision() - } + + } // if constexpr (rs == eRec || rs == eRecAndSim) // b) For simulated data, determine centrality directly from impact parameter: if constexpr (rs == eSim) { @@ -13550,7 +14003,7 @@ void DetermineCentrality(T const& collision) LOGF(fatal, "\033[1;31m%s at line %d : centrality estimator = %d is not supported yet. \033[0m", __FUNCTION__, __LINE__, ec.fsEventCuts[eCentralityEstimator].Data()); } // QA: - if (qa.fFillQAEventHistograms2D) { // TBI 20240515 this flag is too general here, I need to make it more specific + if (qa.fFillQAEventHistograms2D || ec.fUseEventCuts[eCentralityCorrelationsCut]) { // TBI 20250331 I re-use here qa.fCentrality for CentralityCorrelationsCut, why not... qa.fCentrality[eCentRun2V0M] = collision.centRun2V0M(); qa.fCentrality[eCentRun2SPDTracklets] = collision.centRun2SPDTracklets(); } @@ -13609,7 +14062,7 @@ void DetermineOccupancy(T const& collision) } // a) Determine occupancy from default occupancy estimator, only for eRec and eRecAndSim: - if constexpr (rs == eRec || rs == eRecAndSim) { + if constexpr (rs == eRec || rs == eRecAndSim || rs == eQA) { if (ec.fsEventCuts[eOccupancyEstimator].EqualTo("TrackOccupancyInTimeRange", TString::kIgnoreCase)) { ebye.fOccupancy = collision.trackOccupancyInTimeRange(); } else if (ec.fsEventCuts[eOccupancyEstimator].EqualTo("FT0COccupancyInTimeRange", TString::kIgnoreCase)) { @@ -13661,7 +14114,7 @@ void DetermineInteractionRateAndCurrentRunDuration(T1 const& collision, T2 const } // a1) Determine interaction rate only for eRec: - if constexpr (rs == eRec) { // TBI 20250112 check still eRecSim mode here + if constexpr (rs == eRec || rs == eQA) { // TBI 20250112 check still eRecSim mode here auto bc = collision.template foundBC_as(); // I have the same code snippet at other places, keep in sync. double hadronicRate = mRateFetcher.fetch(ccdb.service, static_cast(bc.timestamp()), static_cast(bc.runNumber()), "ZNC hadronic") * 1.e-3; if (hadronicRate > 0.) { @@ -13678,10 +14131,19 @@ void DetermineInteractionRateAndCurrentRunDuration(T1 const& collision, T2 const if (ebye.fCurrentRunDuration > tc.fRunTime[eDurationInSec]) { LOGF(fatal, "\033[1;31m%s at line %d : ebye.fCurrentRunDuration = %d is bigger than tc.fRunTime[eDurationInSec] = %d, which is meaningless \033[0m", __FUNCTION__, __LINE__, static_cast(ebye.fCurrentRunDuration), static_cast(tc.fRunTime[eDurationInSec])); } + + /* + // a3) Determine FT0CAmplitudeOnFoundBC: TBI 20250331 to reduce code bloat, I have it quickly here. Shall I rename the function? + if (bc.has_foundFT0()) { + ebye.fFT0CAmplitudeOnFoundBC = bc.foundFT0().sumAmpC(); // Credits: rofOccupancyQa.cxx + } + */ + } else { // b) For all other cases, set interaction rate to -1: ebye.fInteractionRate = -1.; ebye.fCurrentRunDuration = -1.; + ebye.fFT0CAmplitudeOnFoundBC = -1.; } // c) Print interaction rate and run duration for the audience...: @@ -13693,7 +14155,7 @@ void DetermineInteractionRateAndCurrentRunDuration(T1 const& collision, T2 const ExitFunction(__FUNCTION__); } -} // template void DetermineInteractionRateAndCurrentRunDuration(T1 const& collision, T2 const& bcs) +} // template void DetermineInteractionRateAndCurrentRunDuration(T1 const& collision, T2 const&) //============================================================ @@ -13718,6 +14180,49 @@ void DetermineVertexZ(T const& collision) //============================================================ +template +void DetermineQAThingies(T1 const& collision, T2 const&) +{ + // Remark: I implement ideally here only the getters for which the subscription to additional non-standard tables was needed for QA purposes. + // Support only for Run 3 data is provided, because in the "processQA" switch the starting point are tables used in "processRec", and I join to them + // some non-standard tables only for QA purposes. + + // a) Determine FT0CAmplitudeOnFoundBC; + // ... + // *) Print something for the audience... . + + if (tc.fVerbose) { + StartFunction(__FUNCTION__); + } + + if constexpr (rs == eQA) { + auto bc = collision.template foundBC_as(); // I have the same code snippet at other places, keep in sync. + + // a) Determine FT0CAmplitudeOnFoundBC; + if (bc.has_foundFT0()) { + ebye.fFT0CAmplitudeOnFoundBC = bc.foundFT0().sumAmpC(); // see more details in rofOccupancyQa.cxx + } + + // ... + + // *) Print something for the audience...: + if (tc.fVerbose) { + LOGF(info, "\033[1;32m ebye.fFT0CAmplitudeOnFoundBC = %f\033[0m", ebye.fFT0CAmplitudeOnFoundBC); + } // if (tc.fVerbose) { + + } else { + // For all other cases, set interaction rate to -1: TBI 20250401 shall I really do it this way, in a sense that for all other cases, this function should never be called? + ebye.fFT0CAmplitudeOnFoundBC = -1.; + } + + if (tc.fVerbose) { + ExitFunction(__FUNCTION__); + } // if (tc.fVerbose) { + +} // template void DetermineQAThingies(T1 const& collision, T2 const&) + +//============================================================ + void DetermineEventCounters() { // Determine all event counters. @@ -14523,6 +15028,9 @@ void MainLoopOverParticles(T const& tracks) // Remark #3: // *) There is also processTest(...), to process data with minimum subscription to the tables. To use it, set field "processTest": "true" in json config + // Remark #4: + // *) There is also processQA(...), to process data with maximum subscription to the tables (use for Run 3 only). To use it, set field "processTest": "true" in json config + if (tc.fVerbose) { StartFunction(__FUNCTION__); } @@ -14718,6 +15226,12 @@ void Steer(T1 const& collision, T2 const& bcs, T3 const& tracks) // *) Determine vertex z position: DetermineVertexZ(collision); + // *) Determine additional QA thingies: + if (qa.fFillQAEventHistograms2D || qa.fFillQAParticleHistograms2D || qa.fFillQAParticleEventHistograms2D || qa.fFillQACorrelationsVsHistograms2D || qa.fFillQACorrelationsVsInteractionRateVsProfiles2D) { + // Remark: I implement ideally here only the getters for which the subsription to additional non-standard tables was needed for QA purposes. + DetermineQAThingies(collision, bcs); + } + // *) Fill event histograms before event cuts: if (eh.fFillEventHistograms || qa.fFillQAEventHistograms2D || qa.fFillQAParticleEventHistograms2D) { // Remark: I do not above the flag fFillQACorrelationsVsHistograms2D, because as a part of QA I calculate <2> only after cuts in any case diff --git a/PWGCF/MultiparticleCorrelations/Tasks/multiparticle-correlations-ab.cxx b/PWGCF/MultiparticleCorrelations/Tasks/multiparticle-correlations-ab.cxx index 10c79bf8789..37e6cf86635 100644 --- a/PWGCF/MultiparticleCorrelations/Tasks/multiparticle-correlations-ab.cxx +++ b/PWGCF/MultiparticleCorrelations/Tasks/multiparticle-correlations-ab.cxx @@ -25,9 +25,9 @@ using namespace o2; using namespace o2::framework; // *) Run 3: -using BCs_Run3 = soa::Join; // TBI 20241126 under testing -// Remark 1: I have already timestamp in workflow, due to track-propagation. With Run3MatchedToBCSparse, I can use bc.has_zdc() TBI 20250112 is this redundant, I nowhere use bc.has_zdc() -// Remark 2: For consistency with notation below, drop _Run3 and instead use _Run2 and _Run1 +using BCs_Run3 = soa::Join; // TBI 20241126 under testing +// Remark 1: I have already timestamp in workflow, due to track-propagation. +// Remark 2: For consistency with notation below, drop _Run3 and instead use _Run2 and _Run1 TBI 20250401 not sure any longer what I wanted to say here... // using EventSelection = soa::Join; // TBI 20241209 validating "MultsGlobal" // for using collision.multNTracksGlobal() TBI 20250128 do i still need this? @@ -59,6 +59,15 @@ using CollisionRec_Run1 = soa::Join::itera using CollisionRecSim_Run1 = soa::Join::iterator; // Remark: For tracks, I can use everything same as in Run 3 +// *) QA: +// Remark: This is Run 3 "Rec" + subscription to additional few tables (otherwise unnecessary in my analysis, e.g. some specific detector tables), used only for QA purposes. +// Therefore, I start all definitions from what I have defined for Run 3 "Rec", and on top of it join these additional tables for QA. +using BCs_QA = soa::Join; +// *) BcSels => bc.has_foundFT0(), etc. +// *) Run3MatchedToBCSparse => bc.has_zdc(), etc. TBI 20250401 at the moment, I do not use this one +using Collision_QA = CollisionRec; // if I would need additional tables for QA, just join 'em here with CollisionRec +using TracksRec_QA = TracksRec; // if I would need additional tables for QA, just join 'em here with TracksRec + // *) ROOT: #include #include @@ -191,14 +200,14 @@ struct MultiparticleCorrelationsAB // this name is used in lower-case format to // ------------------------------------------- // A) Process only reconstructed data: - void processRec(CollisionRec const& collision, BCs_Run3 const& bcs, TracksRec const& tracks) + void processRec(CollisionRec const& collision, BCs_Run3 const& bcs, TracksRec const& tracks, aod::FT0s const&) { // Remark: Do not use here LOGF(fatal, ...) or LOGF(info, ...), because their stdout/stderr is suppressed. Use them in regular member functions instead. // *) Steer all analysis steps: Steer(collision, bcs, tracks); } - PROCESS_SWITCH(MultiparticleCorrelationsAB, processRec, "process only reconstructed data", true); // yes, keep always one process switch "true", so that I have default running version + PROCESS_SWITCH(MultiparticleCorrelationsAB, processRec, "process only reconstructed data", false); // yes, keep always one process switch "true", so that I have default running version // ------------------------------------------- @@ -283,6 +292,19 @@ struct MultiparticleCorrelationsAB // this name is used in lower-case format to } PROCESS_SWITCH(MultiparticleCorrelationsAB, processTest, "test processing", false); + // ------------------------------------------- + + // K) Process data with more than necessary subscriptions to the tables, only for QA purposes: + // Remark 1: This is basically the main "processRec" switch, merely enhanced with subscription to few more tables, only for QA purposes. + // Remark 2: Ideally, i use the same workflow for "processRec" and "processQA", but most likely at some point I will have to establish separate workflow for "processQA" + void processQA(Collision_QA const& collision, BCs_QA const& bcs, TracksRec_QA const& tracks, aod::FT0s const&) + { + // Summary for additional tables subscribed to directly here: + // *) FT0s => bc.foundFT0().sumAmpC(), etc. + Steer(collision, bcs, tracks); + } + PROCESS_SWITCH(MultiparticleCorrelationsAB, processQA, "QA processing", true); + }; // struct MultiparticleCorrelationsAB // ------------------------------------------- From 31ca2836cb2a807ee42398c675408c3064c2b3d6 Mon Sep 17 00:00:00 2001 From: Sandeep Dudi <69388148+sdudi123@users.noreply.github.com> Date: Tue, 1 Apr 2025 18:38:33 +0200 Subject: [PATCH 0893/1650] [PWGUD] MC related error Solved (#10716) Co-authored-by: sandeep dudi --- PWGUD/TableProducer/SGCandProducer.cxx | 2 + PWGUD/Tasks/sginclusivePhiKstarSD.cxx | 209 ++++++++++++++----------- 2 files changed, 123 insertions(+), 88 deletions(-) diff --git a/PWGUD/TableProducer/SGCandProducer.cxx b/PWGUD/TableProducer/SGCandProducer.cxx index 51736bbea86..bc42a71016b 100644 --- a/PWGUD/TableProducer/SGCandProducer.cxx +++ b/PWGUD/TableProducer/SGCandProducer.cxx @@ -344,6 +344,8 @@ struct SGCandProducer { aod::FT0s const& ft0s, aod::FDDs const& fdds) { // select specific processes with the GeneratorID + if (!collision.has_mcCollision()) + return; auto mccol = collision.mcCollision(); if (verboseInfo) LOGF(info, "GeneratorId %d (%d)", mccol.getGeneratorId(), generatorIds->size()); diff --git a/PWGUD/Tasks/sginclusivePhiKstarSD.cxx b/PWGUD/Tasks/sginclusivePhiKstarSD.cxx index 0621f6e5438..d2550858d63 100644 --- a/PWGUD/Tasks/sginclusivePhiKstarSD.cxx +++ b/PWGUD/Tasks/sginclusivePhiKstarSD.cxx @@ -107,6 +107,9 @@ struct SginclusivePhiKstarSD { Configurable fillRotation{"fillRotation", true, "fill rotation"}; Configurable confMinRot{"confMinRot", 5.0 * o2::constants::math::PI / 6.0, "Minimum of rotation"}; Configurable confMaxRot{"confMaxRot", 7.0 * o2::constants::math::PI / 6.0, "Maximum of rotation"}; + // + Configurable reconstruction{"reconstruction", true, ""}; + Configurable generatedId{"generatedId", 31, ""}; void init(InitContext const& context) { @@ -157,14 +160,14 @@ struct SginclusivePhiKstarSD { } // qa plots if (qa) { - registry.add("tpc_dedx", "p vs dE/dx", kTH2F, {{100, 0.0, 10.0}, {5000, 0.0, 5000.0}}); - registry.add("tof_beta", "p vs beta", kTH2F, {{100, 0.0, 10.0}, {5000, 0.0, 5000.0}}); - - registry.add("tpc_dedx_kaon", "p#k dE/dx", kTH2F, {{100, 0.0, 10.0}, {5000, 0.0, 5000.0}}); - registry.add("tpc_dedx_pion", "p#pi dE/dx", kTH2F, {{100, 0.0, 10.0}, {5000, 0.0, 5000.0}}); - registry.add("tpc_dedx_kaon_1", "tpc+tof pid cut p#k dE/dx", kTH2F, {{100, 0.0, 10.0}, {5000, 0.0, 5000.0}}); - registry.add("tpc_dedx_kaon_2", "tpc+tof pid cut1 p#k dE/dx", kTH2F, {{100, 0.0, 10.0}, {5000, 0.0, 5000.0}}); - registry.add("tpc_dedx_pion_1", "tpc+tof pid cut p#pi dE/dx", kTH2F, {{100, 0.0, 10.0}, {5000, 0.0, 5000.0}}); + registry.add("tpc_dedx", "p vs dE/dx", kTH2F, {{100, 0.0, 10.0}, {500000, 0.0, 5000.0}}); + registry.add("tof_beta", "p vs beta", kTH2F, {{100, 0.0, 10.0}, {5000, 0.0, 25.0}}); + + registry.add("tpc_dedx_kaon", "p#k dE/dx", kTH2F, {{100, 0.0, 10.0}, {500000, 0.0, 5000.0}}); + registry.add("tpc_dedx_pion", "p#pi dE/dx", kTH2F, {{100, 0.0, 10.0}, {500000, 0.0, 5000.0}}); + registry.add("tpc_dedx_kaon_1", "tpc+tof pid cut p#k dE/dx", kTH2F, {{100, 0.0, 10.0}, {500000, 0.0, 5000.0}}); + registry.add("tpc_dedx_kaon_2", "tpc+tof pid cut1 p#k dE/dx", kTH2F, {{100, 0.0, 10.0}, {500000, 0.0, 5000.0}}); + registry.add("tpc_dedx_pion_1", "tpc+tof pid cut p#pi dE/dx", kTH2F, {{100, 0.0, 10.0}, {500000, 0.0, 1000.0}}); registry.add("tpc_nsigma_kaon", "p#k n#sigma", kTH2F, {{100, 0.0, 10.0}, {100, -10.0, 10.0}}); registry.add("tpc_nsigma_pion", "p#pi n#sigma", kTH2F, {{100, 0.0, 10.0}, {100, -10.0, 10.0}}); registry.add("tpc_tof_nsigma_kaon", "p#k n#sigma TPC vs TOF", kTH2F, {{100, -10.0, 10.0}, {100, -10.0, 10.0}}); @@ -192,6 +195,7 @@ struct SginclusivePhiKstarSD { registry.add("V0A", "V0A amplitude", kTH1F, {{1000, 0.0, 1000.0}}); registry.add("V0A_0", "V0A amplitude", kTH1F, {{1000, 0.0, 1000.0}}); registry.add("V0A_1", "V0A amplitude", kTH1F, {{1000, 0.0, 1000.0}}); + if (rapidityGap) { registry.add("mult_0", "mult0", kTH1F, {{150, 0, 150}}); registry.add("mult_1", "mult1", kTH1F, {{150, 0, 150}}); @@ -211,6 +215,8 @@ struct SginclusivePhiKstarSD { registry.add("gap_mult0", "Mult 0", kTH1F, {{100, 0.0, 100.0}}); registry.add("gap_mult1", "Mult 1", kTH1F, {{100, 0.0, 100.0}}); registry.add("gap_mult2", "Mult 2", kTH1F, {{100, 0.0, 100.0}}); + registry.add("Reco/tr_hist", "hist_stat", {HistType::kTH1F, {{10, -0.5, 9.5}}}); + // Multiplicity plot if (rapidityGap && phi) { registry.add("os_kk_mass_rap", "phi mass1", kTH3F, {{220, 0.98, 1.2}, {80, -2.0, 2.0}, {100, 0, 10}}); @@ -286,20 +292,17 @@ struct SginclusivePhiKstarSD { registry.add("MC/genM_1", "Generated events; Mass (GeV/c^2)", {HistType::kTH1F, {{220, 0.98, 1.2}}}); registry.add("MC/accMPtRap_phi_G", "Generated Phi; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH3F, {{220, 0.98, 1.20}, {200, 0.0, 10.0}, {60, -1.5, 1.5}}}); - registry.add("MC/accMPtRap_phi_T", "Reconstrcted Phi; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH3F, {{220, 0.98, 1.20}, {200, 0.0, 10.0}, {60, -1.5, 1.5}}}); registry.add("MC/accEtaPt", "Generated events in acceptance; eta (1); Pt (GeV/c)", {HistType::kTH2F, {{60, -1.5, 1.5}, {250, 0.0, 5.0}}}); registry.add("MC/accRap", "Generated events in acceptance; Rapidity (1)", {HistType::kTH1F, {{60, -1.5, 1.5}}}); registry.add("MC/accMPt", "Generated events in acceptance; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH2F, {{220, 0.98, 1.20}, {200, 0.0, 10.0}}}); registry.add("MC/accMPtRap", "Generated events in acceptance; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH3F, {{220, 0.98, 1.20}, {200, 0.0, 10.0}, {60, -1.5, 1.5}}}); registry.add("MC/accM", "Generated events in acceptance; Mass (GeV/c^2)", {HistType::kTH1F, {{220, 0.98, 1.20}}}); - registry.add("MC/selEtaPt", "Selected events in acceptance; eta (1); Pt (GeV/c)", {HistType::kTH2F, {{60, -1.5, 1.5}, {250, 0.0, 5.0}}}); registry.add("MC/selRap", "Selected events in acceptance; Rapidity (1)", {HistType::kTH1F, {{60, -1.5, 1.5}}}); registry.add("MC/selMPt", "Selected events in acceptance; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH2F, {{250, 2.5, 5.0}, {100, 0.0, 1.0}}}); registry.add("MC/pDiff", "McTruth - reconstructed track momentum; McTruth - reconstructed track momentum; Entries", {HistType::kTH2F, {{240, -6., 6.}, {3, -1.5, 1.5}}}); // K*0 registry.add("MC/accMPtRap_kstar_G", "Generated K*0; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH3F, {{400, 0., 2.0}, {200, 0.0, 10.0}, {60, -1.5, 1.5}}}); - registry.add("MC/accMPtRap_kstar_T", "Reconstructed K*0; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH3F, {{400, 0., 2.0}, {200, 0.0, 10.0}, {60, -1.5, 1.5}}}); registry.add("MC/genEtaPt_k", "Generated events; eta (1); Pt (GeV/c)", {HistType::kTH2F, {{60, -1.5, 1.5}, {250, 0.0, 5.0}}}); registry.add("MC/genRap_k", "Generated events; Rapidity (1)", {HistType::kTH1F, {{60, -1.5, 1.5}}}); registry.add("MC/genMPt_k", "Generated events; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH2F, {{400, 0., 2.0}, {200, 0.0, 10.0}}}); @@ -315,11 +318,13 @@ struct SginclusivePhiKstarSD { if (context.mOptions.get("processReco")) { registry.add("Reco/Stat", "Count reconstruted events; ; Entries", {HistType::kTH1F, {{5, -0.5, 4.5}}}); registry.add("Reco/nPVContributors", "Number of PV contributors per collision; Number of PV contributors; Entries", {HistType::kTH1F, {{51, -0.5, 50.5}}}); - registry.add("Reco/selEtaPt", "Selected events in acceptance; eta (1); Pt (GeV/c)", {HistType::kTH2F, {{300, -1.5, 1.5}, {250, 0.0, 5.0}}}); registry.add("Reco/selRap", "Selected events in acceptance; Rapidity (1)", {HistType::kTH1F, {{60, -1.5, 1.5}}}); registry.add("Reco/selMPt", "Reconstructed events in acceptance; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH2F, {{220, 0.98, 1.20}, {200, 0.0, 10.0}}}); registry.add("Reco/selMPtRap", "Reconstructed events in acceptance; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH3F, {{220, 0.98, 1.20}, {200, 0.0, 10.0}, {60, -1.5, 1.5}}}); registry.add("Reco/selMPtRap_gen", "Reconstructed(gen) events in acceptance; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH3F, {{220, 0.98, 1.20}, {200, 0.0, 10.0}, {60, -1.5, 1.5}}}); + registry.add("MC/accMPtRap_phi_T", "Reconstrcted Phi; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH3F, {{220, 0.98, 1.20}, {200, 0.0, 10.0}, {60, -1.5, 1.5}}}); + registry.add("MC/accMPtRap_kstar_T", "Reconstructed K*0; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH3F, {{400, 0., 2.0}, {200, 0.0, 10.0}, {60, -1.5, 1.5}}}); + registry.add("Reco/selPt", "Reconstructed events in acceptance;Pt (GeV/c)", {HistType::kTH1F, {{200, 0.0, 10.0}}}); registry.add("Reco/selM", "Reconstructed events in acceptance; Mass (GeV/c^2); ", {HistType::kTH1F, {{220, 0.98, 1.20}}}); registry.add("Reco/mcEtaPt", "Generated events in acceptance; eta (1); Pt (GeV/c)", {HistType::kTH2F, {{60, -1.5, 1.5}, {250, 0.0, 5.0}}}); @@ -327,7 +332,6 @@ struct SginclusivePhiKstarSD { registry.add("Reco/mcMPt", "Generated events in acceptance; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH2F, {{250, 2.5, 5.0}, {100, 0.0, 1.0}}}); registry.add("Reco/pDiff", "McTruth - reconstructed track momentum; McTruth - reconstructed track momentum; Entries", {HistType::kTH2F, {{240, -6., 6.}, {3, -1.5, 1.5}}}); - registry.add("Reco/selEtaPt_k", "Selected events in acceptance; eta (1); Pt (GeV/c)", {HistType::kTH2F, {{300, -1.5, 1.5}, {250, 0.0, 5.0}}}); registry.add("Reco/selRap_k", "Selected events in acceptance; Rapidity (1)", {HistType::kTH1F, {{60, -1.5, 1.5}}}); registry.add("Reco/selMPt_k", "Reconstructed events in acceptance; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH2F, {{400, 0., 2.0}, {200, 0.0, 10.0}}}); registry.add("Reco/selMPtRap_k", "Reconstructed events in acceptance; Mass (GeV/c^2); Pt (GeV/c)", {HistType::kTH3F, {{400, 0., 2.0}, {200, 0.0, 10.0}, {60, -1.5, 1.5}}}); @@ -353,6 +357,37 @@ struct SginclusivePhiKstarSD { registry.add("Reco/tr_chi2ncl_2", "chi2ncl", {HistType::kTH1F, {{100, 0.0, 100.0}}}); registry.add("Reco/tr_tpcnclfind_2", "tpcnclfind", {HistType::kTH1F, {{300, 0.0, 300.0}}}); registry.add("Reco/tr_itsChi2NCl_2", "itsChi2NCl", {HistType::kTH1F, {{200, 0.0, 200.0}}}); + + // qa + registry.add("tpc_dedx_mc", "p vs dE/dx", kTH2F, {{100, 0.0, 10.0}, {5000, 0.0, 5000.0}}); + registry.add("tof_beta_mc", "p vs beta", kTH2F, {{100, 0.0, 10.0}, {5000, 0.0, 5000.0}}); + + registry.add("tpc_dedx_kaon_mc", "p#k dE/dx", kTH2F, {{100, 0.0, 10.0}, {5000, 0.0, 5000.0}}); + registry.add("tpc_dedx_pion_mc", "p#pi dE/dx", kTH2F, {{100, 0.0, 10.0}, {5000, 0.0, 5000.0}}); + registry.add("tpc_nsigma_kaon_mc", "p#k n#sigma", kTH2F, {{100, 0.0, 10.0}, {100, -10.0, 10.0}}); + registry.add("tpc_nsigma_pion_mc", "p#pi n#sigma", kTH2F, {{100, 0.0, 10.0}, {100, -10.0, 10.0}}); + + registry.add("tpc_tof_nsigma_kaon_mc", "p#k n#sigma TPC vs TOF", kTH2F, {{100, -10.0, 10.0}, {100, -10.0, 10.0}}); + registry.add("tpc_tof_nsigma_pion_mc", "p#pi n#sigma TPC vs TOF", kTH2F, {{100, -10.0, 10.0}, {100, -10.0, 10.0}}); + + registry.add("tof_nsigma_kaon_mc", "p#k n#sigma", kTH2F, {{100, 0.0, 10.0}, {100, -10.0, 10.0}}); + registry.add("tof_nsigma_pion_mc", "p#pi n#sigma", kTH2F, {{100, 0.0, 10.0}, {100, -10.0, 10.0}}); + registry.add("tof_nsigma_kaon_f_mc", "p#k n#sigma", kTH2F, {{100, 0.0, 10.0}, {100, -10.0, 10.0}}); + registry.add("tof_nsigma_pion_f_mc", "p#pi n#sigma", kTH2F, {{100, 0.0, 10.0}, {100, -10.0, 10.0}}); + + registry.add("tpc_nsigma_kaon_f_mc", "p#k n#sigma", kTH2F, {{100, 0.0, 10.0}, {100, -10.0, 10.0}}); + registry.add("tpc_nsigma_pion_f_mc", "p#pi n#sigma", kTH2F, {{100, 0.0, 10.0}, {100, -10.0, 10.0}}); + + registry.add("FT0A_0_mc", "T0A amplitude", kTH1F, {{500, 0.0, 500.0}}); + registry.add("FT0A_1_mc", "T0A amplitude", kTH1F, {{20000, 0.0, 20000.0}}); + registry.add("FT0C_0_mc", "T0C amplitude", kTH1F, {{20000, 0.0, 20000.0}}); + registry.add("FT0C_1_mc", "T0C amplitude", kTH1F, {{500, 0.0, 500.0}}); + registry.add("ZDC_A_0_mc", "ZDC amplitude", kTH1F, {{2000, 0.0, 1000.0}}); + registry.add("ZDC_A_1_mc", "ZDC amplitude", kTH1F, {{2000, 0.0, 1000.0}}); + registry.add("ZDC_C_0_mc", "ZDC amplitude", kTH1F, {{2000, 0.0, 1000.0}}); + registry.add("ZDC_C_1_mc", "ZDC amplitude", kTH1F, {{2000, 0.0, 1000.0}}); + registry.add("V0A_0_mc", "V0A amplitude", kTH1F, {{1000, 0.0, 1000.0}}); + registry.add("V0A_1_mc", "V0A amplitude", kTH1F, {{1000, 0.0, 1000.0}}); } } } @@ -436,7 +471,7 @@ struct SginclusivePhiKstarSD { if (useTof && candidate.hasTOF() && ccut && (candidate.tofNSigmaPi() * candidate.tofNSigmaPi() + candidate.tpcNSigmaPi() * candidate.tpcNSigmaPi()) < nsigmaTofCut) { return true; } - if (useTof && candidate.hasTOF() && !ccut && std::abs(candidate.tpcNSigmaKa()) < nsigmaTpcCut && std::abs(candidate.tofNSigmaKa()) < nsigmaTofCut1) { + if (useTof && candidate.hasTOF() && !ccut && std::abs(candidate.tpcNSigmaPi()) < nsigmaTpcCut && std::abs(candidate.tofNSigmaPi()) < nsigmaTofCut1) { return true; } if (!useTof && std::abs(candidate.tpcNSigmaPi()) < nsigmaTpcCut) { @@ -532,8 +567,8 @@ struct SginclusivePhiKstarSD { int trackextra = 0; int trackextraDG = 0; for (const auto& track1 : tracks) { - if (!trackselector(track1, parameters)) - continue; + // if (!trackselector(track1, parameters)) + // continue; v0.SetXYZM(track1.px(), track1.py(), track1.pz(), o2::constants::physics::MassPionCharged); if (selectionPIDPion1(track1)) { onlyPionTrackspm.push_back(v0); @@ -547,7 +582,6 @@ struct SginclusivePhiKstarSD { rawPionTracksn.push_back(track1); } } - if (gapSide == 0) { mult0++; } @@ -1079,7 +1113,7 @@ struct SginclusivePhiKstarSD { } PROCESS_SWITCH(SginclusivePhiKstarSD, process, "Process unlike event", false); - using UDCollisionsFull1 = soa::Join; // + using UDCollisionsFull1 = soa::Join; // SliceCache cache; Partition posTracks = aod::udtrack::sign > 0; Partition negTracks = aod::udtrack::sign < 0; @@ -1102,6 +1136,10 @@ struct SginclusivePhiKstarSD { continue; if (truegapSide1 == -1) continue; + if (std::abs(collision1.posZ()) > vzCut || std::abs(collision2.posZ()) > vzCut) + continue; + if (std::abs(collision1.occupancyInTime()) > occCut || std::abs(collision2.occupancyInTime()) > occCut) + continue; auto posThisColl = posTracks->sliceByCached(aod::udtrack::udCollisionId, collision1.globalIndex(), cache); auto negThisColl = negTracks->sliceByCached(aod::udtrack::udCollisionId, collision2.globalIndex(), cache); // for (auto& [track1, track2] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(posThisColl, negThisColl))) { @@ -1172,14 +1210,15 @@ struct SginclusivePhiKstarSD { TLorentzVector v01; TLorentzVector vkstar; TLorentzVector vphi; - - // loop over all generated collisions for (const auto& mccollision : mccollisions) { + if (mccollision.generatorsID() != generatedId) + continue; registry.get(HIST("MC/Stat"))->Fill(0., 1.); // get reconstructed collision which belongs to mccollision auto colSlice = collisions.sliceBy(colPerMcCollision, mccollision.globalIndex()); registry.get(HIST("MC/recCols"))->Fill(colSlice.size(), 1.); - + if (reconstruction && colSlice.size() < 1) + continue; // get McParticles which belong to mccollision auto partSlice = McParts.sliceBy(partPerMcCollision, mccollision.globalIndex()); registry.get(HIST("MC/nParts"))->Fill(partSlice.size(), 1.); @@ -1217,17 +1256,16 @@ struct SginclusivePhiKstarSD { } } if (flag && flag1) { - registry.get(HIST("MC/genRap_k"))->Fill(v01.Rapidity(), 1.); registry.get(HIST("MC/genMPt_k"))->Fill(v01.M(), v01.Pt(), 1.); - registry.get(HIST("MC/genM_k"))->Fill(v01.M(), 1.); - if (std::abs(v0.Eta()) < 0.8 && std::abs(v1.Eta()) < 0.8 && v0.Pt() > 0.15 && v1.Pt() > 0.15) { - registry.get(HIST("MC/accRap_k"))->Fill(v01.Rapidity(), 1.); - registry.get(HIST("MC/accMPt_k"))->Fill(v01.M(), v01.Pt(), 1.); - registry.get(HIST("MC/accM_k"))->Fill(v01.M(), 1.); - registry.get(HIST("MC/accMPtRap_k"))->Fill(v01.M(), v01.Pt(), v01.Rapidity(), 1.); - } } + registry.get(HIST("MC/genRap_k"))->Fill(v01.Rapidity(), 1.); + registry.get(HIST("MC/genM_k"))->Fill(v01.M(), 1.); + registry.get(HIST("MC/accRap_k"))->Fill(v01.Rapidity(), 1.); + registry.get(HIST("MC/accMPt_k"))->Fill(v01.M(), v01.Pt(), 1.); + registry.get(HIST("MC/accM_k"))->Fill(v01.M(), 1.); + registry.get(HIST("MC/accMPtRap_k"))->Fill(v01.M(), v01.Pt(), v01.Rapidity(), 1.); } + if (std::abs(tr1.pdgCode()) != kKPlus || std::abs(tr2.pdgCode()) != kKPlus) continue; v0.SetXYZM(tr1.px(), tr1.py(), tr1.pz(), o2::constants::physics::MassKaonCharged); @@ -1259,20 +1297,17 @@ struct SginclusivePhiKstarSD { } } if (flag && flag1) { - registry.get(HIST("MC/genRap"))->Fill(v01.Rapidity(), 1.); registry.get(HIST("MC/genMPt"))->Fill(v01.M(), v01.Pt(), 1.); - registry.get(HIST("MC/genM"))->Fill(v01.M(), 1.); - if (std::abs(v0.Eta()) < 0.8 && std::abs(v1.Eta()) < 0.8 && v0.Pt() > 0.15 && v1.Pt() > 0.15) { - registry.get(HIST("MC/accRap"))->Fill(v01.Rapidity(), 1.); - registry.get(HIST("MC/accMPt"))->Fill(v01.M(), v01.Pt(), 1.); - registry.get(HIST("MC/accM"))->Fill(v01.M(), 1.); - registry.get(HIST("MC/accMPtRap"))->Fill(v01.M(), v01.Pt(), v01.Rapidity(), 1.); - } } + // registry.get(HIST("MC/genRap"))->Fill(v01.Rapidity(), 1.); + // registry.get(HIST("MC/genM"))->Fill(v01.M(), 1.); + registry.get(HIST("MC/accRap"))->Fill(v01.Rapidity(), 1.); + registry.get(HIST("MC/accMPt"))->Fill(v01.M(), v01.Pt(), 1.); + registry.get(HIST("MC/accM"))->Fill(v01.M(), 1.); + registry.get(HIST("MC/accMPtRap"))->Fill(v01.M(), v01.Pt(), v01.Rapidity(), 1.); } // compute the difference between generated and reconstructed particle momentum for (const auto& McPart : partSlice) { - // get track which corresponds to McPart auto trackSlice = tracks.sliceBy(trackPerMcParticle, McPart.globalIndex()); registry.get(HIST("MC/nRecTracks"))->Fill(trackSlice.size(), 1.); // compute momentum difference between MCTruth and Reconstruction @@ -1294,7 +1329,9 @@ struct SginclusivePhiKstarSD { // ............................................................................................................... void processReco(CC const& collision, TCs const& tracks, aod::UDMcCollisions const& /*mccollisions*/, aod::UDMcParticles const& /*McParts*/) { - // number of McCollisions in DF + auto mccoll = collision.udMcCollision(); + if (mccoll.generatorsID() != generatedId) + return; float fitCut[5] = {fv0Cut, ft0aCut, ft0cCut, fddaCut, fddcCut}; std::vector parameters = {pvCut, dcazCut, dcaxyCut, tpcChi2Cut, tpcNClsFindableCut, itsChi2Cut, etaCut, ptCut}; int truegapSide = sgSelector.trueGap(collision, fitCut[0], fitCut[1], fitCut[2], zdcCut); @@ -1319,21 +1356,19 @@ struct SginclusivePhiKstarSD { TLorentzVector vr1g; TLorentzVector vr01g; int t1 = 0; - if (qa) { - if (truegapSide == 0) { - registry.fill(HIST("V0A_0"), collision.totalFV0AmplitudeA()); - registry.fill(HIST("FT0A_0"), collision.totalFT0AmplitudeA()); - registry.fill(HIST("FT0C_0"), collision.totalFT0AmplitudeC()); - registry.fill(HIST("ZDC_A_0"), collision.energyCommonZNA()); - registry.fill(HIST("ZDC_C_0"), collision.energyCommonZNC()); - } - if (truegapSide == 1) { - registry.fill(HIST("V0A_1"), collision.totalFV0AmplitudeA()); - registry.fill(HIST("FT0A_1"), collision.totalFT0AmplitudeA()); - registry.fill(HIST("FT0C_1"), collision.totalFT0AmplitudeC()); - registry.fill(HIST("ZDC_A_1"), collision.energyCommonZNA()); - registry.fill(HIST("ZDC_C_1"), collision.energyCommonZNC()); - } + if (truegapSide == 0) { + registry.fill(HIST("V0A_0_mc"), collision.totalFV0AmplitudeA()); + registry.fill(HIST("FT0A_0_mc"), collision.totalFT0AmplitudeA()); + registry.fill(HIST("FT0C_0_mc"), collision.totalFT0AmplitudeC()); + registry.fill(HIST("ZDC_A_0_mc"), collision.energyCommonZNA()); + registry.fill(HIST("ZDC_C_0_mc"), collision.energyCommonZNC()); + } + if (truegapSide == 1) { + registry.fill(HIST("V0A_1_mc"), collision.totalFV0AmplitudeA()); + registry.fill(HIST("FT0A_1_mc"), collision.totalFT0AmplitudeA()); + registry.fill(HIST("FT0C_1_mc"), collision.totalFT0AmplitudeC()); + registry.fill(HIST("ZDC_A_1_mc"), collision.energyCommonZNA()); + registry.fill(HIST("ZDC_C_1_mc"), collision.energyCommonZNC()); } for (const auto& tr1 : tracks) { if (!tr1.has_udMcParticle()) @@ -1354,26 +1389,24 @@ struct SginclusivePhiKstarSD { registry.get(HIST("Reco/tr_tpcnclfind_2"))->Fill(tr1.tpcNClsFindable(), 1.); registry.get(HIST("Reco/tr_itsChi2NCl_2"))->Fill(tr1.itsChi2NCl(), 1.); v0.SetXYZM(tr1.px(), tr1.py(), tr1.pz(), o2::constants::physics::MassPionCharged); - if (qa) { - registry.fill(HIST("tpc_dedx"), v0.P(), tr1.tpcSignal()); - registry.fill(HIST("tof_beta"), v0.P(), tr1.beta()); - registry.fill(HIST("tof_nsigma_kaon_f"), v0.Pt(), tr1.tofNSigmaKa()); - registry.fill(HIST("tof_nsigma_pion_f"), v0.Pt(), tr1.tofNSigmaPi()); - registry.fill(HIST("tpc_nsigma_kaon_f"), v0.Pt(), tr1.tpcNSigmaKa()); - registry.fill(HIST("tpc_nsigma_pion_f"), v0.Pt(), tr1.tpcNSigmaPi()); - if (selectionPIDKaon1(tr1)) { - registry.fill(HIST("tpc_dedx_kaon_1"), v0.P(), tr1.tpcSignal()); - registry.fill(HIST("tpc_nsigma_kaon"), v0.Pt(), tr1.tpcNSigmaKa()); - registry.fill(HIST("tof_nsigma_kaon"), v0.Pt(), tr1.tofNSigmaKa()); - registry.fill(HIST("tpc_tof_nsigma_kaon"), tr1.tpcNSigmaKa(), tr1.tofNSigmaKa()); - } - if (selectionPIDPion1(tr1)) { - registry.fill(HIST("tpc_dedx_pion_1"), v0.P(), tr1.tpcSignal()); - registry.fill(HIST("tpc_nsigma_pion"), v0.Pt(), tr1.tpcNSigmaPi()); - registry.fill(HIST("tof_nsigma_pion"), v0.Pt(), tr1.tofNSigmaPi()); - registry.fill(HIST("tpc_tof_nsigma_pion"), tr1.tpcNSigmaPi(), tr1.tofNSigmaPi()); - } + + registry.fill(HIST("tpc_dedx_mc"), v0.P(), tr1.tpcSignal()); + registry.fill(HIST("tof_beta_mc"), v0.P(), tr1.beta()); + registry.fill(HIST("tof_nsigma_kaon_f_mc"), v0.Pt(), tr1.tofNSigmaKa()); + registry.fill(HIST("tof_nsigma_pion_f_mc"), v0.Pt(), tr1.tofNSigmaPi()); + registry.fill(HIST("tpc_nsigma_kaon_f_mc"), v0.Pt(), tr1.tpcNSigmaKa()); + registry.fill(HIST("tpc_nsigma_pion_f_mc"), v0.Pt(), tr1.tpcNSigmaPi()); + if (selectionPIDKaon1(tr1)) { + registry.fill(HIST("tpc_nsigma_kaon_mc"), v0.Pt(), tr1.tpcNSigmaKa()); + registry.fill(HIST("tof_nsigma_kaon_mc"), v0.Pt(), tr1.tofNSigmaKa()); + registry.fill(HIST("tpc_tof_nsigma_kaon_mc"), tr1.tpcNSigmaKa(), tr1.tofNSigmaKa()); + } + if (selectionPIDPion1(tr1)) { + registry.fill(HIST("tpc_nsigma_pion_mc"), v0.Pt(), tr1.tpcNSigmaPi()); + registry.fill(HIST("tof_nsigma_pion_mc"), v0.Pt(), tr1.tofNSigmaPi()); + registry.fill(HIST("tpc_tof_nsigma_pion_mc"), tr1.tpcNSigmaPi(), tr1.tofNSigmaPi()); } + t1++; vr0.SetXYZM(tr1.px(), tr1.py(), tr1.pz(), o2::constants::physics::MassKaonCharged); registry.get(HIST("Reco/trpt"))->Fill(vr0.Pt(), 1.); @@ -1417,18 +1450,19 @@ struct SginclusivePhiKstarSD { } } } + vr0g.SetXYZM(mcPart1.px(), mcPart1.py(), mcPart1.pz(), o2::constants::physics::MassKaonCharged); + vr1g.SetXYZM(mcPart2.px(), mcPart2.py(), mcPart2.pz(), o2::constants::physics::MassKaonCharged); + vr01g = vr0g + vr1g; + vr01 = vr0 + vr1; + if (flag && flag1) { - vr0g.SetXYZM(mcPart1.px(), mcPart1.py(), mcPart1.pz(), o2::constants::physics::MassKaonCharged); - vr1g.SetXYZM(mcPart2.px(), mcPart2.py(), mcPart2.pz(), o2::constants::physics::MassKaonCharged); - vr01g = vr0g + vr1g; - vr01 = vr0 + vr1; - registry.get(HIST("Reco/selRap"))->Fill(vr01.Rapidity(), 1.); registry.get(HIST("Reco/selMPt"))->Fill(vr01.M(), vr01.Pt(), 1.); - registry.get(HIST("Reco/selMPtRap"))->Fill(vr01.M(), vr01.Pt(), vr01.Rapidity(), 1.); - registry.get(HIST("Reco/selPt"))->Fill(vr01.Pt(), 1.); - registry.get(HIST("Reco/selM"))->Fill(vr01.M(), 1.); - registry.get(HIST("Reco/selMPtRap_gen"))->Fill(vr01g.M(), vr01g.Pt(), vr01g.Rapidity(), 1.); } + registry.get(HIST("Reco/selRap"))->Fill(vr01.Rapidity(), 1.); + registry.get(HIST("Reco/selMPtRap"))->Fill(vr01.M(), vr01.Pt(), vr01.Rapidity(), 1.); + registry.get(HIST("Reco/selPt"))->Fill(vr01.Pt(), 1.); + registry.get(HIST("Reco/selM"))->Fill(vr01.M(), 1.); + registry.get(HIST("Reco/selMPtRap_gen"))->Fill(vr01g.M(), vr01g.Pt(), vr01g.Rapidity(), 1.); } } } @@ -1479,14 +1513,13 @@ struct SginclusivePhiKstarSD { } } if (flag && flag1) { - registry.get(HIST("Reco/selM_k_K"))->Fill(vr01.M(), 1.); - registry.get(HIST("Reco/selRap_k"))->Fill(vr01.Rapidity(), 1.); registry.get(HIST("Reco/selMPt_k"))->Fill(vr01.M(), vr01.Pt(), 1.); - registry.get(HIST("Reco/selMPtRap_k"))->Fill(vr01.M(), vr01.Pt(), vr01.Rapidity(), 1.); - registry.get(HIST("Reco/selPt_k"))->Fill(vr01.Pt(), 1.); - // registry.get(HIST("Reco/selM_k"))->Fill(vr01_g.M(), 1.); - registry.get(HIST("Reco/selMPtRap_k_gen"))->Fill(vr01g.M(), vr01g.Pt(), vr01g.Rapidity(), 1.); } + registry.get(HIST("Reco/selM_k_K"))->Fill(vr01.M(), 1.); + registry.get(HIST("Reco/selRap_k"))->Fill(vr01.Rapidity(), 1.); + registry.get(HIST("Reco/selMPtRap_k"))->Fill(vr01.M(), vr01.Pt(), vr01.Rapidity(), 1.); + registry.get(HIST("Reco/selPt_k"))->Fill(vr01.Pt(), 1.); + registry.get(HIST("Reco/selMPtRap_k_gen"))->Fill(vr01g.M(), vr01g.Pt(), vr01g.Rapidity(), 1.); } } registry.get(HIST("Reco/nTracks"))->Fill(t1, 1.); From 6205928036b523b4ec28eb01ec4efde9df39a66f Mon Sep 17 00:00:00 2001 From: Chiara Pinto <48326672+chiarapinto@users.noreply.github.com> Date: Tue, 1 Apr 2025 19:22:38 +0200 Subject: [PATCH 0894/1650] [PWGLF] adding response matrix for unfolding jet pt (#10724) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Nuspex/antinucleiInJets.cxx | 41 +++++++++++++++++++------ 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx index 776342f8107..d925de5561f 100644 --- a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx +++ b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx @@ -122,10 +122,16 @@ struct AntinucleiInJets { Configurable pathToFile{"pathToFile", "", "path to file with reweighting"}; Configurable histoNameWeightAntipJet{"histoNameWeightAntipJet", "", "reweighting histogram: antip in jet"}; Configurable histoNameWeightAntipUe{"histoNameWeightAntipUe", "", "reweighting histogram: antip in ue"}; - TH2F* twoDweightsAntipJet; TH2F* twoDweightsAntipUe; + // jet pt unfolding + Configurable applyPtUnfolding{"applyPtUnfolding", true, "apply jet pt unfolding"}; + Configurable urlToCcdbPtUnfolding{"urlToCcdbPtUnfolding", "http://alice-ccdb.cern.ch", "url of the personal ccdb"}; + Configurable pathToFilePtUnfolding{"pathToFilePtUnfolding", "Users/c/chpinto/My/Object/ResponseMatrix", "path to file with pt unfolding"}; + Configurable histoNamePtUnfolding{"histoNamePtUnfolding", "detectorResponseMatrix", "pt unfolding histogram"}; + TH2F* responseMatrix; + Service ccdb; o2::ccdb::CcdbApi ccdbApi; @@ -146,6 +152,12 @@ struct AntinucleiInJets { twoDweightsAntipUe = nullptr; } + if (applyPtUnfolding) { + getPtUnfoldingHistogram(ccdb, TString(pathToFilePtUnfolding), TString(histoNamePtUnfolding)); + } else { + responseMatrix = nullptr; + } + // binning double min = 0.0; double max = 6.0; @@ -439,6 +451,21 @@ struct AntinucleiInJets { return ptGen; } + void getPtUnfoldingHistogram(o2::framework::Service const& ccdbObj, TString filepath, TString histoNamePtUnfolding) + { + TList* l = ccdbObj->get(filepath.Data()); + if (!l) { + LOGP(error, "Could not open the file {}", Form("%s", filepath.Data())); + return; + } + responseMatrix = static_cast(l->FindObject(Form("%s", histoNamePtUnfolding.Data()))); + if (!responseMatrix) { + LOGP(error, "Could not open histogram {}", Form("%s", histoNamePtUnfolding.Data())); + return; + } + LOGP(info, "Opened histogram {}", Form("%s", histoNamePtUnfolding.Data())); + } + void getReweightingHistograms(o2::framework::Service const& ccdbObj, TString filepath, TString histname_antip_jet, TString histname_antip_ue) { TList* l = ccdbObj->get(filepath.Data()); @@ -533,8 +560,7 @@ struct AntinucleiInJets { // jet pt must be larger than threshold auto jetForSub = jet; fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jetForSub, rhoPerp, rhoMPerp); - // if (getCorrectedPt(jetMinusBkg.pt()) < minJetPt) // while fixing the response matrix - if (jetMinusBkg.pt() < minJetPt) + if (getCorrectedPt(jetMinusBkg.pt(), responseMatrix) < minJetPt) continue; isAtLeastOneJetSelected = true; @@ -766,8 +792,7 @@ struct AntinucleiInJets { double ptJetAfterSub = jetForSub.pt(); registryQC.fill(HIST("jetPtDifference"), ptJetAfterSub - ptJetBeforeSub); - // if (getCorrectedPt(jetMinusBkg.pt()) < minJetPt) // while fixing the response matrix - if (jetMinusBkg.pt() < minJetPt) + if (getCorrectedPt(jetMinusBkg.pt(), responseMatrix) < minJetPt) continue; njetsHighPt++; registryQC.fill(HIST("sumPtJet"), jet.pt()); @@ -1126,8 +1151,7 @@ struct AntinucleiInJets { // jet pt must be larger than threshold auto jetForSub = jet; fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jetForSub, rhoPerp, rhoMPerp); - // if (getCorrectedPt(jetMinusBkg.pt()) < minJetPt) // while fixing the response matrix - if (jetMinusBkg.pt() < minJetPt) + if (getCorrectedPt(jetMinusBkg.pt(), responseMatrix) < minJetPt) continue; // perpendicular cone @@ -1302,8 +1326,7 @@ struct AntinucleiInJets { // jet pt must be larger than threshold auto jetForSub = jet; fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jetForSub, rhoPerp, rhoMPerp); - // if (getCorrectedPt(jetMinusBkg.pt()) < minJetPt) // while fixing the response matrix - if (jetMinusBkg.pt() < minJetPt) + if (getCorrectedPt(jetMinusBkg.pt(), responseMatrix) < minJetPt) continue; // get jet constituents From 5b6b8cbbb4168368ebc50c0e90f59b14ad08ecf1 Mon Sep 17 00:00:00 2001 From: altsybee Date: Tue, 1 Apr 2025 23:11:01 +0200 Subject: [PATCH 0895/1650] [DPG] add a new dEdx vs occupancy task (#10727) --- DPG/Tasks/AOTEvent/CMakeLists.txt | 5 + .../dEdxVsOccupancyWithTrackQAinfo.cxx | 471 ++++++++++++++++++ DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx | 41 +- 3 files changed, 511 insertions(+), 6 deletions(-) create mode 100644 DPG/Tasks/AOTEvent/dEdxVsOccupancyWithTrackQAinfo.cxx diff --git a/DPG/Tasks/AOTEvent/CMakeLists.txt b/DPG/Tasks/AOTEvent/CMakeLists.txt index 35d71da214c..4cf8873a59f 100644 --- a/DPG/Tasks/AOTEvent/CMakeLists.txt +++ b/DPG/Tasks/AOTEvent/CMakeLists.txt @@ -43,3 +43,8 @@ o2physics_add_dpl_workflow(rof-occupancy-qa SOURCES rofOccupancyQa.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::AnalysisCCDB O2::DetectorsBase COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(occupancy-vs-dedx-qa + SOURCES dEdxVsOccupancyWithTrackQAinfo.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::AnalysisCCDB O2::DetectorsBase + COMPONENT_NAME Analysis) diff --git a/DPG/Tasks/AOTEvent/dEdxVsOccupancyWithTrackQAinfo.cxx b/DPG/Tasks/AOTEvent/dEdxVsOccupancyWithTrackQAinfo.cxx new file mode 100644 index 00000000000..36af0603ee8 --- /dev/null +++ b/DPG/Tasks/AOTEvent/dEdxVsOccupancyWithTrackQAinfo.cxx @@ -0,0 +1,471 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file dEdxVsOccupancyWithTrackQAinfo.cxx +/// \brief dE/dx vs occupancy QA task with more detailed checks +/// +/// \author Igor Altsybeev + +#include +#include "map" + +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/CCDB/EventSelectionParams.h" +#include "Common/CCDB/ctpRateFetcher.h" +#include "CCDB/BasicCCDBManager.h" +#include "Framework/HistogramRegistry.h" +#include "CommonDataFormat/BunchFilling.h" +#include "DataFormatsParameters/GRPLHCIFData.h" +#include "DataFormatsParameters/GRPECSObject.h" +#include "Common/Core/TrackSelection.h" +#include "Common/Core/TrackSelectionDefaults.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/Centrality.h" +#include "DataFormatsParameters/AggregatedRunInfo.h" + +#include "TH1F.h" +#include "TH2F.h" +#include "TH3.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::aod::evsel; + +using BCsRun3 = soa::Join; +using ColEvSels = soa::Join; +// using ColEvSels = soa::Join; +using FullTracksIU = soa::Join; + +struct dEdxVsOccupancyWithTrackQAinfoTask { + // configurables for study of occupancy in time windows + // Configurable confAddBasicQAhistos{"AddBasicQAhistos", true, "0 - add basic histograms, 1 - skip"}; // o2-linter: disable=name/configurable (temporary fix) + // Configurable confTimeIntervalForOccupancyCalculation{"TimeIntervalForOccupancyCalculation", 100, "Time interval for TPC occupancy calculation, us"}; // o2-linter: disable=name/configurable (temporary fix) + // Configurable confFlagCentralityIsAvailable{"FlagCentralityIsAvailable", true, "Fill centrality-related historams"}; // o2-linter: disable=name/configurable (temporary fix) + // Configurable confFlagManyHeavyHistos{"FlagManyHeavyHistos", true, "Fill more TH2, TH3, THn historams"}; // o2-linter: disable=name/configurable (temporary fix) + + // event and track cuts for given event + Configurable confCutVertZMinThisEvent{"VzMinThisEvent", -10, "vZ cut for a current event"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confCutVertZMaxThisEvent{"VzMaxThisEvent", 10, "vZ cut for a current event"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confCutPtMinThisEvent{"PtMinThisEvent", 0.2, "pt cut for particles in a current event"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confCutPtMaxThisEvent{"PtMaxThisEvent", 100., "pt cut for particles in a current event"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confCutEtaMinTracksThisEvent{"EtaMinTracksThisEvent", -0.8, "eta cut for particles in a current event"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confCutEtaMaxTracksThisEvent{"EtaMaxTracksThisEvent", 0.8, "eta cut for particles in a current event"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confCutMinTPCcls{"MinNumTPCcls", 70, "min number of TPC clusters for a current event"}; // o2-linter: disable=name/configurable (temporary fix) + + uint64_t minGlobalBC = 0; + Service ccdb; + HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + bool* applySelection = NULL; + int nBCsPerOrbit = 3564; + int lastRunNumber = -1; + int nOrbits; + double minOrbit; + int64_t bcSOR = 0; // global bc of the start of the first orbit, setting 0 by default for unanchored MC + int64_t nBCsPerTF = 128 * nBCsPerOrbit; // duration of TF in bcs, should be 128*3564 or 32*3564, setting 128 orbits by default sfor unanchored MC + ctpRateFetcher mRateFetcher; + + // save time "slices" for several collisions for QA + bool flagFillQAtimeOccupHist = false; + int nCollisionsForTimeBinQA = 40; + int counterQAtimeOccupHistos = 0; + + void init(InitContext&) + { + // ccdb->setURL("http://ccdb-test.cern.ch:8080"); + ccdb->setURL("http://alice-ccdb.cern.ch"); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + + // dE/dx + AxisSpec axisDeDx{800, 0.0, 800.0, "dE/dx (a. u.)"}; + histos.add("dEdx_vs_Momentum_CORRECTED", "dE/dx", kTH2F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx}); + histos.add("dEdx_vs_Momentum", "dE/dx", kTH2F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx}); + // histos.add("dEdx_vs_Momentum_occupBelow200", "dE/dx", kTH2F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx}); + // histos.add("dEdx_vs_Momentum_occupBelow200_kNoCollStd", "dE/dx", kTH2F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx}); + // histos.add("dEdx_vs_Momentum_occupAbove4000", "dE/dx", kTH2F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx}); + // histos.add("dEdx_vs_Momentum_NegativeFractionNclsPID", "dE/dx", kTH2F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx}); + // histos.add("dEdx_vs_Momentum_HighFractionNclsNonPID", "dE/dx", kTH2F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx}); + AxisSpec axisBinsOccupStudydEdx{{0., 500, 1000, 2000, 4000, 6000, 8000, 15000}, "p_{T}"}; + // histos.add("dEdx_vs_Momentum_vs_occup", "dE/dx", kTH3F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx, axisBinsOccupStudydEdx}); + // if (confFlagManyHeavyHistos) { + // histos.add("dEdx_vs_Momentum_vs_occup_eta_02_04", "dE/dx", kTH3F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx, axisBinsOccupStudydEdx}); + // histos.add("dEdx_vs_Momentum_vs_occup_eta_04_02", "dE/dx", kTH3F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx, axisBinsOccupStudydEdx}); + // } + histos.add("dEdx_3OROC_tot_vs_Momentum_vs_occup_eta_02_04", "dE/dx", kTH3F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx, axisBinsOccupStudydEdx}); + histos.add("dEdx_3OROC_tot_vs_Momentum_vs_occup_eta_04_02", "dE/dx", kTH3F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx, axisBinsOccupStudydEdx}); + histos.add("dEdx_3OROC_max_vs_Momentum_vs_occup_eta_02_04", "dE/dx", kTH3F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx, axisBinsOccupStudydEdx}); + histos.add("dEdx_3OROC_max_vs_Momentum_vs_occup_eta_04_02", "dE/dx", kTH3F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx, axisBinsOccupStudydEdx}); + + // track QA info + histos.add("tpcdEdxMax0R_vs_Momentum", "dE/dx", kTH2F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx}); + histos.add("tpcdEdxMax1R_vs_Momentum", "dE/dx", kTH2F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx}); + histos.add("tpcdEdxMax2R_vs_Momentum", "dE/dx", kTH2F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx}); + histos.add("tpcdEdxMax3R_vs_Momentum", "dE/dx", kTH2F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx}); + + histos.add("tpcdEdxTot0R_vs_Momentum", "dE/dx", kTH2F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx}); + histos.add("tpcdEdxTot1R_vs_Momentum", "dE/dx", kTH2F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx}); + histos.add("tpcdEdxTot2R_vs_Momentum", "dE/dx", kTH2F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx}); + histos.add("tpcdEdxTot3R_vs_Momentum", "dE/dx", kTH2F, {{1000, -5.0, 5.0, "#it{p}/Z (GeV/c)"}, axisDeDx}); + + histos.add("tpcdEdxTot3R_vs_dEdxFromTracks", "dE/dx", kTH2F, {axisDeDx, axisDeDx}); + histos.add("tpcdEdxTotSUM_vs_dEdxFromTracks", "dE/dx", kTH2F, {axisDeDx, axisDeDx}); + histos.add("tpcdEdxMaxSUM_vs_dEdxFromTracks", "dE/dx", kTH2F, {axisDeDx, axisDeDx}); + + histos.add("tpcdEdxAverageMax_vs_dEdxFromTracks", "dE/dx", kTH2F, {axisDeDx, axisDeDx}); + histos.add("tpcdEdxAverageTot_vs_dEdxFromTracks", "dE/dx", kTH2F, {axisDeDx, axisDeDx}); + + histos.add("tpcdEdxAverageMax_3OROC_vs_dEdxFromTracks", "dE/dx", kTH2F, {axisDeDx, axisDeDx}); + histos.add("tpcdEdxAverageTot_3OROC_vs_dEdxFromTracks", "dE/dx", kTH2F, {axisDeDx, axisDeDx}); + + histos.add("tpcdEdxCORRECTED_vs_dEdxFromTracks", "dE/dx", kTH2F, {axisDeDx, axisDeDx}); + + const AxisSpec axisDcaZ{1000, -5., 5., "DCA_{z}, cm"}; + histos.add("dcaXY_vs_dcaXYqa", "dE/dx", kTH2F, {axisDcaZ, {601, -300.5, 300.5, "DCA_{z}, cm"}}); + histos.add("dcaZ_vs_dcaZqa", "dE/dx", kTH2F, {axisDcaZ, {601, -300.5, 300.5, "DCA_{z}, cm"}}); + + AxisSpec axisOccupancyForDeDxStudies{60, 0, 15000, "occupancy"}; + histos.add("dEdx_vs_centr_vs_occup_narrow_p_win", "dE/dx", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, axisOccupancyForDeDxStudies, axisDeDx}); + // histos.add("dEdx_vs_centr_vs_occup_narrow_p_win_pos", "dE/dx", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, axisOccupancyForDeDxStudies, axisDeDx}); + // histos.add("dEdx_vs_centr_vs_occup_narrow_p_win_neg", "dE/dx", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, axisOccupancyForDeDxStudies, axisDeDx}); + // histos.add("dEdx_vs_centr_vs_occup_narrow_p_win_pos_FractionPIDclsInRange", "dE/dx", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, axisOccupancyForDeDxStudies, axisDeDx}); + // histos.add("dEdx_vs_centr_vs_occup_narrow_p_win_neg_FractionPIDclsInRange", "dE/dx", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, axisOccupancyForDeDxStudies, axisDeDx}); + + histos.add("dEdx_3OROC_max_vs_centr_vs_occup_narrow_p_win", "dE/dx", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, axisOccupancyForDeDxStudies, axisDeDx}); + histos.add("dEdx_3OROC_tot_vs_centr_vs_occup_narrow_p_win", "dE/dx", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, axisOccupancyForDeDxStudies, axisDeDx}); + + histos.add("dEdx_vs_centr_vs_occup_narrow_p_win_CORRECTED", "dE/dx", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, axisOccupancyForDeDxStudies, axisDeDx}); + + // AxisSpec axisFractionNclsFindableMinusPID{110, -1.1, 1.1, "TPC nClsFindableMinusPID / nClsFindable"}; + // histos.add("fraction_tpcNClsFindableMinusPID_vs_occup", "", kTH2D, {axisOccupancyForDeDxStudies, axisFractionNclsFindableMinusPID}); + // histos.add("fraction_tpcNClsFindableMinusPID_vs_occup_peripheralByV0A", "", kTH2D, {axisOccupancyForDeDxStudies, axisFractionNclsFindableMinusPID}); + // histos.add("fraction_tpcNClsFindableMinusPID_vs_occup_centralByV0A", "", kTH2D, {axisOccupancyForDeDxStudies, axisFractionNclsFindableMinusPID}); + // histos.add("fraction_tpcNClsFindableMinusPID_vs_occup_eta02", "", kTH2D, {axisOccupancyForDeDxStudies, axisFractionNclsFindableMinusPID}); + // histos.add("fraction_tpcNClsFindableMinusPID_vs_occup_pos", "", kTH2D, {axisOccupancyForDeDxStudies, axisFractionNclsFindableMinusPID}); + // histos.add("fraction_tpcNClsFindableMinusPID_vs_occup_neg", "", kTH2D, {axisOccupancyForDeDxStudies, axisFractionNclsFindableMinusPID}); + // histos.add("fraction_tpcNClsFindableMinusPID_vs_occup_lowPt", "", kTH2D, {axisOccupancyForDeDxStudies, axisFractionNclsFindableMinusPID}); + // histos.add("fraction_tpcNClsFindableMinusPID_vs_occup_highPt", "", kTH2D, {axisOccupancyForDeDxStudies, axisFractionNclsFindableMinusPID}); + + // QA dEdx correction coeff + histos.add("dEdx_CORRECTION_COEFF", "coeff", kTH1F, {{1000, -2.0, 2.0, "correction coeff"}}); + } + + Preslice perCollision = aod::track::collisionId; + + float fReal_fTPCSignalN(float mbb0R1, float a1pt, float atgl, float atglmbb0R1, float a1ptmbb0R1, float side, float a1pt2, float fTrackOccN, float fOccTPCN, float fTrackOccMeanN) + { + return ((0.017012 * mbb0R1) + (-0.0018469 * a1pt) + (-0.0052177 * atgl) + (-0.0035655 * atglmbb0R1) + (0.0017846 * a1ptmbb0R1) + (0.0019127 * side) + (-0.00012964 * a1pt2) + (0.013066)) * fTrackOccN + ((0.0055592 * mbb0R1) + (-0.0010618 * a1pt) + (-0.0016134 * atgl) + (-0.0059098 * atglmbb0R1) + (0.0013335 * a1ptmbb0R1) + (0.00052133 * side) + (3.1119e-05 * a1pt2) + (0.0049428)) * fOccTPCN + ((0.00077317 * mbb0R1) + (-0.0013827 * a1pt) + (0.003249 * atgl) + (-0.00063689 * atglmbb0R1) + (0.0016218 * a1ptmbb0R1) + (-0.00045215 * side) + (-1.5815e-05 * a1pt2) + (-0.004882)) * fTrackOccMeanN + ((-0.015053 * mbb0R1) + (0.0018912 * a1pt) + (-0.012305 * atgl) + (0.081387 * atglmbb0R1) + (0.003205 * a1ptmbb0R1) + (-0.0087404 * side) + (-0.0028608 * a1pt2) + (0.99091)); + }; + void processRun3( + ColEvSels const& cols, + FullTracksIU const& tracks, + BCsRun3 const& bcs, + aod::TracksQA_002 const& tracksQA, + aod::FT0s const&) + { + int runNumber = bcs.iteratorAt(0).runNumber(); + if (runNumber != lastRunNumber) { + lastRunNumber = runNumber; // do it only once + + if (runNumber >= 500000) { + auto runInfo = o2::parameters::AggregatedRunInfo::buildAggregatedRunInfo(o2::ccdb::BasicCCDBManager::instance(), runNumber); + // first bc of the first orbit + bcSOR = runInfo.orbitSOR * o2::constants::lhc::LHCMaxBunches; + // duration of TF in bcs + nBCsPerTF = runInfo.orbitsPerTF * o2::constants::lhc::LHCMaxBunches; + + LOGP(info, "bcSOR = {}, nBCsPerTF = {}", bcSOR, nBCsPerTF); + } + } + + // track QA table + std::vector labelTrack2TrackQA; + labelTrack2TrackQA.clear(); + labelTrack2TrackQA.resize(tracks.size(), -1); + for (const auto& trackQA : tracksQA) { + int64_t trackId = trackQA.trackId(); + int64_t trackQAIndex = trackQA.globalIndex(); + labelTrack2TrackQA[trackId] = trackQAIndex; + } + + for (const auto& col : cols) { + if (!col.sel8()) + continue; + + // check hadronic rate + auto bc = col.foundBC_as(); + int64_t ts = bc.timestamp(); + double hadronicRate = mRateFetcher.fetch(ccdb.service, ts, runNumber, "ZNC hadronic") * 1.e-3; // kHz + const int multTPC = col.multTPC(); + + int occupancy = col.trackOccupancyInTimeRange(); + + auto tracksGrouped = tracks.sliceBy(perCollision, col.globalIndex()); + + // pre-calc nPV + int nPV = 0; + for (const auto& track : tracksGrouped) { + if (!track.isPVContributor()) + continue; + if (track.pt() < confCutPtMinThisEvent || track.pt() > confCutPtMaxThisEvent) + continue; + if (track.eta() < confCutEtaMinTracksThisEvent || track.eta() > confCutEtaMaxTracksThisEvent) + continue; + if (track.itsNCls() < 5) + continue; + nPV++; + } + + // main track loop + for (const auto& track : tracksGrouped) { + if (!track.isPVContributor()) + continue; + if (track.pt() < confCutPtMinThisEvent || track.pt() > confCutPtMaxThisEvent) + continue; + if (track.eta() < confCutEtaMinTracksThisEvent || track.eta() > confCutEtaMaxTracksThisEvent) + continue; + if (track.itsNCls() < 5) + continue; + if (!track.isGlobalTrack()) + continue; + if (track.tpcNClsFound() < confCutMinTPCcls) + continue; + + float signedP = track.sign() * track.tpcInnerParam(); + + aod::TracksQA_002::iterator trackQA; + // bool existPosTrkQA; + if (labelTrack2TrackQA[track.globalIndex()] != -1) { + trackQA = tracksQA.iteratorAt(labelTrack2TrackQA[track.globalIndex()]); + // existPosTrkQA = true; + + float signedP = track.sign() * track.tpcInnerParam(); + float dEdx = track.tpcSignal(); + + float tpcdEdxMax0Rabs = trackQA.tpcdEdxMax0R() * dEdx / 100; + float tpcdEdxMax1Rabs = trackQA.tpcdEdxMax1R() * dEdx / 100; + float tpcdEdxMax2Rabs = trackQA.tpcdEdxMax2R() * dEdx / 100; + float tpcdEdxMax3Rabs = trackQA.tpcdEdxMax3R() * dEdx / 100; + + float tpcdEdxTot0Rabs = trackQA.tpcdEdxTot0R() * dEdx / 100; + float tpcdEdxTot1Rabs = trackQA.tpcdEdxTot1R() * dEdx / 100; + float tpcdEdxTot2Rabs = trackQA.tpcdEdxTot2R() * dEdx / 100; + float tpcdEdxTot3Rabs = trackQA.tpcdEdxTot3R() * dEdx / 100; + + histos.fill(HIST("tpcdEdxMax0R_vs_Momentum"), signedP, tpcdEdxMax0Rabs); + histos.fill(HIST("tpcdEdxMax1R_vs_Momentum"), signedP, tpcdEdxMax1Rabs); + histos.fill(HIST("tpcdEdxMax2R_vs_Momentum"), signedP, tpcdEdxMax2Rabs); + histos.fill(HIST("tpcdEdxMax3R_vs_Momentum"), signedP, tpcdEdxMax3Rabs); + + histos.fill(HIST("tpcdEdxTot0R_vs_Momentum"), signedP, tpcdEdxTot0Rabs); + histos.fill(HIST("tpcdEdxTot1R_vs_Momentum"), signedP, tpcdEdxTot1Rabs); + histos.fill(HIST("tpcdEdxTot2R_vs_Momentum"), signedP, tpcdEdxTot2Rabs); + histos.fill(HIST("tpcdEdxTot3R_vs_Momentum"), signedP, tpcdEdxTot3Rabs); + + // FROM: https://github.com/AliceO2Group/AliceO2/blob/d4afff4276fae2d31f6c3c79d9ec4246deff95f8/Detectors/AOD/src/AODProducerWorkflowSpec.cxx#L2628C1-L2629C84 + // const float dEdxNorm = (tpcOrig.getdEdx().dEdxTotTPC > 0) ? 100. / tpcOrig.getdEdx().dEdxTotTPC : 0; + // trackQAHolder.tpcdEdxMax0R = uint8_t(tpcOrig.getdEdx().dEdxMaxIROC * dEdxNorm); + histos.fill(HIST("tpcdEdxTot3R_vs_dEdxFromTracks"), track.tpcSignal(), trackQA.tpcdEdxTot3R() * dEdx / 100); + histos.fill(HIST("tpcdEdxTotSUM_vs_dEdxFromTracks"), track.tpcSignal(), tpcdEdxTot0Rabs + tpcdEdxTot1Rabs + tpcdEdxTot2Rabs + tpcdEdxTot3Rabs); + histos.fill(HIST("tpcdEdxMaxSUM_vs_dEdxFromTracks"), track.tpcSignal(), tpcdEdxMax0Rabs + tpcdEdxMax1Rabs + tpcdEdxMax2Rabs + tpcdEdxMax3Rabs); + + // ### dEdx MAX + if (1) { + float sum_dEdx_max = 0; + int counter_has_dEdx_max = 0; + if (tpcdEdxMax1Rabs > 0) { + sum_dEdx_max += tpcdEdxMax1Rabs; + counter_has_dEdx_max++; + } + if (tpcdEdxMax2Rabs > 0) { + sum_dEdx_max += tpcdEdxMax2Rabs; + counter_has_dEdx_max++; + } + if (tpcdEdxMax3Rabs > 0) { + sum_dEdx_max += tpcdEdxMax3Rabs; + counter_has_dEdx_max++; + } + // only 3 OROC: + float sum_3OROC_dEdx_max = sum_dEdx_max; + int counter_3OROC_has_dEdx_max = counter_has_dEdx_max; + if (counter_3OROC_has_dEdx_max > 0) { + sum_3OROC_dEdx_max /= counter_3OROC_has_dEdx_max; + histos.fill(HIST("tpcdEdxAverageMax_3OROC_vs_dEdxFromTracks"), track.tpcSignal(), sum_3OROC_dEdx_max); + } + // now IROC: + if (tpcdEdxMax0Rabs > 0) { + sum_dEdx_max += tpcdEdxMax0Rabs; + counter_has_dEdx_max++; + } + // average and fill histos + if (counter_has_dEdx_max > 0) { + sum_dEdx_max /= counter_has_dEdx_max; + histos.fill(HIST("tpcdEdxAverageMax_vs_dEdxFromTracks"), track.tpcSignal(), sum_dEdx_max); + } + if (occupancy >= 0) { + if (std::fabs(signedP) > 0.38 && std::fabs(signedP) < 0.4) + histos.fill(HIST("dEdx_3OROC_max_vs_centr_vs_occup_narrow_p_win"), nPV, occupancy, sum_dEdx_max); + + if (track.eta() > 0.2 && track.eta() < 0.4) + histos.fill(HIST("dEdx_3OROC_max_vs_Momentum_vs_occup_eta_02_04"), signedP, sum_dEdx_max, occupancy); + if (track.eta() > -0.4 && track.eta() < -0.2) + histos.fill(HIST("dEdx_3OROC_max_vs_Momentum_vs_occup_eta_04_02"), signedP, sum_dEdx_max, occupancy); + } + } + // ### dEdx TOT + if (1) { + float sum_dEdx_tot = 0; + int counter_has_dEdx_tot = 0; + if (tpcdEdxTot1Rabs > 0) { + sum_dEdx_tot += tpcdEdxTot1Rabs; + counter_has_dEdx_tot++; + } + if (tpcdEdxTot2Rabs > 0) { + sum_dEdx_tot += tpcdEdxTot2Rabs; + counter_has_dEdx_tot++; + } + if (tpcdEdxTot3Rabs > 0) { + sum_dEdx_tot += tpcdEdxTot3Rabs; + counter_has_dEdx_tot++; + } + // only 3 OROC: + float sum_3OROC_dEdx_tot = sum_dEdx_tot; + int counter_3OROC_has_dEdx_tot = counter_has_dEdx_tot; + if (counter_3OROC_has_dEdx_tot > 0) { + sum_3OROC_dEdx_tot /= counter_3OROC_has_dEdx_tot; + histos.fill(HIST("tpcdEdxAverageTot_3OROC_vs_dEdxFromTracks"), track.tpcSignal(), sum_3OROC_dEdx_tot); + } + // now IROC: + if (tpcdEdxTot0Rabs > 0) { + sum_dEdx_tot += tpcdEdxTot0Rabs; + counter_has_dEdx_tot++; + } + // average and fill histos + if (counter_has_dEdx_tot > 0) { + sum_dEdx_tot /= counter_has_dEdx_tot; + histos.fill(HIST("tpcdEdxAverageTot_vs_dEdxFromTracks"), track.tpcSignal(), sum_dEdx_tot); + } + + if (occupancy >= 0) { + if (std::fabs(signedP) > 0.38 && std::fabs(signedP) < 0.4) + histos.fill(HIST("dEdx_3OROC_tot_vs_centr_vs_occup_narrow_p_win"), nPV, occupancy, sum_dEdx_tot); + + if (track.eta() > 0.2 && track.eta() < 0.4) + histos.fill(HIST("dEdx_3OROC_tot_vs_Momentum_vs_occup_eta_02_04"), signedP, sum_dEdx_tot, occupancy); + if (track.eta() > -0.4 && track.eta() < -0.2) + histos.fill(HIST("dEdx_3OROC_tot_vs_Momentum_vs_occup_eta_04_02"), signedP, sum_dEdx_tot, occupancy); + } + } + + histos.fill(HIST("dcaXY_vs_dcaXYqa"), track.dcaXY(), trackQA.tpcdcaR()); + histos.fill(HIST("dcaZ_vs_dcaZqa"), track.dcaZ(), trackQA.tpcdcaZ()); + } + // else { + // existPosTrkQA = false; + // } + + // ### dE/dx by Marian: + float fTPCSignal = track.tpcSignal(); + float fNormMultTPC = multTPC / 11000.; // IA: my guess: it's https://github.com/AliceO2Group/O2Physics/blob/f681d9cc71214c4eb5613a3f473cbea41e48a61f/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx#L575C30-L575C47 + + // df["mdEdx"]=(50/df["fTPCSignal"]).clip(0.05,1.1) + // df["fTPCSignalN"]=(df["fTPCSignal"]/df["bb0"]/50.).clip(0.5,1.5) + // df["fTrackOccN"]=df.eval("fTrackOcc/1000.") + // df["mdEdxExp"]=df.eval("1./bb0") + // df["fFt0OccN"]=df["fFt0Occ"]*df.eval("fFt0Occ/fTrackOcc").median() + // df["mdEdxExpOcc"]=df.eval("mdEdxExp*fTrackOccN") + // df["fTrackOccMeanN"]=(df["fHadronicRate"]/5) # normalization 5 - 10 bins + // df["fTrackOccN2"]=df.eval("fTrackOccN*fTrackOccN") + // df["fOccTPCN"]=(df["fNormMultTPC"]*10).clip(0,12) # normalization 10 - 12 bins + // df["mdEdxOccTPCN"]=df.eval("mdEdx*fOccTPCN") + // df["mdEdxMeanOccTPCN"]=df.eval("mdEdx*fTrackOccMeanN") + + float fTrackOccN = occupancy / 1000.; + float fOccTPCN = fNormMultTPC * 10; //(fNormMultTPC*10).clip(0,12) + if (fOccTPCN > 12) + fOccTPCN = 12; + else if (fOccTPCN < 0) + fOccTPCN = 0; + + float fTrackOccMeanN = hadronicRate / 5; + + float side = track.tgl() > 0 ? 1 : 0; + float a1pt = std::abs(track.signed1Pt()); + float a1pt2 = a1pt * a1pt; + float atgl = std::abs(track.tgl()); + float mbb0R = 50 / fTPCSignal; + if (mbb0R > 1.05) + mbb0R = 1.05; + else if (mbb0R < 0.05) + mbb0R = 0.05; + // float mbb0R = max(0.05, min(50 / fTPCSignal, 1.05)); + float a1ptmbb0R = a1pt * mbb0R; + float atglmbb0R = atgl * mbb0R; + + // tree->SetAlias("side","fTgl>0"); + // tree->SetAlias("a1pt","abs(fSigned1Pt)"); + // tree->SetAlias("a1pt2","abs(fSigned1Pt**2)"); + // tree->SetAlias("atgl","abs(fTgl)"); + // tree->SetAlias("mbb0R","max(0.05,min(50/fTPCSignal,1.05))"); + // tree->SetAlias("a1ptmbb0R","a1pt*mbb0R"); + // tree->SetAlias("atglmbb0R","atgl*mbb0R"); + + // ### iteration 1 correction + // float fTPCSignalN_CBB = fReal_fTPCSignalN(mbb0,a1pt,atgl,atglmbb0,a1ptmbb0,side,a1pt2,fTrackOccN,fOccTPCN,fTrackOccMeanN+0); // atglmbb0 is != atglmbb0R!!! etc. + float fTPCSignalN_CR0 = fReal_fTPCSignalN(mbb0R, a1pt, atgl, atglmbb0R, a1ptmbb0R, side, a1pt2, fTrackOccN, fOccTPCN, fTrackOccMeanN + 0); + + // tree->SetAlias("fTPCSignalN_CBB","fReal_fTPCSignalN(mbb0,a1pt,atgl,atglmbb0,a1ptmbb0,side,a1pt2,fTrackOccN,fOccTPCN,fTrackOccMeanN+0)"); + // tree->SetAlias("fTPCSignalN_CR0","fReal_fTPCSignalN(mbb0R,a1pt,atgl,atglmbb0R,a1ptmbb0R,side,a1pt2,fTrackOccN,fOccTPCN,fTrackOccMeanN+0)"); + + float mbb0R1 = 50 / (fTPCSignal / fTPCSignalN_CR0); + if (mbb0R1 > 1.05) + mbb0R1 = 1.05; + else if (mbb0R1 < 0.05) + mbb0R1 = 0.05; + // float mbb0R1 = max(0.05, min(50 / (fTPCSignal / fTPCSignalN_CR0), 1.05 + 0)); + // tree->SetAlias("mbb0R1","max(0.05,min(50/(fTPCSignal/fTPCSignalN_CR0),1.05+0))"); + float fTPCSignalN_CR1 = fReal_fTPCSignalN(mbb0R1, a1pt, atgl, atgl * mbb0R1, a1pt * mbb0R1, side, a1pt2, fTrackOccN, fOccTPCN, fTrackOccMeanN + 0); + // tree->SetAlias("fTPCSignalN_CR1","fReal_fTPCSignalN(mbb0R1,a1pt,atgl,atgl*mbb0R1,a1pt*mbb0R1,side,a1pt2,fTrackOccN,fOccTPCN,fTrackOccMeanN+0)"); + // + // tree->SetAlias("fTPCSignalN_mad_BB","fReal_fTPCSignalN_mad(mbb0,a1pt,atgl,atglmbb0,a1ptmbb0,side,a1pt2,fTrackOccN,fOccTPCN,fTrackOccMeanN+0)"); + // tree->SetAlias("fTPCSignalN_mad_R0","fReal_fTPCSignalN_mad(mbb0R1,a1pt,atgl,atgl*mbb0R1,a1pt*mbb0R1,side,a1pt2,fTrackOccN,fOccTPCN,fTrackOccMeanN+0)"); + // + // tree->SetAlias("fTPCSignal_CorrR1","fTPCSignal/fTPCSignalN_CR1"); + // tree->SetAlias("fTPCSignal_CorrBB","fTPCSignal/fTPCSignalN_CBB"); + + histos.fill(HIST("dEdx_vs_Momentum"), signedP, fTPCSignal); + + float corrected_dEdx = fTPCSignal / fTPCSignalN_CR1; + histos.fill(HIST("dEdx_CORRECTION_COEFF"), fTPCSignalN_CR1); + histos.fill(HIST("dEdx_vs_Momentum_CORRECTED"), signedP, corrected_dEdx); + histos.fill(HIST("tpcdEdxCORRECTED_vs_dEdxFromTracks"), fTPCSignal, corrected_dEdx); + + if (occupancy >= 0) { + if (std::fabs(signedP) > 0.38 && std::fabs(signedP) < 0.4) { + histos.fill(HIST("dEdx_vs_centr_vs_occup_narrow_p_win"), nPV, occupancy, fTPCSignal); + histos.fill(HIST("dEdx_vs_centr_vs_occup_narrow_p_win_CORRECTED"), nPV, occupancy, corrected_dEdx); + } + } + + } // end of track loop + } // end of collision loop + } + PROCESS_SWITCH(dEdxVsOccupancyWithTrackQAinfoTask, processRun3, "Process Run3 tracking vs detector occupancy QA", true); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc)}; +} diff --git a/DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx b/DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx index 3f4f4f410c1..e3160ab87ac 100644 --- a/DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx +++ b/DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx @@ -42,7 +42,7 @@ using namespace o2; using namespace o2::framework; using namespace o2::aod::evsel; -using BCsRun2 = soa::Join; +// using BCsRun2 = soa::Join; using BCsRun3 = soa::Join; // using ColEvSels = soa::Join; using ColEvSels = soa::Join; @@ -197,12 +197,18 @@ struct DetectorOccupancyQaTask { histos.add("tpcNClsFindableMinusCrossedRows", "", kTH1D, {{601, -300.5, 300.5}}); histos.add("tpcNClsShared", "", kTH1D, {{601, -300.5, 300.5}}); histos.add("tpcNClsFindableMinusPID", "", kTH1D, {{601, -300.5, 300.5}}); - histos.add("tpcNClsFindableMinusPID_CORRECTED", "", kTH1D, {{601, -300.5, 300.5}}); histos.add("tpcNClUsedForPID", "", kTH1D, {{601, -300.5, 300.5}}); + histos.add("tpcNClsFound", "", kTH1D, {{601, -300.5, 300.5}}); + histos.add("tpcNClsFoundAsDiffByHand", "", kTH1D, {{601, -300.5, 300.5}}); + histos.add("tpcNClsFindableMinusPID_CORRECTED", "", kTH1D, {{601, -300.5, 300.5}}); + histos.add("tpcNClsFoundMinusPID_BY_HAND", "", kTH1D, {{601, -300.5, 300.5}}); histos.add("tpcNClsUsedForPID_vs_Findable", ";tpcNClsFindable;tpcNClUsedForPID", kTH2D, {{601, -300.5, 300.5}, {601, -300.5, 300.5}}); + histos.add("tpcNClsUsedForPID_vs_Findable_CORRECTED", ";tpcNClsFindable;tpcNClUsedForPID", kTH2D, {{601, -300.5, 300.5}, {601, -300.5, 300.5}}); histos.add("tpcNClsShared_vs_Findable", ";tpcNClsFindable;tpcNClsShared", kTH2D, {{601, -300.5, 300.5}, {601, -300.5, 300.5}}); + histos.add("tpcNClsFound_vs_Findable", ";tpcNClsFindable;tpcNClsFound", kTH2D, {{601, -300.5, 300.5}, {601, -300.5, 300.5}}); histos.add("tpcNClsUsedForPID_vs_Shared", ";tpcNClsShared;tpcNClUsedForPID", kTH2D, {{601, -300.5, 300.5}, {601, -300.5, 300.5}}); + histos.add("tpcNClsUsedForPID_vs_Found", ";tpcNClsFound;tpcNClUsedForPID", kTH2D, {{601, -300.5, 300.5}, {601, -300.5, 300.5}}); // ### kinematic distributions for events with high occupancy at specified dt ranges histos.add("track_distr_nITStrThisEv_10_200/hEventCount", ";delta-time bin id;n events", kTH1D, {{5, -0.5, 4.5}}); @@ -864,6 +870,21 @@ struct DetectorOccupancyQaTask { int occupancy = col.trackOccupancyInTimeRange(); auto tracksGrouped = tracks.sliceBy(perCollision, col.globalIndex()); + + // pre-calc nPV + for (const auto& track : tracksGrouped) { + if (!track.isPVContributor()) + continue; + if (track.pt() < confCutPtMinThisEvent || track.pt() > confCutPtMaxThisEvent) + continue; + if (track.eta() < confCutEtaMinTracksThisEvent || track.eta() > confCutEtaMaxTracksThisEvent) + continue; + if (track.itsNCls() < 5) + continue; + nPV++; + } + + // main loop for dE/dx for (const auto& track : tracksGrouped) { histos.fill(HIST("nTrackCounter_after_cuts_QA"), 0); if (!track.isPVContributor()) @@ -878,7 +899,7 @@ struct DetectorOccupancyQaTask { if (track.itsNCls() < 5) continue; histos.fill(HIST("nTrackCounter_after_cuts_QA"), 4); - nPV++; + // nPV++; if (track.isGlobalTrack() && track.tpcNClsFound() >= confCutMinTPCcls) { nGlobalTracks++; @@ -917,18 +938,26 @@ struct DetectorOccupancyQaTask { int tpcNClUsedForPID = track.tpcNClsFindable() - track.tpcNClsFindableMinusPID(); histos.fill(HIST("tpcNClUsedForPID"), tpcNClUsedForPID); + histos.fill(HIST("tpcNClsFound"), track.tpcNClsFound()); + histos.fill(HIST("tpcNClsFoundAsDiffByHand"), track.tpcNClsFindable() - track.tpcNClsFindableMinusFound()); + histos.fill(HIST("tpcNClsUsedForPID_vs_Findable"), track.tpcNClsFindable(), tpcNClUsedForPID); histos.fill(HIST("tpcNClsShared_vs_Findable"), track.tpcNClsFindable(), track.tpcNClsShared()); - histos.fill(HIST("tpcNClsUsedForPID_vs_Shared"), tpcNClUsedForPID, track.tpcNClsShared()); + histos.fill(HIST("tpcNClsUsedForPID_vs_Shared"), track.tpcNClsShared(), tpcNClUsedForPID); + histos.fill(HIST("tpcNClsFound_vs_Findable"), track.tpcNClsFindable(), track.tpcNClsFound()); + histos.fill(HIST("tpcNClsUsedForPID_vs_Found"), track.tpcNClsFound(), tpcNClUsedForPID); int tpcNClsCorrectedFindableMinusPID = track.tpcNClsFindableMinusPID(); // correct for a buggy behaviour due to int8 and uint8 difference: if (tpcNClsCorrectedFindableMinusPID < -70) tpcNClsCorrectedFindableMinusPID += 256; histos.fill(HIST("tpcNClsFindableMinusPID_CORRECTED"), tpcNClsCorrectedFindableMinusPID); + histos.fill(HIST("tpcNClsUsedForPID_vs_Findable_CORRECTED"), track.tpcNClsFindable(), track.tpcNClsFindable() - tpcNClsCorrectedFindableMinusPID); + + histos.fill(HIST("tpcNClsFoundMinusPID_BY_HAND"), (track.tpcNClsFindable() - track.tpcNClsFindableMinusFound()) - (track.tpcNClsFindable() - tpcNClsCorrectedFindableMinusPID)); // check ratio tpcNClsFindableMinusPID / tpcNClsFindable - // https://github.com/AliceO2Group/AliceO2/blob/dev/Framework/Core/include/Framework/AnalysisDataModel.h#L242) + // https://github.com/AliceO2Group/AliceO2/blob/dev/Framework/Core/include/Framework/AnalysisDataModel.h#L242 // https://github.com/AliceO2Group/AliceO2/blob/dev/Detectors/AOD/src/AODProducerWorkflowSpec.cxx#L2553C21-L2553C44 float fractionTPCcls = (1.0 * tpcNClsCorrectedFindableMinusPID) / track.tpcNClsFindable(); histos.fill(HIST("fraction_tpcNClsFindableMinusPID_vs_occup"), occupancy, fractionTPCcls); @@ -977,7 +1006,7 @@ struct DetectorOccupancyQaTask { } } } - } + } // end of track loop if (confAddTracksVsFwdHistos) histos.fill(HIST("nTracksGlobal_vs_nPV_QA_onlyVzCut_noTFROFborderCuts"), nPV, nGlobalTracks); From 7435df4e8f777b965bdd0000e9ce8181d64ea605 Mon Sep 17 00:00:00 2001 From: prottayCMT <61418725+prottayCMT@users.noreply.github.com> Date: Wed, 2 Apr 2025 07:29:47 +0200 Subject: [PATCH 0896/1650] [PWGLF] corrected a possible segmentation error (#10725) Co-authored-by: Prottay Das --- PWGLF/Tasks/Strangeness/lambdapolsp.cxx | 27 ++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdapolsp.cxx b/PWGLF/Tasks/Strangeness/lambdapolsp.cxx index 3db63fbbdb3..3aab9460e44 100644 --- a/PWGLF/Tasks/Strangeness/lambdapolsp.cxx +++ b/PWGLF/Tasks/Strangeness/lambdapolsp.cxx @@ -642,8 +642,8 @@ struct lambdapolsp { TProfile2D* accprofileL; TProfile2D* accprofileAL; - int currentRunNumber = -999; - int lastRunNumber = -999; + // int currentRunNumber = -999; + // int lastRunNumber = -999; using BCsRun3 = soa::Join; @@ -677,7 +677,7 @@ struct lambdapolsp { return; } - currentRunNumber = collision.foundBC_as().runNumber(); + // currentRunNumber = collision.foundBC_as().runNumber(); auto bc = collision.foundBC_as(); auto qxZDCA = collision.qxZDCA(); @@ -918,7 +918,8 @@ struct lambdapolsp { int taga = LambdaTag; int tagb = aLambdaTag; - if (useAccCorr && (currentRunNumber != lastRunNumber)) { + // if (useAccCorr && (currentRunNumber != lastRunNumber)) { + if (useAccCorr) { accprofileL = ccdb->getForTimeStamp(ConfAccPathL.value, bc.timestamp()); accprofileAL = ccdb->getForTimeStamp(ConfAccPathAL.value, bc.timestamp()); } @@ -977,7 +978,9 @@ struct lambdapolsp { if (LambdaTag) { Lambda = Proton + AntiPion; tagb = 0; - double acvalue = accprofileL->GetBinContent(accprofileL->FindBin(v0.eta(), v0.pt())); + int binx = accprofileL->GetXaxis()->FindBin(v0.eta()); + int biny = accprofileL->GetYaxis()->FindBin(v0.pt()); + double acvalue = accprofileL->GetBinContent(binx, biny); fillHistograms(taga, tagb, Lambda, Proton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mLambda(), v0.pt(), desbinvalue, acvalue); } @@ -985,7 +988,9 @@ struct lambdapolsp { if (aLambdaTag) { AntiLambda = AntiProton + Pion; taga = 0; - double acvalue = accprofileAL->GetBinContent(accprofileAL->FindBin(v0.eta(), v0.pt())); + int binx = accprofileAL->GetXaxis()->FindBin(v0.eta()); + int biny = accprofileAL->GetYaxis()->FindBin(v0.pt()); + double acvalue = accprofileAL->GetBinContent(binx, biny); fillHistograms(taga, tagb, AntiLambda, AntiProton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mAntiLambda(), v0.pt(), desbinvalue, acvalue); } } @@ -993,7 +998,9 @@ struct lambdapolsp { if (LambdaTag) { Lambda = Proton + AntiPion; tagb = 0; - double acvalue = accprofileL->GetBinContent(accprofileL->FindBin(v0.eta(), v0.pt())); + int binx = accprofileL->GetXaxis()->FindBin(v0.eta()); + int biny = accprofileL->GetYaxis()->FindBin(v0.pt()); + double acvalue = accprofileL->GetBinContent(binx, biny); fillHistograms(taga, tagb, Lambda, Proton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mLambda(), v0.pt(), v0.eta(), acvalue); } @@ -1001,13 +1008,15 @@ struct lambdapolsp { if (aLambdaTag) { AntiLambda = AntiProton + Pion; taga = 0; - double acvalue = accprofileAL->GetBinContent(accprofileAL->FindBin(v0.eta(), v0.pt())); + int binx = accprofileAL->GetXaxis()->FindBin(v0.eta()); + int biny = accprofileAL->GetYaxis()->FindBin(v0.pt()); + double acvalue = accprofileAL->GetBinContent(binx, biny); fillHistograms(taga, tagb, AntiLambda, AntiProton, psiZDCC, psiZDCA, psiZDC, centrality, v0.mAntiLambda(), v0.pt(), v0.eta(), acvalue); } } } } - lastRunNumber = currentRunNumber; + // lastRunNumber = currentRunNumber; } PROCESS_SWITCH(lambdapolsp, processData, "Process data", true); From f8564366be18c84f4a53d142e4f2e1afc3899f27 Mon Sep 17 00:00:00 2001 From: Rohaan Deb <67634136+RD0407@users.noreply.github.com> Date: Wed, 2 Apr 2025 09:23:59 +0200 Subject: [PATCH 0897/1650] [PWGLF] Update PWGLF/Tasks/Nuspex/spectraTOF.cxx (#10719) --- PWGLF/Tasks/Nuspex/spectraTOF.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Nuspex/spectraTOF.cxx b/PWGLF/Tasks/Nuspex/spectraTOF.cxx index aef1eb50832..813a3da63c5 100644 --- a/PWGLF/Tasks/Nuspex/spectraTOF.cxx +++ b/PWGLF/Tasks/Nuspex/spectraTOF.cxx @@ -1566,7 +1566,7 @@ struct tofSpectra { } } } - PROCESS_SWITCH(tofSpectra, processMCclosure, "MC closure test", true); + PROCESS_SWITCH(tofSpectra, processMCclosure, "MC closure test", false); void processOccupancy(CollisionCandidates::iterator const& collision, soa::Join Date: Wed, 2 Apr 2025 11:57:47 +0200 Subject: [PATCH 0898/1650] [PWGLF] fix o2linter complaints for magic numbers (#10729) --- PWGLF/Tasks/Nuspex/antinucleiInJets.cxx | 40 +++++++++++++++++-------- 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx index d925de5561f..8213c828af4 100644 --- a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx +++ b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx @@ -364,27 +364,39 @@ struct AntinucleiInJets { template bool passedTrackSelectionForJetReconstruction(const JetTrack& track) { + + const int minTpcCr = 70; + const double minCrFindable = 0.8; + const double maxChi2Tpc = 4.0; + const double maxChi2Its = 36.0; + const double maxPseudorapidity = 0.8; + const double minPtTrack = 0.1; + const double dcaxyMaxTrackPar0 = 0.0105; + const double dcaxyMaxTrackPar1 = 0.035; + const double dcaxyMaxTrackPar2 = 1.1; + const double dcazMaxTrack = 2.0; + if (!track.hasITS()) return false; if ((!hasITSHit(track, 1)) && (!hasITSHit(track, 2)) && (!hasITSHit(track, 3))) return false; if (!track.hasTPC()) return false; - if (track.tpcNClsCrossedRows() < 70) + if (track.tpcNClsCrossedRows() < minTpcCr) return false; - if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < 0.8) + if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < minCrFindable) return false; - if (track.tpcChi2NCl() > 4) + if (track.tpcChi2NCl() > maxChi2Tpc) return false; - if (track.itsChi2NCl() > 36) + if (track.itsChi2NCl() > maxChi2Its) return false; - if (track.eta() < -0.8 || track.eta() > 0.8) + if (track.eta() < -maxPseudorapidity || track.eta() > maxPseudorapidity) return false; - if (track.pt() < 0.1) + if (track.pt() < minPtTrack) return false; - if (std::fabs(track.dcaXY()) > (0.0105 + 0.035 / std::pow(track.pt(), 1.1))) + if (std::fabs(track.dcaXY()) > (dcaxyMaxTrackPar0 + dcaxyMaxTrackPar1 / std::pow(track.pt(), dcaxyMaxTrackPar2))) return false; - if (std::fabs(track.dcaZ()) > 2.0) + if (std::fabs(track.dcaZ()) > dcazMaxTrack) return false; return true; } @@ -424,10 +436,12 @@ struct AntinucleiInJets { double nsigmaTPCPr = track.tpcNSigmaPr(); double nsigmaTOFPr = track.tofNSigmaPr(); double pt = track.pt(); + double ptThreshold = 0.5; + double nsigmaMaxPr = 2.0; - if (pt < 0.5 && std::fabs(nsigmaTPCPr) < 2.0) + if (pt < ptThreshold && std::fabs(nsigmaTPCPr) < nsigmaMaxPr) return true; - if (pt >= 0.5 && std::fabs(nsigmaTPCPr) < 2.0 && track.hasTOF() && std::fabs(nsigmaTOFPr) < 2.0) + if (pt >= ptThreshold && std::fabs(nsigmaTPCPr) < nsigmaMaxPr && track.hasTOF() && std::fabs(nsigmaTOFPr) < nsigmaMaxPr) return true; return false; } @@ -1013,7 +1027,8 @@ struct AntinucleiInJets { if (!particle.isPhysicalPrimary()) continue; - if (particle.eta() < -0.8 || particle.eta() > 0.8 || particle.pt() < 0.1) + double minPtParticle = 0.1; + if (particle.eta() < minEta || particle.eta() > maxEta || particle.pt() < minPtParticle) continue; double energy = std::sqrt(particle.p() * particle.p() + MassPionCharged * MassPionCharged); @@ -1068,7 +1083,8 @@ struct AntinucleiInJets { if (!particle.isPhysicalPrimary()) continue; - if (particle.eta() < -0.8 || particle.eta() > 0.8 || particle.pt() < 0.1) + double minPtParticle = 0.1; + if (particle.eta() < minEta || particle.eta() > maxEta || particle.pt() < minPtParticle) continue; double deltaEtaUe1 = particle.eta() - ueAxis1.Eta(); From d1ecd740126375181669be3c315a7877260727d1 Mon Sep 17 00:00:00 2001 From: abilandz Date: Wed, 2 Apr 2025 13:52:24 +0200 Subject: [PATCH 0899/1650] =?UTF-8?q?[PWGCF]=20removed=20unnecessary=20sub?= =?UTF-8?q?scription=20+=20fixed=20a=20few=20variable=20names=20to=20plea?= =?UTF-8?q?=E2=80=A6=20(#10731)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Core/MuPa-Configurables.h | 22 +- .../Core/MuPa-Enums.h | 28 +- .../Core/MuPa-MemberFunctions.h | 423 +++++++++--------- .../Tasks/multiparticle-correlations-ab.cxx | 8 +- 4 files changed, 237 insertions(+), 244 deletions(-) diff --git a/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h b/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h index 1d32d75d4e5..6a91e2f6e4b 100644 --- a/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h +++ b/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h @@ -44,9 +44,9 @@ struct : ConfigurableGroup { // *) QA: struct : ConfigurableGroup { Configurable cfCheckUnderflowAndOverflow{"cfCheckUnderflowAndOverflow", false, "check and bail out if in event and particle histograms there are entries which went to underflow or overflow bins (use only locally)"}; - Configurable cfRebin{"cfRebin", 1, "number of bins of selected heavy 2D histograms are devided with this number"}; + Configurable cfRebin{"cfRebin", 10, "number of bins of selected heavy 2D histograms are devided with this number"}; Configurable cfFillQAEventHistograms2D{"cfFillQAEventHistograms2D", false, "if false, all QA 2D event histograms are not filled. if true, only the ones for which fBookQAEventHistograms2D[...] is true, are filled"}; - Configurable> cfBookQAEventHistograms2D{"cfBookQAEventHistograms2D", {"1-Multiplicity_vs_ReferenceMultiplicity", "1-Multiplicity_vs_NContributors", "1-Multiplicity_vs_Centrality", "1-Multiplicity_vs_Vertex_z", "1-Multiplicity_vs_Occupancy", "1-Multiplicity_vs_InteractionRate", "1-ReferenceMultiplicity_vs_NContributors", "1-ReferenceMultiplicity_vs_Centrality", "1-ReferenceMultiplicity_vs_Vertex_z", "1-ReferenceMultiplicity_vs_Occupancy", "1-ReferenceMultiplicity_vs_InteractionRate", "1-NContributors_vs_Centrality", "1-NContributors_vs_Vertex_z", "1-NContributors_vs_Occupancy", "1-NContributors_vs_InteractionRate", "1-Centrality_vs_Vertex_z", "1-Centrality_vs_Occupancy", "0-Centrality_vs_ImpactParameter", "1-Centrality_vs_InteractionRate", "1-Vertex_z_vs_Occupancy", "1-Vertex_z_vs_InteractionRate", "0-MultNTracksPV_vs_MultNTracksGlobal", "1-CentFT0C_vs_CentFT0CVariant1", "1-CentFT0C_vs_CentFT0M", "1-CentFT0C_vs_CentFV0A", "0-CentFT0C_vs_CentNTPV", "0-CentFT0C_vs_CentNGlobal", "0-CentFT0M_vs_CentNTPV", "0-CentRun2V0M_vs_CentRun2SPDTracklets", "1-TrackOccupancyInTimeRange_vs_FT0COccupancyInTimeRange", "1-CurrentRunDuration_vs_InteractionRate", "1-Multiplicity_vs_FT0CAmplitudeOnFoundBC", "1-CentFT0C_vs_FT0CAmplitudeOnFoundBC"}, "book (1) or do not book (0) this QA 2D event histogram"}; + Configurable> cfBookQAEventHistograms2D{"cfBookQAEventHistograms2D", {"1-Multiplicity_vs_ReferenceMultiplicity", "1-Multiplicity_vs_NContributors", "1-Multiplicity_vs_Centrality", "1-Multiplicity_vs_VertexZ", "1-Multiplicity_vs_Occupancy", "1-Multiplicity_vs_InteractionRate", "1-ReferenceMultiplicity_vs_NContributors", "1-ReferenceMultiplicity_vs_Centrality", "1-ReferenceMultiplicity_vs_VertexZ", "1-ReferenceMultiplicity_vs_Occupancy", "1-ReferenceMultiplicity_vs_InteractionRate", "1-NContributors_vs_Centrality", "1-NContributors_vs_VertexZ", "1-NContributors_vs_Occupancy", "1-NContributors_vs_InteractionRate", "1-Centrality_vs_VertexZ", "1-Centrality_vs_Occupancy", "0-Centrality_vs_ImpactParameter", "1-Centrality_vs_InteractionRate", "1-VertexZ_vs_Occupancy", "1-VertexZ_vs_InteractionRate", "0-MultNTracksPV_vs_MultNTracksGlobal", "1-CentFT0C_vs_CentFT0CVariant1", "1-CentFT0C_vs_CentFT0M", "1-CentFT0C_vs_CentFV0A", "0-CentFT0C_vs_CentNTPV", "0-CentFT0C_vs_CentNGlobal", "0-CentFT0M_vs_CentNTPV", "0-CentRun2V0M_vs_CentRun2SPDTracklets", "1-TrackOccupancyInTimeRange_vs_FT0COccupancyInTimeRange", "1-CurrentRunDuration_vs_InteractionRate", "1-Multiplicity_vs_FT0CAmplitudeOnFoundBC", "1-CentFT0C_vs_FT0CAmplitudeOnFoundBC"}, "book (1) or do not book (0) this QA 2D event histogram"}; Configurable cfFillQAParticleHistograms2D{"cfFillQAParticleHistograms2D", false, "if false, all QA 2D particle histograms are not filled. if true, only the ones for which fBookQAParticleHistograms2D[...] is true, are filled"}; Configurable> cfBookQAParticleHistograms2D{"cfBookQAParticleHistograms2D", {"1-Pt_vs_dcaXY"}, "book (1) or do not book (0) this QA 2D particle histogram"}; Configurable cfFillQAParticleEventHistograms2D{"cfFillQAParticleEventHistograms2D", false, "if false, all QA 2D particle event histograms are not filled. if true, only the ones for which fBookQAParticleEventHistograms2D[...] is true, are filled"}; @@ -65,12 +65,12 @@ struct : ConfigurableGroup { // *) Event histograms: struct : ConfigurableGroup { Configurable cfFillEventHistograms{"cfFillEventHistograms", true, "if false, all event histograms are not filled. if true, only the ones for which fBookEventHistograms[...] is true, are filled"}; - Configurable> cfBookEventHistograms{"cfBookEventHistograms", {"1-NumberOfEvents", "1-TotalMultiplicity", "1-Multiplicity", "1-ReferenceMultiplicity", "1-Centrality", "1-Vertex_x", "1-Vertex_y", "1-Vertex_z", "1-NContributors", "0-ImpactParameter", "0-EventPlaneAngle", "1-Occupancy", "1-InteractionRate", "1-CurrentRunDuration", "0-MultMCNParticlesEta08"}, "Book (1) or do not book (0) event histogram"}; + Configurable> cfBookEventHistograms{"cfBookEventHistograms", {"1-NumberOfEvents", "1-TotalMultiplicity", "1-Multiplicity", "1-ReferenceMultiplicity", "1-Centrality", "1-VertexX", "1-VertexY", "1-VertexZ", "1-NContributors", "0-ImpactParameter", "0-EventPlaneAngle", "1-Occupancy", "1-InteractionRate", "1-CurrentRunDuration", "0-MultMCNParticlesEta08"}, "Book (1) or do not book (0) event histogram"}; } cf_eh; // *) Event cuts: struct : ConfigurableGroup { - Configurable> cfUseEventCuts{"cfUseEventCuts", {"1-NumberOfEvents", "1-TotalMultiplicity", "1-Multiplicity", "1-ReferenceMultiplicity", "1-Centrality", "1-Vertex_x", "1-Vertex_y", "1-Vertex_z", "1-NContributors", "1-ImpactParameter", "0-EventPlaneAngle", "1-Occupancy", "1-InteractionRate", "1-CurrentRunDuration", "0-MultMCNParticlesEta08", "0-Trigger", "0-Sel7", "1-Sel8", "1-MultiplicityEstimator", "1-ReferenceMultiplicityEstimator", "1-CentralityEstimator", "1-SelectedEvents", "1-NoSameBunchPileup", "1-IsGoodZvtxFT0vsPV", "1-IsVertexITSTPC", "1-IsVertexTOFmatched", "1-IsVertexTRDmatched", "0-NoCollInTimeRangeStrict", "0-NoCollInTimeRangeStandard", "0-NoCollInRofStrict", "0-NoCollInRofStandard", "0-NoHighMultCollInPrevRof", "0-IsGoodITSLayer3", "0-IsGoodITSLayer0123", "0-IsGoodITSLayersAll", "1-OccupancyEstimator", "1-MinVertexDistanceFromIP", "0-NoPileupTPC", "0-NoPileupFromSPD", "0-NoSPDOnVsOfPileup", "1-RefMult_vs_NContr_Up", "1-RefMult_vs_NContr_Down", "1-CentralityCorrelationsCut", "1-CentralityWeights"}, "use (1) or do not use (0) event cuts"}; + Configurable> cfUseEventCuts{"cfUseEventCuts", {"1-NumberOfEvents", "1-TotalMultiplicity", "1-Multiplicity", "1-ReferenceMultiplicity", "1-Centrality", "1-VertexX", "1-VertexY", "1-VertexZ", "1-NContributors", "1-ImpactParameter", "0-EventPlaneAngle", "1-Occupancy", "1-InteractionRate", "1-CurrentRunDuration", "0-MultMCNParticlesEta08", "0-Trigger", "0-Sel7", "1-Sel8", "1-MultiplicityEstimator", "1-ReferenceMultiplicityEstimator", "1-CentralityEstimator", "1-SelectedEvents", "1-NoSameBunchPileup", "1-IsGoodZvtxFT0vsPV", "1-IsVertexITSTPC", "1-IsVertexTOFmatched", "1-IsVertexTRDmatched", "0-NoCollInTimeRangeStrict", "0-NoCollInTimeRangeStandard", "0-NoCollInRofStrict", "0-NoCollInRofStandard", "0-NoHighMultCollInPrevRof", "0-IsGoodITSLayer3", "0-IsGoodITSLayer0123", "0-IsGoodITSLayersAll", "1-OccupancyEstimator", "1-MinVertexDistanceFromIP", "0-NoPileupTPC", "0-NoPileupFromSPD", "0-NoSPDOnVsOfPileup", "1-RefMultVsNContrUp", "1-RefMultVsNContrLow", "1-CentralityCorrelationsCut", "1-CentralityWeights"}, "use (1) or do not use (0) event cuts"}; Configurable cfUseEventCutCounterAbsolute{"cfUseEventCutCounterAbsolute", false, "profile and save how many times each event cut counter triggered (absolute). Use with care, as this is computationally heavy"}; Configurable cfUseEventCutCounterSequential{"cfUseEventCutCounterSequential", false, "profile and save how many times each event cut counter triggered (sequential). Use with care, as this is computationally heavy"}; Configurable cfPrintCutCounterContent{"cfPrintCutCounterContent", false, "if true, prints on the screen after each event the content of fEventCutCounterHist[*][*] (all which were booked)"}; @@ -80,9 +80,9 @@ struct : ConfigurableGroup { Configurable> cfMultiplicity{"cfMultiplicity", {-1., 1000000000.}, "multiplicity (defined via cfMultiplicityEstimator) range {min, max}, with convention: min <= M < max"}; Configurable> cfReferenceMultiplicity{"cfReferenceMultiplicity", {-1., 1000000000.}, "reference multiplicity (defined via cfReferenceMultiplicityEstimator) range {min, max}, with convention: min <= M < max"}; Configurable> cfCentrality{"cfCentrality", {-10., 110.}, "centrality range: {min, max}, with convention: min <= cent < max"}; - Configurable> cfVertex_x{"cfVertex_x", {-10., 10.}, "vertex x position range: {min, max}[cm], with convention: min <= Vx < max"}; - Configurable> cfVertex_y{"cfVertex_y", {-10., 10.}, "vertex y position range: {min, max}[cm], with convention: min <= Vy < max"}; - Configurable> cfVertex_z{"cfVertex_z", {-10, 10.}, "vertex z position range: {min, max}[cm], with convention: min <= Vz < max"}; + Configurable> cfVertexX{"cfVertexX", {-10., 10.}, "vertex x position range: {min, max}[cm], with convention: min <= Vx < max"}; + Configurable> cfVertexY{"cfVertexY", {-10., 10.}, "vertex y position range: {min, max}[cm], with convention: min <= Vy < max"}; + Configurable> cfVertexZ{"cfVertexZ", {-10, 10.}, "vertex z position range: {min, max}[cm], with convention: min <= Vz < max"}; Configurable cfMinVertexDistanceFromIP{"cfMinVertexDistanceFromIP", {0.000001}, "if sqrt(vx^2+vy^2+vz^2) < cfMinVertexDistanceFromIP [cm], the event is reject. IP = nominal Interaction Point."}; Configurable> cfNContributors{"cfNContributors", {2, 1000000000}, "Number of vertex contributors: {min, max}, with convention: min <= N < max"}; Configurable> cfImpactParameter{"cfImpactParameter", {-1, 1000000000}, "Impact parameter range (can be used only for sim): {min, max}, with convention: min <= IP < max"}; @@ -116,9 +116,9 @@ struct : ConfigurableGroup { Configurable cfUseNoPileupFromSPD{"cfUseNoPileupFromSPD", false, "TBI 20250318 explanation"}; Configurable cfUseNoSPDOnVsOfPileup{"cfUseNoSPDOnVsOfPileup", false, "TBI 20250318 explanation"}; Configurable cfOccupancyEstimator{"cfOccupancyEstimator", "FT0COccupancyInTimeRange", "set here some supported occupancy estimator (TrackOccupancyInTimeRange, FT0COccupancyInTimeRange, ..."}; - Configurable cfRefMult_vs_NContr_Up{"cfRefMult_vs_NContr_Up", "1200. + 0.20*x", "set here some TF1 formula for the upper boundary cut in RefMult_vs_NContr correlation"}; - Configurable cfRefMult_vs_NContr_Low{"cfRefMult_vs_NContr_Low", "-650. + 0.08*x", "set here some TF1 formula for the lower boundary cut in RefMult_vs_NContr correlation"}; - Configurable cfCentralityCorrelationsCut{"cfCentralityCorrelationsCutr", "CentFT0C_CentFT0M", "Indicate two centrality estimators for the calculation of centrality correlation cut"}; + Configurable cfRefMultVsNContrUp{"cfRefMultVsNContrUp", "1200. + 0.20*x", "set here some TF1 formula for the upper boundary cut in RefMult_vs_NContr correlation"}; + Configurable cfRefMultVsNContrLow{"cfRefMultVsNContrLow", "-650. + 0.08*x", "set here some TF1 formula for the lower boundary cut in RefMult_vs_NContr correlation"}; + Configurable cfCentralityCorrelationsCut{"cfCentralityCorrelationsCut", "CentFT0C_CentFT0M", "Indicate two centrality estimators for the calculation of centrality correlation cut"}; Configurable cfCentralityCorrelationsCutTreshold{"cfCentralityCorrelationsCutTreshold", 10.0, "set the treshold for centrality correlation cut"}; Configurable cfCentralityCorrelationsCutVersion{"cfCentralityCorrelationsCutVersion", "Absolute", "set the version of centrality correlation cut. Supported: \"Relative\" and \"Absolute\""}; @@ -229,7 +229,7 @@ struct : ConfigurableGroup { Configurable cfUseEtaWeights{"cfUseEtaWeights", false, "use or not eta weights"}; Configurable cfUseDiffPhiPtWeights{"cfUseDiffPhiPtWeights", false, "use or not differential phi(pt) weights"}; Configurable cfUseDiffPhiEtaWeights{"cfUseDiffPhiEtaWeights", false, "use or not differential phi(eta) weights"}; - Configurable> cfWhichDiffPhiWeights{"cfWhichDiffPhiWeights", {"1-wPhi", "1-wPt", "1-wEta", "1-wCharge", "1-wCentrality", "1-wVertex_z"}, "use (1) or do not use (0) differential phi weight for particular dimension. If only phi is set to 1, integrated phi weights are used. If phi is set to 0, ALL dimensions are switched off (yes!)"}; + Configurable> cfWhichDiffPhiWeights{"cfWhichDiffPhiWeights", {"1-wPhi", "1-wPt", "1-wEta", "1-wCharge", "1-wCentrality", "1-wVertexZ"}, "use (1) or do not use (0) differential phi weight for particular dimension. If only phi is set to 1, integrated phi weights are used. If phi is set to 0, ALL dimensions are switched off (yes!)"}; Configurable> cfWhichDiffPtWeights{"cfWhichDiffPtWeights", {"1-wPt"}, "use (1) or do not use (0) differential pt weight for particular dimension. If only pt is set to 1, integrated pt weights are used. If pt is set to 0, ALL dimensions are switched off (yes!)"}; Configurable> cfWhichDiffEtaWeights{"cfWhichDiffEtaWeights", {"1-wEta"}, "use (1) or do not use (0) differential eta weight for particular dimension. If only eta is set to 1, integrated eta weights are used. If eta is set to 0, ALL dimensions are switched off (yes!)"}; Configurable cfFileWithWeights{"cfFileWithWeights", "/home/abilandz/DatasetsO2/weights.root", "path to external ROOT file which holds all particle weights in O2 format"}; // for AliEn file prepend "/alice/cern.ch/", for CCDB prepend "/alice-ccdb.cern.ch" diff --git a/PWGCF/MultiparticleCorrelations/Core/MuPa-Enums.h b/PWGCF/MultiparticleCorrelations/Core/MuPa-Enums.h index 4f6f942c5dc..026974d301c 100644 --- a/PWGCF/MultiparticleCorrelations/Core/MuPa-Enums.h +++ b/PWGCF/MultiparticleCorrelations/Core/MuPa-Enums.h @@ -106,7 +106,7 @@ enum eDiffPhiWeights { wPhiEtaAxis, wPhiChargeAxis, wPhiCentralityAxis, - wPhiVertex_zAxis, + wPhiVertexZAxis, eDiffPhiWeights_N }; @@ -131,9 +131,9 @@ enum eEventHistograms { eMultiplicity, // see documentation for ebye.fMultiplicity eReferenceMultiplicity, // see documentation for ebye.fReferenceMultiplicity eCentrality, // default centrality estimator - eVertex_x, - eVertex_y, - eVertex_z, + eVertexX, + eVertexY, + eVertexZ, eNContributors, // number of tracks used for the vertex eImpactParameter, eEventPlaneAngle, @@ -184,8 +184,8 @@ enum eEventCuts { eNoPileupTPC, // no pileup in TPC eNoPileupFromSPD, // no pileup according to SPD vertexer eNoSPDOnVsOfPileup, // no out-of-bunch pileup according to online-vs-offline SPD correlation - eRefMult_vs_NContr_Up, // formula for upper boundary cut in eReferenceMultiplicity_vs_NContributors (remember that I use naming convention "x_vs_y") - eRefMult_vs_NContr_Low, // formula for lower boundary cut in eReferenceMultiplicity_vs_NContributors (remember that I use naming convention "x_vs_y") + eRefMultVsNContrUp, // formula for upper boundary cut in eReferenceMultiplicity_vs_NContributors (remember that I use naming convention "x_vs_y") + eRefMultVsNContrLow, // formula for lower boundary cut in eReferenceMultiplicity_vs_NContributors (remember that I use naming convention "x_vs_y") eCentralityCorrelationsCut, // port of void SetCentralityCorrelationsCuts(...) from MuPa class. Example format: "CentFT0C_CentFT0M", so IFS is "_", until proven otherwise // ... eCentralityWeights, // used for centrality flattening. Remember that this event cut must be implemented very last, @@ -196,8 +196,8 @@ enum eEventCuts { }; enum eEventCutsFormulas { // special treatment for all event cuts defined via mathematical formula, because for them I have to do one additional layer of booking using TFormula - eRefMult_vs_NContr_Up_Formula = 0, - eRefMult_vs_NContr_Low_Formula, + eRefMultVsNContrUp_Formula = 0, + eRefMultVsNContrLow_Formula, eEventCutsFormulas_N }; @@ -343,24 +343,24 @@ enum eQAEventHistograms2D { eMultiplicity_vs_ReferenceMultiplicity = 0, // multiplicity is x, reference multiplicity is y. I can swap offline if needed: histOriginal->GetBinContent(x,y); histSwapped->Fill(y,x); eMultiplicity_vs_NContributors, eMultiplicity_vs_Centrality, - eMultiplicity_vs_Vertex_z, + eMultiplicity_vs_VertexZ, eMultiplicity_vs_Occupancy, eMultiplicity_vs_InteractionRate, // TBI 20250331 I ctd. below with more histos in category eMultiplicity_vs_... - re-organize at some point bookkeping here eReferenceMultiplicity_vs_NContributors, eReferenceMultiplicity_vs_Centrality, - eReferenceMultiplicity_vs_Vertex_z, + eReferenceMultiplicity_vs_VertexZ, eReferenceMultiplicity_vs_Occupancy, eReferenceMultiplicity_vs_InteractionRate, eNContributors_vs_Centrality, - eNContributors_vs_Vertex_z, + eNContributors_vs_VertexZ, eNContributors_vs_Occupancy, eNContributors_vs_InteractionRate, - eCentrality_vs_Vertex_z, + eCentrality_vs_VertexZ, eCentrality_vs_Occupancy, eCentrality_vs_ImpactParameter, // [sim] = reconstructed centrality vs. simulated impact parameter. [rec] = ... TBI 20241210 eCentrality_vs_InteractionRate, - eVertex_z_vs_Occupancy, - eVertex_z_vs_InteractionRate, + eVertexZ_vs_Occupancy, + eVertexZ_vs_InteractionRate, // ... // Specific (everything is hardwired): eMultNTracksPV_vs_MultNTracksGlobal, // Run 3 multiplicity diff --git a/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h b/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h index 85382069dbb..dc33b8d3d30 100644 --- a/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h +++ b/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h @@ -235,9 +235,9 @@ void DefaultConfiguration() eh.fEventHistogramsName[eMultiplicity] = "Multiplicity"; eh.fEventHistogramsName[eReferenceMultiplicity] = "ReferenceMultiplicity"; eh.fEventHistogramsName[eCentrality] = "Centrality"; - eh.fEventHistogramsName[eVertex_x] = "Vertex_x"; - eh.fEventHistogramsName[eVertex_y] = "Vertex_y"; - eh.fEventHistogramsName[eVertex_z] = "Vertex_z"; + eh.fEventHistogramsName[eVertexX] = "VertexX"; + eh.fEventHistogramsName[eVertexY] = "VertexY"; + eh.fEventHistogramsName[eVertexZ] = "VertexZ"; eh.fEventHistogramsName[eNContributors] = "NContributors"; eh.fEventHistogramsName[eImpactParameter] = "ImpactParameter"; eh.fEventHistogramsName[eEventPlaneAngle] = "EventPlaneAngle"; @@ -263,9 +263,9 @@ void DefaultConfiguration() ec.fEventCutName[eMultiplicity] = "Multiplicity"; ec.fEventCutName[eReferenceMultiplicity] = "ReferenceMultiplicity"; ec.fEventCutName[eCentrality] = "Centrality"; - ec.fEventCutName[eVertex_x] = "Vertex_x"; - ec.fEventCutName[eVertex_y] = "Vertex_y"; - ec.fEventCutName[eVertex_z] = "Vertex_z"; + ec.fEventCutName[eVertexX] = "VertexX"; + ec.fEventCutName[eVertexY] = "VertexY"; + ec.fEventCutName[eVertexZ] = "VertexZ"; ec.fEventCutName[eNContributors] = "NContributors"; ec.fEventCutName[eImpactParameter] = "ImpactParameter"; ec.fEventCutName[eEventPlaneAngle] = "EventPlaneAngle"; @@ -298,8 +298,8 @@ void DefaultConfiguration() ec.fEventCutName[eNoPileupTPC] = "NoPileupTPC"; ec.fEventCutName[eNoPileupFromSPD] = "NoPileupFromSPD"; ec.fEventCutName[eNoSPDOnVsOfPileup] = "NoSPDOnVsOfPileup"; - ec.fEventCutName[eRefMult_vs_NContr_Up] = "RefMult_vs_NContr_Up"; - ec.fEventCutName[eRefMult_vs_NContr_Low] = "RefMult_vs_NContr_Low"; + ec.fEventCutName[eRefMultVsNContrUp] = "RefMultVsNContrUp"; + ec.fEventCutName[eRefMultVsNContrLow] = "RefMultVsNContrLow"; ec.fEventCutName[eCentralityCorrelationsCut] = "CentralityCorrelationsCut"; ec.fEventCutName[eCentralityWeights] = "CentralityWeights"; for (int t = 0; t < eEventCuts_N; t++) { @@ -438,8 +438,8 @@ void DefaultConfiguration() pw.fUseDiffPhiWeights[wPhiChargeAxis] = Alright(lWhichDiffPhiWeights[dpw]) && pw.fUseDiffPhiWeights[wPhiPhiAxis]; } else if (TString(lWhichDiffPhiWeights[dpw]).Contains("wCentrality")) { pw.fUseDiffPhiWeights[wPhiCentralityAxis] = Alright(lWhichDiffPhiWeights[dpw]) && pw.fUseDiffPhiWeights[wPhiPhiAxis]; - } else if (TString(lWhichDiffPhiWeights[dpw]).Contains("wVertex_z")) { - pw.fUseDiffPhiWeights[wPhiVertex_zAxis] = Alright(lWhichDiffPhiWeights[dpw]) && pw.fUseDiffPhiWeights[wPhiPhiAxis]; + } else if (TString(lWhichDiffPhiWeights[dpw]).Contains("wVertexZ") || TString(lWhichDiffPhiWeights[dpw]).Contains("wVertex_z")) { // TBI 20250402 I keep "wVertex_z" here just in case I still have somewhere dependency on it, remove eventually + pw.fUseDiffPhiWeights[wPhiVertexZAxis] = Alright(lWhichDiffPhiWeights[dpw]) && pw.fUseDiffPhiWeights[wPhiPhiAxis]; } else { LOGF(fatal, "\033[1;31m%s at line %d : The setting %s in configurable cfWhichDiffPhiWeights is not supported yet. See enum eDiffPhiWeights . \n \033[0m", __FUNCTION__, __LINE__, TString(lWhichDiffPhiWeights[dpw]).Data()); } @@ -624,24 +624,24 @@ void DefaultConfiguration() qa.fEventHistogramsName2D[eMultiplicity_vs_ReferenceMultiplicity] = Form("%s_vs_%s", eh.fEventHistogramsName[eMultiplicity].Data(), eh.fEventHistogramsName[eReferenceMultiplicity].Data()); qa.fEventHistogramsName2D[eMultiplicity_vs_NContributors] = Form("%s_vs_%s", eh.fEventHistogramsName[eMultiplicity].Data(), eh.fEventHistogramsName[eNContributors].Data()); qa.fEventHistogramsName2D[eMultiplicity_vs_Centrality] = Form("%s_vs_%s", eh.fEventHistogramsName[eMultiplicity].Data(), eh.fEventHistogramsName[eCentrality].Data()); - qa.fEventHistogramsName2D[eMultiplicity_vs_Vertex_z] = Form("%s_vs_%s", eh.fEventHistogramsName[eMultiplicity].Data(), eh.fEventHistogramsName[eVertex_z].Data()); + qa.fEventHistogramsName2D[eMultiplicity_vs_VertexZ] = Form("%s_vs_%s", eh.fEventHistogramsName[eMultiplicity].Data(), eh.fEventHistogramsName[eVertexZ].Data()); qa.fEventHistogramsName2D[eMultiplicity_vs_Occupancy] = Form("%s_vs_%s", eh.fEventHistogramsName[eMultiplicity].Data(), eh.fEventHistogramsName[eOccupancy].Data()); qa.fEventHistogramsName2D[eMultiplicity_vs_InteractionRate] = Form("%s_vs_%s", eh.fEventHistogramsName[eMultiplicity].Data(), eh.fEventHistogramsName[eInteractionRate].Data()); qa.fEventHistogramsName2D[eReferenceMultiplicity_vs_NContributors] = Form("%s_vs_%s", eh.fEventHistogramsName[eReferenceMultiplicity].Data(), eh.fEventHistogramsName[eNContributors].Data()); qa.fEventHistogramsName2D[eReferenceMultiplicity_vs_Centrality] = Form("%s_vs_%s", eh.fEventHistogramsName[eReferenceMultiplicity].Data(), eh.fEventHistogramsName[eCentrality].Data()); - qa.fEventHistogramsName2D[eReferenceMultiplicity_vs_Vertex_z] = Form("%s_vs_%s", eh.fEventHistogramsName[eReferenceMultiplicity].Data(), eh.fEventHistogramsName[eVertex_z].Data()); + qa.fEventHistogramsName2D[eReferenceMultiplicity_vs_VertexZ] = Form("%s_vs_%s", eh.fEventHistogramsName[eReferenceMultiplicity].Data(), eh.fEventHistogramsName[eVertexZ].Data()); qa.fEventHistogramsName2D[eReferenceMultiplicity_vs_Occupancy] = Form("%s_vs_%s", eh.fEventHistogramsName[eReferenceMultiplicity].Data(), eh.fEventHistogramsName[eOccupancy].Data()); qa.fEventHistogramsName2D[eReferenceMultiplicity_vs_InteractionRate] = Form("%s_vs_%s", eh.fEventHistogramsName[eReferenceMultiplicity].Data(), eh.fEventHistogramsName[eInteractionRate].Data()); qa.fEventHistogramsName2D[eNContributors_vs_Centrality] = Form("%s_vs_%s", eh.fEventHistogramsName[eNContributors].Data(), eh.fEventHistogramsName[eCentrality].Data()); - qa.fEventHistogramsName2D[eNContributors_vs_Vertex_z] = Form("%s_vs_%s", eh.fEventHistogramsName[eNContributors].Data(), eh.fEventHistogramsName[eVertex_z].Data()); + qa.fEventHistogramsName2D[eNContributors_vs_VertexZ] = Form("%s_vs_%s", eh.fEventHistogramsName[eNContributors].Data(), eh.fEventHistogramsName[eVertexZ].Data()); qa.fEventHistogramsName2D[eNContributors_vs_Occupancy] = Form("%s_vs_%s", eh.fEventHistogramsName[eNContributors].Data(), eh.fEventHistogramsName[eOccupancy].Data()); qa.fEventHistogramsName2D[eNContributors_vs_InteractionRate] = Form("%s_vs_%s", eh.fEventHistogramsName[eNContributors].Data(), eh.fEventHistogramsName[eInteractionRate].Data()); - qa.fEventHistogramsName2D[eCentrality_vs_Vertex_z] = Form("%s_vs_%s", eh.fEventHistogramsName[eCentrality].Data(), eh.fEventHistogramsName[eVertex_z].Data()); + qa.fEventHistogramsName2D[eCentrality_vs_VertexZ] = Form("%s_vs_%s", eh.fEventHistogramsName[eCentrality].Data(), eh.fEventHistogramsName[eVertexZ].Data()); qa.fEventHistogramsName2D[eCentrality_vs_Occupancy] = Form("%s_vs_%s", eh.fEventHistogramsName[eCentrality].Data(), eh.fEventHistogramsName[eOccupancy].Data()); qa.fEventHistogramsName2D[eCentrality_vs_ImpactParameter] = Form("%s_vs_%s", eh.fEventHistogramsName[eCentrality].Data(), eh.fEventHistogramsName[eImpactParameter].Data()); qa.fEventHistogramsName2D[eCentrality_vs_InteractionRate] = Form("%s_vs_%s", eh.fEventHistogramsName[eCentrality].Data(), eh.fEventHistogramsName[eInteractionRate].Data()); - qa.fEventHistogramsName2D[eVertex_z_vs_Occupancy] = Form("%s_vs_%s", eh.fEventHistogramsName[eVertex_z].Data(), eh.fEventHistogramsName[eOccupancy].Data()); - qa.fEventHistogramsName2D[eVertex_z_vs_InteractionRate] = Form("%s_vs_%s", eh.fEventHistogramsName[eVertex_z].Data(), eh.fEventHistogramsName[eInteractionRate].Data()); + qa.fEventHistogramsName2D[eVertexZ_vs_Occupancy] = Form("%s_vs_%s", eh.fEventHistogramsName[eVertexZ].Data(), eh.fEventHistogramsName[eOccupancy].Data()); + qa.fEventHistogramsName2D[eVertexZ_vs_InteractionRate] = Form("%s_vs_%s", eh.fEventHistogramsName[eVertexZ].Data(), eh.fEventHistogramsName[eInteractionRate].Data()); qa.fEventHistogramsName2D[eMultiplicity_vs_FT0CAmplitudeOnFoundBC] = Form("%s_vs_%s", eh.fEventHistogramsName[eMultiplicity].Data(), "FT0CAmplitudeOnFoundBC"); // TBI 20250331 hardwired string qa.fEventHistogramsName2D[eCentFT0C_vs_FT0CAmplitudeOnFoundBC] = Form("%s_vs_%s", qa.fCentralityEstimatorName[eCentFT0C].Data(), "FT0CAmplitudeOnFoundBC"); // TBI 20250331 hardwired string qa.fEventHistogramsName2D[eMultNTracksPV_vs_MultNTracksGlobal] = Form("%s_vs_%s", qa.fReferenceMultiplicityEstimatorName[eMultNTracksPV].Data(), qa.fReferenceMultiplicityEstimatorName[eMultNTracksGlobal].Data()); @@ -894,9 +894,9 @@ void DefaultBooking() eh.fBookEventHistograms[eMultiplicity] = Alright(lBookEventHistograms[eMultiplicity]) && eh.fFillEventHistograms; eh.fBookEventHistograms[eReferenceMultiplicity] = Alright(lBookEventHistograms[eReferenceMultiplicity]) && eh.fFillEventHistograms; eh.fBookEventHistograms[eCentrality] = Alright(lBookEventHistograms[eCentrality]) && eh.fFillEventHistograms; - eh.fBookEventHistograms[eVertex_x] = Alright(lBookEventHistograms[eVertex_x]) && eh.fFillEventHistograms; - eh.fBookEventHistograms[eVertex_y] = Alright(lBookEventHistograms[eVertex_y]) && eh.fFillEventHistograms; - eh.fBookEventHistograms[eVertex_z] = Alright(lBookEventHistograms[eVertex_z]) && eh.fFillEventHistograms; + eh.fBookEventHistograms[eVertexX] = Alright(lBookEventHistograms[eVertexX]) && eh.fFillEventHistograms; + eh.fBookEventHistograms[eVertexY] = Alright(lBookEventHistograms[eVertexY]) && eh.fFillEventHistograms; + eh.fBookEventHistograms[eVertexZ] = Alright(lBookEventHistograms[eVertexZ]) && eh.fFillEventHistograms; eh.fBookEventHistograms[eNContributors] = Alright(lBookEventHistograms[eNContributors]) && eh.fFillEventHistograms; eh.fBookEventHistograms[eImpactParameter] = Alright(lBookEventHistograms[eImpactParameter]) && eh.fFillEventHistograms; eh.fBookEventHistograms[eEventPlaneAngle] = Alright(lBookEventHistograms[eEventPlaneAngle]) && eh.fFillEventHistograms; @@ -1037,24 +1037,24 @@ void DefaultBooking() qa.fBookQAEventHistograms2D[eMultiplicity_vs_ReferenceMultiplicity] = Alright(lBookQAEventHistograms2D[eMultiplicity_vs_ReferenceMultiplicity]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eMultiplicity_vs_NContributors] = Alright(lBookQAEventHistograms2D[eMultiplicity_vs_NContributors]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eMultiplicity_vs_Centrality] = Alright(lBookQAEventHistograms2D[eMultiplicity_vs_Centrality]) && qa.fFillQAEventHistograms2D; - qa.fBookQAEventHistograms2D[eMultiplicity_vs_Vertex_z] = Alright(lBookQAEventHistograms2D[eMultiplicity_vs_Vertex_z]) && qa.fFillQAEventHistograms2D; + qa.fBookQAEventHistograms2D[eMultiplicity_vs_VertexZ] = Alright(lBookQAEventHistograms2D[eMultiplicity_vs_VertexZ]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eMultiplicity_vs_Occupancy] = Alright(lBookQAEventHistograms2D[eMultiplicity_vs_Occupancy]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eMultiplicity_vs_InteractionRate] = Alright(lBookQAEventHistograms2D[eMultiplicity_vs_InteractionRate]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eReferenceMultiplicity_vs_NContributors] = Alright(lBookQAEventHistograms2D[eReferenceMultiplicity_vs_NContributors]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eReferenceMultiplicity_vs_Centrality] = Alright(lBookQAEventHistograms2D[eReferenceMultiplicity_vs_Centrality]) && qa.fFillQAEventHistograms2D; - qa.fBookQAEventHistograms2D[eReferenceMultiplicity_vs_Vertex_z] = Alright(lBookQAEventHistograms2D[eReferenceMultiplicity_vs_Vertex_z]) && qa.fFillQAEventHistograms2D; + qa.fBookQAEventHistograms2D[eReferenceMultiplicity_vs_VertexZ] = Alright(lBookQAEventHistograms2D[eReferenceMultiplicity_vs_VertexZ]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eReferenceMultiplicity_vs_Occupancy] = Alright(lBookQAEventHistograms2D[eReferenceMultiplicity_vs_Occupancy]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eReferenceMultiplicity_vs_InteractionRate] = Alright(lBookQAEventHistograms2D[eReferenceMultiplicity_vs_InteractionRate]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eNContributors_vs_Centrality] = Alright(lBookQAEventHistograms2D[eNContributors_vs_Centrality]) && qa.fFillQAEventHistograms2D; - qa.fBookQAEventHistograms2D[eNContributors_vs_Vertex_z] = Alright(lBookQAEventHistograms2D[eNContributors_vs_Vertex_z]) && qa.fFillQAEventHistograms2D; + qa.fBookQAEventHistograms2D[eNContributors_vs_VertexZ] = Alright(lBookQAEventHistograms2D[eNContributors_vs_VertexZ]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eNContributors_vs_Occupancy] = Alright(lBookQAEventHistograms2D[eNContributors_vs_Occupancy]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eNContributors_vs_InteractionRate] = Alright(lBookQAEventHistograms2D[eNContributors_vs_InteractionRate]) && qa.fFillQAEventHistograms2D; - qa.fBookQAEventHistograms2D[eCentrality_vs_Vertex_z] = Alright(lBookQAEventHistograms2D[eCentrality_vs_Vertex_z]) && qa.fFillQAEventHistograms2D; + qa.fBookQAEventHistograms2D[eCentrality_vs_VertexZ] = Alright(lBookQAEventHistograms2D[eCentrality_vs_VertexZ]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eCentrality_vs_Occupancy] = Alright(lBookQAEventHistograms2D[eCentrality_vs_Occupancy]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eCentrality_vs_ImpactParameter] = Alright(lBookQAEventHistograms2D[eCentrality_vs_ImpactParameter]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eCentrality_vs_InteractionRate] = Alright(lBookQAEventHistograms2D[eCentrality_vs_InteractionRate]) && qa.fFillQAEventHistograms2D; - qa.fBookQAEventHistograms2D[eVertex_z_vs_Occupancy] = Alright(lBookQAEventHistograms2D[eVertex_z_vs_Occupancy]) && qa.fFillQAEventHistograms2D; - qa.fBookQAEventHistograms2D[eVertex_z_vs_InteractionRate] = Alright(lBookQAEventHistograms2D[eVertex_z_vs_InteractionRate]) && qa.fFillQAEventHistograms2D; + qa.fBookQAEventHistograms2D[eVertexZ_vs_Occupancy] = Alright(lBookQAEventHistograms2D[eVertexZ_vs_Occupancy]) && qa.fFillQAEventHistograms2D; + qa.fBookQAEventHistograms2D[eVertexZ_vs_InteractionRate] = Alright(lBookQAEventHistograms2D[eVertexZ_vs_InteractionRate]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eMultiplicity_vs_FT0CAmplitudeOnFoundBC] = Alright(lBookQAEventHistograms2D[eMultiplicity_vs_FT0CAmplitudeOnFoundBC]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eCentFT0C_vs_FT0CAmplitudeOnFoundBC] = Alright(lBookQAEventHistograms2D[eCentFT0C_vs_FT0CAmplitudeOnFoundBC]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eMultNTracksPV_vs_MultNTracksGlobal] = Alright(lBookQAEventHistograms2D[eMultNTracksPV_vs_MultNTracksGlobal]) && qa.fFillQAEventHistograms2D; @@ -1261,9 +1261,9 @@ void DefaultBinning() eh.fEventHistogramsBins[eTotalMultiplicity][1] = 0.; eh.fEventHistogramsBins[eTotalMultiplicity][2] = 100000.; - eh.fEventHistogramsBins[eMultiplicity][0] = 2000.; + eh.fEventHistogramsBins[eMultiplicity][0] = 500.; eh.fEventHistogramsBins[eMultiplicity][1] = 0.; - eh.fEventHistogramsBins[eMultiplicity][2] = 20000.; + eh.fEventHistogramsBins[eMultiplicity][2] = 5000.; eh.fEventHistogramsBins[eReferenceMultiplicity][0] = 700.; // bin width is 100 eh.fEventHistogramsBins[eReferenceMultiplicity][1] = 0.; @@ -1273,17 +1273,17 @@ void DefaultBinning() eh.fEventHistogramsBins[eCentrality][1] = 0.; eh.fEventHistogramsBins[eCentrality][2] = 110.; - eh.fEventHistogramsBins[eVertex_x][0] = 1600; - eh.fEventHistogramsBins[eVertex_x][1] = -0.8; - eh.fEventHistogramsBins[eVertex_x][2] = 0.8; + eh.fEventHistogramsBins[eVertexX][0] = 1600; + eh.fEventHistogramsBins[eVertexX][1] = -0.8; + eh.fEventHistogramsBins[eVertexX][2] = 0.8; - eh.fEventHistogramsBins[eVertex_y][0] = 1600; - eh.fEventHistogramsBins[eVertex_y][1] = -0.8; - eh.fEventHistogramsBins[eVertex_y][2] = 0.8; + eh.fEventHistogramsBins[eVertexY][0] = 1600; + eh.fEventHistogramsBins[eVertexY][1] = -0.8; + eh.fEventHistogramsBins[eVertexY][2] = 0.8; - eh.fEventHistogramsBins[eVertex_z][0] = 800; - eh.fEventHistogramsBins[eVertex_z][1] = -40.; - eh.fEventHistogramsBins[eVertex_z][2] = 40.; + eh.fEventHistogramsBins[eVertexZ][0] = 800; + eh.fEventHistogramsBins[eVertexZ][1] = -40.; + eh.fEventHistogramsBins[eVertexZ][2] = 40.; eh.fEventHistogramsBins[eNContributors][0] = 600.; // bin width is 20 eh.fEventHistogramsBins[eNContributors][1] = 0.; @@ -1685,9 +1685,9 @@ void DefaultCuts() ec.fUseEventCuts[eMultiplicity] = Alright(lUseEventCuts[eMultiplicity]); ec.fUseEventCuts[eReferenceMultiplicity] = Alright(lUseEventCuts[eReferenceMultiplicity]); ec.fUseEventCuts[eCentrality] = Alright(lUseEventCuts[eCentrality]); - ec.fUseEventCuts[eVertex_x] = Alright(lUseEventCuts[eVertex_x]); - ec.fUseEventCuts[eVertex_y] = Alright(lUseEventCuts[eVertex_y]); - ec.fUseEventCuts[eVertex_z] = Alright(lUseEventCuts[eVertex_z]); + ec.fUseEventCuts[eVertexX] = Alright(lUseEventCuts[eVertexX]); + ec.fUseEventCuts[eVertexY] = Alright(lUseEventCuts[eVertexY]); + ec.fUseEventCuts[eVertexZ] = Alright(lUseEventCuts[eVertexZ]); ec.fUseEventCuts[eNContributors] = Alright(lUseEventCuts[eNContributors]); ec.fUseEventCuts[eImpactParameter] = Alright(lUseEventCuts[eImpactParameter]); ec.fUseEventCuts[eEventPlaneAngle] = Alright(lUseEventCuts[eEventPlaneAngle]); @@ -1722,8 +1722,8 @@ void DefaultCuts() ec.fUseEventCuts[eNoPileupTPC] = Alright(lUseEventCuts[eNoPileupTPC]); ec.fUseEventCuts[eNoPileupFromSPD] = Alright(lUseEventCuts[eNoPileupFromSPD]); ec.fUseEventCuts[eNoSPDOnVsOfPileup] = Alright(lUseEventCuts[eNoSPDOnVsOfPileup]); - ec.fUseEventCuts[eRefMult_vs_NContr_Up] = Alright(lUseEventCuts[eRefMult_vs_NContr_Up]); - ec.fUseEventCuts[eRefMult_vs_NContr_Low] = Alright(lUseEventCuts[eRefMult_vs_NContr_Low]); + ec.fUseEventCuts[eRefMultVsNContrUp] = Alright(lUseEventCuts[eRefMultVsNContrUp]); + ec.fUseEventCuts[eRefMultVsNContrLow] = Alright(lUseEventCuts[eRefMultVsNContrLow]); ec.fUseEventCuts[eCentralityCorrelationsCut] = Alright(lUseEventCuts[eCentralityCorrelationsCut]); ec.fUseEventCuts[eCentralityWeights] = Alright(lUseEventCuts[eCentralityWeights]); @@ -1775,17 +1775,17 @@ void DefaultCuts() ec.fdEventCuts[eCentrality][eMin] = lCentrality[eMin]; ec.fdEventCuts[eCentrality][eMax] = lCentrality[eMax]; - auto lVertex_x = (std::vector)cf_ec.cfVertex_x; - ec.fdEventCuts[eVertex_x][eMin] = lVertex_x[eMin]; - ec.fdEventCuts[eVertex_x][eMax] = lVertex_x[eMax]; + auto lVertexX = (std::vector)cf_ec.cfVertexX; + ec.fdEventCuts[eVertexX][eMin] = lVertexX[eMin]; + ec.fdEventCuts[eVertexX][eMax] = lVertexX[eMax]; - auto lVertex_y = (std::vector)cf_ec.cfVertex_y; - ec.fdEventCuts[eVertex_y][eMin] = lVertex_y[eMin]; - ec.fdEventCuts[eVertex_y][eMax] = lVertex_y[eMax]; + auto lVertexY = (std::vector)cf_ec.cfVertexY; + ec.fdEventCuts[eVertexY][eMin] = lVertexY[eMin]; + ec.fdEventCuts[eVertexY][eMax] = lVertexY[eMax]; - auto lVertex_z = (std::vector)cf_ec.cfVertex_z; - ec.fdEventCuts[eVertex_z][eMin] = lVertex_z[eMin]; - ec.fdEventCuts[eVertex_z][eMax] = lVertex_z[eMax]; + auto lVertexZ = (std::vector)cf_ec.cfVertexZ; + ec.fdEventCuts[eVertexZ][eMin] = lVertexZ[eMin]; + ec.fdEventCuts[eVertexZ][eMax] = lVertexZ[eMax]; auto lNContributors = (std::vector)cf_ec.cfNContributors; ec.fdEventCuts[eNContributors][eMin] = lNContributors[eMin]; @@ -1828,8 +1828,8 @@ void DefaultCuts() ec.fsEventCuts[eCentralityEstimator] = cf_ec.cfCentralityEstimator; ec.fsEventCuts[eTrigger] = cf_ec.cfTrigger; ec.fsEventCuts[eOccupancyEstimator] = cf_ec.cfOccupancyEstimator; - ec.fsEventCuts[eRefMult_vs_NContr_Up] = cf_ec.cfRefMult_vs_NContr_Up; - ec.fsEventCuts[eRefMult_vs_NContr_Low] = cf_ec.cfRefMult_vs_NContr_Low; + ec.fsEventCuts[eRefMultVsNContrUp] = cf_ec.cfRefMultVsNContrUp; + ec.fsEventCuts[eRefMultVsNContrLow] = cf_ec.cfRefMultVsNContrLow; ec.fsEventCuts[eCentralityCorrelationsCut] = cf_ec.cfCentralityCorrelationsCut; // **) additional info for some specific event cuts, which I didn't enumerate in enum eEventCuts, to trim down bookeeping: @@ -2044,11 +2044,11 @@ void SpecificCuts(TString whichSpecificCuts) ec.fdEventCuts[eInteractionRate][eMin] = 0.1; // there are some pathological non-physical events with IR = 0. See eCorrelationsVsInteractionRate_vs_ReferenceMultiplicity ec.fdEventCuts[eInteractionRate][eMax] = 1000000000.; - ec.fUseEventCuts[eRefMult_vs_NContr_Up] = true; - ec.fUseEventCuts[eRefMult_vs_NContr_Low] = true; + ec.fUseEventCuts[eRefMultVsNContrUp] = true; + ec.fUseEventCuts[eRefMultVsNContrLow] = true; if (ec.fsEventCuts[eReferenceMultiplicityEstimator].EqualTo("MultFT0C")) { - ec.fsEventCuts[eRefMult_vs_NContr_Up] = "1200. + 0.20*x"; // TBI 20250401 not fine-tune, just an example - ec.fsEventCuts[eRefMult_vs_NContr_Low] = "-650. + 0.08*x"; // TBI 20250401 not fine-tune, just an example + ec.fsEventCuts[eRefMultVsNContrUp] = "1200. + 0.20*x"; // TBI 20250401 not fine-tune, just an example + ec.fsEventCuts[eRefMultVsNContrLow] = "-650. + 0.08*x"; // TBI 20250401 not fine-tune, just an example // TBI 20250331 fine-tune this cut in the same spirit for other ref. mult. estimators } @@ -2127,11 +2127,11 @@ void SpecificCuts(TString whichSpecificCuts) ec.fdEventCuts[eInteractionRate][eMin] = 0.1; // there are some pathological non-physical events with IR = 0. See eCorrelationsVsInteractionRate_vs_ReferenceMultiplicity ec.fdEventCuts[eInteractionRate][eMax] = 1000000000.; - ec.fUseEventCuts[eRefMult_vs_NContr_Up] = false; // TBI 20250331 set to true only when I fine-tune - ec.fUseEventCuts[eRefMult_vs_NContr_Low] = false; // TBI 20250331 set to true only when I fine-tune + ec.fUseEventCuts[eRefMultVsNContrUp] = false; // TBI 20250331 set to true only when I fine-tune + ec.fUseEventCuts[eRefMultVsNContrLow] = false; // TBI 20250331 set to true only when I fine-tune if (ec.fsEventCuts[eReferenceMultiplicityEstimator].EqualTo("MultFT0C")) { - ec.fsEventCuts[eRefMult_vs_NContr_Up] = "..."; // TBI 20250329 I need to tune and validate for this dataset, and estimator - ec.fsEventCuts[eRefMult_vs_NContr_Low] = "..."; // TBI 20250329 I need to tune and validate for this dataset, and estimator + ec.fsEventCuts[eRefMultVsNContrUp] = "..."; // TBI 20250329 I need to tune and validate for this dataset, and estimator + ec.fsEventCuts[eRefMultVsNContrLow] = "..."; // TBI 20250329 I need to tune and validate for this dataset, and estimator // TBI 20250331 fine-tune this cut in the same spirit for other ref. mult. estimators } @@ -2214,11 +2214,11 @@ void SpecificCuts(TString whichSpecificCuts) ec.fsEventCuts[eReferenceMultiplicityEstimator] = "MultTracklets"; // default ref. mult. estimator in Run 2 ec.fsEventCuts[eCentralityEstimator] = "CentRun2V0M"; // default centrality estimator in Run 2 - ec.fUseEventCuts[eRefMult_vs_NContr_Up] = true; - ec.fUseEventCuts[eRefMult_vs_NContr_Low] = true; + ec.fUseEventCuts[eRefMultVsNContrUp] = true; + ec.fUseEventCuts[eRefMultVsNContrLow] = true; if (ec.fsEventCuts[eReferenceMultiplicityEstimator].EqualTo("MultTracklets")) { - ec.fsEventCuts[eRefMult_vs_NContr_Up] = "700. + 0.95*x"; // TBI 20250401 not fine-tune, just an example - ec.fsEventCuts[eRefMult_vs_NContr_Low] = "-400. + 0.5*x"; // TBI 20250401 not fine-tune, just an example + ec.fsEventCuts[eRefMultVsNContrUp] = "700. + 0.95*x"; // TBI 20250401 not fine-tune, just an example + ec.fsEventCuts[eRefMultVsNContrLow] = "-400. + 0.5*x"; // TBI 20250401 not fine-tune, just an example // TBI 20250331 fine-tune this cut in the same spirit for other ref. mult. estimators } @@ -2262,8 +2262,8 @@ void SpecificCuts(TString whichSpecificCuts) qa.fBookQAEventHistograms2D[eNContributors_vs_InteractionRate] = false; qa.fBookQAEventHistograms2D[eCentrality_vs_Occupancy] = false; qa.fBookQAEventHistograms2D[eCentrality_vs_InteractionRate] = false; - qa.fBookQAEventHistograms2D[eVertex_z_vs_Occupancy] = false; - qa.fBookQAEventHistograms2D[eVertex_z_vs_InteractionRate] = false; + qa.fBookQAEventHistograms2D[eVertexZ_vs_Occupancy] = false; + qa.fBookQAEventHistograms2D[eVertexZ_vs_InteractionRate] = false; qa.fBookQAEventHistograms2D[eMultiplicity_vs_FT0CAmplitudeOnFoundBC] = false; qa.fBookQAEventHistograms2D[eCentFT0C_vs_FT0CAmplitudeOnFoundBC] = false; qa.fBookQAEventHistograms2D[eCentFT0C_vs_CentFT0CVariant1] = false; @@ -3235,15 +3235,15 @@ void BookQAHistograms() max_y_Event[eMultiplicity_vs_Centrality] = eh.fEventHistogramsBins[eCentrality][2]; title_y_Event[eMultiplicity_vs_Centrality] = FancyFormatting(eh.fEventHistogramsName[eCentrality].Data()); - // *) "Multiplicity_vs_Vertex_z": - nBins_x_Event[eMultiplicity_vs_Vertex_z] = static_cast(eh.fEventHistogramsBins[eMultiplicity][0] / qa.fRebin); - min_x_Event[eMultiplicity_vs_Vertex_z] = eh.fEventHistogramsBins[eMultiplicity][1]; - max_x_Event[eMultiplicity_vs_Vertex_z] = eh.fEventHistogramsBins[eMultiplicity][2]; - title_x_Event[eMultiplicity_vs_Vertex_z] = FancyFormatting(eh.fEventHistogramsName[eMultiplicity].Data()); - nBins_y_Event[eMultiplicity_vs_Vertex_z] = static_cast(eh.fEventHistogramsBins[eVertex_z][0]); - min_y_Event[eMultiplicity_vs_Vertex_z] = eh.fEventHistogramsBins[eVertex_z][1]; - max_y_Event[eMultiplicity_vs_Vertex_z] = eh.fEventHistogramsBins[eVertex_z][2]; - title_y_Event[eMultiplicity_vs_Vertex_z] = FancyFormatting(eh.fEventHistogramsName[eVertex_z].Data()); + // *) "Multiplicity_vs_VertexZ": + nBins_x_Event[eMultiplicity_vs_VertexZ] = static_cast(eh.fEventHistogramsBins[eMultiplicity][0] / qa.fRebin); + min_x_Event[eMultiplicity_vs_VertexZ] = eh.fEventHistogramsBins[eMultiplicity][1]; + max_x_Event[eMultiplicity_vs_VertexZ] = eh.fEventHistogramsBins[eMultiplicity][2]; + title_x_Event[eMultiplicity_vs_VertexZ] = FancyFormatting(eh.fEventHistogramsName[eMultiplicity].Data()); + nBins_y_Event[eMultiplicity_vs_VertexZ] = static_cast(eh.fEventHistogramsBins[eVertexZ][0]); + min_y_Event[eMultiplicity_vs_VertexZ] = eh.fEventHistogramsBins[eVertexZ][1]; + max_y_Event[eMultiplicity_vs_VertexZ] = eh.fEventHistogramsBins[eVertexZ][2]; + title_y_Event[eMultiplicity_vs_VertexZ] = FancyFormatting(eh.fEventHistogramsName[eVertexZ].Data()); // *) "Multiplicity_vs_Occupancy": nBins_x_Event[eMultiplicity_vs_Occupancy] = static_cast(eh.fEventHistogramsBins[eMultiplicity][0] / qa.fRebin); @@ -3285,15 +3285,15 @@ void BookQAHistograms() max_y_Event[eReferenceMultiplicity_vs_Centrality] = eh.fEventHistogramsBins[eCentrality][2]; title_y_Event[eReferenceMultiplicity_vs_Centrality] = FancyFormatting(eh.fEventHistogramsName[eCentrality].Data()); - // *) "ReferenceMultiplicity_vs_Vertex_z": - nBins_x_Event[eReferenceMultiplicity_vs_Vertex_z] = static_cast(eh.fEventHistogramsBins[eReferenceMultiplicity][0] / qa.fRebin); - min_x_Event[eReferenceMultiplicity_vs_Vertex_z] = eh.fEventHistogramsBins[eReferenceMultiplicity][1]; - max_x_Event[eReferenceMultiplicity_vs_Vertex_z] = eh.fEventHistogramsBins[eReferenceMultiplicity][2]; - title_x_Event[eReferenceMultiplicity_vs_Vertex_z] = FancyFormatting(eh.fEventHistogramsName[eReferenceMultiplicity].Data()); - nBins_y_Event[eReferenceMultiplicity_vs_Vertex_z] = static_cast(eh.fEventHistogramsBins[eVertex_z][0]); - min_y_Event[eReferenceMultiplicity_vs_Vertex_z] = eh.fEventHistogramsBins[eVertex_z][1]; - max_y_Event[eReferenceMultiplicity_vs_Vertex_z] = eh.fEventHistogramsBins[eVertex_z][2]; - title_y_Event[eReferenceMultiplicity_vs_Vertex_z] = FancyFormatting(eh.fEventHistogramsName[eVertex_z].Data()); + // *) "ReferenceMultiplicity_vs_VertexZ": + nBins_x_Event[eReferenceMultiplicity_vs_VertexZ] = static_cast(eh.fEventHistogramsBins[eReferenceMultiplicity][0] / qa.fRebin); + min_x_Event[eReferenceMultiplicity_vs_VertexZ] = eh.fEventHistogramsBins[eReferenceMultiplicity][1]; + max_x_Event[eReferenceMultiplicity_vs_VertexZ] = eh.fEventHistogramsBins[eReferenceMultiplicity][2]; + title_x_Event[eReferenceMultiplicity_vs_VertexZ] = FancyFormatting(eh.fEventHistogramsName[eReferenceMultiplicity].Data()); + nBins_y_Event[eReferenceMultiplicity_vs_VertexZ] = static_cast(eh.fEventHistogramsBins[eVertexZ][0]); + min_y_Event[eReferenceMultiplicity_vs_VertexZ] = eh.fEventHistogramsBins[eVertexZ][1]; + max_y_Event[eReferenceMultiplicity_vs_VertexZ] = eh.fEventHistogramsBins[eVertexZ][2]; + title_y_Event[eReferenceMultiplicity_vs_VertexZ] = FancyFormatting(eh.fEventHistogramsName[eVertexZ].Data()); // *) "ReferenceMultiplicity_vs_Occupancy": nBins_x_Event[eReferenceMultiplicity_vs_Occupancy] = static_cast(eh.fEventHistogramsBins[eReferenceMultiplicity][0] / qa.fRebin); @@ -3325,15 +3325,15 @@ void BookQAHistograms() max_y_Event[eNContributors_vs_Centrality] = eh.fEventHistogramsBins[eCentrality][2]; title_y_Event[eNContributors_vs_Centrality] = FancyFormatting(eh.fEventHistogramsName[eCentrality].Data()); - // *) "NContributors_vs_Vertex_z": - nBins_x_Event[eNContributors_vs_Vertex_z] = static_cast(eh.fEventHistogramsBins[eNContributors][0] / qa.fRebin); - min_x_Event[eNContributors_vs_Vertex_z] = eh.fEventHistogramsBins[eNContributors][1]; - max_x_Event[eNContributors_vs_Vertex_z] = eh.fEventHistogramsBins[eNContributors][2]; - title_x_Event[eNContributors_vs_Vertex_z] = FancyFormatting(eh.fEventHistogramsName[eNContributors].Data()); - nBins_y_Event[eNContributors_vs_Vertex_z] = static_cast(eh.fEventHistogramsBins[eVertex_z][0]); - min_y_Event[eNContributors_vs_Vertex_z] = eh.fEventHistogramsBins[eVertex_z][1]; - max_y_Event[eNContributors_vs_Vertex_z] = eh.fEventHistogramsBins[eVertex_z][2]; - title_y_Event[eNContributors_vs_Vertex_z] = FancyFormatting(eh.fEventHistogramsName[eVertex_z].Data()); + // *) "NContributors_vs_VertexZ": + nBins_x_Event[eNContributors_vs_VertexZ] = static_cast(eh.fEventHistogramsBins[eNContributors][0] / qa.fRebin); + min_x_Event[eNContributors_vs_VertexZ] = eh.fEventHistogramsBins[eNContributors][1]; + max_x_Event[eNContributors_vs_VertexZ] = eh.fEventHistogramsBins[eNContributors][2]; + title_x_Event[eNContributors_vs_VertexZ] = FancyFormatting(eh.fEventHistogramsName[eNContributors].Data()); + nBins_y_Event[eNContributors_vs_VertexZ] = static_cast(eh.fEventHistogramsBins[eVertexZ][0]); + min_y_Event[eNContributors_vs_VertexZ] = eh.fEventHistogramsBins[eVertexZ][1]; + max_y_Event[eNContributors_vs_VertexZ] = eh.fEventHistogramsBins[eVertexZ][2]; + title_y_Event[eNContributors_vs_VertexZ] = FancyFormatting(eh.fEventHistogramsName[eVertexZ].Data()); // *) "NContributors_vs_Occupancy": nBins_x_Event[eNContributors_vs_Occupancy] = static_cast(eh.fEventHistogramsBins[eNContributors][0] / qa.fRebin); @@ -3355,15 +3355,15 @@ void BookQAHistograms() max_y_Event[eNContributors_vs_InteractionRate] = eh.fEventHistogramsBins[eInteractionRate][2]; title_y_Event[eNContributors_vs_InteractionRate] = FancyFormatting(eh.fEventHistogramsName[eInteractionRate].Data()); - // *) "Centrality_vs_Vertex_z": - nBins_x_Event[eCentrality_vs_Vertex_z] = static_cast(eh.fEventHistogramsBins[eCentrality][0]); - min_x_Event[eCentrality_vs_Vertex_z] = eh.fEventHistogramsBins[eCentrality][1]; - max_x_Event[eCentrality_vs_Vertex_z] = eh.fEventHistogramsBins[eCentrality][2]; - title_x_Event[eCentrality_vs_Vertex_z] = FancyFormatting(eh.fEventHistogramsName[eCentrality].Data()); - nBins_y_Event[eCentrality_vs_Vertex_z] = static_cast(eh.fEventHistogramsBins[eVertex_z][0]); - min_y_Event[eCentrality_vs_Vertex_z] = eh.fEventHistogramsBins[eVertex_z][1]; - max_y_Event[eCentrality_vs_Vertex_z] = eh.fEventHistogramsBins[eVertex_z][2]; - title_y_Event[eCentrality_vs_Vertex_z] = FancyFormatting(eh.fEventHistogramsName[eVertex_z].Data()); + // *) "Centrality_vs_VertexZ": + nBins_x_Event[eCentrality_vs_VertexZ] = static_cast(eh.fEventHistogramsBins[eCentrality][0]); + min_x_Event[eCentrality_vs_VertexZ] = eh.fEventHistogramsBins[eCentrality][1]; + max_x_Event[eCentrality_vs_VertexZ] = eh.fEventHistogramsBins[eCentrality][2]; + title_x_Event[eCentrality_vs_VertexZ] = FancyFormatting(eh.fEventHistogramsName[eCentrality].Data()); + nBins_y_Event[eCentrality_vs_VertexZ] = static_cast(eh.fEventHistogramsBins[eVertexZ][0]); + min_y_Event[eCentrality_vs_VertexZ] = eh.fEventHistogramsBins[eVertexZ][1]; + max_y_Event[eCentrality_vs_VertexZ] = eh.fEventHistogramsBins[eVertexZ][2]; + title_y_Event[eCentrality_vs_VertexZ] = FancyFormatting(eh.fEventHistogramsName[eVertexZ].Data()); // *) "Centrality_vs_Occupancy": nBins_x_Event[eCentrality_vs_Occupancy] = static_cast(eh.fEventHistogramsBins[eCentrality][0]); @@ -3395,25 +3395,25 @@ void BookQAHistograms() max_y_Event[eCentrality_vs_InteractionRate] = eh.fEventHistogramsBins[eInteractionRate][2]; title_y_Event[eCentrality_vs_InteractionRate] = FancyFormatting(eh.fEventHistogramsName[eInteractionRate].Data()); - // *) "Vertex_z_vs_Occupancy": - nBins_x_Event[eVertex_z_vs_Occupancy] = static_cast(eh.fEventHistogramsBins[eVertex_z][0]); - min_x_Event[eVertex_z_vs_Occupancy] = eh.fEventHistogramsBins[eVertex_z][1]; - max_x_Event[eVertex_z_vs_Occupancy] = eh.fEventHistogramsBins[eVertex_z][2]; - title_x_Event[eVertex_z_vs_Occupancy] = FancyFormatting(eh.fEventHistogramsName[eVertex_z].Data()); - nBins_y_Event[eVertex_z_vs_Occupancy] = static_cast(eh.fEventHistogramsBins[eOccupancy][0] / qa.fRebin); - min_y_Event[eVertex_z_vs_Occupancy] = eh.fEventHistogramsBins[eOccupancy][1]; - max_y_Event[eVertex_z_vs_Occupancy] = eh.fEventHistogramsBins[eOccupancy][2]; - title_y_Event[eVertex_z_vs_Occupancy] = FancyFormatting(eh.fEventHistogramsName[eOccupancy].Data()); - - // *) "Vertex_z_vs_InteractionRate": - nBins_x_Event[eVertex_z_vs_InteractionRate] = static_cast(eh.fEventHistogramsBins[eVertex_z][0]); - min_x_Event[eVertex_z_vs_InteractionRate] = eh.fEventHistogramsBins[eVertex_z][1]; - max_x_Event[eVertex_z_vs_InteractionRate] = eh.fEventHistogramsBins[eVertex_z][2]; - title_x_Event[eVertex_z_vs_InteractionRate] = FancyFormatting(eh.fEventHistogramsName[eVertex_z].Data()); - nBins_y_Event[eVertex_z_vs_InteractionRate] = static_cast(eh.fEventHistogramsBins[eInteractionRate][0] / qa.fRebin); - min_y_Event[eVertex_z_vs_InteractionRate] = eh.fEventHistogramsBins[eInteractionRate][1]; - max_y_Event[eVertex_z_vs_InteractionRate] = eh.fEventHistogramsBins[eInteractionRate][2]; - title_y_Event[eVertex_z_vs_InteractionRate] = FancyFormatting(eh.fEventHistogramsName[eInteractionRate].Data()); + // *) "VertexZ_vs_Occupancy": + nBins_x_Event[eVertexZ_vs_Occupancy] = static_cast(eh.fEventHistogramsBins[eVertexZ][0]); + min_x_Event[eVertexZ_vs_Occupancy] = eh.fEventHistogramsBins[eVertexZ][1]; + max_x_Event[eVertexZ_vs_Occupancy] = eh.fEventHistogramsBins[eVertexZ][2]; + title_x_Event[eVertexZ_vs_Occupancy] = FancyFormatting(eh.fEventHistogramsName[eVertexZ].Data()); + nBins_y_Event[eVertexZ_vs_Occupancy] = static_cast(eh.fEventHistogramsBins[eOccupancy][0] / qa.fRebin); + min_y_Event[eVertexZ_vs_Occupancy] = eh.fEventHistogramsBins[eOccupancy][1]; + max_y_Event[eVertexZ_vs_Occupancy] = eh.fEventHistogramsBins[eOccupancy][2]; + title_y_Event[eVertexZ_vs_Occupancy] = FancyFormatting(eh.fEventHistogramsName[eOccupancy].Data()); + + // *) "VertexZ_vs_InteractionRate": + nBins_x_Event[eVertexZ_vs_InteractionRate] = static_cast(eh.fEventHistogramsBins[eVertexZ][0]); + min_x_Event[eVertexZ_vs_InteractionRate] = eh.fEventHistogramsBins[eVertexZ][1]; + max_x_Event[eVertexZ_vs_InteractionRate] = eh.fEventHistogramsBins[eVertexZ][2]; + title_x_Event[eVertexZ_vs_InteractionRate] = FancyFormatting(eh.fEventHistogramsName[eVertexZ].Data()); + nBins_y_Event[eVertexZ_vs_InteractionRate] = static_cast(eh.fEventHistogramsBins[eInteractionRate][0] / qa.fRebin); + min_y_Event[eVertexZ_vs_InteractionRate] = eh.fEventHistogramsBins[eInteractionRate][1]; + max_y_Event[eVertexZ_vs_InteractionRate] = eh.fEventHistogramsBins[eInteractionRate][2]; + title_y_Event[eVertexZ_vs_InteractionRate] = FancyFormatting(eh.fEventHistogramsName[eInteractionRate].Data()); // *) "Multiplicity_vs_FT0CAmplitudeOnFoundBC": // nBins_x_Event[eMultiplicity_vs_FT0CAmplitudeOnFoundBC] = static_cast(eh.fEventHistogramsBins[eMultiplicity][0]); @@ -4319,20 +4319,20 @@ void BookEventCutsHistograms() // d) Book the formulas for all event cuts defined via mathematical expressions: - // **) eRefMult_vs_NContr_Up: - if (ec.fUseEventCuts[eRefMult_vs_NContr_Up]) { - ec.fEventCutsFormulas[eRefMult_vs_NContr_Up_Formula] = new TFormula("RefMult_vs_NContr_Up_Formula", ec.fsEventCuts[eRefMult_vs_NContr_Up].Data()); + // **) eRefMultVsNContrUp: + if (ec.fUseEventCuts[eRefMultVsNContrUp]) { + ec.fEventCutsFormulas[eRefMultVsNContrUp_Formula] = new TFormula("RefMultVsNContrUp_Formula", ec.fsEventCuts[eRefMultVsNContrUp].Data()); // As a quick insanity check, try immediately to evaluate something from this formula: - if (std::isnan(ec.fEventCutsFormulas[eRefMult_vs_NContr_Up_Formula]->Eval(1.44))) { + if (std::isnan(ec.fEventCutsFormulas[eRefMultVsNContrUp_Formula]->Eval(1.44))) { LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); } } - // **) eRefMult_vs_NContr_Low: - if (ec.fUseEventCuts[eRefMult_vs_NContr_Low]) { - ec.fEventCutsFormulas[eRefMult_vs_NContr_Low_Formula] = new TFormula("RefMult_vs_NContr_Low_Formula", ec.fsEventCuts[eRefMult_vs_NContr_Low].Data()); + // **) eRefMultVsNContrLow: + if (ec.fUseEventCuts[eRefMultVsNContrLow]) { + ec.fEventCutsFormulas[eRefMultVsNContrLow_Formula] = new TFormula("RefMultVsNContrLow_Formula", ec.fsEventCuts[eRefMultVsNContrLow].Data()); // As a quick insanity check, try immediately to evaluate something from this formula: - if (std::isnan(ec.fEventCutsFormulas[eRefMult_vs_NContr_Low_Formula]->Eval(1.44))) { + if (std::isnan(ec.fEventCutsFormulas[eRefMultVsNContrLow_Formula]->Eval(1.44))) { LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); } } @@ -4549,16 +4549,16 @@ void BookParticleHistograms() // delete lAxis; // I do not need to delete here, only when new TAxis(...) ph.fParticleSparseHistogramsAxisTitle[eDWPhi][wPhiCentralityAxis] = "Centrality"; // TBI 20250222 I cannot call here FancyFormatting for "Centrality", because ec.fsEventCuts[eCentralityEstimator] is still not fetched and set from configurable. Re-think how to proceed for this specific case. - // ***) vertex_z-axis for diff phi weights: I re-use binning from results histograms - ph.fParticleSparseHistogramsNBins[eDWPhi][wPhiVertex_zAxis] = res.fResultsPro[AFO_VZ]->GetNbinsX(); + // ***) VertexZ-axis for diff phi weights: I re-use binning from results histograms + ph.fParticleSparseHistogramsNBins[eDWPhi][wPhiVertexZAxis] = res.fResultsPro[AFO_VZ]->GetNbinsX(); lAxis = res.fResultsPro[AFO_VZ]->GetXaxis(); - ph.fParticleSparseHistogramsBinEdges[eDWPhi][wPhiVertex_zAxis] = new TArrayD(1 + ph.fParticleSparseHistogramsNBins[eDWPhi][wPhiVertex_zAxis]); + ph.fParticleSparseHistogramsBinEdges[eDWPhi][wPhiVertexZAxis] = new TArrayD(1 + ph.fParticleSparseHistogramsNBins[eDWPhi][wPhiVertexZAxis]); for (int bin = 1; bin <= lAxis->GetNbins(); bin++) { - ph.fParticleSparseHistogramsBinEdges[eDWPhi][wPhiVertex_zAxis]->AddAt(lAxis->GetBinLowEdge(bin), bin - 1); + ph.fParticleSparseHistogramsBinEdges[eDWPhi][wPhiVertexZAxis]->AddAt(lAxis->GetBinLowEdge(bin), bin - 1); } - ph.fParticleSparseHistogramsBinEdges[eDWPhi][wPhiVertex_zAxis]->AddAt(lAxis->GetBinLowEdge(1 + lAxis->GetNbins()), lAxis->GetNbins()); // special treatment for last bin + ph.fParticleSparseHistogramsBinEdges[eDWPhi][wPhiVertexZAxis]->AddAt(lAxis->GetBinLowEdge(1 + lAxis->GetNbins()), lAxis->GetNbins()); // special treatment for last bin // delete lAxis; // I do not need to delete here, only when new TAxis(...) - ph.fParticleSparseHistogramsAxisTitle[eDWPhi][wPhiVertex_zAxis] = "Vertex_z"; // TBI 20250222 I cannot call here FancyFormatting for "Centrality", because ec.fsEventCuts[eCentralityEstimator] + ph.fParticleSparseHistogramsAxisTitle[eDWPhi][wPhiVertexZAxis] = "VertexZ"; // TBI 20250222 I cannot call here FancyFormatting for "Centrality", because ec.fsEventCuts[eCentralityEstimator] // ... @@ -4970,7 +4970,7 @@ void BookWeightsHistograms() pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(8, "(w_{#varphi})_{#eta axis (sparse)}"); pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(9, "(w_{#varphi})_{charge axis (sparse)}"); pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(10, "(w_{#varphi})_{centrality axis (sparse)}"); - pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(11, "(w_{#varphi})_{vertex_z axis (sparse)}"); + pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(11, "(w_{#varphi})_{VertexZ axis (sparse)}"); // **) differential pt weights using sparse: pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(12, "(w_{p_{T}})_{pt axis (sparse)}"); @@ -5009,7 +5009,7 @@ void BookWeightsHistograms() if (pw.fUseDiffPhiWeights[wPhiCentralityAxis]) { pw.fWeightsFlagsPro->Fill(9.5, 1.); } - if (pw.fUseDiffPhiWeights[wPhiVertex_zAxis]) { + if (pw.fUseDiffPhiWeights[wPhiVertexZAxis]) { pw.fWeightsFlagsPro->Fill(10.5, 1.); } @@ -5630,7 +5630,7 @@ void InternalValidation() !eh.fEventHistograms[eOccupancy][eSim][eBefore] ? true : eh.fEventHistograms[eOccupancy][eSim][eBefore]->Fill(ebye.fOccupancy); !eh.fEventHistograms[eInteractionRate][eSim][eBefore] ? true : eh.fEventHistograms[eInteractionRate][eSim][eBefore]->Fill(ebye.fInteractionRate); !eh.fEventHistograms[eCurrentRunDuration][eSim][eBefore] ? true : eh.fEventHistograms[eCurrentRunDuration][eSim][eBefore]->Fill(ebye.fCurrentRunDuration); - !eh.fEventHistograms[eVertex_z][eSim][eBefore] ? true : eh.fEventHistograms[eVertex_z][eSim][eBefore]->Fill(ebye.fVz); + !eh.fEventHistograms[eVertexZ][eSim][eBefore] ? true : eh.fEventHistograms[eVertexZ][eSim][eBefore]->Fill(ebye.fVz); !eh.fEventHistograms[eEventPlaneAngle][eSim][eBefore] ? true : eh.fEventHistograms[eEventPlaneAngle][eSim][eBefore]->Fill(fReactionPlane); } @@ -5776,7 +5776,7 @@ void InternalValidation() !eh.fEventHistograms[eOccupancy][eSim][eAfter] ? true : eh.fEventHistograms[eOccupancy][eSim][eAfter]->Fill(ebye.fOccupancy); !eh.fEventHistograms[eInteractionRate][eSim][eAfter] ? true : eh.fEventHistograms[eCentrality][eSim][eAfter]->Fill(ebye.fInteractionRate); !eh.fEventHistograms[eCurrentRunDuration][eSim][eAfter] ? true : eh.fEventHistograms[eCurrentRunDuration][eSim][eAfter]->Fill(ebye.fCurrentRunDuration); - !eh.fEventHistograms[eVertex_z][eSim][eAfter] ? true : eh.fEventHistograms[eVertex_z][eSim][eAfter]->Fill(ebye.fVz); + !eh.fEventHistograms[eVertexZ][eSim][eAfter] ? true : eh.fEventHistograms[eVertexZ][eSim][eAfter]->Fill(ebye.fVz); !eh.fEventHistograms[eEventPlaneAngle][eSim][eAfter] ? true : eh.fEventHistograms[eEventPlaneAngle][eSim][eAfter]->Fill(fReactionPlane); } @@ -6943,34 +6943,34 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) } } - // *) Vertex_x: - if (ec.fUseEventCuts[eVertex_x]) { + // *) VertexX: + if (ec.fUseEventCuts[eVertexX]) { if (cutModus == eCutCounterBinning) { - EventCut(eRec, eVertex_x, eCutCounterBinning); - } else if (collision.posX() < ec.fdEventCuts[eVertex_x][eMin] || collision.posX() > ec.fdEventCuts[eVertex_x][eMax] || TMath::Abs(collision.posX() - ec.fdEventCuts[eVertex_x][eMax]) < tc.fFloatingPointPrecision) { - if (!EventCut(eRec, eVertex_x, cutModus)) { + EventCut(eRec, eVertexX, eCutCounterBinning); + } else if (collision.posX() < ec.fdEventCuts[eVertexX][eMin] || collision.posX() > ec.fdEventCuts[eVertexX][eMax] || TMath::Abs(collision.posX() - ec.fdEventCuts[eVertexX][eMax]) < tc.fFloatingPointPrecision) { + if (!EventCut(eRec, eVertexX, cutModus)) { return false; } } } - // *) Vertex_y: - if (ec.fUseEventCuts[eVertex_y]) { + // *) VertexY: + if (ec.fUseEventCuts[eVertexY]) { if (cutModus == eCutCounterBinning) { - EventCut(eRec, eVertex_y, eCutCounterBinning); - } else if (collision.posY() < ec.fdEventCuts[eVertex_y][eMin] || collision.posY() > ec.fdEventCuts[eVertex_y][eMax] || TMath::Abs(collision.posY() - ec.fdEventCuts[eVertex_y][eMax]) < tc.fFloatingPointPrecision) { - if (!EventCut(eRec, eVertex_y, cutModus)) { + EventCut(eRec, eVertexY, eCutCounterBinning); + } else if (collision.posY() < ec.fdEventCuts[eVertexY][eMin] || collision.posY() > ec.fdEventCuts[eVertexY][eMax] || TMath::Abs(collision.posY() - ec.fdEventCuts[eVertexY][eMax]) < tc.fFloatingPointPrecision) { + if (!EventCut(eRec, eVertexY, cutModus)) { return false; } } } - // *) Vertex_z: - if (ec.fUseEventCuts[eVertex_z]) { + // *) VertexZ: + if (ec.fUseEventCuts[eVertexZ]) { if (cutModus == eCutCounterBinning) { - EventCut(eRec, eVertex_z, eCutCounterBinning); - } else if (collision.posZ() < ec.fdEventCuts[eVertex_z][eMin] || collision.posZ() > ec.fdEventCuts[eVertex_z][eMax] || TMath::Abs(collision.posZ() - ec.fdEventCuts[eVertex_z][eMax]) < tc.fFloatingPointPrecision) { - if (!EventCut(eRec, eVertex_z, cutModus)) { + EventCut(eRec, eVertexZ, eCutCounterBinning); + } else if (collision.posZ() < ec.fdEventCuts[eVertexZ][eMin] || collision.posZ() > ec.fdEventCuts[eVertexZ][eMax] || TMath::Abs(collision.posZ() - ec.fdEventCuts[eVertexZ][eMax]) < tc.fFloatingPointPrecision) { + if (!EventCut(eRec, eVertexZ, cutModus)) { return false; } } @@ -6998,23 +6998,23 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) } } - // *) RefMult_vs_NContr_Up: - if (ec.fUseEventCuts[eRefMult_vs_NContr_Up]) { + // *) RefMultVsNContrUp: + if (ec.fUseEventCuts[eRefMultVsNContrUp]) { if (cutModus == eCutCounterBinning) { - EventCut(eRec, eRefMult_vs_NContr_Up, eCutCounterBinning); - } else if (collision.numContrib() > ec.fEventCutsFormulas[eRefMult_vs_NContr_Up_Formula]->Eval(ebye.fReferenceMultiplicity)) { - if (!EventCut(eRec, eRefMult_vs_NContr_Up, cutModus)) { + EventCut(eRec, eRefMultVsNContrUp, eCutCounterBinning); + } else if (collision.numContrib() > ec.fEventCutsFormulas[eRefMultVsNContrUp_Formula]->Eval(ebye.fReferenceMultiplicity)) { + if (!EventCut(eRec, eRefMultVsNContrUp, cutModus)) { return false; } } } - // *) RefMult_vs_NContr_Low: - if (ec.fUseEventCuts[eRefMult_vs_NContr_Low]) { + // *) RefMultVsNContrLow: + if (ec.fUseEventCuts[eRefMultVsNContrLow]) { if (cutModus == eCutCounterBinning) { - EventCut(eRec, eRefMult_vs_NContr_Low, eCutCounterBinning); - } else if (collision.numContrib() < ec.fEventCutsFormulas[eRefMult_vs_NContr_Low_Formula]->Eval(ebye.fReferenceMultiplicity)) { - if (!EventCut(eRec, eRefMult_vs_NContr_Low, cutModus)) { + EventCut(eRec, eRefMultVsNContrLow, eCutCounterBinning); + } else if (collision.numContrib() < ec.fEventCutsFormulas[eRefMultVsNContrLow_Formula]->Eval(ebye.fReferenceMultiplicity)) { + if (!EventCut(eRec, eRefMultVsNContrLow, cutModus)) { return false; } } @@ -7090,34 +7090,34 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) // *) Centrality: this is related to eImpactParameter. TBI 20240509 How do I proceed here? Shall i calculate it in void DetermineCentrality( ... ), from IP, and store it in ebye.fCentrality? - // *) Vertex_x: - if (ec.fUseEventCuts[eVertex_x]) { + // *) VertexX: + if (ec.fUseEventCuts[eVertexX]) { if (cutModus == eCutCounterBinning) { - EventCut(eSim, eVertex_x, eCutCounterBinning); - } else if (collision.posX() < ec.fdEventCuts[eVertex_x][eMin] || collision.posX() > ec.fdEventCuts[eVertex_x][eMax] || TMath::Abs(collision.posX() - ec.fdEventCuts[eVertex_x][eMax]) < tc.fFloatingPointPrecision) { - if (!EventCut(eSim, eVertex_x, cutModus)) { + EventCut(eSim, eVertexX, eCutCounterBinning); + } else if (collision.posX() < ec.fdEventCuts[eVertexX][eMin] || collision.posX() > ec.fdEventCuts[eVertexX][eMax] || TMath::Abs(collision.posX() - ec.fdEventCuts[eVertexX][eMax]) < tc.fFloatingPointPrecision) { + if (!EventCut(eSim, eVertexX, cutModus)) { return false; } } } - // *) Vertex_y: - if (ec.fUseEventCuts[eVertex_y]) { + // *) VertexY: + if (ec.fUseEventCuts[eVertexY]) { if (cutModus == eCutCounterBinning) { - EventCut(eSim, eVertex_y, eCutCounterBinning); - } else if (collision.posY() < ec.fdEventCuts[eVertex_y][eMin] || collision.posY() > ec.fdEventCuts[eVertex_y][eMax] || TMath::Abs(collision.posY() - ec.fdEventCuts[eVertex_y][eMax]) < tc.fFloatingPointPrecision) { - if (!EventCut(eSim, eVertex_y, cutModus)) { + EventCut(eSim, eVertexY, eCutCounterBinning); + } else if (collision.posY() < ec.fdEventCuts[eVertexY][eMin] || collision.posY() > ec.fdEventCuts[eVertexY][eMax] || TMath::Abs(collision.posY() - ec.fdEventCuts[eVertexY][eMax]) < tc.fFloatingPointPrecision) { + if (!EventCut(eSim, eVertexY, cutModus)) { return false; } } } - // *) Vertex_z: - if (ec.fUseEventCuts[eVertex_z]) { + // *) VertexZ: + if (ec.fUseEventCuts[eVertexZ]) { if (cutModus == eCutCounterBinning) { - EventCut(eSim, eVertex_z, eCutCounterBinning); - } else if (collision.posZ() < ec.fdEventCuts[eVertex_z][eMin] || collision.posZ() > ec.fdEventCuts[eVertex_z][eMax] || TMath::Abs(collision.posZ() - ec.fdEventCuts[eVertex_z][eMax]) < tc.fFloatingPointPrecision) { - if (!EventCut(eSim, eVertex_z, cutModus)) { + EventCut(eSim, eVertexZ, eCutCounterBinning); + } else if (collision.posZ() < ec.fdEventCuts[eVertexZ][eMin] || collision.posZ() > ec.fdEventCuts[eVertexZ][eMax] || TMath::Abs(collision.posZ() - ec.fdEventCuts[eVertexZ][eMax]) < tc.fFloatingPointPrecision) { + if (!EventCut(eSim, eVertexZ, cutModus)) { return false; } } @@ -7495,12 +7495,12 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) } } - // *) Vertex_z: - if (ec.fUseEventCuts[eVertex_z]) { + // *) VertexZ: + if (ec.fUseEventCuts[eVertexZ]) { if (cutModus == eCutCounterBinning) { - EventCut(eRec, eVertex_z, eCutCounterBinning); - } else if (collision.posZ() < ec.fdEventCuts[eVertex_z][eMin] || collision.posZ() > ec.fdEventCuts[eVertex_z][eMax] || TMath::Abs(collision.posZ() - ec.fdEventCuts[eVertex_z][eMax]) < tc.fFloatingPointPrecision) { - if (!EventCut(eRec, eVertex_z, cutModus)) { + EventCut(eRec, eVertexZ, eCutCounterBinning); + } else if (collision.posZ() < ec.fdEventCuts[eVertexZ][eMin] || collision.posZ() > ec.fdEventCuts[eVertexZ][eMax] || TMath::Abs(collision.posZ() - ec.fdEventCuts[eVertexZ][eMax]) < tc.fFloatingPointPrecision) { + if (!EventCut(eRec, eVertexZ, cutModus)) { return false; } } @@ -7689,9 +7689,9 @@ void FillEventHistograms(T1 const& collision, T2 const& tracks, eBeforeAfter ba) if constexpr (rs == eRec || rs == eRecAndSim || rs == eRec_Run2 || rs == eRecAndSim_Run2 || rs == eRec_Run1 || rs == eRecAndSim_Run1 || rs == eQA) { if (eh.fFillEventHistograms) { !eh.fEventHistograms[eNumberOfEvents][eRec][ba] ? true : eh.fEventHistograms[eNumberOfEvents][eRec][ba]->Fill(0.5); // basically, if histogram is not booked, do nothing. 'true' is a placeholder, for the time being - !eh.fEventHistograms[eVertex_x][eRec][ba] ? true : eh.fEventHistograms[eVertex_x][eRec][ba]->Fill(collision.posX()); - !eh.fEventHistograms[eVertex_y][eRec][ba] ? true : eh.fEventHistograms[eVertex_y][eRec][ba]->Fill(collision.posY()); - !eh.fEventHistograms[eVertex_z][eRec][ba] ? true : eh.fEventHistograms[eVertex_z][eRec][ba]->Fill(collision.posZ()); + !eh.fEventHistograms[eVertexX][eRec][ba] ? true : eh.fEventHistograms[eVertexX][eRec][ba]->Fill(collision.posX()); + !eh.fEventHistograms[eVertexY][eRec][ba] ? true : eh.fEventHistograms[eVertexY][eRec][ba]->Fill(collision.posY()); + !eh.fEventHistograms[eVertexZ][eRec][ba] ? true : eh.fEventHistograms[eVertexZ][eRec][ba]->Fill(collision.posZ()); !eh.fEventHistograms[eNContributors][eRec][ba] ? true : eh.fEventHistograms[eNContributors][eRec][ba]->Fill(collision.numContrib()); !eh.fEventHistograms[eTotalMultiplicity][eRec][ba] ? true : eh.fEventHistograms[eTotalMultiplicity][eRec][ba]->Fill(tracks.size()); // TBI 20231106 check and validate further !eh.fEventHistograms[eMultiplicity][eRec][ba] ? true : eh.fEventHistograms[eMultiplicity][eRec][ba]->Fill(ebye.fMultiplicity); @@ -7704,13 +7704,13 @@ void FillEventHistograms(T1 const& collision, T2 const& tracks, eBeforeAfter ba) !qa.fQAEventHistograms2D[eMultiplicity_vs_ReferenceMultiplicity][eRec][ba] ? true : qa.fQAEventHistograms2D[eMultiplicity_vs_ReferenceMultiplicity][eRec][ba]->Fill(ebye.fMultiplicity, ebye.fReferenceMultiplicity); !qa.fQAEventHistograms2D[eMultiplicity_vs_NContributors][eRec][ba] ? true : qa.fQAEventHistograms2D[eMultiplicity_vs_NContributors][eRec][ba]->Fill(ebye.fMultiplicity, collision.numContrib()); !qa.fQAEventHistograms2D[eMultiplicity_vs_Centrality][eRec][ba] ? true : qa.fQAEventHistograms2D[eMultiplicity_vs_Centrality][eRec][ba]->Fill(ebye.fMultiplicity, ebye.fCentrality); - !qa.fQAEventHistograms2D[eMultiplicity_vs_Vertex_z][eRec][ba] ? true : qa.fQAEventHistograms2D[eMultiplicity_vs_Vertex_z][eRec][ba]->Fill(ebye.fMultiplicity, collision.posZ()); + !qa.fQAEventHistograms2D[eMultiplicity_vs_VertexZ][eRec][ba] ? true : qa.fQAEventHistograms2D[eMultiplicity_vs_VertexZ][eRec][ba]->Fill(ebye.fMultiplicity, collision.posZ()); !qa.fQAEventHistograms2D[eReferenceMultiplicity_vs_NContributors][eRec][ba] ? true : qa.fQAEventHistograms2D[eReferenceMultiplicity_vs_NContributors][eRec][ba]->Fill(ebye.fReferenceMultiplicity, collision.numContrib()); !qa.fQAEventHistograms2D[eReferenceMultiplicity_vs_Centrality][eRec][ba] ? true : qa.fQAEventHistograms2D[eReferenceMultiplicity_vs_Centrality][eRec][ba]->Fill(ebye.fReferenceMultiplicity, ebye.fCentrality); - !qa.fQAEventHistograms2D[eReferenceMultiplicity_vs_Vertex_z][eRec][ba] ? true : qa.fQAEventHistograms2D[eReferenceMultiplicity_vs_Vertex_z][eRec][ba]->Fill(ebye.fReferenceMultiplicity, collision.posZ()); + !qa.fQAEventHistograms2D[eReferenceMultiplicity_vs_VertexZ][eRec][ba] ? true : qa.fQAEventHistograms2D[eReferenceMultiplicity_vs_VertexZ][eRec][ba]->Fill(ebye.fReferenceMultiplicity, collision.posZ()); !qa.fQAEventHistograms2D[eNContributors_vs_Centrality][eRec][ba] ? true : qa.fQAEventHistograms2D[eNContributors_vs_Centrality][eRec][ba]->Fill(collision.numContrib(), ebye.fCentrality); - !qa.fQAEventHistograms2D[eNContributors_vs_Vertex_z][eRec][ba] ? true : qa.fQAEventHistograms2D[eNContributors_vs_Vertex_z][eRec][ba]->Fill(collision.numContrib(), collision.posZ()); - !qa.fQAEventHistograms2D[eCentrality_vs_Vertex_z][eRec][ba] ? true : qa.fQAEventHistograms2D[eCentrality_vs_Vertex_z][eRec][ba]->Fill(ebye.fCentrality, collision.posZ()); + !qa.fQAEventHistograms2D[eNContributors_vs_VertexZ][eRec][ba] ? true : qa.fQAEventHistograms2D[eNContributors_vs_VertexZ][eRec][ba]->Fill(collision.numContrib(), collision.posZ()); + !qa.fQAEventHistograms2D[eCentrality_vs_VertexZ][eRec][ba] ? true : qa.fQAEventHistograms2D[eCentrality_vs_VertexZ][eRec][ba]->Fill(ebye.fCentrality, collision.posZ()); } if (qa.fFillQACorrelationsVsHistograms2D && qa.fQAParticleEventProEbyE[eRec][ba] && ba == eAfter) { // fill only for eAfter, because I do not calculate Q-vectors before cuts @@ -7775,9 +7775,9 @@ void FillEventHistograms(T1 const& collision, T2 const& tracks, eBeforeAfter ba) } if (eh.fFillEventHistograms) { !eh.fEventHistograms[eNumberOfEvents][eSim][ba] ? true : eh.fEventHistograms[eNumberOfEvents][eSim][ba]->Fill(0.5); - !eh.fEventHistograms[eVertex_x][eSim][ba] ? true : eh.fEventHistograms[eVertex_x][eSim][ba]->Fill(collision.mcCollision().posX()); - !eh.fEventHistograms[eVertex_y][eSim][ba] ? true : eh.fEventHistograms[eVertex_y][eSim][ba]->Fill(collision.mcCollision().posY()); - !eh.fEventHistograms[eVertex_z][eSim][ba] ? true : eh.fEventHistograms[eVertex_z][eSim][ba]->Fill(collision.mcCollision().posZ()); + !eh.fEventHistograms[eVertexX][eSim][ba] ? true : eh.fEventHistograms[eVertexX][eSim][ba]->Fill(collision.mcCollision().posX()); + !eh.fEventHistograms[eVertexY][eSim][ba] ? true : eh.fEventHistograms[eVertexY][eSim][ba]->Fill(collision.mcCollision().posY()); + !eh.fEventHistograms[eVertexZ][eSim][ba] ? true : eh.fEventHistograms[eVertexZ][eSim][ba]->Fill(collision.mcCollision().posZ()); !eh.fEventHistograms[eImpactParameter][eSim][ba] ? true : eh.fEventHistograms[eImpactParameter][eSim][ba]->Fill(collision.mcCollision().impactParameter()); !eh.fEventHistograms[eEventPlaneAngle][eSim][ba] ? true : eh.fEventHistograms[eEventPlaneAngle][eSim][ba]->Fill(collision.mcCollision().eventPlaneAngle()); // eh.fEventHistograms[eTotalMultiplicity][eSim][ba]->Fill(tracks.size()); // TBI 20231106 check how to get corresponding MC truth info, and validate further @@ -7835,14 +7835,14 @@ void FillEventHistograms(T1 const& collision, T2 const& tracks, eBeforeAfter ba) !qa.fQAEventHistograms2D[eReferenceMultiplicity_vs_Occupancy][eRec][ba] ? true : qa.fQAEventHistograms2D[eReferenceMultiplicity_vs_Occupancy][eRec][ba]->Fill(ebye.fReferenceMultiplicity, ebye.fOccupancy); !qa.fQAEventHistograms2D[eNContributors_vs_Occupancy][eRec][ba] ? true : qa.fQAEventHistograms2D[eNContributors_vs_Occupancy][eRec][ba]->Fill(collision.numContrib(), ebye.fOccupancy); !qa.fQAEventHistograms2D[eCentrality_vs_Occupancy][eRec][ba] ? true : qa.fQAEventHistograms2D[eCentrality_vs_Occupancy][eRec][ba]->Fill(ebye.fCentrality, ebye.fOccupancy); - !qa.fQAEventHistograms2D[eVertex_z_vs_Occupancy][eRec][ba] ? true : qa.fQAEventHistograms2D[eVertex_z_vs_Occupancy][eRec][ba]->Fill(collision.posZ(), ebye.fOccupancy); + !qa.fQAEventHistograms2D[eVertexZ_vs_Occupancy][eRec][ba] ? true : qa.fQAEventHistograms2D[eVertexZ_vs_Occupancy][eRec][ba]->Fill(collision.posZ(), ebye.fOccupancy); // **) vs interaction rate: !qa.fQAEventHistograms2D[eMultiplicity_vs_InteractionRate][eRec][ba] ? true : qa.fQAEventHistograms2D[eMultiplicity_vs_InteractionRate][eRec][ba]->Fill(ebye.fMultiplicity, ebye.fInteractionRate); !qa.fQAEventHistograms2D[eReferenceMultiplicity_vs_InteractionRate][eRec][ba] ? true : qa.fQAEventHistograms2D[eReferenceMultiplicity_vs_InteractionRate][eRec][ba]->Fill(ebye.fReferenceMultiplicity, ebye.fInteractionRate); !qa.fQAEventHistograms2D[eNContributors_vs_InteractionRate][eRec][ba] ? true : qa.fQAEventHistograms2D[eNContributors_vs_InteractionRate][eRec][ba]->Fill(collision.numContrib(), ebye.fInteractionRate); !qa.fQAEventHistograms2D[eCentrality_vs_InteractionRate][eRec][ba] ? true : qa.fQAEventHistograms2D[eCentrality_vs_InteractionRate][eRec][ba]->Fill(ebye.fCentrality, ebye.fInteractionRate); - !qa.fQAEventHistograms2D[eVertex_z_vs_InteractionRate][eRec][ba] ? true : qa.fQAEventHistograms2D[eVertex_z_vs_InteractionRate][eRec][ba]->Fill(collision.posZ(), ebye.fInteractionRate); + !qa.fQAEventHistograms2D[eVertexZ_vs_InteractionRate][eRec][ba] ? true : qa.fQAEventHistograms2D[eVertexZ_vs_InteractionRate][eRec][ba]->Fill(collision.posZ(), ebye.fInteractionRate); // **) unsorted TBI 20250331 sort at some point !qa.fQAEventHistograms2D[eMultiplicity_vs_FT0CAmplitudeOnFoundBC][eRec][ba] ? true : qa.fQAEventHistograms2D[eMultiplicity_vs_FT0CAmplitudeOnFoundBC][eRec][ba]->Fill(ebye.fMultiplicity, ebye.fFT0CAmplitudeOnFoundBC); @@ -7984,7 +7984,7 @@ void FillEventHistograms(T1 const& collision, T2 const& tracks, eBeforeAfter ba) // A few example histograms, just to check if I access corresponding tables: if (eh.fFillEventHistograms) { !eh.fEventHistograms[eNumberOfEvents][eRec][ba] ? true : eh.fEventHistograms[eNumberOfEvents][eRec][ba]->Fill(0.5); - !eh.fEventHistograms[eVertex_z][eRec][ba] ? true : eh.fEventHistograms[eVertex_z][eRec][ba]->Fill(collision.posZ()); + !eh.fEventHistograms[eVertexZ][eRec][ba] ? true : eh.fEventHistograms[eVertexZ][eRec][ba]->Fill(collision.posZ()); !eh.fEventHistograms[eTotalMultiplicity][eRec][ba] ? true : eh.fEventHistograms[eTotalMultiplicity][eRec][ba]->Fill(tracks.size()); !eh.fEventHistograms[eCentrality][eRec][ba] ? true : eh.fEventHistograms[eCentrality][eRec][ba]->Fill(ebye.fCentrality); } @@ -8310,7 +8310,7 @@ float GetCentralityPercentile(TString ce) // ... ctd here with Run 1 and Run 2 estimators ... } else { - LOGF(fatal, "\033[1;31m%s at line %d : centrality estimator = %d is not supported yet. \033[0m", __FUNCTION__, __LINE__, ce.Data()); + LOGF(fatal, "\033[1;31m%s at line %d : centrality estimator = %s is not supported yet. \033[0m", __FUNCTION__, __LINE__, ce.Data()); } if (tc.fVerbose) { @@ -8349,7 +8349,7 @@ bool CentralityCorrelationCut() // Okay, do the thing: // *) "Relative" <=> |(firstEstimator-secondEstimator)/(firstEstimator+secondEstimator)| > treshold => reject the event => alright = false - // *) "Absolute" <=> |(firstEstimator-secondEstimator)| > treshold => reject the event => alright = false + // *) "Absolute" <=> |firstEstimator-secondEstimator| > treshold => reject the event => alright = false // *) ... if (ec.fCentralityValues[0] > 0. && ec.fCentralityValues[1] > 0.) { if (ec.fCentralityCorrelationsCutVersion.EqualTo("Relative")) { @@ -12734,7 +12734,7 @@ double WeightFromSparse(const double& dPhi, const double& dPt, const double& dEt if (pw.fUseDiffPhiWeights[wPhiCentralityAxis]) { pw.fFindBinVector[dwc]->AddAt(ebye.fCentrality, dim++); } - if (pw.fUseDiffPhiWeights[wPhiVertex_zAxis]) { + if (pw.fUseDiffPhiWeights[wPhiVertexZAxis]) { pw.fFindBinVector[dwc]->AddAt(ebye.fVz, dim++); } // ... @@ -13007,8 +13007,8 @@ void GetParticleWeights() if (pw.fUseDiffPhiWeights[wPhiCentralityAxis]) { whichDimensions += "_centrality"; } - if (pw.fUseDiffPhiWeights[wPhiVertex_zAxis]) { - whichDimensions += "_vertex_z"; + if (pw.fUseDiffPhiWeights[wPhiVertexZAxis]) { + whichDimensions += "_vertexZ"; } // ... @@ -13315,11 +13315,11 @@ const char* FancyFormatting(const char* name) fancyFormatting = "p_{T}"; } else if (TString(name).EqualTo("Eta", TString::kIgnoreCase)) { fancyFormatting = "#eta"; - } else if (TString(name).EqualTo("Vertex_x")) { + } else if (TString(name).EqualTo("VertexX")) { fancyFormatting = "V_{x}"; - } else if (TString(name).EqualTo("Vertex_y")) { + } else if (TString(name).EqualTo("VertexY")) { fancyFormatting = "V_{y}"; - } else if (TString(name).EqualTo("Vertex_z")) { + } else if (TString(name).EqualTo("VertexZ")) { fancyFormatting = "V_{z}"; } else if (TString(name).EqualTo("TotalMultiplicity")) { fancyFormatting = "TotalMultiplicity (tracks.size())"; @@ -14132,13 +14132,6 @@ void DetermineInteractionRateAndCurrentRunDuration(T1 const& collision, T2 const LOGF(fatal, "\033[1;31m%s at line %d : ebye.fCurrentRunDuration = %d is bigger than tc.fRunTime[eDurationInSec] = %d, which is meaningless \033[0m", __FUNCTION__, __LINE__, static_cast(ebye.fCurrentRunDuration), static_cast(tc.fRunTime[eDurationInSec])); } - /* - // a3) Determine FT0CAmplitudeOnFoundBC: TBI 20250331 to reduce code bloat, I have it quickly here. Shall I rename the function? - if (bc.has_foundFT0()) { - ebye.fFT0CAmplitudeOnFoundBC = bc.foundFT0().sumAmpC(); // Credits: rofOccupancyQa.cxx - } - */ - } else { // b) For all other cases, set interaction rate to -1: ebye.fInteractionRate = -1.; @@ -14211,7 +14204,7 @@ void DetermineQAThingies(T1 const& collision, T2 const&) } // if (tc.fVerbose) { } else { - // For all other cases, set interaction rate to -1: TBI 20250401 shall I really do it this way, in a sense that for all other cases, this function should never be called? + // For all other cases, set all QA-specific variables calculated here to -1. TBI 20250401 shall I really do it this way, in a sense that for all other cases, this function should never be called? ebye.fFT0CAmplitudeOnFoundBC = -1.; } @@ -14683,7 +14676,7 @@ void FillQvectorFromSparse(const double& dPhi, const double& dPt, const double& if (pw.fUseDiffPhiWeights[wPhiCentralityAxis]) { LOGF(fatal, "ebye.Centrality = %f", ebye.fCentrality); } - if (pw.fUseDiffPhiWeights[wPhiVertex_zAxis]) { + if (pw.fUseDiffPhiWeights[wPhiVertexZAxis]) { LOGF(fatal, "ebye.Vz = %f", ebye.fVz); } LOGF(fatal, "Multidimensional weight for enabled dimensions is wPhi = %f", wPhi); @@ -15029,7 +15022,7 @@ void MainLoopOverParticles(T const& tracks) // *) There is also processTest(...), to process data with minimum subscription to the tables. To use it, set field "processTest": "true" in json config // Remark #4: - // *) There is also processQA(...), to process data with maximum subscription to the tables (use for Run 3 only). To use it, set field "processTest": "true" in json config + // *) There is also processQA(...), to process data with maximum subscription to the tables (use for Run 3 only). To use it, set field "processQA: "true" in json config if (tc.fVerbose) { StartFunction(__FUNCTION__); diff --git a/PWGCF/MultiparticleCorrelations/Tasks/multiparticle-correlations-ab.cxx b/PWGCF/MultiparticleCorrelations/Tasks/multiparticle-correlations-ab.cxx index 37e6cf86635..f88933d8450 100644 --- a/PWGCF/MultiparticleCorrelations/Tasks/multiparticle-correlations-ab.cxx +++ b/PWGCF/MultiparticleCorrelations/Tasks/multiparticle-correlations-ab.cxx @@ -200,14 +200,14 @@ struct MultiparticleCorrelationsAB // this name is used in lower-case format to // ------------------------------------------- // A) Process only reconstructed data: - void processRec(CollisionRec const& collision, BCs_Run3 const& bcs, TracksRec const& tracks, aod::FT0s const&) + void processRec(CollisionRec const& collision, BCs_Run3 const& bcs, TracksRec const& tracks) { // Remark: Do not use here LOGF(fatal, ...) or LOGF(info, ...), because their stdout/stderr is suppressed. Use them in regular member functions instead. // *) Steer all analysis steps: Steer(collision, bcs, tracks); } - PROCESS_SWITCH(MultiparticleCorrelationsAB, processRec, "process only reconstructed data", false); // yes, keep always one process switch "true", so that I have default running version + PROCESS_SWITCH(MultiparticleCorrelationsAB, processRec, "process only reconstructed data", true); // yes, keep always one process switch "true", so that I have default running version // ------------------------------------------- @@ -295,7 +295,7 @@ struct MultiparticleCorrelationsAB // this name is used in lower-case format to // ------------------------------------------- // K) Process data with more than necessary subscriptions to the tables, only for QA purposes: - // Remark 1: This is basically the main "processRec" switch, merely enhanced with subscription to few more tables, only for QA purposes. + // Remark 1: This is basically the main "processRec" switch, merely enhanced with subscription to few more tables (e.g. detector specific), only for QA purposes. // Remark 2: Ideally, i use the same workflow for "processRec" and "processQA", but most likely at some point I will have to establish separate workflow for "processQA" void processQA(Collision_QA const& collision, BCs_QA const& bcs, TracksRec_QA const& tracks, aod::FT0s const&) { @@ -303,7 +303,7 @@ struct MultiparticleCorrelationsAB // this name is used in lower-case format to // *) FT0s => bc.foundFT0().sumAmpC(), etc. Steer(collision, bcs, tracks); } - PROCESS_SWITCH(MultiparticleCorrelationsAB, processQA, "QA processing", true); + PROCESS_SWITCH(MultiparticleCorrelationsAB, processQA, "QA processing", false); }; // struct MultiparticleCorrelationsAB From 25ccd56c7f29404e51191f8beedfef2f4953d140 Mon Sep 17 00:00:00 2001 From: Mingrui Zhao Date: Wed, 2 Apr 2025 21:06:40 +0800 Subject: [PATCH 0900/1650] [PWGUD] Enable to change gapside in configuration (#10732) --- PWGUD/Tasks/flowCorrelationsUpc.cxx | 2 +- PWGUD/Tasks/flowCumulantsUpc.cxx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGUD/Tasks/flowCorrelationsUpc.cxx b/PWGUD/Tasks/flowCorrelationsUpc.cxx index aeb3ed95b4a..7b00062f453 100644 --- a/PWGUD/Tasks/flowCorrelationsUpc.cxx +++ b/PWGUD/Tasks/flowCorrelationsUpc.cxx @@ -232,7 +232,7 @@ struct FlowCorrelationsUpc { int trueGapSide = sgSelector.trueGap(collision, cfgCutFV0, cfgCutFT0A, cfgCutFT0C, cfgCutZDC); gapSide = trueGapSide; - if (gapSide == 2) { + if (gapSide == cfgGapSideSelection) { return; } diff --git a/PWGUD/Tasks/flowCumulantsUpc.cxx b/PWGUD/Tasks/flowCumulantsUpc.cxx index 723f9910cc9..155a398cd44 100644 --- a/PWGUD/Tasks/flowCumulantsUpc.cxx +++ b/PWGUD/Tasks/flowCumulantsUpc.cxx @@ -733,7 +733,7 @@ struct FlowCumulantsUpc { int trueGapSide = sgSelector.trueGap(collision, cfgCutFV0, cfgCutFT0A, cfgCutFT0C, cfgCutZDC); gapSide = trueGapSide; - if (gapSide == 2) { + if (gapSide == cfgGapSideSelection) { return; } From a886e9a071d729adbe56e29154548ccefe5146a0 Mon Sep 17 00:00:00 2001 From: blacwovie Date: Wed, 2 Apr 2025 22:14:47 +0800 Subject: [PATCH 0901/1650] [PWGLF] enable DCA fitter (#10728) Co-authored-by: blacw Co-authored-by: ALICE Action Bot --- PWGLF/TableProducer/Nuspex/he3HadronFemto.cxx | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/he3HadronFemto.cxx b/PWGLF/TableProducer/Nuspex/he3HadronFemto.cxx index a008bf422cf..f8aa89a0d35 100644 --- a/PWGLF/TableProducer/Nuspex/he3HadronFemto.cxx +++ b/PWGLF/TableProducer/Nuspex/he3HadronFemto.cxx @@ -187,6 +187,7 @@ struct he3hadronfemto { Configurable setting_cutNsigmaTOF{"setting_cutNsigmaTOF", 3.0f, "Value of the TOF Nsigma cut"}; Configurable setting_noMixedEvents{"setting_noMixedEvents", 5, "Number of mixed events per event"}; Configurable setting_enableBkgUS{"setting_enableBkgUS", false, "Enable US background"}; + Configurable setting_enableDCAfitter{"setting_enableDCAfitter", false, "Enable DCA fitter"}; Configurable setting_saveUSandLS{"setting_saveUSandLS", true, "Save All Pairs"}; Configurable setting_isMC{"setting_isMC", false, "Run MC"}; Configurable setting_fillMultiplicity{"setting_fillMultiplicity", false, "Fill multiplicity table"}; @@ -244,7 +245,7 @@ struct he3hadronfemto { {"hTrackSel", "Accepted tracks", {HistType::kTH1F, {{Selections::kAll, -0.5, static_cast(Selections::kAll) - 0.5}}}}, {"hEvents", "; Events;", {HistType::kTH1F, {{3, -0.5, 2.5}}}}, {"hEmptyPool", "svPoolCreator did not find track pairs false/true", {HistType::kTH1F, {{2, -0.5, 1.5}}}}, - {"hDCAxyHe3", ";DCA_{xy} (cm)", {HistType::kTH1F, {{200, -1.0f, 1.0f}}}}, + {"hDCAxyHe3", ";DCA_{xy} (cm)", {HistType::kTH1F, {{200, -5.0f, 5.0f}}}}, {"hDCAzHe3", ";DCA_{z} (cm)", {HistType::kTH1F, {{200, -1.0f, 1.0f}}}}, {"hNClsHe3ITS", ";N_{ITS} Cluster", {HistType::kTH1F, {{20, -10.0f, 10.0f}}}}, {"hNClsHadITS", ";N_{ITS} Cluster", {HistType::kTH1F, {{20, -10.0f, 10.0f}}}}, @@ -536,6 +537,7 @@ struct he3hadronfemto { return false; } he3Hadcand.collisionID = collIdxMin; + } else { he3Hadcand.collisionID = collBracket.getMin(); } @@ -564,11 +566,21 @@ struct he3hadronfemto { he3Hadcand.signHe3 = trackHe3.sign(); he3Hadcand.signHad = trackHad.sign(); - he3Hadcand.DCAxyHe3 = trackHe3.dcaXY(); + gpu::gpustd::array dcaInfo; + if (setting_enableDCAfitter) { + auto trackCovHe3 = getTrackParCov(trackHe3); + auto trackCovHad = getTrackParCov(trackHad); + auto collision = collisions.rawIteratorAt(he3Hadcand.collisionID); + o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackCovHe3, 2.f, m_fitter.getMatCorrType(), &dcaInfo); + he3Hadcand.DCAxyHe3 = dcaInfo[0]; + o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackCovHad, 2.f, m_fitter.getMatCorrType(), &dcaInfo); + he3Hadcand.DCAxyHad = dcaInfo[0]; + } else { + he3Hadcand.DCAxyHe3 = trackHe3.dcaXY(); + he3Hadcand.DCAxyHad = trackHad.dcaXY(); + } he3Hadcand.DCAzHe3 = trackHe3.dcaZ(); - he3Hadcand.DCAxyHad = trackHad.dcaXY(); he3Hadcand.DCAzHad = trackHad.dcaZ(); - he3Hadcand.tpcSignalHe3 = trackHe3.tpcSignal(); bool heliumPID = trackHe3.pidForTracking() == o2::track::PID::Helium3 || trackHe3.pidForTracking() == o2::track::PID::Alpha; float correctedTPCinnerParamHe3 = (heliumPID && setting_compensatePIDinTracking) ? trackHe3.tpcInnerParam() / 2.f : trackHe3.tpcInnerParam(); From 5e8fe2e674168a5fdb68cdaa9ef1f822a6b491ae Mon Sep 17 00:00:00 2001 From: Sandeep Dudi <69388148+sdudi123@users.noreply.github.com> Date: Wed, 2 Apr 2025 21:08:54 +0200 Subject: [PATCH 0902/1650] [PWGUD] The binning of the histogram was adjusted to resolve a memory error (#10734) Co-authored-by: sandeep dudi --- PWGUD/Tasks/sginclusivePhiKstarSD.cxx | 43 +++++++++++++++++---------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/PWGUD/Tasks/sginclusivePhiKstarSD.cxx b/PWGUD/Tasks/sginclusivePhiKstarSD.cxx index d2550858d63..20d4f08d1d6 100644 --- a/PWGUD/Tasks/sginclusivePhiKstarSD.cxx +++ b/PWGUD/Tasks/sginclusivePhiKstarSD.cxx @@ -115,6 +115,9 @@ struct SginclusivePhiKstarSD { { registry.add("GapSide", "Gap Side; Entries", kTH1F, {{4, -1.5, 2.5}}); registry.add("TrueGapSide", "Gap Side; Entries", kTH1F, {{4, -1.5, 2.5}}); + registry.add("nPVContributors_data", "Multiplicity_dist_before track cut gap A", kTH1F, {{110, 0, 110}}); + registry.add("nPVContributors_data_1", "Multiplicity_dist_before track cut gap C", kTH1F, {{110, 0, 110}}); + if (phi) { registry.add("os_KK_pT_0", "pt kaon pair", kTH3F, {{220, 0.98, 1.2}, {80, -2.0, 2.0}, {100, 0, 10}}); registry.add("os_KK_pT_1", "pt kaon pair", kTH3F, {{220, 0.98, 1.2}, {80, -2.0, 2.0}, {100, 0, 10}}); @@ -160,14 +163,14 @@ struct SginclusivePhiKstarSD { } // qa plots if (qa) { - registry.add("tpc_dedx", "p vs dE/dx", kTH2F, {{100, 0.0, 10.0}, {500000, 0.0, 5000.0}}); - registry.add("tof_beta", "p vs beta", kTH2F, {{100, 0.0, 10.0}, {5000, 0.0, 25.0}}); - - registry.add("tpc_dedx_kaon", "p#k dE/dx", kTH2F, {{100, 0.0, 10.0}, {500000, 0.0, 5000.0}}); - registry.add("tpc_dedx_pion", "p#pi dE/dx", kTH2F, {{100, 0.0, 10.0}, {500000, 0.0, 5000.0}}); - registry.add("tpc_dedx_kaon_1", "tpc+tof pid cut p#k dE/dx", kTH2F, {{100, 0.0, 10.0}, {500000, 0.0, 5000.0}}); - registry.add("tpc_dedx_kaon_2", "tpc+tof pid cut1 p#k dE/dx", kTH2F, {{100, 0.0, 10.0}, {500000, 0.0, 5000.0}}); - registry.add("tpc_dedx_pion_1", "tpc+tof pid cut p#pi dE/dx", kTH2F, {{100, 0.0, 10.0}, {500000, 0.0, 1000.0}}); + registry.add("tpc_dedx", "p vs dE/dx", kTH2F, {{100, 0.0, 10.0}, {10000, 0.0, 2500.0}}); + registry.add("tof_beta", "p vs beta", kTH2F, {{100, 0.0, 10.0}, {100, 0.0, 5.0}}); + + registry.add("tpc_dedx_kaon", "p#k dE/dx", kTH2F, {{100, 0.0, 10.0}, {10000, 0.0, 2500.0}}); + registry.add("tpc_dedx_pion", "p#pi dE/dx", kTH2F, {{100, 0.0, 10.0}, {10000, 0.0, 2500.0}}); + registry.add("tpc_dedx_kaon_1", "tpc+tof pid cut p#k dE/dx", kTH2F, {{100, 0.0, 10.0}, {10000, 0.0, 2500.0}}); + registry.add("tpc_dedx_kaon_2", "tpc+tof pid cut1 p#k dE/dx", kTH2F, {{100, 0.0, 10.0}, {10000, 0.0, 2500.0}}); + registry.add("tpc_dedx_pion_1", "tpc+tof pid cut p#pi dE/dx", kTH2F, {{100, 0.0, 10.0}, {10000, 0.0, 25000.0}}); registry.add("tpc_nsigma_kaon", "p#k n#sigma", kTH2F, {{100, 0.0, 10.0}, {100, -10.0, 10.0}}); registry.add("tpc_nsigma_pion", "p#pi n#sigma", kTH2F, {{100, 0.0, 10.0}, {100, -10.0, 10.0}}); registry.add("tpc_tof_nsigma_kaon", "p#k n#sigma TPC vs TOF", kTH2F, {{100, -10.0, 10.0}, {100, -10.0, 10.0}}); @@ -215,7 +218,6 @@ struct SginclusivePhiKstarSD { registry.add("gap_mult0", "Mult 0", kTH1F, {{100, 0.0, 100.0}}); registry.add("gap_mult1", "Mult 1", kTH1F, {{100, 0.0, 100.0}}); registry.add("gap_mult2", "Mult 2", kTH1F, {{100, 0.0, 100.0}}); - registry.add("Reco/tr_hist", "hist_stat", {HistType::kTH1F, {{10, -0.5, 9.5}}}); // Multiplicity plot if (rapidityGap && phi) { @@ -566,9 +568,18 @@ struct SginclusivePhiKstarSD { int trackDG = 0; int trackextra = 0; int trackextraDG = 0; + + Partition pvContributors1 = aod::udtrack::isPVContributor == true; + pvContributors1.bindTable(tracks); + if (gapSide == 0) { + registry.get(HIST("nPVContributors_data"))->Fill(pvContributors1.size(), 1.); + } + if (gapSide == 1) { + registry.get(HIST("nPVContributors_data_1"))->Fill(pvContributors1.size(), 1.); + } for (const auto& track1 : tracks) { - // if (!trackselector(track1, parameters)) - // continue; + if (!trackselector(track1, parameters)) + continue; v0.SetXYZM(track1.px(), track1.py(), track1.pz(), o2::constants::physics::MassPionCharged); if (selectionPIDPion1(track1)) { onlyPionTrackspm.push_back(v0); @@ -1146,7 +1157,7 @@ struct SginclusivePhiKstarSD { for (const auto& [track1, track2] : o2::soa::combinations(posThisColl, negThisColl)) { if (!trackselector(track1, parameters) || !trackselector(track2, parameters)) continue; - if (selectionPIDKaon1(track1) && selectionPIDKaon1(track2)) { + if (phi && selectionPIDKaon1(track1) && selectionPIDKaon1(track2)) { v0.SetXYZM(track1.px(), track1.py(), track1.pz(), o2::constants::physics::MassKaonCharged); v1.SetXYZM(track2.px(), track2.py(), track2.pz(), o2::constants::physics::MassKaonCharged); v01 = v0 + v1; @@ -1169,7 +1180,7 @@ struct SginclusivePhiKstarSD { continue; if (track1.globalIndex() == track2.globalIndex()) continue; - if (selectionPIDKaon1(track1) && selectionPIDPion1(track2)) { + if (kstar && selectionPIDKaon1(track1) && selectionPIDPion1(track2)) { v0.SetXYZM(track1.px(), track1.py(), track1.pz(), o2::constants::physics::MassKaonCharged); v1.SetXYZM(track2.px(), track2.py(), track2.pz(), o2::constants::physics::MassPionCharged); v01 = v0 + v1; @@ -1299,8 +1310,8 @@ struct SginclusivePhiKstarSD { if (flag && flag1) { registry.get(HIST("MC/genMPt"))->Fill(v01.M(), v01.Pt(), 1.); } - // registry.get(HIST("MC/genRap"))->Fill(v01.Rapidity(), 1.); - // registry.get(HIST("MC/genM"))->Fill(v01.M(), 1.); + // registry.get(HIST("MC/genRap"))->Fill(v01.Rapidity(), 1.); + // registry.get(HIST("MC/genM"))->Fill(v01.M(), 1.); registry.get(HIST("MC/accRap"))->Fill(v01.Rapidity(), 1.); registry.get(HIST("MC/accMPt"))->Fill(v01.M(), v01.Pt(), 1.); registry.get(HIST("MC/accM"))->Fill(v01.M(), 1.); @@ -1329,6 +1340,8 @@ struct SginclusivePhiKstarSD { // ............................................................................................................... void processReco(CC const& collision, TCs const& tracks, aod::UDMcCollisions const& /*mccollisions*/, aod::UDMcParticles const& /*McParts*/) { + if (!collision.has_udMcCollision()) + return; auto mccoll = collision.udMcCollision(); if (mccoll.generatorsID() != generatedId) return; From 2992997fec3840eb0272a46c9b1646508b5ba137 Mon Sep 17 00:00:00 2001 From: Ionut Cristian Arsene Date: Thu, 3 Apr 2025 01:07:45 +0200 Subject: [PATCH 0903/1650] [PWGDQ] Added a few electron cuts for the filter pp (#10740) Co-authored-by: Ionut Cristian Arsene --- PWGDQ/Core/CutsLibrary.cxx | 69 ++++++++++++++++++++++++++++++++ PWGDQ/Core/HistogramsLibrary.cxx | 4 +- 2 files changed, 71 insertions(+), 2 deletions(-) diff --git a/PWGDQ/Core/CutsLibrary.cxx b/PWGDQ/Core/CutsLibrary.cxx index da618c7b1a5..e7f4c5cfb03 100644 --- a/PWGDQ/Core/CutsLibrary.cxx +++ b/PWGDQ/Core/CutsLibrary.cxx @@ -52,6 +52,75 @@ AnalysisCompositeCut* o2::aod::dqcuts::GetCompositeCut(const char* cutName) cut->AddCut(GetAnalysisCut("jpsi_TPCPID_debug5_noCorr")); return cut; } + if (!nameStr.compare("Electron2025_1")) { + AnalysisCut* kineCut = new AnalysisCut("kineCut", "kine cut"); + kineCut->AddCut(VarManager::kP, 1.0, 1000.0); + kineCut->AddCut(VarManager::kEta, -0.9, 0.9); + + AnalysisCut* qualityCuts = new AnalysisCut("qualityCuts", "quality cuts"); + qualityCuts->AddCut(VarManager::kIsITSibAny, 0.5, 1.5); + qualityCuts->AddCut(VarManager::kTPCchi2, 0.0, 5.0); + qualityCuts->AddCut(VarManager::kTPCncls, 60, 161.); + qualityCuts->AddCut(VarManager::kTrackDCAz, -0.5, 0.5); + + AnalysisCut* pidCuts = new AnalysisCut("pidCuts", "pid cuts"); + pidCuts->AddCut(VarManager::kTPCnSigmaEl, -4.0, 4.0, false, VarManager::kPin, 0.0, 5.0); + pidCuts->AddCut(VarManager::kTPCnSigmaEl, -1.5, 4.0, false, VarManager::kPin, 5.0, 10.0); + pidCuts->AddCut(VarManager::kTPCnSigmaEl, -1.0, 4.0, false, VarManager::kPin, 10.0, 1000.0); + pidCuts->AddCut(VarManager::kTPCnSigmaPi, 2.0, 999, false, VarManager::kPin, 0.0, 5.0); + pidCuts->AddCut(VarManager::kTPCnSigmaPr, 2.5, 999, false, VarManager::kPin, 0.0, 5.0); + + cut->AddCut(kineCut); + cut->AddCut(qualityCuts); + cut->AddCut(pidCuts); + return cut; + } + + if (!nameStr.compare("Electron2025_2")) { + AnalysisCut* kineCut = new AnalysisCut("kineCut", "kine cut"); + kineCut->AddCut(VarManager::kP, 1.0, 1000.0); + kineCut->AddCut(VarManager::kEta, -0.9, 0.9); + + AnalysisCut* qualityCuts = new AnalysisCut("qualityCuts", "quality cuts"); + qualityCuts->AddCut(VarManager::kIsITSibAny, 0.5, 1.5); + qualityCuts->AddCut(VarManager::kTPCchi2, 0.0, 5.0); + qualityCuts->AddCut(VarManager::kTPCncls, 60, 161.); + qualityCuts->AddCut(VarManager::kTrackDCAz, -0.5, 0.5); + + AnalysisCut* pidCuts = new AnalysisCut("pidCuts", "pid cuts"); + pidCuts->AddCut(VarManager::kTPCnSigmaEl, -4.0, 4.0, false, VarManager::kPin, 0.0, 5.0); + pidCuts->AddCut(VarManager::kTPCnSigmaEl, -1.5, 4.0, false, VarManager::kPin, 5.0, 1000.0); + pidCuts->AddCut(VarManager::kTPCnSigmaPi, 2.0, 999, false, VarManager::kPin, 0.0, 5.0); + pidCuts->AddCut(VarManager::kTPCnSigmaPr, 2.5, 999, false, VarManager::kPin, 0.0, 5.0); + + cut->AddCut(kineCut); + cut->AddCut(qualityCuts); + cut->AddCut(pidCuts); + return cut; + } + + if (!nameStr.compare("Electron2025_3")) { + AnalysisCut* kineCut = new AnalysisCut("kineCut", "kine cut"); + kineCut->AddCut(VarManager::kP, 1.0, 1000.0); + kineCut->AddCut(VarManager::kEta, -0.9, 0.9); + + AnalysisCut* qualityCuts = new AnalysisCut("qualityCuts", "quality cuts"); + qualityCuts->AddCut(VarManager::kIsITSibAny, 0.5, 1.5); + qualityCuts->AddCut(VarManager::kTPCchi2, 0.0, 5.0); + qualityCuts->AddCut(VarManager::kTPCncls, 60, 161.); + qualityCuts->AddCut(VarManager::kTrackDCAz, -0.5, 0.5); + + AnalysisCut* pidCuts = new AnalysisCut("pidCuts", "pid cuts"); + pidCuts->AddCut(VarManager::kTPCnSigmaEl, -4.0, 4.0, false, VarManager::kPin, 0.0, 3.5); + pidCuts->AddCut(VarManager::kTPCnSigmaEl, -2.0, 4.0, false, VarManager::kPin, 3.5, 1000.0); + pidCuts->AddCut(VarManager::kTPCnSigmaPi, 2.0, 999, false, VarManager::kPin, 0.0, 3.5); + pidCuts->AddCut(VarManager::kTPCnSigmaPr, 2.5, 999, false, VarManager::kPin, 0.0, 5.0); + + cut->AddCut(kineCut); + cut->AddCut(qualityCuts); + cut->AddCut(pidCuts); + return cut; + } if (!nameStr.compare("LowMassElectron2023")) { cut->AddCut(GetAnalysisCut("lmeeStandardKine")); cut->AddCut(GetAnalysisCut("LooseGlobalTrackRun3")); diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 7d5f1d6b5b4..39024957c48 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -529,8 +529,8 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "TPCnSigPr_Corr_pIN", "TPC n-#sigma(p) Corr. vs pIN", false, nbins_pIN, pIN_bins, VarManager::kPin, nbins_nSigma, nSigma_bins, VarManager::kTPCnSigmaPr_Corr); } } else { - hm->AddHistogram(histClass, "TPCdedx_pIN", "TPC dE/dx vs pIN", false, 100, 0.0, 10.0, VarManager::kPin, 200, 0.0, 200., VarManager::kTPCsignal); - hm->AddHistogram(histClass, "TPCnSigEle_pIN", "TPC n-#sigma(e) vs pIN", false, 100, 0.0, 10.0, VarManager::kPin, 100, -5.0, 5.0, VarManager::kTPCnSigmaEl); + hm->AddHistogram(histClass, "TPCdedx_pIN", "TPC dE/dx vs pIN", false, 100, 0.0, 20.0, VarManager::kPin, 150, 0.0, 150., VarManager::kTPCsignal); + hm->AddHistogram(histClass, "TPCnSigEle_pIN", "TPC n-#sigma(e) vs pIN", false, 100, 0.0, 20.0, VarManager::kPin, 100, -5.0, 5.0, VarManager::kTPCnSigmaEl); hm->AddHistogram(histClass, "TPCnSigEle_occupancy", "TPC n-#sigma(e) vs occupancy", false, 200, 0., 20000., VarManager::kTrackOccupancyInTimeRange, 100, -5.0, 5.0, VarManager::kTPCnSigmaEl); hm->AddHistogram(histClass, "TPCnSigEle_timeFromSOR", "TPC n-#sigma(e) vs time from SOR", true, 10000, 0.0, 1000.0, VarManager::kTimeFromSOR, 10, -5.0, 5.0, VarManager::kTPCnSigmaEl); hm->AddHistogram(histClass, "TPCnSigEle_occupTPCcontribLongA", "TPC n-#sigma(e) vs pileup n-contrib, long time range A-side", false, 20, 0.0, 10000.0, VarManager::kNTPCcontribLongA, 200, -5.0, 5.0, VarManager::kTPCnSigmaEl); From cff65dc54874f6412a42c2a6450475bd23109de6 Mon Sep 17 00:00:00 2001 From: mkor <37400009+makor@users.noreply.github.com> Date: Thu, 3 Apr 2025 06:31:04 +0200 Subject: [PATCH 0904/1650] [PWGEM,Trigger] Add femto part to omega and etaprime triggers. (#10737) Co-authored-by: Maximilian Korwieser --- .../PWGEM/HeavyNeutralMesonFilter.cxx | 1474 ++++++++++++++++- EventFiltering/filterTables.h | 9 +- PWGEM/PhotonMeson/Utils/HNMUtilities.h | 14 +- 3 files changed, 1462 insertions(+), 35 deletions(-) diff --git a/EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx b/EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx index 1446943c279..967a7021ad8 100644 --- a/EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx +++ b/EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx @@ -13,38 +13,382 @@ /// /// \brief This code loops over collisions to filter events contaning heavy mesons (omega or eta') using EMCal clusters and V0s (PCM) /// -/// \author Nicolas Strangmann (nicolas.strangmann@cern.ch) - Goethe University Frankfurt +/// \author Nicolas Strangmann (nicolas.strangmann@cern.ch) - Goethe University Frankfurt; Maximilian Korwieser (maximilian.korwieser@cern.ch) - Technical University Munich /// #include +#include +#include +#include + +#include "Math/GenVector/Boost.h" +#include "Math/Vector4D.h" +#include "TMath.h" +#include "TRandom3.h" #include "PWGEM/PhotonMeson/Utils/HNMUtilities.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/PIDResponseITS.h" +#include "fairlogger/Logger.h" +#include "Framework/Configurable.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/runDataProcessing.h" +#include "CommonConstants/MathConstants.h" +#include "Common/Core/TrackSelection.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Multiplicity.h" + using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::aod::pwgem::photonmeson; +namespace o2::aod +{ using MyBCs = soa::Join; -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; +using MyCollision = MyCollisions::iterator; +using SelectedTracks = soa::Join; +} // namespace o2::aod + +namespace CFTrigger +{ +enum CFFemtoTriggers { + kPPOmega, + kPPEtaPrime, + kOmegaD, + kEtaPrimeD, + kOmegaP, + kEtaPrimeP, + kNFemtoTriggers +}; + +enum FemtoPartners { + kProton, + kDeuteron, + kPion, + kNFemtoPartners +}; + +enum PIDLimits { kTPCMin, + kTPCMax, + kTPCTOF, + kITSmin, + kITSmax, + kNPIDLimits +}; +const std::vector SpeciesName{"proton", "Deuteron", "pion"}; // ToDo include charged pions + +const std::vector PtCutsName{"Pt min", "Pt max", "P TOF thres"}; + +const std::vector PidCutsName{"TPC min", "TPC max", "TPCTOF max", "ITS min", "ITS max"}; + +const std::vector FemtoFilterNames{"PPOmega", "PPEtaPrime", "Omegad", "EtaPrimed", "OmegaP", "EtaPrimeP"}; + +// configs for tracks +const float pidcutsTable[kNFemtoPartners][kNPIDLimits]{ + {-4.f, 4.f, 4.f, -99.f, 99.f}, + {-4.f, 4.f, 4.f, -6.f, 6.f}, + {-4.f, 4.f, 4.f, -99.f, 99.f}}; -using SelectedTracks = soa::Filtered>; +const float ptcutsTable[kNFemtoPartners][3]{ + {0.35f, 6.f, 0.75f}, + {0.55f, 2.f, 1.2f}, + {0.35f, 6.f, 0.75f}}; + +const float TPCNClustersMin[1][kNFemtoPartners]{ + {80.0f, 80.0f, 80.0f}}; +const float ITSNClustersMin[1][kNFemtoPartners]{ + {4, 4, 4}}; + +static const float triggerSwitches[1][kNFemtoTriggers]{ + {1, 1, 1, 1, 1, 1}}; +const float TriggerLimits[1][kNFemtoTriggers]{ + {1.f, 1.f, 1.f, 1.f, 1.f, 1.f}}; +} // namespace CFTrigger struct HeavyNeutralMesonFilter { + + Configurable> ConfTriggerSwitches{ + "ConfTriggerSwitches", + {CFTrigger::triggerSwitches[0], 1, CFTrigger::kNFemtoTriggers, std::vector{"Switch"}, CFTrigger::FemtoFilterNames}, + "Turn on specific trigger"}; + + Configurable ConfKeepTwoBody{ + "ConfKeepTwoBody", + true, + "Turn on specific trigger selection"}; + + // PID selections + Configurable> + ConfPIDCuts{ + "ConfPIDCuts", + {CFTrigger::pidcutsTable[0], CFTrigger::kNFemtoPartners, CFTrigger::kNPIDLimits, CFTrigger::SpeciesName, CFTrigger::PidCutsName}, + "Femtopartner PID nsigma selections"}; + + Configurable> ConfPtCuts{ + "ConfPtCuts", + {CFTrigger::ptcutsTable[0], CFTrigger::kNFemtoPartners, 3, CFTrigger::SpeciesName, CFTrigger::PtCutsName}, + "Femtopartner pT selections"}; + + Configurable ConfTrkEta{ + "ConfTrkEta", + 0.9, + "Eta"}; + + Configurable> ConfTPCNClustersMin{ + "ConfTPCNClustersMin", + {CFTrigger::TPCNClustersMin[0], 1, CFTrigger::kNFemtoPartners, std::vector{"TPCNClusMin"}, CFTrigger::SpeciesName}, + "Mininum of TPC Clusters"}; + + Configurable ConfTrkTPCfCls{ + "ConfTrkTPCfCls", + 0.83, + "Minimum fraction of crossed rows over findable clusters"}; + Configurable ConfTrkTPCcRowsMin{ + "ConfTrkTPCcRowsMin", + 70, + "Minimum number of crossed TPC rows"}; + Configurable ConfTrkTPCsClsSharedFrac{ + "ConfTrkTPCsClsSharedFrac", + 1.f, + "Fraction of shared TPC clusters"}; + + Configurable> ConfTrkITSnclsMin{ + "ConfTrkITSnclsMin", + {CFTrigger::ITSNClustersMin[0], 1, CFTrigger::kNFemtoPartners, std::vector{"Cut"}, CFTrigger::SpeciesName}, + "Minimum number of ITS clusters"}; + + Configurable ConfTrkDCAxyMax{ + "ConfTrkDCAxyMax", + 0.15, + "Maximum DCA_xy"}; + Configurable ConfTrkDCAzMax{ + "ConfTrkDCAzMax", + 0.3, + "Maximum DCA_z"}; + + Configurable + ConfTrkMaxChi2PerClusterTPC{ + "ConfTrkMaxChi2PerClusterTPC", + 4.0f, + "Minimal track selection: max allowed chi2 per TPC cluster"}; // 4.0 is default of + // global tracks + // on 20.01.2023 + Configurable + ConfTrkMaxChi2PerClusterITS{ + "ConfTrkMaxChi2PerClusterITS", + 36.0f, + "Minimal track selection: max allowed chi2 per ITS cluster"}; // 36.0 is default of + // global tracks + // on 20.01.2023 + + Configurable> ConfKinematicLimits{ + "ConfKstarLimits", + {CFTrigger::TriggerLimits[0], 1, CFTrigger::kNFemtoTriggers, std::vector{"Limit"}, CFTrigger::FemtoFilterNames}, + "hypermomentum limit for two body trigger"}; + + // Configs for events + Configurable ConfEvtSelectZvtx{ + "ConfEvtSelectZvtx", + true, + "Event selection includes max. z-Vertex"}; + Configurable ConfEvtZvtx{"ConfEvtZvtx", + 10.f, + "Evt sel: Max. z-Vertex (cm)"}; + Configurable ConfEvtOfflineCheck{ + "ConfEvtOfflineCheck", + false, + "Evt sel: check for offline selection"}; + + template + bool isSelectedTrack(T const& track, CFTrigger::FemtoPartners partSpecies) + { + const auto pT = track.pt(); + const auto eta = track.eta(); + const auto tpcNClsF = track.tpcNClsFound(); + const auto tpcRClsC = track.tpcCrossedRowsOverFindableCls(); + const auto tpcNClsC = track.tpcNClsCrossedRows(); + const auto tpcNClsSFrac = track.tpcFractionSharedCls(); + const auto itsNCls = track.itsNCls(); + const auto dcaXY = track.dcaXY(); + const auto dcaZ = track.dcaZ(); + + if (pT < ConfPtCuts->get(partSpecies, "Pt min")) { + return false; + } + if (pT > ConfPtCuts->get(partSpecies, "Pt max")) { + return false; + } + if (std::abs(eta) > ConfTrkEta) { + return false; + } + if (tpcNClsF < ConfTPCNClustersMin->get("TPCNClusMin", partSpecies)) { + return false; + } + if (tpcRClsC < ConfTrkTPCfCls) { + return false; + } + if (tpcNClsC < ConfTrkTPCcRowsMin) { + return false; + } + if (tpcNClsSFrac > ConfTrkTPCsClsSharedFrac) { + return false; + } + if (itsNCls < ConfTrkITSnclsMin->get(static_cast(0), partSpecies)) { + return false; + } + if (std::abs(dcaXY) > ConfTrkDCAxyMax) { + return false; + } + if (std::abs(dcaZ) > ConfTrkDCAzMax) { + return false; + } + return true; + } + + template + bool isSelectedTrackPID(T const& track, CFTrigger::FemtoPartners partSpecies) + { + // nSigma should have entries [proton, deuteron, pion] + bool isSelected = false; + + float nSigmaTrackTPC = -999.f; + float nSigmaTrackTOF = -999.f; + float nSigmaTrackITS = -999.f; + + float nSigmaTrackTPCTOF = -999.f; + + switch (partSpecies) { + case CFTrigger::kProton: + nSigmaTrackTPC = track.tpcNSigmaPr(); + nSigmaTrackTOF = track.tofNSigmaPr(); + nSigmaTrackITS = track.itsNSigmaPr(); + break; + case CFTrigger::kDeuteron: + nSigmaTrackTPC = track.tpcNSigmaDe(); + nSigmaTrackTOF = track.tofNSigmaDe(); + nSigmaTrackITS = track.itsNSigmaDe(); + break; + case CFTrigger::kPion: + nSigmaTrackTPC = track.tpcNSigmaPi(); + nSigmaTrackTOF = track.tofNSigmaPi(); + nSigmaTrackITS = track.itsNSigmaPi(); + break; + default: + LOG(fatal) << "Particle species not known"; + } + + nSigmaTrackTPCTOF = std::sqrt(std::pow(nSigmaTrackTPC, 2) + std::pow(nSigmaTrackTOF, 2)); + + // check if track is selected + auto TPCmin = ConfPIDCuts->get(partSpecies, CFTrigger::kTPCMin); + auto TPCmax = ConfPIDCuts->get(partSpecies, CFTrigger::kTPCMax); + auto TPCTOFmax = ConfPIDCuts->get(partSpecies, CFTrigger::kTPCTOF); + auto ITSmin = ConfPIDCuts->get(partSpecies, CFTrigger::kITSmin); + auto ITSmax = ConfPIDCuts->get(partSpecies, CFTrigger::kITSmax); + + if (track.p() <= ConfPtCuts->get(partSpecies, "P TOF thres")) { + if (nSigmaTrackTPC > TPCmin && + nSigmaTrackTPC < TPCmax && + nSigmaTrackITS > ITSmin && + nSigmaTrackITS < ITSmax) { + isSelected = true; + } + } else { + if (nSigmaTrackTPCTOF < TPCTOFmax) { + isSelected = true; + } + } + return isSelected; + } + + template + bool isSelectedEvent(T const& col) + { + if (ConfEvtSelectZvtx && std::abs(col.posZ()) > ConfEvtZvtx) { + return false; + } + if (ConfEvtOfflineCheck && !col.sel8()) { + return false; + } + return true; + } + + float getkstar(const ROOT::Math::PtEtaPhiMVector part1, + const ROOT::Math::PtEtaPhiMVector part2) + { + const ROOT::Math::PtEtaPhiMVector trackSum = part1 + part2; + const float beta = trackSum.Beta(); + const float betax = + beta * std::cos(trackSum.Phi()) * std::sin(trackSum.Theta()); + const float betay = + beta * std::sin(trackSum.Phi()) * std::sin(trackSum.Theta()); + const float betaz = beta * std::cos(trackSum.Theta()); + ROOT::Math::PxPyPzMVector PartOneCMS(part1); + ROOT::Math::PxPyPzMVector PartTwoCMS(part2); + const ROOT::Math::Boost boostPRF = + ROOT::Math::Boost(-betax, -betay, -betaz); + PartOneCMS = boostPRF(PartOneCMS); + PartTwoCMS = boostPRF(PartTwoCMS); + const ROOT::Math::PxPyPzMVector trackRelK = PartOneCMS - PartTwoCMS; + return 0.5 * trackRelK.P(); + } + + ROOT::Math::PxPyPzEVector getqij(const ROOT::Math::PtEtaPhiMVector parti, + const ROOT::Math::PtEtaPhiMVector partj) + { + ROOT::Math::PxPyPzEVector vecparti(parti); + ROOT::Math::PxPyPzEVector vecpartj(partj); + ROOT::Math::PxPyPzEVector trackSum = vecparti + vecpartj; + ROOT::Math::PxPyPzEVector trackDifference = vecparti - vecpartj; + float scaling = trackDifference.Dot(trackSum) / trackSum.Dot(trackSum); + return trackDifference - scaling * trackSum; + } + float getQ3(const ROOT::Math::PtEtaPhiMVector part1, + const ROOT::Math::PtEtaPhiMVector part2, + const ROOT::Math::PtEtaPhiMVector part3) + { + ROOT::Math::PxPyPzEVector q12 = getqij(part1, part2); + ROOT::Math::PxPyPzEVector q23 = getqij(part2, part3); + ROOT::Math::PxPyPzEVector q31 = getqij(part3, part1); + float Q32 = q12.M2() + q23.M2() + q31.M2(); + return sqrt(-Q32); + } + + // Circumvent missing of different phi mappings, enforce [0, 2 * M_PI] + // Tracks have domain [0, 2 * M_PI] + // TLorentVectors have domain [-M_PI, M_PI] + double translatePhi(double phi) + { + if (phi < 0) { + phi += 2 * M_PI; // Add 2 pi to make it positive + } + return phi; + } + Produces tags; - HistogramRegistry mHistManager{"HeavyNeutralMesonFilterHistograms", {}, OutputObjHandlingPolicy::QAObject}; + HistogramRegistry mHistManager{"HeavyNeutralMesonFilterHistograms", {}, OutputObjHandlingPolicy::AnalysisObject}; - Configurable cfgTrackMinPt{"cfgTrackMinPt", 0.1, "Minimum momentum of tracks (GeV/c)"}; Configurable cfgHNMMassCorrection{"cfgHNMMassCorrection", 1, "Use GG PDG mass to correct HNM mass (0 = off, 1 = subDeltaPi0, 2 = subLambda)"}; static constexpr float defaultMassWindows[2][4] = {{0., 0.4, 0.6, 1.}, {0.4, 0.8, 0.8, 1.2}}; Configurable> massWindowOmega{"massWindowOmega", {defaultMassWindows[0], 4, {"pi0_min", "pi0_max", "omega_min", "omega_max"}}, "Mass window for selected omegas and their decay pi0"}; Configurable> massWindowEtaPrime{"massWindowEtaPrime", {defaultMassWindows[1], 4, {"eta_min", "eta_max", "etaprime_min", "etaprime_max"}}, "Mass window for selected eta' and their decay eta"}; static constexpr float defaultMinPts[4] = {1.8, 1.8, 2.6, 2.6}; + static constexpr float defaultFemtoMinPts[4] = {1.8, 1.8, 2.6, 2.6}; + Configurable> minHNMPts{"minHNMPts", {defaultMinPts, 4, {"PCM_omega", "PCM_etaprime", "EMC_omega", "EMC_etaprime"}}, "Minimum pT values for the trigger decisions (GeV/c)"}; - Filter trackPtFilter = aod::track::pt > cfgTrackMinPt; + Configurable> minFemtoHNMPts{"minFemtoHNMPts", {defaultFemtoMinPts, 4, {"PCM_omega", "PCM_etaprime", "EMC_omega", "EMC_etaprime"}}, "Minimum pT values for the femto trigger decisions (GeV/c)"}; std::vector vGGs; std::vector vHNMs; @@ -53,6 +397,15 @@ struct HeavyNeutralMesonFilter { emcal::Geometry* emcalGeom; + // Femto + // Prepare vectors for different species + std::vector etaPrimeEMC, etaPrimePCM, omegaEMC, omegaPCM, proton, antiproton, deuteron, antideuteron, pion, antipion; + float mMassProton = o2::constants::physics::MassProton; + float mMassDeuteron = o2::constants::physics::MassDeuteron; + float mMassOmega = 0.782; + float mMassEtaPrime = 0.957; + float mMassPionCharged = o2::constants::physics::MassPionCharged; + void init(InitContext const&) { emcalGeom = emcal::Geometry::GetInstanceFromRunNumber(300000); @@ -69,39 +422,1029 @@ struct HeavyNeutralMesonFilter { mHistManager.add("Event/nHeavyNeutralMesons", "Number of (selected) HNM candidates;#bf{#it{N}_{HNM}};#bf{#it{N}_{HNM}^{selected}}", HistType::kTH2F, {{51, -0.5, 50.5}, {51, -0.5, 50.5}}); mHistManager.add("Event/nClustersVsV0s", "Number of clusters and V0s in the collision;#bf{#it{N}_{clusters}};#bf{#it{N}_{V0s}}", HistType::kTH2F, {{26, -0.5, 25.5}, {26, -0.5, 25.5}}); - mHistManager.add("GG/invMassVsPt_PCM", "Invariant mass and pT of gg candidates;#bf{#it{M}_{#gamma#gamma}};#bf{#it{N}_{#gamma#gamma}}", HistType::kTH2F, {{400, 0., 0.8}, {250, 0., 25.}}); - mHistManager.add("GG/invMassVsPt_PCMEMC", "Invariant mass and pT of gg candidates;#bf{#it{M}_{#gamma#gamma}};#bf{#it{N}_{#gamma#gamma}}", HistType::kTH2F, {{400, 0., 0.8}, {250, 0., 25.}}); - mHistManager.add("GG/invMassVsPt_EMC", "Invariant mass and pT of gg candidates;#bf{#it{M}_{#gamma#gamma}};#bf{#it{N}_{#gamma#gamma}}", HistType::kTH2F, {{400, 0., 0.8}, {250, 0., 25.}}); + mHistManager.add("GG/invMassVsPt_PCM", "Invariant mass and pT of gg candidates;#bf{#it{M}_{#gamma#gamma}};#bf{#it{pT}_{#gamma#gamma}}", HistType::kTH2F, {{400, 0., 0.8}, {250, 0., 25.}}); + mHistManager.add("GG/invMassVsPt_PCMEMC", "Invariant mass and pT of gg candidates;#bf{#it{M}_{#gamma#gamma}};#bf{#it{pT}_{#gamma#gamma}}", HistType::kTH2F, {{400, 0., 0.8}, {250, 0., 25.}}); + mHistManager.add("GG/invMassVsPt_EMC", "Invariant mass and pT of gg candidates;#bf{#it{M}_{#gamma#gamma}};#bf{#it{pT}_{#gamma#gamma}}", HistType::kTH2F, {{400, 0., 0.8}, {250, 0., 25.}}); - mHistManager.add("HeavyNeutralMeson/invMassVsPt_PCM", "Invariant mass and pT of HNM candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{N}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{600, 0.6, 1.2}, {250, 0., 25.}}); - mHistManager.add("HeavyNeutralMeson/invMassVsPt_PCMEMC", "Invariant mass and pT of HNM candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{N}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{600, 0.6, 1.2}, {250, 0., 25.}}); - mHistManager.add("HeavyNeutralMeson/invMassVsPt_EMC", "Invariant mass and pT of HNM candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{N}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{600, 0.6, 1.2}, {250, 0., 25.}}); - } + mHistManager.add("HeavyNeutralMeson/invMassVsPt_PCM", "Invariant mass and pT of HNM candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{600, 0.6, 1.2}, {250, 0., 25.}}); + mHistManager.add("HeavyNeutralMeson/invMassVsPt_PCMEMC", "Invariant mass and pT of HNM candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{600, 0.6, 1.2}, {250, 0., 25.}}); + mHistManager.add("HeavyNeutralMeson/invMassVsPt_EMC", "Invariant mass and pT of HNM candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{600, 0.6, 1.2}, {250, 0., 25.}}); + + // include all femto histograms + mHistManager.add("fProcessedEvents", "CF - event filtered;;Events", HistType::kTH1F, {{15, -0.5, 14.5}}); + std::vector eventTitles = {"all", "rejected", "PPOmega", "PPEtaPrime", "Omegad", "EtaPrimed", "OmegaP", "EtaPrimeP", "kTVXinEMC", "PCM #omega", "EMC #omega", "PCM #eta'", "EMC #eta'"}; + for (size_t iBin = 0; iBin < eventTitles.size(); iBin++) { + mHistManager.get(HIST("fProcessedEvents"))->GetXaxis()->SetBinLabel(iBin + 1, eventTitles[iBin].data()); + } + + // event cuts + mHistManager.add("EventCuts/fMultiplicityBefore", "Multiplicity of all processed events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); + mHistManager.add("EventCuts/fMultiplicityAfter", "Multiplicity after event cuts;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); + mHistManager.add("EventCuts/fZvtxBefore", "Zvtx of all processed events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); + mHistManager.add("EventCuts/fZvtxAfter", "Zvtx after event cuts;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); + + // mom correlations p vs pTPC + mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationPos", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); + mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationNeg", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); + + mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsProton", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); + mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsAntiProton", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); + mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsDeuteron", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); + mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsAntiDeuteron", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); + + mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsPion", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{1000, 0.0f, 20.0f}, {1000, 0.0f, 20.0f}}}); + mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsAntiPion", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{1000, 0.0f, 20.0f}, {1000, 0.0f, 20.0f}}}); + + // all tracks + mHistManager.add("TrackCuts/TracksBefore/fPtTrackBefore", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/TracksBefore/fEtaTrackBefore", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/TracksBefore/fPhiTrackBefore", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + + // TPC signal + mHistManager.add("TrackCuts/TPCSignal/fTPCSignal", "TPCSignal;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); + mHistManager.add("TrackCuts/TPCSignal/fTPCSignalP", "TPCSignalP;p (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); + // TPC signal anti + mHistManager.add("TrackCuts/TPCSignal/fTPCSignalAnti", "TPCSignal;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); + mHistManager.add("TrackCuts/TPCSignal/fTPCSignalAntiP", "TPCSignalP;p (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); + + // TPC signal particles + mHistManager.add("TrackCuts/TPCSignal/fTPCSignalProton", "fTPCSignalProton;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); + mHistManager.add("TrackCuts/TPCSignal/fTPCSignalAntiProton", "fTPCSignalAntiProton;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); + mHistManager.add("TrackCuts/TPCSignal/fTPCSignalDeuteron", "fTPCSignalDeuteron;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); + mHistManager.add("TrackCuts/TPCSignal/fTPCSignalAntiDeuteron", "fTPCSignalAntiDeuteron;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); + mHistManager.add("TrackCuts/TPCSignal/fTPCSignalPion", "fTPCSignalPion;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); + mHistManager.add("TrackCuts/TPCSignal/fTPCSignalAntiPion", "fTPCSignalAntiPion;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); + + // proton + mHistManager.add("TrackCuts/Proton/fPProton", "Momentum of protons at PV;p (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/Proton/fPTPCProton", "Momentum of protons at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/Proton/fPtProton", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/Proton/fMomCorProtonDif", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); + mHistManager.add("TrackCuts/Proton/fMomCorProtonRatio", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); + mHistManager.add("TrackCuts/Proton/fEtaProton", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/Proton/fPhiProton", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + mHistManager.add("TrackCuts/Proton/fNsigmaTPCvsPProton", "NSigmaTPC Proton;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/Proton/fNsigmaTOFvsPProton", "NSigmaTOF Proton;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/Proton/fNsigmaTPCTOFvsPProton", "NSigmaTPCTOF Proton;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); + mHistManager.add("TrackCuts/Proton/fNsigmaITSvsPProton", "NSigmaITS Proton;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + + mHistManager.add("TrackCuts/Proton/fNsigmaTPCvsPProtonP", "NSigmaTPC Proton P;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/Proton/fNsigmaTOFvsPProtonP", "NSigmaTOF Proton P;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/Proton/fNsigmaTPCTOFvsPProtonP", "NSigmaTPCTOF Proton P;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); + + mHistManager.add("TrackCuts/Proton/fDCAxyProton", "fDCAxy Proton;DCA_{XY};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); + mHistManager.add("TrackCuts/Proton/fDCAzProton", "fDCAz Proton;DCA_{Z};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); + mHistManager.add("TrackCuts/Proton/fTPCsClsProton", "fTPCsCls Proton;TPC Shared Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + mHistManager.add("TrackCuts/Proton/fTPCcRowsProton", "fTPCcRows Proton;TPC Crossed Rows;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + mHistManager.add("TrackCuts/Proton/fTrkTPCfClsProton", "fTrkTPCfCls Proton;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {{500, 0.0f, 3.0f}}); + mHistManager.add("TrackCuts/Proton/fTPCnclsProton", "fTPCncls Proton;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + + // antiproton + mHistManager.add("TrackCuts/AntiProton/fPtAntiProton", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/AntiProton/fMomCorAntiProtonDif", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); + mHistManager.add("TrackCuts/AntiProton/fMomCorAntiProtonRatio", "Momentum correlation;p_{reco} (GeV/c); |p_{TPC} - p_{reco}| (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); + mHistManager.add("TrackCuts/AntiProton/fEtaAntiProton", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/AntiProton/fPhiAntiProton", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + mHistManager.add("TrackCuts/AntiProton/fNsigmaTPCvsPAntiProton", "NSigmaTPC AntiProton;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/AntiProton/fNsigmaTOFvsPAntiProton", "NSigmaTOF AntiProton;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/AntiProton/fNsigmaTPCTOFvsPAntiProton", "NSigmaTPCTOF AntiProton;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); + mHistManager.add("TrackCuts/AntiProton/fNsigmaITSvsPAntiProton", "NSigmaITS AntiProton;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + + mHistManager.add("TrackCuts/AntiProton/fNsigmaTPCvsPAntiProtonP", "NSigmaTPC AntiProton P;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/AntiProton/fNsigmaTOFvsPAntiProtonP", "NSigmaTOF AntiProton P;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/AntiProton/fNsigmaTPCTOFvsPAntiProtonP", "NSigmaTPCTOF AntiProton P;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); + + mHistManager.add("TrackCuts/AntiProton/fDCAxyAntiProton", "fDCAxy AntiProton;DCA_{XY};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); + mHistManager.add("TrackCuts/AntiProton/fDCAzAntiProton", "fDCAz AntiProton;DCA_{Z};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); + mHistManager.add("TrackCuts/AntiProton/fTPCsClsAntiProton", "fTPCsCls AntiProton;TPC Shared Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + mHistManager.add("TrackCuts/AntiProton/fTPCcRowsAntiProton", "fTPCcRows AntiProton;TPC Crossed Rows;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + mHistManager.add("TrackCuts/AntiProton/fTrkTPCfClsAntiProton", "fTrkTPCfCls AntiProton;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {{500, 0.0f, 3.0f}}); + mHistManager.add("TrackCuts/AntiProton/fTPCnclsAntiProton", "fTPCncls AntiProton;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + + // deuteron + mHistManager.add("TrackCuts/Deuteron/fPtDeuteron", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/Deuteron/fMomCorDeuteronDif", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); + mHistManager.add("TrackCuts/Deuteron/fMomCorDeuteronRatio", "Momentum correlation;p_{reco} (GeV/c); |p_{TPC} - p_{reco}| (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); + mHistManager.add("TrackCuts/Deuteron/fEtaDeuteron", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/Deuteron/fPhiDeuteron", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + mHistManager.add("TrackCuts/Deuteron/fNsigmaTPCvsPDeuteron", "NSigmaTPC Deuteron;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/Deuteron/fNsigmaTOFvsPDeuteron", "NSigmaTOF Deuteron;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/Deuteron/fNsigmaTPCTOFvsPDeuteron", "NSigmaTPCTOF Deuteron;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); + mHistManager.add("TrackCuts/Deuteron/fNsigmaITSvsPDeuteron", "NSigmaITS Deuteron;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + + mHistManager.add("TrackCuts/Deuteron/fNsigmaTPCvsPDeuteronP", "NSigmaTPC Deuteron vd P;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/Deuteron/fNsigmaTOFvsPDeuteronP", "NSigmaTOF Deuteron P;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/Deuteron/fNsigmaTPCTOFvsPDeuteronP", "NSigmaTPCTOF Deuteron P;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); + + mHistManager.add("TrackCuts/Deuteron/fDCAxyDeuteron", "fDCAxy Deuteron;DCA_{XY};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); + mHistManager.add("TrackCuts/Deuteron/fDCAzDeuteron", "fDCAz Deuteron;DCA_{Z};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); + mHistManager.add("TrackCuts/Deuteron/fTPCsClsDeuteron", "fTPCsCls Deuteron;TPC Shared Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + mHistManager.add("TrackCuts/Deuteron/fTPCcRowsDeuteron", "fTPCcRows Deuteron;TPC Crossed Rows;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + mHistManager.add("TrackCuts/Deuteron/fTrkTPCfClsDeuteron", "fTrkTPCfCls Deuteron;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {{500, 0.0f, 3.0f}}); + mHistManager.add("TrackCuts/Deuteron/fTPCnclsDeuteron", "fTPCncls Deuteron;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + + // antideuteron + mHistManager.add("TrackCuts/AntiDeuteron/fPtAntiDeuteron", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/AntiDeuteron/fMomCorAntiDeuteronDif", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); + mHistManager.add("TrackCuts/AntiDeuteron/fMomCorAntiDeuteronRatio", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); + mHistManager.add("TrackCuts/AntiDeuteron/fEtaAntiDeuteron", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/AntiDeuteron/fPhiAntiDeuteron", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + mHistManager.add("TrackCuts/AntiDeuteron/fNsigmaTPCvsPAntiDeuteron", "NSigmaTPC AntiDeuteron;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/AntiDeuteron/fNsigmaTOFvsPAntiDeuteron", "NSigmaTOF AntiDeuteron;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/AntiDeuteron/fNsigmaTPCTOFvsPAntiDeuteron", "NSigmaTPCTOF AntiDeuteron;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); + mHistManager.add("TrackCuts/AntiDeuteron/fNsigmaITSvsPAntiDeuteron", "NSigmaITS AntiDeuteron;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + + mHistManager.add("TrackCuts/AntiDeuteron/fNsigmaTPCvsPAntiDeuteronP", "NSigmaTPC AntiDeuteron P;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/AntiDeuteron/fNsigmaTOFvsPAntiDeuteronP", "NSigmaTOF AntiDeuteron P;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/AntiDeuteron/fNsigmaTPCTOFvsPAntiDeuteronP", "NSigmaTPCTOF AntiDeuteron P;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); + + mHistManager.add("TrackCuts/AntiDeuteron/fDCAxyAntiDeuteron", "fDCAxy AntiDeuteron;DCA_{XY};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); + mHistManager.add("TrackCuts/AntiDeuteron/fDCAzAntiDeuteron", "fDCAz AntiDeuteron;DCA_{Z};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); + mHistManager.add("TrackCuts/AntiDeuteron/fTPCsClsAntiDeuteron", "fTPCsCls AntiDeuteron;TPC Shared Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + mHistManager.add("TrackCuts/AntiDeuteron/fTPCcRowsAntiDeuteron", "fTPCcRows AntiDeuteron;TPC Crossed Rows;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + mHistManager.add("TrackCuts/AntiDeuteron/fTrkTPCfClsAntiDeuteron", "fTrkTPCfCls AntiDeuteron;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {{500, 0.0f, 3.0f}}); + mHistManager.add("TrackCuts/AntiDeuteron/fTPCnclsAntiDeuteron", "fTPCncls AntiDeuteron;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + + // pions + mHistManager.add("TrackCuts/Pion/fPPion", "Momentum of Pions at PV;p (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/Pion/fPTPCPion", "Momentum of Pions at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/Pion/fPtPion", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/Pion/fMomCorPionDif", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); + mHistManager.add("TrackCuts/Pion/fMomCorPionRatio", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); + mHistManager.add("TrackCuts/Pion/fEtaPion", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/Pion/fPhiPion", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + mHistManager.add("TrackCuts/Pion/fNsigmaTPCvsPPion", "NSigmaTPC Pion;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/Pion/fNsigmaTOFvsPPion", "NSigmaTOF Pion;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/Pion/fNsigmaTPCTOFvsPPion", "NSigmaTPCTOF Pion;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); + + mHistManager.add("TrackCuts/Pion/fNsigmaTPCvsPPionP", "NSigmaTPC Pion P;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/Pion/fNsigmaTOFvsPPionP", "NSigmaTOF Pion P;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/Pion/fNsigmaTPCTOFvsPPionP", "NSigmaTPCTOF Pion P;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); + + mHistManager.add("TrackCuts/Pion/fDCAxyPion", "fDCAxy Pion;DCA_{XY};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); + mHistManager.add("TrackCuts/Pion/fDCAzPion", "fDCAz Pion;DCA_{Z};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); + mHistManager.add("TrackCuts/Pion/fTPCsClsPion", "fTPCsCls Pion;TPC Shared Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + mHistManager.add("TrackCuts/Pion/fTPCcRowsPion", "fTPCcRows Pion;TPC Crossed Rows;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + mHistManager.add("TrackCuts/Pion/fTrkTPCfClsPion", "fTrkTPCfCls Pion;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {{500, 0.0f, 3.0f}}); + mHistManager.add("TrackCuts/Pion/fTPCnclsPion", "fTPCncls Pion;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + + // anti-pions + mHistManager.add("TrackCuts/AntiPion/fPtAntiPion", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/AntiPion/fMomCorAntiPionDif", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); + mHistManager.add("TrackCuts/AntiPion/fMomCorAntiPionRatio", "Momentum correlation;p_{reco} (GeV/c); |p_{TPC} - p_{reco}| (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); + mHistManager.add("TrackCuts/AntiPion/fEtaAntiPion", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/AntiPion/fPhiAntiPion", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + mHistManager.add("TrackCuts/AntiPion/fNsigmaTPCvsPAntiPion", "NSigmaTPC AntiPion;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/AntiPion/fNsigmaTOFvsPAntiPion", "NSigmaTOF AntiPion;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/AntiPion/fNsigmaTPCTOFvsPAntiPion", "NSigmaTPCTOF AntiPion;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); + + mHistManager.add("TrackCuts/AntiPion/fNsigmaTPCvsPAntiPionP", "NSigmaTPC AntiPion P;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/AntiPion/fNsigmaTOFvsPAntiPionP", "NSigmaTOF AntiPion P;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/AntiPion/fNsigmaTPCTOFvsPAntiPionP", "NSigmaTPCTOF AntiPion P;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); + + mHistManager.add("TrackCuts/AntiPion/fDCAxyAntiPion", "fDCAxy AntiPion;DCA_{XY};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); + mHistManager.add("TrackCuts/AntiPion/fDCAzAntiPion", "fDCAz AntiPion;DCA_{Z};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); + mHistManager.add("TrackCuts/AntiPion/fTPCsClsAntiPion", "fTPCsCls AntiPion;TPC Shared Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + mHistManager.add("TrackCuts/AntiPion/fTPCcRowsAntiPion", "fTPCcRows AntiPion;TPC Crossed Rows;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + mHistManager.add("TrackCuts/AntiPion/fTrkTPCfClsAntiPion", "fTrkTPCfCls AntiPion;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {{500, 0.0f, 3.0f}}); + mHistManager.add("TrackCuts/AntiPion/fTPCnclsAntiPion", "fTPCncls AntiPion;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + + // HNM + // omega QA + // daughter pos before + mHistManager.add("TrackCuts/HMN/Before/PosDaughter/fInvMass", "Invariant mass HMN Pos Daugh;M_{#pi};Entries", HistType::kTH1F, {{500, 0, 1}}); + mHistManager.add("TrackCuts/HMN/Before/PosDaughter/fPt", "Transverse momentum HMN Pos Daugh tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/HMN/Before/PosDaughter/fEta", "HMN Pos Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/HMN/Before/PosDaughter/fPhi", "Azimuthal angle of HMN Pos Daugh tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + // daughter neg before + mHistManager.add("TrackCuts/HMN/Before/NegDaughter/fInvMass", "Invariant mass HMN Neg Daugh;M_{#pi};Entries", HistType::kTH1F, {{500, 0, 1}}); + mHistManager.add("TrackCuts/HMN/Before/NegDaughter/fPt", "Transverse momentum HMN Neg Daugh tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/HMN/Before/NegDaughter/fEta", "HMN Neg Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/HMN/Before/NegDaughter/fPhi", "Azimuthal angle of HMN Neg Daugh tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + // HMNCand tracks before + mHistManager.add("TrackCuts/HMN/Before/fInvMass_tracks", "Invariant mass HMNCand;M_{#pi#pi#gammg#gamma};Entries", HistType::kTH1F, {{5000, 0, 5}}); + mHistManager.add("TrackCuts/HMN/Before/fPt_tracks", "Transverse momentum HMNCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/HMN/Before/fEta_tracks", "Pseudorapidity of HMNCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/HMN/Before/fPhi_tracks", "Azimuthal angle of HMNCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + // Right now we loose the information about the used tracks and gg properties after creating the HeavyNeutralMeson struct: Maybe it is better to keep track of these? + /*// daughter pos after + mHistManager.add("TrackCuts/omega/After/PosDaughter/fPt", "Transverse momentum omegaCand Pos Daugh tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/omega/After/PosDaughter/fEta", "omegaCandPos Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/omega/After/PosDaughter/fPhi", "Azimuthal angle of omegaCand Pos Daugh tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + // daughter neg after + mHistManager.add("TrackCuts/omega/After/NegDaughter/fPt", "Transverse momentum omegaCand Neg Daugh tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/omega/After/NegDaughter/fEta", "omegaCand Neg Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/omega/After/NegDaughter/fPhi", "Azimuthal angle of omegaCand Neg Daugh tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}});*/ + // omegaCand after + // HMNCand full information + mHistManager.add("TrackCuts/HMN/Before/PCM/fInvMass", "Invariant mass HMNCand;M_{#pi#pi#gammg#gamma};Entries", HistType::kTH1F, {{5000, 0, 5}}); + mHistManager.add("TrackCuts/HMN/Before/PCM/fPt", "Transverse momentum HMNCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/HMN/Before/PCM/fEta", "Pseudorapidity of HMNCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/HMN/Before/PCM/fPhi", "Azimuthal angle of HMNCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + mHistManager.add("TrackCuts/HMN/Before/EMC/fInvMass", "Invariant mass HMNCand;M_{#pi#pi#gammg#gamma};Entries", HistType::kTH1F, {{5000, 0, 5}}); + mHistManager.add("TrackCuts/HMN/Before/EMC/fPt", "Transverse momentum HMNCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/HMN/Before/EMC/fEta", "Pseudorapidity of HMNCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/HMN/Before/EMC/fPhi", "Azimuthal angle of HMNCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + mHistManager.add("TrackCuts/HMN/Before/PCMEMC/fInvMass", "Invariant mass HMNCand;M_{#pi#pi#gammg#gamma};Entries", HistType::kTH1F, {{5000, 0, 5}}); + mHistManager.add("TrackCuts/HMN/Before/PCMEMC/fPt", "Transverse momentum HMNCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/HMN/Before/PCMEMC/fEta", "Pseudorapidity of HMNCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/HMN/Before/PCMEMC/fPhi", "Azimuthal angle of HMNCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + // OmegaCand + mHistManager.add("TrackCuts/HMN/After/Omega/PCM/fInvMass", "Invariant mass omegaCand;M_{#pi#pi};Entries", HistType::kTH1F, {{5000, 0, 5}}); + mHistManager.add("TrackCuts/HMN/After/Omega/PCM/fPt", "Transverse momentum omegaCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/HMN/After/Omega/PCM/fEta", "Pseudorapidity of omegaCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/HMN/After/Omega/PCM/fPhi", "Azimuthal angle of omegaCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + mHistManager.add("TrackCuts/HMN/After/Omega/EMC/fInvMass", "Invariant mass omegaCand;M_{#pi#pi};Entries", HistType::kTH1F, {{5000, 0, 5}}); + mHistManager.add("TrackCuts/HMN/After/Omega/EMC/fPt", "Transverse momentum omegaCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/HMN/After/Omega/EMC/fEta", "Pseudorapidity of omegaCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/HMN/After/Omega/EMC/fPhi", "Azimuthal angle of omegaCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + // EtaPrimeCand + mHistManager.add("TrackCuts/HMN/After/EtaPrime/PCM/fInvMass", "Invariant mass EtaPrimeCand;M_{#pi#pi};Entries", HistType::kTH1F, {{5000, 0, 5}}); + mHistManager.add("TrackCuts/HMN/After/EtaPrime/PCM/fPt", "Transverse momentum EtaPrimeCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/HMN/After/EtaPrime/PCM/fEta", "Pseudorapidity of EtaPrimeCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/HMN/After/EtaPrime/PCM/fPhi", "Azimuthal angle of EtaPrimeCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + mHistManager.add("TrackCuts/HMN/After/EtaPrime/EMC/fInvMass", "Invariant mass EtaPrimeCand;M_{#pi#pi};Entries", HistType::kTH1F, {{5000, 0, 5}}); + mHistManager.add("TrackCuts/HMN/After/EtaPrime/EMC/fPt", "Transverse momentum EtaPrimeCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/HMN/After/EtaPrime/EMC/fEta", "Pseudorapidity of EtaPrimeCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/HMN/After/EtaPrime/EMC/fPhi", "Azimuthal angle of EtaPrimeCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + + // Trigger combs + // for ppomega + mHistManager.add("ppomega/fMultiplicity", "Multiplicity of all processed events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); + mHistManager.add("ppomega/fZvtx", "Zvtx of all processed events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); + + mHistManager.add("ppomega/fSE_particle_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("ppomega/fSE_Antiparticle_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("ppomega/fProtonPtVsQ3_EMC", "pT (proton) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); + mHistManager.add("ppomega/fOmegaCandPtVsQ3_EMC", "pT (omega) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); + mHistManager.add("ppomega/fAntiProtonPtVsQ3_EMC", "pT (antiproton) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); + + mHistManager.add("ppomega/fSE_particle_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("ppomega/fSE_Antiparticle_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("ppomega/fProtonPtVsQ3_PCM", "pT (proton) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); + mHistManager.add("ppomega/fOmegaCandPtVsQ3_PCM", "pT (omega) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); + mHistManager.add("ppomega/fAntiProtonPtVsQ3_PCM", "pT (antiproton) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); + // for ppetaprime + mHistManager.add("ppetaprime/fMultiplicity", "Multiplicity of all processed events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); + mHistManager.add("ppetaprime/fZvtx", "Zvtx of all processed events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); + + mHistManager.add("ppetaprime/fSE_particle_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("ppetaprime/fSE_Antiparticle_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("ppetaprime/fProtonPtVsQ3_EMC", "pT (proton) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); + mHistManager.add("ppetaprime/fEtaPrimeCandPtVsQ3_EMC", "pT (etaprime) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); + mHistManager.add("ppetaprime/fAntiProtonPtVsQ3_EMC", "pT (antiproton) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); + + mHistManager.add("ppetaprime/fSE_particle_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("ppetaprime/fSE_Antiparticle_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("ppetaprime/fProtonPtVsQ3_PCM", "pT (proton) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); + mHistManager.add("ppetaprime/fEtaPrimeCandPtVsQ3_PCM", "pT (etaprime) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); + mHistManager.add("ppetaprime/fAntiProtonPtVsQ3_PCM", "pT (antiproton) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); + + // two body + // omegad + mHistManager.add("omegad/fMultiplicity", "Multiplicity of all processed events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); + mHistManager.add("omegad/fZvtx", "Zvtx of all processed events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); + + mHistManager.add("omegad/fSE_particle_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("omegad/fSE_Antiparticle_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("omegad/fomegaPtVskstar_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("omegad/fDeuteronPtVskstar_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("omegad/fAntiDeuteronPtVskstar_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("omegad/fSE_particle_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("omegad/fSE_Antiparticle_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("omegad/fomegaPtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("omegad/fDeuteronPtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("omegad/fAntiDeuteronPtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + + // etaprimed + mHistManager.add("etaprimed/fMultiplicity", "Multiplicity of all processed events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); + mHistManager.add("etaprimed/fZvtx", "Zvtx of all processed events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); + mHistManager.add("etaprimed/fSE_particle_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("etaprimed/fSE_Antiparticle_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("etaprimed/fetaprimePtVskstar_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("etaprimed/fDeuteronPtVskstar_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("etaprimed/fAntiDeuteronPtVskstar_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("etaprimed/fSE_particle_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("etaprimed/fSE_Antiparticle_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("etaprimed/fetaprimePtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("etaprimed/fDeuteronPtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("etaprimed/fAntiDeuteronPtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + + // omegap + mHistManager.add("omegap/fMultiplicity", "Multiplicity of all processed events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); + mHistManager.add("omegap/fZvtx", "Zvtx of all processed events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); + + mHistManager.add("omegap/fSE_particle_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("omegap/fSE_Antiparticle_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("omegap/fomegaPtVskstar_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("omegap/fProtonPtVskstar_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("omegap/fAntiProtonPtVskstar_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("omegap/fSE_particle_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("omegap/fSE_Antiparticle_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("omegap/fomegaPtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("omegap/fProtonPtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("omegap/fAntiProtonPtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + + // etaprimep + mHistManager.add("etaprimep/fMultiplicity", "Multiplicity of all processed events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); + mHistManager.add("etaprimep/fZvtx", "Zvtx of all processed events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); + + mHistManager.add("etaprimep/fSE_particle_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("etaprimep/fSE_Antiparticle_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("etaprimep/fetaprimePtVskstar_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("etaprimep/fProtonPtVskstar_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("etaprimep/fAntiProtonPtVskstar_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("etaprimep/fSE_particle_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("etaprimep/fSE_Antiparticle_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("etaprimep/fetaprimePtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("etaprimep/fProtonPtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add("etaprimep/fAntiProtonPtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + } Preslice perCollision_pcm = aod::v0photonkf::collisionId; Preslice perCollision_emc = aod::skimmedcluster::collisionId; - void process(MyCollisions::iterator const& collision, MyBCs const&, aod::SkimEMCClusters const& clusters, aod::V0PhotonsKF const& v0s, SelectedTracks const& tracks) + void process(aod::MyCollision const& collision, aod::MyBCs const&, aod::SkimEMCClusters const& clusters, aod::V0PhotonsKF const& v0s, aod::SelectedTracks const& tracks) { + // inlcude ITS PID information + auto tracksWithItsPid = soa::Attach(tracks); + mHistManager.fill(HIST("Event/hCollisionCounter"), 0.); - if (collision.foundBC_as().alias_bit(kTVXinEMC)) + // QA all evts + mHistManager.fill(HIST("fProcessedEvents"), 0); + mHistManager.fill(HIST("EventCuts/fMultiplicityBefore"), collision.multNTracksPV()); + mHistManager.fill(HIST("EventCuts/fZvtxBefore"), collision.posZ()); + + // Ensure evts are consistent with Sel8 and Vtx-z selection + if (!isSelectedEvent(collision)) { + return; + } + + // QA accepted evts + mHistManager.fill(HIST("EventCuts/fMultiplicityAfter"), collision.multNTracksPV()); + mHistManager.fill(HIST("EventCuts/fZvtxAfter"), collision.posZ()); + + colContainsPCMOmega = colContainsEMCOmega = colContainsPCMEtaPrime = colContainsEMCEtaPrime = false; + bool keepFemtoEvent[CFTrigger::kNFemtoTriggers] = {false, false, false, false, false, false}; + int lowMomentumMultiplets[CFTrigger::kNFemtoTriggers] = {0, 0, 0, 0, 0, 0}; + + // clean vecs + // HNM candidates + etaPrimeEMC.clear(); + etaPrimePCM.clear(); + omegaEMC.clear(); + omegaPCM.clear(); + // Femto partners + proton.clear(); + antiproton.clear(); + deuteron.clear(); + antideuteron.clear(); + // Pions for HNM + pion.clear(); + antipion.clear(); + vHNMs.clear(); + // vGGs vector is cleared in reconstructGGs. + + if (collision.foundBC_as().alias_bit(kTVXinEMC)) { mHistManager.fill(HIST("Event/hCollisionCounter"), 1.); + mHistManager.fill(HIST("fProcessedEvents"), 8); + } auto v0sInThisCollision = v0s.sliceBy(perCollision_pcm, collision.globalIndex()); auto clustersInThisCollision = clusters.sliceBy(perCollision_emc, collision.globalIndex()); mHistManager.fill(HIST("Event/nClustersVsV0s"), clustersInThisCollision.size(), v0sInThisCollision.size()); - mHistManager.fill(HIST("Event/nTracks"), tracks.size()); - - colContainsPCMOmega = colContainsEMCOmega = colContainsPCMEtaPrime = colContainsEMCEtaPrime = false; + mHistManager.fill(HIST("Event/nTracks"), tracksWithItsPid.size()); hnmutilities::reconstructGGs(clustersInThisCollision, v0sInThisCollision, vGGs); processGGs(vGGs); - hnmutilities::reconstructHeavyNeutralMesons(tracks, vGGs, vHNMs); - processHNMs(vHNMs); + // hnmutilities::reconstructHeavyNeutralMesons(tracks, vGGs, vHNMs); + // processHNMs(vHNMs); + + bool isProton = false; + bool isDeuteron = false; + bool isPion = false; + + // #femtoPart + for (const auto& track : tracksWithItsPid) { + // General QA + mHistManager.fill(HIST("TrackCuts/TracksBefore/fPtTrackBefore"), track.pt()); + mHistManager.fill(HIST("TrackCuts/TracksBefore/fEtaTrackBefore"), track.eta()); + mHistManager.fill(HIST("TrackCuts/TracksBefore/fPhiTrackBefore"), track.phi()); + // Fill PID info + if (track.sign() > 0) { + mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignal"), track.tpcInnerParam(), track.tpcSignal()); + mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalP"), track.p(), track.tpcSignal()); + mHistManager.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationPos"), track.p(), track.tpcInnerParam()); + } + if (track.sign() < 0) { + + mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAnti"), track.tpcInnerParam(), track.tpcSignal()); + mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAntiP"), track.p(), track.tpcSignal()); + mHistManager.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationNeg"), track.p(), track.tpcInnerParam()); + } + + // #fill protons and deuterons + isProton = (isSelectedTrackPID(track, CFTrigger::kProton) && isSelectedTrack(track, CFTrigger::kProton)); + isDeuteron = (isSelectedTrackPID(track, CFTrigger::kDeuteron) && isSelectedTrack(track, CFTrigger::kDeuteron)); + isPion = (isSelectedTrackPID(track, CFTrigger::kPion) && isSelectedTrack(track, CFTrigger::kPion)); + + if (track.sign() > 0) { // part + if (isProton) { + proton.emplace_back(track.pt(), track.eta(), track.phi(), mMassProton); + mHistManager.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationAfterCutsProton"), track.p(), track.tpcInnerParam()); + + mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalProton"), track.tpcInnerParam(), track.tpcSignal()); + mHistManager.fill(HIST("TrackCuts/Proton/fPProton"), track.p()); + mHistManager.fill(HIST("TrackCuts/Proton/fPTPCProton"), track.tpcInnerParam()); + mHistManager.fill(HIST("TrackCuts/Proton/fPtProton"), track.pt()); + mHistManager.fill(HIST("TrackCuts/Proton/fMomCorProtonDif"), track.p(), track.tpcInnerParam() - track.p()); + mHistManager.fill(HIST("TrackCuts/Proton/fMomCorProtonRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + mHistManager.fill(HIST("TrackCuts/Proton/fEtaProton"), track.eta()); + mHistManager.fill(HIST("TrackCuts/Proton/fPhiProton"), track.phi()); + mHistManager.fill(HIST("TrackCuts/Proton/fNsigmaTPCvsPProton"), track.tpcInnerParam(), track.tpcNSigmaPr()); + mHistManager.fill(HIST("TrackCuts/Proton/fNsigmaTOFvsPProton"), track.tpcInnerParam(), track.tofNSigmaPr()); + auto nSigmaTrackTPCTOF = std::sqrt(std::pow(track.tpcNSigmaPr(), 2) + std::pow(track.tofNSigmaPr(), 2)); + mHistManager.fill(HIST("TrackCuts/Proton/fNsigmaTPCTOFvsPProton"), track.tpcInnerParam(), std::sqrt(std::pow(track.tpcNSigmaPr() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPr() - nSigmaTrackTPCTOF, 2))); + mHistManager.fill(HIST("TrackCuts/Proton/fNsigmaITSvsPProton"), track.p(), track.itsNSigmaPr()); + + mHistManager.fill(HIST("TrackCuts/Proton/fNsigmaTPCvsPProtonP"), track.p(), track.tpcNSigmaPr()); + mHistManager.fill(HIST("TrackCuts/Proton/fNsigmaTOFvsPProtonP"), track.p(), track.tofNSigmaPr()); + mHistManager.fill(HIST("TrackCuts/Proton/fNsigmaTPCTOFvsPProtonP"), track.p(), std::sqrt(std::pow(track.tpcNSigmaPr() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPr() - nSigmaTrackTPCTOF, 2))); + + mHistManager.fill(HIST("TrackCuts/Proton/fDCAxyProton"), track.dcaXY()); + mHistManager.fill(HIST("TrackCuts/Proton/fDCAzProton"), track.dcaZ()); + mHistManager.fill(HIST("TrackCuts/Proton/fTPCsClsProton"), track.tpcNClsShared()); + mHistManager.fill(HIST("TrackCuts/Proton/fTPCcRowsProton"), track.tpcNClsCrossedRows()); + mHistManager.fill(HIST("TrackCuts/Proton/fTrkTPCfClsProton"), track.tpcCrossedRowsOverFindableCls()); + mHistManager.fill(HIST("TrackCuts/Proton/fTPCnclsProton"), track.tpcNClsFound()); + } + if (isDeuteron) { + deuteron.emplace_back(track.pt(), track.eta(), track.phi(), mMassDeuteron); + mHistManager.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationAfterCutsDeuteron"), track.p(), track.tpcInnerParam()); + + mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalDeuteron"), track.tpcInnerParam(), track.tpcSignal()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fPtDeuteron"), track.pt()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fMomCorDeuteronDif"), track.p(), track.tpcInnerParam() - track.p()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fMomCorDeuteronRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fEtaDeuteron"), track.eta()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fPhiDeuteron"), track.phi()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fNsigmaTPCvsPDeuteron"), track.tpcInnerParam(), track.tpcNSigmaDe()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fNsigmaTOFvsPDeuteron"), track.tpcInnerParam(), track.tofNSigmaDe()); + auto nSigmaTrackTPCTOF = std::sqrt(std::pow(track.tpcNSigmaDe(), 2) + std::pow(track.tofNSigmaDe(), 2)); + mHistManager.fill(HIST("TrackCuts/Deuteron/fNsigmaTPCTOFvsPDeuteron"), track.tpcInnerParam(), std::sqrt(std::pow(track.tpcNSigmaDe() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaDe() - nSigmaTrackTPCTOF, 2))); + mHistManager.fill(HIST("TrackCuts/Deuteron/fNsigmaITSvsPDeuteron"), track.p(), track.itsNSigmaDe()); + + mHistManager.fill(HIST("TrackCuts/Deuteron/fNsigmaTPCvsPDeuteronP"), track.p(), track.tpcNSigmaDe()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fNsigmaTOFvsPDeuteronP"), track.p(), track.tofNSigmaDe()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fNsigmaTPCTOFvsPDeuteronP"), track.p(), std::sqrt(std::pow(track.tpcNSigmaDe() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaDe() - nSigmaTrackTPCTOF, 2))); + + mHistManager.fill(HIST("TrackCuts/Deuteron/fDCAxyDeuteron"), track.dcaXY()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fDCAzDeuteron"), track.dcaZ()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fTPCsClsDeuteron"), track.tpcNClsShared()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fTPCcRowsDeuteron"), track.tpcNClsCrossedRows()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fTrkTPCfClsDeuteron"), track.tpcCrossedRowsOverFindableCls()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fTPCnclsDeuteron"), track.tpcNClsFound()); + } + if (isPion) { + pion.emplace_back(track.pt(), track.eta(), track.phi(), mMassPionCharged); + mHistManager.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationAfterCutsPion"), track.p(), track.tpcInnerParam()); + + mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalPion"), track.tpcInnerParam(), track.tpcSignal()); + mHistManager.fill(HIST("TrackCuts/Pion/fPPion"), track.p()); + mHistManager.fill(HIST("TrackCuts/Pion/fPTPCPion"), track.tpcInnerParam()); + mHistManager.fill(HIST("TrackCuts/Pion/fPtPion"), track.pt()); + mHistManager.fill(HIST("TrackCuts/Pion/fMomCorPionDif"), track.p(), track.tpcInnerParam() - track.p()); + mHistManager.fill(HIST("TrackCuts/Pion/fMomCorPionRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + mHistManager.fill(HIST("TrackCuts/Pion/fEtaPion"), track.eta()); + mHistManager.fill(HIST("TrackCuts/Pion/fPhiPion"), track.phi()); + mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTPCvsPPion"), track.tpcInnerParam(), track.tpcNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTOFvsPPion"), track.tpcInnerParam(), track.tofNSigmaPi()); + auto nSigmaTrackTPCTOF = std::sqrt(std::pow(track.tpcNSigmaPi(), 2) + std::pow(track.tofNSigmaPi(), 2)); + mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTPCTOFvsPPion"), track.tpcInnerParam(), std::sqrt(std::pow(track.tpcNSigmaPi() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPi() - nSigmaTrackTPCTOF, 2))); + + mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTPCvsPPionP"), track.p(), track.tpcNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTOFvsPPionP"), track.p(), track.tofNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTPCTOFvsPPionP"), track.p(), std::sqrt(std::pow(track.tpcNSigmaPi() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPi() - nSigmaTrackTPCTOF, 2))); + + mHistManager.fill(HIST("TrackCuts/Pion/fDCAxyPion"), track.dcaXY()); + mHistManager.fill(HIST("TrackCuts/Pion/fDCAzPion"), track.dcaZ()); + mHistManager.fill(HIST("TrackCuts/Pion/fTPCsClsPion"), track.tpcNClsShared()); + mHistManager.fill(HIST("TrackCuts/Pion/fTPCcRowsPion"), track.tpcNClsCrossedRows()); + mHistManager.fill(HIST("TrackCuts/Pion/fTrkTPCfClsPion"), track.tpcCrossedRowsOverFindableCls()); + mHistManager.fill(HIST("TrackCuts/Pion/fTPCnclsPion"), track.tpcNClsFound()); + } + + } else { // antipart + if (isProton) { + antiproton.emplace_back(track.pt(), track.eta(), track.phi(), mMassProton); + mHistManager.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationAfterCutsAntiProton"), track.p(), track.tpcInnerParam()); + + mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAntiProton"), track.tpcInnerParam(), track.tpcSignal()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fPtAntiProton"), track.pt()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fMomCorAntiProtonDif"), track.p(), track.tpcInnerParam() - track.p()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fMomCorAntiProtonRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fEtaAntiProton"), track.eta()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fPhiAntiProton"), track.phi()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fNsigmaTPCvsPAntiProton"), track.tpcInnerParam(), track.tpcNSigmaPr()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fNsigmaTOFvsPAntiProton"), track.tpcInnerParam(), track.tofNSigmaPr()); + auto nSigmaTrackTPCTOF = std::sqrt(std::pow(track.tpcNSigmaPr(), 2) + std::pow(track.tofNSigmaPr(), 2)); + mHistManager.fill(HIST("TrackCuts/AntiProton/fNsigmaTPCTOFvsPAntiProton"), track.tpcInnerParam(), std::sqrt(std::pow(track.tpcNSigmaPr() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPr() - nSigmaTrackTPCTOF, 2))); + mHistManager.fill(HIST("TrackCuts/AntiProton/fNsigmaITSvsPAntiProton"), track.p(), track.itsNSigmaPr()); + + mHistManager.fill(HIST("TrackCuts/AntiProton/fNsigmaTPCvsPAntiProtonP"), track.p(), track.tpcNSigmaPr()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fNsigmaTOFvsPAntiProtonP"), track.p(), track.tofNSigmaPr()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fNsigmaTPCTOFvsPAntiProtonP"), track.p(), std::sqrt(std::pow(track.tpcNSigmaPr() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPr() - nSigmaTrackTPCTOF, 2))); + + mHistManager.fill(HIST("TrackCuts/AntiProton/fDCAxyAntiProton"), track.dcaXY()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fDCAzAntiProton"), track.dcaZ()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fTPCsClsAntiProton"), track.tpcNClsShared()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fTPCcRowsAntiProton"), track.tpcNClsCrossedRows()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fTrkTPCfClsAntiProton"), track.tpcCrossedRowsOverFindableCls()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fTPCnclsAntiProton"), track.tpcNClsFound()); + } + if (isDeuteron) { + antideuteron.emplace_back(track.pt(), track.eta(), track.phi(), mMassDeuteron); + mHistManager.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationAfterCutsAntiDeuteron"), track.p(), track.tpcInnerParam()); + + mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAntiDeuteron"), track.tpcInnerParam(), track.tpcSignal()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fPtAntiDeuteron"), track.pt()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fMomCorAntiDeuteronDif"), track.p(), track.tpcInnerParam() - track.p()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fMomCorAntiDeuteronRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fEtaAntiDeuteron"), track.eta()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fPhiAntiDeuteron"), track.phi()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaTPCvsPAntiDeuteron"), track.tpcInnerParam(), track.tpcNSigmaDe()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaTOFvsPAntiDeuteron"), track.tpcInnerParam(), track.tofNSigmaDe()); + auto nSigmaTrackTPCTOF = std::sqrt(std::pow(track.tpcNSigmaDe(), 2) + std::pow(track.tofNSigmaDe(), 2)); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaTPCTOFvsPAntiDeuteron"), track.tpcInnerParam(), std::sqrt(std::pow(track.tpcNSigmaDe() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaDe() - nSigmaTrackTPCTOF, 2))); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaITSvsPAntiDeuteron"), track.p(), track.itsNSigmaDe()); + + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaTPCvsPAntiDeuteronP"), track.p(), track.tpcNSigmaDe()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaTOFvsPAntiDeuteronP"), track.p(), track.tofNSigmaDe()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaTPCTOFvsPAntiDeuteronP"), track.p(), std::sqrt(std::pow(track.tpcNSigmaDe() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaDe() - nSigmaTrackTPCTOF, 2))); + + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fDCAxyAntiDeuteron"), track.dcaXY()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fDCAzAntiDeuteron"), track.dcaZ()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fTPCsClsAntiDeuteron"), track.tpcNClsShared()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fTPCcRowsAntiDeuteron"), track.tpcNClsCrossedRows()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fTrkTPCfClsAntiDeuteron"), track.tpcCrossedRowsOverFindableCls()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fTPCnclsAntiDeuteron"), track.tpcNClsFound()); + } + if (isPion) { + antipion.emplace_back(track.pt(), track.eta(), track.phi(), mMassPionCharged); + mHistManager.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationAfterCutsAntiPion"), track.p(), track.tpcInnerParam()); + + mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAntiPion"), track.tpcInnerParam(), track.tpcSignal()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fPtAntiPion"), track.pt()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fMomCorAntiPionDif"), track.p(), track.tpcInnerParam() - track.p()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fMomCorAntiPionRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fEtaAntiPion"), track.eta()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fPhiAntiPion"), track.phi()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCvsPAntiPion"), track.tpcInnerParam(), track.tpcNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTOFvsPAntiPion"), track.tpcInnerParam(), track.tofNSigmaPi()); + auto nSigmaTrackTPCTOF = std::sqrt(std::pow(track.tpcNSigmaPi(), 2) + std::pow(track.tofNSigmaPi(), 2)); + mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCTOFvsPAntiPion"), track.tpcInnerParam(), std::sqrt(std::pow(track.tpcNSigmaPi() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPi() - nSigmaTrackTPCTOF, 2))); + + mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCvsPAntiPionP"), track.p(), track.tpcNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTOFvsPAntiPionP"), track.p(), track.tofNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCTOFvsPAntiPionP"), track.p(), std::sqrt(std::pow(track.tpcNSigmaPi() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPi() - nSigmaTrackTPCTOF, 2))); + + mHistManager.fill(HIST("TrackCuts/AntiPion/fDCAxyAntiPion"), track.dcaXY()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fDCAzAntiPion"), track.dcaZ()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fTPCsClsAntiPion"), track.tpcNClsShared()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fTPCcRowsAntiPion"), track.tpcNClsCrossedRows()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fTrkTPCfClsAntiPion"), track.tpcCrossedRowsOverFindableCls()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fTPCnclsAntiPion"), track.tpcNClsFound()); + } + } + } + + // reconstruct HMN candidates + for (const auto& posPion : pion) { + for (const auto& negPion : antipion) { + hnmutilities::reconstructHeavyNeutralMesons(posPion, negPion, vGGs, vHNMs); + + ROOT::Math::PtEtaPhiMVector temp = posPion + negPion; + + mHistManager.fill(HIST("TrackCuts/HMN/Before/fInvMass_tracks"), temp.M()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/fPt_tracks"), temp.pt()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/fEta_tracks"), temp.eta()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/fPhi_tracks"), translatePhi(temp.phi())); + + mHistManager.fill(HIST("TrackCuts/HMN/Before/PosDaughter/fInvMass"), posPion.M()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/PosDaughter/fPt"), posPion.pt()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/PosDaughter/fEta"), posPion.eta()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/PosDaughter/fPhi"), translatePhi(posPion.phi())); + + mHistManager.fill(HIST("TrackCuts/HMN/Before/NegDaughter/fInvMass"), negPion.M()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/NegDaughter/fPt"), negPion.pt()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/NegDaughter/fEta"), negPion.eta()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/NegDaughter/fPhi"), translatePhi(negPion.phi())); + } + } + + processHNMs(vHNMs); // Contains QA of HMN properties + + // build triplets + float Q3 = 999.f, kstar = 999.f; + // omega + if (ConfTriggerSwitches->get("Switch", "PPOmega") > 0.) { + // ppomega trigger + + for (size_t i = 0; i < proton.size(); ++i) { + for (size_t j = i + 1; j < proton.size(); ++j) { + const auto& Proton1 = proton[i]; + const auto& Proton2 = proton[j]; + // PCM + for (const auto& omegaParticles : omegaPCM) { + + Q3 = getQ3(Proton1, Proton2, omegaParticles); + + mHistManager.fill(HIST("ppomega/fSE_particle_PCM"), Q3); + mHistManager.fill(HIST("ppomega/fProtonPtVsQ3_PCM"), Q3, Proton1.Pt()); + mHistManager.fill(HIST("ppomega/fProtonPtVsQ3_PCM"), Q3, Proton2.Pt()); + mHistManager.fill(HIST("ppomega/fOmegaCandPtVsQ3_PCM"), Q3, omegaParticles.Pt()); - tags(colContainsPCMOmega, colContainsEMCOmega, colContainsPCMEtaPrime, colContainsEMCEtaPrime); + if (Q3 < ConfKinematicLimits->get(static_cast(0), CFTrigger::kPPOmega)) { + lowMomentumMultiplets[CFTrigger::kPPOmega] += 1; + } + } + // EMC + for (const auto& omegaParticles : omegaEMC) { + + Q3 = getQ3(Proton1, Proton2, omegaParticles); + + mHistManager.fill(HIST("ppomega/fSE_particle_EMC"), Q3); + mHistManager.fill(HIST("ppomega/fProtonPtVsQ3_EMC"), Q3, Proton1.Pt()); + mHistManager.fill(HIST("ppomega/fProtonPtVsQ3_EMC"), Q3, Proton2.Pt()); + mHistManager.fill(HIST("ppomega/fOmegaCandPtVsQ3_EMC"), Q3, omegaParticles.Pt()); + + if (Q3 < ConfKinematicLimits->get(static_cast(0), CFTrigger::kPPOmega)) { + lowMomentumMultiplets[CFTrigger::kPPOmega] += 1; + } + } + } + } + // apapomega trigger + // PCM + for (size_t i = 0; i < antiproton.size(); ++i) { + for (size_t j = i + 1; j < antiproton.size(); ++j) { + const auto& antiProton1 = antiproton[i]; + const auto& antiProton2 = antiproton[j]; + // PCM + for (const auto& omegaParticles : omegaPCM) { + + Q3 = getQ3(antiProton1, antiProton2, omegaParticles); + + mHistManager.fill(HIST("ppomega/fSE_Antiparticle_PCM"), Q3); + mHistManager.fill(HIST("ppomega/fAntiProtonPtVsQ3_PCM"), Q3, antiProton1.Pt()); + mHistManager.fill(HIST("ppomega/fAntiProtonPtVsQ3_PCM"), Q3, antiProton2.Pt()); + mHistManager.fill(HIST("ppomega/fOmegaCandPtVsQ3_PCM"), Q3, omegaParticles.Pt()); + + if (Q3 < ConfKinematicLimits->get(static_cast(0), CFTrigger::kPPOmega)) { + lowMomentumMultiplets[CFTrigger::kPPOmega] += 1; + } + } + // EMC + for (const auto& omegaParticles : omegaEMC) { + + Q3 = getQ3(antiProton1, antiProton2, omegaParticles); + + mHistManager.fill(HIST("ppomega/fSE_Antiparticle_EMC"), Q3); + mHistManager.fill(HIST("ppomega/fAntiProtonPtVsQ3_EMC"), Q3, antiProton1.Pt()); + mHistManager.fill(HIST("ppomega/fAntiProtonPtVsQ3_EMC"), Q3, antiProton2.Pt()); + mHistManager.fill(HIST("ppomega/fOmegaCandPtVsQ3_EMC"), Q3, omegaParticles.Pt()); + + if (Q3 < ConfKinematicLimits->get(static_cast(0), CFTrigger::kPPOmega)) { + lowMomentumMultiplets[CFTrigger::kPPOmega] += 1; + } + } + } + } + } + + // etaprime + if (ConfTriggerSwitches->get("Switch", "PPEtaPrime") > 0.) { + // ppetaprimetrigger + for (size_t i = 0; i < proton.size(); ++i) { + for (size_t j = i + 1; j < proton.size(); ++j) { + const auto& Proton1 = proton[i]; + const auto& Proton2 = proton[j]; + // PCM + for (const auto& etaParticles : etaPrimePCM) { + + Q3 = getQ3(Proton1, Proton2, etaParticles); + + mHistManager.fill(HIST("ppetaprime/fSE_particle_PCM"), Q3); + mHistManager.fill(HIST("ppetaprime/fProtonPtVsQ3_PCM"), Q3, Proton1.Pt()); + mHistManager.fill(HIST("ppetaprime/fProtonPtVsQ3_PCM"), Q3, Proton2.Pt()); + mHistManager.fill(HIST("ppetaprime/fEtaPrimeCandPtVsQ3_PCM"), Q3, etaParticles.Pt()); + + if (Q3 < ConfKinematicLimits->get(static_cast(0), CFTrigger::kPPEtaPrime)) { + lowMomentumMultiplets[CFTrigger::kPPEtaPrime] += 1; + } + } + // EMC + for (const auto& etaParticles : etaPrimeEMC) { + + Q3 = getQ3(Proton1, Proton2, etaParticles); + + mHistManager.fill(HIST("ppetaprime/fSE_particle_EMC"), Q3); + mHistManager.fill(HIST("ppetaprime/fProtonPtVsQ3_EMC"), Q3, Proton1.Pt()); + mHistManager.fill(HIST("ppetaprime/fProtonPtVsQ3_EMC"), Q3, Proton2.Pt()); + mHistManager.fill(HIST("ppetaprime/fEtaPrimeCandPtVsQ3_EMC"), Q3, etaParticles.Pt()); + + if (Q3 < ConfKinematicLimits->get(static_cast(0), CFTrigger::kPPEtaPrime)) { + lowMomentumMultiplets[CFTrigger::kPPEtaPrime] += 1; + } + } + } + } + // apapetaprime trigger + for (size_t i = 0; i < antiproton.size(); ++i) { + for (size_t j = i + 1; j < antiproton.size(); ++j) { + const auto& antiProton1 = antiproton[i]; + const auto& antiProton2 = antiproton[j]; + // PCM + for (const auto& etaParticles : etaPrimePCM) { + + Q3 = getQ3(antiProton1, antiProton2, etaParticles); + + mHistManager.fill(HIST("ppetaprime/fSE_Antiparticle_PCM"), Q3); + mHistManager.fill(HIST("ppetaprime/fAntiProtonPtVsQ3_PCM"), Q3, antiProton1.Pt()); + mHistManager.fill(HIST("ppetaprime/fAntiProtonPtVsQ3_PCM"), Q3, antiProton2.Pt()); + mHistManager.fill(HIST("ppetaprime/fEtaPrimeCandPtVsQ3_PCM"), Q3, etaParticles.Pt()); + + if (Q3 < ConfKinematicLimits->get(static_cast(0), CFTrigger::kPPEtaPrime)) { + lowMomentumMultiplets[CFTrigger::kPPEtaPrime] += 1; + } + } + // EMC + for (const auto& etaParticles : etaPrimeEMC) { + + Q3 = getQ3(antiProton1, antiProton2, etaParticles); + + mHistManager.fill(HIST("ppetaprime/fSE_Antiparticle_EMC"), Q3); + mHistManager.fill(HIST("ppetaprime/fAntiProtonPtVsQ3_EMC"), Q3, antiProton1.Pt()); + mHistManager.fill(HIST("ppetaprime/fAntiProtonPtVsQ3_EMC"), Q3, antiProton2.Pt()); + mHistManager.fill(HIST("ppetaprime/fEtaPrimeCandPtVsQ3_EMC"), Q3, etaParticles.Pt()); + + if (Q3 < ConfKinematicLimits->get(static_cast(0), CFTrigger::kPPEtaPrime)) { + lowMomentumMultiplets[CFTrigger::kPPEtaPrime] += 1; + } + } + } + } + } + + // build pairs + if (ConfTriggerSwitches->get("Switch", "Omegad") > 0.) { + // PCM + // omegad trigger + for (auto iomega = omegaPCM.begin(); iomega != omegaPCM.end(); ++iomega) { + for (auto iDeuteron = deuteron.begin(); iDeuteron != deuteron.end(); ++iDeuteron) { + kstar = getkstar(*iomega, *iDeuteron); + mHistManager.fill(HIST("omegad/fSE_particle_PCM"), kstar); + mHistManager.fill(HIST("omegad/fomegaPtVskstar_PCM"), kstar, (*iomega).Pt()); + mHistManager.fill(HIST("omegad/fDeuteronPtVskstar_PCM"), kstar, (*iDeuteron).Pt()); + if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kOmegaD)) { + lowMomentumMultiplets[CFTrigger::kOmegaD] += 1; + } + } + // omegaAd trigger + for (auto iAntiDeuteron = antideuteron.begin(); iAntiDeuteron != antideuteron.end(); ++iAntiDeuteron) { + kstar = getkstar(*iomega, *iAntiDeuteron); + mHistManager.fill(HIST("omegad/fSE_Antiparticle_PCM"), kstar); + mHistManager.fill(HIST("omegad/fomegaPtVskstar_PCM"), kstar, (*iomega).Pt()); + mHistManager.fill(HIST("omegad/fAntiDeuteronPtVskstar_PCM"), kstar, (*iAntiDeuteron).Pt()); + if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kOmegaD)) { + lowMomentumMultiplets[CFTrigger::kOmegaD] += 1; + } + } + } + // EMC + // omegad trigger + for (auto iomega = omegaEMC.begin(); iomega != omegaEMC.end(); ++iomega) { + for (auto iDeuteron = deuteron.begin(); iDeuteron != deuteron.end(); ++iDeuteron) { + kstar = getkstar(*iomega, *iDeuteron); + mHistManager.fill(HIST("omegad/fSE_particle_EMC"), kstar); + mHistManager.fill(HIST("omegad/fomegaPtVskstar_EMC"), kstar, (*iomega).Pt()); + mHistManager.fill(HIST("omegad/fDeuteronPtVskstar_EMC"), kstar, (*iDeuteron).Pt()); + if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kOmegaD)) { + lowMomentumMultiplets[CFTrigger::kOmegaD] += 1; + } + } + // omegaAd trigger + for (auto iAntiDeuteron = antideuteron.begin(); iAntiDeuteron != antideuteron.end(); ++iAntiDeuteron) { + kstar = getkstar(*iomega, *iAntiDeuteron); + mHistManager.fill(HIST("omegad/fSE_Antiparticle_EMC"), kstar); + mHistManager.fill(HIST("omegad/fomegaPtVskstar_EMC"), kstar, (*iomega).Pt()); + mHistManager.fill(HIST("omegad/fAntiDeuteronPtVskstar_EMC"), kstar, (*iAntiDeuteron).Pt()); + if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kOmegaD)) { + lowMomentumMultiplets[CFTrigger::kOmegaD] += 1; + } + } + } + } + if (ConfTriggerSwitches->get("Switch", "EtaPrimed") > 0.) { + // PCM + // etaPrimed trigger + for (auto ietaprime = etaPrimePCM.begin(); ietaprime != etaPrimePCM.end(); ++ietaprime) { + for (auto iDeuteron = deuteron.begin(); iDeuteron != deuteron.end(); ++iDeuteron) { + kstar = getkstar(*ietaprime, *iDeuteron); + mHistManager.fill(HIST("etaprimed/fSE_particle_PCM"), kstar); + mHistManager.fill(HIST("etaprimed/fetaprimePtVskstar_PCM"), kstar, (*ietaprime).Pt()); + mHistManager.fill(HIST("etaprimed/fDeuteronPtVskstar_PCM"), kstar, (*iDeuteron).Pt()); + if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kEtaPrimeD)) { + lowMomentumMultiplets[CFTrigger::kEtaPrimeD] += 1; + } + } + // etaPrimeAd trigger + for (auto iAntiDeuteron = antideuteron.begin(); iAntiDeuteron != antideuteron.end(); ++iAntiDeuteron) { + kstar = getkstar(*ietaprime, *iAntiDeuteron); + mHistManager.fill(HIST("etaprimed/fSE_Antiparticle_PCM"), kstar); + mHistManager.fill(HIST("etaprimed/fetaprimePtVskstar_PCM"), kstar, (*ietaprime).Pt()); + mHistManager.fill(HIST("etaprimed/fAntiDeuteronPtVskstar_PCM"), kstar, (*iAntiDeuteron).Pt()); + if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kEtaPrimeD)) { + lowMomentumMultiplets[CFTrigger::kEtaPrimeD] += 1; + } + } + } + // EMC + // etaPrimed trigger + for (auto ietaprime = etaPrimeEMC.begin(); ietaprime != etaPrimeEMC.end(); ++ietaprime) { + for (auto iDeuteron = deuteron.begin(); iDeuteron != deuteron.end(); ++iDeuteron) { + kstar = getkstar(*ietaprime, *iDeuteron); + mHistManager.fill(HIST("etaprimed/fSE_particle_EMC"), kstar); + mHistManager.fill(HIST("etaprimed/fetaprimePtVskstar_EMC"), kstar, (*ietaprime).Pt()); + mHistManager.fill(HIST("etaprimed/fDeuteronPtVskstar_EMC"), kstar, (*iDeuteron).Pt()); + if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kEtaPrimeD)) { + lowMomentumMultiplets[CFTrigger::kEtaPrimeD] += 1; + } + } + // etaPrimeAd trigger + for (auto iAntiDeuteron = antideuteron.begin(); iAntiDeuteron != antideuteron.end(); ++iAntiDeuteron) { + kstar = getkstar(*ietaprime, *iAntiDeuteron); + mHistManager.fill(HIST("etaprimed/fSE_Antiparticle_EMC"), kstar); + mHistManager.fill(HIST("etaprimed/fetaprimePtVskstar_EMC"), kstar, (*ietaprime).Pt()); + mHistManager.fill(HIST("etaprimed/fAntiDeuteronPtVskstar_EMC"), kstar, (*iAntiDeuteron).Pt()); + if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kEtaPrimeD)) { + lowMomentumMultiplets[CFTrigger::kEtaPrimeD] += 1; + } + } + } + } + if (ConfTriggerSwitches->get("Switch", "OmegaP") > 0.) { + // PCM + // omegap trigger + for (auto iomega = omegaPCM.begin(); iomega != omegaPCM.end(); ++iomega) { + for (auto iProton = proton.begin(); iProton != proton.end(); ++iProton) { + kstar = getkstar(*iomega, *iProton); + mHistManager.fill(HIST("omegap/fSE_particle_PCM"), kstar); + mHistManager.fill(HIST("omegap/fomegaPtVskstar_PCM"), kstar, (*iomega).Pt()); + mHistManager.fill(HIST("omegap/fProtonPtVskstar_PCM"), kstar, (*iProton).Pt()); + if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kOmegaP)) { + lowMomentumMultiplets[CFTrigger::kOmegaP] += 1; + } + } + // omegaAp trigger + for (auto iAntiProton = antiproton.begin(); iAntiProton != antiproton.end(); ++iAntiProton) { + kstar = getkstar(*iomega, *iAntiProton); + mHistManager.fill(HIST("omegap/fSE_Antiparticle_PCM"), kstar); + mHistManager.fill(HIST("omegap/fomegaPtVskstar_PCM"), kstar, (*iomega).Pt()); + mHistManager.fill(HIST("omegap/fAntiProtonPtVskstar_PCM"), kstar, (*iAntiProton).Pt()); + if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kOmegaP)) { + lowMomentumMultiplets[CFTrigger::kOmegaP] += 1; + } + } + } + // EMC + // omegap trigger + for (auto iomega = omegaEMC.begin(); iomega != omegaEMC.end(); ++iomega) { + for (auto iProton = proton.begin(); iProton != proton.end(); ++iProton) { + kstar = getkstar(*iomega, *iProton); + mHistManager.fill(HIST("omegap/fSE_particle_EMC"), kstar); + mHistManager.fill(HIST("omegap/fomegaPtVskstar_EMC"), kstar, (*iomega).Pt()); + mHistManager.fill(HIST("omegap/fProtonPtVskstar_EMC"), kstar, (*iProton).Pt()); + if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kOmegaP)) { + lowMomentumMultiplets[CFTrigger::kOmegaP] += 1; + } + } + // omegaAp trigger + for (auto iAntiProton = antiproton.begin(); iAntiProton != antiproton.end(); ++iAntiProton) { + kstar = getkstar(*iomega, *iAntiProton); + mHistManager.fill(HIST("omegap/fSE_Antiparticle_EMC"), kstar); + mHistManager.fill(HIST("omegap/fomegaPtVskstar_EMC"), kstar, (*iomega).Pt()); + mHistManager.fill(HIST("omegap/fAntiProtonPtVskstar_EMC"), kstar, (*iAntiProton).Pt()); + if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kOmegaP)) { + lowMomentumMultiplets[CFTrigger::kOmegaP] += 1; + } + } + } + } + if (ConfTriggerSwitches->get("Switch", "EtaPrimeP") > 0.) { + // PCM + // etaPrimep trigger + for (auto ietaprime = etaPrimePCM.begin(); ietaprime != etaPrimePCM.end(); ++ietaprime) { + for (auto iProton = proton.begin(); iProton != proton.end(); ++iProton) { + kstar = getkstar(*ietaprime, *iProton); + mHistManager.fill(HIST("etaprimep/fSE_particle_PCM"), kstar); + mHistManager.fill(HIST("etaprimep/fetaprimePtVskstar_PCM"), kstar, (*ietaprime).Pt()); + mHistManager.fill(HIST("etaprimep/fProtonPtVskstar_PCM"), kstar, (*iProton).Pt()); + if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kEtaPrimeP)) { + lowMomentumMultiplets[CFTrigger::kEtaPrimeP] += 1; + } + } + // etaPrimeAp trigger + for (auto iAntiProton = antiproton.begin(); iAntiProton != antiproton.end(); ++iAntiProton) { + kstar = getkstar(*ietaprime, *iAntiProton); + mHistManager.fill(HIST("etaprimep/fSE_Antiparticle_PCM"), kstar); + mHistManager.fill(HIST("etaprimep/fetaprimePtVskstar_PCM"), kstar, (*ietaprime).Pt()); + mHistManager.fill(HIST("etaprimep/fAntiProtonPtVskstar_PCM"), kstar, (*iAntiProton).Pt()); + if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kEtaPrimeP)) { + lowMomentumMultiplets[CFTrigger::kEtaPrimeP] += 1; + } + } + } + // EMC + // etaPrimep trigger + for (auto ietaprime = etaPrimeEMC.begin(); ietaprime != etaPrimeEMC.end(); ++ietaprime) { + for (auto iProton = proton.begin(); iProton != proton.end(); ++iProton) { + kstar = getkstar(*ietaprime, *iProton); + mHistManager.fill(HIST("etaprimep/fSE_particle_EMC"), kstar); + mHistManager.fill(HIST("etaprimep/fetaprimePtVskstar_EMC"), kstar, (*ietaprime).Pt()); + mHistManager.fill(HIST("etaprimep/fProtonPtVskstar_EMC"), kstar, (*iProton).Pt()); + if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kEtaPrimeP)) { + lowMomentumMultiplets[CFTrigger::kEtaPrimeP] += 1; + } + } + // etaPrimeAp trigger + for (auto iAntiProton = antiproton.begin(); iAntiProton != antiproton.end(); ++iAntiProton) { + kstar = getkstar(*ietaprime, *iAntiProton); + mHistManager.fill(HIST("etaprimep/fSE_Antiparticle_EMC"), kstar); + mHistManager.fill(HIST("etaprimep/fetaprimePtVskstar_EMC"), kstar, (*ietaprime).Pt()); + mHistManager.fill(HIST("etaprimep/fAntiProtonPtVskstar_EMC"), kstar, (*iAntiProton).Pt()); + if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kEtaPrimeP)) { + lowMomentumMultiplets[CFTrigger::kEtaPrimeP] += 1; + } + } + } + } + + // create tags for three body triggers + if (lowMomentumMultiplets[CFTrigger::kPPOmega] > 0) { + keepFemtoEvent[CFTrigger::kPPOmega] = true; + mHistManager.fill(HIST("fProcessedEvents"), 2); + mHistManager.fill(HIST("ppomega/fMultiplicity"), collision.multNTracksPV()); + mHistManager.fill(HIST("ppomega/fZvtx"), collision.posZ()); + } + if (lowMomentumMultiplets[CFTrigger::kPPEtaPrime] > 0) { + keepFemtoEvent[CFTrigger::kPPEtaPrime] = true; + mHistManager.fill(HIST("fProcessedEvents"), 3); + mHistManager.fill(HIST("ppetaprime/fMultiplicity"), collision.multNTracksPV()); + mHistManager.fill(HIST("ppetaprime/fZvtx"), collision.posZ()); + } + if (lowMomentumMultiplets[CFTrigger::kOmegaD] > 0) { + keepFemtoEvent[CFTrigger::kOmegaD] = true; + mHistManager.fill(HIST("fProcessedEvents"), 4); + mHistManager.fill(HIST("omegad/fMultiplicity"), collision.multNTracksPV()); + mHistManager.fill(HIST("omegad/fZvtx"), collision.posZ()); + } + if (lowMomentumMultiplets[CFTrigger::kEtaPrimeD] > 0) { + keepFemtoEvent[CFTrigger::kEtaPrimeD] = true; + mHistManager.fill(HIST("fProcessedEvents"), 5); + mHistManager.fill(HIST("etaprimed/fMultiplicity"), collision.multNTracksPV()); + mHistManager.fill(HIST("etaprimed/fZvtx"), collision.posZ()); + } + if (lowMomentumMultiplets[CFTrigger::kOmegaP] > 0) { + keepFemtoEvent[CFTrigger::kOmegaP] = true; + mHistManager.fill(HIST("fProcessedEvents"), 6); + mHistManager.fill(HIST("omegap/fMultiplicity"), collision.multNTracksPV()); + mHistManager.fill(HIST("omegap/fZvtx"), collision.posZ()); + } + if (lowMomentumMultiplets[CFTrigger::kEtaPrimeP] > 0) { + keepFemtoEvent[CFTrigger::kEtaPrimeP] = true; + mHistManager.fill(HIST("fProcessedEvents"), 7); + mHistManager.fill(HIST("etaprimep/fMultiplicity"), collision.multNTracksPV()); + mHistManager.fill(HIST("etaprimep/fZvtx"), collision.posZ()); + } + + // #set flag for tag + if (ConfKeepTwoBody.value) { + tags(colContainsPCMOmega, colContainsEMCOmega, colContainsPCMEtaPrime, colContainsEMCEtaPrime, + keepFemtoEvent[CFTrigger::kPPOmega] || keepFemtoEvent[CFTrigger::kOmegaP], keepFemtoEvent[CFTrigger::kPPEtaPrime] || keepFemtoEvent[CFTrigger::kEtaPrimeP], + keepFemtoEvent[CFTrigger::kOmegaD], keepFemtoEvent[CFTrigger::kEtaPrimeD]); + } else { + tags(colContainsPCMOmega, colContainsEMCOmega, colContainsPCMEtaPrime, colContainsEMCEtaPrime, + keepFemtoEvent[CFTrigger::kPPOmega], keepFemtoEvent[CFTrigger::kPPEtaPrime], + keepFemtoEvent[CFTrigger::kOmegaD], keepFemtoEvent[CFTrigger::kEtaPrimeD]); + } + + if (!keepFemtoEvent[CFTrigger::kPPOmega] && !keepFemtoEvent[CFTrigger::kOmegaP] && !keepFemtoEvent[CFTrigger::kPPEtaPrime] && !keepFemtoEvent[CFTrigger::kEtaPrimeP] && + !keepFemtoEvent[CFTrigger::kOmegaD] && !keepFemtoEvent[CFTrigger::kEtaPrimeD]) { + mHistManager.fill(HIST("fProcessedEvents"), 1); + } } /// \brief Loop over the GG candidates, fill the mass/pt histograms and set the isPi0/isEta flags based on the reconstructed mass @@ -141,22 +1484,79 @@ struct HeavyNeutralMesonFilter { float massHNM = heavyNeutralMeson.m(cfgHNMMassCorrection); if (heavyNeutralMeson.gg->reconstructionType == photonpair::kPCMPCM) { mHistManager.fill(HIST("HeavyNeutralMeson/invMassVsPt_PCM"), massHNM, heavyNeutralMeson.pT()); + // QA + mHistManager.fill(HIST("TrackCuts/HMN/Before/PCM/fInvMass"), massHNM); + mHistManager.fill(HIST("TrackCuts/HMN/Before/PCM/fPt"), heavyNeutralMeson.pT()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/PCM/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/PCM/fPhi"), translatePhi(heavyNeutralMeson.phi())); } else if (heavyNeutralMeson.gg->reconstructionType == photonpair::kEMCEMC) { mHistManager.fill(HIST("HeavyNeutralMeson/invMassVsPt_EMC"), massHNM, heavyNeutralMeson.pT()); + // QA + mHistManager.fill(HIST("TrackCuts/HMN/Before/EMC/fInvMass"), massHNM); + mHistManager.fill(HIST("TrackCuts/HMN/Before/EMC/fPt"), heavyNeutralMeson.pT()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/EMC/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/EMC/fPhi"), translatePhi(heavyNeutralMeson.phi())); } else { mHistManager.fill(HIST("HeavyNeutralMeson/invMassVsPt_PCMEMC"), massHNM, heavyNeutralMeson.pT()); + // QA + mHistManager.fill(HIST("TrackCuts/HMN/Before/PCMEMC/fInvMass"), massHNM); + mHistManager.fill(HIST("TrackCuts/HMN/Before/PCMEMC/fPt"), heavyNeutralMeson.pT()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/PCMEMC/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/PCMEMC/fPhi"), translatePhi(heavyNeutralMeson.phi())); } if (heavyNeutralMeson.gg->isPi0 && massHNM > massWindowOmega->get("omega_min") && massHNM < massWindowOmega->get("omega_max")) { - if (heavyNeutralMeson.gg->reconstructionType == photonpair::kPCMPCM && heavyNeutralMeson.pT() > minHNMPts->get("PCM_omega")) - colContainsPCMOmega = true; - else if (heavyNeutralMeson.gg->reconstructionType == photonpair::kEMCEMC && heavyNeutralMeson.pT() > minHNMPts->get("EMC_omega")) - colContainsEMCOmega = true; + if (heavyNeutralMeson.gg->reconstructionType == photonpair::kPCMPCM) { + if (heavyNeutralMeson.pT() > minFemtoHNMPts->get("PCM_omega")) { + omegaPCM.emplace_back(heavyNeutralMeson.pT(), heavyNeutralMeson.eta(), translatePhi(heavyNeutralMeson.phi()), mMassOmega); + // QA + mHistManager.fill(HIST("TrackCuts/HMN/After/Omega/PCM/fInvMass"), massHNM); + mHistManager.fill(HIST("TrackCuts/HMN/After/Omega/PCM/fPt"), heavyNeutralMeson.pT()); + mHistManager.fill(HIST("TrackCuts/HMN/After/Omega/PCM/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("TrackCuts/HMN/After/Omega/PCM/fPhi"), translatePhi(heavyNeutralMeson.phi())); + } + if (heavyNeutralMeson.pT() > minHNMPts->get("PCM_omega")) { + colContainsPCMOmega = true; + } + } else if (heavyNeutralMeson.gg->reconstructionType == photonpair::kEMCEMC) { + if (heavyNeutralMeson.pT() > minFemtoHNMPts->get("EMC_omega")) { + omegaEMC.emplace_back(heavyNeutralMeson.pT(), heavyNeutralMeson.eta(), translatePhi(heavyNeutralMeson.phi()), mMassOmega); + // QA + mHistManager.fill(HIST("TrackCuts/HMN/After/Omega/EMC/fInvMass"), massHNM); + mHistManager.fill(HIST("TrackCuts/HMN/After/Omega/EMC/fPt"), heavyNeutralMeson.pT()); + mHistManager.fill(HIST("TrackCuts/HMN/After/Omega/EMC/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("TrackCuts/HMN/After/Omega/EMC/fPhi"), translatePhi(heavyNeutralMeson.phi())); + } + if (heavyNeutralMeson.pT() > minHNMPts->get("EMC_omega")) { + colContainsEMCOmega = true; + } + } } else if (heavyNeutralMeson.gg->isEta && massHNM > massWindowEtaPrime->get("etaprime_min") && massHNM < massWindowEtaPrime->get("etaprime_max")) { - if (heavyNeutralMeson.gg->reconstructionType == photonpair::kPCMPCM && heavyNeutralMeson.pT() > minHNMPts->get("PCM_etaprime")) - colContainsPCMEtaPrime = true; - else if (heavyNeutralMeson.gg->reconstructionType == photonpair::kEMCEMC && heavyNeutralMeson.pT() > minHNMPts->get("EMC_etaprime")) - colContainsEMCEtaPrime = true; + if (heavyNeutralMeson.gg->reconstructionType == photonpair::kPCMPCM) { + if (heavyNeutralMeson.pT() > minFemtoHNMPts->get("PCM_etaprime")) { + etaPrimePCM.emplace_back(heavyNeutralMeson.pT(), heavyNeutralMeson.eta(), translatePhi(heavyNeutralMeson.phi()), mMassEtaPrime); + // QA + mHistManager.fill(HIST("TrackCuts/HMN/After/EtaPrime/PCM/fInvMass"), massHNM); + mHistManager.fill(HIST("TrackCuts/HMN/After/EtaPrime/PCM/fPt"), heavyNeutralMeson.pT()); + mHistManager.fill(HIST("TrackCuts/HMN/After/EtaPrime/PCM/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("TrackCuts/HMN/After/EtaPrime/PCM/fPhi"), translatePhi(heavyNeutralMeson.phi())); + } + if (heavyNeutralMeson.pT() > minHNMPts->get("PCM_etaprime")) { + colContainsPCMEtaPrime = true; + } + } else if (heavyNeutralMeson.gg->reconstructionType == photonpair::kEMCEMC) { + if (heavyNeutralMeson.pT() > minFemtoHNMPts->get("EMC_etaprime")) { + etaPrimeEMC.emplace_back(heavyNeutralMeson.pT(), heavyNeutralMeson.eta(), translatePhi(heavyNeutralMeson.phi()), mMassEtaPrime); + // QA + mHistManager.fill(HIST("TrackCuts/HMN/After/EtaPrime/EMC/fInvMass"), massHNM); + mHistManager.fill(HIST("TrackCuts/HMN/After/EtaPrime/EMC/fPt"), heavyNeutralMeson.pT()); + mHistManager.fill(HIST("TrackCuts/HMN/After/EtaPrime/EMC/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("TrackCuts/HMN/After/EtaPrime/EMC/fPhi"), translatePhi(heavyNeutralMeson.phi())); + } + if (heavyNeutralMeson.pT() > minHNMPts->get("EMC_etaprime")) { + colContainsEMCEtaPrime = true; + } + } } else { vHNMs.erase(vHNMs.begin() + iHNM); iHNM--; @@ -164,14 +1564,22 @@ struct HeavyNeutralMesonFilter { } mHistManager.fill(HIST("Event/nHeavyNeutralMesons"), nHNMsBeforeMassCuts, vHNMs.size()); - if (colContainsPCMOmega) + if (colContainsPCMOmega) { mHistManager.fill(HIST("Event/hCollisionCounter"), 2.); - if (colContainsEMCOmega) + mHistManager.fill(HIST("fProcessedEvents"), 9); + } + if (colContainsEMCOmega) { mHistManager.fill(HIST("Event/hCollisionCounter"), 3.); - if (colContainsPCMEtaPrime) + mHistManager.fill(HIST("fProcessedEvents"), 10); + } + if (colContainsPCMEtaPrime) { mHistManager.fill(HIST("Event/hCollisionCounter"), 4.); - if (colContainsEMCEtaPrime) + mHistManager.fill(HIST("fProcessedEvents"), 11); + } + if (colContainsEMCEtaPrime) { mHistManager.fill(HIST("Event/hCollisionCounter"), 5.); + mHistManager.fill(HIST("fProcessedEvents"), 12); + } } }; diff --git a/EventFiltering/filterTables.h b/EventFiltering/filterTables.h index 745394561e8..313edba6e16 100644 --- a/EventFiltering/filterTables.h +++ b/EventFiltering/filterTables.h @@ -184,6 +184,11 @@ DECLARE_SOA_COLUMN(PCMOmegaMeson, hasPCMOmegaMeson, bool); //! Omega meson DECLARE_SOA_COLUMN(EMCOmegaMeson, hasEMCOmegaMeson, bool); //! Omega meson candidate (3pi) in the collision DECLARE_SOA_COLUMN(PCMEtaPrimeMeson, hasPCMEtaPrimeMeson, bool); //! Eta' meson candidate (3pi) in the collision DECLARE_SOA_COLUMN(EMCEtaPrimeMeson, hasEMCEtaPrimeMeson, bool); //! Eta' meson candidate (3pi) in the collision +DECLARE_SOA_COLUMN(PPOmega, hasPPOmega, bool); //! PPomega meson candidate (3pi) in the collision +DECLARE_SOA_COLUMN(PPEtaPrime, hasPPEtaPrime, bool); //! PPEta' meson candidate (3pi) in the collision +DECLARE_SOA_COLUMN(Omegad, hasOmegad, bool); //! Omegad' meson candidate (3pi) in the collision +DECLARE_SOA_COLUMN(EtaPrimed, hasEtaPrimed, bool); //! Eta'd meson candidate (3pi) in the collision + } // namespace filtering namespace decision @@ -317,7 +322,9 @@ using PhotonFilter = PhotonFilters::iterator; // heavy mesons DECLARE_SOA_TABLE(HeavyNeutralMesonFilters, "AOD", "HeavyNeutralMesonFilters", //! filtering::PCMOmegaMeson, filtering::EMCOmegaMeson, - filtering::PCMEtaPrimeMeson, filtering::EMCEtaPrimeMeson); + filtering::PCMEtaPrimeMeson, filtering::EMCEtaPrimeMeson, + filtering::PPOmega, filtering::PPEtaPrime, + filtering::Omegad, filtering::EtaPrimed); using HeavyNeutralMesonFilter = HeavyNeutralMesonFilters::iterator; diff --git a/PWGEM/PhotonMeson/Utils/HNMUtilities.h b/PWGEM/PhotonMeson/Utils/HNMUtilities.h index 279b7a0b683..329b22247c1 100644 --- a/PWGEM/PhotonMeson/Utils/HNMUtilities.h +++ b/PWGEM/PhotonMeson/Utils/HNMUtilities.h @@ -121,6 +121,8 @@ struct HeavyNeutralMeson { return massHNM; } float pT() const { return vHeavyNeutralMeson.Pt(); } + float eta() const { return vHeavyNeutralMeson.Eta(); } + float phi() const { return vHeavyNeutralMeson.Phi(); } }; /// \brief Reconstruct light neutral mesons from EMC clusters and V0s and fill them into the vGGs vector @@ -153,7 +155,7 @@ void reconstructGGs(C clusters, V v0s, std::vector& vGGs) /// \brief Reconstruct heavy neutral mesons from tracks and GG candidates and fill them into the vHNMs vector template -void reconstructHeavyNeutralMesons(Track const& tracks, std::vector& vGGs, std::vector& vHNMs) +void reconstructHeavyNeutralMesons(Track const& tracks, std::vector& vGGs, std::vector& vHNMs) // ToDO: Pion comb. in main code, tracks -> 4-vectors { vHNMs.clear(); for (const auto& posTrack : tracks) { @@ -170,6 +172,16 @@ void reconstructHeavyNeutralMesons(Track const& tracks, std::vector& vGGs, std::vector& vHNMs) // ToDO: Pion comb. in main code, tracks -> 4-vectors +{ + const ROOT::Math::PtEtaPhiMVector trackSum = posPion + negPion; + for (size_t iGG = 0; iGG < vGGs.size(); iGG++) { + HeavyNeutralMeson heavyNeutralMeson(&vGGs.at(iGG), trackSum.E(), trackSum.Px(), trackSum.Py(), trackSum.Pz()); + vHNMs.push_back(heavyNeutralMeson); + } +} + } // namespace o2::aod::pwgem::photonmeson::hnmutilities #endif // PWGEM_PHOTONMESON_UTILS_HNMUTILITIES_H_ From bee8ed55104157831a7e411b24e6767f6094f29f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josu=C3=A9=20Mart=C3=ADnez=20Garc=C3=ADa?= Date: Thu, 3 Apr 2025 00:06:51 -0600 Subject: [PATCH 0905/1650] [PWGLF] PWGMM:Lumi (#10726) adding leading BC pattern and corrections for rate. --- PWGMM/Lumi/Tasks/lumiStability.cxx | 211 +++++++++++++++++++---------- 1 file changed, 136 insertions(+), 75 deletions(-) diff --git a/PWGMM/Lumi/Tasks/lumiStability.cxx b/PWGMM/Lumi/Tasks/lumiStability.cxx index 0c8e818fced..b8bb9209810 100644 --- a/PWGMM/Lumi/Tasks/lumiStability.cxx +++ b/PWGMM/Lumi/Tasks/lumiStability.cxx @@ -52,14 +52,17 @@ struct LumiStabilityTask { Configurable nOrbitsPerTF{"nOrbitsPerTF", 128, "number of orbits per time frame"}; Configurable minOrbitConf{"minOrbitConf", 0, "minimum orbit"}; Configurable is2022Data{"is2022Data", true, "To 2022 data"}; + Configurable minEmpty{"minEmpty", 5, "number of BCs empty for leading BC"}; Service ccdb; int nBCsPerOrbit = 3564; int lastRunNumber = -1; int nOrbits = nOrbitsConf; double minOrbit = minOrbitConf; - int64_t bcSOR = 0; // global bc of the start of the first orbit, setting 0 by default for unanchored MC - int64_t nBCsPerTF = 128 * nBCsPerOrbit; // duration of TF in bcs, should be 128*3564 or 32*3564, setting 128 orbits by default sfor unanchored MC + int64_t bcSOR = 0; // global bc of the start of the first orbit, setting 0 by default for unanchored MC + int64_t tsSOR; + int64_t tsEOR; + int64_t nBCsPerTF = nOrbitsPerTF * nBCsPerOrbit; // duration of TF in bcs, should be 128*3564 or 32*3564, setting 128 orbits by default sfor unanchored MC std::bitset beamPatternA; std::bitset beamPatternC; std::bitset bcPatternA; @@ -75,59 +78,63 @@ struct LumiStabilityTask { const AxisSpec axisCounts{6, -0.5, 5.5}; const AxisSpec axisV0Counts{5, -0.5, 4.5}; - const AxisSpec axisTriggger{nBCsPerOrbit, -0.5f, nBCsPerOrbit - 0.5f}; + const AxisSpec axisTrigger{nBCsPerOrbit, -0.5f, nBCsPerOrbit - 0.5f}; const AxisSpec axisPos{1000, -1, 1}; const AxisSpec axisPosZ{1000, -25, 25}; const AxisSpec axisNumContrib{1001, -0.5, 1000}; - const AxisSpec axisColisionTime{1000, -50, 50}; + const AxisSpec axisCollisionTime{1000, -50, 50}; const AxisSpec axisTime{1000, -10, 40}; const AxisSpec axisTimeFDD{1000, -20, 100}; const AxisSpec axisCountsTime{2, -0.5, 1.5}; const AxisSpec axisOrbits{static_cast(nOrbits / nOrbitsPerTF), 0., static_cast(nOrbits), ""}; const AxisSpec axisTimeRate{1440, 0., 86400, ""}; // t in seconds. Histo for 24 hrs. Each bin contain 1 min. - histos.add("hBcA", "BC pattern A; BC ; It is present", kTH1F, {axisTriggger}); - histos.add("hBcC", "BC pattern C; BC ; It is present", kTH1F, {axisTriggger}); - histos.add("hBcB", "BC pattern B; BC ; It is present", kTH1F, {axisTriggger}); - histos.add("hBcE", "BC pattern Empty; BC ; It is present", kTH1F, {axisTriggger}); + histos.add("hBcA", "BC pattern A; BC ; It is present", kTH1F, {axisTrigger}); + histos.add("hBcC", "BC pattern C; BC ; It is present", kTH1F, {axisTrigger}); + histos.add("hBcB", "BC pattern B; BC ; It is present", kTH1F, {axisTrigger}); + histos.add("hBcBL", "BC pattern B - Leading BC; BC ; It is present", kTH1F, {axisTrigger}); + histos.add("hBcE", "BC pattern Empty; BC ; It is present", kTH1F, {axisTrigger}); histos.add("hvertexX", "Pos X vertex trigger; Pos x; Count ", kTH1F, {axisPos}); - histos.add("hvertexXvsTime", "Pos X vertex vs Collision Time; vertex X (cm) ; time (ns)", {HistType::kTH2F, {{axisPos}, {axisColisionTime}}}); + histos.add("hvertexXvsTime", "Pos X vertex vs Collision Time; vertex X (cm) ; time (ns)", {HistType::kTH2F, {{axisPos}, {axisCollisionTime}}}); histos.add("hvertexY", "Pos Y vertex trigger; Pos y; Count ", kTH1F, {axisPos}); histos.add("hvertexZ", "Pos Z vertex trigger; Pos z; Count ", kTH1F, {axisPosZ}); histos.add("hnumContrib", "Num of contributors; Num of contributors; Count ", kTH1I, {axisNumContrib}); - histos.add("hcollisinTime", "Collision Time; ns; Count ", kTH1F, {axisColisionTime}); + histos.add("hcollisinTime", "Collision Time; ns; Count ", kTH1F, {axisCollisionTime}); histos.add("hOrbitFDDVertexCoinc", "", kTH1F, {axisOrbits}); histos.add("hOrbitFDDVertex", "", kTH1F, {axisOrbits}); histos.add("hOrbitFT0vertex", "", kTH1F, {axisOrbits}); histos.add("hOrbitFV0Central", "", kTH1F, {axisOrbits}); + histos.add("tsValues", "", kTH1D, {{2, -0.5, 1.5}}); // time 32.766 is dummy time // histo about triggers histos.add("FDD/hCounts", "0 FDDCount - 1 FDDVertexCount - 2 FDDPPVertexCount - 3 FDDCoincidencesVertexCount - 4 FDDPPCoincidencesVertexCount - 5 FDDPPBotSidesCount; Number; counts", kTH1F, {axisCounts}); - histos.add("FDD/bcVertexTrigger", "vertex trigger per BC (FDD);BC in FDD; counts", kTH1F, {axisTriggger}); - histos.add("FDD/bcVertexTriggerPP", "vertex trigger per BC (FDD);BC in FDD; counts", kTH1F, {axisTriggger}); - histos.add("FDD/bcVertexTriggerCoincidence", "vertex trigger per BC (FDD) with coincidences;BC in FDD; counts", kTH1F, {axisTriggger}); - histos.add("FDD/bcVertexTriggerCoincidencePP", "vertex trigger per BC (FDD) with coincidences and Past Protection;BC in FDD; counts", kTH1F, {axisTriggger}); - histos.add("FDD/bcVertexTriggerBothSidesCoincidencePP", "vertex per BC (FDD) with coincidences, at least one side trigger and Past Protection;BC in FDD; counts", kTH1F, {axisTriggger}); - histos.add("FDD/bcSCentralTrigger", "scentral trigger per BC (FDD);BC in FDD; counts", kTH1F, {axisTriggger}); - histos.add("FDD/bcSCentralTriggerCoincidence", "scentral trigger per BC (FDD) with coincidences;BC in FDD; counts", kTH1F, {axisTriggger}); - histos.add("FDD/bcVSCTrigger", "vertex and scentral trigger per BC (FDD);BC in FDD; counts", kTH1F, {axisTriggger}); - histos.add("FDD/bcVSCTriggerCoincidence", "vertex and scentral trigger per BC (FDD) with coincidences;BC in FDD; counts", kTH1F, {axisTriggger}); - histos.add("FDD/bcCentralTrigger", "central trigger per BC (FDD);BC in FDD; counts", kTH1F, {axisTriggger}); - histos.add("FDD/bcCentralTriggerCoincidence", "central trigger per BC (FDD) with coincidences;BC in FDD; counts", kTH1F, {axisTriggger}); - histos.add("FDD/bcVCTrigger", "vertex and central trigger per BC (FDD);BC in FDD; counts", kTH1F, {axisTriggger}); - histos.add("FDD/bcVCTriggerCoincidence", "vertex and central trigger per BC (FDD) with coincidences;BC in FDD; counts", kTH1F, {axisTriggger}); - histos.add("FDD/hBcAVertex", "BC pattern A in FDD; BC in FDD ; It is present", kTH1F, {axisTriggger}); - histos.add("FDD/hBcCVertex", "BC pattern C in FDD; BC in FDD ; It is present", kTH1F, {axisTriggger}); - histos.add("FDD/hBcBVertex", "BC pattern B in FDD; BC in FDD ; It is present", kTH1F, {axisTriggger}); - histos.add("FDD/hBcEVertex", "BC pattern Empty in FDD; BC in FDD ; It is present", kTH1F, {axisTriggger}); + histos.add("FDD/bcVertexTrigger", "vertex trigger per BC (FDD);BC in FDD; counts", kTH1F, {axisTrigger}); + histos.add("FDD/bcVertexTriggerPP", "vertex trigger per BC (FDD);BC in FDD; counts", kTH1F, {axisTrigger}); + histos.add("FDD/bcVertexTriggerCoincidence", "vertex trigger per BC (FDD) with coincidences;BC in FDD; counts", kTH1F, {axisTrigger}); + histos.add("FDD/bcVertexTriggerCoincidencePP", "vertex trigger per BC (FDD) with coincidences and Past Protection;BC in FDD; counts", kTH1F, {axisTrigger}); + histos.add("FDD/bcVertexTriggerBothSidesCoincidencePP", "vertex per BC (FDD) with coincidences, at least one side trigger and Past Protection;BC in FDD; counts", kTH1F, {axisTrigger}); + histos.add("FDD/bcSCentralTrigger", "scentral trigger per BC (FDD);BC in FDD; counts", kTH1F, {axisTrigger}); + histos.add("FDD/bcSCentralTriggerCoincidence", "scentral trigger per BC (FDD) with coincidences;BC in FDD; counts", kTH1F, {axisTrigger}); + histos.add("FDD/bcVSCTrigger", "vertex and scentral trigger per BC (FDD);BC in FDD; counts", kTH1F, {axisTrigger}); + histos.add("FDD/bcVSCTriggerCoincidence", "vertex and scentral trigger per BC (FDD) with coincidences;BC in FDD; counts", kTH1F, {axisTrigger}); + histos.add("FDD/bcCentralTrigger", "central trigger per BC (FDD);BC in FDD; counts", kTH1F, {axisTrigger}); + histos.add("FDD/bcCentralTriggerCoincidence", "central trigger per BC (FDD) with coincidences;BC in FDD; counts", kTH1F, {axisTrigger}); + histos.add("FDD/bcVCTrigger", "vertex and central trigger per BC (FDD);BC in FDD; counts", kTH1F, {axisTrigger}); + histos.add("FDD/bcVCTriggerCoincidence", "vertex and central trigger per BC (FDD) with coincidences;BC in FDD; counts", kTH1F, {axisTrigger}); + histos.add("FDD/hBcAVertex", "BC pattern A in FDD; BC in FDD ; It is present", kTH1F, {axisTrigger}); + histos.add("FDD/hBcCVertex", "BC pattern C in FDD; BC in FDD ; It is present", kTH1F, {axisTrigger}); + histos.add("FDD/hBcBVertex", "BC pattern B in FDD; BC in FDD ; It is present", kTH1F, {axisTrigger}); + histos.add("FDD/hBcBVertexL", "BC pattern B in FDD - Leading BC; BC in FDD ; It is present", kTH1F, {axisTrigger}); + histos.add("FDD/hBcEVertex", "BC pattern Empty in FDD; BC in FDD ; It is present", kTH1F, {axisTrigger}); histos.add("FDD/timeACbcBVertex", "time bcB ; A (ns); C (ns)", {HistType::kTH2F, {{300, -15, 15}, {300, -15, 15}}}); histos.add("FDD/timeACbcAVertex", "time bcA ; A (ns); C (ns)", {HistType::kTH2F, {{300, -15, 15}, {300, -15, 15}}}); histos.add("FDD/timeACbcCVertex", "time bcC ; A (ns); C (ns)", {HistType::kTH2F, {{300, -15, 15}, {300, -15, 15}}}); histos.add("FDD/timeACbcEVertex", "time bcE ; A (ns); C (ns)", {HistType::kTH2F, {{300, -15, 15}, {300, -15, 15}}}); - histos.add("FDD/hBcA", "BC pattern A in FDD; BC in FDD ; It is present", kTH1F, {axisTriggger}); - histos.add("FDD/hBcC", "BC pattern C in FDD; BC in FDD ; It is present", kTH1F, {axisTriggger}); - histos.add("FDD/hBcB", "BC pattern B in FDD; BC in FDD ; It is present", kTH1F, {axisTriggger}); - histos.add("FDD/hBcE", "BC pattern Empty in FDD; BC in FDD ; It is present", kTH1F, {axisTriggger}); + histos.add("FDD/hBcA", "BC pattern A in FDD; BC in FDD ; It is present", kTH1F, {axisTrigger}); + histos.add("FDD/hBcC", "BC pattern C in FDD; BC in FDD ; It is present", kTH1F, {axisTrigger}); + histos.add("FDD/hBcB", "BC pattern B in FDD; BC in FDD ; It is present", kTH1F, {axisTrigger}); + histos.add("FDD/hBcBL", "BC pattern B in FDD - Leading BC; BC in FDD ; It is present", kTH1F, {axisTrigger}); + histos.add("FDD/hBcE", "BC pattern Empty in FDD; BC in FDD ; It is present", kTH1F, {axisTrigger}); histos.add("FDD/timeACbcB", "time bcB ; A (ns); C (ns)", {HistType::kTH2F, {{300, -15, 15}, {300, -15, 15}}}); histos.add("FDD/timeACbcA", "time bcA ; A (ns); C (ns)", {HistType::kTH2F, {{300, -15, 15}, {300, -15, 15}}}); histos.add("FDD/timeACbcC", "time bcC ; A (ns); C (ns)", {HistType::kTH2F, {{300, -15, 15}, {300, -15, 15}}}); @@ -139,35 +146,36 @@ struct LumiStabilityTask { histos.add("FDD/hCountsTimeA2022", "0 Dummy Time - 1 Valid Time ; Kind of Time; counts", kTH1F, {axisCounts}); histos.add("FDD/hCountsTimeC2022", "0 Dummy Time - 1 Valid Time ; Kind of Time; counts", kTH1F, {axisCounts}); histos.add("FDD/hCountsTime2022", "0 Dummy Time - 1 Valid Time ; Kind of Time; counts", kTH1F, {axisCounts}); - histos.add("FDD/hValidTimeAvsBC2022", "Valid Time A vs BC id;BC in FT0;valid time counts", kTH1F, {axisTriggger}); - histos.add("FDD/hInvTimeAvsBC2022", "Invalid Time A vs BC id;BC in FT0;invalid time counts", kTH1F, {axisTriggger}); - histos.add("FDD/hValidTimeCvsBC2022", "Valid Time C vs BC id;BC in FT0;valid time counts", kTH1F, {axisTriggger}); - histos.add("FDD/hInvTimeCvsBC2022", "Invalid Time C vs BC id;BC in FT0;invalid time counts", kTH1F, {axisTriggger}); - histos.add("FDD/hValidTimevsBC2022", "Valid Time vs BC id;BC in FT0;valid time counts", kTH1F, {axisTriggger}); - histos.add("FDD/hInvTimevsBC2022", "Invalid Time vs BC id;BC in FT0;invalid time counts", kTH1F, {axisTriggger}); + histos.add("FDD/hValidTimeAvsBC2022", "Valid Time A vs BC id;BC in FT0;valid time counts", kTH1F, {axisTrigger}); + histos.add("FDD/hInvTimeAvsBC2022", "Invalid Time A vs BC id;BC in FT0;invalid time counts", kTH1F, {axisTrigger}); + histos.add("FDD/hValidTimeCvsBC2022", "Valid Time C vs BC id;BC in FT0;valid time counts", kTH1F, {axisTrigger}); + histos.add("FDD/hInvTimeCvsBC2022", "Invalid Time C vs BC id;BC in FT0;invalid time counts", kTH1F, {axisTrigger}); + histos.add("FDD/hValidTimevsBC2022", "Valid Time vs BC id;BC in FT0;valid time counts", kTH1F, {axisTrigger}); + histos.add("FDD/hInvTimevsBC2022", "Invalid Time vs BC id;BC in FT0;invalid time counts", kTH1F, {axisTrigger}); histos.add("FDD/hCountsTimeA", "0 Dummy Time - 1 Valid Time ; Kind of Time; counts", kTH1F, {axisCounts}); histos.add("FDD/hCountsTimeC", "0 Dummy Time - 1 Valid Time ; Kind of Time; counts", kTH1F, {axisCounts}); histos.add("FDD/hCountsTime", "0 Dummy Time - 1 Valid Time ; Kind of Time; counts", kTH1F, {axisCounts}); - histos.add("FDD/hValidTimeAvsBC", "Valid Time A vs BC id;BC in FT0;valid time counts", kTH1F, {axisTriggger}); - histos.add("FDD/hInvTimeAvsBC", "Invalid Time A vs BC id;BC in FT0;invalid time counts", kTH1F, {axisTriggger}); - histos.add("FDD/hValidTimeCvsBC", "Valid Time C vs BC id;BC in FT0;valid time counts", kTH1F, {axisTriggger}); - histos.add("FDD/hInvTimeCvsBC", "Invalid Time C vs BC id;BC in FT0;invalid time counts", kTH1F, {axisTriggger}); - histos.add("FDD/hValidTimevsBC", "Valid Time vs BC id;BC in FT0;valid time counts", kTH1F, {axisTriggger}); - histos.add("FDD/hInvTimevsBC", "Invalid Time vs BC id;BC in FT0;invalid time counts", kTH1F, {axisTriggger}); + histos.add("FDD/hValidTimeAvsBC", "Valid Time A vs BC id;BC in FT0;valid time counts", kTH1F, {axisTrigger}); + histos.add("FDD/hInvTimeAvsBC", "Invalid Time A vs BC id;BC in FT0;invalid time counts", kTH1F, {axisTrigger}); + histos.add("FDD/hValidTimeCvsBC", "Valid Time C vs BC id;BC in FT0;valid time counts", kTH1F, {axisTrigger}); + histos.add("FDD/hInvTimeCvsBC", "Invalid Time C vs BC id;BC in FT0;invalid time counts", kTH1F, {axisTrigger}); + histos.add("FDD/hValidTimevsBC", "Valid Time vs BC id;BC in FT0;valid time counts", kTH1F, {axisTrigger}); + histos.add("FDD/hInvTimevsBC", "Invalid Time vs BC id;BC in FT0;invalid time counts", kTH1F, {axisTrigger}); histos.add("FDD/hTimeForRate", "Counts by time in FDD;t (in seconds) in FDD; counts", kTH1F, {axisTimeRate}); histos.add("FT0/hCounts", "0 FT0Count - 1 FT0VertexCount - 2 FT0PPVertexCount - 3 FT0PPBothSidesCount; Number; counts", kTH1F, {axisCounts}); - histos.add("FT0/bcVertexTrigger", "vertex trigger per BC (FT0);BC in FT0; counts", kTH1F, {axisTriggger}); - histos.add("FT0/bcVertexTriggerPP", "vertex trigger per BC (FT0) with Past Protection;BC in FT0; counts", kTH1F, {axisTriggger}); - histos.add("FT0/bcVertexTriggerBothSidesPP", "vertex per BC (FDD) with coincidences, at least one side trigger and Past Protection;BC in FDD; counts", kTH1F, {axisTriggger}); - histos.add("FT0/bcSCentralTrigger", "Scentral trigger per BC (FT0);BC in FT0; counts", kTH1F, {axisTriggger}); - histos.add("FT0/bcVSCTrigger", "vertex and Scentral trigger per BC (FT0);BC in FT0; counts", kTH1F, {axisTriggger}); - histos.add("FT0/bcCentralTrigger", "central trigger per BC (FT0);BC in FT0; counts", kTH1F, {axisTriggger}); - histos.add("FT0/bcVCTrigger", "vertex and central trigger per BC (FT0);BC in FT0; counts", kTH1F, {axisTriggger}); - histos.add("FT0/hBcA", "BC pattern A in FT0; BC in FT0 ; It is present", kTH1F, {axisTriggger}); - histos.add("FT0/hBcC", "BC pattern C in FT0; BC in FT0 ; It is present", kTH1F, {axisTriggger}); - histos.add("FT0/hBcB", "BC pattern B in FT0; BC in FT0 ; It is present", kTH1F, {axisTriggger}); - histos.add("FT0/hBcE", "BC pattern Empty in FT0; BC in FT0 ; It is present", kTH1F, {axisTriggger}); + histos.add("FT0/bcVertexTrigger", "vertex trigger per BC (FT0);BC in FT0; counts", kTH1F, {axisTrigger}); + histos.add("FT0/bcVertexTriggerPP", "vertex trigger per BC (FT0) with Past Protection;BC in FT0; counts", kTH1F, {axisTrigger}); + histos.add("FT0/bcVertexTriggerBothSidesPP", "vertex per BC (FDD) with coincidences, at least one side trigger and Past Protection;BC in FDD; counts", kTH1F, {axisTrigger}); + histos.add("FT0/bcSCentralTrigger", "Scentral trigger per BC (FT0);BC in FT0; counts", kTH1F, {axisTrigger}); + histos.add("FT0/bcVSCTrigger", "vertex and Scentral trigger per BC (FT0);BC in FT0; counts", kTH1F, {axisTrigger}); + histos.add("FT0/bcCentralTrigger", "central trigger per BC (FT0);BC in FT0; counts", kTH1F, {axisTrigger}); + histos.add("FT0/bcVCTrigger", "vertex and central trigger per BC (FT0);BC in FT0; counts", kTH1F, {axisTrigger}); + histos.add("FT0/hBcA", "BC pattern A in FT0; BC in FT0 ; It is present", kTH1F, {axisTrigger}); + histos.add("FT0/hBcC", "BC pattern C in FT0; BC in FT0 ; It is present", kTH1F, {axisTrigger}); + histos.add("FT0/hBcB", "BC pattern B in FT0; BC in FT0 ; It is present", kTH1F, {axisTrigger}); + histos.add("FT0/hBcBL", "BC pattern B in FT0 - Leading BC; BC in FT0 ; It is present", kTH1F, {axisTrigger}); + histos.add("FT0/hBcE", "BC pattern Empty in FT0; BC in FT0 ; It is present", kTH1F, {axisTrigger}); histos.add("FT0/timeACbcB", "time bcB ; A (ns); C (ns)", {HistType::kTH2F, {{300, -15, 15}, {300, -15, 15}}}); histos.add("FT0/timeACbcA", "time bcA ; A (ns); C (ns)", {HistType::kTH2F, {{300, -15, 15}, {300, -15, 15}}}); histos.add("FT0/timeACbcC", "time bcC ; A (ns); C (ns)", {HistType::kTH2F, {{300, -15, 15}, {300, -15, 15}}}); @@ -177,27 +185,27 @@ struct LumiStabilityTask { histos.add("FT0/hCountsTimeA", "0 Dummy Time - 1 Valid Time ; Kind of Time; counts", kTH1F, {axisCounts}); histos.add("FT0/hCountsTimeC", "0 Dummy Time - 1 Valid Time ; Kind of Time; counts", kTH1F, {axisCounts}); histos.add("FT0/hCountsTime", "0 Dummy Time - 1 Valid Time ; Kind of Time; counts", kTH1F, {axisCounts}); - histos.add("FT0/hValidTimeAvsBC", "Valid Time A vs BC id;BC in FT0;valid time counts", kTH1F, {axisTriggger}); - histos.add("FT0/hInvTimeAvsBC", "Invalid Time A vs BC id;BC in FT0;invalid time counts", kTH1F, {axisTriggger}); - histos.add("FT0/hValidTimeCvsBC", "Valid Time C vs BC id;BC in FT0;valid time counts", kTH1F, {axisTriggger}); - histos.add("FT0/hInvTimeCvsBC", "Invalid Time C vs BC id;BC in FT0;invalid time counts", kTH1F, {axisTriggger}); - histos.add("FT0/hValidTimevsBC", "Valid Time vs BC id;BC in FT0;valid time counts", kTH1F, {axisTriggger}); - histos.add("FT0/hInvTimevsBC", "Invalid Time vs BC id;BC in FT0;invalid time counts", kTH1F, {axisTriggger}); - histos.add("FT0/hTimeForRate", "Counts by time in FDD;t (in seconds) in FDD; counts", kTH1F, {axisTimeRate}); + histos.add("FT0/hValidTimeAvsBC", "Valid Time A vs BC id;BC in FT0;valid time counts", kTH1F, {axisTrigger}); + histos.add("FT0/hInvTimeAvsBC", "Invalid Time A vs BC id;BC in FT0;invalid time counts", kTH1F, {axisTrigger}); + histos.add("FT0/hValidTimeCvsBC", "Valid Time C vs BC id;BC in FT0;valid time counts", kTH1F, {axisTrigger}); + histos.add("FT0/hInvTimeCvsBC", "Invalid Time C vs BC id;BC in FT0;invalid time counts", kTH1F, {axisTrigger}); + histos.add("FT0/hValidTimevsBC", "Valid Time vs BC id;BC in FT0;valid time counts", kTH1F, {axisTrigger}); + histos.add("FT0/hInvTimevsBC", "Invalid Time vs BC id;BC in FT0;invalid time counts", kTH1F, {axisTrigger}); + histos.add("FT0/hTimeForRate", "Counts by time in FT0;t (in seconds) in FDD; counts", kTH1F, {axisTimeRate}); histos.add("FV0/hCounts", "0 CountCentralFV0 - 1 CountPFPCentralFV0 - 2 CountPFPOutInFV0 - 3 CountPPCentralFV0 - 4 CountPPOutInFV0; Number; counts", kTH1F, {axisV0Counts}); - histos.add("FV0/bcOutTrigger", "Out trigger per BC (FV0);BC in V0; counts", kTH1F, {axisTriggger}); - histos.add("FV0/bcInTrigger", "In trigger per BC (FV0);BC in V0; counts", kTH1F, {axisTriggger}); - histos.add("FV0/bcSCenTrigger", "SCen trigger per BC (FV0);BC in V0; counts", kTH1F, {axisTriggger}); - histos.add("FV0/bcCenTrigger", "Central trigger per BC (FV0);BC in V0; counts", kTH1F, {axisTriggger}); - histos.add("FV0/bcCenTriggerPFPCentral", "Central trigger per BC (FV0) with PFP in central trigger;BC in V0; counts", kTH1F, {axisTriggger}); - histos.add("FV0/bcCenTriggerPPCentral", "Central trigger per BC (FV0) with PP in central trigger;BC in V0; counts", kTH1F, {axisTriggger}); - histos.add("FV0/bcCenTriggerPFPOutIn", "Central trigger per BC (FV0) with PFP in Out and In trigger;BC in V0; counts", kTH1F, {axisTriggger}); - histos.add("FV0/bcCenTriggerPPOutIn", "Central trigger per BC (FV0) with PP in Out and In trigger;BC in V0; counts", kTH1F, {axisTriggger}); - histos.add("FV0/hBcA", "BC pattern A in FV0; BC in FV0 ; It is present", kTH1F, {axisTriggger}); - histos.add("FV0/hBcC", "BC pattern C in FV0; BC in FV0 ; It is present", kTH1F, {axisTriggger}); - histos.add("FV0/hBcB", "BC pattern B in FV0; BC in FV0 ; It is present", kTH1F, {axisTriggger}); - histos.add("FV0/hBcE", "BC pattern Empty in FV0; BC in FV0 ; It is present", kTH1F, {axisTriggger}); + histos.add("FV0/bcOutTrigger", "Out trigger per BC (FV0);BC in V0; counts", kTH1F, {axisTrigger}); + histos.add("FV0/bcInTrigger", "In trigger per BC (FV0);BC in V0; counts", kTH1F, {axisTrigger}); + histos.add("FV0/bcSCenTrigger", "SCen trigger per BC (FV0);BC in V0; counts", kTH1F, {axisTrigger}); + histos.add("FV0/bcCenTrigger", "Central trigger per BC (FV0);BC in V0; counts", kTH1F, {axisTrigger}); + histos.add("FV0/bcCenTriggerPFPCentral", "Central trigger per BC (FV0) with PFP in central trigger;BC in V0; counts", kTH1F, {axisTrigger}); + histos.add("FV0/bcCenTriggerPPCentral", "Central trigger per BC (FV0) with PP in central trigger;BC in V0; counts", kTH1F, {axisTrigger}); + histos.add("FV0/bcCenTriggerPFPOutIn", "Central trigger per BC (FV0) with PFP in Out and In trigger;BC in V0; counts", kTH1F, {axisTrigger}); + histos.add("FV0/bcCenTriggerPPOutIn", "Central trigger per BC (FV0) with PP in Out and In trigger;BC in V0; counts", kTH1F, {axisTrigger}); + histos.add("FV0/hBcA", "BC pattern A in FV0; BC in FV0 ; It is present", kTH1F, {axisTrigger}); + histos.add("FV0/hBcC", "BC pattern C in FV0; BC in FV0 ; It is present", kTH1F, {axisTrigger}); + histos.add("FV0/hBcB", "BC pattern B in FV0; BC in FV0 ; It is present", kTH1F, {axisTrigger}); + histos.add("FV0/hBcE", "BC pattern Empty in FV0; BC in FV0 ; It is present", kTH1F, {axisTrigger}); histos.add("FV0/timeAbcB", "time bcB ; A (ns)", kTH1F, {{300, -15, 15}}); histos.add("FV0/timeAbcA", "time bcA ; A (ns)", kTH1F, {{300, -15, 15}}); histos.add("FV0/timeAbcC", "time bcC ; A (ns)", kTH1F, {{300, -15, 15}}); @@ -224,6 +232,7 @@ struct LumiStabilityTask { void processMain(aod::FDDs const& fdds, aod::FT0s const& ft0s, aod::FV0As const& fv0s, aod::BCsWithTimestamps const& bcs) { int executionCounter = 0; + int nbin = o2::constants::lhc::LHCMaxBunches; uint32_t nOrbitsPerTF = 0; // 128 in 2022, 32 in 2023 if (is2022Data) { nOrbitsPerTF = 128; // 128 in 2022, 32 in 2023 @@ -231,8 +240,6 @@ struct LumiStabilityTask { nOrbitsPerTF = 32; // 128 in 2022, 32 in 2023 } int runNumber = bcs.iteratorAt(0).runNumber(); - int64_t tsSOR = 0; - int64_t tsEOR = 1; if (runNumber != lastRunNumber && executionCounter < 1) { tsSOR = 0; tsEOR = 1; @@ -260,6 +267,18 @@ struct LumiStabilityTask { } if (bcPatternB[i]) { histos.fill(HIST("hBcB"), i); + bool isLeadBC = true; + for (int jbit = i - minEmpty; jbit < i; jbit++) { + int kbit = jbit; + if (kbit < 0) + kbit += nbin; + if (bcPatternB[kbit]) { + isLeadBC = false; + break; + } + } + if (isLeadBC) + histos.fill(HIST("hBcBL"), i); } if (bcPatternE[i]) { histos.fill(HIST("hBcE"), i); @@ -291,6 +310,12 @@ struct LumiStabilityTask { // duration of TF in bcs nBCsPerTF = nOrbitsPerTF * o2::constants::lhc::LHCMaxBunches; LOGP(info, "tsOrbitReset={} us, SOR = {} ms, EOR = {} ms, orbitSOR = {}, nBCsPerTF = {}", tsOrbitReset, tsSOR, tsEOR, orbitSOR, nBCsPerTF); + + auto hTsValues = histos.get(HIST("tsValues")); + hTsValues->GetXaxis()->SetBinLabel(1, "tsSOR"); + hTsValues->GetXaxis()->SetBinLabel(2, "tsEOR"); + hTsValues->SetBinContent(1, tsSOR / 1000); // seconds + hTsValues->SetBinContent(2, tsEOR / 1000); // seconds } // create orbit-axis histograms on the fly with binning based on info from GRP if GRP is available @@ -375,6 +400,18 @@ struct LumiStabilityTask { if (bcPatternB[localBC]) { histos.fill(HIST("FDD/timeACbcBVertex"), fdd.timeA(), fdd.timeC()); histos.fill(HIST("FDD/hBcBVertex"), localBC); + bool isLeadBC = true; + for (int jbit = localBC - minEmpty; jbit < localBC; jbit++) { + int kbit = jbit; + if (kbit < 0) + kbit += nbin; + if (bcPatternB[kbit]) { + isLeadBC = false; + break; + } + } + if (isLeadBC) + histos.fill(HIST("FDD/hBcBVertexL"), localBC); histos.fill(HIST("FDD/hTimeAVertex"), fdd.timeA()); histos.fill(HIST("FDD/hTimeCVertex"), fdd.timeC()); if (is2022Data) { @@ -426,6 +463,18 @@ struct LumiStabilityTask { if (bcPatternB[localBC]) { histos.fill(HIST("FDD/timeACbcB"), fdd.timeA(), fdd.timeC()); histos.fill(HIST("FDD/hBcB"), localBC); + bool isLeadBC = true; + for (int jbit = localBC - minEmpty; jbit < localBC; jbit++) { + int kbit = jbit; + if (kbit < 0) + kbit += nbin; + if (bcPatternB[kbit]) { + isLeadBC = false; + break; + } + } + if (isLeadBC) + histos.fill(HIST("FDD/hBcBL"), localBC); histos.fill(HIST("FDD/hTimeACoinc"), fdd.timeA()); histos.fill(HIST("FDD/hTimeCCoinc"), fdd.timeC()); if (!is2022Data) { @@ -574,6 +623,18 @@ struct LumiStabilityTask { if (bcPatternB[localBC]) { histos.fill(HIST("FT0/timeACbcB"), ft0.timeA(), ft0.timeC()); histos.fill(HIST("FT0/hBcB"), localBC); + bool isLeadBC = true; + for (int jbit = localBC - minEmpty; jbit < localBC; jbit++) { + int kbit = jbit; + if (kbit < 0) + kbit += nbin; + if (bcPatternB[kbit]) { + isLeadBC = false; + break; + } + } + if (isLeadBC) + histos.fill(HIST("FT0/hBcBL"), localBC); histos.fill(HIST("FT0/hTimeA"), ft0.timeA()); histos.fill(HIST("FT0/hTimeC"), ft0.timeC()); From a3a99b18ad120f7ced2af5c8b5e37d53a496ba26 Mon Sep 17 00:00:00 2001 From: Roman Lietava Date: Thu, 3 Apr 2025 09:30:58 +0200 Subject: [PATCH 0906/1650] [PWGLF,Trigger] dev: 1 added counter for negative amps filter 2 mult added to nonpromtcascade task (#10742) --- EventFiltering/PWGLF/strangenessFilter.cxx | 16 +++-- PWGLF/DataModel/LFNonPromptCascadeTables.h | 34 +++++----- PWGLF/Tasks/Strangeness/nonPromptCascade.cxx | 67 ++++++-------------- 3 files changed, 51 insertions(+), 66 deletions(-) diff --git a/EventFiltering/PWGLF/strangenessFilter.cxx b/EventFiltering/PWGLF/strangenessFilter.cxx index 68bbfcccc70..b9ca03197c6 100644 --- a/EventFiltering/PWGLF/strangenessFilter.cxx +++ b/EventFiltering/PWGLF/strangenessFilter.cxx @@ -475,6 +475,7 @@ struct strangenessFilter { } LOG(debug) << "Mean mults t0:" << fac_FT0A_ebe << " " << fac_FT0C_ebe; if (collision.has_foundFT0()) { + static int ampneg = 0; auto ft0 = collision.foundFT0(); float sumAmpFT0C = 0.f; for (std::size_t i_c = 0; i_c < ft0.amplitudeC().size(); i_c++) { @@ -494,19 +495,26 @@ struct strangenessFilter { } else { multFT0MNorm = sumAmpFT0C * weigthsEta5[0] + sumAmpFT0A * weigthsEta5[1]; } - LOG(info) << "meanMult:" << multFT0MNorm << " multFT0M:" << collision.multFT0M(); + LOG(debug) << "meanMult:" << multFT0MNorm << " multFT0M:" << collision.multFT0M(); + if (sumAmpFT0A < 0 || sumAmpFT0C < 0) { + // LOG(info) << "ampa: " << sumAmpFT0A << " ampc:" << sumAmpFT0C; + ampneg++; + } EventsvsMultiplicity.fill(HIST("AllEventsvsMultiplicityFT0MNorm"), multFT0MNorm); if (multFT0MNorm > LowLimitFT0MMultNorm) { isHighMultEvent = 1; - LOG(info) << "Found FT0 using aver mult"; + LOG(debug) << "Found FT0 using norm mult"; } } else { - LOG(warn) << "Found FT0 but, amplitudes are 0 ?"; + LOG(warn) << "Found FT0 but, bith amplitudes are <=0 "; EventsvsMultiplicity.fill(HIST("AllEventsvsMultiplicityFT0MNorm"), 148); EventsvsMultiplicity.fill(HIST("AllEventsvsMultiplicityFT0MNoFT0"), collision.multFT0M()); } + if (ampneg) { + LOG(warn) << "# of negative amplitudes:" << ampneg; + } } else { - LOG(warn) << "FT0 not Found, using FT0M"; + LOG(debug) << "FT0 not Found, using FT0M"; EventsvsMultiplicity.fill(HIST("AllEventsvsMultiplicityFT0MNorm"), 149); EventsvsMultiplicity.fill(HIST("AllEventsvsMultiplicityFT0MNoFT0"), collision.multFT0M()); } diff --git a/PWGLF/DataModel/LFNonPromptCascadeTables.h b/PWGLF/DataModel/LFNonPromptCascadeTables.h index e4a79fd07d7..1fc2b6f2082 100644 --- a/PWGLF/DataModel/LFNonPromptCascadeTables.h +++ b/PWGLF/DataModel/LFNonPromptCascadeTables.h @@ -26,7 +26,6 @@ namespace NPCascadeTable { DECLARE_SOA_COLUMN(MatchingChi2, matchingChi2, float); DECLARE_SOA_COLUMN(DeltaPtITSCascade, deltaPtITSCascade, float); -DECLARE_SOA_COLUMN(DeltaPtCascade, deltaPtCascade, float); DECLARE_SOA_COLUMN(ITSClusSize, itsClusSize, float); DECLARE_SOA_COLUMN(HasReassociatedCluster, hasReassociatedCluster, bool); DECLARE_SOA_COLUMN(IsGoodMatch, isGoodMatch, bool); @@ -104,14 +103,15 @@ DECLARE_SOA_COLUMN(DCAxMC, dcaXmc, float); DECLARE_SOA_COLUMN(DCAyMC, dcaYmc, float); DECLARE_SOA_COLUMN(DCAzMC, dcaZmc, float); DECLARE_SOA_COLUMN(MCcollisionMatch, mcCollisionMatch, bool); -DECLARE_SOA_COLUMN(HasFakeReassociation, hasFakeReassociation, bool); -DECLARE_SOA_COLUMN(MotherDecayDaughters, motherDecayDaughters, int8_t); + +DECLARE_SOA_COLUMN(Sel8, sel8, bool); +DECLARE_SOA_COLUMN(MultFT0C, multFT0C, float); +DECLARE_SOA_COLUMN(MultFT0A, multFT0A, float); } // namespace NPCascadeTable DECLARE_SOA_TABLE(NPCascTable, "AOD", "NPCASCTABLE", NPCascadeTable::MatchingChi2, NPCascadeTable::DeltaPtITSCascade, - NPCascadeTable::DeltaPtCascade, NPCascadeTable::ITSClusSize, NPCascadeTable::HasReassociatedCluster, aod::collision::NumContrib, @@ -162,12 +162,14 @@ DECLARE_SOA_TABLE(NPCascTable, "AOD", "NPCASCTABLE", NPCascadeTable::ProtonTOFNSigma, NPCascadeTable::PionTOFNSigma, NPCascadeTable::BachKaonTOFNSigma, - NPCascadeTable::BachPionTOFNSigma) + NPCascadeTable::BachPionTOFNSigma, + NPCascadeTable::Sel8, + NPCascadeTable::MultFT0C, + NPCascadeTable::MultFT0A) DECLARE_SOA_TABLE(NPCascTableNT, "AOD", "NPCASCTABLENT", NPCascadeTable::MatchingChi2, NPCascadeTable::DeltaPtITSCascade, - NPCascadeTable::DeltaPtCascade, NPCascadeTable::ITSClusSize, NPCascadeTable::HasReassociatedCluster, aod::collision::NumContrib, @@ -218,12 +220,14 @@ DECLARE_SOA_TABLE(NPCascTableNT, "AOD", "NPCASCTABLENT", NPCascadeTable::ProtonTOFNSigma, NPCascadeTable::PionTOFNSigma, NPCascadeTable::BachKaonTOFNSigma, - NPCascadeTable::BachPionTOFNSigma) + NPCascadeTable::BachPionTOFNSigma, + NPCascadeTable::Sel8, + NPCascadeTable::MultFT0C, + NPCascadeTable::MultFT0A) DECLARE_SOA_TABLE(NPCascTableMC, "AOD", "NPCASCTABLEMC", NPCascadeTable::MatchingChi2, NPCascadeTable::DeltaPtITSCascade, - NPCascadeTable::DeltaPtCascade, NPCascadeTable::ITSClusSize, NPCascadeTable::HasReassociatedCluster, NPCascadeTable::IsGoodMatch, @@ -289,13 +293,13 @@ DECLARE_SOA_TABLE(NPCascTableMC, "AOD", "NPCASCTABLEMC", NPCascadeTable::DCAyMC, NPCascadeTable::DCAzMC, NPCascadeTable::MCcollisionMatch, - NPCascadeTable::HasFakeReassociation, - NPCascadeTable::MotherDecayDaughters) + NPCascadeTable::Sel8, + NPCascadeTable::MultFT0C, + NPCascadeTable::MultFT0A) DECLARE_SOA_TABLE(NPCascTableMCNT, "AOD", "NPCASCTABLEMCNT", NPCascadeTable::MatchingChi2, NPCascadeTable::DeltaPtITSCascade, - NPCascadeTable::DeltaPtCascade, NPCascadeTable::ITSClusSize, NPCascadeTable::HasReassociatedCluster, NPCascadeTable::IsGoodMatch, @@ -361,8 +365,9 @@ DECLARE_SOA_TABLE(NPCascTableMCNT, "AOD", "NPCASCTABLEMCNT", NPCascadeTable::DCAyMC, NPCascadeTable::DCAzMC, NPCascadeTable::MCcollisionMatch, - NPCascadeTable::HasFakeReassociation, - NPCascadeTable::MotherDecayDaughters) + NPCascadeTable::Sel8, + NPCascadeTable::MultFT0C, + NPCascadeTable::MultFT0A) DECLARE_SOA_TABLE(NPCascTableGen, "AOD", "NPCASCTABLEGen", NPCascadeTable::gPt, @@ -374,8 +379,7 @@ DECLARE_SOA_TABLE(NPCascTableGen, "AOD", "NPCASCTABLEGen", NPCascadeTable::DCAyMC, NPCascadeTable::DCAzMC, NPCascadeTable::IsFromBeauty, - NPCascadeTable::IsFromCharm, - NPCascadeTable::MotherDecayDaughters) + NPCascadeTable::IsFromCharm) } // namespace o2::aod diff --git a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx index 566829a4b85..53376eab4f1 100644 --- a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx +++ b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx @@ -21,6 +21,7 @@ #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/PIDResponse.h" #include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/Multiplicity.h" #include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" #include "DataFormatsParameters/GRPMagField.h" @@ -54,11 +55,9 @@ struct NPCascCandidate { int64_t trackITSID; int64_t collisionID; float matchingChi2; - float deltaPtITS; float deltaPt; float itsClusSize; bool hasReassociatedCluster; - bool hasFakeReassociation; bool isGoodMatch; bool isGoodCascade; int pdgCodeMom; @@ -114,6 +113,9 @@ struct NPCascCandidate { float pionTOFNSigma; float bachKaonTOFNSigma; float bachPionTOFNSigma; + bool sel8; + float multFT0C; + float multFT0A; }; std::array isFromHF(auto& particle) @@ -163,8 +165,8 @@ struct NonPromptCascadeTask { using TracksExtData = soa::Join; using TracksExtMC = soa::Join; - using CollisionCandidatesRun3 = soa::Join; - using CollisionCandidatesRun3MC = soa::Join; + using CollisionCandidatesRun3 = soa::Join; + using CollisionCandidatesRun3MC = soa::Join; Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Configurable cfgPropToPCA{"cfgPropToPCA", true, "create tracks version propagated to PCA"}; @@ -337,15 +339,13 @@ struct NonPromptCascadeTask { o2::math_utils::SVector cascadePos, v0Pos; float cascCpa = -1, v0Cpa = -1; - o2::track::TrackParCov ntCascadeTrack; if (mDCAFitter.process(pionTrkParCov, protonTrkParCov)) { auto trackParCovV0 = mDCAFitter.createParentTrackParCov(0); // V0 track retrieved from p and pi daughters v0Pos = mDCAFitter.getPCACandidate(); if (mDCAFitter.process(trackParCovV0, bachTrkParCov)) { mDCAFitter.getTrackParamAtPCA(0).getPxPyPzGlo(momenta[0]); mDCAFitter.getTrackParamAtPCA(1).getPxPyPzGlo(momenta[1]); - ntCascadeTrack = mDCAFitter.createParentTrackParCov(); - ntCascadeTrack.getPxPyPzGlo(cascadeMomentum); + mDCAFitter.createParentTrackParCov().getPxPyPzGlo(cascadeMomentum); std::array pvPos = {primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ()}; cascadePos = mDCAFitter.getPCACandidate(); cascCpa = RecoDecay::cpa(pvPos, mDCAFitter.getPCACandidate(), cascadeMomentum); @@ -393,7 +393,6 @@ struct NonPromptCascadeTask { if (v0part.mothersIds()[0] == bachelor.mcParticle().mothersIds()[0]) { if (std::abs(motherV0.pdgCode()) == 3312 || std::abs(motherV0.pdgCode()) == 3334) { isGoodCascade = true; - isOmega = (std::abs(motherV0.pdgCode()) == 3334); fromHF = isFromHF(motherV0); mcParticleID = v0part.mothersIds()[0]; @@ -418,8 +417,8 @@ struct NonPromptCascadeTask { o2::base::Propagator::Instance()->propagateToDCA(primaryVertex, pionTrkParCov, mBz, 2.f, matCorr, &pionDCA); o2::base::Propagator::Instance()->propagateToDCA(primaryVertex, bachTrkParCov, mBz, 2.f, matCorr, &bachDCA); - float deltaPtITSCascade{-1.e10f}, deltaPtCascade{-1.e10f}, cascITSclsSize{-1.e10f}, matchingChi2{-1.e10f}; - bool hasReassociatedClusters{false}, hasFakeReassociation{false}; + float deltaPtITSCascade{-1.e10f}, cascITSclsSize{-1.e10f}, matchingChi2{-1.e10f}; + bool hasReassociatedClusters{false}; int trackedCascGlobalIndex{-1}, itsTrackGlobalIndex{-1}, cascITSclusters{-1}; if constexpr (requires { candidate.track(); }) { const auto& track = candidate.template track_as(); @@ -429,7 +428,6 @@ struct NonPromptCascadeTask { hasReassociatedClusters = (track.itsNCls() != ITStrack.itsNCls()); cascadeLvector.SetCoordinates(track.pt(), track.eta(), track.phi(), 0); deltaPtITSCascade = std::hypot(cascadeMomentum[0], cascadeMomentum[1]) - ITStrack.pt(); - deltaPtCascade = std::hypot(cascadeMomentum[0], cascadeMomentum[1]) - track.pt(); trackedCascGlobalIndex = track.globalIndex(); itsTrackGlobalIndex = ITStrack.globalIndex(); cascITSclusters = track.itsNCls(); @@ -441,14 +439,14 @@ struct NonPromptCascadeTask { if (isGoodMatch) { pdgCodeMom = track.mcParticle().has_mothers() ? track.mcParticle().template mothers_as()[0].pdgCode() : 0; - hasFakeReassociation = track.mcMask() & (1 << 15); } itsTrackPDG = ITStrack.has_mcParticle() ? ITStrack.mcParticle().pdgCode() : 0; } - } else { - o2::base::Propagator::Instance()->propagateToDCA(primaryVertex, ntCascadeTrack, mBz, 2.f, matCorr, &motherDCA); } - candidates.emplace_back(NPCascCandidate{mcParticleID, trackedCascGlobalIndex, itsTrackGlobalIndex, candidate.collisionId(), matchingChi2, deltaPtITSCascade, deltaPtCascade, cascITSclsSize, hasReassociatedClusters, hasFakeReassociation, isGoodMatch, isGoodCascade, pdgCodeMom, itsTrackPDG, fromHF[0], fromHF[1], + // bool mysel8 = collision.sel8(); + float mc = collision.multFT0C(); + float ma = collision.multFT0A(); + candidates.emplace_back(NPCascCandidate{mcParticleID, trackedCascGlobalIndex, itsTrackGlobalIndex, candidate.collisionId(), matchingChi2, deltaPtITSCascade, cascITSclsSize, hasReassociatedClusters, isGoodMatch, isGoodCascade, pdgCodeMom, itsTrackPDG, fromHF[0], fromHF[1], collision.numContrib(), collision.collisionTimeRes(), primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ(), cascadeLvector.pt(), cascadeLvector.eta(), cascadeLvector.phi(), protonTrack.pt(), protonTrack.eta(), pionTrack.pt(), pionTrack.eta(), bachelor.pt(), bachelor.eta(), @@ -458,7 +456,7 @@ struct NonPromptCascadeTask { cascITSclusters, protonTrack.itsNCls(), pionTrack.itsNCls(), bachelor.itsNCls(), protonTrack.tpcNClsFound(), pionTrack.tpcNClsFound(), bachelor.tpcNClsFound(), protonTrack.tpcNSigmaPr(), pionTrack.tpcNSigmaPi(), bachelor.tpcNSigmaKa(), bachelor.tpcNSigmaPi(), protonTrack.hasTOF(), pionTrack.hasTOF(), bachelor.hasTOF(), - protonTrack.tofNSigmaPr(), pionTrack.tofNSigmaPi(), bachelor.tofNSigmaKa(), bachelor.tofNSigmaPi()}); + protonTrack.tofNSigmaPr(), pionTrack.tofNSigmaPi(), bachelor.tofNSigmaKa(), bachelor.tofNSigmaPi(), collision.sel8(), mc, ma}); } } @@ -466,7 +464,7 @@ struct NonPromptCascadeTask { void fillDataTable(auto const& candidates) { for (const auto& c : candidates) { - getDataTable()(c.matchingChi2, c.deltaPtITS, c.deltaPt, c.itsClusSize, c.hasReassociatedCluster, + getDataTable()(c.matchingChi2, c.deltaPt, c.itsClusSize, c.hasReassociatedCluster, c.pvContributors, c.pvTimeResolution, c.pvX, c.pvY, c.pvZ, c.cascPt, c.cascEta, c.cascPhi, c.protonPt, c.protonEta, c.pionPt, c.pionEta, c.bachPt, c.bachEta, @@ -477,7 +475,7 @@ struct NonPromptCascadeTask { c.cascNClusITS, c.protonNClusITS, c.pionNClusITS, c.bachNClusITS, c.protonNClusTPC, c.pionNClusTPC, c.bachNClusTPC, c.protonTPCNSigma, c.pionTPCNSigma, c.bachKaonTPCNSigma, c.bachPionTPCNSigma, c.protonHasTOF, c.pionHasTOF, c.bachHasTOF, - c.protonTOFNSigma, c.pionTOFNSigma, c.bachKaonTOFNSigma, c.bachPionTOFNSigma); + c.protonTOFNSigma, c.pionTOFNSigma, c.bachKaonTOFNSigma, c.bachPionTOFNSigma, c.sel8, c.multFT0C, c.multFT0A); } } @@ -490,31 +488,19 @@ struct NonPromptCascadeTask { continue; } auto particle = mcParticles.iteratorAt(c.mcParticleId); - int motherDecayDaughters{0}; - if (c.isFromBeauty || c.isFromCharm) { - auto mom = particle.template mothers_as()[0]; - auto daughters = mom.template daughters_as(); - motherDecayDaughters = daughters.size(); - for (const auto& d : daughters) { - if (std::abs(d.pdgCode()) == 11 || std::abs(d.pdgCode()) == 13) { - motherDecayDaughters *= -1; - break; - } - } - } auto mcCollision = particle.template mcCollision_as(); auto recCollision = collisions.iteratorAt(c.collisionID); - getMCtable()(c.matchingChi2, c.deltaPtITS, c.deltaPt, c.itsClusSize, c.hasReassociatedCluster, c.isGoodMatch, c.isGoodCascade, c.pdgCodeMom, c.pdgCodeITStrack, c.isFromBeauty, c.isFromCharm, + getMCtable()(c.matchingChi2, c.deltaPt, c.itsClusSize, c.hasReassociatedCluster, c.isGoodMatch, c.isGoodCascade, c.pdgCodeMom, c.pdgCodeITStrack, c.isFromBeauty, c.isFromCharm, c.pvContributors, c.pvTimeResolution, c.pvX, c.pvY, c.pvZ, c.cascPt, c.cascEta, c.cascPhi, c.protonPt, c.protonEta, c.pionPt, c.pionEta, c.bachPt, c.bachEta, c.cascDCAxy, c.cascDCAz, c.protonDCAxy, c.protonDCAz, c.pionDCAxy, c.pionDCAz, c.bachDCAxy, c.bachDCAz, c.casccosPA, c.v0cosPA, c.massXi, c.massOmega, c.massV0, c.cascRadius, c.v0radius, c.cascLength, c.v0length, c.cascNClusITS, c.protonNClusITS, c.pionNClusITS, c.bachNClusITS, c.protonNClusTPC, c.pionNClusTPC, c.bachNClusTPC, c.protonTPCNSigma, c.pionTPCNSigma, c.bachKaonTPCNSigma, c.bachPionTPCNSigma, c.protonHasTOF, c.pionHasTOF, c.bachHasTOF, - c.protonTOFNSigma, c.pionTOFNSigma, c.bachKaonTOFNSigma, c.bachPionTOFNSigma, + c.protonTOFNSigma, c.pionTOFNSigma, c.bachKaonTOFNSigma, c.bachPionTOFNSigma, c.sel8, c.multFT0C, c.multFT0A, particle.pt(), particle.eta(), particle.phi(), particle.pdgCode(), mcCollision.posX() - particle.vx(), mcCollision.posY() - particle.vy(), - mcCollision.posZ() - particle.vz(), mcCollision.globalIndex() == recCollision.mcCollisionId(), c.hasFakeReassociation, motherDecayDaughters); + mcCollision.posZ() - particle.vz(), mcCollision.globalIndex() == recCollision.mcCollisionId()); } } @@ -568,20 +554,7 @@ struct NonPromptCascadeTask { int pdgCodeMom = p.has_mothers() ? p.template mothers_as()[0].pdgCode() : 0; auto mcCollision = p.template mcCollision_as(); - int motherDecayDaughters{0}; - if (fromHF[0] || fromHF[1]) { - auto mom = p.template mothers_as()[0]; - auto daughters = mom.template daughters_as(); - motherDecayDaughters = daughters.size(); - for (const auto& d : daughters) { - if (std::abs(d.pdgCode()) == 11 || std::abs(d.pdgCode()) == 13) { - motherDecayDaughters *= -1; - break; - } - } - } - - NPCTableGen(p.pt(), p.eta(), p.phi(), p.pdgCode(), pdgCodeMom, mcCollision.posX() - p.vx(), mcCollision.posY() - p.vy(), mcCollision.posZ() - p.vz(), fromHF[0], fromHF[1], motherDecayDaughters); + NPCTableGen(p.pt(), p.eta(), p.phi(), p.pdgCode(), pdgCodeMom, mcCollision.posX() - p.vx(), mcCollision.posY() - p.vy(), mcCollision.posZ() - p.vz(), fromHF[0], fromHF[1]); } } PROCESS_SWITCH(NonPromptCascadeTask, processGenParticles, "process gen cascades: MC analysis", false); From fdd80ea8e478c27baad735993088e0731bc272ea Mon Sep 17 00:00:00 2001 From: Fabrizio Date: Thu, 3 Apr 2025 12:43:49 +0200 Subject: [PATCH 0907/1650] [PWGHF,Trigger] Fix bugs for B->JPsi(->mumu) triggers (#10736) --- EventFiltering/PWGHF/HFFilter.cxx | 4 ++-- EventFiltering/PWGHF/HFFilterHelpers.h | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/EventFiltering/PWGHF/HFFilter.cxx b/EventFiltering/PWGHF/HFFilter.cxx index 2e88cbb9d25..290ba19c1c5 100644 --- a/EventFiltering/PWGHF/HFFilter.cxx +++ b/EventFiltering/PWGHF/HFFilter.cxx @@ -715,7 +715,7 @@ struct HfFilter { // Main struct for HF triggers // Beauty with JPsi if (preselJPsiToMuMu) { - if (TESTBIT(helper.isSelectedTrackForSoftPionOrBeauty(track, trackParThird, dcaThird), kForBeauty)) { // same for all channels + if (!TESTBIT(helper.isSelectedTrackForSoftPionOrBeauty(track, trackParThird, dcaThird), kForBeauty)) { // same for all channels continue; } std::array pVecPosVtx{}, pVecNegVtx{}, pVecThirdVtx{}, pVecFourthVtx{}; @@ -753,7 +753,7 @@ struct HfFilter { // Main struct for HF triggers o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParFourth, 2.f, noMatCorr, &dcaFourth); getPxPyPz(trackParFourth, pVecFourth); } - if (TESTBIT(helper.isSelectedTrackForSoftPionOrBeauty(trackFourth, trackParFourth, dcaFourth), kForBeauty)) { // same for all channels + if (!TESTBIT(helper.isSelectedTrackForSoftPionOrBeauty(trackFourth, trackParFourth, dcaFourth), kForBeauty)) { // same for all channels continue; } if (df4.process(trackParPos, trackParNeg, trackParThird, trackParFourth) != 0) { diff --git a/EventFiltering/PWGHF/HFFilterHelpers.h b/EventFiltering/PWGHF/HFFilterHelpers.h index ce95d24e5cd..219910cd836 100644 --- a/EventFiltering/PWGHF/HFFilterHelpers.h +++ b/EventFiltering/PWGHF/HFFilterHelpers.h @@ -320,7 +320,7 @@ namespace hf_trigger_cuts_presel_beauty { static constexpr int nBinsPt = 2; static constexpr int nCutVars = 4; -static constexpr int nCutVarsBtoJPsi = 4; +static constexpr int nCutVarsBtoJPsi = 6; // default values for the pT bin edges (can be used to configure histogram axis) // common for any beauty candidate constexpr double binsPt[nBinsPt + 1] = { @@ -332,14 +332,14 @@ auto vecBinsPt = std::vector{binsPt, binsPt + nBinsPt + 1}; constexpr double cuts[nBinsPt][nCutVars] = {{0.4, -1, -1, 10.}, /* 0 < pt < 5 */ {0.4, -1, -1, 10.}}; /* 5 < pt < 1000 */ -constexpr double cutsBtoJPsi[nBinsPt][nCutVarsBtoJPsi] = {{1., 0.6, 0.9, 0.02}, /* 0 < pt < 5 */ - {1., 0.8, 0.9, 0.02}}; /* 5 < pt < 1000 */ +constexpr double cutsBtoJPsi[nBinsPt][nCutVarsBtoJPsi] = {{1., 0.6, 0.9, 0.02, 0.02, 0.1}, /* 0 < pt < 5 */ + {1., 0.8, 0.9, 0.02, 0.02, 0.1}}; /* 5 < pt < 1000 */ // row labels static const std::vector labelsPt{}; // column labels static const std::vector labelsColumnsTopolBeauty = {"DeltaMassB", "minCPA", "minDecayLength", "maxImpParProd"}; -static const std::vector labelsColumnsCutsBeautyToJPsi = {"minPtMuon", "DeltaMassB", "minCPA", "minDecayLength"}; +static const std::vector labelsColumnsCutsBeautyToJPsi = {"minPtMuon", "DeltaMassB", "minCPA", "minDecayLength", "DeltaMassKK", "DeltaMassKPi"}; } // namespace hf_trigger_cuts_presel_beauty @@ -2154,7 +2154,7 @@ inline int8_t HfFilterHelper::isSelectedBhadronToJPsi(std::array pV bool isSecondProton = isSelectedProton4CharmOrBeautyBaryons(tracksDauNoMu[1]); auto massKaKa = RecoDecay::m(std::array{pVecDauTracks[2], pVecDauTracks[3]}, std::array{massKa, massKa}); if (isFirstKaon && isSeconKaon) { - if (std::fabs(massKaKa - massPhi) < 0.02f) { + if (std::fabs(massKaKa - massPhi) < mCutsBhadToJPsi.get(binPtB, 4u)) { auto massJPsiKaKa = RecoDecay::m(std::array{pVecJPsi, pVecDauTracks[2], pVecDauTracks[3]}, std::array{massJPsi, massKa, massKa}); if (std::fabs(massJPsiKaKa - massBs) < mCutsBhadToJPsi.get(binPtB, 1u)) { SETBIT(isSelected, kBsToJPsi); @@ -2166,7 +2166,7 @@ inline int8_t HfFilterHelper::isSelectedBhadronToJPsi(std::array pV } if (isFirstKaon) { auto massKaPi = RecoDecay::m(std::array{pVecDauTracks[2], pVecDauTracks[3]}, std::array{massKa, massPi}); - if (std::fabs(massKaPi - massPhi) < 0.1f) { + if (std::fabs(massKaPi - massK0Star892) < mCutsBhadToJPsi.get(binPtB, 5u)) { auto massJPsiKaPi = RecoDecay::m(std::array{pVecJPsi, pVecDauTracks[2], pVecDauTracks[3]}, std::array{massJPsi, massKa, massPi}); if (std::fabs(massJPsiKaPi - massB0) < mCutsBhadToJPsi.get(binPtB, 1u)) { SETBIT(isSelected, kB0ToJPsi); @@ -2178,7 +2178,7 @@ inline int8_t HfFilterHelper::isSelectedBhadronToJPsi(std::array pV } if (isSeconKaon) { auto massPiKa = RecoDecay::m(std::array{pVecDauTracks[2], pVecDauTracks[3]}, std::array{massPi, massKa}); - if (std::fabs(massPiKa - massPhi) < 0.1f) { + if (std::fabs(massPiKa - massK0Star892) < mCutsBhadToJPsi.get(binPtB, 5u)) { auto massJPsiPiKa = RecoDecay::m(std::array{pVecJPsi, pVecDauTracks[2], pVecDauTracks[3]}, std::array{massJPsi, massPi, massKa}); if (std::fabs(massJPsiPiKa - massB0) < mCutsBhadToJPsi.get(binPtB, 1u)) { SETBIT(isSelected, kB0ToJPsi); From 5e15c69505b5dc57229fec73e6a2e4b0f29b484b Mon Sep 17 00:00:00 2001 From: Marvin Hemmer <53471402+mhemmer-cern@users.noreply.github.com> Date: Thu, 3 Apr 2025 13:29:43 +0200 Subject: [PATCH 0908/1650] =?UTF-8?q?[PWGJE,EMCAL-850]=20emcEventSelection?= =?UTF-8?q?QA=20-=20Add=20histogram=20to=20monitor=20BCs=20=E2=80=A6=20(#1?= =?UTF-8?q?0745)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PWGJE/Tasks/emcEventSelectionQA.cxx | 85 ++++++++++++++++------------- 1 file changed, 46 insertions(+), 39 deletions(-) diff --git a/PWGJE/Tasks/emcEventSelectionQA.cxx b/PWGJE/Tasks/emcEventSelectionQA.cxx index de4228aa70e..4b2e9e06b67 100644 --- a/PWGJE/Tasks/emcEventSelectionQA.cxx +++ b/PWGJE/Tasks/emcEventSelectionQA.cxx @@ -9,8 +9,8 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -// Monitoring task for EMCAL event selection -// +/// \file emcEventSelectionQA.cxx +/// \brief Monitoring task for EMCAL event selection /// \author Markus Fasel , Oak Ridge National Laoratory #include @@ -27,8 +27,8 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; -using bcEvSels = o2::soa::Join; -using collEventSels = o2::soa::Join; +using BCEvSels = o2::soa::Join; +using CollEventSels = o2::soa::Join; struct EmcEventSelectionQA { o2::framework::HistogramRegistry mHistManager{"EMCALEventSelectionQAHistograms"}; @@ -38,41 +38,43 @@ struct EmcEventSelectionQA { void init(o2::framework::InitContext const&) { - using o2HistType = o2::framework::HistType; - using o2Axis = o2::framework::AxisSpec; + using O2HistType = o2::framework::HistType; + using O2Axis = o2::framework::AxisSpec; - o2Axis matchingAxis{3, -0.5, 2.5, "Matching Status (0, 1, 2+ collisions)", "Matching status"}, // 0, no vertex,1 vertex found , 2 multiple vertices found + O2Axis matchingAxis{3, -0.5, 2.5, "Matching Status (0, 1, 2+ collisions)", "Matching status"}, // 0, no vertex,1 vertex found , 2 multiple vertices found bcAxis{4001, -0.5, 4000.5, "bcid", "BC ID"}; - mHistManager.add("hCollisionMatching", "Collision Status", o2HistType::kTH1F, {matchingAxis}); - mHistManager.add("hCollisionMatchingReadout", "Collision Status EMCAL Readout", o2HistType::kTH1F, {matchingAxis}); - mHistManager.add("hCollisionMatchingMB", "Collision Status EMCAL MB", o2HistType::kTH1F, {matchingAxis}); - mHistManager.add("hCollisionMatching0EMC", "Collision Status EMCAL L0 trigger", o2HistType::kTH1F, {matchingAxis}); - mHistManager.add("hCollisionMatching0DMC", "Collision Status DCAL L0 tr", o2HistType::kTH1F, {matchingAxis}); - mHistManager.add("hCollisionMatchingEG1", "Collision Status EG1 trigger", o2HistType::kTH1F, {matchingAxis}); - mHistManager.add("hCollisionMatchingDG1", "Collision Status DG1 trigger", o2HistType::kTH1F, {matchingAxis}); - mHistManager.add("hCollisionMatchingEG2", "Collision Status EG2 trigger", o2HistType::kTH1F, {matchingAxis}); - mHistManager.add("hCollisionMatchingDG2", "Collision Status DG2 trigger", o2HistType::kTH1F, {matchingAxis}); - mHistManager.add("hCollisionMatchingEJ1", "Collision Status EJ1 trigger", o2HistType::kTH1F, {matchingAxis}); - mHistManager.add("hCollisionMatchingDJ1", "Collision Status DJ1 trigger", o2HistType::kTH1F, {matchingAxis}); - mHistManager.add("hCollisionMatchingEJ2", "Collision Status EJ2 trigger", o2HistType::kTH1F, {matchingAxis}); - mHistManager.add("hCollisionMatchingDJ2", "Collision Status DJ2 trigger", o2HistType::kTH1F, {matchingAxis}); - mHistManager.add("hBCCollisions", "Bunch crossings of found collisions", o2HistType::kTH1F, {bcAxis}); - mHistManager.add("hBCEmcalReadout", "Bunch crossings with EMCAL trigger from CTP", o2HistType::kTH1F, {bcAxis}); - mHistManager.add("hBCEmcalMB", "Bunch crossings with EMCAL MB from CTP", o2HistType::kTH1F, {bcAxis}); - mHistManager.add("hBCEmcal0EMC", "Bunch crossings with EMCAL L0 from CTP", o2HistType::kTH1F, {bcAxis}); - mHistManager.add("hBCEmcal0DMC", "Bunch crossings with DCAL L0 from CTP", o2HistType::kTH1F, {bcAxis}); - mHistManager.add("hBCEmcalEG1", "Bunch crossings with EG1 trigger from CTP", o2HistType::kTH1F, {bcAxis}); - mHistManager.add("hBCEmcalDG1", "Bunch crossings with DG1 trigger from CTP", o2HistType::kTH1F, {bcAxis}); - mHistManager.add("hBCEmcalEG2", "Bunch crossings with EG1 trigger from CTP", o2HistType::kTH1F, {bcAxis}); - mHistManager.add("hBCEmcalDG2", "Bunch crossings with DG2 trigger from CTP", o2HistType::kTH1F, {bcAxis}); - mHistManager.add("hBCEmcalEJ1", "Bunch crossings with EJ1 trigger from CTP", o2HistType::kTH1F, {bcAxis}); - mHistManager.add("hBCEmcalDJ1", "Bunch crossings with DJ1 trigger from CTP", o2HistType::kTH1F, {bcAxis}); - mHistManager.add("hBCEmcalEJ2", "Bunch crossings with EJ2 trigger from CTP", o2HistType::kTH1F, {bcAxis}); - mHistManager.add("hBCEmcalDJ2", "Bunch crossings with DJ2 trigger from CTP", o2HistType::kTH1F, {bcAxis}); - mHistManager.add("hBCTVX", "Bunch crossings with FIT TVX trigger from CTP", o2HistType::kTH1F, {bcAxis}); - mHistManager.add("hBCEmcalCellContent", "Bunch crossings with non-0 EMCAL cell content", o2HistType::kTH1F, {bcAxis}); - mHistManager.add("hBCCollisionCounter_TVX", "Number of BCs with a certain number of rec. colls", o2HistType::kTH2F, {bcAxis, matchingAxis}); + mHistManager.add("hCollisionMatching", "Collision Status", O2HistType::kTH1F, {matchingAxis}); + mHistManager.add("hCollisionMatchingReadout", "Collision Status EMCAL Readout", O2HistType::kTH1F, {matchingAxis}); + mHistManager.add("hCollisionMatchingMB", "Collision Status EMCAL MB", O2HistType::kTH1F, {matchingAxis}); + mHistManager.add("hCollisionMatching0EMC", "Collision Status EMCAL L0 trigger", O2HistType::kTH1F, {matchingAxis}); + mHistManager.add("hCollisionMatching0DMC", "Collision Status DCAL L0 tr", O2HistType::kTH1F, {matchingAxis}); + mHistManager.add("hCollisionMatchingEG1", "Collision Status EG1 trigger", O2HistType::kTH1F, {matchingAxis}); + mHistManager.add("hCollisionMatchingDG1", "Collision Status DG1 trigger", O2HistType::kTH1F, {matchingAxis}); + mHistManager.add("hCollisionMatchingEG2", "Collision Status EG2 trigger", O2HistType::kTH1F, {matchingAxis}); + mHistManager.add("hCollisionMatchingDG2", "Collision Status DG2 trigger", O2HistType::kTH1F, {matchingAxis}); + mHistManager.add("hCollisionMatchingEJ1", "Collision Status EJ1 trigger", O2HistType::kTH1F, {matchingAxis}); + mHistManager.add("hCollisionMatchingDJ1", "Collision Status DJ1 trigger", O2HistType::kTH1F, {matchingAxis}); + mHistManager.add("hCollisionMatchingEJ2", "Collision Status EJ2 trigger", O2HistType::kTH1F, {matchingAxis}); + mHistManager.add("hCollisionMatchingDJ2", "Collision Status DJ2 trigger", O2HistType::kTH1F, {matchingAxis}); + mHistManager.add("hBCCollisions", "Bunch crossings of found collisions", O2HistType::kTH1F, {bcAxis}); + mHistManager.add("hBCEmcalReadout", "Bunch crossings with EMCAL trigger from CTP", O2HistType::kTH1F, {bcAxis}); + mHistManager.add("hBCEmcalMB", "Bunch crossings with EMCAL MB from CTP", O2HistType::kTH1F, {bcAxis}); + mHistManager.add("hBCEmcal0EMC", "Bunch crossings with EMCAL L0 from CTP", O2HistType::kTH1F, {bcAxis}); + mHistManager.add("hBCEmcal0DMC", "Bunch crossings with DCAL L0 from CTP", O2HistType::kTH1F, {bcAxis}); + mHistManager.add("hBCEmcalEG1", "Bunch crossings with EG1 trigger from CTP", O2HistType::kTH1F, {bcAxis}); + mHistManager.add("hBCEmcalDG1", "Bunch crossings with DG1 trigger from CTP", O2HistType::kTH1F, {bcAxis}); + mHistManager.add("hBCEmcalEG2", "Bunch crossings with EG1 trigger from CTP", O2HistType::kTH1F, {bcAxis}); + mHistManager.add("hBCEmcalDG2", "Bunch crossings with DG2 trigger from CTP", O2HistType::kTH1F, {bcAxis}); + mHistManager.add("hBCEmcalEJ1", "Bunch crossings with EJ1 trigger from CTP", O2HistType::kTH1F, {bcAxis}); + mHistManager.add("hBCEmcalDJ1", "Bunch crossings with DJ1 trigger from CTP", O2HistType::kTH1F, {bcAxis}); + mHistManager.add("hBCEmcalEJ2", "Bunch crossings with EJ2 trigger from CTP", O2HistType::kTH1F, {bcAxis}); + mHistManager.add("hBCEmcalDJ2", "Bunch crossings with DJ2 trigger from CTP", O2HistType::kTH1F, {bcAxis}); + mHistManager.add("hBCTVX", "Bunch crossings with FIT TVX trigger from CTP", O2HistType::kTH1F, {bcAxis}); + mHistManager.add("hBCEmcalCellContent", "Bunch crossings with non-0 EMCAL cell content", O2HistType::kTH1F, {bcAxis}); + mHistManager.add("hBCCollisionCounter_TVX", "Number of BCs with a certain number of rec. colls", O2HistType::kTH2F, {bcAxis, matchingAxis}); + mHistManager.add("hBCEMCalReadoutAndEmcalCellContent", "Bunch crossings with EMCAL trigger from CTP and non-0 EMCAL cell content", O2HistType::kTH1F, {bcAxis}); + mHistManager.add("hBCNotEMCalReadoutButEmcalCellContent", "Bunch crossings without EMCAL trigger from CTP but with non-0 EMCAL cell content", O2HistType::kTH1F, {bcAxis}); initCollisionHistogram(mHistManager.get(HIST("hCollisionMatching")).get()); initCollisionHistogram(mHistManager.get(HIST("hCollisionMatchingReadout")).get()); @@ -89,15 +91,15 @@ struct EmcEventSelectionQA { initCollisionHistogram(mHistManager.get(HIST("hCollisionMatchingDJ2")).get()); } - PresliceUnsorted perFoundBC = aod::evsel::foundBCId; + PresliceUnsorted perFoundBC = aod::evsel::foundBCId; - void process(bcEvSels const& bcs, collEventSels const& collisions, soa::Filtered const& cells) + void process(BCEvSels const& bcs, CollEventSels const& collisions, soa::Filtered const& cells) { std::unordered_map cellGlobalBCs; // Build map of number of cells for corrected BCs using global BCs // used later in the determination whether a BC has EMC cell content (for speed reason) for (const auto& cell : cells) { - auto globalbcid = cell.bc_as().globalBC(); + auto globalbcid = cell.bc_as().globalBC(); auto found = cellGlobalBCs.find(globalbcid); if (found != cellGlobalBCs.end()) { found->second++; @@ -170,6 +172,11 @@ struct EmcEventSelectionQA { // require at least 1 cell for global BC if (found->second > 0) { mHistManager.fill(HIST("hBCEmcalCellContent"), bcID); + if (isEMCALreadout) { + mHistManager.fill(HIST("hBCEMCalReadoutAndEmcalCellContent"), bcID); + } else { + mHistManager.fill(HIST("hBCNotEMCalReadoutButEmcalCellContent"), bcID); + } } } From ef96eb8442735d66e08aaf9bc0ea3b4654a2ab2e Mon Sep 17 00:00:00 2001 From: suyoupeng <109774812+15071832337@users.noreply.github.com> Date: Thu, 3 Apr 2025 21:52:47 +0800 Subject: [PATCH 0909/1650] [PWGLF] Lambda local polarization induced by jet in pp collision 13.6 TeV (#10744) --- .../lambdaJetpolarizationbuilder.cxx | 128 ++++++++++-------- .../Strangeness/lambdaJetpolarization.cxx | 9 ++ 2 files changed, 81 insertions(+), 56 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/lambdaJetpolarizationbuilder.cxx b/PWGLF/TableProducer/Strangeness/lambdaJetpolarizationbuilder.cxx index b7202d35142..6c8138f65a4 100644 --- a/PWGLF/TableProducer/Strangeness/lambdaJetpolarizationbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/lambdaJetpolarizationbuilder.cxx @@ -84,6 +84,7 @@ struct myAnalysis { Configurable minNCrossedRowsTPC{"minNCrossedRowsTPC", 80.0f, "min number of TPC crossed rows"}; Configurable maxChi2TPC{"maxChi2TPC", 4.0f, "max chi2 per cluster TPC"}; Configurable maxChi2ITS{"maxChi2ITS", 36.0f, "max chi2 per cluster ITS"}; + Configurable minTpcNcrossedRowsOverFindable{"minTpcNcrossedRowsOverFindable", 0.8, "crossed rows/findable"}; Configurable etaMin{"etaMin", -0.8f, "eta min track"}; Configurable etaMax{"etaMax", +0.8f, "eta max track"}; Configurable minimumV0Radius{"minimumV0Radius", 0.2f, "Minimum V0 Radius"}; @@ -111,6 +112,7 @@ struct myAnalysis { Configurable dcav0dau{"dcav0dau", 1.0, "DCA V0 Daughters"}; Configurable doArmenterosCut{"doArmenterosCut", 1, "do Armenteros Cut"}; Configurable paramArmenterosCut{"paramArmenterosCut", 0.2, "parameter Armenteros Cut"}; + Configurable doDrawPicture{"doDrawPicture", 0, "do Draw Picture"}; // CONFIG DONE ///////////////////////////////////////// //INIT//////////////////////////////////////////////////////////////////// // int eventSelection = -1; @@ -196,8 +198,6 @@ struct myAnalysis { JEhistos.add("jetpx", "jetpx", kTH1F, {axisPx}); JEhistos.add("jetpy", "jetpy", kTH1F, {axisPy}); JEhistos.add("jetpz", "jetpz", kTH1F, {axisPz}); - JEhistos.add("hV0Lambda", "V0Lambda", - {HistType::kTHnSparseF, {eventAxis, axisPx, axisPy, axisPz, massAxis, axisPx, axisPy, axisPz}}); JEhistos.add("EventIndexselection", "EventIndexselection", {HistType::kTH1F, {{1000000, 0.5f, 1000000.5f}}}); } JEhistos.add("hKaonplusCounts", "hKaonplusCounts", {HistType::kTH1F, {{1, -0.5, 0.5f}}}); @@ -310,8 +310,12 @@ struct myAnalysis { return false; if (track.tpcNClsCrossedRows() < minNCrossedRowsTPC) return false; + if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < minTpcNcrossedRowsOverFindable) + return false; if (track.tpcChi2NCl() > maxChi2TPC) return false; + if (track.itsChi2NCl() > maxChi2ITS) + return false; if (track.eta() < etaMin || track.eta() > etaMax) return false; if (requireTOF && (!track.hasTOF())) @@ -516,28 +520,31 @@ struct myAnalysis { for (auto const& track : tracks) { auto originalTrack = track.track_as>(); - JEhistos.fill(HIST("hDCArToPv"), originalTrack.dcaXY()); - JEhistos.fill(HIST("hDCAzToPv"), originalTrack.dcaZ()); - JEhistos.fill(HIST("rawpT"), originalTrack.pt()); - JEhistos.fill(HIST("rawDpT"), track.pt(), track.pt() - originalTrack.pt()); - JEhistos.fill(HIST("hIsPrim"), originalTrack.isPrimaryTrack()); - JEhistos.fill(HIST("hIsGood"), originalTrack.isGlobalTrackWoDCA()); - JEhistos.fill(HIST("hIsPrimCont"), originalTrack.isPVContributor()); - JEhistos.fill(HIST("hFindableTPCClusters"), originalTrack.tpcNClsFindable()); - JEhistos.fill(HIST("hFindableTPCRows"), originalTrack.tpcNClsCrossedRows()); - JEhistos.fill(HIST("hClustersVsRows"), originalTrack.tpcCrossedRowsOverFindableCls()); - JEhistos.fill(HIST("hTPCChi2"), originalTrack.tpcChi2NCl()); - JEhistos.fill(HIST("hITSChi2"), originalTrack.itsChi2NCl()); - JEhistos.fill(HIST("h_track_pt"), track.pt()); - JEhistos.fill(HIST("h_track_eta"), track.eta()); - JEhistos.fill(HIST("h_track_phi"), track.phi()); - + if (doDrawPicture) { + JEhistos.fill(HIST("hDCArToPv"), originalTrack.dcaXY()); + JEhistos.fill(HIST("hDCAzToPv"), originalTrack.dcaZ()); + JEhistos.fill(HIST("rawpT"), originalTrack.pt()); + JEhistos.fill(HIST("rawDpT"), track.pt(), track.pt() - originalTrack.pt()); + JEhistos.fill(HIST("hIsPrim"), originalTrack.isPrimaryTrack()); + JEhistos.fill(HIST("hIsGood"), originalTrack.isGlobalTrackWoDCA()); + JEhistos.fill(HIST("hIsPrimCont"), originalTrack.isPVContributor()); + JEhistos.fill(HIST("hFindableTPCClusters"), originalTrack.tpcNClsFindable()); + JEhistos.fill(HIST("hFindableTPCRows"), originalTrack.tpcNClsCrossedRows()); + JEhistos.fill(HIST("hClustersVsRows"), originalTrack.tpcCrossedRowsOverFindableCls()); + JEhistos.fill(HIST("hTPCChi2"), originalTrack.tpcChi2NCl()); + JEhistos.fill(HIST("hITSChi2"), originalTrack.itsChi2NCl()); + JEhistos.fill(HIST("h_track_pt"), track.pt()); + JEhistos.fill(HIST("h_track_eta"), track.eta()); + JEhistos.fill(HIST("h_track_phi"), track.phi()); + } if (track.pt() < cfgtrkMinPt && std::abs(track.eta()) > cfgtrkMaxEta) { continue; } - JEhistos.fill(HIST("ptHistogram"), track.pt()); - JEhistos.fill(HIST("etaHistogram"), track.eta()); - JEhistos.fill(HIST("phiHistogram"), track.phi()); + if (doDrawPicture) { + JEhistos.fill(HIST("ptHistogram"), track.pt()); + JEhistos.fill(HIST("etaHistogram"), track.eta()); + JEhistos.fill(HIST("phiHistogram"), track.phi()); + } } int nJets = 0; int lastindex = 0; @@ -596,65 +603,74 @@ struct myAnalysis { const auto& neg = v0.negTrack_as(); V0NumbersPerEvent = V0NumbersPerEvent + 1; if (passedLambdaSelection(v0, pos, neg) && ctauLambda < CtauLambda && ifpasslambda) { - JEhistos.fill(HIST("hPt"), v0.pt()); - JEhistos.fill(HIST("V0Radius"), v0.v0radius()); - JEhistos.fill(HIST("CosPA"), v0.v0cosPA()); - JEhistos.fill(HIST("V0DCANegToPV"), v0.dcanegtopv()); - JEhistos.fill(HIST("V0DCAPosToPV"), v0.dcapostopv()); - JEhistos.fill(HIST("V0DCAV0Daughters"), v0.dcaV0daughters()); + if (doDrawPicture) { + JEhistos.fill(HIST("hPt"), v0.pt()); + JEhistos.fill(HIST("V0Radius"), v0.v0radius()); + JEhistos.fill(HIST("CosPA"), v0.v0cosPA()); + JEhistos.fill(HIST("V0DCANegToPV"), v0.dcanegtopv()); + JEhistos.fill(HIST("V0DCAPosToPV"), v0.dcapostopv()); + JEhistos.fill(HIST("V0DCAV0Daughters"), v0.dcaV0daughters()); + } } else if (passedInitLambdaSelection(v0, pos, neg) && ifinitpasslambda) { - JEhistos.fill(HIST("hPt"), v0.pt()); - JEhistos.fill(HIST("V0Radius"), v0.v0radius()); - JEhistos.fill(HIST("CosPA"), v0.v0cosPA()); - JEhistos.fill(HIST("V0DCANegToPV"), v0.dcanegtopv()); - JEhistos.fill(HIST("V0DCAPosToPV"), v0.dcapostopv()); - JEhistos.fill(HIST("V0DCAV0Daughters"), v0.dcaV0daughters()); + if (doDrawPicture) { + JEhistos.fill(HIST("hPt"), v0.pt()); + JEhistos.fill(HIST("V0Radius"), v0.v0radius()); + JEhistos.fill(HIST("CosPA"), v0.v0cosPA()); + JEhistos.fill(HIST("V0DCANegToPV"), v0.dcanegtopv()); + JEhistos.fill(HIST("V0DCAPosToPV"), v0.dcapostopv()); + JEhistos.fill(HIST("V0DCAV0Daughters"), v0.dcaV0daughters()); + } } if (passedLambdaSelection(v0, pos, neg) && ctauAntiLambda < CtauLambda && ifpasslambda) { V0LambdaNumbers = V0LambdaNumbers + 1; JEhistos.fill(HIST("hMassVsPtLambda"), v0.pt(), v0.mLambda()); JEhistos.fill(HIST("hMassLambda"), v0.mLambda()); - JEhistos.fill(HIST("TPCNSigmaPosPr"), pos.tpcNSigmaPr()); - JEhistos.fill(HIST("TPCNSigmaNegPi"), neg.tpcNSigmaPi()); - JEhistos.fill(HIST("v0Lambdapx"), v0.px()); - JEhistos.fill(HIST("v0Lambdapy"), v0.py()); - JEhistos.fill(HIST("v0Lambdapz"), v0.pz()); + if (doDrawPicture) { + JEhistos.fill(HIST("TPCNSigmaPosPr"), pos.tpcNSigmaPr()); + JEhistos.fill(HIST("TPCNSigmaNegPi"), neg.tpcNSigmaPi()); + JEhistos.fill(HIST("v0Lambdapx"), v0.px()); + JEhistos.fill(HIST("v0Lambdapy"), v0.py()); + JEhistos.fill(HIST("v0Lambdapz"), v0.pz()); + } myTable(outputCollisionsV0.lastIndex(), v0.collisionId(), v0.px(), v0.py(), v0.pz(), v0.pt(), v0.mLambda(), pos.px(), pos.py(), pos.pz()); - JEhistos.fill(HIST("hV0Lambda"), nEventsV0, v0.px(), v0.py(), v0.pz(), v0.mLambda(), pos.px(), pos.py(), pos.pz()); } else if (passedInitLambdaSelection(v0, pos, neg) && ifinitpasslambda) { V0LambdaNumbers = V0LambdaNumbers + 1; JEhistos.fill(HIST("hMassVsPtLambda"), v0.pt(), v0.mLambda()); JEhistos.fill(HIST("hMassLambda"), v0.mLambda()); - JEhistos.fill(HIST("TPCNSigmaPosPr"), pos.tpcNSigmaPr()); - JEhistos.fill(HIST("TPCNSigmaNegPi"), neg.tpcNSigmaPi()); - - JEhistos.fill(HIST("v0Lambdapx"), v0.px()); - JEhistos.fill(HIST("v0Lambdapy"), v0.py()); - JEhistos.fill(HIST("v0Lambdapz"), v0.pz()); + if (doDrawPicture) { + JEhistos.fill(HIST("TPCNSigmaPosPr"), pos.tpcNSigmaPr()); + JEhistos.fill(HIST("TPCNSigmaNegPi"), neg.tpcNSigmaPi()); + JEhistos.fill(HIST("v0Lambdapx"), v0.px()); + JEhistos.fill(HIST("v0Lambdapy"), v0.py()); + JEhistos.fill(HIST("v0Lambdapz"), v0.pz()); + } myTable(outputCollisionsV0.lastIndex(), v0.collisionId(), v0.px(), v0.py(), v0.pz(), v0.pt(), v0.mLambda(), pos.px(), pos.py(), pos.pz()); - JEhistos.fill(HIST("hV0Lambda"), nEventsV0, v0.px(), v0.py(), v0.pz(), v0.mLambda(), pos.px(), pos.py(), pos.pz()); } if (passedAntiLambdaSelection(v0, pos, neg) && ifpassantilambda) { JEhistos.fill(HIST("hMassVsPtAntiLambda"), v0.pt(), v0.mAntiLambda()); JEhistos.fill(HIST("hMassAntiLambda"), v0.mAntiLambda()); - JEhistos.fill(HIST("TPCNSigmaPosPi"), pos.tpcNSigmaPi()); - JEhistos.fill(HIST("TPCNSigmaNegPr"), neg.tpcNSigmaPr()); - JEhistos.fill(HIST("v0AntiLambdapx"), v0.px()); - JEhistos.fill(HIST("v0AntiLambdapy"), v0.py()); - JEhistos.fill(HIST("v0AntiLambdapz"), v0.pz()); + if (doDrawPicture) { + JEhistos.fill(HIST("TPCNSigmaPosPi"), pos.tpcNSigmaPi()); + JEhistos.fill(HIST("TPCNSigmaNegPr"), neg.tpcNSigmaPr()); + JEhistos.fill(HIST("v0AntiLambdapx"), v0.px()); + JEhistos.fill(HIST("v0AntiLambdapy"), v0.py()); + JEhistos.fill(HIST("v0AntiLambdapz"), v0.pz()); + } myTableanti(outputCollisionsV0.lastIndex(), v0.collisionId(), v0.px(), v0.py(), v0.pz(), v0.pt(), v0.mAntiLambda(), neg.px(), neg.py(), neg.pz()); } else if (passedInitLambdaSelection(v0, pos, neg) && ifinitpasslambda) { JEhistos.fill(HIST("hMassVsPtAntiLambda"), v0.pt(), v0.mAntiLambda()); JEhistos.fill(HIST("hMassAntiLambda"), v0.mAntiLambda()); - JEhistos.fill(HIST("TPCNSigmaPosPi"), pos.tpcNSigmaPi()); - JEhistos.fill(HIST("TPCNSigmaNegPr"), neg.tpcNSigmaPr()); - JEhistos.fill(HIST("v0AntiLambdapx"), v0.px()); - JEhistos.fill(HIST("v0AntiLambdapy"), v0.py()); - JEhistos.fill(HIST("v0AntiLambdapz"), v0.pz()); + if (doDrawPicture) { + JEhistos.fill(HIST("TPCNSigmaPosPi"), pos.tpcNSigmaPi()); + JEhistos.fill(HIST("TPCNSigmaNegPr"), neg.tpcNSigmaPr()); + JEhistos.fill(HIST("v0AntiLambdapx"), v0.px()); + JEhistos.fill(HIST("v0AntiLambdapy"), v0.py()); + JEhistos.fill(HIST("v0AntiLambdapz"), v0.pz()); + } myTableanti(outputCollisionsV0.lastIndex(), v0.collisionId(), v0.px(), v0.py(), v0.pz(), v0.pt(), v0.mAntiLambda(), neg.px(), neg.py(), neg.pz()); } } diff --git a/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx b/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx index ec63b8f01a0..5cf681104ea 100644 --- a/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx +++ b/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx @@ -95,6 +95,11 @@ struct LfMyV0s { registry.add("hAntiLambdamassandSinPhi", "hAntiLambdamassandSinPhi", kTH2F, {{200, 0.9, 1.2}, {200, -1, 1}}); registry.add("profile", "Invariant Mass vs sin(phi)", {HistType::kTProfile, {{200, 0.9, 1.2}}}); registry.add("profileAntiV0", "Invariant Mass vs sin(phi)", {HistType::kTProfile, {{200, 0.9, 1.2}}}); + registry.add("hLambdaPhiandSinPhi", "hLambdaPhiandSinPhi", kTH2F, {{200, -TMath::Pi() / 2, TMath::Pi() / 2}, {200, -1, 1}}); + registry.add("hAntiLambdaPhiandSinPhi", "hAntiLambdaPhiandSinPhi", kTH2F, {{200, -TMath::Pi() / 2, TMath::Pi() / 2}, {200, -1, 1}}); + + registry.add("V0LambdaprotonPhi", "V0LambdaprotonPhi", {HistType::kTH1F, {{200, -TMath::Pi() / 2, TMath::Pi() / 2}}}); + registry.add("V0AntiLambdaprotonPhi", "V0AntiLambdaprotonPhi", {HistType::kTH1F, {{200, -TMath::Pi() / 2, TMath::Pi() / 2}}}); } double massPr = o2::constants::physics::MassProton; double massLambda = o2::constants::physics::MassLambda; @@ -256,6 +261,8 @@ struct LfMyV0s { if (candidate.mycollisionv0() == LeadingJet.mycollisionleadingjet()) { registry.fill(HIST("V0protonphiInJetV0frame"), protonsinPhiInJetV0frame / V0Numbers); registry.fill(HIST("hLambdamassandSinPhi"), candidate.v0Lambdamass(), protonsinPhiInJetV0frame / V0Numbers); + registry.fill(HIST("hLambdaPhiandSinPhi"), TMath::ASin(protonsinPhiInJetV0frame / V0Numbers), protonsinPhiInJetV0frame / V0Numbers); + registry.fill(HIST("V0LambdaprotonPhi"), TMath::ASin(protonsinPhiInJetV0frame / V0Numbers)); registry.fill(HIST("profile"), candidate.v0Lambdamass(), protonsinPhiInJetV0frame / V0Numbers); } } @@ -307,6 +314,8 @@ struct LfMyV0s { if (candidate.mycollisionv0() == LeadingJet.mycollisionleadingjet()) { registry.fill(HIST("V0antiprotonphiInJetV0frame"), protonsinPhiInJetV0frame / V0Numbers); registry.fill(HIST("hAntiLambdamassandSinPhi"), candidate.v0Lambdamass(), protonsinPhiInJetV0frame / V0Numbers); + registry.fill(HIST("hAntiLambdaPhiandSinPhi"), TMath::ASin(protonsinPhiInJetV0frame / V0Numbers), protonsinPhiInJetV0frame / V0Numbers); + registry.fill(HIST("V0AntiLambdaprotonPhi"), TMath::ASin(protonsinPhiInJetV0frame / V0Numbers)); registry.fill(HIST("profileAntiV0"), candidate.v0Lambdamass(), protonsinPhiInJetV0frame / V0Numbers); } } From 96f4f2a25b39e3747950be880d305c65a7a5408e Mon Sep 17 00:00:00 2001 From: nkaratze Date: Thu, 3 Apr 2025 15:59:38 +0200 Subject: [PATCH 0910/1650] [PWGLF] v0ptinvmasspltos zvertex and daughter pt plots (#10663) Co-authored-by: nkaratze --- PWGLF/Tasks/Strangeness/v0ptinvmassplots.cxx | 130 +++++++++++-------- 1 file changed, 78 insertions(+), 52 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/v0ptinvmassplots.cxx b/PWGLF/Tasks/Strangeness/v0ptinvmassplots.cxx index 517ac9e6ead..18e83136db1 100644 --- a/PWGLF/Tasks/Strangeness/v0ptinvmassplots.cxx +++ b/PWGLF/Tasks/Strangeness/v0ptinvmassplots.cxx @@ -30,6 +30,8 @@ This analysis includes three processes, one for Real Data and two for MC at the #include "PWGLF/DataModel/LFStrangenessTables.h" #include "Common/DataModel/PIDResponse.h" #include "CommonUtils/StringUtils.h" +#include "CommonConstants/PhysicsConstants.h" +#include "TPDGCode.h" // namespace to be used for pt plots and bins namespace pthistos @@ -44,6 +46,7 @@ static std::vector antilambdaPtBins; using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; +using namespace o2::constants::physics; struct V0PtInvMassPlots { // Histogram Registries @@ -126,7 +129,7 @@ struct V0PtInvMassPlots { AxisSpec antilambdaPtAxis = {antilambdaPtedgevalues, "#it{p}_{T} (GeV/#it{c})"}; AxisSpec armenterosQtAxis = {nBinsArmenteros, 0.0f, 0.3f, "#it{p}_{T} (GeV/#it{c})"}; AxisSpec armenterosasymAxis = {nBinsArmenteros, -1.f, 1.f, "#ait{p}^{+}_{||}-it{p}^{-}_{||}/it{p}^{+}_{||}+it{p}^{-}_{||}"}; - AxisSpec vertexZAxis = {nBins, -10.0f, 10.0f, "vrtx_{Z} [cm]"}; + AxisSpec vertexZAxis = {nBins, -11.0f, 11.0f, "vrtx_{Z} [cm]"}; std::vector kaonhistvalue(nmaxHistograms + 1); std::vector lambdahistvalue(nmaxHistograms + 1); @@ -153,6 +156,7 @@ struct V0PtInvMassPlots { antilambdahistvalue[i] = antilambdaPtbin; } + rPtAnalysis.add("hVertexZ", "hVertexZ", {HistType::kTH1F, {vertexZAxis}}); rPtAnalysis.add("hVertexZRec", "hVertexZRec", {HistType::kTH1F, {vertexZAxis}}); rPtAnalysis.add("hArmenterosPodolanskiPlot", "hArmenterosPodolanskiPlot", {HistType::kTH2F, {{armenterosasymAxis}, {armenterosQtAxis}}}); rPtAnalysis.add("hV0EtaDaughters", "hV0EtaDaughters", {HistType::kTH1F, {{nBins, -1.2f, 1.2f}}}); @@ -164,6 +168,7 @@ struct V0PtInvMassPlots { rPtAnalysis.add("hXiPlusGeneratedPtSpectrum", "hXiPlusGeneratedPtSpectrum", {HistType::kTH1F, {antilambdaPtAxis}}); rPtAnalysis.add("hAntiXiZeroGeneratedPtSpectrum", "hAntiXiZeroGeneratedPtSpectrum", {HistType::kTH1F, {antilambdaPtAxis}}); rPtAnalysis.add("hAntiOmegaGeneratedPtSpectrum", "hAntiOmegaGeneratedPtSpectrum", {HistType::kTH1F, {antilambdaPtAxis}}); + rPtAnalysis.add("hPhiGeneratedPtSpectrum", "hPhiGeneratedPtSpectrum", {HistType::kTH1F, {k0ShortPtAxis}}); // Adding Kzerosh Histograms to registry if (kzeroAnalysis == true) { @@ -176,6 +181,9 @@ struct V0PtInvMassPlots { rPtAnalysis.add("hNSigmaNegPiFromK0s", "hNSigmaNegPiFromK0s", {HistType::kTH2F, {{100, -5.f, 5.f}, {k0ShortPtAxis}}}); rPtAnalysis.add("hK0shEtaDaughters", "hK0shEtaDaughters", {HistType::kTH1F, {{nBins, -1.2f, 1.2f}}}); rPtAnalysis.add("hArmenterosPodolanskiPlotK0Short", "hArmenterosPodolanskiPlotK0Short", {HistType::kTH2F, {{armenterosasymAxis}, {armenterosQtAxis}}}); + rPtAnalysis.add("hK0shNegDaughterPt", "hK0shNegDaughterPt", {HistType::kTH1F, {k0ShortPtAxis}}); + rPtAnalysis.add("hK0shPosDaughterPt", "hK0shPosDaughterPt", {HistType::kTH1F, {k0ShortPtAxis}}); + for (int i = 0; i < nmaxHistograms; i++) { pthistos::kaonPt[i] = rKaonshMassPlotsPerPtBin.add(fmt::format("hPt_from_{0}_to_{1}", kaonhistvalue[i], kaonhistvalue[i + 1]).c_str(), fmt::format("hPt_from_{0}_to_{1}", kaonhistvalue[i], kaonhistvalue[i + 1]).c_str(), {HistType::kTH1D, {{k0ShortMassAxis}}}); } @@ -192,6 +200,8 @@ struct V0PtInvMassPlots { rPtAnalysis.add("hNSigmaNegPionFromLambda", "hNSigmaNegPionFromLambda", {HistType::kTH2F, {{100, -5.f, 5.f}, {lambdaPtAxis}}}); rPtAnalysis.add("hLambdaEtaDaughters", "hLambdaEtaDaughters", {HistType::kTH1F, {{nBins, -1.2f, 1.2f}}}); rPtAnalysis.add("hArmenterosPodolanskiPlotLambda", "hArmenterosPodolanskiPlotLambda", {HistType::kTH2F, {{armenterosasymAxis}, {armenterosQtAxis}}}); + rPtAnalysis.add("hLambdaNegDaughterPt", "hLambdaNegDaughterPt", {HistType::kTH1F, {lambdaPtAxis}}); + rPtAnalysis.add("hLambdaPosDaughterPt", "hLambdaPosDaughterPt", {HistType::kTH1F, {lambdaPtAxis}}); for (int i = 0; i < nmaxHistograms; i++) { pthistos::lambdaPt[i] = rLambdaMassPlotsPerPtBin.add(fmt::format("hPt_from_{0}_to_{1}", lambdahistvalue[i], lambdahistvalue[i + 1]).c_str(), fmt::format("hPt_from_{0}_to_{1}", lambdahistvalue[i], lambdahistvalue[i + 1]).c_str(), {HistType::kTH1D, {{lambdaMassAxis}}}); } @@ -212,6 +222,8 @@ struct V0PtInvMassPlots { rPtAnalysis.add("hNSigmaPosPionFromAntilambda", "hNSigmaPosPionFromAntilambda", {HistType::kTH2F, {{100, -5.f, 5.f}, {antilambdaPtAxis}}}); rPtAnalysis.add("hAntiLambdaEtaDaughters", "hAntiLambdaEtaDaughters", {HistType::kTH1F, {{nBins, -1.2f, 1.2f}}}); rPtAnalysis.add("hArmenterosPodolanskiPlotAntiLambda", "hArmenterosPodolanskiPlotAntiLambda", {HistType::kTH2F, {{armenterosasymAxis}, {armenterosQtAxis}}}); + rPtAnalysis.add("hAntiLambdaNegDaughterPt", "hAntiLambdaNegDaughterPt", {HistType::kTH1F, {antilambdaPtAxis}}); + rPtAnalysis.add("hAntiLambdaPosDaughterPt", "hAntiLambdaPosDaughterPt", {HistType::kTH1F, {antilambdaPtAxis}}); for (int i = 0; i < nmaxHistograms; i++) { pthistos::antilambdaPt[i] = rAntilambdaMassPlotsPerPtBin.add(fmt::format("hPt_from_{0}_to_{1}", antilambdahistvalue[i], antilambdahistvalue[i + 1]).c_str(), fmt::format("hPt_from_{0}_to_{1}", antilambdahistvalue[i], antilambdahistvalue[i + 1]).c_str(), {HistType::kTH1D, {{antiLambdaMassAxis}}}); } @@ -238,43 +250,45 @@ struct V0PtInvMassPlots { { for (const auto& mcParticle : mcParticles) { if (std::abs(mcParticle.y()) < rapiditycutGen) { - if (mcParticle.isPhysicalPrimary()) { - if (mcParticle.pdgCode() == 310) // kzero matched - { - rPtAnalysis.fill(HIST("hK0ShGeneratedPtSpectrum"), mcParticle.pt()); - } - if (mcParticle.pdgCode() == 3122) // lambda matched - { - rPtAnalysis.fill(HIST("hLambdaGeneratedPtSpectrum"), mcParticle.pt()); - } - if (mcParticle.pdgCode() == -3122) // antilambda matched - { - rPtAnalysis.fill(HIST("hAntilambdaGeneratedPtSpectrum"), mcParticle.pt()); - } - if (mcParticle.pdgCode() == 3312) // Xi Minus matched - { - rPtAnalysis.fill(HIST("hXiMinusGeneratedPtSpectrum"), mcParticle.pt()); - } - if (mcParticle.pdgCode() == 3322) // Xi Zero matched - { - rPtAnalysis.fill(HIST("hXiZeroGeneratedPtSpectrum"), mcParticle.pt()); - } - if (mcParticle.pdgCode() == 3334) // Omega matched - { - rPtAnalysis.fill(HIST("hOmegaGeneratedPtSpectrum"), mcParticle.pt()); - } - if (mcParticle.pdgCode() == -3312) // Xi Plus matched - { - rPtAnalysis.fill(HIST("hXiPlusGeneratedPtSpectrum"), mcParticle.pt()); - } - if (mcParticle.pdgCode() == -3322) // Anti-Xi Zero matched - { - rPtAnalysis.fill(HIST("hAntiXiZeroGeneratedPtSpectrum"), mcParticle.pt()); - } - if (mcParticle.pdgCode() == -3334) // Anti-Omega matched - { - rPtAnalysis.fill(HIST("hAntiOmegaGeneratedPtSpectrum"), mcParticle.pt()); - } + if (mcParticle.pdgCode() == kK0Short) // kzero matched + { + rPtAnalysis.fill(HIST("hK0ShGeneratedPtSpectrum"), mcParticle.pt()); + } + if (mcParticle.pdgCode() == kLambda0) // lambda matched + { + rPtAnalysis.fill(HIST("hLambdaGeneratedPtSpectrum"), mcParticle.pt()); + } + if (mcParticle.pdgCode() == kLambda0Bar) // antilambda matched + { + rPtAnalysis.fill(HIST("hAntilambdaGeneratedPtSpectrum"), mcParticle.pt()); + } + if (mcParticle.pdgCode() == kXiMinus) // Xi Minus matched + { + rPtAnalysis.fill(HIST("hXiMinusGeneratedPtSpectrum"), mcParticle.pt()); + } + if (mcParticle.pdgCode() == kXi0) // Xi Zero matched + { + rPtAnalysis.fill(HIST("hXiZeroGeneratedPtSpectrum"), mcParticle.pt()); + } + if (mcParticle.pdgCode() == kOmegaMinus) // Omega matched + { + rPtAnalysis.fill(HIST("hOmegaGeneratedPtSpectrum"), mcParticle.pt()); + } + if (mcParticle.pdgCode() == kXiPlusBar) // Xi Plus matched + { + rPtAnalysis.fill(HIST("hXiPlusGeneratedPtSpectrum"), mcParticle.pt()); + } + if (mcParticle.pdgCode() == -kXi0) // Anti-Xi Zero matched + { + rPtAnalysis.fill(HIST("hAntiXiZeroGeneratedPtSpectrum"), mcParticle.pt()); + } + if (mcParticle.pdgCode() == kOmegaPlusBar) // Anti-Omega matched + { + rPtAnalysis.fill(HIST("hAntiOmegaGeneratedPtSpectrum"), mcParticle.pt()); + } + if (mcParticle.pdgCode() == kPhi) // Phi matched + { + rPtAnalysis.fill(HIST("hPhiGeneratedPtSpectrum"), mcParticle.pt()); } } } @@ -304,7 +318,7 @@ struct V0PtInvMassPlots { lambdaptedgevalues[i] = std::stod(pthistos::lambdaPtBins[i]); antilambdaPtedgevalues[i] = std::stod(pthistos::antilambdaPtBins[i]); } - + rPtAnalysis.fill(HIST("hVertexZ"), collision.posZ()); for (const auto& v0 : V0s) { rPtAnalysis.fill(HIST("hVertexZRec"), collision.posZ()); // Checking that the V0 is a true K0s/Lambdas/Antilambdas and then filling the parameter histograms and the invariant mass plots for different cuts (which are taken from namespace) @@ -314,7 +328,7 @@ struct V0PtInvMassPlots { rPtAnalysis.fill(HIST("hV0EtaDaughters"), v0.negTrack_as().eta()); rPtAnalysis.fill(HIST("hV0EtaDaughters"), v0.posTrack_as().eta()); if (kzeroAnalysis == true) { - if (v0mcParticle.pdgCode() == 310) { // kzero matched + if (v0mcParticle.pdgCode() == kK0Short) { // kzero matched rPtAnalysis.fill(HIST("hMassK0ShortAll"), v0.mK0Short()); rPtAnalysis.fill(HIST("hK0ShortPtSpectrumBeforeCuts"), v0.pt()); if (std::abs(v0.mLambda() - mLambdaPDG) > compv0masscut && std::abs(v0.mAntiLambda() - mLambdaPDG) > compv0masscut) { // Kzero competitive v0 mass cut (cut out Lambdas and Anti-Lambdas) @@ -324,6 +338,8 @@ struct V0PtInvMassPlots { rPtAnalysis.fill(HIST("hK0ShortReconstructedPtSpectrum"), v0.pt()); rPtAnalysis.fill(HIST("hK0shEtaDaughters"), v0.negTrack_as().eta()); rPtAnalysis.fill(HIST("hK0shEtaDaughters"), v0.posTrack_as().eta()); + rPtAnalysis.fill(HIST("hK0shNegDaughterPt"), v0.negTrack_as().pt()); // Neg Daughter Pt + rPtAnalysis.fill(HIST("hK0shPosDaughterPt"), v0.posTrack_as().pt()); // Pos Daughter Pt if (v0mcParticle.isPhysicalPrimary()) { for (int i = 0; i < nmaxHistograms; i++) { if (kaonptedgevalues[i] <= v0.pt() && v0.pt() < kaonptedgevalues[i + 1]) { // finding v0s with pt within the range of our bin edges @@ -337,16 +353,18 @@ struct V0PtInvMassPlots { } // lambda analysis if (lambdaAnalysis == true) { - if (v0mcParticle.pdgCode() == 3122) { // lambda matched + if (v0mcParticle.pdgCode() == kLambda0) { // lambda matched rPtAnalysis.fill(HIST("hMassLambdaAll"), v0.mLambda()); rPtAnalysis.fill(HIST("hLambdaPtSpectrumBeforeCuts"), v0.pt()); - if (std::abs(v0.mK0Short() - mK0shPDG) > compv0masscut) { // antilambda competitive v0 mass cut (cut out Kaons) + if (std::abs(v0.mK0Short() - mK0shPDG) > compv0masscut) { // lambda competitive v0 mass cut (cut out Kaons) // Implementing best lambda cuts if (v0.v0cosPA() > lambdaSettingcosPA && v0.dcaV0daughters() < lambdaSettingdcav0dau && v0.v0radius() > lambdaSettingradius && std::abs(v0.dcapostopv()) > lambdaSettingdcapostopv && std::abs(v0.dcanegtopv()) > lambdaSettingdcanegtopv) { rPtAnalysis.fill(HIST("hMassLambdaAllAfterCuts"), v0.mLambda()); rPtAnalysis.fill(HIST("hLambdaReconstructedPtSpectrum"), v0.pt()); rPtAnalysis.fill(HIST("hLambdaEtaDaughters"), v0.negTrack_as().eta()); rPtAnalysis.fill(HIST("hLambdaEtaDaughters"), v0.posTrack_as().eta()); + rPtAnalysis.fill(HIST("hLambdaNegDaughterPt"), v0.negTrack_as().pt()); // Neg Daughter Pt + rPtAnalysis.fill(HIST("hLambdaPosDaughterPt"), v0.posTrack_as().pt()); // Pos Daughter Pt if (v0mcParticle.isPhysicalPrimary()) { for (int i = 0; i < nmaxHistograms; i++) { if (lambdaptedgevalues[i] <= v0.pt() && v0.pt() < lambdaptedgevalues[i + 1]) { @@ -358,15 +376,15 @@ struct V0PtInvMassPlots { auto v0mothers = v0mcParticle.mothers_as(); // Get mothers if (!v0mothers.empty()) { auto& v0mcParticleMother = v0mothers.front(); // First mother - if (v0mcParticleMother.pdgCode() == 3312) // Xi Minus Mother Matched + if (v0mcParticleMother.pdgCode() == kXiMinus) // Xi Minus Mother Matched { rFeeddownMatrices.fill(HIST("hLambdaXiMinusFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); } - if (v0mcParticleMother.pdgCode() == 3322) // Xi Zero Mother Matched + if (v0mcParticleMother.pdgCode() == kXi0) // Xi Zero Mother Matched { rFeeddownMatrices.fill(HIST("hLambdaXiZeroFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); } - if (v0mcParticleMother.pdgCode() == 3334) // Omega Mother Matched + if (v0mcParticleMother.pdgCode() == kOmegaMinus) // Omega Mother Matched { rFeeddownMatrices.fill(HIST("hLambdaOmegaFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); } @@ -378,16 +396,18 @@ struct V0PtInvMassPlots { } // antilambda analysis if (antiLambdaAnalysis == true) { - if (v0mcParticle.pdgCode() == -3122) { // antilambda matched + if (v0mcParticle.pdgCode() == kLambda0Bar) { // antilambda matched rPtAnalysis.fill(HIST("hMassAntilambdaAll"), v0.mAntiLambda()); rPtAnalysis.fill(HIST("hantilambdaPtSpectrumBeforeCuts"), v0.pt()); if (std::abs(v0.mK0Short() - mK0shPDG) > compv0masscut) { // antilambda competitive v0 mass cut (cut out Kaons) - // Implementing best antilambda cuts + // Implementing best antilambda cuts if (v0.v0cosPA() > antilambdaSettingcosPA && v0.dcaV0daughters() < antilambdaSettingdcav0dau && v0.v0radius() > antilambdaSettingradius && std::abs(v0.dcapostopv()) > antilambdaSettingdcapostopv && std::abs(v0.dcanegtopv()) > antilambdaSettingdcanegtopv) { rPtAnalysis.fill(HIST("hMassAntilambdaAllAfterCuts"), v0.mAntiLambda()); rPtAnalysis.fill(HIST("hAntilambdaReconstructedPtSpectrum"), v0.pt()); rPtAnalysis.fill(HIST("hAntiLambdaEtaDaughters"), v0.negTrack_as().eta()); rPtAnalysis.fill(HIST("hAntiLambdaEtaDaughters"), v0.posTrack_as().eta()); + rPtAnalysis.fill(HIST("hAntiLambdaNegDaughterPt"), v0.negTrack_as().pt()); // Neg Daughter Pt + rPtAnalysis.fill(HIST("hAntiLambdaPosDaughterPt"), v0.posTrack_as().pt()); // Pos Daughter Pt if (v0mcParticle.isPhysicalPrimary()) { for (int i = 0; i < nmaxHistograms; i++) { if (antilambdaPtedgevalues[i] <= v0.pt() && v0.pt() < antilambdaPtedgevalues[i + 1]) { @@ -398,16 +418,16 @@ struct V0PtInvMassPlots { if (!v0mcParticle.isPhysicalPrimary()) { auto v0mothers = v0mcParticle.mothers_as(); // Get mothers if (!v0mothers.empty()) { - auto& v0mcParticleMother = v0mothers.front(); // First mother - if (v0mcParticleMother.pdgCode() == -3312) // Xi Plus Mother Matched + auto& v0mcParticleMother = v0mothers.front(); // First mother + if (v0mcParticleMother.pdgCode() == kXiPlusBar) // Xi Plus Mother Matched { rFeeddownMatrices.fill(HIST("hAntiLambdaXiPlusFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); } - if (v0mcParticleMother.pdgCode() == -3322) // Anti-Xi Zero Mother Matched + if (v0mcParticleMother.pdgCode() == -kXi0) // Anti-Xi Zero Mother Matched { rFeeddownMatrices.fill(HIST("hAntiLambdaAntiXiZeroFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); } - if (v0mcParticleMother.pdgCode() == -3334) // Anti-Omega (minus) Mother Matched + if (v0mcParticleMother.pdgCode() == kOmegaPlusBar) // Anti-Omega (minus) Mother Matched { rFeeddownMatrices.fill(HIST("hAntiLambdaAntiOmegaFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); } @@ -443,7 +463,7 @@ struct V0PtInvMassPlots { lambdaptedgevalues[i] = std::stod(pthistos::lambdaPtBins[i]); antilambdaPtedgevalues[i] = std::stod(pthistos::antilambdaPtBins[i]); } - + rPtAnalysis.fill(HIST("hVertexZ"), collision.posZ()); for (const auto& v0 : V0s) { const auto& posDaughterTrack = v0.posTrack_as(); const auto& negDaughterTrack = v0.negTrack_as(); @@ -473,6 +493,8 @@ struct V0PtInvMassPlots { rPtAnalysis.fill(HIST("hK0shEtaDaughters"), v0.negTrack_as().eta()); rPtAnalysis.fill(HIST("hK0shEtaDaughters"), v0.posTrack_as().eta()); rPtAnalysis.fill(HIST("hArmenterosPodolanskiPlotK0Short"), aValue, qValue); + rPtAnalysis.fill(HIST("hK0shNegDaughterPt"), v0.negTrack_as().pt()); // Neg Daughter Pt + rPtAnalysis.fill(HIST("hK0shPosDaughterPt"), v0.posTrack_as().pt()); // Pos Daughter Pt for (int i = 0; i < nmaxHistograms; i++) { if (kaonptedgevalues[i] <= v0.pt() && v0.pt() < kaonptedgevalues[i + 1]) { pthistos::kaonPt[i]->Fill(v0.mK0Short()); @@ -496,6 +518,8 @@ struct V0PtInvMassPlots { rPtAnalysis.fill(HIST("hLambdaEtaDaughters"), v0.negTrack_as().eta()); rPtAnalysis.fill(HIST("hLambdaEtaDaughters"), v0.posTrack_as().eta()); rPtAnalysis.fill(HIST("hArmenterosPodolanskiPlotLambda"), aValue, qValue); + rPtAnalysis.fill(HIST("hLambdaNegDaughterPt"), v0.negTrack_as().pt()); // Neg Daughter Pt + rPtAnalysis.fill(HIST("hLambdaPosDaughterPt"), v0.posTrack_as().pt()); // Pos Daughter Pt for (int i = 0; i < nmaxHistograms; i++) { if (lambdaptedgevalues[i] <= v0.pt() && v0.pt() < lambdaptedgevalues[i + 1]) { pthistos::lambdaPt[i]->Fill(v0.mLambda()); @@ -519,6 +543,8 @@ struct V0PtInvMassPlots { rPtAnalysis.fill(HIST("hAntiLambdaEtaDaughters"), v0.negTrack_as().eta()); rPtAnalysis.fill(HIST("hAntiLambdaEtaDaughters"), v0.posTrack_as().eta()); rPtAnalysis.fill(HIST("hArmenterosPodolanskiPlotAntiLambda"), aValue, qValue); + rPtAnalysis.fill(HIST("hAntiLambdaNegDaughterPt"), v0.negTrack_as().pt()); // Neg Daughter Pt + rPtAnalysis.fill(HIST("hAntiLambdaPosDaughterPt"), v0.posTrack_as().pt()); // Pos Daughter Pt for (int i = 0; i < nmaxHistograms; i++) { if (lambdaptedgevalues[i] <= v0.pt() && v0.pt() < lambdaptedgevalues[i + 1]) { pthistos::antilambdaPt[i]->Fill(v0.mAntiLambda()); From a007457552be835c765db2f09ffa37e99665c5c1 Mon Sep 17 00:00:00 2001 From: Kai Cui <129373281+kcui1@users.noreply.github.com> Date: Fri, 4 Apr 2025 00:25:25 +0800 Subject: [PATCH 0911/1650] [PWGLF] Add new process to produce feed down matrix (#10741) --- .../Tasks/Strangeness/hStrangeCorrelation.cxx | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx index e5ae0c911ba..086625ca112 100644 --- a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx +++ b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx @@ -47,6 +47,7 @@ using namespace o2::framework::expressions; using TracksComplete = soa::Join; using V0DatasWithoutTrackX = soa::Join; +using V0DatasWithoutTrackXMC = soa::Join; struct HStrangeCorrelation { // for efficiency corrections if requested @@ -654,6 +655,8 @@ struct HStrangeCorrelation { const AxisSpec preAxisPtTrigger{axisPtTrigger, "#it{p}_{T}^{trigger} (GeV/c)"}; const AxisSpec preAxisVtxZ{axisVtxZ, "vertex Z (cm)"}; const AxisSpec preAxisMult{axisMult, "mult percentile"}; + const AxisSpec axisPtLambda{axisPtAssoc, "#it{p}_{T}^{#Lambda} (GeV/c)"}; + const AxisSpec axisPtCascade{axisPtAssoc, "#it{p}_{T}^{Mother} (GeV/c)"}; // store the original axes in specific TH1Cs for completeness histos.add("axes/hDeltaPhiAxis", "", kTH1C, {preAxisDeltaPhi}); @@ -882,6 +885,14 @@ struct HStrangeCorrelation { } histos.add("ClosureTest/hTrigger", "Trigger Tracks", kTH3F, {axisPtQA, axisEta, axisMult}); } + if (doprocessFeedDown) { + histos.add("hLambdaXiMinusFeeddownMatrix", "hLambdaXiMinusFeeddownMatrix", kTH2F, {axisPtLambda, axisPtCascade}); + histos.add("hLambdaXiZeroFeeddownMatrix", "hLambdaXiZeroFeeddownMatrix", kTH2F, {axisPtLambda, axisPtCascade}); + histos.add("hLambdaOmegaFeeddownMatrix", "hLambdaOmegaFeeddownMatrix", kTH2F, {axisPtLambda, axisPtCascade}); + histos.add("hAntiLambdaXiPlusFeeddownMatrix", "hAntiLambdaXiPlusFeeddownMatrix", kTH2F, {axisPtLambda, axisPtCascade}); + histos.add("hAntiLambdaXiZeroFeeddownMatrix", "hAntiLambdaXiZeroFeeddownMatrix", kTH2F, {axisPtLambda, axisPtCascade}); + histos.add("hAntiLambdaOmegaFeeddownMatrix", "hAntiLambdaOmegaFeeddownMatrix", kTH2F, {axisPtLambda, axisPtCascade}); + } // visual inspection of sizes histos.print(); @@ -1780,6 +1791,72 @@ struct HStrangeCorrelation { } } + void processFeedDown(soa::Join::iterator const& collision, aod::AssocV0s const& associatedV0s, aod::McParticles const&, V0DatasWithoutTrackXMC const&, TracksComplete const&, aod::BCsWithTimestamps const&) + { + + // ________________________________________________ + // Perform basic event selection + if (!isCollisionSelected(collision)) { + return; + } + + for (auto const& v0 : associatedV0s) { + auto v0Data = v0.v0Core_as(); + + //---] track quality check [--- + auto postrack = v0Data.posTrack_as(); + auto negtrack = v0Data.negTrack_as(); + if (postrack.tpcNClsCrossedRows() < systCuts.minTPCNCrossedRowsAssociated || negtrack.tpcNClsCrossedRows() < systCuts.minTPCNCrossedRowsAssociated) + continue; + + //---] syst cuts [--- + if (v0Data.v0radius() < systCuts.v0RadiusMin || v0Data.v0radius() > systCuts.v0RadiusMax || + std::abs(v0Data.dcapostopv()) < systCuts.dcapostopv || std::abs(v0Data.dcanegtopv()) < systCuts.dcanegtopv || + v0Data.v0cosPA() < systCuts.v0cospa || v0Data.dcaV0daughters() > systCuts.dcaV0dau) + continue; + + if (v0Data.has_mcParticle()) { + auto v0mcParticle = v0Data.mcParticle_as(); + int mcParticlePdg = v0mcParticle.pdgCode(); + if (mcParticlePdg == 3122 && !v0mcParticle.isPhysicalPrimary()) { + auto v0mothers = v0mcParticle.mothers_as(); + if (!v0mothers.empty()) { + auto& v0mcParticleMother = v0mothers.front(); // First mother + if (v0mcParticleMother.pdgCode() == 3312) // Xi Minus Mother Matched + { + histos.fill(HIST("hLambdaXiMinusFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + } + if (v0mcParticleMother.pdgCode() == 3322) // Xi Zero Mother Matched + { + histos.fill(HIST("hLambdaXiZeroFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + } + if (v0mcParticleMother.pdgCode() == 3334) // Omega Mother Matched + { + histos.fill(HIST("hLambdaOmegaFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + } + } + } + if (mcParticlePdg == -3122 && !v0mcParticle.isPhysicalPrimary()) { + auto v0mothers = v0mcParticle.mothers_as(); + if (!v0mothers.empty()) { + auto& v0mcParticleMother = v0mothers.front(); // First mother + if (v0mcParticleMother.pdgCode() == -3312) // Xi Plus Mother Matched + { + histos.fill(HIST("hAntiLambdaXiPlusFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + } + if (v0mcParticleMother.pdgCode() == -3322) // Anti Xi Zero Mother Matched + { + histos.fill(HIST("hAntiLambdaXiZeroFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + } + if (v0mcParticleMother.pdgCode() == -3334) // Omega Mother Matched + { + histos.fill(HIST("hAntiLambdaOmegaFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + } + } + } + } + } + } PROCESS_SWITCH(HStrangeCorrelation, processSelectEventWithTrigger, "Select events with trigger only", true); PROCESS_SWITCH(HStrangeCorrelation, processSameEventHV0s, "Process same events, h-V0s", true); PROCESS_SWITCH(HStrangeCorrelation, processSameEventHCascades, "Process same events, h-Cascades", true); @@ -1793,6 +1870,7 @@ struct HStrangeCorrelation { PROCESS_SWITCH(HStrangeCorrelation, processMCGenerated, "Process MC generated", false); PROCESS_SWITCH(HStrangeCorrelation, processClosureTest, "Process Closure Test", false); + PROCESS_SWITCH(HStrangeCorrelation, processFeedDown, "process Feed Down", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 57e95438e9b6f985c6435c3118b37b7d9a40a077 Mon Sep 17 00:00:00 2001 From: Lucia Anna Tarasovicova Date: Thu, 3 Apr 2025 18:28:54 +0200 Subject: [PATCH 0912/1650] [PWGLF] change in hStrangeCorrelation.cxx (#10707) Co-authored-by: Lucia Anna Tarasovicova --- PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx index 086625ca112..a58b485f114 100644 --- a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx +++ b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx @@ -843,6 +843,14 @@ struct HStrangeCorrelation { } } } + + if (TESTBIT(doCorrelation, 8)) { + histos.add("hAsssocTrackEtaVsPtVsPhi", "", kTH3F, {axisPtQA, axisEta, axisPhi}); + histos.add("hAssocPrimaryEtaVsPt", "", kTH3F, {axisPtQA, axisEta, axisMultNDim}); + histos.add("hAssocHadronsAllSelectedEtaVsPt", "", kTH3F, {axisPtQA, axisEta, axisMultNDim}); + histos.add("hAssocPtResolution", ";p_{T}^{reconstructed} (GeV/c); p_{T}^{generated} (GeV/c)", kTH2F, {axisPtQA, axisPtQA}); + } + if (hStrange) { histos.addClone("sameEvent/Signal/", "sameEvent/LeftBg/"); histos.addClone("sameEvent/Signal/", "sameEvent/RightBg/"); From de943110331f79464a6921459baa481babadc8b8 Mon Sep 17 00:00:00 2001 From: Chiara Pinto <48326672+chiarapinto@users.noreply.github.com> Date: Thu, 3 Apr 2025 19:29:33 +0200 Subject: [PATCH 0913/1650] [PWGLF] small changes for code optimization (#10751) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Nuspex/antinucleiInJets.cxx | 74 ++++++++++++++----------- 1 file changed, 43 insertions(+), 31 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx index 8213c828af4..0ab76c09000 100644 --- a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx +++ b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx @@ -25,6 +25,7 @@ #include #include "TGrid.h" #include +#include #include "CCDB/BasicCCDBManager.h" #include "CCDB/CcdbApi.h" @@ -290,51 +291,55 @@ struct AntinucleiInJets { } } - void getPerpendicularAxis(TVector3 p, TVector3& u, double sign) + void getPerpendicularAxis(const TVector3& p, TVector3& u, double sign) { - // initialization - double ux(0), uy(0), uz(0); - - // components of vector p double px = p.X(); double py = p.Y(); double pz = p.Z(); + double px2 = px * px; + double py2 = py * py; + double pz2 = pz * pz; + double pz4 = pz2 * pz2; + + // px and py are both zero + if (px == 0 && py == 0) { + u.SetXYZ(0, 0, 0); + return; + } + // protection 1 if (px == 0 && py != 0) { - uy = -(pz * pz) / py; - ux = sign * std::sqrt(py * py - (pz * pz * pz * pz) / (py * py)); - uz = pz; - u.SetXYZ(ux, uy, uz); + double ux = sign * std::sqrt(py2 - pz4 / py2); + double uy = -pz2 / py; + u.SetXYZ(ux, uy, pz); return; } // protection 2 if (py == 0 && px != 0) { - ux = -(pz * pz) / px; - uy = sign * std::sqrt(px * px - (pz * pz * pz * pz) / (px * px)); - uz = pz; - u.SetXYZ(ux, uy, uz); + double ux = -pz2 / px; + double uy = sign * std::sqrt(px2 - pz4 / px2); + u.SetXYZ(ux, uy, pz); return; } - // equation parameters - double a = px * px + py * py; - double b = 2.0 * px * pz * pz; - double c = pz * pz * pz * pz - py * py * py * py - px * px * py * py; + // General case + double a = px2 + py2; + double b = 2.0 * px * pz2; + double c = pz4 - py2 * py2 - px2 * py2; + double delta = b * b - 4.0 * a * c; - // protection agains delta<0 - if (delta < 0) { + if (delta < 0 || a == 0) { + LOGP(warn, "Invalid input in getPerpendicularAxis: delta = {}, a = {}", delta, a); + u.SetXYZ(0, 0, 0); return; } - // solutions - ux = (-b + sign * std::sqrt(delta)) / (2.0 * a); - uy = (-pz * pz - px * ux) / py; - uz = pz; - u.SetXYZ(ux, uy, uz); - return; + double ux = (-b + sign * std::sqrt(delta)) / (2.0 * a); + double uy = (-pz2 - px * ux) / py; + u.SetXYZ(ux, uy, pz); } double getDeltaPhi(double a1, double a2) @@ -448,19 +453,25 @@ struct AntinucleiInJets { double getCorrectedPt(double ptRec, TH2* responseMatrix) { + if (!responseMatrix) { + LOGP(error, "Response matrix is null. Returning uncorrected pt."); + return ptRec; + } int binX = responseMatrix->GetXaxis()->FindBin(ptRec); - TH1D* proj = responseMatrix->ProjectionY("proj", binX, binX); + if (binX < 1 || binX > responseMatrix->GetNbinsX()) { + LOGP(error, "Bin index out of range: binX = {}", binX); + return ptRec; // Return uncorrected pt if bin index is invalid + } + std::unique_ptr proj(responseMatrix->ProjectionY("proj", binX, binX)); // add a protection in case the projection is empty if (proj->GetEntries() == 0) { - delete proj; return ptRec; } double deltaPt = proj->GetRandom(); double ptGen = ptRec + deltaPt; - delete proj; return ptGen; } @@ -472,11 +483,12 @@ struct AntinucleiInJets { LOGP(error, "Could not open the file {}", Form("%s", filepath.Data())); return; } - responseMatrix = static_cast(l->FindObject(Form("%s", histoNamePtUnfolding.Data()))); - if (!responseMatrix) { - LOGP(error, "Could not open histogram {}", Form("%s", histoNamePtUnfolding.Data())); + TObject* obj = l->FindObject(Form("%s", histoNamePtUnfolding.Data())); + if (!obj || !obj->InheritsFrom(TH2F::Class())) { + LOGP(error, "Could not find a valid TH2F histogram {}", Form("%s", histoNamePtUnfolding.Data())); return; } + responseMatrix = static_cast(obj); LOGP(info, "Opened histogram {}", Form("%s", histoNamePtUnfolding.Data())); } From f1642de3d45a27e7e43102bcb72cb0bf32dabfb5 Mon Sep 17 00:00:00 2001 From: alcaliva <32872606+alcaliva@users.noreply.github.com> Date: Thu, 3 Apr 2025 19:38:31 +0200 Subject: [PATCH 0914/1650] [PWGLF] Added zorro for processing of skimmed data and removed magic numbers (#10735) --- PWGLF/Tasks/Strangeness/CMakeLists.txt | 2 +- PWGLF/Tasks/Strangeness/strangenessInJets.cxx | 78 ++++++++++++++----- 2 files changed, 60 insertions(+), 20 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/CMakeLists.txt b/PWGLF/Tasks/Strangeness/CMakeLists.txt index 22a46cb7318..b091bb60b90 100644 --- a/PWGLF/Tasks/Strangeness/CMakeLists.txt +++ b/PWGLF/Tasks/Strangeness/CMakeLists.txt @@ -107,7 +107,7 @@ o2physics_add_dpl_workflow(cascpolsp if(FastJet_FOUND) o2physics_add_dpl_workflow(strangeness-in-jets SOURCES strangenessInJets.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::PWGJECore FastJet::FastJet FastJet::Contrib + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::PWGJECore FastJet::FastJet FastJet::Contrib O2Physics::EventFilteringUtils COMPONENT_NAME Analysis) endif() diff --git a/PWGLF/Tasks/Strangeness/strangenessInJets.cxx b/PWGLF/Tasks/Strangeness/strangenessInJets.cxx index 1fca91dd44b..f5878bb17ad 100644 --- a/PWGLF/Tasks/Strangeness/strangenessInJets.cxx +++ b/PWGLF/Tasks/Strangeness/strangenessInJets.cxx @@ -52,6 +52,9 @@ #include "PWGJE/DataModel/JetReducedData.h" #include "PWGJE/DataModel/Jet.h" +#include "EventFiltering/Zorro.h" +#include "EventFiltering/ZorroSummary.h" + using namespace std; using namespace o2; using namespace o2::soa; @@ -71,6 +74,12 @@ using MCTracks = soa::Join; struct StrangenessInJets { + Service ccdb; + o2::ccdb::CcdbApi ccdbApi; + + Zorro zorro; + OutputObj zorroSummary{"zorroSummary"}; + HistogramRegistry registryData{"registryData", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry registryMC{"registryMC", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry registryQC{"registryQC", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; @@ -81,6 +90,7 @@ struct StrangenessInJets { Configurable rJet{"rJet", 0.3, "Jet resolution parameter R"}; Configurable zVtx{"zVtx", 10.0, "Maximum zVertex"}; Configurable deltaEtaEdge{"deltaEtaEdge", 0.05, "eta gap from the edge"}; + Configurable cfgSkimmedProcessing{"cfgSkimmedProcessing", false, "Skimmed dataset processing"}; // Axis parameters struct : ConfigurableGroup { @@ -167,9 +177,6 @@ struct StrangenessInJets { TH1F* weightsAntiXiInJet; TH1F* weightsAntiXiInUe; - Service ccdb; - o2::ccdb::CcdbApi ccdbApi; - // List of Particles enum Option { KZeroLambda, CascadePart, @@ -180,8 +187,19 @@ struct StrangenessInJets { // Jet background subtraction JetBkgSubUtils backgroundSub; + void initCCDB(aod::BCsWithTimestamps::iterator const& bc) + { + if (cfgSkimmedProcessing) { + zorro.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), "fOmega"); + } + } + void init(InitContext const&) { + if (cfgSkimmedProcessing) { + zorroSummary.setObject(zorro.getZorroSummary()); + } + ccdb->setURL(urlToCcdb.value); ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); @@ -501,27 +519,38 @@ struct StrangenessInJets { template bool passedTrackSelectionForJetReconstruction(const JetTrack& track) { + const int minTpcCr = 70; + const double minCrFindable = 0.8; + const double maxChi2Tpc = 4.0; + const double maxChi2Its = 36.0; + const double maxPseudorapidity = 0.8; + const double minPtTrack = 0.1; + const double dcaxyMaxTrackPar0 = 0.0105; + const double dcaxyMaxTrackPar1 = 0.035; + const double dcaxyMaxTrackPar2 = 1.1; + const double dcazMaxTrack = 2.0; + if (!track.hasITS()) return false; if ((!hasITSHit(track, 1)) && (!hasITSHit(track, 2)) && (!hasITSHit(track, 3))) return false; if (!track.hasTPC()) return false; - if (track.tpcNClsCrossedRows() < 70) + if (track.tpcNClsCrossedRows() < minTpcCr) return false; - if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < 0.8) + if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < minCrFindable) return false; - if (track.tpcChi2NCl() > 4) + if (track.tpcChi2NCl() > maxChi2Tpc) return false; - if (track.itsChi2NCl() > 36) + if (track.itsChi2NCl() > maxChi2Its) return false; - if (track.eta() < -0.8 || track.eta() > 0.8) + if (track.eta() < -maxPseudorapidity || track.eta() > maxPseudorapidity) return false; - if (track.pt() < 0.1) + if (track.pt() < minPtTrack) return false; - if (std::fabs(track.dcaXY()) > (0.0105 + 0.035 / std::pow(track.pt(), 1.1))) + if (std::fabs(track.dcaXY()) > (dcaxyMaxTrackPar0 + dcaxyMaxTrackPar1 / std::pow(track.pt(), dcaxyMaxTrackPar2))) return false; - if (std::fabs(track.dcaZ()) > 2.0) + if (std::fabs(track.dcaZ()) > dcazMaxTrack) return false; return true; } @@ -932,9 +961,11 @@ struct StrangenessInJets { template bool isHighPurityPion(const pionTrack& track, const float nsigmaTPC, const float nsigmaTOF) { - if (track.p() < 0.6 && std::fabs(nsigmaTPC) < 2.0) + double nsigmaPi = 2.0; + double pThreshold = 0.6; + if (track.p() < pThreshold && std::fabs(nsigmaTPC) < nsigmaPi) return true; - if (track.p() > 0.6 && std::fabs(nsigmaTPC) < 2.0 && std::fabs(nsigmaTOF) < 2.0) + if (track.p() > pThreshold && std::fabs(nsigmaTPC) < nsigmaPi && std::fabs(nsigmaTOF) < nsigmaPi) return true; return false; } @@ -1016,6 +1047,13 @@ struct StrangenessInJets { // event counter: before event selection registryData.fill(HIST("number_of_events_data"), 0.5); + auto bc = collision.template bc_as(); + initCCDB(bc); + + if (cfgSkimmedProcessing && !zorro.isSelected(collision.template bc_as().globalBC())) { + return; + } + // event selection if (!collision.sel8() || std::fabs(collision.posZ()) > zVtx) return; @@ -1421,7 +1459,7 @@ struct StrangenessInJets { continue; registryMC.fill(HIST("number_of_events_mc"), 1.5); - if (std::fabs(collision.posZ()) > 10.0) + if (std::fabs(collision.posZ()) > zVtx) continue; registryMC.fill(HIST("number_of_events_mc"), 2.5); @@ -1886,7 +1924,7 @@ struct StrangenessInJets { for (const auto& mccollision : mcCollisions) { // Selection on z_{vertex} - if (std::fabs(mccollision.posZ()) > 10.0) + if (std::fabs(mccollision.posZ()) > zVtx) continue; // MC Particles per Collision @@ -1898,9 +1936,10 @@ struct StrangenessInJets { if (!particle.isPhysicalPrimary()) continue; - if (std::fabs(particle.eta()) > 0.8) + if (std::fabs(particle.eta()) > etaMax) continue; - if (particle.pt() < 0.1) + double ptMinPart = 0.1; + if (particle.pt() < ptMinPart) continue; // 4-momentum representation of a particle @@ -1956,9 +1995,10 @@ struct StrangenessInJets { if (!particle.isPhysicalPrimary()) continue; - if (std::fabs(particle.eta()) > 0.8) + if (std::fabs(particle.eta()) > etaMax) continue; - if (particle.pt() < 0.1) + double ptMinPart = 0.1; + if (particle.pt() < ptMinPart) continue; TVector3 particleDir(particle.px(), particle.py(), particle.pz()); From 3af417cabf4c0735fb9defeb1732e4b73a4c896f Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Thu, 3 Apr 2025 20:05:25 +0200 Subject: [PATCH 0915/1650] [PWGEM/Dilepton] update muon QA (#10750) --- PWGEM/Dilepton/Core/SingleTrackQC.h | 4 ++-- PWGEM/Dilepton/Core/SingleTrackQCMC.h | 4 ++-- PWGEM/Dilepton/Utils/EMTrackUtilities.h | 17 +++++++++++------ 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/PWGEM/Dilepton/Core/SingleTrackQC.h b/PWGEM/Dilepton/Core/SingleTrackQC.h index b5d268a383a..50841bbb1ab 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQC.h @@ -266,8 +266,8 @@ struct SingleTrackQC { fRegistry.addClone("Track/positive/", "Track/negative/"); } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { const AxisSpec axis_pt{ConfPtlBins, "p_{T,#mu} (GeV/c)"}; - const AxisSpec axis_eta{40, -5, -1, "#eta_{#mu}"}; - const AxisSpec axis_phi{90, 0, 2 * M_PI, "#varphi_{#mu} (rad.)"}; + const AxisSpec axis_eta{100, -6, -1, "#eta_{#mu}"}; + const AxisSpec axis_phi{180, 0, 2 * M_PI, "#varphi_{#mu} (rad.)"}; const AxisSpec axis_dca{ConfDCABins, "DCA_{#mu}^{XY} (#sigma)"}; // track info diff --git a/PWGEM/Dilepton/Core/SingleTrackQCMC.h b/PWGEM/Dilepton/Core/SingleTrackQCMC.h index 71afef1511c..14437b595d3 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQCMC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQCMC.h @@ -310,8 +310,8 @@ struct SingleTrackQCMC { } } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { const AxisSpec axis_pt{ConfPtlBins, "p_{T,#mu} (GeV/c)"}; - const AxisSpec axis_eta{25, -4.5, -2.0, "#eta_{#mu}"}; - const AxisSpec axis_phi{36, 0.0, 2 * M_PI, "#varphi_{#mu} (rad.)"}; + const AxisSpec axis_eta{100, -6, -1, "#eta_{#mu}"}; + const AxisSpec axis_phi{180, 0.0, 2 * M_PI, "#varphi_{#mu} (rad.)"}; const AxisSpec axis_dca{ConfDCABins, "DCA_{#mu}^{XY} (#sigma)"}; const AxisSpec axis_charge_gen{3, -1.5, +1.5, "true charge"}; diff --git a/PWGEM/Dilepton/Utils/EMTrackUtilities.h b/PWGEM/Dilepton/Utils/EMTrackUtilities.h index 2792ef48eab..d71211c1321 100644 --- a/PWGEM/Dilepton/Utils/EMTrackUtilities.h +++ b/PWGEM/Dilepton/Utils/EMTrackUtilities.h @@ -59,13 +59,18 @@ float fwdDcaXYinSigma(T const& track) float cXY = track.cXYatDCA(); float dcaX = track.fwdDcaX(); // in cm float dcaY = track.fwdDcaY(); // in cm + float dcaXY = std::sqrt(dcaX * dcaX + dcaY * dcaY); + float dFdx = 2.f * dcaX / dcaXY; + float dFdy = 2.f * dcaY / dcaXY; + float sigma_dcaXY = std::sqrt(cXX * dFdx * dFdx + cYY * dFdy * dFdy + 2.f * cXY * dFdx * dFdy); + return dcaXY / sigma_dcaXY; - float det = cXX * cYY - cXY * cXY; // determinant - if (det < 0) { - return 999.f; - } else { - return std::sqrt(std::fabs((dcaX * dcaX * cYY + dcaY * dcaY * cXX - 2. * dcaX * dcaY * cXY) / det / 2.)); // dca xy in sigma - } + // float det = cXX * cYY - cXY * cXY; // determinant + // if (det < 0) { + // return 999.f; + // } else { + // return std::sqrt(std::fabs((dcaX * dcaX * cYY + dcaY * dcaY * cXX - 2. * dcaX * dcaY * cXY) / det / 2.)); // dca xy in sigma + // } } //_______________________________________________________________________ template From 8c5761446349d4883027fa80480549815b315092 Mon Sep 17 00:00:00 2001 From: yuanzhe <90246048+wang-yuanzhe@users.noreply.github.com> Date: Thu, 3 Apr 2025 21:36:21 +0200 Subject: [PATCH 0916/1650] [PWGLF,Trigger] Update H3L3Body selection and reconstruct from decay3bodys directly (#10753) --- EventFiltering/CMakeLists.txt | 2 +- EventFiltering/PWGLF/nucleiFilter.cxx | 354 ++++++++++++++++++++++---- 2 files changed, 309 insertions(+), 47 deletions(-) diff --git a/EventFiltering/CMakeLists.txt b/EventFiltering/CMakeLists.txt index fdb15598747..3e661399fc7 100644 --- a/EventFiltering/CMakeLists.txt +++ b/EventFiltering/CMakeLists.txt @@ -21,7 +21,7 @@ o2physics_add_dpl_workflow(selected-bc-range-task o2physics_add_dpl_workflow(nuclei-filter SOURCES PWGLF/nucleiFilter.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::TOFBase COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(diffraction-filter diff --git a/EventFiltering/PWGLF/nucleiFilter.cxx b/EventFiltering/PWGLF/nucleiFilter.cxx index 914f5d9ca9c..7cf25abfddf 100644 --- a/EventFiltering/PWGLF/nucleiFilter.cxx +++ b/EventFiltering/PWGLF/nucleiFilter.cxx @@ -27,6 +27,18 @@ #include "PWGLF/DataModel/Vtx3BodyTables.h" #include "../filterTables.h" +#include "ReconstructionDataFormats/Track.h" +#include "Common/Core/trackUtilities.h" +#include "DetectorsBase/Propagator.h" +#include "DetectorsBase/GeometryManager.h" +#include "DataFormatsParameters/GRPObject.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "DataFormatsTOF/ParameterContainers.h" +#include "CCDB/BasicCCDBManager.h" +#include "DCAFitter/DCAFitterN.h" +#include "PWGLF/DataModel/pidTOFGeneric.h" +#include "Common/Core/PID/PIDTOF.h" + using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; @@ -94,28 +106,57 @@ struct nucleiFilter { Configurable> cfgMinTPCmom{"cfgMinTPCmom", {minTPCmom[0], nNuclei, 2, nucleiNames, matterOrNot}, "Minimum TPC p/Z for nuclei PID"}; Configurable> cfgCutsPID{"nucleiCutsPID", {cutsPID[0], nNuclei, nCutsPID, nucleiNames, cutsNames}, "Nuclei PID selections"}; + Configurable fixTPCinnerParam{"fixTPCinnerParam", false, "Fix TPC inner param"}; + // variable/tool for hypertriton 3body decay + int mRunNumber; + float d_bz; + Service ccdb; + using TrackCandidates = soa::Join; // FIXME: positio has been changed + o2::aod::pidtofgeneric::TofPidNewCollision bachelorTOFPID; + o2::base::MatLayerCylSet* lut = nullptr; + o2::vertexing::DCAFitterN<3> fitter3body; + o2::pid::tof::TOFResoParamsV2 mRespParamsV2; // configurable for hypertriton 3body decay - Configurable minCosPA3body{"minCosPA3body", 0.99, "minCosPA3body"}; - Configurable dcavtxdau{"dcavtxdau", 1.0, "DCA Vtx Daughters"}; - Configurable dcapiontopv{"dcapiontopv", 0.05, "DCA Pion To PV"}; - Configurable TofPidNsigmaMin{"TofPidNsigmaMin", -5, "TofPidNsigmaMin"}; - Configurable TofPidNsigmaMax{"TofPidNsigmaMax", 5, "TofPidNsigmaMax"}; - Configurable TpcPidNsigmaCut{"TpcPidNsigmaCut", 5, "TpcPidNsigmaCut"}; - Configurable lifetimecut{"lifetimecut", 40., "lifetimecut"}; // ct - Configurable minProtonPt{"minProtonPt", 0.3, "minProtonPt"}; - Configurable maxProtonPt{"maxProtonPt", 5, "maxProtonPt"}; - Configurable minPionPt{"minPionPt", 0.1, "minPionPt"}; - Configurable maxPionPt{"maxPionPt", 1.2, "maxPionPt"}; - Configurable minDeuteronPt{"minDeuteronPt", 0.6, "minDeuteronPt"}; - Configurable maxDeuteronPt{"maxDeuteronPt", 10, "maxDeuteronPt"}; - Configurable minDeuteronPUseTOF{"minDeuteronPUseTOF", 1, "minDeuteronPt Enable TOF PID"}; - Configurable h3LMassLowerlimit{"h3LMassLowerlimit", 2.96, "Hypertriton mass lower limit"}; - Configurable h3LMassUpperlimit{"h3LMassUpperlimit", 3.04, "Hypertriton mass upper limit"}; - Configurable mintpcNClsproton{"mintpcNClsproton", 90, "min tpc Nclusters for proton"}; - Configurable mintpcNClspion{"mintpcNClspion", 70, "min tpc Nclusters for pion"}; - Configurable mintpcNClsdeuteron{"mintpcNClsdeuteron", 100, "min tpc Nclusters for deuteron"}; - Configurable fixTPCinnerParam{"fixTPCinnerParam", false, "Fix TPC inner param"}; + struct : ConfigurableGroup { + Configurable d_bz_input{"trgH3L3Body.d_bz", -999, "bz field, -999 is automatic"}; + Configurable minCosPA3body{"trgH3L3Body.minCosPA3body", 0.9995, "minCosPA3body"}; + Configurable dcavtxdau{"trgH3L3Body.dcavtxdau", 0.04, "meen DCA among Daughters"}; + Configurable dcapiontopv{"trgH3L3Body.dcapiontopv", 0.05, "DCA Pion To PV"}; + Configurable tofPIDNSigmaMin{"trgH3L3Body.tofPIDNSigmaMin", -5, "tofPIDNSigmaMin"}; + Configurable tofPIDNSigmaMax{"trgH3L3Body.tofPIDNSigmaMax", 5, "tofPIDNSigmaMax"}; + Configurable tpcPIDNSigmaCut{"trgH3L3Body.tpcPIDNSigmaCut", 5, "tpcPIDNSigmaCut"}; + Configurable lifetimecut{"trgH3L3Body.lifetimecut", 40., "lifetimecut"}; + Configurable minProtonPt{"trgH3L3Body.minProtonPt", 0.3, "minProtonPt"}; + Configurable maxProtonPt{"trgH3L3Body.maxProtonPt", 5, "maxProtonPt"}; + Configurable minPionPt{"trgH3L3Body.minPionPt", 0.1, "minPionPt"}; + Configurable maxPionPt{"trgH3L3Body.maxPionPt", 1.2, "maxPionPt"}; + Configurable minDeuteronPt{"trgH3L3Body.minDeuteronPt", 0.6, "minDeuteronPt"}; + Configurable maxDeuteronPt{"trgH3L3Body.maxDeuteronPt", 10, "maxDeuteronPt"}; + Configurable minDeuteronPUseTOF{"trgH3L3Body.minDeuteronPUseTOF", 1, "minDeuteronPt Enable TOF PID"}; + Configurable h3LMassLowerlimit{"trgH3L3Body.h3LMassLowerlimit", 2.96, "Hypertriton mass lower limit"}; + Configurable h3LMassUpperlimit{"trgH3L3Body.h3LMassUpperlimit", 3.04, "Hypertriton mass upper limit"}; + Configurable minP3Body{"trgH3L3Body.minP3Body", 0.5, "min P3Body"}; + Configurable mintpcNClsproton{"trgH3L3Body.mintpcNClsproton", 90, "min tpc Nclusters for proton"}; + Configurable mintpcNClspion{"trgH3L3Body.mintpcNClspion", 70, "min tpc Nclusters for pion"}; + Configurable mintpcNClsdeuteron{"trgH3L3Body.mintpcNClsdeuteron", 100, "min tpc Nclusters for deuteron"}; + + Configurable useMatCorrType{"trgH3L3Body.useMatCorrType", 0, "0: none, 1: TGeo, 2: LUT"}; + // CCDB options + Configurable ccdburl{"trgH3L3Body.ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable grpPath{"trgH3L3Body.grpPath", "GLO/GRP/GRP", "Path of the grp file"}; + Configurable grpmagPath{"trgH3L3Body.grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + Configurable lutPath{"trgH3L3Body.lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; + Configurable geoPath{"trgH3L3Body.geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; + // CCDB TOF PID paras + Configurable timestamp{"trgH3L3Body.ccdb-timestamp", -1, "timestamp of the object"}; + Configurable paramFileName{"trgH3L3Body.paramFileName", "", "Path to the parametrization object. If empty the parametrization is not taken from file"}; + Configurable parametrizationPath{"trgH3L3Body.parametrizationPath", "TOF/Calib/Params", "Path of the TOF parametrization on the CCDB or in the file, if the paramFileName is not empty"}; + Configurable passName{"trgH3L3Body.passName", "", "Name of the pass inside of the CCDB parameter collection. If empty, the automatically deceted from metadata (to be implemented!!!)"}; + Configurable timeShiftCCDBPath{"trgH3L3Body.timeShiftCCDBPath", "", "Path of the TOF time shift vs eta. If empty none is taken"}; + Configurable loadResponseFromCCDB{"trgH3L3Body.loadResponseFromCCDB", false, "Flag to load the response from the CCDB"}; + Configurable fatalOnPassNotAvailable{"trgH3L3Body.fatalOnPassNotAvailable", false, "Flag to throw a fatal if the pass is not available in the retrieved CCDB object"}; + } trgH3L3Body; HistogramRegistry qaHists{"qaHists", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; OutputObj hProcessedEvents{TH1D("hProcessedEvents", ";;Number of filtered events", nNuclei + nHyperNuclei + nITStriggers + 1, -0.5, nNuclei + nHyperNuclei + nITStriggers + 0.5)}; @@ -143,10 +184,135 @@ struct nucleiFilter { for (uint32_t iS{0}; iS < columnsNames.size(); ++iS) { hProcessedEvents->GetXaxis()->SetBinLabel(iS + 2, columnsNames[iS].data()); } + + // for fH3L3Body + bachelorTOFPID.SetPidType(o2::track::PID::Deuteron); + fitter3body.setPropagateToPCA(true); + fitter3body.setMaxR(200.); + fitter3body.setMinParamChange(1e-3); + fitter3body.setMinRelChi2Change(0.9); + fitter3body.setMaxDZIni(1e9); + fitter3body.setMaxChi2(1e9); + fitter3body.setUseAbsDCA(true); + + ccdb->setURL(trgH3L3Body.ccdburl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setFatalWhenNull(false); + } + + void initCCDB(aod::BCsWithTimestamps::iterator const& bc) + { + if (mRunNumber == bc.runNumber()) { + return; + } + + // In case override, don't proceed, please - no CCDB access required + if (trgH3L3Body.d_bz_input > -990) { + d_bz = trgH3L3Body.d_bz_input; + fitter3body.setBz(d_bz); + o2::parameters::GRPMagField grpmag; + if (std::fabs(d_bz) > 1e-5) { + grpmag.setL3Current(30000.f / (d_bz / 5.0f)); + } + o2::base::Propagator::initFieldFromGRP(&grpmag); + mRunNumber = bc.runNumber(); + return; + } + + auto run3grp_timestamp = bc.timestamp(); + o2::parameters::GRPObject* grpo = ccdb->getForTimeStamp(trgH3L3Body.grpPath, run3grp_timestamp); + o2::parameters::GRPMagField* grpmag = 0x0; + if (grpo) { + o2::base::Propagator::initFieldFromGRP(grpo); + // Fetch magnetic field from ccdb for current collision + d_bz = grpo->getNominalL3Field(); + LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; + } else { + grpmag = ccdb->getForTimeStamp(trgH3L3Body.grpmagPath, run3grp_timestamp); + if (!grpmag) { + LOG(fatal) << "Got nullptr from CCDB for path " << trgH3L3Body.grpmagPath << " of object GRPMagField and " << trgH3L3Body.grpPath << " of object GRPObject for timestamp " << run3grp_timestamp; + } + o2::base::Propagator::initFieldFromGRP(grpmag); + // Fetch magnetic field from ccdb for current collision + // d_bz = std::lround(5.f * grpmag->getL3Current() / 30000.f); + d_bz = o2::base::Propagator::Instance()->getNominalBz(); + LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; + } + mRunNumber = bc.runNumber(); + // Set magnetic field value once known + fitter3body.setBz(d_bz); + + if (trgH3L3Body.useMatCorrType == 2) { + // setMatLUT only after magfield has been initalized + // (setMatLUT has implicit and problematic init field call if not) + o2::base::Propagator::Instance()->setMatLUT(lut); + } + + // Initial TOF PID Paras, copied from pidTOF.cxx + trgH3L3Body.timestamp.value = bc.timestamp(); + ccdb->setTimestamp(trgH3L3Body.timestamp.value); + // Not later than now objects + ccdb->setCreatedNotAfter(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); + // TODO: implement the automatic pass name detection from metadata + if (trgH3L3Body.passName.value == "") { + trgH3L3Body.passName.value = "unanchored"; // temporary default + LOG(warning) << "Passed autodetect mode for pass, not implemented yet, waiting for metadata. Taking '" << trgH3L3Body.passName.value << "'"; + } + LOG(info) << "Using parameter collection, starting from pass '" << trgH3L3Body.passName.value << "'"; + + const std::string fname = trgH3L3Body.paramFileName.value; + if (!fname.empty()) { // Loading the parametrization from file + LOG(info) << "Loading exp. sigma parametrization from file " << fname << ", using param: " << trgH3L3Body.parametrizationPath.value; + if (1) { + o2::tof::ParameterCollection paramCollection; + paramCollection.loadParamFromFile(fname, trgH3L3Body.parametrizationPath.value); + LOG(info) << "+++ Loaded parameter collection from file +++"; + if (!paramCollection.retrieveParameters(mRespParamsV2, trgH3L3Body.passName.value)) { + if (trgH3L3Body.fatalOnPassNotAvailable) { + LOGF(fatal, "Pass '%s' not available in the retrieved CCDB object", trgH3L3Body.passName.value.data()); + } else { + LOGF(warning, "Pass '%s' not available in the retrieved CCDB object", trgH3L3Body.passName.value.data()); + } + } else { + mRespParamsV2.setShiftParameters(paramCollection.getPars(trgH3L3Body.passName.value)); + mRespParamsV2.printShiftParameters(); + } + } else { + mRespParamsV2.loadParamFromFile(fname.data(), trgH3L3Body.parametrizationPath.value); + } + } else if (trgH3L3Body.loadResponseFromCCDB) { // Loading it from CCDB + LOG(info) << "Loading exp. sigma parametrization from CCDB, using path: " << trgH3L3Body.parametrizationPath.value << " for timestamp " << trgH3L3Body.timestamp.value; + o2::tof::ParameterCollection* paramCollection = ccdb->getForTimeStamp(trgH3L3Body.parametrizationPath.value, trgH3L3Body.timestamp.value); + paramCollection->print(); + if (!paramCollection->retrieveParameters(mRespParamsV2, trgH3L3Body.passName.value)) { // Attempt at loading the parameters with the pass defined + if (trgH3L3Body.fatalOnPassNotAvailable) { + LOGF(fatal, "Pass '%s' not available in the retrieved CCDB object", trgH3L3Body.passName.value.data()); + } else { + LOGF(warning, "Pass '%s' not available in the retrieved CCDB object", trgH3L3Body.passName.value.data()); + } + } else { // Pass is available, load non standard parameters + mRespParamsV2.setShiftParameters(paramCollection->getPars(trgH3L3Body.passName.value)); + mRespParamsV2.printShiftParameters(); + } + } + mRespParamsV2.print(); + if (trgH3L3Body.timeShiftCCDBPath.value != "") { + if (trgH3L3Body.timeShiftCCDBPath.value.find(".root") != std::string::npos) { + mRespParamsV2.setTimeShiftParameters(trgH3L3Body.timeShiftCCDBPath.value, "gmean_Pos", true); + mRespParamsV2.setTimeShiftParameters(trgH3L3Body.timeShiftCCDBPath.value, "gmean_Neg", false); + } else { + mRespParamsV2.setTimeShiftParameters(ccdb->getForTimeStamp(Form("%s/pos", trgH3L3Body.timeShiftCCDBPath.value.c_str()), trgH3L3Body.timestamp.value), true); + mRespParamsV2.setTimeShiftParameters(ccdb->getForTimeStamp(Form("%s/neg", trgH3L3Body.timeShiftCCDBPath.value.c_str()), trgH3L3Body.timestamp.value), false); + } + } + + bachelorTOFPID.SetParams(mRespParamsV2); } - using TrackCandidates = soa::Join; - void process(soa::Join::iterator const& collision, aod::Vtx3BodyDatas const& vtx3bodydatas, TrackCandidates const& tracks) + // void process(soa::Join::iterator const& collision, aod::Vtx3BodyDatas const& vtx3bodydatas, TrackCandidates const& tracks) + using ColWithEvTime = soa::Join; + void process(ColWithEvTime::iterator const& collision, aod::Decay3Bodys const& decay3bodys, TrackCandidates const& tracks, aod::BCsWithTimestamps const&) { // collision process loop bool keepEvent[nNuclei + nHyperNuclei + nITStriggers]{false}; @@ -232,45 +398,141 @@ struct nucleiFilter { } // end loop over tracks - // hypertriton 3body loop - for (auto& vtx : vtx3bodydatas) { + // fH3L3Body trigger + auto bc = collision.bc_as(); + initCCDB(bc); + + for (const auto& decay3body : decay3bodys) { + auto track0 = decay3body.track0_as(); + auto track1 = decay3body.track1_as(); + auto track2 = decay3body.track2_as(); + + // track selection + // keep like-sign triplets, do not check sign of deuteron, use same cut for p and pi + if (track0.tpcNClsFound() < trgH3L3Body.mintpcNClspion || track1.tpcNClsFound() < trgH3L3Body.mintpcNClspion || track2.tpcNClsFound() < trgH3L3Body.mintpcNClsdeuteron) { + continue; + } + + bool isProton = false, isPion = false, isAntiProton = false, isAntiPion = false; + if (std::abs(track0.tpcNSigmaPr()) < std::abs(track0.tpcNSigmaPi())) { + if (track0.p() >= trgH3L3Body.minProtonPt && track0.p() <= trgH3L3Body.maxProtonPt) { + if (track0.tpcNClsFound() >= trgH3L3Body.mintpcNClsproton) { + isProton = true; + } + } + } + if (std::abs(track0.tpcNSigmaPi()) < std::abs(track0.tpcNSigmaPr())) { + if (track0.p() >= trgH3L3Body.minPionPt && track0.p() <= trgH3L3Body.maxPionPt) { + isPion = true; + } + } + if (std::abs(track1.tpcNSigmaPr()) < std::abs(track1.tpcNSigmaPi())) { + if (track1.p() >= trgH3L3Body.minProtonPt && track1.p() <= trgH3L3Body.maxProtonPt) { + if (track1.tpcNClsFound() >= trgH3L3Body.mintpcNClsproton) { + isAntiProton = true; + } + } + } + if (std::abs(track1.tpcNSigmaPi()) < std::abs(track1.tpcNSigmaPr())) { + if (track1.p() >= trgH3L3Body.minPionPt && track1.p() <= trgH3L3Body.maxPionPt) { + isAntiPion = true; + } + } + + if (!(isProton && isAntiPion) && !(isAntiProton && isPion)) { + continue; + } + + if (std::abs(track2.tpcNSigmaDe()) > trgH3L3Body.tpcPIDNSigmaCut || track2.p() < trgH3L3Body.minDeuteronPt || track2.p() > trgH3L3Body.maxDeuteronPt) { + continue; + } + + float tofNSigmaDeuteron = -999; + if (track2.has_collision() && track2.hasTOF()) { + auto originalcol = track2.collision_as(); + tofNSigmaDeuteron = bachelorTOFPID.GetTOFNSigma(track2, originalcol, collision); + } + if (track2.p() > trgH3L3Body.minDeuteronPUseTOF && (tofNSigmaDeuteron < trgH3L3Body.tofPIDNSigmaMin || tofNSigmaDeuteron > trgH3L3Body.tofPIDNSigmaMax)) { + continue; + } - auto track0 = vtx.track0_as(); - auto track1 = vtx.track1_as(); - auto track2 = vtx.track2_as(); + // reconstruct the secondary vertex + auto Track0 = getTrackParCov(track0); + auto Track1 = getTrackParCov(track1); + auto Track2 = getTrackParCov(track2); + int n3bodyVtx = fitter3body.process(Track0, Track1, Track2); + if (n3bodyVtx == 0) { // discard this pair + continue; + } - qaHists.fill(HIST("fBachDeuTOFNsigma"), track2.p() * track2.sign(), vtx.tofNSigmaBachDe()); + std::array pos = {0.}; + const auto& vtxXYZ = fitter3body.getPCACandidate(); + for (int i = 0; i < 3; i++) { + pos[i] = vtxXYZ[i]; + } - if (vtx.vtxcosPA(collision.posX(), collision.posY(), collision.posZ()) < minCosPA3body) { + // Calculate DCA with respect to the collision associated to the SV, not individual tracks + gpu::gpustd::array dcaInfo; + + auto track0Par = getTrackPar(track0); + o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, track0Par, 2.f, fitter3body.getMatCorrType(), &dcaInfo); + auto track0dcaXY = dcaInfo[0]; + auto track0dca = std::sqrt(track0dcaXY * track0dcaXY + dcaInfo[1] * dcaInfo[1]); + + auto track1Par = getTrackPar(track1); + o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, track1Par, 2.f, fitter3body.getMatCorrType(), &dcaInfo); + auto track1dcaXY = dcaInfo[0]; + auto track1dca = std::sqrt(track1dcaXY * track1dcaXY + dcaInfo[1] * dcaInfo[1]); + + std::array p0 = {0.}, p1 = {0.}, p2{0.}; + const auto& propagatedTrack0 = fitter3body.getTrack(0); + const auto& propagatedTrack1 = fitter3body.getTrack(1); + const auto& propagatedTrack2 = fitter3body.getTrack(2); + propagatedTrack0.getPxPyPzGlo(p0); + propagatedTrack1.getPxPyPzGlo(p1); + propagatedTrack2.getPxPyPzGlo(p2); + std::array p3BXYZ = {p0[0] + p1[0] + p2[0], p0[1] + p1[1] + p2[1], p0[2] + p1[2] + p2[2]}; + float sqpt3B = p3BXYZ[0] * p3BXYZ[0] + p3BXYZ[1] * p3BXYZ[1]; + float sqp3B = sqpt3B + p3BXYZ[2] * p3BXYZ[2]; + float pt3B = std::sqrt(sqpt3B), p3B = std::sqrt(sqp3B); + + if (p3B < trgH3L3Body.minP3Body) { continue; } - float ct = vtx.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassHyperTriton; - if (ct > lifetimecut) { + + if (fitter3body.getChi2AtPCACandidate() > trgH3L3Body.dcavtxdau) { continue; } - if (vtx.dcaVtxdaughters() > dcavtxdau) { + + float vtxCosPA = RecoDecay::cpa(std::array{collision.posX(), collision.posY(), collision.posZ()}, std::array{pos[0], pos[1], pos[2]}, std::array{p3BXYZ[0], p3BXYZ[1], p3BXYZ[2]}); + if (vtxCosPA < trgH3L3Body.minCosPA3body) { continue; } - if ((vtx.tofNSigmaBachDe() < TofPidNsigmaMin || vtx.tofNSigmaBachDe() > TofPidNsigmaMax) && track2.p() > minDeuteronPUseTOF) { + float ct = std::sqrt(std::pow(pos[0] - collision.posX(), 2) + std::pow(pos[1] - collision.posY(), 2) + std::pow(pos[2] - collision.posZ(), 2)) / (p3B + 1E-10) * constants::physics::MassHyperTriton; + if (ct > trgH3L3Body.lifetimecut) { continue; } - if (std::abs(track0.tpcNSigmaPr()) < TpcPidNsigmaCut && std::abs(track1.tpcNSigmaPi()) < TpcPidNsigmaCut && std::abs(track2.tpcNSigmaDe()) < TpcPidNsigmaCut && vtx.mHypertriton() > h3LMassLowerlimit && vtx.mHypertriton() < h3LMassUpperlimit) { - if (track0.tpcNClsFound() >= mintpcNClsproton && track1.tpcNClsFound() >= mintpcNClspion && track2.tpcNClsFound() >= mintpcNClsdeuteron) { - if (std::abs(vtx.dcatrack1topv()) > dcapiontopv) { - keepEvent[3] = true; - qaHists.fill(HIST("fH3LMassVsPt"), vtx.pt(), vtx.mHypertriton()); - } + + float invmassH3L = RecoDecay::m(std::array{std::array{p0[0], p0[1], p0[2]}, std::array{p1[0], p1[1], p1[2]}, std::array{p2[0], p2[1], p2[2]}}, std::array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged, o2::constants::physics::MassDeuteron}); + float invmassAntiH3L = RecoDecay::m(std::array{std::array{p0[0], p0[1], p0[2]}, std::array{p1[0], p1[1], p1[2]}, std::array{p2[0], p2[1], p2[2]}}, std::array{o2::constants::physics::MassPionCharged, o2::constants::physics::MassProton, o2::constants::physics::MassDeuteron}); + + if (invmassH3L >= trgH3L3Body.h3LMassLowerlimit && invmassH3L <= trgH3L3Body.h3LMassUpperlimit) { + // Hypertriton hypothesis + if (isProton && isAntiPion && std::abs(track1dca) >= trgH3L3Body.dcapiontopv) { + qaHists.fill(HIST("fH3LMassVsPt"), pt3B, invmassH3L); + qaHists.fill(HIST("fBachDeuTOFNsigma"), track2.p() * track2.sign(), tofNSigmaDeuteron); + keepEvent[3] = true; } } - if (std::abs(track0.tpcNSigmaPi()) < TpcPidNsigmaCut && std::abs(track1.tpcNSigmaPr()) < TpcPidNsigmaCut && std::abs(track2.tpcNSigmaDe()) < TpcPidNsigmaCut && vtx.mAntiHypertriton() > h3LMassLowerlimit && vtx.mAntiHypertriton() < h3LMassUpperlimit) { - if (track0.tpcNClsFound() >= mintpcNClspion && track1.tpcNClsFound() >= mintpcNClsproton && track2.tpcNClsFound() >= mintpcNClsdeuteron) { - if (std::abs(vtx.dcatrack0topv()) > dcapiontopv) { - keepEvent[3] = true; - qaHists.fill(HIST("fH3LMassVsPt"), vtx.pt(), vtx.mAntiHypertriton()); - } + if (invmassAntiH3L >= trgH3L3Body.h3LMassLowerlimit && invmassAntiH3L <= trgH3L3Body.h3LMassUpperlimit) { + // Anti-Hypertriton hypothesis + if (isAntiProton && isPion && std::abs(track0dca) >= trgH3L3Body.dcapiontopv) { + qaHists.fill(HIST("fH3LMassVsPt"), pt3B, invmassAntiH3L); + qaHists.fill(HIST("fBachDeuTOFNsigma"), track2.p() * track2.sign(), tofNSigmaDeuteron); + keepEvent[3] = true; } } - } // end loop over hypertriton 3body decay candidates + } for (int iDecision{0}; iDecision < nNuclei + nHyperNuclei + nITStriggers; ++iDecision) { if (keepEvent[iDecision]) { From 115bac2c413a1b76b3a7d7383020fb766ae43b3a Mon Sep 17 00:00:00 2001 From: fuchuncui <162277233+fuchuncui@users.noreply.github.com> Date: Fri, 4 Apr 2025 03:45:10 +0800 Subject: [PATCH 0917/1650] [PWGCF] Add closure test (#10746) --- PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx | 511 +++++++++++++++++++--------- 1 file changed, 351 insertions(+), 160 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx b/PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx index d331a661e40..9d749b65d43 100644 --- a/PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx +++ b/PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx @@ -40,6 +40,7 @@ #include "CommonConstants/PhysicsConstants.h" #include "Common/Core/trackUtilities.h" #include "PWGLF/DataModel/LFStrangenessTables.h" +#include "PWGMM/Mult/DataModel/Index.h" #include "TList.h" #include #include @@ -52,16 +53,16 @@ using namespace o2::framework; using namespace o2::framework::expressions; namespace { -std::shared_ptr refc22[10]; -std::shared_ptr refc24[10]; -std::shared_ptr k0sc22[10]; -std::shared_ptr k0sc24[10]; -std::shared_ptr lambdac22[10]; -std::shared_ptr lambdac24[10]; -std::shared_ptr xic22[10]; -std::shared_ptr xic24[10]; -std::shared_ptr omegac22[10]; -std::shared_ptr omegac24[10]; +std::shared_ptr refc22[20]; +std::shared_ptr refc24[20]; +std::shared_ptr k0sc22[20]; +std::shared_ptr k0sc24[20]; +std::shared_ptr lambdac22[20]; +std::shared_ptr lambdac24[20]; +std::shared_ptr xic22[20]; +std::shared_ptr xic24[20]; +std::shared_ptr omegac22[20]; +std::shared_ptr omegac24[20]; } // namespace #define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable NAME{#NAME, DEFAULT, HELP}; @@ -76,11 +77,7 @@ struct FlowGfwOmegaXi { O2_DEFINE_CONFIGURABLE(cfgCutEta, float, 0.8f, "Eta range for tracks") O2_DEFINE_CONFIGURABLE(cfgCutChi2prTPCcls, float, 2.5, "Chi2 per TPC clusters") O2_DEFINE_CONFIGURABLE(cfgCutOccupancyHigh, int, 500, "High cut on TPC occupancy") - O2_DEFINE_CONFIGURABLE(cfgCutOccupancyLow, int, 0, "Low cut on TPC occupancy") - O2_DEFINE_CONFIGURABLE(cfgOmegaMassbins, int, 16, "Number of Omega mass axis bins for c22") - O2_DEFINE_CONFIGURABLE(cfgXiMassbins, int, 14, "Number of Xi mass axis bins for c22") - O2_DEFINE_CONFIGURABLE(cfgK0sMassbins, int, 80, "Number of K0s mass axis bins for c22") - O2_DEFINE_CONFIGURABLE(cfgLambdaMassbins, int, 32, "Number of Lambda mass axis bins for c22") + O2_DEFINE_CONFIGURABLE(cfgMassBins, std::vector, (std::vector{80, 32, 14, 16}), "Number of K0s, Lambda, Xi, Omega mass axis bins for c22") O2_DEFINE_CONFIGURABLE(cfgDeltaPhiLocDen, int, 3, "Number of delta phi for local density, 200 bins in 2 pi") // topological cut for V0 O2_DEFINE_CONFIGURABLE(cfgv0_radius, float, 5.0f, "minimum decay radius") @@ -104,18 +101,22 @@ struct FlowGfwOmegaXi { O2_DEFINE_CONFIGURABLE(cfgitsclusters, int, 1, "minimum number of ITS clusters requirement") O2_DEFINE_CONFIGURABLE(cfgtpcclufindable, int, 1, "minimum number of findable TPC clusters") O2_DEFINE_CONFIGURABLE(cfgtpccrossoverfindable, int, 1, "minimum number of Ratio crossed rows over findable clusters") - O2_DEFINE_CONFIGURABLE(cfgcheckDauTPC, bool, true, "check daughter tracks TPC or not") - O2_DEFINE_CONFIGURABLE(cfgcheckDauTOF, bool, false, "check daughter tracks TOF or not") O2_DEFINE_CONFIGURABLE(cfgCasc_rapidity, float, 0.5, "rapidity") O2_DEFINE_CONFIGURABLE(cfgNSigmatpctof, std::vector, (std::vector{3, 3, 3, 3, 3, 3}), "tpc and tof NSigma for Pion Proton Kaon") - O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeights, bool, true, "Fill and output NUA weights") O2_DEFINE_CONFIGURABLE(cfgAcceptancePath, std::vector, (std::vector{"Users/f/fcui/NUA/NUAREFPartical", "Users/f/fcui/NUA/NUAK0s", "Users/f/fcui/NUA/NUALambda", "Users/f/fcui/NUA/NUAXi", "Users/f/fcui/NUA/NUAOmega"}), "CCDB path to acceptance object") O2_DEFINE_CONFIGURABLE(cfgEfficiencyPath, std::vector, (std::vector{"PathtoRef"}), "CCDB path to efficiency object") - O2_DEFINE_CONFIGURABLE(cfgLocDenParaXi, std::vector, (std::vector{-0.000986187, -3.86861, -0.000912481, -3.29206, -0.000859271, -2.89389, -0.000817039, -2.61201, -0.000788792, -2.39079, -0.000780182, -2.19276, -0.000750457, -2.07205, -0.000720279, -1.96865, -0.00073247, -1.85642, -0.000695091, -1.82625, -0.000693332, -1.72679, -0.000681225, -1.74305, -0.000652818, -1.92608, -0.000618892, -2.31985}), "Local density efficiency function parameter for Xi, exp(Ax + B)") O2_DEFINE_CONFIGURABLE(cfgLocDenParaOmega, std::vector, (std::vector{-0.000444324, -6.0424, -0.000566208, -5.42168, -0.000580338, -4.96967, -0.000721054, -4.41994, -0.000626394, -4.27934, -0.000652167, -3.9543, -0.000592327, -3.79053, -0.000544721, -3.73292, -0.000613419, -3.43849, -0.000402506, -3.47687, -0.000602687, -3.24491, -0.000460848, -3.056, -0.00039428, -2.35188, -0.00041908, -2.03642}), "Local density efficiency function parameter for Omega, exp(Ax + B)") O2_DEFINE_CONFIGURABLE(cfgLocDenParaK0s, std::vector, (std::vector{-0.00043057, -3.2435, -0.000385085, -2.97687, -0.000350298, -2.81502, -0.000326159, -2.71091, -0.000299563, -2.65448, -0.000294284, -2.60865, -0.000277938, -2.589, -0.000277091, -2.56983, -0.000272783, -2.56825, -0.000252706, -2.58996, -0.000247834, -2.63158, -0.00024379, -2.76976, -0.000286468, -2.92484, -0.000310149, -3.27746}), "Local density efficiency function parameter for K0s, exp(Ax + B)") O2_DEFINE_CONFIGURABLE(cfgLocDenParaLambda, std::vector, (std::vector{-0.000510948, -4.4846, -0.000460629, -4.14465, -0.000433729, -3.94173, -0.000412751, -3.81839, -0.000411211, -3.72502, -0.000401511, -3.68426, -0.000407461, -3.67005, -0.000379371, -3.71153, -0.000392828, -3.73214, -0.000403996, -3.80717, -0.000403376, -3.90917, -0.000354624, -4.34629, -0.000477606, -4.66307, -0.000541139, -4.61364}), "Local density efficiency function parameter for Lambda, exp(Ax + B)") + // switch + O2_DEFINE_CONFIGURABLE(cfgcheckDauTPC, bool, true, "check daughter tracks TPC or not") + O2_DEFINE_CONFIGURABLE(cfgcheckDauTOF, bool, false, "check daughter tracks TOF or not") + O2_DEFINE_CONFIGURABLE(cfgDoAccEffCorr, bool, false, "do acc and eff corr") + O2_DEFINE_CONFIGURABLE(cfgDoLocDenCorr, bool, false, "do local density corr") + O2_DEFINE_CONFIGURABLE(cfgDoJackknife, bool, false, "do jackknife") + O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeights, bool, false, "Fill and output NUA weights") + O2_DEFINE_CONFIGURABLE(cfgOutputLocDenWeights, bool, false, "Fill and output local density weights") ConfigurableAxis cfgaxisVertex{"cfgaxisVertex", {20, -10, 10}, "vertex axis for histograms"}; ConfigurableAxis cfgaxisPhi{"cfgaxisPhi", {60, 0.0, constants::math::TwoPI}, "phi axis for histograms"}; @@ -128,6 +129,8 @@ struct FlowGfwOmegaXi { ConfigurableAxis cfgaxisXiMassforflow{"cfgaxisXiMassforflow", {14, 1.3f, 1.37f}, "Inv. Mass (GeV)"}; ConfigurableAxis cfgaxisK0sMassforflow{"cfgaxisK0sMassforflow", {40, 0.4f, 0.6f}, "Inv. Mass (GeV)"}; ConfigurableAxis cfgaxisLambdaMassforflow{"cfgaxisLambdaMassforflow", {32, 1.08f, 1.16f}, "Inv. Mass (GeV)"}; + ConfigurableAxis cfgaxisNch{"cfgaxisNch", {3000, 0.5, 3000.5}, "Nch"}; + ConfigurableAxis cfgaxisLocalDensity{"cfgaxisLocalDensity", {200, 0, 600}, "local density"}; AxisSpec axisMultiplicity{{0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90}, "Centrality (%)"}; AxisSpec axisOmegaMass = {80, 1.63f, 1.71f, "Inv. Mass (GeV)"}; @@ -138,6 +141,11 @@ struct FlowGfwOmegaXi { Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtPOIMin) && (aod::track::pt < cfgCutPtPOIMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls); + using TracksPID = soa::Join; + using AodTracks = soa::Filtered>; // tracks filter + using AodCollisions = soa::Filtered>; // collisions filter + using DaughterTracks = soa::Join; + // Connect to ccdb Service ccdb; O2_DEFINE_CONFIGURABLE(cfgnolaterthan, int64_t, std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object") @@ -157,6 +165,7 @@ struct FlowGfwOmegaXi { std::vector cfgAcceptance = cfgAcceptancePath; std::vector cfgEfficiency = cfgEfficiencyPath; std::vector cfgNSigma = cfgNSigmatpctof; + std::vector cfgmassbins = cfgMassBins; std::vector mAcceptance; std::vector mEfficiency; @@ -164,16 +173,9 @@ struct FlowGfwOmegaXi { TF1* fMultPVCutLow = nullptr; TF1* fMultPVCutHigh = nullptr; - TF1* fMultCutLow = nullptr; - TF1* fMultCutHigh = nullptr; TF1* fT0AV0AMean = nullptr; TF1* fT0AV0ASigma = nullptr; - using TracksPID = soa::Join; - using AodTracks = soa::Filtered>; // tracks filter - using AodCollisions = soa::Filtered>; // collisions filter - using DaughterTracks = soa::Join; - // Declare the pt, mult and phi Axis; int nPtBins = 0; TAxis* fPtAxis = nullptr; @@ -184,7 +186,6 @@ struct FlowGfwOmegaXi { int nV0PtBins = 0; TAxis* fV0PtAxis = nullptr; - int nMultBins = 0; TAxis* fMultAxis = nullptr; TAxis* fOmegaMass = nullptr; @@ -201,14 +202,40 @@ struct FlowGfwOmegaXi { ccdb->setCaching(true); ccdb->setCreatedNotAfter(cfgnolaterthan.value); + // Set the pt, mult and phi Axis; + o2::framework::AxisSpec axisPt = cfgaxisPt; + nPtBins = axisPt.binEdges.size() - 1; + fPtAxis = new TAxis(nPtBins, &(axisPt.binEdges)[0]); + + o2::framework::AxisSpec axisXiPt = cfgaxisPtXi; + nXiPtBins = axisXiPt.binEdges.size() - 1; + fXiPtAxis = new TAxis(nXiPtBins, &(axisXiPt.binEdges)[0]); + + o2::framework::AxisSpec axisV0Pt = cfgaxisPtV0; + nV0PtBins = axisV0Pt.binEdges.size() - 1; + fV0PtAxis = new TAxis(nV0PtBins, &(axisV0Pt.binEdges)[0]); + + o2::framework::AxisSpec axisMult = axisMultiplicity; + int nMultBins = axisMult.binEdges.size() - 1; + fMultAxis = new TAxis(nMultBins, &(axisMult.binEdges)[0]); + + fOmegaMass = new TAxis(cfgmassbins[3], 1.63, 1.71); + + fXiMass = new TAxis(cfgmassbins[2], 1.3, 1.37); + + fK0sMass = new TAxis(cfgmassbins[0], 0.4, 0.6); + + fLambdaMass = new TAxis(cfgmassbins[1], 1.08, 1.16); + // Add some output objects to the histogram registry registry.add("hPhi", "", {HistType::kTH1D, {cfgaxisPhi}}); registry.add("hPhicorr", "", {HistType::kTH1D, {cfgaxisPhi}}); registry.add("hEta", "", {HistType::kTH1D, {cfgaxisEta}}); registry.add("hVtxZ", "", {HistType::kTH1D, {cfgaxisVertex}}); - registry.add("hMult", "", {HistType::kTH1D, {{3000, 0.5, 3000.5}}}); + registry.add("hMult", "", {HistType::kTH1D, {cfgaxisNch}}); registry.add("hCent", "", {HistType::kTH1D, {{90, 0, 90}}}); - registry.add("hCentvsNch", "", {HistType::kTH2D, {{90, 0, 90}, {3000, 0.5, 3000.5}}}); + registry.add("hCentvsNch", "", {HistType::kTH2D, {{18, 0, 90}, cfgaxisNch}}); + registry.add("MC/hCentvsNchMC", "", {HistType::kTH2D, {{18, 0, 90}, cfgaxisNch}}); registry.add("hPt", "", {HistType::kTH1D, {cfgaxisPt}}); registry.add("hEtaPhiVtxzREF", "", {HistType::kTH3D, {cfgaxisPhi, cfgaxisEta, {20, -10, 10}}}); registry.add("hEtaPhiVtxzPOIXi", "", {HistType::kTH3D, {cfgaxisPhi, cfgaxisEta, {20, -10, 10}}}); @@ -270,18 +297,26 @@ struct FlowGfwOmegaXi { registry.add("K0sc24dpt", ";pt ; C_{2}{4} ", {HistType::kTProfile3D, {cfgaxisPtV0, cfgaxisK0sMassforflow, axisMultiplicity}}); registry.add("Lambdac24dpt", ";pt ; C_{2}{4} ", {HistType::kTProfile3D, {cfgaxisPtV0, cfgaxisLambdaMassforflow, axisMultiplicity}}); // for Jackknife - for (int i = 1; i <= 10; i++) { - refc22[i - 1] = registry.add(Form("Jackknife/REF/c22_%d", i), ";Centrality (%) ; C_{2}{2} ", {HistType::kTProfile, {axisMultiplicity}}); - refc24[i - 1] = registry.add(Form("Jackknife/REF/c24_%d", i), ";Centrality (%) ; C_{2}{2} ", {HistType::kTProfile, {axisMultiplicity}}); - xic22[i - 1] = registry.add(Form("Jackknife/Xi/Xic22dpt_%d", i), ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtXi, cfgaxisXiMassforflow, axisMultiplicity}}); - omegac22[i - 1] = registry.add(Form("Jackknife/Omega/Omegac22dpt_%d", i), ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtXi, cfgaxisOmegaMassforflow, axisMultiplicity}}); - k0sc22[i - 1] = registry.add(Form("Jackknife/K0s/K0sc22dpt_%d", i), ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtV0, cfgaxisK0sMassforflow, axisMultiplicity}}); - lambdac22[i - 1] = registry.add(Form("Jackknife/Lambda/Lambdac22dpt_%d", i), ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtV0, cfgaxisLambdaMassforflow, axisMultiplicity}}); - xic24[i - 1] = registry.add(Form("Jackknife/Xi/Xic24dpt_%d", i), ";pt ; C_{2}{4} ", {HistType::kTProfile3D, {cfgaxisPtXi, cfgaxisXiMassforflow, axisMultiplicity}}); - omegac24[i - 1] = registry.add(Form("Jackknife/Omega/Omegac24dpt_%d", i), ";pt ; C_{2}{4} ", {HistType::kTProfile3D, {cfgaxisPtXi, cfgaxisOmegaMassforflow, axisMultiplicity}}); - k0sc24[i - 1] = registry.add(Form("Jackknife/K0s/K0sc24dpt_%d", i), ";pt ; C_{2}{4} ", {HistType::kTProfile3D, {cfgaxisPtV0, cfgaxisK0sMassforflow, axisMultiplicity}}); - lambdac24[i - 1] = registry.add(Form("Jackknife/Lambda/Lambdac24dpt_%d", i), ";pt ; C_{2}{4} ", {HistType::kTProfile3D, {cfgaxisPtV0, cfgaxisLambdaMassforflow, axisMultiplicity}}); + if (cfgDoJackknife) { + for (int i = 1; i <= nPtBins; i++) { + refc22[i - 1] = registry.add(Form("Jackknife/REF/c22_%d", i), ";Centrality (%) ; C_{2}{2} ", {HistType::kTProfile, {axisMultiplicity}}); + refc24[i - 1] = registry.add(Form("Jackknife/REF/c24_%d", i), ";Centrality (%) ; C_{2}{2} ", {HistType::kTProfile, {axisMultiplicity}}); + xic22[i - 1] = registry.add(Form("Jackknife/Xi/Xic22dpt_%d", i), ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtXi, cfgaxisXiMassforflow, axisMultiplicity}}); + omegac22[i - 1] = registry.add(Form("Jackknife/Omega/Omegac22dpt_%d", i), ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtXi, cfgaxisOmegaMassforflow, axisMultiplicity}}); + k0sc22[i - 1] = registry.add(Form("Jackknife/K0s/K0sc22dpt_%d", i), ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtV0, cfgaxisK0sMassforflow, axisMultiplicity}}); + lambdac22[i - 1] = registry.add(Form("Jackknife/Lambda/Lambdac22dpt_%d", i), ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtV0, cfgaxisLambdaMassforflow, axisMultiplicity}}); + xic24[i - 1] = registry.add(Form("Jackknife/Xi/Xic24dpt_%d", i), ";pt ; C_{2}{4} ", {HistType::kTProfile3D, {cfgaxisPtXi, cfgaxisXiMassforflow, axisMultiplicity}}); + omegac24[i - 1] = registry.add(Form("Jackknife/Omega/Omegac24dpt_%d", i), ";pt ; C_{2}{4} ", {HistType::kTProfile3D, {cfgaxisPtXi, cfgaxisOmegaMassforflow, axisMultiplicity}}); + k0sc24[i - 1] = registry.add(Form("Jackknife/K0s/K0sc24dpt_%d", i), ";pt ; C_{2}{4} ", {HistType::kTProfile3D, {cfgaxisPtV0, cfgaxisK0sMassforflow, axisMultiplicity}}); + lambdac24[i - 1] = registry.add(Form("Jackknife/Lambda/Lambdac24dpt_%d", i), ";pt ; C_{2}{4} ", {HistType::kTProfile3D, {cfgaxisPtV0, cfgaxisLambdaMassforflow, axisMultiplicity}}); + } } + // MC True flow + registry.add("MC/c22MC", ";Centrality (%) ; C_{2}{2} ", {HistType::kTProfile, {axisMultiplicity}}); + registry.add("MC/Xic22dptMC", ";pt ; C_{2}{2} ", {HistType::kTProfile2D, {cfgaxisPtXi, axisMultiplicity}}); + registry.add("MC/Omegac22dptMC", ";pt ; C_{2}{2} ", {HistType::kTProfile2D, {cfgaxisPtXi, axisMultiplicity}}); + registry.add("MC/K0sc22dptMC", ";pt ; C_{2}{2} ", {HistType::kTProfile2D, {cfgaxisPtV0, axisMultiplicity}}); + registry.add("MC/Lambdac22dptMC", ";pt ; C_{2}{2} ", {HistType::kTProfile2D, {cfgaxisPtV0, axisMultiplicity}}); // InvMass(GeV) of casc and v0 registry.add("InvMassXi_all", "", {HistType::kTHnSparseF, {cfgaxisPtXi, axisXiMass, cfgaxisEta, axisMultiplicity}}); registry.add("InvMassOmega_all", "", {HistType::kTHnSparseF, {cfgaxisPtXi, axisOmegaMass, cfgaxisEta, axisMultiplicity}}); @@ -291,32 +326,17 @@ struct FlowGfwOmegaXi { registry.add("InvMassLambda_all", "", {HistType::kTHnSparseF, {cfgaxisPtV0, axisLambdaMass, cfgaxisEta, axisMultiplicity}}); registry.add("InvMassK0s", "", {HistType::kTHnSparseF, {cfgaxisPtV0, axisK0sMass, cfgaxisEta, axisMultiplicity}}); registry.add("InvMassLambda", "", {HistType::kTHnSparseF, {cfgaxisPtV0, axisLambdaMass, cfgaxisEta, axisMultiplicity}}); + // for local density correlation + registry.add("MC/densityMCGenK0s", "", {HistType::kTH3D, {cfgaxisPtV0, cfgaxisNch, cfgaxisLocalDensity}}); + registry.add("MC/densityMCGenLambda", "", {HistType::kTH3D, {cfgaxisPtV0, cfgaxisNch, cfgaxisLocalDensity}}); + registry.add("MC/densityMCGenXi", "", {HistType::kTH3D, {cfgaxisPtXi, cfgaxisNch, cfgaxisLocalDensity}}); + registry.add("MC/densityMCGenOmega", "", {HistType::kTH3D, {cfgaxisPtXi, cfgaxisNch, cfgaxisLocalDensity}}); + registry.add("MC/densityMCRecK0s", "", {HistType::kTHnSparseF, {cfgaxisPtV0, cfgaxisNch, cfgaxisLocalDensity, axisK0sMass}}); + registry.add("MC/densityMCRecLambda", "", {HistType::kTHnSparseF, {cfgaxisPtV0, cfgaxisNch, cfgaxisLocalDensity, axisLambdaMass}}); + registry.add("MC/densityMCRecXi", "", {HistType::kTHnSparseF, {cfgaxisPtXi, cfgaxisNch, cfgaxisLocalDensity, axisXiMass}}); + registry.add("MC/densityMCRecOmega", "", {HistType::kTHnSparseF, {cfgaxisPtXi, cfgaxisNch, cfgaxisLocalDensity, axisOmegaMass}}); - // Set the pt, mult and phi Axis; - o2::framework::AxisSpec axisPt = cfgaxisPt; - nPtBins = axisPt.binEdges.size() - 1; - fPtAxis = new TAxis(nPtBins, &(axisPt.binEdges)[0]); - - o2::framework::AxisSpec axisXiPt = cfgaxisPtXi; - nXiPtBins = axisXiPt.binEdges.size() - 1; - fXiPtAxis = new TAxis(nXiPtBins, &(axisXiPt.binEdges)[0]); - - o2::framework::AxisSpec axisV0Pt = cfgaxisPtV0; - nV0PtBins = axisV0Pt.binEdges.size() - 1; - fV0PtAxis = new TAxis(nV0PtBins, &(axisV0Pt.binEdges)[0]); - - o2::framework::AxisSpec axisMult = axisMultiplicity; - nMultBins = axisMult.binEdges.size() - 1; - fMultAxis = new TAxis(nMultBins, &(axisMult.binEdges)[0]); - - fOmegaMass = new TAxis(cfgOmegaMassbins, 1.63, 1.71); - - fXiMass = new TAxis(cfgXiMassbins, 1.3, 1.37); - - fK0sMass = new TAxis(cfgK0sMassbins, 0.4, 0.6); - - fLambdaMass = new TAxis(cfgLambdaMassbins, 1.08, 1.16); - + // Data fGFW->AddRegion("reffull", -0.8, 0.8, 1, 1); // ("name", etamin, etamax, ptbinnum, bitmask)eta region -0.8 to 0.8 fGFW->AddRegion("refN10", -0.8, -0.4, 1, 1); fGFW->AddRegion("refP10", 0.4, 0.8, 1, 1); @@ -326,52 +346,70 @@ struct FlowGfwOmegaXi { fGFW->AddRegion("poifulldpt", -0.8, 0.8, nPtBins, 32); fGFW->AddRegion("poioldpt", -0.8, 0.8, nPtBins, 1); - int nXiptMassBins = nXiPtBins * cfgXiMassbins; + int nXiptMassBins = nXiPtBins * cfgmassbins[2]; fGFW->AddRegion("poiXiPdpt", 0.4, 0.8, nXiptMassBins, 2); fGFW->AddRegion("poiXiNdpt", -0.8, -0.4, nXiptMassBins, 2); fGFW->AddRegion("poiXifulldpt", -0.8, 0.8, nXiptMassBins, 2); fGFW->AddRegion("poiXiP", 0.4, 0.8, 1, 2); fGFW->AddRegion("poiXiN", -0.8, -0.4, 1, 2); - int nOmegaptMassBins = nXiPtBins * cfgOmegaMassbins; + int nOmegaptMassBins = nXiPtBins * cfgmassbins[3]; fGFW->AddRegion("poiOmegaPdpt", 0.4, 0.8, nOmegaptMassBins, 4); fGFW->AddRegion("poiOmegaNdpt", -0.8, -0.4, nOmegaptMassBins, 4); fGFW->AddRegion("poiOmegafulldpt", -0.8, 0.8, nOmegaptMassBins, 4); fGFW->AddRegion("poiOmegaP", 0.4, 0.8, 1, 4); fGFW->AddRegion("poiOmegaN", -0.8, -0.4, 1, 4); - int nK0sptMassBins = nV0PtBins * cfgK0sMassbins; + int nK0sptMassBins = nV0PtBins * cfgmassbins[0]; fGFW->AddRegion("poiK0sPdpt", 0.4, 0.8, nK0sptMassBins, 8); fGFW->AddRegion("poiK0sNdpt", -0.8, -0.4, nK0sptMassBins, 8); fGFW->AddRegion("poiK0sfulldpt", -0.8, 0.8, nK0sptMassBins, 8); fGFW->AddRegion("poiK0sP", 0.4, 0.8, 1, 8); fGFW->AddRegion("poiK0sN", -0.8, 0.4, 1, 8); - int nLambdaptMassBins = nV0PtBins * cfgLambdaMassbins; + int nLambdaptMassBins = nV0PtBins * cfgmassbins[1]; fGFW->AddRegion("poiLambdaPdpt", 0.4, 0.8, nLambdaptMassBins, 16); fGFW->AddRegion("poiLambdaNdpt", -0.8, -0.4, nLambdaptMassBins, 16); fGFW->AddRegion("poiLambdafulldpt", -0.8, 0.8, nLambdaptMassBins, 16); fGFW->AddRegion("poiLambdaP", 0.4, 0.8, 1, 16); fGFW->AddRegion("poiLambdaN", -0.8, -0.4, 1, 16); + // MC + fGFW->AddRegion("refN10MC", -0.8, -0.4, 1, 64); + fGFW->AddRegion("refP10MC", 0.4, 0.8, 1, 64); + fGFW->AddRegion("poiXiPdptMC", 0.4, 0.8, nXiptMassBins, 128); + fGFW->AddRegion("poiXiNdptMC", -0.8, -0.4, nXiptMassBins, 128); + fGFW->AddRegion("poiOmegaPdptMC", 0.4, 0.8, nOmegaptMassBins, 256); + fGFW->AddRegion("poiOmegaNdptMC", -0.8, -0.4, nOmegaptMassBins, 256); + fGFW->AddRegion("poiK0sPdptMC", 0.4, 0.8, nK0sptMassBins, 512); + fGFW->AddRegion("poiK0sNdptMC", -0.8, -0.4, nK0sptMassBins, 512); + fGFW->AddRegion("poiLambdaPdptMC", 0.4, 0.8, nLambdaptMassBins, 1024); + fGFW->AddRegion("poiLambdaNdptMC", -0.8, -0.4, nLambdaptMassBins, 1024); // pushback - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiP10dpt {2} refN10 {-2}", "Poi10Gap22dpta", kTRUE)); + // Data + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiP10dpt {2} refN10 {-2}", "Poi10Gap22dpta", kTRUE)); // 0 corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiN10dpt {2} refP10 {-2}", "Poi10Gap22dptb", kTRUE)); corrconfigs.push_back(fGFW->GetCorrelatorConfig("poifulldpt reffull | poioldpt {2 2 -2 -2}", "Poi10Gap24dpt", kTRUE)); corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiXiPdpt {2} refN10 {-2}", "Xi10Gap22a", kTRUE)); corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiXiNdpt {2} refP10 {-2}", "Xi10Gap22b", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiXifulldpt reffull {2 2 -2 -2}", "Xi10Gap24", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiXifulldpt reffull {2 2 -2 -2}", "Xi10Gap24", kTRUE)); // 5 corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiOmegaPdpt {2} refN10 {-2}", "Omega10Gap22a", kTRUE)); corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiOmegaNdpt {2} refP10 {-2}", "Omega10Gap22b", kTRUE)); corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiOmegafulldpt reffull {2 2 -2 -2}", "Xi10Gap24", kTRUE)); corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiK0sPdpt {2} refN10 {-2}", "K0short10Gap22a", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiK0sNdpt {2} refP10 {-2}", "K0short10Gap22b", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiK0sNdpt {2} refP10 {-2}", "K0short10Gap22b", kTRUE)); // 10 corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiK0sfulldpt reffull {2 2 -2 -2}", "Xi10Gap24", kTRUE)); corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiLambdaPdpt {2} refN10 {-2}", "Lambda10Gap22a", kTRUE)); corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiLambdaNdpt {2} refP10 {-2}", "Lambda10Gap22b", kTRUE)); corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiLambdafulldpt reffull {2 2 -2 -2}", "Xi10Gap24a", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refP10 {2} refN10 {-2}", "Ref10Gap22a", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refP10 {2} refN10 {-2}", "Ref10Gap22a", kFALSE)); // 15 corrconfigs.push_back(fGFW->GetCorrelatorConfig("reffull reffull {2 2 -2 -2}", "Ref10Gap24", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiK0sP {2} refN10 {-2}", "K0s10Gap22inta", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiK0sN {2} refP10 {-2}", "K0s10Gap22intb", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiLambdaP {2} refN10 {-2}", "Lambda10Gap22inta", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiLambdaN {2} refP10 {-2}", "Lambda10Gap22intb", kFALSE)); + // MC + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiXiPdptMC {2} refN10MC {-2}", "MCXi10Gap22a", kTRUE)); // 17 + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiXiNdptMC {2} refP10MC {-2}", "MCXi10Gap22b", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiOmegaPdptMC {2} refN10MC {-2}", "MCOmega10Gap22a", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiOmegaNdptMC {2} refP10MC {-2}", "MCOmega10Gap22b", kTRUE)); // 20 + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiK0sPdptMC {2} refN10MC {-2}", "MCK0s10Gap22a", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiK0sNdptMC {2} refP10MC {-2}", "MCK0s10Gap22b", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiLambdaPdptMC {2} refN10MC {-2}", "MCLambda10Gap22a", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiLambdaNdptMC {2} refP10MC {-2}", "MCLambda10Gap22b", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refP10MC {2} refN10MC {-2}", "MCRef10Gap22a", kFALSE)); // 25 fGFW->CreateRegions(); // finalize the initialization // used for event selection @@ -379,10 +417,6 @@ struct FlowGfwOmegaXi { fMultPVCutLow->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); fMultPVCutHigh = new TF1("fMultPVCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x + 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); fMultPVCutHigh->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); - fMultCutLow = new TF1("fMultCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x - 2.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); - fMultCutLow->SetParameters(1654.46, -47.2379, 0.449833, -0.0014125, 150.773, -3.67334, 0.0530503, -0.000614061, 3.15956e-06); - fMultCutHigh = new TF1("fMultCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x + 3.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); - fMultCutHigh->SetParameters(1654.46, -47.2379, 0.449833, -0.0014125, 150.773, -3.67334, 0.0530503, -0.000614061, 3.15956e-06); fT0AV0AMean = new TF1("fT0AV0AMean", "[0]+[1]*x", 0, 200000); fT0AV0AMean->SetParameters(-1601.0581, 9.417652e-01); fT0AV0ASigma = new TF1("fT0AV0ASigma", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 200000); @@ -451,6 +485,34 @@ struct FlowGfwOmegaXi { return; } + template + void fillProfilepTMC(const GFW::CorrConfig& corrconf, const ConstStr& tarName, const int& ptbin, const int& PDGCode, const double& cent) + { + TAxis* fpt = nullptr; + if (PDGCode == kXiMinus) { + fpt = fXiPtAxis; + } else if (PDGCode == kOmegaMinus) { + fpt = fXiPtAxis; + } else if (PDGCode == kK0Short) { + fpt = fV0PtAxis; + } else if (PDGCode == kLambda0) { + fpt = fV0PtAxis; + } else { + LOGF(error, "Error, please put in correct PDGCode of K0s, Lambda, Xi or Omega"); + return; + } + float dnx = 0; + float val = 0; + dnx = fGFW->Calculate(corrconf, ptbin - 1, kTRUE).real(); + if (dnx == 0) + return; + val = fGFW->Calculate(corrconf, ptbin - 1, kFALSE).real() / dnx; + if (std::fabs(val) < 1) { + registry.fill(tarName, fpt->GetBinCenter(ptbin), cent, val, dnx); + } + return; + } + // input HIST("name") template void fillProfilepTMass(const GFW::CorrConfig& corrconf, const ConstStr& tarName, const int& ptbin, const int& PDGCode, const float& cent) @@ -460,22 +522,22 @@ struct FlowGfwOmegaXi { TAxis* fMass = nullptr; TAxis* fpt = nullptr; if (PDGCode == kXiMinus) { - nMassBins = cfgXiMassbins; + nMassBins = cfgmassbins[2]; nptbins = nXiPtBins; fpt = fXiPtAxis; fMass = fXiMass; } else if (PDGCode == kOmegaMinus) { - nMassBins = cfgOmegaMassbins; + nMassBins = cfgmassbins[3]; nptbins = nXiPtBins; fpt = fXiPtAxis; fMass = fOmegaMass; } else if (PDGCode == kK0Short) { - nMassBins = cfgK0sMassbins; + nMassBins = cfgmassbins[0]; nptbins = nV0PtBins; fpt = fV0PtAxis; fMass = fK0sMass; } else if (PDGCode == kLambda0) { - nMassBins = cfgLambdaMassbins; + nMassBins = cfgmassbins[1]; nptbins = nV0PtBins; fpt = fV0PtAxis; fMass = fLambdaMass; @@ -505,22 +567,22 @@ struct FlowGfwOmegaXi { TAxis* fMass = nullptr; TAxis* fpt = nullptr; if (PDGCode == kXiMinus) { - nMassBins = cfgXiMassbins; + nMassBins = cfgmassbins[2]; nptbins = nXiPtBins; fpt = fXiPtAxis; fMass = fXiMass; } else if (PDGCode == kOmegaMinus) { - nMassBins = cfgOmegaMassbins; + nMassBins = cfgmassbins[3]; nptbins = nXiPtBins; fpt = fXiPtAxis; fMass = fOmegaMass; } else if (PDGCode == kK0Short) { - nMassBins = cfgK0sMassbins; + nMassBins = cfgmassbins[0]; nptbins = nV0PtBins; fpt = fV0PtAxis; fMass = fK0sMass; } else if (PDGCode == kLambda0) { - nMassBins = cfgLambdaMassbins; + nMassBins = cfgmassbins[1]; nptbins = nV0PtBins; fpt = fV0PtAxis; fMass = fLambdaMass; @@ -589,11 +651,11 @@ struct FlowGfwOmegaXi { bool setCurrentLocalDensityWeights(float& weight_loc, TrackObject track, double locDensity, int ispecies) { auto cfgLocDenPara = (std::vector>){cfgLocDenParaK0s, cfgLocDenParaLambda, cfgLocDenParaXi, cfgLocDenParaOmega}; - if (track.pt() < 0.9 || track.pt() > 10) { + int ptbin = fXiPtAxis->FindBin(track.pt()); + if (ptbin == 0 || ptbin == (fXiPtAxis->GetNbins() + 1)) { weight_loc = 1.0; return true; } - int ptbin = fXiPtAxis->FindBin(track.pt()); double paraA = cfgLocDenPara[ispecies - 1][2 * ptbin - 2]; double paraB = cfgLocDenPara[ispecies - 1][2 * ptbin - 1]; double density = locDensity * 200 / (2 * cfgDeltaPhiLocDen + 1); @@ -603,7 +665,7 @@ struct FlowGfwOmegaXi { } // event selection template - bool eventSelected(TCollision collision, const int multTrk, const float centrality) + bool eventSelected(TCollision collision, const float centrality) { if (collision.alias_bit(kTVXinTRD)) { // TRD triggered @@ -653,11 +715,7 @@ struct FlowGfwOmegaXi { return false; if (multNTracksPV > fMultPVCutHigh->Eval(centrality)) return false; - if (multTrk < fMultCutLow->Eval(centrality)) - return false; - if (multTrk > fMultCutHigh->Eval(centrality)) - return false; - if (occupancy < cfgCutOccupancyLow || occupancy > cfgCutOccupancyHigh) + if (occupancy > cfgCutOccupancyHigh) return 0; // V0A T0A 5 sigma cut @@ -667,7 +725,7 @@ struct FlowGfwOmegaXi { return true; } - void process(AodCollisions::iterator const& collision, aod::BCsWithTimestamps const&, AodTracks const& tracks, aod::CascDataExt const& Cascades, aod::V0Datas const& V0s, DaughterTracks const&) + void processData(AodCollisions::iterator const& collision, aod::BCsWithTimestamps const&, AodTracks const& tracks, aod::CascDataExt const& Cascades, aod::V0Datas const& V0s, DaughterTracks const&) { int nTot = tracks.size(); int candNumAll[4] = {0, 0, 0, 0}; @@ -681,7 +739,7 @@ struct FlowGfwOmegaXi { const auto cent = collision.centFT0C(); if (!collision.sel8()) return; - if (eventSelected(collision, tracks.size(), cent)) + if (eventSelected(collision, cent)) return; TH1D* hLocalDensity = new TH1D("hphi", "hphi", 400, -constants::math::TwoPI, constants::math::TwoPI); auto bc = collision.bc_as(); @@ -697,10 +755,13 @@ struct FlowGfwOmegaXi { float weff = 1; float wacc = 1; float wloc = 1; + double nch = 0; // fill GFW ref flow for (const auto& track : tracks) { - if (!setCurrentParticleWeights(weff, wacc, track, vtxz, 0)) - continue; + if (cfgDoAccEffCorr) { + if (!setCurrentParticleWeights(weff, wacc, track, vtxz, 0)) + continue; + } registry.fill(HIST("hPhi"), track.phi()); registry.fill(HIST("hPhicorr"), track.phi(), wacc); registry.fill(HIST("hEta"), track.eta()); @@ -709,17 +770,21 @@ struct FlowGfwOmegaXi { int ptbin = fPtAxis->FindBin(track.pt()) - 1; if ((track.pt() > cfgCutPtMin) && (track.pt() < cfgCutPtMax)) { fGFW->Fill(track.eta(), ptbin, track.phi(), wacc * weff, 1); //(eta, ptbin, phi, wacc*weff, bitmask) - hLocalDensity->Fill(track.phi(), wacc * weff); - hLocalDensity->Fill(RecoDecay::constrainAngle(track.phi(), -constants::math::TwoPI), wacc * weff); } if ((track.pt() > cfgCutPtPOIMin) && (track.pt() < cfgCutPtPOIMax)) { fGFW->Fill(track.eta(), ptbin, track.phi(), wacc * weff, 32); + if (cfgDoLocDenCorr) { + hLocalDensity->Fill(track.phi(), wacc * weff); + hLocalDensity->Fill(RecoDecay::constrainAngle(track.phi(), -constants::math::TwoPI), wacc * weff); + nch++; + } } if (cfgOutputNUAWeights) fWeightsREF->fill(track.phi(), track.eta(), vtxz, track.pt(), cent, 0); } - double nch = hLocalDensity->Integral() / 2; - registry.fill(HIST("hCentvsNch"), cent, nch); + if (cfgDoLocDenCorr) { + registry.fill(HIST("hCentvsNch"), cent, nch); + } // fill GFW of V0 flow for (const auto& v0 : V0s) { auto v0posdau = v0.posTrack_as(); @@ -794,14 +859,18 @@ struct FlowGfwOmegaXi { registry.fill(HIST("QAhisto/V0/hqadcapostoPVafter"), v0.dcapostopv()); registry.fill(HIST("QAhisto/V0/hqadcanegtoPVafter"), v0.dcanegtopv()); if (isK0s) { - setCurrentParticleWeights(weff, wacc, v0, vtxz, 1); - int phibin = -999; - phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(v0.phi(), -constants::math::PI)); - if (phibin > -900) { - double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); - setCurrentLocalDensityWeights(wloc, v0, density, 1); + if (cfgDoAccEffCorr) + setCurrentParticleWeights(weff, wacc, v0, vtxz, 1); + if (cfgDoLocDenCorr) { + int phibin = -999; + phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(v0.phi(), -constants::math::PI)); + if (phibin > -900) { + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + setCurrentLocalDensityWeights(wloc, v0, density, 1); + if (cfgOutputLocDenWeights) + registry.fill(HIST("MC/densityMCRecK0s"), v0.pt(), nch, density, v0.mK0Short()); + } } - candNum[0] = candNum[0] + 1; registry.fill(HIST("InvMassK0s"), v0.pt(), v0.mK0Short(), v0.eta(), cent); registry.fill(HIST("hEtaPhiVtxzPOIK0s"), v0.phi(), v0.eta(), vtxz, wacc); @@ -810,14 +879,18 @@ struct FlowGfwOmegaXi { fWeightsK0s->fill(v0.phi(), v0.eta(), vtxz, v0.pt(), cent, 0); } if (isLambda) { - setCurrentParticleWeights(weff, wacc, v0, vtxz, 2); - int phibin = -999; - phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(v0.phi(), -constants::math::PI)); - if (phibin > -900) { - double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); - setCurrentLocalDensityWeights(wloc, v0, density, 2); + if (cfgDoAccEffCorr) + setCurrentParticleWeights(weff, wacc, v0, vtxz, 2); + if (cfgDoLocDenCorr) { + int phibin = -999; + phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(v0.phi(), -constants::math::PI)); + if (phibin > -900) { + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + setCurrentLocalDensityWeights(wloc, v0, density, 2); + if (cfgOutputLocDenWeights) + registry.fill(HIST("MC/densityMCRecLambda"), v0.pt(), nch, density, v0.mLambda()); + } } - candNum[1] = candNum[1] + 1; registry.fill(HIST("InvMassLambda"), v0.pt(), v0.mLambda(), v0.eta(), cent); registry.fill(HIST("hEtaPhiVtxzPOILambda"), v0.phi(), v0.eta(), vtxz, wacc); @@ -844,7 +917,7 @@ struct FlowGfwOmegaXi { registry.fill(HIST("InvMassOmega_all"), casc.pt(), casc.mOmega(), casc.eta(), cent); isOmega = true; candNumAll[3] = candNumAll[3] + 1; - } else if (casc.sign() < 0 && (casc.mOmega() > 1.63) && (casc.mOmega() < 1.71) && std::fabs(casc.yOmega()) < cfgCasc_rapidity && + } else if (casc.sign() > 0 && (casc.mOmega() > 1.63) && (casc.mOmega() < 1.71) && std::fabs(casc.yOmega()) < cfgCasc_rapidity && (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0])) && (!cfgcheckDauTOF || ((std::fabs(bachelor.tofNSigmaKa()) < cfgNSigma[5] || bachelor.pt() < 0.4) && (std::fabs(negdau.tofNSigmaPr()) < cfgNSigma[4] || negdau.pt() < 0.4) && (std::fabs(posdau.tofNSigmaPi()) < cfgNSigma[3] || posdau.pt() < 0.4)))) { registry.fill(HIST("InvMassOmega_all"), casc.pt(), casc.mOmega(), casc.eta(), cent); @@ -858,7 +931,7 @@ struct FlowGfwOmegaXi { registry.fill(HIST("InvMassXi_all"), casc.pt(), casc.mXi(), casc.eta(), cent); isXi = true; candNumAll[2] = candNumAll[2] + 1; - } else if (casc.sign() < 0 && (casc.mXi() > 1.30) && (casc.mXi() < 1.37) && std::fabs(casc.yXi()) < cfgCasc_rapidity && + } else if (casc.sign() > 0 && (casc.mXi() > 1.30) && (casc.mXi() < 1.37) && std::fabs(casc.yXi()) < cfgCasc_rapidity && (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0])) && (!cfgcheckDauTOF || ((std::fabs(bachelor.tofNSigmaPi()) < cfgNSigma[3] || bachelor.pt() < 0.4) && (std::fabs(negdau.tofNSigmaPr()) < cfgNSigma[4] || negdau.pt() < 0.4) && (std::fabs(posdau.tofNSigmaPi()) < cfgNSigma[3] || posdau.pt() < 0.4)))) { registry.fill(HIST("InvMassXi_all"), casc.pt(), casc.mXi(), casc.eta(), cent); @@ -872,6 +945,7 @@ struct FlowGfwOmegaXi { registry.fill(HIST("QAhisto/Casc/hqadcaCascBachtoPVbefore"), casc.dcabachtopv()); registry.fill(HIST("QAhisto/Casc/hqadcaCascdaubefore"), casc.dcacascdaughters()); registry.fill(HIST("QAhisto/Casc/hqadcaCascV0daubefore"), casc.dcaV0daughters()); + if (!isXi && !isOmega) continue; // topological cut @@ -911,15 +985,20 @@ struct FlowGfwOmegaXi { registry.fill(HIST("QAhisto/Casc/hqadcaCascBachtoPVafter"), casc.dcabachtopv()); registry.fill(HIST("QAhisto/Casc/hqadcaCascdauafter"), casc.dcacascdaughters()); registry.fill(HIST("QAhisto/Casc/hqadcaCascV0dauafter"), casc.dcaV0daughters()); + if (isOmega) { - setCurrentParticleWeights(weff, wacc, casc, vtxz, 4); - int phibin = -999; - phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(casc.phi(), -constants::math::PI)); - if (phibin > -900) { - double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); - setCurrentLocalDensityWeights(wloc, casc, density, 4); + if (cfgDoAccEffCorr) + setCurrentParticleWeights(weff, wacc, casc, vtxz, 4); + if (cfgDoLocDenCorr) { + int phibin = -999; + phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(casc.phi(), -constants::math::PI)); + if (phibin > -900) { + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + setCurrentLocalDensityWeights(wloc, casc, density, 4); + if (cfgOutputLocDenWeights) + registry.fill(HIST("MC/densityMCRecOmega"), casc.pt(), nch, density, casc.mOmega()); + } } - candNum[3] = candNum[3] + 1; registry.fill(HIST("hEtaPhiVtxzPOIOmega"), casc.phi(), casc.eta(), vtxz, wacc); registry.fill(HIST("InvMassOmega"), casc.pt(), casc.mOmega(), casc.eta(), cent); @@ -928,14 +1007,18 @@ struct FlowGfwOmegaXi { fWeightsOmega->fill(casc.phi(), casc.eta(), vtxz, casc.pt(), cent, 0); } if (isXi) { - setCurrentParticleWeights(weff, wacc, casc, vtxz, 3); - int phibin = -999; - phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(casc.phi(), -constants::math::PI)); - if (phibin > -900) { - double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); - setCurrentLocalDensityWeights(wloc, casc, density, 3); + if (cfgDoAccEffCorr) + setCurrentParticleWeights(weff, wacc, casc, vtxz, 3); + if (cfgDoLocDenCorr) { + int phibin = -999; + phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(casc.phi(), -constants::math::PI)); + if (phibin > -900) { + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + setCurrentLocalDensityWeights(wloc, casc, density, 3); + if (cfgOutputLocDenWeights) + registry.fill(HIST("MC/densityMCRecXi"), casc.pt(), nch, density, casc.mXi()); + } } - candNum[2] = candNum[2] + 1; registry.fill(HIST("hEtaPhiVtxzPOIXi"), casc.phi(), casc.eta(), vtxz, wacc); registry.fill(HIST("InvMassXi"), casc.pt(), casc.mXi(), casc.eta(), cent); @@ -956,10 +1039,6 @@ struct FlowGfwOmegaXi { // Filling cumulant with ROOT TProfile and loop for all ptBins fillProfile(corrconfigs.at(15), HIST("c22"), cent); fillProfile(corrconfigs.at(16), HIST("c24"), cent); - fillProfile(corrconfigs.at(17), HIST("K0sc22"), cent); - fillProfile(corrconfigs.at(18), HIST("K0sc22"), cent); - fillProfile(corrconfigs.at(19), HIST("Lambdac22"), cent); - fillProfile(corrconfigs.at(20), HIST("Lambdac22"), cent); for (int i = 1; i <= nPtBins; i++) { fillProfilepT(corrconfigs.at(0), HIST("c22dpt"), i, cent); fillProfilepT(corrconfigs.at(1), HIST("c22dpt"), i, cent); @@ -982,31 +1061,143 @@ struct FlowGfwOmegaXi { fillProfilepTMass(corrconfigs.at(8), HIST("Omegac24dpt"), i, kOmegaMinus, cent); } // Fill subevents flow - TRandom3* fRdm = new TRandom3(0); - double eventrdm = 10 * fRdm->Rndm(); - for (int j = 1; j <= 10; j++) { - if (eventrdm > (j - 1) && eventrdm < j) - continue; - fillProfile(corrconfigs.at(15), refc22[j - 1], cent); - fillProfile(corrconfigs.at(16), refc24[j - 1], cent); - for (int i = 1; i <= nV0PtBins; i++) { - fillProfilepTMass(corrconfigs.at(9), k0sc22[j - 1], i, kK0Short, cent); - fillProfilepTMass(corrconfigs.at(10), k0sc22[j - 1], i, kK0Short, cent); - fillProfilepTMass(corrconfigs.at(11), k0sc24[j - 1], i, kK0Short, cent); - fillProfilepTMass(corrconfigs.at(12), lambdac22[j - 1], i, kLambda0, cent); - fillProfilepTMass(corrconfigs.at(13), lambdac22[j - 1], i, kLambda0, cent); - fillProfilepTMass(corrconfigs.at(14), lambdac24[j - 1], i, kLambda0, cent); + if (cfgDoJackknife) { + TRandom3* fRdm = new TRandom3(0); + double eventrdm = 10 * fRdm->Rndm(); + for (int j = 1; j <= 10; j++) { + if (eventrdm > (j - 1) && eventrdm < j) + continue; + fillProfile(corrconfigs.at(15), refc22[j - 1], cent); + fillProfile(corrconfigs.at(16), refc24[j - 1], cent); + for (int i = 1; i <= nV0PtBins; i++) { + fillProfilepTMass(corrconfigs.at(9), k0sc22[j - 1], i, kK0Short, cent); + fillProfilepTMass(corrconfigs.at(10), k0sc22[j - 1], i, kK0Short, cent); + fillProfilepTMass(corrconfigs.at(11), k0sc24[j - 1], i, kK0Short, cent); + fillProfilepTMass(corrconfigs.at(12), lambdac22[j - 1], i, kLambda0, cent); + fillProfilepTMass(corrconfigs.at(13), lambdac22[j - 1], i, kLambda0, cent); + fillProfilepTMass(corrconfigs.at(14), lambdac24[j - 1], i, kLambda0, cent); + } + for (int i = 1; i <= nXiPtBins; i++) { + fillProfilepTMass(corrconfigs.at(3), xic22[j - 1], i, kXiMinus, cent); + fillProfilepTMass(corrconfigs.at(4), xic22[j - 1], i, kXiMinus, cent); + fillProfilepTMass(corrconfigs.at(5), xic24[j - 1], i, kXiMinus, cent); + fillProfilepTMass(corrconfigs.at(6), omegac22[j - 1], i, kOmegaMinus, cent); + fillProfilepTMass(corrconfigs.at(7), omegac22[j - 1], i, kOmegaMinus, cent); + fillProfilepTMass(corrconfigs.at(8), omegac24[j - 1], i, kOmegaMinus, cent); + } + } + } + } + PROCESS_SWITCH(FlowGfwOmegaXi, processData, "", true); + + void processMC(aod::McCollisions::iterator const&, soa::Join const& tracksGen, soa::SmallGroups> const& collisionsRec, AodTracks const&) + { + fGFW->Clear(); + int nch = 0; + double cent = -1; + TH1D* hLocalDensity = new TH1D("hphi", "hphi", 400, -constants::math::TwoPI, constants::math::TwoPI); + for (const auto& collision : collisionsRec) { + if (!collision.sel8()) + return; + if (eventSelected(collision, cent)) + return; + cent = collision.centFT0C(); + } + if (cent < 0) + return; + + for (auto const& mcParticle : tracksGen) { + if (!mcParticle.isPhysicalPrimary()) + continue; + + if (mcParticle.has_tracks()) { + auto const& tracks = mcParticle.tracks_as(); + for (const auto& track : tracks) { + if (track.pt() < cfgCutPtPOIMin || track.pt() > cfgCutPtPOIMax) + continue; + if (std::fabs(track.eta()) > 0.8) + continue; + if (!(track.hasTPC() && track.hasITS())) + continue; + if (track.tpcChi2NCl() > cfgCutChi2prTPCcls) + continue; + int ptbin = fPtAxis->FindBin(track.pt()) - 1; + if ((track.pt() > cfgCutPtMin) && (track.pt() < cfgCutPtMax)) { + fGFW->Fill(track.eta(), ptbin, track.phi(), 1, 64); //(eta, ptbin, phi, wacc*weff, bitmask) + } + if ((track.pt() > cfgCutPtPOIMin) && (track.pt() < cfgCutPtPOIMax)) { + hLocalDensity->Fill(track.phi(), 1); + hLocalDensity->Fill(RecoDecay::constrainAngle(track.phi(), -constants::math::TwoPI), 1); + nch++; + } + } + } + } + registry.fill(HIST("MC/hCentvsNchMC"), cent, nch); + + for (const auto& cascGen : tracksGen) { + if (!cascGen.isPhysicalPrimary()) + continue; + int pdgCode = std::abs(cascGen.pdgCode()); + if (pdgCode != PDG_t::kXiMinus && pdgCode != PDG_t::kOmegaMinus) + continue; + if (std::fabs(cascGen.eta()) > 0.8) + continue; + if (pdgCode == PDG_t::kXiMinus) { + int phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(cascGen.phi(), -constants::math::PI)); + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + if (cfgOutputLocDenWeights) + registry.fill(HIST("MC/densityMCGenXi"), cascGen.pt(), nch, density); + fGFW->Fill(cascGen.eta(), fXiPtAxis->FindBin(cascGen.pt()) - 1, cascGen.phi(), 1, 128); + } + if (pdgCode == PDG_t::kOmegaMinus) { + int phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(cascGen.phi(), -constants::math::PI)); + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + if (cfgOutputLocDenWeights) + registry.fill(HIST("MC/densityMCGenOmega"), cascGen.pt(), nch, density); + fGFW->Fill(cascGen.eta(), fXiPtAxis->FindBin(cascGen.pt()) - 1, cascGen.phi(), 1, 256); + } + } + for (const auto& v0Gen : tracksGen) { + if (!v0Gen.isPhysicalPrimary()) + continue; + int pdgCode = std::abs(v0Gen.pdgCode()); + if (pdgCode != PDG_t::kK0Short && pdgCode != PDG_t::kLambda0) + continue; + if (std::fabs(v0Gen.eta()) > 0.8) + continue; + if (pdgCode == PDG_t::kK0Short) { + int phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(v0Gen.phi(), -constants::math::PI)); + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + if (cfgOutputLocDenWeights) + registry.fill(HIST("MC/densityMCGenK0s"), v0Gen.pt(), nch, density); + fGFW->Fill(v0Gen.eta(), fXiPtAxis->FindBin(v0Gen.pt()) - 1, v0Gen.phi(), 1, 512); } - for (int i = 1; i <= nXiPtBins; i++) { - fillProfilepTMass(corrconfigs.at(3), xic22[j - 1], i, kXiMinus, cent); - fillProfilepTMass(corrconfigs.at(4), xic22[j - 1], i, kXiMinus, cent); - fillProfilepTMass(corrconfigs.at(5), xic24[j - 1], i, kXiMinus, cent); - fillProfilepTMass(corrconfigs.at(6), omegac22[j - 1], i, kOmegaMinus, cent); - fillProfilepTMass(corrconfigs.at(7), omegac22[j - 1], i, kOmegaMinus, cent); - fillProfilepTMass(corrconfigs.at(8), omegac24[j - 1], i, kOmegaMinus, cent); + if (pdgCode == PDG_t::kLambda0) { + int phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(v0Gen.phi(), -constants::math::PI)); + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + if (cfgOutputLocDenWeights) + registry.fill(HIST("MC/densityMCGenLambda"), v0Gen.pt(), nch, density); + fGFW->Fill(v0Gen.eta(), fXiPtAxis->FindBin(v0Gen.pt()) - 1, v0Gen.phi(), 1, 1024); } } + fillProfile(corrconfigs.at(25), HIST("MC/c22MC"), cent); + for (int i = 1; i <= nV0PtBins; i++) { + fillProfilepTMC(corrconfigs.at(21), HIST("MC/K0sc22dptMC"), i, kK0Short, cent); + fillProfilepTMC(corrconfigs.at(22), HIST("MC/K0sc22dptMC"), i, kK0Short, cent); + fillProfilepTMC(corrconfigs.at(23), HIST("MC/Lambdac22dptMC"), i, kLambda0, cent); + fillProfilepTMC(corrconfigs.at(24), HIST("MC/Lambdac22dptMC"), i, kLambda0, cent); + } + for (int i = 1; i <= nXiPtBins; i++) { + fillProfilepTMC(corrconfigs.at(17), HIST("MC/Xic22dptMC"), i, kXiMinus, cent); + fillProfilepTMC(corrconfigs.at(18), HIST("MC/Xic22dptMC"), i, kXiMinus, cent); + fillProfilepTMC(corrconfigs.at(19), HIST("MC/Omegac22dptMC"), i, kOmegaMinus, cent); + fillProfilepTMC(corrconfigs.at(20), HIST("MC/Omegac22dptMC"), i, kOmegaMinus, cent); + } + + delete hLocalDensity; } + PROCESS_SWITCH(FlowGfwOmegaXi, processMC, "", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From f37eaf7be4a55dff3c406a52b2a5fb30dc459213 Mon Sep 17 00:00:00 2001 From: Fabrizio Date: Fri, 4 Apr 2025 09:06:43 +0200 Subject: [PATCH 0918/1650] [PWGHF] Add tagging of partly reconstructed D*->D0(->Kpipi0)pi for spin alignment (#10752) Co-authored-by: ALICE Action Bot --- PWGHF/D2H/Tasks/taskCharmPolarisation.cxx | 150 +++++++++++++++--- .../DataModel/CandidateReconstructionTables.h | 2 + PWGHF/TableProducer/candidateCreatorDstar.cxx | 52 ++++++ 3 files changed, 182 insertions(+), 22 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskCharmPolarisation.cxx b/PWGHF/D2H/Tasks/taskCharmPolarisation.cxx index 858582cd082..edd143675ef 100644 --- a/PWGHF/D2H/Tasks/taskCharmPolarisation.cxx +++ b/PWGHF/D2H/Tasks/taskCharmPolarisation.cxx @@ -153,6 +153,7 @@ struct TaskPolarisationCharmHadrons { Configurable activateTHnSparseCosThStarProduction{"activateTHnSparseCosThStarProduction", true, "Activate the THnSparse with cosThStar w.r.t. production axis"}; Configurable activateTHnSparseCosThStarBeam{"activateTHnSparseCosThStarBeam", true, "Activate the THnSparse with cosThStar w.r.t. beam axis"}; Configurable activateTHnSparseCosThStarRandom{"activateTHnSparseCosThStarRandom", true, "Activate the THnSparse with cosThStar w.r.t. random axis"}; + Configurable activatePartRecoDstar{"activatePartRecoDstar", false, "Activate the study of partly reconstructed D*+ -> D0 (-> KPiPi0) Pi decays"}; float minInvMass{0.f}; float maxInvMass{1000.f}; @@ -263,6 +264,10 @@ struct TaskPolarisationCharmHadrons { } } + if (activatePartRecoDstar && !(doprocessDstarMc || doprocessDstarMcWithMl)) { + LOGP(fatal, "Check on partly reconstructed D* mesons only possible for processDstarMc and processDstarMcWithMl"); + } + // check bkg rotation for MC (not supported currently) if (nBkgRotations > 0 && (doprocessDstarMc || doprocessDstarMcWithMl || doprocessLcToPKPiMc || doprocessLcToPKPiMcWithMl || doprocessLcToPKPiBackgroundMcWithMl)) { LOGP(fatal, "No background rotation supported for MC."); @@ -328,18 +333,34 @@ struct TaskPolarisationCharmHadrons { if (activateTHnSparseCosThStarHelicity) { registry.add("hRecoPromptHelicity", "THn for polarisation studies with cosThStar w.r.t. helicity axis and BDT scores -- reco prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarHelicity, thnAxisMlBkg, thnAxisMlNonPrompt, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons}); registry.add("hRecoNonPromptHelicity", "THn for polarisation studies with cosThStar w.r.t. helicity axis and BDT scores -- reco non-prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarHelicity, thnAxisMlBkg, thnAxisMlNonPrompt, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons, thnAxisPtB}); + if (activatePartRecoDstar) { + registry.add("hPartRecoPromptHelicity", "THn for polarisation studies with cosThStar w.r.t. helicity axis and BDT scores -- partially reco prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarHelicity, thnAxisMlBkg, thnAxisMlNonPrompt, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons}); + registry.add("hPartRecoNonPromptHelicity", "THn for polarisation studies with cosThStar w.r.t. helicity axis and BDT scores -- partially reco non-prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarHelicity, thnAxisMlBkg, thnAxisMlNonPrompt, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons, thnAxisPtB}); + } } if (activateTHnSparseCosThStarProduction) { registry.add("hRecoPromptProduction", "THn for polarisation studies with cosThStar w.r.t. production axis and BDT scores -- reco prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarProduction, thnAxisMlBkg, thnAxisMlNonPrompt, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons}); registry.add("hRecoNonPromptProduction", "THn for polarisation studies with cosThStar w.r.t. production axis and BDT scores -- reco non-prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarProduction, thnAxisMlBkg, thnAxisMlNonPrompt, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons, thnAxisPtB}); + if (activatePartRecoDstar) { + registry.add("hPartRecoPromptProduction", "THn for polarisation studies with cosThStar w.r.t. production axis and BDT scores -- partially reco prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarProduction, thnAxisMlBkg, thnAxisMlNonPrompt, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons}); + registry.add("hPartRecoNonPromptProduction", "THn for polarisation studies with cosThStar w.r.t. production axis and BDT scores -- partially reco non-prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarProduction, thnAxisMlBkg, thnAxisMlNonPrompt, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons, thnAxisPtB}); + } } if (activateTHnSparseCosThStarBeam) { registry.add("hRecoPromptBeam", "THn for polarisation studies with cosThStar w.r.t. beam axis and BDT scores -- reco prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarBeam, thnAxisMlBkg, thnAxisMlNonPrompt, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons}); registry.add("hRecoNonPromptBeam", "THn for polarisation studies with cosThStar w.r.t. beam axis and BDT scores -- reco non-prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarBeam, thnAxisMlBkg, thnAxisMlNonPrompt, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons, thnAxisPtB}); + if (activatePartRecoDstar) { + registry.add("hPartRecoPromptBeam", "THn for polarisation studies with cosThStar w.r.t. beam axis and BDT scores -- partially reco prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarBeam, thnAxisMlBkg, thnAxisMlNonPrompt, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons}); + registry.add("hPartRecoNonPromptBeam", "THn for polarisation studies with cosThStar w.r.t. beam axis and BDT scores -- partially reco non-prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarBeam, thnAxisMlBkg, thnAxisMlNonPrompt, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons, thnAxisPtB}); + } } if (activateTHnSparseCosThStarRandom) { registry.add("hRecoPromptRandom", "THn for polarisation studies with cosThStar w.r.t. random axis and BDT scores -- reco prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarRandom, thnAxisMlBkg, thnAxisMlNonPrompt, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons}); registry.add("hRecoNonPromptRandom", "THn for polarisation studies with cosThStar w.r.t. random axis and BDT scores -- reco non-prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarRandom, thnAxisMlBkg, thnAxisMlNonPrompt, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons, thnAxisPtB}); + if (activatePartRecoDstar) { + registry.add("hPartRecoPromptRandom", "THn for polarisation studies with cosThStar w.r.t. random axis and BDT scores -- partially reco prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarRandom, thnAxisMlBkg, thnAxisMlNonPrompt, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons}); + registry.add("hPartRecoNonPromptRandom", "THn for polarisation studies with cosThStar w.r.t. random axis and BDT scores -- partially reco non-prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarRandom, thnAxisMlBkg, thnAxisMlNonPrompt, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons, thnAxisPtB}); + } } } } else if (doprocessLcToPKPiWithMl || doprocessLcToPKPiMcWithMl || doprocessLcToPKPiBackgroundMcWithMl) { @@ -415,18 +436,34 @@ struct TaskPolarisationCharmHadrons { if (activateTHnSparseCosThStarHelicity) { registry.add("hRecoPromptHelicity", "THn for polarisation studies with cosThStar w.r.t. helicity axis -- reco prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarHelicity, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons}); registry.add("hRecoNonPromptHelicity", "THn for polarisation studies with cosThStar w.r.t. helicity axis -- reco non-prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarHelicity, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons, thnAxisPtB}); + if (activatePartRecoDstar) { + registry.add("hPartRecoPromptHelicity", "THn for polarisation studies with cosThStar w.r.t. helicity axis -- partially reco prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarHelicity, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons}); + registry.add("hPartRecoNonPromptHelicity", "THn for polarisation studies with cosThStar w.r.t. helicity axis -- partially reco non-prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarHelicity, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons, thnAxisPtB}); + } } if (activateTHnSparseCosThStarProduction) { registry.add("hRecoPromptProduction", "THn for polarisation studies with cosThStar w.r.t. production axis -- reco prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarProduction, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons}); registry.add("hRecoNonPromptProduction", "THn for polarisation studies with cosThStar w.r.t. production axis -- reco non-prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarProduction, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons, thnAxisPtB}); + if (activatePartRecoDstar) { + registry.add("hPartRecoPromptProduction", "THn for polarisation studies with cosThStar w.r.t. production axis -- partially reco prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarProduction, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons}); + registry.add("hPartRecoNonPromptProduction", "THn for polarisation studies with cosThStar w.r.t. production axis -- partially reco non-prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarProduction, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons, thnAxisPtB}); + } } if (activateTHnSparseCosThStarBeam) { registry.add("hRecoPromptBeam", "THn for polarisation studies with cosThStar w.r.t. beam axis -- reco prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarBeam, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons}); registry.add("hRecoNonPromptBeam", "THn for polarisation studies with cosThStar w.r.t. beam axis -- reco non-prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarBeam, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons, thnAxisPtB}); + if (activatePartRecoDstar) { + registry.add("hPartRecoPromptBeam", "THn for polarisation studies with cosThStar w.r.t. beam axis -- partially reco prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarBeam, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons}); + registry.add("hPartRecoNonPromptBeam", "THn for polarisation studies with cosThStar w.r.t. beam axis -- partially reco non-prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarBeam, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons, thnAxisPtB}); + } } if (activateTHnSparseCosThStarRandom) { registry.add("hRecoPromptRandom", "THn for polarisation studies with cosThStar w.r.t. random axis -- reco prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarRandom, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons}); registry.add("hRecoNonPromptRandom", "THn for polarisation studies with cosThStar w.r.t. random axis -- reco non-prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarRandom, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons, thnAxisPtB}); + if (activatePartRecoDstar) { + registry.add("hPartRecoPromptRandom", "THn for polarisation studies with cosThStar w.r.t. random axis -- partially reco prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarRandom, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons}); + registry.add("hPartRecoNonPromptRandom", "THn for polarisation studies with cosThStar w.r.t. random axis -- partially reco non-prompt signal", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisInvMassD0, thnAxisCosThetaStarRandom, thnAxisAbsEtaTrackMin, thnAxisNumItsClsMin, thnAxisNumTpcClsMin, thnAxisDauToMuons, thnAxisPtB}); + } } } } else if (doprocessLcToPKPi || doprocessLcToPKPiMc) { @@ -538,8 +575,11 @@ struct TaskPolarisationCharmHadrons { /// \param absEtaMin is the minimum absolute eta of the daughter tracks /// \param numItsClsMin is the minimum number of ITS clusters of the daughter tracks /// \param numTpcClsMin is the minimum number of TPC clusters of the daughter tracks + /// \param charge is the charge of the hadron + /// \param nMuons is the number of muons from daughter decays + /// \param isPartRecoDstar is a flag indicating if it is a partly reconstructed Dstar meson (MC only) template - void fillRecoHistos(float invMassCharmHad, float ptCharmHad, int numPvContributors, float rapCharmHad, float invMassD0, float invMassKPiLc, float cosThetaStar, float phiEuler, std::array outputMl, int isRotatedCandidate, int8_t origin, float ptBhadMother, int8_t resoChannelLc, float absEtaMin, int numItsClsMin, int numTpcClsMin, int8_t charge, int8_t nMuons) + void fillRecoHistos(float invMassCharmHad, float ptCharmHad, int numPvContributors, float rapCharmHad, float invMassD0, float invMassKPiLc, float cosThetaStar, float phiEuler, std::array outputMl, int isRotatedCandidate, int8_t origin, float ptBhadMother, int8_t resoChannelLc, float absEtaMin, int numItsClsMin, int numTpcClsMin, int8_t charge, int8_t nMuons, bool isPartRecoDstar) { if constexpr (cosThetaStarType == charm_polarisation::CosThetaStarType::Helicity) { // Helicity if constexpr (!doMc) { // data @@ -566,7 +606,11 @@ struct TaskPolarisationCharmHadrons { if constexpr (withMl) { // with ML if (origin == RecoDecay::OriginType::Prompt) { // prompt if constexpr (channel == charm_polarisation::DecayChannel::DstarToDzeroPi) { // D*+ - registry.fill(HIST("hRecoPromptHelicity"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], absEtaMin, numItsClsMin, numTpcClsMin, nMuons); + if (!isPartRecoDstar) { + registry.fill(HIST("hRecoPromptHelicity"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], absEtaMin, numItsClsMin, numTpcClsMin, nMuons); + } else { + registry.fill(HIST("hPartRecoPromptHelicity"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], absEtaMin, numItsClsMin, numTpcClsMin, nMuons); + } } else if constexpr (channel == charm_polarisation::DecayChannel::LcToPKPi) { // Lc+ registry.fill(HIST("hRecoPromptHelicity"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassKPiLc, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], resoChannelLc, absEtaMin, numItsClsMin, numTpcClsMin, charge); if (activateTHnEulerPhiMonitor) { @@ -575,7 +619,11 @@ struct TaskPolarisationCharmHadrons { } } else { // non-prompt if constexpr (channel == charm_polarisation::DecayChannel::DstarToDzeroPi) { // D*+ - registry.fill(HIST("hRecoNonPromptHelicity"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], absEtaMin, numItsClsMin, numTpcClsMin, nMuons, ptBhadMother); + if (!isPartRecoDstar) { + registry.fill(HIST("hRecoNonPromptHelicity"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], absEtaMin, numItsClsMin, numTpcClsMin, nMuons, ptBhadMother); + } else { + registry.fill(HIST("hPartRecoNonPromptHelicity"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], absEtaMin, numItsClsMin, numTpcClsMin, nMuons, ptBhadMother); + } } else if constexpr (channel == charm_polarisation::DecayChannel::LcToPKPi) { // Lc+ registry.fill(HIST("hRecoNonPromptHelicity"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassKPiLc, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], resoChannelLc, absEtaMin, numItsClsMin, numTpcClsMin, charge); if (activateTHnEulerPhiMonitor) { @@ -586,7 +634,11 @@ struct TaskPolarisationCharmHadrons { } else { // without ML if (origin == RecoDecay::OriginType::Prompt) { // prompt if constexpr (channel == charm_polarisation::DecayChannel::DstarToDzeroPi) { // D*+ - registry.fill(HIST("hRecoPromptHelicity"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, absEtaMin, numItsClsMin, numTpcClsMin, nMuons); + if (!isPartRecoDstar) { + registry.fill(HIST("hRecoPromptHelicity"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, absEtaMin, numItsClsMin, numTpcClsMin, nMuons); + } else { + registry.fill(HIST("hPartRecoPromptHelicity"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, absEtaMin, numItsClsMin, numTpcClsMin, nMuons); + } } else if constexpr (channel == charm_polarisation::DecayChannel::LcToPKPi) { // Lc+ registry.fill(HIST("hRecoPromptHelicity"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassKPiLc, cosThetaStar, resoChannelLc, absEtaMin, numItsClsMin, numTpcClsMin, charge); if (activateTHnEulerPhiMonitor) { @@ -595,7 +647,11 @@ struct TaskPolarisationCharmHadrons { } } else { // non-prompt if constexpr (channel == charm_polarisation::DecayChannel::DstarToDzeroPi) { // D*+ - registry.fill(HIST("hRecoNonPromptHelicity"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, absEtaMin, numItsClsMin, numTpcClsMin, nMuons, ptBhadMother); + if (!isPartRecoDstar) { + registry.fill(HIST("hRecoNonPromptHelicity"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, absEtaMin, numItsClsMin, numTpcClsMin, nMuons, ptBhadMother); + } else { + registry.fill(HIST("hPartRecoNonPromptHelicity"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, absEtaMin, numItsClsMin, numTpcClsMin, nMuons, ptBhadMother); + } } else if constexpr (channel == charm_polarisation::DecayChannel::LcToPKPi) { // Lc+ registry.fill(HIST("hRecoNonPromptHelicity"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassKPiLc, cosThetaStar, resoChannelLc, absEtaMin, numItsClsMin, numTpcClsMin, charge); if (activateTHnEulerPhiMonitor) { @@ -630,7 +686,11 @@ struct TaskPolarisationCharmHadrons { if constexpr (withMl) { // with ML if (origin == RecoDecay::OriginType::Prompt) { // prompt if constexpr (channel == charm_polarisation::DecayChannel::DstarToDzeroPi) { // D*+ - registry.fill(HIST("hRecoPromptProduction"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], absEtaMin, numItsClsMin, numTpcClsMin, nMuons); + if (!isPartRecoDstar) { + registry.fill(HIST("hRecoPromptProduction"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], absEtaMin, numItsClsMin, numTpcClsMin, nMuons); + } else { + registry.fill(HIST("hPartRecoPromptProduction"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], absEtaMin, numItsClsMin, numTpcClsMin, nMuons); + } } else if constexpr (channel == charm_polarisation::DecayChannel::LcToPKPi) { // Lc+ registry.fill(HIST("hRecoPromptProduction"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassKPiLc, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], resoChannelLc, absEtaMin, numItsClsMin, numTpcClsMin, charge); if (activateTHnEulerPhiMonitor) { @@ -639,7 +699,11 @@ struct TaskPolarisationCharmHadrons { } } else { // non-prompt if constexpr (channel == charm_polarisation::DecayChannel::DstarToDzeroPi) { // D*+ - registry.fill(HIST("hRecoNonPromptProduction"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], absEtaMin, numItsClsMin, numTpcClsMin, nMuons, ptBhadMother); + if (!isPartRecoDstar) { + registry.fill(HIST("hRecoNonPromptProduction"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], absEtaMin, numItsClsMin, numTpcClsMin, nMuons, ptBhadMother); + } else { + registry.fill(HIST("hPartRecoNonPromptProduction"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], absEtaMin, numItsClsMin, numTpcClsMin, nMuons, ptBhadMother); + } } else if constexpr (channel == charm_polarisation::DecayChannel::LcToPKPi) { // Lc+ registry.fill(HIST("hRecoNonPromptProduction"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassKPiLc, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], resoChannelLc, absEtaMin, numItsClsMin, numTpcClsMin, charge); if (activateTHnEulerPhiMonitor) { @@ -650,7 +714,11 @@ struct TaskPolarisationCharmHadrons { } else { // without ML if (origin == RecoDecay::OriginType::Prompt) { // prompt if constexpr (channel == charm_polarisation::DecayChannel::DstarToDzeroPi) { // D*+ - registry.fill(HIST("hRecoPromptProduction"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, absEtaMin, numItsClsMin, numTpcClsMin, nMuons); + if (!isPartRecoDstar) { + registry.fill(HIST("hRecoPromptProduction"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, absEtaMin, numItsClsMin, numTpcClsMin, nMuons); + } else { + registry.fill(HIST("hPartRecoPromptProduction"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, absEtaMin, numItsClsMin, numTpcClsMin, nMuons); + } } else if constexpr (channel == charm_polarisation::DecayChannel::LcToPKPi) { // Lc+ registry.fill(HIST("hRecoPromptProduction"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassKPiLc, cosThetaStar, resoChannelLc, absEtaMin, numItsClsMin, numTpcClsMin, charge); if (activateTHnEulerPhiMonitor) { @@ -659,7 +727,11 @@ struct TaskPolarisationCharmHadrons { } } else { // non-prompt if constexpr (channel == charm_polarisation::DecayChannel::DstarToDzeroPi) { // D*+ - registry.fill(HIST("hRecoNonPromptProduction"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, absEtaMin, numItsClsMin, numTpcClsMin, nMuons, ptBhadMother); + if (!isPartRecoDstar) { + registry.fill(HIST("hRecoNonPromptProduction"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, absEtaMin, numItsClsMin, numTpcClsMin, nMuons, ptBhadMother); + } else { + registry.fill(HIST("hPartRecoNonPromptProduction"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, absEtaMin, numItsClsMin, numTpcClsMin, nMuons, ptBhadMother); + } } else if constexpr (channel == charm_polarisation::DecayChannel::LcToPKPi) { // Lc+ registry.fill(HIST("hRecoNonPromptProduction"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassKPiLc, cosThetaStar, resoChannelLc, absEtaMin, numItsClsMin, numTpcClsMin, charge); if (activateTHnEulerPhiMonitor) { @@ -694,7 +766,11 @@ struct TaskPolarisationCharmHadrons { if constexpr (withMl) { // with ML if (origin == RecoDecay::OriginType::Prompt) { // prompt if constexpr (channel == charm_polarisation::DecayChannel::DstarToDzeroPi) { // D*+ - registry.fill(HIST("hRecoPromptBeam"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], absEtaMin, numItsClsMin, numTpcClsMin, nMuons); + if (!isPartRecoDstar) { + registry.fill(HIST("hRecoPromptBeam"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], absEtaMin, numItsClsMin, numTpcClsMin, nMuons); + } else { + registry.fill(HIST("hPartRecoPromptBeam"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], absEtaMin, numItsClsMin, numTpcClsMin, nMuons); + } } else if constexpr (channel == charm_polarisation::DecayChannel::LcToPKPi) { // Lc+ registry.fill(HIST("hRecoPromptBeam"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassKPiLc, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], resoChannelLc, absEtaMin, numItsClsMin, numTpcClsMin, charge); if (activateTHnEulerPhiMonitor) { @@ -703,7 +779,11 @@ struct TaskPolarisationCharmHadrons { } } else { // non-prompt if constexpr (channel == charm_polarisation::DecayChannel::DstarToDzeroPi) { // D*+ - registry.fill(HIST("hRecoNonPromptBeam"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], absEtaMin, numItsClsMin, numTpcClsMin, nMuons, ptBhadMother); + if (!isPartRecoDstar) { + registry.fill(HIST("hRecoNonPromptBeam"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], absEtaMin, numItsClsMin, numTpcClsMin, nMuons, ptBhadMother); + } else { + registry.fill(HIST("hPartRecoNonPromptBeam"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], absEtaMin, numItsClsMin, numTpcClsMin, nMuons, ptBhadMother); + } } else if constexpr (channel == charm_polarisation::DecayChannel::LcToPKPi) { // Lc+ registry.fill(HIST("hRecoNonPromptBeam"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassKPiLc, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], resoChannelLc, absEtaMin, numItsClsMin, numTpcClsMin, charge); if (activateTHnEulerPhiMonitor) { @@ -714,7 +794,11 @@ struct TaskPolarisationCharmHadrons { } else { // without ML if (origin == RecoDecay::OriginType::Prompt) { // prompt if constexpr (channel == charm_polarisation::DecayChannel::DstarToDzeroPi) { // D*+ - registry.fill(HIST("hRecoPromptBeam"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, absEtaMin, numItsClsMin, numTpcClsMin, nMuons); + if (!isPartRecoDstar) { + registry.fill(HIST("hRecoPromptBeam"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, absEtaMin, numItsClsMin, numTpcClsMin, nMuons); + } else { + registry.fill(HIST("hPartRecoPromptBeam"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, absEtaMin, numItsClsMin, numTpcClsMin, nMuons); + } } else if constexpr (channel == charm_polarisation::DecayChannel::LcToPKPi) { // Lc+ registry.fill(HIST("hRecoPromptBeam"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassKPiLc, cosThetaStar, resoChannelLc, absEtaMin, numItsClsMin, numTpcClsMin, charge); if (activateTHnEulerPhiMonitor) { @@ -723,7 +807,11 @@ struct TaskPolarisationCharmHadrons { } } else { // non-prompt if constexpr (channel == charm_polarisation::DecayChannel::DstarToDzeroPi) { // D*+ - registry.fill(HIST("hRecoNonPromptBeam"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, absEtaMin, numItsClsMin, numTpcClsMin, nMuons, ptBhadMother); + if (!isPartRecoDstar) { + registry.fill(HIST("hRecoNonPromptBeam"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, absEtaMin, numItsClsMin, numTpcClsMin, nMuons, ptBhadMother); + } else { + registry.fill(HIST("hPartRecoNonPromptBeam"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, absEtaMin, numItsClsMin, numTpcClsMin, nMuons, ptBhadMother); + } } else if constexpr (channel == charm_polarisation::DecayChannel::LcToPKPi) { // Lc+ registry.fill(HIST("hRecoNonPromptBeam"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassKPiLc, cosThetaStar, resoChannelLc, absEtaMin, numItsClsMin, numTpcClsMin, charge); if (activateTHnEulerPhiMonitor) { @@ -752,13 +840,21 @@ struct TaskPolarisationCharmHadrons { if constexpr (withMl) { // with ML if (origin == RecoDecay::OriginType::Prompt) { // prompt if constexpr (channel == charm_polarisation::DecayChannel::DstarToDzeroPi) { // D*+ - registry.fill(HIST("hRecoPromptRandom"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], absEtaMin, numItsClsMin, numTpcClsMin, nMuons); + if (!isPartRecoDstar) { + registry.fill(HIST("hRecoPromptRandom"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], absEtaMin, numItsClsMin, numTpcClsMin, nMuons); + } else { + registry.fill(HIST("hPartRecoPromptRandom"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], absEtaMin, numItsClsMin, numTpcClsMin, nMuons); + } } else if constexpr (channel == charm_polarisation::DecayChannel::LcToPKPi) { // Lc+ registry.fill(HIST("hRecoPromptRandom"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassKPiLc, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], resoChannelLc, absEtaMin, numItsClsMin, numTpcClsMin, charge); } } else { // non-prompt if constexpr (channel == charm_polarisation::DecayChannel::DstarToDzeroPi) { // D*+ - registry.fill(HIST("hRecoNonPromptRandom"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], absEtaMin, numItsClsMin, numTpcClsMin, nMuons, ptBhadMother); + if (!isPartRecoDstar) { + registry.fill(HIST("hRecoNonPromptRandom"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], absEtaMin, numItsClsMin, numTpcClsMin, nMuons, ptBhadMother); + } else { + registry.fill(HIST("hPartRecoNonPromptRandom"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], absEtaMin, numItsClsMin, numTpcClsMin, nMuons, ptBhadMother); + } } else if constexpr (channel == charm_polarisation::DecayChannel::LcToPKPi) { // Lc+ registry.fill(HIST("hRecoNonPromptRandom"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassKPiLc, cosThetaStar, outputMl[0], /*outputMl[1],*/ outputMl[2], resoChannelLc, absEtaMin, numItsClsMin, numTpcClsMin, charge); } @@ -766,13 +862,21 @@ struct TaskPolarisationCharmHadrons { } else { // without ML if (origin == RecoDecay::OriginType::Prompt) { // prompt if constexpr (channel == charm_polarisation::DecayChannel::DstarToDzeroPi) { // D*+ - registry.fill(HIST("hRecoPromptRandom"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, absEtaMin, numItsClsMin, numTpcClsMin, nMuons); + if (!isPartRecoDstar) { + registry.fill(HIST("hRecoPromptRandom"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, absEtaMin, numItsClsMin, numTpcClsMin, nMuons); + } else { + registry.fill(HIST("hPartRecoPromptRandom"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, absEtaMin, numItsClsMin, numTpcClsMin, nMuons); + } } else if constexpr (channel == charm_polarisation::DecayChannel::LcToPKPi) { // Lc+ registry.fill(HIST("hRecoPromptRandom"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassKPiLc, cosThetaStar, resoChannelLc, absEtaMin, numItsClsMin, numTpcClsMin, charge); } } else { // non-prompt if constexpr (channel == charm_polarisation::DecayChannel::DstarToDzeroPi) { // D*+ - registry.fill(HIST("hRecoNonPromptRandom"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, absEtaMin, numItsClsMin, numTpcClsMin, nMuons, ptBhadMother); + if (!isPartRecoDstar) { + registry.fill(HIST("hRecoNonPromptRandom"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, absEtaMin, numItsClsMin, numTpcClsMin, nMuons, ptBhadMother); + } else { + registry.fill(HIST("hPartRecoNonPromptRandom"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassD0, cosThetaStar, absEtaMin, numItsClsMin, numTpcClsMin, nMuons, ptBhadMother); + } } else if constexpr (channel == charm_polarisation::DecayChannel::LcToPKPi) { // Lc+ registry.fill(HIST("hRecoNonPromptRandom"), invMassCharmHad, ptCharmHad, numPvContributors, rapCharmHad, invMassKPiLc, cosThetaStar, resoChannelLc, absEtaMin, numItsClsMin, numTpcClsMin, charge); } @@ -930,9 +1034,11 @@ struct TaskPolarisationCharmHadrons { float ptBhadMother{-1.f}; int8_t resoChannelLc = -1; int8_t charge = -99; + bool partRecoDstar{false}; if constexpr (doMc) { if constexpr (channel == charm_polarisation::DecayChannel::DstarToDzeroPi) { - if (!TESTBIT(std::abs(candidate.flagMcMatchRec()), aod::hf_cand_dstar::DecayType::DstarToD0Pi)) { // this candidate is not signal, skip + partRecoDstar = TESTBIT(std::abs(candidate.flagMcMatchRec()), aod::hf_cand_dstar::DecayType::DstarToD0PiPi0); + if (!TESTBIT(std::abs(candidate.flagMcMatchRec()), aod::hf_cand_dstar::DecayType::DstarToD0Pi) && (!partRecoDstar || !activatePartRecoDstar)) { // this candidate is not signal and not partially reconstructed signal, skip return isCandidateInSignalRegion; } origin = candidate.originMcRec(); @@ -1234,25 +1340,25 @@ struct TaskPolarisationCharmHadrons { // helicity cosThetaStarHelicity = helicityVec.Dot(threeVecDauCM) / std::sqrt(threeVecDauCM.Mag2()) / std::sqrt(helicityVec.Mag2()); phiHelicity = std::atan2(beamVec.Dot(threeVecDauCM) / std::sqrt(threeVecDauCM.Mag2()), normalVec.Dot(threeVecDauCM) / (std::sqrt(threeVecDauCM.Mag2()) * std::sqrt(normalVec.Mag2()))); - fillRecoHistos(invMassCharmHadForSparse, ptCharmHad, numPvContributors, rapidity, invMassD0, invMassKPiLc, cosThetaStarHelicity, phiHelicity, outputMl, isRotatedCandidate, origin, ptBhadMother, resoChannelLc, absEtaTrackMin, numItsClsMin, numTpcClsMin, charge, nMuons); + fillRecoHistos(invMassCharmHadForSparse, ptCharmHad, numPvContributors, rapidity, invMassD0, invMassKPiLc, cosThetaStarHelicity, phiHelicity, outputMl, isRotatedCandidate, origin, ptBhadMother, resoChannelLc, absEtaTrackMin, numItsClsMin, numTpcClsMin, charge, nMuons, partRecoDstar); } if (activateTHnSparseCosThStarProduction) { // production cosThetaStarProduction = normalVec.Dot(threeVecDauCM) / std::sqrt(threeVecDauCM.Mag2()) / std::sqrt(normalVec.Mag2()); phiProduction = std::atan2(normalVec.Dot(threeVecDauCM) / (std::sqrt(threeVecDauCM.Mag2()) * std::sqrt(normalVec.Mag2())), helicityVec.Dot(threeVecDauCM) / (std::sqrt(threeVecDauCM.Mag2()) * std::sqrt(helicityVec.Mag2()))); - fillRecoHistos(invMassCharmHadForSparse, ptCharmHad, numPvContributors, rapidity, invMassD0, invMassKPiLc, cosThetaStarProduction, phiProduction, outputMl, isRotatedCandidate, origin, ptBhadMother, resoChannelLc, absEtaTrackMin, numItsClsMin, numTpcClsMin, charge, nMuons); + fillRecoHistos(invMassCharmHadForSparse, ptCharmHad, numPvContributors, rapidity, invMassD0, invMassKPiLc, cosThetaStarProduction, phiProduction, outputMl, isRotatedCandidate, origin, ptBhadMother, resoChannelLc, absEtaTrackMin, numItsClsMin, numTpcClsMin, charge, nMuons, partRecoDstar); } if (activateTHnSparseCosThStarBeam) { // beam cosThetaStarBeam = beamVec.Dot(threeVecDauCM) / std::sqrt(threeVecDauCM.Mag2()); phiBeam = std::atan2(helicityVec.Dot(threeVecDauCM) / (std::sqrt(threeVecDauCM.Mag2()) * std::sqrt(helicityVec.Mag2())), beamVec.Dot(threeVecDauCM) / std::sqrt(threeVecDauCM.Mag2())); - fillRecoHistos(invMassCharmHadForSparse, ptCharmHad, numPvContributors, rapidity, invMassD0, invMassKPiLc, cosThetaStarBeam, phiBeam, outputMl, isRotatedCandidate, origin, ptBhadMother, resoChannelLc, absEtaTrackMin, numItsClsMin, numTpcClsMin, charge, nMuons); + fillRecoHistos(invMassCharmHadForSparse, ptCharmHad, numPvContributors, rapidity, invMassD0, invMassKPiLc, cosThetaStarBeam, phiBeam, outputMl, isRotatedCandidate, origin, ptBhadMother, resoChannelLc, absEtaTrackMin, numItsClsMin, numTpcClsMin, charge, nMuons, partRecoDstar); } if (activateTHnSparseCosThStarRandom) { // random ROOT::Math::XYZVector randomVec = ROOT::Math::XYZVector(std::sin(thetaRandom) * std::cos(phiRandom), std::sin(thetaRandom) * std::sin(phiRandom), std::cos(thetaRandom)); cosThetaStarRandom = randomVec.Dot(threeVecDauCM) / std::sqrt(threeVecDauCM.Mag2()); - fillRecoHistos(invMassCharmHadForSparse, ptCharmHad, numPvContributors, rapidity, invMassD0, invMassKPiLc, cosThetaStarRandom, -99.f, outputMl, isRotatedCandidate, origin, ptBhadMother, resoChannelLc, absEtaTrackMin, numItsClsMin, numTpcClsMin, charge, nMuons); + fillRecoHistos(invMassCharmHadForSparse, ptCharmHad, numPvContributors, rapidity, invMassD0, invMassKPiLc, cosThetaStarRandom, -99.f, outputMl, isRotatedCandidate, origin, ptBhadMother, resoChannelLc, absEtaTrackMin, numItsClsMin, numTpcClsMin, charge, nMuons, partRecoDstar); } /// Table for Lc->pKpi background studies diff --git a/PWGHF/DataModel/CandidateReconstructionTables.h b/PWGHF/DataModel/CandidateReconstructionTables.h index 648d15fa16c..13ba118a6b8 100644 --- a/PWGHF/DataModel/CandidateReconstructionTables.h +++ b/PWGHF/DataModel/CandidateReconstructionTables.h @@ -2302,6 +2302,8 @@ DECLARE_SOA_COLUMN(OriginMcGen, originMcGen, int8_t); //! particle origin, gener enum DecayType { DstarToD0Pi = 0, D0ToPiK, + DstarToD0PiPi0, + D0ToPiKPi0, NDstarDecayType }; diff --git a/PWGHF/TableProducer/candidateCreatorDstar.cxx b/PWGHF/TableProducer/candidateCreatorDstar.cxx index 323794bed1b..2dace2da747 100644 --- a/PWGHF/TableProducer/candidateCreatorDstar.cxx +++ b/PWGHF/TableProducer/candidateCreatorDstar.cxx @@ -623,6 +623,58 @@ struct HfCandidateCreatorDstarExpressions { flagD0 = signD0 * (BIT(aod::hf_cand_dstar::DecayType::D0ToPiK)); } + // check partly reconstructed decays, namely D0->Kpipi0 + if (indexRecDstar < 0 && indexRecD0) { + if (matchKinkedDecayTopology && matchInteractionsWithMaterial) { + // D*± → D0(bar) π± + indexRecDstar = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersDstar, Pdg::kDStar, std::array{+kPiPlus, +kPiPlus, -kKPlus}, true, &signDstar, 2, &nKinkedTracksDstar, &nInteractionsWithMaterialDstar); + // D0(bar) → π± K∓ + indexRecD0 = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersofD0, Pdg::kD0, std::array{+kPiPlus, -kKPlus}, true, &signD0, 1, &nKinkedTracksD0, &nInteractionsWithMaterialD0); + } else if (matchKinkedDecayTopology && !matchInteractionsWithMaterial) { + // D*± → D0(bar) π± + indexRecDstar = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersDstar, Pdg::kDStar, std::array{+kPiPlus, +kPiPlus, -kKPlus}, true, &signDstar, 2, &nKinkedTracksDstar); + // D0(bar) → π± K∓ + indexRecD0 = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersofD0, Pdg::kD0, std::array{+kPiPlus, -kKPlus}, true, &signD0, 1, &nKinkedTracksD0); + } else if (!matchKinkedDecayTopology && matchInteractionsWithMaterial) { + // D*± → D0(bar) π± + indexRecDstar = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersDstar, Pdg::kDStar, std::array{+kPiPlus, +kPiPlus, -kKPlus}, true, &signDstar, 2, nullptr, &nInteractionsWithMaterialDstar); + // D0(bar) → π± K∓ + indexRecD0 = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersofD0, Pdg::kD0, std::array{+kPiPlus, -kKPlus}, true, &signD0, 1, nullptr, &nInteractionsWithMaterialD0); + } else { + // D*± → D0(bar) π± + indexRecDstar = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersDstar, Pdg::kDStar, std::array{+kPiPlus, +kPiPlus, -kKPlus}, true, &signDstar, 2); + // D0(bar) → π± K∓ + indexRecD0 = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersofD0, Pdg::kD0, std::array{+kPiPlus, -kKPlus}, true, &signD0); + } + + if (indexRecDstar > -1) { + // D*± → D0(bar) π± π0 + auto motherParticleDstar = mcParticles.rawIteratorAt(indexRecDstar); + if (signDstar > 0) { + if (RecoDecay::isMatchedMCGen(mcParticles, motherParticleDstar, Pdg::kDStar, std::array{+kPiPlus, +kPiPlus, -kKPlus, +kPi0}, false, &signDstar, 2)) { + flagDstar = signDstar * (BIT(aod::hf_cand_dstar::DecayType::DstarToD0PiPi0)); + } + } else { + if (RecoDecay::isMatchedMCGen(mcParticles, motherParticleDstar, -Pdg::kDStar, std::array{-kPiPlus, -kPiPlus, +kKPlus, +kPi0}, false, &signDstar, 2)) { + flagDstar = signDstar * (BIT(aod::hf_cand_dstar::DecayType::DstarToD0PiPi0)); + } + } + } + if (indexRecD0 > -1) { + // D0(bar) → π± K∓ π0 + auto motherParticleD0 = mcParticles.rawIteratorAt(indexRecD0); + if (signD0 > 0) { + if (RecoDecay::isMatchedMCGen(mcParticles, motherParticleD0, Pdg::kD0, std::array{+kPiPlus, -kKPlus, +kPi0}, false, &signD0)) { + flagD0 = signD0 * (BIT(aod::hf_cand_dstar::DecayType::D0ToPiKPi0)); + } + } else { + if (RecoDecay::isMatchedMCGen(mcParticles, motherParticleD0, -Pdg::kD0, std::array{-kPiPlus, +kKPlus, +kPi0}, false, &signD0)) { + flagD0 = signD0 * (BIT(aod::hf_cand_dstar::DecayType::D0ToPiKPi0)); + } + } + } + } + // check wether the particle is non-promt (from a B0 hadron) if (flagDstar != 0) { auto particleDstar = mcParticles.iteratorAt(indexRecDstar); From 124767cd3383439a5490e9f84c8f24f8a28b6e35 Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Fri, 4 Apr 2025 09:11:11 +0200 Subject: [PATCH 0919/1650] [PWGLF] Fix -Wmissing-template-arg-list-after-template-kw (#10756) --- .../TableProducer/Strangeness/cascadebuilder.cxx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/cascadebuilder.cxx b/PWGLF/TableProducer/Strangeness/cascadebuilder.cxx index 19ff443931c..8aeb741bff7 100644 --- a/PWGLF/TableProducer/Strangeness/cascadebuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/cascadebuilder.cxx @@ -1618,19 +1618,19 @@ struct cascadeBuilder { } } - template - void buildStrangenessTables(TCascTable const& cascades) + template + void buildStrangenessTables(auto const& cascades) { statisticsRegistry.eventCounter++; for (auto& cascade : cascades) { // de-reference from V0 pool, either specific for cascades or general // use templatizing to avoid code duplication - if constexpr (requires { cascade.template v0(); }) { + if constexpr (requires { cascade.v0(); }) { auto v0index = cascade.template v0_as(); processCascadeCandidate(v0index, cascade); } - if constexpr (requires { cascade.template findableV0(); }) { + if constexpr (requires { cascade.findableV0(); }) { auto v0index = cascade.template findableV0_as(); processCascadeCandidate(v0index, cascade); } @@ -1640,17 +1640,17 @@ struct cascadeBuilder { resetHistos(); } - template - void buildKFStrangenessTables(TCascTable const& cascades) + template + void buildKFStrangenessTables(auto const& cascades) { statisticsRegistry.eventCounter++; for (auto& cascade : cascades) { bool validCascadeCandidateKF = false; - if constexpr (requires { cascade.template v0(); }) { + if constexpr (requires { cascade.v0(); }) { auto v0 = cascade.template v0_as(); validCascadeCandidateKF = buildCascadeCandidateWithKF(cascade, v0); } - if constexpr (requires { cascade.template findableV0(); }) { + if constexpr (requires { cascade.findableV0(); }) { auto v0 = cascade.template findableV0_as(); validCascadeCandidateKF = buildCascadeCandidateWithKF(cascade, v0); } From 10f39a6d2314d966008bb34c51e9b18447a225d6 Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Fri, 4 Apr 2025 10:01:12 +0200 Subject: [PATCH 0920/1650] [PWGEM] Fix -Wmissing-template-arg-list-after-template-kw (#10754) --- PWGEM/Dilepton/Core/Dilepton.h | 10 +++++----- PWGEM/Dilepton/Core/DileptonMC.h | 4 ++-- PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h | 2 +- PWGEM/PhotonMeson/Core/TaggingPi0MC.h | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/PWGEM/Dilepton/Core/Dilepton.h b/PWGEM/Dilepton/Core/Dilepton.h index 4407399826b..fec5a3fcbad 100644 --- a/PWGEM/Dilepton/Core/Dilepton.h +++ b/PWGEM/Dilepton/Core/Dilepton.h @@ -817,11 +817,11 @@ struct Dilepton { } if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { - if (!cut.template IsSelectedPair(t1, t2, d_bz)) { + if (!cut.IsSelectedPair(t1, t2, d_bz)) { return false; } } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { - if (!cut.template IsSelectedPair(t1, t2)) { + if (!cut.IsSelectedPair(t1, t2)) { return false; } } @@ -1329,17 +1329,17 @@ struct Dilepton { } } } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { - if (!cut.template IsSelectedTrack(t1) || !cut.template IsSelectedTrack(t2)) { + if (!cut.IsSelectedTrack(t1) || !cut.IsSelectedTrack(t2)) { return false; } } if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { - if (!cut.template IsSelectedPair(t1, t2, d_bz)) { + if (!cut.IsSelectedPair(t1, t2, d_bz)) { return false; } } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { - if (!cut.template IsSelectedPair(t1, t2)) { + if (!cut.IsSelectedPair(t1, t2)) { return false; } } diff --git a/PWGEM/Dilepton/Core/DileptonMC.h b/PWGEM/Dilepton/Core/DileptonMC.h index 356c0538dfd..90c88d7ab08 100644 --- a/PWGEM/Dilepton/Core/DileptonMC.h +++ b/PWGEM/Dilepton/Core/DileptonMC.h @@ -782,14 +782,14 @@ struct DileptonMC { return false; } } - if (!cut.template IsSelectedPair(t1, t2, d_bz)) { + if (!cut.IsSelectedPair(t1, t2, d_bz)) { return false; } } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { if (!cut.template IsSelectedTrack(t1) || !cut.template IsSelectedTrack(t2)) { return false; } - if (!cut.template IsSelectedPair(t1, t2)) { + if (!cut.IsSelectedPair(t1, t2)) { return false; } } diff --git a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h index c69ec62a51f..87e2f7b04d4 100644 --- a/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h +++ b/PWGEM/PhotonMeson/Core/Pi0EtaToGammaGammaMC.h @@ -563,7 +563,7 @@ struct Pi0EtaToGammaGammaMC { continue; } - if (!cut2.template IsSelectedPair(pos2, ele2, d_bz)) { + if (!cut2.IsSelectedPair(pos2, ele2, d_bz)) { continue; } diff --git a/PWGEM/PhotonMeson/Core/TaggingPi0MC.h b/PWGEM/PhotonMeson/Core/TaggingPi0MC.h index c2c844f4f5e..56c6274a141 100644 --- a/PWGEM/PhotonMeson/Core/TaggingPi0MC.h +++ b/PWGEM/PhotonMeson/Core/TaggingPi0MC.h @@ -511,7 +511,7 @@ struct TaggingPi0MC { continue; } - if (!cut2.template IsSelectedPair(pos2, ele2, d_bz)) { + if (!cut2.IsSelectedPair(pos2, ele2, d_bz)) { continue; } From 32fd7572491dba802e49ab54c6b5a79cc586ed23 Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Fri, 4 Apr 2025 10:41:13 +0200 Subject: [PATCH 0921/1650] [PWGUD] Fix -Wmissing-template-arg-list-after-template-kw (#10755) --- PWGUD/Tasks/upcQuarkoniaCentralBarrel.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PWGUD/Tasks/upcQuarkoniaCentralBarrel.cxx b/PWGUD/Tasks/upcQuarkoniaCentralBarrel.cxx index 342b7d8860e..f195a750fa4 100644 --- a/PWGUD/Tasks/upcQuarkoniaCentralBarrel.cxx +++ b/PWGUD/Tasks/upcQuarkoniaCentralBarrel.cxx @@ -414,9 +414,9 @@ struct upcQuarkoniaCentralBarrel { // __________________________________________ // main analysis if (doMCAssociation) { - if constexpr (requires { proton.template udMcParticle(); }) { // check if MC information is available - auto protonMC = fullTrackMCs.iteratorAt(proton.template udMcParticle().globalIndex()); - auto antiProtonMC = fullTrackMCs.iteratorAt(antiProton.template udMcParticle().globalIndex()); + if constexpr (requires { proton.udMcParticle(); }) { // check if MC information is available + auto protonMC = fullTrackMCs.iteratorAt(proton.udMcParticle().globalIndex()); + auto antiProtonMC = fullTrackMCs.iteratorAt(antiProton.udMcParticle().globalIndex()); if (!protonMC.has_mothers()) return; From f5167a3cd8c9ae01aa29bc9040b7981cb1a61cc8 Mon Sep 17 00:00:00 2001 From: Zuzanna Chochulska <87480906+zchochul@users.noreply.github.com> Date: Fri, 4 Apr 2025 12:55:26 +0200 Subject: [PATCH 0922/1650] [PWGCF] FemtoUniverse -- Add LF PID for phi daughters (#10759) Co-authored-by: Zuzanna <01150674@pw.edu.pl> --- .../femtoUniverseProducerTask.cxx | 137 +++++------------- 1 file changed, 34 insertions(+), 103 deletions(-) diff --git a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx index 8ea7b735773..426f12ca48f 100644 --- a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx +++ b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx @@ -292,20 +292,17 @@ struct FemtoUniverseProducerTask { Configurable confPhiInvMassLowLimit{"confPhiInvMassLowLimit", 1.011, "Lower limit of the Phi invariant mass"}; Configurable confPhiInvMassUpLimit{"confPhiInvMassUpLimit", 1.027, "Upper limit of the Phi invariant mass"}; // Phi meson daughters - Configurable confLooseTPCNSigma{"confLooseTPCNSigma", false, "Use loose TPC N sigmas for Kaon PID."}; - Configurable confLooseTPCNSigmaValue{"confLooseTPCNSigmaValue", 10, "Value for the loose TPC N Sigma for Kaon PID."}; - Configurable confLooseTOFNSigma{"confLooseTOFNSigma", false, "Use loose TPC N sigmas for Kaon PID."}; - Configurable confTrackPionNsigmaReject{"confTrackPionNsigmaReject", 3.0, "Reject if particle could be a Pion combined nsigma value."}; - Configurable confTrackProtonNsigmaReject{"confTrackProtonNsigmaReject", 3.0, "Reject if particle could be a Proton combined nsigma value."}; - Configurable confLooseTOFNSigmaValue{"confLooseTOFNSigmaValue", 10, "Value for the loose TOF N Sigma for Kaon PID."}; + Configurable confPhiKaonRejectPionNsigma{"confPhiKaonRejectPionNsigma", 3.0, "Reject if particle could be a Pion combined nsigma value."}; + Configurable confPhiKaonRejectProtonNsigma{"confPhiKaonRejectProtonNsigma", 3.0, "Reject if particle could be a Proton combined nsigma value."}; // Kaons - Configurable confTrackKaonNsigmaTPCfrom0_0to0_3{"confTrackKaonNsigmaTPCfrom0_0to0_3", 3.0, "Reject if Kaons in 0.0-0.3 are have TPC n sigma above this value."}; - Configurable confTrackKaonNsigmaTPCfrom0_3to0_45{"confTrackKaonNsigmaTPCfrom0_3to0_45", 2.0, "Reject if Kaons in 0.3-0.45 are have TPC n sigma above this value."}; - Configurable confTrackKaonNsigmaTPCfrom0_45to0_55{"confTrackKaonNsigmaTPCfrom0_45to0_55", 1.0, "Reject if Kaons in 0.45-0.55 are have TPC n sigma above this value."}; - Configurable confTrackKaonNsigmaTPCfrom0_55to1_5{"confTrackKaonNsigmaTPCfrom0_55to1_5", 3.0, "Reject if Kaons in 0.55-1.5 are have TPC n sigma above this value."}; - Configurable confTrackKaonNsigmaTOFfrom0_55to1_5{"confTrackKaonNsigmaTOFfrom0_55to1_5", 3.0, "Reject if Kaons in 0.55-1.5 are have TOF n sigma above this value."}; - Configurable confTrackKaonNsigmaTPCfrom1_5{"confTrackKaonNsigmaTPCfrom1_5", 3.0, "Reject if Kaons above 1.5 are have TPC n sigma above this value."}; - Configurable confTrackKaonNsigmaTOFfrom1_5{"confTrackKaonNsigmaTOFfrom1_5", 3.0, "Reject if Kaons above 1.5 are have TOF n sigma above this value."}; + Configurable confPhiDoLFPID4Kaons{"confPhiDoLFPID4Kaons", true, "Switch on do PID for Kaons as in LF"}; + Configurable confPhiKaonNsigmaTPCfrom0_0to0_3{"confPhiKaonNsigmaTPCfrom0_0to0_3", 3.0, "Reject if Kaons in 0.0-0.3 are have TPC n sigma above this value."}; + Configurable confPhiKaonNsigmaTPCfrom0_3to0_45{"confPhiKaonNsigmaTPCfrom0_3to0_45", 2.0, "Reject if Kaons in 0.3-0.45 are have TPC n sigma above this value."}; + Configurable confPhiKaonNsigmaTPCfrom0_45to0_55{"confPhiKaonNsigmaTPCfrom0_45to0_55", 1.0, "Reject if Kaons in 0.45-0.55 are have TPC n sigma above this value."}; + Configurable confPhiKaonNsigmaTPCfrom0_55to1_5{"confPhiKaonNsigmaTPCfrom0_55to1_5", 3.0, "Reject if Kaons in 0.55-1.5 are have TPC n sigma above this value."}; + Configurable confPhiKaonNsigmaTOFfrom0_55to1_5{"confPhiKaonNsigmaTOFfrom0_55to1_5", 3.0, "Reject if Kaons in 0.55-1.5 are have TOF n sigma above this value."}; + Configurable confPhiKaonNsigmaTPCfrom1_5{"confPhiKaonNsigmaTPCfrom1_5", 3.0, "Reject if Kaons above 1.5 are have TPC n sigma above this value."}; + Configurable confPhiKaonNsigmaTOFfrom1_5{"confPhiKaonNsigmaTOFfrom1_5", 3.0, "Reject if Kaons above 1.5 are have TOF n sigma above this value."}; } ConfPhiSelection; // PDG codes for fillMCParticle function @@ -327,25 +324,25 @@ struct FemtoUniverseProducerTask { { if (mom < 0.3) { // 0.0-0.3 - if (std::abs(nsigmaTPCK) < ConfPhiSelection.confTrackKaonNsigmaTPCfrom0_0to0_3) { + if (std::abs(nsigmaTPCK) < ConfPhiSelection.confPhiKaonNsigmaTPCfrom0_0to0_3) { return true; } else { return false; } } else if (mom < 0.45) { // 0.30 - 0.45 - if (std::abs(nsigmaTPCK) < ConfPhiSelection.confTrackKaonNsigmaTPCfrom0_3to0_45) { + if (std::abs(nsigmaTPCK) < ConfPhiSelection.confPhiKaonNsigmaTPCfrom0_3to0_45) { return true; } else { return false; } } else if (mom < 0.55) { // 0.45-0.55 - if (std::abs(nsigmaTPCK) < ConfPhiSelection.confTrackKaonNsigmaTPCfrom0_45to0_55) { + if (std::abs(nsigmaTPCK) < ConfPhiSelection.confPhiKaonNsigmaTPCfrom0_45to0_55) { return true; } else { return false; } } else if (mom < 1.5) { // 0.55-1.5 (now we use TPC and TOF) - if ((std::abs(nsigmaTOFK) < ConfPhiSelection.confTrackKaonNsigmaTOFfrom0_55to1_5) && (std::abs(nsigmaTPCK) < ConfPhiSelection.confTrackKaonNsigmaTPCfrom0_55to1_5)) { + if ((std::abs(nsigmaTOFK) < ConfPhiSelection.confPhiKaonNsigmaTOFfrom0_55to1_5) && (std::abs(nsigmaTPCK) < ConfPhiSelection.confPhiKaonNsigmaTPCfrom0_55to1_5)) { { return true; } @@ -353,7 +350,7 @@ struct FemtoUniverseProducerTask { return false; } } else if (mom > 1.5) { // 1.5 - - if ((std::abs(nsigmaTOFK) < ConfPhiSelection.confTrackKaonNsigmaTOFfrom1_5) && (std::abs(nsigmaTPCK) < ConfPhiSelection.confTrackKaonNsigmaTPCfrom1_5)) { + if ((std::abs(nsigmaTOFK) < ConfPhiSelection.confPhiKaonNsigmaTOFfrom1_5) && (std::abs(nsigmaTPCK) < ConfPhiSelection.confPhiKaonNsigmaTPCfrom1_5)) { return true; } else { return false; @@ -363,77 +360,23 @@ struct FemtoUniverseProducerTask { } } - bool isKaonNSigmaTPCLoose(float mom, float nsigmaTPCK, float nsigmaTOFK) + bool isKaonNSigmaLF(float mom, float nsigmaTPCK, float nsigmaTOFK, bool hasTOF) { - - if (mom < 0.3) { // 0.0-0.3 - if (std::abs(nsigmaTPCK) < ConfPhiSelection.confLooseTPCNSigmaValue.value) { - return true; - } else { - return false; - } - } else if (mom < 0.45) { // 0.30 - 0.45 - if (std::abs(nsigmaTPCK) < ConfPhiSelection.confLooseTPCNSigmaValue.value) { - return true; - } else { - return false; - } - } else if (mom < 0.55) { // 0.45-0.55 - if (std::abs(nsigmaTPCK) < ConfPhiSelection.confLooseTPCNSigmaValue.value) { - return true; - } else { - return false; - } - } else if (mom < 1.5) { // 0.55-1.5 (now we use TPC and TOF) - if ((std::abs(nsigmaTOFK) < 3.0) && (std::abs(nsigmaTPCK) < ConfPhiSelection.confLooseTPCNSigmaValue.value)) { - return true; - } else { - return false; - } - } else if (mom > 1.5) { // 1.5 - - if ((std::abs(nsigmaTOFK) < 2.0) && (std::abs(nsigmaTPCK) < ConfPhiSelection.confLooseTPCNSigmaValue.value)) { - return true; - } else { - return false; - } - } else { - return false; - } - } - - bool isKaonNSigmaTOFLoose(float mom, float nsigmaTPCK, float nsigmaTOFK) - { - if (mom < 0.3) { // 0.0-0.3 + if (mom < 0.5) { if (std::abs(nsigmaTPCK) < 3.0) { return true; } else { return false; } - } else if (mom < 0.45) { // 0.30 - 0.45 - if (std::abs(nsigmaTPCK) < 2.0) { - return true; - } else { + } else if (mom >= 0.5) { // 0.55-1.5 (now we use TPC and TOF) + if (!hasTOF) { return false; - } - } else if (mom < 0.55) { // 0.45-0.55 - if (std::abs(nsigmaTPCK) < 1.0) { - return true; } else { - return false; - } - } else if (mom < 1.5) { // 0.55-1.5 (now we use TPC and TOF) - if ((std::abs(nsigmaTOFK) < ConfPhiSelection.confLooseTOFNSigmaValue.value) && (std::abs(nsigmaTPCK) < 3.0)) { - { + if (std::sqrt(nsigmaTPCK * nsigmaTPCK + nsigmaTOFK * nsigmaTOFK) < 3.0) { return true; + } else { + return false; } - } else { - return false; - } - } else if (mom > 1.5) { // 1.5 - - if ((std::abs(nsigmaTOFK) < ConfPhiSelection.confLooseTOFNSigmaValue.value) && (std::abs(nsigmaTPCK) < 3.0)) { - return true; - } else { - return false; } } else { return false; @@ -443,16 +386,16 @@ struct FemtoUniverseProducerTask { bool isKaonRejected(float mom, float nsigmaTPCPr, float nsigmaTOFPr, float nsigmaTPCPi, float nsigmaTOFPi) { if (mom < 0.5) { - if (std::abs(nsigmaTPCPi) < ConfPhiSelection.confTrackPionNsigmaReject.value) { + if (std::abs(nsigmaTPCPi) < ConfPhiSelection.confPhiKaonRejectPionNsigma.value) { return true; - } else if (std::abs(nsigmaTPCPr) < ConfPhiSelection.confTrackProtonNsigmaReject.value) { + } else if (std::abs(nsigmaTPCPr) < ConfPhiSelection.confPhiKaonRejectProtonNsigma.value) { return true; } } if (mom > 0.5) { - if (std::hypot(nsigmaTOFPi, nsigmaTPCPi) < ConfPhiSelection.confTrackPionNsigmaReject.value) { + if (std::hypot(nsigmaTOFPi, nsigmaTPCPi) < ConfPhiSelection.confPhiKaonRejectPionNsigma.value) { return true; - } else if (std::hypot(nsigmaTOFPr, nsigmaTPCPr) < ConfPhiSelection.confTrackProtonNsigmaReject.value) { + } else if (std::hypot(nsigmaTOFPr, nsigmaTPCPr) < ConfPhiSelection.confPhiKaonRejectProtonNsigma.value) { return true; } else { return false; @@ -1601,38 +1544,26 @@ struct FemtoUniverseProducerTask { if (!trackCuts.isSelectedMinimal(p1) || !trackCuts.isSelectedMinimal(p1)) { continue; } - // implementing PID cuts for phi children - if (ConfPhiSelection.confLooseTPCNSigma.value) { - if (!(isKaonNSigmaTPCLoose(p1.pt(), trackCuts.getNsigmaTPC(p1, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(p1, o2::track::PID::Kaon)))) { - continue; - } - if (!(isKaonNSigmaTPCLoose(p2.pt(), trackCuts.getNsigmaTPC(p2, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(p2, o2::track::PID::Kaon)))) { - continue; - } + if ((!(p1.sign() == 1)) || (!(p2.sign() == -1))) { + continue; } - if (ConfPhiSelection.confLooseTOFNSigma.value) { - if (!(isKaonNSigmaTOFLoose(p1.pt(), trackCuts.getNsigmaTPC(p1, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(p1, o2::track::PID::Kaon)))) { + // implementing PID cuts for phi children + if (ConfPhiSelection.confPhiDoLFPID4Kaons) { + if (!(isKaonNSigmaLF(p1.pt(), trackCuts.getNsigmaTPC(p1, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(p1, o2::track::PID::Kaon), p1.hasTOF()))) { continue; - } - if (!(isKaonNSigmaTOFLoose(p2.pt(), trackCuts.getNsigmaTPC(p2, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(p2, o2::track::PID::Kaon)))) { + } else if (!(isKaonNSigmaLF(p2.pt(), trackCuts.getNsigmaTPC(p2, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(p2, o2::track::PID::Kaon), p2.hasTOF()))) { continue; } } else { if (!(isKaonNSigma(p1.pt(), trackCuts.getNsigmaTPC(p1, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(p1, o2::track::PID::Kaon)))) { continue; - } - if (!(isKaonNSigma(p2.pt(), trackCuts.getNsigmaTPC(p2, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(p2, o2::track::PID::Kaon)))) { + } else if (!(isKaonNSigma(p2.pt(), trackCuts.getNsigmaTPC(p2, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(p2, o2::track::PID::Kaon)))) { continue; } } if (isKaonRejected(p1.p(), trackCuts.getNsigmaTPC(p1, o2::track::PID::Proton), trackCuts.getNsigmaTOF(p1, o2::track::PID::Proton), trackCuts.getNsigmaTPC(p1, o2::track::PID::Pion), trackCuts.getNsigmaTOF(p1, o2::track::PID::Pion))) { continue; - } - if (isKaonRejected(p2.p(), trackCuts.getNsigmaTPC(p2, o2::track::PID::Proton), trackCuts.getNsigmaTOF(p2, o2::track::PID::Proton), trackCuts.getNsigmaTPC(p2, o2::track::PID::Pion), trackCuts.getNsigmaTOF(p2, o2::track::PID::Pion))) { - continue; - } - - if ((!(p1.sign() == 1)) || (!(p2.sign() == -1))) { + } else if (isKaonRejected(p2.p(), trackCuts.getNsigmaTPC(p2, o2::track::PID::Proton), trackCuts.getNsigmaTOF(p2, o2::track::PID::Proton), trackCuts.getNsigmaTPC(p2, o2::track::PID::Pion), trackCuts.getNsigmaTOF(p2, o2::track::PID::Pion))) { continue; } From 16c0b64c8d635555b8de10408463abac4706a050 Mon Sep 17 00:00:00 2001 From: Ionut Cristian Arsene Date: Fri, 4 Apr 2025 14:44:23 +0200 Subject: [PATCH 0923/1650] =?UTF-8?q?[PWGDQ]=20A=20few=20optimizations=20o?= =?UTF-8?q?f=20the=20electron=20cuts,=20and=20of=20the=20filter-pp=20with?= =?UTF-8?q?=20a=E2=80=A6=20(#10747)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ionut Cristian Arsene Co-authored-by: ALICE Action Bot --- PWGDQ/Core/CutsLibrary.cxx | 16 ++- PWGDQ/Tasks/filterPPwithAssociation.cxx | 137 +++++++----------------- 2 files changed, 48 insertions(+), 105 deletions(-) diff --git a/PWGDQ/Core/CutsLibrary.cxx b/PWGDQ/Core/CutsLibrary.cxx index e7f4c5cfb03..46d4bf9580f 100644 --- a/PWGDQ/Core/CutsLibrary.cxx +++ b/PWGDQ/Core/CutsLibrary.cxx @@ -64,10 +64,9 @@ AnalysisCompositeCut* o2::aod::dqcuts::GetCompositeCut(const char* cutName) qualityCuts->AddCut(VarManager::kTrackDCAz, -0.5, 0.5); AnalysisCut* pidCuts = new AnalysisCut("pidCuts", "pid cuts"); - pidCuts->AddCut(VarManager::kTPCnSigmaEl, -4.0, 4.0, false, VarManager::kPin, 0.0, 5.0); - pidCuts->AddCut(VarManager::kTPCnSigmaEl, -1.5, 4.0, false, VarManager::kPin, 5.0, 10.0); - pidCuts->AddCut(VarManager::kTPCnSigmaEl, -1.0, 4.0, false, VarManager::kPin, 10.0, 1000.0); - pidCuts->AddCut(VarManager::kTPCnSigmaPi, 2.0, 999, false, VarManager::kPin, 0.0, 5.0); + pidCuts->AddCut(VarManager::kTPCnSigmaEl, -3.0, 4.0, false, VarManager::kPin, 0.0, 5.0); + pidCuts->AddCut(VarManager::kTPCnSigmaEl, -1.5, 4.0, false, VarManager::kPin, 5.0, 1000.0); + pidCuts->AddCut(VarManager::kTPCnSigmaPi, 2.5, 999, false, VarManager::kPin, 0.0, 5.0); pidCuts->AddCut(VarManager::kTPCnSigmaPr, 2.5, 999, false, VarManager::kPin, 0.0, 5.0); cut->AddCut(kineCut); @@ -88,8 +87,8 @@ AnalysisCompositeCut* o2::aod::dqcuts::GetCompositeCut(const char* cutName) qualityCuts->AddCut(VarManager::kTrackDCAz, -0.5, 0.5); AnalysisCut* pidCuts = new AnalysisCut("pidCuts", "pid cuts"); - pidCuts->AddCut(VarManager::kTPCnSigmaEl, -4.0, 4.0, false, VarManager::kPin, 0.0, 5.0); - pidCuts->AddCut(VarManager::kTPCnSigmaEl, -1.5, 4.0, false, VarManager::kPin, 5.0, 1000.0); + pidCuts->AddCut(VarManager::kTPCnSigmaEl, -3.0, 4.0, false, VarManager::kPin, 0.0, 5.0); + pidCuts->AddCut(VarManager::kTPCnSigmaEl, -2.0, 4.0, false, VarManager::kPin, 5.0, 1000.0); pidCuts->AddCut(VarManager::kTPCnSigmaPi, 2.0, 999, false, VarManager::kPin, 0.0, 5.0); pidCuts->AddCut(VarManager::kTPCnSigmaPr, 2.5, 999, false, VarManager::kPin, 0.0, 5.0); @@ -111,9 +110,8 @@ AnalysisCompositeCut* o2::aod::dqcuts::GetCompositeCut(const char* cutName) qualityCuts->AddCut(VarManager::kTrackDCAz, -0.5, 0.5); AnalysisCut* pidCuts = new AnalysisCut("pidCuts", "pid cuts"); - pidCuts->AddCut(VarManager::kTPCnSigmaEl, -4.0, 4.0, false, VarManager::kPin, 0.0, 3.5); - pidCuts->AddCut(VarManager::kTPCnSigmaEl, -2.0, 4.0, false, VarManager::kPin, 3.5, 1000.0); - pidCuts->AddCut(VarManager::kTPCnSigmaPi, 2.0, 999, false, VarManager::kPin, 0.0, 3.5); + pidCuts->AddCut(VarManager::kTPCnSigmaEl, -2.5, 4.0, false, VarManager::kPin, 0.0, 5.0); + pidCuts->AddCut(VarManager::kTPCnSigmaEl, -2.0, 4.0, false, VarManager::kPin, 5.0, 1000.0); pidCuts->AddCut(VarManager::kTPCnSigmaPr, 2.5, 999, false, VarManager::kPin, 0.0, 5.0); cut->AddCut(kineCut); diff --git a/PWGDQ/Tasks/filterPPwithAssociation.cxx b/PWGDQ/Tasks/filterPPwithAssociation.cxx index 3d34042a4b2..5b109326567 100644 --- a/PWGDQ/Tasks/filterPPwithAssociation.cxx +++ b/PWGDQ/Tasks/filterPPwithAssociation.cxx @@ -492,67 +492,6 @@ struct DQMuonsSelection { PROCESS_SWITCH(DQMuonsSelection, processDummy, "Dummy function", false); }; -/* -struct DQTrackToCollisionAssociation { - - Produces association; - Produces reverseIndices; - Produces fwdassociation; - Produces fwdreverseIndices; - - // NOTE: the options for the collision associator are common for both the barrel and muon - // We should add separate ones if needed - Configurable nSigmaForTimeCompat{"nSigmaForTimeCompat", 4.f, "number of sigmas for time compatibility"}; - Configurable timeMargin{"timeMargin", 0.f, "time margin in ns added to uncertainty because of uncalibrated TPC"}; - Configurable usePVAssociation{"usePVAssociation", true, "if the track is a PV contributor, use the collision time for it"}; - Configurable includeUnassigned{"includeUnassigned", false, "consider also tracks which are not assigned to any collision"}; - Configurable fillTableOfCollIdsPerTrack{"fillTableOfCollIdsPerTrack", false, "fill additional table with vector of collision ids per track"}; - Configurable bcWindowForOneSigma{"bcWindowForOneSigma", 60, "BC window to be multiplied by the number of sigmas to define maximum window to be considered"}; - - CollisionAssociation collisionAssociatorBarrel; - CollisionAssociation collisionAssociatorMuon; - - Filter filterBarrelTrackSelected = aod::dqppfilter::isDQBarrelSelected > uint32_t(0); - Filter filterMuonTrackSelected = aod::dqppfilter::isDQMuonSelected > uint32_t(0); - - void init(o2::framework::InitContext const&) - { - // set options in track-to-collision association - collisionAssociatorBarrel.setNumSigmaForTimeCompat(nSigmaForTimeCompat); - collisionAssociatorBarrel.setTimeMargin(timeMargin); - collisionAssociatorBarrel.setTrackSelectionOptionForStdAssoc(track_association::TrackSelection::None); - collisionAssociatorBarrel.setUsePvAssociation(usePVAssociation); - collisionAssociatorBarrel.setIncludeUnassigned(includeUnassigned); - collisionAssociatorBarrel.setFillTableOfCollIdsPerTrack(fillTableOfCollIdsPerTrack); - collisionAssociatorBarrel.setBcWindow(bcWindowForOneSigma); - // set options in muon-to-collision association - collisionAssociatorMuon.setNumSigmaForTimeCompat(nSigmaForTimeCompat); - collisionAssociatorMuon.setTimeMargin(timeMargin); - collisionAssociatorMuon.setTrackSelectionOptionForStdAssoc(track_association::TrackSelection::None); - collisionAssociatorMuon.setUsePvAssociation(false); - collisionAssociatorMuon.setIncludeUnassigned(includeUnassigned); - collisionAssociatorMuon.setFillTableOfCollIdsPerTrack(fillTableOfCollIdsPerTrack); - collisionAssociatorMuon.setBcWindow(bcWindowForOneSigma); - } - - void processAssocWithTime(Collisions const& collisions, - MyBarrelTracksSelected const& tracksUnfiltered, soa::Filtered const& tracks, - FwdTracks const& muons, - AmbiguousTracks const& ambiguousTracks, AmbiguousFwdTracks const& ambiguousFwdTracks, BCs const& bcs) - { - collisionAssociatorBarrel.runAssocWithTime(collisions, tracksUnfiltered, tracks, ambiguousTracks, bcs, association, reverseIndices); - collisionAssociatorMuon.runAssocWithTime(collisions, muons, muons, ambiguousFwdTracks, bcs, fwdassociation, fwdreverseIndices); - }; - void processDummy(Collisions&) - { - // do nothing - } - - PROCESS_SWITCH(DQTrackToCollisionAssociation, processAssocWithTime, "Produce track-to-collision associations based on time", false); - PROCESS_SWITCH(DQTrackToCollisionAssociation, processDummy, "Dummy function", false); -}; -*/ - struct DQFilterPPTask { Produces eventFilter; Produces dqtable; @@ -596,6 +535,10 @@ struct DQFilterPPTask { std::map fFiltersMap; // map of filters for events that passed at least one filter std::map> fCEFPfilters; // map of CEFP filters for events that passed at least one filter + uint32_t fPairingLSBarrel; // used to set in which cut setting LS pairs will be analysed + uint32_t fPairingLSMuon; // used to set in which cut setting LS pairs will be analysed + uint32_t fPairingLSBarrelMuon; // used to set in which cut setting LS pairs will be analysed + void DefineCuts() { TString barrelSelsStr = fConfigBarrelSelections.value; @@ -699,6 +642,39 @@ struct DQFilterPPTask { } DefineCuts(); + // check which selection should use like sign (LS) (--/++) barrel track pairs + fPairingLSBarrel = 0; + TString barrelLSstr = fConfigFilterLsBarrelTracksPairs.value; + std::unique_ptr objArrayLS(barrelLSstr.Tokenize(",")); + for (int icut = 0; icut < fNBarrelCuts; icut++) { + TString objStr = objArrayLS->At(icut)->GetName(); + if (!objStr.CompareTo("true")) { + fPairingLSBarrel |= (static_cast(1) << icut); + } + } + + // check which selection should use like sign (LS) (--/++) muon track pairs + fPairingLSMuon = 0; + TString musonLSstr = fConfigFilterLsMuonsPairs.value; + std::unique_ptr objArrayMuonLS(musonLSstr.Tokenize(",")); + for (int icut = 0; icut < fNMuonCuts; icut++) { + TString objStr = objArrayMuonLS->At(icut)->GetName(); + if (!objStr.CompareTo("true")) { + fPairingLSMuon |= (static_cast(1) << icut); + } + } + + // check which selection should use like sign (LS) (--/++) muon-barrel pairs + fPairingLSBarrelMuon = 0; // reset the decisions for electron-muons + TString electronMuonLSstr = fConfigFilterLsElectronMuonsPairs.value; + std::unique_ptr objArrayElectronMuonLS(electronMuonLSstr.Tokenize(",")); + for (int icut = 0; icut < fNElectronMuonCuts; icut++) { + TString objStr = objArrayElectronMuonLS->At(icut)->GetName(); + if (!objStr.CompareTo("true")) { + fPairingLSBarrelMuon |= (static_cast(1) << icut); + } + } + if (fConfigQA) { // initialize the variable manager VarManager::SetDefaultVarNames(); @@ -748,7 +724,6 @@ struct DQFilterPPTask { std::vector objCountersBarrel(fNBarrelCuts, 0); // init all counters to zero uint32_t pairingMask = 0; // in order to know which of the selections actually require pairing - uint32_t pairingLS = 0; // used to set in which cut setting LS pairs will be analysed uint32_t pairFilter = 0; // count the number of barrel tracks fulfilling each cut if constexpr (static_cast(TTrackFillMap)) { @@ -770,16 +745,6 @@ struct DQFilterPPTask { } } - // check which selection should use like sign (LS) (--/++) barrel track pairs - TString barrelLSstr = fConfigFilterLsBarrelTracksPairs.value; - std::unique_ptr objArrayLS(barrelLSstr.Tokenize(",")); - for (int icut = 0; icut < fNBarrelCuts; icut++) { - TString objStr = objArrayLS->At(icut)->GetName(); - if (!objStr.CompareTo("true")) { - pairingLS |= (static_cast(1) << icut); - } - } - // run pairing if there is at least one selection that requires it if (pairingMask > 0) { // run pairing on the collision grouped associations @@ -798,7 +763,7 @@ struct DQFilterPPTask { VarManager::FillPair(t1, t2); // compute pair quantities for (int icut = 0; icut < fNBarrelCuts; icut++) { // select like-sign pairs if trigger has set boolean true within fConfigFilterLsBarrelTracksPairs - if (!(pairingLS & (static_cast(1) << icut))) { + if (!(fPairingLSBarrel & (static_cast(1) << icut))) { if (t1.sign() * t2.sign() > 0) { continue; } @@ -812,6 +777,7 @@ struct DQFilterPPTask { } objCountersBarrel[icut] += 1; // count the pair if (fConfigQA) { // fill histograms if QA is enabled + // cout << "=========== filling pair for collision " << collision.globalIndex() << endl; fHistMan->FillHistClass(fBarrelPairHistNames[icut].Data(), VarManager::fgValues); } } @@ -841,17 +807,6 @@ struct DQFilterPPTask { } } - // check which selection should use like sign (LS) (--/++) muon track pairs - pairingLS = 0; // reset the decisions for muons - TString musonLSstr = fConfigFilterLsMuonsPairs.value; - std::unique_ptr objArrayMuonLS(musonLSstr.Tokenize(",")); - for (int icut = 0; icut < fNMuonCuts; icut++) { - TString objStr = objArrayMuonLS->At(icut)->GetName(); - if (!objStr.CompareTo("true")) { - pairingLS |= (static_cast(1) << icut); - } - } - // run pairing if there is at least one selection that requires it pairFilter = 0; if (pairingMask > 0) { @@ -875,7 +830,7 @@ struct DQFilterPPTask { } for (int icut = 0; icut < fNMuonCuts; icut++) { // select like-sign pairs if trigger has set boolean true within fConfigFilterLsMuonsPairs - if (!(pairingLS & (static_cast(1) << icut))) { + if (!(fPairingLSMuon & (static_cast(1) << icut))) { if (t1.sign() * t2.sign() > 0) { continue; } @@ -908,16 +863,6 @@ struct DQFilterPPTask { } } } - // check which selection should use like sign (LS) (--/++) muon track pairs - pairingLS = 0; // reset the decisions for electron-muons - TString electronMuonLSstr = fConfigFilterLsElectronMuonsPairs.value; - std::unique_ptr objArrayElectronMuonLS(electronMuonLSstr.Tokenize(",")); - for (int icut = 0; icut < fNElectronMuonCuts; icut++) { - TString objStr = objArrayElectronMuonLS->At(icut)->GetName(); - if (!objStr.CompareTo("true")) { - pairingLS |= (static_cast(1) << icut); - } - } // run pairing if there is at least one selection that requires it pairFilter = 0; @@ -936,7 +881,7 @@ struct DQFilterPPTask { VarManager::FillPair(t1, t2); // compute pair quantities for (int icut = 0; icut < fNElectronMuonCuts; icut++) { // select like-sign pairs if trigger has set boolean true within fConfigFilterLsElectronMuonsPairs - if (!(pairingLS & (static_cast(1) << icut))) { + if (!(fPairingLSBarrelMuon & (static_cast(1) << icut))) { if (t1.sign() * t2.sign() > 0) { continue; } From 0318cf9eb3025327c636dabb12df945c45702b44 Mon Sep 17 00:00:00 2001 From: lucamicheletti93 <38209984+lucamicheletti93@users.noreply.github.com> Date: Fri, 4 Apr 2025 16:14:18 +0200 Subject: [PATCH 0924/1650] [PWGDQ] Adding event selection and fix muon propagation (#10764) Co-authored-by: Lucamicheletti93 --- PWGDQ/Core/CutsLibrary.cxx | 4 ++++ PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx | 3 +++ PWGDQ/TableProducer/tableMaker_withAssoc.cxx | 3 +++ 3 files changed, 10 insertions(+) diff --git a/PWGDQ/Core/CutsLibrary.cxx b/PWGDQ/Core/CutsLibrary.cxx index 46d4bf9580f..f9da97e17d7 100644 --- a/PWGDQ/Core/CutsLibrary.cxx +++ b/PWGDQ/Core/CutsLibrary.cxx @@ -3763,6 +3763,10 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) return cut; } + if (!nameStr.compare("eventSel8")) { // kIsSel8 = kIsTriggerTVX && kNoITSROFrameBorder && kNoTimeFrameBorder + cut->AddCut(VarManager::kIsSel8, 0.5, 1.5); + return cut; + } if (!nameStr.compare("eventStandardSel8")) { // kIsSel8 = kIsTriggerTVX && kNoITSROFrameBorder && kNoTimeFrameBorder cut->AddCut(VarManager::kVtxZ, -10.0, 10.0); cut->AddCut(VarManager::kIsSel8, 0.5, 1.5); diff --git a/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx b/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx index 94f4691ba22..aa35c36a0ec 100644 --- a/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx +++ b/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx @@ -1061,6 +1061,9 @@ struct TableMakerMC { if (fGrpMag != nullptr) { o2::base::Propagator::initFieldFromGRP(fGrpMag); } + if (fConfigVariousOptions.fPropMuon) { + VarManager::SetupMuonMagField(); + } } std::map metadataRCT, header; header = fCCDBApi.retrieveHeaders(Form("RCT/Info/RunInformation/%i", bcs.begin().runNumber()), metadataRCT, -1); diff --git a/PWGDQ/TableProducer/tableMaker_withAssoc.cxx b/PWGDQ/TableProducer/tableMaker_withAssoc.cxx index b359b190529..cee0f547440 100644 --- a/PWGDQ/TableProducer/tableMaker_withAssoc.cxx +++ b/PWGDQ/TableProducer/tableMaker_withAssoc.cxx @@ -1286,6 +1286,9 @@ struct TableMaker { if (fGrpMag != nullptr) { o2::base::Propagator::initFieldFromGRP(fGrpMag); } + if (fConfigVariousOptions.fPropMuon) { + VarManager::SetupMuonMagField(); + } } std::map metadataRCT, header; header = fCCDBApi.retrieveHeaders(Form("RCT/Info/RunInformation/%i", bcs.begin().runNumber()), metadataRCT, -1); From 2582c584fad84559ef2b0432be4d087f276c15d8 Mon Sep 17 00:00:00 2001 From: Zuzanna Chochulska <87480906+zchochul@users.noreply.github.com> Date: Fri, 4 Apr 2025 16:56:34 +0200 Subject: [PATCH 0925/1650] [PWGCF] FemtoUniverse: add flags for Phi daughters (#10761) Co-authored-by: Zuzanna <01150674@pw.edu.pl> --- .../TableProducer/femtoUniverseProducerTask.cxx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx index 426f12ca48f..5e2a0a7c27d 100644 --- a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx +++ b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx @@ -1549,9 +1549,13 @@ struct FemtoUniverseProducerTask { } // implementing PID cuts for phi children if (ConfPhiSelection.confPhiDoLFPID4Kaons) { + if ((p1.isGlobalTrackWoDCA() == false) || (p2.isGlobalTrackWoDCA() == false) || (p1.isPVContributor() == false) || (p2.isPVContributor() == false)) { + continue; + } if (!(isKaonNSigmaLF(p1.pt(), trackCuts.getNsigmaTPC(p1, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(p1, o2::track::PID::Kaon), p1.hasTOF()))) { continue; - } else if (!(isKaonNSigmaLF(p2.pt(), trackCuts.getNsigmaTPC(p2, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(p2, o2::track::PID::Kaon), p2.hasTOF()))) { + } + if (!(isKaonNSigmaLF(p2.pt(), trackCuts.getNsigmaTPC(p2, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(p2, o2::track::PID::Kaon), p2.hasTOF()))) { continue; } } else { @@ -1563,7 +1567,8 @@ struct FemtoUniverseProducerTask { } if (isKaonRejected(p1.p(), trackCuts.getNsigmaTPC(p1, o2::track::PID::Proton), trackCuts.getNsigmaTOF(p1, o2::track::PID::Proton), trackCuts.getNsigmaTPC(p1, o2::track::PID::Pion), trackCuts.getNsigmaTOF(p1, o2::track::PID::Pion))) { continue; - } else if (isKaonRejected(p2.p(), trackCuts.getNsigmaTPC(p2, o2::track::PID::Proton), trackCuts.getNsigmaTOF(p2, o2::track::PID::Proton), trackCuts.getNsigmaTPC(p2, o2::track::PID::Pion), trackCuts.getNsigmaTOF(p2, o2::track::PID::Pion))) { + } + if (isKaonRejected(p2.p(), trackCuts.getNsigmaTPC(p2, o2::track::PID::Proton), trackCuts.getNsigmaTOF(p2, o2::track::PID::Proton), trackCuts.getNsigmaTPC(p2, o2::track::PID::Pion), trackCuts.getNsigmaTOF(p2, o2::track::PID::Pion))) { continue; } From 0f756641609401223305e9282f3e6c725a795196 Mon Sep 17 00:00:00 2001 From: Noor Koster <82090643+cnkoster@users.noreply.github.com> Date: Fri, 4 Apr 2025 17:11:57 +0200 Subject: [PATCH 0926/1650] [PWGCF] Add PID in MC process functions (#10749) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/flowSP.cxx | 324 ++++++++++++++++++++++++------------ 1 file changed, 221 insertions(+), 103 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowSP.cxx b/PWGCF/Flow/Tasks/flowSP.cxx index d867e865b0c..a5207c6b95b 100644 --- a/PWGCF/Flow/Tasks/flowSP.cxx +++ b/PWGCF/Flow/Tasks/flowSP.cxx @@ -39,6 +39,7 @@ #include "PWGCF/DataModel/SPTableZDC.h" #include "GFWWeights.h" #include "TF1.h" +#include "TPDGCode.h" using namespace o2; using namespace o2::framework; @@ -56,10 +57,10 @@ struct FlowSP { O2_DEFINE_CONFIGURABLE(cfgFillXandYterms, bool, true, "Flag to make and fill histos for with separate x and y terms for SPM"); O2_DEFINE_CONFIGURABLE(cfgFillChargeDependence, bool, true, "Flag to make and fill histos for charge dependent flow"); // Centrality Estimators -> standard is FT0C - O2_DEFINE_CONFIGURABLE(cfgFT0Cvariant1, bool, false, "Set centrality estimator to cfgFT0Cvariant1"); - O2_DEFINE_CONFIGURABLE(cfgFT0M, bool, false, "Set centrality estimator to cfgFT0M"); - O2_DEFINE_CONFIGURABLE(cfgFV0A, bool, false, "Set centrality estimator to cfgFV0A"); - O2_DEFINE_CONFIGURABLE(cfgNGlobal, bool, false, "Set centrality estimator to cfgNGlobal"); + O2_DEFINE_CONFIGURABLE(cfgCentFT0Cvariant1, bool, false, "Set centrality estimator to cfgCentFT0Cvariant1"); + O2_DEFINE_CONFIGURABLE(cfgCentFT0M, bool, false, "Set centrality estimator to cfgCentFT0M"); + O2_DEFINE_CONFIGURABLE(cfgCentFV0A, bool, false, "Set centrality estimator to cfgCentFV0A"); + O2_DEFINE_CONFIGURABLE(cfgCentNGlobal, bool, false, "Set centrality estimator to cfgCentNGlobal"); // Standard selections O2_DEFINE_CONFIGURABLE(cfgDCAxy, float, 0.2, "Cut on DCA in the transverse direction (cm)"); O2_DEFINE_CONFIGURABLE(cfgDCAz, float, 2, "Cut on DCA in the longitudinal direction (cm)"); @@ -70,14 +71,15 @@ struct FlowSP { O2_DEFINE_CONFIGURABLE(cfgEta, float, 0.8, "eta cut"); O2_DEFINE_CONFIGURABLE(cfgVtxZ, float, 10, "vertex cut (cm)"); O2_DEFINE_CONFIGURABLE(cfgMagField, float, 99999, "Configurable magnetic field;default CCDB will be queried"); + O2_DEFINE_CONFIGURABLE(cfgCentMin, float, 0, "Minimum cenrality for selected events"); O2_DEFINE_CONFIGURABLE(cfgCentMax, float, 90, "Maximum cenrality for selected events"); // NUA and NUE weights O2_DEFINE_CONFIGURABLE(cfgFillWeights, bool, true, "Fill NUA weights"); O2_DEFINE_CONFIGURABLE(cfgFillWeightsPOS, bool, false, "Fill NUA weights only for positive charges"); O2_DEFINE_CONFIGURABLE(cfgFillWeightsNEG, bool, false, "Fill NUA weights only for negative charges"); - O2_DEFINE_CONFIGURABLE(cfgAcceptance, std::string, "", "ccdb dir for NUA corrections"); - O2_DEFINE_CONFIGURABLE(cfgEfficiency, std::string, "", "ccdb dir for NUE corrections"); + O2_DEFINE_CONFIGURABLE(cfgNUA, std::string, "", "ccdb dir for NUA corrections"); + O2_DEFINE_CONFIGURABLE(cfgNUE, std::string, "", "ccdb dir for NUE corrections"); // Additional track Selections O2_DEFINE_CONFIGURABLE(cfgUseAdditionalTrackCut, bool, true, "Bool to enable Additional Track Cut"); O2_DEFINE_CONFIGURABLE(cfgDoubleTrackFunction, bool, true, "Include track cut at low pt"); @@ -105,24 +107,6 @@ struct FlowSP { O2_DEFINE_CONFIGURABLE(cfgLoadSPPlaneRes, bool, false, "Load ZDC spectator plane resolution"); O2_DEFINE_CONFIGURABLE(cfgCCDBdir_SP, std::string, "Users/c/ckoster/ZDC/LHC23_zzh_pass4_small/SPPlaneRes", "ccdb dir for average event plane resolution in 1% centrality bins"); // axis - ConfigurableAxis axisDCAz{"axisDCAz", {200, -.5, .5}, "DCA_{z} (cm)"}; - ConfigurableAxis axisDCAxy{"axisDCAxy", {200, -.5, .5}, "DCA_{xy} (cm)"}; - ConfigurableAxis axisPhiMod = {"axisPhiMod", {100, 0, constants::math::PI / 9}, "fmod(#varphi,#pi/9)"}; - ConfigurableAxis axisPhi = {"axisPhi", {60, 0, constants::math::TwoPI}, "#varphi"}; - ConfigurableAxis axisEta = {"axisEta", {64, -1.8, 1.8}, "#eta"}; - ConfigurableAxis axisEtaVn = {"axisEtaVn", {8, -.8, .8}, "#eta"}; - ConfigurableAxis axisVx = {"axisVx", {40, -0.01, 0.01}, "v_{x}"}; - ConfigurableAxis axisVy = {"axisVy", {40, -0.01, 0.01}, "v_{y}"}; - ConfigurableAxis axisVz = {"axisVz", {40, -10, 10}, "v_{z}"}; - ConfigurableAxis axisCent = {"axisCent", {90, 0, 90}, "Centrality(%)"}; - ConfigurableAxis axisPhiPlane = {"axisPhiPlane", {100, -constants::math::PI, constants::math::PI}, "#Psi"}; - ConfigurableAxis axisNch = {"axisNch", {400, 0, 4000}, "N_{ch}"}; - ConfigurableAxis axisT0c = {"axisT0c", {70, 0, 70000}, "N_{ch} (T0C)"}; - ConfigurableAxis axisT0a = {"axisT0a", {70, 0, 70000}, "N_{ch} (T0A)"}; - ConfigurableAxis axisV0a = {"axisV0a", {70, 0, 70000}, "N_{ch} (V0A)"}; - ConfigurableAxis axisMultpv = {"axisMultpv", {400, 0, 4000}, "N_{ch} (PV)"}; - ConfigurableAxis axisShCl = {"axisShCl", {200, 0, 1}, "Fraction shared cl. TPC"}; - ConfigurableAxis axisCl = {"axisCl", {160, 0, 160}, "Number of cl. TPC"}; Filter collisionFilter = nabs(aod::collision::posZ) < cfgVtxZ; Filter trackFilter = nabs(aod::track::eta) < cfgEta && aod::track::pt > cfgPtmin&& aod::track::pt < cfgPtmax && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && nabs(aod::track::dcaXY) < cfgDCAxy&& nabs(aod::track::dcaZ) < cfgDCAz; @@ -219,7 +203,13 @@ struct FlowSP { kAfter }; + enum ModeType { + kGen, + kReco + }; + static constexpr std::string_view Charge[] = {"incl/", "pos/", "neg/"}; + static constexpr std::string_view Time[] = {"before/", "after"}; void init(InitContext const&) { @@ -231,6 +221,25 @@ struct FlowSP { int64_t now = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); ccdb->setCreatedNotAfter(now); + AxisSpec axisDCAz = {100, -.5, .5, "DCA_{z} (cm)"}; + AxisSpec axisDCAxy = {100, -.5, .5, "DCA_{xy} (cm)"}; + AxisSpec axisPhiMod = {100, 0, constants::math::PI / 9, "fmod(#varphi,#pi/9)"}; + AxisSpec axisPhi = {60, 0, constants::math::TwoPI, "#varphi"}; + AxisSpec axisEta = {64, -1.8, 1.8, "#eta"}; + AxisSpec axisEtaVn = {8, -.8, .8, "#eta"}; + AxisSpec axisVx = {40, -0.01, 0.01, "v_{x}"}; + AxisSpec axisVy = {40, -0.01, 0.01, "v_{y}"}; + AxisSpec axisVz = {40, -10, 10, "v_{z}"}; + AxisSpec axisCent = {90, 0, 90, "Centrality(%)"}; + AxisSpec axisPhiPlane = {100, -constants::math::PI, constants::math::PI, "#Psi"}; + AxisSpec axisNch = {40, 0, 40000, "N_{ch}"}; + AxisSpec axisT0c = {70, 0, 100000, "N_{ch} (T0C)"}; + AxisSpec axisT0a = {70, 0, 200000, "N_{ch} (T0A)"}; + AxisSpec axisV0a = {70, 0, 200000, "N_{ch} (V0A)"}; + AxisSpec axisMultpv = {40, 0, 4000, "N_{ch} (PV)"}; + AxisSpec axisShCl = {100, 0, 1, "Fraction shared cl. TPC"}; + AxisSpec axisCl = {100, 0, 160, "Number of cl. TPC"}; + std::vector ptbinning = {0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.2, 2.4, 2.6, 2.8, 3, 3.5, 4, 5, 6, 8, 10}; AxisSpec axisPt = {ptbinning, "#it{p}_{T} GeV/#it{c}"}; @@ -289,14 +298,18 @@ struct FlowSP { if (doprocessMCReco) { registry.add("trackMCReco/after/hIsPhysicalPrimary", "", {HistType::kTH1D, {{2, 0, 2}}}); - registry.add("trackMCReco/hTrackSize_unFiltered", "", {HistType::kTH1D, {{100, 0, 20000}}}); + registry.add("trackMCReco/hTrackSize_unFiltered", "", {HistType::kTH1D, {{100, 0, 200000}}}); registry.add("trackMCReco/hTrackSize_Filtered", "", {HistType::kTH1D, {{100, 0, 20000}}}); registry.get(HIST("trackMCReco/after/hIsPhysicalPrimary"))->GetXaxis()->SetBinLabel(1, "Secondary"); registry.get(HIST("trackMCReco/after/hIsPhysicalPrimary"))->GetXaxis()->SetBinLabel(2, "Primary"); - registry.add("trackMCReco/after/hPt_inclusive", "", {HistType::kTH1D, {axisPt}}); - registry.add("trackMCReco/after/hPt_positive", "", {HistType::kTH1D, {axisPt}}); - registry.add("trackMCReco/after/hPt_negative", "", {HistType::kTH1D, {axisPt}}); + registry.add("trackMCReco/after/incl/hPt_hadron", "", {HistType::kTH1D, {axisPt}}); + registry.add("trackMCReco/after/incl/hPt_proton", "", {HistType::kTH1D, {axisPt}}); + registry.add("trackMCReco/after/incl/hPt_pion", "", {HistType::kTH1D, {axisPt}}); + registry.add("trackMCReco/after/incl/hPt_kaon", "", {HistType::kTH1D, {axisPt}}); + + registry.addClone("trackMCReco/after/incl/", "trackMCReco/after/pos/"); + registry.addClone("trackMCReco/after/incl/", "trackMCReco/after/neg/"); registry.addClone("trackMCReco/after/", "trackMCReco/before/"); } @@ -406,7 +419,10 @@ struct FlowSP { if (doprocessMCGen) { registry.add("trackMCGen/nCollReconstructedPerMcCollision", "", {HistType::kTH1D, {{10, -5, 5}}}); - registry.add("trackMCGen/before/incl/pt_gen", "", {HistType::kTH1D, {axisPt}}); + registry.add("trackMCGen/before/incl/hPt_hadron", "", {HistType::kTH1D, {axisPt}}); + registry.add("trackMCGen/before/incl/hPt_proton", "", {HistType::kTH1D, {axisPt}}); + registry.add("trackMCGen/before/incl/hPt_pion", "", {HistType::kTH1D, {axisPt}}); + registry.add("trackMCGen/before/incl/hPt_kaon", "", {HistType::kTH1D, {axisPt}}); registry.add("trackMCGen/before/incl/phi_eta_vtxZ_gen", "", {HistType::kTH3D, {axisPhi, axisEta, axisVz}}); registry.addClone("trackMCGen/before/incl/", "trackMCGen/before/pos/"); registry.addClone("trackMCGen/before/incl/", "trackMCGen/before/neg/"); @@ -440,41 +456,112 @@ struct FlowSP { registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_ParticleWeights + 1, "Apply weights"); if (cfgUseAdditionalEventCut) { + + int twoSigma = 2; + int threeSigma = 3; // Fitted for LHC23zzh_pass4 fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); - fMultPVCutLow->SetParameters(2942.55, -103.111, 1.4397, -0.00974862, 2.71433e-05); - if (cfgnSigmaMultCuts == 2) - fMultPVCutLow->SetParameters(2665.68, -93.3784, 1.27137, -0.00818936, 2.115e-05); - if (cfgnSigmaMultCuts == 3) - fMultPVCutLow->SetParameters(2389.99, -83.8483, 1.11062, -0.00672263, 1.54725e-05); + + // Variables from fitting distribution with mean+1sigma + double fitParamLowPV1 = 2942.55; + double fitParamLowPV2 = -103.111; + double fitParamLowPV3 = 1.4397; + double fitParamLowPV4 = -0.00974862; + double fitParamLowPV5 = 2.71433e-05; + + if (cfgnSigmaMultCuts == twoSigma) { + fitParamLowPV1 = 2665.68; + fitParamLowPV2 = -93.3784; + fitParamLowPV3 = 1.27137; + fitParamLowPV4 = -0.00818936; + fitParamLowPV5 = 2.115e-05; + } else if (cfgnSigmaMultCuts == threeSigma) { + fitParamLowPV1 = 2389.99; + fitParamLowPV2 = -83.8483; + fitParamLowPV3 = 1.11062; + fitParamLowPV4 = -0.00672263; + fitParamLowPV5 = 1.54725e-05; + } + + fMultPVCutLow->SetParameters(fitParamLowPV1, fitParamLowPV2, fitParamLowPV3, fitParamLowPV4, fitParamLowPV5); fMultPVCutHigh = new TF1("fMultPVCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); - fMultPVCutHigh->SetParameters(3508.13, -124.831, 1.87871, -0.0145343, 4.80688e-05); - if (cfgnSigmaMultCuts == 2) - fMultPVCutHigh->SetParameters(3787.93, -135.184, 2.07683, -0.0165997, 5.68725e-05); - if (cfgnSigmaMultCuts == 3) - fMultPVCutHigh->SetParameters(4067.4, -145.485, 2.27273, -0.0186308, 6.5501e-05); + + // Variables from fitting distribution with mean+1sigma + double fitParamHighPV1 = 3508.13; + double fitParamHighPV2 = -124.831; + double fitParamHighPV3 = 1.87871; + double fitParamHighPV4 = -0.0145343; + double fitParamHighPV5 = 4.80688e-05; + + if (cfgnSigmaMultCuts == twoSigma) { + fitParamHighPV1 = 3787.93; + fitParamHighPV2 = -135.184; + fitParamHighPV3 = 2.07683; + fitParamHighPV4 = -0.0165997; + fitParamHighPV5 = 5.68725e-05; + } else if (cfgnSigmaMultCuts == threeSigma) { + fitParamHighPV1 = 4067.4; + fitParamHighPV2 = -145.485; + fitParamHighPV3 = 2.27273; + fitParamHighPV4 = -0.0186308; + fitParamHighPV5 = 6.5501e-05; + } + fMultPVCutHigh->SetParameters(fitParamHighPV1, fitParamHighPV2, fitParamHighPV3, fitParamHighPV4, fitParamHighPV5); fMultCutLow = new TF1("fMultCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); - fMultCutLow->SetParameters(1566.5, -48.2114, 0.529522, -0.00235284, 3.01132e-06); - if (cfgnSigmaMultCuts == 2) - fMultCutLow->SetParameters(1307.92, -39.9168, 0.412675, -0.00148081, 1.10868e-07); - if (cfgnSigmaMultCuts == 3) - fMultCutLow->SetParameters(1048.48, -31.4568, 0.287794, -0.00046847, -3.5909e-06); + + double fitParamLow1 = 1566.5; + double fitParamLow2 = -48.2114; + double fitParamLow3 = 0.529522; + double fitParamLow4 = -0.00235284; + double fitParamLow5 = 3.01132e-06; + + if (cfgnSigmaMultCuts == twoSigma) { + fitParamLow1 = 1307.92; + fitParamLow2 = -39.9168; + fitParamLow3 = 0.412675; + fitParamLow4 = -0.00148081; + fitParamLow5 = 1.10868e-07; + } else if (cfgnSigmaMultCuts == threeSigma) { + fitParamLow1 = 1048.48; + fitParamLow2 = -31.4568; + fitParamLow3 = 0.287794; + fitParamLow4 = -0.00046847; + fitParamLow5 = -3.5909e-06; + } + fMultCutLow->SetParameters(fitParamLow1, fitParamLow2, fitParamLow3, fitParamLow4, fitParamLow5); fMultCutHigh = new TF1("fMultCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); - fMultCutHigh->SetParameters(2089.73, -65.9772, 0.816781, -0.00496563, 1.34314e-05); - if (cfgnSigmaMultCuts == 2) - fMultCutHigh->SetParameters(2350.39, -74.6939, 0.953287, -0.006162, 1.80808e-05); - if (cfgnSigmaMultCuts == 3) - fMultCutHigh->SetParameters(2610.98, -83.3983, 1.0893, -0.00735094, 2.26929e-05); - } - if (cfgManualEventParameters) { - fMultPVCutLow->SetParameters((cfgMultPv.value)[0], (cfgMultPv.value)[1], (cfgMultPv.value)[2], (cfgMultPv.value)[3], (cfgMultPv.value)[4]); - fMultPVCutHigh->SetParameters((cfgMultPv.value)[5], (cfgMultPv.value)[6], (cfgMultPv.value)[7], (cfgMultPv.value)[8], (cfgMultPv.value)[9]); - fMultCutLow->SetParameters((cfgMult.value)[0], (cfgMult.value)[1], (cfgMult.value)[2], (cfgMult.value)[3], (cfgMult.value)[4]); - fMultCutHigh->SetParameters((cfgMult.value)[5], (cfgMult.value)[6], (cfgMult.value)[7], (cfgMult.value)[8], (cfgMult.value)[9]); + double fitParamHigh1 = 2089.73; + double fitParamHigh2 = -65.9772; + double fitParamHigh3 = 0.816781; + double fitParamHigh4 = -0.00496563; + double fitParamHigh5 = 1.34314e-05; + + if (cfgnSigmaMultCuts == twoSigma) { + fitParamHigh1 = 2350.39; + fitParamHigh2 = -74.6939; + fitParamHigh3 = 0.953287; + fitParamHigh4 = -0.006162; + fitParamHigh5 = 1.80808e-05; + } else if (cfgnSigmaMultCuts == threeSigma) { + fitParamHigh1 = 2610.98; + fitParamHigh2 = -83.3983; + fitParamHigh3 = 1.0893; + fitParamHigh4 = -0.00735094; + fitParamHigh5 = 2.26929e-05; + } + + fMultCutHigh->SetParameters(fitParamHigh1, fitParamHigh2, fitParamHigh3, fitParamHigh4, fitParamHigh5); + + if (cfgManualEventParameters) { + fMultPVCutLow->SetParameters((cfgMultPv.value)[0], (cfgMultPv.value)[1], (cfgMultPv.value)[2], (cfgMultPv.value)[3], (cfgMultPv.value)[4]); + fMultPVCutHigh->SetParameters((cfgMultPv.value)[5], (cfgMultPv.value)[6], (cfgMultPv.value)[7], (cfgMultPv.value)[8], (cfgMultPv.value)[9]); + fMultCutLow->SetParameters((cfgMult.value)[0], (cfgMult.value)[1], (cfgMult.value)[2], (cfgMult.value)[3], (cfgMult.value)[4]); + fMultCutHigh->SetParameters((cfgMult.value)[5], (cfgMult.value)[6], (cfgMult.value)[7], (cfgMult.value)[8], (cfgMult.value)[9]); + } } if (cfgUseAdditionalTrackCut) { @@ -507,31 +594,33 @@ struct FlowSP { if (cfg.correctionsLoaded) return; - if (cfgAcceptance.value.empty() == false) { - TList* listCorrections = ccdb->getForTimeStamp(cfgAcceptance, timestamp); + int nWeights = 3; + + if (cfgNUA.value.empty() == false) { + TList* listCorrections = ccdb->getForTimeStamp(cfgNUA, timestamp); cfg.mAcceptance.push_back(reinterpret_cast(listCorrections->FindObject("weights"))); cfg.mAcceptance.push_back(reinterpret_cast(listCorrections->FindObject("weights_positive"))); cfg.mAcceptance.push_back(reinterpret_cast(listCorrections->FindObject("weights_negative"))); int sizeAcc = cfg.mAcceptance.size(); - if (sizeAcc < 3) - LOGF(warning, "Could not load acceptance weights from %s", cfgAcceptance.value.c_str()); + if (sizeAcc < nWeights) + LOGF(warning, "Could not load acceptance weights from %s", cfgNUA.value.c_str()); else - LOGF(info, "Loaded acceptance weights from %s", cfgAcceptance.value.c_str()); + LOGF(info, "Loaded acceptance weights from %s", cfgNUA.value.c_str()); } else { - LOGF(info, "cfgAcceptance empty! No corrections loaded"); + LOGF(info, "cfgNUA empty! No corrections loaded"); } - if (cfgEfficiency.value.empty() == false) { - TList* listCorrections = ccdb->getForTimeStamp(cfgEfficiency, timestamp); + if (cfgNUE.value.empty() == false) { + TList* listCorrections = ccdb->getForTimeStamp(cfgNUE, timestamp); cfg.mEfficiency.push_back(reinterpret_cast(listCorrections->FindObject("Efficiency"))); cfg.mEfficiency.push_back(reinterpret_cast(listCorrections->FindObject("Efficiency_pos"))); cfg.mEfficiency.push_back(reinterpret_cast(listCorrections->FindObject("Efficiency_neg"))); int sizeEff = cfg.mEfficiency.size(); - if (sizeEff < 3) { - LOGF(fatal, "Could not load efficiency histogram for trigger particles from %s", cfgEfficiency.value.c_str()); - } - LOGF(info, "Loaded efficiency histogram from %s", cfgEfficiency.value.c_str()); + if (sizeEff < nWeights) + LOGF(fatal, "Could not load efficiency histogram for trigger particles from %s", cfgNUE.value.c_str()); + else + LOGF(info, "Loaded efficiency histogram from %s", cfgNUE.value.c_str()); } else { - LOGF(info, "cfgEfficiency empty! No corrections loaded"); + LOGF(info, "cfgNUE empty! No corrections loaded"); } cfg.correctionsLoaded = true; } @@ -618,13 +707,15 @@ struct FlowSP { if (collision.numContrib() > 1) { vtxz = collision.posZ(); float zRes = std::sqrt(collision.covZZ()); - if (zRes > 0.25 && collision.numContrib() < 20) + float minzRes = 0.25; + int maxNumContrib = 20; + if (zRes > minzRes && collision.numContrib() < maxNumContrib) vtxz = -999; } auto multNTracksPV = collision.multNTracksPV(); - if (vtxz > 10 || vtxz < -10) + if (vtxz > cfgVtxZ || vtxz < -cfgVtxZ) return 0; if (multNTracksPV < fMultPVCutLow->Eval(collision.centFT0C())) return 0; @@ -848,11 +939,49 @@ struct FlowSP { registry.fill(HIST(Charge[ct]) + HIST("QA/hCrossedRows_pt"), track.pt(), track.tpcNClsFound()); } + template + inline void fillMCPtHistos(TrackObject track, int pdgCode) + { + static constexpr std::string_view Time[] = {"before/", "after/"}; + static constexpr std::string_view Mode[] = {"Gen/", "Reco/"}; + + registry.fill(HIST("trackMC") + HIST(Mode[md]) + HIST(Time[ft]) + HIST("incl/hPt_hadron"), track.pt()); + if (pdgCode > 0) { + registry.fill(HIST("trackMC") + HIST(Mode[md]) + HIST(Time[ft]) + HIST("pos/hPt_hadron"), track.pt()); + } else { + registry.fill(HIST("trackMC") + HIST(Mode[md]) + HIST(Time[ft]) + HIST("neg/hPt_hadron"), track.pt()); + } + + if (pdgCode == kPiPlus || pdgCode == kPiMinus) { + registry.fill(HIST("trackMC") + HIST(Mode[md]) + HIST(Time[ft]) + HIST("incl/hPt_pion"), track.pt()); + if (pdgCode == kPiPlus) { + registry.fill(HIST("trackMC") + HIST(Mode[md]) + HIST(Time[ft]) + HIST("pos/hPt_pion"), track.pt()); + } else { + registry.fill(HIST("trackMC") + HIST(Mode[md]) + HIST(Time[ft]) + HIST("neg/hPt_pion"), track.pt()); + } + } else if (pdgCode == kKPlus || pdgCode == kKMinus) { + registry.fill(HIST("trackMC") + HIST(Mode[md]) + HIST(Time[ft]) + HIST("incl/hPt_kaon"), track.pt()); + if (pdgCode == kKPlus) { + registry.fill(HIST("trackMC") + HIST(Mode[md]) + HIST(Time[ft]) + HIST("pos/hPt_kaon"), track.pt()); + } else { + registry.fill(HIST("trackMC") + HIST(Mode[md]) + HIST(Time[ft]) + HIST("neg/hPt_kaon"), track.pt()); + } + } else if (pdgCode == kProton || pdgCode == kProtonBar) { + registry.fill(HIST("trackMC") + HIST(Mode[md]) + HIST(Time[ft]) + HIST("incl/hPt_proton"), track.pt()); + if (pdgCode == kProton) { + registry.fill(HIST("trackMC") + HIST(Mode[md]) + HIST(Time[ft]) + HIST("pos/hPt_proton"), track.pt()); + } else { + registry.fill(HIST("trackMC") + HIST(Mode[md]) + HIST(Time[ft]) + HIST("neg/hPt_proton"), track.pt()); + } + } + } + void processData(UsedCollisions::iterator const& collision, aod::BCsWithTimestamps const&, UsedTracks const& tracks) { registry.fill(HIST("hEventCount"), evSel_FilteredEvent); auto bc = collision.bc_as(); - auto field = (cfgMagField == 99999) ? getMagneticField(bc.timestamp()) : cfgMagField; + int standardMagField = 99999; + auto field = (cfgMagField == standardMagField) ? getMagneticField(bc.timestamp()) : cfgMagField; if (bc.runNumber() != cfg.lastRunNumber) { // load corrections again for new run! @@ -866,13 +995,13 @@ struct FlowSP { float centrality = collision.centFT0C(); - if (cfgFT0Cvariant1) + if (cfgCentFT0Cvariant1) centrality = collision.centFT0CVariant1(); - if (cfgFT0M) + if (cfgCentFT0M) centrality = collision.centFT0M(); - if (cfgFV0A) + if (cfgCentFV0A) centrality = collision.centFV0A(); - if (cfgNGlobal) + if (cfgCentNGlobal) centrality = collision.centNGlobal(); if (!eventSelected(collision, tracks.size(), centrality)) @@ -1023,17 +1152,18 @@ struct FlowSP { void processMCReco(CC const& collision, aod::BCsWithTimestamps const&, TCs const& tracks, FilteredTCs const& filteredTracks, aod::McParticles const&) { auto bc = collision.template bc_as(); - auto field = (cfgMagField == 99999) ? getMagneticField(bc.timestamp()) : cfgMagField; + int standardMagField = 99999; + auto field = (cfgMagField == standardMagField) ? getMagneticField(bc.timestamp()) : cfgMagField; double vtxz = collision.posZ(); float centrality = collision.centFT0C(); - if (cfgFT0Cvariant1) + if (cfgCentFT0Cvariant1) centrality = collision.centFT0CVariant1(); - if (cfgFT0M) + if (cfgCentFT0M) centrality = collision.centFT0M(); - if (cfgFV0A) + if (cfgCentFV0A) centrality = collision.centFV0A(); - if (cfgNGlobal) + if (cfgCentNGlobal) centrality = collision.centNGlobal(); if (cfgFillQAHistos) @@ -1058,14 +1188,9 @@ struct FlowSP { auto mcParticle = track.mcParticle(); if (track.sign() == 0.0) continue; - bool pos = (track.sign() > 0) ? true : false; + registry.fill(HIST("hTrackCount"), trackSel_ZeroCharge); - registry.fill(HIST("trackMCReco/before/hPt_inclusive"), track.pt()); - if (pos) { - registry.fill(HIST("trackMCReco/before/hPt_positive"), track.pt()); - } else { - registry.fill(HIST("trackMCReco/before/hPt_negative"), track.pt()); - } + fillMCPtHistos(track, mcParticle.pdgCode()); if (!mcParticle.isPhysicalPrimary()) { registry.fill(HIST("trackMCReco/before/hIsPhysicalPrimary"), 0); @@ -1077,12 +1202,7 @@ struct FlowSP { if (!trackSelected(track, field)) continue; - registry.fill(HIST("trackMCReco/after/hPt_inclusive"), track.pt()); - if (pos) { - registry.fill(HIST("trackMCReco/after/hPt_positive"), track.pt()); - } else { - registry.fill(HIST("trackMCReco/after/hPt_negative"), track.pt()); - } + fillMCPtHistos(track, mcParticle.pdgCode()); if (cfgFillQAHistos) fillTrackQA(track, vtxz); @@ -1117,13 +1237,13 @@ struct FlowSP { auto filteredTrackSlice = filteredTracks.sliceBy(trackPerCollision, col.globalIndex()); centrality = col.centFT0C(); - if (cfgFT0Cvariant1) + if (cfgCentFT0Cvariant1) centrality = col.centFT0CVariant1(); - if (cfgFT0M) + if (cfgCentFT0M) centrality = col.centFT0M(); - if (cfgFV0A) + if (cfgCentFV0A) centrality = col.centFV0A(); - if (cfgNGlobal) + if (cfgCentNGlobal) centrality = col.centNGlobal(); fillEventQA(col, trackSlice); if (trackSlice.size() < 1) { @@ -1159,28 +1279,26 @@ struct FlowSP { bool pos = (charge > 0) ? true : false; - registry.fill(HIST("trackMCGen/before/incl/pt_gen"), particle.pt()); + fillMCPtHistos(particle, pdgCode); + registry.fill(HIST("trackMCGen/before/incl/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); if (pos) { - registry.fill(HIST("trackMCGen/before/pos/pt_gen"), particle.pt()); registry.fill(HIST("trackMCGen/before/pos/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); } else { - registry.fill(HIST("trackMCGen/before/neg/pt_gen"), particle.pt()); registry.fill(HIST("trackMCGen/before/neg/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); } if (particle.eta() < -cfgEta || particle.eta() > cfgEta || particle.pt() < cfgPtmin || particle.pt() > cfgPtmax) continue; - registry.fill(HIST("trackMCGen/after/incl/pt_gen"), particle.pt()); + fillMCPtHistos(particle, pdgCode); + registry.fill(HIST("trackMCGen/after/incl/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); if (pos) { - registry.fill(HIST("trackMCGen/after/pos/pt_gen"), particle.pt()); registry.fill(HIST("trackMCGen/after/pos/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); } else { - registry.fill(HIST("trackMCGen/after/neg/pt_gen"), particle.pt()); registry.fill(HIST("trackMCGen/after/neg/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); } } From f6fb6d22f03d8338e1e3849300aa01e8733e37df Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Fri, 4 Apr 2025 18:15:04 +0200 Subject: [PATCH 0927/1650] [PWGEM/Dilepton] add a task to study MFT-matching (#10765) --- PWGEM/Dilepton/Core/SingleTrackQC.h | 4 +- PWGEM/Dilepton/Core/SingleTrackQCMC.h | 4 +- PWGEM/Dilepton/Tasks/CMakeLists.txt | 5 + PWGEM/Dilepton/Tasks/matchingMFT.cxx | 483 ++++++++++++++++++++++++++ 4 files changed, 492 insertions(+), 4 deletions(-) create mode 100644 PWGEM/Dilepton/Tasks/matchingMFT.cxx diff --git a/PWGEM/Dilepton/Core/SingleTrackQC.h b/PWGEM/Dilepton/Core/SingleTrackQC.h index 50841bbb1ab..510f657be64 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQC.h @@ -275,7 +275,7 @@ struct SingleTrackQC { fRegistry.add("Track/positive/hEtaPhi_MatchMCHMID", "#eta vs. #varphi of matched MCHMID", kTH2F, {axis_phi, axis_eta}, false); fRegistry.add("Track/positive/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{400, -20, 20}}, false); fRegistry.add("Track/positive/hTrackType", "track type", kTH1F, {{6, -0.5f, 5.5}}, false); - fRegistry.add("Track/positive/hDCAxy", "DCA x vs. y;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -0.1f, 0.1f}, {200, -0.1f, 0.1f}}, false); + fRegistry.add("Track/positive/hDCAxy", "DCA x vs. y;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -0.5f, 0.5f}, {200, -0.5f, 0.5f}}, false); fRegistry.add("Track/positive/hDCAxySigma", "DCA x vs. y;DCA_{x} (#sigma);DCA_{y} (#sigma)", kTH2F, {{200, -10.0f, 10.0f}, {200, -10.0f, 10.0f}}, false); fRegistry.add("Track/positive/hDCAxRes_Pt", "DCA_{x} resolution vs. pT;p_{T} (GeV/c);DCA_{x} resolution (#mum)", kTH2F, {{100, 0, 10}, {500, 0, 500}}, false); fRegistry.add("Track/positive/hDCAyRes_Pt", "DCA_{y} resolution vs. pT;p_{T} (GeV/c);DCA_{y} resolution (#mum)", kTH2F, {{100, 0, 10}, {500, 0, 500}}, false); @@ -425,7 +425,7 @@ struct SingleTrackQC { fDimuonCut.SetTrackEtaRange(dimuoncuts.cfg_min_eta_track, dimuoncuts.cfg_max_eta_track); fDimuonCut.SetTrackPhiRange(dimuoncuts.cfg_min_phi_track, dimuoncuts.cfg_max_phi_track); fDimuonCut.SetNClustersMFT(dimuoncuts.cfg_min_ncluster_mft, 10); - fDimuonCut.SetNClustersMCHMID(dimuoncuts.cfg_min_ncluster_mch, 16); + fDimuonCut.SetNClustersMCHMID(dimuoncuts.cfg_min_ncluster_mch, 20); fDimuonCut.SetChi2(0.f, dimuoncuts.cfg_max_chi2); fDimuonCut.SetMatchingChi2MCHMFT(0.f, dimuoncuts.cfg_max_matching_chi2_mftmch); fDimuonCut.SetMatchingChi2MCHMID(0.f, dimuoncuts.cfg_max_matching_chi2_mchmid); diff --git a/PWGEM/Dilepton/Core/SingleTrackQCMC.h b/PWGEM/Dilepton/Core/SingleTrackQCMC.h index 14437b595d3..1fa6be4d337 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQCMC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQCMC.h @@ -332,7 +332,7 @@ struct SingleTrackQCMC { fRegistry.add("Track/lf/positive/hEtaPhi_MatchMCHMID", "#eta vs. #varphi of matched MCHMID", kTH2F, {axis_phi, axis_eta}, false); fRegistry.add("Track/lf/positive/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{400, -20, 20}}, false); fRegistry.add("Track/lf/positive/hTrackType", "track type", kTH1F, {{6, -0.5f, 5.5}}, false); - fRegistry.add("Track/lf/positive/hDCAxy", "DCA x vs. y;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -0.1f, 0.1f}, {200, -0.1f, 0.1f}}, false); + fRegistry.add("Track/lf/positive/hDCAxy", "DCA x vs. y;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -0.5f, 0.5f}, {200, -0.5f, 0.5f}}, false); fRegistry.add("Track/lf/positive/hDCAxySigma", "DCA x vs. y;DCA_{x} (#sigma);DCA_{y} (#sigma)", kTH2F, {{200, -10.0f, 10.0f}, {200, -10.0f, 10.0f}}, false); fRegistry.add("Track/lf/positive/hDCAxRes_Pt", "DCA_{x} resolution vs. pT;p_{T} (GeV/c);DCA_{x} resolution (#mum)", kTH2F, {{100, 0, 10}, {500, 0, 500}}, false); fRegistry.add("Track/lf/positive/hDCAyRes_Pt", "DCA_{y} resolution vs. pT;p_{T} (GeV/c);DCA_{y} resolution (#mum)", kTH2F, {{100, 0, 10}, {500, 0, 500}}, false); @@ -484,7 +484,7 @@ struct SingleTrackQCMC { fDimuonCut.SetTrackEtaRange(dimuoncuts.cfg_min_eta_track, dimuoncuts.cfg_max_eta_track); fDimuonCut.SetTrackPhiRange(dimuoncuts.cfg_min_phi_track, dimuoncuts.cfg_max_phi_track); fDimuonCut.SetNClustersMFT(dimuoncuts.cfg_min_ncluster_mft, 10); - fDimuonCut.SetNClustersMCHMID(dimuoncuts.cfg_min_ncluster_mch, 16); + fDimuonCut.SetNClustersMCHMID(dimuoncuts.cfg_min_ncluster_mch, 20); fDimuonCut.SetChi2(0.f, dimuoncuts.cfg_max_chi2); fDimuonCut.SetMatchingChi2MCHMFT(0.f, dimuoncuts.cfg_max_matching_chi2_mftmch); fDimuonCut.SetMatchingChi2MCHMID(0.f, dimuoncuts.cfg_max_matching_chi2_mchmid); diff --git a/PWGEM/Dilepton/Tasks/CMakeLists.txt b/PWGEM/Dilepton/Tasks/CMakeLists.txt index a27a00482f3..ad7efb3c065 100644 --- a/PWGEM/Dilepton/Tasks/CMakeLists.txt +++ b/PWGEM/Dilepton/Tasks/CMakeLists.txt @@ -136,3 +136,8 @@ o2physics_add_dpl_workflow(study-mc-truth PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(matching-mft + SOURCES matchingMFT.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::GlobalTracking + COMPONENT_NAME Analysis) + diff --git a/PWGEM/Dilepton/Tasks/matchingMFT.cxx b/PWGEM/Dilepton/Tasks/matchingMFT.cxx new file mode 100644 index 00000000000..a5069726507 --- /dev/null +++ b/PWGEM/Dilepton/Tasks/matchingMFT.cxx @@ -0,0 +1,483 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file matchingMFT.cxx +/// \brief a task to study matching MFT-[MCH-MID] in MC +/// \author daiki.sekihata@cern.ch + +#include +#include +#include + +#include "Framework/DataTypes.h" +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "TableHelper.h" +#include "CCDB/BasicCCDBManager.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "TGeoGlobalMagField.h" +#include "Field/MagneticField.h" + +#include "DetectorsBase/Propagator.h" +#include "GlobalTracking/MatchGlobalFwd.h" +#include "MCHTracking/TrackExtrap.h" +#include "MCHTracking/TrackParam.h" +#include "ReconstructionDataFormats/TrackFwd.h" + +#include "Common/DataModel/CollisionAssociationTables.h" +#include "Common/DataModel/PropagatedFwdTrackTables.h" +#include "Common/Core/fwdtrackUtilities.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/Centrality.h" + +using namespace o2; +using namespace o2::soa; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::constants::physics; +using namespace o2::aod::fwdtrackutils; + +struct matchingMFT { + using MyCollisions = soa::Join; + using MyFwdTracks = soa::Join; + using MyMFTTracks = soa::Join; + + Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; + Configurable minPt{"minPt", 0.01, "min pt for muon"}; + Configurable maxPt{"maxPt", 1e+10, "max pt for muon"}; + Configurable minEtaSA{"minEtaSA", -4.0, "min. eta acceptance for MCH-MID"}; + Configurable maxEtaSA{"maxEtaSA", -2.5, "max. eta acceptance for MCH-MID"}; + Configurable minEtaGL{"minEtaGL", -3.6, "min. eta acceptance for MFT-MCH-MID"}; + Configurable maxEtaGL{"maxEtaGL", -2.5, "max. eta acceptance for MFT-MCH-MID"}; + Configurable minRabs{"minRabs", 17.6, "min. R at absorber end"}; + Configurable midRabs{"midRabs", 26.5, "middle R at absorber end for pDCA cut"}; + Configurable maxRabs{"maxRabs", 89.5, "max. R at absorber end"}; + Configurable maxPDCAforLargeR{"maxPDCAforLargeR", 324.f, "max. pDCA for large R at absorber end"}; + Configurable maxPDCAforSmallR{"maxPDCAforSmallR", 594.f, "max. pDCA for small R at absorber end"}; + Configurable maxMatchingChi2MCHMFT{"maxMatchingChi2MCHMFT", 1e+10, "max. chi2 for MCH-MFT matching"}; + Configurable maxChi2{"maxChi2", 1e+6, "max. chi2 for muon tracking"}; + Configurable refitGlobalMuon{"refitGlobalMuon", true, "flag to refit global muon"}; + Configurable applyEtaCutToSAinGL{"applyEtaCutToSAinGL", false, "flag to apply eta cut to samuon in global muon"}; + Configurable cfgRequireTrueAssociation{"cfgRequireTrueAssociation", false, "flag to require true mc collision association"}; + + Configurable cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"}; + Configurable cfgCentMin{"cfgCentMin", -1.f, "min. centrality"}; + Configurable cfgCentMax{"cfgCentMax", 999.f, "max. centrality"}; + Configurable cfgZvtxMin{"cfgZvtxMin", -10.f, "min. Zvtx"}; + Configurable cfgZvtxMax{"cfgZvtxMax", 10.f, "max. Zvtx"}; + + HistogramRegistry fRegistry{"fRegistry"}; + static constexpr std::string_view muon_types[5] = {"MFTMCHMID/", "MFTMCHMIDOtherMatch/", "MFTMCH/", "MCHMID/", "MCH/"}; + static constexpr std::string_view muon_matching_types[3] = {"correct/", "fake/", "miss/"}; + + void init(o2::framework::InitContext&) + { + if (doprocessWithoutFTTCA && doprocessWithFTTCA) { + LOGF(fatal, "Cannot enable doprocessWithoutFTTCA and doprocessWithFTTCA at the same time. Please choose one."); + } + + ccdb->setURL(ccdburl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setFatalWhenNull(false); + ccdbApi.init(ccdburl); + + addHistograms(); + } + + o2::ccdb::CcdbApi ccdbApi; + Service ccdb; + int mRunNumber = -1; + + template + void initCCDB(TBC const& bc) + { + if (mRunNumber == bc.runNumber()) { + return; + } + mRunNumber = bc.runNumber(); + LOGF(info, "mRunNumber = %d", mRunNumber); + std::map metadata; + auto soreor = o2::ccdb::BasicCCDBManager::getRunDuration(ccdbApi, mRunNumber); + auto ts = soreor.first; + auto grpmag = ccdbApi.retrieveFromTFileAny(grpmagPath, metadata, ts); + o2::base::Propagator::initFieldFromGRP(grpmag); + if (!o2::base::GeometryManager::isGeometryLoaded()) { + ccdb->get(geoPath); + } + o2::mch::TrackExtrap::setField(); + } + + void addHistograms() + { + auto hCollisionCounter = fRegistry.add("Event/hCollisionCounter", "collision counter", kTH1F, {{5, -0.5f, 4.5f}}, false); + hCollisionCounter->GetXaxis()->SetBinLabel(1, "all"); + hCollisionCounter->GetXaxis()->SetBinLabel(2, "accepted"); + + fRegistry.add("Event/hZvtx", "vertex z; Z_{vtx} (cm)", kTH1F, {{100, -50, +50}}, false); + fRegistry.add("Event/hMultNTracksPV", "hMultNTracksPV; N_{track} to PV", kTH1F, {{6001, -0.5, 6000.5}}, false); + fRegistry.add("Event/hMultNTracksPVeta1", "hMultNTracksPVeta1; N_{track} to PV", kTH1F, {{6001, -0.5, 6000.5}}, false); + fRegistry.add("Event/hMultFT0", "hMultFT0;mult. FT0A;mult. FT0C", kTH2F, {{200, 0, 200000}, {60, 0, 60000}}, false); + fRegistry.add("Event/hCentFT0A", "hCentFT0A;centrality FT0A (%)", kTH1F, {{110, 0, 110}}, false); + fRegistry.add("Event/hCentFT0C", "hCentFT0C;centrality FT0C (%)", kTH1F, {{110, 0, 110}}, false); + fRegistry.add("Event/hCentFT0M", "hCentFT0M;centrality FT0M (%)", kTH1F, {{110, 0, 110}}, false); + fRegistry.add("Event/hCentFT0CvsMultNTracksPV", "hCentFT0CvsMultNTracksPV;centrality FT0C (%);N_{track} to PV", kTH2F, {{110, 0, 110}, {600, 0, 6000}}, false); + fRegistry.add("Event/hMultFT0CvsMultNTracksPV", "hMultFT0CvsMultNTracksPV;mult. FT0C;N_{track} to PV", kTH2F, {{60, 0, 60000}, {600, 0, 6000}}, false); + + auto hMuonType = fRegistry.add("hMuonType", "muon type", kTH1F, {{5, -0.5f, 4.5f}}, false); + hMuonType->GetXaxis()->SetBinLabel(1, "MFT-MCH-MID (global muon)"); + hMuonType->GetXaxis()->SetBinLabel(2, "MFT-MCH-MID (global muon other match)"); + hMuonType->GetXaxis()->SetBinLabel(3, "MFT-MCH"); + hMuonType->GetXaxis()->SetBinLabel(4, "MCH-MID"); + hMuonType->GetXaxis()->SetBinLabel(5, "MCH standalone"); + + fRegistry.add("MFTMCHMID/primary/correct/hPt", "pT;p_{T} (GeV/c)", kTH1F, {{100, 0.0f, 10}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {100, -6.f, -1.f}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hEtaPhi_MatchedMCHMID", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {100, -6.f, -1.f}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hDiffCollId", "difference in collision index;collisionId_{TTCA} - collisionId_{MP}", kTH1F, {{41, -20.5, +20.5}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hSign", "sign;sign", kTH1F, {{3, -1.5, +1.5}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hNclusters", "Nclusters;Nclusters", kTH1F, {{21, -0.5f, 20.5}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hNclustersMFT", "NclustersMFT;Nclusters MFT", kTH1F, {{11, -0.5f, 10.5}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hRatAbsorberEnd", "R at absorber end;R at absorber end (cm)", kTH1F, {{100, 0.0f, 100}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hPDCA_Rabs", "pDCA vs. Rabs;R at absorber end (cm);p #times DCA (GeV/c #upoint cm)", kTH2F, {{100, 0, 100}, {100, 0.0f, 1000}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hChi2", "chi2;chi2", kTH1F, {{100, 0.0f, 100}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hChi2MFT", "chi2 MFT;chi2 MFT", kTH1F, {{100, 0.0f, 100}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hChi2MatchMCHMID", "chi2 match MCH-MID;chi2", kTH1F, {{100, 0.0f, 100}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hChi2MatchMCHMFT", "chi2 match MCH-MFT;chi2", kTH1F, {{100, 0.0f, 100}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hDCAxy2D", "DCA x vs. y;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -0.5, 0.5}, {200, -0.5, +0.5}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hDCAxy2DinSigma", "DCA x vs. y in sigma;DCA_{x} (#sigma);DCA_{y} (#sigma)", kTH2F, {{200, -10, 10}, {200, -10, +10}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hDCAxy", "DCAxy;DCA_{xy} (cm);", kTH1F, {{100, 0, 1}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hDCAxyinSigma", "DCAxy in sigma;DCA_{xy} (#sigma);", kTH1F, {{100, 0, 10}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hDCAxResolutionvsPt", "DCA_{x} vs. p_{T};p_{T} (GeV/c);DCA_{x} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 500}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hDCAyResolutionvsPt", "DCA_{y} vs. p_{T};p_{T} (GeV/c);DCA_{y} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 500}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hRelDeltaPt", "pT resolution;p_{T}^{gen} (GeV/c);(p_{T}^{rec} - p_{T}^{gen})/p_{T}^{gen}", kTH2F, {{100, 0, 10}, {400, -1, +1}}, true); + fRegistry.add("MFTMCHMID/primary/correct/hDeltaEta_Pos", "#eta resolution;p_{T}^{gen} (GeV/c);#eta^{rec} - #eta^{gen}", kTH2F, {{100, 0, 10}, {400, -0.2, +0.2}}, true); + fRegistry.add("MFTMCHMID/primary/correct/hDeltaEta_Neg", "#eta resolution;p_{T}^{gen} (GeV/c);#eta^{rec} - #eta^{gen}", kTH2F, {{100, 0, 10}, {400, -0.2, +0.2}}, true); + fRegistry.add("MFTMCHMID/primary/correct/hDeltaPhi_Pos", "#varphi resolution;p_{T}^{gen} (GeV/c);#varphi^{rec} - #varphi^{gen} (rad.)", kTH2F, {{100, 0, 10}, {400, -0.2, +0.2}}, true); + fRegistry.add("MFTMCHMID/primary/correct/hDeltaPhi_Neg", "#varphi resolution;p_{T}^{gen} (GeV/c);#varphi^{rec} - #varphi^{gen} (rad.)", kTH2F, {{100, 0, 10}, {400, -0.2, +0.2}}, true); + fRegistry.addClone("MFTMCHMID/primary/correct/", "MFTMCHMID/primary/wrong/"); + fRegistry.addClone("MFTMCHMID/primary/", "MFTMCHMID/secondary/"); + } + + bool isSelected(const float pt, const float eta, const float rAtAbsorberEnd, const float pDCA, const float chi2, const uint8_t trackType, const float etaMatchedMCHMID) + { + if (pt < minPt || maxPt < pt) { + return false; + } + + if (rAtAbsorberEnd < minRabs || maxRabs < rAtAbsorberEnd) { + return false; + } + + if (chi2 < 0.f || maxChi2 < chi2) { + return false; + } + + if (trackType == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack)) { + if (eta < minEtaGL || maxEtaGL < eta) { + return false; + } + if (applyEtaCutToSAinGL && (etaMatchedMCHMID < minEtaGL || maxEtaGL < etaMatchedMCHMID)) { + return false; + } + } else if (trackType == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { + if (eta < minEtaSA || maxEtaSA < eta) { + return false; + } + } else { + return false; + } + + if (rAtAbsorberEnd < midRabs ? pDCA > maxPDCAforSmallR : pDCA > maxPDCAforLargeR) { + return false; + } + return true; + } + + template + void fillHistograms(TCollision const& collision, TFwdTrack fwdtrack, TFwdTracks const&, TMFTTracks const&) + { + const auto& mchtrack = fwdtrack.template matchMCHTrack_as(); // MCH-MID + const auto& mfttrack = fwdtrack.template matchMFTTrack_as(); + + if (!fwdtrack.has_mcParticle() || !mchtrack.has_mcParticle() || !mfttrack.has_mcParticle()) { + return; + } + + const auto& mcParticle_MFTMCHMID = fwdtrack.template mcParticle_as(); // this is identical to mcParticle_MCHMID + const auto& mcParticle_MCHMID = mchtrack.template mcParticle_as(); // this is identical to mcParticle_MFTMCHMID + const auto& mcParticle_MFT = mfttrack.template mcParticle_as(); + // LOGF(info, "mcParticle_MFTMCHMID.pdgCode() = %d, mcParticle_MCHMID.pdgCode() = %d, mcParticle_MFT.pdgCode() = %d", mcParticle_MFTMCHMID.pdgCode(), mcParticle_MCHMID.pdgCode(), mcParticle_MFT.pdgCode()); + // LOGF(info, "mcParticle_MFTMCHMID.globalIndex() = %d, mcParticle_MCHMID.globalIndex() = %d, mcParticle_MFT.globalIndex() = %d", mcParticle_MFTMCHMID.globalIndex(), mcParticle_MCHMID.globalIndex(), mcParticle_MFT.globalIndex()); + + if (std::abs(mcParticle_MCHMID.pdgCode()) != 13) { // select true muon + return; + } + + if (cfgRequireTrueAssociation && (mcParticle_MCHMID.mcCollisionId() != collision.mcCollisionId())) { + return; + } + + bool isPrimary = mcParticle_MCHMID.isPhysicalPrimary() || mcParticle_MCHMID.producedByGenerator(); + bool isMatched = (mcParticle_MFT.globalIndex() == mcParticle_MCHMID.globalIndex()) && (mcParticle_MFT.mcCollisionId() == mcParticle_MCHMID.mcCollisionId()); + + o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon(fwdtrack, collision, propagationPoint::kToVertex); + o2::dataformats::GlobalFwdTrack propmuonAtDCA = propagateMuon(fwdtrack, collision, propagationPoint::kToDCA); + + float pt = propmuonAtPV.getPt(); + float eta = propmuonAtPV.getEta(); + float phi = propmuonAtPV.getPhi(); + o2::math_utils::bringTo02Pi(phi); + + float cXXatDCA = propmuonAtDCA.getSigma2X(); + float cYYatDCA = propmuonAtDCA.getSigma2Y(); + float cXYatDCA = propmuonAtDCA.getSigmaXY(); + + float dcaX = propmuonAtDCA.getX() - collision.posX(); + float dcaY = propmuonAtDCA.getY() - collision.posY(); + float rAtAbsorberEnd = fwdtrack.rAtAbsorberEnd(); // this works only for GlobalMuonTrack + float dcaXY = std::sqrt(dcaX * dcaX + dcaY * dcaY); + + float dFdx = 2.f * dcaX / dcaXY; + float dFdy = 2.f * dcaY / dcaXY; + float sigma_dcaXY = std::sqrt(cXXatDCA * dFdx * dFdx + cYYatDCA * dFdy * dFdy + 2.f * cXYatDCA * dFdx * dFdy); + + o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToVertex); + float etaMatchedMCHMID = propmuonAtPV_Matched.getEta(); + float phiMatchedMCHMID = propmuonAtPV_Matched.getPhi(); + o2::math_utils::bringTo02Pi(phiMatchedMCHMID); + + o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToDCA); + float dcaX_Matched = propmuonAtDCA_Matched.getX() - collision.posX(); + float dcaY_Matched = propmuonAtDCA_Matched.getY() - collision.posY(); + float dcaXY_Matched = std::sqrt(dcaX_Matched * dcaX_Matched + dcaY_Matched * dcaY_Matched); + float pDCA = mchtrack.p() * dcaXY_Matched; + + int nClustersMFT = mfttrack.nClusters(); + float chi2mft = mfttrack.chi2(); + + if (refitGlobalMuon) { + eta = mfttrack.eta(); + phi = mfttrack.phi(); + o2::math_utils::bringTo02Pi(phi); + pt = propmuonAtPV_Matched.getP() * std::sin(2.f * std::atan(std::exp(-eta))); + } + + if (!isSelected(pt, eta, rAtAbsorberEnd, pDCA, fwdtrack.chi2(), fwdtrack.trackType(), etaMatchedMCHMID)) { + return; + } + + fRegistry.fill(HIST("hMuonType"), fwdtrack.trackType()); + if (isPrimary) { + if (isMatched) { + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hPt"), pt); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hEtaPhi"), phi, eta); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hSign"), fwdtrack.sign()); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hNclusters"), fwdtrack.nClusters()); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hNclustersMFT"), nClustersMFT); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hPDCA_Rabs"), rAtAbsorberEnd, pDCA); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hRatAbsorberEnd"), rAtAbsorberEnd); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hChi2"), fwdtrack.chi2()); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hChi2MFT"), chi2mft); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hChi2MatchMCHMID"), fwdtrack.chi2MatchMCHMID()); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hChi2MatchMCHMFT"), fwdtrack.chi2MatchMCHMFT()); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxy2D"), dcaX, dcaY); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxy2DinSigma"), dcaX / std::sqrt(cXXatDCA), dcaY / std::sqrt(cYYatDCA)); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxy"), dcaXY); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxyinSigma"), dcaXY / sigma_dcaXY); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxResolutionvsPt"), pt, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAyResolutionvsPt"), pt, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hRelDeltaPt"), mcParticle_MFTMCHMID.pt(), (pt - mcParticle_MFTMCHMID.pt()) / mcParticle_MFTMCHMID.pt()); + if (mcParticle_MFTMCHMID.pdgCode() > 0) { + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDeltaEta_Neg"), mcParticle_MFTMCHMID.pt(), eta - mcParticle_MFTMCHMID.eta()); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDeltaPhi_Neg"), mcParticle_MFTMCHMID.pt(), phi - mcParticle_MFTMCHMID.phi()); + } else { + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDeltaEta_Pos"), mcParticle_MFTMCHMID.pt(), eta - mcParticle_MFTMCHMID.eta()); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDeltaPhi_Pos"), mcParticle_MFTMCHMID.pt(), phi - mcParticle_MFTMCHMID.phi()); + } + } else { + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hPt"), pt); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hEtaPhi"), phi, eta); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hSign"), fwdtrack.sign()); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hNclusters"), fwdtrack.nClusters()); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hNclustersMFT"), nClustersMFT); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hPDCA_Rabs"), rAtAbsorberEnd, pDCA); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hRatAbsorberEnd"), rAtAbsorberEnd); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hChi2"), fwdtrack.chi2()); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hChi2MFT"), chi2mft); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hChi2MatchMCHMID"), fwdtrack.chi2MatchMCHMID()); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hChi2MatchMCHMFT"), fwdtrack.chi2MatchMCHMFT()); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxy2D"), dcaX, dcaY); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxy2DinSigma"), dcaX / std::sqrt(cXXatDCA), dcaY / std::sqrt(cYYatDCA)); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxy"), dcaXY); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxyinSigma"), dcaXY / sigma_dcaXY); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxResolutionvsPt"), pt, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAyResolutionvsPt"), pt, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hRelDeltaPt"), mcParticle_MFTMCHMID.pt(), (pt - mcParticle_MFTMCHMID.pt()) / mcParticle_MFTMCHMID.pt()); + if (mcParticle_MFTMCHMID.pdgCode() > 0) { + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDeltaEta_Neg"), mcParticle_MFTMCHMID.pt(), eta - mcParticle_MFTMCHMID.eta()); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDeltaPhi_Neg"), mcParticle_MFTMCHMID.pt(), phi - mcParticle_MFTMCHMID.phi()); + } else { + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDeltaEta_Pos"), mcParticle_MFTMCHMID.pt(), eta - mcParticle_MFTMCHMID.eta()); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDeltaPhi_Pos"), mcParticle_MFTMCHMID.pt(), phi - mcParticle_MFTMCHMID.phi()); + } + } + } else { // secondary + if (isMatched) { + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hPt"), pt); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hEtaPhi"), phi, eta); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hSign"), fwdtrack.sign()); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hNclusters"), fwdtrack.nClusters()); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hNclustersMFT"), nClustersMFT); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hPDCA_Rabs"), rAtAbsorberEnd, pDCA); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hRatAbsorberEnd"), rAtAbsorberEnd); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hChi2"), fwdtrack.chi2()); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hChi2MFT"), chi2mft); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hChi2MatchMCHMID"), fwdtrack.chi2MatchMCHMID()); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hChi2MatchMCHMFT"), fwdtrack.chi2MatchMCHMFT()); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxy2D"), dcaX, dcaY); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxy2DinSigma"), dcaX / std::sqrt(cXXatDCA), dcaY / std::sqrt(cYYatDCA)); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxy"), dcaXY); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxyinSigma"), dcaXY / sigma_dcaXY); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxResolutionvsPt"), pt, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAyResolutionvsPt"), pt, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hRelDeltaPt"), mcParticle_MFTMCHMID.pt(), (pt - mcParticle_MFTMCHMID.pt()) / mcParticle_MFTMCHMID.pt()); + if (mcParticle_MFTMCHMID.pdgCode() > 0) { + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDeltaEta_Neg"), mcParticle_MFTMCHMID.pt(), eta - mcParticle_MFTMCHMID.eta()); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDeltaPhi_Neg"), mcParticle_MFTMCHMID.pt(), phi - mcParticle_MFTMCHMID.phi()); + } else { + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDeltaEta_Pos"), mcParticle_MFTMCHMID.pt(), eta - mcParticle_MFTMCHMID.eta()); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDeltaPhi_Pos"), mcParticle_MFTMCHMID.pt(), phi - mcParticle_MFTMCHMID.phi()); + } + } else { + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hPt"), pt); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hEtaPhi"), phi, eta); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hSign"), fwdtrack.sign()); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hNclusters"), fwdtrack.nClusters()); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hNclustersMFT"), nClustersMFT); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hPDCA_Rabs"), rAtAbsorberEnd, pDCA); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hRatAbsorberEnd"), rAtAbsorberEnd); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hChi2"), fwdtrack.chi2()); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hChi2MFT"), chi2mft); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hChi2MatchMCHMID"), fwdtrack.chi2MatchMCHMID()); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hChi2MatchMCHMFT"), fwdtrack.chi2MatchMCHMFT()); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxy2D"), dcaX, dcaY); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxy2DinSigma"), dcaX / std::sqrt(cXXatDCA), dcaY / std::sqrt(cYYatDCA)); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxy"), dcaXY); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxyinSigma"), dcaXY / sigma_dcaXY); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxResolutionvsPt"), pt, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAyResolutionvsPt"), pt, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hRelDeltaPt"), mcParticle_MFTMCHMID.pt(), (pt - mcParticle_MFTMCHMID.pt()) / mcParticle_MFTMCHMID.pt()); + if (mcParticle_MFTMCHMID.pdgCode() > 0) { + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDeltaEta_Neg"), mcParticle_MFTMCHMID.pt(), eta - mcParticle_MFTMCHMID.eta()); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDeltaPhi_Neg"), mcParticle_MFTMCHMID.pt(), phi - mcParticle_MFTMCHMID.phi()); + } else { + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDeltaEta_Pos"), mcParticle_MFTMCHMID.pt(), eta - mcParticle_MFTMCHMID.eta()); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDeltaPhi_Pos"), mcParticle_MFTMCHMID.pt(), phi - mcParticle_MFTMCHMID.phi()); + } + } + } + } + + template + void fillEventHistograms(TCollision const& collision) + { + fRegistry.fill(HIST("Event/hZvtx"), collision.posZ()); + fRegistry.fill(HIST("Event/hMultNTracksPV"), collision.multNTracksPV()); + fRegistry.fill(HIST("Event/hMultNTracksPVeta1"), collision.multNTracksPVeta1()); + fRegistry.fill(HIST("Event/hMultFT0"), collision.multFT0A(), collision.multFT0C()); + fRegistry.fill(HIST("Event/hCentFT0A"), collision.centFT0A()); + fRegistry.fill(HIST("Event/hCentFT0C"), collision.centFT0C()); + fRegistry.fill(HIST("Event/hCentFT0M"), collision.centFT0M()); + fRegistry.fill(HIST("Event/hCentFT0CvsMultNTracksPV"), collision.centFT0C(), collision.multNTracksPV()); + fRegistry.fill(HIST("Event/hMultFT0CvsMultNTracksPV"), collision.multFT0C(), collision.multNTracksPV()); + } + + SliceCache cache; + PresliceUnsorted perMFTTrack = o2::aod::fwdtrack::matchMFTTrackId; + Preslice perCollision = o2::aod::fwdtrack::collisionId; + Preslice fwdtrackIndicesPerCollision = aod::track_association::collisionId; + PresliceUnsorted fwdtrackIndicesPerFwdTrack = aod::track_association::fwdtrackId; + + Filter collisionFilter_evsel = o2::aod::evsel::sel8 == true && (cfgZvtxMin < o2::aod::collision::posZ && o2::aod::collision::posZ < cfgZvtxMax); + Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); + using FilteredMyCollisions = soa::Filtered; + + void processWithoutFTTCA(FilteredMyCollisions const& collisions, MyFwdTracks const& fwdtracks, MyMFTTracks const& mfttracks, aod::BCsWithTimestamps const&, aod::McParticles const&) + { + for (const auto& collision : collisions) { + const auto& bc = collision.template bc_as(); + initCCDB(bc); + fRegistry.fill(HIST("Event/hCollisionCounter"), 0); + if (!collision.has_mcCollision()) { + continue; + } + const float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; + if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { + continue; + } + fRegistry.fill(HIST("Event/hCollisionCounter"), 1); + fillEventHistograms(collision); + + const auto& fwdtracks_per_coll = fwdtracks.sliceBy(perCollision, collision.globalIndex()); + for (const auto& fwdtrack : fwdtracks_per_coll) { + if (fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) { + continue; + } + fillHistograms(collision, fwdtrack, fwdtracks, mfttracks); + } // end of fwdtrack loop + } // end of collision loop + } + PROCESS_SWITCH(matchingMFT, processWithoutFTTCA, "process without FTTCA", false); + + void processWithFTTCA(FilteredMyCollisions const& collisions, MyFwdTracks const& fwdtracks, MyMFTTracks const& mfttracks, aod::BCsWithTimestamps const&, aod::FwdTrackAssoc const& fwdtrackIndices, aod::McParticles const&) + { + for (const auto& collision : collisions) { + const auto& bc = collision.template bc_as(); + initCCDB(bc); + fRegistry.fill(HIST("Event/hCollisionCounter"), 0); + if (!collision.has_mcCollision()) { + continue; + } + const float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; + if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { + continue; + } + fRegistry.fill(HIST("Event/hCollisionCounter"), 1); + fillEventHistograms(collision); + + const auto& fwdtrackIdsThisCollision = fwdtrackIndices.sliceBy(fwdtrackIndicesPerCollision, collision.globalIndex()); + for (const auto& fwdtrackId : fwdtrackIdsThisCollision) { + const auto& fwdtrack = fwdtrackId.template fwdtrack_as(); + if (fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType()) { + continue; + } + fillHistograms(collision, fwdtrack, fwdtracks, mfttracks); + } // end of fwdtrack loop + } // end of collision loop + } + PROCESS_SWITCH(matchingMFT, processWithFTTCA, "process with FTTCA", true); +}; +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc, TaskName{"matching-mft"})}; +} From 9cfaf5eca4c47de432298823ce1620861bee988d Mon Sep 17 00:00:00 2001 From: yuanzhe <90246048+wang-yuanzhe@users.noreply.github.com> Date: Fri, 4 Apr 2025 20:29:29 +0200 Subject: [PATCH 0928/1650] [PWGLF,Trigger] Add daughters' eta cut and QA plots for fH3L3Body trigger (#10768) --- EventFiltering/PWGLF/nucleiFilter.cxx | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/EventFiltering/PWGLF/nucleiFilter.cxx b/EventFiltering/PWGLF/nucleiFilter.cxx index 7cf25abfddf..33681d4ef5f 100644 --- a/EventFiltering/PWGLF/nucleiFilter.cxx +++ b/EventFiltering/PWGLF/nucleiFilter.cxx @@ -121,12 +121,13 @@ struct nucleiFilter { struct : ConfigurableGroup { Configurable d_bz_input{"trgH3L3Body.d_bz", -999, "bz field, -999 is automatic"}; Configurable minCosPA3body{"trgH3L3Body.minCosPA3body", 0.9995, "minCosPA3body"}; - Configurable dcavtxdau{"trgH3L3Body.dcavtxdau", 0.04, "meen DCA among Daughters"}; + Configurable dcavtxdau{"trgH3L3Body.dcavtxdau", 0.02, "meen DCA among Daughters"}; Configurable dcapiontopv{"trgH3L3Body.dcapiontopv", 0.05, "DCA Pion To PV"}; Configurable tofPIDNSigmaMin{"trgH3L3Body.tofPIDNSigmaMin", -5, "tofPIDNSigmaMin"}; Configurable tofPIDNSigmaMax{"trgH3L3Body.tofPIDNSigmaMax", 5, "tofPIDNSigmaMax"}; Configurable tpcPIDNSigmaCut{"trgH3L3Body.tpcPIDNSigmaCut", 5, "tpcPIDNSigmaCut"}; Configurable lifetimecut{"trgH3L3Body.lifetimecut", 40., "lifetimecut"}; + Configurable minDaughtersEta{"trgH3L3Body.minDaughtersEta", 1.f, "minDaughtersEta"}; Configurable minProtonPt{"trgH3L3Body.minProtonPt", 0.3, "minProtonPt"}; Configurable maxProtonPt{"trgH3L3Body.maxProtonPt", 5, "maxProtonPt"}; Configurable minPionPt{"trgH3L3Body.minPionPt", 0.1, "minPionPt"}; @@ -136,7 +137,7 @@ struct nucleiFilter { Configurable minDeuteronPUseTOF{"trgH3L3Body.minDeuteronPUseTOF", 1, "minDeuteronPt Enable TOF PID"}; Configurable h3LMassLowerlimit{"trgH3L3Body.h3LMassLowerlimit", 2.96, "Hypertriton mass lower limit"}; Configurable h3LMassUpperlimit{"trgH3L3Body.h3LMassUpperlimit", 3.04, "Hypertriton mass upper limit"}; - Configurable minP3Body{"trgH3L3Body.minP3Body", 0.5, "min P3Body"}; + Configurable minP3Body{"trgH3L3Body.minP3Body", 1.5, "min P3Body"}; Configurable mintpcNClsproton{"trgH3L3Body.mintpcNClsproton", 90, "min tpc Nclusters for proton"}; Configurable mintpcNClspion{"trgH3L3Body.mintpcNClspion", 70, "min tpc Nclusters for pion"}; Configurable mintpcNClsdeuteron{"trgH3L3Body.mintpcNClsdeuteron", 100, "min tpc Nclusters for deuteron"}; @@ -173,6 +174,8 @@ struct nucleiFilter { qaHists.add("fDeuTOFNsigma", "Deuteron TOF Nsigma distribution", HistType::kTH2F, {{1200, -6, 6, "#it{p} (GeV/#it{c})"}, {2000, -100, 100, "TOF n#sigma"}}); qaHists.add("fBachDeuTOFNsigma", "Bachelor Deuteron TOF Nsigma distribution", HistType::kTH2F, {{1200, -6, 6, "#it{p} (GeV/#it{c})"}, {2000, -100, 100, "TOF n#sigma"}}); qaHists.add("fH3LMassVsPt", "Hypertrion mass Vs pT", HistType::kTH2F, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {80, 2.96, 3.04, "Inv. Mass (GeV/c^{2})"}}); + qaHists.add("fH3LDcaVsPt", "DCA vs pT", HistType::kTH2F, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {100, 0, 0.05, "DCA (cm)"}}); + qaHists.add("fH3LCosPAVsPt", "CosPA vs pT", HistType::kTH2F, {{100, 0, 10, "#it{p}_{T} (GeV/#it{c})"}, {100, 0.999, 1.0, "CosPA"}}); qaHists.add("fExtremeIonisationITS", "ITS clusters for extreme ionisation trigger", HistType::kTH3F, {{4, 3.5, 7.5, "Number of ITS clusters"}, {150, 0, 15, "Average cluster size in ITS x cos#lambda"}, {100, 0.1, 10, "#it{p} (GeV/#it{c})"}}); for (int iN{0}; iN < nNuclei; ++iN) { @@ -413,6 +416,10 @@ struct nucleiFilter { continue; } + if (std::abs(track0.eta()) > trgH3L3Body.minDaughtersEta || std::abs(track1.eta()) > trgH3L3Body.minDaughtersEta || std::abs(track2.eta()) > trgH3L3Body.minDaughtersEta) { + continue; + } + bool isProton = false, isPion = false, isAntiProton = false, isAntiPion = false; if (std::abs(track0.tpcNSigmaPr()) < std::abs(track0.tpcNSigmaPi())) { if (track0.p() >= trgH3L3Body.minProtonPt && track0.p() <= trgH3L3Body.maxProtonPt) { @@ -500,7 +507,8 @@ struct nucleiFilter { continue; } - if (fitter3body.getChi2AtPCACandidate() > trgH3L3Body.dcavtxdau) { + float dcaDaughters = fitter3body.getChi2AtPCACandidate(); + if (dcaDaughters > trgH3L3Body.dcavtxdau) { continue; } @@ -521,6 +529,8 @@ struct nucleiFilter { if (isProton && isAntiPion && std::abs(track1dca) >= trgH3L3Body.dcapiontopv) { qaHists.fill(HIST("fH3LMassVsPt"), pt3B, invmassH3L); qaHists.fill(HIST("fBachDeuTOFNsigma"), track2.p() * track2.sign(), tofNSigmaDeuteron); + qaHists.fill(HIST("fH3LDcaVsPt"), pt3B, dcaDaughters); + qaHists.fill(HIST("fH3LCosPAVsPt"), pt3B, vtxCosPA); keepEvent[3] = true; } } @@ -529,6 +539,8 @@ struct nucleiFilter { if (isAntiProton && isPion && std::abs(track0dca) >= trgH3L3Body.dcapiontopv) { qaHists.fill(HIST("fH3LMassVsPt"), pt3B, invmassAntiH3L); qaHists.fill(HIST("fBachDeuTOFNsigma"), track2.p() * track2.sign(), tofNSigmaDeuteron); + qaHists.fill(HIST("fH3LDcaVsPt"), pt3B, dcaDaughters); + qaHists.fill(HIST("fH3LCosPAVsPt"), pt3B, vtxCosPA); keepEvent[3] = true; } } From a4cc675010a01957e86b19e0bb7529e443bce212 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Fri, 4 Apr 2025 20:39:00 +0200 Subject: [PATCH 0929/1650] Common: update MFT matching (#10769) --- Common/TableProducer/fwdtrackPropagation.cxx | 122 ++++++++++++++----- PWGEM/Dilepton/Core/SingleTrackQC.h | 6 +- PWGEM/Dilepton/Core/SingleTrackQCMC.h | 6 +- PWGEM/Dilepton/Tasks/matchingMFT.cxx | 38 ++++-- 4 files changed, 125 insertions(+), 47 deletions(-) diff --git a/Common/TableProducer/fwdtrackPropagation.cxx b/Common/TableProducer/fwdtrackPropagation.cxx index ae43c05c0f7..aa4c1e7f21a 100644 --- a/Common/TableProducer/fwdtrackPropagation.cxx +++ b/Common/TableProducer/fwdtrackPropagation.cxx @@ -64,12 +64,16 @@ struct FwdTrackPropagation { Configurable minRabs{"minRabs", 17.6, "min. R at absorber end"}; Configurable midRabs{"midRabs", 26.5, "middle R at absorber end for pDCA cut"}; Configurable maxRabs{"maxRabs", 89.5, "max. R at absorber end"}; + Configurable maxDCAxy{"maxDCAxy", 1e+10, "max. DCAxy for global muons"}; Configurable maxPDCAforLargeR{"maxPDCAforLargeR", 324.f, "max. pDCA for large R at absorber end"}; Configurable maxPDCAforSmallR{"maxPDCAforSmallR", 594.f, "max. pDCA for small R at absorber end"}; Configurable maxMatchingChi2MCHMFT{"maxMatchingChi2MCHMFT", 50.f, "max. chi2 for MCH-MFT matching"}; - Configurable maxChi2{"maxChi2", 1e+6, "max. chi2 for muon tracking"}; - Configurable refitGlobalMuon{"refitGlobalMuon", false, "flag to refit global muon"}; - Configurable applyEtaCutToSAinGL{"applyEtaCutToSAinGL", false, "flag to apply eta cut to samuon in global muon"}; + Configurable maxChi2SA{"maxChi2SA", 1e+6, "max. chi2 for standalone muon"}; + Configurable maxChi2GL{"maxChi2GL", 1e+6, "max. chi2 for global muon"}; + Configurable refitGlobalMuon{"refitGlobalMuon", true, "flag to refit global muon"}; + Configurable applyDEtaDPhi{"cfgApplyDEtaDPhi", false, "flag to apply deta-dphi elliptic cut"}; + Configurable minDEta{"minDEta", 0.1, "min deta between MFT-MCH-MID and its attached MID-MCH at PV"}; + Configurable minDPhi{"minDPhi", 0.1, "min dphi between MFT-MCH-MID and its attached MID-MCH at PV"}; HistogramRegistry fRegistry{"fRegistry"}; static constexpr std::string_view muon_types[5] = {"MFTMCHMID/", "MFTMCHMIDOtherMatch/", "MFTMCH/", "MCHMID/", "MCH/"}; @@ -138,9 +142,9 @@ struct FwdTrackPropagation { fRegistry.add("MFTMCHMID/hChi2MatchMCHMID", "chi2 match MCH-MID;chi2", kTH1F, {{100, 0.0f, 100}}, false); fRegistry.add("MFTMCHMID/hChi2MatchMCHMFT", "chi2 match MCH-MFT;chi2", kTH1F, {{100, 0.0f, 100}}, false); fRegistry.add("MFTMCHMID/hMatchScoreMCHMFT", "match score MCH-MFT;score", kTH1F, {{100, 0.0f, 100}}, false); - fRegistry.add("MFTMCHMID/hDCAxy2D", "DCA x vs. y;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -0.1, 0.1}, {200, -0.1, +0.1}}, false); + fRegistry.add("MFTMCHMID/hDCAxy2D", "DCA x vs. y;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -0.5, 0.5}, {200, -0.5, +0.5}}, false); fRegistry.add("MFTMCHMID/hDCAxy2DinSigma", "DCA x vs. y in sigma;DCA_{x} (#sigma);DCA_{y} (#sigma)", kTH2F, {{200, -10, 10}, {200, -10, +10}}, false); - fRegistry.add("MFTMCHMID/hDCAxy", "DCAxy;DCA_{xy} (cm);", kTH1F, {{100, 0, 0.1}}, false); + fRegistry.add("MFTMCHMID/hDCAxy", "DCAxy;DCA_{xy} (cm);", kTH1F, {{100, 0, 1}}, false); fRegistry.add("MFTMCHMID/hDCAxyinSigma", "DCAxy in sigma;DCA_{xy} (#sigma);", kTH1F, {{100, 0, 10}}, false); fRegistry.addClone("MFTMCHMID/", "MCHMID/"); fRegistry.add("MFTMCHMID/hDCAxResolutionvsPt", "DCA_{x} vs. p_{T};p_{T} (GeV/c);DCA_{x} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 500}}, false); @@ -149,17 +153,15 @@ struct FwdTrackPropagation { fRegistry.add("MCHMID/hDCAyResolutionvsPt", "DCA_{y} vs. p_{T};p_{T} (GeV/c);DCA_{y} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 5e+5}}, false); } - bool isSelected(const float pt, const float eta, const float rAtAbsorberEnd, const float pDCA, const float chi2, const uint8_t trackType, const float etaMatchedMCHMID) + bool isSelected(const float pt, const float eta, const float rAtAbsorberEnd, const float pDCA, const float chi2, const uint8_t trackType, const float dcaXY) { if (pt < minPt || maxPt < pt) { return false; } - if (rAtAbsorberEnd < minRabs || maxRabs < rAtAbsorberEnd) { return false; } - - if (chi2 < 0.f || maxChi2 < chi2) { + if (rAtAbsorberEnd < midRabs ? pDCA > maxPDCAforSmallR : pDCA > maxPDCAforLargeR) { return false; } @@ -167,18 +169,95 @@ struct FwdTrackPropagation { if (eta < minEtaGL || maxEtaGL < eta) { return false; } - if (applyEtaCutToSAinGL && (etaMatchedMCHMID < minEtaSA || maxEtaSA < etaMatchedMCHMID)) { + if (maxDCAxy < dcaXY) { + return false; + } + if (chi2 < 0.f || maxChi2GL < chi2) { return false; } } else if (trackType == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { if (eta < minEtaSA || maxEtaSA < eta) { return false; } + if (chi2 < 0.f || maxChi2SA < chi2) { + return false; + } } else { return false; } - if (rAtAbsorberEnd < midRabs ? pDCA > maxPDCAforSmallR : pDCA > maxPDCAforLargeR) { + return true; + } + + template + bool isBestMatch(TCollision const& collision, TTarget const& target, TCandidates const& candidates) + { + std::map map_chi2MFTMCH; + for (const auto& matchedtrack : candidates) { // MFT-MCH-MID or MFT-MCH + if (matchedtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) { + continue; + } + o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon(matchedtrack, collision, propagationPoint::kToVertex); + float eta = propmuonAtPV.getEta(); + float phi = propmuonAtPV.getPhi(); + if (refitGlobalMuon) { + const auto& mfttrack = matchedtrack.template matchMFTTrack_as(); + eta = mfttrack.eta(); + phi = mfttrack.phi(); + } + o2::math_utils::bringTo02Pi(phi); + if (eta < minEtaGL || maxEtaGL < eta) { + continue; + } + + const auto& mchtrack = matchedtrack.template matchMCHTrack_as(); // MCH-MID + o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToVertex); + float etaMatchedMCHMID = propmuonAtPV_Matched.getEta(); + float phiMatchedMCHMID = propmuonAtPV_Matched.getPhi(); + o2::math_utils::bringTo02Pi(phiMatchedMCHMID); + + float deta = etaMatchedMCHMID - eta; + float dphi = phiMatchedMCHMID - phi; + o2::math_utils::bringToPMPi(dphi); + if (applyDEtaDPhi && std::sqrt(std::pow(deta / minDEta, 2) + std::pow(dphi / minDPhi, 2)) > 1.f) { + continue; + } + + if (matchedtrack.chi2() < 0.f || maxChi2GL < matchedtrack.chi2()) { + continue; + } + + float rAtAbsorberEnd = matchedtrack.rAtAbsorberEnd(); // this works only for GlobalMuonTrack + if (rAtAbsorberEnd < minRabs || maxRabs < rAtAbsorberEnd) { + continue; + } + o2::dataformats::GlobalFwdTrack propmuonAtDCA = propagateMuon(matchedtrack, collision, propagationPoint::kToDCA); + float dcaX = propmuonAtDCA.getX() - collision.posX(); + float dcaY = propmuonAtDCA.getY() - collision.posY(); + float dcaXY = std::sqrt(dcaX * dcaX + dcaY * dcaY); + if (maxDCAxy < dcaXY) { + continue; + } + + o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToDCA); + float dcaX_Matched = propmuonAtDCA_Matched.getX() - collision.posX(); + float dcaY_Matched = propmuonAtDCA_Matched.getY() - collision.posY(); + float dcaXY_Matched = std::sqrt(dcaX_Matched * dcaX_Matched + dcaY_Matched * dcaY_Matched); + float pDCA = mchtrack.p() * dcaXY_Matched; + + if (rAtAbsorberEnd < midRabs ? pDCA > maxPDCAforSmallR : pDCA > maxPDCAforLargeR) { + continue; + } + + map_chi2MFTMCH[matchedtrack.globalIndex()] = matchedtrack.chi2MatchMCHMFT(); + } + if (map_chi2MFTMCH.begin()->first != target.globalIndex()) { // search for minimum matching chi2 + map_chi2MFTMCH.clear(); + return false; + } + map_chi2MFTMCH.clear(); + + if (target.chi2MatchMCHMFT() > maxMatchingChi2MCHMFT) { return false; } return true; @@ -188,23 +267,11 @@ struct FwdTrackPropagation { void fillFwdTrackTable(TCollision const& collision, TFwdTrack fwdtrack, TFwdTracks const& fwdtracks, TMFTTracks const&, const bool isAmbiguous) { if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) { - std::map map_chi2MFTMCH; const auto& matchedGlobalTracks = fwdtracks.sliceBy(perMFTTrack, fwdtrack.matchMFTTrackId()); // MFT-MCH-MID or MFT-MCH - for (const auto& matchedtrack : matchedGlobalTracks) { - if (matchedtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) { - map_chi2MFTMCH[matchedtrack.globalIndex()] = matchedtrack.chi2MatchMCHMFT(); - } - } - if (map_chi2MFTMCH.begin()->first != fwdtrack.globalIndex()) { // search for minimum chi2 - map_chi2MFTMCH.clear(); - return; - } - map_chi2MFTMCH.clear(); - - if (fwdtrack.chi2MatchMCHMFT() > maxMatchingChi2MCHMFT) { + if (!isBestMatch(collision, fwdtrack, matchedGlobalTracks)) { return; } - } // reduce useless propagation + } // find the best match between MFT and MCH-MID o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon(fwdtrack, collision, propagationPoint::kToVertex); o2::dataformats::GlobalFwdTrack propmuonAtDCA = propagateMuon(fwdtrack, collision, propagationPoint::kToDCA); @@ -240,9 +307,6 @@ struct FwdTrackPropagation { if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) { const auto& mchtrack = fwdtrack.template matchMCHTrack_as(); // MCH-MID - // etaMatchedMCHMID = mchtrack.eta(); - // phiMatchedMCHMID = mchtrack.phi(); - // o2::math_utils::bringTo02Pi(phiMatchedMCHMID); o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToVertex); etaMatchedMCHMID = propmuonAtPV_Matched.getEta(); phiMatchedMCHMID = propmuonAtPV_Matched.getPhi(); @@ -276,7 +340,7 @@ struct FwdTrackPropagation { return; } - if (!isSelected(pt, eta, rAtAbsorberEnd, pDCA, fwdtrack.chi2(), fwdtrack.trackType(), etaMatchedMCHMID)) { + if (!isSelected(pt, eta, rAtAbsorberEnd, pDCA, fwdtrack.chi2(), fwdtrack.trackType(), dcaXY)) { return; } diff --git a/PWGEM/Dilepton/Core/SingleTrackQC.h b/PWGEM/Dilepton/Core/SingleTrackQC.h index 510f657be64..2075a1ba0cf 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQC.h @@ -266,13 +266,13 @@ struct SingleTrackQC { fRegistry.addClone("Track/positive/", "Track/negative/"); } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { const AxisSpec axis_pt{ConfPtlBins, "p_{T,#mu} (GeV/c)"}; - const AxisSpec axis_eta{100, -6, -1, "#eta_{#mu}"}; - const AxisSpec axis_phi{180, 0, 2 * M_PI, "#varphi_{#mu} (rad.)"}; + const AxisSpec axis_eta{50, -6, -1, "#eta_{#mu}"}; + const AxisSpec axis_phi{90, 0, 2 * M_PI, "#varphi_{#mu} (rad.)"}; const AxisSpec axis_dca{ConfDCABins, "DCA_{#mu}^{XY} (#sigma)"}; // track info fRegistry.add("Track/positive/hs", "rec. single muon", kTHnSparseD, {axis_pt, axis_eta, axis_phi, axis_dca}, true); - fRegistry.add("Track/positive/hEtaPhi_MatchMCHMID", "#eta vs. #varphi of matched MCHMID", kTH2F, {axis_phi, axis_eta}, false); + fRegistry.add("Track/positive/hEtaPhi_MatchMCHMID", "#eta vs. #varphi of matched MCHMID", kTH2F, {{180, 0, 2.f * M_PI}, {100, -6, -1}}, false); fRegistry.add("Track/positive/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{400, -20, 20}}, false); fRegistry.add("Track/positive/hTrackType", "track type", kTH1F, {{6, -0.5f, 5.5}}, false); fRegistry.add("Track/positive/hDCAxy", "DCA x vs. y;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -0.5f, 0.5f}, {200, -0.5f, 0.5f}}, false); diff --git a/PWGEM/Dilepton/Core/SingleTrackQCMC.h b/PWGEM/Dilepton/Core/SingleTrackQCMC.h index 1fa6be4d337..eaaa78d2687 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQCMC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQCMC.h @@ -310,8 +310,8 @@ struct SingleTrackQCMC { } } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { const AxisSpec axis_pt{ConfPtlBins, "p_{T,#mu} (GeV/c)"}; - const AxisSpec axis_eta{100, -6, -1, "#eta_{#mu}"}; - const AxisSpec axis_phi{180, 0.0, 2 * M_PI, "#varphi_{#mu} (rad.)"}; + const AxisSpec axis_eta{50, -6, -1, "#eta_{#mu}"}; + const AxisSpec axis_phi{90, 0.0, 2 * M_PI, "#varphi_{#mu} (rad.)"}; const AxisSpec axis_dca{ConfDCABins, "DCA_{#mu}^{XY} (#sigma)"}; const AxisSpec axis_charge_gen{3, -1.5, +1.5, "true charge"}; @@ -329,7 +329,7 @@ struct SingleTrackQCMC { // track info fRegistry.add("Track/lf/positive/hs", "rec. single muon", kTHnSparseD, {axis_pt, axis_eta, axis_phi, axis_dca, axis_charge_gen}, true); if (cfgFillQA) { - fRegistry.add("Track/lf/positive/hEtaPhi_MatchMCHMID", "#eta vs. #varphi of matched MCHMID", kTH2F, {axis_phi, axis_eta}, false); + fRegistry.add("Track/lf/positive/hEtaPhi_MatchMCHMID", "#eta vs. #varphi of matched MCHMID", kTH2F, {{180, 0, 2.f * M_PI}, {100, -6, -1}}, false); fRegistry.add("Track/lf/positive/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{400, -20, 20}}, false); fRegistry.add("Track/lf/positive/hTrackType", "track type", kTH1F, {{6, -0.5f, 5.5}}, false); fRegistry.add("Track/lf/positive/hDCAxy", "DCA x vs. y;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -0.5f, 0.5f}, {200, -0.5f, 0.5f}}, false); diff --git a/PWGEM/Dilepton/Tasks/matchingMFT.cxx b/PWGEM/Dilepton/Tasks/matchingMFT.cxx index a5069726507..81f3a91669f 100644 --- a/PWGEM/Dilepton/Tasks/matchingMFT.cxx +++ b/PWGEM/Dilepton/Tasks/matchingMFT.cxx @@ -63,13 +63,15 @@ struct matchingMFT { Configurable minRabs{"minRabs", 17.6, "min. R at absorber end"}; Configurable midRabs{"midRabs", 26.5, "middle R at absorber end for pDCA cut"}; Configurable maxRabs{"maxRabs", 89.5, "max. R at absorber end"}; + Configurable maxDCAxy{"maxDCAxy", 1e+10, "max. DCAxy for global muons"}; Configurable maxPDCAforLargeR{"maxPDCAforLargeR", 324.f, "max. pDCA for large R at absorber end"}; Configurable maxPDCAforSmallR{"maxPDCAforSmallR", 594.f, "max. pDCA for small R at absorber end"}; Configurable maxMatchingChi2MCHMFT{"maxMatchingChi2MCHMFT", 1e+10, "max. chi2 for MCH-MFT matching"}; - Configurable maxChi2{"maxChi2", 1e+6, "max. chi2 for muon tracking"}; + Configurable maxChi2SA{"maxChi2SA", 1e+6, "max. chi2 for standalone muon"}; + Configurable maxChi2GL{"maxChi2GL", 1e+6, "max. chi2 for global muon"}; Configurable refitGlobalMuon{"refitGlobalMuon", true, "flag to refit global muon"}; Configurable applyEtaCutToSAinGL{"applyEtaCutToSAinGL", false, "flag to apply eta cut to samuon in global muon"}; - Configurable cfgRequireTrueAssociation{"cfgRequireTrueAssociation", false, "flag to require true mc collision association"}; + Configurable requireTrueAssociation{"requireTrueAssociation", false, "flag to require true mc collision association"}; Configurable cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"}; Configurable cfgCentMin{"cfgCentMin", -1.f, "min. centrality"}; @@ -79,7 +81,6 @@ struct matchingMFT { HistogramRegistry fRegistry{"fRegistry"}; static constexpr std::string_view muon_types[5] = {"MFTMCHMID/", "MFTMCHMIDOtherMatch/", "MFTMCH/", "MCHMID/", "MCH/"}; - static constexpr std::string_view muon_matching_types[3] = {"correct/", "fake/", "miss/"}; void init(o2::framework::InitContext&) { @@ -145,6 +146,7 @@ struct matchingMFT { fRegistry.add("MFTMCHMID/primary/correct/hPt", "pT;p_{T} (GeV/c)", kTH1F, {{100, 0.0f, 10}}, false); fRegistry.add("MFTMCHMID/primary/correct/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {100, -6.f, -1.f}}, false); fRegistry.add("MFTMCHMID/primary/correct/hEtaPhi_MatchedMCHMID", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {100, -6.f, -1.f}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hDeltaEtaDeltaPhi", "#Delta#eta vs. #Delta#varphi;#Delta#varphi = #varphi_{sa} - #varphi_{gl} (rad.);#Delta#eta = #eta_{sa} - #eta_{gl}", kTH2F, {{180, -M_PI, M_PI}, {400, -2.f, 2.f}}, false); fRegistry.add("MFTMCHMID/primary/correct/hDiffCollId", "difference in collision index;collisionId_{TTCA} - collisionId_{MP}", kTH1F, {{41, -20.5, +20.5}}, false); fRegistry.add("MFTMCHMID/primary/correct/hSign", "sign;sign", kTH1F, {{3, -1.5, +1.5}}, false); fRegistry.add("MFTMCHMID/primary/correct/hNclusters", "Nclusters;Nclusters", kTH1F, {{21, -0.5f, 20.5}}, false); @@ -170,17 +172,15 @@ struct matchingMFT { fRegistry.addClone("MFTMCHMID/primary/", "MFTMCHMID/secondary/"); } - bool isSelected(const float pt, const float eta, const float rAtAbsorberEnd, const float pDCA, const float chi2, const uint8_t trackType, const float etaMatchedMCHMID) + bool isSelected(const float pt, const float eta, const float rAtAbsorberEnd, const float pDCA, const float chi2, const uint8_t trackType, const float etaMatchedMCHMID, const float dcaXY) { if (pt < minPt || maxPt < pt) { return false; } - if (rAtAbsorberEnd < minRabs || maxRabs < rAtAbsorberEnd) { return false; } - - if (chi2 < 0.f || maxChi2 < chi2) { + if (rAtAbsorberEnd < midRabs ? pDCA > maxPDCAforSmallR : pDCA > maxPDCAforLargeR) { return false; } @@ -191,17 +191,23 @@ struct matchingMFT { if (applyEtaCutToSAinGL && (etaMatchedMCHMID < minEtaGL || maxEtaGL < etaMatchedMCHMID)) { return false; } + if (maxDCAxy < dcaXY) { + return false; + } + if (chi2 < 0.f || maxChi2GL < chi2) { + return false; + } } else if (trackType == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { if (eta < minEtaSA || maxEtaSA < eta) { return false; } + if (chi2 < 0.f || maxChi2SA < chi2) { + return false; + } } else { return false; } - if (rAtAbsorberEnd < midRabs ? pDCA > maxPDCAforSmallR : pDCA > maxPDCAforLargeR) { - return false; - } return true; } @@ -225,7 +231,7 @@ struct matchingMFT { return; } - if (cfgRequireTrueAssociation && (mcParticle_MCHMID.mcCollisionId() != collision.mcCollisionId())) { + if (requireTrueAssociation && (mcParticle_MCHMID.mcCollisionId() != collision.mcCollisionId())) { return; } @@ -274,16 +280,21 @@ struct matchingMFT { pt = propmuonAtPV_Matched.getP() * std::sin(2.f * std::atan(std::exp(-eta))); } - if (!isSelected(pt, eta, rAtAbsorberEnd, pDCA, fwdtrack.chi2(), fwdtrack.trackType(), etaMatchedMCHMID)) { + if (!isSelected(pt, eta, rAtAbsorberEnd, pDCA, fwdtrack.chi2(), fwdtrack.trackType(), etaMatchedMCHMID, dcaXY)) { return; } + float deta = etaMatchedMCHMID - eta; + float dphi = phiMatchedMCHMID - phi; + o2::math_utils::bringToPMPi(dphi); + fRegistry.fill(HIST("hMuonType"), fwdtrack.trackType()); if (isPrimary) { if (isMatched) { fRegistry.fill(HIST("MFTMCHMID/primary/correct/hPt"), pt); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hEtaPhi"), phi, eta); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDeltaEtaDeltaPhi"), dphi, deta); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hSign"), fwdtrack.sign()); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hNclusters"), fwdtrack.nClusters()); @@ -312,6 +323,7 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hPt"), pt); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hEtaPhi"), phi, eta); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDeltaEtaDeltaPhi"), dphi, deta); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hSign"), fwdtrack.sign()); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hNclusters"), fwdtrack.nClusters()); @@ -342,6 +354,7 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hPt"), pt); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hEtaPhi"), phi, eta); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDeltaEtaDeltaPhi"), dphi, deta); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hSign"), fwdtrack.sign()); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hNclusters"), fwdtrack.nClusters()); @@ -370,6 +383,7 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hPt"), pt); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hEtaPhi"), phi, eta); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDeltaEtaDeltaPhi"), dphi, deta); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hSign"), fwdtrack.sign()); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hNclusters"), fwdtrack.nClusters()); From 66ecf308059a9d396812b20688822e8608077cf5 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Fri, 4 Apr 2025 23:11:56 +0200 Subject: [PATCH 0930/1650] [Common] update minRabs for global muons in fwdtrackPropagation.cxx (#10770) --- Common/TableProducer/fwdtrackPropagation.cxx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Common/TableProducer/fwdtrackPropagation.cxx b/Common/TableProducer/fwdtrackPropagation.cxx index aa4c1e7f21a..f5a4c941964 100644 --- a/Common/TableProducer/fwdtrackPropagation.cxx +++ b/Common/TableProducer/fwdtrackPropagation.cxx @@ -61,6 +61,7 @@ struct FwdTrackPropagation { Configurable maxEtaSA{"maxEtaSA", -2.5, "max. eta acceptance for MCH-MID"}; Configurable minEtaGL{"minEtaGL", -3.6, "min. eta acceptance for MFT-MCH-MID"}; Configurable maxEtaGL{"maxEtaGL", -2.5, "max. eta acceptance for MFT-MCH-MID"}; + Configurable minRabsGL{"minRabsGL", 27.6, "min. R at absorber end for global muon (min. eta = -3.6)"}; // std::tan(2.f * std::atan(std::exp(- -3.6)) ) * -505. Configurable minRabs{"minRabs", 17.6, "min. R at absorber end"}; Configurable midRabs{"midRabs", 26.5, "middle R at absorber end for pDCA cut"}; Configurable maxRabs{"maxRabs", 89.5, "max. R at absorber end"}; @@ -175,6 +176,9 @@ struct FwdTrackPropagation { if (chi2 < 0.f || maxChi2GL < chi2) { return false; } + if (rAtAbsorberEnd < minRabsGL || maxRabs < rAtAbsorberEnd) { + return false; + } } else if (trackType == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { if (eta < minEtaSA || maxEtaSA < eta) { return false; @@ -228,7 +232,7 @@ struct FwdTrackPropagation { } float rAtAbsorberEnd = matchedtrack.rAtAbsorberEnd(); // this works only for GlobalMuonTrack - if (rAtAbsorberEnd < minRabs || maxRabs < rAtAbsorberEnd) { + if (rAtAbsorberEnd < minRabsGL || maxRabs < rAtAbsorberEnd) { continue; } o2::dataformats::GlobalFwdTrack propmuonAtDCA = propagateMuon(matchedtrack, collision, propagationPoint::kToDCA); From 092719b0745195438cb38576ac86066caa0db969 Mon Sep 17 00:00:00 2001 From: Marvin Hemmer <53471402+mhemmer-cern@users.noreply.github.com> Date: Sat, 5 Apr 2025 13:19:01 +0200 Subject: [PATCH 0931/1650] [PWGJE,EMCAL-850] Add TVX check histogram for EMCal QA (#10767) --- PWGJE/Tasks/emcEventSelectionQA.cxx | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/PWGJE/Tasks/emcEventSelectionQA.cxx b/PWGJE/Tasks/emcEventSelectionQA.cxx index 4b2e9e06b67..3d2746630c8 100644 --- a/PWGJE/Tasks/emcEventSelectionQA.cxx +++ b/PWGJE/Tasks/emcEventSelectionQA.cxx @@ -29,6 +29,7 @@ using namespace o2::framework::expressions; using BCEvSels = o2::soa::Join; using CollEventSels = o2::soa::Join; +using FilteredCells = o2::soa::Filtered; struct EmcEventSelectionQA { o2::framework::HistogramRegistry mHistManager{"EMCALEventSelectionQAHistograms"}; @@ -36,13 +37,17 @@ struct EmcEventSelectionQA { // Require EMCAL cells (CALO type 1) Filter emccellfilter = aod::calo::caloType == 1; + const int mRun3MinNumber = 300000; + void init(o2::framework::InitContext const&) { using O2HistType = o2::framework::HistType; using O2Axis = o2::framework::AxisSpec; O2Axis matchingAxis{3, -0.5, 2.5, "Matching Status (0, 1, 2+ collisions)", "Matching status"}, // 0, no vertex,1 vertex found , 2 multiple vertices found - bcAxis{4001, -0.5, 4000.5, "bcid", "BC ID"}; + bcAxis{4001, -0.5, 4000.5, "bcid", "BC ID"}, + amplitudeAxisLarge{1000, 0., 100., "amplitudeLarge", "Amplitude (GeV)"}, + timeAxisLarge{1500, -600, 900, "celltime", "#it{t}_{cell} (ns)"}; mHistManager.add("hCollisionMatching", "Collision Status", O2HistType::kTH1F, {matchingAxis}); mHistManager.add("hCollisionMatchingReadout", "Collision Status EMCAL Readout", O2HistType::kTH1F, {matchingAxis}); @@ -71,10 +76,12 @@ struct EmcEventSelectionQA { mHistManager.add("hBCEmcalEJ2", "Bunch crossings with EJ2 trigger from CTP", O2HistType::kTH1F, {bcAxis}); mHistManager.add("hBCEmcalDJ2", "Bunch crossings with DJ2 trigger from CTP", O2HistType::kTH1F, {bcAxis}); mHistManager.add("hBCTVX", "Bunch crossings with FIT TVX trigger from CTP", O2HistType::kTH1F, {bcAxis}); + mHistManager.add("hBCNoTVXEmcalReadout", "Bunch crossings with no FIT TVX trigger from CTP but with EMCal im readout", O2HistType::kTH1F, {bcAxis}); mHistManager.add("hBCEmcalCellContent", "Bunch crossings with non-0 EMCAL cell content", O2HistType::kTH1F, {bcAxis}); mHistManager.add("hBCCollisionCounter_TVX", "Number of BCs with a certain number of rec. colls", O2HistType::kTH2F, {bcAxis, matchingAxis}); mHistManager.add("hBCEMCalReadoutAndEmcalCellContent", "Bunch crossings with EMCAL trigger from CTP and non-0 EMCAL cell content", O2HistType::kTH1F, {bcAxis}); mHistManager.add("hBCNotEMCalReadoutButEmcalCellContent", "Bunch crossings without EMCAL trigger from CTP but with non-0 EMCAL cell content", O2HistType::kTH1F, {bcAxis}); + mHistManager.add("hAmplitudevsCellTimeNoReadout", "Amplitude vs cell time for bunch crossings without EMCAL trigger from CTP but with non-0 EMCAL cell content", O2HistType::kTH2D, {timeAxisLarge, amplitudeAxisLarge}); initCollisionHistogram(mHistManager.get(HIST("hCollisionMatching")).get()); initCollisionHistogram(mHistManager.get(HIST("hCollisionMatchingReadout")).get()); @@ -92,6 +99,7 @@ struct EmcEventSelectionQA { } PresliceUnsorted perFoundBC = aod::evsel::foundBCId; + Preslice cellsPerFoundBC = aod::calo::bcId; void process(BCEvSels const& bcs, CollEventSels const& collisions, soa::Filtered const& cells) { @@ -112,7 +120,7 @@ struct EmcEventSelectionQA { bool isEMCALreadout = false; auto bcID = bc.globalBC() % 3564; - if (bc.runNumber() > 300000) { + if (bc.runNumber() > mRun3MinNumber) { // in case of run3 not all BCs contain EMCAL data, require trigger selection also for min. bias // in addition select also L0/L1 triggers as triggers with EMCAL in reaodut if (bc.alias_bit(kTVXinEMC) || bc.alias_bit(kEMC7) || bc.alias_bit(kEG1) || bc.alias_bit(kEG2) || bc.alias_bit(kDG1) || bc.alias_bit(kDG2) || bc.alias_bit(kEJ1) || bc.alias_bit(kEJ2) || bc.alias_bit(kDJ1) || bc.alias_bit(kDJ2)) { @@ -176,6 +184,10 @@ struct EmcEventSelectionQA { mHistManager.fill(HIST("hBCEMCalReadoutAndEmcalCellContent"), bcID); } else { mHistManager.fill(HIST("hBCNotEMCalReadoutButEmcalCellContent"), bcID); + auto cellsInBC = cells.sliceBy(cellsPerFoundBC, bc.globalIndex()); + for (const auto& cell : cellsInBC) { + mHistManager.fill(HIST("hAmplitudevsCellTimeNoReadout"), cell.time(), cell.amplitude()); + } } } } @@ -199,6 +211,9 @@ struct EmcEventSelectionQA { mHistManager.fill(HIST("hCollisionMatching"), collisionStatus); if (isEMCALreadout) { mHistManager.fill(HIST("hCollisionMatchingReadout"), collisionStatus); + if (!bc.selection_bit(aod::evsel::kIsTriggerTVX)) { + mHistManager.fill(HIST("hBCNoTVXEmcalReadout"), bcID); + } // various triggers if (bc.alias_bit(kTVXinEMC)) { mHistManager.fill(HIST("hCollisionMatchingMB"), collisionStatus); From 8ad825f3e8577c913aefb4ec76eb8f118de4b3f5 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Sat, 5 Apr 2025 20:48:57 +0200 Subject: [PATCH 0932/1650] [PWGEM/Dilepton] update table producer of muon (#10772) --- PWGEM/Dilepton/Core/Dilepton.h | 56 +++++++++------ PWGEM/Dilepton/Core/DileptonMC.h | 68 +++++++++++-------- PWGEM/Dilepton/Core/SingleTrackQC.h | 13 +++- PWGEM/Dilepton/Core/SingleTrackQCMC.h | 20 ++++-- PWGEM/Dilepton/DataModel/dileptonTables.h | 15 ++-- .../TableProducer/skimmerPrimaryMuon.cxx | 39 +++++++++-- PWGEM/Dilepton/Tasks/matchingMFT.cxx | 13 ++-- PWGEM/Dilepton/Utils/EMTrackUtilities.h | 28 ++++++++ 8 files changed, 177 insertions(+), 75 deletions(-) diff --git a/PWGEM/Dilepton/Core/Dilepton.h b/PWGEM/Dilepton/Core/Dilepton.h index fec5a3fcbad..19180bc2292 100644 --- a/PWGEM/Dilepton/Core/Dilepton.h +++ b/PWGEM/Dilepton/Core/Dilepton.h @@ -78,7 +78,7 @@ using MyElectron = MyElectrons::iterator; using FilteredMyElectrons = soa::Filtered; using FilteredMyElectron = FilteredMyElectrons::iterator; -using MyMuons = soa::Join; +using MyMuons = soa::Join; using MyMuon = MyMuons::iterator; using FilteredMyMuons = soa::Filtered; using FilteredMyMuon = FilteredMyMuons::iterator; @@ -771,8 +771,8 @@ struct Dilepton { } } - template - bool fillPairInfo(TCollision const& collision, TTrack1 const& t1, TTrack2 const& t2, TCut const& cut) + template + bool fillPairInfo(TCollision const& collision, TTrack1 const& t1, TTrack2 const& t2, TCut const& cut, TAllTracks const& tracks) { if constexpr (ev_id == 1) { if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { @@ -813,6 +813,13 @@ struct Dilepton { if (!cut.template IsSelectedTrack(t1) || !cut.template IsSelectedTrack(t2)) { return false; } + + if (!o2::aod::pwgem::dilepton::utils::emtrackutil::isBestMatch(t1, cut, tracks)) { + return false; + } + if (!o2::aod::pwgem::dilepton::utils::emtrackutil::isBestMatch(t2, cut, tracks)) { + return false; + } } } @@ -1112,8 +1119,8 @@ struct Dilepton { std::vector> used_trackIds; int ndf = 0; - template - void runPairing(TCollisions const& collisions, TLeptons const& posTracks, TLeptons const& negTracks, TPresilce const& perCollision, TCut const& cut) + template + void runPairing(TCollisions const& collisions, TLeptons const& posTracks, TLeptons const& negTracks, TPresilce const& perCollision, TCut const& cut, TAllTracks const& tracks) { for (auto& collision : collisions) { initCCDB(collision); @@ -1190,19 +1197,19 @@ struct Dilepton { int nuls = 0, nlspp = 0, nlsmm = 0; for (auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, negTracks_per_coll))) { // ULS - bool is_pair_ok = fillPairInfo<0>(collision, pos, neg, cut); + bool is_pair_ok = fillPairInfo<0>(collision, pos, neg, cut, tracks); if (is_pair_ok) { nuls++; } } for (auto& [pos1, pos2] : combinations(CombinationsStrictlyUpperIndexPolicy(posTracks_per_coll, posTracks_per_coll))) { // LS++ - bool is_pair_ok = fillPairInfo<0>(collision, pos1, pos2, cut); + bool is_pair_ok = fillPairInfo<0>(collision, pos1, pos2, cut, tracks); if (is_pair_ok) { nlspp++; } } for (auto& [neg1, neg2] : combinations(CombinationsStrictlyUpperIndexPolicy(negTracks_per_coll, negTracks_per_coll))) { // LS-- - bool is_pair_ok = fillPairInfo<0>(collision, neg1, neg2, cut); + bool is_pair_ok = fillPairInfo<0>(collision, neg1, neg2, cut, tracks); if (is_pair_ok) { nlsmm++; } @@ -1282,25 +1289,25 @@ struct Dilepton { for (auto& pos : selected_posTracks_in_this_event) { // ULS mix for (auto& neg : negTracks_from_event_pool) { - fillPairInfo<1>(collision, pos, neg, cut); + fillPairInfo<1>(collision, pos, neg, cut, tracks); } } for (auto& neg : selected_negTracks_in_this_event) { // ULS mix for (auto& pos : posTracks_from_event_pool) { - fillPairInfo<1>(collision, neg, pos, cut); + fillPairInfo<1>(collision, neg, pos, cut, tracks); } } for (auto& pos1 : selected_posTracks_in_this_event) { // LS++ mix for (auto& pos2 : posTracks_from_event_pool) { - fillPairInfo<1>(collision, pos1, pos2, cut); + fillPairInfo<1>(collision, pos1, pos2, cut, tracks); } } for (auto& neg1 : selected_negTracks_in_this_event) { // LS-- mix for (auto& neg2 : negTracks_from_event_pool) { - fillPairInfo<1>(collision, neg1, neg2, cut); + fillPairInfo<1>(collision, neg1, neg2, cut, tracks); } } } // end of loop over mixed event pool @@ -1315,8 +1322,8 @@ struct Dilepton { } // end of DF - template - bool isPairOK(TCollision const& collision, TTrack1 const& t1, TTrack2 const& t2, TCut const& cut) + template + bool isPairOK(TCollision const& collision, TTrack1 const& t1, TTrack2 const& t2, TCut const& cut, TAllTracks const& tracks) { if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { if (dielectroncuts.cfg_pid_scheme == static_cast(DielectronCut::PIDSchemes::kPIDML)) { @@ -1332,6 +1339,13 @@ struct Dilepton { if (!cut.IsSelectedTrack(t1) || !cut.IsSelectedTrack(t2)) { return false; } + + if (!o2::aod::pwgem::dilepton::utils::emtrackutil::isBestMatch(t1, cut, tracks)) { + return false; + } + if (!o2::aod::pwgem::dilepton::utils::emtrackutil::isBestMatch(t2, cut, tracks)) { + return false; + } } if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { @@ -1398,17 +1412,17 @@ struct Dilepton { auto negTracks_per_coll = negTracks.sliceByCached(perCollision, collision.globalIndex(), cache); for (auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, negTracks_per_coll))) { // ULS - if (isPairOK(collision, pos, neg, cut)) { + if (isPairOK(collision, pos, neg, cut, tracks)) { passed_pairIds.emplace_back(std::make_pair(pos.globalIndex(), neg.globalIndex())); } } for (auto& [pos1, pos2] : combinations(CombinationsStrictlyUpperIndexPolicy(posTracks_per_coll, posTracks_per_coll))) { // LS++ - if (isPairOK(collision, pos1, pos2, cut)) { + if (isPairOK(collision, pos1, pos2, cut, tracks)) { passed_pairIds.emplace_back(std::make_pair(pos1.globalIndex(), pos2.globalIndex())); } } for (auto& [neg1, neg2] : combinations(CombinationsStrictlyUpperIndexPolicy(negTracks_per_coll, negTracks_per_coll))) { // LS-- - if (isPairOK(collision, neg1, neg2, cut)) { + if (isPairOK(collision, neg1, neg2, cut, tracks)) { passed_pairIds.emplace_back(std::make_pair(neg1.globalIndex(), neg2.globalIndex())); } } @@ -1457,13 +1471,13 @@ struct Dilepton { if (cfgApplyWeightTTCA) { fillPairWeightMap(collisions, positive_electrons, negative_electrons, o2::aod::emprimaryelectron::emeventId, fDielectronCut, electrons); } - runPairing(collisions, positive_electrons, negative_electrons, o2::aod::emprimaryelectron::emeventId, fDielectronCut); + runPairing(collisions, positive_electrons, negative_electrons, o2::aod::emprimaryelectron::emeventId, fDielectronCut, electrons); } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { auto muons = std::get<0>(std::tie(args...)); if (cfgApplyWeightTTCA) { fillPairWeightMap(collisions, positive_muons, negative_muons, o2::aod::emprimarymuon::emeventId, fDimuonCut, muons); } - runPairing(collisions, positive_muons, negative_muons, o2::aod::emprimarymuon::emeventId, fDimuonCut); + runPairing(collisions, positive_muons, negative_muons, o2::aod::emprimarymuon::emeventId, fDimuonCut, muons); } map_weight.clear(); ndf++; @@ -1478,13 +1492,13 @@ struct Dilepton { if (cfgApplyWeightTTCA) { fillPairWeightMap(collisions, positive_electrons, negative_electrons, o2::aod::emprimaryelectron::emeventId, fDielectronCut, electrons); } - runPairing(collisions, positive_electrons, negative_electrons, o2::aod::emprimaryelectron::emeventId, fDielectronCut); + runPairing(collisions, positive_electrons, negative_electrons, o2::aod::emprimaryelectron::emeventId, fDielectronCut, electrons); } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { auto muons = std::get<0>(std::tie(args...)); if (cfgApplyWeightTTCA) { fillPairWeightMap(collisions, positive_muons, negative_muons, o2::aod::emprimarymuon::emeventId, fDimuonCut, muons); } - runPairing(collisions, positive_muons, negative_muons, o2::aod::emprimarymuon::emeventId, fDimuonCut); + runPairing(collisions, positive_muons, negative_muons, o2::aod::emprimarymuon::emeventId, fDimuonCut, muons); } map_weight.clear(); ndf++; diff --git a/PWGEM/Dilepton/Core/DileptonMC.h b/PWGEM/Dilepton/Core/DileptonMC.h index 90c88d7ab08..731a2493e7f 100644 --- a/PWGEM/Dilepton/Core/DileptonMC.h +++ b/PWGEM/Dilepton/Core/DileptonMC.h @@ -71,7 +71,7 @@ using MyMCElectron = MyMCElectrons::iterator; using FilteredMyMCElectrons = soa::Filtered; using FilteredMyMCElectron = FilteredMyMCElectrons::iterator; -using MyMCMuons = soa::Join; +using MyMCMuons = soa::Join; using MyMCMuon = MyMCMuons::iterator; using FilteredMyMCMuons = soa::Filtered; using FilteredMyMCMuon = FilteredMyMCMuons::iterator; @@ -753,8 +753,8 @@ struct DileptonMC { } } - template - bool fillTruePairInfo(TCollision const& collision, TMCCollisions const&, TTrack1 const& t1, TTrack2 const& t2, TCut const& cut, TMCParticles const& mcparticles) + template + bool fillTruePairInfo(TCollision const& collision, TMCCollisions const&, TTrack1 const& t1, TTrack2 const& t2, TCut const& cut, TAllTracks const& tracks, TMCParticles const& mcparticles) { auto t1mc = mcparticles.iteratorAt(t1.emmcparticleId()); auto t2mc = mcparticles.iteratorAt(t2.emmcparticleId()); @@ -789,6 +789,14 @@ struct DileptonMC { if (!cut.template IsSelectedTrack(t1) || !cut.template IsSelectedTrack(t2)) { return false; } + + if (!o2::aod::pwgem::dilepton::utils::emtrackutil::isBestMatch(t1, cut, tracks)) { + return false; + } + if (!o2::aod::pwgem::dilepton::utils::emtrackutil::isBestMatch(t2, cut, tracks)) { + return false; + } + if (!cut.IsSelectedPair(t1, t2)) { return false; } @@ -1184,8 +1192,8 @@ struct DileptonMC { Filter collisionFilter_occupancy_ft0c = eventcuts.cfgFT0COccupancyMin <= o2::aod::evsel::ft0cOccupancyInTimeRange && o2::aod::evsel::ft0cOccupancyInTimeRange < eventcuts.cfgFT0COccupancyMax; using FilteredMyCollisions = soa::Filtered; - template - void runTruePairing(TCollisions const& collisions, TMCLeptons const& posTracks, TMCLeptons const& negTracks, TPreslice const& perCollision, TCut const& cut, TMCCollisions const& mccollisions, TMCParticles const& mcparticles) + template + void runTruePairing(TCollisions const& collisions, TMCLeptons const& posTracks, TMCLeptons const& negTracks, TPreslice const& perCollision, TCut const& cut, TAllTracks const& tracks, TMCCollisions const& mccollisions, TMCParticles const& mcparticles) { for (auto& collision : collisions) { initCCDB(collision); @@ -1207,15 +1215,15 @@ struct DileptonMC { // LOGF(info, "centrality = %f , posTracks_per_coll.size() = %d, negTracks_per_coll.size() = %d", centralities[cfgCentEstimator], posTracks_per_coll.size(), negTracks_per_coll.size()); for (auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, negTracks_per_coll))) { // ULS - fillTruePairInfo(collision, mccollisions, pos, neg, cut, mcparticles); + fillTruePairInfo(collision, mccollisions, pos, neg, cut, tracks, mcparticles); } // end of ULS pair loop for (auto& [pos1, pos2] : combinations(CombinationsStrictlyUpperIndexPolicy(posTracks_per_coll, posTracks_per_coll))) { // LS++ - fillTruePairInfo(collision, mccollisions, pos1, pos2, cut, mcparticles); + fillTruePairInfo(collision, mccollisions, pos1, pos2, cut, tracks, mcparticles); } // end of LS++ pair loop for (auto& [neg1, neg2] : combinations(CombinationsStrictlyUpperIndexPolicy(negTracks_per_coll, negTracks_per_coll))) { // LS-- - fillTruePairInfo(collision, mccollisions, neg1, neg2, cut, mcparticles); + fillTruePairInfo(collision, mccollisions, neg1, neg2, cut, tracks, mcparticles); } // end of LS-- pair loop } // end of collision loop @@ -1790,8 +1798,8 @@ struct DileptonMC { } // end of collision loop } - template - bool isPairOK(TCollision const& collision, TTrack1 const& t1, TTrack2 const& t2, TCut const& cut) + template + bool isPairOK(TCollision const& collision, TTrack1 const& t1, TTrack2 const& t2, TCut const& cut, TAllTracks const& tracks) { if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { if (dielectroncuts.cfg_pid_scheme == static_cast(DielectronCut::PIDSchemes::kPIDML)) { @@ -1807,6 +1815,12 @@ struct DileptonMC { if (!cut.template IsSelectedTrack(t1) || !cut.template IsSelectedTrack(t2)) { return false; } + if (!o2::aod::pwgem::dilepton::utils::emtrackutil::isBestMatch(t1, cut, tracks)) { + return false; + } + if (!o2::aod::pwgem::dilepton::utils::emtrackutil::isBestMatch(t2, cut, tracks)) { + return false; + } } if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { @@ -1859,7 +1873,7 @@ struct DileptonMC { continue; } - if (isPairOK(collision, pos, neg, cut)) { + if (isPairOK(collision, pos, neg, cut, tracks)) { passed_pairIds.emplace_back(std::make_pair(pos.globalIndex(), neg.globalIndex())); } } @@ -1875,7 +1889,7 @@ struct DileptonMC { continue; } - if (isPairOK(collision, pos1, pos2, cut)) { + if (isPairOK(collision, pos1, pos2, cut, tracks)) { passed_pairIds.emplace_back(std::make_pair(pos1.globalIndex(), pos2.globalIndex())); } } @@ -1890,7 +1904,7 @@ struct DileptonMC { if (cfgEventGeneratorType >= 0 && mccollision_from_neg2.getSubGeneratorId() != cfgEventGeneratorType) { continue; } - if (isPairOK(collision, neg1, neg2, cut)) { + if (isPairOK(collision, neg1, neg2, cut, tracks)) { passed_pairIds.emplace_back(std::make_pair(neg1.globalIndex(), neg2.globalIndex())); } } @@ -1966,8 +1980,8 @@ struct DileptonMC { return true; } - template - void fillUnfolding(TCollisions const& collisions, TTracks1 const& posTracks, TTracks2 const& negTracks, TPresilce const& perCollision, TCut const& cut, TMCCollisions const&, TMCParticles const& mcparticles) + template + void fillUnfolding(TCollisions const& collisions, TTracks1 const& posTracks, TTracks2 const& negTracks, TPresilce const& perCollision, TCut const& cut, TAllTracks const& tracks, TMCCollisions const&, TMCParticles const& mcparticles) { for (auto& collision : collisions) { initCCDB(collision); @@ -2011,7 +2025,7 @@ struct DileptonMC { continue; } - if (!isPairOK(collision, pos, neg, cut)) { // without acceptance + if (!isPairOK(collision, pos, neg, cut, tracks)) { // without acceptance continue; } @@ -2149,7 +2163,7 @@ struct DileptonMC { continue; } - if (!isPairOK(collision, pos1, pos2, cut)) { // without acceptance + if (!isPairOK(collision, pos1, pos2, cut, tracks)) { // without acceptance continue; } @@ -2206,7 +2220,7 @@ struct DileptonMC { if (cfgEventGeneratorType >= 0 && mccollision_from_neg2.getSubGeneratorId() != cfgEventGeneratorType) { continue; } - if (!isPairOK(collision, neg1, neg2, cut)) { // without acceptance + if (!isPairOK(collision, neg1, neg2, cut, tracks)) { // without acceptance continue; } if ((std::abs(mcneg1.pdgCode()) != pdg_lepton || std::abs(mcneg2.pdgCode()) != pdg_lepton) || (mcneg1.emmceventId() != mcneg2.emmceventId())) { @@ -2223,7 +2237,7 @@ struct DileptonMC { continue; } - if (!isPairOK(collision, neg1, neg2, cut)) { // without acceptance + if (!isPairOK(collision, neg1, neg2, cut, tracks)) { // without acceptance continue; } @@ -2291,19 +2305,19 @@ struct DileptonMC { if (cfgApplyWeightTTCA) { fillPairWeightMap(collisions, positive_electrons, negative_electrons, o2::aod::emprimaryelectron::emeventId, fDielectronCut, leptons, mccollisions, mcparticles); } - runTruePairing(collisions, positive_electrons, negative_electrons, o2::aod::emprimaryelectron::emeventId, fDielectronCut, mccollisions, mcparticles); + runTruePairing(collisions, positive_electrons, negative_electrons, o2::aod::emprimaryelectron::emeventId, fDielectronCut, leptons, mccollisions, mcparticles); runGenInfo(collisions, mccollisions, positive_electronsMC, negative_electronsMC, mcparticles); if (cfgFillUnfolding) { - fillUnfolding(collisions, positive_electrons, negative_electrons, o2::aod::emprimaryelectron::emeventId, fDielectronCut, mccollisions, mcparticles); + fillUnfolding(collisions, positive_electrons, negative_electrons, o2::aod::emprimaryelectron::emeventId, fDielectronCut, leptons, mccollisions, mcparticles); } } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { if (cfgApplyWeightTTCA) { fillPairWeightMap(collisions, positive_muons, negative_muons, o2::aod::emprimarymuon::emeventId, fDimuonCut, leptons, mccollisions, mcparticles); } - runTruePairing(collisions, positive_muons, negative_muons, o2::aod::emprimarymuon::emeventId, fDimuonCut, mccollisions, mcparticles); + runTruePairing(collisions, positive_muons, negative_muons, o2::aod::emprimarymuon::emeventId, fDimuonCut, leptons, mccollisions, mcparticles); runGenInfo(collisions, mccollisions, positive_muonsMC, negative_muonsMC, mcparticles); if (cfgFillUnfolding) { - fillUnfolding(collisions, positive_muons, negative_muons, o2::aod::emprimarymuon::emeventId, fDimuonCut, mccollisions, mcparticles); + fillUnfolding(collisions, positive_muons, negative_muons, o2::aod::emprimarymuon::emeventId, fDimuonCut, leptons, mccollisions, mcparticles); } } map_weight.clear(); @@ -2322,19 +2336,19 @@ struct DileptonMC { if (cfgApplyWeightTTCA) { fillPairWeightMap(collisions, positive_electrons, negative_electrons, o2::aod::emprimaryelectron::emeventId, fDielectronCut, leptons, mccollisions, mcparticles_smeared); } - runTruePairing(collisions, positive_electrons, negative_electrons, o2::aod::emprimaryelectron::emeventId, fDielectronCut, mccollisions, mcparticles_smeared); + runTruePairing(collisions, positive_electrons, negative_electrons, o2::aod::emprimaryelectron::emeventId, fDielectronCut, leptons, mccollisions, mcparticles_smeared); runGenInfo(collisions, mccollisions, positive_electronsMC_smeared, negative_electronsMC_smeared, mcparticles_smeared); if (cfgFillUnfolding) { - fillUnfolding(collisions, positive_electrons, negative_electrons, o2::aod::emprimaryelectron::emeventId, fDielectronCut, mccollisions, mcparticles_smeared); + fillUnfolding(collisions, positive_electrons, negative_electrons, o2::aod::emprimaryelectron::emeventId, fDielectronCut, leptons, mccollisions, mcparticles_smeared); } } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { if (cfgApplyWeightTTCA) { fillPairWeightMap(collisions, positive_muons, negative_muons, o2::aod::emprimarymuon::emeventId, fDimuonCut, leptons, mccollisions, mcparticles_smeared); } - runTruePairing(collisions, positive_muons, negative_muons, o2::aod::emprimarymuon::emeventId, fDimuonCut, mccollisions, mcparticles_smeared); + runTruePairing(collisions, positive_muons, negative_muons, o2::aod::emprimarymuon::emeventId, fDimuonCut, leptons, mccollisions, mcparticles_smeared); runGenInfo(collisions, mccollisions, positive_muonsMC_smeared, negative_muonsMC_smeared, mcparticles_smeared); if (cfgFillUnfolding) { - fillUnfolding(collisions, positive_muons, negative_muons, o2::aod::emprimarymuon::emeventId, fDimuonCut, mccollisions, mcparticles_smeared); + fillUnfolding(collisions, positive_muons, negative_muons, o2::aod::emprimarymuon::emeventId, fDimuonCut, leptons, mccollisions, mcparticles_smeared); } } map_weight.clear(); diff --git a/PWGEM/Dilepton/Core/SingleTrackQC.h b/PWGEM/Dilepton/Core/SingleTrackQC.h index 2075a1ba0cf..1d7a2c696cb 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQC.h @@ -61,7 +61,7 @@ using MyElectron = MyElectrons::iterator; using FilteredMyElectrons = soa::Filtered; using FilteredMyElectron = FilteredMyElectrons::iterator; -using MyMuons = soa::Join; +using MyMuons = soa::Join; using MyMuon = MyMuons::iterator; using FilteredMyMuons = soa::Filtered; using FilteredMyMuon = FilteredMyMuons::iterator; @@ -267,7 +267,7 @@ struct SingleTrackQC { } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { const AxisSpec axis_pt{ConfPtlBins, "p_{T,#mu} (GeV/c)"}; const AxisSpec axis_eta{50, -6, -1, "#eta_{#mu}"}; - const AxisSpec axis_phi{90, 0, 2 * M_PI, "#varphi_{#mu} (rad.)"}; + const AxisSpec axis_phi{36, 0, 2 * M_PI, "#varphi_{#mu} (rad.)"}; const AxisSpec axis_dca{ConfDCABins, "DCA_{#mu}^{XY} (#sigma)"}; // track info @@ -281,7 +281,7 @@ struct SingleTrackQC { fRegistry.add("Track/positive/hDCAyRes_Pt", "DCA_{y} resolution vs. pT;p_{T} (GeV/c);DCA_{y} resolution (#mum)", kTH2F, {{100, 0, 10}, {500, 0, 500}}, false); fRegistry.add("Track/positive/hNclsMCH", "number of MCH clusters", kTH1F, {{21, -0.5, 20.5}}, false); fRegistry.add("Track/positive/hNclsMFT", "number of MFT clusters", kTH1F, {{11, -0.5, 10.5}}, false); - fRegistry.add("Track/positive/hPDCA", "pDCA;r at absorber end (cm);p #times DCA (GeV/c #upoint cm)", kTH2F, {{100, 0, 100}, {100, 0.0f, 1000}}, false); + fRegistry.add("Track/positive/hPDCA", "pDCA;R at absorber end (cm);p #times DCA (GeV/c #upoint cm)", kTH2F, {{100, 0, 100}, {100, 0.0f, 1000}}, false); fRegistry.add("Track/positive/hChi2", "chi2;chi2", kTH1F, {{100, 0.0f, 100}}, false); fRegistry.add("Track/positive/hChi2MatchMCHMID", "chi2 match MCH-MID;chi2", kTH1F, {{100, 0.0f, 100}}, false); fRegistry.add("Track/positive/hChi2MatchMCHMFT", "chi2 match MCH-MFT;chi2", kTH1F, {{100, 0.0f, 100}}, false); @@ -616,6 +616,10 @@ struct SingleTrackQC { if (!cut.template IsSelectedTrack(track)) { continue; } + if (!o2::aod::pwgem::dilepton::utils::emtrackutil::isBestMatch(track, cut, tracks)) { + continue; + } + fillMuonInfo(track); } // end of track loop } @@ -664,6 +668,9 @@ struct SingleTrackQC { if (!cut.template IsSelectedTrack(track)) { continue; } + if (!o2::aod::pwgem::dilepton::utils::emtrackutil::isBestMatch(track, cut, tracks)) { + continue; + } passed_trackIds.emplace_back(track.globalIndex()); } // end of track loop } diff --git a/PWGEM/Dilepton/Core/SingleTrackQCMC.h b/PWGEM/Dilepton/Core/SingleTrackQCMC.h index eaaa78d2687..c3aeedeb791 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQCMC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQCMC.h @@ -62,7 +62,7 @@ using MyMCElectrons = soa::Join; -using MyMCMuons = soa::Join; +using MyMCMuons = soa::Join; using MyMCMuon = MyMCMuons::iterator; using FilteredMyMCMuons = soa::Filtered; @@ -311,7 +311,7 @@ struct SingleTrackQCMC { } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { const AxisSpec axis_pt{ConfPtlBins, "p_{T,#mu} (GeV/c)"}; const AxisSpec axis_eta{50, -6, -1, "#eta_{#mu}"}; - const AxisSpec axis_phi{90, 0.0, 2 * M_PI, "#varphi_{#mu} (rad.)"}; + const AxisSpec axis_phi{36, 0.0, 2 * M_PI, "#varphi_{#mu} (rad.)"}; const AxisSpec axis_dca{ConfDCABins, "DCA_{#mu}^{XY} (#sigma)"}; const AxisSpec axis_charge_gen{3, -1.5, +1.5, "true charge"}; @@ -338,7 +338,7 @@ struct SingleTrackQCMC { fRegistry.add("Track/lf/positive/hDCAyRes_Pt", "DCA_{y} resolution vs. pT;p_{T} (GeV/c);DCA_{y} resolution (#mum)", kTH2F, {{100, 0, 10}, {500, 0, 500}}, false); fRegistry.add("Track/lf/positive/hNclsMCH", "number of MCH clusters", kTH1F, {{21, -0.5, 20.5}}, false); fRegistry.add("Track/lf/positive/hNclsMFT", "number of MFT clusters", kTH1F, {{11, -0.5, 10.5}}, false); - fRegistry.add("Track/lf/positive/hPDCA", "pDCA;r at absorber (cm);p #times DCA (GeV/c #upoint cm)", kTH2F, {{100, 0, 100}, {100, 0.0f, 1000}}, false); + fRegistry.add("Track/lf/positive/hPDCA", "pDCA;R at absorber (cm);p #times DCA (GeV/c #upoint cm)", kTH2F, {{100, 0, 100}, {100, 0.0f, 1000}}, false); fRegistry.add("Track/lf/positive/hChi2", "chi2;chi2", kTH1F, {{100, 0.0f, 100}}, false); fRegistry.add("Track/lf/positive/hChi2MatchMCHMID", "chi2 match MCH-MID;chi2", kTH1F, {{100, 0.0f, 100}}, false); fRegistry.add("Track/lf/positive/hChi2MatchMCHMFT", "chi2 match MCH-MFT;chi2", kTH1F, {{100, 0.0f, 100}}, false); @@ -728,6 +728,9 @@ struct SingleTrackQCMC { if (!isInAcceptance(mctrack)) { continue; } + if (!mctrack.has_mothers()) { + continue; + } auto mccollision_from_track = mctrack.template emmcevent_as(); if (cfgEventGeneratorType >= 0 && mccollision_from_track.getSubGeneratorId() != cfgEventGeneratorType) { @@ -752,11 +755,11 @@ struct SingleTrackQCMC { if (!cut.template IsSelectedTrack(track)) { continue; } + if (!o2::aod::pwgem::dilepton::utils::emtrackutil::isBestMatch(track, cut, tracks)) { + continue; + } } - if (!mctrack.has_mothers()) { - continue; - } auto mcmother = mcparticles.iteratorAt(mctrack.mothersIds()[0]); int pdg_mother = std::abs(mcmother.pdgCode()); @@ -941,10 +944,13 @@ struct SingleTrackQCMC { if (cfgEventGeneratorType >= 0 && mccollision_from_track.getSubGeneratorId() != cfgEventGeneratorType) { continue; } - if (!cut.template IsSelectedTrack(track)) { continue; } + + if (!o2::aod::pwgem::dilepton::utils::emtrackutil::isBestMatch(track, cut, tracks)) { + continue; + } passed_trackIds.emplace_back(track.globalIndex()); } // end of track loop } diff --git a/PWGEM/Dilepton/DataModel/dileptonTables.h b/PWGEM/Dilepton/DataModel/dileptonTables.h index 2084b0dbf4d..7ae349d91cc 100644 --- a/PWGEM/Dilepton/DataModel/dileptonTables.h +++ b/PWGEM/Dilepton/DataModel/dileptonTables.h @@ -529,11 +529,12 @@ using EMPrimaryElectronPrefilterBitDerived = EMPrimaryElectronsPrefilterBitDeriv namespace emprimarymuon { -DECLARE_SOA_INDEX_COLUMN(EMEvent, emevent); //! -DECLARE_SOA_COLUMN(CollisionId, collisionId, int); //! -DECLARE_SOA_COLUMN(FwdTrackId, fwdtrackId, int); //! -DECLARE_SOA_COLUMN(MFTTrackId, mfttrackId, int); //! -DECLARE_SOA_COLUMN(MCHTrackId, mchtrackId, int); //! +DECLARE_SOA_INDEX_COLUMN(EMEvent, emevent); //! +DECLARE_SOA_COLUMN(CollisionId, collisionId, int); //! +DECLARE_SOA_COLUMN(FwdTrackId, fwdtrackId, int); //! +DECLARE_SOA_COLUMN(MFTTrackId, mfttrackId, int); //! +DECLARE_SOA_COLUMN(MCHTrackId, mchtrackId, int); //! +DECLARE_SOA_SELF_ARRAY_INDEX_COLUMN(GlobalMuonsWithSameMFT, globalMuonsWithSameMFT); //! self indices to global muons that have the same MFTTrackId DECLARE_SOA_SELF_ARRAY_INDEX_COLUMN(AmbiguousMuons, ambiguousMuons); DECLARE_SOA_COLUMN(CXXatDCA, cXXatDCA, float); //! DCAx resolution squared at DCA DECLARE_SOA_COLUMN(CYYatDCA, cYYatDCA, float); //! DCAy resolution squared at DCA @@ -621,6 +622,10 @@ DECLARE_SOA_TABLE(EMAmbiguousMuonSelfIds, "AOD", "EMAMBMUSELFID", emprimarymuon: // iterators using EMAmbiguousMuonSelfId = EMAmbiguousMuonSelfIds::iterator; +DECLARE_SOA_TABLE(EMGlobalMuonSelfIds, "AOD", "EMGLMUSELFID", emprimarymuon::GlobalMuonsWithSameMFTIds); // To be joined with EMPrimaryMuons table at analysis level. +// iterators +using EMGlobalMuonSelfId = EMGlobalMuonSelfIds::iterator; + } // namespace o2::aod #endif // PWGEM_DILEPTON_DATAMODEL_DILEPTONTABLES_H_ diff --git a/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx b/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx index 3e17b8845cc..b64682ec120 100644 --- a/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx +++ b/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx @@ -304,14 +304,14 @@ struct associateAmbiguousMuon { void process(aod::EMPrimaryMuons const& muons) { - for (auto& muon : muons) { + for (const auto& muon : muons) { auto muons_with_same_trackId = muons.sliceBy(perTrack, muon.fwdtrackId()); ambmuon_self_Ids.reserve(muons_with_same_trackId.size()); - for (auto& amp_muon : muons_with_same_trackId) { - if (amp_muon.globalIndex() == muon.globalIndex()) { // don't store myself. + for (const auto& amb_muon : muons_with_same_trackId) { + if (amb_muon.globalIndex() == muon.globalIndex()) { // don't store myself. continue; } - ambmuon_self_Ids.emplace_back(amp_muon.globalIndex()); + ambmuon_self_Ids.emplace_back(amb_muon.globalIndex()); } em_amb_muon_ids(ambmuon_self_Ids); ambmuon_self_Ids.clear(); @@ -319,9 +319,38 @@ struct associateAmbiguousMuon { } } }; +struct associateSameMFT { + Produces em_same_mft_ids; + + SliceCache cache; + PresliceUnsorted perMFTTrack = o2::aod::emprimarymuon::mfttrackId; + std::vector self_Ids; + + void process(aod::EMPrimaryMuons const& muons) + { + for (const auto& muon : muons) { + if (muon.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) { + auto muons_with_same_mfttrackId = muons.sliceBy(perMFTTrack, muon.mfttrackId()); + self_Ids.reserve(muons_with_same_mfttrackId.size()); + for (const auto& global_muon : muons_with_same_mfttrackId) { + if (global_muon.globalIndex() == muon.globalIndex()) { // don't store myself. + continue; + } + self_Ids.emplace_back(global_muon.globalIndex()); + } + em_same_mft_ids(self_Ids); + self_Ids.clear(); + self_Ids.shrink_to_fit(); + } else { // for standalone muons + em_same_mft_ids(std::vector{}); // empty + } + } // end of muon loop + } +}; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ adaptAnalysisTask(cfgc, TaskName{"skimmer-primary-muon"}), - adaptAnalysisTask(cfgc, TaskName{"associate-ambiguous-muon"})}; + adaptAnalysisTask(cfgc, TaskName{"associate-ambiguous-muon"}), + adaptAnalysisTask(cfgc, TaskName{"associate-same-mft"})}; } diff --git a/PWGEM/Dilepton/Tasks/matchingMFT.cxx b/PWGEM/Dilepton/Tasks/matchingMFT.cxx index 81f3a91669f..b5e71cf7837 100644 --- a/PWGEM/Dilepton/Tasks/matchingMFT.cxx +++ b/PWGEM/Dilepton/Tasks/matchingMFT.cxx @@ -60,6 +60,7 @@ struct matchingMFT { Configurable maxEtaSA{"maxEtaSA", -2.5, "max. eta acceptance for MCH-MID"}; Configurable minEtaGL{"minEtaGL", -3.6, "min. eta acceptance for MFT-MCH-MID"}; Configurable maxEtaGL{"maxEtaGL", -2.5, "max. eta acceptance for MFT-MCH-MID"}; + Configurable minRabsGL{"minRabsGL", 27.6, "min. R at absorber end for global muons (min. eta = -3.6)"}; // std::tan(2.f * std::atan(std::exp(- -3.6)) ) * -505. Configurable minRabs{"minRabs", 17.6, "min. R at absorber end"}; Configurable midRabs{"midRabs", 26.5, "middle R at absorber end for pDCA cut"}; Configurable maxRabs{"maxRabs", 89.5, "max. R at absorber end"}; @@ -70,7 +71,6 @@ struct matchingMFT { Configurable maxChi2SA{"maxChi2SA", 1e+6, "max. chi2 for standalone muon"}; Configurable maxChi2GL{"maxChi2GL", 1e+6, "max. chi2 for global muon"}; Configurable refitGlobalMuon{"refitGlobalMuon", true, "flag to refit global muon"}; - Configurable applyEtaCutToSAinGL{"applyEtaCutToSAinGL", false, "flag to apply eta cut to samuon in global muon"}; Configurable requireTrueAssociation{"requireTrueAssociation", false, "flag to require true mc collision association"}; Configurable cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"}; @@ -172,7 +172,7 @@ struct matchingMFT { fRegistry.addClone("MFTMCHMID/primary/", "MFTMCHMID/secondary/"); } - bool isSelected(const float pt, const float eta, const float rAtAbsorberEnd, const float pDCA, const float chi2, const uint8_t trackType, const float etaMatchedMCHMID, const float dcaXY) + bool isSelected(const float pt, const float eta, const float rAtAbsorberEnd, const float pDCA, const float chi2, const uint8_t trackType, const float dcaXY) { if (pt < minPt || maxPt < pt) { return false; @@ -188,15 +188,15 @@ struct matchingMFT { if (eta < minEtaGL || maxEtaGL < eta) { return false; } - if (applyEtaCutToSAinGL && (etaMatchedMCHMID < minEtaGL || maxEtaGL < etaMatchedMCHMID)) { - return false; - } if (maxDCAxy < dcaXY) { return false; } if (chi2 < 0.f || maxChi2GL < chi2) { return false; } + if (rAtAbsorberEnd < minRabsGL || maxRabs < rAtAbsorberEnd) { + return false; + } } else if (trackType == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { if (eta < minEtaSA || maxEtaSA < eta) { return false; @@ -269,7 +269,6 @@ struct matchingMFT { float dcaY_Matched = propmuonAtDCA_Matched.getY() - collision.posY(); float dcaXY_Matched = std::sqrt(dcaX_Matched * dcaX_Matched + dcaY_Matched * dcaY_Matched); float pDCA = mchtrack.p() * dcaXY_Matched; - int nClustersMFT = mfttrack.nClusters(); float chi2mft = mfttrack.chi2(); @@ -280,7 +279,7 @@ struct matchingMFT { pt = propmuonAtPV_Matched.getP() * std::sin(2.f * std::atan(std::exp(-eta))); } - if (!isSelected(pt, eta, rAtAbsorberEnd, pDCA, fwdtrack.chi2(), fwdtrack.trackType(), etaMatchedMCHMID, dcaXY)) { + if (!isSelected(pt, eta, rAtAbsorberEnd, pDCA, fwdtrack.chi2(), fwdtrack.trackType(), dcaXY)) { return; } diff --git a/PWGEM/Dilepton/Utils/EMTrackUtilities.h b/PWGEM/Dilepton/Utils/EMTrackUtilities.h index d71211c1321..77a1c8ca7ed 100644 --- a/PWGEM/Dilepton/Utils/EMTrackUtilities.h +++ b/PWGEM/Dilepton/Utils/EMTrackUtilities.h @@ -18,6 +18,7 @@ #include #include #include +#include //_______________________________________________________________________ namespace o2::aod::pwgem::dilepton::utils::emtrackutil @@ -73,6 +74,33 @@ float fwdDcaXYinSigma(T const& track) // } } //_______________________________________________________________________ +template +bool isBestMatch(TTrack const& track, TCut const& cut, TTracks const& tracks) +{ + // this is only for muon at forward rapidity + if (track.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) { + std::map map_chi2MCHMFT; + map_chi2MCHMFT[track.globalIndex()] = track.chi2MatchMCHMFT(); // add myself + for (const auto& glmuonId : track.globalMuonsWithSameMFTIds()) { + const auto& candidate = tracks.rawIteratorAt(glmuonId); + if (candidate.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) { + if (cut.template IsSelectedTrack(candidate)) { + map_chi2MCHMFT[candidate.globalIndex()] = candidate.chi2MatchMCHMFT(); + } + } + } + if (map_chi2MCHMFT.begin()->first == track.globalIndex()) { // search for minimum matching-chi2 + map_chi2MCHMFT.clear(); + return true; + } else { + map_chi2MCHMFT.clear(); + return false; + } + } else { + return true; + } +} +//_______________________________________________________________________ template float sigmaPt(T const& track) { From e00539d289b82f59cc23645d04345f9aeeee9a6a Mon Sep 17 00:00:00 2001 From: Roberta Ferioli <142217183+Roberta-Ferioli@users.noreply.github.com> Date: Sat, 5 Apr 2025 21:30:41 +0200 Subject: [PATCH 0933/1650] [PWGLF] Fix histograms for efficiency evaluation (#10774) Co-authored-by: ALICE Action Bot --- .../Tasks/Nuspex/nucleiFromHypertritonMap.cxx | 83 +++++++++++++------ 1 file changed, 59 insertions(+), 24 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/nucleiFromHypertritonMap.cxx b/PWGLF/Tasks/Nuspex/nucleiFromHypertritonMap.cxx index ace8de3fa99..dc4e70c2ee3 100644 --- a/PWGLF/Tasks/Nuspex/nucleiFromHypertritonMap.cxx +++ b/PWGLF/Tasks/Nuspex/nucleiFromHypertritonMap.cxx @@ -84,45 +84,81 @@ struct nucleiFromHypertritonMap { registryMC.add("he3SecPtRec_from_hypertriton", "he3SecPtRec_from_hypertriton", HistType::kTH1F, {{nbin_pt, min_pt, max_pt, "p_{T} (GeV/c)"}}); registryMC.add("hyperHe4Ptgen", "hyperHe4PtGen", HistType::kTH1F, {{nbin_pt, min_pt, max_pt, "p_{T} (GeV/c)"}}); registryMC.add("he3SecPtRec_from_hyperHe4", "he3SecPtRec_from_hyperHe4", HistType::kTH1F, {{nbin_pt, min_pt, max_pt, "p_{T} (GeV/c)"}}); + registryMC.add("he3PtRec", "he3PtRec", HistType::kTH1F, {{nbin_pt, min_pt, max_pt, "p_{T} (GeV/c)"}}); + registryMC.add("he3PtGen", "he3PtGen", HistType::kTH1F, {{nbin_pt, min_pt, max_pt, "p_{T} (GeV/c)"}}); } else { registryMC.add("deutSecPtRec_from_hypertriton", "deutSecPtRec_from_hypertriton", HistType::kTH1F, {{nbin_pt, min_pt, max_pt, "p_{T} (GeV/c)"}}); + registryMC.add("deutPtRec", "deutPtRec", HistType::kTH1F, {{nbin_pt, min_pt, max_pt, "p_{T} (GeV/c)"}}); + registryMC.add("deutPtgen", "deutPtGen", HistType::kTH1F, {{nbin_pt, min_pt, max_pt, "p_{T} (GeV/c)"}}); } } - void processMC(aod::McParticles const& /*mcParticles*/, const MCTracks& tracks) + void processMC(const aod::McParticles& mcParticles, const MCTracks& tracks) { + int selectedPDG = 0; + if (saveHelium) { + selectedPDG = AntihePDG; + } else { + selectedPDG = AntideuteronPDG; + } + + for (const auto& mcparticle : mcParticles) { + if (((mcparticle.pdgCode() == AntiHypertritonPDG || mcparticle.pdgCode() == AntiHyperHelium4PDG) && mcparticle.has_daughters()) || mcparticle.pdgCode() == selectedPDG) { + if (mcparticle.pdgCode() == AntiHypertritonPDG) { + for (auto& daughter : mcparticle.daughters_as()) { + if (daughter.pdgCode() == selectedPDG) { + registryMC.fill(HIST("hypertritonPtgen"), mcparticle.pt()); + } + } + } + if (mcparticle.pdgCode() == AntiHyperHelium4PDG) { + for (auto& daughter : mcparticle.daughters_as()) { + if (daughter.pdgCode() == selectedPDG) { + registryMC.fill(HIST("hyperHe4Ptgen"), mcparticle.pt()); + } + } + } + if (mcparticle.pdgCode() == AntihePDG) { + registryMC.fill(HIST("he3PtGen"), mcparticle.pt()); + } + if (mcparticle.pdgCode() == AntideuteronPDG) { + registryMC.fill(HIST("deutPtGen"), mcparticle.pt()); + } + } + } + for (const auto& track : tracks) { if (!track.has_mcParticle()) { continue; } auto mcparticle = track.mcParticle(); - if (saveHelium) { - if (mcparticle.pdgCode() != AntihePDG || mcparticle.isPhysicalPrimary()) { - continue; - } - } else { - if (mcparticle.pdgCode() != AntideuteronPDG || mcparticle.isPhysicalPrimary()) { - continue; - } + if (mcparticle.pdgCode() != selectedPDG) { + continue; + } + + if (track.itsNCls() < min_ITS_nClusters || + track.tpcNClsFound() < min_TPC_nClusters || + track.tpcNClsCrossedRows() < min_TPC_nCrossedRows || + track.tpcNClsCrossedRows() < 0.8 * track.tpcNClsFindable() || + track.tpcChi2NCl() > 4.f || + track.tpcChi2NCl() < min_chi2_TPC || + track.eta() < min_eta || track.eta() > max_eta || + track.dcaXY() > max_dcaxy || track.dcaXY() < -max_dcaxy || + track.dcaZ() > max_dcaz || track.dcaZ() < -max_dcaz || + track.itsChi2NCl() > 36.f) { + continue; + } + if (mcparticle.pdgCode() == AntideuteronPDG) { + registryMC.fill(HIST("deutPtRec"), track.pt()); + } + if (mcparticle.pdgCode() == AntihePDG) { + registryMC.fill(HIST("he3PtRec"), 2 * track.pt()); } for (auto& motherparticle : mcparticle.mothers_as()) { if (motherparticle.pdgCode() == AntiHypertritonPDG || motherparticle.pdgCode() == AntiHyperHelium4PDG) { - if (track.itsNCls() < min_ITS_nClusters || - track.tpcNClsFound() < min_TPC_nClusters || - track.tpcNClsCrossedRows() < min_TPC_nCrossedRows || - track.tpcNClsCrossedRows() < 0.8 * track.tpcNClsFindable() || - track.tpcChi2NCl() > 4.f || - track.tpcChi2NCl() < min_chi2_TPC || - track.eta() < min_eta || track.eta() > max_eta || - track.dcaXY() > max_dcaxy || track.dcaXY() < -max_dcaxy || - track.dcaZ() > max_dcaz || track.dcaZ() < -max_dcaz || - track.itsChi2NCl() > 36.f) { - continue; - } if (motherparticle.pdgCode() == AntiHypertritonPDG) { - registryMC.fill(HIST("hypertritonPtgen"), motherparticle.pt()); - if (saveHelium) { + if (mcparticle.pdgCode() == AntihePDG) { registryMC.fill(HIST("he3SecPtRec_from_hypertriton"), 2 * track.pt()); } else { registryMC.fill(HIST("deutSecPtRec_from_hypertriton"), track.pt()); @@ -130,7 +166,6 @@ struct nucleiFromHypertritonMap { } if (motherparticle.pdgCode() == AntiHyperHelium4PDG) { registryMC.fill(HIST("he3SecPtRec_from_hyperHe4"), 2 * track.pt()); - registryMC.fill(HIST("hyperHe4Ptgen"), motherparticle.pt()); } } } From ca4e9100c61a23bbc49d2af0ff330f18bf73b608 Mon Sep 17 00:00:00 2001 From: Noor Koster <82090643+cnkoster@users.noreply.github.com> Date: Sun, 6 Apr 2025 22:16:05 +0200 Subject: [PATCH 0934/1650] [PWGCF] fix nua fill statements to include all (#10775) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/flowSP.cxx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowSP.cxx b/PWGCF/Flow/Tasks/flowSP.cxx index a5207c6b95b..9be9242c107 100644 --- a/PWGCF/Flow/Tasks/flowSP.cxx +++ b/PWGCF/Flow/Tasks/flowSP.cxx @@ -1094,10 +1094,12 @@ struct FlowSP { // Fill NUA weights if (cfgFillWeights) { fWeights->fill(track.phi(), track.eta(), vtxz, track.pt(), centrality, 0); - } else if (cfgFillWeightsPOS) { + } + if (cfgFillWeightsPOS) { if (pos) fWeightsPOS->fill(track.phi(), track.eta(), vtxz, track.pt(), centrality, 0); - } else if (cfgFillWeightsNEG) { + } + if (cfgFillWeightsNEG) { if (!pos) fWeightsNEG->fill(track.phi(), track.eta(), vtxz, track.pt(), centrality, 0); } From fdac486bb470b788bcd15e485e868e71cdc75dbe Mon Sep 17 00:00:00 2001 From: Mattia Faggin Date: Mon, 7 Apr 2025 10:20:10 +0200 Subject: [PATCH 0935/1650] [PWGHF] Fix matching to MC for generated Sc(2455). (#10766) Co-authored-by: Mattia Faggin --- PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx b/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx index 62a7131295b..e882dcd2dba 100644 --- a/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx +++ b/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx @@ -515,7 +515,7 @@ struct HfCandidateSigmac0plusplusMc { if (std::abs(daughter.pdgCode()) != Pdg::kLambdaCPlus) continue; // if (std::abs(daughter.flagMcMatchGen()) == (1 << aod::hf_cand_3prong::DecayType::LcToPKPi)) { - if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kLambdaCPlus, std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2)) { + if (RecoDecay::isMatchedMCGen(mcParticles, daughter, Pdg::kLambdaCPlus, std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2)) { /// Λc+ daughter decaying in pK-π+ found! flag = sign * (1 << aod::hf_cand_sigmac::DecayType::Sc0ToPKPiPi); break; @@ -529,7 +529,7 @@ struct HfCandidateSigmac0plusplusMc { if (std::abs(daughter.pdgCode()) != Pdg::kLambdaCPlus) continue; // if (std::abs(daughter.flagMcMatchGen()) == (1 << aod::hf_cand_3prong::DecayType::LcToPKPi)) { - if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kLambdaCPlus, std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2)) { + if (RecoDecay::isMatchedMCGen(mcParticles, daughter, Pdg::kLambdaCPlus, std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2)) { /// Λc+ daughter decaying in pK-π+ found! flag = sign * (1 << aod::hf_cand_sigmac::DecayType::ScplusplusToPKPiPi); break; @@ -539,7 +539,6 @@ struct HfCandidateSigmac0plusplusMc { /// check the origin (prompt vs. non-prompt) if (flag != 0) { - auto particle = mcParticles.rawIteratorAt(indexRec); origin = RecoDecay::getCharmHadronOrigin(mcParticles, particle, false, &idxBhadMothers); } /// fill the table with results of generation level MC matching From f610c7546da60a8d5a34008cb2de9f148ea401cf Mon Sep 17 00:00:00 2001 From: Chiara Pinto <48326672+chiarapinto@users.noreply.github.com> Date: Mon, 7 Apr 2025 13:48:52 +0200 Subject: [PATCH 0936/1650] [PWGLF] debugging angular correlation pp histo filling (#10762) Co-authored-by: ALICE Builder --- .../Nuspex/angularCorrelationsInJets.cxx | 612 ++++++------------ 1 file changed, 195 insertions(+), 417 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx b/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx index 0f66b48ce6b..a02c789ed37 100644 --- a/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx +++ b/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx @@ -30,12 +30,7 @@ #include "Common/DataModel/PIDResponse.h" #include "Common/Core/PID/PIDTOF.h" #include "Common/TableProducer/PID/pidTOFBase.h" -#include "Common/DataModel/McCollisionExtra.h" -#include "PWGDQ/DataModel/ReducedInfoTables.h" -#include "PWGJE/Core/JetDerivedDataUtilities.h" -#include "PWGJE/DataModel/JetReducedData.h" -#include "PWGJE/DataModel/Jet.h" -#include "PWGJE/Core/FastJetUtilities.h" +#include "Common/Core/RecoDecay.h" #include "fastjet/PseudoJet.hh" #include "fastjet/AreaDefinition.hh" @@ -83,15 +78,14 @@ struct AngularCorrelationsInJets { Configurable maxChi2TPC{"maxChi2TPC", 4.0, "max chi2 per cluster TPC"}; Configurable maxDCAxy{"maxDCAxy", 0.05, "max DCA to vertex xy"}; Configurable maxDCAz{"maxDCAz", 0.05, "max DCA to vertex z"}; - Configurable maxEta{"maxEta", 0.8, "max pseudorapidity"}; // consider jet cone - Configurable deltaEtaEdge{"deltaEtaEdge", 0.05, "min eta distance of jet from acceptance edge"}; // consider jet cone + Configurable maxEta{"maxEta", 0.8, "max pseudorapidity"}; + Configurable deltaEtaEdge{"deltaEtaEdge", 0.05, "min eta distance of jet from acceptance edge"}; Configurable minTrackPt{"minTrackPt", 0.3, "minimum track pT"}; Configurable requirePVContributor{"requirePVContributor", false, "require track to be PV contributor"}; // Jet Cuts Configurable jetR{"jetR", 0.4, "jet resolution parameter"}; Configurable minJetPt{"minJetPt", 10.0, "minimum total pT to accept jet"}; - // Configurable minJetParticlePt{"minJetParticlePt", 0.0, "minimum pT to accept jet particle"}; // Proton Cuts Configurable protonDCAxyYield{"protonDCAxyYield", 0.05, "[proton] DCAxy cut for yield"}; @@ -102,7 +96,8 @@ struct AngularCorrelationsInJets { Configurable protonTPCnsigmaLowPtYield{"protonTPCnsigmaLowPtYield", 4.0, "[proton] max TPC nsigma with low pT for yield"}; Configurable protonTPCnsigmaHighPtYield{"protonTPCnsigmaHighPtYield", 4.0, "[proton] max TPC nsigma with high pT for yield"}; Configurable protonTOFnsigmaHighPtYield{"protonTOFnsigmaHighPtYield", 4.0, "[proton] max TOF nsigma with high pT yield"}; - Configurable protonNsigma{"protonNsigma", 2.0, "[proton] max combined nsigma for CF (sqrt(nsigTPC^2 + nsigTOF^2))"}; + Configurable protonTPCnsigma{"protonTPCnsigma", 4.0, "[proton] max TPC nsigma for pt > 0/1.5/3.0 GeV"}; + Configurable protonTOFnsigma{"protonTOFnsigma", 3.0, "[proton] max TOF nsigma for pt > 0/1.5/3.0 GeV"}; // Antiproton Cuts Configurable antiprotonDCAxyYield{"antiprotonDCAxyYield", 0.05, "[antiproton] DCAxy cut for yield"}; @@ -113,7 +108,8 @@ struct AngularCorrelationsInJets { Configurable antiprotonTPCnsigmaLowPtYield{"antiprotonTPCnsigmaLowPtYield", 4.0, "[antiproton] max TPC nsigma with low pT for yield"}; Configurable antiprotonTPCnsigmaHighPtYield{"antiprotonTPCnsigmaHighPtYield", 4.0, "[antiproton] max TPC nsigma with high pT for yield"}; Configurable antiprotonTOFnsigmaHighPtYield{"antiprotonTOFnsigmaHighPtYield", 4.0, "[antiproton] min TOF nsigma with high pT for yield"}; - Configurable antiprotonNsigma{"antiprotonNsigma", 2.0, "[antiproton] max combined nsigma for CF (sqrt(nsigTPC^2 + nsigTOF^2))"}; + Configurable antiprotonTPCnsigma{"antiprotonTPCnsigma", 4.0, "[antiproton] max TPC nsigma for pt > 0/1.5/3.0 GeV"}; + Configurable antiprotonTOFnsigma{"antiprotonTOFnsigma", 3.0, "[antiproton] max TOF nsigma for pt > 0/1.5/3.0 GeV"}; // Nuclei Cuts Configurable nucleiDCAxyYield{"nucleiDCAxyYield", 0.05, "[nuclei] DCAxy cut for yield"}; @@ -152,40 +148,35 @@ struct AngularCorrelationsInJets { Configurable zVtx{"zVtx", 10.0, "max zVertex"}; Configurable rMax{"rMax", 0.4, "Maximum radius for jet and UE regions"}; + double maxDCAzForFilter = 2.0; + double maxEtaForFilter = 0.8; + double minTrackPtForFilter = 0.1; + Service ccdb; int mRunNumber; using FullTracksRun2 = soa::Join; - using FullTracksRun3old = soa::Join; using FullTracksRun3 = soa::Join; using McTracksRun2 = soa::Join; - using McTracksRun3old = soa::Join; - using McTracksRun3 = soa::Join; - using JetMcTracks = soa::Join; - using JetTracksRun3 = soa::Join; + using McTracksRun3 = soa::Join; using BCsWithRun2Info = soa::Join; using McCollisions = soa::Join; Filter prelimTrackCuts = (aod::track::itsChi2NCl < maxChi2ITS && aod::track::tpcChi2NCl < maxChi2TPC && nabs(aod::track::dcaXY) < maxDCAxy && - nabs(aod::track::dcaZ) < 2.0f && - nabs(aod::track::eta) < 0.8f && - aod::track::pt > 0.1f); // add more preliminary cuts to filter if possible - Filter collisionFilter = (nabs(aod::jcollision::posZ) < zVtx); - Filter jetTrackCuts = (nabs(aod::jtrack::eta) > maxEta /* && aod::jtrack::pt > minJetParticlePt */); - Filter jetFilter = (aod::jet::pt >= minJetPt && nabs(aod::jet::eta) < nabs(maxEta - aod::jet::r / 100.f)); + nabs(aod::track::dcaZ) < maxDCAzForFilter && + nabs(aod::track::eta) < maxEtaForFilter && + aod::track::pt > minTrackPtForFilter); // add more preliminary cuts to filter if possible Preslice perCollisionFullTracksRun2 = o2::aod::track::collisionId; - Preslice perCollisionFullTracksRun3 = o2::aod::track::collisionId; + Preslice perCollisionFullTracksRun3 = o2::aod::track::collisionId; Preslice perCollisionMcTracksRun2 = o2::aod::track::collisionId; - Preslice perCollisionMcTracksRun3 = o2::aod::track::collisionId; + Preslice perCollisionMcTracksRun3 = o2::aod::track::collisionId; AxisSpecs axisSpecs; @@ -204,8 +195,6 @@ struct AngularCorrelationsInJets { ccdb->setLocalObjectValidityChecking(); ccdb->setFatalWhenNull(false); - eventSelection = jetderiveddatautilities::initialiseEventSelectionBits(static_cast("sel8")); - // Counters registryData.add("numberOfEvents", "Number of events", HistType::kTH1I, {{1, 0, 1}}); registryData.add("numberOfJets", "Total number of jets", HistType::kTH1I, {{1, 0, 1}}); @@ -315,7 +304,7 @@ struct AngularCorrelationsInJets { registryQC.add("rhoMEstimateArea", "Background #rho_{m} (area)", HistType::kTH2F, {{axisSpecs.ptAxisPos}, {200, 0, 20}}); registryQC.add("jetPtVsNumPart", "Total jet p_{T} vs number of constituents", HistType::kTH2F, {axisSpecs.ptAxisPos, {100, 0, 100}}); - if (doprocessRun3MCReco || doprocessMCRun2old || doprocessMCRun3old) { + if (doprocessMCRun2 || doprocessMCRun3) { registryMC.add("ptJetProtonMC", "Truth jet proton p_{T}", HistType::kTH1F, {axisSpecs.ptAxisPos}); registryMC.add("ptJetAntiprotonMC", "Truth jet antiproton p_{T}", HistType::kTH1F, {axisSpecs.ptAxisPos}); registryMC.add("ptJetNucleiMC", "Truth jet nuclei p_{T}", HistType::kTH1F, {axisSpecs.ptAxisPos}); @@ -384,15 +373,17 @@ struct AngularCorrelationsInJets { return false; if (!track.hasTPC()) return false; - if (track.tpcNClsCrossedRows() < 70) + int minCrossedRowsForJetReco = 70; + if (track.tpcNClsCrossedRows() < minCrossedRowsForJetReco) return false; if ((!hasITSHit(track, 1)) && (!hasITSHit(track, 2)) && (!hasITSHit(track, 3))) return false; - if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < 0.8) + double minRatioCrRowsFindableJetReco = 0.8; + if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < minRatioCrRowsFindableJetReco) return false; if (std::fabs(track.dcaXY()) > (0.0105 + 0.035 / std::pow(track.pt(), 1.1))) return false; - if (doprocessRun2old || doprocessMCRun2old) { + if (doprocessRun2 || doprocessMCRun2) { if (!(track.trackType() & o2::aod::track::Run2Track) || !(track.flags() & o2::aod::track::TPCrefit) || !(track.flags() & o2::aod::track::ITSrefit)) { @@ -438,102 +429,162 @@ struct AngularCorrelationsInJets { } template - bool isProton(const T& track, bool tightCuts) + bool isProtonForCorrelation(const T& track) { if (track.sign() < 0) return false; - if (tightCuts) { // for correlation function - // DCA + double pt = track.pt(); + + // DCA + double maxDCApt = 1.2; + if (pt < maxDCApt) { if (std::abs(track.dcaXY()) > protonDCAxyCF) return false; if (std::abs(track.dcaZ()) > protonDCAzCF) return false; + } - registryData.fill(HIST("tpcNSigmaProtonCF"), track.pt(), track.tpcNSigmaPr()); - if (track.hasTOF()) - registryData.fill(HIST("tofNSigmaProtonCF"), track.pt(), track.tofNSigmaPr()); + // nsigma + double midPt = 1.5; + double highPt = 3.0; - // nsigma - if (!track.hasTOF()) - return false; - if ((track.pt() < protonTPCTOFpT && (std::abs(track.tpcNSigmaPr()) > protonNsigma)) || - (track.pt() > protonTPCTOFpT && (std::abs(track.tpcNSigmaPr() * track.tpcNSigmaPr() + track.tofNSigmaPr() * track.tofNSigmaPr()) > protonNsigma))) - return false; - if (useRejectionCut && !singleSpeciesTPCNSigma(track)) - return false; - } else { // for yields - // DCA - if (std::abs(track.dcaXY()) > protonDCAxyYield) - return false; - if (std::abs(track.dcaZ()) > protonDCAzYield) - return false; + double maxTPCnsigma = protonTPCnsigma; + double maxTOFnsigma = protonTOFnsigma; + if (pt > midPt) { + maxTPCnsigma = protonTPCnsigma - 1; + maxTOFnsigma = protonTOFnsigma - 1; + } + if (pt > highPt) { + maxTPCnsigma = protonTPCnsigma - 2; + maxTOFnsigma = protonTOFnsigma - 2; + } - registryData.fill(HIST("tpcNSigmaProton"), track.pt(), track.tpcNSigmaPr()); + registryData.fill(HIST("tpcNSigmaProtonCF"), track.pt(), track.tpcNSigmaPr()); + if (pt < protonTPCTOFpT && (std::abs(track.tpcNSigmaPr()) > maxTPCnsigma)) + return false; - // TPC - if (track.pt() < protonTPCTOFpT && std::abs(track.tpcNSigmaPr()) > protonTPCnsigmaLowPtYield) - return false; - if (track.pt() > protonTPCTOFpT && std::abs(track.tpcNSigmaPr()) > protonTPCnsigmaHighPtYield) - return false; + double tofNSigma = 999; + if (track.hasTOF()) { + registryData.fill(HIST("tofNSigmaProtonCF"), track.pt(), track.tofNSigmaPr()); + tofNSigma = track.tofNSigmaPr(); + } - // TOF - if (track.hasTOF()) { - registryData.fill(HIST("tofNSigmaProton"), track.pt(), track.tofNSigmaPr()); - if (track.pt() > protonTPCTOFpT && std::abs(track.tofNSigmaPr()) > protonTOFnsigmaHighPtYield) - return false; - } + if (pt > protonTPCTOFpT && ((std::abs(tofNSigma) > maxTOFnsigma) || std::abs(track.tpcNSigmaPr()) > maxTPCnsigma)) + return false; + + if (useRejectionCut && !singleSpeciesTPCNSigma(track)) + return false; + + return true; + } + + template + bool isProtonForYield(const T& track) + { + if (track.sign() < 0) + return false; + + // DCA + if (std::abs(track.dcaXY()) > protonDCAxyYield) + return false; + if (std::abs(track.dcaZ()) > protonDCAzYield) + return false; + + registryData.fill(HIST("tpcNSigmaProton"), track.pt(), track.tpcNSigmaPr()); + + // TPC + if (track.pt() < protonTPCTOFpT && std::abs(track.tpcNSigmaPr()) > protonTPCnsigmaLowPtYield) + return false; + if (track.pt() > protonTPCTOFpT && std::abs(track.tpcNSigmaPr()) > protonTPCnsigmaHighPtYield) + return false; + + // TOF + if (track.hasTOF()) { + registryData.fill(HIST("tofNSigmaProton"), track.pt(), track.tofNSigmaPr()); + if (track.pt() > protonTPCTOFpT && std::abs(track.tofNSigmaPr()) > protonTOFnsigmaHighPtYield) + return false; } return true; } template - bool isAntiproton(const T& track, bool tightCuts) + bool isAntiprotonForCorrelation(const T& track) { if (track.sign() > 0) return false; - if (tightCuts) { // for correlation function - // DCA + double pt = track.pt(); + + // DCA + double maxDCApt = 1.2; + if (pt < maxDCApt) { if (std::abs(track.dcaXY()) > antiprotonDCAxyCF) return false; if (std::abs(track.dcaZ()) > antiprotonDCAzCF) return false; + } - registryData.fill(HIST("tpcNSigmaAntiprotonCF"), track.pt(), track.tpcNSigmaPr()); - if (track.hasTOF()) - registryData.fill(HIST("tofNSigmaAntiprotonCF"), track.pt(), track.tofNSigmaPr()); + // nsigma + double midPt = 1.5; + double highPt = 3.0; - // nsigma - if (!track.hasTOF()) - return false; - if ((track.pt() < antiprotonTPCTOFpT && (std::abs(track.tpcNSigmaPr()) > antiprotonNsigma)) || - (track.pt() > antiprotonTPCTOFpT && (std::abs(track.tpcNSigmaPr() * track.tpcNSigmaPr() + track.tofNSigmaPr() * track.tofNSigmaPr()) > antiprotonNsigma))) - return false; - if (useRejectionCut && !singleSpeciesTPCNSigma(track)) - return false; - } else { // for yields - // DCA - if (std::abs(track.dcaXY()) > antiprotonDCAxyYield) - return false; - if (std::abs(track.dcaZ()) > antiprotonDCAzYield) - return false; + double maxTPCnsigma = antiprotonTPCnsigma; + double maxTOFnsigma = antiprotonTOFnsigma; + if (pt > midPt) { + maxTPCnsigma = antiprotonTPCnsigma - 1; + maxTOFnsigma = antiprotonTOFnsigma - 1; + } + if (pt > highPt) { + maxTPCnsigma = antiprotonTPCnsigma - 2; + maxTOFnsigma = antiprotonTOFnsigma - 2; + } - registryData.fill(HIST("tpcNSigmaAntiproton"), track.pt(), track.tpcNSigmaPr()); + registryData.fill(HIST("tpcNSigmaAntiprotonCF"), track.pt(), track.tpcNSigmaPr()); + if (pt < antiprotonTPCTOFpT && (std::abs(track.tpcNSigmaPr()) > maxTPCnsigma)) + return false; - // TPC - if (track.pt() < antiprotonTPCTOFpT && std::abs(track.tpcNSigmaPr()) > antiprotonTPCnsigmaLowPtYield) - return false; - if (track.pt() > antiprotonTPCTOFpT && std::abs(track.tpcNSigmaPr()) > antiprotonTPCnsigmaHighPtYield) - return false; + double tofNSigma = 999; + if (track.hasTOF()) { + registryData.fill(HIST("tofNSigmaAntiprotonCF"), track.pt(), track.tofNSigmaPr()); + tofNSigma = track.tofNSigmaPr(); + } - // TOF - if (track.hasTOF()) { - registryData.fill(HIST("tofNSigmaAntiproton"), track.pt(), track.tofNSigmaPr()); - if (track.pt() > antiprotonTPCTOFpT && std::abs(track.tofNSigmaPr()) > antiprotonTOFnsigmaHighPtYield) - return false; - } + if (pt > antiprotonTPCTOFpT && ((std::abs(tofNSigma) > maxTOFnsigma) || std::abs(track.tpcNSigmaPr()) > maxTPCnsigma)) + return false; + + if (useRejectionCut && !singleSpeciesTPCNSigma(track)) + return false; + + return true; + } + + template + bool isAntiprotonForYield(const T& track) + { + if (track.sign() > 0) + return false; + + // DCA + if (std::abs(track.dcaXY()) > antiprotonDCAxyYield) + return false; + if (std::abs(track.dcaZ()) > antiprotonDCAzYield) + return false; + + registryData.fill(HIST("tpcNSigmaAntiproton"), track.pt(), track.tpcNSigmaPr()); + + // TPC + if (track.pt() < antiprotonTPCTOFpT && std::abs(track.tpcNSigmaPr()) > antiprotonTPCnsigmaLowPtYield) + return false; + if (track.pt() > antiprotonTPCTOFpT && std::abs(track.tpcNSigmaPr()) > antiprotonTPCnsigmaHighPtYield) + return false; + + // TOF + if (track.hasTOF()) { + registryData.fill(HIST("tofNSigmaAntiproton"), track.pt(), track.tofNSigmaPr()); + if (track.pt() > antiprotonTPCTOFpT && std::abs(track.tofNSigmaPr()) > antiprotonTOFnsigmaHighPtYield) + return false; } return true; @@ -720,7 +771,7 @@ struct AngularCorrelationsInJets { if (std::isnan(buffer.at(i).first)) continue; if (buffer.at(i).first > constants::math::TwoPI || buffer.at(i).first < constants::math::TwoPI) { - registryData.fill(HIST("trackProtocol"), 16); + registryData.fill(HIST("trackProtocol"), 13); // # buffer tracks failed with phi > 2 pi continue; } @@ -768,14 +819,14 @@ struct AngularCorrelationsInJets { double phiToAxis = RecoDecay::constrainAngle(particleVector.at(i).phi() - jetAxis.Phi(), 0); double etaToAxis = particleVector.at(i).eta() - jetAxis.Eta(); if (std::abs(particleVector.at(i).phi()) > constants::math::TwoPI) { - registryData.fill(HIST("trackProtocol"), 14); + registryData.fill(HIST("trackProtocol"), 11); // # tracks failed with phi > 2 pi continue; } for (int j = i + 1; j < static_cast(particleVector.size()); j++) { if ((j == static_cast(particleVector.size())) || std::isnan(particleVector.at(j).phi())) continue; if (std::abs(particleVector.at(j).phi()) > constants::math::TwoPI) { - registryData.fill(HIST("trackProtocol"), 15); + registryData.fill(HIST("trackProtocol"), 12); // # tracks failed with phi > 2 pi continue; } @@ -819,14 +870,14 @@ struct AngularCorrelationsInJets { double phiToAxis = RecoDecay::constrainAngle(particleVector.at(i).phi() - jetAxis.Phi(), 0); double etaToAxis = particleVector.at(i).eta() - jetAxis.Eta(); if (std::abs(particleVector.at(i).phi()) > constants::math::TwoPI) { - registryData.fill(HIST("trackProtocol"), 14); + registryData.fill(HIST("trackProtocol"), 14); // # tracks failed with phi > 2 pi continue; } for (int j = 0; j < static_cast(particleVectorAnti.size()); j++) { if (std::isnan(particleVectorAnti.at(j).phi())) continue; if (std::abs(particleVectorAnti.at(j).phi()) > constants::math::TwoPI) { - registryData.fill(HIST("trackProtocol"), 15); + registryData.fill(HIST("trackProtocol"), 15); // # tracks failed with phi > 2 pi continue; } @@ -843,7 +894,8 @@ struct AngularCorrelationsInJets { double getDeltaPhi(double a1, double a2) { - if (std::isnan(a1) || std::isnan(a2) || a1 == -999 || a2 == -999) + double failedPhi = -999; + if (std::isnan(a1) || std::isnan(a2) || a1 == failedPhi || a2 == failedPhi) return -999; double deltaPhi(0); double phi1 = RecoDecay::constrainAngle(a1, 0); @@ -986,21 +1038,21 @@ struct AngularCorrelationsInJets { double deltaEtaUE2 = particleDir.Eta() - ueAxis2.Eta(); double deltaPhiUE2 = getDeltaPhi(particleDir.Phi(), ueAxis2.Phi()); double deltaRUE2 = std::abs(deltaEtaUE2 * deltaEtaUE2 + deltaPhiUE2 * deltaPhiUE2); - + double failedPhi = -999; if (deltaRJet < rMax) { - if (deltaPhiJet != -999) + if (deltaPhiJet != failedPhi) registryQC.fill(HIST("deltaEtadeltaPhiJet"), deltaEtaJet, deltaPhiJet); nchJetPlusUE++; ptJetPlusUE = ptJetPlusUE + track.pt(); } if (deltaRUE1 < rMax) { - if (deltaPhiUE1 != -999) + if (deltaPhiUE1 != failedPhi) registryQC.fill(HIST("deltaEtadeltaPhiUE"), deltaEtaUE1, deltaPhiUE1); nchUE++; ptUE = ptUE + track.pt(); } if (deltaRUE2 < rMax) { - if (deltaPhiUE2 != -999) + if (deltaPhiUE2 != failedPhi) registryQC.fill(HIST("deltaEtadeltaPhiUE"), deltaEtaUE2, deltaPhiUE2); nchUE++; ptUE = ptUE + track.pt(); @@ -1042,7 +1094,7 @@ struct AngularCorrelationsInJets { fTempBufferJet.clear(); for (int i = 0; i < static_cast(constituents.size()); i++) { // analyse jet constituents - this is where the magic happens - registryData.fill(HIST("trackProtocol"), 3); + registryData.fill(HIST("trackProtocol"), 2); fastjet::PseudoJet pseudoParticle = constituents.at(i); int id = pseudoParticle.user_index(); const auto& jetParticle = particles.at(id); @@ -1064,39 +1116,39 @@ struct AngularCorrelationsInJets { // if (jetParticle.pt() < minJetParticlePt) // continue; if (measureYields) { - if (isProton(jetParticle, false)) { // collect protons in jet + if (isProtonForYield(jetParticle)) { // collect protons in jet registryData.fill(HIST("ptJetProton"), jetParticle.pt()); registryQC.fill(HIST("ptJetProtonVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); - registryData.fill(HIST("trackProtocol"), 4); // # protons - } else if (isAntiproton(jetParticle, false)) { // collect antiprotons in jet + registryData.fill(HIST("trackProtocol"), 3); // # protons + } else if (isAntiprotonForYield(jetParticle)) { // collect antiprotons in jet registryData.fill(HIST("ptJetAntiproton"), jetParticle.pt()); registryQC.fill(HIST("ptJetAntiprotonVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); - registryData.fill(HIST("trackProtocol"), 6); // # antiprotons + registryData.fill(HIST("trackProtocol"), 4); // # antiprotons } else if (isNucleus(jetParticle)) { // collect nuclei in jet registryData.fill(HIST("ptJetNuclei"), jetParticle.pt()); registryQC.fill(HIST("ptJetNucleiVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); - registryData.fill(HIST("trackProtocol"), 8); // # nuclei + registryData.fill(HIST("trackProtocol"), 5); // # nuclei registryData.fill(HIST("dcaZJetNuclei"), jetParticle.pt(), jetParticle.dcaZ()); } else if (isAntinucleus(jetParticle)) { registryData.fill(HIST("ptJetAntinuclei"), jetParticle.pt()); registryQC.fill(HIST("ptJetAntinucleiVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); - registryData.fill(HIST("trackProtocol"), 10); // # antinuclei + registryData.fill(HIST("trackProtocol"), 6); // # antinuclei registryData.fill(HIST("dcaZJetAntinuclei"), jetParticle.pt(), jetParticle.dcaZ()); } } if (measureCorrelations) { - if (isProton(jetParticle, true)) { - registryData.fill(HIST("trackProtocol"), 5); // # high purity protons + if (isProtonForCorrelation(jetParticle)) { + registryData.fill(HIST("trackProtocol"), 7); // # high purity protons jetProtons.emplace_back(jetParticle); registryData.fill(HIST("dcaZJetProton"), jetParticle.pt(), jetParticle.dcaZ()); } - if (isAntiproton(jetParticle, true)) { - registryData.fill(HIST("trackProtocol"), 7); // # high purity antiprotons + if (isAntiprotonForCorrelation(jetParticle)) { + registryData.fill(HIST("trackProtocol"), 8); // # high purity antiprotons jetAntiprotons.emplace_back(jetParticle); registryData.fill(HIST("dcaZJetAntiproton"), jetParticle.pt(), jetParticle.dcaZ()); } else if (isPion(jetParticle)) { registryQC.fill(HIST("ptJetPionVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); - registryData.fill(HIST("trackProtocol"), 11); // # antinuclei + registryData.fill(HIST("trackProtocol"), 9); // # antinuclei registryData.fill(HIST("dcaZJetPion"), jetParticle.pt(), jetParticle.dcaZ()); if (jetParticle.sign() > 0) { jetPiPlus.emplace_back(jetParticle); @@ -1107,7 +1159,7 @@ struct AngularCorrelationsInJets { } if (measureKaons && isKaon(jetParticle)) { registryQC.fill(HIST("ptJetKaonVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); - registryData.fill(HIST("trackProtocol"), 12); // # antinuclei + registryData.fill(HIST("trackProtocol"), 10); // # antinuclei registryData.fill(HIST("dcaZJetKaon"), jetParticle.pt(), jetParticle.dcaZ()); } } // for (int i=0; i(constituents.size()); i++) @@ -1124,7 +1176,8 @@ struct AngularCorrelationsInJets { doCorrelationsAnti(jetProtons, jetAntiprotons, fBufferAntiproton, fTempBufferProton, pJet); doCorrelationsAnti(jetAntiprotons, jetProtons, fBufferProton, fTempBufferAntiproton, pJet); // divide SE distributions by 2 in post } - if ((jetProtons.size() < 2) && (jetAntiprotons.size() < 2) && (jetPiPlus.size() < 2) && (jetPiMinus.size() < 2)) + int minNumPartForCorrelations = 2; + if ((static_cast(jetProtons.size()) < minNumPartForCorrelations) && (static_cast(jetAntiprotons.size()) < minNumPartForCorrelations) && (static_cast(jetPiPlus.size()) < minNumPartForCorrelations) && (static_cast(jetPiMinus.size()) < minNumPartForCorrelations)) return jetCounter; registryData.fill(HIST("eventProtocol"), 6); @@ -1173,9 +1226,11 @@ struct AngularCorrelationsInJets { jets.clear(); for (const auto& track : tracks) { + registryData.fill(HIST("trackProtocol"), 0); // # all tracks if (!selectTrackForJetReco(track)) continue; + registryData.fill(HIST("trackProtocol"), 1); // # tracks selected for jet reconstruction double mass = 0.139; if (track.tpcNClsFindable() != 0) { @@ -1207,7 +1262,8 @@ struct AngularCorrelationsInJets { index++; } // for (const auto& track : tracks) - if (jetInput.size() < 2) + int minNumPartForJetReco = 2; + if (static_cast(jetInput.size()) < minNumPartForJetReco) return; registryData.fill(HIST("eventProtocol"), 2); @@ -1280,7 +1336,8 @@ struct AngularCorrelationsInJets { index++; } // for (const auto& track : tracks) - if (jetInput.size() < 2) + int minNumPartForJetReco = 2; + if (static_cast(jetInput.size()) < minNumPartForJetReco) return; registryData.fill(HIST("eventProtocol"), 2); @@ -1378,20 +1435,21 @@ struct AngularCorrelationsInJets { double deltaPhiUE2 = getDeltaPhi(particleDir.Phi(), ueAxis2.Phi()); double deltaRUE2 = std::abs(deltaEtaUE2 * deltaEtaUE2 + deltaPhiUE2 * deltaPhiUE2); + double failedPhi = -999; if (deltaRJet < rMax) { - if (deltaPhiJet != -999) + if (deltaPhiJet != failedPhi) registryQC.fill(HIST("deltaEtadeltaPhiJet"), deltaEtaJet, deltaPhiJet); nchJetPlusUE++; ptJetPlusUE = ptJetPlusUE + track.pt(); } if (deltaRUE1 < rMax) { - if (deltaPhiUE1 != -999) + if (deltaPhiUE1 != failedPhi) registryQC.fill(HIST("deltaEtadeltaPhiUE"), deltaEtaUE1, deltaPhiUE1); nchUE++; ptUE = ptUE + track.pt(); } if (deltaRUE2 < rMax) { - if (deltaPhiUE2 != -999) + if (deltaPhiUE2 != failedPhi) registryQC.fill(HIST("deltaEtadeltaPhiUE"), deltaEtaUE2, deltaPhiUE2); nchUE++; ptUE = ptUE + track.pt(); @@ -1520,9 +1578,9 @@ struct AngularCorrelationsInJets { } // for (const auto& jet : jets) } - void processRun2old(soa::Join const& collisions, - soa::Filtered const& tracks, - BCsWithRun2Info const&) + void processRun2(soa::Join const& collisions, + soa::Filtered const& tracks, + BCsWithRun2Info const&) { for (const auto& collision : collisions) { auto bc = collision.bc_as(); @@ -1539,10 +1597,10 @@ struct AngularCorrelationsInJets { fillHistograms(slicedTracks); } } - PROCESS_SWITCH(AngularCorrelationsInJets, processRun2old, "process Run 2 data w/o jet tables", false); + PROCESS_SWITCH(AngularCorrelationsInJets, processRun2, "process Run 2 data w/o jet tables", false); - void processRun3old(soa::Join const& collisions, - soa::Filtered const& tracks) + void processRun3(soa::Join const& collisions, + soa::Filtered const& tracks) { for (const auto& collision : collisions) { registryData.fill(HIST("eventProtocol"), 0); @@ -1558,289 +1616,9 @@ struct AngularCorrelationsInJets { fillHistograms(slicedTracks); } } - PROCESS_SWITCH(AngularCorrelationsInJets, processRun3old, "process Run 3 data w/o jet tables", false); - - void processRun3(soa::Filtered>::iterator const& collision, - soa::Filtered> const& allJets, - soa::Filtered const& - /* , soa::Filtered const& */ - ) - { - registryData.fill(HIST("eventProtocol"), 0); - if (!jetderiveddatautilities::selectCollision(collision, eventSelection)) - return registryData.fill(HIST("numberOfEvents"), 0); - registryData.fill(HIST("eventProtocol"), 1); - - int jetCounter = 0; - - for (const auto& jet : allJets) { // loop over jets in event - if (minJetPt < (jet.pt() - collision.rho() * jet.area())) - continue; - jetCounter++; - std::vector jetProtons; - std::vector jetAntiprotons; - std::vector jetPiPlus; - std::vector jetPiMinus; - std::vector jetAll; - std::vector> fTempBufferProton; - std::vector> fTempBufferAntiproton; - std::vector> fTempBufferPiPlus; - std::vector> fTempBufferPiMinus; - std::vector> fTempBufferJet; - jetProtons.clear(); - jetAntiprotons.clear(); - jetPiPlus.clear(); - jetPiMinus.clear(); - jetAll.clear(); - fTempBufferProton.clear(); - fTempBufferAntiproton.clear(); - fTempBufferPiPlus.clear(); - fTempBufferPiMinus.clear(); - fTempBufferJet.clear(); - TVector3 pJet(0., 0., 0.); - pJet.SetXYZ(jet.px(), jet.py(), jet.pz()); - - registryData.fill(HIST("numberOfJets"), 0); - registryData.fill(HIST("ptTotalJet"), jet.pt()); - registryData.fill(HIST("jetRapidity"), jet.eta()); - registryData.fill(HIST("numPartInJet"), jet.tracksIds().size()); - registryQC.fill(HIST("jetPtVsNumPart"), jet.pt(), jet.tracksIds().size()); - registryQC.fill(HIST("maxRadiusVsPt"), jet.pt(), jet.r()); - - for (const auto& track /* jtrack */ : jet.template tracks_as()) { - // const auto& track = jtrack.track_as(); - if (!selectTrack(track)) - continue; - - if (track.tpcNClsFindable() != 0) { - registryQC.fill(HIST("ratioCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows() / track.tpcNClsFindable()); - } - if (outputQC) { - registryQC.fill(HIST("ptJetParticle"), track.pt()); - registryQC.fill(HIST("crossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows()); - registryQC.fill(HIST("clusterITS"), track.pt(), track.itsNCls()); - registryQC.fill(HIST("clusterTPC"), track.pt(), track.tpcNClsFound()); - registryQC.fill(HIST("chi2ITS"), track.pt(), track.itsChi2NCl()); - registryQC.fill(HIST("chi2TPC"), track.pt(), track.tpcChi2NCl()); - registryQC.fill(HIST("dcaXYFullEvent"), track.pt(), track.dcaXY()); - registryQC.fill(HIST("dcaZFullEvent"), track.pt(), track.dcaZ()); - registryQC.fill(HIST("phiJet"), track.phi()); - registryQC.fill(HIST("phiPtJet"), track.pt(), track.phi()); - registryQC.fill(HIST("etaJet"), track.eta()); - registryQC.fill(HIST("etaPtJet"), track.pt(), track.eta()); - - if (!std::isnan(track.phi()) && !std::isnan(jet.phi())) { // geometric jet cone - double deltaPhi = RecoDecay::constrainAngle(track.phi() - jet.phi(), -constants::math::PIHalf); - double deltaEta = track.eta() - jet.eta(); - double delta = std::abs(deltaPhi * deltaPhi + deltaEta * deltaEta); - registryQC.fill(HIST("jetConeRadius"), delta); - } - } - - // analyse jet constituents - this is where the magic happens - registryData.fill(HIST("trackProtocol"), 3); - if (doJetCorrelations) { - jetAll.emplace_back(track); - } - - registryData.fill(HIST("dcaXYFullJet"), track.pt() * track.sign(), track.dcaXY()); - registryData.fill(HIST("dcaZFullJet"), track.pt() * track.sign(), track.dcaZ()); - registryData.fill(HIST("tpcSignal"), track.pt() * track.sign(), track.tpcSignal()); - if (track.hasTOF()) { - registryData.fill(HIST("tofSignal"), track.pt() * track.sign(), track.beta()); - } - - if (measureYields) { - if (isProton(track, false)) { // collect protons in jet - registryData.fill(HIST("ptJetProton"), track.pt()); - registryQC.fill(HIST("ptJetProtonVsTotalJet"), track.pt(), jet.pt()); - registryData.fill(HIST("trackProtocol"), 4); // # protons - } else if (isAntiproton(track, false)) { // collect antiprotons in jet - registryData.fill(HIST("ptJetAntiproton"), track.pt()); - registryQC.fill(HIST("ptJetAntiprotonVsTotalJet"), track.pt(), jet.pt()); - registryData.fill(HIST("trackProtocol"), 6); // # antiprotons - } else if (isNucleus(track)) { // collect nuclei in jet - registryData.fill(HIST("ptJetNuclei"), track.pt()); - registryQC.fill(HIST("ptJetNucleiVsTotalJet"), track.pt(), jet.pt()); - registryData.fill(HIST("trackProtocol"), 8); // # nuclei - registryData.fill(HIST("dcaZJetNuclei"), track.pt(), track.dcaZ()); - } else if (isAntinucleus(track)) { - registryData.fill(HIST("ptJetAntinuclei"), track.pt()); - registryQC.fill(HIST("ptJetAntinucleiVsTotalJet"), track.pt(), jet.pt()); - registryData.fill(HIST("trackProtocol"), 10); // # antinuclei - registryData.fill(HIST("dcaZJetAntinuclei"), track.pt(), track.dcaZ()); - } - } - if (measureCorrelations) { - if (doppCorrelations && isProton(track, true)) { - registryData.fill(HIST("trackProtocol"), 5); // # high purity protons - jetProtons.emplace_back(track); - registryData.fill(HIST("dcaZJetProton"), track.pt(), track.dcaZ()); - } else if (doapapCorrelations && isAntiproton(track, true)) { - registryData.fill(HIST("trackProtocol"), 7); // # high purity antiprotons - jetAntiprotons.emplace_back(track); - registryData.fill(HIST("dcaZJetAntiproton"), track.pt(), track.dcaZ()); - } else if (dopipiCorrelations && isPion(track)) { - registryQC.fill(HIST("ptJetPionVsTotalJet"), track.pt(), jet.pt()); - registryData.fill(HIST("trackProtocol"), 11); // # antinuclei - registryData.fill(HIST("dcaZJetPion"), track.pt(), track.dcaZ()); - if (track.sign() > 0) { - jetPiPlus.emplace_back(track); - } else if (track.sign() < 0) { - jetPiMinus.emplace_back(track); - } - } - } - if (measureKaons && isKaon(track)) { - registryQC.fill(HIST("ptJetKaonVsTotalJet"), track.pt(), jet.pt()); - registryData.fill(HIST("trackProtocol"), 12); // # antinuclei - registryData.fill(HIST("dcaZJetKaon"), track.pt(), track.dcaZ()); - } - } // for (const auto& jtrack : jet.template tracks_as()) - - if (doJetCorrelations && jetAll.size() > 1) { // general correlation function - doCorrelations(jetAll, fBufferJet, fTempBufferJet, 0, pJet); - setTrackBuffer(fTempBufferJet, fBufferJet); - } - - if (!measureCorrelations) - continue; - - if (dopapCorrelations && (jetProtons.size() > 0) && (jetAntiprotons.size() > 0)) { - doCorrelationsAnti(jetProtons, jetAntiprotons, fBufferAntiproton, fTempBufferProton, pJet); - doCorrelationsAnti(jetAntiprotons, jetProtons, fBufferProton, fTempBufferAntiproton, pJet); // divide SE distributions by 2 in post - } - if ((jetProtons.size() < 2) && (jetAntiprotons.size() < 2) && jetPiPlus.size() < 2 && jetPiMinus.size() < 2) - continue; - registryData.fill(HIST("eventProtocol"), 6); - - if (doppCorrelations && jetProtons.size() > 1) { - doCorrelations(jetProtons, fBufferProton, fTempBufferProton, 1, pJet); - setTrackBuffer(fTempBufferProton, fBufferProton); - } - if (doapapCorrelations && jetAntiprotons.size() > 1) { - doCorrelations(jetAntiprotons, fBufferAntiproton, fTempBufferAntiproton, 2, pJet); - setTrackBuffer(fTempBufferAntiproton, fBufferAntiproton); - } - if (dopipiCorrelations && jetPiPlus.size() > 1) { - doCorrelations(jetPiPlus, fBufferPiPlus, fTempBufferPiPlus, 1, pJet); - setTrackBuffer(fTempBufferPiPlus, fBufferPiPlus); - } - if (dopipiCorrelations && jetPiMinus.size() > 1) { - doCorrelations(jetPiMinus, fBufferPiMinus, fTempBufferPiMinus, 1, pJet); - setTrackBuffer(fTempBufferPiMinus, fBufferPiMinus); - } - } // for (const auto& jet : allJets) - - registryData.fill(HIST("numJetsInEvent"), jetCounter); - } - PROCESS_SWITCH(AngularCorrelationsInJets, processRun3, "process Run 3 data", true); - - // mcd jets seems to be the issue, also mc coll labels ig - /// TODO: check if jets already have bkg subtracted - void processRun3MCReco(soa::Filtered>::iterator const& collision, soa::Filtered> const& allJets, JetMcTracks const&, soa::Filtered const&, aod::McParticles const&) - { - registryData.fill(HIST("eventProtocol"), 0); - if (!jetderiveddatautilities::selectCollision(collision, eventSelection)) - return registryData.fill(HIST("numberOfEvents"), 0); - registryData.fill(HIST("eventProtocol"), 1); - - int jetCounter = 0; - - for (const auto& jet : allJets) { // loop over jets in event - if (minJetPt < (jet.pt() - collision.rho() * jet.area())) - continue; - jetCounter++; - TVector3 pJet(0., 0., 0.); - pJet.SetXYZ(jet.px(), jet.py(), jet.pz()); - - registryData.fill(HIST("numberOfJets"), 0); - registryData.fill(HIST("ptTotalJet"), jet.pt()); - registryData.fill(HIST("jetRapidity"), jet.eta()); - registryData.fill(HIST("numPartInJet"), jet.tracksIds().size()); - registryQC.fill(HIST("jetPtVsNumPart"), jet.pt(), jet.tracksIds().size()); - registryQC.fill(HIST("maxRadiusVsPt"), jet.pt(), jet.r()); - - for (const auto& jtrack : jet.template tracks_as()) { - const auto& track = jtrack.track_as(); - if (!selectTrack(track)) - continue; - - if (track.tpcNClsFindable() != 0) { - registryQC.fill(HIST("ratioCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows() / track.tpcNClsFindable()); - } - registryQC.fill(HIST("ptJetParticle"), track.pt()); - registryQC.fill(HIST("crossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows()); - registryQC.fill(HIST("clusterITS"), track.pt(), track.itsNCls()); - registryQC.fill(HIST("clusterTPC"), track.pt(), track.tpcNClsFound()); - registryQC.fill(HIST("chi2ITS"), track.pt(), track.itsChi2NCl()); - registryQC.fill(HIST("chi2TPC"), track.pt(), track.tpcChi2NCl()); - registryQC.fill(HIST("dcaXYFullEvent"), track.pt(), track.dcaXY()); - registryQC.fill(HIST("dcaZFullEvent"), track.pt(), track.dcaZ()); - registryQC.fill(HIST("phiJet"), track.phi()); - registryQC.fill(HIST("phiPtJet"), track.pt(), track.phi()); - registryQC.fill(HIST("etaJet"), track.eta()); - registryQC.fill(HIST("etaPtJet"), track.pt(), track.eta()); - - if (!std::isnan(track.phi()) && !std::isnan(jet.phi())) { // geometric jet cone - double deltaPhi = RecoDecay::constrainAngle(track.phi() - jet.phi(), -constants::math::PIHalf); - double deltaEta = track.eta() - jet.eta(); - double delta = std::abs(deltaPhi * deltaPhi + deltaEta * deltaEta); - registryQC.fill(HIST("jetConeRadius"), delta); - } - - // analyse jet constituents - this is where the magic happens - registryData.fill(HIST("trackProtocol"), 3); - registryData.fill(HIST("dcaXYFullJet"), track.pt() * track.sign(), track.dcaXY()); - registryData.fill(HIST("dcaZFullJet"), track.pt() * track.sign(), track.dcaZ()); - registryData.fill(HIST("tpcSignal"), track.pt() * track.sign(), track.tpcSignal()); - if (track.hasTOF()) { - registryData.fill(HIST("tofSignal"), track.pt() * track.sign(), track.beta()); - } - - // MC Truth Particles - if (!track.has_mcParticle()) - continue; - switch (track.mcParticle().pdgCode()) { - case kProton: - registryMC.fill(HIST("numberOfTruthParticles"), 0); - registryMC.fill(HIST("ptJetProtonMC"), track.pt()); - break; - case kProtonBar: - registryMC.fill(HIST("numberOfTruthParticles"), 1); - registryMC.fill(HIST("ptJetAntiprotonMC"), track.pt()); - break; - case o2::constants::physics::Pdg::kDeuteron: - registryMC.fill(HIST("numberOfTruthParticles"), 2); - if (deuteronAnalysis) - registryMC.fill(HIST("ptJetNucleiMC"), track.pt()); - break; - case -o2::constants::physics::Pdg::kDeuteron: - registryMC.fill(HIST("numberOfTruthParticles"), 3); - if (deuteronAnalysis) - registryMC.fill(HIST("ptJetAntinucleiMC"), track.pt()); - break; - case o2::constants::physics::Pdg::kHelium3: - registryMC.fill(HIST("numberOfTruthParticles"), 4); - if (!deuteronAnalysis) - registryMC.fill(HIST("ptJetNucleiMC"), track.pt()); - break; - case -o2::constants::physics::Pdg::kHelium3: - registryMC.fill(HIST("numberOfTruthParticles"), 5); - if (!deuteronAnalysis) - registryMC.fill(HIST("ptJetAntinucleiMC"), track.pt()); - break; - default: - continue; - } - } // for (const auto& jtrack : jet.template tracks_as()) - } // for (const auto& jet : allJets) - - registryData.fill(HIST("numJetsInEvent"), jetCounter); - } - PROCESS_SWITCH(AngularCorrelationsInJets, processRun3MCReco, "process Run 3 MC, not currently usable", false); + PROCESS_SWITCH(AngularCorrelationsInJets, processRun3, "process Run 3 data w/o jet tables", false); - void processMCRun2old(McCollisions const& collisions, soa::Filtered const& tracks, BCsWithRun2Info const&, aod::McParticles const&, aod::McCollisions const&) + void processMCRun2(McCollisions const& collisions, soa::Filtered const& tracks, BCsWithRun2Info const&, aod::McParticles const&, aod::McCollisions const&) { for (const auto& collision : collisions) { auto bc = collision.bc_as(); @@ -1857,9 +1635,9 @@ struct AngularCorrelationsInJets { fillHistogramsMC(slicedTracks); } } - PROCESS_SWITCH(AngularCorrelationsInJets, processMCRun2old, "process Run 2 MC w/o jet tables, not currently usable", false); + PROCESS_SWITCH(AngularCorrelationsInJets, processMCRun2, "process Run 2 MC w/o jet tables, not currently usable", false); - void processMCRun3old(McCollisions const& collisions, soa::Filtered const& tracks, aod::McParticles const&, aod::McCollisions const&) + void processMCRun3(McCollisions const& collisions, soa::Filtered const& tracks, aod::McParticles const&, aod::McCollisions const&) { for (const auto& collision : collisions) { registryData.fill(HIST("eventProtocol"), 0); @@ -1875,7 +1653,7 @@ struct AngularCorrelationsInJets { fillHistogramsMC(slicedTracks); } } - PROCESS_SWITCH(AngularCorrelationsInJets, processMCRun3old, "process Run 3 MC w/o jet tables, not currently usable", false); + PROCESS_SWITCH(AngularCorrelationsInJets, processMCRun3, "process Run 3 MC w/o jet tables, not currently usable", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 38b482ff775452eb4a586a4aa75ae085a92763bc Mon Sep 17 00:00:00 2001 From: rolavick Date: Mon, 7 Apr 2025 16:45:14 +0200 Subject: [PATCH 0937/1650] [PWGUD] personal task modification (#10781) Co-authored-by: ALICE Action Bot --- PWGUD/Tasks/upcTauRl.cxx | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/PWGUD/Tasks/upcTauRl.cxx b/PWGUD/Tasks/upcTauRl.cxx index 2189f0a84d3..25bcbe0ba01 100644 --- a/PWGUD/Tasks/upcTauRl.cxx +++ b/PWGUD/Tasks/upcTauRl.cxx @@ -79,9 +79,13 @@ DECLARE_SOA_COLUMN(VtxITSTPC, vtxITSTPC, int); DECLARE_SOA_COLUMN(TotalFT0AmplitudeA, totalFT0AmplitudeA, float); DECLARE_SOA_COLUMN(TotalFT0AmplitudeC, totalFT0AmplitudeC, float); DECLARE_SOA_COLUMN(TotalFV0AmplitudeA, totalFV0AmplitudeA, float); +DECLARE_SOA_COLUMN(EnergyCommonZNA, energyCommonZNA, float); +DECLARE_SOA_COLUMN(EnergyCommonZNC, energyCommonZNC, float); DECLARE_SOA_COLUMN(TimeFT0A, timeFT0A, float); DECLARE_SOA_COLUMN(TimeFT0C, timeFT0C, float); DECLARE_SOA_COLUMN(TimeFV0A, timeFV0A, float); +DECLARE_SOA_COLUMN(TimeZNA, timeZNA, float); +DECLARE_SOA_COLUMN(TimeZNC, timeZNC, float); // tracks DECLARE_SOA_COLUMN(TrkPx, trkPx, float[2]); DECLARE_SOA_COLUMN(TrkPy, trkPy, float[2]); @@ -90,6 +94,8 @@ DECLARE_SOA_COLUMN(TrkSign, trkSign, int[2]); DECLARE_SOA_COLUMN(TrkDCAxy, trkDCAxy, float[2]); DECLARE_SOA_COLUMN(TrkDCAz, trkDCAz, float[2]); DECLARE_SOA_COLUMN(TrkTimeRes, trkTimeRes, float[2]); +DECLARE_SOA_COLUMN(Trk1ITSclusterSizes, trk1ITSclusterSizes, uint32_t); +DECLARE_SOA_COLUMN(Trk2ITSclusterSizes, trk2ITSclusterSizes, uint32_t); DECLARE_SOA_COLUMN(TrkTPCsignal, trkTPCsignal, float[2]); DECLARE_SOA_COLUMN(TrkTPCnSigmaEl, trkTPCnSigmaEl, float[2]); DECLARE_SOA_COLUMN(TrkTPCnSigmaMu, trkTPCnSigmaMu, float[2]); @@ -103,18 +109,19 @@ DECLARE_SOA_COLUMN(TrkTOFnSigmaMu, trkTOFnSigmaMu, float[2]); DECLARE_SOA_COLUMN(TrkTOFnSigmaPi, trkTOFnSigmaPi, float[2]); DECLARE_SOA_COLUMN(TrkTOFnSigmaKa, trkTOFnSigmaKa, float[2]); DECLARE_SOA_COLUMN(TrkTOFnSigmaPr, trkTOFnSigmaPr, float[2]); -DECLARE_SOA_COLUMN(TrkTPCexpMom, trkTPCexpMom, float[2]); +DECLARE_SOA_COLUMN(TrkTOFexpMom, trkTOFexpMom, float[2]); } // namespace tau_tree DECLARE_SOA_TABLE(TauTwoTracks, "AOD", "TAUTWOTRACK", tau_tree::RunNumber, tau_tree::Bc, tau_tree::TotalTracks, tau_tree::NumContrib, tau_tree::GlobalNonPVtracks, tau_tree::PosX, tau_tree::PosY, tau_tree::PosZ, tau_tree::RecoMode, tau_tree::OccupancyInTime, tau_tree::HadronicRate, tau_tree::Trs, tau_tree::Trofs, tau_tree::Hmpr, tau_tree::Tfb, tau_tree::ItsRofb, tau_tree::Sbp, tau_tree::ZvtxFT0vsPv, tau_tree::VtxITSTPC, - tau_tree::TotalFT0AmplitudeA, tau_tree::TotalFT0AmplitudeC, tau_tree::TotalFV0AmplitudeA, - tau_tree::TimeFT0A, tau_tree::TimeFT0C, tau_tree::TimeFV0A, + tau_tree::TotalFT0AmplitudeA, tau_tree::TotalFT0AmplitudeC, tau_tree::TotalFV0AmplitudeA, tau_tree::EnergyCommonZNA, tau_tree::EnergyCommonZNC, + tau_tree::TimeFT0A, tau_tree::TimeFT0C, tau_tree::TimeFV0A, tau_tree::TimeZNA, tau_tree::TimeZNC, tau_tree::TrkPx, tau_tree::TrkPy, tau_tree::TrkPz, tau_tree::TrkSign, tau_tree::TrkDCAxy, tau_tree::TrkDCAz, tau_tree::TrkTimeRes, + tau_tree::Trk1ITSclusterSizes, tau_tree::Trk2ITSclusterSizes, tau_tree::TrkTPCsignal, tau_tree::TrkTPCnSigmaEl, tau_tree::TrkTPCnSigmaMu, tau_tree::TrkTPCnSigmaPi, tau_tree::TrkTPCnSigmaKa, tau_tree::TrkTPCnSigmaPr, tau_tree::TrkTPCinnerParam, - tau_tree::TrkTOFsignal, tau_tree::TrkTOFnSigmaEl, tau_tree::TrkTOFnSigmaMu, tau_tree::TrkTOFnSigmaPi, tau_tree::TrkTOFnSigmaKa, tau_tree::TrkTOFnSigmaPr, tau_tree::TrkTPCexpMom); + tau_tree::TrkTOFsignal, tau_tree::TrkTOFnSigmaEl, tau_tree::TrkTOFnSigmaMu, tau_tree::TrkTOFnSigmaPi, tau_tree::TrkTOFnSigmaKa, tau_tree::TrkTOFnSigmaPr, tau_tree::TrkTOFexpMom); } // namespace o2::aod @@ -2117,6 +2124,8 @@ struct UpcTauRl { float dcaxy[2] = {trk1.dcaXY(), trk2.dcaXY()}; float dcaz[2] = {trk1.dcaZ(), trk2.dcaZ()}; float trkTimeRes[2] = {trk1.trackTimeRes(), trk2.trackTimeRes()}; + uint32_t itsClusterSizesTrk1 = trk1.itsClusterSizes(); + uint32_t itsClusterSizesTrk2 = trk2.itsClusterSizes(); float tpcSignal[2] = {trk1.tpcSignal(), trk2.tpcSignal()}; float tpcEl[2] = {trk1.tpcNSigmaEl(), trk2.tpcNSigmaEl()}; float tpcMu[2] = {trk1.tpcNSigmaMu(), trk2.tpcNSigmaMu()}; @@ -2131,13 +2140,21 @@ struct UpcTauRl { float tofKa[2] = {trk1.tofNSigmaKa(), trk2.tofNSigmaKa()}; float tofPr[2] = {trk1.tofNSigmaPr(), trk2.tofNSigmaPr()}; float tofEP[2] = {trk1.tofExpMom(), trk2.tofExpMom()}; + float ZNinfo[4] = {-999., -999., -999., -999.}; + if constexpr (requires { collision.udZdcsReduced(); }) { + ZNinfo[0] = collision.energyCommonZNA(); + ZNinfo[1] = collision.energyCommonZNC(); + ZNinfo[2] = collision.timeZNA(); + ZNinfo[3] = collision.timeZNC(); + } tauTwoTracks(collision.runNumber(), collision.globalBC(), countTracksPerCollision, collision.numContrib(), countGoodNonPVtracks, collision.posX(), collision.posY(), collision.posZ(), collision.flags(), collision.occupancyInTime(), collision.hadronicRate(), collision.trs(), collision.trofs(), collision.hmpr(), collision.tfb(), collision.itsROFb(), collision.sbp(), collision.zVtxFT0vPV(), collision.vtxITSTPC(), - collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFV0AmplitudeA(), - collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), + collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFV0AmplitudeA(), ZNinfo[0], ZNinfo[1], + collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), ZNinfo[2], ZNinfo[3], px, py, pz, sign, dcaxy, dcaz, trkTimeRes, + itsClusterSizesTrk1, itsClusterSizesTrk2, tpcSignal, tpcEl, tpcMu, tpcPi, tpcKa, tpcPr, tpcIP, tofSignal, tofEl, tofMu, tofPi, tofKa, tofPr, tofEP); } else { From 4b9ca75f1d4cf683c13615b59bb0bb633fa53c56 Mon Sep 17 00:00:00 2001 From: Chiara Pinto <48326672+chiarapinto@users.noreply.github.com> Date: Mon, 7 Apr 2025 18:11:54 +0200 Subject: [PATCH 0938/1650] [PWGLF] adding Q-vec amplitude to switch to SP flow (#10782) --- PWGLF/DataModel/LFHypernucleiTables.h | 3 ++- PWGLF/TableProducer/Nuspex/hyperRecoTask.cxx | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/PWGLF/DataModel/LFHypernucleiTables.h b/PWGLF/DataModel/LFHypernucleiTables.h index e86ae9e42c7..eeccdcdf26f 100644 --- a/PWGLF/DataModel/LFHypernucleiTables.h +++ b/PWGLF/DataModel/LFHypernucleiTables.h @@ -30,6 +30,7 @@ DECLARE_SOA_COLUMN(CentralityFT0M, centralityFT0M, float); // centrality with FT DECLARE_SOA_COLUMN(PsiFT0A, psiFT0A, float); // Psi with FT0A estimator DECLARE_SOA_COLUMN(MultFT0A, multFT0A, float); // Multiplicity with FT0A estimator DECLARE_SOA_COLUMN(PsiFT0C, psiFT0C, float); // Psi with FT0C estimator +DECLARE_SOA_COLUMN(QFT0C, qFT0C, float); // Amplitude with FT0C estimator DECLARE_SOA_COLUMN(MultFT0C, multFT0C, float); // Multiplicity with FT0C estimator DECLARE_SOA_COLUMN(PsiTPC, psiTPC, float); // Psi with TPC estimator DECLARE_SOA_COLUMN(MultTPC, multTPC, float); // Multiplicity with TPC estimator @@ -100,7 +101,7 @@ DECLARE_SOA_TABLE(DataHypCandsFlow, "AOD", "HYPCANDSFLOW", o2::soa::Index<>, hyperrec::CentralityFT0A, hyperrec::CentralityFT0C, hyperrec::CentralityFT0M, hyperrec::PsiFT0A, hyperrec::MultFT0A, - hyperrec::PsiFT0C, hyperrec::MultFT0C, + hyperrec::PsiFT0C, hyperrec::MultFT0C, hyperrec::QFT0C, hyperrec::PsiTPC, hyperrec::MultTPC, hyperrec::XPrimVtx, hyperrec::YPrimVtx, hyperrec::ZPrimVtx, diff --git a/PWGLF/TableProducer/Nuspex/hyperRecoTask.cxx b/PWGLF/TableProducer/Nuspex/hyperRecoTask.cxx index 0bf77ee8724..d5141f1b3e2 100644 --- a/PWGLF/TableProducer/Nuspex/hyperRecoTask.cxx +++ b/PWGLF/TableProducer/Nuspex/hyperRecoTask.cxx @@ -706,7 +706,7 @@ struct hyperRecoTask { float trackedHypClSize = !trackedClSize.empty() ? trackedClSize[hypCand.v0ID] : 0; outputDataTableWithFlow(collision.centFT0A(), collision.centFT0C(), collision.centFT0M(), collision.psiFT0A(), collision.multFT0A(), - collision.psiFT0C(), collision.multFT0C(), + collision.psiFT0C(), collision.multFT0C(), collision.qFT0C(), collision.psiTPC(), collision.multTPC(), collision.posX(), collision.posY(), collision.posZ(), hypCand.isMatter, From 3a9699b0789684370b53e3f9e6e298f631a195d9 Mon Sep 17 00:00:00 2001 From: wefeng1110 <147308878+wefeng1110@users.noreply.github.com> Date: Tue, 8 Apr 2025 01:34:31 +0800 Subject: [PATCH 0939/1650] [PWGJE] fix tracks hist and add fill MCP weighted events (#10743) --- PWGJE/Tasks/jetSpectraCharged.cxx | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/PWGJE/Tasks/jetSpectraCharged.cxx b/PWGJE/Tasks/jetSpectraCharged.cxx index 60319609ec4..b6694627fbc 100644 --- a/PWGJE/Tasks/jetSpectraCharged.cxx +++ b/PWGJE/Tasks/jetSpectraCharged.cxx @@ -84,7 +84,6 @@ struct JetSpectraCharged { Configurable acceptSplitCollisions{"acceptSplitCollisions", 0, "0: only look at mcCollisions that are not split; 1: accept split mcCollisions, 2: accept split mcCollisions but only look at the first reco collision associated with it"}; Configurable skipMBGapEvents{"skipMBGapEvents", false, "flag to choose to reject min. bias gap events; jet-level rejection can also be applied at the jet finder level for jets only, here rejection is applied for collision and track process functions for the first time, and on jets in case it was set to false at the jet finder level"}; Configurable checkLeadConstituentPtForMcpJets{"checkLeadConstituentPtForMcpJets", false, "flag to choose whether particle level jets should have their lead track pt above leadingConstituentPtMin to be accepted; off by default, as leadingConstituentPtMin cut is only applied on MCD jets for the Pb-Pb analysis using pp MC anchored to Pb-Pb for the response matrix"}; - Configurable checkMcdEtaForMatchedJets{"checkMcdEtaForMatchedJets", false, "flag to choose whether matched jets should have the eta of the mcd jet within acceptance; off by default, as it sould not be checked for mcd jets for efficiency and response matrix: https://alice-notes.web.cern.ch/system/files/notes/analysis/34/2013-Sep-19-analysis_note-AnalysisNoteChargedJets.pdf"}; std::vector eventSelectionBits; int trackSelection = -1; @@ -165,6 +164,13 @@ struct JetSpectraCharged { registry.add("h2_jet_pt_part_track_pt_part", "part jet #it{p}_{T,jet} vs. #it{p}_{T,track}; #it{p}_{T,jet}^{part} (GeV/#it{c}); #it{p}_{T,track}^{part} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxisRhoAreaSub, trackPtAxis}}); registry.add("h3_jet_pt_jet_eta_jet_phi_part", "part jet pt vs. eta vs. phi", {HistType::kTH3F, {jetPtAxis, jetEtaAxis, phiAxis}}); if (doprocessSpectraMCPWeighted) { + registry.add("h_mcColl_counts_weight", " number of weighted mc events; event status; entries", {HistType::kTH1F, {{10, 0, 10}}}); + registry.get(HIST("h_mcColl_counts_weight"))->GetXaxis()->SetBinLabel(1, "allMcColl"); + registry.get(HIST("h_mcColl_counts_weight"))->GetXaxis()->SetBinLabel(2, "vertexZ"); + registry.get(HIST("h_mcColl_counts_weight"))->GetXaxis()->SetBinLabel(3, "noRecoColl"); + registry.get(HIST("h_mcColl_counts_weight"))->GetXaxis()->SetBinLabel(4, "recoEvtSel"); + registry.get(HIST("h_mcColl_counts_weight"))->GetXaxis()->SetBinLabel(5, "centralitycut"); + registry.get(HIST("h_mcColl_counts_weight"))->GetXaxis()->SetBinLabel(6, "occupancycut"); registry.add("h2_jet_ptcut_part", "p_{T} cut;p_{T,jet}^{part} (GeV/#it{c});N;entries", {HistType::kTH2F, {{300, 0, 300}, {20, 0, 5}}}); registry.add("h_jet_phat_part_weighted", "jet #hat{p};#hat{p} (GeV/#it{c});entries", {HistType::kTH1F, {{1000, 0, 1000}}}); } @@ -515,7 +521,7 @@ struct JetSpectraCharged { if (!jetderiveddatautilities::selectTrack(track, trackSelection)) { continue; } - fillTrackHistograms(track, collision.centrality()); + fillTrackHistograms(track); } } PROCESS_SWITCH(JetSpectraCharged, processQC, "collisions and track QC for Data and MCD", false); @@ -831,16 +837,20 @@ struct JetSpectraCharged { aod::JetParticles const&) { bool mcLevelIsParticleLevel = true; + float eventWeight = mccollision.weight(); registry.fill(HIST("h_mcColl_counts"), 0.5); + registry.fill(HIST("h_mcColl_counts_weight"), 0.5, eventWeight); if (std::abs(mccollision.posZ()) > vertexZCut) { return; } registry.fill(HIST("h_mcColl_counts"), 1.5); + registry.fill(HIST("h_mcColl_counts_weight"), 1.5, eventWeight); if (collisions.size() < 1) { return; } registry.fill(HIST("h_mcColl_counts"), 2.5); + registry.fill(HIST("h_mcColl_counts_weight"), 2.5, eventWeight); bool hasSel8Coll = false; for (auto const& collision : collisions) { @@ -852,7 +862,7 @@ struct JetSpectraCharged { return; } registry.fill(HIST("h_mcColl_counts"), 3.5); - registry.fill(HIST("h_mc_zvertex"), mccollision.posZ()); + registry.fill(HIST("h_mcColl_counts_weight"), 3.5, eventWeight); for (auto const& jet : jets) { if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { From b641fb17770d364465d27944f3c0cbbb6105bf82 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Mon, 7 Apr 2025 21:05:19 +0200 Subject: [PATCH 0940/1650] [PWGEM/Dilepton] update skimmerPrimaryMuon.cxx (#10780) --- PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx b/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx index b64682ec120..01e577ae479 100644 --- a/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx +++ b/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx @@ -336,7 +336,9 @@ struct associateSameMFT { if (global_muon.globalIndex() == muon.globalIndex()) { // don't store myself. continue; } - self_Ids.emplace_back(global_muon.globalIndex()); + if (global_muon.collisionId() == muon.collisionId()) { + self_Ids.emplace_back(global_muon.globalIndex()); + } } em_same_mft_ids(self_Ids); self_Ids.clear(); From 2f5aa6d3ad55250e75892c95183542a389ed0fa9 Mon Sep 17 00:00:00 2001 From: Anton Alkin Date: Tue, 8 Apr 2025 10:26:05 +0200 Subject: [PATCH 0941/1650] [Tutorial] Add an example of a configurable expression column (#10779) --- Tutorials/src/extendedTables.cxx | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Tutorials/src/extendedTables.cxx b/Tutorials/src/extendedTables.cxx index ce511fbb887..643a81e1504 100644 --- a/Tutorials/src/extendedTables.cxx +++ b/Tutorials/src/extendedTables.cxx @@ -21,6 +21,7 @@ namespace o2::aod namespace extension { DECLARE_SOA_EXPRESSION_COLUMN(P2exp, p2exp, float, track::p* track::p); +DECLARE_SOA_CONFIGURABLE_EXPRESSION_COLUMN(Cfg, cfg, float, "cfg"); DECLARE_SOA_COLUMN(mX, mx, float); DECLARE_SOA_COLUMN(mY, my, float); @@ -36,6 +37,8 @@ DECLARE_SOA_TABLE(DynTable, "AOD", "DYNTABLE", DECLARE_SOA_EXTENDED_TABLE_USER(ExTable, Tracks, "EXTABLE", extension::P2exp); +DECLARE_SOA_CONFIGURABLE_EXTENDED_TABLE(CExTable, Tracks, "CTRK", + extension::Cfg); } // namespace o2::aod using namespace o2; @@ -107,6 +110,14 @@ struct ExtendAndAttach { struct SpawnDynamicColumns { Produces dyntable; Spawns extable; + Defines cextable; + + Configurable factor{"factor", 1.0f, "scale factor"}; + + void init(InitContext&) + { + cextable.projectors[0] = (float)factor * aod::track::p * aod::track::p; + } void process(aod::Tracks const& tracks) { @@ -119,7 +130,7 @@ struct SpawnDynamicColumns { // loop over the joined table struct ProcessExtendedTables { // join the table ExTable and DynTable - using allinfo = soa::Join; + using allinfo = soa::Join; void process(aod::Collision const&, allinfo const& tracks) { @@ -128,6 +139,7 @@ struct ProcessExtendedTables { if (row.trackType() != 3) { if (row.index() % 10000 == 0) { LOGF(info, "E: EXPRESSION P^2 = %.3f, DYNAMIC P^2 = %.3f R^2 = %.3f", row.p2exp(), row.p2dyn(), row.r2dyn()); + LOGF(info, "C: CONF EXPRESSION f * P^2 = %.3f", row.cfg()); } } } From 802c16cb3c658cb6f47a01bd9bf614a199c88037 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Tue, 8 Apr 2025 11:42:16 +0200 Subject: [PATCH 0942/1650] [Common] update fwdtrackPropagation.cxx (#10773) --- Common/TableProducer/fwdtrackPropagation.cxx | 92 ++------------------ 1 file changed, 8 insertions(+), 84 deletions(-) diff --git a/Common/TableProducer/fwdtrackPropagation.cxx b/Common/TableProducer/fwdtrackPropagation.cxx index f5a4c941964..c7df8dd3ea5 100644 --- a/Common/TableProducer/fwdtrackPropagation.cxx +++ b/Common/TableProducer/fwdtrackPropagation.cxx @@ -70,11 +70,8 @@ struct FwdTrackPropagation { Configurable maxPDCAforSmallR{"maxPDCAforSmallR", 594.f, "max. pDCA for small R at absorber end"}; Configurable maxMatchingChi2MCHMFT{"maxMatchingChi2MCHMFT", 50.f, "max. chi2 for MCH-MFT matching"}; Configurable maxChi2SA{"maxChi2SA", 1e+6, "max. chi2 for standalone muon"}; - Configurable maxChi2GL{"maxChi2GL", 1e+6, "max. chi2 for global muon"}; + Configurable maxChi2GL{"maxChi2GL", 50.f, "max. chi2 for global muon"}; Configurable refitGlobalMuon{"refitGlobalMuon", true, "flag to refit global muon"}; - Configurable applyDEtaDPhi{"cfgApplyDEtaDPhi", false, "flag to apply deta-dphi elliptic cut"}; - Configurable minDEta{"minDEta", 0.1, "min deta between MFT-MCH-MID and its attached MID-MCH at PV"}; - Configurable minDPhi{"minDPhi", 0.1, "min dphi between MFT-MCH-MID and its attached MID-MCH at PV"}; HistogramRegistry fRegistry{"fRegistry"}; static constexpr std::string_view muon_types[5] = {"MFTMCHMID/", "MFTMCHMIDOtherMatch/", "MFTMCH/", "MCHMID/", "MCH/"}; @@ -193,89 +190,16 @@ struct FwdTrackPropagation { return true; } - template - bool isBestMatch(TCollision const& collision, TTarget const& target, TCandidates const& candidates) + template + void fillFwdTrackTable(TCollision const& collision, TFwdTrack fwdtrack, TFwdTracks const&, TMFTTracks const&, const bool isAmbiguous) { - std::map map_chi2MFTMCH; - for (const auto& matchedtrack : candidates) { // MFT-MCH-MID or MFT-MCH - if (matchedtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) { - continue; - } - o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon(matchedtrack, collision, propagationPoint::kToVertex); - float eta = propmuonAtPV.getEta(); - float phi = propmuonAtPV.getPhi(); - if (refitGlobalMuon) { - const auto& mfttrack = matchedtrack.template matchMFTTrack_as(); - eta = mfttrack.eta(); - phi = mfttrack.phi(); - } - o2::math_utils::bringTo02Pi(phi); - if (eta < minEtaGL || maxEtaGL < eta) { - continue; - } - - const auto& mchtrack = matchedtrack.template matchMCHTrack_as(); // MCH-MID - o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToVertex); - float etaMatchedMCHMID = propmuonAtPV_Matched.getEta(); - float phiMatchedMCHMID = propmuonAtPV_Matched.getPhi(); - o2::math_utils::bringTo02Pi(phiMatchedMCHMID); - - float deta = etaMatchedMCHMID - eta; - float dphi = phiMatchedMCHMID - phi; - o2::math_utils::bringToPMPi(dphi); - if (applyDEtaDPhi && std::sqrt(std::pow(deta / minDEta, 2) + std::pow(dphi / minDPhi, 2)) > 1.f) { - continue; - } - - if (matchedtrack.chi2() < 0.f || maxChi2GL < matchedtrack.chi2()) { - continue; - } - - float rAtAbsorberEnd = matchedtrack.rAtAbsorberEnd(); // this works only for GlobalMuonTrack - if (rAtAbsorberEnd < minRabsGL || maxRabs < rAtAbsorberEnd) { - continue; - } - o2::dataformats::GlobalFwdTrack propmuonAtDCA = propagateMuon(matchedtrack, collision, propagationPoint::kToDCA); - float dcaX = propmuonAtDCA.getX() - collision.posX(); - float dcaY = propmuonAtDCA.getY() - collision.posY(); - float dcaXY = std::sqrt(dcaX * dcaX + dcaY * dcaY); - if (maxDCAxy < dcaXY) { - continue; - } - - o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToDCA); - float dcaX_Matched = propmuonAtDCA_Matched.getX() - collision.posX(); - float dcaY_Matched = propmuonAtDCA_Matched.getY() - collision.posY(); - float dcaXY_Matched = std::sqrt(dcaX_Matched * dcaX_Matched + dcaY_Matched * dcaY_Matched); - float pDCA = mchtrack.p() * dcaXY_Matched; - - if (rAtAbsorberEnd < midRabs ? pDCA > maxPDCAforSmallR : pDCA > maxPDCAforLargeR) { - continue; - } - - map_chi2MFTMCH[matchedtrack.globalIndex()] = matchedtrack.chi2MatchMCHMFT(); - } - if (map_chi2MFTMCH.begin()->first != target.globalIndex()) { // search for minimum matching chi2 - map_chi2MFTMCH.clear(); - return false; - } - map_chi2MFTMCH.clear(); + if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && (fwdtrack.chi2MatchMCHMFT() > maxMatchingChi2MCHMFT || fwdtrack.chi2() > maxChi2GL)) { + return; + } // Users have to decide the best match between MFT and MCH-MID at analysis level. The same global muon is repeatedly stored. - if (target.chi2MatchMCHMFT() > maxMatchingChi2MCHMFT) { - return false; + if (fwdtrack.chi2MatchMCHMID() < 0.f) { // this should never happen. only for protection. + return; } - return true; - } - - template - void fillFwdTrackTable(TCollision const& collision, TFwdTrack fwdtrack, TFwdTracks const& fwdtracks, TMFTTracks const&, const bool isAmbiguous) - { - if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) { - const auto& matchedGlobalTracks = fwdtracks.sliceBy(perMFTTrack, fwdtrack.matchMFTTrackId()); // MFT-MCH-MID or MFT-MCH - if (!isBestMatch(collision, fwdtrack, matchedGlobalTracks)) { - return; - } - } // find the best match between MFT and MCH-MID o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon(fwdtrack, collision, propagationPoint::kToVertex); o2::dataformats::GlobalFwdTrack propmuonAtDCA = propagateMuon(fwdtrack, collision, propagationPoint::kToDCA); From fa39afdc0bb732eacc1c086bdc2b80c393a94dee Mon Sep 17 00:00:00 2001 From: rolavick Date: Tue, 8 Apr 2025 18:54:55 +0200 Subject: [PATCH 0943/1650] [PWGUD] Slight rework of preselection (#10788) Co-authored-by: ALICE Action Bot --- PWGUD/Tasks/upcTauRl.cxx | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/PWGUD/Tasks/upcTauRl.cxx b/PWGUD/Tasks/upcTauRl.cxx index 25bcbe0ba01..416773e05a8 100644 --- a/PWGUD/Tasks/upcTauRl.cxx +++ b/PWGUD/Tasks/upcTauRl.cxx @@ -223,6 +223,8 @@ struct UpcTauRl { } cutTauEvent; struct : ConfigurableGroup { + Configurable cutCanUseTrackPID{"cutUseTrackPID", true, {"Apply weak PID check on tracks."}}; + Configurable cutCanNgoodPVtracs{"cutCanNgoodPVtracs", 2, {"How many good PV tracks to select."}}; Configurable cutCanMinElectronNsigmaEl{"cutCanMinElectronNsigmaEl", 4.0, {"Good el candidate hypo in. Upper n sigma cut on el hypo of selected electron. What is more goes away."}}; Configurable cutCanMaxElectronNsigmaEl{"cutCanMaxElectronNsigmaEl", -2.0, {"Good el candidate hypo in. Lower n sigma cut on el hypo of selected electron. What is less goes away."}}; Configurable cutCanElectronHasTOF{"cutCanElectronHasTOF", true, {"Electron candidated is required to hit TOF."}}; @@ -2089,8 +2091,7 @@ struct UpcTauRl { int countTracksPerCollision = 0; int countGoodNonPVtracks = 0; - int countPVGTel = 0; - int countPVGTmupi = 0; + int countGoodPVtracks = 0; std::vector vecTrkIdx; // Loop over tracks with selections for (const auto& track : tracks) { @@ -2101,19 +2102,27 @@ struct UpcTauRl { countGoodNonPVtracks++; continue; } - // alternative selection - if (isElectronCandidate(track)) { - countPVGTel++; - vecTrkIdx.push_back(track.index()); - continue; - } - if (isMuPionCandidate(track)) { - countPVGTmupi++; - vecTrkIdx.push_back(track.index()); - } + countGoodPVtracks++; + vecTrkIdx.push_back(track.index()); } // Loop over tracks with selections - if ((countPVGTel == 2 && countPVGTmupi == 0) || (countPVGTel == 1 && countPVGTmupi == 1)) { + // Apply weak condition on track PID + int countPVGTel = 0; + int countPVGTmupi = 0; + if (countGoodPVtracks == 2) { + for (const auto& vecMember : vecTrkIdx) { + const auto& thisTrk = tracks.iteratorAt(vecMember); + if (isElectronCandidate(thisTrk)) { + countPVGTel++; + continue; + } + if (isMuPionCandidate(thisTrk)) { + countPVGTmupi++; + } + } + } + + if (cutPreselect.cutCanUseTrackPID ? ((countPVGTel == 2 && countPVGTmupi == 0) || (countPVGTel == 1 && countPVGTmupi == 1)) : countGoodPVtracks == cutPreselect.cutCanNgoodPVtracs) { const auto& trk1 = tracks.iteratorAt(vecTrkIdx[0]); const auto& trk2 = tracks.iteratorAt(vecTrkIdx[1]); From 2a4ce9ab69283570cc9793f39afa489976336822 Mon Sep 17 00:00:00 2001 From: Yash Patley <52608802+yashpatley@users.noreply.github.com> Date: Wed, 9 Apr 2025 03:25:52 +0530 Subject: [PATCH 0944/1650] [PWGCF] LambdaR2Correlation Update (#10785) --- .../Tasks/lambdaR2Correlation.cxx | 128 ++++++++++++++---- 1 file changed, 100 insertions(+), 28 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx index 2aef9ae53f9..8c9866e2d58 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx @@ -195,6 +195,12 @@ enum DMCType { kMC }; +enum CorrHistDim { + kOneDimCorr = 1, + kTwoDimCorr, + kThreeDimCorr +}; + struct LambdaTableProducer { Produces lambdaCollisionTable; @@ -256,6 +262,7 @@ struct LambdaTableProducer { Configurable cSelectPrimaryV0{"cSelectPrimaryV0", true, "Select Primary V0"}; Configurable cRecPrimaryLambda{"cRecPrimaryLambda", true, "Primary Reconstructed Lambda"}; Configurable cRecSecondaryLambda{"cRecSecondaryLambda", false, "Secondary Reconstructed Lambda"}; + Configurable cCheckRecoDauFlag{"cCheckRecoDauFlag", false, "Check for reco daughter PID"}; Configurable cGenPrimaryLambda{"cGenPrimaryLambda", true, "Primary Generated Lambda"}; Configurable cGenSecondaryLambda{"cGenSecondaryLambda", false, "Secondary Generated Lambda"}; Configurable cGenDecayChannel{"cGenDecayChannel", true, "Gen Level Decay Channel Flag"}; @@ -381,7 +388,7 @@ struct LambdaTableProducer { histos.addClone("McRec/Lambda/", "McRec/AntiLambda/"); // MC Generated Histograms - if (doprocessMCRun3 || doprocessMCRun2) { + if (doprocessMCRun3 || doprocessMCRun2 || doprocessMCRecoRun3) { // McReco Histos histos.add("Tracks/h2f_tracks_pid_before_sel", "PIDs", kTH2F, {axisPID, axisV0Pt}); histos.add("Tracks/h2f_tracks_pid_after_sel", "PIDs", kTH2F, {axisPID, axisV0Pt}); @@ -733,31 +740,35 @@ struct LambdaTableProducer { { auto mcpart = v0.template mcParticle_as(); + // check if Lambda/AntiLambda if (std::abs(mcpart.pdgCode()) != kLambda0) { return false; } - auto postrack = v0.template posTrack_as(); - auto negtrack = v0.template negTrack_as(); - - // check if the daughters have corresponding mcparticle - if (!postrack.has_mcParticle() || !negtrack.has_mcParticle()) { - histos.fill(HIST("Tracks/h1f_tracks_info"), kLambdaDauNotMcParticle); - return false; - } - - auto mcpostrack = postrack.template mcParticle_as(); - auto mcnegtrack = negtrack.template mcParticle_as(); + // Check for daughters + if (cCheckRecoDauFlag) { + auto postrack = v0.template posTrack_as(); + auto negtrack = v0.template negTrack_as(); - if (mcpart.pdgCode() == kLambda0) { - if (mcpostrack.pdgCode() != kProton || mcnegtrack.pdgCode() != kPiMinus) { - histos.fill(HIST("Tracks/h1f_tracks_info"), kLambdaNotPrPiMinus); + // check if the daughters have corresponding mcparticle + if (!postrack.has_mcParticle() || !negtrack.has_mcParticle()) { + histos.fill(HIST("Tracks/h1f_tracks_info"), kLambdaDauNotMcParticle); return false; } - } else if (mcpart.pdgCode() == kLambda0Bar) { - if (mcpostrack.pdgCode() != kPiPlus || mcnegtrack.pdgCode() != kProtonBar) { - histos.fill(HIST("Tracks/h1f_tracks_info"), kAntiLambdaNotAntiPrPiPlus); - return false; + + auto mcpostrack = postrack.template mcParticle_as(); + auto mcnegtrack = negtrack.template mcParticle_as(); + + if (mcpart.pdgCode() == kLambda0) { + if (mcpostrack.pdgCode() != kProton || mcnegtrack.pdgCode() != kPiMinus) { + histos.fill(HIST("Tracks/h1f_tracks_info"), kLambdaNotPrPiMinus); + return false; + } + } else if (mcpart.pdgCode() == kLambda0Bar) { + if (mcpostrack.pdgCode() != kPiPlus || mcnegtrack.pdgCode() != kProtonBar) { + histos.fill(HIST("Tracks/h1f_tracks_info"), kAntiLambdaNotAntiPrPiPlus); + return false; + } } } @@ -835,13 +846,13 @@ struct LambdaTableProducer { float retVal = 0.; float rap = (cDoEtaCorr) ? v0.eta() : v0.yLambda(); - if (hist->GetDimension() == 1) { + if (hist->GetDimension() == kOneDimCorr) { histos.fill(HIST("Tracks/h1f_tracks_info"), kEffCorrPt); retVal = hist->GetBinContent(hist->FindBin(v0.pt())); - } else if (hist->GetDimension() == 2) { + } else if (hist->GetDimension() == kTwoDimCorr) { histos.fill(HIST("Tracks/h1f_tracks_info"), kEffCorrPtRap); retVal = hist->GetBinContent(hist->FindBin(v0.pt(), rap)); - } else if (hist->GetDimension() == 3) { + } else if (hist->GetDimension() == kThreeDimCorr) { histos.fill(HIST("Tracks/h1f_tracks_info"), kEffCorrPtRapPhi); retVal = hist->GetBinContent(hist->FindBin(v0.pt(), rap, v0.phi())); } else { @@ -1189,7 +1200,7 @@ struct LambdaTableProducer { analyzeMcRecoGen(mcCollision, collisions, V0s, tracks, mcParticles); } - PROCESS_SWITCH(LambdaTableProducer, processMCRun3, "Process for Run3 MC Generated", false); + PROCESS_SWITCH(LambdaTableProducer, processMCRun3, "Process for Run3 MC RecoGen", false); void processMCRun2(soa::Join::iterator const& mcCollision, soa::SmallGroups> const& collisions, @@ -1199,7 +1210,72 @@ struct LambdaTableProducer { analyzeMcRecoGen(mcCollision, collisions, V0s, tracks, mcParticles); } - PROCESS_SWITCH(LambdaTableProducer, processMCRun2, "Process for Run2 MC Generated", false); + PROCESS_SWITCH(LambdaTableProducer, processMCRun2, "Process for Run2 MC RecoGen", false); + + // Temperory process function to check differences in way of computations (Will be deleted in future !!!) + void processMCRecoRun3(soa::Join::iterator const& collision, + soa::Join const&, + McV0Tracks const& V0s, TracksMC const& tracks, + aod::McParticles const& mcParticles) + { + // see if reco collison pass event selection + if (!collision.has_mcCollision() || !selCollision(collision)) { + return; + } + + // Now we have reco event + // Fill V0 Lambda Table + fillLambdaRecoTables(collision, V0s, tracks); + + // Get the mcCollision and mcParticles associated to this reco event + auto mccol = collision.mcCollision_as>(); + auto mcparticles = mcParticles.sliceByCached(aod::mcparticle::mcCollisionId, mccol.globalIndex(), cache); + + // Fill McGen Collision Table + lambdaMCGenCollisionTable(mccol.centFT0M(), mccol.posX(), mccol.posY(), mccol.posZ()); + + // initialize track objects + ParticleType v0Type = kLambda; + float rap = 0.; + for (auto const& mcpart : mcparticles) { + // check for Lambda first + if (mcpart.pdgCode() == kLambda0) { + v0Type = kLambda; + } else if (mcpart.pdgCode() == kLambda0Bar) { + v0Type = kAntiLambda; + } else { + continue; + } + + // check for Primary Lambda/AntiLambda + if (cGenPrimaryLambda && !mcpart.isPhysicalPrimary()) { + continue; + } else if (cGenSecondaryLambda && mcpart.isPhysicalPrimary()) { + continue; + } + + // Decide Eta/Rap + if (!cDoEtaAnalysis) { + rap = mcpart.y(); + } else { + rap = mcpart.eta(); + } + + // Apply Kinematic Acceptance + if (!kinCutSelection(mcpart.pt(), std::abs(rap), cMinV0Pt, cMaxV0Pt, cMaxV0Rap)) { + continue; + } + + histos.fill(HIST("Tracks/h1f_tracks_info"), kGenTotAccLambda); + + // Fill Lambda McGen Table + lambdaMCGenTrackTable(lambdaMCGenCollisionTable.lastIndex(), mcpart.px(), mcpart.py(), mcpart.pz(), + mcpart.pt(), mcpart.eta(), mcpart.phi(), mcpart.y(), RecoDecay::m(mcpart.p(), mcpart.e()), + -999., 999., (int8_t)v0Type, -999., -999., 1.); + } + } + + PROCESS_SWITCH(LambdaTableProducer, processMCRecoRun3, "Process for Run3 MC Reconstructed", false); }; struct LambdaTracksExtProducer { @@ -1370,10 +1446,6 @@ struct LambdaR2Correlation { // Eta/Rap Analysis Configurable cDoEtaAnalysis{"cDoEtaAnalysis", false, "Eta/Rap Analysis Flag"}; - // Generator Level Particles - Configurable cGenParticleFlag{"cGenParticleFlag", true, "Generator Number Flag"}; - Configurable cGenParticles{"cGenParticles", 3, "Number of Truth Lambda to construct correlation"}; - // Histogram Registry. HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; From 312f27f1b8e53efede96403bea6b59a4f40b988d Mon Sep 17 00:00:00 2001 From: bghanley1995 Date: Tue, 8 Apr 2025 18:01:19 -0400 Subject: [PATCH 0945/1650] [PWGCF] IdentifiedBF Removed references to McParticles in irrelevant places. (#10792) Co-authored-by: ALICE Action Bot --- .../TableProducer/identifiedBfFilter.cxx | 15 +++++++-------- .../Tasks/identifiedbf.cxx | 17 +++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx b/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx index 8dc80ba268a..6508dcd0a8a 100644 --- a/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx +++ b/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx @@ -76,6 +76,9 @@ bool fullDerivedData = false; /* produce full derived data for its external stor TList* ccdblst = nullptr; bool loadfromccdb = false; +std::vector recoIdMethods = {0, 1, 2}; // Reconstructed PID Methods, 0 is no PID, 1 is calculated PID, 2 is MC PID +std::vector trackTypes = {0, 1, 2, 3}; + //============================================================================================ // The IdentifiedBfFilter histogram objects // TODO: consider registering in the histogram registry @@ -858,7 +861,6 @@ struct IdentifiedBfFilterTracks { 48, -6, 6, ptbins, ptlow, ptup); } - LOGF(info, "Making histos"); for (int sp = 0; sp < kIdBfNoOfSpecies + 1; ++sp) { fhPA[sp] = new TH1F(TString::Format("fHistPA_%s", speciesName[sp]).Data(), @@ -950,7 +952,6 @@ struct IdentifiedBfFilterTracks { fOutputList->Add(fhNSigmaTPCIdTrks[sp]); } - LOGF(info, "Adding Histos to list"); for (int sp = 0; sp < kIdBfNoOfSpecies + 1; ++sp) { fOutputList->Add(fhPA[sp]); fOutputList->Add(fhPtA[sp]); @@ -963,10 +964,8 @@ struct IdentifiedBfFilterTracks { fOutputList->Add(fhdEdxA[sp]); fOutputList->Add(fhdEdxIPTPCA[sp]); } - LOGF(info, "Adding Additional Histos to list"); fOutputList->Add(fhdEdxA[kIdBfNoOfSpecies + 1]); fOutputList->Add(fhdEdxIPTPCA[kIdBfNoOfSpecies + 1]); - LOGF(info, "Added additional histos to list "); } if ((fDataType != kData) && (fDataType != kDataNoEvtSel)) { @@ -1603,15 +1602,15 @@ inline int8_t IdentifiedBfFilterTracks::acceptTrack(TrackObject const& track) if (ptlow < track.pt() && track.pt() < ptup && etalow < track.eta() && track.eta() < etaup) { fillTrackHistosAfterSelection(track, kIdBfCharged); MatchRecoGenSpecies sp = kWrongSpecies; - if (recoIdMethod == 0) { + if (recoIdMethod == recoIdMethods[0]) { sp = kIdBfCharged; - } else if (recoIdMethod == 1) { + } else if (recoIdMethod == recoIdMethods[1]) { if constexpr (framework::has_type_v || framework::has_type_v) { sp = identifyTrack(track); } else { LOGF(fatal, "Track identification required but PID information not present"); } - } else if (recoIdMethod == 2) { + } else if (recoIdMethod == recoIdMethods[2]) { if constexpr (framework::has_type_v) { sp = identifyParticle(track.template mcParticle_as()); } else { @@ -1739,7 +1738,7 @@ int8_t IdentifiedBfFilterTracks::selectTrackAmbiguousCheck(CollisionObjects cons fhAmbiguousTrackType->Fill(tracktype, multiplicityclass); fhAmbiguousTrackPt->Fill(track.pt(), multiplicityclass); fhAmbiguityDegree->Fill(zvertexes.size(), multiplicityclass); - if (tracktype == 2) { + if (tracktype == trackTypes[2]) { fhCompatibleCollisionsZVtxRms->Fill(-computeRMS(zvertexes), multiplicityclass); } else { fhCompatibleCollisionsZVtxRms->Fill(computeRMS(zvertexes), multiplicityclass); diff --git a/PWGCF/TwoParticleCorrelations/Tasks/identifiedbf.cxx b/PWGCF/TwoParticleCorrelations/Tasks/identifiedbf.cxx index 71d6e40e2f3..8612613d216 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/identifiedbf.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/identifiedbf.cxx @@ -67,6 +67,8 @@ float deltaphibinwidth = constants::math::TwoPI / deltaphibins; float deltaphilow = 0.0 - deltaphibinwidth / 2.0; float deltaphiup = constants::math::TwoPI - deltaphibinwidth / 2.0; +int maxLogComb = 10; + bool processpairs = false; bool processmixedevents = false; bool ptorder = false; @@ -1146,13 +1148,13 @@ struct IdentifiedbfTask { Filter onlyacceptedcollisions = (aod::identifiedbffilter::collisionaccepted == uint8_t(true)); Filter onlyacceptedtracks = (aod::identifiedbffilter::trackacceptedid >= int8_t(0)); - void processRecLevel(soa::Filtered::iterator const& collision, aod::BCsWithTimestamps const&, soa::Filtered const& tracks, aod::McParticles const&) + void processRecLevel(soa::Filtered::iterator const& collision, aod::BCsWithTimestamps const&, soa::Filtered const& tracks) { processSame(collision, tracks, collision.bc_as().timestamp()); } PROCESS_SWITCH(IdentifiedbfTask, processRecLevel, "Process reco level correlations", false); - void processRecLevelCheck(aod::Collisions const& collisions, aod::Tracks const& tracks, aod::McParticles const&) + void processRecLevelCheck(aod::Collisions const& collisions, aod::Tracks const& tracks) { int nAssignedTracks = 0; int nNotAssignedTracks = 0; @@ -1209,8 +1211,7 @@ struct IdentifiedbfTask { void processRecLevelNotStored( soa::Filtered>::iterator const& collision, aod::BCsWithTimestamps const&, - soa::Filtered> const& tracks, - aod::McParticles const&) + soa::Filtered> const& tracks) { processSame(collision, tracks, collision.bc_as().timestamp()); } @@ -1263,7 +1264,7 @@ struct IdentifiedbfTask { LOGF(IDENTIFIEDBFLOGCOLLISIONS, "Received %d collisions", collisions.size()); int logcomb = 0; for (const auto& [collision1, tracks1, collision2, tracks2] : pairreco) { - if (logcomb < 10) { + if (logcomb < correlationstask::maxLogComb) { LOGF(IDENTIFIEDBFLOGCOLLISIONS, "Received collision pair: %ld (%f, %f): %s, %ld (%f, %f): %s", collision1.globalIndex(), collision1.posZ(), collision1.centmult(), collision1.collisionaccepted() ? "accepted" : "not accepted", collision2.globalIndex(), collision2.posZ(), collision2.centmult(), collision2.collisionaccepted() ? "accepted" : "not accepted"); @@ -1298,7 +1299,7 @@ struct IdentifiedbfTask { LOGF(IDENTIFIEDBFLOGCOLLISIONS, "Received %d collisions", collisions.size()); int logcomb = 0; for (const auto& [collision1, tracks1, collision2, tracks2] : pairreco) { - if (logcomb < 10) { + if (logcomb < correlationstask::maxLogComb) { LOGF(IDENTIFIEDBFLOGCOLLISIONS, "Received collision pair: %ld (%f, %f): %s, %ld (%f, %f): %s", collision1.globalIndex(), @@ -1344,7 +1345,7 @@ struct IdentifiedbfTask { LOGF(IDENTIFIEDBFLOGCOLLISIONS, "Received %d generated collisions", collisions.size()); int logcomb = 0; for (const auto& [collision1, tracks1, collision2, tracks2] : pairgen) { - if (logcomb < 10) { + if (logcomb < correlationstask::maxLogComb) { LOGF(IDENTIFIEDBFLOGCOLLISIONS, "Received generated collision pair: %ld (%f, %f): %s, %ld (%f, %f): %s", collision1.globalIndex(), collision1.posZ(), collision1.centmult(), collision1.collisionaccepted() ? "accepted" : "not accepted", collision2.globalIndex(), collision2.posZ(), collision2.centmult(), collision2.collisionaccepted() ? "accepted" : "not accepted"); @@ -1377,7 +1378,7 @@ struct IdentifiedbfTask { LOGF(IDENTIFIEDBFLOGCOLLISIONS, "Received %d generated collisions", collisions.size()); int logcomb = 0; for (const auto& [collision1, tracks1, collision2, tracks2] : pairgen) { - if (logcomb < 10) { + if (logcomb < correlationstask::maxLogComb) { LOGF(IDENTIFIEDBFLOGCOLLISIONS, "Received generated collision pair: %ld (%f, %f): %s, %ld (%f, %f): %s", collision1.globalIndex(), From ad011448b0794c92bccaa1c42e41f5e11df9fb84 Mon Sep 17 00:00:00 2001 From: fuchuncui <162277233+fuchuncui@users.noreply.github.com> Date: Wed, 9 Apr 2025 06:06:33 +0800 Subject: [PATCH 0946/1650] [PWGCF] Add MCRec for closure test (#10786) --- PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx | 379 ++++++++++++++++++++++++---- 1 file changed, 334 insertions(+), 45 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx b/PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx index 9d749b65d43..cc244a1ba53 100644 --- a/PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx +++ b/PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx @@ -53,16 +53,16 @@ using namespace o2::framework; using namespace o2::framework::expressions; namespace { -std::shared_ptr refc22[20]; -std::shared_ptr refc24[20]; -std::shared_ptr k0sc22[20]; -std::shared_ptr k0sc24[20]; -std::shared_ptr lambdac22[20]; -std::shared_ptr lambdac24[20]; -std::shared_ptr xic22[20]; -std::shared_ptr xic24[20]; -std::shared_ptr omegac22[20]; -std::shared_ptr omegac24[20]; +std::shared_ptr refc22[10]; +std::shared_ptr refc24[10]; +std::shared_ptr k0sc22[10]; +std::shared_ptr k0sc24[10]; +std::shared_ptr lambdac22[10]; +std::shared_ptr lambdac24[10]; +std::shared_ptr xic22[10]; +std::shared_ptr xic24[10]; +std::shared_ptr omegac22[10]; +std::shared_ptr omegac24[10]; } // namespace #define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable NAME{#NAME, DEFAULT, HELP}; @@ -133,16 +133,12 @@ struct FlowGfwOmegaXi { ConfigurableAxis cfgaxisLocalDensity{"cfgaxisLocalDensity", {200, 0, 600}, "local density"}; AxisSpec axisMultiplicity{{0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90}, "Centrality (%)"}; - AxisSpec axisOmegaMass = {80, 1.63f, 1.71f, "Inv. Mass (GeV)"}; - AxisSpec axisXiMass = {70, 1.3f, 1.37f, "Inv. Mass (GeV)"}; - AxisSpec axisK0sMass = {400, 0.4f, 0.6f, "Inv. Mass (GeV)"}; - AxisSpec axisLambdaMass = {160, 1.08f, 1.16f, "Inv. Mass (GeV)"}; Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtPOIMin) && (aod::track::pt < cfgCutPtPOIMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls); using TracksPID = soa::Join; - using AodTracks = soa::Filtered>; // tracks filter + using AodTracks = soa::Filtered>; // tracks filter using AodCollisions = soa::Filtered>; // collisions filter using DaughterTracks = soa::Join; @@ -298,7 +294,7 @@ struct FlowGfwOmegaXi { registry.add("Lambdac24dpt", ";pt ; C_{2}{4} ", {HistType::kTProfile3D, {cfgaxisPtV0, cfgaxisLambdaMassforflow, axisMultiplicity}}); // for Jackknife if (cfgDoJackknife) { - for (int i = 1; i <= nPtBins; i++) { + for (int i = 1; i <= 10; i++) { refc22[i - 1] = registry.add(Form("Jackknife/REF/c22_%d", i), ";Centrality (%) ; C_{2}{2} ", {HistType::kTProfile, {axisMultiplicity}}); refc24[i - 1] = registry.add(Form("Jackknife/REF/c24_%d", i), ";Centrality (%) ; C_{2}{2} ", {HistType::kTProfile, {axisMultiplicity}}); xic22[i - 1] = registry.add(Form("Jackknife/Xi/Xic22dpt_%d", i), ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtXi, cfgaxisXiMassforflow, axisMultiplicity}}); @@ -318,6 +314,10 @@ struct FlowGfwOmegaXi { registry.add("MC/K0sc22dptMC", ";pt ; C_{2}{2} ", {HistType::kTProfile2D, {cfgaxisPtV0, axisMultiplicity}}); registry.add("MC/Lambdac22dptMC", ";pt ; C_{2}{2} ", {HistType::kTProfile2D, {cfgaxisPtV0, axisMultiplicity}}); // InvMass(GeV) of casc and v0 + AxisSpec axisOmegaMass = {80, 1.63f, 1.71f, "Inv. Mass (GeV)"}; + AxisSpec axisXiMass = {70, 1.3f, 1.37f, "Inv. Mass (GeV)"}; + AxisSpec axisK0sMass = {400, 0.4f, 0.6f, "Inv. Mass (GeV)"}; + AxisSpec axisLambdaMass = {160, 1.08f, 1.16f, "Inv. Mass (GeV)"}; registry.add("InvMassXi_all", "", {HistType::kTHnSparseF, {cfgaxisPtXi, axisXiMass, cfgaxisEta, axisMultiplicity}}); registry.add("InvMassOmega_all", "", {HistType::kTHnSparseF, {cfgaxisPtXi, axisOmegaMass, cfgaxisEta, axisMultiplicity}}); registry.add("InvMassOmega", "", {HistType::kTHnSparseF, {cfgaxisPtXi, axisOmegaMass, cfgaxisEta, axisMultiplicity}}); @@ -776,7 +776,7 @@ struct FlowGfwOmegaXi { if (cfgDoLocDenCorr) { hLocalDensity->Fill(track.phi(), wacc * weff); hLocalDensity->Fill(RecoDecay::constrainAngle(track.phi(), -constants::math::TwoPI), wacc * weff); - nch++; + nch += wacc * weff; } } if (cfgOutputNUAWeights) @@ -1090,7 +1090,7 @@ struct FlowGfwOmegaXi { } PROCESS_SWITCH(FlowGfwOmegaXi, processData, "", true); - void processMC(aod::McCollisions::iterator const&, soa::Join const& tracksGen, soa::SmallGroups> const& collisionsRec, AodTracks const&) + void processMCGen(aod::McCollisions::iterator const&, soa::Join const& tracksGen, soa::SmallGroups> const& collisionsRec, AodTracks const&) { fGFW->Clear(); int nch = 0; @@ -1135,50 +1135,43 @@ struct FlowGfwOmegaXi { } registry.fill(HIST("MC/hCentvsNchMC"), cent, nch); - for (const auto& cascGen : tracksGen) { - if (!cascGen.isPhysicalPrimary()) + for (const auto& straGen : tracksGen) { + if (!straGen.isPhysicalPrimary()) continue; - int pdgCode = std::abs(cascGen.pdgCode()); - if (pdgCode != PDG_t::kXiMinus && pdgCode != PDG_t::kOmegaMinus) + int pdgCode = std::abs(straGen.pdgCode()); + if (pdgCode != PDG_t::kXiMinus && pdgCode != PDG_t::kOmegaMinus && pdgCode != PDG_t::kK0Short && pdgCode != PDG_t::kLambda0) continue; - if (std::fabs(cascGen.eta()) > 0.8) + if (std::fabs(straGen.eta()) > 0.8) continue; + if (pdgCode == PDG_t::kXiMinus) { - int phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(cascGen.phi(), -constants::math::PI)); + int phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(straGen.phi(), -constants::math::PI)); double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); if (cfgOutputLocDenWeights) - registry.fill(HIST("MC/densityMCGenXi"), cascGen.pt(), nch, density); - fGFW->Fill(cascGen.eta(), fXiPtAxis->FindBin(cascGen.pt()) - 1, cascGen.phi(), 1, 128); + registry.fill(HIST("MC/densityMCGenXi"), straGen.pt(), nch, density); + fGFW->Fill(straGen.eta(), fXiPtAxis->FindBin(straGen.pt()) - 1, straGen.phi(), 1, 128); } if (pdgCode == PDG_t::kOmegaMinus) { - int phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(cascGen.phi(), -constants::math::PI)); + int phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(straGen.phi(), -constants::math::PI)); double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); if (cfgOutputLocDenWeights) - registry.fill(HIST("MC/densityMCGenOmega"), cascGen.pt(), nch, density); - fGFW->Fill(cascGen.eta(), fXiPtAxis->FindBin(cascGen.pt()) - 1, cascGen.phi(), 1, 256); + registry.fill(HIST("MC/densityMCGenOmega"), straGen.pt(), nch, density); + fGFW->Fill(straGen.eta(), fXiPtAxis->FindBin(straGen.pt()) - 1, straGen.phi(), 1, 256); } - } - for (const auto& v0Gen : tracksGen) { - if (!v0Gen.isPhysicalPrimary()) - continue; - int pdgCode = std::abs(v0Gen.pdgCode()); - if (pdgCode != PDG_t::kK0Short && pdgCode != PDG_t::kLambda0) - continue; - if (std::fabs(v0Gen.eta()) > 0.8) - continue; + if (pdgCode == PDG_t::kK0Short) { - int phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(v0Gen.phi(), -constants::math::PI)); + int phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(straGen.phi(), -constants::math::PI)); double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); if (cfgOutputLocDenWeights) - registry.fill(HIST("MC/densityMCGenK0s"), v0Gen.pt(), nch, density); - fGFW->Fill(v0Gen.eta(), fXiPtAxis->FindBin(v0Gen.pt()) - 1, v0Gen.phi(), 1, 512); + registry.fill(HIST("MC/densityMCGenK0s"), straGen.pt(), nch, density); + fGFW->Fill(straGen.eta(), fXiPtAxis->FindBin(straGen.pt()) - 1, straGen.phi(), 1, 512); } if (pdgCode == PDG_t::kLambda0) { - int phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(v0Gen.phi(), -constants::math::PI)); + int phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(straGen.phi(), -constants::math::PI)); double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); if (cfgOutputLocDenWeights) - registry.fill(HIST("MC/densityMCGenLambda"), v0Gen.pt(), nch, density); - fGFW->Fill(v0Gen.eta(), fXiPtAxis->FindBin(v0Gen.pt()) - 1, v0Gen.phi(), 1, 1024); + registry.fill(HIST("MC/densityMCGenLambda"), straGen.pt(), nch, density); + fGFW->Fill(straGen.eta(), fXiPtAxis->FindBin(straGen.pt()) - 1, straGen.phi(), 1, 1024); } } fillProfile(corrconfigs.at(25), HIST("MC/c22MC"), cent); @@ -1197,7 +1190,303 @@ struct FlowGfwOmegaXi { delete hLocalDensity; } - PROCESS_SWITCH(FlowGfwOmegaXi, processMC, "", true); + PROCESS_SWITCH(FlowGfwOmegaXi, processMCGen, "", true); + + void processMCRec(AodCollisions::iterator const& collision, AodTracks const& tracks, aod::BCsWithTimestamps const&, soa::Join const& V0s, soa::Join const& Cascades, DaughterTracks const&, aod::McParticles const&) + { + fGFW->Clear(); + const auto cent = collision.centFT0C(); + if (!collision.sel8()) + return; + if (eventSelected(collision, cent)) + return; + TH1D* hLocalDensity = new TH1D("hphi", "hphi", 400, -constants::math::TwoPI, constants::math::TwoPI); + auto bc = collision.bc_as(); + loadCorrections(bc.timestamp()); + float vtxz = collision.posZ(); + registry.fill(HIST("hVtxZ"), vtxz); + registry.fill(HIST("hCent"), cent); + + float weff = 1; + float wacc = 1; + float wloc = 1; + double nch = 0; + + for (const auto& track : tracks) { + if (cfgDoAccEffCorr) { + if (!setCurrentParticleWeights(weff, wacc, track, vtxz, 0)) + continue; + } + registry.fill(HIST("hPhi"), track.phi()); + registry.fill(HIST("hPhicorr"), track.phi(), wacc); + registry.fill(HIST("hEta"), track.eta()); + registry.fill(HIST("hEtaPhiVtxzREF"), track.phi(), track.eta(), vtxz, wacc); + registry.fill(HIST("hPt"), track.pt()); + int ptbin = fPtAxis->FindBin(track.pt()) - 1; + if ((track.pt() > cfgCutPtMin) && (track.pt() < cfgCutPtMax)) { + fGFW->Fill(track.eta(), ptbin, track.phi(), wacc * weff, 1); //(eta, ptbin, phi, wacc*weff, bitmask) + } + if ((track.pt() > cfgCutPtPOIMin) && (track.pt() < cfgCutPtPOIMax)) { + fGFW->Fill(track.eta(), ptbin, track.phi(), wacc * weff, 32); + if (cfgDoLocDenCorr) { + hLocalDensity->Fill(track.phi(), wacc * weff); + hLocalDensity->Fill(RecoDecay::constrainAngle(track.phi(), -constants::math::TwoPI), wacc * weff); + nch += wacc * weff; + } + } + } + if (cfgDoLocDenCorr) { + registry.fill(HIST("hCentvsNch"), cent, nch); + } + + for (const auto& casc : Cascades) { + if (!casc.has_mcParticle()) + continue; + auto cascMC = casc.mcParticle_as(); + auto negdau = casc.negTrack_as(); + auto posdau = casc.posTrack_as(); + auto bachelor = casc.bachelor_as(); + // fill QA + registry.fill(HIST("QAhisto/Casc/hqaCasccosPAbefore"), casc.casccosPA(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqaCascV0cosPAbefore"), casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqadcaCascV0toPVbefore"), casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqadcaCascBachtoPVbefore"), casc.dcabachtopv()); + registry.fill(HIST("QAhisto/Casc/hqadcaCascdaubefore"), casc.dcacascdaughters()); + registry.fill(HIST("QAhisto/Casc/hqadcaCascV0daubefore"), casc.dcaV0daughters()); + // track quality check + if (bachelor.tpcNClsFound() < cfgtpcclusters) + continue; + if (posdau.tpcNClsFound() < cfgtpcclusters) + continue; + if (negdau.tpcNClsFound() < cfgtpcclusters) + continue; + if (bachelor.itsNCls() < cfgitsclusters) + continue; + if (posdau.itsNCls() < cfgitsclusters) + continue; + if (negdau.itsNCls() < cfgitsclusters) + continue; + // topological cut + if (casc.cascradius() < cfgcasc_radius) + continue; + if (casc.casccosPA(collision.posX(), collision.posY(), collision.posZ()) < cfgcasc_casccospa) + continue; + if (casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ()) < cfgcasc_v0cospa) + continue; + if (std::fabs(casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ())) < cfgcasc_dcav0topv) + continue; + if (std::fabs(casc.dcabachtopv()) < cfgcasc_dcabachtopv) + continue; + if (casc.dcacascdaughters() > cfgcasc_dcacascdau) + continue; + if (casc.dcaV0daughters() > cfgcasc_dcav0dau) + continue; + if (std::fabs(casc.mLambda() - o2::constants::physics::MassLambda0) > cfgcasc_mlambdawindow) + continue; + // fill QA + registry.fill(HIST("QAhisto/Casc/hqaCasccosPAafter"), casc.casccosPA(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqaCascV0cosPAafter"), casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqadcaCascV0toPVafter"), casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqadcaCascBachtoPVafter"), casc.dcabachtopv()); + registry.fill(HIST("QAhisto/Casc/hqadcaCascdauafter"), casc.dcacascdaughters()); + registry.fill(HIST("QAhisto/Casc/hqadcaCascV0dauafter"), casc.dcaV0daughters()); + // Omega and antiOmega + int pdgCode{cascMC.pdgCode()}; + double cascPt{cascMC.pt()}; + double cascPhi{casc.phi()}; + double cascEta{casc.eta()}; + if (std::abs(pdgCode) == kOmegaMinus) { + if (casc.sign() < 0 && (casc.mOmega() > 1.63) && (casc.mOmega() < 1.71) && std::fabs(casc.yOmega()) < cfgCasc_rapidity && + (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { + if (cfgDoAccEffCorr) + setCurrentParticleWeights(weff, wacc, casc, vtxz, 4); + if (cfgDoLocDenCorr) { + int phibin = -999; + phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(cascPhi, -constants::math::PI)); + if (phibin > -900) { + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + setCurrentLocalDensityWeights(wloc, casc, density, 4); + if (cfgOutputLocDenWeights) + registry.fill(HIST("MC/densityMCRecOmega"), cascPt, nch, density, casc.mOmega()); + } + } + fGFW->Fill(cascEta, fXiPtAxis->FindBin(cascPt) - 1, cascPhi, wacc * weff * wloc, 4); + } else if (casc.sign() > 0 && (casc.mOmega() > 1.63) && (casc.mOmega() < 1.71) && std::fabs(casc.yOmega()) < cfgCasc_rapidity && + (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0]))) { + if (cfgDoAccEffCorr) + setCurrentParticleWeights(weff, wacc, casc, vtxz, 4); + if (cfgDoLocDenCorr) { + int phibin = -999; + phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(cascPhi, -constants::math::PI)); + if (phibin > -900) { + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + setCurrentLocalDensityWeights(wloc, casc, density, 4); + if (cfgOutputLocDenWeights) + registry.fill(HIST("MC/densityMCRecOmega"), cascPt, nch, density, casc.mOmega()); + } + } + fGFW->Fill(cascEta, fXiPtAxis->FindBin(cascPt) - 1, cascPhi, wacc * weff * wloc, 4); + } + } + // Xi and antiXi + if (std::abs(pdgCode) == kXiMinus) { + if (casc.sign() < 0 && (casc.mXi() > 1.30) && (casc.mXi() < 1.37) && std::fabs(casc.yXi()) < cfgCasc_rapidity && + (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { + if (cfgDoAccEffCorr) + setCurrentParticleWeights(weff, wacc, casc, vtxz, 3); + if (cfgDoLocDenCorr) { + int phibin = -999; + phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(cascPhi, -constants::math::PI)); + if (phibin > -900) { + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + setCurrentLocalDensityWeights(wloc, casc, density, 3); + if (cfgOutputLocDenWeights) + registry.fill(HIST("MC/densityMCRecXi"), cascPt, nch, density, casc.mXi()); + } + } + fGFW->Fill(cascEta, fXiPtAxis->FindBin(cascPt) - 1, cascPhi, wacc * weff * wloc, 2); + } else if (casc.sign() > 0 && (casc.mXi() > 1.30) && (casc.mXi() < 1.37) && std::fabs(casc.yXi()) < cfgCasc_rapidity && + (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0]))) { + if (cfgDoAccEffCorr) + setCurrentParticleWeights(weff, wacc, casc, vtxz, 3); + if (cfgDoLocDenCorr) { + int phibin = -999; + phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(cascPhi, -constants::math::PI)); + if (phibin > -900) { + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + setCurrentLocalDensityWeights(wloc, casc, density, 3); + if (cfgOutputLocDenWeights) + registry.fill(HIST("MC/densityMCRecXi"), cascPt, nch, density, casc.mXi()); + } + } + fGFW->Fill(cascEta, fXiPtAxis->FindBin(cascPt) - 1, cascPhi, wacc * weff * wloc, 2); + } + } + } + + for (const auto& v0 : V0s) { + if (!v0.has_mcParticle()) + continue; + auto v0MC = v0.mcParticle_as(); + auto v0negdau = v0.negTrack_as(); + auto v0posdau = v0.posTrack_as(); + + // fill QA before cut + registry.fill(HIST("QAhisto/V0/hqaV0radiusbefore"), v0.v0radius()); + registry.fill(HIST("QAhisto/V0/hqaV0cosPAbefore"), v0.v0cosPA()); + registry.fill(HIST("QAhisto/V0/hqadcaV0daubefore"), v0.dcaV0daughters()); + registry.fill(HIST("QAhisto/V0/hqadcapostoPVbefore"), v0.dcapostopv()); + registry.fill(HIST("QAhisto/V0/hqadcanegtoPVbefore"), v0.dcanegtopv()); + registry.fill(HIST("QAhisto/V0/hqaarm_podobefore"), v0.alpha(), v0.qtarm()); + // track quality check + if (v0posdau.tpcNClsFound() < cfgtpcclusters) + continue; + if (v0negdau.tpcNClsFound() < cfgtpcclusters) + continue; + if (v0posdau.tpcNClsFindable() < cfgtpcclufindable) + continue; + if (v0negdau.tpcNClsFindable() < cfgtpcclufindable) + continue; + if (v0posdau.tpcCrossedRowsOverFindableCls() < cfgtpccrossoverfindable) + continue; + if (v0posdau.itsNCls() < cfgitsclusters) + continue; + if (v0negdau.itsNCls() < cfgitsclusters) + continue; + // topological cut + if (v0.v0radius() < cfgv0_radius) + continue; + if (v0.v0cosPA() < cfgv0_v0cospa) + continue; + if (v0.dcaV0daughters() > cfgv0_dcav0dau) + continue; + if (std::fabs(v0.dcapostopv()) < cfgv0_dcadautopv) + continue; + if (std::fabs(v0.dcanegtopv()) < cfgv0_dcadautopv) + continue; + // fill QA after cut + registry.fill(HIST("QAhisto/V0/hqaV0radiusafter"), v0.v0radius()); + registry.fill(HIST("QAhisto/V0/hqaV0cosPAafter"), v0.v0cosPA()); + registry.fill(HIST("QAhisto/V0/hqadcaV0dauafter"), v0.dcaV0daughters()); + registry.fill(HIST("QAhisto/V0/hqadcapostoPVafter"), v0.dcapostopv()); + registry.fill(HIST("QAhisto/V0/hqadcanegtoPVafter"), v0.dcanegtopv()); + + int pdgCode{v0MC.pdgCode()}; + double v0Pt{v0MC.pt()}; + double v0Phi{v0MC.phi()}; + double v0Eta{v0MC.eta()}; + // K0short + if (std::abs(pdgCode) == kK0Short) { + if (v0.qtarm() / std::fabs(v0.alpha()) > cfgv0_ArmPodocut && std::fabs(v0.y()) < 0.5 && std::fabs(v0.mK0Short() - o2::constants::physics::MassK0Short) < cfgv0_mk0swindow && + (!cfgcheckDauTPC || (std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { + if (cfgDoAccEffCorr) + setCurrentParticleWeights(weff, wacc, v0, vtxz, 1); + if (cfgDoLocDenCorr) { + int phibin = -999; + phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(v0Phi, -constants::math::PI)); + if (phibin > -900) { + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + setCurrentLocalDensityWeights(wloc, v0, density, 1); + if (cfgOutputLocDenWeights) + registry.fill(HIST("MC/densityMCRecK0s"), v0Pt, nch, density, v0.mK0Short()); + } + } + fGFW->Fill(v0Eta, fV0PtAxis->FindBin(v0Pt) - 1, v0Phi, wacc * weff * wloc, 8); + } + } + // Lambda and antiLambda + if (std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < cfgv0_mlambdawindow && + (!cfgcheckDauTPC || (std::fabs(v0posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { + if (std::abs(pdgCode) == kLambda0) { + if (cfgDoAccEffCorr) + setCurrentParticleWeights(weff, wacc, v0, vtxz, 2); + if (cfgDoLocDenCorr) { + int phibin = -999; + phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(v0Phi, -constants::math::PI)); + if (phibin > -900) { + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + setCurrentLocalDensityWeights(wloc, v0, density, 2); + if (cfgOutputLocDenWeights) + registry.fill(HIST("MC/densityMCRecLambda"), v0Pt, nch, density, v0.mLambda()); + } + } + fGFW->Fill(v0Eta, fV0PtAxis->FindBin(v0Pt) - 1, v0Phi, wacc * weff * wloc, 16); + } + } else if (std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < cfgv0_mlambdawindow && + (!cfgcheckDauTPC || (std::fabs(v0negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0]))) { + if (std::abs(pdgCode) == kLambda0) { + if (cfgDoAccEffCorr) + setCurrentParticleWeights(weff, wacc, v0, vtxz, 2); + if (cfgDoLocDenCorr) { + int phibin = -999; + phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(v0Phi, -constants::math::PI)); + if (phibin > -900) { + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + setCurrentLocalDensityWeights(wloc, v0, density, 2); + if (cfgOutputLocDenWeights) + registry.fill(HIST("MC/densityMCRecLambda"), v0Pt, nch, density, v0.mLambda()); + } + } + fGFW->Fill(v0Eta, fV0PtAxis->FindBin(v0Pt) - 1, v0Phi, wacc * weff * wloc, 16); + } + } + } + delete hLocalDensity; + fillProfile(corrconfigs.at(15), HIST("c22"), cent); + for (int i = 1; i <= nV0PtBins; i++) { + fillProfilepTMass(corrconfigs.at(9), HIST("K0sc22dpt"), i, kK0Short, cent); + fillProfilepTMass(corrconfigs.at(10), HIST("K0sc22dpt"), i, kK0Short, cent); + fillProfilepTMass(corrconfigs.at(12), HIST("Lambdac22dpt"), i, kLambda0, cent); + fillProfilepTMass(corrconfigs.at(13), HIST("Lambdac22dpt"), i, kLambda0, cent); + } + for (int i = 1; i <= nXiPtBins; i++) { + fillProfilepTMass(corrconfigs.at(3), HIST("Xic22dpt"), i, kXiMinus, cent); + fillProfilepTMass(corrconfigs.at(4), HIST("Xic22dpt"), i, kXiMinus, cent); + fillProfilepTMass(corrconfigs.at(6), HIST("Omegac22dpt"), i, kOmegaMinus, cent); + fillProfilepTMass(corrconfigs.at(7), HIST("Omegac22dpt"), i, kOmegaMinus, cent); + } + } + PROCESS_SWITCH(FlowGfwOmegaXi, processMCRec, "", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 6b55858338b23c2c81eeccafc65295f6f1b952d2 Mon Sep 17 00:00:00 2001 From: alicja-pp <101565842+alicja-pp@users.noreply.github.com> Date: Wed, 9 Apr 2025 06:41:25 +0200 Subject: [PATCH 0947/1650] [PWGCF] FemtoUniverse: V0V0 pair fractions for MC truth (#10787) --- .../femtoUniverseProducerTask.cxx | 27 +++++++++----- .../femtoUniversePairTaskTrackV0Extended.cxx | 35 +++++++++++++++++++ 2 files changed, 53 insertions(+), 9 deletions(-) diff --git a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx index 5e2a0a7c27d..ce06e110b2c 100644 --- a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx +++ b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx @@ -130,6 +130,7 @@ struct FemtoUniverseProducerTask { Configurable confIsForceGRP{"confIsForceGRP", false, "Set true if the magnetic field configuration is not available in the usual CCDB directory (e.g. for Run 2 converted data or unanchorad Monte Carlo)"}; Configurable confDoSpher{"confDoSpher", false, "Calculate sphericity. If false sphericity will take value of 2."}; + Configurable confStoreMCmothers{"confStoreMCmothers", false, "MC truth: Fill with not only primary particles and store mothers' PDG in tempFitVar."}; Configurable confFillCollExt{"confFillCollExt", false, "Option to fill collision extended table"}; /// Event cuts @@ -675,20 +676,23 @@ struct FemtoUniverseProducerTask { } template - void fillDebugParticleMC(ParticleType const& particle) + int32_t getMotherPDG(ParticleType particle) { auto motherparticlesMC = particle.template mothers_as(); if (!motherparticlesMC.empty()) { auto motherparticleMC = motherparticlesMC.front(); - if (particle.isPhysicalPrimary()) - outputDebugPartsMC(0); - else - outputDebugPartsMC(motherparticleMC.pdgCode()); + return particle.isPhysicalPrimary() ? 0 : motherparticleMC.pdgCode(); } else { - outputDebugPartsMC(9999); + return 9999; } } + template + void fillDebugParticleMC(ParticleType const& particle) + { + outputDebugPartsMC(getMotherPDG(particle)); + } + template void fillMCParticle(ParticleType const& particle, o2::aod::femtouniverseparticle::ParticleType fdparttype) { @@ -1691,7 +1695,7 @@ struct FemtoUniverseProducerTask { if (pdgCode == 333) { // && (recoMcIds && recoMcIds->get().contains(particle.globalIndex()))) { // ATTENTION: all Phi mesons are NOT primary particles pass = true; } else { - if (particle.isPhysicalPrimary() || (confActivateSecondaries && recoMcIds && recoMcIds->get().contains(particle.globalIndex()))) + if (confStoreMCmothers || particle.isPhysicalPrimary() || (confActivateSecondaries && recoMcIds && recoMcIds->get().contains(particle.globalIndex()))) pass = true; } } @@ -1711,6 +1715,8 @@ struct FemtoUniverseProducerTask { // auto cutContainer = trackCuts.getCutContainer(track); // instead of the bitmask, the PDG of the particle is stored as uint32_t + int32_t variablePDG = confStoreMCmothers ? getMotherPDG(particle) : particle.pdgCode(); + // now the table is filled if constexpr (resolveDaughs) { tmpIDtrack.push_back(particle.globalIndex()); @@ -1724,7 +1730,7 @@ struct FemtoUniverseProducerTask { aod::femtouniverseparticle::ParticleType::kMCTruthTrack, 0, pdgCode, - pdgCode, + variablePDG, childIDs, 0, 0); @@ -1770,6 +1776,9 @@ struct FemtoUniverseProducerTask { } } } + + int32_t variablePDG = confStoreMCmothers ? getMotherPDG(particle) : particle.pdgCode(); + if (!confIsActivateCascade) { outputParts(outputCollision.lastIndex(), particle.pt(), @@ -1778,7 +1787,7 @@ struct FemtoUniverseProducerTask { aod::femtouniverseparticle::ParticleType::kMCTruthTrack, 0, static_cast(particle.pdgCode()), - particle.pdgCode(), + variablePDG, childIDs, 0, 0); diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx index 4b692eee6d9..2cf45ce0475 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx @@ -248,6 +248,8 @@ struct FemtoUniversePairTaskTrackV0Extended { registryMCtruth.add("minus/MCtruthPiPt", "MC truth pions;#it{p}_{T} (GeV/c)", {HistType::kTH1F, {{500, 0, 5}}}); registryMCtruth.add("minus/MCtruthPrPt", "MC truth protons;#it{p}_{T} (GeV/c)", {HistType::kTH1F, {{500, 0, 5}}}); + registryMCtruth.add("motherParticle", "pair fractions;part1 mother PDG;part2 mother PDG", {HistType::kTH2F, {{8001, -4000, 4000}, {8001, -4000, 4000}}}); + // MC reco registryMCreco.add("plus/MCrecoLambda", "MC reco Lambdas;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); registryMCreco.add("plus/MCrecoLambdaChildPr", "MC reco Lambdas;#it{p}_{T} (GeV/c); #eta", {HistType::kTH2F, {{500, 0, 5}, {400, -1.0, 1.0}}}); @@ -1013,6 +1015,39 @@ struct FemtoUniversePairTaskTrackV0Extended { } PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processPairFractionsV0, "Process MC data to obtain pair fractions for V0V0 pairs", false); + void processPairFractionsMCTruthV0(FilteredFDCollisions const& cols, FemtoFullParticles const& /*parts*/) + { + ColumnBinningPolicy colBinningMult{{confVtxBins, confMultBins}, true}; + ColumnBinningPolicy colBinningCent{{confVtxBins, confMultBins}, true}; + + auto mixedCollProcessFunc = [&](auto& collision1, auto& collision2) -> void { + auto groupPartsOne = partsTwoMC->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex(), cache); + auto groupPartsTwo = partsTwoMC->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision2.globalIndex(), cache); + + for (const auto& [p1, p2] : combinations(CombinationsFullIndexPolicy(groupPartsOne, groupPartsTwo))) { + int pdgCode1 = static_cast(p1.pidCut()); + if ((confV0Type1 == 0 && pdgCode1 != kLambda0) || (confV0Type1 == 1 && pdgCode1 != kLambda0Bar)) + continue; + int pdgCode2 = static_cast(p2.pidCut()); + if ((confV0Type2 == 0 && pdgCode2 != kLambda0) || (confV0Type2 == 1 && pdgCode2 != kLambda0Bar)) + continue; + + registryMCtruth.fill(HIST("motherParticle"), p1.tempFitVar(), p2.tempFitVar()); + } + }; + + if (confUseCent) { + for (const auto& [collision1, collision2] : soa::selfCombinations(colBinningCent, confNEventsMix, -1, cols, cols)) { + mixedCollProcessFunc(collision1, collision2); + } + } else { + for (const auto& [collision1, collision2] : soa::selfCombinations(colBinningMult, confNEventsMix, -1, cols, cols)) { + mixedCollProcessFunc(collision1, collision2); + } + } + } + PROCESS_SWITCH(FemtoUniversePairTaskTrackV0Extended, processPairFractionsMCTruthV0, "Process MC data to obtain pair fractions for V0V0 MC truth pairs", false); + void processMCReco(FemtoRecoParticles const& parts, aod::FdMCParticles const& mcparts) { for (const auto& part : parts) { From 33d15b5e689879d3108111d40b450d652dba5abc Mon Sep 17 00:00:00 2001 From: Nicolas Strangmann <77485327+nstrangm@users.noreply.github.com> Date: Wed, 9 Apr 2025 07:36:52 +0200 Subject: [PATCH 0948/1650] [PWGEM/PhotonMeson] Add HeavyNeutralMeson analysis task (#10790) Co-authored-by: Nicolas Strangmann --- .../PWGEM/HeavyNeutralMesonFilter.cxx | 21 +- PWGEM/PhotonMeson/Tasks/CMakeLists.txt | 5 + PWGEM/PhotonMeson/Tasks/HeavyNeutralMeson.cxx | 576 ++++++++++++++++++ PWGEM/PhotonMeson/Utils/HNMUtilities.h | 36 +- 4 files changed, 630 insertions(+), 8 deletions(-) create mode 100644 PWGEM/PhotonMeson/Tasks/HeavyNeutralMeson.cxx diff --git a/EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx b/EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx index 967a7021ad8..a7813d84576 100644 --- a/EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx +++ b/EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx @@ -208,6 +208,12 @@ struct HeavyNeutralMesonFilter { false, "Evt sel: check for offline selection"}; + Configurable ConfDoEMCShift{"ConfDoEMCShift", false, "Apply SM-wise shift in eta and phi to EMCal clusters to align with TPC tracks"}; + Configurable> ConfEMCEtaShift{"ConfEMCEtaShift", {0.f}, "values for SM-wise shift in eta to be added to EMCal clusters to align with TPC tracks"}; + Configurable> ConfEMCPhiShift{"ConfEMCPhiShift", {0.f}, "values for SM-wise shift in phi to be added to EMCal clusters to align with TPC tracks"}; + std::array EMCEtaShift = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + std::array EMCPhiShift = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + template bool isSelectedTrack(T const& track, CFTrigger::FemtoPartners partSpecies) { @@ -760,6 +766,14 @@ struct HeavyNeutralMesonFilter { mHistManager.add("etaprimep/fetaprimePtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); mHistManager.add("etaprimep/fProtonPtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); mHistManager.add("etaprimep/fAntiProtonPtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); + + if (ConfDoEMCShift.value) { + for (unsigned short iSM = 0; iSM < 20; iSM++) { + EMCEtaShift[iSM] = ConfEMCEtaShift.value[iSM]; + EMCPhiShift[iSM] = ConfEMCPhiShift.value[iSM]; + LOG(info) << "SM-wise shift in eta/phi for SM " << iSM << ": " << EMCEtaShift[iSM] << " / " << EMCPhiShift[iSM]; + } + } } Preslice perCollision_pcm = aod::v0photonkf::collisionId; Preslice perCollision_emc = aod::skimmedcluster::collisionId; @@ -817,10 +831,11 @@ struct HeavyNeutralMesonFilter { mHistManager.fill(HIST("Event/nClustersVsV0s"), clustersInThisCollision.size(), v0sInThisCollision.size()); mHistManager.fill(HIST("Event/nTracks"), tracksWithItsPid.size()); - hnmutilities::reconstructGGs(clustersInThisCollision, v0sInThisCollision, vGGs); + std::vector vGammas; + hnmutilities::storeGammasInVector(clustersInThisCollision, v0sInThisCollision, vGammas, EMCEtaShift, EMCPhiShift); + hnmutilities::reconstructGGs(vGammas, vGGs); + vGammas.clear(); processGGs(vGGs); - // hnmutilities::reconstructHeavyNeutralMesons(tracks, vGGs, vHNMs); - // processHNMs(vHNMs); bool isProton = false; bool isDeuteron = false; diff --git a/PWGEM/PhotonMeson/Tasks/CMakeLists.txt b/PWGEM/PhotonMeson/Tasks/CMakeLists.txt index 88edd482b19..ef25948726c 100644 --- a/PWGEM/PhotonMeson/Tasks/CMakeLists.txt +++ b/PWGEM/PhotonMeson/Tasks/CMakeLists.txt @@ -49,6 +49,11 @@ o2physics_add_dpl_workflow(emcal-qc PUBLIC_LINK_LIBRARIES O2::Framework O2::DetectorsBase O2Physics::AnalysisCore O2Physics::PWGEMPhotonMesonCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(heavy-neutral-meson + SOURCES HeavyNeutralMeson.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2::EMCALBase O2::EMCALCalib O2Physics::AnalysisCore O2Physics::PWGEMPhotonMesonCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(phos-qc SOURCES phosQC.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2::DetectorsBase O2Physics::AnalysisCore O2Physics::PWGEMPhotonMesonCore diff --git a/PWGEM/PhotonMeson/Tasks/HeavyNeutralMeson.cxx b/PWGEM/PhotonMeson/Tasks/HeavyNeutralMeson.cxx new file mode 100644 index 00000000000..432552c0033 --- /dev/null +++ b/PWGEM/PhotonMeson/Tasks/HeavyNeutralMeson.cxx @@ -0,0 +1,576 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// +/// \file HeavyNeutralMeson.cxx +/// +/// \brief This code loops over collisions to reconstruct heavy mesons (omega or eta') using EMCal clusters and V0s (PCM) +/// +/// \author Nicolas Strangmann (nicolas.strangmann@cern.ch) - Goethe University Frankfurt +/// + +#include +#include +#include +#include + +#include "Math/GenVector/Boost.h" +#include "Math/Vector4D.h" +#include "TMath.h" +#include "TRandom3.h" + +#include "PWGEM/PhotonMeson/Utils/HNMUtilities.h" + +#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/PIDResponseITS.h" +#include "fairlogger/Logger.h" +#include "Framework/Configurable.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/runDataProcessing.h" +#include "CommonConstants/MathConstants.h" +#include "Common/Core/TrackSelection.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Multiplicity.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::aod::pwgem::photonmeson; + +namespace o2::aod +{ +using MyBCs = soa::Join; +using MyCollisions = soa::Join; +using MyCollision = MyCollisions::iterator; +using SelectedTracks = soa::Join; +} // namespace o2::aod + +namespace HNMPID +{ + +enum TracksPID { + kPion, + kNTracksPID +}; + +enum PIDLimits { kTPCMin, + kTPCMax, + kTPCTOF, + kITSmin, + kITSmax, + kNPIDLimits +}; + +const std::vector SpeciesName{"pion"}; // ToDo include charged pions +const std::vector PtCutsName{"Pt min", "Pt max", "P TOF thres"}; +const std::vector PidCutsName{"TPC min", "TPC max", "TPCTOF max", "ITS min", "ITS max"}; +const float pidcutsTable[kNTracksPID][kNPIDLimits]{{-4.f, 4.f, 4.f, -99.f, 99.f}}; +const float ptcutsTable[kNTracksPID][3]{{0.35f, 6.f, 0.75f}}; +const float TPCNClustersMin[1][kNTracksPID]{{80.0f}}; +const float ITSNClustersMin[1][kNTracksPID]{{4}}; + +} // namespace HNMPID + +struct HeavyNeutralMeson { + + // PID selections + Configurable> ConfPIDCuts{"ConfPIDCuts", {HNMPID::pidcutsTable[0], HNMPID::kNTracksPID, HNMPID::kNPIDLimits, HNMPID::SpeciesName, HNMPID::PidCutsName}, "Heavy Neutral Meson PID nsigma selections"}; + Configurable> ConfPtCuts{"ConfPtCuts", {HNMPID::ptcutsTable[0], HNMPID::kNTracksPID, 3, HNMPID::SpeciesName, HNMPID::PtCutsName}, "Heavy Neutral Meson pT selections"}; + Configurable ConfTrkEta{"ConfTrkEta", 0.9, "Eta"}; + Configurable> ConfTPCNClustersMin{"ConfTPCNClustersMin", {HNMPID::TPCNClustersMin[0], 1, HNMPID::kNTracksPID, std::vector{"TPCNClusMin"}, HNMPID::SpeciesName}, "Mininum of TPC Clusters"}; + Configurable ConfTrkTPCfCls{"ConfTrkTPCfCls", 0.83, "Minimum fraction of crossed rows over findable clusters"}; + Configurable ConfTrkTPCcRowsMin{"ConfTrkTPCcRowsMin", 70, "Minimum number of crossed TPC rows"}; + Configurable ConfTrkTPCsClsSharedFrac{"ConfTrkTPCsClsSharedFrac", 1.f, "Fraction of shared TPC clusters"}; + Configurable> ConfTrkITSnclsMin{"ConfTrkITSnclsMin", {HNMPID::ITSNClustersMin[0], 1, HNMPID::kNTracksPID, std::vector{"Cut"}, HNMPID::SpeciesName}, "Minimum number of ITS clusters"}; + Configurable ConfTrkDCAxyMax{"ConfTrkDCAxyMax", 0.15, "Maximum DCA_xy"}; + Configurable ConfTrkDCAzMax{"ConfTrkDCAzMax", 0.3, "Maximum DCA_z"}; + Configurable ConfTrkMaxChi2PerClusterTPC{"ConfTrkMaxChi2PerClusterTPC", 4.0f, "Minimal track selection: max allowed chi2 per TPC cluster"}; // 4.0 is default of global tracks on 20.01.2023 + Configurable ConfTrkMaxChi2PerClusterITS{"ConfTrkMaxChi2PerClusterITS", 36.0f, "Minimal track selection: max allowed chi2 per ITS cluster"}; // 36.0 is default of global tracks on 20.01.2023 + Configurable ConfEvtSelectZvtx{"ConfEvtSelectZvtx", true, "Event selection includes max. z-Vertex"}; + Configurable ConfEvtZvtx{"ConfEvtZvtx", 10.f, "Evt sel: Max. z-Vertex (cm)"}; + Configurable ConfEvtOfflineCheck{"ConfEvtOfflineCheck", false, "Evt sel: check for offline selection"}; + Configurable cfgHNMMassCorrection{"cfgHNMMassCorrection", 1, "Use GG PDG mass to correct HNM mass (0 = off, 1 = subDeltaPi0, 2 = subLambda)"}; + static constexpr float defaultMassWindows[4] = {0.1, 0.17, 0.5, 6.}; + Configurable> massWindowLightNeutralMesons{"massWindowLightNeutralMesons", {defaultMassWindows, 4, {"pi0_min", "pi0_max", "eta_min", "eta_max"}}, "Mass window for selected light neutral meson decay daughters"}; + Configurable ConfDoEMCShift{"ConfDoEMCShift", false, "Apply SM-wise shift in eta and phi to EMCal clusters to align with TPC tracks"}; + Configurable> ConfEMCEtaShift{"ConfEMCEtaShift", {0.f}, "values for SM-wise shift in eta to be added to EMCal clusters to align with TPC tracks"}; + Configurable> ConfEMCPhiShift{"ConfEMCPhiShift", {0.f}, "values for SM-wise shift in phi to be added to EMCal clusters to align with TPC tracks"}; + std::array EMCEtaShift = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + std::array EMCPhiShift = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + + template + bool isSelectedTrack(T const& track, HNMPID::TracksPID partSpecies) + { + const auto pT = track.pt(); + const auto eta = track.eta(); + const auto tpcNClsF = track.tpcNClsFound(); + const auto tpcRClsC = track.tpcCrossedRowsOverFindableCls(); + const auto tpcNClsC = track.tpcNClsCrossedRows(); + const auto tpcNClsSFrac = track.tpcFractionSharedCls(); + const auto itsNCls = track.itsNCls(); + const auto dcaXY = track.dcaXY(); + const auto dcaZ = track.dcaZ(); + + if (pT < ConfPtCuts->get(partSpecies, "Pt min")) { + return false; + } + if (pT > ConfPtCuts->get(partSpecies, "Pt max")) { + return false; + } + if (std::abs(eta) > ConfTrkEta) { + return false; + } + if (tpcNClsF < ConfTPCNClustersMin->get("TPCNClusMin", partSpecies)) { + return false; + } + if (tpcRClsC < ConfTrkTPCfCls) { + return false; + } + if (tpcNClsC < ConfTrkTPCcRowsMin) { + return false; + } + if (tpcNClsSFrac > ConfTrkTPCsClsSharedFrac) { + return false; + } + if (itsNCls < ConfTrkITSnclsMin->get(static_cast(0), partSpecies)) { + return false; + } + if (std::abs(dcaXY) > ConfTrkDCAxyMax) { + return false; + } + if (std::abs(dcaZ) > ConfTrkDCAzMax) { + return false; + } + return true; + } + + template + bool isSelectedTrackPID(T const& track, HNMPID::TracksPID partSpecies) + { + bool isSelected = false; + + float nSigmaTrackTPC = track.tpcNSigmaPi(); + float nSigmaTrackTOF = track.tofNSigmaPi(); + float nSigmaTrackITS = track.itsNSigmaPi(); + + float nSigmaTrackTPCTOF = std::sqrt(std::pow(nSigmaTrackTPC, 2) + std::pow(nSigmaTrackTOF, 2)); + + // check if track is selected + auto TPCmin = ConfPIDCuts->get(partSpecies, HNMPID::kTPCMin); + auto TPCmax = ConfPIDCuts->get(partSpecies, HNMPID::kTPCMax); + auto TPCTOFmax = ConfPIDCuts->get(partSpecies, HNMPID::kTPCTOF); + auto ITSmin = ConfPIDCuts->get(partSpecies, HNMPID::kITSmin); + auto ITSmax = ConfPIDCuts->get(partSpecies, HNMPID::kITSmax); + + if (track.p() <= ConfPtCuts->get(partSpecies, "P TOF thres")) { + if (nSigmaTrackTPC > TPCmin && + nSigmaTrackTPC < TPCmax && + nSigmaTrackITS > ITSmin && + nSigmaTrackITS < ITSmax) { + isSelected = true; + } + } else { + if (nSigmaTrackTPCTOF < TPCTOFmax) { + isSelected = true; + } + } + return isSelected; + } + + template + bool isSelectedEvent(T const& col) + { + if (ConfEvtSelectZvtx && std::abs(col.posZ()) > ConfEvtZvtx) { + return false; + } + if (ConfEvtOfflineCheck && !col.sel8()) { + return false; + } + return true; + } + + // Circumvent missing of different phi mappings, enforce [0, 2 * M_PI] + // Tracks have domain [0, 2 * M_PI] + // TLorentVectors have domain [-M_PI, M_PI] + double translatePhi(double phi) + { + if (phi < 0) { + phi += 2 * M_PI; // Add 2 pi to make it positive + } + return phi; + } + + HistogramRegistry mHistManager{"HeavyNeutralMesonHistograms", {}, OutputObjHandlingPolicy::AnalysisObject}; + + std::vector vGGs; + std::vector vHNMs; + + emcal::Geometry* emcalGeom; + + // Prepare vectors for different species + std::vector pion, antipion; + + void init(InitContext const&) + { + emcalGeom = emcal::Geometry::GetInstanceFromRunNumber(300000); + auto hCollisionCounter = mHistManager.add("Event/hCollisionCounter", "Number of collisions;;#bf{#it{N}_{Coll}}", HistType::kTH1F, {{6, -0.5, 5.5}}); + hCollisionCounter->GetXaxis()->SetBinLabel(1, "all"); + hCollisionCounter->GetXaxis()->SetBinLabel(2, "kTVXinEMC"); + hCollisionCounter->GetXaxis()->SetBinLabel(3, "PCM #omega"); + hCollisionCounter->GetXaxis()->SetBinLabel(4, "EMC #omega"); + hCollisionCounter->GetXaxis()->SetBinLabel(5, "PCM #eta'"); + hCollisionCounter->GetXaxis()->SetBinLabel(6, "EMC #eta'"); + + mHistManager.add("Event/nGGs", "Number of (selected) #gamma#gamma paris;#bf{#it{N}_{#gamma#gamma}};#bf{#it{N}_{#gamma#gamma}^{selected}}", HistType::kTH2F, {{51, -0.5, 50.5}, {51, -0.5, 50.5}}); + mHistManager.add("Event/nTracks", "Number of tracks;#bf{N_{tracks}};#bf{#it{N}_{Coll}}", HistType::kTH1F, {{51, -0.5, 50.5}}); + mHistManager.add("Event/nHeavyNeutralMesons", "Number of (selected) HNM candidates;#bf{#it{N}_{HNM}};#bf{#it{N}_{HNM}^{selected}}", HistType::kTH2F, {{51, -0.5, 50.5}, {51, -0.5, 50.5}}); + mHistManager.add("Event/nClustersVsV0s", "Number of clusters and V0s in the collision;#bf{#it{N}_{clusters}};#bf{#it{N}_{V0s}}", HistType::kTH2F, {{26, -0.5, 25.5}, {26, -0.5, 25.5}}); + + mHistManager.add("GG/invMassVsPt_PCM", "Invariant mass and pT of gg candidates;#bf{#it{M}_{#gamma#gamma}};#bf{#it{pT}_{#gamma#gamma}}", HistType::kTH2F, {{400, 0., 0.8}, {250, 0., 25.}}); + mHistManager.add("GG/invMassVsPt_PCMEMC", "Invariant mass and pT of gg candidates;#bf{#it{M}_{#gamma#gamma}};#bf{#it{pT}_{#gamma#gamma}}", HistType::kTH2F, {{400, 0., 0.8}, {250, 0., 25.}}); + mHistManager.add("GG/invMassVsPt_EMC", "Invariant mass and pT of gg candidates;#bf{#it{M}_{#gamma#gamma}};#bf{#it{pT}_{#gamma#gamma}}", HistType::kTH2F, {{400, 0., 0.8}, {250, 0., 25.}}); + + mHistManager.add("HeavyNeutralMeson/invMassVsPt_PCM", "Invariant mass and pT of HNM candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{600, 0.6, 1.2}, {250, 0., 25.}}); + mHistManager.add("HeavyNeutralMeson/invMassVsPt_PCMEMC", "Invariant mass and pT of HNM candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{600, 0.6, 1.2}, {250, 0., 25.}}); + mHistManager.add("HeavyNeutralMeson/invMassVsPt_EMC", "Invariant mass and pT of HNM candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{600, 0.6, 1.2}, {250, 0., 25.}}); + + // event cuts + mHistManager.add("EventCuts/fMultiplicityBefore", "Multiplicity of all processed events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); + mHistManager.add("EventCuts/fMultiplicityAfter", "Multiplicity after event cuts;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); + mHistManager.add("EventCuts/fZvtxBefore", "Zvtx of all processed events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); + mHistManager.add("EventCuts/fZvtxAfter", "Zvtx after event cuts;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); + + // mom correlations p vs pTPC + mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationPos", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); + mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationNeg", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); + + mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsPion", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{1000, 0.0f, 20.0f}, {1000, 0.0f, 20.0f}}}); + mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsAntiPion", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{1000, 0.0f, 20.0f}, {1000, 0.0f, 20.0f}}}); + + // all tracks + mHistManager.add("TrackCuts/TracksBefore/fPtTrackBefore", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/TracksBefore/fEtaTrackBefore", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/TracksBefore/fPhiTrackBefore", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + + // TPC signal + mHistManager.add("TrackCuts/TPCSignal/fTPCSignal", "TPCSignal;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); + mHistManager.add("TrackCuts/TPCSignal/fTPCSignalP", "TPCSignalP;p (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); + // TPC signal anti + mHistManager.add("TrackCuts/TPCSignal/fTPCSignalAnti", "TPCSignal;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); + mHistManager.add("TrackCuts/TPCSignal/fTPCSignalAntiP", "TPCSignalP;p (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); + + // TPC signal particles + mHistManager.add("TrackCuts/TPCSignal/fTPCSignalPion", "fTPCSignalPion;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); + mHistManager.add("TrackCuts/TPCSignal/fTPCSignalAntiPion", "fTPCSignalAntiPion;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); + // pions + mHistManager.add("TrackCuts/Pion/fPPion", "Momentum of Pions at PV;p (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/Pion/fPTPCPion", "Momentum of Pions at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/Pion/fPtPion", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/Pion/fMomCorPionDif", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); + mHistManager.add("TrackCuts/Pion/fMomCorPionRatio", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); + mHistManager.add("TrackCuts/Pion/fEtaPion", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/Pion/fPhiPion", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + mHistManager.add("TrackCuts/Pion/fNsigmaTPCvsPPion", "NSigmaTPC Pion;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/Pion/fNsigmaTOFvsPPion", "NSigmaTOF Pion;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/Pion/fNsigmaTPCTOFvsPPion", "NSigmaTPCTOF Pion;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); + + mHistManager.add("TrackCuts/Pion/fNsigmaTPCvsPPionP", "NSigmaTPC Pion P;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/Pion/fNsigmaTOFvsPPionP", "NSigmaTOF Pion P;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/Pion/fNsigmaTPCTOFvsPPionP", "NSigmaTPCTOF Pion P;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); + + mHistManager.add("TrackCuts/Pion/fDCAxyPion", "fDCAxy Pion;DCA_{XY};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); + mHistManager.add("TrackCuts/Pion/fDCAzPion", "fDCAz Pion;DCA_{Z};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); + mHistManager.add("TrackCuts/Pion/fTPCsClsPion", "fTPCsCls Pion;TPC Shared Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + mHistManager.add("TrackCuts/Pion/fTPCcRowsPion", "fTPCcRows Pion;TPC Crossed Rows;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + mHistManager.add("TrackCuts/Pion/fTrkTPCfClsPion", "fTrkTPCfCls Pion;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {{500, 0.0f, 3.0f}}); + mHistManager.add("TrackCuts/Pion/fTPCnclsPion", "fTPCncls Pion;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + + // anti-pions + mHistManager.add("TrackCuts/AntiPion/fPtAntiPion", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/AntiPion/fMomCorAntiPionDif", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); + mHistManager.add("TrackCuts/AntiPion/fMomCorAntiPionRatio", "Momentum correlation;p_{reco} (GeV/c); |p_{TPC} - p_{reco}| (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); + mHistManager.add("TrackCuts/AntiPion/fEtaAntiPion", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/AntiPion/fPhiAntiPion", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + mHistManager.add("TrackCuts/AntiPion/fNsigmaTPCvsPAntiPion", "NSigmaTPC AntiPion;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/AntiPion/fNsigmaTOFvsPAntiPion", "NSigmaTOF AntiPion;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/AntiPion/fNsigmaTPCTOFvsPAntiPion", "NSigmaTPCTOF AntiPion;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); + + mHistManager.add("TrackCuts/AntiPion/fNsigmaTPCvsPAntiPionP", "NSigmaTPC AntiPion P;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/AntiPion/fNsigmaTOFvsPAntiPionP", "NSigmaTOF AntiPion P;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add("TrackCuts/AntiPion/fNsigmaTPCTOFvsPAntiPionP", "NSigmaTPCTOF AntiPion P;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); + + mHistManager.add("TrackCuts/AntiPion/fDCAxyAntiPion", "fDCAxy AntiPion;DCA_{XY};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); + mHistManager.add("TrackCuts/AntiPion/fDCAzAntiPion", "fDCAz AntiPion;DCA_{Z};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); + mHistManager.add("TrackCuts/AntiPion/fTPCsClsAntiPion", "fTPCsCls AntiPion;TPC Shared Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + mHistManager.add("TrackCuts/AntiPion/fTPCcRowsAntiPion", "fTPCcRows AntiPion;TPC Crossed Rows;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + mHistManager.add("TrackCuts/AntiPion/fTrkTPCfClsAntiPion", "fTrkTPCfCls AntiPion;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {{500, 0.0f, 3.0f}}); + mHistManager.add("TrackCuts/AntiPion/fTPCnclsAntiPion", "fTPCncls AntiPion;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + + // HNM + // omega QA + // daughter pos before + mHistManager.add("TrackCuts/HMN/Before/PosDaughter/fInvMass", "Invariant mass HMN Pos Daugh;M_{#pi};Entries", HistType::kTH1F, {{500, 0, 1}}); + mHistManager.add("TrackCuts/HMN/Before/PosDaughter/fPt", "Transverse momentum HMN Pos Daugh tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/HMN/Before/PosDaughter/fEta", "HMN Pos Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/HMN/Before/PosDaughter/fPhi", "Azimuthal angle of HMN Pos Daugh tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + // daughter neg before + mHistManager.add("TrackCuts/HMN/Before/NegDaughter/fInvMass", "Invariant mass HMN Neg Daugh;M_{#pi};Entries", HistType::kTH1F, {{500, 0, 1}}); + mHistManager.add("TrackCuts/HMN/Before/NegDaughter/fPt", "Transverse momentum HMN Neg Daugh tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/HMN/Before/NegDaughter/fEta", "HMN Neg Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/HMN/Before/NegDaughter/fPhi", "Azimuthal angle of HMN Neg Daugh tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + // HMNCand tracks before + mHistManager.add("TrackCuts/HMN/Before/fInvMass_tracks", "Invariant mass HMNCand;M_{#pi#pi#gammg#gamma};Entries", HistType::kTH1F, {{5000, 0, 5}}); + mHistManager.add("TrackCuts/HMN/Before/fPt_tracks", "Transverse momentum HMNCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/HMN/Before/fEta_tracks", "Pseudorapidity of HMNCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/HMN/Before/fPhi_tracks", "Azimuthal angle of HMNCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + mHistManager.add("TrackCuts/HMN/Before/PCM/fInvMass", "Invariant mass HMNCand;M_{#pi#pi#gammg#gamma};Entries", HistType::kTH1F, {{5000, 0, 5}}); + mHistManager.add("TrackCuts/HMN/Before/PCM/fPt", "Transverse momentum HMNCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/HMN/Before/PCM/fEta", "Pseudorapidity of HMNCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/HMN/Before/PCM/fPhi", "Azimuthal angle of HMNCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + mHistManager.add("TrackCuts/HMN/Before/EMC/fInvMass", "Invariant mass HMNCand;M_{#pi#pi#gammg#gamma};Entries", HistType::kTH1F, {{5000, 0, 5}}); + mHistManager.add("TrackCuts/HMN/Before/EMC/fPt", "Transverse momentum HMNCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/HMN/Before/EMC/fEta", "Pseudorapidity of HMNCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/HMN/Before/EMC/fPhi", "Azimuthal angle of HMNCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + mHistManager.add("TrackCuts/HMN/Before/PCMEMC/fInvMass", "Invariant mass HMNCand;M_{#pi#pi#gammg#gamma};Entries", HistType::kTH1F, {{5000, 0, 5}}); + mHistManager.add("TrackCuts/HMN/Before/PCMEMC/fPt", "Transverse momentum HMNCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/HMN/Before/PCMEMC/fEta", "Pseudorapidity of HMNCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/HMN/Before/PCMEMC/fPhi", "Azimuthal angle of HMNCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + + if (ConfDoEMCShift.value) { + for (unsigned short iSM = 0; iSM < 20; iSM++) { + EMCEtaShift[iSM] = ConfEMCEtaShift.value[iSM]; + EMCPhiShift[iSM] = ConfEMCPhiShift.value[iSM]; + LOG(info) << "SM-wise shift in eta/phi for SM " << iSM << ": " << EMCEtaShift[iSM] << " / " << EMCPhiShift[iSM]; + } + } + } + Preslice perCollision_pcm = aod::v0photonkf::collisionId; + Preslice perCollision_emc = aod::skimmedcluster::collisionId; + + void process(aod::MyCollision const& collision, aod::MyBCs const&, aod::SkimEMCClusters const& clusters, aod::V0PhotonsKF const& v0s, aod::SelectedTracks const& tracks) + { + // inlcude ITS PID information + auto tracksWithItsPid = soa::Attach(tracks); + + mHistManager.fill(HIST("Event/hCollisionCounter"), 0.); + + // QA all evts + mHistManager.fill(HIST("EventCuts/fMultiplicityBefore"), collision.multNTracksPV()); + mHistManager.fill(HIST("EventCuts/fZvtxBefore"), collision.posZ()); + + // Ensure evts are consistent with Sel8 and Vtx-z selection + if (!isSelectedEvent(collision)) { + return; + } + + // QA accepted evts + mHistManager.fill(HIST("EventCuts/fMultiplicityAfter"), collision.multNTracksPV()); + mHistManager.fill(HIST("EventCuts/fZvtxAfter"), collision.posZ()); + + // clean vecs + // Pions for HNM + pion.clear(); + antipion.clear(); + vHNMs.clear(); + // vGGs vector is cleared in reconstructGGs. + + if (collision.foundBC_as().alias_bit(kTVXinEMC)) { + mHistManager.fill(HIST("Event/hCollisionCounter"), 1.); + } + + auto v0sInThisCollision = v0s.sliceBy(perCollision_pcm, collision.globalIndex()); + auto clustersInThisCollision = clusters.sliceBy(perCollision_emc, collision.globalIndex()); + + mHistManager.fill(HIST("Event/nClustersVsV0s"), clustersInThisCollision.size(), v0sInThisCollision.size()); + mHistManager.fill(HIST("Event/nTracks"), tracksWithItsPid.size()); + + std::vector vGammas; + hnmutilities::storeGammasInVector(clustersInThisCollision, v0sInThisCollision, vGammas, EMCEtaShift, EMCPhiShift); + hnmutilities::reconstructGGs(vGammas, vGGs); + vGammas.clear(); + processGGs(vGGs); + + bool isPion = false; + + for (const auto& track : tracksWithItsPid) { + // General QA + mHistManager.fill(HIST("TrackCuts/TracksBefore/fPtTrackBefore"), track.pt()); + mHistManager.fill(HIST("TrackCuts/TracksBefore/fEtaTrackBefore"), track.eta()); + mHistManager.fill(HIST("TrackCuts/TracksBefore/fPhiTrackBefore"), track.phi()); + // Fill PID info + if (track.sign() > 0) { + mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignal"), track.tpcInnerParam(), track.tpcSignal()); + mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalP"), track.p(), track.tpcSignal()); + mHistManager.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationPos"), track.p(), track.tpcInnerParam()); + } + if (track.sign() < 0) { + mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAnti"), track.tpcInnerParam(), track.tpcSignal()); + mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAntiP"), track.p(), track.tpcSignal()); + mHistManager.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationNeg"), track.p(), track.tpcInnerParam()); + } + + isPion = (isSelectedTrackPID(track, HNMPID::kPion) && isSelectedTrack(track, HNMPID::kPion)); + + if (isPion) { + if (track.sign() > 0) { // part + pion.emplace_back(track.pt(), track.eta(), track.phi(), o2::constants::physics::MassPionCharged); + mHistManager.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationAfterCutsPion"), track.p(), track.tpcInnerParam()); + + mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalPion"), track.tpcInnerParam(), track.tpcSignal()); + mHistManager.fill(HIST("TrackCuts/Pion/fPPion"), track.p()); + mHistManager.fill(HIST("TrackCuts/Pion/fPTPCPion"), track.tpcInnerParam()); + mHistManager.fill(HIST("TrackCuts/Pion/fPtPion"), track.pt()); + mHistManager.fill(HIST("TrackCuts/Pion/fMomCorPionDif"), track.p(), track.tpcInnerParam() - track.p()); + mHistManager.fill(HIST("TrackCuts/Pion/fMomCorPionRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + mHistManager.fill(HIST("TrackCuts/Pion/fEtaPion"), track.eta()); + mHistManager.fill(HIST("TrackCuts/Pion/fPhiPion"), track.phi()); + mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTPCvsPPion"), track.tpcInnerParam(), track.tpcNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTOFvsPPion"), track.tpcInnerParam(), track.tofNSigmaPi()); + auto nSigmaTrackTPCTOF = std::sqrt(std::pow(track.tpcNSigmaPi(), 2) + std::pow(track.tofNSigmaPi(), 2)); + mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTPCTOFvsPPion"), track.tpcInnerParam(), std::sqrt(std::pow(track.tpcNSigmaPi() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPi() - nSigmaTrackTPCTOF, 2))); + + mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTPCvsPPionP"), track.p(), track.tpcNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTOFvsPPionP"), track.p(), track.tofNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTPCTOFvsPPionP"), track.p(), std::sqrt(std::pow(track.tpcNSigmaPi() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPi() - nSigmaTrackTPCTOF, 2))); + + mHistManager.fill(HIST("TrackCuts/Pion/fDCAxyPion"), track.dcaXY()); + mHistManager.fill(HIST("TrackCuts/Pion/fDCAzPion"), track.dcaZ()); + mHistManager.fill(HIST("TrackCuts/Pion/fTPCsClsPion"), track.tpcNClsShared()); + mHistManager.fill(HIST("TrackCuts/Pion/fTPCcRowsPion"), track.tpcNClsCrossedRows()); + mHistManager.fill(HIST("TrackCuts/Pion/fTrkTPCfClsPion"), track.tpcCrossedRowsOverFindableCls()); + mHistManager.fill(HIST("TrackCuts/Pion/fTPCnclsPion"), track.tpcNClsFound()); + } else { // antipart + antipion.emplace_back(track.pt(), track.eta(), track.phi(), o2::constants::physics::MassPionCharged); + mHistManager.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationAfterCutsAntiPion"), track.p(), track.tpcInnerParam()); + + mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAntiPion"), track.tpcInnerParam(), track.tpcSignal()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fPtAntiPion"), track.pt()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fMomCorAntiPionDif"), track.p(), track.tpcInnerParam() - track.p()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fMomCorAntiPionRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fEtaAntiPion"), track.eta()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fPhiAntiPion"), track.phi()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCvsPAntiPion"), track.tpcInnerParam(), track.tpcNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTOFvsPAntiPion"), track.tpcInnerParam(), track.tofNSigmaPi()); + auto nSigmaTrackTPCTOF = std::sqrt(std::pow(track.tpcNSigmaPi(), 2) + std::pow(track.tofNSigmaPi(), 2)); + mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCTOFvsPAntiPion"), track.tpcInnerParam(), std::sqrt(std::pow(track.tpcNSigmaPi() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPi() - nSigmaTrackTPCTOF, 2))); + + mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCvsPAntiPionP"), track.p(), track.tpcNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTOFvsPAntiPionP"), track.p(), track.tofNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCTOFvsPAntiPionP"), track.p(), std::sqrt(std::pow(track.tpcNSigmaPi() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPi() - nSigmaTrackTPCTOF, 2))); + + mHistManager.fill(HIST("TrackCuts/AntiPion/fDCAxyAntiPion"), track.dcaXY()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fDCAzAntiPion"), track.dcaZ()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fTPCsClsAntiPion"), track.tpcNClsShared()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fTPCcRowsAntiPion"), track.tpcNClsCrossedRows()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fTrkTPCfClsAntiPion"), track.tpcCrossedRowsOverFindableCls()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fTPCnclsAntiPion"), track.tpcNClsFound()); + } + } + } + + // reconstruct HMN candidates + for (const auto& posPion : pion) { + for (const auto& negPion : antipion) { + hnmutilities::reconstructHeavyNeutralMesons(posPion, negPion, vGGs, vHNMs); + + ROOT::Math::PtEtaPhiMVector temp = posPion + negPion; + + mHistManager.fill(HIST("TrackCuts/HMN/Before/fInvMass_tracks"), temp.M()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/fPt_tracks"), temp.pt()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/fEta_tracks"), temp.eta()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/fPhi_tracks"), translatePhi(temp.phi())); + + mHistManager.fill(HIST("TrackCuts/HMN/Before/PosDaughter/fInvMass"), posPion.M()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/PosDaughter/fPt"), posPion.pt()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/PosDaughter/fEta"), posPion.eta()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/PosDaughter/fPhi"), translatePhi(posPion.phi())); + + mHistManager.fill(HIST("TrackCuts/HMN/Before/NegDaughter/fInvMass"), negPion.M()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/NegDaughter/fPt"), negPion.pt()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/NegDaughter/fEta"), negPion.eta()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/NegDaughter/fPhi"), translatePhi(negPion.phi())); + } + } + + processHNMs(vHNMs); // Contains QA of HMN properties + } + + /// \brief Loop over the GG candidates, fill the mass/pt histograms and set the isPi0/isEta flags based on the reconstructed mass + void processGGs(std::vector& vGGs) + { + int nGGsBeforeMassCuts = vGGs.size(); + for (unsigned int iGG = 0; iGG < vGGs.size(); iGG++) { + auto lightMeson = &vGGs.at(iGG); + + if (lightMeson->reconstructionType == photonpair::kPCMPCM) { + mHistManager.fill(HIST("GG/invMassVsPt_PCM"), lightMeson->m(), lightMeson->pT()); + } else if (lightMeson->reconstructionType == photonpair::kEMCEMC) { + mHistManager.fill(HIST("GG/invMassVsPt_EMC"), lightMeson->m(), lightMeson->pT()); + } else { + mHistManager.fill(HIST("GG/invMassVsPt_PCMEMC"), lightMeson->m(), lightMeson->pT()); + } + + if (lightMeson->m() > massWindowLightNeutralMesons->get("pi0_min") && lightMeson->m() < massWindowLightNeutralMesons->get("pi0_max")) { + lightMeson->isPi0 = true; + } else if (lightMeson->m() > massWindowLightNeutralMesons->get("eta_min") && lightMeson->m() < massWindowLightNeutralMesons->get("eta_max")) { + lightMeson->isEta = true; + } else { + vGGs.erase(vGGs.begin() + iGG); + iGG--; + } + } + mHistManager.fill(HIST("Event/nGGs"), nGGsBeforeMassCuts, vGGs.size()); + } + + /// \brief Loop over the heavy neutral meson candidates, fill the mass/pt histograms and set the trigger flags based on the reconstructed mass + void processHNMs(std::vector& vHNMs) + { + int nHNMsBeforeMassCuts = vHNMs.size(); + for (unsigned int iHNM = 0; iHNM < vHNMs.size(); iHNM++) { + auto heavyNeutralMeson = vHNMs.at(iHNM); + + float massHNM = heavyNeutralMeson.m(cfgHNMMassCorrection); + if (heavyNeutralMeson.gg->reconstructionType == photonpair::kPCMPCM) { + mHistManager.fill(HIST("HeavyNeutralMeson/invMassVsPt_PCM"), massHNM, heavyNeutralMeson.pT()); + // QA + mHistManager.fill(HIST("TrackCuts/HMN/Before/PCM/fInvMass"), massHNM); + mHistManager.fill(HIST("TrackCuts/HMN/Before/PCM/fPt"), heavyNeutralMeson.pT()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/PCM/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/PCM/fPhi"), translatePhi(heavyNeutralMeson.phi())); + } else if (heavyNeutralMeson.gg->reconstructionType == photonpair::kEMCEMC) { + mHistManager.fill(HIST("HeavyNeutralMeson/invMassVsPt_EMC"), massHNM, heavyNeutralMeson.pT()); + // QA + mHistManager.fill(HIST("TrackCuts/HMN/Before/EMC/fInvMass"), massHNM); + mHistManager.fill(HIST("TrackCuts/HMN/Before/EMC/fPt"), heavyNeutralMeson.pT()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/EMC/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/EMC/fPhi"), translatePhi(heavyNeutralMeson.phi())); + } else { + mHistManager.fill(HIST("HeavyNeutralMeson/invMassVsPt_PCMEMC"), massHNM, heavyNeutralMeson.pT()); + // QA + mHistManager.fill(HIST("TrackCuts/HMN/Before/PCMEMC/fInvMass"), massHNM); + mHistManager.fill(HIST("TrackCuts/HMN/Before/PCMEMC/fPt"), heavyNeutralMeson.pT()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/PCMEMC/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("TrackCuts/HMN/Before/PCMEMC/fPhi"), translatePhi(heavyNeutralMeson.phi())); + } + } + mHistManager.fill(HIST("Event/nHeavyNeutralMesons"), nHNMsBeforeMassCuts, vHNMs.size()); + } +}; + +WorkflowSpec defineDataProcessing(o2::framework::ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} diff --git a/PWGEM/PhotonMeson/Utils/HNMUtilities.h b/PWGEM/PhotonMeson/Utils/HNMUtilities.h index 329b22247c1..c784fcabc97 100644 --- a/PWGEM/PhotonMeson/Utils/HNMUtilities.h +++ b/PWGEM/PhotonMeson/Utils/HNMUtilities.h @@ -125,17 +125,43 @@ struct HeavyNeutralMeson { float phi() const { return vHeavyNeutralMeson.Phi(); } }; -/// \brief Reconstruct light neutral mesons from EMC clusters and V0s and fill them into the vGGs vector +float smPhiEdges[9] = {1.75, 2.1, 2.45, 2.8, 3.14, 4., 4.89, 5.24, 5.58}; + +unsigned short getSMNumber(float eta, float phi) +{ + unsigned short smNumber = 0; + for (int iPhiInterval = 0; iPhiInterval < 9; iPhiInterval++) { + if (phi > smPhiEdges[iPhiInterval]) + smNumber = 2 * (iPhiInterval + 1); + } + if (eta < 0) + smNumber += 1; + + return smNumber; +} + +/// \brief Store photons from EMC clusters and V0s in a vector and possibly add a eta and phi offset for alignment of EMCal clusters template -void reconstructGGs(C clusters, V v0s, std::vector& vGGs) +void storeGammasInVector(C clusters, V v0s, std::vector& vPhotons, std::array EMCEtaShift, std::array EMCPhiShift) { - std::vector vPhotons; - for (const auto& cluster : clusters) - vPhotons.push_back(Photon::fromEtaPhiEnergy(cluster.eta(), cluster.phi(), cluster.e())); + vPhotons.clear(); + for (const auto& cluster : clusters) { + float eta = cluster.eta(); + float phi = cluster.phi(); + unsigned short smNumber = getSMNumber(eta, phi); + // LOG(info) << "Shifting in sm " << smNumber << ", eta/phi = " << eta << " / " << phi << " to eta/phi = " << eta + EMCEtaShift[getSMNumber(eta, phi)] << " / " << phi + EMCPhiShift[getSMNumber(eta, phi)]; + eta += EMCEtaShift[smNumber]; + phi += EMCPhiShift[smNumber]; + vPhotons.push_back(Photon::fromEtaPhiEnergy(eta, phi, cluster.e())); + } for (const auto& v0 : v0s) vPhotons.push_back(Photon::fromPxPyPz(v0.px(), v0.py(), v0.pz())); +} +/// \brief Reconstruct light neutral mesons from photons and fill them into the vGGs vector +void reconstructGGs(std::vector vPhotons, std::vector& vGGs) +{ vGGs.clear(); // loop over all photon combinations and build meson candidates for (unsigned int ig1 = 0; ig1 < vPhotons.size(); ++ig1) { From 82648077194e944ff1529e227598686c88e36467 Mon Sep 17 00:00:00 2001 From: lucamicheletti93 <38209984+lucamicheletti93@users.noreply.github.com> Date: Wed, 9 Apr 2025 09:44:19 +0200 Subject: [PATCH 0949/1650] [Trigger] Adding to external histograms the AnalysedTriggers (#10789) Co-authored-by: Lucamicheletti93 --- EventFiltering/Zorro.cxx | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/EventFiltering/Zorro.cxx b/EventFiltering/Zorro.cxx index ec661548d09..8b47d0c2d3f 100644 --- a/EventFiltering/Zorro.cxx +++ b/EventFiltering/Zorro.cxx @@ -113,7 +113,7 @@ void Zorro::populateExternalHists(int runNumber, TH2* ZorroHisto, TH2* ToiHisto) } if (!ToiHisto) { LOGF(info, "TOI histogram not set, creating a new one"); - ToiHisto = new TH2D("TOI", "TOI", 1, -0.5, 0.5, mTOIs.size(), -0.5, mTOIs.size() - 0.5); + ToiHisto = new TH2D("TOI", "TOI", 1, -0.5, 0.5, mTOIs.size() * 2, -0.5, mTOIs.size() * 2 - 0.5); } // if it is the first run, initialize the histogram if (mRunNumberHistos.size() == 0) { @@ -126,10 +126,11 @@ void Zorro::populateExternalHists(int runNumber, TH2* ZorroHisto, TH2* ToiHisto) ZorroHisto->GetYaxis()->SetBinLabel(i + 2 + mTOIs.size(), Form("%s scalers", mTOIs[i].data())); } // TOI histogram - ToiHisto->SetBins(1, -0.5, 0.5, mTOIs.size(), -0.5, mTOIs.size() - 0.5); + ToiHisto->SetBins(1, -0.5, 0.5, mTOIs.size() * 2, -0.5, mTOIs.size() * 2 - 0.5); ToiHisto->GetXaxis()->SetBinLabel(1, Form("%d", runNumber)); for (size_t i{0}; i < mTOIs.size(); ++i) { - ToiHisto->GetYaxis()->SetBinLabel(i + 1, mTOIs[i].data()); + ToiHisto->GetYaxis()->SetBinLabel(i * 2 + 1, mTOIs[i].data()); + ToiHisto->GetYaxis()->SetBinLabel(i * 2 + 2, Form("%s AnalysedTriggers", mTOIs[i].data())); } } if (mInspectedTVX) { @@ -137,6 +138,10 @@ void Zorro::populateExternalHists(int runNumber, TH2* ZorroHisto, TH2* ToiHisto) ZorroHisto->SetBinError(mRunNumberHistos.size() + 1, 1, mInspectedTVX->GetBinError(1)); } if (mSelections) { + mAnalysedTriggers = new TH1D("AnalysedTriggers", "", mSelections->GetNbinsX() - 2, -0.5, mSelections->GetNbinsX() - 2.5); + for (int iBin{2}; iBin < mSelections->GetNbinsX(); ++iBin) { // Exclude first and last bins as they are total number of analysed and selected events, respectively + mAnalysedTriggers->GetXaxis()->SetBinLabel(iBin - 1, mSelections->GetXaxis()->GetBinLabel(iBin)); + } for (size_t i{0}; i < mTOIs.size(); ++i) { int bin = findBin(mSelections, mTOIs[i]); ZorroHisto->Fill(Form("%d", runNumber), Form("%s selections", mTOIs[i].data()), mSelections->GetBinContent(bin)); @@ -248,6 +253,11 @@ bool Zorro::isSelected(uint64_t bcGlobalId, uint64_t tolerance, TH2* ToiHisto) if (mTOIidx[i] < 0) { continue; } else if (mLastResult.test(mTOIidx[i])) { + if (ToiHisto && mAnalysedTriggers) { + int binX = ToiHisto->GetXaxis()->FindBin(Form("%d", mRunNumber)); + int binY = ToiHisto->GetYaxis()->FindBin(Form("%s AnalysedTriggers", mTOIs[i].data())); + ToiHisto->SetBinContent(binX, binY, mAnalysedTriggers->GetBinContent(mAnalysedTriggers->GetXaxis()->FindBin(mTOIs[i].data()))); + } mTOIcounts[i] += (lastSelectedIdx != mLastSelectedIdx); /// Avoid double counting if (mAnalysedTriggersOfInterest && lastSelectedIdx != mLastSelectedIdx) { mAnalysedTriggersOfInterest->Fill(i); From 8a0bf787536969047c476ef143340ed49bb871ac Mon Sep 17 00:00:00 2001 From: ynishida-style Date: Wed, 9 Apr 2025 17:23:38 +0900 Subject: [PATCH 0950/1650] [PWGJE] Fix histgrams for PID (#10777) --- PWGJE/Tasks/jetShape.cxx | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/PWGJE/Tasks/jetShape.cxx b/PWGJE/Tasks/jetShape.cxx index b34f70ef46f..d7e1f2f0557 100644 --- a/PWGJE/Tasks/jetShape.cxx +++ b/PWGJE/Tasks/jetShape.cxx @@ -41,12 +41,12 @@ using namespace o2::framework::expressions; struct JetShapeTask { HistogramRegistry registry{"registry", - {{"tpcTofPi", "tpcTofPi", {HistType::kTH3F, {{401, -10.025f, 10.025f}, {401, -10.025f, 10.025f}, {100, 0, 5}}}}, - {"tpcPi", "tpcPi", {HistType::kTH2F, {{500, 0, 5}, {401, -10.025f, 10.025f}}}}, - {"tofPi", "tofPi", {HistType::kTH2F, {{500, 0, 5}, {401, -10.025f, 10.025f}}}}, - {"tpcTofPr", "tpcTofPr", {HistType::kTH3F, {{401, -10.025f, 10.025f}, {401, -10.025f, 10.025f}, {100, 0, 5}}}}, - {"tpcPr", "tpcPr", {HistType::kTH2F, {{500, 0, 5}, {401, -10.025f, 10.025f}}}}, - {"tofPr", "tofPr", {HistType::kTH2F, {{500, 0, 5}, {401, -10.025f, 10.025f}}}}, + {{"tpcTofPi", "tpcTofPi", {HistType::kTHnSparseD, {{101, -10.1f, 10.1f}, {20, -10, 10}, {25, 0, 5}, {14, 0, 7}}}}, + {"tpcPi", "tpcPi", {HistType::kTH2F, {{100, 0, 5}, {401, -10.025f, 10.025f}}}}, + {"tofPi", "tofPi", {HistType::kTH2F, {{100, 0, 5}, {401, -10.025f, 10.025f}}}}, + {"tpcTofPr", "tpcTofPr", {HistType::kTHnSparseD, {{101, -10.1f, 10.1f}, {20, -10, 10}, {25, 0, 5}, {14, 0, 7}}}}, + {"tpcPr", "tpcPr", {HistType::kTH2F, {{100, 0, 5}, {401, -10.025f, 10.025f}}}}, + {"tofPr", "tofPr", {HistType::kTH2F, {{100, 0, 5}, {401, -10.025f, 10.025f}}}}, {"tpcDedx", "tpcDedx", {HistType::kTH2F, {{500, 0, 5}, {1000, 0, 1000}}}}, {"tofBeta", "tofBeta", {HistType::kTH2F, {{500, 0, 5}, {450, 0.2, 1.1}}}}, {"tofMass", "tofMass", {HistType::kTH1F, {{3000, 0, 3}}}}, @@ -99,7 +99,8 @@ struct JetShapeTask { template bool isAcceptedJet(U const& jet) { - if (jetAreaFractionMin > -98.0) { + static constexpr double kJetAreaFractionMinValue = -98.0; + if (jetAreaFractionMin > kJetAreaFractionMinValue) { if (jet.area() < jetAreaFractionMin * o2::constants::math::PI * (jet.r() / 100.0) * (jet.r() / 100.0)) { return false; } @@ -107,9 +108,11 @@ struct JetShapeTask { return false; } } + static constexpr double kLeadingConstituentPtMinValue = 5.0; + static constexpr double kLeadingConstituentPtMaxValue = 9998.0; bool checkConstituentPt = true; - bool checkConstituentMinPt = (leadingConstituentPtMin > 5); - bool checkConstituentMaxPt = (leadingConstituentPtMax < 9998.0); + bool checkConstituentMinPt = (leadingConstituentPtMin > kLeadingConstituentPtMinValue); + bool checkConstituentMaxPt = (leadingConstituentPtMax < kLeadingConstituentPtMaxValue); if (!checkConstituentMinPt && !checkConstituentMaxPt) { checkConstituentPt = false; } @@ -256,10 +259,8 @@ struct JetShapeTask { registry.fill(HIST("tofMass"), track.mass()); // for calculate purity - registry.fill(HIST("tpcTofPi"), track.tpcNSigmaPi(), track.tofNSigmaPi(), track.pt()); registry.fill(HIST("tpcPi"), track.pt(), track.tpcNSigmaPi()); registry.fill(HIST("tofPi"), track.pt(), track.tofNSigmaPi()); - registry.fill(HIST("tpcTofPr"), track.tpcNSigmaPr(), track.tofNSigmaPr(), track.pt()); registry.fill(HIST("tpcPr"), track.pt(), track.tpcNSigmaPr()); registry.fill(HIST("tofPr"), track.pt(), track.tofNSigmaPr()); @@ -272,6 +273,8 @@ struct JetShapeTask { float distance = std::sqrt(deltaEta * deltaEta + deltaPhi1 * deltaPhi1); registry.fill(HIST("distanceVsTrackpt"), distance, track.pt()); + registry.fill(HIST("tpcTofPi"), track.tpcNSigmaPi(), track.tofNSigmaPi(), track.pt(), distance); + registry.fill(HIST("tpcTofPr"), track.tpcNSigmaPr(), track.tofNSigmaPr(), track.pt(), distance); } } } From f98c1b8ea55f8c0ab3c4d6e79fd9581d85703e75 Mon Sep 17 00:00:00 2001 From: Lars <146946151+ljoergen@users.noreply.github.com> Date: Wed, 9 Apr 2025 14:27:50 +0200 Subject: [PATCH 0951/1650] [PWGLF] angularCorrelationsInJets.cxx: fixed track filter, cleared up task (#10791) --- .../Nuspex/angularCorrelationsInJets.cxx | 488 ++++-------------- 1 file changed, 91 insertions(+), 397 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx b/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx index a02c789ed37..bf52799e499 100644 --- a/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx +++ b/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx @@ -12,7 +12,7 @@ /// \file angularCorrelationsInJets.cxx /// /// \author Lars Jörgensen (lars.christian.joergensen@cern.ch) -/// \brief task for analysis of antinuclei in jets using Fastjet +/// \brief task for analysis of angular correlations in jets using Fastjet #include #include @@ -58,9 +58,6 @@ struct AxisSpecs { struct AngularCorrelationsInJets { // Switches Configurable useRejectionCut{"useRejectionCut", true, "use nsigmaRejection for correlations"}; - Configurable deuteronAnalysis{"deuteronAnalysis", true, "true [false]: analyse (anti)deuterons [(anti)helium-3]"}; - Configurable measureYields{"measureYields", false, "measure yields"}; - Configurable measureCorrelations{"measureCorrelations", true, "measure correlations"}; Configurable outputQC{"outputQC", true, "add QC output"}; Configurable doppCorrelations{"doppCorrelations", true, "measure correlations for p-p"}; Configurable doapapCorrelations{"doapapCorrelations", false, "measure correlations for pbar-pbar"}; @@ -84,14 +81,14 @@ struct AngularCorrelationsInJets { Configurable requirePVContributor{"requirePVContributor", false, "require track to be PV contributor"}; // Jet Cuts - Configurable jetR{"jetR", 0.4, "jet resolution parameter"}; + Configurable jetR{"jetR", 0.3, "jet resolution parameter"}; Configurable minJetPt{"minJetPt", 10.0, "minimum total pT to accept jet"}; // Proton Cuts Configurable protonDCAxyYield{"protonDCAxyYield", 0.05, "[proton] DCAxy cut for yield"}; - Configurable protonDCAzYield{"protonDCAzYield", 1.0, "[proton] DCAz cut for yield"}; + Configurable protonDCAzYield{"protonDCAzYield", 0.05, "[proton] DCAz cut for yield"}; Configurable protonDCAxyCF{"protonDCAxyCF", 0.05, "[proton] DCAxy cut for CF"}; - Configurable protonDCAzCF{"protonDCAzCF", 1.0, "[proton] DCAz cut for CF"}; + Configurable protonDCAzCF{"protonDCAzCF", 0.02, "[proton] DCAz cut for CF"}; Configurable protonTPCTOFpT{"protonTPCTOFpT", 0.7, "[proton] pT for switch in TPC/TPC+TOF nsigma"}; Configurable protonTPCnsigmaLowPtYield{"protonTPCnsigmaLowPtYield", 4.0, "[proton] max TPC nsigma with low pT for yield"}; Configurable protonTPCnsigmaHighPtYield{"protonTPCnsigmaHighPtYield", 4.0, "[proton] max TPC nsigma with high pT for yield"}; @@ -101,9 +98,9 @@ struct AngularCorrelationsInJets { // Antiproton Cuts Configurable antiprotonDCAxyYield{"antiprotonDCAxyYield", 0.05, "[antiproton] DCAxy cut for yield"}; - Configurable antiprotonDCAzYield{"antiprotonDCAzYield", 1.0, "[antiproton] DCAz cut for yield"}; + Configurable antiprotonDCAzYield{"antiprotonDCAzYield", 0.05, "[antiproton] DCAz cut for yield"}; Configurable antiprotonDCAxyCF{"antiprotonDCAxyCF", 0.05, "[antiproton] DCAxy cut for CF"}; - Configurable antiprotonDCAzCF{"antiprotonDCAzCF", 1.0, "[antiproton] DCAz cut for CF"}; + Configurable antiprotonDCAzCF{"antiprotonDCAzCF", 0.02, "[antiproton] DCAz cut for CF"}; Configurable antiprotonTPCTOFpT{"antiprotonTPCTOFpT", 0.7, "[antiproton] pT for switch in TPC/TPC+TOF nsigma"}; Configurable antiprotonTPCnsigmaLowPtYield{"antiprotonTPCnsigmaLowPtYield", 4.0, "[antiproton] max TPC nsigma with low pT for yield"}; Configurable antiprotonTPCnsigmaHighPtYield{"antiprotonTPCnsigmaHighPtYield", 4.0, "[antiproton] max TPC nsigma with high pT for yield"}; @@ -111,22 +108,6 @@ struct AngularCorrelationsInJets { Configurable antiprotonTPCnsigma{"antiprotonTPCnsigma", 4.0, "[antiproton] max TPC nsigma for pt > 0/1.5/3.0 GeV"}; Configurable antiprotonTOFnsigma{"antiprotonTOFnsigma", 3.0, "[antiproton] max TOF nsigma for pt > 0/1.5/3.0 GeV"}; - // Nuclei Cuts - Configurable nucleiDCAxyYield{"nucleiDCAxyYield", 0.05, "[nuclei] DCAxy cut for yield"}; - Configurable nucleiDCAzYield{"nucleiDCAzYield", 0.02, "[nuclei] DCAz cut for yield"}; - Configurable nucleiTPCTOFpT{"nucleiTPCTOFpT", 0.7, "[nuclei] pT for switch in TPC/TPC+TOF nsigma"}; - Configurable nucleiTPCnsigmaLowPtYield{"nucleiTPCnsigmaLowPtYield", 4.0, "[nuclei] max TPC nsigma with low pT for yield"}; - Configurable nucleiTPCnsigmaHighPtYield{"nucleiTPCnsigmaHighPtYield", 4.0, "[nuclei] max TPC nsigma with high pT for yield"}; - Configurable nucleiTOFnsigmaHighPtYield{"nucleiTOFnsigmaHighPtYield", 4.0, "[nuclei] min TOF nsigma with high pT for yield"}; - - // Antinuclei Cuts - Configurable antinucleiDCAxyYield{"antinucleiDCAxyYield", 0.05, "[antinuclei] DCAxy cut for yield"}; - Configurable antinucleiDCAzYield{"antinucleiDCAzYield", 0.02, "[antinuclei] DCAz cut for yield"}; - Configurable antinucleiTPCTOFpT{"antinucleiTPCTOFpT", 0.7, "[antinuclei] pT for switch in TPC/TPC+TOF nsigma"}; - Configurable antinucleiTPCnsigmaLowPtYield{"antinucleiTPCnsigmaLowPtYield", 4.0, "[antinuclei] max TPC nsigma with low pT for yield"}; - Configurable antinucleiTPCnsigmaHighPtYield{"antinucleiTPCnsigmaHighPtYield", 4.0, "[antinuclei] max TPC nsigma with high pT for yield"}; - Configurable antinucleiTOFnsigmaHighPtYield{"antinucleiTOFnsigmaHighPtYield", 4.0, "[antinuclei] min TOF nsigma with high pT for yield"}; - // Pion & Kaon PID Configurable pionDCAxy{"pionDCAxy", 0.05, "[pion] DCAxy cut"}; Configurable pionDCAz{"pionDCAz", 0.05, "[pion] DCAz cut"}; @@ -146,11 +127,7 @@ struct AngularCorrelationsInJets { // QC Configurables Configurable zVtx{"zVtx", 10.0, "max zVertex"}; - Configurable rMax{"rMax", 0.4, "Maximum radius for jet and UE regions"}; - - double maxDCAzForFilter = 2.0; - double maxEtaForFilter = 0.8; - double minTrackPtForFilter = 0.1; + Configurable rMax{"rMax", 0.3, "Maximum radius for jet and UE regions"}; Service ccdb; int mRunNumber; @@ -168,10 +145,7 @@ struct AngularCorrelationsInJets { Filter prelimTrackCuts = (aod::track::itsChi2NCl < maxChi2ITS && aod::track::tpcChi2NCl < maxChi2TPC && - nabs(aod::track::dcaXY) < maxDCAxy && - nabs(aod::track::dcaZ) < maxDCAzForFilter && - nabs(aod::track::eta) < maxEtaForFilter && - aod::track::pt > minTrackPtForFilter); // add more preliminary cuts to filter if possible + nabs(aod::track::dcaXY) < maxDCAxy); Preslice perCollisionFullTracksRun2 = o2::aod::track::collisionId; Preslice perCollisionFullTracksRun3 = o2::aod::track::collisionId; @@ -204,70 +178,50 @@ struct AngularCorrelationsInJets { registryData.add("numJetsInEvent", "Number of jets selected", HistType::kTH1I, {{10, 0, 10}}); registryData.add("jetRapidity", "Jet rapidity;#it{y}", HistType::kTH1F, {{200, -1, 1}}); - if (measureYields) { - registryData.add("tpcNSigmaProton", "TPC n#sigma for proton", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tofNSigmaProton", "TOF n#sigma for proton", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tpcNSigmaAntiproton", "TPC n#sigma for antiproton", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tofNSigmaAntiproton", "TOF n#sigma for antiproton", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tpcNSigmaNuclei", "TPC n#sigma for nuclei", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tofNSigmaNuclei", "TOF n#sigma for nuclei", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tpcNSigmaAntinuclei", "TPC n#sigma for antinuclei", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tofNSigmaAntinuclei", "TOF n#sigma for antinuclei", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - - registryData.add("ptJetProton", "p_{T} of protons", HistType::kTH1D, {axisSpecs.ptAxisPos}); - registryData.add("ptJetAntiproton", "p_{T} of antiprotons", HistType::kTH1D, {axisSpecs.ptAxisPos}); - registryData.add("ptJetNuclei", "p_{T} of nuclei", HistType::kTH1D, {axisSpecs.ptAxisPos}); - registryData.add("ptJetAntinuclei", "p_{T} of antinuclei", HistType::kTH1D, {axisSpecs.ptAxisPos}); - - registryData.add("dcaZJetNuclei", "DCA_{z} of high purity nuclei", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); - registryData.add("dcaZJetAntinuclei", "DCA_{z} of high purity antinuclei", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); - - registryQC.add("ptJetProtonVsTotalJet", "Proton p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); - registryQC.add("ptJetAntiprotonVsTotalJet", "Antiproton p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); - registryQC.add("ptJetNucleiVsTotalJet", "Nuclei p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); - registryQC.add("ptJetAntinucleiVsTotalJet", "Antinuclei p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); - } - - if (measureCorrelations) { - registryData.add("tpcNSigmaProtonCF", "TPC n#sigma for proton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tofNSigmaProtonCF", "TOF n#sigma for proton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tpcNSigmaAntiprotonCF", "TPC n#sigma for antiproton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tofNSigmaAntiprotonCF", "TOF n#sigma for antiproton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tpcNSigmaPion", "TPC n#sigma for pion", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tofNSigmaPion", "TOF n#sigma for pion", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - - registryData.add("deltaPhiSEFull", "#Delta#varphi of particles in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiSEJet", "#Delta#varphi of jet particles in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiSEProton", "#Delta#varphi of protons in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiSEAntiproton", "#Delta#varphi of antiprotons in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiSEPion", "#Delta#varphi of pions in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiSEProtonAntiproton", "#Delta#varphi of proton-antiproton in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - - registryData.add("deltaPhiMEFull", "#Delta#varphi of particles in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiMEJet", "#Delta#varphi of jet particles in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiMEProton", "#Delta#varphi of protons in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiMEAntiproton", "#Delta#varphi of antiprotons in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiMEPion", "#Delta#varphi of pions in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiMEProtonAntiproton", "#Delta#varphi of proton-antiproton in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - - registryData.add("deltaPhiEtaSEFull", "#Delta#varphi vs #Delta#eta of full particles in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaSEJet", "#Delta#varphi vs #Delta#eta of jet particles in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaSEProton", "#Delta#varphi vs #Delta#eta of protons in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaSEAntiproton", "#Delta#varphi vs #Delta#eta of antiprotons in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaSEPion", "#Delta#varphi vs #Delta#eta of pions in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaSEProtonAntiproton", "#Delta#varphi vs #Delta#eta of proton-antiproton in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - - registryData.add("deltaPhiEtaMEFull", "#Delta#varphi vs #Delta#eta of particles in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaMEJet", "#Delta#varphi vs #Delta#eta of jet particles in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaMEProton", "#Delta#varphi vs #Delta#eta of protons in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaMEAntiproton", "#Delta#varphi vs #Delta#eta of antiprotons in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaMEPion", "#Delta#varphi vs #Delta#eta of pions in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaMEProtonAntiproton", "#Delta#varphi vs #Delta#eta of proton-antiproton in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - - registryData.add("dcaZJetProton", "DCA_{z} of high purity protons", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); - registryData.add("dcaZJetAntiproton", "DCA_{z} of high purity antiprotons", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); - registryData.add("dcaZJetPion", "DCA_{z} of high purity pions", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); - } + registryData.add("ptJetProton", "p_{T} of protons", HistType::kTH1D, {axisSpecs.ptAxisPos}); + registryData.add("ptJetAntiproton", "p_{T} of antiprotons", HistType::kTH1D, {axisSpecs.ptAxisPos}); + + registryQC.add("ptJetProtonVsTotalJet", "Proton p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); + registryQC.add("ptJetAntiprotonVsTotalJet", "Antiproton p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); + + registryData.add("tpcNSigmaProtonCF", "TPC n#sigma for proton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tofNSigmaProtonCF", "TOF n#sigma for proton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tpcNSigmaAntiprotonCF", "TPC n#sigma for antiproton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tofNSigmaAntiprotonCF", "TOF n#sigma for antiproton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tpcNSigmaPion", "TPC n#sigma for pion", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tofNSigmaPion", "TOF n#sigma for pion", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + + registryData.add("deltaPhiSEFull", "#Delta#varphi of particles in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiSEJet", "#Delta#varphi of jet particles in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiSEProton", "#Delta#varphi of protons in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiSEAntiproton", "#Delta#varphi of antiprotons in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiSEPion", "#Delta#varphi of pions in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiSEProtonAntiproton", "#Delta#varphi of proton-antiproton in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + + registryData.add("deltaPhiMEFull", "#Delta#varphi of particles in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiMEJet", "#Delta#varphi of jet particles in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiMEProton", "#Delta#varphi of protons in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiMEAntiproton", "#Delta#varphi of antiprotons in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiMEPion", "#Delta#varphi of pions in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiMEProtonAntiproton", "#Delta#varphi of proton-antiproton in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + + registryData.add("deltaPhiEtaSEFull", "#Delta#varphi vs #Delta#eta of full particles in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaSEJet", "#Delta#varphi vs #Delta#eta of jet particles in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaSEProton", "#Delta#varphi vs #Delta#eta of protons in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaSEAntiproton", "#Delta#varphi vs #Delta#eta of antiprotons in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaSEPion", "#Delta#varphi vs #Delta#eta of pions in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaSEProtonAntiproton", "#Delta#varphi vs #Delta#eta of proton-antiproton in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + + registryData.add("deltaPhiEtaMEFull", "#Delta#varphi vs #Delta#eta of particles in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaMEJet", "#Delta#varphi vs #Delta#eta of jet particles in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaMEProton", "#Delta#varphi vs #Delta#eta of protons in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaMEAntiproton", "#Delta#varphi vs #Delta#eta of antiprotons in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaMEPion", "#Delta#varphi vs #Delta#eta of pions in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaMEProtonAntiproton", "#Delta#varphi vs #Delta#eta of proton-antiproton in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + + registryData.add("dcaZJetProton", "DCA_{z} of high purity protons", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); + registryData.add("dcaZJetAntiproton", "DCA_{z} of high purity antiprotons", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); + registryData.add("dcaZJetPion", "DCA_{z} of high purity pions", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); // pT registryData.add("ptJetParticle", "p_{T} of particles in jets", HistType::kTH1D, {axisSpecs.ptAxisPos}); registryData.add("ptTotalSubJetArea", "Subtracted full jet p_{T} (area)", HistType::kTH1D, {axisSpecs.ptAxisPos}); @@ -307,8 +261,6 @@ struct AngularCorrelationsInJets { if (doprocessMCRun2 || doprocessMCRun3) { registryMC.add("ptJetProtonMC", "Truth jet proton p_{T}", HistType::kTH1F, {axisSpecs.ptAxisPos}); registryMC.add("ptJetAntiprotonMC", "Truth jet antiproton p_{T}", HistType::kTH1F, {axisSpecs.ptAxisPos}); - registryMC.add("ptJetNucleiMC", "Truth jet nuclei p_{T}", HistType::kTH1F, {axisSpecs.ptAxisPos}); - registryMC.add("ptJetAntinucleiMC", "Truth jet antinuclei p_{T}", HistType::kTH1F, {axisSpecs.ptAxisPos}); registryMC.add("numberOfTruthParticles", "Truth yields (anti)p, (anti)d, (anti)He-3", HistType::kTH1I, {{6, 0, 6}}); } @@ -328,7 +280,6 @@ struct AngularCorrelationsInJets { registryQC.add("dcaXYFullEvent", "DCA_{xy} of full event", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcaxyAxis}); registryQC.add("dcaZFullEvent", "DCA_{z} of full event", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); - // QA Histograms for Comparison with nuclei_in_jets.cxx registryQC.add("multiplicityJetPlusUE", "multiplicityJetPlusUE", HistType::kTH1F, {{100, 0, 100, "#it{N}_{ch}"}}); registryQC.add("multiplicityJet", "multiplicityJet", HistType::kTH1F, {{100, 0, 100, "#it{N}_{ch}"}}); registryQC.add("multiplicityUE", "multiplicityUE", HistType::kTH1F, {{100, 0, 100, "#it{N}_{ch}"}}); @@ -369,6 +320,14 @@ struct AngularCorrelationsInJets { template bool selectTrackForJetReco(const T& track) { + if (track.dcaZ() > maxDCAz) + return false; + double maxEtaForJetReco = 0.8; + if (track.eta() > maxEtaForJetReco) + return false; + double minTrackPtForJetReco = 0.1; + if (track.pt() < minTrackPtForJetReco) + return false; if (!track.hasITS()) return false; if (!track.hasTPC()) @@ -429,7 +388,7 @@ struct AngularCorrelationsInJets { } template - bool isProtonForCorrelation(const T& track) + bool isProton(const T& track) { if (track.sign() < 0) return false; @@ -480,37 +439,7 @@ struct AngularCorrelationsInJets { } template - bool isProtonForYield(const T& track) - { - if (track.sign() < 0) - return false; - - // DCA - if (std::abs(track.dcaXY()) > protonDCAxyYield) - return false; - if (std::abs(track.dcaZ()) > protonDCAzYield) - return false; - - registryData.fill(HIST("tpcNSigmaProton"), track.pt(), track.tpcNSigmaPr()); - - // TPC - if (track.pt() < protonTPCTOFpT && std::abs(track.tpcNSigmaPr()) > protonTPCnsigmaLowPtYield) - return false; - if (track.pt() > protonTPCTOFpT && std::abs(track.tpcNSigmaPr()) > protonTPCnsigmaHighPtYield) - return false; - - // TOF - if (track.hasTOF()) { - registryData.fill(HIST("tofNSigmaProton"), track.pt(), track.tofNSigmaPr()); - if (track.pt() > protonTPCTOFpT && std::abs(track.tofNSigmaPr()) > protonTOFnsigmaHighPtYield) - return false; - } - - return true; - } - - template - bool isAntiprotonForCorrelation(const T& track) + bool isAntiproton(const T& track) { if (track.sign() > 0) return false; @@ -560,141 +489,6 @@ struct AngularCorrelationsInJets { return true; } - template - bool isAntiprotonForYield(const T& track) - { - if (track.sign() > 0) - return false; - - // DCA - if (std::abs(track.dcaXY()) > antiprotonDCAxyYield) - return false; - if (std::abs(track.dcaZ()) > antiprotonDCAzYield) - return false; - - registryData.fill(HIST("tpcNSigmaAntiproton"), track.pt(), track.tpcNSigmaPr()); - - // TPC - if (track.pt() < antiprotonTPCTOFpT && std::abs(track.tpcNSigmaPr()) > antiprotonTPCnsigmaLowPtYield) - return false; - if (track.pt() > antiprotonTPCTOFpT && std::abs(track.tpcNSigmaPr()) > antiprotonTPCnsigmaHighPtYield) - return false; - - // TOF - if (track.hasTOF()) { - registryData.fill(HIST("tofNSigmaAntiproton"), track.pt(), track.tofNSigmaPr()); - if (track.pt() > antiprotonTPCTOFpT && std::abs(track.tofNSigmaPr()) > antiprotonTOFnsigmaHighPtYield) - return false; - } - - return true; - } - - template - bool isNucleus(const T& track) - { - if (track.sign() < 0) - return false; - if (deuteronAnalysis) { - // DCA - if (std::abs(track.dcaXY()) > nucleiDCAxyYield) - return false; - if (std::abs(track.dcaZ()) > nucleiDCAzYield) - return false; - - registryData.fill(HIST("tpcNSigmaNuclei"), track.pt(), track.tpcNSigmaDe()); - - // TPC - if (track.pt() < nucleiTPCTOFpT && std::abs(track.tpcNSigmaDe()) > nucleiTPCnsigmaLowPtYield) - return false; - if (track.pt() > nucleiTPCTOFpT && std::abs(track.tpcNSigmaDe()) > nucleiTPCnsigmaHighPtYield) - return false; - - // TOF - if (track.hasTOF()) { - registryData.fill(HIST("tofNSigmaNuclei"), track.pt(), track.tofNSigmaDe()); - if (track.pt() > nucleiTPCTOFpT && std::abs(track.tofNSigmaDe()) > nucleiTOFnsigmaHighPtYield) - return false; - } - } else { - // DCA - if (std::abs(track.dcaXY()) > nucleiDCAxyYield) - return false; - if (std::abs(track.dcaZ()) > nucleiDCAzYield) - return false; - - registryData.fill(HIST("tpcNSigmaNuclei"), track.pt(), track.tpcNSigmaHe()); - - // TPC - if (track.pt() < nucleiTPCTOFpT && std::abs(track.tpcNSigmaHe()) > nucleiTPCnsigmaLowPtYield) - return false; - if (track.pt() > nucleiTPCTOFpT && std::abs(track.tpcNSigmaHe()) > nucleiTPCnsigmaHighPtYield) - return false; - - // TOF - if (track.hasTOF()) { - registryData.fill(HIST("tofNSigmaNuclei"), track.pt(), track.tofNSigmaHe()); - if (track.pt() > nucleiTPCTOFpT && std::abs(track.tofNSigmaHe()) > nucleiTOFnsigmaHighPtYield) - return false; - } - } - - return true; - } - - template - bool isAntinucleus(const T& track) - { - if (track.sign() > 0) - return false; - - if (deuteronAnalysis) { - // DCA - if (std::abs(track.dcaXY()) > antinucleiDCAxyYield) - return false; - if (std::abs(track.dcaZ()) > antinucleiDCAzYield) - return false; - - registryData.fill(HIST("tpcNSigmaAntinuclei"), track.pt(), track.tpcNSigmaDe()); - - // TPC - if (track.pt() < antinucleiTPCTOFpT && std::abs(track.tpcNSigmaDe()) > antinucleiTPCnsigmaLowPtYield) - return false; - if (track.pt() > antinucleiTPCTOFpT && std::abs(track.tpcNSigmaDe()) > antinucleiTPCnsigmaHighPtYield) - return false; - - // TOF - if (track.hasTOF()) { - registryData.fill(HIST("tofNSigmaAntinuclei"), track.pt(), track.tofNSigmaDe()); - if (track.pt() > antinucleiTPCTOFpT && std::abs(track.tofNSigmaDe()) > antinucleiTOFnsigmaHighPtYield) - return false; - } - } else { - // DCA - if (std::abs(track.dcaXY()) > antinucleiDCAxyYield) - return false; - if (std::abs(track.dcaZ()) > antinucleiDCAzYield) - return false; - - registryData.fill(HIST("tpcNSigmaAntinuclei"), track.pt(), track.tpcNSigmaHe()); - - // TPC - if (track.pt() < antinucleiTPCTOFpT && std::abs(track.tpcNSigmaHe()) > antinucleiTPCnsigmaLowPtYield) - return false; - if (track.pt() > antinucleiTPCTOFpT && std::abs(track.tpcNSigmaHe()) > antinucleiTPCnsigmaHighPtYield) - return false; - - // TOF - if (track.hasTOF()) { - registryData.fill(HIST("tofNSigmaAntinuclei"), track.pt(), track.tofNSigmaHe()); - if (track.pt() > antinucleiTPCTOFpT && std::abs(track.tofNSigmaHe()) > antinucleiTOFnsigmaHighPtYield) - return false; - } - } - - return true; - } - template bool isPion(const T& track) { @@ -1014,7 +808,6 @@ struct AngularCorrelationsInJets { } registryQC.fill(HIST("maxRadiusVsPt"), jet.pt(), maxRadius); - // QA for comparison with nuclei_in_jets TVector3 ueAxis1(0.0, 0.0, 0.0); TVector3 ueAxis2(0.0, 0.0, 0.0); getPerpendicularAxis(pJet, ueAxis1, +1.0); @@ -1093,9 +886,8 @@ struct AngularCorrelationsInJets { fTempBufferAntiproton.clear(); fTempBufferJet.clear(); - for (int i = 0; i < static_cast(constituents.size()); i++) { // analyse jet constituents - this is where the magic happens + for (const auto& pseudoParticle : constituents) { // analyse jet constituents - this is where the magic happens registryData.fill(HIST("trackProtocol"), 2); - fastjet::PseudoJet pseudoParticle = constituents.at(i); int id = pseudoParticle.user_index(); const auto& jetParticle = particles.at(id); if (!selectTrack(jetParticle)) @@ -1113,59 +905,34 @@ struct AngularCorrelationsInJets { registryQC.fill(HIST("ptDiff"), ptDiff); } - // if (jetParticle.pt() < minJetParticlePt) - // continue; - if (measureYields) { - if (isProtonForYield(jetParticle)) { // collect protons in jet - registryData.fill(HIST("ptJetProton"), jetParticle.pt()); - registryQC.fill(HIST("ptJetProtonVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); - registryData.fill(HIST("trackProtocol"), 3); // # protons - } else if (isAntiprotonForYield(jetParticle)) { // collect antiprotons in jet - registryData.fill(HIST("ptJetAntiproton"), jetParticle.pt()); - registryQC.fill(HIST("ptJetAntiprotonVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); - registryData.fill(HIST("trackProtocol"), 4); // # antiprotons - } else if (isNucleus(jetParticle)) { // collect nuclei in jet - registryData.fill(HIST("ptJetNuclei"), jetParticle.pt()); - registryQC.fill(HIST("ptJetNucleiVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); - registryData.fill(HIST("trackProtocol"), 5); // # nuclei - registryData.fill(HIST("dcaZJetNuclei"), jetParticle.pt(), jetParticle.dcaZ()); - } else if (isAntinucleus(jetParticle)) { - registryData.fill(HIST("ptJetAntinuclei"), jetParticle.pt()); - registryQC.fill(HIST("ptJetAntinucleiVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); - registryData.fill(HIST("trackProtocol"), 6); // # antinuclei - registryData.fill(HIST("dcaZJetAntinuclei"), jetParticle.pt(), jetParticle.dcaZ()); - } - } - if (measureCorrelations) { - if (isProtonForCorrelation(jetParticle)) { - registryData.fill(HIST("trackProtocol"), 7); // # high purity protons - jetProtons.emplace_back(jetParticle); - registryData.fill(HIST("dcaZJetProton"), jetParticle.pt(), jetParticle.dcaZ()); - } - if (isAntiprotonForCorrelation(jetParticle)) { - registryData.fill(HIST("trackProtocol"), 8); // # high purity antiprotons - jetAntiprotons.emplace_back(jetParticle); - registryData.fill(HIST("dcaZJetAntiproton"), jetParticle.pt(), jetParticle.dcaZ()); - } else if (isPion(jetParticle)) { - registryQC.fill(HIST("ptJetPionVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); - registryData.fill(HIST("trackProtocol"), 9); // # antinuclei - registryData.fill(HIST("dcaZJetPion"), jetParticle.pt(), jetParticle.dcaZ()); - if (jetParticle.sign() > 0) { - jetPiPlus.emplace_back(jetParticle); - } else if (jetParticle.sign() < 0) { - jetPiMinus.emplace_back(jetParticle); - } + if (isProton(jetParticle)) { + registryData.fill(HIST("trackProtocol"), 3); // # high purity protons + registryData.fill(HIST("ptJetProton"), jetParticle.pt()); + registryData.fill(HIST("dcaZJetProton"), jetParticle.pt(), jetParticle.dcaZ()); + registryQC.fill(HIST("ptJetProtonVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); + jetProtons.emplace_back(jetParticle); + } else if (isAntiproton(jetParticle)) { + registryData.fill(HIST("trackProtocol"), 4); // # high purity antiprotons + registryData.fill(HIST("ptJetAntiproton"), jetParticle.pt()); + registryData.fill(HIST("dcaZJetAntiproton"), jetParticle.pt(), jetParticle.dcaZ()); + registryQC.fill(HIST("ptJetAntiprotonVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); + jetAntiprotons.emplace_back(jetParticle); + } else if (isPion(jetParticle)) { + registryQC.fill(HIST("ptJetPionVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); + registryData.fill(HIST("trackProtocol"), 5); + registryData.fill(HIST("dcaZJetPion"), jetParticle.pt(), jetParticle.dcaZ()); + if (jetParticle.sign() > 0) { + jetPiPlus.emplace_back(jetParticle); + } else if (jetParticle.sign() < 0) { + jetPiMinus.emplace_back(jetParticle); } } if (measureKaons && isKaon(jetParticle)) { registryQC.fill(HIST("ptJetKaonVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); - registryData.fill(HIST("trackProtocol"), 10); // # antinuclei + registryData.fill(HIST("trackProtocol"), 6); registryData.fill(HIST("dcaZJetKaon"), jetParticle.pt(), jetParticle.dcaZ()); } - } // for (int i=0; i(constituents.size()); i++) - - if (!measureCorrelations) - return jetCounter; + } // for (const auto& pseudoParticle : constituents) if (doJetCorrelations && jetAll.size() > 1) { // general correlation function doCorrelations(jetAll, fBufferJet, fTempBufferJet, 0, pJet); @@ -1254,9 +1021,7 @@ struct AngularCorrelationsInJets { fastjet::PseudoJet inputPseudoJet(track.px(), track.py(), track.pz(), track.energy(mass)); inputPseudoJet.set_user_index(index); particles[index] = track; - if (measureCorrelations) { - particlesForCF.emplace_back(track); - } + particlesForCF.emplace_back(track); jetInput.emplace_back(inputPseudoJet); index++; @@ -1293,10 +1058,8 @@ struct AngularCorrelationsInJets { registryData.fill(HIST("numJetsInEvent"), jetCounter); TVector3 hardestJetAxis(jets.at(0).px(), jets.at(0).py(), jets.at(0).pz()); // for full event, use hardest jet as orientation - if (measureCorrelations) { - doCorrelations(particlesForCF, fBufferFull, fTempBufferFull, -1, hardestJetAxis); - setTrackBuffer(fTempBufferFull, fBufferFull); - } + doCorrelations(particlesForCF, fBufferFull, fTempBufferFull, -1, hardestJetAxis); + setTrackBuffer(fTempBufferFull, fBufferFull); } template @@ -1408,7 +1171,6 @@ struct AngularCorrelationsInJets { } registryQC.fill(HIST("maxRadiusVsPt"), jet.pt(), maxRadius); - // QA for comparison with nuclei_in_jets TVector3 pJet(0., 0., 0.); pJet.SetXYZ(jet.px(), jet.py(), jet.pz()); TVector3 ueAxis1(0.0, 0.0, 0.0); @@ -1419,9 +1181,6 @@ struct AngularCorrelationsInJets { double nchJetPlusUE(0); double nchJet(0); double nchUE(0); - double ptJetPlusUE(0); - double ptJet(0); - double ptUE(0); for (const auto& [index, track] : particles) { TVector3 particleDir(track.px(), track.py(), track.pz()); @@ -1440,47 +1199,26 @@ struct AngularCorrelationsInJets { if (deltaPhiJet != failedPhi) registryQC.fill(HIST("deltaEtadeltaPhiJet"), deltaEtaJet, deltaPhiJet); nchJetPlusUE++; - ptJetPlusUE = ptJetPlusUE + track.pt(); } if (deltaRUE1 < rMax) { if (deltaPhiUE1 != failedPhi) registryQC.fill(HIST("deltaEtadeltaPhiUE"), deltaEtaUE1, deltaPhiUE1); nchUE++; - ptUE = ptUE + track.pt(); } if (deltaRUE2 < rMax) { if (deltaPhiUE2 != failedPhi) registryQC.fill(HIST("deltaEtadeltaPhiUE"), deltaEtaUE2, deltaPhiUE2); nchUE++; - ptUE = ptUE + track.pt(); } } // for (const auto& [index, track] : particles) nchJet = nchJetPlusUE - 0.5 * nchUE; - ptJet = ptJetPlusUE - 0.5 * ptUE; registryQC.fill(HIST("multiplicityJetPlusUE"), nchJetPlusUE); registryQC.fill(HIST("multiplicityJet"), nchJet); registryQC.fill(HIST("multiplicityUE"), 0.5 * nchUE); - registryQC.fill(HIST("ptJetPlusUE"), ptJetPlusUE); - registryQC.fill(HIST("ptJet"), ptJet); - registryQC.fill(HIST("ptUE"), 0.5 * ptUE); - registryQC.fill(HIST("deltaJetPt"), jet.pt() - ptJetPlusUE); - - int nPartClusteredJet = static_cast(constituents.size()); - // Fill QA Histograms - if (ptJetPlusUE < minJetPt) { // swap for sub pt? - - registryQC.fill(HIST("nParticlesClusteredInJet"), nPartClusteredJet); - - for (const auto& track : constituents) { - registryQC.fill(HIST("ptParticlesClusteredInJet"), track.pt()); - } - } - - for (int i = 0; i < static_cast(constituents.size()); i++) { // analyse jet constituents - this is where the magic happens + for (const auto& pseudoParticle : constituents) { // analyse jet constituents - this is where the magic happens registryData.fill(HIST("trackProtocol"), 3); - fastjet::PseudoJet pseudoParticle = constituents.at(i); int id = pseudoParticle.user_index(); const auto& jetParticle = particles.at(id); if (!selectTrack(jetParticle)) @@ -1510,22 +1248,6 @@ struct AngularCorrelationsInJets { registryMC.fill(HIST("numberOfTruthParticles"), 1); registryMC.fill(HIST("ptJetAntiprotonMC"), jetParticle.pt()); break; - case o2::constants::physics::Pdg::kDeuteron: - registryMC.fill(HIST("numberOfTruthParticles"), 2); - registryMC.fill(HIST("ptJetNucleiMC"), jetParticle.pt()); - break; - case -o2::constants::physics::Pdg::kDeuteron: - registryMC.fill(HIST("numberOfTruthParticles"), 3); - registryMC.fill(HIST("ptJetAntinucleiMC"), jetParticle.pt()); - break; - case o2::constants::physics::Pdg::kHelium3: - registryMC.fill(HIST("numberOfTruthParticles"), 4); - registryMC.fill(HIST("ptJetNucleiMC"), jetParticle.pt()); - break; - case -o2::constants::physics::Pdg::kHelium3: - registryMC.fill(HIST("numberOfTruthParticles"), 5); - registryMC.fill(HIST("ptJetAntinucleiMC"), jetParticle.pt()); - break; default: continue; } @@ -1543,39 +1265,11 @@ struct AngularCorrelationsInJets { registryQC.fill(HIST("ptJetAntiprotonVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); registryData.fill(HIST("trackProtocol"), 6); // # antiprotons break; - case o2::constants::physics::Pdg::kDeuteron: - if (deuteronAnalysis) { - registryData.fill(HIST("ptJetNuclei"), jetParticle.pt()); - registryQC.fill(HIST("ptJetNucleiVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); - registryData.fill(HIST("trackProtocol"), 8); // # nuclei - } - break; - case -o2::constants::physics::Pdg::kDeuteron: - if (deuteronAnalysis) { - registryData.fill(HIST("ptJetAntinuclei"), jetParticle.pt()); - registryQC.fill(HIST("ptJetAntinucleiVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); - registryData.fill(HIST("trackProtocol"), 10); // # antinuclei - } - break; - case o2::constants::physics::Pdg::kHelium3: - if (!deuteronAnalysis) { - registryData.fill(HIST("ptJetNuclei"), jetParticle.pt()); - registryQC.fill(HIST("ptJetNucleiVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); - registryData.fill(HIST("trackProtocol"), 8); // # nuclei - } - break; - case -o2::constants::physics::Pdg::kHelium3: - if (!deuteronAnalysis) { - registryData.fill(HIST("ptJetAntinuclei"), jetParticle.pt()); - registryQC.fill(HIST("ptJetAntinucleiVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); - registryData.fill(HIST("trackProtocol"), 10); // # antinuclei - } - break; default: continue; } - } // for (int i=0; i(constituents.size()); i++) - } // for (const auto& jet : jets) + } // for (const auto& pseudoParticle : constituents) + } // for (auto& jet : jets) } void processRun2(soa::Join const& collisions, From 8a28a9b3b74e3506d85ec3dfe434c56677a03a4a Mon Sep 17 00:00:00 2001 From: lucamicheletti93 <38209984+lucamicheletti93@users.noreply.github.com> Date: Wed, 9 Apr 2025 17:15:55 +0200 Subject: [PATCH 0952/1650] [PWGDQ] Removing ambiguous histogram filling (#10801) Co-authored-by: Lucamicheletti93 --- PWGDQ/TableProducer/tableMakerMC.cxx | 3 --- 1 file changed, 3 deletions(-) diff --git a/PWGDQ/TableProducer/tableMakerMC.cxx b/PWGDQ/TableProducer/tableMakerMC.cxx index a8ae3c833f9..f5b80345745 100644 --- a/PWGDQ/TableProducer/tableMakerMC.cxx +++ b/PWGDQ/TableProducer/tableMakerMC.cxx @@ -762,9 +762,6 @@ struct TableMakerMC { for (auto& cut : fMuonCuts) { if (cut.IsSelected(VarManager::fgValues)) { trackTempFilterMap |= (uint8_t(1) << i); - if (fConfigQA) { - fHistMan->FillHistClass(Form("Muons_%s", cut.GetName()), VarManager::fgValues); - } (reinterpret_cast(fStatsList->At(2)))->Fill(static_cast(i)); } i++; From 68561e9efe3e406e723d0ba980905a0f8ebeda88 Mon Sep 17 00:00:00 2001 From: Tao_Fang <52570362+Tao-Fang@users.noreply.github.com> Date: Wed, 9 Apr 2025 23:16:35 +0800 Subject: [PATCH 0953/1650] [PWGHF] Fix unbound index issue in XiC0 tree creator (#10710) Co-authored-by: ALICE Action Bot --- PWGHF/TableProducer/treeCreatorToXiPi.cxx | 248 ++++++++++++---------- 1 file changed, 134 insertions(+), 114 deletions(-) diff --git a/PWGHF/TableProducer/treeCreatorToXiPi.cxx b/PWGHF/TableProducer/treeCreatorToXiPi.cxx index 22beaa2d202..f19642f5151 100644 --- a/PWGHF/TableProducer/treeCreatorToXiPi.cxx +++ b/PWGHF/TableProducer/treeCreatorToXiPi.cxx @@ -15,15 +15,13 @@ /// /// \author Federica Zanone , Heidelberg University -#include "CommonConstants/PhysicsConstants.h" #include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" -#include "Common/DataModel/Centrality.h" -#include "Common/DataModel/Multiplicity.h" - #include "Common/Core/RecoDecay.h" +#include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/CentralityEstimation.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" @@ -35,20 +33,10 @@ namespace o2::aod namespace full { // collision info -DECLARE_SOA_INDEX_COLUMN(Collision, collision); -DECLARE_SOA_INDEX_COLUMN(McCollision, mcCollision); DECLARE_SOA_COLUMN(IsEventSel8, isEventSel8, bool); DECLARE_SOA_COLUMN(IsEventSelZ, isEventSelZ, bool); -DECLARE_SOA_COLUMN(RunNumber, runNumber, int); -DECLARE_SOA_COLUMN(IsEventReject, isEventReject, int); -DECLARE_SOA_COLUMN(CentFT0A, centFT0A, float); -DECLARE_SOA_COLUMN(CentFT0C, centFT0C, float); -DECLARE_SOA_COLUMN(CentFT0M, centFT0M, float); -DECLARE_SOA_COLUMN(CentFV0A, centFV0A, float); -DECLARE_SOA_COLUMN(CentFDDM, centFDDM, float); -DECLARE_SOA_COLUMN(MultZeqNTracksPV, multZeqNTracksPV, float); +DECLARE_SOA_COLUMN(Centrality, centrality, float); // from creator -DECLARE_SOA_COLUMN(Cent, cent, float); DECLARE_SOA_COLUMN(XPv, xPv, float); DECLARE_SOA_COLUMN(YPv, yPv, float); DECLARE_SOA_COLUMN(ZPv, zPv, float); @@ -162,24 +150,10 @@ DECLARE_SOA_COLUMN(TofNSigmaPrFromLambda, tofNSigmaPrFromLambda, float); } // namespace full DECLARE_SOA_TABLE(HfToXiPiEvs, "AOD", "HFTOXIPIEV", - full::IsEventSel8, full::IsEventSelZ, - full::McCollisionId, - collision::NumContrib, - collision::PosX, - collision::PosY, - collision::PosZ, - full::IsEventReject, - full::RunNumber, - full::CentFT0A, - full::CentFT0C, - full::CentFT0M, - full::CentFV0A, - full::CentFDDM, - full::MultZeqNTracksPV); + full::IsEventSel8, full::IsEventSelZ); DECLARE_SOA_TABLE(HfToXiPiFulls, "AOD", "HFTOXIPIFULL", - full::CollisionId, - full::XPv, full::YPv, full::ZPv, collision::NumContrib, collision::Chi2, + full::XPv, full::YPv, full::ZPv, full::Centrality, collision::NumContrib, collision::Chi2, full::XDecayVtxCharmBaryon, full::YDecayVtxCharmBaryon, full::ZDecayVtxCharmBaryon, full::XDecayVtxCascade, full::YDecayVtxCascade, full::ZDecayVtxCascade, full::XDecayVtxV0, full::YDecayVtxV0, full::ZDecayVtxV0, @@ -213,7 +187,7 @@ DECLARE_SOA_TABLE(HfToXiPiFulls, "AOD", "HFTOXIPIFULL", full::FlagMcMatchRec, full::DebugMcRec, full::OriginRec, full::CollisionMatched); DECLARE_SOA_TABLE(HfToXiPiLites, "AOD", "HFTOXIPILITE", - full::XPv, full::YPv, full::ZPv, collision::NumContrib, collision::Chi2, + full::XPv, full::YPv, full::ZPv, full::Centrality, collision::NumContrib, collision::Chi2, full::XDecayVtxCharmBaryon, full::YDecayVtxCharmBaryon, full::ZDecayVtxCharmBaryon, full::XDecayVtxCascade, full::YDecayVtxCascade, full::ZDecayVtxCascade, full::XDecayVtxV0, full::YDecayVtxV0, full::ZDecayVtxV0, @@ -248,14 +222,12 @@ struct HfTreeCreatorToXiPi { Configurable zPvCut{"zPvCut", 10., "Cut on absolute value of primary vertex z coordinate"}; - SliceCache cache; - using Cents = soa::Join; using MyTrackTable = soa::Join; using MyEventTable = soa::Join; - using MyEventTableWithCent = soa::Join; - - Preslice candXicPerCollision = aod::hf_cand_xic0_omegac0::collisionId; + using MyEventTableWithFT0C = soa::Join; + using MyEventTableWithFT0M = soa::Join; + using MyEventTableWithNTracksPV = soa::Join; void init(InitContext const&) { @@ -267,48 +239,27 @@ struct HfTreeCreatorToXiPi { template void fillEvent(const T& collision, float cutZPv) { - float centFT0A = -1.f; - float centFT0C = -1.f; - float centFT0M = -1.f; - float centFV0A = -1.f; - float centFDDM = -1.f; - float multZeqNTracksPV = -1.f; - if constexpr (useCentrality) { - centFT0A = collision.centFT0A(); - centFT0C = collision.centFT0C(); - centFT0M = collision.centFT0M(); - centFV0A = collision.centFV0A(); - centFDDM = collision.centFDDM(); - multZeqNTracksPV = collision.multZeqNTracksPV(); - } - rowEv( - collision.sel8(), std::abs(collision.posZ()) < cutZPv, - -1, - collision.numContrib(), - collision.posX(), - collision.posY(), - collision.posZ(), - 0, - 1, - centFT0A, - centFT0C, - centFT0M, - centFV0A, - centFDDM, - multZeqNTracksPV); + collision.sel8(), std::abs(collision.posZ()) < cutZPv); } - template + template void fillCandidate(const T& candidate, int8_t flagMc, int8_t debugMc, int8_t originMc, bool collisionMatched) { + + float centrality = -999.f; + if constexpr (useCentrality) { + auto const& collision = candidate.template collision_as(); + centrality = o2::hf_centrality::getCentralityColl(collision); + } + rowCandidateFull( - rowEv.lastIndex(), candidate.xPv(), candidate.yPv(), candidate.zPv(), - candidate.template collision_as().numContrib(), - candidate.template collision_as().chi2(), + centrality, + candidate.template collision_as().numContrib(), + candidate.template collision_as().chi2(), candidate.xDecayVtxCharmBaryon(), candidate.yDecayVtxCharmBaryon(), candidate.zDecayVtxCharmBaryon(), @@ -415,17 +366,24 @@ struct HfTreeCreatorToXiPi { collisionMatched); } - template + template void fillCandidateLite(const T& candidate, int8_t flagMc, int8_t originMc, bool collisionMatched) { if (candidate.resultSelections() && candidate.statusPidCharmBaryon() && candidate.statusInvMassLambda() && candidate.statusInvMassCascade() && candidate.statusInvMassCharmBaryon()) { + float centrality = -999.f; + if constexpr (useCentrality) { + auto const& collision = candidate.template collision_as(); + centrality = o2::hf_centrality::getCentralityColl(collision); + } + rowCandidateLite( candidate.xPv(), candidate.yPv(), candidate.zPv(), - candidate.template collision_as().numContrib(), - candidate.template collision_as().chi2(), + centrality, + candidate.template collision_as().numContrib(), + candidate.template collision_as().chi2(), candidate.xDecayVtxCharmBaryon(), candidate.yDecayVtxCharmBaryon(), candidate.zDecayVtxCharmBaryon(), @@ -505,33 +463,30 @@ struct HfTreeCreatorToXiPi { // Filling candidate properties rowCandidateFull.reserve(candidates.size()); for (const auto& candidate : candidates) { - fillCandidate(candidate, -7, -7, RecoDecay::OriginType::None, false); + fillCandidate(candidate, -7, -7, RecoDecay::OriginType::None, false); } } PROCESS_SWITCH(HfTreeCreatorToXiPi, processDataFull, "Process data with full information w/o centrality", true); - void processDataFullWithCentrality(MyEventTableWithCent const& collisions, MyTrackTable const&, - soa::Join const& candidates) + void processMcFullXic0(MyEventTable const& collisions, MyTrackTable const&, + soa::Join const& candidates) { // Filling event properties rowEv.reserve(collisions.size()); for (const auto& collision : collisions) { - auto thisCollId = collision.globalIndex(); - auto groupedXicCandidates = candidates.sliceBy(candXicPerCollision, thisCollId); - auto sizeTableCand = groupedXicCandidates.size(); - fillEvent(collision, zPvCut); + fillEvent(collision, zPvCut); + } - // Filling candidate properties - rowCandidateFull.reserve(sizeTableCand); - for (const auto& candidate : groupedXicCandidates) { - fillCandidate(candidate, -7, -7, RecoDecay::OriginType::None, false); - } + // Filling candidate properties + rowCandidateFull.reserve(candidates.size()); + for (const auto& candidate : candidates) { + fillCandidate(candidate, candidate.flagMcMatchRec(), candidate.debugMcRec(), candidate.originRec(), candidate.collisionMatched()); } } - PROCESS_SWITCH(HfTreeCreatorToXiPi, processDataFullWithCentrality, "Process data with full information with centrality", false); + PROCESS_SWITCH(HfTreeCreatorToXiPi, processMcFullXic0, "Process MC with full information for xic0 w/o centrality", false); - void processMcFullXic0(MyEventTable const& collisions, MyTrackTable const&, - soa::Join const& candidates) + void processMcFullOmegac0(MyEventTable const& collisions, MyTrackTable const&, + soa::Join const& candidates) { // Filling event properties rowEv.reserve(collisions.size()); @@ -542,64 +497,78 @@ struct HfTreeCreatorToXiPi { // Filling candidate properties rowCandidateFull.reserve(candidates.size()); for (const auto& candidate : candidates) { - fillCandidate(candidate, candidate.flagMcMatchRec(), candidate.debugMcRec(), candidate.originRec(), candidate.collisionMatched()); + fillCandidate(candidate, candidate.flagMcMatchRec(), candidate.debugMcRec(), candidate.originRec(), candidate.collisionMatched()); } } - PROCESS_SWITCH(HfTreeCreatorToXiPi, processMcFullXic0, "Process MC with full information for xic0 w/o centrality", false); + PROCESS_SWITCH(HfTreeCreatorToXiPi, processMcFullOmegac0, "Process MC with full information for omegac0", false); - void processMcFullXic0WithCentrality(MyEventTableWithCent const& collisions, MyTrackTable const&, - soa::Join const& candidates) + void processDataLite(MyEventTable const& collisions, MyTrackTable const&, + soa::Join const& candidates) + { + // Filling event properties + rowEv.reserve(collisions.size()); + for (const auto& collision : collisions) { + fillEvent(collision, zPvCut); + } + + // Filling candidate properties + rowCandidateLite.reserve(candidates.size()); + for (const auto& candidate : candidates) { + fillCandidateLite(candidate, -7, RecoDecay::OriginType::None, false); + } + } + PROCESS_SWITCH(HfTreeCreatorToXiPi, processDataLite, "Process data and produce lite table version", false); + + void processDataLiteWithFT0M(MyEventTableWithFT0M const& collisions, MyTrackTable const&, + soa::Join const& candidates) { // Filling event properties rowEv.reserve(collisions.size()); for (const auto& collision : collisions) { - auto thisCollId = collision.globalIndex(); - auto groupedXicCandidates = candidates.sliceBy(candXicPerCollision, thisCollId); - auto sizeTableCand = groupedXicCandidates.size(); fillEvent(collision, zPvCut); + } - // Filling candidate properties - rowCandidateFull.reserve(sizeTableCand); - for (const auto& candidate : groupedXicCandidates) { - fillCandidate(candidate, candidate.flagMcMatchRec(), candidate.debugMcRec(), candidate.originRec(), candidate.collisionMatched()); - } + // Filling candidate properties + rowCandidateLite.reserve(candidates.size()); + for (const auto& candidate : candidates) { + fillCandidateLite(candidate, -7, RecoDecay::OriginType::None, false); } } - PROCESS_SWITCH(HfTreeCreatorToXiPi, processMcFullXic0WithCentrality, "Process MC with full information for xic0 with centrality", false); + PROCESS_SWITCH(HfTreeCreatorToXiPi, processDataLiteWithFT0M, "Process data and produce lite table version with FT0M", false); - void processMcFullOmegac0(MyEventTable const& collisions, MyTrackTable const&, - soa::Join const& candidates) + void processDataLiteWithFT0C(MyEventTableWithFT0C const& collisions, MyTrackTable const&, + soa::Join const& candidates) { // Filling event properties rowEv.reserve(collisions.size()); for (const auto& collision : collisions) { - fillEvent(collision, zPvCut); + fillEvent(collision, zPvCut); } // Filling candidate properties - rowCandidateFull.reserve(candidates.size()); + rowCandidateLite.reserve(candidates.size()); for (const auto& candidate : candidates) { - fillCandidate(candidate, candidate.flagMcMatchRec(), candidate.debugMcRec(), candidate.originRec(), candidate.collisionMatched()); + fillCandidateLite(candidate, -7, RecoDecay::OriginType::None, false); } } - PROCESS_SWITCH(HfTreeCreatorToXiPi, processMcFullOmegac0, "Process MC with full information for omegac0", false); + PROCESS_SWITCH(HfTreeCreatorToXiPi, processDataLiteWithFT0C, "Process data and produce lite table version with FT0C", false); - void processDataLite(MyEventTable const& collisions, MyTrackTable const&, - soa::Join const& candidates) + void processDataLiteWithNTracksPV(MyEventTableWithNTracksPV const& collisions, MyTrackTable const&, + soa::Join const& candidates) { // Filling event properties rowEv.reserve(collisions.size()); for (const auto& collision : collisions) { - fillEvent(collision, zPvCut); + fillEvent(collision, zPvCut); } // Filling candidate properties rowCandidateLite.reserve(candidates.size()); for (const auto& candidate : candidates) { - fillCandidateLite(candidate, -7, RecoDecay::OriginType::None, false); + fillCandidateLite(candidate, -7, RecoDecay::OriginType::None, false); } } - PROCESS_SWITCH(HfTreeCreatorToXiPi, processDataLite, "Process data and produce lite table version", false); + PROCESS_SWITCH(HfTreeCreatorToXiPi, processDataLiteWithNTracksPV, "Process data and produce lite table version with NTracksPV", false); void processMcLiteXic0(MyEventTable const& collisions, MyTrackTable const&, soa::Join const& candidates) @@ -613,11 +582,62 @@ struct HfTreeCreatorToXiPi { // Filling candidate properties rowCandidateLite.reserve(candidates.size()); for (const auto& candidate : candidates) { - fillCandidateLite(candidate, candidate.flagMcMatchRec(), candidate.originRec(), candidate.collisionMatched()); + fillCandidateLite(candidate, candidate.flagMcMatchRec(), candidate.originRec(), candidate.collisionMatched()); } } PROCESS_SWITCH(HfTreeCreatorToXiPi, processMcLiteXic0, "Process MC and produce lite table version for xic0", false); + void processMcLiteXic0WithFT0C(MyEventTableWithFT0C const& collisions, MyTrackTable const&, + soa::Join const& candidates) + { + // Filling event properties + rowEv.reserve(collisions.size()); + for (const auto& collision : collisions) { + fillEvent(collision, zPvCut); + } + + // Filling candidate properties + rowCandidateLite.reserve(candidates.size()); + for (const auto& candidate : candidates) { + fillCandidateLite(candidate, candidate.flagMcMatchRec(), candidate.originRec(), candidate.collisionMatched()); + } + } + PROCESS_SWITCH(HfTreeCreatorToXiPi, processMcLiteXic0WithFT0C, "Process MC and produce lite table version for Xic0 with FT0C", false); + + void processMcLiteXic0WithFT0M(MyEventTableWithFT0M const& collisions, MyTrackTable const&, + soa::Join const& candidates) + { + // Filling event properties + rowEv.reserve(collisions.size()); + for (const auto& collision : collisions) { + fillEvent(collision, zPvCut); + } + + // Filling candidate properties + rowCandidateLite.reserve(candidates.size()); + for (const auto& candidate : candidates) { + fillCandidateLite(candidate, candidate.flagMcMatchRec(), candidate.originRec(), candidate.collisionMatched()); + } + } + PROCESS_SWITCH(HfTreeCreatorToXiPi, processMcLiteXic0WithFT0M, "Process MC and produce lite table version for Xic0 with FT0M", false); + + void processMcLiteXic0WithNTracksPV(MyEventTableWithNTracksPV const& collisions, MyTrackTable const&, + soa::Join const& candidates) + { + // Filling event properties + rowEv.reserve(collisions.size()); + for (const auto& collision : collisions) { + fillEvent(collision, zPvCut); + } + + // Filling candidate properties + rowCandidateLite.reserve(candidates.size()); + for (const auto& candidate : candidates) { + fillCandidateLite(candidate, candidate.flagMcMatchRec(), candidate.originRec(), candidate.collisionMatched()); + } + } + PROCESS_SWITCH(HfTreeCreatorToXiPi, processMcLiteXic0WithNTracksPV, "Process MC and produce lite table version for Xic0 with NTracksPV", false); + void processMcLiteOmegac0(MyEventTable const& collisions, MyTrackTable const&, soa::Join const& candidates) { @@ -630,7 +650,7 @@ struct HfTreeCreatorToXiPi { // Filling candidate properties rowCandidateLite.reserve(candidates.size()); for (const auto& candidate : candidates) { - fillCandidateLite(candidate, candidate.flagMcMatchRec(), candidate.originRec(), candidate.collisionMatched()); + fillCandidateLite(candidate, candidate.flagMcMatchRec(), candidate.originRec(), candidate.collisionMatched()); } } PROCESS_SWITCH(HfTreeCreatorToXiPi, processMcLiteOmegac0, "Process MC and produce lite table version for omegac0", false); From 2388f963ac43c724cfe7e7580638cb2c2d3d2695 Mon Sep 17 00:00:00 2001 From: Ionut Cristian Arsene Date: Wed, 9 Apr 2025 19:14:10 +0200 Subject: [PATCH 0954/1650] [PWGDQ] Adding a process function for V0 tagged tracks in pp, without TOF dependency (#10798) Co-authored-by: Ionut Cristian Arsene --- PWGDQ/TableProducer/tableMaker_withAssoc.cxx | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/PWGDQ/TableProducer/tableMaker_withAssoc.cxx b/PWGDQ/TableProducer/tableMaker_withAssoc.cxx index cee0f547440..1d71d8b362e 100644 --- a/PWGDQ/TableProducer/tableMaker_withAssoc.cxx +++ b/PWGDQ/TableProducer/tableMaker_withAssoc.cxx @@ -1407,6 +1407,14 @@ struct TableMaker { fullSkimming(collisions, bcs, zdcs, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr); } + // produce the barrel-only DQ skimmed barrel data model, with V0 tagged tracks + void processPPBarrelOnlyWithV0s(MyEventsWithMults const& collisions, MyBCs const& bcs, + MyBarrelTracksWithV0BitsNoTOF const& tracksBarrel, + TrackAssoc const& trackAssocs) + { + fullSkimming(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr); + } + // produce the muon-only DQ skimmed data model typically for pp/p-Pb or UPC Pb-Pb (no centrality), meant to run on skimmed data void processPPMuonOnly(MyEventsWithMults const& collisions, BCsWithTimestamps const& bcs, MyMuonsWithCov const& muons, FwdTrackAssoc const& fwdTrackAssocs) @@ -1505,6 +1513,7 @@ struct TableMaker { PROCESS_SWITCH(TableMaker, processPPWithFilterMuonOnly, "Build muon only DQ skimmed data model typically for pp/p-Pb and UPC Pb-Pb, w/ event filtering", false); PROCESS_SWITCH(TableMaker, processPPWithFilterMuonMFT, "Build muon + mft DQ skimmed data model typically for pp/p-Pb and UPC Pb-Pb, w/ event filtering", false); PROCESS_SWITCH(TableMaker, processPPBarrelOnly, "Build barrel only DQ skimmed data model typically for pp/p-Pb and UPC Pb-Pb", false); + PROCESS_SWITCH(TableMaker, processPPBarrelOnlyWithV0s, "Build barrel only DQ skimmed data model, pp like, with V0 tagged tracks", false); PROCESS_SWITCH(TableMaker, processPPMuonOnly, "Build muon only DQ skimmed data model typically for pp/p-Pb and UPC Pb-Pb", false); PROCESS_SWITCH(TableMaker, processPPMuonMFT, "Build muon + mft DQ skimmed data model typically for pp/p-Pb and UPC Pb-Pb", false); PROCESS_SWITCH(TableMaker, processPPMuonMFTWithMultsExtra, "Build muon + mft DQ skimmed data model typically for pp/p-Pb and UPC Pb-Pb", false); From 92ec0639bf9ee207b4f23f9cb0ac5580d1d81fe8 Mon Sep 17 00:00:00 2001 From: rolavick Date: Wed, 9 Apr 2025 20:40:06 +0200 Subject: [PATCH 0955/1650] [PWGUD] Adding new table producer (#10797) Co-authored-by: ALICE Action Bot --- PWGUD/TableProducer/CMakeLists.txt | 11 +- PWGUD/TableProducer/tauEventTableProducer.cxx | 483 ++++++++++++++++++ PWGUD/Tasks/upcTauRl.cxx | 2 +- 3 files changed, 492 insertions(+), 4 deletions(-) create mode 100644 PWGUD/TableProducer/tauEventTableProducer.cxx diff --git a/PWGUD/TableProducer/CMakeLists.txt b/PWGUD/TableProducer/CMakeLists.txt index 5b4200ce804..bf112b2f9f7 100644 --- a/PWGUD/TableProducer/CMakeLists.txt +++ b/PWGUD/TableProducer/CMakeLists.txt @@ -31,7 +31,12 @@ o2physics_add_dpl_workflow(upccand-producer PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::UPCCutparHolder COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(tau-event-table-producer + SOURCES tauEventTableProducer.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(fwdtrack-propagation - SOURCES fwdTrackPropagation.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::GlobalTracking - COMPONENT_NAME Analysis) + SOURCES fwdTrackPropagation.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::GlobalTracking + COMPONENT_NAME Analysis) diff --git a/PWGUD/TableProducer/tauEventTableProducer.cxx b/PWGUD/TableProducer/tauEventTableProducer.cxx new file mode 100644 index 00000000000..29371ea5cf7 --- /dev/null +++ b/PWGUD/TableProducer/tauEventTableProducer.cxx @@ -0,0 +1,483 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +// +/// \file tauEventTableProducer.cxx +/// \brief Produces derived table from UD tables +/// +/// \author Roman Lavicka , Austrian Academy of Sciences & SMI +/// \since 09.04.2025 +// + +// C++ headers +#include +#include +#include +#include +#include + +// O2 headers +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/O2DatabasePDGPlugin.h" +#include "Framework/runDataProcessing.h" + +// O2Physics headers +#include "Common/CCDB/EventSelectionParams.h" +#include "Common/Core/TrackSelection.h" +#include "Common/Core/TrackSelectionDefaults.h" +#include "Common/Core/trackUtilities.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "PWGUD/Core/UPCTauCentralBarrelHelperRL.h" +#include "PWGUD/DataModel/UDTables.h" +#include "PWGUD/Core/SGSelector.h" + +// ROOT headers +#include "TLorentzVector.h" +#include "TPDGCode.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::constants::physics; + +namespace o2::aod +{ +namespace tau_tree +{ +// event info +DECLARE_SOA_COLUMN(RunNumber, runNumber, int32_t); +DECLARE_SOA_COLUMN(Bc, bc, int); +DECLARE_SOA_COLUMN(TotalTracks, totalTracks, int); +DECLARE_SOA_COLUMN(NumContrib, numContrib, int); +DECLARE_SOA_COLUMN(GlobalNonPVtracks, globalNonPVtracks, int); +DECLARE_SOA_COLUMN(PosX, posX, float); +DECLARE_SOA_COLUMN(PosY, posY, float); +DECLARE_SOA_COLUMN(PosZ, posZ, float); +DECLARE_SOA_COLUMN(RecoMode, recoMode, int); +DECLARE_SOA_COLUMN(OccupancyInTime, occupancyInTime, int); +DECLARE_SOA_COLUMN(HadronicRate, hadronicRate, double); +DECLARE_SOA_COLUMN(Trs, trs, int); +DECLARE_SOA_COLUMN(Trofs, trofs, int); +DECLARE_SOA_COLUMN(Hmpr, hmpr, int); +DECLARE_SOA_COLUMN(Tfb, tfb, int); +DECLARE_SOA_COLUMN(ItsRofb, itsRofb, int); +DECLARE_SOA_COLUMN(Sbp, sbp, int); +DECLARE_SOA_COLUMN(ZvtxFT0vsPv, zvtxFT0vsPv, int); +DECLARE_SOA_COLUMN(VtxITSTPC, vtxITSTPC, int); +// FIT info +DECLARE_SOA_COLUMN(TotalFT0AmplitudeA, totalFT0AmplitudeA, float); +DECLARE_SOA_COLUMN(TotalFT0AmplitudeC, totalFT0AmplitudeC, float); +DECLARE_SOA_COLUMN(TotalFV0AmplitudeA, totalFV0AmplitudeA, float); +DECLARE_SOA_COLUMN(EnergyCommonZNA, energyCommonZNA, float); +DECLARE_SOA_COLUMN(EnergyCommonZNC, energyCommonZNC, float); +DECLARE_SOA_COLUMN(TimeFT0A, timeFT0A, float); +DECLARE_SOA_COLUMN(TimeFT0C, timeFT0C, float); +DECLARE_SOA_COLUMN(TimeFV0A, timeFV0A, float); +DECLARE_SOA_COLUMN(TimeZNA, timeZNA, float); +DECLARE_SOA_COLUMN(TimeZNC, timeZNC, float); +// tracks +DECLARE_SOA_COLUMN(TrkPx, trkPx, float[2]); +DECLARE_SOA_COLUMN(TrkPy, trkPy, float[2]); +DECLARE_SOA_COLUMN(TrkPz, trkPz, float[2]); +DECLARE_SOA_COLUMN(TrkSign, trkSign, int[2]); +DECLARE_SOA_COLUMN(TrkDCAxy, trkDCAxy, float[2]); +DECLARE_SOA_COLUMN(TrkDCAz, trkDCAz, float[2]); +DECLARE_SOA_COLUMN(TrkTimeRes, trkTimeRes, float[2]); +DECLARE_SOA_COLUMN(Trk1ITSclusterSizes, trk1ITSclusterSizes, uint32_t); +DECLARE_SOA_COLUMN(Trk2ITSclusterSizes, trk2ITSclusterSizes, uint32_t); +DECLARE_SOA_COLUMN(TrkTPCsignal, trkTPCsignal, float[2]); +DECLARE_SOA_COLUMN(TrkTPCnSigmaEl, trkTPCnSigmaEl, float[2]); +DECLARE_SOA_COLUMN(TrkTPCnSigmaMu, trkTPCnSigmaMu, float[2]); +DECLARE_SOA_COLUMN(TrkTPCnSigmaPi, trkTPCnSigmaPi, float[2]); +DECLARE_SOA_COLUMN(TrkTPCnSigmaKa, trkTPCnSigmaKa, float[2]); +DECLARE_SOA_COLUMN(TrkTPCnSigmaPr, trkTPCnSigmaPr, float[2]); +DECLARE_SOA_COLUMN(TrkTPCinnerParam, trkTPCinnerParam, float[2]); +DECLARE_SOA_COLUMN(TrkTOFsignal, trkTOFsignal, float[2]); +DECLARE_SOA_COLUMN(TrkTOFnSigmaEl, trkTOFnSigmaEl, float[2]); +DECLARE_SOA_COLUMN(TrkTOFnSigmaMu, trkTOFnSigmaMu, float[2]); +DECLARE_SOA_COLUMN(TrkTOFnSigmaPi, trkTOFnSigmaPi, float[2]); +DECLARE_SOA_COLUMN(TrkTOFnSigmaKa, trkTOFnSigmaKa, float[2]); +DECLARE_SOA_COLUMN(TrkTOFnSigmaPr, trkTOFnSigmaPr, float[2]); +DECLARE_SOA_COLUMN(TrkTOFexpMom, trkTOFexpMom, float[2]); + +} // namespace tau_tree +DECLARE_SOA_TABLE(TauTwoTracks, "AOD", "TAUTWOTRACK", + tau_tree::RunNumber, tau_tree::Bc, tau_tree::TotalTracks, tau_tree::NumContrib, tau_tree::GlobalNonPVtracks, tau_tree::PosX, tau_tree::PosY, tau_tree::PosZ, + tau_tree::RecoMode, tau_tree::OccupancyInTime, tau_tree::HadronicRate, + tau_tree::Trs, tau_tree::Trofs, tau_tree::Hmpr, tau_tree::Tfb, tau_tree::ItsRofb, tau_tree::Sbp, tau_tree::ZvtxFT0vsPv, tau_tree::VtxITSTPC, + tau_tree::TotalFT0AmplitudeA, tau_tree::TotalFT0AmplitudeC, tau_tree::TotalFV0AmplitudeA, tau_tree::EnergyCommonZNA, tau_tree::EnergyCommonZNC, + tau_tree::TimeFT0A, tau_tree::TimeFT0C, tau_tree::TimeFV0A, tau_tree::TimeZNA, tau_tree::TimeZNC, + tau_tree::TrkPx, tau_tree::TrkPy, tau_tree::TrkPz, tau_tree::TrkSign, tau_tree::TrkDCAxy, tau_tree::TrkDCAz, tau_tree::TrkTimeRes, + tau_tree::Trk1ITSclusterSizes, tau_tree::Trk2ITSclusterSizes, + tau_tree::TrkTPCsignal, tau_tree::TrkTPCnSigmaEl, tau_tree::TrkTPCnSigmaMu, tau_tree::TrkTPCnSigmaPi, tau_tree::TrkTPCnSigmaKa, tau_tree::TrkTPCnSigmaPr, tau_tree::TrkTPCinnerParam, + tau_tree::TrkTOFsignal, tau_tree::TrkTOFnSigmaEl, tau_tree::TrkTOFnSigmaMu, tau_tree::TrkTOFnSigmaPi, tau_tree::TrkTOFnSigmaKa, tau_tree::TrkTOFnSigmaPr, tau_tree::TrkTOFexpMom); + +} // namespace o2::aod + +struct TauEventTableProducer { + Produces tauTwoTracks; + + // Global varialbes + Service pdg; + SGSelector sgSelector; + + HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + + // declare configurables + Configurable verboseInfo{"verboseInfo", false, {"Print general info to terminal; default it false."}}; + + struct : ConfigurableGroup { + Configurable whichGapSide{"whichGapSide", 2, {"0 for side A, 1 for side C, 2 for both sides"}}; + Configurable useTrueGap{"useTrueGap", true, {"Calculate gapSide for a given FV0/FT0/ZDC thresholds"}}; + Configurable cutNumContribs{"cutNumContribs", 2, {"How many contributors event has"}}; + Configurable useNumContribs{"useNumContribs", false, {"Use coll.numContribs as event cut"}}; + Configurable cutRecoFlag{"cutRecoFlag", 1, {"0 = std mode, 1 = upc mode"}}; + Configurable useRecoFlag{"useRecoFlag", false, {"Use coll.flags as event cut"}}; + Configurable cutTrueGapSideFV0{"cutTrueGapSideFV0", -1, "FV0A threshold for SG selector"}; + Configurable cutTrueGapSideFT0A{"cutTrueGapSideFT0A", 150., "FT0A threshold for SG selector"}; + Configurable cutTrueGapSideFT0C{"cutTrueGapSideFT0C", 50., "FT0C threshold for SG selector"}; + Configurable cutTrueGapSideZDC{"cutTrueGapSideZDC", 10000., "ZDC threshold for SG selector. 0 is <1n, 4.2 is <2n, 6.7 is <3n, 9.5 is <4n, 12.5 is <5n"}; + Configurable cutFITtime{"cutFITtime", 40., "Maximum FIT time allowed. Default is 40ns"}; + Configurable cutEvOccupancy{"cutEvOccupancy", 100000., "Maximum allowed occupancy"}; + Configurable cutEvTrs{"cutEvTrs", false, {"Event selection bit kNoCollInTimeRangeStandard"}}; + Configurable cutEvTrofs{"cutEvTrofs", false, {"Event selection bit kNoCollInRofStandard"}}; + Configurable cutEvHmpr{"cutEvHmpr", false, {"Event selection bit kNoHighMultCollInPrevRof"}}; + } cutSample; + + struct : ConfigurableGroup { + Configurable applyGlobalTrackSelection{"applyGlobalTrackSelection", false, {"Applies cut on here defined global tracks"}}; + Configurable cutMinPt{"cutMinPt", 0.1f, {"Global track cut"}}; + Configurable cutMaxPt{"cutMaxPt", 1e10f, {"Global track cut"}}; + Configurable cutMinEta{"cutMinEta", -0.8f, {"Global track cut"}}; + Configurable cutMaxEta{"cutMaxEta", 0.8f, {"Global track cut"}}; + Configurable cutMaxDCAz{"cutMaxDCAz", 2.f, {"Global track cut"}}; + Configurable cutMaxDCAxy{"cutMaxDCAxy", 1e10f, {"Global track cut"}}; + Configurable applyPtDependentDCAxy{"applyPtDependentDCAxy", false, {"Global track cut"}}; + Configurable cutHasITS{"cutHasITS", true, {"Global track cut"}}; + Configurable cutMinITSnCls{"cutMinITSnCls", 1, {"Global track cut"}}; + Configurable cutMaxITSchi2{"cutMaxITSchi2", 36.f, {"Global track cut"}}; + Configurable cutITShitsRule{"cutITShitsRule", 0, {"Global track cut"}}; + Configurable cutHasTPC{"cutHasTPC", true, {"Global track cut"}}; + Configurable cutMinTPCnCls{"cutMinTPCnCls", 1, {"Global track cut"}}; + Configurable cutMinTPCnClsXrows{"cutMinTPCnClsXrows", 70, {"Global track cut"}}; + Configurable cutMinTPCnClsXrowsOverNcls{"cutMinTPCnClsXrowsOverNcls", 0.8f, {"Global track cut"}}; + Configurable cutMaxTPCchi2{"cutMaxTPCchi2", 4.f, {"Global track cut"}}; + Configurable cutGoodITSTPCmatching{"cutGoodITSTPCmatching", true, {"Global track cut"}}; + Configurable cutMaxTOFchi2{"cutMaxTOFchi2", 3.f, {"Global track cut"}}; + } cutGlobalTrack; + + struct : ConfigurableGroup { + Configurable preselUseTrackPID{"preselUseTrackPID", true, {"Apply weak PID check on tracks."}}; + Configurable preselNgoodPVtracs{"preselNgoodPVtracs", 2, {"How many good PV tracks to select."}}; + Configurable preselMinElectronNsigmaEl{"preselMinElectronNsigmaEl", 4.0, {"Good el candidate hypo in. Upper n sigma cut on el hypo of selected electron. What is more goes away."}}; + Configurable preselMaxElectronNsigmaEl{"preselMaxElectronNsigmaEl", -2.0, {"Good el candidate hypo in. Lower n sigma cut on el hypo of selected electron. What is less goes away."}}; + Configurable preselElectronHasTOF{"preselElectronHasTOF", true, {"Electron candidated is required to hit TOF."}}; + Configurable preselMinPionNsigmaEl{"preselMinPionNsigmaEl", 5.0, {"Good pi candidate hypo in. Upper n sigma cut on pi hypo of selected electron. What is more goes away."}}; + Configurable preselMaxPionNsigmaEl{"preselMaxPionNsigmaEl", -5.0, {"Good pi candidate hypo in. Lower n sigma cut on pi hypo of selected electron. What is less goes away."}}; + Configurable preselMinMuonNsigmaEl{"preselMinMuonNsigmaEl", 5.0, {"Good pi candidate hypo in. Upper n sigma cut on pi hypo of selected electron. What is more goes away."}}; + Configurable preselMaxMuonNsigmaEl{"preselMaxMuonNsigmaEl", -5.0, {"Good pi candidate hypo in. Lower n sigma cut on pi hypo of selected electron. What is less goes away."}}; + Configurable preselMupionHasTOF{"preselMupionHasTOF", true, {"Mupion candidate is required to hit TOF."}}; + } cutPreselect; + + using FullUDTracks = soa::Join; + using FullSGUDCollisions = soa::Join; + using FullSGUDCollision = FullSGUDCollisions::iterator; + + // init + void init(InitContext&) + { + if (verboseInfo) + printMediumMessage("INIT METHOD"); + + mySetITShitsRule(cutGlobalTrack.cutITShitsRule); + + } // end init + + template + bool isGoodFITtime(C const& coll, float maxFITtime) + { + + // FTOA + if ((std::abs(coll.timeFT0A()) > maxFITtime) && coll.timeFT0A() > -998.) + return false; + + // FTOC + if ((std::abs(coll.timeFT0C()) > maxFITtime) && coll.timeFT0C() > -998.) + return false; + + return true; + } + + template + bool isGoodROFtime(C const& coll) + { + + // Occupancy + if (coll.occupancyInTime() > cutSample.cutEvOccupancy) + return false; + + // kNoCollInTimeRangeStandard + if (cutSample.cutEvTrs && !coll.trs()) + return false; + + // kNoCollInRofStandard + if (cutSample.cutEvTrofs && !coll.trofs()) + return false; + + // kNoHighMultCollInPrevRof + if (cutSample.cutEvHmpr && !coll.hmpr()) + return false; + + return true; + } + + std::vector>> cutMyRequiredITSHits{}; + + void mySetRequireHitsInITSLayers(int8_t minNRequiredHits, std::set requiredLayers) + { + // layer 0 corresponds to the the innermost ITS layer + cutMyRequiredITSHits.push_back(std::make_pair(minNRequiredHits, requiredLayers)); + } + + void mySetITShitsRule(int matching) + { + switch (matching) { + case 0: // Run3ITSibAny + mySetRequireHitsInITSLayers(1, {0, 1, 2}); + break; + case 1: // Run3ITSibTwo + mySetRequireHitsInITSLayers(2, {0, 1, 2}); + break; + case 2: // Run3ITSallAny + mySetRequireHitsInITSLayers(1, {0, 1, 2, 3, 4, 5, 6}); + break; + case 3: // Run3ITSall7Layers + mySetRequireHitsInITSLayers(7, {0, 1, 2, 3, 4, 5, 6}); + break; + default: + LOG(fatal) << "You chose wrong ITS matching"; + break; + } + } + + bool isFulfillsITSHitRequirementsReinstatement(uint8_t itsClusterMap) const + { + constexpr uint8_t kBit = 1; + for (const auto& kITSrequirement : cutMyRequiredITSHits) { + auto hits = std::count_if(kITSrequirement.second.begin(), kITSrequirement.second.end(), [&](auto&& requiredLayer) { return itsClusterMap & (kBit << requiredLayer); }); + if ((kITSrequirement.first == -1) && (hits > 0)) { + return false; // no hits were required in specified layers + } else if (hits < kITSrequirement.first) { + return false; // not enough hits found in specified layers + } + } + return true; + } + + template + bool isGlobalTrackReinstatement(T const& track) + { + // kInAcceptance copy + if (track.pt() < cutGlobalTrack.cutMinPt || track.pt() > cutGlobalTrack.cutMaxPt) + return false; + if (eta(track.px(), track.py(), track.pz()) < cutGlobalTrack.cutMinEta || eta(track.px(), track.py(), track.pz()) > cutGlobalTrack.cutMaxEta) + return false; + // kPrimaryTracks + // GoldenChi2 cut is only for Run 2 + if (std::abs(track.dcaZ()) > cutGlobalTrack.cutMaxDCAz) + return false; + if (cutGlobalTrack.applyPtDependentDCAxy) { + float maxDCA = 0.0182f + 0.0350f / std::pow(track.pt(), 1.01f); + if (std::abs(track.dcaXY()) > maxDCA) + return false; + } else { + if (std::abs(track.dcaXY()) > cutGlobalTrack.cutMaxDCAxy) + return false; + } + // kQualityTrack + // TrackType is always 1 as per definition of processed Run3 AO2Ds + // ITS + if (cutGlobalTrack.cutHasITS && !track.hasITS()) + return false; // ITS refit + if (track.itsNCls() < cutGlobalTrack.cutMinITSnCls) + return false; + if (track.itsChi2NCl() > cutGlobalTrack.cutMaxITSchi2) + return false; + if (!isFulfillsITSHitRequirementsReinstatement(track.itsClusterMap())) + return false; + // TPC + if (cutGlobalTrack.cutHasTPC && !track.hasTPC()) + return false; // TPC refit + if ((track.tpcNClsFindable() - track.tpcNClsFindableMinusFound()) < cutGlobalTrack.cutMinTPCnCls) + return false; // tpcNClsFound() + if (track.tpcNClsCrossedRows() < cutGlobalTrack.cutMinTPCnClsXrows) + return false; + if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < cutGlobalTrack.cutMinTPCnClsXrowsOverNcls) + return false; + if (track.tpcChi2NCl() > cutGlobalTrack.cutMaxTPCchi2) + return false; // TPC chi2 + if (cutGlobalTrack.cutGoodITSTPCmatching) { + if (track.itsChi2NCl() < 0.) + return false; // TPC chi2 + } + // TOF + if (track.hasTOF()) { + if (track.tpcChi2NCl() > cutGlobalTrack.cutMaxTOFchi2) + return false; // TOF chi2 + } + + return true; + } + + template + bool isElectronCandidate(T const& electronCandidate) + // Loose criterium to find electron-like particle + // Requiring TOF to avoid double-counting pions/electrons and for better timing + { + if (electronCandidate.tpcNSigmaEl() < cutPreselect.preselMaxElectronNsigmaEl || electronCandidate.tpcNSigmaEl() > cutPreselect.preselMinElectronNsigmaEl) + return false; + if (cutPreselect.preselElectronHasTOF && !electronCandidate.hasTOF()) + return false; + return true; + } + + template + bool isMuPionCandidate(T const& muPionCandidate) + // Loose criterium to find muon/pion-like particle + // Requiring TOF for better timing + { + if (muPionCandidate.tpcNSigmaMu() < cutPreselect.preselMaxMuonNsigmaEl || muPionCandidate.tpcNSigmaMu() > cutPreselect.preselMinMuonNsigmaEl) + return false; + if (muPionCandidate.tpcNSigmaPi() < cutPreselect.preselMaxPionNsigmaEl || muPionCandidate.tpcNSigmaPi() > cutPreselect.preselMinPionNsigmaEl) + return false; + if (cutPreselect.preselMupionHasTOF && !muPionCandidate.hasTOF()) + return false; + return true; + } + + void processDataSG(FullSGUDCollision const& collision, + FullUDTracks const& tracks) + { + + int gapSide = collision.gapSide(); + int trueGapSide = sgSelector.trueGap(collision, cutSample.cutTrueGapSideFV0, cutSample.cutTrueGapSideFT0A, cutSample.cutTrueGapSideFT0C, cutSample.cutTrueGapSideZDC); + + if (cutSample.useTrueGap) + gapSide = trueGapSide; + + if (!isGoodROFtime(collision)) + return; + + if (gapSide != cutSample.whichGapSide) + return; + + if (!isGoodFITtime(collision, cutSample.cutFITtime)) + return; + + if (cutSample.useNumContribs && (collision.numContrib() != cutSample.cutNumContribs)) + return; + + if (cutSample.useRecoFlag && (collision.flags() != cutSample.cutRecoFlag)) + return; + + int countTracksPerCollision = 0; + int countGoodNonPVtracks = 0; + int countGoodPVtracks = 0; + std::vector vecTrkIdx; + // Loop over tracks with selections + for (const auto& track : tracks) { + countTracksPerCollision++; + if (!isGlobalTrackReinstatement(track)) + continue; + if (!track.isPVContributor()) { + countGoodNonPVtracks++; + continue; + } + countGoodPVtracks++; + vecTrkIdx.push_back(track.index()); + } // Loop over tracks with selections + + // Apply weak condition on track PID + int countPVGTel = 0; + int countPVGTmupi = 0; + if (countGoodPVtracks == 2) { + for (const auto& vecMember : vecTrkIdx) { + const auto& thisTrk = tracks.iteratorAt(vecMember); + if (isElectronCandidate(thisTrk)) { + countPVGTel++; + continue; + } + if (isMuPionCandidate(thisTrk)) { + countPVGTmupi++; + } + } + } + + if (cutPreselect.preselUseTrackPID ? ((countPVGTel == 2 && countPVGTmupi == 0) || (countPVGTel == 1 && countPVGTmupi == 1)) : countGoodPVtracks == cutPreselect.preselNgoodPVtracs) { + const auto& trk1 = tracks.iteratorAt(vecTrkIdx[0]); + const auto& trk2 = tracks.iteratorAt(vecTrkIdx[1]); + + float px[2] = {trk1.px(), trk2.px()}; + float py[2] = {trk1.py(), trk2.py()}; + float pz[2] = {trk1.pz(), trk2.pz()}; + int sign[2] = {trk1.sign(), trk2.sign()}; + float dcaxy[2] = {trk1.dcaXY(), trk2.dcaXY()}; + float dcaz[2] = {trk1.dcaZ(), trk2.dcaZ()}; + float trkTimeRes[2] = {trk1.trackTimeRes(), trk2.trackTimeRes()}; + uint32_t itsClusterSizesTrk1 = trk1.itsClusterSizes(); + uint32_t itsClusterSizesTrk2 = trk2.itsClusterSizes(); + float tpcSignal[2] = {trk1.tpcSignal(), trk2.tpcSignal()}; + float tpcEl[2] = {trk1.tpcNSigmaEl(), trk2.tpcNSigmaEl()}; + float tpcMu[2] = {trk1.tpcNSigmaMu(), trk2.tpcNSigmaMu()}; + float tpcPi[2] = {trk1.tpcNSigmaPi(), trk2.tpcNSigmaPi()}; + float tpcKa[2] = {trk1.tpcNSigmaKa(), trk2.tpcNSigmaKa()}; + float tpcPr[2] = {trk1.tpcNSigmaPr(), trk2.tpcNSigmaPr()}; + float tpcIP[2] = {trk1.tpcInnerParam(), trk2.tpcInnerParam()}; + float tofSignal[2] = {trk1.tofSignal(), trk2.tofSignal()}; + float tofEl[2] = {trk1.tofNSigmaEl(), trk2.tofNSigmaEl()}; + float tofMu[2] = {trk1.tofNSigmaMu(), trk2.tofNSigmaMu()}; + float tofPi[2] = {trk1.tofNSigmaPi(), trk2.tofNSigmaPi()}; + float tofKa[2] = {trk1.tofNSigmaKa(), trk2.tofNSigmaKa()}; + float tofPr[2] = {trk1.tofNSigmaPr(), trk2.tofNSigmaPr()}; + float tofEP[2] = {trk1.tofExpMom(), trk2.tofExpMom()}; + // float infoZDC[4] = {-999., -999., -999., -999.}; + // if constexpr (requires { collision.udZdcsReduced(); }) { + // infoZDC[0] = collision.energyCommonZNA(); + // infoZDC[1] = collision.energyCommonZNC(); + // infoZDC[2] = collision.timeZNA(); + // infoZDC[3] = collision.timeZNC(); + // } + float infoZDC[4] = {collision.energyCommonZNA(), collision.energyCommonZNC(), collision.timeZNA(), collision.timeZNC()}; + + tauTwoTracks(collision.runNumber(), collision.globalBC(), countTracksPerCollision, collision.numContrib(), countGoodNonPVtracks, collision.posX(), collision.posY(), collision.posZ(), + collision.flags(), collision.occupancyInTime(), collision.hadronicRate(), collision.trs(), collision.trofs(), collision.hmpr(), + collision.tfb(), collision.itsROFb(), collision.sbp(), collision.zVtxFT0vPV(), collision.vtxITSTPC(), + collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFV0AmplitudeA(), infoZDC[0], infoZDC[1], + collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), infoZDC[2], infoZDC[3], + px, py, pz, sign, dcaxy, dcaz, trkTimeRes, + itsClusterSizesTrk1, itsClusterSizesTrk2, + tpcSignal, tpcEl, tpcMu, tpcPi, tpcKa, tpcPr, tpcIP, + tofSignal, tofEl, tofMu, tofPi, tofKa, tofPr, tofEP); + } + + } // end processDataSG + + PROCESS_SWITCH(TauEventTableProducer, processDataSG, "Iterate UD tables with measured data created by SG-Candidate-Producer.", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc)}; +} diff --git a/PWGUD/Tasks/upcTauRl.cxx b/PWGUD/Tasks/upcTauRl.cxx index 416773e05a8..91b4e87ed29 100644 --- a/PWGUD/Tasks/upcTauRl.cxx +++ b/PWGUD/Tasks/upcTauRl.cxx @@ -852,7 +852,7 @@ struct UpcTauRl { return false; // FTOC - if ((std::abs(coll.timeFT0C()) > maxFITtime) && coll.timeFT0A() > -998.) + if ((std::abs(coll.timeFT0C()) > maxFITtime) && coll.timeFT0C() > -998.) return false; return true; From fa5a30eb6d91c9b29f382f5cf28d1d4af019936c Mon Sep 17 00:00:00 2001 From: Fabrizio Date: Wed, 9 Apr 2025 21:22:08 +0200 Subject: [PATCH 0956/1650] [PWGHF] Add tagging of D* -> D0 pi -> K pi pi pi0 at gen level (#10802) --- PWGHF/D2H/Tasks/taskCharmPolarisation.cxx | 90 +++++++++++++++---- .../DataModel/CandidateReconstructionTables.h | 4 + PWGHF/TableProducer/candidateCreatorDstar.cxx | 35 +++----- 3 files changed, 88 insertions(+), 41 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskCharmPolarisation.cxx b/PWGHF/D2H/Tasks/taskCharmPolarisation.cxx index edd143675ef..14b920961df 100644 --- a/PWGHF/D2H/Tasks/taskCharmPolarisation.cxx +++ b/PWGHF/D2H/Tasks/taskCharmPolarisation.cxx @@ -527,18 +527,34 @@ struct TaskPolarisationCharmHadrons { if (activateTHnSparseCosThStarHelicity) { registry.add("hGenPromptHelicity", "THn for polarisation studies with cosThStar w.r.t. helicity axis -- gen prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisCosThetaStarHelicity, thnAxisDausAcc, thnAxisResoChannelLc, thnAxisCharge}); registry.add("hGenNonPromptHelicity", "THn for polarisation studies with cosThStar w.r.t. helicity axis -- gen non-prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisCosThetaStarHelicity, thnAxisPtB, thnAxisDausAcc, thnAxisResoChannelLc, thnAxisCharge}); + if (activatePartRecoDstar && (doprocessDstarMc || doprocessDstarMcWithMl)) { + registry.add("hGenPartRecoPromptHelicity", "THn for polarisation studies with cosThStar w.r.t. helicity axis -- gen prompt partly reco signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisCosThetaStarHelicity, thnAxisDausAcc, thnAxisResoChannelLc, thnAxisCharge}); + registry.add("hGenPartRecoNonPromptHelicity", "THn for polarisation studies with cosThStar w.r.t. helicity axis -- gen non-prompt partly reco signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisCosThetaStarHelicity, thnAxisPtB, thnAxisDausAcc, thnAxisResoChannelLc, thnAxisCharge}); + } } if (activateTHnSparseCosThStarProduction) { registry.add("hGenPromptProduction", "THn for polarisation studies with cosThStar w.r.t. production axis -- gen prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisCosThetaStarProduction, thnAxisDausAcc, thnAxisResoChannelLc, thnAxisCharge}); registry.add("hGenNonPromptProduction", "THn for polarisation studies with cosThStar w.r.t. production axis -- gen non-prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisCosThetaStarProduction, thnAxisPtB, thnAxisDausAcc, thnAxisResoChannelLc, thnAxisCharge}); + if (activatePartRecoDstar && (doprocessDstarMc || doprocessDstarMcWithMl)) { + registry.add("hGenPartRecoPromptProduction", "THn for polarisation studies with cosThStar w.r.t. production axis -- gen partly reco prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisCosThetaStarProduction, thnAxisDausAcc, thnAxisResoChannelLc, thnAxisCharge}); + registry.add("hGenPartRecoNonPromptProduction", "THn for polarisation studies with cosThStar w.r.t. production axis -- gen partly reco non-prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisCosThetaStarProduction, thnAxisPtB, thnAxisDausAcc, thnAxisResoChannelLc, thnAxisCharge}); + } } if (activateTHnSparseCosThStarBeam) { registry.add("hGenPromptBeam", "THn for polarisation studies with cosThStar w.r.t. beam axis -- gen prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisCosThetaStarBeam, thnAxisDausAcc, thnAxisResoChannelLc, thnAxisCharge}); registry.add("hGenNonPromptBeam", "THn for polarisation studies with cosThStar w.r.t. beam axis -- gen non-prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisCosThetaStarBeam, thnAxisPtB, thnAxisDausAcc, thnAxisResoChannelLc, thnAxisCharge}); + if (activatePartRecoDstar && (doprocessDstarMc || doprocessDstarMcWithMl)) { + registry.add("hGenPartRecoPromptBeam", "THn for polarisation studies with cosThStar w.r.t. beam axis -- gen partly reco prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisCosThetaStarBeam, thnAxisDausAcc, thnAxisResoChannelLc, thnAxisCharge}); + registry.add("hGenPartRecoNonPromptBeam", "THn for polarisation studies with cosThStar w.r.t. beam axis -- gen partly reco non-prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisCosThetaStarBeam, thnAxisPtB, thnAxisDausAcc, thnAxisResoChannelLc, thnAxisCharge}); + } } if (activateTHnSparseCosThStarRandom) { - registry.add("hGenPromptRandom", "THn for polarisation studies with cosThStar w.r.t. random axis -- gen prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisCosThetaStarRandom, thnAxisDausAcc, thnAxisResoChannelLc, thnAxisCharge}); - registry.add("hGenNonPromptRandom", "THn for polarisation studies with cosThStar w.r.t. random axis -- gen non-prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisCosThetaStarRandom, thnAxisPtB, thnAxisDausAcc, thnAxisResoChannelLc, thnAxisCharge}); + registry.add("hGenPartRecoPromptRandom", "THn for polarisation studies with cosThStar w.r.t. random axis -- gen prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisCosThetaStarRandom, thnAxisDausAcc, thnAxisResoChannelLc, thnAxisCharge}); + registry.add("hGenPartRecoNonPromptRandom", "THn for polarisation studies with cosThStar w.r.t. random axis -- gen non-prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisCosThetaStarRandom, thnAxisPtB, thnAxisDausAcc, thnAxisResoChannelLc, thnAxisCharge}); + if (activatePartRecoDstar && (doprocessDstarMc || doprocessDstarMcWithMl)) { + registry.add("hGenPartRecoPromptRandom", "THn for polarisation studies with cosThStar w.r.t. random axis -- gen partly reco prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisCosThetaStarRandom, thnAxisDausAcc, thnAxisResoChannelLc, thnAxisCharge}); + registry.add("hGenPartRecoNonPromptRandom", "THn for polarisation studies with cosThStar w.r.t. random axis -- gen partly reco non-prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisCosThetaStarRandom, thnAxisPtB, thnAxisDausAcc, thnAxisResoChannelLc, thnAxisCharge}); + } } } @@ -894,32 +910,65 @@ struct TaskPolarisationCharmHadrons { /// \param ptBhadMother is the pt of the b-hadron mother (only in case of non-prompt) /// \param areDausInAcc is a flag indicating whether the daughters are in acceptance or not /// \param resoChannelLc indicates the Lc decay channel (direct, resonant) + /// \param isPartRecoDstar is a flag indicating if it is a partly reconstructed Dstar->D0pi->Kpipipi0 meson (MC only) template - void fillGenHistos(float ptCharmHad, int numPvContributors, float rapCharmHad, float cosThetaStar, int8_t origin, float ptBhadMother, bool areDausInAcc, uint8_t resoChannelLc, int8_t charge) + void fillGenHistos(float ptCharmHad, int numPvContributors, float rapCharmHad, float cosThetaStar, int8_t origin, float ptBhadMother, bool areDausInAcc, uint8_t resoChannelLc, int8_t charge, bool isPartRecoDstar) { if constexpr (cosThetaStarType == charm_polarisation::CosThetaStarType::Helicity) { // Helicity if (origin == RecoDecay::OriginType::Prompt) { // prompt - registry.fill(HIST("hGenPromptHelicity"), ptCharmHad, numPvContributors, rapCharmHad, cosThetaStar, areDausInAcc, resoChannelLc, charge); + if (!isPartRecoDstar) { + registry.fill(HIST("hGenPromptHelicity"), ptCharmHad, numPvContributors, rapCharmHad, cosThetaStar, areDausInAcc, resoChannelLc, charge); + } else { + registry.fill(HIST("hGenPartRecoPromptHelicity"), ptCharmHad, numPvContributors, rapCharmHad, cosThetaStar, areDausInAcc, resoChannelLc, charge); + } } else { // non-prompt - registry.fill(HIST("hGenNonPromptHelicity"), ptCharmHad, numPvContributors, rapCharmHad, cosThetaStar, ptBhadMother, areDausInAcc, resoChannelLc, charge); + if (!isPartRecoDstar) { + registry.fill(HIST("hGenNonPromptHelicity"), ptCharmHad, numPvContributors, rapCharmHad, cosThetaStar, ptBhadMother, areDausInAcc, resoChannelLc, charge); + } else { + registry.fill(HIST("hGenPartRecoNonPromptHelicity"), ptCharmHad, numPvContributors, rapCharmHad, cosThetaStar, ptBhadMother, areDausInAcc, resoChannelLc, charge); + } } } else if constexpr (cosThetaStarType == charm_polarisation::CosThetaStarType::Production) { // Production if (origin == RecoDecay::OriginType::Prompt) { // prompt - registry.fill(HIST("hGenPromptProduction"), ptCharmHad, numPvContributors, rapCharmHad, cosThetaStar, areDausInAcc, resoChannelLc, charge); + if (!isPartRecoDstar) { + registry.fill(HIST("hGenPromptProduction"), ptCharmHad, numPvContributors, rapCharmHad, cosThetaStar, areDausInAcc, resoChannelLc, charge); + } else { + registry.fill(HIST("hGenPartRecoPromptProduction"), ptCharmHad, numPvContributors, rapCharmHad, cosThetaStar, areDausInAcc, resoChannelLc, charge); + } } else { // non-prompt - registry.fill(HIST("hGenNonPromptProduction"), ptCharmHad, numPvContributors, rapCharmHad, cosThetaStar, ptBhadMother, areDausInAcc, resoChannelLc, charge); + if (!isPartRecoDstar) { + registry.fill(HIST("hGenNonPromptProduction"), ptCharmHad, numPvContributors, rapCharmHad, cosThetaStar, ptBhadMother, areDausInAcc, resoChannelLc, charge); + } else { + registry.fill(HIST("hGenPartRecoNonPromptProduction"), ptCharmHad, numPvContributors, rapCharmHad, cosThetaStar, ptBhadMother, areDausInAcc, resoChannelLc, charge); + } } } else if constexpr (cosThetaStarType == charm_polarisation::CosThetaStarType::Beam) { // Beam if (origin == RecoDecay::OriginType::Prompt) { // prompt - registry.fill(HIST("hGenPromptBeam"), ptCharmHad, numPvContributors, rapCharmHad, cosThetaStar, areDausInAcc, resoChannelLc, charge); + if (!isPartRecoDstar) { + registry.fill(HIST("hGenPromptBeam"), ptCharmHad, numPvContributors, rapCharmHad, cosThetaStar, areDausInAcc, resoChannelLc, charge); + } else { + registry.fill(HIST("hGenPartRecoPromptBeam"), ptCharmHad, numPvContributors, rapCharmHad, cosThetaStar, areDausInAcc, resoChannelLc, charge); + } } else { // non-prompt - registry.fill(HIST("hGenNonPromptBeam"), ptCharmHad, numPvContributors, rapCharmHad, cosThetaStar, ptBhadMother, areDausInAcc, resoChannelLc, charge); + if (!isPartRecoDstar) { + registry.fill(HIST("hGenNonPromptBeam"), ptCharmHad, numPvContributors, rapCharmHad, cosThetaStar, ptBhadMother, areDausInAcc, resoChannelLc, charge); + } else { + registry.fill(HIST("hGenPartRecoNonPromptBeam"), ptCharmHad, numPvContributors, rapCharmHad, cosThetaStar, ptBhadMother, areDausInAcc, resoChannelLc, charge); + } } } else if constexpr (cosThetaStarType == charm_polarisation::CosThetaStarType::Random) { // Random if (origin == RecoDecay::OriginType::Prompt) { // prompt - registry.fill(HIST("hGenPromptRandom"), ptCharmHad, numPvContributors, rapCharmHad, cosThetaStar, areDausInAcc, resoChannelLc, charge); + if (!isPartRecoDstar) { + registry.fill(HIST("hGenPromptRandom"), ptCharmHad, numPvContributors, rapCharmHad, cosThetaStar, areDausInAcc, resoChannelLc, charge); + } else { + registry.fill(HIST("hGenPartRecoPromptRandom"), ptCharmHad, numPvContributors, rapCharmHad, cosThetaStar, areDausInAcc, resoChannelLc, charge); + } } else { // non-prompt - registry.fill(HIST("hGenNonPromptRandom"), ptCharmHad, numPvContributors, rapCharmHad, cosThetaStar, ptBhadMother, areDausInAcc, resoChannelLc, charge); + if (!isPartRecoDstar) { + registry.fill(HIST("hGenNonPromptRandom"), ptCharmHad, numPvContributors, rapCharmHad, cosThetaStar, ptBhadMother, areDausInAcc, resoChannelLc, charge); + } else { + registry.fill(HIST("hGenPartRecoNonPromptRandom"), ptCharmHad, numPvContributors, rapCharmHad, cosThetaStar, ptBhadMother, areDausInAcc, resoChannelLc, charge); + } } } } @@ -1037,8 +1086,9 @@ struct TaskPolarisationCharmHadrons { bool partRecoDstar{false}; if constexpr (doMc) { if constexpr (channel == charm_polarisation::DecayChannel::DstarToDzeroPi) { - partRecoDstar = TESTBIT(std::abs(candidate.flagMcMatchRec()), aod::hf_cand_dstar::DecayType::DstarToD0PiPi0); - if (!TESTBIT(std::abs(candidate.flagMcMatchRec()), aod::hf_cand_dstar::DecayType::DstarToD0Pi) && (!partRecoDstar || !activatePartRecoDstar)) { // this candidate is not signal and not partially reconstructed signal, skip + partRecoDstar = TESTBIT(std::abs(candidate.flagMcMatchRec()), aod::hf_cand_dstar::DecayType::DstarToD0PiPi0) && TESTBIT(std::abs(candidate.flagMcMatchRecD0()), aod::hf_cand_dstar::DecayType::D0ToPiKPi0); + bool signalDstar = TESTBIT(std::abs(candidate.flagMcMatchRec()), aod::hf_cand_dstar::DecayType::DstarToD0Pi) && TESTBIT(std::abs(candidate.flagMcMatchRecD0()), aod::hf_cand_dstar::DecayType::D0ToPiK); + if (!signalDstar && (!partRecoDstar || !activatePartRecoDstar)) { // this candidate is not signal and not partially reconstructed signal, skip return isCandidateInSignalRegion; } origin = candidate.originMcRec(); @@ -1555,8 +1605,12 @@ struct TaskPolarisationCharmHadrons { bool areDauInAcc{true}; int8_t resoChannelLc = -1; int8_t charge = -99; + bool partRecoDstar{false}; if constexpr (channel == charm_polarisation::DecayChannel::DstarToDzeroPi) { - if (!TESTBIT(std::abs(mcParticle.flagMcMatchGen()), aod::hf_cand_dstar::DecayType::DstarToD0Pi)) { // this particle is not signal, skip + partRecoDstar = TESTBIT(std::abs(mcParticle.flagMcMatchGen()), aod::hf_cand_dstar::DecayType::DstarToD0PiPi0) && TESTBIT(std::abs(mcParticle.flagMcMatchGenD0()), aod::hf_cand_dstar::DecayType::D0ToPiKPi0); + bool signalDstar = TESTBIT(std::abs(mcParticle.flagMcMatchGen()), aod::hf_cand_dstar::DecayType::DstarToD0Pi) && TESTBIT(std::abs(mcParticle.flagMcMatchGenD0()), aod::hf_cand_dstar::DecayType::D0ToPiK); + + if (!signalDstar && (!activatePartRecoDstar || !partRecoDstar)) { // this particle is not signal and not partially reconstructed signal, skip return; } origin = mcParticle.originMcGen(); @@ -1645,22 +1699,22 @@ struct TaskPolarisationCharmHadrons { if (activateTHnSparseCosThStarHelicity) { ROOT::Math::XYZVector helicityVec = fourVecMother.Vect(); float cosThetaStarHelicity = helicityVec.Dot(threeVecDauCM) / std::sqrt(threeVecDauCM.Mag2()) / std::sqrt(helicityVec.Mag2()); - fillGenHistos(ptCharmHad, numPvContributors, rapidity, cosThetaStarHelicity, origin, ptBhadMother, areDauInAcc, resoChannelLc, charge); + fillGenHistos(ptCharmHad, numPvContributors, rapidity, cosThetaStarHelicity, origin, ptBhadMother, areDauInAcc, resoChannelLc, charge, partRecoDstar); } if (activateTHnSparseCosThStarProduction) { ROOT::Math::XYZVector normalVec = ROOT::Math::XYZVector(pyCharmHad, -pxCharmHad, 0.f); float cosThetaStarProduction = normalVec.Dot(threeVecDauCM) / std::sqrt(threeVecDauCM.Mag2()) / std::sqrt(normalVec.Mag2()); - fillGenHistos(ptCharmHad, numPvContributors, rapidity, cosThetaStarProduction, origin, ptBhadMother, areDauInAcc, resoChannelLc, charge); + fillGenHistos(ptCharmHad, numPvContributors, rapidity, cosThetaStarProduction, origin, ptBhadMother, areDauInAcc, resoChannelLc, charge, partRecoDstar); } if (activateTHnSparseCosThStarBeam) { ROOT::Math::XYZVector beamVec = ROOT::Math::XYZVector(0.f, 0.f, 1.f); float cosThetaStarBeam = beamVec.Dot(threeVecDauCM) / std::sqrt(threeVecDauCM.Mag2()); - fillGenHistos(ptCharmHad, numPvContributors, rapidity, cosThetaStarBeam, origin, ptBhadMother, areDauInAcc, resoChannelLc, charge); + fillGenHistos(ptCharmHad, numPvContributors, rapidity, cosThetaStarBeam, origin, ptBhadMother, areDauInAcc, resoChannelLc, charge, partRecoDstar); } if (activateTHnSparseCosThStarRandom) { ROOT::Math::XYZVector randomVec = ROOT::Math::XYZVector(std::sin(thetaRandom) * std::cos(phiRandom), std::sin(thetaRandom) * std::sin(phiRandom), std::cos(thetaRandom)); float cosThetaStarRandom = randomVec.Dot(threeVecDauCM) / std::sqrt(threeVecDauCM.Mag2()); - fillGenHistos(ptCharmHad, numPvContributors, rapidity, cosThetaStarRandom, origin, ptBhadMother, areDauInAcc, resoChannelLc, charge); + fillGenHistos(ptCharmHad, numPvContributors, rapidity, cosThetaStarRandom, origin, ptBhadMother, areDauInAcc, resoChannelLc, charge, partRecoDstar); } } diff --git a/PWGHF/DataModel/CandidateReconstructionTables.h b/PWGHF/DataModel/CandidateReconstructionTables.h index 13ba118a6b8..7ee144ca397 100644 --- a/PWGHF/DataModel/CandidateReconstructionTables.h +++ b/PWGHF/DataModel/CandidateReconstructionTables.h @@ -2295,6 +2295,8 @@ DECLARE_SOA_DYNAMIC_COLUMN(PVecSoftPi, pVecSoftPi, [](float px, float py, float // MC matching result: DECLARE_SOA_COLUMN(FlagMcMatchRec, flagMcMatchRec, int8_t); //! reconstruction level DECLARE_SOA_COLUMN(FlagMcMatchGen, flagMcMatchGen, int8_t); //! generator level +DECLARE_SOA_COLUMN(FlagMcMatchRecD0, flagMcMatchRecD0, int8_t); //! reconstruction level +DECLARE_SOA_COLUMN(FlagMcMatchGenD0, flagMcMatchGenD0, int8_t); //! generator level DECLARE_SOA_COLUMN(OriginMcRec, originMcRec, int8_t); //! particle origin, reconstruction level DECLARE_SOA_COLUMN(OriginMcGen, originMcGen, int8_t); //! particle origin, generator level @@ -2417,6 +2419,7 @@ using HfCandDstar = HfCandDstars::iterator; // table with results of reconstruction level MC matching DECLARE_SOA_TABLE(HfCandDstarMcRec, "AOD", "HFCANDDSTRMCREC", hf_cand_dstar::FlagMcMatchRec, + hf_cand_dstar::FlagMcMatchRecD0, hf_cand_dstar::OriginMcRec, hf_cand::PtBhadMotherPart, hf_cand::PdgBhadMotherPart, @@ -2426,6 +2429,7 @@ DECLARE_SOA_TABLE(HfCandDstarMcRec, "AOD", "HFCANDDSTRMCREC", // table with results of generator level MC matching DECLARE_SOA_TABLE(HfCandDstarMcGen, "AOD", "HFCANDDSTRMCGEN", hf_cand_dstar::FlagMcMatchGen, + hf_cand_dstar::FlagMcMatchGenD0, hf_cand_dstar::OriginMcGen, hf_cand::IdxBhadMotherPart); diff --git a/PWGHF/TableProducer/candidateCreatorDstar.cxx b/PWGHF/TableProducer/candidateCreatorDstar.cxx index 2dace2da747..13c72455fbf 100644 --- a/PWGHF/TableProducer/candidateCreatorDstar.cxx +++ b/PWGHF/TableProducer/candidateCreatorDstar.cxx @@ -501,8 +501,6 @@ struct HfCandidateCreatorDstar { struct HfCandidateCreatorDstarExpressions { Spawns rowsCandidateD0; Spawns rowsCandidateDstar; - Produces rowsMcMatchRecD0; - Produces rowsMcMatchGenD0; Produces rowsMcMatchRecDstar; Produces rowsMcMatchGenDstar; @@ -557,7 +555,7 @@ struct HfCandidateCreatorDstarExpressions { int indexRecDstar = -1, indexRecD0 = -1; int8_t signDstar = 0, signD0 = 0; int8_t flagDstar = 0, flagD0 = 0; - int8_t originDstar = 0, originD0 = 0; + int8_t originDstar = 0; int8_t nKinkedTracksDstar = 0, nKinkedTracksD0 = 0; int8_t nInteractionsWithMaterialDstar = 0, nInteractionsWithMaterialD0 = 0; @@ -566,7 +564,6 @@ struct HfCandidateCreatorDstarExpressions { flagDstar = 0; flagD0 = 0; originDstar = 0; - originD0 = 0; std::vector idxBhadMothers{}; auto indexDstar = rowCandidateDstar.globalIndex(); @@ -589,7 +586,7 @@ struct HfCandidateCreatorDstarExpressions { } } if (fromBkg) { - rowsMcMatchRecDstar(flagDstar, originDstar, -1.f, 0, 0, 0); + rowsMcMatchRecDstar(flagDstar, flagD0, originDstar, -1.f, 0, 0, 0); continue; } } @@ -680,17 +677,12 @@ struct HfCandidateCreatorDstarExpressions { auto particleDstar = mcParticles.iteratorAt(indexRecDstar); originDstar = RecoDecay::getCharmHadronOrigin(mcParticles, particleDstar, false, &idxBhadMothers); } - if (flagD0 != 0) { - auto particleD0 = mcParticles.iteratorAt(indexRecD0); - originD0 = RecoDecay::getCharmHadronOrigin(mcParticles, particleD0); - } if (originDstar == RecoDecay::OriginType::NonPrompt) { auto bHadMother = mcParticles.rawIteratorAt(idxBhadMothers[0]); - rowsMcMatchRecDstar(flagDstar, originDstar, bHadMother.pt(), bHadMother.pdgCode(), nKinkedTracksDstar, nInteractionsWithMaterialDstar); + rowsMcMatchRecDstar(flagDstar, flagD0, originDstar, bHadMother.pt(), bHadMother.pdgCode(), nKinkedTracksDstar, nInteractionsWithMaterialDstar); } else { - rowsMcMatchRecDstar(flagDstar, originDstar, -1.f, 0, nKinkedTracksDstar, nInteractionsWithMaterialDstar); + rowsMcMatchRecDstar(flagDstar, flagD0, originDstar, -1.f, 0, nKinkedTracksDstar, nInteractionsWithMaterialDstar); } - rowsMcMatchRecD0(flagD0, originD0, -1.f, 0, nKinkedTracksD0, nInteractionsWithMaterialD0); } for (const auto& mcCollision : mcCollisions) { @@ -715,8 +707,7 @@ struct HfCandidateCreatorDstarExpressions { if (rejectionMask != 0) { // at least one event selection not satisfied --> reject all particles from this collision for (unsigned int i = 0; i < mcParticlesPerMcColl.size(); ++i) { - rowsMcMatchGenDstar(0, 0, -1); - rowsMcMatchGenD0(0, 0, -1); + rowsMcMatchGenDstar(0, 0, 0, -1); } continue; } @@ -726,38 +717,36 @@ struct HfCandidateCreatorDstarExpressions { flagDstar = 0; flagD0 = 0; originDstar = 0; - originD0 = 0; std::vector idxBhadMothers{}; // Reject particles from background events if (particle.fromBackgroundEvent() && rejectBackground) { - rowsMcMatchGenDstar(flagDstar, originDstar, -1); - rowsMcMatchGenD0(flagD0, originD0, -1); + rowsMcMatchGenDstar(flagDstar, flagD0, originDstar, -1); continue; } // D*± → D0(bar) π± if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kDStar, std::array{+kPiPlus, +kPiPlus, -kKPlus}, true, &signDstar, 2)) { flagDstar = signDstar * (BIT(aod::hf_cand_dstar::DecayType::DstarToD0Pi)); + } else if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kDStar, std::array{+kPiPlus, +kPiPlus, -kKPlus, +kPi0}, false, &signDstar, 2) || RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kDStar, std::array{-kPiPlus, -kPiPlus, +kKPlus, +kPi0}, false, &signDstar, 2)) { + flagDstar = signDstar * (BIT(aod::hf_cand_dstar::DecayType::DstarToD0PiPi0)); } // D0(bar) → π± K∓ if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kD0, std::array{+kPiPlus, -kKPlus}, true, &signD0)) { flagD0 = signD0 * (BIT(aod::hf_cand_dstar::DecayType::D0ToPiK)); + } else if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kD0, std::array{+kPiPlus, -kKPlus, +kPi0}, false, &signD0) || RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kD0, std::array{-kPiPlus, +kKPlus, +kPi0}, false, &signD0)) { + flagD0 = signD0 * (BIT(aod::hf_cand_dstar::DecayType::D0ToPiKPi0)); } // check wether the particle is non-promt (from a B0 hadron) if (flagDstar != 0) { originDstar = RecoDecay::getCharmHadronOrigin(mcParticles, particle, false, &idxBhadMothers); } - if (flagD0 != 0) { - originD0 = RecoDecay::getCharmHadronOrigin(mcParticles, particle); - } if (originDstar == RecoDecay::OriginType::NonPrompt) { - rowsMcMatchGenDstar(flagDstar, originDstar, idxBhadMothers[0]); + rowsMcMatchGenDstar(flagDstar, flagD0, originDstar, idxBhadMothers[0]); } else { - rowsMcMatchGenDstar(flagDstar, originDstar, -1); + rowsMcMatchGenDstar(flagDstar, flagD0, originDstar, -1); } - rowsMcMatchGenD0(flagD0, originD0, -1.); } } } From 1c7f8d7af1f72e8264fb375c93efab8acfaefe9a Mon Sep 17 00:00:00 2001 From: Lars <146946151+ljoergen@users.noreply.github.com> Date: Thu, 10 Apr 2025 12:35:40 +0200 Subject: [PATCH 0957/1650] [PWGLF] angularCorrelationsInJets.cxx: fixed QC histogram availability (#10805) --- PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx b/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx index bf52799e499..10a8701fd83 100644 --- a/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx +++ b/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx @@ -85,26 +85,16 @@ struct AngularCorrelationsInJets { Configurable minJetPt{"minJetPt", 10.0, "minimum total pT to accept jet"}; // Proton Cuts - Configurable protonDCAxyYield{"protonDCAxyYield", 0.05, "[proton] DCAxy cut for yield"}; - Configurable protonDCAzYield{"protonDCAzYield", 0.05, "[proton] DCAz cut for yield"}; Configurable protonDCAxyCF{"protonDCAxyCF", 0.05, "[proton] DCAxy cut for CF"}; Configurable protonDCAzCF{"protonDCAzCF", 0.02, "[proton] DCAz cut for CF"}; Configurable protonTPCTOFpT{"protonTPCTOFpT", 0.7, "[proton] pT for switch in TPC/TPC+TOF nsigma"}; - Configurable protonTPCnsigmaLowPtYield{"protonTPCnsigmaLowPtYield", 4.0, "[proton] max TPC nsigma with low pT for yield"}; - Configurable protonTPCnsigmaHighPtYield{"protonTPCnsigmaHighPtYield", 4.0, "[proton] max TPC nsigma with high pT for yield"}; - Configurable protonTOFnsigmaHighPtYield{"protonTOFnsigmaHighPtYield", 4.0, "[proton] max TOF nsigma with high pT yield"}; Configurable protonTPCnsigma{"protonTPCnsigma", 4.0, "[proton] max TPC nsigma for pt > 0/1.5/3.0 GeV"}; Configurable protonTOFnsigma{"protonTOFnsigma", 3.0, "[proton] max TOF nsigma for pt > 0/1.5/3.0 GeV"}; // Antiproton Cuts - Configurable antiprotonDCAxyYield{"antiprotonDCAxyYield", 0.05, "[antiproton] DCAxy cut for yield"}; - Configurable antiprotonDCAzYield{"antiprotonDCAzYield", 0.05, "[antiproton] DCAz cut for yield"}; Configurable antiprotonDCAxyCF{"antiprotonDCAxyCF", 0.05, "[antiproton] DCAxy cut for CF"}; Configurable antiprotonDCAzCF{"antiprotonDCAzCF", 0.02, "[antiproton] DCAz cut for CF"}; Configurable antiprotonTPCTOFpT{"antiprotonTPCTOFpT", 0.7, "[antiproton] pT for switch in TPC/TPC+TOF nsigma"}; - Configurable antiprotonTPCnsigmaLowPtYield{"antiprotonTPCnsigmaLowPtYield", 4.0, "[antiproton] max TPC nsigma with low pT for yield"}; - Configurable antiprotonTPCnsigmaHighPtYield{"antiprotonTPCnsigmaHighPtYield", 4.0, "[antiproton] max TPC nsigma with high pT for yield"}; - Configurable antiprotonTOFnsigmaHighPtYield{"antiprotonTOFnsigmaHighPtYield", 4.0, "[antiproton] min TOF nsigma with high pT for yield"}; Configurable antiprotonTPCnsigma{"antiprotonTPCnsigma", 4.0, "[antiproton] max TPC nsigma for pt > 0/1.5/3.0 GeV"}; Configurable antiprotonTOFnsigma{"antiprotonTOFnsigma", 3.0, "[antiproton] max TOF nsigma for pt > 0/1.5/3.0 GeV"}; @@ -1000,7 +990,7 @@ struct AngularCorrelationsInJets { registryData.fill(HIST("trackProtocol"), 1); // # tracks selected for jet reconstruction double mass = 0.139; - if (track.tpcNClsFindable() != 0) { + if (outputQC && (track.tpcNClsFindable() != 0)) { registryQC.fill(HIST("ratioCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows() / track.tpcNClsFindable()); } @@ -1075,7 +1065,7 @@ struct AngularCorrelationsInJets { jets.clear(); for (const auto& track : tracks) { - if (track.tpcNClsFindable() != 0) { + if (outputQC && (track.tpcNClsFindable() != 0)) { registryQC.fill(HIST("ratioCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows() / track.tpcNClsFindable()); } registryQC.fill(HIST("ptFullEvent"), track.pt()); From dbd1911b2840059aaa81ccf56cb50dec6a81ca57 Mon Sep 17 00:00:00 2001 From: Jesper Gumprecht <113693781+jesgum@users.noreply.github.com> Date: Thu, 10 Apr 2025 13:58:10 +0200 Subject: [PATCH 0958/1650] [ALICE3] Additional QA histograms to multicharm task (#10795) --- ALICE3/TableProducer/OTF/onTheFlyTracker.cxx | 3 ++ ALICE3/TableProducer/alice3-multicharm.cxx | 29 +++++++++++++++++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx b/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx index 832a626c622..9fa7920d2ac 100644 --- a/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx +++ b/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx @@ -323,6 +323,7 @@ struct OnTheFlyTracker { histos.add("h2dVerticesVsContributors", "h2dVerticesVsContributors", kTH2F, {axes.axisMultiplicity, axes.axisNVertices}); histos.add("hRecoVsSimMultiplicity", "hRecoVsSimMultiplicity", kTH2F, {axes.axisMultiplicity, axes.axisMultiplicity}); histos.add("h2dDCAxy", "h2dDCAxy", kTH2F, {axes.axisMomentum, axes.axisDCA}); + histos.add("h2dDCAz", "h2dDCAz", kTH2F, {axes.axisMomentum, axes.axisDCA}); histos.add("hSimTrackX", "hSimTrackX", kTH1F, {axes.axisX}); histos.add("hRecoTrackX", "hRecoTrackX", kTH1F, {axes.axisX}); @@ -1042,6 +1043,7 @@ struct OnTheFlyTracker { } if (doExtraQA && (!extraQAwithoutDecayDaughters || (extraQAwithoutDecayDaughters && !trackParCov.isDecayDau))) { histos.fill(HIST("h2dDCAxy"), trackParametrization.getPt(), dcaXY * 1e+4); // in microns, please + histos.fill(HIST("h2dDCAz"), trackParametrization.getPt(), dcaZ * 1e+4); // in microns, please histos.fill(HIST("hTrackXatDCA"), trackParametrization.getX()); } if (cascadeDecaySettings.doXiQA) { @@ -1107,6 +1109,7 @@ struct OnTheFlyTracker { } if (doExtraQA && (!extraQAwithoutDecayDaughters || (extraQAwithoutDecayDaughters && !trackParCov.isDecayDau))) { histos.fill(HIST("h2dDCAxy"), trackParametrization.getPt(), dcaXY * 1e+4); // in microns, please + histos.fill(HIST("h2dDCAz"), trackParametrization.getPt(), dcaZ * 1e+4); // in microns, please histos.fill(HIST("hTrackXatDCA"), trackParametrization.getX()); } tracksDCA(dcaXY, dcaZ); diff --git a/ALICE3/TableProducer/alice3-multicharm.cxx b/ALICE3/TableProducer/alice3-multicharm.cxx index 661deec3c29..15e45193187 100644 --- a/ALICE3/TableProducer/alice3-multicharm.cxx +++ b/ALICE3/TableProducer/alice3-multicharm.cxx @@ -94,7 +94,7 @@ struct alice3multicharm { Configurable minPiCPt{"minPiCPt", 0.15, "Minimum pT for XiC pions"}; Configurable minPiCCPt{"minPiCCPt", 0.3, "Minimum pT for XiCC pions"}; - Configurable minMultiplicity{"minMultiplicity", 0, "Minimum multiplicity"}; + Configurable minNTracks{"minNTracks", -1, "Minimum number of tracks"}; Configurable minXiCRadius{"minXiCRadius", 0.001, "Minimum R2D for XiC decay (cm)"}; Configurable massWindowXi{"massWindowXi", 0.015, "Mass window around Xi peak"}; @@ -108,6 +108,7 @@ struct alice3multicharm { ConfigurableAxis axisXiCMass{"axisXiCMass", {200, 2.368f, 2.568f}, "XiC Inv Mass (GeV/c^{2})"}; ConfigurableAxis axisXiCCMass{"axisXiCCMass", {200, 3.521f, 3.721f}, "XiCC Inv Mass (GeV/c^{2})"}; + ConfigurableAxis axisDCAXi{"axisDCAXi", {200, 0, 200}, "DCA (mum)"}; ConfigurableAxis axisDCAXiCDaughters{"axisDCAXiCDaughters", {200, 0, 100}, "DCA (mum)"}; ConfigurableAxis axisDCAXiCCDaughters{"axisDCAXiCCDaughters", {200, 0, 100}, "DCA (mum)"}; @@ -390,6 +391,10 @@ struct alice3multicharm { histos.add("hDCAXiCDaughters", "hDCAXiCDaughters", kTH1D, {axisDCAXiCDaughters}); histos.add("hDCAXiCCDaughters", "hDCAXiCCDaughters", kTH1D, {axisDCAXiCCDaughters}); + histos.add("hDCAXi", "hDCAXi", kTH1D, {axisDCAXi}); + histos.add("hPi1cPt", "hPi1cPt", kTH1D, {axisPt}); + histos.add("hPi2cPt", "hPi2cPt", kTH1D, {axisPt}); + histos.add("hPiccPt", "hPiccPt", kTH1D, {axisPt}); // These histograms bookkeep the exact number of combinations attempted // CombinationsXiC: triplets Xi-pi-pi considered per Xi @@ -397,6 +402,8 @@ struct alice3multicharm { histos.add("hCombinationsXiC", "hCombinationsXiC", kTH1D, {axisNConsidered}); histos.add("hCombinationsXiCC", "hCombinationsXiCC", kTH1D, {axisNConsidered}); histos.add("hNCollisions", "hNCollisions", kTH1D, {{2, 0.5, 2.5}}); + histos.add("hNTracks", "hNTracks", kTH1D, {{500, 0, 5000}}); + if (doDCAplots) { histos.add("h2dDCAxyVsPtXiFromXiC", "h2dDCAxyVsPtXiFromXiC", kTH2D, {axisPt, axisDCA}); histos.add("h2dDCAxyVsPtPiFromXiC", "h2dDCAxyVsPtPiFromXiC", kTH2D, {axisPt, axisDCA}); @@ -421,7 +428,9 @@ struct alice3multicharm { void processFindXiCC(aod::Collision const& collision, alice3tracks const& tracks, aod::McParticles const&, aod::UpgradeCascades const& cascades) { histos.fill(HIST("hNCollisions"), 1); - if (tracks.size() < minMultiplicity) + histos.fill(HIST("hNTracks"), tracks.size()); + + if (tracks.size() < minNTracks) return; histos.fill(HIST("hNCollisions"), 2); @@ -463,6 +472,11 @@ struct alice3multicharm { if (!bitcheck(xi.decayMap(), kTrueXiFromXiC)) continue; + if (xi.dcaXY() < xiFromXiC_dcaXYconstant) + continue; + + histos.fill(HIST("hDCAXi"), xi.dcaXY() * 1e+4); + for (auto const& pi1c : tracksPiFromXiCgrouped) { if (mcSameMotherCheck && !checkSameMother(xi, pi1c)) continue; @@ -471,6 +485,8 @@ struct alice3multicharm { if (pi1c.pt() < minPiCPt) continue; + histos.fill(HIST("hPi1cPt"), pi1c.pt()); + // second pion from XiC decay for starts here for (auto const& pi2c : tracksPiFromXiCgrouped) { @@ -483,6 +499,8 @@ struct alice3multicharm { if (pi2c.pt() < minPiCPt) continue; + histos.fill(HIST("hPi2cPt"), pi2c.pt()); + // if I am here, it means this is a triplet to be considered for XiC vertexing. // will now attempt to build a three-body decay candidate with these three track rows. @@ -523,12 +541,15 @@ struct alice3multicharm { uint32_t nCombinationsCC = 0; for (auto const& picc : tracksPiFromXiCCgrouped) { + if (mcSameMotherCheck && !checkSameMotherExtra(xi, picc)) + continue; if (xiCand.posTrackId() == picc.globalIndex() || xiCand.negTrackId() == picc.globalIndex() || xiCand.bachTrackId() == picc.globalIndex()) continue; // avoid using any track that was already used if (picc.pt() < minPiCCPt) continue; - if (mcSameMotherCheck && !checkSameMotherExtra(xi, picc)) - continue; + + histos.fill(HIST("hPiccPt"), picc.pt()); + o2::track::TrackParCov piccTrack = getTrackParCov(picc); nCombinationsCC++; histos.fill(HIST("hCharmBuilding"), 2.0f); From 17112a3be899539d6dde5ab556fbe6a6125e2b86 Mon Sep 17 00:00:00 2001 From: Jaideep Tanwar <141036812+jtanwar2212@users.noreply.github.com> Date: Thu, 10 Apr 2025 22:02:16 +0530 Subject: [PATCH 0959/1650] [PWGLF] task to for nuclei (#10758) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Nuspex/CMakeLists.txt | 5 + PWGLF/Tasks/Nuspex/NucleitpcPbPb.cxx | 522 +++++++++++++++++++++++++++ 2 files changed, 527 insertions(+) create mode 100644 PWGLF/Tasks/Nuspex/NucleitpcPbPb.cxx diff --git a/PWGLF/Tasks/Nuspex/CMakeLists.txt b/PWGLF/Tasks/Nuspex/CMakeLists.txt index 8dcc27372a4..cc9e0599e7a 100644 --- a/PWGLF/Tasks/Nuspex/CMakeLists.txt +++ b/PWGLF/Tasks/Nuspex/CMakeLists.txt @@ -84,6 +84,11 @@ o2physics_add_dpl_workflow(spectra-tpc-tiny PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(nuclei-tpcspectra + SOURCES NucleitpcPbPb.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(spectra-tpc-tiny-pikapr SOURCES spectraTPCtinyPiKaPr.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore diff --git a/PWGLF/Tasks/Nuspex/NucleitpcPbPb.cxx b/PWGLF/Tasks/Nuspex/NucleitpcPbPb.cxx new file mode 100644 index 00000000000..b3e72ed23a5 --- /dev/null +++ b/PWGLF/Tasks/Nuspex/NucleitpcPbPb.cxx @@ -0,0 +1,522 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// \author jaideep tanwar +/// +#include +#include +#include +#include +#include +#include +#include +#include +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/ASoAHelpers.h" +#include "ReconstructionDataFormats/Track.h" +#include "Common/Core/RecoDecay.h" +#include "Common/Core/trackUtilities.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Centrality.h" +#include "DetectorsBase/Propagator.h" +#include "DataFormatsParameters/GRPObject.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "CCDB/BasicCCDBManager.h" +#include "CommonConstants/PhysicsConstants.h" +#include "Common/Core/PID/TPCPIDResponse.h" +#include "DataFormatsTPC/BetheBlochAleph.h" +#include "Common/DataModel/PIDResponse.h" +#include "TRandom3.h" +#include "Common/DataModel/CollisionAssociationTables.h" + +using namespace o2; +using namespace o2::track; +using namespace o2::framework; +using namespace o2::framework::expressions; + +using CollisionsFull = soa::Join; +/* +using CollisionsFullMC = soa::Join; +*/ +using TracksFull = soa::Join; +namespace +{ +static const int number_of_particles = 6; +static const std::vector particleNames{"pion", "proton", "deuteron", "triton", "helium3", "alpha"}; +static const std::vector antiparticleNames{"anti-pion", "anti-proton", "anti-deuteron", "anti-triton", "anti-helium3", "anti-alpha"}; +static const std::vector particlePdgCodes{211, 2212, o2::constants::physics::kDeuteron, o2::constants::physics::kTriton, o2::constants::physics::kHelium3, o2::constants::physics::kAlpha}; +static const std::vector particleMasses{o2::constants::physics::MassPionCharged, o2::constants::physics::MassProton, o2::constants::physics::MassDeuteron, o2::constants::physics::MassTriton, o2::constants::physics::MassHelium3, o2::constants::physics::MassAlpha}; +static const std::vector particleCharge{1, 1, 1, 1, 2, 2}; +const int no_BBparam = 6; +static const std::vector betheBlochParNames{"p0", "p1", "p2", "p3", "p4", "resolution"}; +// default bethbloch parameters +constexpr double betheBlochDefault[number_of_particles][no_BBparam]{ + {13.611469, 3.598765, -0.021138, 2.039562, 0.651040, 0.09}, // pion + {5.393020, 7.859534, 0.004048, 2.323197, 1.609307, 0.09}, // proton + {5.393020, 7.859534, 0.004048, 2.323197, 1.609307, 0.09}, // deuteron + {5.393020, 7.859534, 0.004048, 2.323197, 1.609307, 0.09}, // triton + {-126.557359, -0.858569, 1.111643, 1.210323, 2.656374, 0.09}, // helium3 + {-126.557359, -0.858569, 1.111643, 1.210323, 2.656374, 0.09}}; // alpha +const int no_trackcuts = 15; +static const std::vector trackPIDsettingsNames{"useBBparams", "minITSnCls", "minTPCnCls", "maxTPCchi2", "maxITSchi2", "minRigidity", "maxRigidity", "maxTPCnSigma", "TOFrequiredabove", "minTOFmass", "maxTOFmass", "minDcaToPvXY", "minDcaToPvZ", "minITSclsSize", "maxITSclsSize"}; +constexpr double trackPIDsettings[number_of_particles][no_trackcuts]{ + {0, 0, 60, 3.0, 100, 0.15, 1.2, 3.0, 1, 0, 100, 0., 0., 0., 1000}, + {1, 0, 60, 3.0, 100, 0.20, 4.0, 3.0, 1, 0, 100, 0., 0., 0., 1000}, + {1, 0, 60, 3.0, 100, 0.50, 5.0, 3.0, 1, 0, 100, 0., 0., 0., 1000}, + {1, 0, 60, 3.0, 100, 0.50, 5.0, 3.0, 1, 0, 100, 0., 0., 0., 1000}, + {1, 0, 60, 3.0, 100, 0.50, 5.0, 3.0, 1, 0, 100, 0., 0., 0., 1000}, + {1, 0, 60, 3.0, 100, 0.50, 5.0, 3.0, 1, 0, 100, 0., 0., 0., 1000}}; +struct Particle { + TString name; + int pdgCode, charge; + double mass, resolution; + std::vector betheParams; + bool active; + Particle(std::string name_, int pdgCode_, double mass_, int charge_, LabeledArray bethe) : name(name_), pdgCode(pdgCode_), charge(charge_), mass(mass_), active(false) + { + resolution = bethe.get(name, "resolution"); + betheParams.clear(); + for (unsigned int i = 0; i < 5; i++) + betheParams.push_back(bethe.get(name, i)); + } +}; // struct Particle +//---------------------------------------------------------------------------------------------------------------- +std::vector> hDeDx; +std::vector> hDeDxanti; +std::vector> hnsigma_pt; +std::vector> hnsigma_ptanti; +std::vector> hdcaXY_pt; +std::vector> hdcaXY_ptanti; +std::vector> hrapidity; +std::vector> hmass_pt; +std::vector> hmass_ptanti; +std::vector> hdelta_mass; +} // namespace +//---------------------------------------------------------------------------------------------------------------- +struct NucleitpcPbPb { + Preslice perCollision = aod::track_association::collisionId; + HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + Configurable cfgDebug{"cfgDebug", 1, "debug level"}; + Configurable cfgRigidityCorrection{"cfgRigidityCorrection", false, "apply rigidity correction"}; + Configurable cfgCutEta{"cfgCutEta", 0.8f, "Eta range for tracks"}; + Configurable centcut{"centcut", 80.0f, "centrality cut"}; + Configurable cfgUsePVcontributors{"cfgUsePVcontributors", true, "use tracks that are PV contibutors"}; + Configurable> cfgBetheBlochParams{"cfgBetheBlochParams", {betheBlochDefault[0], number_of_particles, no_BBparam, particleNames, betheBlochParNames}, "TPC Bethe-Bloch parameterisation for light nuclei"}; + Configurable> cfgTrackPIDsettings{"cfgTrackPIDsettings", {trackPIDsettings[0], number_of_particles, no_trackcuts, particleNames, trackPIDsettingsNames}, "track selection and PID criteria"}; + Configurable maxDcaXYFactor{"maxDcaXYFactor", 2.0f, "DCA xy factor"}; + // CCDB + Service ccdb; + Configurable bField{"bField", -999, "bz field, -999 is automatic"}; + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; + Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; + Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; + Configurable pidPath{"pidPath", "", "Path to the PID response object"}; + //-------------------------------------------------------------------------------------------------------------------- + std::vector primaryParticles; + std::vector primVtx, cents; + bool collHasCandidate, collPassedEvSel; + int mRunNumber, occupancy; + float dBz; + TRandom3 rand; + double momn; + //---------------------------------------------------------------------------------------------------------------------- + //---------------------------------------------------------------------------------------------------------------- + void init(InitContext const&) + { + mRunNumber = 0; + dBz = 0; + rand.SetSeed(0); + ccdb->setURL(ccdbUrl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setFatalWhenNull(false); + for (int i = 0; i < number_of_particles; i++) { // create primaryparticles + primaryParticles.push_back(Particle(particleNames.at(i), particlePdgCodes.at(i), particleMasses.at(i), particleCharge.at(i), cfgBetheBlochParams)); + } + std::vector ptBinning = {0.1, 0.5, 1.0, 1.5, 2.0, 2.4, 3.2, 4., 5., 6., 8., 10., 12., 14.}; + std::vector etaBinning = {-1.0, -0.9, -0.8, -0.7, -0.6, -0.5, -0.4, -0.3, -0.2, -0.1, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0}; + // define histogram axes + const AxisSpec axisMagField{10, -10., 10., "magnetic field"}; + const AxisSpec axisNev{3, 0., 5., "Number of events"}; + const AxisSpec axisRigidity{4000, -10., 10., "#it{p}^{TPC}/#it{z}"}; + const AxisSpec axisdEdx{30000, 0, 3000, "d#it{E}/d#it{x}"}; + const AxisSpec axisCent{100, 0, 100, "centrality"}; + const AxisSpec axisVtxZ{100, -20, 20, "z"}; + const AxisSpec axisDCAZ{100, -10, 10, "z"}; + // const AxisSpec axiseta{100, -1, 1, "eta"}; + const AxisSpec axisrapidity{100, -2, 2, "rapidity"}; + AxisSpec axiseta = {etaBinning, "#eta"}; + AxisSpec axismass = {100, -0.5, 15, "mass^{2}"}; + AxisSpec axisdelta_mass = {100, -6, 6, "#delta mass^{2}"}; + AxisSpec ptAxis = {ptBinning, "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec dcaXY = {100, -2, 2, "dcaXY"}; + AxisSpec nsigmaAxis = {160, -20, 20, "n#sigma_{#pi^{+}}"}; + // create histograms + histos.add("histMagField", "histMagField", kTH1F, {axisMagField}); + histos.add("histNev", "histNev", kTH1F, {axisNev}); + histos.add("histVtxZ", "histVtxZ", kTH1F, {axisVtxZ}); + histos.add("histCentFT0A", "histCentFT0A", kTH1F, {axisCent}); + histos.add("histCentFT0C", "histCentFT0C", kTH1F, {axisCent}); + histos.add("histCentFTOC_cut", "histCentFTOC_cut", kTH1F, {axisCent}); + histos.add("histCentFT0M", "histCentFT0M", kTH1F, {axisCent}); + histos.add("histeta", "histeta", kTH1F, {axiseta}); + histos.add("Tof_signal", "Tof_signal", kTH2F, {axisRigidity, {4000, 0.2, 1.2, "#beta"}}); + histos.add("histDcaZVsPtData_particle", "dcaZ vs Pt (particle)", HistType::kTH2F, {{1000, 0, 20}, {1000, -2.5, 2.5, "dca"}}); + histos.add("histDcaXYVsPtData_particle", "dcaXY vs Pt (particle)", HistType::kTH2F, {{1000, 0, 20}, {1000, -2.0, 2.0, "dca"}}); + histos.add("histDcaZVsPtData_antiparticle", "dcaZ vs Pt (antiparticle)", HistType::kTH2F, {{1000, 0, 20}, {1000, -2.5, 2.5, "dca"}}); + histos.add("histDcaXYVsPtData_antiparticle", "dcaXY vs Pt (antiparticle)", HistType::kTH2F, {{1000, 0, 20}, {1000, -2.0, 2.0, "dca"}}); + hDeDx.resize(2 * number_of_particles + 2); + hDeDxanti.resize(2 * number_of_particles + 2); + hnsigma_pt.resize(2 * number_of_particles + 2); + hnsigma_ptanti.resize(2 * number_of_particles + 2); + hdcaXY_pt.resize(2 * number_of_particles + 2); + hdcaXY_ptanti.resize(2 * number_of_particles + 2); + hrapidity.resize(2 * number_of_particles + 2); + hmass_pt.resize(2 * number_of_particles + 2); + hmass_ptanti.resize(2 * number_of_particles + 2); + hdelta_mass.resize(2 * number_of_particles + 2); + for (int i = 0; i <= number_of_particles; i++) { + TString histName = i < number_of_particles ? primaryParticles[i].name : "all"; + hDeDx[2 * i] = histos.add(Form("full/histdEdx_%s", histName.Data()), ";p_{TPC}/z (GeV/#it{c}); d#it{E}/d#it{x}", HistType::kTH2F, {axisRigidity, axisdEdx}); + hDeDx[2 * i + 1] = histos.add(Form("cuts/histdEdx_%s_Cuts", histName.Data()), ";p_{TPC}/z (GeV/#it{c}); d#it{E}/d#it{x}", HistType::kTH2F, {axisRigidity, axisdEdx}); + hDeDxanti[2 * i] = histos.add(Form("antifull/histdEdx_%s", histName.Data()), ";p_{TPC}/z (GeV/#it{c}); d#it{E}/d#it{x}", HistType::kTH2F, {axisRigidity, axisdEdx}); + hDeDxanti[2 * i + 1] = histos.add(Form("anticuts/histdEdx_%s_Cuts", histName.Data()), ";p_{TPC}/z (GeV/#it{c}); d#it{E}/d#it{x}", HistType::kTH2F, {axisRigidity, axisdEdx}); + } + for (int i = 0; i < number_of_particles; i++) { + TString histName = primaryParticles[i].name; + hnsigma_pt[2 * i] = histos.add(Form("histnsigma_pt/histnsigmaTPC_%s", histName.Data()), ";p_T{TPC} (GeV/#it{c}); TPCnsigma", HistType::kTH2F, {ptAxis, nsigmaAxis}); + hnsigma_ptanti[2 * i] = histos.add(Form("histnsigma_ptanti/histnsigmaTPC_%s", histName.Data()), ";p_T{TPC} (GeV/#it{c}); TPCnsigma", HistType::kTH2F, {ptAxis, nsigmaAxis}); + hdcaXY_pt[2 * i] = histos.add(Form("histdcaXY_pt/histdcaXY_%s", histName.Data()), ";p_T{TPC} (GeV/#it{c}); dcaXY", HistType::kTH2F, {ptAxis, dcaXY}); + hdcaXY_ptanti[2 * i] = histos.add(Form("histdcaXY_ptanti/histdcaXY_%s", histName.Data()), ";p_T{TPC} (GeV/#it{c}); dcaXY", HistType::kTH2F, {ptAxis, dcaXY}); + hmass_pt[2 * i] = histos.add(Form("histmass_pt/histmass_%s", histName.Data()), ";p_T{TPC} (GeV/#it{c}); mass^{2}", HistType::kTH2F, {ptAxis, axismass}); + hmass_ptanti[2 * i] = histos.add(Form("histmass_ptanti/histmass_%s", histName.Data()), ";p_T{TPC} (GeV/#it{c}); mass^{2}", HistType::kTH2F, {ptAxis, axismass}); + hrapidity[2 * i] = histos.add(Form("rapidity/histrapidity_%s", histName.Data()), "; rapidity", HistType::kTH1F, {axisrapidity}); + hdelta_mass[2 * i] = histos.add(Form("histdelta/histmass_%s", histName.Data()), ";p_T{TPC} (GeV/#it{c}); #Delta mass", HistType::kTH2F, {ptAxis, axisdelta_mass}); + } + } // completed void init bracket + //---------------------------------------------------------------------------------------------------------------- + void findprimaryParticles(aod::TrackAssoc const& tracksByColl, TracksFull const& tracks) + { + // track loop, store primary candidates in std::vector + for (const auto& trackId : tracksByColl) { + const auto& track = tracks.rawIteratorAt(trackId.trackId()); + /* + if (!track.isPVContributor()) + continue; + */ + filldedx(track, number_of_particles); + if (track.sign() > 0) { + histos.fill(HIST("histDcaZVsPtData_particle"), track.pt(), track.dcaZ()); + histos.fill(HIST("histDcaXYVsPtData_particle"), track.pt(), track.dcaXY()); + } + if (track.sign() < 0) { + histos.fill(HIST("histDcaZVsPtData_antiparticle"), track.pt(), track.dcaZ()); + histos.fill(HIST("histDcaXYVsPtData_antiparticle"), track.pt(), track.dcaXY()); + } + if (std::abs(track.eta()) > cfgCutEta) + continue; + histos.fill(HIST("histeta"), track.eta()); + for (size_t i = 0; i < primaryParticles.size(); i++) { + if (track.tpcNClsFound() < cfgTrackPIDsettings->get(i, "minTPCnCls")) + continue; + if (track.tpcChi2NCl() > cfgTrackPIDsettings->get(i, "maxTPCchi2")) + continue; + if (track.itsNCls() < cfgTrackPIDsettings->get(i, "minITSnCls")) + continue; + if (track.itsChi2NCl() > cfgTrackPIDsettings->get(i, "maxITSchi2")) + continue; + if (getMeanItsClsSize(track) < cfgTrackPIDsettings->get(i, "minITSclsSize")) + continue; + if (getMeanItsClsSize(track) > cfgTrackPIDsettings->get(i, "maxITSclsSize")) + continue; + if (i == 4 || i == 5) { + momn = 2 * track.pt(); + } else { + momn = track.pt(); + } + bool insideDCAxy = (std::abs(track.dcaXY()) <= (maxDcaXYFactor.value * (0.0105f + 0.0350f / pow(track.pt(), 1.1f)))); + if (!(insideDCAxy) || TMath::Abs(track.dcaZ()) > 2) + continue; + if (TMath::Abs(getRapidity(track, i)) > 0.5) + continue; + fillhsigma(track, i); + if (std::abs(getTPCnSigma(track, primaryParticles.at(i))) > cfgTrackPIDsettings->get(i, "maxTPCnSigma")) + continue; + filldedx(track, i); + fillhdcaXY(track, i); + fillhmass(track, i); + fillhrapidity(track, i); + fillhdelta_mass(track, i); + if (getRigidity(track) < cfgTrackPIDsettings->get(i, "minRigidity") || getRigidity(track) > cfgTrackPIDsettings->get(i, "maxRigidity")) + continue; + if (cfgTrackPIDsettings->get(i, "TOFrequiredabove") >= 0 && getRigidity(track) > cfgTrackPIDsettings->get(i, "TOFrequiredabove") && (track.mass() < cfgTrackPIDsettings->get(i, "minTOFmass") || track.mass() > cfgTrackPIDsettings->get(i, "maxTOFmass"))) + continue; + histos.fill(HIST("Tof_signal"), track.sign() * momn, track.beta()); + } + } // track loop + } + //---------------------------------------------------------------------------------------------------------------- + void processData(CollisionsFull const& collisions, TracksFull const& tracks, aod::BCsWithTimestamps const&, aod::TrackAssoc const& tracksColl) + { + for (const auto& collision : collisions) { + auto bc = collision.bc_as(); + initCCDB(bc); + initCollision(collision); + if (!collPassedEvSel) + continue; + const uint64_t collIdx = collision.globalIndex(); + auto tracksByColl = tracksColl.sliceBy(perCollision, collIdx); + findprimaryParticles(tracksByColl, tracks); + if (!collHasCandidate) + continue; + if (collision.centFT0C() > centcut) + continue; + } + } + PROCESS_SWITCH(NucleitpcPbPb, processData, "data analysis", true); + //---------------------------------------------------------------------------------------------------------------- + void initCCDB(aod::BCsWithTimestamps::iterator const& bc) + { + if (mRunNumber == bc.runNumber()) { + return; + } + auto run3grpTimestamp = bc.timestamp(); + dBz = 0; + o2::parameters::GRPObject* grpo = ccdb->getForTimeStamp(grpPath, run3grpTimestamp); + o2::parameters::GRPMagField* grpmag = 0x0; + if (grpo) { + o2::base::Propagator::initFieldFromGRP(grpo); + if (bField < -990) { + // Fetch magnetic field from ccdb for current collision + dBz = grpo->getNominalL3Field(); + LOG(info) << "Retrieved GRP for timestamp " << run3grpTimestamp << " with magnetic field of " << dBz << " kZG"; + } else { + dBz = bField; + } + } else { + grpmag = ccdb->getForTimeStamp(grpmagPath, run3grpTimestamp); + if (!grpmag) { + LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for timestamp " << run3grpTimestamp; + } + o2::base::Propagator::initFieldFromGRP(grpmag); + if (bField < -990) { + // Fetch magnetic field from ccdb for current collision + dBz = std::lround(5.f * grpmag->getL3Current() / 30000.f); + LOG(info) << "Retrieved GRP for timestamp " << run3grpTimestamp << " with magnetic field of " << dBz << " kZG"; + } else { + dBz = bField; + } + } + mRunNumber = bc.runNumber(); + } + //---------------------------------------------------------------------------------------------------------------- + template + void initCollision(const T& collision) + { + collHasCandidate = false; + histos.fill(HIST("histMagField"), dBz); + histos.fill(HIST("histNev"), 0.5); + collPassedEvSel = collision.sel8() && std::abs(collision.posZ()) < 10; + if (collision.sel8()) { + histos.fill(HIST("histNev"), 1.5); + if (std::abs(collision.posZ()) < 10.0000000000000000) { + histos.fill(HIST("histNev"), 2.5); + } + } + if (collPassedEvSel) { + histos.fill(HIST("histVtxZ"), collision.posZ()); + histos.fill(HIST("histCentFT0A"), collision.centFT0A()); + histos.fill(HIST("histCentFT0C"), collision.centFT0C()); + histos.fill(HIST("histCentFT0M"), collision.centFT0M()); + if (collision.centFT0C() < centcut) { + histos.fill(HIST("histCentFTOC_cut"), collision.centFT0C()); + } + } + occupancy = collision.trackOccupancyInTimeRange(); + primVtx.assign({collision.posX(), collision.posY(), collision.posZ()}); + cents.assign({collision.centFT0A(), collision.centFT0C(), collision.centFT0M()}); + } + //---------------------------------------------------------------------------------------------------------------- + template + void filldedx(T const& track, int species) + { + const float rigidity = getRigidity(track); + int idx = 2 * species; + if (species != 6) { + auto& hist = (track.sign() > 0) ? hDeDx[idx] : hDeDxanti[idx]; + hist->Fill(track.sign() * rigidity, track.tpcSignal()); + } else { + hDeDx[idx]->Fill(track.sign() * rigidity, track.tpcSignal()); + hDeDxanti[idx]->Fill(track.sign() * rigidity, track.tpcSignal()); + } + if (track.tpcNClsFound() < 100 || track.itsNCls() < 2) + return; + + auto& hist2 = (track.sign() > 0) ? hDeDx[idx + 1] : hDeDxanti[idx + 1]; + hist2->Fill(track.sign() * rigidity, track.tpcSignal()); + } + template + void fillhsigma(T const& track, int species) + { + if (track.tpcNClsFound() < 100 || track.itsNCls() < 2) + return; + int i = species; + const float tpcNsigma = getTPCnSigma(track, primaryParticles.at(i)); + double momn; + if (species == 4 || species == 5) { + momn = 2 * track.pt(); + } else { + momn = track.pt(); + } + if (track.sign() > 0) { + hnsigma_pt[2 * species]->Fill(momn, tpcNsigma); + } + if (track.sign() < 0) { + hnsigma_ptanti[2 * species]->Fill(momn, tpcNsigma); + } + } + template + void fillhdcaXY(T const& track, int species) + { + if (track.tpcNClsFound() < 100 || track.itsNCls() < 2) + return; + double momn; + if (species == 4 || species == 5) { + momn = 2 * track.pt(); + } else { + momn = track.pt(); + } + const float dcaXY = track.dcaXY(); + if (track.sign() > 0) { + hdcaXY_pt[2 * species]->Fill(momn, dcaXY); + } + if (track.sign() < 0) { + hdcaXY_ptanti[2 * species]->Fill(momn, dcaXY); + } + } + template + void fillhmass(T const& track, int species) + { + if (track.tpcNClsFound() < 100 || track.itsNCls() < 2) + return; + double mass; + if (species == 4 || species == 5) { + mass = 2 * track.mass(); + } else { + mass = track.mass(); + } + double momn; + if (species == 4 || species == 5) { + momn = 2 * track.pt(); + } else { + momn = track.pt(); + } + if (track.sign() > 0) { + hmass_pt[2 * species]->Fill(momn, mass * mass); + } + if (track.sign() < 0) { + hmass_ptanti[2 * species]->Fill(momn, mass * mass); + } + } + template + void fillhdelta_mass(T const& track, int species) + { + if (track.tpcNClsFound() < 100 || track.itsNCls() < 2) + return; + double mass; + if (species == 4 || species == 5) { + mass = 2 * track.mass(); + } else { + mass = track.mass(); + } + + double delta_mass = (mass - particleMasses[species]); + + hdelta_mass[2 * species]->Fill(track.pt() * particleCharge[species], delta_mass); + } + template + void fillhrapidity(T const& track, int species) + { + if (track.tpcNClsFound() < 100 || track.itsNCls() < 2) + return; + double rap = getRapidity(track, species); + hrapidity[2 * species]->Fill(rap); + } + //---------------------------------------------------------------------------------------------------------------- + template + float getTPCnSigma(T const& track, Particle const& particle) + { + const float rigidity = getRigidity(track); + if (!track.hasTPC()) + return -999; + if (particle.name == "pion" && cfgTrackPIDsettings->get("pion", "useBBparams") == 0) + return track.tpcNSigmaPi(); + if (particle.name == "proton" && cfgTrackPIDsettings->get("proton", "useBBparams") == 0) + return track.tpcNSigmaPr(); + if (particle.name == "deuteron" && cfgTrackPIDsettings->get("deuteron", "useBBparams") == 0) + return track.tpcNSigmaDe(); + if (particle.name == "triton" && cfgTrackPIDsettings->get("triton", "useBBparams") == 0) + return track.tpcNSigmaTr(); + if (particle.name == "helium3" && cfgTrackPIDsettings->get("helium3", "useBBparams") == 0) + return track.tpcNSigmaHe(); + if (particle.name == "alpha" && cfgTrackPIDsettings->get("alpha", "useBBparams") == 0) + return track.tpcNSigmaAl(); + double expBethe{tpc::BetheBlochAleph(static_cast(particle.charge * rigidity / particle.mass), particle.betheParams[0], particle.betheParams[1], particle.betheParams[2], particle.betheParams[3], particle.betheParams[4])}; + double expSigma{expBethe * particle.resolution}; + float sigmaTPC = static_cast((track.tpcSignal() - expBethe) / expSigma); + return sigmaTPC; + } + //---------------------------------------------------------------------------------------------------------------- + template + float getMeanItsClsSize(T const& track) + { + int sum = 0, n = 0; + for (int i = 0; i < 8; i++) { + sum += (track.itsClusterSizes() >> (4 * i) & 15); + if (track.itsClusterSizes() >> (4 * i) & 15) + n++; + } + return n > 0 ? static_cast(sum) / n : 0.f; + } + //---------------------------------------------------------------------------------------------------------------- + template + float getRigidity(T const& track) + { + if (!cfgRigidityCorrection) + return track.tpcInnerParam(); + bool hePID = track.pidForTracking() == o2::track::PID::Helium3 || track.pidForTracking() == o2::track::PID::Alpha; + return hePID ? track.tpcInnerParam() / 2 : track.tpcInnerParam(); + } + template + float getRapidity(T const& track, int species) + { + double momn; + TLorentzVector lorentzVector_particle; + if (species == 4 || species == 5) { + momn = 2 * track.pt(); + } else { + momn = track.pt(); + } + lorentzVector_particle.SetPtEtaPhiM(momn, track.eta(), track.phi(), particleMasses[species]); + return lorentzVector_particle.Rapidity(); + } +}; // end of the task here +//---------------------------------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------------------------------- +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc)}; +} From 7e78cc2f3db77aa2af7f1cc8f65035d3e227b72a Mon Sep 17 00:00:00 2001 From: Fabrizio Date: Fri, 11 Apr 2025 10:32:00 +0200 Subject: [PATCH 0960/1650] [PWGHF] Fix histo name in charm polarisation task (#10814) --- PWGHF/D2H/Tasks/taskCharmPolarisation.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskCharmPolarisation.cxx b/PWGHF/D2H/Tasks/taskCharmPolarisation.cxx index 14b920961df..43b75756959 100644 --- a/PWGHF/D2H/Tasks/taskCharmPolarisation.cxx +++ b/PWGHF/D2H/Tasks/taskCharmPolarisation.cxx @@ -549,8 +549,8 @@ struct TaskPolarisationCharmHadrons { } } if (activateTHnSparseCosThStarRandom) { - registry.add("hGenPartRecoPromptRandom", "THn for polarisation studies with cosThStar w.r.t. random axis -- gen prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisCosThetaStarRandom, thnAxisDausAcc, thnAxisResoChannelLc, thnAxisCharge}); - registry.add("hGenPartRecoNonPromptRandom", "THn for polarisation studies with cosThStar w.r.t. random axis -- gen non-prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisCosThetaStarRandom, thnAxisPtB, thnAxisDausAcc, thnAxisResoChannelLc, thnAxisCharge}); + registry.add("hGenPromptRandom", "THn for polarisation studies with cosThStar w.r.t. random axis -- gen prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisCosThetaStarRandom, thnAxisDausAcc, thnAxisResoChannelLc, thnAxisCharge}); + registry.add("hGenNonPromptRandom", "THn for polarisation studies with cosThStar w.r.t. random axis -- gen non-prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisCosThetaStarRandom, thnAxisPtB, thnAxisDausAcc, thnAxisResoChannelLc, thnAxisCharge}); if (activatePartRecoDstar && (doprocessDstarMc || doprocessDstarMcWithMl)) { registry.add("hGenPartRecoPromptRandom", "THn for polarisation studies with cosThStar w.r.t. random axis -- gen partly reco prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisCosThetaStarRandom, thnAxisDausAcc, thnAxisResoChannelLc, thnAxisCharge}); registry.add("hGenPartRecoNonPromptRandom", "THn for polarisation studies with cosThStar w.r.t. random axis -- gen partly reco non-prompt signal", HistType::kTHnSparseF, {thnAxisPt, thnAxisNumPvContributors, thnAxisY, thnAxisCosThetaStarRandom, thnAxisPtB, thnAxisDausAcc, thnAxisResoChannelLc, thnAxisCharge}); From d9ebbdf2a8a062994c87727f7842216b757fe743 Mon Sep 17 00:00:00 2001 From: AlexianL <123153896+AlexianL@users.noreply.github.com> Date: Fri, 11 Apr 2025 11:34:28 +0200 Subject: [PATCH 0961/1650] [PWGHF] taskFlow.cxx: change binning in histograms (#10796) --- PWGHF/HFC/Tasks/taskFlow.cxx | 228 +++++++++++++++++------------------ 1 file changed, 109 insertions(+), 119 deletions(-) diff --git a/PWGHF/HFC/Tasks/taskFlow.cxx b/PWGHF/HFC/Tasks/taskFlow.cxx index 6b54f6d8944..9050b5ac4f2 100644 --- a/PWGHF/HFC/Tasks/taskFlow.cxx +++ b/PWGHF/HFC/Tasks/taskFlow.cxx @@ -157,6 +157,7 @@ struct HfTaskFlow { ConfigurableAxis axisVertex{"axisVertex", {14, -7, 7}, "vertex axis for histograms"}; ConfigurableAxis axisDeltaPhi{"axisDeltaPhi", {72, -PIHalf, PIHalf * 3}, "delta phi axis for histograms"}; ConfigurableAxis axisDeltaEta{"axisDeltaEta", {48, -2.4, 2.4}, "delta eta axis for histograms"}; + ConfigurableAxis axisPt{"axisPt", {72, 0, 36}, "pt axis for histograms"}; ConfigurableAxis axisPtTrigger{"axisPtTrigger", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 8.0}, "pt trigger axis for histograms"}; ConfigurableAxis axisPtAssoc{"axisPtAssoc", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0}, "pt associated axis for histograms"}; ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 100.1}, "multiplicity axis for histograms"}; @@ -166,7 +167,7 @@ struct HfTaskFlow { // TODO: flow of HF will need to be done vs. invariant mass, in the signal and side-band regions // either 1) add invariant mass axis or 2) define several containers for different inv. mass regions // Note: don't forget to check inv. mass separately for D0 and D0bar candidate - ConfigurableAxis axisMass{"axisMass", {2, 1.7, 2.0}, "axis of invariant mass of HF candidates"}; + ConfigurableAxis axisMass{"axisMass", {120, 1.5848, 2.1848}, "axis of invariant mass of candidates"}; ConfigurableAxis binsMixingVertex{"binsMixingVertex", {14, -7, 7}, "vertex bins for event mixing"}; ConfigurableAxis binsMixingMultiplicity{"binsMixingMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 100.1}, "multiplicity bins for event mixing"}; @@ -177,14 +178,6 @@ struct HfTaskFlow { OutputObj mixedEvent{"mixedEvent"}; OutputObj sameEventHf{"sameEventHf"}; OutputObj mixedEventHf{"mixedEventHf"}; - // OutputObj sameTPCTPCChCh{"sameTPCTPCChCh"}; - // OutputObj mixedTPCTPCChCh{"mixedTPCTPCChCh"}; - // OutputObj sameTPCTPCHfCh{"sameTPCTPCHfCh"}; // I still keep only one Correlation Container for HF, whether is D0 or Lc - // OutputObj mixedTPCTPCHfCh{"mixedTPCTPCHfCh"}; // Because only one should be run at the same time - // OutputObj sameTPCMFTChCh{"sameTPCMFTChCh"}; - // OutputObj mixedTPCMFTChCh{"mixedTPCMFTChCh"}; - // OutputObj sameTPCMFTHfCh{"sameTPCMFTHfCh"}; // I still keep only one Correlation Container for HF, whether is D0 or Lc - // OutputObj mixedTPCMFTHfCh{"mixedTPCMFTHfCh"}; // Because only one should be run at the same time // Correlation containers used for Monte-Carlo // OutputObj sameTPCTPCChChMC{"sameTPCTPCChChMC"}; @@ -217,19 +210,20 @@ struct HfTaskFlow { // ========================= // DATA : event histograms for TPC-TPC h-h same event - registry.add("Data/TpcTpc/HadronHadron/SameEvent/hMultiplicity", "hMultiplicity", {HistType::kTH1F, {{500, 0, 500}}}); - registry.add("Data/TpcTpc/HadronHadron/SameEvent/hVtxZ", "hVtxZ", {HistType::kTH1F, {{400, -50, 50}}}); + registry.add("Data/TpcTpc/HadronHadron/SameEvent/hMultiplicity", "hMultiplicity", {HistType::kTH1F, {axisMultiplicity}}); + registry.add("Data/TpcTpc/HadronHadron/SameEvent/hVtxZ", "hVtxZ", {HistType::kTH1F, {axisVertex}}); registry.add("Data/TpcTpc/HadronHadron/SameEvent/hEventCountSame", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); // DATA : associated particles histograms for TPC-TPC h-h same event - registry.add("Data/TpcTpc/HadronHadron/SameEvent/hPt", "pT", {HistType::kTH1F, {{100, 0, 10, "p_{T}"}}}); - registry.add("Data/TpcTpc/HadronHadron/SameEvent/hEta", "eta", {HistType::kTH1F, {{100, -4, 4, "#eta"}}}); - registry.add("Data/TpcTpc/HadronHadron/SameEvent/hPhi", "phi", {HistType::kTH1F, {{100, 0, TwoPI, "#varphi"}}}); - registry.add("Data/TpcTpc/HadronHadron/SameEvent/hYields", "multiplicity vs pT vs eta", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {40, 0, 20, "p_{T}"}, {100, -2, 2, "#eta"}}}); - registry.add("Data/TpcTpc/HadronHadron/SameEvent/hEtaPhi", "multiplicity vs eta vs phi", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {100, -2, 2, "#eta"}, {200, 0, TwoPI, "#varphi"}}}); + registry.add("Data/TpcTpc/HadronHadron/SameEvent/hPt", "pT", {HistType::kTH1F, {axisPt}}); + registry.add("Data/TpcTpc/HadronHadron/SameEvent/hEta", "eta", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("Data/TpcTpc/HadronHadron/SameEvent/hPhi", "phi", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("Data/TpcTpc/HadronHadron/SameEvent/hYields", "multiplicity vs pT vs eta", {HistType::kTH3F, {axisMultiplicity, axisPt, axisDeltaEta}}); + registry.add("Data/TpcTpc/HadronHadron/SameEvent/hEtaPhi", "multiplicity vs eta vs phi", {HistType::kTH3F, {axisMultiplicity, axisDeltaEta, axisDeltaPhi}}); + // registry.add("Data/TpcTpc/HadronHadron/SameEvent/hNtracks", "hNtracks", {HistType::kTH1F, {{500, 0, 500}}}); // Katarina had this : - registry.add("Data/TpcTpc/HadronHadron/SameEvent/hVzEta", "eta vs. Vz", {HistType::kTH2F, {{100, -4, 4, "#eta"}, {20, -10, 10, "Vz"}}}); + registry.add("Data/TpcTpc/HadronHadron/SameEvent/hVzEta", "eta vs. Vz", {HistType::kTH2F, {axisDeltaEta, axisVertex}}); // DATA : event mixing histograms for TPC-TPC h-h mixed event registry.add("Data/TpcTpc/HadronHadron/MixedEvent/hEventCountMixing", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); @@ -239,26 +233,26 @@ struct HfTaskFlow { // ========================= // DATA : event histograms for TPC-TPC HF-h same event - registry.add("Data/TpcTpc/HfHadron/SameEvent/hPt", "pT", {HistType::kTH1F, {{100, 0, 10, "p_{T}"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/hEta", "eta", {HistType::kTH1F, {{100, -4, 4, "#eta"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/hPhi", "phi", {HistType::kTH1F, {{100, 0, TwoPI, "#varphi"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/hYields", "multiplicity vs pT vs eta", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {40, 0, 20, "p_{T}"}, {100, -2, 2, "#eta"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/hEtaPhi", "multiplicity vs eta vs phi", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {100, -2, 2, "#eta"}, {200, 0, TwoPI, "#varphi"}}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/hPt", "pT", {HistType::kTH1F, {axisPt}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/hEta", "eta", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/hPhi", "phi", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/hYields", "multiplicity vs pT vs eta", {HistType::kTH3F, {axisMultiplicity, axisPt, axisDeltaEta}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/hEtaPhi", "multiplicity vs eta vs phi", {HistType::kTH3F, {axisMultiplicity, axisDeltaEta, axisDeltaPhi}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hEventCountSame", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hEta", "eta", {HistType::kTH1F, {{100, -4, 4, "#eta"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hPhi", "phi", {HistType::kTH1F, {{100, 0, TwoPI, "#varphi"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hMultiplicity", "multiplicity;multiplicity;entries", {HistType::kTH1F, {{10000, 0., 10000.}}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hEta", "eta", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hPhi", "phi", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hMultiplicity", "multiplicity;multiplicity;entries", {HistType::kTH1F, {axisMultiplicity}}); registry.add("Data/TpcTpc/HfHadron/MixedEvent/hEventCountHFMixing", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); - // DATA : trigger particles (candidates) histograms for TPC-TPC h-h same event + // DATA : trigger particles (candidates) histograms for TPC-TPC D0-h same event auto vbins = (std::vector)binsPt; - registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hPtCandidate", "2-prong candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{100, 0, 10.}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hPtProng0", "2-prong candidates;prong 0 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{100, 0, 10.}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hPtProng1", "2-prong candidates;prong 1 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{100, 0, 10.}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hMassVsPt", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{500, 0., 5.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hMass", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hEtaCandVsPt", "2-prong candidates;candidate #it{#eta};entries", {HistType::kTH2F, {{100, -2., 2.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hPtCandidate", "2-prong candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hPtProng0", "2-prong candidates;prong 0 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hPtProng1", "2-prong candidates;prong 1 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hMassVsPt", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisMass, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hMass", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH1F, {axisMass}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hEtaCandVsPt", "2-prong candidates;candidate #it{#eta};entries", {HistType::kTH2F, {axisDeltaEta, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hSelectionStatus", "2-prong candidates;selection status;entries", {HistType::kTH2F, {{5, -0.5, 4.5}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); // ========================= @@ -266,18 +260,18 @@ struct HfTaskFlow { // =================== registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hEventCountSame", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hMassVsPt", "3-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{500, 0., 5.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hMass", "3-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hMassVsPtVsMult", "3-prong candidates;inv. mass (p K #pi) (GeV/#it{c}^{2}); p_{T}; multiplicity", {HistType::kTH3F, {{600, 1.98, 2.58}, {vbins, "#it{p}_{T} (GeV/#it{c})"}, {5000, 0., 10000.}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hMultiplicity", "multiplicity;multiplicity;entries", {HistType::kTH1F, {{500, 0, 500}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPt", "3-prong candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{360, 0., 36.}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPtProng0", "3-prong candidates;prong 0 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{360, 0., 36.}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPtProng1", "3-prong candidates;prong 1 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{360, 0., 36.}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPtProng2", "3-prong candidates;prong 2 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{360, 0., 36.}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hEta", "3-prong candidates;#it{#eta};entries", {HistType::kTH1F, {{100, -2., 2.}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPhi", "3-prong candidates;#it{#Phi};entries", {HistType::kTH1F, {{100, 0., 6.3}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hEtaVsPt", "3-prong candidates;candidate #it{#eta};entries", {HistType::kTH2F, {{100, -2., 2.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPhiVsPt", "3-prong candidates;candidate #it{#Phi};entries", {HistType::kTH2F, {{100, 0., 6.3}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hMassVsPt", "3-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisMass, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hMass", "3-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH1F, {axisMass}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hMassVsPtVsMult", "3-prong candidates;inv. mass (p K #pi) (GeV/#it{c}^{2}); p_{T}; multiplicity", {HistType::kTH3F, {axisMass, {vbins, "#it{p}_{T} (GeV/#it{c})"}, axisMultiplicity}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hMultiplicity", "multiplicity;multiplicity;entries", {HistType::kTH1F, {axisMultiplicity}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPt", "3-prong candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPtProng0", "3-prong candidates;prong 0 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPtProng1", "3-prong candidates;prong 1 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPtProng2", "3-prong candidates;prong 2 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hEta", "3-prong candidates;#it{#eta};entries", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPhi", "3-prong candidates;#it{#Phi};entries", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hEtaVsPt", "3-prong candidates;candidate #it{#eta};entries", {HistType::kTH2F, {axisDeltaEta, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPhiVsPt", "3-prong candidates;candidate #it{#Phi};entries", {HistType::kTH2F, {axisDeltaPhi, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hSelectionStatus", "3-prong candidates;selection status;entries", {HistType::kTH2F, {{5, -0.5, 4.5}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); // ========================= @@ -286,19 +280,19 @@ struct HfTaskFlow { // DATA : trigger particles (TPC tracks) histograms for TPC-MFT h-h same event registry.add("Data/TpcMft/HadronHadron/SameEvent/hEventCountSame", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); - registry.add("Data/TpcMft/HadronHadron/SameEvent/hEtaPhiTPC", "multiplicity vs eta vs phi in TPC", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {100, -2, 2, "#eta"}, {200, 0, TwoPI, "#varphi"}}}); - registry.add("Data/TpcMft/HadronHadron/SameEvent/hEtaTPC", "etaTPC", {HistType::kTH1F, {{100, -4, 4, "#eta"}}}); - registry.add("Data/TpcMft/HadronHadron/SameEvent/hPhiTPC", "phiTPC", {HistType::kTH1F, {{100, 0, TwoPI, "#varphi"}}}); - registry.add("Data/TpcMft/HadronHadron/SameEvent/hPtTPC", "pT", {HistType::kTH1F, {{100, 0, 10, "p_{T}"}}}); - registry.add("Data/TpcMft/HadronHadron/SameEvent/hYieldsTPC", "multiplicity vs pT vs eta", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {40, 0, 20, "p_{T}"}, {100, -2, 2, "#eta"}}}); - registry.add("Data/TpcMft/HadronHadron/SameEvent/hMultiplicityTPC", "multiplicity;multiplicity;entries", {HistType::kTH1F, {{500, 0, 500}}}); + registry.add("Data/TpcMft/HadronHadron/SameEvent/hEtaPhiTPC", "multiplicity vs eta vs phi in TPC", {HistType::kTH3F, {axisMultiplicity, axisDeltaEta, axisDeltaPhi}}); + registry.add("Data/TpcMft/HadronHadron/SameEvent/hEtaTPC", "etaTPC", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("Data/TpcMft/HadronHadron/SameEvent/hPhiTPC", "phiTPC", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("Data/TpcMft/HadronHadron/SameEvent/hPtTPC", "pT", {HistType::kTH1F, {axisPt}}); + registry.add("Data/TpcMft/HadronHadron/SameEvent/hYieldsTPC", "multiplicity vs pT vs eta", {HistType::kTH3F, {axisMultiplicity, axisPt, axisDeltaEta}}); + registry.add("Data/TpcMft/HadronHadron/SameEvent/hMultiplicityTPC", "multiplicity;multiplicity;entries", {HistType::kTH1F, {axisMultiplicity}}); // DATA : associated particles (MFT tracks) histograms for TPC-MFT h-h same event - registry.add("Data/TpcMft/HadronHadron/SameEvent/hEtaPhiMFT", "multiplicity vs eta vs phi in MFT", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {100, -2, 2, "#eta"}, {200, 0, TwoPI, "#varphi"}}}); - registry.add("Data/TpcMft/HadronHadron/SameEvent/hEtaMFT", "etaMFT", {HistType::kTH1F, {{100, -4, 4, "#eta"}}}); - registry.add("Data/TpcMft/HadronHadron/SameEvent/hPhiMFT", "phiMFT", {HistType::kTH1F, {{100, 0, TwoPI, "#varphi"}}}); - registry.add("Data/TpcMft/HadronHadron/SameEvent/hPtMFT", "pT", {HistType::kTH1F, {{100, 0, 10, "p_{T}"}}}); - registry.add("Data/TpcMft/HadronHadron/SameEvent/hYieldsMFT", "multiplicity vs pT vs eta", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {40, 0, 20, "p_{T}"}, {100, -5, 0, "#eta"}}}); + registry.add("Data/TpcMft/HadronHadron/SameEvent/hEtaPhiMFT", "multiplicity vs eta vs phi in MFT", {HistType::kTH3F, {axisMultiplicity, axisDeltaEta, axisDeltaPhi}}); + registry.add("Data/TpcMft/HadronHadron/SameEvent/hEtaMFT", "etaMFT", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("Data/TpcMft/HadronHadron/SameEvent/hPhiMFT", "phiMFT", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("Data/TpcMft/HadronHadron/SameEvent/hPtMFT", "pT", {HistType::kTH1F, {axisPt}}); + registry.add("Data/TpcMft/HadronHadron/SameEvent/hYieldsMFT", "multiplicity vs pT vs eta", {HistType::kTH3F, {axisMultiplicity, axisPt, axisDeltaEta}}); // DATA : histograms for TPC-MFT h-h event mixing for events QA registry.add("Data/TpcMft/HadronHadron/MixedEvent/hEventCountMixing", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); @@ -309,27 +303,27 @@ struct HfTaskFlow { // DATA : trigger particles (candidates) histograms for TPC-MFT HF-h same event registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hEventCountSame", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hEtaPhiCandidate", "multiplicity vs eta vs phi in TPC", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {100, -2, 2, "#eta"}, {200, 0, TwoPI, "#varphi"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hEtaCandidate", "etaTPC", {HistType::kTH1F, {{100, -4, 4, "#eta"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hPhiCandidate", "phiTPC", {HistType::kTH1F, {{100, 0, TwoPI, "#varphi"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hYieldsCandidate", "multiplicity vs pT vs eta", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {40, 0, 20, "p_{T}"}, {100, -2, 2, "#eta"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hMultiplicityCandidate", "multiplicity;multiplicity;entries", {HistType::kTH1F, {{500, 0, 500}}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hEtaPhiCandidate", "multiplicity vs eta vs phi in TPC", {HistType::kTH3F, {axisMultiplicity, axisDeltaEta, axisDeltaPhi}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hEtaCandidate", "etaTPC", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hPhiCandidate", "phiTPC", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hYieldsCandidate", "multiplicity vs pT vs eta", {HistType::kTH3F, {axisMultiplicity, axisPt, axisDeltaEta}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hMultiplicityCandidate", "multiplicity;multiplicity;entries", {HistType::kTH1F, {axisMultiplicity}}); // DATA : trigger particles (candidates) histograms for TPC-MFT HF-h same event - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hPtCandidate", "2-prong candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{100, 0, 10.}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hPtProng0", "2-prong candidates;prong 0 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{100, 0, 10.}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hPtProng1", "2-prong candidates;prong 1 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{100, 0, 10.}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hMassVsPt", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{500, 0., 5.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hMass", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hEtaCandVsPt", "2-prong candidates;candidate #it{#eta};entries", {HistType::kTH2F, {{100, -2., 2.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hPtCandidate", "2-prong candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hPtProng0", "2-prong candidates;prong 0 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hPtProng1", "2-prong candidates;prong 1 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hMassVsPt", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisMass, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hMass", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH1F, {axisMass}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hEtaCandVsPt", "2-prong candidates;candidate #it{#eta};entries", {HistType::kTH2F, {axisDeltaEta, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hSelectionStatus", "2-prong candidates;selection status;entries", {HistType::kTH2F, {{5, -0.5, 4.5}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); // DATA : associated particles (MFT tracks) histograms for TPC-MFT h-h same event - registry.add("Data/TpcMft/HfHadron/SameEvent/hEtaPhiMFT", "multiplicity vs eta vs phi in MFT", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {100, -2, 2, "#eta"}, {200, 0, TwoPI, "#varphi"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/hEtaMFT", "etaMFT", {HistType::kTH1F, {{100, -4, 4, "#eta"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/hPhiMFT", "phiMFT", {HistType::kTH1F, {{100, 0, TwoPI, "#varphi"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/hPtMFT", "pT", {HistType::kTH1F, {{100, 0, 10, "p_{T}"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/hYieldsMFT", "multiplicity vs pT vs eta", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {40, 0, 20, "p_{T}"}, {100, -5, 0, "#eta"}}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/hEtaPhiMFT", "multiplicity vs eta vs phi in MFT", {HistType::kTH3F, {axisMultiplicity, axisDeltaEta, axisDeltaPhi}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/hEtaMFT", "etaMFT", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/hPhiMFT", "phiMFT", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/hPtMFT", "pT", {HistType::kTH1F, {axisPt}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/hYieldsMFT", "multiplicity vs pT vs eta", {HistType::kTH3F, {axisMultiplicity, axisPt, axisDeltaEta}}); // DATA : histograms for TPC-MFT h-h event mixing for events QA registry.add("Data/TpcMft/HfHadron/MixedEvent/hEventCountMixing", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); @@ -339,20 +333,20 @@ struct HfTaskFlow { // ========================= registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hEventCountSame", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hYieldsCandidate", "multiplicity vs pT vs eta", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {40, 0, 20, "p_{T}"}, {100, -2, 2, "#eta"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hMultiplicityCandidate", "multiplicity;multiplicity;entries", {HistType::kTH1F, {{500, 0, 500}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hEtaPhiCandidate", "multiplicity vs eta vs phi in TPC", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {100, -2, 2, "#eta"}, {200, 0, TwoPI, "#varphi"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hMassVsPt", "3-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{500, 0., 5.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hMass", "3-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hMassVsPtVsMult", "3-prong candidates;inv. mass (p K #pi) (GeV/#it{c}^{2}); p_{T}; multiplicity", {HistType::kTH3F, {{600, 1.98, 2.58}, {vbins, "#it{p}_{T} (GeV/#it{c})"}, {5000, 0., 10000.}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hPt", "3-prong candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{360, 0., 36.}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hPtProng0", "3-prong candidates;prong 0 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{360, 0., 36.}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hPtProng1", "3-prong candidates;prong 1 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{360, 0., 36.}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hPtProng2", "3-prong candidates;prong 2 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{360, 0., 36.}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hEta", "3-prong candidates;#it{#eta};entries", {HistType::kTH1F, {{100, -2., 2.}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hPhi", "3-prong candidates;#it{#Phi};entries", {HistType::kTH1F, {{100, 0., 6.3}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hEtaVsPt", "3-prong candidates;candidate #it{#eta};entries", {HistType::kTH2F, {{100, -2., 2.}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hPhiVsPt", "3-prong candidates;candidate #it{#Phi};entries", {HistType::kTH2F, {{100, 0., 6.3}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hYieldsCandidate", "multiplicity vs pT vs eta", {HistType::kTH3F, {axisMultiplicity, axisPt, axisDeltaEta}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hMultiplicityCandidate", "multiplicity;multiplicity;entries", {HistType::kTH1F, {axisMultiplicity}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hEtaPhiCandidate", "multiplicity vs eta vs phi in TPC", {HistType::kTH3F, {axisMultiplicity, axisDeltaEta, axisDeltaPhi}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hMassVsPt", "3-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisMass, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hMass", "3-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH1F, {axisMass}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hMassVsPtVsMult", "3-prong candidates;inv. mass (p K #pi) (GeV/#it{c}^{2}); p_{T}; multiplicity", {HistType::kTH3F, {axisMass, {vbins, "#it{p}_{T} (GeV/#it{c})"}, axisMultiplicity}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hPt", "3-prong candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hPtProng0", "3-prong candidates;prong 0 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hPtProng1", "3-prong candidates;prong 1 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hPtProng2", "3-prong candidates;prong 2 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hEta", "3-prong candidates;#it{#eta};entries", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hPhi", "3-prong candidates;#it{#Phi};entries", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hEtaVsPt", "3-prong candidates;candidate #it{#eta};entries", {HistType::kTH2F, {axisDeltaEta, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hPhiVsPt", "3-prong candidates;candidate #it{#Phi};entries", {HistType::kTH2F, {axisDeltaPhi, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hSelectionStatus", "3-prong candidates;selection status;entries", {HistType::kTH2F, {{5, -0.5, 4.5}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); // ========================= @@ -361,45 +355,49 @@ struct HfTaskFlow { // MC reconstructed - registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hMultiplicity", "hMultiplicity", {HistType::kTH1F, {{500, 0, 500}}}); - registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hVtxZ", "hVtxZ", {HistType::kTH1F, {{400, -50, 50}}}); + registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hMultiplicity", "hMultiplicity", {HistType::kTH1F, {axisMultiplicity}}); + registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hVtxZ", "hVtxZ", {HistType::kTH1F, {axisVertex}}); registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hEventCountSame", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); // Katarina had this : - registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hMultiplicityPrimary", "hMultiplicityPrimary", {HistType::kTH1F, {{500, 0, 500}}}); + registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hMultiplicityPrimary", "hMultiplicityPrimary", {HistType::kTH1F, {axisMultiplicity}}); // histograms for MC associated particles - registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hPt", "pT", {HistType::kTH1F, {{100, 0, 10, "p_{T}"}}}); - registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hEta", "eta", {HistType::kTH1F, {{100, -4, 4, "#eta"}}}); - registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hPhi", "phi", {HistType::kTH1F, {{100, 0, TwoPI, "#varphi"}}}); - registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hYields", "multiplicity vs pT vs eta", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {40, 0, 20, "p_{T}"}, {100, -2, 2, "#eta"}}}); - registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hEtaPhi", "multiplicity vs eta vs phi", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {100, -2, 2, "#eta"}, {200, 0, TwoPI, "#varphi"}}}); + registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hPt", "pT", {HistType::kTH1F, {axisPt}}); + registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hEta", "eta", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hPhi", "phi", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hYields", "multiplicity vs pT vs eta", {HistType::kTH3F, {axisMultiplicity, axisPt, axisDeltaEta}}); + registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hEtaPhi", "multiplicity vs eta vs phi", {HistType::kTH3F, {axisMultiplicity, axisDeltaEta, axisDeltaPhi}}); + registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hNtracks", "hNtracks", {HistType::kTH1F, {axisMultiplicity}}); // histograms for MC particles in event mixing registry.add("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hEventCountMixing", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); - registry.add("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hMultiplicityMixing", "hMultiplicityMixing", {HistType::kTH1F, {{500, 0, 500}}}); - registry.add("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hVtxZMixing", "hVtxZMixing", {HistType::kTH1F, {{100, -10, 10}}}); - registry.add("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hPtMixing", "pT", {HistType::kTH1F, {{100, 0, 10, "p_{T}"}}}); - registry.add("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hEtaMixing", "eta", {HistType::kTH1F, {{100, -4, 4, "#eta"}}}); - registry.add("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hPhiMixing", "phi", {HistType::kTH1F, {{100, 0, TwoPI, "#varphi"}}}); + registry.add("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hMultiplicityMixing", "hMultiplicityMixing", {HistType::kTH1F, {axisMultiplicity}}); + registry.add("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hVtxZMixing", "hVtxZMixing", {HistType::kTH1F, {axisVertex}}); + registry.add("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hPtMixing", "pT", {HistType::kTH1F, {axisPt}}); + registry.add("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hEtaMixing", "eta", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hPhiMixing", "phi", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hNtracksMixing", "hNtracksMixing", {HistType::kTH1F, {axisMultiplicity}}); // MC Truth - registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hMultiplicity", "hMultiplicity", {HistType::kTH1F, {{500, 0, 500}}}); - registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hVtxZ", "hVtxZ", {HistType::kTH1F, {{400, -50, 50}}}); + registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hMultiplicity", "hMultiplicity", {HistType::kTH1F, {axisMultiplicity}}); + registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hVtxZ", "hVtxZ", {HistType::kTH1F, {axisVertex}}); registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hEventCountSame", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); // Katarina had this : - registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hMultiplicityPrimary", "hMultiplicityPrimary", {HistType::kTH1F, {{500, 0, 500}}}); + registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hMultiplicityPrimary", "hMultiplicityPrimary", {HistType::kTH1F, {axisMultiplicity}}); // histograms for MC associated particles - registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hPt", "pT", {HistType::kTH1F, {{100, 0, 10, "p_{T}"}}}); - registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hEta", "eta", {HistType::kTH1F, {{100, -4, 4, "#eta"}}}); - registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hPhi", "phi", {HistType::kTH1F, {{100, 0, TwoPI, "#varphi"}}}); - registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hYields", "multiplicity vs pT vs eta", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {40, 0, 20, "p_{T}"}, {100, -2, 2, "#eta"}}}); - registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hEtaPhi", "multiplicity vs eta vs phi", {HistType::kTH3F, {{200, 0, 200, "multiplicity"}, {100, -2, 2, "#eta"}, {200, 0, TwoPI, "#varphi"}}}); + registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hPt", "pT", {HistType::kTH1F, {axisPt}}); + registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hEta", "eta", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hPhi", "phi", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hYields", "multiplicity vs pT vs eta", {HistType::kTH3F, {axisMultiplicity, axisPt, axisDeltaEta}}); + registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hEtaPhi", "multiplicity vs eta vs phi", {HistType::kTH3F, {axisMultiplicity, axisDeltaEta, axisDeltaPhi}}); + registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hNtracks", "hNtracks", {HistType::kTH1F, {axisMultiplicity}}); // histograms for MC particles in event mixing registry.add("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hEventCountMixing", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); - registry.add("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hMultiplicityMixing", "hMultiplicityMixing", {HistType::kTH1F, {{500, 0, 500}}}); - registry.add("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hVtxZMixing", "hVtxZMixing", {HistType::kTH1F, {{100, -10, 10}}}); - registry.add("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hPtMixing", "pT", {HistType::kTH1F, {{100, 0, 10, "p_{T}"}}}); - registry.add("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hEtaMixing", "eta", {HistType::kTH1F, {{100, -4, 4, "#eta"}}}); - registry.add("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hPhiMixing", "phi", {HistType::kTH1F, {{100, 0, TwoPI, "#varphi"}}}); + registry.add("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hMultiplicityMixing", "hMultiplicityMixing", {HistType::kTH1F, {axisMultiplicity}}); + registry.add("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hVtxZMixing", "hVtxZMixing", {HistType::kTH1F, {axisVertex}}); + registry.add("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hPtMixing", "pT", {HistType::kTH1F, {axisPt}}); + registry.add("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hEtaMixing", "eta", {HistType::kTH1F, {axisDeltaEta}}); + registry.add("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hPhiMixing", "phi", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hNtracksMixing", "hNtracksMixing", {HistType::kTH1F, {axisMultiplicity}}); // ========================= // Declaration of correlation containers and their respective axis @@ -421,14 +419,6 @@ struct HfTaskFlow { mixedEvent.setObject(new CorrelationContainer("mixedEvent", "mixedEvent", corrAxis, effAxis, {})); sameEventHf.setObject(new CorrelationContainer("sameEventHf", "sameEventHf", corrAxis, effAxis, userAxis)); mixedEventHf.setObject(new CorrelationContainer("mixedEventHf", "mixedEventHf", corrAxis, effAxis, userAxis)); - // sameTPCTPCChCh.setObject(new CorrelationContainer("sameTPCTPCChCh", "sameTPCTPCChCh", corrAxis, effAxis, {})); - // mixedTPCTPCChCh.setObject(new CorrelationContainer("mixedTPCTPCChCh", "mixedTPCTPCChCh", corrAxis, effAxis, {})); - // sameTPCTPCHfCh.setObject(new CorrelationContainer("sameTPCTPCHfCh", "sameTPCTPCHfCh", corrAxis, effAxis, userAxis)); - // mixedTPCTPCHfCh.setObject(new CorrelationContainer("mixedTPCTPCHfCh", "mixedTPCTPCHfCh", corrAxis, effAxis, userAxis)); - // sameTPCMFTChCh.setObject(new CorrelationContainer("sameTPCMFTChCh", "sameTPCMFTChCh", corrAxis, effAxis, {})); - // mixedTPCMFTChCh.setObject(new CorrelationContainer("mixedTPCMFTChCh", "mixedTPCMFTChCh", corrAxis, effAxis, {})); - // sameTPCMFTHfCh.setObject(new CorrelationContainer("sameTPCMFTHfCh", "sameTPCMFTHfCh", corrAxis, effAxis, userAxis)); - // mixedTPCMFTHfCh.setObject(new CorrelationContainer("mixedTPCMFTHfCh", "mixedTPCMFTHfCh", corrAxis, effAxis, userAxis)); // initialization of correlation containes for monte-carlo // sameTPCTPCChChMC.setObject(new CorrelationContainer("sameTPCTPCChChMC", "sameTPCTPCChChMC", corrAxis, effAxis, {})); From ec0fd07eba9ecadaab33aeee48aeeaba5733431e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josu=C3=A9=20Mart=C3=ADnez=20Garc=C3=ADa?= Date: Fri, 11 Apr 2025 12:48:09 +0200 Subject: [PATCH 0962/1650] [PWGLF] PWGMM:Lumi: Changes onn rate histo axis (#10815) --- PWGMM/Lumi/Tasks/lumiStability.cxx | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/PWGMM/Lumi/Tasks/lumiStability.cxx b/PWGMM/Lumi/Tasks/lumiStability.cxx index b8bb9209810..5938ec42cdd 100644 --- a/PWGMM/Lumi/Tasks/lumiStability.cxx +++ b/PWGMM/Lumi/Tasks/lumiStability.cxx @@ -87,7 +87,7 @@ struct LumiStabilityTask { const AxisSpec axisTimeFDD{1000, -20, 100}; const AxisSpec axisCountsTime{2, -0.5, 1.5}; const AxisSpec axisOrbits{static_cast(nOrbits / nOrbitsPerTF), 0., static_cast(nOrbits), ""}; - const AxisSpec axisTimeRate{1440, 0., 86400, ""}; // t in seconds. Histo for 24 hrs. Each bin contain 1 min. + const AxisSpec axisTimeRate{int(double(43200) / (nOrbitsPerTF * 89e-6)), 0., 43200, ""}; // t in seconds. Histo for 12 hrs. Each bin contain one time frame (128/32 orbits for Run2/3). histos.add("hBcA", "BC pattern A; BC ; It is present", kTH1F, {axisTrigger}); histos.add("hBcC", "BC pattern C; BC ; It is present", kTH1F, {axisTrigger}); @@ -162,6 +162,7 @@ struct LumiStabilityTask { histos.add("FDD/hValidTimevsBC", "Valid Time vs BC id;BC in FT0;valid time counts", kTH1F, {axisTrigger}); histos.add("FDD/hInvTimevsBC", "Invalid Time vs BC id;BC in FT0;invalid time counts", kTH1F, {axisTrigger}); histos.add("FDD/hTimeForRate", "Counts by time in FDD;t (in seconds) in FDD; counts", kTH1F, {axisTimeRate}); + histos.add("FDD/hTimeForRateLeadingBC", "Counts by time in FDD;t (in seconds) in FDD; counts", kTH1F, {axisTimeRate}); histos.add("FT0/hCounts", "0 FT0Count - 1 FT0VertexCount - 2 FT0PPVertexCount - 3 FT0PPBothSidesCount; Number; counts", kTH1F, {axisCounts}); histos.add("FT0/bcVertexTrigger", "vertex trigger per BC (FT0);BC in FT0; counts", kTH1F, {axisTrigger}); @@ -191,7 +192,8 @@ struct LumiStabilityTask { histos.add("FT0/hInvTimeCvsBC", "Invalid Time C vs BC id;BC in FT0;invalid time counts", kTH1F, {axisTrigger}); histos.add("FT0/hValidTimevsBC", "Valid Time vs BC id;BC in FT0;valid time counts", kTH1F, {axisTrigger}); histos.add("FT0/hInvTimevsBC", "Invalid Time vs BC id;BC in FT0;invalid time counts", kTH1F, {axisTrigger}); - histos.add("FT0/hTimeForRate", "Counts by time in FT0;t (in seconds) in FDD; counts", kTH1F, {axisTimeRate}); + histos.add("FT0/hTimeForRate", "Counts by time in FT0;t (in seconds) in FT0; counts", kTH1F, {axisTimeRate}); + histos.add("FT0/hTimeForRateLeadingBC", "Counts by time in FT0;t (in seconds) in FT0; counts", kTH1F, {axisTimeRate}); histos.add("FV0/hCounts", "0 CountCentralFV0 - 1 CountPFPCentralFV0 - 2 CountPFPOutInFV0 - 3 CountPPCentralFV0 - 4 CountPPOutInFV0; Number; counts", kTH1F, {axisV0Counts}); histos.add("FV0/bcOutTrigger", "Out trigger per BC (FV0);BC in V0; counts", kTH1F, {axisTrigger}); @@ -363,7 +365,22 @@ struct LumiStabilityTask { histos.fill(HIST("FDD/bcVertexTrigger"), localBC); histos.fill(HIST("FDD/hCounts"), 1); histos.fill(HIST("hOrbitFDDVertex"), orbit - minOrbit); - histos.fill(HIST("FDD/hTimeForRate"), (bc.timestamp() - tsSOR) * 1.e-3); // Converting ms into seconds + + if (bcPatternB[localBC]) { + histos.fill(HIST("FDD/hTimeForRate"), (bc.timestamp() - tsSOR) * 1.e-3); // Converting ms into seconds + bool isLeadBC = true; + for (int jbit = localBC - minEmpty; jbit < localBC; jbit++) { + int kbit = jbit; + if (kbit < 0) + kbit += nbin; + if (bcPatternB[kbit]) { + isLeadBC = false; + break; + } + } + if (isLeadBC) + histos.fill(HIST("FDD/hTimeForRateLeadingBC"), (bc.timestamp() - tsSOR) * 1.e-3); + } int deltaIndex = 0; // backward move counts int deltaBC = 0; // current difference wrt globalBC @@ -610,7 +627,6 @@ struct LumiStabilityTask { if (vertex) { histos.fill(HIST("FT0/bcVertexTrigger"), localBC); histos.fill(HIST("hOrbitFT0vertex"), orbit - minOrbit); - histos.fill(HIST("FT0/hTimeForRate"), (bc.timestamp() - tsSOR) * 1.e-3); // Converting ms into seconds if (bcPatternA[localBC]) { histos.fill(HIST("FT0/timeACbcA"), ft0.timeA(), ft0.timeC()); @@ -623,6 +639,7 @@ struct LumiStabilityTask { if (bcPatternB[localBC]) { histos.fill(HIST("FT0/timeACbcB"), ft0.timeA(), ft0.timeC()); histos.fill(HIST("FT0/hBcB"), localBC); + histos.fill(HIST("FT0/hTimeForRate"), (bc.timestamp() - tsSOR) * 1.e-3); // Converting ms into seconds bool isLeadBC = true; for (int jbit = localBC - minEmpty; jbit < localBC; jbit++) { int kbit = jbit; @@ -633,8 +650,10 @@ struct LumiStabilityTask { break; } } - if (isLeadBC) + if (isLeadBC) { + histos.fill(HIST("FT0/hTimeForRateLeadingBC"), (bc.timestamp() - tsSOR) * 1.e-3); // Converting ms into seconds histos.fill(HIST("FT0/hBcBL"), localBC); + } histos.fill(HIST("FT0/hTimeA"), ft0.timeA()); histos.fill(HIST("FT0/hTimeC"), ft0.timeC()); From ebc7f0107f926913830671ec25536669bac4146d Mon Sep 17 00:00:00 2001 From: Sahil Upadhyaya <36447687+sahilupadhyaya92@users.noreply.github.com> Date: Fri, 11 Apr 2025 15:45:55 +0200 Subject: [PATCH 0963/1650] [PWGDQ] Adding MCSignal for POWHEG Drell-Yan muon selection (#10817) Co-authored-by: Sahil Upadhyaya --- PWGDQ/Core/MCProng.cxx | 3 ++- PWGDQ/Core/MCProng.h | 1 + PWGDQ/Core/MCSignal.h | 6 ++++++ PWGDQ/Core/MCSignalLibrary.cxx | 12 ++++++++++++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/PWGDQ/Core/MCProng.cxx b/PWGDQ/Core/MCProng.cxx index cc3d3ee8b36..8eb0dc6d2e9 100644 --- a/PWGDQ/Core/MCProng.cxx +++ b/PWGDQ/Core/MCProng.cxx @@ -22,7 +22,8 @@ std::map MCProng::fgSourceNames = { {"kProducedInTransport", MCProng::kProducedInTransport}, {"kProducedByGenerator", MCProng::kProducedByGenerator}, {"kFromBackgroundEvent", MCProng::kFromBackgroundEvent}, - {"kHEPMCFinalState", MCProng::kHEPMCFinalState}}; + {"kHEPMCFinalState", MCProng::kHEPMCFinalState}, + {"kIsPowhegDYMuon", MCProng::kIsPowhegDYMuon}}; //________________________________________________________________________________________________________________ MCProng::MCProng() : fNGenerations(0), diff --git a/PWGDQ/Core/MCProng.h b/PWGDQ/Core/MCProng.h index b1935260433..cdcbe0d114b 100644 --- a/PWGDQ/Core/MCProng.h +++ b/PWGDQ/Core/MCProng.h @@ -73,6 +73,7 @@ class MCProng kProducedByGenerator, // Produced by generator (if not, then produced by GEANT) kFromBackgroundEvent, // Produced in the underlying event kHEPMCFinalState, // HEPMC code 11 + kIsPowhegDYMuon, // POWHEG muons based on Pythia Status Code (=23) -> Drell-Yan signal kNSources }; diff --git a/PWGDQ/Core/MCSignal.h b/PWGDQ/Core/MCSignal.h index 06404e88ed5..42fe0a0a050 100644 --- a/PWGDQ/Core/MCSignal.h +++ b/PWGDQ/Core/MCSignal.h @@ -253,6 +253,12 @@ bool MCSignal::CheckProng(int i, bool checkSources, const T& track) sourcesDecision |= (static_cast(1) << MCProng::kHEPMCFinalState); } } + // Check kIsPowhegDYMuon + if (fProngs[i].fSourceBits[j] & (static_cast(1) << MCProng::kIsPowhegDYMuon)) { + if ((fProngs[i].fExcludeSource[j] & (static_cast(1) << MCProng::kIsPowhegDYMuon)) != (currentMCParticle.getGenStatusCode() == 23)) { + sourcesDecision |= (static_cast(1) << MCProng::kIsPowhegDYMuon); + } + } } // end if(hasSources) // no source bit is fulfilled if (hasSources && !sourcesDecision) { diff --git a/PWGDQ/Core/MCSignalLibrary.cxx b/PWGDQ/Core/MCSignalLibrary.cxx index 4cf7100d86d..bff19c83df4 100644 --- a/PWGDQ/Core/MCSignalLibrary.cxx +++ b/PWGDQ/Core/MCSignalLibrary.cxx @@ -348,6 +348,12 @@ MCSignal* o2::aod::dqmcsignals::GetMCSignal(const char* name) signal = new MCSignal(name, "electron from a photon conversion", {prong}, {-1}); return signal; } + if (!nameStr.compare("PowhegDYMuon1")) { + MCProng prong(1, {13}, {true}, {false}, {0}, {0}, {false}); // selecting muons + prong.SetSourceBit(0, MCProng::kIsPowhegDYMuon); // set source to be Muon from POWHEG + signal = new MCSignal(name, "POWHEG Muon singles", {prong}, {-1}); // define a signal with 1-prong + return signal; + } // 2-prong signals if (!nameStr.compare("dielectron")) { @@ -381,6 +387,12 @@ MCSignal* o2::aod::dqmcsignals::GetMCSignal(const char* name) signal = new MCSignal(name, "dielectron from a photon conversion from a pi0", {prong, prong}, {1, 1}); return signal; } + if (!nameStr.compare("PowhegDYMuon2")) { + MCProng prong(1, {13}, {true}, {false}, {0}, {0}, {false}); // selecting muons + prong.SetSourceBit(0, MCProng::kIsPowhegDYMuon); // set source to be Muon from POWHEG + signal = new MCSignal(name, "POWHEG Muon pair", {prong, prong}, {-1, -1}); // define a signal with 2-prong + return signal; + } // LMEE single signals // electron signals with mother X: e from mother X From ddd2cab2a703e3928e9560911097bb75d048835b Mon Sep 17 00:00:00 2001 From: altsybee Date: Fri, 11 Apr 2025 17:15:32 +0200 Subject: [PATCH 0964/1650] [DPG] Update eventSelectionQa.cxx - add dEdx vs occupancy QA histo (#10819) --- DPG/Tasks/AOTEvent/eventSelectionQa.cxx | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/DPG/Tasks/AOTEvent/eventSelectionQa.cxx b/DPG/Tasks/AOTEvent/eventSelectionQa.cxx index 002bc1eb614..854314837e8 100644 --- a/DPG/Tasks/AOTEvent/eventSelectionQa.cxx +++ b/DPG/Tasks/AOTEvent/eventSelectionQa.cxx @@ -356,6 +356,8 @@ struct EventSelectionQaTask { histos.add("occupancyQA/hITSTracks_ev1_vs_ev2_2coll_in_ROF", ";nITStracks event #1;nITStracks event #2", kTH2D, {{200, 0., 6000}, {200, 0., 6000}}); histos.add("occupancyQA/hITSTracks_ev1_vs_ev2_2coll_in_ROF_UPC", ";nITStracks event #1;nITStracks event #2", kTH2D, {{41, -0.5, 40.5}, {41, -0.5, 40.5}}); histos.add("occupancyQA/hITSTracks_ev1_vs_ev2_2coll_in_ROF_nonUPC", ";nITStracks event #1;nITStracks event #2", kTH2D, {{200, 0., 6000}, {200, 0., 6000}}); + + histos.add("occupancyQA/dEdx_vs_centr_vs_occup_narrow_p_win", "dE/dx", kTH3F, {{20, 0, 4000, "n PV tracks"}, {60, 0, 15000, "occupancy"}, {800, 0.0, 800.0, "dE/dx (a. u.)"}}); } } @@ -1152,6 +1154,19 @@ struct EventSelectionQaTask { histos.fill(HIST("occupancyQA/hOccupancyByFT0CvsByTracks"), occupancyByTracks, occupancyByFT0C); histos.fill(HIST("occupancyQA/hNumTracksPV_vs_V0A_vs_occupancy"), multV0A, nPV, occupancyByTracks); histos.fill(HIST("occupancyQA/hNumTracksPVTPC_vs_V0A_vs_occupancy"), multV0A, nContributorsAfterEtaTPCCuts, occupancyByTracks); + + // dE/dx QA for a narrow pT bin + for (const auto& track : tracksGrouped) { + if (!track.isPVContributor()) + continue; + if (std::fabs(track.eta()) < 0.8 && track.pt() > 0.2 && track.itsNCls() >= 5) { + float signedP = track.sign() * track.tpcInnerParam(); + if (std::fabs(signedP) > 0.38 && std::fabs(signedP) < 0.4 && track.tpcNClsFound() > 70 && track.tpcNClsCrossedRows() > 80 && track.itsChi2NCl() < 36 && track.tpcChi2NCl() < 4) { + float dEdx = track.tpcSignal(); + histos.fill(HIST("occupancyQA/dEdx_vs_centr_vs_occup_narrow_p_win"), nPV, occupancyByTracks, dEdx); + } + } + } } } From 512b7cae79ed5c448a11cb8da1b50e260c2f62a1 Mon Sep 17 00:00:00 2001 From: lucamicheletti93 <38209984+lucamicheletti93@users.noreply.github.com> Date: Fri, 11 Apr 2025 17:36:51 +0200 Subject: [PATCH 0965/1650] [PWGDQ] Adding extra signals for muclei and removing histos from table-maker (#10821) Co-authored-by: Lucamicheletti93 --- PWGDQ/Core/MCSignalLibrary.cxx | 11 +++++++++-- PWGDQ/TableProducer/tableMakerMC.cxx | 6 ------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/PWGDQ/Core/MCSignalLibrary.cxx b/PWGDQ/Core/MCSignalLibrary.cxx index bff19c83df4..8121bb2241d 100644 --- a/PWGDQ/Core/MCSignalLibrary.cxx +++ b/PWGDQ/Core/MCSignalLibrary.cxx @@ -125,9 +125,16 @@ MCSignal* o2::aod::dqmcsignals::GetMCSignal(const char* name) signal = new MCSignal(name, "Inclusive jpsi", {prong}, {-1}); return signal; } - if (!nameStr.compare("Helium3")) { + if (!nameStr.compare("Helium3Primary")) { MCProng prong(1, {1000020030}, {true}, {false}, {0}, {0}, {false}); - signal = new MCSignal(name, "Helium3", {prong}, {-1}); + prong.SetSourceBit(0, MCProng::kPhysicalPrimary); + signal = new MCSignal(name, "Helium3Primary", {prong}, {-1}); + return signal; + } + if (!nameStr.compare("Helium3FromTransport")) { + MCProng prong(1, {1000020030}, {true}, {false}, {0}, {0}, {false}); + prong.SetSourceBit(0, MCProng::kProducedInTransport); + signal = new MCSignal(name, "Helium3FromTransport", {prong}, {-1}); return signal; } if (!nameStr.compare("nonPromptJpsi")) { diff --git a/PWGDQ/TableProducer/tableMakerMC.cxx b/PWGDQ/TableProducer/tableMakerMC.cxx index f5b80345745..20634b53b8a 100644 --- a/PWGDQ/TableProducer/tableMakerMC.cxx +++ b/PWGDQ/TableProducer/tableMakerMC.cxx @@ -762,7 +762,6 @@ struct TableMakerMC { for (auto& cut : fMuonCuts) { if (cut.IsSelected(VarManager::fgValues)) { trackTempFilterMap |= (uint8_t(1) << i); - (reinterpret_cast(fStatsList->At(2)))->Fill(static_cast(i)); } i++; } @@ -811,7 +810,6 @@ struct TableMakerMC { for (auto& cut : fMuonCuts) { if (cut.IsSelected(VarManager::fgValues)) { trackTempFilterMap |= (uint8_t(1) << i); - fHistMan->FillHistClass(Form("Muons_%s", cut.GetName()), VarManager::fgValues); if (fIsAmbiguous && isAmbiguous == 1) { fHistMan->FillHistClass(Form("Ambiguous_Muons_%s", cut.GetName()), VarManager::fgValues); } @@ -1322,10 +1320,6 @@ struct TableMakerMC { for (auto& cut : fMuonCuts) { if (cut.IsSelected(VarManager::fgValues)) { trackTempFilterMap |= (uint8_t(1) << i); - if (fConfigQA) { - fHistMan->FillHistClass(Form("Muons_%s", cut.GetName()), VarManager::fgValues); - } - (reinterpret_cast(fStatsList->At(2)))->Fill(static_cast(i)); } i++; } From a8619ff1c2f81476876baeddcc92e47ccc5b21b2 Mon Sep 17 00:00:00 2001 From: Fabrizio Date: Sat, 12 Apr 2025 09:44:00 +0200 Subject: [PATCH 0966/1650] [PWGHF] Add more event variables to the B derived data creator (#10823) Co-authored-by: ALICE Action Bot --- PWGHF/D2H/DataModel/ReducedDataModel.h | 26 ++ .../dataCreatorCharmHadPiReduced.cxx | 254 ++++++++++++++++-- 2 files changed, 251 insertions(+), 29 deletions(-) diff --git a/PWGHF/D2H/DataModel/ReducedDataModel.h b/PWGHF/D2H/DataModel/ReducedDataModel.h index 0c467c1cf56..e902d1de8e3 100644 --- a/PWGHF/D2H/DataModel/ReducedDataModel.h +++ b/PWGHF/D2H/DataModel/ReducedDataModel.h @@ -60,6 +60,32 @@ DECLARE_SOA_TABLE(HfRedCollisions, "AOD", "HFREDCOLLISION", //! Table with colli hf_reduced_collision::Bz, o2::soa::Marker<1>); +DECLARE_SOA_TABLE(HfRedCollCents, "AOD", "HFREDCOLLCENT", //! Table with collision centrality for reduced workflow + cent::CentFT0C, + cent::CentFT0M, + evsel::NumTracksInTimeRange, + evsel::SumAmpFT0CInTimeRange); + +DECLARE_SOA_TABLE(HfRedQvectors, "AOD", "HFREDQVECTOR", //! Table with collision centrality for reduced workflow + qvec::QvecFT0CRe, + qvec::QvecFT0CIm, + qvec::SumAmplFT0C, + qvec::QvecFT0ARe, + qvec::QvecFT0AIm, + qvec::SumAmplFT0A, + qvec::QvecFT0MRe, + qvec::QvecFT0MIm, + qvec::SumAmplFT0M, + qvec::QvecTPCposRe, + qvec::QvecTPCposIm, + qvec::NTrkTPCpos, + qvec::QvecTPCnegRe, + qvec::QvecTPCnegIm, + qvec::NTrkTPCneg, + qvec::QvecTPCallRe, + qvec::QvecTPCallIm, + qvec::NTrkTPCall); + DECLARE_SOA_TABLE(HfRedCollExtras, "AOD", "HFREDCOLLEXTRA", //! Table with collision extras for reduced workflow collision::CovXX, collision::CovXY, diff --git a/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx b/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx index a79e2fe2193..869e037c788 100644 --- a/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx +++ b/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx @@ -32,6 +32,8 @@ #include "Common/Core/trackUtilities.h" #include "Common/DataModel/CollisionAssociationTables.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/Qvectors.h" #include "PWGHF/Core/HfHelper.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" @@ -74,6 +76,8 @@ struct HfDataCreatorCharmHadPiReduced { // Produces AOD tables to store track information // collision related tables Produces hfReducedCollision; + Produces hfReducedCollCentrality; + Produces hfReducedQvector; Produces hfReducedCollExtra; Produces hfCollisionCounter; // Pi bachelor related tables @@ -120,6 +124,7 @@ struct HfDataCreatorCharmHadPiReduced { // selection Configurable usePionIsGlobalTrackWoDCA{"usePionIsGlobalTrackWoDCA", true, "check isGlobalTrackWoDCA status for pions, for Run3 studies"}; Configurable ptPionMin{"ptPionMin", 0.5, "minimum pion pT threshold (GeV/c)"}; + Configurable absEtaPionMax{"etaPionMax", 0.8, "maximum pion absolute eta threshold"}; Configurable> binsPtPion{"binsPtPion", std::vector{hf_cuts_single_track::vecBinsPtTrack}, "track pT bin limits for pion DCA XY pT-dependent cut"}; Configurable> cutsTrackPionDCA{"cutsTrackPionDCA", {hf_cuts_single_track::CutsTrack[0], hf_cuts_single_track::NBinsPtTrack, hf_cuts_single_track::NCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for pions"}; Configurable invMassWindowCharmHadPi{"invMassWindowCharmHadPi", 0.3, "invariant-mass window for CharmHad-Pi pair preselections (GeV/c2)"}; @@ -170,7 +175,9 @@ struct HfDataCreatorCharmHadPiReduced { using CandsD0Filtered = soa::Filtered>; using CandsD0FilteredWithMl = soa::Filtered>; - using CollisionsWMcLabels = soa::Join; + using CollisionsWCent = soa::Join; + using CollisionsWCentAndMcLabels = soa::Join; + using CollisionsWCentAndQvectors = soa::Join; Filter filterSelectDplusCandidates = (aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlagDplus); Filter filterSelectDsCandidates = (aod::hf_sel_candidate_ds::isSelDsToKKPi >= selectionFlagDs || aod::hf_sel_candidate_ds::isSelDsToPiKK >= selectionFlagDs); @@ -183,7 +190,7 @@ struct HfDataCreatorCharmHadPiReduced { Preslice candsD0PerCollision = aod::track_association::collisionId; Preslice candsD0PerCollisionWithMl = aod::track_association::collisionId; Preslice trackIndicesPerCollision = aod::track_association::collisionId; - PresliceUnsorted colPerMcCollision = aod::mccollisionlabel::mcCollisionId; + PresliceUnsorted colPerMcCollision = aod::mccollisionlabel::mcCollisionId; std::shared_ptr hCandidatesD0, hCandidatesDPlus, hCandidatesDs; HistogramRegistry registry{"registry"}; @@ -299,8 +306,8 @@ struct HfDataCreatorCharmHadPiReduced { if (usePionIsGlobalTrackWoDCA && !trackPion.isGlobalTrackWoDCA()) { return false; } - // minimum pT selection - if (trackParCovPion.getPt() < ptPionMin || !isSelectedTrackDCA(trackParCovPion, dcaPion)) { + // minimum pT and eta selection + if (trackParCovPion.getPt() < ptPionMin || std::abs(trackParCovPion.getEta()) > absEtaPionMax || !isSelectedTrackDCA(trackParCovPion, dcaPion)) { return false; } // reject pions that are charm-hadron daughters @@ -701,7 +708,7 @@ struct HfDataCreatorCharmHadPiReduced { } } - template + template void runDataCreation(Coll const& collision, CCharmCands const& candsC, aod::TrackAssoc const& trackIndices, @@ -1034,6 +1041,15 @@ struct HfDataCreatorCharmHadPiReduced { hfReducedCollision(collision.posX(), collision.posY(), collision.posZ(), collision.numContrib(), hfRejMap, bz); hfReducedCollExtra(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + hfReducedCollCentrality(collision.centFT0C(), collision.centFT0M(), collision.trackOccupancyInTimeRange(), collision.ft0cOccupancyInTimeRange()); + if constexpr (withQvec) { + hfReducedQvector(collision.qvecFT0CRe(), collision.qvecFT0CIm(), collision.sumAmplFT0C(), + collision.qvecFT0ARe(), collision.qvecFT0AIm(), collision.sumAmplFT0A(), + collision.qvecFT0MRe(), collision.qvecFT0MIm(), collision.sumAmplFT0M(), + collision.qvecTPCposRe(), collision.qvecTPCposIm(), collision.nTrkTPCpos(), + collision.qvecTPCnegRe(), collision.qvecTPCnegIm(), collision.nTrkTPCneg(), + collision.qvecTPCallRe(), collision.qvecTPCallIm(), collision.nTrkTPCall()); + } } template @@ -1191,7 +1207,7 @@ struct HfDataCreatorCharmHadPiReduced { //////////////////////////////////////////////////////////////////////////////////////////////////// // PROCESS FUNCTIONS FOR DATA - void processDplusPiData(soa::Join const& collisions, + void processDplusPiData(CollisionsWCent const& collisions, CandsDplusFiltered const& candsC, aod::TrackAssoc const& trackIndices, TracksPidWithSel const& tracks, @@ -1214,14 +1230,14 @@ struct HfDataCreatorCharmHadPiReduced { auto thisCollId = collision.globalIndex(); auto candsCThisColl = candsC.sliceBy(candsDplusPerCollision, thisCollId); auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); - runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, tracks, -1, bcs); + runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, tracks, -1, bcs); } // handle normalization by the right number of collisions hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); } PROCESS_SWITCH(HfDataCreatorCharmHadPiReduced, processDplusPiData, "Process DplusPi without MC info and without ML info", true); - void processDplusPiDataWithMl(soa::Join const& collisions, + void processDplusPiDataWithMl(CollisionsWCent const& collisions, CandsDplusFilteredWithMl const& candsC, aod::TrackAssoc const& trackIndices, TracksPidWithSel const& tracks, @@ -1244,14 +1260,74 @@ struct HfDataCreatorCharmHadPiReduced { auto thisCollId = collision.globalIndex(); auto candsCThisColl = candsC.sliceBy(candsDplusPerCollisionWithMl, thisCollId); auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); - runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, tracks, -1, bcs); + runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, tracks, -1, bcs); } // handle normalization by the right number of collisions hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); } PROCESS_SWITCH(HfDataCreatorCharmHadPiReduced, processDplusPiDataWithMl, "Process DplusPi without MC info and with ML info", false); - void processDsPiData(soa::Join const& collisions, + void processDplusPiDataWithQvec(CollisionsWCentAndQvectors const& collisions, + CandsDplusFiltered const& candsC, + aod::TrackAssoc const& trackIndices, + TracksPidWithSel const& tracks, + aod::BCsWithTimestamps const& bcs) + { + // store configurables needed for B0 workflow + if (!isHfCandBhadConfigFilled) { + rowCandidateConfigB0(selectionFlagDplus.value, invMassWindowCharmHadPi.value); + isHfCandBhadConfigFilled = true; + } + + int zvtxColl{0}; + int sel8Coll{0}; + int zvtxAndSel8Coll{0}; + int zvtxAndSel8CollAndSoftTrig{0}; + int allSelColl{0}; + for (const auto& collision : collisions) { + o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + + auto thisCollId = collision.globalIndex(); + auto candsCThisColl = candsC.sliceBy(candsDplusPerCollision, thisCollId); + auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); + runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, tracks, -1, bcs); + } + // handle normalization by the right number of collisions + hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); + } + PROCESS_SWITCH(HfDataCreatorCharmHadPiReduced, processDplusPiDataWithQvec, "Process DplusPi without MC info, without ML info and with Q-vectors", true); + + void processDplusPiDataWithMlAndQvec(CollisionsWCentAndQvectors const& collisions, + CandsDplusFilteredWithMl const& candsC, + aod::TrackAssoc const& trackIndices, + TracksPidWithSel const& tracks, + aod::BCsWithTimestamps const& bcs) + { + // store configurables needed for B0 workflow + if (!isHfCandBhadConfigFilled) { + rowCandidateConfigB0(selectionFlagDplus.value, invMassWindowCharmHadPi.value); + isHfCandBhadConfigFilled = true; + } + + int zvtxColl{0}; + int sel8Coll{0}; + int zvtxAndSel8Coll{0}; + int zvtxAndSel8CollAndSoftTrig{0}; + int allSelColl{0}; + for (const auto& collision : collisions) { + o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + + auto thisCollId = collision.globalIndex(); + auto candsCThisColl = candsC.sliceBy(candsDplusPerCollisionWithMl, thisCollId); + auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); + runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, tracks, -1, bcs); + } + // handle normalization by the right number of collisions + hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); + } + PROCESS_SWITCH(HfDataCreatorCharmHadPiReduced, processDplusPiDataWithMlAndQvec, "Process DplusPi without MC info, with ML info and with Q-vectors", false); + + void processDsPiData(CollisionsWCent const& collisions, CandsDsFiltered const& candsC, aod::TrackAssoc const& trackIndices, TracksPidWithSel const& tracks, @@ -1274,14 +1350,14 @@ struct HfDataCreatorCharmHadPiReduced { auto thisCollId = collision.globalIndex(); auto candsCThisColl = candsC.sliceBy(candsDplusPerCollision, thisCollId); auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); - runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, tracks, -1, bcs); + runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, tracks, -1, bcs); } // handle normalization by the right number of collisions hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); } PROCESS_SWITCH(HfDataCreatorCharmHadPiReduced, processDsPiData, "Process DsPi without MC info and without ML info", true); - void processDsPiDataWithMl(soa::Join const& collisions, + void processDsPiDataWithMl(CollisionsWCent const& collisions, CandsDsFilteredWithMl const& candsC, aod::TrackAssoc const& trackIndices, TracksPidWithSel const& tracks, @@ -1304,14 +1380,74 @@ struct HfDataCreatorCharmHadPiReduced { auto thisCollId = collision.globalIndex(); auto candsCThisColl = candsC.sliceBy(candsDplusPerCollisionWithMl, thisCollId); auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); - runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, tracks, -1, bcs); + runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, tracks, -1, bcs); } // handle normalization by the right number of collisions hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); } PROCESS_SWITCH(HfDataCreatorCharmHadPiReduced, processDsPiDataWithMl, "Process DsPi without MC info and with ML info", false); - void processD0PiData(soa::Join const& collisions, + void processDsPiDataWithQvec(CollisionsWCentAndQvectors const& collisions, + CandsDsFiltered const& candsC, + aod::TrackAssoc const& trackIndices, + TracksPidWithSel const& tracks, + aod::BCsWithTimestamps const& bcs) + { + // store configurables needed for Bs workflow + if (!isHfCandBhadConfigFilled) { + rowCandidateConfigBs(selectionFlagDs.value, invMassWindowCharmHadPi.value); + isHfCandBhadConfigFilled = true; + } + + int zvtxColl{0}; + int sel8Coll{0}; + int zvtxAndSel8Coll{0}; + int zvtxAndSel8CollAndSoftTrig{0}; + int allSelColl{0}; + for (const auto& collision : collisions) { + o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + + auto thisCollId = collision.globalIndex(); + auto candsCThisColl = candsC.sliceBy(candsDplusPerCollision, thisCollId); + auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); + runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, tracks, -1, bcs); + } + // handle normalization by the right number of collisions + hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); + } + PROCESS_SWITCH(HfDataCreatorCharmHadPiReduced, processDsPiDataWithQvec, "Process DsPi without MC info, without ML info and with Q-vectors", true); + + void processDsPiDataWithMlAndQvec(CollisionsWCentAndQvectors const& collisions, + CandsDsFilteredWithMl const& candsC, + aod::TrackAssoc const& trackIndices, + TracksPidWithSel const& tracks, + aod::BCsWithTimestamps const& bcs) + { + // store configurables needed for Bs workflow + if (!isHfCandBhadConfigFilled) { + rowCandidateConfigBs(selectionFlagDs.value, invMassWindowCharmHadPi.value); + isHfCandBhadConfigFilled = true; + } + + int zvtxColl{0}; + int sel8Coll{0}; + int zvtxAndSel8Coll{0}; + int zvtxAndSel8CollAndSoftTrig{0}; + int allSelColl{0}; + for (const auto& collision : collisions) { + o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + + auto thisCollId = collision.globalIndex(); + auto candsCThisColl = candsC.sliceBy(candsDplusPerCollisionWithMl, thisCollId); + auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); + runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, tracks, -1, bcs); + } + // handle normalization by the right number of collisions + hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); + } + PROCESS_SWITCH(HfDataCreatorCharmHadPiReduced, processDsPiDataWithMlAndQvec, "Process DsPi without MC info, with ML info and Q-vectors", false); + + void processD0PiData(CollisionsWCent const& collisions, CandsD0Filtered const& candsC, aod::TrackAssoc const& trackIndices, TracksPidWithSel const& tracks, @@ -1334,14 +1470,14 @@ struct HfDataCreatorCharmHadPiReduced { auto thisCollId = collision.globalIndex(); auto candsCThisColl = candsC.sliceBy(candsD0PerCollision, thisCollId); auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); - runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, tracks, -1, bcs); + runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, tracks, -1, bcs); } // handle normalization by the right number of collisions hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); } PROCESS_SWITCH(HfDataCreatorCharmHadPiReduced, processD0PiData, "Process D0Pi without MC info and without ML info", false); - void processD0PiDataWithMl(soa::Join const& collisions, + void processD0PiDataWithMl(CollisionsWCent const& collisions, CandsD0FilteredWithMl const& candsC, aod::TrackAssoc const& trackIndices, TracksPidWithSel const& tracks, @@ -1364,17 +1500,77 @@ struct HfDataCreatorCharmHadPiReduced { auto thisCollId = collision.globalIndex(); auto candsCThisColl = candsC.sliceBy(candsD0PerCollisionWithMl, thisCollId); auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); - runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, tracks, -1, bcs); + runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, tracks, -1, bcs); } // handle normalization by the right number of collisions hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); } PROCESS_SWITCH(HfDataCreatorCharmHadPiReduced, processD0PiDataWithMl, "Process D0Pi without MC info and with ML info", false); + void processD0PiDataWithQvec(CollisionsWCentAndQvectors const& collisions, + CandsD0Filtered const& candsC, + aod::TrackAssoc const& trackIndices, + TracksPidWithSel const& tracks, + aod::BCsWithTimestamps const& bcs) + { + // store configurables needed for B+ workflow + if (!isHfCandBhadConfigFilled) { + rowCandidateConfigBplus(selectionFlagD0.value, selectionFlagD0bar.value, invMassWindowCharmHadPi.value); + isHfCandBhadConfigFilled = true; + } + + int zvtxColl{0}; + int sel8Coll{0}; + int zvtxAndSel8Coll{0}; + int zvtxAndSel8CollAndSoftTrig{0}; + int allSelColl{0}; + for (const auto& collision : collisions) { + o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + + auto thisCollId = collision.globalIndex(); + auto candsCThisColl = candsC.sliceBy(candsD0PerCollision, thisCollId); + auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); + runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, tracks, -1, bcs); + } + // handle normalization by the right number of collisions + hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); + } + PROCESS_SWITCH(HfDataCreatorCharmHadPiReduced, processD0PiDataWithQvec, "Process D0Pi without MC info, without ML info, and with Q-vectors", false); + + void processD0PiDataWithMlAndQvec(CollisionsWCentAndQvectors const& collisions, + CandsD0FilteredWithMl const& candsC, + aod::TrackAssoc const& trackIndices, + TracksPidWithSel const& tracks, + aod::BCsWithTimestamps const& bcs) + { + // store configurables needed for B+ workflow + if (!isHfCandBhadConfigFilled) { + rowCandidateConfigBplus(selectionFlagD0.value, selectionFlagD0bar.value, invMassWindowCharmHadPi.value); + isHfCandBhadConfigFilled = true; + } + + int zvtxColl{0}; + int sel8Coll{0}; + int zvtxAndSel8Coll{0}; + int zvtxAndSel8CollAndSoftTrig{0}; + int allSelColl{0}; + for (const auto& collision : collisions) { + o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + + auto thisCollId = collision.globalIndex(); + auto candsCThisColl = candsC.sliceBy(candsD0PerCollisionWithMl, thisCollId); + auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); + runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, tracks, -1, bcs); + } + // handle normalization by the right number of collisions + hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); + } + PROCESS_SWITCH(HfDataCreatorCharmHadPiReduced, processD0PiDataWithMlAndQvec, "Process D0Pi without MC info, with ML info, and with Q-vectors", false); + //////////////////////////////////////////////////////////////////////////////////////////////////// // PROCESS FUNCTIONS FOR MC - void processDplusPiMc(CollisionsWMcLabels const& collisions, + void processDplusPiMc(CollisionsWCentAndMcLabels const& collisions, CandsDplusFiltered const& candsC, aod::TrackAssoc const& trackIndices, TracksPidWithSelAndMc const& tracks, @@ -1401,7 +1597,7 @@ struct HfDataCreatorCharmHadPiReduced { auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); auto collsSameMcCollision = collisions.sliceBy(colPerMcCollision, collision.mcCollisionId()); int64_t indexCollisionMaxNumContrib = getIndexCollisionMaxNumContrib(collsSameMcCollision); - runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, particlesMc, indexCollisionMaxNumContrib, bcs); + runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, particlesMc, indexCollisionMaxNumContrib, bcs); } // handle normalization by the right number of collisions hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); @@ -1409,7 +1605,7 @@ struct HfDataCreatorCharmHadPiReduced { } PROCESS_SWITCH(HfDataCreatorCharmHadPiReduced, processDplusPiMc, "Process DplusPi with MC info and without ML info", false); - void processDplusPiMcWithMl(CollisionsWMcLabels const& collisions, + void processDplusPiMcWithMl(CollisionsWCentAndMcLabels const& collisions, CandsDplusFilteredWithMl const& candsC, aod::TrackAssoc const& trackIndices, TracksPidWithSelAndMc const& tracks, @@ -1436,7 +1632,7 @@ struct HfDataCreatorCharmHadPiReduced { auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); auto collsSameMcCollision = collisions.sliceBy(colPerMcCollision, collision.mcCollisionId()); int64_t indexCollisionMaxNumContrib = getIndexCollisionMaxNumContrib(collsSameMcCollision); - runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, particlesMc, indexCollisionMaxNumContrib, bcs); + runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, particlesMc, indexCollisionMaxNumContrib, bcs); } // handle normalization by the right number of collisions hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); @@ -1444,7 +1640,7 @@ struct HfDataCreatorCharmHadPiReduced { } PROCESS_SWITCH(HfDataCreatorCharmHadPiReduced, processDplusPiMcWithMl, "Process DplusPi with MC info and with ML info", false); - void processDsPiMc(CollisionsWMcLabels const& collisions, + void processDsPiMc(CollisionsWCentAndMcLabels const& collisions, CandsDsFiltered const& candsC, aod::TrackAssoc const& trackIndices, TracksPidWithSelAndMc const& tracks, @@ -1471,7 +1667,7 @@ struct HfDataCreatorCharmHadPiReduced { auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); auto collsSameMcCollision = collisions.sliceBy(colPerMcCollision, collision.mcCollisionId()); int64_t indexCollisionMaxNumContrib = getIndexCollisionMaxNumContrib(collsSameMcCollision); - runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, particlesMc, indexCollisionMaxNumContrib, bcs); + runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, particlesMc, indexCollisionMaxNumContrib, bcs); } // handle normalization by the right number of collisions hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); @@ -1479,7 +1675,7 @@ struct HfDataCreatorCharmHadPiReduced { } PROCESS_SWITCH(HfDataCreatorCharmHadPiReduced, processDsPiMc, "Process DsPi with MC info and without ML info", false); - void processDsPiMcWithMl(CollisionsWMcLabels const& collisions, + void processDsPiMcWithMl(CollisionsWCentAndMcLabels const& collisions, CandsDsFilteredWithMl const& candsC, aod::TrackAssoc const& trackIndices, TracksPidWithSelAndMc const& tracks, @@ -1506,7 +1702,7 @@ struct HfDataCreatorCharmHadPiReduced { auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); auto collsSameMcCollision = collisions.sliceBy(colPerMcCollision, collision.mcCollisionId()); int64_t indexCollisionMaxNumContrib = getIndexCollisionMaxNumContrib(collsSameMcCollision); - runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, particlesMc, indexCollisionMaxNumContrib, bcs); + runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, particlesMc, indexCollisionMaxNumContrib, bcs); } // handle normalization by the right number of collisions hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); @@ -1514,7 +1710,7 @@ struct HfDataCreatorCharmHadPiReduced { } PROCESS_SWITCH(HfDataCreatorCharmHadPiReduced, processDsPiMcWithMl, "Process DsPi with MC info and with ML info", false); - void processD0PiMc(CollisionsWMcLabels const& collisions, + void processD0PiMc(CollisionsWCentAndMcLabels const& collisions, CandsD0Filtered const& candsC, aod::TrackAssoc const& trackIndices, TracksPidWithSelAndMc const& tracks, @@ -1541,7 +1737,7 @@ struct HfDataCreatorCharmHadPiReduced { auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); auto collsSameMcCollision = collisions.sliceBy(colPerMcCollision, collision.mcCollisionId()); int64_t indexCollisionMaxNumContrib = getIndexCollisionMaxNumContrib(collsSameMcCollision); - runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, particlesMc, indexCollisionMaxNumContrib, bcs); + runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, particlesMc, indexCollisionMaxNumContrib, bcs); } // handle normalization by the right number of collisions hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); @@ -1549,7 +1745,7 @@ struct HfDataCreatorCharmHadPiReduced { } PROCESS_SWITCH(HfDataCreatorCharmHadPiReduced, processD0PiMc, "Process D0Pi with MC info and without ML info", false); - void processD0PiMcWithMl(CollisionsWMcLabels const& collisions, + void processD0PiMcWithMl(CollisionsWCentAndMcLabels const& collisions, CandsD0FilteredWithMl const& candsC, aod::TrackAssoc const& trackIndices, TracksPidWithSelAndMc const& tracks, @@ -1576,7 +1772,7 @@ struct HfDataCreatorCharmHadPiReduced { auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); auto collsSameMcCollision = collisions.sliceBy(colPerMcCollision, collision.mcCollisionId()); int64_t indexCollisionMaxNumContrib = getIndexCollisionMaxNumContrib(collsSameMcCollision); - runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, particlesMc, indexCollisionMaxNumContrib, bcs); + runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, particlesMc, indexCollisionMaxNumContrib, bcs); } // handle normalization by the right number of collisions hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); From 8c1ae9fe39cc81d2f458dbf9f1b4b35f35b05523 Mon Sep 17 00:00:00 2001 From: Antonio Palasciano <52152842+apalasciano@users.noreply.github.com> Date: Sat, 12 Apr 2025 09:45:49 +0200 Subject: [PATCH 0967/1650] [PWGHF,Trigger] Additional pT min cut on D0 from Lc* (#10826) Co-authored-by: ALICE Action Bot --- EventFiltering/PWGHF/HFFilter.cxx | 8 +++++++- EventFiltering/PWGHF/HFFilterHelpers.h | 7 ++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/EventFiltering/PWGHF/HFFilter.cxx b/EventFiltering/PWGHF/HFFilter.cxx index 290ba19c1c5..f84202e394e 100644 --- a/EventFiltering/PWGHF/HFFilter.cxx +++ b/EventFiltering/PWGHF/HFFilter.cxx @@ -109,7 +109,7 @@ struct HfFilter { // Main struct for HF triggers // parameters for resonance triggers Configurable> cutsGammaK0sLambda{"cutsGammaK0sLambda", {cutsV0s[0], 1, 6, labelsEmpty, labelsColumnsV0s}, "Selections for V0s (gamma, K0s, Lambda) for D+V0 triggers"}; - Configurable> cutsPtDeltaMassCharmReso{"cutsPtDeltaMassCharmReso", {cutsCharmReso[0], 3, 13, labelsRowsDeltaMassCharmReso, labelsColumnsDeltaMassCharmReso}, "pt (GeV/c) and invariant-mass delta (GeV/c2) for charm hadron resonances"}; + Configurable> cutsPtDeltaMassCharmReso{"cutsPtDeltaMassCharmReso", {cutsCharmReso[0], 4, 13, labelsRowsDeltaMassCharmReso, labelsColumnsDeltaMassCharmReso}, "pt (GeV/c) and invariant-mass delta (GeV/c2) for charm hadron resonances"}; Configurable keepAlsoWrongDmesLambdaPairs{"keepAlsoWrongDmesLambdaPairs", true, "flat go keep also wrong sign D+Lambda pairs"}; Configurable keepAlsoWrongDmesProtonPairs{"keepAlsoWrongDmesProtonPairs", true, "flat go keep also wrong sign D0p pairs"}; Configurable keepAlsoWrongDstarMesProtonPairs{"keepAlsoWrongDstarMesProtonPairs", true, "flat go keep also wrong sign D*0p pairs"}; @@ -971,6 +971,9 @@ struct HfFilter { // Main struct for HF triggers } auto isTrackSelected = helper.isSelectedTrackForSoftPionOrBeauty(trackBachelor, trackParBachelor, dcaBachelor); if (TESTBIT(isTrackSelected, kSoftPion) && ((TESTBIT(selD0InMass, 0) && trackBachelor.sign() > 0) || (TESTBIT(selD0InMass, 1) && trackBachelor.sign() < 0))) { + if (pt2Prong < cutsPtDeltaMassCharmReso->get(3u, 12u)) { + continue; + } std::array massDausD0{massPi, massKa}; auto massD0dau = massD0Cand; if (trackBachelor.sign() < 0) { @@ -1034,6 +1037,9 @@ struct HfFilter { // Main struct for HF triggers } } // end bachelor pion for D*p pairs // build D0p candidate with the possibility of storing also the other sign hyp. + if (pt2Prong < cutsPtDeltaMassCharmReso->get(3u, 11u)) { + continue; + } float massLcStarCand{-999.}, massLcStarBarCand{-999.}; float massDiffLcStarCand{-999.}, massDiffLcStarBarCand{-999.}; bool isRightSignLcStar{false}, isRightSignLcStarBar{false}; diff --git a/EventFiltering/PWGHF/HFFilterHelpers.h b/EventFiltering/PWGHF/HFFilterHelpers.h index 219910cd836..2f451e787ae 100644 --- a/EventFiltering/PWGHF/HFFilterHelpers.h +++ b/EventFiltering/PWGHF/HFFilterHelpers.h @@ -349,11 +349,12 @@ static const std::vector labelsColumnsDoubleCharmChannels = {"Doubl static const std::vector labelsRowsDoubleCharmChannels = {"", "KeepNonprompt"}; // charm resonances -constexpr float cutsCharmReso[3][13] = {{0.0, 0.0, 0.0, 0.0, 0.4, 0., 0.0, 0.00, 0.21, 0.21, 0.0, 0.7, 0.7}, +constexpr float cutsCharmReso[4][13] = {{0.0, 0.0, 0.0, 0.0, 0.4, 0., 0.0, 0.00, 0.21, 0.21, 0.0, 0.7, 0.7}, {0.155, 0.3, 0.3, 0.88, 0.88, 1.35, 0.18, 0.18, 0.25, 0.25, 0.8, 1.3, 1.3}, - {0.0, 0.0, 0.0, 0.0, 5.0, 0.0, 0.0, 6.0, 0.0, 6.0, 0.0, 0.0, 0.0}}; // D*+, D*0, Ds*0, Ds1+, Ds2*+, Xic*->D, SigmaC0, SigmaC++, SigmaC(2520)0, SigmaC(2520)++, Xic*->SigmaC, Lc*->D0P, Lc*->D*+P + {0.0, 0.0, 0.0, 0.0, 5.0, 0.0, 0.0, 6.0, 0.0, 6.0, 0.0, 0.0, 0.0}, + {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; // D*+, D*0, Ds*0, Ds1+, Ds2*+, Xic*->D, SigmaC0, SigmaC++, SigmaC(2520)0, SigmaC(2520)++, Xic*->SigmaC, Lc*->D0P, Lc*->D*+P static const std::vector labelsColumnsDeltaMassCharmReso = {"DstarPlus", "DstarZero", "DsStarZero", "Ds1Plus", "Ds2StarPlus", "XicResoToD", "SigmaC0", "SigmaCPlusPlus", "SigmaC02520", "SigmaCPlusPlus2520", "XicResoToSigmaC", "LcResoToD0Pr", "ThetaC"}; -static const std::vector labelsRowsDeltaMassCharmReso = {"deltaMassMin", "deltaMassMax", "ptMin"}; +static const std::vector labelsRowsDeltaMassCharmReso = {"deltaMassMin", "deltaMassMax", "ptMin", "ptMinCharmDaugh"}; // V0s for charm resonances constexpr float cutsV0s[1][6] = {{0.85, 0.97, 0.5, 4., 0.02, 0.01}}; // cosPaGamma, cosPaK0sLambda, radiusK0sLambda, nSigmaPrLambda, deltaMassK0S, deltaMassLambda static const std::vector labelsColumnsV0s = {"CosPaGamma", "CosPaK0sLambda", "RadiusK0sLambda", "NSigmaPrLambda", "DeltaMassK0s", "DeltaMassLambda"}; From 8c2c7b566815e518c30fb750d926808f1138ff52 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Sat, 12 Apr 2025 11:18:31 +0200 Subject: [PATCH 0968/1650] [PWGEM/Dilepton] remove unnecessary histogram (#10827) --- PWGEM/Dilepton/Tasks/matchingMFT.cxx | 9 --------- 1 file changed, 9 deletions(-) diff --git a/PWGEM/Dilepton/Tasks/matchingMFT.cxx b/PWGEM/Dilepton/Tasks/matchingMFT.cxx index b5e71cf7837..2892d0284ad 100644 --- a/PWGEM/Dilepton/Tasks/matchingMFT.cxx +++ b/PWGEM/Dilepton/Tasks/matchingMFT.cxx @@ -146,7 +146,6 @@ struct matchingMFT { fRegistry.add("MFTMCHMID/primary/correct/hPt", "pT;p_{T} (GeV/c)", kTH1F, {{100, 0.0f, 10}}, false); fRegistry.add("MFTMCHMID/primary/correct/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {100, -6.f, -1.f}}, false); fRegistry.add("MFTMCHMID/primary/correct/hEtaPhi_MatchedMCHMID", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {100, -6.f, -1.f}}, false); - fRegistry.add("MFTMCHMID/primary/correct/hDeltaEtaDeltaPhi", "#Delta#eta vs. #Delta#varphi;#Delta#varphi = #varphi_{sa} - #varphi_{gl} (rad.);#Delta#eta = #eta_{sa} - #eta_{gl}", kTH2F, {{180, -M_PI, M_PI}, {400, -2.f, 2.f}}, false); fRegistry.add("MFTMCHMID/primary/correct/hDiffCollId", "difference in collision index;collisionId_{TTCA} - collisionId_{MP}", kTH1F, {{41, -20.5, +20.5}}, false); fRegistry.add("MFTMCHMID/primary/correct/hSign", "sign;sign", kTH1F, {{3, -1.5, +1.5}}, false); fRegistry.add("MFTMCHMID/primary/correct/hNclusters", "Nclusters;Nclusters", kTH1F, {{21, -0.5f, 20.5}}, false); @@ -283,17 +282,12 @@ struct matchingMFT { return; } - float deta = etaMatchedMCHMID - eta; - float dphi = phiMatchedMCHMID - phi; - o2::math_utils::bringToPMPi(dphi); - fRegistry.fill(HIST("hMuonType"), fwdtrack.trackType()); if (isPrimary) { if (isMatched) { fRegistry.fill(HIST("MFTMCHMID/primary/correct/hPt"), pt); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hEtaPhi"), phi, eta); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); - fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDeltaEtaDeltaPhi"), dphi, deta); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hSign"), fwdtrack.sign()); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hNclusters"), fwdtrack.nClusters()); @@ -322,7 +316,6 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hPt"), pt); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hEtaPhi"), phi, eta); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); - fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDeltaEtaDeltaPhi"), dphi, deta); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hSign"), fwdtrack.sign()); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hNclusters"), fwdtrack.nClusters()); @@ -353,7 +346,6 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hPt"), pt); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hEtaPhi"), phi, eta); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); - fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDeltaEtaDeltaPhi"), dphi, deta); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hSign"), fwdtrack.sign()); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hNclusters"), fwdtrack.nClusters()); @@ -382,7 +374,6 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hPt"), pt); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hEtaPhi"), phi, eta); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); - fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDeltaEtaDeltaPhi"), dphi, deta); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hSign"), fwdtrack.sign()); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hNclusters"), fwdtrack.nClusters()); From 180129a6b124e635eae40d3786bff8e236c4ccc1 Mon Sep 17 00:00:00 2001 From: arvindkhuntia <31609955+arvindkhuntia@users.noreply.github.com> Date: Sat, 12 Apr 2025 19:42:01 +0200 Subject: [PATCH 0969/1650] [PWGJE] Histograms for MC study (#10818) Co-authored-by: Arvind Khuntia --- PWGJE/Tasks/nucleiInJets.cxx | 114 +++++++++++++++++++++++++++-------- 1 file changed, 90 insertions(+), 24 deletions(-) diff --git a/PWGJE/Tasks/nucleiInJets.cxx b/PWGJE/Tasks/nucleiInJets.cxx index e6d7c6f197f..150824d438b 100644 --- a/PWGJE/Tasks/nucleiInJets.cxx +++ b/PWGJE/Tasks/nucleiInJets.cxx @@ -17,6 +17,7 @@ #include #include #include +#include #include #include "Framework/ASoA.h" @@ -100,7 +101,6 @@ struct nucleiInJets { } Configurable cfgtrackSelections{"cfgtrackSelections", "globalTracks", "set track selections"}; - Configurable isMC{"isMC", false, "flag for the MC"}; Configurable isWithJetEvents{"isWithJetEvents", true, "Events with at least one jet"}; Configurable isWithLeadingJet{"isWithLeadingJet", true, "Events with leading jet"}; @@ -143,6 +143,8 @@ struct nucleiInJets { Configurable useLeadingJetDetLevelValue{"useLeadingJetDetLevelValue", false, "true: use det level value for leading jet, false: use part level value"}; Configurable useDcaxyPtDepCut{"useDcaxyPtDepCut", true, "true: use pt dependent DCAxy cut, false: use constant DCAxy cut"}; Configurable useTOFNsigmaPreSel{"useTOFNsigmaPreSel", true, "true: use TOF nsgma preselection, false: no TOF nsgma preselection"}; + Configurable isRequireHitsInITSLayers{"isRequireHitsInITSLayers", true, "true: at least one hit in the its inner layes"}; + Configurable useMcC{"useMcC", true, "use mcC"}; Configurable addpik{"addpik", true, "add pion and kaon hist"}; ConfigurableAxis binsDCA{"binsDCA", {400, -1.f, 1.f}, ""}; @@ -191,8 +193,8 @@ struct nucleiInJets { Zorro zorro; OutputObj zorroSummary{"zorroSummary"}; - Service ccdb; + TRandom3 randUniform; void init(o2::framework::InitContext&) { @@ -200,7 +202,6 @@ struct nucleiInJets { if (doprocessJetTracksData && doprocessJetTracksDataLfPid) { LOGP(fatal, "only one process function should be enabled!!!"); } - const AxisSpec PtAxis = {100, 0, 10.0}; const AxisSpec PtJetAxis = {100, 0, 100.0}; const AxisSpec MultAxis = {100, 0, 100}; @@ -349,6 +350,12 @@ struct nucleiInJets { jetHist.add("tracks/antiTriton/h2TofNsigmaantiTritonVsPt_jet", "h2TofNsigmaantiTritonVsPt_jet; TofNsigma; #it{p}_{T} (GeV)", HistType::kTH2F, {{100, -5, 5}, {50, 0., 5.}}); jetHist.add("tracks/helium/h2TofNsigmaHeliumVsPt_jet", "h2TofNsigmaHeliumVsPt_jet; TofNsigma; #it{p}_{T}/z (GeV)", HistType::kTH2F, {{100, -5, 5}, {50, 0., 5.}}); jetHist.add("tracks/antiHelium/h2TofNsigmaantiHeliumVsPt_jet", "h2TofNsigmaantiHeliumVsPt_jet; TofNsigma; #it{p}_{T}/z (GeV)", HistType::kTH2F, {{100, -5, 5}, {50, 0., 5.}}); + + jetHist.add("tracks/proton/h3TpcNsigmaTofNsigmaProtonVsPt_jet", "h3TpcNsigmaTofNsigmaProtonVsPt_jet; TpcNsigma; TofNsigma; #it{p}_{T} (GeV)", HistType::kTH3F, {{100, -5., 5.}, {100, -5., 5.}, {50, 0., 5.}}); + jetHist.add("tracks/antiProton/h3TpcNsigmaTofNsigmaantiProtonVsPt_jet", "h3TpcNsigmaTofNsigmaantiProtonVsPt_jet; TpcNsigma; TofNsigma; #it{p}_{T} (GeV)", HistType::kTH3F, {{100, -5., 5.}, {100, -5., 5.}, {50, 0., 5.}}); + jetHist.add("tracks/deuteron/h3TpcNsigmaTofNsigmaDeuteronVsPt_jet", "h3TpcNsigmaTofNsigmaDeuteronVsPt_jet; TpcNsigma; TofNsigma; #it{p}_{T} (GeV)", HistType::kTH3F, {{100, -5., 5.}, {100, -5., 5.}, {50, 0., 5.}}); + jetHist.add("tracks/antiDeuteron/h3TpcNsigmaTofNsigmaantiDeuteronVsPt_jet", "h3TpcNsigmaTofNsigmaantiDeuteronVsPt_jet; TpcNsigma; TofNsigma; #it{p}_{T} (GeV)", HistType::kTH3F, {{100, -5., 5.}, {100, -5., 5.}, {50, 0., 5.}}); + ///////////// // perp cone ///////////// @@ -521,20 +528,28 @@ struct nucleiInJets { // rec matched jetHist.add("recmatched/hRecMatchedJetPt", "matched jet pT (Rec level);#it{p}_{T,jet part} (GeV/#it{c}); #it{p}_{T,jet part} - #it{p}_{T,jet det}", HistType::kTH2F, {{100, 0., 100.}, {400, -20., 20.}}); + jetHist.add("recmatched/hRecMatchedVsGenJetPtVsEta", "matched jet pT vs #eta (Rec level); #it{p}_{T,jet det}; #eta_{jet}", HistType::kTH2F, {{100, 0., 100.}, {200, -1., 1.}}); jetHist.add("recmatched/hRecMatchedJetPhi", "matched jet #varphi (Rec level);#varphi_{T,jet part}; #varphi_{jet part}-#varphi_{jet det}", HistType::kTH2F, {{700, 0., 7.}, {200, -5., 5.}}); jetHist.add("recmatched/hRecMatchedJetEta", "matched jet #eta (Rec level);#eta_{T,jet part}; #eta_{jet part}-#eta_{jet det} ", HistType::kTH2F, {{200, -1., 1.}, {500, -2.5, 2.5}}); - jetHist.add("recmatched/h2ResponseMatrix", "matched jet pT;#it{p}_{T} (true); #it{p}_{T} (measured)", HistType::kTH2F, {{40, 0., 100.}, {40, 0., 100.}}); + jetHist.add("recmatched/h2ResponseMatrix", "matched jet pT;#it{p}_{T} (mes.); #it{p}_{T} (true)", HistType::kTH2F, {{100, 0., 100.}, {100, 0., 100.}}); + jetHist.add("recmatched/h2ResponseMatrixLeadingJet", "matched jet rec pT vs true pt;#it{p}_{T} (mes.); #it{p}_{T} (true)", HistType::kTH2F, {{100, 0., 100.}, {100, 0., 100.}}); + jetHist.add("recmatched/mcC/h2ResponseMatrixLeadingJet", "matched jet rec pT vs true pt;#it{p}_{T} (mes.); #it{p}_{T} (true)", HistType::kTH2F, {{100, 0., 100.}, {100, 0., 100.}}); + ///////// jetHist.add("recmatched/hRecJetPt", "matched jet pT (Rec level);#it{p}_{T,jet part} (GeV/#it{c}); #it{p}_{T,jet part} - #it{p}_{T,jet det}", HistType::kTH1F, {{100, 0., 100.}}); jetHist.add("recmatched/hGenJetPt", "matched jet pT (Rec level);#it{p}_{T,jet part} (GeV/#it{c}); #it{p}_{T,jet part} - #it{p}_{T,jet det}", HistType::kTH1F, {{100, 0., 100.}}); jetHist.add("recmatched/pt/PtParticleType", "Pt (p) vs jetflag vs particletype", HistType::kTH3D, {{100, 0.f, 10.f}, {2, 0, 2}, {14, -7, 7}}); jetHist.add("eff/recmatched/pt/PtParticleType", "Pt (p) vs jetflag vs particletype", HistType::kTH3D, {{100, 0.f, 10.f}, {2, 0, 2}, {14, -7, 7}}); + jetHist.add("eff/recmatched/mcC/pt/PtParticleType", "Pt (pt, rec) vs Pt (pt, true) vs particletype", HistType::kTH3D, {{100, 0.f, 10.f}, {100, 0.f, 10.f}, {14, -7, 7}}); + jetHist.add("eff/recmatched/mcCSpectra/pt/PtParticleType", "Pt (pt) vs Pt (pt, true) vs particletype", HistType::kTH3D, {{100, 0.f, 10.f}, {100, 0.f, 10.f}, {14, -7, 7}}); jetHist.add("eff/recmatched/pt/PtParticleTypeTPC", "Pt (p) vs jetflag vs particletype", HistType::kTH3D, {{100, 0.f, 10.f}, {2, 0, 2}, {14, -7, 7}}); jetHist.add("eff/recmatched/pt/PtParticleTypeTOF", "Pt (p) vs jetflag vs particletype", HistType::kTH3D, {{100, 0.f, 10.f}, {2, 0, 2}, {14, -7, 7}}); jetHist.add("eff/recmatched/pt/PtParticleTypeTPCTOF", "Pt (p) vs jetflag vs particletype", HistType::kTH3D, {{100, 0.f, 10.f}, {2, 0, 2}, {14, -7, 7}}); jetHist.add("eff/recmatched/perpCone/pt/PtParticleType", "Pt (p) vs particletype", HistType::kTH2D, {{100, 0.f, 10.f}, {14, -7, 7}}); + jetHist.add("eff/recmatched/perpCone/mcC/pt/PtParticleType", "Pt (rec) vs Pt (true) vs particletype", HistType::kTH3D, {{100, 0.f, 10.f}, {100, 0.f, 10.f}, {14, -7, 7}}); + jetHist.add("eff/recmatched/perpCone/mcCSpectra/pt/PtParticleType", "Pt (rec) vs Pt (true) vs particletype", HistType::kTH3D, {{100, 0.f, 10.f}, {100, 0.f, 10.f}, {14, -7, 7}}); jetHist.add("eff/recmatched/perpCone/pt/PtParticleTypeTPC", "Pt (p) vs particletype", HistType::kTH2D, {{100, 0.f, 10.f}, {14, -7, 7}}); jetHist.add("eff/recmatched/perpCone/pt/PtParticleTypeTOF", "Pt (p) vs particletype", HistType::kTH2D, {{100, 0.f, 10.f}, {14, -7, 7}}); jetHist.add("eff/recmatched/perpCone/pt/PtParticleTypeTPCTOF", "Pt (p) vs particletype", HistType::kTH2D, {{100, 0.f, 10.f}, {14, -7, 7}}); @@ -543,6 +558,10 @@ struct nucleiInJets { jetHist.add("eff/recmatched/gen/perpCone/pt/PtParticleType", "Pt (p) vs particletype", HistType::kTH2D, {{100, 0.f, 10.f}, {14, -7, 7}}); // gen matched jetHist.add("genmatched/hRecMatchedJetPt", "matched jet pT (Rec level);#it{p}_{T,jet part} (GeV/#it{c}); #it{p}_{T,jet part} - #it{p}_{T,jet det}", HistType::kTH2F, {{100, 0., 100.}, {400, -20., 20.}}); + jetHist.add("genmatched/hRecMatchedVsGenJetPt", "matched jet pT (Rec level);#it{p}_{T,jet det}; #it{p}_{T,jet part} (GeV/#it{c})", HistType::kTH2F, {{100, 0., 100.}, {100, 0., 100.}}); + jetHist.add("genmatched/mcC/hRecMatchedVsGenJetPt", "matched jet pT (Rec level); #it{p}_{T,jet det}; #it{p}_{T,jet part} (GeV/#it{c})", HistType::kTH2F, {{100, 0., 100.}, {100, 0., 100.}}); + jetHist.add("genmatched/hRecMatchedVsGenJetPtVsEta", "matched jet pT (Rec level) vs Eta (rec); #it{p}_{T,jet} ; #eta_{jet}", HistType::kTH2F, {{100, 0., 100.}, {200, -1., 1.}}); + jetHist.add("genmatched/hRecMatchedJetPhi", "matched jet #varphi (Rec level);#varphi_{T,jet part}; #varphi_{jet part}-#varphi_{jet det}", HistType::kTH2F, {{700, 0., 7.}, {200, -5., 5.}}); jetHist.add("genmatched/hRecMatchedJetEta", "matched jet #eta (Rec level);#eta_{T,jet part}; #eta_{jet part}-#eta_{jet det} ", HistType::kTH2F, {{200, -1., 1.}, {500, -2.5, 2.5}}); jetHist.add("genmatched/hRecJetPt", "matched jet pT (Rec level);#it{p}_{T,jet part} (GeV/#it{c}); #it{p}_{T,jet part} - #it{p}_{T,jet det}", HistType::kTH1F, {{100, 0., 100.}}); @@ -574,7 +593,14 @@ struct nucleiInJets { float dcaXYPtDepCut(float trackPt) { - return 0.0105f + 0.0350f / pow(trackPt, 1.1f); + return 0.0105f + 0.0350f / std::pow(trackPt, 1.1f); + } + + // Check hits on ITS Layers + bool hasHitOnITSLayer(uint8_t itsClsmap, int layer) + { + unsigned char test_bit = 1 << layer; + return (itsClsmap & test_bit); } template @@ -583,13 +609,21 @@ struct nucleiInJets { // standard track selection if (track.pt() < cfgtrkMinPt) return false; - if (std::abs(track.eta()) > cfgtrkMaxEta) + if (isRequireHitsInITSLayers) { + if (!track.hasITS()) + return false; + if (!hasHitOnITSLayer(track.itsClusterMap(), 0) && + !hasHitOnITSLayer(track.itsClusterMap(), 1) && + !hasHitOnITSLayer(track.itsClusterMap(), 2)) + return false; + } + if (std::fabs(track.eta()) > cfgtrkMaxEta) return false; - if (std::abs(track.dcaXY()) > cfgMaxDCArToPVcut && !useDcaxyPtDepCut) + if (std::fabs(track.dcaXY()) > cfgMaxDCArToPVcut && !useDcaxyPtDepCut) return false; - if (std::abs(track.dcaXY()) > dcaXYPtDepCut(track.pt()) && useDcaxyPtDepCut) + if (std::fabs(track.dcaXY()) > dcaXYPtDepCut(track.pt()) && useDcaxyPtDepCut) return false; - if (std::abs(track.dcaZ()) > cfgMaxDCAzToPVcut) + if (std::fabs(track.dcaZ()) > cfgMaxDCAzToPVcut) return false; if (track.tpcNClsFindable() < cfgnFindableTPCClusters) return false; @@ -664,13 +698,13 @@ struct nucleiInJets { } if (useTOFNsigmaPreSel && trk.hasTOF()) { - if (std::abs(trk.tofNSigmaPr()) < cfgnTPCPIDPrTOF) + if (std::fabs(trk.tofNSigmaPr()) < cfgnTPCPIDPrTOF) jetHist.fill(HIST("tracks/proton/h3PtVsProtonNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaPr(), jetPt); - if (std::abs(trk.tofNSigmaDe()) < cfgnTPCPIDDeTOF) + if (std::fabs(trk.tofNSigmaDe()) < cfgnTPCPIDDeTOF) jetHist.fill(HIST("tracks/deuteron/h3PtVsDeuteronNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaDe(), jetPt); - if (std::abs(trk.tofNSigmaHe()) < cfgnTPCPIDHeTOF) + if (std::fabs(trk.tofNSigmaHe()) < cfgnTPCPIDHeTOF) jetHist.fill(HIST("tracks/helium/h3PtVsHeliumNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaHe(), jetPt); - if (std::abs(trk.tofNSigmaTr()) < cfgnTPCPIDTrTOF) + if (std::fabs(trk.tofNSigmaTr()) < cfgnTPCPIDTrTOF) jetHist.fill(HIST("tracks/triton/h3PtVsTritonNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaTr(), jetPt); } else if (!useTOFNsigmaPreSel) { jetHist.fill(HIST("tracks/proton/h3PtVsProtonNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaPr(), jetPt); @@ -678,7 +712,6 @@ struct nucleiInJets { jetHist.fill(HIST("tracks/helium/h3PtVsHeliumNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaHe(), jetPt); jetHist.fill(HIST("tracks/triton/h3PtVsTritonNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaTr(), jetPt); } - if (cEnableProtonQA && std::abs(trk.tpcNSigmaPr()) < cfgnTPCPIDPr) { jetHist.fill(HIST("tracks/proton/dca/after/hDCAxyVsPtProton_jet"), trk.dcaXY(), trk.pt()); jetHist.fill(HIST("tracks/proton/dca/after/hDCAzVsPtProton_jet"), trk.dcaZ(), trk.pt()); @@ -710,18 +743,20 @@ struct nucleiInJets { jetHist.fill(HIST("tracks/deuteron/h2TofNsigmaDeuteronVsPt_jet"), trk.tofNSigmaDe(), trk.pt()); jetHist.fill(HIST("tracks/helium/h2TofNsigmaHeliumVsPt_jet"), trk.tofNSigmaHe(), trk.pt()); jetHist.fill(HIST("tracks/triton/h2TofNsigmaTritonVsPt_jet"), trk.tofNSigmaTr(), trk.pt()); - + jetHist.fill(HIST("tracks/proton/h3TpcNsigmaTofNsigmaProtonVsPt_jet"), trk.tpcNSigmaPr(), trk.tofNSigmaPr(), trk.pt()); + jetHist.fill(HIST("tracks/deuteron/h3TpcNsigmaTofNsigmaDeuteronVsPt_jet"), trk.tpcNSigmaDe(), trk.tofNSigmaDe(), trk.pt()); } else { if (trk.tpcNSigmaPr() < useTPCpreSel) { jetHist.fill(HIST("tracks/proton/h2TOFmassProtonVsPt_jet"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/proton/h2TOFmass2ProtonVsPt_jet"), massTOF * massTOF - gMassProton * gMassProton, trk.pt()); jetHist.fill(HIST("tracks/proton/h2TofNsigmaProtonVsPt_jet"), trk.tofNSigmaPr(), trk.pt()); + jetHist.fill(HIST("tracks/proton/h3TpcNsigmaTofNsigmaProtonVsPt_jet"), trk.tpcNSigmaPr(), trk.tofNSigmaPr(), trk.pt()); } - if (trk.tpcNSigmaDe() < useTPCpreSel) { jetHist.fill(HIST("tracks/deuteron/h2TOFmassDeuteronVsPt_jet"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/deuteron/h2TOFmass2DeuteronVsPt_jet"), massTOF * massTOF - gMassDeuteron * gMassDeuteron, trk.pt()); jetHist.fill(HIST("tracks/deuteron/h2TofNsigmaDeuteronVsPt_jet"), trk.tofNSigmaDe(), trk.pt()); + jetHist.fill(HIST("tracks/deuteron/h3TpcNsigmaTofNsigmaDeuteronVsPt_jet"), trk.tpcNSigmaDe(), trk.tofNSigmaDe(), trk.pt()); } if (trk.tpcNSigmaTr() < useTPCpreSel) { jetHist.fill(HIST("tracks/triton/h2TOFmassTritonVsPt_jet"), massTOF, trk.pt()); @@ -786,10 +821,12 @@ struct nucleiInJets { jetHist.fill(HIST("tracks/antiProton/h2TOFmassantiProtonVsPt_jet"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/antiProton/h2TOFmass2antiProtonVsPt_jet"), massTOF * massTOF - gMassProton * gMassProton, trk.pt()); jetHist.fill(HIST("tracks/antiProton/h2TofNsigmaantiProtonVsPt_jet"), trk.tofNSigmaPr(), trk.pt()); + jetHist.fill(HIST("tracks/antiProton/h3TpcNsigmaTofNsigmaantiProtonVsPt_jet"), trk.tpcNSigmaPr(), trk.tofNSigmaPr(), trk.pt()); jetHist.fill(HIST("tracks/antiDeuteron/h2TOFmassantiDeuteronVsPt_jet"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/antiDeuteron/h2TOFmass2antiDeuteronVsPt_jet"), massTOF * massTOF - gMassDeuteron * gMassDeuteron, trk.pt()); jetHist.fill(HIST("tracks/antiDeuteron/h2TofNsigmaantiDeuteronVsPt_jet"), trk.tofNSigmaDe(), trk.pt()); + jetHist.fill(HIST("tracks/antiDeuteron/h3TpcNsigmaTofNsigmaantiDeuteronVsPt_jet"), trk.tpcNSigmaDe(), trk.tofNSigmaDe(), trk.pt()); jetHist.fill(HIST("tracks/antiTriton/h2TOFmassantiTritonVsPt_jet"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/antiTriton/h2TOFmass2antiTritonVsPt_jet"), massTOF * massTOF - gMassTriton * gMassTriton, trk.pt()); @@ -803,11 +840,13 @@ struct nucleiInJets { jetHist.fill(HIST("tracks/antiProton/h2TOFmassantiProtonVsPt_jet"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/antiProton/h2TOFmass2antiProtonVsPt_jet"), massTOF * massTOF - gMassProton * gMassProton, trk.pt()); jetHist.fill(HIST("tracks/antiProton/h2TofNsigmaantiProtonVsPt_jet"), trk.tofNSigmaPr(), trk.pt()); + jetHist.fill(HIST("tracks/antiProton/h3TpcNsigmaTofNsigmaantiProtonVsPt_jet"), trk.tpcNSigmaPr(), trk.tofNSigmaPr(), trk.pt()); } if (trk.tpcNSigmaDe() < useTPCpreSel) { jetHist.fill(HIST("tracks/antiDeuteron/h2TOFmassantiDeuteronVsPt_jet"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/antiDeuteron/h2TOFmass2antiDeuteronVsPt_jet"), massTOF * massTOF - gMassDeuteron * gMassDeuteron, trk.pt()); jetHist.fill(HIST("tracks/antiDeuteron/h2TofNsigmaantiDeuteronVsPt_jet"), trk.tofNSigmaDe(), trk.pt()); + jetHist.fill(HIST("tracks/antiDeuteron/h3TpcNsigmaTofNsigmaantiDeuteronVsPt_jet"), trk.tpcNSigmaDe(), trk.tofNSigmaDe(), trk.pt()); } if (trk.tpcNSigmaTr() < useTPCpreSel) { jetHist.fill(HIST("tracks/antiTriton/h2TOFmassantiTritonVsPt_jet"), massTOF, trk.pt()); @@ -1313,11 +1352,9 @@ struct nucleiInJets { for (auto& mcdjet : mcdjets) { if (!mcdjet.has_matchedJetGeo()) continue; - // LOG(info)<<" jet pT "<()) { if (!mcpjet.has_matchedJetGeo()) continue; - // LOG(info)<<" jet pT(part.) "< Date: Sun, 13 Apr 2025 00:05:43 +0200 Subject: [PATCH 0970/1650] [PWGHF,Trigger] Add Bc decay to D0K into the HF filter (#10820) --- EventFiltering/PWGHF/HFFilter.cxx | 96 ++++++++++++++++---------- EventFiltering/PWGHF/HFFilterHelpers.h | 12 +++- 2 files changed, 69 insertions(+), 39 deletions(-) diff --git a/EventFiltering/PWGHF/HFFilter.cxx b/EventFiltering/PWGHF/HFFilter.cxx index f84202e394e..a0830524997 100644 --- a/EventFiltering/PWGHF/HFFilter.cxx +++ b/EventFiltering/PWGHF/HFFilter.cxx @@ -88,14 +88,17 @@ struct HfFilter { // Main struct for HF triggers Configurable paramCharmMassShape{"paramCharmMassShape", "2023_pass3", "Parametrisation of charm-hadron mass shape (options: 2023_pass3)"}; Configurable numSigmaDeltaMassCharmHad{"numSigmaDeltaMassCharmHad", 2.5, "Number of sigma for charm-hadron delta mass cut in B and D resonance triggers"}; Configurable> pTBinsBHadron{"pTBinsBHadron", std::vector{hf_trigger_cuts_presel_beauty::vecBinsPt}, "pT bin limits for beauty hadrons preselections"}; - Configurable> cutsBplus{"cutsBplus", {hf_trigger_cuts_presel_beauty::cuts[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, "B+ candidate selection per pT bin"}; - Configurable> cutsBzeroToDstar{"cutsBzeroToDstar", {hf_trigger_cuts_presel_beauty::cuts[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, "B0 -> D*+ candidate selection per pT bin"}; - Configurable> cutsBzero{"cutsBzero", {hf_trigger_cuts_presel_beauty::cuts[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, "B0 candidate selection per pT bin"}; - Configurable> cutsBs{"cutsBs", {hf_trigger_cuts_presel_beauty::cuts[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, "Bs candidate selection per pT bin"}; - Configurable> cutsLb{"cutsLb", {hf_trigger_cuts_presel_beauty::cuts[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, "Lb candidate selection per pT bin"}; - Configurable> cutsXib{"cutsXib", {hf_trigger_cuts_presel_beauty::cuts[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, "Xib candidate selection per pT bin"}; - Configurable> cutsBtoJPsiX{"cutsBtoJPsiX", {hf_trigger_cuts_presel_beauty::cutsBtoJPsi[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVarsBtoJPsi, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsCutsBeautyToJPsi}, "B->JPsiX candidate selection"}; + struct : o2::framework::ConfigurableGroup { + Configurable> cutsBplus{"cutsBplus", {hf_trigger_cuts_presel_beauty::cuts[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, "B+ candidate selection per pT bin"}; + Configurable> cutsBzeroToDstar{"cutsBzeroToDstar", {hf_trigger_cuts_presel_beauty::cuts[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, "B0 -> D*+ candidate selection per pT bin"}; + Configurable> cutsBzero{"cutsBzero", {hf_trigger_cuts_presel_beauty::cuts[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, "B0 candidate selection per pT bin"}; + Configurable> cutsBs{"cutsBs", {hf_trigger_cuts_presel_beauty::cuts[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, "Bs candidate selection per pT bin"}; + Configurable> cutsBc{"cutsBc", {hf_trigger_cuts_presel_beauty::cuts[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, "Bc candidate selection per pT bin"}; + Configurable> cutsLb{"cutsLb", {hf_trigger_cuts_presel_beauty::cuts[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, "Lb candidate selection per pT bin"}; + Configurable> cutsXib{"cutsXib", {hf_trigger_cuts_presel_beauty::cuts[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVars, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsTopolBeauty}, "Xib candidate selection per pT bin"}; + Configurable> cutsBtoJPsiX{"cutsBtoJPsiX", {hf_trigger_cuts_presel_beauty::cutsBtoJPsi[0], hf_trigger_cuts_presel_beauty::nBinsPt, hf_trigger_cuts_presel_beauty::nCutVarsBtoJPsi, hf_trigger_cuts_presel_beauty::labelsPt, hf_trigger_cuts_presel_beauty::labelsColumnsCutsBeautyToJPsi}, "B->JPsiX candidate selection"}; + } cutsBtoHadrons; // parameters for femto triggers Configurable femtoMaxRelativeMomentum{"femtoMaxRelativeMomentum", 2., "Maximal allowed value for relative momentum between charm-proton pairs in GeV/c"}; Configurable> enableFemtoChannels{"enableFemtoChannels", {activeFemtoChannels[0], 2, 5, labelsRowsFemtoChannels, labelsColumnsFemtoChannels}, "Flags to enable/disable femto channels"}; @@ -207,8 +210,8 @@ struct HfFilter { // Main struct for HF triggers helper.setPtLimitsLcResonanceBachelor(ptCuts->get(0u, 8u), ptCuts->get(1u, 8u)); helper.setCutsSingleTrackBeauty(cutsTrackBeauty3Prong, cutsTrackBeauty4Prong, cutsTrackBeauty4Prong); helper.setCutsSingleTrackCharmBaryonBachelor(cutsTrackCharmBaryonBachelor); - helper.setCutsBhadrons(cutsBplus, cutsBzeroToDstar, cutsBzero, cutsBs, cutsLb, cutsXib); - helper.setCutsBtoJPsi(cutsBtoJPsiX); + helper.setCutsBhadrons(cutsBtoHadrons.cutsBplus, cutsBtoHadrons.cutsBzeroToDstar, cutsBtoHadrons.cutsBc, cutsBtoHadrons.cutsBzero, cutsBtoHadrons.cutsBs, cutsBtoHadrons.cutsLb, cutsBtoHadrons.cutsXib); + helper.setCutsBtoJPsi(cutsBtoHadrons.cutsBtoJPsiX); helper.setNsigmaProtonCutsForFemto(std::array{nSigmaPidCuts->get(0u, 3u), nSigmaPidCuts->get(1u, 3u), nSigmaPidCuts->get(2u, 3u), nSigmaPidCuts->get(3u, 3u)}); helper.setNsigmaDeuteronCutsForFemto(std::array{nSigmaPidCuts->get(0u, 6u), nSigmaPidCuts->get(1u, 6u), nSigmaPidCuts->get(2u, 6u), nSigmaPidCuts->get(3u, 6u)}); helper.setNsigmaProtonCutsForCharmBaryons(nSigmaPidCuts->get(0u, 0u), nSigmaPidCuts->get(1u, 0u)); @@ -486,7 +489,7 @@ struct HfFilter { // Main struct for HF triggers auto pt2Prong = RecoDecay::pt(pVec2Prong); if (preselJPsiToMuMu) { - float ptMuonMin = cutsBtoJPsiX->get(0u, 0u); // assuming that the cut is looser in the first pT bin + float ptMuonMin = cutsBtoHadrons.cutsBtoJPsiX->get(0u, 0u); // assuming that the cut is looser in the first pT bin auto ptPos = RecoDecay::pt(pVecPos); auto ptNeg = RecoDecay::pt(pVecNeg); if (ptPos < ptMuonMin || ptNeg < ptMuonMin) { @@ -551,13 +554,20 @@ struct HfFilter { // Main struct for HF triggers // Beauty with D0 if (!keepEvent[kBeauty3P] && isD0BeautyTagged) { int16_t isTrackSelected = helper.isSelectedTrackForSoftPionOrBeauty(track, trackParThird, dcaThird); - if (TESTBIT(isTrackSelected, kForBeauty) && ((TESTBIT(selD0InMass, 0) && track.sign() < 0) || (TESTBIT(selD0InMass, 1) && track.sign() > 0))) { // D0 pi- and D0bar pi+ - auto massCand = RecoDecay::m(std::array{pVec2Prong, pVecThird}, std::array{massD0, massPi}); + if (TESTBIT(isTrackSelected, kForBeauty) && ((TESTBIT(selD0InMass, 0) && track.sign() < 0) || (TESTBIT(selD0InMass, 1) && track.sign() > 0))) { // D0 pi-/K- and D0bar pi+/K+ + auto massCandD0Pi = RecoDecay::m(std::array{pVec2Prong, pVecThird}, std::array{massD0, massPi}); + auto massCandD0K = RecoDecay::m(std::array{pVec2Prong, pVecThird}, std::array{massD0, massKa}); auto pVecBeauty3Prong = RecoDecay::pVec(pVec2Prong, pVecThird); auto ptCand = RecoDecay::pt(pVecBeauty3Prong); - if (TESTBIT(isTrackSelected, kForBeauty) && helper.isSelectedBhadronInMassRange(ptCand, massCand, kBplus)) { + bool isBplusInMass = helper.isSelectedBhadronInMassRange(ptCand, massCandD0Pi, kBplus); + bool isBcInMass = helper.isSelectedBhadronInMassRange(ptCand, massCandD0K, kBc); + + if (TESTBIT(isTrackSelected, kForBeauty) && (isBplusInMass || isBcInMass)) { if (activateQA) { - registry.fill(HIST("fHfVtxStages"), 1 + HfVtxStage::Skimmed, kBplus); + if (isBplusInMass) + registry.fill(HIST("fHfVtxStages"), 1 + HfVtxStage::Skimmed, kBplus); + if (isBcInMass) + registry.fill(HIST("fHfVtxStages"), 1 + HfVtxStage::Skimmed, kBc); } if (!activateSecVtxForB) { keepEvent[kBeauty3P] = true; @@ -566,7 +576,10 @@ struct HfFilter { // Main struct for HF triggers optimisationTreeBeauty(thisCollId, o2::constants::physics::Pdg::kD0, pt2Prong, scores[0], scores[1], scores[2], dcaThird[0]); } if (activateQA) { - hMassVsPtB[kBplus]->Fill(ptCand, massCand); + if (isBplusInMass) + hMassVsPtB[kBplus]->Fill(ptCand, massCandD0Pi); + if (isBcInMass) + hMassVsPtB[kBc]->Fill(ptCand, massCandD0K); } } else { df2.process(trackParPos, trackParNeg); @@ -582,25 +595,36 @@ struct HfFilter { // Main struct for HF triggers registry.fill(HIST("fHfVtxStages"), 1 + HfVtxStage::BeautyVertex, kBplus); } dfB.propagateTracksToVertex(); - const auto& secondaryVertexBplus = dfB.getPCACandidate(); + const auto& secondaryVertexBtoD0h = dfB.getPCACandidate(); std::array pVecThirdVtx{}; dfB.getTrack(0).getPxPyPzGlo(pVec2ProngVtx); dfB.getTrack(1).getPxPyPzGlo(pVecThirdVtx); o2::gpu::gpustd::array dca2Prong; //{trackParD.dcaXY(), trackParD.dcaZ()}; o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParD, 2.f, noMatCorr, &dca2Prong); - bool isBplus = helper.isSelectedBhadron(pVec2ProngVtx, pVecThirdVtx, dca2Prong, dcaThird, std::array{static_cast(collision.posX()), static_cast(collision.posY()), static_cast(collision.posZ())}, std::array{secondaryVertexBplus[0], secondaryVertexBplus[1], secondaryVertexBplus[2]}, kBplus); - if (isBplus) { + bool isBplus = helper.isSelectedBhadron(pVec2ProngVtx, pVecThirdVtx, dca2Prong, dcaThird, std::array{static_cast(collision.posX()), static_cast(collision.posY()), static_cast(collision.posZ())}, std::array{secondaryVertexBtoD0h[0], secondaryVertexBtoD0h[1], secondaryVertexBtoD0h[2]}, kBplus); + bool isBc = helper.isSelectedBhadron(pVec2ProngVtx, pVecThirdVtx, dca2Prong, dcaThird, std::array{static_cast(collision.posX()), static_cast(collision.posY()), static_cast(collision.posZ())}, std::array{secondaryVertexBtoD0h[0], secondaryVertexBtoD0h[1], secondaryVertexBtoD0h[2]}, kBc); + + if (isBplus || isBc) { keepEvent[kBeauty3P] = true; // fill optimisation tree for D0 if (applyOptimisation) { optimisationTreeBeauty(thisCollId, o2::constants::physics::Pdg::kD0, pt2Prong, scores[0], scores[1], scores[2], dcaThird[0]); } if (activateQA) { - registry.fill(HIST("fHfVtxStages"), 1 + HfVtxStage::CharmHadPiSelected, kBplus); - hCpaVsPtB[kBplus]->Fill(ptCand, RecoDecay::cpa(std::array{static_cast(collision.posX()), static_cast(collision.posY()), static_cast(collision.posZ())}, std::array{secondaryVertexBplus[0], secondaryVertexBplus[1], secondaryVertexBplus[2]}, RecoDecay::pVec(pVec2ProngVtx, pVecThirdVtx))); - hDecayLengthVsPtB[kBplus]->Fill(ptCand, RecoDecay::distance(std::array{static_cast(collision.posX()), static_cast(collision.posY()), static_cast(collision.posZ())}, std::array{secondaryVertexBplus[0], secondaryVertexBplus[1], secondaryVertexBplus[2]})); - hImpactParamProductVsPtB[kBplus]->Fill(ptCand, dca2Prong[0] * dcaThird[0]); - hMassVsPtB[kBplus]->Fill(ptCand, massCand); + if (isBplus) { + registry.fill(HIST("fHfVtxStages"), 1 + HfVtxStage::CharmHadPiSelected, kBplus); + hCpaVsPtB[kBplus]->Fill(ptCand, RecoDecay::cpa(std::array{static_cast(collision.posX()), static_cast(collision.posY()), static_cast(collision.posZ())}, std::array{secondaryVertexBtoD0h[0], secondaryVertexBtoD0h[1], secondaryVertexBtoD0h[2]}, RecoDecay::pVec(pVec2ProngVtx, pVecThirdVtx))); + hDecayLengthVsPtB[kBplus]->Fill(ptCand, RecoDecay::distance(std::array{static_cast(collision.posX()), static_cast(collision.posY()), static_cast(collision.posZ())}, std::array{secondaryVertexBtoD0h[0], secondaryVertexBtoD0h[1], secondaryVertexBtoD0h[2]})); + hImpactParamProductVsPtB[kBplus]->Fill(ptCand, dca2Prong[0] * dcaThird[0]); + hMassVsPtB[kBplus]->Fill(ptCand, massCandD0Pi); + } + if (isBc) { + registry.fill(HIST("fHfVtxStages"), 1 + HfVtxStage::CharmHadPiSelected, kBc); + hCpaVsPtB[kBc]->Fill(ptCand, RecoDecay::cpa(std::array{static_cast(collision.posX()), static_cast(collision.posY()), static_cast(collision.posZ())}, std::array{secondaryVertexBtoD0h[0], secondaryVertexBtoD0h[1], secondaryVertexBtoD0h[2]}, RecoDecay::pVec(pVec2ProngVtx, pVecThirdVtx))); + hDecayLengthVsPtB[kBc]->Fill(ptCand, RecoDecay::distance(std::array{static_cast(collision.posX()), static_cast(collision.posY()), static_cast(collision.posZ())}, std::array{secondaryVertexBtoD0h[0], secondaryVertexBtoD0h[1], secondaryVertexBtoD0h[2]})); + hImpactParamProductVsPtB[kBc]->Fill(ptCand, dca2Prong[0] * dcaThird[0]); + hMassVsPtB[kBc]->Fill(ptCand, massCandD0K); + } } } } @@ -1256,19 +1280,19 @@ struct HfFilter { // Main struct for HF triggers getPxPyPz(trackParFourth, pVecFourth); } - int charmParticleID[kNBeautyParticles - 2] = {o2::constants::physics::Pdg::kDPlus, o2::constants::physics::Pdg::kDS, o2::constants::physics::Pdg::kLambdaCPlus, o2::constants::physics::Pdg::kXiCPlus}; + int charmParticleID[kNBeautyParticles - 3] = {o2::constants::physics::Pdg::kDPlus, o2::constants::physics::Pdg::kDS, o2::constants::physics::Pdg::kLambdaCPlus, o2::constants::physics::Pdg::kXiCPlus}; - float massCharmHypos[kNBeautyParticles - 2] = {massDPlus, massDs, massLc, massXic}; + float massCharmHypos[kNBeautyParticles - 3] = {massDPlus, massDs, massLc, massXic}; auto isTrackSelected = helper.isSelectedTrackForSoftPionOrBeauty(track, trackParFourth, dcaFourth); if (track.sign() * sign3Prong < 0 && TESTBIT(isTrackSelected, kForBeauty)) { - for (int iHypo{0}; iHypo < kNBeautyParticles - 2 && !keepEvent[kBeauty4P]; ++iHypo) { + for (int iHypo{0}; iHypo < kNBeautyParticles - 3 && !keepEvent[kBeauty4P]; ++iHypo) { if (isBeautyTagged[iHypo] && (TESTBIT(is3ProngInMass[iHypo], 0) || TESTBIT(is3ProngInMass[iHypo], 1))) { auto massCandB = RecoDecay::m(std::array{pVec3Prong, pVecFourth}, std::array{massCharmHypos[iHypo], massPi}); auto pVecBeauty4Prong = RecoDecay::pVec(pVec3Prong, pVecFourth); auto ptCandBeauty4Prong = RecoDecay::pt(pVecBeauty4Prong); - if (helper.isSelectedBhadronInMassRange(ptCandBeauty4Prong, massCandB, iHypo + 2)) { // + 2 to account for B+ and B0->D*+ + if (helper.isSelectedBhadronInMassRange(ptCandBeauty4Prong, massCandB, iHypo + 3)) { // + 3 to account for B+ and B0->D*+ and Bc if (activateQA) { - registry.fill(HIST("fHfVtxStages"), 1 + HfVtxStage::Skimmed, iHypo + 2); + registry.fill(HIST("fHfVtxStages"), 1 + HfVtxStage::Skimmed, iHypo + 3); } if (!activateSecVtxForB) { keepEvent[kBeauty4P] = true; @@ -1276,7 +1300,7 @@ struct HfFilter { // Main struct for HF triggers optimisationTreeBeauty(thisCollId, charmParticleID[iHypo], pt3Prong, scores[iHypo][0], scores[iHypo][1], scores[iHypo][2], dcaFourth[0]); } if (activateQA) { - hMassVsPtB[iHypo + 2]->Fill(ptCandBeauty4Prong, massCandB); + hMassVsPtB[iHypo + 3]->Fill(ptCandBeauty4Prong, massCandB); } } else { df3.process(trackParFirst, trackParSecond, trackParThird); @@ -1290,7 +1314,7 @@ struct HfFilter { // Main struct for HF triggers auto pVec3ProngVtx = RecoDecay::pVec(pVecFirstVtx, pVecSecondVtx, pVecThirdVtx); if (dfB.process(trackParD, trackParFourth) != 0) { if (activateQA) { - registry.fill(HIST("fHfVtxStages"), 1 + HfVtxStage::BeautyVertex, iHypo + 2); + registry.fill(HIST("fHfVtxStages"), 1 + HfVtxStage::BeautyVertex, iHypo + 3); } dfB.propagateTracksToVertex(); const auto& secondaryVertexB = dfB.getPCACandidate(); @@ -1299,7 +1323,7 @@ struct HfFilter { // Main struct for HF triggers dfB.getTrack(1).getPxPyPzGlo(pVecFourtVtx); o2::gpu::gpustd::array dca3Prong; //{trackParD.dcaXY(), trackParD.dcaZ()}; o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParD, 2.f, noMatCorr, &dca3Prong); - bool isBhad = helper.isSelectedBhadron(pVec3ProngVtx, pVecFourtVtx, dca3Prong, dcaFourth, std::array{static_cast(collision.posX()), static_cast(collision.posY()), static_cast(collision.posZ())}, std::array{secondaryVertexB[0], secondaryVertexB[1], secondaryVertexB[2]}, iHypo + 2); + bool isBhad = helper.isSelectedBhadron(pVec3ProngVtx, pVecFourtVtx, dca3Prong, dcaFourth, std::array{static_cast(collision.posX()), static_cast(collision.posY()), static_cast(collision.posZ())}, std::array{secondaryVertexB[0], secondaryVertexB[1], secondaryVertexB[2]}, iHypo + 3); if (isBhad) { keepEvent[kBeauty4P] = true; // fill optimisation tree @@ -1307,11 +1331,11 @@ struct HfFilter { // Main struct for HF triggers optimisationTreeBeauty(thisCollId, charmParticleID[iHypo], pt3Prong, scores[iHypo][0], scores[iHypo][1], scores[iHypo][2], dcaFourth[0]); } if (activateQA) { - registry.fill(HIST("fHfVtxStages"), 1 + HfVtxStage::CharmHadPiSelected, iHypo + 2); - hCpaVsPtB[iHypo + 2]->Fill(ptCandBeauty4Prong, RecoDecay::cpa(std::array{static_cast(collision.posX()), static_cast(collision.posY()), static_cast(collision.posZ())}, std::array{secondaryVertexB[0], secondaryVertexB[1], secondaryVertexB[2]}, RecoDecay::pVec(pVec3ProngVtx, pVecFourtVtx))); - hDecayLengthVsPtB[iHypo + 2]->Fill(ptCandBeauty4Prong, RecoDecay::distance(std::array{static_cast(collision.posX()), static_cast(collision.posY()), static_cast(collision.posZ())}, std::array{secondaryVertexB[0], secondaryVertexB[1], secondaryVertexB[2]})); - hImpactParamProductVsPtB[iHypo + 2]->Fill(ptCandBeauty4Prong, dca3Prong[0] * dcaFourth[0]); - hMassVsPtB[iHypo + 2]->Fill(ptCandBeauty4Prong, massCandB); + registry.fill(HIST("fHfVtxStages"), 1 + HfVtxStage::CharmHadPiSelected, iHypo + 3); + hCpaVsPtB[iHypo + 3]->Fill(ptCandBeauty4Prong, RecoDecay::cpa(std::array{static_cast(collision.posX()), static_cast(collision.posY()), static_cast(collision.posZ())}, std::array{secondaryVertexB[0], secondaryVertexB[1], secondaryVertexB[2]}, RecoDecay::pVec(pVec3ProngVtx, pVecFourtVtx))); + hDecayLengthVsPtB[iHypo + 3]->Fill(ptCandBeauty4Prong, RecoDecay::distance(std::array{static_cast(collision.posX()), static_cast(collision.posY()), static_cast(collision.posZ())}, std::array{secondaryVertexB[0], secondaryVertexB[1], secondaryVertexB[2]})); + hImpactParamProductVsPtB[iHypo + 3]->Fill(ptCandBeauty4Prong, dca3Prong[0] * dcaFourth[0]); + hMassVsPtB[iHypo + 3]->Fill(ptCandBeauty4Prong, massCandB); } } } diff --git a/EventFiltering/PWGHF/HFFilterHelpers.h b/EventFiltering/PWGHF/HFFilterHelpers.h index 2f451e787ae..c398be20c90 100644 --- a/EventFiltering/PWGHF/HFFilterHelpers.h +++ b/EventFiltering/PWGHF/HFFilterHelpers.h @@ -104,6 +104,7 @@ enum charmParticles { enum beautyParticles { kBplus = 0, kB0toDStar, + kBc, kB0, kBs, kLb, @@ -233,7 +234,7 @@ struct CascCand { static const std::array charmParticleNames{"D0", "Dplus", "Ds", "Lc", "Xic"}; static const int nTotBeautyParts = static_cast(kNBeautyParticles) + static_cast(kNBeautyParticlesToJPsi); -static const std::array beautyParticleNames{"Bplus", "B0toDStar", "B0", "Bs", "Lb", "Xib", "BplusToJPsi", "B0ToJPsi", "BsToJPsi", "LbToJPsi", "BcToJPsi"}; +static const std::array beautyParticleNames{"Bplus", "B0toDStar", "Bc", "B0", "Bs", "Lb", "Xib", "BplusToJPsi", "B0ToJPsi", "BsToJPsi", "LbToJPsi", "BcToJPsi"}; static const std::array pdgCodesCharm{421, 411, 431, 4122, 4232}; static const std::array eventTitles = {"all", "rejected"}; static const std::vector hfTriggerNames{filtering::HfHighPt2P::columnLabel(), filtering::HfHighPt3P::columnLabel(), filtering::HfBeauty3P::columnLabel(), filtering::HfBeauty4P::columnLabel(), filtering::HfFemto2P::columnLabel(), filtering::HfFemto3P::columnLabel(), filtering::HfDoubleCharm2P::columnLabel(), filtering::HfDoubleCharm3P::columnLabel(), filtering::HfDoubleCharmMix::columnLabel(), filtering::HfV0Charm2P::columnLabel(), filtering::HfV0Charm3P::columnLabel(), filtering::HfCharmBarToXiBach::columnLabel(), filtering::HfSigmaCPPK::columnLabel(), filtering::HfSigmaC0K0::columnLabel(), filtering::HfPhotonCharm2P::columnLabel(), filtering::HfPhotonCharm3P::columnLabel(), filtering::HfSingleCharm2P::columnLabel(), filtering::HfSingleCharm3P::columnLabel(), filtering::HfSingleNonPromptCharm2P::columnLabel(), filtering::HfSingleNonPromptCharm3P::columnLabel(), filtering::HfCharmBarToXi2Bach::columnLabel(), filtering::HfPrCharm2P::columnLabel(), filtering::HfBtoJPsiKa::columnLabel(), filtering::HfBtoJPsiKstar::columnLabel(), filtering::HfBtoJPsiPhi::columnLabel(), filtering::HfBtoJPsiPrKa::columnLabel(), filtering::HfBtoJPsiPi::columnLabel()}; @@ -285,7 +286,7 @@ static const o2::framework::AxisSpec qtAxis{100, 0.f, 0.25f}; static const o2::framework::AxisSpec bdtAxis{100, 0.f, 1.f}; static const o2::framework::AxisSpec phiAxis{36, 0., o2::constants::math::TwoPI}; static const std::array massAxisC = {o2::framework::AxisSpec{250, 1.65f, 2.15f}, o2::framework::AxisSpec{250, 1.65f, 2.15f}, o2::framework::AxisSpec{250, 1.75f, 2.25f}, o2::framework::AxisSpec{250, 2.05f, 2.55f}, o2::framework::AxisSpec{250, 2.25f, 2.75f}, o2::framework::AxisSpec{200, 0.139f, 0.159f}, o2::framework::AxisSpec{250, 0.f, 0.25f}, o2::framework::AxisSpec{250, 0.f, 0.25f}, o2::framework::AxisSpec{200, 0.48f, 0.88f}, o2::framework::AxisSpec{200, 0.48f, 0.88f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{170, 0.13f, 0.3f}, o2::framework::AxisSpec{170, 0.13f, 0.3f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{350, 2.3f, 3.0f}, o2::framework::AxisSpec{350, 2.3f, 3.0f}, o2::framework::AxisSpec{350, 2.3f, 3.0f}, o2::framework::AxisSpec{240, 2.4f, 3.6f}, o2::framework::AxisSpec{300, 0.7f, 1.3f}, o2::framework::AxisSpec{300, 0.7f, 1.3f}, o2::framework::AxisSpec{300, 0.7f, 1.3f}, o2::framework::AxisSpec{300, 0.7f, 1.3f}}; -static const std::array massAxisB = {o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.4f, 6.4f}, o2::framework::AxisSpec{400, 5.0f, 6.6f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{400, 5.0f, 6.6f}, o2::framework::AxisSpec{240, 5.8f, 7.0f}}; +static const std::array massAxisB = {o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.4f, 6.4f}, o2::framework::AxisSpec{500, 5.4f, 7.4f}, o2::framework::AxisSpec{400, 5.0f, 6.6f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{400, 5.0f, 6.6f}, o2::framework::AxisSpec{240, 5.8f, 7.0f}}; // default values for configurables // channels to trigger on for femto @@ -409,10 +410,11 @@ class HfFilterHelper mCutsSingleTrackBeauty4Prong = cutsSingleTrack4P; mCutsSingleTrackBeautyToJPsi = cutsSingleToJPsi; } - void setCutsBhadrons(o2::framework::LabeledArray cutsBplus, o2::framework::LabeledArray cutsB0toDstar, o2::framework::LabeledArray cutsB0, o2::framework::LabeledArray cutsBs, o2::framework::LabeledArray cutsLb, o2::framework::LabeledArray cutsXib) + void setCutsBhadrons(o2::framework::LabeledArray cutsBplus, o2::framework::LabeledArray cutsB0toDstar, o2::framework::LabeledArray cutsBc, o2::framework::LabeledArray cutsB0, o2::framework::LabeledArray cutsBs, o2::framework::LabeledArray cutsLb, o2::framework::LabeledArray cutsXib) { mCutsBhad[kBplus] = cutsBplus; mCutsBhad[kB0toDStar] = cutsB0toDstar; + mCutsBhad[kBc] = cutsBc; mCutsBhad[kB0] = cutsB0; mCutsBhad[kBs] = cutsBs; mCutsBhad[kLb] = cutsLb; @@ -2058,6 +2060,10 @@ inline bool HfFilterHelper::isSelectedBhadronInMassRange(T1 const& ptCand, T2 co massBhad = massBs; break; } + case kBc: { + massBhad = massBc; + break; + } case kLb: { massBhad = massLb; break; From fe7dbeea1e8843867d4e08637447c217afb077a2 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Sun, 13 Apr 2025 15:42:03 +0200 Subject: [PATCH 0971/1650] [PWGEM/Dilepton] update matchingMFT.cxx in MC (#10831) --- PWGEM/Dilepton/Tasks/matchingMFT.cxx | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/PWGEM/Dilepton/Tasks/matchingMFT.cxx b/PWGEM/Dilepton/Tasks/matchingMFT.cxx index 2892d0284ad..21b360634ae 100644 --- a/PWGEM/Dilepton/Tasks/matchingMFT.cxx +++ b/PWGEM/Dilepton/Tasks/matchingMFT.cxx @@ -169,6 +169,8 @@ struct matchingMFT { fRegistry.add("MFTMCHMID/primary/correct/hDeltaPhi_Neg", "#varphi resolution;p_{T}^{gen} (GeV/c);#varphi^{rec} - #varphi^{gen} (rad.)", kTH2F, {{100, 0, 10}, {400, -0.2, +0.2}}, true); fRegistry.addClone("MFTMCHMID/primary/correct/", "MFTMCHMID/primary/wrong/"); fRegistry.addClone("MFTMCHMID/primary/", "MFTMCHMID/secondary/"); + + fRegistry.add("Generated/primary/hs", "gen. info;p_{T} (GeV/c);#eta;#varphi (rad.)", kTHnSparseF, {{100, 0.0f, 10}, {100, -6, -1}, {90, 0, 2.f * M_PI}}, false); } bool isSelected(const float pt, const float eta, const float rAtAbsorberEnd, const float pDCA, const float chi2, const uint8_t trackType, const float dcaXY) @@ -416,6 +418,25 @@ struct matchingMFT { fRegistry.fill(HIST("Event/hMultFT0CvsMultNTracksPV"), collision.multFT0C(), collision.multNTracksPV()); } + template + void runGen(TMCParticles const& mcParticles) + { + for (const auto& mcParticle : mcParticles) { + if (std::abs(mcParticle.pdgCode()) != 13) { // select true muon + continue; + } + if (!(mcParticle.isPhysicalPrimary() || mcParticle.producedByGenerator())) { + continue; + } + if (mcParticle.eta() < minEtaGL || maxEtaGL < mcParticle.eta()) { + continue; + } + + fRegistry.fill(HIST("Generated/primary/hs"), mcParticle.pt(), mcParticle.eta(), mcParticle.phi()); + + } // end of mc particles + } + SliceCache cache; PresliceUnsorted perMFTTrack = o2::aod::fwdtrack::matchMFTTrackId; Preslice perCollision = o2::aod::fwdtrack::collisionId; @@ -426,7 +447,7 @@ struct matchingMFT { Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); using FilteredMyCollisions = soa::Filtered; - void processWithoutFTTCA(FilteredMyCollisions const& collisions, MyFwdTracks const& fwdtracks, MyMFTTracks const& mfttracks, aod::BCsWithTimestamps const&, aod::McParticles const&) + void processWithoutFTTCA(FilteredMyCollisions const& collisions, MyFwdTracks const& fwdtracks, MyMFTTracks const& mfttracks, aod::BCsWithTimestamps const&, aod::McParticles const& mcParticles) { for (const auto& collision : collisions) { const auto& bc = collision.template bc_as(); @@ -450,10 +471,11 @@ struct matchingMFT { fillHistograms(collision, fwdtrack, fwdtracks, mfttracks); } // end of fwdtrack loop } // end of collision loop + runGen(mcParticles); } PROCESS_SWITCH(matchingMFT, processWithoutFTTCA, "process without FTTCA", false); - void processWithFTTCA(FilteredMyCollisions const& collisions, MyFwdTracks const& fwdtracks, MyMFTTracks const& mfttracks, aod::BCsWithTimestamps const&, aod::FwdTrackAssoc const& fwdtrackIndices, aod::McParticles const&) + void processWithFTTCA(FilteredMyCollisions const& collisions, MyFwdTracks const& fwdtracks, MyMFTTracks const& mfttracks, aod::BCsWithTimestamps const&, aod::FwdTrackAssoc const& fwdtrackIndices, aod::McParticles const& mcParticles) { for (const auto& collision : collisions) { const auto& bc = collision.template bc_as(); @@ -478,6 +500,7 @@ struct matchingMFT { fillHistograms(collision, fwdtrack, fwdtracks, mfttracks); } // end of fwdtrack loop } // end of collision loop + runGen(mcParticles); } PROCESS_SWITCH(matchingMFT, processWithFTTCA, "process with FTTCA", true); }; From 6f09e1a76b5e7a6aaa522b829c5c29141e2ffb67 Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Sun, 13 Apr 2025 19:10:05 +0200 Subject: [PATCH 0972/1650] [PWGLF] Strangeness builder work: PCM treatment, bufferizing option, etc (#10811) Co-authored-by: David Dobrigkeit Chinellato Co-authored-by: ALICE Builder --- PWGLF/DataModel/LFStrangenessTables.h | 2 +- .../Strangeness/strangenessbuilder.cxx | 247 +++++++-- PWGLF/Tasks/QC/CMakeLists.txt | 5 + PWGLF/Tasks/QC/v0assoqa.cxx | 481 ++++++++++++++++++ PWGLF/Utils/strangenessBuilderHelper.h | 245 +++++++-- 5 files changed, 893 insertions(+), 87 deletions(-) create mode 100644 PWGLF/Tasks/QC/v0assoqa.cxx diff --git a/PWGLF/DataModel/LFStrangenessTables.h b/PWGLF/DataModel/LFStrangenessTables.h index 6de090da8d9..b89699cbd33 100644 --- a/PWGLF/DataModel/LFStrangenessTables.h +++ b/PWGLF/DataModel/LFStrangenessTables.h @@ -538,7 +538,7 @@ DECLARE_SOA_COLUMN(DCAV0Daughters, dcaV0daughters, float); //! DCA between V0 da DECLARE_SOA_COLUMN(DCAPosToPV, dcapostopv, float); //! DCA positive prong to PV DECLARE_SOA_COLUMN(DCANegToPV, dcanegtopv, float); //! DCA negative prong to PV DECLARE_SOA_COLUMN(V0CosPA, v0cosPA, float); //! V0 CosPA -DECLARE_SOA_COLUMN(DCAV0ToPV, dcav0topv, float); //! DCA V0 to PV +DECLARE_SOA_COLUMN(DCAV0ToPV, dcav0topv, float); //! DCA V0 to PV (3D) // Type of V0 from the svertexer (photon, regular, from cascade) DECLARE_SOA_COLUMN(V0Type, v0Type, uint8_t); //! type of V0. 0: built solely for cascades (does not pass standard V0 cuts), 1: standard 2, 3: photon-like with TPC-only use. Regular analysis should always use type 1. diff --git a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx index 261db051ca5..74c36988ce1 100644 --- a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx @@ -273,6 +273,14 @@ struct StrangenessBuilder { Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; } ccdbConfigurations; + // first order deduplication implementation + // more algorithms to be added as necessary + Configurable deduplicationAlgorithm{"deduplicationAlgorithm", 1, "0: disabled; 1: best pointing angle wins; 2: best DCA daughters wins; 3: best pointing and best DCA wins"}; + + // V0 buffer for V0s used in cascades: master switch + // exchanges CPU (generate V0s again) with memory (save pre-generated V0s) + Configurable useV0BufferForCascades{"useV0BufferForCascades", false, "store array of V0s for cascades or not. False (default): save RAM, use more CPU; true: save CPU, use more RAM"}; + Configurable mc_findableMode{"mc_findableMode", 0, "0: disabled; 1: add findable-but-not-found to existing V0s from AO2D; 2: reset V0s and generate only findable-but-not-found"}; // V0 building options @@ -346,10 +354,6 @@ struct StrangenessBuilder { // for handling TPC-only tracks (photons) o2::aod::common::TPCVDriftManager mVDriftMgr; - // for tagging V0s used in cascades - std::vector v0sFromCascades; // Vector of v0 candidates used in cascades - std::vector v0Map; // index to relate V0s -> v0sFromCascades - // for establishing CascData/KFData/TraCascData interlinks struct { std::vector cascCoreToCascades; @@ -389,10 +393,7 @@ struct StrangenessBuilder { int bachTrackId = -1; bool found = false; }; - std::vector v0List; - std::vector cascadeList; - std::vector sorted_v0; - std::vector sorted_cascade; + //*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+* // Helper struct to contain V0MCCore information prior to filling struct mcV0info { @@ -443,6 +444,16 @@ struct StrangenessBuilder { HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + std::vector v0List; + std::vector cascadeList; + std::vector sorted_v0; + std::vector sorted_cascade; + + // for tagging V0s used in cascades + std::vector v0sFromCascades; // Vector of v0 candidates used in cascades + std::vector ao2dV0toV0List; // index to relate v0s -> v0List + std::vector v0Map; // index to relate v0List -> v0sFromCascades + void init(InitContext& context) { // setup bookkeeping histogram @@ -450,6 +461,12 @@ struct StrangenessBuilder { auto h2 = histos.add("hInputStatistics", "hInputStatistics", kTH1D, {{nTablesConst, -0.5f, static_cast(nTablesConst)}}); h2->SetTitle("Input table sizes"); + if (v0BuilderOpts.generatePhotonCandidates.value == true) { + auto hDeduplicationStatistics = histos.add("hDeduplicationStatistics", "hDeduplicationStatistics", kTH1D, {{2, -0.5f, 1.5f}}); + hDeduplicationStatistics->GetXaxis()->SetBinLabel(1, "AO2D V0s"); + hDeduplicationStatistics->GetXaxis()->SetBinLabel(2, "Deduplicated V0s"); + } + if (mc_findableMode.value > 0) { // save statistics of findable candidate processing auto hFindable = histos.add("hFindableStatistics", "hFindableStatistics", kTH1D, {{6, -0.5f, 5.5f}}); @@ -680,7 +697,7 @@ struct StrangenessBuilder { } //__________________________________________________ - template + template void prepareBuildingLists(TCollisions const& collisions, TMCCollisions const& mcCollisions, TV0s const& v0s, TCascades const& cascades, TTracks const& tracks, TMCParticles const& mcParticles) { // this function prepares the v0List and cascadeList depending on @@ -690,7 +707,7 @@ struct StrangenessBuilder { // or resets and fills with all findable. // // Whenever using findable candidates, they will be appropriately - // marked for posterior analysis using 'type' variables. + // marked for posterior analysis using 'tag' variables. // // findable mode legend: // 0: simple passthrough of V0s, Cascades in AO2Ds @@ -703,6 +720,7 @@ struct StrangenessBuilder { cascadeList.clear(); sorted_v0.clear(); sorted_cascade.clear(); + ao2dV0toV0List.clear(); trackEntry currentTrackEntry; v0Entry currentV0Entry; @@ -735,18 +753,115 @@ struct StrangenessBuilder { } // end findable mode check if (mc_findableMode.value < 2) { - // simple passthrough: copy existing v0s to build list + // keep all unless de-duplication active + ao2dV0toV0List.resize(v0s.size(), -1); // -1 means keep, -2 means do not keep + + if (deduplicationAlgorithm > 0 && v0BuilderOpts.generatePhotonCandidates) { + // handle duplicates explicitly: group V0s according to (p,n) indices + // will provide a list of collisionIds (in V0group), allowing for + // easy de-duplication when passing to the v0List + std::vector v0tableGrouped = o2::pwglf::groupDuplicates(v0s); + histos.fill(HIST("hDeduplicationStatistics"), 0.0, v0s.size()); + histos.fill(HIST("hDeduplicationStatistics"), 1.0, v0tableGrouped.size()); + + // process grouped duplicates, remove 'bad' ones + for (size_t iV0 = 0; iV0 < v0tableGrouped.size(); iV0++) { + auto pTrack = tracks.rawIteratorAt(v0tableGrouped[iV0].posTrackId); + auto nTrack = tracks.rawIteratorAt(v0tableGrouped[iV0].negTrackId); + + bool isPosTPCOnly = (pTrack.hasTPC() && !pTrack.hasITS() && !pTrack.hasTRD() && !pTrack.hasTOF()); + bool isNegTPCOnly = (nTrack.hasTPC() && !nTrack.hasITS() && !nTrack.hasTRD() && !nTrack.hasTOF()); + + // skip single copy V0s + if (v0tableGrouped[iV0].collisionIds.size() == 1) { + continue; + } + + // don't try to de-duplicate if no track is TPC only + if (!isPosTPCOnly && !isNegTPCOnly) { + continue; + } + + // fitness criteria defined here + float bestPointingAngle = 10; // a nonsense angle, anything's better + size_t bestPointingAngleIndex = -1; + + float bestDCADaughters = 1e+3; // an excessively large DCA + size_t bestDCADaughtersIndex = -1; + + for (size_t ic = 0; ic < v0tableGrouped[iV0].collisionIds.size(); ic++) { + // get track parametrizations, collisions + auto posTrackPar = getTrackParCov(pTrack); + auto negTrackPar = getTrackParCov(nTrack); + auto const& collision = collisions.rawIteratorAt(v0tableGrouped[iV0].collisionIds[ic]); + + // handle TPC-only tracks properly (photon conversions) + if (v0BuilderOpts.moveTPCOnlyTracks) { + if (isPosTPCOnly) { + // Nota bene: positive is TPC-only -> this entire V0 merits treatment as photon candidate + posTrackPar.setPID(o2::track::PID::Electron); + negTrackPar.setPID(o2::track::PID::Electron); + if (!mVDriftMgr.moveTPCTrack(collision, pTrack, posTrackPar)) { + return; + } + } + if (isNegTPCOnly) { + // Nota bene: negative is TPC-only -> this entire V0 merits treatment as photon candidate + posTrackPar.setPID(o2::track::PID::Electron); + negTrackPar.setPID(o2::track::PID::Electron); + if (!mVDriftMgr.moveTPCTrack(collision, nTrack, negTrackPar)) { + return; + } + } + } // end TPC drift treatment + + // process candidate with helper, generate properties for consulting + // : do not apply selections: do as much as possible to preserve + // candidate at this level and do not select with topo selections + if (straHelper.buildV0Candidate(v0tableGrouped[iV0].collisionIds[ic], collision.posX(), collision.posY(), collision.posZ(), pTrack, nTrack, posTrackPar, negTrackPar, true, false)) { + // candidate built, check pointing angle + if (straHelper.v0.pointingAngle < bestPointingAngle) { + bestPointingAngle = straHelper.v0.pointingAngle; + bestPointingAngleIndex = ic; + } + if (straHelper.v0.daughterDCA < bestDCADaughters) { + bestDCADaughters = straHelper.v0.daughterDCA; + bestDCADaughtersIndex = ic; + } + } // end build V0 + } // end candidate loop + + // mark de-duplicated candidates + for (size_t ic = 0; ic < v0tableGrouped[iV0].collisionIds.size(); ic++) { + ao2dV0toV0List[v0tableGrouped[iV0].V0Ids[ic]] = -2; + // algorithm 1: best pointing angle + if (bestPointingAngleIndex == ic && deduplicationAlgorithm.value == 1) { + ao2dV0toV0List[v0tableGrouped[iV0].V0Ids[ic]] = -1; // keep best only + } + if (bestDCADaughtersIndex == ic && deduplicationAlgorithm.value == 2) { + ao2dV0toV0List[v0tableGrouped[iV0].V0Ids[ic]] = -1; // keep best only + } + if (bestDCADaughtersIndex == ic && bestPointingAngleIndex == ic && deduplicationAlgorithm.value == 3) { + ao2dV0toV0List[v0tableGrouped[iV0].V0Ids[ic]] = -1; // keep best only + } + } + } // end V0 loop + } // end de-duplication process + for (const auto& v0 : v0s) { - currentV0Entry.globalId = v0.globalIndex(); - currentV0Entry.collisionId = v0.collisionId(); - currentV0Entry.posTrackId = v0.posTrackId(); - currentV0Entry.negTrackId = v0.negTrackId(); - currentV0Entry.v0Type = v0.v0Type(); - currentV0Entry.pdgCode = 0; - currentV0Entry.particleId = -1; - currentV0Entry.isCollinearV0 = v0.isCollinearV0(); - currentV0Entry.found = true; - v0List.push_back(currentV0Entry); + if (ao2dV0toV0List[v0.globalIndex()] == -1) { // keep only de-duplicated + ao2dV0toV0List[v0.globalIndex()] = v0List.size(); // maps V0s to the corresponding v0List entry + currentV0Entry.globalId = v0.globalIndex(); + currentV0Entry.collisionId = v0.collisionId(); + currentV0Entry.posTrackId = v0.posTrackId(); + currentV0Entry.negTrackId = v0.negTrackId(); + currentV0Entry.v0Type = v0.v0Type(); + currentV0Entry.pdgCode = 0; + currentV0Entry.particleId = -1; + currentV0Entry.isCollinearV0 = v0.isCollinearV0(); + currentV0Entry.found = true; + v0List.push_back(currentV0Entry); + } } } // any mode other than 0 will require mcParticles @@ -822,7 +937,7 @@ struct StrangenessBuilder { currentV0Entry.collisionId = bestCollisionArray[positiveTrackIndex.mcCollisionId]; currentV0Entry.posTrackId = positiveTrackIndex.globalId; currentV0Entry.negTrackId = negativeTrackIndex.globalId; - currentV0Entry.v0Type = 1; // mark with bit 3 + currentV0Entry.v0Type = 1; currentV0Entry.pdgCode = positiveTrackIndex.pdgCode; currentV0Entry.particleId = positiveTrackIndex.originId; currentV0Entry.isCollinearV0 = false; @@ -838,8 +953,7 @@ struct StrangenessBuilder { } } } - // findable mode 2: determine type based on V0 table, - // with type 8 being reserved to findable-but-not-found + // findable mode 2 if (mc_findableMode.value == 2) { currentV0Entry.globalId = -1; currentV0Entry.collisionId = bestCollisionArray[positiveTrackIndex.mcCollisionId]; @@ -891,9 +1005,12 @@ struct StrangenessBuilder { // simple passthrough: copy existing cascades to build list for (const auto& cascade : cascades) { auto const& v0 = cascade.v0(); + if (v0.v0Type() > 1) { + continue; // skip any unexpected stuff (FIXME: follow-up) + } currentCascadeEntry.globalId = cascade.globalIndex(); currentCascadeEntry.collisionId = cascade.collisionId(); - currentCascadeEntry.v0Id = v0.globalIndex(); + currentCascadeEntry.v0Id = ao2dV0toV0List[v0.globalIndex()]; currentCascadeEntry.posTrackId = v0.posTrackId(); currentCascadeEntry.negTrackId = v0.negTrackId(); currentCascadeEntry.bachTrackId = cascade.bachelorId(); @@ -1098,10 +1215,11 @@ struct StrangenessBuilder { trackedCascadeCount = trackedCascades.size(); for (const auto& trackedCascade : trackedCascades) { auto const& cascade = trackedCascade.cascade(); - if (v0Map[cascade.v0Id()] == -2) { + LOGF(info, "trouble: cascade.v0Id() = %i but v0Map size %i", ao2dV0toV0List[cascade.v0Id()], v0Map.size()); + if (v0Map[ao2dV0toV0List[cascade.v0Id()]] == -2) { v0sUsedInCascades++; } - v0Map[cascade.v0Id()] = -1; // marks used (but isn't the index of a properly built V0, which would be >= 0) + v0Map[ao2dV0toV0List[cascade.v0Id()]] = -1; // marks used (but isn't the index of a built V0, which would be >= 0) } } } @@ -1180,7 +1298,7 @@ struct StrangenessBuilder { products.v0dataLink(-1, -1); continue; } - if (v0Map[iv0] == -1) { + if (v0Map[iv0] == -1 && useV0BufferForCascades) { v0Map[iv0] = v0sFromCascades.size(); // provide actual valid index in buffer v0sFromCascades.push_back(straHelper.v0); } @@ -1207,7 +1325,7 @@ struct StrangenessBuilder { straHelper.v0.positiveDCAxy, straHelper.v0.negativeDCAxy, TMath::Cos(straHelper.v0.pointingAngle), - straHelper.v0.dcaXY, + straHelper.v0.dcaToPV, v0.v0Type); products.v0dataLink(products.v0cores.lastIndex(), -1); histos.fill(HIST("hTableBuildingStatistics"), kV0CoresBase); @@ -1608,23 +1726,46 @@ struct StrangenessBuilder { auto const& posTrack = tracks.rawIteratorAt(cascade.posTrackId); auto const& negTrack = tracks.rawIteratorAt(cascade.negTrackId); auto const& bachTrack = tracks.rawIteratorAt(cascade.bachTrackId); - if (v0Map[cascade.v0Id] < 0) { - // this V0 hasn't been stored / cached - products.cascdataLink(-1); - interlinks.cascadeToCascCores.push_back(-1); - continue; // didn't work out, skip - } - if (!straHelper.buildCascadeCandidate(cascade.collisionId, pvX, pvY, pvZ, - v0sFromCascades[v0Map[cascade.v0Id]], - posTrack, - negTrack, - bachTrack, - mEnabledTables[kCascBBs], - cascadeBuilderOpts.useCascadeMomentumAtPrimVtx, - mEnabledTables[kCascCovs])) { - products.cascdataLink(-1); - interlinks.cascadeToCascCores.push_back(-1); - continue; // didn't work out, skip + if (useV0BufferForCascades) { + // this processing path uses a buffer of V0s so that no + // additional minimization step is redone. It consumes less + // CPU at the cost of more memory. Since memory is a more + // limited commodity, this isn't the default option. + + // check if cached - if not, skip + if (v0Map[cascade.v0Id] < 0) { + // this V0 hasn't been stored / cached + products.cascdataLink(-1); + interlinks.cascadeToCascCores.push_back(-1); + continue; // didn't work out, skip + } + + if (!straHelper.buildCascadeCandidate(cascade.collisionId, pvX, pvY, pvZ, + v0sFromCascades[v0Map[cascade.v0Id]], + posTrack, + negTrack, + bachTrack, + mEnabledTables[kCascBBs], + cascadeBuilderOpts.useCascadeMomentumAtPrimVtx, + mEnabledTables[kCascCovs])) { + products.cascdataLink(-1); + interlinks.cascadeToCascCores.push_back(-1); + continue; // didn't work out, skip + } + } else { + // this processing path generates the entire cascade + // from tracks, without any need to have V0s generated. + if (!straHelper.buildCascadeCandidate(cascade.collisionId, pvX, pvY, pvZ, + posTrack, + negTrack, + bachTrack, + mEnabledTables[kCascBBs], + cascadeBuilderOpts.useCascadeMomentumAtPrimVtx, + mEnabledTables[kCascCovs])) { + products.cascdataLink(-1); + interlinks.cascadeToCascCores.push_back(-1); + continue; // didn't work out, skip + } } nCascades++; @@ -1992,8 +2133,8 @@ struct StrangenessBuilder { } //__________________________________________________ - template - void buildTrackedCascades(TStrangeTracks const& cascadeTracks, TMCParticles const& mcParticles) + template + void buildTrackedCascades(TCollisions const& collisions, TStrangeTracks const& cascadeTracks, TMCParticles const& mcParticles) { if (!mEnabledTables[kStoredTraCascCores] || mc_findableMode.value != 0) { return; // don't do if no request for cascades in place or findable mode used @@ -2007,12 +2148,12 @@ struct StrangenessBuilder { continue; // safety (should be fine but depends on future stratrack dev) auto const& strangeTrack = cascadeTrack.template track_as(); - auto const& collision = strangeTrack.template collision_as(); + // if collisionId positive: get vertex, negative: origin // could be replaced by mean vertex (but without much benefit...) float pvX = 0.0f, pvY = 0.0f, pvZ = 0.0f; if (strangeTrack.has_collision()) { - auto const& collision = strangeTrack.template collision_as(); + auto const& collision = collisions.rawIteratorAt(strangeTrack.collisionId()); pvX = collision.posX(); pvY = collision.posY(); pvZ = collision.posZ(); @@ -2038,7 +2179,7 @@ struct StrangenessBuilder { auto strangeTrackParCov = getTrackParCov(strangeTrack); gpu::gpustd::array dcaInfo; strangeTrackParCov.setPID(o2::track::PID::XiMinus); // FIXME: not OK for omegas - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, strangeTrackParCov, 2.f, straHelper.fitter.getMatCorrType(), &dcaInfo); + o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, strangeTrackParCov, 2.f, straHelper.fitter.getMatCorrType(), &dcaInfo); straHelper.cascade.cascadeDCAxy = dcaInfo[0]; straHelper.cascade.cascadeDCAz = dcaInfo[1]; @@ -2143,7 +2284,7 @@ struct StrangenessBuilder { resetInterlinks(); // prepare v0List, cascadeList - prepareBuildingLists(collisions, mccollisions, v0s, cascades, tracks, mcParticles); + prepareBuildingLists(collisions, mccollisions, v0s, cascades, tracks, mcParticles); // mark V0s that will be buffered for the cascade building markV0sUsedInCascades(v0List, cascadeList, trackedCascades); @@ -2157,7 +2298,7 @@ struct StrangenessBuilder { // build tracked cascades only if subscription is Run 3 like (doesn't exist in Run 2) if constexpr (soa::is_table) { - buildTrackedCascades(trackedCascades, mcParticles); + buildTrackedCascades(collisions, trackedCascades, mcParticles); } populateCascadeInterlinks(); diff --git a/PWGLF/Tasks/QC/CMakeLists.txt b/PWGLF/Tasks/QC/CMakeLists.txt index fc62c0f34f5..dd0c14d1c91 100644 --- a/PWGLF/Tasks/QC/CMakeLists.txt +++ b/PWGLF/Tasks/QC/CMakeLists.txt @@ -134,3 +134,8 @@ o2physics_add_dpl_workflow(its-tpc-matching-vzeros SOURCES lfITSTPCMatchingSecondaryTracksQA.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(v0assoqa + SOURCES v0assoqa.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DCAFitter KFParticle::KFParticle O2Physics::TPCDriftManager + COMPONENT_NAME Analysis) \ No newline at end of file diff --git a/PWGLF/Tasks/QC/v0assoqa.cxx b/PWGLF/Tasks/QC/v0assoqa.cxx new file mode 100644 index 00000000000..fcfd8d59b01 --- /dev/null +++ b/PWGLF/Tasks/QC/v0assoqa.cxx @@ -0,0 +1,481 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +// +// Strangeness-to-collision association tests +// +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/ASoAHelpers.h" +#include "ReconstructionDataFormats/Track.h" +#include "Common/Core/RecoDecay.h" +#include "Common/Core/trackUtilities.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" +#include "PWGLF/DataModel/LFParticleIdentification.h" +#include "Common/Core/TrackSelection.h" +#include "Common/DataModel/McCollisionExtra.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/PIDResponse.h" +#include "DetectorsBase/Propagator.h" +#include "DetectorsBase/GeometryManager.h" +#include "DataFormatsParameters/GRPObject.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "CCDB/BasicCCDBManager.h" +#include "PWGLF/Utils/strangenessBuilderHelper.h" +#include "Common/Core/TPCVDriftManager.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "Framework/ASoAHelpers.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using std::array; + +// using MyTracks = soa::Join; +using TracksCompleteIU = soa::Join; +using TracksCompleteIUMC = soa::Join; +using V0DataLabeled = soa::Join; +using CascMC = soa::Join; +using TraCascMC = soa::Join; +using RecoedMCCollisions = soa::Join; +using CollisionsWithEvSels = soa::Join; + +// For MC association in pre-selection +using LabeledTracksExtra = soa::Join; + +struct v0assoqa { + HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + + // helper object + o2::pwglf::strangenessBuilderHelper straHelper; + + o2::ccdb::CcdbApi ccdbApi; + Service ccdb; + + int mRunNumber; + o2::base::MatLayerCylSet* lut = nullptr; + + // for handling TPC-only tracks (photons) + o2::aod::common::TPCVDriftManager mVDriftMgr; + + // CCDB options + struct : ConfigurableGroup { + std::string prefix = "ccdb"; + Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; + Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; + Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; + } ccdbConfigurations; + + // V0 building options + struct : ConfigurableGroup { + std::string prefix = "v0BuilderOpts"; + Configurable moveTPCOnlyTracks{"moveTPCOnlyTracks", true, "if dealing with TPC-only tracks, move them according to TPC drift / time info"}; + + // baseline conditionals of V0 building + Configurable minCrossedRows{"minCrossedRows", -1, "minimum TPC crossed rows for daughter tracks"}; + Configurable dcanegtopv{"dcanegtopv", .0, "DCA Neg To PV"}; + Configurable dcapostopv{"dcapostopv", .0, "DCA Pos To PV"}; + Configurable v0cospa{"v0cospa", -2, "V0 CosPA"}; // double -> N.B. dcos(x)/dx = 0 at x=0) + Configurable dcav0dau{"dcav0dau", 10000.0, "DCA V0 Daughters"}; + Configurable v0radius{"v0radius", 0.0, "v0radius"}; + Configurable maxDaughterEta{"maxDaughterEta", 5.0, "Maximum daughter eta (in abs value)"}; + } v0BuilderOpts; + + // cascade building options + struct : ConfigurableGroup { + std::string prefix = "cascadeBuilderOpts"; + // conditionals + Configurable minCrossedRows{"minCrossedRows", 50, "minimum TPC crossed rows for daughter tracks"}; + Configurable dcabachtopv{"dcabachtopv", .05, "DCA Bach To PV"}; + Configurable cascradius{"cascradius", 0.9, "cascradius"}; + Configurable casccospa{"casccospa", 0.95, "casccospa"}; + Configurable dcacascdau{"dcacascdau", 1.0, "DCA cascade Daughters"}; + Configurable lambdaMassWindow{"lambdaMassWindow", .010, "Distance from Lambda mass (does not apply to KF path)"}; + Configurable maxDaughterEta{"maxDaughterEta", 5.0, "Maximum daughter eta (in abs value)"}; + } cascadeBuilderOpts; + + //_______________________________________________________________________ + template + int findMotherFromLabels(int const& p1, int const& p2, const int expected_pdg1, const int expected_pdg2, const int expected_mother_pdg, TMCParticles const& mcparticles) + { + // encompasses a simple check for labels existing + if (p1 < 0 || p2 < 0) { + return -1; + } + auto mcParticle1 = mcparticles.rawIteratorAt(p1); + auto mcParticle2 = mcparticles.rawIteratorAt(p2); + return (findMother(mcParticle1, mcParticle2, expected_pdg1, expected_pdg2, expected_mother_pdg, mcparticles)); + } + + //_______________________________________________________________________ + template + int findMother(TMCParticle1 const& p1, TMCParticle2 const& p2, const int expected_pdg1, const int expected_pdg2, const int expected_mother_pdg, TMCParticles const& mcparticles) + { + if (p1.globalIndex() == p2.globalIndex()) + return -1; + if (p1.pdgCode() != expected_pdg1 || p2.pdgCode() != expected_pdg2) + return -1; + if (!p1.has_mothers() || !p2.has_mothers()) + return -1; + + int motherid1 = p1.mothersIds()[0]; + auto mother1 = mcparticles.iteratorAt(motherid1); + int mother1_pdg = mother1.pdgCode(); + int motherid2 = p2.mothersIds()[0]; + auto mother2 = mcparticles.iteratorAt(motherid2); + int mother2_pdg = mother2.pdgCode(); + + if (motherid1 != motherid2 || mother1_pdg != mother2_pdg || mother1_pdg != expected_mother_pdg) + return -1; + + return motherid1; + } + + void init(InitContext const&) + { + histos.add("hDuplicateCount", "hDuplicateCount", kTH1F, {{50, -0.5f, 49.5f}}); + histos.add("hDuplicateCountType7", "hDuplicateCountType7", kTH1F, {{50, -0.5f, 49.5f}}); + histos.add("hDuplicateCountType7allTPConly", "hDuplicateCountType7allTPConly", kTH1F, {{50, -0.5f, 49.5f}}); + + histos.add("hPhotonPt", "hPhotonPt", kTH1F, {{200, 0.0f, 20.0f}}); + histos.add("hPhotonPt_Duplicates", "hPhotonPt_Duplicates", kTH1F, {{200, 0.0f, 20.0f}}); + histos.add("hPhotonPt_withRecoedMcCollision", "hPhotonPt_withRecoedMcCollision", kTH1F, {{200, 0.0f, 20.0f}}); + histos.add("hPhotonPt_withCorrectCollisionCopy", "hPhotonPt_withCorrectCollisionCopy", kTH1F, {{200, 0.0f, 20.0f}}); + + histos.add("hPA_All", "hPA_All", kTH1F, {{100, 0.0f, 1.0f}}); + histos.add("hPA_Correct", "hPA_Correct", kTH1F, {{100, 0.0f, 1.0f}}); + + // 2D for vs pT + histos.add("hPAvsPt_All", "hPAvsPt_All", kTH2F, {{200, 0.0f, 20.0f}, {100, 0.0f, 1.0f}}); + histos.add("hPAvsPt_Correct", "hPAvsPt_Correct", kTH2F, {{200, 0.0f, 20.0f}, {100, 0.0f, 1.0f}}); + histos.add("hDCADaughtersvsPt_All", "hDCADaughtersvsPt_All", kTH2F, {{200, 0.0f, 20.0f}, {100, 0.0f, 5.0f}}); + histos.add("hDCADaughtersvsPt_Correct", "hDCADaughtersvsPt_Correct", kTH2F, {{200, 0.0f, 20.0f}, {100, 0.0f, 5.0f}}); + histos.add("hDCADaughters3DvsPt_All", "hDCADaughters3DvsPt_All", kTH2F, {{200, 0.0f, 20.0f}, {100, 0.0f, 5.0f}}); + histos.add("hDCADaughters3DvsPt_Correct", "hDCADaughters3DvsPt_Correct", kTH2F, {{200, 0.0f, 20.0f}, {100, 0.0f, 5.0f}}); + histos.add("hDCADaughtersXYvsPt_All", "hDCADaughtersXYvsPt_All", kTH2F, {{200, 0.0f, 20.0f}, {100, 0.0f, 5.0f}}); + histos.add("hDCADaughtersXYvsPt_Correct", "hDCADaughtersXYvsPt_Correct", kTH2F, {{200, 0.0f, 20.0f}, {100, 0.0f, 5.0f}}); + histos.add("hDCADaughtersZvsPt_All", "hDCADaughtersZvsPt_All", kTH2F, {{200, 0.0f, 20.0f}, {100, 0.0f, 5.0f}}); + histos.add("hDCADaughtersZvsPt_Correct", "hDCADaughtersZvsPt_Correct", kTH2F, {{200, 0.0f, 20.0f}, {100, 0.0f, 5.0f}}); + + // winner-takes-all criteria spectra + histos.add("hCorrect_BestPA", "hCorrect_BestPA", kTH1F, {{200, 0.0f, 20.0f}}); + histos.add("hCorrect_BestDCADau", "hCorrect_DCADau", kTH1F, {{200, 0.0f, 20.0f}}); + histos.add("hCorrect_BestDCADau3D", "hCorrect_DCADau3D", kTH1F, {{200, 0.0f, 20.0f}}); + histos.add("hCorrect_BestDCADauXY", "hCorrect_DCADauXY", kTH1F, {{200, 0.0f, 20.0f}}); + histos.add("hCorrect_BestDCADauZ", "hCorrect_DCADauZ", kTH1F, {{200, 0.0f, 20.0f}}); + histos.add("hCorrect_BestPAandDCADau3D", "hCorrect_BestPAandDCADau3D", kTH1F, {{200, 0.0f, 20.0f}}); + + ccdb->setURL(ccdbConfigurations.ccdburl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setFatalWhenNull(false); + + // set V0 parameters in the helper + straHelper.v0selections.minCrossedRows = v0BuilderOpts.minCrossedRows; + straHelper.v0selections.dcanegtopv = v0BuilderOpts.dcanegtopv; + straHelper.v0selections.dcapostopv = v0BuilderOpts.dcapostopv; + straHelper.v0selections.v0cospa = v0BuilderOpts.v0cospa; + straHelper.v0selections.dcav0dau = v0BuilderOpts.dcav0dau; + straHelper.v0selections.v0radius = v0BuilderOpts.v0radius; + straHelper.v0selections.maxDaughterEta = v0BuilderOpts.maxDaughterEta; + + // set cascade parameters in the helper + straHelper.cascadeselections.minCrossedRows = cascadeBuilderOpts.minCrossedRows; + straHelper.cascadeselections.dcabachtopv = cascadeBuilderOpts.dcabachtopv; + straHelper.cascadeselections.cascradius = cascadeBuilderOpts.cascradius; + straHelper.cascadeselections.casccospa = cascadeBuilderOpts.casccospa; + straHelper.cascadeselections.dcacascdau = cascadeBuilderOpts.dcacascdau; + straHelper.cascadeselections.lambdaMassWindow = cascadeBuilderOpts.lambdaMassWindow; + straHelper.cascadeselections.maxDaughterEta = cascadeBuilderOpts.maxDaughterEta; + } + + template + bool initCCDB(aod::BCsWithTimestamps const& bcs, TCollisions const& collisions) + { + auto bc = collisions.size() ? collisions.begin().template bc_as() : bcs.begin(); + if (!bcs.size()) { + LOGF(warn, "No BC found, skipping this DF."); + return false; // signal to skip this DF + } + + if (mRunNumber == bc.runNumber()) { + return true; + } + + auto timestamp = bc.timestamp(); + o2::parameters::GRPMagField* grpmag = 0x0; + + grpmag = ccdb->getForTimeStamp(ccdbConfigurations.grpmagPath, timestamp); + if (!grpmag) { + LOG(fatal) << "Got nullptr from CCDB for path " << ccdbConfigurations.grpmagPath << " of object GRPMagField for timestamp " << timestamp; + } + o2::base::Propagator::initFieldFromGRP(grpmag); + + // Fetch magnetic field from ccdb for current collision + auto magneticField = o2::base::Propagator::Instance()->getNominalBz(); + LOG(info) << "Retrieved GRP for timestamp " << timestamp << " with magnetic field of " << magneticField << " kG"; + + // Set magnetic field value once known + straHelper.fitter.setBz(magneticField); + + // acquire LUT for this timestamp + LOG(info) << "Loading material look-up table for timestamp: " << timestamp; + lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->getForTimeStamp(ccdbConfigurations.lutPath, timestamp)); + o2::base::Propagator::Instance()->setMatLUT(lut); + straHelper.lut = lut; + + LOG(info) << "Fully configured for run: " << bc.runNumber(); + // mmark this run as configured + mRunNumber = bc.runNumber(); + + // initialize only if needed, avoid unnecessary CCDB calls + mVDriftMgr.init(&ccdb->instance()); + mVDriftMgr.update(timestamp); + + return true; + } + + void process(soa::Join const& collisions, aod::McCollisions const& mcCollisions, aod::V0s const& V0s, LabeledTracksExtra const& tracks, aod::McParticles const& mcParticles, aod::BCsWithTimestamps const& bcs) + { + if (!initCCDB(bcs, collisions)) + return; + + std::vector v0tableGrouped = o2::pwglf::groupDuplicates(V0s); + + // determine map of McCollisions -> Collisions + std::vector> mcCollToColl(mcCollisions.size()); + for (auto const& collision : collisions) { + if (collision.mcCollisionId() > -1) { + // useful to determine if collision has been reconstructed afterwards + mcCollToColl[collision.mcCollisionId()].push_back(collision.globalIndex()); + } + } + + // simple inspection of grouped duplicates + for (size_t iV0 = 0; iV0 < v0tableGrouped.size(); iV0++) { + // base QA histograms + histos.fill(HIST("hDuplicateCount"), v0tableGrouped[iV0].collisionIds.size()); + if (v0tableGrouped[iV0].v0Type == 7) { + histos.fill(HIST("hDuplicateCountType7"), v0tableGrouped[iV0].collisionIds.size()); + } + + // Monte Carlo exclusive: process + auto pTrack = tracks.rawIteratorAt(v0tableGrouped[iV0].posTrackId); + auto nTrack = tracks.rawIteratorAt(v0tableGrouped[iV0].negTrackId); + bool pTrackTPCOnly = (pTrack.hasTPC() && !pTrack.hasITS() && !pTrack.hasTRD() && !pTrack.hasTOF()); + bool nTrackTPCOnly = (nTrack.hasTPC() && !nTrack.hasITS() && !nTrack.hasTRD() && !nTrack.hasTOF()); + + if (v0tableGrouped[iV0].v0Type == 7 && pTrackTPCOnly && nTrackTPCOnly) { + histos.fill(HIST("hDuplicateCountType7allTPConly"), v0tableGrouped[iV0].collisionIds.size()); + } + + int pTrackLabel = pTrack.mcParticleId(); + int nTrackLabel = nTrack.mcParticleId(); + int v0Label = findMotherFromLabels(pTrackLabel, nTrackLabel, -11, 11, 22, mcParticles); + int correctMcCollision = -1; + if (v0Label > -1) { + // this mc particle exists and is a gamma + auto mcV0 = mcParticles.rawIteratorAt(v0Label); + correctMcCollision = mcV0.mcCollisionId(); + + histos.fill(HIST("hPhotonPt"), mcV0.pt()); + + if (mcCollToColl[mcV0.mcCollisionId()].size() > 0) { + histos.fill(HIST("hPhotonPt_withRecoedMcCollision"), mcV0.pt()); + } + + bool hasCorrectCollisionCopy = false; + for (size_t ic = 0; ic < v0tableGrouped[iV0].collisionIds.size(); ic++) { + for (size_t imcc = 0; imcc < mcCollToColl[mcV0.mcCollisionId()].size(); imcc++) { + if (v0tableGrouped[iV0].collisionIds[ic] == mcCollToColl[mcV0.mcCollisionId()][imcc]) { + hasCorrectCollisionCopy = true; + } + } + } + + if (hasCorrectCollisionCopy) { + histos.fill(HIST("hPhotonPt_withCorrectCollisionCopy"), mcV0.pt()); + } + + std::vector v0duplicates; // Vector of v0 candidate duplicates + std::vector v0duplicatesCorrectlyAssociated; + + // de-duplication strategy tests start here + // store best-of index for cross-checking strict de-duplication techniques + + float bestPointingAngle = .99; + float bestDCADaughters = 1e+6; + float bestDCADaughters3D = 1e+6; + float bestDCADaughtersXY = 1e+6; + float bestDCADaughtersZ = 1e+6; + + bool bestPointingAngleCorrect = false; + bool bestDCADaughtersCorrect = false; + bool bestDCADaughters3DCorrect = false; + bool bestDCADaughtersXYCorrect = false; + bool bestDCADaughtersZCorrect = false; + + // START OF MAIN DUPLICATE LOOP IS HERE + for (size_t ic = 0; ic < v0tableGrouped[iV0].collisionIds.size(); ic++) { + // simple duplicate accounting + histos.fill(HIST("hPhotonPt_Duplicates"), mcV0.pt()); + + // check if candidate is correctly associated + bool correctlyAssociated = false; + for (size_t imcc = 0; imcc < mcCollToColl[correctMcCollision].size(); imcc++) { + if (v0tableGrouped[iV0].collisionIds[ic] == mcCollToColl[correctMcCollision][imcc]) { + correctlyAssociated = true; + } + } + // store check for correct association + v0duplicatesCorrectlyAssociated.push_back(correctlyAssociated); + + // actually treat tracks + auto posTrackPar = getTrackParCov(pTrack); + auto negTrackPar = getTrackParCov(nTrack); + + auto const& collision = collisions.rawIteratorAt(v0tableGrouped[iV0].collisionIds[ic]); + + // handle TPC-only tracks properly (photon conversions) + if (v0BuilderOpts.moveTPCOnlyTracks) { + bool isPosTPCOnly = (pTrack.hasTPC() && !pTrack.hasITS() && !pTrack.hasTRD() && !pTrack.hasTOF()); + if (isPosTPCOnly) { + // Nota bene: positive is TPC-only -> this entire V0 merits treatment as photon candidate + posTrackPar.setPID(o2::track::PID::Electron); + negTrackPar.setPID(o2::track::PID::Electron); + + if (!mVDriftMgr.moveTPCTrack>(collision, pTrack, posTrackPar)) { + return; + } + } + + bool isNegTPCOnly = (nTrack.hasTPC() && !nTrack.hasITS() && !nTrack.hasTRD() && !nTrack.hasTOF()); + if (isNegTPCOnly) { + // Nota bene: negative is TPC-only -> this entire V0 merits treatment as photon candidate + posTrackPar.setPID(o2::track::PID::Electron); + negTrackPar.setPID(o2::track::PID::Electron); + + if (!mVDriftMgr.moveTPCTrack>(collision, nTrack, negTrackPar)) { + return; + } + } + } // end TPC drift treatment + + // process candidate with helper + bool buildOK = straHelper.buildV0Candidate(v0tableGrouped[iV0].collisionIds[ic], collision.posX(), collision.posY(), collision.posZ(), pTrack, nTrack, posTrackPar, negTrackPar, true, false); + + v0duplicates.push_back(straHelper.v0); + + float daughterDCA3D = std::hypot( + straHelper.v0.positivePosition[0] - straHelper.v0.negativePosition[0], + straHelper.v0.positivePosition[1] - straHelper.v0.negativePosition[1], + straHelper.v0.positivePosition[2] - straHelper.v0.negativePosition[2]); + float daughterDCAXY = std::hypot( + straHelper.v0.positivePosition[0] - straHelper.v0.negativePosition[0], + straHelper.v0.positivePosition[1] - straHelper.v0.negativePosition[1]); + float daughterDCAZ = std::abs( + straHelper.v0.positivePosition[2] - straHelper.v0.negativePosition[2]); + + if (!buildOK) { + daughterDCA3D = daughterDCAXY = daughterDCAZ = 1e+6; + } + + histos.fill(HIST("hPA_All"), straHelper.v0.pointingAngle); + histos.fill(HIST("hPAvsPt_All"), mcV0.pt(), straHelper.v0.pointingAngle); + histos.fill(HIST("hDCADaughtersvsPt_All"), mcV0.pt(), straHelper.v0.daughterDCA); + histos.fill(HIST("hDCADaughters3DvsPt_All"), mcV0.pt(), daughterDCA3D); + histos.fill(HIST("hDCADaughtersXYvsPt_All"), mcV0.pt(), daughterDCAXY); + histos.fill(HIST("hDCADaughtersZvsPt_All"), mcV0.pt(), daughterDCAZ); + + if (correctlyAssociated) { + histos.fill(HIST("hPA_Correct"), straHelper.v0.pointingAngle); + histos.fill(HIST("hPAvsPt_Correct"), mcV0.pt(), straHelper.v0.pointingAngle); + histos.fill(HIST("hDCADaughtersvsPt_Correct"), mcV0.pt(), straHelper.v0.daughterDCA); + histos.fill(HIST("hDCADaughters3DvsPt_Correct"), mcV0.pt(), daughterDCA3D); + histos.fill(HIST("hDCADaughtersXYvsPt_Correct"), mcV0.pt(), daughterDCAXY); + histos.fill(HIST("hDCADaughtersZvsPt_Correct"), mcV0.pt(), daughterDCAZ); + } + + // check criteria + if (straHelper.v0.pointingAngle < bestPointingAngle) { + bestPointingAngle = straHelper.v0.pointingAngle; + bestPointingAngleCorrect = correctlyAssociated; + } + if (straHelper.v0.daughterDCA < bestDCADaughters) { + bestDCADaughters = straHelper.v0.daughterDCA; + bestDCADaughtersCorrect = correctlyAssociated; + } + if (daughterDCA3D < bestDCADaughters3D) { + bestDCADaughters3D = daughterDCA3D; + bestDCADaughters3DCorrect = correctlyAssociated; + } + if (daughterDCAXY < bestDCADaughtersXY) { + bestDCADaughtersXY = daughterDCAXY; + bestDCADaughtersXYCorrect = correctlyAssociated; + } + if (daughterDCAZ < bestDCADaughtersZ) { + bestDCADaughtersZ = daughterDCAZ; + bestDCADaughtersZCorrect = correctlyAssociated; + } + } // end duplicate loop + + if (hasCorrectCollisionCopy) { + // check individual criteria for winner-is-correct + if (bestPointingAngleCorrect) { + histos.fill(HIST("hCorrect_BestPA"), mcV0.pt()); + } + if (bestDCADaughtersCorrect) { + histos.fill(HIST("hCorrect_BestDCADau"), mcV0.pt()); + } + if (bestDCADaughters3DCorrect) { + histos.fill(HIST("hCorrect_BestDCADau3D"), mcV0.pt()); + } + if (bestDCADaughtersXYCorrect) { + histos.fill(HIST("hCorrect_BestDCADauXY"), mcV0.pt()); + } + if (bestDCADaughtersZCorrect) { + histos.fill(HIST("hCorrect_BestDCADauZ"), mcV0.pt()); + } + if (bestPointingAngleCorrect && bestDCADaughtersZCorrect) { + histos.fill(HIST("hCorrect_BestPAandDCADau3D"), mcV0.pt()); + } + } + + // printout for inspection + // TString cosPAString = ""; + // for (size_t iCollisionId = 0; iCollisionId < v0tableGrouped[iV0].collisionIds.size(); iCollisionId++) { + // cosPAString.Append(Form("%.5f ", v0duplicates[iCollisionId].pointingAngle)); + // } + // LOGF(info, "#%i (p,n) = (%i,%i), type %i, point. angles: %s", iV0, v0tableGrouped[iV0].posTrackId, v0tableGrouped[iV0].negTrackId, v0tableGrouped[iV0].v0Type, cosPAString.Data()); + } // end this-is-a-mc-gamma check + } + } +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc)}; +} diff --git a/PWGLF/Utils/strangenessBuilderHelper.h b/PWGLF/Utils/strangenessBuilderHelper.h index c0919f86825..afa6e410bc2 100644 --- a/PWGLF/Utils/strangenessBuilderHelper.h +++ b/PWGLF/Utils/strangenessBuilderHelper.h @@ -38,6 +38,101 @@ namespace o2 { namespace pwglf { +//__________________________________________ +// V0 group: abstraction to deal with duplicates +// in an intuitive manner +struct V0group { + std::vector V0Ids; // index list to original aod::V0s + std::vector collisionIds; // coll indices + int posTrackId; + int negTrackId; + uint8_t v0Type; +}; + +//_______________________________________________________________________ +template +std::vector sort_indices_posTrack(const std::vector& v) +{ + std::vector idx(v.size()); + std::iota(idx.begin(), idx.end(), 0); + std::stable_sort(idx.begin(), idx.end(), + [&v](std::size_t i1, std::size_t i2) { return v[i1].posTrackId < v[i2].posTrackId; }); + return idx; +} + +//_______________________________________________________________________ +template +std::vector sort_indices_negTrack(const std::vector& v) +{ + std::vector idx(v.size()); + std::iota(idx.begin(), idx.end(), 0); + std::stable_sort(idx.begin(), idx.end(), + [&v](std::size_t i1, std::size_t i2) { return v[i1].negTrackId < v[i2].negTrackId; }); + return idx; +} + +//_______________________________________________________________________ +// this function deals with the fact that V0s provided in AO2Ds may +// be duplicated in several collisions and groups them into entries +// of type pwglf::V0group, each entry having the same neg/pos tracks +// but an array of compatible collisions. The original V0 indices +// are preserved in the resulting structure to allow for easy referencing +// back afterwards. Algorithmically, full N^2 loops and/or multiple +// find calls are avoided via sorting. +template +std::vector groupDuplicates(const T& V0s) +{ + std::vector v0table; + V0group thisV0; + thisV0.V0Ids.push_back(-1); // create one single element + thisV0.collisionIds.push_back(-1); // create one single element + for (auto const& V0 : V0s) { + thisV0.V0Ids[0] = V0.globalIndex(); + thisV0.collisionIds[0] = V0.collisionId(); + thisV0.posTrackId = V0.posTrackId(); + thisV0.negTrackId = V0.negTrackId(); + thisV0.v0Type = V0.v0Type(); + v0table.push_back(thisV0); + } + + // sort tracks according to positive track index to avoid excessive N^2 searches + auto posTrackSort = sort_indices_posTrack(v0table); + + // create a proper list of V0s including duplicates: collisionIds is now a vector + int atPosTrackId = v0table[posTrackSort[0]].posTrackId; + std::vector v0tableFixedPositive; // small list with fixed positive id + std::vector v0tableGrouped; // final list with proper grouping + for (size_t iV0 = 0; iV0 < posTrackSort.size(); iV0++) { + if (atPosTrackId != v0table[posTrackSort[iV0]].posTrackId) { + // switched pos track id. Process chunk of V0s + auto negTrackSort = sort_indices_negTrack(v0tableFixedPositive); + thisV0.collisionIds.clear(); + thisV0.V0Ids.clear(); + thisV0.negTrackId = v0tableFixedPositive[negTrackSort[0]].negTrackId; + for (size_t iPV0 = 0; iPV0 < v0tableFixedPositive.size(); iPV0++) { + if (thisV0.negTrackId != v0tableFixedPositive[negTrackSort[iPV0]].negTrackId) { + v0tableGrouped.push_back(thisV0); + thisV0.collisionIds.clear(); // clean collision Ids + thisV0.V0Ids.clear(); // clean aod::V0s Ids + } + thisV0.V0Ids.push_back(v0tableFixedPositive[negTrackSort[iPV0]].V0Ids[0]); + thisV0.collisionIds.push_back(v0tableFixedPositive[negTrackSort[iPV0]].collisionIds[0]); + thisV0.posTrackId = v0tableFixedPositive[negTrackSort[iPV0]].posTrackId; + thisV0.negTrackId = v0tableFixedPositive[negTrackSort[iPV0]].negTrackId; + thisV0.v0Type = v0tableFixedPositive[negTrackSort[iPV0]].v0Type; + } + v0tableGrouped.push_back(thisV0); // publish last + v0tableFixedPositive.clear(); + atPosTrackId = v0table[posTrackSort[iV0]].posTrackId; // move to the next pos index + } + v0tableFixedPositive.push_back(v0table[posTrackSort[iV0]]); + } + v0tableGrouped.push_back(thisV0); // publish last + + LOGF(info, "Duplicate V0s grouped. aod::V0s counted: %i, unique index pairs: %i", V0s.size(), v0tableGrouped.size()); + return v0tableGrouped; +} + //__________________________________________ // V0 information storage struct v0candidate { @@ -60,8 +155,8 @@ struct v0candidate { std::array momentum = {0.0f, 0.0f, 0.0f}; // necessary for KF std::array position = {0.0f, 0.0f, 0.0f}; float daughterDCA = 1000.0f; - float pointingAngle = 0.0f; - float dcaXY = 0.0f; + float pointingAngle = 1.0f; + float dcaToPV = 0.0f; // calculated masses for convenience float massGamma; @@ -163,7 +258,10 @@ class strangenessBuilderHelper fitter.setBz(-999.9f); // will NOT make sense if not changed }; - template + //_______________________________________________________________________ + // standard build V0 function. Populates ::v0 object + // ::v0 will be initialized to defaults if build fails + template bool buildV0Candidate(int collisionIndex, float pvX, float pvY, float pvZ, TTrack const& positiveTrack, @@ -173,20 +271,25 @@ class strangenessBuilderHelper bool useCollinearFit = false, bool calculateCovariance = false) { - // verify track quality - if (positiveTrack.tpcNClsCrossedRows() < v0selections.minCrossedRows) { - return false; - } - if (negativeTrack.tpcNClsCrossedRows() < v0selections.minCrossedRows) { - return false; - } - - // verify eta - if (std::fabs(positiveTrack.eta()) > v0selections.maxDaughterEta) { - return false; - } - if (std::fabs(negativeTrack.eta()) > v0selections.maxDaughterEta) { - return false; + if constexpr (useSelections) { + // verify track quality + if (positiveTrack.tpcNClsCrossedRows() < v0selections.minCrossedRows) { + v0 = {}; + return false; + } + if (negativeTrack.tpcNClsCrossedRows() < v0selections.minCrossedRows) { + v0 = {}; + return false; + } + // verify eta + if (std::fabs(positiveTrack.eta()) > v0selections.maxDaughterEta) { + v0 = {}; + return false; + } + if (std::fabs(negativeTrack.eta()) > v0selections.maxDaughterEta) { + v0 = {}; + return false; + } } // Calculate DCA with respect to the collision associated to the V0 @@ -199,15 +302,21 @@ class strangenessBuilderHelper o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, positiveTrackParamCopy, 2.f, fitter.getMatCorrType(), &dcaInfo); v0.positiveDCAxy = dcaInfo[0]; - if (std::fabs(v0.positiveDCAxy) < v0selections.dcanegtopv) { - return false; + if constexpr (useSelections) { + if (std::fabs(v0.positiveDCAxy) < v0selections.dcanegtopv) { + v0 = {}; + return false; + } } o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, negativeTrackParamCopy, 2.f, fitter.getMatCorrType(), &dcaInfo); v0.negativeDCAxy = dcaInfo[0]; - if (std::fabs(v0.negativeDCAxy) < v0selections.dcanegtopv) { - return false; + if constexpr (useSelections) { + if (std::fabs(v0.negativeDCAxy) < v0selections.dcanegtopv) { + v0 = {}; + return false; + } } // Perform DCA fit @@ -216,9 +325,11 @@ class strangenessBuilderHelper try { nCand = fitter.process(positiveTrackParam, negativeTrackParam); } catch (...) { + v0 = {}; return false; } if (nCand == 0) { + v0 = {}; return false; } fitter.setCollinear(false); // proper cleaning: when exiting this loop, always reset to not collinear @@ -242,26 +353,35 @@ class strangenessBuilderHelper v0.position[i] = vtx[i]; } - if (std::hypot(v0.position[0], v0.position[1]) < v0selections.v0radius) { - return false; + if constexpr (useSelections) { + if (std::hypot(v0.position[0], v0.position[1]) < v0selections.v0radius) { + v0 = {}; + return false; + } } v0.daughterDCA = TMath::Sqrt(fitter.getChi2AtPCACandidate()); - if (v0.daughterDCA > v0selections.dcav0dau) { - return false; + if constexpr (useSelections) { + if (v0.daughterDCA > v0selections.dcav0dau) { + v0 = {}; + return false; + } } double cosPA = RecoDecay::cpa( std::array{pvX, pvY, pvZ}, std::array{v0.position[0], v0.position[1], v0.position[2]}, std::array{v0.positiveMomentum[0] + v0.negativeMomentum[0], v0.positiveMomentum[1] + v0.negativeMomentum[1], v0.positiveMomentum[2] + v0.negativeMomentum[2]}); - if (cosPA < v0selections.v0cospa) { - return false; + if constexpr (useSelections) { + if (cosPA < v0selections.v0cospa) { + v0 = {}; + return false; + } } v0.pointingAngle = TMath::ACos(cosPA); - v0.dcaXY = CalculateDCAStraightToPV( + v0.dcaToPV = CalculateDCAStraightToPV( v0.position[0], v0.position[1], v0.position[2], v0.positiveMomentum[0] + v0.negativeMomentum[0], v0.positiveMomentum[1] + v0.negativeMomentum[1], @@ -314,6 +434,9 @@ class strangenessBuilderHelper return true; } + //_______________________________________________________________________ + // build V0 with KF function. Populates ::v0 object + // ::v0 will be initialized to defaults if build fails template bool buildV0CandidateWithKF(TCollision const& collision, TTrack const& positiveTrack, @@ -331,17 +454,21 @@ class strangenessBuilderHelper // verify track quality if (positiveTrack.tpcNClsCrossedRows() < v0selections.minCrossedRows) { + v0 = {}; return false; } if (negativeTrack.tpcNClsCrossedRows() < v0selections.minCrossedRows) { + v0 = {}; return false; } // verify eta if (std::fabs(positiveTrack.eta()) > v0selections.maxDaughterEta) { + v0 = {}; return false; } if (std::fabs(negativeTrack.eta()) > v0selections.maxDaughterEta) { + v0 = {}; return false; } @@ -356,6 +483,7 @@ class strangenessBuilderHelper v0.positiveDCAxy = dcaInfo[0]; if (std::fabs(v0.positiveDCAxy) < v0selections.dcanegtopv) { + v0 = {}; return false; } @@ -363,6 +491,7 @@ class strangenessBuilderHelper v0.negativeDCAxy = dcaInfo[0]; if (std::fabs(v0.negativeDCAxy) < v0selections.dcanegtopv) { + v0 = {}; return false; } @@ -383,6 +512,7 @@ class strangenessBuilderHelper KFV0.Construct(V0Daughters, 2); } catch (std::runtime_error& e) { LOG(debug) << "Failed to construct cascade V0 from daughter tracks: " << e.what(); + v0 = {}; return false; } @@ -410,6 +540,7 @@ class strangenessBuilderHelper kfpPos_DecayVtx.GetZ() - kfpNeg_DecayVtx.GetZ()); if (v0.daughterDCA > v0selections.dcav0dau) { + v0 = {}; return false; } @@ -418,6 +549,7 @@ class strangenessBuilderHelper v0.position[i] = xyz_decay[i]; } if (std::hypot(v0.position[0], v0.position[1]) < v0selections.v0radius) { + v0 = {}; return false; } @@ -427,11 +559,12 @@ class strangenessBuilderHelper // deal with pointing angle float cosPA = cpaFromKF(KFV0, KFPV); if (cosPA < v0selections.v0cospa) { + v0 = {}; return false; } v0.pointingAngle = TMath::ACos(cosPA); - v0.dcaXY = CalculateDCAStraightToPV( + v0.dcaToPV = CalculateDCAStraightToPV( v0.position[0], v0.position[1], v0.position[2], v0.momentum[0], v0.momentum[1], v0.momentum[2], pvX, pvY, pvZ); @@ -469,6 +602,10 @@ class strangenessBuilderHelper return true; } + //_______________________________________________________________________ + // build Cascade from three tracks, including V0 building. + // Populates ::cascade object. + // ::cascade will be initialized to defaults if build fails // cascade builder creating a cascade from plain tracks template bool buildCascadeCandidate(int collisionIndex, @@ -493,9 +630,13 @@ class strangenessBuilderHelper return true; } + //_______________________________________________________________________ // cascade builder using pre-fabricated information, thus not calling // the DCAfitter again for the V0 contained in the cascade - // if generating from scratch, prefer the other variant + // If building from scratch, prefer previous version! + // Populates ::cascade object. + // ::cascade will be initialized to defaults if build fails + // cascade builder creating a cascade from plain tracks template bool buildCascadeCandidate(int collisionIndex, float pvX, float pvY, float pvZ, @@ -509,31 +650,39 @@ class strangenessBuilderHelper { // verify track quality if (positiveTrack.tpcNClsCrossedRows() < cascadeselections.minCrossedRows) { + cascade = {}; return false; } if (negativeTrack.tpcNClsCrossedRows() < cascadeselections.minCrossedRows) { + cascade = {}; return false; } if (bachelorTrack.tpcNClsCrossedRows() < cascadeselections.minCrossedRows) { + cascade = {}; return false; } // verify eta if (std::fabs(positiveTrack.eta()) > cascadeselections.maxDaughterEta) { + cascade = {}; return false; } if (std::fabs(negativeTrack.eta()) > cascadeselections.maxDaughterEta) { + cascade = {}; return false; } if (std::fabs(bachelorTrack.eta()) > cascadeselections.maxDaughterEta) { + cascade = {}; return false; } // verify lambda mass if (bachelorTrack.sign() < 0 && std::fabs(v0input.massLambda - 1.116) > cascadeselections.lambdaMassWindow) { + cascade = {}; return false; } if (bachelorTrack.sign() > 0 && std::fabs(v0input.massAntiLambda - 1.116) > cascadeselections.lambdaMassWindow) { + cascade = {}; return false; } @@ -559,6 +708,7 @@ class strangenessBuilderHelper cascade.bachelorDCAxy = dcaInfo[0]; if (std::fabs(cascade.bachelorDCAxy) < cascadeselections.dcabachtopv) { + cascade = {}; return false; } @@ -585,10 +735,13 @@ class strangenessBuilderHelper try { nCand = fitter.process(lV0Track, lBachelorTrack); } catch (...) { + cascade = {}; return false; } - if (nCand == 0) + if (nCand == 0) { + cascade = {}; return false; + } lV0Track = fitter.getTrack(0); lBachelorTrack = fitter.getTrack(1); @@ -596,6 +749,7 @@ class strangenessBuilderHelper // DCA between cascade daughters cascade.cascadeDaughterDCA = TMath::Sqrt(fitter.getChi2AtPCACandidate()); if (cascade.cascadeDaughterDCA > cascadeselections.dcacascdau) { + cascade = {}; return false; } @@ -606,6 +760,7 @@ class strangenessBuilderHelper cascade.cascadePosition[i] = vtx[i]; } if (std::hypot(cascade.cascadePosition[0], cascade.cascadePosition[1]) < cascadeselections.cascradius) { + cascade = {}; return false; } @@ -616,6 +771,7 @@ class strangenessBuilderHelper v0input.positiveMomentum[1] + v0input.negativeMomentum[1] + cascade.bachelorMomentum[1], v0input.positiveMomentum[2] + v0input.negativeMomentum[2] + cascade.bachelorMomentum[2]}); if (cosPA < cascadeselections.casccospa) { + cascade = {}; return false; } cascade.pointingAngle = TMath::ACos(cosPA); @@ -703,6 +859,11 @@ class strangenessBuilderHelper return true; } + //_______________________________________________________________________ + // build KF Cascade from three tracks, including V0 building. + // Populates ::cascade object. + // ::cascade will be initialized to defaults if build fails + // cascade builder creating a cascade from plain tracks template bool buildCascadeCandidateWithKF(int collisionIndex, float pvX, float pvY, float pvZ, @@ -723,23 +884,29 @@ class strangenessBuilderHelper //*>~<*>~<*>~<*>~<*>~<*>~<*>~<*>~<*>~<* if (positiveTrack.tpcNClsCrossedRows() < cascadeselections.minCrossedRows) { + cascade = {}; return false; } if (negativeTrack.tpcNClsCrossedRows() < cascadeselections.minCrossedRows) { + cascade = {}; return false; } if (bachelorTrack.tpcNClsCrossedRows() < cascadeselections.minCrossedRows) { + cascade = {}; return false; } // verify eta if (std::fabs(positiveTrack.eta()) > cascadeselections.maxDaughterEta) { + cascade = {}; return false; } if (std::fabs(negativeTrack.eta()) > cascadeselections.maxDaughterEta) { + cascade = {}; return false; } if (std::fabs(bachelorTrack.eta()) > cascadeselections.maxDaughterEta) { + cascade = {}; return false; } @@ -771,6 +938,7 @@ class strangenessBuilderHelper cascade.negativeDCAxy = dcaInfo[0]; if (std::fabs(cascade.bachelorDCAxy) < cascadeselections.dcabachtopv) { + cascade = {}; return false; } @@ -796,9 +964,11 @@ class strangenessBuilderHelper nCand = fitter.process(posTrackParCov, negTrackParCov); } catch (...) { LOG(error) << "Exception caught in DCA fitter process call!"; + cascade = {}; return false; } if (nCand == 0) { + cascade = {}; return false; } // save classical DCA daughters @@ -823,6 +993,7 @@ class strangenessBuilderHelper KFV0.Construct(V0Daughters, 2); } catch (std::runtime_error& e) { LOG(debug) << "Failed to construct cascade V0 from daughter tracks: " << e.what(); + cascade = {}; return false; } @@ -843,10 +1014,13 @@ class strangenessBuilderHelper nCandCascade = fitter.process(v0TrackParCov, lBachelorTrack); } catch (...) { LOG(error) << "Exception caught in DCA fitter process call!"; + cascade = {}; return false; } - if (nCandCascade == 0) + if (nCandCascade == 0) { + cascade = {}; return false; + } v0TrackParCov = fitter.getTrack(0); lBachelorTrack = fitter.getTrack(1); @@ -871,12 +1045,14 @@ class strangenessBuilderHelper KFXi.Construct(XiDaugthers, 2); } catch (std::runtime_error& e) { LOG(debug) << "Failed to construct xi from V0 and bachelor track: " << e.what(); + cascade = {}; return false; } try { KFOmega.Construct(OmegaDaugthers, 2); } catch (std::runtime_error& e) { LOG(debug) << "Failed to construct omega from V0 and bachelor track: " << e.what(); + cascade = {}; return false; } if (kfUseCascadeMassConstraint) { @@ -891,6 +1067,7 @@ class strangenessBuilderHelper // get DCA of daughters at vertex cascade.cascadeDaughterDCA = kfpBachPion.GetDistanceFromParticle(kfpV0); if (cascade.cascadeDaughterDCA > cascadeselections.dcacascdau) { + cascade = {}; return false; } @@ -961,6 +1138,7 @@ class strangenessBuilderHelper cascade.cascadeMomentum[2] = KFOmega.GetPz(); } if (std::hypot(cascade.cascadePosition[0], cascade.cascadePosition[1]) < cascadeselections.cascradius) { + cascade = {}; return false; } @@ -970,6 +1148,7 @@ class strangenessBuilderHelper std::array{cascade.cascadePosition[0], cascade.cascadePosition[1], cascade.cascadePosition[2]}, std::array{cascade.cascadeMomentum[0], cascade.cascadeMomentum[1], cascade.cascadeMomentum[2]}); if (cosPA < cascadeselections.casccospa) { + cascade = {}; return false; } cascade.pointingAngle = TMath::ACos(cosPA); @@ -1038,7 +1217,7 @@ class strangenessBuilderHelper } cascadeselections; private: - // internal helper to calculate DCAxy of a straight line to a given PV analytically + // internal helper to calculate DCA (3D) of a straight line to a given PV analytically float CalculateDCAStraightToPV(float X, float Y, float Z, float Px, float Py, float Pz, float pvX, float pvY, float pvZ) { return std::sqrt((std::pow((pvY - Y) * Pz - (pvZ - Z) * Py, 2) + std::pow((pvX - X) * Pz - (pvZ - Z) * Px, 2) + std::pow((pvX - X) * Py - (pvY - Y) * Px, 2)) / (Px * Px + Py * Py + Pz * Pz)); From a861c167072b1507f7933619422322a0af23d8a8 Mon Sep 17 00:00:00 2001 From: nzardosh Date: Sun, 13 Apr 2025 22:17:04 +0200 Subject: [PATCH 0973/1650] [PWGHF] Fix B+ selection in derived data creator (#10829) --- PWGHF/TableProducer/derivedDataCreatorBplusToD0Pi.cxx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/PWGHF/TableProducer/derivedDataCreatorBplusToD0Pi.cxx b/PWGHF/TableProducer/derivedDataCreatorBplusToD0Pi.cxx index bf49a415a88..abaf1573166 100644 --- a/PWGHF/TableProducer/derivedDataCreatorBplusToD0Pi.cxx +++ b/PWGHF/TableProducer/derivedDataCreatorBplusToD0Pi.cxx @@ -93,7 +93,7 @@ struct HfDerivedDataCreatorBplusToD0Pi { using TypeMcCollisions = soa::Join; using THfCandDaughtersMl = soa::Join; - Filter filterSelectCandidates = aod::hf_sel_candidate_bplus::isSelBplusToD0Pi >= 1; + Filter filterSelectCandidates = (aod::hf_sel_candidate_bplus::isSelBplusToD0Pi & static_cast(BIT(aod::SelectionStep::RecoMl - 1))) != 0; Filter filterMcGenMatching = nabs(aod::hf_cand_bplus::flagMcMatchGen) == static_cast(BIT(aod::hf_cand_bplus::DecayType::BplusToD0Pi)); Preslice candidatesPerCollision = aod::hf_cand::collisionId; @@ -272,6 +272,11 @@ struct HfDerivedDataCreatorBplusToD0Pi { } int8_t flagMcRec = 0, origin = 0; for (const auto& candidate : candidatesThisColl) { + if constexpr (isMl) { + if (!TESTBIT(candidate.isSelBplusToD0Pi(), aod::SelectionStep::RecoMl)) { + continue; + } + } if constexpr (isMc) { flagMcRec = candidate.flagMcMatchRec(); origin = candidate.originMcRec(); From b69fd8cd67a00245bb839d52700d730f63fde009 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Sun, 13 Apr 2025 22:24:33 +0200 Subject: [PATCH 0974/1650] [PWGEM/Dilepton] add BC info (#10832) --- PWGEM/Dilepton/Core/Dilepton.h | 84 ++++++++++------ PWGEM/Dilepton/Core/DileptonMC.h | 76 ++++++++++----- PWGEM/Dilepton/Core/SingleTrackQC.h | 48 +++++++--- PWGEM/Dilepton/Core/SingleTrackQCMC.h | 50 +++++++--- PWGEM/Dilepton/DataModel/dileptonTables.h | 14 +++ .../TableProducer/associateMCinfoDilepton.cxx | 44 +++++---- .../TableProducer/createEMEventDilepton.cxx | 21 ++-- .../TableProducer/skimmerPrimaryElectron.cxx | 96 +++++++++---------- .../TableProducer/skimmerPrimaryMuon.cxx | 2 +- PWGEM/Dilepton/Tasks/matchingMFT.cxx | 2 +- 10 files changed, 284 insertions(+), 153 deletions(-) diff --git a/PWGEM/Dilepton/Core/Dilepton.h b/PWGEM/Dilepton/Core/Dilepton.h index 19180bc2292..684c836a5d2 100644 --- a/PWGEM/Dilepton/Core/Dilepton.h +++ b/PWGEM/Dilepton/Core/Dilepton.h @@ -317,7 +317,7 @@ struct Dilepton { if (ConfVtxBins.value[0] == VARIABLE_WIDTH) { zvtx_bin_edges = std::vector(ConfVtxBins.value.begin(), ConfVtxBins.value.end()); zvtx_bin_edges.erase(zvtx_bin_edges.begin()); - for (auto& edge : zvtx_bin_edges) { + for (const auto& edge : zvtx_bin_edges) { LOGF(info, "VARIABLE_WIDTH: zvtx_bin_edges = %f", edge); } } else { @@ -334,7 +334,7 @@ struct Dilepton { if (ConfCentBins.value[0] == VARIABLE_WIDTH) { cent_bin_edges = std::vector(ConfCentBins.value.begin(), ConfCentBins.value.end()); cent_bin_edges.erase(cent_bin_edges.begin()); - for (auto& edge : cent_bin_edges) { + for (const auto& edge : cent_bin_edges) { LOGF(info, "VARIABLE_WIDTH: cent_bin_edges = %f", edge); } } else { @@ -351,7 +351,7 @@ struct Dilepton { if (ConfEPBins.value[0] == VARIABLE_WIDTH) { ep_bin_edges = std::vector(ConfEPBins.value.begin(), ConfEPBins.value.end()); ep_bin_edges.erase(ep_bin_edges.begin()); - for (auto& edge : ep_bin_edges) { + for (const auto& edge : ep_bin_edges) { LOGF(info, "VARIABLE_WIDTH: ep_bin_edges = %f", edge); } } else { @@ -369,7 +369,7 @@ struct Dilepton { if (ConfOccupancyBins.value[0] == VARIABLE_WIDTH) { occ_bin_edges = std::vector(ConfOccupancyBins.value.begin(), ConfOccupancyBins.value.end()); occ_bin_edges.erase(occ_bin_edges.begin()); - for (auto& edge : occ_bin_edges) { + for (const auto& edge : occ_bin_edges) { LOGF(info, "VARIABLE_WIDTH: occ_bin_edges = %f", edge); } } else { @@ -406,6 +406,13 @@ struct Dilepton { if (doprocessTriggerAnalysis) { fRegistry.add("Event/hNInspectedTVX", "N inspected TVX;run number;N_{TVX}", kTProfile, {{80000, 520000.5, 600000.5}}, true); } + if (doprocessBC) { + auto hTVXCounter = fRegistry.add("BC/hTVXCounter", "TVX counter", kTH1D, {{4, -0.5f, 3.5f}}); + hTVXCounter->GetXaxis()->SetBinLabel(1, "TVX"); + hTVXCounter->GetXaxis()->SetBinLabel(2, "TVX && NoTFB"); + hTVXCounter->GetXaxis()->SetBinLabel(3, "TVX && NoITSROFB"); + hTVXCounter->GetXaxis()->SetBinLabel(4, "TVX && NoTFB && NoITSROFB"); + } } template @@ -737,7 +744,7 @@ struct Dilepton { bool isGoodQvector(TQvectors const& qvectors) { bool is_good = true; - for (auto& qn : qvectors[nmod]) { + for (const auto& qn : qvectors[nmod]) { if (std::fabs(qn[0]) > 20.f || std::fabs(qn[1]) > 20.f) { is_good = false; break; @@ -1122,7 +1129,7 @@ struct Dilepton { template void runPairing(TCollisions const& collisions, TLeptons const& posTracks, TLeptons const& negTracks, TPresilce const& perCollision, TCut const& cut, TAllTracks const& tracks) { - for (auto& collision : collisions) { + for (const auto& collision : collisions) { initCCDB(collision); const float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; float centrality = centralities[cfgCentEstimator]; @@ -1196,19 +1203,19 @@ struct Dilepton { // LOGF(info, "collision.globalIndex() = %d , collision.posZ() = %f , collision.numContrib() = %d, centrality = %f , posTracks_per_coll.size() = %d, negTracks_per_coll.size() = %d", collision.globalIndex(), collision.posZ(), collision.numContrib(), centralities[cfgCentEstimator], posTracks_per_coll.size(), negTracks_per_coll.size()); int nuls = 0, nlspp = 0, nlsmm = 0; - for (auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, negTracks_per_coll))) { // ULS + for (const auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, negTracks_per_coll))) { // ULS bool is_pair_ok = fillPairInfo<0>(collision, pos, neg, cut, tracks); if (is_pair_ok) { nuls++; } } - for (auto& [pos1, pos2] : combinations(CombinationsStrictlyUpperIndexPolicy(posTracks_per_coll, posTracks_per_coll))) { // LS++ + for (const auto& [pos1, pos2] : combinations(CombinationsStrictlyUpperIndexPolicy(posTracks_per_coll, posTracks_per_coll))) { // LS++ bool is_pair_ok = fillPairInfo<0>(collision, pos1, pos2, cut, tracks); if (is_pair_ok) { nlspp++; } } - for (auto& [neg1, neg2] : combinations(CombinationsStrictlyUpperIndexPolicy(negTracks_per_coll, negTracks_per_coll))) { // LS-- + for (const auto& [neg1, neg2] : combinations(CombinationsStrictlyUpperIndexPolicy(negTracks_per_coll, negTracks_per_coll))) { // LS-- bool is_pair_ok = fillPairInfo<0>(collision, neg1, neg2, cut, tracks); if (is_pair_ok) { nlsmm++; @@ -1269,7 +1276,7 @@ struct Dilepton { auto collisionIds_in_mixing_pool = emh_pos->GetCollisionIdsFromEventPool(key_bin); // pos/neg does not matter. // LOGF(info, "collisionIds_in_mixing_pool.size() = %d", collisionIds_in_mixing_pool.size()); - for (auto& mix_dfId_collisionId : collisionIds_in_mixing_pool) { + for (const auto& mix_dfId_collisionId : collisionIds_in_mixing_pool) { int mix_dfId = mix_dfId_collisionId.first; int mix_collisionId = mix_dfId_collisionId.second; if (collision.globalIndex() == mix_collisionId && ndf == mix_dfId) { // this never happens. only protection. @@ -1287,26 +1294,26 @@ struct Dilepton { auto negTracks_from_event_pool = emh_neg->GetTracksPerCollision(mix_dfId_collisionId); // LOGF(info, "Do event mixing: current event (%d, %d) | event pool (%d, %d), npos = %d , nneg = %d", ndf, collision.globalIndex(), mix_dfId, mix_collisionId, posTracks_from_event_pool.size(), negTracks_from_event_pool.size()); - for (auto& pos : selected_posTracks_in_this_event) { // ULS mix - for (auto& neg : negTracks_from_event_pool) { + for (const auto& pos : selected_posTracks_in_this_event) { // ULS mix + for (const auto& neg : negTracks_from_event_pool) { fillPairInfo<1>(collision, pos, neg, cut, tracks); } } - for (auto& neg : selected_negTracks_in_this_event) { // ULS mix - for (auto& pos : posTracks_from_event_pool) { + for (const auto& neg : selected_negTracks_in_this_event) { // ULS mix + for (const auto& pos : posTracks_from_event_pool) { fillPairInfo<1>(collision, neg, pos, cut, tracks); } } - for (auto& pos1 : selected_posTracks_in_this_event) { // LS++ mix - for (auto& pos2 : posTracks_from_event_pool) { + for (const auto& pos1 : selected_posTracks_in_this_event) { // LS++ mix + for (const auto& pos2 : posTracks_from_event_pool) { fillPairInfo<1>(collision, pos1, pos2, cut, tracks); } } - for (auto& neg1 : selected_negTracks_in_this_event) { // LS-- mix - for (auto& neg2 : negTracks_from_event_pool) { + for (const auto& neg1 : selected_negTracks_in_this_event) { // LS-- mix + for (const auto& neg2 : negTracks_from_event_pool) { fillPairInfo<1>(collision, neg1, neg2, cut, tracks); } } @@ -1367,7 +1374,7 @@ struct Dilepton { std::vector> passed_pairIds; passed_pairIds.reserve(posTracks.size() * negTracks.size()); - for (auto& collision : collisions) { + for (const auto& collision : collisions) { initCCDB(collision); const float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { @@ -1411,17 +1418,17 @@ struct Dilepton { auto posTracks_per_coll = posTracks.sliceByCached(perCollision, collision.globalIndex(), cache); auto negTracks_per_coll = negTracks.sliceByCached(perCollision, collision.globalIndex(), cache); - for (auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, negTracks_per_coll))) { // ULS + for (const auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, negTracks_per_coll))) { // ULS if (isPairOK(collision, pos, neg, cut, tracks)) { passed_pairIds.emplace_back(std::make_pair(pos.globalIndex(), neg.globalIndex())); } } - for (auto& [pos1, pos2] : combinations(CombinationsStrictlyUpperIndexPolicy(posTracks_per_coll, posTracks_per_coll))) { // LS++ + for (const auto& [pos1, pos2] : combinations(CombinationsStrictlyUpperIndexPolicy(posTracks_per_coll, posTracks_per_coll))) { // LS++ if (isPairOK(collision, pos1, pos2, cut, tracks)) { passed_pairIds.emplace_back(std::make_pair(pos1.globalIndex(), pos2.globalIndex())); } } - for (auto& [neg1, neg2] : combinations(CombinationsStrictlyUpperIndexPolicy(negTracks_per_coll, negTracks_per_coll))) { // LS-- + for (const auto& [neg1, neg2] : combinations(CombinationsStrictlyUpperIndexPolicy(negTracks_per_coll, negTracks_per_coll))) { // LS-- if (isPairOK(collision, neg1, neg2, cut, tracks)) { passed_pairIds.emplace_back(std::make_pair(neg1.globalIndex(), neg2.globalIndex())); } @@ -1429,14 +1436,14 @@ struct Dilepton { } // end of collision loop if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { - for (auto& pairId : passed_pairIds) { + for (const auto& pairId : passed_pairIds) { auto t1 = tracks.rawIteratorAt(std::get<0>(pairId)); auto t2 = tracks.rawIteratorAt(std::get<1>(pairId)); // LOGF(info, "std::get<0>(pairId) = %d, std::get<1>(pairId) = %d, t1.globalIndex() = %d, t2.globalIndex() = %d", std::get<0>(pairId), std::get<1>(pairId), t1.globalIndex(), t2.globalIndex()); float n = 1.f; // include myself. - for (auto& ambId1 : t1.ambiguousElectronsIds()) { - for (auto& ambId2 : t2.ambiguousElectronsIds()) { + for (const auto& ambId1 : t1.ambiguousElectronsIds()) { + for (const auto& ambId2 : t2.ambiguousElectronsIds()) { if (std::find(passed_pairIds.begin(), passed_pairIds.end(), std::make_pair(ambId1, ambId2)) != passed_pairIds.end()) { n += 1.f; } @@ -1445,13 +1452,13 @@ struct Dilepton { map_weight[pairId] = 1.f / n; } // end of passed_pairIds loop } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { - for (auto& pairId : passed_pairIds) { + for (const auto& pairId : passed_pairIds) { auto t1 = tracks.rawIteratorAt(std::get<0>(pairId)); auto t2 = tracks.rawIteratorAt(std::get<1>(pairId)); float n = 1.f; // include myself. - for (auto& ambId1 : t1.ambiguousMuonsIds()) { - for (auto& ambId2 : t2.ambiguousMuonsIds()) { + for (const auto& ambId1 : t1.ambiguousMuonsIds()) { + for (const auto& ambId2 : t2.ambiguousMuonsIds()) { if (std::find(passed_pairIds.begin(), passed_pairIds.end(), std::make_pair(ambId1, ambId2)) != passed_pairIds.end()) { n += 1.f; } @@ -1510,7 +1517,7 @@ struct Dilepton { void processNorm(FilteredNormInfos const& collisions) { - for (auto& collision : collisions) { + for (const auto& collision : collisions) { if (collision.centFT0C() < cfgCentMin || cfgCentMax < collision.centFT0C()) { continue; } @@ -1578,6 +1585,25 @@ struct Dilepton { } PROCESS_SWITCH(Dilepton, processNorm, "process normalization info", false); + void processBC(aod::EMBCs const& bcs) + { + for (const auto& bc : bcs) { + if (bc.isTriggerTVX()) { + fRegistry.fill(HIST("BC/hTVXCounter"), 0.f); + if (bc.isNoTimeFrameBorder()) { + fRegistry.fill(HIST("BC/hTVXCounter"), 1.f); + } + if (bc.isNoITSROFrameBorder()) { + fRegistry.fill(HIST("BC/hTVXCounter"), 2.f); + } + if (bc.isNoTimeFrameBorder() && bc.isNoITSROFrameBorder()) { + fRegistry.fill(HIST("BC/hTVXCounter"), 3.f); + } + } + } + } + PROCESS_SWITCH(Dilepton, processBC, "process BC counter", false); + void processDummy(MyCollisions const&) {} PROCESS_SWITCH(Dilepton, processDummy, "Dummy function", false); }; diff --git a/PWGEM/Dilepton/Core/DileptonMC.h b/PWGEM/Dilepton/Core/DileptonMC.h index 731a2493e7f..154180b98fa 100644 --- a/PWGEM/Dilepton/Core/DileptonMC.h +++ b/PWGEM/Dilepton/Core/DileptonMC.h @@ -511,6 +511,13 @@ struct DileptonMC { if (doprocessNorm) { fRegistry.addClone("Event/before/hCollisionCounter", "Event/norm/hCollisionCounter"); } + if (doprocessBC) { + auto hTVXCounter = fRegistry.add("BC/hTVXCounter", "TVX counter", kTH1D, {{4, -0.5f, 3.5f}}); + hTVXCounter->GetXaxis()->SetBinLabel(1, "TVX"); + hTVXCounter->GetXaxis()->SetBinLabel(2, "TVX && NoTFB"); + hTVXCounter->GetXaxis()->SetBinLabel(3, "TVX && NoITSROFB"); + hTVXCounter->GetXaxis()->SetBinLabel(4, "TVX && NoTFB && NoITSROFB"); + } } template @@ -1195,7 +1202,7 @@ struct DileptonMC { template void runTruePairing(TCollisions const& collisions, TMCLeptons const& posTracks, TMCLeptons const& negTracks, TPreslice const& perCollision, TCut const& cut, TAllTracks const& tracks, TMCCollisions const& mccollisions, TMCParticles const& mcparticles) { - for (auto& collision : collisions) { + for (const auto& collision : collisions) { initCCDB(collision); float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { @@ -1214,15 +1221,15 @@ struct DileptonMC { auto negTracks_per_coll = negTracks.sliceByCached(perCollision, collision.globalIndex(), cache); // LOGF(info, "centrality = %f , posTracks_per_coll.size() = %d, negTracks_per_coll.size() = %d", centralities[cfgCentEstimator], posTracks_per_coll.size(), negTracks_per_coll.size()); - for (auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, negTracks_per_coll))) { // ULS + for (const auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, negTracks_per_coll))) { // ULS fillTruePairInfo(collision, mccollisions, pos, neg, cut, tracks, mcparticles); } // end of ULS pair loop - for (auto& [pos1, pos2] : combinations(CombinationsStrictlyUpperIndexPolicy(posTracks_per_coll, posTracks_per_coll))) { // LS++ + for (const auto& [pos1, pos2] : combinations(CombinationsStrictlyUpperIndexPolicy(posTracks_per_coll, posTracks_per_coll))) { // LS++ fillTruePairInfo(collision, mccollisions, pos1, pos2, cut, tracks, mcparticles); } // end of LS++ pair loop - for (auto& [neg1, neg2] : combinations(CombinationsStrictlyUpperIndexPolicy(negTracks_per_coll, negTracks_per_coll))) { // LS-- + for (const auto& [neg1, neg2] : combinations(CombinationsStrictlyUpperIndexPolicy(negTracks_per_coll, negTracks_per_coll))) { // LS-- fillTruePairInfo(collision, mccollisions, neg1, neg2, cut, tracks, mcparticles); } // end of LS-- pair loop @@ -1232,7 +1239,7 @@ struct DileptonMC { template void runGenInfo(TCollisions const& collisions, TMCCollisions const& mccollisions, TMCLeptons const& posTracksMC, TMCLeptons const& negTracksMC, TMCParticles const& mcparticles) { - for (auto& mccollision : mccollisions) { + for (const auto& mccollision : mccollisions) { if (cfgEventGeneratorType >= 0 && mccollision.getSubGeneratorId() != cfgEventGeneratorType) { continue; } @@ -1255,7 +1262,7 @@ struct DileptonMC { auto posTracks_per_coll = posTracksMC.sliceByCachedUnsorted(aod::emmcparticle::emmceventId, mccollision.globalIndex(), cache); auto negTracks_per_coll = negTracksMC.sliceByCachedUnsorted(aod::emmcparticle::emmceventId, mccollision.globalIndex(), cache); - for (auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, negTracks_per_coll))) { // ULS + for (const auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, negTracks_per_coll))) { // ULS // LOGF(info, "pdg1 = %d, pdg2 = %d", t1.pdgCode(), t2.pdgCode()); if (!isInAcceptance(t1) || !isInAcceptance(t2)) { @@ -1520,7 +1527,7 @@ struct DileptonMC { } // end of HF evaluation } // end of true ULS pair loop - for (auto& [t1, t2] : combinations(CombinationsStrictlyUpperIndexPolicy(posTracks_per_coll, posTracks_per_coll))) { + for (const auto& [t1, t2] : combinations(CombinationsStrictlyUpperIndexPolicy(posTracks_per_coll, posTracks_per_coll))) { // LOGF(info, "pdg1 = %d, pdg2 = %d", t1.pdgCode(), t2.pdgCode()); if (!isInAcceptance(t1) || !isInAcceptance(t2)) { @@ -1658,7 +1665,7 @@ struct DileptonMC { } } // end of true LS++ pair loop - for (auto& [t1, t2] : combinations(CombinationsStrictlyUpperIndexPolicy(negTracks_per_coll, negTracks_per_coll))) { + for (const auto& [t1, t2] : combinations(CombinationsStrictlyUpperIndexPolicy(negTracks_per_coll, negTracks_per_coll))) { // LOGF(info, "pdg1 = %d, pdg2 = %d", t1.pdgCode(), t2.pdgCode()); if (!isInAcceptance(t1) || !isInAcceptance(t2)) { @@ -1842,7 +1849,7 @@ struct DileptonMC { std::vector> passed_pairIds; passed_pairIds.reserve(posTracks.size() * negTracks.size()); - for (auto& collision : collisions) { + for (const auto& collision : collisions) { initCCDB(collision); const float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { @@ -1861,7 +1868,7 @@ struct DileptonMC { auto posTracks_per_coll = posTracks.sliceByCached(perCollision, collision.globalIndex(), cache); auto negTracks_per_coll = negTracks.sliceByCached(perCollision, collision.globalIndex(), cache); - for (auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, negTracks_per_coll))) { // ULS + for (const auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, negTracks_per_coll))) { // ULS auto mcpos = mcparticles.iteratorAt(pos.emmcparticleId()); auto mccollision_from_pos = mcpos.template emmcevent_as(); if (cfgEventGeneratorType >= 0 && mccollision_from_pos.getSubGeneratorId() != cfgEventGeneratorType) { @@ -1877,7 +1884,7 @@ struct DileptonMC { passed_pairIds.emplace_back(std::make_pair(pos.globalIndex(), neg.globalIndex())); } } - for (auto& [pos1, pos2] : combinations(CombinationsStrictlyUpperIndexPolicy(posTracks_per_coll, posTracks_per_coll))) { // LS++ + for (const auto& [pos1, pos2] : combinations(CombinationsStrictlyUpperIndexPolicy(posTracks_per_coll, posTracks_per_coll))) { // LS++ auto mcpos1 = mcparticles.iteratorAt(pos1.emmcparticleId()); auto mccollision_from_pos1 = mcpos1.template emmcevent_as(); if (cfgEventGeneratorType >= 0 && mccollision_from_pos1.getSubGeneratorId() != cfgEventGeneratorType) { @@ -1893,7 +1900,7 @@ struct DileptonMC { passed_pairIds.emplace_back(std::make_pair(pos1.globalIndex(), pos2.globalIndex())); } } - for (auto& [neg1, neg2] : combinations(CombinationsStrictlyUpperIndexPolicy(negTracks_per_coll, negTracks_per_coll))) { // LS-- + for (const auto& [neg1, neg2] : combinations(CombinationsStrictlyUpperIndexPolicy(negTracks_per_coll, negTracks_per_coll))) { // LS-- auto mcneg1 = mcparticles.iteratorAt(neg1.emmcparticleId()); auto mccollision_from_neg1 = mcneg1.template emmcevent_as(); if (cfgEventGeneratorType >= 0 && mccollision_from_neg1.getSubGeneratorId() != cfgEventGeneratorType) { @@ -1911,14 +1918,14 @@ struct DileptonMC { } // end of collision loop if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { - for (auto& pairId : passed_pairIds) { + for (const auto& pairId : passed_pairIds) { auto t1 = tracks.rawIteratorAt(std::get<0>(pairId)); auto t2 = tracks.rawIteratorAt(std::get<1>(pairId)); // LOGF(info, "std::get<0>(pairId) = %d, std::get<1>(pairId) = %d, t1.globalIndex() = %d, t2.globalIndex() = %d", std::get<0>(pairId), std::get<1>(pairId), t1.globalIndex(), t2.globalIndex()); float n = 1.f; // include myself. - for (auto& ambId1 : t1.ambiguousElectronsIds()) { - for (auto& ambId2 : t2.ambiguousElectronsIds()) { + for (const auto& ambId1 : t1.ambiguousElectronsIds()) { + for (const auto& ambId2 : t2.ambiguousElectronsIds()) { if (std::find(passed_pairIds.begin(), passed_pairIds.end(), std::make_pair(ambId1, ambId2)) != passed_pairIds.end()) { n += 1.f; } @@ -1927,13 +1934,13 @@ struct DileptonMC { map_weight[pairId] = 1.f / n; } // end of passed_pairIds loop } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { - for (auto& pairId : passed_pairIds) { + for (const auto& pairId : passed_pairIds) { auto t1 = tracks.rawIteratorAt(std::get<0>(pairId)); auto t2 = tracks.rawIteratorAt(std::get<1>(pairId)); float n = 1.f; // include myself. - for (auto& ambId1 : t1.ambiguousMuonsIds()) { - for (auto& ambId2 : t2.ambiguousMuonsIds()) { + for (const auto& ambId1 : t1.ambiguousMuonsIds()) { + for (const auto& ambId2 : t2.ambiguousMuonsIds()) { if (std::find(passed_pairIds.begin(), passed_pairIds.end(), std::make_pair(ambId1, ambId2)) != passed_pairIds.end()) { n += 1.f; } @@ -1983,7 +1990,7 @@ struct DileptonMC { template void fillUnfolding(TCollisions const& collisions, TTracks1 const& posTracks, TTracks2 const& negTracks, TPresilce const& perCollision, TCut const& cut, TAllTracks const& tracks, TMCCollisions const&, TMCParticles const& mcparticles) { - for (auto& collision : collisions) { + for (const auto& collision : collisions) { initCCDB(collision); const float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { @@ -1997,7 +2004,7 @@ struct DileptonMC { auto posTracks_per_coll = posTracks.sliceByCached(perCollision, collision.globalIndex(), cache); // reconstructed pos tracks auto negTracks_per_coll = negTracks.sliceByCached(perCollision, collision.globalIndex(), cache); // reconstructed neg tracks - for (auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, negTracks_per_coll))) { // ULS + for (const auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, negTracks_per_coll))) { // ULS auto mcpos = mcparticles.iteratorAt(pos.emmcparticleId()); auto mccollision_from_pos = mcpos.template emmcevent_as(); if (cfgEventGeneratorType >= 0 && mccollision_from_pos.getSubGeneratorId() != cfgEventGeneratorType) { @@ -2137,7 +2144,7 @@ struct DileptonMC { } } // end of ULS pairing - for (auto& [pos1, pos2] : combinations(CombinationsStrictlyUpperIndexPolicy(posTracks_per_coll, posTracks_per_coll))) { // LS++ + for (const auto& [pos1, pos2] : combinations(CombinationsStrictlyUpperIndexPolicy(posTracks_per_coll, posTracks_per_coll))) { // LS++ auto mcpos1 = mcparticles.iteratorAt(pos1.emmcparticleId()); auto mccollision_from_pos1 = mcpos1.template emmcevent_as(); if (cfgEventGeneratorType >= 0 && mccollision_from_pos1.getSubGeneratorId() != cfgEventGeneratorType) { @@ -2209,7 +2216,7 @@ struct DileptonMC { } } // end of LS++ pairing - for (auto& [neg1, neg2] : combinations(CombinationsStrictlyUpperIndexPolicy(negTracks_per_coll, negTracks_per_coll))) { // LS-- + for (const auto& [neg1, neg2] : combinations(CombinationsStrictlyUpperIndexPolicy(negTracks_per_coll, negTracks_per_coll))) { // LS-- auto mcneg1 = mcparticles.iteratorAt(neg1.emmcparticleId()); auto mccollision_from_neg1 = mcneg1.template emmcevent_as(); if (cfgEventGeneratorType >= 0 && mccollision_from_neg1.getSubGeneratorId() != cfgEventGeneratorType) { @@ -2358,7 +2365,7 @@ struct DileptonMC { void processGen_VM(FilteredMyCollisions const& collisions, MyMCCollisions const&, aod::EMMCGenVectorMesons const& mcparticles) { // for oemga, phi efficiency - for (auto& collision : collisions) { + for (const auto& collision : collisions) { float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { continue; @@ -2373,7 +2380,7 @@ struct DileptonMC { } auto mctracks_per_coll = mcparticles.sliceBy(perMcCollision_vm, mccollision.globalIndex()); - for (auto& mctrack : mctracks_per_coll) { + for (const auto& mctrack : mctracks_per_coll) { if (!(mctrack.isPhysicalPrimary() || mctrack.producedByGenerator())) { continue; @@ -2407,7 +2414,7 @@ struct DileptonMC { void processNorm(aod::EMEventNormInfos const& collisions) { - for (auto& collision : collisions) { + for (const auto& collision : collisions) { fRegistry.fill(HIST("Event/norm/hCollisionCounter"), 1.0); if (collision.selection_bit(o2::aod::evsel::kIsTriggerTVX)) { fRegistry.fill(HIST("Event/norm/hCollisionCounter"), 2.0); @@ -2471,6 +2478,25 @@ struct DileptonMC { } PROCESS_SWITCH(DileptonMC, processNorm, "process normalization info", false); + void processBC(aod::EMBCs const& bcs) + { + for (const auto& bc : bcs) { + if (bc.isTriggerTVX()) { + fRegistry.fill(HIST("BC/hTVXCounter"), 0.f); + if (bc.isNoTimeFrameBorder()) { + fRegistry.fill(HIST("BC/hTVXCounter"), 1.f); + } + if (bc.isNoITSROFrameBorder()) { + fRegistry.fill(HIST("BC/hTVXCounter"), 2.f); + } + if (bc.isNoTimeFrameBorder() && bc.isNoITSROFrameBorder()) { + fRegistry.fill(HIST("BC/hTVXCounter"), 3.f); + } + } + } + } + PROCESS_SWITCH(DileptonMC, processBC, "process BC counter", false); + void processDummy(FilteredMyCollisions const&) {} PROCESS_SWITCH(DileptonMC, processDummy, "Dummy function", false); }; diff --git a/PWGEM/Dilepton/Core/SingleTrackQC.h b/PWGEM/Dilepton/Core/SingleTrackQC.h index 1d7a2c696cb..ffb4c50df96 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQC.h @@ -310,6 +310,13 @@ struct SingleTrackQC { if (doprocessQC_TriggeredData) { fRegistry.add("Event/hNInspectedTVX", "N inspected TVX;run number;N_{TVX}", kTProfile, {{80000, 520000.5, 600000.5}}, true); } + if (doprocessBC) { + auto hTVXCounter = fRegistry.add("BC/hTVXCounter", "TVX counter", kTH1D, {{4, -0.5f, 3.5f}}); + hTVXCounter->GetXaxis()->SetBinLabel(1, "TVX"); + hTVXCounter->GetXaxis()->SetBinLabel(2, "TVX && NoTFB"); + hTVXCounter->GetXaxis()->SetBinLabel(3, "TVX && NoITSROFB"); + hTVXCounter->GetXaxis()->SetBinLabel(4, "TVX && NoTFB && NoITSROFB"); + } } template @@ -576,7 +583,7 @@ struct SingleTrackQC { template void runQC(TCollisions const& collisions, TTracks const& tracks, TPreslice const& perCollision, TCut const& cut) { - for (auto& collision : collisions) { + for (const auto& collision : collisions) { initCCDB(collision); float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { @@ -599,7 +606,7 @@ struct SingleTrackQC { auto tracks_per_coll = tracks.sliceBy(perCollision, collision.globalIndex()); if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { - for (auto& track : tracks_per_coll) { + for (const auto& track : tracks_per_coll) { if (dielectroncuts.cfg_pid_scheme == static_cast(DielectronCut::PIDSchemes::kPIDML)) { if (!cut.template IsSelectedTrack(track, collision)) { continue; @@ -612,7 +619,7 @@ struct SingleTrackQC { fillElectronInfo(track); } // end of track loop } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { - for (auto& track : tracks_per_coll) { + for (const auto& track : tracks_per_coll) { if (!cut.template IsSelectedTrack(track)) { continue; } @@ -632,7 +639,7 @@ struct SingleTrackQC { { std::vector passed_trackIds; passed_trackIds.reserve(tracks.size()); - for (auto& collision : collisions) { + for (const auto& collision : collisions) { initCCDB(collision); float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { @@ -651,7 +658,7 @@ struct SingleTrackQC { auto tracks_per_coll = tracks.sliceBy(perCollision, collision.globalIndex()); if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { - for (auto& track : tracks_per_coll) { + for (const auto& track : tracks_per_coll) { if (dielectroncuts.cfg_pid_scheme == static_cast(DielectronCut::PIDSchemes::kPIDML)) { if (!cut.template IsSelectedTrack(track, collision)) { continue; @@ -664,7 +671,7 @@ struct SingleTrackQC { passed_trackIds.emplace_back(track.globalIndex()); } // end of track loop } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { - for (auto& track : tracks_per_coll) { + for (const auto& track : tracks_per_coll) { if (!cut.template IsSelectedTrack(track)) { continue; } @@ -677,11 +684,11 @@ struct SingleTrackQC { } // end of collision loop if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { - for (auto& trackId : passed_trackIds) { + for (const auto& trackId : passed_trackIds) { auto track = tracks.rawIteratorAt(trackId); auto ambIds = track.ambiguousElectronsIds(); float n = 1.f; // include myself. - for (auto& ambId : ambIds) { + for (const auto& ambId : ambIds) { if (std::find(passed_trackIds.begin(), passed_trackIds.end(), ambId) != passed_trackIds.end()) { n += 1.f; } @@ -689,11 +696,11 @@ struct SingleTrackQC { map_weight[trackId] = 1.f / n; } } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { - for (auto& trackId : passed_trackIds) { + for (const auto& trackId : passed_trackIds) { auto track = tracks.rawIteratorAt(trackId); auto ambIds = track.ambiguousMuonsIds(); float n = 1.f; // include myself. - for (auto& ambId : ambIds) { + for (const auto& ambId : ambIds) { if (std::find(passed_trackIds.begin(), passed_trackIds.end(), ambId) != passed_trackIds.end()) { n += 1.f; } @@ -765,7 +772,7 @@ struct SingleTrackQC { void processNorm(aod::EMEventNormInfos const& collisions) { - for (auto& collision : collisions) { + for (const auto& collision : collisions) { fRegistry.fill(HIST("Event/norm/hCollisionCounter"), 1.0); if (collision.selection_bit(o2::aod::evsel::kIsTriggerTVX)) { fRegistry.fill(HIST("Event/norm/hCollisionCounter"), 2.0); @@ -829,6 +836,25 @@ struct SingleTrackQC { } PROCESS_SWITCH(SingleTrackQC, processNorm, "process normalization info", false); + void processBC(aod::EMBCs const& bcs) + { + for (const auto& bc : bcs) { + if (bc.isTriggerTVX()) { + fRegistry.fill(HIST("BC/hTVXCounter"), 0.f); + if (bc.isNoTimeFrameBorder()) { + fRegistry.fill(HIST("BC/hTVXCounter"), 1.f); + } + if (bc.isNoITSROFrameBorder()) { + fRegistry.fill(HIST("BC/hTVXCounter"), 2.f); + } + if (bc.isNoTimeFrameBorder() && bc.isNoITSROFrameBorder()) { + fRegistry.fill(HIST("BC/hTVXCounter"), 3.f); + } + } + } + } + PROCESS_SWITCH(SingleTrackQC, processBC, "process BC counter", false); + void processDummy(MyCollisions const&) {} PROCESS_SWITCH(SingleTrackQC, processDummy, "Dummy function", false); }; diff --git a/PWGEM/Dilepton/Core/SingleTrackQCMC.h b/PWGEM/Dilepton/Core/SingleTrackQCMC.h index c3aeedeb791..f0cd021d0c6 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQCMC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQCMC.h @@ -385,6 +385,13 @@ struct SingleTrackQCMC { if (doprocessNorm) { fRegistry.addClone("Event/before/hCollisionCounter", "Event/norm/hCollisionCounter"); } + if (doprocessBC) { + auto hTVXCounter = fRegistry.add("BC/hTVXCounter", "TVX counter", kTH1D, {{4, -0.5f, 3.5f}}); + hTVXCounter->GetXaxis()->SetBinLabel(1, "TVX"); + hTVXCounter->GetXaxis()->SetBinLabel(2, "TVX && NoTFB"); + hTVXCounter->GetXaxis()->SetBinLabel(3, "TVX && NoITSROFB"); + hTVXCounter->GetXaxis()->SetBinLabel(4, "TVX && NoTFB && NoITSROFB"); + } } void DefineEMEventCut() @@ -703,7 +710,7 @@ struct SingleTrackQCMC { template void runQCMC(TCollisions const& collisions, TTracks const& tracks, TPreslice const& perCollision, TCut const& cut, TMCCollisions const&, TMCParticles const& mcparticles) { - for (auto& collision : collisions) { + for (const auto& collision : collisions) { float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { continue; @@ -719,7 +726,7 @@ struct SingleTrackQCMC { auto tracks_per_coll = tracks.sliceBy(perCollision, collision.globalIndex()); - for (auto& track : tracks_per_coll) { + for (const auto& track : tracks_per_coll) { auto mctrack = track.template emmcparticle_as(); if (std::abs(mctrack.pdgCode()) != pdg_lepton) { continue; @@ -802,7 +809,7 @@ struct SingleTrackQCMC { template void runGenInfo(TCollisions const& collisions, TMCLeptons const& leptonsMC, TMCCollisions const& mccollisions, TMCParticles const& mcparticles) { - for (auto& mccollision : mccollisions) { + for (const auto& mccollision : mccollisions) { if (cfgEventGeneratorType >= 0 && mccollision.getSubGeneratorId() != cfgEventGeneratorType) { continue; } @@ -824,7 +831,7 @@ struct SingleTrackQCMC { fRegistry.fill(HIST("MCEvent/after/hZvtx"), mccollision.posZ()); auto leptonsMC_per_coll = leptonsMC.sliceByCachedUnsorted(o2::aod::emmcparticle::emmceventId, mccollision.globalIndex(), cache); - for (auto& lepton : leptonsMC_per_coll) { + for (const auto& lepton : leptonsMC_per_coll) { if (!(lepton.isPhysicalPrimary() || lepton.producedByGenerator())) { continue; } @@ -901,7 +908,7 @@ struct SingleTrackQCMC { { std::vector passed_trackIds; passed_trackIds.reserve(tracks.size()); - for (auto& collision : collisions) { + for (const auto& collision : collisions) { float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { continue; @@ -919,7 +926,7 @@ struct SingleTrackQCMC { auto tracks_per_coll = tracks.sliceBy(perCollision, collision.globalIndex()); if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { - for (auto& track : tracks_per_coll) { + for (const auto& track : tracks_per_coll) { auto mctrack = track.template emmcparticle_as(); auto mccollision_from_track = mctrack.template emmcevent_as(); if (cfgEventGeneratorType >= 0 && mccollision_from_track.getSubGeneratorId() != cfgEventGeneratorType) { @@ -938,7 +945,7 @@ struct SingleTrackQCMC { passed_trackIds.emplace_back(track.globalIndex()); } // end of track loop } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { - for (auto& track : tracks_per_coll) { + for (const auto& track : tracks_per_coll) { auto mctrack = track.template emmcparticle_as(); auto mccollision_from_track = mctrack.template emmcevent_as(); if (cfgEventGeneratorType >= 0 && mccollision_from_track.getSubGeneratorId() != cfgEventGeneratorType) { @@ -957,11 +964,11 @@ struct SingleTrackQCMC { } // end of collision loop if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { - for (auto& trackId : passed_trackIds) { + for (const auto& trackId : passed_trackIds) { auto track = tracks.rawIteratorAt(trackId); auto ambIds = track.ambiguousElectronsIds(); float n = 1.f; // include myself. - for (auto& ambId : ambIds) { + for (const auto& ambId : ambIds) { if (std::find(passed_trackIds.begin(), passed_trackIds.end(), ambId) != passed_trackIds.end()) { n += 1.f; } @@ -969,11 +976,11 @@ struct SingleTrackQCMC { map_weight[trackId] = 1.f / n; } } else if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDimuon) { - for (auto& trackId : passed_trackIds) { + for (const auto& trackId : passed_trackIds) { auto track = tracks.rawIteratorAt(trackId); auto ambIds = track.ambiguousMuonsIds(); float n = 1.f; // include myself. - for (auto& ambId : ambIds) { + for (const auto& ambId : ambIds) { if (std::find(passed_trackIds.begin(), passed_trackIds.end(), ambId) != passed_trackIds.end()) { n += 1.f; } @@ -1051,7 +1058,7 @@ struct SingleTrackQCMC { void processNorm(aod::EMEventNormInfos const& collisions) { - for (auto& collision : collisions) { + for (const auto& collision : collisions) { fRegistry.fill(HIST("Event/norm/hCollisionCounter"), 1.0); if (collision.selection_bit(o2::aod::evsel::kIsTriggerTVX)) { fRegistry.fill(HIST("Event/norm/hCollisionCounter"), 2.0); @@ -1115,6 +1122,25 @@ struct SingleTrackQCMC { } PROCESS_SWITCH(SingleTrackQCMC, processNorm, "process normalization info", false); + void processBC(aod::EMBCs const& bcs) + { + for (const auto& bc : bcs) { + if (bc.isTriggerTVX()) { + fRegistry.fill(HIST("BC/hTVXCounter"), 0.f); + if (bc.isNoTimeFrameBorder()) { + fRegistry.fill(HIST("BC/hTVXCounter"), 1.f); + } + if (bc.isNoITSROFrameBorder()) { + fRegistry.fill(HIST("BC/hTVXCounter"), 2.f); + } + if (bc.isNoTimeFrameBorder() && bc.isNoITSROFrameBorder()) { + fRegistry.fill(HIST("BC/hTVXCounter"), 3.f); + } + } + } + } + PROCESS_SWITCH(SingleTrackQCMC, processBC, "process BC counter", false); + void processDummy(FilteredMyCollisions const&) {} PROCESS_SWITCH(SingleTrackQCMC, processDummy, "Dummy function", false); }; diff --git a/PWGEM/Dilepton/DataModel/dileptonTables.h b/PWGEM/Dilepton/DataModel/dileptonTables.h index 7ae349d91cc..4d67089b98d 100644 --- a/PWGEM/Dilepton/DataModel/dileptonTables.h +++ b/PWGEM/Dilepton/DataModel/dileptonTables.h @@ -55,6 +55,20 @@ const std::unordered_map aliasLabels = { }; } // namespace pwgem::dilepton::swt +namespace embc +{ +DECLARE_SOA_COLUMN(IsTriggerTVX, isTriggerTVX, bool); //! kIsTriggerTVX +DECLARE_SOA_COLUMN(IsNoTimeFrameBorder, isNoTimeFrameBorder, bool); //! kIsNoTimeFrameBorder +DECLARE_SOA_COLUMN(IsNoITSROFrameBorder, isNoITSROFrameBorder, bool); //! kNoITSROFrameBorder +DECLARE_SOA_COLUMN(IsCollisionFound, isCollisionFound, bool); //! at least 1 collision is found in this BC. +} // namespace embc +DECLARE_SOA_TABLE(EMBCs, "AOD", "EMBC", //! bc information for normalization + o2::soa::Index<>, embc::IsTriggerTVX, embc::IsNoTimeFrameBorder, embc::IsNoITSROFrameBorder, embc::IsCollisionFound); + +// DECLARE_SOA_TABLE(EMBCs, "AOD", "EMBC", //! bc information for normalization +// o2::soa::Index<>, evsel::Alias, evsel::Selection, embc::IsCollisionFound); +using EMBC = EMBCs::iterator; + namespace emevent { DECLARE_SOA_COLUMN(CollisionId, collisionId, int); diff --git a/PWGEM/Dilepton/TableProducer/associateMCinfoDilepton.cxx b/PWGEM/Dilepton/TableProducer/associateMCinfoDilepton.cxx index 6cf6b0865d0..fcccd1cf9c0 100644 --- a/PWGEM/Dilepton/TableProducer/associateMCinfoDilepton.cxx +++ b/PWGEM/Dilepton/TableProducer/associateMCinfoDilepton.cxx @@ -14,6 +14,10 @@ // This code produces reduced events for photon analyses. // Please write to: daiki.sekihata@cern.ch +#include +#include +#include + #include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -48,12 +52,12 @@ struct AssociateMCInfoDilepton { Produces emprimaryelectronmclabels; Produces emprimarymuonmclabels; - Configurable down_scaling_omega{"down_scaling_omega", 1.0, "down scaling factor to store omega"}; - Configurable down_scaling_phi{"down_scaling_phi", 1.0, "down scaling factor to store phi"}; - Configurable min_eta_gen_primary{"min_eta_gen_primary", -1.2, "min rapidity Y to store generated information"}; // smearing might be applied at analysis stage. set wider value. - Configurable max_eta_gen_primary{"max_eta_gen_primary", +1.2, "max rapidity Y to store generated information"}; // smearing might be applied at analysis stage. set wider value. - Configurable min_eta_gen_primary_fwd{"min_eta_gen_primary_fwd", -4.5, "min eta to store generated information"}; // smearing might be applied at analysis stage. set wider value. - Configurable max_eta_gen_primary_fwd{"max_eta_gen_primary_fwd", -2.0, "max eta to store generated information"}; // smearing might be applied at analysis stage. set wider value. + Configurable down_scaling_omega{"down_scaling_omega", 1.1, "down scaling factor to store omega"}; + Configurable down_scaling_phi{"down_scaling_phi", 1.1, "down scaling factor to store phi"}; + Configurable min_eta_gen_primary{"min_eta_gen_primary", -1.5, "min rapidity Y to store generated information"}; // smearing is applied at analysis stage. set wider value. + Configurable max_eta_gen_primary{"max_eta_gen_primary", +1.5, "max rapidity Y to store generated information"}; // smearing is applied at analysis stage. set wider value. + Configurable min_eta_gen_primary_fwd{"min_eta_gen_primary_fwd", -5.0, "min eta to store generated information"}; // smearing is applied at analysis stage. set wider value. + Configurable max_eta_gen_primary_fwd{"max_eta_gen_primary_fwd", -1.5, "max eta to store generated information"}; // smearing is applied at analysis stage. set wider value. HistogramRegistry registry{"EMMCEvent"}; std::mt19937 engine; @@ -141,7 +145,7 @@ struct AssociateMCInfoDilepton { int fCounters[2] = {0, 0}; //! [0] - particle counter, [1] - event counter // first, run loop over mc collisions to create map between aod::McCollisions and aod::EMMCEvents - for (auto& mcCollision : mcCollisions) { + for (const auto& mcCollision : mcCollisions) { // make an entry for this MC event only if it was not already added to the table if (!(fEventLabels.find(mcCollision.globalIndex()) != fEventLabels.end())) { mcevents(mcCollision.globalIndex(), mcCollision.generatorsID(), mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), mcCollision.impactParameter(), mcCollision.eventPlaneAngle()); @@ -150,7 +154,7 @@ struct AssociateMCInfoDilepton { } } // end of mc collision loop - for (auto& collision : collisions) { + for (const auto& collision : collisions) { registry.fill(HIST("hEventCounter"), 1); // TODO: investigate the collisions without corresponding mcCollision @@ -168,13 +172,13 @@ struct AssociateMCInfoDilepton { } // end of reconstructed collision loop - for (auto& mcCollision : mcCollisions) { + for (const auto& mcCollision : mcCollisions) { // store MC true information auto mcelectrons_per_mccollision = mcelectrons.sliceBy(perMcCollision, mcCollision.globalIndex()); auto mcmuons_per_mccollision = mcmuons.sliceBy(perMcCollision, mcCollision.globalIndex()); auto mcvectormesons_per_mccollision = mcvectormesons.sliceBy(perMcCollision, mcCollision.globalIndex()); - for (auto& mctrack : mcelectrons_per_mccollision) { // store necessary information for denominator of efficiency + for (const auto& mctrack : mcelectrons_per_mccollision) { // store necessary information for denominator of efficiency if (!mctrack.isPhysicalPrimary() && !mctrack.producedByGenerator()) { continue; } @@ -226,7 +230,7 @@ struct AssociateMCInfoDilepton { } // end of ndau protection } // end of mc electron loop - for (auto& mctrack : mcmuons_per_mccollision) { // store necessary information for denominator of efficiency + for (const auto& mctrack : mcmuons_per_mccollision) { // store necessary information for denominator of efficiency if (!mctrack.isPhysicalPrimary() && !mctrack.producedByGenerator()) { continue; } @@ -278,7 +282,7 @@ struct AssociateMCInfoDilepton { } // end of ndau protection } // end of mc muon loop - for (auto& mctrack : mcvectormesons_per_mccollision) { // store necessary information for denominator of efficiency + for (const auto& mctrack : mcvectormesons_per_mccollision) { // store necessary information for denominator of efficiency // Be careful!! dilepton rapidity is different from meson rapidity! No acceptance cut here. if (!mctrack.isPhysicalPrimary() && !mctrack.producedByGenerator()) { @@ -309,7 +313,7 @@ struct AssociateMCInfoDilepton { // TODO: remove this check as soon as issues with MC production are fixed if (d < mcTracks.size()) { // protect against bad daughter indices auto daughter = mcTracks.iteratorAt(d); - if (abs(daughter.pdgCode()) == 11 || abs(daughter.pdgCode()) == 13) { + if (std::abs(daughter.pdgCode()) == 11 || std::abs(daughter.pdgCode()) == 13) { is_lepton_involved = true; break; } @@ -346,7 +350,7 @@ struct AssociateMCInfoDilepton { } // end of mc collision loop if constexpr (static_cast(system & kPCM)) { - for (auto& v0 : v0photons) { + for (const auto& v0 : v0photons) { auto collision_from_v0 = collisions.iteratorAt(v0.collisionId()); if (!collision_from_v0.has_mcCollision()) { continue; @@ -362,7 +366,7 @@ struct AssociateMCInfoDilepton { continue; // If no MC particle is found, skip the v0 } - for (auto& leg : {pos, ele}) { // be carefull of order {pos, ele}! + for (const auto& leg : {pos, ele}) { // be carefull of order {pos, ele}! auto o2track = o2tracks.iteratorAt(leg.trackId()); auto mctrack = o2track.template mcParticle_as(); // LOGF(info, "mctrack.globalIndex() = %d, mctrack.index() = %d", mctrack.globalIndex(), mctrack.index()); // these are exactly the same. @@ -410,7 +414,7 @@ struct AssociateMCInfoDilepton { if constexpr (static_cast(system & kElectron)) { // auto emprimaryelectrons_coll = emprimaryelectrons.sliceBy(perCollision_el, collision.globalIndex()); - for (auto& emprimaryelectron : emprimaryelectrons) { + for (const auto& emprimaryelectron : emprimaryelectrons) { auto collision_from_el = collisions.iteratorAt(emprimaryelectron.collisionId()); if (!collision_from_el.has_mcCollision()) { continue; @@ -465,7 +469,7 @@ struct AssociateMCInfoDilepton { if constexpr (static_cast(system & kFwdMuon)) { // auto emprimarymuons_coll = emprimarymuons.sliceBy(perCollision_mu, collision.globalIndex()); - for (auto& emprimarymuon : emprimarymuons) { + for (const auto& emprimarymuon : emprimarymuons) { auto collision_from_mu = collisions.iteratorAt(emprimarymuon.collisionId()); if (!collision_from_mu.has_mcCollision()) { continue; @@ -525,7 +529,7 @@ struct AssociateMCInfoDilepton { std::vector mothers; if (mctrack.has_mothers()) { - for (auto& m : mctrack.mothersIds()) { + for (const auto& m : mctrack.mothersIds()) { if (m < mcTracks.size()) { // protect against bad mother indices if (fNewLabels.find(m) != fNewLabels.end()) { mothers.push_back(fNewLabels.find(m)->second); @@ -575,9 +579,9 @@ struct AssociateMCInfoDilepton { } // end loop over labels // only for omega, phi mesons - for (auto& mcCollision : mcCollisions) { + for (const auto& mcCollision : mcCollisions) { auto mcvectormesons_per_mccollision = mcvectormesons.sliceBy(perMcCollision, mcCollision.globalIndex()); - for (auto& mctrack : mcvectormesons_per_mccollision) { // store necessary information for denominator of efficiency + for (const auto& mctrack : mcvectormesons_per_mccollision) { // store necessary information for denominator of efficiency if (!mctrack.isPhysicalPrimary() && !mctrack.producedByGenerator()) { continue; } diff --git a/PWGEM/Dilepton/TableProducer/createEMEventDilepton.cxx b/PWGEM/Dilepton/TableProducer/createEMEventDilepton.cxx index 5d57b999491..dbe9739cdff 100644 --- a/PWGEM/Dilepton/TableProducer/createEMEventDilepton.cxx +++ b/PWGEM/Dilepton/TableProducer/createEMEventDilepton.cxx @@ -52,6 +52,7 @@ using MyCollisionsMC_Cent = soa::Join; struct CreateEMEventDilepton { + Produces embc; Produces event; // Produces eventcov; Produces event_mult; @@ -133,14 +134,22 @@ struct CreateEMEventDilepton { mRunNumber = bc.runNumber(); } - Preslice perCollision_pcm = aod::v0photonkf::collisionId; - PresliceUnsorted perCollision_el = aod::emprimaryelectron::collisionId; - PresliceUnsorted perCollision_mu = aod::emprimarymuon::collisionId; + Preslice perBC = aod::collision::bcId; + // Preslice perCollision_pcm = aod::v0photonkf::collisionId; + // PresliceUnsorted perCollision_el = aod::emprimaryelectron::collisionId; + // PresliceUnsorted perCollision_mu = aod::emprimarymuon::collisionId; template - void skimEvent(TCollisions const& collisions, TBCs const&) + void skimEvent(TCollisions const& collisions, TBCs const& bcs) { - for (auto& collision : collisions) { + for (const auto& bc : bcs) { + if (bc.selection_bit(o2::aod::evsel::kIsTriggerTVX)) { + const auto& collisions_perBC = collisions.sliceBy(perBC, bc.globalIndex()); + embc(bc.selection_bit(o2::aod::evsel::kIsTriggerTVX), bc.selection_bit(o2::aod::evsel::kNoTimeFrameBorder), bc.selection_bit(o2::aod::evsel::kNoITSROFrameBorder), static_cast(collisions_perBC.size() > 0)); // TVX is fired. + } + } // end of bc loop + + for (const auto& collision : collisions) { if constexpr (isMC) { if (!collision.has_mcCollision()) { continue; @@ -294,7 +303,7 @@ struct AssociateDileptonToEMEvent { template void fillEventId(TCollisions const& collisions, TLeptons const& leptons, TEventIds& eventIds, TPreslice const& perCollision) { - for (auto& collision : collisions) { + for (const auto& collision : collisions) { auto leptons_coll = leptons.sliceBy(perCollision, collision.collisionId()); int nl = leptons_coll.size(); // LOGF(info, "collision.collisionId() = %d , nl = %d", collision.collisionId(), nl); diff --git a/PWGEM/Dilepton/TableProducer/skimmerPrimaryElectron.cxx b/PWGEM/Dilepton/TableProducer/skimmerPrimaryElectron.cxx index 28f523db1cb..26b1106448c 100644 --- a/PWGEM/Dilepton/TableProducer/skimmerPrimaryElectron.cxx +++ b/PWGEM/Dilepton/TableProducer/skimmerPrimaryElectron.cxx @@ -79,8 +79,8 @@ struct skimmerPrimaryElectron { Configurable maxchi2its{"maxchi2its", 6.0, "max. chi2/NclsITS"}; Configurable minpt{"minpt", 0.15, "min pt for track"}; Configurable maxeta{"maxeta", 0.9, "eta acceptance"}; - Configurable dca_xy_max{"dca_xy_max", 1.0f, "max DCAxy in cm"}; - Configurable dca_z_max{"dca_z_max", 1.0f, "max DCAz in cm"}; + Configurable dca_xy_max{"dca_xy_max", 0.3f, "max DCAxy in cm"}; + Configurable dca_z_max{"dca_z_max", 0.3f, "max DCAz in cm"}; Configurable dca_3d_sigma_max{"dca_3d_sigma_max", 1e+10, "max DCA 3D in sigma"}; Configurable minTPCNsigmaEl{"minTPCNsigmaEl", -2.5, "min. TPC n sigma for electron inclusion"}; Configurable maxTPCNsigmaEl{"maxTPCNsigmaEl", 3.5, "max. TPC n sigma for electron inclusion"}; @@ -398,9 +398,9 @@ struct skimmerPrimaryElectron { fRegistry.fill(HIST("Track/hQoverPt"), track.sign() / pt_recalc); fRegistry.fill(HIST("Track/hEtaPhi"), phi_recalc, eta_recalc); fRegistry.fill(HIST("Track/hDCAxyz"), dcaXY, dcaZ); - fRegistry.fill(HIST("Track/hDCAxyzSigma"), dcaXY / sqrt(track_par_cov_recalc.getSigmaY2()), dcaZ / sqrt(track_par_cov_recalc.getSigmaZ2())); - fRegistry.fill(HIST("Track/hDCAxyRes_Pt"), pt_recalc, sqrt(track_par_cov_recalc.getSigmaY2()) * 1e+4); // convert cm to um - fRegistry.fill(HIST("Track/hDCAzRes_Pt"), pt_recalc, sqrt(track_par_cov_recalc.getSigmaZ2()) * 1e+4); // convert cm to um + fRegistry.fill(HIST("Track/hDCAxyzSigma"), dcaXY / std::sqrt(track_par_cov_recalc.getSigmaY2()), dcaZ / std::sqrt(track_par_cov_recalc.getSigmaZ2())); + fRegistry.fill(HIST("Track/hDCAxyRes_Pt"), pt_recalc, std::sqrt(track_par_cov_recalc.getSigmaY2()) * 1e+4); // convert cm to um + fRegistry.fill(HIST("Track/hDCAzRes_Pt"), pt_recalc, std::sqrt(track_par_cov_recalc.getSigmaZ2()) * 1e+4); // convert cm to um fRegistry.fill(HIST("Track/hNclsITS"), track.itsNCls()); fRegistry.fill(HIST("Track/hNclsTPC"), track.tpcNClsFound()); fRegistry.fill(HIST("Track/hNcrTPC"), track.tpcNClsCrossedRows()); @@ -449,7 +449,7 @@ struct skimmerPrimaryElectron { auto tracksWithITSPid = soa::Attach(tracks); stored_trackIds.reserve(tracks.size()); - for (auto& collision : collisions) { + for (const auto& collision : collisions) { auto bc = collision.template foundBC_as(); initCCDB(bc); @@ -458,7 +458,7 @@ struct skimmerPrimaryElectron { } auto tracks_per_coll = tracksWithITSPid.sliceBy(perCol, collision.globalIndex()); - for (auto& track : tracks_per_coll) { + for (const auto& track : tracks_per_coll) { if (!checkTrack(collision, track) || !isElectron(track)) { continue; } @@ -477,7 +477,7 @@ struct skimmerPrimaryElectron { auto tracksWithITSPid = soa::Attach(tracks); stored_trackIds.reserve(tracks.size() * 2); - for (auto& collision : collisions) { + for (const auto& collision : collisions) { auto bc = collision.template foundBC_as(); initCCDB(bc); @@ -487,7 +487,7 @@ struct skimmerPrimaryElectron { auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, collision.globalIndex()); - for (auto& trackId : trackIdsThisCollision) { + for (const auto& trackId : trackIdsThisCollision) { // auto track = trackId.template track_as(); auto track = tracksWithITSPid.rawIteratorAt(trackId.trackId()); if (!checkTrack(collision, track) || !isElectron(track)) { @@ -507,7 +507,7 @@ struct skimmerPrimaryElectron { auto tracksWithITSPid = soa::Attach(tracks); stored_trackIds.reserve(tracks.size()); - for (auto& collision : collisions) { + for (const auto& collision : collisions) { auto bc = collision.template foundBC_as(); initCCDB(bc); @@ -520,7 +520,7 @@ struct skimmerPrimaryElectron { } auto tracks_per_coll = tracksWithITSPid.sliceBy(perCol, collision.globalIndex()); - for (auto& track : tracks_per_coll) { + for (const auto& track : tracks_per_coll) { if (!checkTrack(collision, track) || !isElectron(track)) { continue; } @@ -539,7 +539,7 @@ struct skimmerPrimaryElectron { auto tracksWithITSPid = soa::Attach(tracks); stored_trackIds.reserve(tracks.size() * 2); - for (auto& collision : collisions) { + for (const auto& collision : collisions) { auto bc = collision.template foundBC_as(); initCCDB(bc); @@ -552,7 +552,7 @@ struct skimmerPrimaryElectron { auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, collision.globalIndex()); - for (auto& trackId : trackIdsThisCollision) { + for (const auto& trackId : trackIdsThisCollision) { // auto track = trackId.template track_as(); auto track = tracksWithITSPid.rawIteratorAt(trackId.trackId()); if (!checkTrack(collision, track) || !isElectron(track)) { @@ -577,7 +577,7 @@ struct skimmerPrimaryElectron { auto tracksWithITSPid = soa::Attach(tracks); stored_trackIds.reserve(tracks.size()); - for (auto& collision : collisions) { + for (const auto& collision : collisions) { if (!collision.has_mcCollision()) { continue; } @@ -589,7 +589,7 @@ struct skimmerPrimaryElectron { } auto tracks_per_coll = tracksWithITSPid.sliceBy(perCol, collision.globalIndex()); - for (auto& track : tracks_per_coll) { + for (const auto& track : tracks_per_coll) { if (!checkTrack(collision, track) || !isElectron(track)) { continue; } @@ -607,7 +607,7 @@ struct skimmerPrimaryElectron { auto tracksWithITSPid = soa::Attach(tracks); stored_trackIds.reserve(tracks.size() * 2); - for (auto& collision : collisions) { + for (const auto& collision : collisions) { if (!collision.has_mcCollision()) { continue; } @@ -620,7 +620,7 @@ struct skimmerPrimaryElectron { auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, collision.globalIndex()); - for (auto& trackId : trackIdsThisCollision) { + for (const auto& trackId : trackIdsThisCollision) { // auto track = trackId.template track_as(); auto track = tracksWithITSPid.rawIteratorAt(trackId.trackId()); if (!checkTrack(collision, track) || !isElectron(track)) { @@ -657,7 +657,7 @@ struct prefilterPrimaryElectron { Configurable max_dcaxy{"max_dcaxy", 0.3, "DCAxy To PV for loose track sample"}; Configurable max_dcaz{"max_dcaz", 0.3, "DCAz To PV for loose track sample"}; Configurable minpt{"minpt", 0.1, "min pt for track for loose track sample"}; - Configurable maxeta{"maxeta", 0.9, "eta acceptance for loose track sample"}; + Configurable maxeta{"maxeta", 1.2, "eta acceptance for loose track sample"}; Configurable min_ncluster_tpc{"min_ncluster_tpc", 0, "min ncluster tpc"}; Configurable mincrossedrows{"mincrossedrows", 70, "min crossed rows"}; Configurable max_frac_shared_clusters_tpc{"max_frac_shared_clusters_tpc", 999.f, "max fraction of shared clusters in TPC"}; @@ -666,12 +666,12 @@ struct prefilterPrimaryElectron { Configurable maxchi2its{"maxchi2its", 6.0, "max chi2/NclsITS"}; Configurable min_ncluster_its{"min_ncluster_its", 4, "min ncluster its"}; Configurable min_ncluster_itsib{"min_ncluster_itsib", 1, "min ncluster itsib"}; - Configurable minTPCNsigmaEl{"minTPCNsigmaEl", -3.0, "min. TPC n sigma for electron inclusion"}; + Configurable minTPCNsigmaEl{"minTPCNsigmaEl", -2.0, "min. TPC n sigma for electron inclusion"}; Configurable maxTPCNsigmaEl{"maxTPCNsigmaEl", 3.0, "max. TPC n sigma for electron inclusion"}; Configurable slope{"slope", 0.0185, "slope for m vs. phiv"}; Configurable intercept{"intercept", -0.0280, "intercept for m vs. phiv"}; - Configurable> max_mee_vec{"max_mee_vec", std::vector{0.08, 0.10, 0.12}, "vector fo max mee for prefilter in ULS. Please sort this by increasing order."}; // currently, 3 thoresholds are allowed. + Configurable> max_mee_vec{"max_mee_vec", std::vector{0.06, 0.08, 0.10}, "vector fo max mee for prefilter in ULS. Please sort this by increasing order."}; // currently, 3 thoresholds are allowed. HistogramRegistry fRegistry{"output", {}, OutputObjHandlingPolicy::AnalysisObject, false, false}; @@ -702,10 +702,10 @@ struct prefilterPrimaryElectron { void addHistograms() { fRegistry.add("Track/hPt", "pT;p_{T} (GeV/c)", kTH1F, {{1000, 0.0f, 10}}, false); - fRegistry.add("Track/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {40, -1.0f, 1.0f}}, false); + fRegistry.add("Track/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{90, 0, 2 * M_PI}, {80, -2.0f, 2.0f}}, false); fRegistry.add("Track/hTPCNsigmaEl", "loose track TPC PID", kTH2F, {{1000, 0.f, 10}, {100, -5, +5}}); - fRegistry.add("Pair/before/uls/hMvsPt", "mass vs. pT;m_{ee} (GeV/c^{2});p_{T,ee} (GeV/c)", kTH2F, {{400, 0, 4}, {100, 0, 10}}); - fRegistry.add("Pair/before/uls/hMvsPhiV", "mass vs. phiv;#varphi_{V} (rad.);m_{ee} (GeV/c^{2})", kTH2F, {{90, 0.f, M_PI}, {100, 0, 1.f}}); + fRegistry.add("Pair/before/uls/hMvsPt", "mass vs. pT;m_{ee} (GeV/c^{2});p_{T,ee} (GeV/c)", kTH2F, {{500, 0, 0.5}, {100, 0, 1}}); + fRegistry.add("Pair/before/uls/hMvsPhiV", "mass vs. phiv;#varphi_{V} (rad.);m_{ee} (GeV/c^{2})", kTH2F, {{90, 0.f, M_PI}, {100, 0, 0.1}}); fRegistry.addClone("Pair/before/uls/", "Pair/before/lspp/"); fRegistry.addClone("Pair/before/uls/", "Pair/before/lsmm/"); fRegistry.addClone("Pair/before/", "Pair/after/"); @@ -880,7 +880,7 @@ struct prefilterPrimaryElectron { { std::unordered_map pfb_map; // map track.globalIndex -> prefilter bit - for (auto& collision : collisions) { + for (const auto& collision : collisions) { auto bc = collision.template foundBC_as(); initCCDB(bc); if (!collision.isSelected()) { @@ -896,7 +896,7 @@ struct prefilterPrimaryElectron { posTracks_per_coll.reserve(trackIdsThisCollision.size()); negTracks_per_coll.reserve(trackIdsThisCollision.size()); - for (auto& trackId : trackIdsThisCollision) { + for (const auto& trackId : trackIdsThisCollision) { auto track = trackId.template track_as(); if (!checkTrack(collision, track)) { continue; @@ -910,7 +910,7 @@ struct prefilterPrimaryElectron { } } - for (auto& ele : negTracks_per_coll) { + for (const auto& ele : negTracks_per_coll) { if (!checkTrack(collision, ele)) { continue; } @@ -924,7 +924,7 @@ struct prefilterPrimaryElectron { o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc, 2.f, matCorr, &mDcaInfoCov); getPxPyPz(track_par_cov_recalc, pVec_recalc); - for (auto& empos : positrons_per_coll) { + for (const auto& empos : positrons_per_coll) { if (empos.trackId() == ele.globalIndex()) { continue; } @@ -951,7 +951,7 @@ struct prefilterPrimaryElectron { } // end of signal positon loop } // end of loose electron loop - for (auto& pos : posTracks_per_coll) { + for (const auto& pos : posTracks_per_coll) { if (!checkTrack(collision, pos)) { // track cut is applied to loose sample continue; } @@ -964,7 +964,7 @@ struct prefilterPrimaryElectron { mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc, 2.f, matCorr, &mDcaInfoCov); getPxPyPz(track_par_cov_recalc, pVec_recalc); - for (auto& emele : electrons_per_coll) { + for (const auto& emele : electrons_per_coll) { if (emele.trackId() == pos.globalIndex()) { continue; } @@ -990,7 +990,7 @@ struct prefilterPrimaryElectron { } // end of signal electron loop } // end of loose positon loop - for (auto& pos : posTracks_per_coll) { + for (const auto& pos : posTracks_per_coll) { if (!checkTrack(collision, pos)) { // track cut is applied to loose sample continue; } @@ -1003,7 +1003,7 @@ struct prefilterPrimaryElectron { mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc, 2.f, matCorr, &mDcaInfoCov); getPxPyPz(track_par_cov_recalc, pVec_recalc); - for (auto& empos : positrons_per_coll) { + for (const auto& empos : positrons_per_coll) { if (empos.trackId() == pos.globalIndex()) { continue; } @@ -1017,7 +1017,7 @@ struct prefilterPrimaryElectron { } // end of signal positron loop } // end of loose positon loop - for (auto& ele : negTracks_per_coll) { + for (const auto& ele : negTracks_per_coll) { if (!checkTrack(collision, ele)) { continue; } @@ -1031,7 +1031,7 @@ struct prefilterPrimaryElectron { o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc, 2.f, matCorr, &mDcaInfoCov); getPxPyPz(track_par_cov_recalc, pVec_recalc); - for (auto& emele : electrons_per_coll) { + for (const auto& emele : electrons_per_coll) { if (emele.trackId() == ele.globalIndex()) { continue; } @@ -1052,16 +1052,16 @@ struct prefilterPrimaryElectron { negTracks_per_coll.shrink_to_fit(); } // end of collision loop - for (auto& ele : primaryelectrons) { + for (const auto& ele : primaryelectrons) { ele_pfb(pfb_map[ele.globalIndex()]); } // check prefilter - for (auto& collision : collisions) { + for (const auto& collision : collisions) { auto positrons_per_coll = positrons->sliceByCachedUnsorted(o2::aod::emprimaryelectron::collisionId, collision.globalIndex(), cache); // signal sample auto electrons_per_coll = electrons->sliceByCachedUnsorted(o2::aod::emprimaryelectron::collisionId, collision.globalIndex(), cache); // signal sample - for (auto& [ele, pos] : combinations(CombinationsFullIndexPolicy(electrons_per_coll, positrons_per_coll))) { + for (const auto& [ele, pos] : combinations(CombinationsFullIndexPolicy(electrons_per_coll, positrons_per_coll))) { if (pfb_map[ele.globalIndex()] != 0 || pfb_map[pos.globalIndex()] != 0) { continue; } @@ -1084,7 +1084,7 @@ struct prefilterPrimaryElectron { { std::unordered_map pfb_map; // map track.globalIndex -> prefilter bit - for (auto& collision : collisions) { + for (const auto& collision : collisions) { auto bc = collision.template foundBC_as(); initCCDB(bc); if (!collision.isSelected()) { @@ -1097,14 +1097,14 @@ struct prefilterPrimaryElectron { auto positrons_per_coll = positrons->sliceByCachedUnsorted(o2::aod::emprimaryelectron::collisionId, collision.globalIndex(), cache); // signal sample auto electrons_per_coll = electrons->sliceByCachedUnsorted(o2::aod::emprimaryelectron::collisionId, collision.globalIndex(), cache); // signal sample - for (auto& pos : posTracks_per_coll) { + for (const auto& pos : posTracks_per_coll) { if (!checkTrack(collision, pos)) { // track cut is applied to loose sample continue; } fRegistry.fill(HIST("Track/hPt"), pos.pt()); fRegistry.fill(HIST("Track/hEtaPhi"), pos.phi(), pos.eta()); } - for (auto& neg : negTracks_per_coll) { + for (const auto& neg : negTracks_per_coll) { if (!checkTrack(collision, neg)) { // track cut is applied to loose sample continue; } @@ -1112,7 +1112,7 @@ struct prefilterPrimaryElectron { fRegistry.fill(HIST("Track/hEtaPhi"), neg.phi(), neg.eta()); } - for (auto& [ele, empos] : combinations(CombinationsFullIndexPolicy(negTracks_per_coll, positrons_per_coll))) { + for (const auto& [ele, empos] : combinations(CombinationsFullIndexPolicy(negTracks_per_coll, positrons_per_coll))) { // auto pos = tracks.rawIteratorAt(empos.trackId()); // use rawIterator, if the table is filtered. if (!checkTrack(collision, ele)) { // track cut is applied to loose sample continue; @@ -1142,7 +1142,7 @@ struct prefilterPrimaryElectron { } // end of ULS pairing - for (auto& [pos, emele] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, electrons_per_coll))) { + for (const auto& [pos, emele] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, electrons_per_coll))) { // auto ele = tracks.rawIteratorAt(emele.trackId()); // use rawIterator, if the table is filtered. if (!checkTrack(collision, pos)) { // track cut is applied to loose sample continue; @@ -1172,7 +1172,7 @@ struct prefilterPrimaryElectron { } // end of ULS pairing - for (auto& [pos, empos] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, positrons_per_coll))) { + for (const auto& [pos, empos] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, positrons_per_coll))) { // auto pos = tracks.rawIteratorAt(empos.trackId()); // use rawIterator, if the table is filtered. if (!checkTrack(collision, pos)) { // track cut is applied to loose sample continue; @@ -1189,7 +1189,7 @@ struct prefilterPrimaryElectron { fRegistry.fill(HIST("Pair/before/lspp/hMvsPt"), v12.M(), v12.Pt()); } // end of LS++ pairing - for (auto& [ele, emele] : combinations(CombinationsFullIndexPolicy(negTracks_per_coll, electrons_per_coll))) { + for (const auto& [ele, emele] : combinations(CombinationsFullIndexPolicy(negTracks_per_coll, electrons_per_coll))) { // auto ele = tracks.rawIteratorAt(emele.trackId()); // use rawIterator, if the table is filtered. if (!checkTrack(collision, ele)) { // track cut is applied to loose sample continue; @@ -1208,16 +1208,16 @@ struct prefilterPrimaryElectron { } // end of collision loop - for (auto& ele : primaryelectrons) { + for (const auto& ele : primaryelectrons) { ele_pfb(pfb_map[ele.globalIndex()]); } // check prefilter - for (auto& collision : collisions) { + for (const auto& collision : collisions) { auto positrons_per_coll = positrons->sliceByCachedUnsorted(o2::aod::emprimaryelectron::collisionId, collision.globalIndex(), cache); // signal sample auto electrons_per_coll = electrons->sliceByCachedUnsorted(o2::aod::emprimaryelectron::collisionId, collision.globalIndex(), cache); // signal sample - for (auto& [ele, pos] : combinations(CombinationsFullIndexPolicy(electrons_per_coll, positrons_per_coll))) { + for (const auto& [ele, pos] : combinations(CombinationsFullIndexPolicy(electrons_per_coll, positrons_per_coll))) { if (pfb_map[ele.globalIndex()] != 0 || pfb_map[pos.globalIndex()] != 0) { continue; } @@ -1253,10 +1253,10 @@ struct associateAmbiguousElectron { void process(aod::EMPrimaryElectrons const& electrons) { - for (auto& electron : electrons) { + for (const auto& electron : electrons) { auto electrons_with_same_trackId = electrons.sliceBy(perTrack, electron.trackId()); ambele_self_Ids.reserve(electrons_with_same_trackId.size()); - for (auto& amb_ele : electrons_with_same_trackId) { + for (const auto& amb_ele : electrons_with_same_trackId) { if (amb_ele.globalIndex() == electron.globalIndex()) { // don't store myself. continue; } diff --git a/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx b/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx index 01e577ae479..705705bb3e4 100644 --- a/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx +++ b/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \brief write relevant information for dalitz ee analysis to an AO2D.root file. This file is then the only necessary input to perform pcm analysis. +/// \brief write relevant information for muons. /// \author daiki.sekihata@cern.ch #include diff --git a/PWGEM/Dilepton/Tasks/matchingMFT.cxx b/PWGEM/Dilepton/Tasks/matchingMFT.cxx index 21b360634ae..e9e2469e872 100644 --- a/PWGEM/Dilepton/Tasks/matchingMFT.cxx +++ b/PWGEM/Dilepton/Tasks/matchingMFT.cxx @@ -170,7 +170,7 @@ struct matchingMFT { fRegistry.addClone("MFTMCHMID/primary/correct/", "MFTMCHMID/primary/wrong/"); fRegistry.addClone("MFTMCHMID/primary/", "MFTMCHMID/secondary/"); - fRegistry.add("Generated/primary/hs", "gen. info;p_{T} (GeV/c);#eta;#varphi (rad.)", kTHnSparseF, {{100, 0.0f, 10}, {100, -6, -1}, {90, 0, 2.f * M_PI}}, false); + fRegistry.add("Generated/primary/hs", "gen. info;p_{T} (GeV/c);#eta;#varphi (rad.)", kTHnSparseF, {{100, 0.0f, 10}, {60, -5, -2}, {90, 0, 2.f * M_PI}}, false); } bool isSelected(const float pt, const float eta, const float rAtAbsorberEnd, const float pDCA, const float chi2, const uint8_t trackType, const float dcaXY) From fea2215c38c0d06bd43ff8de0291510ae2a6aa8e Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Sun, 13 Apr 2025 23:22:23 +0200 Subject: [PATCH 0975/1650] [PWGEM/Dilepton] update matchingMFT.cxx (#10833) --- PWGEM/Dilepton/Tasks/matchingMFT.cxx | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/PWGEM/Dilepton/Tasks/matchingMFT.cxx b/PWGEM/Dilepton/Tasks/matchingMFT.cxx index e9e2469e872..5821b58a8f7 100644 --- a/PWGEM/Dilepton/Tasks/matchingMFT.cxx +++ b/PWGEM/Dilepton/Tasks/matchingMFT.cxx @@ -60,7 +60,6 @@ struct matchingMFT { Configurable maxEtaSA{"maxEtaSA", -2.5, "max. eta acceptance for MCH-MID"}; Configurable minEtaGL{"minEtaGL", -3.6, "min. eta acceptance for MFT-MCH-MID"}; Configurable maxEtaGL{"maxEtaGL", -2.5, "max. eta acceptance for MFT-MCH-MID"}; - Configurable minRabsGL{"minRabsGL", 27.6, "min. R at absorber end for global muons (min. eta = -3.6)"}; // std::tan(2.f * std::atan(std::exp(- -3.6)) ) * -505. Configurable minRabs{"minRabs", 17.6, "min. R at absorber end"}; Configurable midRabs{"midRabs", 26.5, "middle R at absorber end for pDCA cut"}; Configurable maxRabs{"maxRabs", 89.5, "max. R at absorber end"}; @@ -195,9 +194,6 @@ struct matchingMFT { if (chi2 < 0.f || maxChi2GL < chi2) { return false; } - if (rAtAbsorberEnd < minRabsGL || maxRabs < rAtAbsorberEnd) { - return false; - } } else if (trackType == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { if (eta < minEtaSA || maxEtaSA < eta) { return false; @@ -228,6 +224,18 @@ struct matchingMFT { // LOGF(info, "mcParticle_MFTMCHMID.pdgCode() = %d, mcParticle_MCHMID.pdgCode() = %d, mcParticle_MFT.pdgCode() = %d", mcParticle_MFTMCHMID.pdgCode(), mcParticle_MCHMID.pdgCode(), mcParticle_MFT.pdgCode()); // LOGF(info, "mcParticle_MFTMCHMID.globalIndex() = %d, mcParticle_MCHMID.globalIndex() = %d, mcParticle_MFT.globalIndex() = %d", mcParticle_MFTMCHMID.globalIndex(), mcParticle_MCHMID.globalIndex(), mcParticle_MFT.globalIndex()); + if (fwdtrack.chi2MatchMCHMFT() > maxMatchingChi2MCHMFT) { + return; + } + + if (fwdtrack.chi2() < 0.f || maxChi2GL < fwdtrack.chi2()) { + return; + } + + if (fwdtrack.rAtAbsorberEnd() < minRabs || maxRabs < fwdtrack.rAtAbsorberEnd()) { + return; + } + if (std::abs(mcParticle_MCHMID.pdgCode()) != 13) { // select true muon return; } From 9f940f1a746b33cdb89f5f8f379eae7b911cd7ca Mon Sep 17 00:00:00 2001 From: JStaa <39123272+JStaa@users.noreply.github.com> Date: Mon, 14 Apr 2025 10:49:07 +0200 Subject: [PATCH 0976/1650] [PWGCF] Removed magic numbers from the code and changed the use of partitions (#10807) Co-authored-by: ALICE Action Bot --- .../Tasks/threeParticleCorrelations.cxx | 255 +++++++++--------- 1 file changed, 134 insertions(+), 121 deletions(-) diff --git a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx index 96a3ed2ffc3..95065ea4fe1 100644 --- a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx +++ b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx @@ -19,6 +19,7 @@ #include "Framework/AnalysisTask.h" #include "CCDB/BasicCCDBManager.h" #include "Common/DataModel/Centrality.h" +#include "Common/DataModel/McCollisionExtra.h" #include "Common/DataModel/PIDResponse.h" #include "DataFormatsParameters/GRPMagField.h" #include "PWGLF/DataModel/LFStrangenessTables.h" @@ -26,15 +27,34 @@ #include "RecoDecay.h" #include "TPDGCode.h" -#include "Common/DataModel/McCollisionExtra.h" - using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; +using namespace constants::physics; struct ThreeParticleCorrelations { Service ccdb; + // Analysis parameters + float centMin = 0.0, centMax = 90.0; + float zvtxMax = 7.0; + float v0PtMin = 0.6, v0PtMax = 12.0; + float v0EtaMax = 0.72; + float trackPtMin = 0.2, trackPtMax = 3.0; + float trackEtaMax = 0.8; + + double pionID = 0.0, kaonID = 1.0, protonID = 2.0; + float nSigma0 = 0.0, nSigma2 = 2.0, nSigma4 = 4.0; + + float pionPtMin = 0.3, pionPtMax = 2.3, kaonPtMin = 0.5, kaonPtMax = 2.5, protonPtMin = 0.5, protonPtMax = 2.5; + float pionPtMid = 1.5, kaonPtMid1 = 1.5, kaonPtMid2 = 2.0, protonPtMid = 0.7; + + float dEtaMin = 0.02, dPhiStarMin = 0.1; + float rMin = 0.8, rMax = 2.5; + + // Lambda invariant mass fit + double dGaussSigma = 0.0021; + // Histogram registry HistogramRegistry rMECorrRegistry{"MECorrRegistry", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; HistogramRegistry rSECorrRegistry{"SECorrRegistry", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; @@ -43,22 +63,22 @@ struct ThreeParticleCorrelations { HistogramRegistry rQARegistry{"QARegistry", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; // Collision & Event filters - Filter collCent = aod::cent::centFT0C > 0.0f && aod::cent::centFT0C < 90.0f; - Filter collZvtx = nabs(aod::collision::posZ) < 7.0f; - Filter mcCollZvtx = nabs(aod::mccollision::posZ) < 7.0f; + Filter collCent = aod::cent::centFT0C > centMin&& aod::cent::centFT0C < centMax; + Filter collZvtx = nabs(aod::collision::posZ) < zvtxMax; + Filter mcCollZvtx = nabs(aod::mccollision::posZ) < zvtxMax; Filter evSelect = aod::evsel::sel8 == true; // V0 filters - Filter v0Pt = aod::v0data::pt > 0.6f && aod::v0data::pt < 12.0f; - Filter v0Eta = nabs(aod::v0data::eta) < 0.72f; + Filter v0Pt = aod::v0data::pt > v0PtMin&& aod::v0data::pt < v0PtMax; + Filter v0Eta = nabs(aod::v0data::eta) < v0EtaMax; // Track filters - Filter trackPt = aod::track::pt > 0.2f && aod::track::pt < 3.0f; - Filter trackEta = nabs(aod::track::eta) < 0.8f; + Filter trackPt = aod::track::pt > trackPtMin&& aod::track::pt < trackPtMax; + Filter trackEta = nabs(aod::track::eta) < trackEtaMax; Filter globalTracks = requireGlobalTrackInFilter(); // Particle filters - Filter particleEta = nabs(aod::mcparticle::eta) < 0.8f; + Filter particleEta = nabs(aod::mcparticle::eta) < trackEtaMax; // Table aliases - Data using MyFilteredCollisions = soa::Filtered>; @@ -77,23 +97,31 @@ struct ThreeParticleCorrelations { aod::pidTPCPi, aod::pidTPCKa, aod::pidTPCPr, aod::pidTOFFullPi, aod::pidTOFFullKa, aod::pidTOFFullPr, aod::pidTOFbeta>>; + // Partitions + Partition mcParticles = aod::mcparticle::pt > trackPtMin&& aod::mcparticle::pt < trackPtMax; + Partition mcTriggers = ((aod::mcparticle::pdgCode == static_cast(kLambda0) || aod::mcparticle::pdgCode == static_cast(kLambda0Bar)) && + aod::mcparticle::pt > v0PtMin && aod::mcparticle::pt < v0PtMax && nabs(aod::mcparticle::eta) < v0EtaMax); + Partition mcAssociates = (((aod::mcparticle::pdgCode == static_cast(kPiPlus) || aod::mcparticle::pdgCode == static_cast(kPiMinus)) && aod::mcparticle::pt > pionPtMin && aod::mcparticle::pt < pionPtMax) || + ((aod::mcparticle::pdgCode == static_cast(kKPlus) || aod::mcparticle::pdgCode == static_cast(kKMinus)) && aod::mcparticle::pt > kaonPtMin && aod::mcparticle::pt < kaonPtMax) || + ((aod::mcparticle::pdgCode == static_cast(kProton) || aod::mcparticle::pdgCode == static_cast(kProtonBar)) && aod::mcparticle::pt > protonPtMin)); + // Mixed-events binning policy SliceCache cache; + Preslice perCol = aod::mcparticle::mcCollisionId; + ConfigurableAxis confCentBins{"confCentBins", {VARIABLE_WIDTH, 0.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f}, "ME Centrality binning"}; ConfigurableAxis confZvtxBins{"confZvtxBins", {VARIABLE_WIDTH, -7.0f, -5.0f, -3.0f, -1.0f, 0.0f, 1.0f, 3.0f, 5.0f, 7.0f}, "ME Zvtx binning"}; - using BinningType = ColumnBinningPolicy; using BinningTypeMC = ColumnBinningPolicy; + BinningType collBinning{{confCentBins, confZvtxBins}, true}; BinningTypeMC collBinningMC{{confCentBins, confZvtxBins}, true}; + Pair pairData{collBinning, 5, -1, &cache}; + SameKindPair pairMC{collBinningMC, 5, -1, &cache}; // Process configurables Configurable confFilterSwitch{"confFilterSwitch", false, "Switch for the fakeV0Filter function"}; - // Particle masses - double massLambda = constants::physics::MassLambda0; - double dGaussSigma = 0.0021; - // Efficiency histograms TH1D** hEffPions = new TH1D*[2]; TH1D** hEffKaons = new TH1D*[2]; @@ -129,6 +157,10 @@ struct ThreeParticleCorrelations { rQARegistry.add("hEventCentrality_MC", "hEventCentrality_MC", {HistType::kTH1D, {{centralityAxis}}}); rQARegistry.add("hEventZvtx", "hEventZvtx", {HistType::kTH1D, {{zvtxAxis}}}); + rQARegistry.add("hPtPion", "hPtPion", {HistType::kTH1D, {{trackPtAxis}}}); + rQARegistry.add("hPtKaon", "hPtKaon", {HistType::kTH1D, {{trackPtAxis}}}); + rQARegistry.add("hPtProton", "hPtProton", {HistType::kTH1D, {{trackPtAxis}}}); + rQARegistry.add("hPtV0", "hPtV0", {HistType::kTH1D, {{v0PtAxis}}}); rQARegistry.add("hdEdx", "hdEdx", {HistType::kTH2D, {{56, 0.2, 3.0}, {180, 20, 200}}}); rQARegistry.add("hdEdxPion", "hdEdxPion", {HistType::kTH2D, {{56, 0.2, 3.0}, {180, 20, 200}}}); rQARegistry.add("hdEdxKaon", "hdEdxKaon", {HistType::kTH2D, {{56, 0.2, 3.0}, {180, 20, 200}}}); @@ -137,9 +169,6 @@ struct ThreeParticleCorrelations { rQARegistry.add("hBetaPion", "hBetaPion", {HistType::kTH2D, {{56, 0.2, 3.0}, {70, 0.4, 1.1}}}); rQARegistry.add("hBetaKaon", "hBetaKaon", {HistType::kTH2D, {{56, 0.2, 3.0}, {70, 0.4, 1.1}}}); rQARegistry.add("hBetaProton", "hBetaProton", {HistType::kTH2D, {{56, 0.2, 3.0}, {70, 0.4, 1.1}}}); - rQARegistry.add("hNSigmaPion", "hNSigmaPion", {HistType::kTH2D, {{201, -5.025, 5.025}, {201, -5.025, 5.025}}}); - rQARegistry.add("hNSigmaKaon", "hNSigmaKaon", {HistType::kTH2D, {{201, -5.025, 5.025}, {201, -5.025, 5.025}}}); - rQARegistry.add("hNSigmaProton", "hNSigmaProton", {HistType::kTH2D, {{201, -5.025, 5.025}, {201, -5.025, 5.025}}}); rQARegistry.add("hTPCPion", "hTPCPion", {HistType::kTH2D, {{trackPtAxis}, {241, -6, 6}}}); rQARegistry.add("hTPCKaon", "hTPCKaon", {HistType::kTH2D, {{trackPtAxis}, {241, -6, 6}}}); @@ -248,18 +277,18 @@ struct ThreeParticleCorrelations { rQARegistry.fill(HIST("hTrackPhi"), track.phi()); rQARegistry.fill(HIST("hdEdx"), track.pt(), track.tpcSignal()); rQARegistry.fill(HIST("hBeta"), track.pt(), track.beta()); - if (assocPID[0] == 0.0) { // Pions + if (assocPID[0] == pionID) { // Pions + rQARegistry.fill(HIST("hPtPion"), track.pt(), 1. / trackEff(hEffPions, track.sign(), track.pt())); rQARegistry.fill(HIST("hdEdxPion"), track.pt(), track.tpcSignal()); rQARegistry.fill(HIST("hBetaPion"), track.pt(), track.beta()); - rQARegistry.fill(HIST("hNSigmaPion"), track.tpcNSigmaPi(), track.tofNSigmaPi()); - } else if (assocPID[0] == 1.0) { // Kaons + } else if (assocPID[0] == kaonID) { // Kaons + rQARegistry.fill(HIST("hPtKaon"), track.pt(), 1. / trackEff(hEffKaons, track.sign(), track.pt())); rQARegistry.fill(HIST("hdEdxKaon"), track.pt(), track.tpcSignal()); rQARegistry.fill(HIST("hBetaKaon"), track.pt(), track.beta()); - rQARegistry.fill(HIST("hNSigmaKaon"), track.tpcNSigmaKa(), track.tofNSigmaKa()); - } else if (assocPID[0] == 2.0) { // Protons + } else if (assocPID[0] == protonID) { // Protons + rQARegistry.fill(HIST("hPtProton"), track.pt(), 1. / trackEff(hEffProtons, track.sign(), track.pt())); rQARegistry.fill(HIST("hdEdxProton"), track.pt(), track.tpcSignal()); rQARegistry.fill(HIST("hBetaProton"), track.pt(), track.beta()); - rQARegistry.fill(HIST("hNSigmaProton"), track.tpcNSigmaPr(), track.tofNSigmaPr()); } } } @@ -269,6 +298,7 @@ struct ThreeParticleCorrelations { for (const auto& trigger : v0s) { if (v0Filters(trigger)) { + rQARegistry.fill(HIST("hPtV0"), trigger.pt()); triggSign = v0Sign(trigger); if (triggSign == 1) { candMass = trigger.mLambda(); @@ -286,20 +316,20 @@ struct ThreeParticleCorrelations { deltaPhi = RecoDecay::constrainAngle(trigger.phi() - associate.phi(), -constants::math::PIHalf); deltaEta = trigger.eta() - associate.eta(); - if (candMass >= massLambda - 4 * dGaussSigma && candMass <= massLambda + 4 * dGaussSigma) { - if (assocPID[0] == 0.0) { // Pions + if (candMass >= MassLambda0 - 4 * dGaussSigma && candMass <= MassLambda0 + 4 * dGaussSigma) { + if (assocPID[0] == pionID) { // Pions rSECorrRegistry.fill(HIST("hSameLambdaPion_SGNL"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate.sign(), associate.pt())); - } else if (assocPID[0] == 1.0) { // Kaons + } else if (assocPID[0] == kaonID) { // Kaons rSECorrRegistry.fill(HIST("hSameLambdaKaon_SGNL"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate.sign(), associate.pt())); - } else if (assocPID[0] == 2.0) { // Protons + } else if (assocPID[0] == protonID) { // Protons rSECorrRegistry.fill(HIST("hSameLambdaProton_SGNL"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate.sign(), associate.pt())); } - } else if (candMass >= massLambda - 8 * dGaussSigma && candMass <= massLambda + 8 * dGaussSigma) { - if (assocPID[0] == 0.0) { // Pions + } else if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { + if (assocPID[0] == pionID) { // Pions rSECorrRegistry.fill(HIST("hSameLambdaPion_SB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate.sign(), associate.pt())); - } else if (assocPID[0] == 1.0) { // Kaons + } else if (assocPID[0] == kaonID) { // Kaons rSECorrRegistry.fill(HIST("hSameLambdaKaon_SB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate.sign(), associate.pt())); - } else if (assocPID[0] == 2.0) { // Protons + } else if (assocPID[0] == protonID) { // Protons rSECorrRegistry.fill(HIST("hSameLambdaProton_SB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate.sign(), associate.pt())); } } @@ -311,12 +341,9 @@ struct ThreeParticleCorrelations { // End of the Same-Event correlations } - void processMixed(MyFilteredCollisions const& collisions, MyFilteredV0s const& v0s, MyFilteredTracks const& tracks, aod::BCsWithTimestamps const&) + void processMixed(MyFilteredCollisions const&, MyFilteredV0s const&, MyFilteredTracks const&, aod::BCsWithTimestamps const&) { - auto tracksTuple = std::make_tuple(v0s, tracks); - Pair pairData{collBinning, 5, -1, collisions, tracksTuple, &cache}; - // Start of the Mixed-Event correlations for (const auto& [coll_1, v0_1, coll_2, track_2] : pairData) { @@ -337,20 +364,20 @@ struct ThreeParticleCorrelations { deltaPhi = RecoDecay::constrainAngle(trigger.phi() - associate.phi(), -constants::math::PIHalf); deltaEta = trigger.eta() - associate.eta(); - if (candMass >= massLambda - 4 * dGaussSigma && candMass <= massLambda + 4 * dGaussSigma) { - if (assocPID[0] == 0.0) { // Pions + if (candMass >= MassLambda0 - 4 * dGaussSigma && candMass <= MassLambda0 + 4 * dGaussSigma) { + if (assocPID[0] == pionID) { // Pions rMECorrRegistry.fill(HIST("hMixLambdaPion_SGNL"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate.sign(), associate.pt())); - } else if (assocPID[0] == 1.0) { // Kaons + } else if (assocPID[0] == kaonID) { // Kaons rMECorrRegistry.fill(HIST("hMixLambdaKaon_SGNL"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate.sign(), associate.pt())); - } else if (assocPID[0] == 2.0) { // Protons + } else if (assocPID[0] == protonID) { // Protons rMECorrRegistry.fill(HIST("hMixLambdaProton_SGNL"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate.sign(), associate.pt())); } - } else if (candMass >= massLambda - 8 * dGaussSigma && candMass <= massLambda + 8 * dGaussSigma) { - if (assocPID[0] == 0.0) { // Pions + } else if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { + if (assocPID[0] == pionID) { // Pions rMECorrRegistry.fill(HIST("hMixLambdaPion_SB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate.sign(), associate.pt())); - } else if (assocPID[0] == 1.0) { // Kaons + } else if (assocPID[0] == kaonID) { // Kaons rMECorrRegistry.fill(HIST("hMixLambdaKaon_SB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate.sign(), associate.pt())); - } else if (assocPID[0] == 2.0) { // Protons + } else if (assocPID[0] == protonID) { // Protons rMECorrRegistry.fill(HIST("hMixLambdaProton_SB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate.sign(), associate.pt())); } } @@ -361,19 +388,15 @@ struct ThreeParticleCorrelations { // End of the Mixed-Event Correlations } - void processMCSame(MyFilteredMCGenCollision const& collision, MyFilteredMCParticles const& particles) + void processMCSame(MyFilteredMCGenCollision const& collision, MyFilteredMCParticles const&) { rQARegistry.fill(HIST("hEventCentrality_MC"), collision.bestCollisionCentFT0C()); - Partition mcTriggers = (aod::mcparticle::pdgCode == static_cast(kLambda0) || aod::mcparticle::pdgCode == static_cast(kLambda0Bar)) && aod::mcparticle::pt > 0.6f && aod::mcparticle::pt < 12.0f && nabs(aod::mcparticle::eta) < 0.72f; - Partition mcAssociates = (((aod::mcparticle::pdgCode == static_cast(kPiPlus) || aod::mcparticle::pdgCode == static_cast(kPiMinus)) && aod::mcparticle::pt > 0.3f && aod::mcparticle::pt < 2.3f) || - ((aod::mcparticle::pdgCode == static_cast(kKPlus) || aod::mcparticle::pdgCode == static_cast(kKMinus)) && aod::mcparticle::pt > 0.5f && aod::mcparticle::pt < 2.5f) || - ((aod::mcparticle::pdgCode == static_cast(kProton) || aod::mcparticle::pdgCode == static_cast(kProtonBar)) && aod::mcparticle::pt > 0.5f)); - mcTriggers.bindTable(particles); - mcAssociates.bindTable(particles); + auto groupMCTriggers = mcTriggers->sliceByCached(aod::mcparticle::mcCollisionId, collision.globalIndex(), cache); + auto groupMCAssociates = mcAssociates->sliceByCached(aod::mcparticle::mcCollisionId, collision.globalIndex(), cache); // Start of the MC Same-Event correlations - for (const auto& trigger : mcTriggers) { + for (const auto& trigger : groupMCTriggers) { if (trigger.isPhysicalPrimary()) { if (trigger.pdgCode() > 0) { @@ -383,7 +406,7 @@ struct ThreeParticleCorrelations { } rQARegistry.fill(HIST("hNLambdas"), triggSign, trigger.pt(), collision.bestCollisionCentFT0C()); - for (const auto& associate : mcAssociates) { + for (const auto& associate : groupMCAssociates) { if (associate.isPhysicalPrimary()) { if (associate.pdgCode() > 0) { @@ -409,22 +432,15 @@ struct ThreeParticleCorrelations { // End of the MC Same-Event Correlations } - void processMCMixed(MyFilteredMCGenCollisions const& collisions, MyFilteredMCParticles const& particles) + void processMCMixed(MyFilteredMCGenCollisions const&, MyFilteredMCParticles const&) { - auto particlesTuple = std::make_tuple(particles); - SameKindPair pairMC{collBinningMC, 5, -1, collisions, particlesTuple, &cache}; - // Start of the MC Mixed-events Correlations - for (const auto& [coll_1, v0_1, coll_2, track_2] : pairMC) { - Partition mcTriggers = (aod::mcparticle::pdgCode == static_cast(kLambda0) || aod::mcparticle::pdgCode == static_cast(kLambda0Bar)) && aod::mcparticle::pt > 0.6f && aod::mcparticle::pt < 12.0f && nabs(aod::mcparticle::eta) < 0.72f; - Partition mcAssociates = (((aod::mcparticle::pdgCode == static_cast(kPiPlus) || aod::mcparticle::pdgCode == static_cast(kPiMinus)) && aod::mcparticle::pt > 0.3f && aod::mcparticle::pt < 2.3f) || - ((aod::mcparticle::pdgCode == static_cast(kKPlus) || aod::mcparticle::pdgCode == static_cast(kKMinus)) && aod::mcparticle::pt > 0.5f && aod::mcparticle::pt < 2.5f) || - ((aod::mcparticle::pdgCode == static_cast(kProton) || aod::mcparticle::pdgCode == static_cast(kProtonBar)) && aod::mcparticle::pt > 0.5f)); - mcTriggers.bindTable(v0_1); - mcAssociates.bindTable(track_2); - - for (const auto& [trigger, associate] : soa::combinations(soa::CombinationsFullIndexPolicy(mcTriggers, mcAssociates))) { + for (const auto& [coll_1, v0_1, coll_2, particle_2] : pairMC) { + auto groupMCTriggers = mcTriggers->sliceByCached(aod::mcparticle::mcCollisionId, coll_1.globalIndex(), cache); + auto groupMCAssociates = mcAssociates->sliceByCached(aod::mcparticle::mcCollisionId, coll_2.globalIndex(), cache); + + for (const auto& [trigger, associate] : soa::combinations(soa::CombinationsFullIndexPolicy(groupMCTriggers, groupMCAssociates))) { if (trigger.isPhysicalPrimary() && associate.isPhysicalPrimary()) { if (trigger.pdgCode() > 0) { @@ -454,12 +470,9 @@ struct ThreeParticleCorrelations { // End of the MC Mixed-events Correlations } - void processMCGen(MyFilteredMCGenCollision const&, MyFilteredMCParticles const& particles) + void processMCGen(MyFilteredMCGenCollision const&, MyFilteredMCParticles const&) { - Partition mcParticles = aod::mcparticle::pt > 0.2f && aod::mcparticle::pt < 3.0f; - mcParticles.bindTable(particles); - // Start of the Monte-Carlo generated QA for (const auto& particle : mcParticles) { if (particle.isPhysicalPrimary()) { @@ -521,34 +534,34 @@ struct ThreeParticleCorrelations { assocPID = trackPID(track); if (track.sign() > 0) { // Positive tracks - if (assocPID[0] == 0.0) { // Pions + if (assocPID[0] == pionID) { // Pions rMCRegistry.fill(HIST("hSelectPionP"), track.pt()); if (particle.pdgCode() == kPiPlus) { rMCRegistry.fill(HIST("hTrueSelectPionP"), track.pt()); } - } else if (assocPID[0] == 1.0) { // Kaons + } else if (assocPID[0] == kaonID) { // Kaons rMCRegistry.fill(HIST("hSelectKaonP"), track.pt()); if (particle.pdgCode() == kKPlus) { rMCRegistry.fill(HIST("hTrueSelectKaonP"), track.pt()); } - } else if (assocPID[0] == 2.0) { // Protons + } else if (assocPID[0] == protonID) { // Protons rMCRegistry.fill(HIST("hSelectProtonP"), track.pt()); if (particle.pdgCode() == kProton) { rMCRegistry.fill(HIST("hTrueSelectProtonP"), track.pt()); } } } else if (track.sign() < 0) { // Negative tracks - if (assocPID[0] == 0.0) { // Pions + if (assocPID[0] == pionID) { // Pions rMCRegistry.fill(HIST("hSelectPionN"), track.pt()); if (particle.pdgCode() == kPiMinus) { rMCRegistry.fill(HIST("hTrueSelectPionN"), track.pt()); } - } else if (assocPID[0] == 1.0) { // Kaons + } else if (assocPID[0] == kaonID) { // Kaons rMCRegistry.fill(HIST("hSelectKaonN"), track.pt()); if (particle.pdgCode() == kKMinus) { rMCRegistry.fill(HIST("hTrueSelectKaonN"), track.pt()); } - } else if (assocPID[0] == 2.0) { // Protons + } else if (assocPID[0] == protonID) { // Protons rMCRegistry.fill(HIST("hSelectProtonN"), track.pt()); if (particle.pdgCode() == kProtonBar) { rMCRegistry.fill(HIST("hTrueSelectProtonN"), track.pt()); @@ -607,9 +620,9 @@ struct ThreeParticleCorrelations { int v0Sign(const V0Cand& v0) { - if (std::abs(v0.mLambda() - massLambda) <= std::abs(v0.mAntiLambda() - massLambda)) { + if (std::abs(v0.mLambda() - MassLambda0) <= std::abs(v0.mAntiLambda() - MassLambda0)) { return 1; - } else if (std::abs(v0.mLambda() - massLambda) > std::abs(v0.mAntiLambda() - massLambda)) { + } else if (std::abs(v0.mLambda() - MassLambda0) > std::abs(v0.mAntiLambda() - MassLambda0)) { return -1; } @@ -633,13 +646,13 @@ struct ThreeParticleCorrelations { nSigma[2] = std::abs(nSigmaTOF[2]); if (nSigma[0] <= std::min(nSigma[1], nSigma[2])) { // Pions - pid[0] = 0.0; + pid[0] = pionID; pid[1] = nSigmaTOF[0]; } else if (nSigma[1] <= std::min(nSigma[0], nSigma[2])) { // Kaons - pid[0] = 1.0; + pid[0] = kaonID; pid[1] = nSigmaTOF[1]; } else if (nSigma[2] < std::min(nSigma[0], nSigma[1])) { // Protons - pid[0] = 2.0; + pid[0] = protonID; pid[1] = nSigmaTOF[2]; } @@ -654,12 +667,12 @@ struct ThreeParticleCorrelations { if (v0Sign(v0) == 1) { const auto& posDaughter = v0.template posTrack_as(); - if (std::abs(posDaughter.tpcNSigmaPr()) > 4.0) { + if (std::abs(posDaughter.tpcNSigmaPr()) > nSigma4) { return kFALSE; } } else if (v0Sign(v0) == -1) { const auto& negDaughter = v0.template negTrack_as(); - if (std::abs(negDaughter.tpcNSigmaPr()) > 4.0) { + if (std::abs(negDaughter.tpcNSigmaPr()) > nSigma4) { return kFALSE; } } @@ -675,62 +688,62 @@ struct ThreeParticleCorrelations { return kFALSE; } - if (trackPID(track)[0] == 0.0) { // Pions - if (std::abs(track.tpcNSigmaPi()) > 4.0) { + if (trackPID(track)[0] == pionID) { // Pions + if (std::abs(track.tpcNSigmaPi()) > nSigma4) { return kFALSE; } - if (track.pt() < 0.3) { + if (track.pt() < pionPtMin) { return kFALSE; - } else if (track.pt() > 0.3 && track.pt() < 1.5) { - if (std::abs(track.tofNSigmaPi()) > 4.0) { + } else if (track.pt() > pionPtMin && track.pt() < pionPtMid) { + if (std::abs(track.tofNSigmaPi()) > nSigma4) { return kFALSE; } - } else if (track.pt() > 1.5 && track.pt() < 2.3) { - if (track.tofNSigmaPi() < -4.0 || track.tofNSigmaPi() > 0.0) { + } else if (track.pt() > pionPtMid && track.pt() < pionPtMax) { + if (track.tofNSigmaPi() < -nSigma4 || track.tofNSigmaPi() > nSigma0) { return kFALSE; } - } else if (track.pt() > 2.3) { + } else if (track.pt() > pionPtMax) { return kFALSE; } - } else if (trackPID(track)[0] == 1.0) { // Kaons - if (std::abs(track.tpcNSigmaKa()) > 4.0) { + } else if (trackPID(track)[0] == kaonID) { // Kaons + if (std::abs(track.tpcNSigmaKa()) > nSigma4) { return kFALSE; } - if (track.pt() < 0.5) { + if (track.pt() < kaonPtMin) { return kFALSE; - } else if (track.pt() > 0.5 && track.pt() < 1.5) { - if (std::abs(track.tofNSigmaKa()) > 4.0) { + } else if (track.pt() > kaonPtMin && track.pt() < kaonPtMid1) { + if (std::abs(track.tofNSigmaKa()) > nSigma4) { return kFALSE; } - } else if (track.pt() > 1.5 && track.pt() < 2.0) { - if (track.tofNSigmaKa() < -2.0 || track.tofNSigmaKa() > 4.0) { + } else if (track.pt() > kaonPtMid1 && track.pt() < kaonPtMid2) { + if (track.tofNSigmaKa() < -nSigma2 || track.tofNSigmaKa() > nSigma4) { return kFALSE; } - } else if (track.pt() > 2.0 && track.pt() < 2.5) { - if (track.tofNSigmaKa() < 0.0 || track.tofNSigmaKa() > 4.0) { + } else if (track.pt() > kaonPtMid2 && track.pt() < kaonPtMax) { + if (track.tofNSigmaKa() < nSigma0 || track.tofNSigmaKa() > nSigma4) { return kFALSE; } - } else if (track.pt() > 2.5) { + } else if (track.pt() > kaonPtMax) { return kFALSE; } - } else if (trackPID(track)[0] == 2.0) { // Protons - if (std::abs(track.tpcNSigmaPr()) > 4.0) { + } else if (trackPID(track)[0] == protonID) { // Protons + if (std::abs(track.tpcNSigmaPr()) > nSigma4) { return kFALSE; } - if (track.pt() < 0.5) { + if (track.pt() < protonPtMin) { return kFALSE; - } else if (track.pt() > 0.5 && track.pt() < 0.7) { - if (track.tofNSigmaPr() < -2.0 || track.tofNSigmaPr() > 4.0) { + } else if (track.pt() > protonPtMin && track.pt() < protonPtMid) { + if (track.tofNSigmaPr() < -nSigma2 || track.tofNSigmaPr() > nSigma4) { return kFALSE; } - } else if (track.pt() > 0.7 && track.pt() < 2.5) { - if (std::abs(track.tofNSigmaPr()) > 4.0) { + } else if (track.pt() > protonPtMid && track.pt() < protonPtMax) { + if (std::abs(track.tofNSigmaPr()) > nSigma4) { return kFALSE; } - } else if (track.pt() > 2.5) { - if (track.tofNSigmaPr() < -2.0 || track.tofNSigmaPr() > 4.0) { + } else if (track.pt() > protonPtMax) { + if (track.tofNSigmaPr() < -nSigma2 || track.tofNSigmaPr() > nSigma4) { return kFALSE; } } @@ -756,15 +769,15 @@ struct ThreeParticleCorrelations { if (confFilterSwitch) { - if (trackPID(track)[0] == 1.0) { // Kaons + if (trackPID(track)[0] == kaonID) { // Kaons return kTRUE; } std::array massArray; std::array dMomArray; std::array aMomArray = track.pVector(); - if (trackPID(track)[0] == 0.0) { - massArray = {constants::physics::MassProton, constants::physics::MassPionCharged}; + if (trackPID(track)[0] == pionID) { + massArray = {MassProton, MassPionCharged}; if (v0Sign(v0) == 1 && track.sign() == -1) { // Lambda - Pi_min const auto& dTrack = v0.template posTrack_as(); @@ -773,8 +786,8 @@ struct ThreeParticleCorrelations { const auto& dTrack = v0.template negTrack_as(); dMomArray = dTrack.pVector(); } - } else if (trackPID(track)[0] == 2.0) { - massArray = {constants::physics::MassPionCharged, constants::physics::MassProton}; + } else if (trackPID(track)[0] == protonID) { + massArray = {MassPionCharged, MassProton}; if (v0Sign(v0) == 1 && track.sign() == 1) { // Lambda - Proton const auto& dTrack = v0.template negTrack_as(); @@ -786,7 +799,7 @@ struct ThreeParticleCorrelations { } double invMass = RecoDecay::m(std::array{dMomArray, aMomArray}, massArray); - if (invMass >= massLambda - 4 * dGaussSigma && invMass <= massLambda + 4 * dGaussSigma) { + if (invMass >= MassLambda0 - 4 * dGaussSigma && invMass <= MassLambda0 + 4 * dGaussSigma) { return kFALSE; } } @@ -804,7 +817,7 @@ struct ThreeParticleCorrelations { } double dEta = proton.eta() - track.eta(); - if (std::abs(dEta) > 0.02) { + if (std::abs(dEta) > dEtaMin) { return kTRUE; } @@ -813,10 +826,10 @@ struct ThreeParticleCorrelations { double phaseProton = (-0.3 * B * proton.sign()) / (2 * proton.pt()); double phaseTrack = (-0.3 * B * track.sign()) / (2 * track.pt()); - for (double r = 0.8; r <= 2.5; r += 0.01) { + for (double r = rMin; r <= rMax; r += 0.01) { dPhiStar = RecoDecay::constrainAngle(dPhi + std::asin(phaseProton * r) - std::asin(phaseTrack * r), -constants::math::PIHalf); - if (r == 0.8) { + if (r == rMin) { if (!Mix) { rPhiStarRegistry.fill(HIST("hSEProtonPreCut"), dPhiStar, dEta); } else { @@ -824,11 +837,11 @@ struct ThreeParticleCorrelations { } } - if (std::abs(dPhiStar) < 0.1) { + if (std::abs(dPhiStar) < dPhiStarMin) { return kFALSE; } - if (r == 0.8) { + if (r == rMin) { if (!Mix) { rPhiStarRegistry.fill(HIST("hSEProtonPostCut"), dPhiStar, dEta); } else { From 35750d61823acb9ef2a7c67ab6dc048f4c63f0bd Mon Sep 17 00:00:00 2001 From: Francesca Ercolessi Date: Mon, 14 Apr 2025 11:03:46 +0200 Subject: [PATCH 0977/1650] [PWGLF] v0 analysis vs multiplicity: fix selections add QA plots add feeddown (#10825) --- PWGLF/DataModel/v0qaanalysis.h | 21 +- .../Strangeness/v0qaanalysis.cxx | 71 +- PWGLF/Tasks/Strangeness/v0postprocessing.cxx | 644 +++++++++++------- 3 files changed, 466 insertions(+), 270 deletions(-) diff --git a/PWGLF/DataModel/v0qaanalysis.h b/PWGLF/DataModel/v0qaanalysis.h index 977521b472c..c2b26d3054f 100644 --- a/PWGLF/DataModel/v0qaanalysis.h +++ b/PWGLF/DataModel/v0qaanalysis.h @@ -22,6 +22,8 @@ namespace myv0candidates { DECLARE_SOA_COLUMN(V0Pt, v0pt, float); +DECLARE_SOA_COLUMN(V0MotherPt, v0motherpt, float); +DECLARE_SOA_COLUMN(V0MCRap, v0mcrap, float); DECLARE_SOA_COLUMN(RapLambda, raplambda, float); DECLARE_SOA_COLUMN(RapK0Short, rapk0short, float); DECLARE_SOA_COLUMN(MassLambda, masslambda, float); @@ -34,8 +36,6 @@ DECLARE_SOA_COLUMN(V0DCANegToPV, v0dcanegtopv, float); DECLARE_SOA_COLUMN(V0DCAV0Daughters, v0dcav0daughters, float); DECLARE_SOA_COLUMN(V0PosEta, v0poseta, float); DECLARE_SOA_COLUMN(V0NegEta, v0negeta, float); -DECLARE_SOA_COLUMN(V0PosPhi, v0posphi, float); -DECLARE_SOA_COLUMN(V0NegPhi, v0negphi, float); DECLARE_SOA_COLUMN(V0PosITSHits, v0positshits, float); DECLARE_SOA_COLUMN(V0NegITSHits, v0negitshits, float); DECLARE_SOA_COLUMN(CtauLambda, ctaulambda, float); @@ -52,22 +52,21 @@ DECLARE_SOA_COLUMN(NTOFSigmaPosPi, ntofsigmapospi, float); DECLARE_SOA_COLUMN(PosHasTOF, poshastof, float); DECLARE_SOA_COLUMN(NegHasTOF, neghastof, float); DECLARE_SOA_COLUMN(PDGCode, pdgcode, int); +DECLARE_SOA_COLUMN(PDGCodeMother, pdgcodemother, int); DECLARE_SOA_COLUMN(IsDauK0Short, isdauk0short, bool); DECLARE_SOA_COLUMN(IsDauLambda, isdaulambda, bool); DECLARE_SOA_COLUMN(IsDauAntiLambda, isdauantilambda, bool); DECLARE_SOA_COLUMN(IsPhysicalPrimary, isphysprimary, bool); DECLARE_SOA_COLUMN(MultFT0M, multft0m, float); -DECLARE_SOA_COLUMN(MultFV0A, multfv0a, float); +DECLARE_SOA_COLUMN(MultNGlobals, multnglobals, float); DECLARE_SOA_COLUMN(EvFlag, evflag, int); DECLARE_SOA_COLUMN(Alpha, alpha, float); DECLARE_SOA_COLUMN(QtArm, qtarm, float); DECLARE_SOA_COLUMN(V0PosTPCCrossedRows, v0postpcCrossedRows, float); -DECLARE_SOA_COLUMN(V0PosTPCCRFindCls, v0postpcCRFindCls, float); DECLARE_SOA_COLUMN(V0PosTPCNClsShared, v0postpcNClsShared, float); DECLARE_SOA_COLUMN(V0PosITSChi2NCl, v0positsChi2NCl, float); DECLARE_SOA_COLUMN(V0PosTPCChi2NCl, v0postpcChi2NCl, float); DECLARE_SOA_COLUMN(V0NegTPCCrossedRows, v0negtpcCrossedRows, float); -DECLARE_SOA_COLUMN(V0NegTPCCRFindCls, v0negtpcCRFindCls, float); DECLARE_SOA_COLUMN(V0NegTPCNClsShared, v0negtpcNClsShared, float); DECLARE_SOA_COLUMN(V0NegITSChi2NCl, v0negitsChi2NCl, float); DECLARE_SOA_COLUMN(V0NegTPCChi2NCl, v0negtpcChi2NCl, float); @@ -75,21 +74,21 @@ DECLARE_SOA_COLUMN(V0NegTPCChi2NCl, v0negtpcChi2NCl, float); } // namespace myv0candidates DECLARE_SOA_TABLE(MyV0Candidates, "AOD", "MYV0CANDIDATES", - myv0candidates::V0Pt, myv0candidates::RapLambda, myv0candidates::RapK0Short, + myv0candidates::V0Pt, myv0candidates::V0MotherPt, myv0candidates::V0MCRap, myv0candidates::RapLambda, myv0candidates::RapK0Short, myv0candidates::MassLambda, myv0candidates::MassAntiLambda, myv0candidates::MassK0Short, myv0candidates::V0Radius, myv0candidates::V0CosPA, myv0candidates::V0DCAPosToPV, myv0candidates::V0DCANegToPV, myv0candidates::V0DCAV0Daughters, - myv0candidates::V0PosEta, myv0candidates::V0NegEta, myv0candidates::V0PosPhi, myv0candidates::V0NegPhi, + myv0candidates::V0PosEta, myv0candidates::V0NegEta, myv0candidates::V0PosITSHits, myv0candidates::V0NegITSHits, myv0candidates::CtauLambda, myv0candidates::CtauAntiLambda, myv0candidates::CtauK0Short, myv0candidates::NTPCSigmaNegPr, myv0candidates::NTPCSigmaPosPr, myv0candidates::NTPCSigmaNegPi, myv0candidates::NTPCSigmaPosPi, myv0candidates::NTOFSigmaNegPr, myv0candidates::NTOFSigmaPosPr, myv0candidates::NTOFSigmaNegPi, myv0candidates::NTOFSigmaPosPi, myv0candidates::PosHasTOF, myv0candidates::NegHasTOF, - myv0candidates::PDGCode, myv0candidates::IsDauK0Short, myv0candidates::IsDauLambda, myv0candidates::IsDauAntiLambda, myv0candidates::IsPhysicalPrimary, - myv0candidates::MultFT0M, myv0candidates::MultFV0A, + myv0candidates::PDGCode, myv0candidates::PDGCodeMother, myv0candidates::IsDauK0Short, myv0candidates::IsDauLambda, myv0candidates::IsDauAntiLambda, myv0candidates::IsPhysicalPrimary, + myv0candidates::MultFT0M, myv0candidates::MultNGlobals, myv0candidates::EvFlag, myv0candidates::Alpha, myv0candidates::QtArm, - myv0candidates::V0PosTPCCrossedRows, myv0candidates::V0PosTPCCRFindCls, myv0candidates::V0PosTPCNClsShared, + myv0candidates::V0PosTPCCrossedRows, myv0candidates::V0PosTPCNClsShared, myv0candidates::V0PosITSChi2NCl, myv0candidates::V0PosTPCChi2NCl, - myv0candidates::V0NegTPCCrossedRows, myv0candidates::V0NegTPCCRFindCls, myv0candidates::V0NegTPCNClsShared, + myv0candidates::V0NegTPCCrossedRows, myv0candidates::V0NegTPCNClsShared, myv0candidates::V0NegITSChi2NCl, myv0candidates::V0NegTPCChi2NCl); } // namespace o2::aod diff --git a/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx b/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx index 7dcdb2758c9..bafe557c237 100644 --- a/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx +++ b/PWGLF/TableProducer/Strangeness/v0qaanalysis.cxx @@ -43,7 +43,7 @@ void customize(std::vector& workflowOptions) using DauTracks = soa::Join; using DauTracksMC = soa::Join; -using V0Collisions = soa::Join; +using V0Collisions = soa::Join; struct LfV0qaanalysis { @@ -81,7 +81,7 @@ struct LfV0qaanalysis { registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(9, "Applied selection"); registry.add("hCentFT0M", "hCentFT0M", {HistType::kTH1F, {{1000, 0.f, 100.f}}}); - registry.add("hCentFV0A", "hCentFV0A", {HistType::kTH1F, {{1000, 0.f, 100.f}}}); + registry.add("hCentNGlobals", "hCentNGlobals", {HistType::kTH1F, {{1000, 0.f, 100.f}}}); if (isMC) { registry.add("hCentFT0M_RecoColl_MC", "hCentFT0M_RecoColl_MC", {HistType::kTH1F, {{1000, 0.f, 100.f}}}); registry.add("hCentFT0M_RecoColl_MC_INELgt0", "hCentFT0M_RecoColl_MC_INELgt0", {HistType::kTH1F, {{1000, 0.f, 100.f}}}); @@ -110,6 +110,8 @@ struct LfV0qaanalysis { registry.add("Generated_MCGenRecoColl_INEL_K0Short", "Generated_MCGenRecoColl_INEL_K0Short", {HistType::kTH2F, {{250, 0.f, 25.f}, {1000, 0.f, 100.f}}}); registry.add("Generated_MCGenRecoColl_INEL_Lambda", "Generated_MCGenRecoColl_INEL_Lambda", {HistType::kTH2F, {{250, 0.f, 25.f}, {1000, 0.f, 100.f}}}); registry.add("Generated_MCGenRecoColl_INEL_AntiLambda", "Generated_MCGenRecoColl_INEL_AntiLambda", {HistType::kTH2F, {{250, 0.f, 25.f}, {1000, 0.f, 100.f}}}); + registry.add("Generated_MCGenRecoColl_INEL_XiMinus", "Generated_MCGenRecoColl_INEL_XiMinus", {HistType::kTH2F, {{250, 0.f, 25.f}, {1000, 0.f, 100.f}}}); + registry.add("Generated_MCGenRecoColl_INEL_XiPlus", "Generated_MCGenRecoColl_INEL_XiPlus", {HistType::kTH2F, {{250, 0.f, 25.f}, {1000, 0.f, 100.f}}}); registry.add("Generated_MCRecoColl_INEL_K0Short", "Generated_MCRecoColl_INEL_K0Short", {HistType::kTH2F, {{250, 0.f, 25.f}, {1000, 0.f, 100.f}}}); registry.add("Generated_MCRecoColl_INEL_Lambda", "Generated_MCRecoColl_INEL_Lambda", {HistType::kTH2F, {{250, 0.f, 25.f}, {1000, 0.f, 100.f}}}); registry.add("Generated_MCRecoColl_INEL_AntiLambda", "Generated_MCRecoColl_INEL_AntiLambda", {HistType::kTH2F, {{250, 0.f, 25.f}, {1000, 0.f, 100.f}}}); @@ -122,6 +124,8 @@ struct LfV0qaanalysis { registry.add("Generated_MCGenRecoColl_INELgt0_K0Short", "Generated_MCGenRecoColl_INELgt0_K0Short", {HistType::kTH2F, {{250, 0.f, 25.f}, {1000, 0.f, 100.f}}}); registry.add("Generated_MCGenRecoColl_INELgt0_Lambda", "Generated_MCGenRecoColl_INELgt0_Lambda", {HistType::kTH2F, {{250, 0.f, 25.f}, {1000, 0.f, 100.f}}}); registry.add("Generated_MCGenRecoColl_INELgt0_AntiLambda", "Generated_MCGenRecoColl_INELgt0_AntiLambda", {HistType::kTH2F, {{250, 0.f, 25.f}, {1000, 0.f, 100.f}}}); + registry.add("Generated_MCGenRecoColl_INELgt0_XiMinus", "Generated_MCGenRecoColl_INELgt0_XiMinus", {HistType::kTH2F, {{250, 0.f, 25.f}, {1000, 0.f, 100.f}}}); + registry.add("Generated_MCGenRecoColl_INELgt0_XiPlus", "Generated_MCGenRecoColl_INELgt0_XiPlus", {HistType::kTH2F, {{250, 0.f, 25.f}, {1000, 0.f, 100.f}}}); registry.add("Generated_MCRecoColl_INELgt0_K0Short", "Generated_MCRecoColl_INELgt0_K0Short", {HistType::kTH2F, {{250, 0.f, 25.f}, {1000, 0.f, 100.f}}}); registry.add("Generated_MCRecoColl_INELgt0_Lambda", "Generated_MCRecoColl_INELgt0_Lambda", {HistType::kTH2F, {{250, 0.f, 25.f}, {1000, 0.f, 100.f}}}); registry.add("Generated_MCRecoColl_INELgt0_AntiLambda", "Generated_MCRecoColl_INELgt0_AntiLambda", {HistType::kTH2F, {{250, 0.f, 25.f}, {1000, 0.f, 100.f}}}); @@ -169,7 +173,7 @@ struct LfV0qaanalysis { return false; } registry.fill(HIST("hNEvents"), 2.5); - if (TMath::Abs(collision.posZ()) > cutzvertex) { + if (std::abs(collision.posZ()) > cutzvertex) { return false; } registry.fill(HIST("hNEvents"), 3.5); @@ -207,7 +211,7 @@ struct LfV0qaanalysis { } registry.fill(HIST("hNEvents"), 8.5); registry.fill(HIST("hCentFT0M"), collision.centFT0M()); - registry.fill(HIST("hCentFV0A"), collision.centFV0A()); + registry.fill(HIST("hCentNGlobals"), collision.centNGlobal()); for (auto& v0 : V0s) { // loop over V0s @@ -230,6 +234,9 @@ struct LfV0qaanalysis { } int lPDG = 0; + float ptMotherMC = 0.; + float pdgMotherMC = 0.; + float yMC = 0.; bool isPhysicalPrimary = isMC; bool isDauK0Short = false, isDauLambda = false, isDauAntiLambda = false; @@ -239,27 +246,26 @@ struct LfV0qaanalysis { if (v0.v0radius() > v0radius && v0.v0cosPA() > v0cospa && - TMath::Abs(v0.posTrack_as().eta()) < etadau && - TMath::Abs(v0.negTrack_as().eta()) < etadau) { + std::abs(v0.posTrack_as().eta()) < etadau && + std::abs(v0.negTrack_as().eta()) < etadau) { // Fill table - myv0s(v0.pt(), v0.yLambda(), v0.yK0Short(), + myv0s(v0.pt(), ptMotherMC, yMC, v0.yLambda(), v0.yK0Short(), v0.mLambda(), v0.mAntiLambda(), v0.mK0Short(), v0.v0radius(), v0.v0cosPA(), v0.dcapostopv(), v0.dcanegtopv(), v0.dcaV0daughters(), v0.posTrack_as().eta(), v0.negTrack_as().eta(), - v0.posTrack_as().phi(), v0.negTrack_as().phi(), posITSNhits, negITSNhits, ctauLambda, ctauAntiLambda, ctauK0s, v0.negTrack_as().tpcNSigmaPr(), v0.posTrack_as().tpcNSigmaPr(), v0.negTrack_as().tpcNSigmaPi(), v0.posTrack_as().tpcNSigmaPi(), v0.negTrack_as().tofNSigmaPr(), v0.posTrack_as().tofNSigmaPr(), v0.negTrack_as().tofNSigmaPi(), v0.posTrack_as().tofNSigmaPi(), - v0.posTrack_as().hasTOF(), v0.negTrack_as().hasTOF(), lPDG, isDauK0Short, isDauLambda, isDauAntiLambda, isPhysicalPrimary, - collision.centFT0M(), collision.centFV0A(), evFlag, v0.alpha(), v0.qtarm(), - v0.posTrack_as().tpcNClsCrossedRows(), v0.posTrack_as().tpcCrossedRowsOverFindableCls(), + v0.posTrack_as().hasTOF(), v0.negTrack_as().hasTOF(), lPDG, pdgMotherMC, isDauK0Short, isDauLambda, isDauAntiLambda, isPhysicalPrimary, + collision.centFT0M(), collision.centNGlobal(), evFlag, v0.alpha(), v0.qtarm(), + v0.posTrack_as().tpcNClsCrossedRows(), v0.posTrack_as().tpcNClsShared(), v0.posTrack_as().itsChi2NCl(), v0.posTrack_as().tpcChi2NCl(), - v0.negTrack_as().tpcNClsCrossedRows(), v0.negTrack_as().tpcCrossedRowsOverFindableCls(), + v0.negTrack_as().tpcNClsCrossedRows(), v0.negTrack_as().tpcNClsShared(), v0.negTrack_as().itsChi2NCl(), v0.negTrack_as().tpcChi2NCl()); } @@ -344,7 +350,7 @@ struct LfV0qaanalysis { int lPDG = 0; bool isDauK0Short = false, isDauLambda = false, isDauAntiLambda = false; bool isprimary = false; - if (TMath::Abs(v0mcparticle.pdgCode()) == 310 || TMath::Abs(v0mcparticle.pdgCode()) == 3122) { + if (std::abs(v0mcparticle.pdgCode()) == 310 || std::abs(v0mcparticle.pdgCode()) == 3122) { lPDG = v0mcparticle.pdgCode(); isprimary = v0mcparticle.isPhysicalPrimary(); } @@ -362,6 +368,18 @@ struct LfV0qaanalysis { } } + float ptMotherMC = 0.; + float pdgMother = 0.; + + if (std::abs(v0mcparticle.pdgCode()) == 3122 && v0mcparticle.has_mothers()) { + for (auto& mcparticleMother0 : v0mcparticle.mothers_as()) { + if (std::abs(mcparticleMother0.pdgCode()) == 3312 || std::abs(mcparticleMother0.pdgCode()) == 3322) { + ptMotherMC = mcparticleMother0.pt(); + pdgMother = mcparticleMother0.pdgCode(); + } + } + } + const int posITSNhits = v0.posTrack_as().itsNCls(); const int negITSNhits = v0.negTrack_as().itsNCls(); @@ -371,28 +389,27 @@ struct LfV0qaanalysis { if (v0.v0radius() > v0radius && v0.v0cosPA() > v0cospa && - TMath::Abs(v0.posTrack_as().eta()) < etadau && - TMath::Abs(v0.negTrack_as().eta()) < etadau // && + std::abs(v0.posTrack_as().eta()) < etadau && + std::abs(v0.negTrack_as().eta()) < etadau // && ) { // Fill table - myv0s(v0.pt(), v0.yLambda(), v0.yK0Short(), + myv0s(v0.pt(), ptMotherMC, v0mcparticle.y(), v0.yLambda(), v0.yK0Short(), v0.mLambda(), v0.mAntiLambda(), v0.mK0Short(), v0.v0radius(), v0.v0cosPA(), v0.dcapostopv(), v0.dcanegtopv(), v0.dcaV0daughters(), v0.posTrack_as().eta(), v0.negTrack_as().eta(), - v0.posTrack_as().phi(), v0.negTrack_as().phi(), posITSNhits, negITSNhits, ctauLambda, ctauAntiLambda, ctauK0s, v0.negTrack_as().tpcNSigmaPr(), v0.posTrack_as().tpcNSigmaPr(), v0.negTrack_as().tpcNSigmaPi(), v0.posTrack_as().tpcNSigmaPi(), v0.negTrack_as().tofNSigmaPr(), v0.posTrack_as().tofNSigmaPr(), v0.negTrack_as().tofNSigmaPi(), v0.posTrack_as().tofNSigmaPi(), - v0.posTrack_as().hasTOF(), v0.negTrack_as().hasTOF(), lPDG, isDauK0Short, isDauLambda, isDauAntiLambda, isprimary, + v0.posTrack_as().hasTOF(), v0.negTrack_as().hasTOF(), lPDG, pdgMother, isDauK0Short, isDauLambda, isDauAntiLambda, isprimary, mcCollision.centFT0M(), cent, evFlag, v0.alpha(), v0.qtarm(), - v0.posTrack_as().tpcNClsCrossedRows(), v0.posTrack_as().tpcCrossedRowsOverFindableCls(), + v0.posTrack_as().tpcNClsCrossedRows(), v0.posTrack_as().tpcNClsShared(), v0.posTrack_as().itsChi2NCl(), v0.posTrack_as().tpcChi2NCl(), - v0.negTrack_as().tpcNClsCrossedRows(), v0.negTrack_as().tpcCrossedRowsOverFindableCls(), + v0.negTrack_as().tpcNClsCrossedRows(), v0.negTrack_as().tpcNClsShared(), v0.negTrack_as().itsChi2NCl(), v0.negTrack_as().tpcChi2NCl()); } @@ -443,7 +460,7 @@ struct LfV0qaanalysis { registry.fill(HIST("hNEventsMCGen"), 0.5); - if (TMath::Abs(mcCollision.posZ()) > MCcutzvertex) { + if (std::abs(mcCollision.posZ()) > MCcutzvertex) { return; } registry.fill(HIST("hNEventsMCGen"), 1.5); @@ -599,6 +616,18 @@ struct LfV0qaanalysis { registry.fill(HIST("Generated_MCGenRecoColl_INELgt0_AntiLambda"), mcParticle.pt(), mcCollision.centFT0M()); // AntiLambda } } + if (mcParticle.pdgCode() == 3312) { + registry.fill(HIST("Generated_MCGenRecoColl_INEL_XiMinus"), mcParticle.pt(), mcCollision.centFT0M()); // XiMinus + if (recoCollIndex_INELgt0 > 0) { + registry.fill(HIST("Generated_MCGenRecoColl_INELgt0_XiMinus"), mcParticle.pt(), mcCollision.centFT0M()); // XiMinus + } + } + if (mcParticle.pdgCode() == -3312) { + registry.fill(HIST("Generated_MCGenRecoColl_INEL_XiPlus"), mcParticle.pt(), mcCollision.centFT0M()); // XiPlus + if (recoCollIndex_INELgt0 > 0) { + registry.fill(HIST("Generated_MCGenRecoColl_INELgt0_XiPlus"), mcParticle.pt(), mcCollision.centFT0M()); // XiPlus + } + } } } PROCESS_SWITCH(LfV0qaanalysis, processMCGen, "Process MC", false); diff --git a/PWGLF/Tasks/Strangeness/v0postprocessing.cxx b/PWGLF/Tasks/Strangeness/v0postprocessing.cxx index f1b5ab3975e..4f6ab094f46 100644 --- a/PWGLF/Tasks/Strangeness/v0postprocessing.cxx +++ b/PWGLF/Tasks/Strangeness/v0postprocessing.cxx @@ -26,12 +26,10 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; -using DauTracks = soa::Join; - struct v0postprocessing { Configurable radius{"radius", 0.5, "Radius"}; - Configurable maxradius{"maxradius", 1000, "Radius"}; + Configurable maxradius{"maxradius", 100000, "Radius"}; Configurable dcanegtopv{"dcanegtopv", 0.05, "DCA Neg To PV"}; Configurable dcapostopv{"dcapostopv", 0.05, "DCA Pos To PV"}; Configurable cospaK0s{"cospaK0s", 0.97, "K0s CosPA"}; @@ -43,30 +41,74 @@ struct v0postprocessing { Configurable v0rejK0s{"v0rejK0s", 0.005, "V0 rej K0s"}; Configurable v0rejLambda{"v0rejLambda", 0.01, "V0 rej K0s"}; Configurable ntpcsigma{"ntpcsigma", 5, "N sigma TPC"}; - Configurable ntpcsigmaMC{"ntpcsigmaMC", 100, "N sigma TPC for MC"}; Configurable etadau{"etadau", 0.8, "Eta Daughters"}; Configurable minITShits{"minITShits", 2, "min ITS hits"}; Configurable min_TPC_nClusters{"min_TPC_nClusters", 80, "min_TPC_nClusters"}; - Configurable min_TPC_nCrossedRowsOverFindableCls{"min_TPC_nCrossedRowsOverFindableCls", 0.8, "min_TPC_nCrossedRowsOverFindableCls"}; - Configurable max_tpcSharedCls{"max_tpcSharedCls", 0.4, "max_tpcSharedCls"}; + Configurable max_tpcSharedCls{"max_tpcSharedCls", 100, "max_tpcSharedCls"}; Configurable max_chi2_ITS{"max_chi2_ITS", 36, "max_chi2_ITS"}; Configurable max_chi2_TPC{"max_chi2_TPC", 4, "max_chi2_TPC"}; Configurable isMC{"isMC", 1, "isMC"}; Configurable evSel{"evSel", 1, "evSel"}; Configurable hasTOF2Leg{"hasTOF2Leg", 0, "hasTOF2Leg"}; - Configurable hasTOF1Leg{"hasTOF1Leg", 1, "hasTOF1Leg"}; + Configurable hasTOF1Leg{"hasTOF1Leg", 0, "hasTOF1Leg"}; Configurable paramArmenterosCut{"paramArmenterosCut", 0.2, "parameter Armenteros Cut"}; Configurable doArmenterosCut{"doArmenterosCut", 1, "do Armenteros Cut"}; + Configurable doQA{"doQA", 1, "fill QA histograms"}; HistogramRegistry registry{"registry"}; void init(InitContext const&) { + registry.add("hV0Cuts", ";Sel", {HistType::kTH1D, {{22, 0., 22.}}}); + registry.get(HIST("hV0Cuts"))->GetXaxis()->SetBinLabel(1, "all"); + registry.get(HIST("hV0Cuts"))->GetXaxis()->SetBinLabel(2, "Event selection"); + registry.get(HIST("hV0Cuts"))->GetXaxis()->SetBinLabel(3, "Radius"); + registry.get(HIST("hV0Cuts"))->GetXaxis()->SetBinLabel(4, "Eta Daughters"); + registry.get(HIST("hV0Cuts"))->GetXaxis()->SetBinLabel(5, "Dau DCA to PV"); + registry.get(HIST("hV0Cuts"))->GetXaxis()->SetBinLabel(6, "DCA Daughters"); + registry.get(HIST("hV0Cuts"))->GetXaxis()->SetBinLabel(7, "min ITS hits"); + registry.get(HIST("hV0Cuts"))->GetXaxis()->SetBinLabel(8, "has TOF 1 Leg"); + registry.get(HIST("hV0Cuts"))->GetXaxis()->SetBinLabel(9, "has TOF 2 Legs"); + registry.get(HIST("hV0Cuts"))->GetXaxis()->SetBinLabel(10, "TPC NCl"); + registry.get(HIST("hV0Cuts"))->GetXaxis()->SetBinLabel(11, "TPC Cls Shared"); + registry.get(HIST("hV0Cuts"))->GetXaxis()->SetBinLabel(12, "ITS Chi2"); + registry.get(HIST("hV0Cuts"))->GetXaxis()->SetBinLabel(13, "TPC Chi2"); + registry.get(HIST("hV0Cuts"))->GetXaxis()->SetBinLabel(14, "cosPA K0s"); + registry.get(HIST("hV0Cuts"))->GetXaxis()->SetBinLabel(15, "cosPA Lambda"); + registry.get(HIST("hV0Cuts"))->GetXaxis()->SetBinLabel(16, "rapidity"); + registry.get(HIST("hV0Cuts"))->GetXaxis()->SetBinLabel(17, "ctau K0s"); + registry.get(HIST("hV0Cuts"))->GetXaxis()->SetBinLabel(18, "ctau Lambda"); + registry.get(HIST("hV0Cuts"))->GetXaxis()->SetBinLabel(19, "v0 rej K0s"); + registry.get(HIST("hV0Cuts"))->GetXaxis()->SetBinLabel(20, "v0 rej Lambda"); + registry.get(HIST("hV0Cuts"))->GetXaxis()->SetBinLabel(21, "TPC nsigma Dau"); + registry.get(HIST("hV0Cuts"))->GetXaxis()->SetBinLabel(22, "Armenteros-Podolansky"); + + registry.get(HIST("hV0Cuts"))->SetBinContent(1, 1); + registry.get(HIST("hV0Cuts"))->SetBinContent(2, evSel); + registry.get(HIST("hV0Cuts"))->SetBinContent(3, radius); + registry.get(HIST("hV0Cuts"))->SetBinContent(4, etadau); + registry.get(HIST("hV0Cuts"))->SetBinContent(5, dcanegtopv); + registry.get(HIST("hV0Cuts"))->SetBinContent(6, dcav0dau); + registry.get(HIST("hV0Cuts"))->SetBinContent(7, minITShits); + registry.get(HIST("hV0Cuts"))->SetBinContent(8, hasTOF1Leg); + registry.get(HIST("hV0Cuts"))->SetBinContent(9, hasTOF2Leg); + registry.get(HIST("hV0Cuts"))->SetBinContent(10, min_TPC_nClusters); + registry.get(HIST("hV0Cuts"))->SetBinContent(11, max_tpcSharedCls); + registry.get(HIST("hV0Cuts"))->SetBinContent(12, max_chi2_ITS); + registry.get(HIST("hV0Cuts"))->SetBinContent(13, max_chi2_TPC); + registry.get(HIST("hV0Cuts"))->SetBinContent(14, cospaK0s); + registry.get(HIST("hV0Cuts"))->SetBinContent(15, cospaLambda); + registry.get(HIST("hV0Cuts"))->SetBinContent(16, rap); + registry.get(HIST("hV0Cuts"))->SetBinContent(17, ctauK0s); + registry.get(HIST("hV0Cuts"))->SetBinContent(18, ctauLambda); + registry.get(HIST("hV0Cuts"))->SetBinContent(19, v0rejK0s); + registry.get(HIST("hV0Cuts"))->SetBinContent(20, v0rejLambda); + registry.get(HIST("hV0Cuts"))->SetBinContent(21, ntpcsigma); + registry.get(HIST("hV0Cuts"))->SetBinContent(22, paramArmenterosCut * doArmenterosCut); registry.add("hMassK0Short", ";M_{#pi^{+}#pi^{-}} [GeV/c^{2}]", {HistType::kTH1F, {{200, 0.4f, 0.6f}}}); registry.add("hMassVsPtK0Short", ";p_{T} [GeV/c];M_{#pi^{+}#pi^{-}} [GeV/c^{2}]", {HistType::kTH2F, {{250, 0.0f, 25.0f}, {200, 0.4f, 0.6f}}}); registry.add("hMassVsPtK0ShortVsCentFT0M", ";p_{T} [GeV/c]; CentFT0M; M_{#pi^{+}#pi^{-}} [GeV/c^{2}]", {HistType::kTH3F, {{250, 0.0f, 25.0f}, {100, 0.f, 100.f}, {200, 0.4f, 0.6f}}}); - registry.add("hMassVsPtK0ShortVsCentFV0A", ";p_{T} [GeV/c]; CentFT0M; M_{#pi^{+}#pi^{-}} [GeV/c^{2}]", {HistType::kTH3F, {{250, 0.0f, 25.0f}, {100, 0.f, 100.f}, {200, 0.4f, 0.6f}}}); registry.add("hMassLambda", "hMassLambda", {HistType::kTH1F, {{200, 1.016f, 1.216f}}}); registry.add("hMassVsPtLambda", "hMassVsPtLambda", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {200, 1.016f, 1.216f}}}); registry.add("hMassVsPtLambdaVsCentFT0M", ";p_{T} [GeV/c]; CentFT0M; M_{#pi^{+}#pi^{-}} [GeV/c^{2}]", {HistType::kTH3F, {{250, 0.0f, 25.0f}, {100, 0.f, 100.f}, {200, 1.016f, 1.216f}}}); @@ -76,276 +118,402 @@ struct v0postprocessing { if (isMC) { registry.add("hMassK0Short_MC", ";M_{#pi^{+}#pi^{-}} [GeV/c^{2}]", {HistType::kTH1F, {{200, 0.4f, 0.6f}}}); - registry.add("hMassVsPtK0Short_MC", ";p_{T} [GeV/c];M_{#pi^{+}#pi^{-}} [GeV/c^{2}]", {HistType::kTH3F, {{250, 0.0f, 25.0f}, {100, 0.f, 100.f}, {200, 0.4f, 0.6f}}}); + registry.add("hMassVsPtK0ShortVsCentFT0M_MC", ";p_{T} [GeV/c];M_{#pi^{+}#pi^{-}} [GeV/c^{2}]", {HistType::kTH3F, {{250, 0.0f, 25.0f}, {100, 0.f, 100.f}, {200, 0.4f, 0.6f}}}); registry.add("hMassLambda_MC", "hMassLambda", {HistType::kTH1F, {{200, 1.016f, 1.216f}}}); - registry.add("hMassVsPtLambda_MC", ";p_{T} [GeV/c];M_{p^{+}#pi^{-}} [GeV/c^{2}]", {HistType::kTH3F, {{250, 0.0f, 25.0f}, {100, 0.f, 100.f}, {200, 1.016f, 1.216f}}}); + registry.add("hMassVsPtLambdaVsCentFT0M_MC", ";p_{T} [GeV/c];M_{p^{+}#pi^{-}} [GeV/c^{2}]", {HistType::kTH3F, {{250, 0.0f, 25.0f}, {100, 0.f, 100.f}, {200, 1.016f, 1.216f}}}); registry.add("hMassAntiLambda_MC", "hMassAntiLambda", {HistType::kTH1F, {{200, 1.016f, 1.216f}}}); - registry.add("hMassVsPtAntiLambda_MC", ";p_{T} [GeV/c];M_{p^{-}#pi^{+}} [GeV/c^{2}]", {HistType::kTH3F, {{250, 0.0f, 25.0f}, {100, 0.f, 100.f}, {200, 1.016f, 1.216f}}}); + registry.add("hMassVsPtLambdaVsMotherPt_DoubleCharged_MC", ";p_{T} [GeV/c] (V0);p_{T}^{gen} [GeV/c] (Xi);M_{p^{-}#pi^{+}} [GeV/c^{2}]", {HistType::kTH3F, {{250, 0.0f, 25.0f}, {250, 0.0f, 25.0f}, {200, 1.016f, 1.216f}}}); + registry.add("hMassVsPtLambdaVsMotherPt_MCRatio_MC", ";p_{T} [GeV/c] (V0);p_{T}^{gen} [GeV/c] (Xi);M_{p^{-}#pi^{+}} [GeV/c^{2}]", {HistType::kTH3F, {{250, 0.0f, 25.0f}, {250, 0.0f, 25.0f}, {200, 1.016f, 1.216f}}}); + registry.add("hMassVsPtAntiLambdaVsCentFT0M_MC", ";p_{T} [GeV/c];M_{p^{-}#pi^{+}} [GeV/c^{2}]", {HistType::kTH3F, {{250, 0.0f, 25.0f}, {100, 0.f, 100.f}, {200, 1.016f, 1.216f}}}); + registry.add("hMassVsPtAntiLambdaVsMotherPt_DoubleCharged_MC", ";p_{T} [GeV/c] (V0);p_{T}^{gen} [GeV/c] (Xi);M_{p^{-}#pi^{+}} [GeV/c^{2}]", {HistType::kTH3F, {{250, 0.0f, 25.0f}, {250, 0.0f, 25.0f}, {200, 1.016f, 1.216f}}}); + registry.add("hMassVsPtAntiLambdaVsMotherPt_MCRatio_MC", ";p_{T} [GeV/c] (V0);p_{T}^{gen} [GeV/c] (Xi);M_{p^{-}#pi^{+}} [GeV/c^{2}]", {HistType::kTH3F, {{250, 0.0f, 25.0f}, {250, 0.0f, 25.0f}, {200, 1.016f, 1.216f}}}); } - // QA - registry.add("hArmenterosPodolanski", "hArmenterosPodolanski", {HistType::kTH2F, {{1000, -1.0f, 1.0f, "#alpha"}, {1000, 0.0f, 0.30f, "#it{Q}_{T}"}}}); - registry.add("hArmenterosPodolanski_Sel", "hArmenterosPodolanski_Sel", {HistType::kTH2F, {{1000, -1.0f, 1.0f, "#alpha"}, {1000, 0.0f, 0.30f, "#it{Q}_{T}"}}}); - registry.add("hK0sV0Radius", "hK0sV0Radius", {HistType::kTH1D, {{200, 0.0f, 40.0f}}}); - registry.add("hK0sCosPA", "hK0sCosPA", {HistType::kTH1F, {{100, 0.9f, 1.0f}}}); - registry.add("hK0sV0DCANegToPV", "hK0sV0DCANegToPV", {HistType::kTH1F, {{200, -1.0f, 1.0f}}}); - registry.add("hK0sV0DCAPosToPV", "hK0sV0DCAPosToPV", {HistType::kTH1F, {{200, -1.0f, 1.0f}}}); - registry.add("hK0sV0DCAV0Daughters", "hK0sV0DCAV0Daughters", {HistType::kTH1F, {{55, 0.0f, 2.20f}}}); - registry.add("hK0sCtau", "hK0sCtau", {HistType::kTH1F, {{100, 0.0f, 50.0f}}}); - registry.add("hK0sEtaDau", "hK0sEtaDau", {HistType::kTH1F, {{100, -1.0f, 1.0f}}}); - registry.add("hK0sRap", "hK0sRap", {HistType::kTH1F, {{100, -1.0f, 1.0f}}}); - registry.add("hK0sTPCNSigmaPosPi", "hK0sTPCNSigmaPosPi", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); - registry.add("hK0sTPCNSigmaNegPi", "hK0sTPCNSigmaNegPi", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); - - registry.add("hLambdaV0Radius", "hLambdaV0Radius", {HistType::kTH1D, {{200, 0.0f, 40.0f}}}); - registry.add("hLambdaCosPA", "hLambdaCosPA", {HistType::kTH1F, {{100, 0.9f, 1.0f}}}); - registry.add("hLambdaV0DCANegToPV", "hLambdaV0DCANegToPV", {HistType::kTH1F, {{200, -1.0f, 1.0f}}}); - registry.add("hLambdaV0DCAPosToPV", "hLambdaV0DCAPosToPV", {HistType::kTH1F, {{200, -1.0f, 1.0f}}}); - registry.add("hLambdaV0DCAV0Daughters", "hLambdaV0DCAV0Daughters", {HistType::kTH1F, {{55, 0.0f, 2.20f}}}); - registry.add("hLambdaCtau", "hLambdaCtau", {HistType::kTH1F, {{100, 0.0f, 50.0f}}}); - registry.add("hLambdaEtaDau", "hLambdaEtaDau", {HistType::kTH1F, {{100, -1.0f, 1.0f}}}); - registry.add("hLambdaRap", "hLambdaRap", {HistType::kTH1F, {{100, -1.0f, 1.0f}}}); - registry.add("hLambdaTPCNSigmaNegPi", "hLambdaTPCNSigmaNegPi", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); - registry.add("hLambdaTPCNSigmaPosPr", "hLambdaTPCNSigmaPosPr", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); - - registry.add("hAntiLambdaV0Radius", "hAntiLambdaV0Radius", {HistType::kTH1D, {{200, 0.0f, 40.0f}}}); - registry.add("hAntiLambdaCosPA", "hAntiLambdaCosPA", {HistType::kTH1F, {{100, 0.9f, 1.0f}}}); - registry.add("hAntiLambdaV0DCANegToPV", "hAntiLambdaV0DCANegToPV", {HistType::kTH1F, {{200, -1.0f, 1.0f}}}); - registry.add("hAntiLambdaV0DCAPosToPV", "hAntiLambdaV0DCAPosToPV", {HistType::kTH1F, {{200, -1.0f, 1.0f}}}); - registry.add("hAntiLambdaV0DCAV0Daughters", "hAntiLambdaV0DCAV0Daughters", {HistType::kTH1F, {{55, 0.0f, 2.20f}}}); - registry.add("hAntiLambdaCtau", "hAntiLambdaCtau", {HistType::kTH1F, {{100, 0.0f, 50.0f}}}); - registry.add("hAntiLambdaEtaDau", "hAntiLambdaEtaDau", {HistType::kTH1F, {{100, -1.0f, 1.0f}}}); - registry.add("hAntiLambdaRap", "hAntiLambdaRap", {HistType::kTH1F, {{100, -1.0f, 1.0f}}}); - registry.add("hAntiLambdaTPCNSigmaPosPi", "hAntiLambdaTPCNSigmaPosPi", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); - registry.add("hAntiLambdaTPCNSigmaNegPr", "hAntiLambdaTPCNSigmaNegPr", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); - - /*registry.add("TPCNSigmaPosPr", "TPCNSigmaPosPr", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); - registry.add("TPCNSigmaNegPr", "TPCNSigmaNegPr", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); - registry.add("TOFNSigmaPosPi", "TOFNSigmaPosPi", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); - registry.add("TOFNSigmaNegPi", "TOFNSigmaNegPi", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); - registry.add("TOFNSigmaPosPr", "TOFNSigmaPosPr", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); - registry.add("TOFNSigmaNegPr", "TOFNSigmaNegPr", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); */ + if (doQA) { + registry.add("QA/hK0sSelection", ";Sel", {HistType::kTH1D, {{22, 0., 22.}}}); + registry.get(HIST("QA/hK0sSelection"))->GetXaxis()->SetBinLabel(1, "all"); + registry.get(HIST("QA/hK0sSelection"))->GetXaxis()->SetBinLabel(2, "Event selection"); + registry.get(HIST("QA/hK0sSelection"))->GetXaxis()->SetBinLabel(3, "Radius"); + registry.get(HIST("QA/hK0sSelection"))->GetXaxis()->SetBinLabel(4, "Eta Daughters"); + registry.get(HIST("QA/hK0sSelection"))->GetXaxis()->SetBinLabel(5, "Dau DCA to PV"); + registry.get(HIST("QA/hK0sSelection"))->GetXaxis()->SetBinLabel(6, "DCA Daughters"); + registry.get(HIST("QA/hK0sSelection"))->GetXaxis()->SetBinLabel(7, "min ITS hits"); + registry.get(HIST("QA/hK0sSelection"))->GetXaxis()->SetBinLabel(8, "has TOF 1 Leg"); + registry.get(HIST("QA/hK0sSelection"))->GetXaxis()->SetBinLabel(9, "has TOF 2 Legs"); + registry.get(HIST("QA/hK0sSelection"))->GetXaxis()->SetBinLabel(10, "TPC NCl"); + registry.get(HIST("QA/hK0sSelection"))->GetXaxis()->SetBinLabel(11, "TPC Cls Shared"); + registry.get(HIST("QA/hK0sSelection"))->GetXaxis()->SetBinLabel(12, "ITS Chi2"); + registry.get(HIST("QA/hK0sSelection"))->GetXaxis()->SetBinLabel(13, "TPC Chi2"); + registry.get(HIST("QA/hK0sSelection"))->GetXaxis()->SetBinLabel(14, "cosPA"); + registry.get(HIST("QA/hK0sSelection"))->GetXaxis()->SetBinLabel(15, "rapidity"); + registry.get(HIST("QA/hK0sSelection"))->GetXaxis()->SetBinLabel(16, "ctau"); + registry.get(HIST("QA/hK0sSelection"))->GetXaxis()->SetBinLabel(17, "v0 rej"); + registry.get(HIST("QA/hK0sSelection"))->GetXaxis()->SetBinLabel(18, "TPC nsigma Neg Dau"); + registry.get(HIST("QA/hK0sSelection"))->GetXaxis()->SetBinLabel(19, "TPC nsigma Pos Dau"); + registry.get(HIST("QA/hK0sSelection"))->GetXaxis()->SetBinLabel(20, "Armenteros-Podolansky"); + + // common + registry.add("QA/hV0_EvFlag", "hV0_EvFlag", {HistType::kTH1D, {{2, 0.0f, 2.0f}}}); + registry.add("QA/hV0_Radius", "hV0_Radius", {HistType::kTH1D, {{1000, 0.0f, 100.0f}}}); + registry.add("QA/hV0_DCADauToPV", "hV0_DCADauToPV", {HistType::kTH1F, {{200, -1.0f, 1.0f}}}); + registry.add("QA/hV0_DCADaughters", "hV0_DCADaughters", {HistType::kTH1F, {{200, 0.0f, 2.0f}}}); + registry.add("QA/hV0_EtaDau", "hV0_EtaDau", {HistType::kTH1F, {{100, -1.0f, 1.0f}}}); + registry.add("QA/hV0_ITShits", "hV0_ITShits", {HistType::kTH1F, {{10, .0f, 10.0f}}}); + registry.add("QA/hV0_TPCNCls", "hV0_TPCNCls", {HistType::kTH1F, {{200, .0f, 200.0f}}}); + registry.add("QA/hV0_TPCNClsShared", "hV0_TPCNClsShared", {HistType::kTH1F, {{150, .0f, 1.5f}}}); + registry.add("QA/hV0_ITSChi2", "hV0_ITSChi2", {HistType::kTH1F, {{10, .0f, 10.0f}}}); + registry.add("QA/hV0_TPCChi2", "hV0_TPCChi2", {HistType::kTH1F, {{100, .0f, 100.0f}}}); + // K0s + registry.add("QA/hK0s_ArmenterosPodolanski", "QA/hK0s_ArmenterosPodolanski", {HistType::kTH2F, {{1000, -1.0f, 1.0f, "#alpha"}, {1000, 0.0f, 0.30f, "#it{Q}_{T}"}}}); + registry.add("QA/hK0s_Rap", "hK0s_Rap", {HistType::kTH1F, {{100, -1.0f, 1.0f}}}); + registry.add("QA/hK0s_CosPA", "hK0s_CosPA", {HistType::kTH1F, {{100, 0.95f, 1.0f}}}); + registry.add("QA/hK0s_Ctau", "hK0s_Ctau", {HistType::kTH1F, {{100, 0.0f, 50.0f}}}); + registry.add("QA/hK0s_TPCNSigmaPosPi", "hK0s_TPCNSigmaPosPi", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); + registry.add("QA/hK0s_TPCNSigmaNegPi", "hK0s_TPCNSigmaNegPi", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); + // Lambda + registry.add("QA/hLambda_ArmenterosPodolanski", "QA/hLambda_ArmenterosPodolanski", {HistType::kTH2F, {{1000, -1.0f, 1.0f, "#alpha"}, {1000, 0.0f, 0.30f, "#it{Q}_{T}"}}}); + registry.add("QA/hLambda_Rap", "hLambda_Rap", {HistType::kTH1F, {{100, -1.0f, 1.0f}}}); + registry.add("QA/hLambda_CosPA", "hLambda_CosPA", {HistType::kTH1F, {{100, 0.95f, 1.0f}}}); + registry.add("QA/hLambda_Ctau", "hLambda_Ctau", {HistType::kTH1F, {{100, 0.0f, 50.0f}}}); + registry.add("QA/hLambda_TPCNSigmaPosPi", "hLambda_TPCNSigmaPosPi", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); + registry.add("QA/hLambda_TPCNSigmaNegPi", "hLambda_TPCNSigmaNegPi", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); + // AntiLambda + registry.add("QA/hAntiLambda_ArmenterosPodolanski", "QA/hAntiLambda_ArmenterosPodolanski", {HistType::kTH2F, {{1000, -1.0f, 1.0f, "#alpha"}, {1000, 0.0f, 0.30f, "#it{Q}_{T}"}}}); + registry.add("QA/hAntiLambda_Rap", "hAntiLambda_Rap", {HistType::kTH1F, {{100, -1.0f, 1.0f}}}); + registry.add("QA/hAntiLambda_CosPA", "hAntiLambda_CosPA", {HistType::kTH1F, {{100, 0.95f, 1.0f}}}); + registry.add("QA/hAntiLambda_Ctau", "hAntiLambda_Ctau", {HistType::kTH1F, {{100, 0.0f, 50.0f}}}); + registry.add("QA/hAntiLambda_TPCNSigmaPosPi", "hAntiLambda_TPCNSigmaPosPi", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); + registry.add("QA/hAntiLambda_TPCNSigmaNegPi", "hAntiLambda_TPCNSigmaNegPi", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); + + // common + registry.add("QA/hV0_Sel_EvFlag", "hV0_Sel_EvFlag", {HistType::kTH1D, {{2, 0.0f, 2.0f}}}); + registry.add("QA/hV0_Sel_Radius", "hV0_Sel_Radius", {HistType::kTH1D, {{1000, 0.0f, 100.0f}}}); + registry.add("QA/hV0_Sel_DCADauToPV", "hV0_Sel_DCADauToPV", {HistType::kTH1F, {{200, -1.0f, 1.0f}}}); + registry.add("QA/hV0_Sel_DCADaughters", "hV0_Sel_DCADaughters", {HistType::kTH1F, {{200, 0.0f, 2.0f}}}); + registry.add("QA/hV0_Sel_EtaDau", "hV0_Sel_EtaDau", {HistType::kTH1F, {{100, -1.0f, 1.0f}}}); + registry.add("QA/hV0_Sel_ITShits", "hV0_Sel_ITShits", {HistType::kTH1F, {{10, .0f, 10.0f}}}); + registry.add("QA/hV0_Sel_TPCNCls", "hV0_Sel_TPCNCls", {HistType::kTH1F, {{200, .0f, 200.0f}}}); + registry.add("QA/hV0_Sel_TPCNClsShared", "hV0_Sel_TPCNClsShared", {HistType::kTH1F, {{150, .0f, 1.5f}}}); + registry.add("QA/hV0_Sel_ITSChi2", "hV0_Sel_ITSChi2", {HistType::kTH1F, {{10, .0f, 10.0f}}}); + registry.add("QA/hV0_Sel_TPCChi2", "hV0_Sel_TPCChi2", {HistType::kTH1F, {{100, .0f, 100.0f}}}); + // K0s + registry.add("QA/hK0s_Sel_ArmenterosPodolanski", "QA/hK0s_ArmenterosPodolanski", {HistType::kTH2F, {{1000, -1.0f, 1.0f, "#alpha"}, {1000, 0.0f, 0.30f, "#it{Q}_{T}"}}}); + registry.add("QA/hK0s_Sel_Rap", "hK0s_Sel_Rap", {HistType::kTH1F, {{100, -1.0f, 1.0f}}}); + registry.add("QA/hK0s_Sel_CosPA", "hK0s_Sel_CosPA", {HistType::kTH1F, {{100, 0.95f, 1.0f}}}); + registry.add("QA/hK0s_Sel_Ctau", "hK0s_Sel_Ctau", {HistType::kTH1F, {{100, 0.0f, 50.0f}}}); + registry.add("QA/hK0s_Sel_TPCNSigmaPosPi", "hK0s_Sel_TPCNSigmaPosPi", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); + registry.add("QA/hK0s_Sel_TPCNSigmaNegPi", "hK0s_Sel_TPCNSigmaNegPi", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); + // Lambda + registry.add("QA/hLambda_Sel_ArmenterosPodolanski", "QA/hLambda_Sel_ArmenterosPodolanski", {HistType::kTH2F, {{1000, -1.0f, 1.0f, "#alpha"}, {1000, 0.0f, 0.30f, "#it{Q}_{T}"}}}); + registry.add("QA/hLambda_Sel_Rap", "hLambda_Sel_Rap", {HistType::kTH1F, {{100, -1.0f, 1.0f}}}); + registry.add("QA/hLambda_Sel_CosPA", "hLambda_Sel_CosPA", {HistType::kTH1F, {{100, 0.95f, 1.0f}}}); + registry.add("QA/hLambda_Sel_Ctau", "hLambda_Sel_Ctau", {HistType::kTH1F, {{100, 0.0f, 50.0f}}}); + registry.add("QA/hLambda_Sel_TPCNSigmaPosPr", "hLambda_Sel_TPCNSigmaPosPr", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); + registry.add("QA/hLambda_Sel_TPCNSigmaNegPi", "hLambda_Sel_TPCNSigmaNegPi", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); + // AntiLambda + registry.add("QA/hAntiLambda_Sel_ArmenterosPodolanski", "QA/hAntiLambda_Sel_ArmenterosPodolanski", {HistType::kTH2F, {{1000, -1.0f, 1.0f, "#alpha"}, {1000, 0.0f, 0.30f, "#it{Q}_{T}"}}}); + registry.add("QA/hAntiLambda_Sel_Rap", "hAntiLambda_Sel_Rap", {HistType::kTH1F, {{100, -1.0f, 1.0f}}}); + registry.add("QA/hAntiLambda_Sel_CosPA", "hAntiLambda_Sel_CosPA", {HistType::kTH1F, {{100, 0.95f, 1.0f}}}); + registry.add("QA/hAntiLambda_Sel_Ctau", "hAntiLambda_Sel_Ctau", {HistType::kTH1F, {{100, 0.0f, 50.0f}}}); + registry.add("QA/hAntiLambda_Sel_TPCNSigmaPosPi", "hAntiLambda_Sel_TPCNSigmaPosPi", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); + registry.add("QA/hAntiLambda_Sel_TPCNSigmaNegPr", "hAntiLambda_Sel_TPCNSigmaNegPr", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}); + } + } + + // V0 selection + template + bool QAK0s(TV0Type const& candidate) + { + if (candidate.v0cospa() <= cospaK0s) + return false; + registry.fill(HIST("QA/hK0sSelection"), 13.5); + + if (candidate.rapk0short() >= rap) + return false; + registry.fill(HIST("QA/hK0sSelection"), 14.5); + + if (candidate.ctauk0short() >= ctauK0s) + return false; + registry.fill(HIST("QA/hK0sSelection"), 15.5); + + if (std::abs(candidate.masslambda() - o2::constants::physics::MassLambda0) <= v0rejK0s) + return false; + registry.fill(HIST("QA/hK0sSelection"), 16.5); + + if (std::abs(candidate.ntpcsigmanegpi()) > ntpcsigma) + return false; + registry.fill(HIST("QA/hK0sSelection"), 17.5); + + if (std::abs(candidate.ntpcsigmapospi()) > ntpcsigma) + return false; + registry.fill(HIST("QA/hK0sSelection"), 18.5); + + if (doArmenterosCut && candidate.qtarm() < (paramArmenterosCut * std::abs(candidate.alpha()))) + return false; + registry.fill(HIST("QA/hK0sSelection"), 19.5); + + return true; + } + + // V0 selection + template + bool AcceptV0(TV0Type const& candidate) + { + if (evSel && candidate.evflag() < 1) + return false; + registry.fill(HIST("QA/hK0sSelection"), 1.5); + + if (candidate.v0radius() < radius && candidate.v0radius() > maxradius) + return false; + registry.fill(HIST("QA/hK0sSelection"), 2.5); + + if (std::abs(candidate.v0poseta()) > etadau) + return false; + if (std::abs(candidate.v0negeta()) > etadau) + return false; + registry.fill(HIST("QA/hK0sSelection"), 3.5); + + if (std::abs(candidate.v0dcanegtopv()) < dcanegtopv) + return false; + if (std::abs(candidate.v0dcapostopv()) < dcapostopv) + return false; + registry.fill(HIST("QA/hK0sSelection"), 4.5); + + if (candidate.v0dcav0daughters() > dcav0dau) + return false; + registry.fill(HIST("QA/hK0sSelection"), 5.5); + + if (candidate.v0positshits() < minITShits) + return false; + if (candidate.v0negitshits() < minITShits) + return false; + registry.fill(HIST("QA/hK0sSelection"), 6.5); + + if (hasTOF1Leg && !candidate.poshastof() && !candidate.neghastof()) + return false; + registry.fill(HIST("QA/hK0sSelection"), 7.5); + + if (hasTOF2Leg && (!candidate.poshastof() || !candidate.neghastof())) + return false; + registry.fill(HIST("QA/hK0sSelection"), 8.5); + + if (candidate.v0postpcCrossedRows() < min_TPC_nClusters) + return false; + if (candidate.v0negtpcCrossedRows() < min_TPC_nClusters) + return false; + registry.fill(HIST("QA/hK0sSelection"), 9.5); + + if (candidate.v0postpcNClsShared() > max_tpcSharedCls) + return false; + if (candidate.v0negtpcNClsShared() > max_tpcSharedCls) + return false; + registry.fill(HIST("QA/hK0sSelection"), 10.5); + + if (candidate.v0positsChi2NCl() > max_chi2_ITS) + return false; + if (candidate.v0negitsChi2NCl() > max_chi2_ITS) + return false; + registry.fill(HIST("QA/hK0sSelection"), 11.5); + + if (candidate.v0postpcChi2NCl() > max_chi2_TPC) + return false; + if (candidate.v0negtpcChi2NCl() > max_chi2_TPC) + return false; + registry.fill(HIST("QA/hK0sSelection"), 12.5); + + return true; } void process(aod::MyV0Candidates const& myv0s) { for (auto& candidate : myv0s) { - // common selections - if (candidate.v0radius() < radius && candidate.v0radius() > maxradius) - continue; - if (TMath::Abs(candidate.v0poseta()) > etadau) - continue; - if (TMath::Abs(candidate.v0negeta()) > etadau) - continue; - if (candidate.v0positshits() < minITShits) - continue; - if (candidate.v0negitshits() < minITShits) - continue; - if (candidate.v0postpcCrossedRows() < min_TPC_nClusters) - continue; - if (candidate.v0negtpcCrossedRows() < min_TPC_nClusters) - continue; - if (candidate.v0postpcCRFindCls() < min_TPC_nCrossedRowsOverFindableCls) - continue; - if (candidate.v0negtpcCRFindCls() < min_TPC_nCrossedRowsOverFindableCls) - continue; - if (candidate.v0postpcNClsShared() > max_tpcSharedCls) - continue; - if (candidate.v0negtpcNClsShared() > max_tpcSharedCls) - continue; - if (candidate.v0positsChi2NCl() > max_chi2_ITS) - continue; - if (candidate.v0negitsChi2NCl() > max_chi2_ITS) - continue; - if (candidate.v0postpcChi2NCl() > max_chi2_TPC) - continue; - if (candidate.v0negtpcChi2NCl() > max_chi2_TPC) - continue; - if (TMath::Abs(candidate.v0dcanegtopv()) < dcanegtopv) - continue; - if (TMath::Abs(candidate.v0dcapostopv()) < dcapostopv) - continue; - if (candidate.v0dcav0daughters() > dcav0dau) - continue; - if (evSel && candidate.evflag() < 1) - continue; - if (hasTOF1Leg && !candidate.poshastof() && !candidate.neghastof()) - continue; - if (hasTOF2Leg && (!candidate.poshastof() || !candidate.neghastof())) + if (doQA) { + registry.fill(HIST("QA/hK0sSelection"), 0.5); + registry.fill(HIST("QA/hV0_EvFlag"), candidate.evflag()); + registry.fill(HIST("QA/hV0_Radius"), candidate.v0radius()); + registry.fill(HIST("QA/hV0_DCADauToPV"), candidate.v0dcanegtopv()); + registry.fill(HIST("QA/hV0_DCADaughters"), candidate.v0dcav0daughters()); + registry.fill(HIST("QA/hV0_EtaDau"), candidate.v0poseta()); + registry.fill(HIST("QA/hV0_EtaDau"), candidate.v0negeta()); + registry.fill(HIST("QA/hV0_ITShits"), candidate.v0negitshits()); + registry.fill(HIST("QA/hV0_TPCNCls"), candidate.v0postpcCrossedRows()); + registry.fill(HIST("QA/hV0_TPCNCls"), candidate.v0negtpcCrossedRows()); + registry.fill(HIST("QA/hV0_TPCNClsShared"), candidate.v0postpcNClsShared()); + registry.fill(HIST("QA/hV0_TPCNClsShared"), candidate.v0negtpcNClsShared()); + registry.fill(HIST("QA/hV0_ITSChi2"), candidate.v0positsChi2NCl()); + registry.fill(HIST("QA/hV0_ITSChi2"), candidate.v0negitsChi2NCl()); + registry.fill(HIST("QA/hV0_TPCChi2"), candidate.v0postpcChi2NCl()); + registry.fill(HIST("QA/hV0_TPCChi2"), candidate.v0negtpcChi2NCl()); + registry.fill(HIST("QA/hK0s_ArmenterosPodolanski"), candidate.alpha(), candidate.qtarm()); + registry.fill(HIST("QA/hK0s_CosPA"), candidate.v0cospa()); + registry.fill(HIST("QA/hK0s_Rap"), candidate.rapk0short()); + registry.fill(HIST("QA/hK0s_Ctau"), candidate.ctauk0short()); + registry.fill(HIST("QA/hK0s_TPCNSigmaPosPi"), candidate.ntpcsigmapospi()); + registry.fill(HIST("QA/hK0s_TPCNSigmaNegPi"), candidate.ntpcsigmanegpi()); + registry.fill(HIST("QA/hLambda_ArmenterosPodolanski"), candidate.alpha(), candidate.qtarm()); + registry.fill(HIST("QA/hLambda_CosPA"), candidate.v0cospa()); + registry.fill(HIST("QA/hLambda_Rap"), candidate.rapk0short()); + registry.fill(HIST("QA/hLambda_Ctau"), candidate.ctauk0short()); + registry.fill(HIST("QA/hLambda_TPCNSigmaPosPi"), candidate.ntpcsigmapospi()); + registry.fill(HIST("QA/hLambda_TPCNSigmaNegPi"), candidate.ntpcsigmanegpi()); + registry.fill(HIST("QA/hAntiLambda_ArmenterosPodolanski"), candidate.alpha(), candidate.qtarm()); + registry.fill(HIST("QA/hAntiLambda_CosPA"), candidate.v0cospa()); + registry.fill(HIST("QA/hAntiLambda_Rap"), candidate.rapk0short()); + registry.fill(HIST("QA/hAntiLambda_Ctau"), candidate.ctauk0short()); + registry.fill(HIST("QA/hAntiLambda_TPCNSigmaPosPi"), candidate.ntpcsigmapospi()); + registry.fill(HIST("QA/hAntiLambda_TPCNSigmaNegPi"), candidate.ntpcsigmanegpi()); + } + + // Apply common V0 selection + if (!AcceptV0(candidate)) { continue; + } - // K0Short analysis - if (candidate.v0cospa() > cospaK0s && - TMath::Abs(candidate.rapk0short()) < rap && - candidate.ctauk0short() < ctauK0s && - TMath::Abs(candidate.massk0short() - o2::constants::physics::MassK0Short) < 0.075 && - TMath::Abs(candidate.masslambda() - o2::constants::physics::MassLambda0) > v0rejK0s && - TMath::Abs(candidate.ntpcsigmanegpi()) <= ntpcsigma && - TMath::Abs(candidate.ntpcsigmapospi()) <= ntpcsigma) { + QAK0s(candidate); + + if (doQA) { + registry.fill(HIST("QA/hV0_Sel_EvFlag"), candidate.evflag()); + registry.fill(HIST("QA/hV0_Sel_Radius"), candidate.v0radius()); + registry.fill(HIST("QA/hV0_Sel_DCADauToPV"), candidate.v0dcanegtopv()); + registry.fill(HIST("QA/hV0_Sel_DCADaughters"), candidate.v0dcav0daughters()); + registry.fill(HIST("QA/hV0_Sel_EtaDau"), candidate.v0poseta()); + registry.fill(HIST("QA/hV0_Sel_EtaDau"), candidate.v0negeta()); + registry.fill(HIST("QA/hV0_Sel_ITShits"), candidate.v0negitshits()); + registry.fill(HIST("QA/hV0_Sel_ITShits"), candidate.v0positshits()); + registry.fill(HIST("QA/hV0_Sel_TPCNCls"), candidate.v0postpcCrossedRows()); + registry.fill(HIST("QA/hV0_Sel_TPCNCls"), candidate.v0negtpcCrossedRows()); + registry.fill(HIST("QA/hV0_Sel_TPCNClsShared"), candidate.v0postpcNClsShared()); + registry.fill(HIST("QA/hV0_Sel_TPCNClsShared"), candidate.v0negtpcNClsShared()); + registry.fill(HIST("QA/hV0_Sel_ITSChi2"), candidate.v0positsChi2NCl()); + registry.fill(HIST("QA/hV0_Sel_ITSChi2"), candidate.v0negitsChi2NCl()); + registry.fill(HIST("QA/hV0_Sel_TPCChi2"), candidate.v0postpcChi2NCl()); + registry.fill(HIST("QA/hV0_Sel_TPCChi2"), candidate.v0negtpcChi2NCl()); + } - registry.fill(HIST("hArmenterosPodolanski"), candidate.alpha(), candidate.qtarm()); + ////////////////////////////////// + //////////// K0Short ///////////// + ////////////////////////////////// - if (doArmenterosCut && candidate.qtarm() <= (paramArmenterosCut * TMath::Abs(candidate.alpha()))) { - continue; - } + if (candidate.v0cospa() > cospaK0s && + std::abs(candidate.rapk0short()) < rap && + candidate.ctauk0short() < ctauK0s && + std::abs(candidate.massk0short() - o2::constants::physics::MassK0Short) < 0.075 && + std::abs(candidate.masslambda() - o2::constants::physics::MassLambda0) > v0rejK0s && + std::abs(candidate.ntpcsigmanegpi()) <= ntpcsigma && + std::abs(candidate.ntpcsigmapospi()) <= ntpcsigma && + (doArmenterosCut && candidate.qtarm() > (paramArmenterosCut * std::abs(candidate.alpha())))) { - registry.fill(HIST("hArmenterosPodolanski_Sel"), candidate.alpha(), candidate.qtarm()); registry.fill(HIST("hMassK0Short"), candidate.massk0short()); registry.fill(HIST("hMassVsPtK0Short"), candidate.v0pt(), candidate.massk0short()); registry.fill(HIST("hMassVsPtK0ShortVsCentFT0M"), candidate.v0pt(), candidate.multft0m(), candidate.massk0short()); - registry.fill(HIST("hMassVsPtK0ShortVsCentFV0A"), candidate.v0pt(), candidate.multfv0a(), candidate.massk0short()); - - // QA - if (!isMC) { - registry.fill(HIST("hK0sV0Radius"), candidate.v0radius()); - registry.fill(HIST("hK0sCosPA"), candidate.v0cospa()); - registry.fill(HIST("hK0sV0DCANegToPV"), candidate.v0dcanegtopv()); - registry.fill(HIST("hK0sV0DCAPosToPV"), candidate.v0dcapostopv()); - registry.fill(HIST("hK0sV0DCAV0Daughters"), candidate.v0dcav0daughters()); - registry.fill(HIST("hK0sCtau"), candidate.ctauk0short()); - registry.fill(HIST("hK0sEtaDau"), candidate.v0poseta()); - registry.fill(HIST("hK0sRap"), candidate.rapk0short()); - registry.fill(HIST("hK0sTPCNSigmaPosPi"), candidate.ntpcsigmapospi()); - registry.fill(HIST("hK0sTPCNSigmaNegPi"), candidate.ntpcsigmanegpi()); + + if (isMC && + candidate.pdgcode() == 310 && + candidate.isdauk0short() && + candidate.isphysprimary() == 1) { + + registry.fill(HIST("hMassK0Short_MC"), candidate.massk0short()); + registry.fill(HIST("hMassVsPtK0ShortVsCentFT0M_MC"), candidate.v0pt(), candidate.multft0m(), candidate.massk0short()); + } + + if (doQA) { + registry.fill(HIST("QA/hK0s_Sel_ArmenterosPodolanski"), candidate.alpha(), candidate.qtarm()); + registry.fill(HIST("QA/hK0s_Sel_Rap"), candidate.rapk0short()); + registry.fill(HIST("QA/hK0s_Sel_CosPA"), candidate.v0cospa()); + registry.fill(HIST("QA/hK0s_Sel_Ctau"), candidate.ctauk0short()); + registry.fill(HIST("QA/hK0s_Sel_TPCNSigmaPosPi"), candidate.ntpcsigmapospi()); + registry.fill(HIST("QA/hK0s_Sel_TPCNSigmaNegPi"), candidate.ntpcsigmanegpi()); } } - // Lambda analysis + ////////////////////////////////// + ////// Lambda / AntiLambda /////// + ////////////////////////////////// + if (candidate.v0cospa() > cospaLambda && - TMath::Abs(candidate.raplambda()) < rap && - TMath::Abs(candidate.massk0short() - o2::constants::physics::MassK0Short) > v0rejLambda) { + std::abs(candidate.raplambda()) < rap && + std::abs(candidate.massk0short() - o2::constants::physics::MassK0Short) > v0rejLambda) { - // Lambda - if (TMath::Abs(candidate.ntpcsigmanegpi()) <= ntpcsigma && TMath::Abs(candidate.ntpcsigmapospr()) <= ntpcsigma && + ////////////////////////////////// + ///////////// Lambda ///////////// + ////////////////////////////////// + + if (std::abs(candidate.ntpcsigmanegpi()) <= ntpcsigma && + std::abs(candidate.ntpcsigmapospr()) <= ntpcsigma && candidate.ctaulambda() < ctauLambda && - TMath::Abs(candidate.masslambda() - o2::constants::physics::MassLambda0) < 0.075) { + std::abs(candidate.masslambda() - o2::constants::physics::MassLambda0) < 0.075) { registry.fill(HIST("hMassLambda"), candidate.masslambda()); registry.fill(HIST("hMassVsPtLambda"), candidate.v0pt(), candidate.masslambda()); registry.fill(HIST("hMassVsPtLambdaVsCentFT0M"), candidate.v0pt(), candidate.multft0m(), candidate.masslambda()); - // QA - if (!isMC) { - registry.fill(HIST("hLambdaV0Radius"), candidate.v0radius()); - registry.fill(HIST("hLambdaCosPA"), candidate.v0cospa()); - registry.fill(HIST("hLambdaV0DCANegToPV"), candidate.v0dcanegtopv()); - registry.fill(HIST("hLambdaV0DCAPosToPV"), candidate.v0dcapostopv()); - registry.fill(HIST("hLambdaV0DCAV0Daughters"), candidate.v0dcav0daughters()); - registry.fill(HIST("hLambdaCtau"), candidate.ctaulambda()); - registry.fill(HIST("hLambdaEtaDau"), candidate.v0poseta()); - registry.fill(HIST("hLambdaRap"), candidate.raplambda()); - registry.fill(HIST("hLambdaTPCNSigmaPosPr"), candidate.ntpcsigmapospr()); - registry.fill(HIST("hLambdaTPCNSigmaNegPi"), candidate.ntpcsigmanegpi()); + if (isMC) { + + if (candidate.pdgcode() == 3122 && candidate.isdaulambda()) { + + if (candidate.isphysprimary() == 1) { + registry.fill(HIST("hMassLambda_MC"), candidate.masslambda()); + registry.fill(HIST("hMassVsPtLambdaVsCentFT0M_MC"), candidate.v0pt(), candidate.multft0m(), candidate.masslambda()); + } + + if (candidate.pdgcodemother() == 3312) { + registry.fill(HIST("hMassVsPtLambdaVsMotherPt_DoubleCharged_MC"), candidate.v0pt(), candidate.v0motherpt(), candidate.masslambda()); + } + if (candidate.pdgcodemother() == 3312 || candidate.pdgcodemother() == 3322) { + registry.fill(HIST("hMassVsPtLambdaVsMotherPt_MCRatio_MC"), candidate.v0pt(), candidate.v0motherpt(), candidate.masslambda()); + } + } + } + + if (doQA) { + registry.fill(HIST("QA/hLambda_Sel_ArmenterosPodolanski"), candidate.alpha(), candidate.qtarm()); + registry.fill(HIST("QA/hLambda_Sel_Rap"), candidate.rapk0short()); + registry.fill(HIST("QA/hLambda_Sel_CosPA"), candidate.v0cospa()); + registry.fill(HIST("QA/hLambda_Sel_Ctau"), candidate.ctauk0short()); + registry.fill(HIST("QA/hLambda_Sel_TPCNSigmaPosPr"), candidate.ntpcsigmapospr()); + registry.fill(HIST("QA/hLambda_Sel_TPCNSigmaNegPi"), candidate.ntpcsigmanegpi()); } } - // AntiLambda - if (TMath::Abs(candidate.ntpcsigmanegpr()) <= ntpcsigma && TMath::Abs(candidate.ntpcsigmapospi()) <= ntpcsigma && + + ////////////////////////////////// + /////////// AntiLambda /////////// + ////////////////////////////////// + + if (std::abs(candidate.ntpcsigmanegpr()) <= ntpcsigma && + std::abs(candidate.ntpcsigmapospi()) <= ntpcsigma && candidate.ctauantilambda() < ctauLambda && - TMath::Abs(candidate.massantilambda() - o2::constants::physics::MassLambda0) < 0.075) { + std::abs(candidate.massantilambda() - o2::constants::physics::MassLambda0) < 0.075) { registry.fill(HIST("hMassAntiLambda"), candidate.massantilambda()); registry.fill(HIST("hMassVsPtAntiLambda"), candidate.v0pt(), candidate.massantilambda()); registry.fill(HIST("hMassVsPtAntiLambdaVsCentFT0M"), candidate.v0pt(), candidate.multft0m(), candidate.massantilambda()); - // QA - if (!isMC) { - registry.fill(HIST("hAntiLambdaV0Radius"), candidate.v0radius()); - registry.fill(HIST("hAntiLambdaCosPA"), candidate.v0cospa()); - registry.fill(HIST("hAntiLambdaV0DCANegToPV"), candidate.v0dcanegtopv()); - registry.fill(HIST("hAntiLambdaV0DCAPosToPV"), candidate.v0dcapostopv()); - registry.fill(HIST("hAntiLambdaV0DCAV0Daughters"), candidate.v0dcav0daughters()); - registry.fill(HIST("hAntiLambdaCtau"), candidate.ctauantilambda()); - registry.fill(HIST("hAntiLambdaEtaDau"), candidate.v0poseta()); - registry.fill(HIST("hAntiLambdaRap"), candidate.raplambda()); - registry.fill(HIST("hAntiLambdaTPCNSigmaNegPr"), candidate.ntpcsigmanegpr()); - registry.fill(HIST("hAntiLambdaTPCNSigmaPosPi"), candidate.ntpcsigmapospi()); - } - } - } + if (candidate.pdgcode() == -3122 && candidate.isdauantilambda()) { - if (isMC) { - - if (candidate.isphysprimary() == 0) - continue; - - // K0Short analysis - if (candidate.v0cospa() > cospaK0s && - TMath::Abs(candidate.rapk0short()) < rap && - candidate.ctauk0short() < ctauK0s && - TMath::Abs(candidate.massk0short() - o2::constants::physics::MassK0Short) < 0.075 && - TMath::Abs(candidate.masslambda() - o2::constants::physics::MassLambda0) > v0rejK0s && - TMath::Abs(candidate.ntpcsigmanegpi()) <= ntpcsigmaMC && - TMath::Abs(candidate.ntpcsigmapospi()) <= ntpcsigmaMC && - (candidate.pdgcode() == 310) && candidate.isdauk0short()) { - - registry.fill(HIST("hArmenterosPodolanski"), candidate.alpha(), candidate.qtarm()); - - if (doArmenterosCut && candidate.qtarm() > (paramArmenterosCut * TMath::Abs(candidate.alpha()))) { - registry.fill(HIST("hArmenterosPodolanski_Sel"), candidate.alpha(), candidate.qtarm()); - registry.fill(HIST("hMassK0Short_MC"), candidate.massk0short()); - registry.fill(HIST("hMassVsPtK0Short_MC"), candidate.v0pt(), candidate.multft0m(), candidate.massk0short()); - - registry.fill(HIST("hK0sV0Radius"), candidate.v0radius()); - registry.fill(HIST("hK0sCosPA"), candidate.v0cospa()); - registry.fill(HIST("hK0sV0DCANegToPV"), candidate.v0dcanegtopv()); - registry.fill(HIST("hK0sV0DCAPosToPV"), candidate.v0dcapostopv()); - registry.fill(HIST("hK0sV0DCAV0Daughters"), candidate.v0dcav0daughters()); - registry.fill(HIST("hK0sCtau"), candidate.ctauk0short()); - registry.fill(HIST("hK0sEtaDau"), candidate.v0poseta()); - registry.fill(HIST("hK0sRap"), candidate.rapk0short()); - registry.fill(HIST("hK0sTPCNSigmaPosPi"), candidate.ntpcsigmapospi()); - registry.fill(HIST("hK0sTPCNSigmaNegPi"), candidate.ntpcsigmanegpi()); - } - } // k0 - - // Lambda analysis - if (candidate.v0cospa() > cospaLambda && - TMath::Abs(candidate.raplambda()) < rap && - TMath::Abs(candidate.massk0short() - o2::constants::physics::MassK0Short) > v0rejLambda) { - - // Lambda - if (TMath::Abs(candidate.ntpcsigmanegpi()) <= ntpcsigmaMC && TMath::Abs(candidate.ntpcsigmapospr()) <= ntpcsigmaMC && - candidate.ctaulambda() < ctauLambda && - TMath::Abs(candidate.masslambda() - o2::constants::physics::MassLambda0) < 0.075 && - candidate.pdgcode() == 3122 && candidate.isdaulambda()) { - - registry.fill(HIST("hMassLambda_MC"), candidate.masslambda()); - registry.fill(HIST("hMassVsPtLambda_MC"), candidate.v0pt(), candidate.multft0m(), candidate.masslambda()); - - registry.fill(HIST("hLambdaV0Radius"), candidate.v0radius()); - registry.fill(HIST("hLambdaCosPA"), candidate.v0cospa()); - registry.fill(HIST("hLambdaV0DCANegToPV"), candidate.v0dcanegtopv()); - registry.fill(HIST("hLambdaV0DCAPosToPV"), candidate.v0dcapostopv()); - registry.fill(HIST("hLambdaV0DCAV0Daughters"), candidate.v0dcav0daughters()); - registry.fill(HIST("hLambdaCtau"), candidate.ctaulambda()); - registry.fill(HIST("hLambdaEtaDau"), candidate.v0poseta()); - registry.fill(HIST("hLambdaRap"), candidate.raplambda()); - registry.fill(HIST("hLambdaTPCNSigmaPosPr"), candidate.ntpcsigmapospr()); - registry.fill(HIST("hLambdaTPCNSigmaNegPi"), candidate.ntpcsigmanegpi()); + if (candidate.isphysprimary() == 1) { + registry.fill(HIST("hMassAntiLambda_MC"), candidate.massantilambda()); + registry.fill(HIST("hMassVsPtAntiLambdaVsCentFT0M_MC"), candidate.v0pt(), candidate.v0motherpt(), candidate.massantilambda()); + } + + if (candidate.pdgcodemother() == -3312) { + registry.fill(HIST("hMassVsPtAntiLambdaVsMotherPt_DoubleCharged_MC"), candidate.v0pt(), candidate.v0motherpt(), candidate.massantilambda()); + } + if (candidate.pdgcodemother() == -3312 || candidate.pdgcodemother() == -3322) { + registry.fill(HIST("hMassVsPtAntiLambdaVsMotherPt_MCRatio_MC"), candidate.v0pt(), candidate.v0motherpt(), candidate.massantilambda()); + } } - // AntiLambda - if (TMath::Abs(candidate.ntpcsigmanegpr()) <= ntpcsigmaMC && TMath::Abs(candidate.ntpcsigmapospi()) <= ntpcsigmaMC && - candidate.ctauantilambda() < ctauLambda && - TMath::Abs(candidate.massantilambda() - o2::constants::physics::MassLambda0) < 0.075 && - candidate.pdgcode() == -3122 && candidate.isdauantilambda()) { - - registry.fill(HIST("hMassAntiLambda_MC"), candidate.massantilambda()); - registry.fill(HIST("hMassVsPtAntiLambda_MC"), candidate.v0pt(), candidate.multft0m(), candidate.massantilambda()); - - registry.fill(HIST("hAntiLambdaV0Radius"), candidate.v0radius()); - registry.fill(HIST("hAntiLambdaCosPA"), candidate.v0cospa()); - registry.fill(HIST("hAntiLambdaV0DCANegToPV"), candidate.v0dcanegtopv()); - registry.fill(HIST("hAntiLambdaV0DCAPosToPV"), candidate.v0dcapostopv()); - registry.fill(HIST("hAntiLambdaV0DCAV0Daughters"), candidate.v0dcav0daughters()); - registry.fill(HIST("hAntiLambdaCtau"), candidate.ctauantilambda()); - registry.fill(HIST("hAntiLambdaEtaDau"), candidate.v0poseta()); - registry.fill(HIST("hAntiLambdaRap"), candidate.raplambda()); - registry.fill(HIST("hAntiLambdaTPCNSigmaPosPi"), candidate.ntpcsigmapospi()); - registry.fill(HIST("hAntiLambdaTPCNSigmaNegPr"), candidate.ntpcsigmanegpr()); + + if (doQA) { + registry.fill(HIST("QA/hAntiLambda_Sel_ArmenterosPodolanski"), candidate.alpha(), candidate.qtarm()); + registry.fill(HIST("QA/hAntiLambda_Sel_Rap"), candidate.rapk0short()); + registry.fill(HIST("QA/hAntiLambda_Sel_CosPA"), candidate.v0cospa()); + registry.fill(HIST("QA/hAntiLambda_Sel_Ctau"), candidate.ctauk0short()); + registry.fill(HIST("QA/hAntiLambda_Sel_TPCNSigmaPosPi"), candidate.ntpcsigmapospi()); + registry.fill(HIST("QA/hAntiLambda_Sel_TPCNSigmaNegPr"), candidate.ntpcsigmanegpr()); } - } // lambda - } // is MC + } + } } } }; From 8f8b5fba91231c28b91402c801eeca63f5a11049 Mon Sep 17 00:00:00 2001 From: MaolinZH <109225729+MaolinZH@users.noreply.github.com> Date: Mon, 14 Apr 2025 14:21:00 +0200 Subject: [PATCH 0978/1650] [PWGDQ] Add MC signals of muons and electrons decay from HF and LF mesons in MCSignal Libaray (#10803) --- PWGDQ/Core/HistogramsLibrary.cxx | 3 +- PWGDQ/Core/MCProng.cxx | 13 ++++- PWGDQ/Core/MCProng.h | 4 +- PWGDQ/Core/MCSignalLibrary.cxx | 96 +++++++++++++++++++++++++++++++- 4 files changed, 110 insertions(+), 6 deletions(-) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 39024957c48..4134b84d953 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -1512,7 +1512,8 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "Mass_Pt", "", false, 750, 0.0, 30.0, VarManager::kMass, 120, 0.0, 30.0, VarManager::kPt); hm->AddHistogram(histClass, "Mass_Rapidity", "", false, 750, 0.0, 30.0, VarManager::kMass, 500, -1.0, 4.0, VarManager::kRap); hm->AddHistogram(histClass, "Mass_VtxZ", "", true, 30, -15.0, 15.0, VarManager::kVtxZ, 750, 0.0, 30.0, VarManager::kMass); - hm->AddHistogram(histClass, "DeltaPhiPair", "", false, 130, -6.5, 6.5, VarManager::kDeltaPhiPair); + hm->AddHistogram(histClass, "DeltaPhiPair2", "", false, 600, -o2::constants::math::PIHalf, 1.5 * o2::constants::math::PI, VarManager::kDeltaPhiPair2); + hm->AddHistogram(histClass, "DeltaEtaPair2", "", false, 350, 1.5, 5.0, VarManager::kDeltaEtaPair2); } if (subGroupStr.Contains("correlation-emu")) { hm->AddHistogram(histClass, "DeltaPhiPair2_DeltaEtaPair2", "", false, 600, -o2::constants::math::PIHalf, 1.5 * o2::constants::math::PI, VarManager::kDeltaPhiPair2, 350, 1.5, 5.0, VarManager::kDeltaEtaPair2); diff --git a/PWGDQ/Core/MCProng.cxx b/PWGDQ/Core/MCProng.cxx index 8eb0dc6d2e9..48f2c52ae36 100644 --- a/PWGDQ/Core/MCProng.cxx +++ b/PWGDQ/Core/MCProng.cxx @@ -11,6 +11,8 @@ #include "PWGDQ/Core/MCProng.h" +#include +#include #include #include @@ -128,9 +130,9 @@ void MCProng::SetSourceBit(int generation, int sourceBit, bool exclude /*=false* if (generation < 0 || generation >= fNGenerations) { return; } - fSourceBits[generation] |= (uint64_t(1) << sourceBit); + fSourceBits[generation] |= (static_cast(1) << sourceBit); if (exclude) { - fExcludeSource[generation] |= (uint64_t(1) << sourceBit); + fExcludeSource[generation] |= (static_cast(1) << sourceBit); } } @@ -195,6 +197,13 @@ bool MCProng::ComparePDG(int pdg, int prongPDG, bool checkBothCharges, bool excl decision = (prongPDG > 0 ? pdg >= 100 && pdg <= 199 : pdg >= -199 && pdg <= -100); } break; + case 101: // all light flavoured and strange mesons + if (checkBothCharges) { + decision = absPDG >= 100 && absPDG <= 399; + } else { + decision = (prongPDG > 0 ? pdg >= 100 && pdg <= 399 : pdg >= -399 && pdg <= -100); + } + break; case 1000: // light flavoured baryons if (checkBothCharges) { decision = absPDG >= 1000 && absPDG <= 1999; diff --git a/PWGDQ/Core/MCProng.h b/PWGDQ/Core/MCProng.h index cdcbe0d114b..cd42965d271 100644 --- a/PWGDQ/Core/MCProng.h +++ b/PWGDQ/Core/MCProng.h @@ -23,6 +23,7 @@ A few non-existent PYTHIA codes are used to select more than one PYTHIA code. 0 - default, accepts all PYTHIA codes 100 - light unflavoured mesons in the code range 100-199 +101 - all light and strange mesons in the code range 100-399 200 - --"-- 200-299 300 - strange mesons in the code range 300-399 400 - charmed mesons in the code range 400-499 @@ -43,6 +44,7 @@ A few non-existent PYTHIA codes are used to select more than one PYTHIA code. 901 - LF mesons for LMEE 111, 221, 331, 113, 223, 333 902 - all open charm open beauty mesons+baryons 400-439, 500-549, 4000-4399, 5000-5499 903 - all hadrons in the code range 100-599, 1000-5999 +904 - chic0, chic1 and chic2 445, 100441, 200443 1000 - light unflavoured baryons in the code range 1000-1999 2000 - --"-- 2000-2999 3000 - strange baryons in the code range 3000-3999 @@ -84,7 +86,7 @@ class MCProng }; MCProng(); - MCProng(int n); + explicit MCProng(int n); MCProng(int n, int m); MCProng(int n, std::vector pdgs, std::vector checkBothCharges, std::vector excludePDG, std::vector sourceBits, std::vector excludeSource, std::vector useANDonSourceBitMap, diff --git a/PWGDQ/Core/MCSignalLibrary.cxx b/PWGDQ/Core/MCSignalLibrary.cxx index 8121bb2241d..7872429efb8 100644 --- a/PWGDQ/Core/MCSignalLibrary.cxx +++ b/PWGDQ/Core/MCSignalLibrary.cxx @@ -12,6 +12,7 @@ // Contact: iarsene@cern.ch, i.c.arsene@fys.uio.no // #include +#include // #include #include @@ -602,6 +603,39 @@ MCSignal* o2::aod::dqmcsignals::GetMCSignal(const char* name) signal = new MCSignal(name, "Electrons from open charmed hadron decays with b hadron in decay history", {prong}, {-1}); return signal; } + if (!nameStr.compare("eFromPromptLM")) { + MCProng prong(2, {11, 101}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}, false, {502, 402}, {true, true}); + prong.SetSourceBit(0, MCProng::kPhysicalPrimary); + signal = new MCSignal(name, "Electrons from light mesons without B/D in decay history", {prong}, {-1}); + return signal; + } + if (!nameStr.compare("eFromHbtoLM")) { + MCProng prong(2, {11, 101}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}, false, {502}, {false}); + prong.SetSourceBit(0, MCProng::kPhysicalPrimary); + signal = new MCSignal(name, "Electrons from light mesons with B hadron in decay history", {prong}, {-1}); + return signal; + } + if (!nameStr.compare("eFromHctoLM")) { + MCProng prong(2, {11, 101, 402}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}, false, {502}, {true}); + prong.SetSourceBit(0, MCProng::kPhysicalPrimary); + signal = new MCSignal(name, "Electrons from light mesons from D hadron decays and no B in decay history", {prong}, {-1}); + return signal; + } + if (!nameStr.compare("eFromUpsilon1S")) { + MCProng prong(2, {11, 553}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); + signal = new MCSignal(name, "Electrons from Upsilon1S decays", {prong}, {-1}); + return signal; + } + if (!nameStr.compare("eFromUpsilon2S")) { + MCProng prong(2, {11, 100553}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); + signal = new MCSignal(name, "Electrons from Upsilon2S decays", {prong}, {-1}); + return signal; + } + if (!nameStr.compare("eFromUpsilon3S")) { + MCProng prong(2, {11, 200553}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); + signal = new MCSignal(name, "Electrons from Upsilon3S decays", {prong}, {-1}); + return signal; + } // muon signals with mother X: mu from mother X if (!nameStr.compare("muFromJpsi")) { @@ -614,6 +648,64 @@ MCSignal* o2::aod::dqmcsignals::GetMCSignal(const char* name) signal = new MCSignal(name, "muons from psi2s decays", {prong}, {-1}); return signal; } + if (!nameStr.compare("muFromHb")) { + MCProng prong(2, {13, 502}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); + prong.SetSourceBit(0, MCProng::kPhysicalPrimary); + signal = new MCSignal(name, "muons from b->mu", {prong}, {-1}); + return signal; + } + if (!nameStr.compare("muFromPromptHc")) { + MCProng prong(2, {13, 402}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}, false, {502}, {true}); + prong.SetSourceBit(0, MCProng::kPhysicalPrimary); + signal = new MCSignal(name, "muons from c->mu, without beauty in decay history", {prong}, {-1}); + return signal; + } + if (!nameStr.compare("muFromHbtoHc")) { + MCProng prong(3, {13, 402, 502}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}); + prong.SetSourceBit(0, MCProng::kPhysicalPrimary); + signal = new MCSignal(name, "muons from b->c->mu", {prong}, {-1}); + return signal; + } + if (!nameStr.compare("secondaryMuon")) { + MCProng prong(1); + prong.SetPDGcode(0, 13, true); + prong.SetSourceBit(0, MCProng::kProducedInTransport); + signal = new MCSignal(name, "muons produced during transport in detector", {prong}, {-1}); + return signal; + } + if (!nameStr.compare("muFromPromptLM")) { + MCProng prong(2, {13, 101}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}, false, {502, 402}, {true, true}); + prong.SetSourceBit(0, MCProng::kPhysicalPrimary); + signal = new MCSignal(name, "muons from light mesons without B/D in decay history", {prong}, {-1}); + return signal; + } + if (!nameStr.compare("muFromHbtoLM")) { + MCProng prong(2, {13, 101}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}, false, {502}, {false}); + prong.SetSourceBit(0, MCProng::kPhysicalPrimary); + signal = new MCSignal(name, "muons from light mesons with B hadron in decay history", {prong}, {-1}); + return signal; + } + if (!nameStr.compare("muFromHctoLM")) { + MCProng prong(2, {13, 101, 402}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}, false, {502}, {true}); + prong.SetSourceBit(0, MCProng::kPhysicalPrimary); + signal = new MCSignal(name, "muons from light mesons from D hadron decays and no B in decay history", {prong}, {-1}); + return signal; + } + if (!nameStr.compare("muFromUpsilon1S")) { + MCProng prong(2, {13, 553}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); + signal = new MCSignal(name, "muons from Upsilon1S decays", {prong}, {-1}); + return signal; + } + if (!nameStr.compare("muFromUpsilon2S")) { + MCProng prong(2, {13, 100553}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); + signal = new MCSignal(name, "muons from Upsilon2S decays", {prong}, {-1}); + return signal; + } + if (!nameStr.compare("muFromUpsilon3S")) { + MCProng prong(2, {13, 200553}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); + signal = new MCSignal(name, "muons from Upsilon3S decays", {prong}, {-1}); + return signal; + } // Decay signal: Mother to electron: X -> e if (!nameStr.compare("AnythingToE")) { @@ -2041,9 +2133,9 @@ MCProng* o2::aod::dqmcsignals::ParseJSONMCProng(T prongJSON, const char* prongNa for (auto& s : itgen) { bool exclude = (hasExclude ? excludeVec[is] : false); if (s != MCProng::kNothing) { - sBits |= (uint64_t(1) << s); + sBits |= (static_cast(1) << s); if (exclude) { - sBitsExclude |= (uint64_t(1) << s); + sBitsExclude |= (static_cast(1) << s); } } is++; From 86b734666f094128b3c71fad06de48cfa2ffdc57 Mon Sep 17 00:00:00 2001 From: Fabrizio Date: Mon, 14 Apr 2025 16:02:22 +0200 Subject: [PATCH 0979/1650] [PWGHF] Fix tagging of gen D0 mesons in candidateCreatorDstar (#10837) --- PWGHF/TableProducer/candidateCreatorDstar.cxx | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/PWGHF/TableProducer/candidateCreatorDstar.cxx b/PWGHF/TableProducer/candidateCreatorDstar.cxx index 13c72455fbf..110edad7cfb 100644 --- a/PWGHF/TableProducer/candidateCreatorDstar.cxx +++ b/PWGHF/TableProducer/candidateCreatorDstar.cxx @@ -725,19 +725,30 @@ struct HfCandidateCreatorDstarExpressions { } // D*± → D0(bar) π± - if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kDStar, std::array{+kPiPlus, +kPiPlus, -kKPlus}, true, &signDstar, 2)) { - flagDstar = signDstar * (BIT(aod::hf_cand_dstar::DecayType::DstarToD0Pi)); - } else if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kDStar, std::array{+kPiPlus, +kPiPlus, -kKPlus, +kPi0}, false, &signDstar, 2) || RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kDStar, std::array{-kPiPlus, -kPiPlus, +kKPlus, +kPi0}, false, &signDstar, 2)) { - flagDstar = signDstar * (BIT(aod::hf_cand_dstar::DecayType::DstarToD0PiPi0)); - } + std::vector listIndexDaughters{}; + bool isDstarToDzeroPi = RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kDStar, std::array{+Pdg::kD0, +kPiPlus}, true, &signDstar, 1, &listIndexDaughters); + // D0(bar) → π± K∓ - if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kD0, std::array{+kPiPlus, -kKPlus}, true, &signD0)) { - flagD0 = signD0 * (BIT(aod::hf_cand_dstar::DecayType::D0ToPiK)); - } else if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kD0, std::array{+kPiPlus, -kKPlus, +kPi0}, false, &signD0) || RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kD0, std::array{-kPiPlus, +kKPlus, +kPi0}, false, &signD0)) { - flagD0 = signD0 * (BIT(aod::hf_cand_dstar::DecayType::D0ToPiKPi0)); + if (isDstarToDzeroPi) { + aod::McParticles::iterator particleD0; + for (const auto& dauIdx : listIndexDaughters) { + if (dauIdx >= 0) { + particleD0 = mcParticles.rawIteratorAt(dauIdx); + if (std::abs(particleD0.pdgCode()) == Pdg::kD0) { + break; + } + } + } + if (RecoDecay::isMatchedMCGen(mcParticles, particleD0, Pdg::kD0, std::array{+kPiPlus, -kKPlus}, true, &signD0)) { + flagDstar = signDstar * (BIT(aod::hf_cand_dstar::DecayType::DstarToD0Pi)); + flagD0 = signD0 * (BIT(aod::hf_cand_dstar::DecayType::D0ToPiK)); + } else if (RecoDecay::isMatchedMCGen(mcParticles, particleD0, Pdg::kD0, std::array{+kPiPlus, -kKPlus, +kPi0}, false, &signD0) || RecoDecay::isMatchedMCGen(mcParticles, particleD0, -Pdg::kD0, std::array{-kPiPlus, +kKPlus, +kPi0}, false, &signD0)) { + flagDstar = signDstar * (BIT(aod::hf_cand_dstar::DecayType::DstarToD0PiPi0)); + flagD0 = signD0 * (BIT(aod::hf_cand_dstar::DecayType::D0ToPiKPi0)); + } } - // check wether the particle is non-promt (from a B0 hadron) + // check wether the particle is non-prompt (from a B0 hadron) if (flagDstar != 0) { originDstar = RecoDecay::getCharmHadronOrigin(mcParticles, particle, false, &idxBhadMothers); } From 2b0031cb278601190f52ae702f572ff6f8fa7981 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Mon, 14 Apr 2025 16:09:13 +0200 Subject: [PATCH 0980/1650] [PWGHF,Trigger] Fix the mass range of Bc in Hf filter task (#10843) --- EventFiltering/PWGHF/HFFilterHelpers.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EventFiltering/PWGHF/HFFilterHelpers.h b/EventFiltering/PWGHF/HFFilterHelpers.h index c398be20c90..bbd792841a3 100644 --- a/EventFiltering/PWGHF/HFFilterHelpers.h +++ b/EventFiltering/PWGHF/HFFilterHelpers.h @@ -286,7 +286,7 @@ static const o2::framework::AxisSpec qtAxis{100, 0.f, 0.25f}; static const o2::framework::AxisSpec bdtAxis{100, 0.f, 1.f}; static const o2::framework::AxisSpec phiAxis{36, 0., o2::constants::math::TwoPI}; static const std::array massAxisC = {o2::framework::AxisSpec{250, 1.65f, 2.15f}, o2::framework::AxisSpec{250, 1.65f, 2.15f}, o2::framework::AxisSpec{250, 1.75f, 2.25f}, o2::framework::AxisSpec{250, 2.05f, 2.55f}, o2::framework::AxisSpec{250, 2.25f, 2.75f}, o2::framework::AxisSpec{200, 0.139f, 0.159f}, o2::framework::AxisSpec{250, 0.f, 0.25f}, o2::framework::AxisSpec{250, 0.f, 0.25f}, o2::framework::AxisSpec{200, 0.48f, 0.88f}, o2::framework::AxisSpec{200, 0.48f, 0.88f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{200, 1.1f, 1.4f}, o2::framework::AxisSpec{170, 0.13f, 0.3f}, o2::framework::AxisSpec{170, 0.13f, 0.3f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{200, 0.4f, 0.8f}, o2::framework::AxisSpec{350, 2.3f, 3.0f}, o2::framework::AxisSpec{350, 2.3f, 3.0f}, o2::framework::AxisSpec{350, 2.3f, 3.0f}, o2::framework::AxisSpec{240, 2.4f, 3.6f}, o2::framework::AxisSpec{300, 0.7f, 1.3f}, o2::framework::AxisSpec{300, 0.7f, 1.3f}, o2::framework::AxisSpec{300, 0.7f, 1.3f}, o2::framework::AxisSpec{300, 0.7f, 1.3f}}; -static const std::array massAxisB = {o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.4f, 6.4f}, o2::framework::AxisSpec{500, 5.4f, 7.4f}, o2::framework::AxisSpec{400, 5.0f, 6.6f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{400, 5.0f, 6.6f}, o2::framework::AxisSpec{240, 5.8f, 7.0f}}; +static const std::array massAxisB = {o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 5.4f, 7.4f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.4f, 6.4f}, o2::framework::AxisSpec{400, 5.0f, 6.6f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{500, 4.2f, 6.2f}, o2::framework::AxisSpec{400, 5.0f, 6.6f}, o2::framework::AxisSpec{240, 5.8f, 7.0f}}; // default values for configurables // channels to trigger on for femto From 41b1bcffc142c6e8e75243b672c706337e72dac1 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Mon, 14 Apr 2025 16:20:15 +0200 Subject: [PATCH 0981/1650] [PWGEM/Dilepton] support RCT flag (#10841) --- PWGEM/Dilepton/DataModel/dileptonTables.h | 12 +++++----- .../TableProducer/createEMEventDilepton.cxx | 2 +- .../Dilepton/TableProducer/eventSelection.cxx | 24 +++++++++++++++++-- .../TableProducer/filterDielectronEvent.cxx | 2 +- .../skimmerSecondaryElectron.cxx | 4 ++-- .../Dilepton/Tasks/Converters/CMakeLists.txt | 4 ++-- ...ventConverter1.cxx => eventConverter2.cxx} | 13 +++++----- .../TableProducer/createEMEventPhoton.cxx | 2 +- 8 files changed, 42 insertions(+), 21 deletions(-) rename PWGEM/Dilepton/Tasks/Converters/{eventConverter1.cxx => eventConverter2.cxx} (83%) diff --git a/PWGEM/Dilepton/DataModel/dileptonTables.h b/PWGEM/Dilepton/DataModel/dileptonTables.h index 4d67089b98d..b61a80a9758 100644 --- a/PWGEM/Dilepton/DataModel/dileptonTables.h +++ b/PWGEM/Dilepton/DataModel/dileptonTables.h @@ -144,17 +144,17 @@ DECLARE_SOA_DYNAMIC_COLUMN(EP4BNeg, ep4bneg, [](float q4x, float q4y) -> float { DECLARE_SOA_DYNAMIC_COLUMN(EP4BTot, ep4btot, [](float q4x, float q4y) -> float { return std::atan2(q4y, q4x) / 4.0; }); } // namespace emevent -DECLARE_SOA_TABLE(EMEvents_000, "AOD", "EMEVENT", //! Main event information table - o2::soa::Index<>, emevent::CollisionId, bc::RunNumber, bc::GlobalBC, evsel::Alias, evsel::Selection, timestamp::Timestamp, - collision::PosX, collision::PosY, collision::PosZ, - collision::NumContrib, evsel::NumTracksInTimeRange, emevent::Sel8); - DECLARE_SOA_TABLE_VERSIONED(EMEvents_001, "AOD", "EMEVENT", 1, //! Main event information table o2::soa::Index<>, emevent::CollisionId, bc::RunNumber, bc::GlobalBC, evsel::Alias, evsel::Selection, timestamp::Timestamp, collision::PosX, collision::PosY, collision::PosZ, collision::NumContrib, evsel::NumTracksInTimeRange, evsel::SumAmpFT0CInTimeRange, emevent::Sel8); -using EMEvents = EMEvents_001; +DECLARE_SOA_TABLE_VERSIONED(EMEvents_002, "AOD", "EMEVENT", 2, //! Main event information table + o2::soa::Index<>, emevent::CollisionId, bc::RunNumber, bc::GlobalBC, evsel::Alias, evsel::Selection, evsel::Rct, timestamp::Timestamp, + collision::PosX, collision::PosY, collision::PosZ, + collision::NumContrib, evsel::NumTracksInTimeRange, evsel::SumAmpFT0CInTimeRange, emevent::Sel8); + +using EMEvents = EMEvents_002; using EMEvent = EMEvents::iterator; DECLARE_SOA_TABLE(EMEventsCov, "AOD", "EMEVENTCOV", //! joinable to EMEvents diff --git a/PWGEM/Dilepton/TableProducer/createEMEventDilepton.cxx b/PWGEM/Dilepton/TableProducer/createEMEventDilepton.cxx index dbe9739cdff..9cc02253636 100644 --- a/PWGEM/Dilepton/TableProducer/createEMEventDilepton.cxx +++ b/PWGEM/Dilepton/TableProducer/createEMEventDilepton.cxx @@ -182,7 +182,7 @@ struct CreateEMEventDilepton { registry.fill(HIST("hEventCounter"), 2); - event(collision.globalIndex(), bc.runNumber(), bc.globalBC(), collision.alias_raw(), collision.selection_raw(), bc.timestamp(), + event(collision.globalIndex(), bc.runNumber(), bc.globalBC(), collision.alias_raw(), collision.selection_raw(), collision.rct_raw(), bc.timestamp(), collision.posX(), collision.posY(), collision.posZ(), collision.numContrib(), collision.trackOccupancyInTimeRange(), collision.ft0cOccupancyInTimeRange()); diff --git a/PWGEM/Dilepton/TableProducer/eventSelection.cxx b/PWGEM/Dilepton/TableProducer/eventSelection.cxx index d161b3803fc..5998ec355e5 100644 --- a/PWGEM/Dilepton/TableProducer/eventSelection.cxx +++ b/PWGEM/Dilepton/TableProducer/eventSelection.cxx @@ -14,16 +14,19 @@ // This code produces event selection table for PWG-EM. // Please write to: daiki.sekihata@cern.ch +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "Framework/ASoAHelpers.h" +#include "Common/CCDB/RCTSelectionFlags.h" #include "PWGEM/Dilepton/DataModel/dileptonTables.h" using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::soa; +// using namespace o2::aod::rctsel; using MyCollisions = soa::Join; using MyCollisions_Cent = soa::Join; @@ -38,7 +41,13 @@ struct EMEventSelection { Configurable cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"}; Configurable cfgCentMin{"cfgCentMin", -1.f, "min. centrality"}; Configurable cfgCentMax{"cfgCentMax", 999.f, "max. centrality"}; + Configurable cfgRCTLabel{"cfgRCTLabel", "CBT_hadronPID", "select 1 [CBT, CBT_hadron, CBT_muon_glo] see O2Physics/Common/CCDB/RCTSelectionFlags.h"}; + Configurable cfgCheckZDC{"cfgCheckZDC", false, "set ZDC flag for PbPb"}; + Configurable cfgTreatLimitedAcceptanceAsBad{"cfgTreatLimitedAcceptanceAsBad", false, "reject all events where the detectors relevant for the specified Runlist are flagged as LimitedAcceptance"}; + // Configurable> cfgRCTFlags{"cfgRCTFlags", std::vector{kFT0Bad, kITSBad, kTPCBadTracking, kTPCBadPID, kTOFBad}, "see O2Physics/Common/CCDB/RCTSelectionFlags.h for bit information"}; + + Configurable cfgZvtxMin{"cfgZvtxMin", -1e+10, "min. Zvtx"}; Configurable cfgZvtxMax{"cfgZvtxMax", 1e+10, "max. Zvtx"}; Configurable cfgRequireSel8{"cfgRequireSel8", false, "require sel8 in event cut"}; Configurable cfgRequireFT0AND{"cfgRequireFT0AND", false, "require FT0AND in event cut"}; @@ -52,7 +61,13 @@ struct EMEventSelection { Configurable cfgFT0COccupancyMax{"cfgFT0COccupancyMax", 1000000000, "max. occupancy"}; Configurable cfgRequireNoCollInTimeRangeStandard{"cfgRequireNoCollInTimeRangeStandard", false, "require no collision in time range standard"}; - void init(InitContext&) {} + o2::aod::rctsel::RCTFlagsChecker rctChecker; + + void init(InitContext&) + { + // rctChecker = o2::aod::rctsel::RCTFlagsChecker(cfgRCTLabel.value, cfgCheckZDC.value, cfgTreatLimitedAcceptanceAsBad.value); + rctChecker.init(cfgRCTLabel.value, cfgCheckZDC.value, cfgTreatLimitedAcceptanceAsBad.value); + } template bool isSelectedEvent(TCollision const& collision) @@ -63,7 +78,7 @@ struct EMEventSelection { } } - if (std::fabs(collision.posZ()) > cfgZvtxMax) { + if (collision.posZ() < cfgZvtxMin || cfgZvtxMax < collision.posZ()) { return false; } @@ -106,6 +121,11 @@ struct EMEventSelection { } } + if (!rctChecker.checkTable(collision)) { + // LOGF(info, "rejected by RCT flag"); + return false; + } + return true; } diff --git a/PWGEM/Dilepton/TableProducer/filterDielectronEvent.cxx b/PWGEM/Dilepton/TableProducer/filterDielectronEvent.cxx index fcf1feb5c21..69dc9ad0b2b 100644 --- a/PWGEM/Dilepton/TableProducer/filterDielectronEvent.cxx +++ b/PWGEM/Dilepton/TableProducer/filterDielectronEvent.cxx @@ -1565,7 +1565,7 @@ struct createEMEvent2VP { registry.fill(HIST("hEventCounter"), 1); - event(collision.globalIndex(), bc.runNumber(), bc.globalBC(), collision.alias_raw(), collision.selection_raw(), bc.timestamp(), + event(collision.globalIndex(), bc.runNumber(), bc.globalBC(), collision.alias_raw(), collision.selection_raw(), collision.rct_raw(), bc.timestamp(), collision.posX(), collision.posY(), collision.posZ(), collision.numContrib(), collision.trackOccupancyInTimeRange(), collision.ft0cOccupancyInTimeRange()); diff --git a/PWGEM/Dilepton/TableProducer/skimmerSecondaryElectron.cxx b/PWGEM/Dilepton/TableProducer/skimmerSecondaryElectron.cxx index e59dc1225e0..ecb138b57c9 100644 --- a/PWGEM/Dilepton/TableProducer/skimmerSecondaryElectron.cxx +++ b/PWGEM/Dilepton/TableProducer/skimmerSecondaryElectron.cxx @@ -383,7 +383,7 @@ struct skimmerSecondaryElectron { continue; } - event(collision.globalIndex(), bc.runNumber(), bc.globalBC(), collision.alias_raw(), collision.selection_raw(), bc.timestamp(), + event(collision.globalIndex(), bc.runNumber(), bc.globalBC(), collision.alias_raw(), collision.selection_raw(), collision.rct_raw(), bc.timestamp(), collision.posX(), collision.posY(), collision.posZ(), collision.numContrib(), collision.trackOccupancyInTimeRange(), collision.ft0cOccupancyInTimeRange()); event_mult(collision.multFT0A(), collision.multFT0C(), collision.multNTracksPV(), collision.multNTracksPVeta1(), collision.multNTracksPVetaHalf()); @@ -444,7 +444,7 @@ struct skimmerSecondaryElectron { continue; } - event(collision.globalIndex(), bc.runNumber(), bc.globalBC(), collision.alias_raw(), collision.selection_raw(), bc.timestamp(), + event(collision.globalIndex(), bc.runNumber(), bc.globalBC(), collision.alias_raw(), collision.selection_raw(), collision.rct_raw(), bc.timestamp(), collision.posX(), collision.posY(), collision.posZ(), collision.numContrib(), collision.trackOccupancyInTimeRange(), collision.ft0cOccupancyInTimeRange()); event_mult(collision.multFT0A(), collision.multFT0C(), collision.multNTracksPV(), collision.multNTracksPVeta1(), collision.multNTracksPVetaHalf()); diff --git a/PWGEM/Dilepton/Tasks/Converters/CMakeLists.txt b/PWGEM/Dilepton/Tasks/Converters/CMakeLists.txt index 4ba93844b6c..503c3aee2ff 100644 --- a/PWGEM/Dilepton/Tasks/Converters/CMakeLists.txt +++ b/PWGEM/Dilepton/Tasks/Converters/CMakeLists.txt @@ -10,8 +10,8 @@ # or submit itself to any jurisdiction. -o2physics_add_dpl_workflow(event-converter1 - SOURCES eventConverter1.cxx +o2physics_add_dpl_workflow(event-converter2 + SOURCES eventConverter2.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore COMPONENT_NAME Analysis) diff --git a/PWGEM/Dilepton/Tasks/Converters/eventConverter1.cxx b/PWGEM/Dilepton/Tasks/Converters/eventConverter2.cxx similarity index 83% rename from PWGEM/Dilepton/Tasks/Converters/eventConverter1.cxx rename to PWGEM/Dilepton/Tasks/Converters/eventConverter2.cxx index 148ff43bd88..568cb741d08 100644 --- a/PWGEM/Dilepton/Tasks/Converters/eventConverter1.cxx +++ b/PWGEM/Dilepton/Tasks/Converters/eventConverter2.cxx @@ -25,30 +25,31 @@ using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::soa; -struct eventConverter1 { - Produces event_001; +struct eventConverter2 { + Produces event_002; - void process(aod::EMEvents_000 const& collisions) + void process(aod::EMEvents_001 const& collisions) { for (auto& collision : collisions) { - event_001( + event_002( collision.globalIndex(), collision.runNumber(), collision.globalBC(), collision.alias_raw(), collision.selection_raw(), + 0, collision.timestamp(), collision.posX(), collision.posY(), collision.posZ(), collision.numContrib(), collision.trackOccupancyInTimeRange(), - -1.f); + collision.ft0cOccupancyInTimeRange()); } // end of collision loop } }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{adaptAnalysisTask(cfgc, TaskName{"event-converter1"})}; + return WorkflowSpec{adaptAnalysisTask(cfgc, TaskName{"event-converter2"})}; } diff --git a/PWGEM/PhotonMeson/TableProducer/createEMEventPhoton.cxx b/PWGEM/PhotonMeson/TableProducer/createEMEventPhoton.cxx index c325ff875c6..fc155fe5502 100644 --- a/PWGEM/PhotonMeson/TableProducer/createEMEventPhoton.cxx +++ b/PWGEM/PhotonMeson/TableProducer/createEMEventPhoton.cxx @@ -160,7 +160,7 @@ struct CreateEMEventPhoton { registry.fill(HIST("hEventCounter"), 2); } - event(collision.globalIndex(), bc.runNumber(), bc.globalBC(), collision.alias_raw(), collision.selection_raw(), bc.timestamp(), + event(collision.globalIndex(), bc.runNumber(), bc.globalBC(), collision.alias_raw(), collision.selection_raw(), collision.rct_raw(), bc.timestamp(), collision.posX(), collision.posY(), collision.posZ(), collision.numContrib(), collision.trackOccupancyInTimeRange(), collision.ft0cOccupancyInTimeRange()); From 4aa8b649be9c707ce746cdfbf39699c61ef346e3 Mon Sep 17 00:00:00 2001 From: Yash Patley <52608802+yashpatley@users.noreply.github.com> Date: Mon, 14 Apr 2025 22:42:11 +0530 Subject: [PATCH 0982/1650] [PWGCF] Update lambdaR2Correlation.cxx (#10838) --- .../Tasks/lambdaR2Correlation.cxx | 104 ++++-------------- 1 file changed, 24 insertions(+), 80 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx index 8c9866e2d58..19bc4f66d37 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx @@ -196,9 +196,9 @@ enum DMCType { }; enum CorrHistDim { - kOneDimCorr = 1, - kTwoDimCorr, - kThreeDimCorr + OneDimCorr = 1, + TwoDimCorr, + ThreeDimCorr }; struct LambdaTableProducer { @@ -251,6 +251,8 @@ struct LambdaTableProducer { Configurable cLambdaMassWindow{"cLambdaMassWindow", 0.005, "Lambda Mass Window"}; // V0s kinmatic acceptance + Configurable cMinV0Mass{"cMinV0Mass", 1.10, "V0 Mass Min"}; + Configurable cMaxV0Mass{"cMaxV0Mass", 1.12, "V0 Mass Min"}; Configurable cMinV0Pt{"cMinV0Pt", 0.8, "Minimum V0 pT"}; Configurable cMaxV0Pt{"cMaxV0Pt", 4.2, "Minimum V0 pT"}; Configurable cMaxV0Rap{"cMaxV0Rap", 0.5, "|rap| cut"}; @@ -262,7 +264,7 @@ struct LambdaTableProducer { Configurable cSelectPrimaryV0{"cSelectPrimaryV0", true, "Select Primary V0"}; Configurable cRecPrimaryLambda{"cRecPrimaryLambda", true, "Primary Reconstructed Lambda"}; Configurable cRecSecondaryLambda{"cRecSecondaryLambda", false, "Secondary Reconstructed Lambda"}; - Configurable cCheckRecoDauFlag{"cCheckRecoDauFlag", false, "Check for reco daughter PID"}; + Configurable cCheckRecoDauFlag{"cCheckRecoDauFlag", true, "Check for reco daughter PID"}; Configurable cGenPrimaryLambda{"cGenPrimaryLambda", true, "Primary Generated Lambda"}; Configurable cGenSecondaryLambda{"cGenSecondaryLambda", false, "Secondary Generated Lambda"}; Configurable cGenDecayChannel{"cGenDecayChannel", true, "Gen Level Decay Channel Flag"}; @@ -311,8 +313,8 @@ struct LambdaTableProducer { const AxisSpec axisVz(220, -11, 11, "V_{z} (cm)"); const AxisSpec axisPID(8000, -4000, 4000, "PdgCode"); - const AxisSpec axisV0Mass(200, 1.09, 1.14, "M_{p#pi} (GeV/#it{c}^{2})"); - const AxisSpec axisV0Pt(84, 0.2, 4.4, "p_{T} (GeV/#it{c})"); + const AxisSpec axisV0Mass(140, 1.08, 1.15, "M_{p#pi} (GeV/#it{c}^{2})"); + const AxisSpec axisV0Pt(100., 0., 10., "p_{T} (GeV/#it{c})"); const AxisSpec axisV0Rap(48, -1.2, 1.2, "y"); const AxisSpec axisV0Eta(48, -1.2, 1.2, "#eta"); const AxisSpec axisV0Phi(36, 0., TwoPI, "#phi (rad)"); @@ -388,7 +390,7 @@ struct LambdaTableProducer { histos.addClone("McRec/Lambda/", "McRec/AntiLambda/"); // MC Generated Histograms - if (doprocessMCRun3 || doprocessMCRun2 || doprocessMCRecoRun3) { + if (doprocessMCRun3 || doprocessMCRun2) { // McReco Histos histos.add("Tracks/h2f_tracks_pid_before_sel", "PIDs", kTH2F, {axisPID, axisV0Pt}); histos.add("Tracks/h2f_tracks_pid_after_sel", "PIDs", kTH2F, {axisPID, axisV0Pt}); @@ -648,13 +650,13 @@ struct LambdaTableProducer { bool lambdaFlag = false, antiLambdaFlag = false; // get v0 track as lambda - if ((std::abs(v0.mLambda() - MassLambda0) < cLambdaMassWindow) && (selLambdaDauWithTpcPid(postrack, negtrack))) { + if ((v0.mLambda() > cMinV0Mass && v0.mLambda() < cMaxV0Mass) && (selLambdaDauWithTpcPid(postrack, negtrack))) { lambdaFlag = true; v0type = kLambda; } // get v0 track as anti-lambda - if ((std::abs(v0.mAntiLambda() - MassLambda0) < cLambdaMassWindow) && (selLambdaDauWithTpcPid(postrack, negtrack))) { + if ((v0.mAntiLambda() > cMinV0Mass && v0.mAntiLambda() < cMaxV0Mass) && (selLambdaDauWithTpcPid(postrack, negtrack))) { antiLambdaFlag = true; v0type = kAntiLambda; } @@ -846,13 +848,13 @@ struct LambdaTableProducer { float retVal = 0.; float rap = (cDoEtaCorr) ? v0.eta() : v0.yLambda(); - if (hist->GetDimension() == kOneDimCorr) { + if (hist->GetDimension() == OneDimCorr) { histos.fill(HIST("Tracks/h1f_tracks_info"), kEffCorrPt); retVal = hist->GetBinContent(hist->FindBin(v0.pt())); - } else if (hist->GetDimension() == kTwoDimCorr) { + } else if (hist->GetDimension() == TwoDimCorr) { histos.fill(HIST("Tracks/h1f_tracks_info"), kEffCorrPtRap); retVal = hist->GetBinContent(hist->FindBin(v0.pt(), rap)); - } else if (hist->GetDimension() == kThreeDimCorr) { + } else if (hist->GetDimension() == ThreeDimCorr) { histos.fill(HIST("Tracks/h1f_tracks_info"), kEffCorrPtRapPhi); retVal = hist->GetBinContent(hist->FindBin(v0.pt(), rap, v0.phi())); } else { @@ -1211,71 +1213,6 @@ struct LambdaTableProducer { } PROCESS_SWITCH(LambdaTableProducer, processMCRun2, "Process for Run2 MC RecoGen", false); - - // Temperory process function to check differences in way of computations (Will be deleted in future !!!) - void processMCRecoRun3(soa::Join::iterator const& collision, - soa::Join const&, - McV0Tracks const& V0s, TracksMC const& tracks, - aod::McParticles const& mcParticles) - { - // see if reco collison pass event selection - if (!collision.has_mcCollision() || !selCollision(collision)) { - return; - } - - // Now we have reco event - // Fill V0 Lambda Table - fillLambdaRecoTables(collision, V0s, tracks); - - // Get the mcCollision and mcParticles associated to this reco event - auto mccol = collision.mcCollision_as>(); - auto mcparticles = mcParticles.sliceByCached(aod::mcparticle::mcCollisionId, mccol.globalIndex(), cache); - - // Fill McGen Collision Table - lambdaMCGenCollisionTable(mccol.centFT0M(), mccol.posX(), mccol.posY(), mccol.posZ()); - - // initialize track objects - ParticleType v0Type = kLambda; - float rap = 0.; - for (auto const& mcpart : mcparticles) { - // check for Lambda first - if (mcpart.pdgCode() == kLambda0) { - v0Type = kLambda; - } else if (mcpart.pdgCode() == kLambda0Bar) { - v0Type = kAntiLambda; - } else { - continue; - } - - // check for Primary Lambda/AntiLambda - if (cGenPrimaryLambda && !mcpart.isPhysicalPrimary()) { - continue; - } else if (cGenSecondaryLambda && mcpart.isPhysicalPrimary()) { - continue; - } - - // Decide Eta/Rap - if (!cDoEtaAnalysis) { - rap = mcpart.y(); - } else { - rap = mcpart.eta(); - } - - // Apply Kinematic Acceptance - if (!kinCutSelection(mcpart.pt(), std::abs(rap), cMinV0Pt, cMaxV0Pt, cMaxV0Rap)) { - continue; - } - - histos.fill(HIST("Tracks/h1f_tracks_info"), kGenTotAccLambda); - - // Fill Lambda McGen Table - lambdaMCGenTrackTable(lambdaMCGenCollisionTable.lastIndex(), mcpart.px(), mcpart.py(), mcpart.pz(), - mcpart.pt(), mcpart.eta(), mcpart.phi(), mcpart.y(), RecoDecay::m(mcpart.p(), mcpart.e()), - -999., 999., (int8_t)v0Type, -999., -999., 1.); - } - } - - PROCESS_SWITCH(LambdaTableProducer, processMCRecoRun3, "Process for Run3 MC Reconstructed", false); }; struct LambdaTracksExtProducer { @@ -1521,10 +1458,14 @@ struct LambdaR2Correlation { histos.add("Reco/h1d_n1_phi_LaP", "#rho_{1}^{#Lambda}", kTH1D, {axisPhi}); histos.add("Reco/h1d_n1_phi_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH1D, {axisPhi}); - // rho1 for R2 RapPhi histograms + // rho1 for R2 RapPhi histos.add("Reco/h2d_n1_rapphi_LaP", "#rho_{1}^{#Lambda}", kTH2D, {axisRap, axisPhi}); histos.add("Reco/h2d_n1_rapphi_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH2D, {axisRap, axisPhi}); + // rho1 for Q_{inv} + histos.add("Reco/h2d_n1_pteta_LaP", "#rho_{1}^{#Lambda}", kTH2D, {axisPt, axisEta}); + histos.add("Reco/h2d_n1_pteta_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH2D, {axisPt, axisEta}); + // rho2 for numerator of R2 histos.add("Reco/h2d_n2_ptpt_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisPt, axisPt}); histos.add("Reco/h2d_n2_ptpt_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisPt, axisPt}); @@ -1539,12 +1480,12 @@ struct LambdaR2Correlation { histos.add("Reco/h2d_n2_phiphi_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisPhi, axisPhi}); histos.add("Reco/h2d_n2_phiphi_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisPhi, axisPhi}); - // rho2 for R2 Rap1Phi1Rap2Phi2 histograms + // rho2 for R2 Rap1Phi1Rap2Phi2 histos.add("Reco/h2d_n2_rapphi_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisRapPhi, axisRapPhi}); histos.add("Reco/h2d_n2_rapphi_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisRapPhi, axisRapPhi}); histos.add("Reco/h2d_n2_rapphi_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisRapPhi, axisRapPhi}); - // rho2 for R2 Qinv histograms + // rho2 for R2 Qinv histos.add("Reco/h1d_n2_qinv_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH1D, {axisQinv}); histos.add("Reco/h1d_n2_qinv_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH1D, {axisQinv}); histos.add("Reco/h1d_n2_qinv_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH1D, {axisQinv}); @@ -1620,6 +1561,9 @@ struct LambdaR2Correlation { // Rho1 for N1RapPhi histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n1_rapphi_") + HIST(SubDirHist[part]), track.rap(), track.phi(), track.corrFact()); + + // Rho1 for Q_{inv} Bkg Estimation + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n1_pteta_") + HIST(SubDirHist[part]), track.pt(), track.eta(), track.corrFact()); } // fill multiplicity histograms From a1a130e0f7da1897a266a8f319faf5cab873545b Mon Sep 17 00:00:00 2001 From: Nicolas Strangmann <77485327+nstrangm@users.noreply.github.com> Date: Mon, 14 Apr 2025 20:01:27 +0200 Subject: [PATCH 0983/1650] [PWGEM/PhotonMeson,EventFiltering] Separate omega and eta' QA histogram (#10846) Co-authored-by: Nicolas Strangmann --- .../PWGEM/HeavyNeutralMesonFilter.cxx | 27 +++- PWGEM/PhotonMeson/Tasks/HeavyNeutralMeson.cxx | 124 ++++++++++-------- 2 files changed, 89 insertions(+), 62 deletions(-) diff --git a/EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx b/EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx index a7813d84576..a2941317ec6 100644 --- a/EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx +++ b/EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx @@ -432,9 +432,13 @@ struct HeavyNeutralMesonFilter { mHistManager.add("GG/invMassVsPt_PCMEMC", "Invariant mass and pT of gg candidates;#bf{#it{M}_{#gamma#gamma}};#bf{#it{pT}_{#gamma#gamma}}", HistType::kTH2F, {{400, 0., 0.8}, {250, 0., 25.}}); mHistManager.add("GG/invMassVsPt_EMC", "Invariant mass and pT of gg candidates;#bf{#it{M}_{#gamma#gamma}};#bf{#it{pT}_{#gamma#gamma}}", HistType::kTH2F, {{400, 0., 0.8}, {250, 0., 25.}}); - mHistManager.add("HeavyNeutralMeson/invMassVsPt_PCM", "Invariant mass and pT of HNM candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{600, 0.6, 1.2}, {250, 0., 25.}}); - mHistManager.add("HeavyNeutralMeson/invMassVsPt_PCMEMC", "Invariant mass and pT of HNM candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{600, 0.6, 1.2}, {250, 0., 25.}}); - mHistManager.add("HeavyNeutralMeson/invMassVsPt_EMC", "Invariant mass and pT of HNM candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{600, 0.6, 1.2}, {250, 0., 25.}}); + mHistManager.add("Omega/invMassVsPt_PCM", "Invariant mass and pT of omega meson candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{400, 0.6, 1.}, {250, 0., 25.}}); + mHistManager.add("Omega/invMassVsPt_PCMEMC", "Invariant mass and pT of omega meson candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{400, 0.6, 1.}, {250, 0., 25.}}); + mHistManager.add("Omega/invMassVsPt_EMC", "Invariant mass and pT of omega meson candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{400, 0.6, 1.}, {250, 0., 25.}}); + + mHistManager.add("EtaPrime/invMassVsPt_PCM", "Invariant mass and pT of eta' candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{400, 0.8, 1.2}, {250, 0., 25.}}); + mHistManager.add("EtaPrime/invMassVsPt_PCMEMC", "Invariant mass and pT of eta' candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{400, 0.8, 1.2}, {250, 0., 25.}}); + mHistManager.add("EtaPrime/invMassVsPt_EMC", "Invariant mass and pT of eta' candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{400, 0.8, 1.2}, {250, 0., 25.}}); // include all femto histograms mHistManager.add("fProcessedEvents", "CF - event filtered;;Events", HistType::kTH1F, {{15, -0.5, 14.5}}); @@ -768,7 +772,7 @@ struct HeavyNeutralMesonFilter { mHistManager.add("etaprimep/fAntiProtonPtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); if (ConfDoEMCShift.value) { - for (unsigned short iSM = 0; iSM < 20; iSM++) { + for (int iSM = 0; iSM < 20; iSM++) { EMCEtaShift[iSM] = ConfEMCEtaShift.value[iSM]; EMCPhiShift[iSM] = ConfEMCPhiShift.value[iSM]; LOG(info) << "SM-wise shift in eta/phi for SM " << iSM << ": " << EMCEtaShift[iSM] << " / " << EMCPhiShift[iSM]; @@ -1498,21 +1502,30 @@ struct HeavyNeutralMesonFilter { float massHNM = heavyNeutralMeson.m(cfgHNMMassCorrection); if (heavyNeutralMeson.gg->reconstructionType == photonpair::kPCMPCM) { - mHistManager.fill(HIST("HeavyNeutralMeson/invMassVsPt_PCM"), massHNM, heavyNeutralMeson.pT()); + if (heavyNeutralMeson.gg->isPi0) + mHistManager.fill(HIST("Omega/invMassVsPt_PCM"), massHNM, heavyNeutralMeson.pT()); + else if (heavyNeutralMeson.gg->isEta) + mHistManager.fill(HIST("EtaPrime/invMassVsPt_PCM"), massHNM, heavyNeutralMeson.pT()); // QA mHistManager.fill(HIST("TrackCuts/HMN/Before/PCM/fInvMass"), massHNM); mHistManager.fill(HIST("TrackCuts/HMN/Before/PCM/fPt"), heavyNeutralMeson.pT()); mHistManager.fill(HIST("TrackCuts/HMN/Before/PCM/fEta"), heavyNeutralMeson.eta()); mHistManager.fill(HIST("TrackCuts/HMN/Before/PCM/fPhi"), translatePhi(heavyNeutralMeson.phi())); } else if (heavyNeutralMeson.gg->reconstructionType == photonpair::kEMCEMC) { - mHistManager.fill(HIST("HeavyNeutralMeson/invMassVsPt_EMC"), massHNM, heavyNeutralMeson.pT()); + if (heavyNeutralMeson.gg->isPi0) + mHistManager.fill(HIST("Omega/invMassVsPt_EMC"), massHNM, heavyNeutralMeson.pT()); + else if (heavyNeutralMeson.gg->isEta) + mHistManager.fill(HIST("EtaPrime/invMassVsPt_EMC"), massHNM, heavyNeutralMeson.pT()); // QA mHistManager.fill(HIST("TrackCuts/HMN/Before/EMC/fInvMass"), massHNM); mHistManager.fill(HIST("TrackCuts/HMN/Before/EMC/fPt"), heavyNeutralMeson.pT()); mHistManager.fill(HIST("TrackCuts/HMN/Before/EMC/fEta"), heavyNeutralMeson.eta()); mHistManager.fill(HIST("TrackCuts/HMN/Before/EMC/fPhi"), translatePhi(heavyNeutralMeson.phi())); } else { - mHistManager.fill(HIST("HeavyNeutralMeson/invMassVsPt_PCMEMC"), massHNM, heavyNeutralMeson.pT()); + if (heavyNeutralMeson.gg->isPi0) + mHistManager.fill(HIST("Omega/invMassVsPt_PCMEMC"), massHNM, heavyNeutralMeson.pT()); + else if (heavyNeutralMeson.gg->isEta) + mHistManager.fill(HIST("EtaPrime/invMassVsPt_PCMEMC"), massHNM, heavyNeutralMeson.pT()); // QA mHistManager.fill(HIST("TrackCuts/HMN/Before/PCMEMC/fInvMass"), massHNM); mHistManager.fill(HIST("TrackCuts/HMN/Before/PCMEMC/fPt"), heavyNeutralMeson.pT()); diff --git a/PWGEM/PhotonMeson/Tasks/HeavyNeutralMeson.cxx b/PWGEM/PhotonMeson/Tasks/HeavyNeutralMeson.cxx index 432552c0033..98e620e413b 100644 --- a/PWGEM/PhotonMeson/Tasks/HeavyNeutralMeson.cxx +++ b/PWGEM/PhotonMeson/Tasks/HeavyNeutralMeson.cxx @@ -243,9 +243,13 @@ struct HeavyNeutralMeson { mHistManager.add("GG/invMassVsPt_PCMEMC", "Invariant mass and pT of gg candidates;#bf{#it{M}_{#gamma#gamma}};#bf{#it{pT}_{#gamma#gamma}}", HistType::kTH2F, {{400, 0., 0.8}, {250, 0., 25.}}); mHistManager.add("GG/invMassVsPt_EMC", "Invariant mass and pT of gg candidates;#bf{#it{M}_{#gamma#gamma}};#bf{#it{pT}_{#gamma#gamma}}", HistType::kTH2F, {{400, 0., 0.8}, {250, 0., 25.}}); - mHistManager.add("HeavyNeutralMeson/invMassVsPt_PCM", "Invariant mass and pT of HNM candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{600, 0.6, 1.2}, {250, 0., 25.}}); - mHistManager.add("HeavyNeutralMeson/invMassVsPt_PCMEMC", "Invariant mass and pT of HNM candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{600, 0.6, 1.2}, {250, 0., 25.}}); - mHistManager.add("HeavyNeutralMeson/invMassVsPt_EMC", "Invariant mass and pT of HNM candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{600, 0.6, 1.2}, {250, 0., 25.}}); + mHistManager.add("Omega/invMassVsPt_PCM", "Invariant mass and pT of omega meson candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{400, 0.6, 1.}, {250, 0., 25.}}); + mHistManager.add("Omega/invMassVsPt_PCMEMC", "Invariant mass and pT of omega meson candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{400, 0.6, 1.}, {250, 0., 25.}}); + mHistManager.add("Omega/invMassVsPt_EMC", "Invariant mass and pT of omega meson candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{400, 0.6, 1.}, {250, 0., 25.}}); + + mHistManager.add("EtaPrime/invMassVsPt_PCM", "Invariant mass and pT of eta' candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{400, 0.8, 1.2}, {250, 0., 25.}}); + mHistManager.add("EtaPrime/invMassVsPt_PCMEMC", "Invariant mass and pT of eta' candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{400, 0.8, 1.2}, {250, 0., 25.}}); + mHistManager.add("EtaPrime/invMassVsPt_EMC", "Invariant mass and pT of eta' candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{400, 0.8, 1.2}, {250, 0., 25.}}); // event cuts mHistManager.add("EventCuts/fMultiplicityBefore", "Multiplicity of all processed events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); @@ -322,35 +326,36 @@ struct HeavyNeutralMeson { // HNM // omega QA // daughter pos before - mHistManager.add("TrackCuts/HMN/Before/PosDaughter/fInvMass", "Invariant mass HMN Pos Daugh;M_{#pi};Entries", HistType::kTH1F, {{500, 0, 1}}); - mHistManager.add("TrackCuts/HMN/Before/PosDaughter/fPt", "Transverse momentum HMN Pos Daugh tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/HMN/Before/PosDaughter/fEta", "HMN Pos Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/HMN/Before/PosDaughter/fPhi", "Azimuthal angle of HMN Pos Daugh tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + mHistManager.add("TrackCuts/HMN/PosDaughter/fInvMass", "Invariant mass HMN Pos Daugh;M_{#pi};Entries", HistType::kTH1F, {{500, 0, 1}}); + mHistManager.add("TrackCuts/HMN/PosDaughter/fPt", "Transverse momentum HMN Pos Daugh tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/HMN/PosDaughter/fEta", "HMN Pos Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/HMN/PosDaughter/fPhi", "Azimuthal angle of HMN Pos Daugh tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); // daughter neg before - mHistManager.add("TrackCuts/HMN/Before/NegDaughter/fInvMass", "Invariant mass HMN Neg Daugh;M_{#pi};Entries", HistType::kTH1F, {{500, 0, 1}}); - mHistManager.add("TrackCuts/HMN/Before/NegDaughter/fPt", "Transverse momentum HMN Neg Daugh tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/HMN/Before/NegDaughter/fEta", "HMN Neg Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/HMN/Before/NegDaughter/fPhi", "Azimuthal angle of HMN Neg Daugh tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + mHistManager.add("TrackCuts/HMN/NegDaughter/fInvMass", "Invariant mass HMN Neg Daugh;M_{#pi};Entries", HistType::kTH1F, {{500, 0, 1}}); + mHistManager.add("TrackCuts/HMN/NegDaughter/fPt", "Transverse momentum HMN Neg Daugh tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/HMN/NegDaughter/fEta", "HMN Neg Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/HMN/NegDaughter/fPhi", "Azimuthal angle of HMN Neg Daugh tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); // HMNCand tracks before - mHistManager.add("TrackCuts/HMN/Before/fInvMass_tracks", "Invariant mass HMNCand;M_{#pi#pi#gammg#gamma};Entries", HistType::kTH1F, {{5000, 0, 5}}); - mHistManager.add("TrackCuts/HMN/Before/fPt_tracks", "Transverse momentum HMNCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/HMN/Before/fEta_tracks", "Pseudorapidity of HMNCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/HMN/Before/fPhi_tracks", "Azimuthal angle of HMNCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - mHistManager.add("TrackCuts/HMN/Before/PCM/fInvMass", "Invariant mass HMNCand;M_{#pi#pi#gammg#gamma};Entries", HistType::kTH1F, {{5000, 0, 5}}); - mHistManager.add("TrackCuts/HMN/Before/PCM/fPt", "Transverse momentum HMNCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/HMN/Before/PCM/fEta", "Pseudorapidity of HMNCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/HMN/Before/PCM/fPhi", "Azimuthal angle of HMNCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - mHistManager.add("TrackCuts/HMN/Before/EMC/fInvMass", "Invariant mass HMNCand;M_{#pi#pi#gammg#gamma};Entries", HistType::kTH1F, {{5000, 0, 5}}); - mHistManager.add("TrackCuts/HMN/Before/EMC/fPt", "Transverse momentum HMNCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/HMN/Before/EMC/fEta", "Pseudorapidity of HMNCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/HMN/Before/EMC/fPhi", "Azimuthal angle of HMNCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - mHistManager.add("TrackCuts/HMN/Before/PCMEMC/fInvMass", "Invariant mass HMNCand;M_{#pi#pi#gammg#gamma};Entries", HistType::kTH1F, {{5000, 0, 5}}); - mHistManager.add("TrackCuts/HMN/Before/PCMEMC/fPt", "Transverse momentum HMNCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/HMN/Before/PCMEMC/fEta", "Pseudorapidity of HMNCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/HMN/Before/PCMEMC/fPhi", "Azimuthal angle of HMNCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + mHistManager.add("TrackCuts/HMN/fInvMass_tracks", "Invariant mass HMNCand;M_{#pi#pi#gammg#gamma};Entries", HistType::kTH1F, {{5000, 0, 5}}); + mHistManager.add("TrackCuts/HMN/fInvMassPt_tracks", "Invariant mass HMNCand;M_{#pi^{+}#pi^{-}};pT_{#pi^{+}#pi^{-}}", HistType::kTH2F, {{5000, 0, 5}, {500, 0, 10}}); + mHistManager.add("TrackCuts/HMN/fPt_tracks", "Transverse momentum HMNCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/HMN/fEta_tracks", "Pseudorapidity of HMNCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/HMN/fPhi_tracks", "Azimuthal angle of HMNCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + mHistManager.add("TrackCuts/HMN/PCM/fInvMass", "Invariant mass HMNCand;M_{#pi#pi#gammg#gamma};Entries", HistType::kTH1F, {{5000, 0, 5}}); + mHistManager.add("TrackCuts/HMN/PCM/fPt", "Transverse momentum HMNCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/HMN/PCM/fEta", "Pseudorapidity of HMNCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/HMN/PCM/fPhi", "Azimuthal angle of HMNCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + mHistManager.add("TrackCuts/HMN/EMC/fInvMass", "Invariant mass HMNCand;M_{#pi#pi#gammg#gamma};Entries", HistType::kTH1F, {{5000, 0, 5}}); + mHistManager.add("TrackCuts/HMN/EMC/fPt", "Transverse momentum HMNCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/HMN/EMC/fEta", "Pseudorapidity of HMNCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/HMN/EMC/fPhi", "Azimuthal angle of HMNCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + mHistManager.add("TrackCuts/HMN/PCMEMC/fInvMass", "Invariant mass HMNCand;M_{#pi#pi#gammg#gamma};Entries", HistType::kTH1F, {{5000, 0, 5}}); + mHistManager.add("TrackCuts/HMN/PCMEMC/fPt", "Transverse momentum HMNCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/HMN/PCMEMC/fEta", "Pseudorapidity of HMNCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/HMN/PCMEMC/fPhi", "Azimuthal angle of HMNCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); if (ConfDoEMCShift.value) { - for (unsigned short iSM = 0; iSM < 20; iSM++) { + for (int iSM = 0; iSM < 20; iSM++) { EMCEtaShift[iSM] = ConfEMCEtaShift.value[iSM]; EMCPhiShift[iSM] = ConfEMCPhiShift.value[iSM]; LOG(info) << "SM-wise shift in eta/phi for SM " << iSM << ": " << EMCEtaShift[iSM] << " / " << EMCPhiShift[iSM]; @@ -488,20 +493,20 @@ struct HeavyNeutralMeson { ROOT::Math::PtEtaPhiMVector temp = posPion + negPion; - mHistManager.fill(HIST("TrackCuts/HMN/Before/fInvMass_tracks"), temp.M()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/fPt_tracks"), temp.pt()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/fEta_tracks"), temp.eta()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/fPhi_tracks"), translatePhi(temp.phi())); + mHistManager.fill(HIST("TrackCuts/HMN/fInvMass_tracks"), temp.M()); + mHistManager.fill(HIST("TrackCuts/HMN/fPt_tracks"), temp.pt()); + mHistManager.fill(HIST("TrackCuts/HMN/fEta_tracks"), temp.eta()); + mHistManager.fill(HIST("TrackCuts/HMN/fPhi_tracks"), translatePhi(temp.phi())); - mHistManager.fill(HIST("TrackCuts/HMN/Before/PosDaughter/fInvMass"), posPion.M()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/PosDaughter/fPt"), posPion.pt()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/PosDaughter/fEta"), posPion.eta()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/PosDaughter/fPhi"), translatePhi(posPion.phi())); + mHistManager.fill(HIST("TrackCuts/HMN/PosDaughter/fInvMass"), posPion.M()); + mHistManager.fill(HIST("TrackCuts/HMN/PosDaughter/fPt"), posPion.pt()); + mHistManager.fill(HIST("TrackCuts/HMN/PosDaughter/fEta"), posPion.eta()); + mHistManager.fill(HIST("TrackCuts/HMN/PosDaughter/fPhi"), translatePhi(posPion.phi())); - mHistManager.fill(HIST("TrackCuts/HMN/Before/NegDaughter/fInvMass"), negPion.M()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/NegDaughter/fPt"), negPion.pt()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/NegDaughter/fEta"), negPion.eta()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/NegDaughter/fPhi"), translatePhi(negPion.phi())); + mHistManager.fill(HIST("TrackCuts/HMN/NegDaughter/fInvMass"), negPion.M()); + mHistManager.fill(HIST("TrackCuts/HMN/NegDaughter/fPt"), negPion.pt()); + mHistManager.fill(HIST("TrackCuts/HMN/NegDaughter/fEta"), negPion.eta()); + mHistManager.fill(HIST("TrackCuts/HMN/NegDaughter/fPhi"), translatePhi(negPion.phi())); } } @@ -544,26 +549,35 @@ struct HeavyNeutralMeson { float massHNM = heavyNeutralMeson.m(cfgHNMMassCorrection); if (heavyNeutralMeson.gg->reconstructionType == photonpair::kPCMPCM) { - mHistManager.fill(HIST("HeavyNeutralMeson/invMassVsPt_PCM"), massHNM, heavyNeutralMeson.pT()); + if (heavyNeutralMeson.gg->isPi0) + mHistManager.fill(HIST("Omega/invMassVsPt_PCM"), massHNM, heavyNeutralMeson.pT()); + else if (heavyNeutralMeson.gg->isEta) + mHistManager.fill(HIST("EtaPrime/invMassVsPt_PCM"), massHNM, heavyNeutralMeson.pT()); // QA - mHistManager.fill(HIST("TrackCuts/HMN/Before/PCM/fInvMass"), massHNM); - mHistManager.fill(HIST("TrackCuts/HMN/Before/PCM/fPt"), heavyNeutralMeson.pT()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/PCM/fEta"), heavyNeutralMeson.eta()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/PCM/fPhi"), translatePhi(heavyNeutralMeson.phi())); + mHistManager.fill(HIST("TrackCuts/HMN/PCM/fInvMass"), massHNM); + mHistManager.fill(HIST("TrackCuts/HMN/PCM/fPt"), heavyNeutralMeson.pT()); + mHistManager.fill(HIST("TrackCuts/HMN/PCM/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("TrackCuts/HMN/PCM/fPhi"), translatePhi(heavyNeutralMeson.phi())); } else if (heavyNeutralMeson.gg->reconstructionType == photonpair::kEMCEMC) { - mHistManager.fill(HIST("HeavyNeutralMeson/invMassVsPt_EMC"), massHNM, heavyNeutralMeson.pT()); + if (heavyNeutralMeson.gg->isPi0) + mHistManager.fill(HIST("Omega/invMassVsPt_EMC"), massHNM, heavyNeutralMeson.pT()); + else if (heavyNeutralMeson.gg->isEta) + mHistManager.fill(HIST("EtaPrime/invMassVsPt_EMC"), massHNM, heavyNeutralMeson.pT()); // QA - mHistManager.fill(HIST("TrackCuts/HMN/Before/EMC/fInvMass"), massHNM); - mHistManager.fill(HIST("TrackCuts/HMN/Before/EMC/fPt"), heavyNeutralMeson.pT()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/EMC/fEta"), heavyNeutralMeson.eta()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/EMC/fPhi"), translatePhi(heavyNeutralMeson.phi())); + mHistManager.fill(HIST("TrackCuts/HMN/EMC/fInvMass"), massHNM); + mHistManager.fill(HIST("TrackCuts/HMN/EMC/fPt"), heavyNeutralMeson.pT()); + mHistManager.fill(HIST("TrackCuts/HMN/EMC/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("TrackCuts/HMN/EMC/fPhi"), translatePhi(heavyNeutralMeson.phi())); } else { - mHistManager.fill(HIST("HeavyNeutralMeson/invMassVsPt_PCMEMC"), massHNM, heavyNeutralMeson.pT()); + if (heavyNeutralMeson.gg->isPi0) + mHistManager.fill(HIST("Omega/invMassVsPt_PCMEMC"), massHNM, heavyNeutralMeson.pT()); + else if (heavyNeutralMeson.gg->isEta) + mHistManager.fill(HIST("EtaPrime/invMassVsPt_PCMEMC"), massHNM, heavyNeutralMeson.pT()); // QA - mHistManager.fill(HIST("TrackCuts/HMN/Before/PCMEMC/fInvMass"), massHNM); - mHistManager.fill(HIST("TrackCuts/HMN/Before/PCMEMC/fPt"), heavyNeutralMeson.pT()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/PCMEMC/fEta"), heavyNeutralMeson.eta()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/PCMEMC/fPhi"), translatePhi(heavyNeutralMeson.phi())); + mHistManager.fill(HIST("TrackCuts/HMN/PCMEMC/fInvMass"), massHNM); + mHistManager.fill(HIST("TrackCuts/HMN/PCMEMC/fPt"), heavyNeutralMeson.pT()); + mHistManager.fill(HIST("TrackCuts/HMN/PCMEMC/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("TrackCuts/HMN/PCMEMC/fPhi"), translatePhi(heavyNeutralMeson.phi())); } } mHistManager.fill(HIST("Event/nHeavyNeutralMesons"), nHNMsBeforeMassCuts, vHNMs.size()); From 66c9f2bc5d9496a0326449ff38a1ff983b97f1cf Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Mon, 14 Apr 2025 20:48:39 +0200 Subject: [PATCH 0984/1650] [PWGEM/Dilepton] update RCT selection (#10848) --- PWGEM/Dilepton/Core/Dilepton.h | 38 +++++++++-- PWGEM/Dilepton/Core/DileptonMC.h | 67 ++++++++++++++----- PWGEM/Dilepton/Core/SingleTrackQC.h | 38 +++++++++-- PWGEM/Dilepton/Core/SingleTrackQCMC.h | 41 ++++++++++-- PWGEM/Dilepton/DataModel/dileptonTables.h | 24 +++---- .../TableProducer/createEMEventDilepton.cxx | 17 +++-- .../Dilepton/TableProducer/eventSelection.cxx | 9 ++- 7 files changed, 177 insertions(+), 57 deletions(-) diff --git a/PWGEM/Dilepton/Core/Dilepton.h b/PWGEM/Dilepton/Core/Dilepton.h index 684c836a5d2..e9da89a3503 100644 --- a/PWGEM/Dilepton/Core/Dilepton.h +++ b/PWGEM/Dilepton/Core/Dilepton.h @@ -45,6 +45,7 @@ #include "DataFormatsParameters/GRPMagField.h" #include "CCDB/BasicCCDBManager.h" #include "Tools/ML/MlResponse.h" +#include "Common/CCDB/RCTSelectionFlags.h" #include "PWGEM/Dilepton/DataModel/dileptonTables.h" #include "PWGEM/Dilepton/Core/DielectronCut.h" @@ -152,6 +153,11 @@ struct Dilepton { Configurable cfgRequireGoodITSLayer3{"cfgRequireGoodITSLayer3", false, "number of inactive chips on ITS layer 3 are below threshold "}; Configurable cfgRequireGoodITSLayer0123{"cfgRequireGoodITSLayer0123", false, "number of inactive chips on ITS layers 0-3 are below threshold "}; Configurable cfgRequireGoodITSLayersAll{"cfgRequireGoodITSLayersAll", false, "number of inactive chips on all ITS layers are below threshold "}; + // for RCT + Configurable cfgRequireGoodRCT{"cfgRequireGoodRCT", false, "require good detector flag in run condtion table"}; + Configurable cfgRCTLabel{"cfgRCTLabel", "CBT_hadronPID", "select 1 [CBT, CBT_hadron, CBT_muon_glo] see O2Physics/Common/CCDB/RCTSelectionFlags.h"}; + Configurable cfgCheckZDC{"cfgCheckZDC", false, "set ZDC flag for PbPb"}; + Configurable cfgTreatLimitedAcceptanceAsBad{"cfgTreatLimitedAcceptanceAsBad", false, "reject all events where the detectors relevant for the specified Runlist are flagged as LimitedAcceptance"}; } eventcuts; DielectronCut fDielectronCut; @@ -276,6 +282,7 @@ struct Dilepton { Configurable enableTTCA{"enableTTCA", true, "Flag to enable or disable TTCA"}; } dimuoncuts; + o2::aod::rctsel::RCTFlagsChecker rctChecker; o2::ccdb::CcdbApi ccdbApi; Service ccdb; int mRunNumber; @@ -313,6 +320,7 @@ struct Dilepton { ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); ccdb->setFatalWhenNull(false); + rctChecker.init(eventcuts.cfgRCTLabel.value, eventcuts.cfgCheckZDC.value, eventcuts.cfgTreatLimitedAcceptanceAsBad.value); if (ConfVtxBins.value[0] == VARIABLE_WIDTH) { zvtx_bin_edges = std::vector(ConfVtxBins.value.begin(), ConfVtxBins.value.end()); @@ -407,11 +415,13 @@ struct Dilepton { fRegistry.add("Event/hNInspectedTVX", "N inspected TVX;run number;N_{TVX}", kTProfile, {{80000, 520000.5, 600000.5}}, true); } if (doprocessBC) { - auto hTVXCounter = fRegistry.add("BC/hTVXCounter", "TVX counter", kTH1D, {{4, -0.5f, 3.5f}}); + auto hTVXCounter = fRegistry.add("BC/hTVXCounter", "TVX counter", kTH1D, {{6, -0.5f, 5.5f}}); hTVXCounter->GetXaxis()->SetBinLabel(1, "TVX"); hTVXCounter->GetXaxis()->SetBinLabel(2, "TVX && NoTFB"); hTVXCounter->GetXaxis()->SetBinLabel(3, "TVX && NoITSROFB"); - hTVXCounter->GetXaxis()->SetBinLabel(4, "TVX && NoTFB && NoITSROFB"); + hTVXCounter->GetXaxis()->SetBinLabel(4, "TVX && GoodRCT"); + hTVXCounter->GetXaxis()->SetBinLabel(5, "TVX && NoTFB && NoITSROFB"); + hTVXCounter->GetXaxis()->SetBinLabel(6, "TVX && NoTFB && NoITSROFB && GoodRCT"); } } @@ -1180,6 +1190,9 @@ struct Dilepton { if (!fEMEventCut.IsSelected(collision)) { continue; } + if (eventcuts.cfgRequireGoodRCT && !rctChecker.checkTable(collision)) { + continue; + } if (nmod > 0 && !isGoodQvector(qvectors)) { continue; @@ -1410,6 +1423,9 @@ struct Dilepton { if (!fEMEventCut.IsSelected(collision)) { continue; } + if (eventcuts.cfgRequireGoodRCT && !rctChecker.checkTable(collision)) { + continue; + } if (nmod > 0 && !isGoodQvector(qvectors)) { continue; @@ -1580,6 +1596,9 @@ struct Dilepton { if (!fEMEventCut.IsSelected(collision)) { continue; } + if (eventcuts.cfgRequireGoodRCT && !rctChecker.checkTable(collision)) { + continue; + } fRegistry.fill(HIST("Event/norm/hCollisionCounter"), o2::aod::pwgem::dilepton::utils::eventhistogram::nbin_ev); // accepted } // end of collision loop } @@ -1588,17 +1607,24 @@ struct Dilepton { void processBC(aod::EMBCs const& bcs) { for (const auto& bc : bcs) { - if (bc.isTriggerTVX()) { + if (bc.selection_bit(o2::aod::evsel::kIsTriggerTVX)) { fRegistry.fill(HIST("BC/hTVXCounter"), 0.f); - if (bc.isNoTimeFrameBorder()) { + + if (bc.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { fRegistry.fill(HIST("BC/hTVXCounter"), 1.f); } - if (bc.isNoITSROFrameBorder()) { + if (bc.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { fRegistry.fill(HIST("BC/hTVXCounter"), 2.f); } - if (bc.isNoTimeFrameBorder() && bc.isNoITSROFrameBorder()) { + if (rctChecker(bc)) { fRegistry.fill(HIST("BC/hTVXCounter"), 3.f); } + if (bc.selection_bit(o2::aod::evsel::kNoTimeFrameBorder) && bc.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { + fRegistry.fill(HIST("BC/hTVXCounter"), 4.f); + } + if (bc.selection_bit(o2::aod::evsel::kNoTimeFrameBorder) && bc.selection_bit(o2::aod::evsel::kNoITSROFrameBorder) && rctChecker(bc)) { + fRegistry.fill(HIST("BC/hTVXCounter"), 5.f); + } } } } diff --git a/PWGEM/Dilepton/Core/DileptonMC.h b/PWGEM/Dilepton/Core/DileptonMC.h index 154180b98fa..952edff0aa3 100644 --- a/PWGEM/Dilepton/Core/DileptonMC.h +++ b/PWGEM/Dilepton/Core/DileptonMC.h @@ -37,6 +37,7 @@ #include "DataFormatsParameters/GRPMagField.h" #include "CCDB/BasicCCDBManager.h" #include "Tools/ML/MlResponse.h" +#include "Common/CCDB/RCTSelectionFlags.h" #include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" @@ -144,6 +145,11 @@ struct DileptonMC { Configurable cfgRequireGoodITSLayer3{"cfgRequireGoodITSLayer3", false, "number of inactive chips on ITS layer 3 are below threshold "}; Configurable cfgRequireGoodITSLayer0123{"cfgRequireGoodITSLayer0123", false, "number of inactive chips on ITS layers 0-3 are below threshold "}; Configurable cfgRequireGoodITSLayersAll{"cfgRequireGoodITSLayersAll", false, "number of inactive chips on all ITS layers are below threshold "}; + // for RCT + Configurable cfgRequireGoodRCT{"cfgRequireGoodRCT", false, "require good detector flag in run condtion table"}; + Configurable cfgRCTLabel{"cfgRCTLabel", "CBT_hadronPID", "select 1 [CBT, CBT_hadron, CBT_muon_glo] see O2Physics/Common/CCDB/RCTSelectionFlags.h"}; + Configurable cfgCheckZDC{"cfgCheckZDC", false, "set ZDC flag for PbPb"}; + Configurable cfgTreatLimitedAcceptanceAsBad{"cfgTreatLimitedAcceptanceAsBad", false, "reject all events where the detectors relevant for the specified Runlist are flagged as LimitedAcceptance"}; } eventcuts; DielectronCut fDielectronCut; @@ -268,6 +274,7 @@ struct DileptonMC { Configurable enableTTCA{"enableTTCA", true, "Flag to enable or disable TTCA"}; } dimuoncuts; + o2::aod::rctsel::RCTFlagsChecker rctChecker; o2::ccdb::CcdbApi ccdbApi; Service ccdb; o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; @@ -445,11 +452,11 @@ struct DileptonMC { } // for correlated bkg due to mis-identified hadrons, and true combinatorial bkg - fRegistry.add("Pair/corr_bkg_eh/uls/hs", "rec. bkg", kTHnSparseD, {axis_mass, axis_pt, axis_y, axis_dphi_ee, axis_deta_ee, axis_cos_theta_cs, axis_phi_cs, axis_aco, axis_asym_pt, axis_dphi_e_ee, axis_dca}, true); - fRegistry.addClone("Pair/corr_bkg_eh/uls/", "Pair/corr_bkg_eh/lspp/"); - fRegistry.addClone("Pair/corr_bkg_eh/uls/", "Pair/corr_bkg_eh/lsmm/"); - fRegistry.addClone("Pair/corr_bkg_eh/", "Pair/corr_bkg_hh/"); - fRegistry.addClone("Pair/corr_bkg_eh/", "Pair/comb_bkg/"); + fRegistry.add("Pair/corr_bkg_lh/uls/hs", "rec. bkg", kTHnSparseD, {axis_mass, axis_pt, axis_y, axis_dphi_ee, axis_deta_ee, axis_cos_theta_cs, axis_phi_cs, axis_aco, axis_asym_pt, axis_dphi_e_ee, axis_dca}, true); + fRegistry.addClone("Pair/corr_bkg_lh/uls/", "Pair/corr_bkg_lh/lspp/"); + fRegistry.addClone("Pair/corr_bkg_lh/uls/", "Pair/corr_bkg_lh/lsmm/"); + fRegistry.addClone("Pair/corr_bkg_lh/", "Pair/corr_bkg_hh/"); + fRegistry.addClone("Pair/corr_bkg_lh/", "Pair/comb_bkg/"); if (cfgFillUnfolding) { // for 2D unfolding @@ -493,6 +500,7 @@ struct DileptonMC { ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); ccdb->setFatalWhenNull(false); + rctChecker.init(eventcuts.cfgRCTLabel.value, eventcuts.cfgCheckZDC.value, eventcuts.cfgTreatLimitedAcceptanceAsBad.value); DefineEMEventCut(); addhistograms(); @@ -512,11 +520,13 @@ struct DileptonMC { fRegistry.addClone("Event/before/hCollisionCounter", "Event/norm/hCollisionCounter"); } if (doprocessBC) { - auto hTVXCounter = fRegistry.add("BC/hTVXCounter", "TVX counter", kTH1D, {{4, -0.5f, 3.5f}}); + auto hTVXCounter = fRegistry.add("BC/hTVXCounter", "TVX counter", kTH1D, {{6, -0.5f, 5.5f}}); hTVXCounter->GetXaxis()->SetBinLabel(1, "TVX"); hTVXCounter->GetXaxis()->SetBinLabel(2, "TVX && NoTFB"); hTVXCounter->GetXaxis()->SetBinLabel(3, "TVX && NoITSROFB"); - hTVXCounter->GetXaxis()->SetBinLabel(4, "TVX && NoTFB && NoITSROFB"); + hTVXCounter->GetXaxis()->SetBinLabel(4, "TVX && GoodRCT"); + hTVXCounter->GetXaxis()->SetBinLabel(5, "TVX && NoTFB && NoITSROFB"); + hTVXCounter->GetXaxis()->SetBinLabel(6, "TVX && NoTFB && NoITSROFB && GoodRCT"); } } @@ -903,7 +913,7 @@ struct DileptonMC { o2::math_utils::bringToPMPi(phiCS); if ((FindCommonMotherFrom2ProngsWithoutPDG(t1mc, t2mc) > 0 || IsHF(t1mc, t2mc, mcparticles) > 0) && is_pair_from_same_mcevent) { // for bkg study - if (std::abs(t1mc.pdgCode()) != pdg_lepton || std::abs(t2mc.pdgCode()) != pdg_lepton) { // hh or eh correlated bkg + if (std::abs(t1mc.pdgCode()) != pdg_lepton || std::abs(t2mc.pdgCode()) != pdg_lepton) { // hh or lh correlated bkg if (std::abs(t1mc.pdgCode()) != pdg_lepton && std::abs(t2mc.pdgCode()) != pdg_lepton) { // hh correlated bkg if (t1.sign() * t2.sign() < 0) { // ULS fRegistry.fill(HIST("Pair/corr_bkg_hh/uls/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); @@ -912,13 +922,13 @@ struct DileptonMC { } else if (t1.sign() < 0 && t2.sign() < 0) { // LS-- fRegistry.fill(HIST("Pair/corr_bkg_hh/lsmm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } - } else { // eh correlated bkg + } else { // lh correlated bkg if (t1.sign() * t2.sign() < 0) { // ULS - fRegistry.fill(HIST("Pair/corr_bkg_eh/uls/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/corr_bkg_lh/uls/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if (t1.sign() > 0 && t2.sign() > 0) { // LS++ - fRegistry.fill(HIST("Pair/corr_bkg_eh/lspp/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/corr_bkg_lh/lspp/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } else if (t1.sign() < 0 && t2.sign() < 0) { // LS-- - fRegistry.fill(HIST("Pair/corr_bkg_eh/lsmm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); + fRegistry.fill(HIST("Pair/corr_bkg_lh/lsmm/hs"), v12.M(), v12.Pt(), v12.Rapidity(), dphi, deta, std::fabs(cos_thetaCS), std::fabs(phiCS), aco, asym, std::fabs(dphi_e_ee), pair_dca, weight); } } } @@ -1213,6 +1223,9 @@ struct DileptonMC { if (!fEMEventCut.IsSelected(collision)) { continue; } + if (eventcuts.cfgRequireGoodRCT && !rctChecker.checkTable(collision)) { + continue; + } o2::aod::pwgem::dilepton::utils::eventhistogram::fillEventInfo<1, -1>(&fRegistry, collision); fRegistry.fill(HIST("Event/before/hCollisionCounter"), o2::aod::pwgem::dilepton::utils::eventhistogram::nbin_ev); // accepted fRegistry.fill(HIST("Event/after/hCollisionCounter"), o2::aod::pwgem::dilepton::utils::eventhistogram::nbin_ev); // accepted @@ -1257,6 +1270,9 @@ struct DileptonMC { if (!fEMEventCut.IsSelected(collision)) { continue; } + if (eventcuts.cfgRequireGoodRCT && !rctChecker.checkTable(collision)) { + continue; + } fRegistry.fill(HIST("MCEvent/after/hZvtx"), mccollision.posZ()); auto posTracks_per_coll = posTracksMC.sliceByCachedUnsorted(aod::emmcparticle::emmceventId, mccollision.globalIndex(), cache); @@ -1859,6 +1875,9 @@ struct DileptonMC { if (!fEMEventCut.IsSelected(collision)) { continue; } + if (eventcuts.cfgRequireGoodRCT && !rctChecker.checkTable(collision)) { + continue; + } // auto mccollision = collision.template emmcevent_as(); // if (cfgEventGeneratorType >= 0 && mccollision.getSubGeneratorId() != cfgEventGeneratorType) { @@ -2000,6 +2019,9 @@ struct DileptonMC { if (!fEMEventCut.IsSelected(collision)) { continue; } + if (eventcuts.cfgRequireGoodRCT && !rctChecker.checkTable(collision)) { + continue; + } auto posTracks_per_coll = posTracks.sliceByCached(perCollision, collision.globalIndex(), cache); // reconstructed pos tracks auto negTracks_per_coll = negTracks.sliceByCached(perCollision, collision.globalIndex(), cache); // reconstructed neg tracks @@ -2374,6 +2396,9 @@ struct DileptonMC { if (!fEMEventCut.IsSelected(collision)) { continue; } + if (eventcuts.cfgRequireGoodRCT && !rctChecker.checkTable(collision)) { + continue; + } auto mccollision = collision.template emmcevent_as(); if (cfgEventGeneratorType >= 0 && mccollision.getSubGeneratorId() != cfgEventGeneratorType) { continue; @@ -2473,6 +2498,9 @@ struct DileptonMC { if (!fEMEventCut.IsSelected(collision)) { continue; } + if (eventcuts.cfgRequireGoodRCT && !rctChecker.checkTable(collision)) { + continue; + } fRegistry.fill(HIST("Event/norm/hCollisionCounter"), o2::aod::pwgem::dilepton::utils::eventhistogram::nbin_ev); // accepted } // end of collision loop } @@ -2481,17 +2509,24 @@ struct DileptonMC { void processBC(aod::EMBCs const& bcs) { for (const auto& bc : bcs) { - if (bc.isTriggerTVX()) { + if (bc.selection_bit(o2::aod::evsel::kIsTriggerTVX)) { fRegistry.fill(HIST("BC/hTVXCounter"), 0.f); - if (bc.isNoTimeFrameBorder()) { + + if (bc.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { fRegistry.fill(HIST("BC/hTVXCounter"), 1.f); } - if (bc.isNoITSROFrameBorder()) { + if (bc.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { fRegistry.fill(HIST("BC/hTVXCounter"), 2.f); } - if (bc.isNoTimeFrameBorder() && bc.isNoITSROFrameBorder()) { + if (rctChecker(bc)) { fRegistry.fill(HIST("BC/hTVXCounter"), 3.f); } + if (bc.selection_bit(o2::aod::evsel::kNoTimeFrameBorder) && bc.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { + fRegistry.fill(HIST("BC/hTVXCounter"), 4.f); + } + if (bc.selection_bit(o2::aod::evsel::kNoTimeFrameBorder) && bc.selection_bit(o2::aod::evsel::kNoITSROFrameBorder) && rctChecker(bc)) { + fRegistry.fill(HIST("BC/hTVXCounter"), 5.f); + } } } } diff --git a/PWGEM/Dilepton/Core/SingleTrackQC.h b/PWGEM/Dilepton/Core/SingleTrackQC.h index ffb4c50df96..a51e2f0df9b 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQC.h @@ -33,6 +33,7 @@ #include "DataFormatsParameters/GRPMagField.h" #include "CCDB/BasicCCDBManager.h" #include "Tools/ML/MlResponse.h" +#include "Common/CCDB/RCTSelectionFlags.h" #include "PWGEM/Dilepton/DataModel/dileptonTables.h" #include "PWGEM/Dilepton/Core/DielectronCut.h" @@ -108,6 +109,11 @@ struct SingleTrackQC { Configurable cfgRequireGoodITSLayer3{"cfgRequireGoodITSLayer3", false, "number of inactive chips on ITS layer 3 are below threshold "}; Configurable cfgRequireGoodITSLayer0123{"cfgRequireGoodITSLayer0123", false, "number of inactive chips on ITS layers 0-3 are below threshold "}; Configurable cfgRequireGoodITSLayersAll{"cfgRequireGoodITSLayersAll", false, "number of inactive chips on all ITS layers are below threshold "}; + // for RCT + Configurable cfgRequireGoodRCT{"cfgRequireGoodRCT", false, "require good detector flag in run condtion table"}; + Configurable cfgRCTLabel{"cfgRCTLabel", "CBT_hadronPID", "select 1 [CBT, CBT_hadron, CBT_muon_glo] see O2Physics/Common/CCDB/RCTSelectionFlags.h"}; + Configurable cfgCheckZDC{"cfgCheckZDC", false, "set ZDC flag for PbPb"}; + Configurable cfgTreatLimitedAcceptanceAsBad{"cfgTreatLimitedAcceptanceAsBad", false, "reject all events where the detectors relevant for the specified Runlist are flagged as LimitedAcceptance"}; } eventcuts; DielectronCut fDielectronCut; @@ -196,6 +202,7 @@ struct SingleTrackQC { Configurable enableTTCA{"enableTTCA", true, "Flag to enable or disable TTCA"}; } dimuoncuts; + o2::aod::rctsel::RCTFlagsChecker rctChecker; o2::ccdb::CcdbApi ccdbApi; Service ccdb; @@ -297,6 +304,7 @@ struct SingleTrackQC { ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); ccdb->setFatalWhenNull(false); + rctChecker.init(eventcuts.cfgRCTLabel.value, eventcuts.cfgCheckZDC.value, eventcuts.cfgTreatLimitedAcceptanceAsBad.value); DefineEMEventCut(); DefineDielectronCut(); @@ -311,11 +319,13 @@ struct SingleTrackQC { fRegistry.add("Event/hNInspectedTVX", "N inspected TVX;run number;N_{TVX}", kTProfile, {{80000, 520000.5, 600000.5}}, true); } if (doprocessBC) { - auto hTVXCounter = fRegistry.add("BC/hTVXCounter", "TVX counter", kTH1D, {{4, -0.5f, 3.5f}}); + auto hTVXCounter = fRegistry.add("BC/hTVXCounter", "TVX counter", kTH1D, {{6, -0.5f, 5.5f}}); hTVXCounter->GetXaxis()->SetBinLabel(1, "TVX"); hTVXCounter->GetXaxis()->SetBinLabel(2, "TVX && NoTFB"); hTVXCounter->GetXaxis()->SetBinLabel(3, "TVX && NoITSROFB"); - hTVXCounter->GetXaxis()->SetBinLabel(4, "TVX && NoTFB && NoITSROFB"); + hTVXCounter->GetXaxis()->SetBinLabel(4, "TVX && GoodRCT"); + hTVXCounter->GetXaxis()->SetBinLabel(5, "TVX && NoTFB && NoITSROFB"); + hTVXCounter->GetXaxis()->SetBinLabel(6, "TVX && NoTFB && NoITSROFB && GoodRCT"); } } @@ -599,6 +609,9 @@ struct SingleTrackQC { if (!fEMEventCut.IsSelected(collision)) { continue; } + if (eventcuts.cfgRequireGoodRCT && !rctChecker.checkTable(collision)) { + continue; + } o2::aod::pwgem::dilepton::utils::eventhistogram::fillEventInfo<1, -1>(&fRegistry, collision); fRegistry.fill(HIST("Event/before/hCollisionCounter"), o2::aod::pwgem::dilepton::utils::eventhistogram::nbin_ev); // accepted fRegistry.fill(HIST("Event/after/hCollisionCounter"), o2::aod::pwgem::dilepton::utils::eventhistogram::nbin_ev); // accepted @@ -654,6 +667,9 @@ struct SingleTrackQC { if (!fEMEventCut.IsSelected(collision)) { continue; } + if (eventcuts.cfgRequireGoodRCT && !rctChecker.checkTable(collision)) { + continue; + } auto tracks_per_coll = tracks.sliceBy(perCollision, collision.globalIndex()); @@ -831,6 +847,9 @@ struct SingleTrackQC { if (!fEMEventCut.IsSelected(collision)) { continue; } + if (eventcuts.cfgRequireGoodRCT && !rctChecker.checkTable(collision)) { + continue; + } fRegistry.fill(HIST("Event/norm/hCollisionCounter"), o2::aod::pwgem::dilepton::utils::eventhistogram::nbin_ev); // accepted } // end of collision loop } @@ -839,17 +858,24 @@ struct SingleTrackQC { void processBC(aod::EMBCs const& bcs) { for (const auto& bc : bcs) { - if (bc.isTriggerTVX()) { + if (bc.selection_bit(o2::aod::evsel::kIsTriggerTVX)) { fRegistry.fill(HIST("BC/hTVXCounter"), 0.f); - if (bc.isNoTimeFrameBorder()) { + + if (bc.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { fRegistry.fill(HIST("BC/hTVXCounter"), 1.f); } - if (bc.isNoITSROFrameBorder()) { + if (bc.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { fRegistry.fill(HIST("BC/hTVXCounter"), 2.f); } - if (bc.isNoTimeFrameBorder() && bc.isNoITSROFrameBorder()) { + if (rctChecker(bc)) { fRegistry.fill(HIST("BC/hTVXCounter"), 3.f); } + if (bc.selection_bit(o2::aod::evsel::kNoTimeFrameBorder) && bc.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { + fRegistry.fill(HIST("BC/hTVXCounter"), 4.f); + } + if (bc.selection_bit(o2::aod::evsel::kNoTimeFrameBorder) && bc.selection_bit(o2::aod::evsel::kNoITSROFrameBorder) && rctChecker(bc)) { + fRegistry.fill(HIST("BC/hTVXCounter"), 5.f); + } } } } diff --git a/PWGEM/Dilepton/Core/SingleTrackQCMC.h b/PWGEM/Dilepton/Core/SingleTrackQCMC.h index f0cd021d0c6..1fa8b942c14 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQCMC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQCMC.h @@ -33,6 +33,7 @@ #include "DataFormatsParameters/GRPMagField.h" #include "CCDB/BasicCCDBManager.h" #include "Tools/ML/MlResponse.h" +#include "Common/CCDB/RCTSelectionFlags.h" #include "PWGEM/Dilepton/DataModel/dileptonTables.h" #include "PWGEM/Dilepton/Core/DielectronCut.h" @@ -116,6 +117,11 @@ struct SingleTrackQCMC { Configurable cfgRequireGoodITSLayer3{"cfgRequireGoodITSLayer3", false, "number of inactive chips on ITS layer 3 are below threshold "}; Configurable cfgRequireGoodITSLayer0123{"cfgRequireGoodITSLayer0123", false, "number of inactive chips on ITS layers 0-3 are below threshold "}; Configurable cfgRequireGoodITSLayersAll{"cfgRequireGoodITSLayersAll", false, "number of inactive chips on all ITS layers are below threshold "}; + // for RCT + Configurable cfgRequireGoodRCT{"cfgRequireGoodRCT", false, "require good detector flag in run condtion table"}; + Configurable cfgRCTLabel{"cfgRCTLabel", "CBT_hadronPID", "select 1 [CBT, CBT_hadron, CBT_muon_glo] see O2Physics/Common/CCDB/RCTSelectionFlags.h"}; + Configurable cfgCheckZDC{"cfgCheckZDC", false, "set ZDC flag for PbPb"}; + Configurable cfgTreatLimitedAcceptanceAsBad{"cfgTreatLimitedAcceptanceAsBad", false, "reject all events where the detectors relevant for the specified Runlist are flagged as LimitedAcceptance"}; } eventcuts; DielectronCut fDielectronCut; @@ -202,6 +208,7 @@ struct SingleTrackQCMC { Configurable enableTTCA{"enableTTCA", true, "Flag to enable or disable TTCA"}; } dimuoncuts; + o2::aod::rctsel::RCTFlagsChecker rctChecker; o2::ccdb::CcdbApi ccdbApi; Service ccdb; @@ -371,6 +378,7 @@ struct SingleTrackQCMC { ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); ccdb->setFatalWhenNull(false); + rctChecker.init(eventcuts.cfgRCTLabel.value, eventcuts.cfgCheckZDC.value, eventcuts.cfgTreatLimitedAcceptanceAsBad.value); DefineEMEventCut(); addhistograms(); @@ -386,11 +394,13 @@ struct SingleTrackQCMC { fRegistry.addClone("Event/before/hCollisionCounter", "Event/norm/hCollisionCounter"); } if (doprocessBC) { - auto hTVXCounter = fRegistry.add("BC/hTVXCounter", "TVX counter", kTH1D, {{4, -0.5f, 3.5f}}); + auto hTVXCounter = fRegistry.add("BC/hTVXCounter", "TVX counter", kTH1D, {{6, -0.5f, 5.5f}}); hTVXCounter->GetXaxis()->SetBinLabel(1, "TVX"); hTVXCounter->GetXaxis()->SetBinLabel(2, "TVX && NoTFB"); hTVXCounter->GetXaxis()->SetBinLabel(3, "TVX && NoITSROFB"); - hTVXCounter->GetXaxis()->SetBinLabel(4, "TVX && NoTFB && NoITSROFB"); + hTVXCounter->GetXaxis()->SetBinLabel(4, "TVX && GoodRCT"); + hTVXCounter->GetXaxis()->SetBinLabel(5, "TVX && NoTFB && NoITSROFB"); + hTVXCounter->GetXaxis()->SetBinLabel(6, "TVX && NoTFB && NoITSROFB && GoodRCT"); } } @@ -720,6 +730,9 @@ struct SingleTrackQCMC { if (!fEMEventCut.IsSelected(collision)) { continue; } + if (eventcuts.cfgRequireGoodRCT && !rctChecker.checkTable(collision)) { + continue; + } o2::aod::pwgem::dilepton::utils::eventhistogram::fillEventInfo<1, -1>(&fRegistry, collision); fRegistry.fill(HIST("Event/before/hCollisionCounter"), o2::aod::pwgem::dilepton::utils::eventhistogram::nbin_ev); // accepted fRegistry.fill(HIST("Event/after/hCollisionCounter"), o2::aod::pwgem::dilepton::utils::eventhistogram::nbin_ev); // accepted @@ -828,6 +841,9 @@ struct SingleTrackQCMC { if (!fEMEventCut.IsSelected(collision)) { continue; } + if (eventcuts.cfgRequireGoodRCT && !rctChecker.checkTable(collision)) { + continue; + } fRegistry.fill(HIST("MCEvent/after/hZvtx"), mccollision.posZ()); auto leptonsMC_per_coll = leptonsMC.sliceByCachedUnsorted(o2::aod::emmcparticle::emmceventId, mccollision.globalIndex(), cache); @@ -917,6 +933,9 @@ struct SingleTrackQCMC { if (!fEMEventCut.IsSelected(collision)) { continue; } + if (eventcuts.cfgRequireGoodRCT && !rctChecker.checkTable(collision)) { + continue; + } // auto mccollision = collision.template emmcevent_as(); // if (cfgEventGeneratorType >= 0 && mccollision.getSubGeneratorId() != cfgEventGeneratorType) { @@ -1117,6 +1136,9 @@ struct SingleTrackQCMC { if (!fEMEventCut.IsSelected(collision)) { continue; } + if (eventcuts.cfgRequireGoodRCT && !rctChecker.checkTable(collision)) { + continue; + } fRegistry.fill(HIST("Event/norm/hCollisionCounter"), o2::aod::pwgem::dilepton::utils::eventhistogram::nbin_ev); // accepted } // end of collision loop } @@ -1125,17 +1147,24 @@ struct SingleTrackQCMC { void processBC(aod::EMBCs const& bcs) { for (const auto& bc : bcs) { - if (bc.isTriggerTVX()) { + if (bc.selection_bit(o2::aod::evsel::kIsTriggerTVX)) { fRegistry.fill(HIST("BC/hTVXCounter"), 0.f); - if (bc.isNoTimeFrameBorder()) { + + if (bc.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { fRegistry.fill(HIST("BC/hTVXCounter"), 1.f); } - if (bc.isNoITSROFrameBorder()) { + if (bc.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { fRegistry.fill(HIST("BC/hTVXCounter"), 2.f); } - if (bc.isNoTimeFrameBorder() && bc.isNoITSROFrameBorder()) { + if (rctChecker(bc)) { fRegistry.fill(HIST("BC/hTVXCounter"), 3.f); } + if (bc.selection_bit(o2::aod::evsel::kNoTimeFrameBorder) && bc.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { + fRegistry.fill(HIST("BC/hTVXCounter"), 4.f); + } + if (bc.selection_bit(o2::aod::evsel::kNoTimeFrameBorder) && bc.selection_bit(o2::aod::evsel::kNoITSROFrameBorder) && rctChecker(bc)) { + fRegistry.fill(HIST("BC/hTVXCounter"), 5.f); + } } } } diff --git a/PWGEM/Dilepton/DataModel/dileptonTables.h b/PWGEM/Dilepton/DataModel/dileptonTables.h index b61a80a9758..58710293c0f 100644 --- a/PWGEM/Dilepton/DataModel/dileptonTables.h +++ b/PWGEM/Dilepton/DataModel/dileptonTables.h @@ -55,18 +55,18 @@ const std::unordered_map aliasLabels = { }; } // namespace pwgem::dilepton::swt -namespace embc -{ -DECLARE_SOA_COLUMN(IsTriggerTVX, isTriggerTVX, bool); //! kIsTriggerTVX -DECLARE_SOA_COLUMN(IsNoTimeFrameBorder, isNoTimeFrameBorder, bool); //! kIsNoTimeFrameBorder -DECLARE_SOA_COLUMN(IsNoITSROFrameBorder, isNoITSROFrameBorder, bool); //! kNoITSROFrameBorder -DECLARE_SOA_COLUMN(IsCollisionFound, isCollisionFound, bool); //! at least 1 collision is found in this BC. -} // namespace embc -DECLARE_SOA_TABLE(EMBCs, "AOD", "EMBC", //! bc information for normalization - o2::soa::Index<>, embc::IsTriggerTVX, embc::IsNoTimeFrameBorder, embc::IsNoITSROFrameBorder, embc::IsCollisionFound); - +// namespace embc +// { +// DECLARE_SOA_COLUMN(IsTriggerTVX, isTriggerTVX, bool); //! kIsTriggerTVX +// DECLARE_SOA_COLUMN(IsNoTimeFrameBorder, isNoTimeFrameBorder, bool); //! kIsNoTimeFrameBorder +// DECLARE_SOA_COLUMN(IsNoITSROFrameBorder, isNoITSROFrameBorder, bool); //! kNoITSROFrameBorder +// DECLARE_SOA_COLUMN(IsCollisionFound, isCollisionFound, bool); //! at least 1 collision is found in this BC. +// } // namespace embc // DECLARE_SOA_TABLE(EMBCs, "AOD", "EMBC", //! bc information for normalization -// o2::soa::Index<>, evsel::Alias, evsel::Selection, embc::IsCollisionFound); +// o2::soa::Index<>, embc::IsTriggerTVX, embc::IsNoTimeFrameBorder, embc::IsNoITSROFrameBorder, embc::IsCollisionFound); + +DECLARE_SOA_TABLE(EMBCs, "AOD", "EMBC", //! bc information for normalization + o2::soa::Index<>, evsel::Alias, evsel::Selection, evsel::Rct); using EMBC = EMBCs::iterator; namespace emevent @@ -226,7 +226,7 @@ DECLARE_SOA_TABLE(EMEoIs, "AOD", "EMEOI", //! joinable to aod::Collisions in cre using EMEoI = EMEoIs::iterator; DECLARE_SOA_TABLE(EMEventNormInfos, "AOD", "EMEVENTNORMINFO", //! event information for normalization - o2::soa::Index<>, evsel::Alias, evsel::Selection, emevent::PosZint16, cent::CentFT0C, emevent::PosZ, emevent::Sel8); + o2::soa::Index<>, evsel::Alias, evsel::Selection, evsel::Rct, emevent::PosZint16, cent::CentFT0C, emevent::PosZ, emevent::Sel8); using EMEventNormInfo = EMEventNormInfos::iterator; namespace emmcevent diff --git a/PWGEM/Dilepton/TableProducer/createEMEventDilepton.cxx b/PWGEM/Dilepton/TableProducer/createEMEventDilepton.cxx index 9cc02253636..253da4de3a6 100644 --- a/PWGEM/Dilepton/TableProducer/createEMEventDilepton.cxx +++ b/PWGEM/Dilepton/TableProducer/createEMEventDilepton.cxx @@ -144,8 +144,9 @@ struct CreateEMEventDilepton { { for (const auto& bc : bcs) { if (bc.selection_bit(o2::aod::evsel::kIsTriggerTVX)) { - const auto& collisions_perBC = collisions.sliceBy(perBC, bc.globalIndex()); - embc(bc.selection_bit(o2::aod::evsel::kIsTriggerTVX), bc.selection_bit(o2::aod::evsel::kNoTimeFrameBorder), bc.selection_bit(o2::aod::evsel::kNoITSROFrameBorder), static_cast(collisions_perBC.size() > 0)); // TVX is fired. + // const auto& collisions_perBC = collisions.sliceBy(perBC, bc.globalIndex()); + // embc(bc.selection_bit(o2::aod::evsel::kIsTriggerTVX), bc.selection_bit(o2::aod::evsel::kNoTimeFrameBorder), bc.selection_bit(o2::aod::evsel::kNoITSROFrameBorder), static_cast(collisions_perBC.size() > 0)); // TVX is fired. + embc(bc.alias_raw(), bc.selection_raw(), bc.rct_raw()); // TVX is fired. } } // end of bc loop @@ -160,15 +161,19 @@ struct CreateEMEventDilepton { auto bc = collision.template foundBC_as(); initCCDB(bc); + if (!collision.isSelected()) { // minimal cut for MB + continue; + } + if constexpr (eventtype == EMEventType::kEvent) { - event_norm_info(collision.alias_raw(), collision.selection_raw(), static_cast(10.f * collision.posZ()), 105.f); + event_norm_info(collision.alias_raw(), collision.selection_raw(), collision.rct_raw(), static_cast(10.f * collision.posZ()), 105.f); } else if constexpr (eventtype == EMEventType::kEvent_Cent || eventtype == EMEventType::kEvent_Cent_Qvec) { - event_norm_info(collision.alias_raw(), collision.selection_raw(), static_cast(10.f * collision.posZ()), collision.centFT0C()); + event_norm_info(collision.alias_raw(), collision.selection_raw(), collision.rct_raw(), static_cast(10.f * collision.posZ()), collision.centFT0C()); } else { - event_norm_info(collision.alias_raw(), collision.selection_raw(), static_cast(10.f * collision.posZ()), 105.f); + event_norm_info(collision.alias_raw(), collision.selection_raw(), collision.rct_raw(), static_cast(10.f * collision.posZ()), 105.f); } - if (!collision.isSelected() || !collision.isEoI()) { + if (!collision.isEoI()) { // events with at least 1 lepton for data reduction. continue; } diff --git a/PWGEM/Dilepton/TableProducer/eventSelection.cxx b/PWGEM/Dilepton/TableProducer/eventSelection.cxx index 5998ec355e5..65eb1a93d53 100644 --- a/PWGEM/Dilepton/TableProducer/eventSelection.cxx +++ b/PWGEM/Dilepton/TableProducer/eventSelection.cxx @@ -26,7 +26,6 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::soa; -// using namespace o2::aod::rctsel; using MyCollisions = soa::Join; using MyCollisions_Cent = soa::Join; @@ -41,12 +40,13 @@ struct EMEventSelection { Configurable cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"}; Configurable cfgCentMin{"cfgCentMin", -1.f, "min. centrality"}; Configurable cfgCentMax{"cfgCentMax", 999.f, "max. centrality"}; + + // for RCT + Configurable cfgRequireGoodRCT{"cfgRequireGoodRCT", false, "require good detector flag in run condtion table"}; Configurable cfgRCTLabel{"cfgRCTLabel", "CBT_hadronPID", "select 1 [CBT, CBT_hadron, CBT_muon_glo] see O2Physics/Common/CCDB/RCTSelectionFlags.h"}; Configurable cfgCheckZDC{"cfgCheckZDC", false, "set ZDC flag for PbPb"}; Configurable cfgTreatLimitedAcceptanceAsBad{"cfgTreatLimitedAcceptanceAsBad", false, "reject all events where the detectors relevant for the specified Runlist are flagged as LimitedAcceptance"}; - // Configurable> cfgRCTFlags{"cfgRCTFlags", std::vector{kFT0Bad, kITSBad, kTPCBadTracking, kTPCBadPID, kTOFBad}, "see O2Physics/Common/CCDB/RCTSelectionFlags.h for bit information"}; - Configurable cfgZvtxMin{"cfgZvtxMin", -1e+10, "min. Zvtx"}; Configurable cfgZvtxMax{"cfgZvtxMax", 1e+10, "max. Zvtx"}; Configurable cfgRequireSel8{"cfgRequireSel8", false, "require sel8 in event cut"}; @@ -65,7 +65,6 @@ struct EMEventSelection { void init(InitContext&) { - // rctChecker = o2::aod::rctsel::RCTFlagsChecker(cfgRCTLabel.value, cfgCheckZDC.value, cfgTreatLimitedAcceptanceAsBad.value); rctChecker.init(cfgRCTLabel.value, cfgCheckZDC.value, cfgTreatLimitedAcceptanceAsBad.value); } @@ -121,7 +120,7 @@ struct EMEventSelection { } } - if (!rctChecker.checkTable(collision)) { + if (cfgRequireGoodRCT && !rctChecker.checkTable(collision)) { // LOGF(info, "rejected by RCT flag"); return false; } From a6e576c3f7946dfe6041b252aa908d1b1be8e5b1 Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Mon, 14 Apr 2025 21:26:19 +0200 Subject: [PATCH 0985/1650] [PWGLF,Trigger] Add V0 with He3, triton femto, and tracked 3 body triggers (#10834) --- EventFiltering/PWGLF/nucleiFilter.cxx | 125 ++++++++++++++++++++------ EventFiltering/filterTables.h | 4 +- 2 files changed, 102 insertions(+), 27 deletions(-) diff --git a/EventFiltering/PWGLF/nucleiFilter.cxx b/EventFiltering/PWGLF/nucleiFilter.cxx index 33681d4ef5f..de8a35a4993 100644 --- a/EventFiltering/PWGLF/nucleiFilter.cxx +++ b/EventFiltering/PWGLF/nucleiFilter.cxx @@ -13,6 +13,8 @@ #include #include +#include "Math/Vector4D.h" +#include "Math/GenVector/Boost.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/PIDResponse.h" #include "Common/DataModel/TrackSelectionTables.h" @@ -37,6 +39,7 @@ #include "CCDB/BasicCCDBManager.h" #include "DCAFitter/DCAFitterN.h" #include "PWGLF/DataModel/pidTOFGeneric.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" #include "Common/Core/PID/PIDTOF.h" using namespace o2; @@ -47,8 +50,6 @@ namespace { static constexpr int nNuclei{3}; -static constexpr int nHyperNuclei{1}; -static constexpr int nITStriggers{2}; static constexpr int nCutsPID{5}; static constexpr std::array masses{ constants::physics::MassDeuteron, constants::physics::MassTriton, @@ -57,7 +58,7 @@ static constexpr std::array charges{1, 1, 2}; static const std::vector matterOrNot{"Matter", "Antimatter"}; static const std::vector nucleiNames{"H2", "H3", "Helium"}; static const std::vector hypernucleiNames{"H3L"}; // 3-body decay case -static const std::vector columnsNames{o2::aod::filtering::H2::columnLabel(), "fH3", o2::aod::filtering::He::columnLabel(), o2::aod::filtering::H3L3Body::columnLabel(), o2::aod::filtering::ITSmildIonisation::columnLabel(), o2::aod::filtering::ITSextremeIonisation::columnLabel()}; +static const std::vector columnsNames{o2::aod::filtering::H2::columnLabel(), o2::aod::filtering::He::columnLabel(), o2::aod::filtering::HeV0::columnLabel(), o2::aod::filtering::TritonFemto::columnLabel(), o2::aod::filtering::H3L3Body::columnLabel(), o2::aod::filtering::Tracked3Body::columnLabel(), o2::aod::filtering::ITSmildIonisation::columnLabel(), o2::aod::filtering::ITSextremeIonisation::columnLabel()}; static const std::vector cutsNames{ "TPCnSigmaMin", "TPCnSigmaMax", "TOFnSigmaMin", "TOFnSigmaMax", "TOFpidStartPt"}; constexpr double betheBlochDefault[nNuclei][6]{ @@ -100,13 +101,14 @@ struct nucleiFilter { Configurable cfgCutNclusTPC{"cfgCutNclusTPC", 80, "Minimum number of TPC clusters"}; Configurable cfgCutDCAxy{"cfgCutDCAxy", 3, "Max DCAxy"}; Configurable cfgCutDCAz{"cfgCutDCAz", 10, "Max DCAz"}; + Configurable cfgCutKstar{"cfgCutKstar", 1.f, "Kstar cut for triton femto trigger"}; Configurable> cfgBetheBlochParams{"cfgBetheBlochParams", {betheBlochDefault[0], nNuclei, 6, nucleiNames, betheBlochParNames}, "TPC Bethe-Bloch parameterisation for light nuclei"}; Configurable> cfgMomentumScalingBetheBloch{"cfgMomentumScalingBetheBloch", {bbMomScalingDefault[0], nNuclei, 2, nucleiNames, matterOrNot}, "TPC Bethe-Bloch momentum scaling for light nuclei"}; Configurable> cfgMinTPCmom{"cfgMinTPCmom", {minTPCmom[0], nNuclei, 2, nucleiNames, matterOrNot}, "Minimum TPC p/Z for nuclei PID"}; Configurable> cfgCutsPID{"nucleiCutsPID", {cutsPID[0], nNuclei, nCutsPID, nucleiNames, cutsNames}, "Nuclei PID selections"}; - Configurable fixTPCinnerParam{"fixTPCinnerParam", false, "Fix TPC inner param"}; + Configurable cfgFixTPCinnerParam{"cfgFixTPCinnerParam", false, "Fix TPC inner param"}; // variable/tool for hypertriton 3body decay int mRunNumber; @@ -160,9 +162,9 @@ struct nucleiFilter { } trgH3L3Body; HistogramRegistry qaHists{"qaHists", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; - OutputObj hProcessedEvents{TH1D("hProcessedEvents", ";;Number of filtered events", nNuclei + nHyperNuclei + nITStriggers + 1, -0.5, nNuclei + nHyperNuclei + nITStriggers + 0.5)}; + OutputObj hProcessedEvents{TH1D("hProcessedEvents", ";;Number of filtered events", kNtriggers + 1, -0.5, static_cast(kNtriggers) + 0.5)}; - void init(o2::framework::InitContext&) + void init(InitContext&) { std::vector ptBinning = {0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.8, 2.0, 2.2, 2.4, 2.8, 3.2, 3.6, 4., 5.}; @@ -313,27 +315,50 @@ struct nucleiFilter { bachelorTOFPID.SetParams(mRespParamsV2); } + enum { + kH2 = 0, + kHe, + kHeV0, + kTritonFemto, + kH3L3Body, + kTracked3Body, + kITSmildIonisation, + kITSextremeIonisation, + kNtriggers + } TriggerType; // void process(soa::Join::iterator const& collision, aod::Vtx3BodyDatas const& vtx3bodydatas, TrackCandidates const& tracks) using ColWithEvTime = soa::Join; - void process(ColWithEvTime::iterator const& collision, aod::Decay3Bodys const& decay3bodys, TrackCandidates const& tracks, aod::BCsWithTimestamps const&) + void process(ColWithEvTime::iterator const& collision, aod::Decay3Bodys const& decay3bodys, TrackCandidates const& tracks, aod::AssignedTracked3Bodys const& tracked3Bodys, aod::V0s const& v0s, aod::BCsWithTimestamps const&) { // collision process loop - bool keepEvent[nNuclei + nHyperNuclei + nITStriggers]{false}; + std::array keepEvent{false}; // qaHists.fill(HIST("fCollZpos"), collision.posZ()); hProcessedEvents->Fill(0); // if (!collision.selection_bit(aod::evsel::kNoTimeFrameBorder)) { - tags(keepEvent[0], keepEvent[2], keepEvent[3], keepEvent[4], keepEvent[5]); + tags(keepEvent[kH2], keepEvent[kHe], keepEvent[kHeV0], keepEvent[kTritonFemto], keepEvent[kH3L3Body], keepEvent[kTracked3Body], keepEvent[kITSmildIonisation], keepEvent[kITSextremeIonisation]); return; } + // const double bgScalings[nNuclei][2]{ {charges[0] * cfgMomentumScalingBetheBloch->get(0u, 0u) / masses[0], charges[0] * cfgMomentumScalingBetheBloch->get(0u, 1u) / masses[0]}, {charges[1] * cfgMomentumScalingBetheBloch->get(1u, 0u) / masses[1], charges[1] * cfgMomentumScalingBetheBloch->get(1u, 1u) / masses[1]}, {charges[2] * cfgMomentumScalingBetheBloch->get(2u, 0u) / masses[2], charges[2] * cfgMomentumScalingBetheBloch->get(2u, 1u) / masses[2]}}; - for (auto& track : tracks) { // start loop over tracks + constexpr int nucleusIndex[nNuclei]{kH2, -1, kHe}; /// remap for nuclei triggers + std::vector h3indices; + std::vector h3vectors; + + auto getNsigma = [&](const auto& track, int iN, int iC) { + float fixTPCrigidity{(cfgFixTPCinnerParam && (track.pidForTracking() == track::PID::Helium3 || track.pidForTracking() == track::PID::Alpha)) ? 0.5f : 1.f}; + double expBethe{tpc::BetheBlochAleph(static_cast(track.tpcInnerParam() * fixTPCrigidity * bgScalings[iN][iC]), cfgBetheBlochParams->get(iN, 0u), cfgBetheBlochParams->get(iN, 1u), cfgBetheBlochParams->get(iN, 2u), cfgBetheBlochParams->get(iN, 3u), cfgBetheBlochParams->get(iN, 4u))}; + double expSigma{expBethe * cfgBetheBlochParams->get(iN, 5u)}; + return static_cast((track.tpcSignal() - expBethe) / expSigma); + }; + + for (const auto& track : tracks) { // start loop over tracks if (track.itsNCls() >= cfgCutNclusExtremeIonisationITS) { double avgClsSize{0.}; double cosL{std::sqrt(1. / (1. + track.tgl() * track.tgl()))}; @@ -342,8 +367,8 @@ struct nucleiFilter { } avgClsSize = avgClsSize * cosL / track.itsNCls(); qaHists.fill(HIST("fExtremeIonisationITS"), track.itsNCls(), avgClsSize, track.p()); - keepEvent[4] = track.p() > cfgMomentumCutExtremeIonisation && avgClsSize > cfgCutClsSizeMildIonisation; - keepEvent[5] = track.p() > cfgMomentumCutExtremeIonisation && avgClsSize > cfgCutClsSizeExtremeIonisation; + keepEvent[kITSmildIonisation] = track.p() > cfgMomentumCutExtremeIonisation && avgClsSize > cfgCutClsSizeMildIonisation; + keepEvent[kITSextremeIonisation] = track.p() > cfgMomentumCutExtremeIonisation && avgClsSize > cfgCutClsSizeExtremeIonisation; } if (track.itsNCls() < cfgCutNclusITS || track.tpcNClsFound() < cfgCutNclusTPC) { @@ -354,10 +379,8 @@ struct nucleiFilter { qaHists.fill(HIST("fDeuTOFNsigma"), track.p() * track.sign(), track.tofNSigmaDe()); } - if (track.sign() > 0 && (std::abs(track.dcaXY()) > cfgCutDCAxy || - std::abs(track.dcaZ()) > cfgCutDCAz)) { - continue; - } + bool passesDCAselection{(track.sign() < 0 || (std::abs(track.dcaXY()) < cfgCutDCAxy && + std::abs(track.dcaZ()) < cfgCutDCAz))}; float nSigmaTPC[nNuclei]{ track.tpcNSigmaDe(), track.tpcNSigmaTr(), track.tpcNSigmaHe()}; @@ -365,7 +388,7 @@ struct nucleiFilter { track.tofNSigmaDe(), track.tofNSigmaTr(), track.tofNSigmaHe()}; const int iC{track.sign() < 0}; - float fixTPCrigidity{(fixTPCinnerParam && (track.pidForTracking() == track::PID::Helium3 || track.pidForTracking() == track::PID::Alpha)) ? 0.5f : 1.f}; + float fixTPCrigidity{(cfgFixTPCinnerParam && (track.pidForTracking() == track::PID::Helium3 || track.pidForTracking() == track::PID::Alpha)) ? 0.5f : 1.f}; // fill QA hist: dEdx for all charged tracks qaHists.fill(HIST("fTPCsignalAll"), track.sign() * track.tpcInnerParam() * fixTPCrigidity, track.tpcSignal()); @@ -377,9 +400,7 @@ struct nucleiFilter { } if (cfgBetheBlochParams->get(iN, 5u) > 0.f) { - double expBethe{tpc::BetheBlochAleph(static_cast(track.tpcInnerParam() * fixTPCrigidity * bgScalings[iN][iC]), cfgBetheBlochParams->get(iN, 0u), cfgBetheBlochParams->get(iN, 1u), cfgBetheBlochParams->get(iN, 2u), cfgBetheBlochParams->get(iN, 3u), cfgBetheBlochParams->get(iN, 4u))}; - double expSigma{expBethe * cfgBetheBlochParams->get(iN, 5u)}; - nSigmaTPC[iN] = static_cast((track.tpcSignal() - expBethe) / expSigma); + nSigmaTPC[iN] = getNsigma(track, iN, iC); } h2TPCnSigma[iN]->Fill(track.sign() * track.tpcInnerParam() * fixTPCrigidity, nSigmaTPC[iN]); if (nSigmaTPC[iN] < cfgCutsPID->get(iN, 0u) || nSigmaTPC[iN] > cfgCutsPID->get(iN, 1u)) { @@ -388,12 +409,61 @@ struct nucleiFilter { if (track.p() > cfgCutsPID->get(iN, 4u) && (nSigmaTOF[iN] < cfgCutsPID->get(iN, 2u) || nSigmaTOF[iN] > cfgCutsPID->get(iN, 3u))) { continue; } - keepEvent[iN] = true; - if (keepEvent[iN]) { + if (iN == 1 && passesDCAselection) { + h3indices.push_back(track.globalIndex()); + h3vectors.emplace_back(track.pt(), track.eta(), track.phi(), masses[iN]); + } + if (nucleusIndex[iN] < 0) { + continue; + } + keepEvent[nucleusIndex[iN]] = passesDCAselection; + if (keepEvent[nucleusIndex[iN]]) { h2TPCsignal[iN]->Fill(track.sign() * track.tpcInnerParam() * fixTPCrigidity, track.tpcSignal()); } } + for (const auto& track : tracks) { + if (track.itsNCls() < cfgCutNclusITS || + track.tpcNClsFound() < cfgCutNclusTPC || + std::abs(track.dcaXY()) > cfgCutDCAxy || + std::abs(track.dcaZ()) > cfgCutDCAz || + std::abs(track.eta()) > cfgCutEta) { + continue; + } + const ROOT::Math::PtEtaPhiMVector trackVector(track.pt(), track.eta(), track.phi(), constants::physics::MassPiMinus); + for (size_t iH3{0}; iH3 < h3vectors.size(); ++iH3) { + if (h3indices[iH3] == track.globalIndex()) { + continue; + } + const auto& h3vector = h3vectors[iH3]; + auto pivector = trackVector; + auto cm = h3vector + trackVector; + const ROOT::Math::Boost boost(cm.BoostToCM()); + boost(pivector); + if (pivector.P() < cfgCutKstar) { + keepEvent[kTritonFemto] = true; + break; + } + } + } + + for (const auto& v0 : v0s) { + const auto& posTrack = tracks.rawIteratorAt(v0.posTrackId()); + const auto& negTrack = tracks.rawIteratorAt(v0.negTrackId()); + if ((posTrack.itsNCls() < cfgCutNclusITS || posTrack.tpcNClsFound() < cfgCutNclusTPC) && + (negTrack.itsNCls() < cfgCutNclusITS || negTrack.tpcNClsFound() < cfgCutNclusTPC)) { + continue; + } + float nSigmas[2]{ + cfgBetheBlochParams->get(2, 5u) > 0.f ? getNsigma(posTrack, 2, 0) : posTrack.tpcNSigmaHe(), + cfgBetheBlochParams->get(2, 5u) > 0.f ? getNsigma(negTrack, 2, 1) : negTrack.tpcNSigmaHe()}; + if ((nSigmas[0] > cfgCutsPID->get(2, 0u) && nSigmas[0] < cfgCutsPID->get(2, 1u)) || + (nSigmas[1] > cfgCutsPID->get(2, 0u) && nSigmas[1] < cfgCutsPID->get(2, 1u))) { + keepEvent[kHeV0] = true; + break; + } + } + // // fill QA histograms // @@ -531,7 +601,7 @@ struct nucleiFilter { qaHists.fill(HIST("fBachDeuTOFNsigma"), track2.p() * track2.sign(), tofNSigmaDeuteron); qaHists.fill(HIST("fH3LDcaVsPt"), pt3B, dcaDaughters); qaHists.fill(HIST("fH3LCosPAVsPt"), pt3B, vtxCosPA); - keepEvent[3] = true; + keepEvent[kH3L3Body] = true; } } if (invmassAntiH3L >= trgH3L3Body.h3LMassLowerlimit && invmassAntiH3L <= trgH3L3Body.h3LMassUpperlimit) { @@ -541,17 +611,20 @@ struct nucleiFilter { qaHists.fill(HIST("fBachDeuTOFNsigma"), track2.p() * track2.sign(), tofNSigmaDeuteron); qaHists.fill(HIST("fH3LDcaVsPt"), pt3B, dcaDaughters); qaHists.fill(HIST("fH3LCosPAVsPt"), pt3B, vtxCosPA); - keepEvent[3] = true; + keepEvent[kH3L3Body] = true; } } } - for (int iDecision{0}; iDecision < nNuclei + nHyperNuclei + nITStriggers; ++iDecision) { + keepEvent[kTracked3Body] = tracked3Bodys.size() > 0; + + for (int iDecision{0}; iDecision < kNtriggers; ++iDecision) { if (keepEvent[iDecision]) { hProcessedEvents->Fill(iDecision + 1); } } - tags(keepEvent[0], keepEvent[2], keepEvent[3], keepEvent[4], keepEvent[5]); + + tags(keepEvent[kH2], keepEvent[kHe], keepEvent[kHeV0], keepEvent[kTritonFemto], keepEvent[kH3L3Body], keepEvent[kTracked3Body], keepEvent[kITSmildIonisation], keepEvent[kITSextremeIonisation]); } }; diff --git a/EventFiltering/filterTables.h b/EventFiltering/filterTables.h index 313edba6e16..7ec3b46ccaa 100644 --- a/EventFiltering/filterTables.h +++ b/EventFiltering/filterTables.h @@ -48,6 +48,8 @@ namespace filtering { DECLARE_SOA_COLUMN(H2, hasH2, bool); //! deuteron trigger for the helium normalisation (to be downscaled) DECLARE_SOA_COLUMN(He, hasHe, bool); //! helium +DECLARE_SOA_COLUMN(HeV0, hasHeV0, bool); //! V0 containing a V0 +DECLARE_SOA_COLUMN(TritonFemto, hasTritonFemto, bool); //! Triton hadron femtoscopy DECLARE_SOA_COLUMN(H3L3Body, hasH3L3Body, bool); //! hypertriton 3body DECLARE_SOA_COLUMN(ITSextremeIonisation, hasITSextremeIonisation, bool); //! ITS extreme ionisation DECLARE_SOA_COLUMN(ITSmildIonisation, hasITSmildIonisation, bool); //! ITS mild ionisation (normalisation of the extreme ionisation), to be downscaled @@ -215,7 +217,7 @@ DECLARE_SOA_COLUMN(BCend, hasBCend, uint64_t); //! CEFP bcrange // nuclei DECLARE_SOA_TABLE(NucleiFilters, "AOD", "NucleiFilters", //! - filtering::H2, filtering::He, filtering::H3L3Body, filtering::ITSmildIonisation, + filtering::H2, filtering::He, filtering::HeV0, filtering::TritonFemto, filtering::H3L3Body, filtering::Tracked3Body, filtering::ITSmildIonisation, filtering::ITSextremeIonisation); using NucleiFilter = NucleiFilters::iterator; From da4adf53f162455ea2f5e6886172b06140a68b55 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Mon, 14 Apr 2025 21:30:36 +0200 Subject: [PATCH 0986/1650] [PWGEM/Dilepton] update matchingMFT.cxx (#10849) --- PWGEM/Dilepton/Tasks/matchingMFT.cxx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/PWGEM/Dilepton/Tasks/matchingMFT.cxx b/PWGEM/Dilepton/Tasks/matchingMFT.cxx index 5821b58a8f7..ed467b8d715 100644 --- a/PWGEM/Dilepton/Tasks/matchingMFT.cxx +++ b/PWGEM/Dilepton/Tasks/matchingMFT.cxx @@ -69,6 +69,7 @@ struct matchingMFT { Configurable maxMatchingChi2MCHMFT{"maxMatchingChi2MCHMFT", 1e+10, "max. chi2 for MCH-MFT matching"}; Configurable maxChi2SA{"maxChi2SA", 1e+6, "max. chi2 for standalone muon"}; Configurable maxChi2GL{"maxChi2GL", 1e+6, "max. chi2 for global muon"}; + Configurable minNclustersMFT{"minNclustersMFT", 5, "min nclusters MFT"}; Configurable refitGlobalMuon{"refitGlobalMuon", true, "flag to refit global muon"}; Configurable requireTrueAssociation{"requireTrueAssociation", false, "flag to require true mc collision association"}; @@ -236,6 +237,10 @@ struct matchingMFT { return; } + if (mfttrack.nClusters() < minNclustersMFT) { + return; + } + if (std::abs(mcParticle_MCHMID.pdgCode()) != 13) { // select true muon return; } From ce3bd63c6ad023655c40b436d65c52bbdeaf07f8 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Mon, 14 Apr 2025 22:54:29 +0200 Subject: [PATCH 0987/1650] [PWGLF] Add new variable in THnSparse (#10850) --- PWGLF/Tasks/Resonances/doublephimeson.cxx | 166 ++++++---------------- 1 file changed, 40 insertions(+), 126 deletions(-) diff --git a/PWGLF/Tasks/Resonances/doublephimeson.cxx b/PWGLF/Tasks/Resonances/doublephimeson.cxx index 95296b748ad..fd0e6acac71 100644 --- a/PWGLF/Tasks/Resonances/doublephimeson.cxx +++ b/PWGLF/Tasks/Resonances/doublephimeson.cxx @@ -41,14 +41,13 @@ using namespace o2::soa; struct doublephimeson { HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; - Configurable fillDeltaMass{"fillDeltaMass", 1, "Fill Delta Mass"}; - Configurable fillRotation{"fillRotation", 1, "Fill rotation"}; Configurable strategyPID1{"strategyPID1", 0, "PID strategy 1"}; Configurable strategyPID2{"strategyPID2", 0, "PID strategy 2"}; Configurable minPhiMass{"minPhiMass", 1.01, "Minimum phi mass"}; Configurable maxPhiMass{"maxPhiMass", 1.03, "Maximum phi mass"}; Configurable additionalEvsel{"additionalEvsel", false, "Additional event selection"}; - Configurable cutNsigmaTPC{"cutNsigmaTPC", 2.5, "nsigma cut TPC"}; + Configurable cutMinNsigmaTPC{"cutMinNsigmaTPC", -2.5, "nsigma cut TPC"}; + Configurable cutNsigmaTPC{"cutNsigmaTPC", 3.0, "nsigma cut TPC"}; Configurable cutNsigmaTOF{"cutNsigmaTOF", 3.0, "nsigma cut TOF"}; // Event Mixing Configurable nEvtMixing{"nEvtMixing", 10, "Number of events to mix"}; @@ -62,8 +61,8 @@ struct doublephimeson { ConfigurableAxis configThnAxisPt{"configThnAxisPt", {40, 0.0, 20.}, "#it{p}_{T} (GeV/#it{c})"}; ConfigurableAxis configThnAxisKstar{"configThnAxisKstar", {200, 0.0, 2.0}, "#it{k}^{*} (GeV/#it{c})"}; ConfigurableAxis configThnAxisDeltaR{"configThnAxisDeltaR", {200, 0.0, 2.0}, "#it{k}^{*} (GeV/#it{c})"}; - ConfigurableAxis configThnAxisCosTheta{"configThnAxisCosTheta", {5, 0.0, 1.0}, "cos #theta{*}"}; - // ConfigurableAxis configThnAxisPhiMult{"configThnAxisPhiMult", {10, 0.5, 10.5}, "#Phi Multiplicity"}; + ConfigurableAxis configThnAxisCosTheta{"configThnAxisCosTheta", {100, -1.0, 1.0}, "cos #theta{*}"}; + ConfigurableAxis configThnAxisNumPhi{"configThnAxisNumPhi", {101, -0.5, 100.5}, "cos #theta{*}"}; // Initialize the ananlysis task void init(o2::framework::InitContext&) @@ -71,21 +70,17 @@ struct doublephimeson { // register histograms histos.add("hnsigmaTPCKaonPlus", "hnsigmaTPCKaonPlus", kTH2F, {{1000, -3.0, 3.0f}, {100, 0.0f, 10.0f}}); histos.add("hnsigmaTPCKaonMinus", "hnsigmaTPCKaonMinus", kTH2F, {{1000, -3.0, 3.0f}, {100, 0.0f, 10.0f}}); - histos.add("hPhid1Mass", "hPhid1Mass", kTH2F, {{40, 1.0, 1.04f}, {100, 0.0f, 10.0f}}); - histos.add("hPhid2Mass", "hPhid2Mass", kTH2F, {{40, 1.0, 1.04f}, {100, 0.0f, 10.0f}}); + histos.add("hPhiMass", "hPhiMass", kTH2F, {{40, 1.0, 1.04f}, {100, 0.0f, 10.0f}}); const AxisSpec thnAxisInvMass{configThnAxisInvMass, "#it{M} (GeV/#it{c}^{2})"}; const AxisSpec thnAxisInvMassPhi{configThnAxisInvMassPhi, "#it{M} (GeV/#it{c}^{2})"}; - const AxisSpec thnAxisDaughterPt{configThnAxisDaugherPt, "#it{p}_{T} (GeV/#it{c})"}; const AxisSpec thnAxisPt{configThnAxisPt, "#it{p}_{T} (GeV/#it{c})"}; - const AxisSpec thnAxisKstar{configThnAxisKstar, "#it{k}^{*} (GeV/#it{c})"}; const AxisSpec thnAxisDeltaR{configThnAxisDeltaR, "#Delta R)"}; - const AxisSpec thnAxisCosTheta{configThnAxisCosTheta, "cos #theta{*}"}; - // const AxisSpec thnAxisPhiMult{configThnAxisPhiMult, "#Phi Multiplicity)"}; - histos.add("SEMass", "SEMass", HistType::kTHnSparseF, {thnAxisInvMassPhi, thnAxisInvMassPhi, thnAxisDaughterPt, thnAxisDaughterPt}); - histos.add("SEMassUnlike", "SEMassUnlike", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisKstar, thnAxisCosTheta, thnAxisDeltaR}); - histos.add("SEMassRot", "SEMassRot", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisKstar, thnAxisCosTheta, thnAxisDeltaR}); - histos.add("MEMassUnlike", "MEMassUnlike", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisKstar, thnAxisCosTheta, thnAxisDeltaR}); + const AxisSpec thnAxisCosTheta{configThnAxisCosTheta, "cos #theta"}; + const AxisSpec thnAxisNumPhi{configThnAxisNumPhi, "Number of phi meson"}; + + histos.add("SEMassUnlike", "SEMassUnlike", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisDeltaR, thnAxisCosTheta, thnAxisInvMassPhi, thnAxisInvMassPhi, thnAxisNumPhi}); + histos.add("MEMassUnlike", "MEMassUnlike", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisDeltaR, thnAxisCosTheta, thnAxisInvMassPhi, thnAxisInvMassPhi, thnAxisNumPhi}); } // get kstar @@ -132,78 +127,36 @@ struct doublephimeson { bool selectionPID(float nsigmaTPC, float nsigmaTOF, int TOFHit, int PIDStrategy, float ptcand) { if (PIDStrategy == 0) { - if (TOFHit != 1) { - if (TMath::Abs(nsigmaTPC) < cutNsigmaTPC) { - return true; - } - } - if (TOFHit == 1) { - if (TMath::Abs(nsigmaTOF) < cutNsigmaTOF) { - return true; - } - } - } - if (PIDStrategy == 1) { if (ptcand < 0.5) { - if (TOFHit != 1 && TMath::Abs(nsigmaTPC) < cutNsigmaTPC) { - return true; - } - if (TOFHit == 1 && TMath::Abs(nsigmaTOF) < cutNsigmaTOF) { + if (nsigmaTPC > cutMinNsigmaTPC && nsigmaTPC < cutNsigmaTPC) { return true; } } if (ptcand >= 0.5) { - if (TOFHit == 1 && TMath::Abs(nsigmaTOF) < cutNsigmaTOF) { - return true; - } - } - } - if (PIDStrategy == 2) { - if (ptcand < 0.5) { - if (TOFHit != 1 && TMath::Abs(nsigmaTPC) < cutNsigmaTPC) { - return true; - } - if (TOFHit == 1 && TMath::Abs(nsigmaTOF) < cutNsigmaTOF) { - return true; - } - } - if (ptcand >= 0.5 && ptcand < 1.2) { - if (TOFHit == 1 && TMath::Abs(nsigmaTOF) < cutNsigmaTOF) { - return true; - } - if (TOFHit != 1 && nsigmaTPC > -1.5 && nsigmaTPC < cutNsigmaTPC) { - return true; - } - } - if (ptcand >= 1.2) { - if (TOFHit == 1 && TMath::Abs(nsigmaTOF) < cutNsigmaTOF) { - return true; + if (TOFHit != 1) { + if (nsigmaTPC > cutMinNsigmaTPC && nsigmaTPC < cutNsigmaTPC) { + return true; + } } - if (TOFHit != 1 && TMath::Abs(nsigmaTPC) < cutNsigmaTPC) { - return true; + if (TOFHit == 1) { + if (nsigmaTPC > cutMinNsigmaTPC && nsigmaTPC < cutNsigmaTPC && TMath::Abs(nsigmaTOF) < cutNsigmaTOF) { + return true; + } } } } - if (PIDStrategy == 3) { + + if (PIDStrategy == 1) { if (ptcand < 0.5) { - if (TOFHit != 1 && TMath::Abs(nsigmaTPC) < cutNsigmaTPC) { - return true; - } - if (TOFHit == 1 && TMath::Abs(nsigmaTOF) < cutNsigmaTOF) { + if (nsigmaTPC > cutMinNsigmaTPC && nsigmaTPC < cutNsigmaTPC) { return true; } } - if (ptcand >= 0.5 && ptcand < 1.2) { - if (TOFHit == 1 && TMath::Abs(nsigmaTOF) < cutNsigmaTOF) { - return true; - } - } - if (ptcand >= 1.2) { - if (TOFHit == 1 && TMath::Abs(nsigmaTOF) < cutNsigmaTOF) { - return true; - } - if (TOFHit != 1 && TMath::Abs(nsigmaTPC) < cutNsigmaTPC) { - return true; + if (ptcand >= 0.5) { + if (TOFHit == 1) { + if (nsigmaTPC > cutMinNsigmaTPC && nsigmaTPC < cutNsigmaTPC && TMath::Abs(nsigmaTOF) < cutNsigmaTOF) { + return true; + } } } } @@ -211,32 +164,31 @@ struct doublephimeson { } TLorentzVector exotic, Phid1, Phid2; - TLorentzVector exoticRot, Phid1Rot; + // TLorentzVector exoticRot, Phid1Rot; + void process(aod::RedPhiEvents::iterator const& collision, aod::PhiTracks const& phitracks) { if (additionalEvsel && (collision.numPos() < 2 || collision.numNeg() < 2)) { return; } + auto phimult = phitracks.size(); for (auto phitrackd1 : phitracks) { if (phitrackd1.phiMass() < minPhiMass || phitrackd1.phiMass() > maxPhiMass) { continue; } - auto kaonplusd1pt = TMath::Sqrt(phitrackd1.phid1Px() * phitrackd1.phid1Px() + phitrackd1.phid1Py() * phitrackd1.phid1Py()); auto kaonminusd1pt = TMath::Sqrt(phitrackd1.phid2Px() * phitrackd1.phid2Px() + phitrackd1.phid2Py() * phitrackd1.phid2Py()); - if (!selectionPID(phitrackd1.phid1TPC(), phitrackd1.phid1TOF(), phitrackd1.phid1TOFHit(), strategyPID1, kaonplusd1pt)) { continue; } if (!selectionPID(phitrackd1.phid2TPC(), phitrackd1.phid2TOF(), phitrackd1.phid2TOFHit(), strategyPID1, kaonminusd1pt)) { continue; } - // LOGF(info, "pass TOF hit: (%d, %d)", phitrackd1.phid1TOFHit(), phitrackd1.phid2TOFHit()); + auto phid1id = phitrackd1.index(); + Phid1.SetXYZM(phitrackd1.phiPx(), phitrackd1.phiPy(), phitrackd1.phiPz(), phitrackd1.phiMass()); histos.fill(HIST("hnsigmaTPCKaonPlus"), phitrackd1.phid1TPC(), kaonplusd1pt); histos.fill(HIST("hnsigmaTPCKaonMinus"), phitrackd1.phid2TPC(), kaonminusd1pt); - Phid1.SetXYZM(phitrackd1.phiPx(), phitrackd1.phiPy(), phitrackd1.phiPz(), phitrackd1.phiMass()); - histos.fill(HIST("hPhid1Mass"), Phid1.M(), Phid1.Pt()); - auto phid1id = phitrackd1.index(); + histos.fill(HIST("hPhiMass"), Phid1.M(), Phid1.Pt()); for (auto phitrackd2 : phitracks) { auto phid2id = phitrackd2.index(); if (phid2id <= phid1id) { @@ -247,7 +199,6 @@ struct doublephimeson { } auto kaonplusd2pt = TMath::Sqrt(phitrackd2.phid1Px() * phitrackd2.phid1Px() + phitrackd2.phid1Py() * phitrackd2.phid1Py()); auto kaonminusd2pt = TMath::Sqrt(phitrackd2.phid2Px() * phitrackd2.phid2Px() + phitrackd2.phid2Py() * phitrackd2.phid2Py()); - if (!selectionPID(phitrackd2.phid1TPC(), phitrackd2.phid1TOF(), phitrackd2.phid1TOFHit(), strategyPID2, kaonplusd2pt)) { continue; } @@ -262,37 +213,11 @@ struct doublephimeson { } Phid2.SetXYZM(phitrackd2.phiPx(), phitrackd2.phiPy(), phitrackd2.phiPz(), phitrackd2.phiMass()); exotic = Phid1 + Phid2; - auto cosThetaStar = getCosTheta(exotic, Phid1); - auto kstar = getkstar(Phid1, Phid2); + // auto cosThetaStar = getCosTheta(exotic, Phid1); + // auto kstar = getkstar(Phid1, Phid2); auto deltaR = TMath::Sqrt(TMath::Power(Phid1.Phi() - Phid2.Phi(), 2.0) + TMath::Power(Phid1.Eta() - Phid2.Eta(), 2.0)); - if (!fillDeltaMass) { - histos.fill(HIST("SEMassUnlike"), exotic.M(), exotic.Pt(), kstar, cosThetaStar, deltaR); - } - if (fillDeltaMass) { - histos.fill(HIST("SEMassUnlike"), exotic.M() - Phid1.M(), exotic.Pt(), kstar, cosThetaStar, deltaR); - } - histos.fill(HIST("SEMass"), Phid1.M(), Phid2.M(), Phid1.Pt(), Phid2.Pt()); - if (fillRotation) { - for (int nrotbkg = 0; nrotbkg < 5; nrotbkg++) { - auto anglestart = 5.0 * TMath::Pi() / 6.0; - auto angleend = 7.0 * TMath::Pi() / 6.0; - auto anglestep = (angleend - anglestart) / (1.0 * (9.0 - 1.0)); - auto rotangle = anglestart + nrotbkg * anglestep; - auto rotd1px = Phid1.Px() * std::cos(rotangle) - Phid1.Py() * std::sin(rotangle); - auto rotd1py = Phid1.Px() * std::sin(rotangle) + Phid1.Py() * std::cos(rotangle); - Phid1Rot.SetXYZM(rotd1px, rotd1py, Phid1.Pz(), Phid1.M()); - exoticRot = Phid1Rot + Phid2; - auto cosThetaStar_rot = getCosTheta(exoticRot, Phid1Rot); - auto kstar_rot = getkstar(Phid1Rot, Phid2); - auto deltaR_rot = TMath::Sqrt(TMath::Power(Phid1Rot.Phi() - Phid2.Phi(), 2.0) + TMath::Power(Phid1Rot.Eta() - Phid2.Eta(), 2.0)); - if (!fillDeltaMass) { - histos.fill(HIST("SEMassRot"), exoticRot.M(), exoticRot.Pt(), kstar_rot, cosThetaStar_rot, deltaR_rot); - } - if (fillDeltaMass) { - histos.fill(HIST("SEMassRot"), exoticRot.M() - Phid1Rot.M(), exoticRot.Pt(), kstar_rot, cosThetaStar_rot, deltaR_rot); - } - } - } + auto costheta = (Phid1.Px() * Phid2.Px() + Phid1.Py() * Phid2.Py() + Phid1.Pz() * Phid2.Pz()) / (Phid1.P() * Phid2.P()); + histos.fill(HIST("SEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, costheta, Phid1.M(), Phid2.M(), phimult); } } } @@ -309,12 +234,7 @@ struct doublephimeson { if (collision1.index() == collision2.index()) { continue; } - if (additionalEvsel && (collision1.numPos() < 2 || collision1.numNeg() < 2)) { - continue; - } - if (additionalEvsel && (collision2.numPos() < 2 || collision2.numNeg() < 2)) { - continue; - } + auto phimult = tracks1.size(); for (auto& [phitrackd1, phitrackd2] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { if (phitrackd1.phiMass() < minPhiMass || phitrackd1.phiMass() > maxPhiMass) { continue; @@ -341,15 +261,9 @@ struct doublephimeson { } Phid2.SetXYZM(phitrackd2.phiPx(), phitrackd2.phiPy(), phitrackd2.phiPz(), phitrackd2.phiMass()); exotic = Phid1 + Phid2; - auto cosThetaStar = getCosTheta(exotic, Phid1); - auto kstar = getkstar(Phid1, Phid2); auto deltaR = TMath::Sqrt(TMath::Power(Phid1.Phi() - Phid2.Phi(), 2.0) + TMath::Power(Phid1.Eta() - Phid2.Eta(), 2.0)); - if (!fillDeltaMass) { - histos.fill(HIST("MEMassUnlike"), exotic.M(), exotic.Pt(), kstar, cosThetaStar, deltaR); - } - if (fillDeltaMass) { - histos.fill(HIST("MEMassUnlike"), exotic.M() - Phid1.M(), exotic.Pt(), kstar, cosThetaStar, deltaR); - } + auto costheta = (Phid1.Px() * Phid2.Px() + Phid1.Py() * Phid2.Py() + Phid1.Pz() * Phid2.Pz()) / (Phid1.P() * Phid2.P()); + histos.fill(HIST("MEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, costheta, Phid1.M(), Phid2.M(), phimult); } } } From 223330808c6c2a30f9e5361c0d2b7c2704548bd0 Mon Sep 17 00:00:00 2001 From: sangwoo <141385263+sangwoo184@users.noreply.github.com> Date: Tue, 15 Apr 2025 11:13:15 +0900 Subject: [PATCH 0988/1650] [PWGLF] Add and fix for code test using kaon (#10776) Co-authored-by: sangwoo --- PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx | 141 +++++++++++++------ 1 file changed, 99 insertions(+), 42 deletions(-) diff --git a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx index a1c2ebf3f8c..9bc3c7d40f9 100644 --- a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx +++ b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx @@ -60,13 +60,17 @@ #include "CCDB/CcdbApi.h" #include "CCDB/BasicCCDBManager.h" +// from phi +#include "PWGLF/DataModel/EPCalibrationTables.h" +#include "Common/DataModel/PIDResponseITS.h" + using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::soa; using namespace o2::constants::physics; -struct f0980pbpbanalysis { +struct F0980pbpbanalysis { HistogramRegistry histos{ "histos", {}, @@ -108,7 +112,8 @@ struct f0980pbpbanalysis { Configurable cMaxTPCnSigmaPion{"cMaxTPCnSigmaPion", 5.0, "TPC nSigma cut for Pion"}; // TPC Configurable cMaxTPCnSigmaPionS{"cMaxTPCnSigmaPionS", 3.0, "TPC nSigma cut for Pion as a standalone"}; Configurable cfgUSETOF{"cfgUSETOF", false, "TPC usage"}; - Configurable cfgSelectType{"cfgSelectType", 0, "PID selection type"}; + Configurable cfgSelectPID{"cfgSelectPID", 0, "PID selection type"}; + Configurable cfgSelectPtl{"cfgSelectPtl", 0, "Particle selection type"}; Configurable cfgnMods{"cfgnMods", 1, "The number of modulations of interest starting from 2"}; Configurable cfgNQvec{"cfgNQvec", 7, "The number of total Qvectors for looping over the task"}; @@ -120,6 +125,16 @@ struct f0980pbpbanalysis { Configurable cfgRotBkg{"cfgRotBkg", true, "flag to construct rotational backgrounds"}; Configurable cfgNRotBkg{"cfgNRotBkg", 10, "the number of rotational backgrounds"}; + // for phi test + Configurable cfgTPCFinableClsSel{"cfgTPCFinableClsSel", true, "TPC Crossed Rows to Findable Clusters selection flag"}; + Configurable cfgITSClsSel{"cfgITSClsSel", false, "ITS cluster selection flag"}; + Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; + Configurable cfgpTDepPID{"cfgpTDepPID", false, "pT dependent PID"}; + Configurable cfgBetaCutSel{"cfgBetaCutSel", false, "TOF beta cut selection flag"}; + Configurable cfgCutTOFBeta{"cfgCutTOFBeta", 0.0, "cut TOF beta"}; + Configurable isDeepAngle{"isDeepAngle", true, "Deep Angle cut"}; + Configurable cfgDeepAngle{"cfgDeepAngle", 0.04, "Deep Angle cut value"}; + ConfigurableAxis massAxis{"massAxis", {400, 0.2, 2.2}, "Invariant mass axis"}; ConfigurableAxis ptAxis{"ptAxis", {VARIABLE_WIDTH, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0, 10.0, 13.0, 20.0}, "Transverse momentum Binning"}; ConfigurableAxis centAxis{"centAxis", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 100}, "Centrality interval"}; @@ -144,15 +159,37 @@ struct f0980pbpbanalysis { // double massPi = o2::constants::physics::MassPionCharged; double massPtl; + enum CentEstList { + FT0C = 0, + FT0M = 1, + }; + + enum PIDList { + PIDRun3 = 0, + PIDRun2 = 1, + PIDTest = 2, + }; + + enum PtlList { + PtlPion = 0, + PtlKaon = 1, + }; + TRandom* rn = new TRandom(); // float theta2; Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; Filter acceptanceFilter = (nabs(aod::track::eta) < cfgMaxEta && nabs(aod::track::pt) > cfgMinPt); Filter cutDCAFilter = (nabs(aod::track::dcaXY) < cfgMaxDCArToPVcut) && (nabs(aod::track::dcaZ) < cfgMaxDCAzToPVcut); + // from phi + // Filter centralityFilter = nabs(aod::cent::centFT0C) < cfgCentSel; + // Filter PIDcutFilter = nabs(aod::pidtpc::tpcNSigmaKa) < cMaxTPCnSigmaPion; + // Filter PIDcutFilter = nabs(aod::pidTPCFullKa::tpcNSigmaKa) < cMaxTPCnSigmaPion; - using EventCandidates = soa::Filtered>; - using TrackCandidates = soa::Filtered>; + using EventCandidates = soa::Filtered>; + // aod::EPCalibrationTables 추가됨 + using TrackCandidates = soa::Filtered>; + // aod::pidTOFbeta 추가됨 template int getDetId(const T& name) @@ -199,7 +236,7 @@ struct f0980pbpbanalysis { if (!collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { return 0; } - if (cfgQvecSel && (collision.qvecAmp()[detId] < 1e-4 || collision.qvecAmp()[refAId] < 1e-4 || collision.qvecAmp()[refAId] < 1e-4)) { + if (cfgQvecSel && (collision.qvecAmp()[detId] < 1e-4 || collision.qvecAmp()[refAId] < 1e-4 || collision.qvecAmp()[refBId] < 1e-4)) { return 0; } if (cfgOccupancySel && (collision.trackOccupancyInTimeRange() > cfgMaxOccupancy || collision.trackOccupancyInTimeRange() < cfgMinOccupancy)) { @@ -211,7 +248,6 @@ struct f0980pbpbanalysis { if (cfgPVSel && std::abs(collision.posZ()) > cfgPV) { return 0; } - return 1; } // event selection @@ -230,9 +266,6 @@ struct f0980pbpbanalysis { if (std::fabs(track.dcaZ()) > cfgMaxDCAzToPVcut) { return 0; } - if (track.tpcNClsFound() < cfgTPCcluster) { - return 0; - } if (cfgPVContributor && !track.isPVContributor()) { return 0; } @@ -242,17 +275,22 @@ struct f0980pbpbanalysis { if (cfgGlobalWoDCATrack && !track.isGlobalTrackWoDCA()) { return 0; } - if (track.tpcCrossedRowsOverFindableCls() < cfgRatioTPCRowsOverFindableCls) { + if (track.tpcNClsFound() < cfgTPCcluster) { + return 0; + } + if (cfgTPCFinableClsSel && track.tpcCrossedRowsOverFindableCls() < cfgRatioTPCRowsOverFindableCls) { + return 0; + } + if (cfgITSClsSel && track.itsNCls() < cfgITScluster) { return 0; } - return 1; } template bool selectionPID(const TrackType track) { - if (cfgSelectType == 0) { + if (cfgSelectPID == PIDList::PIDRun3) { if (cfgUSETOF) { if (std::fabs(track.tofNSigmaPi()) > cMaxTOFnSigmaPion) { return 0; @@ -264,7 +302,7 @@ struct f0980pbpbanalysis { if (std::fabs(track.tpcNSigmaPi()) > cMaxTPCnSigmaPionS) { return 0; } - } else if (cfgSelectType == 1) { + } else if (cfgSelectPID == PIDList::PIDRun2) { if (cfgUSETOF) { if (track.hasTOF()) { if (std::fabs(track.tofNSigmaPi()) > cMaxTOFnSigmaPion) { @@ -283,22 +321,16 @@ struct f0980pbpbanalysis { return 0; } } - } else if (cfgSelectType == 2) { - if (cfgUSETOF) { - if (track.hasTOF()) { - if (std::fabs(track.tofNSigmaKa()) > 3) { - return 0; - } - if (std::fabs(track.tpcNSigmaKa()) > 3) { - return 0; - } - } else { - if (std::fabs(track.tpcNSigmaKa()) > 3) { - return 0; - } + } else if (cfgSelectPID == PIDList::PIDTest) { + if (track.hasTOF()) { + if (std::fabs(getTofNSigma(track)) > cMaxTOFnSigmaPion) { + return 0; + } + if (std::fabs(getTpcNSigma(track)) > cMaxTPCnSigmaPion) { + return 0; } } else { - if (std::fabs(track.tpcNSigmaKa()) > 3) { + if (std::fabs(getTpcNSigma(track)) > cMaxTPCnSigmaPionS) { return 0; } } @@ -306,23 +338,40 @@ struct f0980pbpbanalysis { return 1; } + template + bool selectionPair(const TrackType1 track1, const TrackType2 track2) + { + double pt1, pt2, pz1, pz2, p1, p2, angle; + pt1 = track1.pt(); + pt2 = track2.pt(); + pz1 = track1.pz(); + pz2 = track2.pz(); + p1 = track1.p(); + p2 = track2.p(); + angle = std::acos((pt1 * pt2 + pz1 * pz2) / (p1 * p2)); + if (isDeepAngle && angle < cfgDeepAngle) { + return 0; + } + return 1; + } + template float getTpcNSigma(const TrackType track) { - if (cfgSelectType == 2) { - return track.tpcNSigmaKa(); - } else { + if (cfgSelectPtl == PtlList::PtlPion) { return track.tpcNSigmaPi(); + } else { + return track.tpcNSigmaKa(); } } template float getTofNSigma(const TrackType track) { - if (cfgSelectType == 2) { - return track.tofNSigmaKa(); - } else { + if (cfgSelectPtl == PtlList::PtlPion) { return track.tofNSigmaPi(); + } else { + return track.tofNSigmaKa(); } } @@ -373,6 +422,14 @@ struct f0980pbpbanalysis { histos.fill(HIST("QA/TPC_TOF_selected"), getTpcNSigma(trk2), getTofNSigma(trk2)); } + if (cfgSelectPID == PIDList::PIDTest && trk2.globalIndex() == trk1.globalIndex()) { + continue; + } + + if (cfgSelectPID == PIDList::PIDTest && !selectionPair(trk1, trk2)) { + continue; + } + pion1.SetXYZM(trk1.px(), trk1.py(), trk1.pz(), massPtl); pion2.SetXYZM(trk2.px(), trk2.py(), trk2.pz(), massPtl); reco = pion1 + pion2; @@ -407,7 +464,7 @@ struct f0980pbpbanalysis { void init(o2::framework::InitContext&) { - AxisSpec epAxis = {6, 0.0, 2.0 * o2::constants::math::PI}; + AxisSpec epAxis = {6, 0.0, o2::constants::math::TwoPI}; AxisSpec qaCentAxis = {110, 0, 110}; AxisSpec qaVzAxis = {100, -20, 20}; AxisSpec qaPIDAxis = {100, -10, 10}; @@ -455,10 +512,10 @@ struct f0980pbpbanalysis { refBId = 5; } - if (cfgSelectType == 2) { - massPtl = o2::constants::physics::MassKaonCharged; - } else { + if (cfgSelectPtl == PtlList::PtlPion) { massPtl = o2::constants::physics::MassPionCharged; + } else if (cfgSelectPtl == PtlList::PtlKaon) { + massPtl = o2::constants::physics::MassKaonCharged; } fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x - 2.5*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); @@ -476,9 +533,9 @@ struct f0980pbpbanalysis { void processData(EventCandidates::iterator const& collision, TrackCandidates const& tracks, aod::BCsWithTimestamps const&) { - if (cfgCentEst == 1) { + if (cfgCentEst == CentEstList::FT0C) { centrality = collision.centFT0C(); - } else if (cfgCentEst == 2) { + } else if (cfgCentEst == CentEstList::FT0M) { centrality = collision.centFT0M(); } if (!eventSelected(collision)) { @@ -488,12 +545,12 @@ struct f0980pbpbanalysis { histos.fill(HIST("QA/Vz"), collision.posZ(), 1.0); fillHistograms(collision, tracks, 2); // second order - } - PROCESS_SWITCH(f0980pbpbanalysis, processData, "Process Event for data", true); + }; + PROCESS_SWITCH(F0980pbpbanalysis, processData, "Process Event for data", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"lf-f0980pbpbanalysis"})}; + adaptAnalysisTask(cfgc)}; } From 9c6527c7063c43ca399ad37e391271ed5861763f Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Tue, 15 Apr 2025 08:14:44 +0300 Subject: [PATCH 0989/1650] [Common] Cleanup CMakeLists (#10852) --- Common/TableProducer/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Common/TableProducer/CMakeLists.txt b/Common/TableProducer/CMakeLists.txt index 4868bde02a0..27a5c14ceca 100644 --- a/Common/TableProducer/CMakeLists.txt +++ b/Common/TableProducer/CMakeLists.txt @@ -14,7 +14,7 @@ add_subdirectory(PID) o2physics_add_dpl_workflow(trackextension SOURCES trackextension.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DetectorsBase + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(trackselection @@ -59,12 +59,12 @@ o2physics_add_dpl_workflow(ft0-corrected-table o2physics_add_dpl_workflow(track-propagation SOURCES trackPropagation.cxx - PUBLIC_LINK_LIBRARIES O2::DetectorsBase O2Physics::AnalysisCore + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(track-propagation-tester SOURCES trackPropagationTester.cxx - PUBLIC_LINK_LIBRARIES O2::DetectorsBase O2Physics::AnalysisCore O2Physics::trackSelectionRequest + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::trackSelectionRequest COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(calo-clusters @@ -92,7 +92,7 @@ o2physics_add_dpl_workflow(fwdtrack-to-collision-associator o2physics_add_dpl_workflow(mccollisionextra SOURCES mcCollsExtra.cxx - PUBLIC_LINK_LIBRARIES O2::DetectorsBase O2Physics::AnalysisCore + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(qvector-table From 9a5d99dd95e48802a2db5803c6166b70f9bce115 Mon Sep 17 00:00:00 2001 From: Mingyu Zhang <83645570+Mingyu3360715@users.noreply.github.com> Date: Tue, 15 Apr 2025 09:15:30 +0200 Subject: [PATCH 0990/1650] [PWGHF] small bug fixed in sigmaC task, add Thns for gen level (#10842) --- PWGHF/D2H/Tasks/taskSigmac.cxx | 108 +++++++++++++++++++++++++-------- 1 file changed, 84 insertions(+), 24 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskSigmac.cxx b/PWGHF/D2H/Tasks/taskSigmac.cxx index 72cdb981776..b7d77b1fea6 100644 --- a/PWGHF/D2H/Tasks/taskSigmac.cxx +++ b/PWGHF/D2H/Tasks/taskSigmac.cxx @@ -37,11 +37,14 @@ struct HfTaskSigmac { /// Properly normalize your results to provide a cross section /// OR /// consider the new parametrization of the fiducial acceptance (to be seen for reco signal in MC) - Configurable yCandMax{"yCandMax", -1, "Sc rapidity"}; + Configurable yCandGenMax{"yCandGenMax", -1, "Maximum generated Sc rapidity"}; + Configurable yCandRecoMax{"yCandRecoMax", -1, "Maximum Sc candidate rapidity"}; /// THn for candidate Λc+ and Σc0,++ cut variation Configurable enableTHn{"enableTHn", false, "enable the usage of THn for Λc+ and Σc0,++"}; ConfigurableAxis thnConfigAxisPt{"thnConfigAxisPt", {16, 0, 16}, ""}; + ConfigurableAxis thnConfigAxisGenPt{"thnConfigAxisGenPt", {240, 0, 24}, "Gen pt prompt"}; + ConfigurableAxis thnConfigAxisGenPtB{"thnConfigAxisGenPtB", {800, 0, 80}, "Gen pt non-prompt"}; ConfigurableAxis thnConfigAxisDecLength{"thnConfigAxisDecLength", {10, 0, 0.05}, ""}; ConfigurableAxis thnConfigAxisDecLengthXY{"thnConfigAxisDecLengthXY", {10, 0, 0.05}, ""}; ConfigurableAxis thnConfigAxisCPA{"thnConfigAxisCPA", {20, 0.8, 1}, ""}; @@ -255,12 +258,36 @@ struct HfTaskSigmac { const AxisSpec thnAxisChannel{4, -0.5, 3.5, "0: direct 1,2,3: resonant"}; const AxisSpec thnAxisBdtScoreLcBkg{thnConfigAxisBdtScoreLcBkg, "BDT bkg score (Lc)"}; const AxisSpec thnAxisBdtScoreLcNonPrompt{thnConfigAxisBdtScoreLcNonPrompt, "BDT non-prompt score (Lc)"}; - if (doprocessDataWithMl || doprocessMcWithMl) { - registry.add("hnLambdaC", "THn for Lambdac", HistType::kTHnSparseF, {thnAxisPtLambdaC, thnAxisMassLambdaC, thnAxisBdtScoreLcBkg, thnAxisBdtScoreLcNonPrompt, thnAxisOriginMc, thnAxisChannel}); - registry.add("hnSigmaC", "THn for Sigmac", HistType::kTHnSparseF, {thnAxisPtLambdaC, axisDeltaMassSigmaC, thnAxisBdtScoreLcBkg, thnAxisBdtScoreLcNonPrompt, thnAxisOriginMc, thnAxisChannel, thnAxisPtSigmaC, thnAxisChargeSigmaC}); + const AxisSpec thnAxisGenPtLambdaC{thnConfigAxisGenPt, "#it{p}_{T}^{gen}(#Lambda_{c}^{+}) (GeV/#it{c})"}; + const AxisSpec thnAxisGenPtSigmaC{thnConfigAxisGenPt, "#it{p}_{T}^{gen}(#Sigma_{c}^{0,++}) (GeV/#it{c})"}; + const AxisSpec thnAxisGenPtLambdaCBMother{thnConfigAxisGenPtB, "#it{p}_{T}^{gen}(#Lambda_{c}^{+} B mother) (GeV/#it{c})"}; + const AxisSpec thnAxisGenPtSigmaCBMother{thnConfigAxisGenPtB, "#it{p}_{T}^{gen}(#Sigma_{c}^{0,++} B mother) (GeV/#it{c})"}; + std::vector axesLambdaCWithMl = {thnAxisPtLambdaC, thnAxisMassLambdaC, thnAxisBdtScoreLcBkg, thnAxisBdtScoreLcNonPrompt, thnAxisOriginMc, thnAxisChannel}; + std::vector axesSigmaCWithMl = {thnAxisPtLambdaC, axisDeltaMassSigmaC, thnAxisBdtScoreLcBkg, thnAxisBdtScoreLcNonPrompt, thnAxisOriginMc, thnAxisChannel, thnAxisPtSigmaC, thnAxisChargeSigmaC}; + std::vector axesLambdaCWoMl = {thnAxisPtLambdaC, thnAxisMassLambdaC, thnAxisDecLength, thnAxisDecLengthXY, thnAxisCPA, thnAxisCPAXY, thnAxisOriginMc, thnAxisChannel}; + std::vector axesSigmaCWoMl = {thnAxisPtLambdaC, axisDeltaMassSigmaC, thnAxisDecLength, thnAxisDecLengthXY, thnAxisCPA, thnAxisCPAXY, thnAxisOriginMc, thnAxisChannel, thnAxisPtSigmaC, thnAxisChargeSigmaC}; + if (isMc) { + registry.add("hnLambdaCGen", "THn for Lambdac gen", HistType::kTHnSparseF, {thnAxisGenPtLambdaC, thnAxisGenPtLambdaCBMother, thnAxisOriginMc, thnAxisChannel}); + registry.add("hnSigmaCGen", "THn for Sigmac gen", HistType::kTHnSparseF, {thnAxisGenPtSigmaC, thnAxisGenPtSigmaCBMother, thnAxisOriginMc, thnAxisChannel, thnAxisGenPtLambdaC, thnAxisChargeSigmaC}); + if (doprocessMcWithMl) { + axesLambdaCWithMl.push_back(thnAxisGenPtLambdaCBMother); + axesSigmaCWithMl.push_back(thnAxisGenPtSigmaCBMother); + registry.add("hnLambdaC", "THn for Lambdac", HistType::kTHnSparseF, axesLambdaCWithMl); + registry.add("hnSigmaC", "THn for Sigmac", HistType::kTHnSparseF, axesSigmaCWithMl); + } else { + axesLambdaCWoMl.push_back(thnAxisGenPtLambdaCBMother); + axesSigmaCWoMl.push_back(thnAxisGenPtSigmaCBMother); + registry.add("hnLambdaC", "THn for Lambdac", HistType::kTHnSparseF, axesLambdaCWoMl); + registry.add("hnSigmaC", "THn for Sigmac", HistType::kTHnSparseF, axesSigmaCWoMl); + } } else { - registry.add("hnLambdaC", "THn for Lambdac", HistType::kTHnSparseF, {thnAxisPtLambdaC, thnAxisMassLambdaC, thnAxisDecLength, thnAxisDecLengthXY, thnAxisCPA, thnAxisCPAXY, thnAxisOriginMc, thnAxisChannel}); - registry.add("hnSigmaC", "THn for Sigmac", HistType::kTHnSparseF, {thnAxisPtLambdaC, axisDeltaMassSigmaC, thnAxisDecLength, thnAxisDecLengthXY, thnAxisCPA, thnAxisCPAXY, thnAxisOriginMc, thnAxisChannel, thnAxisPtSigmaC, thnAxisChargeSigmaC}); + if (doprocessDataWithMl) { + registry.add("hnLambdaC", "THn for Lambdac", HistType::kTHnSparseF, axesLambdaCWithMl); + registry.add("hnSigmaC", "THn for Sigmac", HistType::kTHnSparseF, axesSigmaCWithMl); + } else { + registry.add("hnLambdaC", "THn for Lambdac", HistType::kTHnSparseF, axesLambdaCWoMl); + registry.add("hnSigmaC", "THn for Sigmac", HistType::kTHnSparseF, axesSigmaCWoMl); + } } } @@ -522,7 +549,7 @@ struct HfTaskSigmac { aod::TracksWMc const&) { - /// MC generated particles + /// loop over Sc generated particles for (const auto& particle : mcParticlesSc) { /// reject immediately particles different from Σc0,++ @@ -542,7 +569,7 @@ struct HfTaskSigmac { OR consider the new parametrization of the fiducial acceptance (to be seen for reco signal in MC) */ - if (yCandMax >= 0. && std::abs(RecoDecay::y(particle.pVector(), o2::constants::physics::MassSigmaC0)) > yCandMax) { + if (yCandGenMax >= 0. && std::abs(RecoDecay::y(particle.pVector(), o2::constants::physics::MassSigmaC0)) > yCandGenMax) { continue; } @@ -550,6 +577,7 @@ struct HfTaskSigmac { /// Get information about origin (prompt, non-prompt) /// Get information about decay Λc+ channel (direct, resonant) double ptGenSc(particle.pt()), etaGenSc(particle.eta()), phiGenSc(particle.phi()); + double ptGenScBMother(-1.); auto arrayDaughtersIds = particle.daughtersIds(); if (arrayDaughtersIds.size() != 2) { /// This should never happen @@ -561,7 +589,8 @@ struct HfTaskSigmac { double phiGenLc(-1.), phiGenSoftPi(-1.); int origin = -1; int8_t channel = -1; - if (std::abs(arrayDaughtersIds[0]) == o2::constants::physics::Pdg::kLambdaCPlus) { + auto daughter0 = mcParticles.rawIteratorAt(arrayDaughtersIds[0]); + if (std::abs(daughter0.pdgCode()) == o2::constants::physics::Pdg::kLambdaCPlus) { /// daughter 0 is the Λc+, daughter 1 the soft π auto daugLc = mcParticlesLc.rawIteratorAt(arrayDaughtersIds[0]); auto daugSoftPi = mcParticles.rawIteratorAt(arrayDaughtersIds[1]); @@ -573,7 +602,7 @@ struct HfTaskSigmac { ptGenSoftPi = daugSoftPi.pt(); etaGenSoftPi = daugSoftPi.eta(); phiGenSoftPi = daugSoftPi.phi(); - } else if (std::abs(arrayDaughtersIds[0]) == kPiPlus) { + } else if (std::abs(daughter0.pdgCode()) == kPiPlus) { /// daughter 0 is the soft π, daughter 1 the Λc+ auto daugLc = mcParticlesLc.rawIteratorAt(arrayDaughtersIds[1]); auto daugSoftPi = mcParticles.rawIteratorAt(arrayDaughtersIds[0]); @@ -609,6 +638,12 @@ struct HfTaskSigmac { registry.fill(HIST("MC/generated/hPtGenLcFromSc0PlusPlusSig"), ptGenLc, origin, channel); registry.fill(HIST("MC/generated/hEtaGenLcFromSc0PlusPlusSig"), etaGenLc, origin, channel); registry.fill(HIST("MC/generated/hPhiGenLcFromSc0PlusPlusSig"), phiGenLc, origin, channel); /// Generated Λc+ ← Σc0,++ signal + if (origin == RecoDecay::OriginType::Prompt) { + registry.fill(HIST("hnSigmaCGen"), ptGenSc, ptGenScBMother, origin, channel, ptGenLc, 0); + } else { + ptGenScBMother = mcParticlesSc.rawIteratorAt(particle.idxBhadMotherPart()).pt(); + registry.fill(HIST("hnSigmaCGen"), ptGenSc, ptGenScBMother, origin, channel, ptGenLc, 0); + } } else if (isScPlusPlusGen) { /// Generated Σc++ and Λc+ ← Σc++ signals registry.fill(HIST("MC/generated/hPtGenScPlusPlusSig"), ptGenSc, origin, channel); @@ -630,9 +665,34 @@ struct HfTaskSigmac { registry.fill(HIST("MC/generated/hPtGenLcFromSc0PlusPlusSig"), ptGenLc, origin, channel); registry.fill(HIST("MC/generated/hEtaGenLcFromSc0PlusPlusSig"), etaGenLc, origin, channel); registry.fill(HIST("MC/generated/hPhiGenLcFromSc0PlusPlusSig"), phiGenLc, origin, channel); /// Generated Λc+ ← Σc0,++ signal + if (origin == RecoDecay::OriginType::Prompt) { + registry.fill(HIST("hnSigmaCGen"), ptGenSc, ptGenScBMother, origin, channel, ptGenLc, 2); + } else { + ptGenScBMother = mcParticlesSc.rawIteratorAt(particle.idxBhadMotherPart()).pt(); + registry.fill(HIST("hnSigmaCGen"), ptGenSc, ptGenScBMother, origin, channel, ptGenLc, 2); + } } - } /// end loop over generated particles + } /// end loop over Sc generated particles + + /// loop over Lc generated particles + for (const auto& particle : mcParticlesLc) { + if (std::abs(particle.flagMcMatchGen()) != 1 << aod::hf_cand_3prong::DecayType::LcToPKPi) { + continue; + } + if (yCandGenMax >= 0. && std::abs(RecoDecay::y(particle.pVector(), o2::constants::physics::MassLambdaCPlus)) > yCandGenMax) { + continue; + } + double ptGenLc(-1.), ptGenLcBMother(-1.); + int origin = particle.originMcGen(); + int channel = particle.flagMcDecayChanGen(); + if (origin == RecoDecay::OriginType::Prompt) { + registry.fill(HIST("hnLambdaCGen"), ptGenLc, ptGenLcBMother, origin, channel); + } else { + ptGenLcBMother = mcParticlesLc.rawIteratorAt(particle.idxBhadMotherPart()).pt(); + registry.fill(HIST("hnLambdaCGen"), ptGenLc, ptGenLcBMother, origin, channel); + } + } /// end loop over Lc generated particles /// reconstructed Σc0,++ matched to MC for (const auto& candSc : candidatesSc) { @@ -642,7 +702,7 @@ struct HfTaskSigmac { continue; } /// rapidity selection on Σc0,++ - if (yCandMax >= 0. && std::abs(hfHelper.ySc0(candSc)) > yCandMax && std::abs(hfHelper.yScPlusPlus(candSc)) > yCandMax) { + if (yCandRecoMax >= 0. && std::abs(hfHelper.ySc0(candSc)) > yCandRecoMax && std::abs(hfHelper.yScPlusPlus(candSc)) > yCandRecoMax) { continue; } @@ -748,10 +808,10 @@ struct HfTaskSigmac { outputMl.at(0) = candidateLc.mlProbLcToPKPi()[0]; /// bkg score outputMl.at(1) = candidateLc.mlProbLcToPKPi()[2]; /// non-prompt score } - registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, outputMl.at(0), outputMl.at(1), origin, channel, ptSc, std::abs(chargeSc)); + registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, outputMl.at(0), outputMl.at(1), origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart()); } else { /// fill w/o BDT information - registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel, ptSc, std::abs(chargeSc)); + registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart()); } } @@ -822,10 +882,10 @@ struct HfTaskSigmac { outputMl.at(0) = candidateLc.mlProbLcToPiKP()[0]; /// bkg score outputMl.at(1) = candidateLc.mlProbLcToPiKP()[2]; /// non-prompt score } - registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, outputMl.at(0), outputMl.at(1), origin, channel, ptSc, std::abs(chargeSc)); + registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, outputMl.at(0), outputMl.at(1), origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart()); } else { /// fill w/o BDT information - registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel, ptSc, std::abs(chargeSc)); + registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart()); } } @@ -923,10 +983,10 @@ struct HfTaskSigmac { outputMl.at(0) = candidateLc.mlProbLcToPKPi()[0]; /// bkg score outputMl.at(1) = candidateLc.mlProbLcToPKPi()[2]; /// non-prompt score } - registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, outputMl.at(0), outputMl.at(1), origin, channel, ptSc, std::abs(chargeSc)); + registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, outputMl.at(0), outputMl.at(1), origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart()); } else { /// fill w/o BDT information - registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel, ptSc, std::abs(chargeSc)); + registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart()); } } @@ -995,10 +1055,10 @@ struct HfTaskSigmac { outputMl.at(0) = candidateLc.mlProbLcToPiKP()[0]; /// bkg score outputMl.at(1) = candidateLc.mlProbLcToPiKP()[2]; /// non-prompt score } - registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, outputMl.at(0), outputMl.at(1), origin, channel, ptSc, std::abs(chargeSc)); + registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, outputMl.at(0), outputMl.at(1), origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart()); } else { /// fill w/o BDT information - registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel, ptSc, std::abs(chargeSc)); + registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart()); } } @@ -1034,10 +1094,10 @@ struct HfTaskSigmac { outputMl.at(0) = candidateLc.mlProbLcToPKPi()[0]; /// bkg score outputMl.at(1) = candidateLc.mlProbLcToPKPi()[2]; /// non-prompt score } - registry.get(HIST("hnLambdaC"))->Fill(ptLc, massLc, outputMl.at(0), outputMl.at(1), origin, channel); + registry.get(HIST("hnLambdaC"))->Fill(ptLc, massLc, outputMl.at(0), outputMl.at(1), origin, channel, candidateLc.ptBhadMotherPart()); } else { /// fill w/o BDT information - registry.get(HIST("hnLambdaC"))->Fill(ptLc, massLc, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel); + registry.get(HIST("hnLambdaC"))->Fill(ptLc, massLc, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel, candidateLc.ptBhadMotherPart()); } } if (candidateLc.isSelLcToPiKP() >= 1 && pdgAbs == kPiPlus) { @@ -1050,10 +1110,10 @@ struct HfTaskSigmac { outputMl.at(0) = candidateLc.mlProbLcToPiKP()[0]; /// bkg score outputMl.at(1) = candidateLc.mlProbLcToPiKP()[2]; /// non-prompt score } - registry.get(HIST("hnLambdaC"))->Fill(ptLc, massLc, outputMl.at(0), outputMl.at(1), origin, channel); + registry.get(HIST("hnLambdaC"))->Fill(ptLc, massLc, outputMl.at(0), outputMl.at(1), origin, channel, candidateLc.ptBhadMotherPart()); } else { /// fill w/o BDT information - registry.get(HIST("hnLambdaC"))->Fill(ptLc, massLc, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel); + registry.get(HIST("hnLambdaC"))->Fill(ptLc, massLc, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel, candidateLc.ptBhadMotherPart()); } } } From 08e1dd19e29f68b9b7db544b715f7a74b62a5bf0 Mon Sep 17 00:00:00 2001 From: prottayCMT <61418725+prottayCMT@users.noreply.github.com> Date: Tue, 15 Apr 2025 09:48:30 +0200 Subject: [PATCH 0991/1650] [PWGLF] updated existing flow code for spin alignment study (#10851) Co-authored-by: Prottay Das --- PWGLF/Tasks/Resonances/kstarpbpb.cxx | 169 ++++++++++++++++++--------- 1 file changed, 112 insertions(+), 57 deletions(-) diff --git a/PWGLF/Tasks/Resonances/kstarpbpb.cxx b/PWGLF/Tasks/Resonances/kstarpbpb.cxx index b7295c2e459..b6a0cfb453b 100644 --- a/PWGLF/Tasks/Resonances/kstarpbpb.cxx +++ b/PWGLF/Tasks/Resonances/kstarpbpb.cxx @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include @@ -39,7 +38,6 @@ #include "Framework/AnalysisDataModel.h" #include "Framework/HistogramRegistry.h" #include "Framework/StepTHn.h" -#include "Framework/O2DatabasePDGPlugin.h" #include "Common/DataModel/PIDResponse.h" #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/Centrality.h" @@ -63,10 +61,6 @@ using namespace o2::framework::expressions; using std::array; struct kstarpbpb { - int mRunNumber; - int multEstimator; - float d_bz; - struct : ConfigurableGroup { Configurable cfgURL{"cfgURL", "http://alice-ccdb.cern.ch", "Address of the CCDB to browse"}; Configurable nolaterthan{"ccdb-no-later-than", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "Latest acceptable timestamp of creation for the object"}; @@ -75,7 +69,7 @@ struct kstarpbpb { // Enable access to the CCDB for the offset and correction constants and save them in dedicated variables. Service ccdb; o2::ccdb::CcdbApi ccdbApi; - Service pdg; + // Service pdg; // CCDB options // Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; @@ -107,9 +101,9 @@ struct kstarpbpb { ConfigurableAxis configThnAxisInvMass{"configThnAxisInvMass", {180, 0.6, 1.5}, "#it{M} (GeV/#it{c}^{2})"}; ConfigurableAxis configThnAxisPt{"configThnAxisPt", {100, 0.0, 10.}, "#it{p}_{T} (GeV/#it{c})"}; ConfigurableAxis configThnAxisCentrality{"configThnAxisCentrality", {8, 0., 80}, "Centrality"}; + ConfigurableAxis configrapAxis{"configrapAxis", {VARIABLE_WIDTH, -0.8, -0.4, 0.4, 0.8}, "Rapidity"}; Configurable removefaketrak{"removefaketrack", true, "Remove fake track from momentum difference"}; Configurable ConfFakeKaonCut{"ConfFakeKaonCut", 0.1, "Cut based on track from momentum difference"}; - ConfigurableAxis configThnAxisPhiminusPsi{"configThnAxisPhiminusPsi", {6, 0.0, TMath::Pi()}, "#phi - #psi"}; ConfigurableAxis configThnAxisV2{"configThnAxisV2", {400, -16, 16}, "V2"}; Configurable additionalEvsel{"additionalEvsel", false, "Additional event selcection"}; Configurable timFrameEvsel{"timFrameEvsel", false, "TPC Time frame boundary cut"}; @@ -127,6 +121,7 @@ struct kstarpbpb { Configurable fillRotation{"fillRotation", true, "fill rotation"}; Configurable same{"same", true, "same event"}; Configurable like{"like", false, "like-sign"}; + Configurable fillSA{"fillSA", true, "same event SA"}; Configurable fillOccupancy{"fillOccupancy", false, "fill Occupancy"}; Configurable cfgOccupancyCut{"cfgOccupancyCut", 500, "Occupancy cut"}; Configurable useWeight{"useWeight", false, "use EP dep effi weight"}; @@ -168,46 +163,53 @@ struct kstarpbpb { void init(o2::framework::InitContext&) { std::vector occupancyBinning = {0.0, 500.0, 1000.0, 1500.0, 2000.0, 3000.0, 4000.0, 5000.0, 50000.0}; - const AxisSpec thnAxisInvMass{configThnAxisInvMass, "#it{M} (GeV/#it{c}^{2})"}; - const AxisSpec thnAxisPt{configThnAxisPt, "#it{p}_{T} (GeV/#it{c})"}; - const AxisSpec thnAxisPhiminusPsi{configThnAxisPhiminusPsi, "#phi - #psi"}; - const AxisSpec thnAxisCentrality{configThnAxisCentrality, "Centrality (%)"}; - const AxisSpec thnAxisV2{configThnAxisV2, "V2"}; AxisSpec phiAxis = {500, -6.28, 6.28, "phi"}; AxisSpec resAxis = {6000, -30, 30, "Res"}; AxisSpec centAxis = {8, 0, 80, "V0M (%)"}; AxisSpec occupancyAxis = {occupancyBinning, "Occupancy"}; - if (same) { - histos.add("hSparseV2SASameEvent_V2", "hSparseV2SASameEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); - } - if (like) { - histos.add("hSparseV2SAlikeEventNN_V2", "hSparseV2SAlikeEventNN_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); - histos.add("hSparseV2SAlikeEventPP_V2", "hSparseV2SAlikeEventPP_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); + if (!fillSA) { + if (same) { + histos.add("hSparseV2SASameEvent_V2", "hSparseV2SASameEvent_V2", HistType::kTHnSparseF, {configThnAxisInvMass, configThnAxisPt, configThnAxisV2, configThnAxisCentrality}); + } + if (like) { + histos.add("hSparseV2SAlikeEventNN_V2", "hSparseV2SAlikeEventNN_V2", HistType::kTHnSparseF, {configThnAxisInvMass, configThnAxisPt, configThnAxisV2, configThnAxisCentrality}); + histos.add("hSparseV2SAlikeEventPP_V2", "hSparseV2SAlikeEventPP_V2", HistType::kTHnSparseF, {configThnAxisInvMass, configThnAxisPt, configThnAxisV2, configThnAxisCentrality}); + } } if (fillRotation) { - histos.add("hRotation", "hRotation", kTH1F, {{360, 0.0, 2.0 * TMath::Pi()}}); - histos.add("hSparseV2SASameEventRotational_V2", "hSparseV2SASameEventRotational_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); + if (!fillSA) { + histos.add("hRotation", "hRotation", kTH1F, {{360, 0.0, 2.0 * TMath::Pi()}}); + histos.add("hSparseV2SASameEventRotational_V2", "hSparseV2SASameEventRotational_V2", HistType::kTHnSparseF, {configThnAxisInvMass, configThnAxisPt, configThnAxisV2, configThnAxisCentrality}); + } } - histos.add("hSparseV2SAGen_V2", "hSparseV2SAGen_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); - histos.add("hSparseV2SARec_V2", "hSparseV2SARec_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); - histos.add("hpt", "hpt", kTH1F, {thnAxisPt}); - histos.add("hMC", "MC Event statistics", kTH1F, {{10, 0.0f, 10.0f}}); - histos.add("h1PhiRecsplit", "Phi meson Rec split", kTH1F, {{100, 0.0f, 10.0f}}); - histos.add("CentPercentileMCRecHist", "MC Centrality", kTH1F, {{100, 0.0f, 100.0f}}); - histos.add("hSparseV2SAMixedEvent_V2", "hSparseV2SAMixedEvent_V2", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); - histos.add("h2PhiGen2", "Phi meson gen", kTH2F, {thnAxisPt, thnAxisCentrality}); - histos.add("h2PhiRec2", "Phi meson Rec", kTH2F, {thnAxisPt, thnAxisCentrality}); - histos.add("hImpactParameter", "Impact parameter", kTH1F, {{200, 0.0f, 20.0f}}); - histos.add("hEventPlaneAngle", "hEventPlaneAngle", kTH1F, {{200, -2.0f * TMath::Pi(), 2.0f * TMath::Pi()}}); - histos.add("hSparseKstarMCGenWeight", "hSparseKstarMCGenWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, thnAxisPt, {8, -0.8, 0.8}}); - histos.add("hSparseKstarMCRecWeight", "hSparseKstarMCRecWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, thnAxisPt, {8, -0.8, 0.8}}); - histos.add("hSparseKstarMCGenKaonWeight", "hSparseKstarMCGenKaonWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); - histos.add("hSparseKstarMCRecKaonWeight", "hSparseKstarMCRecKaonWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); - histos.add("hSparseKstarMCRecKaonMissMatchWeight", "hSparseKstarMCRecKaonMissMatchWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); - histos.add("hSparseKstarMCGenPionWeight", "hSparseKstarMCGenPionWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); - histos.add("hSparseKstarMCRecPionWeight", "hSparseKstarMCRecPionWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); - histos.add("hSparseKstarMCRecPionMissMatchWeight", "hSparseKstarMCRecPionMissMatchWeight", HistType::kTHnSparseD, {thnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); + if (fillSA) { + histos.add("hSparseSAvsrapsameunlike", "hSparseSAvsrapsameunlike", HistType::kTHnSparseF, {configThnAxisInvMass, configThnAxisPt, configThnAxisV2, configrapAxis, configThnAxisCentrality}, true); + histos.add("hSparseSAvsrapsamelike", "hSparseSAvsrapsamelike", HistType::kTHnSparseF, {configThnAxisInvMass, configThnAxisPt, configThnAxisV2, configrapAxis, configThnAxisCentrality}, true); + histos.add("hSparseSAvsraprot", "hSparseSAvsraprot", HistType::kTHnSparseF, {configThnAxisInvMass, configThnAxisPt, configThnAxisV2, configrapAxis, configThnAxisCentrality}, true); + histos.add("hSparseSAvsrapmix", "hSparseSAvsrapmix", HistType::kTHnSparseF, {configThnAxisInvMass, configThnAxisPt, configThnAxisV2, configrapAxis, configThnAxisCentrality}, true); + } + if (!fillSA) { + histos.add("hSparseV2SAGen_V2", "hSparseV2SAGen_V2", HistType::kTHnSparseF, {configThnAxisInvMass, configThnAxisPt, configThnAxisV2, configThnAxisCentrality}); + histos.add("hSparseV2SARec_V2", "hSparseV2SARec_V2", HistType::kTHnSparseF, {configThnAxisInvMass, configThnAxisPt, configThnAxisV2, configThnAxisCentrality}); + histos.add("hpt", "hpt", kTH1F, {configThnAxisPt}); + histos.add("hMC", "MC Event statistics", kTH1F, {{10, 0.0f, 10.0f}}); + histos.add("h1PhiRecsplit", "Phi meson Rec split", kTH1F, {{100, 0.0f, 10.0f}}); + histos.add("CentPercentileMCRecHist", "MC Centrality", kTH1F, {{100, 0.0f, 100.0f}}); + histos.add("hSparseV2SAMixedEvent_V2", "hSparseV2SAMixedEvent_V2", HistType::kTHnSparseF, {configThnAxisInvMass, configThnAxisPt, configThnAxisV2, configThnAxisCentrality}); + histos.add("h2PhiGen2", "Phi meson gen", kTH2F, {configThnAxisPt, configThnAxisCentrality}); + histos.add("h2PhiRec2", "Phi meson Rec", kTH2F, {configThnAxisPt, configThnAxisCentrality}); + histos.add("hImpactParameter", "Impact parameter", kTH1F, {{200, 0.0f, 20.0f}}); + histos.add("hEventPlaneAngle", "hEventPlaneAngle", kTH1F, {{200, -2.0f * TMath::Pi(), 2.0f * TMath::Pi()}}); + histos.add("hSparseKstarMCGenWeight", "hSparseKstarMCGenWeight", HistType::kTHnSparseD, {configThnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, configThnAxisPt, {8, -0.8, 0.8}}); + histos.add("hSparseKstarMCRecWeight", "hSparseKstarMCRecWeight", HistType::kTHnSparseD, {configThnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, configThnAxisPt, {8, -0.8, 0.8}}); + histos.add("hSparseKstarMCGenKaonWeight", "hSparseKstarMCGenKaonWeight", HistType::kTHnSparseD, {configThnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); + histos.add("hSparseKstarMCRecKaonWeight", "hSparseKstarMCRecKaonWeight", HistType::kTHnSparseD, {configThnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); + histos.add("hSparseKstarMCRecKaonMissMatchWeight", "hSparseKstarMCRecKaonMissMatchWeight", HistType::kTHnSparseD, {configThnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); + histos.add("hSparseKstarMCGenPionWeight", "hSparseKstarMCGenPionWeight", HistType::kTHnSparseD, {configThnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); + histos.add("hSparseKstarMCRecPionWeight", "hSparseKstarMCRecPionWeight", HistType::kTHnSparseD, {configThnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); + histos.add("hSparseKstarMCRecPionMissMatchWeight", "hSparseKstarMCRecPionMissMatchWeight", HistType::kTHnSparseD, {configThnAxisCentrality, {36, 0.0f, TMath::Pi()}, {400, 0.0f, 1}, axisPtKaonWeight, {8, -0.8, 0.8}}); + } if (additionalQAplots1) { histos.add("hFTOCvsTPCSelected", "Mult correlation FT0C vs. TPC after selection", kTH2F, {{80, 0.0f, 80.0f}, {100, -0.5f, 5999.5f}}); histos.add("hCentrality", "Centrality distribution", kTH1F, {{200, 0.0, 200.0}}); @@ -480,7 +482,10 @@ struct kstarpbpb { double v2, v2Rot; using BinningTypeVertexContributor = ColumnBinningPolicy; - ROOT::Math::PxPyPzMVector KstarMother, daughter1, daughter2, kaonrot, kstarrot, KaonPlus, PionMinus; + ROOT::Math::PxPyPzMVector KstarMother, fourVecDauCM, daughter1, daughter2, kaonrot, kstarrot, KaonPlus, PionMinus; + ROOT::Math::XYZVector threeVecDauCM, threeVecDauCMXY, eventplaneVec, eventplaneVecNorm; + ROOT::Math::PxPyPzMVector daughter2rot, fourVecDauCMrot; + ROOT::Math::XYZVector threeVecDauCMrot, threeVecDauCMXYrot; int currentRunNumber = -999; int lastRunNumber = -999; @@ -613,13 +618,33 @@ struct kstarpbpb { histos.fill(HIST("ResTrackSPFT0CFT0A"), centrality, occupancy, QFT0C * QFT0A * TMath::Cos(2.0 * (psiFT0C - psiFT0A))); histos.fill(HIST("ResTrackSPFT0ATPC"), centrality, occupancy, QTPC * QFT0A * TMath::Cos(2.0 * (psiTPC - psiFT0A))); } - if (same) { - if (useWeight) { - histos.fill(HIST("hSparseV2SASameEvent_V2"), KstarMother.M(), KstarMother.Pt(), v2, centrality, 1 / totalweight); - } else { - histos.fill(HIST("hSparseV2SASameEvent_V2"), KstarMother.M(), KstarMother.Pt(), v2, centrality); + if (!fillSA) { + if (same) { + if (useWeight) { + histos.fill(HIST("hSparseV2SASameEvent_V2"), KstarMother.M(), KstarMother.Pt(), v2, centrality, 1 / totalweight); + } else { + histos.fill(HIST("hSparseV2SASameEvent_V2"), KstarMother.M(), KstarMother.Pt(), v2, centrality); + } } } + int track1Sign = track1.sign(); + int track2Sign = track2.sign(); + + if (fillSA) { + ROOT::Math::Boost boost{KstarMother.BoostToCM()}; + fourVecDauCM = boost(daughter1); + threeVecDauCM = fourVecDauCM.Vect(); + threeVecDauCMXY = ROOT::Math::XYZVector(threeVecDauCM.X(), threeVecDauCM.Y(), 0.); + eventplaneVec = ROOT::Math::XYZVector(std::cos(2.0 * psiFT0C), std::sin(2.0 * psiFT0C), 0); + auto cosPhistarminuspsi = GetPhiInRange(fourVecDauCM.Phi() - psiFT0C); + auto SA = TMath::Cos(2.0 * cosPhistarminuspsi); + + if (track1Sign * track2Sign < 0) + histos.fill(HIST("hSparseSAvsrapsameunlike"), KstarMother.M(), KstarMother.Pt(), SA, KstarMother.Rapidity(), centrality); + else if (track1Sign * track2Sign > 0) + histos.fill(HIST("hSparseSAvsrapsamelike"), KstarMother.M(), KstarMother.Pt(), SA, KstarMother.Rapidity(), centrality); + } + if (fillRotation) { for (int nrotbkg = 0; nrotbkg < nBkgRotations; nrotbkg++) { auto anglestart = confMinRot; @@ -642,15 +667,29 @@ struct kstarpbpb { if (!useSP) { v2Rot = TMath::Cos(2.0 * phiminuspsiRot); } - histos.fill(HIST("hSparseV2SASameEventRotational_V2"), kstarrot.M(), kstarrot.Pt(), v2Rot, centrality); + if (!fillSA) + histos.fill(HIST("hSparseV2SASameEventRotational_V2"), kstarrot.M(), kstarrot.Pt(), v2Rot, centrality); + + if (fillSA) { + if (track1Sign * track2Sign < 0) { + ROOT::Math::Boost boost{kstarrot.BoostToCM()}; + fourVecDauCMrot = boost(kaonrot); + threeVecDauCMrot = fourVecDauCMrot.Vect(); + threeVecDauCMXYrot = ROOT::Math::XYZVector(threeVecDauCMrot.X(), threeVecDauCMrot.Y(), 0.); + auto cosPhistarminuspsirot = GetPhiInRange(fourVecDauCMrot.Phi() - psiFT0C); + auto SArot = TMath::Cos(2.0 * cosPhistarminuspsirot); + + histos.fill(HIST("hSparseSAvsraprot"), kstarrot.M(), kstarrot.Pt(), SArot, kstarrot.Rapidity(), centrality); + } + } } } } } } PROCESS_SWITCH(kstarpbpb, processSE, "Process Same event latest", true); - - void processSameEvent(EventCandidates::iterator const& collision, TrackCandidates const& /*tracks, aod::BCs const&*/, aod::BCsWithTimestamps const&) + /* + void processSameEvent(EventCandidates::iterator const& collision, TrackCandidates const& , aod::BCsWithTimestamps const&) { if (!collision.sel8()) { return; @@ -878,6 +917,7 @@ struct kstarpbpb { } } PROCESS_SWITCH(kstarpbpb, processSameEvent, "Process Same event", false); + void processlikeEvent(EventCandidates::iterator const& collision, TrackCandidates const& tracks, aod::BCs const&) { if (!collision.sel8()) { @@ -1037,6 +1077,8 @@ struct kstarpbpb { } PROCESS_SWITCH(kstarpbpb, processlikeEvent, "Process like event", false); + */ + void processMixedEvent(EventCandidates const& collisions, TrackCandidates const& tracks) { @@ -1102,13 +1144,13 @@ struct kstarpbpb { if (isTOFOnly && !selectionPID2(track2, 1)) { continue; } - if (track1.sign() > 0 && track2.sign() < 0) { - daughter1 = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); - daughter2 = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massPi); - } else if (track1.sign() < 0 && track2.sign() > 0) { - daughter2 = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); - daughter1 = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massPi); - } + // if (track1.sign() > 0 && track2.sign() < 0) { + daughter1 = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); + daughter2 = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massPi); + /*} else if (track1.sign() < 0 && track2.sign() > 0) { + daughter2 = ROOT::Math::PxPyPzMVector(track1.px(), track1.py(), track1.pz(), massKa); + daughter1 = ROOT::Math::PxPyPzMVector(track2.px(), track2.py(), track2.pz(), massPi); + }*/ KstarMother = daughter1 + daughter2; if (TMath::Abs(KstarMother.Rapidity()) > confRapidity) { continue; @@ -1116,8 +1158,21 @@ struct kstarpbpb { auto phiminuspsi = GetPhiInRange(KstarMother.Phi() - psiFT0C); v2 = TMath::Cos(2.0 * phiminuspsi) * QFT0C; + if (!fillSA) { + if (track1.sign() * track2.sign() < 0) + histos.fill(HIST("hSparseV2SAMixedEvent_V2"), KstarMother.M(), KstarMother.Pt(), v2, centrality); + } + if (fillSA) { + ROOT::Math::Boost boost{KstarMother.BoostToCM()}; + fourVecDauCM = boost(daughter1); + threeVecDauCM = fourVecDauCM.Vect(); + threeVecDauCMXY = ROOT::Math::XYZVector(threeVecDauCM.X(), threeVecDauCM.Y(), 0.); + eventplaneVec = ROOT::Math::XYZVector(std::cos(2.0 * psiFT0C), std::sin(2.0 * psiFT0C), 0); + auto cosPhistarminuspsi = GetPhiInRange(fourVecDauCM.Phi() - psiFT0C); + auto SA = TMath::Cos(2.0 * cosPhistarminuspsi); - histos.fill(HIST("hSparseV2SAMixedEvent_V2"), KstarMother.M(), KstarMother.Pt(), v2, centrality); + histos.fill(HIST("hSparseSAvsrapmix"), KstarMother.M(), KstarMother.Pt(), SA, KstarMother.Rapidity(), centrality); + } } } } From efe962b42ba157549326a2b40780ef2fe44ca9d4 Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Tue, 15 Apr 2025 12:25:49 +0300 Subject: [PATCH 0992/1650] [PWGLF] protect against empty / problematic DFs (#10853) Co-authored-by: ALICE Builder --- PWGLF/Utils/strangenessBuilderHelper.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/PWGLF/Utils/strangenessBuilderHelper.h b/PWGLF/Utils/strangenessBuilderHelper.h index afa6e410bc2..bcddc01aedd 100644 --- a/PWGLF/Utils/strangenessBuilderHelper.h +++ b/PWGLF/Utils/strangenessBuilderHelper.h @@ -83,6 +83,9 @@ template std::vector groupDuplicates(const T& V0s) { std::vector v0table; + if (V0s.size() == 0) { + return v0table; + } V0group thisV0; thisV0.V0Ids.push_back(-1); // create one single element thisV0.collisionIds.push_back(-1); // create one single element From 01f16bf29e2f76d1dbb8eddd32a25deeca537313 Mon Sep 17 00:00:00 2001 From: prottayCMT <61418725+prottayCMT@users.noreply.github.com> Date: Tue, 15 Apr 2025 11:44:46 +0200 Subject: [PATCH 0993/1650] [PWGLF] initial task for lambda correlation study (#10810) Co-authored-by: Prottay Das --- PWGLF/Tasks/Strangeness/CMakeLists.txt | 5 + .../Tasks/Strangeness/taskLambdaSpinCorr.cxx | 399 ++++++++++++++++++ 2 files changed, 404 insertions(+) create mode 100644 PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx diff --git a/PWGLF/Tasks/Strangeness/CMakeLists.txt b/PWGLF/Tasks/Strangeness/CMakeLists.txt index b091bb60b90..60106e5415b 100644 --- a/PWGLF/Tasks/Strangeness/CMakeLists.txt +++ b/PWGLF/Tasks/Strangeness/CMakeLists.txt @@ -99,6 +99,11 @@ o2physics_add_dpl_workflow(lambdapolsp PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(task-lambda-spin-corr + SOURCES taskLambdaSpinCorr.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(cascpolsp SOURCES cascpolsp.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore diff --git a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx new file mode 100644 index 00000000000..e929c4f0623 --- /dev/null +++ b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx @@ -0,0 +1,399 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file taskLambdaSpinCorr.cxx +/// \brief Analysis task for Lambda spin spin correlation +/// +/// \author prottay.das@cern.ch + +#include +#include "Math/Vector3D.h" +#include "Math/Vector4D.h" +#include "Math/GenVector/Boost.h" + +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/StepTHn.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/Core/trackUtilities.h" +#include "CommonConstants/PhysicsConstants.h" +#include "Common/Core/TrackSelection.h" +#include "Framework/ASoAHelpers.h" +#include "ReconstructionDataFormats/Track.h" +#include "CCDB/BasicCCDBManager.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" +#include "PWGLF/DataModel/LFStrangenessPIDTables.h" +#include "Common/DataModel/FT0Corrected.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using std::array; + +struct LfTaskLambdaSpinCorr { + + Service ccdb; + + // fill output + Configurable additionalEvSel{"additionalEvSel", false, "additionalEvSel"}; + Configurable additionalEvSel3{"additionalEvSel3", false, "additionalEvSel3"}; + + // events + Configurable cfgCutVertex{"cfgCutVertex", 10.0f, "Accepted z-vertex range"}; + Configurable cfgCutCentralityMax{"cfgCutCentralityMax", 50.0f, "Accepted maximum Centrality"}; + Configurable cfgCutCentralityMin{"cfgCutCentralityMin", 30.0f, "Accepted minimum Centrality"}; + + // Configs for V0 + Configurable confV0PtMin{"confV0PtMin", 0.f, "Minimum transverse momentum of V0"}; + Configurable confV0Rap{"confV0Rap", 0.8f, "Rapidity range of V0"}; + Configurable confV0DCADaughMax{"confV0DCADaughMax", 0.2f, "Maximum DCA between the V0 daughters"}; + Configurable confV0CPAMin{"confV0CPAMin", 0.9998f, "Minimum CPA of V0"}; + Configurable confV0TranRadV0Min{"confV0TranRadV0Min", 1.5f, "Minimum transverse radius"}; + Configurable confV0TranRadV0Max{"confV0TranRadV0Max", 100.f, "Maximum transverse radius"}; + Configurable cMaxV0DCA{"cMaxV0DCA", 1.2, "Maximum V0 DCA to PV"}; + Configurable cMinV0DCAPr{"cMinV0DCAPr", 0.05, "Minimum V0 daughters DCA to PV for Pr"}; + Configurable cMinV0DCAPi{"cMinV0DCAPi", 0.05, "Minimum V0 daughters DCA to PV for Pi"}; + Configurable cMaxV0LifeTime{"cMaxV0LifeTime", 20, "Maximum V0 life time"}; + + // config for V0 daughters + Configurable confDaughEta{"confDaughEta", 0.8f, "V0 Daugh sel: max eta"}; + Configurable cfgDaughPrPt{"cfgDaughPrPt", 0.4, "minimum daughter proton pt"}; + Configurable cfgDaughPiPt{"cfgDaughPiPt", 0.2, "minimum daughter pion pt"}; + Configurable confDaughTPCnclsMin{"confDaughTPCnclsMin", 50.f, "V0 Daugh sel: Min. nCls TPC"}; + Configurable confDaughDCAMin{"confDaughDCAMin", 0.08f, "V0 Daugh sel: Max. DCA Daugh to PV (cm)"}; + Configurable confDaughPIDCuts{"confDaughPIDCuts", 3, "PID selections for Lambda daughters"}; + + Configurable iMNbins{"iMNbins", 100, "Number of bins in invariant mass"}; + Configurable lbinIM{"lbinIM", 1.0, "lower bin value in IM histograms"}; + Configurable hbinIM{"hbinIM", 1.2, "higher bin value in IM histograms"}; + + ConfigurableAxis configcentAxis{"configcentAxis", {VARIABLE_WIDTH, 0.0, 10.0, 40.0, 80.0}, "Cent V0M"}; + ConfigurableAxis configthnAxisPt{"configthnAxisPt", {VARIABLE_WIDTH, 0.2, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 6.5, 8.0, 10.0, 100.0}, "#it{p}_{T} (GeV/#it{c})"}; + ConfigurableAxis configthnAxisPol{"configthnAxisPol", {VARIABLE_WIDTH, -1.0, -0.6, -0.2, 0, 0.2, 0.4, 0.8}, "Pol"}; + + SliceCache cache; + HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + + void init(o2::framework::InitContext&) + { + AxisSpec thnAxisInvMass{iMNbins, lbinIM, hbinIM, "#it{M} (GeV/#it{c}^{2})"}; + + histos.add("hCentrality", "Centrality distribution", kTH1F, {{configcentAxis}}); + + histos.add("hSparseLambdaLambda", "hSparseLambdaLambda", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, configthnAxisPt, configthnAxisPt}, true); + histos.add("hSparseLambdaAntiLambda", "hSparseLambdaAntiLambda", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, configthnAxisPt, configthnAxisPt}, true); + histos.add("hSparseAntiLambdaAntiLambda", "hSparseAntiLambdaAntiLambda", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, configthnAxisPt, configthnAxisPt}, true); + } + + template + bool selectionV0(Collision const& collision, V0 const& candidate) + { + if (std::abs(candidate.dcav0topv()) > cMaxV0DCA) { + return false; + } + const float pT = candidate.pt(); + const float tranRad = candidate.v0radius(); + const float dcaDaughv0 = std::abs(candidate.dcaV0daughters()); + const float cpav0 = candidate.v0cosPA(); + + float ctauLambda = candidate.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * (o2::constants::physics::MassLambda); + + if (pT < confV0PtMin) { + return false; + } + if (dcaDaughv0 > confV0DCADaughMax) { + return false; + } + if (cpav0 < confV0CPAMin) { + return false; + } + if (tranRad < confV0TranRadV0Min) { + return false; + } + if (tranRad > confV0TranRadV0Max) { + return false; + } + if (std::abs(ctauLambda) > cMaxV0LifeTime) { + return false; + } + if (std::abs(candidate.yLambda()) > confV0Rap) { + return false; + } + return true; + } + template + bool isSelectedV0Daughter(V0 const& candidate, T const& track, int pid) + { + const auto tpcNClsF = track.tpcNClsFound(); + const auto ncr = 70; + const auto ncrfc = 0.8; + + if (track.tpcNClsCrossedRows() < ncr) { + return false; + } + if (tpcNClsF < confDaughTPCnclsMin) { + return false; + } + if (track.tpcCrossedRowsOverFindableCls() < ncrfc) { + return false; + } + + if (pid == 0 && std::abs(track.tpcNSigmaPr()) > confDaughPIDCuts) { + return false; + } + if (pid == 1 && std::abs(track.tpcNSigmaPi()) > confDaughPIDCuts) { + return false; + } + if (pid == 0 && (candidate.positivept() < cfgDaughPrPt || candidate.negativept() < cfgDaughPiPt)) { + return false; + } + if (pid == 1 && (candidate.positivept() < cfgDaughPiPt || candidate.negativept() < cfgDaughPrPt)) { + return false; + } + if (std::abs(candidate.positiveeta()) > confDaughEta || std::abs(candidate.negativeeta()) > confDaughEta) { + return false; + } + + if (pid == 0 && (std::abs(candidate.dcapostopv()) < cMinV0DCAPr || std::abs(candidate.dcanegtopv()) < cMinV0DCAPi)) { + return false; + } + if (pid == 1 && (std::abs(candidate.dcapostopv()) < cMinV0DCAPi || std::abs(candidate.dcanegtopv()) < cMinV0DCAPr)) { + return false; + } + + return true; + } + + bool shouldReject(bool lambdaTag, bool aLambdaTag, + const ROOT::Math::PxPyPzMVector& Lambdadummy, + const ROOT::Math::PxPyPzMVector& AntiLambdadummy) + { + const double minMass = 1.105; + const double maxMass = 1.125; + return (lambdaTag && aLambdaTag && + (Lambdadummy.M() > minMass && Lambdadummy.M() < maxMass) && + (AntiLambdadummy.M() > minMass && AntiLambdadummy.M() < maxMass)); + } + + void fillHistograms(bool tag1, bool tag2, bool tag3, bool tag4, const ROOT::Math::PxPyPzMVector& particlepair, + const ROOT::Math::PxPyPzMVector& particle1, const ROOT::Math::PxPyPzMVector& particle2, + const ROOT::Math::PxPyPzMVector& daughpart1, const ROOT::Math::PxPyPzMVector& daughpart2, + double centrality) + { + + ROOT::Math::Boost boostPairToCM{particlepair.BoostToCM()}; // boosting vector for pair CM + // Boosting both Lambdas to Lambda-Lambda pair rest frame + auto lambda1CM = boostPairToCM(particle1); + auto lambda2CM = boostPairToCM(particle2); + + // Step 2: Boost Each Lambda to its Own Rest Frame + ROOT::Math::Boost boostLambda1ToCM{lambda1CM.BoostToCM()}; + ROOT::Math::Boost boostLambda2ToCM{lambda2CM.BoostToCM()}; + + // Also boost the daughter protons to the same frame + auto proton1pairCM = boostPairToCM(daughpart1); // proton1 to pair CM + auto proton2pairCM = boostPairToCM(daughpart2); // proton2 to pair CM + + // Boost protons into their respective Lambda rest frames + auto proton1LambdaRF = boostLambda1ToCM(proton1pairCM); + auto proton2LambdaRF = boostLambda2ToCM(proton2pairCM); + + // Method2 + ROOT::Math::XYZVector quantizationAxis = lambda1CM.Vect().Unit(); // Unit vector along Lambda1's direction in pair rest frame + double cosTheta1 = proton1LambdaRF.Vect().Unit().Dot(quantizationAxis); + double cosTheta2 = proton2LambdaRF.Vect().Unit().Dot(-quantizationAxis); // Opposite for Lambda2 + + double theta1 = std::acos(cosTheta1); // angle in radians + double theta2 = std::acos(cosTheta2); // angle in radians + // Step 2: Compute sin(theta1) and sin(theta2) + // double sinTheta1 = std::sqrt(1 - cosTheta1 * cosTheta1); + // double sinTheta2 = std::sqrt(1 - cosTheta2 * cosTheta2); + + // Step 3: Calculate cos(theta1 - theta2) using the trigonometric identity + // double cosThetaDiff = cosTheta1 * cosTheta2 + sinTheta1 * sinTheta2; + double cosThetaDiff = std::cos(theta1 - theta2); + + if (tag1 && tag3) + histos.fill(HIST("hSparseLambdaLambda"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particle1.Pt(), particle2.Pt()); + if (tag1 && tag4) + histos.fill(HIST("hSparseLambdaAntiLambda"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particle1.Pt(), particle2.Pt()); + if (tag2 && tag4) + histos.fill(HIST("hSparseAntiLambdaAntiLambda"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particle1.Pt(), particle2.Pt()); + } + + std::tuple getLambdaTags(const auto& v0, const auto& collision) + { + auto postrack = v0.template posTrack_as(); + auto negtrack = v0.template negTrack_as(); + + int lambdaTag = 0; + int aLambdaTag = 0; + + const auto signpos = postrack.sign(); + const auto signneg = negtrack.sign(); + + if (signpos < 0 || signneg > 0) { + return {0, 0, false}; // Invalid candidate + } + + if (isSelectedV0Daughter(v0, postrack, 0) && isSelectedV0Daughter(v0, negtrack, 1)) { + lambdaTag = 1; + } + if (isSelectedV0Daughter(v0, negtrack, 0) && isSelectedV0Daughter(v0, postrack, 1)) { + aLambdaTag = 1; + } + + if (!lambdaTag && !aLambdaTag) { + return {0, 0, false}; // No valid tags + } + + if (!selectionV0(collision, v0)) { + return {0, 0, false}; // Fails selection + } + + const auto netav = 0.8; + if (std::abs(v0.eta()) > netav) { + return {0, 0, false}; // Fails selection + } + + return {lambdaTag, aLambdaTag, true}; // Valid candidate + } + + ROOT::Math::PxPyPzMVector lambda, antiLambda, lambdadummy, antiLambdadummy, proton, pion, antiProton, antiPion, fourVecDauCM; + ROOT::Math::PxPyPzMVector lambda2, antiLambda2, lambdadummy2, antiLambdadummy2, proton2, pion2, antiProton2, antiPion2; + ROOT::Math::PxPyPzMVector lambdaLambdapair, lambdaAntiLambdapair, antiLambdaAntiLambdapair; + ROOT::Math::XYZVector threeVecDauCM, threeVecDauCMXY; + + Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; + Filter centralityFilter = (nabs(aod::cent::centFT0C) < cfgCutCentralityMax && nabs(aod::cent::centFT0C) > cfgCutCentralityMin); + + using EventCandidates = soa::Filtered>; + using AllTrackCandidates = soa::Join; + using ResoV0s = aod::V0Datas; + + void processData(EventCandidates::iterator const& collision, AllTrackCandidates const& /*tracks*/, ResoV0s const& V0s, aod::BCs const&) + { + + if (!collision.sel8()) { + return; + } + auto centrality = collision.centFT0C(); + if (!collision.triggereventsp()) { + return; + } + + if (additionalEvSel && (!collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { + return; + } + + if (additionalEvSel3 && (!collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(aod::evsel::kNoITSROFrameBorder))) { + return; + } + + histos.fill(HIST("hCentrality"), centrality); + + for (const auto& v0 : V0s) { + + auto [lambdaTag, aLambdaTag, isValid] = getLambdaTags(v0, collision); + if (!isValid) + continue; + + if (lambdaTag) { + proton = ROOT::Math::PxPyPzMVector(v0.pxpos(), v0.pypos(), v0.pzpos(), o2::constants::physics::MassProton); + antiPion = ROOT::Math::PxPyPzMVector(v0.pxneg(), v0.pyneg(), v0.pzneg(), o2::constants::physics::MassPionCharged); + lambdadummy = proton + antiPion; + } + if (aLambdaTag) { + antiProton = ROOT::Math::PxPyPzMVector(v0.pxneg(), v0.pyneg(), v0.pzneg(), o2::constants::physics::MassProton); + pion = ROOT::Math::PxPyPzMVector(v0.pxpos(), v0.pypos(), v0.pzpos(), o2::constants::physics::MassPionCharged); + antiLambdadummy = antiProton + pion; + } + + if (shouldReject(lambdaTag, aLambdaTag, lambdadummy, antiLambdadummy)) { + continue; + } + + int taga = lambdaTag; + int tagb = aLambdaTag; + + // 2nd loop for combination of lambda lambda + for (const auto& v02 : V0s) { + + if (v0.v0Id() >= v02.v0Id()) + continue; + + auto [lambdaTag2, aLambdaTag2, isValid2] = getLambdaTags(v02, collision); + if (!isValid2) + continue; + + if (lambdaTag2) { + proton2 = ROOT::Math::PxPyPzMVector(v02.pxpos(), v02.pypos(), v02.pzpos(), o2::constants::physics::MassProton); + antiPion2 = ROOT::Math::PxPyPzMVector(v02.pxneg(), v02.pyneg(), v02.pzneg(), o2::constants::physics::MassPionCharged); + lambdadummy2 = proton2 + antiPion2; + } + if (aLambdaTag2) { + antiProton2 = ROOT::Math::PxPyPzMVector(v02.pxneg(), v02.pyneg(), v02.pzneg(), o2::constants::physics::MassProton); + pion2 = ROOT::Math::PxPyPzMVector(v02.pxpos(), v02.pypos(), v02.pzpos(), o2::constants::physics::MassPionCharged); + antiLambdadummy2 = antiProton2 + pion2; + } + + if (shouldReject(lambdaTag2, aLambdaTag2, lambdadummy2, antiLambdadummy2)) { + continue; + } + + int taga2 = lambdaTag2; + int tagb2 = aLambdaTag2; + + if (lambdaTag && lambdaTag2) { + lambdaLambdapair = lambdadummy + lambdadummy2; + tagb = 0; + tagb2 = 0; + // fillHistograms(taga, tagb, taga2, tagb2, LambdaLambdapair, Lambdadummy, Lambdadummy2, Proton, Proton2, centrality, LambdaLambdapair.M(), LambdaLambdapair.Pt()); + fillHistograms(taga, tagb, taga2, tagb2, lambdaLambdapair, lambdadummy, lambdadummy2, proton, proton2, centrality); + } + + tagb2 = aLambdaTag2; + + if (lambdaTag && aLambdaTag2) { + lambdaAntiLambdapair = lambdadummy + antiLambdadummy2; + tagb = 0; + taga2 = 0; + // fillHistograms(taga, tagb, taga2, tagb2, LambdaAntiLambdapair, Lambdadummy, AntiLambdadummy2, Proton, AntiProton2, centrality, LambdaAntiLambdapair.M(), LambdaAntiLambdapair.Pt()); + fillHistograms(taga, tagb, taga2, tagb2, lambdaAntiLambdapair, lambdadummy, antiLambdadummy2, proton, antiProton2, centrality); + } + + tagb = aLambdaTag; + taga2 = lambdaTag2; + + if (aLambdaTag && aLambdaTag2) { + antiLambdaAntiLambdapair = antiLambdadummy + antiLambdadummy2; + taga = 0; + taga2 = 0; + // fillHistograms(taga, tagb, taga2, tagb2, AntiLambdaAntiLambdapair, AntiLambdadummy, AntiLambdadummy2, AntiProton, AntiProton2, centrality, AntiLambdaAntiLambdapair.M(), AntiLambdaAntiLambdapair.Pt()); + fillHistograms(taga, tagb, taga2, tagb2, antiLambdaAntiLambdapair, antiLambdadummy, antiLambdadummy2, antiProton, antiProton2, centrality); + } + } + } + } + PROCESS_SWITCH(LfTaskLambdaSpinCorr, processData, "Process data", true); +}; +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + // return WorkflowSpec{ + // adaptAnalysisTask(cfgc, TaskName{"LambdaSpinCorrelation"})}; + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} From 50f8db11324df8456a2db2df565f35cb1e5a3a80 Mon Sep 17 00:00:00 2001 From: mherzer <96999709+mherzer28@users.noreply.github.com> Date: Tue, 15 Apr 2025 14:31:32 +0200 Subject: [PATCH 0994/1650] [PWGLF] added tof mass cut (#10844) Co-authored-by: ALICE Action Bot --- PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx b/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx index ca7ced2677c..bc402c3579b 100644 --- a/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx +++ b/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx @@ -208,6 +208,8 @@ struct TrHeAnalysis { Configurable cfgCutMinItsClusterSizeHe{"cfgCutMinItsClusterSizeHe", 1.f, "Minimum ITS Cluster Size for He"}; Configurable cfgCutMaxItsClusterSizeH3{"cfgCutMaxItsClusterSizeH3", 4.f, "Maximum ITS Cluster Size for Tr"}; Configurable cfgCutMinItsClusterSizeH3{"cfgCutMinItsClusterSizeH3", 1.f, "Minimum ITS Cluster Size for Tr"}; + Configurable cfgCutMinTofMassH3{"cfgCutMinTofMassH3", 2.24f, "Minimum Tof mass H3"}; + Configurable cfgCutMaxTofMassH3{"cfgCutMaxTofMassH3", 3.32f, "Maximum TOF mass H3"}; // Set the kinematic and PID cuts for tracks struct : ConfigurableGroup { Configurable pCut{"pCut", 0.3f, "Value of the p selection for spectra (default 0.3)"}; @@ -273,7 +275,7 @@ struct TrHeAnalysis { h->GetXaxis()->SetBinLabel(6, "Sel8 cut"); h->GetXaxis()->SetBinLabel(7, "Z-vert Cut"); histos.add("histogram/cuts", "cuts", HistType::kTH1D, - {{12, -0.5, 11.5}}); + {{13, -0.5, 12.5}}); auto hCuts = histos.get(HIST("histogram/cuts")); hCuts->GetXaxis()->SetBinLabel(1, "total"); hCuts->GetXaxis()->SetBinLabel(2, "p cut"); @@ -287,6 +289,7 @@ struct TrHeAnalysis { hCuts->GetXaxis()->SetBinLabel(10, "TPC refit"); hCuts->GetXaxis()->SetBinLabel(11, "ITS refit"); hCuts->GetXaxis()->SetBinLabel(12, "ITS cluster size"); + hCuts->GetXaxis()->SetBinLabel(13, "TOF mass cut"); for (int i = 0; i < nParticles; i++) { particles.push_back(Particle(particleNames.at(i), particlePdgCodes.at(i), particleMasses.at(i), particleCharge.at(i), @@ -382,6 +385,10 @@ struct TrHeAnalysis { histos.fill(HIST("histogram/cuts"), 12); continue; } + if (track.mass() < cfgCutMinTofMassH3 || track.mass() > cfgCutMaxTofMassH3) { + histos.fill(HIST("histogram/cuts"), 13); + continue; + } histos.fill(HIST("histogram/H3/H3-TPCsignVsTPCmomentum"), track.tpcInnerParam() / (1.f * track.sign()), track.tpcSignal()); @@ -531,6 +538,10 @@ struct TrHeAnalysis { histos.fill(HIST("histogram/cuts"), 12); continue; } + if (track.mass() < cfgCutMinTofMassH3 || track.mass() > cfgCutMaxTofMassH3) { + histos.fill(HIST("histogram/cuts"), 13); + continue; + } histos.fill(HIST("histogram/H3/H3-TPCsignVsTPCmomentum"), track.tpcInnerParam() / (1.f * track.sign()), track.tpcSignal()); From 58d01dda3dda9f4fb43266dc7d5142048590a22a Mon Sep 17 00:00:00 2001 From: marcobianchi463 <121625445+marcobianchi463@users.noreply.github.com> Date: Tue, 15 Apr 2025 17:15:14 +0200 Subject: [PATCH 0995/1650] [PWGLF] Add harmonics selection (#10858) --- PWGLF/TableProducer/Nuspex/nucleiFlowTree.cxx | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/nucleiFlowTree.cxx b/PWGLF/TableProducer/Nuspex/nucleiFlowTree.cxx index ed8f915296d..85dea6f7ac0 100644 --- a/PWGLF/TableProducer/Nuspex/nucleiFlowTree.cxx +++ b/PWGLF/TableProducer/Nuspex/nucleiFlowTree.cxx @@ -137,13 +137,16 @@ struct nucleiFlowTree { using TrackCandidates = soa::Join; + // Configurable Harmonics index + Configurable cfgHarmonics{"cfgHarmonics", 2, "Harmonics index for flow analysis"}; + // Collisions with chentrality using CollWithCent = soa::Join::iterator; // Flow analysis using CollWithEP = soa::Join::iterator; - using CollWithQvec = soa::Join::iterator; + using CollWithQvec = soa::Join::iterator; HistogramRegistry spectra{"spectra", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; @@ -413,23 +416,23 @@ struct nucleiFlowTree { collision.qTPCR(), }); } else if constexpr (requires { - collision.qvecFT0AIm(); + collision.qvecFT0AImVec()[cfgHarmonics - 2]; }) { nuclei::candidates_flow.emplace_back(NucleusCandidateFlow{ collision.centFV0A(), collision.centFT0M(), collision.centFT0A(), collision.centFT0C(), - computeEventPlane(collision.qvecFT0AIm(), collision.qvecFT0ARe()), - computeEventPlane(collision.qvecFT0CIm(), collision.qvecFT0CRe()), - computeEventPlane(collision.qvecBTotIm(), collision.qvecBTotRe()), - computeEventPlane(collision.qvecBNegIm(), collision.qvecBNegRe()), - computeEventPlane(collision.qvecBPosIm(), collision.qvecBPosRe()), + computeEventPlane(collision.qvecFT0AImVec()[cfgHarmonics - 2], collision.qvecFT0AReVec()[cfgHarmonics - 2]), + computeEventPlane(collision.qvecFT0CImVec()[cfgHarmonics - 2], collision.qvecFT0CReVec()[cfgHarmonics - 2]), + computeEventPlane(collision.qvecTPCallImVec()[cfgHarmonics - 2], collision.qvecTPCallReVec()[cfgHarmonics - 2]), + computeEventPlane(collision.qvecTPCnegImVec()[cfgHarmonics - 2], collision.qvecTPCnegReVec()[cfgHarmonics - 2]), + computeEventPlane(collision.qvecTPCposImVec()[cfgHarmonics - 2], collision.qvecTPCposReVec()[cfgHarmonics - 2]), collision.sumAmplFT0A(), collision.sumAmplFT0C(), - static_cast(collision.nTrkBTot()), - static_cast(collision.nTrkBNeg()), - static_cast(collision.nTrkBPos())}); + static_cast(collision.nTrkTPCall()), + static_cast(collision.nTrkTPCneg()), + static_cast(collision.nTrkTPCpos())}); } if (flag & kTriton) { if (track.pt() < cfgCutPtMinTree || track.pt() > cfgCutPtMaxTree || track.sign() > 0) From 9b9e2591be958300849ae79d43fb46b412b53962 Mon Sep 17 00:00:00 2001 From: Fabio Catalano Date: Tue, 15 Apr 2025 17:59:34 +0200 Subject: [PATCH 0996/1650] [PWGHF] Fixes for OmegaC0 workflows (#10857) --- PWGHF/D2H/Tasks/taskOmegac0ToOmegapi.cxx | 167 ++++++++---------- .../candidateSelectorOmegac0ToOmegaPi.cxx | 11 +- .../treeCreatorOmegacToOmegaPi.cxx | 53 +++--- 3 files changed, 112 insertions(+), 119 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskOmegac0ToOmegapi.cxx b/PWGHF/D2H/Tasks/taskOmegac0ToOmegapi.cxx index 75eaec9a57e..7142b2d2e49 100644 --- a/PWGHF/D2H/Tasks/taskOmegac0ToOmegapi.cxx +++ b/PWGHF/D2H/Tasks/taskOmegac0ToOmegapi.cxx @@ -12,6 +12,7 @@ /// \file taskOmegac0ToOmegapi.cxx /// \brief OmegaC0 analysis task /// \author Yunfan Liu , China University of Geosciences +/// \author Fabio Catalano , University of Houston #include @@ -36,28 +37,33 @@ using namespace o2::framework::expressions; struct HfTaskOmegac0ToOmegapi { // ML inference Configurable applyMl{"applyMl", false, "Flag to apply ML selections"}; - Configurable selectionFlagOmegac0{"selectionFlagOmegac0", false, "Selection Flag for Omegac0 candidates"}; + Configurable selectionFlagOmegac0{"selectionFlagOmegac0", true, "Select Omegac0 candidates"}; Configurable yCandGenMax{"yCandGenMax", 0.5, "max. gen particle rapidity"}; Configurable yCandRecoMax{"yCandRecoMax", 0.8, "max. cand. rapidity"}; HfHelper hfHelper; SliceCache cache; - using MyTracksWMc = soa::Join; - using Omegac0Candidates = soa::Join; - using Omegac0CandidatesKF = soa::Join; - using OmegaC0CandidatesMcKF = soa::Join; + using TracksMc = soa::Join; - using Omegac0CandidatesMl = soa::Join; - using Omegac0CandidatesMlKF = soa::Join; - using Omegac0CandidatesMlMcKF = soa::Join; + using Omegac0Cands = soa::Filtered>; + using Omegac0CandsKF = soa::Filtered>; + using OmegaC0CandsMcKF = soa::Filtered>; + + using Omegac0CandsMl = soa::Filtered>; + using Omegac0CandsMlKF = soa::Filtered>; + using Omegac0CandsMlMcKF = soa::Filtered>; + + using Omegac0Gen = soa::Filtered>; using Collisions = soa::Join; using CollisionsWithMcLabels = soa::Join; - PresliceUnsorted colPerMcCollision = aod::mccollisionlabel::mcCollisionId; - Partition selectedOmegac0CandidatesKF = aod::hf_sel_toomegapi::resultSelections && !selectionFlagOmegac0; - Partition selectedOmegac0CandidatesMlKF = aod::hf_sel_toomegapi::resultSelections && !selectionFlagOmegac0; + Filter filterOmegaCToOmegaPiFlag = (aod::hf_track_index::hfflag & static_cast(BIT(aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaPi))) != static_cast(0); + Filter filterOmegaCMatchedRec = nabs(aod::hf_cand_xic0_omegac0::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi)); + Filter filterOmegaCMatchedGen = nabs(aod::hf_cand_xic0_omegac0::flagMcMatchGen) == static_cast(BIT(aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi)); + + PresliceUnsorted colPerMcCollision = aod::mccollisionlabel::mcCollisionId; // ThnSparse for ML outputScores and Vars ConfigurableAxis thnConfigAxisPromptScore{"thnConfigAxisPromptScore", {50, 0, 1}, "Prompt score bins"}; @@ -70,18 +76,16 @@ struct HfTaskOmegac0ToOmegapi { ConfigurableAxis thnConfigAxisGenPtD{"thnConfigAxisGenPtD", {500, 0, 50}, "Gen Pt D"}; ConfigurableAxis thnConfigAxisGenPtB{"thnConfigAxisGenPtB", {1000, 0, 100}, "Gen Pt B"}; ConfigurableAxis thnConfigAxisNumPvContr{"thnConfigAxisNumPvContr", {200, -0.5, 199.5}, "Number of PV contributors"}; - HistogramRegistry registry{ - "registry", - {}}; + HistogramRegistry registry{"registry", {}}; void init(InitContext&) { - std::array doprocess{doprocessDataWithKFParticle, doprocessMcWithKFParticle, doprocessDataWithKFParticleMl, doprocessMcWithKFParticleMl}; + std::array doprocess{doprocessDataWithKFParticle, doprocessMcWithKFParticle, doprocessDataWithKFParticleMl, doprocessMcWithKFParticleMl}; if ((std::accumulate(doprocess.begin(), doprocess.end(), 0)) != 1) { LOGP(fatal, "One and only one process function should be enabled at a time."); } - const AxisSpec thnAxisMass{thnConfigAxisMass, "inv. mass (#Omega #pi) (GeV/#it{c}^{2})"}; + const AxisSpec thnAxisMass{thnConfigAxisMass, "inv. mass (#Omega#pi) (GeV/#it{c}^{2})"}; const AxisSpec thnAxisPt{thnConfigAxisPt, "#it{p}_{T} (GeV/#it{c})"}; const AxisSpec thnAxisPtB{thnConfigAxisPtB, "#it{p}_{T}^{B} (GeV/#it{c})"}; const AxisSpec thnAxisY{thnConfigAxisY, "y"}; @@ -97,11 +101,7 @@ struct HfTaskOmegac0ToOmegapi { registry.get(HIST("hSparseAcc"))->Sumw2(); } - std::vector axes = { - thnAxisMass, - thnAxisPt, - thnAxisY, - }; + std::vector axes = {thnAxisMass, thnAxisPt, thnAxisY}; if (doprocessMcWithKFParticle || doprocessMcWithKFParticleMl) { axes.push_back(thnAxisPtB); axes.push_back(thnAxisOrigin); @@ -110,9 +110,7 @@ struct HfTaskOmegac0ToOmegapi { } if (applyMl) { const AxisSpec thnAxisPromptScore{thnConfigAxisPromptScore, "BDT score prompt."}; - axes.insert(axes.begin(), thnAxisPromptScore); - registry.add("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsOmegac0Type", "Thn for Omegac0 candidates", HistType::kTHnSparseD, axes); registry.get(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsOmegac0Type"))->Sumw2(); } else { @@ -125,117 +123,104 @@ struct HfTaskOmegac0ToOmegapi { void processData(const CandType& candidates, CollType const&) { for (const auto& candidate : candidates) { - if (!(candidate.hfflag() & 1 << aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaPi)) { + if (!(candidate.resultSelections() == true || (candidate.resultSelections() == false && !selectionFlagOmegac0))) { continue; } if (yCandRecoMax >= 0. && std::abs(candidate.kfRapOmegac()) > yCandRecoMax) { continue; } - float massOmegac0; - massOmegac0 = candidate.invMassCharmBaryon(); - auto rapidityCandidate = candidate.kfRapOmegac(); - auto ptCandidate = candidate.ptCharmBaryon(); + if constexpr (applyMl) { - registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsOmegac0Type"), candidate.mlProbOmegac()[0], massOmegac0, ptCandidate, rapidityCandidate); + registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsOmegac0Type"), candidate.mlProbOmegac()[0], candidate.invMassCharmBaryon(), candidate.ptCharmBaryon(), candidate.kfRapOmegac()); } else { - registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsOmegac0Type"), massOmegac0, ptCandidate, rapidityCandidate); + registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsOmegac0Type"), candidate.invMassCharmBaryon(), candidate.ptCharmBaryon(), candidate.kfRapOmegac()); } } } - void processDataWithKFParticle(Omegac0CandidatesKF const&, Collisions const& collisions) - { - processData(selectedOmegac0CandidatesKF, collisions); - } - PROCESS_SWITCH(HfTaskOmegac0ToOmegapi, processDataWithKFParticle, "process HfTaskOmegac0ToOmegapi with KFParticle", false); - // TODO: add processKFParticle - - void processDataWithKFParticleMl(Omegac0CandidatesMlKF const&, Collisions const& collisions) - { - processData(selectedOmegac0CandidatesMlKF, collisions); - } - PROCESS_SWITCH(HfTaskOmegac0ToOmegapi, processDataWithKFParticleMl, "process HfTaskOmegac0ToOmegapi with KFParticle and ML selections", false); - // TODO: add processKFParticleMl - template void processMc(const CandType& candidates, - soa::Join const& mcParticles, - MyTracksWMc const&, + Omegac0Gen const& mcParticles, + TracksMc const&, CollType const& collisions, aod::McCollisions const&) { // MC rec. for (const auto& candidate : candidates) { - if (!(candidate.hfflag() & 1 << aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaPi)) { + if (!(candidate.resultSelections() == true || (candidate.resultSelections() == false && !selectionFlagOmegac0))) { continue; } if (yCandRecoMax >= 0. && std::abs(candidate.kfRapOmegac()) > yCandRecoMax) { continue; } - auto collision = candidate.template collision_as(); - auto numPvContributors = collision.numContrib(); - float massOmegac0; - massOmegac0 = candidate.invMassCharmBaryon(); - auto ptCandidate = candidate.ptCharmBaryon(); - auto rapidityCandidate = candidate.kfRapOmegac(); - if (candidate.resultSelections() && !selectionFlagOmegac0) - if (candidate.flagMcMatchRec() == (1 << aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi)) { - if constexpr (applyMl) { - registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsOmegac0Type"), candidate.mlProbOmegac()[0], massOmegac0, ptCandidate, rapidityCandidate, candidate.ptBhadMotherPart(), candidate.originRec(), candidate.flagMcMatchRec(), numPvContributors); - - } else { - registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsOmegac0Type"), massOmegac0, ptCandidate, rapidityCandidate, candidate.ptBhadMotherPart(), candidate.originRec(), candidate.flagMcMatchRec(), numPvContributors); - } - } + + auto numPvContributors = candidate.template collision_as().numContrib(); + + if constexpr (applyMl) { + registry.fill(HIST("hBdtScoreVsMassVsPtVsPtBVsYVsOriginVsOmegac0Type"), candidate.mlProbOmegac()[0], candidate.invMassCharmBaryon(), candidate.ptCharmBaryon(), candidate.kfRapOmegac(), candidate.ptBhadMotherPart(), candidate.originRec(), candidate.flagMcMatchRec(), numPvContributors); + + } else { + registry.fill(HIST("hMassVsPtVsPtBVsYVsOriginVsOmegac0Type"), candidate.invMassCharmBaryon(), candidate.ptCharmBaryon(), candidate.kfRapOmegac(), candidate.ptBhadMotherPart(), candidate.originRec(), candidate.flagMcMatchRec(), numPvContributors); + } } + // MC gen. for (const auto& particle : mcParticles) { - if (std::abs(particle.flagMcMatchGen()) == 1 << aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi) { - if (yCandGenMax >= 0. && std::abs(particle.rapidityCharmBaryonGen()) > yCandGenMax) { - continue; - } - float ptGenB = -1; - auto ptGen = particle.pt(); - auto yGen = particle.rapidityCharmBaryonGen(); - - unsigned maxNumContrib = 0; - const auto& recoCollsPerMcColl = collisions.sliceBy(colPerMcCollision, particle.mcCollision().globalIndex()); - for (const auto& recCol : recoCollsPerMcColl) { - maxNumContrib = recCol.numContrib() > maxNumContrib ? recCol.numContrib() : maxNumContrib; - } - - if (particle.originGen() == RecoDecay::OriginType::Prompt) { - registry.fill(HIST("hSparseAcc"), ptGen, ptGenB, yGen, 1, maxNumContrib); - - } else { - ptGenB = mcParticles.rawIteratorAt(particle.idxBhadMotherPart()).pt(); - registry.fill(HIST("hSparseAcc"), ptGen, ptGenB, yGen, 2, maxNumContrib); - } + if (yCandGenMax >= 0. && std::abs(particle.rapidityCharmBaryonGen()) > yCandGenMax) { + continue; + } + + auto ptGen = particle.pt(); + auto yGen = particle.rapidityCharmBaryonGen(); + + unsigned maxNumContrib = 0; + const auto& recoCollsPerMcColl = collisions.sliceBy(colPerMcCollision, particle.mcCollision().globalIndex()); + for (const auto& recCol : recoCollsPerMcColl) { + maxNumContrib = recCol.numContrib() > maxNumContrib ? recCol.numContrib() : maxNumContrib; + } + + if (particle.originGen() == RecoDecay::OriginType::Prompt) { + registry.fill(HIST("hSparseAcc"), ptGen, -1., yGen, RecoDecay::OriginType::Prompt, maxNumContrib); + } else { + float ptGenB = mcParticles.rawIteratorAt(particle.idxBhadMotherPart()).pt(); + registry.fill(HIST("hSparseAcc"), ptGen, ptGenB, yGen, RecoDecay::OriginType::NonPrompt, maxNumContrib); } } } - void processMcWithKFParticle(OmegaC0CandidatesMcKF const& omegaC0CandidatesMcKF, - soa::Join const& mcParticles, - MyTracksWMc const& tracks, + void processDataWithKFParticle(Omegac0CandsKF const& candidates, + Collisions const& collisions) + { + processData(candidates, collisions); + } + PROCESS_SWITCH(HfTaskOmegac0ToOmegapi, processDataWithKFParticle, "process HfTaskOmegac0ToOmegapi with KFParticle", false); + + void processDataWithKFParticleMl(Omegac0CandsMlKF const& candidates, + Collisions const& collisions) + { + processData(candidates, collisions); + } + PROCESS_SWITCH(HfTaskOmegac0ToOmegapi, processDataWithKFParticleMl, "process HfTaskOmegac0ToOmegapi with KFParticle and ML selections", false); + + void processMcWithKFParticle(OmegaC0CandsMcKF const& omegaC0CandidatesMcKF, + Omegac0Gen const& mcParticles, + TracksMc const& tracks, CollisionsWithMcLabels const& collisions, aod::McCollisions const& mcCollisions) { processMc(omegaC0CandidatesMcKF, mcParticles, tracks, collisions, mcCollisions); } PROCESS_SWITCH(HfTaskOmegac0ToOmegapi, processMcWithKFParticle, "Process MC with KFParticle", false); - // TODO: add the processMcWithKFParticle - void processMcWithKFParticleMl(Omegac0CandidatesMlMcKF const& omegac0CandidatesMlMcKF, - soa::Join const& mcParticles, - MyTracksWMc const& tracks, + void processMcWithKFParticleMl(Omegac0CandsMlMcKF const& omegac0CandidatesMlMcKF, + Omegac0Gen const& mcParticles, + TracksMc const& tracks, CollisionsWithMcLabels const& collisions, aod::McCollisions const& mcCollisions) { processMc(omegac0CandidatesMlMcKF, mcParticles, tracks, collisions, mcCollisions); } PROCESS_SWITCH(HfTaskOmegac0ToOmegapi, processMcWithKFParticleMl, "Process MC with KFParticle and ML selections", false); - // TODO: add the processMcWithKFParticleMl }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) diff --git a/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx b/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx index 4ebe3a080fd..7ef19ae4032 100644 --- a/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx @@ -14,6 +14,7 @@ /// \author Federica Zanone , Heidelberg University /// \author Ruiqi Yin , Fudan University /// \author Yunfan Liu , China University of Geosciences +/// \author Fabio Catalano , University of Houston #include #include @@ -223,7 +224,6 @@ struct HfCandidateSelectorToOmegaPi { registry.add("hStatusCheck", "Check consecutive selections status;status;entries", {HistType::kTH1D, {{12, 0., 12.}}}); // for QA of the selections (bin 0 -> candidates that did not pass the selection, bin 1 -> candidates that passed the selection) - registry.add("hSelPtOmegac", "hSelPtOmegac;status;entries", {HistType::kTH1D, {axisSel}}); registry.add("hSelSignDec", "hSelSignDec;status;entries", {HistType::kTH1D, {axisSel}}); registry.add("hSelEtaPosV0Dau", "hSelEtaPosV0Dau;status;entries", {HistType::kTH1D, {axisSel}}); registry.add("hSelEtaNegV0Dau", "hSelEtaNegV0Dau;status;entries", {HistType::kTH1D, {axisSel}}); @@ -254,6 +254,7 @@ struct HfCandidateSelectorToOmegaPi { registry.add("hSelDcaXYToPvKaFromCasc", "hSelDcaXYToPvKaFromCasc;status;entries", {HistType::kTH1D, {axisSel}}); if (KfconfigurableGroup.applyKFpreselections) { + registry.add("hSelPtOmegac", "hSelPtOmegac;status;entries", {HistType::kTH1D, {axisSel}}); registry.add("hSelCompetingCasc", "hSelCompetingCasc;status;entries", {HistType::kTH1D, {axisSel}}); registry.add("hSelKFstatus", "hSelKFstatus;status;entries", {HistType::kTH1D, {axisSel}}); registry.add("hSelV0_Casc_Omegacldl", "hSelV0_Casc_Omegacldl;status;entries", {HistType::kTH1D, {axisSel}}); @@ -340,7 +341,6 @@ struct HfCandidateSelectorToOmegaPi { auto trackPrFromLam = trackV0PosDau; auto ptCand = candidate.ptCharmBaryon(); - int8_t signDecay = candidate.signDecay(); // sign of pi <- cascade if (signDecay > 0) { @@ -507,7 +507,6 @@ struct HfCandidateSelectorToOmegaPi { } if constexpr (ConstructMethod == hf_cand_casc_lf::ConstructMethod::KfParticle) { - ; // KFParticle Preselections(kfsel) if (KfconfigurableGroup.applyKFpreselections) { @@ -529,7 +528,6 @@ struct HfCandidateSelectorToOmegaPi { } // Omegac Pt selection - hPtCharmBaryon->Fill(std::abs(candidate.kfptOmegac())); if (std::abs(candidate.kfptOmegac()) < ptCandMin || std::abs(candidate.kfptOmegac()) > ptCandMax) { resultSelections = false; registry.fill(HIST("hSelPtOmegac"), 0); @@ -798,6 +796,11 @@ struct HfCandidateSelectorToOmegaPi { if (statusPidLambda && statusPidCascade && statusPidCharmBaryon && statusInvMassLambda && statusInvMassCascade && statusInvMassCharmBaryon && resultSelections) { hInvMassCharmBaryon->Fill(invMassCharmBaryon); + if constexpr (ConstructMethod == hf_cand_casc_lf::ConstructMethod::KfParticle) { + hPtCharmBaryon->Fill(candidate.kfptOmegac()); + } else { + hPtCharmBaryon->Fill(ptCand); + } } } } // end process diff --git a/PWGHF/TableProducer/treeCreatorOmegacToOmegaPi.cxx b/PWGHF/TableProducer/treeCreatorOmegacToOmegaPi.cxx index 48c965826e3..369b5374f7e 100644 --- a/PWGHF/TableProducer/treeCreatorOmegacToOmegaPi.cxx +++ b/PWGHF/TableProducer/treeCreatorOmegacToOmegaPi.cxx @@ -15,6 +15,7 @@ /// /// \author Federica Zanone , Heidelberg University /// \author Yunfan Liu , China University of Geosciences +/// \author Fabio Catalano , University of Houston #include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" @@ -26,6 +27,7 @@ using namespace o2; using namespace o2::framework; +using namespace o2::framework::expressions; namespace o2::aod { @@ -176,7 +178,7 @@ DECLARE_SOA_TABLE(HfOmegac0ToOmegaPiLites, "AOD", "HFTOOMEPILITE", full::PidTpcInfoStored, full::PidTofInfoStored, full::TpcNSigmaPiFromCharmBaryon, full::TpcNSigmaKaFromCasc, full::TpcNSigmaPiFromLambda, full::TpcNSigmaPrFromLambda, full::TofNSigmaPiFromCharmBaryon, full::TofNSigmaKaFromCasc, full::TofNSigmaPiFromLambda, full::TofNSigmaPrFromLambda, - full::FlagMcMatchRec, full::OriginRec, full::CollisionMatched); + full::FlagMcMatchRec, full::OriginRec, full::CollisionMatched, hf_track_index::HFflag); DECLARE_SOA_TABLE(HfKfOmegacFulls, "AOD", "HFKFOMEGACFULL", full::NSigmaTPCPiFromOmegac, full::NSigmaTOFPiFromOmegac, full::NSigmaTPCKaFromCasc, full::NSigmaTOFKaFromCasc, @@ -197,7 +199,7 @@ DECLARE_SOA_TABLE(HfKfOmegacFulls, "AOD", "HFKFOMEGACFULL", full::MassV0Ndf, full::MassCascNdf, full::V0Chi2OverNdf, full::CascChi2OverNdf, full::OmegacChi2OverNdf, full::MassV0Chi2OverNdf, full::MassCascChi2OverNdf, full::CascRejectInvmass, - full::FlagMcMatchRec, full::OriginRec, full::CollisionMatched); + full::FlagMcMatchRec, full::OriginRec, full::CollisionMatched, hf_track_index::HFflag); DECLARE_SOA_TABLE(HfKfOmegacLites, "AOD", "HFKFOMEGACLITE", full::NSigmaTPCPiFromOmegac, full::NSigmaTOFPiFromOmegac, full::NSigmaTPCKaFromCasc, full::NSigmaTOFKaFromCasc, @@ -211,7 +213,7 @@ DECLARE_SOA_TABLE(HfKfOmegacLites, "AOD", "HFKFOMEGACLITE", full::CosThetaStarPiFromOmegac, full::CtOmegac, full::EtaOmegac, full::V0Chi2OverNdf, full::CascChi2OverNdf, full::OmegacChi2OverNdf, full::CascRejectInvmass, - full::FlagMcMatchRec, full::OriginRec, full::CollisionMatched); + full::FlagMcMatchRec, full::OriginRec, full::CollisionMatched, hf_track_index::HFflag); } // namespace o2::aod /// Writes the full information in an output TTree @@ -225,8 +227,12 @@ struct HfTreeCreatorOmegacToOmegaPi { Configurable zPvCut{"zPvCut", 10., "Cut on absolute value of primary vertex z coordinate"}; Configurable keepOnlyMcSignal{"keepOnlyMcSignal", true, "Fill MC tree only with signal candidates"}; - using MyTrackTable = soa::Join; - using MyEventTable = soa::Join; + using Tracks = soa::Join; + using Colls = soa::Join; + using CandKfSel = soa::Filtered>; + using CascKfMcSel = soa::Filtered>; + + Filter filterOmegaCToOmegaPiFlag = (o2::aod::hf_track_index::hfflag & static_cast(BIT(aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaPi))) != static_cast(0); void init(InitContext const&) { @@ -247,8 +253,8 @@ struct HfTreeCreatorOmegacToOmegaPi { candidate.xPv(), candidate.yPv(), candidate.zPv(), - candidate.template collision_as().numContrib(), - candidate.template collision_as().chi2(), + candidate.template collision_as().numContrib(), + candidate.template collision_as().chi2(), candidate.xDecayVtxCharmBaryon(), candidate.yDecayVtxCharmBaryon(), candidate.zDecayVtxCharmBaryon(), @@ -294,8 +300,8 @@ struct HfTreeCreatorOmegacToOmegaPi { candidate.errorDecayLengthCharmBaryon(), candidate.impactParCascXY() / candidate.errImpactParCascXY(), candidate.impactParBachFromCharmBaryonXY() / candidate.errImpactParBachFromCharmBaryonXY(), - candidate.template bachelorFromCharmBaryon_as().isGlobalTrackWoDCA(), - candidate.template bachelorFromCharmBaryon_as().itsNCls(), + candidate.template bachelorFromCharmBaryon_as().isGlobalTrackWoDCA(), + candidate.template bachelorFromCharmBaryon_as().itsNCls(), candidate.pidTpcInfoStored(), candidate.pidTofInfoStored(), candidate.tpcNSigmaPiFromCharmBaryon(), @@ -308,7 +314,8 @@ struct HfTreeCreatorOmegacToOmegaPi { candidate.tofNSigmaPrFromLambda(), flagMc, originMc, - collisionMatched); + collisionMatched, + candidate.hfflag()); } } @@ -376,7 +383,8 @@ struct HfTreeCreatorOmegacToOmegaPi { candidate.cascRejectInvmass(), flagMc, originMc, - collisionMatched); + collisionMatched, + candidate.hfflag()); } } @@ -418,12 +426,13 @@ struct HfTreeCreatorOmegacToOmegaPi { candidate.cascRejectInvmass(), flagMc, originMc, - collisionMatched); + collisionMatched, + candidate.hfflag()); } } // fillKfCandidateLite end - void processDataLite(MyEventTable const& collisions, MyTrackTable const&, - soa::Join const& candidates) + void processDataLite(Colls const& collisions, Tracks const&, + soa::Filtered> const& candidates) { // Filling event properties rowEv.reserve(collisions.size()); @@ -439,8 +448,7 @@ struct HfTreeCreatorOmegacToOmegaPi { } PROCESS_SWITCH(HfTreeCreatorOmegacToOmegaPi, processDataLite, "Process data", true); - void processKfDataFull(MyEventTable const& collisions, MyTrackTable const&, - soa::Join const& candidates) + void processKfDataFull(Colls const& collisions, Tracks const&, CandKfSel const& candidates) { // Filling event properties rowEv.reserve(collisions.size()); @@ -456,8 +464,7 @@ struct HfTreeCreatorOmegacToOmegaPi { } PROCESS_SWITCH(HfTreeCreatorOmegacToOmegaPi, processKfDataFull, "Process KF data", false); - void processKfDataLite(MyEventTable const& collisions, MyTrackTable const&, - soa::Join const& candidates) + void processKfDataLite(Colls const& collisions, Tracks const&, CandKfSel const& candidates) { // Filling event properties rowEv.reserve(collisions.size()); @@ -473,8 +480,8 @@ struct HfTreeCreatorOmegacToOmegaPi { } PROCESS_SWITCH(HfTreeCreatorOmegacToOmegaPi, processKfDataLite, "Process KF data Lite", false); - void processMcLite(MyEventTable const& collisions, MyTrackTable const&, - soa::Join const& candidates) + void processMcLite(Colls const& collisions, Tracks const&, + soa::Filtered> const& candidates) { // Filling event properties rowEv.reserve(collisions.size()); @@ -490,8 +497,7 @@ struct HfTreeCreatorOmegacToOmegaPi { } PROCESS_SWITCH(HfTreeCreatorOmegacToOmegaPi, processMcLite, "Process MC", false); - void processKFMcFull(MyEventTable const& collisions, MyTrackTable const&, - soa::Join const& candidates) + void processKFMcFull(Colls const& collisions, Tracks const&, CascKfMcSel const& candidates) { // Filling event properties rowEv.reserve(collisions.size()); @@ -513,8 +519,7 @@ struct HfTreeCreatorOmegacToOmegaPi { } PROCESS_SWITCH(HfTreeCreatorOmegacToOmegaPi, processKFMcFull, "Process KF MC", false); - void processKFMcLite(MyEventTable const& collisions, MyTrackTable const&, - soa::Join const& candidates) + void processKFMcLite(Colls const& collisions, Tracks const&, CascKfMcSel const& candidates) { // Filling event properties rowEv.reserve(collisions.size()); From 518484065fbef83bfd07fcad855059e77c6dc5fa Mon Sep 17 00:00:00 2001 From: Preet-Bhanjan Date: Tue, 15 Apr 2025 19:25:10 +0200 Subject: [PATCH 0997/1650] [PWGCF] Added track density cuts (#10828) Co-authored-by: Preet Pati Co-authored-by: Preet Pati --- PWGCF/Flow/Tasks/resonancesGfwFlow.cxx | 739 +++++++++++++++---------- 1 file changed, 440 insertions(+), 299 deletions(-) diff --git a/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx b/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx index 27db0d00551..6bde6c05c99 100644 --- a/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx +++ b/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx @@ -64,23 +64,28 @@ using namespace std; namespace { -std::shared_ptr phiC22Boot[10]; -std::shared_ptr phiC24Boot[10]; -std::shared_ptr k0C22Boot[10]; -std::shared_ptr k0C24Boot[10]; -std::shared_ptr lambdaC22Boot[10]; -std::shared_ptr lambdaC24Boot[10]; -std::shared_ptr anLambdaC22Boot[10]; -std::shared_ptr anLambdaC24Boot[10]; - -std::shared_ptr phiD22PtBoot[10]; -std::shared_ptr phiD24PtBoot[10]; -std::shared_ptr k0D22PtBoot[10]; -std::shared_ptr k0D24PtBoot[10]; -std::shared_ptr lambdaD22PtBoot[10]; -std::shared_ptr lambdaD24PtBoot[10]; -std::shared_ptr anLambdaD22PtBoot[10]; -std::shared_ptr anLambdaD24PtBoot[10]; +std::shared_ptr refC22Boot[10]; +std::shared_ptr refC24Boot[10]; + +std::shared_ptr phiD22FPtBoot[10]; +std::shared_ptr phiD22BPtBoot[10]; +std::shared_ptr phiD24FPtBoot[10]; +std::shared_ptr phiD24BPtBoot[10]; + +std::shared_ptr k0D22FPtBoot[10]; +std::shared_ptr k0D22BPtBoot[10]; +std::shared_ptr k0D24FPtBoot[10]; +std::shared_ptr k0D24BPtBoot[10]; + +std::shared_ptr lambdaD22FPtBoot[10]; +std::shared_ptr lambdaD22BPtBoot[10]; +std::shared_ptr lambdaD24FPtBoot[10]; +std::shared_ptr lambdaD24BPtBoot[10]; + +std::shared_ptr anLambdaD22FPtBoot[10]; +std::shared_ptr anLambdaD22BPtBoot[10]; +std::shared_ptr anLambdaD24FPtBoot[10]; +std::shared_ptr anLambdaD24BPtBoot[10]; } // namespace #define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable NAME{#NAME, DEFAULT, HELP}; @@ -98,21 +103,15 @@ struct ResonancesGfwFlow { O2_DEFINE_CONFIGURABLE(cfgCutEta, float, 0.8f, "Eta range for tracks") O2_DEFINE_CONFIGURABLE(cfgCutChi2prTPCcls, float, 2.5, "Chi2 per TPC clusters") O2_DEFINE_CONFIGURABLE(cfgTpcCluster, int, 70, "Number of TPC clusters") - O2_DEFINE_CONFIGURABLE(cfgUseNch, bool, false, "Use Nch for flow observables") - O2_DEFINE_CONFIGURABLE(cfgNbootstrap, int, 10, "Number of subsamples") O2_DEFINE_CONFIGURABLE(cfgTpcNsigmaCut, float, 3.0f, "TPC N-sigma cut for pions, kaons, protons") O2_DEFINE_CONFIGURABLE(cfgTofNsigmaCut, float, 3.0f, "TOF N-sigma cut for pions, kaons, protons") O2_DEFINE_CONFIGURABLE(cfgTofPtCut, float, 0.5f, "Minimum pt to use TOF N-sigma") O2_DEFINE_CONFIGURABLE(cfgITScluster, int, 0, "Number of ITS cluster") - O2_DEFINE_CONFIGURABLE(cfgCutTOFBeta, float, 0.0, "cut TOF beta") O2_DEFINE_CONFIGURABLE(cfgCutOccupancy, int, 3000, "Occupancy cut") O2_DEFINE_CONFIGURABLE(cfgUseGlobalTrack, bool, true, "use Global track") O2_DEFINE_CONFIGURABLE(cfgFakeKaonCut, float, 0.1f, "Maximum difference in measured momentum and TPC inner ring momentum of particle") O2_DEFINE_CONFIGURABLE(cfgRapidityCut, float, 0.5, "Rapidity cut for the reconstructed particles") O2_DEFINE_CONFIGURABLE(cfgUseCosPA, bool, false, "Use Pointing angle for resonances") - O2_DEFINE_CONFIGURABLE(cfgPhiCosPA, float, 0.04f, "Minimum Pointing angle for Phi") - O2_DEFINE_CONFIGURABLE(cfgK0CosPA, float, 0.97f, "Minimum Pointing angle for K0") - O2_DEFINE_CONFIGURABLE(cfgLambdaCosPA, float, 0.995f, "Minimum Pointing angle for Lambda") O2_DEFINE_CONFIGURABLE(cfgUseV0Radius, bool, true, "Use V0 radius for particle identification") O2_DEFINE_CONFIGURABLE(cfgLambdaRadiusMin, float, 0.5f, "Minimum Lambda radius in cm") O2_DEFINE_CONFIGURABLE(cfgLambdaRadiusMax, float, 200.0f, "Maximum Lambda radius in cm") @@ -125,28 +124,45 @@ struct ResonancesGfwFlow { O2_DEFINE_CONFIGURABLE(cfgCutDCAz, float, 2.0f, "DCAz range for tracks") O2_DEFINE_CONFIGURABLE(cfgDCALambdaPosToPVMin, float, 0.1f, "minimum DCA to PV for Lambda positive track") O2_DEFINE_CONFIGURABLE(cfgDCALambdaNegToPVMin, float, 0.25f, "minimum DCA to PV for Lambda negative track") - O2_DEFINE_CONFIGURABLE(cfgDCALambdaBetDaug, int, 1, "Maximum DCA between Lambda daughter tracks") O2_DEFINE_CONFIGURABLE(cfgDCAK0PosToPVMin, float, 0.06f, "minimum DCA to PV for K0 positive track") O2_DEFINE_CONFIGURABLE(cfgDCAK0NegToPVMin, float, 0.06f, "minimum DCA to PV for K0 negative track") - O2_DEFINE_CONFIGURABLE(cfgDCAK0BetDaug, int, 1, "Maximum DCA between K0 daughter tracks") - O2_DEFINE_CONFIGURABLE(cfgMassLambdaMin, float, 1.1f, "minimum lambda mass") - O2_DEFINE_CONFIGURABLE(cfgMassLambdaMax, float, 1.16f, "maximum lambda mass") - O2_DEFINE_CONFIGURABLE(cfgMassK0Min, float, 0.44f, "minimum K0short mass") - O2_DEFINE_CONFIGURABLE(cfgMassK0Max, float, 0.56f, "maximum K0short mass") O2_DEFINE_CONFIGURABLE(cfgUseMCCLambda, bool, false, "Use mass cross check for lambda") O2_DEFINE_CONFIGURABLE(cfgUseMCCK0, bool, false, "Use mass cross check for K0") - - O2_DEFINE_CONFIGURABLE(cfgNPhiMassBins, double, 70, "Invasriant mass bins for phi") - O2_DEFINE_CONFIGURABLE(cfgNK0MassBins, double, 70, "Invasriant mass bins for K0") - O2_DEFINE_CONFIGURABLE(cfgNLambdaMassBins, double, 70, "Invasriant mass bins for lambda") - O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeights, bool, true, "Fill and output NUA weights") O2_DEFINE_CONFIGURABLE(cfgAcceptance, std::string, "", "CCDB path to acceptance object") - O2_DEFINE_CONFIGURABLE(cfgUseWeightPhiEtaVtxz, bool, true, "Use Phi, Eta, VertexZ dependent NUA weights") O2_DEFINE_CONFIGURABLE(cfgUseWeightPhiPtCent, bool, false, "Use Phi, Pt, Centrality dependent NUA weights") O2_DEFINE_CONFIGURABLE(cfgUseWeightPhiEtaPt, bool, false, "Use Phi, Eta, Pt dependent NUA weights") + O2_DEFINE_CONFIGURABLE(cfgNbootstrap, int, 10, "Number of subsamples") O2_DEFINE_CONFIGURABLE(cfgUseBootStrap, bool, true, "Use bootstrap for error estimation") + O2_DEFINE_CONFIGURABLE(cfgTrackDensityCorrUse, bool, false, "Use track density efficiency correction") + O2_DEFINE_CONFIGURABLE(cfgUseK0, bool, true, "Analyze K0") + O2_DEFINE_CONFIGURABLE(cfgUseLambda, bool, true, "Analyze Lambda") + O2_DEFINE_CONFIGURABLE(cfgUsePhi, bool, true, "Analyze Phi") + + struct : ConfigurableGroup { + Configurable> cfgCosPAs{"cfgCosPAs", std::vector{0.97f, 0.995f, 0.04f}, "Minimum Pointing angle for resonances [K0, Lambda, Phi]"}; + Configurable> cfgDCABetDaug{"cfgDCABetDaug", std::vector{1, 1, 1}, "Maximum DCA between resonance daughters [K0, Lambda, Phi]"}; + Configurable> cfgMassMin{"cfgMassMin", std::vector{0.44f, 1.1f, 0.99f}, "Minimum mass for resonances [K0, Lambda, Phi]"}; + Configurable> cfgMassMax{"cfgMassMax", std::vector{0.56f, 1.16f, 1.06f}, "Maximum mass for resonances [K0, Lambda, Phi]"}; + Configurable> cfgNMassBins{"cfgNMassBins", std::vector{70, 70, 70}, "Invariant mass bins for resonances [K0, Lambda, Phi]"}; + Configurable> cfgMccCut{"cfgMccCut", std::vector{0.005f, 0.01f}, "MCC cut for resonances [K0, Lambda]"}; + Configurable> cfgPosTrackPt{"cfgPosTrackPt", std::vector{0.15f, 0.15f, 0.15f}, "Pt cut for positive track of resonances [K0, Lambda, Phi]"}; + Configurable> cfgNegTrackPt{"cfgNegTrackPt", std::vector{0.15f, 0.15f, 0.15f}, "Pt cut for negative track of resonances [K0, Lambda, Phi]"}; + } resoCuts; + + Configurable> cfgTrackDensityP0{"cfgTrackDensityP0", std::vector{0.7217476707, 0.7384792571, 0.7542625668, 0.7640680200, 0.7701951667, 0.7755299053, 0.7805901710, 0.7849446786, 0.7957356586, 0.8113039262, 0.8211968966, 0.8280558878, 0.8329342135}, "parameter 0 for track density efficiency correction"}; + Configurable> cfgTrackDensityP1{"cfgTrackDensityP1", std::vector{-2.169488e-05, -2.191913e-05, -2.295484e-05, -2.556538e-05, -2.754463e-05, -2.816832e-05, -2.846502e-05, -2.843857e-05, -2.705974e-05, -2.477018e-05, -2.321730e-05, -2.203315e-05, -2.109474e-05}, "parameter 1 for track density efficiency correction"}; + + // Reading in the configurables + std::vector vMassMin = resoCuts.cfgMassMin; + std::vector vMassMax = resoCuts.cfgMassMax; + std::vector vMassBins = resoCuts.cfgNMassBins; + std::vector vCosPAs = resoCuts.cfgCosPAs; + std::vector vDCABetDaug = resoCuts.cfgDCABetDaug; + std::vector vMccCut = resoCuts.cfgMccCut; + std::vector vPosTrackPt = resoCuts.cfgPosTrackPt; + std::vector vNegTrackPt = resoCuts.cfgNegTrackPt; // Defining configurable axis ConfigurableAxis axisVertex{"axisVertex", {20, -10, 10}, "vertex axis for histograms"}; @@ -157,9 +173,9 @@ struct ResonancesGfwFlow { ConfigurableAxis axisNsigmaTPC{"axisNsigmaTPC", {80, -5, 5}, "nsigmaTPC axis"}; ConfigurableAxis axisNsigmaTOF{"axisNsigmaTOF", {80, -5, 5}, "nsigmaTOF axis"}; ConfigurableAxis axisParticles{"axisParticles", {3, 0, 3}, "axis for different hadrons"}; - ConfigurableAxis axisPhiMass{"axisPhiMass", {cfgNPhiMassBins, 0.99, 1.06}, "axis for invariant mass distibution for Phi"}; - ConfigurableAxis axisK0Mass{"axisK0Mass", {cfgNK0MassBins, cfgMassK0Min, cfgMassK0Max}, "axis for invariant mass distibution for K0"}; - ConfigurableAxis axisLambdaMass{"axisLambdaMass", {cfgNLambdaMassBins, cfgMassLambdaMin, cfgMassLambdaMax}, "axis for invariant mass distibution for Lambda"}; + ConfigurableAxis axisPhiMass{"axisPhiMass", {vMassBins[Phi - 2], vMassMin[Phi - 2], vMassMax[Phi - 2]}, "axis for invariant mass distibution for Phi"}; + ConfigurableAxis axisK0Mass{"axisK0Mass", {vMassBins[K0 - 1], vMassMin[K0 - 1], vMassMax[K0 - 1]}, "axis for invariant mass distibution for K0"}; + ConfigurableAxis axisLambdaMass{"axisLambdaMass", {vMassBins[Lambda - 1], vMassMin[Lambda - 1], vMassMax[Lambda - 1]}, "axis for invariant mass distibution for Lambda"}; ConfigurableAxis axisTPCsignal{"axisTPCsignal", {10000, 0, 1000}, "axis for TPC signal"}; ConfigurableAxis axisTOFsignal{"axisTOFsignal", {10000, 0, 1000}, "axis for TOF signal"}; @@ -185,19 +201,27 @@ struct ResonancesGfwFlow { TRandom3* fRndm = new TRandom3(0); enum OutputSpecies { - hRef = 0, - hK0 = 1, - hLambda = 2, - hAnLambda = 3, - hPhi = 4, + Ref = 0, + K0 = 1, + Lambda = 2, + AnLambda = 3, + Phi = 4, kCount_OutputSpecies }; std::vector mAcceptance; bool correctionsLoaded = false; + // local track density correction + std::vector funcEff; + TH1D* hFindPtBin; + TF1* funcV2; + TF1* funcV3; + TF1* funcV4; + void init(InitContext const&) { + // Initilizing ccdb ccdb->setURL(ccdbUrl.value); ccdb->setCaching(true); ccdb->setCreatedNotAfter(noLaterThan.value); @@ -208,58 +232,93 @@ struct ResonancesGfwFlow { histos.add("hMult", "", {HistType::kTH1D, {{3000, 0.5, 3000.5}}}); histos.add("hCent", "", {HistType::kTH1D, {{90, 0, 90}}}); - histos.add("KaplusTPC", "", {HistType::kTH2D, {{axisPt, axisTPCsignal}}}); - histos.add("KaminusTPC", "", {HistType::kTH2D, {{axisPt, axisTPCsignal}}}); - histos.add("KaplusTOF", "", {HistType::kTH2D, {{axisPt, axisTOFsignal}}}); - histos.add("KaminusTOF", "", {HistType::kTH2D, {{axisPt, axisTOFsignal}}}); - histos.add("hPhiPhi", "", {HistType::kTH1D, {axisPhi}}); - histos.add("hPhiEta", "", {HistType::kTH1D, {axisEta}}); - histos.add("hPhiMass_sparse", "", {HistType::kTHnSparseD, {{axisPhiMass, axisPt, axisMultiplicity}}}); - - histos.add("PlusTPC_L", "", {HistType::kTH2D, {{axisPt, axisTPCsignal}}}); - histos.add("MinusTPC_L", "", {HistType::kTH2D, {{axisPt, axisTPCsignal}}}); - histos.add("PlusTOF_L", "", {HistType::kTH2D, {{axisPt, axisTOFsignal}}}); - histos.add("MinusTOF_L", "", {HistType::kTH2D, {{axisPt, axisTOFsignal}}}); - histos.add("hLambdaPhi", "", {HistType::kTH1D, {axisPhi}}); - histos.add("hLambdaEta", "", {HistType::kTH1D, {axisEta}}); - histos.add("hLambdaMass_sparse", "", {HistType::kTHnSparseF, {{axisLambdaMass, axisPt, axisMultiplicity}}}); - histos.add("PlusTPC_AL", "", {HistType::kTH2D, {{axisPt, axisTPCsignal}}}); - histos.add("MinusTPC_AL", "", {HistType::kTH2D, {{axisPt, axisTPCsignal}}}); - histos.add("PlusTOF_AL", "", {HistType::kTH2D, {{axisPt, axisTOFsignal}}}); - histos.add("MinusTOF_AL", "", {HistType::kTH2D, {{axisPt, axisTOFsignal}}}); - histos.add("hAntiLambdaPhi", "", {HistType::kTH1D, {axisPhi}}); - histos.add("hAntiLambdaEta", "", {HistType::kTH1D, {axisEta}}); - histos.add("hAntiLambdaMass_sparse", "", {HistType::kTHnSparseF, {{axisLambdaMass, axisPt, axisMultiplicity}}}); - histos.add("hLambdas", "", {HistType::kTH1D, {singleCount}}); - - histos.add("PlusTPC_K0", "", {HistType::kTH2D, {{axisPt, axisTPCsignal}}}); - histos.add("MinusTPC_K0", "", {HistType::kTH2D, {{axisPt, axisTPCsignal}}}); - histos.add("PlusTOF_K0", "", {HistType::kTH2D, {{axisPt, axisTOFsignal}}}); - histos.add("MinusTOF_K0", "", {HistType::kTH2D, {{axisPt, axisTOFsignal}}}); - histos.add("hK0Phi", "", {HistType::kTH1D, {axisPhi}}); - histos.add("hK0Eta", "", {HistType::kTH1D, {axisEta}}); - histos.add("hK0Mass_sparse", "", {HistType::kTHnSparseF, {{axisK0Mass, axisPt, axisMultiplicity}}}); - histos.add("hK0s", "", {HistType::kTH1D, {singleCount}}); - - histos.add("Phic22", "", {HistType::kTProfile, {axisMultiplicity}}); - histos.add("Phic24", "", {HistType::kTProfile, {axisMultiplicity}}); - histos.add("Phiv22pt", "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); - histos.add("Phiv24pt", "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); - - histos.add("K0c22", "", {HistType::kTProfile, {axisMultiplicity}}); - histos.add("K0c24", "", {HistType::kTProfile, {axisMultiplicity}}); - histos.add("K0v22pt", "", {HistType::kTProfile3D, {axisPt, axisK0Mass, axisMultiplicity}}); - histos.add("K0v24pt", "", {HistType::kTProfile3D, {axisPt, axisK0Mass, axisMultiplicity}}); - - histos.add("Lambdac22", "", {HistType::kTProfile, {axisMultiplicity}}); - histos.add("Lambdac24", "", {HistType::kTProfile, {axisMultiplicity}}); - histos.add("Lambdav22pt", "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); - histos.add("Lambdav24pt", "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); - - histos.add("AnLambdac22", "", {HistType::kTProfile, {axisMultiplicity}}); - histos.add("AnLambdac24", "", {HistType::kTProfile, {axisMultiplicity}}); - histos.add("AnLambdav22pt", "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); - histos.add("AnLambdav24pt", "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); + histos.add("Refc22", "", {HistType::kTProfile, {axisMultiplicity}}); + histos.add("Refc24", "", {HistType::kTProfile, {axisMultiplicity}}); + + if (cfgUsePhi) { + histos.add("KaplusTPC", "", {HistType::kTH2D, {{axisPt, axisTPCsignal}}}); + histos.add("KaminusTPC", "", {HistType::kTH2D, {{axisPt, axisTPCsignal}}}); + histos.add("KaplusTOF", "", {HistType::kTH2D, {{axisPt, axisTOFsignal}}}); + histos.add("KaminusTOF", "", {HistType::kTH2D, {{axisPt, axisTOFsignal}}}); + histos.add("hPhiPhi", "", {HistType::kTH1D, {axisPhi}}); + histos.add("hPhiEta", "", {HistType::kTH1D, {axisEta}}); + histos.add("hPhiMass_sparse", "", {HistType::kTHnSparseD, {{axisPhiMass, axisPt, axisMultiplicity}}}); + + histos.add("Phid22Fpt", "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); + histos.add("Phid24Fpt", "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); + histos.add("Phid22Bpt", "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); + histos.add("Phid24Bpt", "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); + } + + if (cfgUseLambda) { + histos.add("PlusTPC_L", "", {HistType::kTH2D, {{axisPt, axisTPCsignal}}}); + histos.add("MinusTPC_L", "", {HistType::kTH2D, {{axisPt, axisTPCsignal}}}); + histos.add("PlusTOF_L", "", {HistType::kTH2D, {{axisPt, axisTOFsignal}}}); + histos.add("MinusTOF_L", "", {HistType::kTH2D, {{axisPt, axisTOFsignal}}}); + histos.add("hLambdaPhi", "", {HistType::kTH1D, {axisPhi}}); + histos.add("hLambdaEta", "", {HistType::kTH1D, {axisEta}}); + histos.add("hLambdaMass_sparse", "", {HistType::kTHnSparseF, {{axisLambdaMass, axisPt, axisMultiplicity}}}); + histos.add("PlusTPC_AL", "", {HistType::kTH2D, {{axisPt, axisTPCsignal}}}); + histos.add("MinusTPC_AL", "", {HistType::kTH2D, {{axisPt, axisTPCsignal}}}); + histos.add("PlusTOF_AL", "", {HistType::kTH2D, {{axisPt, axisTOFsignal}}}); + histos.add("MinusTOF_AL", "", {HistType::kTH2D, {{axisPt, axisTOFsignal}}}); + histos.add("hAntiLambdaPhi", "", {HistType::kTH1D, {axisPhi}}); + histos.add("hAntiLambdaEta", "", {HistType::kTH1D, {axisEta}}); + histos.add("hAntiLambdaMass_sparse", "", {HistType::kTHnSparseF, {{axisLambdaMass, axisPt, axisMultiplicity}}}); + histos.add("hLambdas", "", {HistType::kTH1D, {singleCount}}); + + histos.add("Lambdad22Fpt", "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); + histos.add("Lambdad24Fpt", "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); + histos.add("Lambdad22Bpt", "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); + histos.add("Lambdad24Bpt", "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); + + histos.add("AnLambdad22Fpt", "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); + histos.add("AnLambdad24Fpt", "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); + histos.add("AnLambdad22Bpt", "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); + histos.add("AnLambdad24Bpt", "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); + + histos.add("hLambdaCount", "Number of Lambda;; Count", {HistType::kTH1D, {{11, 0, 11}}}); + histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(1, "Lambda candidates"); + histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(2, "Daughter pt"); + histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(3, "Mass cut"); + histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(4, "Rapidity cut"); + histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(5, "DCA to PV"); + histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(6, "DCA between daughters"); + histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(7, "V0radius"); + histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(8, "CosPA"); + histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(9, "Proper lifetime"); + histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(10, "Daughter track selection"); + histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(11, "Mass cross check"); + } + + if (cfgUseK0) { + histos.add("PlusTPC_K0", "", {HistType::kTH2D, {{axisPt, axisTPCsignal}}}); + histos.add("MinusTPC_K0", "", {HistType::kTH2D, {{axisPt, axisTPCsignal}}}); + histos.add("PlusTOF_K0", "", {HistType::kTH2D, {{axisPt, axisTOFsignal}}}); + histos.add("MinusTOF_K0", "", {HistType::kTH2D, {{axisPt, axisTOFsignal}}}); + histos.add("hK0Phi", "", {HistType::kTH1D, {axisPhi}}); + histos.add("hK0Eta", "", {HistType::kTH1D, {axisEta}}); + histos.add("hK0Mass_sparse", "", {HistType::kTHnSparseF, {{axisK0Mass, axisPt, axisMultiplicity}}}); + histos.add("hK0s", "", {HistType::kTH1D, {singleCount}}); + + histos.add("K0d22Fpt", "", {HistType::kTProfile3D, {axisPt, axisK0Mass, axisMultiplicity}}); + histos.add("K0d24Fpt", "", {HistType::kTProfile3D, {axisPt, axisK0Mass, axisMultiplicity}}); + histos.add("K0d22Bpt", "", {HistType::kTProfile3D, {axisPt, axisK0Mass, axisMultiplicity}}); + histos.add("K0d24Bpt", "", {HistType::kTProfile3D, {axisPt, axisK0Mass, axisMultiplicity}}); + + histos.add("hK0Count", "Number of K0;; Count", {HistType::kTH1D, {{11, 0, 11}}}); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(1, "K0 candidates"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(2, "Daughter pt"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(3, "Mass cut"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(4, "Rapidity cut"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(5, "DCA to PV"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(6, "DCA between daughters"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(7, "V0radius"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(8, "CosPA"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(9, "Proper lifetime"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(10, "Daughter track selection"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(11, "Mass cross check"); + } histos.add("hEventCount", "Number of Event;; Count", {HistType::kTH1D, {{8, 0, 8}}}); histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(1, "Filtered event"); @@ -271,32 +330,6 @@ struct ResonancesGfwFlow { histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(7, "kNoCollInTimeRangeStandard"); histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(8, "After Occupancy"); - histos.add("hLambdaCount", "Number of Lambda;; Count", {HistType::kTH1D, {{11, 0, 11}}}); - histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(1, "Lambda candidates"); - histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(2, "Daughter pt"); - histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(3, "Mass cut"); - histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(4, "Rapidity cut"); - histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(5, "DCA to PV"); - histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(6, "DCA between daughters"); - histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(7, "V0radius"); - histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(8, "CosPA"); - histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(9, "Proper lifetime"); - histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(10, "Daughter track selection"); - histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(11, "Mass cross check"); - - histos.add("hK0Count", "Number of K0;; Count", {HistType::kTH1D, {{11, 0, 11}}}); - histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(1, "K0 candidates"); - histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(2, "Daughter pt"); - histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(3, "Mass cut"); - histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(4, "Rapidity cut"); - histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(5, "DCA to PV"); - histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(6, "DCA between daughters"); - histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(7, "V0radius"); - histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(8, "CosPA"); - histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(9, "Proper lifetime"); - histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(10, "Daughter track selection"); - histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(11, "Mass cross check"); - if (cfgOutputNUAWeights) { histos.add("NUA/hPhiEtaVtxz_ref", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); histos.add("NUA/hPhiEtaVtxz_k0", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); @@ -318,39 +351,47 @@ struct ResonancesGfwFlow { } if (cfgUseBootStrap) { - for (int i = 0; i < 10; i++) { - phiC22Boot[i] = histos.add(Form("BootStrap/Phic22_bootstrap_%d", i), "", {HistType::kTProfile, {axisMultiplicity}}); - phiC24Boot[i] = histos.add(Form("BootStrap/Phic24_bootstrap_%d", i), "", {HistType::kTProfile, {axisMultiplicity}}); - k0C22Boot[i] = histos.add(Form("BootStrap/k0c22_bootstrap_%d", i), "", {HistType::kTProfile, {axisMultiplicity}}); - k0C24Boot[i] = histos.add(Form("BootStrap/k0c24_bootstrap_%d", i), "", {HistType::kTProfile, {axisMultiplicity}}); - lambdaC22Boot[i] = histos.add(Form("BootStrap/lambdac22_bootstrap_%d", i), "", {HistType::kTProfile, {axisMultiplicity}}); - lambdaC24Boot[i] = histos.add(Form("BootStrap/lambdac24_bootstrap_%d", i), "", {HistType::kTProfile, {axisMultiplicity}}); - anLambdaC22Boot[i] = histos.add(Form("BootStrap/anlambdac22_bootstrap_%d", i), "", {HistType::kTProfile, {axisMultiplicity}}); - anLambdaC24Boot[i] = histos.add(Form("BootStrap/anlambdac24_bootstrap_%d", i), "", {HistType::kTProfile, {axisMultiplicity}}); - - phiD22PtBoot[i] = histos.add(Form("BootStrap/Phid22pt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); - phiD24PtBoot[i] = histos.add(Form("BootStrap/Phid24pt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); - k0D22PtBoot[i] = histos.add(Form("BootStrap/k0d22pt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisK0Mass, axisMultiplicity}}); - k0D24PtBoot[i] = histos.add(Form("BootStrap/k0d24pt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisK0Mass, axisMultiplicity}}); - lambdaD22PtBoot[i] = histos.add(Form("BootStrap/lambdad22pt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); - lambdaD24PtBoot[i] = histos.add(Form("BootStrap/lambdad24pt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); - anLambdaD22PtBoot[i] = histos.add(Form("BootStrap/anlambdad22pt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); - anLambdaD24PtBoot[i] = histos.add(Form("BootStrap/anlambdad24pt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); - } - } + for (int i = 0; i < cfgNbootstrap; i++) { + refC22Boot[i] = histos.add(Form("BootStrap/Refc22_bootstrap_%d", i), "", {HistType::kTProfile, {axisMultiplicity}}); + refC24Boot[i] = histos.add(Form("BootStrap/Refc24_bootstrap_%d", i), "", {HistType::kTProfile, {axisMultiplicity}}); + if (cfgUsePhi) { + phiD22FPtBoot[i] = histos.add(Form("BootStrap/Phid22Fpt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); + phiD24FPtBoot[i] = histos.add(Form("BootStrap/Phid24Fpt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); + phiD22BPtBoot[i] = histos.add(Form("BootStrap/Phid22Bpt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); + phiD24BPtBoot[i] = histos.add(Form("BootStrap/Phid24Bpt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); + } + if (cfgUseK0) { + k0D22FPtBoot[i] = histos.add(Form("BootStrap/k0d22Fpt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisK0Mass, axisMultiplicity}}); + k0D24FPtBoot[i] = histos.add(Form("BootStrap/k0d24Fpt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisK0Mass, axisMultiplicity}}); + k0D22BPtBoot[i] = histos.add(Form("BootStrap/k0d22Bpt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisK0Mass, axisMultiplicity}}); + k0D24BPtBoot[i] = histos.add(Form("BootStrap/k0d24Bpt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisK0Mass, axisMultiplicity}}); + } + if (cfgUseLambda) { + lambdaD22FPtBoot[i] = histos.add(Form("BootStrap/lambdad22Fpt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); + lambdaD24FPtBoot[i] = histos.add(Form("BootStrap/lambdad24Fpt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); + lambdaD22BPtBoot[i] = histos.add(Form("BootStrap/lambdad22Bpt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); + lambdaD24BPtBoot[i] = histos.add(Form("BootStrap/lambdad24Bpt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); + + anLambdaD22FPtBoot[i] = histos.add(Form("BootStrap/anlambdad22Fpt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); + anLambdaD24FPtBoot[i] = histos.add(Form("BootStrap/anlambdad24Fpt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); + anLambdaD22BPtBoot[i] = histos.add(Form("BootStrap/anlambdad22Bpt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); + anLambdaD24BPtBoot[i] = histos.add(Form("BootStrap/anlambdad24Bpt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); + } + } // end of bootstrap loop + } // end of bootstrap condition o2::framework::AxisSpec axis = axisPt; int nPtBins = axis.binEdges.size() - 1; double* ptBins = &(axis.binEdges)[0]; fPtAxis = new TAxis(nPtBins, ptBins); - fPhiMassAxis = new TAxis(cfgNPhiMassBins, 0.99, 1.06); - fK0MassAxis = new TAxis(cfgNK0MassBins, cfgMassK0Min, cfgMassK0Max); - fLambdaMassAxis = new TAxis(cfgNLambdaMassBins, cfgMassLambdaMin, cfgMassLambdaMax); + fPhiMassAxis = new TAxis(vMassBins[Phi - 2], 0.99, 1.06); + fK0MassAxis = new TAxis(vMassBins[K0 - 1], vMassMin[K0 - 1], vMassMax[K0 - 1]); + fLambdaMassAxis = new TAxis(vMassBins[Lambda - 1], vMassMin[Lambda - 1], vMassMax[Lambda - 1]); - int nPhisPtMassBins = nPtBins * cfgNPhiMassBins; - int nK0sPtMassBins = nPtBins * cfgNK0MassBins; - int nLambdasPtMassBins = nPtBins * cfgNLambdaMassBins; + int nPhisPtMassBins = nPtBins * vMassBins[Phi - 2]; + int nK0sPtMassBins = nPtBins * vMassBins[K0 - 1]; + int nLambdasPtMassBins = nPtBins * vMassBins[Lambda - 1]; //********** Defining the regions ********** // reference particles @@ -388,39 +429,54 @@ struct ResonancesGfwFlow { //--------- reference particles // Forward and Backward correlations are the same for reference particles - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "PhiF08Gap22", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "KsF08Gap22", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "LamF08Gap22", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "AnLamF08Gap22", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2 2} refP08 {-2 -2}", "PhiF08Gap24", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2 2} refP08 {-2 -2}", "KsF08Gap24", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2 2} refP08 {-2 -2}", "LamF08Gap24", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2 2} refP08 {-2 -2}", "AnLamF08Gap24", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Ref08Gap22", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2 2} refP08 {-2 -2}", "Ref08Gap24", kFALSE)); //--------- pt differential pois - // Forward - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2} refP08 {-2}", "PhiF08Gap22", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNk0 refN08 | olNk0 {2} refP08 {-2}", "KsF08Gap22", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNlam refN08 | olNlam {2} refP08 {-2}", "LamF08Gap22", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNantilam refN08 | olNantilam {2} refP08 {-2}", "AnLamF08Gap22", kTRUE)); - - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2 2} refP08 {-2 -2}", "PhiF08Gap24", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNk0 refN08 | olNk0 {2 2} refP08 {-2 -2}", "KsF08Gap24", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNlam refN08 | olNlam {2 2} refP08 {-2 -2}", "LamF08Gap24", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNantilam refN08 | olNantilam {2 2} refP08 {-2 -2}", "AnLamF08Gap24", kTRUE)); - - // Backward - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPphi refP08 | olPphi {2} refN08 {-2}", "PhiB08Gap22", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPk0 refP08 | olPk0 {2} refN08 {-2}", "KsB08Gap22", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPlam refP08 | olPlam {2} refN08 {-2}", "LamB08Gap22", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPantilam refP08 | olPantilam {2} refN08 {-2}", "AnLamB08Gap22", kTRUE)); - - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPphi refP08 | olPphi {2 2} refN08 {-2 -2}", "PhiB08Gap24", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPk0 refP08 | olPk0 {2 2} refN08 {-2 -2}", "KsB08Gap24", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPlam refP08 | olPlam {2 2} refN08 {-2 -2}", "LamB08Gap24", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPantilam refP08 | olPantilam {2 2} refN08 {-2 -2}", "AnLamB08Gap24", kTRUE)); + if (cfgUsePhi) { + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2} refP08 {-2}", "PhiF08Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2 2} refP08 {-2 -2}", "PhiF08Gap24", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPphi refP08 | olPphi {2} refN08 {-2}", "PhiB08Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPphi refP08 | olPphi {2 2} refN08 {-2 -2}", "PhiB08Gap24", kTRUE)); + } + if (cfgUseK0) { + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNk0 refN08 | olNk0 {2} refP08 {-2}", "KsF08Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNk0 refN08 | olNk0 {2 2} refP08 {-2 -2}", "KsF08Gap24", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPk0 refP08 | olPk0 {2} refN08 {-2}", "KsB08Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPk0 refP08 | olPk0 {2 2} refN08 {-2 -2}", "KsB08Gap24", kTRUE)); + } + if (cfgUseLambda) { + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNlam refN08 | olNlam {2} refP08 {-2}", "LamF08Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNlam refN08 | olNlam {2 2} refP08 {-2 -2}", "LamF08Gap24", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPlam refP08 | olPlam {2} refN08 {-2}", "LamB08Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPlam refP08 | olPlam {2 2} refN08 {-2 -2}", "LamB08Gap24", kTRUE)); + + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNantilam refN08 | olNantilam {2} refP08 {-2}", "AnLamF08Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNantilam refN08 | olNantilam {2 2} refP08 {-2 -2}", "AnLamF08Gap24", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPantilam refP08 | olPantilam {2} refN08 {-2}", "AnLamB08Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPantilam refP08 | olPantilam {2 2} refN08 {-2 -2}", "AnLamB08Gap24", kTRUE)); + } fGFW->CreateRegions(); + + if (cfgTrackDensityCorrUse) { + std::vector pTEffBins = {0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.4, 1.8, 2.2, 2.6, 3.0}; + hFindPtBin = new TH1D("hFindPtBin", "hFindPtBin", pTEffBins.size() - 1, &pTEffBins[0]); + funcEff.resize(pTEffBins.size() - 1); + // LHC24g3 Eff + std::vector f1p0 = cfgTrackDensityP0; + std::vector f1p1 = cfgTrackDensityP1; + for (uint ifunc = 0; ifunc < pTEffBins.size() - 1; ifunc++) { + funcEff[ifunc] = new TF1(Form("funcEff%i", ifunc), "[0]+[1]*x", 0, 3000); + funcEff[ifunc]->SetParameters(f1p0[ifunc], f1p1[ifunc]); + } + funcV2 = new TF1("funcV2", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); + funcV2->SetParameters(0.0186111, 0.00351907, -4.38264e-05, 1.35383e-07, -3.96266e-10); + funcV3 = new TF1("funcV3", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); + funcV3->SetParameters(0.0174056, 0.000703329, -1.45044e-05, 1.91991e-07, -1.62137e-09); + funcV4 = new TF1("funcV4", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); + funcV4->SetParameters(0.008845, 0.000259668, -3.24435e-06, 4.54837e-08, -6.01825e-10); + } } template @@ -491,7 +547,7 @@ struct ResonancesGfwFlow { p1 = track1.p(); p2 = track2.p(); angle = std::acos((pt1 * pt2 + pz1 * pz2) / (p1 * p2)); - if (cfgUseCosPA && angle < cfgPhiCosPA) { + if (cfgUseCosPA && angle < vCosPAs[Phi - 2]) { return false; } return true; @@ -534,8 +590,9 @@ struct ResonancesGfwFlow { if (track.pt() >= cfgTofPtCut && !track.hasTOF()) return -1; + const int numSpecies = 3; // Select particle with the lowest nsigma - for (int i = 0; i < 3; ++i) { + for (int i = 0; i < numSpecies; ++i) { if (std::abs(nSigmaToUse[i]) < nsigma) { pid = i; nsigma = std::abs(nSigmaToUse[i]); @@ -554,35 +611,35 @@ struct ResonancesGfwFlow { mAcceptance.clear(); mAcceptance.resize(kCount_OutputSpecies); - mAcceptance[hRef] = ccdb->getForTimeStamp(cfgAcceptance.value + "_ref", timestamp); - if (mAcceptance[hRef]) - LOGF(info, "Loaded acceptance weights from %s_ref (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hRef]); + mAcceptance[Ref] = ccdb->getForTimeStamp(cfgAcceptance.value + "_ref", timestamp); + if (mAcceptance[Ref]) + LOGF(info, "Loaded acceptance weights from %s_ref (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[Ref]); else - LOGF(fatal, "Could not load acceptance weights from %s_ref (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hRef]); + LOGF(fatal, "Could not load acceptance weights from %s_ref (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[Ref]); - mAcceptance[hK0] = ccdb->getForTimeStamp(cfgAcceptance.value + "_k0", timestamp); - if (mAcceptance[hK0]) - LOGF(info, "Loaded acceptance weights from %s_k0 (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hK0]); + mAcceptance[K0] = ccdb->getForTimeStamp(cfgAcceptance.value + "_k0", timestamp); + if (mAcceptance[K0]) + LOGF(info, "Loaded acceptance weights from %s_k0 (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[K0]); else - LOGF(fatal, "Could not load acceptance weights from %s_k0 (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hK0]); + LOGF(fatal, "Could not load acceptance weights from %s_k0 (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[K0]); - mAcceptance[hLambda] = ccdb->getForTimeStamp(cfgAcceptance.value + "_lambda", timestamp); - if (mAcceptance[hLambda]) - LOGF(info, "Loaded acceptance weights from %s_lambda (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hLambda]); + mAcceptance[Lambda] = ccdb->getForTimeStamp(cfgAcceptance.value + "_lambda", timestamp); + if (mAcceptance[Lambda]) + LOGF(info, "Loaded acceptance weights from %s_lambda (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[Lambda]); else - LOGF(fatal, "Could not load acceptance weights from %s_lambda (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hLambda]); + LOGF(fatal, "Could not load acceptance weights from %s_lambda (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[Lambda]); - mAcceptance[hAnLambda] = ccdb->getForTimeStamp(cfgAcceptance.value + "_hanlambda", timestamp); - if (mAcceptance[hAnLambda]) - LOGF(info, "Loaded acceptance weights from %s_anlambda (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hAnLambda]); + mAcceptance[AnLambda] = ccdb->getForTimeStamp(cfgAcceptance.value + "_AnLambda", timestamp); + if (mAcceptance[AnLambda]) + LOGF(info, "Loaded acceptance weights from %s_anlambda (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[AnLambda]); else - LOGF(fatal, "Could not load acceptance weights from %s_anlambda (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hAnLambda]); + LOGF(fatal, "Could not load acceptance weights from %s_anlambda (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[AnLambda]); - mAcceptance[hPhi] = ccdb->getForTimeStamp(cfgAcceptance.value + "_phi", timestamp); - if (mAcceptance[hPhi]) - LOGF(info, "Loaded acceptance weights from %s_phi (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hPhi]); + mAcceptance[Phi] = ccdb->getForTimeStamp(cfgAcceptance.value + "_phi", timestamp); + if (mAcceptance[Phi]) + LOGF(info, "Loaded acceptance weights from %s_phi (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[Phi]); else - LOGF(fatal, "Could not load acceptance weights from %s_phi (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[hPhi]); + LOGF(fatal, "Could not load acceptance weights from %s_phi (%p)", cfgAcceptance.value.c_str(), (void*)mAcceptance[Phi]); } correctionsLoaded = true; @@ -617,6 +674,35 @@ struct ResonancesGfwFlow { return wacc; } + template + double getAcceptancePhi(vector mom, const TCollision collision, int pid_index_reso) + { // 0 = ref, 1 = k0, 2 = lambda, 3 = anti-lambda, 4 = phi + if (pid_index_reso < 0 || pid_index_reso >= kCount_OutputSpecies) { + return 1; + } + + double wacc = 1; + double cent = collision.centFT0C(); + double vtxz = collision.posZ(); + + if ((cfgUseWeightPhiEtaVtxz && cfgUseWeightPhiPtCent) || (cfgUseWeightPhiEtaPt && cfgUseWeightPhiPtCent) || (cfgUseWeightPhiEtaVtxz && cfgUseWeightPhiEtaPt)) { + LOGF(fatal, "Only one of the three weight options can be used at a time"); + } + if (!mAcceptance.empty() && correctionsLoaded) { + if (!mAcceptance[pid_index_reso]) { + LOGF(fatal, "Acceptance weights not loaded for pidIndex %d", pid_index_reso); + return 1; + } + if (cfgUseWeightPhiEtaVtxz) + wacc = mAcceptance[pid_index_reso]->getNUA(mom.Phi(), mom.Eta(), vtxz); + if (cfgUseWeightPhiPtCent) + wacc = mAcceptance[pid_index_reso]->getNUA(mom.Phi(), mom.Pt(), cent); + if (cfgUseWeightPhiEtaPt) + wacc = mAcceptance[pid_index_reso]->getNUA(mom.Phi(), mom.Eta(), mom.Pt()); + } + return wacc; + } + template void fillWeights(const TTrack track, const TCollision collision, const int& pid_index_reso) { @@ -626,44 +712,42 @@ struct ResonancesGfwFlow { bool withinPtPOI = (cfgCutPtPOIMin < pt) && (pt < cfgCutPtPOIMax); // within POI pT range bool withinPtRef = (cfgCutPtMin < pt) && (pt < cfgCutPtMax); // within RF pT range - if (withinPtRef && !pid_index_reso) + if (withinPtRef && !pid_index_reso) { histos.fill(HIST("NUA/hPhiEtaVtxz_ref"), track.phi(), track.eta(), vtxz); // pt-subset of charged particles for ref flow - histos.fill(HIST("NUA/hPhiPtCent_ref"), track.phi(), track.pt(), cent); - histos.fill(HIST("NUA/hPhiEtaPt_ref"), track.phi(), track.eta(), track.pt()); + histos.fill(HIST("NUA/hPhiPtCent_ref"), track.phi(), track.pt(), cent); + histos.fill(HIST("NUA/hPhiEtaPt_ref"), track.phi(), track.eta(), track.pt()); + } if (withinPtPOI) { switch (pid_index_reso) { - case hK0: + case K0: histos.fill(HIST("NUA/hPhiEtaVtxz_k0"), track.phi(), track.eta(), vtxz); // K0 weights histos.fill(HIST("NUA/hPhiPtCent_k0"), track.phi(), track.pt(), cent); histos.fill(HIST("NUA/hPhiEtaPt_k0"), track.phi(), track.eta(), track.pt()); break; - case hLambda: + case Lambda: histos.fill(HIST("NUA/hPhiEtaVtxz_lambda"), track.phi(), track.eta(), vtxz); // Lambda weights histos.fill(HIST("NUA/hPhiPtCent_lambda"), track.phi(), track.pt(), cent); histos.fill(HIST("NUA/hPhiEtaPt_lambda"), track.phi(), track.eta(), track.pt()); break; - case hAnLambda: + case AnLambda: histos.fill(HIST("NUA/hPhiEtaVtxz_anlambda"), track.phi(), track.eta(), vtxz); // Anti-Lambda weights histos.fill(HIST("NUA/hPhiPtCent_anlambda"), track.phi(), track.pt(), cent); histos.fill(HIST("NUA/hPhiEtaPt_anlambda"), track.phi(), track.eta(), track.pt()); break; - case hPhi: - histos.fill(HIST("NUA/hPhiEtaVtxz_phi"), track.phi(), track.eta(), vtxz); // Phi weights - histos.fill(HIST("NUA/hPhiPtCent_phi"), track.phi(), track.pt(), cent); - histos.fill(HIST("NUA/hPhiEtaPt_phi"), track.phi(), track.eta(), track.pt()); - break; + // Phi weights are filled in the resurrectPhi function } } } - template - void resurrectPhi(TTrack trackplus, TTrack trackminus, vector plusdaug, vector minusdaug, vector mom, double plusmass, const ConstStr& hist, const double cent) + template + void resurrectPhi(TTrack trackplus, TTrack trackminus, const TCollision collision, vector plusdaug, vector minusdaug, vector mom, double plusmass, const ConstStr& hist) { + const int nKaon = 2; for (auto const& [partplus, partminus] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(trackplus, trackminus))) { - if (getNsigmaPID(partplus) != 2) + if (getNsigmaPID(partplus) != nKaon) continue; - if (getNsigmaPID(partminus) != 2) + if (getNsigmaPID(partminus) != nKaon) continue; if (isFakeKaon(partplus) || isFakeKaon(partminus)) continue; @@ -687,14 +771,24 @@ struct ResonancesGfwFlow { bool withinPtRef = (cfgCutPtMin < pt) && (pt < cfgCutPtMax); if (std::abs(mom.Rapidity()) < cfgRapidityCut) { - histos.fill(hist, invMass, pt, cent); + histos.fill(hist, invMass, pt, collision.centFT0C()); histos.fill(HIST("hPhiPhi"), mom.Phi()); histos.fill(HIST("hPhiEta"), mom.Eta()); + // Fill Phi weights + if (cfgOutputNUAWeights && withinPtPOI) { + histos.fill(HIST("NUA/hPhiEtaVtxz_phi"), mom.Phi(), mom.Eta(), collision.posZ()); + histos.fill(HIST("NUA/hPhiPtCent_phi"), mom.Phi(), pt, collision.centFT0C()); + histos.fill(HIST("NUA/hPhiEtaPt_phi"), mom.Phi(), mom.Eta(), pt); + } + + double weff = 1; + double waccPOI = getAcceptancePhi(mom, collision, Phi); + if (withinPtPOI) - fGFW->Fill(mom.Eta(), ((fPtAxis->FindBin(pt) - 1) * fPhiMassAxis->GetNbins()) + (fPhiMassAxis->FindBin(invMass) - 1), mom.Phi(), 1.0, 2); + fGFW->Fill(mom.Eta(), ((fPtAxis->FindBin(pt) - 1) * fPhiMassAxis->GetNbins()) + (fPhiMassAxis->FindBin(invMass) - 1), mom.Phi(), weff * waccPOI, 2); if (withinPtPOI && withinPtRef) - fGFW->Fill(mom.Eta(), ((fPtAxis->FindBin(pt) - 1) * fPhiMassAxis->GetNbins()) + (fPhiMassAxis->FindBin(invMass) - 1), mom.Phi(), 1.0, 32); + fGFW->Fill(mom.Eta(), ((fPtAxis->FindBin(pt) - 1) * fPhiMassAxis->GetNbins()) + (fPhiMassAxis->FindBin(invMass) - 1), mom.Phi(), weff * waccPOI, 32); } } return; @@ -729,13 +823,13 @@ struct ResonancesGfwFlow { auto negtrack = candidate.template negTrack_as(); histos.fill(HIST("hLambdaCount"), 0.5); - if (postrack.pt() < 0.15 || negtrack.pt() < 0.15) + if (postrack.pt() < vPosTrackPt[Lambda - 1] || negtrack.pt() < vNegTrackPt[Lambda - 1]) return false; histos.fill(HIST("hLambdaCount"), 1.5); - if (mlambda > cfgMassLambdaMin && mlambda < cfgMassLambdaMax) + if (mlambda > vMassMin[Lambda - 1] && mlambda < vMassMax[Lambda - 1]) isL = true; - if (mantilambda > cfgMassLambdaMin && mantilambda < cfgMassLambdaMax) + if (mantilambda > vMassMin[Lambda - 1] && mantilambda < vMassMax[Lambda - 1]) isAL = true; if (!isL && !isAL) { @@ -744,7 +838,7 @@ struct ResonancesGfwFlow { histos.fill(HIST("hLambdaCount"), 2.5); // Rapidity correction - if (candidate.yLambda() > 0.5) + if (candidate.yLambda() > cfgRapidityCut) return false; histos.fill(HIST("hLambdaCount"), 3.5); // DCA cuts for lambda and antilambda @@ -757,7 +851,7 @@ struct ResonancesGfwFlow { return false; } histos.fill(HIST("hLambdaCount"), 4.5); - if (std::abs(candidate.dcaV0daughters()) > cfgDCALambdaBetDaug) + if (std::abs(candidate.dcaV0daughters()) > vDCABetDaug[Lambda - 1]) return false; histos.fill(HIST("hLambdaCount"), 5.5); // v0 radius cuts @@ -765,7 +859,7 @@ struct ResonancesGfwFlow { return false; histos.fill(HIST("hLambdaCount"), 6.5); // cosine pointing angle cuts - if (candidate.v0cosPA() < cfgLambdaCosPA) + if (candidate.v0cosPA() < vCosPAs[Lambda - 1]) return false; histos.fill(HIST("hLambdaCount"), 7.5); // Proper lifetime @@ -782,7 +876,7 @@ struct ResonancesGfwFlow { } histos.fill(HIST("hLambdaCount"), 9.5); // Mass cross check - if (cfgUseMCCLambda && std::abs(massK0Short - 0.497614) < 0.01) + if (cfgUseMCCLambda && std::abs(massK0Short - 0.497614) < vMccCut[Lambda - 1]) return false; histos.fill(HIST("hLambdaCount"), 10.5); bool withinPtPOI = (cfgCutPtPOIMin < candidate.pt()) && (candidate.pt() < cfgCutPtPOIMax); // within POI pT range @@ -792,9 +886,9 @@ struct ResonancesGfwFlow { if (isL) { if (cfgOutputNUAWeights) - fillWeights(candidate, collision, hLambda); + fillWeights(candidate, collision, Lambda); - double waccPOI = getAcceptance(candidate, collision, hLambda); + double waccPOI = getAcceptance(candidate, collision, Lambda); if (withinPtPOI) fGFW->Fill(candidate.eta(), ((fPtAxis->FindBin(candidate.pt()) - 1) * fLambdaMassAxis->GetNbins()) + (fLambdaMassAxis->FindBin(mlambda) - 1), candidate.phi(), waccPOI * weff, 8); if (withinPtPOI && withinPtRef) @@ -810,9 +904,9 @@ struct ResonancesGfwFlow { } if (isAL) { if (cfgOutputNUAWeights) - fillWeights(candidate, collision, hAnLambda); + fillWeights(candidate, collision, AnLambda); - double waccPOI = getAcceptance(candidate, collision, hAnLambda); + double waccPOI = getAcceptance(candidate, collision, AnLambda); if (withinPtPOI) fGFW->Fill(candidate.eta(), ((fPtAxis->FindBin(candidate.pt()) - 1) * fLambdaMassAxis->GetNbins()) + (fLambdaMassAxis->FindBin(mantilambda) - 1), candidate.phi(), waccPOI * weff, 16); if (withinPtPOI && withinPtRef) @@ -839,21 +933,21 @@ struct ResonancesGfwFlow { auto negtrack = candidate.template negTrack_as(); histos.fill(HIST("hK0Count"), 0.5); - if (postrack.pt() < 0.15 || negtrack.pt() < 0.15) + if (postrack.pt() < vPosTrackPt[K0 - 1] || negtrack.pt() < vNegTrackPt[K0 - 1]) return false; histos.fill(HIST("hK0Count"), 1.5); - if (mk0 < cfgMassK0Min && mk0 > cfgMassK0Max) + if (mk0 < vMassMin[K0 - 1] && mk0 > vMassMax[K0 - 1]) return false; histos.fill(HIST("hK0Count"), 2.5); // Rapidity correction - if (candidate.yK0Short() > 0.5) + if (candidate.yK0Short() > cfgRapidityCut) return false; histos.fill(HIST("hK0Count"), 3.5); // DCA cuts for K0short if (std::abs(candidate.dcapostopv()) < cfgDCAK0PosToPVMin || std::abs(candidate.dcanegtopv()) < cfgDCAK0NegToPVMin) return false; histos.fill(HIST("hK0Count"), 4.5); - if (std::abs(candidate.dcaV0daughters()) > cfgDCAK0BetDaug) + if (std::abs(candidate.dcaV0daughters()) > vDCABetDaug[K0 - 1]) return false; histos.fill(HIST("hK0Count"), 5.5); // v0 radius cuts @@ -861,7 +955,7 @@ struct ResonancesGfwFlow { return false; histos.fill(HIST("hK0Count"), 6.5); // cosine pointing angle cuts - if (candidate.v0cosPA() < cfgK0CosPA) + if (candidate.v0cosPA() < vCosPAs[K0 - 1]) return false; histos.fill(HIST("hK0Count"), 7.5); // Proper lifetime @@ -872,19 +966,19 @@ struct ResonancesGfwFlow { return false; histos.fill(HIST("hK0Count"), 9.5); // Mass cross check - if (cfgUseMCCK0 && std::abs(massLambda - 1.11568) < 0.005) + if (cfgUseMCCK0 && std::abs(massLambda - 1.11568) < vMccCut[K0 - 1]) return false; - if (cfgUseMCCK0 && std::abs(massLambda - 1.11568) < 0.005) + if (cfgUseMCCK0 && std::abs(massLambda - 1.11568) < vMccCut[K0 - 1]) return false; histos.fill(HIST("hK0Count"), 10.5); bool withinPtPOI = (cfgCutPtPOIMin < candidate.pt()) && (candidate.pt() < cfgCutPtPOIMax); // within POI pT range bool withinPtRef = (cfgCutPtMin < candidate.pt()) && (candidate.pt() < cfgCutPtMax); if (cfgOutputNUAWeights) - fillWeights(candidate, collision, hK0); + fillWeights(candidate, collision, K0); float weff = 1; - double waccPOI = getAcceptance(candidate, collision, hK0); + double waccPOI = getAcceptance(candidate, collision, K0); if (withinPtPOI) fGFW->Fill(candidate.eta(), ((fPtAxis->FindBin(candidate.pt()) - 1) * fK0MassAxis->GetNbins()) + (fK0MassAxis->FindBin(mk0) - 1), candidate.phi(), waccPOI * weff, 4); @@ -957,6 +1051,36 @@ struct ResonancesGfwFlow { loadCorrections(bc); // load corrections for the each event + // Track loop for calculating the Qn angles + double psi2Est = 0, psi3Est = 0, psi4Est = 0; + float wEPeff = 1; + double v2 = 0, v3 = 0, v4 = 0; + // be cautious, this only works for Pb-Pb + // esimate the Qn angles and vn for this event + if (cfgTrackDensityCorrUse) { + double q2x = 0, q2y = 0; + double q3x = 0, q3y = 0; + double q4x = 0, q4y = 0; + for (const auto& track : tracks) { + bool withinPtRef = (cfgCutPtMin < track.pt()) && (track.pt() < cfgCutPtMax); // within RF pT rang + if (withinPtRef) { + q2x += std::cos(2 * track.phi()); + q2y += std::sin(2 * track.phi()); + q3x += std::cos(3 * track.phi()); + q3y += std::sin(3 * track.phi()); + q4x += std::cos(4 * track.phi()); + q4y += std::sin(4 * track.phi()); + } + } + psi2Est = std::atan2(q2y, q2x) / 2.; + psi3Est = std::atan2(q3y, q3x) / 3.; + psi4Est = std::atan2(q4y, q4x) / 4.; + v2 = funcV2->Eval(cent); + v3 = funcV3->Eval(cent); + v4 = funcV4->Eval(cent); + } + + // Actual track loop for (auto const& track : tracks) { if (!selectionTrack(track)) continue; @@ -965,87 +1089,104 @@ struct ResonancesGfwFlow { if (withinPtRef) if (cfgOutputNUAWeights) - fillWeights(track, collision, hRef); + fillWeights(track, collision, Ref); double waccRef = getAcceptance(track, collision, 0); + + if (cfgTrackDensityCorrUse && withinPtRef) { + double fphi = v2 * std::cos(2 * (track.phi() - psi2Est)) + v3 * std::cos(3 * (track.phi() - psi3Est)) + v4 * std::cos(4 * (track.phi() - psi4Est)); + fphi = (1 + 2 * fphi); + int pTBinForEff = hFindPtBin->FindBin(track.pt()); + if (pTBinForEff >= 1 && pTBinForEff <= hFindPtBin->GetNbinsX()) { + wEPeff = funcEff[pTBinForEff - 1]->Eval(fphi * tracks.size()); + if (wEPeff > 0.) { + wEPeff = 1. / wEPeff; + weff *= wEPeff; + } + } + } + fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), waccRef * weff, 1); } auto posSlicedTracks = posTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); auto negSlicedTracks = negTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - resurrectPhi(posSlicedTracks, negSlicedTracks, kaonPlus, kaonMinus, phiMom, massKaPlus, HIST("hPhiMass_sparse"), cent); + if (cfgUsePhi) { + resurrectPhi(posSlicedTracks, negSlicedTracks, collision, kaonPlus, kaonMinus, phiMom, massKaPlus, HIST("hPhiMass_sparse")); + } for (auto const& v0s : V0s) { - if (selectionLambda(collision, v0s) == true) - histos.fill(HIST("hLambdas"), 1); - if (selectionK0(collision, v0s) == true) - histos.fill(HIST("hK0s"), 1); + if (cfgUseLambda) { + if (selectionLambda(collision, v0s) == true) + histos.fill(HIST("hLambdas"), 1); + } + if (cfgUseK0) { + if (selectionK0(collision, v0s) == true) + histos.fill(HIST("hK0s"), 1); + } } // End of v0 loop - fillResoProfile(corrconfigs.at(0), HIST("Phic22"), cent, fPhiMassAxis); - fillResoProfile(corrconfigs.at(1), HIST("K0c22"), cent, fK0MassAxis); - fillResoProfile(corrconfigs.at(2), HIST("Lambdac22"), cent, fLambdaMassAxis); - fillResoProfile(corrconfigs.at(3), HIST("AnLambdac22"), cent, fLambdaMassAxis); - fillResoProfile(corrconfigs.at(4), HIST("Phic24"), cent, fPhiMassAxis); - fillResoProfile(corrconfigs.at(5), HIST("K0c24"), cent, fK0MassAxis); - fillResoProfile(corrconfigs.at(6), HIST("Lambdac24"), cent, fLambdaMassAxis); - fillResoProfile(corrconfigs.at(7), HIST("AnLambdac24"), cent, fLambdaMassAxis); - - fillResoProfile(corrconfigs.at(8), HIST("Phiv22pt"), cent, fPhiMassAxis); - fillResoProfile(corrconfigs.at(9), HIST("K0v22pt"), cent, fK0MassAxis); - fillResoProfile(corrconfigs.at(10), HIST("Lambdav22pt"), cent, fLambdaMassAxis); - fillResoProfile(corrconfigs.at(11), HIST("AnLambdav22pt"), cent, fLambdaMassAxis); - - fillResoProfile(corrconfigs.at(12), HIST("Phiv24pt"), cent, fPhiMassAxis); - fillResoProfile(corrconfigs.at(13), HIST("K0v24pt"), cent, fK0MassAxis); - fillResoProfile(corrconfigs.at(14), HIST("Lambdav24pt"), cent, fLambdaMassAxis); - fillResoProfile(corrconfigs.at(15), HIST("AnLambdav24pt"), cent, fLambdaMassAxis); - - fillResoProfile(corrconfigs.at(16), HIST("Phiv22pt"), cent, fPhiMassAxis); - fillResoProfile(corrconfigs.at(17), HIST("K0v22pt"), cent, fK0MassAxis); - fillResoProfile(corrconfigs.at(18), HIST("Lambdav22pt"), cent, fLambdaMassAxis); - fillResoProfile(corrconfigs.at(19), HIST("AnLambdav22pt"), cent, fLambdaMassAxis); - - fillResoProfile(corrconfigs.at(20), HIST("Phiv24pt"), cent, fPhiMassAxis); - fillResoProfile(corrconfigs.at(21), HIST("K0v24pt"), cent, fK0MassAxis); - fillResoProfile(corrconfigs.at(22), HIST("Lambdav24pt"), cent, fLambdaMassAxis); - fillResoProfile(corrconfigs.at(23), HIST("AnLambdav24pt"), cent, fLambdaMassAxis); + fillResoProfile(corrconfigs.at(0), HIST("Refc22"), cent, fPhiMassAxis); + fillResoProfile(corrconfigs.at(1), HIST("Refc24"), cent, fPhiMassAxis); + + if (cfgUsePhi) { + fillResoProfile(corrconfigs.at(2), HIST("Phid22Fpt"), cent, fPhiMassAxis); + fillResoProfile(corrconfigs.at(3), HIST("Phid24Fpt"), cent, fPhiMassAxis); + fillResoProfile(corrconfigs.at(4), HIST("Phid22Bpt"), cent, fPhiMassAxis); + fillResoProfile(corrconfigs.at(5), HIST("Phid24Bpt"), cent, fPhiMassAxis); + } + if (cfgUseK0) { + fillResoProfile(corrconfigs.at(6), HIST("K0d22Fpt"), cent, fK0MassAxis); + fillResoProfile(corrconfigs.at(7), HIST("K0d24Fpt"), cent, fK0MassAxis); + fillResoProfile(corrconfigs.at(8), HIST("K0d22Bpt"), cent, fK0MassAxis); + fillResoProfile(corrconfigs.at(9), HIST("K0d24Bpt"), cent, fK0MassAxis); + } + if (cfgUseLambda) { + fillResoProfile(corrconfigs.at(10), HIST("Lambdad22Fpt"), cent, fLambdaMassAxis); + fillResoProfile(corrconfigs.at(11), HIST("Lambdad24Fpt"), cent, fLambdaMassAxis); + fillResoProfile(corrconfigs.at(12), HIST("Lambdad22Bpt"), cent, fLambdaMassAxis); + fillResoProfile(corrconfigs.at(13), HIST("Lambdad24Bpt"), cent, fLambdaMassAxis); + + fillResoProfile(corrconfigs.at(14), HIST("AnLambdad22Fpt"), cent, fLambdaMassAxis); + fillResoProfile(corrconfigs.at(15), HIST("AnLambdad24Fpt"), cent, fLambdaMassAxis); + fillResoProfile(corrconfigs.at(16), HIST("AnLambdad22Bpt"), cent, fLambdaMassAxis); + fillResoProfile(corrconfigs.at(17), HIST("AnLambdad24Bpt"), cent, fLambdaMassAxis); + } // bootstraping if (cfgUseBootStrap) { double r = fRndm->Rndm(); int bootId = static_cast(r * 10); - fillProfileBoot(corrconfigs.at(0), phiC22Boot[bootId], cent); - fillProfileBoot(corrconfigs.at(1), k0C22Boot[bootId], cent); - fillProfileBoot(corrconfigs.at(2), lambdaC22Boot[bootId], cent); - fillProfileBoot(corrconfigs.at(3), anLambdaC22Boot[bootId], cent); - fillProfileBoot(corrconfigs.at(4), phiC24Boot[bootId], cent); - fillProfileBoot(corrconfigs.at(5), k0C24Boot[bootId], cent); - fillProfileBoot(corrconfigs.at(6), lambdaC24Boot[bootId], cent); - fillProfileBoot(corrconfigs.at(7), anLambdaC24Boot[bootId], cent); - - fillProfileBoot3D(corrconfigs.at(8), phiD22PtBoot[bootId], cent, fPhiMassAxis); - fillProfileBoot3D(corrconfigs.at(9), k0D22PtBoot[bootId], cent, fK0MassAxis); - fillProfileBoot3D(corrconfigs.at(10), lambdaD22PtBoot[bootId], cent, fLambdaMassAxis); - fillProfileBoot3D(corrconfigs.at(11), anLambdaD22PtBoot[bootId], cent, fLambdaMassAxis); - - fillProfileBoot3D(corrconfigs.at(12), phiD24PtBoot[bootId], cent, fPhiMassAxis); - fillProfileBoot3D(corrconfigs.at(13), k0D24PtBoot[bootId], cent, fK0MassAxis); - fillProfileBoot3D(corrconfigs.at(14), lambdaD24PtBoot[bootId], cent, fLambdaMassAxis); - fillProfileBoot3D(corrconfigs.at(15), anLambdaD24PtBoot[bootId], cent, fLambdaMassAxis); - - fillProfileBoot3D(corrconfigs.at(16), phiD22PtBoot[bootId], cent, fPhiMassAxis); - fillProfileBoot3D(corrconfigs.at(17), k0D22PtBoot[bootId], cent, fK0MassAxis); - fillProfileBoot3D(corrconfigs.at(18), lambdaD22PtBoot[bootId], cent, fLambdaMassAxis); - fillProfileBoot3D(corrconfigs.at(19), anLambdaD22PtBoot[bootId], cent, fLambdaMassAxis); - - fillProfileBoot3D(corrconfigs.at(20), phiD24PtBoot[bootId], cent, fPhiMassAxis); - fillProfileBoot3D(corrconfigs.at(21), k0D24PtBoot[bootId], cent, fK0MassAxis); - fillProfileBoot3D(corrconfigs.at(22), lambdaD24PtBoot[bootId], cent, fLambdaMassAxis); - fillProfileBoot3D(corrconfigs.at(23), anLambdaD24PtBoot[bootId], cent, fLambdaMassAxis); - } + fillProfileBoot(corrconfigs.at(0), refC22Boot[bootId], cent); + fillProfileBoot(corrconfigs.at(1), refC24Boot[bootId], cent); + + if (cfgUsePhi) { + fillProfileBoot3D(corrconfigs.at(2), phiD22FPtBoot[bootId], cent, fPhiMassAxis); + fillProfileBoot3D(corrconfigs.at(3), phiD24FPtBoot[bootId], cent, fPhiMassAxis); + fillProfileBoot3D(corrconfigs.at(4), phiD22BPtBoot[bootId], cent, fPhiMassAxis); + fillProfileBoot3D(corrconfigs.at(5), phiD24BPtBoot[bootId], cent, fPhiMassAxis); + } + if (cfgUseK0) { + fillProfileBoot3D(corrconfigs.at(6), k0D22FPtBoot[bootId], cent, fK0MassAxis); + fillProfileBoot3D(corrconfigs.at(7), k0D24FPtBoot[bootId], cent, fK0MassAxis); + fillProfileBoot3D(corrconfigs.at(8), k0D22BPtBoot[bootId], cent, fK0MassAxis); + fillProfileBoot3D(corrconfigs.at(9), k0D24BPtBoot[bootId], cent, fK0MassAxis); + } + if (cfgUseLambda) { + fillProfileBoot3D(corrconfigs.at(10), lambdaD22FPtBoot[bootId], cent, fLambdaMassAxis); + fillProfileBoot3D(corrconfigs.at(11), lambdaD24FPtBoot[bootId], cent, fLambdaMassAxis); + fillProfileBoot3D(corrconfigs.at(12), lambdaD22BPtBoot[bootId], cent, fLambdaMassAxis); + fillProfileBoot3D(corrconfigs.at(13), lambdaD24BPtBoot[bootId], cent, fLambdaMassAxis); + + fillProfileBoot3D(corrconfigs.at(14), anLambdaD22FPtBoot[bootId], cent, fLambdaMassAxis); + fillProfileBoot3D(corrconfigs.at(15), anLambdaD24FPtBoot[bootId], cent, fLambdaMassAxis); + fillProfileBoot3D(corrconfigs.at(16), anLambdaD22BPtBoot[bootId], cent, fLambdaMassAxis); + fillProfileBoot3D(corrconfigs.at(17), anLambdaD24BPtBoot[bootId], cent, fLambdaMassAxis); + } + + } // end of bootstrap condition } // end of process }; From e6dcf3d3820054b3bd80bbb52002ecafb67fdbf8 Mon Sep 17 00:00:00 2001 From: EmilGorm <50658075+EmilGorm@users.noreply.github.com> Date: Tue, 15 Apr 2025 19:27:16 +0200 Subject: [PATCH 0998/1650] [PWGCF] Remove superfluous track cut (#10855) Co-authored-by: ALICE Action Bot --- .../Tasks/flowGenericFramework.cxx | 95 ++++--------------- 1 file changed, 19 insertions(+), 76 deletions(-) diff --git a/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx b/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx index 4ea461c4c0b..03f4a82a3fd 100644 --- a/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx +++ b/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx @@ -91,7 +91,6 @@ struct FlowGenericFramework { O2_DEFINE_CONFIGURABLE(cfgRunByRun, bool, false, "Fill histograms on a run-by-run basis") O2_DEFINE_CONFIGURABLE(cfgFillQA, bool, false, "Fill QA histograms") O2_DEFINE_CONFIGURABLE(cfgUseAdditionalEventCut, bool, false, "Use additional event cut on mult correlations") - O2_DEFINE_CONFIGURABLE(cfgUseAdditionalTrackCut, bool, false, "Use additional track cut on phi") O2_DEFINE_CONFIGURABLE(cfgUseCentralMoments, bool, true, "Use central moments in vn-pt calculations") O2_DEFINE_CONFIGURABLE(cfgUsePID, bool, true, "Enable PID information") O2_DEFINE_CONFIGURABLE(cfgUseGapMethod, bool, false, "Use gap method in vn-pt calculations") @@ -111,11 +110,11 @@ struct FlowGenericFramework { O2_DEFINE_CONFIGURABLE(cfgIsGoodITSLayersAll, bool, true, "kIsGoodITSLayersAll"); O2_DEFINE_CONFIGURABLE(cfgNoCollInTimeRangeStandard, bool, true, "kNoCollInTimeRangeStandard"); O2_DEFINE_CONFIGURABLE(cfgDoOccupancySel, bool, true, "Bool for event selection on detector occupancy"); - O2_DEFINE_CONFIGURABLE(cfgMultCut, bool, true, "Use additional evenr cut on mult correlations"); + O2_DEFINE_CONFIGURABLE(cfgMultCut, bool, true, "Use additional event cut on mult correlations"); O2_DEFINE_CONFIGURABLE(cfgTVXinTRD, bool, true, "Use kTVXinTRD (reject TRD triggered events)"); O2_DEFINE_CONFIGURABLE(cfgIsVertexITSTPC, bool, true, "Selects collisions with at least one ITS-TPC track"); O2_DEFINE_CONFIGURABLE(cfgMagField, float, 99999, "Configurable magnetic field; default CCDB will be queried"); - O2_DEFINE_CONFIGURABLE(cfgTofPtCut, float, 1.0, "pt cut on TOF for PID"); + O2_DEFINE_CONFIGURABLE(cfgTofPtCut, float, 0.5, "pt cut on TOF for PID"); Configurable cfgGFWBinning{"cfgGFWBinning", {40, 16, 72, 300, 0, 3000, 0.2, 10.0, 0.2, 3.0, {0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.2, 2.4, 2.6, 2.8, 3, 3.5, 4, 5, 6, 8, 10}, {0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90}}, "Configuration for binning"}; Configurable cfgRegions{"cfgRegions", {{"refN", "refP", "refFull"}, {-0.8, 0.4, -0.8}, {-0.4, 0.8, 0.8}, {0, 0, 0}, {1, 1, 1}}, "Configurations for GFW regions"}; @@ -207,7 +206,6 @@ struct FlowGenericFramework { cfgGFWBinning->Print(); AxisSpec phiAxis = {phibins, philow, phiup, "#phi"}; - AxisSpec phiModAxis = {100, 0, constants::math::PI / 9, "fmod(#varphi,#pi/9)"}; AxisSpec etaAxis = {etabins, -cfgEta, cfgEta, "#eta"}; AxisSpec vtxAxis = {vtxZbins, -cfgVtxZ, cfgVtxZ, "Vtx_{z} (cm)"}; AxisSpec ptAxis = {ptbinning, "#it{p}_{T} GeV/#it{c}"}; @@ -242,7 +240,6 @@ struct FlowGenericFramework { if (doprocessMCReco || doprocessData || doprocessRun2) { registry.add("trackQA/before/phi_eta_vtxZ", "", {HistType::kTH3D, {phiAxis, etaAxis, vtxAxis}}); registry.add("trackQA/before/pt_dcaXY_dcaZ", "", {HistType::kTH3D, {ptAxis, dcaXYAXis, dcaZAXis}}); - registry.add("trackQA/before/pt_phi", "", {HistType::kTH2D, {ptAxis, phiModAxis}}); registry.addClone("trackQA/before/", "trackQA/after/"); registry.add("trackQA/after/pt_ref", "", {HistType::kTH1D, {{100, ptreflow, ptrefup}}}); registry.add("trackQA/after/pt_poi", "", {HistType::kTH1D, {{100, ptpoilow, ptpoiup}}}); @@ -310,20 +307,6 @@ struct FlowGenericFramework { fFCpt->initialise(multAxis, cfgMpar, configs, cfgNbootstrap); // Event selection - Alex if (cfgUseAdditionalEventCut) { - /* - //22s cuts - fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x - 2.5*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); - fMultPVCutLow->SetParameters(2834.66, -87.0127, 0.915126, -0.00330136, 332.513, -12.3476, 0.251663, -0.00272819, 1.12242e-05); - fMultPVCutHigh = new TF1("fMultPVCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x + 2.5*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); - fMultPVCutHigh->SetParameters(2834.66, -87.0127, 0.915126, -0.00330136, 332.513, -12.3476, 0.251663, -0.00272819, 1.12242e-05); - - fMultCutLow = new TF1("fMultCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x - 2.5*([4]+[5]*x)", 0, 100); - fMultCutLow->SetParameters(1893.94, -53.86, 0.502913, -0.0015122, 109.625, -1.19253); - fMultCutHigh = new TF1("fMultCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x + 3.*([4]+[5]*x)", 0, 100); - fMultCutHigh->SetParameters(1893.94, -53.86, 0.502913, -0.0015122, 109.625, -1.19253); - fMultMultPVCut = new TF1("fMultMultPVCut", "[0]+[1]*x+[2]*x*x", 0, 5000); - fMultMultPVCut->SetParameters(-0.1, 0.785, -4.7e-05); - */ fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x - 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); fMultPVCutLow->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); fMultPVCutHigh = new TF1("fMultPVCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x + 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); @@ -334,11 +317,6 @@ struct FlowGenericFramework { fMultCutHigh = new TF1("fMultCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x + 3.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); fMultCutHigh->SetParameters(1654.46, -47.2379, 0.449833, -0.0014125, 150.773, -3.67334, 0.0530503, -0.000614061, 3.15956e-06); } - - if (cfgUseAdditionalTrackCut) { - fPhiCutLow = new TF1("fPhiCutLow", "0.06/x+pi/18.0-0.06", 0, 100); - fPhiCutHigh = new TF1("fPhiCutHigh", "0.1/x+pi/18.0+0.06", 0, 100); - } } static constexpr std::string_view FillTimeName[] = {"before/", "after/"}; @@ -543,44 +521,9 @@ struct FlowGenericFramework { if (cfgRunByRun) th1sList[run][hEventSel]->Fill(9.5); } - - /* 22s - if (multNTracksPV < fMultPVCutLow->Eval(centrality)) - return 0; - if (multNTracksPV > fMultPVCutHigh->Eval(centrality)) - return 0; - if (multTrk < fMultCutLow->Eval(centrality)) - return 0; - if (multTrk > fMultCutHigh->Eval(centrality)) - return 0; - if (multTrk > fMultMultPVCut->Eval(multNTracksPV)) - return 0; - */ return 1; } - template - bool trackSelected(TTrack track, const int& field) - { - double phimodn = track.phi(); - if (field < 0) // for negative polarity field - phimodn = TwoPI - phimodn; - if (track.sign() < 0) // for negative charge - phimodn = TwoPI - phimodn; - if (phimodn < 0) - LOGF(warning, "phi < 0: %g", phimodn); - - phimodn += PI / 18.0; // to center gap in the middle - phimodn = fmod(phimodn, PI / 9.0); - if (cfgFillQA) - registry.fill(HIST("trackQA/before/pt_phi"), track.pt(), phimodn); - if (phimodn < fPhiCutHigh->Eval(track.pt()) && phimodn > fPhiCutLow->Eval(track.pt())) - return false; // reject track - if (cfgFillQA) - registry.fill(HIST("trackQA/after/pt_phi"), track.pt(), phimodn); - return true; - } - enum DataType { kReco, kGen @@ -700,7 +643,7 @@ struct FlowGenericFramework { } template - void processCollision(TCollision collision, TTracks tracks, const float& centrality, const int& field, const int& run) + void processCollision(TCollision collision, TTracks tracks, const float& centrality, const int& run) { if (tracks.size() < 1) return; @@ -719,14 +662,14 @@ struct FlowGenericFramework { fFCpt->clearVector(); float lRandom = fRndm->Rndm(); for (const auto& track : tracks) { - processTrack(track, vtxz, field, run); + processTrack(track, vtxz, run); } if (!cfgFillWeights) fillOutputContainers
((cfgUseNch) ? tracks.size() : centrality, lRandom); } template - inline void processTrack(TTrack const& track, const float& vtxz, const int& field, const int& run) + inline void processTrack(TTrack const& track, const float& vtxz, const int& run) { if constexpr (framework::has_type_v) { if (track.mcParticleId() < 0 || !(track.has_mcParticle())) @@ -741,9 +684,6 @@ struct FlowGenericFramework { if (mcParticle.eta() < etalow || mcParticle.eta() > etaup || mcParticle.pt() < ptlow || mcParticle.pt() > ptup || track.tpcNClsFound() < cfgNcls) return; - if (cfgUseAdditionalTrackCut && !trackSelected(track, field)) - return; - int pidIndex = 0; if (cfgUsePID) { if (std::abs(mcParticle.pdgCode()) == kPiPlus) @@ -799,9 +739,6 @@ struct FlowGenericFramework { if (track.tpcNClsFound() < cfgNcls) return; - if (cfgUseAdditionalTrackCut && !trackSelected(track, field)) - return; - int pidIndex = 0; if (cfgUsePID) { // pid_index = getBayesPIDIndex(track); @@ -868,11 +805,20 @@ struct FlowGenericFramework { if (withinPtNch && withinPtRef) fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), waccPOI, 32); } else { // Analysing only integrated flow + bool withinPtRef = (track.pt() > ptreflow && track.pt() < ptrefup); + bool withinPtPOI = (track.pt() > ptpoilow && track.pt() < ptpoiup); + if (!withinPtPOI && !withinPtRef) + return; double weff = (dt == kGen) ? 1. : getEfficiency(track); if (weff < 0) return; double wacc = (dt == kGen) ? 1. : getAcceptance(track, vtxz, 0); - fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), weff * wacc, 1); + if (withinPtRef) + fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), weff * wacc, 1); + if (withinPtPOI) + fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), weff * wacc, 2); + if (withinPtRef && withinPtPOI) + fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), weff * wacc, 4); } return; } @@ -955,8 +901,7 @@ struct FlowGenericFramework { return; if (cfgFillQA) fillEventQA(collision, tracks); - auto field = (cfgMagField == 99999) ? getMagneticField(bc.timestamp()) : cfgMagField; - processCollision(collision, tracks, centrality, field, run); + processCollision(collision, tracks, centrality, run); } PROCESS_SWITCH(FlowGenericFramework, processData, "Process analysis for non-derived data", true); @@ -981,8 +926,7 @@ struct FlowGenericFramework { if (!cfgFillWeights) loadCorrections(bc); - auto field = (cfgMagField == 99999) ? getMagneticField(bc.timestamp()) : cfgMagField; - processCollision(collision, tracks, centrality, field, run); + processCollision(collision, tracks, centrality, run); } PROCESS_SWITCH(FlowGenericFramework, processMCReco, "Process analysis for MC reconstructed events", false); @@ -995,7 +939,7 @@ struct FlowGenericFramework { for (const auto& collision : collisions) { centrality = collision.centFT0C(); } - processCollision(mcCollision, particles, centrality, -999, 0); + processCollision(mcCollision, particles, centrality, 0); } PROCESS_SWITCH(FlowGenericFramework, processMCGen, "Process analysis for MC generated events", false); @@ -1013,8 +957,7 @@ struct FlowGenericFramework { const auto centrality = collision.centRun2V0M(); if (!cfgFillWeights) loadCorrections(bc); - auto field = (cfgMagField == 99999) ? getMagneticField(bc.timestamp()) : cfgMagField; - processCollision(collision, tracks, centrality, field, run); + processCollision(collision, tracks, centrality, run); } PROCESS_SWITCH(FlowGenericFramework, processRun2, "Process analysis for Run 2 converted data", false); }; From 6e834bda66c7c8898f19a2ff3385bee89ac03851 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Tue, 15 Apr 2025 21:01:21 +0200 Subject: [PATCH 0999/1650] [PWGEM/Dilepton] update DCA calculation (#10861) --- PWGEM/Dilepton/Core/SingleTrackQC.h | 14 ++++-- PWGEM/Dilepton/Core/SingleTrackQCMC.h | 14 ++++-- PWGEM/Dilepton/Tasks/matchingMFT.cxx | 10 +++- PWGEM/Dilepton/Utils/EMTrackUtilities.h | 62 +++++++++++++++++-------- 4 files changed, 70 insertions(+), 30 deletions(-) diff --git a/PWGEM/Dilepton/Core/SingleTrackQC.h b/PWGEM/Dilepton/Core/SingleTrackQC.h index a51e2f0df9b..f1ffcbb0963 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQC.h @@ -233,8 +233,9 @@ struct SingleTrackQC { fRegistry.add("Track/positive/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{400, -20, 20}}, false); fRegistry.add("Track/positive/hDCAxyz", "DCA xy vs. z;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -1.0f, 1.0f}, {200, -1.0f, 1.0f}}, false); fRegistry.add("Track/positive/hDCAxyzSigma", "DCA xy vs. z;DCA_{xy} (#sigma);DCA_{z} (#sigma)", kTH2F, {{200, -10.0f, 10.0f}, {200, -10.0f, 10.0f}}, false); - fRegistry.add("Track/positive/hDCAxyRes_Pt", "DCA_{xy} resolution vs. pT;p_{T} (GeV/c);DCA_{xy} resolution (#mum)", kTH2F, {{200, 0, 10}, {200, 0., 400}}, false); - fRegistry.add("Track/positive/hDCAzRes_Pt", "DCA_{z} resolution vs. pT;p_{T} (GeV/c);DCA_{z} resolution (#mum)", kTH2F, {{200, 0, 10}, {200, 0., 400}}, false); + fRegistry.add("Track/positive/hDCAxyRes_Pt", "DCA_{xy} resolution vs. pT;p_{T} (GeV/c);DCA_{xy} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0., 500}}, false); + fRegistry.add("Track/positive/hDCAzRes_Pt", "DCA_{z} resolution vs. pT;p_{T} (GeV/c);DCA_{z} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0., 400}}, false); + fRegistry.add("Track/positive/hDCA3dRes_Pt", "DCA_{3D} resolution vs. pT;p_{T} (GeV/c);DCA_{3D} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0., 500}}, false); fRegistry.add("Track/positive/hNclsTPC", "number of TPC clusters;TPC N_{cls}", kTH1F, {{161, -0.5, 160.5}}, false); fRegistry.add("Track/positive/hNcrTPC", "number of TPC crossed rows;TPC N_{CR}", kTH1F, {{161, -0.5, 160.5}}, false); fRegistry.add("Track/positive/hChi2TPC", "chi2/number of TPC clusters;TPC #chi^{2}/N_{CR}", kTH1F, {{100, 0, 10}}, false); @@ -284,8 +285,9 @@ struct SingleTrackQC { fRegistry.add("Track/positive/hTrackType", "track type", kTH1F, {{6, -0.5f, 5.5}}, false); fRegistry.add("Track/positive/hDCAxy", "DCA x vs. y;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -0.5f, 0.5f}, {200, -0.5f, 0.5f}}, false); fRegistry.add("Track/positive/hDCAxySigma", "DCA x vs. y;DCA_{x} (#sigma);DCA_{y} (#sigma)", kTH2F, {{200, -10.0f, 10.0f}, {200, -10.0f, 10.0f}}, false); - fRegistry.add("Track/positive/hDCAxRes_Pt", "DCA_{x} resolution vs. pT;p_{T} (GeV/c);DCA_{x} resolution (#mum)", kTH2F, {{100, 0, 10}, {500, 0, 500}}, false); - fRegistry.add("Track/positive/hDCAyRes_Pt", "DCA_{y} resolution vs. pT;p_{T} (GeV/c);DCA_{y} resolution (#mum)", kTH2F, {{100, 0, 10}, {500, 0, 500}}, false); + fRegistry.add("Track/positive/hDCAxRes_Pt", "DCA_{x} resolution vs. pT;p_{T} (GeV/c);DCA_{x} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0, 500}}, false); + fRegistry.add("Track/positive/hDCAyRes_Pt", "DCA_{y} resolution vs. pT;p_{T} (GeV/c);DCA_{y} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0, 500}}, false); + fRegistry.add("Track/positive/hDCAxyRes_Pt", "DCA_{xy} resolution vs. pT;p_{T} (GeV/c);DCA_{xy} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0, 500}}, false); fRegistry.add("Track/positive/hNclsMCH", "number of MCH clusters", kTH1F, {{21, -0.5, 20.5}}, false); fRegistry.add("Track/positive/hNclsMFT", "number of MFT clusters", kTH1F, {{11, -0.5, 10.5}}, false); fRegistry.add("Track/positive/hPDCA", "pDCA;R at absorber end (cm);p #times DCA (GeV/c #upoint cm)", kTH2F, {{100, 0, 100}, {100, 0.0f, 1000}}, false); @@ -473,6 +475,7 @@ struct SingleTrackQC { fRegistry.fill(HIST("Track/positive/hDCAxyzSigma"), track.dcaXY() / std::sqrt(track.cYY()), track.dcaZ() / std::sqrt(track.cZZ())); fRegistry.fill(HIST("Track/positive/hDCAxyRes_Pt"), track.pt(), std::sqrt(track.cYY()) * 1e+4); // convert cm to um fRegistry.fill(HIST("Track/positive/hDCAzRes_Pt"), track.pt(), std::sqrt(track.cZZ()) * 1e+4); // convert cm to um + fRegistry.fill(HIST("Track/positive/hDCA3dRes_Pt"), track.pt(), sigmaDca3D(track) * 1e+4); // convert cm to um fRegistry.fill(HIST("Track/positive/hNclsITS"), track.itsNCls()); fRegistry.fill(HIST("Track/positive/hNclsTPC"), track.tpcNClsFound()); fRegistry.fill(HIST("Track/positive/hNcrTPC"), track.tpcNClsCrossedRows()); @@ -512,6 +515,7 @@ struct SingleTrackQC { fRegistry.fill(HIST("Track/negative/hDCAxyzSigma"), track.dcaXY() / std::sqrt(track.cYY()), track.dcaZ() / std::sqrt(track.cZZ())); fRegistry.fill(HIST("Track/negative/hDCAxyRes_Pt"), track.pt(), std::sqrt(track.cYY()) * 1e+4); // convert cm to um fRegistry.fill(HIST("Track/negative/hDCAzRes_Pt"), track.pt(), std::sqrt(track.cZZ()) * 1e+4); // convert cm to um + fRegistry.fill(HIST("Track/negative/hDCA3dRes_Pt"), track.pt(), sigmaDca3D(track) * 1e+4); // convert cm to um fRegistry.fill(HIST("Track/negative/hNclsITS"), track.itsNCls()); fRegistry.fill(HIST("Track/negative/hNclsTPC"), track.tpcNClsFound()); fRegistry.fill(HIST("Track/negative/hNcrTPC"), track.tpcNClsCrossedRows()); @@ -564,6 +568,7 @@ struct SingleTrackQC { fRegistry.fill(HIST("Track/positive/hDCAxySigma"), track.fwdDcaX() / std::sqrt(track.cXXatDCA()), track.fwdDcaY() / std::sqrt(track.cYYatDCA())); fRegistry.fill(HIST("Track/positive/hDCAxRes_Pt"), track.pt(), std::sqrt(track.cXXatDCA()) * 1e+4); fRegistry.fill(HIST("Track/positive/hDCAyRes_Pt"), track.pt(), std::sqrt(track.cYYatDCA()) * 1e+4); + fRegistry.fill(HIST("Track/positive/hDCAxyRes_Pt"), track.pt(), sigmaFwdDcaXY(track) * 1e+4); fRegistry.fill(HIST("Track/positive/hNclsMCH"), track.nClusters()); fRegistry.fill(HIST("Track/positive/hNclsMFT"), track.nClustersMFT()); fRegistry.fill(HIST("Track/positive/hPDCA"), track.rAtAbsorberEnd(), track.pDca()); @@ -580,6 +585,7 @@ struct SingleTrackQC { fRegistry.fill(HIST("Track/negative/hDCAxySigma"), track.fwdDcaX() / std::sqrt(track.cXXatDCA()), track.fwdDcaY() / std::sqrt(track.cYYatDCA())); fRegistry.fill(HIST("Track/negative/hDCAxRes_Pt"), track.pt(), std::sqrt(track.cXXatDCA()) * 1e+4); fRegistry.fill(HIST("Track/negative/hDCAyRes_Pt"), track.pt(), std::sqrt(track.cYYatDCA()) * 1e+4); + fRegistry.fill(HIST("Track/negative/hDCAxyRes_Pt"), track.pt(), sigmaFwdDcaXY(track) * 1e+4); fRegistry.fill(HIST("Track/negative/hNclsMCH"), track.nClusters()); fRegistry.fill(HIST("Track/negative/hNclsMFT"), track.nClustersMFT()); fRegistry.fill(HIST("Track/negative/hPDCA"), track.rAtAbsorberEnd(), track.pDca()); diff --git a/PWGEM/Dilepton/Core/SingleTrackQCMC.h b/PWGEM/Dilepton/Core/SingleTrackQCMC.h index 1fa8b942c14..d0239c20298 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQCMC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQCMC.h @@ -264,8 +264,9 @@ struct SingleTrackQCMC { fRegistry.add("Track/lf/positive/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{400, -20, 20}}, false); fRegistry.add("Track/lf/positive/hDCAxyz", "DCA xy vs. z;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -1.0f, 1.0f}, {200, -1.0f, 1.0f}}, false); fRegistry.add("Track/lf/positive/hDCAxyzSigma", "DCA xy vs. z;DCA_{xy} (#sigma);DCA_{z} (#sigma)", kTH2F, {{200, -10.0f, 10.0f}, {200, -10.0f, 10.0f}}, false); - fRegistry.add("Track/lf/positive/hDCAxyRes_Pt", "DCA_{xy} resolution vs. pT;p_{T} (GeV/c);DCA_{xy} resolution (#mum)", kTH2F, {{200, 0, 10}, {200, 0., 400}}, false); - fRegistry.add("Track/lf/positive/hDCAzRes_Pt", "DCA_{z} resolution vs. pT;p_{T} (GeV/c);DCA_{z} resolution (#mum)", kTH2F, {{200, 0, 10}, {200, 0., 400}}, false); + fRegistry.add("Track/lf/positive/hDCAxyRes_Pt", "DCA_{xy} resolution vs. pT;p_{T} (GeV/c);DCA_{xy} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0., 500}}, false); + fRegistry.add("Track/lf/positive/hDCAzRes_Pt", "DCA_{z} resolution vs. pT;p_{T} (GeV/c);DCA_{z} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0., 500}}, false); + fRegistry.add("Track/lf/positive/hDCA3dRes_Pt", "DCA_{3D} resolution vs. pT;p_{T} (GeV/c);DCA_{3D} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0., 500}}, false); fRegistry.add("Track/lf/positive/hNclsTPC", "number of TPC clusters", kTH1F, {{161, -0.5, 160.5}}, false); fRegistry.add("Track/lf/positive/hNcrTPC", "number of TPC crossed rows", kTH1F, {{161, -0.5, 160.5}}, false); fRegistry.add("Track/lf/positive/hChi2TPC", "chi2/number of TPC clusters", kTH1F, {{100, 0, 10}}, false); @@ -341,8 +342,9 @@ struct SingleTrackQCMC { fRegistry.add("Track/lf/positive/hTrackType", "track type", kTH1F, {{6, -0.5f, 5.5}}, false); fRegistry.add("Track/lf/positive/hDCAxy", "DCA x vs. y;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -0.5f, 0.5f}, {200, -0.5f, 0.5f}}, false); fRegistry.add("Track/lf/positive/hDCAxySigma", "DCA x vs. y;DCA_{x} (#sigma);DCA_{y} (#sigma)", kTH2F, {{200, -10.0f, 10.0f}, {200, -10.0f, 10.0f}}, false); - fRegistry.add("Track/lf/positive/hDCAxRes_Pt", "DCA_{x} resolution vs. pT;p_{T} (GeV/c);DCA_{x} resolution (#mum)", kTH2F, {{100, 0, 10}, {500, 0, 500}}, false); - fRegistry.add("Track/lf/positive/hDCAyRes_Pt", "DCA_{y} resolution vs. pT;p_{T} (GeV/c);DCA_{y} resolution (#mum)", kTH2F, {{100, 0, 10}, {500, 0, 500}}, false); + fRegistry.add("Track/lf/positive/hDCAxRes_Pt", "DCA_{x} resolution vs. pT;p_{T} (GeV/c);DCA_{x} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0, 500}}, false); + fRegistry.add("Track/lf/positive/hDCAyRes_Pt", "DCA_{y} resolution vs. pT;p_{T} (GeV/c);DCA_{y} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0, 500}}, false); + fRegistry.add("Track/lf/positive/hDCAxyRes_Pt", "DCA_{xy} resolution vs. pT;p_{T} (GeV/c);DCA_{xy} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0, 500}}, false); fRegistry.add("Track/lf/positive/hNclsMCH", "number of MCH clusters", kTH1F, {{21, -0.5, 20.5}}, false); fRegistry.add("Track/lf/positive/hNclsMFT", "number of MFT clusters", kTH1F, {{11, -0.5, 10.5}}, false); fRegistry.add("Track/lf/positive/hPDCA", "pDCA;R at absorber (cm);p #times DCA (GeV/c #upoint cm)", kTH2F, {{100, 0, 100}, {100, 0.0f, 1000}}, false); @@ -577,6 +579,7 @@ struct SingleTrackQCMC { fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hDCAxyzSigma"), track.dcaXY() / std::sqrt(track.cYY()), track.dcaZ() / std::sqrt(track.cZZ())); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hDCAxyRes_Pt"), track.pt(), std::sqrt(track.cYY()) * 1e+4); // convert cm to um fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hDCAzRes_Pt"), track.pt(), std::sqrt(track.cZZ()) * 1e+4); // convert cm to um + fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hDCA3dRes_Pt"), track.pt(), sigmaDca3D(track) * 1e+4); // convert cm to um fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hNclsITS"), track.itsNCls()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hNclsTPC"), track.tpcNClsFound()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hNcrTPC"), track.tpcNClsCrossedRows()); @@ -621,6 +624,7 @@ struct SingleTrackQCMC { fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hDCAxyzSigma"), track.dcaXY() / std::sqrt(track.cYY()), track.dcaZ() / std::sqrt(track.cZZ())); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hDCAxyRes_Pt"), track.pt(), std::sqrt(track.cYY()) * 1e+4); // convert cm to um fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hDCAzRes_Pt"), track.pt(), std::sqrt(track.cZZ()) * 1e+4); // convert cm to um + fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hDCA3dRes_Pt"), track.pt(), sigmaDca3D(track) * 1e+4); // convert cm to um fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hNclsITS"), track.itsNCls()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hNclsTPC"), track.tpcNClsFound()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hNcrTPC"), track.tpcNClsCrossedRows()); @@ -682,6 +686,7 @@ struct SingleTrackQCMC { fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hDCAxySigma"), track.fwdDcaX() / std::sqrt(track.cXXatDCA()), track.fwdDcaY() / std::sqrt(track.cYYatDCA())); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hDCAxRes_Pt"), track.pt(), std::sqrt(track.cXXatDCA()) * 1e+4); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hDCAyRes_Pt"), track.pt(), std::sqrt(track.cYYatDCA()) * 1e+4); + fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hDCAxyRes_Pt"), track.pt(), sigmaFwdDcaXY(track) * 1e+4); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hNclsMCH"), track.nClusters()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hNclsMFT"), track.nClustersMFT()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hPDCA"), track.rAtAbsorberEnd(), track.pDca()); @@ -703,6 +708,7 @@ struct SingleTrackQCMC { fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hDCAxySigma"), track.fwdDcaX() / std::sqrt(track.cXXatDCA()), track.fwdDcaY() / std::sqrt(track.cYYatDCA())); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hDCAxRes_Pt"), track.pt(), std::sqrt(track.cXXatDCA()) * 1e+4); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hDCAyRes_Pt"), track.pt(), std::sqrt(track.cYYatDCA()) * 1e+4); + fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hDCAxyRes_Pt"), track.pt(), sigmaFwdDcaXY(track) * 1e+4); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hNclsMCH"), track.nClusters()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hNclsMFT"), track.nClustersMFT()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hPDCA"), track.rAtAbsorberEnd(), track.pDca()); diff --git a/PWGEM/Dilepton/Tasks/matchingMFT.cxx b/PWGEM/Dilepton/Tasks/matchingMFT.cxx index ed467b8d715..b327bfc67de 100644 --- a/PWGEM/Dilepton/Tasks/matchingMFT.cxx +++ b/PWGEM/Dilepton/Tasks/matchingMFT.cxx @@ -160,8 +160,9 @@ struct matchingMFT { fRegistry.add("MFTMCHMID/primary/correct/hDCAxy2DinSigma", "DCA x vs. y in sigma;DCA_{x} (#sigma);DCA_{y} (#sigma)", kTH2F, {{200, -10, 10}, {200, -10, +10}}, false); fRegistry.add("MFTMCHMID/primary/correct/hDCAxy", "DCAxy;DCA_{xy} (cm);", kTH1F, {{100, 0, 1}}, false); fRegistry.add("MFTMCHMID/primary/correct/hDCAxyinSigma", "DCAxy in sigma;DCA_{xy} (#sigma);", kTH1F, {{100, 0, 10}}, false); - fRegistry.add("MFTMCHMID/primary/correct/hDCAxResolutionvsPt", "DCA_{x} vs. p_{T};p_{T} (GeV/c);DCA_{x} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 500}}, false); - fRegistry.add("MFTMCHMID/primary/correct/hDCAyResolutionvsPt", "DCA_{y} vs. p_{T};p_{T} (GeV/c);DCA_{y} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 500}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hDCAxResolutionvsPt", "DCA_{x} resolution vs. p_{T};p_{T} (GeV/c);DCA_{x} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 500}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hDCAyResolutionvsPt", "DCA_{y} resolution vs. p_{T};p_{T} (GeV/c);DCA_{y} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 500}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hDCAxyResolutionvsPt", "DCA_{xy} resolution vs. p_{T};p_{T} (GeV/c);DCA_{xy} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 500}}, false); fRegistry.add("MFTMCHMID/primary/correct/hRelDeltaPt", "pT resolution;p_{T}^{gen} (GeV/c);(p_{T}^{rec} - p_{T}^{gen})/p_{T}^{gen}", kTH2F, {{100, 0, 10}, {400, -1, +1}}, true); fRegistry.add("MFTMCHMID/primary/correct/hDeltaEta_Pos", "#eta resolution;p_{T}^{gen} (GeV/c);#eta^{rec} - #eta^{gen}", kTH2F, {{100, 0, 10}, {400, -0.2, +0.2}}, true); fRegistry.add("MFTMCHMID/primary/correct/hDeltaEta_Neg", "#eta resolution;p_{T}^{gen} (GeV/c);#eta^{rec} - #eta^{gen}", kTH2F, {{100, 0, 10}, {400, -0.2, +0.2}}, true); @@ -319,6 +320,8 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxyinSigma"), dcaXY / sigma_dcaXY); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxResolutionvsPt"), pt, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAyResolutionvsPt"), pt, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxyResolutionvsPt"), pt, sigma_dcaXY * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hRelDeltaPt"), mcParticle_MFTMCHMID.pt(), (pt - mcParticle_MFTMCHMID.pt()) / mcParticle_MFTMCHMID.pt()); if (mcParticle_MFTMCHMID.pdgCode() > 0) { fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDeltaEta_Neg"), mcParticle_MFTMCHMID.pt(), eta - mcParticle_MFTMCHMID.eta()); @@ -347,6 +350,7 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxyinSigma"), dcaXY / sigma_dcaXY); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxResolutionvsPt"), pt, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAyResolutionvsPt"), pt, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxyResolutionvsPt"), pt, sigma_dcaXY * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hRelDeltaPt"), mcParticle_MFTMCHMID.pt(), (pt - mcParticle_MFTMCHMID.pt()) / mcParticle_MFTMCHMID.pt()); if (mcParticle_MFTMCHMID.pdgCode() > 0) { fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDeltaEta_Neg"), mcParticle_MFTMCHMID.pt(), eta - mcParticle_MFTMCHMID.eta()); @@ -377,6 +381,7 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxyinSigma"), dcaXY / sigma_dcaXY); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxResolutionvsPt"), pt, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAyResolutionvsPt"), pt, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxyResolutionvsPt"), pt, sigma_dcaXY * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hRelDeltaPt"), mcParticle_MFTMCHMID.pt(), (pt - mcParticle_MFTMCHMID.pt()) / mcParticle_MFTMCHMID.pt()); if (mcParticle_MFTMCHMID.pdgCode() > 0) { fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDeltaEta_Neg"), mcParticle_MFTMCHMID.pt(), eta - mcParticle_MFTMCHMID.eta()); @@ -405,6 +410,7 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxyinSigma"), dcaXY / sigma_dcaXY); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxResolutionvsPt"), pt, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAyResolutionvsPt"), pt, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxyResolutionvsPt"), pt, sigma_dcaXY * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hRelDeltaPt"), mcParticle_MFTMCHMID.pt(), (pt - mcParticle_MFTMCHMID.pt()) / mcParticle_MFTMCHMID.pt()); if (mcParticle_MFTMCHMID.pdgCode() > 0) { fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDeltaEta_Neg"), mcParticle_MFTMCHMID.pt(), eta - mcParticle_MFTMCHMID.eta()); diff --git a/PWGEM/Dilepton/Utils/EMTrackUtilities.h b/PWGEM/Dilepton/Utils/EMTrackUtilities.h index 77a1c8ca7ed..52b5d946b7b 100644 --- a/PWGEM/Dilepton/Utils/EMTrackUtilities.h +++ b/PWGEM/Dilepton/Utils/EMTrackUtilities.h @@ -23,21 +23,38 @@ //_______________________________________________________________________ namespace o2::aod::pwgem::dilepton::utils::emtrackutil { +//_______________________________________________________________________ +template +float sigmaDca3D(T const& track) +{ + float cYY = track.cYY(); // in cm^2 + float cZZ = track.cZZ(); // in cm^2 + float cZY = track.cZY(); // in cm^2 + float dcaXY = track.dcaXY(); // in cm + float dcaZ = track.dcaZ(); // in cm + float dca3d = std::sqrt(dcaXY * dcaXY + dcaZ * dcaZ); // in cm + float dFdxy = 2.f * dcaXY / dca3d; + float dFdz = 2.f * dcaZ / dca3d; + return std::sqrt(cYY * dFdxy * dFdxy + cZZ * dFdz * dFdz + 2.f * cZY * dFdxy * dFdz); +} +//_______________________________________________________________________ template float dca3DinSigma(T const& track) { - float cYY = track.cYY(); - float cZZ = track.cZZ(); - float cZY = track.cZY(); - float dcaXY = track.dcaXY(); // in cm - float dcaZ = track.dcaZ(); // in cm + return std::sqrt(track.dcaXY() * track.dcaXY() + track.dcaZ() * track.dcaZ()) / sigmaDca3D(track); - float det = cYY * cZZ - cZY * cZY; // determinant - if (det < 0) { - return 999.f; - } else { - return std::sqrt(std::fabs((dcaXY * dcaXY * cZZ + dcaZ * dcaZ * cYY - 2. * dcaXY * dcaZ * cZY) / det / 2.)); // dca 3d in sigma - } + // float cYY = track.cYY(); + // float cZZ = track.cZZ(); + // float cZY = track.cZY(); + // float dcaXY = track.dcaXY(); // in cm + // float dcaZ = track.dcaZ(); // in cm + + // float det = cYY * cZZ - cZY * cZY; // determinant + // if (det < 0) { + // return 999.f; + // } else { + // return std::sqrt(std::fabs((dcaXY * dcaXY * cZZ + dcaZ * dcaZ * cYY - 2. * dcaXY * dcaZ * cZY) / det / 2.)); // dca 3d in sigma + // } } //_______________________________________________________________________ template @@ -53,18 +70,23 @@ float dcaZinSigma(T const& track) } //_______________________________________________________________________ template -float fwdDcaXYinSigma(T const& track) +float sigmaFwdDcaXY(T const& track) { - float cXX = track.cXXatDCA(); - float cYY = track.cYYatDCA(); - float cXY = track.cXYatDCA(); - float dcaX = track.fwdDcaX(); // in cm - float dcaY = track.fwdDcaY(); // in cm - float dcaXY = std::sqrt(dcaX * dcaX + dcaY * dcaY); + float cXX = track.cXXatDCA(); // in cm^2 + float cYY = track.cYYatDCA(); // in cm^2 + float cXY = track.cXYatDCA(); // in cm^2 + float dcaX = track.fwdDcaX(); // in cm + float dcaY = track.fwdDcaY(); // in cm + float dcaXY = std::sqrt(dcaX * dcaX + dcaY * dcaY); // in cm float dFdx = 2.f * dcaX / dcaXY; float dFdy = 2.f * dcaY / dcaXY; - float sigma_dcaXY = std::sqrt(cXX * dFdx * dFdx + cYY * dFdy * dFdy + 2.f * cXY * dFdx * dFdy); - return dcaXY / sigma_dcaXY; + return std::sqrt(cXX * dFdx * dFdx + cYY * dFdy * dFdy + 2.f * cXY * dFdx * dFdy); +} +//_______________________________________________________________________ +template +float fwdDcaXYinSigma(T const& track) +{ + return std::sqrt(track.fwdDcaX() * track.fwdDcaX() + track.fwdDcaY() * track.fwdDcaY()) / sigmaFwdDcaXY(track); // float det = cXX * cYY - cXY * cXY; // determinant // if (det < 0) { From 4aa775b9c18f71dee1be5425444da1c9482381a6 Mon Sep 17 00:00:00 2001 From: Victor Gonzalez Date: Tue, 15 Apr 2025 21:53:48 +0200 Subject: [PATCH 1000/1650] [PWGCF] DptDpt - Tracking the insertion of pT bins of interest (#10864) Co-authored-by: Victor --- .../Tasks/dptDptEfficiencyAndQc.cxx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx index 1ffb4edab80..f1b75ed15ba 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx @@ -95,7 +95,7 @@ float widthNSigmaBin = 0.1f; int noOfNSigmaBins = static_cast((maxNSigma - minNSigma) / widthNSigmaBin); /* the pT bins of interest for the relative separation within TPC sectors data collection */ -std::vector ptBinsOfInterest{1, 2, 3}; +std::vector ptBinsOfInterest{}; /* the PID selector object to help with the configuration and the id of the selected particles */ o2::analysis::dptdptfilter::PIDSpeciesSelection pidselector; @@ -1114,7 +1114,11 @@ struct DptDptEfficiencyAndQc { noOfNSigmaBins = static_cast((maxNSigma - minNSigma) / widthNSigmaBin); /* configure the pT bins of interest */ - ptBinsOfInterest = cfgPtBinsOfInterest.value; + TAxis ptAxis{ptbins, ptlow, ptup}; + for (const int& bin : cfgPtBinsOfInterest.value) { + ptBinsOfInterest.push_back(bin); + LOGF(info, "Inserted pT bin %d: %.2f < pT < %.2f GeV/c", bin, ptAxis.GetBinLowEdge(bin), ptAxis.GetBinUpEdge(bin)); + } bool doBasicAnalysis = doprocessDetectorLevelNotStored || doprocessReconstructedNotStored || doprocessGeneratorLevelNotStored; bool doExtraAnalysis = doprocessExtraDetectorLevelNotStored || doprocessExtraReconstructedNotStored || doprocessExtraGeneratorLevelNotStored; From 06ff423ea4c608433dc2021dbbc2e277ffb97dbf Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Tue, 15 Apr 2025 23:15:34 +0200 Subject: [PATCH 1001/1650] [PWGLF] Chk892Flow - Add RCT flag Checker (#10867) --- PWGLF/Tasks/Resonances/chk892Flow.cxx | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Resonances/chk892Flow.cxx b/PWGLF/Tasks/Resonances/chk892Flow.cxx index 79ae1de5381..18e21f5dd11 100644 --- a/PWGLF/Tasks/Resonances/chk892Flow.cxx +++ b/PWGLF/Tasks/Resonances/chk892Flow.cxx @@ -78,6 +78,7 @@ using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::soa; using namespace o2::constants::physics; +using namespace o2::aod::rctsel; struct Chk892Flow { enum BinType : unsigned int { @@ -148,7 +149,12 @@ struct Chk892Flow { Configurable cfgEvtCollInTimeRangeStandard{"cfgEvtCollInTimeRangeStandard", true, "Evt sel: apply NoCollInTimeRangeStandard"}; Configurable cfgEventCentralityMin{"cfgEventCentralityMin", 0.0f, "Event sel: minimum centrality"}; Configurable cfgEventCentralityMax{"cfgEventCentralityMax", 80.0f, "Event sel: maximum centrality"}; + Configurable cfgEvtUseRCTFlagChecker{"cfgEvtUseRCTFlagChecker", false, "Evt sel: use RCT flag checker"}; + Configurable cfgEvtRCTFlagCheckerLabel{"cfgEvtRCTFlagCheckerLabel", "CBT_hadronPID", "Evt sel: RCT flag checker label"}; + Configurable cfgEvtRCTFlagCheckerZDCCheck{"cfgEvtRCTFlagCheckerZDCCheck", false, "Evt sel: RCT flag checker ZDC check"}; + Configurable cfgEvtRCTFlagCheckerLimitAcceptAsBad{"cfgEvtRCTFlagCheckerLimitAcceptAsBad", false, "Evt sel: RCT flag checker treat Limited Acceptance As Bad"}; } EventCuts; + RCTFlagsChecker rctChecker; /// PID Selections, pion struct : ConfigurableGroup { @@ -262,6 +268,8 @@ struct Chk892Flow { colCuts.setApplyCollInTimeRangeStandard(EventCuts.cfgEvtCollInTimeRangeStandard); colCuts.printCuts(); + rctChecker.init(EventCuts.cfgEvtRCTFlagCheckerLabel, EventCuts.cfgEvtRCTFlagCheckerZDCCheck, EventCuts.cfgEvtRCTFlagCheckerLimitAcceptAsBad); + AxisSpec centAxis = {AxisConfig.cfgBinsCent, "T0M (%)"}; AxisSpec vtxzAxis = {AxisConfig.cfgBinsVtxZ, "Z Vertex (cm)"}; AxisSpec epAxis = {100, -1.0 * constants::math::PI, constants::math::PI}; @@ -1066,12 +1074,15 @@ struct Chk892Flow { { if (!colCuts.isSelected(collision)) // Default event selection return; + if (EventCuts.cfgEvtUseRCTFlagChecker && !rctChecker(collision)) { + return; + } if (AnalysisConfig.cfgQvecSel && (collision.qvecAmp()[lDetId] < 1e-4 || collision.qvecAmp()[lRefAId] < 1e-4 || collision.qvecAmp()[lRefBId] < 1e-4)) return; // If we don't have a Q-vector - colCuts.fillQA(collision); lCentrality = getCentrality(collision); if (lCentrality < EventCuts.cfgEventCentralityMin || lCentrality > EventCuts.cfgEventCentralityMax) return; + colCuts.fillQA(collision); fillHistograms(collision, tracks, v0s, EventPlaneConfig.cfgnMods); // second order } @@ -1082,6 +1093,9 @@ struct Chk892Flow { MCTrackCandidates const& tracks, MCV0Candidates const& v0s) { + if (EventCuts.cfgEvtUseRCTFlagChecker && !rctChecker(collision)) { + return; + } fillHistograms(collision, tracks, v0s, EventPlaneConfig.cfgnMods); } PROCESS_SWITCH(Chk892Flow, processMC, "Process Event for MC", false); From 490e3f764ca94bbf57f3f1702373026afe38d4ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Tue, 15 Apr 2025 23:23:08 +0200 Subject: [PATCH 1002/1650] Improve O2 linter (#10824) --- Scripts/o2_linter.py | 299 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 244 insertions(+), 55 deletions(-) diff --git a/Scripts/o2_linter.py b/Scripts/o2_linter.py index 98167d7f77b..13ef222b854 100644 --- a/Scripts/o2_linter.py +++ b/Scripts/o2_linter.py @@ -21,13 +21,46 @@ import os import re import sys -from abc import ABC +from enum import Enum from typing import Union github_mode = False # GitHub mode prefix_disable = "o2-linter: disable=" # prefix for disabling tests +class Reference(Enum): + O2 = 1 + ISO_CPP = 2 + LLVM = 3 + GOOGLE = 4 + LINTER = 5 + PWG_HF = 6 + PY_ZEN = 7 + PY_PEP8 = 8 + + +references_list: "list[tuple[Reference, str, str]]" = [ + (Reference.O2, "ALICE O2 Coding Guidelines", "https://github.com/AliceO2Group/CodingGuidelines"), + (Reference.ISO_CPP, "C++ Core Guidelines", "https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines"), + (Reference.LLVM, "LLVM Coding Standards", "https://llvm.org/docs/CodingStandards.html"), + (Reference.GOOGLE, "Google C++ Style Guide", "https://google.github.io/styleguide/cppguide.html"), + ( + Reference.LINTER, + "Proposal of the O2 linter", + "https://indico.cern.ch/event/1482467/#29-development-of-the-o2-linte", + ), + ( + Reference.PWG_HF, + "PWG-HF guidelines", + "https://aliceo2group.github.io/analysis-framework/docs/advanced-specifics/pwghf.html#contribute", + ), + (Reference.PY_ZEN, "The Zen of Python", "https://peps.python.org/pep-0020/"), + (Reference.PY_PEP8, "Style Guide for Python Code", "https://peps.python.org/pep-0008/"), +] + +references: "dict[Reference, dict]" = {name: {"title": title, "url": url} for name, title, url in references_list} + + def is_camel_case(name: str) -> bool: """forExample or ForExample""" return "_" not in name and "-" not in name and " " not in name @@ -120,7 +153,7 @@ def block_ranges(line: str, char_open: str, char_close: str) -> "list[list[int]] """Get list of index ranges of longest blocks opened with char_open and closed with char_close.""" # print(f"Looking for {char_open}{char_close} blocks in \"{line}\".") # print(line) - list_ranges: "list[list[int]]" = [] + list_ranges: list[list[int]] = [] if not all((line, len(char_open) == 1, len(char_close) == 1)): return list_ranges @@ -155,15 +188,17 @@ def direction(char: str) -> int: return list_ranges -class TestSpec(ABC): +class TestSpec: """Prototype of a test class""" - name = "test-template" # short name of the test - message = "Test failed" # error message + name: str = "test-template" # short name of the test + message: str = "Test failed" # error message + rationale: str = "Rationale missing" # brief rationale explanation + references: "list[Reference]" = [] # list of references relevant for this rule suffixes: "list[str]" = [] # suffixes of files to test - per_line = True # Test lines separately one by one. - n_issues = 0 # issue counter - n_disabled = 0 # counter of disabled issues + per_line: bool = True # Test lines separately one by one. + n_issues: int = 0 # issue counter + n_disabled: int = 0 # counter of disabled issues def file_matches(self, path: str) -> bool: """Test whether the path matches the pattern for files to test.""" @@ -199,7 +234,7 @@ def run(self, path: str, content) -> bool: # print(f"Running test {self.name} for {path} with {len(content)} lines") if self.per_line: for i, line in enumerate(content): - if not isinstance(self, TestUsingDirectives): # Keep the indentation if needed. + if not isinstance(self, TestUsingDirective): # Keep the indentation if needed. line = line.strip() if not line: continue @@ -225,11 +260,13 @@ def run(self, path: str, content) -> bool: # Bad practice -class TestIOStream(TestSpec): +class TestIoStream(TestSpec): """Detect included iostream.""" name = "include-iostream" message = "Do not include iostream. Use O2 logging instead." + rationale = "Performance. Avoid injection of static constructors. Consistent logging." + references = [Reference.LLVM, Reference.LINTER] suffixes = [".h", ".cxx"] def test_line(self, line: str) -> bool: @@ -243,6 +280,8 @@ class TestUsingStd(TestSpec): name = "import-std-name" message = "Do not import names from the std namespace in headers." + rationale = "Code safety. Avoid namespace pollution with common names." + references = [Reference.LINTER] suffixes = [".h"] def test_line(self, line: str) -> bool: @@ -251,11 +290,13 @@ def test_line(self, line: str) -> bool: return not line.startswith("using std::") -class TestUsingDirectives(TestSpec): +class TestUsingDirective(TestSpec): """Detect using directives in headers.""" name = "using-directive" message = "Do not put using directives at global scope in headers." + rationale = "Code safety. Avoid namespace pollution." + references = [Reference.O2, Reference.ISO_CPP, Reference.LLVM, Reference.GOOGLE, Reference.LINTER] suffixes = [".h"] def test_line(self, line: str) -> bool: @@ -269,6 +310,8 @@ class TestStdPrefix(TestSpec): name = "std-prefix" message = "Use std:: prefix for names from the std namespace." + rationale = "Code clarity, safety and portability. Avoid ambiguity (e.g. abs)." + references = [Reference.LLVM, Reference.LINTER] suffixes = [".h", ".cxx", ".C"] prefix_bad = r"[^\w:\.\"]" patterns = [ @@ -301,18 +344,18 @@ def test_line(self, line: str) -> bool: # Ignore matches inside strings. for match in matches: n_quotes_before = line.count('"', 0, match[0]) # Count quotation marks before the match. - if n_quotes_before % 2: # If odd, we are inside a string and we should ignore this match. - continue - # We are not inside a string and this match is valid. - return False + if not n_quotes_before % 2: # If even, we are not inside a string and this match is valid. + return False return True -class TestROOT(TestSpec): +class TestRootEntity(TestSpec): """Detect unnecessary use of ROOT entities.""" - name = "root-entity" + name = "root/entity" message = "Replace ROOT entities with equivalents from standard C++ or from O2." + rationale = "Code simplicity and maintainability. O2 is not a ROOT code." + references = [Reference.ISO_CPP, Reference.LINTER, Reference.PY_ZEN] suffixes = [".h", ".cxx"] def file_matches(self, path: str) -> bool: @@ -329,11 +372,32 @@ def test_line(self, line: str) -> bool: return re.search(pattern, line) is None +class TestRootLorentzVector(TestSpec): + """Detect use of TLorentzVector.""" + + name = "root/lorentz-vector" + message = ( + "Do not use the TLorentzVector legacy class. " + "Use std::array with RecoDecay methods or the ROOT::Math::LorentzVector template instead." + ) + rationale = "Performance. Use up-to-date tools." + references = [] + suffixes = [".h", ".cxx"] + + def test_line(self, line: str) -> bool: + if is_comment_cpp(line): + return True + line = remove_comment_cpp(line) + return "TLorentzVector" not in line + + class TestPi(TestSpec): """Detect use of external pi.""" name = "external-pi" message = "Use the PI constant (and its multiples and fractions) defined in o2::constants::math." + rationale = "Code maintainability." + references = [Reference.LINTER, Reference.PY_ZEN] suffixes = [".h", ".cxx"] def file_matches(self, path: str) -> bool: @@ -352,6 +416,8 @@ class TestTwoPiAddSubtract(TestSpec): name = "two-pi-add-subtract" message = "Use RecoDecay::constrainAngle to restrict angle to a given range." + rationale = "Code maintainability and safety. Use existing tools." + references = [Reference.ISO_CPP, Reference.LINTER, Reference.PY_ZEN] suffixes = [".h", ".cxx"] def test_line(self, line: str) -> bool: @@ -371,6 +437,8 @@ class TestPiMultipleFraction(TestSpec): name = "pi-multiple-fraction" message = "Use multiples/fractions of PI defined in o2::constants::math." + rationale = "Code maintainability." + references = [Reference.LINTER, Reference.PY_ZEN] suffixes = [".h", ".cxx"] def test_line(self, line: str) -> bool: @@ -392,6 +460,8 @@ class TestPdgDatabase(TestSpec): "Do not use TDatabasePDG directly. " "Use o2::constants::physics::Mass... or Service instead." ) + rationale = "Performance." + references = [Reference.LINTER] suffixes = [".h", ".cxx"] def file_matches(self, path: str) -> bool: @@ -404,11 +474,13 @@ def test_line(self, line: str) -> bool: return "TDatabasePDG" not in line -class TestPdgCode(TestSpec): - """Detect use of hard-coded PDG codes.""" +class TestPdgExplicitCode(TestSpec): + """Detect hard-coded PDG codes.""" name = "pdg/explicit-code" - message = "Avoid using hard-coded PDG codes. Use named values from PDG_t or o2::constants::physics::Pdg instead." + message = "Avoid hard-coded PDG codes. Use named values from PDG_t or o2::constants::physics::Pdg instead." + rationale = "Code comprehensibility, readability, maintainability and safety." + references = [Reference.O2, Reference.ISO_CPP, Reference.LINTER] suffixes = [".h", ".cxx", ".C"] def test_line(self, line: str) -> bool: @@ -425,11 +497,57 @@ def test_line(self, line: str) -> bool: return True -class TestPdgMass(TestSpec): +class TestPdgExplicitMass(TestSpec): + """Detect hard-coded particle masses.""" + + name = "pdg/explicit-mass" + message = "Avoid hard-coded particle masses. Use o2::constants::physics::Mass... instead." + rationale = "Code comprehensibility, readability, maintainability and safety." + references = [Reference.O2, Reference.ISO_CPP, Reference.LINTER] + suffixes = [".h", ".cxx"] + masses: "list[str]" = [] # list of mass values to detect + + def __init__(self) -> None: + super().__init__() + + # List of masses of commonly used particles + self.masses.append(r"0\.000511") # e + self.masses.append(r"0\.105") # μ + self.masses.append(r"0\.139") # π+ + self.masses.append(r"0\.493") # K+ + self.masses.append(r"0\.497") # K0 + self.masses.append(r"0\.938") # p + self.masses.append(r"0\.939") # n + self.masses.append(r"1\.115") # Λ + self.masses.append(r"1\.864") # D0 + self.masses.append(r"2\.286") # Λc + self.masses.append(r"3\.096") # J/ψ + + def test_line(self, line: str) -> bool: + if is_comment_cpp(line): + return True + line = remove_comment_cpp(line) + iterators = re.finditer(rf"(^|\D)({'|'.join(self.masses)})", line) + matches = [(it.start(), it.group(2)) for it in iterators] + if not matches: + return True + if '"' not in line: # Found a match which cannot be inside a string. + return False + # Ignore matches inside strings. + for match in matches: + n_quotes_before = line.count('"', 0, match[0]) # Count quotation marks before the match. + if not n_quotes_before % 2: # If even, we are not inside a string and this match is valid. + return False + return True + + +class TestPdgKnownMass(TestSpec): """Detect unnecessary call of Mass() for a known PDG code.""" name = "pdg/known-mass" message = "Use o2::constants::physics::Mass... instead of calling a database method for a known PDG code." + rationale = "Performance." + references = [Reference.LINTER] suffixes = [".h", ".cxx", ".C"] def test_line(self, line: str) -> bool: @@ -439,9 +557,7 @@ def test_line(self, line: str) -> bool: pattern_pdg_code = r"[+-]?(k[A-Z][a-zA-Z0-9]*|[0-9]+)" if re.search(rf"->GetParticle\({pattern_pdg_code}\)->Mass\(\)", line): return False - if re.search(rf"->Mass\({pattern_pdg_code}\)", line): - return False - return True + return not re.search(rf"->Mass\({pattern_pdg_code}\)", line) class TestLogging(TestSpec): @@ -449,6 +565,8 @@ class TestLogging(TestSpec): name = "logging" message = "Use O2 logging (LOG, LOGF, LOGP)." + rationale = "Logs easy to read and process." + references = [Reference.LINTER] suffixes = [".h", ".cxx"] def file_matches(self, path: str) -> bool: @@ -467,6 +585,8 @@ class TestConstRefInForLoop(TestSpec): name = "const-ref-in-for-loop" message = "Use constant references for non-modified iterators in range-based for loops." + rationale = "Performance, code comprehensibility and safety." + references = [Reference.O2, Reference.ISO_CPP, Reference.LLVM] suffixes = [".h", ".cxx", ".C"] def test_line(self, line: str) -> bool: @@ -486,6 +606,8 @@ class TestConstRefInSubscription(TestSpec): name = "const-ref-in-process" message = "Use constant references for table subscriptions in process functions." + rationale = "Performance, code comprehensibility and safety." + references = [Reference.O2, Reference.ISO_CPP, Reference.LINTER] suffixes = [".cxx"] per_line = False @@ -563,6 +685,8 @@ class TestWorkflowOptions(TestSpec): "Do not use workflow options to customise workflow topology composition in defineDataProcessing. " "Use process function switches or metadata instead." ) + rationale = "Not supported on AliHyperloop." + references = [Reference.LINTER] suffixes = [".cxx"] per_line = False @@ -597,17 +721,33 @@ class TestMagicNumber(TestSpec): name = "magic-number" message = "Avoid magic numbers in expressions. Assign the value to a clearly named variable or constant." + rationale = "Code comprehensibility, maintainability and safety." + references = [Reference.O2, Reference.ISO_CPP] suffixes = [".h", ".cxx", ".C"] + pattern_compare = r"([<>]=?|[!=]=)" + pattern_number = r"[\+-]?([\d\.]+)f?" def test_line(self, line: str) -> bool: if is_comment_cpp(line): return True line = remove_comment_cpp(line) - if not (match := re.search(r" ([<>]=?|[!=]=) [\+-]?([\d\.]+)", line)): + iterators = re.finditer( + rf" {self.pattern_compare} {self.pattern_number}|\W{self.pattern_number} {self.pattern_compare} ", line + ) + matches = [(it.start(), it.group(2), it.group(3)) for it in iterators] + if not matches: return True - number = match.group(2) - # Accept only 0 or 1 (int or float). - return re.match(r"[01](\.0?)?$", number) is not None + # Ignore matches inside strings. + for match in matches: + n_quotes_before = line.count('"', 0, match[0]) # Count quotation marks before the match. + if n_quotes_before % 2: # If odd, we are inside a string and we should ignore this match. + continue + # We are not inside a string and this match is valid. + for match_n in (match[1], match[2]): + # Accept only 0 or 1 (int or float). + if (match_n is not None) and (re.match(r"[01](\.0?)?$", match_n) is None): + return False + return True # Documentation @@ -619,6 +759,8 @@ class TestDocumentationFile(TestSpec): name = "doc/file" message = "Provide mandatory file documentation." + rationale = "Code comprehensibility. Collaboration." + references = [Reference.O2, Reference.LINTER] suffixes = [".h", ".cxx", ".C"] per_line = False @@ -662,6 +804,9 @@ def test_file(self, path: str, content) -> bool: # Naming conventions # Reference: https://rawgit.com/AliceO2Group/CodingGuidelines/master/naming_formatting.html +rationale_names = "Code readability, comprehensibility and searchability." +references_names = [Reference.O2, Reference.LINTER] + class TestNameFunctionVariable(TestSpec): """Test names of functions and of most variables. @@ -674,6 +819,8 @@ class TestNameFunctionVariable(TestSpec): name = "name/function-variable" message = "Use lowerCamelCase for names of functions and variables." + rationale = rationale_names + references = references_names suffixes = [".h", ".cxx", ".C"] def test_line(self, line: str) -> bool: @@ -765,6 +912,8 @@ class TestNameMacro(TestSpec): name = "name/macro" message = "Use SCREAMING_SNAKE_CASE for names of macros. Leading and double underscores are not allowed." + rationale = rationale_names + references = references_names suffixes = [".h", ".cxx", ".C"] def test_line(self, line: str) -> bool: @@ -791,6 +940,8 @@ class TestNameConstant(TestSpec): message = ( 'Use UpperCamelCase for names of constexpr constants. Names of special constants may be prefixed with "k".' ) + rationale = rationale_names + references = references_names suffixes = [".h", ".cxx", ".C"] def test_line(self, line: str) -> bool: @@ -827,6 +978,8 @@ class TestNameColumn(TestSpec): name = "name/o2-column" message = "Use UpperCamelCase for names of O2 columns and matching lowerCamelCase names for their getters." + rationale = rationale_names + references = references_names suffixes = [".h", ".cxx"] def test_line(self, line: str) -> bool: @@ -863,6 +1016,8 @@ class TestNameTable(TestSpec): name = "name/o2-table" message = "Use UpperCamelCase for names of O2 tables." + rationale = rationale_names + references = references_names suffixes = [".h", ".cxx"] def test_line(self, line: str) -> bool: @@ -897,6 +1052,8 @@ class TestNameNamespace(TestSpec): name = "name/namespace" message = "Use snake_case for names of namespaces. Double underscores are not allowed." + rationale = rationale_names + references = references_names suffixes = [".h", ".cxx", ".C"] def test_line(self, line: str) -> bool: @@ -919,6 +1076,8 @@ class TestNameType(TestSpec): name = "name/type" message = "Use UpperCamelCase for names of defined types (including concepts)." + rationale = rationale_names + references = references_names suffixes = [".h", ".cxx", ".C"] def test_line(self, line: str) -> bool: @@ -938,6 +1097,8 @@ class TestNameUpperCamelCase(TestSpec): keyword = "key" name = f"name/{keyword}" message = f"Use UpperCamelCase for names of {keyword}." + rationale = rationale_names + references = references_names suffixes = [".h", ".cxx", ".C"] def test_line(self, line: str) -> bool: @@ -985,6 +1146,8 @@ class TestNameFileCpp(TestSpec): name = "name/file-cpp" message = "Use lowerCamelCase or UpperCamelCase for names of C++ files. See the O2 naming conventions for details." + rationale = rationale_names + references = references_names suffixes = [".h", ".cxx", ".C"] per_line = False @@ -1007,6 +1170,8 @@ class TestNameFilePython(TestSpec): name = "name/file-python" message = "Use snake_case for names of Python files." + rationale = rationale_names + references = [Reference.LINTER, Reference.PY_PEP8] suffixes = [".py", ".ipynb"] per_line = False @@ -1020,6 +1185,8 @@ class TestNameWorkflow(TestSpec): name = "name/o2-workflow" message = "Use kebab-case for names of workflows and match the name of the workflow file." + rationale = f"{rationale_names} Correspondence workflow ↔ file." + references = references_names suffixes = ["CMakeLists.txt"] per_line = False @@ -1066,6 +1233,8 @@ class TestNameTask(TestSpec): name = "name/o2-task" message = "Specify task name only when it cannot be derived from the struct name. Only append to the default name." + rationale = f"{rationale_names} Correspondence struct ↔ device." + references = [Reference.LINTER] suffixes = [".cxx"] per_line = False @@ -1214,6 +1383,8 @@ class TestNameFileWorkflow(TestSpec): "Name of a workflow file must match the name of the main struct in it (without the PWG prefix). " '(Class implementation files should be in "Core" directories.)' ) + rationale = f"{rationale_names} Correspondence file ↔ struct." + references = [Reference.LINTER] suffixes = [".cxx"] per_line = False @@ -1221,7 +1392,7 @@ def file_matches(self, path: str) -> bool: return super().file_matches(path) and "/Core/" not in path def test_file(self, path: str, content) -> bool: - file_name = os.path.basename(path).rstrip(".cxx") + file_name = os.path.basename(path)[:-4] # file name without suffix base_struct_name = f"{file_name[0].upper()}{file_name[1:]}" # expected base of struct names if match := re.search("PWG([A-Z]{2})/", path): name_pwg = match.group(1) @@ -1244,10 +1415,7 @@ def test_file(self, path: str, content) -> bool: struct_name = words[1] struct_names.append(struct_name) # print(f"Found structs: {struct_names}.") - for struct_name in struct_names: - if re.match(base_struct_name, struct_name): - return True - return False + return any(re.match(base_struct_name, struct_name) for struct_name in struct_names) class TestNameConfigurable(TestSpec): @@ -1258,6 +1426,8 @@ class TestNameConfigurable(TestSpec): "Use lowerCamelCase for names of configurables and use the same name " "for the struct member as for the JSON string. (Declare the type and names on the same line.)" ) + rationale = f"{rationale_names} Correspondence C++ code ↔ JSON." + references = [Reference.O2, Reference.LINTER] suffixes = [".h", ".cxx"] def file_matches(self, path: str) -> bool: @@ -1292,12 +1462,16 @@ def test_line(self, line: str) -> bool: # PWG-HF +references_hf = [Reference.LINTER, Reference.PWG_HF] + class TestHfNameStructClass(TestSpec): """PWGHF: Test names of structs and classes.""" name = "pwghf/name/struct-class" message = 'Names of PWGHF structs and classes must start with "Hf".' + rationale = f"{rationale_names} Correspondence device ↔ workflow." + references = references_hf suffixes = [".h", ".cxx"] def file_matches(self, path: str) -> bool: @@ -1323,6 +1497,8 @@ class TestHfNameFileTask(TestSpec): name = "pwghf/name/task-file" message = 'Name of a PWGHF task workflow file must start with "task".' + rationale = rationale_names + references = references_hf suffixes = [".cxx"] per_line = False @@ -1331,9 +1507,7 @@ def file_matches(self, path: str) -> bool: def test_file(self, path: str, content) -> bool: file_name = os.path.basename(path) - if "/Tasks/" in path and not file_name.startswith("task"): - return False - return True + return not ("/Tasks/" in path and not file_name.startswith("task")) class TestHfStructMembers(TestSpec): @@ -1342,6 +1516,8 @@ class TestHfStructMembers(TestSpec): name = "pwghf/struct-member-order" message = "Declare struct members in the conventional order. See the PWGHF coding guidelines." + rationale = rationale_names + references = references_hf suffixes = [".cxx"] per_line = False member_order = [ @@ -1430,7 +1606,7 @@ def main(): ) args = parser.parse_args() if args.github: - global github_mode # pylint: disable=global-statement + global github_mode # pylint: disable=global-statement # noqa: PLW0603 github_mode = True tests = [] # list of activated tests @@ -1438,17 +1614,19 @@ def main(): # Bad practice enable_bad_practice = True if enable_bad_practice: - tests.append(TestIOStream()) + tests.append(TestIoStream()) tests.append(TestUsingStd()) - tests.append(TestUsingDirectives()) + tests.append(TestUsingDirective()) tests.append(TestStdPrefix()) - tests.append(TestROOT()) + tests.append(TestRootEntity()) + tests.append(TestRootLorentzVector()) tests.append(TestPi()) tests.append(TestTwoPiAddSubtract()) tests.append(TestPiMultipleFraction()) tests.append(TestPdgDatabase()) - tests.append(TestPdgCode()) - tests.append(TestPdgMass()) + tests.append(TestPdgExplicitCode()) + tests.append(TestPdgExplicitMass()) + tests.append(TestPdgKnownMass()) tests.append(TestLogging()) tests.append(TestConstRefInForLoop()) tests.append(TestConstRefInSubscription()) @@ -1490,7 +1668,7 @@ def main(): test_names = [t.name for t in tests] # short names of activated tests suffixes = tuple({s for test in tests for s in test.suffixes}) # all suffixes from all enabled tests passed = True # global result of all tests - n_files_bad = {name: 0 for name in test_names} # counter of files with issues + n_files_bad = dict.fromkeys(test_names, 0) # counter of files with issues # Report overview before running. print(f"Testing {len(args.paths)} files.") @@ -1507,7 +1685,7 @@ def main(): # print(f"Skipping path \"{path}\".") continue try: - with open(path, "r", encoding="utf-8") as file: + with open(path, encoding="utf-8") as file: content = file.readlines() for test in tests: result = test.run(path, content) @@ -1515,19 +1693,30 @@ def main(): n_files_bad[test.name] += 1 passed = False # print(f"File \"{path}\" {'passed' if result else 'failed'} the test {test.name}.") - except IOError: + except OSError: print(f'Failed to open file "{path}".') sys.exit(1) - # Report results per test. - print("\nResults per test") - len_max = max(len(name) for name in test_names) - print(f"test{' ' * (len_max - len('test'))}\tissues\tdisabled\tbad files") - for test in tests: - print( - f"{test.name}{' ' * (len_max - len(test.name))}\t{test.n_issues}\t{test.n_disabled}" - f"\t\t{n_files_bad[test.name]}" - ) + # Report results for tests that failed or were disabled. + if not passed or any(n > 0 for n in (test.n_disabled for test in tests)): + print("\nResults for failed and disabled tests") + len_max = max(len(name) for name in test_names) + print(f"test{' ' * (len_max - len('test'))}\tissues\tdisabled\tbad files\trationale") + ref_names = [] + for test in tests: + if any(n > 0 for n in (test.n_issues, test.n_disabled, n_files_bad[test.name])): + ref_ids = [ref.value for ref in test.references] + ref_names += test.references + print( + f"{test.name}{' ' * (len_max - len(test.name))}\t{test.n_issues}\t{test.n_disabled}" + f"\t\t{n_files_bad[test.name]}\t\t{test.rationale} {ref_ids}" + ) + # Print list of references for listed tests. + print("\nReferences") + ref_names = list(dict.fromkeys(ref_names)) + for ref_name, data in references.items(): + if ref_name in ref_names: + print(f"[{ref_name.value}]\t{data['title']}. <{data['url']}>.") # Report global result. title_result = "O2 linter result" @@ -1536,7 +1725,7 @@ def main(): if github_mode: print(f"::notice title={title_result}::{msg_result}") else: - print(f"{title_result}: {msg_result}") + print(f"\n{title_result}: {msg_result}") else: msg_result = "Issues have been found." msg_disable = ( From f18666f1a56d663bbaf3cd79b9092b5fea7a6a92 Mon Sep 17 00:00:00 2001 From: Zuzanna Chochulska <87480906+zchochul@users.noreply.github.com> Date: Wed, 16 Apr 2025 00:07:20 +0200 Subject: [PATCH 1003/1650] [PWGCF] FemtoUniverse -- Add D+ to MC Truth (#10866) Co-authored-by: Zuzanna <01150674@pw.edu.pl> --- .../TableProducer/femtoUniverseProducerMCTruthTask.cxx | 6 ++++-- .../TableProducer/femtoUniverseProducerTask.cxx | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerMCTruthTask.cxx b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerMCTruthTask.cxx index 5eb3cab7395..1b8ba74d889 100644 --- a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerMCTruthTask.cxx +++ b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerMCTruthTask.cxx @@ -168,9 +168,11 @@ struct femtoUniverseProducerMCTruthTask { bool pass = false; std::vector tmpPDGCodes = ConfPDGCodes; // necessary due to some features of the Configurable for (uint32_t pdg : tmpPDGCodes) { - if (pdgCode == 333) { + if (pdgCode == 333) { // phi meson pass = true; - } else if (pdgCode == 421) { + } else if (pdgCode == 421) { // D0 meson + pass = true; + } else if (pdgCode == 411) { // D+ meson pass = true; } else if (static_cast(pdg) == static_cast(pdgCode)) { if (particle.isPhysicalPrimary()) diff --git a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx index ce06e110b2c..f80b8090971 100644 --- a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx +++ b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx @@ -1565,7 +1565,8 @@ struct FemtoUniverseProducerTask { } else { if (!(isKaonNSigma(p1.pt(), trackCuts.getNsigmaTPC(p1, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(p1, o2::track::PID::Kaon)))) { continue; - } else if (!(isKaonNSigma(p2.pt(), trackCuts.getNsigmaTPC(p2, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(p2, o2::track::PID::Kaon)))) { + } + if (!(isKaonNSigma(p2.pt(), trackCuts.getNsigmaTPC(p2, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(p2, o2::track::PID::Kaon)))) { continue; } } From 7c59732bf804d2352716d0884c8b6ac7bcc2e6d8 Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Wed, 16 Apr 2025 00:51:33 +0200 Subject: [PATCH 1004/1650] [PWGCF] jFlucEfficiencyTask - Add track selection systematics (#10865) Co-authored-by: ALICE Action Bot --- PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx | 163 +++++++++++++++----- 1 file changed, 122 insertions(+), 41 deletions(-) diff --git a/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx b/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx index c2afc558b5a..59ca8b18903 100644 --- a/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx +++ b/PWGCF/JCorran/Tasks/jFlucEfficiencyTask.cxx @@ -15,6 +15,7 @@ /// \since March 2024 #include +#include #include "Framework/AnalysisTask.h" #include "Framework/HistogramRegistry.h" #include "Framework/runDataProcessing.h" @@ -31,6 +32,7 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; +using namespace o2::aod::rctsel; struct JFlucEfficiencyTask { Service pdg; @@ -55,6 +57,8 @@ struct JFlucEfficiencyTask { o2::analysis::CollisonCuts colCuts; struct : ConfigurableGroup { Configurable cfgEvtZvtx{"cfgEvtZvtx", 10.f, "Evt sel: Max. z-Vertex (cm)"}; + Configurable cfgCentMin{"cfgCentMin", 0.0f, "Min centrality"}; + Configurable cfgCentMax{"cfgCentMax", 100.0f, "Max centrality"}; Configurable cfgEvtOccupancyInTimeRangeMax{"cfgEvtOccupancyInTimeRangeMax", -1, "Evt sel: maximum track occupancy"}; Configurable cfgEvtOccupancyInTimeRangeMin{"cfgEvtOccupancyInTimeRangeMin", -1, "Evt sel: minimum track occupancy"}; Configurable cfgEvtTriggerCheck{"cfgEvtTriggerCheck", false, "Evt sel: check for trigger"}; @@ -68,44 +72,61 @@ struct JFlucEfficiencyTask { Configurable cfgEvtCollInTimeRangeStandard{"cfgEvtCollInTimeRangeStandard", true, "Evt sel: apply NoCollInTimeRangeStandard"}; Configurable cfgEvtRun2AliEventCuts{"cfgEvtRun2AliEventCuts", true, "Evt sel: apply Run2 Ali event cuts"}; Configurable cfgEvtRun2INELgtZERO{"cfgEvtRun2INELgtZERO", false, "Evt sel: apply Run2 INEL>0 event cuts"}; + Configurable cfgEvtUseRCTFlagChecker{"cfgEvtUseRCTFlagChecker", false, "Evt sel: use RCT flag checker"}; + Configurable cfgEvtRCTFlagCheckerLabel{"cfgEvtRCTFlagCheckerLabel", "CBT_hadronPID", "Evt sel: RCT flag checker label"}; + Configurable cfgEvtRCTFlagCheckerZDCCheck{"cfgEvtRCTFlagCheckerZDCCheck", false, "Evt sel: RCT flag checker ZDC check"}; + Configurable cfgEvtRCTFlagCheckerLimitAcceptAsBad{"cfgEvtRCTFlagCheckerLimitAcceptAsBad", false, "Evt sel: RCT flag checker treat Limited Acceptance As Bad"}; } EventCuts; + RCTFlagsChecker rctChecker; + + // Track selections + struct : ConfigurableGroup { + Configurable cfgMinPt{"cfgMinPt", 0.6, "Track minium pt cut"}; + Configurable cfgMaxPt{"cfgMaxPt", 300.0f, "Maximum transverse momentum"}; + Configurable cfgEtaMin{"cfgEtaMin", -1.0f, "Minimum pseudorapidity"}; + Configurable cfgEtaMax{"cfgEtaMax", 1.0f, "Maximum pseudorapidity"}; + Configurable cfgPrimaryTrack{"cfgPrimaryTrack", false, "Primary track selection"}; // kGoldenChi2 | kDCAxy | kDCAz + Configurable cfgGlobalWoDCATrack{"cfgGlobalWoDCATrack", false, "Global track selection without DCA"}; // kQualityTracks (kTrackType | kTPCNCls | kTPCCrossedRows | kTPCCrossedRowsOverNCls | kTPCChi2NDF | kTPCRefit | kITSNCls | kITSChi2NDF | kITSRefit | kITSHits) | kInAcceptanceTracks (kPtRange | kEtaRange) + Configurable cfgGlobalTrack{"cfgGlobalTrack", true, "Global track selection"}; // kGoldenChi2 | kDCAxy | kDCAz + Configurable cfgPVContributor{"cfgPVContributor", false, "PV contributor track selection"}; // PV Contriuibutor + Configurable cfgpTdepDCAxyCut{"cfgpTdepDCAxyCut", false, "pT-dependent DCAxy cut"}; + Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; + Configurable cfgTPCcluster{"cfgTPCcluster", 0, "Number of TPC cluster"}; + Configurable cfgRatioTPCRowsOverFindableCls{"cfgRatioTPCRowsOverFindableCls", 0.0f, "TPC Crossed Rows to Findable Clusters"}; + Configurable cfgITSChi2NCl{"cfgITSChi2NCl", 999.0, "ITS Chi2/NCl"}; + Configurable cfgTPCChi2NCl{"cfgTPCChi2NCl", 999.0, "TPC Chi2/NCl"}; + Configurable cfgUseTPCRefit{"cfgUseTPCRefit", false, "Require TPC Refit"}; + Configurable cfgUseITSRefit{"cfgUseITSRefit", false, "Require ITS Refit"}; + Configurable cfgHasITS{"cfgHasITS", false, "Require ITS"}; + Configurable cfgHasTPC{"cfgHasTPC", false, "Require TPC"}; + Configurable cfgHasTOF{"cfgHasTOF", false, "Require TOF"}; + // DCA to PV + Configurable cfgMaxbDCArToPVcut{"cfgMaxbDCArToPVcut", 0.5, "Track DCAr cut to PV Maximum"}; + Configurable cfgMaxbDCAzToPVcut{"cfgMaxbDCAzToPVcut", 1.0, "Track DCAz cut to PV Maximum"}; + } TrackCuts; // Configurable for track selection - Configurable cfgPtMin{"cfgPtMin", 0.2f, "Minimum transverse momentum"}; - Configurable cfgPtMax{"cfgPtMax", 300.0f, "Maximum transverse momentum"}; - Configurable cfgEtaMin{"cfgEtaMin", -1.0f, "Minimum pseudorapidity"}; - Configurable cfgEtaMax{"cfgEtaMax", 1.0f, "Maximum pseudorapidity"}; - Configurable cfgCutVertex{"cfgCutVertex", 10.0f, "Vertex cut"}; - Configurable cfgCentMin{"cfgCentMin", 0.0f, "Min centrality"}; - Configurable cfgCentMax{"cfgCentMax", 100.0f, "Max centrality"}; - Configurable cfgTrackBitMask{"cfgTrackBitMask", 0, "BitMask for track selection systematics"}; Configurable trackSelection{"trackSelection", 0, "Track selection: 0 -> No Cut, 1 -> kGlobalTrack, 2 -> kGlobalTrackWoPtEta, 3 -> kGlobalTrackWoDCA, 4 -> kQualityTracks, 5 -> kInAcceptanceTracks"}; // Configurable axes ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100}, "multiplicity / centrality axis"}; // Filter declarations - Filter cfCollisionFilter = (nabs(aod::collision::posZ) < cfgCutVertex); - Filter cfTrackFilter = (aod::cftrack::pt >= cfgPtMin) && - (aod::cftrack::pt <= cfgPtMax) && - (aod::cftrack::eta >= cfgEtaMin) && - (aod::cftrack::eta <= cfgEtaMax); - // Filter collisionFilter = (nabs(aod::collision::posZ) < cfgCutVertex); - // Filter trackFilter = (aod::track::pt >= cfgPtMin) && - // (aod::track::pt <= cfgPtMax) && - // (aod::track::eta >= cfgEtaMin) && - // (aod::track::eta <= cfgEtaMax); - Filter trackSelectionFilter = (trackSelection.node() == 0) || // from tpcSkimsTableCreator - ((trackSelection.node() == 1) && requireGlobalTrackInFilter()) || - ((trackSelection.node() == 2) && requirePrimaryTracksInFilter()) || - ((trackSelection.node() == 3) && requireGlobalTrackWoDCAInFilter()) || - ((trackSelection.node() == 4) && requireQualityTracksInFilter()) || - ((trackSelection.node() == 5) && requireTrackCutInFilter(TrackSelectionFlags::kInAcceptanceTracks)); + Filter cfCollisionFilter = (nabs(aod::collision::posZ) < EventCuts.cfgEvtZvtx); + Filter cfTrackFilter = (aod::cftrack::pt >= TrackCuts.cfgMinPt) && + (aod::cftrack::pt <= TrackCuts.cfgMaxPt) && + (aod::cftrack::eta >= TrackCuts.cfgEtaMin) && + (aod::cftrack::eta <= TrackCuts.cfgEtaMax); + // Filter collisionFilter = (nabs(aod::collision::posZ) < EventCuts.cfgEvtZvtx); + Filter trackFilter = (aod::track::pt >= TrackCuts.cfgMinPt) && + (aod::track::pt <= TrackCuts.cfgMaxPt) && + (aod::track::eta >= TrackCuts.cfgEtaMin) && + (aod::track::eta <= TrackCuts.cfgEtaMax); Configurable cfgCentBinsForMC{"cfgCentBinsForMC", 1, "Centrality bins for MC, 0: off, 1: on"}; using CollisionCandidates = soa::Join; using CollisionRun2Candidates = soa::Join; - using TrackCandidates = soa::Join; + using TrackCandidates = soa::Join; using MCCollisionCandidates = soa::Join; using MCRun2CollisionCandidates = soa::Join; using MCTrackCandidates = soa::Join; @@ -145,6 +166,8 @@ struct JFlucEfficiencyTask { colCuts.setApplyRun2INELgtZERO(EventCuts.cfgEvtRun2INELgtZERO); colCuts.printCuts(); + rctChecker.init(EventCuts.cfgEvtRCTFlagCheckerLabel, EventCuts.cfgEvtRCTFlagCheckerZDCCheck, EventCuts.cfgEvtRCTFlagCheckerLimitAcceptAsBad); + if (doprocessDerivedMC || doprocessMC || doprocessMCRun2) { registry.add("hPtGen", "Generated p_{T} (all);p_{T} (GeV/c);Centrality (%);Counts", o2::framework::HistType::kTH2F, {AxisSpec(axisPt), AxisSpec(axisMultiplicity)}); @@ -218,6 +241,59 @@ struct JFlucEfficiencyTask { } return std::abs(charge) >= 3.; } + // Track selection + template + bool trackCut(TrackType const& track) + { + // basic track cuts + if (std::abs(track.pt()) < TrackCuts.cfgMinPt) + return false; + if (std::abs(track.pt()) > TrackCuts.cfgMaxPt) + return false; + if (track.eta() < TrackCuts.cfgEtaMin) + return false; + if (track.eta() > TrackCuts.cfgEtaMax) + return false; + if (track.itsNCls() < TrackCuts.cfgITScluster) + return false; + if (track.tpcNClsFound() < TrackCuts.cfgTPCcluster) + return false; + if (track.tpcCrossedRowsOverFindableCls() < TrackCuts.cfgRatioTPCRowsOverFindableCls) + return false; + if (track.itsChi2NCl() >= TrackCuts.cfgITSChi2NCl) + return false; + if (track.tpcChi2NCl() >= TrackCuts.cfgTPCChi2NCl) + return false; + if (TrackCuts.cfgHasITS && !track.hasITS()) + return false; + if (TrackCuts.cfgHasTPC && !track.hasTPC()) + return false; + if (TrackCuts.cfgHasTOF && !track.hasTOF()) + return false; + if (TrackCuts.cfgUseITSRefit && !track.passedITSRefit()) + return false; + if (TrackCuts.cfgUseTPCRefit && !track.passedTPCRefit()) + return false; + if (TrackCuts.cfgPVContributor && !track.isPVContributor()) + return false; + if (TrackCuts.cfgGlobalWoDCATrack && !track.isGlobalTrackWoDCA()) + return false; + if (TrackCuts.cfgGlobalTrack && !track.isGlobalTrack()) + return false; + if (TrackCuts.cfgPrimaryTrack && !track.isPrimaryTrack()) + return false; + if (TrackCuts.cfgpTdepDCAxyCut) { + // Tuned on the LHC22f anchored MC LHC23d1d on primary pions. 7 Sigmas of the resolution + if (std::abs(track.dcaXY()) > (0.004 + (0.013 / track.pt()))) + return false; + } else { + if (std::abs(track.dcaXY()) > TrackCuts.cfgMaxbDCArToPVcut) + return false; + } + if (std::abs(track.dcaZ()) > TrackCuts.cfgMaxbDCAzToPVcut) + return false; + return true; + } void processDerivedMC(soa::Filtered::iterator const& mcCollision, soa::Filtered const& mcParticles) { @@ -245,7 +321,7 @@ struct JFlucEfficiencyTask { { float centrality = cfCollision.multiplicity(); - if (centrality < cfgCentMin || centrality > cfgCentMax) { + if (centrality < EventCuts.cfgCentMin || centrality > EventCuts.cfgCentMax) { return; } registry.fill(HIST("hZVertexReco"), cfCollision.posZ(), centrality); @@ -269,7 +345,7 @@ struct JFlucEfficiencyTask { aod::McParticles const& mcParticles) { registry.fill(HIST("hEventCounterMC"), 0); - if (!(std::abs(mcCollision.posZ()) < cfgCutVertex)) { + if (!(std::abs(mcCollision.posZ()) < EventCuts.cfgEvtZvtx)) { return; } if (collisions.size() < 1) { @@ -282,12 +358,15 @@ struct JFlucEfficiencyTask { for (const auto& collision : collisions) { // Anayway only 1 collision per mcCollision will be selected if (!colCuts.isSelected(collision)) // Default event selection return; + if (EventCuts.cfgEvtUseRCTFlagChecker && !rctChecker(collision)) { + return; + } colCuts.fillQA(collision); centrality = collision.centFT0C(); } registry.fill(HIST("hEventCounterMC"), 1); registry.fill(HIST("hZVertexMC"), mcCollision.posZ(), centrality); - if (centrality < cfgCentMin || centrality > cfgCentMax) { + if (centrality < EventCuts.cfgCentMin || centrality > EventCuts.cfgCentMax) { return; } for (const auto& particle : mcParticles) { @@ -296,7 +375,7 @@ struct JFlucEfficiencyTask { continue; } // pT and eta selections - if (particle.pt() < cfgPtMin || particle.pt() > cfgPtMax || particle.eta() < cfgEtaMin || particle.eta() > cfgEtaMax) { + if (particle.pt() < TrackCuts.cfgMinPt || particle.pt() > TrackCuts.cfgMaxPt || particle.eta() < TrackCuts.cfgEtaMin || particle.eta() > TrackCuts.cfgEtaMax) { continue; } registry.fill(HIST("hPtGen"), particle.pt(), centrality); @@ -316,12 +395,11 @@ struct JFlucEfficiencyTask { if (!track.has_mcParticle()) { continue; } - auto mcPart = track.mcParticle(); - if (!mcPart.isPhysicalPrimary() || !isChargedParticle(mcPart.pdgCode())) { + if (!trackCut(track)) { continue; } - // pT and eta selections - if (track.pt() < cfgPtMin || track.pt() > cfgPtMax || track.eta() < cfgEtaMin || track.eta() > cfgEtaMax) { + auto mcPart = track.mcParticle(); + if (!mcPart.isPhysicalPrimary() || !isChargedParticle(mcPart.pdgCode())) { continue; } registry.fill(HIST("hPtRec"), track.pt(), centrality); @@ -342,7 +420,7 @@ struct JFlucEfficiencyTask { BCsWithRun2Info const&) { registry.fill(HIST("hEventCounterMC"), 0); - if (!(std::abs(mcCollision.posZ()) < cfgCutVertex)) { + if (!(std::abs(mcCollision.posZ()) < EventCuts.cfgEvtZvtx)) { return; } if (collisions.size() < 1) { @@ -360,7 +438,7 @@ struct JFlucEfficiencyTask { } registry.fill(HIST("hEventCounterMC"), 1); registry.fill(HIST("hZVertexMC"), mcCollision.posZ(), centrality); - if (centrality < cfgCentMin || centrality > cfgCentMax) { + if (centrality < EventCuts.cfgCentMin || centrality > EventCuts.cfgCentMax) { return; } for (const auto& particle : mcParticles) { @@ -369,7 +447,7 @@ struct JFlucEfficiencyTask { continue; } // pT and eta selections - if (particle.pt() < cfgPtMin || particle.pt() > cfgPtMax || particle.eta() < cfgEtaMin || particle.eta() > cfgEtaMax) { + if (particle.pt() < TrackCuts.cfgMinPt || particle.pt() > TrackCuts.cfgMaxPt || particle.eta() < TrackCuts.cfgEtaMin || particle.eta() > TrackCuts.cfgEtaMax) { continue; } registry.fill(HIST("hPtGen"), particle.pt(), centrality); @@ -394,7 +472,7 @@ struct JFlucEfficiencyTask { continue; } // pT and eta selections - if (track.pt() < cfgPtMin || track.pt() > cfgPtMax || track.eta() < cfgEtaMin || track.eta() > cfgEtaMax) { + if (!trackCut(track)) { continue; } registry.fill(HIST("hPtRec"), track.pt(), centrality); @@ -412,15 +490,18 @@ struct JFlucEfficiencyTask { { if (!colCuts.isSelected(collision)) // Default event selection return; + if (EventCuts.cfgEvtUseRCTFlagChecker && !rctChecker(collision)) { + return; + } colCuts.fillQA(collision); auto centrality = collision.centFT0C(); - if (centrality < cfgCentMin || centrality > cfgCentMax) { + if (centrality < EventCuts.cfgCentMin || centrality > EventCuts.cfgCentMax) { return; } registry.fill(HIST("hZVertexReco"), collision.posZ(), centrality); for (const auto& track : tracks) { // pT and eta selections - if (track.pt() < cfgPtMin || track.pt() > cfgPtMax || track.eta() < cfgEtaMin || track.eta() > cfgEtaMax) { + if (!trackCut(track)) { continue; } registry.fill(HIST("hPtRec"), track.pt(), centrality); @@ -439,13 +520,13 @@ struct JFlucEfficiencyTask { return; colCuts.fillQARun2(collision); auto centrality = collision.centRun2V0M(); - if (centrality < cfgCentMin || centrality > cfgCentMax) { + if (centrality < EventCuts.cfgCentMin || centrality > EventCuts.cfgCentMax) { return; } registry.fill(HIST("hZVertexReco"), collision.posZ(), centrality); for (const auto& track : tracks) { // pT and eta selections - if (track.pt() < cfgPtMin || track.pt() > cfgPtMax || track.eta() < cfgEtaMin || track.eta() > cfgEtaMax) { + if (!trackCut(track)) { continue; } registry.fill(HIST("hPtRec"), track.pt(), centrality); From a986542cc0d033b58df8d5ebafdc56eecb622837 Mon Sep 17 00:00:00 2001 From: mj525 <99000728+mjkim525@users.noreply.github.com> Date: Wed, 16 Apr 2025 16:16:36 +0900 Subject: [PATCH 1005/1650] [PWGLF] Updates for Xi(1530)0 Analysis code for PbPb (#10730) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Resonances/xi1530Analysisqa.cxx | 675 ++++++++++++-------- 1 file changed, 411 insertions(+), 264 deletions(-) mode change 100644 => 100755 PWGLF/Tasks/Resonances/xi1530Analysisqa.cxx diff --git a/PWGLF/Tasks/Resonances/xi1530Analysisqa.cxx b/PWGLF/Tasks/Resonances/xi1530Analysisqa.cxx old mode 100644 new mode 100755 index c4d69a8b3e5..2361457f620 --- a/PWGLF/Tasks/Resonances/xi1530Analysisqa.cxx +++ b/PWGLF/Tasks/Resonances/xi1530Analysisqa.cxx @@ -34,7 +34,7 @@ using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::soa; using namespace o2::constants::physics; -Service pdgDB; +// Service pdgDB; enum { kData = 0, @@ -45,42 +45,33 @@ enum { kMCTruePS, kINEL10, kINELg010, - kAllType + kAllType, + kXiStar = 3324 }; -enum { - PionPID = 211, - XiPID = 3312, - XiStarPID = 3324 -}; - -struct xi1530analysisqa { +struct Xi1530Analysisqa { // Basic set-up // - Configurable cMassXiminus{"cMassXiminus", 1.32171, "Mass of Xi baryon"}; SliceCache cache; - Preslice perRCol = aod::resodaughter::resoCollisionId; - Preslice perCollision = aod::track::collisionId; + // Preslice perRCol = aod::resodaughter::resoCollisionId; + // Preslice perCollision = aod::track::collisionId; HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; using ResoMCCols = soa::Join; + Configurable cMassXiminus{"cMassXiminus", 1.32171, "Mass of Xi baryon"}; - // associated with histograms + // Associated with histograms ConfigurableAxis binsPt{"binsPt", {VARIABLE_WIDTH, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5.0, 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 6.0, 6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 6.7, 6.8, 6.9, 7.0, 7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 7.7, 7.8, 7.9, 8.0, 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9, 9.0, 9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7, 9.8, 9.9, 10.0, 10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8, 10.9, 11.0, 11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7, 11.8, 11.9, 12.0, 12.1, 12.2, 12.3, 12.4, 12.5, 12.6, 12.7, 12.8, 12.9, 13.0, 13.1, 13.2, 13.3, 13.4, 13.5, 13.6, 13.7, 13.8, 13.9, 14.0, 14.1, 14.2, 14.3, 14.4, 14.5, 14.6, 14.7, 14.8, 14.9, 15.0}, "Binning of the pT axis"}; ConfigurableAxis binsPtQA{"binsPtQA", {VARIABLE_WIDTH, 0.0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8, 5.0, 5.2, 5.4, 5.6, 5.8, 6.0, 6.2, 6.4, 6.6, 6.8, 7.0, 7.2, 7.4, 7.6, 7.8, 8.0, 8.2, 8.4, 8.6, 8.8, 9.0, 9.2, 9.4, 9.6, 9.8, 10.0}, "Binning of the pT axis"}; ConfigurableAxis binsCent{"binsCent", {VARIABLE_WIDTH, 0.0, 1.0, 5.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0, 110.0}, "Binning of the centrality axis"}; Configurable cInvMassStart{"cInvMassStart", 1.4, "Invariant mass start"}; - Configurable cInvMassEnd{"cInvMassEnd", 1.8, "Invariant mass end"}; - Configurable cInvMassBins{"cInvMassBins", 200, "Invariant mass binning"}; - - Configurable cPIDBins{"cPIDBins", 130, "PID binning"}; - Configurable cPIDQALimit{"cPIDQALimit", 6.5, "PID QA limit"}; - Configurable cDCABins{"cDCABins", 150, "DCA binning"}; + Configurable cInvMassEnd{"cInvMassEnd", 3.0, "Invariant mass end"}; + Configurable cInvMassBins{"cInvMassBins", 800, "Invariant mass binning"}; - Configurable invmass1D{"invmass1D", true, "Invariant mass 1D"}; - Configurable study_antiparticle{"study_antiparticle", true, "Study anti-particles separately"}; - Configurable PIDplots{"PIDplots", true, "Make TPC and TOF PID plots"}; + Configurable invMass1D{"invMass1D", true, "Invariant mass 1D"}; + Configurable studyAntiparticle{"studyAntiparticle", true, "Study anti-particles separately"}; + Configurable pidPlots{"pidPlots", true, "Make TPC and TOF PID plots"}; Configurable additionalQAplots{"additionalQAplots", true, "Additional QA plots"}; Configurable additionalQAeventPlots{"additionalQAeventPlots", true, "Additional QA event plots"}; @@ -88,61 +79,79 @@ struct xi1530analysisqa { // Event Mixing Configurable nEvtMixing{"nEvtMixing", 10, "Number of events to mix"}; - ConfigurableAxis CfgVtxBins{"CfgVtxBins", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; - ConfigurableAxis CfgMultBins{"CfgMultBins", {VARIABLE_WIDTH, 0.0f, 1.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f, 110.0f}, "Mixing bins - z-vertex"}; + ConfigurableAxis cfgVtxBins{"cfgVtxBins", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; + ConfigurableAxis cfgMultBins{"cfgMultBins", {VARIABLE_WIDTH, 0.0f, 1.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f, 110.0f}, "Mixing bins - z-vertex"}; //*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*// - // Track selections (Execpt DCA selelctions) // + // Track selections (Except DCA selelctions) // // Primary track selections - Configurable cMinPtcut{"cMinPtcut", 0.15, "Track minium pt cut"}; - Configurable cMaxetacut{"cMaxetacut", 0.8, "Track maximum eta cut"}; + Configurable cMinPtcut{"cMinPtcut", 0.15, "Track minium pt cut"}; + Configurable cMaxetacut{"cMaxetacut", 0.8, "Track maximum eta cut"}; Configurable cfgPrimaryTrack{"cfgPrimaryTrack", true, "Primary track selection"}; - Configurable cfgGlobalWoDCATrack{"cfgGlobalWoDCATrack", true, "Global track selection without DCA"}; - Configurable cfgGlobalTrack{"cfgGlobalTrack", false, "Global track selection"}; - Configurable cfgPVContributor{"cfgPVContributor", false, "PV contributor track selection"}; - - Configurable tof_at_high_pt{"tof_at_high_pt", false, "Use TOF at high pT"}; + Configurable cfgPVContributor{"cfgPVContributor", true, "PV contributor track selection"}; + Configurable tofAtHighPt{"tofAtHighPt", false, "Use TOF at high pT"}; Configurable cfgTPCcluster{"cfgTPCcluster", 1, "Minimum Number of TPC cluster"}; // Minmimum Configurable cfgTPCRows{"cfgTPCRows", 70, "Minimum Number of TPC Crossed Rows "}; + Configurable cfgRatioTPCRowsOverFindableCls{"cfgRatioTPCRowsOverFindableCls", 0.8, "Minimum of TPC Crossed Rows to Findable Clusters"}; // Minmimum - Configurable cfgUseTPCRefit{"cfgUseTPCRefit", false, "Require TPC Refit"}; - Configurable cfgUseITSRefit{"cfgUseITSRefit", false, "Require ITS Refit"}; + Configurable cfgUseTPCRefit{"cfgUseTPCRefit", true, "Require TPC Refit"}; + Configurable cfgUseITSRefit{"cfgUseITSRefit", true, "Require ITS Refit"}; Configurable cfgHasTOF{"cfgHasTOF", false, "Require TOF"}; + Configurable cfgRapidityCut{"cfgRapidityCut", 0.5, "Rapidity cut for tracks"}; + //*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*// - // DCA selections // + // Cascade and V0 selections // + + // Primary track DCAxy to PV + Configurable cDCAxytoPVByPtPiFirstP0{"cDCAxytoPVByPtPiFirstP0", 0.004, "Coeff. Track DCAxy cut to PV by pt for Pion First (p0)"}; + Configurable cDCAxyToPVByPtPiFirstExp{"cDCAxyToPVByPtPiFirstExp", 0.013, "Coeff. Track DCAxy cut to PV by pt for Pion First (exp)"}; - // Primary track DCAr to PV - Configurable cMaxDCArToPVcut{"cMaxDCArToPVcut", 0.5, "Track DCAr cut to PV Maximum"}; + Configurable cDCAxyToPVAsPtForCasc{"cDCAxyToPVAsPtForCasc", true, "Set DCAxy to PV selection as pt cut"}; + Configurable cDCAxyToPVByPtCascP0{"cDCAxyToPVByPtCascP0", 999., "Coeff. for Track DCAxy cut to PV by pt for Cascade (p0)"}; + Configurable cDCAxyToPVByPtCascExp{"cDCAxyToPVByPtCascExp", 1., "Coeff. Track DCAxy cut to PV by pt for Cascade (exp)"}; // Primary track DCAz to PV - Configurable cMaxDCAzToPVcut{"cMaxDCAzToPVcut", 2.0, "Track DCAz cut to PV Maximum"}; - Configurable cMinDCAzToPVcut{"cMinDCAzToPVcut", 0.0, "Track DCAz cut to PV Minimum"}; + Configurable cDCAzToPVAsPt{"cDCAzToPVAsPt", true, "DCAz to PV selection as pt"}; + Configurable cDCAzToPVAsPtForCasc{"cDCAzToPVAsPtForCasc", true, "Set DCA to PV selection as pt cut"}; + Configurable cMaxDCAzToPVCut{"cMaxDCAzToPVCut", 0.5, "Track DCAz cut to PV Maximum"}; + Configurable cMaxDCAzToPVCutCasc{"cMaxDCAzToPVCutCasc", 0.5, "Track DCAz cut to PV Maximum for casc"}; // Topological selections for V0 - Configurable cDCALambdaDaugtherscut{"cDCALambdaDaugtherscut", 1.4, "Lambda dauthers DCA cut"}; - Configurable cDCALambdaToPVcut{"cDCALambdaToPVcut", 0.07, "Lambda DCA cut to PV"}; - Configurable cDCAPionToPVcut{"cMinDCApion", 0.05, "pion DCA cut to PV"}; - Configurable cDCAProtonToPVcut{"cMinDCAproton", 0.05, "proton DCA cut to PV"}; - Configurable cCosV0cut{"cCosV0cut", 0.97, "Cosine Pointing angle for V0"}; - Configurable cMaxV0radiuscut{"cMaxV0radiuscut", 100., "V0 radius cut Maximum"}; - Configurable cMinV0radiuscut{"cMinV0radiuscut", 0.2, "V0 radius cut Minimum"}; - // Configurable cMasswindowV0cut{"cV0Masswindowcut", 0.007, "V0 Mass window cut"}; // How to ? + Configurable cDCALambdaDaugtherscut{"cDCALambdaDaugtherscut", 0.7, "Lambda dauthers DCA cut"}; + Configurable cDCALambdaToPVcut{"cDCALambdaToPVcut", 0.02, "Lambda DCA cut to PV"}; + Configurable cDCAPionToPVcut{"cDCAPionToPVcut", 0.06, "pion DCA cut to PV"}; + Configurable cDCAProtonToPVcut{"cDCAProtonToPVcut", 0.07, "proton DCA cut to PV"}; + + Configurable cV0CosPACutPtDepP0{"cV0CosPACutPtDepP0", 0.25, "Coeff. for Cosine Pointing angle for V0 as pt (p0)"}; + Configurable cV0CosPACutPtDepP1{"cV0CosPACutPtDepP1", 0.022, "Coeff. for Cosine Pointing angle for V0 as pt (p1)"}; + + Configurable cMaxV0radiuscut{"cMaxV0radiuscut", 200., "V0 radius cut Maximum"}; + Configurable cMinV0radiuscut{"cMinV0radiuscut", 2.5, "V0 radius cut Minimum"}; + Configurable cMasswindowV0cut{"cMasswindowV0cut", 0.005, "V0 Mass window cut"}; // Topological selections for Cascade - Configurable cDCABachlorToPVcut{"cDCABachlorToPVcut", 0.015, "Bachelor DCA cut to PV"}; - Configurable cDCAXiDaugtherscut{"cDCAXiDaugtherscut", 1.6, "Xi- DCA cut to PV"}; - Configurable cCosPACasc{"cCosPACasc", 0.97, "Cosine Pointing angle for Cascade"}; - Configurable cMaxCascradiuscut{"cMaxCascradiuscut", 100., "Cascade radius cut Maximum"}; - Configurable cMinCascradiuscut{"cMinCascradiuscut", 0.2, "Cascade radius cut Minimum"}; - Configurable cMasswindowCasccut{"cMasswindowCasccut", 0.007, "Cascade Mass window cut"}; + + Configurable cDCABachlorToPVcut{"cDCABachlorToPVcut", 0.06, "Bachelor DCA cut to PV"}; + Configurable cDCAXiDaugthersCutPtRangeLower{"cDCAXiDaugthersCutPtRangeLower", 1., "Xi- DCA cut to PV as pt range lower"}; + Configurable cDCAXiDaugthersCutPtRangeUpper{"cDCAXiDaugthersCutPtRangeUpper", 4., "Xi- DCA cut to PV as pt range upper"}; + Configurable cDCAXiDaugthersCutPtDepLower{"cDCAXiDaugthersCutPtDepLower", 0.8, "Xi- DCA cut to PV as pt Under 1 GeV/c"}; + Configurable cDCAXiDaugthersCutPtDepMiddle{"cDCAXiDaugthersCutPtDepMiddle", 0.5, "Xi- DCA cut to PV as pt 1 - 4 GeV/c"}; + Configurable cDCAXiDaugthersCutPtDepUpper{"cDCAXiDaugthersCutPtDepUpper", 0.2, "Xi- DCA cut to PV as pt Over 4 GeV/c"}; + + Configurable cCosPACascCutPtDepP0{"cCosPACascCutPtDepP0", 0.2, "Coeff. for Cosine Pointing angle for Cascade as pt (p0)"}; + Configurable cCosPACascCutPtDepP1{"cCosPACascCutPtDepP1", 0.022, "Coeff. for Cosine Pointing angle for Cascade as pt (p1)"}; + + Configurable cMaxCascradiuscut{"cMaxCascradiuscut", 200., "Cascade radius cut Maximum"}; + Configurable cMinCascradiuscut{"cMinCascradiuscut", 1.1, "Cascade radius cut Minimum"}; + Configurable cMasswindowCasccut{"cMasswindowCasccut", 0.008, "Cascade Mass window cut"}; //*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*// @@ -151,57 +160,61 @@ struct xi1530analysisqa { Configurable cPIDBound{"cPIDBound", 6.349, "configurable for replacing to .has"}; // PID Selections for Pion First - Configurable cMaxTPCnSigmaPionFirst{"cMaxTPCnSigmaPionFirst", 3.0, "TPC nSigma cut for Pion First"}; - Configurable cMaxTOFnSigmaPionFirst{"cMaxTOFnSigmaPionFirst", 3.0, "TOF nSigma cut for Pion First"}; + Configurable cMaxtpcnSigmaPionFirst{"cMaxtpcnSigmaPionFirst", 4.0, "TPC nSigma cut for Pion First"}; + Configurable cMaxtofnSigmaPionFirst{"cMaxtofnSigmaPionFirst", 3.0, "TOF nSigma cut for Pion First"}; - Configurable nsigmaCutCombinedPionFirst{"nsigmaCutCombinedPionFirst", -4.0, "Combined nSigma cut for Pion First"}; + Configurable nsigmaCutCombinedPionFirst{"nsigmaCutCombinedPionFirst", -4.0, "Combined nSigma cut for Pion First"}; Configurable cUseOnlyTOFTrackPionFirst{"cUseOnlyTOFTrackPionFirst", false, "Use only TOF track for PID selection Pion First"}; - Configurable cByPassTOFPionFirst{"cByPassTOFPionFirst", false, "By pass TOF Pion First PID selection"}; + Configurable cByPassTOFPionFirst{"cByPassTOFPionFirst", true, "By pass TOF Pion First PID selection"}; // PID Selections for Pion Bachelor - Configurable cMaxTPCnSigmaPionBachelor{"cMaxTPCnSigmaPionBachelor", 3.0, "TPC nSigma cut for Pion Bachelor"}; - Configurable cMaxTOFnSigmaPionBachelor{"cMaxTOFnSigmaPionBachelor", 3.0, "TOF nSigma cut for Pion Bachelor"}; + Configurable cMaxtpcnSigmaPionBachelor{"cMaxtpcnSigmaPionBachelor", 4.0, "TPC nSigma cut for Pion Bachelor"}; + Configurable cMaxtofnSigmaPionBachelor{"cMaxtofnSigmaPionBachelor", 3.0, "TOF nSigma cut for Pion Bachelor"}; - Configurable nsigmaCutCombinedPionBachelor{"nsigmaCutCombinedPionBachelor", -4.0, "Combined nSigma cut for Pion Bachelor"}; + Configurable nsigmaCutCombinedPionBachelor{"nsigmaCutCombinedPionBachelor", -4.0, "Combined nSigma cut for Pion Bachelor"}; Configurable cUseOnlyTOFTrackPionBachelor{"cUseOnlyTOFTrackPionBachelor", false, "Use only TOF track for PID selection Pion Bachelor"}; - Configurable cByPassTOFPionBachelor{"cByPassTOFPionBachelor", false, "By pass TOF Pion Bachelor PID selection"}; + Configurable cByPassTOFPionBachelor{"cByPassTOFPionBachelor", true, "By pass TOF Pion Bachelor PID selection"}; // PID Selections for Pion - Configurable cMaxTPCnSigmaPion{"cMaxTPCnSigmaPion", 3.0, "TPC nSigma cut for Pion"}; - Configurable cMaxTOFnSigmaPion{"cMaxTOFnSigmaPion", 3.0, "TOF nSigma cut for Pion"}; + Configurable cMaxtpcnSigmaPion{"cMaxtpcnSigmaPion", 4.0, "TPC nSigma cut for Pion"}; + Configurable cMaxtofnSigmaPion{"cMaxtofnSigmaPion", 3.0, "TOF nSigma cut for Pion"}; - Configurable nsigmaCutCombinedPion{"nsigmaCutCombinedPion", -4.0, "Combined nSigma cut for Pion"}; + Configurable nsigmaCutCombinedPion{"nsigmaCutCombinedPion", -4.0, "Combined nSigma cut for Pion"}; Configurable cUseOnlyTOFTrackPion{"cUseOnlyTOFTrackPion", false, "Use only TOF track for PID selection Pion"}; - Configurable cByPassTOFPion{"cByPassTOFPion", false, "By pass TOF Pion PID selection"}; + Configurable cByPassTOFPion{"cByPassTOFPion", true, "By pass TOF Pion PID selection"}; // PID Selections for Proton - Configurable cMaxTPCnSigmaProton{"cMaxTPCnSigmaProton", 3.0, "TPC nSigma cut for Proton"}; - Configurable cMaxTOFnSigmaProton{"cMaxTOFnSigmaProton", 3.0, "TOF nSigma cut for Proton"}; + Configurable cMaxtpcnSigmaProton{"cMaxtpcnSigmaProton", 4.0, "TPC nSigma cut for Proton"}; + Configurable cMaxtofnSigmaProton{"cMaxtofnSigmaProton", 3.0, "TOF nSigma cut for Proton"}; - Configurable nsigmaCutCombinedProton{"nsigmaCutCombinedProton", -4.0, "Combined nSigma cut for Proton"}; + Configurable nsigmaCutCombinedProton{"nsigmaCutCombinedProton", -4.0, "Combined nSigma cut for Proton"}; Configurable cUseOnlyTOFTrackProton{"cUseOnlyTOFTrackProton", false, "Use only TOF track for PID selection Proton"}; - Configurable cByPassTOFProton{"cByPassTOFProton", false, "By pass TOF Proton PID selection"}; + Configurable cByPassTOFProton{"cByPassTOFProton", true, "By pass TOF Proton PID selection"}; //*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*// // MC Event selection // Configurable cZvertCutMC{"cZvertCutMC", 10.0, "MC Z-vertex cut"}; + Configurable cIsPhysicalPrimaryMC{"cIsPhysicalPrimaryMC", true, "Physical primary selection for a MC Parent"}; //*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*// - // Cuts on mother particle + // Cuts on mother particle and others Configurable cfgCutsOnMother{"cfgCutsOnMother", true, "Enamble additional cuts on mother"}; - Configurable cMaxPtMotherCut{"cMaxPtMotherCut", 15.0, "Maximum pt of mother cut"}; - Configurable cMaxMinvMotherCut{"cMaxMinvMotherCut", 2.1, "Maximum Minv of mother cut"}; + Configurable cMaxPtMotherCut{"cMaxPtMotherCut", 9.0, "Maximum pt of mother cut"}; + Configurable cMaxMinvMotherCut{"cMaxMinvMotherCut", 3.0, "Maximum Minv of mother cut"}; + + Configurable cMicroTrack{"cMicroTrack", false, "Using Micro track for first pion"}; + Configurable studyStableXi{"studyStableXi", true, "Study stable Xi"}; TRandom* rn = new TRandom(); //*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*// - struct PIDSelectionParam { + struct PidSelectionParam { double cMaxTPCnSigma; double cMaxTOFnSigma; bool cByPassTOF; @@ -211,14 +224,17 @@ struct xi1530analysisqa { void init(o2::framework::InitContext&) { AxisSpec centAxis = {binsCent, "FT0M (%)"}; - AxisSpec dcaxyAxis = {cDCABins, 0.0, 3.0, "DCA_{#it{xy}} (cm)"}; - AxisSpec dcazAxis = {cDCABins, 0.0, 3.0, "DCA_{#it{z}} (cm)"}; - AxisSpec mcLabelAxis = {5, -0.5, 4.5, "MC Label"}; + AxisSpec dcaxyAxis = {1500, 0.0, 0.3, "DCA_{#it{xy}} (cm)"}; + AxisSpec dcazAxis = {1500, 0.0, 0.3, "DCA_{#it{z}} (cm)"}; + AxisSpec dcaDaugAxis = {1000, 0.0, 1, "DCA_{#it{Daughter}} (cm)"}; + AxisSpec cosPAAxis = {3000, 0.0, 0.06, "1-cos(PA)"}; + AxisSpec mcLabelAxis = {6, -1.5, 4.5, "MC Label"}; AxisSpec ptAxis = {binsPt, "#it{p}_{T} (GeV/#it{c})"}; AxisSpec ptAxisQA = {binsPtQA, "#it{p}_{T} (GeV/#it{c})"}; AxisSpec invMassAxis = {cInvMassBins, cInvMassStart, cInvMassEnd, "Invariant Mass (GeV/#it{c}^2)"}; - AxisSpec pidQAAxis = {cPIDBins, -cPIDQALimit, cPIDQALimit}; - AxisSpec FlagAxis = {9, 0, 9, "Flags"}; + AxisSpec invMassAxisCasc = {800, 1.25, 1.65, "Invariant Mass for Casc. (GeV/#it{c}^2)"}; + AxisSpec pidQAAxis = {65, -6.5, 6.5}; + AxisSpec flagAxis = {9, 0, 9, "Flags"}; if (additionalQAeventPlots) { // Test on Mixed event @@ -241,12 +257,12 @@ struct xi1530analysisqa { histos.add("QAevent/hMultiplicityPercentMixedE", "Multiplicity percentile of collision", HistType::kTH1F, {{120, 0.0f, 120.0f}}); } - if (invmass1D) { + if (invMass1D) { histos.add("Xi1530invmassDS", "Invariant mass of Xi(1530)0 differnt sign", kTH1F, {invMassAxis}); histos.add("Xi1530invmassLS", "Invariant mass of Xi(1530)0 like sign", kTH1F, {invMassAxis}); histos.add("Xi1530invmassME", "Invariant mass of Xi(1530)0 mixed event", kTH1F, {invMassAxis}); - if (study_antiparticle) { + if (studyAntiparticle) { histos.add("Xi1530invmassDSAnti", "Invariant mass of Anti-Xi(1530)0 differnt sign", kTH1F, {invMassAxis}); histos.add("Xi1530invmassLSAnti", "Invariant mass of Anti-Xi(1530)0 like sign", kTH1F, {invMassAxis}); } @@ -257,35 +273,24 @@ struct xi1530analysisqa { histos.add("Xi1530invmassME_DSAnti", "Invariant mass of Xi(1530)0 mixed event DSAnti", kTH1F, {invMassAxis}); } - if (additionalQAplots) { - // TPC ncluster distirbutions - histos.add("TPCncluster/TPCnclusterpifirst", "TPC ncluster distribution", kTH1F, {{160, 0, 160, "TPC nCluster"}}); - - histos.add("TPCncluster/TPCnclusterPhipifirst", "TPC ncluster vs phi", kTH2F, {{160, 0, 160, "TPC nCluster"}, {63, 0, 6.28, "#phi"}}); - } + // TPC ncluster distirbutions + // histos.add("TPCncluster/TPCnclusterpifirst", "TPC ncluster distribution", kTH1F, {{160, 0, 160, "TPC nCluster"}}); + // histos.add("TPCncluster/TPCnclusterPhipifirst", "TPC ncluster vs phi", kTH2F, {{160, 0, 160, "TPC nCluster"}, {63, 0, 6.28, "#phi"}}); // DCA QA to candidates for first pion and Xi- - histos.add("QAbefore/trkDCAxy_pi", "DCAxy distribution of pion track candidates", HistType::kTH1F, {dcaxyAxis}); - histos.add("QAbefore/trkDCAxy_Xi", "DCAxy distribution of Xi- track candidates", HistType::kTH1F, {dcaxyAxis}); - - histos.add("QAbefore/trkDCAz_pi", "DCAz distribution of pion track candidates", HistType::kTH1F, {dcazAxis}); - histos.add("QAbefore/trkDCAz_Xi", "DCAz distribution of Xi- track candidates", HistType::kTH1F, {dcazAxis}); - - histos.add("QAafter/trkDCAxy_pi", "DCAxy distribution of pion track candidates", HistType::kTH1F, {dcaxyAxis}); - histos.add("QAafter/trkDCAxy_Xi", "DCAxy distribution of Xi- track candidates", HistType::kTH1F, {dcaxyAxis}); - - histos.add("QAafter/trkDCAz_pi", "DCAz distribution of pion track candidates", HistType::kTH1F, {dcazAxis}); - histos.add("QAafter/trkDCAz_Xi", "DCAz distribution of Xi- track candidates", HistType::kTH1F, {dcazAxis}); + histos.add("QAbefore/trkDCAxy_pi", "DCAxy distribution of pion track candidates", HistType::kTH2F, {ptAxis, dcaxyAxis}); + histos.add("QAbefore/trkDCAxy_Xi", "DCAxy distribution of Xi- track candidates", HistType::kTH2F, {ptAxis, dcaxyAxis}); - // pT QA to candidates for first pion, Xi - histos.add("QAbefore/trkpT_pi", "pT distribution of pion track candidates", kTH1F, {ptAxis}); - histos.add("QAbefore/trkpT_Xi", "pT distribution of Xi- track candidates", kTH1F, {ptAxis}); + histos.add("QAbefore/trkDCAz_pi", "DCAz distribution of pion track candidates", HistType::kTH2F, {ptAxis, dcazAxis}); + histos.add("QAbefore/trkDCAz_Xi", "DCAz distribution of Xi- track candidates", HistType::kTH2F, {ptAxis, dcazAxis}); - histos.add("QAafter/trkpT_pi", "pT distribution of pion track candidates", kTH1F, {ptAxis}); - histos.add("QAafter/trkpT_Xi", "pT distribution of Xi- track candidates", kTH1F, {ptAxis}); + histos.add("QAafter/trkDCAxy_pi", "DCAxy distribution of pion track candidates", HistType::kTH2F, {ptAxis, dcaxyAxis}); + histos.add("QAafter/trkDCAxy_Xi", "DCAxy distribution of Xi- track candidates", HistType::kTH2F, {ptAxis, dcaxyAxis}); - if (PIDplots) { + histos.add("QAafter/trkDCAz_pi", "DCAz distribution of pion track candidates", HistType::kTH2F, {ptAxis, dcazAxis}); + histos.add("QAafter/trkDCAz_Xi", "DCAz distribution of Xi- track candidates", HistType::kTH2F, {ptAxis, dcazAxis}); + if (pidPlots) { // Plots for QA before, Need to pt info. for the daugthers histos.add("QAbefore/TOF_TPC_Map_pi_first_all", "TOF + TPC Combined PID for Pion_{First};#sigma_{TOF}^{Pion};#sigma_{TPC}^{Pion}", {HistType::kTH2F, {pidQAAxis, pidQAAxis}}); histos.add("QAbefore/TOF_Nsigma_pi_first_all", "TOF NSigma for Pion_{First};#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Pion};", {HistType::kTH3F, {centAxis, ptAxisQA, pidQAAxis}}); @@ -328,29 +333,40 @@ struct xi1530analysisqa { } // 3d histogram + Flags - histos.add("h3Xi1530invmassDS", "Invariant mass of Xi(1530)0 differnt sign", kTHnSparseF, {centAxis, ptAxis, invMassAxis, FlagAxis}); - histos.add("h3Xi1530invmassLS", "Invariant mass of Xi(1530)0 same sign", kTHnSparseF, {centAxis, ptAxis, invMassAxis, FlagAxis}); - histos.add("h3Xi1530invmassME", "Invariant mass of Xi(1530)0 mixed event", kTHnSparseF, {centAxis, ptAxis, invMassAxis, FlagAxis}); + histos.add("h3Xi1530invmassDS", "Invariant mass of Xi- differnt sign", kTHnSparseF, {centAxis, ptAxis, invMassAxis, flagAxis}); + histos.add("h3XiinvmassDS", "Invariant mass of Xi- differnt sign", kTHnSparseF, {centAxis, ptAxis, invMassAxisCasc, flagAxis}); - if (study_antiparticle) { - histos.add("h3Xi1530invmassDSAnti", "Invariant mass of Anti-Xi(1530)0 differnt sign", kTHnSparseF, {centAxis, ptAxis, invMassAxis, FlagAxis}); - histos.add("h3Xi1530invmassLSAnti", "Invariant mass of Anti-Xi(1530)0 same sign", kTHnSparseF, {centAxis, ptAxis, invMassAxis, FlagAxis}); + histos.add("h3Xi1530invmassLS", "Invariant mass of Xi(1530)0 same sign", kTHnSparseF, {centAxis, ptAxis, invMassAxis, flagAxis}); + histos.add("h3XiinvmassLS", "Invariant mass of Xi- same sign", kTHnSparseF, {centAxis, ptAxis, invMassAxisCasc, flagAxis}); + + histos.add("h3Xi1530invmassME", "Invariant mass of Xi(1530)0 mixed event", kTHnSparseF, {centAxis, ptAxis, invMassAxis, flagAxis}); + histos.add("h3XiinvmassME", "Invariant mass of Xi- mixed event", kTHnSparseF, {centAxis, ptAxis, invMassAxisCasc, flagAxis}); + + if (studyAntiparticle) { + histos.add("h3Xi1530invmassDSAnti", "Invariant mass of Anti-Xi(1530)0 differnt sign", kTHnSparseF, {centAxis, ptAxis, invMassAxis, flagAxis}); + histos.add("h3XiinvmassDSAnti", "Invariant mass of Anti-Xi- differnt sign", kTHnSparseF, {centAxis, ptAxis, invMassAxisCasc, flagAxis}); + + histos.add("h3Xi1530invmassLSAnti", "Invariant mass of Anti-Xi(1530)0 same sign", kTHnSparseF, {centAxis, ptAxis, invMassAxis, flagAxis}); + histos.add("h3XiinvmassLSAnti", "Invariant mass of Anti-Xi- same sign", kTHnSparseF, {centAxis, ptAxis, invMassAxisCasc, flagAxis}); } if (additionalMEPlots) { - histos.add("h3Xi1530invmassME_DS", "Invariant mass of Xi(1530)0 mixed event DS", kTHnSparseF, {centAxis, ptAxis, invMassAxis, FlagAxis}); - histos.add("h3Xi1530invmassME_DSAnti", "Invariant mass of Xi(1530)0 mixed event DSAnti", kTHnSparseF, {centAxis, ptAxis, invMassAxis, FlagAxis}); + histos.add("h3Xi1530invmassME_DS", "Invariant mass of Xi(1530)0 mixed event DS", kTHnSparseF, {centAxis, ptAxis, invMassAxis, flagAxis}); + histos.add("h3XiinvmassME_DS", "Invariant mass of Xi- mixed event DS", kTHnSparseF, {centAxis, ptAxis, invMassAxisCasc, flagAxis}); + + histos.add("h3Xi1530invmassME_DSAnti", "Invariant mass of Xi(1530)0 mixed event DSAnti", kTHnSparseF, {centAxis, ptAxis, invMassAxis, flagAxis}); + histos.add("h3XiinvmassME_DSAnti", "Invariant mass of Xi- mixed event DSAnti", kTHnSparseF, {centAxis, ptAxis, invMassAxisCasc, flagAxis}); } if (doprocessMC) { // MC QA - histos.add("QAMCTrue/trkDCAxy_pi", "DCAxy distribution of pion track candidates", HistType::kTH1F, {dcaxyAxis}); - histos.add("QAMCTrue/trkDCAxy_xi", "DCAxy distribution of Xi- track candidates", HistType::kTH1F, {dcaxyAxis}); + histos.add("QAMCTrue/trkDCAxy_pi", "DCAxy distribution of pion track candidates", HistType::kTH2F, {ptAxis, dcaxyAxis}); + histos.add("QAMCTrue/trkDCAxy_xi", "DCAxy distribution of Xi- track candidates", HistType::kTH2F, {ptAxis, dcaxyAxis}); - histos.add("QAMCTrue/trkDCAz_pi", "DCAz distribution of pion track candidates", HistType::kTH1F, {dcazAxis}); - histos.add("QAMCTrue/trkDCAz_xi", "DCAz distribution of Xi- track candidates", HistType::kTH1F, {dcazAxis}); + histos.add("QAMCTrue/trkDCAz_pi", "DCAz distribution of pion track candidates", HistType::kTH2F, {ptAxis, dcazAxis}); + histos.add("QAMCTrue/trkDCAz_xi", "DCAz distribution of Xi- track candidates", HistType::kTH2F, {ptAxis, dcazAxis}); - if (PIDplots) { + if (pidPlots) { histos.add("QAMCTrue/TOF_TPC_Map_pi_first_all", "TOF + TPC Combined PID for Pion_{First};#sigma_{TOF}^{Pion};#sigma_{TPC}^{Pion}", {HistType::kTH2F, {pidQAAxis, pidQAAxis}}); histos.add("QAMCTrue/TOF_Nsigma_pi_first_all", "TOF NSigma for Pion_{First};#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Pion};", {HistType::kTH3F, {centAxis, ptAxisQA, pidQAAxis}}); histos.add("QAMCTrue/TPC_Nsigma_pi_first_all", "TPC NSigma for Pion_{First};#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Pion};", {HistType::kTH3F, {centAxis, ptAxisQA, pidQAAxis}}); @@ -371,36 +387,76 @@ struct xi1530analysisqa { histos.add("QAMCTrue/TPC_Nsigma_piminus_all", "TPC NSigma for Pion -;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Pion};", {HistType::kTH3F, {centAxis, ptAxisQA, pidQAAxis}}); } - histos.add("h3RecXi1530invmass", "Invariant mass of Reconstructed MC Xi(1530)0", kTHnSparseF, {centAxis, ptAxis, invMassAxis, FlagAxis}); - histos.add("h3RecXi1530invmassAnti", "Invariant mass of Reconstructed MC Anti-Xi(1530)0", kTHnSparseF, {centAxis, ptAxis, invMassAxis, FlagAxis}); + histos.add("h3RecXi1530invmass", "Invariant mass of Reconstructed MC Xi(1530)0", kTHnSparseF, {centAxis, ptAxis, invMassAxis, flagAxis}); + histos.add("h3RecXiinvmass", "Invariant mass of Reconstructed MC Xi-", kTHnSparseF, {centAxis, ptAxis, invMassAxisCasc, flagAxis}); + + histos.add("h3RecXi1530invmassAnti", "Invariant mass of Reconstructed MC Anti-Xi(1530)0", kTHnSparseF, {centAxis, ptAxis, invMassAxis, flagAxis}); + histos.add("h3RecXiinvmassAnti", "Invariant mass of Reconstructed MC Anti-Xi-", kTHnSparseF, {centAxis, ptAxis, invMassAxisCasc, flagAxis}); - histos.add("h3Xi1530Gen", "pT distribution of True MC Xi(1530)0", kTHnSparseF, {mcLabelAxis, ptAxis, centAxis, FlagAxis}); - histos.add("h3Xi1530GenAnti", "pT distribution of True MC Anti-Xi(1530)0", kTHnSparseF, {mcLabelAxis, ptAxis, centAxis, FlagAxis}); + histos.add("h3Xi1530Gen", "pT distribution of True MC Xi(1530)0", kTHnSparseF, {mcLabelAxis, ptAxis, centAxis}); + histos.add("h3Xi1530GenAnti", "pT distribution of True MC Anti-Xi(1530)0", kTHnSparseF, {mcLabelAxis, ptAxis, centAxis}); histos.add("Xi1530Rec", "pT distribution of Reconstructed MC Xi(1530)0", kTH2F, {ptAxis, centAxis}); histos.add("Xi1530RecAnti", "pT distribution of Reconstructed MC Anti-Xi(1530)0", kTH2F, {ptAxis, centAxis}); histos.add("Xi1530Recinvmass", "Inv mass distribution of Reconstructed MC Xi(1530)0", kTH1F, {invMassAxis}); } + + if (additionalQAplots) { + histos.add("QAbefore/V0sDCADoughter_aspt", "V0s DCA Doughter distribution as pt", HistType::kTH2F, {ptAxis, dcaDaugAxis}); + histos.add("QAbefore/CascDCADoughter_aspt", "Casc DCA Doughter distribution as pt", HistType::kTH2F, {ptAxis, dcaDaugAxis}); + histos.add("QAbefore/CascMass_aspt", "Casc DCA Bachlor distribution as pt", HistType::kTH2F, {ptAxis, invMassAxisCasc}); + histos.add("QAbefore/V0sCosPA_aspt", "V0s CosPA distribution as pt", HistType::kTH2F, {ptAxis, cosPAAxis}); + histos.add("QAbefore/CascCosPA_aspt", "Casc CosPA distribution as pt", HistType::kTH2F, {ptAxis, cosPAAxis}); + + histos.add("QAafter/V0sDCADoughter_aspt", "V0s DCA Doughter distribution as pt", HistType::kTH2F, {ptAxis, dcaDaugAxis}); + histos.add("QAafter/CascDCADoughter_aspt", "Casc DCA Doughter distribution as pt", HistType::kTH2F, {ptAxis, dcaDaugAxis}); + histos.add("QAafter/CascMass_aspt", "Casc DCA Bachlor distribution as pt", HistType::kTH2F, {ptAxis, invMassAxisCasc}); + histos.add("QAafter/V0sCosPA_aspt", "V0s CosPA distribution as pt", HistType::kTH2F, {ptAxis, cosPAAxis}); + histos.add("QAafter/CascCosPA_aspt", "Casc CosPA distribution as pt", HistType::kTH2F, {ptAxis, cosPAAxis}); + + histos.add("QAMCTrue/V0sDCADoughter_aspt", "V0s DCA Doughter distribution as pt", HistType::kTH2F, {ptAxis, dcaDaugAxis}); + histos.add("QAMCTrue/CascDCADoughter_aspt", "Casc DCA Doughter distribution as pt", HistType::kTH2F, {ptAxis, dcaDaugAxis}); + histos.add("QAMCTrue/CascMass_aspt", "Casc DCA Bachlor distribution as pt", HistType::kTH2F, {ptAxis, invMassAxisCasc}); + histos.add("QAMCTrue/V0sCosPA_aspt", "V0s CosPA distribution as pt", HistType::kTH2F, {ptAxis, cosPAAxis}); + histos.add("QAMCTrue/CascCosPA_aspt", "Casc CosPA distribution as pt", HistType::kTH2F, {ptAxis, cosPAAxis}); + } } double massPi = MassPionCharged; // Primary track selection for the first pion // - template - bool PtrackCut(const TrackType track) + template + bool primaryTrackCut(const TrackType track) { if (std::abs(track.eta()) > cMaxetacut) return false; if (std::abs(track.pt()) < cMinPtcut) return false; - if (std::abs(track.dcaXY()) > cMaxDCArToPVcut) - return false; - if (std::abs(track.dcaZ()) > cMaxDCAzToPVcut) - return false; - if (track.tpcNClsFound() < cfgTPCcluster) - return false; - if (track.tpcNClsCrossedRows() < cfgTPCRows) - return false; + if constexpr (IsResoMicrotrack) { + if (std::abs(o2::aod::resodmciroaughter::ResoMicroTrackSelFlag::decodeDCAxy(track.trackSelectionFlags())) > (cDCAxytoPVByPtPiFirstP0 + cDCAxyToPVByPtPiFirstExp * std::pow(track.pt(), -1.1))) + return false; + if (cDCAzToPVAsPt) { + if (std::abs(o2::aod::resodmciroaughter::ResoMicroTrackSelFlag::decodeDCAz(track.trackSelectionFlags())) > (cDCAxytoPVByPtPiFirstP0 + cDCAxyToPVByPtPiFirstExp * std::pow(track.pt(), -1.1))) + return false; + } else { + if (std::abs(o2::aod::resodmciroaughter::ResoMicroTrackSelFlag::decodeDCAz(track.trackSelectionFlags())) > cMaxDCAzToPVCut) + return false; + } + } else { + if (std::abs(track.dcaXY()) > (cDCAxytoPVByPtPiFirstP0 + cDCAxyToPVByPtPiFirstExp * std::pow(track.pt(), -1.1))) + return false; + if (cDCAzToPVAsPt) { + if (std::abs(track.dcaZ()) > (cDCAxytoPVByPtPiFirstP0 + cDCAxyToPVByPtPiFirstExp * std::pow(track.pt(), -1.1))) + return false; + } else { + if (std::abs(track.dcaZ()) > cMaxDCAzToPVCut) + return false; + } + if (track.tpcNClsFound() < cfgTPCcluster) + return false; + if (track.tpcNClsCrossedRows() < cfgTPCRows) + return false; + } if (cfgHasTOF && !track.hasTOF()) return false; if (cfgUseITSRefit && !track.passedITSRefit()) @@ -411,11 +467,6 @@ struct xi1530analysisqa { return false; if (cfgPrimaryTrack && !track.isPrimaryTrack()) return false; - if (cfgGlobalWoDCATrack && !track.isGlobalTrackWoDCA()) - return false; - if (cfgGlobalTrack && !track.isGlobalTrack()) - return false; - return true; } @@ -426,16 +477,20 @@ struct xi1530analysisqa { // Primary track selection for cascades, Need to more informations for cascades // template - bool cascPtrackCut(const TracksTypeCasc track) + bool cascprimaryTrackCut(const TracksTypeCasc track) { if (std::abs(track.eta()) > cMaxetacut) return false; if (std::abs(track.pt()) < cMinPtcut) return false; - if (std::abs(track.dcaXYCascToPV()) > cMaxDCArToPVcut) - return false; - if (std::abs(track.dcaZCascToPV()) > cMaxDCAzToPVcut) - return false; + if (cDCAxyToPVAsPtForCasc) { + if (std::abs(track.dcaXYCascToPV()) > (cDCAxyToPVByPtCascP0 + cDCAxyToPVByPtCascExp * track.pt())) + return false; + } + if (cDCAzToPVAsPtForCasc) { + if (std::abs(track.dcaZCascToPV()) > (cDCAxyToPVByPtCascP0 + cDCAxyToPVByPtCascExp * std::pow(track.pt(), -1.1))) + return false; + } return true; } @@ -462,29 +517,40 @@ struct xi1530analysisqa { if (std::abs(track.dcapostopv()) < cDCAPionToPVcut) return false; } - if (track.v0CosPA() < cCosV0cut) + if (track.v0CosPA() < std::cos(cV0CosPACutPtDepP0 - cV0CosPACutPtDepP1 * track.pt())) return false; if (track.transRadius() > cMaxV0radiuscut || track.transRadius() < cMinV0radiuscut) return false; + if (std::abs(track.mLambda() - MassLambda) > cMasswindowV0cut) + return false; // Topological Cuts for Cascades - if (track.dcabachtopv() < cDCABachlorToPVcut) - return false; - if (track.cascDaughDCA() > cDCAXiDaugtherscut) + if (std::abs(track.dcabachtopv()) < cDCABachlorToPVcut) return false; - if (track.cascCosPA() < cCosPACasc) + if (track.pt() < cDCAXiDaugthersCutPtRangeLower) { + if (track.cascDaughDCA() > cDCAXiDaugthersCutPtDepLower) + return false; + } + if (track.pt() >= cDCAXiDaugthersCutPtRangeLower && track.pt() < cDCAXiDaugthersCutPtRangeUpper) { + if (track.cascDaughDCA() > cDCAXiDaugthersCutPtDepMiddle) + return false; + } + if (track.pt() >= cDCAXiDaugthersCutPtRangeUpper) { + if (track.cascDaughDCA() > cDCAXiDaugthersCutPtDepUpper) + return false; + } + if (track.cascCosPA() < std::cos(cCosPACascCutPtDepP0 - cCosPACascCutPtDepP1 * track.pt())) return false; + if (track.cascTransRadius() > cMaxCascradiuscut || track.cascTransRadius() < cMinCascradiuscut) return false; - // if (std::abs(track.mXi() - XiMass) > cMasswindowCasccut) - // return false; if (std::abs(track.mXi() - cMassXiminus) > cMasswindowCasccut) return false; return true; } - bool PIDSelector(float TPCNsigma, float TOFNsigma, const PIDSelectionParam& params, bool tofAtHighPt) + bool pidSelector(float TPCNsigma, float TOFNsigma, const PidSelectionParam& params, bool tofAtHighPt) { bool tpcPIDPassed{false}, tofPIDPassed{false}; @@ -524,18 +590,23 @@ struct xi1530analysisqa { } // PID selection for the First Pion // - template + template bool selectionPIDPionFirst(const T& candidate) { - float TPCNsigmaPionFirst, TOFNsigmaPionFirst; + static float tpcNsigmaPionFirst, tofNsigmaPionFirst; - TPCNsigmaPionFirst = candidate.tpcNSigmaPi(); - TOFNsigmaPionFirst = candidate.tofNSigmaPi(); + if constexpr (IsResoMicrotrack) { + tpcNsigmaPionFirst = o2::aod::resodmciroaughter::PidNSigma::getTPCnSigma(candidate.pidNSigmaPiFlag()); + tofNsigmaPionFirst = o2::aod::resodmciroaughter::PidNSigma::getTOFnSigma(candidate.pidNSigmaPiFlag()); + } else { + tpcNsigmaPionFirst = candidate.tpcNSigmaPi(); + tofNsigmaPionFirst = candidate.tofNSigmaPi(); + } - PIDSelectionParam PionFirstParams = {cMaxTPCnSigmaPionFirst, cMaxTOFnSigmaPionFirst, cByPassTOFPionFirst, nsigmaCutCombinedPionFirst}; + PidSelectionParam pionFirstParams = {cMaxtpcnSigmaPionFirst, cMaxtofnSigmaPionFirst, cByPassTOFPionFirst, nsigmaCutCombinedPionFirst}; - return PIDSelector(TPCNsigmaPionFirst, TOFNsigmaPionFirst, PionFirstParams, tof_at_high_pt); + return pidSelector(tpcNsigmaPionFirst, tofNsigmaPionFirst, pionFirstParams, tofAtHighPt); } template @@ -543,45 +614,45 @@ struct xi1530analysisqa { { bool lConsistentWithXi{false}, lConsistentWithLambda{false}, lConsistentWithPion{false}, lConsistentWithProton{false}; - float TPCNsigmaBachelor, TOFNsigmaBachelor; - float TPCNsigmaPion, TOFNsigmaPion; - float TPCNsigmaProton, TOFNsigmaProton; + float tpcNsigmaBachelor, tofNsigmaBachelor; + float tpcNsigmaPion, tofNsigmaPion; + float tpcNsigmaProton, tofNsigmaProton; if (candidate.sign() < 0) { // Xi- candidates - TPCNsigmaBachelor = candidate.daughterTPCNSigmaBachPi(); - TOFNsigmaBachelor = candidate.daughterTOFNSigmaBachPi(); + tpcNsigmaBachelor = candidate.daughterTPCNSigmaBachPi(); + tofNsigmaBachelor = candidate.daughterTOFNSigmaBachPi(); - TPCNsigmaPion = candidate.daughterTPCNSigmaNegPi(); - TOFNsigmaPion = candidate.daughterTOFNSigmaNegPi(); + tpcNsigmaPion = candidate.daughterTPCNSigmaNegPi(); + tofNsigmaPion = candidate.daughterTOFNSigmaNegPi(); - TPCNsigmaProton = candidate.daughterTPCNSigmaPosPr(); - TOFNsigmaProton = candidate.daughterTOFNSigmaPosPr(); + tpcNsigmaProton = candidate.daughterTPCNSigmaPosPr(); + tofNsigmaProton = candidate.daughterTOFNSigmaPosPr(); } else { // Anti-Xi- candidates - TPCNsigmaBachelor = candidate.daughterTPCNSigmaBachPi(); - TOFNsigmaBachelor = candidate.daughterTOFNSigmaBachPi(); + tpcNsigmaBachelor = candidate.daughterTPCNSigmaBachPi(); + tofNsigmaBachelor = candidate.daughterTOFNSigmaBachPi(); - TPCNsigmaPion = candidate.daughterTPCNSigmaPosPi(); - TOFNsigmaPion = candidate.daughterTOFNSigmaPosPi(); + tpcNsigmaPion = candidate.daughterTPCNSigmaPosPi(); + tofNsigmaPion = candidate.daughterTOFNSigmaPosPi(); - TPCNsigmaProton = candidate.daughterTPCNSigmaNegPr(); - TOFNsigmaProton = candidate.daughterTOFNSigmaNegPr(); + tpcNsigmaProton = candidate.daughterTPCNSigmaNegPr(); + tofNsigmaProton = candidate.daughterTOFNSigmaNegPr(); } - PIDSelectionParam bachelorParams = {cMaxTPCnSigmaPionBachelor, cMaxTOFnSigmaPionBachelor, cByPassTOFPionBachelor, nsigmaCutCombinedPionBachelor}; - PIDSelectionParam pionParams = {cMaxTPCnSigmaPion, cMaxTOFnSigmaPion, cByPassTOFPion, nsigmaCutCombinedPion}; - PIDSelectionParam protonParams = {cMaxTPCnSigmaProton, cMaxTOFnSigmaProton, cByPassTOFProton, nsigmaCutCombinedProton}; + PidSelectionParam bachelorParams = {cMaxtpcnSigmaPionBachelor, cMaxtofnSigmaPionBachelor, cByPassTOFPionBachelor, nsigmaCutCombinedPionBachelor}; + PidSelectionParam pionParams = {cMaxtpcnSigmaPion, cMaxtofnSigmaPion, cByPassTOFPion, nsigmaCutCombinedPion}; + PidSelectionParam protonParams = {cMaxtpcnSigmaProton, cMaxtofnSigmaProton, cByPassTOFProton, nsigmaCutCombinedProton}; - lConsistentWithXi = PIDSelector(TPCNsigmaBachelor, TOFNsigmaBachelor, bachelorParams, tof_at_high_pt); - lConsistentWithPion = PIDSelector(TPCNsigmaPion, TOFNsigmaPion, pionParams, tof_at_high_pt); - lConsistentWithProton = PIDSelector(TPCNsigmaProton, TOFNsigmaProton, protonParams, tof_at_high_pt); + lConsistentWithXi = pidSelector(tpcNsigmaBachelor, tofNsigmaBachelor, bachelorParams, tofAtHighPt); + lConsistentWithPion = pidSelector(tpcNsigmaPion, tofNsigmaPion, pionParams, tofAtHighPt); + lConsistentWithProton = pidSelector(tpcNsigmaProton, tofNsigmaProton, protonParams, tofAtHighPt); lConsistentWithLambda = lConsistentWithProton && lConsistentWithPion; return lConsistentWithXi && lConsistentWithLambda; } - template + template void fillHistograms(const CollisionType& collision, const TracksType& dTracks1, const TracksTypeCasc& dTracks2) // Order: ResoColl, ResoTrack, ResoCascTrack { auto multiplicity = collision.cent(); @@ -602,7 +673,7 @@ struct xi1530analysisqa { TLorentzVector lDecayDaughter1, lDecayDaughter2, lResonance; // It will be replaced to use RecoDecay (In fixing...) - for (auto& [trk1, trk2] : combinations(CombinationsFullIndexPolicy(dTracks1, dTracks2))) { + for (const auto& [trk1, trk2] : combinations(CombinationsFullIndexPolicy(dTracks1, dTracks2))) { if (additionalQAeventPlots) { if constexpr (!IsMix) { @@ -612,14 +683,34 @@ struct xi1530analysisqa { } } - if (!PtrackCut(trk1) || !cascPtrackCut(trk2)) // Primary track selections - continue; - auto trk1ptPi = trk1.pt(); - auto trk1NSigmaPiTPC = trk1.tpcNSigmaPi(); - auto trk1NSigmaPiTOF = trk1.tofNSigmaPi(); + static float trk1DCAXY; + static float trk1DCAZ; + static float trk1NSigmaPiTPC; + static float trk1NSigmaPiTOF; + if constexpr (IsResoMicrotrack) { + trk1DCAXY = o2::aod::resodmciroaughter::ResoMicroTrackSelFlag::decodeDCAxy(trk1.trackSelectionFlags()); + trk1DCAZ = o2::aod::resodmciroaughter::ResoMicroTrackSelFlag::decodeDCAz(trk1.trackSelectionFlags()); + trk1NSigmaPiTPC = o2::aod::resodmciroaughter::PidNSigma::getTPCnSigma(trk1.pidNSigmaPiFlag()); + trk1NSigmaPiTOF = o2::aod::resodmciroaughter::PidNSigma::getTOFnSigma(trk1.pidNSigmaPiFlag()); + } else { + trk1DCAXY = trk1.dcaXY(); + trk1DCAZ = trk1.dcaZ(); + trk1NSigmaPiTPC = trk1.tpcNSigmaPi(); + trk1NSigmaPiTOF = trk1.tofNSigmaPi(); + } auto trk2ptXi = trk2.pt(); + + auto trk2DCAXY = trk2.dcaXYCascToPV(); + auto trk2DCAZ = trk2.dcaZCascToPV(); + + auto trk2DCAV0sDougthers = trk2.daughDCA(); + auto trk2DCACascDougthers = trk2.cascDaughDCA(); + auto trk2Mass = trk2.mXi(); + auto trk2CascCosPA = trk2.cascCosPA(); + auto trk2V0sCosPA = trk2.v0CosPA(); + // Need to daughther's pt info. in the table // auto trk2ptPiBachelor = trk2.pt(); float trk2NSigmaPiBachelorTPC = trk2.daughterTPCNSigmaBachPi(); @@ -642,7 +733,7 @@ struct xi1530analysisqa { if constexpr (!IsMix) { //// QA plots before the selection // need to pt for cascade tracks // --- PID QA - if (PIDplots) { + if (pidPlots) { histos.fill(HIST("QAbefore/TPC_Nsigma_pi_first_all"), multiplicity, trk1ptPi, trk1NSigmaPiTPC); if (hasSubsystemInfo(trk1NSigmaPiTOF)) { histos.fill(HIST("QAbefore/TOF_Nsigma_pi_first_all"), multiplicity, trk1ptPi, trk1NSigmaPiTOF); @@ -676,16 +767,24 @@ struct xi1530analysisqa { } } - histos.fill(HIST("QAbefore/trkpT_pi"), trk1ptPi); - histos.fill(HIST("QAbefore/trkpT_Xi"), trk2ptXi); + histos.fill(HIST("QAbefore/trkDCAxy_pi"), trk1ptPi, trk1DCAXY); + histos.fill(HIST("QAbefore/trkDCAxy_Xi"), trk2ptXi, trk2DCAXY); - histos.fill(HIST("QAbefore/trkDCAxy_pi"), trk1.dcaXY()); - histos.fill(HIST("QAbefore/trkDCAxy_Xi"), trk2.dcaXYCascToPV()); + histos.fill(HIST("QAbefore/trkDCAz_pi"), trk1ptPi, trk1DCAZ); + histos.fill(HIST("QAbefore/trkDCAz_Xi"), trk2ptXi, trk2DCAZ); - histos.fill(HIST("QAbefore/trkDCAz_pi"), trk1.dcaZ()); - histos.fill(HIST("QAbefore/trkDCAz_Xi"), trk2.dcaZCascToPV()); + if (additionalQAplots) { + histos.fill(HIST("QAbefore/V0sDCADoughter_aspt"), trk2ptXi, trk2DCAV0sDougthers); + histos.fill(HIST("QAbefore/CascDCADoughter_aspt"), trk2ptXi, trk2DCACascDougthers); + histos.fill(HIST("QAbefore/CascMass_aspt"), trk2ptXi, trk2Mass); + histos.fill(HIST("QAbefore/V0sCosPA_aspt"), trk2ptXi, 1. - trk2V0sCosPA); + histos.fill(HIST("QAbefore/CascCosPA_aspt"), trk2ptXi, 1. - trk2CascCosPA); + } } + if (!primaryTrackCut(trk1) || !cascprimaryTrackCut(trk2)) // Primary track selections + continue; + // PID selection if (cUseOnlyTOFTrackPionFirst && !hasSubsystemInfo(trk1NSigmaPiTOF)) continue; @@ -703,22 +802,20 @@ struct xi1530analysisqa { if (cUseOnlyTOFTrackPion && !hasSubsystemInfo(trk2NSigmaPiNegTOF)) continue; - if (!selectionPIDPionFirst(trk1) || !selectionPIDCascades(trk2)) + if (!selectionPIDPionFirst(trk1) || !selectionPIDCascades(trk2)) continue; if (!casctopCut(trk2)) continue; - if (additionalQAplots) { - // TPCncluster distributions - histos.fill(HIST("TPCncluster/TPCnclusterpifirst"), trk1.tpcNClsFound()); - histos.fill(HIST("TPCncluster/TPCnclusterPhipifirst"), trk1.tpcNClsFound(), trk1.phi()); - } + // TPCncluster distributions + // histos.fill(HIST("TPCncluster/TPCnclusterpifirst"), trk1.tpcNClsFound()); + // histos.fill(HIST("TPCncluster/TPCnclusterPhipifirst"), trk1.tpcNClsFound(), trk1.phi()); if constexpr (!IsMix) { - //// QA plots before the selection + //// QA plots after the selection // --- PID QA - if (PIDplots) { + if (pidPlots) { histos.fill(HIST("QAafter/TPC_Nsigma_pi_first_all"), multiplicity, trk1ptPi, trk1NSigmaPiTPC); if (hasSubsystemInfo(trk1NSigmaPiTOF)) { @@ -761,14 +858,19 @@ struct xi1530analysisqa { } } - histos.fill(HIST("QAafter/trkpT_pi"), trk1ptPi); - histos.fill(HIST("QAafter/trkpT_Xi"), trk2ptXi); + histos.fill(HIST("QAafter/trkDCAxy_pi"), trk1ptPi, trk1DCAXY); + histos.fill(HIST("QAafter/trkDCAxy_Xi"), trk2ptXi, trk2DCAXY); - histos.fill(HIST("QAafter/trkDCAxy_pi"), trk1.dcaXY()); - histos.fill(HIST("QAafter/trkDCAxy_Xi"), trk2.dcaXYCascToPV()); + histos.fill(HIST("QAafter/trkDCAz_pi"), trk1ptPi, trk1DCAZ); + histos.fill(HIST("QAafter/trkDCAz_Xi"), trk2ptXi, trk2DCAZ); - histos.fill(HIST("QAafter/trkDCAz_pi"), trk1.dcaZ()); - histos.fill(HIST("QAafter/trkDCAz_Xi"), trk2.dcaZCascToPV()); + if (additionalQAplots) { + histos.fill(HIST("QAafter/V0sDCADoughter_aspt"), trk2ptXi, trk2DCAV0sDougthers); + histos.fill(HIST("QAafter/CascDCADoughter_aspt"), trk2ptXi, trk2DCACascDougthers); + histos.fill(HIST("QAafter/CascMass_aspt"), trk2ptXi, trk2Mass); + histos.fill(HIST("QAafter/V0sCosPA_aspt"), trk2ptXi, 1. - trk2V0sCosPA); + histos.fill(HIST("QAafter/CascCosPA_aspt"), trk2ptXi, 1. - trk2CascCosPA); + } } lDecayDaughter1.SetPtEtaPhiM(trk1ptPi, trk1.eta(), trk1.phi(), massPi); @@ -778,7 +880,7 @@ struct xi1530analysisqa { auto lResonancePt = lResonance.Pt(); auto lResonanceInMass = lResonance.M(); - if (std::abs(lResonance.Rapidity()) >= 0.5) + if (std::abs(lResonance.Rapidity()) >= cfgRapidityCut) continue; if (cfgCutsOnMother) { @@ -791,48 +893,72 @@ struct xi1530analysisqa { if (trk1.sign() * trk2.sign() < 0) { if constexpr (!IsMix) { - if (study_antiparticle) { + if (studyAntiparticle) { if (trk1.sign() > 0) { - if (invmass1D) + if (invMass1D) histos.fill(HIST("Xi1530invmassDS"), lResonanceInMass); histos.fill(HIST("h3Xi1530invmassDS"), multiplicity, lResonancePt, lResonanceInMass, kData); } else if (trk1.sign() < 0) { - if (invmass1D) + if (invMass1D) histos.fill(HIST("Xi1530invmassDSAnti"), lResonanceInMass); histos.fill(HIST("h3Xi1530invmassDSAnti"), multiplicity, lResonancePt, lResonanceInMass, kData); } } else { - if (invmass1D) + if (invMass1D) histos.fill(HIST("Xi1530invmassDS"), lResonanceInMass); histos.fill(HIST("h3Xi1530invmassDS"), multiplicity, lResonancePt, lResonanceInMass, kData); } + + if (studyStableXi) { + if (trk1.sign() > 0) { + histos.fill(HIST("h3XiinvmassDS"), multiplicity, trk2ptXi, trk2Mass, kData); + } else if (trk1.sign() < 0) { + histos.fill(HIST("h3XiinvmassDSAnti"), multiplicity, trk2ptXi, trk2Mass, kData); + } + } } else { - if (invmass1D) + if (invMass1D) histos.fill(HIST("Xi1530invmassME"), lResonanceInMass); if (trk1.sign() > 0) { - if (invmass1D) + if (invMass1D) histos.fill(HIST("Xi1530invmassME_DS"), lResonanceInMass); histos.fill(HIST("h3Xi1530invmassME_DS"), multiplicity, lResonancePt, lResonanceInMass, kMixing); } else if (trk1.sign() < 0) { - if (invmass1D) + if (invMass1D) histos.fill(HIST("Xi1530invmassME_DSAnti"), lResonanceInMass); histos.fill(HIST("h3Xi1530invmassME_DSAnti"), multiplicity, lResonancePt, lResonanceInMass, kMixing); } histos.fill(HIST("h3Xi1530invmassME"), multiplicity, lResonancePt, lResonanceInMass, kMixing); - } + if (studyStableXi) { + if (trk1.sign() > 0) { + histos.fill(HIST("h3XiinvmassME_DS"), multiplicity, trk2ptXi, trk2Mass, kMixing); + } else if (trk1.sign() < 0) { + histos.fill(HIST("h3XiinvmassME_DSAnti"), multiplicity, trk2ptXi, trk2Mass, kMixing); + } + } + } if constexpr (IsMC) { - if (std::abs(trk2.motherPDG()) != XiStarPID) + if (std::abs(trk2.motherPDG()) != kXiStar) continue; - if (std::abs(trk1.pdgCode()) != PionPID || std::abs(trk2.pdgCode()) != XiPID) + if (std::abs(trk1.pdgCode()) != kPiPlus || std::abs(trk2.pdgCode()) != kXiMinus) continue; if (trk1.motherId() != trk2.motherId()) continue; - histos.fill(HIST("QAMCTrue/trkDCAxy_pi"), trk1.dcaXY()); - histos.fill(HIST("QAMCTrue/trkDCAxy_xi"), trk2.dcaXYCascToPV()); - histos.fill(HIST("QAMCTrue/trkDCAz_pi"), trk1.dcaZ()); - histos.fill(HIST("QAMCTrue/trkDCAz_xi"), trk2.dcaZCascToPV()); + histos.fill(HIST("QAMCTrue/trkDCAxy_pi"), trk1ptPi, trk1DCAXY); + histos.fill(HIST("QAMCTrue/trkDCAxy_xi"), trk2ptXi, trk2DCAXY); + histos.fill(HIST("QAMCTrue/trkDCAz_pi"), trk1ptPi, trk1DCAZ); + histos.fill(HIST("QAMCTrue/trkDCAz_xi"), trk2ptXi, trk2DCAZ); + + if (additionalQAplots) { + histos.fill(HIST("QAMCTrue/V0sDCADoughter_aspt"), trk2ptXi, trk2DCAV0sDougthers); + histos.fill(HIST("QAMCTrue/CascDCADoughter_aspt"), trk2ptXi, trk2DCACascDougthers); + histos.fill(HIST("QAMCTrue/CascMass_aspt"), trk2ptXi, trk2Mass); + histos.fill(HIST("QAMCTrue/V0sCosPA_aspt"), trk2ptXi, 1. - trk2V0sCosPA); + histos.fill(HIST("QAMCTrue/CascCosPA_aspt"), trk2ptXi, 1. - trk2CascCosPA); + } + histos.fill(HIST("QAMCTrue/TPC_Nsigma_pi_first_all"), multiplicity, trk1ptPi, trk1NSigmaPiTPC); if (hasSubsystemInfo(trk1NSigmaPiTOF)) { histos.fill(HIST("QAMCTrue/TOF_Nsigma_pi_first_all"), multiplicity, trk1ptPi, trk1NSigmaPiTOF); @@ -840,36 +966,36 @@ struct xi1530analysisqa { } if (trk2.sign() < 0) { - histos.fill(HIST("QAafter/TPC_Nsigma_pi_bachelor_all"), multiplicity, 0, trk2NSigmaPiBachelorTPC); // not exist pt information in resocascade yet. + histos.fill(HIST("QAMCTrue/TPC_Nsigma_pi_bachelor_all"), multiplicity, 0, trk2NSigmaPiBachelorTPC); // not exist pt information in resocascade yet. if (hasSubsystemInfo(trk2NSigmaPiBachelorTOF)) { - histos.fill(HIST("QAafter/TOF_TPC_Map_pi_bachelor_all"), trk2NSigmaPiBachelorTOF, trk2NSigmaPiBachelorTPC); + histos.fill(HIST("QAMCTrue/TOF_TPC_Map_pi_bachelor_all"), trk2NSigmaPiBachelorTOF, trk2NSigmaPiBachelorTPC); } - histos.fill(HIST("QAafter/TPC_Nsigma_pr_all"), multiplicity, 0, trk2NSigmaPrPosTPC); + histos.fill(HIST("QAMCTrue/TPC_Nsigma_pr_all"), multiplicity, 0, trk2NSigmaPrPosTPC); if (hasSubsystemInfo(trk2NSigmaPrPosTOF)) { - histos.fill(HIST("QAafter/TOF_TPC_Map_pr_all"), trk2NSigmaPrPosTOF, trk2NSigmaPrPosTPC); + histos.fill(HIST("QAMCTrue/TOF_TPC_Map_pr_all"), trk2NSigmaPrPosTOF, trk2NSigmaPrPosTPC); } - histos.fill(HIST("QAafter/TPC_Nsigma_piminus_all"), multiplicity, 0, trk2NSigmaPiNegTPC); + histos.fill(HIST("QAMCTrue/TPC_Nsigma_piminus_all"), multiplicity, 0, trk2NSigmaPiNegTPC); if (hasSubsystemInfo(trk2NSigmaPiNegTOF)) { - histos.fill(HIST("QAafter/TOF_TPC_Map_piminus_all"), trk2NSigmaPiNegTOF, trk2NSigmaPiNegTPC); + histos.fill(HIST("QAMCTrue/TOF_TPC_Map_piminus_all"), trk2NSigmaPiNegTOF, trk2NSigmaPiNegTPC); } } else { - histos.fill(HIST("QAafter/TPC_Nsigma_pi_bachelor_all"), multiplicity, 0, trk2NSigmaPiBachelorTPC); // not exist pt information in resocascade yet. + histos.fill(HIST("QAMCTrue/TPC_Nsigma_pi_bachelor_all"), multiplicity, 0, trk2NSigmaPiBachelorTPC); // not exist pt information in resocascade yet. if (hasSubsystemInfo(trk2NSigmaPiBachelorTOF)) { - histos.fill(HIST("QAafter/TOF_TPC_Map_pi_bachelor_all"), trk2NSigmaPiBachelorTOF, trk2NSigmaPiBachelorTPC); + histos.fill(HIST("QAMCTrue/TOF_TPC_Map_pi_bachelor_all"), trk2NSigmaPiBachelorTOF, trk2NSigmaPiBachelorTPC); } - histos.fill(HIST("QAafter/TPC_Nsigma_antipr_all"), multiplicity, 0, trk2NSigmaPrNegTPC); + histos.fill(HIST("QAMCTrue/TPC_Nsigma_antipr_all"), multiplicity, 0, trk2NSigmaPrNegTPC); if (hasSubsystemInfo(trk2NSigmaPrNegTOF)) { - histos.fill(HIST("QAafter/TOF_TPC_Map_antipr_all"), trk2NSigmaPrNegTOF, trk2NSigmaPrNegTPC); + histos.fill(HIST("QAMCTrue/TOF_TPC_Map_antipr_all"), trk2NSigmaPrNegTOF, trk2NSigmaPrNegTPC); } - histos.fill(HIST("QAafter/TPC_Nsigma_pi_all"), multiplicity, 0, trk2NSigmaPiPosTPC); + histos.fill(HIST("QAMCTrue/TPC_Nsigma_pi_all"), multiplicity, 0, trk2NSigmaPiPosTPC); if (hasSubsystemInfo(trk2NSigmaPiPosTOF)) { - histos.fill(HIST("QAafter/TOF_TPC_Map_pi_all"), trk2NSigmaPiPosTOF, trk2NSigmaPiPosTPC); + histos.fill(HIST("QAMCTrue/TOF_TPC_Map_pi_all"), trk2NSigmaPiPosTOF, trk2NSigmaPiPosTPC); } } // MC histograms @@ -877,40 +1003,45 @@ struct xi1530analysisqa { histos.fill(HIST("Xi1530Rec"), lResonancePt, multiplicity); histos.fill(HIST("Xi1530Recinvmass"), lResonanceInMass); histos.fill(HIST("h3RecXi1530invmass"), multiplicity, lResonancePt, lResonanceInMass, kMCReco); + histos.fill(HIST("h3RecXiinvmass"), multiplicity, trk2ptXi, trk2Mass, kMCReco); } else { histos.fill(HIST("Xi1530RecAnti"), lResonancePt, multiplicity); histos.fill(HIST("Xi1530Recinvmass"), lResonanceInMass); histos.fill(HIST("h3RecXi1530invmassAnti"), multiplicity, lResonancePt, lResonanceInMass, kMCReco); + histos.fill(HIST("h3RecXiinvmassAnti"), multiplicity, trk2ptXi, trk2Mass, kMCReco); } } } else { if constexpr (!IsMix) { - if (study_antiparticle) { + if (studyAntiparticle) { if (trk1.sign() < 0) { - if (invmass1D) + if (invMass1D) histos.fill(HIST("Xi1530invmassLS"), lResonanceInMass); histos.fill(HIST("h3Xi1530invmassLS"), multiplicity, lResonancePt, lResonanceInMass, kLS); + histos.fill(HIST("h3XiinvmassLS"), multiplicity, trk2ptXi, trk2Mass, kLS); } else if (trk1.sign() > 0) { - if (invmass1D) + if (invMass1D) histos.fill(HIST("Xi1530invmassLSAnti"), lResonanceInMass); histos.fill(HIST("h3Xi1530invmassLSAnti"), multiplicity, lResonancePt, lResonanceInMass, kLS); + histos.fill(HIST("h3XiinvmassLSAnti"), multiplicity, trk2ptXi, trk2Mass, kLS); } } else { - if (invmass1D) + if (invMass1D) histos.fill(HIST("Xi1530invmassLS"), lResonanceInMass); histos.fill(HIST("h3Xi1530invmassLS"), multiplicity, lResonancePt, lResonanceInMass, kLS); + histos.fill(HIST("h3XiinvmassLS"), multiplicity, trk2ptXi, trk2Mass, kLS); } } } } } - void processData(aod::ResoCollision& resoCollision, aod::ResoTracks const& resoTracks, aod::ResoCascades const& cascTracks) + void processData(aod::ResoCollision const& resoCollision, aod::ResoTracks const& resoTracks, aod::ResoCascades const& cascTracks) { if (additionalQAeventPlots) histos.fill(HIST("QAevent/hEvtCounterSameE"), 1.0); - fillHistograms(resoCollision, resoTracks, cascTracks); + fillHistograms(resoCollision, resoTracks, cascTracks); } void processMC(ResoMCCols::iterator const& resoCollision, @@ -919,74 +1050,90 @@ struct xi1530analysisqa { { if (!resoCollision.isInAfterAllCuts() || (std::abs(resoCollision.posZ()) > cZvertCutMC)) // MC event selection, all cuts missing vtx cut return; - fillHistograms(resoCollision, resoTracks, cascTracks); + fillHistograms(resoCollision, resoTracks, cascTracks); } - void processMCTrue(ResoMCCols::iterator const& resoCollision, aod::ResoMCParents& resoParents) + void processMCTrue(ResoMCCols::iterator const& resoCollision, aod::ResoMCParents const& resoParents) { auto multiplicity = resoCollision.cent(); - for (auto& part : resoParents) { // loop over all pre-filtered MC particles - if (std::abs(part.pdgCode()) != XiStarPID || std::abs(part.y()) >= 0.5) + for (const auto& part : resoParents) { // loop over all pre-filtered MC particles + if (std::abs(part.pdgCode()) != kXiStar || std::abs(part.y()) >= cfgRapidityCut) continue; - bool pass1 = std::abs(part.daughterPDG1()) == PionPID || std::abs(part.daughterPDG2()) == PionPID; - bool pass2 = std::abs(part.daughterPDG1()) == XiPID || std::abs(part.daughterPDG2()) == XiPID; + bool pass1 = std::abs(part.daughterPDG1()) == kPiPlus || std::abs(part.daughterPDG2()) == kPiPlus; + bool pass2 = std::abs(part.daughterPDG1()) == kXiMinus || std::abs(part.daughterPDG2()) == kXiMinus; if (!pass1 || !pass2) continue; - if (resoCollision.isVtxIn10()) // INEL10 + if (cIsPhysicalPrimaryMC && !part.isPhysicalPrimary()) + continue; + + if (part.pdgCode() > 0) // INELt0 or INEL + histos.fill(HIST("h3Xi1530Gen"), -1, part.pt(), multiplicity); + else + histos.fill(HIST("h3Xi1530GenAnti"), -1, part.pt(), multiplicity); + + if (resoCollision.isVtxIn10()) // vtx10 { if (part.pdgCode() > 0) - histos.fill(HIST("h3Xi1530Gen"), 0, part.pt(), multiplicity, kINEL10); + histos.fill(HIST("h3Xi1530Gen"), 0, part.pt(), multiplicity); else - histos.fill(HIST("h3Xi1530GenAnti"), 0, part.pt(), multiplicity, kINEL10); + histos.fill(HIST("h3Xi1530GenAnti"), 0, part.pt(), multiplicity); } - if (resoCollision.isVtxIn10() && resoCollision.isInSel8()) // INEL>10, vtx10 + if (resoCollision.isVtxIn10() && resoCollision.isInSel8()) // vtx10 && sel8 { if (part.pdgCode() > 0) - histos.fill(HIST("h3Xi1530Gen"), 1, part.pt(), multiplicity, kINELg010); + histos.fill(HIST("h3Xi1530Gen"), 1, part.pt(), multiplicity); else - histos.fill(HIST("h3Xi1530GenAnti"), 1, part.pt(), multiplicity, kINELg010); + histos.fill(HIST("h3Xi1530GenAnti"), 1, part.pt(), multiplicity); } - if (resoCollision.isVtxIn10() && resoCollision.isTriggerTVX()) // vtx10, TriggerTVX + if (resoCollision.isVtxIn10() && resoCollision.isTriggerTVX()) // vtx10 && TriggerTVX { if (part.pdgCode() > 0) - histos.fill(HIST("h3Xi1530Gen"), 2, part.pt(), multiplicity, kMCTruePS); + histos.fill(HIST("h3Xi1530Gen"), 2, part.pt(), multiplicity); else - histos.fill(HIST("h3Xi1530GenAnti"), 2, part.pt(), multiplicity, kMCTruePS); + histos.fill(HIST("h3Xi1530GenAnti"), 2, part.pt(), multiplicity); } if (resoCollision.isInAfterAllCuts()) // after all event selection { if (part.pdgCode() > 0) - histos.fill(HIST("h3Xi1530Gen"), 3, part.pt(), multiplicity, kAllType); + histos.fill(HIST("h3Xi1530Gen"), 3, part.pt(), multiplicity); else - histos.fill(HIST("h3Xi1530GenAnti"), 3, part.pt(), multiplicity, kAllType); + histos.fill(HIST("h3Xi1530GenAnti"), 3, part.pt(), multiplicity); } } } + void processDataMicro(aod::ResoCollision const& resoCollision, aod::ResoMicroTracks const& resomicrotracks, aod::ResoCascades const& cascTracks) + { + if (additionalQAeventPlots) + histos.fill(HIST("QAevent/hEvtCounterSameE"), 1.0); + fillHistograms(resoCollision, resomicrotracks, cascTracks); + } + using BinningTypeVtxZT0M = ColumnBinningPolicy; - void processME(aod::ResoCollisions const& resoCollisions, aod::ResoTracks const& resoTracks, aod::ResoCascades const& cascTracks) + void processMEMicro(aod::ResoCollisions const& resoCollisions, aod::ResoMicroTracks const& resomicrotracks, aod::ResoCascades const& cascTracks) { - auto tracksTuple = std::make_tuple(resoTracks, cascTracks); + auto tracksTuple = std::make_tuple(resomicrotracks, cascTracks); - BinningTypeVtxZT0M colBinning{{CfgVtxBins, CfgMultBins}, true}; - Pair pairs{colBinning, nEvtMixing, -1, resoCollisions, tracksTuple, &cache}; + BinningTypeVtxZT0M colBinning{{cfgVtxBins, cfgMultBins}, true}; + Pair pairs{colBinning, nEvtMixing, -1, resoCollisions, tracksTuple, &cache}; - for (auto& [collision1, tracks1, collision2, tracks2] : pairs) { + for (const auto& [collision1, tracks1, collision2, tracks2] : pairs) { if (additionalQAeventPlots) histos.fill(HIST("QAevent/hEvtCounterMixedE"), 1.0); - fillHistograms(collision1, tracks1, tracks2); + fillHistograms(collision1, tracks1, tracks2); } } - PROCESS_SWITCH(xi1530analysisqa, processData, "Process Event for Data", true); - PROCESS_SWITCH(xi1530analysisqa, processMC, "Process Event for MC (Reconstructed)", true); - PROCESS_SWITCH(xi1530analysisqa, processMCTrue, "Process Event for MC (Generated)", true); - PROCESS_SWITCH(xi1530analysisqa, processME, "Process EventMixing light without partition", true); + PROCESS_SWITCH(Xi1530Analysisqa, processData, "Process Event for Data", false); + PROCESS_SWITCH(Xi1530Analysisqa, processMC, "Process Event for MC (Reconstructed)", false); + PROCESS_SWITCH(Xi1530Analysisqa, processMCTrue, "Process Event for MC (Generated)", false); + PROCESS_SWITCH(Xi1530Analysisqa, processDataMicro, "Process Event for Data (MicroTrack for first pion)", true); + PROCESS_SWITCH(Xi1530Analysisqa, processMEMicro, "Process EventMixing", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{adaptAnalysisTask(cfgc)}; + return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From da6362dfed6c6e01c67c8a1714130e60e8f34fa4 Mon Sep 17 00:00:00 2001 From: Junlee Kim Date: Wed, 16 Apr 2025 09:05:23 +0100 Subject: [PATCH 1006/1650] [PWGLF] update v0v0 selections (#10856) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Strangeness/lambdalambda.cxx | 58 +++++++++++++----------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdalambda.cxx b/PWGLF/Tasks/Strangeness/lambdalambda.cxx index 6cfe10f7b3e..01fe793e2df 100644 --- a/PWGLF/Tasks/Strangeness/lambdalambda.cxx +++ b/PWGLF/Tasks/Strangeness/lambdalambda.cxx @@ -118,11 +118,16 @@ struct lambdalambda { Configurable cfgV0V0RapMax{"cfgV0V0RapMax", 0.5, "rapidity selection for V0V0"}; Configurable cfgV0V0Sel{"cfgV0V0Sel", false, "application of V0V0 selections"}; - Configurable cfgV0V0Radius{"cfgV0V0Radius", 1.0, "maximum radius of v0v0"}; - Configurable cfgV0V0CPA{"cfgV0V0CPA", 0.6, "minimum CPA of v0v0"}; - Configurable cfgV0V0Distance{"cfgV0V0Distance", 1, "minimum distance of v0v0"}; - Configurable cfgV0V0DCAR{"cfgV0V0DCAR", 1.0, "maximum DCA of v0v0 R"}; - Configurable cfgV0V0DCAZ{"cfgV0V0DCAZ", 1.0, "maximum DCA of v0v0 Z"}; + + Configurable cfgV0V0RadiusMin{"cfgV0V0RadiusMin", 1.0, "maximum radius of v0v0"}; + Configurable cfgV0V0CPAMin{"cfgV0V0CPAMin", 0.6, "minimum CPA of v0v0"}; + Configurable cfgV0V0DistanceMin{"cfgV0V0DistanceMin", 1, "minimum distance of v0v0"}; + Configurable cfgV0V0DCAMin{"cfgV0V0DCAMin", 1.0, "maximum DCA of v0v0 R"}; + + Configurable cfgV0V0RadiusMax{"cfgV0V0RadiusMax", 1.0, "maximum radius of v0v0"}; + Configurable cfgV0V0CPAMax{"cfgV0V0CPAMax", 0.6, "maximum CPA of v0v0"}; + Configurable cfgV0V0DistanceMax{"cfgV0V0DistanceMax", 1, "maximum distance of v0v0"}; + Configurable cfgV0V0DCAMax{"cfgV0V0DCAMax", 1.0, "maximum DCA of v0v0 R"}; Configurable cfgEffCor{"cfgEffCor", false, "flag to apply efficiency correction"}; Configurable cfgEffCorPath{"cfgEffCorPath", "", "path for pseudo efficiency correction"}; @@ -289,22 +294,28 @@ struct lambdalambda { template bool isSelectedV0V0(V01 const& v01, V02 const& v02) { - if (std::sqrt(getDCAofV0V0(v01, v02).perp2()) > cfgV0V0DCAR) + if (getDCAofV0V0(v01, v02) > cfgV0V0DCAMax) + return false; + if (getDCAofV0V0(v01, v02) < cfgV0V0DCAMin) return false; - if (getDCAofV0V0(v01, v02).z() > cfgV0V0DCAZ) + if (getCPA(v01, v02) > cfgV0V0CPAMax) return false; - if (getCPA(v01, v02) < cfgV0V0CPA) + if (getCPA(v01, v02) < cfgV0V0CPAMin) return false; - if (getDistance(v01, v02) > cfgV0V0Distance) + if (getDistance(v01, v02) > cfgV0V0DistanceMax) return false; - if (getRadius(v01, v02) > cfgV0V0Radius) + if (getDistance(v01, v02) < cfgV0V0DistanceMin) + return false; + if (getRadius(v01, v02) > cfgV0V0RadiusMax) + return false; + if (getRadius(v01, v02) < cfgV0V0RadiusMin) return false; return true; } template - ROOT::Math::XYZVector getDCAofV0V0(V01 const& v01, V02 const& v02) + float getDCAofV0V0(V01 const& v01, V02 const& v02) { ROOT::Math::XYZVector v01pos, v02pos, v01mom, v02mom; v01pos.SetXYZ(v01.x(), v01.y(), v01.z()); @@ -315,7 +326,7 @@ struct lambdalambda { ROOT::Math::XYZVector posdiff = v02pos - v01pos; ROOT::Math::XYZVector cross = v01mom.Cross(v02mom); ROOT::Math::XYZVector dcaVec = (posdiff.Dot(cross) / cross.Mag2()) * cross; - return dcaVec; + return std::sqrt(dcaVec.Mag2()); } template @@ -445,15 +456,13 @@ struct lambdalambda { histos.fill(HIST("Radius_V0V0_full"), RecoV0V0.M(), RecoV0V0.Pt(), getRadius(v01, v02), V01Tag + V02Tag); histos.fill(HIST("CPA_V0V0_full"), RecoV0V0.M(), RecoV0V0.Pt(), getCPA(v01, v02), V01Tag + V02Tag); histos.fill(HIST("Distance_V0V0_full"), RecoV0V0.M(), RecoV0V0.Pt(), getDistance(v01, v02), V01Tag + V02Tag); - histos.fill(HIST("DCAR_V0V0_full"), RecoV0V0.M(), RecoV0V0.Pt(), std::sqrt(getDCAofV0V0(v01, v02).perp2()), V01Tag + V02Tag); - histos.fill(HIST("DCAZ_V0V0_full"), RecoV0V0.M(), RecoV0V0.Pt(), getDCAofV0V0(v01, v02).z(), V01Tag + V02Tag); + histos.fill(HIST("DCA_V0V0_full"), RecoV0V0.M(), RecoV0V0.Pt(), getDCAofV0V0(v01, v02), V01Tag + V02Tag); if (isSelectedV0V0(v01, v02)) { histos.fill(HIST("Radius_V0V0_sel"), RecoV0V0.M(), RecoV0V0.Pt(), getRadius(v01, v02), V01Tag + V02Tag); histos.fill(HIST("CPA_V0V0_sel"), RecoV0V0.M(), RecoV0V0.Pt(), getCPA(v01, v02), V01Tag + V02Tag); histos.fill(HIST("Distance_V0V0_sel"), RecoV0V0.M(), RecoV0V0.Pt(), getDistance(v01, v02), V01Tag + V02Tag); - histos.fill(HIST("DCAR_V0V0_sel"), RecoV0V0.M(), RecoV0V0.Pt(), std::sqrt(getDCAofV0V0(v01, v02).perp2()), V01Tag + V02Tag); - histos.fill(HIST("DCAZ_V0V0_sel"), RecoV0V0.M(), RecoV0V0.Pt(), getDCAofV0V0(v01, v02).z(), V01Tag + V02Tag); + histos.fill(HIST("DCA_V0V0_sel"), RecoV0V0.M(), RecoV0V0.Pt(), getDCAofV0V0(v01, v02), V01Tag + V02Tag); IsSelected = true; } @@ -461,16 +470,13 @@ struct lambdalambda { histos.fill(HIST("h_InvMass_same"), RecoV0V0.M(), RecoV0V0.Pt(), centrality, V01Tag + V02Tag); if (cfgV0V0Sel && isSelectedV0V0(v01, v02)) { histos.fill(HIST("h_InvMass_same_sel"), RecoV0V0.M(), RecoV0V0.Pt(), centrality, V01Tag + V02Tag); - } - if (cfgRotBkg) { - for (int nr = 0; nr < cfgNRotBkg; nr++) { - auto RanPhi = rn->Uniform(o2::constants::math::PI * 5.0 / 6.0, o2::constants::math::PI * 7.0 / 6.0); - RanPhi += RecoV02.Phi(); - RecoV02Rot = ROOT::Math::PxPyPzMVector(RecoV02.Pt() * std::cos(RanPhi), RecoV02.Pt() * std::sin(RanPhi), RecoV02.Pz(), RecoV02.M()); - RecoV0V0Rot = RecoV01 + RecoV02Rot; - histos.fill(HIST("h_InvMass_rot"), RecoV0V0Rot.M(), RecoV0V0Rot.Pt(), centrality, V01Tag + V02Tag); - if (cfgV0V0Sel && isSelectedV0V0(v01, v02)) { - histos.fill(HIST("h_InvMass_rot_sel"), RecoV0V0Rot.M(), RecoV0V0Rot.Pt(), centrality, V01Tag + V02Tag); + if (cfgRotBkg) { + for (int nr = 0; nr < cfgNRotBkg; nr++) { + auto RanPhi = rn->Uniform(o2::constants::math::PI * 5.0 / 6.0, o2::constants::math::PI * 7.0 / 6.0); + RanPhi += RecoV02.Phi(); + RecoV02Rot = ROOT::Math::PxPyPzMVector(RecoV02.Pt() * std::cos(RanPhi), RecoV02.Pt() * std::sin(RanPhi), RecoV02.Pz(), RecoV02.M()); + RecoV0V0Rot = RecoV01 + RecoV02Rot; + histos.fill(HIST("h_InvMass_rot"), RecoV0V0Rot.M(), RecoV0V0Rot.Pt(), centrality, V01Tag + V02Tag); } } } From 398e726920c5e666062457b759d2a6afcccdeb59 Mon Sep 17 00:00:00 2001 From: nkaratze Date: Wed, 16 Apr 2025 10:06:49 +0200 Subject: [PATCH 1007/1650] [PWGLF] v0ptinvmassplots Small fixes (#10808) Co-authored-by: nkaratze --- PWGLF/Tasks/Strangeness/v0ptinvmassplots.cxx | 397 ++++++++++--------- 1 file changed, 204 insertions(+), 193 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/v0ptinvmassplots.cxx b/PWGLF/Tasks/Strangeness/v0ptinvmassplots.cxx index 18e83136db1..b5f014ffaba 100644 --- a/PWGLF/Tasks/Strangeness/v0ptinvmassplots.cxx +++ b/PWGLF/Tasks/Strangeness/v0ptinvmassplots.cxx @@ -67,7 +67,7 @@ struct V0PtInvMassPlots { Configurable nSigmaTPCProton{"nSigmaTPCProton", 4, "nSigmaTPCProton"}; Configurable compv0masscut{"compv0masscut", 0.01, "CompetitiveV0masscut (GeV)"}; Configurable etadau{"etadau", 0.8, "Eta Daughters"}; - Configurable rapiditycutGen{"rapiditycutGen", 0.5, "V0 Rapidity Window GenMC"}; + Configurable rapidityCut{"rapidityCut", 0.5, "V0 Rapidity Window GenMC"}; // Configurable Kaonsh Topological Cuts (best cuts determined by v0topologicalcuts task) Configurable kaonshSettingdcav0dau{"kaonshSettingdcav0dau", 0.3, "DCA V0 Daughters"}; @@ -160,8 +160,10 @@ struct V0PtInvMassPlots { rPtAnalysis.add("hVertexZRec", "hVertexZRec", {HistType::kTH1F, {vertexZAxis}}); rPtAnalysis.add("hArmenterosPodolanskiPlot", "hArmenterosPodolanskiPlot", {HistType::kTH2F, {{armenterosasymAxis}, {armenterosQtAxis}}}); rPtAnalysis.add("hV0EtaDaughters", "hV0EtaDaughters", {HistType::kTH1F, {{nBins, -1.2f, 1.2f}}}); + rPtAnalysis.add("V0Rapidity", "V0Rapidity", {HistType::kTH1F, {{nBins, -10.0f, 10.0f}}}); // Generated Pt Spectrums For Feeddown + rPtAnalysis.add("GenParticleRapidity", "GenParticleRapidity", {HistType::kTH1F, {{nBins, -10.0f, 10.0f}}}); rPtAnalysis.add("hXiMinusGeneratedPtSpectrum", "hXiMinusGeneratedPtSpectrum", {HistType::kTH1F, {lambdaPtAxis}}); rPtAnalysis.add("hXiZeroGeneratedPtSpectrum", "hXiZeroGeneratedPtSpectrum", {HistType::kTH1F, {lambdaPtAxis}}); rPtAnalysis.add("hOmegaGeneratedPtSpectrum", "hOmegaGeneratedPtSpectrum", {HistType::kTH1F, {lambdaPtAxis}}); @@ -249,46 +251,49 @@ struct V0PtInvMassPlots { aod::McParticles const& mcParticles) { for (const auto& mcParticle : mcParticles) { - if (std::abs(mcParticle.y()) < rapiditycutGen) { - if (mcParticle.pdgCode() == kK0Short) // kzero matched - { - rPtAnalysis.fill(HIST("hK0ShGeneratedPtSpectrum"), mcParticle.pt()); - } - if (mcParticle.pdgCode() == kLambda0) // lambda matched - { - rPtAnalysis.fill(HIST("hLambdaGeneratedPtSpectrum"), mcParticle.pt()); - } - if (mcParticle.pdgCode() == kLambda0Bar) // antilambda matched - { - rPtAnalysis.fill(HIST("hAntilambdaGeneratedPtSpectrum"), mcParticle.pt()); - } - if (mcParticle.pdgCode() == kXiMinus) // Xi Minus matched - { - rPtAnalysis.fill(HIST("hXiMinusGeneratedPtSpectrum"), mcParticle.pt()); - } - if (mcParticle.pdgCode() == kXi0) // Xi Zero matched - { - rPtAnalysis.fill(HIST("hXiZeroGeneratedPtSpectrum"), mcParticle.pt()); - } - if (mcParticle.pdgCode() == kOmegaMinus) // Omega matched - { - rPtAnalysis.fill(HIST("hOmegaGeneratedPtSpectrum"), mcParticle.pt()); - } - if (mcParticle.pdgCode() == kXiPlusBar) // Xi Plus matched - { - rPtAnalysis.fill(HIST("hXiPlusGeneratedPtSpectrum"), mcParticle.pt()); - } - if (mcParticle.pdgCode() == -kXi0) // Anti-Xi Zero matched - { - rPtAnalysis.fill(HIST("hAntiXiZeroGeneratedPtSpectrum"), mcParticle.pt()); - } - if (mcParticle.pdgCode() == kOmegaPlusBar) // Anti-Omega matched - { - rPtAnalysis.fill(HIST("hAntiOmegaGeneratedPtSpectrum"), mcParticle.pt()); - } - if (mcParticle.pdgCode() == kPhi) // Phi matched - { - rPtAnalysis.fill(HIST("hPhiGeneratedPtSpectrum"), mcParticle.pt()); + if (std::abs(mcParticle.y()) < rapidityCut) { + if (mcParticle.isPhysicalPrimary()) { + rPtAnalysis.fill(HIST("GenParticleRapidity"), mcParticle.y()); + if (mcParticle.pdgCode() == kK0Short) // kzero matched + { + rPtAnalysis.fill(HIST("hK0ShGeneratedPtSpectrum"), mcParticle.pt()); + } + if (mcParticle.pdgCode() == kLambda0) // lambda matched + { + rPtAnalysis.fill(HIST("hLambdaGeneratedPtSpectrum"), mcParticle.pt()); + } + if (mcParticle.pdgCode() == kLambda0Bar) // antilambda matched + { + rPtAnalysis.fill(HIST("hAntilambdaGeneratedPtSpectrum"), mcParticle.pt()); + } + if (mcParticle.pdgCode() == kXiMinus) // Xi Minus matched + { + rPtAnalysis.fill(HIST("hXiMinusGeneratedPtSpectrum"), mcParticle.pt()); + } + if (mcParticle.pdgCode() == kXi0) // Xi Zero matched + { + rPtAnalysis.fill(HIST("hXiZeroGeneratedPtSpectrum"), mcParticle.pt()); + } + if (mcParticle.pdgCode() == kOmegaMinus) // Omega matched + { + rPtAnalysis.fill(HIST("hOmegaGeneratedPtSpectrum"), mcParticle.pt()); + } + if (mcParticle.pdgCode() == kXiPlusBar) // Xi Plus matched + { + rPtAnalysis.fill(HIST("hXiPlusGeneratedPtSpectrum"), mcParticle.pt()); + } + if (mcParticle.pdgCode() == -kXi0) // Anti-Xi Zero matched + { + rPtAnalysis.fill(HIST("hAntiXiZeroGeneratedPtSpectrum"), mcParticle.pt()); + } + if (mcParticle.pdgCode() == kOmegaPlusBar) // Anti-Omega matched + { + rPtAnalysis.fill(HIST("hAntiOmegaGeneratedPtSpectrum"), mcParticle.pt()); + } + if (mcParticle.pdgCode() == kPhi) // Anti-Omega matched + { + rPtAnalysis.fill(HIST("hPhiGeneratedPtSpectrum"), mcParticle.pt()); + } } } } @@ -324,112 +329,115 @@ struct V0PtInvMassPlots { // Checking that the V0 is a true K0s/Lambdas/Antilambdas and then filling the parameter histograms and the invariant mass plots for different cuts (which are taken from namespace) if (v0.has_mcParticle()) { auto v0mcParticle = v0.mcParticle(); - if (std::abs(v0.posTrack_as().eta()) < etadau && std::abs(v0.negTrack_as().eta()) < etadau) { // daughters pseudorapidity cut - rPtAnalysis.fill(HIST("hV0EtaDaughters"), v0.negTrack_as().eta()); - rPtAnalysis.fill(HIST("hV0EtaDaughters"), v0.posTrack_as().eta()); - if (kzeroAnalysis == true) { - if (v0mcParticle.pdgCode() == kK0Short) { // kzero matched - rPtAnalysis.fill(HIST("hMassK0ShortAll"), v0.mK0Short()); - rPtAnalysis.fill(HIST("hK0ShortPtSpectrumBeforeCuts"), v0.pt()); - if (std::abs(v0.mLambda() - mLambdaPDG) > compv0masscut && std::abs(v0.mAntiLambda() - mLambdaPDG) > compv0masscut) { // Kzero competitive v0 mass cut (cut out Lambdas and Anti-Lambdas) - // Implementing best kzero topological cuts - if (v0.v0cosPA() > kaonshSettingcosPA && v0.dcaV0daughters() < kaonshSettingdcav0dau && v0.v0radius() > kaonshSettingradius && std::abs(v0.dcapostopv()) > kaonshSettingdcapostopv && std::abs(v0.dcanegtopv()) > kaonshSettingdcanegtopv) { - rPtAnalysis.fill(HIST("hMassK0ShortAllAfterCuts"), v0.mK0Short()); - rPtAnalysis.fill(HIST("hK0ShortReconstructedPtSpectrum"), v0.pt()); - rPtAnalysis.fill(HIST("hK0shEtaDaughters"), v0.negTrack_as().eta()); - rPtAnalysis.fill(HIST("hK0shEtaDaughters"), v0.posTrack_as().eta()); - rPtAnalysis.fill(HIST("hK0shNegDaughterPt"), v0.negTrack_as().pt()); // Neg Daughter Pt - rPtAnalysis.fill(HIST("hK0shPosDaughterPt"), v0.posTrack_as().pt()); // Pos Daughter Pt - if (v0mcParticle.isPhysicalPrimary()) { - for (int i = 0; i < nmaxHistograms; i++) { - if (kaonptedgevalues[i] <= v0.pt() && v0.pt() < kaonptedgevalues[i + 1]) { // finding v0s with pt within the range of our bin edges - pthistos::kaonPt[i]->Fill(v0.mK0Short()); // filling the k0s namespace histograms + if (std::abs(v0mcParticle.y()) < rapidityCut) { + rPtAnalysis.fill(HIST("V0Rapidity"), v0.y()); + if (std::abs(v0.posTrack_as().eta()) < etadau && std::abs(v0.negTrack_as().eta()) < etadau) { // daughters pseudorapidityCut cut + rPtAnalysis.fill(HIST("hV0EtaDaughters"), v0.negTrack_as().eta()); + rPtAnalysis.fill(HIST("hV0EtaDaughters"), v0.posTrack_as().eta()); + if (kzeroAnalysis == true) { + if (v0mcParticle.pdgCode() == kK0Short) { // kzero matched + rPtAnalysis.fill(HIST("hMassK0ShortAll"), v0.mK0Short()); + rPtAnalysis.fill(HIST("hK0ShortPtSpectrumBeforeCuts"), v0.pt()); + if (std::abs(v0.mLambda() - mLambdaPDG) > compv0masscut && std::abs(v0.mAntiLambda() - mLambdaPDG) > compv0masscut) { // Kzero competitive v0 mass cut (cut out Lambdas and Anti-Lambdas) + // Implementing best kzero topological cuts + if (v0.v0cosPA() > kaonshSettingcosPA && v0.dcaV0daughters() < kaonshSettingdcav0dau && v0.v0radius() > kaonshSettingradius && std::abs(v0.dcapostopv()) > kaonshSettingdcapostopv && std::abs(v0.dcanegtopv()) > kaonshSettingdcanegtopv) { + rPtAnalysis.fill(HIST("hMassK0ShortAllAfterCuts"), v0.mK0Short()); + rPtAnalysis.fill(HIST("hK0ShortReconstructedPtSpectrum"), v0.pt()); + rPtAnalysis.fill(HIST("hK0shEtaDaughters"), v0.negTrack_as().eta()); + rPtAnalysis.fill(HIST("hK0shEtaDaughters"), v0.posTrack_as().eta()); + rPtAnalysis.fill(HIST("hK0shNegDaughterPt"), v0.negTrack_as().pt()); // Neg Daughter Pt + rPtAnalysis.fill(HIST("hK0shPosDaughterPt"), v0.posTrack_as().pt()); // Pos Daughter Pt + if (v0mcParticle.isPhysicalPrimary()) { + for (int i = 0; i < nmaxHistograms; i++) { + if (kaonptedgevalues[i] <= v0.pt() && v0.pt() < kaonptedgevalues[i + 1]) { // finding v0s with pt within the range of our bin edges + pthistos::kaonPt[i]->Fill(v0.mK0Short()); // filling the k0s namespace histograms + } } } } } } } - } - // lambda analysis - if (lambdaAnalysis == true) { - if (v0mcParticle.pdgCode() == kLambda0) { // lambda matched - rPtAnalysis.fill(HIST("hMassLambdaAll"), v0.mLambda()); - rPtAnalysis.fill(HIST("hLambdaPtSpectrumBeforeCuts"), v0.pt()); - if (std::abs(v0.mK0Short() - mK0shPDG) > compv0masscut) { // lambda competitive v0 mass cut (cut out Kaons) - // Implementing best lambda cuts - if (v0.v0cosPA() > lambdaSettingcosPA && v0.dcaV0daughters() < lambdaSettingdcav0dau && v0.v0radius() > lambdaSettingradius && std::abs(v0.dcapostopv()) > lambdaSettingdcapostopv && std::abs(v0.dcanegtopv()) > lambdaSettingdcanegtopv) { - rPtAnalysis.fill(HIST("hMassLambdaAllAfterCuts"), v0.mLambda()); - rPtAnalysis.fill(HIST("hLambdaReconstructedPtSpectrum"), v0.pt()); - rPtAnalysis.fill(HIST("hLambdaEtaDaughters"), v0.negTrack_as().eta()); - rPtAnalysis.fill(HIST("hLambdaEtaDaughters"), v0.posTrack_as().eta()); - rPtAnalysis.fill(HIST("hLambdaNegDaughterPt"), v0.negTrack_as().pt()); // Neg Daughter Pt - rPtAnalysis.fill(HIST("hLambdaPosDaughterPt"), v0.posTrack_as().pt()); // Pos Daughter Pt - if (v0mcParticle.isPhysicalPrimary()) { - for (int i = 0; i < nmaxHistograms; i++) { - if (lambdaptedgevalues[i] <= v0.pt() && v0.pt() < lambdaptedgevalues[i + 1]) { - pthistos::lambdaPt[i]->Fill(v0.mLambda()); + // lambda analysis + if (lambdaAnalysis == true) { + if (v0mcParticle.pdgCode() == kLambda0) { // lambda matched + rPtAnalysis.fill(HIST("hMassLambdaAll"), v0.mLambda()); + rPtAnalysis.fill(HIST("hLambdaPtSpectrumBeforeCuts"), v0.pt()); + if (std::abs(v0.mK0Short() - mK0shPDG) > compv0masscut) { // lambda competitive v0 mass cut (cut out Kaons) + // Implementing best lambda cuts + if (v0.v0cosPA() > lambdaSettingcosPA && v0.dcaV0daughters() < lambdaSettingdcav0dau && v0.v0radius() > lambdaSettingradius && std::abs(v0.dcapostopv()) > lambdaSettingdcapostopv && std::abs(v0.dcanegtopv()) > lambdaSettingdcanegtopv) { + rPtAnalysis.fill(HIST("hMassLambdaAllAfterCuts"), v0.mLambda()); + rPtAnalysis.fill(HIST("hLambdaReconstructedPtSpectrum"), v0.pt()); + rPtAnalysis.fill(HIST("hLambdaEtaDaughters"), v0.negTrack_as().eta()); + rPtAnalysis.fill(HIST("hLambdaEtaDaughters"), v0.posTrack_as().eta()); + rPtAnalysis.fill(HIST("hLambdaNegDaughterPt"), v0.negTrack_as().pt()); // Neg Daughter Pt + rPtAnalysis.fill(HIST("hLambdaPosDaughterPt"), v0.posTrack_as().pt()); // Pos Daughter Pt + if (v0mcParticle.isPhysicalPrimary()) { + for (int i = 0; i < nmaxHistograms; i++) { + if (lambdaptedgevalues[i] <= v0.pt() && v0.pt() < lambdaptedgevalues[i + 1]) { + pthistos::lambdaPt[i]->Fill(v0.mLambda()); + } } } - } - if (!v0mcParticle.isPhysicalPrimary()) { - auto v0mothers = v0mcParticle.mothers_as(); // Get mothers - if (!v0mothers.empty()) { - auto& v0mcParticleMother = v0mothers.front(); // First mother - if (v0mcParticleMother.pdgCode() == kXiMinus) // Xi Minus Mother Matched - { - rFeeddownMatrices.fill(HIST("hLambdaXiMinusFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); - } - if (v0mcParticleMother.pdgCode() == kXi0) // Xi Zero Mother Matched - { - rFeeddownMatrices.fill(HIST("hLambdaXiZeroFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); - } - if (v0mcParticleMother.pdgCode() == kOmegaMinus) // Omega Mother Matched - { - rFeeddownMatrices.fill(HIST("hLambdaOmegaFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + if (!v0mcParticle.isPhysicalPrimary()) { + auto v0mothers = v0mcParticle.mothers_as(); // Get mothers + if (!v0mothers.empty()) { + auto& v0mcParticleMother = v0mothers.front(); // First mother + if (v0mcParticleMother.pdgCode() == kXiMinus) // Xi Minus Mother Matched + { + rFeeddownMatrices.fill(HIST("hLambdaXiMinusFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + } + if (v0mcParticleMother.pdgCode() == kXi0) // Xi Zero Mother Matched + { + rFeeddownMatrices.fill(HIST("hLambdaXiZeroFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + } + if (v0mcParticleMother.pdgCode() == kOmegaMinus) // Omega Mother Matched + { + rFeeddownMatrices.fill(HIST("hLambdaOmegaFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + } } } } } } } - } - // antilambda analysis - if (antiLambdaAnalysis == true) { - if (v0mcParticle.pdgCode() == kLambda0Bar) { // antilambda matched - rPtAnalysis.fill(HIST("hMassAntilambdaAll"), v0.mAntiLambda()); - rPtAnalysis.fill(HIST("hantilambdaPtSpectrumBeforeCuts"), v0.pt()); - if (std::abs(v0.mK0Short() - mK0shPDG) > compv0masscut) { // antilambda competitive v0 mass cut (cut out Kaons) - // Implementing best antilambda cuts - if (v0.v0cosPA() > antilambdaSettingcosPA && v0.dcaV0daughters() < antilambdaSettingdcav0dau && v0.v0radius() > antilambdaSettingradius && std::abs(v0.dcapostopv()) > antilambdaSettingdcapostopv && std::abs(v0.dcanegtopv()) > antilambdaSettingdcanegtopv) { - rPtAnalysis.fill(HIST("hMassAntilambdaAllAfterCuts"), v0.mAntiLambda()); - rPtAnalysis.fill(HIST("hAntilambdaReconstructedPtSpectrum"), v0.pt()); - rPtAnalysis.fill(HIST("hAntiLambdaEtaDaughters"), v0.negTrack_as().eta()); - rPtAnalysis.fill(HIST("hAntiLambdaEtaDaughters"), v0.posTrack_as().eta()); - rPtAnalysis.fill(HIST("hAntiLambdaNegDaughterPt"), v0.negTrack_as().pt()); // Neg Daughter Pt - rPtAnalysis.fill(HIST("hAntiLambdaPosDaughterPt"), v0.posTrack_as().pt()); // Pos Daughter Pt - if (v0mcParticle.isPhysicalPrimary()) { - for (int i = 0; i < nmaxHistograms; i++) { - if (antilambdaPtedgevalues[i] <= v0.pt() && v0.pt() < antilambdaPtedgevalues[i + 1]) { - pthistos::antilambdaPt[i]->Fill(v0.mAntiLambda()); + // antilambda analysis + if (antiLambdaAnalysis == true) { + if (v0mcParticle.pdgCode() == kLambda0Bar) { // antilambda matched + rPtAnalysis.fill(HIST("hMassAntilambdaAll"), v0.mAntiLambda()); + rPtAnalysis.fill(HIST("hantilambdaPtSpectrumBeforeCuts"), v0.pt()); + if (std::abs(v0.mK0Short() - mK0shPDG) > compv0masscut) { // antilambda competitive v0 mass cut (cut out Kaons) + // Implementing best antilambda cuts + if (v0.v0cosPA() > antilambdaSettingcosPA && v0.dcaV0daughters() < antilambdaSettingdcav0dau && v0.v0radius() > antilambdaSettingradius && std::abs(v0.dcapostopv()) > antilambdaSettingdcapostopv && std::abs(v0.dcanegtopv()) > antilambdaSettingdcanegtopv) { + rPtAnalysis.fill(HIST("hMassAntilambdaAllAfterCuts"), v0.mAntiLambda()); + rPtAnalysis.fill(HIST("hAntilambdaReconstructedPtSpectrum"), v0.pt()); + rPtAnalysis.fill(HIST("hAntiLambdaEtaDaughters"), v0.negTrack_as().eta()); + rPtAnalysis.fill(HIST("hAntiLambdaEtaDaughters"), v0.posTrack_as().eta()); + rPtAnalysis.fill(HIST("hAntiLambdaNegDaughterPt"), v0.negTrack_as().pt()); // Neg Daughter Pt + rPtAnalysis.fill(HIST("hAntiLambdaPosDaughterPt"), v0.posTrack_as().pt()); // Pos Daughter Pt + if (v0mcParticle.isPhysicalPrimary()) { + for (int i = 0; i < nmaxHistograms; i++) { + if (antilambdaPtedgevalues[i] <= v0.pt() && v0.pt() < antilambdaPtedgevalues[i + 1]) { + pthistos::antilambdaPt[i]->Fill(v0.mAntiLambda()); + } } } - } - if (!v0mcParticle.isPhysicalPrimary()) { - auto v0mothers = v0mcParticle.mothers_as(); // Get mothers - if (!v0mothers.empty()) { - auto& v0mcParticleMother = v0mothers.front(); // First mother - if (v0mcParticleMother.pdgCode() == kXiPlusBar) // Xi Plus Mother Matched - { - rFeeddownMatrices.fill(HIST("hAntiLambdaXiPlusFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); - } - if (v0mcParticleMother.pdgCode() == -kXi0) // Anti-Xi Zero Mother Matched - { - rFeeddownMatrices.fill(HIST("hAntiLambdaAntiXiZeroFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); - } - if (v0mcParticleMother.pdgCode() == kOmegaPlusBar) // Anti-Omega (minus) Mother Matched - { - rFeeddownMatrices.fill(HIST("hAntiLambdaAntiOmegaFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + if (!v0mcParticle.isPhysicalPrimary()) { + auto v0mothers = v0mcParticle.mothers_as(); // Get mothers + if (!v0mothers.empty()) { + auto& v0mcParticleMother = v0mothers.front(); // First mother + if (v0mcParticleMother.pdgCode() == kXiPlusBar) // Xi Plus Mother Matched + { + rFeeddownMatrices.fill(HIST("hAntiLambdaXiPlusFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + } + if (v0mcParticleMother.pdgCode() == -kXi0) // Anti-Xi Zero Mother Matched + { + rFeeddownMatrices.fill(HIST("hAntiLambdaAntiXiZeroFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + } + if (v0mcParticleMother.pdgCode() == kOmegaPlusBar) // Anti-Omega (minus) Mother Matched + { + rFeeddownMatrices.fill(HIST("hAntiLambdaAntiOmegaFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + } } } } @@ -476,78 +484,81 @@ struct V0PtInvMassPlots { double aValue = (plpos - plneg) / (plpos + plneg); rPtAnalysis.fill(HIST("hArmenterosPodolanskiPlot"), aValue, qValue); rPtAnalysis.fill(HIST("hVertexZRec"), collision.posZ()); - if (std::abs(v0.posTrack_as().eta()) < etadau && std::abs(v0.negTrack_as().eta()) < etadau) { // daughters pseudorapidity cut - rPtAnalysis.fill(HIST("hV0EtaDaughters"), v0.negTrack_as().eta()); - rPtAnalysis.fill(HIST("hV0EtaDaughters"), v0.posTrack_as().eta()); - // kzero analysis - if (kzeroAnalysis == true) { - // Filling the five Kzero invariant mass plots for different cuts (which are taken from namespace), for full explanation see the first kzero cut filling in the MC process - rPtAnalysis.fill(HIST("hMassK0ShortAll"), v0.mK0Short()); - if (std::abs(v0.mLambda() - mLambdaPDG) > compv0masscut && std::abs(v0.mAntiLambda() - mLambdaPDG) > compv0masscut) { // antilambda competitive v0 mass cut (cut out Lambdas and Anti-Lambdas) - // Implementing best kzero cuts - if (std::abs(posDaughterTrack.tpcNSigmaPi()) < nSigmaTPCPion && std::abs(negDaughterTrack.tpcNSigmaPi()) < nSigmaTPCPion) { // TPC PID on daughter pions - rPtAnalysis.fill(HIST("hNSigmaPosPiFromK0s"), posDaughterTrack.tpcNSigmaPi(), posDaughterTrack.tpcInnerParam()); - rPtAnalysis.fill(HIST("hNSigmaNegPiFromK0s"), negDaughterTrack.tpcNSigmaPi(), negDaughterTrack.tpcInnerParam()); - if (v0.v0cosPA() > kaonshSettingcosPA && v0.dcaV0daughters() < kaonshSettingdcav0dau && v0.v0radius() > kaonshSettingradius && std::abs(v0.dcapostopv()) > kaonshSettingdcapostopv && std::abs(v0.dcanegtopv()) > kaonshSettingdcanegtopv) { - rPtAnalysis.fill(HIST("hMassK0ShortAllAfterCuts"), v0.mK0Short()); - rPtAnalysis.fill(HIST("hK0shEtaDaughters"), v0.negTrack_as().eta()); - rPtAnalysis.fill(HIST("hK0shEtaDaughters"), v0.posTrack_as().eta()); - rPtAnalysis.fill(HIST("hArmenterosPodolanskiPlotK0Short"), aValue, qValue); - rPtAnalysis.fill(HIST("hK0shNegDaughterPt"), v0.negTrack_as().pt()); // Neg Daughter Pt - rPtAnalysis.fill(HIST("hK0shPosDaughterPt"), v0.posTrack_as().pt()); // Pos Daughter Pt - for (int i = 0; i < nmaxHistograms; i++) { - if (kaonptedgevalues[i] <= v0.pt() && v0.pt() < kaonptedgevalues[i + 1]) { - pthistos::kaonPt[i]->Fill(v0.mK0Short()); + if (std::abs(v0.y()) < rapidityCut) { + rPtAnalysis.fill(HIST("V0Rapidity"), v0.y()); + if (std::abs(v0.posTrack_as().eta()) < etadau && std::abs(v0.negTrack_as().eta()) < etadau) { // daughters pseudorapidityCut cut + rPtAnalysis.fill(HIST("hV0EtaDaughters"), v0.negTrack_as().eta()); + rPtAnalysis.fill(HIST("hV0EtaDaughters"), v0.posTrack_as().eta()); + // kzero analysis + if (kzeroAnalysis == true) { + // Filling the five Kzero invariant mass plots for different cuts (which are taken from namespace), for full explanation see the first kzero cut filling in the MC process + rPtAnalysis.fill(HIST("hMassK0ShortAll"), v0.mK0Short()); + if (std::abs(v0.mLambda() - mLambdaPDG) > compv0masscut && std::abs(v0.mAntiLambda() - mLambdaPDG) > compv0masscut) { // antilambda competitive v0 mass cut (cut out Lambdas and Anti-Lambdas) + // Implementing best kzero cuts + if (std::abs(posDaughterTrack.tpcNSigmaPi()) < nSigmaTPCPion && std::abs(negDaughterTrack.tpcNSigmaPi()) < nSigmaTPCPion) { // TPC PID on daughter pions + rPtAnalysis.fill(HIST("hNSigmaPosPiFromK0s"), posDaughterTrack.tpcNSigmaPi(), posDaughterTrack.tpcInnerParam()); + rPtAnalysis.fill(HIST("hNSigmaNegPiFromK0s"), negDaughterTrack.tpcNSigmaPi(), negDaughterTrack.tpcInnerParam()); + if (v0.v0cosPA() > kaonshSettingcosPA && v0.dcaV0daughters() < kaonshSettingdcav0dau && v0.v0radius() > kaonshSettingradius && std::abs(v0.dcapostopv()) > kaonshSettingdcapostopv && std::abs(v0.dcanegtopv()) > kaonshSettingdcanegtopv) { + rPtAnalysis.fill(HIST("hMassK0ShortAllAfterCuts"), v0.mK0Short()); + rPtAnalysis.fill(HIST("hK0shEtaDaughters"), v0.negTrack_as().eta()); + rPtAnalysis.fill(HIST("hK0shEtaDaughters"), v0.posTrack_as().eta()); + rPtAnalysis.fill(HIST("hArmenterosPodolanskiPlotK0Short"), aValue, qValue); + rPtAnalysis.fill(HIST("hK0shNegDaughterPt"), v0.negTrack_as().pt()); // Neg Daughter Pt + rPtAnalysis.fill(HIST("hK0shPosDaughterPt"), v0.posTrack_as().pt()); // Pos Daughter Pt + for (int i = 0; i < nmaxHistograms; i++) { + if (kaonptedgevalues[i] <= v0.pt() && v0.pt() < kaonptedgevalues[i + 1]) { + pthistos::kaonPt[i]->Fill(v0.mK0Short()); + } } } } } } - } - // lambda analysis - if (lambdaAnalysis == true) { - // Filling the five lambda invariant mass plots for different cuts (which are taken from namespace), for full explanation see the first kzero cut filling in the MC process - rPtAnalysis.fill(HIST("hMassLambdaAll"), v0.mLambda()); - if (std::abs(v0.mK0Short() - mK0shPDG) > compv0masscut) { // lambda competitive v0 mass cut (cut out Kaons) - if (std::abs(posDaughterTrack.tpcNSigmaPr()) < nSigmaTPCProton && std::abs(negDaughterTrack.tpcNSigmaPi()) < nSigmaTPCPion) { // TPC PID on daughter pion and proton for Lambda - rPtAnalysis.fill(HIST("hNSigmaPosProtonFromLambda"), posDaughterTrack.tpcNSigmaPr(), posDaughterTrack.tpcInnerParam()); - rPtAnalysis.fill(HIST("hNSigmaNegPionFromLambda"), negDaughterTrack.tpcNSigmaPi(), negDaughterTrack.tpcInnerParam()); - // Implementing best lambda cuts - if (v0.v0cosPA() > lambdaSettingcosPA && v0.dcaV0daughters() < lambdaSettingdcav0dau && v0.v0radius() > lambdaSettingradius && std::abs(v0.dcapostopv()) > lambdaSettingdcapostopv && std::abs(v0.dcanegtopv()) > lambdaSettingdcanegtopv) { - rPtAnalysis.fill(HIST("hMassLambdaAllAfterCuts"), v0.mLambda()); - rPtAnalysis.fill(HIST("hLambdaEtaDaughters"), v0.negTrack_as().eta()); - rPtAnalysis.fill(HIST("hLambdaEtaDaughters"), v0.posTrack_as().eta()); - rPtAnalysis.fill(HIST("hArmenterosPodolanskiPlotLambda"), aValue, qValue); - rPtAnalysis.fill(HIST("hLambdaNegDaughterPt"), v0.negTrack_as().pt()); // Neg Daughter Pt - rPtAnalysis.fill(HIST("hLambdaPosDaughterPt"), v0.posTrack_as().pt()); // Pos Daughter Pt - for (int i = 0; i < nmaxHistograms; i++) { - if (lambdaptedgevalues[i] <= v0.pt() && v0.pt() < lambdaptedgevalues[i + 1]) { - pthistos::lambdaPt[i]->Fill(v0.mLambda()); + // lambda analysis + if (lambdaAnalysis == true) { + // Filling the five lambda invariant mass plots for different cuts (which are taken from namespace), for full explanation see the first kzero cut filling in the MC process + rPtAnalysis.fill(HIST("hMassLambdaAll"), v0.mLambda()); + if (std::abs(v0.mK0Short() - mK0shPDG) > compv0masscut) { // lambda competitive v0 mass cut (cut out Kaons) + if (std::abs(posDaughterTrack.tpcNSigmaPr()) < nSigmaTPCProton && std::abs(negDaughterTrack.tpcNSigmaPi()) < nSigmaTPCPion) { // TPC PID on daughter pion and proton for Lambda + rPtAnalysis.fill(HIST("hNSigmaPosProtonFromLambda"), posDaughterTrack.tpcNSigmaPr(), posDaughterTrack.tpcInnerParam()); + rPtAnalysis.fill(HIST("hNSigmaNegPionFromLambda"), negDaughterTrack.tpcNSigmaPi(), negDaughterTrack.tpcInnerParam()); + // Implementing best lambda cuts + if (v0.v0cosPA() > lambdaSettingcosPA && v0.dcaV0daughters() < lambdaSettingdcav0dau && v0.v0radius() > lambdaSettingradius && std::abs(v0.dcapostopv()) > lambdaSettingdcapostopv && std::abs(v0.dcanegtopv()) > lambdaSettingdcanegtopv) { + rPtAnalysis.fill(HIST("hMassLambdaAllAfterCuts"), v0.mLambda()); + rPtAnalysis.fill(HIST("hLambdaEtaDaughters"), v0.negTrack_as().eta()); + rPtAnalysis.fill(HIST("hLambdaEtaDaughters"), v0.posTrack_as().eta()); + rPtAnalysis.fill(HIST("hArmenterosPodolanskiPlotLambda"), aValue, qValue); + rPtAnalysis.fill(HIST("hLambdaNegDaughterPt"), v0.negTrack_as().pt()); // Neg Daughter Pt + rPtAnalysis.fill(HIST("hLambdaPosDaughterPt"), v0.posTrack_as().pt()); // Pos Daughter Pt + for (int i = 0; i < nmaxHistograms; i++) { + if (lambdaptedgevalues[i] <= v0.pt() && v0.pt() < lambdaptedgevalues[i + 1]) { + pthistos::lambdaPt[i]->Fill(v0.mLambda()); + } } } } } } - } - // anti-lambda analysis - if (antiLambdaAnalysis == true) { - // Filling the five Antilambda invariant mass plots for different cuts (which are taken from namespace), for full explanation see the first kzero cut filling in the MC process - rPtAnalysis.fill(HIST("hMassAntilambdaAll"), v0.mAntiLambda()); - if (std::abs(v0.mK0Short() - mK0shPDG) > compv0masscut) { // antilambda competitive v0 mass cut (cut out Kaons) - if (std::abs(negDaughterTrack.tpcNSigmaPr()) < nSigmaTPCProton && std::abs(posDaughterTrack.tpcNSigmaPi()) < nSigmaTPCPion) { // TPC PID on daughter pion and proton for AntiLambda - rPtAnalysis.fill(HIST("hNSigmaPosPionFromAntilambda"), posDaughterTrack.tpcNSigmaPi(), posDaughterTrack.tpcInnerParam()); - rPtAnalysis.fill(HIST("hNSigmaNegProtonFromAntilambda"), negDaughterTrack.tpcNSigmaPr(), negDaughterTrack.tpcInnerParam()); - // implementing best antilambda cuts - if (v0.v0cosPA() > antilambdaSettingcosPA && v0.dcaV0daughters() < antilambdaSettingdcav0dau && v0.v0radius() > antilambdaSettingradius && std::abs(v0.dcapostopv()) > antilambdaSettingdcapostopv && std::abs(v0.dcanegtopv()) > antilambdaSettingdcanegtopv) { - rPtAnalysis.fill(HIST("hMassAntilambdaAllAfterCuts"), v0.mAntiLambda()); - rPtAnalysis.fill(HIST("hAntiLambdaEtaDaughters"), v0.negTrack_as().eta()); - rPtAnalysis.fill(HIST("hAntiLambdaEtaDaughters"), v0.posTrack_as().eta()); - rPtAnalysis.fill(HIST("hArmenterosPodolanskiPlotAntiLambda"), aValue, qValue); - rPtAnalysis.fill(HIST("hAntiLambdaNegDaughterPt"), v0.negTrack_as().pt()); // Neg Daughter Pt - rPtAnalysis.fill(HIST("hAntiLambdaPosDaughterPt"), v0.posTrack_as().pt()); // Pos Daughter Pt - for (int i = 0; i < nmaxHistograms; i++) { - if (lambdaptedgevalues[i] <= v0.pt() && v0.pt() < lambdaptedgevalues[i + 1]) { - pthistos::antilambdaPt[i]->Fill(v0.mAntiLambda()); + // anti-lambda analysis + if (antiLambdaAnalysis == true) { + // Filling the five Antilambda invariant mass plots for different cuts (which are taken from namespace), for full explanation see the first kzero cut filling in the MC process + rPtAnalysis.fill(HIST("hMassAntilambdaAll"), v0.mAntiLambda()); + if (std::abs(v0.mK0Short() - mK0shPDG) > compv0masscut) { // antilambda competitive v0 mass cut (cut out Kaons) + if (std::abs(negDaughterTrack.tpcNSigmaPr()) < nSigmaTPCProton && std::abs(posDaughterTrack.tpcNSigmaPi()) < nSigmaTPCPion) { // TPC PID on daughter pion and proton for AntiLambda + rPtAnalysis.fill(HIST("hNSigmaPosPionFromAntilambda"), posDaughterTrack.tpcNSigmaPi(), posDaughterTrack.tpcInnerParam()); + rPtAnalysis.fill(HIST("hNSigmaNegProtonFromAntilambda"), negDaughterTrack.tpcNSigmaPr(), negDaughterTrack.tpcInnerParam()); + // implementing best antilambda cuts + if (v0.v0cosPA() > antilambdaSettingcosPA && v0.dcaV0daughters() < antilambdaSettingdcav0dau && v0.v0radius() > antilambdaSettingradius && std::abs(v0.dcapostopv()) > antilambdaSettingdcapostopv && std::abs(v0.dcanegtopv()) > antilambdaSettingdcanegtopv) { + rPtAnalysis.fill(HIST("hMassAntilambdaAllAfterCuts"), v0.mAntiLambda()); + rPtAnalysis.fill(HIST("hAntiLambdaEtaDaughters"), v0.negTrack_as().eta()); + rPtAnalysis.fill(HIST("hAntiLambdaEtaDaughters"), v0.posTrack_as().eta()); + rPtAnalysis.fill(HIST("hArmenterosPodolanskiPlotAntiLambda"), aValue, qValue); + rPtAnalysis.fill(HIST("hAntiLambdaNegDaughterPt"), v0.negTrack_as().pt()); // Neg Daughter Pt + rPtAnalysis.fill(HIST("hAntiLambdaPosDaughterPt"), v0.posTrack_as().pt()); // Pos Daughter Pt + for (int i = 0; i < nmaxHistograms; i++) { + if (lambdaptedgevalues[i] <= v0.pt() && v0.pt() < lambdaptedgevalues[i + 1]) { + pthistos::antilambdaPt[i]->Fill(v0.mAntiLambda()); + } } } } From 9d54421e8194398e9fb380a50de0a3d78ff110ca Mon Sep 17 00:00:00 2001 From: Chiara De Martin <39315597+ChiaraDeMartin95@users.noreply.github.com> Date: Wed, 16 Apr 2025 11:40:43 +0200 Subject: [PATCH 1008/1650] Strangeness filter without strangeness builder (#10873) Co-authored-by: Chiara De Martin Co-authored-by: Maximiliano Puccio --- EventFiltering/CMakeLists.txt | 2 +- EventFiltering/PWGLF/strangenessFilter.cxx | 596 ++++++++++----------- 2 files changed, 285 insertions(+), 313 deletions(-) diff --git a/EventFiltering/CMakeLists.txt b/EventFiltering/CMakeLists.txt index 3e661399fc7..d67c1589457 100644 --- a/EventFiltering/CMakeLists.txt +++ b/EventFiltering/CMakeLists.txt @@ -84,7 +84,7 @@ o2physics_add_dpl_workflow(fje-filter o2physics_add_dpl_workflow(lf-strangeness-filter SOURCES PWGLF/strangenessFilter.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::ReconstructionDataFormats O2::DetectorsBase + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore KFParticle::KFParticle O2::ReconstructionDataFormats O2::DetectorsBase COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(mult-filter diff --git a/EventFiltering/PWGLF/strangenessFilter.cxx b/EventFiltering/PWGLF/strangenessFilter.cxx index b9ca03197c6..59f7f89c14b 100644 --- a/EventFiltering/PWGLF/strangenessFilter.cxx +++ b/EventFiltering/PWGLF/strangenessFilter.cxx @@ -37,6 +37,7 @@ #include "Common/DataModel/Multiplicity.h" #include "CommonConstants/PhysicsConstants.h" #include "../filterTables.h" +#include "PWGLF/Utils/strangenessBuilderHelper.h" using namespace o2; using namespace o2::framework; @@ -56,11 +57,15 @@ static const std::vector massSigmaParameterNames{"p0", "p1", "p2", static const std::vector speciesNames{"Xi", "Omega"}; } // namespace stfilter +float CalculateDCAStraightToPV(float X, float Y, float Z, float Px, float Py, float Pz, float pvX, float pvY, float pvZ) +{ + return std::hypot((pvY - Y) * Pz - (pvZ - Z) * Py, (pvX - X) * Pz - (pvZ - Z) * Px, (pvX - X) * Py - (pvY - Y) * Px) / (Px * Px + Py * Py + Pz * Pz); +} + struct strangenessFilter { // Recall the output table Produces strgtable; - TrackSelection mTrackSelector; // Define a histograms and registries HistogramRegistry QAHistos{"QAHistos", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; @@ -71,11 +76,12 @@ struct strangenessFilter { OutputObj hProcessedEvents{TH1D("hProcessedEvents", "Strangeness - event filtered;; Number of events", 16, -1., 15.)}; OutputObj hCandidate{TH1F("hCandidate", "; Candidate pass selection; Number of events", 30, 0., 30.)}; OutputObj hEvtvshMinPt{TH1F("hEvtvshMinPt", " Number of h-Omega events with pT_h higher than thrd; min p_{T, trigg} (GeV/c); Number of events", 11, 0., 11.)}; - OutputObj hhXiPairsvsPt{TH1F("hhXiPairsvsPt", "pt distributions of Xi in events with a trigger particle; #it{p}_{T} (GeV/c); Number of Xi", 100, 0., 10.)}; // Selection criteria for cascades + Configurable useCascadeMomentumAtPrimVtx{"useCascadeMomentumAtPrimVtx", false, "use cascade momentum at PV"}; Configurable doextraQA{"doextraQA", 1, "do extra QA"}; Configurable cutzvertex{"cutzvertex", 100.0f, "Accepted z-vertex range"}; + Configurable tpcmincrossedrows{"tpcmincrossedrows", 50, "Min number of crossed TPC rows"}; Configurable v0cospa{"v0cospa", 0.95, "V0 CosPA"}; Configurable casccospaxi{"casccospaxi", 0.95, "Casc CosPA"}; Configurable casccospaomega{"casccospaomega", 0.95, "Casc CosPA"}; @@ -105,8 +111,6 @@ struct strangenessFilter { Configurable nsigmatpcpr{"nsigmatpcpr", 6, "N Sigmas TPC pr"}; Configurable hastof{"hastof", 1, "Has TOF (OOB condition)"}; Configurable ptthrtof{"ptthrtof", 1.0, "Pt threshold to apply TOF condition"}; - Configurable kint7{"kint7", 0, "Apply kINT7 event selection"}; - Configurable sel7{"sel7", 0, "Apply sel7 event selection"}; Configurable sel8{"sel8", 0, "Apply sel8 event selection"}; Configurable LowLimitFT0MMult{"LowLimitFT0MMult", 3100, "FT0M selection for omega + high multiplicity trigger"}; Configurable LowLimitFT0MMultNorm{"LowLimitFT0MMultNorm", 70, "FT0M selection for omega + high multiplicity trigger with Normalised FT0M"}; @@ -126,16 +130,12 @@ struct strangenessFilter { // Settings for strangeness tracking filter Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; - Configurable grpMagPath{"grpMagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; - Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; - Configurable matLutPath{"matLutPath", "GLO/Param/MatLUT", "Path of the material LUT"}; Configurable propToDCA{"propToDCA", true, "create tracks version propagated to PCA"}; Configurable useAbsDCA{"useAbsDCA", true, "Minimise abs. distance rather than chi2"}; Configurable maxR{"maxR", 200., "reject PCA's above this radius"}; Configurable maxDZIni{"maxDZIni", 4., "reject (if>0) PCA candidate if tracks DZ exceeds threshold"}; Configurable minParamChange{"minParamChange", 1.e-3, "stop iterations if largest change of any X is smaller than this"}; Configurable minRelChi2Change{"minRelChi2Change", 0.9, "stop iterations if chi2/chi2old > this"}; - Configurable materialCorrectionType{"materialCorrectionType", static_cast(o2::base::Propagator::MatCorrType::USEMatCorrLUT), "Type of material correction"}; Configurable minNoClsTrackedCascade{"minNoClsTrackedCascade", 70, "Minimum number of clusters required for daughters of tracked cascades"}; Configurable minPtTrackedCascade{"minPtTrackedCascade", 0., "Min. pt for tracked cascades"}; Configurable useNsigmaCutTrackedXi{"useNsigmaCutTrackedXi", true, "Mass window based on n*sigma instead of fixed"}; @@ -161,29 +161,51 @@ struct strangenessFilter { {stfilter::massSigmaParameters[0], 4, 2, stfilter::massSigmaParameterNames, stfilter::speciesNames}, "Mass resolution parameters: [0]*exp([1]*x)+[2]*exp([3]*x)"}; - float bz = 0.; + + // helper object + o2::pwglf::strangenessBuilderHelper mStraHelper; + o2::vertexing::DCAFitterN<2> mDCAFitter; + + /// CCDB and info/objects to be fetched from it + Service ccdb; + int mRunNumber = 0; + float mBz = 0.; + std::vector* mMeanMultT0C; + std::vector* mMeanMultT0A; + + bool selectTrack(const auto& track) + { + return track.pt() > hMinPt && std::abs(track.eta()) < hEta && track.tpcNClsCrossedRows() >= tpcmincrossedrows && track.tpcCrossedRowsOverFindableCls() >= 0.8f && track.tpcChi2NCl() <= 4.f && track.itsChi2NCl() <= 36.f && (track.itsClusterMap() & 0x7) != 0; + } void init(o2::framework::InitContext&) { - ccdb->setURL(ccdbUrl); - ccdb->setCaching(true); - ccdb->setLocalObjectValidityChecking(); - ccdb->setFatalWhenNull(false); - - mTrackSelector.SetTrackType(o2::aod::track::TrackTypeEnum::Track); - mTrackSelector.SetPtRange(hMinPt, 1e10f); - mTrackSelector.SetEtaRange(-hEta, hEta); - mTrackSelector.SetRequireITSRefit(true); - mTrackSelector.SetRequireTPCRefit(true); - mTrackSelector.SetRequireGoldenChi2(false); - mTrackSelector.SetMinNCrossedRowsTPC(70); - mTrackSelector.SetMinNCrossedRowsOverFindableClustersTPC(0.8f); - mTrackSelector.SetMaxChi2PerClusterTPC(4.f); - mTrackSelector.SetRequireHitsInITSLayers(1, {0, 1, 2}); // one hit in any of the first three layers of IB - mTrackSelector.SetMaxChi2PerClusterITS(36.f); - // mTrackSelector.SetMaxDcaXYPtDep([](float pt) { return 0.0105f + 0.0350f / pow(pt, 1.1f); }); - mTrackSelector.SetMaxDcaXY(1.f); - mTrackSelector.SetMaxDcaZ(2.f); + // set V0 parameters in the helper + mStraHelper.v0selections.minCrossedRows = tpcmincrossedrows; + if (dcamesontopv <= dcabaryontopv) + mStraHelper.v0selections.dcanegtopv = dcamesontopv; + else + mStraHelper.v0selections.dcanegtopv = dcabaryontopv; // get the minimum one + if (dcamesontopv <= dcabaryontopv) + mStraHelper.v0selections.dcapostopv = dcamesontopv; + else + mStraHelper.v0selections.dcapostopv = dcabaryontopv; // get the minimum one + mStraHelper.v0selections.v0cospa = v0cospa; + mStraHelper.v0selections.dcav0dau = dcav0dau; + mStraHelper.v0selections.v0radius = v0radius; + mStraHelper.v0selections.maxDaughterEta = etadau; + + // set cascade parameters in the helper + mStraHelper.cascadeselections.minCrossedRows = tpcmincrossedrows; + mStraHelper.cascadeselections.dcabachtopv = dcabachtopv; + mStraHelper.cascadeselections.cascradius = cascradius; + if (casccospaxi <= casccospaomega) + mStraHelper.cascadeselections.casccospa = casccospaxi; + else + mStraHelper.cascadeselections.casccospa = casccospaomega; // get the minimum one + mStraHelper.cascadeselections.dcacascdau = dcacascdau; + mStraHelper.cascadeselections.lambdaMassWindow = masslambdalimit; + mStraHelper.cascadeselections.maxDaughterEta = etadau; hProcessedEvents->GetXaxis()->SetBinLabel(1, "Events processed"); hProcessedEvents->GetXaxis()->SetBinLabel(2, "Event selection"); @@ -282,8 +304,6 @@ struct strangenessFilter { QAHistosTriggerParticles.add("hPtTriggerSelEv", "hPtTriggerSelEv", HistType::kTH1F, {{300, 0, 30, "Pt of trigger particles after selections"}}); QAHistosTriggerParticles.add("hEtaTriggerAllEv", "hEtaTriggerAllEv", HistType::kTH2F, {{180, -1.4, 1.4, "Eta of trigger particles"}, {ptTriggAxis}}); QAHistosTriggerParticles.add("hPhiTriggerAllEv", "hPhiTriggerAllEv", HistType::kTH2F, {{100, 0, 2 * TMath::Pi(), "Phi of trigger particles"}, {ptTriggAxis}}); - QAHistosTriggerParticles.add("hDCAxyTriggerAllEv", "hDCAxyTriggerAllEv", HistType::kTH2F, {{400, -0.2, 0.2, "DCAxy of trigger particles"}, {ptTriggAxis}}); - QAHistosTriggerParticles.add("hDCAzTriggerAllEv", "hDCAzTriggerAllEv", HistType::kTH2F, {{400, -0.2, 0.2, "DCAz of trigger particles"}, {ptTriggAxis}}); EventsvsMultiplicity.add("AllEventsvsMultiplicityFT0M", "T0M distribution of all events", HistType::kTH1F, {multAxisT0M}); EventsvsMultiplicity.add("AllEventsvsMultiplicityFT0MwOmega", "T0M distribution of events w/ Omega candidate", HistType::kTH1F, {multAxisT0M}); @@ -324,12 +344,6 @@ struct strangenessFilter { QAHistos.add("hRapXi", "Rap Xi", HistType::kTH1F, {{100, -1, 1}}); QAHistos.add("hRapOmega", "Rap Omega", HistType::kTH1F, {{100, -1, 1}}); - // strangeness tracking - if (static_cast(materialCorrectionType.value) == o2::base::Propagator::MatCorrType::USEMatCorrLUT) { - auto* lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get("GLO/Param/MatLUT")); - o2::base::Propagator::Instance(true)->setMatLUT(lut); - } - QAHistosStrangenessTracking.add("hStRVsPtTrkCasc", "Tracked cascades;p_{T} (GeV/#it{c});R (cm)", HistType::kTH2D, {{200, 0., 10.}, {200, 0., 50}}); QAHistosStrangenessTracking.add("hMassOmegaTrkCasc", "Tracked cascades;m_{#Omega} (GeV/#it{c}^{2})", HistType::kTH1D, {{1000, 1., 3.}}); QAHistosStrangenessTracking.add("hMassXiTrkCasc", "Tracked cascades;m_{#Xi} (GeV/#it{c}^{2})", HistType::kTH1D, {{1000, 1., 3.}}); @@ -388,19 +402,38 @@ struct strangenessFilter { } } - // Filters - Filter trackFilter = (nabs(aod::track::eta) < hEta) && (aod::track::pt > hMinPt); + void initCCDB(int run) + { + if (run != mRunNumber) { + mRunNumber = run; + o2::parameters::GRPMagField* grpmag = ccdb->getForRun("GLO/Config/GRPMagField", run); + o2::base::Propagator::initFieldFromGRP(grpmag); + mBz = static_cast(grpmag->getNominalL3Field()); + mMeanMultT0C = ccdb->getForRun>("Users/e/ekryshen/meanT0C", run); + mMeanMultT0A = ccdb->getForRun>("Users/e/ekryshen/meanT0A", run); + + mDCAFitter.setBz(mBz); + mDCAFitter.setPropagateToPCA(propToDCA); + mDCAFitter.setMaxR(maxR); + mDCAFitter.setMaxDZIni(maxDZIni); + mDCAFitter.setMinParamChange(minParamChange); + mDCAFitter.setMinRelChi2Change(minRelChi2Change); + mDCAFitter.setUseAbsDCA(useAbsDCA); + } + if (!mStraHelper.lut) { /// done only once + ccdb->setURL(ccdbUrl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setFatalWhenNull(true); + auto* lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get("GLO/Param/MatLUT")); + o2::base::Propagator::Instance()->setMatLUT(lut); + mStraHelper.lut = lut; + } + } // Tables - using CollisionCandidates = soa::Join::iterator; - // using CollisionCandidatesRun3 = soa::Join::iterator; - using CollisionCandidatesRun3 = soa::Join::iterator; - using TrackCandidates = soa::Filtered>; - using DaughterTracks = soa::Join; - using Cascades = aod::CascDataExt; - - Service ccdb; - int runNumber; + using CollisionCandidates = soa::Join::iterator; + using TrackCandidates = soa::Join; float getMassWindow(const stfilter::species s, const float pt, const float nsigma = 6) { @@ -409,7 +442,7 @@ struct strangenessFilter { } //////////////////////////////////////////////////////// - ////////// Strangeness Filter - Run 2 conv ///////////// + ////////// Strangeness Filter ////////////////////////// //////////////////////////////////////////////////////// void fillTriggerTable(bool keepEvent[]) @@ -417,14 +450,15 @@ struct strangenessFilter { strgtable(keepEvent[0], keepEvent[1], keepEvent[2], keepEvent[3], keepEvent[4], keepEvent[5], keepEvent[6], keepEvent[7], keepEvent[8], keepEvent[9], keepEvent[10], keepEvent[11]); } - void process(CollisionCandidatesRun3 const& collision, TrackCandidates const& tracks, Cascades const& fullCasc, DaughterTracks& /*dtracks*/, - aod::AssignedTrackedCascades const& trackedCascades, aod::Cascades const& /*cascades*/, aod::AssignedTrackedV0s const& /*trackedV0s*/, aod::AssignedTracked3Bodys const& /*tracked3Bodys*/, aod::V0s const&, aod::BCsWithTimestamps const&, aod::FT0s const& /*ft0s*/) + void process(CollisionCandidates const& collision, TrackCandidates const& tracks, aod::Cascades const& cascadesBase, aod::AssignedTrackedCascades const& trackedCascades, aod::AssignedTrackedV0s const& /*trackedV0s*/, aod::AssignedTracked3Bodys const& /*tracked3Bodys*/, aod::V0s const&, aod::BCs const&, aod::FT0s const& /*ft0s*/) { // Is event good? [0] = Omega, [1] = high-pT hadron + Omega, [2] = 2Xi, [3] = 3Xi, [4] = 4Xi, [5] single-Xi, [6] Omega with high radius // [7] tracked Xi, [8] tracked Omega, [9] Omega + high mult event bool keepEvent[12]{}; // explicitly zero-initialised - std::vector> v0sFromOmegaID; - std::vector> v0sFromXiID; + std::vector> v0sFromOmegaID; + std::vector> v0sFromXiID; + + initCCDB(collision.bc().runNumber()); if (sel8 && !collision.sel8()) { fillTriggerTable(keepEvent); @@ -439,7 +473,7 @@ struct strangenessFilter { // all processed events after event selection hProcessedEvents->Fill(0.5); - if (TMath::Abs(collision.posZ()) > cutzvertex) { + if (std::fabs(collision.posZ()) > cutzvertex) { fillTriggerTable(keepEvent); return; } @@ -458,17 +492,14 @@ struct strangenessFilter { isHighMultEvent = 1; } } else { - auto bc = collision.template bc_as(); float meanMultT0C = 0.f; float fac_FT0C_ebe = 1.; - auto vMeanMultT0C = ccdb->getForTimeStamp>("Users/e/ekryshen/meanT0C", bc.timestamp()); - meanMultT0C = (*vMeanMultT0C)[0]; + meanMultT0C = (*mMeanMultT0C)[0]; if (meanMultT0C > 0) { fac_FT0C_ebe = avPyT0C / meanMultT0C; } float meanMultT0A = 0.f; - auto vMeanMultT0A = ccdb->getForTimeStamp>("Users/e/ekryshen/meanT0A", bc.timestamp()); - meanMultT0A = (*vMeanMultT0A)[0]; + meanMultT0A = (*mMeanMultT0A)[0]; float fac_FT0A_ebe = 1.; if (meanMultT0A > 0) { fac_FT0A_ebe = avPyT0A / meanMultT0A; @@ -533,18 +564,25 @@ struct strangenessFilter { int xicounterYN = 0; int omegacounter = 0; int omegalargeRcounter = 0; - int triggcounter = 0; - int triggcounterAllEv = 0; - int triggcounterForEstimates = 0; + const std::array pvPos{collision.posX(), collision.posY(), collision.posZ()}; + float pvX = 0.0f, pvY = 0.0f, pvZ = 0.0f; - for (auto& casc : fullCasc) { // loop over cascades - triggcounterForEstimates = 0; + // strangeness tracking selection + const auto primaryVertex = getPrimaryVertex(collision); + o2::dataformats::DCA impactParameterTrk; + for (auto& casc : cascadesBase) { // loop over cascades hCandidate->Fill(0.5); // All candidates - hCandidate->Fill(1.5); // V0 exists - deprecated - auto bachelor = casc.bachelor_as(); - auto posdau = casc.posTrack_as(); - auto negdau = casc.negTrack_as(); + + const auto bachTrack = casc.bachelor_as(); + const auto v0Dau = casc.v0_as(); + const auto negTrack = v0Dau.negTrack_as(); + const auto posTrack = v0Dau.posTrack_as(); + + if (!mStraHelper.buildCascadeCandidate(casc.collisionId(), pvPos[0], pvPos[1], pvPos[2], posTrack, negTrack, bachTrack, -1, useCascadeMomentumAtPrimVtx, -1)) { + continue; + } + hCandidate->Fill(1.5); // Built and selected candidates in StraBuilder bool isXi = false; bool isXiYN = false; @@ -552,282 +590,265 @@ struct strangenessFilter { bool isOmegalargeR = false; // QA - QAHistos.fill(HIST("hMassXiBefSelvsPt"), casc.mXi(), casc.pt()); - QAHistos.fill(HIST("hMassOmegaBefSelvsPt"), casc.mOmega(), casc.pt()); - + double massXi = mStraHelper.cascade.massXi; + double massOmega = mStraHelper.cascade.massOmega; + double ptCasc = RecoDecay::sqrtSumOfSquares(mStraHelper.cascade.cascadeMomentum[0], mStraHelper.cascade.cascadeMomentum[1]); + QAHistos.fill(HIST("hMassXiBefSelvsPt"), massXi, ptCasc); + QAHistos.fill(HIST("hMassOmegaBefSelvsPt"), massOmega, ptCasc); // Position - xipos = std::hypot(casc.x() - collision.posX(), casc.y() - collision.posY(), casc.z() - collision.posZ()); + xipos = std::hypot(mStraHelper.cascade.cascadePosition[0] - collision.posX(), mStraHelper.cascade.cascadePosition[1] - collision.posY(), mStraHelper.cascade.cascadePosition[2] - collision.posZ()); // Total momentum - xiptotmom = std::hypot(casc.px(), casc.py(), casc.pz()); + xiptotmom = std::hypot(mStraHelper.cascade.cascadeMomentum[0], mStraHelper.cascade.cascadeMomentum[1], mStraHelper.cascade.cascadeMomentum[2]); // Proper lifetime xiproperlifetime = o2::constants::physics::MassXiMinus * xipos / (xiptotmom + 1e-13); omegaproperlifetime = o2::constants::physics::MassOmegaMinus * xipos / (xiptotmom + 1e-13); + // Radii + double Cascv0radius = std::hypot(mStraHelper.cascade.v0Position[0], mStraHelper.cascade.v0Position[1]); + double Casccascradius = std::hypot(mStraHelper.cascade.cascadePosition[0], mStraHelper.cascade.cascadePosition[1]); + // Rapidity + double etaCasc = RecoDecay::eta(std::array{mStraHelper.cascade.cascadeMomentum[0], mStraHelper.cascade.cascadeMomentum[1], mStraHelper.cascade.cascadeMomentum[2]}); + // pointing angle + double v0DauCPA = RecoDecay::cpa(pvPos, array{mStraHelper.cascade.v0Position[0], mStraHelper.cascade.v0Position[1], mStraHelper.cascade.v0Position[2]}, array{mStraHelper.cascade.positiveMomentum[0] + mStraHelper.cascade.negativeMomentum[0], mStraHelper.cascade.positiveMomentum[1] + mStraHelper.cascade.negativeMomentum[1], mStraHelper.cascade.positiveMomentum[2] + mStraHelper.cascade.negativeMomentum[2]}); + double cascCPA = RecoDecay::cpa( + pvPos, + array{mStraHelper.cascade.cascadePosition[0], mStraHelper.cascade.cascadePosition[1], mStraHelper.cascade.cascadePosition[2]}, + array{mStraHelper.cascade.positiveMomentum[0] + mStraHelper.cascade.negativeMomentum[0] + mStraHelper.cascade.bachelorMomentum[0], mStraHelper.cascade.positiveMomentum[1] + mStraHelper.cascade.negativeMomentum[1] + mStraHelper.cascade.bachelorMomentum[1], mStraHelper.cascade.positiveMomentum[2] + mStraHelper.cascade.negativeMomentum[2] + mStraHelper.cascade.bachelorMomentum[2]}); + // dca V0 to PV + double DCAV0ToPV = CalculateDCAStraightToPV( + mStraHelper.cascade.v0Position[0], mStraHelper.cascade.v0Position[1], mStraHelper.cascade.v0Position[2], + mStraHelper.cascade.positiveMomentum[0] + mStraHelper.cascade.negativeMomentum[0], + mStraHelper.cascade.positiveMomentum[1] + mStraHelper.cascade.negativeMomentum[1], + mStraHelper.cascade.positiveMomentum[2] + mStraHelper.cascade.negativeMomentum[2], + pvX, pvY, pvZ); + // massLambda + double LambdaMass = 0; + if (mStraHelper.cascade.charge < 0) { + LambdaMass = RecoDecay::m(array{array{mStraHelper.cascade.positiveMomentum[0], mStraHelper.cascade.positiveMomentum[1], mStraHelper.cascade.positiveMomentum[2]}, array{mStraHelper.cascade.negativeMomentum[0], mStraHelper.cascade.negativeMomentum[1], mStraHelper.cascade.negativeMomentum[2]}}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged}); + } else { + LambdaMass = RecoDecay::m(array{array{mStraHelper.cascade.positiveMomentum[0], mStraHelper.cascade.positiveMomentum[1], mStraHelper.cascade.positiveMomentum[2]}, array{mStraHelper.cascade.negativeMomentum[0], mStraHelper.cascade.negativeMomentum[1], mStraHelper.cascade.negativeMomentum[2]}}, array{o2::constants::physics::MassPionCharged, o2::constants::physics::MassProton}); + } + + // rapidity + double yXi = RecoDecay::y(array{mStraHelper.cascade.bachelorMomentum[0] + mStraHelper.cascade.positiveMomentum[0] + mStraHelper.cascade.negativeMomentum[0], mStraHelper.cascade.bachelorMomentum[1] + mStraHelper.cascade.positiveMomentum[1] + mStraHelper.cascade.negativeMomentum[1], mStraHelper.cascade.bachelorMomentum[2] + mStraHelper.cascade.positiveMomentum[2] + mStraHelper.cascade.negativeMomentum[2]}, o2::constants::physics::MassXiMinus); + double yOmega = RecoDecay::y(array{mStraHelper.cascade.bachelorMomentum[0] + mStraHelper.cascade.positiveMomentum[0] + mStraHelper.cascade.negativeMomentum[0], mStraHelper.cascade.bachelorMomentum[1] + mStraHelper.cascade.positiveMomentum[1] + mStraHelper.cascade.negativeMomentum[1], mStraHelper.cascade.bachelorMomentum[2] + mStraHelper.cascade.positiveMomentum[2] + mStraHelper.cascade.negativeMomentum[2]}, o2::constants::physics::MassOmegaMinus); - if (casc.sign() > 0) { - if (TMath::Abs(casc.dcapostopv()) < dcamesontopv) { + if (mStraHelper.cascade.charge > 0) { + if (std::fabs(mStraHelper.cascade.positiveDCAxy) < dcamesontopv) { continue; } hCandidate->Fill(2.5); - if (TMath::Abs(casc.dcanegtopv()) < dcabaryontopv) { + if (std::fabs(mStraHelper.cascade.negativeDCAxy) < dcabaryontopv) { continue; } hCandidate->Fill(3.5); - if (TMath::Abs(posdau.tpcNSigmaPi()) > nsigmatpcpi) { + if (std::fabs(posTrack.tpcNSigmaPi()) > nsigmatpcpi) { continue; } hCandidate->Fill(4.5); - if (TMath::Abs(negdau.tpcNSigmaPr()) > nsigmatpcpr) { + if (std::fabs(negTrack.tpcNSigmaPr()) > nsigmatpcpr) { continue; } hCandidate->Fill(5.5); - } else if (casc.sign() < 0) { - if (TMath::Abs(casc.dcanegtopv()) < dcamesontopv) { + } else if (mStraHelper.cascade.charge < 0) { + if (std::fabs(mStraHelper.cascade.negativeDCAxy) < dcamesontopv) { continue; } hCandidate->Fill(2.5); - if (TMath::Abs(casc.dcapostopv()) < dcabaryontopv) { + if (std::fabs(mStraHelper.cascade.positiveDCAxy) < dcabaryontopv) { continue; } hCandidate->Fill(3.5); - if (TMath::Abs(negdau.tpcNSigmaPi()) > nsigmatpcpi) { + if (std::fabs(negTrack.tpcNSigmaPi()) > nsigmatpcpi) { continue; } hCandidate->Fill(4.5); - if (TMath::Abs(posdau.tpcNSigmaPr()) > nsigmatpcpr) { + if (std::fabs(posTrack.tpcNSigmaPr()) > nsigmatpcpr) { continue; } hCandidate->Fill(5.5); } - if (TMath::Abs(posdau.eta()) > etadau) { - continue; - } - if (TMath::Abs(negdau.eta()) > etadau) { - continue; - } - if (TMath::Abs(bachelor.eta()) > etadau) { - continue; - } - hCandidate->Fill(6.5); - if (TMath::Abs(casc.dcabachtopv()) < dcabachtopv) { - continue; - } hCandidate->Fill(7.5); - if (casc.v0radius() < v0radius) { + + // not striclty needed as selection are applied beforehand - just as QA (no change in number expected) + if (Cascv0radius < v0radius) { continue; } hCandidate->Fill(8.5); - if (casc.cascradius() < cascradius) { - continue; - } - hCandidate->Fill(9.5); - if (casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ()) < v0cospa) { + if (v0DauCPA < v0cospa) { continue; } hCandidate->Fill(10.5); - if (casc.dcaV0daughters() > dcav0dau) { + if (mStraHelper.cascade.v0DaughterDCA > dcav0dau) { continue; } hCandidate->Fill(11.5); - if (casc.dcacascdaughters() > dcacascdau) { - continue; - } - hCandidate->Fill(12.5); - if (TMath::Abs(casc.mLambda() - constants::physics::MassLambda) > masslambdalimit) { - continue; - } - hCandidate->Fill(13.5); - if (TMath::Abs(casc.eta()) > eta) { + + if (std::fabs(etaCasc) > eta) { continue; } hCandidate->Fill(14.5); if (hastof && - (!posdau.hasTOF() && posdau.pt() > ptthrtof) && - (!negdau.hasTOF() && negdau.pt() > ptthrtof) && - (!bachelor.hasTOF() && bachelor.pt() > ptthrtof)) { + (!posTrack.hasTOF() && posTrack.pt() > ptthrtof) && + (!negTrack.hasTOF() && negTrack.pt() > ptthrtof) && + (!bachTrack.hasTOF() && bachTrack.pt() > ptthrtof)) { continue; } hCandidate->Fill(15.5); - // Fill selections QA for XiMinus - if (casc.casccosPA(collision.posX(), collision.posY(), collision.posZ()) > casccospaxi) { - hCandidate->Fill(16.5); - if (casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ()) > dcav0topv) { - hCandidate->Fill(17.5); - if (xiproperlifetime < properlifetimefactor * ctauxi) { - hCandidate->Fill(18.5); - if (TMath::Abs(casc.yXi()) < rapidity) { - hCandidate->Fill(19.5); - } - } - } - } + const auto deltaMassXi = useSigmaBasedMassCutXi ? getMassWindow(stfilter::species::Xi, ptCasc) : ximasswindow; + const auto deltaMassOmega = useSigmaBasedMassCutOmega ? getMassWindow(stfilter::species::Omega, ptCasc) : omegamasswindow; - const auto deltaMassXi = useSigmaBasedMassCutXi ? getMassWindow(stfilter::species::Xi, casc.pt()) : ximasswindow; - const auto deltaMassOmega = useSigmaBasedMassCutOmega ? getMassWindow(stfilter::species::Omega, casc.pt()) : omegamasswindow; - isXi = (TMath::Abs(bachelor.tpcNSigmaPi()) < nsigmatpcpi) && - (casc.casccosPA(collision.posX(), collision.posY(), collision.posZ()) > casccospaxi) && - (casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ()) > dcav0topv) && - (TMath::Abs(casc.mXi() - o2::constants::physics::MassXiMinus) < deltaMassXi) && - (TMath::Abs(casc.mOmega() - o2::constants::physics::MassOmegaMinus) > omegarej) && + isXi = (std::fabs(bachTrack.tpcNSigmaPi()) < nsigmatpcpi) && + (cascCPA > casccospaxi) && + (DCAV0ToPV > dcav0topv) && + (std::fabs(massXi - o2::constants::physics::MassXiMinus) < deltaMassXi) && + (std::fabs(massOmega - o2::constants::physics::MassOmegaMinus) > omegarej) && (xiproperlifetime < properlifetimefactor * ctauxi) && - (TMath::Abs(casc.yXi()) < rapidity); - isXiYN = (TMath::Abs(bachelor.tpcNSigmaPi()) < nsigmatpcpi) && - (casc.cascradius() > lowerradiusXiYN) && - (TMath::Abs(casc.mXi() - o2::constants::physics::MassXiMinus) < deltaMassXi) && - (TMath::Abs(casc.mOmega() - o2::constants::physics::MassOmegaMinus) > omegarej) && + (std::fabs(yXi) < rapidity); + isXiYN = (std::fabs(bachTrack.tpcNSigmaPi()) < nsigmatpcpi) && + (Casccascradius > lowerradiusXiYN) && + (std::fabs(massXi - o2::constants::physics::MassXiMinus) < deltaMassXi) && + (std::fabs(massOmega - o2::constants::physics::MassOmegaMinus) > omegarej) && (xiproperlifetime < properlifetimefactor * ctauxi) && - (TMath::Abs(casc.yXi()) < rapidity); - isOmega = (TMath::Abs(bachelor.tpcNSigmaKa()) < nsigmatpcka) && - (casc.casccosPA(collision.posX(), collision.posY(), collision.posZ()) > casccospaomega) && - (casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ()) > dcav0topv) && - (TMath::Abs(casc.mOmega() - o2::constants::physics::MassOmegaMinus) < deltaMassOmega) && - (TMath::Abs(casc.mXi() - o2::constants::physics::MassXiMinus) > xirej) && - (casc.cascradius() < upperradiusOmega) && + (std::fabs(yXi) < rapidity); + isOmega = (std::fabs(bachTrack.tpcNSigmaKa()) < nsigmatpcka) && + (cascCPA > casccospaomega) && + (DCAV0ToPV > dcav0topv) && + (std::fabs(massOmega - o2::constants::physics::MassOmegaMinus) < deltaMassOmega) && + (std::fabs(massXi - o2::constants::physics::MassXiMinus) > xirej) && + (Casccascradius < upperradiusOmega) && (omegaproperlifetime < properlifetimefactor * ctauomega) && - (TMath::Abs(casc.yOmega()) < rapidity); - isOmegalargeR = (TMath::Abs(bachelor.tpcNSigmaKa()) < nsigmatpcka) && - (casc.casccosPA(collision.posX(), collision.posY(), collision.posZ()) > casccospaomega) && - (casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ()) > dcav0topv) && - (casc.cascradius() > lowerradiusOmega) && - (TMath::Abs(casc.mOmega() - o2::constants::physics::MassOmegaMinus) < deltaMassOmega) && - (TMath::Abs(casc.mXi() - o2::constants::physics::MassXiMinus) > xirej) && + (std::fabs(yOmega) < rapidity); + isOmegalargeR = (std::fabs(bachTrack.tpcNSigmaKa()) < nsigmatpcka) && + (cascCPA > casccospaomega) && + (DCAV0ToPV > dcav0topv) && + (Casccascradius > lowerradiusOmega) && + (std::fabs(massOmega - o2::constants::physics::MassOmegaMinus) < deltaMassOmega) && + (std::fabs(massXi - o2::constants::physics::MassXiMinus) > xirej) && (omegaproperlifetime < properlifetimefactor * ctauomega) && - (TMath::Abs(casc.yOmega()) < rapidity); + (std::fabs(yOmega) < rapidity); if (isXi) { - QAHistos.fill(HIST("hMassXiAfterSelvsPt"), casc.mXi(), casc.pt()); - QAHistos.fill(HIST("hPtXi"), casc.pt()); - QAHistos.fill(HIST("hEtaXi"), casc.eta()); + QAHistos.fill(HIST("hMassXiAfterSelvsPt"), massXi, ptCasc); + QAHistos.fill(HIST("hPtXi"), ptCasc); + QAHistos.fill(HIST("hEtaXi"), etaCasc); QAHistosTopologicalVariables.fill(HIST("hProperLifetimeXi"), xiproperlifetime); - QAHistosTopologicalVariables.fill(HIST("hCascCosPAXi"), casc.casccosPA(collision.posX(), collision.posY(), collision.posZ())); - QAHistosTopologicalVariables.fill(HIST("hV0CosPAXi"), casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ())); - QAHistosTopologicalVariables.fill(HIST("hCascRadiusXi"), casc.cascradius()); - QAHistosTopologicalVariables.fill(HIST("hV0RadiusXi"), casc.v0radius()); - QAHistosTopologicalVariables.fill(HIST("hDCAV0ToPVXi"), casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ())); - QAHistosTopologicalVariables.fill(HIST("hDCAV0DaughtersXi"), casc.dcaV0daughters()); - QAHistosTopologicalVariables.fill(HIST("hDCACascDaughtersXi"), casc.dcacascdaughters()); - QAHistosTopologicalVariables.fill(HIST("hDCABachToPVXi"), TMath::Abs(casc.dcabachtopv())); - QAHistosTopologicalVariables.fill(HIST("hDCAPosToPVXi"), TMath::Abs(casc.dcapostopv())); - QAHistosTopologicalVariables.fill(HIST("hDCANegToPVXi"), TMath::Abs(casc.dcanegtopv())); - QAHistosTopologicalVariables.fill(HIST("hInvMassLambdaXi"), casc.mLambda()); + QAHistosTopologicalVariables.fill(HIST("hCascCosPAXi"), cascCPA); + QAHistosTopologicalVariables.fill(HIST("hV0CosPAXi"), v0DauCPA); + QAHistosTopologicalVariables.fill(HIST("hCascRadiusXi"), Casccascradius); + QAHistosTopologicalVariables.fill(HIST("hV0RadiusXi"), Cascv0radius); + QAHistosTopologicalVariables.fill(HIST("hDCAV0ToPVXi"), DCAV0ToPV); + QAHistosTopologicalVariables.fill(HIST("hDCAV0DaughtersXi"), mStraHelper.cascade.v0DaughterDCA); + QAHistosTopologicalVariables.fill(HIST("hDCACascDaughtersXi"), mStraHelper.cascade.cascadeDaughterDCA); + QAHistosTopologicalVariables.fill(HIST("hDCABachToPVXi"), mStraHelper.cascade.bachelorDCAxy); + QAHistosTopologicalVariables.fill(HIST("hDCAPosToPVXi"), mStraHelper.cascade.positiveDCAxy); + QAHistosTopologicalVariables.fill(HIST("hDCANegToPVXi"), mStraHelper.cascade.negativeDCAxy); + QAHistosTopologicalVariables.fill(HIST("hInvMassLambdaXi"), LambdaMass); if (doextraQA) { - - QAHistos.fill(HIST("hHasTOFBachPi"), bachelor.hasTOF(), bachelor.pt()); + QAHistos.fill(HIST("hHasTOFBachPi"), bachTrack.hasTOF(), bachTrack.pt()); // QA PID - if (casc.sign() > 0) { - QAHistos.fill(HIST("hTPCNsigmaXiBachPiPlus"), bachelor.tpcNSigmaPi(), bachelor.tpcInnerParam()); - QAHistos.fill(HIST("hTPCNsigmaXiV0PiPlus"), posdau.tpcNSigmaPi(), posdau.tpcInnerParam()); - QAHistos.fill(HIST("hTPCNsigmaXiV0AntiProton"), negdau.tpcNSigmaPr(), negdau.tpcInnerParam()); - QAHistos.fill(HIST("hHasTOFPi"), posdau.hasTOF(), posdau.pt()); - QAHistos.fill(HIST("hHasTOFPr"), negdau.hasTOF(), negdau.pt()); + if (mStraHelper.cascade.charge > 0) { + QAHistos.fill(HIST("hTPCNsigmaXiBachPiPlus"), bachTrack.tpcNSigmaPi(), bachTrack.tpcInnerParam()); + QAHistos.fill(HIST("hTPCNsigmaXiV0PiPlus"), posTrack.tpcNSigmaPi(), posTrack.tpcInnerParam()); + QAHistos.fill(HIST("hTPCNsigmaXiV0AntiProton"), negTrack.tpcNSigmaPr(), negTrack.tpcInnerParam()); + QAHistos.fill(HIST("hHasTOFPi"), posTrack.hasTOF(), posTrack.pt()); + QAHistos.fill(HIST("hHasTOFPr"), negTrack.hasTOF(), negTrack.pt()); } else { - QAHistos.fill(HIST("hTPCNsigmaXiBachPiMinus"), bachelor.tpcNSigmaPi(), bachelor.tpcInnerParam()); - QAHistos.fill(HIST("hTPCNsigmaXiV0Proton"), posdau.tpcNSigmaPr(), posdau.tpcInnerParam()); - QAHistos.fill(HIST("hTPCNsigmaXiV0PiMinus"), negdau.tpcNSigmaPi(), negdau.tpcInnerParam()); - QAHistos.fill(HIST("hHasTOFPr"), posdau.hasTOF(), posdau.pt()); - QAHistos.fill(HIST("hHasTOFPi"), negdau.hasTOF(), negdau.pt()); + QAHistos.fill(HIST("hTPCNsigmaXiBachPiMinus"), bachTrack.tpcNSigmaPi(), bachTrack.tpcInnerParam()); + QAHistos.fill(HIST("hTPCNsigmaXiV0Proton"), posTrack.tpcNSigmaPr(), posTrack.tpcInnerParam()); + QAHistos.fill(HIST("hTPCNsigmaXiV0PiMinus"), negTrack.tpcNSigmaPi(), negTrack.tpcInnerParam()); + QAHistos.fill(HIST("hHasTOFPr"), posTrack.hasTOF(), posTrack.pt()); + QAHistos.fill(HIST("hHasTOFPi"), negTrack.hasTOF(), negTrack.pt()); } - QAHistos.fill(HIST("hRapXi"), casc.yXi()); + QAHistos.fill(HIST("hRapXi"), yXi); } // Count number of Xi candidates xicounter++; - v0sFromXiID.push_back({casc.posTrackId(), casc.negTrackId()}); - - // Plot for estimates - for (auto track : tracks) { // start loop over tracks - if (isTrackFilter && !mTrackSelector.IsSelected(track)) { - continue; - } - triggcounterForEstimates++; - if (triggcounterForEstimates > 0) - break; - } - if (triggcounterForEstimates && (TMath::Abs(casc.mXi() - o2::constants::physics::MassXiMinus) < 0.01)) - hhXiPairsvsPt->Fill(casc.pt()); // Fill the histogram with all the Xis produced in events with a trigger particle - // End plot for estimates + // v0sFromXiID.push_back({casc.posTrackId(), casc.negTrackId()}); + v0sFromXiID.push_back({posTrack.globalIndex(), negTrack.globalIndex()}); } + if (isXiYN) { // Xis for YN interactions xicounterYN++; - QAHistosTopologicalVariables.fill(HIST("hCascRadiusXiYN"), casc.cascradius()); + QAHistosTopologicalVariables.fill(HIST("hCascRadiusXiYN"), Casccascradius); } if (isOmega) { - QAHistos.fill(HIST("hMassOmegaAfterSelvsPt"), casc.mOmega(), casc.pt()); - QAHistos.fill(HIST("hPtOmega"), casc.pt()); - QAHistos.fill(HIST("hEtaOmega"), casc.eta()); + QAHistos.fill(HIST("hMassOmegaAfterSelvsPt"), massOmega, ptCasc); + QAHistos.fill(HIST("hPtOmega"), ptCasc); + QAHistos.fill(HIST("hEtaOmega"), etaCasc); QAHistosTopologicalVariables.fill(HIST("hProperLifetimeOmega"), omegaproperlifetime); - QAHistosTopologicalVariables.fill(HIST("hCascCosPAOmega"), casc.casccosPA(collision.posX(), collision.posY(), collision.posZ())); - QAHistosTopologicalVariables.fill(HIST("hV0CosPAOmega"), casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ())); - QAHistosTopologicalVariables.fill(HIST("hCascRadiusOmega"), casc.cascradius()); - QAHistosTopologicalVariables.fill(HIST("hV0RadiusOmega"), casc.v0radius()); - QAHistosTopologicalVariables.fill(HIST("hDCAV0ToPVOmega"), casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ())); - QAHistosTopologicalVariables.fill(HIST("hDCAV0DaughtersOmega"), casc.dcaV0daughters()); - QAHistosTopologicalVariables.fill(HIST("hDCACascDaughtersOmega"), casc.dcacascdaughters()); - QAHistosTopologicalVariables.fill(HIST("hDCABachToPVOmega"), TMath::Abs(casc.dcabachtopv())); - QAHistosTopologicalVariables.fill(HIST("hDCAPosToPVOmega"), TMath::Abs(casc.dcapostopv())); - QAHistosTopologicalVariables.fill(HIST("hDCANegToPVOmega"), TMath::Abs(casc.dcanegtopv())); - QAHistosTopologicalVariables.fill(HIST("hInvMassLambdaOmega"), casc.mLambda()); + QAHistosTopologicalVariables.fill(HIST("hCascCosPAOmega"), cascCPA); + QAHistosTopologicalVariables.fill(HIST("hV0CosPAOmega"), v0DauCPA); + QAHistosTopologicalVariables.fill(HIST("hCascRadiusOmega"), Casccascradius); + QAHistosTopologicalVariables.fill(HIST("hV0RadiusOmega"), Cascv0radius); + QAHistosTopologicalVariables.fill(HIST("hDCAV0ToPVOmega"), DCAV0ToPV); + QAHistosTopologicalVariables.fill(HIST("hDCAV0DaughtersOmega"), mStraHelper.cascade.v0DaughterDCA); + QAHistosTopologicalVariables.fill(HIST("hDCACascDaughtersOmega"), mStraHelper.cascade.cascadeDaughterDCA); + QAHistosTopologicalVariables.fill(HIST("hDCABachToPVOmega"), std::fabs(mStraHelper.cascade.bachelorDCAxy)); + QAHistosTopologicalVariables.fill(HIST("hDCAPosToPVOmega"), std::fabs(mStraHelper.cascade.positiveDCAxy)); + QAHistosTopologicalVariables.fill(HIST("hDCANegToPVOmega"), std::fabs(mStraHelper.cascade.negativeDCAxy)); + QAHistosTopologicalVariables.fill(HIST("hInvMassLambdaOmega"), LambdaMass); if (doextraQA) { // QA PID - if (casc.sign() > 0) { - QAHistos.fill(HIST("hTPCNsigmaOmegaBachKaPlus"), bachelor.tpcNSigmaKa(), bachelor.tpcInnerParam()); - QAHistos.fill(HIST("hTPCNsigmaOmegaV0PiPlus"), posdau.tpcNSigmaPi(), posdau.tpcInnerParam()); - QAHistos.fill(HIST("hTPCNsigmaOmegaV0AntiProton"), negdau.tpcNSigmaPr(), negdau.tpcInnerParam()); - QAHistos.fill(HIST("hHasTOFPi"), posdau.hasTOF(), posdau.pt()); - QAHistos.fill(HIST("hHasTOFPr"), negdau.hasTOF(), negdau.pt()); + if (mStraHelper.cascade.charge > 0) { + QAHistos.fill(HIST("hTPCNsigmaOmegaBachKaPlus"), bachTrack.tpcNSigmaKa(), bachTrack.tpcInnerParam()); + QAHistos.fill(HIST("hTPCNsigmaOmegaV0PiPlus"), posTrack.tpcNSigmaPi(), posTrack.tpcInnerParam()); + QAHistos.fill(HIST("hTPCNsigmaOmegaV0AntiProton"), negTrack.tpcNSigmaPr(), negTrack.tpcInnerParam()); + QAHistos.fill(HIST("hHasTOFPi"), posTrack.hasTOF(), posTrack.pt()); + QAHistos.fill(HIST("hHasTOFPr"), negTrack.hasTOF(), negTrack.pt()); } else { - QAHistos.fill(HIST("hTPCNsigmaOmegaBachKaMinus"), bachelor.tpcNSigmaKa(), bachelor.tpcInnerParam()); - QAHistos.fill(HIST("hTPCNsigmaOmegaV0Proton"), posdau.tpcNSigmaPr(), posdau.tpcInnerParam()); - QAHistos.fill(HIST("hTPCNsigmaOmegaV0PiMinus"), negdau.tpcNSigmaPi(), negdau.tpcInnerParam()); - QAHistos.fill(HIST("hHasTOFPr"), posdau.hasTOF(), posdau.pt()); - QAHistos.fill(HIST("hHasTOFPi"), negdau.hasTOF(), negdau.pt()); + QAHistos.fill(HIST("hTPCNsigmaOmegaBachKaMinus"), bachTrack.tpcNSigmaKa(), bachTrack.tpcInnerParam()); + QAHistos.fill(HIST("hTPCNsigmaOmegaV0Proton"), posTrack.tpcNSigmaPr(), posTrack.tpcInnerParam()); + QAHistos.fill(HIST("hTPCNsigmaOmegaV0PiMinus"), negTrack.tpcNSigmaPi(), negTrack.tpcInnerParam()); + QAHistos.fill(HIST("hHasTOFPr"), posTrack.hasTOF(), posTrack.pt()); + QAHistos.fill(HIST("hHasTOFPi"), negTrack.hasTOF(), negTrack.pt()); } - QAHistos.fill(HIST("hHasTOFBachKa"), bachelor.hasTOF(), bachelor.pt()); - QAHistos.fill(HIST("hRapOmega"), casc.yOmega()); + QAHistos.fill(HIST("hHasTOFBachKa"), bachTrack.hasTOF(), bachTrack.pt()); + QAHistos.fill(HIST("hRapOmega"), yOmega); } // Count number of Omega candidates omegacounter++; - v0sFromOmegaID.push_back({casc.posTrackId(), casc.negTrackId()}); + v0sFromOmegaID.push_back({posTrack.globalIndex(), negTrack.globalIndex()}); } + if (isOmegalargeR) { omegalargeRcounter++; - QAHistosTopologicalVariables.fill(HIST("hCascRadiusOmegaLargeR"), casc.cascradius()); + QAHistosTopologicalVariables.fill(HIST("hCascRadiusOmegaLargeR"), Casccascradius); } } // end loop over cascades - // Omega trigger definition - if (omegacounter > 0) { - keepEvent[0] = true; - } + keepEvent[0] = omegacounter > 0; - bool EvtwhMinPt[11]; - bool EvtwhMinPtCasc[11]; - float ThrdPt[11]; + std::array EvtwhMinPt{false}; + std::array ThrdPt; for (int i = 0; i < 11; i++) { - EvtwhMinPt[i] = 0.; - EvtwhMinPtCasc[i] = 0.; ThrdPt[i] = static_cast(i); } // QA tracks + int triggcounterAllEv = 0; for (auto track : tracks) { // start loop over tracks - if (isTrackFilter && !mTrackSelector.IsSelected(track)) { + if (isTrackFilter && !selectTrack(track)) { continue; } triggcounterAllEv++; QAHistosTriggerParticles.fill(HIST("hPtTriggerAllEv"), track.pt()); QAHistosTriggerParticles.fill(HIST("hPhiTriggerAllEv"), track.phi(), track.pt()); QAHistosTriggerParticles.fill(HIST("hEtaTriggerAllEv"), track.eta(), track.pt()); - QAHistosTriggerParticles.fill(HIST("hDCAxyTriggerAllEv"), track.dcaXY(), track.pt()); - QAHistosTriggerParticles.fill(HIST("hDCAzTriggerAllEv"), track.dcaZ(), track.pt()); - for (int i = 0; i < 11; i++) { - if (track.pt() > ThrdPt[i]) - EvtwhMinPt[i] = 1; + for (size_t i = 0; i < ThrdPt.size(); i++) { + EvtwhMinPt[i] = track.pt() > ThrdPt[i]; + } + + // High-pT hadron + Omega trigger definition + if (omegacounter > 0) { + keepEvent[1] = true; + QAHistosTriggerParticles.fill(HIST("hPtTriggerSelEv"), track.pt()); } } // end loop over tracks for (int i = 0; i < 11; i++) { @@ -846,32 +867,18 @@ struct strangenessFilter { } } QAHistosTriggerParticles.fill(HIST("hTriggeredParticlesAllEv"), triggcounterAllEv); - - // High-pT hadron + Omega trigger definition - if (omegacounter > 0) { - for (auto track : tracks) { // start loop over tracks - if (isTrackFilter && !mTrackSelector.IsSelected(track)) { - continue; - } - triggcounter++; - QAHistosTriggerParticles.fill(HIST("hPtTriggerSelEv"), track.pt()); - for (int i = 0; i < 11; i++) { - if (track.pt() > ThrdPt[i]) - EvtwhMinPtCasc[i] = 1; + if (keepEvent[1]) { + QAHistosTriggerParticles.fill(HIST("hTriggeredParticlesSelEv"), triggcounterAllEv); + for (size_t i = 0; i < EvtwhMinPt.size(); i++) { + if (EvtwhMinPt[i]) { + hEvtvshMinPt->Fill(i + 0.5); } - keepEvent[1] = true; - } // end loop over tracks - QAHistosTriggerParticles.fill(HIST("hTriggeredParticlesSelEv"), triggcounter); - } - - for (int i = 0; i < 11; i++) { - if (EvtwhMinPtCasc[i]) - hEvtvshMinPt->Fill(i + 0.5); + } } // Double/triple/quad Xi trigger definition if (v0sFromXiID.size() > 0) { - std::set> uniqueXis = {v0sFromXiID.begin(), v0sFromXiID.end()}; + std::set> uniqueXis = {v0sFromXiID.begin(), v0sFromXiID.end()}; if (uniqueXis.size() > 1) { keepEvent[2] = true; } @@ -885,7 +892,7 @@ struct strangenessFilter { // Double Omega trigger definition if (v0sFromOmegaID.size() > 0) { - std::set> uniqueOmegas = {v0sFromOmegaID.begin(), v0sFromOmegaID.end()}; + std::set> uniqueOmegas = {v0sFromOmegaID.begin(), v0sFromOmegaID.end()}; if (uniqueOmegas.size() > 1) { keepEvent[10] = true; } @@ -893,8 +900,8 @@ struct strangenessFilter { // Omega + Xi trigger definition if (v0sFromOmegaID.size() > 0 && v0sFromXiID.size() > 0) { - std::set> uniqueOmegas = {v0sFromOmegaID.begin(), v0sFromOmegaID.end()}; - std::set> uniqueXis = {v0sFromXiID.begin(), v0sFromXiID.end()}; + std::set> uniqueOmegas = {v0sFromOmegaID.begin(), v0sFromOmegaID.end()}; + std::set> uniqueXis = {v0sFromXiID.begin(), v0sFromXiID.end()}; if (uniqueOmegas.size() > 1 || uniqueXis.size() > 1) { keepEvent[11] = true; } else { @@ -927,48 +934,14 @@ struct strangenessFilter { keepEvent[9] = true; } - // strangeness tracking selection - const auto bc = collision.bc_as(); - if (runNumber != bc.runNumber()) { - runNumber = bc.runNumber(); - auto timestamp = bc.timestamp(); - - if (o2::parameters::GRPObject* grpo = ccdb->getForTimeStamp(grpPath, timestamp)) { - o2::base::Propagator::initFieldFromGRP(grpo); - bz = grpo->getNominalL3Field(); - } else if (o2::parameters::GRPMagField* grpmag = ccdb->getForTimeStamp(grpMagPath, timestamp)) { - o2::base::Propagator::initFieldFromGRP(grpmag); - bz = std::lround(5.f * grpmag->getL3Current() / 30000.f); - } else { - LOG(fatal) << "Got nullptr from CCDB for path " << grpMagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for timestamp " << timestamp; - } - } - - const auto primaryVertex = getPrimaryVertex(collision); - o2::dataformats::DCA impactParameterTrk; - - for (const auto& casc : fullCasc) { - QAHistosStrangenessTracking.fill(HIST("hPtCascCand"), casc.pt()); - } - - const auto matCorr = static_cast(materialCorrectionType.value); - o2::vertexing::DCAFitterN<2> df2; - df2.setBz(bz); - df2.setPropagateToPCA(propToDCA); - df2.setMaxR(maxR); - df2.setMaxDZIni(maxDZIni); - df2.setMinParamChange(minParamChange); - df2.setMinRelChi2Change(minRelChi2Change); - df2.setUseAbsDCA(useAbsDCA); - for (const auto& trackedCascade : trackedCascades) { - const auto trackCasc = trackedCascade.track_as(); + const auto trackCasc = trackedCascade.track_as(); QAHistosStrangenessTracking.fill(HIST("hPtCascTracked"), trackCasc.pt()); QAHistosStrangenessTracking.fill(HIST("hStRVsPtTrkCasc"), trackCasc.pt(), RecoDecay::sqrtSumOfSquares(trackCasc.x(), trackCasc.y())); QAHistosStrangenessTracking.fill(HIST("hMatchChi2TrkCasc"), trackedCascade.matchingChi2()); auto trackParCovTrk = getTrackParCov(trackCasc); - o2::base::Propagator::Instance()->propagateToDCA(primaryVertex, trackParCovTrk, bz, 2.f, matCorr, &impactParameterTrk); + o2::base::Propagator::Instance()->propagateToDCA(primaryVertex, trackParCovTrk, mBz, 2.f, o2::base::Propagator::MatCorrType::USEMatCorrLUT, &impactParameterTrk); QAHistosStrangenessTracking.fill(HIST("hDcaXY"), impactParameterTrk.getY()); QAHistosStrangenessTracking.fill(HIST("hDcaXYVsPt"), trackParCovTrk.getPt(), impactParameterTrk.getY()); @@ -981,10 +954,10 @@ struct strangenessFilter { // const auto itsTrack = trackedCascade.itsTrack(); const auto cascade = trackedCascade.cascade(); - const auto bachelor = cascade.bachelor_as(); + const auto bachelor = cascade.bachelor_as(); const auto v0 = cascade.v0_as(); - const auto negTrack = v0.negTrack_as(); - const auto posTrack = v0.posTrack_as(); + const auto negTrack = v0.negTrack_as(); + const auto posTrack = v0.posTrack_as(); if (!posTrack.hasTPC() || !negTrack.hasTPC() || !bachelor.hasTPC() || posTrack.tpcNClsFindable() < minNoClsTrackedCascade || @@ -1022,17 +995,16 @@ struct strangenessFilter { o2::track::TrackPar trackParV0; o2::track::TrackPar trackParBachelor; float cpa = -1; - if (df2.process(getTrackParCov(negTrack), getTrackParCov(posTrack))) { - trackParCovV0 = df2.createParentTrackParCov(0); - if (df2.process(trackParCovV0, getTrackParCov(bachelor))) { - trackParV0 = df2.getTrackParamAtPCA(0); - trackParBachelor = df2.getTrackParamAtPCA(1); + if (mDCAFitter.process(getTrackParCov(negTrack), getTrackParCov(posTrack))) { + trackParCovV0 = mDCAFitter.createParentTrackParCov(0); + if (mDCAFitter.process(trackParCovV0, getTrackParCov(bachelor))) { + trackParV0 = mDCAFitter.getTrackParamAtPCA(0); + trackParBachelor = mDCAFitter.getTrackParamAtPCA(1); trackParV0.getPxPyPzGlo(momenta[0]); trackParBachelor.getPxPyPzGlo(momenta[1]); std::array pVec; - df2.createParentTrackParCov().getPxPyPzGlo(pVec); - std::array pvPos = {primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ()}; - cpa = RecoDecay::cpa(pvPos, df2.getPCACandidate(), pVec); + mDCAFitter.createParentTrackParCov().getPxPyPzGlo(pVec); + cpa = RecoDecay::cpa(pvPos, mDCAFitter.getPCACandidate(), pVec); QAHistosStrangenessTracking.fill(HIST("hCpa"), cpa); } else { continue; From 76a17d514b67302730e5646755f02f0d9335cc58 Mon Sep 17 00:00:00 2001 From: GijsvWeelden <55794847+GijsvWeelden@users.noreply.github.com> Date: Wed, 16 Apr 2025 12:13:30 +0200 Subject: [PATCH 1009/1650] [PWGJE] Jet Fragmentation & V0 QA (#10845) --- PWGJE/Tasks/jetFragmentation.cxx | 3972 +++++++++++++++--------------- PWGJE/Tasks/v0QA.cxx | 154 +- 2 files changed, 2023 insertions(+), 2103 deletions(-) diff --git a/PWGJE/Tasks/jetFragmentation.cxx b/PWGJE/Tasks/jetFragmentation.cxx index f449a0b26de..c181254819f 100644 --- a/PWGJE/Tasks/jetFragmentation.cxx +++ b/PWGJE/Tasks/jetFragmentation.cxx @@ -55,14 +55,15 @@ using MCPJetsWithConstituents = soa::Join; // V0 jets +using DataV0JetsWithConstituents = soa::Join; +using CandidatesV0DataWithFlags = soa::Join; + +using CandidatesV0MCDWithLabelsAndFlags = soa::Join; using MCDV0Jets = aod::V0ChargedMCDetectorLevelJets; using MCDV0JetsWithConstituents = soa::Join; using MatchedMCDV0Jets = soa::Join; using MatchedMCDV0JetsWithConstituents = soa::Join; -using CandidatesV0DataWithFlags = soa::Join; -using CandidatesV0MCDWithLabels = soa::Join; - using MCPV0Jets = aod::V0ChargedMCParticleLevelJets; using MCPV0JetsWithConstituents = soa::Join; using MatchedMCPV0Jets = soa::Join; @@ -72,27 +73,14 @@ struct JetFragmentation { HistogramRegistry registry{"registry"}; // CallSumw2 = false? Configurable evSel{"evSel", "sel8WithoutTimeFrameBorderCut", "choose event selection"}; - Configurable vertexZCut{"vertexZCut", 10.f, "vertex z cut"}; + Configurable trackSel{"trackSel", "globalTracks", "choose track selection"}; + Configurable nV0Classes{"nV0Classes", 2, "Must be 2 or 4! Number of V0 signal/bkg classes"}; + Configurable doCorrectionWithTracks{"doCorrectionWithTracks", false, "add tracks during background subtraction"}; - Configurable matchedDetJetEtaMin{"matchedDetJetEtaMin", -0.5, "minimum matchedDetJet eta"}; - Configurable matchedDetJetEtaMax{"matchedDetJetEtaMax", 0.5, "maximum matchedDetJet eta"}; - Configurable dataJetEtaMin{"dataJetEtaMin", -0.5, "minimum data jet eta"}; - Configurable dataJetEtaMax{"dataJetEtaMax", 0.5, "maximum data jet eta"}; + Configurable vertexZCut{"vertexZCut", 10.f, "vertex z cut"}; Configurable v0EtaMin{"v0EtaMin", -0.75, "minimum data V0 eta"}; Configurable v0EtaMax{"v0EtaMax", 0.75, "maximum data V0 eta"}; - Configurable v0cospaMin{"v0cospaMin", 0.995, "V0 CosPA"}; - Configurable dcav0dauMax{"dcav0dauMax", 1.0, "DCA V0 Daughters"}; - Configurable dcaprMin{"dcaprMin", 0.1, "DCA proton To PV"}; - Configurable dcapiMin{"dcapiMin", 0.1, "DCA pion To PV"}; - Configurable v0radiusMin{"v0radiusMin", 1.2, "V0 Radius"}; - Configurable lifetimeK0SMax{"lifetimeK0SMax", 20., "lifetimeK0SMax"}; - Configurable lifetimeLambdaMax{"lifetimeLambdaMax", 25., "lifetimeLambdaMax"}; - - Configurable k0sMassAccWindow{"k0sMassAccWindow", 0.03, "k0sMassAccWindow"}; - Configurable lambdaMassAccWindow{"lambdaMassAccWindow", 0.01, "lambdaMassAccWindow"}; - Configurable antilambdaMassAccWindow{"antilambdaMassAccWindow", 0.01, "antilambdaMassAccWindow"}; - // Binning ConfigurableAxis binJetPt{"binJetPt", {40, 0.f, 200.f}, ""}; ConfigurableAxis binEta{"binEta", {20, -1.f, 1.f}, ""}; @@ -150,27 +138,18 @@ struct JetFragmentation { ConfigurableAxis binV0DCAdCut{"binV0DCAdCut", {2, 0.5f, 1.5f}, "DCA daughters"}; ConfigurableAxis binV0PtCut{"binV0PtCut", {60, 0.0f, 60.0f}, "p_{T, V0}"}; ConfigurableAxis binK0SMassCut{"binK0SMassCut", {100, 0.4f, 0.6f}, "inv. mass, K0S hypothesis"}; - ConfigurableAxis binLambda0MassCut{"binLambda0MassCut", {100, 1.07f, 1.21f}, "inv. mass, Lambda0 hypothesis"}; - ConfigurableAxis binAntiLambda0MassCut{"binAntiLambda0MassCut", {100, 1.07f, 1.21f}, "inv. mass, AntiLambda0 hypothesis"}; + ConfigurableAxis binLambdaMassCut{"binLambdaMassCut", {100, 1.07f, 1.21f}, "inv. mass, Lambda hypothesis"}; + ConfigurableAxis binAntiLambdaMassCut{"binAntiLambdaMassCut", {100, 1.07f, 1.21f}, "inv. mass, AntiLambda hypothesis"}; Filter jetCollisionFilter = nabs(aod::jcollision::posZ) < vertexZCut; - Filter collisionFilter = nabs(aod::collision::posZ) < vertexZCut; - - Partition detJetEtaPartition = (aod::jet::eta > matchedDetJetEtaMin) && (aod::jet::eta < matchedDetJetEtaMax); - Partition detJetEtaV0Partition = (aod::jet::eta > v0EtaMin + aod::jet::r * 0.01f) && (aod::jet::eta < v0EtaMax - aod::jet::r * 0.01f); - - Preslice tracksPerCollision = aod::track::collisionId; - Preslice> v0sPerCollision = aod::v0data::collisionId; - Preslice> mcV0sPerCollision = aod::v0data::collisionId; - Preslice partJetsPerCollision = aod::jet::mcCollisionId; - Preslice jetParticlesPerCollision = aod::jmcparticle::mcCollisionId; - Preslice particlesPerCollision = aod::mcparticle::mcCollisionId; std::vector eventSelectionBits; + int trackSelection = -1; void init(InitContext&) { eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast(evSel)); + trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast(trackSel)); // Axes AxisSpec jetPtAxis = {binJetPt, "#it{p}_{T}^{ jet}"}; // Data @@ -240,35 +219,15 @@ struct JetFragmentation { AxisSpec dcadCutAxis = {binV0DCAdCut, "DCA daughters (cm^{2})"}; AxisSpec ptCutAxis = {binV0PtCut, "p_{T, V0}"}; AxisSpec k0SMassCutAxis = {binK0SMassCut, "Inv. mass (GeV/#it{c}^{2})"}; - AxisSpec lambdaMassCutAxis = {binLambda0MassCut, "Inv. mass (GeV/#it{c}^{2})"}; - AxisSpec antiLambdaMassCutAxis = {binAntiLambda0MassCut, "Inv. mass (GeV/#it{c}^{2})"}; + AxisSpec lambdaMassCutAxis = {binLambdaMassCut, "Inv. mass (GeV/#it{c}^{2})"}; + AxisSpec antiLambdaMassCutAxis = {binAntiLambdaMassCut, "Inv. mass (GeV/#it{c}^{2})"}; - if (doprocessDataRun3) { - registry.add("data/nJetsnTracks", "nJetsnTracks; nJets; nTracks", HistType::kTH2D, {jetCount, trackCount}); - registry.add("data/collision/collisionVtxZ", "Collision vertex z (cm)", HistType::kTH1D, {binVtxZ}); - registry.add("data/tracks/trackPtEtaPhi", "trackPtEtaPhi", HistType::kTH3D, {trackPtAxis, etaAxis, phiAxis}); - } - if (doprocessDataRun3 || doprocessDataV0Frag || doprocessDataV0JetsFrag || doprocessDataV0JetsFragWithWeights) { - registry.add("data/jets/jetPtEtaPhi", "Jet #it{p}_{T}, #eta, #phi", HistType::kTH3D, {jetPtAxis, etaAxis, phiAxis}); - } - if (doprocessDataRun3 || doprocessDataV0Frag) { - registry.add("data/jets/jetPtTrackPt", "Jet #it{p}_{T}, track #it{p}_{T}", HistType::kTH2D, {jetPtAxis, trackPtAxis}); - registry.add("data/jets/jetTrackPtEtaPhi", "Tracks in jets #it{p}_{T}, #eta, #phi", HistType::kTH3D, {trackPtAxis, etaAxis, phiAxis}); - registry.add("data/jets/jetPtFrag", "Jet #it{p}_{T}, #it{p}_{T,jet}/#it{p}_{T,tr}", HistType::kTH2D, {jetPtAxis, zAxis}); - registry.add("data/jets/jetPtTrackProj", "Jet #it{p}_{T}, #it{z}", HistType::kTH2D, {jetPtAxis, zAxis}); - registry.add("data/jets/jetPtXi", "Jet #it{p}_{T}, #xi", HistType::kTH2D, {jetPtAxis, xiAxis}); - registry.add("data/jets/jetPtTheta", "Jet #it{p}_{T}, #theta", HistType::kTH2D, {jetPtAxis, thetaAxis}); - registry.add("data/jets/jetPtXiTheta", "Jet #it{p}_{T}, #xi, #theta", HistType::kTH3D, {jetPtAxis, xiAxis, thetaAxis}); - registry.add("data/jets/jetPtZTheta", "Jet #it{p}_{T}, z, #theta", HistType::kTH3D, {jetPtAxis, zAxis, thetaAxis}); - } // doprocessDataRun3 || doprocessDataV0Frag - - if (doprocessDataV0 || doprocessDataV0Frag || doprocessDataV0JetsFrag || doprocessDataV0JetsFragWithWeights || doprocessDataV0PerpCone) { + if (doprocessDataV0) { registry.add("data/V0/nV0sEvent", "nV0sEvent", HistType::kTH1D, {v0Count}); - // TODO: Does this make sense? - registry.add("data/V0/nV0sEventWeighted", "nV0s per event (weighted)", HistType::kTH1D, {v0Count}); - registry.get(HIST("data/V0/nV0sEventWeighted"))->Sumw2(); + registry.add("data/V0/nV0sEventAcc", "nV0s per event (accepted)", HistType::kTH1D, {v0Count}); + registry.add("data/V0/nV0sEventAccWeighted", "nV0s per event (accepted, weighted)", HistType::kTH1D, {v0Weight}, true); - // Unidentified + // Inclusive registry.add("data/V0/V0PtEtaPhi", "V0PtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); registry.add("data/V0/V0PtCtau", "V0PtCtau", HistType::kTHnSparseD, {v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); registry.add("data/V0/V0PtMass", "V0PtMass", HistType::kTHnSparseD, {v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); @@ -278,40 +237,103 @@ struct JetFragmentation { registry.add("data/V0/V0PtDCAposneg", "V0PtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}); registry.add("data/V0/V0PtDCAd", "V0PtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}); - // Identified + // Inclusive Weighted + registry.add("data/V0/V0PtEtaPhiWeighted", "V0PtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("data/V0/V0PtCtauWeighted", "V0PtCtau", HistType::kTHnSparseD, {v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}, true); + registry.add("data/V0/V0PtMassWeighted", "V0PtMass", HistType::kTHnSparseD, {v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("data/V0/V0PtMassWideWeighted", "V0PtMassWide", HistType::kTHnSparseD, {v0PtAxis, k0SWideAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("data/V0/V0PtLambdaMassesWeighted", "V0PtLambdaMasses", HistType::kTHnSparseD, {v0PtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}, true); + registry.add("data/V0/V0PtRadiusCosPAWeighted", "V0PtRadiusCosPA", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("data/V0/V0PtDCAposnegWeighted", "V0PtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("data/V0/V0PtDCAdWeighted", "V0PtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}, true); + + // K0S registry.add("data/V0/K0SPtEtaPhi", "K0SPtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); - registry.add("data/V0/K0SPtCtauMass", "K0SPtCtauMass", HistType::kTH3D, {v0partPtAxis, v0CtauAxis, k0SMassAxis}); registry.add("data/V0/K0SPtRadiusCosPA", "K0SPtRadiusCosPA", HistType::kTH3D, {v0partPtAxis, v0RadiusAxis, v0CosPAAxis}); registry.add("data/V0/K0SPtDCAposneg", "K0SPtDCAposneg", HistType::kTH3D, {v0partPtAxis, v0DCApAxis, v0DCAnAxis}); registry.add("data/V0/K0SPtDCAd", "K0SPtDCAd", HistType::kTH2D, {v0partPtAxis, v0DCAdAxis}); + registry.add("data/V0/K0SPtCtauMass", "K0SPtCtauMass", HistType::kTH3D, {v0partPtAxis, v0CtauAxis, k0SMassAxis}); + registry.add("data/V0/K0SPtRadiusMass", "K0SPtRadiusMass", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, k0SMassAxis}); + registry.add("data/V0/K0SPtCosPAMass", "K0SPtCosPAMass", HistType::kTH3D, {v0PtAxis, v0CosPAAxis, k0SMassAxis}); + registry.add("data/V0/K0SPtDCAposMass", "K0SPtDCAposMass", HistType::kTH3D, {v0PtAxis, v0DCApAxis, k0SMassAxis}); + registry.add("data/V0/K0SPtDCAnegMass", "K0SPtDCAnegMass", HistType::kTH3D, {v0PtAxis, v0DCAnAxis, k0SMassAxis}); + registry.add("data/V0/K0SPtDCAdMass", "K0SPtDCAdMass", HistType::kTH3D, {v0PtAxis, v0DCAdAxis, k0SMassAxis}); + + // K0S Weighted + registry.add("data/V0/K0SPtEtaPhiWeighted", "K0SPtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("data/V0/K0SPtRadiusCosPAWeighted", "K0SPtRadiusCosPA", HistType::kTH3D, {v0partPtAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("data/V0/K0SPtDCAposnegWeighted", "K0SPtDCAposneg", HistType::kTH3D, {v0partPtAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("data/V0/K0SPtDCAdWeighted", "K0SPtDCAd", HistType::kTH2D, {v0partPtAxis, v0DCAdAxis}, true); + registry.add("data/V0/K0SPtCtauMassWeighted", "K0SPtCtauMass", HistType::kTH3D, {v0partPtAxis, v0CtauAxis, k0SMassAxis}, true); + registry.add("data/V0/K0SPtRadiusMassWeighted", "K0SPtRadiusMassWeighted", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, k0SMassAxis}, true); + registry.add("data/V0/K0SPtCosPAMassWeighted", "K0SPtCosPAMassWeighted", HistType::kTH3D, {v0PtAxis, v0CosPAAxis, k0SMassAxis}, true); + registry.add("data/V0/K0SPtDCAposMassWeighted", "K0SPtDCAposMassWeighted", HistType::kTH3D, {v0PtAxis, v0DCApAxis, k0SMassAxis}, true); + registry.add("data/V0/K0SPtDCAnegMassWeighted", "K0SPtDCAnegMassWeighted", HistType::kTH3D, {v0PtAxis, v0DCAnAxis, k0SMassAxis}, true); + registry.add("data/V0/K0SPtDCAdMassWeighted", "K0SPtDCAdMassWeighted", HistType::kTH3D, {v0PtAxis, v0DCAdAxis, k0SMassAxis}, true); + // Lambda registry.add("data/V0/LambdaPtEtaPhi", "LambdaPtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); - registry.add("data/V0/LambdaPtCtauMass", "LambdaPtCtauMass", HistType::kTH3D, {v0partPtAxis, v0CtauAxis, lambdaMassAxis}); registry.add("data/V0/LambdaPtLambdaMasses", "LambdaPtLambdaMasses", HistType::kTHnSparseD, {v0PtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); registry.add("data/V0/LambdaPtRadiusCosPA", "LambdaPtRadiusCosPA", HistType::kTH3D, {v0partPtAxis, v0RadiusAxis, v0CosPAAxis}); registry.add("data/V0/LambdaPtDCAposneg", "LambdaPtDCAposneg", HistType::kTH3D, {v0partPtAxis, v0DCApAxis, v0DCAnAxis}); registry.add("data/V0/LambdaPtDCAd", "LambdaPtDCAd", HistType::kTH2D, {v0partPtAxis, v0DCAdAxis}); + registry.add("data/V0/LambdaPtCtauMass", "LambdaPtCtauMass", HistType::kTH3D, {v0partPtAxis, v0CtauAxis, lambdaMassAxis}); + registry.add("data/V0/LambdaPtRadiusMass", "LambdaPtRadiusMass", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, lambdaMassAxis}); + registry.add("data/V0/LambdaPtCosPAMass", "LambdaPtCosPAMass", HistType::kTH3D, {v0PtAxis, v0CosPAAxis, lambdaMassAxis}); + registry.add("data/V0/LambdaPtDCAposMass", "LambdaPtDCAposMass", HistType::kTH3D, {v0PtAxis, v0DCApAxis, lambdaMassAxis}); + registry.add("data/V0/LambdaPtDCAnegMass", "LambdaPtDCAnegMass", HistType::kTH3D, {v0PtAxis, v0DCAnAxis, lambdaMassAxis}); + registry.add("data/V0/LambdaPtDCAdMass", "LambdaPtDCAdMass", HistType::kTH3D, {v0PtAxis, v0DCAdAxis, lambdaMassAxis}); + + // Lambda Weighted + registry.add("data/V0/LambdaPtEtaPhiWeighted", "LambdaPtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("data/V0/LambdaPtLambdaMassesWeighted", "LambdaPtLambdaMasses", HistType::kTHnSparseD, {v0PtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}, true); + registry.add("data/V0/LambdaPtRadiusCosPAWeighted", "LambdaPtRadiusCosPA", HistType::kTH3D, {v0partPtAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("data/V0/LambdaPtDCAposnegWeighted", "LambdaPtDCAposneg", HistType::kTH3D, {v0partPtAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("data/V0/LambdaPtDCAdWeighted", "LambdaPtDCAd", HistType::kTH2D, {v0partPtAxis, v0DCAdAxis}, true); + registry.add("data/V0/LambdaPtCtauMassWeighted", "LambdaPtCtauMass", HistType::kTH3D, {v0partPtAxis, v0CtauAxis, lambdaMassAxis}, true); + registry.add("data/V0/LambdaPtRadiusMassWeighted", "LambdaPtRadiusMassWeighted", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, lambdaMassAxis}, true); + registry.add("data/V0/LambdaPtCosPAMassWeighted", "LambdaPtCosPAMassWeighted", HistType::kTH3D, {v0PtAxis, v0CosPAAxis, lambdaMassAxis}, true); + registry.add("data/V0/LambdaPtDCAposMassWeighted", "LambdaPtDCAposMassWeighted", HistType::kTH3D, {v0PtAxis, v0DCApAxis, lambdaMassAxis}, true); + registry.add("data/V0/LambdaPtDCAnegMassWeighted", "LambdaPtDCAnegMassWeighted", HistType::kTH3D, {v0PtAxis, v0DCAnAxis, lambdaMassAxis}, true); + registry.add("data/V0/LambdaPtDCAdMassWeighted", "LambdaPtDCAdMassWeighted", HistType::kTH3D, {v0PtAxis, v0DCAdAxis, lambdaMassAxis}, true); - registry.add("data/V0/antiLambdaPtEtaPhi", "antiLambdaPtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); - registry.add("data/V0/antiLambdaPtCtauMass", "antiLambdaPtCtauMass", HistType::kTH3D, {v0partPtAxis, v0CtauAxis, lambdaMassAxis}); - registry.add("data/V0/antiLambdaPtLambdaMasses", "antiLambdaPtLambdaMasses", HistType::kTHnSparseD, {v0PtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); - registry.add("data/V0/antiLambdaPtRadiusCosPA", "antiLambdaPtRadiusCosPA", HistType::kTH3D, {v0partPtAxis, v0RadiusAxis, v0CosPAAxis}); - registry.add("data/V0/antiLambdaPtDCAposneg", "antiLambdaPtDCAposneg", HistType::kTH3D, {v0partPtAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("data/V0/antiLambdaPtDCAd", "antiLambdaPtDCAd", HistType::kTH2D, {v0partPtAxis, v0DCAdAxis}); - + // AntiLambda + registry.add("data/V0/AntiLambdaPtEtaPhi", "AntiLambdaPtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); + registry.add("data/V0/AntiLambdaPtLambdaMasses", "AntiLambdaPtLambdaMasses", HistType::kTHnSparseD, {v0PtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); + registry.add("data/V0/AntiLambdaPtRadiusCosPA", "AntiLambdaPtRadiusCosPA", HistType::kTH3D, {v0partPtAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("data/V0/AntiLambdaPtDCAposneg", "AntiLambdaPtDCAposneg", HistType::kTH3D, {v0partPtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("data/V0/AntiLambdaPtDCAd", "AntiLambdaPtDCAd", HistType::kTH2D, {v0partPtAxis, v0DCAdAxis}); + registry.add("data/V0/AntiLambdaPtCtauMass", "AntiLambdaPtCtauMass", HistType::kTH3D, {v0partPtAxis, v0CtauAxis, lambdaMassAxis}); + registry.add("data/V0/AntiLambdaPtRadiusMass", "AntiLambdaPtRadiusMass", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, lambdaMassAxis}); + registry.add("data/V0/AntiLambdaPtCosPAMass", "AntiLambdaPtCosPAMass", HistType::kTH3D, {v0PtAxis, v0CosPAAxis, lambdaMassAxis}); + registry.add("data/V0/AntiLambdaPtDCAposMass", "AntiLambdaPtDCAposMass", HistType::kTH3D, {v0PtAxis, v0DCApAxis, lambdaMassAxis}); + registry.add("data/V0/AntiLambdaPtDCAnegMass", "AntiLambdaPtDCAnegMass", HistType::kTH3D, {v0PtAxis, v0DCAnAxis, lambdaMassAxis}); + registry.add("data/V0/AntiLambdaPtDCAdMass", "AntiLambdaPtDCAdMass", HistType::kTH3D, {v0PtAxis, v0DCAdAxis, lambdaMassAxis}); + + // AntiLambda Weighted + registry.add("data/V0/AntiLambdaPtEtaPhiWeighted", "AntiLambdaPtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("data/V0/AntiLambdaPtLambdaMassesWeighted", "AntiLambdaPtLambdaMasses", HistType::kTHnSparseD, {v0PtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}, true); + registry.add("data/V0/AntiLambdaPtRadiusCosPAWeighted", "AntiLambdaPtRadiusCosPA", HistType::kTH3D, {v0partPtAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("data/V0/AntiLambdaPtDCAposnegWeighted", "AntiLambdaPtDCAposneg", HistType::kTH3D, {v0partPtAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("data/V0/AntiLambdaPtDCAdWeighted", "AntiLambdaPtDCAd", HistType::kTH2D, {v0partPtAxis, v0DCAdAxis}, true); + registry.add("data/V0/AntiLambdaPtCtauMassWeighted", "AntiLambdaPtCtauMass", HistType::kTH3D, {v0partPtAxis, v0CtauAxis, lambdaMassAxis}, true); + registry.add("data/V0/AntiLambdaPtRadiusMassWeighted", "AntiLambdaPtRadiusMassWeighted", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, lambdaMassAxis}, true); + registry.add("data/V0/AntiLambdaPtCosPAMassWeighted", "AntiLambdaPtCosPAMassWeighted", HistType::kTH3D, {v0PtAxis, v0CosPAAxis, lambdaMassAxis}, true); + registry.add("data/V0/AntiLambdaPtDCAposMassWeighted", "AntiLambdaPtDCAposMassWeighted", HistType::kTH3D, {v0PtAxis, v0DCApAxis, lambdaMassAxis}, true); + registry.add("data/V0/AntiLambdaPtDCAnegMassWeighted", "AntiLambdaPtDCAnegMassWeighted", HistType::kTH3D, {v0PtAxis, v0DCAnAxis, lambdaMassAxis}, true); + registry.add("data/V0/AntiLambdaPtDCAdMassWeighted", "AntiLambdaPtDCAdMassWeighted", HistType::kTH3D, {v0PtAxis, v0DCAdAxis, lambdaMassAxis}, true); + + // Cut variation registry.add("data/V0/V0CutVariation", "V0CutVariation", HistType::kTHnSparseD, {ptCutAxis, k0SMassCutAxis, lambdaMassCutAxis, antiLambdaMassCutAxis, rCutAxis, ctauCutAxis, cosPACutAxis, dcapCutAxis, dcanCutAxis, dcadCutAxis}); - } // doprocessDataV0 || doprocessDataV0Frag || doprocessDataV0JetsFrag + } // doprocessDataV0 - if (doprocessDataV0Frag) { - registry.add("data/jets/V0/jetCorrectedPtEtaPhi", "Jet #it{p}_{T}, #eta, #phi", HistType::kTH3D, {jetPtAxis, etaAxis, phiAxis}); - registry.add("data/jets/V0/jetPtnV0", "jetPtnV0", HistType::kTH2D, {jetPtAxis, v0Count}); - registry.add("data/jets/V0/jetCorrectedPtV0TrackProj", "jetCorrectedPtV0TrackProj", HistType::kTH2D, {jetPtAxis, zAxis}); - } + if (doprocessDataV0JetsFrag) { + registry.add("data/jets/jetPtEtaPhi", "Jet #it{p}_{T}, #eta, #phi", HistType::kTH3D, {jetPtAxis, etaAxis, phiAxis}); - if (doprocessDataV0Frag || doprocessDataV0JetsFrag || doprocessDataV0JetsFragWithWeights) { registry.add("data/jets/V0/jetPtV0TrackProj", "jetPtV0TrackProj", HistType::kTH2D, {jetPtAxis, zAxis}); registry.add("data/jets/V0/jetPtnV0nK0SnLambdanAntiLambda", "jetPtnV0nK0SnLambdanAntiLambda", HistType::kTHnSparseD, {jetPtAxis, v0Count, v0Count, v0Count, v0Count}); + // Inclusive registry.add("data/jets/V0/jetPtV0PtEtaPhi", "jetPtV0PtEtaPhi", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0EtaAxis, v0PhiAxis}); registry.add("data/jets/V0/jetPtV0PtCtau", "jetPtV0PtCtau", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); registry.add("data/jets/V0/jetPtV0PtMass", "jetPtV0PtMass", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); @@ -329,8 +351,36 @@ struct JetFragmentation { registry.add("data/jets/V0/jetPtV0TrackProjDCAposneg", "jetPtV0TrackProjDCAposneg", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, v0DCAnAxis}); registry.add("data/jets/V0/jetPtV0TrackProjDCAd", "jetPtV0TrackProjDCAd", HistType::kTH3D, {jetPtAxis, zAxis, v0DCAdAxis}); - // Identified - registry.add("data/jets/V0/jetPtnLambda", "jetPtnLambda", HistType::kTH2D, {jetPtAxis, trackCount}); + // K0S + registry.add("data/jets/V0/jetPtK0SPtCtau", "Jet #it{p}_{T}, #it{p}_{T, K^{0}_{S}}, c#tau", HistType::kTH3D, {jetPtAxis, v0PtAxis, v0CtauAxis}); + registry.add("data/jets/V0/jetPtK0SPtMass", "Jet #it{p}_{T}, #it{p}_{T, K^{0}_{S}}, mass", HistType::kTH3D, {jetPtAxis, v0PtAxis, k0SMassAxis}); + registry.add("data/jets/V0/jetPtK0SPtAllMasses", "jetPtK0SPtAllMasses", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtK0SPtRadius", "Jet #it{p}_{T}, #it{p}_{T, K^{0}_{S}}, radius", HistType::kTH3D, {jetPtAxis, v0PtAxis, v0RadiusAxis}); + registry.add("data/jets/V0/jetPtK0SPtCosPA", "Jet #it{p}_{T}, #it{p}_{T, K^{0}_{S}}, cosPA", HistType::kTH3D, {jetPtAxis, v0PtAxis, v0CosPAAxis}); + registry.add("data/jets/V0/jetPtK0SPtDCAd", "Jet #it{p}_{T}, #it{p}_{T, K^{0}_{S}}, DCA daughters", HistType::kTH3D, {jetPtAxis, v0PtAxis, v0DCAdAxis}); + registry.add("data/jets/V0/jetPtK0SPtDCAposneg", "Jet #it{p}_{T}, #it{p}_{T, K^{0}_{S}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("data/jets/V0/jetPtK0SPtCtauMass", "jetPtK0SPtCtauMass", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0CtauAxis, k0SMassAxis}); + registry.add("data/jets/V0/jetPtK0SPtRadiusMass", "jetPtK0SPtRadiusMass", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0RadiusAxis, k0SMassAxis}); + registry.add("data/jets/V0/jetPtK0SPtCosPAMass", "jetPtK0SPtCosPAMass", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0CosPAAxis, k0SMassAxis}); + registry.add("data/jets/V0/jetPtK0SPtDCAposMass", "jetPtK0SPtDCAposMass", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0DCApAxis, k0SMassAxis}); + registry.add("data/jets/V0/jetPtK0SPtDCAnegMass", "jetPtK0SPtDCAnegMass", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0DCAnAxis, k0SMassAxis}); + registry.add("data/jets/V0/jetPtK0SPtDCAdMass", "jetPtK0SPtDCAdMass", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0DCAdAxis, k0SMassAxis}); + + registry.add("data/jets/V0/jetPtK0STrackProjCtau", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, c#tau", HistType::kTH3D, {jetPtAxis, zAxis, v0CtauAxis}); + registry.add("data/jets/V0/jetPtK0STrackProjMass", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, mass", HistType::kTH3D, {jetPtAxis, zAxis, k0SMassAxis}); + registry.add("data/jets/V0/jetPtK0STrackProjAllMasses", "jetPtK0STrackProjAllMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtK0STrackProjRadius", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, radius", HistType::kTH3D, {jetPtAxis, zAxis, v0RadiusAxis}); + registry.add("data/jets/V0/jetPtK0STrackProjCosPA", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, cosPA", HistType::kTH3D, {jetPtAxis, zAxis, v0CosPAAxis}); + registry.add("data/jets/V0/jetPtK0STrackProjDCAd", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, DCA daughters", HistType::kTH3D, {jetPtAxis, zAxis, v0DCAdAxis}); + registry.add("data/jets/V0/jetPtK0STrackProjDCAposneg", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("data/jets/V0/jetPtK0STrackProjCtauMass", "jetPtK0STrackProjCtauMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0CtauAxis, k0SMassAxis}); + registry.add("data/jets/V0/jetPtK0STrackProjRadiusMass", "jetPtK0STrackProjRadiusMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0RadiusAxis, k0SMassAxis}); + registry.add("data/jets/V0/jetPtK0STrackProjCosPAMass", "jetPtK0STrackProjCosPAMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0CosPAAxis, k0SMassAxis}); + registry.add("data/jets/V0/jetPtK0STrackProjDCAposMass", "jetPtK0STrackProjDCAposMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, k0SMassAxis}); + registry.add("data/jets/V0/jetPtK0STrackProjDCAnegMass", "jetPtK0STrackProjDCAnegMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCAnAxis, k0SMassAxis}); + registry.add("data/jets/V0/jetPtK0STrackProjDCAdMass", "jetPtK0STrackProjDCAdMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCAdAxis, k0SMassAxis}); + + // Lambda registry.add("data/jets/V0/jetPtLambdaPtCtau", "Jet #it{p}_{T}, #it{p}_{T, #Lambda^{0}}, c#tau", HistType::kTH3D, {jetPtAxis, v0PtAxis, v0CtauAxis}); registry.add("data/jets/V0/jetPtLambdaPtMass", "Jet #it{p}_{T}, #it{p}_{T, #Lambda^{0}}, mass", HistType::kTH3D, {jetPtAxis, v0PtAxis, lambdaMassAxis}); registry.add("data/jets/V0/jetPtLambdaPtAllMasses", "jetPtLambdaPtAllMasses", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); @@ -339,6 +389,12 @@ struct JetFragmentation { registry.add("data/jets/V0/jetPtLambdaPtCosPA", "Jet #it{p}_{T}, #it{p}_{T, #Lambda^{0}}, cosPA", HistType::kTH3D, {jetPtAxis, v0PtAxis, v0CosPAAxis}); registry.add("data/jets/V0/jetPtLambdaPtDCAd", "Jet #it{p}_{T}, #it{p}_{T, #Lambda^{0}}, DCA daughters", HistType::kTH3D, {jetPtAxis, v0PtAxis, v0DCAdAxis}); registry.add("data/jets/V0/jetPtLambdaPtDCAposneg", "Jet #it{p}_{T}, #it{p}_{T, #Lambda^{0}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("data/jets/V0/jetPtLambdaPtCtauMass", "jetPtLambdaPtCtauMass", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0CtauAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtLambdaPtRadiusMass", "jetPtLambdaPtRadiusMass", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0RadiusAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtLambdaPtCosPAMass", "jetPtLambdaPtCosPAMass", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0CosPAAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtLambdaPtDCAposMass", "jetPtLambdaPtDCAposMass", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0DCApAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtLambdaPtDCAnegMass", "jetPtLambdaPtDCAnegMass", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0DCAnAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtLambdaPtDCAdMass", "jetPtLambdaPtDCAdMass", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0DCAdAxis, lambdaMassAxis}); registry.add("data/jets/V0/jetPtLambdaTrackProjCtau", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, c#tau", HistType::kTH3D, {jetPtAxis, zAxis, v0CtauAxis}); registry.add("data/jets/V0/jetPtLambdaTrackProjMass", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, mass", HistType::kTH3D, {jetPtAxis, zAxis, lambdaMassAxis}); @@ -348,8 +404,14 @@ struct JetFragmentation { registry.add("data/jets/V0/jetPtLambdaTrackProjCosPA", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, cosPA", HistType::kTH3D, {jetPtAxis, zAxis, v0CosPAAxis}); registry.add("data/jets/V0/jetPtLambdaTrackProjDCAd", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, DCA daughters", HistType::kTH3D, {jetPtAxis, zAxis, v0DCAdAxis}); registry.add("data/jets/V0/jetPtLambdaTrackProjDCAposneg", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("data/jets/V0/jetPtLambdaTrackProjCtauMass", "jetPtLambdaTrackProjCtauMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0CtauAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtLambdaTrackProjRadiusMass", "jetPtLambdaTrackProjRadiusMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0RadiusAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtLambdaTrackProjCosPAMass", "jetPtLambdaTrackProjCosPAMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0CosPAAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtLambdaTrackProjDCAposMass", "jetPtLambdaTrackProjDCAposMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtLambdaTrackProjDCAnegMass", "jetPtLambdaTrackProjDCAnegMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCAnAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtLambdaTrackProjDCAdMass", "jetPtLambdaTrackProjDCAdMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCAdAxis, lambdaMassAxis}); - registry.add("data/jets/V0/jetPtnAntiLambda", "jetPtnAntiLambda", HistType::kTH2D, {jetPtAxis, trackCount}); + // AntiLambda registry.add("data/jets/V0/jetPtAntiLambdaPtCtau", "Jet #it{p}_{T}, #it{p}_{T, #bar{#Lambda}^{0}}, c#tau", HistType::kTH3D, {jetPtAxis, v0PtAxis, v0CtauAxis}); registry.add("data/jets/V0/jetPtAntiLambdaPtMass", "Jet #it{p}_{T}, #it{p}_{T, #bar{#Lambda}^{0}}, mass", HistType::kTH3D, {jetPtAxis, v0PtAxis, lambdaMassAxis}); registry.add("data/jets/V0/jetPtAntiLambdaPtAllMasses", "jetPtAntiLambdaPtAllMasses", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); @@ -358,6 +420,12 @@ struct JetFragmentation { registry.add("data/jets/V0/jetPtAntiLambdaPtCosPA", "Jet #it{p}_{T}, #it{p}_{T, #bar{#Lambda}^{0}}, cosPA", HistType::kTH3D, {jetPtAxis, v0PtAxis, v0CosPAAxis}); registry.add("data/jets/V0/jetPtAntiLambdaPtDCAd", "Jet #it{p}_{T}, #it{p}_{T, #bar{#Lambda}^{0}}, DCA daughters", HistType::kTH3D, {jetPtAxis, v0PtAxis, v0DCAdAxis}); registry.add("data/jets/V0/jetPtAntiLambdaPtDCAposneg", "Jet #it{p}_{T}, #it{p}_{T, #bar{#Lambda}^{0}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("data/jets/V0/jetPtAntiLambdaPtCtauMass", "jetPtAntiLambdaPtCtauMass", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0CtauAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtAntiLambdaPtRadiusMass", "jetPtAntiLambdaPtRadiusMass", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0RadiusAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtAntiLambdaPtCosPAMass", "jetPtAntiLambdaPtCosPAMass", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0CosPAAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtAntiLambdaPtDCAposMass", "jetPtAntiLambdaPtDCAposMass", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0DCApAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtAntiLambdaPtDCAnegMass", "jetPtAntiLambdaPtDCAnegMass", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0DCAnAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtAntiLambdaPtDCAdMass", "jetPtAntiLambdaPtDCAdMass", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0DCAdAxis, lambdaMassAxis}); registry.add("data/jets/V0/jetPtAntiLambdaTrackProjCtau", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, c#tau", HistType::kTH3D, {jetPtAxis, zAxis, v0CtauAxis}); registry.add("data/jets/V0/jetPtAntiLambdaTrackProjMass", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, mass", HistType::kTH3D, {jetPtAxis, zAxis, lambdaMassAxis}); @@ -367,468 +435,513 @@ struct JetFragmentation { registry.add("data/jets/V0/jetPtAntiLambdaTrackProjCosPA", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, cosPA", HistType::kTH3D, {jetPtAxis, zAxis, v0CosPAAxis}); registry.add("data/jets/V0/jetPtAntiLambdaTrackProjDCAd", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, DCA daughters", HistType::kTH3D, {jetPtAxis, zAxis, v0DCAdAxis}); registry.add("data/jets/V0/jetPtAntiLambdaTrackProjDCAposneg", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, v0DCAnAxis}); - - registry.add("data/jets/V0/jetPtnK0S", "jetPtnK0S", HistType::kTH2D, {jetPtAxis, trackCount}); - registry.add("data/jets/V0/jetPtK0SPtCtau", "Jet #it{p}_{T}, #it{p}_{T, K^{0}_{S}}, c#tau", HistType::kTH3D, {jetPtAxis, v0PtAxis, v0CtauAxis}); - registry.add("data/jets/V0/jetPtK0SPtMass", "Jet #it{p}_{T}, #it{p}_{T, K^{0}_{S}}, mass", HistType::kTH3D, {jetPtAxis, v0PtAxis, k0SMassAxis}); - registry.add("data/jets/V0/jetPtK0SPtAllMasses", "jetPtK0SPtAllMasses", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("data/jets/V0/jetPtK0SPtRadius", "Jet #it{p}_{T}, #it{p}_{T, K^{0}_{S}}, radius", HistType::kTH3D, {jetPtAxis, v0PtAxis, v0RadiusAxis}); - registry.add("data/jets/V0/jetPtK0SPtCosPA", "Jet #it{p}_{T}, #it{p}_{T, K^{0}_{S}}, cosPA", HistType::kTH3D, {jetPtAxis, v0PtAxis, v0CosPAAxis}); - registry.add("data/jets/V0/jetPtK0SPtDCAd", "Jet #it{p}_{T}, #it{p}_{T, K^{0}_{S}}, DCA daughters", HistType::kTH3D, {jetPtAxis, v0PtAxis, v0DCAdAxis}); - registry.add("data/jets/V0/jetPtK0SPtDCAposneg", "Jet #it{p}_{T}, #it{p}_{T, K^{0}_{S}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}); - - registry.add("data/jets/V0/jetPtK0STrackProjCtau", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, c#tau", HistType::kTH3D, {jetPtAxis, zAxis, v0CtauAxis}); - registry.add("data/jets/V0/jetPtK0STrackProjMass", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, mass", HistType::kTH3D, {jetPtAxis, zAxis, k0SMassAxis}); - registry.add("data/jets/V0/jetPtK0STrackProjAllMasses", "jetPtK0STrackProjAllMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("data/jets/V0/jetPtK0STrackProjRadius", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, radius", HistType::kTH3D, {jetPtAxis, zAxis, v0RadiusAxis}); - registry.add("data/jets/V0/jetPtK0STrackProjCosPA", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, cosPA", HistType::kTH3D, {jetPtAxis, zAxis, v0CosPAAxis}); - registry.add("data/jets/V0/jetPtK0STrackProjDCAd", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, DCA daughters", HistType::kTH3D, {jetPtAxis, zAxis, v0DCAdAxis}); - registry.add("data/jets/V0/jetPtK0STrackProjDCAposneg", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, v0DCAnAxis}); - } // doprocessDataV0Frag || doprocessDataV0JetsFrag - - if (doprocessDataV0JetsFragWithWeights) { - // FIXME: These hists need Sumw2 - registry.add("data/jets/weighted/jetPtEtaPhi", "Jet #it{p}_{T}, #eta, #phi", HistType::kTH3D, {jetPtAxis, etaAxis, phiAxis}); - registry.add("data/jets/weighted/V0/jetPtnV0nK0SnLambdanAntiLambda", "jetPtnV0nK0SnLambdanAntiLambda", HistType::kTHnSparseD, {jetPtAxis, v0Weight, v0Weight, v0Weight, v0Weight}); - - registry.add("data/jets/weighted/V0/jetPtV0TrackProjCtau", "jetPtV0TrackProjCtau", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); - registry.add("data/jets/weighted/V0/jetPtV0TrackProjMass", "jetPtV0TrackProjMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("data/jets/weighted/V0/jetPtV0TrackProjMassWide", "jetPtV0TrackProjMassWide", HistType::kTHnSparseD, {jetPtAxis, zAxis, k0SWideAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("data/jets/weighted/V0/jetPtV0TrackProjLambdaMasses", "jetPtV0TrackProjLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); - registry.add("data/jets/weighted/V0/jetPtV0TrackProjRadiusCosPA", "jetPtV0TrackProjRadiusCosPA", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0RadiusAxis, v0CosPAAxis}); - registry.add("data/jets/weighted/V0/jetPtV0TrackProjDCAposneg", "jetPtV0TrackProjDCAposneg", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("data/jets/weighted/V0/jetPtV0TrackProjDCAd", "jetPtV0TrackProjDCAd", HistType::kTH3D, {jetPtAxis, zAxis, v0DCAdAxis}); - // K0S - registry.add("data/jets/weighted/V0/jetPtK0STrackProjCtau", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, c#tau", HistType::kTH3D, {jetPtAxis, zAxis, v0CtauAxis}); - registry.add("data/jets/weighted/V0/jetPtK0STrackProjMass", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, mass", HistType::kTH3D, {jetPtAxis, zAxis, k0SMassAxis}); - registry.add("data/jets/weighted/V0/jetPtK0STrackProjAllMasses", "jetPtK0STrackProjAllMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("data/jets/weighted/V0/jetPtK0STrackProjRadius", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, radius", HistType::kTH3D, {jetPtAxis, zAxis, v0RadiusAxis}); - registry.add("data/jets/weighted/V0/jetPtK0STrackProjCosPA", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, cosPA", HistType::kTH3D, {jetPtAxis, zAxis, v0CosPAAxis}); - registry.add("data/jets/weighted/V0/jetPtK0STrackProjDCAd", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, DCA daughters", HistType::kTH3D, {jetPtAxis, zAxis, v0DCAdAxis}); - registry.add("data/jets/weighted/V0/jetPtK0STrackProjDCAposneg", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, v0DCAnAxis}); - // Lambda - registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjCtau", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, c#tau", HistType::kTH3D, {jetPtAxis, zAxis, v0CtauAxis}); - registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjMass", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, mass", HistType::kTH3D, {jetPtAxis, zAxis, lambdaMassAxis}); - registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjAllMasses", "jetPtLambdaTrackProjAllMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjLambdaMasses", "jetPtLambdaTrackProjLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); - registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjRadius", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, radius", HistType::kTH3D, {jetPtAxis, zAxis, v0RadiusAxis}); - registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjCosPA", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, cosPA", HistType::kTH3D, {jetPtAxis, zAxis, v0CosPAAxis}); - registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjDCAd", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, DCA daughters", HistType::kTH3D, {jetPtAxis, zAxis, v0DCAdAxis}); - registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjDCAposneg", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, v0DCAnAxis}); - // AntiLambda - registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjCtau", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, c#tau", HistType::kTH3D, {jetPtAxis, zAxis, v0CtauAxis}); - registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjMass", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, mass", HistType::kTH3D, {jetPtAxis, zAxis, lambdaMassAxis}); - registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjAllMasses", "jetPtAntiLambdaTrackProjAllMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjLambdaMasses", "jetPtAntiLambdaTrackProjLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); - registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjRadius", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, radius", HistType::kTH3D, {jetPtAxis, zAxis, v0RadiusAxis}); - registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjCosPA", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, cosPA", HistType::kTH3D, {jetPtAxis, zAxis, v0CosPAAxis}); - registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjDCAd", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, DCA daughters", HistType::kTH3D, {jetPtAxis, zAxis, v0DCAdAxis}); - registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjDCAposneg", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, v0DCAnAxis}); - // Background - registry.add("data/jets/weighted/V0/jetPtBkgTrackProjCtau", "jetPtBkgTrackProjCtau", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); - registry.add("data/jets/weighted/V0/jetPtBkgTrackProjMass", "jetPtBkgTrackProjMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("data/jets/weighted/V0/jetPtBkgTrackProjLambdaMasses", "jetPtBkgTrackProjLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); - registry.add("data/jets/weighted/V0/jetPtBkgTrackProjRadiusCosPA", "jetPtBkgTrackProjRadiusCosPA", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0RadiusAxis, v0CosPAAxis}); - registry.add("data/jets/weighted/V0/jetPtBkgTrackProjDCAposneg", "jetPtBkgTrackProjDCAposneg", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("data/jets/weighted/V0/jetPtBkgTrackProjDCAd", "jetPtBkgTrackProjDCAd", HistType::kTH3D, {jetPtAxis, zAxis, v0DCAdAxis}); - } - - if (doprocessMcP || doprocessMcMatchedV0JetsFrag) { - registry.add("particle-level/jets/partJetPtEtaPhi", "Particle level jet #it{p}_{T}, #eta, #phi", HistType::kTH3D, {partJetPtAxis, partEtaAxis, partPhiAxis}); - } - if (doprocessMcP) { - registry.add("particle-level/nJetsnTracks", "nJetsnTracks; nJets; nTracks", HistType::kTH2D, {jetCount, trackCount}); - registry.add("particle-level/collision/partCollisionVtxZ", "Collision vertex z (cm)", HistType::kTH1D, {binVtxZ}); - registry.add("particle-level/tracks/partTrackPtEtaPhi", "partTrackPtEtaPhi", HistType::kTH3D, {trackPtAxis, etaAxis, phiAxis}); - registry.add("particle-level/jets/partJetPtTrackPt", "Particle level jet #it{p}_{T}, track #it{p}_{T}", HistType::kTH2D, {partJetPtAxis, trackPtAxis}); - registry.add("particle-level/jets/partJetTrackPtEtaPhi", "Particle level tracks in jets #it{p}_{T}, #eta, #phi", HistType::kTH3D, {trackPtAxis, partEtaAxis, partPhiAxis}); - registry.add("particle-level/jets/partJetPtFrag", "Particle level jet #it{p}_{T}, #it{p}_{T,jet}/#it{p}_{T,tr}", HistType::kTH2D, {partJetPtAxis, partZAxis}); - registry.add("particle-level/jets/partJetPtTrackProj", "Particle level jet #it{p}_{T}, #it{z}", HistType::kTH2D, {partJetPtAxis, partZAxis}); - registry.add("particle-level/jets/partJetPtXi", "Particle level jet #it{p}_{T}, #xi", HistType::kTH2D, {partJetPtAxis, partXiAxis}); - registry.add("particle-level/jets/partJetPtTheta", "Particle level jet #it{p}_{T}, #theta", HistType::kTH2D, {partJetPtAxis, partThetaAxis}); - registry.add("particle-level/jets/partJetPtXiTheta", "Particle level jet #it{p}_{T}, #xi, #theta", HistType::kTH3D, {partJetPtAxis, partXiAxis, partThetaAxis}); - registry.add("particle-level/jets/partJetPtZTheta", "Particle level jet #it{p}_{T}, z, #theta", HistType::kTH3D, {partJetPtAxis, partZAxis, partThetaAxis}); - } // doprocessMcP - - if (doprocessMcD || doprocessMcMatchedV0JetsFrag) { - registry.add("detector-level/jets/detJetPtEtaPhi", "Detector level jet #it{p}_{T}, #eta, #phi", HistType::kTH3D, {detJetPtAxis, detEtaAxis, detPhiAxis}); - } - if (doprocessMcD) { - registry.add("detector-level/nJetsnTracks", "nJetsnTracks; nJets; nTracks", HistType::kTH2D, {jetCount, trackCount}); - registry.add("detector-level/collision/detCollisionVtxZ", "Collision vertex z (cm)", HistType::kTH1D, {binVtxZ}); - registry.add("detector-level/tracks/detTrackPtEtaPhi", "detTrackPtEtaPhi", HistType::kTH3D, {trackPtAxis, etaAxis, phiAxis}); - registry.add("detector-level/jets/detJetPtTrackPt", "Detector level jet #it{p}_{T}, track #it{p}_{T}", HistType::kTH2D, {detJetPtAxis, trackPtAxis}); - registry.add("detector-level/jets/detJetTrackPtEtaPhi", "Detector level tracks in jets #it{p}_{T}, #eta, #phi", HistType::kTH3D, {trackPtAxis, detEtaAxis, detPhiAxis}); - registry.add("detector-level/jets/detJetPtFrag", "Detector level jet #it{p}_{T}, #it{p}_{T,jet}/#it{p}_{T,tr}", HistType::kTH2D, {detJetPtAxis, detZAxis}); - registry.add("detector-level/jets/detJetPtTrackProj", "Detector level jet #it{p}_{T}, #it{z}", HistType::kTH2D, {detJetPtAxis, detZAxis}); - registry.add("detector-level/jets/detJetPtXi", "Detector level jet #it{p}_{T}, #xi", HistType::kTH2D, {detJetPtAxis, detXiAxis}); - registry.add("detector-level/jets/detJetPtTheta", "Detector level jet #it{p}_{T}, #theta", HistType::kTH2D, {detJetPtAxis, detThetaAxis}); - registry.add("detector-level/jets/detJetPtXiTheta", "Detector level jet #it{p}_{T}, #xi, #theta", HistType::kTH3D, {detJetPtAxis, detXiAxis, detThetaAxis}); - registry.add("detector-level/jets/detJetPtZTheta", "Detector level jet #it{p}_{T}, z, #theta", HistType::kTH3D, {detJetPtAxis, detZAxis, detThetaAxis}); - } // doprocessMcD - - if (doprocessMcMatched || doprocessMcMatchedV0Frag || doprocessMcMatchedV0JetsFrag) { - registry.add("matching/jets/matchDetJetPtEtaPhi", "Matched detector level jet #it{p}_{T}, #eta, #phi", HistType::kTH3D, {detJetPtAxis, detEtaAxis, detPhiAxis}); - registry.add("matching/jets/matchPartJetPtEtaPhi", "Matched particle level jet #it{p}_{T}, #eta, #phi", HistType::kTH3D, {partJetPtAxis, partEtaAxis, partPhiAxis}); - registry.add("matching/jets/matchDetJetPtPartJetPt", "matchDetJetPtPartJetPt", HistType::kTH2D, {detJetPtAxis, partJetPtAxis}); - registry.add("matching/jets/matchPartJetPtDetJetEtaPartJetEta", "matchPartJetPtDetJetEtaPartJetEta", HistType::kTH3D, {partJetPtAxis, detEtaAxis, partEtaAxis}); - registry.add("matching/jets/matchPartJetPtDetJetPhiPartJetPhi", "matchPartJetPtDetJetPhiPartJetPhi", HistType::kTH3D, {partJetPtAxis, detPhiAxis, partPhiAxis}); - registry.add("matching/jets/matchPartJetPtResolutionPt", "#it{p}_{T}^{jet, det} - #it{p}_{T}^{jet, part}", HistType::kTH2D, {partJetPtAxis, ptDiffAxis}); - registry.add("matching/jets/matchPartJetPtRelDiffPt", "#it{p}_{T}^{jet, det} - #it{p}_{T}^{jet, part}", HistType::kTH2D, {partJetPtAxis, ptJetRelDiffAxis}); - registry.add("matching/jets/matchPartJetPtResolutionEta", "#eta^{jet, det} - #eta^{jet, part}", HistType::kTH3D, {partJetPtAxis, partEtaAxis, etaDiffAxis}); - registry.add("matching/jets/matchPartJetPtResolutionPhi", "#phi^{jet, det} - #phi^{jet, part}", HistType::kTH3D, {partJetPtAxis, partPhiAxis, phiDiffAxis}); - registry.add("matching/jets/matchPartJetPtEtaPhiMatchDist", "matchJetMatchDist", HistType::kTHnSparseD, {partJetPtAxis, partEtaAxis, partPhiAxis, matchDistAxis}); - registry.add("matching/jets/matchPartJetPtEnergyScale", "jetEnergyScale", HistType::kTH2D, {partJetPtAxis, ptRatioAxis}); - } // doprocessMcMatched || doprocessMcMatchedV0Frag - - if (doprocessMcMatched) { - registry.add("matching/collision/matchCollisionVtxZ", "Collision vertex z (cm)", HistType::kTH1D, {binVtxZ}); - registry.add("matching/tracks/matchDetTrackPtEtaPhi", "matchDetTrackPtEtaPhi", HistType::kTH3D, {trackPtAxis, etaAxis, phiAxis}); - registry.add("matching/tracks/matchPartTrackPtEtaPhi", "matchPartTrackPtEtaPhi", HistType::kTH3D, {trackPtAxis, etaAxis, phiAxis}); - registry.add("matching/tracks/matchDetTrackPtPartTrackPt", "matchDetTrackPtPartTrackPt", HistType::kTH2D, {trackPtAxis, trackPtAxis}); - registry.add("matching/tracks/matchDetTrackEtaPartTrackEta", "matchDetTrackEtaPartTrackEta", HistType::kTH2D, {etaAxis, etaAxis}); - registry.add("matching/tracks/matchDetTrackPhiPartTrackPhi", "matchDetTrackPhiPartTrackPhi", HistType::kTH2D, {phiAxis, phiAxis}); - registry.add("matching/tracks/trackResolutionPt", "trackResolutionPt", HistType::kTH2D, {trackPtAxis, ptDiffAxis}); - registry.add("matching/tracks/trackResolutionEta", "trackResolutionEta", HistType::kTH2D, {etaAxis, etaDiffAxis}); - registry.add("matching/tracks/trackResolutionPhi", "trackResolutionPhi", HistType::kTH2D, {phiAxis, phiDiffAxis}); - // Detector level jets with a match - registry.add("matching/jets/matchDetJetPtTrackPt", "Matched detector level jet #it{p}_{T}, track #it{p}_{T}", HistType::kTH2D, {detJetPtAxis, trackPtAxis}); - registry.add("matching/jets/matchDetJetTrackPtEtaPhi", "Matched detector level tracks in jets #it{p}_{T}, #eta, #phi", HistType::kTH3D, {trackPtAxis, detEtaAxis, detPhiAxis}); - registry.add("matching/jets/matchDetJetPtFrag", "Matched detector level jet #it{p}_{T}, #it{p}_{T,jet}/#it{p}_{T,tr}", HistType::kTH2D, {detJetPtAxis, detZAxis}); - registry.add("matching/jets/matchDetJetPtTrackProj", "Matched detector level jet #it{p}_{T}, #it{z}", HistType::kTH2D, {detJetPtAxis, detZAxis}); - registry.add("matching/jets/matchDetJetPtXi", "Matched detector level jet #it{p}_{T}, #xi", HistType::kTH2D, {detJetPtAxis, detXiAxis}); - registry.add("matching/jets/matchDetJetPtTheta", "Matched detector level jet #it{p}_{T}, #theta", HistType::kTH2D, {detJetPtAxis, detThetaAxis}); - registry.add("matching/jets/matchDetJetPtXiTheta", "Matched detector level jet #it{p}_{T}, #xi, #theta", HistType::kTH3D, {detJetPtAxis, detXiAxis, detThetaAxis}); - registry.add("matching/jets/matchDetJetPtZTheta", "Matched detector level jet #it{p}_{T}, z, #theta", HistType::kTH3D, {detJetPtAxis, detZAxis, detThetaAxis}); - // Particle level jets with a match - registry.add("matching/jets/matchPartJetPtTrackPt", "Matched particle level jet #it{p}_{T}, track #it{p}_{T}", HistType::kTH2D, {partJetPtAxis, trackPtAxis}); - registry.add("matching/jets/matchPartJetTrackPtEtaPhi", "Matched particle level tracks in jets #it{p}_{T}, #eta, #phi", HistType::kTH3D, {trackPtAxis, partEtaAxis, partPhiAxis}); - registry.add("matching/jets/matchPartJetPtFrag", "Matched particle level jet #it{p}_{T}, #it{p}_{T,jet}/#it{p}_{T,tr}", HistType::kTH2D, {partJetPtAxis, partZAxis}); - registry.add("matching/jets/matchPartJetPtTrackProj", "Matched particle level jet #it{p}_{T}, #it{z}", HistType::kTH2D, {partJetPtAxis, partZAxis}); - registry.add("matching/jets/matchPartJetPtXi", "Matched particle level jet #it{p}_{T}, #xi", HistType::kTH2D, {partJetPtAxis, partXiAxis}); - registry.add("matching/jets/matchPartJetPtTheta", "Matched particle level jet #it{p}_{T}, #theta", HistType::kTH2D, {partJetPtAxis, partThetaAxis}); - registry.add("matching/jets/matchPartJetPtXiTheta", "Matched particle level jet #it{p}_{T}, #xi, #theta", HistType::kTH3D, {partJetPtAxis, partXiAxis, partThetaAxis}); - registry.add("matching/jets/matchPartJetPtZTheta", "Matched particle level jet #it{p}_{T}, z, #theta", HistType::kTH3D, {partJetPtAxis, partZAxis, partThetaAxis}); - // Combined information of matched jets - registry.add("matching/jets/matchPartJetPtResolutionChargeFrag", "Resolution #it{p}_{T}^{tr} / #it{p}_{T}^{jet}", HistType::kTH3D, {partJetPtAxis, partZAxis, zDiffAxis}); - registry.add("matching/jets/matchPartJetPtResolutionTrackPt", "Resolution #it{p}_{T}^{track}", HistType::kTH3D, {partJetPtAxis, trackPtAxis, ptTrackDiffAxis}); - registry.add("matching/jets/matching/jets/matchPartJetPtRelDiffTrackPt", "Rel. diff #it{p}_{T}^{track}", HistType::kTHnSparseD, {partJetPtAxis, ptRatioAxis, trackPtAxis, ptTrackRelDiffAxis}); - registry.add("matching/jets/matchPartJetPtResolutionTrackProj", "Resolution #it{p}^{proj} / #it{p}^{jet}", HistType::kTH3D, {partJetPtAxis, partZAxis, zDiffAxis}); - registry.add("matching/jets/matchPartJetPtRelDiffTrackProj", "Rel. diff #it{p}^{proj} / #it{p}^{jet}", HistType::kTHnSparseD, {partJetPtAxis, ptRatioAxis, partZAxis, zRelDiffAxis}); - registry.add("matching/jets/matchPartJetPtResolutionXi", "Resolution ln(1/#it{z})", HistType::kTH3D, {partJetPtAxis, partXiAxis, xiDiffAxis}); - registry.add("matching/jets/matchPartJetPtResolutionTheta", "Resolution #theta", HistType::kTH3D, {partJetPtAxis, partThetaAxis, thetaDiffAxis}); - registry.add("matching/jets/matchPartJetPtResolutionXiResolutionTheta", "Resolution #xi, #theta", HistType::kTHnSparseD, {partJetPtAxis, partXiAxis, xiDiffAxis, partThetaAxis, thetaDiffAxis}); - registry.add("matching/jets/matchPartJetPtResolutionZResolutionTheta", "Resolution #it{z}, #theta", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, zDiffAxis, partThetaAxis, thetaDiffAxis}); - // QA histograms for fakes, misses - registry.add("matching/jets/fakeDetJetPtEtaPhi", "Fakes", HistType::kTH3D, {detJetPtAxis, detEtaAxis, detPhiAxis}); - registry.add("matching/jets/missPartJetPtEtaPhi", "Misses", HistType::kTH3D, {partJetPtAxis, partEtaAxis, partPhiAxis}); - // Response matrix, fakes, misses - registry.add("matching/jets/matchDetJetPtTrackProjPartJetPtTrackProj", "Matched", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, partJetPtAxis, partZAxis}); - registry.add("matching/jets/fakeDetJetPtTrackProj", "Fakes", HistType::kTH2D, {detJetPtAxis, detZAxis}); - registry.add("matching/jets/missPartJetPtTrackProj", "Misses", HistType::kTH2D, {partJetPtAxis, partZAxis}); - - registry.add("matching/jets/matchDetJetPtXiPartJetPtXi", "Matched", HistType::kTHnSparseD, {detJetPtAxis, detXiAxis, partJetPtAxis, partXiAxis}); - registry.add("matching/jets/fakeDetJetPtXi", "Fakes", HistType::kTH2D, {detJetPtAxis, detXiAxis}); - registry.add("matching/jets/missPartJetPtXi", "Misses", HistType::kTH2D, {partJetPtAxis, partXiAxis}); - - registry.add("matching/jets/matchDetJetPtFragPartJetPtFrag", "Matched", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, partJetPtAxis, partZAxis}); - registry.add("matching/jets/fakeDetJetPtFrag", "Fakes", HistType::kTH2D, {detJetPtAxis, detZAxis}); - registry.add("matching/jets/missPartJetPtFrag", "Misses", HistType::kTH2D, {partJetPtAxis, partZAxis}); - - registry.add("matching/jets/matchDetJetPtThetaPartJetPtTheta", "Matched", HistType::kTHnSparseD, {detJetPtAxis, detThetaAxis, partJetPtAxis, partThetaAxis}); - registry.add("matching/jets/fakeDetJetPtTheta", "Fakes", HistType::kTH2D, {detJetPtAxis, detThetaAxis}); - registry.add("matching/jets/missPartJetPtTheta", "Misses", HistType::kTH2D, {partJetPtAxis, partThetaAxis}); - - registry.add("matching/jets/matchDetJetPtXiThetaPartJetPtXiTheta", "Matched", HistType::kTHnSparseD, {detJetPtAxis, detXiAxis, detThetaAxis, partJetPtAxis, partXiAxis, partThetaAxis}); - registry.add("matching/jets/fakeDetJetPtXiTheta", "Fakes", HistType::kTH3D, {detJetPtAxis, detXiAxis, detThetaAxis}); - registry.add("matching/jets/missPartJetPtXiTheta", "Misses", HistType::kTH3D, {partJetPtAxis, partXiAxis, partThetaAxis}); - - registry.add("matching/jets/matchDetJetPtZThetaPartJetPtZTheta", "Matched", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, detThetaAxis, partJetPtAxis, partZAxis, partThetaAxis}); - registry.add("matching/jets/fakeDetJetPtZTheta", "Fakes", HistType::kTH3D, {detJetPtAxis, detZAxis, detThetaAxis}); - registry.add("matching/jets/missPartJetPtZTheta", "Misses", HistType::kTH3D, {partJetPtAxis, partZAxis, partThetaAxis}); - } // doprocessMcMatched - - if (doprocessMcMatchedV0 || doprocessMcMatchedV0Frag || doprocessMcMatchedV0JetsFrag || doprocessMcV0MatchedPerpCone) { + registry.add("data/jets/V0/jetPtAntiLambdaTrackProjCtauMass", "jetPtAntiLambdaTrackProjCtauMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0CtauAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtAntiLambdaTrackProjRadiusMass", "jetPtAntiLambdaTrackProjRadiusMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0RadiusAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtAntiLambdaTrackProjCosPAMass", "jetPtAntiLambdaTrackProjCosPAMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0CosPAAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtAntiLambdaTrackProjDCAposMass", "jetPtAntiLambdaTrackProjDCAposMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtAntiLambdaTrackProjDCAnegMass", "jetPtAntiLambdaTrackProjDCAnegMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCAnAxis, lambdaMassAxis}); + registry.add("data/jets/V0/jetPtAntiLambdaTrackProjDCAdMass", "jetPtAntiLambdaTrackProjDCAdMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCAdAxis, lambdaMassAxis}); + + // Weighted histograms + registry.add("data/jets/weighted/jetPtEtaPhi", "Jet #it{p}_{T}, #eta, #phi", HistType::kTH3D, {jetPtAxis, etaAxis, phiAxis}, true); + registry.add("data/jets/weighted/V0/jetPtnV0nK0SnLambdanAntiLambda", "jetPtnV0nK0SnLambdanAntiLambda", HistType::kTHnSparseD, {jetPtAxis, v0Weight, v0Weight, v0Weight, v0Weight}, true); + + // Inclusive Weighted + registry.add("data/jets/weighted/V0/jetPtV0TrackProjCtau", "jetPtV0TrackProjCtau", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}, true); + registry.add("data/jets/weighted/V0/jetPtV0TrackProjMass", "jetPtV0TrackProjMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtV0TrackProjMassWide", "jetPtV0TrackProjMassWide", HistType::kTHnSparseD, {jetPtAxis, zAxis, k0SWideAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtV0TrackProjLambdaMasses", "jetPtV0TrackProjLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}, true); + registry.add("data/jets/weighted/V0/jetPtV0TrackProjRadiusCosPA", "jetPtV0TrackProjRadiusCosPA", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("data/jets/weighted/V0/jetPtV0TrackProjDCAposneg", "jetPtV0TrackProjDCAposneg", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("data/jets/weighted/V0/jetPtV0TrackProjDCAd", "jetPtV0TrackProjDCAd", HistType::kTH3D, {jetPtAxis, zAxis, v0DCAdAxis}, true); + + // K0S Weighted + registry.add("data/jets/weighted/V0/jetPtK0STrackProjMass", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, mass", HistType::kTH3D, {jetPtAxis, zAxis, k0SMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtK0STrackProjCtau", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, c#tau", HistType::kTH3D, {jetPtAxis, zAxis, v0CtauAxis}, true); + registry.add("data/jets/weighted/V0/jetPtK0STrackProjAllMasses", "jetPtK0STrackProjAllMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtK0STrackProjRadius", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, radius", HistType::kTH3D, {jetPtAxis, zAxis, v0RadiusAxis}, true); + registry.add("data/jets/weighted/V0/jetPtK0STrackProjCosPA", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, cosPA", HistType::kTH3D, {jetPtAxis, zAxis, v0CosPAAxis}, true); + registry.add("data/jets/weighted/V0/jetPtK0STrackProjDCAd", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, DCA daughters", HistType::kTH3D, {jetPtAxis, zAxis, v0DCAdAxis}, true); + registry.add("data/jets/weighted/V0/jetPtK0STrackProjDCAposneg", "Jet #it{p}_{T}, #it{z}_{K^{0}_{S}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("data/jets/weighted/V0/jetPtK0STrackProjCtauMass", "jetPtK0STrackProjCtauMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0CtauAxis, k0SMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtK0STrackProjRadiusMass", "jetPtK0STrackProjRadiusMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0RadiusAxis, k0SMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtK0STrackProjCosPAMass", "jetPtK0STrackProjCosPAMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0CosPAAxis, k0SMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtK0STrackProjDCAposMass", "jetPtK0STrackProjDCAposMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, k0SMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtK0STrackProjDCAnegMass", "jetPtK0STrackProjDCAnegMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCAnAxis, k0SMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtK0STrackProjDCAdMass", "jetPtK0STrackProjDCAdMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCAdAxis, k0SMassAxis}, true); + + // Lambda Weighted + registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjMass", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, mass", HistType::kTH3D, {jetPtAxis, zAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjCtau", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, c#tau", HistType::kTH3D, {jetPtAxis, zAxis, v0CtauAxis}, true); + registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjAllMasses", "jetPtLambdaTrackProjAllMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjLambdaMasses", "jetPtLambdaTrackProjLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}, true); + registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjRadius", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, radius", HistType::kTH3D, {jetPtAxis, zAxis, v0RadiusAxis}, true); + registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjCosPA", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, cosPA", HistType::kTH3D, {jetPtAxis, zAxis, v0CosPAAxis}, true); + registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjDCAd", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, DCA daughters", HistType::kTH3D, {jetPtAxis, zAxis, v0DCAdAxis}, true); + registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjDCAposneg", "Jet #it{p}_{T}, #it{z}_{#Lambda^{0}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjCtauMass", "jetPtLambdaTrackProjCtauMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0CtauAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjRadiusMass", "jetPtLambdaTrackProjRadiusMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0RadiusAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjCosPAMass", "jetPtLambdaTrackProjCosPAMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0CosPAAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjDCAposMass", "jetPtLambdaTrackProjDCAposMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjDCAnegMass", "jetPtLambdaTrackProjDCAnegMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCAnAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtLambdaTrackProjDCAdMass", "jetPtLambdaTrackProjDCAdMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCAdAxis, lambdaMassAxis}, true); + + // AntiLambda Weighted + registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjMass", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, mass", HistType::kTH3D, {jetPtAxis, zAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjCtau", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, c#tau", HistType::kTH3D, {jetPtAxis, zAxis, v0CtauAxis}, true); + registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjAllMasses", "jetPtAntiLambdaTrackProjAllMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjLambdaMasses", "jetPtAntiLambdaTrackProjLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}, true); + registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjRadius", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, radius", HistType::kTH3D, {jetPtAxis, zAxis, v0RadiusAxis}, true); + registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjCosPA", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, cosPA", HistType::kTH3D, {jetPtAxis, zAxis, v0CosPAAxis}, true); + registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjDCAd", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, DCA daughters", HistType::kTH3D, {jetPtAxis, zAxis, v0DCAdAxis}, true); + registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjDCAposneg", "Jet #it{p}_{T}, #it{z}_{#bar{#Lambda}^{0}}, DCA#pm", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjCtauMass", "jetPtAntiLambdaTrackProjCtauMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0CtauAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjRadiusMass", "jetPtAntiLambdaTrackProjRadiusMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0RadiusAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjCosPAMass", "jetPtAntiLambdaTrackProjCosPAMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0CosPAAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjDCAposMass", "jetPtAntiLambdaTrackProjDCAposMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjDCAnegMass", "jetPtAntiLambdaTrackProjDCAnegMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCAnAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtAntiLambdaTrackProjDCAdMass", "jetPtAntiLambdaTrackProjDCAdMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCAdAxis, lambdaMassAxis}, true); + + // Background Weighted + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjMass", "jetPtBkgTrackProjMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjCtau", "jetPtBkgTrackProjCtau", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}, true); + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjLambdaMasses", "jetPtBkgTrackProjLambdaMasses", HistType::kTHnSparseD, {jetPtAxis, zAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}, true); + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjRadiusCosPA", "jetPtBkgTrackProjRadiusCosPA", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjDCAposneg", "jetPtBkgTrackProjDCAposneg", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjDCAd", "jetPtBkgTrackProjDCAd", HistType::kTH3D, {jetPtAxis, zAxis, v0DCAdAxis}, true); + + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjCtauK0SMass", "jetPtBkgTrackProjCtauK0SMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0CtauAxis, k0SMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjRadiusK0SMass", "jetPtBkgTrackProjRadiusK0SMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0RadiusAxis, k0SMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjCosPAK0SMass", "jetPtBkgTrackProjCosPAK0SMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0CosPAAxis, k0SMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjDCAposK0SMass", "jetPtBkgTrackProjDCAposK0SMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, k0SMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjDCAnegK0SMass", "jetPtBkgTrackProjDCAnegK0SMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCAnAxis, k0SMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjDCAdK0SMass", "jetPtBkgTrackProjDCAdK0SMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCAdAxis, k0SMassAxis}, true); + + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjCtauLambdaMass", "jetPtBkgTrackProjCtauLambdaMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0CtauAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjRadiusLambdaMass", "jetPtBkgTrackProjRadiusLambdaMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0RadiusAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjCosPALambdaMass", "jetPtBkgTrackProjCosPALambdaMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0CosPAAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjDCAposLambdaMass", "jetPtBkgTrackProjDCAposLambdaMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjDCAnegLambdaMass", "jetPtBkgTrackProjDCAnegLambdaMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCAnAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjDCAdLambdaMass", "jetPtBkgTrackProjDCAdLambdaMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCAdAxis, lambdaMassAxis}, true); + + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjCtauAntiLambdaMass", "jetPtBkgTrackProjCtauAntiLambdaMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0CtauAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjRadiusAntiLambdaMass", "jetPtBkgTrackProjRadiusAntiLambdaMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0RadiusAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjCosPAAntiLambdaMass", "jetPtBkgTrackProjCosPAAntiLambdaMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0CosPAAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjDCAposAntiLambdaMass", "jetPtBkgTrackProjDCAposAntiLambdaMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCApAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjDCAnegAntiLambdaMass", "jetPtBkgTrackProjDCAnegAntiLambdaMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCAnAxis, lambdaMassAxis}, true); + registry.add("data/jets/weighted/V0/jetPtBkgTrackProjDCAdAntiLambdaMass", "jetPtBkgTrackProjDCAdAntiLambdaMass", HistType::kTHnSparseD, {jetPtAxis, zAxis, v0DCAdAxis, lambdaMassAxis}, true); + } + + if (doprocessMcMatchedV0) { + // MCP + registry.add("mcp/V0/nV0sEventAcc", "nV0s per event (accepted)", HistType::kTH1D, {v0Count}, true); + registry.add("mcp/V0/nV0sEventAccWeighted", "nV0s per event (accepted, weighted)", HistType::kTH1D, {v0Weight}, true); + registry.add("mcp/V0/V0PtEtaPhi", "V0PtEtaPhi", HistType::kTH3D, {v0partPtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("mcp/V0/K0SPtEtaPhi", "K0SPtEtaPhi", HistType::kTH3D, {v0partPtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("mcp/V0/LambdaPtEtaPhi", "LambdaPtEtaPhi", HistType::kTH3D, {v0partPtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("mcp/V0/AntiLambdaPtEtaPhi", "AntiLambdaPtEtaPhi", HistType::kTH3D, {v0partPtAxis, v0EtaAxis, v0PhiAxis}, true); + + // MCD Inclusive + registry.add("mcd/V0/nV0sEventAcc", "nV0s per event (accepted)", HistType::kTH1D, {v0Count}); + registry.add("mcd/V0/nV0sEventAccWeighted", "nV0s per event (accepted, weighted)", HistType::kTH1D, {v0Weight}, true); + registry.add("mcd/V0/V0PtEtaPhi", "V0PtEtaPhi", HistType::kTH3D, {v0detPtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("mcd/V0/V0PtCtau", "V0PtCtau", HistType::kTHnSparseD, {v0detPtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}, true); + registry.add("mcd/V0/V0PtMass", "V0PtMass", HistType::kTHnSparseD, {v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("mcd/V0/V0PtLambdaMasses", "V0PtLambdaMasses", HistType::kTHnSparseD, {v0detPtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}, true); + registry.add("mcd/V0/V0PtRadiusCosPA", "V0PtRadiusCosPA", HistType::kTH3D, {v0detPtAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("mcd/V0/V0PtDCAposneg", "V0PtDCAposneg", HistType::kTH3D, {v0detPtAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("mcd/V0/V0PtDCAd", "V0PtDCAd", HistType::kTH2D, {v0detPtAxis, v0DCAdAxis}, true); + + // MCD K0S + registry.add("mcd/V0/K0SPtEtaPhi", "K0SPtEtaPhi", HistType::kTH3D, {v0detPtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("mcd/V0/K0SPtRadiusCosPA", "K0SPtRadiusCosPA", HistType::kTH3D, {v0detPtAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("mcd/V0/K0SPtDCAposneg", "K0SPtDCAposneg", HistType::kTH3D, {v0detPtAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("mcd/V0/K0SPtDCAd", "K0SPtDCAd", HistType::kTH2D, {v0detPtAxis, v0DCAdAxis}, true); + registry.add("mcd/V0/K0SPtCtauMass", "K0SPtCtauMass", HistType::kTH3D, {v0detPtAxis, v0CtauAxis, k0SMassAxis}, true); + registry.add("mcd/V0/K0SPtRadiusMass", "K0SPtRadiusMass", HistType::kTH3D, {v0detPtAxis, v0RadiusAxis, k0SMassAxis}, true); + registry.add("mcd/V0/K0SPtCosPAMass", "K0SPtCosPAMass", HistType::kTH3D, {v0detPtAxis, v0CosPAAxis, k0SMassAxis}, true); + registry.add("mcd/V0/K0SPtDCAposMass", "K0SPtDCAposMass", HistType::kTH3D, {v0detPtAxis, v0DCApAxis, k0SMassAxis}, true); + registry.add("mcd/V0/K0SPtDCAnegMass", "K0SPtDCAnegMass", HistType::kTH3D, {v0detPtAxis, v0DCAnAxis, k0SMassAxis}, true); + registry.add("mcd/V0/K0SPtDCAdMass", "K0SPtDCAdMass", HistType::kTH3D, {v0detPtAxis, v0DCAdAxis, k0SMassAxis}, true); + + // MCD Lambda + registry.add("mcd/V0/LambdaPtEtaPhi", "LambdaPtEtaPhi", HistType::kTH3D, {v0detPtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("mcd/V0/LambdaPtLambdaMasses", "LambdaPtLambdaMasses", HistType::kTHnSparseD, {v0detPtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}, true); + registry.add("mcd/V0/LambdaPtRadiusCosPA", "LambdaPtRadiusCosPA", HistType::kTH3D, {v0detPtAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("mcd/V0/LambdaPtDCAposneg", "LambdaPtDCAposneg", HistType::kTH3D, {v0detPtAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("mcd/V0/LambdaPtDCAd", "LambdaPtDCAd", HistType::kTH2D, {v0detPtAxis, v0DCAdAxis}, true); + registry.add("mcd/V0/LambdaPtCtauMass", "LambdaPtCtauMass", HistType::kTH3D, {v0detPtAxis, v0CtauAxis, lambdaMassAxis}, true); + registry.add("mcd/V0/LambdaPtRadiusMass", "LambdaPtRadiusMass", HistType::kTH3D, {v0detPtAxis, v0RadiusAxis, lambdaMassAxis}, true); + registry.add("mcd/V0/LambdaPtCosPAMass", "LambdaPtCosPAMass", HistType::kTH3D, {v0detPtAxis, v0CosPAAxis, lambdaMassAxis}, true); + registry.add("mcd/V0/LambdaPtDCAposMass", "LambdaPtDCAposMass", HistType::kTH3D, {v0detPtAxis, v0DCApAxis, lambdaMassAxis}, true); + registry.add("mcd/V0/LambdaPtDCAnegMass", "LambdaPtDCAnegMass", HistType::kTH3D, {v0detPtAxis, v0DCAnAxis, lambdaMassAxis}, true); + registry.add("mcd/V0/LambdaPtDCAdMass", "LambdaPtDCAdMass", HistType::kTH3D, {v0detPtAxis, v0DCAdAxis, lambdaMassAxis}, true); + + // MCD AntiLambda + registry.add("mcd/V0/AntiLambdaPtEtaPhi", "AntiLambdaPtEtaPhi", HistType::kTH3D, {v0detPtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("mcd/V0/AntiLambdaPtLambdaMasses", "AntiLambdaPtLambdaMasses", HistType::kTHnSparseD, {v0detPtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}, true); + registry.add("mcd/V0/AntiLambdaPtRadiusCosPA", "AntiLambdaPtRadiusCosPA", HistType::kTH3D, {v0detPtAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("mcd/V0/AntiLambdaPtDCAposneg", "AntiLambdaPtDCAposneg", HistType::kTH3D, {v0detPtAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("mcd/V0/AntiLambdaPtDCAd", "AntiLambdaPtDCAd", HistType::kTH2D, {v0detPtAxis, v0DCAdAxis}, true); + registry.add("mcd/V0/AntiLambdaPtCtauMass", "AntiLambdaPtCtauMass", HistType::kTH3D, {v0detPtAxis, v0CtauAxis, lambdaMassAxis}, true); + registry.add("mcd/V0/AntiLambdaPtRadiusMass", "AntiLambdaPtRadiusMass", HistType::kTH3D, {v0detPtAxis, v0RadiusAxis, lambdaMassAxis}, true); + registry.add("mcd/V0/AntiLambdaPtCosPAMass", "AntiLambdaPtCosPAMass", HistType::kTH3D, {v0detPtAxis, v0CosPAAxis, lambdaMassAxis}, true); + registry.add("mcd/V0/AntiLambdaPtDCAposMass", "AntiLambdaPtDCAposMass", HistType::kTH3D, {v0detPtAxis, v0DCApAxis, lambdaMassAxis}, true); + registry.add("mcd/V0/AntiLambdaPtDCAnegMass", "AntiLambdaPtDCAnegMass", HistType::kTH3D, {v0detPtAxis, v0DCAnAxis, lambdaMassAxis}, true); + registry.add("mcd/V0/AntiLambdaPtDCAdMass", "AntiLambdaPtDCAdMass", HistType::kTH3D, {v0detPtAxis, v0DCAdAxis, lambdaMassAxis}, true); + + // Matching - Misses + registry.add("matching/V0/missV0PtEtaPhi", "missV0PtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("matching/V0/missK0SPtEtaPhi", "missK0SPtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("matching/V0/missLambdaPtEtaPhi", "missLambdaPtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("matching/V0/missAntiLambdaPtEtaPhi", "missAntiLambdaPtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}, true); + + // Matching - Fakes Inclusive + registry.add("matching/V0/fakeV0PtEtaPhi", "fakeV0PtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("matching/V0/fakeV0PtCtau", "fakeV0PtCtau", HistType::kTHnSparseD, {v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}, true); + registry.add("matching/V0/fakeV0PtMass", "fakeV0PtMass", HistType::kTHnSparseD, {v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/V0/fakeV0PtLambdaMasses", "fakeV0PtLambdaMasses", HistType::kTHnSparseD, {v0PtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}, true); + registry.add("matching/V0/fakeV0PtRadiusCosPA", "fakeV0PtRadiusCosPA", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("matching/V0/fakeV0PtDCAposneg", "fakeV0PtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("matching/V0/fakeV0PtDCAd", "fakeV0PtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}, true); + registry.add("matching/V0/fakeV0PosTrackPtEtaPhi", "fakeV0PosTrackPtEtaPhi", HistType::kTH3D, {trackPtAxis, etaAxis, phiAxis}, true); + registry.add("matching/V0/fakeV0NegTrackPtEtaPhi", "fakeV0NegTrackPtEtaPhi", HistType::kTH3D, {trackPtAxis, etaAxis, phiAxis}, true); + + // Matching - Fakes K0S + registry.add("matching/V0/fakeK0SPtEtaPhi", "K0SPtEtaPhi", HistType::kTH3D, {v0detPtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("matching/V0/fakeK0SPtRadiusCosPA", "K0SPtRadiusCosPA", HistType::kTH3D, {v0detPtAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("matching/V0/fakeK0SPtDCAposneg", "K0SPtDCAposneg", HistType::kTH3D, {v0detPtAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("matching/V0/fakeK0SPtDCAd", "K0SPtDCAd", HistType::kTH2D, {v0detPtAxis, v0DCAdAxis}, true); + registry.add("matching/V0/fakeK0SPtCtauMass", "K0SPtCtauMass", HistType::kTH3D, {v0detPtAxis, v0CtauAxis, k0SMassAxis}, true); + registry.add("matching/V0/fakeK0SPtRadiusMass", "K0SPtRadiusMass", HistType::kTH3D, {v0detPtAxis, v0RadiusAxis, k0SMassAxis}, true); + registry.add("matching/V0/fakeK0SPtCosPAMass", "K0SPtCosPAMass", HistType::kTH3D, {v0detPtAxis, v0CosPAAxis, k0SMassAxis}, true); + registry.add("matching/V0/fakeK0SPtDCAposMass", "K0SPtDCAposMass", HistType::kTH3D, {v0detPtAxis, v0DCApAxis, k0SMassAxis}, true); + registry.add("matching/V0/fakeK0SPtDCAnegMass", "K0SPtDCAnegMass", HistType::kTH3D, {v0detPtAxis, v0DCAnAxis, k0SMassAxis}, true); + registry.add("matching/V0/fakeK0SPtDCAdMass", "K0SPtDCAdMass", HistType::kTH3D, {v0detPtAxis, v0DCAdAxis, k0SMassAxis}, true); + registry.add("matching/V0/fakeK0SPosTrackPtEtaPhi", "fakeK0SPosTrackPtEtaPhi", HistType::kTH3D, {trackPtAxis, etaAxis, phiAxis}, true); + registry.add("matching/V0/fakeK0SPosTrackPtMass", "fakeK0SPosTrackPtMass", HistType::kTH3D, {v0detPtAxis, trackPtAxis, k0SMassAxis}, true); + registry.add("matching/V0/fakeK0SNegTrackPtEtaPhi", "fakeK0SNegTrackPtEtaPhi", HistType::kTH3D, {trackPtAxis, etaAxis, phiAxis}, true); + registry.add("matching/V0/fakeK0SNegTrackPtMass", "fakeK0SNegTrackPtMass", HistType::kTH3D, {v0detPtAxis, trackPtAxis, k0SMassAxis}, true); + + // Matching - Fakes Lambda + registry.add("matching/V0/fakeLambdaPtEtaPhi", "LambdaPtEtaPhi", HistType::kTH3D, {v0detPtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("matching/V0/fakeLambdaPtLambdaMasses", "LambdaPtLambdaMasses", HistType::kTHnSparseD, {v0detPtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}, true); + registry.add("matching/V0/fakeLambdaPtRadiusCosPA", "LambdaPtRadiusCosPA", HistType::kTH3D, {v0detPtAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("matching/V0/fakeLambdaPtDCAposneg", "LambdaPtDCAposneg", HistType::kTH3D, {v0detPtAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("matching/V0/fakeLambdaPtDCAd", "LambdaPtDCAd", HistType::kTH2D, {v0detPtAxis, v0DCAdAxis}, true); + registry.add("matching/V0/fakeLambdaPtCtauMass", "LambdaPtCtauMass", HistType::kTH3D, {v0detPtAxis, v0CtauAxis, lambdaMassAxis}, true); + registry.add("matching/V0/fakeLambdaPtRadiusMass", "LambdaPtRadiusMass", HistType::kTH3D, {v0detPtAxis, v0RadiusAxis, lambdaMassAxis}, true); + registry.add("matching/V0/fakeLambdaPtCosPAMass", "LambdaPtCosPAMass", HistType::kTH3D, {v0detPtAxis, v0CosPAAxis, lambdaMassAxis}, true); + registry.add("matching/V0/fakeLambdaPtDCAposMass", "LambdaPtDCAposMass", HistType::kTH3D, {v0detPtAxis, v0DCApAxis, lambdaMassAxis}, true); + registry.add("matching/V0/fakeLambdaPtDCAnegMass", "LambdaPtDCAnegMass", HistType::kTH3D, {v0detPtAxis, v0DCAnAxis, lambdaMassAxis}, true); + registry.add("matching/V0/fakeLambdaPtDCAdMass", "LambdaPtDCAdMass", HistType::kTH3D, {v0detPtAxis, v0DCAdAxis, lambdaMassAxis}, true); + registry.add("matching/V0/fakeLambdaPosTrackPtEtaPhi", "fakeLambdaPosTrackPtEtaPhi", HistType::kTH3D, {trackPtAxis, etaAxis, phiAxis}, true); + registry.add("matching/V0/fakeLambdaPosTrackPtMass", "fakeLambdaPosTrackPtMass", HistType::kTH3D, {v0detPtAxis, trackPtAxis, lambdaMassAxis}, true); + registry.add("matching/V0/fakeLambdaNegTrackPtEtaPhi", "fakeLambdaNegTrackPtEtaPhi", HistType::kTH3D, {trackPtAxis, etaAxis, phiAxis}, true); + registry.add("matching/V0/fakeLambdaNegTrackPtMass", "fakeLambdaNegTrackPtMass", HistType::kTH3D, {v0detPtAxis, trackPtAxis, lambdaMassAxis}, true); + + // Matching - Fakes AntiLambda + registry.add("matching/V0/fakeAntiLambdaPtEtaPhi", "AntiLambdaPtEtaPhi", HistType::kTH3D, {v0detPtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("matching/V0/fakeAntiLambdaPtLambdaMasses", "AntiLambdaPtLambdaMasses", HistType::kTHnSparseD, {v0detPtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}, true); + registry.add("matching/V0/fakeAntiLambdaPtRadiusCosPA", "AntiLambdaPtRadiusCosPA", HistType::kTH3D, {v0detPtAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("matching/V0/fakeAntiLambdaPtDCAposneg", "AntiLambdaPtDCAposneg", HistType::kTH3D, {v0detPtAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("matching/V0/fakeAntiLambdaPtDCAd", "AntiLambdaPtDCAd", HistType::kTH2D, {v0detPtAxis, v0DCAdAxis}, true); + registry.add("matching/V0/fakeAntiLambdaPtCtauMass", "AntiLambdaPtCtauMass", HistType::kTH3D, {v0detPtAxis, v0CtauAxis, lambdaMassAxis}, true); + registry.add("matching/V0/fakeAntiLambdaPtRadiusMass", "AntiLambdaPtRadiusMass", HistType::kTH3D, {v0detPtAxis, v0RadiusAxis, lambdaMassAxis}, true); + registry.add("matching/V0/fakeAntiLambdaPtCosPAMass", "AntiLambdaPtCosPAMass", HistType::kTH3D, {v0detPtAxis, v0CosPAAxis, lambdaMassAxis}, true); + registry.add("matching/V0/fakeAntiLambdaPtDCAposMass", "AntiLambdaPtDCAposMass", HistType::kTH3D, {v0detPtAxis, v0DCApAxis, lambdaMassAxis}, true); + registry.add("matching/V0/fakeAntiLambdaPtDCAnegMass", "AntiLambdaPtDCAnegMass", HistType::kTH3D, {v0detPtAxis, v0DCAnAxis, lambdaMassAxis}, true); + registry.add("matching/V0/fakeAntiLambdaPtDCAdMass", "AntiLambdaPtDCAdMass", HistType::kTH3D, {v0detPtAxis, v0DCAdAxis, lambdaMassAxis}, true); + registry.add("matching/V0/fakeAntiLambdaPosTrackPtEtaPhi", "fakeAntiLambdaPosTrackPtEtaPhi", HistType::kTH3D, {trackPtAxis, etaAxis, phiAxis}, true); + registry.add("matching/V0/fakeAntiLambdaPosTrackPtMass", "fakeAntiLambdaPosTrackPtMass", HistType::kTH3D, {v0detPtAxis, trackPtAxis, lambdaMassAxis}, true); + registry.add("matching/V0/fakeAntiLambdaNegTrackPtEtaPhi", "fakeAntiLambdaNegTrackPtEtaPhi", HistType::kTH3D, {trackPtAxis, etaAxis, phiAxis}, true); + registry.add("matching/V0/fakeAntiLambdaNegTrackPtMass", "fakeAntiLambdaNegTrackPtMass", HistType::kTH3D, {v0detPtAxis, trackPtAxis, lambdaMassAxis}, true); + + // Matching - Matched registry.add("matching/V0/nV0sEvent", "nV0sDet per event", HistType::kTH1D, {v0Count}); - registry.add("matching/V0/nV0sEventWeighted", "nV0sDet per event (weighted)", HistType::kTH1D, {v0Count}); - registry.get(HIST("matching/V0/nV0sEventWeighted"))->Sumw2(); - } // doprocessMcMatchedV0 || doprocessMcMatchedV0Frag - - if (doprocessMcMatchedV0 || doprocessMcMatchedV0JetsFrag) { - registry.add("matching/V0/V0PartPtDetPt", "V0PartPtDetPt", HistType::kTH2D, {v0partPtAxis, v0detPtAxis}); - registry.add("matching/V0/V0PartPtRatioPtRelDiffPt", "V0PartPtRatioRelDiffPt", HistType::kTH3D, {v0partPtAxis, v0PtRatioAxis, v0PtRelDiffAxis}); - - registry.add("matching/V0/K0SPtEtaPhi", "K0SPtEtaPhi", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, v0EtaAxis, v0PhiAxis}); - registry.add("matching/V0/K0SPtCtauMass", "K0SPtCtauMass", HistType::kTHnSparseD, {v0partPtAxis, v0partPtAxis, v0CtauAxis, k0SMassAxis}); - registry.add("matching/V0/K0SPtRadiusCosPA", "K0SPtRadiusCosPA", HistType::kTHnSparseD, {v0partPtAxis, v0partPtAxis, v0RadiusAxis, v0CosPAAxis}); - registry.add("matching/V0/K0SPtDCAposneg", "K0SPtDCAposneg", HistType::kTHnSparseD, {v0partPtAxis, v0partPtAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("matching/V0/K0SPtDCAd", "K0SPtDCAd", HistType::kTH3D, {v0partPtAxis, v0detPtAxis, v0DCAdAxis}); - registry.add("matching/V0/K0SPtMass", "K0SPtMass", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - - registry.add("matching/V0/LambdaPtEtaPhi", "LambdaPtEtaPhi", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, v0EtaAxis, v0PhiAxis}); - registry.add("matching/V0/LambdaPtCtauMass", "LambdaPtCtauMass", HistType::kTHnSparseD, {v0partPtAxis, v0partPtAxis, v0CtauAxis, lambdaMassAxis}); - registry.add("matching/V0/LambdaPtRadiusCosPA", "LambdaPtRadiusCosPA", HistType::kTHnSparseD, {v0partPtAxis, v0partPtAxis, v0RadiusAxis, v0CosPAAxis}); - registry.add("matching/V0/LambdaPtDCAposneg", "LambdaPtDCAposneg", HistType::kTHnSparseD, {v0partPtAxis, v0partPtAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("matching/V0/LambdaPtDCAd", "LambdaPtDCAd", HistType::kTH3D, {v0partPtAxis, v0detPtAxis, v0DCAdAxis}); - registry.add("matching/V0/LambdaPtMass", "LambdaPtMass", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - - registry.add("matching/V0/antiLambdaPtEtaPhi", "antiLambdaPtEtaPhi", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, v0EtaAxis, v0PhiAxis}); - registry.add("matching/V0/antiLambdaPtCtauMass", "antiLambdaPtCtauMass", HistType::kTHnSparseD, {v0partPtAxis, v0partPtAxis, v0CtauAxis, lambdaMassAxis}); - registry.add("matching/V0/antiLambdaPtRadiusCosPA", "antiLambdaPtRadiusCosPA", HistType::kTHnSparseD, {v0partPtAxis, v0partPtAxis, v0RadiusAxis, v0CosPAAxis}); - registry.add("matching/V0/antiLambdaPtDCAposneg", "antiLambdaPtDCAposneg", HistType::kTHnSparseD, {v0partPtAxis, v0partPtAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("matching/V0/antiLambdaPtDCAd", "antiLambdaPtDCAd", HistType::kTH3D, {v0partPtAxis, v0detPtAxis, v0DCAdAxis}); - registry.add("matching/V0/antiLambdaPtMass", "antiLambdaPtMass", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - - // Reflections - registry.add("matching/V0/Lambda0Reflection", "pt, pt, mK, mL, maL, Lambda0Reflection", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/V0/antiLambda0Reflection", "pt, pt, mK, mL, maL, antiLambda0Reflection", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis, lambdaMassAxis}); + registry.add("matching/V0/nV0sEventWeighted", "nV0sDet per event (weighted)", HistType::kTH1D, {v0Count}, true); + registry.add("matching/V0/nV0sEventAcc", "nV0sDet per event (accepted, matched)", HistType::kTH1D, {v0Count}, true); + registry.add("matching/V0/nV0sEventAccWeighted", "nV0sDet per event (accepted, matched, weighted)", HistType::kTH1D, {v0Weight}, true); + + // Matching - Matched Inclusive + registry.add("matching/V0/V0PartPtDetPt", "V0PartPtDetPt", HistType::kTH2D, {v0partPtAxis, v0detPtAxis}, true); + registry.add("matching/V0/V0PartPtRatioPtRelDiffPt", "V0PartPtRatioRelDiffPt", HistType::kTH3D, {v0partPtAxis, v0PtRatioAxis, v0PtRelDiffAxis}, true); + + // Matching - Matched K0S + registry.add("matching/V0/K0SPtEtaPhi", "K0SPtEtaPhi", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("matching/V0/K0SPtCtauMass", "K0SPtCtauMass", HistType::kTHnSparseD, {v0partPtAxis, v0partPtAxis, v0CtauAxis, k0SMassAxis}, true); + registry.add("matching/V0/K0SPtRadiusCosPA", "K0SPtRadiusCosPA", HistType::kTHnSparseD, {v0partPtAxis, v0partPtAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("matching/V0/K0SPtDCAposneg", "K0SPtDCAposneg", HistType::kTHnSparseD, {v0partPtAxis, v0partPtAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("matching/V0/K0SPtDCAd", "K0SPtDCAd", HistType::kTH3D, {v0partPtAxis, v0detPtAxis, v0DCAdAxis}, true); + registry.add("matching/V0/K0SPtMass", "K0SPtMass", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + + // Matching - Matched Lambda + registry.add("matching/V0/LambdaPtEtaPhi", "LambdaPtEtaPhi", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("matching/V0/LambdaPtCtauMass", "LambdaPtCtauMass", HistType::kTHnSparseD, {v0partPtAxis, v0partPtAxis, v0CtauAxis, lambdaMassAxis}, true); + registry.add("matching/V0/LambdaPtRadiusCosPA", "LambdaPtRadiusCosPA", HistType::kTHnSparseD, {v0partPtAxis, v0partPtAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("matching/V0/LambdaPtDCAposneg", "LambdaPtDCAposneg", HistType::kTHnSparseD, {v0partPtAxis, v0partPtAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("matching/V0/LambdaPtDCAd", "LambdaPtDCAd", HistType::kTH3D, {v0partPtAxis, v0detPtAxis, v0DCAdAxis}, true); + registry.add("matching/V0/LambdaPtMass", "LambdaPtMass", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/V0/LambdaReflection", "pt, pt, mK, mL, maL, LambdaReflection", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + + // Matching - Matched AntiLambda + registry.add("matching/V0/AntiLambdaPtEtaPhi", "AntiLambdaPtEtaPhi", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("matching/V0/AntiLambdaPtCtauMass", "AntiLambdaPtCtauMass", HistType::kTHnSparseD, {v0partPtAxis, v0partPtAxis, v0CtauAxis, lambdaMassAxis}, true); + registry.add("matching/V0/AntiLambdaPtRadiusCosPA", "AntiLambdaPtRadiusCosPA", HistType::kTHnSparseD, {v0partPtAxis, v0partPtAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("matching/V0/AntiLambdaPtDCAposneg", "AntiLambdaPtDCAposneg", HistType::kTHnSparseD, {v0partPtAxis, v0partPtAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("matching/V0/AntiLambdaPtDCAd", "AntiLambdaPtDCAd", HistType::kTH3D, {v0partPtAxis, v0detPtAxis, v0DCAdAxis}, true); + registry.add("matching/V0/AntiLambdaPtMass", "AntiLambdaPtMass", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/V0/AntiLambdaReflection", "pt, pt, mK, mL, maL, AntiLambdaReflection", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + + // Matching - Matched Daughters + registry.add("matching/V0/V0PosPartPtRatioPtRelDiffPt", "V0PosPartPtRatioRelDiffPt", HistType::kTH3D, {trackPtAxis, ptRatioAxis, ptTrackRelDiffAxis}, true); + registry.add("matching/V0/V0NegPartPtRatioPtRelDiffPt", "V0NegPartPtRatioRelDiffPt", HistType::kTH3D, {trackPtAxis, ptRatioAxis, ptTrackRelDiffAxis}, true); + registry.add("matching/V0/K0SPosNegPtMass", "K0SPosNegPtMass", HistType::kTHnSparseD, {v0partPtAxis, trackPtAxis, trackPtAxis, k0SMassAxis}, true); + registry.add("matching/V0/LambdaPosNegPtMass", "LambdaPosNegPtMass", HistType::kTHnSparseD, {v0partPtAxis, trackPtAxis, trackPtAxis, lambdaMassAxis}, true); + registry.add("matching/V0/AntiLambdaPosNegPtMass", "AntiLambdaPosNegPtMass", HistType::kTHnSparseD, {v0partPtAxis, trackPtAxis, trackPtAxis, lambdaMassAxis}, true); } // doprocessMcMatchedV0 - if (doprocessMcMatchedV0Frag) { - registry.add("matching/jets/V0/jetPtnV0Matched", "jet pt, nV0 matched", HistType::kTH2D, {detJetPtAxis, v0Count}); - } - if (doprocessMcMatchedV0Frag || doprocessMcMatchedV0JetsFrag) { - registry.add("matching/jets/V0/jetPtnV0MatchednK0SnLambdanAntiLambda", "jet Pt, nV0 matched, nK0S nLambdan AntiLambda", HistType::kTHnSparseD, {detJetPtAxis, v0Count, v0Count, v0Count, v0Count}); - registry.add("matching/jets/V0/partJetPtV0PtDetPt", "V0PartPtDetPt", HistType::kTH3D, {partJetPtAxis, v0partPtAxis, v0detPtAxis}); - registry.add("matching/jets/V0/partJetPtDetJetPtPartV0PtRatioPtRelDiffPt", "V0PartPtRatioRelDiffPt", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0partPtAxis, v0PtRatioAxis, v0PtRelDiffAxis}); - - // ----------------------------- - // Unidentified V0s - // ----------------------------- - registry.add("matching/jets/V0/matchDetJetPtV0TrackProjPartJetPtV0TrackProj", "Matched", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, partJetPtAxis, partZAxis}); - registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0Pt", "matched jet Pt, V0 Pt", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis}); - // Matched V0: pt - registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtCtauLambda0", "matched jet Pt, V0 Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}); - registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtCtauAntiLambda0", "matched jet Pt, V0 Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}); - registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtCtauK0S", "matched jet Pt, V0 Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}); - registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtMassLambda0", "matched jet Pt, V0 Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtMassAntiLambda0", "matched jet Pt, V0 Pt, Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtMassK0S", "matched jet Pt, V0 Pt, MassK0S", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis}); - registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtRadius", "matched jet Pt, V0 Pt, Radius", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0RadiusAxis}); - registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtCosPA", "matched jet Pt, V0 Pt, CosPA", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CosPAAxis}); - registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtDCAposneg", "matched jet Pt, V0 Pt, DCAposneg", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtDCAd", "matched jet Pt, V0 Pt, DCAd", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0DCAdAxis}); - // Matched Lambda0: z - registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjCtauLambda0", "matched jet Pt, V0 z, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}); - registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjCtauAntiLambda0", "matched jet Pt, V0 z, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}); - registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjCtauK0S", "matched jet Pt, V0 z, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}); - registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjMassLambda0", "matched jet Pt, V0 z, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjMassAntiLambda0", "matched jet Pt, V0 z, Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjMassK0S", "matched jet Pt, V0 z, MassK0S", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, k0SMassAxis}); - registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjRadius", "matched jet Pt, V0 z, Radius", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0RadiusAxis}); - registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjCosPA", "matched jet Pt, V0 z, CosPA", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CosPAAxis}); - registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjDCAposneg", "matched jet Pt, V0 z, DCAposneg", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjDCAd", "matched jet Pt, V0 z, DCAd", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0DCAdAxis}); - // Fakes - registry.add("matching/jets/V0/fakeJetPtV0TrackProj", "Fakes", HistType::kTH2D, {detJetPtAxis, detZAxis}); - registry.add("matching/jets/V0/fakeJetPtV0PtEtaPhi", "fake jet Pt, V0 PtEtaPhi", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0EtaAxis, v0PhiAxis}); - registry.add("matching/jets/V0/fakeJetPtV0PtCtau", "fake jet Pt, V0 PtCtau", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); - registry.add("matching/jets/V0/fakeJetPtV0PtMass", "fake jet Pt, V0 PtMass", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/fakeJetPtV0PtLambdaMasses", "fake jet Pt, V0 PtLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); - registry.add("matching/jets/V0/fakeJetPtV0PtRadiusCosPA", "fake jet Pt, V0 PtRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0RadiusAxis, v0CosPAAxis}); - registry.add("matching/jets/V0/fakeJetPtV0PtDCAposneg", "fake jet Pt, V0 PtDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("matching/jets/V0/fakeJetPtV0PtDCAd", "fake jet Pt, V0 PtDCAd", HistType::kTH3D, {detJetPtAxis, v0PtAxis, v0DCAdAxis}); - registry.add("matching/jets/V0/fakeJetPtV0TrackProjCtau", "fake jet Pt, V0 zCtau", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); - registry.add("matching/jets/V0/fakeJetPtV0TrackProjMass", "fake jet Pt, V0 zMass", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/fakeJetPtV0TrackProjLambdaMasses", "fake jet Pt, V0 zLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); - registry.add("matching/jets/V0/fakeJetPtV0TrackProjRadiusCosPA", "fake jet Pt, V0 zRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0RadiusAxis, v0CosPAAxis}); - registry.add("matching/jets/V0/fakeJetPtV0TrackProjDCAposneg", "fake jet Pt, V0 zDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("matching/jets/V0/fakeJetPtV0TrackProjDCAd", "fake jet Pt, V0 zDCAd", HistType::kTH3D, {detJetPtAxis, detZAxis, v0DCAdAxis}); - // Misses - registry.add("matching/jets/V0/missJetPtV0PtEtaPhi", "miss jet Pt, V0 PtEtaPhi", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, v0EtaAxis, v0PhiAxis}); - registry.add("matching/jets/V0/missJetPtV0TrackProj", "Misses", HistType::kTH2D, {partJetPtAxis, partZAxis}); - - // ----------------------------- - // Lambda0 - // ----------------------------- - registry.add("matching/jets/V0/matchDetJetPtLambda0TrackProjPartJetPtLambda0TrackProj", "Matched", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, partJetPtAxis, partZAxis}); - registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0Pt", "matched jet Pt, #Lambda^{0} Pt", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis}); - // Matched Lambda0: pt - registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtCtauLambda0", "matched jet Pt, #Lambda^{0} Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}); - registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtCtauAntiLambda0", "matched jet Pt, #Lambda^{0} Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}); - registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtCtauK0S", "matched jet Pt, #{K}^{0}_{S} Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}); - registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtMassLambda0", "matched jet Pt, #Lambda^{0} Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtMassAntiLambda0", "matched jet Pt, #Lambda^{0} Pt Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtMassK0S", "matched jet Pt, #Lambda^{0} PtMassK0S", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis}); - registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtAllMasses", "matched jet Pt, #Lambda^{0} Pt, Masses", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtRadius", "matched jet Pt, #Lambda^{0} Pt Radius", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0RadiusAxis}); - registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtCosPA", "matched jet Pt, #Lambda^{0} Pt CosPA", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CosPAAxis}); - registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtDCAposneg", "matched jet Pt, #Lambda^{0} PtDCAposneg", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtDCAd", "matched jet Pt, #Lambda^{0} PtDCAd", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0DCAdAxis}); - // Matched Lambda0: z - registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjCtauLambda0", "matched jet Pt, #Lambda^{0} Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}); - registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjCtauAntiLambda0", "matched jet Pt, #Lambda^{0} Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}); - registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjCtauK0S", "matched jet Pt, #{K}^{0}_{S} Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}); - registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjMassLambda0", "matched jet Pt, #Lambda^{0} Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjMassAntiLambda0", "matched jet Pt, #Lambda^{0} Pt Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjMassK0S", "matched jet Pt, #Lambda^{0} PtMassK0S", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, k0SMassAxis}); - registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjAllMasses", "matched jet Pt, #Lambda^{0} Pt, Masses", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjRadius", "matched jet Pt, #Lambda^{0} Pt Radius", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0RadiusAxis}); - registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjCosPA", "matched jet Pt, #Lambda^{0} Pt CosPA", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CosPAAxis}); - registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjDCAposneg", "matched jet Pt, #Lambda^{0} PtDCAposneg", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjDCAd", "matched jet Pt, #Lambda^{0} PtDCAd", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0DCAdAxis}); - // Fake Lambda0 - registry.add("matching/jets/V0/fakeJetPtLambda0TrackProj", "Fakes", HistType::kTH2D, {detJetPtAxis, detZAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0PtEtaPhi", "fake jet Pt, #Lambda^{0} PtEtaPhi", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0EtaAxis, v0PhiAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0PtCtau", "fake jet Pt, #Lambda^{0} PtCtau", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0PtMass", "fake jet Pt, #Lambda^{0} PtMass", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0PtLambdaMasses", "fake jet Pt, #Lambda^{0} PtLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0PtRadiusCosPA", "fake jet Pt, #Lambda^{0} PtRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0RadiusAxis, v0CosPAAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0PtDCAposneg", "fake jet Pt, #Lambda^{0} PtDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0PtDCAd", "fake jet Pt, #Lambda^{0} PtDCAd", HistType::kTH3D, {detJetPtAxis, v0PtAxis, v0DCAdAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0TrackProjEtaPhi", "fake jet Pt, #Lambda^{0} zEtaPhi", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0EtaAxis, v0PhiAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0TrackProjCtau", "fake jet Pt, #Lambda^{0} zCtau", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0TrackProjMass", "fake jet Pt, #Lambda^{0} zMass", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0TrackProjLambdaMasses", "fake jet Pt, #Lambda^{0} zLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0TrackProjRadiusCosPA", "fake jet Pt, #Lambda^{0} zRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0RadiusAxis, v0CosPAAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0TrackProjDCAposneg", "fake jet Pt, #Lambda^{0} zDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("matching/jets/V0/fakeJetPtLambda0TrackProjDCAd", "fake jet Pt, #Lambda^{0} zDCAd", HistType::kTH3D, {detJetPtAxis, detZAxis, v0DCAdAxis}); - // Missed Lambda0 - registry.add("matching/jets/V0/missJetPtLambda0TrackProj", "Misses", HistType::kTH2D, {partJetPtAxis, partZAxis}); - registry.add("matching/jets/V0/missJetPtLambda0PtEtaPhi", "miss jet Pt, #Lambda^{0} PtEtaPhi", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, v0EtaAxis, v0PhiAxis}); - - // ----------------------------- - // AntiLambda0 - // ----------------------------- - registry.add("matching/jets/V0/matchDetJetPtAntiLambda0TrackProjPartJetPtAntiLambda0TrackProj", "Matched", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, partJetPtAxis, partZAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0Pt", "matched jet Pt, #bar{#Lambda}^{0} Pt", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis}); - // Matched AntiLambda0: pt - registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtCtauLambda0", "matched jet Pt, #bar{#Lambda}^{0} Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtCtauAntiLambda0", "matched jet Pt, #bar{#Lambda}^{0} Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtCtauK0S", "matched jet Pt, #{K}^{0}_{S} Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtMassLambda0", "matched jet Pt, #bar{#Lambda}^{0} Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtMassAntiLambda0", "matched jet Pt, #bar{#Lambda}^{0} Pt Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtMassK0S", "matched jet Pt, #bar{#Lambda}^{0} PtMassK0S", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtAllMasses", "matched jet Pt, #bar{#Lambda}^{0} Pt, Masses", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtRadius", "matched jet Pt, #bar{#Lambda}^{0} Pt Radius", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0RadiusAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtCosPA", "matched jet Pt, #bar{#Lambda}^{0} Pt CosPA", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CosPAAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtDCAposneg", "matched jet Pt, #bar{#Lambda}^{0} PtDCAposneg", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtDCAd", "matched jet Pt, #bar{#Lambda}^{0} PtDCAd", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0DCAdAxis}); - // Matched AntiLambda0: z - registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjCtauLambda0", "matched jet Pt, #bar{#Lambda}^{0} Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjCtauAntiLambda0", "matched jet Pt, #bar{#Lambda}^{0} Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjCtauK0S", "matched jet Pt, #{K}^{0}_{S} Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjMassLambda0", "matched jet Pt, #bar{#Lambda}^{0} Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjMassAntiLambda0", "matched jet Pt, #bar{#Lambda}^{0} Pt Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjMassK0S", "matched jet Pt, #bar{#Lambda}^{0} PtMassK0S", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, k0SMassAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjAllMasses", "matched jet Pt, #bar{#Lambda}^{0} Pt, Masses", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjRadius", "matched jet Pt, #bar{#Lambda}^{0} Pt Radius", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0RadiusAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjCosPA", "matched jet Pt, #bar{#Lambda}^{0} Pt CosPA", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CosPAAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjDCAposneg", "matched jet Pt, #bar{#Lambda}^{0} PtDCAposneg", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjDCAd", "matched jet Pt, #bar{#Lambda}^{0} PtDCAd", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0DCAdAxis}); - // Fake AntiLambda0 - registry.add("matching/jets/V0/fakeJetPtAntiLambda0TrackProj", "Fakes", HistType::kTH2D, {detJetPtAxis, detZAxis}); - registry.add("matching/jets/V0/fakeJetPtAntiLambda0PtEtaPhi", "fake jet Pt, #bar{#Lambda}^{0} PtEtaPhi", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0EtaAxis, v0PhiAxis}); - registry.add("matching/jets/V0/fakeJetPtAntiLambda0PtCtau", "fake jet Pt, #bar{#Lambda}^{0} PtCtau", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); - registry.add("matching/jets/V0/fakeJetPtAntiLambda0PtMass", "fake jet Pt, #bar{#Lambda}^{0} PtMass", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/fakeJetPtAntiLambda0PtLambdaMasses", "fake jet Pt, #bar{#Lambda}^{0} PtLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); - registry.add("matching/jets/V0/fakeJetPtAntiLambda0PtRadiusCosPA", "fake jet Pt, #bar{#Lambda}^{0} PtRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0RadiusAxis, v0CosPAAxis}); - registry.add("matching/jets/V0/fakeJetPtAntiLambda0PtDCAposneg", "fake jet Pt, #bar{#Lambda}^{0} PtDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("matching/jets/V0/fakeJetPtAntiLambda0PtDCAd", "fake jet Pt, #bar{#Lambda}^{0} PtDCAd", HistType::kTH3D, {detJetPtAxis, v0PtAxis, v0DCAdAxis}); - - registry.add("matching/jets/V0/fakeJetPtAntiLambda0TrackProjCtau", "fake jet Pt, #bar{#Lambda}^{0} zCtau", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); - registry.add("matching/jets/V0/fakeJetPtAntiLambda0TrackProjMass", "fake jet Pt, #bar{#Lambda}^{0} zMass", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/fakeJetPtAntiLambda0TrackProjLambdaMasses", "fake jet Pt, #bar{#Lambda}^{0} zLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); - registry.add("matching/jets/V0/fakeJetPtAntiLambda0TrackProjRadiusCosPA", "fake jet Pt, #bar{#Lambda}^{0} zRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0RadiusAxis, v0CosPAAxis}); - registry.add("matching/jets/V0/fakeJetPtAntiLambda0TrackProjDCAposneg", "fake jet Pt, #bar{#Lambda}^{0} zDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("matching/jets/V0/fakeJetPtAntiLambda0TrackProjDCAd", "fake jet Pt, #bar{#Lambda}^{0} zDCAd", HistType::kTH3D, {detJetPtAxis, detZAxis, v0DCAdAxis}); - // Missed AntiLambda0 - registry.add("matching/jets/V0/missJetPtAntiLambda0TrackProj", "Misses", HistType::kTH2D, {partJetPtAxis, partZAxis}); - registry.add("matching/jets/V0/missJetPtAntiLambda0PtEtaPhi", "miss jet Pt, #bar{#Lambda}^{0} PtEtaPhi", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, v0EtaAxis, v0PhiAxis}); - - // ----------------------------- - // K0S - // ----------------------------- - registry.add("matching/jets/V0/matchDetJetPtK0STrackProjPartJetPtK0STrackProj", "Matched", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, partJetPtAxis, partZAxis}); - registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPt", "matched jet Pt, K_{S}^{0} Pt", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis}); - // Matched K0S: pt - registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtCtauLambda0", "matched jet Pt, K^{0}_{S} Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}); - registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtCtauAntiLambda0", "matched jet Pt, K^{0}_{S} Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}); - registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtCtauK0S", "matched jet Pt, #{K}^{0}_{S} Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}); - registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtMassLambda0", "matched jet Pt, K^{0}_{S} Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtMassAntiLambda0", "matched jet Pt, K^{0}_{S} Pt Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtMassK0S", "matched jet Pt, K^{0}_{S} PtMassK0S", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis}); - registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtAllMasses", "matched jet Pt, K^{0}_{S} Pt, Masses", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtRadius", "matched jet Pt, K^{0}_{S} Pt Radius", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0RadiusAxis}); - registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtCosPA", "matched jet Pt, K^{0}_{S} Pt CosPA", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CosPAAxis}); - registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtDCAposneg", "matched jet Pt, K^{0}_{S} PtDCAposneg", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtDCAd", "matched jet Pt, K^{0}_{S} PtDCAd", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0DCAdAxis}); - // Matched K0S: z - registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjCtauLambda0", "matched jet Pt, K^{0}_{S} Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}); - registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjCtauAntiLambda0", "matched jet Pt, K^{0}_{S} Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}); - registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjCtauK0S", "matched jet Pt, #{K}^{0}_{S} Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}); - registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjMassLambda0", "matched jet Pt, K^{0}_{S} Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjMassAntiLambda0", "matched jet Pt, K^{0}_{S} Pt Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjMassK0S", "matched jet Pt, K^{0}_{S} PtMassK0S", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, k0SMassAxis}); - registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjAllMasses", "matched jet Pt, K^{0}_{S} Pt, Masses", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjRadius", "matched jet Pt, K^{0}_{S} Pt Radius", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0RadiusAxis}); - registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjCosPA", "matched jet Pt, K^{0}_{S} Pt CosPA", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CosPAAxis}); - registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjDCAposneg", "matched jet Pt, K^{0}_{S} PtDCAposneg", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjDCAd", "matched jet Pt, K^{0}_{S} PtDCAd", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0DCAdAxis}); - // Fake K0S - registry.add("matching/jets/V0/fakeJetPtK0STrackProj", "Fakes", HistType::kTH2D, {detJetPtAxis, detZAxis}); - registry.add("matching/jets/V0/fakeJetPtK0SPtEtaPhi", "fake jet Pt, K^{0}_{S} PtEtaPhi", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0EtaAxis, v0PhiAxis}); - registry.add("matching/jets/V0/fakeJetPtK0SPtCtau", "fake jet Pt, K^{0}_{S} PtCtau", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); - registry.add("matching/jets/V0/fakeJetPtK0SPtMass", "fake jet Pt, K^{0}_{S} PtMass", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/fakeJetPtK0SPtLambdaMasses", "fake jet Pt, K^{0}_{S} PtLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); - registry.add("matching/jets/V0/fakeJetPtK0SPtRadiusCosPA", "fake jet Pt, K^{0}_{S} PtRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0RadiusAxis, v0CosPAAxis}); - registry.add("matching/jets/V0/fakeJetPtK0SPtDCAposneg", "fake jet Pt, K^{0}_{S} PtDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("matching/jets/V0/fakeJetPtK0SPtDCAd", "fake jet Pt, K^{0}_{S} PtDCAd", HistType::kTH3D, {detJetPtAxis, v0PtAxis, v0DCAdAxis}); - - registry.add("matching/jets/V0/fakeJetPtK0STrackProjCtau", "fake jet Pt, K^{0}_{S} zCtau", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); - registry.add("matching/jets/V0/fakeJetPtK0STrackProjMass", "fake jet Pt, K^{0}_{S} zMass", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/fakeJetPtK0STrackProjLambdaMasses", "fake jet Pt, K^{0}_{S} zLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); - registry.add("matching/jets/V0/fakeJetPtK0STrackProjRadiusCosPA", "fake jet Pt, K^{0}_{S} zRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0RadiusAxis, v0CosPAAxis}); - registry.add("matching/jets/V0/fakeJetPtK0STrackProjDCAposneg", "fake jet Pt, K^{0}_{S} zDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("matching/jets/V0/fakeJetPtK0STrackProjDCAd", "fake jet Pt, K^{0}_{S} zDCAd", HistType::kTH3D, {detJetPtAxis, detZAxis, v0DCAdAxis}); - // Missed K0S - registry.add("matching/jets/V0/missJetPtK0STrackProj", "Misses", HistType::kTH2D, {partJetPtAxis, partZAxis}); - registry.add("matching/jets/V0/missJetPtK0SPtEtaPhi", "miss jet Pt, K^{0}_{S} PtEtaPhi", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, v0EtaAxis, v0PhiAxis}); - - // Reflections - registry.add("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtLambda0Reflection", "Lambda0 Reflection", HistType::kTHnSparseD, {partJetPtAxis, v0partPtAxis, detJetPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjLambda0Reflection", "Lambda0 Reflection", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtAntiLambda0Reflection", "antiLambda0 Reflection", HistType::kTHnSparseD, {partJetPtAxis, v0partPtAxis, detJetPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjAntiLambda0Reflection", "antiLambda0 Reflection", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis, lambdaMassAxis}); - } // doprocessMcMatchedV0Frag - if (doprocessMcMatchedV0JetsFrag) { - registry.add("matching/V0/fakeV0PtEtaPhi", "fakeV0PtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); - registry.add("matching/V0/fakeV0PtCtau", "fakeV0PtCtau", HistType::kTHnSparseD, {v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); - registry.add("matching/V0/fakeV0PtMass", "fakeV0PtMass", HistType::kTHnSparseD, {v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/V0/fakeV0PtLambdaMasses", "fakeV0PtLambdaMasses", HistType::kTHnSparseD, {v0PtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}); - registry.add("matching/V0/fakeV0PtRadiusCosPA", "fakeV0PtRadiusCosPA", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, v0CosPAAxis}); - registry.add("matching/V0/fakeV0PtDCAposneg", "fakeV0PtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("matching/V0/fakeV0PtDCAd", "fakeV0PtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}); - - registry.add("matching/V0/fakeV0PosTrackPtEtaPhi", "fakeV0PosTrackPtEtaPhi", HistType::kTH3D, {trackPtAxis, etaAxis, phiAxis}); - registry.add("matching/V0/fakeV0NegTrackPtEtaPhi", "fakeV0NegTrackPtEtaPhi", HistType::kTH3D, {trackPtAxis, etaAxis, phiAxis}); - - registry.add("matching/V0/V0PosPartPtRatioPtRelDiffPt", "V0PosPartPtRatioRelDiffPt", HistType::kTH3D, {trackPtAxis, ptRatioAxis, ptTrackRelDiffAxis}); - registry.add("matching/V0/V0NegPartPtRatioPtRelDiffPt", "V0NegPartPtRatioRelDiffPt", HistType::kTH3D, {trackPtAxis, ptRatioAxis, ptTrackRelDiffAxis}); - - registry.add("matching/jets/V0/partJetPtDetJetPtPartV0PtPosPtRatioPtRelDiffPt", "V0PtPosPartPtRatioRelDiffPt", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0PtAxis, trackPtAxis, ptRatioAxis, ptTrackRelDiffAxis}); - registry.add("matching/jets/V0/partJetPtDetJetPtPartV0PtNegPtRatioPtRelDiffPt", "V0PtNegPartPtRatioRelDiffPt", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0PtAxis, trackPtAxis, ptRatioAxis, ptTrackRelDiffAxis}); - - registry.add("matching/V0/nonedecayedFakeV0PtMass", "nonedecayedFakeV0PtMass", HistType::kTHnSparseD, {v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/V0/doubledecayedFakeV0PtMass", "doubledecayedFakeV0PtMass", HistType::kTHnSparseD, {v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/V0/decayedK0SV0PtMass", "decayedK0SV0PtMass", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/V0/decayedLambdaV0PtMass", "decayedLambdaV0PtMass", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/V0/decayedAntiLambdaV0PtMass", "decayedAntiLambdaV0PtMass", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/V0/decayedOtherPtV0PtMass", "decayedOtherPtV0PtMass", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - - registry.add("matching/jets/V0/nonedecayedFakeV0PtMass", "nonedecayedFakeV0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/nonedecayedFakeV0TrackProjMass", "nonedecayedFakeV0TrackProjMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, zAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/doubledecayedFakeV0PtMass", "doubledecayedFakeV0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/doubledecayedFakeV0TrackProjMass", "doubledecayedFakeV0TrackProjMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, zAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/decayedK0SV0PtMass", "decayedK0SV0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/decayedK0SV0TrackProjMass", "decayedK0SV0TrackProjMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, partZAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/decayedLambdaV0PtMass", "decayedLambdaV0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/decayedLambdaV0TrackProjMass", "decayedLambdaV0TrackProjMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, partZAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/decayedAntiLambdaV0PtMass", "decayedAntiLambdaV0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/decayedAntiLambdaV0TrackProjMass", "decayedAntiLambdaV0TrackProjMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, partZAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/decayedOtherPtV0PtMass", "decayedOtherPtV0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/jets/V0/decayedOtherPtV0TrackProjMass", "decayedOtherPtV0TrackProjMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, partZAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); + // Matching - Jets + registry.add("mcp/jets/partJetPtEtaPhi", "Particle level jet #it{p}_{T}, #eta, #phi", HistType::kTH3D, {partJetPtAxis, partEtaAxis, partPhiAxis}, true); + registry.add("mcd/jets/detJetPtEtaPhi", "Detector level jet #it{p}_{T}, #eta, #phi", HistType::kTH3D, {detJetPtAxis, detEtaAxis, detPhiAxis}, true); + + registry.add("matching/jets/matchDetJetPtEtaPhi", "Matched detector level jet #it{p}_{T}, #eta, #phi", HistType::kTH3D, {detJetPtAxis, detEtaAxis, detPhiAxis}, true); + registry.add("matching/jets/matchPartJetPtEtaPhi", "Matched particle level jet #it{p}_{T}, #eta, #phi", HistType::kTH3D, {partJetPtAxis, partEtaAxis, partPhiAxis}, true); + registry.add("matching/jets/matchPartJetPtEtaPhiMatchDist", "matchJetMatchDist", HistType::kTHnSparseD, {partJetPtAxis, partEtaAxis, partPhiAxis, matchDistAxis}, true); + registry.add("matching/jets/matchPartJetPtEnergyScale", "jetEnergyScale", HistType::kTH2D, {partJetPtAxis, ptRatioAxis}, true); + registry.add("matching/jets/matchDetJetPtPartJetPt", "matchDetJetPtPartJetPt", HistType::kTH2D, {detJetPtAxis, partJetPtAxis}, true); + registry.add("matching/jets/matchPartJetPtDetJetEtaPartJetEta", "matchPartJetPtDetJetEtaPartJetEta", HistType::kTH3D, {partJetPtAxis, detEtaAxis, partEtaAxis}, true); + registry.add("matching/jets/matchPartJetPtDetJetPhiPartJetPhi", "matchPartJetPtDetJetPhiPartJetPhi", HistType::kTH3D, {partJetPtAxis, detPhiAxis, partPhiAxis}, true); + registry.add("matching/jets/matchPartJetPtResolutionPt", "#it{p}_{T}^{jet, det} - #it{p}_{T}^{jet, part}", HistType::kTH2D, {partJetPtAxis, ptDiffAxis}, true); + registry.add("matching/jets/matchPartJetPtResolutionEta", "#eta^{jet, det} - #eta^{jet, part}", HistType::kTH3D, {partJetPtAxis, partEtaAxis, etaDiffAxis}, true); + registry.add("matching/jets/matchPartJetPtResolutionPhi", "#phi^{jet, det} - #phi^{jet, part}", HistType::kTH3D, {partJetPtAxis, partPhiAxis, phiDiffAxis}, true); + registry.add("matching/jets/matchPartJetPtRelDiffPt", "#it{p}_{T}^{jet, det} - #it{p}_{T}^{jet, part}", HistType::kTH2D, {partJetPtAxis, ptJetRelDiffAxis}, true); + + registry.add("matching/jets/V0/jetPtnV0MatchednK0SnLambdanAntiLambda", "jet Pt, nV0 matched, nK0S nLambdan AntiLambda", HistType::kTHnSparseD, {detJetPtAxis, v0Count, v0Count, v0Count, v0Count}, true); + registry.add("matching/jets/V0/partJetPtV0PtDetPt", "V0PartPtDetPt", HistType::kTH3D, {partJetPtAxis, v0partPtAxis, v0detPtAxis}, true); + registry.add("matching/jets/V0/partJetPtDetJetPtPartV0PtRatioPtRelDiffPt", "V0PartPtRatioRelDiffPt", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0partPtAxis, v0PtRatioAxis, v0PtRelDiffAxis}, true); + + // Matching - Matched V0s + registry.add("matching/jets/V0/matchDetJetPtV0TrackProjPartJetPtV0TrackProj", "Matched", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, partJetPtAxis, partZAxis}, true); + registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0Pt", "matched jet Pt, V0 Pt", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis}, true); + // Matching - Matched V0s: pt + registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtCtauK0S", "matched jet Pt, V0 Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtCtauLambda", "matched jet Pt, V0 Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtCtauAntiLambda", "matched jet Pt, V0 Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtMassK0S", "matched jet Pt, V0 Pt, MassK0S", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis}, true); + registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtMassLambda", "matched jet Pt, V0 Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtMassAntiLambda", "matched jet Pt, V0 Pt, Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtRadius", "matched jet Pt, V0 Pt, Radius", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0RadiusAxis}, true); + registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtCosPA", "matched jet Pt, V0 Pt, CosPA", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CosPAAxis}, true); + registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtDCAposneg", "matched jet Pt, V0 Pt, DCAposneg", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("matching/jets/V0/partJetPtV0PtDetJetPtV0PtDCAd", "matched jet Pt, V0 Pt, DCAd", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0DCAdAxis}, true); + // Matching - Matched V0s: z + registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjCtauK0S", "matched jet Pt, V0 z, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjCtauLambda", "matched jet Pt, V0 z, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjCtauAntiLambda", "matched jet Pt, V0 z, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjMassK0S", "matched jet Pt, V0 z, MassK0S", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, k0SMassAxis}, true); + registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjMassLambda", "matched jet Pt, V0 z, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjMassAntiLambda", "matched jet Pt, V0 z, Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjRadius", "matched jet Pt, V0 z, Radius", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0RadiusAxis}, true); + registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjCosPA", "matched jet Pt, V0 z, CosPA", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CosPAAxis}, true); + registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjDCAposneg", "matched jet Pt, V0 z, DCAposneg", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjDCAd", "matched jet Pt, V0 z, DCAd", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0DCAdAxis}, true); + + // Matching - Fake V0s: pt + registry.add("matching/jets/V0/fakeJetPtV0PtEtaPhi", "fake jet Pt, V0 PtEtaPhi", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("matching/jets/V0/fakeJetPtV0TrackProj", "Fakes", HistType::kTH2D, {detJetPtAxis, detZAxis}, true); + registry.add("matching/jets/V0/fakeJetPtV0PtCtau", "fake jet Pt, V0 PtCtau", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/fakeJetPtV0PtMass", "fake jet Pt, V0 PtMass", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/fakeJetPtV0PtLambdaMasses", "fake jet Pt, V0 PtLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}, true); + registry.add("matching/jets/V0/fakeJetPtV0PtRadiusCosPA", "fake jet Pt, V0 PtRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("matching/jets/V0/fakeJetPtV0PtDCAposneg", "fake jet Pt, V0 PtDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("matching/jets/V0/fakeJetPtV0PtDCAd", "fake jet Pt, V0 PtDCAd", HistType::kTH3D, {detJetPtAxis, v0PtAxis, v0DCAdAxis}, true); + // Matching - Fake V0s: z + registry.add("matching/jets/V0/fakeJetPtV0TrackProjCtau", "fake jet Pt, V0 zCtau", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/fakeJetPtV0TrackProjMass", "fake jet Pt, V0 zMass", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/fakeJetPtV0TrackProjLambdaMasses", "fake jet Pt, V0 zLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}, true); + registry.add("matching/jets/V0/fakeJetPtV0TrackProjRadiusCosPA", "fake jet Pt, V0 zRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("matching/jets/V0/fakeJetPtV0TrackProjDCAposneg", "fake jet Pt, V0 zDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("matching/jets/V0/fakeJetPtV0TrackProjDCAd", "fake jet Pt, V0 zDCAd", HistType::kTH3D, {detJetPtAxis, detZAxis, v0DCAdAxis}, true); + // Matching - Missed V0s + registry.add("matching/jets/V0/missJetPtV0PtEtaPhi", "miss jet Pt, V0 PtEtaPhi", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("matching/jets/V0/missJetPtV0TrackProj", "Misses", HistType::kTH2D, {partJetPtAxis, partZAxis}, true); + + // Matching - Matched K0S + registry.add("matching/jets/V0/matchDetJetPtK0STrackProjPartJetPtK0STrackProj", "Matched", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, partJetPtAxis, partZAxis}, true); + registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPt", "matched jet Pt, K_{S}^{0} Pt", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis}, true); + // Matching - Matched K0S: pt + registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtCtauLambda", "matched jet Pt, K^{0}_{S} Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtCtauAntiLambda", "matched jet Pt, K^{0}_{S} Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtCtauK0S", "matched jet Pt, #{K}^{0}_{S} Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtMassLambda", "matched jet Pt, K^{0}_{S} Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtMassAntiLambda", "matched jet Pt, K^{0}_{S} Pt Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtMassK0S", "matched jet Pt, K^{0}_{S} PtMassK0S", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis}, true); + registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtAllMasses", "matched jet Pt, K^{0}_{S} Pt, Masses", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtRadius", "matched jet Pt, K^{0}_{S} Pt Radius", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0RadiusAxis}, true); + registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtCosPA", "matched jet Pt, K^{0}_{S} Pt CosPA", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CosPAAxis}, true); + registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtDCAposneg", "matched jet Pt, K^{0}_{S} PtDCAposneg", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtDCAd", "matched jet Pt, K^{0}_{S} PtDCAd", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0DCAdAxis}, true); + // Matching - Matched K0S: z + registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjCtauLambda", "matched jet Pt, K^{0}_{S} Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjCtauAntiLambda", "matched jet Pt, K^{0}_{S} Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjCtauK0S", "matched jet Pt, #{K}^{0}_{S} Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjMassLambda", "matched jet Pt, K^{0}_{S} Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjMassAntiLambda", "matched jet Pt, K^{0}_{S} Pt Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjMassK0S", "matched jet Pt, K^{0}_{S} PtMassK0S", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, k0SMassAxis}, true); + registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjAllMasses", "matched jet Pt, K^{0}_{S} Pt, Masses", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjRadius", "matched jet Pt, K^{0}_{S} Pt Radius", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0RadiusAxis}, true); + registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjCosPA", "matched jet Pt, K^{0}_{S} Pt CosPA", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CosPAAxis}, true); + registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjDCAposneg", "matched jet Pt, K^{0}_{S} PtDCAposneg", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjDCAd", "matched jet Pt, K^{0}_{S} PtDCAd", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0DCAdAxis}, true); + // Matching - Fake K0S: pt + registry.add("matching/jets/V0/fakeJetPtK0SPtEtaPhi", "fake jet Pt, K^{0}_{S} PtEtaPhi", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("matching/jets/V0/fakeJetPtK0STrackProj", "Fakes", HistType::kTH2D, {detJetPtAxis, detZAxis}, true); + registry.add("matching/jets/V0/fakeJetPtK0SPtCtau", "fake jet Pt, K^{0}_{S} PtCtau", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/fakeJetPtK0SPtMass", "fake jet Pt, K^{0}_{S} PtMass", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/fakeJetPtK0SPtLambdaMasses", "fake jet Pt, K^{0}_{S} PtLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}, true); + registry.add("matching/jets/V0/fakeJetPtK0SPtRadiusCosPA", "fake jet Pt, K^{0}_{S} PtRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("matching/jets/V0/fakeJetPtK0SPtDCAposneg", "fake jet Pt, K^{0}_{S} PtDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("matching/jets/V0/fakeJetPtK0SPtDCAd", "fake jet Pt, K^{0}_{S} PtDCAd", HistType::kTH3D, {detJetPtAxis, v0PtAxis, v0DCAdAxis}, true); + // Matching - Fake K0S: z + registry.add("matching/jets/V0/fakeJetPtK0STrackProjCtau", "fake jet Pt, K^{0}_{S} zCtau", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/fakeJetPtK0STrackProjMass", "fake jet Pt, K^{0}_{S} zMass", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/fakeJetPtK0STrackProjLambdaMasses", "fake jet Pt, K^{0}_{S} zLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}, true); + registry.add("matching/jets/V0/fakeJetPtK0STrackProjRadiusCosPA", "fake jet Pt, K^{0}_{S} zRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("matching/jets/V0/fakeJetPtK0STrackProjDCAposneg", "fake jet Pt, K^{0}_{S} zDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("matching/jets/V0/fakeJetPtK0STrackProjDCAd", "fake jet Pt, K^{0}_{S} zDCAd", HistType::kTH3D, {detJetPtAxis, detZAxis, v0DCAdAxis}, true); + // Matching - Missed K0S + registry.add("matching/jets/V0/missJetPtK0SPtEtaPhi", "miss jet Pt, K^{0}_{S} PtEtaPhi", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("matching/jets/V0/missJetPtK0STrackProj", "Misses", HistType::kTH2D, {partJetPtAxis, partZAxis}, true); + + // Matching - Matched Lambda + registry.add("matching/jets/V0/matchDetJetPtLambdaTrackProjPartJetPtLambdaTrackProj", "Matched", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, partJetPtAxis, partZAxis}, true); + registry.add("matching/jets/V0/partJetPtLambdaPtDetJetPtLambdaPt", "matched jet Pt, #Lambda^{0} Pt", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis}, true); + // Matching - Matched Lambda: pt + registry.add("matching/jets/V0/partJetPtLambdaPtDetJetPtLambdaPtCtauK0S", "matched jet Pt, #{K}^{0}_{S} Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/partJetPtLambdaPtDetJetPtLambdaPtCtauLambda", "matched jet Pt, #Lambda^{0} Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/partJetPtLambdaPtDetJetPtLambdaPtCtauAntiLambda", "matched jet Pt, #Lambda^{0} Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/partJetPtLambdaPtDetJetPtLambdaPtMassK0S", "matched jet Pt, #Lambda^{0} PtMassK0S", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis}, true); + registry.add("matching/jets/V0/partJetPtLambdaPtDetJetPtLambdaPtMassLambda", "matched jet Pt, #Lambda^{0} Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/partJetPtLambdaPtDetJetPtLambdaPtMassAntiLambda", "matched jet Pt, #Lambda^{0} Pt Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/partJetPtLambdaPtDetJetPtLambdaPtAllMasses", "matched jet Pt, #Lambda^{0} Pt, Masses", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/partJetPtLambdaPtDetJetPtLambdaPtRadius", "matched jet Pt, #Lambda^{0} Pt Radius", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0RadiusAxis}, true); + registry.add("matching/jets/V0/partJetPtLambdaPtDetJetPtLambdaPtCosPA", "matched jet Pt, #Lambda^{0} Pt CosPA", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CosPAAxis}, true); + registry.add("matching/jets/V0/partJetPtLambdaPtDetJetPtLambdaPtDCAposneg", "matched jet Pt, #Lambda^{0} PtDCAposneg", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("matching/jets/V0/partJetPtLambdaPtDetJetPtLambdaPtDCAd", "matched jet Pt, #Lambda^{0} PtDCAd", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0DCAdAxis}, true); + registry.add("matching/jets/V0/partJetPtLambdaPtDetJetPtLambdaPtLambdaReflection", "Lambda Reflection", HistType::kTHnSparseD, {partJetPtAxis, v0partPtAxis, detJetPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + // Matching - Matched Lambda: z + registry.add("matching/jets/V0/partJetPtLambdaTrackProjDetJetPtLambdaTrackProjCtauLambda", "matched jet Pt, #Lambda^{0} Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/partJetPtLambdaTrackProjDetJetPtLambdaTrackProjCtauAntiLambda", "matched jet Pt, #Lambda^{0} Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/partJetPtLambdaTrackProjDetJetPtLambdaTrackProjCtauK0S", "matched jet Pt, #{K}^{0}_{S} Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/partJetPtLambdaTrackProjDetJetPtLambdaTrackProjMassLambda", "matched jet Pt, #Lambda^{0} Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/partJetPtLambdaTrackProjDetJetPtLambdaTrackProjMassAntiLambda", "matched jet Pt, #Lambda^{0} Pt Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/partJetPtLambdaTrackProjDetJetPtLambdaTrackProjMassK0S", "matched jet Pt, #Lambda^{0} PtMassK0S", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, k0SMassAxis}, true); + registry.add("matching/jets/V0/partJetPtLambdaTrackProjDetJetPtLambdaTrackProjAllMasses", "matched jet Pt, #Lambda^{0} Pt, Masses", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/partJetPtLambdaTrackProjDetJetPtLambdaTrackProjRadius", "matched jet Pt, #Lambda^{0} Pt Radius", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0RadiusAxis}, true); + registry.add("matching/jets/V0/partJetPtLambdaTrackProjDetJetPtLambdaTrackProjCosPA", "matched jet Pt, #Lambda^{0} Pt CosPA", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CosPAAxis}, true); + registry.add("matching/jets/V0/partJetPtLambdaTrackProjDetJetPtLambdaTrackProjDCAposneg", "matched jet Pt, #Lambda^{0} PtDCAposneg", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("matching/jets/V0/partJetPtLambdaTrackProjDetJetPtLambdaTrackProjDCAd", "matched jet Pt, #Lambda^{0} PtDCAd", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0DCAdAxis}, true); + registry.add("matching/jets/V0/partJetPtLambdaTrackProjDetJetPtLambdaTrackProjLambdaReflection", "Lambda Reflection", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + // Matching - Fake Lambda: pt + registry.add("matching/jets/V0/fakeJetPtLambdaPtEtaPhi", "fake jet Pt, #Lambda^{0} PtEtaPhi", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("matching/jets/V0/fakeJetPtLambdaTrackProj", "Fakes", HistType::kTH2D, {detJetPtAxis, detZAxis}, true); + registry.add("matching/jets/V0/fakeJetPtLambdaPtCtau", "fake jet Pt, #Lambda^{0} PtCtau", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/fakeJetPtLambdaPtMass", "fake jet Pt, #Lambda^{0} PtMass", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/fakeJetPtLambdaPtLambdaMasses", "fake jet Pt, #Lambda^{0} PtLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}, true); + registry.add("matching/jets/V0/fakeJetPtLambdaPtRadiusCosPA", "fake jet Pt, #Lambda^{0} PtRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("matching/jets/V0/fakeJetPtLambdaPtDCAposneg", "fake jet Pt, #Lambda^{0} PtDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("matching/jets/V0/fakeJetPtLambdaPtDCAd", "fake jet Pt, #Lambda^{0} PtDCAd", HistType::kTH3D, {detJetPtAxis, v0PtAxis, v0DCAdAxis}, true); + // Matching - Fake Lambda: z + registry.add("matching/jets/V0/fakeJetPtLambdaTrackProjEtaPhi", "fake jet Pt, #Lambda^{0} zEtaPhi", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("matching/jets/V0/fakeJetPtLambdaTrackProjCtau", "fake jet Pt, #Lambda^{0} zCtau", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/fakeJetPtLambdaTrackProjMass", "fake jet Pt, #Lambda^{0} zMass", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/fakeJetPtLambdaTrackProjLambdaMasses", "fake jet Pt, #Lambda^{0} zLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}, true); + registry.add("matching/jets/V0/fakeJetPtLambdaTrackProjRadiusCosPA", "fake jet Pt, #Lambda^{0} zRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("matching/jets/V0/fakeJetPtLambdaTrackProjDCAposneg", "fake jet Pt, #Lambda^{0} zDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("matching/jets/V0/fakeJetPtLambdaTrackProjDCAd", "fake jet Pt, #Lambda^{0} zDCAd", HistType::kTH3D, {detJetPtAxis, detZAxis, v0DCAdAxis}, true); + // Matching - Missed Lambda + registry.add("matching/jets/V0/missJetPtLambdaPtEtaPhi", "miss jet Pt, #Lambda^{0} PtEtaPhi", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("matching/jets/V0/missJetPtLambdaTrackProj", "Misses", HistType::kTH2D, {partJetPtAxis, partZAxis}, true); + + // Matching - Matched AntiLambda + registry.add("matching/jets/V0/matchDetJetPtAntiLambdaTrackProjPartJetPtAntiLambdaTrackProj", "Matched", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, partJetPtAxis, partZAxis}, true); + registry.add("matching/jets/V0/partJetPtAntiLambdaPtDetJetPtAntiLambdaPt", "matched jet Pt, #bar{#Lambda}^{0} Pt", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis}, true); + // Matching - Matched AntiLambda: pt + registry.add("matching/jets/V0/partJetPtAntiLambdaPtDetJetPtAntiLambdaPtCtauK0S", "matched jet Pt, #{K}^{0}_{S} Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/partJetPtAntiLambdaPtDetJetPtAntiLambdaPtCtauLambda", "matched jet Pt, #bar{#Lambda}^{0} Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/partJetPtAntiLambdaPtDetJetPtAntiLambdaPtCtauAntiLambda", "matched jet Pt, #bar{#Lambda}^{0} Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/partJetPtAntiLambdaPtDetJetPtAntiLambdaPtMassK0S", "matched jet Pt, #bar{#Lambda}^{0} PtMassK0S", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis}, true); + registry.add("matching/jets/V0/partJetPtAntiLambdaPtDetJetPtAntiLambdaPtMassLambda", "matched jet Pt, #bar{#Lambda}^{0} Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/partJetPtAntiLambdaPtDetJetPtAntiLambdaPtMassAntiLambda", "matched jet Pt, #bar{#Lambda}^{0} Pt Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/partJetPtAntiLambdaPtDetJetPtAntiLambdaPtAllMasses", "matched jet Pt, #bar{#Lambda}^{0} Pt, Masses", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/partJetPtAntiLambdaPtDetJetPtAntiLambdaPtRadius", "matched jet Pt, #bar{#Lambda}^{0} Pt Radius", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0RadiusAxis}, true); + registry.add("matching/jets/V0/partJetPtAntiLambdaPtDetJetPtAntiLambdaPtCosPA", "matched jet Pt, #bar{#Lambda}^{0} Pt CosPA", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0CosPAAxis}, true); + registry.add("matching/jets/V0/partJetPtAntiLambdaPtDetJetPtAntiLambdaPtDCAposneg", "matched jet Pt, #bar{#Lambda}^{0} PtDCAposneg", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("matching/jets/V0/partJetPtAntiLambdaPtDetJetPtAntiLambdaPtDCAd", "matched jet Pt, #bar{#Lambda}^{0} PtDCAd", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, detJetPtAxis, v0PtAxis, v0DCAdAxis}, true); + registry.add("matching/jets/V0/partJetPtAntiLambdaPtDetJetPtAntiLambdaPtAntiLambdaReflection", "AntiLambda Reflection", HistType::kTHnSparseD, {partJetPtAxis, v0partPtAxis, detJetPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + // Matching - Matched AntiLambda: z + registry.add("matching/jets/V0/partJetPtAntiLambdaTrackProjDetJetPtAntiLambdaTrackProjCtauLambda", "matched jet Pt, #bar{#Lambda}^{0} Pt, Ctau #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/partJetPtAntiLambdaTrackProjDetJetPtAntiLambdaTrackProjCtauAntiLambda", "matched jet Pt, #bar{#Lambda}^{0} Pt, Ctau #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/partJetPtAntiLambdaTrackProjDetJetPtAntiLambdaTrackProjCtauK0S", "matched jet Pt, #{K}^{0}_{S} Pt, Ctau #{K}^{0}_{S}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/partJetPtAntiLambdaTrackProjDetJetPtAntiLambdaTrackProjMassLambda", "matched jet Pt, #bar{#Lambda}^{0} Pt, Mass #Lambda^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/partJetPtAntiLambdaTrackProjDetJetPtAntiLambdaTrackProjMassAntiLambda", "matched jet Pt, #bar{#Lambda}^{0} Pt Mass #bar{#Lambda}^{0}", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/partJetPtAntiLambdaTrackProjDetJetPtAntiLambdaTrackProjMassK0S", "matched jet Pt, #bar{#Lambda}^{0} PtMassK0S", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, k0SMassAxis}, true); + registry.add("matching/jets/V0/partJetPtAntiLambdaTrackProjDetJetPtAntiLambdaTrackProjAllMasses", "matched jet Pt, #bar{#Lambda}^{0} Pt, Masses", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/partJetPtAntiLambdaTrackProjDetJetPtAntiLambdaTrackProjRadius", "matched jet Pt, #bar{#Lambda}^{0} Pt Radius", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0RadiusAxis}, true); + registry.add("matching/jets/V0/partJetPtAntiLambdaTrackProjDetJetPtAntiLambdaTrackProjCosPA", "matched jet Pt, #bar{#Lambda}^{0} Pt CosPA", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0CosPAAxis}, true); + registry.add("matching/jets/V0/partJetPtAntiLambdaTrackProjDetJetPtAntiLambdaTrackProjDCAposneg", "matched jet Pt, #bar{#Lambda}^{0} PtDCAposneg", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("matching/jets/V0/partJetPtAntiLambdaTrackProjDetJetPtAntiLambdaTrackProjDCAd", "matched jet Pt, #bar{#Lambda}^{0} PtDCAd", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, v0DCAdAxis}, true); + registry.add("matching/jets/V0/partJetPtAntiLambdaTrackProjDetJetPtAntiLambdaTrackProjAntiLambdaReflection", "AntiLambda Reflection", HistType::kTHnSparseD, {partJetPtAxis, partZAxis, detJetPtAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + // Matching - Fake AntiLambda: pt + registry.add("matching/jets/V0/fakeJetPtAntiLambdaPtEtaPhi", "fake jet Pt, #bar{#Lambda}^{0} PtEtaPhi", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("matching/jets/V0/fakeJetPtAntiLambdaTrackProj", "Fakes", HistType::kTH2D, {detJetPtAxis, detZAxis}, true); + registry.add("matching/jets/V0/fakeJetPtAntiLambdaPtCtau", "fake jet Pt, #bar{#Lambda}^{0} PtCtau", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/fakeJetPtAntiLambdaPtMass", "fake jet Pt, #bar{#Lambda}^{0} PtMass", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/fakeJetPtAntiLambdaPtLambdaMasses", "fake jet Pt, #bar{#Lambda}^{0} PtLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}, true); + registry.add("matching/jets/V0/fakeJetPtAntiLambdaPtRadiusCosPA", "fake jet Pt, #bar{#Lambda}^{0} PtRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("matching/jets/V0/fakeJetPtAntiLambdaPtDCAposneg", "fake jet Pt, #bar{#Lambda}^{0} PtDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, v0PtAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("matching/jets/V0/fakeJetPtAntiLambdaPtDCAd", "fake jet Pt, #bar{#Lambda}^{0} PtDCAd", HistType::kTH3D, {detJetPtAxis, v0PtAxis, v0DCAdAxis}, true); + // Matching - Fake AntiLambda: z + registry.add("matching/jets/V0/fakeJetPtAntiLambdaTrackProjCtau", "fake jet Pt, #bar{#Lambda}^{0} zCtau", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}, true); + registry.add("matching/jets/V0/fakeJetPtAntiLambdaTrackProjMass", "fake jet Pt, #bar{#Lambda}^{0} zMass", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/fakeJetPtAntiLambdaTrackProjLambdaMasses", "fake jet Pt, #bar{#Lambda}^{0} zLambdaMasses", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, lambdaMassDiffAxis, lambdaMassRatioAxis, lambdaMassRelDiffAxis}, true); + registry.add("matching/jets/V0/fakeJetPtAntiLambdaTrackProjRadiusCosPA", "fake jet Pt, #bar{#Lambda}^{0} zRadiusCosPA", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("matching/jets/V0/fakeJetPtAntiLambdaTrackProjDCAposneg", "fake jet Pt, #bar{#Lambda}^{0} zDCAposneg", HistType::kTHnSparseD, {detJetPtAxis, detZAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("matching/jets/V0/fakeJetPtAntiLambdaTrackProjDCAd", "fake jet Pt, #bar{#Lambda}^{0} zDCAd", HistType::kTH3D, {detJetPtAxis, detZAxis, v0DCAdAxis}, true); + // Matching - Missed AntiLambda + registry.add("matching/jets/V0/missJetPtAntiLambdaPtEtaPhi", "miss jet Pt, #bar{#Lambda}^{0} PtEtaPhi", HistType::kTHnSparseD, {partJetPtAxis, v0PtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("matching/jets/V0/missJetPtAntiLambdaTrackProj", "Misses", HistType::kTH2D, {partJetPtAxis, partZAxis}, true); + + // Matching - Matched V0s: daughters + registry.add("matching/jets/V0/partJetPtDetJetPtPartV0PtPosPtRatioPtRelDiffPt", "V0PtPosPartPtRatioRelDiffPt", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0PtAxis, trackPtAxis, ptRatioAxis, ptTrackRelDiffAxis}, true); + registry.add("matching/jets/V0/partJetPtDetJetPtPartV0PtNegPtRatioPtRelDiffPt", "V0PtNegPartPtRatioRelDiffPt", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0PtAxis, trackPtAxis, ptRatioAxis, ptTrackRelDiffAxis}, true); + // Matching - Fake V0s: daughters non-decayed (should be empty) + registry.add("matching/V0/nonedecayedFakeV0PtMass", "nonedecayedFakeV0PtMass", HistType::kTHnSparseD, {v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/nonedecayedFakeV0PtMass", "nonedecayedFakeV0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/nonedecayedFakeV0TrackProjMass", "nonedecayedFakeV0TrackProjMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, zAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + // Matching - Fake V0s: daughters both-decayed (seems unlikely: e.g. K->pi pi->mu nu mu nu) + registry.add("matching/V0/doubledecayedFakeV0PtMass", "doubledecayedFakeV0PtMass", HistType::kTHnSparseD, {v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/doubledecayedFakeV0PtMass", "doubledecayedFakeV0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/doubledecayedFakeV0TrackProjMass", "doubledecayedFakeV0TrackProjMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, zAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + // Matching - Fake V0s: daughters one-decayed (e.g. K->pi pi->pi mu nu) + // Matching - Fake K0S: daughters one-decayed + registry.add("matching/V0/decayedK0SV0PtMass", "decayedK0SV0PtMass", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/decayedK0SV0PtMass", "decayedK0SV0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/decayedK0SV0TrackProjMass", "decayedK0SV0TrackProjMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, partZAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + // Matching - Fake Lambda: daughters one-decayed + registry.add("matching/V0/decayedLambdaV0PtMass", "decayedLambdaV0PtMass", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/decayedLambdaV0PtMass", "decayedLambdaV0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/decayedLambdaV0TrackProjMass", "decayedLambdaV0TrackProjMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, partZAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + // Matching - Fake AntiLambda: daughters one-decayed + registry.add("matching/V0/decayedAntiLambdaV0PtMass", "decayedAntiLambdaV0PtMass", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/decayedAntiLambdaV0PtMass", "decayedAntiLambdaV0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/decayedAntiLambdaV0TrackProjMass", "decayedAntiLambdaV0TrackProjMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, partZAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + // Matching - Fake Other: daughters one-decayed + registry.add("matching/V0/decayedOtherPtV0PtMass", "decayedOtherPtV0PtMass", HistType::kTHnSparseD, {v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/decayedOtherPtV0PtMass", "decayedOtherPtV0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0partPtAxis, v0detPtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/jets/V0/decayedOtherPtV0TrackProjMass", "decayedOtherPtV0TrackProjMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, partZAxis, detZAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); } // doprocessMcMatchedV0JetsFrag if (doprocessDataV0PerpCone) { @@ -841,30 +954,33 @@ struct JetFragmentation { registry.add("data/PC/V0PtDCAposneg", "V0PtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}); registry.add("data/PC/V0PtDCAd", "V0PtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}); - registry.add("data/PC/JetPtEtaLambda0Pt", "JetPtEtaLambda0Pt", HistType::kTH3D, {jetPtAxis, etaAxis, v0PtAxis}); - registry.add("data/PC/JetPtLambda0PtMass", "JetPtLambda0PtMass", HistType::kTH3D, {jetPtAxis, v0PtAxis, lambdaMassAxis}); - registry.add("data/PC/LambdaPtEtaPhi", "LambdaPtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); - registry.add("data/PC/LambdaPtCtauMass", "LambdaPtCtauMass", HistType::kTH3D, {v0PtAxis, v0CtauAxis, lambdaMassAxis}); - registry.add("data/PC/LambdaPtRadiusCosPA", "LambdaPtRadiusCosPA", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, v0CosPAAxis}); - registry.add("data/PC/LambdaPtDCAposneg", "LambdaPtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("data/PC/LambdaPtDCAd", "LambdaPtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}); - - registry.add("data/PC/JetPtEtaAntiLambda0Pt", "JetPtEtaAntiLambda0Pt", HistType::kTH3D, {jetPtAxis, etaAxis, v0PtAxis}); - registry.add("data/PC/JetPtAntiLambda0PtMass", "JetPtAntiLambda0PtMass", HistType::kTH3D, {jetPtAxis, v0PtAxis, lambdaMassAxis}); - registry.add("data/PC/antiLambdaPtEtaPhi", "antiLambdaPtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); - registry.add("data/PC/antiLambdaPtCtauMass", "antiLambdaPtCtauMass", HistType::kTH3D, {v0PtAxis, v0CtauAxis, lambdaMassAxis}); - registry.add("data/PC/antiLambdaPtRadiusCosPA", "antiLambdaPtRadiusCosPA", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, v0CosPAAxis}); - registry.add("data/PC/antiLambdaPtDCAposneg", "antiLambdaPtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("data/PC/antiLambdaPtDCAd", "antiLambdaPtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}); - - registry.add("data/PC/JetPtEtaK0SPt", "JetPtEtaK0SPt", HistType::kTH3D, {jetPtAxis, etaAxis, v0PtAxis}); + // K0S registry.add("data/PC/JetPtK0SPtMass", "JetPtK0SPtMass", HistType::kTH3D, {jetPtAxis, v0PtAxis, k0SMassAxis}); + registry.add("data/PC/JetPtEtaK0SPt", "JetPtEtaK0SPt", HistType::kTH3D, {jetPtAxis, etaAxis, v0PtAxis}); registry.add("data/PC/K0SPtEtaPhi", "K0SPtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); registry.add("data/PC/K0SPtCtauMass", "K0SPtCtauMass", HistType::kTH3D, {v0PtAxis, v0CtauAxis, k0SMassAxis}); registry.add("data/PC/K0SPtRadiusCosPA", "K0SPtRadiusCosPA", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, v0CosPAAxis}); registry.add("data/PC/K0SPtDCAposneg", "K0SPtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}); registry.add("data/PC/K0SPtDCAd", "K0SPtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}); + // Lambda + registry.add("data/PC/JetPtLambdaPtMass", "JetPtLambdaPtMass", HistType::kTH3D, {jetPtAxis, v0PtAxis, lambdaMassAxis}); + registry.add("data/PC/JetPtEtaLambdaPt", "JetPtEtaLambdaPt", HistType::kTH3D, {jetPtAxis, etaAxis, v0PtAxis}); + registry.add("data/PC/LambdaPtEtaPhi", "LambdaPtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); + registry.add("data/PC/LambdaPtCtauMass", "LambdaPtCtauMass", HistType::kTH3D, {v0PtAxis, v0CtauAxis, lambdaMassAxis}); + registry.add("data/PC/LambdaPtRadiusCosPA", "LambdaPtRadiusCosPA", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("data/PC/LambdaPtDCAposneg", "LambdaPtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("data/PC/LambdaPtDCAd", "LambdaPtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}); + + // AntiLambda + registry.add("data/PC/JetPtAntiLambdaPtMass", "JetPtAntiLambdaPtMass", HistType::kTH3D, {jetPtAxis, v0PtAxis, lambdaMassAxis}); + registry.add("data/PC/JetPtEtaAntiLambdaPt", "JetPtEtaAntiLambdaPt", HistType::kTH3D, {jetPtAxis, etaAxis, v0PtAxis}); + registry.add("data/PC/AntiLambdaPtEtaPhi", "AntiLambdaPtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); + registry.add("data/PC/AntiLambdaPtCtauMass", "AntiLambdaPtCtauMass", HistType::kTH3D, {v0PtAxis, v0CtauAxis, lambdaMassAxis}); + registry.add("data/PC/AntiLambdaPtRadiusCosPA", "AntiLambdaPtRadiusCosPA", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, v0CosPAAxis}); + registry.add("data/PC/AntiLambdaPtDCAposneg", "AntiLambdaPtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}); + registry.add("data/PC/AntiLambdaPtDCAd", "AntiLambdaPtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}); + registry.add("data/PC/nV0sConePtEta", "nV0sConePtEta", HistType::kTH3D, {v0Count, jetPtAxis, etaAxis}); registry.add("data/PC/ConePtEtaPhi", "ConePtEtaPhi", HistType::kTH3D, {jetPtAxis, etaAxis, phiAxis}); registry.add("data/PC/JetPtEtaConePt", "JetPtEtaConePt", HistType::kTH3D, {jetPtAxis, etaAxis, jetPtAxis}); @@ -872,99 +988,123 @@ struct JetFragmentation { if (doprocessMcV0PerpCone) { registry.add("mcd/V0/nV0sEvent", "NV0s in event", HistType::kTH1D, {v0Count}); - registry.add("mcd/V0/nV0sEventWeighted", "NV0s in event weighted", HistType::kTH1D, {v0Count}); - - registry.add("mcd/PC/jetPtEtaFakeV0Pt", "JetPtEtaFakeV0Pt", HistType::kTH3D, {detJetPtAxis, etaAxis, v0PtAxis}); - registry.add("mcd/PC/fakeV0PtEtaPhi", "fakeV0PtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); - registry.add("mcd/PC/fakeV0PtCtau", "fakeV0PtCtau", HistType::kTHnSparseD, {v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); - registry.add("mcd/PC/fakeV0PtMass", "fakeV0PtMass", HistType::kTHnSparseD, {v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("mcd/PC/fakeV0PtRadiusCosPA", "fakeV0PtRadiusCosPA", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, v0CosPAAxis}); - registry.add("mcd/PC/fakeV0PtDCAposneg", "fakeV0PtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("mcd/PC/fakeV0PtDCAd", "fakeV0PtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}); - registry.add("mcd/PC/jetPtEtaMatchedV0Pt", "JetPtEtaMatchedV0Pt", HistType::kTH3D, {detJetPtAxis, etaAxis, v0PtAxis}); - - registry.add("mcd/PC/matchedV0PtEtaPhi", "matchedV0PtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); - registry.add("mcd/PC/matchedV0PtCtau", "matchedV0PtCtau", HistType::kTHnSparseD, {v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); - registry.add("mcd/PC/matchedV0PtMass", "matchedV0PtMass", HistType::kTHnSparseD, {v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("mcd/PC/matchedV0PtRadiusCosPA", "matchedV0PtRadiusCosPA", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, v0CosPAAxis}); - registry.add("mcd/PC/matchedV0PtDCAposneg", "matchedV0PtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("mcd/PC/matchedV0PtDCAd", "matchedV0PtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}); - - registry.add("mcd/PC/matchedJetPtK0SPtMass", "matchedJetPtK0SPtMass", HistType::kTH3D, {detJetPtAxis, v0PtAxis, k0SMassAxis}); - registry.add("mcd/PC/matchedJetPtLambda0PtMass", "matchedJetPtLambda0PtMass", HistType::kTH3D, {detJetPtAxis, v0PtAxis, lambdaMassAxis}); - registry.add("mcd/PC/matchedJetPtAntiLambda0PtMass", "matchedJetPtAntiLambda0PtMass", HistType::kTH3D, {detJetPtAxis, v0PtAxis, lambdaMassAxis}); - registry.add("mcd/PC/matchednV0sConePtEta", "matchednV0sConePtEta", HistType::kTH3D, {v0Count, detJetPtAxis, etaAxis}); - registry.add("mcd/PC/matchedConePtEtaPhi", "matchedConePtEtaPhi", HistType::kTH3D, {detJetPtAxis, etaAxis, phiAxis}); - registry.add("mcd/PC/matchedJetPtEtaConePt", "matchedJetPtEtaConePt", HistType::kTH3D, {detJetPtAxis, etaAxis, detJetPtAxis}); - - registry.add("mcd/PC/fakenV0sConePtEta", "fakenV0sConePtEta", HistType::kTH3D, {v0Count, detJetPtAxis, etaAxis}); - registry.add("mcd/PC/fakeConePtEtaPhi", "fakeConePtEtaPhi", HistType::kTH3D, {detJetPtAxis, etaAxis, phiAxis}); - registry.add("mcd/PC/fakeJetPtEtaConePt", "fakeJetPtEtaConePt", HistType::kTH3D, {detJetPtAxis, etaAxis, detJetPtAxis}); + registry.add("mcd/V0/nV0sEventWeighted", "NV0s in event weighted", HistType::kTH1D, {v0Count}, true); + + // PerpCone - Fake V0s in MCD jets + registry.add("mcd/PC/jetPtEtaFakeV0Pt", "JetPtEtaFakeV0Pt", HistType::kTH3D, {detJetPtAxis, etaAxis, v0PtAxis}, true); + registry.add("mcd/PC/fakeV0PtEtaPhi", "fakeV0PtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("mcd/PC/fakeV0PtCtau", "fakeV0PtCtau", HistType::kTHnSparseD, {v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}, true); + registry.add("mcd/PC/fakeV0PtMass", "fakeV0PtMass", HistType::kTHnSparseD, {v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("mcd/PC/fakeV0PtRadiusCosPA", "fakeV0PtRadiusCosPA", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("mcd/PC/fakeV0PtDCAposneg", "fakeV0PtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("mcd/PC/fakeV0PtDCAd", "fakeV0PtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}, true); + // PerpCone - Fake V0s in cone from MCD jets + registry.add("mcd/PC/fakenV0sConePtEta", "fakenV0sConePtEta", HistType::kTH3D, {v0Count, detJetPtAxis, etaAxis}, true); + registry.add("mcd/PC/fakeConePtEtaPhi", "fakeConePtEtaPhi", HistType::kTH3D, {detJetPtAxis, etaAxis, phiAxis}, true); + registry.add("mcd/PC/fakeJetPtEtaConePt", "fakeJetPtEtaConePt", HistType::kTH3D, {detJetPtAxis, etaAxis, detJetPtAxis}, true); + // PerpCone - Matched V0s in MCD jets + registry.add("mcd/PC/jetPtEtaMatchedV0Pt", "JetPtEtaMatchedV0Pt", HistType::kTH3D, {detJetPtAxis, etaAxis, v0PtAxis}, true); + registry.add("mcd/PC/matchedV0PtEtaPhi", "matchedV0PtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("mcd/PC/matchedV0PtCtau", "matchedV0PtCtau", HistType::kTHnSparseD, {v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}, true); + registry.add("mcd/PC/matchedV0PtMass", "matchedV0PtMass", HistType::kTHnSparseD, {v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("mcd/PC/matchedV0PtRadiusCosPA", "matchedV0PtRadiusCosPA", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("mcd/PC/matchedV0PtDCAposneg", "matchedV0PtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("mcd/PC/matchedV0PtDCAd", "matchedV0PtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}, true); + // PerpCone - Matched V0s in cone from MCD jets + registry.add("mcd/PC/matchednV0sConePtEta", "matchednV0sConePtEta", HistType::kTH3D, {v0Count, detJetPtAxis, etaAxis}, true); + registry.add("mcd/PC/matchedConePtEtaPhi", "matchedConePtEtaPhi", HistType::kTH3D, {detJetPtAxis, etaAxis, phiAxis}, true); + registry.add("mcd/PC/matchedJetPtEtaConePt", "matchedJetPtEtaConePt", HistType::kTH3D, {detJetPtAxis, etaAxis, detJetPtAxis}, true); + // PerpCone - Matched K0S in MCD jets + registry.add("mcd/PC/matchedJetPtK0SPtMass", "matchedJetPtK0SPtMass", HistType::kTH3D, {detJetPtAxis, v0PtAxis, k0SMassAxis}, true); + // PerpCone - Matched Lambda in MCD jets + registry.add("mcd/PC/matchedJetPtLambdaPtMass", "matchedJetPtLambdaPtMass", HistType::kTH3D, {detJetPtAxis, v0PtAxis, lambdaMassAxis}, true); + // PerpCone - Matched AntiLambda in MCD jets + registry.add("mcd/PC/matchedJetPtAntiLambdaPtMass", "matchedJetPtAntiLambdaPtMass", HistType::kTH3D, {detJetPtAxis, v0PtAxis, lambdaMassAxis}, true); + // PerpCone - Fake V0s in Matched jets + registry.add("matching/PC/jetPtEtaFakeV0Pt", "JetPtEtaFakeV0Pt", HistType::kTH3D, {detJetPtAxis, etaAxis, v0PtAxis}, true); + registry.add("matching/PC/jetsPtFakeV0Pt", "jetsPtFakeV0Pt", HistType::kTH3D, {partJetPtAxis, detJetPtAxis, v0PtAxis}, true); + registry.add("matching/PC/fakeV0PtEtaPhi", "fakeV0PtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("matching/PC/fakeV0PtCtau", "fakeV0PtCtau", HistType::kTHnSparseD, {v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}, true); + registry.add("matching/PC/fakeV0PtMass", "fakeV0PtMass", HistType::kTHnSparseD, {v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/PC/fakeV0PtRadiusCosPA", "fakeV0PtRadiusCosPA", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("matching/PC/fakeV0PtDCAposneg", "fakeV0PtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("matching/PC/fakeV0PtDCAd", "fakeV0PtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}, true); + // PerpCone - Fake V0s in cone from Matched jets + registry.add("matching/PC/fakenV0sConePtEta", "fakenV0sConePtEta", HistType::kTH3D, {v0Count, detJetPtAxis, etaAxis}, true); + registry.add("matching/PC/fakeConePtEtaPhi", "fakeConePtEtaPhi", HistType::kTH3D, {detJetPtAxis, etaAxis, phiAxis}, true); + registry.add("matching/PC/fakeJetPtEtaConePt", "fakeJetPtEtaConePt", HistType::kTH3D, {detJetPtAxis, etaAxis, detJetPtAxis}, true); + registry.add("matching/PC/fakeJetsPtEtaConePt", "fakeJetsPtEtaConePt", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, etaAxis, detJetPtAxis}, true); + // PerpCone - Matched V0s in Matched jets + registry.add("matching/PC/jetPtEtaMatchedV0Pt", "jetPtEtaMatchedV0Pt", HistType::kTH3D, {detJetPtAxis, etaAxis, v0PtAxis}, true); + registry.add("matching/PC/jetsPtMatchedV0Pt", "jetsPtMatchedV0Pt", HistType::kTH3D, {partJetPtAxis, detJetPtAxis, v0PtAxis}, true); + registry.add("matching/PC/matchedV0PtEtaPhi", "matchedV0PtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}, true); + registry.add("matching/PC/matchedV0PtCtau", "matchedV0PtCtau", HistType::kTHnSparseD, {v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}, true); + registry.add("matching/PC/matchedV0PtMass", "matchedV0PtMass", HistType::kTHnSparseD, {v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}, true); + registry.add("matching/PC/matchedV0PtRadiusCosPA", "matchedV0PtRadiusCosPA", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, v0CosPAAxis}, true); + registry.add("matching/PC/matchedV0PtDCAposneg", "matchedV0PtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}, true); + registry.add("matching/PC/matchedV0PtDCAd", "matchedV0PtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}, true); + // PerpCone - Matched V0s in cone from Matched jets + registry.add("matching/PC/matchednV0sConePtEta", "matchednV0sConePtEta", HistType::kTH3D, {v0Count, detJetPtAxis, etaAxis}, true); + registry.add("matching/PC/matchedConePtEtaPhi", "matchedConePtEtaPhi", HistType::kTH3D, {detJetPtAxis, etaAxis, phiAxis}, true); + registry.add("matching/PC/matchedJetPtEtaConePt", "matchedJetPtEtaConePt", HistType::kTH3D, {detJetPtAxis, etaAxis, detJetPtAxis}, true); + registry.add("matching/PC/matchedJetsPtEtaConePt", "matchedJetsPtEtaConePt", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, etaAxis, detJetPtAxis}, true); + // PerpCone - Matched K0S in Matched jets + registry.add("matching/PC/matchedJetPtK0SPtMass", "matchedJetPtK0SPtMass", HistType::kTH3D, {detJetPtAxis, v0PtAxis, k0SMassAxis}, true); + registry.add("matching/PC/matchedJetsPtK0SPtMass", "matchedJetsPtK0SPtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis}, true); + // PerpCone - Matched Lambda in Matched jets + registry.add("matching/PC/matchedJetPtLambdaPtMass", "matchedJetPtLambdaPtMass", HistType::kTH3D, {detJetPtAxis, v0PtAxis, lambdaMassAxis}, true); + registry.add("matching/PC/matchedJetsPtLambdaPtMass", "matchedJetsPtLambdaPtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}, true); + // PerpCone - Matched AntiLambda in Matched jets + registry.add("matching/PC/matchedJetPtAntiLambdaPtMass", "matchedJetPtAntiLambdaPtMass", HistType::kTH3D, {detJetPtAxis, v0PtAxis, lambdaMassAxis}, true); + registry.add("matching/PC/matchedJetsPtAntiLambdaPtMass", "matchedJetsPtAntiLambdaPtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}, true); } // doprocessMcV0PerpCone - - if (doprocessMcV0MatchedPerpCone) { - registry.add("matching/PC/jetPtEtaFakeV0Pt", "JetPtEtaFakeV0Pt", HistType::kTH3D, {detJetPtAxis, etaAxis, v0PtAxis}); - registry.add("matching/PC/jetsPtFakeV0Pt", "jetsPtFakeV0Pt", HistType::kTH3D, {partJetPtAxis, detJetPtAxis, v0PtAxis}); - registry.add("matching/PC/fakeV0PtEtaPhi", "fakeV0PtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); - registry.add("matching/PC/fakeV0PtCtau", "fakeV0PtCtau", HistType::kTHnSparseD, {v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); - registry.add("matching/PC/fakeV0PtMass", "fakeV0PtMass", HistType::kTHnSparseD, {v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/PC/fakeV0PtRadiusCosPA", "fakeV0PtRadiusCosPA", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, v0CosPAAxis}); - registry.add("matching/PC/fakeV0PtDCAposneg", "fakeV0PtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("matching/PC/fakeV0PtDCAd", "fakeV0PtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}); - - registry.add("matching/PC/jetPtEtaMatchedV0Pt", "jetPtEtaMatchedV0Pt", HistType::kTH3D, {detJetPtAxis, etaAxis, v0PtAxis}); - registry.add("matching/PC/jetsPtMatchedV0Pt", "jetsPtMatchedV0Pt", HistType::kTH3D, {partJetPtAxis, detJetPtAxis, v0PtAxis}); - registry.add("matching/PC/matchedV0PtEtaPhi", "matchedV0PtEtaPhi", HistType::kTH3D, {v0PtAxis, v0EtaAxis, v0PhiAxis}); - registry.add("matching/PC/matchedV0PtCtau", "matchedV0PtCtau", HistType::kTHnSparseD, {v0PtAxis, v0CtauAxis, v0CtauAxis, v0CtauAxis}); - registry.add("matching/PC/matchedV0PtMass", "matchedV0PtMass", HistType::kTHnSparseD, {v0PtAxis, k0SMassAxis, lambdaMassAxis, lambdaMassAxis}); - registry.add("matching/PC/matchedV0PtRadiusCosPA", "matchedV0PtRadiusCosPA", HistType::kTH3D, {v0PtAxis, v0RadiusAxis, v0CosPAAxis}); - registry.add("matching/PC/matchedV0PtDCAposneg", "matchedV0PtDCAposneg", HistType::kTH3D, {v0PtAxis, v0DCApAxis, v0DCAnAxis}); - registry.add("matching/PC/matchedV0PtDCAd", "matchedV0PtDCAd", HistType::kTH2D, {v0PtAxis, v0DCAdAxis}); - - registry.add("matching/PC/matchedJetPtK0SPtMass", "matchedJetPtK0SPtMass", HistType::kTH3D, {detJetPtAxis, v0PtAxis, k0SMassAxis}); - registry.add("matching/PC/matchedJetsPtK0SPtMass", "matchedJetsPtK0SPtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0PtAxis, k0SMassAxis}); - registry.add("matching/PC/matchedJetPtLambda0PtMass", "matchedJetPtLambda0PtMass", HistType::kTH3D, {detJetPtAxis, v0PtAxis, lambdaMassAxis}); - registry.add("matching/PC/matchedJetsPtLambda0PtMass", "matchedJetsPtLambda0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}); - registry.add("matching/PC/matchedJetPtAntiLambda0PtMass", "matchedJetPtAntiLambda0PtMass", HistType::kTH3D, {detJetPtAxis, v0PtAxis, lambdaMassAxis}); - registry.add("matching/PC/matchedJetsPtAntiLambda0PtMass", "matchedJetsPtAntiLambda0PtMass", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, v0PtAxis, lambdaMassAxis}); - - registry.add("matching/PC/matchednV0sConePtEta", "matchednV0sConePtEta", HistType::kTH3D, {v0Count, detJetPtAxis, etaAxis}); - registry.add("matching/PC/matchedConePtEtaPhi", "matchedConePtEtaPhi", HistType::kTH3D, {detJetPtAxis, etaAxis, phiAxis}); - registry.add("matching/PC/matchedJetPtEtaConePt", "matchedJetPtEtaConePt", HistType::kTH3D, {detJetPtAxis, etaAxis, detJetPtAxis}); - registry.add("matching/PC/matchedJetsPtEtaConePt", "matchedJetsPtEtaConePt", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, etaAxis, detJetPtAxis}); - - registry.add("matching/PC/fakenV0sConePtEta", "fakenV0sConePtEta", HistType::kTH3D, {v0Count, detJetPtAxis, etaAxis}); - registry.add("matching/PC/fakeConePtEtaPhi", "fakeConePtEtaPhi", HistType::kTH3D, {detJetPtAxis, etaAxis, phiAxis}); - registry.add("matching/PC/fakeJetPtEtaConePt", "fakeJetPtEtaConePt", HistType::kTH3D, {detJetPtAxis, etaAxis, detJetPtAxis}); - registry.add("matching/PC/fakeJetsPtEtaConePt", "fakeJetsPtEtaConePt", HistType::kTHnSparseD, {partJetPtAxis, detJetPtAxis, etaAxis, detJetPtAxis}); - } // doprocessMcV0MatchedPerpCone } // init - // TODO: This is filled with dummy values for now - // Should be made to return purity for a V0 based on species and pt + // --------------------------------------------------- + // Implementation of background subtraction at runtime + // --------------------------------------------------- + + // Return probability for a V0 to be signal (or background) template - float getV0Purity(V const& v0) + float getV0SignalProb(V const& v0) { + // TODO: This is filled with dummy values for now + // Assumes a V0 can only be of one type! + // Should be made to return purity for a V0 based on species and pt if (v0.isK0SCandidate()) { + // return 1.; return 0.5; } if (v0.isLambdaCandidate()) { + // return 1.; return 0.5; } if (v0.isAntiLambdaCandidate()) { + // return 1.; return 0.5; } return 0.; // Background } - // Returns a std::vector of weights for a particle + // Return a 2-length std::vector of probabilities for a particle to correspond to signal or background + template + std::vector getV0SignalProbVector2Classes(V const& v0) + { + // 0: bkg, 1: signal + if (v0.isRejectedCandidate()) + return {1., 0.}; + + double purity = getV0SignalProb(v0); + return {1. - purity, purity}; + } + // Return a 4-length std::vector of probabilities for a particle to correspond to signal types template - std::vector getV0SignalWeight(V const& v0) + std::vector getV0SignalProbVector4Classes(V const& v0) { // 0: bkg, 1: K0S, 2: Lambda, 3: AntiLambda if (v0.isRejectedCandidate()) return {1., 0., 0., 0.}; - double purity = getV0Purity(v0); + double purity = getV0SignalProb(v0); if (v0.isK0SCandidate()) return {1. - purity, purity, 0., 0.}; if (v0.isLambdaCandidate()) @@ -973,47 +1113,64 @@ struct JetFragmentation { return {1. - purity, 0., 0., purity}; return {1., 0., 0., 0.}; - } // getV0SignalWeight - // Converts state from uint32_t to std::vector containing the particle classes for that weight + } + // Convert state from uint32_t to std::vector containing the particle classes for that weight std::vector convertState(uint32_t state, int nParticles, int nClasses = 4) { + // TODO: Should we cast these to uint32_t? std::vector v(nParticles, nClasses); - int nStates = std::pow(nClasses, nParticles); + int nStates = std::round(std::pow(static_cast(nClasses), static_cast(nParticles))); int nBitsPerParticle = std::round(std::log2(nClasses)); int nBitsPerInt = sizeof(uint32_t) * 8; - // Check if the input configuration is parseable + if (nClasses <= 0) { + LOGF(warning, "Number of classes (%d) must be greater than 0", nClasses); + return v; + } if ((nClasses & (nClasses - 1)) != 0) { // It's likely possible to make this work for non-power of 2 classes, but it's not needed and therefore not implemented LOGF(warning, "Number of classes (%d) must be a power of 2", nClasses); return v; } + // Check for overflow in number of states if (nStates <= 0) { LOGF(warning, "Illegal number of states (%d)! %s", nStates, (nStates == 0) ? "" : "Max = 2^31"); return v; } + // Check if we have enough bits to store the state if (nParticles * nBitsPerParticle > nBitsPerInt) { LOGF(warning, "Number of bits required to parse the state (%d * %d = %d) is too large for %d bits per int!", nParticles, nBitsPerParticle, nParticles * nBitsPerParticle, nBitsPerInt); return v; } + // Check if the state is valid. This should never be triggered if (state >= static_cast(nStates)) { LOGF(warning, "Illegal state! State %d >= %d", state, nStates); return v; } for (int ip = 0; ip < nParticles; ip++) { - double value = 0; + int value = 0; int startBit = ip * nBitsPerParticle; for (int ib = 0; ib < nBitsPerParticle; ib++) { - int bit = startBit + ib; + uint32_t bit = startBit + ib; int bitVal = ((state & (1 << bit)) > 0); - value += bitVal * std::pow(2, ib); - } + value += bitVal * std::round(std::pow(2., static_cast(ib))); + } // loop over bits for particle ip v[ip] = value; } return v; - } // convertState - // Returns the corrected values for z and ptjet for a given state + } + // Return the probability associated with a given outcome + double stateWeight(std::vector state, std::vector> weights) + { + double w = 1.; + for (uint32_t ip = 0; ip < state.size(); ip++) { + w *= weights[ip][state[ip]]; + } + return w; + } + // Return the corrected values for z and ptjet for a given state + // Scale values by the fraction of jet momentum carried by removed V0s std::vector correctedValues(std::vector state, std::vector values) { // Assumes values = (z1, z2, ..., zn, ptjet) @@ -1038,15 +1195,55 @@ struct JetFragmentation { v[nParticles] = values[nParticles] * (1 - r); return v; } - double stateWeight(std::vector state, std::vector> weights) + // Return the corrected values for z and ptjet for a given state + // Take into account tracks that would have been included in the jet regardless of the V0s + template + std::vector correctedValuesPlusTracks(std::vector state, V const& jet) { - double w = 1.; - for (int ip = 0; static_cast(ip) < state.size(); ip++) { - w *= weights[ip][state[ip]]; + int ip = 0; + double ptToSubtract = 0., ptToAdd = 0.; + + for (const auto& v0 : jet.template candidates_as()) { + if (v0.isRejectedCandidate()) + continue; + + // Background + if (state[ip] == 0) { + ptToSubtract += v0.pt(); + + // TODO: This is okay in pt-scheme jets, but should add 4-momentum for E-scheme + auto negTrack = v0.template negTrack_as(); + if (jetderiveddatautilities::selectTrack(negTrack, trackSelection) && jetutilities::deltaR(jet, negTrack) < jet.r() * 1e-2) + ptToAdd += negTrack.pt(); + + auto posTrack = v0.template posTrack_as(); + if (jetderiveddatautilities::selectTrack(posTrack, trackSelection) && jetutilities::deltaR(jet, negTrack) < jet.r() * 1e-2) + ptToAdd += posTrack.pt(); + } + ip++; } - return w; + + double ptjet = jet.pt() - ptToSubtract + ptToAdd; + std::vector values; + + ip = 0; + for (const auto& v0 : jet.template candidates_as()) { + if (v0.isRejectedCandidate()) + continue; + + if (state[ip] == 0) // Background + values.push_back(v0.pt() / jet.pt()); + else + values.push_back(v0.pt() / ptjet); + ip++; + } + values.push_back(ptjet); + return values; } + // --------------------------------------------------- + // Helper functions + // --------------------------------------------------- template bool jetContainsV0s(JetType const& jet) { @@ -1055,12 +1252,12 @@ struct JetFragmentation { template bool v0sAreMatched(T const& v0, U const& particle, V const& /*tracks*/) { + // FIXME: Should this check whether V0 is selected as correct species? Probably! auto negId = v0.template negTrack_as().mcParticleId(); auto posId = v0.template posTrack_as().mcParticleId(); auto daughters = particle.daughtersIds(); return ((negId == daughters[0] && posId == daughters[1]) || (posId == daughters[0] && negId == daughters[1])); } - template double getReflectedMass(V0Type const& v0, bool isLambda) { @@ -1077,135 +1274,39 @@ struct JetFragmentation { double psquared = v0.p() * v0.p(); return std::sqrt(Esquared - psquared); } - - template - double getFrag(Jet const& jet, Constituent const& constituent) - { - double chargeFrag = -1.; - chargeFrag = constituent.pt() / jet.pt(); - return chargeFrag; - } template - double getTheta(Jet const& jet, Constituent const& constituent) + double getMomFrac(Jet const& jet, Constituent const& constituent) { - double theta = -1.; - theta = jetutilities::deltaR(jet, constituent); - return theta; + if (jet.pt() < 1e-5) + return -1.; + else + return constituent.pt() / jet.pt(); } template double getMomProj(Jet const& jet, Constituent const& constituent) { - double trackProj = -1.; - trackProj = constituent.px() * jet.px() + constituent.py() * jet.py() + constituent.pz() * jet.pz(); + if (jet.p() < 1e-5) + return -1.; + + double trackProj = constituent.px() * jet.px() + constituent.py() * jet.py() + constituent.pz() * jet.pz(); trackProj /= (jet.p() * jet.p()); return trackProj; } - template - double getXi(Jet const& jet, Constituent const& constituent) - { - double xi = -1., trackProj = -1.; - trackProj = getMomProj(jet, constituent); - if (trackProj > 0) { - xi = std::log(1. / trackProj); - } - return xi; - } - - // TODO: Can probably be made simpler/shorter by using V0MCLabels - template // Not used for V0 jets - void fillMcMatchedV0Histograms(CollisionType const& collision, V0Type const& v0, trackType const&, particleType const&, double weight = 1.) - { - auto negTrack = v0.template negTrack_as(); - auto posTrack = v0.template posTrack_as(); - if (!negTrack.has_mcParticle() || !posTrack.has_mcParticle()) { - return; - } - auto mcNegTrack = negTrack.template mcParticle_as(); - auto mcPosTrack = posTrack.template mcParticle_as(); - if (!mcNegTrack.has_mothers() || !mcPosTrack.has_mothers()) { - return; - } - double ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0; - double ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0Bar; - double ctauK0s = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassK0Short; - // Can tracks have multiple mothers? - for (const auto& particleMotherOfNeg : mcNegTrack.template mothers_as()) { - for (const auto& particleMotherOfPos : mcPosTrack.template mothers_as()) { - if (particleMotherOfNeg.isPhysicalPrimary() && particleMotherOfNeg == particleMotherOfPos) { - double ptPartV0 = particleMotherOfNeg.pt(); - int pdg = particleMotherOfNeg.pdgCode(); - registry.fill(HIST("matching/V0/V0PartPtDetPt"), ptPartV0, v0.pt(), weight); - registry.fill(HIST("matching/V0/V0PartPtRatioPtRelDiffPt"), ptPartV0, v0.pt() / ptPartV0, (v0.pt() - ptPartV0) / ptPartV0, weight); - - if (std::abs(pdg) == 310) { // K0S - registry.fill(HIST("matching/V0/K0SPtEtaPhi"), ptPartV0, v0.pt(), v0.eta(), v0.phi(), weight); - registry.fill(HIST("matching/V0/K0SPtCtauMass"), ptPartV0, v0.pt(), ctauK0s, v0.mK0Short(), weight); - registry.fill(HIST("matching/V0/K0SPtRadiusCosPA"), ptPartV0, v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); - registry.fill(HIST("matching/V0/K0SPtDCAposneg"), ptPartV0, v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("matching/V0/K0SPtDCAd"), ptPartV0, v0.pt(), v0.dcaV0daughters(), weight); - registry.fill(HIST("matching/V0/K0SPtMass"), ptPartV0, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - } else if (pdg == 3122) { // Lambda - registry.fill(HIST("matching/V0/LambdaPtEtaPhi"), ptPartV0, v0.pt(), v0.eta(), v0.phi(), weight); - registry.fill(HIST("matching/V0/LambdaPtCtauMass"), ptPartV0, v0.pt(), ctauLambda, v0.mLambda(), weight); - registry.fill(HIST("matching/V0/LambdaPtRadiusCosPA"), ptPartV0, v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); - registry.fill(HIST("matching/V0/LambdaPtDCAposneg"), ptPartV0, v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("matching/V0/LambdaPtDCAd"), ptPartV0, v0.pt(), v0.dcaV0daughters(), weight); - registry.fill(HIST("matching/V0/LambdaPtMass"), ptPartV0, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - - // Reflection - double reflectedMass = getReflectedMass(v0, true); - registry.fill(HIST("matching/V0/Lambda0Reflection"), ptPartV0, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), reflectedMass, weight); - } else if (pdg == -3122) { // AntiLambda - registry.fill(HIST("matching/V0/antiLambdaPtEtaPhi"), ptPartV0, v0.pt(), v0.eta(), v0.phi(), weight); - registry.fill(HIST("matching/V0/antiLambdaPtCtauMass"), ptPartV0, v0.pt(), ctauAntiLambda, v0.mAntiLambda(), weight); - registry.fill(HIST("matching/V0/antiLambdaPtRadiusCosPA"), ptPartV0, v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); - registry.fill(HIST("matching/V0/antiLambdaPtDCAposneg"), ptPartV0, v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("matching/V0/antiLambdaPtDCAd"), ptPartV0, v0.pt(), v0.dcaV0daughters(), weight); - registry.fill(HIST("matching/V0/antiLambdaPtMass"), ptPartV0, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - - // Reflection - double reflectedMass = getReflectedMass(v0, false); - registry.fill(HIST("matching/V0/antiLambda0Reflection"), ptPartV0, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), reflectedMass, weight); - } - } // if mothers match - } // for mothers of pos - } // for mothers of neg - } - - template - void fillDataJetHistograms(T const& jet, double weight = 1.) - { - registry.fill(HIST("data/jets/jetPtEtaPhi"), jet.pt(), jet.eta(), jet.phi(), weight); - } - void fillDataJetHistogramsWithWeights(double jetpt, double jeteta, double jetphi, double weight = 1.) - { - registry.fill(HIST("data/jets/weighted/jetPtEtaPhi"), jetpt, jeteta, jetphi, weight); - } - template // Not used for V0 jets - void fillDataFragHistograms(T const& jet, double weight = 1.) - { - for (const auto& track : jet.template tracks_as()) { - double chargeFrag = -1., trackProj = -1., xi = -1., theta = -1.; - chargeFrag = getFrag(jet, track); - trackProj = getMomProj(jet, track); - theta = getTheta(jet, track); - xi = getXi(jet, track); - - registry.fill(HIST("data/jets/jetPtTrackPt"), jet.pt(), track.pt(), weight); - registry.fill(HIST("data/jets/jetTrackPtEtaPhi"), track.pt(), track.eta(), track.phi(), weight); - registry.fill(HIST("data/jets/jetPtFrag"), jet.pt(), chargeFrag, weight); - registry.fill(HIST("data/jets/jetPtTrackProj"), jet.pt(), trackProj, weight); - registry.fill(HIST("data/jets/jetPtXi"), jet.pt(), xi, weight); - registry.fill(HIST("data/jets/jetPtTheta"), jet.pt(), theta, weight); - registry.fill(HIST("data/jets/jetPtXiTheta"), jet.pt(), xi, theta, weight); - registry.fill(HIST("data/jets/jetPtZTheta"), jet.pt(), trackProj, theta, weight); - } - } + // --------------------------------------------------- + // Histogram filling functions + // --------------------------------------------------- + // Data - Counts template - void fillDataV0Histograms(CollisionType const& collision, V0Type const& V0s, double weight = 1.) + void fillDataV0Histograms(CollisionType const& collision, V0Type const& V0s) { + // Fill histograms unweighted. Hists will be filled with V0 counts + float nV0s = 0; for (const auto& v0 : V0s) { + if (v0.isRejectedCandidate()) + continue; + + nV0s += 1; double ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0; double ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0Bar; double ctauK0s = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassK0Short; @@ -1214,47 +1315,70 @@ struct JetFragmentation { double massRatio = v0.mAntiLambda() / v0.mLambda(); double massRelDiff = (v0.mLambda() - v0.mAntiLambda()) / v0.mLambda(); - registry.fill(HIST("data/V0/V0PtEtaPhi"), v0.pt(), v0.eta(), v0.phi(), weight); - registry.fill(HIST("data/V0/V0PtCtau"), v0.pt(), ctauK0s, ctauLambda, ctauAntiLambda, weight); - registry.fill(HIST("data/V0/V0PtMass"), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("data/V0/V0PtMassWide"), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("data/V0/V0PtLambdaMasses"), v0.pt(), massDiff, massRatio, massRelDiff, weight); - registry.fill(HIST("data/V0/V0PtRadiusCosPA"), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); - registry.fill(HIST("data/V0/V0PtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("data/V0/V0PtDCAd"), v0.pt(), v0.dcaV0daughters(), weight); + registry.fill(HIST("data/V0/V0PtEtaPhi"), v0.pt(), v0.eta(), v0.phi()); + registry.fill(HIST("data/V0/V0PtCtau"), v0.pt(), ctauK0s, ctauLambda, ctauAntiLambda); + registry.fill(HIST("data/V0/V0PtMass"), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda()); + registry.fill(HIST("data/V0/V0PtMassWide"), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda()); + registry.fill(HIST("data/V0/V0PtLambdaMasses"), v0.pt(), massDiff, massRatio, massRelDiff); + registry.fill(HIST("data/V0/V0PtRadiusCosPA"), v0.pt(), v0.v0radius(), v0.v0cosPA()); + registry.fill(HIST("data/V0/V0PtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv()); + registry.fill(HIST("data/V0/V0PtDCAd"), v0.pt(), v0.dcaV0daughters()); - registry.fill(HIST("data/V0/V0CutVariation"), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), v0.v0radius(), ctauK0s, v0.v0cosPA(), std::abs(v0.dcapostopv()), std::abs(v0.dcanegtopv()), v0.dcaV0daughters(), weight); + registry.fill(HIST("data/V0/V0CutVariation"), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), v0.v0radius(), ctauK0s, v0.v0cosPA(), std::abs(v0.dcapostopv()), std::abs(v0.dcanegtopv()), v0.dcaV0daughters()); + if (v0.isK0SCandidate()) { + registry.fill(HIST("data/V0/K0SPtEtaPhi"), v0.pt(), v0.eta(), v0.phi()); + registry.fill(HIST("data/V0/K0SPtRadiusCosPA"), v0.pt(), v0.v0radius(), v0.v0cosPA()); + registry.fill(HIST("data/V0/K0SPtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv()); + registry.fill(HIST("data/V0/K0SPtDCAd"), v0.pt(), v0.dcaV0daughters()); + + registry.fill(HIST("data/V0/K0SPtCtauMass"), v0.pt(), ctauK0s, v0.mK0Short()); + registry.fill(HIST("data/V0/K0SPtRadiusMass"), v0.pt(), v0.v0radius(), v0.mK0Short()); + registry.fill(HIST("data/V0/K0SPtCosPAMass"), v0.pt(), v0.v0cosPA(), v0.mK0Short()); + registry.fill(HIST("data/V0/K0SPtDCAposMass"), v0.pt(), v0.dcapostopv(), v0.mK0Short()); + registry.fill(HIST("data/V0/K0SPtDCAnegMass"), v0.pt(), v0.dcanegtopv(), v0.mK0Short()); + registry.fill(HIST("data/V0/K0SPtDCAdMass"), v0.pt(), v0.dcaV0daughters(), v0.mK0Short()); + } if (v0.isLambdaCandidate()) { - registry.fill(HIST("data/V0/LambdaPtEtaPhi"), v0.pt(), v0.eta(), v0.phi(), weight); - registry.fill(HIST("data/V0/LambdaPtCtauMass"), v0.pt(), ctauLambda, v0.mLambda(), weight); - registry.fill(HIST("data/V0/LambdaPtLambdaMasses"), v0.pt(), massDiff, massRatio, massRelDiff, weight); - registry.fill(HIST("data/V0/LambdaPtRadiusCosPA"), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); - registry.fill(HIST("data/V0/LambdaPtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("data/V0/LambdaPtDCAd"), v0.pt(), v0.dcaV0daughters(), weight); + registry.fill(HIST("data/V0/LambdaPtEtaPhi"), v0.pt(), v0.eta(), v0.phi()); + registry.fill(HIST("data/V0/LambdaPtLambdaMasses"), v0.pt(), massDiff, massRatio, massRelDiff); + registry.fill(HIST("data/V0/LambdaPtRadiusCosPA"), v0.pt(), v0.v0radius(), v0.v0cosPA()); + registry.fill(HIST("data/V0/LambdaPtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv()); + registry.fill(HIST("data/V0/LambdaPtDCAd"), v0.pt(), v0.dcaV0daughters()); + + registry.fill(HIST("data/V0/LambdaPtCtauMass"), v0.pt(), ctauLambda, v0.mLambda()); + registry.fill(HIST("data/V0/LambdaPtRadiusMass"), v0.pt(), v0.v0radius(), v0.mLambda()); + registry.fill(HIST("data/V0/LambdaPtCosPAMass"), v0.pt(), v0.v0cosPA(), v0.mLambda()); + registry.fill(HIST("data/V0/LambdaPtDCAposMass"), v0.pt(), v0.dcapostopv(), v0.mLambda()); + registry.fill(HIST("data/V0/LambdaPtDCAnegMass"), v0.pt(), v0.dcanegtopv(), v0.mLambda()); + registry.fill(HIST("data/V0/LambdaPtDCAdMass"), v0.pt(), v0.dcaV0daughters(), v0.mLambda()); } if (v0.isAntiLambdaCandidate()) { - registry.fill(HIST("data/V0/antiLambdaPtEtaPhi"), v0.pt(), v0.eta(), v0.phi(), weight); - registry.fill(HIST("data/V0/antiLambdaPtCtauMass"), v0.pt(), ctauAntiLambda, v0.mAntiLambda(), weight); - registry.fill(HIST("data/V0/antiLambdaPtLambdaMasses"), v0.pt(), massDiff, massRatio, massRelDiff, weight); - registry.fill(HIST("data/V0/antiLambdaPtRadiusCosPA"), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); - registry.fill(HIST("data/V0/antiLambdaPtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("data/V0/antiLambdaPtDCAd"), v0.pt(), v0.dcaV0daughters(), weight); - } - if (v0.isK0SCandidate()) { - registry.fill(HIST("data/V0/K0SPtEtaPhi"), v0.pt(), v0.eta(), v0.phi(), weight); - registry.fill(HIST("data/V0/K0SPtCtauMass"), v0.pt(), ctauK0s, v0.mK0Short(), weight); - registry.fill(HIST("data/V0/K0SPtRadiusCosPA"), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); - registry.fill(HIST("data/V0/K0SPtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("data/V0/K0SPtDCAd"), v0.pt(), v0.dcaV0daughters(), weight); + registry.fill(HIST("data/V0/AntiLambdaPtEtaPhi"), v0.pt(), v0.eta(), v0.phi()); + registry.fill(HIST("data/V0/AntiLambdaPtLambdaMasses"), v0.pt(), massDiff, massRatio, massRelDiff); + registry.fill(HIST("data/V0/AntiLambdaPtRadiusCosPA"), v0.pt(), v0.v0radius(), v0.v0cosPA()); + registry.fill(HIST("data/V0/AntiLambdaPtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv()); + registry.fill(HIST("data/V0/AntiLambdaPtDCAd"), v0.pt(), v0.dcaV0daughters()); + + registry.fill(HIST("data/V0/AntiLambdaPtCtauMass"), v0.pt(), ctauAntiLambda, v0.mAntiLambda()); + registry.fill(HIST("data/V0/AntiLambdaPtRadiusMass"), v0.pt(), v0.v0radius(), v0.mAntiLambda()); + registry.fill(HIST("data/V0/AntiLambdaPtCosPAMass"), v0.pt(), v0.v0cosPA(), v0.mAntiLambda()); + registry.fill(HIST("data/V0/AntiLambdaPtDCAposMass"), v0.pt(), v0.dcapostopv(), v0.mAntiLambda()); + registry.fill(HIST("data/V0/AntiLambdaPtDCAnegMass"), v0.pt(), v0.dcanegtopv(), v0.mAntiLambda()); + registry.fill(HIST("data/V0/AntiLambdaPtDCAdMass"), v0.pt(), v0.dcaV0daughters(), v0.mAntiLambda()); } } // for v0 + registry.fill(HIST("data/V0/nV0sEventAcc"), nV0s); + } + template + void fillDataJetHistograms(T const& jet) + { + registry.fill(HIST("data/jets/jetPtEtaPhi"), jet.pt(), jet.eta(), jet.phi()); } - template - void fillDataV0FragHistograms(CollisionType const& collision, JetType const& jet, V0Type const& v0, double weight = 1.) + void fillDataV0FragHistograms(CollisionType const& collision, JetType const& jet, V0Type const& v0) { - double trackProj = getMomProj(jet, v0); + double trackProj = getMomFrac(jet, v0); double ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0; double ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0Bar; double ctauK0s = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassK0Short; @@ -1263,87 +1387,279 @@ struct JetFragmentation { double massRatio = v0.mAntiLambda() / v0.mLambda(); double massRelDiff = (v0.mLambda() - v0.mAntiLambda()) / v0.mLambda(); - registry.fill(HIST("data/jets/V0/jetPtV0PtEtaPhi"), jet.pt(), v0.pt(), v0.eta(), v0.phi(), weight); - registry.fill(HIST("data/jets/V0/jetPtV0PtCtau"), jet.pt(), v0.pt(), ctauK0s, ctauLambda, ctauAntiLambda, weight); - registry.fill(HIST("data/jets/V0/jetPtV0PtMass"), jet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("data/jets/V0/jetPtV0PtMassWide"), jet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("data/jets/V0/jetPtV0PtLambdaMasses"), jet.pt(), v0.pt(), massDiff, massRatio, massRelDiff, weight); - registry.fill(HIST("data/jets/V0/jetPtV0PtRadiusCosPA"), jet.pt(), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); - registry.fill(HIST("data/jets/V0/jetPtV0PtDCAposneg"), jet.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("data/jets/V0/jetPtV0PtDCAd"), jet.pt(), v0.pt(), v0.dcaV0daughters(), weight); - - registry.fill(HIST("data/jets/V0/jetPtV0TrackProj"), jet.pt(), trackProj, weight); - registry.fill(HIST("data/jets/V0/jetPtV0TrackProjCtau"), jet.pt(), trackProj, ctauK0s, ctauLambda, ctauAntiLambda, weight); - registry.fill(HIST("data/jets/V0/jetPtV0TrackProjMass"), jet.pt(), trackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("data/jets/V0/jetPtV0TrackProjMassWide"), jet.pt(), trackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("data/jets/V0/jetPtV0TrackProjLambdaMasses"), jet.pt(), trackProj, massDiff, massRatio, massRelDiff, weight); - registry.fill(HIST("data/jets/V0/jetPtV0TrackProjRadiusCosPA"), jet.pt(), trackProj, v0.v0radius(), v0.v0cosPA(), weight); - registry.fill(HIST("data/jets/V0/jetPtV0TrackProjDCAposneg"), jet.pt(), trackProj, v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("data/jets/V0/jetPtV0TrackProjDCAd"), jet.pt(), trackProj, v0.dcaV0daughters(), weight); + registry.fill(HIST("data/jets/V0/jetPtV0PtEtaPhi"), jet.pt(), v0.pt(), v0.eta(), v0.phi()); + registry.fill(HIST("data/jets/V0/jetPtV0PtCtau"), jet.pt(), v0.pt(), ctauK0s, ctauLambda, ctauAntiLambda); + registry.fill(HIST("data/jets/V0/jetPtV0PtMass"), jet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda()); + registry.fill(HIST("data/jets/V0/jetPtV0PtMassWide"), jet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda()); + registry.fill(HIST("data/jets/V0/jetPtV0PtLambdaMasses"), jet.pt(), v0.pt(), massDiff, massRatio, massRelDiff); + registry.fill(HIST("data/jets/V0/jetPtV0PtRadiusCosPA"), jet.pt(), v0.pt(), v0.v0radius(), v0.v0cosPA()); + registry.fill(HIST("data/jets/V0/jetPtV0PtDCAposneg"), jet.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv()); + registry.fill(HIST("data/jets/V0/jetPtV0PtDCAd"), jet.pt(), v0.pt(), v0.dcaV0daughters()); + + registry.fill(HIST("data/jets/V0/jetPtV0TrackProj"), jet.pt(), trackProj); + registry.fill(HIST("data/jets/V0/jetPtV0TrackProjCtau"), jet.pt(), trackProj, ctauK0s, ctauLambda, ctauAntiLambda); + registry.fill(HIST("data/jets/V0/jetPtV0TrackProjMass"), jet.pt(), trackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda()); + registry.fill(HIST("data/jets/V0/jetPtV0TrackProjMassWide"), jet.pt(), trackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda()); + registry.fill(HIST("data/jets/V0/jetPtV0TrackProjLambdaMasses"), jet.pt(), trackProj, massDiff, massRatio, massRelDiff); + registry.fill(HIST("data/jets/V0/jetPtV0TrackProjRadiusCosPA"), jet.pt(), trackProj, v0.v0radius(), v0.v0cosPA()); + registry.fill(HIST("data/jets/V0/jetPtV0TrackProjDCAposneg"), jet.pt(), trackProj, v0.dcapostopv(), v0.dcanegtopv()); + registry.fill(HIST("data/jets/V0/jetPtV0TrackProjDCAd"), jet.pt(), trackProj, v0.dcaV0daughters()); if (v0.isK0SCandidate()) { - registry.fill(HIST("data/jets/V0/jetPtK0SPtCtau"), jet.pt(), v0.pt(), ctauK0s, weight); - registry.fill(HIST("data/jets/V0/jetPtK0SPtMass"), jet.pt(), v0.pt(), v0.mK0Short(), weight); - registry.fill(HIST("data/jets/V0/jetPtK0SPtAllMasses"), jet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("data/jets/V0/jetPtK0SPtRadius"), jet.pt(), v0.pt(), v0.v0radius(), weight); - registry.fill(HIST("data/jets/V0/jetPtK0SPtCosPA"), jet.pt(), v0.pt(), v0.v0cosPA(), weight); - registry.fill(HIST("data/jets/V0/jetPtK0SPtDCAd"), jet.pt(), v0.pt(), v0.dcaV0daughters(), weight); - registry.fill(HIST("data/jets/V0/jetPtK0SPtDCAposneg"), jet.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); - - registry.fill(HIST("data/jets/V0/jetPtK0STrackProjCtau"), jet.pt(), trackProj, ctauK0s, weight); - registry.fill(HIST("data/jets/V0/jetPtK0STrackProjMass"), jet.pt(), trackProj, v0.mK0Short(), weight); - registry.fill(HIST("data/jets/V0/jetPtK0STrackProjAllMasses"), jet.pt(), trackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("data/jets/V0/jetPtK0STrackProjRadius"), jet.pt(), trackProj, v0.v0radius(), weight); - registry.fill(HIST("data/jets/V0/jetPtK0STrackProjCosPA"), jet.pt(), trackProj, v0.v0cosPA(), weight); - registry.fill(HIST("data/jets/V0/jetPtK0STrackProjDCAd"), jet.pt(), trackProj, v0.dcaV0daughters(), weight); - registry.fill(HIST("data/jets/V0/jetPtK0STrackProjDCAposneg"), jet.pt(), trackProj, v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("data/jets/V0/jetPtK0SPtCtau"), jet.pt(), v0.pt(), ctauK0s); + registry.fill(HIST("data/jets/V0/jetPtK0SPtMass"), jet.pt(), v0.pt(), v0.mK0Short()); + registry.fill(HIST("data/jets/V0/jetPtK0SPtAllMasses"), jet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda()); + registry.fill(HIST("data/jets/V0/jetPtK0SPtRadius"), jet.pt(), v0.pt(), v0.v0radius()); + registry.fill(HIST("data/jets/V0/jetPtK0SPtCosPA"), jet.pt(), v0.pt(), v0.v0cosPA()); + registry.fill(HIST("data/jets/V0/jetPtK0SPtDCAd"), jet.pt(), v0.pt(), v0.dcaV0daughters()); + registry.fill(HIST("data/jets/V0/jetPtK0SPtDCAposneg"), jet.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv()); + registry.fill(HIST("data/jets/V0/jetPtK0SPtCtauMass"), jet.pt(), v0.pt(), ctauK0s, v0.mK0Short()); + registry.fill(HIST("data/jets/V0/jetPtK0SPtRadiusMass"), jet.pt(), v0.pt(), v0.v0radius(), v0.mK0Short()); + registry.fill(HIST("data/jets/V0/jetPtK0SPtCosPAMass"), jet.pt(), v0.pt(), v0.v0cosPA(), v0.mK0Short()); + registry.fill(HIST("data/jets/V0/jetPtK0SPtDCAposMass"), jet.pt(), v0.pt(), v0.dcapostopv(), v0.mK0Short()); + registry.fill(HIST("data/jets/V0/jetPtK0SPtDCAnegMass"), jet.pt(), v0.pt(), v0.dcanegtopv(), v0.mK0Short()); + registry.fill(HIST("data/jets/V0/jetPtK0SPtDCAdMass"), jet.pt(), v0.pt(), v0.dcaV0daughters(), v0.mK0Short()); + + registry.fill(HIST("data/jets/V0/jetPtK0STrackProjCtau"), jet.pt(), trackProj, ctauK0s); + registry.fill(HIST("data/jets/V0/jetPtK0STrackProjMass"), jet.pt(), trackProj, v0.mK0Short()); + registry.fill(HIST("data/jets/V0/jetPtK0STrackProjAllMasses"), jet.pt(), trackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda()); + registry.fill(HIST("data/jets/V0/jetPtK0STrackProjRadius"), jet.pt(), trackProj, v0.v0radius()); + registry.fill(HIST("data/jets/V0/jetPtK0STrackProjCosPA"), jet.pt(), trackProj, v0.v0cosPA()); + registry.fill(HIST("data/jets/V0/jetPtK0STrackProjDCAd"), jet.pt(), trackProj, v0.dcaV0daughters()); + registry.fill(HIST("data/jets/V0/jetPtK0STrackProjDCAposneg"), jet.pt(), trackProj, v0.dcapostopv(), v0.dcanegtopv()); + registry.fill(HIST("data/jets/V0/jetPtK0STrackProjCtauMass"), jet.pt(), trackProj, ctauK0s, v0.mK0Short()); + registry.fill(HIST("data/jets/V0/jetPtK0STrackProjRadiusMass"), jet.pt(), trackProj, v0.v0radius(), v0.mK0Short()); + registry.fill(HIST("data/jets/V0/jetPtK0STrackProjCosPAMass"), jet.pt(), trackProj, v0.v0cosPA(), v0.mK0Short()); + registry.fill(HIST("data/jets/V0/jetPtK0STrackProjDCAposMass"), jet.pt(), trackProj, v0.dcapostopv(), v0.mK0Short()); + registry.fill(HIST("data/jets/V0/jetPtK0STrackProjDCAnegMass"), jet.pt(), trackProj, v0.dcanegtopv(), v0.mK0Short()); + registry.fill(HIST("data/jets/V0/jetPtK0STrackProjDCAdMass"), jet.pt(), trackProj, v0.dcaV0daughters(), v0.mK0Short()); } if (v0.isLambdaCandidate()) { - registry.fill(HIST("data/jets/V0/jetPtLambdaPtCtau"), jet.pt(), v0.pt(), ctauLambda, weight); - registry.fill(HIST("data/jets/V0/jetPtLambdaPtMass"), jet.pt(), v0.pt(), v0.mLambda(), weight); - registry.fill(HIST("data/jets/V0/jetPtLambdaPtAllMasses"), jet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("data/jets/V0/jetPtLambdaPtLambdaMasses"), jet.pt(), v0.pt(), massDiff, massRatio, massRelDiff, weight); - registry.fill(HIST("data/jets/V0/jetPtLambdaPtRadius"), jet.pt(), v0.pt(), v0.v0radius(), weight); - registry.fill(HIST("data/jets/V0/jetPtLambdaPtCosPA"), jet.pt(), v0.pt(), v0.v0cosPA(), weight); - registry.fill(HIST("data/jets/V0/jetPtLambdaPtDCAd"), jet.pt(), v0.pt(), v0.dcaV0daughters(), weight); - registry.fill(HIST("data/jets/V0/jetPtLambdaPtDCAposneg"), jet.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); - - registry.fill(HIST("data/jets/V0/jetPtLambdaTrackProjCtau"), jet.pt(), trackProj, ctauLambda, weight); - registry.fill(HIST("data/jets/V0/jetPtLambdaTrackProjMass"), jet.pt(), trackProj, v0.mLambda(), weight); - registry.fill(HIST("data/jets/V0/jetPtLambdaTrackProjAllMasses"), jet.pt(), trackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("data/jets/V0/jetPtLambdaTrackProjLambdaMasses"), jet.pt(), trackProj, massDiff, massRatio, massRelDiff, weight); - registry.fill(HIST("data/jets/V0/jetPtLambdaTrackProjRadius"), jet.pt(), trackProj, v0.v0radius(), weight); - registry.fill(HIST("data/jets/V0/jetPtLambdaTrackProjCosPA"), jet.pt(), trackProj, v0.v0cosPA(), weight); - registry.fill(HIST("data/jets/V0/jetPtLambdaTrackProjDCAd"), jet.pt(), trackProj, v0.dcaV0daughters(), weight); - registry.fill(HIST("data/jets/V0/jetPtLambdaTrackProjDCAposneg"), jet.pt(), trackProj, v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("data/jets/V0/jetPtLambdaPtCtau"), jet.pt(), v0.pt(), ctauLambda); + registry.fill(HIST("data/jets/V0/jetPtLambdaPtMass"), jet.pt(), v0.pt(), v0.mLambda()); + registry.fill(HIST("data/jets/V0/jetPtLambdaPtAllMasses"), jet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda()); + registry.fill(HIST("data/jets/V0/jetPtLambdaPtLambdaMasses"), jet.pt(), v0.pt(), massDiff, massRatio, massRelDiff); + registry.fill(HIST("data/jets/V0/jetPtLambdaPtRadius"), jet.pt(), v0.pt(), v0.v0radius()); + registry.fill(HIST("data/jets/V0/jetPtLambdaPtCosPA"), jet.pt(), v0.pt(), v0.v0cosPA()); + registry.fill(HIST("data/jets/V0/jetPtLambdaPtDCAd"), jet.pt(), v0.pt(), v0.dcaV0daughters()); + registry.fill(HIST("data/jets/V0/jetPtLambdaPtDCAposneg"), jet.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv()); + registry.fill(HIST("data/jets/V0/jetPtLambdaPtCtauMass"), jet.pt(), v0.pt(), ctauLambda, v0.mLambda()); + registry.fill(HIST("data/jets/V0/jetPtLambdaPtRadiusMass"), jet.pt(), v0.pt(), v0.v0radius(), v0.mLambda()); + registry.fill(HIST("data/jets/V0/jetPtLambdaPtCosPAMass"), jet.pt(), v0.pt(), v0.v0cosPA(), v0.mLambda()); + registry.fill(HIST("data/jets/V0/jetPtLambdaPtDCAposMass"), jet.pt(), v0.pt(), v0.dcapostopv(), v0.mLambda()); + registry.fill(HIST("data/jets/V0/jetPtLambdaPtDCAnegMass"), jet.pt(), v0.pt(), v0.dcanegtopv(), v0.mLambda()); + registry.fill(HIST("data/jets/V0/jetPtLambdaPtDCAdMass"), jet.pt(), v0.pt(), v0.dcaV0daughters(), v0.mLambda()); + + registry.fill(HIST("data/jets/V0/jetPtLambdaTrackProjCtau"), jet.pt(), trackProj, ctauLambda); + registry.fill(HIST("data/jets/V0/jetPtLambdaTrackProjMass"), jet.pt(), trackProj, v0.mLambda()); + registry.fill(HIST("data/jets/V0/jetPtLambdaTrackProjAllMasses"), jet.pt(), trackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda()); + registry.fill(HIST("data/jets/V0/jetPtLambdaTrackProjLambdaMasses"), jet.pt(), trackProj, massDiff, massRatio, massRelDiff); + registry.fill(HIST("data/jets/V0/jetPtLambdaTrackProjRadius"), jet.pt(), trackProj, v0.v0radius()); + registry.fill(HIST("data/jets/V0/jetPtLambdaTrackProjCosPA"), jet.pt(), trackProj, v0.v0cosPA()); + registry.fill(HIST("data/jets/V0/jetPtLambdaTrackProjDCAd"), jet.pt(), trackProj, v0.dcaV0daughters()); + registry.fill(HIST("data/jets/V0/jetPtLambdaTrackProjDCAposneg"), jet.pt(), trackProj, v0.dcapostopv(), v0.dcanegtopv()); + registry.fill(HIST("data/jets/V0/jetPtLambdaTrackProjCtauMass"), jet.pt(), trackProj, ctauLambda, v0.mLambda()); + registry.fill(HIST("data/jets/V0/jetPtLambdaTrackProjRadiusMass"), jet.pt(), trackProj, v0.v0radius(), v0.mLambda()); + registry.fill(HIST("data/jets/V0/jetPtLambdaTrackProjCosPAMass"), jet.pt(), trackProj, v0.v0cosPA(), v0.mLambda()); + registry.fill(HIST("data/jets/V0/jetPtLambdaTrackProjDCAposMass"), jet.pt(), trackProj, v0.dcapostopv(), v0.mLambda()); + registry.fill(HIST("data/jets/V0/jetPtLambdaTrackProjDCAnegMass"), jet.pt(), trackProj, v0.dcanegtopv(), v0.mLambda()); + registry.fill(HIST("data/jets/V0/jetPtLambdaTrackProjDCAdMass"), jet.pt(), trackProj, v0.dcaV0daughters(), v0.mLambda()); } if (v0.isAntiLambdaCandidate()) { - registry.fill(HIST("data/jets/V0/jetPtAntiLambdaPtCtau"), jet.pt(), v0.pt(), ctauAntiLambda, weight); - registry.fill(HIST("data/jets/V0/jetPtAntiLambdaPtMass"), jet.pt(), v0.pt(), v0.mAntiLambda(), weight); - registry.fill(HIST("data/jets/V0/jetPtAntiLambdaPtAllMasses"), jet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("data/jets/V0/jetPtAntiLambdaPtLambdaMasses"), jet.pt(), v0.pt(), massDiff, massRatio, massRelDiff, weight); - registry.fill(HIST("data/jets/V0/jetPtAntiLambdaPtRadius"), jet.pt(), v0.pt(), v0.v0radius(), weight); - registry.fill(HIST("data/jets/V0/jetPtAntiLambdaPtCosPA"), jet.pt(), v0.pt(), v0.v0cosPA(), weight); - registry.fill(HIST("data/jets/V0/jetPtAntiLambdaPtDCAd"), jet.pt(), v0.pt(), v0.dcaV0daughters(), weight); - registry.fill(HIST("data/jets/V0/jetPtAntiLambdaPtDCAposneg"), jet.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); - - registry.fill(HIST("data/jets/V0/jetPtAntiLambdaTrackProjCtau"), jet.pt(), trackProj, ctauAntiLambda, weight); - registry.fill(HIST("data/jets/V0/jetPtAntiLambdaTrackProjMass"), jet.pt(), trackProj, v0.mAntiLambda(), weight); - registry.fill(HIST("data/jets/V0/jetPtAntiLambdaTrackProjAllMasses"), jet.pt(), trackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("data/jets/V0/jetPtAntiLambdaTrackProjLambdaMasses"), jet.pt(), trackProj, massDiff, massRatio, massRelDiff, weight); - registry.fill(HIST("data/jets/V0/jetPtAntiLambdaTrackProjRadius"), jet.pt(), trackProj, v0.v0radius(), weight); - registry.fill(HIST("data/jets/V0/jetPtAntiLambdaTrackProjCosPA"), jet.pt(), trackProj, v0.v0cosPA(), weight); - registry.fill(HIST("data/jets/V0/jetPtAntiLambdaTrackProjDCAd"), jet.pt(), trackProj, v0.dcaV0daughters(), weight); - registry.fill(HIST("data/jets/V0/jetPtAntiLambdaTrackProjDCAposneg"), jet.pt(), trackProj, v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaPtCtau"), jet.pt(), v0.pt(), ctauAntiLambda); + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaPtMass"), jet.pt(), v0.pt(), v0.mAntiLambda()); + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaPtAllMasses"), jet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda()); + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaPtLambdaMasses"), jet.pt(), v0.pt(), massDiff, massRatio, massRelDiff); + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaPtRadius"), jet.pt(), v0.pt(), v0.v0radius()); + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaPtCosPA"), jet.pt(), v0.pt(), v0.v0cosPA()); + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaPtDCAd"), jet.pt(), v0.pt(), v0.dcaV0daughters()); + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaPtDCAposneg"), jet.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv()); + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaPtCtauMass"), jet.pt(), v0.pt(), ctauAntiLambda, v0.mAntiLambda()); + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaPtRadiusMass"), jet.pt(), v0.pt(), v0.v0radius(), v0.mAntiLambda()); + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaPtCosPAMass"), jet.pt(), v0.pt(), v0.v0cosPA(), v0.mAntiLambda()); + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaPtDCAposMass"), jet.pt(), v0.pt(), v0.dcapostopv(), v0.mAntiLambda()); + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaPtDCAnegMass"), jet.pt(), v0.pt(), v0.dcanegtopv(), v0.mAntiLambda()); + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaPtDCAdMass"), jet.pt(), v0.pt(), v0.dcaV0daughters(), v0.mAntiLambda()); + + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaTrackProjCtau"), jet.pt(), trackProj, ctauAntiLambda); + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaTrackProjMass"), jet.pt(), trackProj, v0.mAntiLambda()); + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaTrackProjAllMasses"), jet.pt(), trackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda()); + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaTrackProjLambdaMasses"), jet.pt(), trackProj, massDiff, massRatio, massRelDiff); + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaTrackProjRadius"), jet.pt(), trackProj, v0.v0radius()); + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaTrackProjCosPA"), jet.pt(), trackProj, v0.v0cosPA()); + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaTrackProjDCAd"), jet.pt(), trackProj, v0.dcaV0daughters()); + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaTrackProjDCAposneg"), jet.pt(), trackProj, v0.dcapostopv(), v0.dcanegtopv()); + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaTrackProjCtauMass"), jet.pt(), trackProj, ctauAntiLambda, v0.mAntiLambda()); + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaTrackProjRadiusMass"), jet.pt(), trackProj, v0.v0radius(), v0.mAntiLambda()); + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaTrackProjCosPAMass"), jet.pt(), trackProj, v0.v0cosPA(), v0.mAntiLambda()); + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaTrackProjDCAposMass"), jet.pt(), trackProj, v0.dcapostopv(), v0.mAntiLambda()); + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaTrackProjDCAnegMass"), jet.pt(), trackProj, v0.dcanegtopv(), v0.mAntiLambda()); + registry.fill(HIST("data/jets/V0/jetPtAntiLambdaTrackProjDCAdMass"), jet.pt(), trackProj, v0.dcaV0daughters(), v0.mAntiLambda()); + } + } + template + void fillDataPerpConeHists(T const& coll, U const& jet, V const& v0s) + { + double perpConeR = jet.r() * 1e-2; + double conePhi[2] = {RecoDecay::constrainAngle(jet.phi() - constants::math::PIHalf, -constants::math::PI), + RecoDecay::constrainAngle(jet.phi() + constants::math::PIHalf, -constants::math::PI)}; + double conePt[2] = {0., 0.}; + int nV0sinCone[2] = {0, 0}; + for (const auto& v0 : v0s) { + // Need to check if v0 passed jet finder selection/preselector cuts + bool v0InCones = false; + double dEta = v0.eta() - jet.eta(); + double dPhi[2] = {RecoDecay::constrainAngle(v0.phi() - conePhi[0], -constants::math::PI), + RecoDecay::constrainAngle(v0.phi() - conePhi[1], -constants::math::PI)}; + for (int i = 0; i < 2; i++) { + if (std::sqrt(dEta * dEta + dPhi[i] * dPhi[i]) < perpConeR) { + conePt[i] += v0.pt(); + nV0sinCone[i]++; + v0InCones = true; + } + } + if (!v0InCones) { + continue; + } + + double ctauLambda = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * constants::physics::MassLambda0; + double ctauAntiLambda = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * constants::physics::MassLambda0Bar; + double ctauK0s = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * constants::physics::MassK0Short; + + registry.fill(HIST("data/PC/JetPtEtaV0Pt"), jet.pt(), jet.eta(), v0.pt()); + registry.fill(HIST("data/PC/V0PtEtaPhi"), v0.pt(), v0.eta(), v0.phi()); + registry.fill(HIST("data/PC/V0PtCtau"), v0.pt(), ctauK0s, ctauLambda, ctauAntiLambda); + registry.fill(HIST("data/PC/V0PtMass"), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda()); + registry.fill(HIST("data/PC/V0PtMassWide"), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda()); + registry.fill(HIST("data/PC/V0PtRadiusCosPA"), v0.pt(), v0.v0radius(), v0.v0cosPA()); + registry.fill(HIST("data/PC/V0PtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv()); + registry.fill(HIST("data/PC/V0PtDCAd"), v0.pt(), v0.dcaV0daughters()); + + if (v0.isLambdaCandidate()) { + registry.fill(HIST("data/PC/JetPtLambdaPtMass"), jet.pt(), v0.pt(), v0.mLambda()); + + registry.fill(HIST("data/PC/JetPtEtaLambdaPt"), jet.pt(), jet.eta(), v0.pt()); + registry.fill(HIST("data/PC/LambdaPtEtaPhi"), v0.pt(), v0.eta(), v0.phi()); + registry.fill(HIST("data/PC/LambdaPtCtauMass"), v0.pt(), ctauLambda, v0.mLambda()); + registry.fill(HIST("data/PC/LambdaPtRadiusCosPA"), v0.pt(), v0.v0radius(), v0.v0cosPA()); + registry.fill(HIST("data/PC/LambdaPtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv()); + registry.fill(HIST("data/PC/LambdaPtDCAd"), v0.pt(), v0.dcaV0daughters()); + } + if (v0.isAntiLambdaCandidate()) { + registry.fill(HIST("data/PC/JetPtAntiLambdaPtMass"), jet.pt(), v0.pt(), v0.mAntiLambda()); + + registry.fill(HIST("data/PC/JetPtEtaAntiLambdaPt"), jet.pt(), jet.eta(), v0.pt()); + registry.fill(HIST("data/PC/AntiLambdaPtEtaPhi"), v0.pt(), v0.eta(), v0.phi()); + registry.fill(HIST("data/PC/AntiLambdaPtCtauMass"), v0.pt(), ctauAntiLambda, v0.mAntiLambda()); + registry.fill(HIST("data/PC/AntiLambdaPtRadiusCosPA"), v0.pt(), v0.v0radius(), v0.v0cosPA()); + registry.fill(HIST("data/PC/AntiLambdaPtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv()); + registry.fill(HIST("data/PC/AntiLambdaPtDCAd"), v0.pt(), v0.dcaV0daughters()); + } + if (v0.isK0SCandidate()) { + registry.fill(HIST("data/PC/JetPtK0SPtMass"), jet.pt(), v0.pt(), v0.mK0Short()); + + registry.fill(HIST("data/PC/JetPtEtaK0SPt"), jet.pt(), jet.eta(), v0.pt()); + registry.fill(HIST("data/PC/K0SPtEtaPhi"), v0.pt(), v0.eta(), v0.phi()); + registry.fill(HIST("data/PC/K0SPtCtauMass"), v0.pt(), ctauK0s, v0.mK0Short()); + registry.fill(HIST("data/PC/K0SPtRadiusCosPA"), v0.pt(), v0.v0radius(), v0.v0cosPA()); + registry.fill(HIST("data/PC/K0SPtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv()); + registry.fill(HIST("data/PC/K0SPtDCAd"), v0.pt(), v0.dcaV0daughters()); + } + } + // Fill hist for Ncones: nv0s, conePt, coneEta, conePhi + for (int i = 0; i < 2; i++) { + registry.fill(HIST("data/PC/nV0sConePtEta"), nV0sinCone[i], conePt[i], jet.eta()); + registry.fill(HIST("data/PC/ConePtEtaPhi"), conePt[i], jet.eta(), conePhi[i]); + registry.fill(HIST("data/PC/JetPtEtaConePt"), jet.pt(), jet.eta(), conePt[i]); } } + // Data - Weighted + template + void fillDataV0HistogramsWeighted(CollisionType const& collision, V0Type const& V0s) + { + // Fill histograms with V0 signal weights + float nV0s = 0; + for (const auto& v0 : V0s) { + if (v0.isRejectedCandidate()) + continue; + + float weight = getV0SignalProb(v0); + nV0s += weight; // Sum weights (purity) of V0s + + double ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0; + double ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0Bar; + double ctauK0s = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassK0Short; + + double massDiff = v0.mLambda() - v0.mAntiLambda(); + double massRatio = v0.mAntiLambda() / v0.mLambda(); + double massRelDiff = (v0.mLambda() - v0.mAntiLambda()) / v0.mLambda(); + + registry.fill(HIST("data/V0/V0PtEtaPhiWeighted"), v0.pt(), v0.eta(), v0.phi(), weight); + registry.fill(HIST("data/V0/V0PtCtauWeighted"), v0.pt(), ctauK0s, ctauLambda, ctauAntiLambda, weight); + registry.fill(HIST("data/V0/V0PtMassWeighted"), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + registry.fill(HIST("data/V0/V0PtMassWideWeighted"), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + registry.fill(HIST("data/V0/V0PtLambdaMassesWeighted"), v0.pt(), massDiff, massRatio, massRelDiff, weight); + registry.fill(HIST("data/V0/V0PtRadiusCosPAWeighted"), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); + registry.fill(HIST("data/V0/V0PtDCAposnegWeighted"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("data/V0/V0PtDCAdWeighted"), v0.pt(), v0.dcaV0daughters(), weight); + + if (v0.isK0SCandidate()) { + registry.fill(HIST("data/V0/K0SPtEtaPhiWeighted"), v0.pt(), v0.eta(), v0.phi(), weight); + registry.fill(HIST("data/V0/K0SPtRadiusCosPAWeighted"), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); + registry.fill(HIST("data/V0/K0SPtDCAposnegWeighted"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("data/V0/K0SPtDCAdWeighted"), v0.pt(), v0.dcaV0daughters(), weight); + + registry.fill(HIST("data/V0/K0SPtCtauMassWeighted"), v0.pt(), ctauK0s, v0.mK0Short(), weight); + registry.fill(HIST("data/V0/K0SPtRadiusMassWeighted"), v0.pt(), v0.v0radius(), v0.mK0Short(), weight); + registry.fill(HIST("data/V0/K0SPtCosPAMassWeighted"), v0.pt(), v0.v0cosPA(), v0.mK0Short(), weight); + registry.fill(HIST("data/V0/K0SPtDCAposMassWeighted"), v0.pt(), v0.dcapostopv(), v0.mK0Short(), weight); + registry.fill(HIST("data/V0/K0SPtDCAnegMassWeighted"), v0.pt(), v0.dcanegtopv(), v0.mK0Short(), weight); + registry.fill(HIST("data/V0/K0SPtDCAdMassWeighted"), v0.pt(), v0.dcaV0daughters(), v0.mK0Short(), weight); + } + if (v0.isLambdaCandidate()) { + registry.fill(HIST("data/V0/LambdaPtEtaPhiWeighted"), v0.pt(), v0.eta(), v0.phi(), weight); + registry.fill(HIST("data/V0/LambdaPtLambdaMassesWeighted"), v0.pt(), massDiff, massRatio, massRelDiff, weight); + registry.fill(HIST("data/V0/LambdaPtRadiusCosPAWeighted"), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); + registry.fill(HIST("data/V0/LambdaPtDCAposnegWeighted"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("data/V0/LambdaPtDCAdWeighted"), v0.pt(), v0.dcaV0daughters(), weight); + + registry.fill(HIST("data/V0/LambdaPtCtauMassWeighted"), v0.pt(), ctauLambda, v0.mLambda(), weight); + registry.fill(HIST("data/V0/LambdaPtRadiusMassWeighted"), v0.pt(), v0.v0radius(), v0.mLambda(), weight); + registry.fill(HIST("data/V0/LambdaPtCosPAMassWeighted"), v0.pt(), v0.v0cosPA(), v0.mLambda(), weight); + registry.fill(HIST("data/V0/LambdaPtDCAposMassWeighted"), v0.pt(), v0.dcapostopv(), v0.mLambda(), weight); + registry.fill(HIST("data/V0/LambdaPtDCAnegMassWeighted"), v0.pt(), v0.dcanegtopv(), v0.mLambda(), weight); + registry.fill(HIST("data/V0/LambdaPtDCAdMassWeighted"), v0.pt(), v0.dcaV0daughters(), v0.mLambda(), weight); + } + if (v0.isAntiLambdaCandidate()) { + registry.fill(HIST("data/V0/AntiLambdaPtEtaPhiWeighted"), v0.pt(), v0.eta(), v0.phi(), weight); + registry.fill(HIST("data/V0/AntiLambdaPtLambdaMassesWeighted"), v0.pt(), massDiff, massRatio, massRelDiff, weight); + registry.fill(HIST("data/V0/AntiLambdaPtRadiusCosPAWeighted"), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); + registry.fill(HIST("data/V0/AntiLambdaPtDCAposnegWeighted"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("data/V0/AntiLambdaPtDCAdWeighted"), v0.pt(), v0.dcaV0daughters(), weight); + + registry.fill(HIST("data/V0/AntiLambdaPtCtauMassWeighted"), v0.pt(), ctauAntiLambda, v0.mAntiLambda(), weight); + registry.fill(HIST("data/V0/AntiLambdaPtRadiusMassWeighted"), v0.pt(), v0.v0radius(), v0.mAntiLambda(), weight); + registry.fill(HIST("data/V0/AntiLambdaPtCosPAMassWeighted"), v0.pt(), v0.v0cosPA(), v0.mAntiLambda(), weight); + registry.fill(HIST("data/V0/AntiLambdaPtDCAposMassWeighted"), v0.pt(), v0.dcapostopv(), v0.mAntiLambda(), weight); + registry.fill(HIST("data/V0/AntiLambdaPtDCAnegMassWeighted"), v0.pt(), v0.dcanegtopv(), v0.mAntiLambda(), weight); + registry.fill(HIST("data/V0/AntiLambdaPtDCAdMassWeighted"), v0.pt(), v0.dcaV0daughters(), v0.mAntiLambda(), weight); + } + } // for v0 + registry.fill(HIST("data/V0/nV0sEventAccWeighted"), nV0s); + } + void fillDataJetHistogramsWeighted(double jetpt, double jeteta, double jetphi, double weight = 1.) + { + registry.fill(HIST("data/jets/weighted/jetPtEtaPhi"), jetpt, jeteta, jetphi, weight); + } template - void fillDataV0FragHistogramsWithWeights(C const& collision, J const& jet, std::vector state, std::vector values, double weight) + void fillDataV0FragHistogramsWeighted(C const& collision, J const& jet, std::vector state, std::vector values, double weight) { - // TODO: Add other histograms double jetpt = values[values.size() - 1]; int ip = 0; - for (const auto& v0 : jet.template candidates_as()) { + for (const auto& v0 : jet.template candidates_as()) { + if (v0.isRejectedCandidate()) + continue; + double z = values[ip]; ip++; @@ -1351,6 +1667,10 @@ struct JetFragmentation { double ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0; double ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0Bar; + double massDiff = v0.mLambda() - v0.mAntiLambda(); + double massRatio = v0.mAntiLambda() / v0.mLambda(); + double massRelDiff = (v0.mLambda() - v0.mAntiLambda()) / v0.mLambda(); + switch (state[ip]) { case 0: // Background registry.fill(HIST("data/jets/weighted/V0/jetPtBkgTrackProjCtau"), jetpt, z, ctauK0s, ctauLambda, ctauAntiLambda, weight); @@ -1358,741 +1678,188 @@ struct JetFragmentation { registry.fill(HIST("data/jets/weighted/V0/jetPtBkgTrackProjRadiusCosPA"), jetpt, z, v0.v0radius(), v0.v0cosPA(), weight); registry.fill(HIST("data/jets/weighted/V0/jetPtBkgTrackProjDCAposneg"), jetpt, z, v0.dcapostopv(), v0.dcanegtopv(), weight); registry.fill(HIST("data/jets/weighted/V0/jetPtBkgTrackProjDCAd"), jetpt, z, v0.dcaV0daughters(), weight); + + registry.fill(HIST("data/jets/weighted/V0/jetPtBkgTrackProjCtauK0SMass"), jetpt, z, ctauK0s, v0.mK0Short(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtBkgTrackProjRadiusK0SMass"), jetpt, z, v0.v0radius(), v0.mK0Short(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtBkgTrackProjCosPAK0SMass"), jetpt, z, v0.v0cosPA(), v0.mK0Short(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtBkgTrackProjDCAposK0SMass"), jetpt, z, v0.dcapostopv(), v0.mK0Short(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtBkgTrackProjDCAnegK0SMass"), jetpt, z, v0.dcanegtopv(), v0.mK0Short(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtBkgTrackProjDCAdK0SMass"), jetpt, z, v0.dcaV0daughters(), v0.mK0Short(), weight); + + registry.fill(HIST("data/jets/weighted/V0/jetPtBkgTrackProjCtauLambdaMass"), jetpt, z, ctauLambda, v0.mLambda(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtBkgTrackProjRadiusLambdaMass"), jetpt, z, v0.v0radius(), v0.mLambda(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtBkgTrackProjCosPALambdaMass"), jetpt, z, v0.v0cosPA(), v0.mLambda(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtBkgTrackProjDCAposLambdaMass"), jetpt, z, v0.dcapostopv(), v0.mLambda(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtBkgTrackProjDCAnegLambdaMass"), jetpt, z, v0.dcanegtopv(), v0.mLambda(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtBkgTrackProjDCAdLambdaMass"), jetpt, z, v0.dcaV0daughters(), v0.mLambda(), weight); + + registry.fill(HIST("data/jets/weighted/V0/jetPtBkgTrackProjCtauAntiLambdaMass"), jetpt, z, ctauAntiLambda, v0.mAntiLambda(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtBkgTrackProjRadiusAntiLambdaMass"), jetpt, z, v0.v0radius(), v0.mAntiLambda(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtBkgTrackProjCosPAAntiLambdaMass"), jetpt, z, v0.v0cosPA(), v0.mAntiLambda(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtBkgTrackProjDCAposAntiLambdaMass"), jetpt, z, v0.dcapostopv(), v0.mAntiLambda(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtBkgTrackProjDCAnegAntiLambdaMass"), jetpt, z, v0.dcanegtopv(), v0.mAntiLambda(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtBkgTrackProjDCAdAntiLambdaMass"), jetpt, z, v0.dcaV0daughters(), v0.mAntiLambda(), weight); break; case 1: // K0S + registry.fill(HIST("data/jets/weighted/V0/jetPtK0STrackProjMass"), jetpt, z, v0.mK0Short(), weight); registry.fill(HIST("data/jets/weighted/V0/jetPtK0STrackProjCtau"), jetpt, z, ctauK0s, weight); registry.fill(HIST("data/jets/weighted/V0/jetPtK0STrackProjAllMasses"), jetpt, z, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); registry.fill(HIST("data/jets/weighted/V0/jetPtK0STrackProjRadius"), jetpt, z, v0.v0radius(), weight); registry.fill(HIST("data/jets/weighted/V0/jetPtK0STrackProjCosPA"), jetpt, z, v0.v0cosPA(), weight); registry.fill(HIST("data/jets/weighted/V0/jetPtK0STrackProjDCAd"), jetpt, z, v0.dcaV0daughters(), weight); registry.fill(HIST("data/jets/weighted/V0/jetPtK0STrackProjDCAposneg"), jetpt, z, v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtK0STrackProjCtauMass"), jetpt, z, ctauK0s, v0.mK0Short(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtK0STrackProjRadiusMass"), jetpt, z, v0.v0radius(), v0.mK0Short(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtK0STrackProjCosPAMass"), jetpt, z, v0.v0cosPA(), v0.mK0Short(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtK0STrackProjDCAposMass"), jetpt, z, v0.dcapostopv(), v0.mK0Short(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtK0STrackProjDCAnegMass"), jetpt, z, v0.dcanegtopv(), v0.mK0Short(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtK0STrackProjDCAdMass"), jetpt, z, v0.dcaV0daughters(), v0.mK0Short(), weight); break; case 2: // Lambda + registry.fill(HIST("data/jets/weighted/V0/jetPtLambdaTrackProjMass"), jetpt, z, v0.mLambda(), weight); registry.fill(HIST("data/jets/weighted/V0/jetPtLambdaTrackProjCtau"), jetpt, z, ctauLambda, weight); registry.fill(HIST("data/jets/weighted/V0/jetPtLambdaTrackProjAllMasses"), jetpt, z, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtLambdaTrackProjLambdaMasses"), jetpt, z, massDiff, massRatio, massRelDiff, weight); registry.fill(HIST("data/jets/weighted/V0/jetPtLambdaTrackProjRadius"), jetpt, z, v0.v0radius(), weight); registry.fill(HIST("data/jets/weighted/V0/jetPtLambdaTrackProjCosPA"), jetpt, z, v0.v0cosPA(), weight); registry.fill(HIST("data/jets/weighted/V0/jetPtLambdaTrackProjDCAd"), jetpt, z, v0.dcaV0daughters(), weight); registry.fill(HIST("data/jets/weighted/V0/jetPtLambdaTrackProjDCAposneg"), jetpt, z, v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtLambdaTrackProjCtauMass"), jetpt, z, ctauLambda, v0.mLambda(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtLambdaTrackProjRadiusMass"), jetpt, z, v0.v0radius(), v0.mLambda(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtLambdaTrackProjCosPAMass"), jetpt, z, v0.v0cosPA(), v0.mLambda(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtLambdaTrackProjDCAposMass"), jetpt, z, v0.dcapostopv(), v0.mLambda(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtLambdaTrackProjDCAnegMass"), jetpt, z, v0.dcanegtopv(), v0.mLambda(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtLambdaTrackProjDCAdMass"), jetpt, z, v0.dcaV0daughters(), v0.mLambda(), weight); break; case 3: // AntiLambda + registry.fill(HIST("data/jets/weighted/V0/jetPtAntiLambdaTrackProjMass"), jetpt, z, v0.mAntiLambda(), weight); registry.fill(HIST("data/jets/weighted/V0/jetPtAntiLambdaTrackProjCtau"), jetpt, z, ctauAntiLambda, weight); registry.fill(HIST("data/jets/weighted/V0/jetPtAntiLambdaTrackProjAllMasses"), jetpt, z, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtAntiLambdaTrackProjLambdaMasses"), jetpt, z, massDiff, massRatio, massRelDiff, weight); registry.fill(HIST("data/jets/weighted/V0/jetPtAntiLambdaTrackProjRadius"), jetpt, z, v0.v0radius(), weight); registry.fill(HIST("data/jets/weighted/V0/jetPtAntiLambdaTrackProjCosPA"), jetpt, z, v0.v0cosPA(), weight); registry.fill(HIST("data/jets/weighted/V0/jetPtAntiLambdaTrackProjDCAd"), jetpt, z, v0.dcaV0daughters(), weight); registry.fill(HIST("data/jets/weighted/V0/jetPtAntiLambdaTrackProjDCAposneg"), jetpt, z, v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtAntiLambdaTrackProjCtauMass"), jetpt, z, ctauAntiLambda, v0.mAntiLambda(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtAntiLambdaTrackProjRadiusMass"), jetpt, z, v0.v0radius(), v0.mAntiLambda(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtAntiLambdaTrackProjCosPAMass"), jetpt, z, v0.v0cosPA(), v0.mAntiLambda(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtAntiLambdaTrackProjDCAposMass"), jetpt, z, v0.dcapostopv(), v0.mAntiLambda(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtAntiLambdaTrackProjDCAnegMass"), jetpt, z, v0.dcanegtopv(), v0.mAntiLambda(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtAntiLambdaTrackProjDCAdMass"), jetpt, z, v0.dcaV0daughters(), v0.mAntiLambda(), weight); break; } - registry.fill(HIST("data/jets/weighted/V0/jetPtV0TrackProjCtau"), jetpt, z, ctauK0s, ctauLambda, ctauAntiLambda, weight); registry.fill(HIST("data/jets/weighted/V0/jetPtV0TrackProjMass"), jetpt, z, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtV0TrackProjCtau"), jetpt, z, ctauK0s, ctauLambda, ctauAntiLambda, weight); registry.fill(HIST("data/jets/weighted/V0/jetPtV0TrackProjMassWide"), jetpt, z, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + registry.fill(HIST("data/jets/weighted/V0/jetPtV0TrackProjLambdaMasses"), jetpt, z, massDiff, massRatio, massRelDiff, weight); registry.fill(HIST("data/jets/weighted/V0/jetPtV0TrackProjRadiusCosPA"), jetpt, z, v0.v0radius(), v0.v0cosPA(), weight); registry.fill(HIST("data/jets/weighted/V0/jetPtV0TrackProjDCAposneg"), jetpt, z, v0.dcapostopv(), v0.dcanegtopv(), weight); registry.fill(HIST("data/jets/weighted/V0/jetPtV0TrackProjDCAd"), jetpt, z, v0.dcaV0daughters(), weight); - } + } // v0 loop } - template - void fillMatchingHistogramsJet(DetJet const& detJet, PartJet const& partJet, double weight = 1.) + // MC - Counts (or event weights) + template + void fillMCPV0Histograms(T const& pV0s, double weight = 1.) { - double deltaEta = detJet.eta() - partJet.eta(); - double deltaPhi = RecoDecay::constrainAngle(detJet.phi() - partJet.phi(), -constants::math::PI); - double dR = jetutilities::deltaR(detJet, partJet); - - registry.fill(HIST("matching/jets/matchDetJetPtEtaPhi"), detJet.pt(), detJet.eta(), detJet.phi(), weight); - registry.fill(HIST("matching/jets/matchPartJetPtEtaPhi"), partJet.pt(), partJet.eta(), partJet.phi(), weight); - registry.fill(HIST("matching/jets/matchPartJetPtEtaPhiMatchDist"), partJet.pt(), partJet.eta(), partJet.phi(), dR, weight); - registry.fill(HIST("matching/jets/matchPartJetPtEnergyScale"), partJet.pt(), detJet.pt() / partJet.pt(), weight); - registry.fill(HIST("matching/jets/matchDetJetPtPartJetPt"), detJet.pt(), partJet.pt(), weight); - registry.fill(HIST("matching/jets/matchPartJetPtDetJetEtaPartJetEta"), partJet.pt(), detJet.eta(), partJet.eta(), weight); - registry.fill(HIST("matching/jets/matchPartJetPtDetJetPhiPartJetPhi"), partJet.pt(), detJet.phi(), partJet.phi(), weight); - registry.fill(HIST("matching/jets/matchPartJetPtResolutionPt"), partJet.pt(), (detJet.pt() - partJet.pt()), weight); - registry.fill(HIST("matching/jets/matchPartJetPtResolutionEta"), partJet.pt(), partJet.eta(), deltaEta, weight); - registry.fill(HIST("matching/jets/matchPartJetPtResolutionPhi"), partJet.pt(), partJet.phi(), deltaPhi, weight); - registry.fill(HIST("matching/jets/matchPartJetPtRelDiffPt"), partJet.pt(), (detJet.pt() - partJet.pt()) / partJet.pt(), weight); - } - - template // Not used for V0 jets - void fillMatchingHistogramsConstituent(DetJet const& detJet, PartJet const& partJet, Track const& track, Particle const& particle, double weight = 1.) - { - double detChargeFrag = -1., detTrackProj = -1., detTheta = -1., detXi = -1.; - double partChargeFrag = -1., partTrackProj = -1., partTheta = -1., partXi = -1.; - - detChargeFrag = getFrag(detJet, track); - detTrackProj = getMomProj(detJet, track); - detTheta = getTheta(detJet, track); - detXi = getXi(detJet, track); - - partChargeFrag = getFrag(partJet, particle); - partTrackProj = getMomProj(partJet, particle); - partTheta = getTheta(partJet, particle); - partXi = getXi(partJet, particle); - - // Detector level - registry.fill(HIST("matching/jets/matchDetJetTrackPtEtaPhi"), track.pt(), track.eta(), track.phi(), weight); - registry.fill(HIST("matching/jets/matchDetJetPtTrackPt"), detJet.pt(), track.pt(), weight); - registry.fill(HIST("matching/jets/matchDetJetPtFrag"), detJet.pt(), detChargeFrag, weight); - registry.fill(HIST("matching/jets/matchDetJetPtTrackProj"), detJet.pt(), detTrackProj, weight); - registry.fill(HIST("matching/jets/matchDetJetPtXi"), detJet.pt(), detXi, weight); - registry.fill(HIST("matching/jets/matchDetJetPtTheta"), detJet.pt(), detTheta, weight); - registry.fill(HIST("matching/jets/matchDetJetPtXiTheta"), detJet.pt(), detXi, detTheta, weight); - registry.fill(HIST("matching/jets/matchDetJetPtZTheta"), detJet.pt(), detTrackProj, detTheta, weight); - - // Particle level - registry.fill(HIST("matching/jets/matchPartJetTrackPtEtaPhi"), particle.pt(), particle.eta(), particle.phi(), weight); - registry.fill(HIST("matching/jets/matchPartJetPtTrackPt"), partJet.pt(), particle.pt(), weight); - registry.fill(HIST("matching/jets/matchPartJetPtFrag"), partJet.pt(), partChargeFrag, weight); - registry.fill(HIST("matching/jets/matchPartJetPtTrackProj"), partJet.pt(), partTrackProj, weight); - registry.fill(HIST("matching/jets/matchPartJetPtXi"), partJet.pt(), partXi, weight); - registry.fill(HIST("matching/jets/matchPartJetPtTheta"), partJet.pt(), partTheta, weight); - registry.fill(HIST("matching/jets/matchPartJetPtXiTheta"), partJet.pt(), partXi, partTheta, weight); - registry.fill(HIST("matching/jets/matchPartJetPtZTheta"), partJet.pt(), partTrackProj, partTheta, weight); - - // Resolution - registry.fill(HIST("matching/jets/matchPartJetPtResolutionTrackPt"), partJet.pt(), particle.pt(), (particle.pt() - track.pt()), weight); - registry.fill(HIST("matching/jets/matchPartJetPtResolutionChargeFrag"), partJet.pt(), partChargeFrag, (detChargeFrag - partChargeFrag), weight); - registry.fill(HIST("matching/jets/matchPartJetPtResolutionTrackProj"), partJet.pt(), partTrackProj, (detTrackProj - partTrackProj), weight); - registry.fill(HIST("matching/jets/matchPartJetPtResolutionXi"), partJet.pt(), partXi, (detXi - partXi), weight); - registry.fill(HIST("matching/jets/matchPartJetPtResolutionTheta"), partJet.pt(), partTheta, (detTheta - partTheta), weight); - registry.fill(HIST("matching/jets/matchPartJetPtResolutionXiResolutionTheta"), partJet.pt(), partXi, (detXi - partXi), partTheta, (detTheta - partTheta), weight); - registry.fill(HIST("matching/jets/matchPartJetPtResolutionZResolutionTheta"), partJet.pt(), partTrackProj, (detTrackProj - partTrackProj), partTheta, (detTheta - partTheta), weight); - - // Relative difference - registry.fill(HIST("matching/jets/matching/jets/matchPartJetPtRelDiffTrackPt"), partJet.pt(), detJet.pt() / partJet.pt(), particle.pt(), (track.pt() - particle.pt()) / particle.pt(), weight); - registry.fill(HIST("matching/jets/matchPartJetPtRelDiffTrackProj"), partJet.pt(), detJet.pt() / partJet.pt(), partTrackProj, (detTrackProj - partTrackProj) / partTrackProj, weight); - - // Response - registry.fill(HIST("matching/jets/matchDetJetPtFragPartJetPtFrag"), detJet.pt(), detChargeFrag, partJet.pt(), partChargeFrag, weight); - registry.fill(HIST("matching/jets/matchDetJetPtTrackProjPartJetPtTrackProj"), detJet.pt(), detTrackProj, partJet.pt(), partTrackProj, weight); - registry.fill(HIST("matching/jets/matchDetJetPtXiPartJetPtXi"), detJet.pt(), detXi, partJet.pt(), partXi, weight); - registry.fill(HIST("matching/jets/matchDetJetPtThetaPartJetPtTheta"), detJet.pt(), detTheta, partJet.pt(), partTheta, weight); - registry.fill(HIST("matching/jets/matchDetJetPtXiThetaPartJetPtXiTheta"), detJet.pt(), detXi, detTheta, partJet.pt(), partXi, partTheta, weight); - registry.fill(HIST("matching/jets/matchDetJetPtZThetaPartJetPtZTheta"), detJet.pt(), detTrackProj, detTheta, partJet.pt(), partTrackProj, partTheta, weight); - } - - template // Not used for V0 jets - void fillMatchingFakeOrMiss(Jet const& jet, Constituent const& constituent, bool isFake, double weight = 1.) - { - double chargeFrag = -1., trackProj = -1., theta = -1., xi = -1.; - chargeFrag = getFrag(jet, constituent); - trackProj = getMomProj(jet, constituent); - theta = getTheta(jet, constituent); - xi = getXi(jet, constituent); - - if (isFake) { - registry.fill(HIST("matching/jets/fakeDetJetPtFrag"), jet.pt(), chargeFrag, weight); - registry.fill(HIST("matching/jets/fakeDetJetPtTrackProj"), jet.pt(), trackProj, weight); - registry.fill(HIST("matching/jets/fakeDetJetPtXi"), jet.pt(), xi, weight); - registry.fill(HIST("matching/jets/fakeDetJetPtTheta"), jet.pt(), theta, weight); - registry.fill(HIST("matching/jets/fakeDetJetPtXiTheta"), jet.pt(), xi, theta, weight); - registry.fill(HIST("matching/jets/fakeDetJetPtZTheta"), jet.pt(), trackProj, theta, weight); - } else { - registry.fill(HIST("matching/jets/missPartJetPtFrag"), jet.pt(), chargeFrag, weight); - registry.fill(HIST("matching/jets/missPartJetPtTrackProj"), jet.pt(), trackProj, weight); - registry.fill(HIST("matching/jets/missPartJetPtXi"), jet.pt(), xi, weight); - registry.fill(HIST("matching/jets/missPartJetPtTheta"), jet.pt(), theta, weight); - registry.fill(HIST("matching/jets/missPartJetPtXiTheta"), jet.pt(), xi, theta, weight); - registry.fill(HIST("matching/jets/missPartJetPtZTheta"), jet.pt(), trackProj, theta, weight); - } - } - - template - void fillMatchingV0Miss(JetType const& jet, V0Type const& v0, double weight = 1.) - { - double trackProj = getMomProj(jet, v0); - - registry.fill(HIST("matching/jets/V0/missJetPtV0TrackProj"), jet.pt(), trackProj, weight); - registry.fill(HIST("matching/jets/V0/missJetPtV0PtEtaPhi"), jet.pt(), v0.pt(), v0.eta(), v0.phi(), weight); - if (std::abs(v0.pdgCode()) == 310) { // K0S - registry.fill(HIST("matching/jets/V0/missJetPtK0SPtEtaPhi"), jet.pt(), v0.pt(), v0.eta(), v0.phi(), weight); - registry.fill(HIST("matching/jets/V0/missJetPtK0STrackProj"), jet.pt(), trackProj, weight); - } else if (v0.pdgCode() == 3122) { // Lambda - registry.fill(HIST("matching/jets/V0/missJetPtLambda0PtEtaPhi"), jet.pt(), v0.pt(), v0.eta(), v0.phi(), weight); - registry.fill(HIST("matching/jets/V0/missJetPtLambda0TrackProj"), jet.pt(), trackProj, weight); - } else if (v0.pdgCode() == -3122) { // AntiLambda - registry.fill(HIST("matching/jets/V0/missJetPtAntiLambda0PtEtaPhi"), jet.pt(), v0.pt(), v0.eta(), v0.phi(), weight); - registry.fill(HIST("matching/jets/V0/missJetPtAntiLambda0TrackProj"), jet.pt(), trackProj, weight); - } - } - - template - void fillMatchingV0Fake(CollisionType const& collision, JetType const& jet, V0Type const& v0, double weight = 1.) - { - double trackProj = getMomProj(jet, v0); - double ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0; - double ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0Bar; - double ctauK0s = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassK0Short; - double massDiff = v0.mLambda() - v0.mAntiLambda(); - double massRatio = v0.mAntiLambda() / v0.mLambda(); - double massRelDiff = (v0.mLambda() - v0.mAntiLambda()) / v0.mLambda(); - - registry.fill(HIST("matching/jets/V0/fakeJetPtV0PtEtaPhi"), jet.pt(), v0.pt(), v0.eta(), v0.phi(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtV0TrackProj"), jet.pt(), trackProj, weight); - - registry.fill(HIST("matching/jets/V0/fakeJetPtV0PtCtau"), jet.pt(), v0.pt(), ctauK0s, ctauLambda, ctauAntiLambda, weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtV0PtMass"), jet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtV0PtLambdaMasses"), jet.pt(), v0.pt(), massDiff, massRatio, massRelDiff, weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtV0PtRadiusCosPA"), jet.pt(), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtV0PtDCAposneg"), jet.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtV0PtDCAd"), jet.pt(), v0.pt(), v0.dcaV0daughters(), weight); - - registry.fill(HIST("matching/jets/V0/fakeJetPtV0TrackProjCtau"), jet.pt(), trackProj, ctauK0s, ctauLambda, ctauAntiLambda, weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtV0TrackProjMass"), jet.pt(), trackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtV0TrackProjLambdaMasses"), jet.pt(), trackProj, massDiff, massRatio, massRelDiff, weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtV0TrackProjRadiusCosPA"), jet.pt(), trackProj, v0.v0radius(), v0.v0cosPA(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtV0TrackProjDCAposneg"), jet.pt(), trackProj, v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtV0TrackProjDCAd"), jet.pt(), trackProj, v0.dcaV0daughters(), weight); - - if (v0.isLambdaCandidate()) { - registry.fill(HIST("matching/jets/V0/fakeJetPtLambda0PtEtaPhi"), jet.pt(), v0.pt(), v0.eta(), v0.phi(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtLambda0TrackProj"), jet.pt(), trackProj, weight); - - registry.fill(HIST("matching/jets/V0/fakeJetPtLambda0PtCtau"), jet.pt(), v0.pt(), ctauK0s, ctauLambda, ctauAntiLambda, weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtLambda0PtMass"), jet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtLambda0PtLambdaMasses"), jet.pt(), v0.pt(), massDiff, massRatio, massRelDiff, weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtLambda0PtRadiusCosPA"), jet.pt(), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtLambda0PtDCAposneg"), jet.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtLambda0PtDCAd"), jet.pt(), v0.pt(), v0.dcaV0daughters(), weight); - - registry.fill(HIST("matching/jets/V0/fakeJetPtLambda0TrackProjCtau"), jet.pt(), trackProj, ctauK0s, ctauLambda, ctauAntiLambda, weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtLambda0TrackProjMass"), jet.pt(), trackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtLambda0TrackProjLambdaMasses"), jet.pt(), trackProj, massDiff, massRatio, massRelDiff, weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtLambda0TrackProjRadiusCosPA"), jet.pt(), trackProj, v0.v0radius(), v0.v0cosPA(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtLambda0TrackProjDCAposneg"), jet.pt(), trackProj, v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtLambda0TrackProjDCAd"), jet.pt(), trackProj, v0.dcaV0daughters(), weight); - } - if (v0.isAntiLambdaCandidate()) { - registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambda0PtEtaPhi"), jet.pt(), v0.pt(), v0.eta(), v0.phi(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambda0TrackProj"), jet.pt(), trackProj, weight); - - registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambda0PtCtau"), jet.pt(), v0.pt(), ctauK0s, ctauLambda, ctauAntiLambda, weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambda0PtMass"), jet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambda0PtLambdaMasses"), jet.pt(), v0.pt(), massDiff, massRatio, massRelDiff, weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambda0PtRadiusCosPA"), jet.pt(), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambda0PtDCAposneg"), jet.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambda0PtDCAd"), jet.pt(), v0.pt(), v0.dcaV0daughters(), weight); - - registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambda0TrackProjCtau"), jet.pt(), trackProj, ctauK0s, ctauLambda, ctauAntiLambda, weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambda0TrackProjMass"), jet.pt(), trackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambda0TrackProjLambdaMasses"), jet.pt(), trackProj, massDiff, massRatio, massRelDiff, weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambda0TrackProjRadiusCosPA"), jet.pt(), trackProj, v0.v0radius(), v0.v0cosPA(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambda0TrackProjDCAposneg"), jet.pt(), trackProj, v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambda0TrackProjDCAd"), jet.pt(), trackProj, v0.dcaV0daughters(), weight); - } - if (v0.isK0SCandidate()) { - registry.fill(HIST("matching/jets/V0/fakeJetPtK0SPtEtaPhi"), jet.pt(), v0.pt(), v0.eta(), v0.phi(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtK0STrackProj"), jet.pt(), trackProj, weight); - - registry.fill(HIST("matching/jets/V0/fakeJetPtK0SPtCtau"), jet.pt(), v0.pt(), ctauK0s, ctauLambda, ctauAntiLambda, weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtK0SPtMass"), jet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtK0SPtLambdaMasses"), jet.pt(), v0.pt(), massDiff, massRatio, massRelDiff, weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtK0SPtRadiusCosPA"), jet.pt(), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtK0SPtDCAposneg"), jet.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtK0SPtDCAd"), jet.pt(), v0.pt(), v0.dcaV0daughters(), weight); - - registry.fill(HIST("matching/jets/V0/fakeJetPtK0STrackProjCtau"), jet.pt(), trackProj, ctauK0s, ctauLambda, ctauAntiLambda, weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtK0STrackProjMass"), jet.pt(), trackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtK0STrackProjLambdaMasses"), jet.pt(), trackProj, massDiff, massRatio, massRelDiff, weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtK0STrackProjRadiusCosPA"), jet.pt(), trackProj, v0.v0radius(), v0.v0cosPA(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtK0STrackProjDCAposneg"), jet.pt(), trackProj, v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("matching/jets/V0/fakeJetPtK0STrackProjDCAd"), jet.pt(), trackProj, v0.dcaV0daughters(), weight); - } - } - - // Combinatorial background for inclusive V0s - template - void fillMatchingV0FakeHistograms(T const& coll, U const& v0, double weight = 1.) - { - double ctauLambda = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * constants::physics::MassLambda0; - double ctauAntiLambda = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * constants::physics::MassLambda0Bar; - double ctauK0s = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * constants::physics::MassK0Short; - - registry.fill(HIST("matching/V0/fakeV0PtEtaPhi"), v0.pt(), v0.eta(), v0.phi(), weight); - registry.fill(HIST("matching/V0/fakeV0PtCtau"), v0.pt(), ctauK0s, ctauLambda, ctauAntiLambda, weight); - registry.fill(HIST("matching/V0/fakeV0PtMass"), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("matching/V0/fakeV0PtLambdaMasses"), v0.pt(), v0.mLambda() - v0.mAntiLambda(), v0.mAntiLambda() / v0.mLambda(), (v0.mLambda() - v0.mAntiLambda()) / v0.mLambda(), weight); - registry.fill(HIST("matching/V0/fakeV0PtRadiusCosPA"), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); - registry.fill(HIST("matching/V0/fakeV0PtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("matching/V0/fakeV0PtDCAd"), v0.pt(), v0.dcaV0daughters(), weight); - } - // Check if V0 was missed because daughter decayed - template - void fillMatchingV0DecayedHistograms(V const& v0, double weight = 1.) - { - // Check if decayed daughter - auto posTrack = v0.template posTrack_as(); - auto negTrack = v0.template negTrack_as(); - - auto posPart = posTrack.template mcParticle_as(); - auto negPart = negTrack.template mcParticle_as(); - - auto posMom = posPart.template mothers_first_as(); - auto negMom = negPart.template mothers_first_as(); - - bool posDecayed = false; - bool negDecayed = false; - - // This should not happen. They should have been matched - if (posMom == negMom) { - registry.fill(HIST("matching/V0/nonedecayedFakeV0PtMass"), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - return; - } - - if (posMom.has_mothers()) { - auto posGrandMom = posMom.template mothers_first_as(); - if (posGrandMom == negMom) { - posDecayed = true; - } - } - if (negMom.has_mothers()) { - auto negGrandMom = negMom.template mothers_first_as(); - if (negGrandMom == posMom) { - negDecayed = true; - } - } - - // This shouldn't happen - if (posDecayed && negDecayed) { - registry.fill(HIST("matching/V0/doubledecayedFakeV0PtMass"), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - return; - } - if (posDecayed || negDecayed) { - double pt = posDecayed ? negMom.pt() : posMom.pt(); - int pdg = posDecayed ? negMom.pdgCode() : posMom.pdgCode(); - - if (std::abs(pdg) == 310) { - registry.fill(HIST("matching/V0/decayedK0SV0PtMass"), pt, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - } else if (pdg == 3122) { - registry.fill(HIST("matching/V0/decayedLambdaV0PtMass"), pt, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - } else if (pdg == -3122) { - registry.fill(HIST("matching/V0/decayedAntiLambdaV0PtMass"), pt, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - } else { - registry.fill(HIST("matching/V0/decayedOtherPtV0PtMass"), pt, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - } - } - } - // Check if V0 was missed because daughter decayed - template - void fillMatchingV0DecayedHistograms(V const& partJet, W const& detJet, X const& v0, double weight = 1.) - { - // Check if decayed daughter - auto posTrack = v0.template posTrack_as(); - auto negTrack = v0.template negTrack_as(); - - auto posPart = posTrack.template mcParticle_as(); - auto negPart = negTrack.template mcParticle_as(); - - auto posMom = posPart.template mothers_first_as(); - auto negMom = negPart.template mothers_first_as(); - - bool posDecayed = false; - bool negDecayed = false; - - double zv0 = getMomProj(detJet, v0); - - // This should not happen. They should have been matched - if (posMom == negMom) { - registry.fill(HIST("matching/jets/V0/nonedecayedFakeV0PtMass"), partJet.pt(), detJet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("matching/jets/V0/nonedecayedFakeV0TrackProjMass"), partJet.pt(), detJet.pt(), zv0, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - return; - } - - if (posMom.has_mothers()) { - auto posGrandMom = posMom.template mothers_first_as(); - if (posGrandMom == negMom) { - posDecayed = true; - } - } - if (negMom.has_mothers()) { - auto negGrandMom = negMom.template mothers_first_as(); - if (negGrandMom == posMom) { - negDecayed = true; - } - } - - // This shouldn't happen - if (posDecayed && negDecayed) { - registry.fill(HIST("matching/jets/V0/doubledecayedFakeV0PtMass"), partJet.pt(), detJet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("matching/jets/V0/doubledecayedFakeV0TrackProjMass"), partJet.pt(), detJet.pt(), zv0, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - return; - } - if (posDecayed || negDecayed) { - double pt = posDecayed ? negMom.pt() : posMom.pt(); - int pdg = posDecayed ? negMom.pdgCode() : posMom.pdgCode(); - - double z = 0.; - bool partIsInJet = false; - for (auto const& part : partJet.template tracks_as()) { - if (posDecayed && (part == negMom)) { - partIsInJet = true; - z = getMomProj(partJet, part); - break; - } - if (negDecayed && (part == posMom)) { - partIsInJet = true; - z = getMomProj(partJet, part); - break; - } - } - - if (std::abs(pdg) == 310) { - registry.fill(HIST("matching/jets/V0/decayedK0SV0PtMass"), partJet.pt(), detJet.pt(), pt, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - if (partIsInJet) { - registry.fill(HIST("matching/jets/V0/decayedK0SV0TrackProjMass"), partJet.pt(), detJet.pt(), z, zv0, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - } - } else if (pdg == 3122) { - registry.fill(HIST("matching/jets/V0/decayedLambdaV0PtMass"), partJet.pt(), detJet.pt(), pt, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - if (partIsInJet) { - registry.fill(HIST("matching/jets/V0/decayedLambdaV0TrackProjMass"), partJet.pt(), detJet.pt(), z, zv0, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - } - } else if (pdg == -3122) { - registry.fill(HIST("matching/jets/V0/decayedAntiLambdaV0PtMass"), partJet.pt(), detJet.pt(), pt, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - if (partIsInJet) { - registry.fill(HIST("matching/jets/V0/decayedAntiLambdaV0TrackProjMass"), partJet.pt(), detJet.pt(), z, zv0, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - } - } else { - registry.fill(HIST("matching/jets/V0/decayedOtherPtV0PtMass"), partJet.pt(), detJet.pt(), pt, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - if (partIsInJet) { - registry.fill(HIST("matching/jets/V0/decayedOtherPtV0TrackProjMass"), partJet.pt(), detJet.pt(), z, zv0, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - } - } - } + float nV0s = 0; + for (const auto& pv0 : pV0s) { + int pdg = pv0.pdgCode(); + nV0s += 1; + registry.fill(HIST("mcp/V0/V0PtEtaPhi"), pv0.pt(), pv0.eta(), pv0.phi(), weight); + if (std::abs(pdg) == 310) + registry.fill(HIST("mcp/V0/K0SPtEtaPhi"), pv0.pt(), pv0.eta(), pv0.phi(), weight); + + if (pdg == 3122) + registry.fill(HIST("mcp/V0/LambdaPtEtaPhi"), pv0.pt(), pv0.eta(), pv0.phi(), weight); + + if (pdg == -3122) + registry.fill(HIST("mcp/V0/AntiLambdaPtEtaPhi"), pv0.pt(), pv0.eta(), pv0.phi(), weight); + } + registry.fill(HIST("mcp/V0/nV0sEventAcc"), nV0s); + registry.fill(HIST("mcp/V0/nV0sEventAccWeighted"), nV0s, weight); } - template - void fillMatchingFakeV0DauHistograms(U const& v0, double weight = 1.) - { - auto negTrack = v0.template negTrack_as(); - auto posTrack = v0.template posTrack_as(); - registry.fill(HIST("matching/V0/fakeV0PosTrackPtEtaPhi"), posTrack.pt(), posTrack.eta(), posTrack.phi(), weight); - registry.fill(HIST("matching/V0/fakeV0NegTrackPtEtaPhi"), negTrack.pt(), negTrack.eta(), negTrack.phi(), weight); - } - // Reconstructed signal for inclusive V0s - template - void fillMatchingV0Histograms(CollisionType const& collision, V0Type const& v0, particleType const& particle, double weight = 1.) - { - double ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0; - double ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0Bar; - double ctauK0s = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassK0Short; - - registry.fill(HIST("matching/V0/V0PartPtDetPt"), particle.pt(), v0.pt(), weight); - registry.fill(HIST("matching/V0/V0PartPtRatioPtRelDiffPt"), particle.pt(), v0.pt() / particle.pt(), (v0.pt() - particle.pt()) / particle.pt(), weight); - - if (std::abs(particle.pdgCode()) == 310) { // K0S - registry.fill(HIST("matching/V0/K0SPtEtaPhi"), particle.pt(), v0.pt(), v0.eta(), v0.phi(), weight); - registry.fill(HIST("matching/V0/K0SPtCtauMass"), particle.pt(), v0.pt(), ctauK0s, v0.mK0Short(), weight); - registry.fill(HIST("matching/V0/K0SPtRadiusCosPA"), particle.pt(), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); - registry.fill(HIST("matching/V0/K0SPtDCAposneg"), particle.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("matching/V0/K0SPtDCAd"), particle.pt(), v0.pt(), v0.dcaV0daughters(), weight); - registry.fill(HIST("matching/V0/K0SPtMass"), particle.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - } else if (particle.pdgCode() == 3122) { // Lambda - registry.fill(HIST("matching/V0/LambdaPtEtaPhi"), particle.pt(), v0.pt(), v0.eta(), v0.phi(), weight); - registry.fill(HIST("matching/V0/LambdaPtCtauMass"), particle.pt(), v0.pt(), ctauLambda, v0.mLambda(), weight); - registry.fill(HIST("matching/V0/LambdaPtRadiusCosPA"), particle.pt(), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); - registry.fill(HIST("matching/V0/LambdaPtDCAposneg"), particle.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("matching/V0/LambdaPtDCAd"), particle.pt(), v0.pt(), v0.dcaV0daughters(), weight); - registry.fill(HIST("matching/V0/LambdaPtMass"), particle.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - - // Reflection - double reflectedMass = getReflectedMass(v0, true); - registry.fill(HIST("matching/V0/Lambda0Reflection"), particle.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), reflectedMass, weight); - } else if (particle.pdgCode() == -3122) { // AntiLambda - registry.fill(HIST("matching/V0/antiLambdaPtEtaPhi"), particle.pt(), v0.pt(), v0.eta(), v0.phi(), weight); - registry.fill(HIST("matching/V0/antiLambdaPtCtauMass"), particle.pt(), v0.pt(), ctauAntiLambda, v0.mAntiLambda(), weight); - registry.fill(HIST("matching/V0/antiLambdaPtRadiusCosPA"), particle.pt(), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); - registry.fill(HIST("matching/V0/antiLambdaPtDCAposneg"), particle.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("matching/V0/antiLambdaPtDCAd"), particle.pt(), v0.pt(), v0.dcaV0daughters(), weight); - registry.fill(HIST("matching/V0/antiLambdaPtMass"), particle.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - - // Reflection - double reflectedMass = getReflectedMass(v0, false); - registry.fill(HIST("matching/V0/antiLambda0Reflection"), particle.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), reflectedMass, weight); - } - } - // Reconstructed signal for inclusive V0s: daughters - template - void fillMatchingV0DauHistograms(V0Type const& v0, ParticleType const& /* pv0 */, double weight = 1.) - { - auto negTrack = v0.template negTrack_as(); - auto posTrack = v0.template posTrack_as(); - auto negPart = negTrack.template mcParticle_as(); - auto posPart = posTrack.template mcParticle_as(); - registry.fill(HIST("matching/V0/V0PosPartPtRatioPtRelDiffPt"), posPart.pt(), posTrack.pt() / posPart.pt(), (posTrack.pt() - posPart.pt()) / posPart.pt(), weight); - registry.fill(HIST("matching/V0/V0NegPartPtRatioPtRelDiffPt"), negPart.pt(), negTrack.pt() / negPart.pt(), (negTrack.pt() - negPart.pt()) / negPart.pt(), weight); - } - // Reconstructed signal for in-jet V0s: daughters - template - void fillMatchingV0DauJetHistograms(DetJetType const& detJet, PartJetType const& partJet, V0Type const& v0, ParticleType const& particle, double weight = 1.) - { - auto negTrack = v0.template negTrack_as(); - auto posTrack = v0.template posTrack_as(); - auto negPart = negTrack.template mcParticle_as(); - auto posPart = posTrack.template mcParticle_as(); - registry.fill(HIST("matching/jets/V0/partJetPtDetJetPtPartV0PtPosPtRatioPtRelDiffPt"), partJet.pt(), detJet.pt(), particle.pt(), posPart.pt(), posTrack.pt() / posPart.pt(), (posTrack.pt() - posPart.pt()) / posPart.pt(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtDetJetPtPartV0PtNegPtRatioPtRelDiffPt"), partJet.pt(), detJet.pt(), particle.pt(), negPart.pt(), negTrack.pt() / negPart.pt(), (negTrack.pt() - negPart.pt()) / negPart.pt(), weight); - } - // Reconstructed signal for in-jet V0s - template - void fillMatchingV0FragHistograms(CollisionType const& collision, DetJetType const& detJet, PartJetType const& partJet, V0Type const& v0, ParticleType const& particle, double weight = 1.) - { - double detTrackProj = getMomProj(detJet, v0); - double partTrackProj = getMomProj(partJet, particle); - - double ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0; - double ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0Bar; - double ctauK0s = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassK0Short; - - registry.fill(HIST("matching/jets/V0/matchDetJetPtV0TrackProjPartJetPtV0TrackProj"), detJet.pt(), detTrackProj, partJet.pt(), partTrackProj, weight); - registry.fill(HIST("matching/jets/V0/partJetPtV0PtDetJetPtV0Pt"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtV0PtDetPt"), partJet.pt(), particle.pt(), detJet.pt(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtDetJetPtPartV0PtRatioPtRelDiffPt"), partJet.pt(), detJet.pt(), particle.pt(), v0.pt() / particle.pt(), (v0.pt() - particle.pt()) / particle.pt(), weight); - - registry.fill(HIST("matching/jets/V0/partJetPtV0PtDetJetPtV0PtCtauLambda0"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), ctauLambda, weight); - registry.fill(HIST("matching/jets/V0/partJetPtV0PtDetJetPtV0PtCtauAntiLambda0"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), ctauAntiLambda, weight); - registry.fill(HIST("matching/jets/V0/partJetPtV0PtDetJetPtV0PtCtauK0S"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), ctauK0s, weight); - registry.fill(HIST("matching/jets/V0/partJetPtV0PtDetJetPtV0PtMassLambda0"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mLambda(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtV0PtDetJetPtV0PtMassAntiLambda0"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mAntiLambda(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtV0PtDetJetPtV0PtMassK0S"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mK0Short(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtV0PtDetJetPtV0PtRadius"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.v0radius(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtV0PtDetJetPtV0PtCosPA"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.v0cosPA(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtV0PtDetJetPtV0PtDCAposneg"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtV0PtDetJetPtV0PtDCAd"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.dcaV0daughters(), weight); - - registry.fill(HIST("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjCtauLambda0"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, ctauLambda, weight); - registry.fill(HIST("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjCtauAntiLambda0"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, ctauAntiLambda, weight); - registry.fill(HIST("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjCtauK0S"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, ctauK0s, weight); - registry.fill(HIST("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjMassLambda0"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mLambda(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjMassAntiLambda0"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mAntiLambda(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjMassK0S"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mK0Short(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjRadius"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.v0radius(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjCosPA"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.v0cosPA(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjDCAposneg"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjDCAd"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.dcaV0daughters(), weight); - - if (std::abs(particle.pdgCode()) == 310) { // K0S - registry.fill(HIST("matching/jets/V0/matchDetJetPtK0STrackProjPartJetPtK0STrackProj"), detJet.pt(), detTrackProj, partJet.pt(), partTrackProj, weight); - registry.fill(HIST("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPt"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), weight); - - registry.fill(HIST("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtCtauLambda0"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), ctauLambda, weight); - registry.fill(HIST("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtCtauAntiLambda0"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), ctauAntiLambda, weight); - registry.fill(HIST("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtCtauK0S"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), ctauK0s, weight); - registry.fill(HIST("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtMassLambda0"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mLambda(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtMassAntiLambda0"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mAntiLambda(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtMassK0S"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mK0Short(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtAllMasses"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtRadius"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.v0radius(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtCosPA"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.v0cosPA(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtDCAposneg"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtDCAd"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.dcaV0daughters(), weight); - - registry.fill(HIST("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjCtauLambda0"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, ctauLambda, weight); - registry.fill(HIST("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjCtauAntiLambda0"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, ctauAntiLambda, weight); - registry.fill(HIST("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjCtauK0S"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, ctauK0s, weight); - registry.fill(HIST("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjMassLambda0"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mLambda(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjMassAntiLambda0"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mAntiLambda(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjMassK0S"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mK0Short(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjAllMasses"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjRadius"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.v0radius(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjCosPA"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.v0cosPA(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjDCAposneg"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjDCAd"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.dcaV0daughters(), weight); - } else if (particle.pdgCode() == 3122) { // Lambda - registry.fill(HIST("matching/jets/V0/matchDetJetPtLambda0TrackProjPartJetPtLambda0TrackProj"), detJet.pt(), detTrackProj, partJet.pt(), partTrackProj, weight); - registry.fill(HIST("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0Pt"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), weight); - - registry.fill(HIST("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtCtauLambda0"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), ctauLambda, weight); - registry.fill(HIST("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtCtauAntiLambda0"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), ctauAntiLambda, weight); - registry.fill(HIST("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtCtauK0S"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), ctauK0s, weight); - registry.fill(HIST("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtMassLambda0"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mLambda(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtMassAntiLambda0"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mAntiLambda(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtMassK0S"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mK0Short(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtAllMasses"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtRadius"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.v0radius(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtCosPA"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.v0cosPA(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtDCAposneg"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtDCAd"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.dcaV0daughters(), weight); - - registry.fill(HIST("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjCtauLambda0"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, ctauLambda, weight); - registry.fill(HIST("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjCtauAntiLambda0"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, ctauAntiLambda, weight); - registry.fill(HIST("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjCtauK0S"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, ctauK0s, weight); - registry.fill(HIST("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjMassLambda0"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mLambda(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjMassAntiLambda0"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mAntiLambda(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjMassK0S"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mK0Short(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjAllMasses"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjRadius"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.v0radius(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjCosPA"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.v0cosPA(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjDCAposneg"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjDCAd"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.dcaV0daughters(), weight); - - // Reflection - double reflectedMass = getReflectedMass(v0, true); - registry.fill(HIST("matching/jets/V0/partJetPtLambda0PtDetJetPtLambda0PtLambda0Reflection"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), reflectedMass, weight); - registry.fill(HIST("matching/jets/V0/partJetPtLambda0TrackProjDetJetPtLambda0TrackProjLambda0Reflection"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), reflectedMass, weight); - } else if (particle.pdgCode() == -3122) { // AntiLambda - registry.fill(HIST("matching/jets/V0/matchDetJetPtAntiLambda0TrackProjPartJetPtAntiLambda0TrackProj"), detJet.pt(), detTrackProj, partJet.pt(), partTrackProj, weight); - registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0Pt"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), weight); - - registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtCtauLambda0"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), ctauLambda, weight); - registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtCtauAntiLambda0"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), ctauAntiLambda, weight); - registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtCtauK0S"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), ctauK0s, weight); - registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtMassLambda0"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mLambda(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtMassAntiLambda0"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mAntiLambda(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtMassK0S"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mK0Short(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtAllMasses"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtRadius"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.v0radius(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtCosPA"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.v0cosPA(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtDCAposneg"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtDCAd"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.dcaV0daughters(), weight); - - registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjCtauLambda0"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, ctauLambda, weight); - registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjCtauAntiLambda0"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, ctauAntiLambda, weight); - registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjCtauK0S"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, ctauK0s, weight); - registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjMassLambda0"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mLambda(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjMassAntiLambda0"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mAntiLambda(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjMassK0S"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mK0Short(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjAllMasses"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjRadius"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.v0radius(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjCosPA"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.v0cosPA(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjDCAposneg"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjDCAd"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.dcaV0daughters(), weight); - - // Reflection - double reflectedMass = getReflectedMass(v0, false); - registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0PtDetJetPtAntiLambda0PtAntiLambda0Reflection"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), reflectedMass, weight); - registry.fill(HIST("matching/jets/V0/partJetPtAntiLambda0TrackProjDetJetPtAntiLambda0TrackProjAntiLambda0Reflection"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), reflectedMass, weight); - } // AntiLambda - } - - template - void fillMCDJetHistograms(T const& jet, double weight = 1.) - { - registry.fill(HIST("detector-level/jets/detJetPtEtaPhi"), jet.pt(), jet.eta(), jet.phi(), weight); - } - template // Not used for V0 jets - void fillMCDFragHistograms(Jet const& jet, double weight = 1.) - { - for (const auto& track : jet.template tracks_as()) { - double chargeFrag = -1., trackProj = -1., theta = -1., xi = -1.; - chargeFrag = getFrag(jet, track); - trackProj = getMomProj(jet, track); - theta = getTheta(jet, track); - xi = getXi(jet, track); - - registry.fill(HIST("detector-level/jets/detJetPtTrackPt"), jet.pt(), track.pt(), weight); - registry.fill(HIST("detector-level/jets/detJetTrackPtEtaPhi"), track.pt(), track.eta(), track.phi(), weight); - registry.fill(HIST("detector-level/jets/detJetPtFrag"), jet.pt(), chargeFrag, weight); - registry.fill(HIST("detector-level/jets/detJetPtTrackProj"), jet.pt(), trackProj, weight); - registry.fill(HIST("detector-level/jets/detJetPtXi"), jet.pt(), xi, weight); - registry.fill(HIST("detector-level/jets/detJetPtTheta"), jet.pt(), theta, weight); - registry.fill(HIST("detector-level/jets/detJetPtXiTheta"), jet.pt(), xi, theta, weight); - registry.fill(HIST("detector-level/jets/detJetPtZTheta"), jet.pt(), trackProj, theta, weight); - } - } - template void fillMCPJetHistograms(T const& jet, double weight = 1.) { - registry.fill(HIST("particle-level/jets/partJetPtEtaPhi"), jet.pt(), jet.eta(), jet.phi(), weight); + registry.fill(HIST("mcp/jets/partJetPtEtaPhi"), jet.pt(), jet.eta(), jet.phi(), weight); } - template // Not used for V0 jets - void fillMCPFragHistograms(Jet const& jet, double weight = 1.) - { - for (const auto& track : jet.template tracks_as()) { - double chargeFrag = -1., trackProj = -1., theta = -1., xi = -1.; - chargeFrag = getFrag(jet, track); - trackProj = getMomProj(jet, track); - theta = getTheta(jet, track); - xi = getXi(jet, track); - - registry.fill(HIST("particle-level/jets/partJetPtTrackPt"), jet.pt(), track.pt(), weight); - registry.fill(HIST("particle-level/jets/partJetTrackPtEtaPhi"), track.pt(), track.eta(), track.phi(), weight); - registry.fill(HIST("particle-level/jets/partJetPtFrag"), jet.pt(), chargeFrag, weight); - registry.fill(HIST("particle-level/jets/partJetPtTrackProj"), jet.pt(), trackProj, weight); - registry.fill(HIST("particle-level/jets/partJetPtXi"), jet.pt(), xi, weight); - registry.fill(HIST("particle-level/jets/partJetPtTheta"), jet.pt(), theta, weight); - registry.fill(HIST("particle-level/jets/partJetPtXiTheta"), jet.pt(), xi, theta, weight); - registry.fill(HIST("particle-level/jets/partJetPtZTheta"), jet.pt(), trackProj, theta, weight); - } - } - - template - void fillDataPerpConeHists(T const& coll, U const& jet, V const& v0s, double weight = 1.) + template + void fillMCDV0Histograms(T const& coll, U const& V0s, double weight = 1.) { - double perpConeR = jet.r() * 1e-2; - double conePhi[2] = {RecoDecay::constrainAngle(jet.phi() - constants::math::PIHalf, -constants::math::PI), - RecoDecay::constrainAngle(jet.phi() + constants::math::PIHalf, -constants::math::PI)}; - double conePt[2] = {0., 0.}; - int nV0sinCone[2] = {0, 0}; - for (const auto& v0 : v0s) { - // Need to check if v0 passed jet finder selection/preselector cuts - bool v0InCones = false; - double dEta = v0.eta() - jet.eta(); - double dPhi[2] = {RecoDecay::constrainAngle(v0.phi() - conePhi[0], -constants::math::PI), - RecoDecay::constrainAngle(v0.phi() - conePhi[1], -constants::math::PI)}; - for (int i = 0; i < 2; i++) { - if (std::sqrt(dEta * dEta + dPhi[i] * dPhi[i]) < perpConeR) { - conePt[i] += v0.pt(); - nV0sinCone[i]++; - v0InCones = true; - } - } - if (!v0InCones) { + float nV0s = 0; + for (const auto& v0 : V0s) { + if (v0.isRejectedCandidate()) continue; - } + nV0s += 1; double ctauLambda = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * constants::physics::MassLambda0; double ctauAntiLambda = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * constants::physics::MassLambda0Bar; double ctauK0s = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * constants::physics::MassK0Short; - registry.fill(HIST("data/PC/JetPtEtaV0Pt"), jet.pt(), jet.eta(), v0.pt(), weight); - registry.fill(HIST("data/PC/V0PtEtaPhi"), v0.pt(), v0.eta(), v0.phi(), weight); - registry.fill(HIST("data/PC/V0PtCtau"), v0.pt(), ctauK0s, ctauLambda, ctauAntiLambda, weight); - registry.fill(HIST("data/PC/V0PtMass"), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("data/PC/V0PtMassWide"), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); - registry.fill(HIST("data/PC/V0PtRadiusCosPA"), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); - registry.fill(HIST("data/PC/V0PtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("data/PC/V0PtDCAd"), v0.pt(), v0.dcaV0daughters(), weight); + double massDiff = v0.mLambda() - v0.mAntiLambda(); + double massRatio = v0.mAntiLambda() / v0.mLambda(); + double massRelDiff = (v0.mLambda() - v0.mAntiLambda()) / v0.mLambda(); + + registry.fill(HIST("mcd/V0/V0PtEtaPhi"), v0.pt(), v0.eta(), v0.phi(), weight); + registry.fill(HIST("mcd/V0/V0PtCtau"), v0.pt(), ctauK0s, ctauLambda, ctauAntiLambda, weight); + registry.fill(HIST("mcd/V0/V0PtMass"), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + registry.fill(HIST("mcd/V0/V0PtLambdaMasses"), v0.pt(), v0.mLambda() - v0.mAntiLambda(), v0.mAntiLambda() / v0.mLambda(), (v0.mLambda() - v0.mAntiLambda()) / v0.mLambda(), weight); + registry.fill(HIST("mcd/V0/V0PtRadiusCosPA"), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); + registry.fill(HIST("mcd/V0/V0PtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("mcd/V0/V0PtDCAd"), v0.pt(), v0.dcaV0daughters(), weight); + if (v0.isK0SCandidate()) { + registry.fill(HIST("mcd/V0/K0SPtEtaPhi"), v0.pt(), v0.eta(), v0.phi(), weight); + registry.fill(HIST("mcd/V0/K0SPtRadiusCosPA"), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); + registry.fill(HIST("mcd/V0/K0SPtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("mcd/V0/K0SPtDCAd"), v0.pt(), v0.dcaV0daughters(), weight); + + registry.fill(HIST("mcd/V0/K0SPtCtauMass"), v0.pt(), ctauK0s, v0.mK0Short(), weight); + registry.fill(HIST("mcd/V0/K0SPtRadiusMass"), v0.pt(), v0.v0radius(), v0.mK0Short(), weight); + registry.fill(HIST("mcd/V0/K0SPtCosPAMass"), v0.pt(), v0.v0cosPA(), v0.mK0Short(), weight); + registry.fill(HIST("mcd/V0/K0SPtDCAposMass"), v0.pt(), v0.dcapostopv(), v0.mK0Short(), weight); + registry.fill(HIST("mcd/V0/K0SPtDCAnegMass"), v0.pt(), v0.dcanegtopv(), v0.mK0Short(), weight); + registry.fill(HIST("mcd/V0/K0SPtDCAdMass"), v0.pt(), v0.dcaV0daughters(), v0.mK0Short(), weight); + } if (v0.isLambdaCandidate()) { - registry.fill(HIST("data/PC/JetPtLambda0PtMass"), jet.pt(), v0.pt(), v0.mLambda(), weight); - - registry.fill(HIST("data/PC/JetPtEtaLambda0Pt"), jet.pt(), jet.eta(), v0.pt(), weight); - registry.fill(HIST("data/PC/LambdaPtEtaPhi"), v0.pt(), v0.eta(), v0.phi(), weight); - registry.fill(HIST("data/PC/LambdaPtCtauMass"), v0.pt(), ctauLambda, v0.mLambda(), weight); - registry.fill(HIST("data/PC/LambdaPtRadiusCosPA"), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); - registry.fill(HIST("data/PC/LambdaPtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("data/PC/LambdaPtDCAd"), v0.pt(), v0.dcaV0daughters(), weight); + registry.fill(HIST("mcd/V0/LambdaPtEtaPhi"), v0.pt(), v0.eta(), v0.phi(), weight); + registry.fill(HIST("mcd/V0/LambdaPtLambdaMasses"), v0.pt(), massDiff, massRatio, massRelDiff, weight); + registry.fill(HIST("mcd/V0/LambdaPtRadiusCosPA"), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); + registry.fill(HIST("mcd/V0/LambdaPtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("mcd/V0/LambdaPtDCAd"), v0.pt(), v0.dcaV0daughters(), weight); + + registry.fill(HIST("mcd/V0/LambdaPtCtauMass"), v0.pt(), ctauLambda, v0.mLambda(), weight); + registry.fill(HIST("mcd/V0/LambdaPtRadiusMass"), v0.pt(), v0.v0radius(), v0.mLambda(), weight); + registry.fill(HIST("mcd/V0/LambdaPtCosPAMass"), v0.pt(), v0.v0cosPA(), v0.mLambda(), weight); + registry.fill(HIST("mcd/V0/LambdaPtDCAposMass"), v0.pt(), v0.dcapostopv(), v0.mLambda(), weight); + registry.fill(HIST("mcd/V0/LambdaPtDCAnegMass"), v0.pt(), v0.dcanegtopv(), v0.mLambda(), weight); + registry.fill(HIST("mcd/V0/LambdaPtDCAdMass"), v0.pt(), v0.dcaV0daughters(), v0.mLambda(), weight); } if (v0.isAntiLambdaCandidate()) { - registry.fill(HIST("data/PC/JetPtAntiLambda0PtMass"), jet.pt(), v0.pt(), v0.mAntiLambda(), weight); - - registry.fill(HIST("data/PC/JetPtEtaAntiLambda0Pt"), jet.pt(), jet.eta(), v0.pt(), weight); - registry.fill(HIST("data/PC/antiLambdaPtEtaPhi"), v0.pt(), v0.eta(), v0.phi(), weight); - registry.fill(HIST("data/PC/antiLambdaPtCtauMass"), v0.pt(), ctauAntiLambda, v0.mAntiLambda(), weight); - registry.fill(HIST("data/PC/antiLambdaPtRadiusCosPA"), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); - registry.fill(HIST("data/PC/antiLambdaPtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("data/PC/antiLambdaPtDCAd"), v0.pt(), v0.dcaV0daughters(), weight); - } - if (v0.isK0SCandidate()) { - registry.fill(HIST("data/PC/JetPtK0SPtMass"), jet.pt(), v0.pt(), v0.mK0Short(), weight); - - registry.fill(HIST("data/PC/JetPtEtaK0SPt"), jet.pt(), jet.eta(), v0.pt(), weight); - registry.fill(HIST("data/PC/K0SPtEtaPhi"), v0.pt(), v0.eta(), v0.phi(), weight); - registry.fill(HIST("data/PC/K0SPtCtauMass"), v0.pt(), ctauK0s, v0.mK0Short(), weight); - registry.fill(HIST("data/PC/K0SPtRadiusCosPA"), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); - registry.fill(HIST("data/PC/K0SPtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); - registry.fill(HIST("data/PC/K0SPtDCAd"), v0.pt(), v0.dcaV0daughters(), weight); + registry.fill(HIST("mcd/V0/AntiLambdaPtEtaPhi"), v0.pt(), v0.eta(), v0.phi(), weight); + registry.fill(HIST("mcd/V0/AntiLambdaPtLambdaMasses"), v0.pt(), massDiff, massRatio, massRelDiff, weight); + registry.fill(HIST("mcd/V0/AntiLambdaPtRadiusCosPA"), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); + registry.fill(HIST("mcd/V0/AntiLambdaPtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("mcd/V0/AntiLambdaPtDCAd"), v0.pt(), v0.dcaV0daughters(), weight); + + registry.fill(HIST("mcd/V0/AntiLambdaPtCtauMass"), v0.pt(), ctauAntiLambda, v0.mAntiLambda(), weight); + registry.fill(HIST("mcd/V0/AntiLambdaPtRadiusMass"), v0.pt(), v0.v0radius(), v0.mAntiLambda(), weight); + registry.fill(HIST("mcd/V0/AntiLambdaPtCosPAMass"), v0.pt(), v0.v0cosPA(), v0.mAntiLambda(), weight); + registry.fill(HIST("mcd/V0/AntiLambdaPtDCAposMass"), v0.pt(), v0.dcapostopv(), v0.mAntiLambda(), weight); + registry.fill(HIST("mcd/V0/AntiLambdaPtDCAnegMass"), v0.pt(), v0.dcanegtopv(), v0.mAntiLambda(), weight); + registry.fill(HIST("mcd/V0/AntiLambdaPtDCAdMass"), v0.pt(), v0.dcaV0daughters(), v0.mAntiLambda(), weight); } - } - // Fill hist for Ncones: nv0s, conePt, coneEta, conePhi - for (int i = 0; i < 2; i++) { - registry.fill(HIST("data/PC/nV0sConePtEta"), nV0sinCone[i], conePt[i], jet.eta(), weight); - registry.fill(HIST("data/PC/ConePtEtaPhi"), conePt[i], jet.eta(), conePhi[i], weight); - registry.fill(HIST("data/PC/JetPtEtaConePt"), jet.pt(), jet.eta(), conePt[i], weight); - } + } // for v0 + registry.fill(HIST("mcd/V0/nV0sEventAcc"), nV0s); + registry.fill(HIST("mcd/V0/nV0sEventAccWeighted"), nV0s, weight); + } + template + void fillMCDJetHistograms(T const& jet, double weight = 1.) + { + registry.fill(HIST("mcd/jets/detJetPtEtaPhi"), jet.pt(), jet.eta(), jet.phi(), weight); } - - // Version for MCD jets + // Reconstructed V0s in the cone of MCD jets template void fillMcPerpConeHists(T const& coll, U const& mcdjet, V const& v0s, W const& /* V0 particles */, double weight = 1.) { @@ -2144,9 +1911,9 @@ struct JetFragmentation { if (std::abs(particle.pdgCode()) == 310) { // K0S registry.fill(HIST("mcd/PC/matchedJetPtK0SPtMass"), mcdjet.pt(), v0.pt(), v0.mK0Short(), weight); } else if (particle.pdgCode() == 3122) { // Lambda - registry.fill(HIST("mcd/PC/matchedJetPtLambda0PtMass"), mcdjet.pt(), v0.pt(), v0.mLambda(), weight); + registry.fill(HIST("mcd/PC/matchedJetPtLambdaPtMass"), mcdjet.pt(), v0.pt(), v0.mLambda(), weight); } else if (particle.pdgCode() == -3122) { - registry.fill(HIST("mcd/PC/matchedJetPtAntiLambda0PtMass"), mcdjet.pt(), v0.pt(), v0.mAntiLambda(), weight); + registry.fill(HIST("mcd/PC/matchedJetPtAntiLambdaPtMass"), mcdjet.pt(), v0.pt(), v0.mAntiLambda(), weight); } } // if v0 has mcParticle } // for cone @@ -2161,7 +1928,7 @@ struct JetFragmentation { registry.fill(HIST("mcd/PC/fakeJetPtEtaConePt"), mcdjet.pt(), mcdjet.eta(), coneFakePt[i], weight); } } - // Version for matched jets + // Reconstructed V0s in the cone of matched jets template void fillMcPerpConeHists(T const& coll, U const& mcdjet, V const& mcpjet, W const& v0s, X const& /* V0 particles */, double weight = 1.) { @@ -2216,11 +1983,11 @@ struct JetFragmentation { registry.fill(HIST("matching/PC/matchedJetPtK0SPtMass"), mcdjet.pt(), v0.pt(), v0.mK0Short(), weight); registry.fill(HIST("matching/PC/matchedJetsPtK0SPtMass"), mcpjet.pt(), mcdjet.pt(), v0.pt(), v0.mK0Short(), weight); } else if (particle.pdgCode() == 3122) { // Lambda - registry.fill(HIST("matching/PC/matchedJetPtLambda0PtMass"), mcdjet.pt(), v0.pt(), v0.mLambda(), weight); - registry.fill(HIST("matching/PC/matchedJetsPtLambda0PtMass"), mcpjet.pt(), mcdjet.pt(), v0.pt(), v0.mLambda(), weight); + registry.fill(HIST("matching/PC/matchedJetPtLambdaPtMass"), mcdjet.pt(), v0.pt(), v0.mLambda(), weight); + registry.fill(HIST("matching/PC/matchedJetsPtLambdaPtMass"), mcpjet.pt(), mcdjet.pt(), v0.pt(), v0.mLambda(), weight); } else if (particle.pdgCode() == -3122) { - registry.fill(HIST("matching/PC/matchedJetPtAntiLambda0PtMass"), mcdjet.pt(), v0.pt(), v0.mAntiLambda(), weight); - registry.fill(HIST("matching/PC/matchedJetsPtAntiLambda0PtMass"), mcpjet.pt(), mcdjet.pt(), v0.pt(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/PC/matchedJetPtAntiLambdaPtMass"), mcdjet.pt(), v0.pt(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/PC/matchedJetsPtAntiLambdaPtMass"), mcpjet.pt(), mcdjet.pt(), v0.pt(), v0.mAntiLambda(), weight); } } // if v0 has mcParticle } // for cone @@ -2237,534 +2004,672 @@ struct JetFragmentation { registry.fill(HIST("matching/PC/fakeJetsPtEtaConePt"), mcpjet.pt(), mcdjet.pt(), mcdjet.eta(), coneFakePt[i], weight); } } + // Matched - Counts (or event weights) + template // Reconstructed signal for inclusive V0s + void fillMatchingV0Histograms(CollisionType const& collision, V0Type const& v0, particleType const& particle, double weight = 1.) + { + double ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0; + double ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0Bar; + double ctauK0s = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassK0Short; - void processDummy(aod::JetTracks const&) {} - PROCESS_SWITCH(JetFragmentation, processDummy, "Dummy process function turned on by default", true); + registry.fill(HIST("matching/V0/V0PartPtDetPt"), particle.pt(), v0.pt(), weight); + registry.fill(HIST("matching/V0/V0PartPtRatioPtRelDiffPt"), particle.pt(), v0.pt() / particle.pt(), (v0.pt() - particle.pt()) / particle.pt(), weight); + + if (std::abs(particle.pdgCode()) == 310) { // K0S + registry.fill(HIST("matching/V0/K0SPtEtaPhi"), particle.pt(), v0.pt(), v0.eta(), v0.phi(), weight); + registry.fill(HIST("matching/V0/K0SPtCtauMass"), particle.pt(), v0.pt(), ctauK0s, v0.mK0Short(), weight); + registry.fill(HIST("matching/V0/K0SPtRadiusCosPA"), particle.pt(), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); + registry.fill(HIST("matching/V0/K0SPtDCAposneg"), particle.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("matching/V0/K0SPtDCAd"), particle.pt(), v0.pt(), v0.dcaV0daughters(), weight); + registry.fill(HIST("matching/V0/K0SPtMass"), particle.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + } else if (particle.pdgCode() == 3122) { // Lambda + registry.fill(HIST("matching/V0/LambdaPtEtaPhi"), particle.pt(), v0.pt(), v0.eta(), v0.phi(), weight); + registry.fill(HIST("matching/V0/LambdaPtCtauMass"), particle.pt(), v0.pt(), ctauLambda, v0.mLambda(), weight); + registry.fill(HIST("matching/V0/LambdaPtRadiusCosPA"), particle.pt(), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); + registry.fill(HIST("matching/V0/LambdaPtDCAposneg"), particle.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("matching/V0/LambdaPtDCAd"), particle.pt(), v0.pt(), v0.dcaV0daughters(), weight); + registry.fill(HIST("matching/V0/LambdaPtMass"), particle.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + + // Reflection + double reflectedMass = getReflectedMass(v0, true); + registry.fill(HIST("matching/V0/LambdaReflection"), particle.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), reflectedMass, weight); + } else if (particle.pdgCode() == -3122) { // AntiLambda + registry.fill(HIST("matching/V0/AntiLambdaPtEtaPhi"), particle.pt(), v0.pt(), v0.eta(), v0.phi(), weight); + registry.fill(HIST("matching/V0/AntiLambdaPtCtauMass"), particle.pt(), v0.pt(), ctauAntiLambda, v0.mAntiLambda(), weight); + registry.fill(HIST("matching/V0/AntiLambdaPtRadiusCosPA"), particle.pt(), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); + registry.fill(HIST("matching/V0/AntiLambdaPtDCAposneg"), particle.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("matching/V0/AntiLambdaPtDCAd"), particle.pt(), v0.pt(), v0.dcaV0daughters(), weight); + registry.fill(HIST("matching/V0/AntiLambdaPtMass"), particle.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + + // Reflection + double reflectedMass = getReflectedMass(v0, false); + registry.fill(HIST("matching/V0/AntiLambdaReflection"), particle.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), reflectedMass, weight); + } + } + template // Reconstructed signal for inclusive V0s: daughters + void fillMatchingV0DauHistograms(V0Type const& v0, ParticleType const& pv0, double weight = 1.) + { + auto negTrack = v0.template negTrack_as(); + auto posTrack = v0.template posTrack_as(); + auto negPart = negTrack.template mcParticle_as(); + auto posPart = posTrack.template mcParticle_as(); + registry.fill(HIST("matching/V0/V0PosPartPtRatioPtRelDiffPt"), posPart.pt(), posTrack.pt() / posPart.pt(), (posTrack.pt() - posPart.pt()) / posPart.pt(), weight); + registry.fill(HIST("matching/V0/V0NegPartPtRatioPtRelDiffPt"), negPart.pt(), negTrack.pt() / negPart.pt(), (negTrack.pt() - negPart.pt()) / negPart.pt(), weight); - void processMcD(soa::Filtered::iterator const& collision, - aod::JetMcCollisions const&, - MCDJetsWithConstituents const&, - aod::JetTracks const& tracks) + if (std::abs(v0.pdgCode()) == 310) { // K0S + registry.fill(HIST("matching/V0/K0SPosNegPtMass"), pv0.pt(), posPart.pt(), negPart.pt(), v0.mK0Short(), weight); + } else if (v0.pdgCode() == 3122) { // Lambda + registry.fill(HIST("matching/V0/LambdaPosNegPtMass"), pv0.pt(), posPart.pt(), negPart.pt(), v0.mLambda(), weight); + } else if (v0.pdgCode() == -3122) { // AntiLambda + registry.fill(HIST("matching/V0/AntiLambdaPosNegPtMass"), pv0.pt(), posPart.pt(), negPart.pt(), v0.mAntiLambda(), weight); + } + } + template // Reconstructed jets + void fillMatchingHistogramsJet(DetJet const& detJet, PartJet const& partJet, double weight = 1.) { - if (!collision.has_mcCollision()) { - return; + double deltaEta = detJet.eta() - partJet.eta(); + double deltaPhi = RecoDecay::constrainAngle(detJet.phi() - partJet.phi(), -constants::math::PI); + double dR = jetutilities::deltaR(detJet, partJet); + + registry.fill(HIST("matching/jets/matchDetJetPtEtaPhi"), detJet.pt(), detJet.eta(), detJet.phi(), weight); + registry.fill(HIST("matching/jets/matchPartJetPtEtaPhi"), partJet.pt(), partJet.eta(), partJet.phi(), weight); + registry.fill(HIST("matching/jets/matchPartJetPtEtaPhiMatchDist"), partJet.pt(), partJet.eta(), partJet.phi(), dR, weight); + registry.fill(HIST("matching/jets/matchPartJetPtEnergyScale"), partJet.pt(), detJet.pt() / partJet.pt(), weight); + registry.fill(HIST("matching/jets/matchDetJetPtPartJetPt"), detJet.pt(), partJet.pt(), weight); + registry.fill(HIST("matching/jets/matchPartJetPtDetJetEtaPartJetEta"), partJet.pt(), detJet.eta(), partJet.eta(), weight); + registry.fill(HIST("matching/jets/matchPartJetPtDetJetPhiPartJetPhi"), partJet.pt(), detJet.phi(), partJet.phi(), weight); + registry.fill(HIST("matching/jets/matchPartJetPtResolutionPt"), partJet.pt(), (detJet.pt() - partJet.pt()), weight); + registry.fill(HIST("matching/jets/matchPartJetPtResolutionEta"), partJet.pt(), partJet.eta(), deltaEta, weight); + registry.fill(HIST("matching/jets/matchPartJetPtResolutionPhi"), partJet.pt(), partJet.phi(), deltaPhi, weight); + registry.fill(HIST("matching/jets/matchPartJetPtRelDiffPt"), partJet.pt(), (detJet.pt() - partJet.pt()) / partJet.pt(), weight); + } + template // Reconstructed signal for in-jet V0s + void fillMatchingV0FragHistograms(CollisionType const& collision, DetJetType const& detJet, PartJetType const& partJet, V0Type const& v0, ParticleType const& particle, double weight = 1.) + { + double detTrackProj = getMomFrac(detJet, v0); + double partTrackProj = getMomFrac(partJet, particle); + + double ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0; + double ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0Bar; + double ctauK0s = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassK0Short; + + registry.fill(HIST("matching/jets/V0/matchDetJetPtV0TrackProjPartJetPtV0TrackProj"), detJet.pt(), detTrackProj, partJet.pt(), partTrackProj, weight); + registry.fill(HIST("matching/jets/V0/partJetPtV0PtDetJetPtV0Pt"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtV0PtDetPt"), partJet.pt(), particle.pt(), detJet.pt(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtDetJetPtPartV0PtRatioPtRelDiffPt"), partJet.pt(), detJet.pt(), particle.pt(), v0.pt() / particle.pt(), (v0.pt() - particle.pt()) / particle.pt(), weight); + + registry.fill(HIST("matching/jets/V0/partJetPtV0PtDetJetPtV0PtCtauLambda"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), ctauLambda, weight); + registry.fill(HIST("matching/jets/V0/partJetPtV0PtDetJetPtV0PtCtauAntiLambda"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), ctauAntiLambda, weight); + registry.fill(HIST("matching/jets/V0/partJetPtV0PtDetJetPtV0PtCtauK0S"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), ctauK0s, weight); + registry.fill(HIST("matching/jets/V0/partJetPtV0PtDetJetPtV0PtMassLambda"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mLambda(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtV0PtDetJetPtV0PtMassAntiLambda"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtV0PtDetJetPtV0PtMassK0S"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mK0Short(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtV0PtDetJetPtV0PtRadius"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.v0radius(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtV0PtDetJetPtV0PtCosPA"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.v0cosPA(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtV0PtDetJetPtV0PtDCAposneg"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtV0PtDetJetPtV0PtDCAd"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.dcaV0daughters(), weight); + + registry.fill(HIST("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjCtauLambda"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, ctauLambda, weight); + registry.fill(HIST("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjCtauAntiLambda"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, ctauAntiLambda, weight); + registry.fill(HIST("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjCtauK0S"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, ctauK0s, weight); + registry.fill(HIST("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjMassLambda"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mLambda(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjMassAntiLambda"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mAntiLambda(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjMassK0S"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mK0Short(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjRadius"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.v0radius(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjCosPA"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.v0cosPA(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjDCAposneg"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtV0TrackProjDetJetPtV0TrackProjDCAd"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.dcaV0daughters(), weight); + + if (std::abs(particle.pdgCode()) == 310) { // K0S + registry.fill(HIST("matching/jets/V0/matchDetJetPtK0STrackProjPartJetPtK0STrackProj"), detJet.pt(), detTrackProj, partJet.pt(), partTrackProj, weight); + registry.fill(HIST("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPt"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), weight); + + registry.fill(HIST("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtCtauLambda"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), ctauLambda, weight); + registry.fill(HIST("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtCtauAntiLambda"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), ctauAntiLambda, weight); + registry.fill(HIST("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtCtauK0S"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), ctauK0s, weight); + registry.fill(HIST("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtMassLambda"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mLambda(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtMassAntiLambda"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtMassK0S"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mK0Short(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtAllMasses"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtRadius"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.v0radius(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtCosPA"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.v0cosPA(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtDCAposneg"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtK0SPtDetJetPtK0SPtDCAd"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.dcaV0daughters(), weight); + + registry.fill(HIST("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjCtauLambda"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, ctauLambda, weight); + registry.fill(HIST("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjCtauAntiLambda"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, ctauAntiLambda, weight); + registry.fill(HIST("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjCtauK0S"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, ctauK0s, weight); + registry.fill(HIST("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjMassLambda"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mLambda(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjMassAntiLambda"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mAntiLambda(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjMassK0S"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mK0Short(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjAllMasses"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjRadius"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.v0radius(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjCosPA"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.v0cosPA(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjDCAposneg"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtK0STrackProjDetJetPtK0STrackProjDCAd"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.dcaV0daughters(), weight); + } else if (particle.pdgCode() == 3122) { // Lambda + registry.fill(HIST("matching/jets/V0/matchDetJetPtLambdaTrackProjPartJetPtLambdaTrackProj"), detJet.pt(), detTrackProj, partJet.pt(), partTrackProj, weight); + registry.fill(HIST("matching/jets/V0/partJetPtLambdaPtDetJetPtLambdaPt"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), weight); + + registry.fill(HIST("matching/jets/V0/partJetPtLambdaPtDetJetPtLambdaPtCtauLambda"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), ctauLambda, weight); + registry.fill(HIST("matching/jets/V0/partJetPtLambdaPtDetJetPtLambdaPtCtauAntiLambda"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), ctauAntiLambda, weight); + registry.fill(HIST("matching/jets/V0/partJetPtLambdaPtDetJetPtLambdaPtCtauK0S"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), ctauK0s, weight); + registry.fill(HIST("matching/jets/V0/partJetPtLambdaPtDetJetPtLambdaPtMassLambda"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mLambda(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtLambdaPtDetJetPtLambdaPtMassAntiLambda"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtLambdaPtDetJetPtLambdaPtMassK0S"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mK0Short(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtLambdaPtDetJetPtLambdaPtAllMasses"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtLambdaPtDetJetPtLambdaPtRadius"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.v0radius(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtLambdaPtDetJetPtLambdaPtCosPA"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.v0cosPA(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtLambdaPtDetJetPtLambdaPtDCAposneg"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtLambdaPtDetJetPtLambdaPtDCAd"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.dcaV0daughters(), weight); + + registry.fill(HIST("matching/jets/V0/partJetPtLambdaTrackProjDetJetPtLambdaTrackProjCtauLambda"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, ctauLambda, weight); + registry.fill(HIST("matching/jets/V0/partJetPtLambdaTrackProjDetJetPtLambdaTrackProjCtauAntiLambda"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, ctauAntiLambda, weight); + registry.fill(HIST("matching/jets/V0/partJetPtLambdaTrackProjDetJetPtLambdaTrackProjCtauK0S"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, ctauK0s, weight); + registry.fill(HIST("matching/jets/V0/partJetPtLambdaTrackProjDetJetPtLambdaTrackProjMassLambda"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mLambda(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtLambdaTrackProjDetJetPtLambdaTrackProjMassAntiLambda"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mAntiLambda(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtLambdaTrackProjDetJetPtLambdaTrackProjMassK0S"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mK0Short(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtLambdaTrackProjDetJetPtLambdaTrackProjAllMasses"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtLambdaTrackProjDetJetPtLambdaTrackProjRadius"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.v0radius(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtLambdaTrackProjDetJetPtLambdaTrackProjCosPA"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.v0cosPA(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtLambdaTrackProjDetJetPtLambdaTrackProjDCAposneg"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtLambdaTrackProjDetJetPtLambdaTrackProjDCAd"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.dcaV0daughters(), weight); + + // Reflection + double reflectedMass = getReflectedMass(v0, true); + registry.fill(HIST("matching/jets/V0/partJetPtLambdaPtDetJetPtLambdaPtLambdaReflection"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), reflectedMass, weight); + registry.fill(HIST("matching/jets/V0/partJetPtLambdaTrackProjDetJetPtLambdaTrackProjLambdaReflection"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), reflectedMass, weight); + } else if (particle.pdgCode() == -3122) { // AntiLambda + registry.fill(HIST("matching/jets/V0/matchDetJetPtAntiLambdaTrackProjPartJetPtAntiLambdaTrackProj"), detJet.pt(), detTrackProj, partJet.pt(), partTrackProj, weight); + registry.fill(HIST("matching/jets/V0/partJetPtAntiLambdaPtDetJetPtAntiLambdaPt"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), weight); + + registry.fill(HIST("matching/jets/V0/partJetPtAntiLambdaPtDetJetPtAntiLambdaPtCtauLambda"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), ctauLambda, weight); + registry.fill(HIST("matching/jets/V0/partJetPtAntiLambdaPtDetJetPtAntiLambdaPtCtauAntiLambda"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), ctauAntiLambda, weight); + registry.fill(HIST("matching/jets/V0/partJetPtAntiLambdaPtDetJetPtAntiLambdaPtCtauK0S"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), ctauK0s, weight); + registry.fill(HIST("matching/jets/V0/partJetPtAntiLambdaPtDetJetPtAntiLambdaPtMassLambda"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mLambda(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtAntiLambdaPtDetJetPtAntiLambdaPtMassAntiLambda"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtAntiLambdaPtDetJetPtAntiLambdaPtMassK0S"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mK0Short(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtAntiLambdaPtDetJetPtAntiLambdaPtAllMasses"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtAntiLambdaPtDetJetPtAntiLambdaPtRadius"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.v0radius(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtAntiLambdaPtDetJetPtAntiLambdaPtCosPA"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.v0cosPA(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtAntiLambdaPtDetJetPtAntiLambdaPtDCAposneg"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtAntiLambdaPtDetJetPtAntiLambdaPtDCAd"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.dcaV0daughters(), weight); + + registry.fill(HIST("matching/jets/V0/partJetPtAntiLambdaTrackProjDetJetPtAntiLambdaTrackProjCtauLambda"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, ctauLambda, weight); + registry.fill(HIST("matching/jets/V0/partJetPtAntiLambdaTrackProjDetJetPtAntiLambdaTrackProjCtauAntiLambda"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, ctauAntiLambda, weight); + registry.fill(HIST("matching/jets/V0/partJetPtAntiLambdaTrackProjDetJetPtAntiLambdaTrackProjCtauK0S"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, ctauK0s, weight); + registry.fill(HIST("matching/jets/V0/partJetPtAntiLambdaTrackProjDetJetPtAntiLambdaTrackProjMassLambda"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mLambda(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtAntiLambdaTrackProjDetJetPtAntiLambdaTrackProjMassAntiLambda"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mAntiLambda(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtAntiLambdaTrackProjDetJetPtAntiLambdaTrackProjMassK0S"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mK0Short(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtAntiLambdaTrackProjDetJetPtAntiLambdaTrackProjAllMasses"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtAntiLambdaTrackProjDetJetPtAntiLambdaTrackProjRadius"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.v0radius(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtAntiLambdaTrackProjDetJetPtAntiLambdaTrackProjCosPA"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.v0cosPA(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtAntiLambdaTrackProjDetJetPtAntiLambdaTrackProjDCAposneg"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtAntiLambdaTrackProjDetJetPtAntiLambdaTrackProjDCAd"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.dcaV0daughters(), weight); + + // Reflection + double reflectedMass = getReflectedMass(v0, false); + registry.fill(HIST("matching/jets/V0/partJetPtAntiLambdaPtDetJetPtAntiLambdaPtAntiLambdaReflection"), partJet.pt(), particle.pt(), detJet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), reflectedMass, weight); + registry.fill(HIST("matching/jets/V0/partJetPtAntiLambdaTrackProjDetJetPtAntiLambdaTrackProjAntiLambdaReflection"), partJet.pt(), partTrackProj, detJet.pt(), detTrackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), reflectedMass, weight); + } // AntiLambda + } + template // Reconstructed signal for in-jet V0s: daughters + void fillMatchingV0DauJetHistograms(DetJetType const& detJet, PartJetType const& partJet, V0Type const& v0, ParticleType const& particle, double weight = 1.) + { + auto negTrack = v0.template negTrack_as(); + auto posTrack = v0.template posTrack_as(); + auto negPart = negTrack.template mcParticle_as(); + auto posPart = posTrack.template mcParticle_as(); + registry.fill(HIST("matching/jets/V0/partJetPtDetJetPtPartV0PtPosPtRatioPtRelDiffPt"), partJet.pt(), detJet.pt(), particle.pt(), posPart.pt(), posTrack.pt() / posPart.pt(), (posTrack.pt() - posPart.pt()) / posPart.pt(), weight); + registry.fill(HIST("matching/jets/V0/partJetPtDetJetPtPartV0PtNegPtRatioPtRelDiffPt"), partJet.pt(), detJet.pt(), particle.pt(), negPart.pt(), negTrack.pt() / negPart.pt(), (negTrack.pt() - negPart.pt()) / negPart.pt(), weight); + } + // Misses - Counts (or event weights) + template // Missed inclusive V0s + void fillMatchingMissV0Histograms(T const& pv0, double weight = 1.) + { + int pdg = pv0.pdgCode(); + registry.fill(HIST("matching/V0/missV0PtEtaPhi"), pv0.pt(), pv0.eta(), pv0.phi(), weight); + if (std::abs(pdg) == 310) { // K0S + registry.fill(HIST("matching/V0/missK0SPtEtaPhi"), pv0.pt(), pv0.eta(), pv0.phi(), weight); + } else if (pdg == 3122) { // Lambda + registry.fill(HIST("matching/V0/missLambdaPtEtaPhi"), pv0.pt(), pv0.eta(), pv0.phi(), weight); + } else if (pdg == -3122) { // AntiLambda + registry.fill(HIST("matching/V0/missAntiLambdaPtEtaPhi"), pv0.pt(), pv0.eta(), pv0.phi(), weight); + } + } + template // Missed V0s in jets + void fillMatchingV0Miss(JetType const& jet, V0Type const& v0, double weight = 1.) + { + double trackProj = getMomFrac(jet, v0); + + registry.fill(HIST("matching/jets/V0/missJetPtV0TrackProj"), jet.pt(), trackProj, weight); + registry.fill(HIST("matching/jets/V0/missJetPtV0PtEtaPhi"), jet.pt(), v0.pt(), v0.eta(), v0.phi(), weight); + if (std::abs(v0.pdgCode()) == 310) { // K0S + registry.fill(HIST("matching/jets/V0/missJetPtK0SPtEtaPhi"), jet.pt(), v0.pt(), v0.eta(), v0.phi(), weight); + registry.fill(HIST("matching/jets/V0/missJetPtK0STrackProj"), jet.pt(), trackProj, weight); + } else if (v0.pdgCode() == 3122) { // Lambda + registry.fill(HIST("matching/jets/V0/missJetPtLambdaPtEtaPhi"), jet.pt(), v0.pt(), v0.eta(), v0.phi(), weight); + registry.fill(HIST("matching/jets/V0/missJetPtLambdaTrackProj"), jet.pt(), trackProj, weight); + } else if (v0.pdgCode() == -3122) { // AntiLambda + registry.fill(HIST("matching/jets/V0/missJetPtAntiLambdaPtEtaPhi"), jet.pt(), v0.pt(), v0.eta(), v0.phi(), weight); + registry.fill(HIST("matching/jets/V0/missJetPtAntiLambdaTrackProj"), jet.pt(), trackProj, weight); + } + } + // Fakes - Counts (or event weights) + template // Fake inclusive V0s + void fillMatchingV0FakeHistograms(T const& coll, U const& v0, double weight = 1.) + { + double ctauLambda = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * constants::physics::MassLambda0; + double ctauAntiLambda = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * constants::physics::MassLambda0Bar; + double ctauK0s = v0.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * constants::physics::MassK0Short; + + double massDiff = v0.mLambda() - v0.mAntiLambda(); + double massRatio = v0.mAntiLambda() / v0.mLambda(); + double massRelDiff = (v0.mLambda() - v0.mAntiLambda()) / v0.mLambda(); + + registry.fill(HIST("matching/V0/fakeV0PtEtaPhi"), v0.pt(), v0.eta(), v0.phi(), weight); + registry.fill(HIST("matching/V0/fakeV0PtCtau"), v0.pt(), ctauK0s, ctauLambda, ctauAntiLambda, weight); + registry.fill(HIST("matching/V0/fakeV0PtMass"), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/V0/fakeV0PtLambdaMasses"), v0.pt(), v0.mLambda() - v0.mAntiLambda(), v0.mAntiLambda() / v0.mLambda(), (v0.mLambda() - v0.mAntiLambda()) / v0.mLambda(), weight); + registry.fill(HIST("matching/V0/fakeV0PtRadiusCosPA"), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); + registry.fill(HIST("matching/V0/fakeV0PtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("matching/V0/fakeV0PtDCAd"), v0.pt(), v0.dcaV0daughters(), weight); + + if (v0.isK0SCandidate()) { + registry.fill(HIST("matching/V0/fakeK0SPtEtaPhi"), v0.pt(), v0.eta(), v0.phi(), weight); + registry.fill(HIST("matching/V0/fakeK0SPtRadiusCosPA"), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); + registry.fill(HIST("matching/V0/fakeK0SPtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("matching/V0/fakeK0SPtDCAd"), v0.pt(), v0.dcaV0daughters(), weight); + + registry.fill(HIST("matching/V0/fakeK0SPtCtauMass"), v0.pt(), ctauK0s, v0.mK0Short(), weight); + registry.fill(HIST("matching/V0/fakeK0SPtRadiusMass"), v0.pt(), v0.v0radius(), v0.mK0Short(), weight); + registry.fill(HIST("matching/V0/fakeK0SPtCosPAMass"), v0.pt(), v0.v0cosPA(), v0.mK0Short(), weight); + registry.fill(HIST("matching/V0/fakeK0SPtDCAposMass"), v0.pt(), v0.dcapostopv(), v0.mK0Short(), weight); + registry.fill(HIST("matching/V0/fakeK0SPtDCAnegMass"), v0.pt(), v0.dcanegtopv(), v0.mK0Short(), weight); + registry.fill(HIST("matching/V0/fakeK0SPtDCAdMass"), v0.pt(), v0.dcaV0daughters(), v0.mK0Short(), weight); + } + if (v0.isLambdaCandidate()) { + registry.fill(HIST("matching/V0/fakeLambdaPtEtaPhi"), v0.pt(), v0.eta(), v0.phi(), weight); + registry.fill(HIST("matching/V0/fakeLambdaPtLambdaMasses"), v0.pt(), massDiff, massRatio, massRelDiff, weight); + registry.fill(HIST("matching/V0/fakeLambdaPtRadiusCosPA"), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); + registry.fill(HIST("matching/V0/fakeLambdaPtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("matching/V0/fakeLambdaPtDCAd"), v0.pt(), v0.dcaV0daughters(), weight); + + registry.fill(HIST("matching/V0/fakeLambdaPtCtauMass"), v0.pt(), ctauLambda, v0.mLambda(), weight); + registry.fill(HIST("matching/V0/fakeLambdaPtRadiusMass"), v0.pt(), v0.v0radius(), v0.mLambda(), weight); + registry.fill(HIST("matching/V0/fakeLambdaPtCosPAMass"), v0.pt(), v0.v0cosPA(), v0.mLambda(), weight); + registry.fill(HIST("matching/V0/fakeLambdaPtDCAposMass"), v0.pt(), v0.dcapostopv(), v0.mLambda(), weight); + registry.fill(HIST("matching/V0/fakeLambdaPtDCAnegMass"), v0.pt(), v0.dcanegtopv(), v0.mLambda(), weight); + registry.fill(HIST("matching/V0/fakeLambdaPtDCAdMass"), v0.pt(), v0.dcaV0daughters(), v0.mLambda(), weight); + } + if (v0.isAntiLambdaCandidate()) { + registry.fill(HIST("matching/V0/fakeAntiLambdaPtEtaPhi"), v0.pt(), v0.eta(), v0.phi(), weight); + registry.fill(HIST("matching/V0/fakeAntiLambdaPtLambdaMasses"), v0.pt(), massDiff, massRatio, massRelDiff, weight); + registry.fill(HIST("matching/V0/fakeAntiLambdaPtRadiusCosPA"), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); + registry.fill(HIST("matching/V0/fakeAntiLambdaPtDCAposneg"), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("matching/V0/fakeAntiLambdaPtDCAd"), v0.pt(), v0.dcaV0daughters(), weight); + + registry.fill(HIST("matching/V0/fakeAntiLambdaPtCtauMass"), v0.pt(), ctauAntiLambda, v0.mAntiLambda(), weight); + registry.fill(HIST("matching/V0/fakeAntiLambdaPtRadiusMass"), v0.pt(), v0.v0radius(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/V0/fakeAntiLambdaPtCosPAMass"), v0.pt(), v0.v0cosPA(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/V0/fakeAntiLambdaPtDCAposMass"), v0.pt(), v0.dcapostopv(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/V0/fakeAntiLambdaPtDCAnegMass"), v0.pt(), v0.dcanegtopv(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/V0/fakeAntiLambdaPtDCAdMass"), v0.pt(), v0.dcaV0daughters(), v0.mAntiLambda(), weight); + } + } + template // Fake inclusive V0s daughters + void fillMatchingFakeV0DauHistograms(U const& v0, double weight = 1.) + { + auto negTrack = v0.template negTrack_as(); + auto posTrack = v0.template posTrack_as(); + registry.fill(HIST("matching/V0/fakeV0PosTrackPtEtaPhi"), posTrack.pt(), posTrack.eta(), posTrack.phi(), weight); + registry.fill(HIST("matching/V0/fakeV0NegTrackPtEtaPhi"), negTrack.pt(), negTrack.eta(), negTrack.phi(), weight); + + if (v0.isK0SCandidate()) { + registry.fill(HIST("matching/V0/fakeK0SPosTrackPtEtaPhi"), posTrack.pt(), posTrack.eta(), posTrack.phi(), weight); + registry.fill(HIST("matching/V0/fakeK0SPosTrackPtMass"), v0.pt(), posTrack.pt(), v0.mK0Short(), weight); + registry.fill(HIST("matching/V0/fakeK0SNegTrackPtEtaPhi"), negTrack.pt(), negTrack.eta(), negTrack.phi(), weight); + registry.fill(HIST("matching/V0/fakeK0SNegTrackPtMass"), v0.pt(), negTrack.pt(), v0.mK0Short(), weight); + } + if (v0.isLambdaCandidate()) { + registry.fill(HIST("matching/V0/fakeLambdaPosTrackPtEtaPhi"), posTrack.pt(), posTrack.eta(), posTrack.phi(), weight); + registry.fill(HIST("matching/V0/fakeLambdaPosTrackPtMass"), v0.pt(), posTrack.pt(), v0.mLambda(), weight); + registry.fill(HIST("matching/V0/fakeLambdaNegTrackPtEtaPhi"), negTrack.pt(), negTrack.eta(), negTrack.phi(), weight); + registry.fill(HIST("matching/V0/fakeLambdaNegTrackPtMass"), v0.pt(), negTrack.pt(), v0.mLambda(), weight); + } + if (v0.isAntiLambdaCandidate()) { + registry.fill(HIST("matching/V0/fakeAntiLambdaPosTrackPtEtaPhi"), posTrack.pt(), posTrack.eta(), posTrack.phi(), weight); + registry.fill(HIST("matching/V0/fakeAntiLambdaPosTrackPtMass"), v0.pt(), posTrack.pt(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/V0/fakeAntiLambdaNegTrackPtEtaPhi"), negTrack.pt(), negTrack.eta(), negTrack.phi(), weight); + registry.fill(HIST("matching/V0/fakeAntiLambdaNegTrackPtMass"), v0.pt(), negTrack.pt(), v0.mAntiLambda(), weight); } - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + } + template // Check if inclusive V0 was missed because daughter decayed + void fillMatchingV0DecayedHistograms(V const& v0, double weight = 1.) + { + // Check if decayed daughter + auto posTrack = v0.template posTrack_as(); + auto negTrack = v0.template negTrack_as(); + + auto posPart = posTrack.template mcParticle_as(); + auto negPart = negTrack.template mcParticle_as(); + + auto posMom = posPart.template mothers_first_as(); + auto negMom = negPart.template mothers_first_as(); + + bool posDecayed = false; + bool negDecayed = false; + + // This should not happen. They should have been matched + if (posMom == negMom) { + registry.fill(HIST("matching/V0/nonedecayedFakeV0PtMass"), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); return; } - double nJets = 0, nTracks = 0; - double weight = collision.mcCollision().weight(); - for (const auto& track : tracks) { - if (track.pt() > 0.1) { - nTracks++; - registry.fill(HIST("detector-level/tracks/detTrackPtEtaPhi"), track.pt(), track.eta(), track.phi(), weight); + + if (posMom.has_mothers()) { + auto posGrandMom = posMom.template mothers_first_as(); + if (posGrandMom == negMom) { + posDecayed = true; + } + } + if (negMom.has_mothers()) { + auto negGrandMom = negMom.template mothers_first_as(); + if (negGrandMom == posMom) { + negDecayed = true; } } - for (const auto& jet : detJetEtaPartition) { - nJets++; - fillMCDJetHistograms(jet, weight); - fillMCDFragHistograms(jet, weight); + + // This shouldn't happen + if (posDecayed && negDecayed) { + registry.fill(HIST("matching/V0/doubledecayedFakeV0PtMass"), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + return; + } + if (posDecayed || negDecayed) { + double pt = posDecayed ? negMom.pt() : posMom.pt(); + int pdg = posDecayed ? negMom.pdgCode() : posMom.pdgCode(); + + if (std::abs(pdg) == 310) { + registry.fill(HIST("matching/V0/decayedK0SV0PtMass"), pt, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + } else if (pdg == 3122) { + registry.fill(HIST("matching/V0/decayedLambdaV0PtMass"), pt, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + } else if (pdg == -3122) { + registry.fill(HIST("matching/V0/decayedAntiLambdaV0PtMass"), pt, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + } else { + registry.fill(HIST("matching/V0/decayedOtherPtV0PtMass"), pt, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + } } - registry.fill(HIST("detector-level/nJetsnTracks"), nJets, nTracks, weight); } - PROCESS_SWITCH(JetFragmentation, processMcD, "Monte Carlo detector level", false); + template // Fake V0s in jets + void fillMatchingV0JetFakeHistograms(CollisionType const& collision, JetType const& jet, V0Type const& v0, double weight = 1.) + { + double trackProj = getMomFrac(jet, v0); + double ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0; + double ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassLambda0Bar; + double ctauK0s = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassK0Short; + double massDiff = v0.mLambda() - v0.mAntiLambda(); + double massRatio = v0.mAntiLambda() / v0.mLambda(); + double massRelDiff = (v0.mLambda() - v0.mAntiLambda()) / v0.mLambda(); + + registry.fill(HIST("matching/jets/V0/fakeJetPtV0PtEtaPhi"), jet.pt(), v0.pt(), v0.eta(), v0.phi(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtV0TrackProj"), jet.pt(), trackProj, weight); + + registry.fill(HIST("matching/jets/V0/fakeJetPtV0PtCtau"), jet.pt(), v0.pt(), ctauK0s, ctauLambda, ctauAntiLambda, weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtV0PtMass"), jet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtV0PtLambdaMasses"), jet.pt(), v0.pt(), massDiff, massRatio, massRelDiff, weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtV0PtRadiusCosPA"), jet.pt(), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtV0PtDCAposneg"), jet.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtV0PtDCAd"), jet.pt(), v0.pt(), v0.dcaV0daughters(), weight); + + registry.fill(HIST("matching/jets/V0/fakeJetPtV0TrackProjCtau"), jet.pt(), trackProj, ctauK0s, ctauLambda, ctauAntiLambda, weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtV0TrackProjMass"), jet.pt(), trackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtV0TrackProjLambdaMasses"), jet.pt(), trackProj, massDiff, massRatio, massRelDiff, weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtV0TrackProjRadiusCosPA"), jet.pt(), trackProj, v0.v0radius(), v0.v0cosPA(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtV0TrackProjDCAposneg"), jet.pt(), trackProj, v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtV0TrackProjDCAd"), jet.pt(), trackProj, v0.dcaV0daughters(), weight); + + if (v0.isK0SCandidate()) { + registry.fill(HIST("matching/jets/V0/fakeJetPtK0SPtEtaPhi"), jet.pt(), v0.pt(), v0.eta(), v0.phi(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtK0STrackProj"), jet.pt(), trackProj, weight); - void processMcP(aod::JetMcCollision const& mcCollision, - MCPJetsWithConstituents const& jets, - aod::JetParticles const& particles) - { - double nJets = 0, nTracks = 0; - double weight = mcCollision.weight(); - for (const auto& particle : particles) { - if (particle.pt() > 0.1) { - nTracks++; - registry.fill(HIST("particle-level/tracks/partTrackPtEtaPhi"), particle.pt(), particle.eta(), particle.phi(), weight); - } - } - for (const auto& jet : jets) { - nJets++; - fillMCPJetHistograms(jet, weight); - fillMCPFragHistograms(jet, weight); - } - registry.fill(HIST("particle-level/nJetsnTracks"), nJets, nTracks, weight); - } - PROCESS_SWITCH(JetFragmentation, processMcP, "Monte Carlo particle level", false); + registry.fill(HIST("matching/jets/V0/fakeJetPtK0SPtCtau"), jet.pt(), v0.pt(), ctauK0s, ctauLambda, ctauAntiLambda, weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtK0SPtMass"), jet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtK0SPtLambdaMasses"), jet.pt(), v0.pt(), massDiff, massRatio, massRelDiff, weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtK0SPtRadiusCosPA"), jet.pt(), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtK0SPtDCAposneg"), jet.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtK0SPtDCAd"), jet.pt(), v0.pt(), v0.dcaV0daughters(), weight); - void processDataRun3(soa::Filtered::iterator const& collision, - ChargedJetsWithConstituents const& jets, - aod::JetTracks const& tracks) - { - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { - return; + registry.fill(HIST("matching/jets/V0/fakeJetPtK0STrackProjCtau"), jet.pt(), trackProj, ctauK0s, ctauLambda, ctauAntiLambda, weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtK0STrackProjMass"), jet.pt(), trackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtK0STrackProjLambdaMasses"), jet.pt(), trackProj, massDiff, massRatio, massRelDiff, weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtK0STrackProjRadiusCosPA"), jet.pt(), trackProj, v0.v0radius(), v0.v0cosPA(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtK0STrackProjDCAposneg"), jet.pt(), trackProj, v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtK0STrackProjDCAd"), jet.pt(), trackProj, v0.dcaV0daughters(), weight); } - double nJets = 0, nTracks = 0; - for (const auto& track : tracks) { - if (track.pt() > 0.1) { - nTracks++; - registry.fill(HIST("data/tracks/trackPtEtaPhi"), track.pt(), track.eta(), track.phi()); - } + if (v0.isLambdaCandidate()) { + registry.fill(HIST("matching/jets/V0/fakeJetPtLambdaPtEtaPhi"), jet.pt(), v0.pt(), v0.eta(), v0.phi(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtLambdaTrackProj"), jet.pt(), trackProj, weight); + + registry.fill(HIST("matching/jets/V0/fakeJetPtLambdaPtCtau"), jet.pt(), v0.pt(), ctauK0s, ctauLambda, ctauAntiLambda, weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtLambdaPtMass"), jet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtLambdaPtLambdaMasses"), jet.pt(), v0.pt(), massDiff, massRatio, massRelDiff, weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtLambdaPtRadiusCosPA"), jet.pt(), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtLambdaPtDCAposneg"), jet.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtLambdaPtDCAd"), jet.pt(), v0.pt(), v0.dcaV0daughters(), weight); + + registry.fill(HIST("matching/jets/V0/fakeJetPtLambdaTrackProjEtaPhi"), jet.pt(), trackProj, v0.eta(), v0.phi(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtLambdaTrackProjCtau"), jet.pt(), trackProj, ctauK0s, ctauLambda, ctauAntiLambda, weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtLambdaTrackProjMass"), jet.pt(), trackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtLambdaTrackProjLambdaMasses"), jet.pt(), trackProj, massDiff, massRatio, massRelDiff, weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtLambdaTrackProjRadiusCosPA"), jet.pt(), trackProj, v0.v0radius(), v0.v0cosPA(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtLambdaTrackProjDCAposneg"), jet.pt(), trackProj, v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtLambdaTrackProjDCAd"), jet.pt(), trackProj, v0.dcaV0daughters(), weight); } - for (const auto& jet : jets) { - if (!jetfindingutilities::isInEtaAcceptance(jet, dataJetEtaMin, dataJetEtaMax)) { - continue; - } - nJets++; - fillDataJetHistograms(jet); - fillDataFragHistograms(jet); + if (v0.isAntiLambdaCandidate()) { + registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambdaPtEtaPhi"), jet.pt(), v0.pt(), v0.eta(), v0.phi(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambdaTrackProj"), jet.pt(), trackProj, weight); + + registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambdaPtCtau"), jet.pt(), v0.pt(), ctauK0s, ctauLambda, ctauAntiLambda, weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambdaPtMass"), jet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambdaPtLambdaMasses"), jet.pt(), v0.pt(), massDiff, massRatio, massRelDiff, weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambdaPtRadiusCosPA"), jet.pt(), v0.pt(), v0.v0radius(), v0.v0cosPA(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambdaPtDCAposneg"), jet.pt(), v0.pt(), v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambdaPtDCAd"), jet.pt(), v0.pt(), v0.dcaV0daughters(), weight); + + registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambdaTrackProjCtau"), jet.pt(), trackProj, ctauK0s, ctauLambda, ctauAntiLambda, weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambdaTrackProjMass"), jet.pt(), trackProj, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambdaTrackProjLambdaMasses"), jet.pt(), trackProj, massDiff, massRatio, massRelDiff, weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambdaTrackProjRadiusCosPA"), jet.pt(), trackProj, v0.v0radius(), v0.v0cosPA(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambdaTrackProjDCAposneg"), jet.pt(), trackProj, v0.dcapostopv(), v0.dcanegtopv(), weight); + registry.fill(HIST("matching/jets/V0/fakeJetPtAntiLambdaTrackProjDCAd"), jet.pt(), trackProj, v0.dcaV0daughters(), weight); } - registry.fill(HIST("data/nJetsnTracks"), nJets, nTracks); - registry.fill(HIST("data/collision/collisionVtxZ"), collision.posZ()); } - PROCESS_SWITCH(JetFragmentation, processDataRun3, "Run 3 Data", false); - - void processMcMatched(soa::Filtered::iterator const& collision, - MatchedMCDJetsWithConstituents const&, - aod::JetTracksMCD const&, - aod::JetMcCollisions const&, - MatchedMCPJetsWithConstituents const& allMcPartJets, - aod::JetParticles const&) + template // Check if V0 in jet was missed because daughter decayed + void fillMatchingV0JetDecayedHistograms(V const& partJet, W const& detJet, X const& v0, double weight = 1.) { - if (!collision.has_mcCollision()) { - return; - } - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + // Check if decayed daughter + auto posTrack = v0.template posTrack_as(); + auto negTrack = v0.template negTrack_as(); + + auto posPart = posTrack.template mcParticle_as(); + auto negPart = negTrack.template mcParticle_as(); + + auto posMom = posPart.template mothers_first_as(); + auto negMom = negPart.template mothers_first_as(); + + bool posDecayed = false; + bool negDecayed = false; + + double zv0 = getMomFrac(detJet, v0); + + // This should not happen. They should have been matched + if (posMom == negMom) { + registry.fill(HIST("matching/jets/V0/nonedecayedFakeV0PtMass"), partJet.pt(), detJet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/jets/V0/nonedecayedFakeV0TrackProjMass"), partJet.pt(), detJet.pt(), zv0, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); return; } - double weight = collision.mcCollision().weight(); - const auto& mcPartJets = allMcPartJets.sliceBy(partJetsPerCollision, collision.mcCollision().globalIndex()); // Only jets from the same collision - bool isFake = false; - for (const auto& detJet : detJetEtaPartition) { - for (const auto& partJet : detJet.template matchedJetGeo_as()) { - fillMatchingHistogramsJet(detJet, partJet, weight); - for (const auto& track : detJet.tracks_as()) { - bool isTrackMatched = false; - if (!track.has_mcParticle()) { - isFake = true; - fillMatchingFakeOrMiss(detJet, track, isFake, weight); - continue; - } - for (const auto& particle : partJet.tracks_as()) { - if (particle.globalIndex() == track.template mcParticle_as().globalIndex()) { - isTrackMatched = true; - fillMatchingHistogramsConstituent(detJet, partJet, track, particle, weight); - break; // No need to inspect other particles - } // if track has mcParticle and particle is in matched jet - } // for particle in matched partJet - if (!isTrackMatched) { - isFake = true; - fillMatchingFakeOrMiss(detJet, track, isFake, weight); - } // if track is not matched - } // for detJet tracks + if (posMom.has_mothers()) { + auto posGrandMom = posMom.template mothers_first_as(); + if (posGrandMom == negMom) { + posDecayed = true; } - if (!detJet.has_matchedJetGeo()) { - isFake = true; - registry.fill(HIST("matching/jets/fakeDetJetPtEtaPhi"), detJet.pt(), detJet.eta(), detJet.phi(), weight); - for (const auto& track : detJet.tracks_as()) { - fillMatchingFakeOrMiss(detJet, track, isFake, weight); - } - } // if detJet does not have a match - } // for det jet - for (const auto& partJet : mcPartJets) { - for (const auto& detJet : partJet.template matchedJetGeo_as()) { - // Check if the matched detector level jet is outside the allowed eta range - if ((detJet.eta() <= matchedDetJetEtaMin) || (detJet.eta() >= matchedDetJetEtaMax)) { - for (const auto& particle : partJet.tracks_as()) { - isFake = false; - fillMatchingFakeOrMiss(partJet, particle, isFake, weight); - } - continue; - } - // If the jets are properly matched, we can check the particles - for (const auto& particle : partJet.tracks_as()) { - bool isParticleMatched = false; - for (const auto& track : detJet.tracks_as()) { - if (!track.has_mcParticle()) { - continue; - } - if (particle.globalIndex() == track.template mcParticle_as().globalIndex()) { - isParticleMatched = true; - } - } - // Ignore matched particles. They have been handled in the previous loop - if (!isParticleMatched) { - isFake = false; - fillMatchingFakeOrMiss(partJet, particle, isFake, weight); - } - } // for particle - } // for matched det jet - if (!partJet.has_matchedJetGeo()) { - isFake = false; - registry.fill(HIST("matching/jets/missPartJetPtEtaPhi"), partJet.pt(), partJet.eta(), partJet.phi(), weight); - for (const auto& particle : partJet.tracks_as()) { - fillMatchingFakeOrMiss(partJet, particle, isFake, weight); - } - } // if no matched jet - } // for part jet - } - PROCESS_SWITCH(JetFragmentation, processMcMatched, "Monte Carlo particle and detector level", false); - - // Should take in JCollisions? - void processMcMatchedV0(soa::Filtered>::iterator const& collision, - aod::McCollisions const&, - soa::Join const& V0s, - soa::Join const& tracks, - aod::McParticles const& mcParticles) - { - if (!collision.has_mcCollision()) { - return; } - // if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { - // return; - // } - double weight = collision.mcCollision().weight(); - for (const auto& v0 : V0s) { - if (!v0.has_mcParticle()) { - continue; + if (negMom.has_mothers()) { + auto negGrandMom = negMom.template mothers_first_as(); + if (negGrandMom == posMom) { + negDecayed = true; } - fillMcMatchedV0Histograms(collision, v0, tracks, mcParticles, weight); } - } - PROCESS_SWITCH(JetFragmentation, processMcMatchedV0, "Monte Carlo V0", false); - void processMcMatchedV0Frag(soa::Filtered>::iterator const& jcoll, - MatchedMCDJetsWithConstituents const&, - aod::JetTracksMCD const&, - soa::Join const& allV0s, - aod::JetMcCollisions const&, - MatchedMCPJetsWithConstituents const& allMcPartJets, - aod::JetParticles const&, - aod::McCollisions const&, - aod::McParticles const& allMcParticles, - aod::Collisions const&) - { - if (!jcoll.has_mcCollision()) { - return; - } - if (!jetderiveddatautilities::selectCollision(jcoll, eventSelectionBits)) { + // This shouldn't happen + if (posDecayed && negDecayed) { + registry.fill(HIST("matching/jets/V0/doubledecayedFakeV0PtMass"), partJet.pt(), detJet.pt(), v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + registry.fill(HIST("matching/jets/V0/doubledecayedFakeV0TrackProjMass"), partJet.pt(), detJet.pt(), zv0, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); return; } - double weight = jcoll.mcCollision().weight(); - // This is necessary, because jets are linked to aod::JetCollisions, but V0s are linked to Collisions - const auto& collision = jcoll.collision_as(); - const auto& v0s = allV0s.sliceBy(v0sPerCollision, collision.globalIndex()); - const auto& mcPartJets = allMcPartJets.sliceBy(partJetsPerCollision, jcoll.mcCollision().globalIndex()); - const auto& mcParticles = allMcParticles.sliceBy(particlesPerCollision, jcoll.mcCollision().globalIndex()); - - int kNV0s = v0s.size(); - bool isV0Used[kNV0s]; - for (int i = 0; i < kNV0s; i++) { - isV0Used[i] = false; - } - registry.fill(HIST("matching/V0/nV0sEvent"), kNV0s); - registry.fill(HIST("matching/V0/nV0sEventWeighted"), kNV0s, weight); - - int kNParticles = mcParticles.size(); - bool isParticleUsed[kNParticles]; - for (int i = 0; i < kNParticles; i++) { - isParticleUsed[i] = false; - } - - for (const auto& detJet : detJetEtaV0Partition) { - int iv0 = -1; - int nV0inJet = 0, nLambdainJet = 0, nAntiLambdainJet = 0, nK0SinJet = 0; + if (posDecayed || negDecayed) { + double pt = posDecayed ? negMom.pt() : posMom.pt(); + int pdg = posDecayed ? negMom.pdgCode() : posMom.pdgCode(); - for (const auto& partJet : detJet.template matchedJetGeo_as()) { - fillMatchingHistogramsJet(detJet, partJet, weight); - // Jets are pt-sorted, so we prioritise matching V0s with high pt jets - for (const auto& v0 : v0s) { - iv0++; - if (isV0Used[iv0]) { - continue; - } - double dR = jetutilities::deltaR(detJet, v0); - if (dR >= detJet.r() * 1e-2) { - continue; - } - isV0Used[iv0] = true; - if (!v0.has_mcParticle()) { - fillMatchingV0Fake(collision, detJet, v0, weight); - continue; - } - const auto& particle = v0.template mcParticle_as(); - if (!((std::abs(particle.pdgCode()) == 310) || (std::abs(particle.pdgCode()) == 3122))) { - fillMatchingV0Fake(collision, detJet, v0, weight); - continue; - } - // Found a matched V0 in the jet - nV0inJet++; - fillMatchingV0FragHistograms(collision, detJet, partJet, v0, particle, weight); - if (std::abs(particle.pdgCode()) == 310) { - nK0SinJet++; - } else if (particle.pdgCode() == 3122) { - nLambdainJet++; - } else if (particle.pdgCode() == -3122) { - nAntiLambdainJet++; - } - } // v0 loop - registry.fill(HIST("matching/jets/V0/jetPtnV0Matched"), partJet.pt(), nV0inJet, weight); - registry.fill(HIST("matching/jets/V0/jetPtnV0MatchednK0SnLambdanAntiLambda"), partJet.pt(), nV0inJet, nK0SinJet, nLambdainJet, nAntiLambdainJet, weight); - } // for partJet in matched detJet - iv0 = -1; - if (!detJet.has_matchedJetGeo()) { - for (const auto& v0 : v0s) { - iv0++; - if (isV0Used[iv0]) { - continue; - } - double dR = jetutilities::deltaR(detJet, v0); - if (dR >= detJet.r() * 1e-2) { - continue; - } - isV0Used[iv0] = true; - fillMatchingV0Fake(collision, detJet, v0, weight); - } // v0 loop - } // if no matched jet - } // det jet loop - for (const auto& partJet : mcPartJets) { - int iparticle = -1; - for (const auto& particle : mcParticles) { - iparticle++; - if (isParticleUsed[iparticle]) { - continue; - } - // Check if particle is primary and is a particle of interest that has not been used yet - // If it doesn't pass these selections, set isParticleUsed to true to skip it in the future - if (!particle.isPhysicalPrimary()) { - isParticleUsed[iparticle] = true; - continue; + double z = 0.; + bool partIsInJet = false; + for (auto const& part : partJet.template tracks_as()) { + if (posDecayed && (part == negMom)) { + partIsInJet = true; + z = getMomFrac(partJet, part); + break; } - if (!((std::abs(particle.pdgCode()) == 310) || (std::abs(particle.pdgCode()) == 3122))) { - isParticleUsed[iparticle] = true; - continue; + if (negDecayed && (part == posMom)) { + partIsInJet = true; + z = getMomFrac(partJet, part); + break; } - // If the particle has been used or it is not a particle of interest, skip it - if (isParticleUsed[iparticle]) { - continue; + } + + if (std::abs(pdg) == 310) { + registry.fill(HIST("matching/jets/V0/decayedK0SV0PtMass"), partJet.pt(), detJet.pt(), pt, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + if (partIsInJet) { + registry.fill(HIST("matching/jets/V0/decayedK0SV0TrackProjMass"), partJet.pt(), detJet.pt(), z, zv0, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); } - if (jetutilities::deltaR(partJet, particle) >= partJet.r() * 1e-2) { - continue; + } else if (pdg == 3122) { + registry.fill(HIST("matching/jets/V0/decayedLambdaV0PtMass"), partJet.pt(), detJet.pt(), pt, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + if (partIsInJet) { + registry.fill(HIST("matching/jets/V0/decayedLambdaV0TrackProjMass"), partJet.pt(), detJet.pt(), z, zv0, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); } - // Particle may be a miss, but we need to check if it is matched with a V0 in a detector level jet - // If it is, it has been treated in the loop over detector level jets above - if (!partJet.has_matchedJetGeo()) { - isParticleUsed[iparticle] = true; - fillMatchingV0Miss(partJet, particle, weight); - continue; + } else if (pdg == -3122) { + registry.fill(HIST("matching/jets/V0/decayedAntiLambdaV0PtMass"), partJet.pt(), detJet.pt(), pt, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + if (partIsInJet) { + registry.fill(HIST("matching/jets/V0/decayedAntiLambdaV0TrackProjMass"), partJet.pt(), detJet.pt(), z, zv0, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); } - for (const auto& detJet : partJet.template matchedJetGeo_as()) { - if ((detJet.eta() <= v0EtaMin + detJet.r() * 1e-2) || (detJet.eta() >= v0EtaMax - detJet.r() * 1e-2)) { - continue; - } - for (const auto& v0 : v0s) { - if (!v0.has_mcParticle()) { - continue; - } - if (v0.template mcParticle_as().globalIndex() == particle.globalIndex()) { - if (jetutilities::deltaR(detJet, v0) < detJet.r() * 1e-2) { - // The particle is matched with a V0 and we ignore it - isParticleUsed[iparticle] = true; - } - } - } // v0 loop - } // detJet loop - if (!isParticleUsed[iparticle]) { - isParticleUsed[iparticle] = true; - fillMatchingV0Miss(partJet, particle, weight); + } else { + registry.fill(HIST("matching/jets/V0/decayedOtherPtV0PtMass"), partJet.pt(), detJet.pt(), pt, v0.pt(), v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); + if (partIsInJet) { + registry.fill(HIST("matching/jets/V0/decayedOtherPtV0TrackProjMass"), partJet.pt(), detJet.pt(), z, zv0, v0.mK0Short(), v0.mLambda(), v0.mAntiLambda(), weight); } - } // particle loop - } // part jet loop - } - PROCESS_SWITCH(JetFragmentation, processMcMatchedV0Frag, "Monte Carlo V0 fragmentation", false); - - void processDataV0(soa::Filtered>::iterator const& collision, - soa::Join const& V0s) - { - if (!collision.sel8()) { - return; + } } - registry.fill(HIST("data/V0/nV0sEvent"), V0s.size()); - fillDataV0Histograms(collision, V0s); } - PROCESS_SWITCH(JetFragmentation, processDataV0, "Data V0", false); - void processDataV0Frag(soa::Filtered>::iterator const& jcoll, - ChargedJetsWithConstituents const& jets, - aod::JetTracks const&, - aod::Collisions const&, - soa::Join const& allV0s) + // --------------------------------------------------- + // Processes + // --------------------------------------------------- + void processDummy(aod::JetTracks const&) {} + PROCESS_SWITCH(JetFragmentation, processDummy, "Dummy process function turned on by default", true); + + // Data + void processDataV0(soa::Filtered::iterator const& jcoll, CandidatesV0DataWithFlags const& V0s) { if (!jetderiveddatautilities::selectCollision(jcoll, eventSelectionBits)) { return; } - // This is necessary, because jets are linked to aod::JetCollisions, but V0s are linked to Collisions - const auto& collision = jcoll.collision_as(); - const auto& v0s = allV0s.sliceBy(v0sPerCollision, collision.globalIndex()); - - int kNV0s = v0s.size(); - bool isV0Used[kNV0s]; - for (int i = 0; i < kNV0s; i++) { - isV0Used[i] = false; - } - registry.fill(HIST("data/V0/nV0sEvent"), kNV0s); - - fillDataV0Histograms(collision, v0s); - for (const auto& jet : jets) { - if ((jet.eta() < v0EtaMin + jet.r() * 1e-2) || (jet.eta() > v0EtaMax - jet.r() * 1e-2)) { - continue; - } - fillDataJetHistograms(jet); - fillDataFragHistograms(jet); - // fastjet::PseudoJet newjet(jet.px(), jet.py(), jet.pz(), jet.e()); // Jet with corrections from V0 - int iv0 = -1; - int nV0inJet = 0, nLambdainJet = 0, nAntiLambdainJet = 0, nK0SinJet = 0; - - // Jets are pt-sorted, so we prioritise matching V0s with high pt jets - // Correct jet momentum (currently only corrects for v0 in jet, not v0 outside jet, is this an issue?) - // for (const auto& v0 : v0s) { - // iv0++; - // if (isV0Used[iv0]) { - // continue; - // } - // double dR = jetutilities::deltaR(jet, v0); - // if (dR < jet.r() * 1e-2) { - // // fastjet::PseudoJet pjv0(v0.px(), v0.py(), v0.pz(), v0.e()); - // // newjet += pjv0; - // } - // } - // Loop over V0s and fill histograms - iv0 = -1; - for (const auto& v0 : v0s) { - iv0++; - if (isV0Used[iv0]) { - continue; - } - double dR = jetutilities::deltaR(jet, v0); - if (dR < jet.r() * 1e-2) { - isV0Used[iv0] = true; - nV0inJet++; - fillDataV0FragHistograms(collision, jet, v0); - if (v0.isK0SCandidate()) { - nK0SinJet++; - } - if (v0.isLambdaCandidate()) { - nLambdainJet++; - } - if (v0.isAntiLambdaCandidate()) { - nAntiLambdainJet++; - } - // double newTrackProj = getMomProj(newjet, v0); // TODO: Does this work? - // registry.fill(HIST("data/jets/V0/jetCorrectedPtV0TrackProj"), newjet.pt(), newTrackProj); - } - } // v0 loop - registry.fill(HIST("data/jets/V0/jetPtnV0"), jet.pt(), nV0inJet); - registry.fill(HIST("data/jets/V0/jetPtnLambda"), jet.pt(), nLambdainJet); - registry.fill(HIST("data/jets/V0/jetPtnAntiLambda"), jet.pt(), nAntiLambdainJet); - registry.fill(HIST("data/jets/V0/jetPtnK0S"), jet.pt(), nK0SinJet); - registry.fill(HIST("data/jets/V0/jetPtnV0nK0SnLambdanAntiLambda"), jet.pt(), nV0inJet, nK0SinJet, nLambdainJet, nAntiLambdainJet); - - // registry.fill(HIST("data/jets/V0/jetCorrectedPtEtaPhi"), newjet.pt(), newjet.eta(), newjet.phi()); - } + registry.fill(HIST("data/V0/nV0sEvent"), V0s.size()); + fillDataV0Histograms(jcoll, V0s); + fillDataV0HistogramsWeighted(jcoll, V0s); } - PROCESS_SWITCH(JetFragmentation, processDataV0Frag, "Data V0 fragmentation", false); + PROCESS_SWITCH(JetFragmentation, processDataV0, "Data V0", false); - // - // - // ---------------- V0 jets ---------------- - void processDataV0JetsFrag(soa::Filtered::iterator const& jcoll, soa::Join const& v0jets, CandidatesV0DataWithFlags const& v0s) + void processDataV0JetsFrag(soa::Filtered::iterator const& jcoll, DataV0JetsWithConstituents const& v0jets, CandidatesV0DataWithFlags const&, aod::JetTracks const&) { if (!jetderiveddatautilities::selectCollision(jcoll, eventSelectionBits)) { return; } - registry.fill(HIST("data/V0/nV0sEvent"), v0s.size()); - fillDataV0Histograms(jcoll, v0s); for (const auto& jet : v0jets) { if (!jetfindingutilities::isInEtaAcceptance(jet, -99., -99., v0EtaMin, v0EtaMax)) { continue; } - // Double check if the jet contains V0s - if (!jetContainsV0s(jet)) { + + if (!jetContainsV0s(jet)) // Double check if the jet contains V0s continue; - } + fillDataJetHistograms(jet); - int nV0inJet = 0, nLambdainJet = 0, nAntiLambdainJet = 0, nK0SinJet = 0; + int nV0inJet = 0, nLambdainJet = 0, nAntiLambdainJet = 0, nK0SinJet = 0; // Counts + float wV0inJet = 0, wLambdainJet = 0, wAntiLambdainJet = 0, wK0SinJet = 0; // Weights + + std::vector values; + std::vector> weights; for (const auto& v0 : jet.candidates_as()) { + if (v0.isRejectedCandidate()) + continue; + + float purity = getV0SignalProb(v0); nV0inJet++; - fillDataV0FragHistograms(jcoll, jet, v0); + wV0inJet += purity; if (v0.isK0SCandidate()) { nK0SinJet++; + wK0SinJet += purity; } if (v0.isLambdaCandidate()) { nLambdainJet++; + wLambdainJet += purity; } if (v0.isAntiLambdaCandidate()) { nAntiLambdainJet++; + wAntiLambdainJet += purity; } - } - registry.fill(HIST("data/jets/V0/jetPtnV0nK0SnLambdanAntiLambda"), jet.pt(), nV0inJet, nK0SinJet, nLambdainJet, nAntiLambdainJet); - } // Jet loop - } - PROCESS_SWITCH(JetFragmentation, processDataV0JetsFrag, "Data V0 jets fragmentation", false); - void processDataV0JetsFragWithWeights(soa::Filtered::iterator const& jcoll, soa::Join const& v0jets, CandidatesV0DataWithFlags const& v0s) - { - if (!jetderiveddatautilities::selectCollision(jcoll, eventSelectionBits)) { - return; - } - registry.fill(HIST("data/V0/nV0sEvent"), v0s.size()); - fillDataV0Histograms(jcoll, v0s); + fillDataV0FragHistograms(jcoll, jet, v0); + double z = getMomFrac(jet, v0); + std::vector w; - for (const auto& jet : v0jets) { - if (!jetfindingutilities::isInEtaAcceptance(jet, -99., -99., v0EtaMin, v0EtaMax)) { - continue; - } - // Double check if the jet contains V0s - if (!jetContainsV0s(jet)) { - continue; - } - fillDataJetHistograms(jet); + if (nV0Classes == 2) + w = getV0SignalProbVector2Classes(v0); + else if (nV0Classes == 4) + w = getV0SignalProbVector4Classes(v0); + else + return; - std::vector values; - std::vector> weights; - int nParticles = 0; - int nClasses = 4; // Should be set globally? Maybe just a global constant? - for (const auto& v0 : jet.candidates_as()) { - nParticles++; - fillDataV0FragHistograms(jcoll, jet, v0); - double z = getMomProj(jet, v0); - std::vector w = getV0SignalWeight(v0); values.push_back(z); weights.push_back(w); } values.push_back(jet.pt()); + registry.fill(HIST("data/jets/V0/jetPtnV0nK0SnLambdanAntiLambda"), jet.pt(), nV0inJet, nK0SinJet, nLambdainJet, nAntiLambdainJet); + registry.fill(HIST("data/jets/weighted/V0/jetPtnV0nK0SnLambdanAntiLambda"), jet.pt(), wV0inJet, wK0SinJet, wLambdainJet, wAntiLambdainJet); - int nStates = std::pow(nClasses, nParticles); + int nStates = std::round(std::pow(static_cast(nV0Classes), static_cast(nV0inJet))); for (int M = 0; M < nStates; M++) { - std::vector state = convertState(M, nParticles, nClasses); - std::vector corrected = correctedValues(state, values); + std::vector state = convertState(M, nV0inJet, nV0Classes); + std::vector corrected; + if (doCorrectionWithTracks) + corrected = correctedValues(state, values); + else + corrected = correctedValuesPlusTracks(state, jet); + double ws = stateWeight(state, weights); - double jetpt = corrected[nParticles]; - fillDataJetHistogramsWithWeights(jetpt, jet.eta(), jet.phi(), ws); - fillDataV0FragHistogramsWithWeights(jcoll, jet, state, corrected, ws); + double jetpt = corrected[nV0inJet]; + fillDataJetHistogramsWeighted(jetpt, jet.eta(), jet.phi(), ws); + fillDataV0FragHistogramsWeighted(jcoll, jet, state, corrected, ws); } - // TODO: Fill nV0 hist - // TODO: Fill weighted nV0 hist? } } - PROCESS_SWITCH(JetFragmentation, processDataV0JetsFragWithWeights, "Data V0 jets fragmentation with weights", false); + PROCESS_SWITCH(JetFragmentation, processDataV0JetsFrag, "Data V0 jets fragmentation with weights", false); void processDataV0PerpCone(soa::Filtered::iterator const& jcoll, aod::V0ChargedJets const& v0jets, CandidatesV0DataWithFlags const& v0s) { if (!jetderiveddatautilities::selectCollision(jcoll, eventSelectionBits)) { return; } - if (v0s.size() == 0) { - return; - } - registry.fill(HIST("data/V0/nV0sEvent"), v0s.size()); - fillDataV0Histograms(jcoll, v0s); for (const auto& jet : v0jets) { if (!jetfindingutilities::isInEtaAcceptance(jet, -99., -99., v0EtaMin, v0EtaMax)) { @@ -2775,7 +2680,8 @@ struct JetFragmentation { } PROCESS_SWITCH(JetFragmentation, processDataV0PerpCone, "Perpendicular cone V0s in data", false); - void processMcMatchedV0JetsFrag(soa::Filtered::iterator const& jcoll, aod::JetMcCollisions const&, MatchedMCDV0JetsWithConstituents const& v0jetsMCD, MatchedMCPV0JetsWithConstituents const& v0jetsMCP, CandidatesV0MCDWithLabels const& v0s, aod::CandidatesV0MCP const& pv0s, aod::JetTracksMCD const& jTracks, aod::JetParticles const&) + // Matching + void processMcMatchedV0(soa::Filtered::iterator const& jcoll, aod::JetMcCollisions const&, CandidatesV0MCDWithLabelsAndFlags const& v0s, aod::CandidatesV0MCP const& pv0s, aod::JetTracksMCD const& jTracks, aod::JetParticles const&) { if (!jcoll.has_mcCollision()) { return; @@ -2787,45 +2693,75 @@ struct JetFragmentation { registry.fill(HIST("matching/V0/nV0sEvent"), v0s.size()); registry.fill(HIST("matching/V0/nV0sEventWeighted"), v0s.size(), weight); - // TODO: This is not very efficient + // TODO: Fill mcd and mcp hists + fillMCDV0Histograms(jcoll, v0s, weight); + fillMCPV0Histograms(pv0s, weight); + + float nV0s = 0; for (const auto& v0 : v0s) { + if (v0.isRejectedCandidate()) + continue; + if (!v0.has_mcParticle()) { fillMatchingV0FakeHistograms(jcoll, v0, weight); fillMatchingFakeV0DauHistograms(v0, weight); + fillMatchingV0DecayedHistograms(v0, weight); continue; } for (const auto& pv0 : pv0s) { if (v0sAreMatched(v0, pv0, jTracks)) { + nV0s += 1; fillMatchingV0Histograms(jcoll, v0, pv0, weight); fillMatchingV0DauHistograms(v0, pv0, weight); } } + } // Reconstructed V0s + for (const auto& pv0 : pv0s) { + for (const auto& v0 : v0s) { + if (v0sAreMatched(v0, pv0, jTracks)) { + continue; + } + // Fill histograms for missed V0s + } } + registry.fill(HIST("matching/V0/nV0sEventAcc"), nV0s); + registry.fill(HIST("matching/V0/nV0sEventAccWeighted"), nV0s, weight); + } + PROCESS_SWITCH(JetFragmentation, processMcMatchedV0, "Monte Carlo V0", false); + + void processMcMatchedV0JetsFrag(soa::Filtered::iterator const& jcoll, aod::JetMcCollisions const&, MatchedMCDV0JetsWithConstituents const& v0jetsMCD, MatchedMCPV0JetsWithConstituents const& v0jetsMCP, CandidatesV0MCDWithLabelsAndFlags const&, aod::CandidatesV0MCP const&, aod::JetTracksMCD const& jTracks, aod::JetParticles const&) + { + if (!jcoll.has_mcCollision()) + return; + if (!jetderiveddatautilities::selectCollision(jcoll, eventSelectionBits)) + return; + + double weight = jcoll.mcCollision().weight(); for (const auto& detJet : v0jetsMCD) { - if (!jetfindingutilities::isInEtaAcceptance(detJet, -99., -99., v0EtaMin, v0EtaMax)) { + if (!jetfindingutilities::isInEtaAcceptance(detJet, -99., -99., v0EtaMin, v0EtaMax)) continue; - } + // Double check if the jet contains V0s - if (!jetContainsV0s(detJet)) { + if (!jetContainsV0s(detJet)) continue; - } + fillMCDJetHistograms(detJet, weight); int nV0inJet = 0, nLambdainJet = 0, nAntiLambdainJet = 0, nK0SinJet = 0; if (!detJet.has_matchedJetGeo()) { - for (const auto& detV0 : detJet.candidates_as()) { - fillMatchingV0Fake(jcoll, detJet, detV0, weight); + for (const auto& detV0 : detJet.candidates_as()) { + fillMatchingV0JetFakeHistograms(jcoll, detJet, detV0, weight); } continue; } // if jet not matched for (const auto& partJet : detJet.template matchedJetGeo_as()) { fillMatchingHistogramsJet(detJet, partJet, weight); - for (const auto& detV0 : detJet.candidates_as()) { + for (const auto& detV0 : detJet.candidates_as()) { if (!detV0.has_mcParticle()) { - fillMatchingV0Fake(jcoll, detJet, detV0, weight); - fillMatchingV0DecayedHistograms(partJet, detJet, detV0, weight); + fillMatchingV0JetFakeHistograms(jcoll, detJet, detV0, weight); + fillMatchingV0JetDecayedHistograms(partJet, detJet, detV0, weight); continue; } bool isV0Matched = false; @@ -2848,7 +2784,7 @@ struct JetFragmentation { } // partV0 loop if (!isV0Matched) { - fillMatchingV0Fake(jcoll, detJet, detV0, weight); + fillMatchingV0JetFakeHistograms(jcoll, detJet, detV0, weight); } } // detV0 loop registry.fill(HIST("matching/jets/V0/jetPtnV0MatchednK0SnLambdanAntiLambda"), partJet.pt(), nV0inJet, nK0SinJet, nLambdainJet, nAntiLambdainJet, weight); @@ -2876,7 +2812,7 @@ struct JetFragmentation { isJetMatched = true; for (const auto& partV0 : partJet.candidates_as()) { bool isV0Matched = false; - for (const auto& detV0 : detJet.candidates_as()) { + for (const auto& detV0 : detJet.candidates_as()) { if (v0sAreMatched(detV0, partV0, jTracks)) { isV0Matched = true; break; @@ -2898,50 +2834,28 @@ struct JetFragmentation { } PROCESS_SWITCH(JetFragmentation, processMcMatchedV0JetsFrag, "Matched V0 jets fragmentation", false); - void processMcV0PerpCone(soa::Filtered::iterator const& jcoll, aod::JetMcCollisions const&, MatchedMCDV0Jets const& v0jets, CandidatesV0MCDWithLabels const& v0s, aod::McParticles const& particles) + void processMcV0PerpCone(soa::Filtered::iterator const& jcoll, aod::JetMcCollisions const&, MatchedMCDV0Jets const& v0jets, CandidatesV0MCDWithLabelsAndFlags const& v0s, aod::McParticles const& particles) { if (!jetderiveddatautilities::selectCollision(jcoll, eventSelectionBits)) { return; } - if (v0s.size() == 0) { - return; - } double weight = jcoll.mcCollision().weight(); registry.fill(HIST("mcd/V0/nV0sEvent"), v0s.size()); registry.fill(HIST("mcd/V0/nV0sEventWeighted"), v0s.size(), weight); for (const auto& mcdjet : v0jets) { - if (!jetfindingutilities::isInEtaAcceptance(mcdjet, -99., -99., v0EtaMin, v0EtaMax)) { + if (!jetfindingutilities::isInEtaAcceptance(mcdjet, -99., -99., v0EtaMin, v0EtaMax)) continue; - } - fillMcPerpConeHists(jcoll, mcdjet, v0s, particles, weight); - } - } - PROCESS_SWITCH(JetFragmentation, processMcV0PerpCone, "Perpendicular cone V0s in MC", false); - void processMcV0MatchedPerpCone(soa::Filtered::iterator const& jcoll, aod::JetMcCollisions const&, MatchedMCDV0Jets const& v0jets, MatchedMCPV0Jets const&, CandidatesV0MCDWithLabels const& v0s, aod::McParticles const& particles) - { - if (!jetderiveddatautilities::selectCollision(jcoll, eventSelectionBits)) { - return; - } - if (v0s.size() == 0) { - return; - } - double weight = jcoll.mcCollision().weight(); - registry.fill(HIST("matching/V0/nV0sEvent"), v0s.size()); - registry.fill(HIST("matching/V0/nV0sEventWeighted"), v0s.size(), weight); + fillMcPerpConeHists(jcoll, mcdjet, v0s, particles, weight); - for (const auto& mcdjet : v0jets) { - if (!jetfindingutilities::isInEtaAcceptance(mcdjet, -99., -99., v0EtaMin, v0EtaMax)) { - continue; - } for (const auto& mcpjet : mcdjet.template matchedJetGeo_as()) { fillMcPerpConeHists(jcoll, mcdjet, mcpjet, v0s, particles, weight); break; // Make sure we only do this once } } } - PROCESS_SWITCH(JetFragmentation, processMcV0MatchedPerpCone, "Perpendicular cone V0s in MC, matched jets", false); + PROCESS_SWITCH(JetFragmentation, processMcV0PerpCone, "Perpendicular cone V0s in MC", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) diff --git a/PWGJE/Tasks/v0QA.cxx b/PWGJE/Tasks/v0QA.cxx index 0dea51f55db..6966c3b0101 100644 --- a/PWGJE/Tasks/v0QA.cxx +++ b/PWGJE/Tasks/v0QA.cxx @@ -55,7 +55,7 @@ using MatchedMCPV0Jets = soa::Join; struct V0QA { - HistogramRegistry registry{"registry"}; // CallSumw2 = false? + HistogramRegistry registry{"registry"}; Configurable evSel{"evSel", "sel8WithoutTimeFrameBorderCut", "choose event selection"}; Configurable v0cospaMin{"v0cospaMin", 0.995, "Minimum V0 cosine of pointing angle"}; @@ -126,7 +126,7 @@ struct V0QA { const AxisSpec axisCrossedRowsOverFindable{binTPCCrossedRowsOverFindableCl, "Crossed rows / findable clusters TPC"}; if (doprocessFlags) { - registry.add("inclusive/V0Flags", "V0Flags", HistType::kTH2D, {{4, -0.5, 3.5}, {4, -0.5, 3.5}}); + registry.add("inclusive/V0Flags", "V0Flags", HistType::kTH2D, {{5, -0.5, 4.5}, {5, -0.5, 4.5}}); } if (doprocessMcD) { registry.add("inclusive/hEvents", "Events", {HistType::kTH1D, {{2, 0.0f, 2.0f}}}); @@ -651,25 +651,36 @@ struct V0QA { int isAntiLambda = static_cast(v0.isAntiLambdaCandidate()); int isRejected = static_cast(v0.isRejectedCandidate()); - registry.fill(HIST("inclusive/V0Flags"), 0, 0, isK0S); - registry.fill(HIST("inclusive/V0Flags"), 1, 1, isLambda); - registry.fill(HIST("inclusive/V0Flags"), 2, 2, isAntiLambda); - registry.fill(HIST("inclusive/V0Flags"), 3, 3, isRejected); - - registry.fill(HIST("inclusive/V0Flags"), 0, 1, isK0S * isLambda); - registry.fill(HIST("inclusive/V0Flags"), 1, 0, isK0S * isLambda); - registry.fill(HIST("inclusive/V0Flags"), 0, 2, isK0S * isAntiLambda); - registry.fill(HIST("inclusive/V0Flags"), 2, 0, isK0S * isAntiLambda); - registry.fill(HIST("inclusive/V0Flags"), 0, 3, isK0S * isRejected); - registry.fill(HIST("inclusive/V0Flags"), 3, 0, isK0S * isRejected); - - registry.fill(HIST("inclusive/V0Flags"), 1, 2, isLambda * isAntiLambda); - registry.fill(HIST("inclusive/V0Flags"), 2, 1, isLambda * isAntiLambda); - registry.fill(HIST("inclusive/V0Flags"), 1, 3, isLambda * isRejected); - registry.fill(HIST("inclusive/V0Flags"), 3, 1, isLambda * isRejected); - - registry.fill(HIST("inclusive/V0Flags"), 2, 3, isAntiLambda * isRejected); - registry.fill(HIST("inclusive/V0Flags"), 3, 2, isAntiLambda * isRejected); + registry.fill(HIST("inclusive/V0Flags"), 0, 0, isRejected); + registry.fill(HIST("inclusive/V0Flags"), 1, 1, isK0S); + registry.fill(HIST("inclusive/V0Flags"), 2, 2, isLambda); + registry.fill(HIST("inclusive/V0Flags"), 3, 3, isAntiLambda); + + registry.fill(HIST("inclusive/V0Flags"), 0, 1, isRejected * isK0S); + registry.fill(HIST("inclusive/V0Flags"), 1, 0, isRejected * isK0S); + registry.fill(HIST("inclusive/V0Flags"), 0, 2, isRejected * isLambda); + registry.fill(HIST("inclusive/V0Flags"), 2, 0, isRejected * isLambda); + registry.fill(HIST("inclusive/V0Flags"), 0, 3, isRejected * isAntiLambda); + registry.fill(HIST("inclusive/V0Flags"), 3, 0, isRejected * isAntiLambda); + + registry.fill(HIST("inclusive/V0Flags"), 1, 2, isK0S * isLambda); + registry.fill(HIST("inclusive/V0Flags"), 2, 1, isK0S * isLambda); + registry.fill(HIST("inclusive/V0Flags"), 1, 3, isK0S * isAntiLambda); + registry.fill(HIST("inclusive/V0Flags"), 3, 1, isK0S * isAntiLambda); + + registry.fill(HIST("inclusive/V0Flags"), 2, 3, isLambda * isAntiLambda); + registry.fill(HIST("inclusive/V0Flags"), 3, 2, isLambda * isAntiLambda); + + // V0 satisfies 3+ classes + registry.fill(HIST("inclusive/V0Flags"), 0, 4, isRejected * isK0S * isLambda); + registry.fill(HIST("inclusive/V0Flags"), 4, 0, isRejected * isK0S * isLambda); + registry.fill(HIST("inclusive/V0Flags"), 1, 4, isRejected * isK0S * isAntiLambda); + registry.fill(HIST("inclusive/V0Flags"), 4, 1, isRejected * isK0S * isAntiLambda); + registry.fill(HIST("inclusive/V0Flags"), 2, 4, isRejected * isLambda * isAntiLambda); + registry.fill(HIST("inclusive/V0Flags"), 4, 2, isRejected * isLambda * isAntiLambda); + registry.fill(HIST("inclusive/V0Flags"), 3, 4, isRejected * isK0S * isLambda * isAntiLambda); + registry.fill(HIST("inclusive/V0Flags"), 4, 3, isRejected * isK0S * isLambda * isAntiLambda); + registry.fill(HIST("inclusive/V0Flags"), 4, 4, isK0S * isLambda * isAntiLambda); } PROCESS_SWITCH(V0QA, processFlags, "V0 flags", false); @@ -683,15 +694,13 @@ struct V0QA { double weight = jcoll.mcCollision().weight(); for (const auto& v0 : v0s) { - if (!v0.has_mcParticle()) { + if (!v0.has_mcParticle()) continue; - } - int pdg = v0.mcParticle().pdgCode(); - // Check V0 decay kinematics if (v0.isRejectedCandidate()) continue; + int pdg = v0.mcParticle().pdgCode(); // K0S if (std::abs(pdg) == 310) { registry.fill(HIST("inclusive/K0SPtEtaMass"), v0.pt(), v0.eta(), v0.mK0Short(), weight); @@ -716,18 +725,17 @@ struct V0QA { bool isReconstructed = false; for (const auto& collision : collisions) { - if (!isCollisionReconstructed(collision, eventSelectionBits)) { + if (!isCollisionReconstructed(collision, eventSelectionBits)) continue; - } - if (collision.mcCollision().globalIndex() != mccoll.globalIndex()) { + + if (collision.mcCollision().globalIndex() != mccoll.globalIndex()) continue; - } + isReconstructed = true; break; } - if (!isReconstructed) { + if (!isReconstructed) return; - } registry.fill(HIST("inclusive/hMcEvents"), 1.5); double weight = mccoll.weight(); @@ -759,18 +767,18 @@ struct V0QA { void processMcDJets(soa::Filtered::iterator const& jcoll, aod::JetMcCollisions const&, MCDV0JetsWithConstituents const& mcdjets, CandidatesV0MCDWithFlags const&, aod::McParticles const&) { registry.fill(HIST("jets/hJetEvents"), 0.5); - if (!isCollisionReconstructed(jcoll, eventSelectionBits)) { + if (!isCollisionReconstructed(jcoll, eventSelectionBits)) return; - } + registry.fill(HIST("jets/hJetEvents"), 1.5); double weight = jcoll.mcCollision().weight(); for (const auto& mcdjet : mcdjets) { // if (!jetfindingutilities::isInEtaAcceptance(jet, -99., -99., v0EtaMin, v0EtaMax)) for (const auto& v0 : mcdjet.template candidates_as()) { - if (!v0.has_mcParticle()) { + if (!v0.has_mcParticle()) continue; - } + int pdg = v0.mcParticle().pdgCode(); // Check V0 decay kinematics @@ -799,9 +807,9 @@ struct V0QA { void processMcDMatchedJets(soa::Filtered::iterator const& jcoll, aod::JetMcCollisions const&, MatchedMCDV0JetsWithConstituents const& mcdjets, MatchedMCPV0JetsWithConstituents const&, CandidatesV0MCDWithFlags const&, aod::CandidatesV0MCP const&, aod::JetTracksMCD const& jTracks, aod::McParticles const&) { registry.fill(HIST("jets/hMatchedJetEvents"), 0.5); - if (!isCollisionReconstructed(jcoll, eventSelectionBits)) { + if (!isCollisionReconstructed(jcoll, eventSelectionBits)) return; - } + registry.fill(HIST("jets/hMatchedJetEvents"), 1.5); double weight = jcoll.mcCollision().weight(); @@ -848,31 +856,30 @@ struct V0QA { bool isReconstructed = false; for (const auto& collision : collisions) { - if (!isCollisionReconstructed(collision, eventSelectionBits)) { + if (!isCollisionReconstructed(collision, eventSelectionBits)) continue; - } - if (collision.mcCollision().globalIndex() != mccoll.globalIndex()) { + + if (collision.mcCollision().globalIndex() != mccoll.globalIndex()) continue; - } + isReconstructed = true; break; } - if (!isReconstructed) { + if (!isReconstructed) return; - } registry.fill(HIST("jets/hMcJetEvents"), 1.5); double weight = mccoll.weight(); for (const auto& jet : jets) { - // if (!jetfindingutilities::isInEtaAcceptance(jet, -99., -99., v0EtaMin, v0EtaMax)) + if (!jetfindingutilities::isInEtaAcceptance(jet, -99., -99., -1. * yPartMax, yPartMax)) + continue; + for (const auto& pv0 : jet.template candidates_as()) { if (!pv0.has_daughters()) continue; if (!pv0.isPhysicalPrimary()) continue; - if (std::abs(pv0.y()) > yPartMax) - continue; // TODO: Should actually check the jets if (pv0.pdgCode() == 310) { registry.fill(HIST("jets/GeneratedJetK0S"), jet.pt(), jet.eta(), pv0.pt(), weight); @@ -891,16 +898,15 @@ struct V0QA { void processCollisionAssociation(soa::Filtered::iterator const& jcoll, CandidatesV0MCDWithFlags const& v0s, soa::Join const&, aod::McCollisions const&, aod::McParticles const&) { // Based on PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx - if (!jcoll.has_mcCollision()) { + if (!jcoll.has_mcCollision()) return; - } + auto mcColl = jcoll.template mcCollision_as>(); double weight = mcColl.weight(); for (const auto& v0 : v0s) { - if (!v0.has_mcParticle()) { + if (!v0.has_mcParticle()) continue; - } auto pv0 = v0.mcParticle(); bool correctCollision = (mcColl.mcCollisionId() == v0.mcParticle().mcCollisionId()); @@ -933,9 +939,9 @@ struct V0QA { } } // Feed-down from Xi - if (!v0.has_mcMotherParticle()) { + if (!v0.has_mcMotherParticle()) continue; - } + auto mother = v0.mcMotherParticle(); pdg = mother.pdgCode(); correctCollision = (mcColl.mcCollisionId() == mother.mcCollisionId()); @@ -958,18 +964,17 @@ struct V0QA { void processCollisionAssociationJets(soa::Filtered::iterator const& jcoll, MCDV0JetsWithConstituents const& mcdjets, CandidatesV0MCDWithFlags const&, soa::Join const&, aod::McCollisions const&, aod::McParticles const&) { - if (!jcoll.has_mcCollision()) { + if (!jcoll.has_mcCollision()) return; - } + auto mcColl = jcoll.template mcCollision_as>(); double weight = mcColl.weight(); for (const auto& mcdjet : mcdjets) { // Eta cut? for (const auto& v0 : mcdjet.template candidates_as()) { - if (!v0.has_mcParticle()) { + if (!v0.has_mcParticle()) continue; - } auto pv0 = v0.mcParticle(); bool correctCollision = (mcColl.mcCollisionId() == pv0.mcCollisionId()); @@ -1002,9 +1007,9 @@ struct V0QA { } } - if (!v0.has_mcMotherParticle()) { + if (!v0.has_mcMotherParticle()) continue; - } + auto mother = v0.mcMotherParticle(); pdg = mother.pdgCode(); correctCollision = (mcColl.mcCollisionId() == mother.mcCollisionId()); @@ -1027,9 +1032,9 @@ struct V0QA { void processCollisionAssociationMatchedJets(soa::Filtered::iterator const& jcoll, MatchedMCDV0JetsWithConstituents const& mcdjets, MatchedMCPV0JetsWithConstituents const&, CandidatesV0MCDWithFlags const&, aod::CandidatesV0MCP const&, soa::Join const&, aod::McCollisions const&, aod::McParticles const&, aod::JetTracksMCD const& jTracks) { - if (!jcoll.has_mcCollision()) { + if (!jcoll.has_mcCollision()) return; - } + auto mcColl = jcoll.template mcCollision_as>(); double weight = mcColl.weight(); @@ -1042,6 +1047,7 @@ struct V0QA { for (const auto& pv0 : mcpjet.template candidates_as()) { if (!v0sAreMatched(v0, pv0, jTracks)) continue; + int pdg = pv0.pdgCode(); bool correctCollision = (mcColl.mcCollisionId() == pv0.mcCollisionId()); @@ -1072,9 +1078,9 @@ struct V0QA { } } - if (!v0.has_mcMotherParticle()) { + if (!v0.has_mcMotherParticle()) continue; - } + auto mother = v0.mcMotherParticle(); pdg = mother.pdgCode(); correctCollision = (mcColl.mcCollisionId() == mother.mcCollisionId()); @@ -1100,16 +1106,16 @@ struct V0QA { void processFeeddown(soa::Filtered::iterator const& jcoll, CandidatesV0MCDWithFlags const& v0s, aod::CandidatesV0MCP const&, soa::Join const&, aod::McCollisions const&, aod::McParticles const&) { // Based on PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx - if (!jcoll.has_mcCollision()) { + if (!jcoll.has_mcCollision()) return; - } + auto mcColl = jcoll.template mcCollision_as>(); double weight = mcColl.weight(); for (const auto& v0 : v0s) { - if (!v0.has_mcParticle()) { + if (!v0.has_mcParticle()) continue; - } + int pdg = v0.mcParticle().pdgCode(); // Check V0 decay kinematics @@ -1136,17 +1142,17 @@ struct V0QA { void processFeeddownJets(soa::Filtered::iterator const& jcoll, MCDV0JetsWithConstituents const& mcdjets, CandidatesV0MCDWithFlags const&, aod::CandidatesV0MCP const&, soa::Join const&, aod::McCollisions const&, aod::McParticles const&) { // Based on PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx - if (!jcoll.has_mcCollision()) { + if (!jcoll.has_mcCollision()) return; - } + auto mcColl = jcoll.template mcCollision_as>(); double weight = mcColl.weight(); for (const auto& mcdjet : mcdjets) { for (const auto& v0 : mcdjet.template candidates_as()) { - if (!v0.has_mcParticle()) { + if (!v0.has_mcParticle()) continue; - } + int pdg = v0.mcParticle().pdgCode(); // Check V0 decay kinematics @@ -1174,9 +1180,9 @@ struct V0QA { void processFeeddownMatchedJets(soa::Filtered::iterator const& jcoll, MatchedMCDV0JetsWithConstituents const& mcdjets, aod::JetTracksMCD const& jTracks, MatchedMCPV0JetsWithConstituents const&, CandidatesV0MCDWithFlags const&, aod::CandidatesV0MCP const&, soa::Join const&, aod::McCollisions const&, aod::McParticles const&) { // Based on PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx - if (!jcoll.has_mcCollision()) { + if (!jcoll.has_mcCollision()) return; - } + auto mcColl = jcoll.template mcCollision_as>(); double weight = mcColl.weight(); @@ -1221,9 +1227,9 @@ struct V0QA { // return; // } for (const auto& v0 : v0s) { - if (v0.isRejectedCandidate()) { + if (v0.isRejectedCandidate()) continue; - } + fillTrackQa(v0); } } From 0f629f22106d2611d47f8d3aee3a7a03e28e5ff8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Wed, 16 Apr 2025 12:22:59 +0200 Subject: [PATCH 1010/1650] O2 linter: Fix new lines of the result message in GitHub mode (#10874) --- Scripts/o2_linter.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Scripts/o2_linter.py b/Scripts/o2_linter.py index 13ef222b854..23fdb3f2322 100644 --- a/Scripts/o2_linter.py +++ b/Scripts/o2_linter.py @@ -1723,7 +1723,7 @@ def main(): if passed: msg_result = "All tests passed." if github_mode: - print(f"::notice title={title_result}::{msg_result}") + print(f"\n::notice title={title_result}::{msg_result}") else: print(f"\n{title_result}: {msg_result}") else: @@ -1733,7 +1733,7 @@ def main(): " followed by the name of the test and parentheses with a reason for the exception." ) if github_mode: - print(f"::error title={title_result}::{msg_result}") + print(f"\n::error title={title_result}::{msg_result}") print(f"::notice::{msg_disable}") else: print(f"\n{title_result}: {msg_result}") From a9c4ac4500087c18aadf99e84bc7b0bd54d2a397 Mon Sep 17 00:00:00 2001 From: Lars <146946151+ljoergen@users.noreply.github.com> Date: Wed, 16 Apr 2025 14:50:11 +0200 Subject: [PATCH 1011/1650] [PWGLF] angularCorrelationsInJets.cxx: improved resource use (#10854) --- .../Nuspex/angularCorrelationsInJets.cxx | 185 ++++++++---------- 1 file changed, 87 insertions(+), 98 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx b/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx index 10a8701fd83..269d6959bf7 100644 --- a/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx +++ b/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx @@ -85,16 +85,26 @@ struct AngularCorrelationsInJets { Configurable minJetPt{"minJetPt", 10.0, "minimum total pT to accept jet"}; // Proton Cuts + Configurable protonDCAxyYield{"protonDCAxyYield", 0.05, "[proton] DCAxy cut for yield"}; + Configurable protonDCAzYield{"protonDCAzYield", 0.05, "[proton] DCAz cut for yield"}; Configurable protonDCAxyCF{"protonDCAxyCF", 0.05, "[proton] DCAxy cut for CF"}; Configurable protonDCAzCF{"protonDCAzCF", 0.02, "[proton] DCAz cut for CF"}; Configurable protonTPCTOFpT{"protonTPCTOFpT", 0.7, "[proton] pT for switch in TPC/TPC+TOF nsigma"}; + Configurable protonTPCnsigmaLowPtYield{"protonTPCnsigmaLowPtYield", 4.0, "[proton] max TPC nsigma with low pT for yield"}; + Configurable protonTPCnsigmaHighPtYield{"protonTPCnsigmaHighPtYield", 4.0, "[proton] max TPC nsigma with high pT for yield"}; + Configurable protonTOFnsigmaHighPtYield{"protonTOFnsigmaHighPtYield", 4.0, "[proton] max TOF nsigma with high pT yield"}; Configurable protonTPCnsigma{"protonTPCnsigma", 4.0, "[proton] max TPC nsigma for pt > 0/1.5/3.0 GeV"}; Configurable protonTOFnsigma{"protonTOFnsigma", 3.0, "[proton] max TOF nsigma for pt > 0/1.5/3.0 GeV"}; // Antiproton Cuts + Configurable antiprotonDCAxyYield{"antiprotonDCAxyYield", 0.05, "[antiproton] DCAxy cut for yield"}; + Configurable antiprotonDCAzYield{"antiprotonDCAzYield", 0.05, "[antiproton] DCAz cut for yield"}; Configurable antiprotonDCAxyCF{"antiprotonDCAxyCF", 0.05, "[antiproton] DCAxy cut for CF"}; Configurable antiprotonDCAzCF{"antiprotonDCAzCF", 0.02, "[antiproton] DCAz cut for CF"}; Configurable antiprotonTPCTOFpT{"antiprotonTPCTOFpT", 0.7, "[antiproton] pT for switch in TPC/TPC+TOF nsigma"}; + Configurable antiprotonTPCnsigmaLowPtYield{"antiprotonTPCnsigmaLowPtYield", 4.0, "[antiproton] max TPC nsigma with low pT for yield"}; + Configurable antiprotonTPCnsigmaHighPtYield{"antiprotonTPCnsigmaHighPtYield", 4.0, "[antiproton] max TPC nsigma with high pT for yield"}; + Configurable antiprotonTOFnsigmaHighPtYield{"antiprotonTOFnsigmaHighPtYield", 4.0, "[antiproton] min TOF nsigma with high pT for yield"}; Configurable antiprotonTPCnsigma{"antiprotonTPCnsigma", 4.0, "[antiproton] max TPC nsigma for pt > 0/1.5/3.0 GeV"}; Configurable antiprotonTOFnsigma{"antiprotonTOFnsigma", 3.0, "[antiproton] max TOF nsigma for pt > 0/1.5/3.0 GeV"}; @@ -168,68 +178,80 @@ struct AngularCorrelationsInJets { registryData.add("numJetsInEvent", "Number of jets selected", HistType::kTH1I, {{10, 0, 10}}); registryData.add("jetRapidity", "Jet rapidity;#it{y}", HistType::kTH1F, {{200, -1, 1}}); - registryData.add("ptJetProton", "p_{T} of protons", HistType::kTH1D, {axisSpecs.ptAxisPos}); - registryData.add("ptJetAntiproton", "p_{T} of antiprotons", HistType::kTH1D, {axisSpecs.ptAxisPos}); - - registryQC.add("ptJetProtonVsTotalJet", "Proton p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); - registryQC.add("ptJetAntiprotonVsTotalJet", "Antiproton p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); - - registryData.add("tpcNSigmaProtonCF", "TPC n#sigma for proton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tofNSigmaProtonCF", "TOF n#sigma for proton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tpcNSigmaAntiprotonCF", "TPC n#sigma for antiproton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tofNSigmaAntiprotonCF", "TOF n#sigma for antiproton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tpcNSigmaPion", "TPC n#sigma for pion", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tofNSigmaPion", "TOF n#sigma for pion", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - - registryData.add("deltaPhiSEFull", "#Delta#varphi of particles in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiSEJet", "#Delta#varphi of jet particles in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiSEProton", "#Delta#varphi of protons in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiSEAntiproton", "#Delta#varphi of antiprotons in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiSEPion", "#Delta#varphi of pions in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiSEProtonAntiproton", "#Delta#varphi of proton-antiproton in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - - registryData.add("deltaPhiMEFull", "#Delta#varphi of particles in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiMEJet", "#Delta#varphi of jet particles in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiMEProton", "#Delta#varphi of protons in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiMEAntiproton", "#Delta#varphi of antiprotons in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiMEPion", "#Delta#varphi of pions in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - registryData.add("deltaPhiMEProtonAntiproton", "#Delta#varphi of proton-antiproton in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); - - registryData.add("deltaPhiEtaSEFull", "#Delta#varphi vs #Delta#eta of full particles in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaSEJet", "#Delta#varphi vs #Delta#eta of jet particles in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaSEProton", "#Delta#varphi vs #Delta#eta of protons in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaSEAntiproton", "#Delta#varphi vs #Delta#eta of antiprotons in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaSEPion", "#Delta#varphi vs #Delta#eta of pions in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaSEProtonAntiproton", "#Delta#varphi vs #Delta#eta of proton-antiproton in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - - registryData.add("deltaPhiEtaMEFull", "#Delta#varphi vs #Delta#eta of particles in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaMEJet", "#Delta#varphi vs #Delta#eta of jet particles in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaMEProton", "#Delta#varphi vs #Delta#eta of protons in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaMEAntiproton", "#Delta#varphi vs #Delta#eta of antiprotons in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaMEPion", "#Delta#varphi vs #Delta#eta of pions in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - registryData.add("deltaPhiEtaMEProtonAntiproton", "#Delta#varphi vs #Delta#eta of proton-antiproton in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); - - registryData.add("dcaZJetProton", "DCA_{z} of high purity protons", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); - registryData.add("dcaZJetAntiproton", "DCA_{z} of high purity antiprotons", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); - registryData.add("dcaZJetPion", "DCA_{z} of high purity pions", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); + if (doFullCorrelations) { + registryData.add("deltaPhiSEFull", "#Delta#varphi of particles in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiMEFull", "#Delta#varphi of particles in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiEtaSEFull", "#Delta#varphi vs #Delta#eta of full particles in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaMEFull", "#Delta#varphi vs #Delta#eta of particles in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + } + + if (doJetCorrelations) { + registryData.add("deltaPhiSEJet", "#Delta#varphi of jet particles in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiMEJet", "#Delta#varphi of jet particles in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiEtaSEJet", "#Delta#varphi vs #Delta#eta of jet particles in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaMEJet", "#Delta#varphi vs #Delta#eta of jet particles in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + } + + if (doppCorrelations) { + registryData.add("deltaPhiSEProton", "#Delta#varphi of protons in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiMEProton", "#Delta#varphi of protons in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiEtaSEProton", "#Delta#varphi vs #Delta#eta of protons in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaMEProton", "#Delta#varphi vs #Delta#eta of protons in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + } + + if (doapapCorrelations) { + registryData.add("deltaPhiSEAntiproton", "#Delta#varphi of antiprotons in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiMEAntiproton", "#Delta#varphi of antiprotons in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiEtaSEAntiproton", "#Delta#varphi vs #Delta#eta of antiprotons in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaMEAntiproton", "#Delta#varphi vs #Delta#eta of antiprotons in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + } + + if (dopipiCorrelations) { + registryData.add("dcaZJetPion", "DCA_{z} of high purity pions", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); + registryQC.add("ptJetPionVsTotalJet", "Pion p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); + registryData.add("tpcNSigmaPion", "TPC n#sigma for pion", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tofNSigmaPion", "TOF n#sigma for pion", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("deltaPhiSEPion", "#Delta#varphi of pions in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiMEPion", "#Delta#varphi of pions in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiEtaSEPion", "#Delta#varphi vs #Delta#eta of pions in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaMEPion", "#Delta#varphi vs #Delta#eta of pions in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + } + + if (dopapCorrelations) { + registryData.add("deltaPhiSEProtonAntiproton", "#Delta#varphi of proton-antiproton in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiMEProtonAntiproton", "#Delta#varphi of proton-antiproton in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiEtaSEProtonAntiproton", "#Delta#varphi vs #Delta#eta of proton-antiproton in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaMEProtonAntiproton", "#Delta#varphi vs #Delta#eta of proton-antiproton in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + } + + if (doprocessMCRun2 || doprocessMCRun3 || doppCorrelations || doapapCorrelations || dopapCorrelations) { + registryData.add("ptJetProton", "p_{T} of protons", HistType::kTH1D, {axisSpecs.ptAxisPos}); + registryData.add("dcaZJetProton", "DCA_{z} of high purity protons", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); + registryQC.add("ptJetProtonVsTotalJet", "Proton p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); + registryData.add("ptJetAntiproton", "p_{T} of antiprotons", HistType::kTH1D, {axisSpecs.ptAxisPos}); + registryData.add("dcaZJetAntiproton", "DCA_{z} of high purity antiprotons", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); + registryQC.add("ptJetAntiprotonVsTotalJet", "Antiproton p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); + registryData.add("tpcNSigmaProtonCF", "TPC n#sigma for proton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tofNSigmaProtonCF", "TOF n#sigma for proton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tpcNSigmaAntiprotonCF", "TPC n#sigma for antiproton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tofNSigmaAntiprotonCF", "TOF n#sigma for antiproton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + } + + if (measureKaons) { + registryData.add("dcaZJetKaon", "DCA_{z} of high purity kaons", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); + registryQC.add("ptJetKaonVsTotalJet", "Kaon p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); + registryData.add("tpcNSigmaKaon", "TPC n#sigma for kaon", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tofNSigmaKaon", "TOF n#sigma for kaon", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + } + // pT registryData.add("ptJetParticle", "p_{T} of particles in jets", HistType::kTH1D, {axisSpecs.ptAxisPos}); - registryData.add("ptTotalSubJetArea", "Subtracted full jet p_{T} (area)", HistType::kTH1D, {axisSpecs.ptAxisPos}); registryData.add("ptTotalSubJetPerp", "Subtracted full jet p_{T} (perpendicular)", HistType::kTH1D, {axisSpecs.ptAxisPos}); registryData.add("ptTotalJet", "p_{T} of entire jet;#it{p}_{T} [GeV/#it{c}]", HistType::kTH1F, {{1000, 0, 500}}); - registryQC.add("ptJetPionVsTotalJet", "Pion p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); - registryQC.add("ptJetKaonVsTotalJet", "Kaon p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); // nSigma registryData.add("tpcSignal", "TPC signal", HistType::kTH2F, {{400, -10, 10, "#it{p} [GeV/#it{c}]"}, {1000, 0, 500, "d#it{E}/d#it{X} (a.u.)"}}); registryData.add("tofSignal", "TOF signal", HistType::kTH2F, {{400, -20, 20, "#it{p} [GeV/#it{c}]"}, {400, 0.75, 1.05, "#beta (TOF)"}}); - registryData.add("tpcNSigmaKaon", "TPC n#sigma for kaon", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tofNSigmaKaon", "TOF n#sigma for kaon", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - - // DCA - registryData.add("dcaXYFullJet", "DCA_{xy} of full jet", HistType::kTH2F, {axisSpecs.ptAxisFull, axisSpecs.dcaxyAxis}); - registryData.add("dcaZFullJet", "DCA_{z} of full jet", HistType::kTH2F, {axisSpecs.ptAxisFull, axisSpecs.dcazAxis}); - registryData.add("dcaZJetKaon", "DCA_{z} of high purity kaons", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); // Angular Distributions registryQC.add("phiFullEvent", "#varphi in full event", HistType::kTH1F, {{1000, 0, 6.3}}); @@ -244,8 +266,6 @@ struct AngularCorrelationsInJets { // QA registryQC.add("rhoEstimatePerp", "Background #rho (perp)", HistType::kTH2F, {{axisSpecs.ptAxisPos}, {200, 0, 20}}); registryQC.add("rhoMEstimatePerp", "Background #rho_{m} (perp)", HistType::kTH2F, {{axisSpecs.ptAxisPos}, {200, 0, 20}}); - registryQC.add("rhoEstimateArea", "Background #rho (area)", HistType::kTH2F, {{axisSpecs.ptAxisPos}, {200, 0, 20}}); - registryQC.add("rhoMEstimateArea", "Background #rho_{m} (area)", HistType::kTH2F, {{axisSpecs.ptAxisPos}, {200, 0, 20}}); registryQC.add("jetPtVsNumPart", "Total jet p_{T} vs number of constituents", HistType::kTH2F, {axisSpecs.ptAxisPos, {100, 0, 100}}); if (doprocessMCRun2 || doprocessMCRun3) { @@ -741,14 +761,12 @@ struct AngularCorrelationsInJets { return; } - int analyseJet(int jetCounter, fastjet::PseudoJet jet, const auto& particles, auto& jetProtons, auto& jetAntiprotons, auto& jetPiPlus, auto& jetPiMinus, auto& jetAll, double rho, double rhoM, double rhoPerp, double rhoMPerp) + int analyseJet(int jetCounter, fastjet::PseudoJet jet, const auto& particles, auto& jetProtons, auto& jetAntiprotons, auto& jetPiPlus, auto& jetPiMinus, auto& jetAll, double rhoPerp, double rhoMPerp) { if (!jet.has_constituents()) return jetCounter; fastjet::PseudoJet subtractedJetPerp(0., 0., 0., 0.); subtractedJetPerp = bkgSub.doRhoAreaSub(jet, rhoPerp, rhoMPerp); - fastjet::PseudoJet subtractedJetArea(0., 0., 0., 0.); - subtractedJetArea = bkgSub.doRhoAreaSub(jet, rho, rhoM); if (subtractedJetPerp.pt() < minJetPt) // cut on jet w/o bkg return jetCounter; @@ -756,9 +774,6 @@ struct AngularCorrelationsInJets { return jetCounter; jetCounter++; registryData.fill(HIST("ptTotalSubJetPerp"), subtractedJetPerp.pt()); - registryData.fill(HIST("ptTotalSubJetArea"), subtractedJetArea.pt()); - registryQC.fill(HIST("rhoEstimateArea"), jet.pt(), rho); // switch to subtracted jet pt - registryQC.fill(HIST("rhoMEstimateArea"), jet.pt(), rhoM); registryQC.fill(HIST("rhoEstimatePerp"), jet.pt(), rhoPerp); registryQC.fill(HIST("rhoMEstimatePerp"), jet.pt(), rhoMPerp); double jetBkgDeltaPt = jet.pt() - subtractedJetPerp.pt(); @@ -884,8 +899,6 @@ struct AngularCorrelationsInJets { continue; jetAll.emplace_back(jetParticle); - registryData.fill(HIST("dcaXYFullJet"), jetParticle.pt() * jetParticle.sign(), jetParticle.dcaXY()); - registryData.fill(HIST("dcaZFullJet"), jetParticle.pt() * jetParticle.sign(), jetParticle.dcaZ()); registryData.fill(HIST("tpcSignal"), jetParticle.pt() * jetParticle.sign(), jetParticle.tpcSignal()); if (jetParticle.hasTOF()) { registryData.fill(HIST("tofSignal"), jetParticle.pt() * jetParticle.sign(), jetParticle.beta()); @@ -895,19 +908,19 @@ struct AngularCorrelationsInJets { registryQC.fill(HIST("ptDiff"), ptDiff); } - if (isProton(jetParticle)) { + if ((doppCorrelations || dopapCorrelations) && isProton(jetParticle)) { registryData.fill(HIST("trackProtocol"), 3); // # high purity protons registryData.fill(HIST("ptJetProton"), jetParticle.pt()); registryData.fill(HIST("dcaZJetProton"), jetParticle.pt(), jetParticle.dcaZ()); registryQC.fill(HIST("ptJetProtonVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); jetProtons.emplace_back(jetParticle); - } else if (isAntiproton(jetParticle)) { + } else if ((doapapCorrelations || dopapCorrelations) && isAntiproton(jetParticle)) { registryData.fill(HIST("trackProtocol"), 4); // # high purity antiprotons registryData.fill(HIST("ptJetAntiproton"), jetParticle.pt()); registryData.fill(HIST("dcaZJetAntiproton"), jetParticle.pt(), jetParticle.dcaZ()); registryQC.fill(HIST("ptJetAntiprotonVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); jetAntiprotons.emplace_back(jetParticle); - } else if (isPion(jetParticle)) { + } else if (dopipiCorrelations && isPion(jetParticle)) { registryQC.fill(HIST("ptJetPionVsTotalJet"), jetParticle.pt(), subtractedJetPerp.pt()); registryData.fill(HIST("trackProtocol"), 5); registryData.fill(HIST("dcaZJetPion"), jetParticle.pt(), jetParticle.dcaZ()); @@ -979,8 +992,6 @@ struct AngularCorrelationsInJets { particles.clear(); int index = 0; int jetCounter = 0; - std::vector jets; - jets.clear(); for (const auto& track : tracks) { registryData.fill(HIST("trackProtocol"), 0); // # all tracks @@ -990,7 +1001,7 @@ struct AngularCorrelationsInJets { registryData.fill(HIST("trackProtocol"), 1); // # tracks selected for jet reconstruction double mass = 0.139; - if (outputQC && (track.tpcNClsFindable() != 0)) { + if (track.tpcNClsFindable() != 0) { registryQC.fill(HIST("ratioCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows() / track.tpcNClsFindable()); } @@ -1023,27 +1034,20 @@ struct AngularCorrelationsInJets { registryData.fill(HIST("eventProtocol"), 2); // Reconstruct Jets - double ghostMaxrap = 1.0; - double ghostArea = 0.005; - int ghostRepeat = 1; fastjet::JetDefinition jetDef(fastjet::antikt_algorithm, jetR); - fastjet::JetDefinition jetDefBkg(fastjet::kt_algorithm, jetR); - fastjet::AreaDefinition areaDef(fastjet::active_area, fastjet::GhostedAreaSpec(ghostMaxrap, ghostRepeat, ghostArea)); - fastjet::AreaDefinition areaDefBkg(fastjet::active_area_explicit_ghosts, fastjet::GhostedAreaSpec(ghostMaxrap)); + fastjet::AreaDefinition areaDef(fastjet::active_area, fastjet::GhostedAreaSpec(1.0)); fastjet::ClusterSequenceArea clusterSeq(jetInput, jetDef, areaDef); - jets = sorted_by_pt(clusterSeq.inclusive_jets()); + std::vector jets = sorted_by_pt(clusterSeq.inclusive_jets()); if (jets.size() == 0) return; registryData.fill(HIST("eventProtocol"), 3); - bool doSparse = true; - auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(jetInput, doSparse); auto [rhoPerp, rhoMPerp] = bkgSub.estimateRhoPerpCone(jetInput, jets); for (const auto& jet : jets) { - jetCounter = analyseJet(jetCounter, jet, particles, jetProtons, jetAntiprotons, jetPiPlus, jetPiMinus, jetAll, rho, rhoM, rhoPerp, rhoMPerp); + jetCounter = analyseJet(jetCounter, jet, particles, jetProtons, jetAntiprotons, jetPiPlus, jetPiMinus, jetAll, rhoPerp, rhoMPerp); } registryData.fill(HIST("numJetsInEvent"), jetCounter); @@ -1061,11 +1065,9 @@ struct AngularCorrelationsInJets { particles.clear(); int index = 0; double mass = 0.139; // pion mass for input because 80% is pions anyway - std::vector jets; - jets.clear(); for (const auto& track : tracks) { - if (outputQC && (track.tpcNClsFindable() != 0)) { + if (track.tpcNClsFindable() != 0) { registryQC.fill(HIST("ratioCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows() / track.tpcNClsFindable()); } registryQC.fill(HIST("ptFullEvent"), track.pt()); @@ -1095,23 +1097,16 @@ struct AngularCorrelationsInJets { registryData.fill(HIST("eventProtocol"), 2); // Reconstruct Jets - double ghostMaxrap = 1.0; - double ghostArea = 0.005; - int ghostRepeat = 1; fastjet::JetDefinition jetDef(fastjet::antikt_algorithm, jetR); - fastjet::JetDefinition jetDefBkg(fastjet::kt_algorithm, jetR); - fastjet::AreaDefinition areaDef(fastjet::active_area, fastjet::GhostedAreaSpec(ghostMaxrap, ghostRepeat, ghostArea)); - fastjet::AreaDefinition areaDefBkg(fastjet::active_area_explicit_ghosts, fastjet::GhostedAreaSpec(ghostMaxrap)); + fastjet::AreaDefinition areaDef(fastjet::active_area, fastjet::GhostedAreaSpec(1.0)); fastjet::ClusterSequenceArea clusterSeq(jetInput, jetDef, areaDef); - jets = sorted_by_pt(clusterSeq.inclusive_jets()); + std::vector jets = sorted_by_pt(clusterSeq.inclusive_jets()); if (jets.size() == 0) return; registryData.fill(HIST("eventProtocol"), 3); - bool doSparse = true; - auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(jetInput, doSparse); auto [rhoPerp, rhoMPerp] = bkgSub.estimateRhoPerpCone(jetInput, jets); for (auto& jet : jets) { // o2-linter: disable=const-ref-in-for-loop (jets are modified) @@ -1119,14 +1114,10 @@ struct AngularCorrelationsInJets { continue; fastjet::PseudoJet subtractedJetPerp(0., 0., 0., 0.); subtractedJetPerp = bkgSub.doRhoAreaSub(jet, rhoPerp, rhoMPerp); - fastjet::PseudoJet subtractedJetArea(0., 0., 0., 0.); - subtractedJetArea = bkgSub.doRhoAreaSub(jet, rho, rhoM); if (subtractedJetPerp.pt() < minJetPt) // cut on jet w/o bkg continue; registryData.fill(HIST("ptTotalSubJetPerp"), subtractedJetPerp.pt()); - registryQC.fill(HIST("rhoEstimateArea"), jet.pt(), rho); // switch to subtracted jet pt - registryQC.fill(HIST("rhoMEstimateArea"), jet.pt(), rhoM); registryQC.fill(HIST("rhoEstimatePerp"), jet.pt(), rhoPerp); registryQC.fill(HIST("rhoMEstimatePerp"), jet.pt(), rhoMPerp); double jetBkgDeltaPt = jet.pt() - subtractedJetPerp.pt(); @@ -1214,8 +1205,6 @@ struct AngularCorrelationsInJets { if (!selectTrack(jetParticle)) continue; - registryData.fill(HIST("dcaXYFullJet"), jetParticle.pt() * jetParticle.sign(), jetParticle.dcaXY()); - registryData.fill(HIST("dcaZFullJet"), jetParticle.pt() * jetParticle.sign(), jetParticle.dcaZ()); registryData.fill(HIST("tpcSignal"), jetParticle.pt() * jetParticle.sign(), jetParticle.tpcSignal()); if (jetParticle.hasTOF()) { registryData.fill(HIST("tofSignal"), jetParticle.pt() * jetParticle.sign(), jetParticle.beta()); From 7c1bc2f6f9b3cbbd065499a2e8f66186003dfa37 Mon Sep 17 00:00:00 2001 From: Marvin Hemmer <53471402+mhemmer-cern@users.noreply.github.com> Date: Wed, 16 Apr 2025 15:19:09 +0200 Subject: [PATCH 1012/1650] [PWGJE,EMCAL-670] Add BC selection to EMCal QA task (#10847) --- PWGJE/Core/utilsBcSelEMC.h | 185 ++++++++++++++++++++++++++++ PWGJE/Tasks/emcEventSelectionQA.cxx | 33 ++++- 2 files changed, 217 insertions(+), 1 deletion(-) create mode 100644 PWGJE/Core/utilsBcSelEMC.h diff --git a/PWGJE/Core/utilsBcSelEMC.h b/PWGJE/Core/utilsBcSelEMC.h new file mode 100644 index 00000000000..1796d130d7f --- /dev/null +++ b/PWGJE/Core/utilsBcSelEMC.h @@ -0,0 +1,185 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file utilsBcSelEMC.h +/// \brief BC selection utilities for EMCal QA +/// \author Marvin Hemmer , Goethe-University + +#ifndef PWGJE_CORE_UTILSBCSELEMC_H_ +#define PWGJE_CORE_UTILSBCSELEMC_H_ + +#include // std::shared_ptr +#include // std::string + +#include "Framework/Configurable.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/HistogramSpec.h" +#include "Framework/OutputObjHeader.h" + +#include "Common/CCDB/EventSelectionParams.h" + +namespace o2::emc_evsel +{ +// event rejection types +enum EventRejection { + None = 0, + Trigger, + TvxTrigger, + TimeFrameBorderCut, + ItsRofBorderCut, + IsGoodZvtxFT0vsPV, + NoSameBunchPileup, + NoCollInTimeRangeNarrow, + NoCollInTimeRangeStandard, + NoCollInRofStandard, + NEventRejection +}; + +o2::framework::AxisSpec axisEvents = {EventRejection::NEventRejection, -0.5f, +EventRejection::NEventRejection - 0.5f, ""}; + +/// \brief Function to put labels on monitoring histogram +/// \param hRejection monitoring histogram +template +void setEventRejectionLabels(Histo& hRejection) +{ + // Puts labels on the bc monitoring histogram. + hRejection->GetXaxis()->SetBinLabel(EventRejection::None + 1, "All"); + hRejection->GetXaxis()->SetBinLabel(EventRejection::Trigger + 1, "Sel8"); + hRejection->GetXaxis()->SetBinLabel(EventRejection::TvxTrigger + 1, "TVX Trigger"); + hRejection->GetXaxis()->SetBinLabel(EventRejection::TimeFrameBorderCut + 1, "TF border"); + hRejection->GetXaxis()->SetBinLabel(EventRejection::ItsRofBorderCut + 1, "ITS ROF border"); + hRejection->GetXaxis()->SetBinLabel(EventRejection::IsGoodZvtxFT0vsPV + 1, "PV #it{z} consistency FT0 timing"); + hRejection->GetXaxis()->SetBinLabel(EventRejection::NoSameBunchPileup + 1, "No same-bunch pile-up"); + hRejection->GetXaxis()->SetBinLabel(EventRejection::NoCollInTimeRangeNarrow + 1, "No coll timerange narrow"); + hRejection->GetXaxis()->SetBinLabel(EventRejection::NoCollInTimeRangeStandard + 1, "No coll timerange strict"); + hRejection->GetXaxis()->SetBinLabel(EventRejection::NoCollInRofStandard + 1, "No coll in ROF std"); +} + +struct EMCEventSelection : o2::framework::ConfigurableGroup { + std::string prefix = "emcBcSel"; // JSON group name + // event selection parameters (in chronological order of application) + o2::framework::Configurable useSel8Trigger{"useSel8Trigger", true, "Apply the sel8 event selection"}; + o2::framework::Configurable triggerClass{"triggerClass", -1, "Trigger class different from sel8 (e.g. kINT7 for Run2) used only if useSel8Trigger is false"}; + o2::framework::Configurable useTvxTrigger{"useTvxTrigger", true, "Apply TVX trigger sel"}; + o2::framework::Configurable useTimeFrameBorderCut{"useTimeFrameBorderCut", true, "Apply TF border cut"}; + o2::framework::Configurable useItsRofBorderCut{"useItsRofBorderCut", true, "Apply ITS ROF border cut"}; + o2::framework::Configurable useIsGoodZvtxFT0vsPV{"useIsGoodZvtxFT0vsPV", false, "Check consistency between PVz from central barrel with that from FT0 timing"}; + o2::framework::Configurable useNoSameBunchPileup{"useNoSameBunchPileup", false, "Exclude collisions in bunches with more than 1 reco. PV"}; + o2::framework::Configurable useNoCollInTimeRangeNarrow{"useNoCollInTimeRangeNarrow", false, "Reject collisions in time range narrow"}; + o2::framework::Configurable useNoCollInTimeRangeStandard{"useNoCollInTimeRangeStandard", false, "Reject collisions in time range strict"}; + o2::framework::Configurable useNoCollInRofStandard{"useNoCollInRofStandard", false, "Reject collisions in ROF standard"}; + + // histogram names + static constexpr char NameHistBCs[] = "hBCs"; + + std::shared_ptr hBCs; + + int currentRun{-1}; + + /// \brief Adds bc monitoring histograms in the histogram registry. + /// \param registry reference to the histogram registry + void addHistograms(o2::framework::HistogramRegistry& registry) + { + hBCs = registry.add(NameHistBCs, "EMC event counter;;# of accepted collisions", {o2::framework::HistType::kTH1D, {axisEvents}}); + setEventRejectionLabels(hBCs); + } + + /// \brief Applies event selection. + /// \tparam useEvSel use information from the EvSel table + /// \param bc bc to test against the selection criteria + /// \return bitmask with the event selection criteria not satisfied by the bc + template + uint16_t getEMCCollisionRejectionMask(const Bc& bc) + { + uint16_t rejectionMask{0}; // 16 bits, in case new ev. selections will be added + + if constexpr (useEvSel) { + /// trigger condition + bool sel8 = bc.selection_bit(o2::aod::evsel::kIsBBT0A) && bc.selection_bit(o2::aod::evsel::kIsBBT0C); + if ((useSel8Trigger && sel8) || (!useSel8Trigger && triggerClass > -1 && !bc.alias_bit(triggerClass))) { + SETBIT(rejectionMask, EventRejection::Trigger); + } + /// TVX trigger selection + if (useTvxTrigger && !bc.selection_bit(o2::aod::evsel::kIsTriggerTVX)) { + SETBIT(rejectionMask, EventRejection::TvxTrigger); + } + /// time frame border cut + if (useTimeFrameBorderCut && !bc.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { + SETBIT(rejectionMask, EventRejection::TimeFrameBorderCut); + } + /// ITS rof border cut + if (useItsRofBorderCut && !bc.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { + SETBIT(rejectionMask, EventRejection::ItsRofBorderCut); + } + /// PVz consistency tracking - FT0 timing + if (useIsGoodZvtxFT0vsPV && !bc.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { + SETBIT(rejectionMask, EventRejection::IsGoodZvtxFT0vsPV); + } + /// remove collisions in bunches with more than 1 reco bc + /// POTENTIALLY BAD FOR BEAUTY ANALYSES + if (useNoSameBunchPileup && !bc.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { + SETBIT(rejectionMask, EventRejection::NoSameBunchPileup); + } + /// No collisions in time range narrow + if (useNoCollInTimeRangeNarrow && !bc.selection_bit(o2::aod::evsel::kNoCollInTimeRangeNarrow)) { + SETBIT(rejectionMask, EventRejection::NoCollInTimeRangeNarrow); + } + /// No collisions in time range strict + if (useNoCollInTimeRangeStandard && !bc.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + SETBIT(rejectionMask, EventRejection::NoCollInTimeRangeStandard); + } + /// No collisions in ROF standard + if (useNoCollInRofStandard && !bc.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { + SETBIT(rejectionMask, EventRejection::NoCollInRofStandard); + } + } + return rejectionMask; + } + + /// \brief Fills histograms for monitoring event selections satisfied by the bc. + /// \param rejectionMask bitmask storing the info about which ev. selections are not satisfied by the bc + void fillHistograms(const uint16_t rejectionMask) + { + hBCs->Fill(EventRejection::None); + for (std::size_t reason = 1; reason < EventRejection::NEventRejection; reason++) { + if (TESTBIT(rejectionMask, reason)) { + return; + } + hBCs->Fill(reason); + } + } +}; + +struct EMCEventSelectionMc { + // event selection parameters (in chronological order of application) + bool useSel8Trigger{false}; // Apply the Sel8 selection + bool useTvxTrigger{false}; // Apply the TVX trigger + bool useTimeFrameBorderCut{true}; // Apply TF border cut + bool useItsRofBorderCut{false}; // Apply the ITS RO frame border cut + + void configureFromDevice(const o2::framework::DeviceSpec& device) + { + for (const auto& option : device.options) { + if (option.name.compare("emcEvSel.useSel8Trigger") == 0) { + useSel8Trigger = option.defaultValue.get(); + } else if (option.name.compare("emcEvSel.useTvxTrigger") == 0) { + useTvxTrigger = option.defaultValue.get(); + } else if (option.name.compare("emcEvSel.useTimeFrameBorderCut") == 0) { + useTimeFrameBorderCut = option.defaultValue.get(); + } else if (option.name.compare("emcEvSel.useItsRofBorderCut") == 0) { + useItsRofBorderCut = option.defaultValue.get(); + } + } + } +}; +} // namespace o2::emc_evsel + +#endif // PWGJE_CORE_UTILSBCSELEMC_H_ diff --git a/PWGJE/Tasks/emcEventSelectionQA.cxx b/PWGJE/Tasks/emcEventSelectionQA.cxx index 3d2746630c8..53bc21b56b4 100644 --- a/PWGJE/Tasks/emcEventSelectionQA.cxx +++ b/PWGJE/Tasks/emcEventSelectionQA.cxx @@ -22,16 +22,20 @@ #include "Framework/HistogramRegistry.h" #include "Common/DataModel/EventSelection.h" +#include "PWGJE/Core/utilsBcSelEMC.h" using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; +using namespace o2::emc_evsel; using BCEvSels = o2::soa::Join; using CollEventSels = o2::soa::Join; using FilteredCells = o2::soa::Filtered; struct EmcEventSelectionQA { + + EMCEventSelection emcEvSel; // event selection and monitoring o2::framework::HistogramRegistry mHistManager{"EMCALEventSelectionQAHistograms"}; // Require EMCAL cells (CALO type 1) @@ -81,6 +85,8 @@ struct EmcEventSelectionQA { mHistManager.add("hBCCollisionCounter_TVX", "Number of BCs with a certain number of rec. colls", O2HistType::kTH2F, {bcAxis, matchingAxis}); mHistManager.add("hBCEMCalReadoutAndEmcalCellContent", "Bunch crossings with EMCAL trigger from CTP and non-0 EMCAL cell content", O2HistType::kTH1F, {bcAxis}); mHistManager.add("hBCNotEMCalReadoutButEmcalCellContent", "Bunch crossings without EMCAL trigger from CTP but with non-0 EMCAL cell content", O2HistType::kTH1F, {bcAxis}); + mHistManager.add("hBCNotAcceptedButEMCalReadout", "Bunch crossings with EMCAL trigger from CTP but not accpeted due to BC selection", O2HistType::kTH1F, {bcAxis}); + mHistManager.add("hBCNotAcceptedButEmcalCellContent", "Bunch crossings with non-0 EMCAL cell content but not accpeted due to BC selection", O2HistType::kTH1F, {bcAxis}); mHistManager.add("hAmplitudevsCellTimeNoReadout", "Amplitude vs cell time for bunch crossings without EMCAL trigger from CTP but with non-0 EMCAL cell content", O2HistType::kTH2D, {timeAxisLarge, amplitudeAxisLarge}); initCollisionHistogram(mHistManager.get(HIST("hCollisionMatching")).get()); @@ -96,6 +102,8 @@ struct EmcEventSelectionQA { initCollisionHistogram(mHistManager.get(HIST("hCollisionMatchingDJ1")).get()); initCollisionHistogram(mHistManager.get(HIST("hCollisionMatchingEJ2")).get()); initCollisionHistogram(mHistManager.get(HIST("hCollisionMatchingDJ2")).get()); + + emcEvSel.addHistograms(mHistManager); // collision monitoring } PresliceUnsorted perFoundBC = aod::evsel::foundBCId; @@ -120,6 +128,11 @@ struct EmcEventSelectionQA { bool isEMCALreadout = false; auto bcID = bc.globalBC() % 3564; + // get bitmask with bc selection info + const auto rejectionMask = emcEvSel.getEMCCollisionRejectionMask(bc); + // monitor the satisfied event selections + emcEvSel.fillHistograms(rejectionMask); + if (bc.runNumber() > mRun3MinNumber) { // in case of run3 not all BCs contain EMCAL data, require trigger selection also for min. bias // in addition select also L0/L1 triggers as triggers with EMCAL in reaodut @@ -134,6 +147,25 @@ struct EmcEventSelectionQA { } } + // lookup number of cells for global BC of this BC + // avoid iteration over cell table for speed reason + auto found = cellGlobalBCs.find(bc.globalBC()); + + if (rejectionMask != 0) { + // at least one event selection not satisfied --> reject the candidate + continue; + } else { + if (isEMCALreadout) { + mHistManager.fill(HIST("hBCNotAcceptedButEMCalReadout"), bcID); + } + if (found != cellGlobalBCs.end()) { + // require at least 1 cell for global BC + if (found->second > 0) { + mHistManager.fill(HIST("hBCNotAcceptedButEmcalCellContent"), bcID); + } + } + } + // Monitoring BCs with EMCAL trigger / readout / FIT trigger if (isEMCALreadout) { mHistManager.fill(HIST("hBCEmcalReadout"), bcID); @@ -175,7 +207,6 @@ struct EmcEventSelectionQA { // lookup number of cells for global BC of this BC // avoid iteration over cell table for speed reason - auto found = cellGlobalBCs.find(bc.globalBC()); if (found != cellGlobalBCs.end()) { // require at least 1 cell for global BC if (found->second > 0) { From 8a32d43ddd437452a3dd921178067a7e02ebea34 Mon Sep 17 00:00:00 2001 From: Bong-Hwi Lim Date: Wed, 16 Apr 2025 19:26:15 +0200 Subject: [PATCH 1013/1650] [PWGLF] Resonance Framework: Add RCT Flag checker (#10859) --- .../Resonances/resonanceInitializer.cxx | 28 +++++++++++++++++++ .../Resonances/resonanceModuleInitializer.cxx | 12 ++++++++ 2 files changed, 40 insertions(+) diff --git a/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx b/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx index 132fa09f3d2..da010f6ea59 100644 --- a/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx +++ b/PWGLF/TableProducer/Resonances/resonanceInitializer.cxx @@ -47,6 +47,7 @@ using namespace o2::framework::expressions; using namespace o2::soa; using namespace o2::constants::physics; using namespace o2::constants::math; +using namespace o2::aod::rctsel; /// Initializer for the resonance candidate producers struct ResonanceInitializer { @@ -103,6 +104,7 @@ struct ResonanceInitializer { /// Event cuts o2::analysis::CollisonCuts colCuts; + struct : ConfigurableGroup { Configurable cfgEvtZvtx{"cfgEvtZvtx", 10.f, "Evt sel: Max. z-Vertex (cm)"}; Configurable cfgEvtOccupancyInTimeRangeMax{"cfgEvtOccupancyInTimeRangeMax", -1, "Evt sel: maximum track occupancy"}; @@ -118,7 +120,12 @@ struct ResonanceInitializer { Configurable cfgEvtCollInTimeRangeStandard{"cfgEvtCollInTimeRangeStandard", false, "Evt sel: apply NoCollInTimeRangeStandard"}; Configurable cfgEvtRun2AliEventCuts{"cfgEvtRun2AliEventCuts", true, "Evt sel: apply Run2 AliEventCuts"}; Configurable cfgEvtRun2INELgtZERO{"cfgEvtRun2INELgtZERO", false, "Evt sel: apply Run2 INELgtZERO"}; + Configurable cfgEvtUseRCTFlagChecker{"cfgEvtUseRCTFlagChecker", false, "Evt sel: use RCT flag checker"}; + Configurable cfgEvtRCTFlagCheckerLabel{"cfgEvtRCTFlagCheckerLabel", "CBT_hadronPID", "Evt sel: RCT flag checker label"}; + Configurable cfgEvtRCTFlagCheckerZDCCheck{"cfgEvtRCTFlagCheckerZDCCheck", false, "Evt sel: RCT flag checker ZDC check"}; + Configurable cfgEvtRCTFlagCheckerLimitAcceptAsBad{"cfgEvtRCTFlagCheckerLimitAcceptAsBad", false, "Evt sel: RCT flag checker treat Limited Acceptance As Bad"}; } EventCuts; + RCTFlagsChecker rctChecker; Configurable cfgMultName{"cfgMultName", "FT0M", "The name of multiplicity estimator"}; @@ -1202,6 +1209,9 @@ struct ResonanceInitializer { colCuts.setApplyRun2AliEventCuts(EventCuts.cfgEvtRun2AliEventCuts); colCuts.setApplyRun2INELgtZERO(EventCuts.cfgEvtRun2INELgtZERO); colCuts.printCuts(); + + rctChecker.init(EventCuts.cfgEvtRCTFlagCheckerLabel, EventCuts.cfgEvtRCTFlagCheckerZDCCheck, EventCuts.cfgEvtRCTFlagCheckerLimitAcceptAsBad); + if (!cfgBypassCCDB) { ccdb->setURL(ccdbURL.value); ccdb->setCaching(true); @@ -1287,6 +1297,8 @@ struct ResonanceInitializer { // Default event selection if (!colCuts.isSelected(collision)) return; + if (EventCuts.cfgEvtUseRCTFlagChecker && !rctChecker(collision)) + return; colCuts.fillQA(collision); resoCollisions(0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); @@ -1311,6 +1323,8 @@ struct ResonanceInitializer { // Default event selection if (!colCuts.isSelected(collision)) return; + if (EventCuts.cfgEvtUseRCTFlagChecker && !rctChecker(collision)) + return; colCuts.fillQARun2(collision); resoCollisions(0, collision.posX(), collision.posY(), collision.posZ(), collision.centRun2V0M(), dBz); @@ -1336,6 +1350,8 @@ struct ResonanceInitializer { // Default event selection if (!colCuts.isSelected(collision)) return; + if (EventCuts.cfgEvtUseRCTFlagChecker && !rctChecker(collision)) + return; colCuts.fillQA(collision); resoCollisions(0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); @@ -1361,6 +1377,8 @@ struct ResonanceInitializer { // Default event selection if (!colCuts.isSelected(collision)) return; + if (EventCuts.cfgEvtUseRCTFlagChecker && !rctChecker(collision)) + return; colCuts.fillQA(collision); resoCollisions(0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); @@ -1415,6 +1433,8 @@ struct ResonanceInitializer { // Default event selection if (!colCuts.isSelected(collision)) return; + if (EventCuts.cfgEvtUseRCTFlagChecker && !rctChecker(collision)) + return; colCuts.fillQA(collision); resoCollisions(0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); @@ -1467,6 +1487,8 @@ struct ResonanceInitializer { { auto bc = collision.bc_as(); /// adding timestamp to access magnetic field later initCCDB(bc); + if (EventCuts.cfgEvtUseRCTFlagChecker && !rctChecker(collision)) + return; colCuts.fillQA(collision); resoCollisions(0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); @@ -1497,6 +1519,8 @@ struct ResonanceInitializer { { auto bc = collision.bc_as(); /// adding timestamp to access magnetic field later initCCDB(bc); + if (EventCuts.cfgEvtUseRCTFlagChecker && !rctChecker(collision)) + return; colCuts.fillQA(collision); resoCollisions(0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); @@ -1552,6 +1576,8 @@ struct ResonanceInitializer { { auto bc = collision.bc_as(); /// adding timestamp to access magnetic field later initCCDB(bc); + if (EventCuts.cfgEvtUseRCTFlagChecker && !rctChecker(collision)) + return; colCuts.fillQA(collision); resoCollisions(0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); @@ -1612,6 +1638,8 @@ struct ResonanceInitializer { { auto bc = collision.bc_as(); /// adding timestamp to access magnetic field later initCCDB(bc); + if (EventCuts.cfgEvtUseRCTFlagChecker && !rctChecker(collision)) + return; colCuts.fillQA(collision); resoCollisions(0, collision.posX(), collision.posY(), collision.posZ(), centEst(collision), dBz); diff --git a/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx b/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx index 838a8c0a793..5dc53b28509 100644 --- a/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx +++ b/PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx @@ -48,6 +48,7 @@ using namespace o2::framework::expressions; using namespace o2::soa; using namespace o2::constants::physics; using namespace o2::constants::math; +using namespace o2::aod::rctsel; /** * @brief Initializer for the event pool for resonance study @@ -107,6 +108,11 @@ struct ResonanceModuleInitializer { Configurable cfgEvtNoITSROBorderCut{"cfgEvtNoITSROBorderCut", false, "Evt sel: apply NoITSRO border cut"}; Configurable cfgEvtRun2AliEventCuts{"cfgEvtRun2AliEventCuts", true, "Evt sel: apply Run2 AliEventCuts"}; Configurable cfgEvtRun2INELgtZERO{"cfgEvtRun2INELgtZERO", false, "Evt sel: apply Run2 INELgtZERO"}; + Configurable cfgEvtUseRCTFlagChecker{"cfgEvtUseRCTFlagChecker", false, "Evt sel: use RCT flag checker"}; + Configurable cfgEvtRCTFlagCheckerLabel{"cfgEvtRCTFlagCheckerLabel", "CBT_hadronPID", "Evt sel: RCT flag checker label"}; + Configurable cfgEvtRCTFlagCheckerZDCCheck{"cfgEvtRCTFlagCheckerZDCCheck", false, "Evt sel: RCT flag checker ZDC check"}; + Configurable cfgEvtRCTFlagCheckerLimitAcceptAsBad{"cfgEvtRCTFlagCheckerLimitAcceptAsBad", false, "Evt sel: RCT flag checker treat Limited Acceptance As Bad"}; + RCTFlagsChecker rctChecker; // Spherocity configuration Configurable cfgTrackSphMin{"cfgTrackSphMin", 10, "Number of tracks for Spherocity Calculation"}; @@ -169,6 +175,8 @@ struct ResonanceModuleInitializer { colCuts.setApplyRun2AliEventCuts(cfgEvtRun2AliEventCuts); colCuts.setApplyRun2INELgtZERO(cfgEvtRun2INELgtZERO); + rctChecker.init(cfgEvtRCTFlagCheckerLabel, cfgEvtRCTFlagCheckerZDCCheck, cfgEvtRCTFlagCheckerLimitAcceptAsBad); + // Configure CCDB access if not bypassed if (!cfgBypassCCDB) { ccdb->setURL(ccdbURL.value); @@ -531,6 +539,8 @@ struct ResonanceModuleInitializer { // Default event selection if (!colCuts.isSelected(collision)) return; + if (cfgEvtUseRCTFlagChecker && !rctChecker(collision)) + return; colCuts.fillQA(collision); centrality = centEst(collision); @@ -574,6 +584,8 @@ struct ResonanceModuleInitializer { void processRun3MC(soa::Filtered::iterator const& collision, aod::McParticles const& mcParticles, GenMCCollisions const&) { + if (cfgEvtUseRCTFlagChecker && !rctChecker(collision)) + return; fillMCCollision(collision, mcParticles); } PROCESS_SWITCH(ResonanceModuleInitializer, processRun3MC, "process MC for RUN3", false); From 228f65fd6fc8fd63ac0bc3b259dae2450d2f6885 Mon Sep 17 00:00:00 2001 From: fuchuncui <162277233+fuchuncui@users.noreply.github.com> Date: Thu, 17 Apr 2025 03:01:30 +0800 Subject: [PATCH 1014/1650] [PWGCF] fix bugs about MCGen hLocalDensity and track selection (#10872) --- PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx | 231 ++++++++++++++-------------- 1 file changed, 117 insertions(+), 114 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx b/PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx index cc244a1ba53..c4d9d5d0ef7 100644 --- a/PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx +++ b/PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx @@ -294,7 +294,8 @@ struct FlowGfwOmegaXi { registry.add("Lambdac24dpt", ";pt ; C_{2}{4} ", {HistType::kTProfile3D, {cfgaxisPtV0, cfgaxisLambdaMassforflow, axisMultiplicity}}); // for Jackknife if (cfgDoJackknife) { - for (int i = 1; i <= 10; i++) { + int nsubevent = 10; + for (int i = 1; i <= nsubevent; i++) { refc22[i - 1] = registry.add(Form("Jackknife/REF/c22_%d", i), ";Centrality (%) ; C_{2}{2} ", {HistType::kTProfile, {axisMultiplicity}}); refc24[i - 1] = registry.add(Form("Jackknife/REF/c24_%d", i), ";Centrality (%) ; C_{2}{2} ", {HistType::kTProfile, {axisMultiplicity}}); xic22[i - 1] = registry.add(Form("Jackknife/Xi/Xic22dpt_%d", i), ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtXi, cfgaxisXiMassforflow, axisMultiplicity}}); @@ -608,20 +609,21 @@ struct FlowGfwOmegaXi { { if (correctionsLoaded) return; - if (cfgAcceptance.size() == 5) { - for (int i = 0; i <= 4; i++) { + int nspecies = 5; + if (cfgAcceptance.size() == static_cast(nspecies)) { + for (int i = 0; i <= nspecies - 1; i++) { mAcceptance.push_back(ccdb->getForTimeStamp(cfgAcceptance[i], timestamp)); } - if (mAcceptance.size() == 5) + if (mAcceptance.size() == static_cast(nspecies)) LOGF(info, "Loaded acceptance weights"); else LOGF(warning, "Could not load acceptance weights"); } - if (cfgEfficiency.size() == 5) { - for (int i = 0; i <= 4; i++) { + if (cfgEfficiency.size() == static_cast(nspecies)) { + for (int i = 0; i <= nspecies - 1; i++) { mEfficiency.push_back(ccdb->getForTimeStamp(cfgEfficiency[i], timestamp)); } - if (mEfficiency.size() == 5) + if (mEfficiency.size() == static_cast(nspecies)) LOGF(info, "Loaded efficiency histogram"); else LOGF(fatal, "Could not load efficiency histogram"); @@ -633,14 +635,15 @@ struct FlowGfwOmegaXi { bool setCurrentParticleWeights(float& weight_nue, float& weight_nua, TrackObject track, float vtxz, int ispecies) { float eff = 1.; - if (mEfficiency.size() == 5) + int nspecies = 5; + if (mEfficiency.size() == static_cast(nspecies)) eff = mEfficiency[ispecies]->GetBinContent(mEfficiency[ispecies]->FindBin(track.pt())); else eff = 1.0; if (eff == 0) return false; weight_nue = 1. / eff; - if (mAcceptance.size() == 5) + if (mAcceptance.size() == static_cast(nspecies)) weight_nua = mAcceptance[ispecies]->getNUA(track.phi(), track.eta(), vtxz); else weight_nua = 1; @@ -703,7 +706,9 @@ struct FlowGfwOmegaXi { if (collision.numContrib() > 1) { vtxz = collision.posZ(); float zRes = std::sqrt(collision.covZZ()); - if (zRes > 0.25 && collision.numContrib() < 20) + double zResMin = 0.25; + int numContMax = 20; + if (zRes > zResMin && collision.numContrib() < numContMax) vtxz = -999; } auto multNTracksPV = collision.multNTracksPV(); @@ -719,7 +724,8 @@ struct FlowGfwOmegaXi { return 0; // V0A T0A 5 sigma cut - if (std::fabs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > 5 * fT0AV0ASigma->Eval(collision.multFT0A())) + int nsigma = 5; + if (std::fabs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > nsigma * fT0AV0ASigma->Eval(collision.multFT0A())) return 0; return true; @@ -730,7 +736,8 @@ struct FlowGfwOmegaXi { int nTot = tracks.size(); int candNumAll[4] = {0, 0, 0, 0}; int candNum[4] = {0, 0, 0, 0}; - for (int i = 0; i < 4; i++) { + int nspecies = 5; + for (int i = 0; i < nspecies - 1; i++) { registry.fill(HIST("hEventCount"), 0.5, i + 0.5); } if (nTot < 1) @@ -748,7 +755,7 @@ struct FlowGfwOmegaXi { registry.fill(HIST("hVtxZ"), vtxz); registry.fill(HIST("hMult"), nTot); registry.fill(HIST("hCent"), cent); - for (int i = 0; i < 4; i++) { + for (int i = 0; i < nspecies - 1; i++) { registry.fill(HIST("hEventCount"), 1.5, i + 0.5); } @@ -786,6 +793,7 @@ struct FlowGfwOmegaXi { registry.fill(HIST("hCentvsNch"), cent, nch); } // fill GFW of V0 flow + double lowpt = 0.4; for (const auto& v0 : V0s) { auto v0posdau = v0.posTrack_as(); auto v0negdau = v0.negTrack_as(); @@ -798,7 +806,7 @@ struct FlowGfwOmegaXi { // K0short if (v0.qtarm() / std::fabs(v0.alpha()) > cfgv0_ArmPodocut && std::fabs(v0.mK0Short() - o2::constants::physics::MassK0Short) < cfgv0_mk0swindow && (!cfgcheckDauTPC || (std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0])) && - (!cfgcheckDauTOF || ((std::fabs(v0posdau.tofNSigmaPi()) < cfgNSigma[3] || v0posdau.pt() < 0.4) && (std::fabs(v0negdau.tofNSigmaPi()) < cfgNSigma[3] || v0negdau.pt() < 0.4)))) { + (!cfgcheckDauTOF || ((std::fabs(v0posdau.tofNSigmaPi()) < cfgNSigma[3] || v0posdau.pt() < lowpt) && (std::fabs(v0negdau.tofNSigmaPi()) < cfgNSigma[3] || v0negdau.pt() < lowpt)))) { registry.fill(HIST("InvMassK0s_all"), v0.pt(), v0.mK0Short(), v0.eta(), cent); isK0s = true; candNumAll[0] = candNumAll[0] + 1; @@ -807,13 +815,13 @@ struct FlowGfwOmegaXi { // Lambda and antiLambda if (std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < cfgv0_mlambdawindow && (!cfgcheckDauTPC || (std::fabs(v0posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0])) && - (!cfgcheckDauTOF || ((std::fabs(v0posdau.tofNSigmaPr()) < cfgNSigma[4] || v0posdau.pt() < 0.4) && (std::fabs(v0negdau.tofNSigmaPi()) < cfgNSigma[3] || v0negdau.pt() < 0.4)))) { + (!cfgcheckDauTOF || ((std::fabs(v0posdau.tofNSigmaPr()) < cfgNSigma[4] || v0posdau.pt() < lowpt) && (std::fabs(v0negdau.tofNSigmaPi()) < cfgNSigma[3] || v0negdau.pt() < lowpt)))) { registry.fill(HIST("InvMassLambda_all"), v0.pt(), v0.mLambda(), v0.eta(), cent); isLambda = true; candNumAll[1] = candNumAll[1] + 1; } else if (std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < cfgv0_mlambdawindow && (!cfgcheckDauTPC || (std::fabs(v0negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0])) && - (!cfgcheckDauTOF || ((std::fabs(v0negdau.tofNSigmaPr()) < cfgNSigma[4] || v0negdau.pt() < 0.4) && (std::fabs(v0posdau.tofNSigmaPi()) < cfgNSigma[3] || v0posdau.pt() < 0.4)))) { + (!cfgcheckDauTOF || ((std::fabs(v0negdau.tofNSigmaPr()) < cfgNSigma[4] || v0negdau.pt() < lowpt) && (std::fabs(v0posdau.tofNSigmaPi()) < cfgNSigma[3] || v0posdau.pt() < lowpt)))) { registry.fill(HIST("InvMassLambda_all"), v0.pt(), v0.mLambda(), v0.eta(), cent); isLambda = true; candNumAll[1] = candNumAll[1] + 1; @@ -864,12 +872,10 @@ struct FlowGfwOmegaXi { if (cfgDoLocDenCorr) { int phibin = -999; phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(v0.phi(), -constants::math::PI)); - if (phibin > -900) { - double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); - setCurrentLocalDensityWeights(wloc, v0, density, 1); - if (cfgOutputLocDenWeights) - registry.fill(HIST("MC/densityMCRecK0s"), v0.pt(), nch, density, v0.mK0Short()); - } + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + setCurrentLocalDensityWeights(wloc, v0, density, 1); + if (cfgOutputLocDenWeights) + registry.fill(HIST("MC/densityMCRecK0s"), v0.pt(), nch, density, v0.mK0Short()); } candNum[0] = candNum[0] + 1; registry.fill(HIST("InvMassK0s"), v0.pt(), v0.mK0Short(), v0.eta(), cent); @@ -884,12 +890,10 @@ struct FlowGfwOmegaXi { if (cfgDoLocDenCorr) { int phibin = -999; phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(v0.phi(), -constants::math::PI)); - if (phibin > -900) { - double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); - setCurrentLocalDensityWeights(wloc, v0, density, 2); - if (cfgOutputLocDenWeights) - registry.fill(HIST("MC/densityMCRecLambda"), v0.pt(), nch, density, v0.mLambda()); - } + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + setCurrentLocalDensityWeights(wloc, v0, density, 2); + if (cfgOutputLocDenWeights) + registry.fill(HIST("MC/densityMCRecLambda"), v0.pt(), nch, density, v0.mLambda()); } candNum[1] = candNum[1] + 1; registry.fill(HIST("InvMassLambda"), v0.pt(), v0.mLambda(), v0.eta(), cent); @@ -911,29 +915,29 @@ struct FlowGfwOmegaXi { bool isOmega = false; bool isXi = false; // Omega and antiOmega - if (casc.sign() < 0 && (casc.mOmega() > 1.63) && (casc.mOmega() < 1.71) && std::fabs(casc.yOmega()) < cfgCasc_rapidity && + if (casc.sign() < 0 && std::fabs(casc.yOmega()) < cfgCasc_rapidity && (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0])) && - (!cfgcheckDauTOF || ((std::fabs(bachelor.tofNSigmaKa()) < cfgNSigma[5] || bachelor.pt() < 0.4) && (std::fabs(posdau.tofNSigmaPr()) < cfgNSigma[4] || posdau.pt() < 0.4) && (std::fabs(negdau.tofNSigmaPi()) < cfgNSigma[3] || negdau.pt() < 0.4)))) { + (!cfgcheckDauTOF || ((std::fabs(bachelor.tofNSigmaKa()) < cfgNSigma[5] || bachelor.pt() < lowpt) && (std::fabs(posdau.tofNSigmaPr()) < cfgNSigma[4] || posdau.pt() < lowpt) && (std::fabs(negdau.tofNSigmaPi()) < cfgNSigma[3] || negdau.pt() < lowpt)))) { registry.fill(HIST("InvMassOmega_all"), casc.pt(), casc.mOmega(), casc.eta(), cent); isOmega = true; candNumAll[3] = candNumAll[3] + 1; - } else if (casc.sign() > 0 && (casc.mOmega() > 1.63) && (casc.mOmega() < 1.71) && std::fabs(casc.yOmega()) < cfgCasc_rapidity && + } else if (casc.sign() > 0 && std::fabs(casc.yOmega()) < cfgCasc_rapidity && (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0])) && - (!cfgcheckDauTOF || ((std::fabs(bachelor.tofNSigmaKa()) < cfgNSigma[5] || bachelor.pt() < 0.4) && (std::fabs(negdau.tofNSigmaPr()) < cfgNSigma[4] || negdau.pt() < 0.4) && (std::fabs(posdau.tofNSigmaPi()) < cfgNSigma[3] || posdau.pt() < 0.4)))) { + (!cfgcheckDauTOF || ((std::fabs(bachelor.tofNSigmaKa()) < cfgNSigma[5] || bachelor.pt() < lowpt) && (std::fabs(negdau.tofNSigmaPr()) < cfgNSigma[4] || negdau.pt() < lowpt) && (std::fabs(posdau.tofNSigmaPi()) < cfgNSigma[3] || posdau.pt() < lowpt)))) { registry.fill(HIST("InvMassOmega_all"), casc.pt(), casc.mOmega(), casc.eta(), cent); isOmega = true; candNumAll[3] = candNumAll[3] + 1; } // Xi and antiXi - if (casc.sign() < 0 && (casc.mXi() > 1.30) && (casc.mXi() < 1.37) && std::fabs(casc.yXi()) < cfgCasc_rapidity && + if (casc.sign() < 0 && std::fabs(casc.yXi()) < cfgCasc_rapidity && (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0])) && - (!cfgcheckDauTOF || ((std::fabs(bachelor.tofNSigmaPi()) < cfgNSigma[3] || bachelor.pt() < 0.4) && (std::fabs(posdau.tofNSigmaPr()) < cfgNSigma[4] || posdau.pt() < 0.4) && (std::fabs(negdau.tofNSigmaPi()) < cfgNSigma[3] || negdau.pt() < 0.4)))) { + (!cfgcheckDauTOF || ((std::fabs(bachelor.tofNSigmaPi()) < cfgNSigma[3] || bachelor.pt() < lowpt) && (std::fabs(posdau.tofNSigmaPr()) < cfgNSigma[4] || posdau.pt() < lowpt) && (std::fabs(negdau.tofNSigmaPi()) < cfgNSigma[3] || negdau.pt() < lowpt)))) { registry.fill(HIST("InvMassXi_all"), casc.pt(), casc.mXi(), casc.eta(), cent); isXi = true; candNumAll[2] = candNumAll[2] + 1; - } else if (casc.sign() > 0 && (casc.mXi() > 1.30) && (casc.mXi() < 1.37) && std::fabs(casc.yXi()) < cfgCasc_rapidity && + } else if (casc.sign() > 0 && std::fabs(casc.yXi()) < cfgCasc_rapidity && (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0])) && - (!cfgcheckDauTOF || ((std::fabs(bachelor.tofNSigmaPi()) < cfgNSigma[3] || bachelor.pt() < 0.4) && (std::fabs(negdau.tofNSigmaPr()) < cfgNSigma[4] || negdau.pt() < 0.4) && (std::fabs(posdau.tofNSigmaPi()) < cfgNSigma[3] || posdau.pt() < 0.4)))) { + (!cfgcheckDauTOF || ((std::fabs(bachelor.tofNSigmaPi()) < cfgNSigma[3] || bachelor.pt() < lowpt) && (std::fabs(negdau.tofNSigmaPr()) < cfgNSigma[4] || negdau.pt() < lowpt) && (std::fabs(posdau.tofNSigmaPi()) < cfgNSigma[3] || posdau.pt() < lowpt)))) { registry.fill(HIST("InvMassXi_all"), casc.pt(), casc.mXi(), casc.eta(), cent); isXi = true; candNumAll[2] = candNumAll[2] + 1; @@ -992,12 +996,10 @@ struct FlowGfwOmegaXi { if (cfgDoLocDenCorr) { int phibin = -999; phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(casc.phi(), -constants::math::PI)); - if (phibin > -900) { - double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); - setCurrentLocalDensityWeights(wloc, casc, density, 4); - if (cfgOutputLocDenWeights) - registry.fill(HIST("MC/densityMCRecOmega"), casc.pt(), nch, density, casc.mOmega()); - } + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + setCurrentLocalDensityWeights(wloc, casc, density, 4); + if (cfgOutputLocDenWeights) + registry.fill(HIST("MC/densityMCRecOmega"), casc.pt(), nch, density, casc.mOmega()); } candNum[3] = candNum[3] + 1; registry.fill(HIST("hEtaPhiVtxzPOIOmega"), casc.phi(), casc.eta(), vtxz, wacc); @@ -1012,12 +1014,10 @@ struct FlowGfwOmegaXi { if (cfgDoLocDenCorr) { int phibin = -999; phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(casc.phi(), -constants::math::PI)); - if (phibin > -900) { - double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); - setCurrentLocalDensityWeights(wloc, casc, density, 3); - if (cfgOutputLocDenWeights) - registry.fill(HIST("MC/densityMCRecXi"), casc.pt(), nch, density, casc.mXi()); - } + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + setCurrentLocalDensityWeights(wloc, casc, density, 3); + if (cfgOutputLocDenWeights) + registry.fill(HIST("MC/densityMCRecXi"), casc.pt(), nch, density, casc.mXi()); } candNum[2] = candNum[2] + 1; registry.fill(HIST("hEtaPhiVtxzPOIXi"), casc.phi(), casc.eta(), vtxz, wacc); @@ -1027,7 +1027,7 @@ struct FlowGfwOmegaXi { fWeightsXi->fill(casc.phi(), casc.eta(), vtxz, casc.pt(), cent, 0); } } - for (int i = 0; i < 4; i++) { + for (int i = 0; i < nspecies - 1; i++) { if (candNumAll[i] > 0) { registry.fill(HIST("hEventCount"), 2.5, i + 0.5); } @@ -1063,8 +1063,9 @@ struct FlowGfwOmegaXi { // Fill subevents flow if (cfgDoJackknife) { TRandom3* fRdm = new TRandom3(0); - double eventrdm = 10 * fRdm->Rndm(); - for (int j = 1; j <= 10; j++) { + int nsubevent = 10; + double eventrdm = nsubevent * fRdm->Rndm(); + for (int j = 1; j <= nsubevent; j++) { if (eventrdm > (j - 1) && eventrdm < j) continue; fillProfile(corrconfigs.at(15), refc22[j - 1], cent); @@ -1113,21 +1114,25 @@ struct FlowGfwOmegaXi { if (mcParticle.has_tracks()) { auto const& tracks = mcParticle.tracks_as(); for (const auto& track : tracks) { - if (track.pt() < cfgCutPtPOIMin || track.pt() > cfgCutPtPOIMax) + if (track.pt() < cfgCutPtPOIMin || track.pt() > cfgCutPtPOIMax) { continue; - if (std::fabs(track.eta()) > 0.8) + } + if (std::fabs(track.eta()) > cfgCutEta) { continue; - if (!(track.hasTPC() && track.hasITS())) + } + if (!(track.isGlobalTrack())) { continue; - if (track.tpcChi2NCl() > cfgCutChi2prTPCcls) + } + if (track.tpcChi2NCl() > cfgCutChi2prTPCcls) { continue; - int ptbin = fPtAxis->FindBin(track.pt()) - 1; - if ((track.pt() > cfgCutPtMin) && (track.pt() < cfgCutPtMax)) { - fGFW->Fill(track.eta(), ptbin, track.phi(), 1, 64); //(eta, ptbin, phi, wacc*weff, bitmask) } - if ((track.pt() > cfgCutPtPOIMin) && (track.pt() < cfgCutPtPOIMax)) { - hLocalDensity->Fill(track.phi(), 1); - hLocalDensity->Fill(RecoDecay::constrainAngle(track.phi(), -constants::math::TwoPI), 1); + int ptbin = fPtAxis->FindBin(mcParticle.pt()) - 1; + if ((mcParticle.pt() > cfgCutPtMin) && (mcParticle.pt() < cfgCutPtMax)) { + fGFW->Fill(mcParticle.eta(), ptbin, mcParticle.phi(), 1, 64); //(eta, ptbin, phi, wacc*weff, bitmask) + } + if ((mcParticle.pt() > cfgCutPtPOIMin) && (mcParticle.pt() < cfgCutPtPOIMax)) { + hLocalDensity->Fill(mcParticle.phi(), 1); + hLocalDensity->Fill(RecoDecay::constrainAngle(mcParticle.phi(), -constants::math::TwoPI), 1); nch++; } } @@ -1141,7 +1146,7 @@ struct FlowGfwOmegaXi { int pdgCode = std::abs(straGen.pdgCode()); if (pdgCode != PDG_t::kXiMinus && pdgCode != PDG_t::kOmegaMinus && pdgCode != PDG_t::kK0Short && pdgCode != PDG_t::kLambda0) continue; - if (std::fabs(straGen.eta()) > 0.8) + if (std::fabs(straGen.eta()) > cfgCutEta) continue; if (pdgCode == PDG_t::kXiMinus) { @@ -1192,7 +1197,7 @@ struct FlowGfwOmegaXi { } PROCESS_SWITCH(FlowGfwOmegaXi, processMCGen, "", true); - void processMCRec(AodCollisions::iterator const& collision, AodTracks const& tracks, aod::BCsWithTimestamps const&, soa::Join const& V0s, soa::Join const& Cascades, DaughterTracks const&, aod::McParticles const&) + void processMCRec(AodCollisions::iterator const& collision, soa::Join const& tracks, aod::BCsWithTimestamps const&, soa::Join const& V0s, soa::Join const& Cascades, DaughterTracks const&, aod::McParticles const&) { fGFW->Clear(); const auto cent = collision.centFT0C(); @@ -1213,6 +1218,17 @@ struct FlowGfwOmegaXi { double nch = 0; for (const auto& track : tracks) { + if (!track.has_mcParticle()) + continue; + if (track.pt() < cfgCutPtPOIMin || track.pt() > cfgCutPtPOIMax) + continue; + if (std::fabs(track.eta()) > cfgCutEta) + continue; + if (!(track.isGlobalTrack())) + continue; + if (track.tpcChi2NCl() > cfgCutChi2prTPCcls) + continue; + auto mcParticle = track.mcParticle_as(); if (cfgDoAccEffCorr) { if (!setCurrentParticleWeights(weff, wacc, track, vtxz, 0)) continue; @@ -1229,12 +1245,13 @@ struct FlowGfwOmegaXi { if ((track.pt() > cfgCutPtPOIMin) && (track.pt() < cfgCutPtPOIMax)) { fGFW->Fill(track.eta(), ptbin, track.phi(), wacc * weff, 32); if (cfgDoLocDenCorr) { - hLocalDensity->Fill(track.phi(), wacc * weff); - hLocalDensity->Fill(RecoDecay::constrainAngle(track.phi(), -constants::math::TwoPI), wacc * weff); + hLocalDensity->Fill(mcParticle.phi(), wacc * weff); + hLocalDensity->Fill(RecoDecay::constrainAngle(mcParticle.phi(), -constants::math::TwoPI), wacc * weff); nch += wacc * weff; } } } + if (cfgDoLocDenCorr) { registry.fill(HIST("hCentvsNch"), cent, nch); } @@ -1293,71 +1310,63 @@ struct FlowGfwOmegaXi { // Omega and antiOmega int pdgCode{cascMC.pdgCode()}; double cascPt{cascMC.pt()}; - double cascPhi{casc.phi()}; - double cascEta{casc.eta()}; + double cascPhi{cascMC.phi()}; + double cascEta{cascMC.eta()}; if (std::abs(pdgCode) == kOmegaMinus) { - if (casc.sign() < 0 && (casc.mOmega() > 1.63) && (casc.mOmega() < 1.71) && std::fabs(casc.yOmega()) < cfgCasc_rapidity && + if (casc.sign() < 0 && std::fabs(casc.yOmega()) < cfgCasc_rapidity && (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { if (cfgDoAccEffCorr) setCurrentParticleWeights(weff, wacc, casc, vtxz, 4); if (cfgDoLocDenCorr) { int phibin = -999; phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(cascPhi, -constants::math::PI)); - if (phibin > -900) { - double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); - setCurrentLocalDensityWeights(wloc, casc, density, 4); - if (cfgOutputLocDenWeights) - registry.fill(HIST("MC/densityMCRecOmega"), cascPt, nch, density, casc.mOmega()); - } + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + setCurrentLocalDensityWeights(wloc, casc, density, 4); + if (cfgOutputLocDenWeights) + registry.fill(HIST("MC/densityMCRecOmega"), cascPt, nch, density, casc.mOmega()); } fGFW->Fill(cascEta, fXiPtAxis->FindBin(cascPt) - 1, cascPhi, wacc * weff * wloc, 4); - } else if (casc.sign() > 0 && (casc.mOmega() > 1.63) && (casc.mOmega() < 1.71) && std::fabs(casc.yOmega()) < cfgCasc_rapidity && + } else if (casc.sign() > 0 && std::fabs(casc.yOmega()) < cfgCasc_rapidity && (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0]))) { if (cfgDoAccEffCorr) setCurrentParticleWeights(weff, wacc, casc, vtxz, 4); if (cfgDoLocDenCorr) { int phibin = -999; phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(cascPhi, -constants::math::PI)); - if (phibin > -900) { - double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); - setCurrentLocalDensityWeights(wloc, casc, density, 4); - if (cfgOutputLocDenWeights) - registry.fill(HIST("MC/densityMCRecOmega"), cascPt, nch, density, casc.mOmega()); - } + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + setCurrentLocalDensityWeights(wloc, casc, density, 4); + if (cfgOutputLocDenWeights) + registry.fill(HIST("MC/densityMCRecOmega"), cascPt, nch, density, casc.mOmega()); } fGFW->Fill(cascEta, fXiPtAxis->FindBin(cascPt) - 1, cascPhi, wacc * weff * wloc, 4); } } // Xi and antiXi if (std::abs(pdgCode) == kXiMinus) { - if (casc.sign() < 0 && (casc.mXi() > 1.30) && (casc.mXi() < 1.37) && std::fabs(casc.yXi()) < cfgCasc_rapidity && + if (casc.sign() < 0 && std::fabs(casc.yXi()) < cfgCasc_rapidity && (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { if (cfgDoAccEffCorr) setCurrentParticleWeights(weff, wacc, casc, vtxz, 3); if (cfgDoLocDenCorr) { int phibin = -999; phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(cascPhi, -constants::math::PI)); - if (phibin > -900) { - double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); - setCurrentLocalDensityWeights(wloc, casc, density, 3); - if (cfgOutputLocDenWeights) - registry.fill(HIST("MC/densityMCRecXi"), cascPt, nch, density, casc.mXi()); - } + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + setCurrentLocalDensityWeights(wloc, casc, density, 3); + if (cfgOutputLocDenWeights) + registry.fill(HIST("MC/densityMCRecXi"), cascPt, nch, density, casc.mXi()); } fGFW->Fill(cascEta, fXiPtAxis->FindBin(cascPt) - 1, cascPhi, wacc * weff * wloc, 2); - } else if (casc.sign() > 0 && (casc.mXi() > 1.30) && (casc.mXi() < 1.37) && std::fabs(casc.yXi()) < cfgCasc_rapidity && + } else if (casc.sign() > 0 && std::fabs(casc.yXi()) < cfgCasc_rapidity && (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0]))) { if (cfgDoAccEffCorr) setCurrentParticleWeights(weff, wacc, casc, vtxz, 3); if (cfgDoLocDenCorr) { int phibin = -999; phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(cascPhi, -constants::math::PI)); - if (phibin > -900) { - double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); - setCurrentLocalDensityWeights(wloc, casc, density, 3); - if (cfgOutputLocDenWeights) - registry.fill(HIST("MC/densityMCRecXi"), cascPt, nch, density, casc.mXi()); - } + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + setCurrentLocalDensityWeights(wloc, casc, density, 3); + if (cfgOutputLocDenWeights) + registry.fill(HIST("MC/densityMCRecXi"), cascPt, nch, density, casc.mXi()); } fGFW->Fill(cascEta, fXiPtAxis->FindBin(cascPt) - 1, cascPhi, wacc * weff * wloc, 2); } @@ -1417,19 +1426,17 @@ struct FlowGfwOmegaXi { double v0Eta{v0MC.eta()}; // K0short if (std::abs(pdgCode) == kK0Short) { - if (v0.qtarm() / std::fabs(v0.alpha()) > cfgv0_ArmPodocut && std::fabs(v0.y()) < 0.5 && std::fabs(v0.mK0Short() - o2::constants::physics::MassK0Short) < cfgv0_mk0swindow && + if (v0.qtarm() / std::fabs(v0.alpha()) > cfgv0_ArmPodocut && std::fabs(v0.mK0Short() - o2::constants::physics::MassK0Short) < cfgv0_mk0swindow && (!cfgcheckDauTPC || (std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { if (cfgDoAccEffCorr) setCurrentParticleWeights(weff, wacc, v0, vtxz, 1); if (cfgDoLocDenCorr) { int phibin = -999; phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(v0Phi, -constants::math::PI)); - if (phibin > -900) { - double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); - setCurrentLocalDensityWeights(wloc, v0, density, 1); - if (cfgOutputLocDenWeights) - registry.fill(HIST("MC/densityMCRecK0s"), v0Pt, nch, density, v0.mK0Short()); - } + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + setCurrentLocalDensityWeights(wloc, v0, density, 1); + if (cfgOutputLocDenWeights) + registry.fill(HIST("MC/densityMCRecK0s"), v0Pt, nch, density, v0.mK0Short()); } fGFW->Fill(v0Eta, fV0PtAxis->FindBin(v0Pt) - 1, v0Phi, wacc * weff * wloc, 8); } @@ -1443,12 +1450,10 @@ struct FlowGfwOmegaXi { if (cfgDoLocDenCorr) { int phibin = -999; phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(v0Phi, -constants::math::PI)); - if (phibin > -900) { - double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); - setCurrentLocalDensityWeights(wloc, v0, density, 2); - if (cfgOutputLocDenWeights) - registry.fill(HIST("MC/densityMCRecLambda"), v0Pt, nch, density, v0.mLambda()); - } + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + setCurrentLocalDensityWeights(wloc, v0, density, 2); + if (cfgOutputLocDenWeights) + registry.fill(HIST("MC/densityMCRecLambda"), v0Pt, nch, density, v0.mLambda()); } fGFW->Fill(v0Eta, fV0PtAxis->FindBin(v0Pt) - 1, v0Phi, wacc * weff * wloc, 16); } @@ -1460,12 +1465,10 @@ struct FlowGfwOmegaXi { if (cfgDoLocDenCorr) { int phibin = -999; phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(v0Phi, -constants::math::PI)); - if (phibin > -900) { - double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); - setCurrentLocalDensityWeights(wloc, v0, density, 2); - if (cfgOutputLocDenWeights) - registry.fill(HIST("MC/densityMCRecLambda"), v0Pt, nch, density, v0.mLambda()); - } + double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); + setCurrentLocalDensityWeights(wloc, v0, density, 2); + if (cfgOutputLocDenWeights) + registry.fill(HIST("MC/densityMCRecLambda"), v0Pt, nch, density, v0.mLambda()); } fGFW->Fill(v0Eta, fV0PtAxis->FindBin(v0Pt) - 1, v0Phi, wacc * weff * wloc, 16); } From 6a7f280fea761461cbff4fb6938f5060bb43de7d Mon Sep 17 00:00:00 2001 From: jaelpark Date: Wed, 16 Apr 2025 21:22:08 +0200 Subject: [PATCH 1015/1650] [PWGCF] Invariant mass method 2-prong generic candidate finding (#10882) --- PWGCF/DataModel/CorrelationsDerived.h | 3 +- PWGCF/TableProducer/filter2Prong.cxx | 55 +++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/PWGCF/DataModel/CorrelationsDerived.h b/PWGCF/DataModel/CorrelationsDerived.h index 46153889a0b..fcaf300c2f3 100644 --- a/PWGCF/DataModel/CorrelationsDerived.h +++ b/PWGCF/DataModel/CorrelationsDerived.h @@ -121,7 +121,8 @@ enum ParticleDecay { D0ToPiK, D0barToKPi, JPsiToEE, - JPsiToMuMu + JPsiToMuMu, + Generic2Prong, }; } // namespace cf2prongtrack DECLARE_SOA_TABLE(CF2ProngTracks, "AOD", "CF2PRONGTRACK", //! Reduced track table diff --git a/PWGCF/TableProducer/filter2Prong.cxx b/PWGCF/TableProducer/filter2Prong.cxx index 86c708f6ebd..4be15f1a295 100644 --- a/PWGCF/TableProducer/filter2Prong.cxx +++ b/PWGCF/TableProducer/filter2Prong.cxx @@ -10,6 +10,8 @@ // or submit itself to any jurisdiction. #include #include +#include +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -24,6 +26,8 @@ #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" +#include + using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; @@ -35,6 +39,15 @@ using namespace o2::math_utils::detail; struct Filter2Prong { O2_DEFINE_CONFIGURABLE(cfgVerbosity, int, 0, "Verbosity level (0 = major, 1 = per collision)") O2_DEFINE_CONFIGURABLE(cfgYMax, float, -1.0f, "Maximum candidate rapidity") + // + O2_DEFINE_CONFIGURABLE(cfgImPart1Mass, float, o2::constants::physics::MassKPlus, "Daughter particle 1 mass in GeV") + O2_DEFINE_CONFIGURABLE(cfgImPart2Mass, float, o2::constants::physics::MassKMinus, "Daughter particle 2 mass in GeV") + O2_DEFINE_CONFIGURABLE(cfgImPart1PID, float, o2::track::PID::Kaon, "PID of daughter particle 1 (O2 PID ID)") + O2_DEFINE_CONFIGURABLE(cfgImPart2PID, float, o2::track::PID::Kaon, "PID of daughter particle 1 (O2 PID ID)") + O2_DEFINE_CONFIGURABLE(cfgImCutPt, float, 0.2f, "Minimal pT for candidates") + O2_DEFINE_CONFIGURABLE(cfgImMinInvMass, float, 0.95f, "Minimum invariant mass (GeV)") + O2_DEFINE_CONFIGURABLE(cfgImMaxInvMass, float, 1.07f, "Maximum invariant mass (GeV)") + O2_DEFINE_CONFIGURABLE(cfgImSigmaFormula, std::string, "(z < 0.5 && x < 3.0) || (z >= 0.5 && x < 2.5 && y < 3.0)", "pT dependent daughter track sigma pass condition (x = TPC sigma, y = TOF sigma, z = pT)") HfHelper hfHelper; Produces output2ProngTracks; @@ -51,6 +64,14 @@ struct Filter2Prong { template using HasMLProb = decltype(std::declval().mlProbD0()); + std::unique_ptr sigmaFormula; + + void init(InitContext&) + { + if (doprocessDataInvMass) + sigmaFormula = std::make_unique("sigmaFormula", cfgImSigmaFormula.value.c_str()); + } + template void processDataT(aod::Collisions::iterator const&, aod::BCsWithTimestamps const&, aod::CFCollRefs const& cfcollisions, aod::CFTrackRefs const& cftracks, HFCandidatesType const& candidates) { @@ -142,6 +163,40 @@ struct Filter2Prong { } } PROCESS_SWITCH(Filter2Prong, processMC, "Process MC 2-prong daughters", false); + + // Generic 2-prong invariant mass method candidate finder. Only works for non-identical daughters of opposite charge for now. + using PIDTrack = soa::Join; + void processDataInvMass(aod::Collisions::iterator const&, aod::BCsWithTimestamps const&, aod::CFCollRefs const& cfcollisions, aod::CFTrackRefs const& cftracks, PIDTrack const& tracks) + { + if (cfcollisions.size() <= 0 || cftracks.size() <= 0) + return; // rejected collision + for (auto& cftrack1 : cftracks) { + auto p1 = tracks.iteratorAt(cftrack1.trackId()); + if (p1.sign() != 1) + continue; + if (sigmaFormula->Eval(o2::aod::pidutils::tpcNSigma(cfgImPart1PID, p1), o2::aod::pidutils::tofNSigma(cfgImPart1PID, p1)) <= 0.0f) + continue; + for (auto& cftrack2 : cftracks) { + if (cftrack2.globalIndex() == cftrack1.globalIndex()) + continue; + auto p2 = tracks.iteratorAt(cftrack2.trackId()); + if (p2.sign() != -1) + continue; + if (sigmaFormula->Eval(o2::aod::pidutils::tpcNSigma(cfgImPart2PID, p2), o2::aod::pidutils::tofNSigma(cfgImPart2PID, p2)) <= 0.0f) + continue; + ROOT::Math::PtEtaPhiMVector vec1(p1.pt(), p1.eta(), p1.phi(), cfgImPart1Mass); + ROOT::Math::PtEtaPhiMVector vec2(p2.pt(), p2.eta(), p2.phi(), cfgImPart2Mass); + ROOT::Math::PtEtaPhiMVector s = vec1 + vec2; + if (s.pt() < cfgImCutPt || s.M() < cfgImMinInvMass || s.M() > cfgImMaxInvMass) + continue; + + float phi = RecoDecay::constrainAngle(s.Phi(), 0.0f); + output2ProngTracks(cfcollisions.begin().globalIndex(), + cftrack1.globalIndex(), cftrack2.globalIndex(), s.pt(), s.eta(), phi, s.M(), aod::cf2prongtrack::Generic2Prong); + } + } + } + PROCESS_SWITCH(Filter2Prong, processDataInvMass, "Process data generic 2-prong candidates with invariant mass method", false); }; // struct WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From e72f35c406dfbedab6dd7d37847ce4bce29845f3 Mon Sep 17 00:00:00 2001 From: Victor Gonzalez Date: Thu, 17 Apr 2025 01:49:38 +0200 Subject: [PATCH 1016/1650] [PWGCF] DptDpt - Increasing the level of pT bins tracking (#10887) Co-authored-by: Victor --- .../Tasks/dptDptEfficiencyAndQc.cxx | 73 +++++++++++-------- 1 file changed, 42 insertions(+), 31 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx index f1b75ed15ba..3b3f253edc0 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -391,6 +392,9 @@ struct QADataCollectingEngine { using namespace analysis::dptdptfilter; using namespace o2::aod::track; + constexpr float kFiftyPerCent = 50.0f; + constexpr float kHundredPerCent = 100.0f; + fhPtB[kindOfData]->Fill(track.pt()); fhPtVsEtaB[kindOfData]->Fill(track.eta(), track.pt()); fhPtVsZvtxB[kindOfData]->Fill(zvtx, track.pt()); @@ -411,7 +415,7 @@ struct QADataCollectingEngine { float phiInTpcSector = std::fmod(track.phi(), kTpcPhiSectorWidth); float phiShiftedPercentInTpcSector = phiInTpcSector * 100 / kTpcPhiSectorWidth; - phiShiftedPercentInTpcSector = (phiShiftedPercentInTpcSector > 50.0f) ? (phiShiftedPercentInTpcSector - 100.0f) : phiShiftedPercentInTpcSector; + phiShiftedPercentInTpcSector = (phiShiftedPercentInTpcSector > kFiftyPerCent) ? (phiShiftedPercentInTpcSector - kHundredPerCent) : phiShiftedPercentInTpcSector; if (track.sign() > 0) { fhPhiVsPtPosB->Fill(track.pt(), phiInTpcSector); fhPerColNchVsPhiVsPtPosB->Fill(track.pt(), phiInTpcSector); @@ -490,7 +494,7 @@ struct QADataCollectingEngine { float genid = findgenid(mcparticle); bool isprimary = mcparticle.isPhysicalPrimary(); - bool issecdecay = !isprimary && (mcparticle.getProcess() == 4); + bool issecdecay = !isprimary && (mcparticle.getProcess() == TMCProcess::kPDecay); bool isfrommaterial = !isprimary && !issecdecay; fillpurityhistos(fhPtPurityPosPrimA, fhPtPurityNegPrimA, genid, track, isprimary); fillpurityhistos(fhPtPurityPosSecA, fhPtPurityNegSecA, genid, track, issecdecay); @@ -524,7 +528,7 @@ struct QADataCollectingEngine { /* pure generator level */ if (track.isPhysicalPrimary()) { fhPtVsEtaPrimA[track.trackacceptedid()]->Fill(track.eta(), track.pt()); - } else if (track.getProcess() == 4) { + } else if (track.getProcess() == TMCProcess::kPDecay) { fhPtVsEtaSecA[track.trackacceptedid()]->Fill(track.eta(), track.pt()); } else { fhPtVsEtaMatA[track.trackacceptedid()]->Fill(track.eta(), track.pt()); @@ -608,13 +612,16 @@ struct QAExtraDataCollectingEngine { AxisSpec ptOfInterestAxis = {static_cast(ptBinsOfInterest.size()), 0.5f, static_cast(ptBinsOfInterest.size()) + 0.5f, "#it{p}_{T} (GeV/#it{c})"}; /* the mapping between pT bins of interest and internal representation, and histogram title to keep track of them offline */ + LOGF(info, "Configuring the pT bins of interest"); std::string hPtRangesOfInterestTitle; for (size_t ix = 0; ix < ptBinsOfInterest.size(); ++ix) { TString ptRange = TString::Format("%s%.2f-%.2f", ix == 0 ? "" : ",", ptAxis.GetBinLowEdge(ptBinsOfInterest[ix]), ptAxis.GetBinUpEdge(ptBinsOfInterest[ix])); /* remember our internal axis starts in 0.5 value, i.e. its first central value is 1 */ ptOfInterestBinMap[ptBinsOfInterest[ix]] = ix + 1; hPtRangesOfInterestTitle += ptRange.Data(); + LOGF(info, " Added pT bin %d as internal axis value %d", ptBinsOfInterest[ix], ix + 1); } + LOGF(info, " Final pT bins tilte: %s", hPtRangesOfInterestTitle.c_str()); /* the reconstructed and generated levels histograms */ std::string recogen = (kindOfData == kReco) ? "Reco" : "Gen"; @@ -688,16 +695,18 @@ struct PidDataCollectingEngine { uint nmainsp = static_cast(efficiencyandqatask::mainspnames.size()); uint nallmainsp = static_cast(efficiencyandqatask::allmainspnames.size()); + constexpr static uint kNoOfSteps = 2; /* Before and after track selection */ + /* PID histograms */ /* before and after */ - std::vector> fhTPCdEdxSignalVsP{2, nullptr}; - std::vector>> fhTPCdEdxSignalDiffVsP{2, {nmainsp, nullptr}}; - std::vector>> fhTPCnSigmasVsP{2, {nallmainsp, nullptr}}; - std::vector> fhTOFSignalVsP{2, nullptr}; - std::vector>> fhTOFSignalDiffVsP{2, {nmainsp, nullptr}}; - std::vector>> fhTOFnSigmasVsP{2, {nallmainsp, nullptr}}; - std::vector> fhPvsTOFSqMass{2, nullptr}; - std::vector>> fhTPCTOFSigmaVsP{2, {nmainsp, nullptr}}; + std::vector> fhTPCdEdxSignalVsP{kNoOfSteps, nullptr}; + std::vector>> fhTPCdEdxSignalDiffVsP{kNoOfSteps, {nmainsp, nullptr}}; + std::vector>> fhTPCnSigmasVsP{kNoOfSteps, {nallmainsp, nullptr}}; + std::vector> fhTOFSignalVsP{kNoOfSteps, nullptr}; + std::vector>> fhTOFSignalDiffVsP{kNoOfSteps, {nmainsp, nullptr}}; + std::vector>> fhTOFnSigmasVsP{kNoOfSteps, {nallmainsp, nullptr}}; + std::vector> fhPvsTOFSqMass{kNoOfSteps, nullptr}; + std::vector>> fhTPCTOFSigmaVsP{kNoOfSteps, {nmainsp, nullptr}}; template void init(HistogramRegistry& registry, const char* dirname) @@ -711,9 +720,9 @@ struct PidDataCollectingEngine { if constexpr (kindOfData == kReco) { /* PID histograms */ std::vector whenname{"Before", "After"}; - char whenprefix[2]{'B', 'A'}; + constexpr char whenprefix[kNoOfSteps]{'B', 'A'}; std::vector whentitle{"before", ""}; - for (uint ix = 0; ix < whenname.size(); ++ix) { + for (uint ix = 0; ix < kNoOfSteps; ++ix) { fhTPCdEdxSignalVsP[ix] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "PID", whenname[ix].c_str()), HNAMESTRING("tpcSignalVsP%c", whenprefix[ix]), HTITLESTRING("TPC dE/dx signal %s", whentitle[ix].c_str()), kTH2F, {pidPAxis, dEdxAxis}); @@ -761,7 +770,7 @@ struct PidDataCollectingEngine { } else { ix = 2 * ix; } - for (uint when = 0; when < 2; ++when) { + for (uint when = 0; when < kNoOfSteps; ++when) { fhTPCnSigmasVsP[when][ix]->Fill(tpcmom, o2::aod::pidutils::tpcNSigma(track)); fhTOFnSigmasVsP[when][ix]->Fill(tofmom, o2::aod::pidutils::tofNSigma(track)); if (track.trackacceptedid() < 0) { @@ -779,7 +788,7 @@ struct PidDataCollectingEngine { } else { ix = 2 * ix; } - for (uint when = 0; when < 2; ++when) { + for (uint when = 0; when < kNoOfSteps; ++when) { fhTPCdEdxSignalDiffVsP[when][ix]->Fill(tpcmom, o2::aod::pidutils::tpcExpSignalDiff(track)); fhTOFSignalDiffVsP[when][ix]->Fill(tofmom, o2::aod::pidutils::tofExpSignalDiff(track)); fhTPCTOFSigmaVsP[when][ix]->Fill(tpcmom, o2::aod::pidutils::tpcNSigma(track), o2::aod::pidutils::tofNSigma(track)); @@ -793,7 +802,7 @@ struct PidDataCollectingEngine { template void fillPID(TrackObject const& track, float tpcmom, float tofmom) { - for (uint when = 0; when < 2; ++when) { + for (uint when = 0; when < kNoOfSteps; ++when) { if constexpr (framework::has_type_v) { fhTPCdEdxSignalVsP[when]->Fill(tpcmom, track.mcTunedTPCSignal()); } else { @@ -1228,22 +1237,24 @@ struct DptDptEfficiencyAndQc { if constexpr (kindOfProcess == kEXTRA) { qaExtraDataCE[ixDCE]->processTrackPairs(tracks, tracks); } - for (auto const& track : tracks) { - float tpcmom = track.p(); - float tofmom = track.p(); - if (useTPCInnerWallMomentum.value) { - if constexpr (!framework::has_type_v) { - tpcmom = track.tpcInnerParam(); + if constexpr (kindOfProcess == kBASIC || kindOfProcess == kPID || kindOfProcess == kPIDEXTRA) { + for (auto const& track : tracks) { + float tpcmom = track.p(); + float tofmom = track.p(); + if (useTPCInnerWallMomentum.value) { + if constexpr (!framework::has_type_v) { + tpcmom = track.tpcInnerParam(); + } + } + if constexpr (kindOfProcess == kBASIC) { + qaDataCE[ixDCE]->processTrack(collision.posZ(), track); + } + if constexpr (kindOfProcess == kPID) { + pidDataCE[ixDCE]->processTrack(track, tpcmom, tofmom); + } + if constexpr (kindOfProcess == kPIDEXTRA) { + pidExtraDataCE[ixDCE]->processTrack(track, tpcmom, tofmom); } - } - if constexpr (kindOfProcess == kBASIC) { - qaDataCE[ixDCE]->processTrack(collision.posZ(), track); - } - if constexpr (kindOfProcess == kPID) { - pidDataCE[ixDCE]->processTrack(track, tpcmom, tofmom); - } - if constexpr (kindOfProcess == kPIDEXTRA) { - pidExtraDataCE[ixDCE]->processTrack(track, tpcmom, tofmom); } } if constexpr (kindOfProcess == kBASIC) { From 2fc3bdbaabd367841839af8e37b4b2ce00f279c7 Mon Sep 17 00:00:00 2001 From: Chiara Pinto <48326672+chiarapinto@users.noreply.github.com> Date: Thu, 17 Apr 2025 09:27:08 +0200 Subject: [PATCH 1017/1650] [PWGLF] added histograms for pt unfolding (#10884) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Nuspex/antinucleiInJets.cxx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx index 0ab76c09000..5ddaa882de8 100644 --- a/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx +++ b/PWGLF/Tasks/Nuspex/antinucleiInJets.cxx @@ -266,9 +266,12 @@ struct AntinucleiInJets { registryMC.add("antiproton_ue_rec_tpc", "antiproton_ue_rec_tpc", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); registryMC.add("antiproton_jet_rec_tof", "antiproton_jet_rec_tof", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); registryMC.add("antiproton_ue_rec_tof", "antiproton_ue_rec_tof", HistType::kTH1F, {{nbins, min, max, "#it{p}_{T} (GeV/#it{c})"}}); + registryMC.add("antiproton_jet_tpc_rec_vs_generatedptjet", "antiproton_jet_tpc_rec_vs_generatedptjet", HistType::kTH2F, {{nbins, min, max, "#it{p}_{T, antiproton}^{rec} (GeV/#it{c})"}, {1000, 0., 100., "#it{p}_{T, jet}^{gen} (GeV/#it{c})"}}); + registryMC.add("antiproton_jet_tof_rec_vs_generatedptjet", "antiproton_jet_tof_rec_vs_generatedptjet", HistType::kTH2F, {{nbins, min, max, "#it{p}_{T, antiproton}^{rec} (GeV/#it{c})"}, {1000, 0., 100., "#it{p}_{T, jet}^{gen} (GeV/#it{c})"}}); // detector response matrix registryMC.add("detectorResponseMatrix", "detectorResponseMatrix", HistType::kTH2F, {{1000, 0.0, 100.0, "#it{p}_{T}^{rec} (GeV/#it{c})"}, {2000, -20.0, 20.0, "#it{p}_{T}^{gen} - #it{p}_{T}^{rec} (GeV/#it{c})"}}); + registryMC.add("generatedVsReconstructedPt", "generatedVsReconstructedPt", HistType::kTH2F, {{1000, 0.0, 100.0, "#it{p}_{T}^{rec} (GeV/#it{c})"}, {1000, 0.0, 100.0, "#it{p}_{T}^{gen} (GeV/#it{c})"}}); } // systematic uncertainties @@ -1175,6 +1178,7 @@ struct AntinucleiInJets { // fill detector response matrix registryMC.fill(HIST("detectorResponseMatrix"), jet.pt(), jetPtGen - jet.pt()); // maybe it should be filled after bkg sub + registryMC.fill(HIST("generatedVsReconstructedPt"), jet.pt(), jetPtGen); // jet pt must be larger than threshold auto jetForSub = jet; @@ -1232,8 +1236,10 @@ struct AntinucleiInJets { if (passedItsPidProt) { registryMC.fill(HIST("antiproton_jet_rec_tpc"), track.pt(), nsigmaTPCPr); + registryMC.fill(HIST("antiproton_jet_tpc_rec_vs_generatedptjet"), track.pt(), jetPtGen); if (nsigmaTPCPr > minNsigmaTpc && nsigmaTPCPr < maxNsigmaTpc && track.hasTOF()) registryMC.fill(HIST("antiproton_jet_rec_tof"), track.pt(), nsigmaTOFPr); + registryMC.fill(HIST("antiproton_jet_tof_rec_vs_generatedptjet"), track.pt(), jetPtGen); } } From 8693ae76ba0e1559a82b54eade27b3bd0b2e991b Mon Sep 17 00:00:00 2001 From: Lars <146946151+ljoergen@users.noreply.github.com> Date: Thu, 17 Apr 2025 09:27:38 +0200 Subject: [PATCH 1018/1650] [PWGLF] angularCorrelationsInJets.cxx: fixed missing minus sign (#10878) --- PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx b/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx index 269d6959bf7..c2c1421331d 100644 --- a/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx +++ b/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx @@ -574,8 +574,8 @@ struct AngularCorrelationsInJets { for (int i = 0; i < static_cast(buffer.size()); i++) { // loop over tracks in buffer if (std::isnan(buffer.at(i).first)) continue; - if (buffer.at(i).first > constants::math::TwoPI || buffer.at(i).first < constants::math::TwoPI) { - registryData.fill(HIST("trackProtocol"), 13); // # buffer tracks failed with phi > 2 pi + if (buffer.at(i).first > constants::math::TwoPI || buffer.at(i).first < -constants::math::TwoPI) { + registryData.fill(HIST("trackProtocol"), 13); // # buffer tracks failed with |phi| > 2 pi continue; } @@ -999,7 +999,6 @@ struct AngularCorrelationsInJets { continue; registryData.fill(HIST("trackProtocol"), 1); // # tracks selected for jet reconstruction - double mass = 0.139; if (track.tpcNClsFindable() != 0) { registryQC.fill(HIST("ratioCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows() / track.tpcNClsFindable()); @@ -1019,7 +1018,7 @@ struct AngularCorrelationsInJets { registryQC.fill(HIST("etaFullEvent"), track.eta()); registryQC.fill(HIST("etaPtFullEvent"), track.pt(), track.eta()); } - fastjet::PseudoJet inputPseudoJet(track.px(), track.py(), track.pz(), track.energy(mass)); + fastjet::PseudoJet inputPseudoJet(track.px(), track.py(), track.pz(), track.energy(o2::constants::physics::MassPionCharged)); inputPseudoJet.set_user_index(index); particles[index] = track; particlesForCF.emplace_back(track); @@ -1052,8 +1051,10 @@ struct AngularCorrelationsInJets { registryData.fill(HIST("numJetsInEvent"), jetCounter); TVector3 hardestJetAxis(jets.at(0).px(), jets.at(0).py(), jets.at(0).pz()); // for full event, use hardest jet as orientation - doCorrelations(particlesForCF, fBufferFull, fTempBufferFull, -1, hardestJetAxis); - setTrackBuffer(fTempBufferFull, fBufferFull); + if (doFullCorrelations) { + doCorrelations(particlesForCF, fBufferFull, fTempBufferFull, -1, hardestJetAxis); + setTrackBuffer(fTempBufferFull, fBufferFull); + } } template @@ -1064,7 +1065,6 @@ struct AngularCorrelationsInJets { jetInput.clear(); particles.clear(); int index = 0; - double mass = 0.139; // pion mass for input because 80% is pions anyway for (const auto& track : tracks) { if (track.tpcNClsFindable() != 0) { @@ -1083,7 +1083,7 @@ struct AngularCorrelationsInJets { registryQC.fill(HIST("etaFullEvent"), track.eta()); registryQC.fill(HIST("etaPtFullEvent"), track.pt(), track.eta()); - fastjet::PseudoJet inputPseudoJet(track.px(), track.py(), track.pz(), track.energy(mass)); + fastjet::PseudoJet inputPseudoJet(track.px(), track.py(), track.pz(), track.energy(o2::constants::physics::MassPionCharged)); inputPseudoJet.set_user_index(index); particles[index] = track; jetInput.emplace_back(inputPseudoJet); From b48f4b407d5f97ca98f23a3e8e22dbd8442adb46 Mon Sep 17 00:00:00 2001 From: JimunLee Date: Thu, 17 Apr 2025 17:21:42 +0900 Subject: [PATCH 1019/1650] [PWGJE] phiInJets.cxx : Adding a configuration to adjust the mass range and changhing the type of histogram (#10879) Co-authored-by: jimun_lee --- PWGJE/Tasks/phiInJets.cxx | 133 +++++++++++++++++++++++++++++--------- 1 file changed, 103 insertions(+), 30 deletions(-) diff --git a/PWGJE/Tasks/phiInJets.cxx b/PWGJE/Tasks/phiInJets.cxx index 672280fbab8..be99a57a576 100644 --- a/PWGJE/Tasks/phiInJets.cxx +++ b/PWGJE/Tasks/phiInJets.cxx @@ -20,9 +20,9 @@ #include #include #include - #include +#include "TRandom.h" #include "Framework/ASoA.h" #include "Framework/AnalysisDataModel.h" #include "Framework/AnalysisTask.h" @@ -83,10 +83,15 @@ struct phiInJets { Configurable cfgMCRecHists{"cfgMCRecHists", false, "Enables MCRecHists"}; Configurable cfgMCRecMBHists{"cfgMCRecMBHists", false, "Enables MCRec MB Hists"}; Configurable cfgMCRecInsideHists{"cfgMCRecInsideHists", false, "Enables MCRec Inside Hists"}; + Configurable cfgMCRecRotationalHists{"cfgMCRecRotationalHists", false, "Enables MCRotational Hists"}; Configurable cfgMCGenHists{"cfgMCGenHists", false, "Enables MCGenHists"}; Configurable cfgMCGenMATCHEDHists{"cfgMCGenMATCHEDHists", false, "Enables MCGenMATCHEDHists"}; Configurable cfgMCRecMATCHEDHists{"cfgMCRecMATCHEDHists", false, "Enables MCRecMATCHEDHists"}; + Configurable cfgMinvNBins{"cfgMinvNBins", 500, "Number of bins for Minv axis"}; + Configurable cfgMinvMin{"cfgMinvMin", 0.75, "Minimum Minv value"}; + Configurable cfgMinvMax{"cfgMinvMax", 1.25, "Maximum Minv value"}; + // CONFIG DONE ///////////////////////////////////////// //INIT @@ -98,7 +103,7 @@ struct phiInJets { const AxisSpec axisEta{30, -1.5, +1.5, "#eta"}; const AxisSpec axisPhi{200, -1, +7, "#phi"}; const AxisSpec axisPt{200, 0, +200, "#pt"}; - const AxisSpec MinvAxis = {500, 0.75, 1.25}; + const AxisSpec MinvAxis = {cfgMinvNBins, cfgMinvMin, cfgMinvMax}; const AxisSpec PtAxis = {200, 0, 20.0}; const AxisSpec MultAxis = {100, 0, 100}; const AxisSpec dRAxis = {100, 0, 100}; @@ -131,16 +136,16 @@ struct phiInJets { JEhistos.add("FJptHistogram", "FJptHistogram", kTH1F, {axisPt}); JEhistos.add("nJetsPerEvent", "nJetsPerEvent", kTH1F, {{10, 0.0, 10.0}}); - JEhistos.add("hUSS", "hUSS", kTH3F, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hUSS", "hUSS", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); JEhistos.add("hUSS_1D", "hUSS_1D", kTH1F, {MinvAxis}); JEhistos.add("hUSS_1D_2_3", "hUSS_1D_2_3", kTH1F, {MinvAxis}); - JEhistos.add("hLSS", "hLSS", kTH3F, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hLSS", "hLSS", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); JEhistos.add("hLSS_1D", "hLSS_1D", kTH1F, {MinvAxis}); JEhistos.add("hLSS_1D_2_3", "hLSS_1D_2_3", kTH1F, {MinvAxis}); - JEhistos.add("hUSS_INSIDE", "hUSS_INSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hUSS_INSIDE", "hUSS_INSIDE", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); JEhistos.add("hUSS_INSIDE_1D", "hUSS_INSIDE_1D", kTH1F, {MinvAxis}); JEhistos.add("hUSS_INSIDE_1D_2_3", "hUSS_INSIDE_1D_2_3", kTH1F, {MinvAxis}); - JEhistos.add("hLSS_INSIDE", "hLSS_INSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hLSS_INSIDE", "hLSS_INSIDE", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); JEhistos.add("hLSS_INSIDE_1D", "hLSS_INSIDE_1D", kTH1F, {MinvAxis}); JEhistos.add("hLSS_INSIDE_1D_2_3", "hLSS_INSIDE_1D_2_3", kTH1F, {MinvAxis}); } @@ -170,22 +175,32 @@ struct phiInJets { // used for Minv closure tests // MB if (cfgMCRecMBHists) { - JEhistos.add("hMCRec_hUSS", "hMCRec_hUSS", kTH3F, {dRAxis, PtAxis, MinvAxis}); - JEhistos.add("hMCRec_hLSS", "hMCRec_hLSS", kTH3F, {dRAxis, PtAxis, MinvAxis}); - JEhistos.add("hMCRecTrue_hUSS", "hMCRecTrue_hUSS", kTH3F, {dRAxis, PtAxis, MinvAxis}); - JEhistos.add("hMCRecTrue_hLSS", "hMCRecTrue_hLSS", kTH3F, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRec_hUSS", "hMCRec_hUSS", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRec_hLSS", "hMCRec_hLSS", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRecTrue_hUSS", "hMCRecTrue_hUSS", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRecTrue_hLSS", "hMCRecTrue_hLSS", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRec_R_distribution", "hMCRec_R_distribution", kTH1F, {{100, 0.0, 2 * TMath::Pi()}}); + JEhistos.add("hMCRec_dPhi_distribution", "hMCRec_dPhi_distribution", kTH1F, {{80, -5.0, 7.0}}); + JEhistos.add("hMCRec_dEta_distribution", "hMCRec_dEta_distribution", kTH1F, {{100, -2.0, 2.0}}); } - // INSIDE - if (cfgMCRecInsideHists) { - JEhistos.add("hMCRec_hUSS_INSIDE", "hMCRec_hUSS_INSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); - JEhistos.add("hMCRec_hLSS_INSIDE", "hMCRec_hLSS_INSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); - JEhistos.add("hMCRecTrue_hUSS_INSIDE", "hMCRecTrue_hUSS_INSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); - JEhistos.add("hMCRecTrue_hLSS_INSIDE", "hMCRecTrue_hLSS_INSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); - JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE", "hMCRec_nonmatch_hUSS_INSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); - JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE_1D", "hMCRec_nonmatch_hUSS_INSIDE_1D", kTH1F, {MinvAxis}); - JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE_1D_2_3", "hMCRec_nonmatch_hUSS_INSIDE_1D_2_3", kTH1F, {MinvAxis}); + if (cfgMCRecRotationalHists) { + JEhistos.add("hMCRec_hUSS_Rotational", "hMCRec_hUSS_Rotational", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRec_R_Rotation_distribution", "hMCRec_R_Rotation_distribution", HistType::kTH1F, {{100, 0.0, 2 * TMath::Pi()}}); + JEhistos.add("hMCRec_dPhi_rot_distribution", "hMCRec_dPhi_rot_distribution", kTH1F, {{80, -5.0, 7.0}}); + JEhistos.add("hMCRec_dEta_rot_distribution", "hMCRec_dEta_rot_distribution", kTH1F, {{100, -2.0, 2.0}}); + JEhistos.add("hMCRec_dEta_qa_rot_distribution", "hMCRec_dEta_qa_rot_distribution", kTH1F, {{100, -4.0, 2.0}}); } } + // INSIDE + if (cfgMCRecInsideHists) { + JEhistos.add("hMCRec_hUSS_INSIDE", "hMCRec_hUSS_INSIDE", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRec_hLSS_INSIDE", "hMCRec_hLSS_INSIDE", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRecTrue_hUSS_INSIDE", "hMCRecTrue_hUSS_INSIDE", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRecTrue_hLSS_INSIDE", "hMCRecTrue_hLSS_INSIDE", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE", "hMCRec_nonmatch_hUSS_INSIDE", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE_1D", "hMCRec_nonmatch_hUSS_INSIDE_1D", kTH1F, {MinvAxis}); + JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE_1D_2_3", "hMCRec_nonmatch_hUSS_INSIDE_1D_2_3", kTH1F, {MinvAxis}); + } if (cfgMCGenHists) { JEhistos.add("nEvents_MCGen", "nEvents_MCGen", kTH1F, {{4, 0.0, 4.0}}); @@ -207,7 +222,7 @@ struct phiInJets { JEhistos.add("hMCTrue_nonmatch_hUSS_INSIDE_pt_v_eta", "hMCTrue_nonmatch_hUSS_INSIDE_pt_v_eta", kTH2F, {PtAxis, axisEta}); JEhistos.add("JetVsPhi_GEN", "JetVsPhi_GEN", kTH2F, {{4000, 0., 200.}, {200, 0, 20.0}}); - JEhistos.add("hMCTrue_nonmatch_hUSS_INSIDE", "hMCTrue_nonmatch_hUSS_INSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCTrue_nonmatch_hUSS_INSIDE", "hMCTrue_nonmatch_hUSS_INSIDE", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); JEhistos.add("hMCTrue_nonmatch_hUSS_INSIDE_1D", "hMCTrue_nonmatch_hUSS_INSIDE_1D", kTH1F, {MinvAxis}); JEhistos.add("hMCTrue_nonmatch_hUSS_INSIDE_1D_2_3", "hMCTrue_nonmatch_hUSS_INSIDE_1D_2_3", kTH1F, {MinvAxis}); } @@ -225,7 +240,7 @@ struct phiInJets { JEhistos.add("RespGen_Matrix_MATCHED_rand0", "RespGen_Matrix_MATCHED_rand0", HistType::kTHnSparseD, {PtAxis, axisPt, PtAxis, axisPt}); // REC(Phi,Jet), GEN(Phi,Jet) JEhistos.add("RespGen_Matrix_MATCHED_rand1", "RespGen_Matrix_MATCHED_rand1", HistType::kTHnSparseD, {PtAxis, axisPt, PtAxis, axisPt}); // REC(Phi,Jet), GEN(Phi,Jet) - JEhistos.add("hMCTrue_hUSS_INSIDE", "hMCTrue_hUSS_INSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCTrue_hUSS_INSIDE", "hMCTrue_hUSS_INSIDE", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); JEhistos.add("hMCTrue_hUSS_INSIDE_1D", "hMCTrue_hUSS_INSIDE_1D", kTH1F, {MinvAxis}); JEhistos.add("hMCTrue_hUSS_INSIDE_1D_2_3", "hMCTrue_hUSS_INSIDE_1D_2_3", kTH1F, {MinvAxis}); } @@ -244,7 +259,7 @@ struct phiInJets { JEhistos.add("2DRecToGen", "2DRecToGen", kTH2F, {PtAxis, axisPt}); JEhistos.add("2DRecToGen_constrained", "2DRecToGen_constrained", kTH2F, {PtAxis, axisPt}); - JEhistos.add("hMCRec_hUSS_INSIDE", "hMCRec_hUSS_INSIDE", kTH3F, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRec_hUSS_INSIDE", "hMCRec_hUSS_INSIDE", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); JEhistos.add("hMCRec_hUSS_INSIDE_1D", "hMCRec_hUSS_INSIDE_1D", kTH1F, {MinvAxis}); JEhistos.add("hMCRec_hUSS_INSIDE_1D_2_3", "hMCRec_hUSS_INSIDE_1D_2_3", kTH1F, {MinvAxis}); } @@ -417,7 +432,9 @@ struct phiInJets { template int minvReconstruction(double mult, const TracksType& trk1, const TracksType& trk2, const JetType& jets) { + TLorentzVector lDecayDaughter1, lDecayDaughter2, lResonance; + //==================================================== if (!trackSelection(trk1) || !trackSelection(trk2)) return -1; @@ -441,6 +458,8 @@ struct phiInJets { lResonance = lDecayDaughter1 + lDecayDaughter2; + //================================================== + if (std::abs(lResonance.Eta()) > cfgtrkMaxEta) return -1; @@ -475,10 +494,11 @@ struct phiInJets { } } - if (cfgSingleJet) - if (goodjets > 1) + if (cfgSingleJet) { + if (goodjets > 1) { jetpt = DistinguishJets(jets, lResonance); - + } + } ///////////////////////////////////////////////////////////////////////////// // Fill inside Jet if (jetFlag) { @@ -659,7 +679,7 @@ struct phiInJets { double RealPhiCandWithJet = 0; double RealPhiCandInJet = 0; //============ - // Track Eff + // Track Effl for (const auto& track : tracks) { auto originalTrack = track.track_as(); if (!trackSelection(originalTrack)) @@ -697,14 +717,58 @@ struct phiInJets { if (fabs(originalTrack.eta()) > cfgtrkMaxEta || fabs(originalTrack2.eta()) > cfgtrkMaxEta) continue; - TLorentzVector lDecayDaughter1, lDecayDaughter2, lResonance; + double dPhi = TVector2::Phi_mpi_pi(originalTrack.phi() - originalTrack2.phi()); + double dEta = originalTrack.eta() - originalTrack2.eta(); + JEhistos.fill(HIST("hMCRec_dPhi_distribution"), dPhi); + JEhistos.fill(HIST("hMCRec_dEta_distribution"), dEta); + + double dR = TMath::Sqrt(dPhi * dPhi + dEta * dEta); + double dR_rot = 0; + TLorentzVector lDecayDaughter1, lDecayDaughter2, lResonance, lRotationalTrack, lRotationalResonance; lDecayDaughter1.SetXYZM(originalTrack.px(), originalTrack.py(), originalTrack.pz(), massKa); - if (!cfgIsKstar) + //----------------------------------------------------------------------- + + TRandom* trand = new TRandom(); + double shift = trand->Uniform(TMath::Pi() - TMath::Pi() / 10.0, TMath::Pi() + TMath::Pi() / 10.0); + // double shift = TMath::Pi(); + + if (!cfgIsKstar) { lDecayDaughter2.SetXYZM(originalTrack2.px(), originalTrack2.py(), originalTrack2.pz(), massKa); - else + } else { lDecayDaughter2.SetXYZM(originalTrack2.px(), originalTrack2.py(), originalTrack2.pz(), massPi); - lResonance = lDecayDaughter1 + lDecayDaughter2; + // double pTog = TMath::Sqrt(originalTrack2.px() * originalTrack2.px() + originalTrack2.py() * originalTrack2.py()); + // double Pxrot = pTog*TMath::Cos(originalTrack2.phi() + shift); + // double Pyrot = pTog*TMath::Sin(originalTrack2.phi() + shift); + + // if(gDebug){ + // double Ptrot = TMath::Sqrt(Pxrot*Pxrot + Pyrot*Pyrot); + // if(TMath::Abs(Ptrot-pTog)>0.1) { + // std::cout<<"We are jottettta"< cfgtrkMaxEta) continue; @@ -717,6 +781,15 @@ struct phiInJets { if (cfgMCRecMBHists) { if (originalTrack.sign() * originalTrack2.sign() < 0) { JEhistos.fill(HIST("hMCRec_hUSS"), 1.0, lResonance.Pt(), lResonance.M()); + // normal R + JEhistos.fill(HIST("hMCRec_R_distribution"), dR); + + // switch because of memory + if (cfgMCRecRotationalHists && cfgIsKstar) { + JEhistos.fill(HIST("hMCRec_hUSS_Rotational"), 1.0, lRotationalResonance.Pt(), lResonance.M()); + // Rotational R + JEhistos.fill(HIST("hMCRec_R_Rotation_distribution"), dR_rot); + } } else if (originalTrack.sign() * originalTrack2.sign() > 0) { JEhistos.fill(HIST("hMCRec_hLSS"), 1.0, lResonance.Pt(), lResonance.M()); } From a9495899231962240a8d7b420d2687a0badecde3 Mon Sep 17 00:00:00 2001 From: Jesper Gumprecht <113693781+jesgum@users.noreply.github.com> Date: Thu, 17 Apr 2025 12:16:06 +0200 Subject: [PATCH 1020/1650] [ALICE3] Add further selections to alice3 multicharm task (#10883) --- ALICE3/TableProducer/alice3-multicharm.cxx | 129 +++++++++++++++------ 1 file changed, 92 insertions(+), 37 deletions(-) diff --git a/ALICE3/TableProducer/alice3-multicharm.cxx b/ALICE3/TableProducer/alice3-multicharm.cxx index 15e45193187..d2ac55f8f11 100644 --- a/ALICE3/TableProducer/alice3-multicharm.cxx +++ b/ALICE3/TableProducer/alice3-multicharm.cxx @@ -86,29 +86,47 @@ struct alice3multicharm { Configurable dcaXiCCDaughtersSelection{"dcaXiCCDaughtersSelection", 0.002f, "DCA between XiCC daughters (cm)"}; Configurable piFromXiC_dcaXYconstant{"piFromXiC_dcaXYconstant", 0.001f, "[0] in |DCAxy| > [0]+[1]/pT"}; + Configurable piFromXiC_dcaZconstant{"piFromXiC_dcaZconstant", 0.001f, "[0] in |DCAxy| > [0]+[1]/pT"}; Configurable piFromXiC_dcaXYpTdep{"piFromXiC_dcaXYpTdep", 0.0, "[1] in |DCAxy| > [0]+[1]/pT"}; + Configurable piFromXiC_dcaZpTdep{"piFromXiC_dcaZpTdep", 0.0, "[1] in |DCAxy| > [0]+[1]/pT"}; Configurable piFromXiCC_dcaXYconstant{"piFromXiCC_dcaXYconstant", 0.001f, "[0] in |DCAxy| > [0]+[1]/pT"}; + Configurable piFromXiCC_dcaZconstant{"piFromXiCC_dcaZconstant", 0.001f, "[0] in |DCAxy| > [0]+[1]/pT"}; Configurable piFromXiCC_dcaXYpTdep{"piFromXiCC_dcaXYpTdep", 0.0, "[1] in |DCAxy| > [0]+[1]/pT"}; + Configurable piFromXiCC_dcaZpTdep{"piFromXiCC_dcaZpTdep", 0.0, "[1] in |DCAxy| > [0]+[1]/pT"}; Configurable xiFromXiC_dcaXYconstant{"xiFromXiC_dcaXYconstant", 0.001f, "[0] in |DCAxy| > [0]+[1]/pT"}; + Configurable xiFromXiC_dcaZconstant{"xiFromXiC_dcaZconstant", 0.001f, "[0] in |DCAxy| > [0]+[1]/pT"}; Configurable xiFromXiC_dcaXYpTdep{"xiFromXiC_dcaXYpTdep", 0.0, "[1] in |DCAxy| > [0]+[1]/pT"}; + Configurable xiFromXiC_dcaZpTdep{"xiFromXiC_dcaZpTdep", 0.0, "[1] in |DCAxy| > [0]+[1]/pT"}; + + Configurable xiCFromXiCC_dcaXY{"xiCFromXiCC_dcaXY", 0.0015f, "maxDCA"}; + Configurable xiCFromXiCC_dcaZ{"xiCFromXiCC_dcaZ", 0.0015f, "maxDCA"}; + Configurable xiCC_dcaXY{"xiCC_dcaXY", 0.002f, "maxDCA"}; + Configurable xiCC_dcaZ{"xiCC_dcaZ", 0.002f, "maxDCA"}; Configurable minPiCPt{"minPiCPt", 0.15, "Minimum pT for XiC pions"}; Configurable minPiCCPt{"minPiCCPt", 0.3, "Minimum pT for XiCC pions"}; Configurable minNTracks{"minNTracks", -1, "Minimum number of tracks"}; Configurable minXiCRadius{"minXiCRadius", 0.001, "Minimum R2D for XiC decay (cm)"}; + Configurable minXiCCRadius{"minXiCCRadius", 0.005, "Minimum R2D for XiCC decay (cm)"}; + Configurable xicMinProperLength{"xicMinProperLength", 0.002, "Minimum proper length for XiC decay (cm)"}; + Configurable xicMaxProperLength{"xicMaxProperLength", 0.06, "Minimum proper length for XiC decay (cm)"}; + Configurable xiccMinProperLength{"xiccMinProperLength", 0.004, "Minimum proper length for XiCC decay (cm)"}; + Configurable xiccMaxProperLength{"xiccMaxProperLength", 999, "Minimum proper length for XiCC decay (cm)"}; Configurable massWindowXi{"massWindowXi", 0.015, "Mass window around Xi peak"}; Configurable massWindowXiC{"massWindowXiC", 0.015, "Mass window around XiC peak"}; ConfigurableAxis axisEta{"axisEta", {80, -4.0f, +4.0f}, "#eta"}; ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.2f, 2.4f, 2.6f, 2.8f, 3.0f, 3.2f, 3.4f, 3.6f, 3.8f, 4.0f, 4.4f, 4.8f, 5.2f, 5.6f, 6.0f, 6.5f, 7.0f, 7.5f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 17.0f, 19.0f, 21.0f, 23.0f, 25.0f, 30.0f, 35.0f, 40.0f, 50.0f}, "pt axis for QA histograms"}; - ConfigurableAxis axisDCA{"axisDCA", {200, -100, 100}, "DCA (#mum)"}; + ConfigurableAxis axisDCA2d{"axisDCA2d", {400, -200, 200}, "DCA2d (#mum)"}; + ConfigurableAxis axisDCA{"axisDCA", {200, 0, 200}, "DCA (#mum)"}; + ConfigurableAxis axisRadius{"axisRadius", {1000, 0, 1000}, "Decay radius (#mum)"}; + ConfigurableAxis axisDecayLength{"axisDecayLength", {2000, 0, 2000}, "Decay lenght (#mum)"}; ConfigurableAxis axisXiMass{"axisXiMass", {200, 1.221f, 1.421f}, "Xi Inv Mass (GeV/c^{2})"}; ConfigurableAxis axisXiCMass{"axisXiCMass", {200, 2.368f, 2.568f}, "XiC Inv Mass (GeV/c^{2})"}; ConfigurableAxis axisXiCCMass{"axisXiCCMass", {200, 3.521f, 3.721f}, "XiCC Inv Mass (GeV/c^{2})"}; - ConfigurableAxis axisDCAXi{"axisDCAXi", {200, 0, 200}, "DCA (mum)"}; ConfigurableAxis axisDCAXiCDaughters{"axisDCAXiCDaughters", {200, 0, 100}, "DCA (mum)"}; ConfigurableAxis axisDCAXiCCDaughters{"axisDCAXiCCDaughters", {200, 0, 100}, "DCA (mum)"}; @@ -129,9 +147,9 @@ struct alice3multicharm { // partitions for Xi daughters Partition tracksPiFromXiC = - ((aod::a3DecayMap::decayMap & trackSelectionPiFromXiC) == trackSelectionPiFromXiC) && aod::track::signed1Pt > 0.0f && 1.0f / nabs(aod::track::signed1Pt) > minPiCPt&& nabs(aod::track::dcaXY) > piFromXiC_dcaXYconstant + piFromXiC_dcaXYpTdep* nabs(aod::track::signed1Pt); - Partition tracksPiFromXiCC = - ((aod::a3DecayMap::decayMap & trackSelectionPiFromXiCC) == trackSelectionPiFromXiCC) && aod::track::signed1Pt > 0.0f && 1.0f / nabs(aod::track::signed1Pt) > minPiCCPt&& nabs(aod::track::dcaXY) > piFromXiCC_dcaXYconstant + piFromXiCC_dcaXYpTdep* nabs(aod::track::signed1Pt); + ((aod::a3DecayMap::decayMap & trackSelectionPiFromXiC) == trackSelectionPiFromXiC) && aod::track::signed1Pt > 0.0f && 1.0f / nabs(aod::track::signed1Pt) > minPiCPt&& nabs(aod::track::dcaXY) > piFromXiC_dcaXYconstant + piFromXiC_dcaXYpTdep* nabs(aod::track::signed1Pt) && nabs(aod::track::dcaZ) > piFromXiC_dcaZconstant + piFromXiC_dcaZpTdep* nabs(aod::track::signed1Pt); + + Partition tracksPiFromXiCC = ((aod::a3DecayMap::decayMap & trackSelectionPiFromXiCC) == trackSelectionPiFromXiCC) && aod::track::signed1Pt > 0.0f && 1.0f / nabs(aod::track::signed1Pt) > minPiCCPt&& nabs(aod::track::dcaXY) > piFromXiCC_dcaXYconstant + piFromXiCC_dcaXYpTdep* nabs(aod::track::signed1Pt); // Helper struct to pass candidate information struct { @@ -386,28 +404,41 @@ struct alice3multicharm { histos.add("hEtaXiCC", "hEtaXiCC", kTH1D, {axisEta}); histos.add("hPtXiCC", "hPtXiCC", kTH1D, {axisPt}); - histos.add("hMcPtXiCC", "hMcPtXiCC", kTH1D, {axisPt}); histos.add("h3dMassXiCC", "h3dMassXiCC", kTH3D, {axisPt, axisEta, axisXiCCMass}); histos.add("hDCAXiCDaughters", "hDCAXiCDaughters", kTH1D, {axisDCAXiCDaughters}); histos.add("hDCAXiCCDaughters", "hDCAXiCCDaughters", kTH1D, {axisDCAXiCCDaughters}); - histos.add("hDCAXi", "hDCAXi", kTH1D, {axisDCAXi}); + histos.add("hDCAxyXi", "hDCAxyXi", kTH1D, {axisDCA}); + histos.add("hDCAzXi", "hDCAzXi", kTH1D, {axisDCA}); + + histos.add("hDCAxyXiC", "hDCAxyXiC", kTH1D, {axisDCA}); + histos.add("hDCAzXiC", "hDCAzXiC", kTH1D, {axisDCA}); + + histos.add("hDCAxyXiCC", "hDCAxyXiCC", kTH1D, {axisDCA}); + histos.add("hDCAzXiCC", "hDCAzXiCC", kTH1D, {axisDCA}); + histos.add("hPi1cPt", "hPi1cPt", kTH1D, {axisPt}); histos.add("hPi2cPt", "hPi2cPt", kTH1D, {axisPt}); histos.add("hPiccPt", "hPiccPt", kTH1D, {axisPt}); + histos.add("hMinXiCDecayRadius", "hMinXiCDecayRadius", kTH1D, {axisRadius}); + histos.add("hMinXiCCDecayRadius", "hMinXiCCDecayRadius", kTH1D, {axisRadius}); + + histos.add("hProperLengthXiC", "hProperLengthXiC", kTH1D, {axisDecayLength}); + histos.add("hProperLengthXiCC", "hProperLengthXiCC", kTH1D, {axisDecayLength}); + // These histograms bookkeep the exact number of combinations attempted // CombinationsXiC: triplets Xi-pi-pi considered per Xi // CombinationsXiCC: doublets XiC-pi considered per XiC histos.add("hCombinationsXiC", "hCombinationsXiC", kTH1D, {axisNConsidered}); histos.add("hCombinationsXiCC", "hCombinationsXiCC", kTH1D, {axisNConsidered}); histos.add("hNCollisions", "hNCollisions", kTH1D, {{2, 0.5, 2.5}}); - histos.add("hNTracks", "hNTracks", kTH1D, {{500, 0, 5000}}); + histos.add("hNTracks", "hNTracks", kTH1D, {{20000, 0, 20000}}); if (doDCAplots) { - histos.add("h2dDCAxyVsPtXiFromXiC", "h2dDCAxyVsPtXiFromXiC", kTH2D, {axisPt, axisDCA}); - histos.add("h2dDCAxyVsPtPiFromXiC", "h2dDCAxyVsPtPiFromXiC", kTH2D, {axisPt, axisDCA}); - histos.add("h2dDCAxyVsPtPiFromXiCC", "h2dDCAxyVsPtPiFromXiCC", kTH2D, {axisPt, axisDCA}); + histos.add("h2dDCAxyVsPtXiFromXiC", "h2dDCAxyVsPtXiFromXiC", kTH2D, {axisPt, axisDCA2d}); + histos.add("h2dDCAxyVsPtPiFromXiC", "h2dDCAxyVsPtPiFromXiC", kTH2D, {axisPt, axisDCA2d}); + histos.add("h2dDCAxyVsPtPiFromXiCC", "h2dDCAxyVsPtPiFromXiCC", kTH2D, {axisPt, axisDCA2d}); } } @@ -420,7 +451,6 @@ struct alice3multicharm { histos.fill(HIST("h2dGenXiC"), mcParticle.pt(), mcParticle.eta()); for (auto const& mcParticle : trueXiCC) { histos.fill(HIST("h2dGenXiCC"), mcParticle.pt(), mcParticle.eta()); - histos.fill(HIST("hMcPtXiCC"), mcParticle.pt()); } } @@ -460,7 +490,7 @@ struct alice3multicharm { for (auto const& xiCand : cascades) { histos.fill(HIST("hMassXi"), xiCand.mXi()); - if (std::abs(xiCand.mXi() - o2::constants::physics::MassXiMinus) > massWindowXi) + if (std::fabs(xiCand.mXi() - o2::constants::physics::MassXiMinus) > massWindowXi) continue; // out of mass region uint32_t nCombinationsC = 0; @@ -472,11 +502,9 @@ struct alice3multicharm { if (!bitcheck(xi.decayMap(), kTrueXiFromXiC)) continue; - if (xi.dcaXY() < xiFromXiC_dcaXYconstant) + if (std::fabs(xi.dcaXY()) < xiFromXiC_dcaXYconstant || std::fabs(xi.dcaZ()) < xiFromXiC_dcaZconstant) continue; - histos.fill(HIST("hDCAXi"), xi.dcaXY() * 1e+4); - for (auto const& pi1c : tracksPiFromXiCgrouped) { if (mcSameMotherCheck && !checkSameMother(xi, pi1c)) continue; @@ -485,8 +513,6 @@ struct alice3multicharm { if (pi1c.pt() < minPiCPt) continue; - histos.fill(HIST("hPi1cPt"), pi1c.pt()); - // second pion from XiC decay for starts here for (auto const& pi2c : tracksPiFromXiCgrouped) { @@ -499,8 +525,6 @@ struct alice3multicharm { if (pi2c.pt() < minPiCPt) continue; - histos.fill(HIST("hPi2cPt"), pi2c.pt()); - // if I am here, it means this is a triplet to be considered for XiC vertexing. // will now attempt to build a three-body decay candidate with these three track rows. @@ -509,7 +533,7 @@ struct alice3multicharm { if (!buildDecayCandidateThreeBody(xi, pi1c, pi2c, o2::constants::physics::MassXiMinus, o2::constants::physics::MassPionCharged, o2::constants::physics::MassPionCharged)) continue; // failed at building candidate - if (std::abs(thisXiCcandidate.mass - o2::constants::physics::MassXiCPlus) > massWindowXiC) + if (std::fabs(thisXiCcandidate.mass - o2::constants::physics::MassXiCPlus) > massWindowXiC) continue; // out of mass region histos.fill(HIST("hCharmBuilding"), 1.0f); @@ -519,28 +543,30 @@ struct alice3multicharm { thisXiCcandidate.prong0mom[2] + thisXiCcandidate.prong1mom[2] + thisXiCcandidate.prong2mom[2]}; o2::track::TrackParCov xicTrack(thisXiCcandidate.xyz, momentumC, thisXiCcandidate.parentTrackCovMatrix, +1); - - if (std::hypot(thisXiCcandidate.xyz[0], thisXiCcandidate.xyz[1]) < minXiCRadius) + double xicDecayRadius2D = std::hypot(thisXiCcandidate.xyz[0], thisXiCcandidate.xyz[1]); + if (xicDecayRadius2D < minXiCRadius) continue; // do not take if radius too small, likely a primary combination o2::dataformats::DCA dcaInfo; - float xicdcaXY = 1e+10; + float xicdcaXY = 1e+10, xicdcaZ = 1e+10; + ; o2::track::TrackParCov xicTrackCopy(xicTrack); // paranoia - o2::vertexing::PVertex primaryVertex; primaryVertex.setXYZ(collision.posX(), collision.posY(), collision.posZ()); if (xicTrackCopy.propagateToDCA(primaryVertex, magneticField, &dcaInfo)) { xicdcaXY = dcaInfo.getY(); + xicdcaZ = dcaInfo.getZ(); } + if (std::fabs(xicdcaXY) < xiCFromXiCC_dcaXY || std::fabs(xicdcaZ) < xiCFromXiCC_dcaZ) + continue; + histos.fill(HIST("hMassXiC"), thisXiCcandidate.mass); - histos.fill(HIST("hDCAXiCDaughters"), thisXiCcandidate.dca * 1e+4); // attempt XiCC finding uint32_t nCombinationsCC = 0; for (auto const& picc : tracksPiFromXiCCgrouped) { - if (mcSameMotherCheck && !checkSameMotherExtra(xi, picc)) continue; if (xiCand.posTrackId() == picc.globalIndex() || xiCand.negTrackId() == picc.globalIndex() || xiCand.bachTrackId() == picc.globalIndex()) @@ -548,33 +574,62 @@ struct alice3multicharm { if (picc.pt() < minPiCCPt) continue; - histos.fill(HIST("hPiccPt"), picc.pt()); - o2::track::TrackParCov piccTrack = getTrackParCov(picc); nCombinationsCC++; histos.fill(HIST("hCharmBuilding"), 2.0f); if (!buildDecayCandidateTwoBody(xicTrack, piccTrack, o2::constants::physics::MassXiCPlus, o2::constants::physics::MassPionCharged)) continue; // failed at building candidate - histos.fill(HIST("hCharmBuilding"), 3.0f); - histos.fill(HIST("hMassXiCC"), thisXiCCcandidate.mass); - histos.fill(HIST("hPtXiCC"), thisXiCCcandidate.pt); - histos.fill(HIST("hEtaXiCC"), thisXiCCcandidate.eta); - histos.fill(HIST("h3dMassXiCC"), thisXiCCcandidate.pt, thisXiCCcandidate.eta, thisXiCCcandidate.mass); - histos.fill(HIST("hDCAXiCCDaughters"), thisXiCCcandidate.dca * 1e+4); - const std::array momentumCC = { thisXiCCcandidate.prong0mom[0] + thisXiCCcandidate.prong1mom[0], thisXiCCcandidate.prong0mom[1] + thisXiCCcandidate.prong1mom[1], thisXiCCcandidate.prong0mom[2] + thisXiCCcandidate.prong1mom[2]}; o2::track::TrackParCov xiccTrack(thisXiCCcandidate.xyz, momentumCC, thisXiCCcandidate.parentTrackCovMatrix, +2); + double xiccDecayRadius2D = std::hypot(thisXiCCcandidate.xyz[0], thisXiCCcandidate.xyz[1]); + if (xiccDecayRadius2D < minXiCCRadius) + continue; // do not take if radius too small, likely a primary combination - float xiccdcaXY = 1e+10; + double totalMomentumC = std::hypot(momentumC[0], momentumC[1], momentumC[2]); + double xicProperLength = std::fabs(std::hypot(thisXiCcandidate.xyz[0], thisXiCcandidate.xyz[1], thisXiCcandidate.xyz[2]) - std::hypot(thisXiCCcandidate.xyz[0], thisXiCCcandidate.xyz[1], thisXiCCcandidate.xyz[2]) * totalMomentumC) / (std::fabs(totalMomentumC) * thisXiCcandidate.mass); + if (xicProperLength < xicMinProperLength || xicProperLength > xicMaxProperLength) + continue; + + double totalMomentumCC = std::hypot(momentumCC[0], momentumCC[1], momentumCC[2]); + double xiccProperLength = std::fabs(std::hypot(collision.posX(), collision.posY(), collision.posZ()) - std::hypot(thisXiCCcandidate.xyz[0], thisXiCCcandidate.xyz[1], thisXiCCcandidate.xyz[2]) * totalMomentumCC) / (std::fabs(totalMomentumCC) * thisXiCCcandidate.mass); + if (xiccProperLength < xiccMinProperLength || xiccProperLength > xicMaxProperLength) + continue; + + float xiccdcaXY = 1e+10, xiccdcaZ = 1e+10; if (xiccTrack.propagateToDCA(primaryVertex, magneticField, &dcaInfo)) { xiccdcaXY = dcaInfo.getY(); + xiccdcaZ = dcaInfo.getZ(); } + if (std::fabs(xiccdcaXY) > xiCC_dcaXY || std::fabs(xiccdcaZ) > xiCC_dcaZ) + continue; + + histos.fill(HIST("hDCAXiCDaughters"), thisXiCcandidate.dca * 1e+4); + histos.fill(HIST("hDCAXiCCDaughters"), thisXiCCcandidate.dca * 1e+4); + histos.fill(HIST("hProperLengthXiCC"), xiccProperLength * 1e+4); + histos.fill(HIST("hProperLengthXiC"), xicProperLength * 1e+4); + histos.fill(HIST("hMinXiCCDecayRadius"), xiccDecayRadius2D * 1e+4); + histos.fill(HIST("hMinXiCDecayRadius"), xicDecayRadius2D * 1e+4); + histos.fill(HIST("hPi2cPt"), pi2c.pt()); + histos.fill(HIST("hPi1cPt"), pi1c.pt()); + histos.fill(HIST("hPiccPt"), picc.pt()); + histos.fill(HIST("hDCAxyXi"), std::fabs(xi.dcaXY() * 1e+4)); + histos.fill(HIST("hDCAzXi"), std::fabs(xi.dcaZ() * 1e+4)); + histos.fill(HIST("hDCAxyXiC"), std::fabs(xicdcaXY * 1e+4)); + histos.fill(HIST("hDCAzXiC"), std::fabs(xicdcaZ * 1e+4)); + histos.fill(HIST("hDCAxyXiCC"), std::fabs(xiccdcaXY * 1e+4)); + histos.fill(HIST("hDCAzXiCC"), std::fabs(xiccdcaZ * 1e+4)); + histos.fill(HIST("hCharmBuilding"), 3.0f); + histos.fill(HIST("hMassXiCC"), thisXiCCcandidate.mass); + histos.fill(HIST("hPtXiCC"), thisXiCCcandidate.pt); + histos.fill(HIST("hEtaXiCC"), thisXiCCcandidate.eta); + histos.fill(HIST("h3dMassXiCC"), thisXiCCcandidate.pt, thisXiCCcandidate.eta, thisXiCCcandidate.mass); + // produce multi-charm table for posterior analysis if (fillDerivedTable) { multiCharmCore( From fb3b848cdafc173953e22b5b21163a75bc38dd77 Mon Sep 17 00:00:00 2001 From: Francesco Mazzaschi <43742195+fmazzasc@users.noreply.github.com> Date: Thu, 17 Apr 2025 12:37:34 +0200 Subject: [PATCH 1021/1650] [PWGLF] Add flag for PV casc contributors (#10875) Co-authored-by: Francesco Mazzaschi Co-authored-by: ALICE Action Bot --- PWGLF/DataModel/LFNonPromptCascadeTables.h | 5 +++++ PWGLF/Tasks/Strangeness/nonPromptCascade.cxx | 14 +++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/PWGLF/DataModel/LFNonPromptCascadeTables.h b/PWGLF/DataModel/LFNonPromptCascadeTables.h index 1fc2b6f2082..bcdc5d6f08d 100644 --- a/PWGLF/DataModel/LFNonPromptCascadeTables.h +++ b/PWGLF/DataModel/LFNonPromptCascadeTables.h @@ -38,6 +38,7 @@ DECLARE_SOA_COLUMN(IsFromCharm, isFromCharm, bool); DECLARE_SOA_COLUMN(PvX, pvX, float); DECLARE_SOA_COLUMN(PvY, pvY, float); DECLARE_SOA_COLUMN(PvZ, pvZ, float); +DECLARE_SOA_COLUMN(CascPVContribs, cascPVContribs, uint8_t); DECLARE_SOA_COLUMN(CascPt, cascPt, float); DECLARE_SOA_COLUMN(CascEta, cascEta, float); @@ -115,6 +116,7 @@ DECLARE_SOA_TABLE(NPCascTable, "AOD", "NPCASCTABLE", NPCascadeTable::ITSClusSize, NPCascadeTable::HasReassociatedCluster, aod::collision::NumContrib, + NPCascadeTable::CascPVContribs, aod::collision::CollisionTimeRes, NPCascadeTable::PvX, NPCascadeTable::PvY, @@ -173,6 +175,7 @@ DECLARE_SOA_TABLE(NPCascTableNT, "AOD", "NPCASCTABLENT", NPCascadeTable::ITSClusSize, NPCascadeTable::HasReassociatedCluster, aod::collision::NumContrib, + NPCascadeTable::CascPVContribs, aod::collision::CollisionTimeRes, NPCascadeTable::PvX, NPCascadeTable::PvY, @@ -237,6 +240,7 @@ DECLARE_SOA_TABLE(NPCascTableMC, "AOD", "NPCASCTABLEMC", NPCascadeTable::IsFromBeauty, NPCascadeTable::IsFromCharm, aod::collision::NumContrib, + NPCascadeTable::CascPVContribs, aod::collision::CollisionTimeRes, NPCascadeTable::PvX, NPCascadeTable::PvY, @@ -309,6 +313,7 @@ DECLARE_SOA_TABLE(NPCascTableMCNT, "AOD", "NPCASCTABLEMCNT", NPCascadeTable::IsFromBeauty, NPCascadeTable::IsFromCharm, aod::collision::NumContrib, + NPCascadeTable::CascPVContribs, aod::collision::CollisionTimeRes, NPCascadeTable::PvX, NPCascadeTable::PvY, diff --git a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx index 53376eab4f1..b658981c5c4 100644 --- a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx +++ b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx @@ -65,6 +65,7 @@ struct NPCascCandidate { bool isFromBeauty; bool isFromCharm; uint16_t pvContributors; + uint8_t cascPVContribs; float pvTimeResolution; float pvX; float pvY; @@ -286,6 +287,12 @@ struct NonPromptCascadeTask { const auto& protonTrack = bachelor.sign() > 0 ? ntrack : ptrack; const auto& pionTrack = bachelor.sign() > 0 ? ptrack : ntrack; + // first bit for the strange track, second for pos v0, third for neg v0, fourth for bachelor + uint8_t cascPVContribs = 0; + cascPVContribs |= ptrack.isPVContributor() << 1; + cascPVContribs |= ntrack.isPVContributor() << 2; + cascPVContribs |= bachelor.isPVContributor() << 3; + mRegistry.fill(HIST("h_PIDcutsXi"), 0, 1.322); mRegistry.fill(HIST("h_PIDcutsOmega"), 0, 1.675); @@ -422,6 +429,7 @@ struct NonPromptCascadeTask { int trackedCascGlobalIndex{-1}, itsTrackGlobalIndex{-1}, cascITSclusters{-1}; if constexpr (requires { candidate.track(); }) { const auto& track = candidate.template track_as(); + cascPVContribs |= track.isPVContributor() << 0; const auto& ITStrack = candidate.template itsTrack_as(); auto trackTrkParCov = getTrackParCov(track); o2::base::Propagator::Instance()->propagateToDCA(primaryVertex, trackTrkParCov, mBz, 2.f, matCorr, &motherDCA); @@ -447,7 +455,7 @@ struct NonPromptCascadeTask { float mc = collision.multFT0C(); float ma = collision.multFT0A(); candidates.emplace_back(NPCascCandidate{mcParticleID, trackedCascGlobalIndex, itsTrackGlobalIndex, candidate.collisionId(), matchingChi2, deltaPtITSCascade, cascITSclsSize, hasReassociatedClusters, isGoodMatch, isGoodCascade, pdgCodeMom, itsTrackPDG, fromHF[0], fromHF[1], - collision.numContrib(), collision.collisionTimeRes(), primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ(), + collision.numContrib(), cascPVContribs, collision.collisionTimeRes(), primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ(), cascadeLvector.pt(), cascadeLvector.eta(), cascadeLvector.phi(), protonTrack.pt(), protonTrack.eta(), pionTrack.pt(), pionTrack.eta(), bachelor.pt(), bachelor.eta(), motherDCA.getY(), motherDCA.getZ(), protonDCA.getY(), protonDCA.getZ(), pionDCA.getY(), pionDCA.getZ(), bachDCA.getY(), bachDCA.getZ(), @@ -465,7 +473,7 @@ struct NonPromptCascadeTask { { for (const auto& c : candidates) { getDataTable()(c.matchingChi2, c.deltaPt, c.itsClusSize, c.hasReassociatedCluster, - c.pvContributors, c.pvTimeResolution, c.pvX, c.pvY, c.pvZ, + c.pvContributors, c.cascPVContribs, c.pvTimeResolution, c.pvX, c.pvY, c.pvZ, c.cascPt, c.cascEta, c.cascPhi, c.protonPt, c.protonEta, c.pionPt, c.pionEta, c.bachPt, c.bachEta, c.cascDCAxy, c.cascDCAz, c.protonDCAxy, c.protonDCAz, c.pionDCAxy, c.pionDCAz, c.bachDCAxy, c.bachDCAz, @@ -492,7 +500,7 @@ struct NonPromptCascadeTask { auto recCollision = collisions.iteratorAt(c.collisionID); getMCtable()(c.matchingChi2, c.deltaPt, c.itsClusSize, c.hasReassociatedCluster, c.isGoodMatch, c.isGoodCascade, c.pdgCodeMom, c.pdgCodeITStrack, c.isFromBeauty, c.isFromCharm, - c.pvContributors, c.pvTimeResolution, c.pvX, c.pvY, c.pvZ, c.cascPt, c.cascEta, c.cascPhi, + c.pvContributors, c.cascPVContribs, c.pvTimeResolution, c.pvX, c.pvY, c.pvZ, c.cascPt, c.cascEta, c.cascPhi, c.protonPt, c.protonEta, c.pionPt, c.pionEta, c.bachPt, c.bachEta, c.cascDCAxy, c.cascDCAz, c.protonDCAxy, c.protonDCAz, c.pionDCAxy, c.pionDCAz, c.bachDCAxy, c.bachDCAz, c.casccosPA, c.v0cosPA, c.massXi, c.massOmega, c.massV0, c.cascRadius, c.v0radius, c.cascLength, c.v0length, From fbb3e6f9394c9b0c71f7001f93170885ee40a97e Mon Sep 17 00:00:00 2001 From: aimeric-landou <46970521+aimeric-landou@users.noreply.github.com> Date: Thu, 17 Apr 2025 14:40:21 +0200 Subject: [PATCH 1022/1650] [PWGJE] backgroundAnalysis: binning, spectraCharged/trackEff: fix .mcCollision() calls (#10836) --- PWGJE/Tasks/jetBackgroundAnalysis.cxx | 14 +++++++++----- PWGJE/Tasks/jetSpectraCharged.cxx | 8 ++++++++ PWGJE/Tasks/trackEfficiency.cxx | 5 +++++ 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/PWGJE/Tasks/jetBackgroundAnalysis.cxx b/PWGJE/Tasks/jetBackgroundAnalysis.cxx index ac6e1430d76..ece360113ec 100644 --- a/PWGJE/Tasks/jetBackgroundAnalysis.cxx +++ b/PWGJE/Tasks/jetBackgroundAnalysis.cxx @@ -56,6 +56,7 @@ struct JetBackgroundAnalysisTask { Configurable trackOccupancyInTimeRangeMax{"trackOccupancyInTimeRangeMax", 999999, "maximum track occupancy of collisions in neighbouring collisions in a given time range; only applied to reconstructed collisions (data and mcd jets), not mc collisions (mcp jets)"}; Configurable trackOccupancyInTimeRangeMin{"trackOccupancyInTimeRangeMin", -999999, "minimum track occupancy of collisions in neighbouring collisions in a given time range; only applied to reconstructed collisions (data and mcd jets), not mc collisions (mcp jets)"}; Configurable skipMBGapEvents{"skipMBGapEvents", false, "flag to choose to reject min. bias gap events"}; + Configurable nBinsFluct{"nBinsFluct", 1000, "number of bins for flucuations axes"}; Configurable trackEtaMin{"trackEtaMin", -0.9, "minimum eta acceptance for tracks"}; Configurable trackEtaMax{"trackEtaMax", 0.9, "maximum eta acceptance for tracks"}; @@ -79,6 +80,9 @@ struct JetBackgroundAnalysisTask { eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast(eventSelections)); trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast(trackSelections)); + // Axes definitions + AxisSpec bkgFluctuationsAxis = {nBinsFluct, -100.0, 100.0, "#delta #it{p}_{T} (GeV/#it{c})"}; + // histogram definitions if (doprocessRho) { @@ -90,11 +94,11 @@ struct JetBackgroundAnalysisTask { } if (doprocessBkgFluctuationsData || doprocessBkgFluctuationsMCD) { - registry.add("h2_centrality_rhorandomcone", "; centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho} (GeV/c);", {HistType::kTH2F, {{1100, 0., 110.}, {800, -400.0, 400.0}}}); - registry.add("h2_centrality_rhorandomconerandomtrackdirection", "; centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho} (GeV/c);", {HistType::kTH2F, {{1100, 0., 110.}, {800, -400.0, 400.0}}}); - registry.add("h2_centrality_rhorandomconewithoutleadingjet", "; centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho} (GeV/c);", {HistType::kTH2F, {{1100, 0., 110.}, {800, -400.0, 400.0}}}); - registry.add("h2_centrality_rhorandomconerandomtrackdirectionwithoutoneleadingjets", "; centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho} (GeV/c);", {HistType::kTH2F, {{1100, 0., 110.}, {800, -400.0, 400.0}}}); - registry.add("h2_centrality_rhorandomconerandomtrackdirectionwithouttwoleadingjets", "; centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho} (GeV/c);", {HistType::kTH2F, {{1100, 0., 110.}, {800, -400.0, 400.0}}}); + registry.add("h2_centrality_rhorandomcone", "; centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho} (GeV/c);", {HistType::kTH2F, {{1100, 0., 110.}, bkgFluctuationsAxis}}); + registry.add("h2_centrality_rhorandomconerandomtrackdirection", "; centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho} (GeV/c);", {HistType::kTH2F, {{1100, 0., 110.}, bkgFluctuationsAxis}}); + registry.add("h2_centrality_rhorandomconewithoutleadingjet", "; centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho} (GeV/c);", {HistType::kTH2F, {{1100, 0., 110.}, bkgFluctuationsAxis}}); + registry.add("h2_centrality_rhorandomconerandomtrackdirectionwithoutoneleadingjets", "; centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho} (GeV/c);", {HistType::kTH2F, {{1100, 0., 110.}, bkgFluctuationsAxis}}); + registry.add("h2_centrality_rhorandomconerandomtrackdirectionwithouttwoleadingjets", "; centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho} (GeV/c);", {HistType::kTH2F, {{1100, 0., 110.}, bkgFluctuationsAxis}}); } } diff --git a/PWGJE/Tasks/jetSpectraCharged.cxx b/PWGJE/Tasks/jetSpectraCharged.cxx index b6694627fbc..67495485bb6 100644 --- a/PWGJE/Tasks/jetSpectraCharged.cxx +++ b/PWGJE/Tasks/jetSpectraCharged.cxx @@ -108,6 +108,7 @@ struct JetSpectraCharged { if (doprocessCollisions || doprocessCollisionsWeighted) { registry.add("h_collisions", "event status;event status;entries", {HistType::kTH1F, {{4, 0.0, 4.0}}}); + registry.add("h_fakecollisions", "event status;event status;entries", {HistType::kTH1F, {{4, 0.0, 4.0}}}); registry.add("h2_centrality_occupancy", "centrality vs occupancy; centrality; occupancy", {HistType::kTH2F, {centralityAxis, {60, 0, 30000}}}); registry.add("h_collisions_Zvertex", "position of collision ;#it{Z} (cm)", {HistType::kTH1F, {{300, -15.0, 15.0}}}); if (doprocessCollisionsWeighted) { @@ -530,6 +531,9 @@ struct JetSpectraCharged { aod::JetMcCollisions const&, soa::Filtered> const& tracks) { + if (!collision.has_mcCollision()) { // the collision is fake and has no associated mc coll; skip as .mccollision() cannot be called + return; + } float eventWeight = collision.mcCollision().weight(); if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { return; @@ -565,6 +569,10 @@ struct JetSpectraCharged { void processCollisionsWeighted(soa::Join::iterator const& collision, aod::JetMcCollisions const&) { + if (!collision.has_mcCollision()) { // the collision is fake and has no associated mc coll; skip as .mccollision() cannot be called + registry.fill(HIST("h_fakecollisions"), 0.5); + return; + } float eventWeight = collision.mcCollision().weight(); registry.fill(HIST("h_collisions"), 0.5); registry.fill(HIST("h_collisions_weighted"), 0.5, eventWeight); diff --git a/PWGJE/Tasks/trackEfficiency.cxx b/PWGJE/Tasks/trackEfficiency.cxx index 74d5aa30d59..10ff3365974 100644 --- a/PWGJE/Tasks/trackEfficiency.cxx +++ b/PWGJE/Tasks/trackEfficiency.cxx @@ -204,6 +204,7 @@ struct TrackEfficiencyJets { if (doprocessTracks || doprocessTracksWeighted) { AxisSpec centAxis = {121, -10., 111., "centrality (%)"}; registry.add("h_collisions", "event status;event status;entries", {HistType::kTH1F, {{4, 0.0, 4.0}}}); + registry.add("h_fakecollisions", "event status;event status;entries", {HistType::kTH1F, {{4, 0.0, 4.0}}}); registry.add("h2_centrality_collisions", "centrality vs collisions; centrality; collisions", {HistType::kTH2F, {centAxis, {4, 0.0, 4.0}}}); } if (doprocessParticles || doprocessParticlesWeighted) { @@ -409,6 +410,10 @@ struct TrackEfficiencyJets { aod::JetMcCollisions const&, soa::Filtered> const& tracks) { + if (!collision.has_mcCollision()) { // the collision is fake and has no associated mc coll; skip as .mccollision() cannot be called + registry.fill(HIST("h_fakecollisions"), 0.5); + return; + } float eventWeight = collision.mcCollision().weight(); registry.fill(HIST("h_collisions"), 0.5); registry.fill(HIST("h_collisions_weighted"), 0.5, eventWeight); From c58c4f7bb2ae1fb83820cd0d7c25f3ebf4d1b32d Mon Sep 17 00:00:00 2001 From: czhang Date: Thu, 17 Apr 2025 16:13:24 +0200 Subject: [PATCH 1023/1650] [PWGDQ] Fix JIT compilation memory leak using double slicing (#10863) --- PWGDQ/TableProducer/tableMaker.cxx | 32 ++++++++++++++++++------------ 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/PWGDQ/TableProducer/tableMaker.cxx b/PWGDQ/TableProducer/tableMaker.cxx index 1922ab6e1ab..87390938f17 100644 --- a/PWGDQ/TableProducer/tableMaker.cxx +++ b/PWGDQ/TableProducer/tableMaker.cxx @@ -167,9 +167,11 @@ struct TableMaker { OutputObj fStatsList{"Statistics"}; //! skimming statistics HistogramManager* fHistMan; - Configurable fConfigEventCuts{"cfgEventCuts", "eventStandard", "Event selection"}; - Configurable fConfigTrackCuts{"cfgBarrelTrackCuts", "jpsiO2MCdebugCuts2", "Comma separated list of barrel track cuts"}; - Configurable fConfigMuonCuts{"cfgMuonCuts", "muonQualityCuts", "Comma separated list of muon cuts"}; + struct : ConfigurableGroup { + Configurable fConfigEventCuts{"cfgEventCuts", "eventStandard", "Event selection"}; + Configurable fConfigTrackCuts{"cfgBarrelTrackCuts", "jpsiO2MCdebugCuts2", "Comma separated list of barrel track cuts"}; + Configurable fConfigMuonCuts{"cfgMuonCuts", "muonQualityCuts", "Comma separated list of muon cuts"}; + } configCuts; struct : ConfigurableGroup { Configurable fConfigAddEventHistogram{"cfgAddEventHistogram", "", "Comma separated list of histograms"}; Configurable fConfigAddTrackHistogram{"cfgAddTrackHistogram", "", "Comma separated list of histograms"}; @@ -178,8 +180,10 @@ struct TableMaker { Configurable fConfigBarrelTrackPtLow{"cfgBarrelLowPt", 1.0f, "Low pt cut for tracks in the barrel"}; Configurable fConfigBarrelTrackMaxAbsEta{"cfgBarrelMaxAbsEta", 0.9f, "Eta absolute value cut for tracks in the barrel"}; Configurable fConfigMuonPtLow{"cfgMuonLowPt", 1.0f, "Low pt cut for muons"}; - Configurable fConfigMinTpcSignal{"cfgMinTpcSignal", 30.0, "Minimum TPC signal"}; - Configurable fConfigMaxTpcSignal{"cfgMaxTpcSignal", 300.0, "Maximum TPC signal"}; + struct : ConfigurableGroup { + Configurable fConfigMinTpcSignal{"cfgMinTpcSignal", 30.0, "Minimum TPC signal"}; + Configurable fConfigMaxTpcSignal{"cfgMaxTpcSignal", 300.0, "Maximum TPC signal"}; + } configTpcSignal; Configurable fConfigQA{"cfgQA", false, "If true, fill QA histograms"}; Configurable fConfigDetailedQA{"cfgDetailedQA", false, "If true, include more QA histograms (BeforeCuts classes)"}; Configurable fIsRun2{"cfgIsRun2", false, "Whether we analyze Run-2 or Run-3 data"}; @@ -225,14 +229,15 @@ struct TableMaker { Preslice perCollisionTracks = aod::track::collisionId; Preslice perCollisionMuons = aod::fwdtrack::collisionId; + PresliceUnsorted perCollisionMuonsRealign = aod::fwdtrackrealign::collisionId; Preslice trackIndicesPerCollision = aod::track_association::collisionId; Preslice fwdtrackIndicesPerCollision = aod::track_association::collisionId; - + PresliceUnsorted fwdtrackRealignPerMuon = aod::fwdtrackrealign::fwdtrackId; bool fDoDetailedQA = false; // Bool to set detailed QA true, if QA is set true int fCurrentRun; // needed to detect if the run changed and trigger update of calibrations etc. // TODO: filter on TPC dedx used temporarily until electron PID will be improved - Filter barrelSelectedTracks = ifnode(fIsRun2.node() == true, aod::track::trackType == uint8_t(aod::track::Run2Track), aod::track::trackType == uint8_t(aod::track::Track)) && o2::aod::track::pt >= fConfigBarrelTrackPtLow && nabs(o2::aod::track::eta) <= fConfigBarrelTrackMaxAbsEta && o2::aod::track::tpcSignal >= fConfigMinTpcSignal && o2::aod::track::tpcSignal <= fConfigMaxTpcSignal && o2::aod::track::tpcChi2NCl < 4.0f && o2::aod::track::itsChi2NCl < 36.0f; + Filter barrelSelectedTracks = ifnode(fIsRun2.node() == true, aod::track::trackType == uint8_t(aod::track::Run2Track), aod::track::trackType == uint8_t(aod::track::Track)) && o2::aod::track::pt >= fConfigBarrelTrackPtLow && nabs(o2::aod::track::eta) <= fConfigBarrelTrackMaxAbsEta && o2::aod::track::tpcSignal >= configTpcSignal.fConfigMinTpcSignal && o2::aod::track::tpcSignal <= configTpcSignal.fConfigMaxTpcSignal && o2::aod::track::tpcChi2NCl < 4.0f && o2::aod::track::itsChi2NCl < 36.0f; Filter muonFilter = o2::aod::fwdtrack::pt >= fConfigMuonPtLow; @@ -350,11 +355,11 @@ struct TableMaker { { // Event cuts fEventCut = new AnalysisCompositeCut(true); - TString eventCutStr = fConfigEventCuts.value; + TString eventCutStr = configCuts.fConfigEventCuts.value; fEventCut->AddCut(dqcuts::GetAnalysisCut(eventCutStr.Data())); // Barrel track cuts - TString cutNamesStr = fConfigTrackCuts.value; + TString cutNamesStr = configCuts.fConfigTrackCuts.value; if (!cutNamesStr.IsNull()) { std::unique_ptr objArray(cutNamesStr.Tokenize(",")); for (int icut = 0; icut < objArray->GetEntries(); ++icut) { @@ -363,7 +368,7 @@ struct TableMaker { } // Muon cuts - cutNamesStr = fConfigMuonCuts.value; + cutNamesStr = configCuts.fConfigMuonCuts.value; if (!cutNamesStr.IsNull()) { std::unique_ptr objArray(cutNamesStr.Tokenize(",")); for (int icut = 0; icut < objArray->GetEntries(); ++icut) { @@ -1127,7 +1132,7 @@ struct TableMaker { // Update muon information using realigned tracks if (static_cast(muon.trackType()) > 2) { // Update only MCH or MCH-MID tracks with realigned information - auto muonRealignSelected = tracksMuonRealign.select(aod::fwdtrackrealign::fwdtrackId == muonId.fwdtrackId() && aod::fwdtrackrealign::collisionId == collision.globalIndex()); + auto muonRealignSelected = tracksMuonRealign.sliceBy(fwdtrackRealignPerMuon, muonId.fwdtrackId()); if (muonRealignSelected.size() == 1) { for (const auto& muonRealign : muonRealignSelected) { VarManager::FillTrack(muonRealign); @@ -1176,7 +1181,7 @@ struct TableMaker { // Update muon information using realigned tracks if (static_cast(muon.trackType()) > 2) { // Update only MCH or MCH-MID tracks with realigned information - auto muonRealignSelected = tracksMuonRealign.select(aod::fwdtrackrealign::fwdtrackId == muonId.fwdtrackId() && aod::fwdtrackrealign::collisionId == collision.globalIndex()); + auto muonRealignSelected = tracksMuonRealign.sliceBy(fwdtrackRealignPerMuon, muonId.fwdtrackId()); if (muonRealignSelected.size() == 1) { for (const auto& muonRealign : muonRealignSelected) { LOGF(debug, "Muon original - collisionId:%d x:%g y:%g z:%g phi:%g tgl:%g signed1pt:%g pt:%g p:%g eta:%g chi2:%g", muon.collisionId(), muon.x(), muon.y(), muon.z(), muon.phi(), muon.tgl(), muon.signed1Pt(), muon.pt(), muon.p(), muon.eta(), muon.chi2()); @@ -1687,7 +1692,8 @@ struct TableMaker { { for (auto& collision : collisions) { auto muonIdsThisCollision = fwdtrackIndices.sliceBy(fwdtrackIndicesPerCollision, collision.globalIndex()); - fullSkimmingIndices(collision, bcs, nullptr, tracksMuon, tracksMuonRealign, nullptr, muonIdsThisCollision); + auto muonsRealignThisCollision = tracksMuonRealign.sliceBy(perCollisionMuonsRealign, collision.globalIndex()); + fullSkimmingIndices(collision, bcs, nullptr, tracksMuon, muonsRealignThisCollision, nullptr, muonIdsThisCollision); } } From 1c89e2252f5d731436670b3a932496a68c8488c1 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Thu, 17 Apr 2025 18:31:53 +0200 Subject: [PATCH 1024/1650] [PWGEM/Dilepton] update matchingMFT.cxx (#10901) --- PWGEM/Dilepton/Tasks/matchingMFT.cxx | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/PWGEM/Dilepton/Tasks/matchingMFT.cxx b/PWGEM/Dilepton/Tasks/matchingMFT.cxx index b327bfc67de..680c929c284 100644 --- a/PWGEM/Dilepton/Tasks/matchingMFT.cxx +++ b/PWGEM/Dilepton/Tasks/matchingMFT.cxx @@ -69,6 +69,7 @@ struct matchingMFT { Configurable maxMatchingChi2MCHMFT{"maxMatchingChi2MCHMFT", 1e+10, "max. chi2 for MCH-MFT matching"}; Configurable maxChi2SA{"maxChi2SA", 1e+6, "max. chi2 for standalone muon"}; Configurable maxChi2GL{"maxChi2GL", 1e+6, "max. chi2 for global muon"}; + // Configurable maxChi2MFT{"maxChi2MFT", 1e+6, "max. chi2/ndf for MFT track in global muon"}; Configurable minNclustersMFT{"minNclustersMFT", 5, "min nclusters MFT"}; Configurable refitGlobalMuon{"refitGlobalMuon", true, "flag to refit global muon"}; Configurable requireTrueAssociation{"requireTrueAssociation", false, "flag to require true mc collision association"}; @@ -157,6 +158,7 @@ struct matchingMFT { fRegistry.add("MFTMCHMID/primary/correct/hChi2MatchMCHMID", "chi2 match MCH-MID;chi2", kTH1F, {{100, 0.0f, 100}}, false); fRegistry.add("MFTMCHMID/primary/correct/hChi2MatchMCHMFT", "chi2 match MCH-MFT;chi2", kTH1F, {{100, 0.0f, 100}}, false); fRegistry.add("MFTMCHMID/primary/correct/hDCAxy2D", "DCA x vs. y;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -0.5, 0.5}, {200, -0.5, +0.5}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hDCAz", "DCA z;DCA_{z} (cm);", kTH1F, {{1000, 0, 10}}, false); fRegistry.add("MFTMCHMID/primary/correct/hDCAxy2DinSigma", "DCA x vs. y in sigma;DCA_{x} (#sigma);DCA_{y} (#sigma)", kTH2F, {{200, -10, 10}, {200, -10, +10}}, false); fRegistry.add("MFTMCHMID/primary/correct/hDCAxy", "DCAxy;DCA_{xy} (cm);", kTH1F, {{100, 0, 1}}, false); fRegistry.add("MFTMCHMID/primary/correct/hDCAxyinSigma", "DCAxy in sigma;DCA_{xy} (#sigma);", kTH1F, {{100, 0, 10}}, false); @@ -269,6 +271,7 @@ struct matchingMFT { float dcaY = propmuonAtDCA.getY() - collision.posY(); float rAtAbsorberEnd = fwdtrack.rAtAbsorberEnd(); // this works only for GlobalMuonTrack float dcaXY = std::sqrt(dcaX * dcaX + dcaY * dcaY); + float dcaZ = -dcaXY * std::sinh(eta); float dFdx = 2.f * dcaX / dcaXY; float dFdy = 2.f * dcaY / dcaXY; @@ -285,7 +288,11 @@ struct matchingMFT { float dcaXY_Matched = std::sqrt(dcaX_Matched * dcaX_Matched + dcaY_Matched * dcaY_Matched); float pDCA = mchtrack.p() * dcaXY_Matched; int nClustersMFT = mfttrack.nClusters(); + // float chi2mft = mfttrack.chi2()/(2.f * nClustersMFT - 5.f); float chi2mft = mfttrack.chi2(); + // if (chi2mft < 0.f || maxChi2MFT < chi2mft) { + // return; + // } if (refitGlobalMuon) { eta = mfttrack.eta(); @@ -315,6 +322,7 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/primary/correct/hChi2MatchMCHMID"), fwdtrack.chi2MatchMCHMID()); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hChi2MatchMCHMFT"), fwdtrack.chi2MatchMCHMFT()); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxy2D"), dcaX, dcaY); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAz"), dcaZ); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxy2DinSigma"), dcaX / std::sqrt(cXXatDCA), dcaY / std::sqrt(cYYatDCA)); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxy"), dcaXY); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxyinSigma"), dcaXY / sigma_dcaXY); @@ -345,6 +353,7 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hChi2MatchMCHMID"), fwdtrack.chi2MatchMCHMID()); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hChi2MatchMCHMFT"), fwdtrack.chi2MatchMCHMFT()); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxy2D"), dcaX, dcaY); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAz"), dcaZ); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxy2DinSigma"), dcaX / std::sqrt(cXXatDCA), dcaY / std::sqrt(cYYatDCA)); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxy"), dcaXY); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxyinSigma"), dcaXY / sigma_dcaXY); @@ -376,6 +385,7 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hChi2MatchMCHMID"), fwdtrack.chi2MatchMCHMID()); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hChi2MatchMCHMFT"), fwdtrack.chi2MatchMCHMFT()); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxy2D"), dcaX, dcaY); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAz"), dcaZ); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxy2DinSigma"), dcaX / std::sqrt(cXXatDCA), dcaY / std::sqrt(cYYatDCA)); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxy"), dcaXY); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxyinSigma"), dcaXY / sigma_dcaXY); @@ -405,6 +415,7 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hChi2MatchMCHMID"), fwdtrack.chi2MatchMCHMID()); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hChi2MatchMCHMFT"), fwdtrack.chi2MatchMCHMFT()); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxy2D"), dcaX, dcaY); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAz"), dcaZ); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxy2DinSigma"), dcaX / std::sqrt(cXXatDCA), dcaY / std::sqrt(cYYatDCA)); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxy"), dcaXY); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxyinSigma"), dcaXY / sigma_dcaXY); From 4a28b075c2cd1768527a506aafc0f0de2a93f835 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Thu, 17 Apr 2025 20:00:46 +0200 Subject: [PATCH 1025/1650] O2 linter: TestNameFunctionVariable: Fix false positives (#10902) --- Scripts/o2_linter.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Scripts/o2_linter.py b/Scripts/o2_linter.py index 23fdb3f2322..bf365180c5f 100644 --- a/Scripts/o2_linter.py +++ b/Scripts/o2_linter.py @@ -863,6 +863,7 @@ def test_line(self, line: str) -> bool: "class", "explicit", "concept", + "throw", ): return True if len(words) > 2 and words[1] in ("typename", "class", "struct"): From a0f1c122bf33ee96649c7bdb7e57c1e2579bf82c Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Thu, 17 Apr 2025 20:45:47 +0200 Subject: [PATCH 1026/1650] [PWGLF] Add deep angle information for phi meson pair (#10903) --- PWGLF/Tasks/Resonances/doublephimeson.cxx | 31 ++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/PWGLF/Tasks/Resonances/doublephimeson.cxx b/PWGLF/Tasks/Resonances/doublephimeson.cxx index fd0e6acac71..23eb7a8043d 100644 --- a/PWGLF/Tasks/Resonances/doublephimeson.cxx +++ b/PWGLF/Tasks/Resonances/doublephimeson.cxx @@ -46,6 +46,7 @@ struct doublephimeson { Configurable minPhiMass{"minPhiMass", 1.01, "Minimum phi mass"}; Configurable maxPhiMass{"maxPhiMass", 1.03, "Maximum phi mass"}; Configurable additionalEvsel{"additionalEvsel", false, "Additional event selection"}; + Configurable isDeep{"isDeep", true, "Store deep angle"}; Configurable cutMinNsigmaTPC{"cutMinNsigmaTPC", -2.5, "nsigma cut TPC"}; Configurable cutNsigmaTPC{"cutNsigmaTPC", 3.0, "nsigma cut TPC"}; Configurable cutNsigmaTOF{"cutNsigmaTOF", 3.0, "nsigma cut TOF"}; @@ -61,7 +62,7 @@ struct doublephimeson { ConfigurableAxis configThnAxisPt{"configThnAxisPt", {40, 0.0, 20.}, "#it{p}_{T} (GeV/#it{c})"}; ConfigurableAxis configThnAxisKstar{"configThnAxisKstar", {200, 0.0, 2.0}, "#it{k}^{*} (GeV/#it{c})"}; ConfigurableAxis configThnAxisDeltaR{"configThnAxisDeltaR", {200, 0.0, 2.0}, "#it{k}^{*} (GeV/#it{c})"}; - ConfigurableAxis configThnAxisCosTheta{"configThnAxisCosTheta", {100, -1.0, 1.0}, "cos #theta{*}"}; + ConfigurableAxis configThnAxisCosTheta{"configThnAxisCosTheta", {160, 0.0, 3.2}, "cos #theta{*}"}; ConfigurableAxis configThnAxisNumPhi{"configThnAxisNumPhi", {101, -0.5, 100.5}, "cos #theta{*}"}; // Initialize the ananlysis task @@ -106,6 +107,20 @@ struct doublephimeson { return 0.5 * trackRelK.P(); } + float deepangle(const TLorentzVector candidate1, + const TLorentzVector candidate2) + { + double pt1, pt2, pz1, pz2, p1, p2, angle; + pt1 = candidate1.Pt(); + pt2 = candidate2.Pt(); + pz1 = candidate1.Pz(); + pz2 = candidate2.Pz(); + p1 = candidate1.P(); + p2 = candidate2.P(); + angle = TMath::ACos((pt1 * pt2 + pz1 * pz2) / (p1 * p2)); + return angle; + } + // get cosTheta TLorentzVector daughterCMS; ROOT::Math::XYZVector threeVecDauCM, threeVecMother; @@ -217,7 +232,12 @@ struct doublephimeson { // auto kstar = getkstar(Phid1, Phid2); auto deltaR = TMath::Sqrt(TMath::Power(Phid1.Phi() - Phid2.Phi(), 2.0) + TMath::Power(Phid1.Eta() - Phid2.Eta(), 2.0)); auto costheta = (Phid1.Px() * Phid2.Px() + Phid1.Py() * Phid2.Py() + Phid1.Pz() * Phid2.Pz()) / (Phid1.P() * Phid2.P()); - histos.fill(HIST("SEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, costheta, Phid1.M(), Phid2.M(), phimult); + if (!isDeep) { + histos.fill(HIST("SEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, costheta, Phid1.M(), Phid2.M(), phimult); + } + if (isDeep) { + histos.fill(HIST("SEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, deepangle(Phid1, Phid2), Phid1.M(), Phid2.M(), phimult); + } } } } @@ -263,7 +283,12 @@ struct doublephimeson { exotic = Phid1 + Phid2; auto deltaR = TMath::Sqrt(TMath::Power(Phid1.Phi() - Phid2.Phi(), 2.0) + TMath::Power(Phid1.Eta() - Phid2.Eta(), 2.0)); auto costheta = (Phid1.Px() * Phid2.Px() + Phid1.Py() * Phid2.Py() + Phid1.Pz() * Phid2.Pz()) / (Phid1.P() * Phid2.P()); - histos.fill(HIST("MEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, costheta, Phid1.M(), Phid2.M(), phimult); + if (!isDeep) { + histos.fill(HIST("MEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, costheta, Phid1.M(), Phid2.M(), phimult); + } + if (isDeep) { + histos.fill(HIST("MEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, deepangle(Phid1, Phid2), Phid1.M(), Phid2.M(), phimult); + } } } } From 0135fb2097e6704e1265cc5d2b57dd5446d477fc Mon Sep 17 00:00:00 2001 From: bghanley1995 Date: Thu, 17 Apr 2025 16:37:04 -0400 Subject: [PATCH 1027/1650] [PWGCF] Identified BF Added purity histograms for genereated particles, added track time histograms (#10890) Co-authored-by: ALICE Action Bot --- .../TableProducer/identifiedBfFilter.cxx | 37 +++++++++++++++++-- .../Tasks/identifiedbf.cxx | 6 +++ 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx b/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx index 6508dcd0a8a..4b57042f15a 100644 --- a/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx +++ b/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx @@ -78,6 +78,7 @@ bool loadfromccdb = false; std::vector recoIdMethods = {0, 1, 2}; // Reconstructed PID Methods, 0 is no PID, 1 is calculated PID, 2 is MC PID std::vector trackTypes = {0, 1, 2, 3}; +const int twoDenom = 2; // Used to test if a value is even or odd //============================================================================================ // The IdentifiedBfFilter histogram objects @@ -136,7 +137,8 @@ TH2F* fhdEdxB = nullptr; TH2F* fhdEdxIPTPCB = nullptr; TH2F* fhdEdxA[kIdBfNoOfSpecies + 2] = {nullptr}; TH2F* fhdEdxIPTPCA[kIdBfNoOfSpecies + 2] = {nullptr}; -TH2F* fhTrackTime[kIdBfNoOfSpecies + 2] = {nullptr}; +TH2F* fhTrackTimeA[kIdBfNoOfSpecies + 2] = {nullptr}; +TH2F* fhTrackBetaA[kIdBfNoOfSpecies + 2] = {nullptr}; TH1F* fhMassB = nullptr; TH1F* fhMassA[kIdBfNoOfSpecies + 1] = {nullptr}; @@ -895,6 +897,12 @@ struct IdentifiedBfFilterTracks { fhdEdxIPTPCA[sp] = new TH2F(TString::Format("fhdEdxIPTPCA_%s", speciesName[sp]).Data(), TString::Format("dE/dx vs P_{IP} reconstructed %s; P (GeV/c); dE/dx (a.u.)", speciesTitle[sp]).Data(), ptbins, ptlow, ptup, 1000, 0.0, 1000.0); + fhTrackTimeA[sp] = new TH2F(TString::Format("fhTrackTimeA_%s", speciesName[sp]).Data(), + TString::Format("Track Time vs P_{IP} reconstructed %s; P (GeV/c); Track Time(ns)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); + fhTrackBetaA[sp] = new TH2F(TString::Format("fhTrackBetaA_%s", speciesName[sp]).Data(), + TString::Format("1/#Beta vs P_{IP} reconstructed %s; P (GeV/c); 1/#Beta(ns/m)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); } fhdEdxA[kIdBfNoOfSpecies + 1] = new TH2F(TString::Format("fhdEdxA_WrongSpecies").Data(), TString::Format("dE/dx vs P reconstructed Wrong Species; P (GeV/c); dE/dx (a.u.)").Data(), @@ -902,6 +910,13 @@ struct IdentifiedBfFilterTracks { fhdEdxIPTPCA[kIdBfNoOfSpecies + 1] = new TH2F(TString::Format("fhdEdxIPTPCA_WrongSpecies").Data(), TString::Format("dE/dx vs P_{IP} reconstructed Wrong Species; P (GeV/c); dE/dx (a.u.)").Data(), ptbins, ptlow, ptup, 1000, 0.0, 1000.0); + fhTrackTimeA[kIdBfNoOfSpecies + 1] = new TH2F(TString::Format("fhTrackTimeA_WrongSpecies").Data(), + TString::Format("Track Time vs P_{IP} reconstructed Wrong Species; P (GeV/c); Track Time(ns)").Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); + fhTrackBetaA[kIdBfNoOfSpecies + 1] = new TH2F(TString::Format("fhTrackBetaA_WrongSpecies").Data(), + TString::Format("1/#Beta vs P_{IP} reconstructed Wrong Species; P (GeV/c); 1/#Beta(ns/m)").Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); + /* add the hstograms to the output list */ fOutputList->Add(fhXYB); fOutputList->Add(fhYZB); @@ -963,9 +978,13 @@ struct IdentifiedBfFilterTracks { fOutputList->Add(fhDeltaNA[sp]); fOutputList->Add(fhdEdxA[sp]); fOutputList->Add(fhdEdxIPTPCA[sp]); + fOutputList->Add(fhTrackTimeA[sp]); + fOutputList->Add(fhTrackBetaA[sp]); } fOutputList->Add(fhdEdxA[kIdBfNoOfSpecies + 1]); fOutputList->Add(fhdEdxIPTPCA[kIdBfNoOfSpecies + 1]); + fOutputList->Add(fhTrackTimeA[kIdBfNoOfSpecies + 1]); + fOutputList->Add(fhTrackBetaA[kIdBfNoOfSpecies + 1]); } if ((fDataType != kData) && (fDataType != kDataNoEvtSel)) { @@ -1145,10 +1164,10 @@ struct IdentifiedBfFilterTracks { if (!(pid < 0)) { naccepted++; /* update charged multiplicities */ - if (pid % 2 == 0) { + if (pid % twoDenom == trackTypes[0]) { trkMultPos[kIdBfCharged]++; } - if (pid % 2 == 1) { + if (pid % twoDenom == trackTypes[1]) { trkMultNeg[kIdBfCharged]++; } if (fullDerivedData) { @@ -1567,6 +1586,8 @@ inline MatchRecoGenSpecies IdentifiedBfFilterTracks::identifyTrack(TrackObject c fhWrongTrackID->Fill(track.p()); fhdEdxA[kIdBfNoOfSpecies]->Fill(track.p(), track.tpcSignal()); fhdEdxIPTPCA[kIdBfNoOfSpecies]->Fill(track.tpcInnerParam(), track.tpcSignal()); + fhTrackTimeA[kIdBfNoOfSpecies]->Fill(track.tpcInnerParam(), track.trackTime()); + fhTrackBetaA[kIdBfNoOfSpecies]->Fill(track.tpcInnerParam(), track.trackTime() / track.length()); fhDoublePID->Fill(spMinNSigma, spDouble); return kWrongSpecies; // Return wrong species value } else { @@ -1658,7 +1679,13 @@ inline int8_t IdentifiedBfFilterTracks::acceptParticle(ParticleObject& particle, } if (ptlow < particle.pt() && particle.pt() < ptup && etalow < particle.eta() && particle.eta() < etaup) { - MatchRecoGenSpecies sp = identifyParticle(particle); + MatchRecoGenSpecies sp; + if (recoIdMethod == recoIdMethods[0]) { + sp = kIdBfCharged; + } + if (recoIdMethod == recoIdMethods[1]) { + sp = identifyParticle(particle); + } if (sp != kWrongSpecies) { if (sp != kIdBfCharged) { /* fill the charged particle histograms */ @@ -1809,6 +1836,8 @@ void IdentifiedBfFilterTracks::fillTrackHistosAfterSelection(TrackObject const& fhPtA[sp]->Fill(track.pt()); fhdEdxA[sp]->Fill(track.p(), track.tpcSignal()); fhdEdxIPTPCA[sp]->Fill(track.tpcInnerParam(), track.tpcSignal()); + fhTrackTimeA[sp]->Fill(track.tpcInnerParam(), track.trackTime()); + fhTrackBetaA[sp]->Fill(track.tpcInnerParam(), track.trackTime() / track.length()); if (track.sign() > 0) { fhPtPosA[sp]->Fill(track.pt()); fhPtEtaPosA[sp]->Fill(track.pt(), track.eta()); diff --git a/PWGCF/TwoParticleCorrelations/Tasks/identifiedbf.cxx b/PWGCF/TwoParticleCorrelations/Tasks/identifiedbf.cxx index 8612613d216..7319f70d946 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/identifiedbf.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/identifiedbf.cxx @@ -280,6 +280,12 @@ struct IdentifiedbfTask { } else { fhN1VsZEtaPhiPtSecondary[track.trackacceptedid()]->Fill(zvtx, getEtaPhiIndex(track) + 0.5, track.pt(), corr); } + } else if constexpr (framework::has_type_v) { + if (isPrimaryCheck(track)) { + fhN1VsZEtaPhiPtPrimary[track.trackacceptedid()]->Fill(zvtx, getEtaPhiIndex(track) + 0.5, track.pt(), corr); + } else { + fhN1VsZEtaPhiPtSecondary[track.trackacceptedid()]->Fill(zvtx, getEtaPhiIndex(track) + 0.5, track.pt(), corr); + } } } From a966666877a979b185de29f456022261ff5c354c Mon Sep 17 00:00:00 2001 From: Ravindra Singh <56298081+1994ra@users.noreply.github.com> Date: Thu, 17 Apr 2025 22:39:13 +0200 Subject: [PATCH 1028/1650] [PWGHF] added table for DeltaY between Lc-hadrons (#10862) Co-authored-by: ALICE Action Bot --- PWGHF/HFC/DataModel/CorrelationTables.h | 4 +++- .../HFC/TableProducer/correlatorLcHadrons.cxx | 22 ++++++++++++++----- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/PWGHF/HFC/DataModel/CorrelationTables.h b/PWGHF/HFC/DataModel/CorrelationTables.h index 1602099abfa..0ffeeea8868 100644 --- a/PWGHF/HFC/DataModel/CorrelationTables.h +++ b/PWGHF/HFC/DataModel/CorrelationTables.h @@ -141,6 +141,7 @@ namespace hf_correlation_lc_hadron { DECLARE_SOA_COLUMN(DeltaPhi, deltaPhi, float); //! DeltaPhi between Lc and Hadrons DECLARE_SOA_COLUMN(DeltaEta, deltaEta, float); //! DeltaEta between Lc and Hadrons +DECLARE_SOA_COLUMN(DeltaY, deltaY, float); //! DeltaY between Lc and Hadrons DECLARE_SOA_COLUMN(PtLc, ptLc, float); //! Transverse momentum of Lc DECLARE_SOA_COLUMN(PtHadron, ptHadron, float); //! Transverse momentum of Hadron DECLARE_SOA_COLUMN(MLc, mLc, float); //! Invariant mass of Lc @@ -212,7 +213,8 @@ DECLARE_SOA_TABLE(TrkRecInfoLc, "AOD", "TRKRECINFOLC", //! Tracks Reconstructed aod::hf_correlation_lc_hadron::TrackDcaXY, aod::hf_correlation_lc_hadron::TrackDcaZ, aod::hf_correlation_lc_hadron::TrackTPCNClsCrossedRows); - +DECLARE_SOA_TABLE(LcHadronPairY, "AOD", "LCHPAIRY", //! Lc candidates Generated Information + aod::hf_correlation_lc_hadron::DeltaY); // definition of columns and tables for Ds-Hadron correlation pairs namespace hf_correlation_ds_hadron { diff --git a/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx b/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx index e2fd6908916..506f98073ef 100644 --- a/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx @@ -160,6 +160,7 @@ struct HfCorrelatorLcHadronsSelection { // Lc-Hadron correlation pair builder - for real data and data-like analysis (i.e. reco-level w/o matching request via Mc truth) struct HfCorrelatorLcHadrons { Produces entryLcHadronPair; + Produces entryLcHadronPairY; Produces entryLcHadronPairTrkPID; Produces entryLcHadronRecoInfo; Produces entryLcHadronMlInfo; @@ -209,6 +210,7 @@ struct HfCorrelatorLcHadrons { Service pdg; int leadingIndex = 0; bool correlationStatus = false; + static constexpr size_t nDaughters{3u}; TRandom3* rnd = new TRandom3(0); // Event Mixing for the Data Mode @@ -394,7 +396,7 @@ struct HfCorrelatorLcHadrons { outputMl[iclass] = candidate.mlProbLcToPKPi()[classMl->at(iclass)]; } entryLcCandRecoInfo(hfHelper.invMassLcToPKPi(candidate), candidate.pt() * chargeLc, outputMl[0], outputMl[1]); // 0: BkgBDTScore, 1:PromptBDTScore - entryLc(candidate.phi(), candidate.eta(), candidate.pt(), hfHelper.invMassLcToPKPi(candidate), poolBin, gCollisionId, timeStamp); + entryLc(candidate.phi(), candidate.eta(), candidate.pt() * chargeLc, hfHelper.invMassLcToPKPi(candidate), poolBin, gCollisionId, timeStamp); } if (candidate.isSelLcToPiKP() >= selectionFlagLc) { registry.fill(HIST("hMassLcVsPt"), hfHelper.invMassLcToPiKP(candidate), candidate.pt(), efficiencyWeightLc); @@ -405,7 +407,7 @@ struct HfCorrelatorLcHadrons { } entryLcCandRecoInfo(hfHelper.invMassLcToPiKP(candidate), candidate.pt() * chargeLc, outputMl[0], outputMl[1]); // 0: BkgBDTScore, 1:PromptBDTScore if (!skipMixedEventTableFilling) { - entryLc(candidate.phi(), candidate.eta(), candidate.pt(), hfHelper.invMassLcToPiKP(candidate), poolBin, gCollisionId, timeStamp); + entryLc(candidate.phi(), candidate.eta(), candidate.pt() * chargeLc, hfHelper.invMassLcToPiKP(candidate), poolBin, gCollisionId, timeStamp); } } @@ -438,6 +440,7 @@ struct HfCorrelatorLcHadrons { track.pt() * track.sign(), poolBin, correlationStatus); + entryLcHadronPairY(track.y() - hfHelper.yLc(candidate)); entryLcHadronRecoInfo(hfHelper.invMassLcToPKPi(candidate), false); entryLcHadronGenInfo(false, false, 0); entryLcHadronMlInfo(outputMl[0], outputMl[1]); @@ -453,6 +456,7 @@ struct HfCorrelatorLcHadrons { track.pt() * track.sign(), poolBin, correlationStatus); + entryLcHadronPairY(track.y() - hfHelper.yLc(candidate)); entryLcHadronRecoInfo(hfHelper.invMassLcToPiKP(candidate), false); entryLcHadronGenInfo(false, false, 0); entryLcHadronMlInfo(outputMl[0], outputMl[1]); @@ -689,6 +693,7 @@ struct HfCorrelatorLcHadrons { track.pt() * track.sign(), poolBin, correlationStatus); + entryLcHadronPairY(track.y() - hfHelper.yLc(candidate)); entryLcHadronRecoInfo(hfHelper.invMassLcToPKPi(candidate), isLcSignal); if (fillTrkPID) { entryLcHadronPairTrkPID(track.tpcNSigmaPr(), track.tpcNSigmaKa(), track.tpcNSigmaPi(), track.tofNSigmaPr(), track.tofNSigmaKa(), track.tofNSigmaPi()); @@ -718,6 +723,7 @@ struct HfCorrelatorLcHadrons { track.pt() * track.sign(), poolBin, correlationStatus); + entryLcHadronPairY(track.y() - hfHelper.yLc(candidate)); entryLcHadronRecoInfo(hfHelper.invMassLcToPiKP(candidate), isLcSignal); if (fillTrkPID) { entryLcHadronPairTrkPID(track.tpcNSigmaPr(), track.tpcNSigmaKa(), track.tpcNSigmaPi(), track.tofNSigmaPr(), track.tofNSigmaKa(), track.tofNSigmaPi()); @@ -794,12 +800,12 @@ struct HfCorrelatorLcHadrons { // prompt and non-prompt division std::vector listDaughters{}; - std::array arrDaughLcPDG = {kProton, -kKPlus, kPiPlus}; - std::array prongsId; + std::array arrDaughLcPDG = {kProton, -kKPlus, kPiPlus}; + std::array prongsId; listDaughters.clear(); RecoDecay::getDaughters(particle, &listDaughters, arrDaughLcPDG, 2); int counterDaughters = 0; - if (listDaughters.size() == 3) { + if (listDaughters.size() == nDaughters) { for (const auto& dauIdx : listDaughters) { auto daughI = mcParticles.rawIteratorAt(dauIdx - mcParticles.offset()); counterDaughters += 1; @@ -849,6 +855,7 @@ struct HfCorrelatorLcHadrons { particleAssoc.pt() * chargeAssoc / std::abs(chargeAssoc), poolBin, correlationStatus); + entryLcHadronPairY(particleAssoc.y() - yL); entryLcHadronRecoInfo(MassLambdaCPlus, true); entryLcHadronGenInfo(isLcPrompt, particleAssoc.isPhysicalPrimary(), trackOrigin); } // end inner loop @@ -889,6 +896,7 @@ struct HfCorrelatorLcHadrons { assocParticle.pt() * assocParticle.sign(), poolBin, correlationStatus); + entryLcHadronPairY(assocParticle.y() - hfHelper.yLc(trigLc)); entryLcHadronRecoInfo(hfHelper.invMassLcToPKPi(trigLc), false); entryLcHadronGenInfo(false, false, 0); if (fillTrkPID) { @@ -907,6 +915,7 @@ struct HfCorrelatorLcHadrons { assocParticle.pt() * assocParticle.sign(), poolBin, correlationStatus); + entryLcHadronPairY(assocParticle.y() - hfHelper.yLc(trigLc)); entryLcHadronRecoInfo(hfHelper.invMassLcToPiKP(trigLc), false); entryLcHadronGenInfo(false, false, 0); if (fillTrkPID) { @@ -1006,6 +1015,7 @@ struct HfCorrelatorLcHadrons { pAssoc.pt() * pAssoc.sign(), poolBin, correlationStatus); + entryLcHadronPairY(pAssoc.y() - hfHelper.yLc(candidate)); entryLcHadronRecoInfo(hfHelper.invMassLcToPKPi(candidate), isLcSignal); entryLcHadronGenInfo(isLcPrompt, isPhysicalPrimary, trackOrigin); if (fillTrkPID) { @@ -1024,6 +1034,7 @@ struct HfCorrelatorLcHadrons { pAssoc.pt() * pAssoc.sign(), poolBin, correlationStatus); + entryLcHadronPairY(pAssoc.y() - hfHelper.yLc(candidate)); entryLcHadronRecoInfo(hfHelper.invMassLcToPiKP(candidate), isLcSignal); entryLcHadronGenInfo(isLcPrompt, isPhysicalPrimary, trackOrigin); if (fillTrkPID) { @@ -1079,6 +1090,7 @@ struct HfCorrelatorLcHadrons { particleAssoc.pt() * chargeAssoc / std::abs(chargeAssoc), poolBin, correlationStatus); + entryLcHadronPairY(particleAssoc.y() - yL); entryLcHadronRecoInfo(MassLambdaCPlus, true); entryLcHadronGenInfo(isLcPrompt, particleAssoc.isPhysicalPrimary(), trackOrigin); } From cb39b83e641ec97c42792c11ff13ff21c0ce6e2f Mon Sep 17 00:00:00 2001 From: Victor Gonzalez Date: Thu, 17 Apr 2025 23:11:08 +0200 Subject: [PATCH 1029/1650] [PWGCF] DptDptQc - Proper initialization of pT bins of interest map (#10906) Co-authored-by: Victor --- .../Tasks/dptDptEfficiencyAndQc.cxx | 66 +++++++++++++------ 1 file changed, 47 insertions(+), 19 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx index 3b3f253edc0..1f835ca8db2 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx @@ -589,14 +589,32 @@ struct QAExtraDataCollectingEngine { // The QA output objects //=================================================== /* pairs histograms */ + constexpr static size_t kNoOfOverflowBins = 2; + constexpr static int kBinNotTracked = -1; std::vector>>> fhPhiPhiA{2, {nsp, {nsp, nullptr}}}; std::vector>>> fhEtaEtaA{2, {nsp, {nsp, nullptr}}}; std::vector>>> fhN2VsDeltaEtaVsDeltaPhi{2, {nsp, {nsp, nullptr}}}; TAxis ptAxis{analysis::dptdptfilter::ptbins, analysis::dptdptfilter::ptlow, analysis::dptdptfilter::ptup}; - std::vector ptOfInterestBinMap{analysis::dptdptfilter::ptbins + 1, -1}; + std::vector ptOfInterestBinMap; std::vector>>> fhInSectorDeltaPhiVsPhiPhiPerPtBinA{2, {nsp, {nsp, nullptr}}}; std::vector>>> fhInSectorDeltaPhiVsEtaEtaPerPtBinA{2, {nsp, {nsp, nullptr}}}; + QAExtraDataCollectingEngine() + { + using namespace efficiencyandqatask; + using namespace analysis::dptdptfilter; + + /* the mapping between pT bins of interest and internal representation, and histogram title to keep track of them offline */ + /* it is done once for both reco and gen */ + ptOfInterestBinMap = std::vector(static_cast(ptbins + kNoOfOverflowBins), kBinNotTracked); + LOGF(info, "Configuring the pT bins of interest on a map of length %d", ptOfInterestBinMap.size()); + for (size_t ix = 0; ix < ptBinsOfInterest.size(); ++ix) { + /* remember our internal axis starts in 0.5 value, i.e. its first central value is 1 */ + ptOfInterestBinMap[ptBinsOfInterest[ix]] = ix + 1; + LOGF(info, " Added pT bin %d as internal axis value %d", ptBinsOfInterest[ix], ptOfInterestBinMap[ptBinsOfInterest[ix]]); + } + } + template void init(HistogramRegistry& registry, const char* dirname) { @@ -611,20 +629,23 @@ struct QAExtraDataCollectingEngine { AxisSpec etaAxis = {etabins, etalow, etaup, "#eta"}; AxisSpec ptOfInterestAxis = {static_cast(ptBinsOfInterest.size()), 0.5f, static_cast(ptBinsOfInterest.size()) + 0.5f, "#it{p}_{T} (GeV/#it{c})"}; + /* the reconstructed and generated levels histograms */ + std::string recogen = (kindOfData == kReco) ? "Reco" : "Gen"; + /* the mapping between pT bins of interest and internal representation, and histogram title to keep track of them offline */ - LOGF(info, "Configuring the pT bins of interest"); + LOGF(info, "Configured at %s level the pT bins of interest on a map of length %d", recogen.c_str(), ptOfInterestBinMap.size()); std::string hPtRangesOfInterestTitle; - for (size_t ix = 0; ix < ptBinsOfInterest.size(); ++ix) { - TString ptRange = TString::Format("%s%.2f-%.2f", ix == 0 ? "" : ",", ptAxis.GetBinLowEdge(ptBinsOfInterest[ix]), ptAxis.GetBinUpEdge(ptBinsOfInterest[ix])); - /* remember our internal axis starts in 0.5 value, i.e. its first central value is 1 */ - ptOfInterestBinMap[ptBinsOfInterest[ix]] = ix + 1; - hPtRangesOfInterestTitle += ptRange.Data(); - LOGF(info, " Added pT bin %d as internal axis value %d", ptBinsOfInterest[ix], ix + 1); + bool firstRange = true; + for (size_t ix = 0; ix < ptOfInterestBinMap.size(); ++ix) { + if (ptOfInterestBinMap[ix] != kBinNotTracked) { + TString ptRange = TString::Format("%s%.2f-%.2f", firstRange ? "" : ",", ptAxis.GetBinLowEdge(ix), ptAxis.GetBinUpEdge(ix)); + hPtRangesOfInterestTitle += ptRange.Data(); + LOGF(info, " Tracking pT bin %d as internal axis value %d", ix, ptOfInterestBinMap[ix]); + firstRange = false; + } } LOGF(info, " Final pT bins tilte: %s", hPtRangesOfInterestTitle.c_str()); - /* the reconstructed and generated levels histograms */ - std::string recogen = (kindOfData == kReco) ? "Reco" : "Gen"; for (uint isp = 0; isp < nsp; ++isp) { for (uint jsp = 0; jsp < nsp; ++jsp) { fhPhiPhiA[kindOfData][isp][jsp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, recogen.c_str(), "After"), HNAMESTRING("PhiPhi_%s%s", tnames[isp].c_str(), tnames[jsp].c_str()), @@ -656,7 +677,7 @@ struct QAExtraDataCollectingEngine { return ptOfInterestBinMap[ptAxis.FindFixBin(track.pt())]; }; int ptBin1 = binForPt(track1); - if (ptBin1 > 0) { + if (ptBin1 != kBinNotTracked) { float inTpcSectorPhi1 = std::fmod(track1.phi(), kTpcPhiSectorWidth); for (auto const& track2 : tracks2) { /* checking the same track id condition */ @@ -665,7 +686,7 @@ struct QAExtraDataCollectingEngine { continue; } int ptBin2 = binForPt(track2); - if (ptBin2 > 0) { + if (ptBin2 != kBinNotTracked) { float deltaPhi = RecoDecay::constrainAngle(track1.phi() - track2.phi()); float deltaEta = track1.eta() - track2.eta(); float preWeight = 1 - std::abs(deltaEta) / deltaEtaSpan; @@ -862,6 +883,7 @@ struct PidExtraDataCollectingEngine { const AxisSpec dEdxAxis{200, 0.0, 200.0, "dE/dx (au)"}; AxisSpec pidPAxis{150, 0.1, 5.0, "#it{p} (GeV/#it{c})"}; pidPAxis.makeLogarithmic(); + constexpr int kEvenOddBase = 2; if constexpr (kindOfData == kReco) { /* PID histograms */ @@ -884,7 +906,7 @@ struct PidExtraDataCollectingEngine { kTProfile2D, {pidPAxis, {200, 0.0, 1.1, "#beta"}}); for (uint imainsp = 0; imainsp < nallmainsp; ++imainsp) { /* only the same charge makes any sense */ - if (isp % 2 == imainsp % 2) { + if (isp % kEvenOddBase == imainsp % kEvenOddBase) { fhIdTPCnSigmasVsP[isp][imainsp] = ADDHISTOGRAM(TH2, DIRECTORYSTRING("%s/%s/%s", dirname, "PID", "Selected"), HNAMESTRING("tpcNSigmasVsPSelected_%s_to%s", tnames[isp].c_str(), allmainspnames[imainsp].c_str()), HTITLESTRING("TPC n#sigma for selected %s to the %s line", tnames[isp].c_str(), allmainsptitles[imainsp].c_str()), @@ -1152,32 +1174,38 @@ struct DptDptEfficiencyAndQc { } /* in reverse order for proper order in results file */ for (uint i = 0; i < ncmranges; ++i) { - auto initializeCEInstance = [&](auto dce, auto name, auto& registry, bool genlevel) { + auto initializeCEInstance = [&](auto dce, auto name, auto& registry, bool reclevel, bool genlevel) { /* crete the output list for the passed centrality/multiplicity range */ /* init the data collection instance */ - dce->template init(registry, name.Data()); + if (reclevel) { + dce->template init(registry, name.Data()); + } if (genlevel) { dce->template init(registry, name.Data()); } }; auto buildQACEInstance = [&](float min, float max) { auto* dce = new QADataCollectingEngine(); - initializeCEInstance(dce, TString::Format("EfficiencyAndQaData-%d-%d", static_cast(min), static_cast(max)), *registryBank[i], doprocessGeneratorLevelNotStored); + initializeCEInstance(dce, TString::Format("EfficiencyAndQaData-%d-%d", static_cast(min), static_cast(max)), *registryBank[i], + doprocessReconstructedNotStored || doprocessDetectorLevelNotStored, doprocessGeneratorLevelNotStored); return dce; }; auto buildQACEExtraInstance = [&](float min, float max) { auto* dce = new QAExtraDataCollectingEngine(); - initializeCEInstance(dce, TString::Format("EfficiencyAndQaExtraData-%d-%d", static_cast(min), static_cast(max)), *extraRegistryBank[i], doprocessExtraGeneratorLevelNotStored); + initializeCEInstance(dce, TString::Format("EfficiencyAndQaExtraData-%d-%d", static_cast(min), static_cast(max)), *extraRegistryBank[i], + doprocessExtraReconstructedNotStored || doprocessExtraDetectorLevelNotStored, doprocessExtraGeneratorLevelNotStored); return dce; }; auto buildPidCEInstance = [&](float min, float max) { auto* dce = new PidDataCollectingEngine(); - initializeCEInstance(dce, TString::Format("EfficiencyAndPidData-%d-%d", static_cast(min), static_cast(max)), *pidRegistryBank[i], doprocessGeneratorLevelNotStored); + initializeCEInstance(dce, TString::Format("EfficiencyAndPidData-%d-%d", static_cast(min), static_cast(max)), *pidRegistryBank[i], + doprocessReconstructedNotStoredPID || doprocessDetectorLevelNotStoredPID || doprocessDetectorLevelNotStoredTunedOnDataPID, doprocessGeneratorLevelNotStored); return dce; }; auto buildPidExtraCEInstance = [&](float min, float max) { auto* dce = new PidExtraDataCollectingEngine(); - initializeCEInstance(dce, TString::Format("EfficiencyAndPidData-%d-%d", static_cast(min), static_cast(max)), *pidRegistryBank[i], doprocessGeneratorLevelNotStored); + initializeCEInstance(dce, TString::Format("EfficiencyAndPidData-%d-%d", static_cast(min), static_cast(max)), *pidRegistryBank[i], + doprocessReconstructedNotStoredPIDExtra || doprocessDetectorLevelNotStoredPIDExtra || doprocessDetectorLevelNotStoredTunedOnDataPIDExtra, doprocessGeneratorLevelNotStored); return dce; }; /* in reverse order for proper order in results file */ From c3f72174f220b12bcf6bc593bb1da4f61e2751ec Mon Sep 17 00:00:00 2001 From: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> Date: Fri, 18 Apr 2025 08:23:00 +0200 Subject: [PATCH 1030/1650] [PWGLF] Add RCTFlagsChecker in strangeness data model (#10889) --- PWGLF/DataModel/LFStrangenessTables.h | 39 ++++++++++- .../Strangeness/Converters/CMakeLists.txt | 5 ++ .../Converters/straevselsconverter5.cxx | 67 +++++++++++++++++++ .../Strangeness/strangederivedbuilder.cxx | 3 +- .../derivedlambdakzeroanalysis.cxx | 24 ++++++- 5 files changed, 135 insertions(+), 3 deletions(-) create mode 100644 PWGLF/TableProducer/Strangeness/Converters/straevselsconverter5.cxx diff --git a/PWGLF/DataModel/LFStrangenessTables.h b/PWGLF/DataModel/LFStrangenessTables.h index b89699cbd33..6d414cb325b 100644 --- a/PWGLF/DataModel/LFStrangenessTables.h +++ b/PWGLF/DataModel/LFStrangenessTables.h @@ -226,6 +226,43 @@ DECLARE_SOA_TABLE_VERSIONED(StraEvSels_004, "AOD", "STRAEVSELS", 4, //! // stracollision::EnergyCommonZNC, stracollision::IsUPC); +DECLARE_SOA_TABLE_VERSIONED(StraEvSels_005, "AOD", "STRAEVSELS", 5, //! debug information + evsel::Sel8, evsel::Selection, //! event selection: sel8 + mult::MultFT0A, mult::MultFT0C, mult::MultFV0A, // FIT detectors + mult::MultFDDA, mult::MultFDDC, + mult::MultNTracksPVeta1, // track multiplicities with eta cut for INEL>0 + mult::MultPVTotalContributors, // number of PV contribs total + mult::MultNTracksGlobal, // global track multiplicities + mult::MultNTracksITSTPC, // track multiplicities, PV contribs, no eta cut + mult::MultAllTracksTPCOnly, // TPConly track multiplicities, all, no eta cut + mult::MultAllTracksITSTPC, // ITSTPC track multiplicities, all, no eta cut + mult::MultZNA, mult::MultZNC, mult::MultZEM1, // ZDC signals + mult::MultZEM2, mult::MultZPA, mult::MultZPC, + evsel::NumTracksInTimeRange, // add occupancy in specified time interval by a number of tracks from nearby collisions + evsel::SumAmpFT0CInTimeRange, // add occupancy in specified time interval by a sum of FT0C amplitudes from nearby collisions + udcollision::GapSide, // UPC info: 0 for side A, 1 for side C, 2 for both sides, 3 neither A or C, 4 not enough or too many pv contributors + udcollision::TotalFT0AmplitudeA, // UPC info: re-assigned FT0-A amplitude, in case of SG event, from the most active bc + udcollision::TotalFT0AmplitudeC, // UPC info: re-assigned FT0-C amplitude, in case of SG event, from the most active bc + udcollision::TotalFV0AmplitudeA, // UPC info: re-assigned FV0-A amplitude, in case of SG event, from the most active bc + udcollision::TotalFDDAmplitudeA, // UPC info: re-assigned FDD-A amplitude, in case of SG event, from the most active bc + udcollision::TotalFDDAmplitudeC, // UPC info: re-assigned FDD-C amplitude, in case of SG event, from the most active bc + udzdc::EnergyCommonZNA, // UPC info: re-assigned ZN-A amplitude, in case of SG event, from the most active bc + udzdc::EnergyCommonZNC, // UPC info: re-assigned ZN-C amplitude, in case of SG event, from the most active bc + + collision::Flags, // Contains Vertex::Flags, with most notably the UPCMode to know whether the vertex has been found using UPC settings + evsel::Alias, // trigger aliases (e.g. kTVXinTRD for v2) + evsel::Rct, // Bitmask of RCT flags + + // Dynamic columns for manipulating information + // stracollision::TotalFV0AmplitudeA, + // stracollision::TotalFT0AmplitudeA, + // stracollision::TotalFT0AmplitudeC, + // stracollision::TotalFDDAmplitudeA, + // stracollision::TotalFDDAmplitudeC, + // stracollision::EnergyCommonZNA, + // stracollision::EnergyCommonZNC, + stracollision::IsUPC); + DECLARE_SOA_TABLE(StraEvSelsRun2, "AOD", "STRAEVSELSRUN2", //! debug information evsel::Sel8, evsel::Sel7, evsel::Selection, //! event selection: sel8 mult::MultFT0A, mult::MultFT0C, // FIT detectors @@ -266,7 +303,7 @@ DECLARE_SOA_TABLE_VERSIONED(StraStamps_001, "AOD", "STRASTAMPS", 1, //! informat using StraRawCents = StraRawCents_004; using StraCents = StraCents_001; -using StraEvSels = StraEvSels_004; +using StraEvSels = StraEvSels_005; using StraStamps = StraStamps_001; using StraCollision = StraCollisions::iterator; using StraCent = StraCents_001::iterator; diff --git a/PWGLF/TableProducer/Strangeness/Converters/CMakeLists.txt b/PWGLF/TableProducer/Strangeness/Converters/CMakeLists.txt index 146a1142982..3ba4fdb55b7 100644 --- a/PWGLF/TableProducer/Strangeness/Converters/CMakeLists.txt +++ b/PWGLF/TableProducer/Strangeness/Converters/CMakeLists.txt @@ -54,6 +54,11 @@ o2physics_add_dpl_workflow(straevselsconverter4 PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::ITStracking COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(straevselsconverter5 + SOURCES straevselsconverter5.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::ITStracking + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(straevselsconverter2rawcents SOURCES straevselsconverter2rawcents.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore diff --git a/PWGLF/TableProducer/Strangeness/Converters/straevselsconverter5.cxx b/PWGLF/TableProducer/Strangeness/Converters/straevselsconverter5.cxx new file mode 100644 index 00000000000..ab2962e36be --- /dev/null +++ b/PWGLF/TableProducer/Strangeness/Converters/straevselsconverter5.cxx @@ -0,0 +1,67 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "ITStracking/Vertexer.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" + +using namespace o2; +using namespace o2::framework; + +// Converts Stra Event selections from 004 to 005 +struct straevselsconverter5 { + Produces straEvSels_005; + + void process(aod::StraEvSels_004 const& straEvSels_004) + { + for (auto& values : straEvSels_004) { + straEvSels_005(values.sel8(), + values.selection_raw(), + values.multFT0A(), + values.multFT0C(), + values.multFT0A(), + 0 /*dummy FDDA value*/, + 0 /*dummy FDDC value*/, + values.multNTracksPVeta1(), + values.multPVTotalContributors(), + values.multNTracksGlobal(), + values.multNTracksITSTPC(), + values.multAllTracksTPCOnly(), + values.multAllTracksITSTPC(), + values.multZNA(), + values.multZNC(), + values.multZEM1(), + values.multZEM2(), + values.multZPA(), + values.multZPC(), + values.trackOccupancyInTimeRange(), + 0 /*dummy occupancy value*/, + values.gapSide(), + values.totalFT0AmplitudeA(), + values.totalFT0AmplitudeC(), + values.totalFV0AmplitudeA(), + values.totalFDDAmplitudeA(), + values.totalFDDAmplitudeC(), + values.energyCommonZNA(), + values.energyCommonZNC(), + values.flags(), + 0 /*dummy Alias value*/, + 0 /*dummy Rct value*/); + } + } +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc)}; +} diff --git a/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx index 297a6794a3b..09216aa166d 100644 --- a/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx @@ -516,7 +516,8 @@ struct strangederivedbuilder { energyCommonZNA, energyCommonZNC, // Collision flags collision.flags(), - collision.alias_raw()); + collision.alias_raw(), + collision.rct_raw()); } else { // We are in Run 2 strangeCentsRun2(collision.centRun2V0M(), collision.centRun2V0A(), collision.centRun2SPDTracklets(), collision.centRun2SPDClusters()); diff --git a/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx b/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx index 80c048e1214..55e618ac11a 100644 --- a/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx @@ -52,6 +52,7 @@ #include "CommonConstants/PhysicsConstants.h" #include "Common/Core/trackUtilities.h" #include "Common/CCDB/ctpRateFetcher.h" +#include "Common/DataModel/EventSelection.h" #include "PWGLF/DataModel/LFStrangenessTables.h" #include "PWGLF/DataModel/LFStrangenessMLTables.h" #include "PWGLF/DataModel/LFStrangenessPIDTables.h" @@ -70,6 +71,8 @@ using namespace o2::framework; using namespace o2::framework::expressions; using std::array; +using namespace o2::aod::rctsel; + using DauTracks = soa::Join; using DauMCTracks = soa::Join; using V0Candidates = soa::Join; @@ -202,6 +205,15 @@ struct derivedlambdakzeroanalysis { Configurable doTreatPiToMuon{"doTreatPiToMuon", false, "Take pi decay into muon into account in MC"}; Configurable doCollisionAssociationQA{"doCollisionAssociationQA", true, "check collision association"}; + struct : ConfigurableGroup { + std::string prefix = "rctConfigurations"; // JSON group name + Configurable cfgRCTLabel{"cfgRCTLabel", "", "Which detector condition requirements? (CBT, CBT_hadronPID, CBT_electronPID, CBT_calo, CBT_muon, CBT_muon_glo)"}; + Configurable cfgCheckZDC{"cfgCheckZDC", false, "Include ZDC flags in the bit selection (for Pb-Pb only)"}; + Configurable cfgTreatLimitedAcceptanceAsBad{"cfgTreatLimitedAcceptanceAsBad", false, "reject all events where the detectors relevant for the specified Runlist are flagged as LimitedAcceptance"}; + } rctConfigurations; + + RCTFlagsChecker rctFlagsChecker{rctConfigurations.cfgRCTLabel.value}; + // Machine learning evaluation for pre-selection and corresponding information generation o2::ml::OnnxModel mlCustomModelK0Short; o2::ml::OnnxModel mlCustomModelLambda; @@ -538,8 +550,11 @@ struct derivedlambdakzeroanalysis { secondaryMaskSelectionLambda = maskTopological | maskTrackProperties | maskLambdaSpecific; secondaryMaskSelectionAntiLambda = maskTopological | maskTrackProperties | maskAntiLambdaSpecific; + // Initialise the RCTFlagsChecker + rctFlagsChecker.init(rctConfigurations.cfgRCTLabel.value, rctConfigurations.cfgCheckZDC, rctConfigurations.cfgTreatLimitedAcceptanceAsBad); + // Event Counters - histos.add("hEventSelection", "hEventSelection", kTH1F, {{20, -0.5f, +19.5f}}); + histos.add("hEventSelection", "hEventSelection", kTH1F, {{21, -0.5f, +20.5f}}); if (isRun3) { histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(1, "All collisions"); histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(2, "sel8 cut"); @@ -566,6 +581,7 @@ struct derivedlambdakzeroanalysis { } histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(19, "Below min IR"); histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(20, "Above max IR"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(21, "RCT flags"); } else { histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(1, "All collisions"); histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(2, "sel8 cut"); @@ -1838,6 +1854,12 @@ struct derivedlambdakzeroanalysis { if (fillHists) histos.fill(HIST("hEventSelection"), 19 /* Above max IR */); + if (!rctConfigurations.cfgRCTLabel.value.empty() && !rctFlagsChecker(collision)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 20 /* Pass CBT condition */); + } else { // we are in Run 2 if (eventSelections.requireSel8 && !collision.sel8()) { return false; From 59a47bbbd04975a66ae929fac0e1987bc820c821 Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Fri, 18 Apr 2025 09:38:23 +0200 Subject: [PATCH 1031/1650] [PWGLF] Protect against accidental acceptance of TPC-only V0s (#10908) Co-authored-by: David Dobrigkeit Chinellato Co-authored-by: ALICE Builder --- .../Strangeness/strangenessbuilder.cxx | 4 ++-- PWGLF/Utils/strangenessBuilderHelper.h | 13 +++++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx index 74c36988ce1..553a0f74e36 100644 --- a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx @@ -818,7 +818,7 @@ struct StrangenessBuilder { // process candidate with helper, generate properties for consulting // : do not apply selections: do as much as possible to preserve // candidate at this level and do not select with topo selections - if (straHelper.buildV0Candidate(v0tableGrouped[iV0].collisionIds[ic], collision.posX(), collision.posY(), collision.posZ(), pTrack, nTrack, posTrackPar, negTrackPar, true, false)) { + if (straHelper.buildV0Candidate(v0tableGrouped[iV0].collisionIds[ic], collision.posX(), collision.posY(), collision.posZ(), pTrack, nTrack, posTrackPar, negTrackPar, true, false, true)) { // candidate built, check pointing angle if (straHelper.v0.pointingAngle < bestPointingAngle) { bestPointingAngle = straHelper.v0.pointingAngle; @@ -1294,7 +1294,7 @@ struct StrangenessBuilder { } } - if (!straHelper.buildV0Candidate(v0.collisionId, pvX, pvY, pvZ, posTrack, negTrack, posTrackPar, negTrackPar, v0.isCollinearV0, mEnabledTables[kV0Covs])) { + if (!straHelper.buildV0Candidate(v0.collisionId, pvX, pvY, pvZ, posTrack, negTrack, posTrackPar, negTrackPar, v0.isCollinearV0, mEnabledTables[kV0Covs], true)) { products.v0dataLink(-1, -1); continue; } diff --git a/PWGLF/Utils/strangenessBuilderHelper.h b/PWGLF/Utils/strangenessBuilderHelper.h index bcddc01aedd..ed92bf4f0b1 100644 --- a/PWGLF/Utils/strangenessBuilderHelper.h +++ b/PWGLF/Utils/strangenessBuilderHelper.h @@ -272,7 +272,8 @@ class strangenessBuilderHelper TTrackParametrization& positiveTrackParam, TTrackParametrization& negativeTrackParam, bool useCollinearFit = false, - bool calculateCovariance = false) + bool calculateCovariance = false, + bool acceptTPCOnly = false) { if constexpr (useSelections) { // verify track quality @@ -293,6 +294,14 @@ class strangenessBuilderHelper v0 = {}; return false; } + if (!acceptTPCOnly && !positiveTrack.hasITS()) { + v0 = {}; + return false; + } + if (!acceptTPCOnly && !negativeTrack.hasITS()) { + v0 = {}; + return false; + } } // Calculate DCA with respect to the collision associated to the V0 @@ -624,7 +633,7 @@ class strangenessBuilderHelper auto posTrackPar = getTrackParCov(positiveTrack); auto negTrackPar = getTrackParCov(negativeTrack); - if (!buildV0Candidate(collisionIndex, pvX, pvY, pvZ, positiveTrack, negativeTrack, posTrackPar, negTrackPar, false, processCovariances)) { + if (!buildV0Candidate(collisionIndex, pvX, pvY, pvZ, positiveTrack, negativeTrack, posTrackPar, negTrackPar, false, processCovariances, false)) { return false; } if (!buildCascadeCandidate(collisionIndex, pvX, pvY, pvZ, v0, positiveTrack, negativeTrack, bachelorTrack, calculateBachelorBaryonVariables, useCascadeMomentumAtPV, processCovariances)) { From 4f3f3b5d588c0e9cecdb595824f73339636cc930 Mon Sep 17 00:00:00 2001 From: Chiara De Martin <39315597+ChiaraDeMartin95@users.noreply.github.com> Date: Fri, 18 Apr 2025 10:18:53 +0200 Subject: [PATCH 1032/1650] [PWGLF,Trigger] Fix bug in cascade building via strangeness helper (#10904) Co-authored-by: Chiara De Martin --- EventFiltering/PWGLF/strangenessFilter.cxx | 40 ++++++++++++++++++---- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/EventFiltering/PWGLF/strangenessFilter.cxx b/EventFiltering/PWGLF/strangenessFilter.cxx index 59f7f89c14b..ef311a4a221 100644 --- a/EventFiltering/PWGLF/strangenessFilter.cxx +++ b/EventFiltering/PWGLF/strangenessFilter.cxx @@ -225,7 +225,7 @@ struct strangenessFilter { hProcessedEvents->GetXaxis()->SetBinLabel(16, aod::filtering::OmegaXi::columnLabel()); hCandidate->GetXaxis()->SetBinLabel(1, "All"); - hCandidate->GetXaxis()->SetBinLabel(2, "Has_V0"); + hCandidate->GetXaxis()->SetBinLabel(2, "PassBuilderSel"); hCandidate->GetXaxis()->SetBinLabel(3, "DCA_meson"); hCandidate->GetXaxis()->SetBinLabel(4, "DCA_baryon"); hCandidate->GetXaxis()->SetBinLabel(5, "TPCNsigma_pion"); @@ -243,6 +243,7 @@ struct strangenessFilter { hCandidate->GetXaxis()->SetBinLabel(17, "CascCosPA"); hCandidate->GetXaxis()->SetBinLabel(18, "DCAV0ToPV"); hCandidate->GetXaxis()->SetBinLabel(19, "ProperLifeTime"); + hCandidate->GetXaxis()->SetBinLabel(20, "Rapidity"); std::vector centBinning = {0., 1., 5., 10., 20., 30., 40., 50., 70., 100.}; AxisSpec multAxisNTPV = {100, 0.0f, 100.0f, "N. tracks PV estimator"}; @@ -419,6 +420,7 @@ struct strangenessFilter { mDCAFitter.setMinParamChange(minParamChange); mDCAFitter.setMinRelChi2Change(minRelChi2Change); mDCAFitter.setUseAbsDCA(useAbsDCA); + mStraHelper.fitter.setBz(mBz); } if (!mStraHelper.lut) { /// done only once ccdb->setURL(ccdbUrl); @@ -667,13 +669,18 @@ struct strangenessFilter { } hCandidate->Fill(5.5); } - hCandidate->Fill(7.5); + hCandidate->Fill(6.5); // OLD: eta dau (selection now applied in strangeness helper) + hCandidate->Fill(7.5); // OLD: bachtopv (selection now applied in strangeness helper) // not striclty needed as selection are applied beforehand - just as QA (no change in number expected) if (Cascv0radius < v0radius) { continue; } hCandidate->Fill(8.5); + if (Casccascradius < cascradius) { + continue; + } + hCandidate->Fill(9.5); if (v0DauCPA < v0cospa) { continue; } @@ -682,7 +689,14 @@ struct strangenessFilter { continue; } hCandidate->Fill(11.5); - + if (mStraHelper.cascade.cascadeDaughterDCA > dcacascdau) { + continue; + } + hCandidate->Fill(12.5); + if (std::fabs(LambdaMass - constants::physics::MassLambda) > masslambdalimit) { + continue; + } + hCandidate->Fill(13.5); if (std::fabs(etaCasc) > eta) { continue; } @@ -695,6 +709,20 @@ struct strangenessFilter { } hCandidate->Fill(15.5); + // Fill selections QA for Xi + if (cascCPA > casccospaxi) { + hCandidate->Fill(16.5); + if (cascCPA > dcav0topv) { + hCandidate->Fill(17.5); + if (xiproperlifetime < properlifetimefactor * ctauxi) { + hCandidate->Fill(18.5); + if (std::fabs(yXi) < rapidity) { + hCandidate->Fill(19.5); + } + } + } + } + const auto deltaMassXi = useSigmaBasedMassCutXi ? getMassWindow(stfilter::species::Xi, ptCasc) : ximasswindow; const auto deltaMassOmega = useSigmaBasedMassCutOmega ? getMassWindow(stfilter::species::Omega, ptCasc) : omegamasswindow; @@ -740,9 +768,9 @@ struct strangenessFilter { QAHistosTopologicalVariables.fill(HIST("hDCAV0ToPVXi"), DCAV0ToPV); QAHistosTopologicalVariables.fill(HIST("hDCAV0DaughtersXi"), mStraHelper.cascade.v0DaughterDCA); QAHistosTopologicalVariables.fill(HIST("hDCACascDaughtersXi"), mStraHelper.cascade.cascadeDaughterDCA); - QAHistosTopologicalVariables.fill(HIST("hDCABachToPVXi"), mStraHelper.cascade.bachelorDCAxy); - QAHistosTopologicalVariables.fill(HIST("hDCAPosToPVXi"), mStraHelper.cascade.positiveDCAxy); - QAHistosTopologicalVariables.fill(HIST("hDCANegToPVXi"), mStraHelper.cascade.negativeDCAxy); + QAHistosTopologicalVariables.fill(HIST("hDCABachToPVXi"), std::fabs(mStraHelper.cascade.bachelorDCAxy)); + QAHistosTopologicalVariables.fill(HIST("hDCAPosToPVXi"), std::fabs(mStraHelper.cascade.positiveDCAxy)); + QAHistosTopologicalVariables.fill(HIST("hDCANegToPVXi"), std::fabs(mStraHelper.cascade.negativeDCAxy)); QAHistosTopologicalVariables.fill(HIST("hInvMassLambdaXi"), LambdaMass); if (doextraQA) { From 1812bd6e4673c0d9db3c9741c96c9d3ab24a3306 Mon Sep 17 00:00:00 2001 From: Marcello Di Costanzo <96481191+Marcellocosti@users.noreply.github.com> Date: Fri, 18 Apr 2025 12:18:11 +0200 Subject: [PATCH 1033/1650] [PWGHF] Added centrality to D+ tree tables (#10876) Co-authored-by: ALICE Action Bot --- .../TableProducer/treeCreatorDplusToPiKPi.cxx | 152 ++++++++++++++++-- 1 file changed, 140 insertions(+), 12 deletions(-) diff --git a/PWGHF/TableProducer/treeCreatorDplusToPiKPi.cxx b/PWGHF/TableProducer/treeCreatorDplusToPiKPi.cxx index b75aa3a4a3c..8a8705cacce 100644 --- a/PWGHF/TableProducer/treeCreatorDplusToPiKPi.cxx +++ b/PWGHF/TableProducer/treeCreatorDplusToPiKPi.cxx @@ -16,17 +16,21 @@ /// /// \author Alexandre Bigot , IPHC Strasbourg +#include + #include "CommonConstants/PhysicsConstants.h" #include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/CentralityEstimation.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; +using namespace o2::hf_centrality; namespace o2::aod { @@ -50,6 +54,7 @@ DECLARE_SOA_COLUMN(Y, y, float); DECLARE_SOA_COLUMN(Eta, eta, float); //! Pseudorapidity of candidate DECLARE_SOA_COLUMN(Phi, phi, float); //! Azimuth angle of candidate DECLARE_SOA_COLUMN(E, e, float); //! Energy of candidate (GeV) +DECLARE_SOA_COLUMN(Centrality, centrality, float); //! Collision centrality DECLARE_SOA_COLUMN(NSigTpcPi0, nSigTpcPi0, float); //! TPC Nsigma separation for prong0 with pion mass hypothesis DECLARE_SOA_COLUMN(NSigTpcKa0, nSigTpcKa0, float); //! TPC Nsigma separation for prong0 with kaon mass hypothesis DECLARE_SOA_COLUMN(NSigTofPi0, nSigTofPi0, float); //! TOF Nsigma separation for prong0 with pion mass hypothesis @@ -129,6 +134,7 @@ DECLARE_SOA_TABLE(HfCandDpLites, "AOD", "HFCANDDPLITE", full::Eta, full::Phi, full::Y, + full::Centrality, hf_cand_3prong::FlagMcMatchRec, hf_cand_3prong::OriginMcRec, hf_cand_3prong::FlagMcDecayChanRec) @@ -210,6 +216,7 @@ DECLARE_SOA_TABLE(HfCandDpFulls, "AOD", "HFCANDDPFULL", full::Phi, full::Y, full::E, + full::Centrality, hf_cand_3prong::FlagMcMatchRec, hf_cand_3prong::OriginMcRec, hf_cand_3prong::FlagMcDecayChanRec); @@ -249,7 +256,8 @@ struct HfTreeCreatorDplusToPiKPi { Configurable fillOnlyBackground{"fillOnlyBackground", false, "Flag to fill derived tables with background for ML trainings"}; Configurable downSampleBkgFactor{"downSampleBkgFactor", 1., "Fraction of background candidates to keep for ML trainings"}; Configurable ptMaxForDownSample{"ptMaxForDownSample", 10., "Maximum pt for the application of the downsampling factor"}; - Configurable> classMl{"classMlindexes", {0, 2}, "Indexes of ML bkg and non-prompt scores."}; + Configurable> classMlIndexes{"classMlIndexes", {0, 2}, "Indexes of ML bkg and non-prompt scores."}; + Configurable centEstimator{"centEstimator", 0, "Centrality estimation (None: 0, FT0C: 2, FT0M: 3)"}; HfHelper hfHelper; @@ -258,6 +266,8 @@ struct HfTreeCreatorDplusToPiKPi { using SelectedCandidatesMcWithMl = soa::Filtered>; using TracksWPid = soa::Join; + using CollisionsCent = soa::Join; + Filter filterSelectCandidates = aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlagDplus; Filter filterMcGenMatching = nabs(o2::aod::hf_cand_3prong::flagMcMatchGen) == static_cast(BIT(aod::hf_cand_3prong::DecayType::DplusToPiKPi)); @@ -282,7 +292,7 @@ struct HfTreeCreatorDplusToPiKPi { runNumber); } - template + template void fillCandidateTable(const T& candidate) { int8_t flagMc = 0; @@ -296,8 +306,8 @@ struct HfTreeCreatorDplusToPiKPi { std::vector outputMl = {-999., -999.}; if constexpr (doMl) { - for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { - outputMl[iclass] = candidate.mlProbDplusToPiKPi()[classMl->at(iclass)]; + for (unsigned int iclass = 0; iclass < classMlIndexes->size(); iclass++) { + outputMl[iclass] = candidate.mlProbDplusToPiKPi()[classMlIndexes->at(iclass)]; } rowCandidateMl( outputMl[0], @@ -308,6 +318,12 @@ struct HfTreeCreatorDplusToPiKPi { auto prong1 = candidate.template prong1_as(); auto prong2 = candidate.template prong2_as(); + float cent{-1.}; + auto coll = candidate.template collision_as(); + if (std::is_same_v && centEstimator != CentralityEstimator::None) { + cent = getCentralityColl(coll, centEstimator); + } + if (fillCandidateLiteTable) { rowCandidateLite( candidate.chi2PCA(), @@ -351,13 +367,14 @@ struct HfTreeCreatorDplusToPiKPi { candidate.eta(), candidate.phi(), hfHelper.yDplus(candidate), + cent, flagMc, originMc, channelMc); } else { rowCandidateFull( - candidate.collision().bcId(), - candidate.collision().numContrib(), + coll.bcId(), + coll.numContrib(), candidate.posX(), candidate.posY(), candidate.posZ(), @@ -432,6 +449,7 @@ struct HfTreeCreatorDplusToPiKPi { candidate.phi(), hfHelper.yDplus(candidate), hfHelper.eDplus(candidate), + cent, flagMc, originMc, channelMc); @@ -461,7 +479,7 @@ struct HfTreeCreatorDplusToPiKPi { continue; } } - fillCandidateTable(candidate); + fillCandidateTable(candidate); } } @@ -488,7 +506,7 @@ struct HfTreeCreatorDplusToPiKPi { rowCandidateFull.reserve(reconstructedCandSig.size()); } for (const auto& candidate : reconstructedCandSig) { - fillCandidateTable(candidate); + fillCandidateTable(candidate); } } else if (fillOnlySignalMl) { rowCandidateMl.reserve(reconstructedCandSigMl.size()); @@ -499,12 +517,12 @@ struct HfTreeCreatorDplusToPiKPi { } for (const auto& candidate : reconstructedCandSigMl) { if (downSampleBkgFactor < 1.) { - float pseudoRndm = candidate.ptProng0() * 1000. - (int64_t)(candidate.ptProng0() * 1000); + float pseudoRndm = candidate.ptProng0() * 1000. - static_cast(candidate.ptProng0() * 1000); if (candidate.pt() < ptMaxForDownSample && pseudoRndm >= downSampleBkgFactor) { continue; } } - fillCandidateTable(candidate); + fillCandidateTable(candidate); } } else if (fillOnlyBackground) { if (fillCandidateLiteTable) { @@ -519,7 +537,7 @@ struct HfTreeCreatorDplusToPiKPi { continue; } } - fillCandidateTable(candidate); + fillCandidateTable(candidate); } } else { if (fillCandidateLiteTable) { @@ -528,7 +546,7 @@ struct HfTreeCreatorDplusToPiKPi { rowCandidateFull.reserve(candidates.size()); } for (const auto& candidate : candidates) { - fillCandidateTable(candidate); + fillCandidateTable(candidate); } } @@ -547,6 +565,116 @@ struct HfTreeCreatorDplusToPiKPi { } PROCESS_SWITCH(HfTreeCreatorDplusToPiKPi, processMc, "Process MC", false); + + void processDataWCent(CollisionsCent const& collisions, + soa::Filtered> const& candidates, + TracksWPid const&) + { + // Filling event properties + rowCandidateFullEvents.reserve(collisions.size()); + for (const auto& collision : collisions) { + fillEvent(collision, 0, 1); + } + + // Filling candidate properties + if (fillCandidateLiteTable) { + rowCandidateLite.reserve(candidates.size()); + } else { + rowCandidateFull.reserve(candidates.size()); + } + for (const auto& candidate : candidates) { + if (downSampleBkgFactor < 1.) { + float pseudoRndm = candidate.ptProng0() * 1000. - static_cast(candidate.ptProng0() * 1000); + if (candidate.pt() < ptMaxForDownSample && pseudoRndm >= downSampleBkgFactor) { + continue; + } + } + fillCandidateTable(candidate); + } + } + + PROCESS_SWITCH(HfTreeCreatorDplusToPiKPi, processDataWCent, "Process data with cent", false); + + void processMcWCent(CollisionsCent const& collisions, + aod::McCollisions const&, + SelectedCandidatesMc const& candidates, + MatchedGenCandidatesMc const& particles, + SelectedCandidatesMcWithMl const&, + TracksWPid const&) + { + // Filling event properties + rowCandidateFullEvents.reserve(collisions.size()); + for (const auto& collision : collisions) { + fillEvent(collision, 0, 1); + } + + // Filling candidate properties + if (fillOnlySignal) { + if (fillCandidateLiteTable) { + rowCandidateLite.reserve(reconstructedCandSig.size()); + } else { + rowCandidateFull.reserve(reconstructedCandSig.size()); + } + for (const auto& candidate : reconstructedCandSig) { + fillCandidateTable(candidate); + } + } else if (fillOnlySignalMl) { + rowCandidateMl.reserve(reconstructedCandSigMl.size()); + if (fillCandidateLiteTable) { + rowCandidateLite.reserve(reconstructedCandSigMl.size()); + } else { + rowCandidateFull.reserve(reconstructedCandSigMl.size()); + } + for (const auto& candidate : reconstructedCandSigMl) { + if (downSampleBkgFactor < 1.) { + float pseudoRndm = candidate.ptProng0() * 1000. - static_cast(candidate.ptProng0() * 1000); + if (candidate.pt() < ptMaxForDownSample && pseudoRndm >= downSampleBkgFactor) { + continue; + } + } + fillCandidateTable(candidate); + } + } else if (fillOnlyBackground) { + if (fillCandidateLiteTable) { + rowCandidateLite.reserve(reconstructedCandBkg.size()); + } else { + rowCandidateFull.reserve(reconstructedCandBkg.size()); + } + for (const auto& candidate : reconstructedCandBkg) { + if (downSampleBkgFactor < 1.) { + float pseudoRndm = candidate.ptProng0() * 1000. - static_cast(candidate.ptProng0() * 1000); + if (candidate.pt() < ptMaxForDownSample && pseudoRndm >= downSampleBkgFactor) { + continue; + } + } + fillCandidateTable(candidate); + } + } else { + if (fillCandidateLiteTable) { + rowCandidateLite.reserve(candidates.size()); + } else { + rowCandidateFull.reserve(candidates.size()); + } + for (const auto& candidate : candidates) { + fillCandidateTable(candidate); + } + } + + // Filling particle properties + rowCandidateFullParticles.reserve(particles.size()); + for (const auto& particle : particles) { + rowCandidateFullParticles( + particle.mcCollision().bcId(), + particle.pt(), + particle.eta(), + particle.phi(), + RecoDecay::y(particle.pVector(), o2::constants::physics::MassDPlus), + particle.flagMcMatchGen(), + particle.originMcGen()); + } + } + + PROCESS_SWITCH(HfTreeCreatorDplusToPiKPi, processMcWCent, "Process MC with cent", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 44e0d66c0b58dbd16bbc6cefb383843c1d2e022d Mon Sep 17 00:00:00 2001 From: prottayCMT <61418725+prottayCMT@users.noreply.github.com> Date: Fri, 18 Apr 2025 12:38:35 +0200 Subject: [PATCH 1034/1650] [PWGLF] removed the zdc information (#10896) Co-authored-by: Prottay Das --- PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx index e929c4f0623..666296c1d90 100644 --- a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx +++ b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx @@ -281,7 +281,7 @@ struct LfTaskLambdaSpinCorr { Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; Filter centralityFilter = (nabs(aod::cent::centFT0C) < cfgCutCentralityMax && nabs(aod::cent::centFT0C) > cfgCutCentralityMin); - using EventCandidates = soa::Filtered>; + using EventCandidates = soa::Filtered>; using AllTrackCandidates = soa::Join; using ResoV0s = aod::V0Datas; @@ -292,9 +292,6 @@ struct LfTaskLambdaSpinCorr { return; } auto centrality = collision.centFT0C(); - if (!collision.triggereventsp()) { - return; - } if (additionalEvSel && (!collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { return; From bb807ae68cec8dff8c6153bd6f993c314acbd26c Mon Sep 17 00:00:00 2001 From: Fabrizio Chinu <91954233+fchinu@users.noreply.github.com> Date: Fri, 18 Apr 2025 13:25:21 +0200 Subject: [PATCH 1035/1650] [PWGHF] Add event and track selections to PID studies task (#10909) --- PWGHF/Tasks/CMakeLists.txt | 2 +- PWGHF/Tasks/taskPidStudies.cxx | 149 ++++++++++++++++++++++++++++----- 2 files changed, 130 insertions(+), 21 deletions(-) diff --git a/PWGHF/Tasks/CMakeLists.txt b/PWGHF/Tasks/CMakeLists.txt index 9a46eeba773..658988d070a 100644 --- a/PWGHF/Tasks/CMakeLists.txt +++ b/PWGHF/Tasks/CMakeLists.txt @@ -46,7 +46,7 @@ o2physics_add_dpl_workflow(task-multiplicity-estimator-correlation o2physics_add_dpl_workflow(task-pid-studies SOURCES taskPidStudies.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::EventFilteringUtils COMPONENT_NAME Analysis) # o2physics_add_dpl_workflow(task-sel-optimisation diff --git a/PWGHF/Tasks/taskPidStudies.cxx b/PWGHF/Tasks/taskPidStudies.cxx index ca9947202d0..55e3bef23ac 100644 --- a/PWGHF/Tasks/taskPidStudies.cxx +++ b/PWGHF/Tasks/taskPidStudies.cxx @@ -17,10 +17,14 @@ /// \author Marcello Di Costanzo , Politecnico and INFN Torino /// \author Luca Aglietta , Università and INFN Torino +#include + #include "TPDGCode.h" +#include "CCDB/BasicCCDBManager.h" #include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" +#include "Framework/HistogramRegistry.h" #include "Common/DataModel/PIDResponse.h" #include "Common/DataModel/Centrality.h" @@ -29,10 +33,14 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "PWGLF/DataModel/LFStrangenessTables.h" #include "PWGLF/DataModel/LFStrangenessPIDTables.h" +#include "PWGHF/Utils/utilsEvSelHf.h" +#include "PWGHF/Core/CentralityEstimation.h" using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; +using namespace o2::hf_evsel; +using namespace o2::hf_centrality; namespace o2::aod { @@ -83,6 +91,12 @@ DECLARE_SOA_COLUMN(OccupancyIts, occupancyIts, float); //! Occupancy from IT DECLARE_SOA_COLUMN(CentralityFT0C, centralityFT0C, float); //! Centrality from FT0C DECLARE_SOA_COLUMN(CentralityFT0M, centralityFT0M, float); //! Centrality from FT0M DECLARE_SOA_COLUMN(CandFlag, candFlag, int); //! Flag for MC matching + +const int minTpcNClsCrossedRows = 70; // Minimum number of crossed rows in TPC +const float maxEta = 0.8; // Maximum pseudorapidity +const float minPt = 0.1; // Minimum transverse momentum +const float maxTpcChi2NCl = 4; // Maximum TPC chi2 per number of TPC clusters +const float maxItsChi2NCl = 36; // Maximum ITS chi2 per number of ITS clusters } // namespace pid_studies DECLARE_SOA_TABLE(PidV0s, "AOD", "PIDV0S", //! Table with PID information @@ -139,6 +153,8 @@ struct HfTaskPidStudies { Produces pidV0; Produces pidCascade; + Configurable applyEvSels{"applyEvSels", true, "Apply event selections"}; + Configurable applyTrackSels{"applyTrackSels", true, "Apply track selections"}; Configurable massK0Min{"massK0Min", 0.4, "Minimum mass for K0"}; Configurable massK0Max{"massK0Max", 0.6, "Maximum mass for K0"}; Configurable massLambdaMin{"massLambdaMin", 1.0, "Minimum mass for lambda"}; @@ -154,22 +170,34 @@ struct HfTaskPidStudies { Configurable qtArmenterosMaxForLambda{"qtArmenterosMaxForLambda", 0.12, "Minimum Armenteros' qt for (anti)Lambda"}; Configurable downSampleBkgFactor{"downSampleBkgFactor", 1., "Fraction of candidates to keep"}; Configurable ptMaxForDownSample{"ptMaxForDownSample", 10., "Maximum pt for the application of the downsampling factor"}; + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; using PidTracks = soa::Join; using CollSels = soa::Join; + using CollisionsMc = soa::Join; using V0sMcRec = soa::Join; using CascsMcRec = soa::Join; + HfEventSelection hfEvSel; + HfEventSelectionMc hfEvSelMc; + + o2::framework::Service ccdb; + HistogramRegistry registry{"registry", {}}; + void init(InitContext&) { if ((doprocessV0Mc && doprocessV0Data) || (doprocessCascMc && doprocessCascData)) { LOGP(fatal, "Both data and MC process functions were enabled! Please check your configuration!"); } + ccdb->setURL(ccdbUrl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + hfEvSel.addHistograms(registry); } - template + template void fillTree(Cand const& candidate, const int flag) { float pseudoRndm = candidate.pt() * 1000. - static_cast(candidate.pt() * 1000); @@ -177,7 +205,7 @@ struct HfTaskPidStudies { return; } - const auto& coll = candidate.template collision_as(); + const auto& coll = candidate.template collision_as(); if constexpr (isV0) { const auto& posTrack = candidate.template posTrack_as(); const auto& negTrack = candidate.template negTrack_as(); @@ -274,6 +302,57 @@ struct HfTaskPidStudies { return aod::pid_studies::Particle::NotMatched; } + template + bool isCollSelected(const Coll& coll) + { + float cent{-1.f}; + const auto rejectionMask = hfEvSel.getHfCollisionRejectionMask(coll, cent, ccdb, registry); + /// monitor the satisfied event selections + hfEvSel.fillHistograms(coll, rejectionMask, cent); + return rejectionMask == 0; + } + + template + bool isTrackSelected(const T1& candidate) + { + const auto& posTrack = candidate.template posTrack_as(); + const auto& negTrack = candidate.template negTrack_as(); + if (posTrack.tpcNClsCrossedRows() < o2::aod::pid_studies::minTpcNClsCrossedRows || negTrack.tpcNClsCrossedRows() < o2::aod::pid_studies::minTpcNClsCrossedRows) { + return false; + } + if (std::abs(posTrack.eta()) > o2::aod::pid_studies::maxEta || std::abs(negTrack.eta()) > o2::aod::pid_studies::maxEta) { + return false; + } + if (posTrack.pt() < o2::aod::pid_studies::minPt || negTrack.pt() < o2::aod::pid_studies::minPt) { + return false; + } + if (posTrack.tpcChi2NCl() > o2::aod::pid_studies::maxTpcChi2NCl || negTrack.tpcChi2NCl() > o2::aod::pid_studies::maxTpcChi2NCl) { + return false; + } + if (posTrack.itsChi2NCl() > o2::aod::pid_studies::maxItsChi2NCl || negTrack.itsChi2NCl() > o2::aod::pid_studies::maxItsChi2NCl) { + return false; + } + if constexpr (!isV0) { + const auto& bachTrack = candidate.template bachelor_as(); + if (bachTrack.tpcNClsCrossedRows() < o2::aod::pid_studies::minTpcNClsCrossedRows) { + return false; + } + if (std::abs(bachTrack.eta()) > o2::aod::pid_studies::maxEta) { + return false; + } + if (bachTrack.pt() < o2::aod::pid_studies::minPt) { + return false; + } + if (bachTrack.tpcChi2NCl() > o2::aod::pid_studies::maxTpcChi2NCl) { + return false; + } + if (bachTrack.itsChi2NCl() > o2::aod::pid_studies::maxItsChi2NCl) { + return false; + } + } + return true; + } + template bool isSelectedV0AsK0s(const V0Cand& v0) { @@ -323,7 +402,7 @@ struct HfTaskPidStudies { return true; } - template + template bool isSelectedCascAsOmega(const CascCand& casc) { if (casc.mOmega() < massOmegaMin || casc.mOmega() > massOmegaMax) { @@ -335,7 +414,7 @@ struct HfTaskPidStudies { if (casc.cascradius() > radiusMax) { return false; } - const auto& coll = casc.template collision_as(); + const auto& coll = casc.template collision_as(); if (casc.casccosPA(coll.posX(), coll.posY(), coll.posZ()) < cosPaMin) { return false; } @@ -351,16 +430,24 @@ struct HfTaskPidStudies { return true; } - void processV0Mc(V0sMcRec const& V0s, + void processV0Mc(CollisionsMc const& /*mcCollisions*/, + V0sMcRec const& V0s, aod::V0MCCores const&, - CollSels const&, - PidTracks const&) + aod::McParticles const& /*particlesMc*/, + PidTracks const& /*tracks*/, + aod::BCsWithTimestamps const&) { for (const auto& v0 : V0s) { + if (applyEvSels && !isCollSelected(v0.collision_as())) { + return; + } + if (applyTrackSels && !isTrackSelected(v0)) { + return; + } if (isSelectedV0AsK0s(v0) || isSelectedV0AsLambda(v0)) { int matched = isMatched(v0); if (matched != aod::pid_studies::Particle::NotMatched) { - fillTree(v0, matched); + fillTree(v0, matched); } } } @@ -368,27 +455,42 @@ struct HfTaskPidStudies { PROCESS_SWITCH(HfTaskPidStudies, processV0Mc, "Process MC", true); void processV0Data(aod::V0Datas const& V0s, - CollSels const&, - PidTracks const&) + PidTracks const&, + aod::BCsWithTimestamps const&, + CollSels const&) { for (const auto& v0 : V0s) { + if (applyEvSels && !isCollSelected(v0.collision_as())) { + return; + } + if (applyTrackSels && !isTrackSelected(v0)) { + return; + } if (isSelectedV0AsK0s(v0) || isSelectedV0AsLambda(v0)) { - fillTree(v0, aod::pid_studies::Particle::NotMatched); + fillTree(v0, aod::pid_studies::Particle::NotMatched); } } } PROCESS_SWITCH(HfTaskPidStudies, processV0Data, "Process data", false); - void processCascMc(CascsMcRec const& cascades, + void processCascMc(CollisionsMc const& /*mcCollisions*/, + CascsMcRec const& cascades, aod::CascMCCores const&, - CollSels const&, - PidTracks const&) + aod::McParticles const& /*particlesMc*/, + PidTracks const&, + aod::BCsWithTimestamps const&) { for (const auto& casc : cascades) { - if (isSelectedCascAsOmega(casc)) { + if (applyEvSels && !isCollSelected(casc.collision_as())) { + return; + } + if (applyTrackSels && !isTrackSelected(casc)) { + return; + } + if (isSelectedCascAsOmega(casc)) { int matched = isMatched(casc); if (matched != aod::pid_studies::Particle::NotMatched) { - fillTree(casc, matched); + fillTree(casc, matched); } } } @@ -396,12 +498,19 @@ struct HfTaskPidStudies { PROCESS_SWITCH(HfTaskPidStudies, processCascMc, "Process MC", true); void processCascData(aod::CascDatas const& cascades, - CollSels const&, - PidTracks const&) + PidTracks const&, + aod::BCsWithTimestamps const&, + CollSels const&) { for (const auto& casc : cascades) { - if (isSelectedCascAsOmega(casc)) { - fillTree(casc, aod::pid_studies::Particle::NotMatched); + if (applyEvSels && !isCollSelected(casc.collision_as())) { + return; + } + if (applyTrackSels && !isTrackSelected(casc)) { + return; + } + if (isSelectedCascAsOmega(casc)) { + fillTree(casc, aod::pid_studies::Particle::NotMatched); } } } From e50abdfe39d80699bec04312490909e3be80fe8c Mon Sep 17 00:00:00 2001 From: rolavick Date: Fri, 18 Apr 2025 17:30:32 +0200 Subject: [PATCH 1036/1650] [PWGUD] TauTable producer preparation for MC (#10905) Co-authored-by: ALICE Action Bot --- PWGUD/DataModel/UDIndex.h | 33 ++++++++ PWGUD/TableProducer/CMakeLists.txt | 10 +++ PWGUD/TableProducer/tauEventTableProducer.cxx | 26 ++++++- .../udMcCollisions2udCollisions.cxx | 75 +++++++++++++++++++ .../TableProducer/udMcParticles2udTracks.cxx | 75 +++++++++++++++++++ 5 files changed, 215 insertions(+), 4 deletions(-) create mode 100644 PWGUD/DataModel/UDIndex.h create mode 100644 PWGUD/TableProducer/udMcCollisions2udCollisions.cxx create mode 100644 PWGUD/TableProducer/udMcParticles2udTracks.cxx diff --git a/PWGUD/DataModel/UDIndex.h b/PWGUD/DataModel/UDIndex.h new file mode 100644 index 00000000000..5fdfb0596e6 --- /dev/null +++ b/PWGUD/DataModel/UDIndex.h @@ -0,0 +1,33 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// +/// \file UDIndex.h +/// \author Roman Lavička +/// \since 2025-04-15 +/// \brief A table to store indices for association of MC truth to MC reco +/// + +#ifndef PWGUD_DATAMODEL_UDINDEX_H_ +#define PWGUD_DATAMODEL_UDINDEX_H_ + +#include "Framework/AnalysisDataModel.h" +namespace o2::aod +{ +namespace udidx +{ +DECLARE_SOA_ARRAY_INDEX_COLUMN(UDTrack, udtracks); +DECLARE_SOA_ARRAY_INDEX_COLUMN(UDCollision, udcollisions); +} // namespace udidx +DECLARE_SOA_TABLE(UDMcParticlesToUDTracks, "AOD", "UDP2UDT", udidx::UDTrackIds); +DECLARE_SOA_TABLE(UDMcCollisionsToUDCollisions, "AOD", "UDMCC2UDC", udidx::UDCollisionIds); +} // namespace o2::aod +#endif // PWGUD_DATAMODEL_UDINDEX_H_ diff --git a/PWGUD/TableProducer/CMakeLists.txt b/PWGUD/TableProducer/CMakeLists.txt index bf112b2f9f7..16dd0773aed 100644 --- a/PWGUD/TableProducer/CMakeLists.txt +++ b/PWGUD/TableProducer/CMakeLists.txt @@ -40,3 +40,13 @@ o2physics_add_dpl_workflow(fwdtrack-propagation SOURCES fwdTrackPropagation.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::GlobalTracking COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(udmcparticles-to-udtracks + SOURCES udMcParticles2udTracks.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(udmccollisions-to-udcollisions + SOURCES udMcCollisions2udCollisions.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + COMPONENT_NAME Analysis) diff --git a/PWGUD/TableProducer/tauEventTableProducer.cxx b/PWGUD/TableProducer/tauEventTableProducer.cxx index 29371ea5cf7..035cd4de860 100644 --- a/PWGUD/TableProducer/tauEventTableProducer.cxx +++ b/PWGUD/TableProducer/tauEventTableProducer.cxx @@ -40,6 +40,7 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "PWGUD/Core/UPCTauCentralBarrelHelperRL.h" #include "PWGUD/DataModel/UDTables.h" +#include "PWGUD/DataModel/UDIndex.h" // for UDMcParticles2UDTracks table #include "PWGUD/Core/SGSelector.h" // ROOT headers @@ -144,7 +145,7 @@ struct TauEventTableProducer { Configurable useNumContribs{"useNumContribs", false, {"Use coll.numContribs as event cut"}}; Configurable cutRecoFlag{"cutRecoFlag", 1, {"0 = std mode, 1 = upc mode"}}; Configurable useRecoFlag{"useRecoFlag", false, {"Use coll.flags as event cut"}}; - Configurable cutTrueGapSideFV0{"cutTrueGapSideFV0", -1, "FV0A threshold for SG selector"}; + Configurable cutTrueGapSideFV0{"cutTrueGapSideFV0", 180000, "FV0A threshold for SG selector"}; Configurable cutTrueGapSideFT0A{"cutTrueGapSideFT0A", 150., "FT0A threshold for SG selector"}; Configurable cutTrueGapSideFT0C{"cutTrueGapSideFT0C", 50., "FT0C threshold for SG selector"}; Configurable cutTrueGapSideZDC{"cutTrueGapSideZDC", 10000., "ZDC threshold for SG selector. 0 is <1n, 4.2 is <2n, 6.7 is <3n, 9.5 is <4n, 12.5 is <5n"}; @@ -193,6 +194,12 @@ struct TauEventTableProducer { using FullUDTracks = soa::Join; using FullSGUDCollisions = soa::Join; using FullSGUDCollision = FullSGUDCollisions::iterator; + using FullMCUDTracks = soa::Join; + using FullMCSGUDCollisions = soa::Join; + using FullMCSGUDCollision = FullMCSGUDCollisions::iterator; + using UDMcParticlesWithUDTracks = soa::Join; + using UDMcCollisionsWithUDCollisions = soa::Join; + using UDMcCollisionsWithUDCollision = UDMcCollisionsWithUDCollisions::iterator; // init void init(InitContext&) @@ -470,10 +477,21 @@ struct TauEventTableProducer { tpcSignal, tpcEl, tpcMu, tpcPi, tpcKa, tpcPr, tpcIP, tofSignal, tofEl, tofMu, tofPi, tofKa, tofPr, tofEP); } - - } // end processDataSG - + } PROCESS_SWITCH(TauEventTableProducer, processDataSG, "Iterate UD tables with measured data created by SG-Candidate-Producer.", false); + + void processMonteCarlo(UDMcCollisionsWithUDCollision const& mccollision, + FullMCSGUDCollisions const&, + FullUDTracks const&, + UDMcParticlesWithUDTracks const&) + { + LOGF(info, "mccollision idx %i", mccollision.globalIndex()); + if (mccollision.has_udcollisions()) { + auto const& collFromMcColl = mccollision.udcollisions_as(); + LOGF(info, "collision size %i ", collFromMcColl.size()); + } + } + PROCESS_SWITCH(TauEventTableProducer, processMonteCarlo, "Iterate UD tables with simulated data created by SG-Candidate-Producer.", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) diff --git a/PWGUD/TableProducer/udMcCollisions2udCollisions.cxx b/PWGUD/TableProducer/udMcCollisions2udCollisions.cxx new file mode 100644 index 00000000000..cea35fb70ea --- /dev/null +++ b/PWGUD/TableProducer/udMcCollisions2udCollisions.cxx @@ -0,0 +1,75 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// +/// \file udMcCollisions2udCollisions.cxx +/// \author Roman Lavička +/// \since 2025-04-15 +/// \brief A task to create a reverse index from UDMcCollisions to UDCollisions +/// + +#include + +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "PWGUD/DataModel/UDTables.h" +#include "PWGUD/DataModel/UDIndex.h" + +using namespace o2; +using namespace o2::framework; + +struct UDMcCollisions2UDCollisions { + using LabeledCollisions = soa::Join; + Produces udmcc2udc; + + std::vector collisionIds; + + void init(InitContext&) + { + } + + void process(aod::UDMcCollisions const& mcCollisions) + { + if (doprocessIndexingCentral || doprocessIndexingCentralFast) { + udmcc2udc.reserve(mcCollisions.size()); + } + } + + void processIndexingCentralFast(aod::UDMcCollisions const& mcCollisions, LabeledCollisions const& collisions) + { + // faster version, but will use more memory due to pre-allocation + std::vector> mccoll2coll(mcCollisions.size()); + for (const auto& collision : collisions) { + if (collision.has_udMcCollision()) + mccoll2coll[collision.udMcCollisionId()].push_back(collision.globalIndex()); + } + for (const auto& mcCollision : mcCollisions) { + udmcc2udc(mccoll2coll[mcCollision.globalIndex()]); + } + } + PROCESS_SWITCH(UDMcCollisions2UDCollisions, processIndexingCentralFast, "Create reverse index from mccollisions to collision: more memory use but potentially faster", true); + + void processIndexingCentral(aod::UDMcCollisions const&, soa::SmallGroups const& collisions) + { + collisionIds.clear(); + for (const auto& collision : collisions) { + collisionIds.push_back(collision.globalIndex()); + } + udmcc2udc(collisionIds); + } + PROCESS_SWITCH(UDMcCollisions2UDCollisions, processIndexingCentral, "Create reverse index from mccollisions to collision", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} diff --git a/PWGUD/TableProducer/udMcParticles2udTracks.cxx b/PWGUD/TableProducer/udMcParticles2udTracks.cxx new file mode 100644 index 00000000000..4a876a72fb3 --- /dev/null +++ b/PWGUD/TableProducer/udMcParticles2udTracks.cxx @@ -0,0 +1,75 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// +/// \file udMcParticles2udTracks.cxx +/// \author Roman Lavička +/// \since 2025-04-15 +/// \brief A task to create a reverse index from UDMcParticles to UDTracks +/// + +#include + +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "PWGUD/DataModel/UDTables.h" +#include "PWGUD/DataModel/UDIndex.h" + +using namespace o2; +using namespace o2::framework; + +struct UDMcParticlesToUDTracks { + using LabeledTracks = soa::Join; + Produces udp2udt; + + std::vector trackIds; + + void init(InitContext&) + { + } + + void process(aod::UDMcParticles const& particles) + { + if (doprocessIndexingCentral || doprocessIndexingCentralFast) { + udp2udt.reserve(particles.size()); + } + } + + void processIndexingCentralFast(aod::UDMcParticles const& mcParticles, LabeledTracks const& tracks) + { + // faster version, but will use more memory due to pre-allocation + std::vector> part2track(mcParticles.size()); + for (const auto& track : tracks) { + if (track.has_udMcParticle()) + part2track[track.udMcParticleId()].push_back(track.globalIndex()); + } + for (const auto& mcParticle : mcParticles) { + udp2udt(part2track[mcParticle.globalIndex()]); + } + } + PROCESS_SWITCH(UDMcParticlesToUDTracks, processIndexingCentralFast, "Create reverse index from particles to tracks: more memory use but potentially faster", true); + + void processIndexingCentral(aod::UDMcParticles const&, soa::SmallGroups const& tracks) + { + trackIds.clear(); + for (const auto& track : tracks) { + trackIds.push_back(track.globalIndex()); + } + udp2udt(trackIds); + } + PROCESS_SWITCH(UDMcParticlesToUDTracks, processIndexingCentral, "Create reverse index from particles to tracks", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} From 728b1294a69e1a230ccdbae2140ad9664f1f80fd Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Fri, 18 Apr 2025 23:32:50 +0200 Subject: [PATCH 1037/1650] [PWGEM/Dilepton] fix DCA calculation (#10912) Co-authored-by: ALICE Action Bot --- PWGEM/Dilepton/Tasks/matchingMFT.cxx | 4 +- PWGEM/Dilepton/Utils/EMTrackUtilities.h | 70 +++++++++++-------------- 2 files changed, 33 insertions(+), 41 deletions(-) diff --git a/PWGEM/Dilepton/Tasks/matchingMFT.cxx b/PWGEM/Dilepton/Tasks/matchingMFT.cxx index 680c929c284..895cbad111a 100644 --- a/PWGEM/Dilepton/Tasks/matchingMFT.cxx +++ b/PWGEM/Dilepton/Tasks/matchingMFT.cxx @@ -273,8 +273,8 @@ struct matchingMFT { float dcaXY = std::sqrt(dcaX * dcaX + dcaY * dcaY); float dcaZ = -dcaXY * std::sinh(eta); - float dFdx = 2.f * dcaX / dcaXY; - float dFdy = 2.f * dcaY / dcaXY; + float dFdx = dcaX / dcaXY; + float dFdy = dcaY / dcaXY; float sigma_dcaXY = std::sqrt(cXXatDCA * dFdx * dFdx + cYYatDCA * dFdy * dFdy + 2.f * cXYatDCA * dFdx * dFdy); o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToVertex); diff --git a/PWGEM/Dilepton/Utils/EMTrackUtilities.h b/PWGEM/Dilepton/Utils/EMTrackUtilities.h index 52b5d946b7b..6ac2275aee1 100644 --- a/PWGEM/Dilepton/Utils/EMTrackUtilities.h +++ b/PWGEM/Dilepton/Utils/EMTrackUtilities.h @@ -25,36 +25,29 @@ namespace o2::aod::pwgem::dilepton::utils::emtrackutil { //_______________________________________________________________________ template -float sigmaDca3D(T const& track) +float dca3DinSigma(T const& track) { - float cYY = track.cYY(); // in cm^2 - float cZZ = track.cZZ(); // in cm^2 - float cZY = track.cZY(); // in cm^2 - float dcaXY = track.dcaXY(); // in cm - float dcaZ = track.dcaZ(); // in cm - float dca3d = std::sqrt(dcaXY * dcaXY + dcaZ * dcaZ); // in cm - float dFdxy = 2.f * dcaXY / dca3d; - float dFdz = 2.f * dcaZ / dca3d; - return std::sqrt(cYY * dFdxy * dFdxy + cZZ * dFdz * dFdz + 2.f * cZY * dFdxy * dFdz); + float cYY = track.cYY(); + float cZZ = track.cZZ(); + float cZY = track.cZY(); + float dcaXY = track.dcaXY(); // in cm + float dcaZ = track.dcaZ(); // in cm + + float det = cYY * cZZ - cZY * cZY; // determinant + if (det < 0) { + return 999.f; + } else { + return std::sqrt(std::fabs((dcaXY * dcaXY * cZZ + dcaZ * dcaZ * cYY - 2. * dcaXY * dcaZ * cZY) / det / 2.)); // dca 3d in sigma + } } //_______________________________________________________________________ template -float dca3DinSigma(T const& track) +float sigmaDca3D(T const& track) { - return std::sqrt(track.dcaXY() * track.dcaXY() + track.dcaZ() * track.dcaZ()) / sigmaDca3D(track); - - // float cYY = track.cYY(); - // float cZZ = track.cZZ(); - // float cZY = track.cZY(); - // float dcaXY = track.dcaXY(); // in cm - // float dcaZ = track.dcaZ(); // in cm - - // float det = cYY * cZZ - cZY * cZY; // determinant - // if (det < 0) { - // return 999.f; - // } else { - // return std::sqrt(std::fabs((dcaXY * dcaXY * cZZ + dcaZ * dcaZ * cYY - 2. * dcaXY * dcaZ * cZY) / det / 2.)); // dca 3d in sigma - // } + float dcaXY = track.dcaXY(); // in cm + float dcaZ = track.dcaZ(); // in cm + float dca3d = std::sqrt(dcaXY * dcaXY + dcaZ * dcaZ); // in cm + return dca3d / dca3DinSigma(track); } //_______________________________________________________________________ template @@ -70,30 +63,29 @@ float dcaZinSigma(T const& track) } //_______________________________________________________________________ template -float sigmaFwdDcaXY(T const& track) +float fwdDcaXYinSigma(T const& track) { float cXX = track.cXXatDCA(); // in cm^2 float cYY = track.cYYatDCA(); // in cm^2 float cXY = track.cXYatDCA(); // in cm^2 float dcaX = track.fwdDcaX(); // in cm float dcaY = track.fwdDcaY(); // in cm - float dcaXY = std::sqrt(dcaX * dcaX + dcaY * dcaY); // in cm - float dFdx = 2.f * dcaX / dcaXY; - float dFdy = 2.f * dcaY / dcaXY; - return std::sqrt(cXX * dFdx * dFdx + cYY * dFdy * dFdy + 2.f * cXY * dFdx * dFdy); + float det = cXX * cYY - cXY * cXY; // determinant + + if (det < 0) { + return 999.f; + } else { + return std::sqrt(std::fabs((dcaX * dcaX * cYY + dcaY * dcaY * cXX - 2. * dcaX * dcaY * cXY) / det / 2.)); // dca xy in sigma + } } //_______________________________________________________________________ template -float fwdDcaXYinSigma(T const& track) +float sigmaFwdDcaXY(T const& track) { - return std::sqrt(track.fwdDcaX() * track.fwdDcaX() + track.fwdDcaY() * track.fwdDcaY()) / sigmaFwdDcaXY(track); - - // float det = cXX * cYY - cXY * cXY; // determinant - // if (det < 0) { - // return 999.f; - // } else { - // return std::sqrt(std::fabs((dcaX * dcaX * cYY + dcaY * dcaY * cXX - 2. * dcaX * dcaY * cXY) / det / 2.)); // dca xy in sigma - // } + float dcaX = track.fwdDcaX(); // in cm + float dcaY = track.fwdDcaY(); // in cm + float dcaXY = std::sqrt(dcaX * dcaX + dcaY * dcaY); // in cm + return dcaXY / fwdDcaXYinSigma(track); } //_______________________________________________________________________ template From 9ec7d408a628c447c13697b61a6323653e925ade Mon Sep 17 00:00:00 2001 From: JStaa <39123272+JStaa@users.noreply.github.com> Date: Sat, 19 Apr 2025 22:40:24 +0200 Subject: [PATCH 1038/1650] [PWGCF] Changed the efficiency histograms from 1D to 2D (#10914) --- .../Tasks/threeParticleCorrelations.cxx | 57 ++++++++++--------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx index 95065ea4fe1..2e94202f054 100644 --- a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx +++ b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx @@ -123,9 +123,9 @@ struct ThreeParticleCorrelations { Configurable confFilterSwitch{"confFilterSwitch", false, "Switch for the fakeV0Filter function"}; // Efficiency histograms - TH1D** hEffPions = new TH1D*[2]; - TH1D** hEffKaons = new TH1D*[2]; - TH1D** hEffProtons = new TH1D*[2]; + TH2D** hEffPions = new TH2D*[2]; + TH2D** hEffKaons = new TH2D*[2]; + TH2D** hEffProtons = new TH2D*[2]; // Correlation variables int triggSign, assocSign; @@ -241,12 +241,12 @@ struct ThreeParticleCorrelations { ccdb->setURL("http://alice-ccdb.cern.ch"); ccdb->setCaching(true); TList* efficiencyList = ccdb->getForTimeStamp("Users/j/jstaa/Efficiency/ChargedParticles", 1); - hEffPions[0] = static_cast(efficiencyList->FindObject("hEfficiencyPionP")); - hEffPions[1] = static_cast(efficiencyList->FindObject("hEfficiencyPionN")); - hEffKaons[0] = static_cast(efficiencyList->FindObject("hEfficiencyKaonP")); - hEffKaons[1] = static_cast(efficiencyList->FindObject("hEfficiencyKaonN")); - hEffProtons[0] = static_cast(efficiencyList->FindObject("hEfficiencyProtonP")); - hEffProtons[1] = static_cast(efficiencyList->FindObject("hEfficiencyProtonN")); + hEffPions[0] = static_cast(efficiencyList->FindObject("hEfficiencyPionP")); + hEffPions[1] = static_cast(efficiencyList->FindObject("hEfficiencyPionN")); + hEffKaons[0] = static_cast(efficiencyList->FindObject("hEfficiencyKaonP")); + hEffKaons[1] = static_cast(efficiencyList->FindObject("hEfficiencyKaonN")); + hEffProtons[0] = static_cast(efficiencyList->FindObject("hEfficiencyProtonP")); + hEffProtons[1] = static_cast(efficiencyList->FindObject("hEfficiencyProtonN")); } //========================================================================================================================================================================================================================================================================== @@ -278,15 +278,15 @@ struct ThreeParticleCorrelations { rQARegistry.fill(HIST("hdEdx"), track.pt(), track.tpcSignal()); rQARegistry.fill(HIST("hBeta"), track.pt(), track.beta()); if (assocPID[0] == pionID) { // Pions - rQARegistry.fill(HIST("hPtPion"), track.pt(), 1. / trackEff(hEffPions, track.sign(), track.pt())); + rQARegistry.fill(HIST("hPtPion"), track.pt(), 1. / trackEff(hEffPions, track)); rQARegistry.fill(HIST("hdEdxPion"), track.pt(), track.tpcSignal()); rQARegistry.fill(HIST("hBetaPion"), track.pt(), track.beta()); } else if (assocPID[0] == kaonID) { // Kaons - rQARegistry.fill(HIST("hPtKaon"), track.pt(), 1. / trackEff(hEffKaons, track.sign(), track.pt())); + rQARegistry.fill(HIST("hPtKaon"), track.pt(), 1. / trackEff(hEffKaons, track)); rQARegistry.fill(HIST("hdEdxKaon"), track.pt(), track.tpcSignal()); rQARegistry.fill(HIST("hBetaKaon"), track.pt(), track.beta()); } else if (assocPID[0] == protonID) { // Protons - rQARegistry.fill(HIST("hPtProton"), track.pt(), 1. / trackEff(hEffProtons, track.sign(), track.pt())); + rQARegistry.fill(HIST("hPtProton"), track.pt(), 1. / trackEff(hEffProtons, track)); rQARegistry.fill(HIST("hdEdxProton"), track.pt(), track.tpcSignal()); rQARegistry.fill(HIST("hBetaProton"), track.pt(), track.beta()); } @@ -318,19 +318,19 @@ struct ThreeParticleCorrelations { if (candMass >= MassLambda0 - 4 * dGaussSigma && candMass <= MassLambda0 + 4 * dGaussSigma) { if (assocPID[0] == pionID) { // Pions - rSECorrRegistry.fill(HIST("hSameLambdaPion_SGNL"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate.sign(), associate.pt())); + rSECorrRegistry.fill(HIST("hSameLambdaPion_SGNL"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate)); } else if (assocPID[0] == kaonID) { // Kaons - rSECorrRegistry.fill(HIST("hSameLambdaKaon_SGNL"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate.sign(), associate.pt())); + rSECorrRegistry.fill(HIST("hSameLambdaKaon_SGNL"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate)); } else if (assocPID[0] == protonID) { // Protons - rSECorrRegistry.fill(HIST("hSameLambdaProton_SGNL"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate.sign(), associate.pt())); + rSECorrRegistry.fill(HIST("hSameLambdaProton_SGNL"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate)); } } else if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { if (assocPID[0] == pionID) { // Pions - rSECorrRegistry.fill(HIST("hSameLambdaPion_SB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate.sign(), associate.pt())); + rSECorrRegistry.fill(HIST("hSameLambdaPion_SB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate)); } else if (assocPID[0] == kaonID) { // Kaons - rSECorrRegistry.fill(HIST("hSameLambdaKaon_SB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate.sign(), associate.pt())); + rSECorrRegistry.fill(HIST("hSameLambdaKaon_SB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate)); } else if (assocPID[0] == protonID) { // Protons - rSECorrRegistry.fill(HIST("hSameLambdaProton_SB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate.sign(), associate.pt())); + rSECorrRegistry.fill(HIST("hSameLambdaProton_SB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate)); } } } @@ -366,19 +366,19 @@ struct ThreeParticleCorrelations { if (candMass >= MassLambda0 - 4 * dGaussSigma && candMass <= MassLambda0 + 4 * dGaussSigma) { if (assocPID[0] == pionID) { // Pions - rMECorrRegistry.fill(HIST("hMixLambdaPion_SGNL"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate.sign(), associate.pt())); + rMECorrRegistry.fill(HIST("hMixLambdaPion_SGNL"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate)); } else if (assocPID[0] == kaonID) { // Kaons - rMECorrRegistry.fill(HIST("hMixLambdaKaon_SGNL"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate.sign(), associate.pt())); + rMECorrRegistry.fill(HIST("hMixLambdaKaon_SGNL"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate)); } else if (assocPID[0] == protonID) { // Protons - rMECorrRegistry.fill(HIST("hMixLambdaProton_SGNL"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate.sign(), associate.pt())); + rMECorrRegistry.fill(HIST("hMixLambdaProton_SGNL"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate)); } } else if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { if (assocPID[0] == pionID) { // Pions - rMECorrRegistry.fill(HIST("hMixLambdaPion_SB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate.sign(), associate.pt())); + rMECorrRegistry.fill(HIST("hMixLambdaPion_SB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate)); } else if (assocPID[0] == kaonID) { // Kaons - rMECorrRegistry.fill(HIST("hMixLambdaKaon_SB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate.sign(), associate.pt())); + rMECorrRegistry.fill(HIST("hMixLambdaKaon_SB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate)); } else if (assocPID[0] == protonID) { // Protons - rMECorrRegistry.fill(HIST("hMixLambdaProton_SB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate.sign(), associate.pt())); + rMECorrRegistry.fill(HIST("hMixLambdaProton_SB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate)); } } } @@ -598,17 +598,18 @@ struct ThreeParticleCorrelations { return 0.1 * (grpo->getNominalL3Field()); // 1 T = 10 kG } - double trackEff(TH1D** efficiencies, int sign, double pT) + template + double trackEff(TH2D** efficiencies, const TrackCand& track) { int index = -999; - if (sign > 0) { + if (track.sign() > 0) { index = 0; - } else if (sign < 0) { + } else if (track.sign() < 0) { index = 1; } - double efficiency = efficiencies[index]->GetBinContent(efficiencies[index]->FindBin(pT)); + double efficiency = efficiencies[index]->GetBinContent(efficiencies[index]->FindBin(track.pt(), track.eta())); if (efficiency > 0) { return efficiency; } else { From aecbfb165e9e574d0d5f05890ae561aae4fc4977 Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Sun, 20 Apr 2025 04:41:21 +0800 Subject: [PATCH 1039/1650] [PWGCF] add PID pt-Nch distribution (#10917) --- PWGCF/Flow/Tasks/flowMc.cxx | 42 ++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowMc.cxx b/PWGCF/Flow/Tasks/flowMc.cxx index 5b12e6f45d2..b310096ef40 100644 --- a/PWGCF/Flow/Tasks/flowMc.cxx +++ b/PWGCF/Flow/Tasks/flowMc.cxx @@ -65,12 +65,14 @@ struct FlowMc { O2_DEFINE_CONFIGURABLE(cfgFlowEfficiency, std::string, "", "CCDB path to efficiency object") O2_DEFINE_CONFIGURABLE(cfgCentVsIPTruth, std::string, "", "CCDB path to centrality vs IP truth") O2_DEFINE_CONFIGURABLE(cfgIsGlobalTrack, bool, false, "Use global tracks instead of hasTPC&&hasITS") + O2_DEFINE_CONFIGURABLE(cfgK0Lambda0Enabled, bool, false, "Add K0 and Lambda0") O2_DEFINE_CONFIGURABLE(cfgFlowCumulantEnabled, bool, false, "switch of calculating flow") O2_DEFINE_CONFIGURABLE(cfgFlowCumulantNbootstrap, int, 30, "Number of subsamples") O2_DEFINE_CONFIGURABLE(cfgTrackDensityCorrUse, bool, false, "Use track density efficiency correction") O2_DEFINE_CONFIGURABLE(cfgTrackDensityCorrSlopeFactor, float, 1.0f, "A factor to scale the track density efficiency slope") Configurable> cfgTrackDensityP0{"cfgTrackDensityP0", std::vector{0.6003720411, 0.6152630970, 0.6288860646, 0.6360694031, 0.6409494798, 0.6450540203, 0.6482117301, 0.6512592056, 0.6640008690, 0.6862631416, 0.7005738691, 0.7106567432, 0.7170728333}, "parameter 0 for track density efficiency correction"}; Configurable> cfgTrackDensityP1{"cfgTrackDensityP1", std::vector{-1.007592e-05, -8.932635e-06, -9.114538e-06, -1.054818e-05, -1.220212e-05, -1.312304e-05, -1.376433e-05, -1.412813e-05, -1.289562e-05, -1.050065e-05, -8.635725e-06, -7.380821e-06, -6.201250e-06}, "parameter 1 for track density efficiency correction"}; + float maxEta = 0.8; ConfigurableAxis axisB{"axisB", {100, 0.0f, 20.0f}, ""}; ConfigurableAxis axisCentrality{"axisCentrality", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90}, "X axis for histograms"}; @@ -143,6 +145,16 @@ struct FlowMc { histos.add("hEPVsPhi", "hEPVsPhi;Event Plane Angle; #varphi", HistType::kTH2D, {axisPhi, axisPhi}); histos.add("hPtNchGenerated", "Reco production; pT (GeV/c); multiplicity", HistType::kTH2D, {axisPt, axisNch}); histos.add("hPtNchGlobal", "Global production; pT (GeV/c); multiplicity", HistType::kTH2D, {axisPt, axisNch}); + histos.add("hPtNchGeneratedPion", "Reco production; pT (GeV/c); multiplicity", HistType::kTH2D, {axisPt, axisNch}); + histos.add("hPtNchGlobalPion", "Global production; pT (GeV/c); multiplicity", HistType::kTH2D, {axisPt, axisNch}); + histos.add("hPtNchGeneratedKaon", "Reco production; pT (GeV/c); multiplicity", HistType::kTH2D, {axisPt, axisNch}); + histos.add("hPtNchGlobalKaon", "Global production; pT (GeV/c); multiplicity", HistType::kTH2D, {axisPt, axisNch}); + histos.add("hPtNchGeneratedProton", "Reco production; pT (GeV/c); multiplicity", HistType::kTH2D, {axisPt, axisNch}); + histos.add("hPtNchGlobalProton", "Global production; pT (GeV/c); multiplicity", HistType::kTH2D, {axisPt, axisNch}); + histos.add("hPtNchGeneratedK0", "Reco production; pT (GeV/c); multiplicity", HistType::kTH2D, {axisPt, axisNch}); + histos.add("hPtNchGlobalK0", "Global production; pT (GeV/c); multiplicity", HistType::kTH2D, {axisPt, axisNch}); + histos.add("hPtNchGeneratedLambda", "Reco production; pT (GeV/c); multiplicity", HistType::kTH2D, {axisPt, axisNch}); + histos.add("hPtNchGlobalLambda", "Global production; pT (GeV/c); multiplicity", HistType::kTH2D, {axisPt, axisNch}); histos.add("hPtMCGen", "Monte Carlo Truth; pT (GeV/c);", {HistType::kTH1D, {axisPt}}); histos.add("hPtMCGlobal", "Monte Carlo Global; pT (GeV/c);", {HistType::kTH1D, {axisPt}}); histos.add("hPhiWeightedTrDen", "corrected #phi distribution, considering track density", {HistType::kTH1D, {axisPhi}}); @@ -348,7 +360,7 @@ struct FlowMc { continue; if (!mcParticle.isPhysicalPrimary()) continue; - if (std::fabs(mcParticle.eta()) > 0.8) // main acceptance + if (std::fabs(mcParticle.eta()) > maxEta) // main acceptance continue; if (mcParticle.has_tracks()) { auto const& tracks = mcParticle.tracks_as(); @@ -388,12 +400,16 @@ struct FlowMc { for (auto const& mcParticle : mcParticles) { // focus on bulk: e, mu, pi, k, p int pdgCode = std::abs(mcParticle.pdgCode()); - if (pdgCode != PDG_t::kElectron && pdgCode != PDG_t::kMuonMinus && pdgCode != PDG_t::kPiPlus && pdgCode != kKPlus && pdgCode != PDG_t::kProton) + bool extraPDGType = true; + if (cfgK0Lambda0Enabled) { + extraPDGType = (pdgCode != PDG_t::kK0Short && pdgCode != PDG_t::kLambda0); + } + if (extraPDGType && pdgCode != PDG_t::kElectron && pdgCode != PDG_t::kMuonMinus && pdgCode != PDG_t::kPiPlus && pdgCode != kKPlus && pdgCode != PDG_t::kProton) continue; if (!mcParticle.isPhysicalPrimary()) continue; - if (std::fabs(mcParticle.eta()) > 0.8) // main acceptance + if (std::fabs(mcParticle.eta()) > maxEta) // main acceptance continue; float deltaPhi = mcParticle.phi() - mcCollision.eventPlaneAngle(); @@ -402,6 +418,16 @@ struct FlowMc { histos.fill(HIST("hBVsPtVsPhiGenerated"), imp, deltaPhi, mcParticle.pt()); histos.fill(HIST("hPtNchGenerated"), mcParticle.pt(), nChGlobal); histos.fill(HIST("hPtMCGen"), mcParticle.pt()); + if (pdgCode == PDG_t::kPiPlus) + histos.fill(HIST("hPtNchGeneratedPion"), mcParticle.pt(), nChGlobal); + if (pdgCode == PDG_t::kKPlus) + histos.fill(HIST("hPtNchGeneratedKaon"), mcParticle.pt(), nChGlobal); + if (pdgCode == PDG_t::kProton) + histos.fill(HIST("hPtNchGeneratedProton"), mcParticle.pt(), nChGlobal); + if (pdgCode == PDG_t::kK0Short) + histos.fill(HIST("hPtNchGeneratedK0"), mcParticle.pt(), nChGlobal); + if (pdgCode == PDG_t::kLambda0) + histos.fill(HIST("hPtNchGeneratedLambda"), mcParticle.pt(), nChGlobal); nCh++; @@ -493,6 +519,16 @@ struct FlowMc { histos.fill(HIST("hBVsPtVsPhiGlobal"), imp, deltaPhi, mcParticle.pt(), wacc * weff); histos.fill(HIST("hPtNchGlobal"), mcParticle.pt(), nChGlobal); histos.fill(HIST("hPtMCGlobal"), mcParticle.pt()); + if (pdgCode == PDG_t::kPiPlus) + histos.fill(HIST("hPtNchGlobalPion"), mcParticle.pt(), nChGlobal); + if (pdgCode == PDG_t::kKPlus) + histos.fill(HIST("hPtNchGlobalKaon"), mcParticle.pt(), nChGlobal); + if (pdgCode == PDG_t::kProton) + histos.fill(HIST("hPtNchGlobalProton"), mcParticle.pt(), nChGlobal); + if (pdgCode == PDG_t::kK0Short) + histos.fill(HIST("hPtNchGlobalK0"), mcParticle.pt(), nChGlobal); + if (pdgCode == PDG_t::kLambda0) + histos.fill(HIST("hPtNchGlobalLambda"), mcParticle.pt(), nChGlobal); } // if any track present, fill if (validTrack) From 1cbdc66a2b6ff4f88b3f00dded59420ced0b699d Mon Sep 17 00:00:00 2001 From: Lars <146946151+ljoergen@users.noreply.github.com> Date: Sat, 19 Apr 2025 23:16:44 +0200 Subject: [PATCH 1040/1650] [PWGLF] angularCorrelationsInJets.cxx: histogram bug fixes (#10911) Co-authored-by: ALICE Action Bot --- .../Nuspex/angularCorrelationsInJets.cxx | 98 +++++++++---------- 1 file changed, 46 insertions(+), 52 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx b/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx index c2c1421331d..a0cbae145e3 100644 --- a/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx +++ b/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx @@ -85,26 +85,16 @@ struct AngularCorrelationsInJets { Configurable minJetPt{"minJetPt", 10.0, "minimum total pT to accept jet"}; // Proton Cuts - Configurable protonDCAxyYield{"protonDCAxyYield", 0.05, "[proton] DCAxy cut for yield"}; - Configurable protonDCAzYield{"protonDCAzYield", 0.05, "[proton] DCAz cut for yield"}; - Configurable protonDCAxyCF{"protonDCAxyCF", 0.05, "[proton] DCAxy cut for CF"}; - Configurable protonDCAzCF{"protonDCAzCF", 0.02, "[proton] DCAz cut for CF"}; + Configurable protonDCAxy{"protonDCAxy", 0.05, "[proton] DCAxy cut"}; + Configurable protonDCAz{"protonDCAz", 0.02, "[proton] DCAz cut"}; Configurable protonTPCTOFpT{"protonTPCTOFpT", 0.7, "[proton] pT for switch in TPC/TPC+TOF nsigma"}; - Configurable protonTPCnsigmaLowPtYield{"protonTPCnsigmaLowPtYield", 4.0, "[proton] max TPC nsigma with low pT for yield"}; - Configurable protonTPCnsigmaHighPtYield{"protonTPCnsigmaHighPtYield", 4.0, "[proton] max TPC nsigma with high pT for yield"}; - Configurable protonTOFnsigmaHighPtYield{"protonTOFnsigmaHighPtYield", 4.0, "[proton] max TOF nsigma with high pT yield"}; Configurable protonTPCnsigma{"protonTPCnsigma", 4.0, "[proton] max TPC nsigma for pt > 0/1.5/3.0 GeV"}; Configurable protonTOFnsigma{"protonTOFnsigma", 3.0, "[proton] max TOF nsigma for pt > 0/1.5/3.0 GeV"}; // Antiproton Cuts - Configurable antiprotonDCAxyYield{"antiprotonDCAxyYield", 0.05, "[antiproton] DCAxy cut for yield"}; - Configurable antiprotonDCAzYield{"antiprotonDCAzYield", 0.05, "[antiproton] DCAz cut for yield"}; - Configurable antiprotonDCAxyCF{"antiprotonDCAxyCF", 0.05, "[antiproton] DCAxy cut for CF"}; - Configurable antiprotonDCAzCF{"antiprotonDCAzCF", 0.02, "[antiproton] DCAz cut for CF"}; + Configurable antiprotonDCAxy{"antiprotonDCAxy", 0.05, "[antiproton] DCAxy cut"}; + Configurable antiprotonDCAz{"antiprotonDCAz", 0.02, "[antiproton] DCAz cut"}; Configurable antiprotonTPCTOFpT{"antiprotonTPCTOFpT", 0.7, "[antiproton] pT for switch in TPC/TPC+TOF nsigma"}; - Configurable antiprotonTPCnsigmaLowPtYield{"antiprotonTPCnsigmaLowPtYield", 4.0, "[antiproton] max TPC nsigma with low pT for yield"}; - Configurable antiprotonTPCnsigmaHighPtYield{"antiprotonTPCnsigmaHighPtYield", 4.0, "[antiproton] max TPC nsigma with high pT for yield"}; - Configurable antiprotonTOFnsigmaHighPtYield{"antiprotonTOFnsigmaHighPtYield", 4.0, "[antiproton] min TOF nsigma with high pT for yield"}; Configurable antiprotonTPCnsigma{"antiprotonTPCnsigma", 4.0, "[antiproton] max TPC nsigma for pt > 0/1.5/3.0 GeV"}; Configurable antiprotonTOFnsigma{"antiprotonTOFnsigma", 3.0, "[antiproton] max TOF nsigma for pt > 0/1.5/3.0 GeV"}; @@ -133,19 +123,21 @@ struct AngularCorrelationsInJets { int mRunNumber; using FullTracksRun2 = soa::Join; + aod::TrackSelectionExtension, aod::TracksDCA, aod::pidTPCFullPr, aod::pidTPCFullDe, aod::pidTPCFullHe, aod::pidTOFFullPr, aod::pidTOFFullDe, aod::pidTOFFullHe, aod::pidTOFbeta, aod::pidTPCEl, aod::pidTPCMu, aod::pidTPCFullPi, aod::pidTPCKa, aod::pidTPCTr, aod::pidTPCAl, aod::pidTOFPi, aod::pidTOFKa>; using FullTracksRun3 = soa::Join; + aod::TracksDCA, aod::pidTPCFullPr, aod::pidTPCFullDe, aod::pidTPCFullHe, aod::pidTOFFullPr, aod::pidTOFFullDe, aod::pidTOFFullHe, aod::pidTOFbeta, aod::pidTPCEl, aod::pidTPCMu, aod::pidTPCFullPi, aod::pidTPCKa, aod::pidTPCTr, aod::pidTPCAl, aod::pidTOFPi, aod::pidTOFKa>; using McTracksRun2 = soa::Join; + aod::TrackSelectionExtension, aod::TracksDCA, aod::pidTPCFullPr, aod::pidTPCFullDe, aod::pidTPCFullHe, aod::pidTOFFullPr, aod::pidTOFFullDe, aod::pidTOFFullHe, aod::pidTOFbeta, aod::pidTPCEl, aod::pidTPCMu, aod::pidTPCFullPi, aod::pidTPCKa, aod::pidTPCTr, aod::pidTPCAl, aod::pidTOFPi, aod::pidTOFKa, aod::McTrackLabels>; using McTracksRun3 = soa::Join; + aod::TracksDCA, aod::pidTPCFullPr, aod::pidTPCFullDe, aod::pidTPCFullHe, aod::pidTOFFullPr, aod::pidTOFFullDe, aod::pidTOFFullHe, aod::pidTOFbeta, aod::pidTPCEl, aod::pidTPCMu, aod::pidTPCFullPi, aod::pidTPCKa, aod::pidTPCTr, aod::pidTPCAl, aod::pidTOFPi, aod::pidTOFKa, aod::McTrackLabels>; using BCsWithRun2Info = soa::Join; using McCollisions = soa::Join; Filter prelimTrackCuts = (aod::track::itsChi2NCl < maxChi2ITS && aod::track::tpcChi2NCl < maxChi2TPC && - nabs(aod::track::dcaXY) < maxDCAxy); + nabs(aod::track::dcaXY) < maxDCAxy && + nabs(aod::track::dcaZ) < maxDCAz && + nabs(aod::track::eta) < maxEta); Preslice perCollisionFullTracksRun2 = o2::aod::track::collisionId; Preslice perCollisionFullTracksRun3 = o2::aod::track::collisionId; @@ -231,10 +223,10 @@ struct AngularCorrelationsInJets { registryData.add("ptJetAntiproton", "p_{T} of antiprotons", HistType::kTH1D, {axisSpecs.ptAxisPos}); registryData.add("dcaZJetAntiproton", "DCA_{z} of high purity antiprotons", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); registryQC.add("ptJetAntiprotonVsTotalJet", "Antiproton p_{T} vs. jet p_{T}", HistType::kTH2D, {axisSpecs.ptAxisPos, {1000, 0, 500, "jet p_{T} [GeV/#it{c}]"}}); - registryData.add("tpcNSigmaProtonCF", "TPC n#sigma for proton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tofNSigmaProtonCF", "TOF n#sigma for proton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tpcNSigmaAntiprotonCF", "TPC n#sigma for antiproton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); - registryData.add("tofNSigmaAntiprotonCF", "TOF n#sigma for antiproton CF", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tpcNSigmaProton", "TPC n#sigma for proton", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tofNSigmaProton", "TOF n#sigma for proton", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tpcNSigmaAntiproton", "TPC n#sigma for antiproton", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); + registryData.add("tofNSigmaAntiproton", "TOF n#sigma for antiproton", HistType::kTH2F, {axisSpecs.nsigmapTAxis, axisSpecs.nsigmaAxis}); } if (measureKaons) { @@ -250,8 +242,8 @@ struct AngularCorrelationsInJets { registryData.add("ptTotalJet", "p_{T} of entire jet;#it{p}_{T} [GeV/#it{c}]", HistType::kTH1F, {{1000, 0, 500}}); // nSigma - registryData.add("tpcSignal", "TPC signal", HistType::kTH2F, {{400, -10, 10, "#it{p} [GeV/#it{c}]"}, {1000, 0, 500, "d#it{E}/d#it{X} (a.u.)"}}); - registryData.add("tofSignal", "TOF signal", HistType::kTH2F, {{400, -20, 20, "#it{p} [GeV/#it{c}]"}, {400, 0.75, 1.05, "#beta (TOF)"}}); + registryData.add("tpcSignal", "TPC signal", HistType::kTH2F, {{800, -10, 10, "#it{p} [GeV/#it{c}]"}, {1000, 0, 500, "d#it{E}/d#it{X} (a.u.)"}}); + registryData.add("tofSignal", "TOF signal", HistType::kTH2F, {{800, -20, 20, "#it{p} [GeV/#it{c}]"}, {800, 0.75, 1.05, "#beta (TOF)"}}); // Angular Distributions registryQC.add("phiFullEvent", "#varphi in full event", HistType::kTH1F, {{1000, 0, 6.3}}); @@ -392,7 +384,7 @@ struct AngularCorrelationsInJets { template bool singleSpeciesTPCNSigma(T const& track) // reject any track that has TPC nsigma < 3 for more than 1 species { - if (useRejectionCut && (track.tpcNSigmaStoreEl() < nsigmaRejection || track.tpcNSigmaStoreMu() < nsigmaRejection || track.tpcNSigmaStorePi() < nsigmaRejection || track.tpcNSigmaStoreKa() < nsigmaRejection || track.tpcNSigmaStoreTr() < nsigmaRejection || track.tpcNSigmaStoreAl() < nsigmaRejection || track.tpcNSigmaDe() < nsigmaRejection || track.tpcNSigmaHe() < nsigmaRejection)) + if (useRejectionCut && (track.tpcNSigmaStoreEl() < nsigmaRejection || track.tpcNSigmaStoreMu() < nsigmaRejection || track.tpcNSigmaPi() < nsigmaRejection || track.tpcNSigmaKa() < nsigmaRejection || track.tpcNSigmaStoreTr() < nsigmaRejection || track.tpcNSigmaStoreAl() < nsigmaRejection || track.tpcNSigmaDe() < nsigmaRejection || track.tpcNSigmaHe() < nsigmaRejection)) return false; return true; } @@ -408,9 +400,9 @@ struct AngularCorrelationsInJets { // DCA double maxDCApt = 1.2; if (pt < maxDCApt) { - if (std::abs(track.dcaXY()) > protonDCAxyCF) + if (std::abs(track.dcaXY()) > protonDCAxy) return false; - if (std::abs(track.dcaZ()) > protonDCAzCF) + if (std::abs(track.dcaZ()) > protonDCAz) return false; } @@ -429,13 +421,13 @@ struct AngularCorrelationsInJets { maxTOFnsigma = protonTOFnsigma - 2; } - registryData.fill(HIST("tpcNSigmaProtonCF"), track.pt(), track.tpcNSigmaPr()); + registryData.fill(HIST("tpcNSigmaProton"), track.pt(), track.tpcNSigmaPr()); if (pt < protonTPCTOFpT && (std::abs(track.tpcNSigmaPr()) > maxTPCnsigma)) return false; double tofNSigma = 999; if (track.hasTOF()) { - registryData.fill(HIST("tofNSigmaProtonCF"), track.pt(), track.tofNSigmaPr()); + registryData.fill(HIST("tofNSigmaProton"), track.pt(), track.tofNSigmaPr()); tofNSigma = track.tofNSigmaPr(); } @@ -459,9 +451,9 @@ struct AngularCorrelationsInJets { // DCA double maxDCApt = 1.2; if (pt < maxDCApt) { - if (std::abs(track.dcaXY()) > antiprotonDCAxyCF) + if (std::abs(track.dcaXY()) > antiprotonDCAxy) return false; - if (std::abs(track.dcaZ()) > antiprotonDCAzCF) + if (std::abs(track.dcaZ()) > antiprotonDCAz) return false; } @@ -480,13 +472,13 @@ struct AngularCorrelationsInJets { maxTOFnsigma = antiprotonTOFnsigma - 2; } - registryData.fill(HIST("tpcNSigmaAntiprotonCF"), track.pt(), track.tpcNSigmaPr()); + registryData.fill(HIST("tpcNSigmaAntiproton"), track.pt(), track.tpcNSigmaPr()); if (pt < antiprotonTPCTOFpT && (std::abs(track.tpcNSigmaPr()) > maxTPCnsigma)) return false; double tofNSigma = 999; if (track.hasTOF()) { - registryData.fill(HIST("tofNSigmaAntiprotonCF"), track.pt(), track.tofNSigmaPr()); + registryData.fill(HIST("tofNSigmaAntiproton"), track.pt(), track.tofNSigmaPr()); tofNSigma = track.tofNSigmaPr(); } @@ -508,18 +500,18 @@ struct AngularCorrelationsInJets { if (std::abs(track.dcaZ()) > pionDCAz) return false; - registryData.fill(HIST("tpcNSigmaPion"), track.pt(), track.tpcNSigmaStorePi()); + registryData.fill(HIST("tpcNSigmaPion"), track.pt(), track.tpcNSigmaPi()); // TPC - if (track.pt() < pionTPCTOFpT && std::abs(track.tpcNSigmaStorePi()) > pionTPCnsigmaLowPt) + if (track.pt() < pionTPCTOFpT && std::abs(track.tpcNSigmaPi()) > pionTPCnsigmaLowPt) return false; - if (track.pt() > pionTPCTOFpT && std::abs(track.tpcNSigmaStorePi()) > pionTPCnsigmaHighPt) + if (track.pt() > pionTPCTOFpT && std::abs(track.tpcNSigmaPi()) > pionTPCnsigmaHighPt) return false; // TOF if (track.hasTOF()) { - registryData.fill(HIST("tofNSigmaPion"), track.pt(), track.tofNSigmaStorePi()); - if (track.pt() > pionTPCTOFpT && std::abs(track.tofNSigmaStorePi()) > pionTOFnsigma) + registryData.fill(HIST("tofNSigmaPion"), track.pt(), track.tofNSigmaPi()); + if (track.pt() > pionTPCTOFpT && std::abs(track.tofNSigmaPi()) > pionTOFnsigma) return false; } @@ -535,18 +527,18 @@ struct AngularCorrelationsInJets { if (std::abs(track.dcaZ()) > kaonDCAz) return false; - registryData.fill(HIST("tpcNSigmaKaon"), track.pt(), track.tpcNSigmaStoreKa()); + registryData.fill(HIST("tpcNSigmaKaon"), track.pt(), track.tpcNSigmaKa()); // TPC - if (track.pt() < kaonTPCTOFpT && std::abs(track.tpcNSigmaStoreKa()) > kaonTPCnsigmaLowPt) + if (track.pt() < kaonTPCTOFpT && std::abs(track.tpcNSigmaKa()) > kaonTPCnsigmaLowPt) return false; - if (track.pt() > kaonTPCTOFpT && std::abs(track.tpcNSigmaStoreKa()) > kaonTPCnsigmaHighPt) + if (track.pt() > kaonTPCTOFpT && std::abs(track.tpcNSigmaKa()) > kaonTPCnsigmaHighPt) return false; // TOF if (track.hasTOF()) { - registryData.fill(HIST("tofNSigmaKaon"), track.pt(), track.tofNSigmaStoreKa()); - if (track.pt() > kaonTPCTOFpT && std::abs(track.tofNSigmaStoreKa()) > kaonTOFnsigma) + registryData.fill(HIST("tofNSigmaKaon"), track.pt(), track.tofNSigmaKa()); + if (track.pt() > kaonTPCTOFpT && std::abs(track.tofNSigmaKa()) > kaonTOFnsigma) return false; } @@ -575,7 +567,7 @@ struct AngularCorrelationsInJets { if (std::isnan(buffer.at(i).first)) continue; if (buffer.at(i).first > constants::math::TwoPI || buffer.at(i).first < -constants::math::TwoPI) { - registryData.fill(HIST("trackProtocol"), 13); // # buffer tracks failed with |phi| > 2 pi + registryData.fill(HIST("trackProtocol"), 13); // # buffer tracks failed with phi > 2 pi continue; } @@ -772,7 +764,6 @@ struct AngularCorrelationsInJets { return jetCounter; if ((std::fabs(jet.eta()) + jetR) > (maxEta - deltaEtaEdge)) return jetCounter; - jetCounter++; registryData.fill(HIST("ptTotalSubJetPerp"), subtractedJetPerp.pt()); registryQC.fill(HIST("rhoEstimatePerp"), jet.pt(), rhoPerp); registryQC.fill(HIST("rhoMEstimatePerp"), jet.pt(), rhoMPerp); @@ -781,6 +772,11 @@ struct AngularCorrelationsInJets { registryData.fill(HIST("eventProtocol"), 4); std::vector constituents = jet.constituents(); + if (constituents.size() <= 1) + return jetCounter; + + jetCounter++; + registryData.fill(HIST("eventProtocol"), 5); registryData.fill(HIST("numberOfJets"), 0); registryData.fill(HIST("ptTotalJet"), jet.pt()); @@ -1000,7 +996,7 @@ struct AngularCorrelationsInJets { registryData.fill(HIST("trackProtocol"), 1); // # tracks selected for jet reconstruction - if (track.tpcNClsFindable() != 0) { + if (outputQC && (track.tpcNClsFindable() != 0)) { registryQC.fill(HIST("ratioCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows() / track.tpcNClsFindable()); } @@ -1051,10 +1047,8 @@ struct AngularCorrelationsInJets { registryData.fill(HIST("numJetsInEvent"), jetCounter); TVector3 hardestJetAxis(jets.at(0).px(), jets.at(0).py(), jets.at(0).pz()); // for full event, use hardest jet as orientation - if (doFullCorrelations) { - doCorrelations(particlesForCF, fBufferFull, fTempBufferFull, -1, hardestJetAxis); - setTrackBuffer(fTempBufferFull, fBufferFull); - } + doCorrelations(particlesForCF, fBufferFull, fTempBufferFull, -1, hardestJetAxis); + setTrackBuffer(fTempBufferFull, fBufferFull); } template @@ -1067,7 +1061,7 @@ struct AngularCorrelationsInJets { int index = 0; for (const auto& track : tracks) { - if (track.tpcNClsFindable() != 0) { + if (outputQC && (track.tpcNClsFindable() != 0)) { registryQC.fill(HIST("ratioCrossedRowsTPC"), track.pt(), track.tpcNClsCrossedRows() / track.tpcNClsFindable()); } registryQC.fill(HIST("ptFullEvent"), track.pt()); From c8fddd3da12315b1f9ac011c3cfe0dafda37aee9 Mon Sep 17 00:00:00 2001 From: abmodak <67369858+abmodak@users.noreply.github.com> Date: Tue, 22 Apr 2025 07:13:44 +0200 Subject: [PATCH 1041/1650] [PWGLF] PWGLF/Tasks/GEP/heavyionMultiplicity.cxx: rework on the task (#10922) --- .../heavyionMultiplicity.cxx | 627 +++++++++++------- 1 file changed, 386 insertions(+), 241 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/heavyionMultiplicity.cxx b/PWGLF/Tasks/GlobalEventProperties/heavyionMultiplicity.cxx index da7d79c29d4..435fc106062 100644 --- a/PWGLF/Tasks/GlobalEventProperties/heavyionMultiplicity.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/heavyionMultiplicity.cxx @@ -99,7 +99,7 @@ static constexpr TrackSelectionFlags::flagtype TrackSelectionDca = static constexpr TrackSelectionFlags::flagtype TrackSelectionDcaxyOnly = TrackSelectionFlags::kDCAxy; -AxisSpec axisEvent{12, 0.5, 12.5, "#Event", "EventAxis"}; +AxisSpec axisEvent{10, 0.5, 10.5, "#Event", "EventAxis"}; AxisSpec axisVtxZ{40, -20, 20, "Vertex Z", "VzAxis"}; AxisSpec axisEta{40, -2, 2, "#eta", "EtaAxis"}; AxisSpec axisPhi{{0, o2::constants::math::PIQuarter, o2::constants::math::PIHalf, o2::constants::math::PIQuarter * 3., o2::constants::math::PI, o2::constants::math::PIQuarter * 5., o2::constants::math::PIHalf * 3., o2::constants::math::PIQuarter * 7., o2::constants::math::TwoPI}, "#phi", "PhiAxis"}; @@ -111,6 +111,12 @@ AxisSpec axisSpecies = {kSpeciesend - 1, +kSpeciesbegin + 0.5, +kSpeciesend - 0. AxisSpec axisMassK0s = {200, 0.4, 0.6, "K0sMass", "K0sMass"}; AxisSpec axisMassLambda = {200, 1.07, 1.17, "Lambda/AntiLamda Mass", "Lambda/AntiLamda Mass"}; AxisSpec axisTracks{9, 0.5, 9.5, "#tracks", "TrackAxis"}; +auto static constexpr kMinCharge = 3.f; +auto static constexpr kMinpTcut = 0.1f; +auto static constexpr kMinCent = 0.0f; +auto static constexpr kMaxCent = 100.0f; +auto static constexpr kEtaInelgt0 = 1.0f; +auto static constexpr kNItslayers = 7; struct HeavyionMultiplicity { @@ -128,6 +134,11 @@ struct HeavyionMultiplicity { Configurable dcav0daughtercut{"dcav0daughtercut", 1.0f, "dcav0daughtercut"}; Configurable minTPCnClsCut{"minTPCnClsCut", 50.0f, "minTPCnClsCut"}; Configurable nSigmaTpcCut{"nSigmaTpcCut", 5.0f, "nSigmaTpcCut"}; + Configurable v0etaCut{"v0etaCut", 0.9f, "v0etaCut"}; + Configurable extraphicut1{"extraphicut1", 3.07666f, "Extra Phi cut 1"}; + Configurable extraphicut2{"extraphicut2", 3.12661f, "Extra Phi cut 2"}; + Configurable extraphicut3{"extraphicut3", 0.03f, "Extra Phi cut 3"}; + Configurable extraphicut4{"extraphicut4", 6.253f, "Extra Phi cut 4"}; ConfigurableAxis multHistBin{"multHistBin", {501, -0.5, 500.5}, ""}; ConfigurableAxis pvHistBin{"pvHistBin", {501, -0.5, 500.5}, ""}; ConfigurableAxis fv0aMultHistBin{"fv0aMultHistBin", {501, -0.5, 500.5}, ""}; @@ -139,18 +150,15 @@ struct HeavyionMultiplicity { Configurable isApplySameBunchPileup{"isApplySameBunchPileup", true, "Enable SameBunchPileup cut"}; Configurable isApplyGoodZvtxFT0vsPV{"isApplyGoodZvtxFT0vsPV", true, "Enable GoodZvtxFT0vsPV cut"}; - Configurable isApplyVertexITSTPC{"isApplyVertexITSTPC", true, "Enable VertexITSTPC cut"}; - Configurable isApplyVertexTOFmatched{"isApplyVertexTOFmatched", true, "Enable VertexTOFmatched cut"}; - Configurable isApplyVertexTRDmatched{"isApplyVertexTRDmatched", true, "Enable VertexTRDmatched cut"}; Configurable isApplyExtraCorrCut{"isApplyExtraCorrCut", false, "Enable extra NPVtracks vs FTOC correlation cut"}; Configurable isApplyExtraPhiCut{"isApplyExtraPhiCut", false, "Enable extra phi cut"}; Configurable npvTracksCut{"npvTracksCut", 1.0f, "Apply extra NPVtracks cut"}; Configurable ft0cCut{"ft0cCut", 1.0f, "Apply extra FT0C cut"}; Configurable isApplyNoCollInTimeRangeStandard{"isApplyNoCollInTimeRangeStandard", true, "Enable NoCollInTimeRangeStandard cut"}; - Configurable isApplyNoCollInRofStandard{"isApplyNoCollInRofStandard", true, "Enable NoCollInRofStandard cut"}; - Configurable isApplyNoHighMultCollInPrevRof{"isApplyNoHighMultCollInPrevRof", true, "Enable NoHighMultCollInPrevRof cut"}; - Configurable isApplyFT0CbasedOccupancy{"isApplyFT0CbasedOccupancy", true, "Enable FT0CbasedOccupancy cut"}; - Configurable isApplyCentFT0C{"isApplyCentFT0C", false, "Centrality based on FT0C"}; + Configurable isApplyNoCollInRofStandard{"isApplyNoCollInRofStandard", false, "Enable NoCollInRofStandard cut"}; + Configurable isApplyNoHighMultCollInPrevRof{"isApplyNoHighMultCollInPrevRof", false, "Enable NoHighMultCollInPrevRof cut"}; + Configurable isApplyFT0CbasedOccupancy{"isApplyFT0CbasedOccupancy", false, "Enable FT0CbasedOccupancy cut"}; + Configurable isApplyCentFT0C{"isApplyCentFT0C", true, "Centrality based on FT0C"}; Configurable isApplyCentFT0CVariant1{"isApplyCentFT0CVariant1", false, "Centrality based on FT0C variant1"}; Configurable isApplyCentFT0M{"isApplyCentFT0M", false, "Centrality based on FT0A + FT0C"}; Configurable isApplyCentNGlobal{"isApplyCentNGlobal", false, "Centrality based on global tracks"}; @@ -174,43 +182,34 @@ struct HeavyionMultiplicity { auto* x = hstat->GetXaxis(); x->SetBinLabel(1, "All events"); x->SetBinLabel(2, "sel8"); - x->SetBinLabel(3, "kNoSameBunchPileup"); // reject collisions in case of pileup with another collision in the same foundBC - x->SetBinLabel(4, "kIsGoodZvtxFT0vsPV"); // small difference between z-vertex from PV and from FT0 - x->SetBinLabel(5, "kIsVertexITSTPC"); // at least one ITS-TPC track (reject vertices built from ITS-only tracks) - x->SetBinLabel(6, "kIsVertexTOFmatched"); // at least one of vertex contributors is matched to TOF - x->SetBinLabel(7, "kIsVertexTRDmatched"); // at least one of vertex contributors is matched to TRD - x->SetBinLabel(8, "Centrality"); - x->SetBinLabel(9, "ApplyExtraCorrCut"); - x->SetBinLabel(10, "ApplyNoCollInTimeRangeStandard"); - x->SetBinLabel(11, "ApplyNoCollInRofStandard"); - x->SetBinLabel(12, "ApplyNoHighMultCollInPrevRof"); + x->SetBinLabel(3, "kNoSameBunchPileup"); // reject collisions in case of pileup with another collision in the same foundBC + x->SetBinLabel(4, "kIsGoodZvtxFT0vsPV"); // small difference between z-vertex from PV and from FT0 + x->SetBinLabel(5, "Centrality"); + x->SetBinLabel(6, "ApplyExtraCorrCut"); + x->SetBinLabel(7, "ApplyNoCollInTimeRangeStandard"); + x->SetBinLabel(8, "ApplyNoCollInRofStandard"); + x->SetBinLabel(9, "ApplyNoHighMultCollInPrevRof"); if (doprocessData) { histos.add("CentPercentileHist", "CentPercentileHist", kTH1D, {axisCent}, false); - histos.add("hdatamult", "hdatamult", kTHnSparseD, {axisVtxZ, axisMult, centAxis}, false); - histos.add("hdatadndeta", "hdatadndeta", kTHnSparseD, {axisVtxZ, centAxis, axisOccupancy, axisEta, axisPhi, axisTrackType}, false); histos.add("hdatazvtxcent", "hdatazvtxcent", kTH3D, {axisVtxZ, centAxis, axisOccupancy}, false); histos.add("PhiVsEtaHist", "PhiVsEtaHist", kTH2D, {axisPhi2, axisEta}, false); + histos.add("hdatadndeta", "hdatadndeta", kTHnSparseD, {axisVtxZ, centAxis, axisOccupancy, axisEta, axisPhi, axisTrackType}, false); } - if (doprocessMonteCarlo || doprocessMCpTefficiency || doprocessMCcheckFakeTracks || doprocessMCfillspecies) { + if (doprocessMonteCarlo || doprocessMCpTefficiency || doprocessMCcheckFakeTracks) { histos.add("CentPercentileMCRecHist", "CentPercentileMCRecHist", kTH1D, {axisCent}, false); histos.add("hmczvtxcent", "hmczvtxcent", kTH3D, {axisVtxZ, centAxis, axisOccupancy}, false); } if (doprocessMonteCarlo) { histos.add("MCrecPhiVsEtaHist", "MCrecPhiVsEtaHist", kTH2D, {axisPhi2, axisEta}, false); - histos.add("hmcrecdndeta", "hmcrecdndeta", kTHnSparseD, {axisVtxZ, centAxis, axisOccupancy, axisEta, axisPhi}, false); - histos.add("hmcgendndeta", "hmcgendndeta", kTHnSparseD, {axisVtxZ, centAxis, axisEta, axisPhi, axisGenPtVary}, false); - } - - if (doprocessMCfillspecies) { - histos.add("FillMCrecSpecies", "FillMCrecSpecies", kTHnSparseD, {centAxis, axisOccupancy, axisEta, axisSpecies}, false); - histos.add("FillMCgenSpecies", "FillMCgenSpecies", kTHnSparseD, {centAxis, axisEta, axisSpecies}, false); + histos.add("hmcrecdndeta", "hmcrecdndeta", kTHnSparseD, {axisVtxZ, centAxis, axisOccupancy, axisEta, axisPhi, axisSpecies, axisTrackType}, false); + histos.add("hmcgendndeta", "hmcgendndeta", kTHnSparseD, {axisVtxZ, centAxis, axisEta, axisPhi, axisSpecies, axisGenPtVary}, false); } if (doprocessMCpTefficiency) { - histos.add("hmcrecdndpt", "hmcrecdndpt", kTHnSparseD, {centAxis, axisPt}, false); + histos.add("hmcrecdndpt", "hmcrecdndpt", kTHnSparseD, {centAxis, axisOccupancy, axisTrackType, axisPt}, false); histos.add("hmcgendndpt", "hmcgendndpt", kTHnSparseD, {centAxis, axisPt, axisGenPtVary}, false); } @@ -220,7 +219,7 @@ struct HeavyionMultiplicity { auto* x2 = htrack->GetAxis(1); x2->SetBinLabel(1, "All tracks"); x2->SetBinLabel(2, "Non-fake tracks"); - for (int i = 0; i < 7; i++) { + for (int i = 0; i < kNItslayers; i++) { x2->SetBinLabel(i + 3, Form("layer %d", i)); } } @@ -239,43 +238,23 @@ struct HeavyionMultiplicity { histos.add("LambdaCentEtaMass", "LambdaCentEtaMass", kTH3D, {centAxis, axisEta, axisMassLambda}, false); histos.add("AntiLambdaCentEtaMass", "AntiLambdaCentEtaMass", kTH3D, {centAxis, axisEta, axisMassLambda}, false); } - } - template - bool isTrackSelected(CheckTrack const& track) - { - if (std::abs(track.eta()) >= etaRange) { - return false; - } - if (isApplyExtraPhiCut && ((track.phi() > 3.07666 && track.phi() < 3.12661) || track.phi() <= 0.03 || track.phi() >= 6.253)) { - return false; - } - return true; - } - template - bool isGenTrackSelected(CheckGenTrack const& track) - { - if (!track.isPhysicalPrimary()) { - return false; - } - if (!track.producedByGenerator()) { - return false; - } - auto pdgTrack = pdg->GetParticle(track.pdgCode()); - if (pdgTrack == nullptr) { - return false; - } - if (std::abs(pdgTrack->Charge()) < 3) { - return false; - } - if (std::abs(track.eta()) >= etaRange) { - return false; + if (doprocessppData) { + histos.add("MultPercentileHist", "MultPercentileHist", kTH1D, {axisCent}, false); + histos.add("hdatazvtxmultpp", "hdatazvtxmultpp", kTH2D, {axisVtxZ, centAxis}, false); + histos.add("PhiVsEtaHistpp", "PhiVsEtaHistpp", kTH2D, {axisPhi2, axisEta}, false); + histos.add("hdatadndetapp", "hdatadndetapp", kTHnSparseD, {axisVtxZ, centAxis, axisEta, axisPhi, axisTrackType}, false); } - if (isApplyExtraPhiCut && ((track.phi() > 3.07666 && track.phi() < 3.12661) || track.phi() <= 0.03 || track.phi() >= 6.253)) { - return false; + + if (doprocessppMonteCarlo) { + histos.add("MultPercentileMCRecHist", "MultPercentileMCRecHist", kTH1D, {axisCent}, false); + histos.add("hmczvtxmultpp", "hmczvtxmultpp", kTH2D, {axisVtxZ, centAxis}, false); + histos.add("MCrecPhiVsEtaHistpp", "MCrecPhiVsEtaHistpp", kTH2D, {axisPhi2, axisEta}, false); + histos.add("hmcrecdndetapp", "hmcrecdndetapp", kTHnSparseD, {axisVtxZ, centAxis, axisEta, axisPhi, axisSpecies, axisTrackType}, false); + histos.add("hmcgendndetapp", "hmcgendndetapp", kTHnSparseD, {axisVtxZ, centAxis, axisEta, axisPhi, axisSpecies, axisGenPtVary}, false); } - return true; } + template bool isEventSelected(CheckCol const& col) { @@ -296,49 +275,35 @@ struct HeavyionMultiplicity { } histos.fill(HIST("EventHist"), 4); - if (isApplyVertexITSTPC && !col.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) { + if (selColCent(col) < kMinCent || selColCent(col) > kMaxCent) { return false; } histos.fill(HIST("EventHist"), 5); - if (isApplyVertexTOFmatched && !col.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) { - return false; - } - histos.fill(HIST("EventHist"), 6); - - if (isApplyVertexTRDmatched && !col.selection_bit(o2::aod::evsel::kIsVertexTRDmatched)) { - return false; - } - histos.fill(HIST("EventHist"), 7); - - if (col.centFT0C() < 0. || col.centFT0C() > 100.) { - return false; - } - histos.fill(HIST("EventHist"), 8); - if (isApplyExtraCorrCut && col.multNTracksPV() > npvTracksCut && col.multFT0C() < (10 * col.multNTracksPV() - ft0cCut)) { return false; } - histos.fill(HIST("EventHist"), 9); + histos.fill(HIST("EventHist"), 6); if (isApplyNoCollInTimeRangeStandard && !col.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { return false; } - histos.fill(HIST("EventHist"), 10); + histos.fill(HIST("EventHist"), 7); if (isApplyNoCollInRofStandard && !col.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { return false; } - histos.fill(HIST("EventHist"), 11); + histos.fill(HIST("EventHist"), 8); if (isApplyNoHighMultCollInPrevRof && !col.selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof)) { return false; } - histos.fill(HIST("EventHist"), 12); + histos.fill(HIST("EventHist"), 9); return true; } + template - float selectColCentrality(CheckColCent const& col) + float selColCent(CheckColCent const& col) { auto cent = -1; if (isApplyCentFT0C) { @@ -358,6 +323,51 @@ struct HeavyionMultiplicity { } return cent; } + + template + float selColOccu(CheckColOccu const& col) + { + auto occu = isApplyFT0CbasedOccupancy ? col.ft0cOccupancyInTimeRange() : col.trackOccupancyInTimeRange(); + return occu; + } + + template + bool isTrackSelected(CheckTrack const& track) + { + if (std::abs(track.eta()) >= etaRange) { + return false; + } + if (isApplyExtraPhiCut && ((track.phi() > extraphicut1 && track.phi() < extraphicut2) || track.phi() <= extraphicut3 || track.phi() >= extraphicut4)) { + return false; + } + return true; + } + + template + bool isGenTrackSelected(CheckGenTrack const& track) + { + if (!track.isPhysicalPrimary()) { + return false; + } + if (!track.producedByGenerator()) { + return false; + } + auto pdgTrack = pdg->GetParticle(track.pdgCode()); + if (pdgTrack == nullptr) { + return false; + } + if (std::abs(pdgTrack->Charge()) < kMinCharge) { + return false; + } + if (std::abs(track.eta()) >= etaRange) { + return false; + } + if (isApplyExtraPhiCut && ((track.phi() > extraphicut1 && track.phi() < extraphicut2) || track.phi() <= extraphicut3 || track.phi() >= extraphicut4)) { + return false; + } + return true; + } + expressions::Filter trackSelectionProperMixed = ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::ITS) && ncheckbit(aod::track::trackCutFlag, TrackSelectionIts) && ifnode(ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::TPC), @@ -365,43 +375,39 @@ struct HeavyionMultiplicity { ifnode(dcaZ.node() > 0.f, nabs(aod::track::dcaZ) <= dcaZ && ncheckbit(aod::track::trackCutFlag, TrackSelectionDcaxyOnly), ncheckbit(aod::track::trackCutFlag, TrackSelectionDca)); - void processData(CollisionDataTable::iterator const& collision, FilTrackDataTable const& tracks) + void processData(CollisionDataTable::iterator const& cols, FilTrackDataTable const& tracks) { - if (!isEventSelected(collision)) { + if (!isEventSelected(cols)) { return; } - histos.fill(HIST("VtxZHist"), collision.posZ()); - histos.fill(HIST("CentPercentileHist"), selectColCentrality(collision)); - auto occupancyValue = isApplyFT0CbasedOccupancy ? collision.ft0cOccupancyInTimeRange() : collision.trackOccupancyInTimeRange(); - histos.fill(HIST("hdatazvtxcent"), collision.posZ(), selectColCentrality(collision), occupancyValue); + histos.fill(HIST("VtxZHist"), cols.posZ()); + histos.fill(HIST("CentPercentileHist"), selColCent(cols)); + histos.fill(HIST("hdatazvtxcent"), cols.posZ(), selColCent(cols), selColOccu(cols)); - auto nchTracks = 0; for (const auto& track : tracks) { if (!isTrackSelected(track)) { continue; } histos.fill(HIST("PhiVsEtaHist"), track.phi(), track.eta()); - nchTracks++; - histos.fill(HIST("hdatadndeta"), collision.posZ(), selectColCentrality(collision), occupancyValue, track.eta(), track.phi(), kGlobalplusITS); + histos.fill(HIST("hdatadndeta"), cols.posZ(), selColCent(cols), selColOccu(cols), track.eta(), track.phi(), kGlobalplusITS); if (track.hasTPC()) { - histos.fill(HIST("hdatadndeta"), collision.posZ(), selectColCentrality(collision), occupancyValue, track.eta(), track.phi(), kGlobalonly); + histos.fill(HIST("hdatadndeta"), cols.posZ(), selColCent(cols), selColOccu(cols), track.eta(), track.phi(), kGlobalonly); } else { - histos.fill(HIST("hdatadndeta"), collision.posZ(), selectColCentrality(collision), occupancyValue, track.eta(), track.phi(), kITSonly); + histos.fill(HIST("hdatadndeta"), cols.posZ(), selColCent(cols), selColOccu(cols), track.eta(), track.phi(), kITSonly); } } - histos.fill(HIST("hdatamult"), collision.posZ(), nchTracks, selectColCentrality(collision)); } PROCESS_SWITCH(HeavyionMultiplicity, processData, "process data CentFT0C", false); - void processCorrelation(CollisionDataTable::iterator const& collision, FilTrackDataTable const& tracks) + void processCorrelation(CollisionDataTable::iterator const& cols, FilTrackDataTable const& tracks) { - if (!isEventSelected(collision)) { + if (!isEventSelected(cols)) { return; } - if (std::abs(collision.posZ()) >= vtxRange) { + if (std::abs(cols.posZ()) >= vtxRange) { return; } - histos.fill(HIST("VtxZHist"), collision.posZ()); + histos.fill(HIST("VtxZHist"), cols.posZ()); auto nchTracks = 0; for (const auto& track : tracks) { @@ -410,66 +416,123 @@ struct HeavyionMultiplicity { } nchTracks++; } - histos.fill(HIST("GlobalMult_vs_FT0A"), nchTracks, collision.multFT0A()); - histos.fill(HIST("GlobalMult_vs_FT0C"), nchTracks, collision.multFT0C()); - histos.fill(HIST("NPVtracks_vs_FT0C"), collision.multNTracksPV(), collision.multFT0C()); - histos.fill(HIST("GlobalMult_vs_FV0A"), nchTracks, collision.multFV0A()); - histos.fill(HIST("NPVtracks_vs_GlobalMult"), collision.multNTracksPV(), nchTracks); + histos.fill(HIST("GlobalMult_vs_FT0A"), nchTracks, cols.multFT0A()); + histos.fill(HIST("GlobalMult_vs_FT0C"), nchTracks, cols.multFT0C()); + histos.fill(HIST("NPVtracks_vs_FT0C"), cols.multNTracksPV(), cols.multFT0C()); + histos.fill(HIST("GlobalMult_vs_FV0A"), nchTracks, cols.multFV0A()); + histos.fill(HIST("NPVtracks_vs_GlobalMult"), cols.multNTracksPV(), nchTracks); } PROCESS_SWITCH(HeavyionMultiplicity, processCorrelation, "do correlation study in data", false); - void processMonteCarlo(CollisionMCTrueTable::iterator const&, CollisionMCRecTable const& RecCollisions, TrackMCTrueTable const& GenParticles, FilTrackMCRecTable const& RecTracks) + void processMonteCarlo(CollisionMCTrueTable::iterator const&, CollisionMCRecTable const& RecCols, TrackMCTrueTable const& GenParticles, FilTrackMCRecTable const& RecTracks) { - for (const auto& RecCollision : RecCollisions) { - if (!isEventSelected(RecCollision)) { + for (const auto& RecCol : RecCols) { + if (!isEventSelected(RecCol)) { continue; } - histos.fill(HIST("VtxZHist"), RecCollision.posZ()); - histos.fill(HIST("CentPercentileMCRecHist"), selectColCentrality(RecCollision)); - auto occupancyValue = isApplyFT0CbasedOccupancy ? RecCollision.ft0cOccupancyInTimeRange() : RecCollision.trackOccupancyInTimeRange(); - histos.fill(HIST("hmczvtxcent"), RecCollision.posZ(), selectColCentrality(RecCollision), occupancyValue); + histos.fill(HIST("VtxZHist"), RecCol.posZ()); + histos.fill(HIST("CentPercentileMCRecHist"), selColCent(RecCol)); + histos.fill(HIST("hmczvtxcent"), RecCol.posZ(), selColCent(RecCol), selColOccu(RecCol)); - auto recTracksPart = RecTracks.sliceBy(perCollision, RecCollision.globalIndex()); + auto recTracksPart = RecTracks.sliceBy(perCollision, RecCol.globalIndex()); + std::vector mclabels; for (const auto& Rectrack : recTracksPart) { if (!isTrackSelected(Rectrack)) { continue; } histos.fill(HIST("MCrecPhiVsEtaHist"), Rectrack.phi(), Rectrack.eta()); - histos.fill(HIST("hmcrecdndeta"), RecCollision.posZ(), selectColCentrality(RecCollision), occupancyValue, Rectrack.eta(), Rectrack.phi()); + histos.fill(HIST("hmcrecdndeta"), RecCol.posZ(), selColCent(RecCol), selColOccu(RecCol), Rectrack.eta(), Rectrack.phi(), static_cast(kSpAll), kGlobalplusITS); + if (Rectrack.hasTPC()) { + histos.fill(HIST("hmcrecdndeta"), RecCol.posZ(), selColCent(RecCol), selColOccu(RecCol), Rectrack.eta(), Rectrack.phi(), static_cast(kSpAll), kGlobalonly); + } else { + histos.fill(HIST("hmcrecdndeta"), RecCol.posZ(), selColCent(RecCol), selColOccu(RecCol), Rectrack.eta(), Rectrack.phi(), static_cast(kSpAll), kITSonly); + } + + if (Rectrack.has_mcParticle()) { + int pid = kBkg; + auto mcpart = Rectrack.template mcParticle_as(); + if (mcpart.isPhysicalPrimary()) { + switch (std::abs(mcpart.pdgCode())) { + case PDG_t::kPiPlus: + pid = kSpPion; + break; + case PDG_t::kKPlus: + pid = kSpKaon; + break; + case PDG_t::kProton: + pid = kSpProton; + break; + default: + pid = kSpOther; + break; + } + } else { + pid = kSpNotPrimary; + } + if (mcpart.has_mothers()) { + auto mcpartMother = mcpart.template mothers_as().front(); + if (mcpartMother.pdgCode() == PDG_t::kK0Short || std::abs(mcpartMother.pdgCode()) == PDG_t::kLambda0) { + pid = kSpStrangeDecay; + } + } + if (find(mclabels.begin(), mclabels.end(), Rectrack.mcParticleId()) != mclabels.end()) { + pid = kBkg; + } + mclabels.push_back(Rectrack.mcParticleId()); + histos.fill(HIST("hmcrecdndeta"), RecCol.posZ(), selColCent(RecCol), selColOccu(RecCol), Rectrack.eta(), Rectrack.phi(), static_cast(pid), kGlobalplusITS); + } else { + histos.fill(HIST("hmcrecdndeta"), RecCol.posZ(), selColCent(RecCol), selColOccu(RecCol), Rectrack.eta(), Rectrack.phi(), static_cast(kBkg), kGlobalplusITS); + } } // track (mcrec) loop for (const auto& particle : GenParticles) { if (!isGenTrackSelected(particle)) { continue; } - histos.fill(HIST("hmcgendndeta"), RecCollision.posZ(), selectColCentrality(RecCollision), particle.eta(), particle.phi(), kNoGenpTVar); - if (particle.pt() < 0.1) { - histos.fill(HIST("hmcgendndeta"), RecCollision.posZ(), selectColCentrality(RecCollision), particle.eta(), particle.phi(), kGenpTup, -10.0 * particle.pt() + 2); - histos.fill(HIST("hmcgendndeta"), RecCollision.posZ(), selectColCentrality(RecCollision), particle.eta(), particle.phi(), kGenpTdown, 5.0 * particle.pt() + 0.5); + histos.fill(HIST("hmcgendndeta"), RecCol.posZ(), selColCent(RecCol), particle.eta(), particle.phi(), static_cast(kSpAll), kNoGenpTVar); + if (particle.pt() < kMinpTcut) { + histos.fill(HIST("hmcgendndeta"), RecCol.posZ(), selColCent(RecCol), particle.eta(), particle.phi(), static_cast(kSpAll), kGenpTup, -10.0 * particle.pt() + 2); + histos.fill(HIST("hmcgendndeta"), RecCol.posZ(), selColCent(RecCol), particle.eta(), particle.phi(), static_cast(kSpAll), kGenpTdown, 5.0 * particle.pt() + 0.5); } else { - histos.fill(HIST("hmcgendndeta"), RecCollision.posZ(), selectColCentrality(RecCollision), particle.eta(), particle.phi(), kGenpTup); - histos.fill(HIST("hmcgendndeta"), RecCollision.posZ(), selectColCentrality(RecCollision), particle.eta(), particle.phi(), kGenpTdown); + histos.fill(HIST("hmcgendndeta"), RecCol.posZ(), selColCent(RecCol), particle.eta(), particle.phi(), static_cast(kSpAll), kGenpTup); + histos.fill(HIST("hmcgendndeta"), RecCol.posZ(), selColCent(RecCol), particle.eta(), particle.phi(), static_cast(kSpAll), kGenpTdown); } + + int pid = 0; + switch (std::abs(particle.pdgCode())) { + case PDG_t::kPiPlus: + pid = kSpPion; + break; + case PDG_t::kKPlus: + pid = kSpKaon; + break; + case PDG_t::kProton: + pid = kSpProton; + break; + default: + pid = kSpOther; + break; + } + histos.fill(HIST("hmcgendndeta"), RecCol.posZ(), selColCent(RecCol), particle.eta(), particle.phi(), static_cast(pid), kNoGenpTVar); } // track (mcgen) loop } // collision loop } PROCESS_SWITCH(HeavyionMultiplicity, processMonteCarlo, "process MC CentFT0C", false); - void processMCpTefficiency(CollisionMCTrueTable::iterator const&, CollisionMCRecTable const& RecCollisions, TrackMCTrueTable const& GenParticles, FilTrackMCRecTable const& RecTracks) + void processMCpTefficiency(CollisionMCTrueTable::iterator const&, CollisionMCRecTable const& RecCols, TrackMCTrueTable const& GenParticles, FilTrackMCRecTable const& RecTracks) { - for (const auto& RecCollision : RecCollisions) { - if (!isEventSelected(RecCollision)) { + for (const auto& RecCol : RecCols) { + if (!isEventSelected(RecCol)) { continue; } - if (std::abs(RecCollision.posZ()) >= vtxRange) { + if (std::abs(RecCol.posZ()) >= vtxRange) { continue; } - histos.fill(HIST("VtxZHist"), RecCollision.posZ()); - histos.fill(HIST("CentPercentileMCRecHist"), selectColCentrality(RecCollision)); - auto occupancyValue = isApplyFT0CbasedOccupancy ? RecCollision.ft0cOccupancyInTimeRange() : RecCollision.trackOccupancyInTimeRange(); - histos.fill(HIST("hmczvtxcent"), RecCollision.posZ(), selectColCentrality(RecCollision), occupancyValue); + histos.fill(HIST("VtxZHist"), RecCol.posZ()); + histos.fill(HIST("CentPercentileMCRecHist"), selColCent(RecCol)); + histos.fill(HIST("hmczvtxcent"), RecCol.posZ(), selColCent(RecCol), selColOccu(RecCol)); - auto recTracksPart = RecTracks.sliceBy(perCollision, RecCollision.globalIndex()); + auto recTracksPart = RecTracks.sliceBy(perCollision, RecCol.globalIndex()); for (const auto& Rectrack : recTracksPart) { if (std::abs(Rectrack.eta()) >= etaRange) { continue; @@ -477,7 +540,12 @@ struct HeavyionMultiplicity { if (Rectrack.has_mcParticle()) { auto mcpart = Rectrack.mcParticle(); if (mcpart.isPhysicalPrimary()) { - histos.fill(HIST("hmcrecdndpt"), selectColCentrality(RecCollision), mcpart.pt()); + histos.fill(HIST("hmcrecdndpt"), selColCent(RecCol), selColOccu(RecCol), kGlobalplusITS, mcpart.pt()); + if (Rectrack.hasTPC()) { + histos.fill(HIST("hmcrecdndpt"), selColCent(RecCol), selColOccu(RecCol), kGlobalonly, mcpart.pt()); + } else { + histos.fill(HIST("hmcrecdndpt"), selColCent(RecCol), selColOccu(RecCol), kITSonly, mcpart.pt()); + } } } } @@ -486,34 +554,33 @@ struct HeavyionMultiplicity { if (!isGenTrackSelected(particle)) { continue; } - histos.fill(HIST("hmcgendndpt"), selectColCentrality(RecCollision), particle.pt(), kNoGenpTVar); - if (particle.pt() < 0.1) { - histos.fill(HIST("hmcgendndpt"), selectColCentrality(RecCollision), particle.pt(), kGenpTup, -10.0 * particle.pt() + 2); - histos.fill(HIST("hmcgendndpt"), selectColCentrality(RecCollision), particle.pt(), kGenpTdown, 5.0 * particle.pt() + 0.5); + histos.fill(HIST("hmcgendndpt"), selColCent(RecCol), particle.pt(), kNoGenpTVar); + if (particle.pt() < kMinpTcut) { + histos.fill(HIST("hmcgendndpt"), selColCent(RecCol), particle.pt(), kGenpTup, -10.0 * particle.pt() + 2); + histos.fill(HIST("hmcgendndpt"), selColCent(RecCol), particle.pt(), kGenpTdown, 5.0 * particle.pt() + 0.5); } else { - histos.fill(HIST("hmcgendndpt"), selectColCentrality(RecCollision), particle.pt(), kGenpTup); - histos.fill(HIST("hmcgendndpt"), selectColCentrality(RecCollision), particle.pt(), kGenpTdown); + histos.fill(HIST("hmcgendndpt"), selColCent(RecCol), particle.pt(), kGenpTup); + histos.fill(HIST("hmcgendndpt"), selColCent(RecCol), particle.pt(), kGenpTdown); } } } } PROCESS_SWITCH(HeavyionMultiplicity, processMCpTefficiency, "process MC pTefficiency", false); - void processMCcheckFakeTracks(CollisionMCTrueTable::iterator const&, CollisionMCRecTable const& RecCollisions, FilTrackMCRecTable const& RecTracks) + void processMCcheckFakeTracks(CollisionMCTrueTable::iterator const&, CollisionMCRecTable const& RecCols, FilTrackMCRecTable const& RecTracks) { - for (const auto& RecCollision : RecCollisions) { - if (!isEventSelected(RecCollision)) { + for (const auto& RecCol : RecCols) { + if (!isEventSelected(RecCol)) { continue; } - if (std::abs(RecCollision.posZ()) >= vtxRange) { + if (std::abs(RecCol.posZ()) >= vtxRange) { continue; } - histos.fill(HIST("VtxZHist"), RecCollision.posZ()); - histos.fill(HIST("CentPercentileMCRecHist"), selectColCentrality(RecCollision)); - auto occupancyValue = isApplyFT0CbasedOccupancy ? RecCollision.ft0cOccupancyInTimeRange() : RecCollision.trackOccupancyInTimeRange(); - histos.fill(HIST("hmczvtxcent"), RecCollision.posZ(), selectColCentrality(RecCollision), occupancyValue); + histos.fill(HIST("VtxZHist"), RecCol.posZ()); + histos.fill(HIST("CentPercentileMCRecHist"), selColCent(RecCol)); + histos.fill(HIST("hmczvtxcent"), RecCol.posZ(), selColCent(RecCol), selColOccu(RecCol)); - auto recTracksPart = RecTracks.sliceBy(perCollision, RecCollision.globalIndex()); + auto recTracksPart = RecTracks.sliceBy(perCollision, RecCol.globalIndex()); for (const auto& Rectrack : recTracksPart) { if (std::abs(Rectrack.eta()) >= etaRange) { continue; @@ -521,121 +588,37 @@ struct HeavyionMultiplicity { if (!Rectrack.hasTPC()) { continue; } - histos.fill(HIST("hTracksCount"), selectColCentrality(RecCollision), 1); + histos.fill(HIST("hTracksCount"), selColCent(RecCol), 1); bool isFakeItsTracks = false; - for (int i = 0; i < 7; i++) { + for (int i = 0; i < kNItslayers; i++) { if (Rectrack.mcMask() & 1 << i) { isFakeItsTracks = true; - histos.fill(HIST("hTracksCount"), selectColCentrality(RecCollision), i + 3); + histos.fill(HIST("hTracksCount"), selColCent(RecCol), i + 3); break; } } if (isFakeItsTracks) { continue; } - histos.fill(HIST("hTracksCount"), selectColCentrality(RecCollision), 2); + histos.fill(HIST("hTracksCount"), selColCent(RecCol), 2); } } } PROCESS_SWITCH(HeavyionMultiplicity, processMCcheckFakeTracks, "Check Fake tracks", false); - void processMCfillspecies(CollisionMCTrueTable::iterator const&, CollisionMCRecTable const& RecCollisions, TrackMCTrueTable const& GenParticles, FilTrackMCRecTable const& RecTracks) + void processStrangeYield(CollisionDataTable::iterator const& cols, V0TrackCandidates const&, aod::V0Datas const& v0data) { - for (const auto& RecCollision : RecCollisions) { - if (!isEventSelected(RecCollision)) { - continue; - } - if (std::abs(RecCollision.posZ()) >= vtxRange) { - continue; - } - histos.fill(HIST("VtxZHist"), RecCollision.posZ()); - histos.fill(HIST("CentPercentileMCRecHist"), selectColCentrality(RecCollision)); - auto occupancyValue = isApplyFT0CbasedOccupancy ? RecCollision.ft0cOccupancyInTimeRange() : RecCollision.trackOccupancyInTimeRange(); - histos.fill(HIST("hmczvtxcent"), RecCollision.posZ(), selectColCentrality(RecCollision), occupancyValue); - - auto recTracksPart = RecTracks.sliceBy(perCollision, RecCollision.globalIndex()); - std::vector mclabels; - for (const auto& Rectrack : recTracksPart) { - if (!isTrackSelected(Rectrack)) { - continue; - } - histos.fill(HIST("FillMCrecSpecies"), selectColCentrality(RecCollision), occupancyValue, Rectrack.eta(), static_cast(kSpAll)); - if (Rectrack.has_mcParticle()) { - int pid = kBkg; - auto mcpart = Rectrack.template mcParticle_as(); - if (mcpart.isPhysicalPrimary()) { - switch (std::abs(mcpart.pdgCode())) { - case 211: - pid = kSpPion; - break; - case 321: - pid = kSpKaon; - break; - case 2212: - pid = kSpProton; - break; - default: - pid = kSpOther; - break; - } - } else { - pid = kSpNotPrimary; - } - if (mcpart.has_mothers()) { - auto mcpartMother = mcpart.template mothers_as().front(); - if (mcpartMother.pdgCode() == 310 || std::abs(mcpartMother.pdgCode()) == 3122) { - pid = kSpStrangeDecay; - } - } - if (find(mclabels.begin(), mclabels.end(), Rectrack.mcParticleId()) != mclabels.end()) { - pid = kBkg; - } - mclabels.push_back(Rectrack.mcParticleId()); - histos.fill(HIST("FillMCrecSpecies"), selectColCentrality(RecCollision), occupancyValue, Rectrack.eta(), static_cast(pid)); - } else { - histos.fill(HIST("FillMCrecSpecies"), selectColCentrality(RecCollision), occupancyValue, Rectrack.eta(), static_cast(kBkg)); - } - } // rec track loop - - for (const auto& particle : GenParticles) { - if (!isGenTrackSelected(particle)) { - continue; - } - histos.fill(HIST("FillMCgenSpecies"), selectColCentrality(RecCollision), particle.eta(), static_cast(kSpAll)); - int pid = 0; - switch (std::abs(particle.pdgCode())) { - case 211: - pid = kSpPion; - break; - case 321: - pid = kSpKaon; - break; - case 2212: - pid = kSpProton; - break; - default: - pid = kSpOther; - break; - } - histos.fill(HIST("FillMCgenSpecies"), selectColCentrality(RecCollision), particle.eta(), static_cast(pid)); - } // gen track loop - } // collision loop - } - PROCESS_SWITCH(HeavyionMultiplicity, processMCfillspecies, "Fill particle species in MC", false); - - void processStrangeYield(CollisionDataTable::iterator const& collision, V0TrackCandidates const&, aod::V0Datas const& v0data) - { - if (!isEventSelected(collision)) { + if (!isEventSelected(cols)) { return; } - if (std::abs(collision.posZ()) >= vtxRange) { + if (std::abs(cols.posZ()) >= vtxRange) { return; } - histos.fill(HIST("hzvtxcent"), collision.posZ(), selectColCentrality(collision)); + histos.fill(HIST("hzvtxcent"), cols.posZ(), selColCent(cols)); for (const auto& v0track : v0data) { auto v0pTrack = v0track.template posTrack_as(); auto v0nTrack = v0track.template negTrack_as(); - if (std::abs(v0pTrack.eta()) > 0.9 || std::abs(v0nTrack.eta()) > 0.9) { + if (std::abs(v0pTrack.eta()) > v0etaCut || std::abs(v0nTrack.eta()) > v0etaCut) { continue; } if (v0pTrack.tpcNClsFound() < minTPCnClsCut) { @@ -659,12 +642,174 @@ struct HeavyionMultiplicity { if (std::abs(v0track.dcapostopv()) < dcapostopvCut || std::abs(v0track.dcanegtopv()) < dcanegtopvCut || v0track.v0radius() < v0radiusCut || v0track.v0cosPA() < v0cospaCut || std::abs(v0track.dcaV0daughters()) > dcav0daughtercut) { continue; } - histos.fill(HIST("K0sCentEtaMass"), selectColCentrality(collision), v0track.eta(), v0track.mK0Short()); - histos.fill(HIST("LambdaCentEtaMass"), selectColCentrality(collision), v0track.eta(), v0track.mLambda()); - histos.fill(HIST("AntiLambdaCentEtaMass"), selectColCentrality(collision), v0track.eta(), v0track.mAntiLambda()); + histos.fill(HIST("K0sCentEtaMass"), selColCent(cols), v0track.eta(), v0track.mK0Short()); + histos.fill(HIST("LambdaCentEtaMass"), selColCent(cols), v0track.eta(), v0track.mLambda()); + histos.fill(HIST("AntiLambdaCentEtaMass"), selColCent(cols), v0track.eta(), v0track.mAntiLambda()); } } PROCESS_SWITCH(HeavyionMultiplicity, processStrangeYield, "Strange particle yield", false); + + void processppData(CollisionDataTable::iterator const& cols, FilTrackDataTable const& tracks) + { + if (!isEventSelected(cols)) { + return; + } + + // INEL>0 sample + auto nTrks = 0; + for (const auto& track : tracks) { + if (!isTrackSelected(track)) { + continue; + } + if (track.eta() < kEtaInelgt0) { + nTrks++; + } + } // track loop + + if (nTrks > 0) { + histos.fill(HIST("EventHist"), 10); + histos.fill(HIST("VtxZHist"), cols.posZ()); + histos.fill(HIST("MultPercentileHist"), selColCent(cols)); + histos.fill(HIST("hdatazvtxmultpp"), cols.posZ(), selColCent(cols)); + + for (const auto& track : tracks) { + if (!isTrackSelected(track)) { + continue; + } + histos.fill(HIST("PhiVsEtaHistpp"), track.phi(), track.eta()); + histos.fill(HIST("hdatadndetapp"), cols.posZ(), selColCent(cols), track.eta(), track.phi(), kGlobalplusITS); + if (track.hasTPC()) { + histos.fill(HIST("hdatadndetapp"), cols.posZ(), selColCent(cols), track.eta(), track.phi(), kGlobalonly); + } else { + histos.fill(HIST("hdatadndetapp"), cols.posZ(), selColCent(cols), track.eta(), track.phi(), kITSonly); + } + } // track loop + } // nTrks>0 + } + PROCESS_SWITCH(HeavyionMultiplicity, processppData, "process pp data", false); + + void processppMonteCarlo(CollisionMCTrueTable::iterator const&, CollisionMCRecTable const& RecCols, TrackMCTrueTable const& GenParticles, FilTrackMCRecTable const& RecTracks) + { + for (const auto& RecCol : RecCols) { + if (!isEventSelected(RecCol)) { + continue; + } + auto recTracksPart = RecTracks.sliceBy(perCollision, RecCol.globalIndex()); + std::vector mclabels; + + // INEL>0 sample + auto nTrks = 0; + for (const auto& Rectrack : recTracksPart) { + if (!isTrackSelected(Rectrack)) { + continue; + } + if (Rectrack.eta() < kEtaInelgt0) { + nTrks++; + } + } + + if (nTrks > 0) { + histos.fill(HIST("EventHist"), 10); + histos.fill(HIST("VtxZHist"), RecCol.posZ()); + histos.fill(HIST("MultPercentileMCRecHist"), selColCent(RecCol)); + histos.fill(HIST("hmczvtxmultpp"), RecCol.posZ(), selColCent(RecCol)); + + for (const auto& Rectrack : recTracksPart) { + if (!isTrackSelected(Rectrack)) { + continue; + } + histos.fill(HIST("MCrecPhiVsEtaHistpp"), Rectrack.phi(), Rectrack.eta()); + histos.fill(HIST("hmcrecdndetapp"), RecCol.posZ(), selColCent(RecCol), Rectrack.eta(), Rectrack.phi(), static_cast(kSpAll), kGlobalplusITS); + if (Rectrack.hasTPC()) { + histos.fill(HIST("hmcrecdndetapp"), RecCol.posZ(), selColCent(RecCol), Rectrack.eta(), Rectrack.phi(), static_cast(kSpAll), kGlobalonly); + } else { + histos.fill(HIST("hmcrecdndetapp"), RecCol.posZ(), selColCent(RecCol), Rectrack.eta(), Rectrack.phi(), static_cast(kSpAll), kITSonly); + } + + if (Rectrack.has_mcParticle()) { + int pid = kBkg; + auto mcpart = Rectrack.template mcParticle_as(); + if (mcpart.isPhysicalPrimary()) { + switch (std::abs(mcpart.pdgCode())) { + case PDG_t::kPiPlus: + pid = kSpPion; + break; + case PDG_t::kKPlus: + pid = kSpKaon; + break; + case PDG_t::kProton: + pid = kSpProton; + break; + default: + pid = kSpOther; + break; + } + } else { + pid = kSpNotPrimary; + } + if (mcpart.has_mothers()) { + auto mcpartMother = mcpart.template mothers_as().front(); + if (mcpartMother.pdgCode() == PDG_t::kK0Short || std::abs(mcpartMother.pdgCode()) == PDG_t::kLambda0) { + pid = kSpStrangeDecay; + } + } + if (find(mclabels.begin(), mclabels.end(), Rectrack.mcParticleId()) != mclabels.end()) { + pid = kBkg; + } + mclabels.push_back(Rectrack.mcParticleId()); + histos.fill(HIST("hmcrecdndetapp"), RecCol.posZ(), selColCent(RecCol), Rectrack.eta(), Rectrack.phi(), static_cast(pid), kGlobalplusITS); + } else { + histos.fill(HIST("hmcrecdndetapp"), RecCol.posZ(), selColCent(RecCol), Rectrack.eta(), Rectrack.phi(), static_cast(kBkg), kGlobalplusITS); + } + } // track (mcrec) loop + } // nTrks>0 + + // INEL>0 sample + auto npart = 0; + for (const auto& particle : GenParticles) { + if (!isGenTrackSelected(particle)) { + continue; + } + if (particle.eta() < kEtaInelgt0) { + npart++; + } + } // particle loop + + if (npart > 0) { + for (const auto& particle : GenParticles) { + if (!isGenTrackSelected(particle)) { + continue; + } + histos.fill(HIST("hmcgendndetapp"), RecCol.posZ(), selColCent(RecCol), particle.eta(), particle.phi(), static_cast(kSpAll), kNoGenpTVar); + if (particle.pt() < kMinpTcut) { + histos.fill(HIST("hmcgendndetapp"), RecCol.posZ(), selColCent(RecCol), particle.eta(), particle.phi(), static_cast(kSpAll), kGenpTup, -10.0 * particle.pt() + 2); + histos.fill(HIST("hmcgendndetapp"), RecCol.posZ(), selColCent(RecCol), particle.eta(), particle.phi(), static_cast(kSpAll), kGenpTdown, 5.0 * particle.pt() + 0.5); + } else { + histos.fill(HIST("hmcgendndetapp"), RecCol.posZ(), selColCent(RecCol), particle.eta(), particle.phi(), static_cast(kSpAll), kGenpTup); + histos.fill(HIST("hmcgendndetapp"), RecCol.posZ(), selColCent(RecCol), particle.eta(), particle.phi(), static_cast(kSpAll), kGenpTdown); + } + + int pid = 0; + switch (std::abs(particle.pdgCode())) { + case PDG_t::kPiPlus: + pid = kSpPion; + break; + case PDG_t::kKPlus: + pid = kSpKaon; + break; + case PDG_t::kProton: + pid = kSpProton; + break; + default: + pid = kSpOther; + break; + } + histos.fill(HIST("hmcgendndetapp"), RecCol.posZ(), selColCent(RecCol), particle.eta(), particle.phi(), static_cast(pid), kNoGenpTVar); + } // track (mcgen) loop + } // npart>0 + } // collision loop + } + PROCESS_SWITCH(HeavyionMultiplicity, processppMonteCarlo, "process pp MC", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 38e6495748cb351897fcf03599cfaa63891ba915 Mon Sep 17 00:00:00 2001 From: omvazque Date: Tue, 22 Apr 2025 00:15:50 -0500 Subject: [PATCH 1042/1650] [PWGLF] Adds more QA histograms (#10924) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 771 +++++++++---------- 1 file changed, 375 insertions(+), 396 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index 2c9d168231a..72a89b7d5de 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -85,6 +85,7 @@ struct UccZdc { Configurable nBinsAmpFT0{"nBinsAmpFT0", 100, "N bins FT0 amp"}; Configurable maxAmpFT0{"maxAmpFT0", 2500, "Max FT0 amp"}; Configurable nBinsNch{"nBinsNch", 2501, "N bins Nch (|eta|<0.8)"}; + Configurable minNch{"minNch", 0, "Min Nch (|eta|<0.8)"}; Configurable maxNch{"maxNch", 2500, "Max Nch (|eta|<0.8)"}; Configurable nBinsZDC{"nBinsZDC", 400, "nBinsZDC"}; Configurable nBinsZEM{"nBinsZEM", 100, "nBinsZEM"}; @@ -101,45 +102,43 @@ struct UccZdc { ConfigurableAxis binsCent{"binsCent", {VARIABLE_WIDTH, 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.}, "T0C binning"}; // Configurable event selectiond and flags ZDC + Configurable isNoCollInTimeRangeStrict{"isNoCollInTimeRangeStrict", true, "isNoCollInTimeRangeStrict?"}; + Configurable isNoCollInTimeRangeStandard{"isNoCollInTimeRangeStandard", false, "isNoCollInTimeRangeStandard?"}; + Configurable isNoCollInRofStrict{"isNoCollInRofStrict", true, "isNoCollInRofStrict?"}; + Configurable isNoCollInRofStandard{"isNoCollInRofStandard", false, "isNoCollInRofStandard?"}; + Configurable isNoHighMultCollInPrevRof{"isNoHighMultCollInPrevRof", true, "isNoHighMultCollInPrevRof?"}; + Configurable isNoCollInTimeRangeNarrow{"isNoCollInTimeRangeNarrow", false, "isNoCollInTimeRangeNarrow?"}; Configurable isOccupancyCut{"isOccupancyCut", true, "Occupancy cut?"}; - Configurable isApplyFT0CbasedOccupancy{"isApplyFT0CbasedOccupancy", - false, "T0C Occu cut?"}; - Configurable isApplySameBunchPileup{"isApplySameBunchPileup", true, - "SameBunchPileup cut?"}; - Configurable isApplyGoodZvtxFT0vsPV{"isApplyGoodZvtxFT0vsPV", true, - "GoodZvtxFT0vsPV cut?"}; - Configurable isApplyVertexITSTPC{"isApplyVertexITSTPC", true, - "VertexITSTPC cut?"}; - Configurable isApplyVertexTOFmatched{"isApplyVertexTOFmatched", true, - "VertexTOFmatched cut?"}; + Configurable isApplyFT0CbasedOccupancy{"isApplyFT0CbasedOccupancy", false, "T0C Occu cut?"}; Configurable isAmpZDC{"isAmpZDC", false, "Use amplitude ZDC?"}; Configurable isCommPMT{"isCommPMT", false, "Use common PMT ZDC?"}; Configurable isSumTowers{"isSumTowers", false, "Use sum of Tow ZDC?"}; Configurable isTDCcut{"isTDCcut", false, "Use TDC cut?"}; Configurable isZEMcut{"isZEMcut", true, "Use ZEM cut?"}; - Configurable isZNbasedSel{"isZNbasedSel", false, "Use ZN based Sel."}; - Configurable isZN{"isZN", false, "Use ZN based Sel."}; - Configurable isZNA{"isZNA", false, "Use ZNA based Sel."}; - Configurable isZNC{"isZNC", false, "Use ZNC based Sel."}; + Configurable isZNAbasedSel{"isZNAbasedSel", false, "Use ZNA based Sel."}; + Configurable isZNCbasedSel{"isZNCbasedSel", false, "Use ZNC based Sel."}; Configurable znBasedCut{"znBasedCut", 100, "ZN-based cut"}; - Configurable zemCut{"zemCut", 1000., "ZEM cut"}; Configurable tdcCut{"tdcCut", 1., "TDC cut"}; Configurable minOccCut{"minOccCut", 0, "min Occu cut"}; Configurable maxOccCut{"maxOccCut", 500, "max Occu cut"}; + Configurable minITSnCls{"minITSnCls", 5, "min ITSnCls"}; enum EvCutLabel { All = 1, SelEigth, NoSameBunchPileup, IsGoodZvtxFT0vsPV, - IsVertexITSTPC, - IsVertexTOFmatched, + NoCollInTimeRangeStrict, + NoCollInTimeRangeStandard, + NoCollInRofStrict, + NoCollInRofStandard, + NoHighMultCollInPrevRof, + NoCollInTimeRangeNarrow, OccuCut, Centrality, VtxZ, - CentralityCut, Zdc, TZero, Tdc, @@ -147,40 +146,16 @@ struct UccZdc { }; // Histograms names - static constexpr std::string_view PtCorrNames[4] = { - "NchvsOneParCorr", "NchvsTwoParCorr", "NchvsThreeParCorr", - "NchvsFourParCorr"}; - static constexpr std::string_view PtCorrMCNchNames[4] = { - "NchvsOneParCorrMC", "NchvsTwoParCorrMC", "NchvsThreeParCorrMC", - "NchvsFourParCorrMC"}; - static constexpr std::string_view PtCorrMCNchMCNames[4] = { - "NchMCvsOneParCorrMC", "NchMCvsTwoParCorrMC", "NchMCvsThreeParCorrMC", - "NchMCvsFourParCorrMC"}; static constexpr std::string_view PsTitles[4] = { - ";Nch;P_{1}=#Sigma_{evs} W^{(1)}_{e} [p_{T}^{(1)}]_{e};", - ";Nch;P_{2}=#Sigma_{evs} W^{(2)}_{e} [p_{T}^{(2)}]_{e};", - ";Nch;P_{3}=#Sigma_{evs} W^{(3)}_{e} [p_{T}^{(3)}]_{e};", - ";Nch;P_{4}=#Sigma_{evs} W^{(4)}_{e} [p_{T}^{(4)}]_{e};"}; - static constexpr std::string_view WsTitles[4] = { - ";Nch;W_{1}=#Sigma_{evs} W^{(1)}_{e};", - ";Nch;W_{2}=#Sigma_{evs} W^{(2)}_{e};", - ";Nch;W_{3}=#Sigma_{evs} W^{(3)}_{e};", - ";Nch;W_{4}=#Sigma_{evs} W^{(4)}_{e};"}; - static constexpr std::string_view PtCorrTitles[4] = { - ";Nch (|#eta|<0.8);[p_{T}]=(#Sigma w_{i} p_{T}^{i})/(#Sigma w_{i})", - ";Nch (|#eta|<0.8);[p_{T}^{2}]=(P_{1}^{2} - P_{2})/(W_{1}^{2} - " - "W_{2})", - ";Nch (|#eta|<0.8);[p_{T}^{3}]=(P_{1}^{3} - 3P_{2}P_{1} + " - "2P_{3})/(W_{1}^{3} - 3W_{2}W_{1} + 2W_{3})", - ";Nch (|#eta|<0.8);[p_{T}^{4}]"}; + ";#it{N}_{ch} (|#eta| < 0.8, Corrected);#LT[#it{p}_{T}^{(1)}]#GT;", + ";#it{N}_{ch} (|#eta| < 0.8, Corrected);#LT[#it{p}_{T}^{(2)}]#GT;", + ";#it{N}_{ch} (|#eta| < 0.8, Corrected);#LT[#it{p}_{T}^{(3)}]#GT;", + ";#it{N}_{ch} (|#eta| < 0.8, Corrected);#LT[#it{p}_{T}^{(4)}]#GT;"}; // Filters - // Filter collFilter = (nabs(aod::collision::posZ) < posZcut); - // Filter trackFilter = (requireGlobalTrackInFilter()); - Filter trackFilter = - ((aod::track::eta > minEta) && (aod::track::eta < maxEta) && - (aod::track::pt > minPt) && (aod::track::pt < maxPt) && - requireGlobalTrackInFilter()); + // Filter trackFilter = ((aod::track::eta > minEta) && (aod::track::eta < maxEta) && (aod::track::pt > minPt) && (aod::track::pt < maxPt) && requireGlobalTrackInFilter()); + // Remove the GlobalTrack filter to count also ITS tracks + Filter trackFilter = ((aod::track::eta > minEta) && (aod::track::eta < maxEta) && (aod::track::pt > minPt) && (aod::track::pt < maxPt)); // Apply Filters // using TheFilteredCollisions = soa::Filtered; @@ -211,8 +186,8 @@ struct UccZdc { { // define axes you want to use const AxisSpec axisZpos{48, -12., 12., "Vtx_{z} (cm)"}; - const AxisSpec axisEvent{14, 0.5, 14.5, ""}; - const AxisSpec axisEta{30, -1.5, +1.5, "#eta"}; + const AxisSpec axisEvent{18, 0.5, 18.5, ""}; + const AxisSpec axisEta{30, -1.05, +1.05, "#eta"}; const AxisSpec axisPt{binsPt, "#it{p}_{T} (GeV/#it{c})"}; const AxisSpec axisDeltaPt{100, -1.0, +1.0, "#Delta(p_{T})"}; const AxisSpec axisCent{binsCent, "T0C centrality"}; @@ -226,104 +201,98 @@ struct UccZdc { x->SetBinLabel(1, "All"); x->SetBinLabel(2, "SelEigth"); x->SetBinLabel(3, "NoSameBunchPileup"); - x->SetBinLabel(4, "IsGoodZvtxFT0vsPV"); - x->SetBinLabel(5, "IsVertexITSTPC"); - x->SetBinLabel(6, "IsVertexTOFmatched"); - x->SetBinLabel(7, "Occupancy Cut"); - x->SetBinLabel(8, "Centrality"); - x->SetBinLabel(9, "VtxZ cut"); - x->SetBinLabel(10, "Centrality cut"); - x->SetBinLabel(11, "has ZDC?"); - x->SetBinLabel(12, "has T0?"); - x->SetBinLabel(13, "Within TDC cut?"); - x->SetBinLabel(14, "Within ZEM cut?"); + x->SetBinLabel(4, "GoodZvtxFT0vsPV"); + x->SetBinLabel(5, "NoCollInTimeRangeStrict"); + x->SetBinLabel(6, "NoCollInTimeRangeStandard"); + x->SetBinLabel(7, "NoCollInRofStrict"); + x->SetBinLabel(8, "NoCollInRofStandard"); + x->SetBinLabel(9, "NoHighMultCollInPrevRof"); + x->SetBinLabel(10, "NoCollInTimeRangeNarrow"); + x->SetBinLabel(11, "Occupancy Cut"); + x->SetBinLabel(12, "Cent. Sel."); + x->SetBinLabel(13, "VtxZ cut"); + x->SetBinLabel(14, "has ZDC?"); + x->SetBinLabel(15, "has T0?"); + x->SetBinLabel(16, "Within TDC cut?"); + x->SetBinLabel(17, "Within ZEM cut?"); // Histograms: paritcle-level info if (doprocessZdcCollAss) { + registry.add("NchVsZpos", ";#it{N}_{ch} (|#eta| < 0.8);Vtx_{z};", + kTProfile, {{nBinsNch, minNch, maxNch}}); + registry.add("ZposVsEta", "", kTProfile, {axisZpos}); registry.add("EtaVsPhi", ";#eta;#varphi", kTH2F, {{{axisEta}, {100, -0.1 * PI, +2.1 * PI}}}); - registry.add("eta", ";;Entries;", kTH1F, {axisEta}); - registry.add("pt", ";;Entries;", kTH1F, {axisPt}); + registry.add("NchVsPt", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);;", kTH2F, + {{{nBinsNch, minNch, maxNch}, {axisPt}}}); registry.add("sigma1Pt", ";;#sigma(p_{T})/p_{T};", kTProfile, {axisPt}); - registry.add("dcaXYvspT", "", kTH2F, {{{50, -1., 1.}, {axisPt}}}); - registry.add("Nch", ";Nch (|#eta|<0.8);", kTH1F, - {{nBinsNch, -0.5, maxNch}}); - registry.add("ZN", "", kTH1F, {{nBinsZDC, -0.5, maxZN}}); - registry.add("ZNA", "", kTH1F, {{nBinsZDC, -0.5, maxZN}}); - registry.add("ZPA", "", kTH1F, {{nBinsZDC, -0.5, maxZP}}); - registry.add("ZNC", "", kTH1F, {{nBinsZDC, -0.5, maxZN}}); - registry.add("ZPC", "", kTH1F, {{nBinsZDC, -0.5, maxZP}}); - registry.add("ZNvsZEM", "ZNvsZEM; ZEM; ZNA+ZNC", kTH2F, + registry.add("dcaXYvspT", ";DCA_{xy} (cm);;", kTH2F, + {{{50, -1., 1.}, {axisPt}}}); + registry.add("ZN", ";ZNA+ZNC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); + registry.add("ZNA", ";ZNA;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); + registry.add("ZPA", ";ZPA;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZP}}); + registry.add("ZNC", ";ZNC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); + registry.add("ZPC", ";ZPC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZP}}); + registry.add("ZNVsZEM", ";ZEM;ZNA+ZNC;", kTH2F, {{{60, -0.5, maxZEM}, {60, -0.5, maxZN}}}); - registry.add("ZNAvsZNC", "ZNAvsZNC; ZNC; ZNA", kTH2F, + registry.add("ZNAVsZNC", ";ZNC;ZNA", kTH2F, {{{30, -0.5, maxZN}, {30, -0.5, maxZN}}}); - registry.add("ZPAvsZPC", "ZPAvsZPC; ZPA; ZPC", kTH2F, + registry.add("ZPAVsZPC", ";ZPC;ZPA;", kTH2F, {{{100, -0.5, maxZP}, {100, -0.5, maxZP}}}); - registry.add("ZNAvsZPA", "ZNAvsZPA; ZPA; ZNA", kTH2F, + registry.add("ZNAVsZPA", ";ZPA;ZNA;", kTH2F, {{{20, -0.5, maxZP}, {30, -0.5, maxZN}}}); - registry.add("ZNCvsZPC", "ZNCvsZPC; ZPC; ZNC", kTH2F, + registry.add("ZNCVsZPC", ";ZPC;ZNC;", kTH2F, {{{20, -0.5, maxZP}, {30, -0.5, maxZN}}}); - registry.add("ZNCvstdc", "ZNCvstdc; time ZNC; ZNC", kTH2F, + registry.add("ZNCVstdc", ";t_{ZNC};ZNC;", kTH2F, {{{30, -15., 15.}, {nBinsZDC, -0.5, maxZN}}}); - registry.add("ZNAvstdc", "ZNAvstdc; time ZNA; ZNA", kTH2F, + registry.add("ZNAVstdc", ";t_{ZNA};ZNA;", kTH2F, {{{30, -15., 15.}, {30, -0.5, maxZN}}}); - registry.add("ZPCvstdc", "ZPCvstdc; time ZPC; ZPC", kTH2F, + registry.add("ZPCVstdc", ";t_{ZPC};ZPC;", kTH2F, {{{30, -15., 15}, {20, -0.5, maxZP}}}); - registry.add("ZPAvstdc", "ZPAvstdc; time ZPA; ZPA", kTH2F, + registry.add("ZPAVstdc", ";t_{ZPA};ZPA;", kTH2F, {{{30, -15., 15.}, {20, -0.5, maxZP}}}); - registry.add("ZEM1vstdc", "ZEM1vstdc; time ZEM1; ZEM1", kTH2F, + registry.add("ZEM1Vstdc", ";t_{ZEM1};ZEM1;", kTH2F, {{{30, -15., 15.}, {30, -0.5, 2000.5}}}); - registry.add("ZEM2vstdc", "ZEM2vstdc; time ZEM2; ZEM2", kTH2F, + registry.add("ZEM2Vstdc", ";t_{ZEM2};ZEM2;", kTH2F, {{{30, -15., 15.}, {30, -0.5, 2000.5}}}); registry.add("debunch", ";t_{ZDC}-t_{ZDA};t_{ZDC}+t_{ZDA}", kTH2F, {{{nBinsTDC, minTdc, maxTdc}, {nBinsTDC, minTdc, maxTdc}}}); - registry.add("NchvsFT0C", ";T0C;N_{ch} (|#eta|<0.8);", kTH2F, - {{{nBinsAmpFT0, 0., 950.}, {nBinsNch, -0.5, maxNch}}}); - registry.add("NchvsFT0A", ";T0A;N_{ch} (|#eta|<0.8);", kTH2F, - {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsNch, -0.5, maxNch}}}); - registry.add("NchvsFV0A", ";V0A;N_{ch} (|#eta|<0.8);", kTH2F, - {{{nBinsAmpFV0, 0., maxAmpFV0}, {nBinsNch, -0.5, maxNch}}}); - registry.add("NchvsNPV", ";NPVTracks (|#eta|<1);N_{ch} (|#eta|<0.8);", - kTH2F, - {{{nBinsNch, -0.5, maxNch}, {nBinsNch, -0.5, maxNch}}}); - registry.add("ZNCvsNch", ";Nch (|#eta|<0.8);ZNC", kTH2F, - {{{nBinsNch, -0.5, maxNch}, {nBinsZDC, -0.5, maxZN}}}); - registry.add("ZNAvsNch", ";Nch (|#eta|<0.8);ZNA", kTH2F, - {{{nBinsNch, -0.5, maxNch}, {nBinsZDC, -0.5, maxZN}}}); - registry.add("ZNvsNch", ";Nch (|#eta|<0.8);ZNA+ZNC", kTH2F, - {{{nBinsNch, -0.5, maxNch}, {nBinsZDC, -0.5, maxZN}}}); + registry.add("NchVsFT0C", ";T0C (#times 1/100);#it{N}_{ch} (|#eta|<0.8);", kTProfile, {{nBinsAmpFT0, 0., 950.}}); + registry.add("NchVsFT0M", ";T0A+T0C (#times 1/100);#it{N}_{ch} (|#eta|<0.8);", kTProfile, {{nBinsAmpFT0, 0., 3000.}}); + registry.add("NchVsFT0A", ";T0A (#times 1/100);#it{N}_{ch} (|#eta|<0.8);", kTProfile, {{nBinsAmpFT0, 0., maxAmpFT0}}); + registry.add("NchVsFV0A", ";V0A (#times 1/100);#it{N}_{ch} (|#eta|<0.8);", kTProfile, {{nBinsAmpFV0, 0., maxAmpFV0}}); + registry.add("NchVsNPV", ";#it{N}_{PV} (|#eta|<1);#LT ITS+TPC tracks #GT (|#eta|<0.8);", kTProfile, {{nBinsNch, minNch, maxNch}}); + registry.add("NchVsITStracks", ";ITS tracks nCls >= 5;#LTITS+TPC tracks#GT (|#eta|<0.8);", kTProfile, {{nBinsNch, minNch, maxNch}}); + registry.add("ZNCVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNC;", kTH2F, + {{{nBinsNch, minNch, maxNch}, {nBinsZDC, minNch, maxZN}}}); + registry.add("ZNAVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA;", kTH2F, + {{{nBinsNch, minNch, maxNch}, {nBinsZDC, minNch, maxZN}}}); + registry.add("ZNVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA+ZNC;", kTH2F, + {{{nBinsNch, minNch, maxNch}, {nBinsZDC, minNch, maxZN}}}); + registry.add("ZNVsFT0A", ";T0A (#times 1/100);ZNA+ZNC;", kTH2F, + {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsZDC, minNch, maxZN}}}); + registry.add("ZNVsFT0C", ";T0C (#times 1/100);ZNA+ZNC;", kTH2F, + {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsZDC, minNch, maxZN}}}); + registry.add("ZNVsFT0M", ";T0A+T0C (#times 1/100);ZNA+ZNC;", kTH2F, + {{{nBinsAmpFT0, 0., 3000.}, {nBinsZDC, minNch, maxZN}}}); + registry.add("ZNDifVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA-ZNC;", kTH2F, + {{{nBinsNch, minNch, maxNch}, {100, -50., 50.}}}); } if (doprocessMCclosure || doprocessZdcCollAss) { + registry.add("NchRaw", ";#it{N}_{ch} (|#eta| < 0.8);", kTH1F, + {{nBinsNch, minNch, maxNch}}); + registry.add("Nch", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);", kTH1F, + {{nBinsNch, minNch, maxNch}}); registry.add("T0Ccent", ";;Entries", kTH1F, {axisCent}); - registry.add( - PtCorrNames[0].data(), PtCorrTitles[0].data(), kTH2F, - {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); - registry.add( - PtCorrNames[1].data(), PtCorrTitles[1].data(), kTH2F, - {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); - registry.add( - PtCorrNames[2].data(), PtCorrTitles[2].data(), kTH2F, - {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); - registry.add( - PtCorrNames[3].data(), PtCorrTitles[3].data(), kTH2F, - {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); - registry.add("pP1", PsTitles[0].data(), kTProfile, - {{nBinsNch, -0.5, maxNch}}); - registry.add("pW1", WsTitles[0].data(), kTProfile, - {{nBinsNch, -0.5, maxNch}}); - registry.add("pP2", PsTitles[1].data(), kTProfile, - {{nBinsNch, -0.5, maxNch}}); - registry.add("pW2", WsTitles[1].data(), kTProfile, - {{nBinsNch, -0.5, maxNch}}); - registry.add("pP3", PsTitles[2].data(), kTProfile, - {{nBinsNch, -0.5, maxNch}}); - registry.add("pW3", WsTitles[2].data(), kTProfile, - {{nBinsNch, -0.5, maxNch}}); - registry.add("pP4", PsTitles[3].data(), kTProfile, - {{nBinsNch, -0.5, maxNch}}); - registry.add("pW4", WsTitles[3].data(), kTProfile, - {{nBinsNch, -0.5, maxNch}}); + registry.add("NchVsOneParCorr", PsTitles[0].data(), kTProfile, + {{nBinsNch, minNch, maxNch}}); + registry.add("NchVsTwoParCorr", PsTitles[1].data(), kTProfile, + {{nBinsNch, minNch, maxNch}}); + registry.add("NchVsThreeParCorr", PsTitles[2].data(), kTProfile, + {{nBinsNch, minNch, maxNch}}); + registry.add("NchVsFourParCorr", PsTitles[3].data(), kTProfile, + {{nBinsNch, minNch, maxNch}}); } // MC Histograms @@ -352,48 +321,16 @@ struct UccZdc { } if (doprocessMCclosure) { - // registry.add("nRecColvsCent", "", kTH2F, {{6, -0.5, 5.5}, - // {{axisCent}}}); - registry.add( - PtCorrMCNchNames[0].data(), PtCorrTitles[0].data(), kTH2F, - {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); - registry.add( - PtCorrMCNchNames[1].data(), PtCorrTitles[1].data(), kTH2F, - {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); - registry.add( - PtCorrMCNchNames[2].data(), PtCorrTitles[2].data(), kTH2F, - {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); - registry.add( - PtCorrMCNchNames[3].data(), PtCorrTitles[3].data(), kTH2F, - {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); - registry.add("pP1MC", PsTitles[0].data(), kTProfile, - {{nBinsNch, -0.5, maxNch}}); - registry.add("pW1MC", WsTitles[0].data(), kTProfile, - {{nBinsNch, -0.5, maxNch}}); - registry.add("pP2MC", PsTitles[1].data(), kTProfile, - {{nBinsNch, -0.5, maxNch}}); - registry.add("pW2MC", WsTitles[1].data(), kTProfile, - {{nBinsNch, -0.5, maxNch}}); - registry.add("pP3MC", PsTitles[2].data(), kTProfile, - {{nBinsNch, -0.5, maxNch}}); - registry.add("pW3MC", WsTitles[2].data(), kTProfile, - {{nBinsNch, -0.5, maxNch}}); - registry.add("pP4MC", PsTitles[3].data(), kTProfile, - {{nBinsNch, -0.5, maxNch}}); - registry.add("pW4MC", WsTitles[3].data(), kTProfile, - {{nBinsNch, -0.5, maxNch}}); - registry.add( - PtCorrMCNchMCNames[0].data(), PtCorrTitles[0].data(), kTH2F, - {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); - registry.add( - PtCorrMCNchMCNames[1].data(), PtCorrTitles[1].data(), kTH2F, - {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); - registry.add( - PtCorrMCNchMCNames[2].data(), PtCorrTitles[2].data(), kTH2F, - {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); - registry.add( - PtCorrMCNchMCNames[3].data(), PtCorrTitles[3].data(), kTH2F, - {{{nBinsNch, -0.5, maxNch}, {nBinsMeanpT, minMeanpT, maxMeanpT}}}); + registry.add("NchGen", ";Nch;Entries;", kTH1F, + {{nBinsNch, minNch, maxNch}}); + registry.add("NchvsOneParCorrGen", PsTitles[0].data(), kTProfile, + {{nBinsNch, minNch, maxNch}}); + registry.add("NchvsTwoParCorrGen", PsTitles[1].data(), kTProfile, + {{nBinsNch, minNch, maxNch}}); + registry.add("NchvsThreeParCorrGen", PsTitles[2].data(), kTProfile, + {{nBinsNch, minNch, maxNch}}); + registry.add("NchvsFourParCorrGen", PsTitles[3].data(), kTProfile, + {{nBinsNch, minNch, maxNch}}); } ccdb->setURL(uRl.value); @@ -419,29 +356,58 @@ struct UccZdc { } registry.fill(HIST("hEventCounter"), EvCutLabel::SelEigth); - if (isApplySameBunchPileup && - !col.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { + if (!col.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { return false; } registry.fill(HIST("hEventCounter"), EvCutLabel::NoSameBunchPileup); - if (isApplyGoodZvtxFT0vsPV && - !col.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { + if (!col.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { return false; } registry.fill(HIST("hEventCounter"), EvCutLabel::IsGoodZvtxFT0vsPV); - if (isApplyVertexITSTPC && - !col.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) { - return false; + if (isNoCollInTimeRangeStrict) { + if (!col.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStrict)) { + return false; + } + registry.fill(HIST("hEventCounter"), EvCutLabel::NoCollInTimeRangeStrict); } - registry.fill(HIST("hEventCounter"), EvCutLabel::IsVertexITSTPC); - if (isApplyVertexTOFmatched && - !col.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) { - return false; + if (isNoCollInTimeRangeStandard) { + if (!col.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + return false; + } + registry.fill(HIST("hEventCounter"), EvCutLabel::NoCollInTimeRangeStandard); + } + + if (isNoCollInRofStrict) { + if (!col.selection_bit(o2::aod::evsel::kNoCollInRofStrict)) { + return false; + } + registry.fill(HIST("hEventCounter"), EvCutLabel::NoCollInRofStrict); + } + + if (isNoCollInRofStandard) { + if (!col.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { + return false; + } + registry.fill(HIST("hEventCounter"), EvCutLabel::NoCollInRofStandard); + } + + if (isNoHighMultCollInPrevRof) { + if (!col.selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof)) { + return false; + } + registry.fill(HIST("hEventCounter"), EvCutLabel::NoHighMultCollInPrevRof); + } + + // To be used in combination with FT0C-based occupancy + if (isNoCollInTimeRangeNarrow) { + if (!col.selection_bit(o2::aod::evsel::kNoCollInTimeRangeNarrow)) { + return false; + } + registry.fill(HIST("hEventCounter"), EvCutLabel::NoCollInTimeRangeNarrow); } - registry.fill(HIST("hEventCounter"), EvCutLabel::IsVertexTOFmatched); if (isOccupancyCut) { auto occuValue{isApplyFT0CbasedOccupancy @@ -453,13 +419,7 @@ struct UccZdc { } registry.fill(HIST("hEventCounter"), EvCutLabel::OccuCut); - // if (isApplyVertexTRDmatched && - // !col.selection_bit(o2::aod::evsel::kIsVertexTRDmatched)) { - // return false; - // } - // histos.fill(HIST("EventHist"), 7); - - if (col.centFT0C() < 0. || col.centFT0C() > 100.) { + if (col.centFT0C() < minT0CcentCut || col.centFT0C() > maxT0CcentCut) { return false; } registry.fill(HIST("hEventCounter"), EvCutLabel::Centrality); @@ -470,12 +430,6 @@ struct UccZdc { } registry.fill(HIST("hEventCounter"), EvCutLabel::VtxZ); - // T0C centrality cut - if (col.centFT0C() < minT0CcentCut || col.centFT0C() > maxT0CcentCut) { - return false; - } - registry.fill(HIST("hEventCounter"), EvCutLabel::CentralityCut); - return true; } @@ -583,17 +537,17 @@ struct UccZdc { if (std::sqrt(std::pow(tZDCdif, 2.) + std::pow(tZDCsum, 2.)) > tdcCut) { return; } + registry.fill(HIST("hEventCounter"), EvCutLabel::Tdc); } - registry.fill(HIST("hEventCounter"), EvCutLabel::Tdc); // ZEM cut if (isZEMcut) { if (sumZEMs < zemCut) { return; } + registry.fill(HIST("hEventCounter"), EvCutLabel::Zem); } - registry.fill(HIST("hEventCounter"), EvCutLabel::Zem); registry.fill(HIST("zPos"), collision.posZ()); registry.fill(HIST("T0Ccent"), collision.centFT0C()); registry.fill(HIST("ZN"), znA + znC); @@ -601,122 +555,252 @@ struct UccZdc { registry.fill(HIST("ZNC"), znC); registry.fill(HIST("ZPA"), zpA); registry.fill(HIST("ZPC"), zpC); - registry.fill(HIST("ZNAvsZNC"), znC, znA); - registry.fill(HIST("ZNAvsZPA"), zpA, znA); - registry.fill(HIST("ZNCvsZPC"), zpC, znC); - registry.fill(HIST("ZPAvsZPC"), zpC, zpA); - registry.fill(HIST("ZNvsZEM"), sumZEMs, sumZNs); - registry.fill(HIST("ZNCvstdc"), tZNC, znC); - registry.fill(HIST("ZNAvstdc"), tZNA, znA); - registry.fill(HIST("ZPCvstdc"), tZPC, zpC); - registry.fill(HIST("ZPAvstdc"), tZPA, zpA); - registry.fill(HIST("ZEM1vstdc"), tZEM1, aZEM1); - registry.fill(HIST("ZEM2vstdc"), tZEM2, aZEM2); + registry.fill(HIST("ZNAVsZNC"), znC, znA); + registry.fill(HIST("ZNAVsZPA"), zpA, znA); + registry.fill(HIST("ZNCVsZPC"), zpC, znC); + registry.fill(HIST("ZPAVsZPC"), zpC, zpA); + registry.fill(HIST("ZNVsZEM"), sumZEMs, sumZNs); + registry.fill(HIST("ZNCVstdc"), tZNC, znC); + registry.fill(HIST("ZNAVstdc"), tZNA, znA); + registry.fill(HIST("ZPCVstdc"), tZPC, zpC); + registry.fill(HIST("ZPAVstdc"), tZPA, zpA); + registry.fill(HIST("ZEM1Vstdc"), tZEM1, aZEM1); + registry.fill(HIST("ZEM2Vstdc"), tZEM2, aZEM2); registry.fill(HIST("debunch"), tZDCdif, tZDCsum); std::vector pTs; std::vector wIs; + float itsTracks{0.}; // Calculates the event weight, W_k for (const auto& track : tracks) { + if (track.hasITS() && track.itsNCls() >= minITSnCls) { + itsTracks++; + } // Track Selection if (!track.isGlobalTrack()) { continue; } registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); - registry.fill(HIST("eta"), track.eta()); - registry.fill(HIST("pt"), track.pt()); registry.fill(HIST("sigma1Pt"), track.pt(), track.sigma1Pt()); registry.fill(HIST("dcaXYvspT"), track.dcaXY(), track.pt()); float pt{track.pt()}; - double trkEff{efficiency->GetBinContent(efficiency->FindBin(pt))}; - if (trkEff > 0.) { + double weight{efficiency->GetBinContent(efficiency->FindBin(pt))}; + if (weight > 0.) { pTs.emplace_back(pt); - wIs.emplace_back(trkEff); + wIs.emplace_back(weight); } } double p1, p2, p3, p4, w1, w2, w3, w4; p1 = p2 = p3 = p4 = w1 = w2 = w3 = w4 = 0.0; - getMoments(pTs, wIs, p1, w1, p2, w2, p3, w3, p4, w4); + getPTpowers(pTs, wIs, p1, w1, p2, w2, p3, w3, p4, w4); const double nch{static_cast(pTs.size())}; - if (std::isnan(p1) || std::isnan(p2) || std::isnan(p3) || std::isnan(p4) || - p1 == 0.0 || p2 == 0.0 || p3 == 0.0 || p4 == 0.0) { - return; - } - if (std::isnan(w1) || std::isnan(w2) || std::isnan(w3) || std::isnan(w4) || - w1 == 0.0 || w2 == 0.0 || w3 == 0.0 || w4 == 0.0) { + if (!(nch != 0.)) return; + + registry.fill(HIST("NchVsFV0A"), aV0A / 100., nch); + registry.fill(HIST("NchVsFT0A"), aT0A / 100., nch); + registry.fill(HIST("NchVsFT0C"), aT0C / 100., nch); + registry.fill(HIST("NchVsFT0M"), (aT0A + aT0C) / 100., nch); + registry.fill(HIST("ZNVsFT0A"), aT0A / 100., sumZNs); + registry.fill(HIST("ZNVsFT0C"), aT0C / 100., sumZNs); + registry.fill(HIST("ZNVsFT0M"), (aT0A + aT0C) / 100., sumZNs); + registry.fill(HIST("NchVsNPV"), collision.multNTracksPVeta1(), nch); + registry.fill(HIST("NchVsITStracks"), itsTracks, nch); + registry.fill(HIST("ZNAVsNch"), nch, znA); + registry.fill(HIST("ZNCVsNch"), nch, znC); + registry.fill(HIST("ZNVsNch"), nch, sumZNs); + registry.fill(HIST("ZNDifVsNch"), nch, znA - znC); + registry.fill(HIST("NchVsZpos"), nch, collision.posZ()); + + // QA check + for (const auto& track : tracks) { + // Track Selection + if (!track.isGlobalTrack()) { + continue; + } + registry.fill(HIST("NchVsPt"), w1, track.pt()); + registry.fill(HIST("ZposVsEta"), collision.posZ(), track.eta()); } - // oneParCorr = P1 / W1 + // EbE one-particle pT correlation + // P1 / W1 double oneParCorr{p1 / w1}; - // twoParCorr = (P1^{2} - P2)/(W1^{2} - W2) - double twoParCorr{(std::pow(p1, 2.) - p2) / (std::pow(w1, 2.) - w2)}; - // threeParCorr = (P1^{3} − 3P2P1 + 2P3)/(W1^{3} − 3W2W1 + 2W3) - double threeParCorr{(std::pow(p1, 3.) - 3. * p2 * p1 + 2. * p3) / - (std::pow(w1, 3.) - 3. * w2 * w1 + 2. * w3)}; - // fourParCorr = (P1^{4} − 6P2P1^{2} + 3P2^{2} + 8P3P1 − 6P4)/(W1^{4} − - // 6W2W1^{2} + 3W2^{2} + 8W3W1 − 6W4) - double fourParCorr{(std::pow(p1, 4.) - 6. * p2 * std::pow(p1, 2.) + - 3. * std::pow(p2, 2.) + 8 * p3 * p1 - 6. * p4) / - (std::pow(w1, 4.) - 6. * w2 * std::pow(w1, 2.) + - 3. * std::pow(w2, 2.) + 8 * w3 * w1 - 6. * w4)}; - - registry.fill(HIST("NchvsFV0A"), aV0A / 100., nch); - registry.fill(HIST("NchvsFT0A"), aT0A / 100., nch); - registry.fill(HIST("NchvsFT0C"), aT0C / 100., nch); - registry.fill(HIST("NchvsNPV"), collision.multNTracksPVeta1(), nch); - registry.fill(HIST("Nch"), nch); - registry.fill(HIST("ZNAvsNch"), nch, znA); - registry.fill(HIST("ZNCvsNch"), nch, znC); - registry.fill(HIST("ZNvsNch"), nch, sumZNs); - - if (isZNbasedSel) { - if (isZN && (sumZNs > znBasedCut)) - return; - if (isZNA && (znA > znBasedCut)) - return; - if (isZNC && (znC > znBasedCut)) - return; - } - registry.fill(HIST("NchvsOneParCorr"), nch, oneParCorr); - registry.fill(HIST("NchvsTwoParCorr"), nch, twoParCorr); - registry.fill(HIST("NchvsThreeParCorr"), nch, threeParCorr); - registry.fill(HIST("NchvsFourParCorr"), nch, fourParCorr); - registry.fill(HIST("pP1"), nch, w1 * oneParCorr); - registry.fill(HIST("pW1"), nch, w1); - registry.fill(HIST("pP2"), nch, w2 * twoParCorr); - registry.fill(HIST("pW2"), nch, w2); - registry.fill(HIST("pP3"), nch, w3 * threeParCorr); - registry.fill(HIST("pW3"), nch, w3); - registry.fill(HIST("pP4"), nch, w4 * fourParCorr); - registry.fill(HIST("pW4"), nch, w4); - } + // EbE two-particle pT correlation + // (P1^{2} - P2)/(W1^{2} - W2) + double denTwoParCorr{std::pow(w1, 2.) - w2}; + double numTwoParCorr{std::pow(p1, 2.) - p2}; + double twoParCorr{numTwoParCorr / denTwoParCorr}; + + // EbE three-particle pT correlation + // (P1^{3} − 3P2P1 + 2P3)/(W1^{3} − 3W2W1 + 2W3) + double denThreeParCorr{std::pow(w1, 3.) - 3. * w2 * w1 + 2. * w3}; + double numThreeParCorr{std::pow(p1, 3.) - 3. * p2 * p1 + 2. * p3}; + double threeParCorr{numThreeParCorr / denThreeParCorr}; + + // EbE four-particle pT correlation + // (P1^{4} − 6P2P1^{2} + 3P2^{2} + 8P3P1 − 6P4)/(W1^{4} − 6W2W1^{2} + + // 3W2^{2} + 8W3W1 − 6W4) + double denFourParCorr{std::pow(w1, 4.) - 6. * w2 * std::pow(w1, 2.) + + 3. * std::pow(w2, 2.) + 8 * w3 * w1 - 6. * w4}; + double numFourParCorr{std::pow(p1, 4.) - 6. * p2 * std::pow(p1, 2.) + + 3. * std::pow(p2, 2.) + 8 * p3 * p1 - 6. * p4}; + double fourParCorr{numFourParCorr / denFourParCorr}; + + if (isZNbasedSel && (sumZNs > znBasedCut)) + return; + if (isZNAbasedSel && (znA > znBasedCut)) + return; + if (isZNCbasedSel && (znC > znBasedCut)) + return; + + registry.fill(HIST("Nch"), w1); + registry.fill(HIST("NchRaw"), nch); + registry.fill(HIST("NchVsOneParCorr"), w1, oneParCorr, w1); + registry.fill(HIST("NchVsTwoParCorr"), w1, twoParCorr, denTwoParCorr); + registry.fill(HIST("NchVsThreeParCorr"), w1, threeParCorr, denThreeParCorr); + registry.fill(HIST("NchVsFourParCorr"), w1, fourParCorr, denFourParCorr); + } PROCESS_SWITCH(UccZdc, processZdcCollAss, "Process ZDC W/Coll Ass.", true); - template - void getMoments(const T& pTs, const T& wIs, U& pOne, U& wOne, U& pTwo, - U& wTwo, U& pThree, U& wThree, U& pFour, U& wFour) + void processMCclosure( + aod::McCollisions::iterator const& mccollision, + soa::SmallGroups const& collisions, + aod::McParticles const& mcParticles, + TheFilteredSimTracks const& simTracks) { - pOne = wOne = pTwo = wTwo = pThree = wThree = pFour = wFour = 0.; + //----- MC reconstructed -----// + for (const auto& collision : collisions) { + // Event selection + if (!isEventSelected(collision)) + continue; + // MC collision? + if (!collision.has_mcCollision()) + continue; - for (std::size_t i = 0; i < pTs.size(); ++i) { - const float pTi{pTs.at(i)}; - const float wEighti{wIs.at(i)}; - pOne += wEighti * pTi; - wOne += wEighti; - pTwo += std::pow(wEighti * pTi, 2.); - wTwo += std::pow(wEighti, 2.); - pThree += std::pow(wEighti * pTi, 3.); - wThree += std::pow(wEighti, 3.); - pFour += std::pow(wEighti * pTi, 4.); - wFour += std::pow(wEighti, 4.); + const auto& cent{collision.centFT0C()}; + registry.fill(HIST("T0Ccent"), cent); + registry.fill(HIST("zPos"), collision.posZ()); + // registry.fill(HIST("nRecColvsCent"), collisions.size(), cent); + + const auto& groupedTracks = + simTracks.sliceBy(perCollision, collision.globalIndex()); + + std::vector pTs; + std::vector wIs; + + // Calculates the event weight, W_k + for (const auto& track : groupedTracks) { + // Track Selection + if (!track.isGlobalTrack()) + continue; + + // To match the primary particles + if (!track.has_mcParticle()) + continue; + const auto& particle = track.mcParticle(); + if (!particle.isPhysicalPrimary()) + continue; + + float pt{track.pt()}; + double trkEff{efficiency->GetBinContent(efficiency->FindBin(pt))}; + if (trkEff > 0.) { + pTs.emplace_back(pt); + wIs.emplace_back(1. / trkEff); + } + } + + const double nch{static_cast(pTs.size())}; + if (!(nch != 0.)) + return; + + double p1, p2, p3, p4, w1, w2, w3, w4; + p1 = p2 = p3 = p4 = w1 = w2 = w3 = w4 = 0.0; + getPTpowers(pTs, wIs, p1, w1, p2, w2, p3, w3, p4, w4); + + const double denTwoParCorr{std::pow(w1, 2.) - w2}; + const double numTwoParCorr{std::pow(p1, 2.) - p2}; + const double denThreeParCorr{std::pow(w1, 3.) - 3. * w2 * w1 + 2. * w3}; + const double numThreeParCorr{std::pow(p1, 3.) - 3. * p2 * p1 + 2. * p3}; + const double denFourParCorr{ + std::pow(w1, 4.) - 6. * w2 * std::pow(w1, 2.) + + 3. * std::pow(w2, 2.) + 8 * w3 * w1 - 6. * w4}; + const double numFourParCorr{ + std::pow(p1, 4.) - 6. * p2 * std::pow(p1, 2.) + + 3. * std::pow(p2, 2.) + 8 * p3 * p1 - 6. * p4}; + + const double oneParCorr{p1 / w1}; + const double twoParCorr{numTwoParCorr / denTwoParCorr}; + const double threeParCorr{numThreeParCorr / denThreeParCorr}; + const double fourParCorr{numFourParCorr / denFourParCorr}; + + registry.fill(HIST("Nch"), w1); + registry.fill(HIST("NchRaw"), nch); + registry.fill(HIST("NchVsOneParCorr"), w1, oneParCorr, w1); + registry.fill(HIST("NchVsTwoParCorr"), w1, twoParCorr, denTwoParCorr); + registry.fill(HIST("NchVsThreeParCorr"), w1, threeParCorr, + denThreeParCorr); + registry.fill(HIST("NchVsFourParCorr"), w1, fourParCorr, denFourParCorr); + + //--------------------------- Generated MC --------------------------- + if (std::fabs(mccollision.posZ()) > posZcut) + continue; + + std::vector pTsMC; + std::vector wIsMC; + + // Calculates the event weight, W_k + for (const auto& particle : mcParticles) { + if (particle.eta() < minEta || particle.eta() > maxEta) + continue; + if (particle.pt() < minPt || particle.pt() > maxPt) + continue; + if (!particle.isPhysicalPrimary()) + continue; + + float pt{particle.pt()}; + pTsMC.emplace_back(pt); + wIsMC.emplace_back(1.); + } + + const double nchMC{static_cast(pTsMC.size())}; + double p1MC, p2MC, p3MC, p4MC, w1MC, w2MC, w3MC, w4MC; + p1MC = p2MC = p3MC = p4MC = w1MC = w2MC = w3MC = w4MC = 0.0; + getPTpowers(pTsMC, wIsMC, p1MC, w1MC, p2MC, w2MC, p3MC, w3MC, p4MC, w4MC); + + const double denTwoParCorrMC{std::pow(w1MC, 2.) - w2MC}; + const double numTwoParCorrMC{std::pow(p1MC, 2.) - p2MC}; + const double denThreeParCorrMC{std::pow(w1MC, 3.) - 3. * w2MC * w1MC + + 2. * w3MC}; + const double numThreeParCorrMC{std::pow(p1MC, 3.) - 3. * p2MC * p1MC + + 2. * p3MC}; + const double denFourParCorrMC{ + std::pow(w1MC, 4.) - 6. * w2MC * std::pow(w1MC, 2.) + + 3. * std::pow(w2MC, 2.) + 8 * w3MC * w1MC - 6. * w4MC}; + const double numFourParCorrMC{ + std::pow(p1MC, 4.) - 6. * p2MC * std::pow(p1MC, 2.) + + 3. * std::pow(p2MC, 2.) + 8 * p3MC * p1MC - 6. * p4MC}; + + const double oneParCorrMC{p1MC / w1MC}; + const double twoParCorrMC{numTwoParCorrMC / denTwoParCorrMC}; + const double threeParCorrMC{numThreeParCorrMC / denThreeParCorrMC}; + const double fourParCorrMC{numFourParCorrMC / denFourParCorrMC}; + + registry.fill(HIST("NchGen"), nchMC); + registry.fill(HIST("NchvsOneParCorrGen"), nchMC, oneParCorrMC, w1MC); + registry.fill(HIST("NchvsTwoParCorrGen"), nchMC, twoParCorrMC, + denTwoParCorrMC); + registry.fill(HIST("NchvsThreeParCorrGen"), nchMC, threeParCorrMC, + denThreeParCorrMC); + registry.fill(HIST("NchvsFourParCorrGen"), nchMC, fourParCorrMC, + denFourParCorrMC); } } + PROCESS_SWITCH(UccZdc, processMCclosure, "Process MC closure", false); Preslice perMCCollision = aod::mcparticle::mcCollisionId; Preslice perCollision = aod::track::collisionId; @@ -819,130 +903,25 @@ struct UccZdc { } PROCESS_SWITCH(UccZdc, processpTEff, "Process pT Eff", false); - void processMCclosure( - aod::McCollisions::iterator const& mccollision, - soa::SmallGroups const& collisions, - aod::McParticles const& mcParticles, - TheFilteredSimTracks const& simTracks) + template + void getPTpowers(const T& pTs, const T& wIs, U& pOne, U& wOne, U& pTwo, + U& wTwo, U& pThree, U& wThree, U& pFour, U& wFour) { - //----- MC reconstructed -----// - for (const auto& collision : collisions) { - // Event selection - if (!isEventSelected(collision)) - continue; - // MC collision? - if (!collision.has_mcCollision()) - continue; - - const auto& cent{collision.centFT0C()}; - registry.fill(HIST("T0Ccent"), cent); - registry.fill(HIST("zPos"), collision.posZ()); - // registry.fill(HIST("nRecColvsCent"), collisions.size(), cent); - - const auto& groupedTracks = - simTracks.sliceBy(perCollision, collision.globalIndex()); - - std::vector pTs; - std::vector wIs; - - // Calculates the event weight, W_k - for (const auto& track : groupedTracks) { - // Track Selection - if (!track.isGlobalTrack()) - continue; - - float pt{track.pt()}; - double trkEff{efficiency->GetBinContent(efficiency->FindBin(pt))}; - if (trkEff > 0.) { - pTs.emplace_back(pt); - wIs.emplace_back(trkEff); - } - } - - const double nch{static_cast(pTs.size())}; - double p1, p2, p3, p4, w1, w2, w3, w4; - p1 = p2 = p3 = p4 = w1 = w2 = w3 = w4 = 0.0; - getMoments(pTs, wIs, p1, w1, p2, w2, p3, w3, p4, w4); - - double oneParCorr{p1 / w1}; - double twoParCorr{(std::pow(p1, 2.) - p2) / (std::pow(w1, 2.) - w2)}; - double threeParCorr{(std::pow(p1, 3.) - 3. * p2 * p1 + 2. * p3) / - (std::pow(w1, 3.) - 3. * w2 * w1 + 2. * w3)}; - double fourParCorr{(std::pow(p1, 4.) - 6. * p2 * std::pow(p1, 2.) + - 3. * std::pow(p2, 2.) + 8 * p3 * p1 - 6. * p4) / - (std::pow(w1, 4.) - 6. * w2 * std::pow(w1, 2.) + - 3. * std::pow(w2, 2.) + 8 * w3 * w1 - 6. * w4)}; - - registry.fill(HIST("NchvsOneParCorr"), nch, oneParCorr); - registry.fill(HIST("NchvsTwoParCorr"), nch, twoParCorr); - registry.fill(HIST("NchvsThreeParCorr"), nch, threeParCorr); - registry.fill(HIST("NchvsFourParCorr"), nch, fourParCorr); - registry.fill(HIST("pP1"), nch, w1 * oneParCorr); - registry.fill(HIST("pW1"), nch, w1); - registry.fill(HIST("pP2"), nch, w2 * twoParCorr); - registry.fill(HIST("pW2"), nch, w2); - registry.fill(HIST("pP3"), nch, w3 * threeParCorr); - registry.fill(HIST("pW3"), nch, w3); - registry.fill(HIST("pP4"), nch, w4 * fourParCorr); - registry.fill(HIST("pW4"), nch, w4); - - // Generated MC - if (std::fabs(mccollision.posZ()) > posZcut) - continue; - - std::vector pTsMC; - std::vector wIsMC; - - // Calculates the event weight, W_k - for (const auto& particle : mcParticles) { - if (particle.eta() < minEta || particle.eta() > maxEta) - continue; - if (particle.pt() < minPt || particle.pt() > maxPt) - continue; - if (!particle.isPhysicalPrimary()) - continue; - - float pt{particle.pt()}; - pTsMC.emplace_back(pt); - wIsMC.emplace_back(1.); - } + pOne = wOne = pTwo = wTwo = pThree = wThree = pFour = wFour = 0.; - const double nchMC{static_cast(pTsMC.size())}; - double p1MC, p2MC, p3MC, p4MC, w1MC, w2MC, w3MC, w4MC; - p1MC = p2MC = p3MC = p4MC = w1MC = w2MC = w3MC = w4MC = 0.0; - getMoments(pTsMC, wIsMC, p1MC, w1MC, p2MC, w2MC, p3MC, w3MC, p4MC, w4MC); - - double oneParCorrMC{p1MC / w1MC}; - double twoParCorrMC{(std::pow(p1MC, 2.) - p2MC) / - (std::pow(w1MC, 2.) - w2MC)}; - double threeParCorrMC{ - (std::pow(p1MC, 3.) - 3. * p2MC * p1MC + 2. * p3MC) / - (std::pow(w1MC, 3.) - 3. * w2MC * w1MC + 2. * w3MC)}; - double fourParCorrMC{ - (std::pow(p1MC, 4.) - 6. * p2MC * std::pow(p1MC, 2.) + - 3. * std::pow(p2MC, 2.) + 8 * p3MC * p1MC - 6. * p4MC) / - (std::pow(w1MC, 4.) - 6. * w2MC * std::pow(w1MC, 2.) + - 3. * std::pow(w2MC, 2.) + 8 * w3MC * w1MC - 6. * w4MC)}; - - registry.fill(HIST("NchvsOneParCorrMC"), nch, oneParCorrMC); - registry.fill(HIST("NchvsTwoParCorrMC"), nch, twoParCorrMC); - registry.fill(HIST("NchvsThreeParCorrMC"), nch, threeParCorrMC); - registry.fill(HIST("NchvsFourParCorrMC"), nch, fourParCorrMC); - registry.fill(HIST("pP1MC"), nch, w1MC * oneParCorrMC); - registry.fill(HIST("pW1MC"), nch, w1MC); - registry.fill(HIST("pP2MC"), nch, w2MC * twoParCorrMC); - registry.fill(HIST("pW2MC"), nch, w2MC); - registry.fill(HIST("pP3MC"), nch, w3MC * threeParCorrMC); - registry.fill(HIST("pW3MC"), nch, w3MC); - registry.fill(HIST("pP4MC"), nch, w4MC * fourParCorrMC); - registry.fill(HIST("pW4MC"), nch, w4MC); - registry.fill(HIST("NchMCvsOneParCorrMC"), nchMC, oneParCorrMC); - registry.fill(HIST("NchMCvsTwoParCorrMC"), nchMC, twoParCorrMC); - registry.fill(HIST("NchMCvsThreeParCorrMC"), nchMC, threeParCorrMC); - registry.fill(HIST("NchMCvsFourParCorrMC"), nchMC, fourParCorrMC); + for (std::size_t i = 0; i < pTs.size(); ++i) { + const float pTi{pTs.at(i)}; + const float wEighti{wIs.at(i)}; + pOne += wEighti * pTi; + wOne += wEighti; + pTwo += std::pow(wEighti * pTi, 2.); + wTwo += std::pow(wEighti, 2.); + pThree += std::pow(wEighti * pTi, 3.); + wThree += std::pow(wEighti, 3.); + pFour += std::pow(wEighti * pTi, 4.); + wFour += std::pow(wEighti, 4.); } } - PROCESS_SWITCH(UccZdc, processMCclosure, "Process MC closure", false); // Single-Track Selection // template From 30990807d5af10138a77369469e40fbc53b88989 Mon Sep 17 00:00:00 2001 From: lmattei01 <122298453+lmattei01@users.noreply.github.com> Date: Tue, 22 Apr 2025 10:56:48 +0200 Subject: [PATCH 1043/1650] [PWGDQ] Adding new event selection called eventStandardSel8VtxQuality1 (#10900) Co-authored-by: MATTEI --- PWGDQ/Core/CutsLibrary.cxx | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/PWGDQ/Core/CutsLibrary.cxx b/PWGDQ/Core/CutsLibrary.cxx index f9da97e17d7..6c15dd25585 100644 --- a/PWGDQ/Core/CutsLibrary.cxx +++ b/PWGDQ/Core/CutsLibrary.cxx @@ -3946,6 +3946,15 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) return cut; } + if (!nameStr.compare("eventStandardSel8VtxQuality1")) { // kIsSel8 = kIsTriggerTVX && kNoITSROFrameBorder && kNoTimeFrameBorder + cut->AddCut(VarManager::kVtxZ, -10.0, 10.0); + cut->AddCut(VarManager::kIsSel8, 0.5, 1.5); + cut->AddCut(VarManager::kIsNoSameBunch, 0.5, 1.5); + cut->AddCut(VarManager::kIsVertexITSTPC, 0.5, 1.5); + cut->AddCut(VarManager::kIsVertexTOFmatched, 0.5, 1.5); + return cut; + } + if (!nameStr.compare("eventStandardSel8PbPbMultCorr")) { TF1* fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x - 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); fMultPVCutLow->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); From abf2f6130f9e4e59be3062aa9709d50673c50482 Mon Sep 17 00:00:00 2001 From: Ionut Cristian Arsene Date: Tue, 22 Apr 2025 11:07:29 +0200 Subject: [PATCH 1044/1650] [PWGDQ] optimizations in the filter-pp-with-assoc (#10915) Co-authored-by: Ionut Cristian Arsene Co-authored-by: ALICE Action Bot --- PWGDQ/Core/CutsLibrary.cxx | 47 +++ PWGDQ/Core/HistogramsLibrary.cxx | 1 + PWGDQ/TableProducer/tableMaker_withAssoc.cxx | 2 +- PWGDQ/Tasks/filterPPwithAssociation.cxx | 284 ++++++++++--------- 4 files changed, 201 insertions(+), 133 deletions(-) diff --git a/PWGDQ/Core/CutsLibrary.cxx b/PWGDQ/Core/CutsLibrary.cxx index 6c15dd25585..fdc539f3c38 100644 --- a/PWGDQ/Core/CutsLibrary.cxx +++ b/PWGDQ/Core/CutsLibrary.cxx @@ -119,6 +119,53 @@ AnalysisCompositeCut* o2::aod::dqcuts::GetCompositeCut(const char* cutName) cut->AddCut(pidCuts); return cut; } + + if (!nameStr.compare("Electron2025_4")) { + AnalysisCut* kineCut = new AnalysisCut("kineCut", "kine cut"); + kineCut->AddCut(VarManager::kP, 1.0, 1000.0); + kineCut->AddCut(VarManager::kEta, -0.9, 0.9); + + AnalysisCut* qualityCuts = new AnalysisCut("qualityCuts", "quality cuts"); + qualityCuts->AddCut(VarManager::kIsITSibAny, 0.5, 1.5); + qualityCuts->AddCut(VarManager::kTPCchi2, 0.0, 5.0); + qualityCuts->AddCut(VarManager::kTPCncls, 60, 161.); + qualityCuts->AddCut(VarManager::kTrackDCAz, -0.5, 0.5); + + AnalysisCut* pidCuts = new AnalysisCut("pidCuts", "pid cuts"); + pidCuts->AddCut(VarManager::kTPCnSigmaEl, -2.5, 4.0, false, VarManager::kPin, 0.0, 5.0); + pidCuts->AddCut(VarManager::kTPCnSigmaEl, -1.5, 4.0, false, VarManager::kPin, 5.0, 1000.0); + pidCuts->AddCut(VarManager::kTPCnSigmaPi, 2.5, 999, false, VarManager::kPin, 0.0, 5.0); + pidCuts->AddCut(VarManager::kTPCnSigmaPr, 3.0, 999, false, VarManager::kPin, 0.0, 5.0); + + cut->AddCut(kineCut); + cut->AddCut(qualityCuts); + cut->AddCut(pidCuts); + return cut; + } + + if (!nameStr.compare("Electron2025_5")) { + AnalysisCut* kineCut = new AnalysisCut("kineCut", "kine cut"); + kineCut->AddCut(VarManager::kP, 1.0, 1000.0); + kineCut->AddCut(VarManager::kEta, -0.9, 0.9); + + AnalysisCut* qualityCuts = new AnalysisCut("qualityCuts", "quality cuts"); + qualityCuts->AddCut(VarManager::kIsITSibAny, 0.5, 1.5); + qualityCuts->AddCut(VarManager::kTPCchi2, 0.0, 5.0); + qualityCuts->AddCut(VarManager::kTPCncls, 60, 161.); + qualityCuts->AddCut(VarManager::kTrackDCAz, -0.5, 0.5); + + AnalysisCut* pidCuts = new AnalysisCut("pidCuts", "pid cuts"); + pidCuts->AddCut(VarManager::kTPCnSigmaEl, -2.25, 4.0, false, VarManager::kPin, 0.0, 5.0); + pidCuts->AddCut(VarManager::kTPCnSigmaEl, -1.5, 4.0, false, VarManager::kPin, 5.0, 1000.0); + pidCuts->AddCut(VarManager::kTPCnSigmaPi, 2.5, 999, false, VarManager::kPin, 0.0, 5.0); + pidCuts->AddCut(VarManager::kTPCnSigmaPr, 3.0, 999, false, VarManager::kPin, 0.0, 5.0); + + cut->AddCut(kineCut); + cut->AddCut(qualityCuts); + cut->AddCut(pidCuts); + return cut; + } + if (!nameStr.compare("LowMassElectron2023")) { cut->AddCut(GetAnalysisCut("lmeeStandardKine")); cut->AddCut(GetAnalysisCut("LooseGlobalTrackRun3")); diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 4134b84d953..dfbda4a4a67 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -168,6 +168,7 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "TPCoccupMedianTimeShortA", "TPC occupancy from pileup, median time, A-side, short time range", false, 100, -20.0, 20.0, VarManager::kNTPCmedianTimeShortA); hm->AddHistogram(histClass, "TPCoccupMedianTimeShortC", "TPC occupancy from pileup, median time, C-side, short time range", false, 100, -20.0, 20.0, VarManager::kNTPCmedianTimeShortC); hm->AddHistogram(histClass, "TPCoccupMedianTimeShortAvsC", "TPC occupancy from pileup, median time, A-side vs C-side, short time range", false, 100, -20.0, 20.0, VarManager::kNTPCmedianTimeShortA, 100, -20.0, 20.0, VarManager::kNTPCmedianTimeShortC); + hm->AddHistogram(histClass, "TPCoccupContribLongA_TrackOccup", "TPC occupancy from pileup, n-contrib, A-side, long time range vs common track occup", false, 100, 0.0, 10000.0, VarManager::kNTPCcontribLongA, 100, 0.0, 10000.0, VarManager::kTrackOccupancyInTimeRange); hm->AddHistogram(histClass, "NcontribReal_centT0C", "Ncontrib vs Cent", false, 100, 0, 100, VarManager::kCentFT0C, 4000, 0, 4000, VarManager::kVtxNcontribReal); hm->AddHistogram(histClass, "globalTracks_centT0C", "globalTracks vs Cent", false, 100, 0, 100, VarManager::kCentFT0C, 4000, 0, 4000, VarManager::kMultA); hm->AddHistogram(histClass, "ITSTPCTracks_centT0C", "ITSTPCTracks vs Cent", false, 100, 0, 100, VarManager::kCentFT0C, 4000, 0, 4000, VarManager::kMultAllTracksITSTPC); diff --git a/PWGDQ/TableProducer/tableMaker_withAssoc.cxx b/PWGDQ/TableProducer/tableMaker_withAssoc.cxx index 1d71d8b362e..7adb6fbf23c 100644 --- a/PWGDQ/TableProducer/tableMaker_withAssoc.cxx +++ b/PWGDQ/TableProducer/tableMaker_withAssoc.cxx @@ -360,7 +360,7 @@ struct TableMaker { // Check whether we have to define barrel or muon histograms bool enableBarrelHistos = (context.mOptions.get("processPPWithFilter") || context.mOptions.get("processPPWithFilterBarrelOnly") || context.mOptions.get("processPPBarrelOnly") || context.mOptions.get("processPbPb") || context.mOptions.get("processPbPbBarrelOnly") || context.mOptions.get("processPbPbBarrelOnlyWithV0Bits") || context.mOptions.get("processPbPbBarrelOnlyWithV0BitsNoTOF")) || - context.mOptions.get("processPbPbWithFilterBarrelOnly"); + context.mOptions.get("processPbPbWithFilterBarrelOnly") || context.mOptions.get("processPPBarrelOnlyWithV0s"); bool enableMuonHistos = (context.mOptions.get("processPPWithFilter") || context.mOptions.get("processPPWithFilterMuonOnly") || context.mOptions.get("processPPWithFilterMuonMFT") || context.mOptions.get("processPPMuonOnly") || context.mOptions.get("processPPMuonMFT") || context.mOptions.get("processPPMuonMFTWithMultsExtra") || context.mOptions.get("processPbPb") || context.mOptions.get("processPbPbMuonOnly") || context.mOptions.get("processPbPbMuonMFT")); diff --git a/PWGDQ/Tasks/filterPPwithAssociation.cxx b/PWGDQ/Tasks/filterPPwithAssociation.cxx index 5b109326567..34a3d053312 100644 --- a/PWGDQ/Tasks/filterPPwithAssociation.cxx +++ b/PWGDQ/Tasks/filterPPwithAssociation.cxx @@ -105,21 +105,29 @@ using MyBarrelTracks = soa::Join; -using MyBarrelTracksSelected = soa::Join; +using MyBarrelTracksTPCPID = soa::Join; + using MyBarrelTracksAssocSelected = soa::Join; // As the kinelatic values must be re-computed for the tracks everytime it is associated to a collision, the selection is done not on the tracks, but on the track-collision association using MyMuons = soa::Join; using MyMuonsAssocSelected = soa::Join; // As the kinelatic values must be re-computed for the muons tracks everytime it is associated to a collision, the selection is done not on the muon, but on the muon-collision association -constexpr static uint32_t gkEventFillMap = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision; +constexpr static uint32_t gkEventFillMap = VarManager::ObjTypes::Collision; constexpr static uint32_t gkTrackFillMap = VarManager::ObjTypes::Track | VarManager::ObjTypes::TrackExtra | VarManager::ObjTypes::TrackDCA | VarManager::ObjTypes::TrackPID; +constexpr static uint32_t gkTrackFillMapTPCPID = VarManager::ObjTypes::Track | VarManager::ObjTypes::TrackExtra | VarManager::ObjTypes::TrackDCA | VarManager::ObjTypes::TrackTPCPID; constexpr static uint32_t gkMuonFillMap = VarManager::ObjTypes::Muon | VarManager::ObjTypes::MuonCov; -void DefineHistograms(HistogramManager* histMan, TString histClasses); +void DefineHistograms(HistogramManager* histMan, TString histClasses, TString subgroups = ""); + +template +void PrintBitMap(TMap map, int nbits) +{ + for (int i = 0; i < nbits; i++) { + cout << ((map & (TMap(1) << i)) > 0 ? "1" : "0"); + } +} struct DQEventSelectionTask { Produces eventSel; @@ -129,6 +137,7 @@ struct DQEventSelectionTask { Configurable fConfigEventCuts{"cfgEventCuts", "eventStandard", "Comma separated list of event cuts; multiple cuts are applied with a logical AND"}; Configurable fConfigQA{"cfgWithQA", false, "If true, fill QA histograms"}; + Configurable fConfigHistClasses{"cfgHistClasses", "vtxpp", "Comma separated list of histogram groups to be filled"}; // TODO: configure the histogram classes to be filled by QA void init(o2::framework::InitContext&) @@ -150,14 +159,14 @@ struct DQEventSelectionTask { fHistMan->SetUseDefaultVariableNames(kTRUE); fHistMan->SetDefaultVarNames(VarManager::fgVariableNames, VarManager::fgVariableUnits); - DefineHistograms(fHistMan, "Event_BeforeCuts;Event_AfterCuts;"); // define all histograms + DefineHistograms(fHistMan, "Event_BeforeCuts;Event_AfterCuts;", fConfigHistClasses.value); // define all histograms VarManager::SetUseVars(fHistMan->GetUsedVars()); // provide the list of required variables so that VarManager knows what to fill fOutputList.setObject(fHistMan->GetMainHistogramList()); } } template - void runEventSelection(TEvent const& collision, aod::BCs const& /*bcs*/) + void runEventSelection(TEvent const& collision) { // Reset the Values array VarManager::ResetValues(0, VarManager::kNEventWiseVariables); @@ -176,9 +185,9 @@ struct DQEventSelectionTask { } } - void processEventSelection(MyEvents::iterator const& collision, aod::BCs const& bcs) + void processEventSelection(MyEvents::iterator const& collision) { - runEventSelection(collision, bcs); + runEventSelection(collision); } void processDummy(MyEvents&) @@ -199,7 +208,8 @@ struct DQBarrelTrackSelection { Configurable fConfigCuts{"cfgBarrelTrackCuts", "jpsiPID1", "Comma separated list of barrel track cuts"}; Configurable fConfigCutsForEMu{"cfgBarrelTrackCutsForEMu", "jpsiPID1", "Comma separated list of barrel track cuts"}; Configurable fConfigQA{"cfgWithQA", false, "If true, fill QA histograms"}; - Configurable fPropTrack{"cfgPropTrack", false, "Propgate tracks to associated collision to recalculate DCA and momentum vector"}; + Configurable fConfigHistClasses{"cfgHistClasses", "its,tpcpid,dca", "If true, fill QA histograms"}; + Configurable fPropTrack{"cfgPropTrack", true, "Propgate tracks to associated collision to recalculate DCA and momentum vector"}; Configurable fConfigCcdbUrl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Configurable fConfigCcdbPathTPC{"ccdb-path-tpc", "Users/i/iarsene/Calib/TPCpostCalib", "base path to the ccdb object"}; Configurable fConfigNoLaterThan{"ccdb-no-later-than", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; @@ -255,18 +265,15 @@ struct DQBarrelTrackSelection { fCutHistNames.push_back(Form("TrackBarrel_%s", cut.GetName())); } - DefineHistograms(fHistMan, cutNames.Data()); // define all histograms + DefineHistograms(fHistMan, cutNames.Data(), fConfigHistClasses.value); // define all histograms VarManager::SetUseVars(fHistMan->GetUsedVars()); // provide the list of required variables so that VarManager knows what to fill fOutputList.setObject(fHistMan->GetMainHistogramList()); // CCDB configuration - if (fConfigComputeTPCpostCalib) { - fCCDB->setURL(fConfigCcdbUrl.value); - fCCDB->setCaching(true); - fCCDB->setLocalObjectValidityChecking(); - // Not later than now objects - fCCDB->setCreatedNotAfter(fConfigNoLaterThan.value); - } + fCCDB->setURL(fConfigCcdbUrl.value); + fCCDB->setCaching(true); + fCCDB->setLocalObjectValidityChecking(); + fCCDB->setCreatedNotAfter(fConfigNoLaterThan.value); } } @@ -277,8 +284,14 @@ struct DQBarrelTrackSelection { auto bc = bcs.begin(); // check just the first bc to get the run number if (fCurrentRun != bc.runNumber()) { fCurrentRun = bc.runNumber(); - o2::parameters::GRPMagField* grpo = fCCDB->getForTimeStamp("GLO/Config/GRPMagField", bc.timestamp()); - o2::base::Propagator::initFieldFromGRP(grpo); + + o2::parameters::GRPMagField* grpmag = fCCDB->getForTimeStamp("GLO/Config/GRPMagField", bc.timestamp()); + if (grpmag != nullptr) { + VarManager::SetMagneticField(grpmag->getNominalL3Field()); + } else { + LOGF(fatal, "GRP object is not available in CCDB at timestamp=%llu", bc.timestamp()); + } + if (fConfigComputeTPCpostCalib) { auto calibList = fCCDB->getForTimeStamp(fConfigCcdbPathTPC.value, bc.timestamp()); VarManager::SetCalibrationObject(VarManager::kTPCElectronMean, calibList->FindObject("mean_map_electron")); @@ -292,7 +305,7 @@ struct DQBarrelTrackSelection { // material correction for track propagation // o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT; - o2::base::Propagator::MatCorrType noMatCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; + // o2::base::Propagator::MatCorrType noMatCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; uint32_t filterMap = static_cast(0); uint32_t filterMapEMu = static_cast(0); @@ -309,7 +322,7 @@ struct DQBarrelTrackSelection { VarManager::FillTrack(track); // compute quantities which depend on the associated collision, such as DCA if (fPropTrack && (track.collisionId() != collision.globalIndex())) { - VarManager::FillTrackCollisionMatCorr(track, collision, noMatCorr, o2::base::Propagator::Instance()); + VarManager::FillTrackCollision(track, collision); } if (fConfigQA) { fHistMan->FillHistClass("TrackBarrel_BeforeCuts", VarManager::fgValues); @@ -342,12 +355,21 @@ struct DQBarrelTrackSelection { } } + void processSelectionTPCPID(Collisions const& collisions, aod::BCsWithTimestamps const& bcs, MyBarrelTracksTPCPID const& tracks, aod::TrackAssoc const& trackAssocs) + { + for (auto& collision : collisions) { + auto trackIdsThisCollision = trackAssocs.sliceBy(barrelTrackIndicesPerCollision, collision.globalIndex()); + runTrackSelection(collision, bcs, tracks, trackIdsThisCollision); + } + } + void processDummy(MyBarrelTracks&) { // do nothing } PROCESS_SWITCH(DQBarrelTrackSelection, processSelection, "Run barrel track selection", false); + PROCESS_SWITCH(DQBarrelTrackSelection, processSelectionTPCPID, "Run barrel track selection, just TPC PID (no TOF)", false); PROCESS_SWITCH(DQBarrelTrackSelection, processDummy, "Dummy function", false); }; @@ -360,6 +382,7 @@ struct DQMuonsSelection { Configurable fConfigCuts{"cfgMuonsCuts", "muonQualityCuts", "Comma separated list of ADDITIONAL muon track cuts"}; Configurable fConfigCutsForEMu{"cfgMuonsCutsForEMu", "muonQualityCuts", "Comma separated list of ADDITIONAL muon track cuts"}; Configurable fConfigQA{"cfgWithQA", false, "If true, fill QA histograms"}; + Configurable fConfigHistClasses{"cfgHistClasses", "muon", "If true, fill QA histograms"}; Configurable fPropMuon{"cfgPropMuon", false, "Propgate muon tracks through absorber"}; Configurable fConfigCcdbUrl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; @@ -417,7 +440,7 @@ struct DQMuonsSelection { fCutHistNames.push_back(Form("Muon_%s", fTrackCuts[i].GetName())); } - DefineHistograms(fHistMan, cutNames.Data()); // define all histograms + DefineHistograms(fHistMan, cutNames.Data(), fConfigHistClasses.value); // define all histograms VarManager::SetUseVars(fHistMan->GetUsedVars()); // provide the list of required variables so that VarManager knows what to fill fOutputList.setObject(fHistMan->GetMainHistogramList()); } @@ -722,6 +745,8 @@ struct DQFilterPPTask { VarManager::ResetValues(0, VarManager::kNVars); VarManager::FillEvent(collision); // event properties could be needed for cuts or histogramming + std::vector> taggedCollisions(fNBarrelCuts + fNMuonCuts + fNElectronMuonCuts); // collisions corresponding to selected associations or to which selected tracks are assigned in AO2D + std::vector objCountersBarrel(fNBarrelCuts, 0); // init all counters to zero uint32_t pairingMask = 0; // in order to know which of the selections actually require pairing uint32_t pairFilter = 0; @@ -731,6 +756,11 @@ struct DQFilterPPTask { for (int i = 0; i < fNBarrelCuts; ++i) { if (trackAssoc.isDQBarrelSelected() & (static_cast(1) << i)) { objCountersBarrel[i] += 1; + taggedCollisions[i][collision.globalIndex()] = 1; // add the current associated collision to the map + auto t1 = trackAssoc.template track_as(); + if (t1.has_collision()) { + taggedCollisions[i][t1.collisionId()] = 1; // add the originally assigned collision to the map + } } } } @@ -742,6 +772,7 @@ struct DQFilterPPTask { pairingMask |= (static_cast(1) << i); } objCountersBarrel[i] = 0; // reset counters for selections where pairing is needed (count pairs instead) + taggedCollisions[i].clear(); // empty the list of tagged collisions if pairing is needed (so we count just events with pairs or containing selected pair legs) } } @@ -759,6 +790,7 @@ struct DQFilterPPTask { if (pairFilter == 0) { continue; } + // construct the pair and apply pair cuts VarManager::FillPair(t1, t2); // compute pair quantities for (int icut = 0; icut < fNBarrelCuts; icut++) { @@ -775,9 +807,17 @@ struct DQFilterPPTask { if (!fBarrelPairCuts[icut].IsSelected(VarManager::fgValues)) { continue; } + + taggedCollisions[icut][collision.globalIndex()] = 1; // add the originally assigned collision to the map + if (t1.has_collision()) { + taggedCollisions[icut][t1.collisionId()] = 1; // add the originally assigned collision to the map + } + if (t2.has_collision()) { + taggedCollisions[icut][t2.collisionId()] = 1; // add the originally assigned collision to the map + } + objCountersBarrel[icut] += 1; // count the pair if (fConfigQA) { // fill histograms if QA is enabled - // cout << "=========== filling pair for collision " << collision.globalIndex() << endl; fHistMan->FillHistClass(fBarrelPairHistNames[icut].Data(), VarManager::fgValues); } } @@ -792,6 +832,11 @@ struct DQFilterPPTask { for (int i = 0; i < fNMuonCuts; ++i) { if (muon.isDQMuonSelected() & (static_cast(1) << i)) { objCountersMuon[i] += 1; + taggedCollisions[i + fNBarrelCuts][collision.globalIndex()] = 1; // add the current associated collision to the map + auto t1 = muon.template fwdtrack_as(); + if (t1.has_collision()) { + taggedCollisions[i + fNBarrelCuts][t1.collisionId()] = 1; // add the originally assigned collision to the map + } } } } @@ -804,6 +849,7 @@ struct DQFilterPPTask { pairingMask |= (static_cast(1) << i); } objCountersMuon[i] = 0; // reset counters for selections where pairing is needed (count pairs instead) + taggedCollisions[i + fNBarrelCuts].clear(); // empty the list of tagged collisions if pairing is needed (so we count just events with pairs or containing selected pair legs) } } @@ -841,6 +887,15 @@ struct DQFilterPPTask { if (!fMuonPairCuts[icut].IsSelected(VarManager::fgValues)) { continue; } + + taggedCollisions[icut + fNBarrelCuts][collision.globalIndex()] = 1; // add the originally assigned collision to the map + if (t1.has_collision()) { + taggedCollisions[icut + fNBarrelCuts][t1.collisionId()] = 1; // add the originally assigned collision to the map + } + if (t2.has_collision()) { + taggedCollisions[icut + fNBarrelCuts][t2.collisionId()] = 1; // add the originally assigned collision to the map + } + objCountersMuon[icut] += 1; if (fConfigQA) { fHistMan->FillHistClass(fMuonPairHistNames[icut].Data(), VarManager::fgValues); @@ -892,6 +947,15 @@ struct DQFilterPPTask { if (!fElectronMuonPairCuts[icut].IsSelected(VarManager::fgValues)) { continue; } + + taggedCollisions[icut + fNBarrelCuts + fNMuonCuts][collision.globalIndex()] = 1; // add the originally assigned collision to the map + if (t1.has_collision()) { + taggedCollisions[icut + fNBarrelCuts + fNMuonCuts][t1.collisionId()] = 1; // add the originally assigned collision to the map + } + if (t2.has_collision()) { + taggedCollisions[icut + fNBarrelCuts + fNMuonCuts][t2.collisionId()] = 1; // add the originally assigned collision to the map + } + objCountersElectronMuon[icut] += 1; if (fConfigQA) { fHistMan->FillHistClass(fElectronMuonPairHistNames[icut].Data(), VarManager::fgValues); @@ -906,6 +970,8 @@ struct DQFilterPPTask { for (int i = 0; i < fNBarrelCuts; i++) { if (objCountersBarrel[i] >= fBarrelNreqObjs[i]) { filter |= (static_cast(1) << i); + } else { + taggedCollisions[i].clear(); } } } @@ -913,6 +979,8 @@ struct DQFilterPPTask { for (int i = 0; i < fNMuonCuts; i++) { if (objCountersMuon[i] >= fMuonNreqObjs[i]) { filter |= (static_cast(1) << (i + fNBarrelCuts)); + } else { + taggedCollisions[i + fNBarrelCuts].clear(); } } } @@ -920,58 +988,13 @@ struct DQFilterPPTask { for (int i = 0; i < fNElectronMuonCuts; i++) { if (objCountersElectronMuon[i] >= fElectronMuonNreqObjs[i]) { filter |= (static_cast(1) << (i + fNBarrelCuts + fNMuonCuts)); + } else { + taggedCollisions[i + fNBarrelCuts + fNMuonCuts].clear(); } } } - return filter; - } - Preslice trackIndicesPerCollision = track_association::collisionId; - Preslice muonIndicesPerCollision = track_association::collisionId; - - void processFilterPP(MyEventsSelected const& collisions, - aod::BCsWithTimestamps const& bcs, - MyBarrelTracksSelected const& tracks, - MyMuons const& muons, - MyBarrelTracksAssocSelected const& trackAssocs, MyMuonsAssocSelected const& muonAssocs) - { - fFiltersMap.clear(); - fCEFPfilters.clear(); - - cout << "------------------- filterPP, n assocs barrel/muon :: " << trackAssocs.size() << " / " << muonAssocs.size() << endl; - - uint64_t barrelMask = 0; - for (int i = 0; i < fNBarrelCuts; i++) { - barrelMask |= (static_cast(1) << i); - } - uint64_t muonMask = 0; - for (int i = fNBarrelCuts; i < fNBarrelCuts + fNMuonCuts; i++) { - muonMask |= (static_cast(1) << i); - } - // Loop over collisions - // int event = 0; - int eventsFired = 0; - for (const auto& collision : collisions) { - // skip those that do not pass our selection - if (!collision.isDQEventSelected()) { - // event++; - continue; - } - // group the tracks and muons for this collision - auto groupedTrackIndices = trackAssocs.sliceBy(trackIndicesPerCollision, collision.globalIndex()); - auto groupedMuonIndices = muonAssocs.sliceBy(muonIndicesPerCollision, collision.globalIndex()); - - uint64_t filter = 0; - // if there is at least one track or muon, run the filtering function and compute triggers - if (groupedTrackIndices.size() > 0 || groupedMuonIndices.size() > 0) { - filter = runFilterPP(collision, bcs, tracks, muons, groupedTrackIndices, groupedMuonIndices); - } - if (filter == 0) { - // event++; - continue; - } - eventsFired++; - // compute the CEPF decisions (this is done in a spacial setup with exactly kNTriggersDQ configured triggers) + if (filter > 0) { std::vector decisions(kNTriggersDQ, false); // event decisions to be transmitted to CEFP for (int i = 0; i < fNBarrelCuts; i++) { if (filter & (static_cast(1) << i)) { @@ -1008,59 +1031,58 @@ struct DQFilterPPTask { } } - // Now check through the associated tracks / fwdtracks and assign the same filter to their parent collisions - // This is needed since if a collision was selected because of a track association from a neighbouring collision, - // then one needs to select also that collision in order to be able to redo the pairing at analysis time. - if (filter & barrelMask) { - for (auto& a : groupedTrackIndices) { - auto t = a.template track_as(); - if (!t.has_collision()) { - continue; - } - auto tColl = t.collisionId(); - if (tColl == collision.globalIndex()) { // track from this collision, nothing to do - continue; - } else { - if (fFiltersMap.find(tColl) == fFiltersMap.end()) { - fFiltersMap[tColl] = filter; - fCEFPfilters[tColl] = decisions; - } else { // this collision was already fired, possible via collision - track association; add as an OR the new decisions - fFiltersMap[tColl] |= filter; - for (int i = 0; i < kNTriggersDQ; i++) { - if (decisions[i]) { - fCEFPfilters[tColl][i] = true; - } - } - } + // Go through the list of tagged collisions and add also those to the maps + // The reason is that in the tagged collisions we include also those collisions which did not fired the trigger conditions, but they contain + // tracks which in other associations contributed to fired triggers in other events. + for (int iTrig = 0; iTrig < fNBarrelCuts + fNMuonCuts + fNElectronMuonCuts; iTrig++) { + for (auto& [collId, aValue] : taggedCollisions[iTrig]) { + if (fFiltersMap.find(collId) == fFiltersMap.end()) { + fFiltersMap[collId] = (static_cast(1) << iTrig); + std::vector decisionsAdds(kNTriggersDQ, false); // event decisions to be transmitted to CEFP + decisionsAdds[iTrig] = true; + fCEFPfilters[collId] = decisionsAdds; + } else { // this collision was already fired, possible via collision - track association; add as an OR the new decisions + fFiltersMap[collId] |= (static_cast(1) << iTrig); + fCEFPfilters[collId][iTrig] = true; } } } - // Do the same for muons - if (filter & muonMask) { - for (auto& a : groupedMuonIndices) { - auto t = a.template fwdtrack_as(); - if (!t.has_collision()) { - continue; - } - auto tColl = t.collisionId(); - if (tColl == collision.globalIndex()) { // track from this collision, nothing to do - continue; - } else { - if (fFiltersMap.find(tColl) == fFiltersMap.end()) { - fFiltersMap[tColl] = filter; - fCEFPfilters[tColl] = decisions; - } else { // this collision was already fired, possible via collision - track association; add as an OR the new decisions - fFiltersMap[tColl] |= filter; - for (int i = 0; i < kNTriggersDQ; i++) { - if (decisions[i]) { - fCEFPfilters[tColl][i] = true; - } - } - } - } - } + } + return filter; + } + + Preslice trackIndicesPerCollision = track_association::collisionId; + Preslice muonIndicesPerCollision = track_association::collisionId; + + void processFilterPP(MyEventsSelected const& collisions, + aod::BCsWithTimestamps const& bcs, + MyBarrelTracksTPCPID const& tracks, + MyMuons const& muons, + MyBarrelTracksAssocSelected const& trackAssocs, MyMuonsAssocSelected const& muonAssocs) + { + fFiltersMap.clear(); + fCEFPfilters.clear(); + + // Loop over collisions + int eventsFired = 0; + for (const auto& collision : collisions) { + // skip those that do not pass our selection + if (!collision.isDQEventSelected()) { + continue; } - // event++; + // group the tracks and muons for this collision + auto groupedTrackIndices = trackAssocs.sliceBy(trackIndicesPerCollision, collision.globalIndex()); + auto groupedMuonIndices = muonAssocs.sliceBy(muonIndicesPerCollision, collision.globalIndex()); + + uint64_t filter = 0; + // if there is at least one track or muon, run the filtering function and compute triggers + if (groupedTrackIndices.size() > 0 || groupedMuonIndices.size() > 0) { + filter = runFilterPP(collision, bcs, tracks, muons, groupedTrackIndices, groupedMuonIndices); + } + if (filter == 0) { + continue; + } + eventsFired++; } // At this point, we have all the non-null decisions for all collisions. @@ -1105,8 +1127,6 @@ struct DQFilterPPTask { fFiltersMap.clear(); fCEFPfilters.clear(); - cout << "------------------- filterPP, n assocs muon :: " << muonAssocs.size() << endl; - uint64_t muonMask = 0; for (int i = 0; i < fNMuonCuts; i++) { muonMask |= (static_cast(1) << i); @@ -1239,7 +1259,7 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) adaptAnalysisTask(cfgc)}; } -void DefineHistograms(HistogramManager* histMan, TString histClasses) +void DefineHistograms(HistogramManager* histMan, TString histClasses, TString subgroups) { // // Define here the histograms for all the classes required in analysis. @@ -1250,26 +1270,26 @@ void DefineHistograms(HistogramManager* histMan, TString histClasses) histMan->AddHistClass(classStr.Data()); if (classStr.Contains("Event")) { - dqhistograms::DefineHistograms(histMan, objArray->At(iclass)->GetName(), "event", "trigger,vtxPbPb"); + dqhistograms::DefineHistograms(histMan, objArray->At(iclass)->GetName(), "event", subgroups.Data()); } if (classStr.Contains("Track")) { - dqhistograms::DefineHistograms(histMan, objArray->At(iclass)->GetName(), "track", "its,tpcpid,dca"); + dqhistograms::DefineHistograms(histMan, objArray->At(iclass)->GetName(), "track", subgroups.Data()); } if (classStr.Contains("Muon") && !classStr.Contains("Electron")) { - dqhistograms::DefineHistograms(histMan, objArray->At(iclass)->GetName(), "track", "muon"); + dqhistograms::DefineHistograms(histMan, objArray->At(iclass)->GetName(), "track", subgroups.Data()); } if (classStr.Contains("Pairs")) { if (classStr.Contains("Barrel")) { - dqhistograms::DefineHistograms(histMan, objArray->At(iclass)->GetName(), "pair", "vertexing-barrel"); + dqhistograms::DefineHistograms(histMan, objArray->At(iclass)->GetName(), "pair", subgroups.Data()); } if (classStr.Contains("Forward")) { - dqhistograms::DefineHistograms(histMan, objArray->At(iclass)->GetName(), "pair", "dimuon,vertexing-forward"); + dqhistograms::DefineHistograms(histMan, objArray->At(iclass)->GetName(), "pair", subgroups.Data()); } if (classStr.Contains("ElectronMuon")) { - dqhistograms::DefineHistograms(histMan, objArray->At(iclass)->GetName(), "pair", "electronmuon"); + dqhistograms::DefineHistograms(histMan, objArray->At(iclass)->GetName(), "pair", subgroups.Data()); } } } From 339c60bc84189b87884b460fb8829e02a558d9ee Mon Sep 17 00:00:00 2001 From: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> Date: Tue, 22 Apr 2025 15:45:29 +0200 Subject: [PATCH 1045/1650] [PWGLF] Add Neutrons within the ZDC acceptance in the strangeness data model (#10907) --- PWGLF/DataModel/LFStrangenessTables.h | 32 +++++++++++++++++++ .../Strangeness/strangederivedbuilder.cxx | 26 +++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/PWGLF/DataModel/LFStrangenessTables.h b/PWGLF/DataModel/LFStrangenessTables.h index 6d414cb325b..bfe3a4f055d 100644 --- a/PWGLF/DataModel/LFStrangenessTables.h +++ b/PWGLF/DataModel/LFStrangenessTables.h @@ -1762,6 +1762,38 @@ DECLARE_SOA_TABLE(Tracked3BodyColls, "AOD", "TRA3BODYCOLL", //! Table joinable w using Tracked3BodyColl = Tracked3BodyColls::iterator; using AssignedTracked3Bodys = soa::Join; using AssignedTracked3Body = AssignedTracked3Bodys::iterator; + +namespace zdcneutrons +{ +// FOR DERIVED +DECLARE_SOA_INDEX_COLUMN(StraMCCollision, straMCCollision); //! +// DYNAMIC COLUMNS +DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, //! neutron transverse momentum (GeV/c) + [](float px, float py) -> float { return RecoDecay::sqrtSumOfSquares(px, py); }); +DECLARE_SOA_DYNAMIC_COLUMN(P, p, //! neutron total momentum (GeV/c) + [](float px, float py, float pz) -> float { return RecoDecay::sqrtSumOfSquares(px, py, pz); }); +DECLARE_SOA_DYNAMIC_COLUMN(Phi, phi, //! neutron phi in the range [0, 2pi) + [](float px, float py) -> float { return RecoDecay::phi(px, py); }); +DECLARE_SOA_DYNAMIC_COLUMN(Eta, eta, //! neutron pseudorapidity + [](float px, float py, float pz) -> float { return RecoDecay::eta(std::array{px, py, pz}); }); +DECLARE_SOA_DYNAMIC_COLUMN(Y, y, //! neutron rapidity + [](float pz, float e) -> float { return std::atanh(pz / e); }); +} // namespace zdcneutrons + +DECLARE_SOA_TABLE(ZDCNeutrons, "AOD", "ZDCNEUTRON", //! MC properties of the neutrons within ZDC acceptance (for UPC analysis) + mcparticle::PdgCode, mcparticle::StatusCode, mcparticle::Flags, + mcparticle::Vx, mcparticle::Vy, mcparticle::Vz, mcparticle::Vt, + mcparticle::Px, mcparticle::Py, mcparticle::Pz, mcparticle::E, + // Dynamic columns for manipulating information + zdcneutrons::Pt, + zdcneutrons::P, + zdcneutrons::Phi, + zdcneutrons::Eta, + zdcneutrons::Y); + +DECLARE_SOA_TABLE(ZDCNMCCollRefs, "AOD", "ZDCNMCCOLLREF", //! refers MC candidate back to proper MC Collision + o2::soa::Index<>, zdcneutrons::StraMCCollisionId, o2::soa::Marker<4>); + } // namespace o2::aod //______________________________________________________ diff --git a/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx index 09216aa166d..6a67077dff3 100644 --- a/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx @@ -111,6 +111,11 @@ struct strangederivedbuilder { Produces cascmothers; // casc mother references Produces motherMCParts; // mc particles for mothers + //__________________________________________________ + // UPC specific information + Produces zdcNeutrons; // Primary neutrons within ZDC acceptance + Produces zdcNeutronsMCCollRefs; // references collisions from ZDCNeutrons + //__________________________________________________ // Q-vectors Produces StraFT0AQVs; // FT0A Q-vector @@ -1054,6 +1059,26 @@ struct strangederivedbuilder { straOrigin(origin.dataframeID()); } + void processSimulatedZDCNeutrons(soa::Join const& mcCollisions, aod::McParticles const& mcParticlesEntireTable) + { + for (const auto& mccollision : mcCollisions) { + const uint64_t mcCollIndex = mccollision.globalIndex(); + auto mcParticles = mcParticlesEntireTable.sliceBy(mcParticlePerMcCollision, mcCollIndex); + + for (const auto& mcPart : mcParticles) { + if (std::abs(mcPart.pdgCode()) == kNeutron) { // check if it is a neutron or anti-neutron + if (std::abs(mcPart.eta()) > 8.7) { // check if it is within ZDC acceptance + zdcNeutrons(mcPart.pdgCode(), mcPart.statusCode(), mcPart.flags(), + mcPart.vx(), mcPart.vy(), mcPart.vz(), mcPart.vt(), + mcPart.px(), mcPart.py(), mcPart.pz(), mcPart.e()); + + zdcNeutronsMCCollRefs(mcPart.mcCollisionId()); + } + } + } + } + } + // debug processing PROCESS_SWITCH(strangederivedbuilder, processDataframeIDs, "Produce data frame ID tags", false); @@ -1077,6 +1102,7 @@ struct strangederivedbuilder { PROCESS_SWITCH(strangederivedbuilder, processPureSimulation, "Produce pure simulated information", true); PROCESS_SWITCH(strangederivedbuilder, processReconstructedSimulation, "Produce reco-ed simulated information", true); PROCESS_SWITCH(strangederivedbuilder, processBinnedGenerated, "Produce binned generated information", false); + PROCESS_SWITCH(strangederivedbuilder, processSimulatedZDCNeutrons, "Produce generated neutrons (within ZDC acceptance) table for UPC analysis", false); // event plane information PROCESS_SWITCH(strangederivedbuilder, processFT0AQVectors, "Produce FT0A Q-vectors table", false); From dadc98a251d77d4b8b377136e624c238429cd7d9 Mon Sep 17 00:00:00 2001 From: czhang Date: Tue, 22 Apr 2025 15:50:05 +0200 Subject: [PATCH 1046/1650] [PWGDQ] Add reading of track type from realigned muons (#10916) --- PWGDQ/Core/VarManager.h | 1 + PWGDQ/TableProducer/tableMaker.cxx | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 95269681f6c..5a193eb0415 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -2197,6 +2197,7 @@ void VarManager::FillTrack(T const& track, float* values) if constexpr ((fillMap & MuonRealign) > 0) { values[kMuonChi2] = track.chi2(); + values[kMuonTrackType] = track.trackType(); } if (fgUsedVars[kM11REFoverMpsingle]) { diff --git a/PWGDQ/TableProducer/tableMaker.cxx b/PWGDQ/TableProducer/tableMaker.cxx index 87390938f17..74545704593 100644 --- a/PWGDQ/TableProducer/tableMaker.cxx +++ b/PWGDQ/TableProducer/tableMaker.cxx @@ -290,7 +290,7 @@ struct TableMaker { context.mOptions.get("processFullWithCent") || context.mOptions.get("processFullWithCovAndEventFilter") || context.mOptions.get("processFullWithCovMultsAndEventFilter") || context.mOptions.get("processMuonOnlyWithCovAndCentMults") || context.mOptions.get("processMuonOnlyWithCov") || context.mOptions.get("processMuonOnlyWithCovAndEventFilter") || context.mOptions.get("processAmbiguousMuonOnlyWithCov") || - context.mOptions.get("processMuonsAndMFT") || context.mOptions.get("processMuonsAndMFTWithFilter") || context.mOptions.get("processMuonMLOnly")); + context.mOptions.get("processMuonsAndMFT") || context.mOptions.get("processMuonsAndMFTWithFilter") || context.mOptions.get("processMuonMLOnly") || context.mOptions.get("processAssociatedMuonOnlyWithCov") || context.mOptions.get("processAssociatedRealignedMuonOnlyWithCov")); if (enableBarrelHistos) { if (fDoDetailedQA) { From 8cdf2bf8c72951dc2e8ed5444e5b5f8dab17286e Mon Sep 17 00:00:00 2001 From: lucamicheletti93 <38209984+lucamicheletti93@users.noreply.github.com> Date: Tue, 22 Apr 2025 16:24:57 +0200 Subject: [PATCH 1047/1650] [PWGDQ] Update Nuclei cuts and signals (#10934) Co-authored-by: Lucamicheletti93 --- PWGDQ/Core/CutsLibrary.cxx | 13 +++++++++ PWGDQ/Core/MCSignalLibrary.cxx | 5 ++++ PWGDQ/DataModel/ReducedInfoTables.h | 2 +- PWGDQ/Tasks/taskFwdTrackPid.cxx | 45 ++++++----------------------- 4 files changed, 28 insertions(+), 37 deletions(-) diff --git a/PWGDQ/Core/CutsLibrary.cxx b/PWGDQ/Core/CutsLibrary.cxx index fdc539f3c38..ff2cfe9298d 100644 --- a/PWGDQ/Core/CutsLibrary.cxx +++ b/PWGDQ/Core/CutsLibrary.cxx @@ -2957,6 +2957,11 @@ AnalysisCompositeCut* o2::aod::dqcuts::GetCompositeCut(const char* cutName) return cut; } + if (!nameStr.compare("muonMinimalCuts")) { + cut->AddCut(GetAnalysisCut("muonMinimalCuts")); + return cut; + } + if (!nameStr.compare("muonQualityCuts")) { cut->AddCut(GetAnalysisCut("muonQualityCuts")); return cut; @@ -6038,6 +6043,14 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) return cut; } + if (!nameStr.compare("muonMinimalCuts")) { + cut->AddCut(VarManager::kEta, -4.0, -2.5); + cut->AddCut(VarManager::kMuonRAtAbsorberEnd, 17.6, 89.5); + cut->AddCut(VarManager::kMuonPDca, 0.0, 594.0, false, VarManager::kMuonRAtAbsorberEnd, 17.6, 26.5); + cut->AddCut(VarManager::kMuonPDca, 0.0, 324.0, false, VarManager::kMuonRAtAbsorberEnd, 26.5, 89.5); + return cut; + } + if (!nameStr.compare("muonQualityCuts")) { cut->AddCut(VarManager::kEta, -4.0, -2.5); cut->AddCut(VarManager::kMuonRAtAbsorberEnd, 17.6, 89.5); diff --git a/PWGDQ/Core/MCSignalLibrary.cxx b/PWGDQ/Core/MCSignalLibrary.cxx index 7872429efb8..614dcc3a2c4 100644 --- a/PWGDQ/Core/MCSignalLibrary.cxx +++ b/PWGDQ/Core/MCSignalLibrary.cxx @@ -126,6 +126,11 @@ MCSignal* o2::aod::dqmcsignals::GetMCSignal(const char* name) signal = new MCSignal(name, "Inclusive jpsi", {prong}, {-1}); return signal; } + if (!nameStr.compare("Helium3")) { + MCProng prong(1, {1000020030}, {true}, {false}, {0}, {0}, {false}); + signal = new MCSignal(name, "Helium3", {prong}, {-1}); + return signal; + } if (!nameStr.compare("Helium3Primary")) { MCProng prong(1, {1000020030}, {true}, {false}, {0}, {0}, {false}); prong.SetSourceBit(0, MCProng::kPhysicalPrimary); diff --git a/PWGDQ/DataModel/ReducedInfoTables.h b/PWGDQ/DataModel/ReducedInfoTables.h index 5a0f9809734..ca79b6becb3 100644 --- a/PWGDQ/DataModel/ReducedInfoTables.h +++ b/PWGDQ/DataModel/ReducedInfoTables.h @@ -905,7 +905,7 @@ DECLARE_SOA_COLUMN(Pt, pt, float); //! DECLARE_SOA_COLUMN(Eta, eta, float); //! DECLARE_SOA_COLUMN(Phi, phi, float); //! DECLARE_SOA_COLUMN(Sign, sign, int); //! -DECLARE_SOA_COLUMN(McDecision, mcDecision, uint32_t); //! +DECLARE_SOA_COLUMN(McDecision, mcDecision, uint16_t); //! } // namespace fwdpid DECLARE_SOA_TABLE(FwdPidsAll, "AOD", "RTFWDPIDALL", //! diff --git a/PWGDQ/Tasks/taskFwdTrackPid.cxx b/PWGDQ/Tasks/taskFwdTrackPid.cxx index 7a135596d56..7fb6e8e3310 100644 --- a/PWGDQ/Tasks/taskFwdTrackPid.cxx +++ b/PWGDQ/Tasks/taskFwdTrackPid.cxx @@ -139,13 +139,11 @@ struct taskFwdTrackPid { template void runFwdTrackPid(TEvent const& event, Muons const& muons, MftTracks const& mftTracks) { - uint32_t mcDecision = 0; - fwdPidAllList.reserve(1); for (const auto& muon : muons) { if (muon.has_matchMFTTrack() && muon.trackType() == 0 && TMath::Abs(muon.fwdDcaX()) < fConfigMaxDCA && TMath::Abs(muon.fwdDcaY()) < fConfigMaxDCA) { auto mftTrack = muon.template matchMFTTrack_as(); - fwdPidAllList(muon.trackType(), event.posX(), event.posY(), event.posZ(), event.numContrib(), muon.pt(), muon.eta(), muon.phi(), muon.sign(), mftTrack.mftClusterSizesAndTrackFlags(), muon.fwdDcaX(), muon.fwdDcaY(), muon.chi2MatchMCHMID(), muon.chi2MatchMCHMFT(), mcDecision); + fwdPidAllList(muon.trackType(), event.posX(), event.posY(), event.posZ(), event.numContrib(), muon.pt(), muon.eta(), muon.phi(), muon.sign(), mftTrack.mftClusterSizesAndTrackFlags(), muon.fwdDcaX(), muon.fwdDcaY(), muon.chi2MatchMCHMID(), muon.chi2MatchMCHMFT(), 0); } } if constexpr (TMatchedOnly == false) { @@ -157,7 +155,7 @@ struct taskFwdTrackPid { continue; } } - fwdPidAllList(4, event.posX(), event.posY(), event.posZ(), event.numContrib(), mftTrack.pt(), mftTrack.eta(), mftTrack.phi(), mftTrack.sign(), mftTrack.mftClusterSizesAndTrackFlags(), mftTrack.fwdDcaX(), mftTrack.fwdDcaY(), -999, -999, mcDecision); + fwdPidAllList(4, event.posX(), event.posY(), event.posZ(), event.numContrib(), mftTrack.pt(), mftTrack.eta(), mftTrack.phi(), mftTrack.sign(), mftTrack.mftClusterSizesAndTrackFlags(), mftTrack.fwdDcaX(), mftTrack.fwdDcaY(), -999, -999, 0); } } } @@ -169,31 +167,16 @@ struct taskFwdTrackPid { { fwdPidAllList.reserve(1); for (const auto& muon : muons) { - uint32_t mcDecision = 0; - int isig = 0; - for (auto sig = fRecMCSignals.begin(); sig != fRecMCSignals.end(); sig++, isig++) { - if ((*sig).CheckSignal(false, muon.reducedMCTrack())) { - mcDecision |= (uint32_t(1) << isig); - } - } - if (muon.has_matchMFTTrack() && muon.trackType() == 0 && TMath::Abs(muon.fwdDcaX()) < fConfigMaxDCA && TMath::Abs(muon.fwdDcaY()) < fConfigMaxDCA) { auto mftTrack = muon.template matchMFTTrack_as(); - fwdPidAllList(muon.trackType(), event.posX(), event.posY(), event.posZ(), event.numContrib(), muon.pt(), muon.eta(), muon.phi(), muon.sign(), mftTrack.mftClusterSizesAndTrackFlags(), muon.fwdDcaX(), muon.fwdDcaY(), muon.chi2MatchMCHMID(), muon.chi2MatchMCHMFT(), mcDecision); + fwdPidAllList(muon.trackType(), event.posX(), event.posY(), event.posZ(), event.numContrib(), muon.pt(), muon.eta(), muon.phi(), muon.sign(), mftTrack.mftClusterSizesAndTrackFlags(), muon.fwdDcaX(), muon.fwdDcaY(), muon.chi2MatchMCHMID(), muon.chi2MatchMCHMFT(), muon.mcReducedFlags()); } } if constexpr (TMatchedOnly == false) { for (const auto& mftTrack : mftTracks) { - uint32_t mcDecision = 0; - int isig = 0; - for (auto sig = fRecMCSignals.begin(); sig != fRecMCSignals.end(); sig++, isig++) { - if ((*sig).CheckSignal(false, mftTrack.reducedMCTrack())) { - mcDecision |= (uint32_t(1) << isig); - } - } if (TMath::Abs(mftTrack.fwdDcaX()) < fConfigMaxDCA && TMath::Abs(mftTrack.fwdDcaY()) < fConfigMaxDCA) { - fwdPidAllList(4, event.posX(), event.posY(), event.posZ(), event.numContrib(), mftTrack.pt(), mftTrack.eta(), mftTrack.phi(), mftTrack.sign(), mftTrack.mftClusterSizesAndTrackFlags(), mftTrack.fwdDcaX(), mftTrack.fwdDcaY(), -999, -999, mcDecision); + fwdPidAllList(4, event.posX(), event.posY(), event.posZ(), event.numContrib(), mftTrack.pt(), mftTrack.eta(), mftTrack.phi(), mftTrack.sign(), mftTrack.mftClusterSizesAndTrackFlags(), mftTrack.fwdDcaX(), mftTrack.fwdDcaY(), -999, -999, mftTrack.mcReducedFlags()); } } } @@ -206,19 +189,10 @@ struct taskFwdTrackPid { for (auto& mctrack : groupedMCTracks) { VarManager::FillTrackMC(groupedMCTracks, mctrack); - for (auto& sig : fGenMCSignals) { - if (sig.GetNProngs() != 1) { // NOTE: 1-prong signals required - continue; - } - bool checked = false; - if constexpr (soa::is_soa_filtered_v) { - auto mctrack_raw = groupedMCTracks.rawIteratorAt(mctrack.globalIndex()); - checked = sig.CheckSignal(false, mctrack_raw); - } else { - checked = sig.CheckSignal(false, mctrack); - } - if (checked) { - fHistMan->FillHistClass(Form("MCTruthGen_%s", sig.GetName()), VarManager::fgValues); + int isig = 0; + for (auto sig = fGenMCSignals.begin(); sig != fGenMCSignals.end(); sig++, isig++) { + if (mctrack.mcReducedFlags() & (static_cast(1) << isig)) { + fHistMan->FillHistClass(Form("MCTruthGen_%s", sig->GetName()), VarManager::fgValues); } } } @@ -287,8 +261,7 @@ void DefineHistograms(HistogramManager* histMan, TString histClasses) if (classStr.Contains("MCTruthGen")) { dqhistograms::DefineHistograms(histMan, objArray->At(iclass)->GetName(), "mctruth"); histMan->AddHistogram(objArray->At(iclass)->GetName(), "Pt_Rapidity", "MC generator p_{T}, y distribution", false, 120, 0.0, 30.0, VarManager::kMCPt, 150, 2.5, 4.0, VarManager::kMCY); - histMan->AddHistogram(objArray->At(iclass)->GetName(), "Eta", "MC generator #eta distribution", false, 200, 2.5, 4.0, VarManager::kMCEta); - // histMan->AddHistogram(objArray->At(iclass)->GetName(), "Rapidity", "MC generator y distribution", false, 150, 2.5, 4.0, VarManager::kMCY); + histMan->AddHistogram(objArray->At(iclass)->GetName(), "Eta", "MC generator #eta distribution", false, 200, -5.0, 5.0, VarManager::kMCEta); histMan->AddHistogram(objArray->At(iclass)->GetName(), "Phi", "MC generator #varphi distribution", false, 50, 0.0, 2. * TMath::Pi(), VarManager::kMCPhi); } From 2542cd79c2bbd9b222e6b65a527c58c867912ab2 Mon Sep 17 00:00:00 2001 From: Junlee Kim Date: Wed, 23 Apr 2025 01:06:30 +0900 Subject: [PATCH 1048/1650] [PWGLF,Trigger] [Event Filtering] adding trigger condition for lambdalambda (#10885) Co-authored-by: ALICE Action Bot --- EventFiltering/PWGLF/strangenessFilter.cxx | 214 ++++++++++++++++++++- EventFiltering/filterTables.h | 3 +- 2 files changed, 211 insertions(+), 6 deletions(-) diff --git a/EventFiltering/PWGLF/strangenessFilter.cxx b/EventFiltering/PWGLF/strangenessFilter.cxx index ef311a4a221..952436eebcd 100644 --- a/EventFiltering/PWGLF/strangenessFilter.cxx +++ b/EventFiltering/PWGLF/strangenessFilter.cxx @@ -15,6 +15,7 @@ /// \since June 1, 2021 #include +#include "TVector3.h" #include "CCDB/BasicCCDBManager.h" #include "DataFormatsParameters/GRPMagField.h" #include "DataFormatsParameters/GRPObject.h" @@ -25,6 +26,7 @@ #include "Framework/AnalysisDataModel.h" #include "Framework/ASoAHelpers.h" #include "ReconstructionDataFormats/Track.h" +#include "ReconstructionDataFormats/TrackParametrization.h" #include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" #include "PWGLF/DataModel/LFStrangenessTables.h" @@ -73,10 +75,38 @@ struct strangenessFilter { HistogramRegistry QAHistosTriggerParticles{"QAHistosTriggerParticles", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; HistogramRegistry QAHistosStrangenessTracking{"QAHistosStrangenessTracking", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; HistogramRegistry EventsvsMultiplicity{"EventsvsMultiplicity", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; - OutputObj hProcessedEvents{TH1D("hProcessedEvents", "Strangeness - event filtered;; Number of events", 16, -1., 15.)}; + OutputObj hProcessedEvents{TH1D("hProcessedEvents", "Strangeness - event filtered;; Number of events", 17, -1., 16.)}; OutputObj hCandidate{TH1F("hCandidate", "; Candidate pass selection; Number of events", 30, 0., 30.)}; OutputObj hEvtvshMinPt{TH1F("hEvtvshMinPt", " Number of h-Omega events with pT_h higher than thrd; min p_{T, trigg} (GeV/c); Number of events", 11, 0., 11.)}; + // Dedicated selection criteria for lambda-lambda + struct : ConfigurableGroup { + Configurable cfgv0radiusMin{"cfgv0radiusMin", 1.2, "minimum decay radius"}; + Configurable cfgDCAPosToPVMin{"cfgDCAPosToPVMin", 0.05, "minimum DCA to PV for positive track"}; + Configurable cfgDCANegToPVMin{"cfgDCANegToPVMin", 0.2, "minimum DCA to PV for negative track"}; + Configurable cfgv0CosPA{"cfgv0CosPA", 0.995, "minimum v0 cosine"}; + Configurable cfgDCAV0Dau{"cfgDCAV0Dau", 1.0, "maximum DCA between daughters"}; + Configurable cfgV0PtMin{"cfgV0PtMin", 0, "minimum pT for lambda"}; + Configurable cfgV0RapMin{"cfgV0RapMin", -0.5, "maximum rapidity"}; + Configurable cfgV0RapMax{"cfgV0RapMax", 0.5, "maximum rapidity"}; + Configurable cfgV0LifeTime{"cfgV0LifeTime", 30., "maximum lambda lifetime"}; + Configurable cfgDaughTPCnclsMin{"cfgDaughTPCnclsMin", 70, "minimum fired crossed rows"}; + Configurable cfgITSNclus{"cfgITSNclus", 1, "minimum its cluster"}; + Configurable cfgRCrossedFindable{"cfgRCrossedFindable", 0.0, "minimum ratio of crossed rows over findable clusters"}; + Configurable cfgDaughPIDCutsTPCPr{"cfgDaughPIDCutsTPCPr", 5, "proton nsigma for TPC"}; + Configurable cfgDaughPIDCutsTPCPi{"cfgDaughPIDCutsTPCPi", 5, "pion nsigma for TPC"}; + Configurable cfgDaughEtaMin{"cfgDaughEtaMin", -0.8, "minimum daughter eta"}; + Configurable cfgDaughEtaMax{"cfgDaughEtaMax", 0.8, "maximum daughter eta"}; + Configurable cfgDaughPrPt{"cfgDaughPrPt", 0.5, "minimum daughter proton pt"}; + Configurable cfgDaughPiPt{"cfgDaughPiPt", 0.5, "minimum daughter pion pt"}; + Configurable cfgLambdaMassWindow{"cfgLambdaMassWindow", 0.01, "window for lambda mass selection"}; + Configurable cfgCompV0Rej{"cfgCompV0Rej", 0.01, "competing V0 rejection"}; + Configurable cfgMinCPAV0V0{"cfgMinCPAV0V0", 0.8, "minimum CPA of v0v0"}; + Configurable cfgMaxRadiusV0V0{"cfgMaxRadiusV0V0", 10.0, "maximum radius of v0v0"}; + Configurable cfgMaxDistanceV0V0{"cfgMaxDistanceV0V0", 5.0, "maximum distance of v0v0"}; + Configurable cfgMaxDCAV0V0{"cfgMaxDCAV0V0", 5.0, "maximum DCA of v0v0"}; + } cfgLLCuts; + // Selection criteria for cascades Configurable useCascadeMomentumAtPrimVtx{"useCascadeMomentumAtPrimVtx", false, "use cascade momentum at PV"}; Configurable doextraQA{"doextraQA", 1, "do extra QA"}; @@ -178,6 +208,81 @@ struct strangenessFilter { return track.pt() > hMinPt && std::abs(track.eta()) < hEta && track.tpcNClsCrossedRows() >= tpcmincrossedrows && track.tpcCrossedRowsOverFindableCls() >= 0.8f && track.tpcChi2NCl() <= 4.f && track.itsChi2NCl() <= 36.f && (track.itsClusterMap() & 0x7) != 0; } + float getV0V0DCA(TVector3 v01pos, TVector3 v01mom, TVector3 v02pos, TVector3 v02mom) + { + TVector3 posdiff = v02pos - v01pos; + TVector3 cross = v01mom.Cross(v02mom); + TVector3 dcaVec = (posdiff.Dot(cross) / cross.Mag2()) * cross; + return dcaVec.Mag(); + } + float getV0V0CPA(TVector3 v01mom, TVector3 v02mom) + { + return v01mom.Dot(v02mom) / (v01mom.Mag() * v02mom.Mag()); + } + float getV0V0Distance(TVector3 v01pos, TVector3 v02pos) + { + TVector3 posdiff = v02pos - v01pos; + return posdiff.Mag(); + } + float getV0V0Radius(TVector3 v01pos, TVector3 v01mom, TVector3 v02pos, TVector3 v02mom) + { + TVector3 posdiff = v02pos - v01pos; + v01mom *= 1. / v01mom.Mag(); + v02mom *= 1. / v02mom.Mag(); + float dd = 1. - TMath::Power(v01mom.Dot(v02mom), 2); + if (dd < 1e-5) + return 999; + float tt = posdiff.Dot(v01mom - v01mom.Dot(v02mom) * v02mom) / dd; + float ss = -posdiff.Dot(v02mom - v01mom.Dot(v02mom) * v01mom) / dd; + TVector3 radVec = v01pos + v02pos + tt * v01mom + ss * v02mom; + radVec *= 0.5; + return radVec.Mag(); + } + bool isSelectedV0V0(TVector3 v01pos, TVector3 v01mom, TVector3 v02pos, TVector3 v02mom) + { + if (getV0V0DCA(v01pos, v01mom, v02pos, v02mom) > cfgLLCuts.cfgMaxDCAV0V0) + return false; + if (getV0V0CPA(v01mom, v02mom) < cfgLLCuts.cfgMinCPAV0V0) + return false; + if (getV0V0Distance(v01pos, v02pos) > cfgLLCuts.cfgMaxDistanceV0V0) + return false; + if (getV0V0Radius(v01pos, v01mom, v02pos, v02mom) > cfgLLCuts.cfgMaxRadiusV0V0) + return false; + + return true; + } + + template + bool isSelectedV0Daughter(T const& track) + { + if (track.tpcNClsCrossedRows() < cfgLLCuts.cfgDaughTPCnclsMin) + return false; + if (track.tpcCrossedRowsOverFindableCls() < cfgLLCuts.cfgRCrossedFindable) + return false; + if (track.itsNCls() < cfgLLCuts.cfgITSNclus) + return false; + if (track.eta() > cfgLLCuts.cfgDaughEtaMax) + return false; + if (track.eta() < cfgLLCuts.cfgDaughEtaMin) + return false; + + return true; + } + template + bool isSelectedV0DaughterPID(T const& track, int pid) // pid 0: proton, pid 1: pion + { + if (pid == 0 && std::abs(track.tpcNSigmaPr()) > cfgLLCuts.cfgDaughPIDCutsTPCPr) + return false; + if (pid == 1 && std::abs(track.tpcNSigmaPi()) > cfgLLCuts.cfgDaughPIDCutsTPCPi) + return false; + if (pid == 0 && track.pt() < cfgLLCuts.cfgDaughPrPt) + return false; + if (pid == 1 && track.pt() < cfgLLCuts.cfgDaughPiPt) + return false; + + return true; + } + void init(o2::framework::InitContext&) { // set V0 parameters in the helper @@ -223,6 +328,7 @@ struct strangenessFilter { hProcessedEvents->GetXaxis()->SetBinLabel(14, aod::filtering::OmegaHighMult::columnLabel()); hProcessedEvents->GetXaxis()->SetBinLabel(15, aod::filtering::DoubleOmega::columnLabel()); hProcessedEvents->GetXaxis()->SetBinLabel(16, aod::filtering::OmegaXi::columnLabel()); + hProcessedEvents->GetXaxis()->SetBinLabel(17, "LL"); hCandidate->GetXaxis()->SetBinLabel(1, "All"); hCandidate->GetXaxis()->SetBinLabel(2, "PassBuilderSel"); @@ -449,14 +555,14 @@ struct strangenessFilter { void fillTriggerTable(bool keepEvent[]) { - strgtable(keepEvent[0], keepEvent[1], keepEvent[2], keepEvent[3], keepEvent[4], keepEvent[5], keepEvent[6], keepEvent[7], keepEvent[8], keepEvent[9], keepEvent[10], keepEvent[11]); + strgtable(keepEvent[0], keepEvent[1], keepEvent[2], keepEvent[3], keepEvent[4], keepEvent[5], keepEvent[6], keepEvent[7], keepEvent[8], keepEvent[9], keepEvent[10], keepEvent[11], keepEvent[12]); } - void process(CollisionCandidates const& collision, TrackCandidates const& tracks, aod::Cascades const& cascadesBase, aod::AssignedTrackedCascades const& trackedCascades, aod::AssignedTrackedV0s const& /*trackedV0s*/, aod::AssignedTracked3Bodys const& /*tracked3Bodys*/, aod::V0s const&, aod::BCs const&, aod::FT0s const& /*ft0s*/) + void process(CollisionCandidates const& collision, TrackCandidates const& tracks, aod::Cascades const& cascadesBase, aod::AssignedTrackedCascades const& trackedCascades, aod::AssignedTrackedV0s const& /*trackedV0s*/, aod::AssignedTracked3Bodys const& /*tracked3Bodys*/, aod::V0s const& v0Base, aod::BCs const&, aod::FT0s const& /*ft0s*/) { // Is event good? [0] = Omega, [1] = high-pT hadron + Omega, [2] = 2Xi, [3] = 3Xi, [4] = 4Xi, [5] single-Xi, [6] Omega with high radius // [7] tracked Xi, [8] tracked Omega, [9] Omega + high mult event - bool keepEvent[12]{}; // explicitly zero-initialised + bool keepEvent[13]{}; // explicitly zero-initialised std::vector> v0sFromOmegaID; std::vector> v0sFromXiID; @@ -573,6 +679,102 @@ struct strangenessFilter { const auto primaryVertex = getPrimaryVertex(collision); o2::dataformats::DCA impactParameterTrk; + std::vector> v0sSelTuple; + for (auto& v00 : v0Base) { // loop over v0 for pre selection + hCandidate->Fill(0.5); // All candidates + + if (v00.v0Type() != 1) { + continue; + } + + const auto posTrack0 = v00.posTrack_as(); + const auto negTrack0 = v00.negTrack_as(); + + if (!isSelectedV0Daughter(posTrack0) || !isSelectedV0Daughter(negTrack0)) { + continue; + } + + auto trackParPos0 = getTrackParCov(posTrack0); + auto trackParNeg0 = getTrackParCov(negTrack0); + + if (!mStraHelper.buildV0Candidate(v00.collisionId(), pvPos[0], pvPos[1], pvPos[2], posTrack0, negTrack0, trackParPos0, trackParNeg0)) { + continue; + } + + if (std::hypot(mStraHelper.v0.position[0], mStraHelper.v0.position[1]) < cfgLLCuts.cfgv0radiusMin) { + continue; + } + if (std::fabs(mStraHelper.v0.positiveDCAxy) < cfgLLCuts.cfgDCAPosToPVMin) { + continue; + } + if (std::fabs(mStraHelper.v0.negativeDCAxy) < cfgLLCuts.cfgDCANegToPVMin) { + continue; + } + if (TMath::Cos(mStraHelper.v0.pointingAngle) < cfgLLCuts.cfgv0CosPA) { + continue; + } + if (std::fabs(mStraHelper.v0.daughterDCA) > cfgLLCuts.cfgDCAV0Dau) { + continue; + } + if (std::hypot(mStraHelper.v0.momentum[0], mStraHelper.v0.momentum[1]) < cfgLLCuts.cfgV0PtMin) { + continue; + } + double yLambda = RecoDecay::y(array{mStraHelper.v0.momentum[0], mStraHelper.v0.momentum[1], mStraHelper.v0.momentum[2]}, o2::constants::physics::MassLambda0); + if (yLambda < cfgLLCuts.cfgV0RapMin) { + continue; + } + if (yLambda > cfgLLCuts.cfgV0RapMax) { + continue; + } + double distovertotmom = std::hypot(mStraHelper.v0.position[0] - collision.posX(), mStraHelper.v0.position[1] - collision.posY(), mStraHelper.v0.position[2] - collision.posZ()) / (std::hypot(mStraHelper.v0.momentum[0], mStraHelper.v0.momentum[1], mStraHelper.v0.momentum[2]) + 1e-13); + if (distovertotmom * o2::constants::physics::MassLambda0 > cfgLLCuts.cfgV0LifeTime) { + continue; + } + + int Tag = 0; + if (isSelectedV0DaughterPID(posTrack0, 0) && isSelectedV0DaughterPID(negTrack0, 1)) { + if (cfgLLCuts.cfgLambdaMassWindow > std::fabs(mStraHelper.v0.massLambda - o2::constants::physics::MassLambda0)) { + if (cfgLLCuts.cfgCompV0Rej < std::fabs(mStraHelper.v0.massK0Short - o2::constants::physics::MassLambda0)) { + Tag++; + } + } + } // lambda + if (isSelectedV0DaughterPID(posTrack0, 1) && isSelectedV0DaughterPID(negTrack0, 0)) { + if (cfgLLCuts.cfgLambdaMassWindow > std::fabs(mStraHelper.v0.massAntiLambda - o2::constants::physics::MassLambda0)) { + if (cfgLLCuts.cfgCompV0Rej < std::fabs(mStraHelper.v0.massK0Short - o2::constants::physics::MassLambda0)) { + Tag++; + } + } + } // anti lambda + if (Tag != 1) { // Select when only one hypothesis is satisfied + continue; + } + + TVector3 v0pos(mStraHelper.v0.position[0], mStraHelper.v0.position[1], mStraHelper.v0.position[2]); + TVector3 v0mom(mStraHelper.v0.momentum[0], mStraHelper.v0.momentum[1], mStraHelper.v0.momentum[2]); + + v0sSelTuple.emplace_back(posTrack0.globalIndex(), negTrack0.globalIndex(), v0pos, v0mom); + } + + for (size_t i = 0; i < v0sSelTuple.size(); ++i) { + for (size_t j = i + 1; j < v0sSelTuple.size(); ++j) { + auto d00 = std::get<0>(v0sSelTuple[i]); + auto d01 = std::get<1>(v0sSelTuple[i]); + auto d10 = std::get<0>(v0sSelTuple[j]); + auto d11 = std::get<1>(v0sSelTuple[j]); + if (d00 == d10 || d00 == d11 || d01 == d10 || d01 == d11) { + continue; + } + auto v00pos = std::get<2>(v0sSelTuple[i]); + auto v00mom = std::get<3>(v0sSelTuple[i]); + auto v01pos = std::get<2>(v0sSelTuple[j]); + auto v01mom = std::get<3>(v0sSelTuple[j]); + if (isSelectedV0V0(v00pos, v00mom, v01pos, v01mom)) { + keepEvent[12] = true; + } + } + } + for (auto& casc : cascadesBase) { // loop over cascades hCandidate->Fill(0.5); // All candidates @@ -1149,7 +1351,9 @@ struct strangenessFilter { if (keepEvent[11]) { hProcessedEvents->Fill(14.5); } - + if (keepEvent[12]) { + hProcessedEvents->Fill(15.5); + } // Filling the table fillTriggerTable(keepEvent); } diff --git a/EventFiltering/filterTables.h b/EventFiltering/filterTables.h index 7ec3b46ccaa..6a547ef33a8 100644 --- a/EventFiltering/filterTables.h +++ b/EventFiltering/filterTables.h @@ -154,6 +154,7 @@ DECLARE_SOA_COLUMN(TrackedXi, hasTrackedXi, bool); //! at least 1 DECLARE_SOA_COLUMN(TrackedOmega, hasTrackedOmega, bool); //! at least 1 tracked Omega DECLARE_SOA_COLUMN(Tracked3Body, hasTracked3Body, bool); //! at least 1 tracked 3Body DECLARE_SOA_COLUMN(OmegaHighMult, hasOmegaHighMult, bool); //! at least 1 Omega + high-mult event +DECLARE_SOA_COLUMN(LambdaLambda, lambdaLambda, bool); //! at least 2 lambda satisfying selection // F1-proton DECLARE_SOA_COLUMN(TriggerEventF1Proton, triggereventf1proton, bool); //! F1 - proton femto trigger event @@ -295,7 +296,7 @@ using FullJetFilter = FullJetFilters::iterator; // strangeness (lf) DECLARE_SOA_TABLE(StrangenessFilters, "AOD", "LFStrgFilters", //! - filtering::Omega, filtering::hadronOmega, filtering::DoubleXi, filtering::TripleXi, filtering::QuadrupleXi, filtering::SingleXiYN, filtering::OmegaLargeRadius, filtering::TrackedXi, filtering::TrackedOmega, filtering::OmegaHighMult, filtering::DoubleOmega, filtering::OmegaXi); + filtering::Omega, filtering::hadronOmega, filtering::DoubleXi, filtering::TripleXi, filtering::QuadrupleXi, filtering::SingleXiYN, filtering::OmegaLargeRadius, filtering::TrackedXi, filtering::TrackedOmega, filtering::OmegaHighMult, filtering::DoubleOmega, filtering::OmegaXi, filtering::LambdaLambda); using StrangenessFilter = StrangenessFilters::iterator; From 74c8e3638870320845dceaf0e81d5975969a8da8 Mon Sep 17 00:00:00 2001 From: aimeric-landou <46970521+aimeric-landou@users.noreply.github.com> Date: Tue, 22 Apr 2025 18:26:25 +0200 Subject: [PATCH 1049/1650] [PWGJE] jet/track QA: add IR QA; trackEfficiency: implement skipMBGapEvents (#10913) --- PWGJE/Tasks/jetFinderQA.cxx | 11 ++++++++ PWGJE/Tasks/trackEfficiency.cxx | 49 +++++++++++++++++++++------------ 2 files changed, 43 insertions(+), 17 deletions(-) diff --git a/PWGJE/Tasks/jetFinderQA.cxx b/PWGJE/Tasks/jetFinderQA.cxx index 106ad4b4e1e..255cecfad63 100644 --- a/PWGJE/Tasks/jetFinderQA.cxx +++ b/PWGJE/Tasks/jetFinderQA.cxx @@ -77,6 +77,8 @@ struct JetFinderQATask { Configurable trackOccupancyInTimeRangeMax{"trackOccupancyInTimeRangeMax", 999999, "maximum occupancy of tracks in neighbouring collisions in a given time range; only applied to reconstructed collisions (data and mcd jets), not mc collisions (mcp jets)"}; Configurable trackOccupancyInTimeRangeMin{"trackOccupancyInTimeRangeMin", -999999, "minimum occupancy of tracks in neighbouring collisions in a given time range; only applied to reconstructed collisions (data and mcd jets), not mc collisions (mcp jets)"}; Configurable skipMBGapEvents{"skipMBGapEvents", false, "flag to choose to reject min. bias gap events; jet-level rejection applied at the jet finder level, here rejection is applied for collision and track process functions"}; + Configurable intRateNBins{"intRateNBins", 50, "number of bins for interaction rate axis"}; + Configurable intRateMax{"intRateMax", 50000.0, "maximum value of interaction rate axis"}; std::vector filledJetR_Both; std::vector filledJetR_Low; @@ -136,7 +138,10 @@ struct JetFinderQATask { AxisSpec jetEtaAxis = {nBinsEta, jetEtaMin, jetEtaMax, "#eta"}; AxisSpec trackEtaAxis = {nBinsEta, trackEtaMin, trackEtaMax, "#eta"}; + AxisSpec intRateAxis = {intRateNBins, 0., intRateMax, "int. rate (kHz)"}; + if (doprocessJetsData || doprocessJetsMCD || doprocessJetsMCDWeighted) { + registry.add("h_jet_pt", "jet pT;#it{p}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxis}}); registry.add("h_jet_eta", "jet #eta;#eta_{jet};entries", {HistType::kTH1F, {jetEtaAxis}}); registry.add("h_jet_phi", "jet #varphi;#varphi_{jet};entries", {HistType::kTH1F, {{160, -1.0, 7.}}}); @@ -159,6 +164,7 @@ struct JetFinderQATask { registry.add("h_jet_ptcut", "p_{T} cut;p_{T,jet} (GeV/#it{c});N;entries", {HistType::kTH2F, {{300, 0, 300}, {20, 0, 5}}}); registry.add("h_jet_phat_weighted", "jet #hat{p};#hat{p} (GeV/#it{c});entries", {HistType::kTH1F, {{1000, 0, 1000}}}); registry.add("h3_centrality_occupancy_jet_pt", "centrality; occupancy; #it{p}_{T,jet} (GeV/#it{c})", {HistType::kTH3F, {{120, -10.0, 110.0}, {60, 0, 30000}, jetPtAxis}}); + registry.add("h2_intrate_jet_pt", "int. rate vs #it{p}_{T,jet}; int. rate (kHz); #it{p}_{T,jet} (GeV/#it{c});", {HistType::kTH2F, {intRateAxis, jetPtAxis}}); } if (doprocessJetsRhoAreaSubData || doprocessJetsRhoAreaSubMCD) { @@ -182,6 +188,7 @@ struct JetFinderQATask { registry.add("h3_jet_r_jet_pt_track_phi_rhoareasubtracted", "#it{R}_{jet};#it{p}_{T,jet} (GeV/#it{c});#varphi_{jet tracks}", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxisRhoAreaSub, {160, -1.0, 7.}}}); registry.add("h3_jet_r_jet_pt_jet_pt_rhoareasubtracted", "#it{R}_{jet};#it{p}_{T,jet} (GeV/#it{c});#it{p}_{T,jet} (GeV/#it{c})", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxis, jetPtAxisRhoAreaSub}}); registry.add("h3_centrality_occupancy_jet_pt_rhoareasubtracted", "centrality; occupancy; #it{p}_{T,jet} (GeV/#it{c})", {HistType::kTH3F, {{120, -10.0, 110.0}, {60, 0, 30000}, jetPtAxisRhoAreaSub}}); + registry.add("h2_intrate_jet_pt_rhoareasubtracted", "int. rate vs #it{p}_{T,jet}; int. rate (kHz); #it{p}_{T,jet} (GeV/#it{c});", {HistType::kTH2F, {intRateAxis, jetPtAxisRhoAreaSub}}); } if (doprocessEvtWiseConstSubJetsData || doprocessEvtWiseConstSubJetsMCD) { @@ -202,6 +209,7 @@ struct JetFinderQATask { registry.add("h3_jet_r_jet_pt_track_pt_eventwiseconstituentsubtracted", "#it{R}_{jet};#it{p}_{T,jet} (GeV/#it{c});#it{p}_{T,jet tracks} (GeV/#it{c})", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxis, jetPtAxis}}); registry.add("h3_jet_r_jet_pt_track_eta_eventwiseconstituentsubtracted", "#it{R}_{jet};#it{p}_{T,jet} (GeV/#it{c});#eta_{jet tracks}", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxis, trackEtaAxis}}); registry.add("h3_jet_r_jet_pt_track_phi_eventwiseconstituentsubtracted", "#it{R}_{jet};#it{p}_{T,jet} (GeV/#it{c});#varphi_{jet tracks}", {HistType::kTH3F, {{jetRadiiBins, ""}, jetPtAxis, {160, -1.0, 7.}}}); + registry.add("h2_intrate_jet_pt_eventwiseconstituentsubtracted", "int. rate vs #it{p}_{T,jet}; int. rate (kHz); #it{p}_{T,jet} (GeV/#it{c});", {HistType::kTH2F, {intRateAxis, jetPtAxis}}); } if (doprocessRho) { @@ -434,6 +442,7 @@ struct JetFinderQATask { registry.fill(HIST("h2_centrality_jet_phi"), centrality, jet.phi(), weight); registry.fill(HIST("h2_centrality_jet_ntracks"), centrality, jet.tracksIds().size(), weight); registry.fill(HIST("h3_centrality_occupancy_jet_pt"), centrality, occupancy, jet.pt(), weight); + registry.fill(HIST("h2_intrate_jet_pt"), jet.collision().hadronicRate(), jet.pt(), weight); } registry.fill(HIST("h3_jet_r_jet_pt_centrality"), jet.r() / 100.0, jet.pt(), centrality, weight); @@ -466,6 +475,7 @@ struct JetFinderQATask { registry.fill(HIST("h2_centrality_jet_phi_rhoareasubtracted"), centrality, jet.phi(), weight); registry.fill(HIST("h2_centrality_jet_ntracks_rhoareasubtracted"), centrality, jet.tracksIds().size(), weight); } + registry.fill(HIST("h2_intrate_jet_pt_rhoareasubtracted"), jet.collision().hadronicRate(), jet.pt() - (rho * jet.area()), weight); } registry.fill(HIST("h3_jet_r_jet_pt_centrality_rhoareasubtracted"), jet.r() / 100.0, jet.pt() - (rho * jet.area()), centrality, weight); @@ -496,6 +506,7 @@ struct JetFinderQATask { registry.fill(HIST("h2_centrality_jet_eta_eventwiseconstituentsubtracted"), centrality, jet.eta(), weight); registry.fill(HIST("h2_centrality_jet_phi_eventwiseconstituentsubtracted"), centrality, jet.phi(), weight); registry.fill(HIST("h2_centrality_jet_ntracks_eventwiseconstituentsubtracted"), centrality, jet.tracksIds().size(), weight); + registry.fill(HIST("h2_intrate_jet_pt_eventwiseconstituentsubtracted"), jet.collision().hadronicRate(), jet.pt(), weight); } registry.fill(HIST("h3_jet_r_jet_pt_centrality_eventwiseconstituentsubtracted"), jet.r() / 100.0, jet.pt(), centrality, weight); diff --git a/PWGJE/Tasks/trackEfficiency.cxx b/PWGJE/Tasks/trackEfficiency.cxx index 10ff3365974..b9fde50abde 100644 --- a/PWGJE/Tasks/trackEfficiency.cxx +++ b/PWGJE/Tasks/trackEfficiency.cxx @@ -52,6 +52,7 @@ struct TrackEfficiencyJets { Configurable eventSelections{"eventSelections", "sel8", "choose event selection"}; Configurable trackSelections{"trackSelections", "globalTracks", "set track selections; other option: uniformTracks"}; + Configurable skipMBGapEvents{"skipMBGapEvents", false, "flag to choose to reject min. bias gap events"}; // Tracking efficiency process function configurables: Configurable checkPrimaryPart{"checkPrimaryPart", true, "0: doesn't check mcparticle.isPhysicalPrimary() - 1: checks particle.isPhysicalPrimary()"}; @@ -72,6 +73,10 @@ struct TrackEfficiencyJets { Configurable trackOccupancyInTimeRangeMax{"trackOccupancyInTimeRangeMax", 999999, "maximum occupancy of tracks in neighbouring collisions in a given time range; only applied for reconstructed tracks, not mc particles"}; Configurable trackOccupancyInTimeRangeMin{"trackOccupancyInTimeRangeMin", -999999, "minimum occupancy of tracks in neighbouring collisions in a given time range; only applied for reconstructed tracks, not mc particles"}; + Configurable> centralityBinning{"centralityBinning", {0., 10., 50., 70.}, "binning of centrality histograms"}; + Configurable intRateNBins{"intRateNBins", 50, "number of bins for interaction rate axis"}; + Configurable intRateMax{"intRateMax", 50000.0, "maximum value of interaction rate axis"}; + std::vector eventSelectionBits; int trackSelection = -1; @@ -100,6 +105,7 @@ struct TrackEfficiencyJets { registry.fill(HIST("h2_track_pt_track_sigmapt"), track.pt(), track.sigma1Pt() * track.pt(), weight); registry.fill(HIST("h2_track_pt_high_track_sigma1overpt"), track.pt(), track.sigma1Pt(), weight); registry.fill(HIST("h2_track_pt_high_track_sigmapt"), track.pt(), track.sigma1Pt() * track.pt(), weight); + registry.fill(HIST("h3_intrate_centrality_track_pt"), collision.hadronicRate(), collision.centrality(), track.pt(), weight); } } @@ -111,6 +117,7 @@ struct TrackEfficiencyJets { registry.fill(HIST("h2_centrality_particle_eta"), collision.centrality(), mcparticle.eta(), weight); registry.fill(HIST("h2_centrality_particle_phi"), collision.centrality(), mcparticle.phi(), weight); registry.fill(HIST("h2_centrality_particle_energy"), collision.centrality(), mcparticle.energy(), weight); + registry.fill(HIST("h3_intrate_centrality_particle_pt"), collision.hadronicRate(), collision.centrality(), mcparticle.pt(), weight); } } @@ -182,7 +189,8 @@ struct TrackEfficiencyJets { } if (doprocessTracks || doprocessTracksWeighted) { - AxisSpec centAxis = {121, -10., 111., "centrality (%)"}; + AxisSpec centAxis = {centralityBinning, "centrality (%)"}; + AxisSpec intRateAxis = {intRateNBins, 0., intRateMax, "int. rate (kHz)"}; registry.add("h2_centrality_track_pt", "centrality vs track pT; centrality; #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {centAxis, {200, 0., 200.}}}); registry.add("h2_centrality_track_eta", "centrality vs track #eta; centrality; #eta_{track}", {HistType::kTH2F, {centAxis, {100, -1.0, 1.0}}}); registry.add("h2_centrality_track_phi", "centrality vs track #varphi; centrality; #varphi_{track}", {HistType::kTH2F, {centAxis, {160, -1.0, 7.}}}); @@ -191,24 +199,27 @@ struct TrackEfficiencyJets { registry.add("h2_track_pt_high_track_sigmapt", "#sigma(#it{p}_{T})/#it{p}_{T}; #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {{90, 10., 100.}, {100000, 0.0, 100.0}}}); registry.add("h2_track_pt_track_sigma1overpt", "#sigma(1/#it{p}_{T}); #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {{100, 0., 10.}, {1000, 0.0, 10.0}}}); registry.add("h2_track_pt_high_track_sigma1overpt", "#sigma(1/#it{p}_{T}); #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {{90, 10., 100.}, {1000, 0.0, 10.0}}}); + registry.add("h3_intrate_centrality_track_pt", "interaction rate vs centrality vs track pT; int. rate; centrality; #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH3F, {intRateAxis, centAxis, {200, 0., 200.}}}); } if (doprocessParticles || doprocessParticlesWeighted) { - AxisSpec centAxis = {121, -10., 111., "centrality (%)"}; - registry.add("h2_centrality_particle_pt", "centrality vs track pT; centrality; #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {centAxis, {200, 0., 200.}}}); - registry.add("h2_centrality_particle_eta", "centrality vs track #eta; centrality; #eta_{track}", {HistType::kTH2F, {centAxis, {100, -1.0, 1.0}}}); - registry.add("h2_centrality_particle_phi", "centrality vs track #varphi; centrality; #varphi_{track}", {HistType::kTH2F, {centAxis, {160, -1.0, 7.}}}); - registry.add("h2_centrality_particle_energy", "centrality vs track energy; centrality; Energy GeV", {HistType::kTH2F, {centAxis, {100, 0.0, 100.0}}}); + AxisSpec centAxis = {centralityBinning, "centrality (%)"}; + AxisSpec intRateAxis = {intRateNBins, 0., intRateMax, "int. rate (kHz)"}; + registry.add("h2_centrality_particle_pt", "centrality vs particle pT; centrality; #it{p}_{T,part} (GeV/#it{c})", {HistType::kTH2F, {centAxis, {200, 0., 200.}}}); + registry.add("h2_centrality_particle_eta", "centrality vs particle #eta; centrality; #eta_{part}", {HistType::kTH2F, {centAxis, {100, -1.0, 1.0}}}); + registry.add("h2_centrality_particle_phi", "centrality vs particle #varphi; centrality; #varphi_{part}", {HistType::kTH2F, {centAxis, {160, -1.0, 7.}}}); + registry.add("h2_centrality_particle_energy", "centrality vs particle energy; centrality; Energy GeV", {HistType::kTH2F, {centAxis, {100, 0.0, 100.0}}}); + registry.add("h3_intrate_centrality_particle_pt", "interaction rate vs centrality vs particle pT; int. rate; centrality; #it{p}_{T,part} (GeV/#it{c})", {HistType::kTH3F, {intRateAxis, centAxis, {200, 0., 200.}}}); } if (doprocessTracks || doprocessTracksWeighted) { - AxisSpec centAxis = {121, -10., 111., "centrality (%)"}; + AxisSpec centAxis = {centralityBinning, "centrality (%)"}; registry.add("h_collisions", "event status;event status;entries", {HistType::kTH1F, {{4, 0.0, 4.0}}}); registry.add("h_fakecollisions", "event status;event status;entries", {HistType::kTH1F, {{4, 0.0, 4.0}}}); registry.add("h2_centrality_collisions", "centrality vs collisions; centrality; collisions", {HistType::kTH2F, {centAxis, {4, 0.0, 4.0}}}); } if (doprocessParticles || doprocessParticlesWeighted) { - AxisSpec centAxis = {121, -10., 111., "centrality (%)"}; + AxisSpec centAxis = {centralityBinning, "centrality (%)"}; registry.add("h_mccollisions", "event status;event status;entries", {HistType::kTH1F, {{4, 0.0, 4.0}}}); registry.add("h2_centrality_mccollisions", "centrality vs mccollisions; centrality; collisions", {HistType::kTH2F, {centAxis, {4, 0.0, 4.0}}}); } @@ -258,7 +269,7 @@ struct TrackEfficiencyJets { bool hasSel8Coll = false; bool centralityCheck = false; if (acceptSplitCollisions == 2) { // check only that the first reconstructed collision passes the check - if (jetderiveddatautilities::selectCollision(collisions.begin(), eventSelectionBits)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split + if (jetderiveddatautilities::selectCollision(collisions.begin(), eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split hasSel8Coll = true; } if (!checkCentrality || ((centralityMin < collisions.begin().centrality()) && (collisions.begin().centrality() < centralityMax))) { // effect unclear if mcColl is split @@ -266,7 +277,7 @@ struct TrackEfficiencyJets { } } else { // check that at least one of the reconstructed collisions passes the checks for (auto& collision : collisions) { - if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split + if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split hasSel8Coll = true; } if (!checkCentrality || ((centralityMin < collision.centrality()) && (collision.centrality() < centralityMax))) { // effect unclear if mcColl is split @@ -317,7 +328,7 @@ struct TrackEfficiencyJets { return; } - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits) || !(abs(collision.posZ()) < vertexZCut)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents) || !(abs(collision.posZ()) < vertexZCut)) { continue; } @@ -392,7 +403,7 @@ struct TrackEfficiencyJets { { registry.fill(HIST("h_collisions"), 0.5); registry.fill(HIST("h2_centrality_collisions"), collision.centrality(), 0.5); - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { return; } registry.fill(HIST("h_collisions"), 1.5); @@ -417,7 +428,7 @@ struct TrackEfficiencyJets { float eventWeight = collision.mcCollision().weight(); registry.fill(HIST("h_collisions"), 0.5); registry.fill(HIST("h_collisions_weighted"), 0.5, eventWeight); - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { return; } registry.fill(HIST("h_collisions"), 1.5); @@ -451,7 +462,7 @@ struct TrackEfficiencyJets { bool hasSel8Coll = false; bool centralityCheck = false; if (acceptSplitCollisions == 2) { // check only that the first reconstructed collision passes the check - if (jetderiveddatautilities::selectCollision(collisions.begin(), eventSelectionBits)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split + if (jetderiveddatautilities::selectCollision(collisions.begin(), eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split hasSel8Coll = true; } if (!checkCentrality || ((centralityMin < collisions.begin().centrality()) && (collisions.begin().centrality() < centralityMax))) { // effect unclear if mcColl is split @@ -459,7 +470,7 @@ struct TrackEfficiencyJets { } } else { // check that at least one of the reconstructed collisions passes the checks for (auto& collision : collisions) { - if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split + if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split hasSel8Coll = true; } if (!checkCentrality || ((centralityMin < collision.centrality()) && (collision.centrality() < centralityMax))) { // effect unclear if mcColl is split @@ -484,6 +495,10 @@ struct TrackEfficiencyJets { soa::SmallGroups const& collisions, soa::Filtered const& mcparticles) { + if (skipMBGapEvents && mcCollision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + return; + } + float eventWeight = mcCollision.weight(); registry.fill(HIST("h_mccollisions"), 0.5); registry.fill(HIST("h_mccollisions_weighted"), 0.5, eventWeight); @@ -501,7 +516,7 @@ struct TrackEfficiencyJets { bool hasSel8Coll = false; bool centralityCheck = false; if (acceptSplitCollisions == 2) { // check only that the first reconstructed collision passes the check - if (jetderiveddatautilities::selectCollision(collisions.begin(), eventSelectionBits)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split + if (jetderiveddatautilities::selectCollision(collisions.begin(), eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split hasSel8Coll = true; } if (!checkCentrality || ((centralityMin < collisions.begin().centrality()) && (collisions.begin().centrality() < centralityMax))) { // effect unclear if mcColl is split @@ -509,7 +524,7 @@ struct TrackEfficiencyJets { } } else { // check that at least one of the reconstructed collisions passes the checks for (auto& collision : collisions) { - if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split + if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split hasSel8Coll = true; } if (!checkCentrality || ((centralityMin < collision.centrality()) && (collision.centrality() < centralityMax))) { // effect unclear if mcColl is split From fbce7f8a896d4a4624b6a792bc01052ed3383781 Mon Sep 17 00:00:00 2001 From: Artem Kotliarov <71133985+KotliarovAr@users.noreply.github.com> Date: Tue, 22 Apr 2025 18:46:40 +0200 Subject: [PATCH 1050/1650] [PWGJE] Code update for hadron-jet analysis (#10926) --- PWGJE/Tasks/recoilJets.cxx | 203 ++++++++++++++++++++++++------------- 1 file changed, 135 insertions(+), 68 deletions(-) diff --git a/PWGJE/Tasks/recoilJets.cxx b/PWGJE/Tasks/recoilJets.cxx index ba1a2a08351..ba3dde1e8f2 100644 --- a/PWGJE/Tasks/recoilJets.cxx +++ b/PWGJE/Tasks/recoilJets.cxx @@ -68,6 +68,7 @@ struct RecoilJets { Configurable trkSel{"trkSel", "globalTracks", "Set track selection"}; Configurable vertexZCut{"vertexZCut", 10., "Accepted z-vertex range"}; Configurable fracSig{"fracSig", 0.9, "Fraction of events to use for signal TT"}; + Configurable bGetMissJets{"bGetMissJets", false, "Flag to get miss histo for particle level jets"}; Configurable trkPtMin{"trkPtMin", 0.15, "Minimum pT of acceptanced tracks"}; Configurable trkPtMax{"trkPtMax", 100., "Maximum pT of acceptanced tracks"}; @@ -76,10 +77,12 @@ struct RecoilJets { Configurable jetR{"jetR", 0.4, "Jet cone radius"}; Configurable triggerMasks{"triggerMasks", "", "Relevant trigger masks: fTrackLowPt,fTrackHighPt"}; + Configurable skipMBGapEvents{"skipMBGapEvents", false, "flag to choose to reject min. bias gap events; jet-level rejection applied at the jet finder level, here rejection is applied for collision and track process functions"}; // List of configurable parameters for MC Configurable pTHatExponent{"pTHatExponent", 4.0, "Exponent of the event weight for the calculation of pTHat"}; Configurable pTHatMax{"pTHatMax", 999.0, "Maximum fraction of hard scattering for jet acceptance in MC"}; + Configurable pTHatMaxTrack{"pTHatMaxTrack", 999.0, "Maximum fraction of hard scattering for track acceptance in MC"}; // Parameters for recoil jet selection Configurable ptTTrefMin{"ptTTrefMin", 5., "Minimum pT of reference TT"}; @@ -134,8 +137,14 @@ struct RecoilJets { // List of raw and MC det. distributions if (doprocessData || doprocessMCDetLevel || doprocessMCDetLevelWeighted) { spectra.add("vertexZ", "Z vertex of collisions", kTH1F, {{60, -12., 12.}}); + spectra.add("hHasAssocMcCollision", "Has det. level coll. associat. MC coll.", kTH1F, {{2, 0.0, 2.}}); + spectra.get(HIST("hHasAssocMcCollision"))->GetXaxis()->SetBinLabel(1, "Yes"); + spectra.get(HIST("hHasAssocMcCollision"))->GetXaxis()->SetBinLabel(2, "No"); spectra.add("hTrackPtEtaPhi", "Charact. of tracks", kTH3F, {pT, pseudorap, phiAngle}); + + spectra.add("hTTSig_pT", "pT spectrum of all found TT_{Sig} cand.", kTH1F, {{40, 10., 50.}}); // needed to distinguish merged data from diff. wagons + spectra.add("hNtrig", "Total number of selected triggers per class", kTH1F, {{2, 0.0, 2.}}); spectra.get(HIST("hNtrig"))->GetXaxis()->SetBinLabel(1, "TT_{ref}"); spectra.get(HIST("hNtrig"))->GetXaxis()->SetBinLabel(2, "TT_{sig}"); @@ -161,6 +170,9 @@ struct RecoilJets { // List of MC particle level distributions if (doprocessMCPartLevel || doprocessMCPartLevelWeighted) { + spectra.add("vertexZMC", "Z vertex of jmccollision", kTH1F, {{60, -12., 12.}}); + spectra.add("ptHat", "Distribution of pT hat", kTH1F, {{500, 0.0, 100.}}); + spectra.add("hPartPtEtaPhi", "Charact. of particles", kTH3F, {pT, pseudorap, phiAngle}); spectra.add("hNtrig_Part", "Total number of selected triggers per class", kTH1F, {{2, 0.0, 2.}}); spectra.get(HIST("hNtrig_Part"))->GetXaxis()->SetBinLabel(1, "TT_{ref}"); @@ -187,26 +199,30 @@ struct RecoilJets { // Jet matching: part. vs. det. if (doprocessJetsMatched || doprocessJetsMatchedWeighted) { - spectra.add("hJetPt_PartLevel_vs_DetLevel", "Correlation jet pT at part. vs. det. levels", kTH2F, {{200, 0.0, 200.}, {200, 0.0, 200.}}); + spectra.add("hJetPt_DetLevel_vs_PartLevel", "Correlation jet pT at det. vs. part. levels", kTH2F, {{200, 0.0, 200.}, {200, 0.0, 200.}}); // spectra.add("hJetPt_Corr_PartLevel_vs_DetLevel", "Correlation jet pT at part. vs. det. levels", kTH2F, {jetPTcorr, jetPTcorr}); - spectra.add("hJetPt_PartLevel_vs_DetLevel_RecoilJets", "Correlation recoil jet pT at part. vs. det. levels", kTH2F, {{200, 0.0, 200.}, {200, 0.0, 200.}}); + spectra.add("hJetPt_DetLevel_vs_PartLevel_RecoilJets", "Correlation recoil jet pT at part. vs. det. levels", kTH2F, {{200, 0.0, 200.}, {200, 0.0, 200.}}); // spectra.add("hJetPt_Corr_PartLevel_vs_DetLevel_RecoilJets", "Correlation recoil jet pT at part. vs. det. levels", kTH2F, {jetPTcorr, jetPTcorr}); - spectra.add("hMissedJets_pT", "Part. level jets w/o matched pair", kTH1F, {{200, 0.0, 200.}}); - // spectra.add("hMissedJets_Corr_pT", "Part. level jets w/o matched pair", kTH1F, {jetPTcorr}); - // spectra.add("hMissedJets_pT_RecoilJets", "Part. level jets w/o matched pair", kTH1F, {{200, 0.0, 200.}}); - // spectra.add("hMissedJets_Corr_pT_RecoilJets", "Part. level jets w/o matched pair", kTH1F, {jetPTcorr}); - - spectra.add("hFakeJets_pT", "Det. level jets w/o matched pair", kTH1F, {{200, 0.0, 200.}}); - // spectra.add("hFakeJets_Corr_pT", "Det. level jets w/o matched pair", kTH1F, {jetPTcorr}); - spectra.add("hFakeJets_pT_RecoilJets", "Det. level jets w/o matched pair", kTH1F, {{200, 0.0, 200.}}); - // spectra.add("hFakeJets_Corr_pT_RecoilJets", "Det. level jets w/o matched pair", kTH1F, {jetPTcorr}); + if (bGetMissJets) { + spectra.add("hMissedJets_pT", "Part. level jets w/o matched pair", kTH1F, {{200, 0.0, 200.}}); + // spectra.add("hMissedJets_Corr_pT", "Part. level jets w/o matched pair", kTH1F, {jetPTcorr}); + spectra.add("hMissedJets_pT_RecoilJets", "Part. level jets w/o matched pair", kTH1F, {{200, 0.0, 200.}}); + // spectra.add("hMissedJets_Corr_pT_RecoilJets", "Part. level jets w/o matched pair", kTH1F, {jetPTcorr}); + } else { + spectra.add("hFakeJets_pT", "Det. level jets w/o matched pair", kTH1F, {{200, 0.0, 200.}}); + // spectra.add("hFakeJets_Corr_pT", "Det. level jets w/o matched pair", kTH1F, {jetPTcorr}); + spectra.add("hFakeJets_pT_RecoilJets", "Det. level jets w/o matched pair", kTH1F, {{200, 0.0, 200.}}); + // spectra.add("hFakeJets_Corr_pT_RecoilJets", "Det. level jets w/o matched pair", kTH1F, {jetPTcorr}); + } spectra.add("hJetPt_resolution", "Jet p_{T} relative resolution as a func. of jet #it{p}_{T, part}", kTH2F, {{100, -5., 5.}, pT}); spectra.add("hJetPt_resolution_RecoilJets", "Jet p_{T} relative resolution as a func. of jet #it{p}_{T, part}", kTH2F, {{100, -5., 5.}, pT}); spectra.add("hJetPhi_resolution", "#varphi resolution as a func. of jet #it{p}_{T, part}", kTH2F, {{40, -1., 1.}, pT}); spectra.add("hJetPhi_resolution_RecoilJets", "#varphi resolution as a func. of jet #it{p}_{T, part}", kTH2F, {{40, -1., 1.}, pT}); + + spectra.add("hNumberMatchedJetsPerOneBaseJet", "# of taged jets per 1 base jet vs. jet pT", kTH2F, {{10, 0.5, 10.5}, {100, 0.0, 100.}}); } } @@ -231,11 +247,15 @@ struct RecoilJets { if (skipTrack(track)) continue; + if (bIsMC && (track.pt() > pTHatMaxTrack * pTHat)) + continue; + spectra.fill(HIST("hTrackPtEtaPhi"), track.pt(), track.eta(), track.phi(), weight); // Search for TT candidate if (bSigEv && (track.pt() > ptTTsigMin && track.pt() < ptTTsigMax)) { vPhiOfTT.push_back(track.phi()); + spectra.fill(HIST("hTTSig_pT"), track.pt(), weight); ++nTT; } @@ -301,6 +321,7 @@ struct RecoilJets { double phiTT = 0.; int nTT = 0; float pTHat = getPtHat(weight); + spectra.fill(HIST("ptHat"), pTHat, weight); auto dice = rand->Rndm(); if (dice < fracSig) @@ -316,6 +337,9 @@ struct RecoilJets { if (bParticleNeutral || !particle.isPhysicalPrimary()) continue; + if (particle.pt() > pTHatMaxTrack * pTHat) + continue; + spectra.fill(HIST("hPartPtEtaPhi"), particle.pt(), particle.eta(), particle.phi(), weight); if (bSigEv && (particle.pt() > ptTTsigMin && particle.pt() < ptTTsigMax)) { @@ -379,70 +403,36 @@ struct RecoilJets { } } - /// TODO: Add functionality to get rho for particle and detector level - template - void fillMatchedHistograms(Tracks const& tracks, DetLevelJets const& jets_det_level, PartLevelJets const& jets_part_level, float weight = 1.) + template + void fillMatchedHistograms(TracksTable const& tracks, JetsBase const& jetsBase, JetsTag const& jetsTag, float weight = 1.) { std::vector vPhiOfTT; - double phiTT = 0.; + double phiTTSig = 0.; float pTHat = getPtHat(weight); for (const auto& track : tracks) { if (skipTrack(track)) continue; + if (track.pt() > pTHatMaxTrack * pTHat) + continue; + if (track.pt() > ptTTsigMin && track.pt() < ptTTsigMax) { vPhiOfTT.push_back(track.phi()); } } - bool bTT = vPhiOfTT.size() > 0; - if (bTT) - phiTT = getPhiTT(vPhiOfTT); - - for (const auto& jet_det_level : jets_det_level) { - if (jet_det_level.pt() > pTHatMax * pTHat) - continue; + bool bIsThereTTSig = vPhiOfTT.size() > 0; - bool bRecoilJet = get<1>(isRecoilJet(jet_det_level, phiTT)) && bTT; + if (bIsThereTTSig) + phiTTSig = getPhiTT(vPhiOfTT); - if (jet_det_level.has_matchedJetGeo()) { - - const auto jetsMatchedPartLevel = jet_det_level.template matchedJetGeo_as>(); // we can add "matchedJetPt_as" later - - for (const auto& jet_matched_part_level : jetsMatchedPartLevel) { - - /* - Which histos we want: - 1) det pT vs. part. pT for inclusive jets (corrected for rho*A and not) - 2) det pT vs. part. pT for recoil jets - 3) same as (1) and (2) but 4D with dphi parts - 4) distribution of fake and miss jets - 5) pT and phi resolutions - */ - - spectra.fill(HIST("hJetPt_PartLevel_vs_DetLevel"), jet_det_level.pt(), jet_matched_part_level.pt(), weight); - spectra.fill(HIST("hJetPt_resolution"), (jet_matched_part_level.pt() - jet_det_level.pt()) / jet_matched_part_level.pt(), jet_matched_part_level.pt(), weight); - spectra.fill(HIST("hJetPhi_resolution"), jet_matched_part_level.phi() - jet_det_level.phi(), jet_matched_part_level.pt(), weight); - - if (bRecoilJet) { - spectra.fill(HIST("hJetPt_PartLevel_vs_DetLevel_RecoilJets"), jet_det_level.pt(), jet_matched_part_level.pt(), weight); - spectra.fill(HIST("hJetPt_resolution_RecoilJets"), (jet_matched_part_level.pt() - jet_det_level.pt()) / jet_matched_part_level.pt(), jet_matched_part_level.pt(), weight); - spectra.fill(HIST("hJetPhi_resolution_RecoilJets"), jet_matched_part_level.phi() - jet_det_level.phi(), jet_matched_part_level.pt(), weight); - } - } - } else { - spectra.fill(HIST("hFakeJets_pT"), jet_det_level.pt(), weight); - if (bRecoilJet) - spectra.fill(HIST("hFakeJets_pT_RecoilJets"), jet_det_level.pt(), weight); - } - } + for (const auto& jetBase : jetsBase) { + if (jetBase.pt() > pTHatMax * pTHat) + continue; - // Missed jets - for (const auto& jet_part_level : jets_part_level) { - if (!jet_part_level.has_matchedJetGeo()) { - spectra.fill(HIST("hMissedJets_pT"), jet_part_level.pt(), weight); - } + bool bIsBaseJetRecoil = get<1>(isRecoilJet(jetBase, phiTTSig)) && bIsThereTTSig; + dataForUnfolding(jetBase, jetsTag, bIsBaseJetRecoil, weight); } } @@ -462,7 +452,7 @@ struct RecoilJets { FilteredTracks const& tracks, FilteredJetsDetLevel const& jets) { - if (skipEvent(collision)) + if (skipEvent(collision) || skipMBGapEvent(collision)) return; spectra.fill(HIST("vertexZ"), collision.posZ()); @@ -475,12 +465,18 @@ struct RecoilJets { FilteredTracks const& tracks, FilteredJetsDetLevel const& jets) { - if (skipEvent(collision)) + if (skipEvent(collision) || skipMBGapEvent(collision)) return; - /// \TODO: should we implement function to check whether Collision was reconstructed (has_mcCollision() function)? Example: https://github.com/AliceO2Group/O2Physics/blob/1cba330514ab47c15c0095d8cee9633723d8e2a7/PWGJE/Tasks/v0qa.cxx#L166? auto weight = collision.mcCollision().weight(); spectra.fill(HIST("vertexZ"), collision.posZ(), weight); + + if (collision.has_mcCollision()) { + spectra.fill(HIST("hHasAssocMcCollision"), 0.5, weight); + } else { + spectra.fill(HIST("hHasAssocMcCollision"), 1.5, weight); + } + fillHistograms(collision, jets, tracks, true, weight); } PROCESS_SWITCH(RecoilJets, processMCDetLevelWeighted, "process MC detector level with event weight", false); @@ -489,7 +485,10 @@ struct RecoilJets { aod::JetParticles const& particles, FilteredJetsPartLevel const& jets) { - spectra.fill(HIST("vertexZ"), collision.posZ()); + if (skipMBGapEvent(collision)) + return; + + spectra.fill(HIST("vertexZMC"), collision.posZ()); fillMCPHistograms(collision, jets, particles); } PROCESS_SWITCH(RecoilJets, processMCPartLevel, "process MC particle level", false); @@ -498,8 +497,11 @@ struct RecoilJets { aod::JetParticles const& particles, FilteredJetsPartLevel const& jets) { + if (skipMBGapEvent(collision)) + return; + auto weight = collision.weight(); - spectra.fill(HIST("vertexZ"), collision.posZ(), weight); + spectra.fill(HIST("vertexZMC"), collision.posZ(), weight); fillMCPHistograms(collision, jets, particles, weight); } PROCESS_SWITCH(RecoilJets, processMCPartLevelWeighted, "process MC particle level with event weight", false); @@ -510,10 +512,16 @@ struct RecoilJets { FilteredMatchedJetsDetLevel const& mcdjets, FilteredMatchedJetsPartLevel const& mcpjets) { - if (skipEvent(collision)) + if (skipEvent(collision) || skipMBGapEvent(collision)) return; + auto mcpjetsPerMCCollision = mcpjets.sliceBy(partJetsPerCollision, collision.mcCollisionId()); - fillMatchedHistograms(tracks, mcdjets, mcpjetsPerMCCollision); + + if (bGetMissJets) { + fillMatchedHistograms(tracks, mcpjetsPerMCCollision, mcdjets); + } else { + fillMatchedHistograms(tracks, mcdjets, mcpjetsPerMCCollision); + } } PROCESS_SWITCH(RecoilJets, processJetsMatched, "process matching of MC jets (no weight)", false); @@ -523,13 +531,17 @@ struct RecoilJets { FilteredMatchedJetsDetLevel const& mcdjets, FilteredMatchedJetsPartLevel const& mcpjets) { - if (skipEvent(collision)) + if (skipEvent(collision) || skipMBGapEvent(collision)) return; auto mcpjetsPerMCCollision = mcpjets.sliceBy(partJetsPerCollision, collision.mcCollisionId()); auto weight = collision.mcCollision().weight(); - fillMatchedHistograms(tracks, mcdjets, mcpjetsPerMCCollision, weight); + if (bGetMissJets) { + fillMatchedHistograms(tracks, mcpjetsPerMCCollision, mcdjets, weight); + } else { + fillMatchedHistograms(tracks, mcdjets, mcpjetsPerMCCollision, weight); + } } PROCESS_SWITCH(RecoilJets, processJetsMatchedWeighted, "process matching of MC jets (weighted)", false); @@ -542,6 +554,12 @@ struct RecoilJets { return !jetderiveddatautilities::selectCollision(coll, eventSelectionBits) || !jetderiveddatautilities::selectTrigger(coll, triggerMaskBits); } + template + bool skipMBGapEvent(const Collision& coll) + { + return (skipMBGapEvents && coll.subGeneratorId()) == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap; + } + template bool skipTrack(const Track& track) { @@ -566,6 +584,55 @@ struct RecoilJets { { return 10. / (std::pow(weight, 1.0 / pTHatExponent)); } + + template + void dataForUnfolding(JetBase const& jetBase, JetsTag const&, bool bIsBaseJetRecoil, float weight = 1.0) + { + + bool bIsThereMatchedJet = jetBase.has_matchedJetGeo(); + if (bIsThereMatchedJet) { + const auto& jetsMatched = jetBase.template matchedJetGeo_as>(); + + for (const auto& jetMatched : jetsMatched) { + spectra.fill(HIST("hNumberMatchedJetsPerOneBaseJet"), jetsMatched.size(), jetMatched.pt(), weight); + + if (bGetMissJets) { + // Mean that base jet is particle level jet + spectra.fill(HIST("hJetPt_DetLevel_vs_PartLevel"), jetMatched.pt(), jetBase.pt(), weight); + spectra.fill(HIST("hJetPt_resolution"), (jetBase.pt() - jetMatched.pt()) / jetBase.pt(), jetBase.pt(), weight); + spectra.fill(HIST("hJetPhi_resolution"), jetBase.phi() - jetMatched.phi(), jetBase.pt(), weight); + + if (bIsBaseJetRecoil) { + spectra.fill(HIST("hJetPt_DetLevel_vs_PartLevel_RecoilJets"), jetMatched.pt(), jetBase.pt(), weight); + spectra.fill(HIST("hJetPt_resolution_RecoilJets"), (jetBase.pt() - jetMatched.pt()) / jetBase.pt(), jetBase.pt(), weight); + spectra.fill(HIST("hJetPhi_resolution_RecoilJets"), jetBase.phi() - jetMatched.phi(), jetBase.pt(), weight); + } + } else { + // Mean that base jet is detector level jet + spectra.fill(HIST("hJetPt_DetLevel_vs_PartLevel"), jetBase.pt(), jetMatched.pt(), weight); + spectra.fill(HIST("hJetPt_resolution"), (jetMatched.pt() - jetBase.pt()) / jetMatched.pt(), jetMatched.pt(), weight); + spectra.fill(HIST("hJetPhi_resolution"), jetMatched.phi() - jetBase.phi(), jetMatched.phi(), weight); + + if (bIsBaseJetRecoil) { + spectra.fill(HIST("hJetPt_DetLevel_vs_PartLevel_RecoilJets"), jetBase.pt(), jetMatched.pt(), weight); + spectra.fill(HIST("hJetPt_resolution_RecoilJets"), (jetMatched.pt() - jetBase.pt()) / jetMatched.pt(), jetMatched.pt(), weight); + spectra.fill(HIST("hJetPhi_resolution_RecoilJets"), jetMatched.phi() - jetBase.phi(), jetMatched.phi(), weight); + } + } + } + } else { + // No closest jet + if (bGetMissJets) { + spectra.fill(HIST("hMissedJets_pT"), jetBase.pt(), weight); + if (bIsBaseJetRecoil) + spectra.fill(HIST("hMissedJets_pT_RecoilJets"), jetBase.pt(), weight); + } else { + spectra.fill(HIST("hFakeJets_pT"), jetBase.pt(), weight); + if (bIsBaseJetRecoil) + spectra.fill(HIST("hFakeJets_pT_RecoilJets"), jetBase.pt(), weight); + } + } + } }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From d828c3b19f824dd4ca28513c76ce01c5865afe57 Mon Sep 17 00:00:00 2001 From: YubiaoWang Date: Wed, 23 Apr 2025 00:47:10 +0800 Subject: [PATCH 1051/1650] =?UTF-8?q?[PWGJE]=20removes=20the=20leading=20j?= =?UTF-8?q?et=20=CE=B7=E2=80=93=CF=95=20band=20from=20the=20random=20cone?= =?UTF-8?q?=20selection=20in=20delta=20pT;=20prepare=20trackong=20efficien?= =?UTF-8?q?cy=20process;=20remove=20some=20test=20plots=20(#10910)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PWGJE/Tasks/jetChargedV2.cxx | 181 ++++++++++++++++++++--------------- 1 file changed, 106 insertions(+), 75 deletions(-) diff --git a/PWGJE/Tasks/jetChargedV2.cxx b/PWGJE/Tasks/jetChargedV2.cxx index c88f40cb990..cb98a8bef7b 100644 --- a/PWGJE/Tasks/jetChargedV2.cxx +++ b/PWGJE/Tasks/jetChargedV2.cxx @@ -80,6 +80,7 @@ struct JetChargedV2 { Configurable> jetRadii{"jetRadii", std::vector{0.4}, "jet resolution parameters"}; Configurable vertexZCut{"vertexZCut", 10.0f, "Accepted z-vertex range"}; + Configurable trackDcaZmax{"trackDcaZmax", 99, "additional cut on dcaZ to PV for tracks; uniformTracks in particular don't cut on this at all"}; Configurable centralityMin{"centralityMin", -999.0, "minimum centrality"}; Configurable centralityMax{"centralityMax", 999.0, "maximum centrality"}; Configurable trackPtMin{"trackPtMin", 0.15, "minimum pT acceptance for tracks"}; @@ -96,6 +97,9 @@ struct JetChargedV2 { Configurable jetEtaMax{"jetEtaMax", 0.9, "maximum eta acceptance for jets"}; Configurable jetRadius{"jetRadius", 0.2, "jet resolution parameters"}; + Configurable localRhoFitPtMin{"localRhoFitPtMin", 0.2, "Minimum track pT used for local rho fluctuation fit"}; + Configurable localRhoFitPtMax{"localRhoFitPtMax", 5, "Maximum track pT used for local rho fluctuation fit"}; + Configurable randomConeR{"randomConeR", 0.4, "size of random Cone for estimating background fluctuations"}; Configurable trackOccupancyInTimeRangeMax{"trackOccupancyInTimeRangeMax", 999999, "maximum occupancy of tracks in neighbouring collisions in a given time range; only applied to reconstructed collisions (data and mcd jets), not mc collisions (mcp jets)"}; Configurable trackOccupancyInTimeRangeMin{"trackOccupancyInTimeRangeMin", -999999, "minimum occupancy of tracks in neighbouring collisions in a given time range; only applied to reconstructed collisions (data and mcd jets), not mc collisions (mcp jets)"}; @@ -173,12 +177,14 @@ struct JetChargedV2 { jetPtBins.push_back(jetPtTemp); jetPtBinsRhoAreaSub.push_back(jetPtTemp); while (jetPtTemp < jetPtMax) { - if (jetPtTemp < 100.0) { + double jetPtTempA = 100.0; + double jetPtTempB = 100.0; + if (jetPtTemp < jetPtTempA) { jetPtTemp += 1.0; jetPtBins.push_back(jetPtTemp); jetPtBinsRhoAreaSub.push_back(jetPtTemp); jetPtBinsRhoAreaSub.push_back(-jetPtTemp); - } else if (jetPtTemp < 200.0) { + } else if (jetPtTemp < jetPtTempB) { jetPtTemp += 5.0; jetPtBins.push_back(jetPtTemp); jetPtBinsRhoAreaSub.push_back(jetPtTemp); @@ -204,7 +210,18 @@ struct JetChargedV2 { eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast(eventSelections)); trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast(trackSelections)); + //< Track efficiency plots >// registry.add("h_collisions", "event status;event status;entries", {HistType::kTH1F, {{4, 0.0, 4.0}}}); + registry.add("h2_centrality_collisions", "centrality vs collisions; centrality; collisions", {HistType::kTH2F, {{120, -10., 110.}, {4, 0.0, 4.0}}}); + registry.add("h2_centrality_track_pt", "centrality vs track pT; centrality; #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {{1200, -10.0, 110.0}, {200, 0., 200.}}}); + registry.add("h2_centrality_track_eta", "centrality vs track #eta; centrality; #eta_{track}", {HistType::kTH2F, {{1200, -10.0, 110.0}, {100, -1.0, 1.0}}}); + registry.add("h2_centrality_track_phi", "centrality vs track #varphi; centrality; #varphi_{track}", {HistType::kTH2F, {{1200, -10.0, 110.0}, {160, -1.0, 7.}}}); + registry.add("h2_centrality_track_energy", "centrality vs track energy; centrality; Energy GeV", {HistType::kTH2F, {{120, -10., 110.}, {100, 0.0, 100.0}}}); + registry.add("h2_track_pt_track_sigmapt", "#sigma(#it{p}_{T})/#it{p}_{T}; #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {{100, 0., 10.}, {100000, 0.0, 100.0}}}); + registry.add("h2_track_pt_high_track_sigmapt", "#sigma(#it{p}_{T})/#it{p}_{T}; #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {{90, 10., 100.}, {100000, 0.0, 100.0}}}); + registry.add("h2_track_pt_track_sigma1overpt", "#sigma(1/#it{p}_{T}); #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {{100, 0., 10.}, {1000, 0.0, 10.0}}}); + registry.add("h2_track_pt_high_track_sigma1overpt", "#sigma(1/#it{p}_{T}); #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {{90, 10., 100.}, {1000, 0.0, 10.0}}}); + //< \sigma p_T at local rho test plot > registry.add("h_accept_Track", "all and accept track;Track;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); registry.add("h_accept_Track_init", "all and accept track;Track;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); @@ -251,10 +268,6 @@ struct JetChargedV2 { registry.add("h3_centrality_rhovsphi_phi", "centrality; #rho(#varphi); #Delta#varphi_{jet}", {HistType::kTH3F, {{120, -10.0, 110.0}, {200, 0.0, 200.0}, {40, 0., o2::constants::math::TwoPI}}}); //< \sigma p_T at local rho test plot | end > - registry.add("h2_centrality_track_pt", "centrality vs track pT; centrality; #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {{1200, -10.0, 110.0}, {200, 0., 200.}}}); - registry.add("h2_centrality_track_eta", "centrality vs track #eta; centrality; #eta_{track}", {HistType::kTH2F, {{1200, -10.0, 110.0}, {100, -1.0, 1.0}}}); - registry.add("h2_centrality_track_phi", "centrality vs track #varphi; centrality; #varphi_{track}", {HistType::kTH2F, {{1200, -10.0, 110.0}, {160, -1.0, 7.}}}); - registry.add("h_jet_pt_rhoareasubtracted", "jet pT rhoareasubtracted;#it{p}_{T,jet} (GeV/#it{c}); entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); registry.add("h_jet_pt_rholocal", "jet pT rholocal;#it{p}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); @@ -270,8 +283,6 @@ struct JetChargedV2 { registry.add("h2_centrality_deltapT_RandomCornPhi_RCprocess_rhorandomconewithoutleadingjet", "#it{p}_{T,random cone} - #it{area, random cone} * #it{rho}; #Delta#varphi_{jet}", {HistType::kTH2F, {{400, -200.0, 200.0}, {100, 0., o2::constants::math::TwoPI}}}); registry.add("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithoutleadingjet", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}(#varphi); #Delta#varphi_{jet}", {HistType::kTH3F, {{100, 0.0, 100.0}, {400, -200.0, 200.0}, {100, 0., o2::constants::math::TwoPI}}}); - registry.add("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithoutoneleadingjet", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}(#varphi); #Delta#varphi_{jet}", {HistType::kTH3F, {{100, 0.0, 100.0}, {400, -200.0, 200.0}, {100, 0., o2::constants::math::TwoPI}}}); - registry.add("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithouttwoleadingjet", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}(#varphi); #Delta#varphi_{jet}", {HistType::kTH3F, {{100, 0.0, 100.0}, {400, -200.0, 200.0}, {100, 0., o2::constants::math::TwoPI}}}); //< bkg sub plot | end >// //< median rho >// registry.add("h_jet_pt_in_plane_v2", "jet pT;#it{p}^{in-plane}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); @@ -331,14 +342,16 @@ struct JetChargedV2 { template bool isAcceptedJet(U const& jet) { - if (jetAreaFractionMin > -98.0) { + double jetAreaFractionMinCfgMin = -98.0; + double jetAreaFractionMinCfgMax = 9998.0; + if (jetAreaFractionMin > jetAreaFractionMinCfgMin) { if (jet.area() < jetAreaFractionMin * o2::constants::math::PI * (jet.r() / 100.0) * (jet.r() / 100.0)) { return false; } } bool checkConstituentPt = true; - bool checkConstituentMinPt = (leadingConstituentPtMin > -98.0); - bool checkConstituentMaxPt = (leadingConstituentPtMax < 9998.0); + bool checkConstituentMinPt = (leadingConstituentPtMin > jetAreaFractionMinCfgMin); + bool checkConstituentMaxPt = (leadingConstituentPtMax < jetAreaFractionMinCfgMax); if (!checkConstituentMinPt && !checkConstituentMaxPt) { checkConstituentPt = false; } @@ -374,6 +387,24 @@ struct JetChargedV2 { return false; } + template + void fillTrackHistograms(T const& collision, U const& tracks, float weight = 1.0) + { + for (auto const& track : tracks) { + if (!(jetderiveddatautilities::selectTrack(track, trackSelection) && jetderiveddatautilities::selectTrackDcaZ(track, trackDcaZmax))) { + continue; + } + registry.fill(HIST("h2_centrality_track_pt"), collision.centrality(), track.pt(), weight); + registry.fill(HIST("h2_centrality_track_eta"), collision.centrality(), track.eta(), weight); + registry.fill(HIST("h2_centrality_track_phi"), collision.centrality(), track.phi(), weight); + registry.fill(HIST("h2_centrality_track_energy"), collision.centrality(), track.energy(), weight); + registry.fill(HIST("h2_track_pt_track_sigma1overpt"), track.pt(), track.sigma1Pt(), weight); + registry.fill(HIST("h2_track_pt_track_sigmapt"), track.pt(), track.sigma1Pt() * track.pt(), weight); + registry.fill(HIST("h2_track_pt_high_track_sigma1overpt"), track.pt(), track.sigma1Pt(), weight); + registry.fill(HIST("h2_track_pt_high_track_sigmapt"), track.pt(), track.sigma1Pt() * track.pt(), weight); + } + } + void fillLeadingJetQA(double leadingJetPt, double leadingJetPhi, double leadingJetEta) { registry.fill(HIST("leadJetPt"), leadingJetPt); @@ -403,7 +434,12 @@ struct JetChargedV2 { int detInd = detId * 4 + cfgnTotalSystem * 4 * (nmode - 2); int refAInd = refAId * 4 + cfgnTotalSystem * 4 * (nmode - 2); int refBInd = refBId * 4 + cfgnTotalSystem * 4 * (nmode - 2); - if (nmode == 2) { + int cfgNmodA = 2; + int cfgNmodB = 3; + int evtPlnAngleA = 7; + int evtPlnAngleB = 3; + int evtPlnAngleC = 5; + if (nmode == cfgNmodA) { if (collision.qvecAmp()[detId] > 1e-8 || collision.qvecAmp()[refAId] < 1e-8 || collision.qvecAmp()[refBId] < 1e-8) { histosQA.fill(HIST("histQvecUncorV2"), collision.qvecRe()[detInd], collision.qvecIm()[detInd], collision.cent()); histosQA.fill(HIST("histQvecRectrV2"), collision.qvecRe()[detInd + 1], collision.qvecIm()[detInd + 1], collision.cent()); @@ -419,7 +455,7 @@ struct JetChargedV2 { histosQA.fill(HIST("histEvtPlRes_SigRefBV2"), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode), helperEP.GetEventPlane(collision.qvecRe()[refBInd + 3], collision.qvecIm()[refBInd + 3], nmode), nmode), collision.cent()); histosQA.fill(HIST("histEvtPlRes_RefARefBV2"), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[refAInd + 3], collision.qvecIm()[refAInd + 3], nmode), helperEP.GetEventPlane(collision.qvecRe()[refBInd + 3], collision.qvecIm()[refBInd + 3], nmode), nmode), collision.cent()); } - } else if (nmode == 3) { + } else if (nmode == cfgNmodB) { histosQA.fill(HIST("histQvecUncorV3"), collision.qvecRe()[detInd], collision.qvecIm()[detInd], collision.cent()); histosQA.fill(HIST("histQvecRectrV3"), collision.qvecRe()[detInd + 1], collision.qvecIm()[detInd + 1], collision.cent()); histosQA.fill(HIST("histQvecTwistV3"), collision.qvecRe()[detInd + 2], collision.qvecIm()[detInd + 2], collision.cent()); @@ -435,7 +471,7 @@ struct JetChargedV2 { histosQA.fill(HIST("histEvtPlRes_RefARefBV3"), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[refAInd + 3], collision.qvecIm()[refAInd + 3], nmode), helperEP.GetEventPlane(collision.qvecRe()[refBInd + 3], collision.qvecIm()[refBInd + 3], nmode), nmode), collision.cent()); } - if (nmode == 2) { + if (nmode == cfgNmodA) { double phiMinusPsi2; if (collision.qvecAmp()[detId] < 1e-8) { continue; @@ -455,8 +491,7 @@ struct JetChargedV2 { registry.fill(HIST("h2_centrality_jet_pt_rhoareasubtracted"), collision.centrality(), jet.pt() - (collision.rho() * jet.area()), 1.0); phiMinusPsi2 = jet.phi() - ep2; - - if ((phiMinusPsi2 < o2::constants::math::PIQuarter) || (phiMinusPsi2 >= 7 * o2::constants::math::PIQuarter) || (phiMinusPsi2 >= 3 * o2::constants::math::PIQuarter && phiMinusPsi2 < 5 * o2::constants::math::PIQuarter)) { + if ((phiMinusPsi2 < o2::constants::math::PIQuarter) || (phiMinusPsi2 >= evtPlnAngleA * o2::constants::math::PIQuarter) || (phiMinusPsi2 >= evtPlnAngleB * o2::constants::math::PIQuarter && phiMinusPsi2 < evtPlnAngleC * o2::constants::math::PIQuarter)) { registry.fill(HIST("h_jet_pt_in_plane_v2"), jet.pt() - (collision.rho() * jet.area()), 1.0); registry.fill(HIST("h2_centrality_jet_pt_in_plane_v2"), collision.centrality(), jet.pt() - (collision.rho() * jet.area()), 1.0); } else { @@ -464,7 +499,7 @@ struct JetChargedV2 { registry.fill(HIST("h2_centrality_jet_pt_out_of_plane_v2"), collision.centrality(), jet.pt() - (collision.rho() * jet.area()), 1.0); } } - } else if (nmode == 3) { + } else if (nmode == cfgNmodB) { double phiMinusPsi3; float ep3 = helperEP.GetEventPlane(collision.qvecRe()[detInd], collision.qvecIm()[detInd], nmode); for (auto const& jet : jets) { @@ -479,7 +514,7 @@ struct JetChargedV2 { } phiMinusPsi3 = jet.phi() - ep3; - if ((phiMinusPsi3 < o2::constants::math::PIQuarter) || (phiMinusPsi3 >= 7 * o2::constants::math::PIQuarter) || (phiMinusPsi3 >= 3 * o2::constants::math::PIQuarter && phiMinusPsi3 < 5 * o2::constants::math::PIQuarter)) { + if ((phiMinusPsi3 < o2::constants::math::PIQuarter) || (phiMinusPsi3 >= evtPlnAngleA * o2::constants::math::PIQuarter) || (phiMinusPsi3 >= evtPlnAngleB * o2::constants::math::PIQuarter && phiMinusPsi3 < evtPlnAngleC * o2::constants::math::PIQuarter)) { registry.fill(HIST("h_jet_pt_in_plane_v3"), jet.pt() - (collision.rho() * jet.area()), 1.0); registry.fill(HIST("h2_centrality_jet_pt_in_plane_v3"), collision.centrality(), jet.pt() - (collision.rho() * jet.area()), 1.0); } else { @@ -520,7 +555,7 @@ struct JetChargedV2 { int nTrk = 0; if (jets.size() > 0) { for (auto const& track : tracks) { - if (jetderiveddatautilities::selectTrack(track, trackSelection) && (std::fabs(track.eta() - leadingJetEta) > jetRadius) && track.pt() >= 0.2 && track.pt() <= 5.) { + if (jetderiveddatautilities::selectTrack(track, trackSelection) && (std::fabs(track.eta() - leadingJetEta) > jetRadius) && track.pt() >= localRhoFitPtMin && track.pt() <= localRhoFitPtMax) { registry.fill(HIST("h_accept_Track"), 2.5); nTrk += 1; } @@ -537,7 +572,7 @@ struct JetChargedV2 { if (jets.size() > 0) { for (auto const& trackfit : tracks) { registry.fill(HIST("h_accept_Track"), 0.5); - if (jetderiveddatautilities::selectTrack(trackfit, trackSelection) && (std::fabs(trackfit.eta() - leadingJetEta) > jetRadius) && trackfit.pt() >= 0.2 && trackfit.pt() <= 5.) { + if (jetderiveddatautilities::selectTrack(trackfit, trackSelection) && (std::fabs(trackfit.eta() - leadingJetEta) > jetRadius) && trackfit.pt() >= localRhoFitPtMin && trackfit.pt() <= localRhoFitPtMax) { registry.fill(HIST("h_accept_Track_Fit"), 0.5); fitTrack += 1; } @@ -545,7 +580,7 @@ struct JetChargedV2 { for (auto const& track : tracks) { registry.fill(HIST("h_accept_Track"), 1.5); - if (jetderiveddatautilities::selectTrack(track, trackSelection) && (std::fabs(track.eta() - leadingJetEta) > jetRadius) && track.pt() >= 0.2 && track.pt() <= 5.) { + if (jetderiveddatautilities::selectTrack(track, trackSelection) && (std::fabs(track.eta() - leadingJetEta) > jetRadius) && track.pt() >= localRhoFitPtMin && track.pt() <= localRhoFitPtMax) { accptTrack += 1; registry.fill(HIST("h_accept_Track"), 2.5); hPtsumSumptFit->Fill(track.phi(), track.pt()); @@ -563,14 +598,19 @@ struct JetChargedV2 { double ep2 = 0.; double ep3 = 0.; + int cfgNmodA = 2; + int cfgNmodB = 3; + int evtPlnAngleA = 7; + int evtPlnAngleB = 3; + int evtPlnAngleC = 5; for (uint i = 0; i < cfgnMods->size(); i++) { int nmode = cfgnMods->at(i); int detInd = detId * 4 + cfgnTotalSystem * 4 * (nmode - 2); - if (nmode == 2) { + if (nmode == cfgNmodA) { if (collision.qvecAmp()[detId] > 1e-8) { ep2 = helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode); } - } else if (nmode == 3) { + } else if (nmode == cfgNmodB) { if (collision.qvecAmp()[detId] > 1e-8) { ep3 = helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode); } @@ -609,7 +649,8 @@ struct JetChargedV2 { temppara[2] = fFitModulationV2v3->GetParameter(2); temppara[3] = fFitModulationV2v3->GetParameter(3); temppara[4] = fFitModulationV2v3->GetParameter(4); - for (int i = 1; i <= 5; i++) { + int paraNum = 5; + for (int i = 1; i <= paraNum; i++) { registry.fill(HIST("h2_evt_fitpara"), evtnum, i - 0.5, temppara[i - 1]); } @@ -652,9 +693,13 @@ struct JetChargedV2 { registry.fill(HIST("h2_PChi2_CombinFit"), cDF, chiSqr / (static_cast(nDF))); registry.fill(HIST("Thn_PChi2_CombinFitCent"), collision.centrality(), cDF, chiSqr / (static_cast(nDF))); double evtcent = collision.centrality(); - if (evtcent >= 0 && evtcent <= 5) { + int evtCentAreaMin = 0; + int evtCentAreaMax = 5; + int evtMidAreaMin = 30; + int evtMidAreaMax = 50; + if (evtcent >= evtCentAreaMin && evtcent <= evtCentAreaMax) { registry.fill(HIST("h2_PChi2_CombinFitA"), cDF, chiSqr / (static_cast(nDF))); - } else if (evtcent >= 30 && evtcent <= 50) { + } else if (evtcent >= evtMidAreaMin && evtcent <= evtMidAreaMax) { registry.fill(HIST("h2_PChi2_CombinFitB"), cDF, chiSqr / (static_cast(nDF))); } for (uint i = 0; i < cfgnMods->size(); i++) { @@ -680,7 +725,7 @@ struct JetChargedV2 { registry.fill(HIST("h2_phi_rholocal_cent"), collision.centrality(), rholocal, 1.0); registry.fill(HIST("h3_centrality_localrho_phi"), collision.centrality(), rholocal, jet.phi() - ep2); - if (nmode == 2) { + if (nmode == cfgNmodA) { registry.fill(HIST("h_jet_pt_rholocal"), jet.pt() - (rholocal * jet.area()), 1.0); double phiMinusPsi2; @@ -692,14 +737,14 @@ struct JetChargedV2 { registry.fill(HIST("h2_phi_rholocal"), jet.phi() - ep2, rholocal, 1.0); registry.fill(HIST("h_jet_pt_inclusive_v2_rho"), jet.pt() - (rholocal * jet.area()), 1.0); - if ((phiMinusPsi2 < o2::constants::math::PIQuarter) || (phiMinusPsi2 >= 7 * o2::constants::math::PIQuarter) || (phiMinusPsi2 >= 3 * o2::constants::math::PIQuarter && phiMinusPsi2 < 5 * o2::constants::math::PIQuarter)) { + if ((phiMinusPsi2 < o2::constants::math::PIQuarter) || (phiMinusPsi2 >= evtPlnAngleA * o2::constants::math::PIQuarter) || (phiMinusPsi2 >= evtPlnAngleB * o2::constants::math::PIQuarter && phiMinusPsi2 < evtPlnAngleC * o2::constants::math::PIQuarter)) { registry.fill(HIST("h_jet_pt_in_plane_v2_rho"), jet.pt() - (rholocal * jet.area()), 1.0); registry.fill(HIST("h2_centrality_jet_pt_in_plane_v2_rho"), collision.centrality(), jet.pt() - (rholocal * jet.area()), 1.0); } else { registry.fill(HIST("h_jet_pt_out_of_plane_v2_rho"), jet.pt() - (rholocal * jet.area()), 1.0); registry.fill(HIST("h2_centrality_jet_pt_out_of_plane_v2_rho"), collision.centrality(), jet.pt() - (rholocal * jet.area()), 1.0); } - } else if (nmode == 3) { + } else if (nmode == cfgNmodB) { double phiMinusPsi3; if (collision.qvecAmp()[detId] < 1e-8) { continue; @@ -707,7 +752,7 @@ struct JetChargedV2 { ep3 = helperEP.GetEventPlane(collision.qvecRe()[detInd], collision.qvecIm()[detInd], nmode); phiMinusPsi3 = jet.phi() - ep3; - if ((phiMinusPsi3 < o2::constants::math::PIQuarter) || (phiMinusPsi3 >= 7 * o2::constants::math::PIQuarter) || (phiMinusPsi3 >= 3 * o2::constants::math::PIQuarter && phiMinusPsi3 < 5 * o2::constants::math::PIQuarter)) { + if ((phiMinusPsi3 < o2::constants::math::PIQuarter) || (phiMinusPsi3 >= evtPlnAngleA * o2::constants::math::PIQuarter) || (phiMinusPsi3 >= evtPlnAngleB * o2::constants::math::PIQuarter && phiMinusPsi3 < evtPlnAngleC * o2::constants::math::PIQuarter)) { registry.fill(HIST("h_jet_pt_in_plane_v3_rho"), jet.pt() - (rholocal * jet.area()), 1.0); registry.fill(HIST("h2_centrality_jet_pt_in_plane_v3_rho"), collision.centrality(), jet.pt() - (rholocal * jet.area()), 1.0); } else { @@ -723,12 +768,11 @@ struct JetChargedV2 { float randomConeEta = randomNumber.Uniform(trackEtaMin + randomConeR, trackEtaMax - randomConeR); float randomConePhi = randomNumber.Uniform(0.0, o2::constants::math::TwoPI); float randomConePt = 0; - double integralValueRC = fFitModulationV2v3->Integral(randomConePhi - randomConeR, randomConePhi + randomConeR); double rholocalRC = collision.rho() / (2 * randomConeR * temppara[0]) * integralValueRC; int nmode = cfgnMods->at(i); - if (nmode == 2) { + if (nmode == cfgNmodA) { double rcPhiPsi2; rcPhiPsi2 = randomConePhi - ep2; @@ -745,17 +789,24 @@ struct JetChargedV2 { // removing the leading jet from the random cone if (jets.size() > 0) { // if there are no jets in the acceptance (from the jetfinder cuts) then there can be no leading jet - float dPhiLeadingJet = RecoDecay::constrainAngle(jets.iteratorAt(0).phi() - randomConePhi, static_cast(-o2::constants::math::PI)); - float dEtaLeadingJet = jets.iteratorAt(0).eta() - randomConeEta; + float leadingJetEta = jets.iteratorAt(0).eta(); + float leadingJetPhi = jets.iteratorAt(0).phi(); + float etaBandWidth = 2 * randomConeR; bool jetWasInCone = false; - while (std::sqrt(dEtaLeadingJet * dEtaLeadingJet + dPhiLeadingJet * dPhiLeadingJet) < jets.iteratorAt(0).r() / 100.0 + randomConeR) { - jetWasInCone = true; + do { randomConeEta = randomNumber.Uniform(trackEtaMin + randomConeR, trackEtaMax - randomConeR); randomConePhi = randomNumber.Uniform(0.0, o2::constants::math::TwoPI); - dPhiLeadingJet = RecoDecay::constrainAngle(jets.iteratorAt(0).phi() - randomConePhi, static_cast(-o2::constants::math::PI)); - dEtaLeadingJet = jets.iteratorAt(0).eta() - randomConeEta; - } + + float dEta = randomConeEta - leadingJetEta; + float dPhi = RecoDecay::constrainAngle(randomConePhi - leadingJetPhi, static_cast(-o2::constants::math::PI)); + + if (std::abs(dEta) > etaBandWidth && std::sqrt(dEta * dEta + dPhi * dPhi) > randomConeR + jets.iteratorAt(0).r() / 100.0) { + break; + } + jetWasInCone = true; + } while (true); + if (jetWasInCone) { randomConePt = 0.0; for (auto const& track : tracks) { @@ -771,27 +822,7 @@ struct JetChargedV2 { } registry.fill(HIST("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithoutleadingjet"), collision.centrality(), randomConePt - o2::constants::math::PI * randomConeR * randomConeR * rholocalRC, rcPhiPsi2, 1.0); registry.fill(HIST("h3_centrality_deltapT_RandomCornPhi_rhorandomconewithoutleadingjet"), collision.centrality(), randomConePt - o2::constants::math::PI * randomConeR * randomConeR * collision.rho(), rcPhiPsi2, 1.0); - - // randomised eta,phi for tracks, to assess part of fluctuations coming from statistically independently emitted particles, removing tracks from 2 leading jets - double randomConePtWithoutOneLeadJet = 0; - double randomConePtWithoutTwoLeadJet = 0; - for (auto const& track : tracks) { - if (jetderiveddatautilities::selectTrack(track, trackSelection)) { - float dPhi = RecoDecay::constrainAngle(randomNumber.Uniform(0.0, o2::constants::math::TwoPI) - randomConePhi, static_cast(-o2::constants::math::PI)); - float dEta = randomNumber.Uniform(trackEtaMin, trackEtaMax) - randomConeEta; - if (std::sqrt(dEta * dEta + dPhi * dPhi) < randomConeR) { - if (!trackIsInJet(track, jets.iteratorAt(0))) { - randomConePtWithoutOneLeadJet += track.pt(); - if (!trackIsInJet(track, jets.iteratorAt(1))) { - randomConePtWithoutTwoLeadJet += track.pt(); - } - } - } - } - } - registry.fill(HIST("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithoutoneleadingjet"), collision.centrality(), randomConePtWithoutOneLeadJet - o2::constants::math::PI * randomConeR * randomConeR * rholocalRC, rcPhiPsi2, 1.0); - registry.fill(HIST("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithouttwoleadingjet"), collision.centrality(), randomConePtWithoutTwoLeadJet - o2::constants::math::PI * randomConeR * randomConeR * rholocalRC, rcPhiPsi2, 1.0); - } else if (nmode == 3) { + } else if (nmode == cfgNmodB) { continue; } } @@ -819,8 +850,9 @@ struct JetChargedV2 { int nmode = cfgnMods->at(i); int detInd = detId * 4 + cfgnTotalSystem * 4 * (nmode - 2); - - if (nmode == 2) { + int cfgNmodA = 2; + int cfgNmodB = 3; + if (nmode == cfgNmodA) { double rcPhiPsi2; float evtPl2 = helperEP.GetEventPlane(collision.qvecRe()[detInd], collision.qvecIm()[detInd], nmode); rcPhiPsi2 = randomConePhi - evtPl2; @@ -861,7 +893,7 @@ struct JetChargedV2 { } } registry.fill(HIST("h2_centrality_deltapT_RandomCornPhi_RCprocess_rhorandomconewithoutleadingjet"), randomConePt - o2::constants::math::PI * randomConeR * randomConeR * collision.rho(), rcPhiPsi2, 1.0); - } else if (nmode == 3) { + } else if (nmode == cfgNmodB) { continue; } } @@ -869,24 +901,23 @@ struct JetChargedV2 { PROCESS_SWITCH(JetChargedV2, processRandomConeDataV2, "QA for random cone estimation of background fluctuations in data", true); void processTracksQA(soa::Filtered>::iterator const& collision, - soa::Filtered const& tracks) + soa::Filtered> const& tracks) { - if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { - return; - } + registry.fill(HIST("h_collisions"), 0.5); + registry.fill(HIST("h2_centrality_collisions"), collision.centrality(), 0.5); if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { return; } - for (auto const& track : tracks) { - if (!jetderiveddatautilities::selectTrack(track, trackSelection)) { - continue; - } - registry.fill(HIST("h2_centrality_track_pt"), collision.centrality(), track.pt()); - registry.fill(HIST("h2_centrality_track_eta"), collision.centrality(), track.eta()); - registry.fill(HIST("h2_centrality_track_phi"), collision.centrality(), track.phi()); + registry.fill(HIST("h_collisions"), 1.5); + registry.fill(HIST("h2_centrality_collisions"), collision.centrality(), 1.5); + if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { + return; } + registry.fill(HIST("h_collisions"), 2.5); + registry.fill(HIST("h2_centrality_collisions"), collision.centrality(), 2.5); + fillTrackHistograms(collision, tracks); } - PROCESS_SWITCH(JetChargedV2, processTracksQA, "QA for charged tracks", true); + PROCESS_SWITCH(JetChargedV2, processTracksQA, "QA for charged tracks", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 9dba7e9f7c972b8b393d11fd6cc0b52f8fd20578 Mon Sep 17 00:00:00 2001 From: Dongguk Kim <157434406+DonggukKim0@users.noreply.github.com> Date: Wed, 23 Apr 2025 01:47:21 +0900 Subject: [PATCH 1052/1650] [PWGJE] PWGJE:dijet mass analysis task (#10919) --- PWGJE/Tasks/dijetFinderQA.cxx | 181 ++++++++++++---------------------- 1 file changed, 61 insertions(+), 120 deletions(-) diff --git a/PWGJE/Tasks/dijetFinderQA.cxx b/PWGJE/Tasks/dijetFinderQA.cxx index 4f094c68cd9..4dd9292a1ac 100644 --- a/PWGJE/Tasks/dijetFinderQA.cxx +++ b/PWGJE/Tasks/dijetFinderQA.cxx @@ -48,71 +48,58 @@ struct DijetFinderQATask { HistogramRegistry registry; - Configurable setJetPtCut{"setJetPtCut", 20, "set jet pt minimum cut"}; - Configurable selectedJetsRadius{"selectedJetsRadius", 0.4, "resolution parameter for histograms without radius"}; - Configurable jetPtMax{"jetPtMax", 200., "set jet pT bin max"}; - Configurable vertexZCut{"vertexZCut", 10.0f, "Accepted z-vertex range"}; Configurable centralityMin{"centralityMin", -999.0, "minimum centrality"}; Configurable centralityMax{"centralityMax", 999.0, "maximum centrality"}; - Configurable jetAreaFractionMin{"jetAreaFractionMin", -99.0, "used to make a cut on the jet areas"}; - Configurable leadingConstituentPtMin{"leadingConstituentPtMin", -99.0, "minimum pT selection on jet constituent"}; - Configurable leadingConstituentPtMax{"leadingConstituentPtMax", 9999.0, "maximum pT selection on jet constituent"}; + Configurable eventSelections{"eventSelections", "sel8", "choose event selection"}; + Configurable vertexZCut{"vertexZCut", 10.0f, "Accepted z-vertex range"}; + Configurable trackSelections{"trackSelections", "globalTracks", "set track selections"}; Configurable trackPtMin{"trackPtMin", 0.15, "minimum pT acceptance for tracks"}; - Configurable trackPtMax{"trackPtMax", 100.0, "maximum pT acceptance for tracks"}; + Configurable trackPtMax{"trackPtMax", 1000.0, "maximum pT acceptance for tracks"}; Configurable trackEtaMin{"trackEtaMin", -0.9, "minimum eta acceptance for tracks"}; Configurable trackEtaMax{"trackEtaMax", 0.9, "maximum eta acceptance for tracks"}; + Configurable leadingConstituentPtMin{"leadingConstituentPtMin", -99.0, "minimum pT selection on jet constituent"}; + Configurable leadingConstituentPtMax{"leadingConstituentPtMax", 9999.0, "maximum pT selection on jet constituent"}; + Configurable setJetPtCut{"setJetPtCut", 20., "set jet pt minimum cut"}; + Configurable setPhiCut{"setPhiCut", 0.5, "set phicut"}; + Configurable jetR{"jetR", 0.4, "jet resolution parameter"}; + Configurable jetPtMin{"jetPtMin", 20.0, "minimum jet pT cut"}; + Configurable jetPtMax{"jetPtMax", 200., "set jet pT bin max"}; Configurable jetEtaMin{"jetEtaMin", -0.5, "minimum jet pseudorapidity"}; Configurable jetEtaMax{"jetEtaMax", 0.5, "maximum jet pseudorapidity"}; - Configurable jetPtMin{"jetPtMin", 20.0, "minimum jet pT cut"}; - Configurable jetR{"jetR", 0.4, "jet resolution parameter"}; - Configurable eventSelections{"eventSelections", "sel8", "choose event selection"}; - Configurable trackSelections{"trackSelections", "globalTracks", "set track selections"}; - Configurable checkMcCollisionIsMatched{"checkMcCollisionIsMatched", false, "0: count whole MCcollisions, 1: select MCcollisions which only have their correspond collisions"}; + Configurable jetAreaFractionMin{"jetAreaFractionMin", -99.0, "used to make a cut on the jet areas"}; - std::vector eventSelectionBits; + std::vector eventSelection; int trackSelection = -1; - std::vector jetPtBins; + std::vector dijetMassBins; void init(o2::framework::InitContext&) { - eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast(eventSelections)); + eventSelection = jetderiveddatautilities::initialiseEventSelectionBits(static_cast(eventSelections)); trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast(trackSelections)); - auto jetPtTemp = 0.0; - jetPtBins.push_back(jetPtTemp); - while (jetPtTemp < jetPtMax) { - if (jetPtTemp < 100.0) { - jetPtTemp += 1.0; - jetPtBins.push_back(jetPtTemp); - } else if (jetPtTemp < 200.0) { - jetPtTemp += 5.0; - jetPtBins.push_back(jetPtTemp); - } else { - jetPtTemp += 10.0; - jetPtBins.push_back(jetPtTemp); - } + auto dijetMassTemp = 0.0; + while (dijetMassTemp <= 2 * jetPtMax) { + dijetMassBins.push_back(dijetMassTemp); + dijetMassTemp += 5.0; } - AxisSpec jetPtAxis = {jetPtBins, "M_{jj} (GeV/#it{c}^2)"}; + AxisSpec dijetMassAxis = {dijetMassBins, "M_{jj} (GeV/#it{c}^2)"}; if (doprocessDijetMCP) { - registry.add("h_part_jet_pt", "Jet pt MCP;;entries", {HistType::kTH1F, {jetPtAxis}}); - registry.add("h_part_dijet_mass", "Dijet invariant mass;;entries", {HistType::kTH1F, {jetPtAxis}}); + registry.add("h_part_dijet_mass", "Dijet invariant mass;;entries", {HistType::kTH1F, {dijetMassAxis}}); } if (doprocessDijetMCD) { - registry.add("h_detec_jet_pt", "Jet pt MCD;;entries", {HistType::kTH1F, {jetPtAxis}}); - registry.add("h_detec_dijet_mass", "Dijet invariant mass;;entries", {HistType::kTH1F, {jetPtAxis}}); + registry.add("h_detec_dijet_mass", "Dijet invariant mass;;entries", {HistType::kTH1F, {dijetMassAxis}}); } if (doprocessDijetData) { - registry.add("h_data_jet_pt", "Jet pt Data;;entries", {HistType::kTH1F, {jetPtAxis}}); - registry.add("h_data_dijet_mass", "Dijet invariant mass;;entries", {HistType::kTH1F, {jetPtAxis}}); + registry.add("h_data_dijet_mass", "Dijet invariant mass;;entries", {HistType::kTH1F, {dijetMassAxis}}); } if (doprocessDijetMCMatched) { - registry.add("h_matched_dijet_mass", "M_{jj matched};M_{jj part}; M_{jj det}", {HistType::kTH2F, {jetPtAxis, jetPtAxis}}); + registry.add("h_matched_dijet_mass", "M_{jj matched};M_{jj part}; M_{jj det}", {HistType::kTH2F, {dijetMassAxis, dijetMassAxis}}); } } @@ -120,8 +107,7 @@ struct DijetFinderQATask { Filter trackCuts = (aod::jtrack::pt >= trackPtMin && aod::jtrack::pt < trackPtMax && aod::jtrack::eta > trackEtaMin && aod::jtrack::eta < trackEtaMax); Filter eventCuts = (nabs(aod::jcollision::posZ) < vertexZCut && aod::jcollision::centrality >= centralityMin && aod::jcollision::centrality < centralityMax); Filter mcCollisionsFilter = nabs(aod::jmccollision::posZ) < vertexZCut; - Filter jetCuts = aod::jet::pt > jetPtMin&& aod::jet::r == nround(jetR.node() * 100.0f); // ********** - PresliceUnsorted> CollisionsPerMCPCollision = aod::jmccollisionlb::mcCollisionId; + Filter jetCuts = aod::jet::pt > jetPtMin&& aod::jet::r == nround(jetR.node() * 100.0f); /****************************************************************************************************************************************************************/ template @@ -160,30 +146,6 @@ struct DijetFinderQATask { return true; } - template - void fillJetPtHistogramsMCP(T const& jet) - { - if (jet.r() == round(selectedJetsRadius * 100.0f)) { - registry.fill(HIST("h_part_jet_pt"), jet.pt()); - } - } - - template - void fillJetPtHistogramsMCD(T const& jet) - { - if (jet.r() == round(selectedJetsRadius * 100.0f)) { - registry.fill(HIST("h_detec_jet_pt"), jet.pt()); - } - } - - template - void fillJetPtHistogramsData(T const& jet) - { - if (jet.r() == round(selectedJetsRadius * 100.0f)) { - registry.fill(HIST("h_data_jet_pt"), jet.pt()); - } - } - template void fillMassHistogramsMCP(T const& mass) { @@ -217,7 +179,6 @@ struct DijetFinderQATask { { std::vector> jetPtcuts; for (auto& jet : jets) { - fillJetPtHistogramsMCP(jet); jetPtcuts.push_back({jet.pt(), jet.eta(), jet.phi()}); } @@ -227,18 +188,14 @@ struct DijetFinderQATask { for (size_t i = 1; i < jetPtcuts.size() && !found_pair; i++) { auto& candidate_jet = jetPtcuts[i]; - Double_t dphi = fabs(candidate_jet[2] - leading_jet[2]); - if (dphi > M_PI) { - dphi = 2 * M_PI - dphi; - } - if (dphi > 2 * M_PI / 3) { - double pt1 = leading_jet[0]; - double pt2 = candidate_jet[0]; - double eta1 = leading_jet[1]; - double eta2 = candidate_jet[1]; - double phi1 = leading_jet[2]; - double phi2 = candidate_jet[2]; - double dijet_mass = sqrt(2 * pt1 * pt2 * (cosh(eta1 - eta2) - cos(phi1 - phi2))); + Double_t dphi = fabs(leading_jet[2] - candidate_jet[2]); + Double_t deta = fabs(leading_jet[1] - candidate_jet[1]); + Double_t condition = fabs(dphi - M_PI); + + if (condition < setPhiCut * M_PI) { + Double_t pt1 = leading_jet[0]; + Double_t pt2 = candidate_jet[0]; + Double_t dijet_mass = sqrt(2 * pt1 * pt2 * (cosh(deta) - cos(dphi))); fillMassHistogramsMCP(dijet_mass); found_pair = true; } @@ -249,12 +206,11 @@ struct DijetFinderQATask { void processDijetMCD(soa::Filtered::iterator const& collision, soa::Filtered const& jets) { - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelection)) { return; } std::vector> jetPtcuts; for (auto& jet : jets) { - fillJetPtHistogramsMCD(jet); jetPtcuts.push_back({jet.pt(), jet.eta(), jet.phi()}); } @@ -264,18 +220,14 @@ struct DijetFinderQATask { for (size_t i = 1; i < jetPtcuts.size() && !found_pair; i++) { auto& candidate_jet = jetPtcuts[i]; - Double_t dphi = fabs(candidate_jet[2] - leading_jet[2]); - if (dphi > M_PI) { - dphi = 2 * M_PI - dphi; - } - if (dphi > 2 * M_PI / 3) { - double pt1 = leading_jet[0]; - double pt2 = candidate_jet[0]; - double eta1 = leading_jet[1]; - double eta2 = candidate_jet[1]; - double phi1 = leading_jet[2]; - double phi2 = candidate_jet[2]; - double dijet_mass = sqrt(2 * pt1 * pt2 * (cosh(eta1 - eta2) - cos(phi1 - phi2))); + Double_t dphi = fabs(leading_jet[2] - candidate_jet[2]); + Double_t deta = fabs(leading_jet[1] - candidate_jet[1]); + Double_t condition = fabs(dphi - M_PI); + + if (condition < setPhiCut * M_PI) { + Double_t pt1 = leading_jet[0]; + Double_t pt2 = candidate_jet[0]; + Double_t dijet_mass = sqrt(2 * pt1 * pt2 * (cosh(deta) - cos(dphi))); fillMassHistogramsMCD(dijet_mass); found_pair = true; } @@ -286,13 +238,12 @@ struct DijetFinderQATask { void processDijetData(soa::Filtered::iterator const& collision, soa::Filtered const& jets) { - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelection)) { return; } std::vector> jetPtcuts; for (auto& jet : jets) { - fillJetPtHistogramsData(jet); jetPtcuts.push_back({jet.pt(), jet.eta(), jet.phi()}); } @@ -302,18 +253,14 @@ struct DijetFinderQATask { for (size_t i = 1; i < jetPtcuts.size() && !found_pair; i++) { auto& candidate_jet = jetPtcuts[i]; - Double_t dphi = fabs(candidate_jet[2] - leading_jet[2]); - if (dphi > M_PI) { - dphi = 2 * M_PI - dphi; - } - if (dphi > 2 * M_PI / 3) { - double pt1 = leading_jet[0]; - double pt2 = candidate_jet[0]; - double eta1 = leading_jet[1]; - double eta2 = candidate_jet[1]; - double phi1 = leading_jet[2]; - double phi2 = candidate_jet[2]; - double dijet_mass = sqrt(2 * pt1 * pt2 * (cosh(eta1 - eta2) - cos(phi1 - phi2))); + Double_t dphi = fabs(leading_jet[2] - candidate_jet[2]); + Double_t deta = fabs(leading_jet[1] - candidate_jet[1]); + Double_t condition = fabs(dphi - M_PI); + + if (condition < setPhiCut * M_PI) { + Double_t pt1 = leading_jet[0]; + Double_t pt2 = candidate_jet[0]; + Double_t dijet_mass = sqrt(2 * pt1 * pt2 * (cosh(deta) - cos(dphi))); fillMassHistogramsData(dijet_mass); found_pair = true; } @@ -327,7 +274,7 @@ struct DijetFinderQATask { soa::Filtered> const& mcdjets, JetMCPTable const&, aod::JetTracks const&, aod::JetParticles const&) { - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelection)) { return; } @@ -355,26 +302,20 @@ struct DijetFinderQATask { auto& candidate_jet_D = jetPtcuts_D[i]; auto& candidate_jet_P = jetPtcuts_P[i]; - Double_t dphi_D = fabs(candidate_jet_D[2] - leading_jet_D[2]); - if (dphi_D > M_PI) { - dphi_D = 2 * M_PI - dphi_D; - } - if (dphi_D > 2 * M_PI / 3) { + Double_t dphi_D = fabs(leading_jet_D[2] - candidate_jet_D[2]); + Double_t deta_D = fabs(leading_jet_D[1] - candidate_jet_D[1]); + Double_t dphi_P = fabs(leading_jet_P[2] - candidate_jet_P[2]); + Double_t deta_P = fabs(leading_jet_P[1] - candidate_jet_P[1]); + Double_t condition = fabs(dphi_D - M_PI); + + if (condition < setPhiCut * M_PI) { double pt1_D = leading_jet_D[0]; double pt2_D = candidate_jet_D[0]; - double eta1_D = leading_jet_D[1]; - double eta2_D = candidate_jet_D[1]; - double phi1_D = leading_jet_D[2]; - double phi2_D = candidate_jet_D[2]; - double dijet_mass_D = sqrt(2 * pt1_D * pt2_D * (cosh(eta1_D - eta2_D) - cos(phi1_D - phi2_D))); + double dijet_mass_D = sqrt(2 * pt1_D * pt2_D * (cosh(deta_D) - cos(dphi_D))); double pt1_P = leading_jet_P[0]; double pt2_P = candidate_jet_P[0]; - double eta1_P = leading_jet_P[1]; - double eta2_P = candidate_jet_P[1]; - double phi1_P = leading_jet_P[2]; - double phi2_P = candidate_jet_P[2]; - double dijet_mass_P = sqrt(2 * pt1_P * pt2_P * (cosh(eta1_P - eta2_P) - cos(phi1_P - phi2_P))); + double dijet_mass_P = sqrt(2 * pt1_P * pt2_P * (cosh(deta_P) - cos(dphi_P))); fillMassHistogramsMCMatched(dijet_mass_P, dijet_mass_D); found_pair = true; From ab6fb7bf78f97fadf62efb7e973b1c07d3793007 Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Tue, 22 Apr 2025 18:48:56 +0200 Subject: [PATCH 1053/1650] [PWGLF,Trigger] Fix indexing in the nucleiFilter (#10938) --- EventFiltering/PWGLF/nucleiFilter.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/EventFiltering/PWGLF/nucleiFilter.cxx b/EventFiltering/PWGLF/nucleiFilter.cxx index de8a35a4993..1db68711b36 100644 --- a/EventFiltering/PWGLF/nucleiFilter.cxx +++ b/EventFiltering/PWGLF/nucleiFilter.cxx @@ -448,8 +448,8 @@ struct nucleiFilter { } for (const auto& v0 : v0s) { - const auto& posTrack = tracks.rawIteratorAt(v0.posTrackId()); - const auto& negTrack = tracks.rawIteratorAt(v0.negTrackId()); + const auto& posTrack = v0.posTrack_as(); + const auto& negTrack = v0.negTrack_as(); if ((posTrack.itsNCls() < cfgCutNclusITS || posTrack.tpcNClsFound() < cfgCutNclusTPC) && (negTrack.itsNCls() < cfgCutNclusITS || negTrack.tpcNClsFound() < cfgCutNclusTPC)) { continue; From 21fdbf1c80235964a2b4a6ce558f1c8bc403cd4e Mon Sep 17 00:00:00 2001 From: Debadatta3337 Date: Wed, 23 Apr 2025 00:13:11 +0530 Subject: [PATCH 1054/1650] [PWGDQ] Update HistogramsLibrary.cxx (#10925) Co-authored-by: Debadatta3337 --- PWGDQ/Core/HistogramsLibrary.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index dfbda4a4a67..2e9af6359f6 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -947,6 +947,7 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h if (subGroupStr.Contains("mult")) { hm->AddHistogram(histClass, "Mass_Pt_MultFV0A", "", false, 200, 0.0, 5.0, VarManager::kMass, 40, 0.0, 40.0, VarManager::kPt, 100, 0.0, 25000.0, VarManager::kMultFV0A); hm->AddHistogram(histClass, "Mass_VtxNcontribReal", "Mass vs VtxNcontribReal", false, 200, 0.0, 5.0, VarManager::kMass, 200, 0, 200.0, VarManager::kVtxNcontribReal); + hm->AddHistogram(histClass, "Mass_VtxNcontribReal_VtxZ", "Mass vs VtxNcontribReal vs VtxZ", false, 200, 2.0, 5.0, VarManager::kMass, 150, 0, 150.0, VarManager::kVtxNcontribReal, 20, -10.0, 10.0, VarManager::kVtxZ); hm->AddHistogram(histClass, "VtxZ_VtxNcontribReal", "VtxZ vs VtxNcontribReal", false, 240, -12.0, 12.0, VarManager::kVtxZ, 200, 0, 200.0, VarManager::kVtxNcontribReal); } if (subGroupStr.Contains("polarization")) { From d91b49381a67af19b4db64b1b6ea1871b0731454 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Tue, 22 Apr 2025 22:00:12 +0200 Subject: [PATCH 1055/1650] [PWGLF] Optimized PID selection for doublephi analysis (#10940) --- PWGLF/Tasks/Resonances/doublephimeson.cxx | 154 ++++++++++++++++++++-- 1 file changed, 140 insertions(+), 14 deletions(-) diff --git a/PWGLF/Tasks/Resonances/doublephimeson.cxx b/PWGLF/Tasks/Resonances/doublephimeson.cxx index 23eb7a8043d..9f10015c021 100644 --- a/PWGLF/Tasks/Resonances/doublephimeson.cxx +++ b/PWGLF/Tasks/Resonances/doublephimeson.cxx @@ -50,14 +50,17 @@ struct doublephimeson { Configurable cutMinNsigmaTPC{"cutMinNsigmaTPC", -2.5, "nsigma cut TPC"}; Configurable cutNsigmaTPC{"cutNsigmaTPC", 3.0, "nsigma cut TPC"}; Configurable cutNsigmaTOF{"cutNsigmaTOF", 3.0, "nsigma cut TOF"}; + Configurable momTOFCut{"momTOFCut", 1.8, "minimum pT cut for madnatory TOF"}; + Configurable maxKaonPt{"maxKaonPt", 4.0, "maximum kaon pt cut"}; // Event Mixing - Configurable nEvtMixing{"nEvtMixing", 10, "Number of events to mix"}; + Configurable nEvtMixing{"nEvtMixing", 1, "Number of events to mix"}; ConfigurableAxis CfgVtxBins{"CfgVtxBins", {10, -10, 10}, "Mixing bins - z-vertex"}; ConfigurableAxis CfgMultBins{"CfgMultBins", {VARIABLE_WIDTH, 0.0, 20.0, 40.0, 60.0, 80.0, 500.0}, "Mixing bins - number of contributor"}; // THnsparse bining ConfigurableAxis configThnAxisInvMass{"configThnAxisInvMass", {1500, 2.0, 3.5}, "#it{M} (GeV/#it{c}^{2})"}; ConfigurableAxis configThnAxisInvMassPhi{"configThnAxisInvMassPhi", {20, 1.01, 1.03}, "#it{M} (GeV/#it{c}^{2})"}; + ConfigurableAxis configThnAxisInvMassDeltaPhi{"configThnAxisInvMassDeltaPhi", {80, 0.0, 0.08}, "#it{M} (GeV/#it{c}^{2})"}; ConfigurableAxis configThnAxisDaugherPt{"configThnAxisDaugherPt", {25, 0.0, 50.}, "#it{p}_{T} (GeV/#it{c})"}; ConfigurableAxis configThnAxisPt{"configThnAxisPt", {40, 0.0, 20.}, "#it{p}_{T} (GeV/#it{c})"}; ConfigurableAxis configThnAxisKstar{"configThnAxisKstar", {200, 0.0, 2.0}, "#it{k}^{*} (GeV/#it{c})"}; @@ -71,17 +74,20 @@ struct doublephimeson { // register histograms histos.add("hnsigmaTPCKaonPlus", "hnsigmaTPCKaonPlus", kTH2F, {{1000, -3.0, 3.0f}, {100, 0.0f, 10.0f}}); histos.add("hnsigmaTPCKaonMinus", "hnsigmaTPCKaonMinus", kTH2F, {{1000, -3.0, 3.0f}, {100, 0.0f, 10.0f}}); + histos.add("hnsigmaTPCTOFKaon", "hnsigmaTPCTOFKaon", kTH3F, {{500, -3.0, 3.0f}, {500, -3.0, 3.0f}, {100, 0.0f, 10.0f}}); histos.add("hPhiMass", "hPhiMass", kTH2F, {{40, 1.0, 1.04f}, {100, 0.0f, 10.0f}}); + histos.add("hPhiMass2", "hPhiMass2", kTH2F, {{40, 1.0, 1.04f}, {40, 1.0f, 1.04f}}); const AxisSpec thnAxisInvMass{configThnAxisInvMass, "#it{M} (GeV/#it{c}^{2})"}; const AxisSpec thnAxisInvMassPhi{configThnAxisInvMassPhi, "#it{M} (GeV/#it{c}^{2})"}; + const AxisSpec thnAxisInvMassDeltaPhi{configThnAxisInvMassDeltaPhi, "#it{M} (GeV/#it{c}^{2})"}; const AxisSpec thnAxisPt{configThnAxisPt, "#it{p}_{T} (GeV/#it{c})"}; const AxisSpec thnAxisDeltaR{configThnAxisDeltaR, "#Delta R)"}; const AxisSpec thnAxisCosTheta{configThnAxisCosTheta, "cos #theta"}; const AxisSpec thnAxisNumPhi{configThnAxisNumPhi, "Number of phi meson"}; - histos.add("SEMassUnlike", "SEMassUnlike", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisDeltaR, thnAxisCosTheta, thnAxisInvMassPhi, thnAxisInvMassPhi, thnAxisNumPhi}); - histos.add("MEMassUnlike", "MEMassUnlike", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisDeltaR, thnAxisCosTheta, thnAxisInvMassPhi, thnAxisInvMassPhi, thnAxisNumPhi}); + histos.add("SEMassUnlike", "SEMassUnlike", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisDeltaR, thnAxisCosTheta, thnAxisInvMassDeltaPhi, thnAxisNumPhi}); + histos.add("MEMassUnlike", "MEMassUnlike", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisDeltaR, thnAxisCosTheta, thnAxisInvMassDeltaPhi}); } // get kstar @@ -149,18 +155,35 @@ struct doublephimeson { } if (ptcand >= 0.5) { if (TOFHit != 1) { - if (nsigmaTPC > cutMinNsigmaTPC && nsigmaTPC < cutNsigmaTPC) { + if (ptcand >= 0.5 && ptcand < 0.6 && nsigmaTPC > -1.5 && nsigmaTPC < cutNsigmaTPC) { + return true; + } + if (ptcand >= 0.6 && ptcand < 0.7 && nsigmaTPC > -1.0 && nsigmaTPC < cutNsigmaTPC) { + return true; + } + if (ptcand >= 0.7 && ptcand < 0.8 && nsigmaTPC > -0.4 && nsigmaTPC < cutNsigmaTPC) { + return true; + } + if (ptcand >= 0.8 && ptcand < 1.0 && nsigmaTPC > -0.0 && nsigmaTPC < cutNsigmaTPC) { + return true; + } + if (ptcand >= 1.0 && ptcand < 1.8 && nsigmaTPC > -2.0 && nsigmaTPC < 2.0) { + return true; + } + if (ptcand >= 1.8 && ptcand < 2.0 && nsigmaTPC > -2.0 && nsigmaTPC < 1.5) { + return true; + } + if (ptcand >= 2.0 && nsigmaTPC > -2.0 && nsigmaTPC < 1.0) { return true; } } if (TOFHit == 1) { - if (nsigmaTPC > cutMinNsigmaTPC && nsigmaTPC < cutNsigmaTPC && TMath::Abs(nsigmaTOF) < cutNsigmaTOF) { + if (TMath::Sqrt((nsigmaTPC * nsigmaTPC + nsigmaTOF * nsigmaTOF) / 2.0) < cutNsigmaTOF) { return true; } } } } - if (PIDStrategy == 1) { if (ptcand < 0.5) { if (nsigmaTPC > cutMinNsigmaTPC && nsigmaTPC < cutNsigmaTPC) { @@ -175,6 +198,62 @@ struct doublephimeson { } } } + if (PIDStrategy == 2) { + if (ptcand < 0.5) { + if (nsigmaTPC > cutMinNsigmaTPC && nsigmaTPC < cutNsigmaTPC) { + return true; + } + } + if (ptcand >= 0.5) { + if (TOFHit != 1 && ptcand < momTOFCut) { + if (ptcand >= 0.5 && ptcand < 0.6 && nsigmaTPC > -1.5 && nsigmaTPC < cutNsigmaTPC) { + return true; + } + if (ptcand >= 0.6 && ptcand < 0.7 && nsigmaTPC > -1.0 && nsigmaTPC < cutNsigmaTPC) { + return true; + } + if (ptcand >= 0.7 && ptcand < 0.8 && nsigmaTPC > -0.4 && nsigmaTPC < cutNsigmaTPC) { + return true; + } + if (ptcand >= 0.8 && ptcand < 1.0 && nsigmaTPC > -0.0 && nsigmaTPC < cutNsigmaTPC) { + return true; + } + if (ptcand >= 1.0 && ptcand < 1.8 && nsigmaTPC > -2.0 && nsigmaTPC < 2.0) { + return true; + } + if (ptcand >= 1.8 && ptcand < 2.0 && nsigmaTPC > -2.0 && nsigmaTPC < 1.5) { + return true; + } + if (ptcand >= 2.0 && nsigmaTPC > -2.0 && nsigmaTPC < 1.0) { + return true; + } + } + if (TOFHit == 1) { + if (TMath::Sqrt((nsigmaTPC * nsigmaTPC + nsigmaTOF * nsigmaTOF) / 2.0) < cutNsigmaTOF) { + return true; + } + } + } + } + if (PIDStrategy == 3) { + if (ptcand < 0.5) { + if (nsigmaTPC > cutMinNsigmaTPC && nsigmaTPC < cutNsigmaTPC) { + return true; + } + } + if (ptcand >= 0.5) { + if (TOFHit != 1) { + if (nsigmaTPC > cutMinNsigmaTPC && nsigmaTPC < cutNsigmaTPC) { + return true; + } + } + if (TOFHit == 1) { + if (TMath::Sqrt((nsigmaTPC * nsigmaTPC + nsigmaTOF * nsigmaTOF) / 2.0) < cutNsigmaTOF) { + return true; + } + } + } + } return false; } @@ -186,24 +265,51 @@ struct doublephimeson { if (additionalEvsel && (collision.numPos() < 2 || collision.numNeg() < 2)) { return; } - auto phimult = phitracks.size(); + int phimult = 0; for (auto phitrackd1 : phitracks) { if (phitrackd1.phiMass() < minPhiMass || phitrackd1.phiMass() > maxPhiMass) { continue; } auto kaonplusd1pt = TMath::Sqrt(phitrackd1.phid1Px() * phitrackd1.phid1Px() + phitrackd1.phid1Py() * phitrackd1.phid1Py()); auto kaonminusd1pt = TMath::Sqrt(phitrackd1.phid2Px() * phitrackd1.phid2Px() + phitrackd1.phid2Py() * phitrackd1.phid2Py()); + if (kaonplusd1pt > maxKaonPt) { + continue; + } + if (kaonminusd1pt > maxKaonPt) { + continue; + } if (!selectionPID(phitrackd1.phid1TPC(), phitrackd1.phid1TOF(), phitrackd1.phid1TOFHit(), strategyPID1, kaonplusd1pt)) { continue; } if (!selectionPID(phitrackd1.phid2TPC(), phitrackd1.phid2TOF(), phitrackd1.phid2TOFHit(), strategyPID1, kaonminusd1pt)) { continue; } - auto phid1id = phitrackd1.index(); - Phid1.SetXYZM(phitrackd1.phiPx(), phitrackd1.phiPy(), phitrackd1.phiPz(), phitrackd1.phiMass()); + phimult = phimult + 1; + } + for (auto phitrackd1 : phitracks) { + if (phitrackd1.phiMass() < minPhiMass || phitrackd1.phiMass() > maxPhiMass) { + continue; + } + auto kaonplusd1pt = TMath::Sqrt(phitrackd1.phid1Px() * phitrackd1.phid1Px() + phitrackd1.phid1Py() * phitrackd1.phid1Py()); + auto kaonminusd1pt = TMath::Sqrt(phitrackd1.phid2Px() * phitrackd1.phid2Px() + phitrackd1.phid2Py() * phitrackd1.phid2Py()); + if (kaonplusd1pt > maxKaonPt) { + continue; + } + if (kaonminusd1pt > maxKaonPt) { + continue; + } + if (!selectionPID(phitrackd1.phid1TPC(), phitrackd1.phid1TOF(), phitrackd1.phid1TOFHit(), strategyPID1, kaonplusd1pt)) { + continue; + } + histos.fill(HIST("hnsigmaTPCTOFKaon"), phitrackd1.phid1TPC(), phitrackd1.phid1TOF(), kaonplusd1pt); histos.fill(HIST("hnsigmaTPCKaonPlus"), phitrackd1.phid1TPC(), kaonplusd1pt); + if (!selectionPID(phitrackd1.phid2TPC(), phitrackd1.phid2TOF(), phitrackd1.phid2TOFHit(), strategyPID1, kaonminusd1pt)) { + continue; + } histos.fill(HIST("hnsigmaTPCKaonMinus"), phitrackd1.phid2TPC(), kaonminusd1pt); histos.fill(HIST("hPhiMass"), Phid1.M(), Phid1.Pt()); + auto phid1id = phitrackd1.index(); + Phid1.SetXYZM(phitrackd1.phiPx(), phitrackd1.phiPy(), phitrackd1.phiPz(), phitrackd1.phiMass()); for (auto phitrackd2 : phitracks) { auto phid2id = phitrackd2.index(); if (phid2id <= phid1id) { @@ -214,6 +320,12 @@ struct doublephimeson { } auto kaonplusd2pt = TMath::Sqrt(phitrackd2.phid1Px() * phitrackd2.phid1Px() + phitrackd2.phid1Py() * phitrackd2.phid1Py()); auto kaonminusd2pt = TMath::Sqrt(phitrackd2.phid2Px() * phitrackd2.phid2Px() + phitrackd2.phid2Py() * phitrackd2.phid2Py()); + if (kaonplusd2pt > maxKaonPt) { + continue; + } + if (kaonminusd2pt > maxKaonPt) { + continue; + } if (!selectionPID(phitrackd2.phid1TPC(), phitrackd2.phid1TOF(), phitrackd2.phid1TOFHit(), strategyPID2, kaonplusd2pt)) { continue; } @@ -232,11 +344,13 @@ struct doublephimeson { // auto kstar = getkstar(Phid1, Phid2); auto deltaR = TMath::Sqrt(TMath::Power(Phid1.Phi() - Phid2.Phi(), 2.0) + TMath::Power(Phid1.Eta() - Phid2.Eta(), 2.0)); auto costheta = (Phid1.Px() * Phid2.Px() + Phid1.Py() * Phid2.Py() + Phid1.Pz() * Phid2.Pz()) / (Phid1.P() * Phid2.P()); + auto deltam = TMath::Sqrt(TMath::Power(Phid1.M() - 1.0192, 2.0) + TMath::Power(Phid2.M() - 1.0192, 2.0)); + histos.fill(HIST("hPhiMass2"), Phid1.M(), Phid2.M()); if (!isDeep) { - histos.fill(HIST("SEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, costheta, Phid1.M(), Phid2.M(), phimult); + histos.fill(HIST("SEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, costheta, deltam, phimult); } if (isDeep) { - histos.fill(HIST("SEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, deepangle(Phid1, Phid2), Phid1.M(), Phid2.M(), phimult); + histos.fill(HIST("SEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, deepangle(Phid1, Phid2), deltam, phimult); } } } @@ -254,7 +368,6 @@ struct doublephimeson { if (collision1.index() == collision2.index()) { continue; } - auto phimult = tracks1.size(); for (auto& [phitrackd1, phitrackd2] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { if (phitrackd1.phiMass() < minPhiMass || phitrackd1.phiMass() > maxPhiMass) { continue; @@ -266,6 +379,18 @@ struct doublephimeson { auto kaonminusd1pt = TMath::Sqrt(phitrackd1.phid2Px() * phitrackd1.phid2Px() + phitrackd1.phid2Py() * phitrackd1.phid2Py()); auto kaonplusd2pt = TMath::Sqrt(phitrackd2.phid1Px() * phitrackd2.phid1Px() + phitrackd2.phid1Py() * phitrackd2.phid1Py()); auto kaonminusd2pt = TMath::Sqrt(phitrackd2.phid2Px() * phitrackd2.phid2Px() + phitrackd2.phid2Py() * phitrackd2.phid2Py()); + if (kaonplusd1pt > maxKaonPt) { + continue; + } + if (kaonminusd1pt > maxKaonPt) { + continue; + } + if (kaonplusd2pt > maxKaonPt) { + continue; + } + if (kaonminusd2pt > maxKaonPt) { + continue; + } if (!selectionPID(phitrackd1.phid1TPC(), phitrackd1.phid1TOF(), phitrackd1.phid1TOFHit(), strategyPID1, kaonplusd1pt)) { continue; } @@ -283,11 +408,12 @@ struct doublephimeson { exotic = Phid1 + Phid2; auto deltaR = TMath::Sqrt(TMath::Power(Phid1.Phi() - Phid2.Phi(), 2.0) + TMath::Power(Phid1.Eta() - Phid2.Eta(), 2.0)); auto costheta = (Phid1.Px() * Phid2.Px() + Phid1.Py() * Phid2.Py() + Phid1.Pz() * Phid2.Pz()) / (Phid1.P() * Phid2.P()); + auto deltam = TMath::Sqrt(TMath::Power(Phid1.M() - 1.0192, 2.0) + TMath::Power(Phid2.M() - 1.0192, 2.0)); if (!isDeep) { - histos.fill(HIST("MEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, costheta, Phid1.M(), Phid2.M(), phimult); + histos.fill(HIST("MEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, costheta, deltam); } if (isDeep) { - histos.fill(HIST("MEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, deepangle(Phid1, Phid2), Phid1.M(), Phid2.M(), phimult); + histos.fill(HIST("MEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, deepangle(Phid1, Phid2), deltam); } } } From fb93a6bad7e593ae9a9abf2679b315fcc3f47a69 Mon Sep 17 00:00:00 2001 From: JStaa <39123272+JStaa@users.noreply.github.com> Date: Tue, 22 Apr 2025 23:28:35 +0200 Subject: [PATCH 1056/1650] [PWGCF] Changed the Partition to slice by MC collision index (#10935) Co-authored-by: ALICE Action Bot --- .../Tasks/threeParticleCorrelations.cxx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx index 2e94202f054..a9ae8ac562c 100644 --- a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx +++ b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx @@ -470,11 +470,13 @@ struct ThreeParticleCorrelations { // End of the MC Mixed-events Correlations } - void processMCGen(MyFilteredMCGenCollision const&, MyFilteredMCParticles const&) + void processMCGen(MyFilteredMCGenCollision const& collision, MyFilteredMCParticles const&) { + auto groupMCParticles = mcParticles->sliceByCached(aod::mcparticle::mcCollisionId, collision.globalIndex(), cache); + // Start of the Monte-Carlo generated QA - for (const auto& particle : mcParticles) { + for (const auto& particle : groupMCParticles) { if (particle.isPhysicalPrimary()) { // Efficiency - Generated From fa9c6abd861c3dd30c5115fbbcc8a13c316eb726 Mon Sep 17 00:00:00 2001 From: Junlee Kim Date: Wed, 23 Apr 2025 06:37:51 +0900 Subject: [PATCH 1057/1650] [PWGCF] adding delta phi differential histograms (#10937) --- PWGCF/Tasks/correlations.cxx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/PWGCF/Tasks/correlations.cxx b/PWGCF/Tasks/correlations.cxx index f0ef51ff0d7..7461cc4b671 100644 --- a/PWGCF/Tasks/correlations.cxx +++ b/PWGCF/Tasks/correlations.cxx @@ -22,6 +22,7 @@ #include #include #include +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -165,6 +166,7 @@ struct CorrelationTask { registry.add("invMass", "2-prong invariant mass (GeV/c^2)", {HistType::kTH3F, {axisInvMassHistogram, axisPtTrigger, axisMultiplicity}}); if (doprocessSame2Prong2Prong || doprocessSame2Prong2ProngML) { registry.add("invMassTwoPart", "2D 2-prong invariant mass (GeV/c^2)", {HistType::kTHnSparseF, {axisInvMassHistogram, axisInvMassHistogram, axisPtTrigger, axisPtAssoc, axisMultiplicity}}); + registry.add("invMassTwoPartDPhi", "2D 2-prong invariant mass (GeV/c^2)", {HistType::kTHnSparseF, {axisInvMassHistogram, axisInvMassHistogram, axisPtTrigger, axisPtAssoc, axisDeltaPhi}}); } } registry.add("multiplicity", "event multiplicity", {HistType::kTH1F, {{1000, 0, 100, "/multiplicity/centrality"}}}); @@ -328,6 +330,7 @@ struct CorrelationTask { if (cfgCorrelationMethod == 2 && track1.decay() == track2.decay()) continue; registry.fill(HIST("invMassTwoPart"), track1.invMass(), track2.invMass(), track1.pt(), track2.pt(), multiplicity); + registry.fill(HIST("invMassTwoPartDPhi"), track1.invMass(), track2.invMass(), track1.pt(), track2.pt(), TVector2::Phi_0_2pi(track1.phi() - track2.phi() + TMath::Pi() / 2.0) - TMath::Pi() / 2.0); } } } From 0493e188b716dfaa5fd191d87992805162985e79 Mon Sep 17 00:00:00 2001 From: Nicolas Strangmann <77485327+nstrangm@users.noreply.github.com> Date: Tue, 22 Apr 2025 23:39:20 +0200 Subject: [PATCH 1058/1650] [EventFiltering,PWGEM/PhotonMeson] Clean up heavy neutral meson (filter) task (#10931) Co-authored-by: Nicolas Strangmann Co-authored-by: ALICE Action Bot --- .../PWGEM/HeavyNeutralMesonFilter.cxx | 1913 +++++++---------- EventFiltering/filterTables.h | 12 +- PWGEM/PhotonMeson/Tasks/HeavyNeutralMeson.cxx | 713 +++--- PWGEM/PhotonMeson/Utils/HNMUtilities.h | 41 +- 4 files changed, 1152 insertions(+), 1527 deletions(-) diff --git a/EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx b/EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx index a2941317ec6..5d8fd72ba39 100644 --- a/EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx +++ b/EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx @@ -11,13 +11,12 @@ /// /// \file HeavyNeutralMesonFilter.cxx /// -/// \brief This code loops over collisions to filter events contaning heavy mesons (omega or eta') using EMCal clusters and V0s (PCM) +/// \brief This code loops over collisions to filter events contaning heavy neutral mesons (omega or eta') using EMCal clusters and V0s (PCM) /// -/// \author Nicolas Strangmann (nicolas.strangmann@cern.ch) - Goethe University Frankfurt; Maximilian Korwieser (maximilian.korwieser@cern.ch) - Technical University Munich +/// \author Nicolas Strangmann (nicolas.strangmann@cern.ch) - Goethe University Frankfurt; Maximilian Korwieser (maximilian.korwieser@cern.ch) - Technical University Munich /// #include -#include #include #include @@ -27,6 +26,7 @@ #include "TRandom3.h" #include "PWGEM/PhotonMeson/Utils/HNMUtilities.h" +#include "PWGJE/DataModel/EMCALMatchedCollisions.h" #include "Common/DataModel/PIDResponse.h" #include "Common/DataModel/PIDResponseITS.h" @@ -51,16 +51,16 @@ using namespace o2::aod::pwgem::photonmeson; namespace o2::aod { using MyBCs = soa::Join; -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; using SelectedTracks = soa::Join; } // namespace o2::aod -namespace CFTrigger +namespace hnmtrigger { -enum CFFemtoTriggers { +enum FemtoTriggers { kPPOmega, kPPEtaPrime, kOmegaD, @@ -70,7 +70,7 @@ enum CFFemtoTriggers { kNFemtoTriggers }; -enum FemtoPartners { +enum TracksPID { kProton, kDeuteron, kPion, @@ -84,13 +84,10 @@ enum PIDLimits { kTPCMin, kITSmax, kNPIDLimits }; -const std::vector SpeciesName{"proton", "Deuteron", "pion"}; // ToDo include charged pions - -const std::vector PtCutsName{"Pt min", "Pt max", "P TOF thres"}; - -const std::vector PidCutsName{"TPC min", "TPC max", "TPCTOF max", "ITS min", "ITS max"}; - -const std::vector FemtoFilterNames{"PPOmega", "PPEtaPrime", "Omegad", "EtaPrimed", "OmegaP", "EtaPrimeP"}; +const std::vector speciesName{"proton", "Deuteron", "pion"}; +const std::vector pTCutsName{"Pt min", "Pt max", "P TOF thres"}; +const std::vector pidCutsName{"TPC min", "TPC max", "TPCTOF max", "ITS min", "ITS max"}; +const std::vector femtoFilterNames{"PPOmega", "PPEtaPrime", "Omegad", "EtaPrimed", "OmegaP", "EtaPrimeP"}; // configs for tracks const float pidcutsTable[kNFemtoPartners][kNPIDLimits]{ @@ -103,165 +100,117 @@ const float ptcutsTable[kNFemtoPartners][3]{ {0.55f, 2.f, 1.2f}, {0.35f, 6.f, 0.75f}}; -const float TPCNClustersMin[1][kNFemtoPartners]{ - {80.0f, 80.0f, 80.0f}}; -const float ITSNClustersMin[1][kNFemtoPartners]{ - {4, 4, 4}}; +const float nClusterMinTPC[1][kNFemtoPartners]{{80.0f, 80.0f, 80.0f}}; +const float nClusterMinITS[1][kNFemtoPartners]{{4, 4, 4}}; -static const float triggerSwitches[1][kNFemtoTriggers]{ - {1, 1, 1, 1, 1, 1}}; -const float TriggerLimits[1][kNFemtoTriggers]{ - {1.f, 1.f, 1.f, 1.f, 1.f, 1.f}}; -} // namespace CFTrigger +static const float triggerSwitches[1][kNFemtoTriggers]{{1, 1, 1, 1, 1, 1}}; +const float triggerLimits[1][kNFemtoTriggers]{{1.f, 1.f, 1.f, 1.f, 1.f, 1.f}}; +} // namespace hnmtrigger struct HeavyNeutralMesonFilter { + Produces tags; + + // --------------------------------> Configurables <------------------------------------ + // - Event selection cuts + // - Track selection cuts + // - Cluster shifts + // - HNM mass selection windows + // - HNM min pTs / k*'s + // ------------------------------------------------------------------------------------- + // ---> Event selection + Configurable confEvtSelectZvtx{"confEvtSelectZvtx", true, "Event selection includes max. z-Vertex"}; + Configurable confEvtZvtx{"confEvtZvtx", 10.f, "Evt sel: Max. z-Vertex (cm)"}; + Configurable confEvtRequireSel8{"confEvtRequireSel8", false, "Evt sel: check for offline selection (sel8)"}; + + // ---> Track selection + Configurable> cfgPtCuts{"cfgPtCuts", {hnmtrigger::ptcutsTable[0], hnmtrigger::kNFemtoPartners, 3, hnmtrigger::speciesName, hnmtrigger::pTCutsName}, "Track pT selections"}; + Configurable cfgTrkEta{"cfgTrkEta", 0.9, "Eta"}; + Configurable> cfgTPCNClustersMin{"cfgTPCNClustersMin", {hnmtrigger::nClusterMinTPC[0], 1, hnmtrigger::kNFemtoPartners, std::vector{"TPCNClusMin"}, hnmtrigger::speciesName}, "Mininum of TPC Clusters"}; + Configurable cfgTrkTPCfCls{"cfgTrkTPCfCls", 0.83, "Minimum fraction of crossed rows over findable clusters"}; + Configurable cfgTrkTPCcRowsMin{"cfgTrkTPCcRowsMin", 70, "Minimum number of crossed TPC rows"}; + Configurable cfgTrkTPCsClsSharedFrac{"cfgTrkTPCsClsSharedFrac", 1.f, "Fraction of shared TPC clusters"}; + Configurable> cfgTrkITSnclsMin{"cfgTrkITSnclsMin", {hnmtrigger::nClusterMinITS[0], 1, hnmtrigger::kNFemtoPartners, std::vector{"Cut"}, hnmtrigger::speciesName}, "Minimum number of ITS clusters"}; + Configurable cfgTrkDCAxyMax{"cfgTrkDCAxyMax", 0.15, "Maximum DCA_xy"}; + Configurable cfgTrkDCAzMax{"cfgTrkDCAzMax", 0.3, "Maximum DCA_z"}; + Configurable cfgTrkMaxChi2PerClusterTPC{"cfgTrkMaxChi2PerClusterTPC", 4.0f, "Minimal track selection: max allowed chi2 per TPC cluster"}; // 4.0 is default of global tracks on 20.01.2023 + Configurable cfgTrkMaxChi2PerClusterITS{"cfgTrkMaxChi2PerClusterITS", 36.0f, "Minimal track selection: max allowed chi2 per ITS cluster"}; // 36.0 is default of global tracks on 20.01.2023 + + Configurable> cfgPIDCuts{"cfgPIDCuts", {hnmtrigger::pidcutsTable[0], hnmtrigger::kNFemtoPartners, hnmtrigger::kNPIDLimits, hnmtrigger::speciesName, hnmtrigger::pidCutsName}, "Femtopartner PID nsigma selections"}; // PID selections + + // ---> Configurables to allow for a shift in eta/phi of EMCal clusters to better align with extrapolated TPC tracks + Configurable cfgDoEMCShift{"cfgDoEMCShift", false, "Apply SM-wise shift in eta and phi to EMCal clusters to align with TPC tracks"}; + Configurable> cfgEMCEtaShift{"cfgEMCEtaShift", {0.f}, "values for SM-wise shift in eta to be added to EMCal clusters to align with TPC tracks"}; + Configurable> cfgEMCPhiShift{"cfgEMCPhiShift", {0.f}, "values for SM-wise shift in phi to be added to EMCal clusters to align with TPC tracks"}; + static const int nSMs = 20; + std::array emcEtaShift = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + std::array emcPhiShift = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + + // ---> Shift the omega/eta' mass based on the difference of the reconstructed mass of the pi0/eta to its PDG mass to reduce smearing caused by EMCal/PCM in photon measurement + Configurable cfgHNMMassCorrection{"cfgHNMMassCorrection", 1, "Use GG PDG mass to correct HNM mass (0 = off, 1 = subDeltaPi0, 2 = subLambda)"}; + + // ---> Mass windows for the selection of heavy neutral mesons (also based on mass of their light neutral meson decay daughter) + static constexpr float DefaultMassWindows[2][4] = {{0., 0.4, 0.6, 1.}, {0.4, 0.8, 0.8, 1.2}}; + Configurable> cfgMassWindowOmega{"cfgMassWindowOmega", {DefaultMassWindows[0], 4, {"pi0_min", "pi0_max", "omega_min", "omega_max"}}, "Mass window for selected omegas and their decay pi0"}; + Configurable> cfgMassWindowEtaPrime{"cfgMassWindowEtaPrime", {DefaultMassWindows[1], 4, {"eta_min", "eta_max", "etaprime_min", "etaprime_max"}}, "Mass window for selected eta' and their decay eta"}; - Configurable> ConfTriggerSwitches{ - "ConfTriggerSwitches", - {CFTrigger::triggerSwitches[0], 1, CFTrigger::kNFemtoTriggers, std::vector{"Switch"}, CFTrigger::FemtoFilterNames}, - "Turn on specific trigger"}; - - Configurable ConfKeepTwoBody{ - "ConfKeepTwoBody", - true, - "Turn on specific trigger selection"}; - - // PID selections - Configurable> - ConfPIDCuts{ - "ConfPIDCuts", - {CFTrigger::pidcutsTable[0], CFTrigger::kNFemtoPartners, CFTrigger::kNPIDLimits, CFTrigger::SpeciesName, CFTrigger::PidCutsName}, - "Femtopartner PID nsigma selections"}; - - Configurable> ConfPtCuts{ - "ConfPtCuts", - {CFTrigger::ptcutsTable[0], CFTrigger::kNFemtoPartners, 3, CFTrigger::SpeciesName, CFTrigger::PtCutsName}, - "Femtopartner pT selections"}; - - Configurable ConfTrkEta{ - "ConfTrkEta", - 0.9, - "Eta"}; - - Configurable> ConfTPCNClustersMin{ - "ConfTPCNClustersMin", - {CFTrigger::TPCNClustersMin[0], 1, CFTrigger::kNFemtoPartners, std::vector{"TPCNClusMin"}, CFTrigger::SpeciesName}, - "Mininum of TPC Clusters"}; - - Configurable ConfTrkTPCfCls{ - "ConfTrkTPCfCls", - 0.83, - "Minimum fraction of crossed rows over findable clusters"}; - Configurable ConfTrkTPCcRowsMin{ - "ConfTrkTPCcRowsMin", - 70, - "Minimum number of crossed TPC rows"}; - Configurable ConfTrkTPCsClsSharedFrac{ - "ConfTrkTPCsClsSharedFrac", - 1.f, - "Fraction of shared TPC clusters"}; - - Configurable> ConfTrkITSnclsMin{ - "ConfTrkITSnclsMin", - {CFTrigger::ITSNClustersMin[0], 1, CFTrigger::kNFemtoPartners, std::vector{"Cut"}, CFTrigger::SpeciesName}, - "Minimum number of ITS clusters"}; - - Configurable ConfTrkDCAxyMax{ - "ConfTrkDCAxyMax", - 0.15, - "Maximum DCA_xy"}; - Configurable ConfTrkDCAzMax{ - "ConfTrkDCAzMax", - 0.3, - "Maximum DCA_z"}; - - Configurable - ConfTrkMaxChi2PerClusterTPC{ - "ConfTrkMaxChi2PerClusterTPC", - 4.0f, - "Minimal track selection: max allowed chi2 per TPC cluster"}; // 4.0 is default of - // global tracks - // on 20.01.2023 - Configurable - ConfTrkMaxChi2PerClusterITS{ - "ConfTrkMaxChi2PerClusterITS", - 36.0f, - "Minimal track selection: max allowed chi2 per ITS cluster"}; // 36.0 is default of - // global tracks - // on 20.01.2023 - - Configurable> ConfKinematicLimits{ - "ConfKstarLimits", - {CFTrigger::TriggerLimits[0], 1, CFTrigger::kNFemtoTriggers, std::vector{"Limit"}, CFTrigger::FemtoFilterNames}, - "hypermomentum limit for two body trigger"}; - - // Configs for events - Configurable ConfEvtSelectZvtx{ - "ConfEvtSelectZvtx", - true, - "Event selection includes max. z-Vertex"}; - Configurable ConfEvtZvtx{"ConfEvtZvtx", - 10.f, - "Evt sel: Max. z-Vertex (cm)"}; - Configurable ConfEvtOfflineCheck{ - "ConfEvtOfflineCheck", - false, - "Evt sel: check for offline selection"}; - - Configurable ConfDoEMCShift{"ConfDoEMCShift", false, "Apply SM-wise shift in eta and phi to EMCal clusters to align with TPC tracks"}; - Configurable> ConfEMCEtaShift{"ConfEMCEtaShift", {0.f}, "values for SM-wise shift in eta to be added to EMCal clusters to align with TPC tracks"}; - Configurable> ConfEMCPhiShift{"ConfEMCPhiShift", {0.f}, "values for SM-wise shift in phi to be added to EMCal clusters to align with TPC tracks"}; - std::array EMCEtaShift = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - std::array EMCPhiShift = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + // ---> Minimum pT values for the trigger decisions of the spectra and femto trigger. The femto triggers additionally require a given k*/Q3 + static constexpr float DefaultSpectraMinPts[4] = {1.8, 1.8, 2.6, 2.6}; + static constexpr float DefaultFemtoMinPts[4] = {1.8, 1.8, 2.6, 2.6}; + Configurable> cfgMinHNMPtsSpectrumTrigger{"cfgMinHNMPtsSpectrumTrigger", {DefaultSpectraMinPts, 4, {"PCM_omega", "PCM_etaprime", "EMC_omega", "EMC_etaprime"}}, "Minimum pT values for the spetra trigger decisions (GeV/c)"}; + Configurable> cfgMinHNMPtsFemtoTrigger{"cfgMinHNMPtsFemtoTrigger", {DefaultFemtoMinPts, 4, {"PCM_omega", "PCM_etaprime", "EMC_omega", "EMC_etaprime"}}, "Minimum pT values for the femto trigger decisions (GeV/c)"}; + Configurable> cfgKinematicLimits{"cfgKinematicLimits", {hnmtrigger::triggerLimits[0], 1, hnmtrigger::kNFemtoTriggers, std::vector{"Limit"}, hnmtrigger::femtoFilterNames}, "Maximum K* (Q_3) for two (three) body femto trigger"}; + + Configurable> cfgTriggerSwitches{"cfgTriggerSwitches", {hnmtrigger::triggerSwitches[0], 1, hnmtrigger::kNFemtoTriggers, std::vector{"Switch"}, hnmtrigger::femtoFilterNames}, "Turn on specific trigger"}; + + HistogramRegistry mHistManager{"HeavyNeutralMesonFilterHistograms", {}, OutputObjHandlingPolicy::AnalysisObject}; + + // Prepare vectors for different species + std::vector vGGs; + std::vector vHNMs; + std::vector etaPrimeEMC, etaPrimePCM, omegaEMC, omegaPCM, proton, antiproton, deuteron, antideuteron, pion, antipion; + float mMassProton = constants::physics::MassProton; + float mMassDeuteron = constants::physics::MassDeuteron; + float mMassOmega = 0.782; + float mMassEtaPrime = 0.957; + float mMassPionCharged = constants::physics::MassPionCharged; + + Preslice perCollisionPCM = aod::v0photonkf::collisionId; + Preslice perCollisionEMC = aod::skimmedcluster::collisionId; + + bool colContainsPCMOmega, colContainsEMCOmega, colContainsPCMEtaPrime, colContainsEMCEtaPrime = false; template - bool isSelectedTrack(T const& track, CFTrigger::FemtoPartners partSpecies) + bool isSelectedTrack(T const& track, hnmtrigger::TracksPID partSpecies) { - const auto pT = track.pt(); - const auto eta = track.eta(); - const auto tpcNClsF = track.tpcNClsFound(); - const auto tpcRClsC = track.tpcCrossedRowsOverFindableCls(); - const auto tpcNClsC = track.tpcNClsCrossedRows(); - const auto tpcNClsSFrac = track.tpcFractionSharedCls(); - const auto itsNCls = track.itsNCls(); - const auto dcaXY = track.dcaXY(); - const auto dcaZ = track.dcaZ(); - - if (pT < ConfPtCuts->get(partSpecies, "Pt min")) { + if (track.pt() < cfgPtCuts->get(partSpecies, "Pt min")) return false; - } - if (pT > ConfPtCuts->get(partSpecies, "Pt max")) { + if (track.pt() > cfgPtCuts->get(partSpecies, "Pt max")) return false; - } - if (std::abs(eta) > ConfTrkEta) { + if (std::abs(track.eta()) > cfgTrkEta) return false; - } - if (tpcNClsF < ConfTPCNClustersMin->get("TPCNClusMin", partSpecies)) { + if (track.tpcNClsFound() < cfgTPCNClustersMin->get("TPCNClusMin", partSpecies)) return false; - } - if (tpcRClsC < ConfTrkTPCfCls) { + if (track.tpcCrossedRowsOverFindableCls() < cfgTrkTPCfCls) return false; - } - if (tpcNClsC < ConfTrkTPCcRowsMin) { + if (track.tpcNClsCrossedRows() < cfgTrkTPCcRowsMin) return false; - } - if (tpcNClsSFrac > ConfTrkTPCsClsSharedFrac) { + if (track.tpcFractionSharedCls() > cfgTrkTPCsClsSharedFrac) return false; - } - if (itsNCls < ConfTrkITSnclsMin->get(static_cast(0), partSpecies)) { + if (track.itsNCls() < cfgTrkITSnclsMin->get(static_cast(0), partSpecies)) return false; - } - if (std::abs(dcaXY) > ConfTrkDCAxyMax) { + if (std::abs(track.dcaXY()) > cfgTrkDCAxyMax) return false; - } - if (std::abs(dcaZ) > ConfTrkDCAzMax) { + if (std::abs(track.dcaZ()) > cfgTrkDCAzMax) + return false; + if (track.tpcChi2NCl() > cfgTrkMaxChi2PerClusterTPC) + return false; + if (track.itsChi2NCl() > cfgTrkMaxChi2PerClusterITS) return false; - } return true; } template - bool isSelectedTrackPID(T const& track, CFTrigger::FemtoPartners partSpecies) + bool isSelectedTrackPID(T const& track, hnmtrigger::TracksPID partSpecies) { // nSigma should have entries [proton, deuteron, pion] bool isSelected = false; @@ -270,20 +219,18 @@ struct HeavyNeutralMesonFilter { float nSigmaTrackTOF = -999.f; float nSigmaTrackITS = -999.f; - float nSigmaTrackTPCTOF = -999.f; - switch (partSpecies) { - case CFTrigger::kProton: + case hnmtrigger::kProton: nSigmaTrackTPC = track.tpcNSigmaPr(); nSigmaTrackTOF = track.tofNSigmaPr(); nSigmaTrackITS = track.itsNSigmaPr(); break; - case CFTrigger::kDeuteron: + case hnmtrigger::kDeuteron: nSigmaTrackTPC = track.tpcNSigmaDe(); nSigmaTrackTOF = track.tofNSigmaDe(); nSigmaTrackITS = track.itsNSigmaDe(); break; - case CFTrigger::kPion: + case hnmtrigger::kPion: nSigmaTrackTPC = track.tpcNSigmaPi(); nSigmaTrackTOF = track.tofNSigmaPi(); nSigmaTrackITS = track.itsNSigmaPi(); @@ -292,24 +239,17 @@ struct HeavyNeutralMesonFilter { LOG(fatal) << "Particle species not known"; } - nSigmaTrackTPCTOF = std::sqrt(std::pow(nSigmaTrackTPC, 2) + std::pow(nSigmaTrackTOF, 2)); - - // check if track is selected - auto TPCmin = ConfPIDCuts->get(partSpecies, CFTrigger::kTPCMin); - auto TPCmax = ConfPIDCuts->get(partSpecies, CFTrigger::kTPCMax); - auto TPCTOFmax = ConfPIDCuts->get(partSpecies, CFTrigger::kTPCTOF); - auto ITSmin = ConfPIDCuts->get(partSpecies, CFTrigger::kITSmin); - auto ITSmax = ConfPIDCuts->get(partSpecies, CFTrigger::kITSmax); + float nSigmaTrackTPCTOF = std::sqrt(std::pow(nSigmaTrackTPC, 2) + std::pow(nSigmaTrackTOF, 2)); - if (track.p() <= ConfPtCuts->get(partSpecies, "P TOF thres")) { - if (nSigmaTrackTPC > TPCmin && - nSigmaTrackTPC < TPCmax && - nSigmaTrackITS > ITSmin && - nSigmaTrackITS < ITSmax) { + if (track.p() <= cfgPtCuts->get(partSpecies, "P TOF thres")) { + if (nSigmaTrackTPC > cfgPIDCuts->get(partSpecies, hnmtrigger::kTPCMin) && + nSigmaTrackTPC < cfgPIDCuts->get(partSpecies, hnmtrigger::kTPCMax) && + nSigmaTrackITS > cfgPIDCuts->get(partSpecies, hnmtrigger::kITSmin) && + nSigmaTrackITS < cfgPIDCuts->get(partSpecies, hnmtrigger::kITSmax)) { isSelected = true; } } else { - if (nSigmaTrackTPCTOF < TPCTOFmax) { + if (nSigmaTrackTPCTOF < cfgPIDCuts->get(partSpecies, hnmtrigger::kTPCTOF)) { isSelected = true; } } @@ -319,12 +259,10 @@ struct HeavyNeutralMesonFilter { template bool isSelectedEvent(T const& col) { - if (ConfEvtSelectZvtx && std::abs(col.posZ()) > ConfEvtZvtx) { + if (confEvtSelectZvtx && std::abs(col.posZ()) > confEvtZvtx) return false; - } - if (ConfEvtOfflineCheck && !col.sel8()) { + if (confEvtRequireSel8 && !col.sel8()) return false; - } return true; } @@ -333,18 +271,15 @@ struct HeavyNeutralMesonFilter { { const ROOT::Math::PtEtaPhiMVector trackSum = part1 + part2; const float beta = trackSum.Beta(); - const float betax = - beta * std::cos(trackSum.Phi()) * std::sin(trackSum.Theta()); - const float betay = - beta * std::sin(trackSum.Phi()) * std::sin(trackSum.Theta()); + const float betax = beta * std::cos(trackSum.Phi()) * std::sin(trackSum.Theta()); + const float betay = beta * std::sin(trackSum.Phi()) * std::sin(trackSum.Theta()); const float betaz = beta * std::cos(trackSum.Theta()); - ROOT::Math::PxPyPzMVector PartOneCMS(part1); - ROOT::Math::PxPyPzMVector PartTwoCMS(part2); - const ROOT::Math::Boost boostPRF = - ROOT::Math::Boost(-betax, -betay, -betaz); - PartOneCMS = boostPRF(PartOneCMS); - PartTwoCMS = boostPRF(PartTwoCMS); - const ROOT::Math::PxPyPzMVector trackRelK = PartOneCMS - PartTwoCMS; + ROOT::Math::PxPyPzMVector partOneCMS(part1); + ROOT::Math::PxPyPzMVector partTwoCMS(part2); + const ROOT::Math::Boost boostPRF = ROOT::Math::Boost(-betax, -betay, -betaz); + partOneCMS = boostPRF(partOneCMS); + partTwoCMS = boostPRF(partTwoCMS); + const ROOT::Math::PxPyPzMVector trackRelK = partOneCMS - partTwoCMS; return 0.5 * trackRelK.P(); } @@ -365,447 +300,169 @@ struct HeavyNeutralMesonFilter { ROOT::Math::PxPyPzEVector q12 = getqij(part1, part2); ROOT::Math::PxPyPzEVector q23 = getqij(part2, part3); ROOT::Math::PxPyPzEVector q31 = getqij(part3, part1); - float Q32 = q12.M2() + q23.M2() + q31.M2(); - return sqrt(-Q32); - } - - // Circumvent missing of different phi mappings, enforce [0, 2 * M_PI] - // Tracks have domain [0, 2 * M_PI] - // TLorentVectors have domain [-M_PI, M_PI] - double translatePhi(double phi) - { - if (phi < 0) { - phi += 2 * M_PI; // Add 2 pi to make it positive - } - return phi; + float q32 = q12.M2() + q23.M2() + q31.M2(); + return std::sqrt(-q32); } - Produces tags; - - HistogramRegistry mHistManager{"HeavyNeutralMesonFilterHistograms", {}, OutputObjHandlingPolicy::AnalysisObject}; - - Configurable cfgHNMMassCorrection{"cfgHNMMassCorrection", 1, "Use GG PDG mass to correct HNM mass (0 = off, 1 = subDeltaPi0, 2 = subLambda)"}; - static constexpr float defaultMassWindows[2][4] = {{0., 0.4, 0.6, 1.}, {0.4, 0.8, 0.8, 1.2}}; - Configurable> massWindowOmega{"massWindowOmega", {defaultMassWindows[0], 4, {"pi0_min", "pi0_max", "omega_min", "omega_max"}}, "Mass window for selected omegas and their decay pi0"}; - Configurable> massWindowEtaPrime{"massWindowEtaPrime", {defaultMassWindows[1], 4, {"eta_min", "eta_max", "etaprime_min", "etaprime_max"}}, "Mass window for selected eta' and their decay eta"}; - - static constexpr float defaultMinPts[4] = {1.8, 1.8, 2.6, 2.6}; - static constexpr float defaultFemtoMinPts[4] = {1.8, 1.8, 2.6, 2.6}; - - Configurable> minHNMPts{"minHNMPts", {defaultMinPts, 4, {"PCM_omega", "PCM_etaprime", "EMC_omega", "EMC_etaprime"}}, "Minimum pT values for the trigger decisions (GeV/c)"}; - - Configurable> minFemtoHNMPts{"minFemtoHNMPts", {defaultFemtoMinPts, 4, {"PCM_omega", "PCM_etaprime", "EMC_omega", "EMC_etaprime"}}, "Minimum pT values for the femto trigger decisions (GeV/c)"}; - - std::vector vGGs; - std::vector vHNMs; - - bool colContainsPCMOmega, colContainsEMCOmega, colContainsPCMEtaPrime, colContainsEMCEtaPrime = false; - - emcal::Geometry* emcalGeom; - - // Femto - // Prepare vectors for different species - std::vector etaPrimeEMC, etaPrimePCM, omegaEMC, omegaPCM, proton, antiproton, deuteron, antideuteron, pion, antipion; - float mMassProton = o2::constants::physics::MassProton; - float mMassDeuteron = o2::constants::physics::MassDeuteron; - float mMassOmega = 0.782; - float mMassEtaPrime = 0.957; - float mMassPionCharged = o2::constants::physics::MassPionCharged; - void init(InitContext const&) { - emcalGeom = emcal::Geometry::GetInstanceFromRunNumber(300000); - auto hCollisionCounter = mHistManager.add("Event/hCollisionCounter", "Number of collisions;;#bf{#it{N}_{Coll}}", HistType::kTH1F, {{6, -0.5, 5.5}}); - hCollisionCounter->GetXaxis()->SetBinLabel(1, "all"); - hCollisionCounter->GetXaxis()->SetBinLabel(2, "kTVXinEMC"); - hCollisionCounter->GetXaxis()->SetBinLabel(3, "PCM #omega"); - hCollisionCounter->GetXaxis()->SetBinLabel(4, "EMC #omega"); - hCollisionCounter->GetXaxis()->SetBinLabel(5, "PCM #eta'"); - hCollisionCounter->GetXaxis()->SetBinLabel(6, "EMC #eta'"); - - mHistManager.add("Event/nGGs", "Number of (selected) #gamma#gamma paris;#bf{#it{N}_{#gamma#gamma}};#bf{#it{N}_{#gamma#gamma}^{selected}}", HistType::kTH2F, {{51, -0.5, 50.5}, {51, -0.5, 50.5}}); - mHistManager.add("Event/nTracks", "Number of tracks;#bf{N_{tracks}};#bf{#it{N}_{Coll}}", HistType::kTH1F, {{51, -0.5, 50.5}}); - mHistManager.add("Event/nHeavyNeutralMesons", "Number of (selected) HNM candidates;#bf{#it{N}_{HNM}};#bf{#it{N}_{HNM}^{selected}}", HistType::kTH2F, {{51, -0.5, 50.5}, {51, -0.5, 50.5}}); - mHistManager.add("Event/nClustersVsV0s", "Number of clusters and V0s in the collision;#bf{#it{N}_{clusters}};#bf{#it{N}_{V0s}}", HistType::kTH2F, {{26, -0.5, 25.5}, {26, -0.5, 25.5}}); - - mHistManager.add("GG/invMassVsPt_PCM", "Invariant mass and pT of gg candidates;#bf{#it{M}_{#gamma#gamma}};#bf{#it{pT}_{#gamma#gamma}}", HistType::kTH2F, {{400, 0., 0.8}, {250, 0., 25.}}); - mHistManager.add("GG/invMassVsPt_PCMEMC", "Invariant mass and pT of gg candidates;#bf{#it{M}_{#gamma#gamma}};#bf{#it{pT}_{#gamma#gamma}}", HistType::kTH2F, {{400, 0., 0.8}, {250, 0., 25.}}); - mHistManager.add("GG/invMassVsPt_EMC", "Invariant mass and pT of gg candidates;#bf{#it{M}_{#gamma#gamma}};#bf{#it{pT}_{#gamma#gamma}}", HistType::kTH2F, {{400, 0., 0.8}, {250, 0., 25.}}); - - mHistManager.add("Omega/invMassVsPt_PCM", "Invariant mass and pT of omega meson candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{400, 0.6, 1.}, {250, 0., 25.}}); - mHistManager.add("Omega/invMassVsPt_PCMEMC", "Invariant mass and pT of omega meson candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{400, 0.6, 1.}, {250, 0., 25.}}); - mHistManager.add("Omega/invMassVsPt_EMC", "Invariant mass and pT of omega meson candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{400, 0.6, 1.}, {250, 0., 25.}}); - - mHistManager.add("EtaPrime/invMassVsPt_PCM", "Invariant mass and pT of eta' candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{400, 0.8, 1.2}, {250, 0., 25.}}); - mHistManager.add("EtaPrime/invMassVsPt_PCMEMC", "Invariant mass and pT of eta' candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{400, 0.8, 1.2}, {250, 0., 25.}}); - mHistManager.add("EtaPrime/invMassVsPt_EMC", "Invariant mass and pT of eta' candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{400, 0.8, 1.2}, {250, 0., 25.}}); - - // include all femto histograms - mHistManager.add("fProcessedEvents", "CF - event filtered;;Events", HistType::kTH1F, {{15, -0.5, 14.5}}); - std::vector eventTitles = {"all", "rejected", "PPOmega", "PPEtaPrime", "Omegad", "EtaPrimed", "OmegaP", "EtaPrimeP", "kTVXinEMC", "PCM #omega", "EMC #omega", "PCM #eta'", "EMC #eta'"}; - for (size_t iBin = 0; iBin < eventTitles.size(); iBin++) { - mHistManager.get(HIST("fProcessedEvents"))->GetXaxis()->SetBinLabel(iBin + 1, eventTitles[iBin].data()); - } - - // event cuts - mHistManager.add("EventCuts/fMultiplicityBefore", "Multiplicity of all processed events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); - mHistManager.add("EventCuts/fMultiplicityAfter", "Multiplicity after event cuts;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); - mHistManager.add("EventCuts/fZvtxBefore", "Zvtx of all processed events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); - mHistManager.add("EventCuts/fZvtxAfter", "Zvtx after event cuts;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); - - // mom correlations p vs pTPC - mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationPos", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); - mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationNeg", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); + mHistManager.add("Event/nGGs", "Number of (selected) #gamma#gamma paris;#bf{#it{N}^{#gamma#gamma}};#bf{#it{N}_{selected}^{#gamma#gamma}}", HistType::kTH2F, {{51, -0.5, 50.5}, {51, -0.5, 50.5}}); + mHistManager.add("Event/nHeavyNeutralMesons", "Number of (selected) HNM candidates;#bf{#it{N}^{HNM}};#bf{#it{N}_{selected}^{HNM}}", HistType::kTH2F, {{51, -0.5, 50.5}, {51, -0.5, 50.5}}); + mHistManager.add("Event/nClustersVsV0s", "Number of clusters and V0s in the collision;#bf{#it{N}^{clusters}};#bf{#it{N}^{V0s}}", HistType::kTH2F, {{26, -0.5, 25.5}, {26, -0.5, 25.5}}); + mHistManager.add("Event/nEMCalEvents", "Number of collisions with a certain combination of EMCal triggers;;#bf{#it{N}_{collisions}}", HistType::kTH1F, {{5, -0.5, 4.5}}); + std::vector nEventTitles = {"Cells & kTVXinEMC", "Cells & L0", "Cells & !kTVXinEMC & !L0", "!Cells & kTVXinEMC", "!Cells & L0"}; + for (size_t iBin = 0; iBin < nEventTitles.size(); iBin++) + mHistManager.get(HIST("Event/nEMCalEvents"))->GetXaxis()->SetBinLabel(iBin + 1, nEventTitles[iBin].data()); + mHistManager.add("Event/fMultiplicityBefore", "Multiplicity of all processed events;#bf{#it{N}_{tracks}};#bf{#it{N}_{collisions}}", HistType::kTH1F, {{500, 0, 500}}); + mHistManager.add("Event/fMultiplicityAfter", "Multiplicity after event cuts;#bf{#it{N}_{tracks}};#bf{#it{N}_{collisions}}", HistType::kTH1F, {{500, 0, 500}}); + mHistManager.add("Event/fZvtxBefore", "Zvtx of all processed events;#bf{z_{vtx} (cm)};#bf{#it{N}_{collisions}}", HistType::kTH1F, {{500, -15, 15}}); + mHistManager.add("Event/fZvtxAfter", "Zvtx after event cuts;#bf{z_{vtx} (cm)};#bf{#it{N}_{collisions}}", HistType::kTH1F, {{500, -15, 15}}); + mHistManager.add("fProcessedEvents", "CF - event filtered;;Events", HistType::kTH1F, {{12, -0.5, 11.5}}); + std::vector pEventTitles = {"all", "rejected", "PCM #omega", "EMC #omega", "PCM #eta'", "EMC #eta'", "PPOmega", "PPEtaPrime", "Omegad", "EtaPrimed", "OmegaP", "EtaPrimeP"}; + for (size_t iBin = 0; iBin < pEventTitles.size(); iBin++) + mHistManager.get(HIST("fProcessedEvents"))->GetXaxis()->SetBinLabel(iBin + 1, pEventTitles[iBin].data()); + + mHistManager.add("GG/invMassVsPt_PCM", "Invariant mass and pT of gg candidates;#bf{#it{M}^{#gamma#gamma} (GeV/#it{c}^{2})};#bf{#it{p}_{T}^{#gamma#gamma} (GeV/#it{c})}", HistType::kTH2F, {{400, 0., 0.8}, {250, 0., 25.}}); + mHistManager.add("GG/invMassVsPt_PCMEMC", "Invariant mass and pT of gg candidates;#bf{#it{M}^{#gamma#gamma} (GeV/#it{c}^{2})};#bf{#it{p}_{T}^{#gamma#gamma} (GeV/#it{c})}", HistType::kTH2F, {{400, 0., 0.8}, {250, 0., 25.}}); + mHistManager.add("GG/invMassVsPt_EMC", "Invariant mass and pT of gg candidates;#bf{#it{M}^{#gamma#gamma} (GeV/#it{c}^{2})};#bf{#it{p}_{T}^{#gamma#gamma} (GeV/#it{c})}", HistType::kTH2F, {{400, 0., 0.8}, {250, 0., 25.}}); + + // Momentum correlations p vs p_TPC + mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationPos", "fMomCorrelation;#bf{#it{p} (GeV/#it{c})};#bf{#it{p}_{TPC} (GeV/#it{c})}", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); + mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationNeg", "fMomCorrelation;#bf{#it{p} (GeV/#it{c})};#bf{#it{p}_{TPC} (GeV/#it{c})}", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); + + // All tracks + mHistManager.add("TrackCuts/TracksBefore/fPtTrackBefore", "Transverse momentum of all processed tracks;#bf{#it{p}_{T} (GeV/#it{c})};#bf{#it{N}_{tracks}}", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/TracksBefore/fEtaTrackBefore", "Pseudorapidity of all processed tracks;#eta;#bf{#it{N}_{tracks}}", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/TracksBefore/fPhiTrackBefore", "Azimuthal angle of all processed tracks;#phi;#bf{#it{N}_{tracks}}", HistType::kTH1F, {{720, 0, constants::math::TwoPI}}); - mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsProton", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); - mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsAntiProton", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); - mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsDeuteron", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); - mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsAntiDeuteron", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); + // TPC signal + mHistManager.add("TrackCuts/TPCSignal/fTPCSignalTPCP", "TPCSignal;#bf{#it{p}_{TPC} (GeV/#it{c})};#bf{TPC d#it{E}/d#it{x}}", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); + mHistManager.add("TrackCuts/TPCSignal/fTPCSignal", "TPCSignalP;#bf{#it{p} (GeV/#it{c})};#bf{TPC d#it{E}/d#it{x}}", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); + // TPC signal antiparticles (negative charge) + mHistManager.add("TrackCuts/TPCSignal/fTPCSignalAntiTPCP", "TPCSignal;#bf{#it{p}_{TPC} (GeV/#it{c})};#bf{TPC d#it{E}/d#it{x}}", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); + mHistManager.add("TrackCuts/TPCSignal/fTPCSignalAnti", "TPCSignalP;#bf{#it{p} (GeV/#it{c})};#bf{TPC d#it{E}/d#it{x}}", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); + + const int nTrackSpecies = 2 * hnmtrigger::kNFemtoPartners; // x2 because of anti particles + const char* particleSpecies[nTrackSpecies] = {"Proton", "AntiProton", "Deuteron", "AntiDeuteron", "Pion", "AntiPion"}; + const char* particleSpeciesLatex[nTrackSpecies] = {"p", "#bar{p}", "d", "#bar{d}", "#pi^{+}", "#pi^{-}"}; + + for (int iParticle = 0; iParticle < nTrackSpecies; iParticle++) { + mHistManager.add(Form("TrackCuts/TracksBefore/fMomCorrelationAfterCuts%s", particleSpecies[iParticle]), Form("%s momentum correlation;#bf{#it{p} (GeV/#it{c})};#bf{#it{p}_{TPC} (GeV/#it{c})}", particleSpecies[iParticle]), {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); + mHistManager.add(Form("TrackCuts/TPCSignal/fTPCSignal%s", particleSpecies[iParticle]), Form("%s TPC energy loss;#bf{#it{p}_{TPC}^{%s} (GeV/#it{c})};#bf{TPC d#it{E}/d#it{x}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle]), {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); + + mHistManager.add(Form("TrackCuts/%s/fP", particleSpecies[iParticle]), Form("%s momentum at PV;#bf{#it{p}^{%s} (GeV/#it{c})};#bf{#it{N}^{%s}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle]), HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add(Form("TrackCuts/%s/fPt", particleSpecies[iParticle]), Form("%s transverse momentum;#bf{#it{p}_{T}^{%s} (GeV/#it{c})};#bf{#it{N}^{%s}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle]), HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add(Form("TrackCuts/%s/fMomCorDif", particleSpecies[iParticle]), Form("Momentum correlation;#bf{#it{p}^{%s} (GeV/#it{c})};#bf{#it{p}_{TPC}^{%s} - #it{p}^{%s} (GeV/#it{c})}", particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle]), {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); + mHistManager.add(Form("TrackCuts/%s/fMomCorRatio", particleSpecies[iParticle]), Form("Relative momentum correlation;#bf{#it{p}^{%s} (GeV/#it{c})};#bf{#it{p}_{TPC}^{%s} - #it{p}^{%s} / #it{p}^{%s}}", particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle]), {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); + mHistManager.add(Form("TrackCuts/%s/fEta", particleSpecies[iParticle]), Form("%s pseudorapidity distribution;#eta;#bf{#it{N}^{%s}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle]), HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add(Form("TrackCuts/%s/fPhi", particleSpecies[iParticle]), Form("%s azimuthal angle distribution;#phi;#bf{#it{N}^{%s}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle]), HistType::kTH1F, {{720, 0, constants::math::TwoPI}}); + + mHistManager.add(Form("TrackCuts/%s/fNsigmaTPCvsTPCP", particleSpecies[iParticle]), Form("NSigmaTPC %s;#bf{#it{p}_{TPC}^{%s} (GeV/#it{c})};#bf{n#sigma_{TPC}^{%s}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle]), {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add(Form("TrackCuts/%s/fNsigmaTOFvsTPCP", particleSpecies[iParticle]), Form("NSigmaTOF %s;#bf{#it{p}_{TPC}^{%s} (GeV/#it{c})};#bf{n#sigma_{TOF}^{%s}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle]), {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add(Form("TrackCuts/%s/fNsigmaTPCTOFvsTPCP", particleSpecies[iParticle]), Form("NSigmaTPCTOF %s;#bf{#it{p}_{TPC}^{%s} (GeV/#it{c})};n#sigma_{comb}^{%s}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle]), {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); + mHistManager.add(Form("TrackCuts/%s/fNsigmaITSvsP", particleSpecies[iParticle]), Form("NSigmaITS %s;#bf{#it{p}^{%s} (GeV/#it{c})};#bf{n#sigma_{ITS}^{%s}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle]), {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add(Form("TrackCuts/%s/fNsigmaTPCvsP", particleSpecies[iParticle]), Form("NSigmaTPC %s P;#bf{#it{p}^{%s} (GeV/#it{c})};#bf{n#sigma_{TPC}^{%s}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle]), {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add(Form("TrackCuts/%s/fNsigmaTOFvsP", particleSpecies[iParticle]), Form("NSigmaTOF %s P;#bf{#it{p}^{%s} (GeV/#it{c})};#bf{n#sigma_{TOF}^{%s}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle]), {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add(Form("TrackCuts/%s/fNsigmaTPCTOFvsP", particleSpecies[iParticle]), Form("NSigmaTPCTOF %s P;#bf{#it{p}^{%s} (GeV/#it{c})};#bf{n#sigma_{comb}^{%s}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle]), {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); + + mHistManager.add(Form("TrackCuts/%s/fDCAxy", particleSpecies[iParticle]), Form("fDCAxy %s;#bf{DCA_{xy}};#bf{#it{N}^{%s}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle]), HistType::kTH1F, {{500, -0.5f, 0.5f}}); + mHistManager.add(Form("TrackCuts/%s/fDCAz", particleSpecies[iParticle]), Form("fDCAz %s;#bf{DCA_{z}};#bf{#it{N}^{%s}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle]), HistType::kTH1F, {{500, -0.5f, 0.5f}}); + mHistManager.add(Form("TrackCuts/%s/fTPCsCls", particleSpecies[iParticle]), Form("fTPCsCls %s;#bf{TPC Shared Clusters};#bf{#it{N}^{%s}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle]), HistType::kTH1F, {{163, -1.0f, 162.0f}}); + mHistManager.add(Form("TrackCuts/%s/fTPCcRows", particleSpecies[iParticle]), Form("fTPCcRows %s;#bf{TPC Crossed Rows};#bf{#it{N}^{%s}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle]), HistType::kTH1F, {{163, -1.0f, 162.0f}}); + mHistManager.add(Form("TrackCuts/%s/fTrkTPCfCls", particleSpecies[iParticle]), Form("fTrkTPCfCls %s;#bf{TPC Findable/CrossedRows};#bf{#it{N}^{%s}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle]), HistType::kTH1F, {{500, 0.0f, 3.0f}}); + mHistManager.add(Form("TrackCuts/%s/fTPCncls", particleSpecies[iParticle]), Form("fTPCncls %s;#bf{TPC Clusters};#bf{#it{N}^{%s}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle]), HistType::kTH1F, {{163, -1.0f, 162.0f}}); + } - mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsPion", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{1000, 0.0f, 20.0f}, {1000, 0.0f, 20.0f}}}); - mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsAntiPion", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{1000, 0.0f, 20.0f}, {1000, 0.0f, 20.0f}}}); + // --> HNM QA + // pi+ daughter + mHistManager.add("HNM/Before/PosDaughter/fInvMass", "Invariant mass HMN Pos Daugh;#bf{#it{M}^{#pi^{+}} (GeV/#it{c}^{2})};#bf{#it{N}^{#pi^{+}}}", HistType::kTH1F, {{200, 0, 0.2}}); + mHistManager.add("HNM/Before/PosDaughter/fPt", "Transverse momentum HMN Pos Daugh tracks;#bf{#it{p}_{T} (GeV/#it{c})};#bf{#it{N}^{#pi^{+}}}", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("HNM/Before/PosDaughter/fEta", "HMN Pos Daugh Eta;#eta;#bf{#it{N}^{#pi^{+}}}", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("HNM/Before/PosDaughter/fPhi", "Azimuthal angle of HMN Pos Daugh tracks;#phi;#bf{#it{N}^{#pi^{+}}}", HistType::kTH1F, {{720, 0, constants::math::TwoPI}}); + // pi- daughter + mHistManager.add("HNM/Before/NegDaughter/fInvMass", "Invariant mass HMN Neg Daugh;#bf{#it{M}^{#pi^{-}} (GeV/#it{c}^{2})};#bf{#it{N}^{#pi^{-}}}", HistType::kTH1F, {{200, 0, 0.2}}); + mHistManager.add("HNM/Before/NegDaughter/fPt", "Transverse momentum HMN Neg Daugh tracks;#bf{#it{p}_{T} (GeV/#it{c})};#bf{#it{N}^{#pi^{-}}}", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("HNM/Before/NegDaughter/fEta", "HMN Neg Daugh Eta;#eta;#bf{#it{N}^{#pi^{-}}}", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("HNM/Before/NegDaughter/fPhi", "Azimuthal angle of HMN Neg Daugh tracks;#phi;#bf{#it{N}^{#pi^{-}}}", HistType::kTH1F, {{720, 0, constants::math::TwoPI}}); + // Properties of the pi+pi- pair + mHistManager.add("HNM/Before/PiPlPiMi/fInvMassVsPt", "Invariant mass and pT of #pi^+pi^- pairs;#bf{#it{M}^{#pi^{+}#pi^{-}} (GeV/#it{c}^{2})};#bf{#it{p}_{T}^{#pi^{+}#pi^{-}} (GeV/#it{c})}", HistType::kTH2F, {{400, 0.2, 1.}, {250, 0., 25.}}); + mHistManager.add("HNM/Before/PiPlPiMi/fEta", "Pseudorapidity of HMNCand;#eta;#bf{#it{N}^{#pi^{+}#pi^{-}}}", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("HNM/Before/PiPlPiMi/fPhi", "Azimuthal angle of HMNCand;#phi;#bf{#it{N}^{#pi^{+}#pi^{-}}}", HistType::kTH1F, {{720, 0, constants::math::TwoPI}}); + + for (const auto& BeforeAfterString : {"Before", "After"}) { + for (const auto& iHNM : {"Omega", "EtaPrime"}) { + for (const auto& MethodString : {"PCM", "EMC"}) { + mHistManager.add(Form("HNM/%s/%s/%s/fInvMassVsPt", BeforeAfterString, iHNM, MethodString), "Invariant mass and pT of heavy neutral meson candidates;#bf{#it{M}^{#pi^{+}#pi^{-}#gamma#gamma} (GeV/#it{c}^{2})};#bf{#it{p}_{T}^{#pi^{+}#pi^{-}#gamma#gamma} (GeV/#it{c})}", HistType::kTH2F, {{600, 0.6, 1.2}, {250, 0., 25.}}); + mHistManager.add(Form("HNM/%s/%s/%s/fEta", BeforeAfterString, iHNM, MethodString), "Pseudorapidity of HNM candidate;#eta;#bf{#it{N}^{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add(Form("HNM/%s/%s/%s/fPhi", BeforeAfterString, iHNM, MethodString), "Azimuthal angle of HNM candidate;#phi;#bf{#it{N}^{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH1F, {{720, 0, constants::math::TwoPI}}); + } + } + } + mHistManager.add("HNM/Before/Omega/PCMEMC/fInvMassVsPt", "Invariant mass and pT of omega meson candidates;#bf{#it{M}^{#pi^{+}#pi^{-}#gamma#gamma} (GeV/#it{c}^{2})};#bf{#it{p}_{T}^{#pi^{+}#pi^{-}#gamma#gamma} (GeV/#it{c})}", HistType::kTH2F, {{600, 0.6, 1.2}, {250, 0., 25.}}); + mHistManager.add("HNM/Before/Omega/PCMEMC/fEta", "Pseudorapidity of HMNCand;#eta;#bf{#it{N}^{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("HNM/Before/Omega/PCMEMC/fPhi", "Azimuthal angle of HMNCand;#phi;#bf{#it{N}^{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH1F, {{720, 0, constants::math::TwoPI}}); + mHistManager.add("HNM/Before/EtaPrime/PCMEMC/fInvMassVsPt", "Invariant mass and pT of eta' meson candidates;#bf{#it{M}^{#pi^{+}#pi^{-}#gamma#gamma} (GeV/#it{c}^{2})};#bf{#it{p}_{T}^{#pi^{+}#pi^{-}#gamma#gamma} (GeV/#it{c})}", HistType::kTH2F, {{600, 0.8, 1.2}, {250, 0., 25.}}); + mHistManager.add("HNM/Before/EtaPrime/PCMEMC/fEta", "Pseudorapidity of HMNCand;#eta;#bf{#it{N}^{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("HNM/Before/EtaPrime/PCMEMC/fPhi", "Azimuthal angle of HMNCand;#phi;#bf{#it{N}^{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH1F, {{720, 0, constants::math::TwoPI}}); + + // --> Two body femto histograms + for (const auto& iFemtoPartner : {"p", "d"}) { + for (const auto& iHNM : {"omega", "etaprime"}) { + mHistManager.add(Form("%s%s/fMultiplicity", iHNM, iFemtoPartner), "Multiplicity of all processed events;#bf{#it{N}_{tracks}};#bf{#it{N}_{collisions}}", HistType::kTH1F, {{500, 0, 500}}); + mHistManager.add(Form("%s%s/fZvtx", iHNM, iFemtoPartner), "Zvtx of all processed events;#bf{z_{vtx} (cm)};#bf{#it{N}_{collisions}}", HistType::kTH1F, {{500, -15, 15}}); + for (const auto& iEMCPCM : {"PCM", "EMC"}) { + mHistManager.add(Form("%s%s/fSE_particle_%s", iHNM, iFemtoPartner, iEMCPCM), Form("Same Event distribution;#bf{#it{K}^{*} (GeV/#it{c})};#bf{#it{N}^{%s}}", iFemtoPartner), HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add(Form("%s%s/fSE_Antiparticle_%s", iHNM, iFemtoPartner, iEMCPCM), Form("Same Event distribution;#bf{#it{K}^{*} (GeV/#it{c})};#bf{#it{N}^{#bar{%s}}}", iFemtoPartner), HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add(Form("%s%s/f%sPtVskstar_%s", iHNM, iFemtoPartner, iHNM, iEMCPCM), Form("K* vs %s pt;#bf{#it{K}^{*} (GeV/#it{c})};#bf{#it{p}_{T}^{%s} (GeV/#it{c})}", iHNM, iHNM), HistType::kTH2F, {{{150, 0, 1.5}, {500, 0, 10}}}); + mHistManager.add(Form("%s%s/f%sPtVskstar_%s", iHNM, iFemtoPartner, iFemtoPartner, iEMCPCM), Form("K* vs %s pt;#bf{#it{K}^{*} (GeV/#it{c})};#bf{#it{p}_{T}^{%s} (GeV/#it{c})}", iFemtoPartner, iFemtoPartner), HistType::kTH2F, {{{150, 0, 1.5}, {500, 0, 10}}}); + mHistManager.add(Form("%s%s/fAnti%sPtVskstar_%s", iHNM, iFemtoPartner, iFemtoPartner, iEMCPCM), Form("K* vs #bar{%s} pt;#bf{#it{K}^{*} (GeV/#it{c})};#bf{#it{p}_{T}^{#bar{%s}} (GeV/#it{c})}", iFemtoPartner, iFemtoPartner), HistType::kTH2F, {{{150, 0, 1.5}, {500, 0, 10}}}); + } + } + } - // all tracks - mHistManager.add("TrackCuts/TracksBefore/fPtTrackBefore", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/TracksBefore/fEtaTrackBefore", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/TracksBefore/fPhiTrackBefore", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + // --> Three body femto histograms + for (const auto& iHNM : {"omega", "etaprime"}) { + mHistManager.add(Form("pp%s/fMultiplicity", iHNM), "Multiplicity of all processed events;#bf{#it{N}_{tracks}};#bf{#it{N}_{collisions}}", HistType::kTH1F, {{500, 0, 500}}); + mHistManager.add(Form("pp%s/fZvtx", iHNM), "Zvtx of all processed events;#bf{z_{vtx} (cm)};#bf{#it{N}_{collisions}}", HistType::kTH1F, {{500, -15, 15}}); + for (const auto& iEMCPCM : {"PCM", "EMC"}) { + mHistManager.add(Form("pp%s/fSE_particle_%s", iHNM, iEMCPCM), "Same Event distribution;#bf{#it{Q}_{3} (GeV/#it{c})};#bf{#it{N}^{pp}}", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add(Form("pp%s/fSE_Antiparticle_%s", iHNM, iEMCPCM), "Same Event distribution;#bf{#it{Q}_{3} (GeV/#it{c})};#bf{#it{N}^{#bar{p}#bar{p}}}", HistType::kTH1F, {{8000, 0, 8}}); + mHistManager.add(Form("pp%s/fProtonPtVsQ3_%s", iHNM, iEMCPCM), "pT (proton) vs Q_{3};#bf{#it{Q}_{3} (GeV/#it{c})};#bf{#it{p}_{T}^{p} (GeV/#it{c})}", HistType::kTH2F, {{{150, 0, 1.5}, {500, 0, 10}}}); + mHistManager.add(Form("pp%s/f%sCandPtVsQ3_%s", iHNM, iHNM, iEMCPCM), Form("pT (%s) vs Q_{3};#bf{#it{Q}_{3} (GeV/#it{c})};#bf{#it{p}_{T}^{%s} (GeV/#it{c})}", iHNM, iHNM), HistType::kTH2F, {{{150, 0, 1.5}, {500, 0, 10}}}); + mHistManager.add(Form("pp%s/fAntiProtonPtVsQ3_%s", iHNM, iEMCPCM), "pT (antiproton) vs Q_{3};#bf{#it{Q}_{3} (GeV/#it{c})};#bf{#it{p}_{T}^{#bar{p}} (GeV/#it{c})}", HistType::kTH2F, {{{150, 0, 1.5}, {500, 0, 10}}}); + } + } - // TPC signal - mHistManager.add("TrackCuts/TPCSignal/fTPCSignal", "TPCSignal;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); - mHistManager.add("TrackCuts/TPCSignal/fTPCSignalP", "TPCSignalP;p (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); - // TPC signal anti - mHistManager.add("TrackCuts/TPCSignal/fTPCSignalAnti", "TPCSignal;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); - mHistManager.add("TrackCuts/TPCSignal/fTPCSignalAntiP", "TPCSignalP;p (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); - - // TPC signal particles - mHistManager.add("TrackCuts/TPCSignal/fTPCSignalProton", "fTPCSignalProton;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); - mHistManager.add("TrackCuts/TPCSignal/fTPCSignalAntiProton", "fTPCSignalAntiProton;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); - mHistManager.add("TrackCuts/TPCSignal/fTPCSignalDeuteron", "fTPCSignalDeuteron;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); - mHistManager.add("TrackCuts/TPCSignal/fTPCSignalAntiDeuteron", "fTPCSignalAntiDeuteron;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); - mHistManager.add("TrackCuts/TPCSignal/fTPCSignalPion", "fTPCSignalPion;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); - mHistManager.add("TrackCuts/TPCSignal/fTPCSignalAntiPion", "fTPCSignalAntiPion;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); - - // proton - mHistManager.add("TrackCuts/Proton/fPProton", "Momentum of protons at PV;p (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/Proton/fPTPCProton", "Momentum of protons at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/Proton/fPtProton", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/Proton/fMomCorProtonDif", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); - mHistManager.add("TrackCuts/Proton/fMomCorProtonRatio", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); - mHistManager.add("TrackCuts/Proton/fEtaProton", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/Proton/fPhiProton", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - mHistManager.add("TrackCuts/Proton/fNsigmaTPCvsPProton", "NSigmaTPC Proton;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/Proton/fNsigmaTOFvsPProton", "NSigmaTOF Proton;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/Proton/fNsigmaTPCTOFvsPProton", "NSigmaTPCTOF Proton;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - mHistManager.add("TrackCuts/Proton/fNsigmaITSvsPProton", "NSigmaITS Proton;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - - mHistManager.add("TrackCuts/Proton/fNsigmaTPCvsPProtonP", "NSigmaTPC Proton P;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/Proton/fNsigmaTOFvsPProtonP", "NSigmaTOF Proton P;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/Proton/fNsigmaTPCTOFvsPProtonP", "NSigmaTPCTOF Proton P;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - - mHistManager.add("TrackCuts/Proton/fDCAxyProton", "fDCAxy Proton;DCA_{XY};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - mHistManager.add("TrackCuts/Proton/fDCAzProton", "fDCAz Proton;DCA_{Z};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - mHistManager.add("TrackCuts/Proton/fTPCsClsProton", "fTPCsCls Proton;TPC Shared Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - mHistManager.add("TrackCuts/Proton/fTPCcRowsProton", "fTPCcRows Proton;TPC Crossed Rows;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - mHistManager.add("TrackCuts/Proton/fTrkTPCfClsProton", "fTrkTPCfCls Proton;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {{500, 0.0f, 3.0f}}); - mHistManager.add("TrackCuts/Proton/fTPCnclsProton", "fTPCncls Proton;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - - // antiproton - mHistManager.add("TrackCuts/AntiProton/fPtAntiProton", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/AntiProton/fMomCorAntiProtonDif", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); - mHistManager.add("TrackCuts/AntiProton/fMomCorAntiProtonRatio", "Momentum correlation;p_{reco} (GeV/c); |p_{TPC} - p_{reco}| (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); - mHistManager.add("TrackCuts/AntiProton/fEtaAntiProton", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/AntiProton/fPhiAntiProton", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - mHistManager.add("TrackCuts/AntiProton/fNsigmaTPCvsPAntiProton", "NSigmaTPC AntiProton;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/AntiProton/fNsigmaTOFvsPAntiProton", "NSigmaTOF AntiProton;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/AntiProton/fNsigmaTPCTOFvsPAntiProton", "NSigmaTPCTOF AntiProton;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - mHistManager.add("TrackCuts/AntiProton/fNsigmaITSvsPAntiProton", "NSigmaITS AntiProton;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - - mHistManager.add("TrackCuts/AntiProton/fNsigmaTPCvsPAntiProtonP", "NSigmaTPC AntiProton P;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/AntiProton/fNsigmaTOFvsPAntiProtonP", "NSigmaTOF AntiProton P;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/AntiProton/fNsigmaTPCTOFvsPAntiProtonP", "NSigmaTPCTOF AntiProton P;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - - mHistManager.add("TrackCuts/AntiProton/fDCAxyAntiProton", "fDCAxy AntiProton;DCA_{XY};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - mHistManager.add("TrackCuts/AntiProton/fDCAzAntiProton", "fDCAz AntiProton;DCA_{Z};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - mHistManager.add("TrackCuts/AntiProton/fTPCsClsAntiProton", "fTPCsCls AntiProton;TPC Shared Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - mHistManager.add("TrackCuts/AntiProton/fTPCcRowsAntiProton", "fTPCcRows AntiProton;TPC Crossed Rows;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - mHistManager.add("TrackCuts/AntiProton/fTrkTPCfClsAntiProton", "fTrkTPCfCls AntiProton;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {{500, 0.0f, 3.0f}}); - mHistManager.add("TrackCuts/AntiProton/fTPCnclsAntiProton", "fTPCncls AntiProton;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - - // deuteron - mHistManager.add("TrackCuts/Deuteron/fPtDeuteron", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/Deuteron/fMomCorDeuteronDif", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); - mHistManager.add("TrackCuts/Deuteron/fMomCorDeuteronRatio", "Momentum correlation;p_{reco} (GeV/c); |p_{TPC} - p_{reco}| (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); - mHistManager.add("TrackCuts/Deuteron/fEtaDeuteron", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/Deuteron/fPhiDeuteron", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - mHistManager.add("TrackCuts/Deuteron/fNsigmaTPCvsPDeuteron", "NSigmaTPC Deuteron;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/Deuteron/fNsigmaTOFvsPDeuteron", "NSigmaTOF Deuteron;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/Deuteron/fNsigmaTPCTOFvsPDeuteron", "NSigmaTPCTOF Deuteron;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - mHistManager.add("TrackCuts/Deuteron/fNsigmaITSvsPDeuteron", "NSigmaITS Deuteron;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - - mHistManager.add("TrackCuts/Deuteron/fNsigmaTPCvsPDeuteronP", "NSigmaTPC Deuteron vd P;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/Deuteron/fNsigmaTOFvsPDeuteronP", "NSigmaTOF Deuteron P;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/Deuteron/fNsigmaTPCTOFvsPDeuteronP", "NSigmaTPCTOF Deuteron P;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - - mHistManager.add("TrackCuts/Deuteron/fDCAxyDeuteron", "fDCAxy Deuteron;DCA_{XY};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - mHistManager.add("TrackCuts/Deuteron/fDCAzDeuteron", "fDCAz Deuteron;DCA_{Z};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - mHistManager.add("TrackCuts/Deuteron/fTPCsClsDeuteron", "fTPCsCls Deuteron;TPC Shared Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - mHistManager.add("TrackCuts/Deuteron/fTPCcRowsDeuteron", "fTPCcRows Deuteron;TPC Crossed Rows;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - mHistManager.add("TrackCuts/Deuteron/fTrkTPCfClsDeuteron", "fTrkTPCfCls Deuteron;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {{500, 0.0f, 3.0f}}); - mHistManager.add("TrackCuts/Deuteron/fTPCnclsDeuteron", "fTPCncls Deuteron;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - - // antideuteron - mHistManager.add("TrackCuts/AntiDeuteron/fPtAntiDeuteron", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/AntiDeuteron/fMomCorAntiDeuteronDif", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); - mHistManager.add("TrackCuts/AntiDeuteron/fMomCorAntiDeuteronRatio", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); - mHistManager.add("TrackCuts/AntiDeuteron/fEtaAntiDeuteron", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/AntiDeuteron/fPhiAntiDeuteron", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - mHistManager.add("TrackCuts/AntiDeuteron/fNsigmaTPCvsPAntiDeuteron", "NSigmaTPC AntiDeuteron;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/AntiDeuteron/fNsigmaTOFvsPAntiDeuteron", "NSigmaTOF AntiDeuteron;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/AntiDeuteron/fNsigmaTPCTOFvsPAntiDeuteron", "NSigmaTPCTOF AntiDeuteron;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - mHistManager.add("TrackCuts/AntiDeuteron/fNsigmaITSvsPAntiDeuteron", "NSigmaITS AntiDeuteron;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - - mHistManager.add("TrackCuts/AntiDeuteron/fNsigmaTPCvsPAntiDeuteronP", "NSigmaTPC AntiDeuteron P;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/AntiDeuteron/fNsigmaTOFvsPAntiDeuteronP", "NSigmaTOF AntiDeuteron P;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/AntiDeuteron/fNsigmaTPCTOFvsPAntiDeuteronP", "NSigmaTPCTOF AntiDeuteron P;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - - mHistManager.add("TrackCuts/AntiDeuteron/fDCAxyAntiDeuteron", "fDCAxy AntiDeuteron;DCA_{XY};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - mHistManager.add("TrackCuts/AntiDeuteron/fDCAzAntiDeuteron", "fDCAz AntiDeuteron;DCA_{Z};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - mHistManager.add("TrackCuts/AntiDeuteron/fTPCsClsAntiDeuteron", "fTPCsCls AntiDeuteron;TPC Shared Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - mHistManager.add("TrackCuts/AntiDeuteron/fTPCcRowsAntiDeuteron", "fTPCcRows AntiDeuteron;TPC Crossed Rows;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - mHistManager.add("TrackCuts/AntiDeuteron/fTrkTPCfClsAntiDeuteron", "fTrkTPCfCls AntiDeuteron;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {{500, 0.0f, 3.0f}}); - mHistManager.add("TrackCuts/AntiDeuteron/fTPCnclsAntiDeuteron", "fTPCncls AntiDeuteron;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - - // pions - mHistManager.add("TrackCuts/Pion/fPPion", "Momentum of Pions at PV;p (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/Pion/fPTPCPion", "Momentum of Pions at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/Pion/fPtPion", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/Pion/fMomCorPionDif", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); - mHistManager.add("TrackCuts/Pion/fMomCorPionRatio", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); - mHistManager.add("TrackCuts/Pion/fEtaPion", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/Pion/fPhiPion", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - mHistManager.add("TrackCuts/Pion/fNsigmaTPCvsPPion", "NSigmaTPC Pion;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/Pion/fNsigmaTOFvsPPion", "NSigmaTOF Pion;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/Pion/fNsigmaTPCTOFvsPPion", "NSigmaTPCTOF Pion;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - - mHistManager.add("TrackCuts/Pion/fNsigmaTPCvsPPionP", "NSigmaTPC Pion P;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/Pion/fNsigmaTOFvsPPionP", "NSigmaTOF Pion P;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/Pion/fNsigmaTPCTOFvsPPionP", "NSigmaTPCTOF Pion P;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - - mHistManager.add("TrackCuts/Pion/fDCAxyPion", "fDCAxy Pion;DCA_{XY};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - mHistManager.add("TrackCuts/Pion/fDCAzPion", "fDCAz Pion;DCA_{Z};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - mHistManager.add("TrackCuts/Pion/fTPCsClsPion", "fTPCsCls Pion;TPC Shared Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - mHistManager.add("TrackCuts/Pion/fTPCcRowsPion", "fTPCcRows Pion;TPC Crossed Rows;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - mHistManager.add("TrackCuts/Pion/fTrkTPCfClsPion", "fTrkTPCfCls Pion;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {{500, 0.0f, 3.0f}}); - mHistManager.add("TrackCuts/Pion/fTPCnclsPion", "fTPCncls Pion;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - - // anti-pions - mHistManager.add("TrackCuts/AntiPion/fPtAntiPion", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/AntiPion/fMomCorAntiPionDif", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); - mHistManager.add("TrackCuts/AntiPion/fMomCorAntiPionRatio", "Momentum correlation;p_{reco} (GeV/c); |p_{TPC} - p_{reco}| (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); - mHistManager.add("TrackCuts/AntiPion/fEtaAntiPion", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/AntiPion/fPhiAntiPion", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - mHistManager.add("TrackCuts/AntiPion/fNsigmaTPCvsPAntiPion", "NSigmaTPC AntiPion;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/AntiPion/fNsigmaTOFvsPAntiPion", "NSigmaTOF AntiPion;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/AntiPion/fNsigmaTPCTOFvsPAntiPion", "NSigmaTPCTOF AntiPion;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - - mHistManager.add("TrackCuts/AntiPion/fNsigmaTPCvsPAntiPionP", "NSigmaTPC AntiPion P;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/AntiPion/fNsigmaTOFvsPAntiPionP", "NSigmaTOF AntiPion P;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/AntiPion/fNsigmaTPCTOFvsPAntiPionP", "NSigmaTPCTOF AntiPion P;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - - mHistManager.add("TrackCuts/AntiPion/fDCAxyAntiPion", "fDCAxy AntiPion;DCA_{XY};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - mHistManager.add("TrackCuts/AntiPion/fDCAzAntiPion", "fDCAz AntiPion;DCA_{Z};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - mHistManager.add("TrackCuts/AntiPion/fTPCsClsAntiPion", "fTPCsCls AntiPion;TPC Shared Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - mHistManager.add("TrackCuts/AntiPion/fTPCcRowsAntiPion", "fTPCcRows AntiPion;TPC Crossed Rows;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - mHistManager.add("TrackCuts/AntiPion/fTrkTPCfClsAntiPion", "fTrkTPCfCls AntiPion;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {{500, 0.0f, 3.0f}}); - mHistManager.add("TrackCuts/AntiPion/fTPCnclsAntiPion", "fTPCncls AntiPion;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - - // HNM - // omega QA - // daughter pos before - mHistManager.add("TrackCuts/HMN/Before/PosDaughter/fInvMass", "Invariant mass HMN Pos Daugh;M_{#pi};Entries", HistType::kTH1F, {{500, 0, 1}}); - mHistManager.add("TrackCuts/HMN/Before/PosDaughter/fPt", "Transverse momentum HMN Pos Daugh tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/HMN/Before/PosDaughter/fEta", "HMN Pos Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/HMN/Before/PosDaughter/fPhi", "Azimuthal angle of HMN Pos Daugh tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - // daughter neg before - mHistManager.add("TrackCuts/HMN/Before/NegDaughter/fInvMass", "Invariant mass HMN Neg Daugh;M_{#pi};Entries", HistType::kTH1F, {{500, 0, 1}}); - mHistManager.add("TrackCuts/HMN/Before/NegDaughter/fPt", "Transverse momentum HMN Neg Daugh tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/HMN/Before/NegDaughter/fEta", "HMN Neg Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/HMN/Before/NegDaughter/fPhi", "Azimuthal angle of HMN Neg Daugh tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - // HMNCand tracks before - mHistManager.add("TrackCuts/HMN/Before/fInvMass_tracks", "Invariant mass HMNCand;M_{#pi#pi#gammg#gamma};Entries", HistType::kTH1F, {{5000, 0, 5}}); - mHistManager.add("TrackCuts/HMN/Before/fPt_tracks", "Transverse momentum HMNCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/HMN/Before/fEta_tracks", "Pseudorapidity of HMNCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/HMN/Before/fPhi_tracks", "Azimuthal angle of HMNCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - // Right now we loose the information about the used tracks and gg properties after creating the HeavyNeutralMeson struct: Maybe it is better to keep track of these? - /*// daughter pos after - mHistManager.add("TrackCuts/omega/After/PosDaughter/fPt", "Transverse momentum omegaCand Pos Daugh tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/omega/After/PosDaughter/fEta", "omegaCandPos Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/omega/After/PosDaughter/fPhi", "Azimuthal angle of omegaCand Pos Daugh tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - // daughter neg after - mHistManager.add("TrackCuts/omega/After/NegDaughter/fPt", "Transverse momentum omegaCand Neg Daugh tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/omega/After/NegDaughter/fEta", "omegaCand Neg Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/omega/After/NegDaughter/fPhi", "Azimuthal angle of omegaCand Neg Daugh tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}});*/ - // omegaCand after - // HMNCand full information - mHistManager.add("TrackCuts/HMN/Before/PCM/fInvMass", "Invariant mass HMNCand;M_{#pi#pi#gammg#gamma};Entries", HistType::kTH1F, {{5000, 0, 5}}); - mHistManager.add("TrackCuts/HMN/Before/PCM/fPt", "Transverse momentum HMNCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/HMN/Before/PCM/fEta", "Pseudorapidity of HMNCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/HMN/Before/PCM/fPhi", "Azimuthal angle of HMNCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - mHistManager.add("TrackCuts/HMN/Before/EMC/fInvMass", "Invariant mass HMNCand;M_{#pi#pi#gammg#gamma};Entries", HistType::kTH1F, {{5000, 0, 5}}); - mHistManager.add("TrackCuts/HMN/Before/EMC/fPt", "Transverse momentum HMNCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/HMN/Before/EMC/fEta", "Pseudorapidity of HMNCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/HMN/Before/EMC/fPhi", "Azimuthal angle of HMNCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - mHistManager.add("TrackCuts/HMN/Before/PCMEMC/fInvMass", "Invariant mass HMNCand;M_{#pi#pi#gammg#gamma};Entries", HistType::kTH1F, {{5000, 0, 5}}); - mHistManager.add("TrackCuts/HMN/Before/PCMEMC/fPt", "Transverse momentum HMNCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/HMN/Before/PCMEMC/fEta", "Pseudorapidity of HMNCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/HMN/Before/PCMEMC/fPhi", "Azimuthal angle of HMNCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - // OmegaCand - mHistManager.add("TrackCuts/HMN/After/Omega/PCM/fInvMass", "Invariant mass omegaCand;M_{#pi#pi};Entries", HistType::kTH1F, {{5000, 0, 5}}); - mHistManager.add("TrackCuts/HMN/After/Omega/PCM/fPt", "Transverse momentum omegaCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/HMN/After/Omega/PCM/fEta", "Pseudorapidity of omegaCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/HMN/After/Omega/PCM/fPhi", "Azimuthal angle of omegaCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - mHistManager.add("TrackCuts/HMN/After/Omega/EMC/fInvMass", "Invariant mass omegaCand;M_{#pi#pi};Entries", HistType::kTH1F, {{5000, 0, 5}}); - mHistManager.add("TrackCuts/HMN/After/Omega/EMC/fPt", "Transverse momentum omegaCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/HMN/After/Omega/EMC/fEta", "Pseudorapidity of omegaCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/HMN/After/Omega/EMC/fPhi", "Azimuthal angle of omegaCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - // EtaPrimeCand - mHistManager.add("TrackCuts/HMN/After/EtaPrime/PCM/fInvMass", "Invariant mass EtaPrimeCand;M_{#pi#pi};Entries", HistType::kTH1F, {{5000, 0, 5}}); - mHistManager.add("TrackCuts/HMN/After/EtaPrime/PCM/fPt", "Transverse momentum EtaPrimeCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/HMN/After/EtaPrime/PCM/fEta", "Pseudorapidity of EtaPrimeCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/HMN/After/EtaPrime/PCM/fPhi", "Azimuthal angle of EtaPrimeCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - mHistManager.add("TrackCuts/HMN/After/EtaPrime/EMC/fInvMass", "Invariant mass EtaPrimeCand;M_{#pi#pi};Entries", HistType::kTH1F, {{5000, 0, 5}}); - mHistManager.add("TrackCuts/HMN/After/EtaPrime/EMC/fPt", "Transverse momentum EtaPrimeCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/HMN/After/EtaPrime/EMC/fEta", "Pseudorapidity of EtaPrimeCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/HMN/After/EtaPrime/EMC/fPhi", "Azimuthal angle of EtaPrimeCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - - // Trigger combs - // for ppomega - mHistManager.add("ppomega/fMultiplicity", "Multiplicity of all processed events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); - mHistManager.add("ppomega/fZvtx", "Zvtx of all processed events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); - - mHistManager.add("ppomega/fSE_particle_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("ppomega/fSE_Antiparticle_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("ppomega/fProtonPtVsQ3_EMC", "pT (proton) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); - mHistManager.add("ppomega/fOmegaCandPtVsQ3_EMC", "pT (omega) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); - mHistManager.add("ppomega/fAntiProtonPtVsQ3_EMC", "pT (antiproton) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); - - mHistManager.add("ppomega/fSE_particle_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("ppomega/fSE_Antiparticle_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("ppomega/fProtonPtVsQ3_PCM", "pT (proton) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); - mHistManager.add("ppomega/fOmegaCandPtVsQ3_PCM", "pT (omega) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); - mHistManager.add("ppomega/fAntiProtonPtVsQ3_PCM", "pT (antiproton) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); - // for ppetaprime - mHistManager.add("ppetaprime/fMultiplicity", "Multiplicity of all processed events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); - mHistManager.add("ppetaprime/fZvtx", "Zvtx of all processed events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); - - mHistManager.add("ppetaprime/fSE_particle_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("ppetaprime/fSE_Antiparticle_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("ppetaprime/fProtonPtVsQ3_EMC", "pT (proton) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); - mHistManager.add("ppetaprime/fEtaPrimeCandPtVsQ3_EMC", "pT (etaprime) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); - mHistManager.add("ppetaprime/fAntiProtonPtVsQ3_EMC", "pT (antiproton) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); - - mHistManager.add("ppetaprime/fSE_particle_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("ppetaprime/fSE_Antiparticle_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("ppetaprime/fProtonPtVsQ3_PCM", "pT (proton) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); - mHistManager.add("ppetaprime/fEtaPrimeCandPtVsQ3_PCM", "pT (etaprime) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); - mHistManager.add("ppetaprime/fAntiProtonPtVsQ3_PCM", "pT (antiproton) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); - - // two body - // omegad - mHistManager.add("omegad/fMultiplicity", "Multiplicity of all processed events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); - mHistManager.add("omegad/fZvtx", "Zvtx of all processed events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); - - mHistManager.add("omegad/fSE_particle_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("omegad/fSE_Antiparticle_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("omegad/fomegaPtVskstar_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("omegad/fDeuteronPtVskstar_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("omegad/fAntiDeuteronPtVskstar_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("omegad/fSE_particle_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("omegad/fSE_Antiparticle_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("omegad/fomegaPtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("omegad/fDeuteronPtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("omegad/fAntiDeuteronPtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - - // etaprimed - mHistManager.add("etaprimed/fMultiplicity", "Multiplicity of all processed events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); - mHistManager.add("etaprimed/fZvtx", "Zvtx of all processed events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); - - mHistManager.add("etaprimed/fSE_particle_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("etaprimed/fSE_Antiparticle_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("etaprimed/fetaprimePtVskstar_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("etaprimed/fDeuteronPtVskstar_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("etaprimed/fAntiDeuteronPtVskstar_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("etaprimed/fSE_particle_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("etaprimed/fSE_Antiparticle_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("etaprimed/fetaprimePtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("etaprimed/fDeuteronPtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("etaprimed/fAntiDeuteronPtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - - // omegap - mHistManager.add("omegap/fMultiplicity", "Multiplicity of all processed events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); - mHistManager.add("omegap/fZvtx", "Zvtx of all processed events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); - - mHistManager.add("omegap/fSE_particle_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("omegap/fSE_Antiparticle_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("omegap/fomegaPtVskstar_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("omegap/fProtonPtVskstar_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("omegap/fAntiProtonPtVskstar_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("omegap/fSE_particle_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("omegap/fSE_Antiparticle_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("omegap/fomegaPtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("omegap/fProtonPtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("omegap/fAntiProtonPtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - - // etaprimep - mHistManager.add("etaprimep/fMultiplicity", "Multiplicity of all processed events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); - mHistManager.add("etaprimep/fZvtx", "Zvtx of all processed events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); - - mHistManager.add("etaprimep/fSE_particle_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("etaprimep/fSE_Antiparticle_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("etaprimep/fetaprimePtVskstar_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("etaprimep/fProtonPtVskstar_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("etaprimep/fAntiProtonPtVskstar_PCM", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("etaprimep/fSE_particle_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("etaprimep/fSE_Antiparticle_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("etaprimep/fetaprimePtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("etaprimep/fProtonPtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - mHistManager.add("etaprimep/fAntiProtonPtVskstar_EMC", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - - if (ConfDoEMCShift.value) { - for (int iSM = 0; iSM < 20; iSM++) { - EMCEtaShift[iSM] = ConfEMCEtaShift.value[iSM]; - EMCPhiShift[iSM] = ConfEMCPhiShift.value[iSM]; - LOG(info) << "SM-wise shift in eta/phi for SM " << iSM << ": " << EMCEtaShift[iSM] << " / " << EMCPhiShift[iSM]; + if (cfgDoEMCShift.value) { + for (int iSM = 0; iSM < nSMs; iSM++) { + emcEtaShift[iSM] = cfgEMCEtaShift.value[iSM]; + emcPhiShift[iSM] = cfgEMCPhiShift.value[iSM]; + LOG(info) << "SM-wise shift in eta/phi for SM " << iSM << ": " << emcEtaShift[iSM] << " / " << emcPhiShift[iSM]; } } } - Preslice perCollision_pcm = aod::v0photonkf::collisionId; - Preslice perCollision_emc = aod::skimmedcluster::collisionId; void process(aod::MyCollision const& collision, aod::MyBCs const&, aod::SkimEMCClusters const& clusters, aod::V0PhotonsKF const& v0s, aod::SelectedTracks const& tracks) { // inlcude ITS PID information auto tracksWithItsPid = soa::Attach(tracks); - mHistManager.fill(HIST("Event/hCollisionCounter"), 0.); - // QA all evts mHistManager.fill(HIST("fProcessedEvents"), 0); - mHistManager.fill(HIST("EventCuts/fMultiplicityBefore"), collision.multNTracksPV()); - mHistManager.fill(HIST("EventCuts/fZvtxBefore"), collision.posZ()); + mHistManager.fill(HIST("Event/fMultiplicityBefore"), collision.multNTracksPV()); + mHistManager.fill(HIST("Event/fZvtxBefore"), collision.posZ()); // Ensure evts are consistent with Sel8 and Vtx-z selection - if (!isSelectedEvent(collision)) { + if (!isSelectedEvent(collision)) return; - } // QA accepted evts - mHistManager.fill(HIST("EventCuts/fMultiplicityAfter"), collision.multNTracksPV()); - mHistManager.fill(HIST("EventCuts/fZvtxAfter"), collision.posZ()); + mHistManager.fill(HIST("Event/fMultiplicityAfter"), collision.multNTracksPV()); + mHistManager.fill(HIST("Event/fZvtxAfter"), collision.posZ()); - colContainsPCMOmega = colContainsEMCOmega = colContainsPCMEtaPrime = colContainsEMCEtaPrime = false; - bool keepFemtoEvent[CFTrigger::kNFemtoTriggers] = {false, false, false, false, false, false}; - int lowMomentumMultiplets[CFTrigger::kNFemtoTriggers] = {0, 0, 0, 0, 0, 0}; + colContainsPCMOmega = colContainsEMCOmega = colContainsPCMEtaPrime = colContainsEMCEtaPrime = false; // Used by spectrum trigger to flag events with high-pT omega/eta' candidates + int lowMomentumMultiplets[hnmtrigger::kNFemtoTriggers] = {0, 0, 0, 0, 0, 0}; // Number of found femto pairs/triplets for each femto trigger + bool keepFemtoEvent[hnmtrigger::kNFemtoTriggers] = {false, false, false, false, false, false}; // Set based on number of found pairs (see above) - used to flag femto events // clean vecs // HNM candidates @@ -824,646 +481,654 @@ struct HeavyNeutralMesonFilter { vHNMs.clear(); // vGGs vector is cleared in reconstructGGs. - if (collision.foundBC_as().alias_bit(kTVXinEMC)) { - mHistManager.fill(HIST("Event/hCollisionCounter"), 1.); - mHistManager.fill(HIST("fProcessedEvents"), 8); - } - - auto v0sInThisCollision = v0s.sliceBy(perCollision_pcm, collision.globalIndex()); - auto clustersInThisCollision = clusters.sliceBy(perCollision_emc, collision.globalIndex()); - + // ---------------------------------> EMCal event QA <---------------------------------- + // - Fill Event/nEMCalEvents histogram for EMCal event QA + // ------------------------------------------------------------------------------------- + bool bcHasEMCCells = collision.isemcreadout(); + bool iskTVXinEMC = collision.foundBC_as().alias_bit(kTVXinEMC); + bool isL0Triggered = collision.foundBC_as().alias_bit(kEMC7) || collision.foundBC_as().alias_bit(kEG1) || collision.foundBC_as().alias_bit(kEG2); + + if (bcHasEMCCells && iskTVXinEMC) + mHistManager.fill(HIST("Event/nEMCalEvents"), 0); + if (bcHasEMCCells && isL0Triggered) + mHistManager.fill(HIST("Event/nEMCalEvents"), 1); + if (bcHasEMCCells && !iskTVXinEMC && !isL0Triggered) + mHistManager.fill(HIST("Event/nEMCalEvents"), 2); + if (!bcHasEMCCells && iskTVXinEMC) + mHistManager.fill(HIST("Event/nEMCalEvents"), 3); + if (!bcHasEMCCells && isL0Triggered) + mHistManager.fill(HIST("Event/nEMCalEvents"), 4); + + // --------------------------------> Process Photons <---------------------------------- + // - Slice clusters and V0s by collision ID to get the ones in this collision + // - Store the clusters and V0s in the vGammas vector + // - Reconstruct gamma-gamma pairs + // ------------------------------------------------------------------------------------- + auto v0sInThisCollision = v0s.sliceBy(perCollisionPCM, collision.globalIndex()); + auto clustersInThisCollision = clusters.sliceBy(perCollisionEMC, collision.globalIndex()); mHistManager.fill(HIST("Event/nClustersVsV0s"), clustersInThisCollision.size(), v0sInThisCollision.size()); - mHistManager.fill(HIST("Event/nTracks"), tracksWithItsPid.size()); std::vector vGammas; - hnmutilities::storeGammasInVector(clustersInThisCollision, v0sInThisCollision, vGammas, EMCEtaShift, EMCPhiShift); + hnmutilities::storeGammasInVector(clustersInThisCollision, v0sInThisCollision, vGammas, emcEtaShift, emcPhiShift); hnmutilities::reconstructGGs(vGammas, vGGs); vGammas.clear(); processGGs(vGGs); - bool isProton = false; - bool isDeuteron = false; - bool isPion = false; - - // #femtoPart + // ------------------------------> Loop over all tracks <------------------------------- + // - Sort them into vectors based on PID ((anti)protons, (anti)deuterons, (anti)pions) + // - Fill QA histograms for all tracks and per particle species + // ------------------------------------------------------------------------------------- for (const auto& track : tracksWithItsPid) { - // General QA mHistManager.fill(HIST("TrackCuts/TracksBefore/fPtTrackBefore"), track.pt()); mHistManager.fill(HIST("TrackCuts/TracksBefore/fEtaTrackBefore"), track.eta()); mHistManager.fill(HIST("TrackCuts/TracksBefore/fPhiTrackBefore"), track.phi()); - // Fill PID info - if (track.sign() > 0) { - mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignal"), track.tpcInnerParam(), track.tpcSignal()); - mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalP"), track.p(), track.tpcSignal()); + if (track.sign() > 0) { // All particles (positive electric charge) + mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalTPCP"), track.tpcInnerParam(), track.tpcSignal()); + mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignal"), track.p(), track.tpcSignal()); mHistManager.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationPos"), track.p(), track.tpcInnerParam()); } - if (track.sign() < 0) { - - mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAnti"), track.tpcInnerParam(), track.tpcSignal()); - mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAntiP"), track.p(), track.tpcSignal()); + if (track.sign() < 0) { // All anti-particles (negative electric charge) + mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAntiTPCP"), track.tpcInnerParam(), track.tpcSignal()); + mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAnti"), track.p(), track.tpcSignal()); mHistManager.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationNeg"), track.p(), track.tpcInnerParam()); } - // #fill protons and deuterons - isProton = (isSelectedTrackPID(track, CFTrigger::kProton) && isSelectedTrack(track, CFTrigger::kProton)); - isDeuteron = (isSelectedTrackPID(track, CFTrigger::kDeuteron) && isSelectedTrack(track, CFTrigger::kDeuteron)); - isPion = (isSelectedTrackPID(track, CFTrigger::kPion) && isSelectedTrack(track, CFTrigger::kPion)); + // For each track, check if it fulfills track and PID criteria to be identified as a proton, deuteron or pion + bool isProton = (isSelectedTrackPID(track, hnmtrigger::kProton) && isSelectedTrack(track, hnmtrigger::kProton)); + bool isDeuteron = (isSelectedTrackPID(track, hnmtrigger::kDeuteron) && isSelectedTrack(track, hnmtrigger::kDeuteron)); + bool isPion = (isSelectedTrackPID(track, hnmtrigger::kPion) && isSelectedTrack(track, hnmtrigger::kPion)); - if (track.sign() > 0) { // part + if (track.sign() > 0) { // Positive charge -> Particles if (isProton) { proton.emplace_back(track.pt(), track.eta(), track.phi(), mMassProton); mHistManager.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationAfterCutsProton"), track.p(), track.tpcInnerParam()); - mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalProton"), track.tpcInnerParam(), track.tpcSignal()); - mHistManager.fill(HIST("TrackCuts/Proton/fPProton"), track.p()); - mHistManager.fill(HIST("TrackCuts/Proton/fPTPCProton"), track.tpcInnerParam()); - mHistManager.fill(HIST("TrackCuts/Proton/fPtProton"), track.pt()); - mHistManager.fill(HIST("TrackCuts/Proton/fMomCorProtonDif"), track.p(), track.tpcInnerParam() - track.p()); - mHistManager.fill(HIST("TrackCuts/Proton/fMomCorProtonRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); - mHistManager.fill(HIST("TrackCuts/Proton/fEtaProton"), track.eta()); - mHistManager.fill(HIST("TrackCuts/Proton/fPhiProton"), track.phi()); - mHistManager.fill(HIST("TrackCuts/Proton/fNsigmaTPCvsPProton"), track.tpcInnerParam(), track.tpcNSigmaPr()); - mHistManager.fill(HIST("TrackCuts/Proton/fNsigmaTOFvsPProton"), track.tpcInnerParam(), track.tofNSigmaPr()); + + mHistManager.fill(HIST("TrackCuts/Proton/fP"), track.p()); + mHistManager.fill(HIST("TrackCuts/Proton/fPt"), track.pt()); + mHistManager.fill(HIST("TrackCuts/Proton/fMomCorDif"), track.p(), track.tpcInnerParam() - track.p()); + mHistManager.fill(HIST("TrackCuts/Proton/fMomCorRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + mHistManager.fill(HIST("TrackCuts/Proton/fEta"), track.eta()); + mHistManager.fill(HIST("TrackCuts/Proton/fPhi"), track.phi()); + + mHistManager.fill(HIST("TrackCuts/Proton/fNsigmaTPCvsTPCP"), track.tpcInnerParam(), track.tpcNSigmaPr()); + mHistManager.fill(HIST("TrackCuts/Proton/fNsigmaTOFvsTPCP"), track.tpcInnerParam(), track.tofNSigmaPr()); auto nSigmaTrackTPCTOF = std::sqrt(std::pow(track.tpcNSigmaPr(), 2) + std::pow(track.tofNSigmaPr(), 2)); - mHistManager.fill(HIST("TrackCuts/Proton/fNsigmaTPCTOFvsPProton"), track.tpcInnerParam(), std::sqrt(std::pow(track.tpcNSigmaPr() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPr() - nSigmaTrackTPCTOF, 2))); - mHistManager.fill(HIST("TrackCuts/Proton/fNsigmaITSvsPProton"), track.p(), track.itsNSigmaPr()); - - mHistManager.fill(HIST("TrackCuts/Proton/fNsigmaTPCvsPProtonP"), track.p(), track.tpcNSigmaPr()); - mHistManager.fill(HIST("TrackCuts/Proton/fNsigmaTOFvsPProtonP"), track.p(), track.tofNSigmaPr()); - mHistManager.fill(HIST("TrackCuts/Proton/fNsigmaTPCTOFvsPProtonP"), track.p(), std::sqrt(std::pow(track.tpcNSigmaPr() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPr() - nSigmaTrackTPCTOF, 2))); - - mHistManager.fill(HIST("TrackCuts/Proton/fDCAxyProton"), track.dcaXY()); - mHistManager.fill(HIST("TrackCuts/Proton/fDCAzProton"), track.dcaZ()); - mHistManager.fill(HIST("TrackCuts/Proton/fTPCsClsProton"), track.tpcNClsShared()); - mHistManager.fill(HIST("TrackCuts/Proton/fTPCcRowsProton"), track.tpcNClsCrossedRows()); - mHistManager.fill(HIST("TrackCuts/Proton/fTrkTPCfClsProton"), track.tpcCrossedRowsOverFindableCls()); - mHistManager.fill(HIST("TrackCuts/Proton/fTPCnclsProton"), track.tpcNClsFound()); + mHistManager.fill(HIST("TrackCuts/Proton/fNsigmaTPCTOFvsTPCP"), track.tpcInnerParam(), std::sqrt(std::pow(track.tpcNSigmaPr() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPr() - nSigmaTrackTPCTOF, 2))); + mHistManager.fill(HIST("TrackCuts/Proton/fNsigmaITSvsP"), track.p(), track.itsNSigmaPr()); + mHistManager.fill(HIST("TrackCuts/Proton/fNsigmaTPCvsP"), track.p(), track.tpcNSigmaPr()); + mHistManager.fill(HIST("TrackCuts/Proton/fNsigmaTOFvsP"), track.p(), track.tofNSigmaPr()); + mHistManager.fill(HIST("TrackCuts/Proton/fNsigmaTPCTOFvsP"), track.p(), std::sqrt(std::pow(track.tpcNSigmaPr() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPr() - nSigmaTrackTPCTOF, 2))); + + mHistManager.fill(HIST("TrackCuts/Proton/fDCAxy"), track.dcaXY()); + mHistManager.fill(HIST("TrackCuts/Proton/fDCAz"), track.dcaZ()); + mHistManager.fill(HIST("TrackCuts/Proton/fTPCsCls"), track.tpcNClsShared()); + mHistManager.fill(HIST("TrackCuts/Proton/fTPCcRows"), track.tpcNClsCrossedRows()); + mHistManager.fill(HIST("TrackCuts/Proton/fTrkTPCfCls"), track.tpcCrossedRowsOverFindableCls()); + mHistManager.fill(HIST("TrackCuts/Proton/fTPCncls"), track.tpcNClsFound()); } if (isDeuteron) { deuteron.emplace_back(track.pt(), track.eta(), track.phi(), mMassDeuteron); mHistManager.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationAfterCutsDeuteron"), track.p(), track.tpcInnerParam()); - mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalDeuteron"), track.tpcInnerParam(), track.tpcSignal()); - mHistManager.fill(HIST("TrackCuts/Deuteron/fPtDeuteron"), track.pt()); - mHistManager.fill(HIST("TrackCuts/Deuteron/fMomCorDeuteronDif"), track.p(), track.tpcInnerParam() - track.p()); - mHistManager.fill(HIST("TrackCuts/Deuteron/fMomCorDeuteronRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); - mHistManager.fill(HIST("TrackCuts/Deuteron/fEtaDeuteron"), track.eta()); - mHistManager.fill(HIST("TrackCuts/Deuteron/fPhiDeuteron"), track.phi()); - mHistManager.fill(HIST("TrackCuts/Deuteron/fNsigmaTPCvsPDeuteron"), track.tpcInnerParam(), track.tpcNSigmaDe()); - mHistManager.fill(HIST("TrackCuts/Deuteron/fNsigmaTOFvsPDeuteron"), track.tpcInnerParam(), track.tofNSigmaDe()); + + mHistManager.fill(HIST("TrackCuts/Deuteron/fP"), track.p()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fPt"), track.pt()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fMomCorDif"), track.p(), track.tpcInnerParam() - track.p()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fMomCorRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fEta"), track.eta()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fPhi"), track.phi()); + + mHistManager.fill(HIST("TrackCuts/Deuteron/fNsigmaTPCvsTPCP"), track.tpcInnerParam(), track.tpcNSigmaDe()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fNsigmaTOFvsTPCP"), track.tpcInnerParam(), track.tofNSigmaDe()); auto nSigmaTrackTPCTOF = std::sqrt(std::pow(track.tpcNSigmaDe(), 2) + std::pow(track.tofNSigmaDe(), 2)); - mHistManager.fill(HIST("TrackCuts/Deuteron/fNsigmaTPCTOFvsPDeuteron"), track.tpcInnerParam(), std::sqrt(std::pow(track.tpcNSigmaDe() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaDe() - nSigmaTrackTPCTOF, 2))); - mHistManager.fill(HIST("TrackCuts/Deuteron/fNsigmaITSvsPDeuteron"), track.p(), track.itsNSigmaDe()); - - mHistManager.fill(HIST("TrackCuts/Deuteron/fNsigmaTPCvsPDeuteronP"), track.p(), track.tpcNSigmaDe()); - mHistManager.fill(HIST("TrackCuts/Deuteron/fNsigmaTOFvsPDeuteronP"), track.p(), track.tofNSigmaDe()); - mHistManager.fill(HIST("TrackCuts/Deuteron/fNsigmaTPCTOFvsPDeuteronP"), track.p(), std::sqrt(std::pow(track.tpcNSigmaDe() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaDe() - nSigmaTrackTPCTOF, 2))); - - mHistManager.fill(HIST("TrackCuts/Deuteron/fDCAxyDeuteron"), track.dcaXY()); - mHistManager.fill(HIST("TrackCuts/Deuteron/fDCAzDeuteron"), track.dcaZ()); - mHistManager.fill(HIST("TrackCuts/Deuteron/fTPCsClsDeuteron"), track.tpcNClsShared()); - mHistManager.fill(HIST("TrackCuts/Deuteron/fTPCcRowsDeuteron"), track.tpcNClsCrossedRows()); - mHistManager.fill(HIST("TrackCuts/Deuteron/fTrkTPCfClsDeuteron"), track.tpcCrossedRowsOverFindableCls()); - mHistManager.fill(HIST("TrackCuts/Deuteron/fTPCnclsDeuteron"), track.tpcNClsFound()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fNsigmaTPCTOFvsTPCP"), track.tpcInnerParam(), std::sqrt(std::pow(track.tpcNSigmaDe() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaDe() - nSigmaTrackTPCTOF, 2))); + mHistManager.fill(HIST("TrackCuts/Deuteron/fNsigmaITSvsP"), track.p(), track.itsNSigmaDe()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fNsigmaTPCvsP"), track.p(), track.tpcNSigmaDe()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fNsigmaTOFvsP"), track.p(), track.tofNSigmaDe()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fNsigmaTPCTOFvsP"), track.p(), std::sqrt(std::pow(track.tpcNSigmaDe() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaDe() - nSigmaTrackTPCTOF, 2))); + + mHistManager.fill(HIST("TrackCuts/Deuteron/fDCAxy"), track.dcaXY()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fDCAz"), track.dcaZ()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fTPCsCls"), track.tpcNClsShared()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fTPCcRows"), track.tpcNClsCrossedRows()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fTrkTPCfCls"), track.tpcCrossedRowsOverFindableCls()); + mHistManager.fill(HIST("TrackCuts/Deuteron/fTPCncls"), track.tpcNClsFound()); } if (isPion) { pion.emplace_back(track.pt(), track.eta(), track.phi(), mMassPionCharged); mHistManager.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationAfterCutsPion"), track.p(), track.tpcInnerParam()); - mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalPion"), track.tpcInnerParam(), track.tpcSignal()); - mHistManager.fill(HIST("TrackCuts/Pion/fPPion"), track.p()); - mHistManager.fill(HIST("TrackCuts/Pion/fPTPCPion"), track.tpcInnerParam()); - mHistManager.fill(HIST("TrackCuts/Pion/fPtPion"), track.pt()); - mHistManager.fill(HIST("TrackCuts/Pion/fMomCorPionDif"), track.p(), track.tpcInnerParam() - track.p()); - mHistManager.fill(HIST("TrackCuts/Pion/fMomCorPionRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); - mHistManager.fill(HIST("TrackCuts/Pion/fEtaPion"), track.eta()); - mHistManager.fill(HIST("TrackCuts/Pion/fPhiPion"), track.phi()); - mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTPCvsPPion"), track.tpcInnerParam(), track.tpcNSigmaPi()); - mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTOFvsPPion"), track.tpcInnerParam(), track.tofNSigmaPi()); + + mHistManager.fill(HIST("TrackCuts/Pion/fP"), track.p()); + mHistManager.fill(HIST("TrackCuts/Pion/fPt"), track.pt()); + mHistManager.fill(HIST("TrackCuts/Pion/fMomCorDif"), track.p(), track.tpcInnerParam() - track.p()); + mHistManager.fill(HIST("TrackCuts/Pion/fMomCorRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + mHistManager.fill(HIST("TrackCuts/Pion/fEta"), track.eta()); + mHistManager.fill(HIST("TrackCuts/Pion/fPhi"), track.phi()); + + mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTPCvsTPCP"), track.tpcInnerParam(), track.tpcNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTOFvsTPCP"), track.tpcInnerParam(), track.tofNSigmaPi()); auto nSigmaTrackTPCTOF = std::sqrt(std::pow(track.tpcNSigmaPi(), 2) + std::pow(track.tofNSigmaPi(), 2)); - mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTPCTOFvsPPion"), track.tpcInnerParam(), std::sqrt(std::pow(track.tpcNSigmaPi() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPi() - nSigmaTrackTPCTOF, 2))); - - mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTPCvsPPionP"), track.p(), track.tpcNSigmaPi()); - mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTOFvsPPionP"), track.p(), track.tofNSigmaPi()); - mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTPCTOFvsPPionP"), track.p(), std::sqrt(std::pow(track.tpcNSigmaPi() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPi() - nSigmaTrackTPCTOF, 2))); - - mHistManager.fill(HIST("TrackCuts/Pion/fDCAxyPion"), track.dcaXY()); - mHistManager.fill(HIST("TrackCuts/Pion/fDCAzPion"), track.dcaZ()); - mHistManager.fill(HIST("TrackCuts/Pion/fTPCsClsPion"), track.tpcNClsShared()); - mHistManager.fill(HIST("TrackCuts/Pion/fTPCcRowsPion"), track.tpcNClsCrossedRows()); - mHistManager.fill(HIST("TrackCuts/Pion/fTrkTPCfClsPion"), track.tpcCrossedRowsOverFindableCls()); - mHistManager.fill(HIST("TrackCuts/Pion/fTPCnclsPion"), track.tpcNClsFound()); + mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTPCTOFvsTPCP"), track.tpcInnerParam(), std::sqrt(std::pow(track.tpcNSigmaPi() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPi() - nSigmaTrackTPCTOF, 2))); + mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaITSvsP"), track.p(), track.itsNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTPCvsP"), track.p(), track.tpcNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTOFvsP"), track.p(), track.tofNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTPCTOFvsP"), track.p(), std::sqrt(std::pow(track.tpcNSigmaPi() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPi() - nSigmaTrackTPCTOF, 2))); + + mHistManager.fill(HIST("TrackCuts/Pion/fDCAxy"), track.dcaXY()); + mHistManager.fill(HIST("TrackCuts/Pion/fDCAz"), track.dcaZ()); + mHistManager.fill(HIST("TrackCuts/Pion/fTPCsCls"), track.tpcNClsShared()); + mHistManager.fill(HIST("TrackCuts/Pion/fTPCcRows"), track.tpcNClsCrossedRows()); + mHistManager.fill(HIST("TrackCuts/Pion/fTrkTPCfCls"), track.tpcCrossedRowsOverFindableCls()); + mHistManager.fill(HIST("TrackCuts/Pion/fTPCncls"), track.tpcNClsFound()); } - - } else { // antipart + } else { // Negative charge -> Anti-particles if (isProton) { antiproton.emplace_back(track.pt(), track.eta(), track.phi(), mMassProton); mHistManager.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationAfterCutsAntiProton"), track.p(), track.tpcInnerParam()); - mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAntiProton"), track.tpcInnerParam(), track.tpcSignal()); - mHistManager.fill(HIST("TrackCuts/AntiProton/fPtAntiProton"), track.pt()); - mHistManager.fill(HIST("TrackCuts/AntiProton/fMomCorAntiProtonDif"), track.p(), track.tpcInnerParam() - track.p()); - mHistManager.fill(HIST("TrackCuts/AntiProton/fMomCorAntiProtonRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); - mHistManager.fill(HIST("TrackCuts/AntiProton/fEtaAntiProton"), track.eta()); - mHistManager.fill(HIST("TrackCuts/AntiProton/fPhiAntiProton"), track.phi()); - mHistManager.fill(HIST("TrackCuts/AntiProton/fNsigmaTPCvsPAntiProton"), track.tpcInnerParam(), track.tpcNSigmaPr()); - mHistManager.fill(HIST("TrackCuts/AntiProton/fNsigmaTOFvsPAntiProton"), track.tpcInnerParam(), track.tofNSigmaPr()); + + mHistManager.fill(HIST("TrackCuts/AntiProton/fP"), track.p()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fPt"), track.pt()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fMomCorDif"), track.p(), track.tpcInnerParam() - track.p()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fMomCorRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fEta"), track.eta()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fPhi"), track.phi()); + + mHistManager.fill(HIST("TrackCuts/AntiProton/fNsigmaTPCvsTPCP"), track.tpcInnerParam(), track.tpcNSigmaPr()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fNsigmaTOFvsTPCP"), track.tpcInnerParam(), track.tofNSigmaPr()); auto nSigmaTrackTPCTOF = std::sqrt(std::pow(track.tpcNSigmaPr(), 2) + std::pow(track.tofNSigmaPr(), 2)); - mHistManager.fill(HIST("TrackCuts/AntiProton/fNsigmaTPCTOFvsPAntiProton"), track.tpcInnerParam(), std::sqrt(std::pow(track.tpcNSigmaPr() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPr() - nSigmaTrackTPCTOF, 2))); - mHistManager.fill(HIST("TrackCuts/AntiProton/fNsigmaITSvsPAntiProton"), track.p(), track.itsNSigmaPr()); - - mHistManager.fill(HIST("TrackCuts/AntiProton/fNsigmaTPCvsPAntiProtonP"), track.p(), track.tpcNSigmaPr()); - mHistManager.fill(HIST("TrackCuts/AntiProton/fNsigmaTOFvsPAntiProtonP"), track.p(), track.tofNSigmaPr()); - mHistManager.fill(HIST("TrackCuts/AntiProton/fNsigmaTPCTOFvsPAntiProtonP"), track.p(), std::sqrt(std::pow(track.tpcNSigmaPr() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPr() - nSigmaTrackTPCTOF, 2))); - - mHistManager.fill(HIST("TrackCuts/AntiProton/fDCAxyAntiProton"), track.dcaXY()); - mHistManager.fill(HIST("TrackCuts/AntiProton/fDCAzAntiProton"), track.dcaZ()); - mHistManager.fill(HIST("TrackCuts/AntiProton/fTPCsClsAntiProton"), track.tpcNClsShared()); - mHistManager.fill(HIST("TrackCuts/AntiProton/fTPCcRowsAntiProton"), track.tpcNClsCrossedRows()); - mHistManager.fill(HIST("TrackCuts/AntiProton/fTrkTPCfClsAntiProton"), track.tpcCrossedRowsOverFindableCls()); - mHistManager.fill(HIST("TrackCuts/AntiProton/fTPCnclsAntiProton"), track.tpcNClsFound()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fNsigmaTPCTOFvsTPCP"), track.tpcInnerParam(), std::sqrt(std::pow(track.tpcNSigmaPr() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPr() - nSigmaTrackTPCTOF, 2))); + mHistManager.fill(HIST("TrackCuts/AntiProton/fNsigmaITSvsP"), track.p(), track.itsNSigmaPr()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fNsigmaTPCvsP"), track.p(), track.tpcNSigmaPr()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fNsigmaTOFvsP"), track.p(), track.tofNSigmaPr()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fNsigmaTPCTOFvsP"), track.p(), std::sqrt(std::pow(track.tpcNSigmaPr() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPr() - nSigmaTrackTPCTOF, 2))); + + mHistManager.fill(HIST("TrackCuts/AntiProton/fDCAxy"), track.dcaXY()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fDCAz"), track.dcaZ()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fTPCsCls"), track.tpcNClsShared()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fTPCcRows"), track.tpcNClsCrossedRows()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fTrkTPCfCls"), track.tpcCrossedRowsOverFindableCls()); + mHistManager.fill(HIST("TrackCuts/AntiProton/fTPCncls"), track.tpcNClsFound()); } if (isDeuteron) { antideuteron.emplace_back(track.pt(), track.eta(), track.phi(), mMassDeuteron); mHistManager.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationAfterCutsAntiDeuteron"), track.p(), track.tpcInnerParam()); - mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAntiDeuteron"), track.tpcInnerParam(), track.tpcSignal()); - mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fPtAntiDeuteron"), track.pt()); - mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fMomCorAntiDeuteronDif"), track.p(), track.tpcInnerParam() - track.p()); - mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fMomCorAntiDeuteronRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); - mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fEtaAntiDeuteron"), track.eta()); - mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fPhiAntiDeuteron"), track.phi()); - mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaTPCvsPAntiDeuteron"), track.tpcInnerParam(), track.tpcNSigmaDe()); - mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaTOFvsPAntiDeuteron"), track.tpcInnerParam(), track.tofNSigmaDe()); + + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fP"), track.p()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fPt"), track.pt()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fMomCorDif"), track.p(), track.tpcInnerParam() - track.p()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fMomCorRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fEta"), track.eta()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fPhi"), track.phi()); + + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaTPCvsTPCP"), track.tpcInnerParam(), track.tpcNSigmaDe()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaTOFvsTPCP"), track.tpcInnerParam(), track.tofNSigmaDe()); auto nSigmaTrackTPCTOF = std::sqrt(std::pow(track.tpcNSigmaDe(), 2) + std::pow(track.tofNSigmaDe(), 2)); - mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaTPCTOFvsPAntiDeuteron"), track.tpcInnerParam(), std::sqrt(std::pow(track.tpcNSigmaDe() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaDe() - nSigmaTrackTPCTOF, 2))); - mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaITSvsPAntiDeuteron"), track.p(), track.itsNSigmaDe()); - - mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaTPCvsPAntiDeuteronP"), track.p(), track.tpcNSigmaDe()); - mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaTOFvsPAntiDeuteronP"), track.p(), track.tofNSigmaDe()); - mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaTPCTOFvsPAntiDeuteronP"), track.p(), std::sqrt(std::pow(track.tpcNSigmaDe() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaDe() - nSigmaTrackTPCTOF, 2))); - - mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fDCAxyAntiDeuteron"), track.dcaXY()); - mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fDCAzAntiDeuteron"), track.dcaZ()); - mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fTPCsClsAntiDeuteron"), track.tpcNClsShared()); - mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fTPCcRowsAntiDeuteron"), track.tpcNClsCrossedRows()); - mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fTrkTPCfClsAntiDeuteron"), track.tpcCrossedRowsOverFindableCls()); - mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fTPCnclsAntiDeuteron"), track.tpcNClsFound()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaTPCTOFvsTPCP"), track.tpcInnerParam(), std::sqrt(std::pow(track.tpcNSigmaDe() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaDe() - nSigmaTrackTPCTOF, 2))); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaITSvsP"), track.p(), track.itsNSigmaDe()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaTPCvsP"), track.p(), track.tpcNSigmaDe()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaTOFvsP"), track.p(), track.tofNSigmaDe()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaTPCTOFvsP"), track.p(), std::sqrt(std::pow(track.tpcNSigmaDe() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaDe() - nSigmaTrackTPCTOF, 2))); + + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fDCAxy"), track.dcaXY()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fDCAz"), track.dcaZ()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fTPCsCls"), track.tpcNClsShared()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fTPCcRows"), track.tpcNClsCrossedRows()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fTrkTPCfCls"), track.tpcCrossedRowsOverFindableCls()); + mHistManager.fill(HIST("TrackCuts/AntiDeuteron/fTPCncls"), track.tpcNClsFound()); } if (isPion) { antipion.emplace_back(track.pt(), track.eta(), track.phi(), mMassPionCharged); mHistManager.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationAfterCutsAntiPion"), track.p(), track.tpcInnerParam()); - mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAntiPion"), track.tpcInnerParam(), track.tpcSignal()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fPtAntiPion"), track.pt()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fMomCorAntiPionDif"), track.p(), track.tpcInnerParam() - track.p()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fMomCorAntiPionRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fEtaAntiPion"), track.eta()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fPhiAntiPion"), track.phi()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCvsPAntiPion"), track.tpcInnerParam(), track.tpcNSigmaPi()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTOFvsPAntiPion"), track.tpcInnerParam(), track.tofNSigmaPi()); + + mHistManager.fill(HIST("TrackCuts/AntiPion/fP"), track.p()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fPt"), track.pt()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fMomCorDif"), track.p(), track.tpcInnerParam() - track.p()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fMomCorRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fEta"), track.eta()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fPhi"), track.phi()); + + mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCvsTPCP"), track.tpcInnerParam(), track.tpcNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTOFvsTPCP"), track.tpcInnerParam(), track.tofNSigmaPi()); auto nSigmaTrackTPCTOF = std::sqrt(std::pow(track.tpcNSigmaPi(), 2) + std::pow(track.tofNSigmaPi(), 2)); - mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCTOFvsPAntiPion"), track.tpcInnerParam(), std::sqrt(std::pow(track.tpcNSigmaPi() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPi() - nSigmaTrackTPCTOF, 2))); - - mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCvsPAntiPionP"), track.p(), track.tpcNSigmaPi()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTOFvsPAntiPionP"), track.p(), track.tofNSigmaPi()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCTOFvsPAntiPionP"), track.p(), std::sqrt(std::pow(track.tpcNSigmaPi() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPi() - nSigmaTrackTPCTOF, 2))); - - mHistManager.fill(HIST("TrackCuts/AntiPion/fDCAxyAntiPion"), track.dcaXY()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fDCAzAntiPion"), track.dcaZ()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fTPCsClsAntiPion"), track.tpcNClsShared()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fTPCcRowsAntiPion"), track.tpcNClsCrossedRows()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fTrkTPCfClsAntiPion"), track.tpcCrossedRowsOverFindableCls()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fTPCnclsAntiPion"), track.tpcNClsFound()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCTOFvsTPCP"), track.tpcInnerParam(), std::sqrt(std::pow(track.tpcNSigmaPi() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPi() - nSigmaTrackTPCTOF, 2))); + mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaITSvsP"), track.p(), track.itsNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCvsP"), track.p(), track.tpcNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTOFvsP"), track.p(), track.tofNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCTOFvsP"), track.p(), std::sqrt(std::pow(track.tpcNSigmaPi() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPi() - nSigmaTrackTPCTOF, 2))); + + mHistManager.fill(HIST("TrackCuts/AntiPion/fDCAxy"), track.dcaXY()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fDCAz"), track.dcaZ()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fTPCsCls"), track.tpcNClsShared()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fTPCcRows"), track.tpcNClsCrossedRows()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fTrkTPCfCls"), track.tpcCrossedRowsOverFindableCls()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fTPCncls"), track.tpcNClsFound()); } } } - // reconstruct HMN candidates + // -------------------------> Reconstruct HNM candidates <------------------------------ + // - Based on the previously filled (anti)pion vectors + // - Fill QA histograms for kinematics of the pions and their combinations + // ------------------------------------------------------------------------------------- for (const auto& posPion : pion) { for (const auto& negPion : antipion) { - hnmutilities::reconstructHeavyNeutralMesons(posPion, negPion, vGGs, vHNMs); - - ROOT::Math::PtEtaPhiMVector temp = posPion + negPion; - - mHistManager.fill(HIST("TrackCuts/HMN/Before/fInvMass_tracks"), temp.M()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/fPt_tracks"), temp.pt()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/fEta_tracks"), temp.eta()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/fPhi_tracks"), translatePhi(temp.phi())); - - mHistManager.fill(HIST("TrackCuts/HMN/Before/PosDaughter/fInvMass"), posPion.M()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/PosDaughter/fPt"), posPion.pt()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/PosDaughter/fEta"), posPion.eta()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/PosDaughter/fPhi"), translatePhi(posPion.phi())); - - mHistManager.fill(HIST("TrackCuts/HMN/Before/NegDaughter/fInvMass"), negPion.M()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/NegDaughter/fPt"), negPion.pt()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/NegDaughter/fEta"), negPion.eta()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/NegDaughter/fPhi"), translatePhi(negPion.phi())); + ROOT::Math::PtEtaPhiMVector vecPiPlPiMi = posPion + negPion; + hnmutilities::reconstructHeavyNeutralMesons(vecPiPlPiMi, vGGs, vHNMs); + + mHistManager.fill(HIST("HNM/Before/PiPlPiMi/fInvMassVsPt"), vecPiPlPiMi.M(), vecPiPlPiMi.pt()); + mHistManager.fill(HIST("HNM/Before/PiPlPiMi/fEta"), vecPiPlPiMi.eta()); + mHistManager.fill(HIST("HNM/Before/PiPlPiMi/fPhi"), RecoDecay::constrainAngle(vecPiPlPiMi.phi())); + + mHistManager.fill(HIST("HNM/Before/PosDaughter/fInvMass"), posPion.M()); + mHistManager.fill(HIST("HNM/Before/PosDaughter/fPt"), posPion.pt()); + mHistManager.fill(HIST("HNM/Before/PosDaughter/fEta"), posPion.eta()); + mHistManager.fill(HIST("HNM/Before/PosDaughter/fPhi"), RecoDecay::constrainAngle(posPion.phi())); + + mHistManager.fill(HIST("HNM/Before/NegDaughter/fInvMass"), negPion.M()); + mHistManager.fill(HIST("HNM/Before/NegDaughter/fPt"), negPion.pt()); + mHistManager.fill(HIST("HNM/Before/NegDaughter/fEta"), negPion.eta()); + mHistManager.fill(HIST("HNM/Before/NegDaughter/fPhi"), RecoDecay::constrainAngle(negPion.phi())); } } - processHNMs(vHNMs); // Contains QA of HMN properties - - // build triplets - float Q3 = 999.f, kstar = 999.f; - // omega - if (ConfTriggerSwitches->get("Switch", "PPOmega") > 0.) { - // ppomega trigger - + // ---------------------------> Process HNM candidates <-------------------------------- + // - Fill invMassVsPt histograms separated into HNM types (based on GG mass) and gamma reco method + // - Set colContains* flags for each HNM type to be used in the high-pt spectrum trigger + // - Fill femto HNM vectors (omegaPCM, etaPrimePCM, omegaEMC, etaPrimeEMC) + // ------------------------------------------------------------------------------------- + processHNMs(vHNMs); + + // ------------------------------> Build triplets <------------------------------------- + // - Calculate Q3 for each triplet (p-p-omega, p-p-eta', anti-p-anti-p-omega, anti-p-anti-p-eta') + // - Fill QA histograms for Q3 and pT of the triplet and its daughters + // - Increment lowMomentumMultiplets for each triplet with Q3 < kinematic limit (used in femto trigger) + // ------------------------------------------------------------------------------------- + if (cfgTriggerSwitches->get("Switch", "PPOmega") > 0.) { // -----> p-p-omega femtoscopy for (size_t i = 0; i < proton.size(); ++i) { for (size_t j = i + 1; j < proton.size(); ++j) { - const auto& Proton1 = proton[i]; - const auto& Proton2 = proton[j]; - // PCM - for (const auto& omegaParticles : omegaPCM) { + const auto& proton1 = proton[i]; + const auto& proton2 = proton[j]; + for (const auto& omegaParticles : omegaPCM) { // ---> PCM - Q3 = getQ3(Proton1, Proton2, omegaParticles); + float q3 = getQ3(proton1, proton2, omegaParticles); - mHistManager.fill(HIST("ppomega/fSE_particle_PCM"), Q3); - mHistManager.fill(HIST("ppomega/fProtonPtVsQ3_PCM"), Q3, Proton1.Pt()); - mHistManager.fill(HIST("ppomega/fProtonPtVsQ3_PCM"), Q3, Proton2.Pt()); - mHistManager.fill(HIST("ppomega/fOmegaCandPtVsQ3_PCM"), Q3, omegaParticles.Pt()); + mHistManager.fill(HIST("ppomega/fSE_particle_PCM"), q3); + mHistManager.fill(HIST("ppomega/fProtonPtVsQ3_PCM"), q3, proton1.Pt()); + mHistManager.fill(HIST("ppomega/fProtonPtVsQ3_PCM"), q3, proton2.Pt()); + mHistManager.fill(HIST("ppomega/fomegaCandPtVsQ3_PCM"), q3, omegaParticles.Pt()); - if (Q3 < ConfKinematicLimits->get(static_cast(0), CFTrigger::kPPOmega)) { - lowMomentumMultiplets[CFTrigger::kPPOmega] += 1; - } + if (q3 < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kPPOmega)) + lowMomentumMultiplets[hnmtrigger::kPPOmega] += 1; } - // EMC - for (const auto& omegaParticles : omegaEMC) { + for (const auto& omegaParticles : omegaEMC) { // ---> EMC - Q3 = getQ3(Proton1, Proton2, omegaParticles); + float q3 = getQ3(proton1, proton2, omegaParticles); - mHistManager.fill(HIST("ppomega/fSE_particle_EMC"), Q3); - mHistManager.fill(HIST("ppomega/fProtonPtVsQ3_EMC"), Q3, Proton1.Pt()); - mHistManager.fill(HIST("ppomega/fProtonPtVsQ3_EMC"), Q3, Proton2.Pt()); - mHistManager.fill(HIST("ppomega/fOmegaCandPtVsQ3_EMC"), Q3, omegaParticles.Pt()); + mHistManager.fill(HIST("ppomega/fSE_particle_EMC"), q3); + mHistManager.fill(HIST("ppomega/fProtonPtVsQ3_EMC"), q3, proton1.Pt()); + mHistManager.fill(HIST("ppomega/fProtonPtVsQ3_EMC"), q3, proton2.Pt()); + mHistManager.fill(HIST("ppomega/fomegaCandPtVsQ3_EMC"), q3, omegaParticles.Pt()); - if (Q3 < ConfKinematicLimits->get(static_cast(0), CFTrigger::kPPOmega)) { - lowMomentumMultiplets[CFTrigger::kPPOmega] += 1; - } + if (q3 < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kPPOmega)) + lowMomentumMultiplets[hnmtrigger::kPPOmega] += 1; } } } - // apapomega trigger - // PCM - for (size_t i = 0; i < antiproton.size(); ++i) { + for (size_t i = 0; i < antiproton.size(); ++i) { // -----> antip-antip-omega femtoscopy for (size_t j = i + 1; j < antiproton.size(); ++j) { const auto& antiProton1 = antiproton[i]; const auto& antiProton2 = antiproton[j]; - // PCM - for (const auto& omegaParticles : omegaPCM) { + for (const auto& omegaParticles : omegaPCM) { // ---> PCM - Q3 = getQ3(antiProton1, antiProton2, omegaParticles); + float q3 = getQ3(antiProton1, antiProton2, omegaParticles); - mHistManager.fill(HIST("ppomega/fSE_Antiparticle_PCM"), Q3); - mHistManager.fill(HIST("ppomega/fAntiProtonPtVsQ3_PCM"), Q3, antiProton1.Pt()); - mHistManager.fill(HIST("ppomega/fAntiProtonPtVsQ3_PCM"), Q3, antiProton2.Pt()); - mHistManager.fill(HIST("ppomega/fOmegaCandPtVsQ3_PCM"), Q3, omegaParticles.Pt()); + mHistManager.fill(HIST("ppomega/fSE_Antiparticle_PCM"), q3); + mHistManager.fill(HIST("ppomega/fAntiProtonPtVsQ3_PCM"), q3, antiProton1.Pt()); + mHistManager.fill(HIST("ppomega/fAntiProtonPtVsQ3_PCM"), q3, antiProton2.Pt()); + mHistManager.fill(HIST("ppomega/fomegaCandPtVsQ3_PCM"), q3, omegaParticles.Pt()); - if (Q3 < ConfKinematicLimits->get(static_cast(0), CFTrigger::kPPOmega)) { - lowMomentumMultiplets[CFTrigger::kPPOmega] += 1; - } + if (q3 < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kPPOmega)) + lowMomentumMultiplets[hnmtrigger::kPPOmega] += 1; } - // EMC - for (const auto& omegaParticles : omegaEMC) { + for (const auto& omegaParticles : omegaEMC) { // ---> EMC - Q3 = getQ3(antiProton1, antiProton2, omegaParticles); + float q3 = getQ3(antiProton1, antiProton2, omegaParticles); - mHistManager.fill(HIST("ppomega/fSE_Antiparticle_EMC"), Q3); - mHistManager.fill(HIST("ppomega/fAntiProtonPtVsQ3_EMC"), Q3, antiProton1.Pt()); - mHistManager.fill(HIST("ppomega/fAntiProtonPtVsQ3_EMC"), Q3, antiProton2.Pt()); - mHistManager.fill(HIST("ppomega/fOmegaCandPtVsQ3_EMC"), Q3, omegaParticles.Pt()); + mHistManager.fill(HIST("ppomega/fSE_Antiparticle_EMC"), q3); + mHistManager.fill(HIST("ppomega/fAntiProtonPtVsQ3_EMC"), q3, antiProton1.Pt()); + mHistManager.fill(HIST("ppomega/fAntiProtonPtVsQ3_EMC"), q3, antiProton2.Pt()); + mHistManager.fill(HIST("ppomega/fomegaCandPtVsQ3_EMC"), q3, omegaParticles.Pt()); - if (Q3 < ConfKinematicLimits->get(static_cast(0), CFTrigger::kPPOmega)) { - lowMomentumMultiplets[CFTrigger::kPPOmega] += 1; - } + if (q3 < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kPPOmega)) + lowMomentumMultiplets[hnmtrigger::kPPOmega] += 1; } } } } - - // etaprime - if (ConfTriggerSwitches->get("Switch", "PPEtaPrime") > 0.) { - // ppetaprimetrigger + if (cfgTriggerSwitches->get("Switch", "PPEtaPrime") > 0.) { // -----> p-p-eta' femtoscopy for (size_t i = 0; i < proton.size(); ++i) { for (size_t j = i + 1; j < proton.size(); ++j) { - const auto& Proton1 = proton[i]; - const auto& Proton2 = proton[j]; - // PCM - for (const auto& etaParticles : etaPrimePCM) { + const auto& proton1 = proton[i]; + const auto& proton2 = proton[j]; + for (const auto& etaParticles : etaPrimePCM) { // ---> PCM - Q3 = getQ3(Proton1, Proton2, etaParticles); + float q3 = getQ3(proton1, proton2, etaParticles); - mHistManager.fill(HIST("ppetaprime/fSE_particle_PCM"), Q3); - mHistManager.fill(HIST("ppetaprime/fProtonPtVsQ3_PCM"), Q3, Proton1.Pt()); - mHistManager.fill(HIST("ppetaprime/fProtonPtVsQ3_PCM"), Q3, Proton2.Pt()); - mHistManager.fill(HIST("ppetaprime/fEtaPrimeCandPtVsQ3_PCM"), Q3, etaParticles.Pt()); + mHistManager.fill(HIST("ppetaprime/fSE_particle_PCM"), q3); + mHistManager.fill(HIST("ppetaprime/fProtonPtVsQ3_PCM"), q3, proton1.Pt()); + mHistManager.fill(HIST("ppetaprime/fProtonPtVsQ3_PCM"), q3, proton2.Pt()); + mHistManager.fill(HIST("ppetaprime/fetaprimeCandPtVsQ3_PCM"), q3, etaParticles.Pt()); - if (Q3 < ConfKinematicLimits->get(static_cast(0), CFTrigger::kPPEtaPrime)) { - lowMomentumMultiplets[CFTrigger::kPPEtaPrime] += 1; - } + if (q3 < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kPPEtaPrime)) + lowMomentumMultiplets[hnmtrigger::kPPEtaPrime] += 1; } - // EMC - for (const auto& etaParticles : etaPrimeEMC) { + for (const auto& etaParticles : etaPrimeEMC) { // ---> EMC - Q3 = getQ3(Proton1, Proton2, etaParticles); + float q3 = getQ3(proton1, proton2, etaParticles); - mHistManager.fill(HIST("ppetaprime/fSE_particle_EMC"), Q3); - mHistManager.fill(HIST("ppetaprime/fProtonPtVsQ3_EMC"), Q3, Proton1.Pt()); - mHistManager.fill(HIST("ppetaprime/fProtonPtVsQ3_EMC"), Q3, Proton2.Pt()); - mHistManager.fill(HIST("ppetaprime/fEtaPrimeCandPtVsQ3_EMC"), Q3, etaParticles.Pt()); + mHistManager.fill(HIST("ppetaprime/fSE_particle_EMC"), q3); + mHistManager.fill(HIST("ppetaprime/fProtonPtVsQ3_EMC"), q3, proton1.Pt()); + mHistManager.fill(HIST("ppetaprime/fProtonPtVsQ3_EMC"), q3, proton2.Pt()); + mHistManager.fill(HIST("ppetaprime/fetaprimeCandPtVsQ3_EMC"), q3, etaParticles.Pt()); - if (Q3 < ConfKinematicLimits->get(static_cast(0), CFTrigger::kPPEtaPrime)) { - lowMomentumMultiplets[CFTrigger::kPPEtaPrime] += 1; - } + if (q3 < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kPPEtaPrime)) + lowMomentumMultiplets[hnmtrigger::kPPEtaPrime] += 1; } } } - // apapetaprime trigger - for (size_t i = 0; i < antiproton.size(); ++i) { + for (size_t i = 0; i < antiproton.size(); ++i) { // -----> antip-antip-eta' femtoscopy for (size_t j = i + 1; j < antiproton.size(); ++j) { const auto& antiProton1 = antiproton[i]; const auto& antiProton2 = antiproton[j]; - // PCM - for (const auto& etaParticles : etaPrimePCM) { + for (const auto& etaParticles : etaPrimePCM) { // ---> PCM - Q3 = getQ3(antiProton1, antiProton2, etaParticles); + float q3 = getQ3(antiProton1, antiProton2, etaParticles); - mHistManager.fill(HIST("ppetaprime/fSE_Antiparticle_PCM"), Q3); - mHistManager.fill(HIST("ppetaprime/fAntiProtonPtVsQ3_PCM"), Q3, antiProton1.Pt()); - mHistManager.fill(HIST("ppetaprime/fAntiProtonPtVsQ3_PCM"), Q3, antiProton2.Pt()); - mHistManager.fill(HIST("ppetaprime/fEtaPrimeCandPtVsQ3_PCM"), Q3, etaParticles.Pt()); + mHistManager.fill(HIST("ppetaprime/fSE_Antiparticle_PCM"), q3); + mHistManager.fill(HIST("ppetaprime/fAntiProtonPtVsQ3_PCM"), q3, antiProton1.Pt()); + mHistManager.fill(HIST("ppetaprime/fAntiProtonPtVsQ3_PCM"), q3, antiProton2.Pt()); + mHistManager.fill(HIST("ppetaprime/fetaprimeCandPtVsQ3_PCM"), q3, etaParticles.Pt()); - if (Q3 < ConfKinematicLimits->get(static_cast(0), CFTrigger::kPPEtaPrime)) { - lowMomentumMultiplets[CFTrigger::kPPEtaPrime] += 1; - } + if (q3 < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kPPEtaPrime)) + lowMomentumMultiplets[hnmtrigger::kPPEtaPrime] += 1; } - // EMC - for (const auto& etaParticles : etaPrimeEMC) { + for (const auto& etaParticles : etaPrimeEMC) { // ---> EMC - Q3 = getQ3(antiProton1, antiProton2, etaParticles); + float q3 = getQ3(antiProton1, antiProton2, etaParticles); - mHistManager.fill(HIST("ppetaprime/fSE_Antiparticle_EMC"), Q3); - mHistManager.fill(HIST("ppetaprime/fAntiProtonPtVsQ3_EMC"), Q3, antiProton1.Pt()); - mHistManager.fill(HIST("ppetaprime/fAntiProtonPtVsQ3_EMC"), Q3, antiProton2.Pt()); - mHistManager.fill(HIST("ppetaprime/fEtaPrimeCandPtVsQ3_EMC"), Q3, etaParticles.Pt()); + mHistManager.fill(HIST("ppetaprime/fSE_Antiparticle_EMC"), q3); + mHistManager.fill(HIST("ppetaprime/fAntiProtonPtVsQ3_EMC"), q3, antiProton1.Pt()); + mHistManager.fill(HIST("ppetaprime/fAntiProtonPtVsQ3_EMC"), q3, antiProton2.Pt()); + mHistManager.fill(HIST("ppetaprime/fetaprimeCandPtVsQ3_EMC"), q3, etaParticles.Pt()); - if (Q3 < ConfKinematicLimits->get(static_cast(0), CFTrigger::kPPEtaPrime)) { - lowMomentumMultiplets[CFTrigger::kPPEtaPrime] += 1; - } + if (q3 < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kPPEtaPrime)) + lowMomentumMultiplets[hnmtrigger::kPPEtaPrime] += 1; } } } } - // build pairs - if (ConfTriggerSwitches->get("Switch", "Omegad") > 0.) { - // PCM - // omegad trigger - for (auto iomega = omegaPCM.begin(); iomega != omegaPCM.end(); ++iomega) { - for (auto iDeuteron = deuteron.begin(); iDeuteron != deuteron.end(); ++iDeuteron) { - kstar = getkstar(*iomega, *iDeuteron); + // --------------------------------> Build Pairs <-------------------------------------- + // - Calculate k* for each pair ((anti)d-omega, (anti)d-eta', (anti)p-omega, (anti)p-eta') + // - Fill QA histograms for k* and pT of the pairs + // - Increment lowMomentumMultiplets for each triplet with k* < kinematic limit (used in femto trigger) + // ------------------------------------------------------------------------------------- + if (cfgTriggerSwitches->get("Switch", "Omegad") > 0.) { + for (auto iomega = omegaPCM.begin(); iomega != omegaPCM.end(); ++iomega) { // -----> PCM + for (auto iDeuteron = deuteron.begin(); iDeuteron != deuteron.end(); ++iDeuteron) { // ---> d-omega femtoscopy + + float kstar = getkstar(*iomega, *iDeuteron); + mHistManager.fill(HIST("omegad/fSE_particle_PCM"), kstar); mHistManager.fill(HIST("omegad/fomegaPtVskstar_PCM"), kstar, (*iomega).Pt()); - mHistManager.fill(HIST("omegad/fDeuteronPtVskstar_PCM"), kstar, (*iDeuteron).Pt()); - if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kOmegaD)) { - lowMomentumMultiplets[CFTrigger::kOmegaD] += 1; - } + mHistManager.fill(HIST("omegad/fdPtVskstar_PCM"), kstar, (*iDeuteron).Pt()); + + if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kOmegaD)) + lowMomentumMultiplets[hnmtrigger::kOmegaD] += 1; } - // omegaAd trigger - for (auto iAntiDeuteron = antideuteron.begin(); iAntiDeuteron != antideuteron.end(); ++iAntiDeuteron) { - kstar = getkstar(*iomega, *iAntiDeuteron); + for (auto iAntiDeuteron = antideuteron.begin(); iAntiDeuteron != antideuteron.end(); ++iAntiDeuteron) { // ---> antid-omega femtoscopy + + float kstar = getkstar(*iomega, *iAntiDeuteron); + mHistManager.fill(HIST("omegad/fSE_Antiparticle_PCM"), kstar); mHistManager.fill(HIST("omegad/fomegaPtVskstar_PCM"), kstar, (*iomega).Pt()); - mHistManager.fill(HIST("omegad/fAntiDeuteronPtVskstar_PCM"), kstar, (*iAntiDeuteron).Pt()); - if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kOmegaD)) { - lowMomentumMultiplets[CFTrigger::kOmegaD] += 1; - } + mHistManager.fill(HIST("omegad/fAntidPtVskstar_PCM"), kstar, (*iAntiDeuteron).Pt()); + + if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kOmegaD)) + lowMomentumMultiplets[hnmtrigger::kOmegaD] += 1; } } - // EMC - // omegad trigger - for (auto iomega = omegaEMC.begin(); iomega != omegaEMC.end(); ++iomega) { - for (auto iDeuteron = deuteron.begin(); iDeuteron != deuteron.end(); ++iDeuteron) { - kstar = getkstar(*iomega, *iDeuteron); + for (auto iomega = omegaEMC.begin(); iomega != omegaEMC.end(); ++iomega) { // -----> EMC + for (auto iDeuteron = deuteron.begin(); iDeuteron != deuteron.end(); ++iDeuteron) { // ---> d-omega femtoscopy + + float kstar = getkstar(*iomega, *iDeuteron); + mHistManager.fill(HIST("omegad/fSE_particle_EMC"), kstar); mHistManager.fill(HIST("omegad/fomegaPtVskstar_EMC"), kstar, (*iomega).Pt()); - mHistManager.fill(HIST("omegad/fDeuteronPtVskstar_EMC"), kstar, (*iDeuteron).Pt()); - if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kOmegaD)) { - lowMomentumMultiplets[CFTrigger::kOmegaD] += 1; - } + mHistManager.fill(HIST("omegad/fdPtVskstar_EMC"), kstar, (*iDeuteron).Pt()); + + if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kOmegaD)) + lowMomentumMultiplets[hnmtrigger::kOmegaD] += 1; } - // omegaAd trigger - for (auto iAntiDeuteron = antideuteron.begin(); iAntiDeuteron != antideuteron.end(); ++iAntiDeuteron) { - kstar = getkstar(*iomega, *iAntiDeuteron); + for (auto iAntiDeuteron = antideuteron.begin(); iAntiDeuteron != antideuteron.end(); ++iAntiDeuteron) { // ---> antid-omega femtoscopy + + float kstar = getkstar(*iomega, *iAntiDeuteron); + mHistManager.fill(HIST("omegad/fSE_Antiparticle_EMC"), kstar); mHistManager.fill(HIST("omegad/fomegaPtVskstar_EMC"), kstar, (*iomega).Pt()); - mHistManager.fill(HIST("omegad/fAntiDeuteronPtVskstar_EMC"), kstar, (*iAntiDeuteron).Pt()); - if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kOmegaD)) { - lowMomentumMultiplets[CFTrigger::kOmegaD] += 1; - } + mHistManager.fill(HIST("omegad/fAntidPtVskstar_EMC"), kstar, (*iAntiDeuteron).Pt()); + + if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kOmegaD)) + lowMomentumMultiplets[hnmtrigger::kOmegaD] += 1; } } } - if (ConfTriggerSwitches->get("Switch", "EtaPrimed") > 0.) { - // PCM - // etaPrimed trigger - for (auto ietaprime = etaPrimePCM.begin(); ietaprime != etaPrimePCM.end(); ++ietaprime) { - for (auto iDeuteron = deuteron.begin(); iDeuteron != deuteron.end(); ++iDeuteron) { - kstar = getkstar(*ietaprime, *iDeuteron); + if (cfgTriggerSwitches->get("Switch", "EtaPrimed") > 0.) { + for (auto ietaprime = etaPrimePCM.begin(); ietaprime != etaPrimePCM.end(); ++ietaprime) { // -----> PCM + for (auto iDeuteron = deuteron.begin(); iDeuteron != deuteron.end(); ++iDeuteron) { // ---> d-eta' femtoscopy + + float kstar = getkstar(*ietaprime, *iDeuteron); + mHistManager.fill(HIST("etaprimed/fSE_particle_PCM"), kstar); mHistManager.fill(HIST("etaprimed/fetaprimePtVskstar_PCM"), kstar, (*ietaprime).Pt()); - mHistManager.fill(HIST("etaprimed/fDeuteronPtVskstar_PCM"), kstar, (*iDeuteron).Pt()); - if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kEtaPrimeD)) { - lowMomentumMultiplets[CFTrigger::kEtaPrimeD] += 1; - } + mHistManager.fill(HIST("etaprimed/fdPtVskstar_PCM"), kstar, (*iDeuteron).Pt()); + + if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kEtaPrimeD)) + lowMomentumMultiplets[hnmtrigger::kEtaPrimeD] += 1; } - // etaPrimeAd trigger - for (auto iAntiDeuteron = antideuteron.begin(); iAntiDeuteron != antideuteron.end(); ++iAntiDeuteron) { - kstar = getkstar(*ietaprime, *iAntiDeuteron); + for (auto iAntiDeuteron = antideuteron.begin(); iAntiDeuteron != antideuteron.end(); ++iAntiDeuteron) { // ---> antid-eta' femtoscopy + + float kstar = getkstar(*ietaprime, *iAntiDeuteron); + mHistManager.fill(HIST("etaprimed/fSE_Antiparticle_PCM"), kstar); mHistManager.fill(HIST("etaprimed/fetaprimePtVskstar_PCM"), kstar, (*ietaprime).Pt()); - mHistManager.fill(HIST("etaprimed/fAntiDeuteronPtVskstar_PCM"), kstar, (*iAntiDeuteron).Pt()); - if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kEtaPrimeD)) { - lowMomentumMultiplets[CFTrigger::kEtaPrimeD] += 1; - } + mHistManager.fill(HIST("etaprimed/fAntidPtVskstar_PCM"), kstar, (*iAntiDeuteron).Pt()); + + if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kEtaPrimeD)) + lowMomentumMultiplets[hnmtrigger::kEtaPrimeD] += 1; } } - // EMC - // etaPrimed trigger - for (auto ietaprime = etaPrimeEMC.begin(); ietaprime != etaPrimeEMC.end(); ++ietaprime) { - for (auto iDeuteron = deuteron.begin(); iDeuteron != deuteron.end(); ++iDeuteron) { - kstar = getkstar(*ietaprime, *iDeuteron); + for (auto ietaprime = etaPrimeEMC.begin(); ietaprime != etaPrimeEMC.end(); ++ietaprime) { // -----> EMC + for (auto iDeuteron = deuteron.begin(); iDeuteron != deuteron.end(); ++iDeuteron) { // ---> d-eta' femtoscopy + + float kstar = getkstar(*ietaprime, *iDeuteron); + mHistManager.fill(HIST("etaprimed/fSE_particle_EMC"), kstar); mHistManager.fill(HIST("etaprimed/fetaprimePtVskstar_EMC"), kstar, (*ietaprime).Pt()); - mHistManager.fill(HIST("etaprimed/fDeuteronPtVskstar_EMC"), kstar, (*iDeuteron).Pt()); - if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kEtaPrimeD)) { - lowMomentumMultiplets[CFTrigger::kEtaPrimeD] += 1; - } + mHistManager.fill(HIST("etaprimed/fdPtVskstar_EMC"), kstar, (*iDeuteron).Pt()); + + if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kEtaPrimeD)) + lowMomentumMultiplets[hnmtrigger::kEtaPrimeD] += 1; } - // etaPrimeAd trigger - for (auto iAntiDeuteron = antideuteron.begin(); iAntiDeuteron != antideuteron.end(); ++iAntiDeuteron) { - kstar = getkstar(*ietaprime, *iAntiDeuteron); + for (auto iAntiDeuteron = antideuteron.begin(); iAntiDeuteron != antideuteron.end(); ++iAntiDeuteron) { // ---> antid-eta' femtoscopy + + float kstar = getkstar(*ietaprime, *iAntiDeuteron); + mHistManager.fill(HIST("etaprimed/fSE_Antiparticle_EMC"), kstar); mHistManager.fill(HIST("etaprimed/fetaprimePtVskstar_EMC"), kstar, (*ietaprime).Pt()); - mHistManager.fill(HIST("etaprimed/fAntiDeuteronPtVskstar_EMC"), kstar, (*iAntiDeuteron).Pt()); - if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kEtaPrimeD)) { - lowMomentumMultiplets[CFTrigger::kEtaPrimeD] += 1; - } + mHistManager.fill(HIST("etaprimed/fAntidPtVskstar_EMC"), kstar, (*iAntiDeuteron).Pt()); + + if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kEtaPrimeD)) + lowMomentumMultiplets[hnmtrigger::kEtaPrimeD] += 1; } } } - if (ConfTriggerSwitches->get("Switch", "OmegaP") > 0.) { - // PCM - // omegap trigger - for (auto iomega = omegaPCM.begin(); iomega != omegaPCM.end(); ++iomega) { - for (auto iProton = proton.begin(); iProton != proton.end(); ++iProton) { - kstar = getkstar(*iomega, *iProton); + if (cfgTriggerSwitches->get("Switch", "OmegaP") > 0.) { + for (auto iomega = omegaPCM.begin(); iomega != omegaPCM.end(); ++iomega) { // -----> PCM + for (auto iProton = proton.begin(); iProton != proton.end(); ++iProton) { // ---> p-omega femtoscopy + + float kstar = getkstar(*iomega, *iProton); + mHistManager.fill(HIST("omegap/fSE_particle_PCM"), kstar); mHistManager.fill(HIST("omegap/fomegaPtVskstar_PCM"), kstar, (*iomega).Pt()); - mHistManager.fill(HIST("omegap/fProtonPtVskstar_PCM"), kstar, (*iProton).Pt()); - if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kOmegaP)) { - lowMomentumMultiplets[CFTrigger::kOmegaP] += 1; - } + mHistManager.fill(HIST("omegap/fpPtVskstar_PCM"), kstar, (*iProton).Pt()); + + if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kOmegaP)) + lowMomentumMultiplets[hnmtrigger::kOmegaP] += 1; } - // omegaAp trigger - for (auto iAntiProton = antiproton.begin(); iAntiProton != antiproton.end(); ++iAntiProton) { - kstar = getkstar(*iomega, *iAntiProton); + for (auto iAntiProton = antiproton.begin(); iAntiProton != antiproton.end(); ++iAntiProton) { // ---> antip-omega femtoscopy + + float kstar = getkstar(*iomega, *iAntiProton); + mHistManager.fill(HIST("omegap/fSE_Antiparticle_PCM"), kstar); mHistManager.fill(HIST("omegap/fomegaPtVskstar_PCM"), kstar, (*iomega).Pt()); - mHistManager.fill(HIST("omegap/fAntiProtonPtVskstar_PCM"), kstar, (*iAntiProton).Pt()); - if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kOmegaP)) { - lowMomentumMultiplets[CFTrigger::kOmegaP] += 1; - } + mHistManager.fill(HIST("omegap/fAntipPtVskstar_PCM"), kstar, (*iAntiProton).Pt()); + + if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kOmegaP)) + lowMomentumMultiplets[hnmtrigger::kOmegaP] += 1; } } - // EMC - // omegap trigger - for (auto iomega = omegaEMC.begin(); iomega != omegaEMC.end(); ++iomega) { - for (auto iProton = proton.begin(); iProton != proton.end(); ++iProton) { - kstar = getkstar(*iomega, *iProton); + for (auto iomega = omegaEMC.begin(); iomega != omegaEMC.end(); ++iomega) { // -----> EMC + for (auto iProton = proton.begin(); iProton != proton.end(); ++iProton) { // ---> p-omega femtoscopy + + float kstar = getkstar(*iomega, *iProton); + mHistManager.fill(HIST("omegap/fSE_particle_EMC"), kstar); mHistManager.fill(HIST("omegap/fomegaPtVskstar_EMC"), kstar, (*iomega).Pt()); - mHistManager.fill(HIST("omegap/fProtonPtVskstar_EMC"), kstar, (*iProton).Pt()); - if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kOmegaP)) { - lowMomentumMultiplets[CFTrigger::kOmegaP] += 1; - } + mHistManager.fill(HIST("omegap/fpPtVskstar_EMC"), kstar, (*iProton).Pt()); + + if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kOmegaP)) + lowMomentumMultiplets[hnmtrigger::kOmegaP] += 1; } - // omegaAp trigger - for (auto iAntiProton = antiproton.begin(); iAntiProton != antiproton.end(); ++iAntiProton) { - kstar = getkstar(*iomega, *iAntiProton); + for (auto iAntiProton = antiproton.begin(); iAntiProton != antiproton.end(); ++iAntiProton) { // ---> antip-omega femtoscopy + + float kstar = getkstar(*iomega, *iAntiProton); + mHistManager.fill(HIST("omegap/fSE_Antiparticle_EMC"), kstar); mHistManager.fill(HIST("omegap/fomegaPtVskstar_EMC"), kstar, (*iomega).Pt()); - mHistManager.fill(HIST("omegap/fAntiProtonPtVskstar_EMC"), kstar, (*iAntiProton).Pt()); - if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kOmegaP)) { - lowMomentumMultiplets[CFTrigger::kOmegaP] += 1; - } + mHistManager.fill(HIST("omegap/fAntipPtVskstar_EMC"), kstar, (*iAntiProton).Pt()); + + if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kOmegaP)) + lowMomentumMultiplets[hnmtrigger::kOmegaP] += 1; } } } - if (ConfTriggerSwitches->get("Switch", "EtaPrimeP") > 0.) { - // PCM - // etaPrimep trigger - for (auto ietaprime = etaPrimePCM.begin(); ietaprime != etaPrimePCM.end(); ++ietaprime) { - for (auto iProton = proton.begin(); iProton != proton.end(); ++iProton) { - kstar = getkstar(*ietaprime, *iProton); + if (cfgTriggerSwitches->get("Switch", "EtaPrimeP") > 0.) { + for (auto ietaprime = etaPrimePCM.begin(); ietaprime != etaPrimePCM.end(); ++ietaprime) { // -----> PCM + for (auto iProton = proton.begin(); iProton != proton.end(); ++iProton) { // ---> p-eta' femtoscopy + + float kstar = getkstar(*ietaprime, *iProton); + mHistManager.fill(HIST("etaprimep/fSE_particle_PCM"), kstar); mHistManager.fill(HIST("etaprimep/fetaprimePtVskstar_PCM"), kstar, (*ietaprime).Pt()); - mHistManager.fill(HIST("etaprimep/fProtonPtVskstar_PCM"), kstar, (*iProton).Pt()); - if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kEtaPrimeP)) { - lowMomentumMultiplets[CFTrigger::kEtaPrimeP] += 1; - } + mHistManager.fill(HIST("etaprimep/fpPtVskstar_PCM"), kstar, (*iProton).Pt()); + + if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kEtaPrimeP)) + lowMomentumMultiplets[hnmtrigger::kEtaPrimeP] += 1; } - // etaPrimeAp trigger - for (auto iAntiProton = antiproton.begin(); iAntiProton != antiproton.end(); ++iAntiProton) { - kstar = getkstar(*ietaprime, *iAntiProton); + for (auto iAntiProton = antiproton.begin(); iAntiProton != antiproton.end(); ++iAntiProton) { // ---> antip-eta' femtoscopy + + float kstar = getkstar(*ietaprime, *iAntiProton); + mHistManager.fill(HIST("etaprimep/fSE_Antiparticle_PCM"), kstar); mHistManager.fill(HIST("etaprimep/fetaprimePtVskstar_PCM"), kstar, (*ietaprime).Pt()); - mHistManager.fill(HIST("etaprimep/fAntiProtonPtVskstar_PCM"), kstar, (*iAntiProton).Pt()); - if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kEtaPrimeP)) { - lowMomentumMultiplets[CFTrigger::kEtaPrimeP] += 1; - } + mHistManager.fill(HIST("etaprimep/fAntipPtVskstar_PCM"), kstar, (*iAntiProton).Pt()); + + if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kEtaPrimeP)) + lowMomentumMultiplets[hnmtrigger::kEtaPrimeP] += 1; } } - // EMC - // etaPrimep trigger - for (auto ietaprime = etaPrimeEMC.begin(); ietaprime != etaPrimeEMC.end(); ++ietaprime) { - for (auto iProton = proton.begin(); iProton != proton.end(); ++iProton) { - kstar = getkstar(*ietaprime, *iProton); + for (auto ietaprime = etaPrimeEMC.begin(); ietaprime != etaPrimeEMC.end(); ++ietaprime) { // -----> EMC + for (auto iProton = proton.begin(); iProton != proton.end(); ++iProton) { // ---> p-eta' femtoscopy + + float kstar = getkstar(*ietaprime, *iProton); + mHistManager.fill(HIST("etaprimep/fSE_particle_EMC"), kstar); mHistManager.fill(HIST("etaprimep/fetaprimePtVskstar_EMC"), kstar, (*ietaprime).Pt()); - mHistManager.fill(HIST("etaprimep/fProtonPtVskstar_EMC"), kstar, (*iProton).Pt()); - if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kEtaPrimeP)) { - lowMomentumMultiplets[CFTrigger::kEtaPrimeP] += 1; - } + mHistManager.fill(HIST("etaprimep/fpPtVskstar_EMC"), kstar, (*iProton).Pt()); + + if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kEtaPrimeP)) + lowMomentumMultiplets[hnmtrigger::kEtaPrimeP] += 1; } - // etaPrimeAp trigger - for (auto iAntiProton = antiproton.begin(); iAntiProton != antiproton.end(); ++iAntiProton) { - kstar = getkstar(*ietaprime, *iAntiProton); + for (auto iAntiProton = antiproton.begin(); iAntiProton != antiproton.end(); ++iAntiProton) { // ---> antip-eta' femtoscopy + + float kstar = getkstar(*ietaprime, *iAntiProton); + mHistManager.fill(HIST("etaprimep/fSE_Antiparticle_EMC"), kstar); mHistManager.fill(HIST("etaprimep/fetaprimePtVskstar_EMC"), kstar, (*ietaprime).Pt()); - mHistManager.fill(HIST("etaprimep/fAntiProtonPtVskstar_EMC"), kstar, (*iAntiProton).Pt()); - if (kstar < ConfKinematicLimits->get(static_cast(0), CFTrigger::kEtaPrimeP)) { - lowMomentumMultiplets[CFTrigger::kEtaPrimeP] += 1; - } + mHistManager.fill(HIST("etaprimep/fAntipPtVskstar_EMC"), kstar, (*iAntiProton).Pt()); + + if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kEtaPrimeP)) + lowMomentumMultiplets[hnmtrigger::kEtaPrimeP] += 1; } } } - // create tags for three body triggers - if (lowMomentumMultiplets[CFTrigger::kPPOmega] > 0) { - keepFemtoEvent[CFTrigger::kPPOmega] = true; - mHistManager.fill(HIST("fProcessedEvents"), 2); + // -----------------------------> Create femto tags <----------------------------------- + // - Set keepFemtoEvent flags for each HNM type based on the lowMomentumMultiplets + // - Fill histograms for the multiplicity and z-vertex of femto-accepted events + // ------------------------------------------------------------------------------------- + if (lowMomentumMultiplets[hnmtrigger::kPPOmega] > 0) { + keepFemtoEvent[hnmtrigger::kPPOmega] = true; + mHistManager.fill(HIST("fProcessedEvents"), 6); mHistManager.fill(HIST("ppomega/fMultiplicity"), collision.multNTracksPV()); mHistManager.fill(HIST("ppomega/fZvtx"), collision.posZ()); } - if (lowMomentumMultiplets[CFTrigger::kPPEtaPrime] > 0) { - keepFemtoEvent[CFTrigger::kPPEtaPrime] = true; - mHistManager.fill(HIST("fProcessedEvents"), 3); + if (lowMomentumMultiplets[hnmtrigger::kPPEtaPrime] > 0) { + keepFemtoEvent[hnmtrigger::kPPEtaPrime] = true; + mHistManager.fill(HIST("fProcessedEvents"), 7); mHistManager.fill(HIST("ppetaprime/fMultiplicity"), collision.multNTracksPV()); mHistManager.fill(HIST("ppetaprime/fZvtx"), collision.posZ()); } - if (lowMomentumMultiplets[CFTrigger::kOmegaD] > 0) { - keepFemtoEvent[CFTrigger::kOmegaD] = true; - mHistManager.fill(HIST("fProcessedEvents"), 4); + if (lowMomentumMultiplets[hnmtrigger::kOmegaD] > 0) { + keepFemtoEvent[hnmtrigger::kOmegaD] = true; + mHistManager.fill(HIST("fProcessedEvents"), 8); mHistManager.fill(HIST("omegad/fMultiplicity"), collision.multNTracksPV()); mHistManager.fill(HIST("omegad/fZvtx"), collision.posZ()); } - if (lowMomentumMultiplets[CFTrigger::kEtaPrimeD] > 0) { - keepFemtoEvent[CFTrigger::kEtaPrimeD] = true; - mHistManager.fill(HIST("fProcessedEvents"), 5); + if (lowMomentumMultiplets[hnmtrigger::kEtaPrimeD] > 0) { + keepFemtoEvent[hnmtrigger::kEtaPrimeD] = true; + mHistManager.fill(HIST("fProcessedEvents"), 9); mHistManager.fill(HIST("etaprimed/fMultiplicity"), collision.multNTracksPV()); mHistManager.fill(HIST("etaprimed/fZvtx"), collision.posZ()); } - if (lowMomentumMultiplets[CFTrigger::kOmegaP] > 0) { - keepFemtoEvent[CFTrigger::kOmegaP] = true; - mHistManager.fill(HIST("fProcessedEvents"), 6); + if (lowMomentumMultiplets[hnmtrigger::kOmegaP] > 0) { + keepFemtoEvent[hnmtrigger::kOmegaP] = true; + mHistManager.fill(HIST("fProcessedEvents"), 10); mHistManager.fill(HIST("omegap/fMultiplicity"), collision.multNTracksPV()); mHistManager.fill(HIST("omegap/fZvtx"), collision.posZ()); } - if (lowMomentumMultiplets[CFTrigger::kEtaPrimeP] > 0) { - keepFemtoEvent[CFTrigger::kEtaPrimeP] = true; - mHistManager.fill(HIST("fProcessedEvents"), 7); + if (lowMomentumMultiplets[hnmtrigger::kEtaPrimeP] > 0) { + keepFemtoEvent[hnmtrigger::kEtaPrimeP] = true; + mHistManager.fill(HIST("fProcessedEvents"), 11); mHistManager.fill(HIST("etaprimep/fMultiplicity"), collision.multNTracksPV()); mHistManager.fill(HIST("etaprimep/fZvtx"), collision.posZ()); } - // #set flag for tag - if (ConfKeepTwoBody.value) { - tags(colContainsPCMOmega, colContainsEMCOmega, colContainsPCMEtaPrime, colContainsEMCEtaPrime, - keepFemtoEvent[CFTrigger::kPPOmega] || keepFemtoEvent[CFTrigger::kOmegaP], keepFemtoEvent[CFTrigger::kPPEtaPrime] || keepFemtoEvent[CFTrigger::kEtaPrimeP], - keepFemtoEvent[CFTrigger::kOmegaD], keepFemtoEvent[CFTrigger::kEtaPrimeD]); - } else { - tags(colContainsPCMOmega, colContainsEMCOmega, colContainsPCMEtaPrime, colContainsEMCEtaPrime, - keepFemtoEvent[CFTrigger::kPPOmega], keepFemtoEvent[CFTrigger::kPPEtaPrime], - keepFemtoEvent[CFTrigger::kOmegaD], keepFemtoEvent[CFTrigger::kEtaPrimeD]); - } + // -----------------------------> Set trigger flags <----------------------------------- + // - 4 high pT spectrum trigger flags (PCM & EMC * omega & eta') + // - 4 femto trigger flags (p-omega, p-eta', d-omega || pp-omega, d-eta' || pp-eta') + // ------------------------------------------------------------------------------------- + tags(colContainsPCMOmega, colContainsEMCOmega, colContainsPCMEtaPrime, colContainsEMCEtaPrime, keepFemtoEvent[hnmtrigger::kOmegaP], keepFemtoEvent[hnmtrigger::kEtaPrimeP], + keepFemtoEvent[hnmtrigger::kPPOmega] || keepFemtoEvent[hnmtrigger::kOmegaD], keepFemtoEvent[hnmtrigger::kPPEtaPrime] || keepFemtoEvent[hnmtrigger::kEtaPrimeD]); - if (!keepFemtoEvent[CFTrigger::kPPOmega] && !keepFemtoEvent[CFTrigger::kOmegaP] && !keepFemtoEvent[CFTrigger::kPPEtaPrime] && !keepFemtoEvent[CFTrigger::kEtaPrimeP] && - !keepFemtoEvent[CFTrigger::kOmegaD] && !keepFemtoEvent[CFTrigger::kEtaPrimeD]) { - mHistManager.fill(HIST("fProcessedEvents"), 1); - } + if (!colContainsPCMOmega && !colContainsEMCOmega && !colContainsPCMEtaPrime && !colContainsEMCEtaPrime && !keepFemtoEvent[hnmtrigger::kPPOmega] && !keepFemtoEvent[hnmtrigger::kOmegaP] && !keepFemtoEvent[hnmtrigger::kPPEtaPrime] && !keepFemtoEvent[hnmtrigger::kEtaPrimeP] && !keepFemtoEvent[hnmtrigger::kOmegaD] && !keepFemtoEvent[hnmtrigger::kEtaPrimeD]) + mHistManager.fill(HIST("fProcessedEvents"), 1); // Fill "rejected", if no trigger selected the event } /// \brief Loop over the GG candidates, fill the mass/pt histograms and set the isPi0/isEta flags based on the reconstructed mass @@ -1481,9 +1146,9 @@ struct HeavyNeutralMesonFilter { mHistManager.fill(HIST("GG/invMassVsPt_PCMEMC"), lightMeson->m(), lightMeson->pT()); } - if (lightMeson->m() > massWindowOmega->get("pi0_min") && lightMeson->m() < massWindowOmega->get("pi0_max")) { + if (lightMeson->m() > cfgMassWindowOmega->get("pi0_min") && lightMeson->m() < cfgMassWindowOmega->get("pi0_max")) { lightMeson->isPi0 = true; - } else if (lightMeson->m() > massWindowEtaPrime->get("eta_min") && lightMeson->m() < massWindowEtaPrime->get("eta_max")) { + } else if (lightMeson->m() > cfgMassWindowEtaPrime->get("eta_min") && lightMeson->m() < cfgMassWindowEtaPrime->get("eta_max")) { lightMeson->isEta = true; } else { vGGs.erase(vGGs.begin() + iGG); @@ -1497,93 +1162,82 @@ struct HeavyNeutralMesonFilter { void processHNMs(std::vector& vHNMs) { int nHNMsBeforeMassCuts = vHNMs.size(); + for (unsigned int iHNM = 0; iHNM < vHNMs.size(); iHNM++) { auto heavyNeutralMeson = vHNMs.at(iHNM); - float massHNM = heavyNeutralMeson.m(cfgHNMMassCorrection); + if (heavyNeutralMeson.gg->reconstructionType == photonpair::kPCMPCM) { - if (heavyNeutralMeson.gg->isPi0) - mHistManager.fill(HIST("Omega/invMassVsPt_PCM"), massHNM, heavyNeutralMeson.pT()); - else if (heavyNeutralMeson.gg->isEta) - mHistManager.fill(HIST("EtaPrime/invMassVsPt_PCM"), massHNM, heavyNeutralMeson.pT()); - // QA - mHistManager.fill(HIST("TrackCuts/HMN/Before/PCM/fInvMass"), massHNM); - mHistManager.fill(HIST("TrackCuts/HMN/Before/PCM/fPt"), heavyNeutralMeson.pT()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/PCM/fEta"), heavyNeutralMeson.eta()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/PCM/fPhi"), translatePhi(heavyNeutralMeson.phi())); + if (heavyNeutralMeson.gg->isPi0) { + mHistManager.fill(HIST("HNM/Before/Omega/PCM/fInvMassVsPt"), massHNM, heavyNeutralMeson.pT()); + mHistManager.fill(HIST("HNM/Before/Omega/PCM/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("HNM/Before/Omega/PCM/fPhi"), RecoDecay::constrainAngle(heavyNeutralMeson.phi())); + } else if (heavyNeutralMeson.gg->isEta) { + mHistManager.fill(HIST("HNM/Before/EtaPrime/PCM/fInvMassVsPt"), massHNM, heavyNeutralMeson.pT()); + mHistManager.fill(HIST("HNM/Before/EtaPrime/PCM/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("HNM/Before/EtaPrime/PCM/fPhi"), RecoDecay::constrainAngle(heavyNeutralMeson.phi())); + } } else if (heavyNeutralMeson.gg->reconstructionType == photonpair::kEMCEMC) { - if (heavyNeutralMeson.gg->isPi0) - mHistManager.fill(HIST("Omega/invMassVsPt_EMC"), massHNM, heavyNeutralMeson.pT()); - else if (heavyNeutralMeson.gg->isEta) - mHistManager.fill(HIST("EtaPrime/invMassVsPt_EMC"), massHNM, heavyNeutralMeson.pT()); - // QA - mHistManager.fill(HIST("TrackCuts/HMN/Before/EMC/fInvMass"), massHNM); - mHistManager.fill(HIST("TrackCuts/HMN/Before/EMC/fPt"), heavyNeutralMeson.pT()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/EMC/fEta"), heavyNeutralMeson.eta()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/EMC/fPhi"), translatePhi(heavyNeutralMeson.phi())); + if (heavyNeutralMeson.gg->isPi0) { + mHistManager.fill(HIST("HNM/Before/Omega/EMC/fInvMassVsPt"), massHNM, heavyNeutralMeson.pT()); + mHistManager.fill(HIST("HNM/Before/Omega/EMC/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("HNM/Before/Omega/EMC/fPhi"), RecoDecay::constrainAngle(heavyNeutralMeson.phi())); + } else if (heavyNeutralMeson.gg->isEta) { + mHistManager.fill(HIST("HNM/Before/EtaPrime/EMC/fInvMassVsPt"), massHNM, heavyNeutralMeson.pT()); + mHistManager.fill(HIST("HNM/Before/EtaPrime/EMC/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("HNM/Before/EtaPrime/EMC/fPhi"), RecoDecay::constrainAngle(heavyNeutralMeson.phi())); + } } else { - if (heavyNeutralMeson.gg->isPi0) - mHistManager.fill(HIST("Omega/invMassVsPt_PCMEMC"), massHNM, heavyNeutralMeson.pT()); - else if (heavyNeutralMeson.gg->isEta) - mHistManager.fill(HIST("EtaPrime/invMassVsPt_PCMEMC"), massHNM, heavyNeutralMeson.pT()); - // QA - mHistManager.fill(HIST("TrackCuts/HMN/Before/PCMEMC/fInvMass"), massHNM); - mHistManager.fill(HIST("TrackCuts/HMN/Before/PCMEMC/fPt"), heavyNeutralMeson.pT()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/PCMEMC/fEta"), heavyNeutralMeson.eta()); - mHistManager.fill(HIST("TrackCuts/HMN/Before/PCMEMC/fPhi"), translatePhi(heavyNeutralMeson.phi())); + if (heavyNeutralMeson.gg->isPi0) { + mHistManager.fill(HIST("HNM/Before/Omega/PCMEMC/fInvMassVsPt"), massHNM, heavyNeutralMeson.pT()); + mHistManager.fill(HIST("HNM/Before/Omega/PCMEMC/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("HNM/Before/Omega/PCMEMC/fPhi"), RecoDecay::constrainAngle(heavyNeutralMeson.phi())); + } else if (heavyNeutralMeson.gg->isEta) { + mHistManager.fill(HIST("HNM/Before/EtaPrime/PCMEMC/fInvMassVsPt"), massHNM, heavyNeutralMeson.pT()); + mHistManager.fill(HIST("HNM/Before/EtaPrime/PCMEMC/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("HNM/Before/EtaPrime/PCMEMC/fPhi"), RecoDecay::constrainAngle(heavyNeutralMeson.phi())); + } } - if (heavyNeutralMeson.gg->isPi0 && massHNM > massWindowOmega->get("omega_min") && massHNM < massWindowOmega->get("omega_max")) { + if (heavyNeutralMeson.gg->isPi0 && massHNM > cfgMassWindowOmega->get("omega_min") && massHNM < cfgMassWindowOmega->get("omega_max")) { if (heavyNeutralMeson.gg->reconstructionType == photonpair::kPCMPCM) { - if (heavyNeutralMeson.pT() > minFemtoHNMPts->get("PCM_omega")) { - omegaPCM.emplace_back(heavyNeutralMeson.pT(), heavyNeutralMeson.eta(), translatePhi(heavyNeutralMeson.phi()), mMassOmega); - // QA - mHistManager.fill(HIST("TrackCuts/HMN/After/Omega/PCM/fInvMass"), massHNM); - mHistManager.fill(HIST("TrackCuts/HMN/After/Omega/PCM/fPt"), heavyNeutralMeson.pT()); - mHistManager.fill(HIST("TrackCuts/HMN/After/Omega/PCM/fEta"), heavyNeutralMeson.eta()); - mHistManager.fill(HIST("TrackCuts/HMN/After/Omega/PCM/fPhi"), translatePhi(heavyNeutralMeson.phi())); + if (heavyNeutralMeson.pT() > cfgMinHNMPtsFemtoTrigger->get("PCM_omega")) { + omegaPCM.emplace_back(heavyNeutralMeson.pT(), heavyNeutralMeson.eta(), RecoDecay::constrainAngle(heavyNeutralMeson.phi()), mMassOmega); + mHistManager.fill(HIST("HNM/After/Omega/PCM/fInvMassVsPt"), massHNM, heavyNeutralMeson.pT()); + mHistManager.fill(HIST("HNM/After/Omega/PCM/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("HNM/After/Omega/PCM/fPhi"), RecoDecay::constrainAngle(heavyNeutralMeson.phi())); } - if (heavyNeutralMeson.pT() > minHNMPts->get("PCM_omega")) { + if (heavyNeutralMeson.pT() > cfgMinHNMPtsSpectrumTrigger->get("PCM_omega")) colContainsPCMOmega = true; - } } else if (heavyNeutralMeson.gg->reconstructionType == photonpair::kEMCEMC) { - if (heavyNeutralMeson.pT() > minFemtoHNMPts->get("EMC_omega")) { - omegaEMC.emplace_back(heavyNeutralMeson.pT(), heavyNeutralMeson.eta(), translatePhi(heavyNeutralMeson.phi()), mMassOmega); - // QA - mHistManager.fill(HIST("TrackCuts/HMN/After/Omega/EMC/fInvMass"), massHNM); - mHistManager.fill(HIST("TrackCuts/HMN/After/Omega/EMC/fPt"), heavyNeutralMeson.pT()); - mHistManager.fill(HIST("TrackCuts/HMN/After/Omega/EMC/fEta"), heavyNeutralMeson.eta()); - mHistManager.fill(HIST("TrackCuts/HMN/After/Omega/EMC/fPhi"), translatePhi(heavyNeutralMeson.phi())); + if (heavyNeutralMeson.pT() > cfgMinHNMPtsFemtoTrigger->get("EMC_omega")) { + omegaEMC.emplace_back(heavyNeutralMeson.pT(), heavyNeutralMeson.eta(), RecoDecay::constrainAngle(heavyNeutralMeson.phi()), mMassOmega); + mHistManager.fill(HIST("HNM/After/Omega/EMC/fInvMassVsPt"), massHNM, heavyNeutralMeson.pT()); + mHistManager.fill(HIST("HNM/After/Omega/EMC/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("HNM/After/Omega/EMC/fPhi"), RecoDecay::constrainAngle(heavyNeutralMeson.phi())); } - if (heavyNeutralMeson.pT() > minHNMPts->get("EMC_omega")) { + if (heavyNeutralMeson.pT() > cfgMinHNMPtsSpectrumTrigger->get("EMC_omega")) colContainsEMCOmega = true; - } } - } else if (heavyNeutralMeson.gg->isEta && massHNM > massWindowEtaPrime->get("etaprime_min") && massHNM < massWindowEtaPrime->get("etaprime_max")) { + } else if (heavyNeutralMeson.gg->isEta && massHNM > cfgMassWindowEtaPrime->get("etaprime_min") && massHNM < cfgMassWindowEtaPrime->get("etaprime_max")) { if (heavyNeutralMeson.gg->reconstructionType == photonpair::kPCMPCM) { - if (heavyNeutralMeson.pT() > minFemtoHNMPts->get("PCM_etaprime")) { - etaPrimePCM.emplace_back(heavyNeutralMeson.pT(), heavyNeutralMeson.eta(), translatePhi(heavyNeutralMeson.phi()), mMassEtaPrime); - // QA - mHistManager.fill(HIST("TrackCuts/HMN/After/EtaPrime/PCM/fInvMass"), massHNM); - mHistManager.fill(HIST("TrackCuts/HMN/After/EtaPrime/PCM/fPt"), heavyNeutralMeson.pT()); - mHistManager.fill(HIST("TrackCuts/HMN/After/EtaPrime/PCM/fEta"), heavyNeutralMeson.eta()); - mHistManager.fill(HIST("TrackCuts/HMN/After/EtaPrime/PCM/fPhi"), translatePhi(heavyNeutralMeson.phi())); + if (heavyNeutralMeson.pT() > cfgMinHNMPtsFemtoTrigger->get("PCM_etaprime")) { + etaPrimePCM.emplace_back(heavyNeutralMeson.pT(), heavyNeutralMeson.eta(), RecoDecay::constrainAngle(heavyNeutralMeson.phi()), mMassEtaPrime); + mHistManager.fill(HIST("HNM/After/EtaPrime/PCM/fInvMassVsPt"), massHNM, heavyNeutralMeson.pT()); + mHistManager.fill(HIST("HNM/After/EtaPrime/PCM/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("HNM/After/EtaPrime/PCM/fPhi"), RecoDecay::constrainAngle(heavyNeutralMeson.phi())); } - if (heavyNeutralMeson.pT() > minHNMPts->get("PCM_etaprime")) { + if (heavyNeutralMeson.pT() > cfgMinHNMPtsSpectrumTrigger->get("PCM_etaprime")) colContainsPCMEtaPrime = true; - } } else if (heavyNeutralMeson.gg->reconstructionType == photonpair::kEMCEMC) { - if (heavyNeutralMeson.pT() > minFemtoHNMPts->get("EMC_etaprime")) { - etaPrimeEMC.emplace_back(heavyNeutralMeson.pT(), heavyNeutralMeson.eta(), translatePhi(heavyNeutralMeson.phi()), mMassEtaPrime); - // QA - mHistManager.fill(HIST("TrackCuts/HMN/After/EtaPrime/EMC/fInvMass"), massHNM); - mHistManager.fill(HIST("TrackCuts/HMN/After/EtaPrime/EMC/fPt"), heavyNeutralMeson.pT()); - mHistManager.fill(HIST("TrackCuts/HMN/After/EtaPrime/EMC/fEta"), heavyNeutralMeson.eta()); - mHistManager.fill(HIST("TrackCuts/HMN/After/EtaPrime/EMC/fPhi"), translatePhi(heavyNeutralMeson.phi())); + if (heavyNeutralMeson.pT() > cfgMinHNMPtsFemtoTrigger->get("EMC_etaprime")) { + etaPrimeEMC.emplace_back(heavyNeutralMeson.pT(), heavyNeutralMeson.eta(), RecoDecay::constrainAngle(heavyNeutralMeson.phi()), mMassEtaPrime); + mHistManager.fill(HIST("HNM/After/EtaPrime/EMC/fInvMassVsPt"), massHNM, heavyNeutralMeson.pT()); + mHistManager.fill(HIST("HNM/After/EtaPrime/EMC/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("HNM/After/EtaPrime/EMC/fPhi"), RecoDecay::constrainAngle(heavyNeutralMeson.phi())); } - if (heavyNeutralMeson.pT() > minHNMPts->get("EMC_etaprime")) { + if (heavyNeutralMeson.pT() > cfgMinHNMPtsSpectrumTrigger->get("EMC_etaprime")) colContainsEMCEtaPrime = true; - } } } else { vHNMs.erase(vHNMs.begin() + iHNM); @@ -1592,26 +1246,15 @@ struct HeavyNeutralMesonFilter { } mHistManager.fill(HIST("Event/nHeavyNeutralMesons"), nHNMsBeforeMassCuts, vHNMs.size()); - if (colContainsPCMOmega) { - mHistManager.fill(HIST("Event/hCollisionCounter"), 2.); - mHistManager.fill(HIST("fProcessedEvents"), 9); - } - if (colContainsEMCOmega) { - mHistManager.fill(HIST("Event/hCollisionCounter"), 3.); - mHistManager.fill(HIST("fProcessedEvents"), 10); - } - if (colContainsPCMEtaPrime) { - mHistManager.fill(HIST("Event/hCollisionCounter"), 4.); - mHistManager.fill(HIST("fProcessedEvents"), 11); - } - if (colContainsEMCEtaPrime) { - mHistManager.fill(HIST("Event/hCollisionCounter"), 5.); - mHistManager.fill(HIST("fProcessedEvents"), 12); - } + if (colContainsPCMOmega) + mHistManager.fill(HIST("fProcessedEvents"), 2); + if (colContainsEMCOmega) + mHistManager.fill(HIST("fProcessedEvents"), 3); + if (colContainsPCMEtaPrime) + mHistManager.fill(HIST("fProcessedEvents"), 4); + if (colContainsEMCEtaPrime) + mHistManager.fill(HIST("fProcessedEvents"), 5); } }; -WorkflowSpec defineDataProcessing(o2::framework::ConfigContext const& cfgc) -{ - return WorkflowSpec{adaptAnalysisTask(cfgc)}; -} +WorkflowSpec defineDataProcessing(o2::framework::ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc)}; } diff --git a/EventFiltering/filterTables.h b/EventFiltering/filterTables.h index 6a547ef33a8..1d0212eb9f0 100644 --- a/EventFiltering/filterTables.h +++ b/EventFiltering/filterTables.h @@ -187,10 +187,10 @@ DECLARE_SOA_COLUMN(PCMOmegaMeson, hasPCMOmegaMeson, bool); //! Omega meson DECLARE_SOA_COLUMN(EMCOmegaMeson, hasEMCOmegaMeson, bool); //! Omega meson candidate (3pi) in the collision DECLARE_SOA_COLUMN(PCMEtaPrimeMeson, hasPCMEtaPrimeMeson, bool); //! Eta' meson candidate (3pi) in the collision DECLARE_SOA_COLUMN(EMCEtaPrimeMeson, hasEMCEtaPrimeMeson, bool); //! Eta' meson candidate (3pi) in the collision -DECLARE_SOA_COLUMN(PPOmega, hasPPOmega, bool); //! PPomega meson candidate (3pi) in the collision -DECLARE_SOA_COLUMN(PPEtaPrime, hasPPEtaPrime, bool); //! PPEta' meson candidate (3pi) in the collision -DECLARE_SOA_COLUMN(Omegad, hasOmegad, bool); //! Omegad' meson candidate (3pi) in the collision -DECLARE_SOA_COLUMN(EtaPrimed, hasEtaPrimed, bool); //! Eta'd meson candidate (3pi) in the collision +DECLARE_SOA_COLUMN(POmega, hasPPOmega, bool); //! Pomega meson candidate (3pi) in the collision +DECLARE_SOA_COLUMN(PEtaPrime, hasPEtaPrime, bool); //! PPEta' meson candidate (3pi) in the collision +DECLARE_SOA_COLUMN(OmegadOrPP, hasOmegadOrPP, bool); //! Omegad' meson candidate (3pi) in the collision +DECLARE_SOA_COLUMN(EtaPrimedOrPP, hasEtaPrimedOrPP, bool); //! Eta'd meson candidate (3pi) in the collision } // namespace filtering @@ -326,8 +326,8 @@ using PhotonFilter = PhotonFilters::iterator; DECLARE_SOA_TABLE(HeavyNeutralMesonFilters, "AOD", "HeavyNeutralMesonFilters", //! filtering::PCMOmegaMeson, filtering::EMCOmegaMeson, filtering::PCMEtaPrimeMeson, filtering::EMCEtaPrimeMeson, - filtering::PPOmega, filtering::PPEtaPrime, - filtering::Omegad, filtering::EtaPrimed); + filtering::POmega, filtering::PEtaPrime, + filtering::OmegadOrPP, filtering::EtaPrimedOrPP); using HeavyNeutralMesonFilter = HeavyNeutralMesonFilters::iterator; diff --git a/PWGEM/PhotonMeson/Tasks/HeavyNeutralMeson.cxx b/PWGEM/PhotonMeson/Tasks/HeavyNeutralMeson.cxx index 98e620e413b..56ef57a6d79 100644 --- a/PWGEM/PhotonMeson/Tasks/HeavyNeutralMeson.cxx +++ b/PWGEM/PhotonMeson/Tasks/HeavyNeutralMeson.cxx @@ -17,7 +17,6 @@ /// #include -#include #include #include @@ -27,6 +26,7 @@ #include "TRandom3.h" #include "PWGEM/PhotonMeson/Utils/HNMUtilities.h" +#include "PWGJE/DataModel/EMCALMatchedCollisions.h" #include "Common/DataModel/PIDResponse.h" #include "Common/DataModel/PIDResponseITS.h" @@ -51,14 +51,14 @@ using namespace o2::aod::pwgem::photonmeson; namespace o2::aod { using MyBCs = soa::Join; -using MyCollisions = soa::Join; +using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; using SelectedTracks = soa::Join; } // namespace o2::aod -namespace HNMPID +namespace hnm { enum TracksPID { @@ -74,91 +74,109 @@ enum PIDLimits { kTPCMin, kNPIDLimits }; -const std::vector SpeciesName{"pion"}; // ToDo include charged pions -const std::vector PtCutsName{"Pt min", "Pt max", "P TOF thres"}; -const std::vector PidCutsName{"TPC min", "TPC max", "TPCTOF max", "ITS min", "ITS max"}; +const std::vector speciesName{"pion"}; // ToDo include charged pions +const std::vector pTCutsName{"Pt min", "Pt max", "P TOF thres"}; +const std::vector pidCutsName{"TPC min", "TPC max", "TPCTOF max", "ITS min", "ITS max"}; const float pidcutsTable[kNTracksPID][kNPIDLimits]{{-4.f, 4.f, 4.f, -99.f, 99.f}}; const float ptcutsTable[kNTracksPID][3]{{0.35f, 6.f, 0.75f}}; -const float TPCNClustersMin[1][kNTracksPID]{{80.0f}}; -const float ITSNClustersMin[1][kNTracksPID]{{4}}; +const float nClusterMinTPC[1][kNTracksPID]{{80.0f}}; +const float nClusterMinITS[1][kNTracksPID]{{4}}; -} // namespace HNMPID +} // namespace hnm struct HeavyNeutralMeson { - // PID selections - Configurable> ConfPIDCuts{"ConfPIDCuts", {HNMPID::pidcutsTable[0], HNMPID::kNTracksPID, HNMPID::kNPIDLimits, HNMPID::SpeciesName, HNMPID::PidCutsName}, "Heavy Neutral Meson PID nsigma selections"}; - Configurable> ConfPtCuts{"ConfPtCuts", {HNMPID::ptcutsTable[0], HNMPID::kNTracksPID, 3, HNMPID::SpeciesName, HNMPID::PtCutsName}, "Heavy Neutral Meson pT selections"}; - Configurable ConfTrkEta{"ConfTrkEta", 0.9, "Eta"}; - Configurable> ConfTPCNClustersMin{"ConfTPCNClustersMin", {HNMPID::TPCNClustersMin[0], 1, HNMPID::kNTracksPID, std::vector{"TPCNClusMin"}, HNMPID::SpeciesName}, "Mininum of TPC Clusters"}; - Configurable ConfTrkTPCfCls{"ConfTrkTPCfCls", 0.83, "Minimum fraction of crossed rows over findable clusters"}; - Configurable ConfTrkTPCcRowsMin{"ConfTrkTPCcRowsMin", 70, "Minimum number of crossed TPC rows"}; - Configurable ConfTrkTPCsClsSharedFrac{"ConfTrkTPCsClsSharedFrac", 1.f, "Fraction of shared TPC clusters"}; - Configurable> ConfTrkITSnclsMin{"ConfTrkITSnclsMin", {HNMPID::ITSNClustersMin[0], 1, HNMPID::kNTracksPID, std::vector{"Cut"}, HNMPID::SpeciesName}, "Minimum number of ITS clusters"}; - Configurable ConfTrkDCAxyMax{"ConfTrkDCAxyMax", 0.15, "Maximum DCA_xy"}; - Configurable ConfTrkDCAzMax{"ConfTrkDCAzMax", 0.3, "Maximum DCA_z"}; - Configurable ConfTrkMaxChi2PerClusterTPC{"ConfTrkMaxChi2PerClusterTPC", 4.0f, "Minimal track selection: max allowed chi2 per TPC cluster"}; // 4.0 is default of global tracks on 20.01.2023 - Configurable ConfTrkMaxChi2PerClusterITS{"ConfTrkMaxChi2PerClusterITS", 36.0f, "Minimal track selection: max allowed chi2 per ITS cluster"}; // 36.0 is default of global tracks on 20.01.2023 - Configurable ConfEvtSelectZvtx{"ConfEvtSelectZvtx", true, "Event selection includes max. z-Vertex"}; - Configurable ConfEvtZvtx{"ConfEvtZvtx", 10.f, "Evt sel: Max. z-Vertex (cm)"}; - Configurable ConfEvtOfflineCheck{"ConfEvtOfflineCheck", false, "Evt sel: check for offline selection"}; + // --------------------------------> Configurables <------------------------------------ + // - Event selection cuts + // - Track selection cuts + // - Cluster shifts + // - HNM mass selection windows + // ------------------------------------------------------------------------------------- + // ---> Event selection + Configurable confEvtSelectZvtx{"confEvtSelectZvtx", true, "Event selection includes max. z-Vertex"}; + Configurable confEvtZvtx{"confEvtZvtx", 10.f, "Evt sel: Max. z-Vertex (cm)"}; + Configurable confEvtRequireSel8{"confEvtRequireSel8", false, "Evt sel: check for offline selection (sel8)"}; + + // ---> Track selection + Configurable> cfgPtCuts{"cfgPtCuts", {hnm::ptcutsTable[0], 1, 3, hnm::speciesName, hnm::pTCutsName}, "Track pT selections"}; + Configurable cfgTrkEta{"cfgTrkEta", 0.9, "Eta"}; + Configurable> cfgTPCNClustersMin{"cfgTPCNClustersMin", {hnm::nClusterMinTPC[0], 1, 1, std::vector{"TPCNClusMin"}, hnm::speciesName}, "Mininum of TPC Clusters"}; + Configurable cfgTrkTPCfCls{"cfgTrkTPCfCls", 0.83, "Minimum fraction of crossed rows over findable clusters"}; + Configurable cfgTrkTPCcRowsMin{"cfgTrkTPCcRowsMin", 70, "Minimum number of crossed TPC rows"}; + Configurable cfgTrkTPCsClsSharedFrac{"cfgTrkTPCsClsSharedFrac", 1.f, "Fraction of shared TPC clusters"}; + Configurable> cfgTrkITSnclsMin{"cfgTrkITSnclsMin", {hnm::nClusterMinITS[0], 1, 1, std::vector{"Cut"}, hnm::speciesName}, "Minimum number of ITS clusters"}; + Configurable cfgTrkDCAxyMax{"cfgTrkDCAxyMax", 0.15, "Maximum DCA_xy"}; + Configurable cfgTrkDCAzMax{"cfgTrkDCAzMax", 0.3, "Maximum DCA_z"}; + Configurable cfgTrkMaxChi2PerClusterTPC{"cfgTrkMaxChi2PerClusterTPC", 4.0f, "Minimal track selection: max allowed chi2 per TPC cluster"}; // 4.0 is default of global tracks on 20.01.2023 + Configurable cfgTrkMaxChi2PerClusterITS{"cfgTrkMaxChi2PerClusterITS", 36.0f, "Minimal track selection: max allowed chi2 per ITS cluster"}; // 36.0 is default of global tracks on 20.01.2023 + + Configurable> cfgPIDCuts{"cfgPIDCuts", {hnm::pidcutsTable[0], 1, hnm::kNPIDLimits, hnm::speciesName, hnm::pidCutsName}, "Femtopartner PID nsigma selections"}; // PID selections + + // ---> Configurables to allow for a shift in eta/phi of EMCal clusters to better align with extrapolated TPC tracks + Configurable cfgDoEMCShift{"cfgDoEMCShift", false, "Apply SM-wise shift in eta and phi to EMCal clusters to align with TPC tracks"}; + Configurable> cfgEMCEtaShift{"cfgEMCEtaShift", {0.f}, "values for SM-wise shift in eta to be added to EMCal clusters to align with TPC tracks"}; + Configurable> cfgEMCPhiShift{"cfgEMCPhiShift", {0.f}, "values for SM-wise shift in phi to be added to EMCal clusters to align with TPC tracks"}; + static const int nSMs = 20; + std::array emcEtaShift = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + std::array emcPhiShift = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + + // ---> Shift the omega/eta' mass based on the difference of the reconstructed mass of the pi0/eta to its PDG mass to reduce smearing caused by EMCal/PCM in photon measurement Configurable cfgHNMMassCorrection{"cfgHNMMassCorrection", 1, "Use GG PDG mass to correct HNM mass (0 = off, 1 = subDeltaPi0, 2 = subLambda)"}; - static constexpr float defaultMassWindows[4] = {0.1, 0.17, 0.5, 6.}; - Configurable> massWindowLightNeutralMesons{"massWindowLightNeutralMesons", {defaultMassWindows, 4, {"pi0_min", "pi0_max", "eta_min", "eta_max"}}, "Mass window for selected light neutral meson decay daughters"}; - Configurable ConfDoEMCShift{"ConfDoEMCShift", false, "Apply SM-wise shift in eta and phi to EMCal clusters to align with TPC tracks"}; - Configurable> ConfEMCEtaShift{"ConfEMCEtaShift", {0.f}, "values for SM-wise shift in eta to be added to EMCal clusters to align with TPC tracks"}; - Configurable> ConfEMCPhiShift{"ConfEMCPhiShift", {0.f}, "values for SM-wise shift in phi to be added to EMCal clusters to align with TPC tracks"}; - std::array EMCEtaShift = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - std::array EMCPhiShift = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + + // ---> Mass windows for the selection of heavy neutral mesons (also based on mass of their light neutral meson decay daughter) + static constexpr float DefaultMassWindows[2][4] = {{0., 0.4, 0.6, 1.}, {0.4, 0.8, 0.8, 1.2}}; + Configurable> cfgMassWindowOmega{"cfgMassWindowOmega", {DefaultMassWindows[0], 4, {"pi0_min", "pi0_max", "omega_min", "omega_max"}}, "Mass window for selected omegas and their decay pi0"}; + Configurable> cfgMassWindowEtaPrime{"cfgMassWindowEtaPrime", {DefaultMassWindows[1], 4, {"eta_min", "eta_max", "etaprime_min", "etaprime_max"}}, "Mass window for selected eta' and their decay eta"}; + + Configurable cfgMinGGPtOverHNMPt{"cfgMinGGPtOverHNMPt", 0., "Minimum ratio of the pT of the gamma gamma pair over the pT of the HNM (can be used to increase the S/B)"}; + + HistogramRegistry mHistManager{"HeavyNeutralMesonHistograms", {}, OutputObjHandlingPolicy::AnalysisObject}; + + // Prepare vectors for different species + std::vector vGGs; + std::vector vHNMs; + std::vector etaPrimeEMC, etaPrimePCM, omegaEMC, omegaPCM, proton, antiproton, deuteron, antideuteron, pion, antipion; + float mMassProton = constants::physics::MassProton; + float mMassDeuteron = constants::physics::MassDeuteron; + float mMassOmega = 0.782; + float mMassEtaPrime = 0.957; + float mMassPionCharged = constants::physics::MassPionCharged; + + Preslice perCollisionPCM = aod::v0photonkf::collisionId; + Preslice perCollisionEMC = aod::skimmedcluster::collisionId; template - bool isSelectedTrack(T const& track, HNMPID::TracksPID partSpecies) + bool isSelectedTrack(T const& track, hnm::TracksPID partSpecies) { - const auto pT = track.pt(); - const auto eta = track.eta(); - const auto tpcNClsF = track.tpcNClsFound(); - const auto tpcRClsC = track.tpcCrossedRowsOverFindableCls(); - const auto tpcNClsC = track.tpcNClsCrossedRows(); - const auto tpcNClsSFrac = track.tpcFractionSharedCls(); - const auto itsNCls = track.itsNCls(); - const auto dcaXY = track.dcaXY(); - const auto dcaZ = track.dcaZ(); - - if (pT < ConfPtCuts->get(partSpecies, "Pt min")) { + if (track.pt() < cfgPtCuts->get(partSpecies, "Pt min")) return false; - } - if (pT > ConfPtCuts->get(partSpecies, "Pt max")) { + if (track.pt() > cfgPtCuts->get(partSpecies, "Pt max")) return false; - } - if (std::abs(eta) > ConfTrkEta) { + if (std::abs(track.eta()) > cfgTrkEta) return false; - } - if (tpcNClsF < ConfTPCNClustersMin->get("TPCNClusMin", partSpecies)) { + if (track.tpcNClsFound() < cfgTPCNClustersMin->get("TPCNClusMin", partSpecies)) return false; - } - if (tpcRClsC < ConfTrkTPCfCls) { + if (track.tpcCrossedRowsOverFindableCls() < cfgTrkTPCfCls) return false; - } - if (tpcNClsC < ConfTrkTPCcRowsMin) { + if (track.tpcNClsCrossedRows() < cfgTrkTPCcRowsMin) return false; - } - if (tpcNClsSFrac > ConfTrkTPCsClsSharedFrac) { + if (track.tpcFractionSharedCls() > cfgTrkTPCsClsSharedFrac) return false; - } - if (itsNCls < ConfTrkITSnclsMin->get(static_cast(0), partSpecies)) { + if (track.itsNCls() < cfgTrkITSnclsMin->get(static_cast(0), partSpecies)) return false; - } - if (std::abs(dcaXY) > ConfTrkDCAxyMax) { + if (std::abs(track.dcaXY()) > cfgTrkDCAxyMax) return false; - } - if (std::abs(dcaZ) > ConfTrkDCAzMax) { + if (std::abs(track.dcaZ()) > cfgTrkDCAzMax) + return false; + if (track.tpcChi2NCl() > cfgTrkMaxChi2PerClusterTPC) + return false; + if (track.itsChi2NCl() > cfgTrkMaxChi2PerClusterITS) return false; - } return true; } template - bool isSelectedTrackPID(T const& track, HNMPID::TracksPID partSpecies) + bool isSelectedTrackPID(T const& track, hnm::TracksPID partSpecies) { bool isSelected = false; @@ -168,22 +186,15 @@ struct HeavyNeutralMeson { float nSigmaTrackTPCTOF = std::sqrt(std::pow(nSigmaTrackTPC, 2) + std::pow(nSigmaTrackTOF, 2)); - // check if track is selected - auto TPCmin = ConfPIDCuts->get(partSpecies, HNMPID::kTPCMin); - auto TPCmax = ConfPIDCuts->get(partSpecies, HNMPID::kTPCMax); - auto TPCTOFmax = ConfPIDCuts->get(partSpecies, HNMPID::kTPCTOF); - auto ITSmin = ConfPIDCuts->get(partSpecies, HNMPID::kITSmin); - auto ITSmax = ConfPIDCuts->get(partSpecies, HNMPID::kITSmax); - - if (track.p() <= ConfPtCuts->get(partSpecies, "P TOF thres")) { - if (nSigmaTrackTPC > TPCmin && - nSigmaTrackTPC < TPCmax && - nSigmaTrackITS > ITSmin && - nSigmaTrackITS < ITSmax) { + if (track.p() <= cfgPtCuts->get(partSpecies, "P TOF thres")) { + if (nSigmaTrackTPC > cfgPIDCuts->get(partSpecies, hnm::kTPCMin) && + nSigmaTrackTPC < cfgPIDCuts->get(partSpecies, hnm::kTPCMax) && + nSigmaTrackITS > cfgPIDCuts->get(partSpecies, hnm::kITSmin) && + nSigmaTrackITS < cfgPIDCuts->get(partSpecies, hnm::kITSmax)) { isSelected = true; } } else { - if (nSigmaTrackTPCTOF < TPCTOFmax) { + if (nSigmaTrackTPCTOF < cfgPIDCuts->get(partSpecies, hnm::kTPCTOF)) { isSelected = true; } } @@ -193,324 +204,289 @@ struct HeavyNeutralMeson { template bool isSelectedEvent(T const& col) { - if (ConfEvtSelectZvtx && std::abs(col.posZ()) > ConfEvtZvtx) { + if (confEvtSelectZvtx && std::abs(col.posZ()) > confEvtZvtx) { return false; } - if (ConfEvtOfflineCheck && !col.sel8()) { + if (confEvtRequireSel8 && !col.sel8()) { return false; } return true; } - // Circumvent missing of different phi mappings, enforce [0, 2 * M_PI] - // Tracks have domain [0, 2 * M_PI] - // TLorentVectors have domain [-M_PI, M_PI] - double translatePhi(double phi) - { - if (phi < 0) { - phi += 2 * M_PI; // Add 2 pi to make it positive - } - return phi; - } - - HistogramRegistry mHistManager{"HeavyNeutralMesonHistograms", {}, OutputObjHandlingPolicy::AnalysisObject}; - - std::vector vGGs; - std::vector vHNMs; - - emcal::Geometry* emcalGeom; - - // Prepare vectors for different species - std::vector pion, antipion; - void init(InitContext const&) { - emcalGeom = emcal::Geometry::GetInstanceFromRunNumber(300000); - auto hCollisionCounter = mHistManager.add("Event/hCollisionCounter", "Number of collisions;;#bf{#it{N}_{Coll}}", HistType::kTH1F, {{6, -0.5, 5.5}}); - hCollisionCounter->GetXaxis()->SetBinLabel(1, "all"); - hCollisionCounter->GetXaxis()->SetBinLabel(2, "kTVXinEMC"); - hCollisionCounter->GetXaxis()->SetBinLabel(3, "PCM #omega"); - hCollisionCounter->GetXaxis()->SetBinLabel(4, "EMC #omega"); - hCollisionCounter->GetXaxis()->SetBinLabel(5, "PCM #eta'"); - hCollisionCounter->GetXaxis()->SetBinLabel(6, "EMC #eta'"); - mHistManager.add("Event/nGGs", "Number of (selected) #gamma#gamma paris;#bf{#it{N}_{#gamma#gamma}};#bf{#it{N}_{#gamma#gamma}^{selected}}", HistType::kTH2F, {{51, -0.5, 50.5}, {51, -0.5, 50.5}}); - mHistManager.add("Event/nTracks", "Number of tracks;#bf{N_{tracks}};#bf{#it{N}_{Coll}}", HistType::kTH1F, {{51, -0.5, 50.5}}); mHistManager.add("Event/nHeavyNeutralMesons", "Number of (selected) HNM candidates;#bf{#it{N}_{HNM}};#bf{#it{N}_{HNM}^{selected}}", HistType::kTH2F, {{51, -0.5, 50.5}, {51, -0.5, 50.5}}); mHistManager.add("Event/nClustersVsV0s", "Number of clusters and V0s in the collision;#bf{#it{N}_{clusters}};#bf{#it{N}_{V0s}}", HistType::kTH2F, {{26, -0.5, 25.5}, {26, -0.5, 25.5}}); + mHistManager.add("Event/nEMCalEvents", "Number of collisions with a certain combination of EMCal triggers;;#bf{#it{N}_{collisions}}", HistType::kTH1F, {{5, -0.5, 4.5}}); + std::vector nEventTitles = {"Cells & kTVXinEMC", "Cells & L0", "Cells & !kTVXinEMC & !L0", "!Cells & kTVXinEMC", "!Cells & L0"}; + for (size_t iBin = 0; iBin < nEventTitles.size(); iBin++) + mHistManager.get(HIST("Event/nEMCalEvents"))->GetXaxis()->SetBinLabel(iBin + 1, nEventTitles[iBin].data()); + mHistManager.add("Event/fMultiplicityBefore", "Multiplicity of all processed events;#bf{#it{N}_{tracks}};#bf{#it{N}_{collisions}}", HistType::kTH1F, {{500, 0, 500}}); + mHistManager.add("Event/fMultiplicityAfter", "Multiplicity after event cuts;#bf{#it{N}_{tracks}};#bf{#it{N}_{collisions}}", HistType::kTH1F, {{500, 0, 500}}); + mHistManager.add("Event/fZvtxBefore", "Zvtx of all processed events;#bf{z_{vtx} (cm)};#bf{#it{N}_{collisions}}", HistType::kTH1F, {{500, -15, 15}}); + mHistManager.add("Event/fZvtxAfter", "Zvtx after event cuts;#bf{z_{vtx} (cm)};#bf{#it{N}_{collisions}}", HistType::kTH1F, {{500, -15, 15}}); mHistManager.add("GG/invMassVsPt_PCM", "Invariant mass and pT of gg candidates;#bf{#it{M}_{#gamma#gamma}};#bf{#it{pT}_{#gamma#gamma}}", HistType::kTH2F, {{400, 0., 0.8}, {250, 0., 25.}}); mHistManager.add("GG/invMassVsPt_PCMEMC", "Invariant mass and pT of gg candidates;#bf{#it{M}_{#gamma#gamma}};#bf{#it{pT}_{#gamma#gamma}}", HistType::kTH2F, {{400, 0., 0.8}, {250, 0., 25.}}); mHistManager.add("GG/invMassVsPt_EMC", "Invariant mass and pT of gg candidates;#bf{#it{M}_{#gamma#gamma}};#bf{#it{pT}_{#gamma#gamma}}", HistType::kTH2F, {{400, 0., 0.8}, {250, 0., 25.}}); - mHistManager.add("Omega/invMassVsPt_PCM", "Invariant mass and pT of omega meson candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{400, 0.6, 1.}, {250, 0., 25.}}); - mHistManager.add("Omega/invMassVsPt_PCMEMC", "Invariant mass and pT of omega meson candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{400, 0.6, 1.}, {250, 0., 25.}}); - mHistManager.add("Omega/invMassVsPt_EMC", "Invariant mass and pT of omega meson candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{400, 0.6, 1.}, {250, 0., 25.}}); - - mHistManager.add("EtaPrime/invMassVsPt_PCM", "Invariant mass and pT of eta' candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{400, 0.8, 1.2}, {250, 0., 25.}}); - mHistManager.add("EtaPrime/invMassVsPt_PCMEMC", "Invariant mass and pT of eta' candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{400, 0.8, 1.2}, {250, 0., 25.}}); - mHistManager.add("EtaPrime/invMassVsPt_EMC", "Invariant mass and pT of eta' candidates;#bf{#it{M}_{#pi^{+}#pi^{-}#gamma#gamma}};#bf{#it{pT}_{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH2F, {{400, 0.8, 1.2}, {250, 0., 25.}}); - - // event cuts - mHistManager.add("EventCuts/fMultiplicityBefore", "Multiplicity of all processed events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); - mHistManager.add("EventCuts/fMultiplicityAfter", "Multiplicity after event cuts;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); - mHistManager.add("EventCuts/fZvtxBefore", "Zvtx of all processed events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); - mHistManager.add("EventCuts/fZvtxAfter", "Zvtx after event cuts;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); + // Momentum correlations p vs p_TPC + mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationPos", "fMomCorrelation;#bf{#it{p} (GeV/#it{c})};#bf{#it{p}_{TPC} (GeV/#it{c})}", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); + mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationNeg", "fMomCorrelation;#bf{#it{p} (GeV/#it{c})};#bf{#it{p}_{TPC} (GeV/#it{c})}", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); - // mom correlations p vs pTPC - mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationPos", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); - mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationNeg", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); - - mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsPion", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{1000, 0.0f, 20.0f}, {1000, 0.0f, 20.0f}}}); - mHistManager.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsAntiPion", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{1000, 0.0f, 20.0f}, {1000, 0.0f, 20.0f}}}); - - // all tracks - mHistManager.add("TrackCuts/TracksBefore/fPtTrackBefore", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/TracksBefore/fEtaTrackBefore", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/TracksBefore/fPhiTrackBefore", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + // All tracks + mHistManager.add("TrackCuts/TracksBefore/fPtTrackBefore", "Transverse momentum of all processed tracks;#bf{#it{p}_{T} (GeV/#it{c})};#bf{#it{N}_{tracks}}", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("TrackCuts/TracksBefore/fEtaTrackBefore", "Pseudorapidity of all processed tracks;#eta;#bf{#it{N}_{tracks}}", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("TrackCuts/TracksBefore/fPhiTrackBefore", "Azimuthal angle of all processed tracks;#phi;#bf{#it{N}_{tracks}}", HistType::kTH1F, {{720, 0, constants::math::TwoPI}}); // TPC signal - mHistManager.add("TrackCuts/TPCSignal/fTPCSignal", "TPCSignal;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); - mHistManager.add("TrackCuts/TPCSignal/fTPCSignalP", "TPCSignalP;p (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); - // TPC signal anti - mHistManager.add("TrackCuts/TPCSignal/fTPCSignalAnti", "TPCSignal;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); - mHistManager.add("TrackCuts/TPCSignal/fTPCSignalAntiP", "TPCSignalP;p (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); - - // TPC signal particles - mHistManager.add("TrackCuts/TPCSignal/fTPCSignalPion", "fTPCSignalPion;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); - mHistManager.add("TrackCuts/TPCSignal/fTPCSignalAntiPion", "fTPCSignalAntiPion;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); - // pions - mHistManager.add("TrackCuts/Pion/fPPion", "Momentum of Pions at PV;p (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/Pion/fPTPCPion", "Momentum of Pions at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/Pion/fPtPion", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/Pion/fMomCorPionDif", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); - mHistManager.add("TrackCuts/Pion/fMomCorPionRatio", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); - mHistManager.add("TrackCuts/Pion/fEtaPion", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/Pion/fPhiPion", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - mHistManager.add("TrackCuts/Pion/fNsigmaTPCvsPPion", "NSigmaTPC Pion;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/Pion/fNsigmaTOFvsPPion", "NSigmaTOF Pion;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/Pion/fNsigmaTPCTOFvsPPion", "NSigmaTPCTOF Pion;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - - mHistManager.add("TrackCuts/Pion/fNsigmaTPCvsPPionP", "NSigmaTPC Pion P;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/Pion/fNsigmaTOFvsPPionP", "NSigmaTOF Pion P;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/Pion/fNsigmaTPCTOFvsPPionP", "NSigmaTPCTOF Pion P;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - - mHistManager.add("TrackCuts/Pion/fDCAxyPion", "fDCAxy Pion;DCA_{XY};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - mHistManager.add("TrackCuts/Pion/fDCAzPion", "fDCAz Pion;DCA_{Z};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - mHistManager.add("TrackCuts/Pion/fTPCsClsPion", "fTPCsCls Pion;TPC Shared Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - mHistManager.add("TrackCuts/Pion/fTPCcRowsPion", "fTPCcRows Pion;TPC Crossed Rows;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - mHistManager.add("TrackCuts/Pion/fTrkTPCfClsPion", "fTrkTPCfCls Pion;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {{500, 0.0f, 3.0f}}); - mHistManager.add("TrackCuts/Pion/fTPCnclsPion", "fTPCncls Pion;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - - // anti-pions - mHistManager.add("TrackCuts/AntiPion/fPtAntiPion", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/AntiPion/fMomCorAntiPionDif", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); - mHistManager.add("TrackCuts/AntiPion/fMomCorAntiPionRatio", "Momentum correlation;p_{reco} (GeV/c); |p_{TPC} - p_{reco}| (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); - mHistManager.add("TrackCuts/AntiPion/fEtaAntiPion", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/AntiPion/fPhiAntiPion", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - mHistManager.add("TrackCuts/AntiPion/fNsigmaTPCvsPAntiPion", "NSigmaTPC AntiPion;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/AntiPion/fNsigmaTOFvsPAntiPion", "NSigmaTOF AntiPion;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/AntiPion/fNsigmaTPCTOFvsPAntiPion", "NSigmaTPCTOF AntiPion;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - - mHistManager.add("TrackCuts/AntiPion/fNsigmaTPCvsPAntiPionP", "NSigmaTPC AntiPion P;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/AntiPion/fNsigmaTOFvsPAntiPionP", "NSigmaTOF AntiPion P;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - mHistManager.add("TrackCuts/AntiPion/fNsigmaTPCTOFvsPAntiPionP", "NSigmaTPCTOF AntiPion P;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - - mHistManager.add("TrackCuts/AntiPion/fDCAxyAntiPion", "fDCAxy AntiPion;DCA_{XY};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - mHistManager.add("TrackCuts/AntiPion/fDCAzAntiPion", "fDCAz AntiPion;DCA_{Z};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - mHistManager.add("TrackCuts/AntiPion/fTPCsClsAntiPion", "fTPCsCls AntiPion;TPC Shared Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - mHistManager.add("TrackCuts/AntiPion/fTPCcRowsAntiPion", "fTPCcRows AntiPion;TPC Crossed Rows;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - mHistManager.add("TrackCuts/AntiPion/fTrkTPCfClsAntiPion", "fTrkTPCfCls AntiPion;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {{500, 0.0f, 3.0f}}); - mHistManager.add("TrackCuts/AntiPion/fTPCnclsAntiPion", "fTPCncls AntiPion;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - - // HNM - // omega QA - // daughter pos before - mHistManager.add("TrackCuts/HMN/PosDaughter/fInvMass", "Invariant mass HMN Pos Daugh;M_{#pi};Entries", HistType::kTH1F, {{500, 0, 1}}); - mHistManager.add("TrackCuts/HMN/PosDaughter/fPt", "Transverse momentum HMN Pos Daugh tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/HMN/PosDaughter/fEta", "HMN Pos Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/HMN/PosDaughter/fPhi", "Azimuthal angle of HMN Pos Daugh tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - // daughter neg before - mHistManager.add("TrackCuts/HMN/NegDaughter/fInvMass", "Invariant mass HMN Neg Daugh;M_{#pi};Entries", HistType::kTH1F, {{500, 0, 1}}); - mHistManager.add("TrackCuts/HMN/NegDaughter/fPt", "Transverse momentum HMN Neg Daugh tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/HMN/NegDaughter/fEta", "HMN Neg Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/HMN/NegDaughter/fPhi", "Azimuthal angle of HMN Neg Daugh tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - // HMNCand tracks before - mHistManager.add("TrackCuts/HMN/fInvMass_tracks", "Invariant mass HMNCand;M_{#pi#pi#gammg#gamma};Entries", HistType::kTH1F, {{5000, 0, 5}}); - mHistManager.add("TrackCuts/HMN/fInvMassPt_tracks", "Invariant mass HMNCand;M_{#pi^{+}#pi^{-}};pT_{#pi^{+}#pi^{-}}", HistType::kTH2F, {{5000, 0, 5}, {500, 0, 10}}); - mHistManager.add("TrackCuts/HMN/fPt_tracks", "Transverse momentum HMNCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/HMN/fEta_tracks", "Pseudorapidity of HMNCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/HMN/fPhi_tracks", "Azimuthal angle of HMNCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - mHistManager.add("TrackCuts/HMN/PCM/fInvMass", "Invariant mass HMNCand;M_{#pi#pi#gammg#gamma};Entries", HistType::kTH1F, {{5000, 0, 5}}); - mHistManager.add("TrackCuts/HMN/PCM/fPt", "Transverse momentum HMNCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/HMN/PCM/fEta", "Pseudorapidity of HMNCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/HMN/PCM/fPhi", "Azimuthal angle of HMNCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - mHistManager.add("TrackCuts/HMN/EMC/fInvMass", "Invariant mass HMNCand;M_{#pi#pi#gammg#gamma};Entries", HistType::kTH1F, {{5000, 0, 5}}); - mHistManager.add("TrackCuts/HMN/EMC/fPt", "Transverse momentum HMNCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/HMN/EMC/fEta", "Pseudorapidity of HMNCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/HMN/EMC/fPhi", "Azimuthal angle of HMNCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - mHistManager.add("TrackCuts/HMN/PCMEMC/fInvMass", "Invariant mass HMNCand;M_{#pi#pi#gammg#gamma};Entries", HistType::kTH1F, {{5000, 0, 5}}); - mHistManager.add("TrackCuts/HMN/PCMEMC/fPt", "Transverse momentum HMNCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - mHistManager.add("TrackCuts/HMN/PCMEMC/fEta", "Pseudorapidity of HMNCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - mHistManager.add("TrackCuts/HMN/PCMEMC/fPhi", "Azimuthal angle of HMNCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - - if (ConfDoEMCShift.value) { - for (int iSM = 0; iSM < 20; iSM++) { - EMCEtaShift[iSM] = ConfEMCEtaShift.value[iSM]; - EMCPhiShift[iSM] = ConfEMCPhiShift.value[iSM]; - LOG(info) << "SM-wise shift in eta/phi for SM " << iSM << ": " << EMCEtaShift[iSM] << " / " << EMCPhiShift[iSM]; + mHistManager.add("TrackCuts/TPCSignal/fTPCSignalTPCP", "TPCSignal;#bf{#it{p}_{TPC} (GeV/#it{c})};dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); + mHistManager.add("TrackCuts/TPCSignal/fTPCSignal", "TPCSignalP;#bf{#it{p} (GeV/#it{c})};dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); + // TPC signal antiparticles (negative charge) + mHistManager.add("TrackCuts/TPCSignal/fTPCSignalAntiTPCP", "TPCSignal;#bf{#it{p}_{TPC} (GeV/#it{c})};dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); + mHistManager.add("TrackCuts/TPCSignal/fTPCSignalAnti", "TPCSignalP;#bf{#it{p} (GeV/#it{c})};dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); + + const int nTrackSpecies = 2; // x2 because of anti particles + const char* particleSpecies[nTrackSpecies] = {"Pion", "AntiPion"}; + const char* particleSpeciesLatex[nTrackSpecies] = {"#pi^{+}", "#pi^{-}"}; + + for (int iParticle = 0; iParticle < nTrackSpecies; iParticle++) { + mHistManager.add(Form("TrackCuts/TracksBefore/fMomCorrelationAfterCuts%s", particleSpecies[iParticle]), "fMomCorrelation;#bf{#it{p} (GeV/#it{c})};#bf{#it{p}_{TPC} (GeV/#it{c})}", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); + mHistManager.add(Form("TrackCuts/TPCSignal/fTPCSignal%s", particleSpecies[iParticle]), Form("%s TPC energy loss;#bf{#it{p}_{TPC}^{%s} (GeV/#it{c})};dE/dx", particleSpecies[iParticle], particleSpeciesLatex[iParticle]), {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); + + mHistManager.add(Form("TrackCuts/%s/fP", particleSpecies[iParticle]), Form("%s momentum at PV;#bf{#it{p}^{%s} (GeV/#it{c})};#bf{#it{N}^{%s}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle]), HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add(Form("TrackCuts/%s/fPt", particleSpecies[iParticle]), Form("%s transverse momentum;#bf{#it{p}_{T}^{%s} (GeV/#it{c})};#bf{#it{N}^{%s}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle]), HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add(Form("TrackCuts/%s/fMomCorDif", particleSpecies[iParticle]), Form("Momentum correlation;#bf{#it{p}^{%s} (GeV/#it{c})};#bf{#it{p}_{TPC}^{%s} - #it{p}^{%s} (GeV/#it{c})}", particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle]), {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); + mHistManager.add(Form("TrackCuts/%s/fMomCorRatio", particleSpecies[iParticle]), Form("Relative momentum correlation;#bf{#it{p}^{%s} (GeV/#it{c})};#bf{#it{p}_{TPC}^{%s} - #it{p}^{%s} / #it{p}^{%s}}", particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle]), {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); + mHistManager.add(Form("TrackCuts/%s/fEta", particleSpecies[iParticle]), Form("%s pseudorapidity distribution;#eta;#bf{#it{N}^{%s}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle]), HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add(Form("TrackCuts/%s/fPhi", particleSpecies[iParticle]), Form("%s azimuthal angle distribution;#phi;#bf{#it{N}^{%s}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle]), HistType::kTH1F, {{720, 0, constants::math::TwoPI}}); + + mHistManager.add(Form("TrackCuts/%s/fNsigmaTPCvsTPCP", particleSpecies[iParticle]), Form("NSigmaTPC %s;#bf{#it{p}_{TPC}^{%s} (GeV/#it{c})};n#sigma_{TPC}^{%s}", particleSpecies[iParticle], particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle]), {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add(Form("TrackCuts/%s/fNsigmaTOFvsTPCP", particleSpecies[iParticle]), Form("NSigmaTOF %s;#bf{#it{p}_{TPC}^{%s} (GeV/#it{c})};n#sigma_{TOF}^{%s}", particleSpecies[iParticle], particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle]), {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add(Form("TrackCuts/%s/fNsigmaTPCTOFvsTPCP", particleSpecies[iParticle]), Form("NSigmaTPCTOF %s;#bf{#it{p}_{TPC}^{%s} (GeV/#it{c})};n#sigma_{comb}^{%s}", particleSpecies[iParticle], particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle]), {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); + mHistManager.add(Form("TrackCuts/%s/fNsigmaITSvsP", particleSpecies[iParticle]), Form("NSigmaITS %s;#bf{#it{p}^{%s} (GeV/#it{c})};n#sigma_{ITS}^{%s}", particleSpecies[iParticle], particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle]), {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add(Form("TrackCuts/%s/fNsigmaTPCvsP", particleSpecies[iParticle]), Form("NSigmaTPC %s P;#bf{#it{p}^{%s} (GeV/#it{c})};n#sigma_{TPC}^{%s}", particleSpecies[iParticle], particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle]), {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add(Form("TrackCuts/%s/fNsigmaTOFvsP", particleSpecies[iParticle]), Form("NSigmaTOF %s P;#bf{#it{p}^{%s} (GeV/#it{c})};n#sigma_{TOF}^{%s}", particleSpecies[iParticle], particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle]), {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + mHistManager.add(Form("TrackCuts/%s/fNsigmaTPCTOFvsP", particleSpecies[iParticle]), Form("NSigmaTPCTOF %s P;#bf{#it{p}^{%s} (GeV/#it{c})};n#sigma_{comb}^{%s}", particleSpecies[iParticle], particleSpeciesLatex[iParticle], particleSpeciesLatex[iParticle]), {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); + + mHistManager.add(Form("TrackCuts/%s/fDCAxy", particleSpecies[iParticle]), Form("fDCAxy %s;#bf{DCA_{xy}};#bf{#it{N}^{%s}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle]), HistType::kTH1F, {{500, -0.5f, 0.5f}}); + mHistManager.add(Form("TrackCuts/%s/fDCAz", particleSpecies[iParticle]), Form("fDCAz %s;#bf{DCA_{z}};#bf{#it{N}^{%s}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle]), HistType::kTH1F, {{500, -0.5f, 0.5f}}); + mHistManager.add(Form("TrackCuts/%s/fTPCsCls", particleSpecies[iParticle]), Form("fTPCsCls %s;#bf{TPC Shared Clusters};#bf{#it{N}^{%s}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle]), HistType::kTH1F, {{163, -1.0f, 162.0f}}); + mHistManager.add(Form("TrackCuts/%s/fTPCcRows", particleSpecies[iParticle]), Form("fTPCcRows %s;#bf{TPC Crossed Rows};#bf{#it{N}^{%s}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle]), HistType::kTH1F, {{163, -1.0f, 162.0f}}); + mHistManager.add(Form("TrackCuts/%s/fTrkTPCfCls", particleSpecies[iParticle]), Form("fTrkTPCfCls %s;#bf{TPC Findable/CrossedRows};#bf{#it{N}^{%s}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle]), HistType::kTH1F, {{500, 0.0f, 3.0f}}); + mHistManager.add(Form("TrackCuts/%s/fTPCncls", particleSpecies[iParticle]), Form("fTPCncls %s;#bf{TPC Clusters};#bf{#it{N}^{%s}}", particleSpecies[iParticle], particleSpeciesLatex[iParticle]), HistType::kTH1F, {{163, -1.0f, 162.0f}}); + } + + // --> HNM QA + // pi+ daughter + mHistManager.add("HNM/Before/PosDaughter/fInvMass", "Invariant mass HMN Pos Daugh;#bf{#it{M}^{#pi^{+}} (GeV/#it{c}^{2})};#bf{#it{N}^{#pi^{+}}}", HistType::kTH1F, {{200, 0, 0.2}}); + mHistManager.add("HNM/Before/PosDaughter/fPt", "Transverse momentum HMN Pos Daugh tracks;#bf{#it{p}_{T} (GeV/#it{c})};#bf{#it{N}^{#pi^{+}}}", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("HNM/Before/PosDaughter/fEta", "HMN Pos Daugh Eta;#eta;#bf{#it{N}^{#pi^{+}}}", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("HNM/Before/PosDaughter/fPhi", "Azimuthal angle of HMN Pos Daugh tracks;#phi;#bf{#it{N}^{#pi^{+}}}", HistType::kTH1F, {{720, 0, constants::math::TwoPI}}); + // pi- daughter + mHistManager.add("HNM/Before/NegDaughter/fInvMass", "Invariant mass HMN Neg Daugh;#bf{#it{M}^{#pi^{-}} (GeV/#it{c}^{2})};#bf{#it{N}^{#pi^{-}}}", HistType::kTH1F, {{200, 0, 0.2}}); + mHistManager.add("HNM/Before/NegDaughter/fPt", "Transverse momentum HMN Neg Daugh tracks;#bf{#it{p}_{T} (GeV/#it{c})};#bf{#it{N}^{#pi^{-}}}", HistType::kTH1F, {{500, 0, 10}}); + mHistManager.add("HNM/Before/NegDaughter/fEta", "HMN Neg Daugh Eta;#eta;#bf{#it{N}^{#pi^{-}}}", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("HNM/Before/NegDaughter/fPhi", "Azimuthal angle of HMN Neg Daugh tracks;#phi;#bf{#it{N}^{#pi^{-}}}", HistType::kTH1F, {{720, 0, constants::math::TwoPI}}); + // Properties of the pi+pi- pair + mHistManager.add("HNM/Before/PiPlPiMi/fInvMassVsPt", "Invariant mass and pT of #pi^+pi^- pairs;#bf{#it{M}^{#pi^{+}#pi^{-}} (GeV/#it{c}^{2})};#bf{#it{p}_{T}^{#pi^{+}#pi^{-}} (GeV/#it{c})}", HistType::kTH2F, {{400, 0.2, 1.}, {250, 0., 25.}}); + mHistManager.add("HNM/Before/PiPlPiMi/fEta", "Pseudorapidity of HMNCand;#eta;#bf{#it{N}^{#pi^{+}#pi^{-}}}", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("HNM/Before/PiPlPiMi/fPhi", "Azimuthal angle of HMNCand;#phi;#bf{#it{N}^{#pi^{+}#pi^{-}}}", HistType::kTH1F, {{720, 0, constants::math::TwoPI}}); + + for (const auto& BeforeAfterString : {"Before", "After"}) { + for (const auto& iHNM : {"Omega", "EtaPrime"}) { + for (const auto& MethodString : {"PCM", "EMC"}) { + mHistManager.add(Form("HNM/%s/%s/%s/fInvMassVsPt", BeforeAfterString, iHNM, MethodString), "Invariant mass and pT of heavy neutral meson candidates;#bf{#it{M}^{#pi^{+}#pi^{-}#gamma#gamma} (GeV/#it{c}^{2})};#bf{#it{p}_{T}^{#pi^{+}#pi^{-}#gamma#gamma} (GeV/#it{c})}", HistType::kTH2F, {{600, 0.6, 1.2}, {250, 0., 25.}}); + mHistManager.add(Form("HNM/%s/%s/%s/fEta", BeforeAfterString, iHNM, MethodString), "Pseudorapidity of HNM candidate;#eta;#bf{#it{N}^{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add(Form("HNM/%s/%s/%s/fPhi", BeforeAfterString, iHNM, MethodString), "Azimuthal angle of HNM candidate;#phi;#bf{#it{N}^{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH1F, {{720, 0, constants::math::TwoPI}}); + } + } + } + mHistManager.add("HNM/Before/Omega/PCMEMC/fInvMassVsPt", "Invariant mass and pT of omega meson candidates;#bf{#it{M}^{#pi^{+}#pi^{-}#gamma#gamma} (GeV/#it{c}^{2})};#bf{#it{p}_{T}^{#pi^{+}#pi^{-}#gamma#gamma} (GeV/#it{c})}", HistType::kTH2F, {{600, 0.6, 1.2}, {250, 0., 25.}}); + mHistManager.add("HNM/Before/Omega/PCMEMC/fEta", "Pseudorapidity of HMNCand;#eta;#bf{#it{N}^{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("HNM/Before/Omega/PCMEMC/fPhi", "Azimuthal angle of HMNCand;#phi;#bf{#it{N}^{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH1F, {{720, 0, constants::math::TwoPI}}); + mHistManager.add("HNM/Before/EtaPrime/PCMEMC/fInvMassVsPt", "Invariant mass and pT of eta' meson candidates;#bf{#it{M}^{#pi^{+}#pi^{-}#gamma#gamma} (GeV/#it{c}^{2})};#bf{#it{p}_{T}^{#pi^{+}#pi^{-}#gamma#gamma} (GeV/#it{c})}", HistType::kTH2F, {{600, 0.8, 1.2}, {250, 0., 25.}}); + mHistManager.add("HNM/Before/EtaPrime/PCMEMC/fEta", "Pseudorapidity of HMNCand;#eta;#bf{#it{N}^{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH1F, {{500, -2, 2}}); + mHistManager.add("HNM/Before/EtaPrime/PCMEMC/fPhi", "Azimuthal angle of HMNCand;#phi;#bf{#it{N}^{#pi^{+}#pi^{-}#gamma#gamma}}", HistType::kTH1F, {{720, 0, constants::math::TwoPI}}); + + if (cfgDoEMCShift.value) { + for (int iSM = 0; iSM < nSMs; iSM++) { + emcEtaShift[iSM] = cfgEMCEtaShift.value[iSM]; + emcPhiShift[iSM] = cfgEMCPhiShift.value[iSM]; + LOG(info) << "SM-wise shift in eta/phi for SM " << iSM << ": " << emcEtaShift[iSM] << " / " << emcPhiShift[iSM]; } } } - Preslice perCollision_pcm = aod::v0photonkf::collisionId; - Preslice perCollision_emc = aod::skimmedcluster::collisionId; void process(aod::MyCollision const& collision, aod::MyBCs const&, aod::SkimEMCClusters const& clusters, aod::V0PhotonsKF const& v0s, aod::SelectedTracks const& tracks) { // inlcude ITS PID information auto tracksWithItsPid = soa::Attach(tracks); - mHistManager.fill(HIST("Event/hCollisionCounter"), 0.); - // QA all evts - mHistManager.fill(HIST("EventCuts/fMultiplicityBefore"), collision.multNTracksPV()); - mHistManager.fill(HIST("EventCuts/fZvtxBefore"), collision.posZ()); + mHistManager.fill(HIST("Event/fMultiplicityBefore"), collision.multNTracksPV()); + mHistManager.fill(HIST("Event/fZvtxBefore"), collision.posZ()); // Ensure evts are consistent with Sel8 and Vtx-z selection - if (!isSelectedEvent(collision)) { + if (!isSelectedEvent(collision)) return; - } // QA accepted evts - mHistManager.fill(HIST("EventCuts/fMultiplicityAfter"), collision.multNTracksPV()); - mHistManager.fill(HIST("EventCuts/fZvtxAfter"), collision.posZ()); + mHistManager.fill(HIST("Event/fMultiplicityAfter"), collision.multNTracksPV()); + mHistManager.fill(HIST("Event/fZvtxAfter"), collision.posZ()); // clean vecs - // Pions for HNM pion.clear(); antipion.clear(); vHNMs.clear(); // vGGs vector is cleared in reconstructGGs. - if (collision.foundBC_as().alias_bit(kTVXinEMC)) { - mHistManager.fill(HIST("Event/hCollisionCounter"), 1.); - } - - auto v0sInThisCollision = v0s.sliceBy(perCollision_pcm, collision.globalIndex()); - auto clustersInThisCollision = clusters.sliceBy(perCollision_emc, collision.globalIndex()); - + // ---------------------------------> EMCal event QA <---------------------------------- + // - Fill Event/nEMCalEvents histogram for EMCal event QA + // ------------------------------------------------------------------------------------- + bool bcHasEMCCells = collision.isemcreadout(); + bool iskTVXinEMC = collision.foundBC_as().alias_bit(kTVXinEMC); + bool isL0Triggered = collision.foundBC_as().alias_bit(kEMC7) || collision.foundBC_as().alias_bit(kEG1) || collision.foundBC_as().alias_bit(kEG2); + + if (bcHasEMCCells && iskTVXinEMC) + mHistManager.fill(HIST("Event/nEMCalEvents"), 0); + if (bcHasEMCCells && isL0Triggered) + mHistManager.fill(HIST("Event/nEMCalEvents"), 1); + if (bcHasEMCCells && !iskTVXinEMC && !isL0Triggered) + mHistManager.fill(HIST("Event/nEMCalEvents"), 2); + if (!bcHasEMCCells && iskTVXinEMC) + mHistManager.fill(HIST("Event/nEMCalEvents"), 3); + if (!bcHasEMCCells && isL0Triggered) + mHistManager.fill(HIST("Event/nEMCalEvents"), 4); + + // --------------------------------> Process Photons <---------------------------------- + // - Slice clusters and V0s by collision ID to get the ones in this collision + // - Store the clusters and V0s in the vGammas vector + // - Reconstruct gamma-gamma pairs + // ------------------------------------------------------------------------------------- + auto v0sInThisCollision = v0s.sliceBy(perCollisionPCM, collision.globalIndex()); + auto clustersInThisCollision = clusters.sliceBy(perCollisionEMC, collision.globalIndex()); mHistManager.fill(HIST("Event/nClustersVsV0s"), clustersInThisCollision.size(), v0sInThisCollision.size()); - mHistManager.fill(HIST("Event/nTracks"), tracksWithItsPid.size()); std::vector vGammas; - hnmutilities::storeGammasInVector(clustersInThisCollision, v0sInThisCollision, vGammas, EMCEtaShift, EMCPhiShift); + hnmutilities::storeGammasInVector(clustersInThisCollision, v0sInThisCollision, vGammas, emcEtaShift, emcPhiShift); hnmutilities::reconstructGGs(vGammas, vGGs); vGammas.clear(); processGGs(vGGs); - bool isPion = false; - + // ------------------------------> Loop over all tracks <------------------------------- + // - Sort them into vectors based on PID ((anti)protons, (anti)deuterons, (anti)pions) + // - Fill QA histograms for all tracks and per particle species + // ------------------------------------------------------------------------------------- for (const auto& track : tracksWithItsPid) { - // General QA mHistManager.fill(HIST("TrackCuts/TracksBefore/fPtTrackBefore"), track.pt()); mHistManager.fill(HIST("TrackCuts/TracksBefore/fEtaTrackBefore"), track.eta()); mHistManager.fill(HIST("TrackCuts/TracksBefore/fPhiTrackBefore"), track.phi()); - // Fill PID info - if (track.sign() > 0) { - mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignal"), track.tpcInnerParam(), track.tpcSignal()); - mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalP"), track.p(), track.tpcSignal()); + if (track.sign() > 0) { // All particles (positive electric charge) + mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalTPCP"), track.tpcInnerParam(), track.tpcSignal()); + mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignal"), track.p(), track.tpcSignal()); mHistManager.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationPos"), track.p(), track.tpcInnerParam()); } - if (track.sign() < 0) { - mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAnti"), track.tpcInnerParam(), track.tpcSignal()); - mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAntiP"), track.p(), track.tpcSignal()); + if (track.sign() < 0) { // All anti-particles (negative electric charge) + mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAntiTPCP"), track.tpcInnerParam(), track.tpcSignal()); + mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAnti"), track.p(), track.tpcSignal()); mHistManager.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationNeg"), track.p(), track.tpcInnerParam()); } - isPion = (isSelectedTrackPID(track, HNMPID::kPion) && isSelectedTrack(track, HNMPID::kPion)); + // For each track, check if it fulfills track and PID criteria to be identified as a proton, deuteron or pion + bool isPion = (isSelectedTrackPID(track, hnm::kPion) && isSelectedTrack(track, hnm::kPion)); - if (isPion) { - if (track.sign() > 0) { // part - pion.emplace_back(track.pt(), track.eta(), track.phi(), o2::constants::physics::MassPionCharged); + if (track.sign() > 0) { // Positive charge -> Particles + if (isPion) { + pion.emplace_back(track.pt(), track.eta(), track.phi(), mMassPionCharged); mHistManager.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationAfterCutsPion"), track.p(), track.tpcInnerParam()); - mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalPion"), track.tpcInnerParam(), track.tpcSignal()); - mHistManager.fill(HIST("TrackCuts/Pion/fPPion"), track.p()); - mHistManager.fill(HIST("TrackCuts/Pion/fPTPCPion"), track.tpcInnerParam()); - mHistManager.fill(HIST("TrackCuts/Pion/fPtPion"), track.pt()); - mHistManager.fill(HIST("TrackCuts/Pion/fMomCorPionDif"), track.p(), track.tpcInnerParam() - track.p()); - mHistManager.fill(HIST("TrackCuts/Pion/fMomCorPionRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); - mHistManager.fill(HIST("TrackCuts/Pion/fEtaPion"), track.eta()); - mHistManager.fill(HIST("TrackCuts/Pion/fPhiPion"), track.phi()); - mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTPCvsPPion"), track.tpcInnerParam(), track.tpcNSigmaPi()); - mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTOFvsPPion"), track.tpcInnerParam(), track.tofNSigmaPi()); + + mHistManager.fill(HIST("TrackCuts/Pion/fP"), track.p()); + mHistManager.fill(HIST("TrackCuts/Pion/fPt"), track.pt()); + mHistManager.fill(HIST("TrackCuts/Pion/fMomCorDif"), track.p(), track.tpcInnerParam() - track.p()); + mHistManager.fill(HIST("TrackCuts/Pion/fMomCorRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + mHistManager.fill(HIST("TrackCuts/Pion/fEta"), track.eta()); + mHistManager.fill(HIST("TrackCuts/Pion/fPhi"), track.phi()); + + mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTPCvsTPCP"), track.tpcInnerParam(), track.tpcNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTOFvsTPCP"), track.tpcInnerParam(), track.tofNSigmaPi()); auto nSigmaTrackTPCTOF = std::sqrt(std::pow(track.tpcNSigmaPi(), 2) + std::pow(track.tofNSigmaPi(), 2)); - mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTPCTOFvsPPion"), track.tpcInnerParam(), std::sqrt(std::pow(track.tpcNSigmaPi() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPi() - nSigmaTrackTPCTOF, 2))); - - mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTPCvsPPionP"), track.p(), track.tpcNSigmaPi()); - mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTOFvsPPionP"), track.p(), track.tofNSigmaPi()); - mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTPCTOFvsPPionP"), track.p(), std::sqrt(std::pow(track.tpcNSigmaPi() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPi() - nSigmaTrackTPCTOF, 2))); - - mHistManager.fill(HIST("TrackCuts/Pion/fDCAxyPion"), track.dcaXY()); - mHistManager.fill(HIST("TrackCuts/Pion/fDCAzPion"), track.dcaZ()); - mHistManager.fill(HIST("TrackCuts/Pion/fTPCsClsPion"), track.tpcNClsShared()); - mHistManager.fill(HIST("TrackCuts/Pion/fTPCcRowsPion"), track.tpcNClsCrossedRows()); - mHistManager.fill(HIST("TrackCuts/Pion/fTrkTPCfClsPion"), track.tpcCrossedRowsOverFindableCls()); - mHistManager.fill(HIST("TrackCuts/Pion/fTPCnclsPion"), track.tpcNClsFound()); - } else { // antipart - antipion.emplace_back(track.pt(), track.eta(), track.phi(), o2::constants::physics::MassPionCharged); + mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTPCTOFvsTPCP"), track.tpcInnerParam(), std::sqrt(std::pow(track.tpcNSigmaPi() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPi() - nSigmaTrackTPCTOF, 2))); + mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaITSvsP"), track.p(), track.itsNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTPCvsP"), track.p(), track.tpcNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTOFvsP"), track.p(), track.tofNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/Pion/fNsigmaTPCTOFvsP"), track.p(), std::sqrt(std::pow(track.tpcNSigmaPi() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPi() - nSigmaTrackTPCTOF, 2))); + + mHistManager.fill(HIST("TrackCuts/Pion/fDCAxy"), track.dcaXY()); + mHistManager.fill(HIST("TrackCuts/Pion/fDCAz"), track.dcaZ()); + mHistManager.fill(HIST("TrackCuts/Pion/fTPCsCls"), track.tpcNClsShared()); + mHistManager.fill(HIST("TrackCuts/Pion/fTPCcRows"), track.tpcNClsCrossedRows()); + mHistManager.fill(HIST("TrackCuts/Pion/fTrkTPCfCls"), track.tpcCrossedRowsOverFindableCls()); + mHistManager.fill(HIST("TrackCuts/Pion/fTPCncls"), track.tpcNClsFound()); + } + } else { // Negative charge -> Anti-particles + if (isPion) { + antipion.emplace_back(track.pt(), track.eta(), track.phi(), mMassPionCharged); mHistManager.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationAfterCutsAntiPion"), track.p(), track.tpcInnerParam()); - mHistManager.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAntiPion"), track.tpcInnerParam(), track.tpcSignal()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fPtAntiPion"), track.pt()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fMomCorAntiPionDif"), track.p(), track.tpcInnerParam() - track.p()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fMomCorAntiPionRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fEtaAntiPion"), track.eta()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fPhiAntiPion"), track.phi()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCvsPAntiPion"), track.tpcInnerParam(), track.tpcNSigmaPi()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTOFvsPAntiPion"), track.tpcInnerParam(), track.tofNSigmaPi()); + + mHistManager.fill(HIST("TrackCuts/AntiPion/fP"), track.p()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fPt"), track.pt()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fMomCorDif"), track.p(), track.tpcInnerParam() - track.p()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fMomCorRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fEta"), track.eta()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fPhi"), track.phi()); + + mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCvsTPCP"), track.tpcInnerParam(), track.tpcNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTOFvsTPCP"), track.tpcInnerParam(), track.tofNSigmaPi()); auto nSigmaTrackTPCTOF = std::sqrt(std::pow(track.tpcNSigmaPi(), 2) + std::pow(track.tofNSigmaPi(), 2)); - mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCTOFvsPAntiPion"), track.tpcInnerParam(), std::sqrt(std::pow(track.tpcNSigmaPi() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPi() - nSigmaTrackTPCTOF, 2))); - - mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCvsPAntiPionP"), track.p(), track.tpcNSigmaPi()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTOFvsPAntiPionP"), track.p(), track.tofNSigmaPi()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCTOFvsPAntiPionP"), track.p(), std::sqrt(std::pow(track.tpcNSigmaPi() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPi() - nSigmaTrackTPCTOF, 2))); - - mHistManager.fill(HIST("TrackCuts/AntiPion/fDCAxyAntiPion"), track.dcaXY()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fDCAzAntiPion"), track.dcaZ()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fTPCsClsAntiPion"), track.tpcNClsShared()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fTPCcRowsAntiPion"), track.tpcNClsCrossedRows()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fTrkTPCfClsAntiPion"), track.tpcCrossedRowsOverFindableCls()); - mHistManager.fill(HIST("TrackCuts/AntiPion/fTPCnclsAntiPion"), track.tpcNClsFound()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCTOFvsTPCP"), track.tpcInnerParam(), std::sqrt(std::pow(track.tpcNSigmaPi() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPi() - nSigmaTrackTPCTOF, 2))); + mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaITSvsP"), track.p(), track.itsNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCvsP"), track.p(), track.tpcNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTOFvsP"), track.p(), track.tofNSigmaPi()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCTOFvsP"), track.p(), std::sqrt(std::pow(track.tpcNSigmaPi() - nSigmaTrackTPCTOF, 2) + std::pow(track.tofNSigmaPi() - nSigmaTrackTPCTOF, 2))); + + mHistManager.fill(HIST("TrackCuts/AntiPion/fDCAxy"), track.dcaXY()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fDCAz"), track.dcaZ()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fTPCsCls"), track.tpcNClsShared()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fTPCcRows"), track.tpcNClsCrossedRows()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fTrkTPCfCls"), track.tpcCrossedRowsOverFindableCls()); + mHistManager.fill(HIST("TrackCuts/AntiPion/fTPCncls"), track.tpcNClsFound()); } } } - // reconstruct HMN candidates + // -------------------------> Reconstruct HNM candidates <------------------------------ + // - Based on the previously filled (anti)pion vectors + // - Fill QA histograms for kinematics of the pions and their combinations + // ------------------------------------------------------------------------------------- for (const auto& posPion : pion) { for (const auto& negPion : antipion) { - hnmutilities::reconstructHeavyNeutralMesons(posPion, negPion, vGGs, vHNMs); - - ROOT::Math::PtEtaPhiMVector temp = posPion + negPion; - - mHistManager.fill(HIST("TrackCuts/HMN/fInvMass_tracks"), temp.M()); - mHistManager.fill(HIST("TrackCuts/HMN/fPt_tracks"), temp.pt()); - mHistManager.fill(HIST("TrackCuts/HMN/fEta_tracks"), temp.eta()); - mHistManager.fill(HIST("TrackCuts/HMN/fPhi_tracks"), translatePhi(temp.phi())); - - mHistManager.fill(HIST("TrackCuts/HMN/PosDaughter/fInvMass"), posPion.M()); - mHistManager.fill(HIST("TrackCuts/HMN/PosDaughter/fPt"), posPion.pt()); - mHistManager.fill(HIST("TrackCuts/HMN/PosDaughter/fEta"), posPion.eta()); - mHistManager.fill(HIST("TrackCuts/HMN/PosDaughter/fPhi"), translatePhi(posPion.phi())); - - mHistManager.fill(HIST("TrackCuts/HMN/NegDaughter/fInvMass"), negPion.M()); - mHistManager.fill(HIST("TrackCuts/HMN/NegDaughter/fPt"), negPion.pt()); - mHistManager.fill(HIST("TrackCuts/HMN/NegDaughter/fEta"), negPion.eta()); - mHistManager.fill(HIST("TrackCuts/HMN/NegDaughter/fPhi"), translatePhi(negPion.phi())); + ROOT::Math::PtEtaPhiMVector vecPiPlPiMi = posPion + negPion; + hnmutilities::reconstructHeavyNeutralMesons(vecPiPlPiMi, vGGs, vHNMs); + + mHistManager.fill(HIST("HNM/Before/PiPlPiMi/fInvMassVsPt"), vecPiPlPiMi.M(), vecPiPlPiMi.pt()); + mHistManager.fill(HIST("HNM/Before/PiPlPiMi/fEta"), vecPiPlPiMi.eta()); + mHistManager.fill(HIST("HNM/Before/PiPlPiMi/fPhi"), RecoDecay::constrainAngle(vecPiPlPiMi.phi())); + + mHistManager.fill(HIST("HNM/Before/PosDaughter/fInvMass"), posPion.M()); + mHistManager.fill(HIST("HNM/Before/PosDaughter/fPt"), posPion.pt()); + mHistManager.fill(HIST("HNM/Before/PosDaughter/fEta"), posPion.eta()); + mHistManager.fill(HIST("HNM/Before/PosDaughter/fPhi"), RecoDecay::constrainAngle(posPion.phi())); + + mHistManager.fill(HIST("HNM/Before/NegDaughter/fInvMass"), negPion.M()); + mHistManager.fill(HIST("HNM/Before/NegDaughter/fPt"), negPion.pt()); + mHistManager.fill(HIST("HNM/Before/NegDaughter/fEta"), negPion.eta()); + mHistManager.fill(HIST("HNM/Before/NegDaughter/fPhi"), RecoDecay::constrainAngle(negPion.phi())); } } - processHNMs(vHNMs); // Contains QA of HMN properties + // ---------------------------> Process HNM candidates <-------------------------------- + // - Fill invMassVsPt histograms separated into HNM types (based on GG mass) and gamma reco method + // ------------------------------------------------------------------------------------- + processHNMs(vHNMs); } /// \brief Loop over the GG candidates, fill the mass/pt histograms and set the isPi0/isEta flags based on the reconstructed mass @@ -528,9 +504,9 @@ struct HeavyNeutralMeson { mHistManager.fill(HIST("GG/invMassVsPt_PCMEMC"), lightMeson->m(), lightMeson->pT()); } - if (lightMeson->m() > massWindowLightNeutralMesons->get("pi0_min") && lightMeson->m() < massWindowLightNeutralMesons->get("pi0_max")) { + if (lightMeson->m() > cfgMassWindowOmega->get("pi0_min") && lightMeson->m() < cfgMassWindowOmega->get("pi0_max")) { lightMeson->isPi0 = true; - } else if (lightMeson->m() > massWindowLightNeutralMesons->get("eta_min") && lightMeson->m() < massWindowLightNeutralMesons->get("eta_max")) { + } else if (lightMeson->m() > cfgMassWindowEtaPrime->get("eta_min") && lightMeson->m() < cfgMassWindowEtaPrime->get("eta_max")) { lightMeson->isEta = true; } else { vGGs.erase(vGGs.begin() + iGG); @@ -544,47 +520,74 @@ struct HeavyNeutralMeson { void processHNMs(std::vector& vHNMs) { int nHNMsBeforeMassCuts = vHNMs.size(); + for (unsigned int iHNM = 0; iHNM < vHNMs.size(); iHNM++) { auto heavyNeutralMeson = vHNMs.at(iHNM); - float massHNM = heavyNeutralMeson.m(cfgHNMMassCorrection); + if (heavyNeutralMeson.gg->reconstructionType == photonpair::kPCMPCM) { - if (heavyNeutralMeson.gg->isPi0) - mHistManager.fill(HIST("Omega/invMassVsPt_PCM"), massHNM, heavyNeutralMeson.pT()); - else if (heavyNeutralMeson.gg->isEta) - mHistManager.fill(HIST("EtaPrime/invMassVsPt_PCM"), massHNM, heavyNeutralMeson.pT()); - // QA - mHistManager.fill(HIST("TrackCuts/HMN/PCM/fInvMass"), massHNM); - mHistManager.fill(HIST("TrackCuts/HMN/PCM/fPt"), heavyNeutralMeson.pT()); - mHistManager.fill(HIST("TrackCuts/HMN/PCM/fEta"), heavyNeutralMeson.eta()); - mHistManager.fill(HIST("TrackCuts/HMN/PCM/fPhi"), translatePhi(heavyNeutralMeson.phi())); + if (heavyNeutralMeson.gg->isPi0) { + mHistManager.fill(HIST("HNM/Before/Omega/PCM/fInvMassVsPt"), massHNM, heavyNeutralMeson.pT()); + mHistManager.fill(HIST("HNM/Before/Omega/PCM/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("HNM/Before/Omega/PCM/fPhi"), RecoDecay::constrainAngle(heavyNeutralMeson.phi())); + } else if (heavyNeutralMeson.gg->isEta) { + mHistManager.fill(HIST("HNM/Before/EtaPrime/PCM/fInvMassVsPt"), massHNM, heavyNeutralMeson.pT()); + mHistManager.fill(HIST("HNM/Before/EtaPrime/PCM/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("HNM/Before/EtaPrime/PCM/fPhi"), RecoDecay::constrainAngle(heavyNeutralMeson.phi())); + } } else if (heavyNeutralMeson.gg->reconstructionType == photonpair::kEMCEMC) { - if (heavyNeutralMeson.gg->isPi0) - mHistManager.fill(HIST("Omega/invMassVsPt_EMC"), massHNM, heavyNeutralMeson.pT()); - else if (heavyNeutralMeson.gg->isEta) - mHistManager.fill(HIST("EtaPrime/invMassVsPt_EMC"), massHNM, heavyNeutralMeson.pT()); - // QA - mHistManager.fill(HIST("TrackCuts/HMN/EMC/fInvMass"), massHNM); - mHistManager.fill(HIST("TrackCuts/HMN/EMC/fPt"), heavyNeutralMeson.pT()); - mHistManager.fill(HIST("TrackCuts/HMN/EMC/fEta"), heavyNeutralMeson.eta()); - mHistManager.fill(HIST("TrackCuts/HMN/EMC/fPhi"), translatePhi(heavyNeutralMeson.phi())); + if (heavyNeutralMeson.gg->isPi0) { + mHistManager.fill(HIST("HNM/Before/Omega/EMC/fInvMassVsPt"), massHNM, heavyNeutralMeson.pT()); + mHistManager.fill(HIST("HNM/Before/Omega/EMC/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("HNM/Before/Omega/EMC/fPhi"), RecoDecay::constrainAngle(heavyNeutralMeson.phi())); + } else if (heavyNeutralMeson.gg->isEta) { + mHistManager.fill(HIST("HNM/Before/EtaPrime/EMC/fInvMassVsPt"), massHNM, heavyNeutralMeson.pT()); + mHistManager.fill(HIST("HNM/Before/EtaPrime/EMC/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("HNM/Before/EtaPrime/EMC/fPhi"), RecoDecay::constrainAngle(heavyNeutralMeson.phi())); + } } else { - if (heavyNeutralMeson.gg->isPi0) - mHistManager.fill(HIST("Omega/invMassVsPt_PCMEMC"), massHNM, heavyNeutralMeson.pT()); - else if (heavyNeutralMeson.gg->isEta) - mHistManager.fill(HIST("EtaPrime/invMassVsPt_PCMEMC"), massHNM, heavyNeutralMeson.pT()); - // QA - mHistManager.fill(HIST("TrackCuts/HMN/PCMEMC/fInvMass"), massHNM); - mHistManager.fill(HIST("TrackCuts/HMN/PCMEMC/fPt"), heavyNeutralMeson.pT()); - mHistManager.fill(HIST("TrackCuts/HMN/PCMEMC/fEta"), heavyNeutralMeson.eta()); - mHistManager.fill(HIST("TrackCuts/HMN/PCMEMC/fPhi"), translatePhi(heavyNeutralMeson.phi())); + if (heavyNeutralMeson.gg->isPi0) { + mHistManager.fill(HIST("HNM/Before/Omega/PCMEMC/fInvMassVsPt"), massHNM, heavyNeutralMeson.pT()); + mHistManager.fill(HIST("HNM/Before/Omega/PCMEMC/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("HNM/Before/Omega/PCMEMC/fPhi"), RecoDecay::constrainAngle(heavyNeutralMeson.phi())); + } else if (heavyNeutralMeson.gg->isEta) { + mHistManager.fill(HIST("HNM/Before/EtaPrime/PCMEMC/fInvMassVsPt"), massHNM, heavyNeutralMeson.pT()); + mHistManager.fill(HIST("HNM/Before/EtaPrime/PCMEMC/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("HNM/Before/EtaPrime/PCMEMC/fPhi"), RecoDecay::constrainAngle(heavyNeutralMeson.phi())); + } + } + + if (heavyNeutralMeson.gg->isPi0 && massHNM > cfgMassWindowOmega->get("omega_min") && massHNM < cfgMassWindowOmega->get("omega_max") && heavyNeutralMeson.gg->pT() / heavyNeutralMeson.pT() > cfgMinGGPtOverHNMPt) { + if (heavyNeutralMeson.gg->reconstructionType == photonpair::kPCMPCM) { + omegaPCM.emplace_back(heavyNeutralMeson.pT(), heavyNeutralMeson.eta(), RecoDecay::constrainAngle(heavyNeutralMeson.phi()), mMassOmega); + mHistManager.fill(HIST("HNM/After/Omega/PCM/fInvMassVsPt"), massHNM, heavyNeutralMeson.pT()); + mHistManager.fill(HIST("HNM/After/Omega/PCM/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("HNM/After/Omega/PCM/fPhi"), RecoDecay::constrainAngle(heavyNeutralMeson.phi())); + } else if (heavyNeutralMeson.gg->reconstructionType == photonpair::kEMCEMC) { + omegaEMC.emplace_back(heavyNeutralMeson.pT(), heavyNeutralMeson.eta(), RecoDecay::constrainAngle(heavyNeutralMeson.phi()), mMassOmega); + mHistManager.fill(HIST("HNM/After/Omega/EMC/fInvMassVsPt"), massHNM, heavyNeutralMeson.pT()); + mHistManager.fill(HIST("HNM/After/Omega/EMC/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("HNM/After/Omega/EMC/fPhi"), RecoDecay::constrainAngle(heavyNeutralMeson.phi())); + } + } else if (heavyNeutralMeson.gg->isEta && massHNM > cfgMassWindowEtaPrime->get("etaprime_min") && massHNM < cfgMassWindowEtaPrime->get("etaprime_max") && heavyNeutralMeson.gg->pT() / heavyNeutralMeson.pT() > cfgMinGGPtOverHNMPt) { + if (heavyNeutralMeson.gg->reconstructionType == photonpair::kPCMPCM) { + etaPrimePCM.emplace_back(heavyNeutralMeson.pT(), heavyNeutralMeson.eta(), RecoDecay::constrainAngle(heavyNeutralMeson.phi()), mMassEtaPrime); + mHistManager.fill(HIST("HNM/After/EtaPrime/PCM/fInvMassVsPt"), massHNM, heavyNeutralMeson.pT()); + mHistManager.fill(HIST("HNM/After/EtaPrime/PCM/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("HNM/After/EtaPrime/PCM/fPhi"), RecoDecay::constrainAngle(heavyNeutralMeson.phi())); + } else if (heavyNeutralMeson.gg->reconstructionType == photonpair::kEMCEMC) { + etaPrimeEMC.emplace_back(heavyNeutralMeson.pT(), heavyNeutralMeson.eta(), RecoDecay::constrainAngle(heavyNeutralMeson.phi()), mMassEtaPrime); + mHistManager.fill(HIST("HNM/After/EtaPrime/EMC/fInvMassVsPt"), massHNM, heavyNeutralMeson.pT()); + mHistManager.fill(HIST("HNM/After/EtaPrime/EMC/fEta"), heavyNeutralMeson.eta()); + mHistManager.fill(HIST("HNM/After/EtaPrime/EMC/fPhi"), RecoDecay::constrainAngle(heavyNeutralMeson.phi())); + } + } else { + vHNMs.erase(vHNMs.begin() + iHNM); + iHNM--; } } mHistManager.fill(HIST("Event/nHeavyNeutralMesons"), nHNMsBeforeMassCuts, vHNMs.size()); } }; -WorkflowSpec defineDataProcessing(o2::framework::ConfigContext const& cfgc) -{ - return WorkflowSpec{adaptAnalysisTask(cfgc)}; -} +WorkflowSpec defineDataProcessing(o2::framework::ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc)}; } diff --git a/PWGEM/PhotonMeson/Utils/HNMUtilities.h b/PWGEM/PhotonMeson/Utils/HNMUtilities.h index c784fcabc97..bb985686285 100644 --- a/PWGEM/PhotonMeson/Utils/HNMUtilities.h +++ b/PWGEM/PhotonMeson/Utils/HNMUtilities.h @@ -36,11 +36,9 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "EventFiltering/filterTables.h" -using namespace o2::aod::pwgem::photonmeson; - -// -------> Struct to store photons from EMC clusters or V0s namespace o2::aod::pwgem::photonmeson::hnmutilities { +// -------> Struct to store photons from EMC clusters or V0s struct Photon { Photon(float px, float py, float pz, bool isFromConversion) : px(px), py(py), pz(pz), pt(std::sqrt(px * px + py * py)), isFromConversion(isFromConversion) { @@ -125,12 +123,13 @@ struct HeavyNeutralMeson { float phi() const { return vHeavyNeutralMeson.Phi(); } }; -float smPhiEdges[9] = {1.75, 2.1, 2.45, 2.8, 3.14, 4., 4.89, 5.24, 5.58}; +const int nSMEdges = 9; +float smPhiEdges[nSMEdges] = {1.75, 2.1, 2.45, 2.8, 3.14, 4., 4.89, 5.24, 5.58}; -unsigned short getSMNumber(float eta, float phi) +int getSMNumber(float eta, float phi) { - unsigned short smNumber = 0; - for (int iPhiInterval = 0; iPhiInterval < 9; iPhiInterval++) { + int smNumber = 0; + for (int iPhiInterval = 0; iPhiInterval < nSMEdges; iPhiInterval++) { if (phi > smPhiEdges[iPhiInterval]) smNumber = 2 * (iPhiInterval + 1); } @@ -148,7 +147,7 @@ void storeGammasInVector(C clusters, V v0s, std::vector& vPhotons, std:: for (const auto& cluster : clusters) { float eta = cluster.eta(); float phi = cluster.phi(); - unsigned short smNumber = getSMNumber(eta, phi); + int smNumber = getSMNumber(eta, phi); // LOG(info) << "Shifting in sm " << smNumber << ", eta/phi = " << eta << " / " << phi << " to eta/phi = " << eta + EMCEtaShift[getSMNumber(eta, phi)] << " / " << phi + EMCPhiShift[getSMNumber(eta, phi)]; eta += EMCEtaShift[smNumber]; phi += EMCPhiShift[smNumber]; @@ -179,31 +178,11 @@ void reconstructGGs(std::vector vPhotons, std::vector& v } } -/// \brief Reconstruct heavy neutral mesons from tracks and GG candidates and fill them into the vHNMs vector -template -void reconstructHeavyNeutralMesons(Track const& tracks, std::vector& vGGs, std::vector& vHNMs) // ToDO: Pion comb. in main code, tracks -> 4-vectors -{ - vHNMs.clear(); - for (const auto& posTrack : tracks) { - if (!posTrack.isGlobalTrack() || posTrack.sign() < 0) - continue; - for (const auto& negTrack : tracks) { - if (!negTrack.isGlobalTrack() || negTrack.sign() > 0) - continue; - for (size_t iGG = 0; iGG < vGGs.size(); iGG++) { - HeavyNeutralMeson heavyNeutralMeson(&vGGs.at(iGG), posTrack.energy(constants::physics::MassPiPlus) + negTrack.energy(constants::physics::MassPiMinus), posTrack.px() + negTrack.px(), posTrack.py() + negTrack.py(), posTrack.pz() + negTrack.pz()); - vHNMs.push_back(heavyNeutralMeson); - } - } - } -} - -/// \brief Reconstruct heavy neutral mesons from pion and antipion and GG candidates and fill them into the vHNMs vector -void reconstructHeavyNeutralMesons(ROOT::Math::PtEtaPhiMVector const& posPion, ROOT::Math::PtEtaPhiMVector const& negPion, std::vector& vGGs, std::vector& vHNMs) // ToDO: Pion comb. in main code, tracks -> 4-vectors +/// \brief Reconstruct heavy neutral mesons from the given pion, antipion and the GG candidates and add them to the vHNMs vector +void reconstructHeavyNeutralMesons(ROOT::Math::PtEtaPhiMVector const& vecPiPlPiMi, std::vector& vGGs, std::vector& vHNMs) { - const ROOT::Math::PtEtaPhiMVector trackSum = posPion + negPion; for (size_t iGG = 0; iGG < vGGs.size(); iGG++) { - HeavyNeutralMeson heavyNeutralMeson(&vGGs.at(iGG), trackSum.E(), trackSum.Px(), trackSum.Py(), trackSum.Pz()); + HeavyNeutralMeson heavyNeutralMeson(&vGGs.at(iGG), vecPiPlPiMi.E(), vecPiPlPiMi.Px(), vecPiPlPiMi.Py(), vecPiPlPiMi.Pz()); vHNMs.push_back(heavyNeutralMeson); } } From 7e94500dfea6c3d65634c98ab901745f0b894a7c Mon Sep 17 00:00:00 2001 From: bghanley1995 Date: Tue, 22 Apr 2025 17:41:39 -0400 Subject: [PATCH 1059/1650] [PWGCF] IdentifiedBf added Histogram to measure single particle purity (#10941) Co-authored-by: ALICE Action Bot --- .../TableProducer/identifiedBfFilter.cxx | 5 +- .../Tasks/identifiedbf.cxx | 74 +++++++++++++++++++ 2 files changed, 77 insertions(+), 2 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx b/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx index 4b57042f15a..5eda3450473 100644 --- a/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx +++ b/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx @@ -1679,13 +1679,14 @@ inline int8_t IdentifiedBfFilterTracks::acceptParticle(ParticleObject& particle, } if (ptlow < particle.pt() && particle.pt() < ptup && etalow < particle.eta() && particle.eta() < etaup) { - MatchRecoGenSpecies sp; + MatchRecoGenSpecies sp = kWrongSpecies; if (recoIdMethod == recoIdMethods[0]) { sp = kIdBfCharged; } - if (recoIdMethod == recoIdMethods[1]) { + if (recoIdMethod == recoIdMethods[1] || recoIdMethod == recoIdMethods[2]) { sp = identifyParticle(particle); } + if (sp != kWrongSpecies) { if (sp != kIdBfCharged) { /* fill the charged particle histograms */ diff --git a/PWGCF/TwoParticleCorrelations/Tasks/identifiedbf.cxx b/PWGCF/TwoParticleCorrelations/Tasks/identifiedbf.cxx index 7319f70d946..b357272c17c 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/identifiedbf.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/identifiedbf.cxx @@ -100,6 +100,7 @@ struct IdentifiedbfTask { std::vector fhN1VsZEtaPhiPt{nch + 1, nullptr}; //! fhN1VsZEtaPhiPtPrimary{nch, nullptr}; //! fhN1VsZEtaPhiPtSecondary{nch, nullptr}; //! fhN1VsZEtaPhiPtPure{nch + 1, nullptr}; //! fhSum1PtVsZEtaPhiPt{nch, nullptr}; //! fhNuaNueVsZEtaPhiPt{nch, nullptr}; //! fhPtAvgVsEtaPhi{nch, nullptr}; //! + bool isSpeciesCheck(ParticleObject const& particle, int trkId) + { + int pdgcode = particle.pdgCode(); + int realPID = -1; + switch (pdgcode) { + case kPositron: + realPID = 0; + break; + case kElectron: + realPID = 1; + break; + case kPiPlus: + realPID = 2; + break; + case kPiMinus: + realPID = 3; + break; + case kKPlus: + realPID = 4; + break; + case kKMinus: + realPID = 5; + break; + case kProton: + realPID = 6; + break; + case kProtonBar: + realPID = 7; + break; + default: + realPID = -1; + break; + } + return (realPID == trkId); + } + + /// \brief checks whether MC track is a physical primary or secondary + /// \param particle passed MC track converted to MCParticle + template + bool isPrimarySpeciesCheck(TrackObject const& track, int trkId) + { + if constexpr (framework::has_type_v) { + return (isPrimaryCheck(track.template mcParticle_as()) && isSpeciesCheck(track.template mcParticle_as(), trkId)); + } + return false; + } + /// \brief fills the singles histograms in singles execution mode /// \param passedtracks filtered table with the tracks associated to the passed index /// \param tix index, in the singles histogram bank, for the passed filetered track table @@ -315,6 +366,9 @@ struct IdentifiedbfTask { fhN1VsZEtaPhiPt[track.trackacceptedid()]->Fill(zvtx, getEtaPhiIndex(track) + 0.5, track.pt(), corr); fhSum1PtVsZEtaPhiPt[track.trackacceptedid()]->Fill(zvtx, getEtaPhiIndex(track) + 0.5, track.pt(), track.pt() * corr); trackPrimaryCheck(track, zvtx, corr); + if (isPrimarySpeciesCheck(track, track.trackacceptedid())) { + fhN1VsZEtaPhiPtPure[track.trackacceptedid()]->Fill(zvtx, getEtaPhiIndex(track) + 0.5, track.pt(), corr); + } } index++; } @@ -583,6 +637,23 @@ struct IdentifiedbfTask { ptlow, ptup); + fhN1VsZEtaPhiPtPure[i] = new TH3F( + TString::Format("n1_%s_Pure_vsZ_vsEtaPhi_vsPt", tname[i].c_str()).Data(), + TString::Format("#LT n_{1} Pure #GT;vtx_{z};#eta_{%s}#times#varphi_{%s};p_{t,%s} (GeV/c)", + tname[i].c_str(), + tname[i].c_str(), + tname[i].c_str()) + .Data(), + zvtxbins, + zvtxlow, + zvtxup, + etabins * phibins, + 0.0, + static_cast(etabins * phibins), + ptbins, + ptlow, + ptup); + fhSum1PtVsZEtaPhiPt[i] = new TH3F( TString::Format("sumPt1_%s_vsZ_vsEtaPhi_vsPt", tname[i].c_str()).Data(), TString::Format( @@ -618,6 +689,8 @@ struct IdentifiedbfTask { fhN1VsZEtaPhiPtPrimary[i]->Sumw2(false); fhN1VsZEtaPhiPtSecondary[i]->SetBit(TH1::kIsNotW); fhN1VsZEtaPhiPtSecondary[i]->Sumw2(false); + fhN1VsZEtaPhiPtPure[i]->SetBit(TH1::kIsNotW); + fhN1VsZEtaPhiPtPure[i]->Sumw2(false); fhSum1PtVsZEtaPhiPt[i]->SetBit(TH1::kIsNotW); fhSum1PtVsZEtaPhiPt[i]->Sumw2(false); } @@ -632,6 +705,7 @@ struct IdentifiedbfTask { fOutputList->Add(fhN1VsZEtaPhiPt[i]); fOutputList->Add(fhN1VsZEtaPhiPtPrimary[i]); fOutputList->Add(fhN1VsZEtaPhiPtSecondary[i]); + fOutputList->Add(fhN1VsZEtaPhiPtPure[i]); fOutputList->Add(fhSum1PtVsZEtaPhiPt[i]); } } From 441c4f7784669648dd2b1a79609c82a745ae7a3d Mon Sep 17 00:00:00 2001 From: Preet-Bhanjan Date: Tue, 22 Apr 2025 23:45:37 +0200 Subject: [PATCH 1060/1650] [PWGCF] Particle switch fixes and efficiency corrections (#10936) Co-authored-by: Preet Pati --- PWGCF/Flow/Tasks/flowPbpbPikp.cxx | 104 ++++++++++++- PWGCF/Flow/Tasks/resonancesGfwFlow.cxx | 197 +++++++++++++------------ 2 files changed, 198 insertions(+), 103 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowPbpbPikp.cxx b/PWGCF/Flow/Tasks/flowPbpbPikp.cxx index 311cccc5b84..f880deaf75b 100644 --- a/PWGCF/Flow/Tasks/flowPbpbPikp.cxx +++ b/PWGCF/Flow/Tasks/flowPbpbPikp.cxx @@ -52,6 +52,7 @@ #include #include +#include using namespace o2; using namespace o2::framework; @@ -88,6 +89,10 @@ struct FlowPbpbPikp { O2_DEFINE_CONFIGURABLE(cfgCutOccupancy, int, 3000, "Occupancy cut") O2_DEFINE_CONFIGURABLE(cfgUseGlobalTrack, bool, true, "use Global track") O2_DEFINE_CONFIGURABLE(cfgITScluster, int, 0, "Number of ITS cluster") + O2_DEFINE_CONFIGURABLE(cfgTrackDensityCorrUse, bool, true, "Use track density efficiency correction") + + Configurable> cfgTrackDensityP0{"cfgTrackDensityP0", std::vector{0.7217476707, 0.7384792571, 0.7542625668, 0.7640680200, 0.7701951667, 0.7755299053, 0.7805901710, 0.7849446786, 0.7957356586, 0.8113039262, 0.8211968966, 0.8280558878, 0.8329342135}, "parameter 0 for track density efficiency correction"}; + Configurable> cfgTrackDensityP1{"cfgTrackDensityP1", std::vector{-2.169488e-05, -2.191913e-05, -2.295484e-05, -2.556538e-05, -2.754463e-05, -2.816832e-05, -2.846502e-05, -2.843857e-05, -2.705974e-05, -2.477018e-05, -2.321730e-05, -2.203315e-05, -2.109474e-05}, "parameter 1 for track density efficiency correction"}; ConfigurableAxis axisVertex{"axisVertex", {20, -10, 10}, "vertex axis for histograms"}; ConfigurableAxis axisPhi{"axisPhi", {60, 0.0, constants::math::TwoPI}, "phi axis for histograms"}; @@ -127,6 +132,13 @@ struct FlowPbpbPikp { std::vector mAcceptance; bool correctionsLoaded = false; + // local track density correction + std::vector funcEff; + TH1D* hFindPtBin; + TF1* funcV2; + TF1* funcV3; + TF1* funcV4; + void init(InitContext const&) { ccdb->setURL(ccdbUrl.value); @@ -199,6 +211,10 @@ struct FlowPbpbPikp { for (int i = 0; i < fPtAxis->GetNbins(); i++) oba->Add(new TNamed(Form("Pr08Gap24_pt_%i", i + 1), "Pr08Gap24_pTDiff")); + oba->Add(new TNamed("Pi08BGap22", "Pi08BGap22")); + for (int i = 0; i < fPtAxis->GetNbins(); i++) + oba->Add(new TNamed(Form("Pi08BGap22_pt_%i", i + 1), "Pi08BGap22_pTDiff")); + fFC->SetName("FlowContainer"); fFC->SetXAxis(fPtAxis); fFC->Initialize(oba, axisMultiplicity, cfgNbootstrap); @@ -219,6 +235,9 @@ struct FlowPbpbPikp { fGFW->AddRegion("poiNpi", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 2); fGFW->AddRegion("olNpi", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 16); + fGFW->AddRegion("poiPpi", 0.4, 0.8, 1 + fPtAxis->GetNbins(), 2); + fGFW->AddRegion("olPpi", 0.4, 0.8, 1 + fPtAxis->GetNbins(), 16); + // kaon fGFW->AddRegion("poiNk", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 4); fGFW->AddRegion("olNk", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 32); @@ -251,7 +270,30 @@ struct FlowPbpbPikp { corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNk refN08 | olNk {2 2} refP08 {-2 -2}", "Ka08Gap24", kTRUE)); corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNpr refN08 | olNpr {2 2} refP08 {-2 -2}", "Pr08Gap24", kTRUE)); + // Backward correlations + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Pi08BGap22", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPpi refP08 | olPpi {2} refN08 {-2}", "Pi08BGap22", kTRUE)); + fGFW->CreateRegions(); + + if (cfgTrackDensityCorrUse) { + std::vector pTEffBins = {0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.4, 1.8, 2.2, 2.6, 3.0}; + hFindPtBin = new TH1D("hFindPtBin", "hFindPtBin", pTEffBins.size() - 1, &pTEffBins[0]); + funcEff.resize(pTEffBins.size() - 1); + // LHC24g3 Eff + std::vector f1p0 = cfgTrackDensityP0; + std::vector f1p1 = cfgTrackDensityP1; + for (uint ifunc = 0; ifunc < pTEffBins.size() - 1; ifunc++) { + funcEff[ifunc] = new TF1(Form("funcEff%i", ifunc), "[0]+[1]*x", 0, 3000); + funcEff[ifunc]->SetParameters(f1p0[ifunc], f1p1[ifunc]); + } + funcV2 = new TF1("funcV2", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); + funcV2->SetParameters(0.0186111, 0.00351907, -4.38264e-05, 1.35383e-07, -3.96266e-10); + funcV3 = new TF1("funcV3", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); + funcV3->SetParameters(0.0174056, 0.000703329, -1.45044e-05, 1.91991e-07, -1.62137e-09); + funcV4 = new TF1("funcV4", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); + funcV4->SetParameters(0.008845, 0.000259668, -3.24435e-06, 4.54837e-08, -6.01825e-10); + } } enum Particles { @@ -286,8 +328,9 @@ struct FlowPbpbPikp { if (track.pt() >= cfgTofPtCut && !track.hasTOF()) return -1; + const int numSpecies = 3; // Select particle with the lowest nsigma - for (int i = 0; i < 3; ++i) { + for (int i = 0; i < numSpecies; ++i) { if (std::abs(nSigmaToUse[i]) < nsigma) { pid = i; nsigma = std::abs(nSigmaToUse[i]); @@ -303,8 +346,10 @@ struct FlowPbpbPikp { int bayesid = -1; int prob = 0; - for (int i = 0; i < 3; ++i) { - if (bayesprobs[i] > prob && bayesprobs[i] > 80) { + const int nParts = 3; + const int bayesCut = 80; + for (int i = 0; i < nParts; ++i) { + if (bayesprobs[i] > prob && bayesprobs[i] > bayesCut) { bayesid = i; prob = bayesprobs[i]; } @@ -317,12 +362,13 @@ struct FlowPbpbPikp { { int maxProb[3] = {80, 80, 80}; int pidID = -1; + const int nParts = 3; std::pair idprob = getBayesID(track); if (idprob.first == PIONS || idprob.first == KAONS || idprob.first == PROTONS) { // 0 = pion, 1 = kaon, 2 = proton pidID = idprob.first; float nsigmaTPC[3] = {track.tpcNSigmaPi(), track.tpcNSigmaKa(), track.tpcNSigmaPr()}; if (idprob.second > maxProb[pidID]) { - if (std::fabs(nsigmaTPC[pidID]) > 3) + if (std::fabs(nsigmaTPC[pidID]) > nParts) return 0; return pidID + 1; // shift the pid by 1, 1 = pion, 2 = kaon, 3 = proton } else { @@ -523,6 +569,37 @@ struct FlowPbpbPikp { int pidIndex; loadCorrections(bc); // load corrections for the each event + // Track loop for calculating the Qn angles + double psi2Est = 0, psi3Est = 0, psi4Est = 0; + float wEPeff = 1; + double v2 = 0, v3 = 0, v4 = 0; + // be cautious, this only works for Pb-Pb + // esimate the Qn angles and vn for this event + if (cfgTrackDensityCorrUse) { + double q2x = 0, q2y = 0; + double q3x = 0, q3y = 0; + double q4x = 0, q4y = 0; + for (const auto& track : tracks) { + bool withinPtRef = (cfgCutPtMin < track.pt()) && (track.pt() < cfgCutPtMax); // within RF pT range + if (withinPtRef) { + q2x += std::cos(2 * track.phi()); + q2y += std::sin(2 * track.phi()); + q3x += std::cos(3 * track.phi()); + q3y += std::sin(3 * track.phi()); + q4x += std::cos(4 * track.phi()); + q4y += std::sin(4 * track.phi()); + } + } + psi2Est = std::atan2(q2y, q2x) / 2.; + psi3Est = std::atan2(q3y, q3x) / 3.; + psi4Est = std::atan2(q4y, q4x) / 4.; + + v2 = funcV2->Eval(cent); + v3 = funcV3->Eval(cent); + v4 = funcV4->Eval(cent); + } + + // Actual track loop for (auto const& track : tracks) { if (!selectionTrack(track)) continue; @@ -540,6 +617,9 @@ struct FlowPbpbPikp { // pidIndex = getBayesPIDIndex(track); pidIndex = getNsigmaPID(track); + + weff = 1; // Initializing weff for each track + // NUA weights if (cfgOutputNUAWeights) fillWeights(track, vtxz, pidIndex, runNumber); @@ -550,10 +630,24 @@ struct FlowPbpbPikp { if (withinPtRef && withinPtPOI && pidIndex) waccRef = waccPOI; // if particle is both (then it's overlap), override ref with POI + // Track density correction + if (cfgTrackDensityCorrUse && withinPtRef) { + double fphi = v2 * std::cos(2 * (track.phi() - psi2Est)) + v3 * std::cos(3 * (track.phi() - psi3Est)) + v4 * std::cos(4 * (track.phi() - psi4Est)); + fphi = (1 + 2 * fphi); + int pTBinForEff = hFindPtBin->FindBin(track.pt()); + if (pTBinForEff >= 1 && pTBinForEff <= hFindPtBin->GetNbinsX()) { + wEPeff = funcEff[pTBinForEff - 1]->Eval(fphi * tracks.size()); + if (wEPeff > 0.) { + wEPeff = 1. / wEPeff; + weff *= wEPeff; + } + } + } // end of track density correction loop + if (withinPtRef) { histos.fill(HIST("hPhiWeighted"), track.phi(), waccRef); fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), waccRef * weff, 1); - fGFW->Fill(track.eta(), 1, track.phi(), waccRef * weff, 512); + fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), waccRef * weff, 512); } if (withinPtPOI) { fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), waccPOI * weff, 128); diff --git a/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx b/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx index 6bde6c05c99..8f6db97fde8 100644 --- a/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx +++ b/PWGCF/Flow/Tasks/resonancesGfwFlow.cxx @@ -38,6 +38,7 @@ #include "Common/DataModel/Multiplicity.h" #include "Common/Core/TrackSelection.h" #include "Common/Core/trackUtilities.h" +#include "Common/Core/RecoDecay.h" #include "CommonConstants/PhysicsConstants.h" #include "PWGLF/DataModel/EPCalibrationTables.h" @@ -135,10 +136,19 @@ struct ResonancesGfwFlow { O2_DEFINE_CONFIGURABLE(cfgUseWeightPhiEtaPt, bool, false, "Use Phi, Eta, Pt dependent NUA weights") O2_DEFINE_CONFIGURABLE(cfgNbootstrap, int, 10, "Number of subsamples") O2_DEFINE_CONFIGURABLE(cfgUseBootStrap, bool, true, "Use bootstrap for error estimation") - O2_DEFINE_CONFIGURABLE(cfgTrackDensityCorrUse, bool, false, "Use track density efficiency correction") + O2_DEFINE_CONFIGURABLE(cfgTrackDensityCorrUse, bool, true, "Use track density efficiency correction") + O2_DEFINE_CONFIGURABLE(cfgUsePhi, bool, true, "Analyze Phi") O2_DEFINE_CONFIGURABLE(cfgUseK0, bool, true, "Analyze K0") O2_DEFINE_CONFIGURABLE(cfgUseLambda, bool, true, "Analyze Lambda") - O2_DEFINE_CONFIGURABLE(cfgUsePhi, bool, true, "Analyze Phi") + + enum OutputSpecies { + Ref = 0, + K0 = 1, + Lambda = 2, + AnLambda = 3, + Phi = 4, + kCount_OutputSpecies + }; struct : ConfigurableGroup { Configurable> cfgCosPAs{"cfgCosPAs", std::vector{0.97f, 0.995f, 0.04f}, "Minimum Pointing angle for resonances [K0, Lambda, Phi]"}; @@ -146,7 +156,7 @@ struct ResonancesGfwFlow { Configurable> cfgMassMin{"cfgMassMin", std::vector{0.44f, 1.1f, 0.99f}, "Minimum mass for resonances [K0, Lambda, Phi]"}; Configurable> cfgMassMax{"cfgMassMax", std::vector{0.56f, 1.16f, 1.06f}, "Maximum mass for resonances [K0, Lambda, Phi]"}; Configurable> cfgNMassBins{"cfgNMassBins", std::vector{70, 70, 70}, "Invariant mass bins for resonances [K0, Lambda, Phi]"}; - Configurable> cfgMccCut{"cfgMccCut", std::vector{0.005f, 0.01f}, "MCC cut for resonances [K0, Lambda]"}; + Configurable> cfgMccCut{"cfgMccCut", std::vector{0.005f, 0.01f, 0.0f}, "MCC cut for resonances [K0, Lambda, Phi]"}; Configurable> cfgPosTrackPt{"cfgPosTrackPt", std::vector{0.15f, 0.15f, 0.15f}, "Pt cut for positive track of resonances [K0, Lambda, Phi]"}; Configurable> cfgNegTrackPt{"cfgNegTrackPt", std::vector{0.15f, 0.15f, 0.15f}, "Pt cut for negative track of resonances [K0, Lambda, Phi]"}; } resoCuts; @@ -200,15 +210,6 @@ struct ResonancesGfwFlow { TAxis* fLambdaMassAxis; TRandom3* fRndm = new TRandom3(0); - enum OutputSpecies { - Ref = 0, - K0 = 1, - Lambda = 2, - AnLambda = 3, - Phi = 4, - kCount_OutputSpecies - }; - std::vector mAcceptance; bool correctionsLoaded = false; @@ -243,13 +244,40 @@ struct ResonancesGfwFlow { histos.add("hPhiPhi", "", {HistType::kTH1D, {axisPhi}}); histos.add("hPhiEta", "", {HistType::kTH1D, {axisEta}}); histos.add("hPhiMass_sparse", "", {HistType::kTHnSparseD, {{axisPhiMass, axisPt, axisMultiplicity}}}); + histos.add("hPhimassSparse_RD", "", {HistType::kTHnSparseD, {{axisPhiMass, axisPt, axisMultiplicity}}}); histos.add("Phid22Fpt", "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); histos.add("Phid24Fpt", "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); histos.add("Phid22Bpt", "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); histos.add("Phid24Bpt", "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); } + if (cfgUseK0) { + histos.add("PlusTPC_K0", "", {HistType::kTH2D, {{axisPt, axisTPCsignal}}}); + histos.add("MinusTPC_K0", "", {HistType::kTH2D, {{axisPt, axisTPCsignal}}}); + histos.add("PlusTOF_K0", "", {HistType::kTH2D, {{axisPt, axisTOFsignal}}}); + histos.add("MinusTOF_K0", "", {HistType::kTH2D, {{axisPt, axisTOFsignal}}}); + histos.add("hK0Phi", "", {HistType::kTH1D, {axisPhi}}); + histos.add("hK0Eta", "", {HistType::kTH1D, {axisEta}}); + histos.add("hK0Mass_sparse", "", {HistType::kTHnSparseF, {{axisK0Mass, axisPt, axisMultiplicity}}}); + histos.add("hK0s", "", {HistType::kTH1D, {singleCount}}); + + histos.add("K0d22Fpt", "", {HistType::kTProfile3D, {axisPt, axisK0Mass, axisMultiplicity}}); + histos.add("K0d24Fpt", "", {HistType::kTProfile3D, {axisPt, axisK0Mass, axisMultiplicity}}); + histos.add("K0d22Bpt", "", {HistType::kTProfile3D, {axisPt, axisK0Mass, axisMultiplicity}}); + histos.add("K0d24Bpt", "", {HistType::kTProfile3D, {axisPt, axisK0Mass, axisMultiplicity}}); + histos.add("hK0Count", "Number of K0;; Count", {HistType::kTH1D, {{10, 0, 10}}}); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(1, "K0 candidates"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(2, "Daughter pt"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(3, "Mass cut"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(4, "Rapidity cut"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(5, "DCA to PV"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(6, "DCA between daughters"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(7, "V0radius"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(8, "CosPA"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(9, "Proper lifetime"); + histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(10, "Daughter track selection"); + } if (cfgUseLambda) { histos.add("PlusTPC_L", "", {HistType::kTH2D, {{axisPt, axisTPCsignal}}}); histos.add("MinusTPC_L", "", {HistType::kTH2D, {{axisPt, axisTPCsignal}}}); @@ -277,7 +305,7 @@ struct ResonancesGfwFlow { histos.add("AnLambdad22Bpt", "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); histos.add("AnLambdad24Bpt", "", {HistType::kTProfile3D, {axisPt, axisLambdaMass, axisMultiplicity}}); - histos.add("hLambdaCount", "Number of Lambda;; Count", {HistType::kTH1D, {{11, 0, 11}}}); + histos.add("hLambdaCount", "Number of Lambda;; Count", {HistType::kTH1D, {{10, 0, 10}}}); histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(1, "Lambda candidates"); histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(2, "Daughter pt"); histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(3, "Mass cut"); @@ -288,36 +316,6 @@ struct ResonancesGfwFlow { histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(8, "CosPA"); histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(9, "Proper lifetime"); histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(10, "Daughter track selection"); - histos.get(HIST("hLambdaCount"))->GetXaxis()->SetBinLabel(11, "Mass cross check"); - } - - if (cfgUseK0) { - histos.add("PlusTPC_K0", "", {HistType::kTH2D, {{axisPt, axisTPCsignal}}}); - histos.add("MinusTPC_K0", "", {HistType::kTH2D, {{axisPt, axisTPCsignal}}}); - histos.add("PlusTOF_K0", "", {HistType::kTH2D, {{axisPt, axisTOFsignal}}}); - histos.add("MinusTOF_K0", "", {HistType::kTH2D, {{axisPt, axisTOFsignal}}}); - histos.add("hK0Phi", "", {HistType::kTH1D, {axisPhi}}); - histos.add("hK0Eta", "", {HistType::kTH1D, {axisEta}}); - histos.add("hK0Mass_sparse", "", {HistType::kTHnSparseF, {{axisK0Mass, axisPt, axisMultiplicity}}}); - histos.add("hK0s", "", {HistType::kTH1D, {singleCount}}); - - histos.add("K0d22Fpt", "", {HistType::kTProfile3D, {axisPt, axisK0Mass, axisMultiplicity}}); - histos.add("K0d24Fpt", "", {HistType::kTProfile3D, {axisPt, axisK0Mass, axisMultiplicity}}); - histos.add("K0d22Bpt", "", {HistType::kTProfile3D, {axisPt, axisK0Mass, axisMultiplicity}}); - histos.add("K0d24Bpt", "", {HistType::kTProfile3D, {axisPt, axisK0Mass, axisMultiplicity}}); - - histos.add("hK0Count", "Number of K0;; Count", {HistType::kTH1D, {{11, 0, 11}}}); - histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(1, "K0 candidates"); - histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(2, "Daughter pt"); - histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(3, "Mass cut"); - histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(4, "Rapidity cut"); - histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(5, "DCA to PV"); - histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(6, "DCA between daughters"); - histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(7, "V0radius"); - histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(8, "CosPA"); - histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(9, "Proper lifetime"); - histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(10, "Daughter track selection"); - histos.get(HIST("hK0Count"))->GetXaxis()->SetBinLabel(11, "Mass cross check"); } histos.add("hEventCount", "Number of Event;; Count", {HistType::kTH1D, {{8, 0, 8}}}); @@ -355,10 +353,10 @@ struct ResonancesGfwFlow { refC22Boot[i] = histos.add(Form("BootStrap/Refc22_bootstrap_%d", i), "", {HistType::kTProfile, {axisMultiplicity}}); refC24Boot[i] = histos.add(Form("BootStrap/Refc24_bootstrap_%d", i), "", {HistType::kTProfile, {axisMultiplicity}}); if (cfgUsePhi) { - phiD22FPtBoot[i] = histos.add(Form("BootStrap/Phid22Fpt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); - phiD24FPtBoot[i] = histos.add(Form("BootStrap/Phid24Fpt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); - phiD22BPtBoot[i] = histos.add(Form("BootStrap/Phid22Bpt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); - phiD24BPtBoot[i] = histos.add(Form("BootStrap/Phid24Bpt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); + phiD22FPtBoot[i] = histos.add(Form("BootStrap/phid22Fpt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); + phiD24FPtBoot[i] = histos.add(Form("BootStrap/phid24Fpt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); + phiD22BPtBoot[i] = histos.add(Form("BootStrap/phid22Bpt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); + phiD24BPtBoot[i] = histos.add(Form("BootStrap/phid24Bpt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisPhiMass, axisMultiplicity}}); } if (cfgUseK0) { k0D22FPtBoot[i] = histos.add(Form("BootStrap/k0d22Fpt_bootstrap_%d", i), "", {HistType::kTProfile3D, {axisPt, axisK0Mass, axisMultiplicity}}); @@ -385,7 +383,7 @@ struct ResonancesGfwFlow { double* ptBins = &(axis.binEdges)[0]; fPtAxis = new TAxis(nPtBins, ptBins); - fPhiMassAxis = new TAxis(vMassBins[Phi - 2], 0.99, 1.06); + fPhiMassAxis = new TAxis(vMassBins[Phi - 2], vMassMin[Phi - 2], vMassMax[Phi - 2]); fK0MassAxis = new TAxis(vMassBins[K0 - 1], vMassMin[K0 - 1], vMassMax[K0 - 1]); fLambdaMassAxis = new TAxis(vMassBins[Lambda - 1], vMassMin[Lambda - 1], vMassMax[Lambda - 1]); @@ -433,29 +431,29 @@ struct ResonancesGfwFlow { corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2 2} refP08 {-2 -2}", "Ref08Gap24", kFALSE)); //--------- pt differential pois - if (cfgUsePhi) { - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2} refP08 {-2}", "PhiF08Gap22", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2 2} refP08 {-2 -2}", "PhiF08Gap24", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPphi refP08 | olPphi {2} refN08 {-2}", "PhiB08Gap22", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPphi refP08 | olPphi {2 2} refN08 {-2 -2}", "PhiB08Gap24", kTRUE)); - } - if (cfgUseK0) { - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNk0 refN08 | olNk0 {2} refP08 {-2}", "KsF08Gap22", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNk0 refN08 | olNk0 {2 2} refP08 {-2 -2}", "KsF08Gap24", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPk0 refP08 | olPk0 {2} refN08 {-2}", "KsB08Gap22", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPk0 refP08 | olPk0 {2 2} refN08 {-2 -2}", "KsB08Gap24", kTRUE)); - } - if (cfgUseLambda) { - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNlam refN08 | olNlam {2} refP08 {-2}", "LamF08Gap22", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNlam refN08 | olNlam {2 2} refP08 {-2 -2}", "LamF08Gap24", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPlam refP08 | olPlam {2} refN08 {-2}", "LamB08Gap22", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPlam refP08 | olPlam {2 2} refN08 {-2 -2}", "LamB08Gap24", kTRUE)); - - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNantilam refN08 | olNantilam {2} refP08 {-2}", "AnLamF08Gap22", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNantilam refN08 | olNantilam {2 2} refP08 {-2 -2}", "AnLamF08Gap24", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPantilam refP08 | olPantilam {2} refN08 {-2}", "AnLamB08Gap22", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPantilam refP08 | olPantilam {2 2} refN08 {-2 -2}", "AnLamB08Gap24", kTRUE)); - } + // Phi + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2} refP08 {-2}", "PhiF08Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNphi refN08 | olNphi {2 2} refP08 {-2 -2}", "PhiF08Gap24", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPphi refP08 | olPphi {2} refN08 {-2}", "PhiB08Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPphi refP08 | olPphi {2 2} refN08 {-2 -2}", "PhiB08Gap24", kTRUE)); + + // K0 + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNk0 refN08 | olNk0 {2} refP08 {-2}", "KsF08Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNk0 refN08 | olNk0 {2 2} refP08 {-2 -2}", "KsF08Gap24", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPk0 refP08 | olPk0 {2} refN08 {-2}", "KsB08Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPk0 refP08 | olPk0 {2 2} refN08 {-2 -2}", "KsB08Gap24", kTRUE)); + + // Lambda + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNlam refN08 | olNlam {2} refP08 {-2}", "LamF08Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNlam refN08 | olNlam {2 2} refP08 {-2 -2}", "LamF08Gap24", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPlam refP08 | olPlam {2} refN08 {-2}", "LamB08Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPlam refP08 | olPlam {2 2} refN08 {-2 -2}", "LamB08Gap24", kTRUE)); + + // Antilambda + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNantilam refN08 | olNantilam {2} refP08 {-2}", "AnLamF08Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNantilam refN08 | olNantilam {2 2} refP08 {-2 -2}", "AnLamF08Gap24", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPantilam refP08 | olPantilam {2} refN08 {-2}", "AnLamB08Gap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPantilam refP08 | olPantilam {2 2} refN08 {-2 -2}", "AnLamB08Gap24", kTRUE)); fGFW->CreateRegions(); @@ -480,7 +478,7 @@ struct ResonancesGfwFlow { } template - void fillResoProfile(const GFW::CorrConfig& corrconf, const ConstStr& tarName, const double& cent, TAxis* partaxis) + void fillResoProfile(const GFW::CorrConfig& corrconf, const ConstStr& tarName, const double cent, TAxis* partaxis) { double dnx, val; if (!corrconf.pTDif) { @@ -684,6 +682,8 @@ struct ResonancesGfwFlow { double wacc = 1; double cent = collision.centFT0C(); double vtxz = collision.posZ(); + double phi = mom.Phi(); + phi = RecoDecay::constrainAngle(phi, 0.0, 1); // constrain azimuthal angle to [0,2pi] if ((cfgUseWeightPhiEtaVtxz && cfgUseWeightPhiPtCent) || (cfgUseWeightPhiEtaPt && cfgUseWeightPhiPtCent) || (cfgUseWeightPhiEtaVtxz && cfgUseWeightPhiEtaPt)) { LOGF(fatal, "Only one of the three weight options can be used at a time"); @@ -694,11 +694,11 @@ struct ResonancesGfwFlow { return 1; } if (cfgUseWeightPhiEtaVtxz) - wacc = mAcceptance[pid_index_reso]->getNUA(mom.Phi(), mom.Eta(), vtxz); + wacc = mAcceptance[pid_index_reso]->getNUA(phi, mom.Eta(), vtxz); if (cfgUseWeightPhiPtCent) - wacc = mAcceptance[pid_index_reso]->getNUA(mom.Phi(), mom.Pt(), cent); + wacc = mAcceptance[pid_index_reso]->getNUA(phi, mom.Pt(), cent); if (cfgUseWeightPhiEtaPt) - wacc = mAcceptance[pid_index_reso]->getNUA(mom.Phi(), mom.Eta(), mom.Pt()); + wacc = mAcceptance[pid_index_reso]->getNUA(phi, mom.Eta(), mom.Pt()); } return wacc; } @@ -761,34 +761,45 @@ struct ResonancesGfwFlow { histos.fill(HIST("KaminusTPC"), partminus.pt(), partminus.tpcNSigmaKa()); histos.fill(HIST("KaminusTOF"), partminus.pt(), partminus.tofNSigmaKa()); + std::array, 2> ptarr = {{{partplus.px(), partplus.py(), partplus.pz()}, {partminus.px(), partminus.py(), partminus.pz()}}}; + std::array massarr = {plusmass, plusmass}; + + // Calculation using RecoDecay + double invMassRD = RecoDecay::m2(ptarr, massarr); + double ptRD = std::sqrt(RecoDecay::sumOfSquares(partplus.pt(), partminus.pt())); + + // Calculation using ROOT vectors plusdaug = ROOT::Math::PxPyPzMVector(partplus.px(), partplus.py(), partplus.pz(), plusmass); minusdaug = ROOT::Math::PxPyPzMVector(partminus.px(), partminus.py(), partminus.pz(), plusmass); mom = plusdaug + minusdaug; double pt = mom.Pt(); double invMass = mom.M(); + double phi = mom.Phi(); bool withinPtPOI = (cfgCutPtPOIMin < pt) && (pt < cfgCutPtPOIMax); // within POI pT range bool withinPtRef = (cfgCutPtMin < pt) && (pt < cfgCutPtMax); + phi = RecoDecay::constrainAngle(phi, 0.0, 1); // constrain azimuthal angle to [0,2pi] + if (std::abs(mom.Rapidity()) < cfgRapidityCut) { histos.fill(hist, invMass, pt, collision.centFT0C()); - histos.fill(HIST("hPhiPhi"), mom.Phi()); + histos.fill(HIST("hPhiPhi"), phi); histos.fill(HIST("hPhiEta"), mom.Eta()); + histos.fill(HIST("hPhimassSparse_RD"), invMassRD, ptRD, collision.centFT0C()); // fill RecoDecay mass and pt // Fill Phi weights if (cfgOutputNUAWeights && withinPtPOI) { - histos.fill(HIST("NUA/hPhiEtaVtxz_phi"), mom.Phi(), mom.Eta(), collision.posZ()); - histos.fill(HIST("NUA/hPhiPtCent_phi"), mom.Phi(), pt, collision.centFT0C()); - histos.fill(HIST("NUA/hPhiEtaPt_phi"), mom.Phi(), mom.Eta(), pt); + histos.fill(HIST("NUA/hPhiEtaVtxz_phi"), phi, mom.Eta(), collision.posZ()); + histos.fill(HIST("NUA/hPhiPtCent_phi"), phi, pt, collision.centFT0C()); + histos.fill(HIST("NUA/hPhiEtaPt_phi"), phi, mom.Eta(), pt); } - double weff = 1; double waccPOI = getAcceptancePhi(mom, collision, Phi); if (withinPtPOI) - fGFW->Fill(mom.Eta(), ((fPtAxis->FindBin(pt) - 1) * fPhiMassAxis->GetNbins()) + (fPhiMassAxis->FindBin(invMass) - 1), mom.Phi(), weff * waccPOI, 2); + fGFW->Fill(mom.Eta(), ((fPtAxis->FindBin(pt) - 1) * fPhiMassAxis->GetNbins()) + (fPhiMassAxis->FindBin(invMass) - 1), phi, weff * waccPOI, 2); if (withinPtPOI && withinPtRef) - fGFW->Fill(mom.Eta(), ((fPtAxis->FindBin(pt) - 1) * fPhiMassAxis->GetNbins()) + (fPhiMassAxis->FindBin(invMass) - 1), mom.Phi(), weff * waccPOI, 32); + fGFW->Fill(mom.Eta(), ((fPtAxis->FindBin(pt) - 1) * fPhiMassAxis->GetNbins()) + (fPhiMassAxis->FindBin(invMass) - 1), phi, weff * waccPOI, 32); } } return; @@ -875,10 +886,6 @@ struct ResonancesGfwFlow { return false; } histos.fill(HIST("hLambdaCount"), 9.5); - // Mass cross check - if (cfgUseMCCLambda && std::abs(massK0Short - 0.497614) < vMccCut[Lambda - 1]) - return false; - histos.fill(HIST("hLambdaCount"), 10.5); bool withinPtPOI = (cfgCutPtPOIMin < candidate.pt()) && (candidate.pt() < cfgCutPtPOIMax); // within POI pT range bool withinPtRef = (cfgCutPtMin < candidate.pt()) && (candidate.pt() < cfgCutPtMax); @@ -965,12 +972,6 @@ struct ResonancesGfwFlow { if (!selectionV0Daughter(postrack, 0) || !selectionV0Daughter(negtrack, 0)) return false; histos.fill(HIST("hK0Count"), 9.5); - // Mass cross check - if (cfgUseMCCK0 && std::abs(massLambda - 1.11568) < vMccCut[K0 - 1]) - return false; - if (cfgUseMCCK0 && std::abs(massLambda - 1.11568) < vMccCut[K0 - 1]) - return false; - histos.fill(HIST("hK0Count"), 10.5); bool withinPtPOI = (cfgCutPtPOIMin < candidate.pt()) && (candidate.pt() < cfgCutPtPOIMax); // within POI pT range bool withinPtRef = (cfgCutPtMin < candidate.pt()) && (candidate.pt() < cfgCutPtMax); @@ -1087,6 +1088,8 @@ struct ResonancesGfwFlow { double pt = track.pt(); bool withinPtRef = (cfgCutPtMin < pt) && (pt < cfgCutPtMax); + weff = 1; // Initializing weff for each track + if (withinPtRef) if (cfgOutputNUAWeights) fillWeights(track, collision, Ref); @@ -1117,19 +1120,18 @@ struct ResonancesGfwFlow { } for (auto const& v0s : V0s) { - if (cfgUseLambda) { - if (selectionLambda(collision, v0s) == true) - histos.fill(HIST("hLambdas"), 1); - } if (cfgUseK0) { if (selectionK0(collision, v0s) == true) histos.fill(HIST("hK0s"), 1); } + if (cfgUseLambda) { + if (selectionLambda(collision, v0s) == true) + histos.fill(HIST("hLambdas"), 1); + } } // End of v0 loop fillResoProfile(corrconfigs.at(0), HIST("Refc22"), cent, fPhiMassAxis); fillResoProfile(corrconfigs.at(1), HIST("Refc24"), cent, fPhiMassAxis); - if (cfgUsePhi) { fillResoProfile(corrconfigs.at(2), HIST("Phid22Fpt"), cent, fPhiMassAxis); fillResoProfile(corrconfigs.at(3), HIST("Phid24Fpt"), cent, fPhiMassAxis); @@ -1185,7 +1187,6 @@ struct ResonancesGfwFlow { fillProfileBoot3D(corrconfigs.at(16), anLambdaD22BPtBoot[bootId], cent, fLambdaMassAxis); fillProfileBoot3D(corrconfigs.at(17), anLambdaD24BPtBoot[bootId], cent, fLambdaMassAxis); } - } // end of bootstrap condition } // end of process }; From c47526f17c01ad75d3d2469abd30943561a5e9d4 Mon Sep 17 00:00:00 2001 From: omvazque Date: Wed, 23 Apr 2025 01:35:53 -0500 Subject: [PATCH 1061/1650] [PWGLF] Combines Corrections and MC closure (#10944) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 919 +++++++++---------- 1 file changed, 451 insertions(+), 468 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index 72a89b7d5de..de05a2bf275 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -25,6 +25,7 @@ #include #include #include +#include #include "Common/CCDB/EventSelectionParams.h" #include "Common/CCDB/TriggerAliases.h" @@ -55,17 +56,11 @@ using namespace o2::constants::math; namespace o2::aod { -using ColEvSels = - soa::Join; -using BCsRun3 = - soa::Join; -using TracksSel = soa::Join; -using SimCollisions = soa::Join; -using SimTracks = soa::Join; +using ColEvSels = soa::Join; +using BCsRun3 = soa::Join; +using TracksSel = soa::Join; +using SimCollisions = soa::Join; +using SimTracks = soa::Join; } // namespace o2::aod struct UccZdc { @@ -101,7 +96,7 @@ struct UccZdc { ConfigurableAxis binsPt{"binsPt", {VARIABLE_WIDTH, 0.0, 0.1, 0.12}, "pT binning"}; ConfigurableAxis binsCent{"binsCent", {VARIABLE_WIDTH, 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.}, "T0C binning"}; - // Configurable event selectiond and flags ZDC + // Configurables Event Selection Configurable isNoCollInTimeRangeStrict{"isNoCollInTimeRangeStrict", true, "isNoCollInTimeRangeStrict?"}; Configurable isNoCollInTimeRangeStandard{"isNoCollInTimeRangeStandard", false, "isNoCollInTimeRangeStandard?"}; Configurable isNoCollInRofStrict{"isNoCollInRofStrict", true, "isNoCollInRofStrict?"}; @@ -110,14 +105,9 @@ struct UccZdc { Configurable isNoCollInTimeRangeNarrow{"isNoCollInTimeRangeNarrow", false, "isNoCollInTimeRangeNarrow?"}; Configurable isOccupancyCut{"isOccupancyCut", true, "Occupancy cut?"}; Configurable isApplyFT0CbasedOccupancy{"isApplyFT0CbasedOccupancy", false, "T0C Occu cut?"}; - Configurable isAmpZDC{"isAmpZDC", false, "Use amplitude ZDC?"}; - Configurable isCommPMT{"isCommPMT", false, "Use common PMT ZDC?"}; - Configurable isSumTowers{"isSumTowers", false, "Use sum of Tow ZDC?"}; Configurable isTDCcut{"isTDCcut", false, "Use TDC cut?"}; Configurable isZEMcut{"isZEMcut", true, "Use ZEM cut?"}; - Configurable isZNbasedSel{"isZNbasedSel", false, "Use ZN based Sel."}; - Configurable isZNAbasedSel{"isZNAbasedSel", false, "Use ZNA based Sel."}; - Configurable isZNCbasedSel{"isZNCbasedSel", false, "Use ZNC based Sel."}; + Configurable znBasedCut{"znBasedCut", 100, "ZN-based cut"}; Configurable zemCut{"zemCut", 1000., "ZEM cut"}; Configurable tdcCut{"tdcCut", 1., "TDC cut"}; @@ -145,12 +135,8 @@ struct UccZdc { Zem }; - // Histograms names - static constexpr std::string_view PsTitles[4] = { - ";#it{N}_{ch} (|#eta| < 0.8, Corrected);#LT[#it{p}_{T}^{(1)}]#GT;", - ";#it{N}_{ch} (|#eta| < 0.8, Corrected);#LT[#it{p}_{T}^{(2)}]#GT;", - ";#it{N}_{ch} (|#eta| < 0.8, Corrected);#LT[#it{p}_{T}^{(3)}]#GT;", - ";#it{N}_{ch} (|#eta| < 0.8, Corrected);#LT[#it{p}_{T}^{(4)}]#GT;"}; + static constexpr float zEro{0.}; + static constexpr float oneHalf{0.5}; // Filters // Filter trackFilter = ((aod::track::eta > minEta) && (aod::track::eta < maxEta) && (aod::track::pt > minPt) && (aod::track::pt < maxPt) && requireGlobalTrackInFilter()); @@ -167,12 +153,7 @@ struct UccZdc { using TheFilteredSimTracks = soa::Filtered; // Histograms: Data - HistogramRegistry registry{ - "registry", - {}, - OutputObjHandlingPolicy::AnalysisObject, - true, - true}; + HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; Service ccdb; Configurable paTH{"paTH", "Users/o/omvazque/TrackingEfficiency", "base path to the ccdb object"}; @@ -218,119 +199,114 @@ struct UccZdc { // Histograms: paritcle-level info if (doprocessZdcCollAss) { - registry.add("NchVsZpos", ";#it{N}_{ch} (|#eta| < 0.8);Vtx_{z};", - kTProfile, {{nBinsNch, minNch, maxNch}}); + registry.add("T0Ccent", ";;Entries", kTH1F, {axisCent}); registry.add("ZposVsEta", "", kTProfile, {axisZpos}); - registry.add("EtaVsPhi", ";#eta;#varphi", kTH2F, - {{{axisEta}, {100, -0.1 * PI, +2.1 * PI}}}); - registry.add("NchVsPt", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);;", kTH2F, - {{{nBinsNch, minNch, maxNch}, {axisPt}}}); + registry.add("EtaVsPhi", ";#eta;#varphi", kTH2F, {{{axisEta}, {100, -0.1 * PI, +2.1 * PI}}}); registry.add("sigma1Pt", ";;#sigma(p_{T})/p_{T};", kTProfile, {axisPt}); - registry.add("dcaXYvspT", ";DCA_{xy} (cm);;", kTH2F, - {{{50, -1., 1.}, {axisPt}}}); - registry.add("ZN", ";ZNA+ZNC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); - registry.add("ZNA", ";ZNA;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); - registry.add("ZPA", ";ZPA;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZP}}); - registry.add("ZNC", ";ZNC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); - registry.add("ZPC", ";ZPC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZP}}); - registry.add("ZNVsZEM", ";ZEM;ZNA+ZNC;", kTH2F, - {{{60, -0.5, maxZEM}, {60, -0.5, maxZN}}}); - registry.add("ZNAVsZNC", ";ZNC;ZNA", kTH2F, - {{{30, -0.5, maxZN}, {30, -0.5, maxZN}}}); - registry.add("ZPAVsZPC", ";ZPC;ZPA;", kTH2F, - {{{100, -0.5, maxZP}, {100, -0.5, maxZP}}}); - registry.add("ZNAVsZPA", ";ZPA;ZNA;", kTH2F, - {{{20, -0.5, maxZP}, {30, -0.5, maxZN}}}); - registry.add("ZNCVsZPC", ";ZPC;ZNC;", kTH2F, - {{{20, -0.5, maxZP}, {30, -0.5, maxZN}}}); - registry.add("ZNCVstdc", ";t_{ZNC};ZNC;", kTH2F, - {{{30, -15., 15.}, {nBinsZDC, -0.5, maxZN}}}); - registry.add("ZNAVstdc", ";t_{ZNA};ZNA;", kTH2F, - {{{30, -15., 15.}, {30, -0.5, maxZN}}}); - registry.add("ZPCVstdc", ";t_{ZPC};ZPC;", kTH2F, - {{{30, -15., 15}, {20, -0.5, maxZP}}}); - registry.add("ZPAVstdc", ";t_{ZPA};ZPA;", kTH2F, - {{{30, -15., 15.}, {20, -0.5, maxZP}}}); - registry.add("ZEM1Vstdc", ";t_{ZEM1};ZEM1;", kTH2F, - {{{30, -15., 15.}, {30, -0.5, 2000.5}}}); - registry.add("ZEM2Vstdc", ";t_{ZEM2};ZEM2;", kTH2F, - {{{30, -15., 15.}, {30, -0.5, 2000.5}}}); - registry.add("debunch", ";t_{ZDC}-t_{ZDA};t_{ZDC}+t_{ZDA}", kTH2F, - {{{nBinsTDC, minTdc, maxTdc}, {nBinsTDC, minTdc, maxTdc}}}); - registry.add("NchVsFT0C", ";T0C (#times 1/100);#it{N}_{ch} (|#eta|<0.8);", kTProfile, {{nBinsAmpFT0, 0., 950.}}); - registry.add("NchVsFT0M", ";T0A+T0C (#times 1/100);#it{N}_{ch} (|#eta|<0.8);", kTProfile, {{nBinsAmpFT0, 0., 3000.}}); - registry.add("NchVsFT0A", ";T0A (#times 1/100);#it{N}_{ch} (|#eta|<0.8);", kTProfile, {{nBinsAmpFT0, 0., maxAmpFT0}}); - registry.add("NchVsFV0A", ";V0A (#times 1/100);#it{N}_{ch} (|#eta|<0.8);", kTProfile, {{nBinsAmpFV0, 0., maxAmpFV0}}); - registry.add("NchVsNPV", ";#it{N}_{PV} (|#eta|<1);#LT ITS+TPC tracks #GT (|#eta|<0.8);", kTProfile, {{nBinsNch, minNch, maxNch}}); - registry.add("NchVsITStracks", ";ITS tracks nCls >= 5;#LTITS+TPC tracks#GT (|#eta|<0.8);", kTProfile, {{nBinsNch, minNch, maxNch}}); - registry.add("ZNCVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNC;", kTH2F, - {{{nBinsNch, minNch, maxNch}, {nBinsZDC, minNch, maxZN}}}); - registry.add("ZNAVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA;", kTH2F, - {{{nBinsNch, minNch, maxNch}, {nBinsZDC, minNch, maxZN}}}); - registry.add("ZNVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA+ZNC;", kTH2F, - {{{nBinsNch, minNch, maxNch}, {nBinsZDC, minNch, maxZN}}}); - registry.add("ZNVsFT0A", ";T0A (#times 1/100);ZNA+ZNC;", kTH2F, - {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsZDC, minNch, maxZN}}}); - registry.add("ZNVsFT0C", ";T0C (#times 1/100);ZNA+ZNC;", kTH2F, - {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsZDC, minNch, maxZN}}}); - registry.add("ZNVsFT0M", ";T0A+T0C (#times 1/100);ZNA+ZNC;", kTH2F, - {{{nBinsAmpFT0, 0., 3000.}, {nBinsZDC, minNch, maxZN}}}); - registry.add("ZNDifVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA-ZNC;", kTH2F, - {{{nBinsNch, minNch, maxNch}, {100, -50., 50.}}}); - } - - if (doprocessMCclosure || doprocessZdcCollAss) { - registry.add("NchRaw", ";#it{N}_{ch} (|#eta| < 0.8);", kTH1F, - {{nBinsNch, minNch, maxNch}}); - registry.add("Nch", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);", kTH1F, - {{nBinsNch, minNch, maxNch}}); - registry.add("T0Ccent", ";;Entries", kTH1F, {axisCent}); - registry.add("NchVsOneParCorr", PsTitles[0].data(), kTProfile, - {{nBinsNch, minNch, maxNch}}); - registry.add("NchVsTwoParCorr", PsTitles[1].data(), kTProfile, - {{nBinsNch, minNch, maxNch}}); - registry.add("NchVsThreeParCorr", PsTitles[2].data(), kTProfile, - {{nBinsNch, minNch, maxNch}}); - registry.add("NchVsFourParCorr", PsTitles[3].data(), kTProfile, - {{nBinsNch, minNch, maxNch}}); + registry.add("dcaXYvspT", ";DCA_{xy} (cm);;", kTH2F, {{{50, -1., 1.}, {axisPt}}}); + + registry.add("NchRaw", ";#it{N}_{ch} (|#eta| < 0.8);", kTH1F, {{nBinsNch, minNch, maxNch}}); + registry.add("Nch", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);", kTH1F, {{nBinsNch, minNch, maxNch}}); + registry.add("NchVsPt", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);;", kTH2F, {{{nBinsNch, minNch, maxNch}, {axisPt}}}); + registry.add("NchVsOneParCorr", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);#LT[#it{p}_{T}^{(1)}]#GT (GeV/#it{c})", kTProfile, {{nBinsNch, minNch, maxNch}}); + registry.add("NchVsOneParCorrVsZN", ";#it{N}_{ch} (|#eta| < 0.8, Corrected); ZNA+ZNC; #LT[#it{p}_{T}^{(1)}]#GT", kTProfile2D, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, -0.5, maxZN}}}); + registry.add("NchVsTwoParCorrVsZN", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);ZNA+ZNC;#LT[#it{p}_{T}^{(2)}]#GT", kTProfile2D, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, -0.5, maxZN}}}); + registry.add("NchVsThreeParCorrVsZN", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);ZNA+ZNC;#LT[#it{p}_{T}^{(3)}]#GT", kTProfile2D, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, -0.5, maxZN}}}); + registry.add("NchVsFourParCorrVsZN", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);ZNA+ZNC;#LT[#it{p}_{T}^{(4)}]#GT", kTProfile2D, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, -0.5, maxZN}}}); } // MC Histograms - if (doprocesspTEff) { - registry.add("T0Ccent", ";;Entries", kTH1F, {axisCent}); + if (doprocessMCclosure) { + registry.add("RandomNumber", "", kTH1F, {{100, 0., 1.}}); + registry.add("EvtsDivided", ";Event type;Entries;", kTH1F, {{2, -0.5, 1.5}}); + auto hEvtsDiv = registry.get(HIST("EvtsDivided")); + auto* xEvtsDiv = hEvtsDiv->GetXaxis(); + xEvtsDiv->SetBinLabel(1, "MC closure"); + xEvtsDiv->SetBinLabel(2, "Corrections"); + + registry.add("NchGen", "MC closure;#it{N}_{ch} (|#eta| < 0.8);Entries;", kTH1F, {{nBinsNch, minNch, maxNch}}); + registry.add("NchvsOneParCorrGen", "MC closure;#it{N}_{ch} (|#eta| < 0.8);#LT[#it{p}_{T}^{(1)}]#GT (GeV/#it{c})", kTProfile, {{nBinsNch, minNch, maxNch}}); + registry.add("NchvsTwoParCorrGen", "MC closure;#it{N}_{ch} (|#eta| < 0.8);#LT[#it{p}_{T}^{(2)}]#GT", kTProfile, {{nBinsNch, minNch, maxNch}}); + registry.add("NchvsThreeParCorrGen", "MC closure;#it{N}_{ch} (|#eta| < 0.8);#LT[#it{p}_{T}^{(3)}]#GT", kTProfile, {{nBinsNch, minNch, maxNch}}); + registry.add("NchvsFourParCorrGen", "MC closure;#it{N}_{ch} (|#eta| < 0.8);#LT[#it{p}_{T}^{(4)}]#GT", kTProfile, {{nBinsNch, minNch, maxNch}}); + + registry.add("T0Ccent", "Filled at MC closure + Corrections;;Entries", kTH1F, {axisCent}); + registry.add("NchRaw", "MC closure;#it{N}_{ch} (|#eta| < 0.8);Entries;", kTH1F, {{nBinsNch, minNch, maxNch}}); + registry.add("Nch", "MC closure;#it{N}_{ch} (|#eta| < 0.8, Corrected);Entries;", kTH1F, {{nBinsNch, minNch, maxNch}}); + registry.add("NchVsOneParCorr", "MC closure;#it{N}_{ch} (|#eta| < 0.8, Corrected);#LT[#it{p}_{T}^{(1)}]#GT (GeV/#it{c})", kTProfile, {{nBinsNch, minNch, maxNch}}); + registry.add("NchVsTwoParCorr", "MC closure;#it{N}_{ch} (|#eta| < 0.8, Corrected);#LT[#it{p}_{T}^{(2)}]#GT", kTProfile, {{nBinsNch, minNch, maxNch}}); + registry.add("NchVsThreeParCorr", "MC closure;#it{N}_{ch} (|#eta| < 0.8, Corrected);#LT[#it{p}_{T}^{(3)}]#GT", kTProfile, {{nBinsNch, minNch, maxNch}}); + registry.add("NchVsFourParCorr", "MC closure;#it{N}_{ch} (|#eta| < 0.8, Corrected);#LT[#it{p}_{T}^{(4)}]#GT", kTProfile, {{nBinsNch, minNch, maxNch}}); + + // Corrections registry.add("nRecColvsCent", "", kTH2F, {{6, -0.5, 5.5}, {{axisCent}}}); - registry.add("Pt_all_ch", "", kTH2F, {{axisCent}, {axisPt}}); - registry.add("Pt_ch", "", kTH2F, {{axisCent}, {axisPt}}); - registry.add("Pt_pi", "", kTH2F, {{axisCent}, {axisPt}}); - registry.add("Pt_ka", "", kTH2F, {{axisCent}, {axisPt}}); - registry.add("Pt_pr", "", kTH2F, {{axisCent}, {axisPt}}); - registry.add("Pt_sigpos", "", kTH2F, {{axisCent}, {axisPt}}); - registry.add("Pt_signeg", "", kTH2F, {{axisCent}, {axisPt}}); - registry.add("Pt_re", "", kTH2F, {{axisCent}, {axisPt}}); - registry.add("EtaVsPhi", ";;#varphi;", kTH2F, - {{{axisEta}, {100, -0.1 * PI, +2.1 * PI}}}); + registry.add("Pt_all_ch", "Corrections;;;", kTH2F, {{axisCent}, {axisPt}}); + registry.add("Pt_ch", "Corrections;;;", kTH2F, {{axisCent}, {axisPt}}); + registry.add("Pt_pi", "Corrections;;;", kTH2F, {{axisCent}, {axisPt}}); + registry.add("Pt_ka", "Corrections;;;", kTH2F, {{axisCent}, {axisPt}}); + registry.add("Pt_pr", "Corrections;;;", kTH2F, {{axisCent}, {axisPt}}); + registry.add("Pt_sigpos", "Corrections;;;", kTH2F, {{axisCent}, {axisPt}}); + registry.add("Pt_signeg", "Corrections;;;", kTH2F, {{axisCent}, {axisPt}}); + registry.add("Pt_re", "Corrections;;;", kTH2F, {{axisCent}, {axisPt}}); + registry.add("EtaVsPhi", "Corrections;;#varphi;", kTH2F, {{{axisEta}, {100, -0.1 * PI, +2.1 * PI}}}); registry.add("hEventCounterMC", "Event counter", kTH1F, {axisEvent}); - registry.add("zPosMC", ";;Entries;", kTH1F, {axisZpos}); - registry.add("PtMC_ch", "", kTH2F, {{axisCent}, {axisPt}}); - registry.add("PtMC_pi", "", kTH2F, {{axisCent}, {axisPt}}); - registry.add("PtMC_ka", "", kTH2F, {{axisCent}, {axisPt}}); - registry.add("PtMC_pr", "", kTH2F, {{axisCent}, {axisPt}}); - registry.add("PtMC_sigpos", "", kTH2F, {{axisCent}, {axisPt}}); - registry.add("PtMC_signeg", "", kTH2F, {{axisCent}, {axisPt}}); - registry.add("PtMC_re", "", kTH2F, {{axisCent}, {axisPt}}); + registry.add("zPosMC", "Filled at MC closure + Corrections;;Entries;", kTH1F, {axisZpos}); + registry.add("PtMC_ch", "Corrections;;;", kTH2F, {{axisCent}, {axisPt}}); + registry.add("PtMC_pi", "Corrections;;;", kTH2F, {{axisCent}, {axisPt}}); + registry.add("PtMC_ka", "Corrections;;;", kTH2F, {{axisCent}, {axisPt}}); + registry.add("PtMC_pr", "Corrections;;;", kTH2F, {{axisCent}, {axisPt}}); + registry.add("PtMC_sigpos", "Corrections;;;", kTH2F, {{axisCent}, {axisPt}}); + registry.add("PtMC_signeg", "Corrections;;;", kTH2F, {{axisCent}, {axisPt}}); + registry.add("PtMC_re", "Corrections;;;", kTH2F, {{axisCent}, {axisPt}}); + + auto hECMC = registry.get(HIST("hEventCounterMC")); + auto* x = hECMC->GetXaxis(); + x->SetBinLabel(1, "All"); + x->SetBinLabel(13, "VtxZ cut"); } - if (doprocessMCclosure) { - registry.add("NchGen", ";Nch;Entries;", kTH1F, - {{nBinsNch, minNch, maxNch}}); - registry.add("NchvsOneParCorrGen", PsTitles[0].data(), kTProfile, - {{nBinsNch, minNch, maxNch}}); - registry.add("NchvsTwoParCorrGen", PsTitles[1].data(), kTProfile, - {{nBinsNch, minNch, maxNch}}); - registry.add("NchvsThreeParCorrGen", PsTitles[2].data(), kTProfile, - {{nBinsNch, minNch, maxNch}}); - registry.add("NchvsFourParCorrGen", PsTitles[3].data(), kTProfile, - {{nBinsNch, minNch, maxNch}}); + if (doprocessQA) { + registry.add("T0Ccent", ";;Entries", kTH1F, {axisCent}); + + registry.add("ZNVsFT0A", ";T0A (#times 1/100);ZNA+ZNC;", kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsZDC, -0.5, maxZN}}}); + registry.add("ZNVsFT0C", ";T0C (#times 1/100);ZNA+ZNC;", kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsZDC, -0.5, maxZN}}}); + registry.add("ZNVsFT0M", ";T0A+T0C (#times 1/100);ZNA+ZNC;", kTH2F, {{{nBinsAmpFT0, 0., 3000.}, {nBinsZDC, -0.5, maxZN}}}); + + registry.add("ZN", ";ZNA+ZNC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); + registry.add("ZNA", ";ZNA;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); + registry.add("ZPA", ";ZPA;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZP}}); + registry.add("ZNC", ";ZNC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); + registry.add("ZPC", ";ZPC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZP}}); + registry.add("ZNAVsZNC", ";ZNC;ZNA", kTH2F, {{{30, -0.5, maxZN}, {30, -0.5, maxZN}}}); + registry.add("ZPAVsZPC", ";ZPC;ZPA;", kTH2F, {{{100, -0.5, maxZP}, {100, -0.5, maxZP}}}); + registry.add("ZNAVsZPA", ";ZPA;ZNA;", kTH2F, {{{20, -0.5, maxZP}, {30, -0.5, maxZN}}}); + registry.add("ZNCVsZPC", ";ZPC;ZNC;", kTH2F, {{{20, -0.5, maxZP}, {30, -0.5, maxZN}}}); + registry.add("ZNCcvsZNCsum", ";ZNC common;ZNC sum towers;", kTH2F, {{{30, -0.5, maxZN}, {30, -0.5, maxZN}}}); + registry.add("ZNAcvsZNAsum", ";ZNA common;ZNA sum towers;", kTH2F, {{{30, -0.5, maxZN}, {30, -0.5, maxZN}}}); + registry.add("ZPCcvsZPCsum", ";ZPC common;ZPC sum towers;", kTH2F, {{{30, -0.5, maxZP}, {30, -0.5, maxZP}}}); + registry.add("ZPAcvsZPAsum", ";ZPA common;ZPA sum towers;", kTH2F, {{{30, -0.5, maxZP}, {30, -0.5, maxZP}}}); + registry.add("ZNVsZEM", ";ZEM;ZNA+ZNC;", kTH2F, {{{60, -0.5, maxZEM}, {60, -0.5, maxZN}}}); + registry.add("ZNCVstdc", ";t_{ZNC};ZNC;", kTH2F, {{{30, -15., 15.}, {nBinsZDC, -0.5, maxZN}}}); + registry.add("ZNAVstdc", ";t_{ZNA};ZNA;", kTH2F, {{{30, -15., 15.}, {30, -0.5, maxZN}}}); + registry.add("ZPCVstdc", ";t_{ZPC};ZPC;", kTH2F, {{{30, -15., 15}, {20, -0.5, maxZP}}}); + registry.add("ZPAVstdc", ";t_{ZPA};ZPA;", kTH2F, {{{30, -15., 15.}, {20, -0.5, maxZP}}}); + registry.add("ZEM1Vstdc", ";t_{ZEM1};ZEM1;", kTH2F, {{{30, -15., 15.}, {30, -0.5, 2000.5}}}); + registry.add("ZEM2Vstdc", ";t_{ZEM2};ZEM2;", kTH2F, {{{30, -15., 15.}, {30, -0.5, 2000.5}}}); + registry.add("debunch", ";t_{ZDC}-t_{ZDA};t_{ZDC}+t_{ZDA}", kTH2F, {{{nBinsTDC, minTdc, maxTdc}, {nBinsTDC, minTdc, maxTdc}}}); + + registry.add("NchVsFT0C", ";T0C (#times 1/100, -3.3 < #eta < -2.1);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFT0, 0., 950.}, {nBinsNch, minNch, maxNch}}}); + registry.add("NchVsFT0M", ";T0A+T0C (#times 1/100, -3.3 < #eta < -2.1 and 3.5 < #eta < 4.9);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFT0, 0., 3000.}, {nBinsNch, minNch, maxNch}}}); + registry.add("NchVsFT0A", ";T0A (#times 1/100, 3.5 < #eta < 4.9);#it{N}_{ch} (|#eta|<0.8);", kTProfile, {{nBinsAmpFT0, 0., maxAmpFT0}}); + registry.add("NchVsFV0A", ";V0A (#times 1/100, 2.2 < #eta < 5);#it{N}_{ch} (|#eta|<0.8);", kTProfile, {{nBinsAmpFV0, 0., maxAmpFV0}}); + + registry.add("NchVsEt", ";#it{E}_{T} (|#eta|<0.8);#LTITS+TPC tracks#GT (|#eta|<0.8);", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsNch, minNch, maxNch}}}); + registry.add("NchVsMeanPt", ";#it{N}_{ch} (|#eta|<0.8);#LT[#it{p}_{T}]#GT (|#eta|<0.8);", kTProfile, {{nBinsNch, minNch, maxNch}}); + registry.add("NchVsNPV", ";#it{N}_{PV} (|#eta|<1);#LT ITS+TPC tracks #GT (|#eta|<0.8);", kTProfile, {{6000, -0.5, 5999.5}}); + registry.add("NchVsITStracks", ";ITS tracks nCls >= 5;#LTITS+TPC tracks#GT (|#eta|<0.8);", kTProfile, {{6000, -0.5, 5999.5}}); + registry.add("ZNCVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNC;", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, minNch, maxZN}}}); + registry.add("ZNAVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA;", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, minNch, maxZN}}}); + registry.add("ZNVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA+ZNC;", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, minNch, maxZN}}}); + registry.add("ZNDifVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA-ZNC;", kTH2F, {{{nBinsNch, minNch, maxNch}, {100, -50., 50.}}}); } ccdb->setURL(uRl.value); @@ -410,12 +386,10 @@ struct UccZdc { } if (isOccupancyCut) { - auto occuValue{isApplyFT0CbasedOccupancy - ? col.ft0cOccupancyInTimeRange() - : col.trackOccupancyInTimeRange()}; - - if (occuValue < minOccCut || occuValue > maxOccCut) + auto occuValue{isApplyFT0CbasedOccupancy ? col.ft0cOccupancyInTimeRange() : col.trackOccupancyInTimeRange()}; + if (occuValue < minOccCut || occuValue > maxOccCut) { return false; + } } registry.fill(HIST("hEventCounter"), EvCutLabel::OccuCut); @@ -433,85 +407,24 @@ struct UccZdc { return true; } - void processZdcCollAss(o2::aod::ColEvSels::iterator const& collision, - o2::aod::BCsRun3 const& /*bcs*/, - aod::Zdcs const& /*zdcs*/, aod::FV0As const& /*fv0as*/, - aod::FT0s const& /*ft0s*/, - TheFilteredTracks const& tracks) + void processQA(o2::aod::ColEvSels::iterator const& collision, o2::aod::BCsRun3 const& /**/, aod::Zdcs const& /**/, aod::FV0As const& /**/, aod::FT0s const& /**/, TheFilteredTracks const& tracks) { + + // LOG(info) << " Collisions size: " << collisions.size() << " Table's size: " << collisions.tableSize() << "\n"; + const auto& foundBC = collision.foundBC_as(); + // LOG(info) << "Run number: " << foundBC.runNumber() << "\n"; if (!isEventSelected(collision)) { return; } - const auto& foundBC = collision.foundBC_as(); - if (!foundBC.has_zdc()) { // has ZDC? + // has ZDC? + if (!foundBC.has_zdc()) { return; } registry.fill(HIST("hEventCounter"), EvCutLabel::Zdc); + auto zdc = foundBC.zdc(); - float aT0A{0.0}; - float aT0C{0.0}; - float aV0A{0.0}; - float znA{0.0}; - float znC{0.0}; - float zpA{0.0}; - float zpC{0.0}; - float aZEM1{0.0}; - float aZEM2{0.0}; - float tZEM1{0.0}; - float tZEM2{0.0}; - float tZNA{0.0}; - float tZNC{0.0}; - float tZPA{0.0}; - float tZPC{0.0}; - float sumZNs{0.0}; - float sumZEMs{0.0}; - float tZDCdif{0.0}; - float tZDCsum{0.0}; - - aZEM1 = foundBC.zdc().amplitudeZEM1(); - aZEM2 = foundBC.zdc().amplitudeZEM2(); - tZEM1 = foundBC.zdc().timeZEM1(); - tZEM2 = foundBC.zdc().timeZEM2(); - tZNA = foundBC.zdc().timeZNA(); - tZNC = foundBC.zdc().timeZNC(); - tZPA = foundBC.zdc().timeZPA(); - tZPC = foundBC.zdc().timeZPC(); - tZDCdif = tZNC + tZPC - tZNA - tZPA; - tZDCsum = tZNC + tZPC + tZNA + tZPA; - - if (isAmpZDC) { - znA = foundBC.zdc().amplitudeZNA(); - znC = foundBC.zdc().amplitudeZNC(); - zpA = foundBC.zdc().amplitudeZPA(); - zpC = foundBC.zdc().amplitudeZPC(); - } else if (isCommPMT) { - znA = foundBC.zdc().energyCommonZNA(); - znC = foundBC.zdc().energyCommonZNC(); - zpA = foundBC.zdc().energyCommonZPA(); - zpC = foundBC.zdc().energyCommonZPC(); - } else if (isSumTowers) { - for (const auto& eZNA : foundBC.zdc().energySectorZNA()) - znA += eZNA; - for (const auto& eZNC : foundBC.zdc().energySectorZNC()) - znC += eZNC; - for (const auto& eZPA : foundBC.zdc().energySectorZPA()) - zpA += eZPA; - for (const auto& eZPC : foundBC.zdc().energySectorZPC()) - zpC += eZPC; - } else { - znA = -999.; - znC = -999.; - zpA = -999.; - zpC = -999.; - } - znA /= 2.81; - znC /= 2.81; - zpA /= 2.81; - zpC /= 2.81; - sumZNs = znA + znC; - sumZEMs = aZEM1 + aZEM2; - + float aT0A = 0., aT0C = 0., aV0A = 0.; if (foundBC.has_ft0()) { for (const auto& amplitude : foundBC.ft0().amplitudeA()) { aT0A += amplitude; @@ -532,6 +445,13 @@ struct UccZdc { aV0A = -999.; } + float tZNA{zdc.timeZNA()}; + float tZNC{zdc.timeZNC()}; + float tZPA{zdc.timeZPA()}; + float tZPC{zdc.timeZPC()}; + float tZDCdif{tZNC + tZPC - tZNA - tZPA}; + float tZDCsum{tZNC + tZPC + tZNA + tZPA}; + // TDC cut if (isTDCcut) { if (std::sqrt(std::pow(tZDCdif, 2.) + std::pow(tZDCsum, 2.)) > tdcCut) { @@ -540,6 +460,10 @@ struct UccZdc { registry.fill(HIST("hEventCounter"), EvCutLabel::Tdc); } + float aZEM1{zdc.amplitudeZEM1()}; + float aZEM2{zdc.amplitudeZEM2()}; + float sumZEMs{aZEM1 + aZEM2}; + // ZEM cut if (isZEMcut) { if (sumZEMs < zemCut) { @@ -548,13 +472,51 @@ struct UccZdc { registry.fill(HIST("hEventCounter"), EvCutLabel::Zem); } + float znA{zdc.amplitudeZNA()}; + float znC{zdc.amplitudeZNC()}; + float zpA{zdc.amplitudeZPA()}; + float zpC{zdc.amplitudeZPC()}; + znA /= 2.81; + znC /= 2.81; + zpA /= 2.81; + zpC /= 2.81; + + float tZEM1{zdc.timeZEM1()}; + float tZEM2{zdc.timeZEM2()}; + float sumZNs{znA + znC}; + + float sumZNC = (zdc.energySectorZNC())[0] + (zdc.energySectorZNC())[1] + (zdc.energySectorZNC())[2] + (zdc.energySectorZNC())[3]; + float sumZNA = (zdc.energySectorZNA())[0] + (zdc.energySectorZNA())[1] + (zdc.energySectorZNA())[2] + (zdc.energySectorZNA())[3]; + float sumZPC = (zdc.energySectorZPC())[0] + (zdc.energySectorZPC())[1] + (zdc.energySectorZPC())[2] + (zdc.energySectorZPC())[3]; + float sumZPA = (zdc.energySectorZPA())[0] + (zdc.energySectorZPA())[1] + (zdc.energySectorZPA())[2] + (zdc.energySectorZPA())[3]; + + int itsTracks = 0, glbTracks = 0; + float et = 0., meanpt = 0.; + for (const auto& track : tracks) { + if (track.hasITS() && track.itsNCls() >= minITSnCls) { + itsTracks++; + } + // Track Selection + if (track.isGlobalTrack()) { + glbTracks++; + meanpt += track.pt(); + et += std::sqrt(std::pow(track.pt(), 2.) + std::pow(o2::constants::physics::MassPionCharged, 2.)); + } + } + registry.fill(HIST("zPos"), collision.posZ()); registry.fill(HIST("T0Ccent"), collision.centFT0C()); - registry.fill(HIST("ZN"), znA + znC); + + registry.fill(HIST("ZNCcvsZNCsum"), sumZNC / 2.81, zdc.energyCommonZNC() / 2.81); + registry.fill(HIST("ZNAcvsZNAsum"), sumZNA / 2.81, zdc.energyCommonZNA() / 2.81); + registry.fill(HIST("ZPCcvsZPCsum"), sumZPC / 2.81, zdc.energyCommonZPC() / 2.81); + registry.fill(HIST("ZPAcvsZPAsum"), sumZPA / 2.81, zdc.energyCommonZPA() / 2.81); + registry.fill(HIST("ZNA"), znA); registry.fill(HIST("ZNC"), znC); registry.fill(HIST("ZPA"), zpA); registry.fill(HIST("ZPC"), zpC); + registry.fill(HIST("ZN"), znA + znC); registry.fill(HIST("ZNAVsZNC"), znC, znA); registry.fill(HIST("ZNAVsZPA"), zpA, znA); registry.fill(HIST("ZNCVsZPC"), zpC, znC); @@ -568,20 +530,93 @@ struct UccZdc { registry.fill(HIST("ZEM2Vstdc"), tZEM2, aZEM2); registry.fill(HIST("debunch"), tZDCdif, tZDCsum); + registry.fill(HIST("ZNVsFT0A"), aT0A / 100., sumZNs); + registry.fill(HIST("ZNVsFT0C"), aT0C / 100., sumZNs); + registry.fill(HIST("ZNVsFT0M"), (aT0A + aT0C) / 100., sumZNs); + + if (sumZNs > znBasedCut) { + return; + } + + registry.fill(HIST("NchVsFV0A"), aV0A / 100., glbTracks); + registry.fill(HIST("NchVsFT0A"), aT0A / 100., glbTracks); + registry.fill(HIST("NchVsFT0C"), aT0C / 100., glbTracks); + registry.fill(HIST("NchVsFT0M"), (aT0A + aT0C) / 100., glbTracks); + + registry.fill(HIST("NchVsEt"), et, glbTracks); + registry.fill(HIST("NchVsMeanPt"), glbTracks, meanpt / glbTracks); + registry.fill(HIST("NchVsNPV"), collision.multNTracksPVeta1(), glbTracks); + registry.fill(HIST("NchVsITStracks"), itsTracks, glbTracks); + registry.fill(HIST("ZNAVsNch"), glbTracks, znA); + registry.fill(HIST("ZNCVsNch"), glbTracks, znC); + registry.fill(HIST("ZNVsNch"), glbTracks, sumZNs); + registry.fill(HIST("ZNDifVsNch"), glbTracks, znA - znC); + } + PROCESS_SWITCH(UccZdc, processQA, "Process QA", true); + + void processZdcCollAss(o2::aod::ColEvSels::iterator const& collision, o2::aod::BCsRun3 const& /*bcs*/, aod::Zdcs const& /*zdcs*/, aod::FV0As const& /*fv0as*/, aod::FT0s const& /*ft0s*/, TheFilteredTracks const& tracks) + { + + if (!isEventSelected(collision)) { + return; + } + + const auto& foundBC = collision.foundBC_as(); + // has ZDC? + if (!foundBC.has_zdc()) { + return; + } + registry.fill(HIST("hEventCounter"), EvCutLabel::Zdc); + + if (!foundBC.has_ft0()) { + return; + } + registry.fill(HIST("hEventCounter"), EvCutLabel::TZero); + + float znA{foundBC.zdc().amplitudeZNA()}; + float znC{foundBC.zdc().amplitudeZNC()}; + float aZEM1{foundBC.zdc().amplitudeZEM1()}; + float aZEM2{foundBC.zdc().amplitudeZEM2()}; + float tZNA{foundBC.zdc().timeZNA()}; + float tZNC{foundBC.zdc().timeZNC()}; + float tZPA{foundBC.zdc().timeZPA()}; + float tZPC{foundBC.zdc().timeZPC()}; + float tZDCdif{tZNC + tZPC - tZNA - tZPA}; + float tZDCsum{tZNC + tZPC + tZNA + tZPA}; + znA /= 2.81; + znC /= 2.81; + float sumZNs{znA + znC}; + float sumZEMs{aZEM1 + aZEM2}; + + // TDC cut + if (isTDCcut) { + if (std::sqrt(std::pow(tZDCdif, 2.) + std::pow(tZDCsum, 2.)) > tdcCut) { + return; + } + registry.fill(HIST("hEventCounter"), EvCutLabel::Tdc); + } + + // ZEM cut + if (isZEMcut) { + if (sumZEMs < zemCut) { + return; + } + registry.fill(HIST("hEventCounter"), EvCutLabel::Zem); + } + + registry.fill(HIST("zPos"), collision.posZ()); + registry.fill(HIST("T0Ccent"), collision.centFT0C()); + std::vector pTs; std::vector wIs; - float itsTracks{0.}; - // Calculates the event weight, W_k for (const auto& track : tracks) { - if (track.hasITS() && track.itsNCls() >= minITSnCls) { - itsTracks++; - } // Track Selection if (!track.isGlobalTrack()) { continue; } + registry.fill(HIST("ZposVsEta"), collision.posZ(), track.eta()); registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); registry.fill(HIST("sigma1Pt"), track.pt(), track.sigma1Pt()); registry.fill(HIST("dcaXYvspT"), track.dcaXY(), track.pt()); @@ -598,317 +633,265 @@ struct UccZdc { p1 = p2 = p3 = p4 = w1 = w2 = w3 = w4 = 0.0; getPTpowers(pTs, wIs, p1, w1, p2, w2, p3, w3, p4, w4); const double nch{static_cast(pTs.size())}; - if (!(nch != 0.)) + if (!(nch != 0.)) { return; + } - registry.fill(HIST("NchVsFV0A"), aV0A / 100., nch); - registry.fill(HIST("NchVsFT0A"), aT0A / 100., nch); - registry.fill(HIST("NchVsFT0C"), aT0C / 100., nch); - registry.fill(HIST("NchVsFT0M"), (aT0A + aT0C) / 100., nch); - registry.fill(HIST("ZNVsFT0A"), aT0A / 100., sumZNs); - registry.fill(HIST("ZNVsFT0C"), aT0C / 100., sumZNs); - registry.fill(HIST("ZNVsFT0M"), (aT0A + aT0C) / 100., sumZNs); - registry.fill(HIST("NchVsNPV"), collision.multNTracksPVeta1(), nch); - registry.fill(HIST("NchVsITStracks"), itsTracks, nch); - registry.fill(HIST("ZNAVsNch"), nch, znA); - registry.fill(HIST("ZNCVsNch"), nch, znC); - registry.fill(HIST("ZNVsNch"), nch, sumZNs); - registry.fill(HIST("ZNDifVsNch"), nch, znA - znC); - registry.fill(HIST("NchVsZpos"), nch, collision.posZ()); - - // QA check + // To calculate event-averaged for (const auto& track : tracks) { // Track Selection if (!track.isGlobalTrack()) { continue; } registry.fill(HIST("NchVsPt"), w1, track.pt()); - registry.fill(HIST("ZposVsEta"), collision.posZ(), track.eta()); } // EbE one-particle pT correlation - // P1 / W1 double oneParCorr{p1 / w1}; // EbE two-particle pT correlation - // (P1^{2} - P2)/(W1^{2} - W2) double denTwoParCorr{std::pow(w1, 2.) - w2}; double numTwoParCorr{std::pow(p1, 2.) - p2}; double twoParCorr{numTwoParCorr / denTwoParCorr}; // EbE three-particle pT correlation - // (P1^{3} − 3P2P1 + 2P3)/(W1^{3} − 3W2W1 + 2W3) double denThreeParCorr{std::pow(w1, 3.) - 3. * w2 * w1 + 2. * w3}; double numThreeParCorr{std::pow(p1, 3.) - 3. * p2 * p1 + 2. * p3}; double threeParCorr{numThreeParCorr / denThreeParCorr}; // EbE four-particle pT correlation - // (P1^{4} − 6P2P1^{2} + 3P2^{2} + 8P3P1 − 6P4)/(W1^{4} − 6W2W1^{2} + - // 3W2^{2} + 8W3W1 − 6W4) - double denFourParCorr{std::pow(w1, 4.) - 6. * w2 * std::pow(w1, 2.) + - 3. * std::pow(w2, 2.) + 8 * w3 * w1 - 6. * w4}; - double numFourParCorr{std::pow(p1, 4.) - 6. * p2 * std::pow(p1, 2.) + - 3. * std::pow(p2, 2.) + 8 * p3 * p1 - 6. * p4}; + double denFourParCorr{std::pow(w1, 4.) - 6. * w2 * std::pow(w1, 2.) + 3. * std::pow(w2, 2.) + 8 * w3 * w1 - 6. * w4}; + double numFourParCorr{std::pow(p1, 4.) - 6. * p2 * std::pow(p1, 2.) + 3. * std::pow(p2, 2.) + 8 * p3 * p1 - 6. * p4}; double fourParCorr{numFourParCorr / denFourParCorr}; - if (isZNbasedSel && (sumZNs > znBasedCut)) - return; - if (isZNAbasedSel && (znA > znBasedCut)) - return; - if (isZNCbasedSel && (znC > znBasedCut)) + if (sumZNs > znBasedCut) { return; + } registry.fill(HIST("Nch"), w1); registry.fill(HIST("NchRaw"), nch); registry.fill(HIST("NchVsOneParCorr"), w1, oneParCorr, w1); - registry.fill(HIST("NchVsTwoParCorr"), w1, twoParCorr, denTwoParCorr); - registry.fill(HIST("NchVsThreeParCorr"), w1, threeParCorr, denThreeParCorr); - registry.fill(HIST("NchVsFourParCorr"), w1, fourParCorr, denFourParCorr); + registry.fill(HIST("NchVsOneParCorrVsZN"), w1, sumZNs, oneParCorr, w1); + registry.fill(HIST("NchVsTwoParCorrVsZN"), w1, sumZNs, twoParCorr, denTwoParCorr); + registry.fill(HIST("NchVsThreeParCorrVsZN"), w1, sumZNs, threeParCorr, denThreeParCorr); + registry.fill(HIST("NchVsFourParCorrVsZN"), w1, sumZNs, fourParCorr, denFourParCorr); } PROCESS_SWITCH(UccZdc, processZdcCollAss, "Process ZDC W/Coll Ass.", true); - void processMCclosure( - aod::McCollisions::iterator const& mccollision, - soa::SmallGroups const& collisions, - aod::McParticles const& mcParticles, - TheFilteredSimTracks const& simTracks) + // Preslice perMCCollision = aod::mcparticle::mcCollisionId; + Preslice perCollision = aod::track::collisionId; + TRandom* randPointer = new TRandom(); + void processMCclosure(aod::McCollisions::iterator const& mccollision, soa::SmallGroups const& collisions, aod::McParticles const& mcParticles, TheFilteredSimTracks const& simTracks) { - //----- MC reconstructed -----// - for (const auto& collision : collisions) { - // Event selection - if (!isEventSelected(collision)) - continue; - // MC collision? - if (!collision.has_mcCollision()) - continue; - - const auto& cent{collision.centFT0C()}; - registry.fill(HIST("T0Ccent"), cent); - registry.fill(HIST("zPos"), collision.posZ()); - // registry.fill(HIST("nRecColvsCent"), collisions.size(), cent); - - const auto& groupedTracks = - simTracks.sliceBy(perCollision, collision.globalIndex()); - - std::vector pTs; - std::vector wIs; - - // Calculates the event weight, W_k - for (const auto& track : groupedTracks) { - // Track Selection - if (!track.isGlobalTrack()) - continue; - - // To match the primary particles - if (!track.has_mcParticle()) + float rndNum = randPointer->Uniform(0.0, 1.0); + registry.fill(HIST("RandomNumber"), rndNum); + + // Half of the statistics for MC closure + if (rndNum >= zEro && rndNum < oneHalf) { + registry.fill(HIST("EvtsDivided"), 0); + //----- MC reconstructed -----// + for (const auto& collision : collisions) { + // Event selection + if (!isEventSelected(collision)) { continue; - const auto& particle = track.mcParticle(); - if (!particle.isPhysicalPrimary()) + } + // MC collision? + if (!collision.has_mcCollision()) { continue; - - float pt{track.pt()}; - double trkEff{efficiency->GetBinContent(efficiency->FindBin(pt))}; - if (trkEff > 0.) { - pTs.emplace_back(pt); - wIs.emplace_back(1. / trkEff); } - } - - const double nch{static_cast(pTs.size())}; - if (!(nch != 0.)) - return; - double p1, p2, p3, p4, w1, w2, w3, w4; - p1 = p2 = p3 = p4 = w1 = w2 = w3 = w4 = 0.0; - getPTpowers(pTs, wIs, p1, w1, p2, w2, p3, w3, p4, w4); - - const double denTwoParCorr{std::pow(w1, 2.) - w2}; - const double numTwoParCorr{std::pow(p1, 2.) - p2}; - const double denThreeParCorr{std::pow(w1, 3.) - 3. * w2 * w1 + 2. * w3}; - const double numThreeParCorr{std::pow(p1, 3.) - 3. * p2 * p1 + 2. * p3}; - const double denFourParCorr{ - std::pow(w1, 4.) - 6. * w2 * std::pow(w1, 2.) + - 3. * std::pow(w2, 2.) + 8 * w3 * w1 - 6. * w4}; - const double numFourParCorr{ - std::pow(p1, 4.) - 6. * p2 * std::pow(p1, 2.) + - 3. * std::pow(p2, 2.) + 8 * p3 * p1 - 6. * p4}; - - const double oneParCorr{p1 / w1}; - const double twoParCorr{numTwoParCorr / denTwoParCorr}; - const double threeParCorr{numThreeParCorr / denThreeParCorr}; - const double fourParCorr{numFourParCorr / denFourParCorr}; - - registry.fill(HIST("Nch"), w1); - registry.fill(HIST("NchRaw"), nch); - registry.fill(HIST("NchVsOneParCorr"), w1, oneParCorr, w1); - registry.fill(HIST("NchVsTwoParCorr"), w1, twoParCorr, denTwoParCorr); - registry.fill(HIST("NchVsThreeParCorr"), w1, threeParCorr, - denThreeParCorr); - registry.fill(HIST("NchVsFourParCorr"), w1, fourParCorr, denFourParCorr); - - //--------------------------- Generated MC --------------------------- - if (std::fabs(mccollision.posZ()) > posZcut) - continue; + registry.fill(HIST("T0Ccent"), collision.centFT0C()); + registry.fill(HIST("zPos"), collision.posZ()); + + const auto& groupedTracks{simTracks.sliceBy(perCollision, collision.globalIndex())}; + + std::vector pTs; + std::vector wIs; + // Calculates the event weight, W_k + for (const auto& track : groupedTracks) { + // Track Selection + if (!track.isGlobalTrack()) { + continue; + } + + float pt{track.pt()}; + double weight{efficiency->GetBinContent(efficiency->FindBin(pt))}; + if (weight > 0.) { + pTs.emplace_back(pt); + wIs.emplace_back(weight); + } + } - std::vector pTsMC; - std::vector wIsMC; + const double nch{static_cast(pTs.size())}; + if (!(nch != 0.)) { + return; + } - // Calculates the event weight, W_k - for (const auto& particle : mcParticles) { - if (particle.eta() < minEta || particle.eta() > maxEta) - continue; - if (particle.pt() < minPt || particle.pt() > maxPt) - continue; - if (!particle.isPhysicalPrimary()) + double p1, p2, p3, p4, w1, w2, w3, w4; + p1 = p2 = p3 = p4 = w1 = w2 = w3 = w4 = 0.0; + getPTpowers(pTs, wIs, p1, w1, p2, w2, p3, w3, p4, w4); + + const double denTwoParCorr{std::pow(w1, 2.) - w2}; + const double numTwoParCorr{std::pow(p1, 2.) - p2}; + const double denThreeParCorr{std::pow(w1, 3.) - 3. * w2 * w1 + 2. * w3}; + const double numThreeParCorr{std::pow(p1, 3.) - 3. * p2 * p1 + 2. * p3}; + const double denFourParCorr{std::pow(w1, 4.) - 6. * w2 * std::pow(w1, 2.) + 3. * std::pow(w2, 2.) + 8 * w3 * w1 - 6. * w4}; + const double numFourParCorr{std::pow(p1, 4.) - 6. * p2 * std::pow(p1, 2.) + 3. * std::pow(p2, 2.) + 8 * p3 * p1 - 6. * p4}; + + const double oneParCorr{p1 / w1}; + const double twoParCorr{numTwoParCorr / denTwoParCorr}; + const double threeParCorr{numThreeParCorr / denThreeParCorr}; + const double fourParCorr{numFourParCorr / denFourParCorr}; + + registry.fill(HIST("Nch"), w1); + registry.fill(HIST("NchRaw"), nch); + registry.fill(HIST("NchVsOneParCorr"), w1, oneParCorr, w1); + registry.fill(HIST("NchVsTwoParCorr"), w1, twoParCorr, denTwoParCorr); + registry.fill(HIST("NchVsThreeParCorr"), w1, threeParCorr, denThreeParCorr); + registry.fill(HIST("NchVsFourParCorr"), w1, fourParCorr, denFourParCorr); + + //--------------------------- Generated MC --------------------------- + registry.fill(HIST("hEventCounterMC"), EvCutLabel::All); + if (std::fabs(mccollision.posZ()) > posZcut) { continue; + } + registry.fill(HIST("zPosMC"), mccollision.posZ()); + registry.fill(HIST("hEventCounterMC"), EvCutLabel::VtxZ); + + std::vector pTsMC; + std::vector wIsMC; + // Calculates the event weight, W_k + for (const auto& particle : mcParticles) { + if (particle.eta() < minEta || particle.eta() > maxEta) { + continue; + } + if (particle.pt() < minPt || particle.pt() > maxPt) { + continue; + } + if (!particle.isPhysicalPrimary()) { + continue; + } + + float pt{particle.pt()}; + pTsMC.emplace_back(pt); + wIsMC.emplace_back(1.); + } - float pt{particle.pt()}; - pTsMC.emplace_back(pt); - wIsMC.emplace_back(1.); + const double nchMC{static_cast(pTsMC.size())}; + double p1MC, p2MC, p3MC, p4MC, w1MC, w2MC, w3MC, w4MC; + p1MC = p2MC = p3MC = p4MC = w1MC = w2MC = w3MC = w4MC = 0.0; + getPTpowers(pTsMC, wIsMC, p1MC, w1MC, p2MC, w2MC, p3MC, w3MC, p4MC, w4MC); + + const double denTwoParCorrMC{std::pow(w1MC, 2.) - w2MC}; + const double numTwoParCorrMC{std::pow(p1MC, 2.) - p2MC}; + const double denThreeParCorrMC{std::pow(w1MC, 3.) - 3. * w2MC * w1MC + 2. * w3MC}; + const double numThreeParCorrMC{std::pow(p1MC, 3.) - 3. * p2MC * p1MC + 2. * p3MC}; + const double denFourParCorrMC{std::pow(w1MC, 4.) - 6. * w2MC * std::pow(w1MC, 2.) + 3. * std::pow(w2MC, 2.) + 8 * w3MC * w1MC - 6. * w4MC}; + const double numFourParCorrMC{std::pow(p1MC, 4.) - 6. * p2MC * std::pow(p1MC, 2.) + 3. * std::pow(p2MC, 2.) + 8 * p3MC * p1MC - 6. * p4MC}; + + const double oneParCorrMC{p1MC / w1MC}; + const double twoParCorrMC{numTwoParCorrMC / denTwoParCorrMC}; + const double threeParCorrMC{numThreeParCorrMC / denThreeParCorrMC}; + const double fourParCorrMC{numFourParCorrMC / denFourParCorrMC}; + + registry.fill(HIST("NchGen"), nchMC); + registry.fill(HIST("NchvsOneParCorrGen"), nchMC, oneParCorrMC, w1MC); + registry.fill(HIST("NchvsTwoParCorrGen"), nchMC, twoParCorrMC, denTwoParCorrMC); + registry.fill(HIST("NchvsThreeParCorrGen"), nchMC, threeParCorrMC, denThreeParCorrMC); + registry.fill(HIST("NchvsFourParCorrGen"), nchMC, fourParCorrMC, denFourParCorrMC); } - - const double nchMC{static_cast(pTsMC.size())}; - double p1MC, p2MC, p3MC, p4MC, w1MC, w2MC, w3MC, w4MC; - p1MC = p2MC = p3MC = p4MC = w1MC = w2MC = w3MC = w4MC = 0.0; - getPTpowers(pTsMC, wIsMC, p1MC, w1MC, p2MC, w2MC, p3MC, w3MC, p4MC, w4MC); - - const double denTwoParCorrMC{std::pow(w1MC, 2.) - w2MC}; - const double numTwoParCorrMC{std::pow(p1MC, 2.) - p2MC}; - const double denThreeParCorrMC{std::pow(w1MC, 3.) - 3. * w2MC * w1MC + - 2. * w3MC}; - const double numThreeParCorrMC{std::pow(p1MC, 3.) - 3. * p2MC * p1MC + - 2. * p3MC}; - const double denFourParCorrMC{ - std::pow(w1MC, 4.) - 6. * w2MC * std::pow(w1MC, 2.) + - 3. * std::pow(w2MC, 2.) + 8 * w3MC * w1MC - 6. * w4MC}; - const double numFourParCorrMC{ - std::pow(p1MC, 4.) - 6. * p2MC * std::pow(p1MC, 2.) + - 3. * std::pow(p2MC, 2.) + 8 * p3MC * p1MC - 6. * p4MC}; - - const double oneParCorrMC{p1MC / w1MC}; - const double twoParCorrMC{numTwoParCorrMC / denTwoParCorrMC}; - const double threeParCorrMC{numThreeParCorrMC / denThreeParCorrMC}; - const double fourParCorrMC{numFourParCorrMC / denFourParCorrMC}; - - registry.fill(HIST("NchGen"), nchMC); - registry.fill(HIST("NchvsOneParCorrGen"), nchMC, oneParCorrMC, w1MC); - registry.fill(HIST("NchvsTwoParCorrGen"), nchMC, twoParCorrMC, - denTwoParCorrMC); - registry.fill(HIST("NchvsThreeParCorrGen"), nchMC, threeParCorrMC, - denThreeParCorrMC); - registry.fill(HIST("NchvsFourParCorrGen"), nchMC, fourParCorrMC, - denFourParCorrMC); - } - } - PROCESS_SWITCH(UccZdc, processMCclosure, "Process MC closure", false); - - Preslice perMCCollision = aod::mcparticle::mcCollisionId; - Preslice perCollision = aod::track::collisionId; - void processpTEff(aod::McCollisions::iterator const& mccollision, - soa::SmallGroups const& collisions, - aod::McParticles const& mcParticles, - TheFilteredSimTracks const& simTracks) - { - //----- MC reconstructed -----// - for (const auto& collision : collisions) { - // Event selection - if (!isEventSelected(collision)) - continue; - - // MC collision? - if (!collision.has_mcCollision()) - continue; - - registry.fill(HIST("zPos"), collision.posZ()); - registry.fill(HIST("nRecColvsCent"), collisions.size(), - collision.centFT0C()); - - const auto& cent{collision.centFT0C()}; - registry.fill(HIST("T0Ccent"), cent); - - const auto& groupedTracks = - simTracks.sliceBy(perCollision, collision.globalIndex()); - for (const auto& track : groupedTracks) { - if (!track.has_mcParticle()) - continue; - - const auto& particle = track.mcParticle(); - registry.fill(HIST("Pt_all_ch"), cent, track.pt()); - registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); - - if (!particle.isPhysicalPrimary()) + } else { + registry.fill(HIST("EvtsDivided"), 1); + //----- MC reconstructed -----// + for (const auto& collision : collisions) { + // Event selection + if (!isEventSelected(collision)) { continue; - - registry.fill(HIST("Pt_ch"), cent, track.pt()); - if (particle.pdgCode() == PDG_t::kPiPlus || - particle.pdgCode() == PDG_t::kPiMinus) { - registry.fill(HIST("Pt_pi"), cent, track.pt()); - } else if (particle.pdgCode() == PDG_t::kKPlus || - particle.pdgCode() == PDG_t::kKMinus) { - registry.fill(HIST("Pt_ka"), cent, track.pt()); - } else if (particle.pdgCode() == PDG_t::kProton || - particle.pdgCode() == PDG_t::kProtonBar) { - registry.fill(HIST("Pt_pr"), cent, track.pt()); - } else if (particle.pdgCode() == PDG_t::kSigmaPlus || - particle.pdgCode() == PDG_t::kSigmaBarMinus) { - registry.fill(HIST("Pt_sigpos"), cent, track.pt()); - } else if (particle.pdgCode() == PDG_t::kSigmaMinus || - particle.pdgCode() == PDG_t::kSigmaBarPlus) { - registry.fill(HIST("Pt_signeg"), cent, track.pt()); - } else { - registry.fill(HIST("Pt_re"), cent, track.pt()); } - } - - // Generated MC - registry.fill(HIST("hEventCounterMC"), EvCutLabel::All); - if (std::fabs(mccollision.posZ()) > posZcut) - continue; - registry.fill(HIST("zPosMC"), mccollision.posZ()); - registry.fill(HIST("hEventCounterMC"), EvCutLabel::VtxZ); - - for (const auto& particle : mcParticles) { - if (particle.eta() < minEta || particle.eta() > maxEta) { + // MC collision? + if (!collision.has_mcCollision()) { continue; } - if (particle.pt() < minPt || particle.pt() > maxPt) { - continue; + + registry.fill(HIST("zPos"), collision.posZ()); + registry.fill(HIST("nRecColvsCent"), collisions.size(), collision.centFT0C()); + + const auto& cent{collision.centFT0C()}; + registry.fill(HIST("T0Ccent"), cent); + + const auto& groupedTracks{simTracks.sliceBy(perCollision, collision.globalIndex())}; + for (const auto& track : groupedTracks) { + if (!track.has_mcParticle()) { + continue; + } + + const auto& particle{track.mcParticle()}; + registry.fill(HIST("Pt_all_ch"), cent, track.pt()); + registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); + + if (!particle.isPhysicalPrimary()) { + continue; + } + + registry.fill(HIST("Pt_ch"), cent, track.pt()); + if (particle.pdgCode() == PDG_t::kPiPlus || particle.pdgCode() == PDG_t::kPiMinus) { + registry.fill(HIST("Pt_pi"), cent, track.pt()); + } else if (particle.pdgCode() == PDG_t::kKPlus || particle.pdgCode() == PDG_t::kKMinus) { + registry.fill(HIST("Pt_ka"), cent, track.pt()); + } else if (particle.pdgCode() == PDG_t::kProton || particle.pdgCode() == PDG_t::kProtonBar) { + registry.fill(HIST("Pt_pr"), cent, track.pt()); + } else if (particle.pdgCode() == PDG_t::kSigmaPlus || particle.pdgCode() == PDG_t::kSigmaBarMinus) { + registry.fill(HIST("Pt_sigpos"), cent, track.pt()); + } else if (particle.pdgCode() == PDG_t::kSigmaMinus || particle.pdgCode() == PDG_t::kSigmaBarPlus) { + registry.fill(HIST("Pt_signeg"), cent, track.pt()); + } else { + registry.fill(HIST("Pt_re"), cent, track.pt()); + } } - if (!particle.isPhysicalPrimary()) { + + // Generated MC + registry.fill(HIST("hEventCounterMC"), EvCutLabel::All); + if (std::fabs(mccollision.posZ()) > posZcut) { continue; } - registry.fill(HIST("PtMC_ch"), cent, particle.pt()); - if (particle.pdgCode() == PDG_t::kPiPlus || - particle.pdgCode() == PDG_t::kPiMinus) { // pion - registry.fill(HIST("PtMC_pi"), cent, particle.pt()); - } else if (particle.pdgCode() == PDG_t::kKPlus || - particle.pdgCode() == PDG_t::kKMinus) { // kaon - registry.fill(HIST("PtMC_ka"), cent, particle.pt()); - } else if (particle.pdgCode() == PDG_t::kProton || - particle.pdgCode() == PDG_t::kProtonBar) { // proton - registry.fill(HIST("PtMC_pr"), cent, particle.pt()); - } else if (particle.pdgCode() == PDG_t::kSigmaPlus || - particle.pdgCode() == - PDG_t::kSigmaBarMinus) { // positive sigma - registry.fill(HIST("PtMC_sigpos"), cent, particle.pt()); - } else if (particle.pdgCode() == PDG_t::kSigmaMinus || - particle.pdgCode() == - PDG_t::kSigmaBarPlus) { // negative sigma - registry.fill(HIST("PtMC_signeg"), cent, particle.pt()); - } else { // rest - registry.fill(HIST("PtMC_re"), cent, particle.pt()); + registry.fill(HIST("zPosMC"), mccollision.posZ()); + registry.fill(HIST("hEventCounterMC"), EvCutLabel::VtxZ); + + for (const auto& particle : mcParticles) { + if (particle.eta() < minEta || particle.eta() > maxEta) { + continue; + } + if (particle.pt() < minPt || particle.pt() > maxPt) { + continue; + } + if (!particle.isPhysicalPrimary()) { + continue; + } + + registry.fill(HIST("PtMC_ch"), cent, particle.pt()); + if (particle.pdgCode() == PDG_t::kPiPlus || particle.pdgCode() == PDG_t::kPiMinus) { // pion + registry.fill(HIST("PtMC_pi"), cent, particle.pt()); + } else if (particle.pdgCode() == PDG_t::kKPlus || particle.pdgCode() == PDG_t::kKMinus) { // kaon + registry.fill(HIST("PtMC_ka"), cent, particle.pt()); + } else if (particle.pdgCode() == PDG_t::kProton || particle.pdgCode() == PDG_t::kProtonBar) { // proton + registry.fill(HIST("PtMC_pr"), cent, particle.pt()); + } else if (particle.pdgCode() == PDG_t::kSigmaPlus || particle.pdgCode() == PDG_t::kSigmaBarMinus) { // positive sigma + registry.fill(HIST("PtMC_sigpos"), cent, particle.pt()); + } else if (particle.pdgCode() == PDG_t::kSigmaMinus || particle.pdgCode() == PDG_t::kSigmaBarPlus) { // negative sigma + registry.fill(HIST("PtMC_signeg"), cent, particle.pt()); + } else { // rest + registry.fill(HIST("PtMC_re"), cent, particle.pt()); + } } } - } + } // Half of statistics for corrections } - PROCESS_SWITCH(UccZdc, processpTEff, "Process pT Eff", false); + PROCESS_SWITCH(UccZdc, processMCclosure, "Process MC closure", false); template - void getPTpowers(const T& pTs, const T& wIs, U& pOne, U& wOne, U& pTwo, - U& wTwo, U& pThree, U& wThree, U& pFour, U& wFour) + void getPTpowers(const T& pTs, const T& wIs, U& pOne, U& wOne, U& pTwo, U& wTwo, U& pThree, U& wThree, U& pFour, U& wFour) { pOne = wOne = pTwo = wTwo = pThree = wThree = pFour = wFour = 0.; - for (std::size_t i = 0; i < pTs.size(); ++i) { const float pTi{pTs.at(i)}; const float wEighti{wIs.at(i)}; From e94a1c29f05534d45ca3cbd4873bc667bae6fe50 Mon Sep 17 00:00:00 2001 From: ariedel-cern <85537041+ariedel-cern@users.noreply.github.com> Date: Wed, 23 Apr 2025 09:15:32 +0200 Subject: [PATCH 1062/1650] [PWGCF,PWGLF,Trigger] Update PWGCF trigger for 2025 data taking (#10942) --- EventFiltering/CMakeLists.txt | 2 +- EventFiltering/PWGCF/CFFilterAll.cxx | 4147 ++++++++--------- EventFiltering/filterTables.h | 39 +- .../Nuspex/hypertriton3bodyfinder.cxx | 4 +- 4 files changed, 1900 insertions(+), 2292 deletions(-) diff --git a/EventFiltering/CMakeLists.txt b/EventFiltering/CMakeLists.txt index d67c1589457..a6001817596 100644 --- a/EventFiltering/CMakeLists.txt +++ b/EventFiltering/CMakeLists.txt @@ -54,7 +54,7 @@ o2physics_add_dpl_workflow(hf-filter-prepare-ml-samples o2physics_add_dpl_workflow(cf-filter SOURCES PWGCF/CFFilterAll.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore KFParticle::KFParticle O2::ReconstructionDataFormats O2::DetectorsBase COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(cf-filter-qa diff --git a/EventFiltering/PWGCF/CFFilterAll.cxx b/EventFiltering/PWGCF/CFFilterAll.cxx index 4e326968b03..6d272e825cf 100644 --- a/EventFiltering/PWGCF/CFFilterAll.cxx +++ b/EventFiltering/PWGCF/CFFilterAll.cxx @@ -14,1433 +14,1035 @@ /// /// \author Laura Serksnyte, TU München, laura.serksnyte@cern.ch; Anton Riedel, TU München, anton.riedel@cern.ch; Maximilian Korwieser, TU Munich, maximilian.korwieser@cern.ch -#include -#include #include #include #include "../filterTables.h" +#include "CCDB/BasicCCDBManager.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "DCAFitter/DCAFitterN.h" +#include "DetectorsBase/Propagator.h" + #include "fairlogger/Logger.h" -#include "Framework/Configurable.h" -#include "Framework/ASoAHelpers.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/AnalysisTask.h" -#include "Framework/HistogramRegistry.h" -#include "Framework/runDataProcessing.h" -#include "CommonConstants/MathConstants.h" -#include "Common/Core/TrackSelection.h" -#include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/PIDResponse.h" #include "Common/DataModel/PIDResponseITS.h" -#include "PWGLF/DataModel/LFStrangenessTables.h" -#include "DataFormatsTPC/BetheBlochAleph.h" -#include "CCDB/BasicCCDBManager.h" -#include "CCDB/CcdbApi.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/Core/RecoDecay.h" + +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/Configurable.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/runDataProcessing.h" + +#include "PWGLF/Utils/strangenessBuilderHelper.h" #include "Math/GenVector/Boost.h" #include "Math/Vector4D.h" #include "TMath.h" -#include "TRandom3.h" using namespace o2; +using namespace o2::aod; using namespace o2::framework; using namespace o2::framework::expressions; -namespace CFTrigger +namespace cf_trigger { // enums -enum CFThreeBodyTriggers { kPPP, - kPPL, - kPLL, - kLLL, - kPPPhi, - kPPRho, - kNThreeBodyTriggers }; -enum CFTwoBodyTriggers { kPD, - kLD, - kNTwoBodyTriggers -}; -enum ParticleSpecies { - kProton, - kDeuteron, - kPion, - kLambda, - kNParticleSpecies +enum CFTriggers { + kPPP, + kPPL, + kPLL, + kLLL, + kPPPhi, + kPPRho, + kPD, + kLD, + kRhoD, + kPhiD, + kNTriggers }; -enum V0Daughters { - kDaughPion, - kDaughProton, - kNV0Daughters + +// variables for track selection +const std::vector trackNames{"Pion", "Kaon", "Proton", "Deuteron"}; +const uint32_t nTrackNames = 4; + +const std::vector trackSelectionNames{"AbsEtaMax", "TpcClusterMin", "TpcRowMin", "TpcCrossedOverFoundMin", "TpcSharedMax", "TpcFracSharedMax", "ItsClusterMin", "ItsIbClusterMin", "AbsDcaXyMax", "AbsDcaZMax", "Chi2TpcMax", "Chi2ItsMax"}; +const uint32_t nTrackSelectionNames = 12; + +const float trackSelectionTable[nTrackNames][nTrackSelectionNames] = { + {0.85, 90, 80, 0.83, 160, 1, 1, 0, 0.15, 0.15, 99, 99}, // Pion + {0.85, 90, 80, 0.83, 160, 1, 1, 0, 0.15, 0.15, 99, 99}, // Kaon + {0.85, 90, 80, 0.83, 160, 1, 1, 0, 0.15, 0.15, 99, 99}, // Proton + {0.85, 90, 80, 0.83, 160, 1, 1, 0, 0.15, 0.15, 99, 99}, // Deuteron }; -enum ParticleRejection { kRejProton, - kRejPion, - kRejElectron, - kNParticleRejection + +const std::vector pidSelectionNames{"ItsMin", "ItsMax", "TpcMin", "TpcMax", "TpcTofMax"}; +const uint32_t nPidSelectionNames = 5; + +const float pidSelectionTable[nTrackNames][nPidSelectionNames] = { + {-99, 99, -4, 4, 4}, // Pion + {-99, 99, -4, 4, 4}, // Kaon + {-99, 99, -4, 4, 4}, // Proton + {-3.5, 3.5, -3.5, 3.5, 3.5}, // Deuteron }; -enum PIDLimits { kTPCMin, - kTPCMax, - kTOFMin, - kTOFMax, - kTPCTOF, - kITSmin, - kITSmax, - kNPIDLimits + +const std::vector momentumSelectionNames{"PtMin", "PtMax", "PThres", "UseInnerParam"}; +const uint32_t nMomentumSelectionNames = 4; + +const float momentumSelectionTable[nTrackNames][nMomentumSelectionNames] = { + {0, 6, 0.4, -1}, // Pion + {0, 6, 0.5, -1}, // Kaon + {0.3, 6, 0.75, -1}, // Proton + {0.4, 2, 1.2, -1}, // Deuteron }; -// For configurable tables -static const std::vector CFTriggerNamesALL{"ppp", "ppL", "pLL", "LLL", "ppPhi", "ppRho", "pd", "Ld"}; -static const std::vector SpeciesNameAll{"Proton", "Deuteron", "Lambda", "Pion"}; -static const std::vector SpeciesName{"Proton", "Deuteron", "Pion"}; -static const std::vector SpeciesNameAnti{"AntiProton", "AntiDeuteron", "AntiPion"}; -static const std::vector SpeciesV0DaughterName{"Pion", "Proton"}; -static const std::vector SpeciesRejectionName{"Proton", "Pion", "Electron"}; -static const std::vector TPCCutName{"TPC min", "TPC max"}; -static const std::vector SpeciesMinTPCClustersName{"Proton", "Deuteron", "Pion"}; -static const std::vector SpeciesAvgTPCTOFName{"Proton", "AntiProton", "Deuteron", "AntiDeuteron", "Pion", "AntiPion"}; -static const std::vector TPCTOFAvgName{"TPC Avg", "TOF Avg"}; -static const std::vector PidCutsName{"TPC min", "TPC max", "TOF min", "TOF max", "TPCTOF max", "ITS min", "ITS max"}; -static const std::vector PtCutsName{"Pt min (particle)", "Pt max (particle)", "Pt min (antiparticle)", "Pt max (antiparticle)", "P thres"}; -static const std::vector MomCorCutsName{"Momemtum Correlation min", "Momemtum Correlation max"}; -static const std::vector PIDForTrackingName{"Switch", "Momemtum Threshold"}; -static const std::vector ThreeBodyFilterNames{"PPP", "PPL", "PLL", "LLL", "PPPhi", "PPRho"}; -static const std::vector TwoBodyFilterNames{"PD", "LD"}; -static const std::vector ParticleNames{"PPP", "aPaPaP", "PPL", "aPaPaL", "PLL", "aPaLaL", "LLL", "aLaLaL", "PPPhi", "aPaPPhi", "PPRho", "aPaPRho", "PD", "aPaD", "LD", "aLaD"}; - -static const int nPidRejection = 2; -static const int nTracks = 3; -static const int nPidAvg = 6; -static const int nPidCutsDaughers = 2; -static const int nPtCuts = 5; -static const int nAllTriggers = 8; -static const int nTriggerAllNames = 16; -static const int nMomCorCuts = 2; -static const int nTPCTOFAvg = 2; - -static const float pidcutsTable[nTracks][kNPIDLimits]{ - {-6.f, 6.f, -6.f, 6.f, 6.f, -99.f, 99.f}, - {-6.f, 6.f, -99.f, 99.f, 99.f, -6.f, 6.f}, - {-6.f, 6.f, -99.f, 99.f, 99.f, -9999.f, 9999.f}}; -static const float pidcutsTableAnti[nTracks][kNPIDLimits]{ - {-6.f, 6.f, -6.f, 6.f, 6.f, -99.f, 99.f}, - {-6.f, 6.f, -99.f, 99.f, 99.f, -6.f, 6.f}, - {-6.f, 6.f, -99.f, 99.f, 99.f, -9999.f, 9999.f}}; -static const float pidRejectionTable[kNParticleRejection][nPidRejection]{ - {-2.f, 2.f}, - {-2.f, 2.f}, - {-999.f, 999.f}}; -static const double pidTPCTOFAvgTable[nPidAvg][nTPCTOFAvg]{ - {0.f, 0.f}, - {0.f, 0.f}, - {0.f, 0.f}, - {0.f, 0.f}, - {0.f, 0.f}, - {0.f, 0.f}}; -static const float pidcutsV0DaughterTable[kNV0Daughters][nPidCutsDaughers]{ - {-6.f, 6.f}, - {-6.f, 6.f}}; -static const float ptcutsTable[kNParticleSpecies][nPtCuts]{ - {0.35f, 6.f, 0.35f, 6.0f, 0.75f}, - {0.35f, 1.6f, 0.35f, 1.6f, 99.f}, - {0.f, 6.f, 0.f, 6.f, 99.f}, - {0.f, 6.f, 0.f, 6.f, 99.f}}; -static const float NClustersMin[1][nTracks]{ - {60.0f, 60.0f, 60.0f}}; -static const float MomCorLimits[3][nMomCorCuts] = - {{-99, 99}, - {-99, 99}, - {-99, 99}}; -static const float PIDForTrackingTable[nTracks][2]{ - {-1, 0.75}, - {-1, 1.2}, - {-1, 1.2}}; -static const float ITSCutsTable[1][nTracks] = { - {1, 1, 0}}; - -static const float triggerSwitches[1][nAllTriggers]{ - {1, 1, 1, 1, 1, 1, 1, 1}}; - -static const float Q3Limits[1][kNThreeBodyTriggers]{ - {0.6f, 0.6f, 0.6f, 0.6f, 0.6f, 0.6f}}; - -static const float KstarLimits[1][kNTwoBodyTriggers]{ - {1.2f, 1.2f}}; - -static const float Downsample[2][nTriggerAllNames]{ - {-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1, -1., -1., -1., -1.}, - {1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.}}; - -} // namespace CFTrigger - -namespace o2::aod -{ -using FemtoFullCollision = - soa::Join::iterator; +// variables for triggers +const std::vector filterNames{"PPP", "PPL", "PLL", "LLL", "PPPhi", "PPRho", "PD", "LD", "PhiD", "RhoD"}; +const uint32_t nFilterNames = 10; -using FemtoFullTracks = - soa::Join; -} // namespace o2::aod +const std::vector switches{"Switch"}; +const uint32_t nSwitches = 1; -struct CFFilter { +const float filterTable[nSwitches][nFilterNames]{ + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}}; - Produces tags; +const std::vector limitNames{"Tight Limit", "Loose Limit"}; +const uint32_t nLimitNames = 2; - Service ccdb; - o2::ccdb::CcdbApi ccdbApi; +const float limitTable[nLimitNames][nFilterNames]{ + {0.6f, 0.6f, 0.6f, 0.6f, 0.6f, 0.6f, 0.5f, 0.5f, 0.5f, 0.5f}, + {1.2f, 1.2f, 1.2f, 1.2f, 1.2f, 1.2f, 1.0f, 1.0f, 1.0f, 1.0f}}; + +using FullCollisions = soa::Join; +using FullCollision = FullCollisions::iterator; + +using FullTracks = soa::Join; + +} // namespace cf_trigger - Configurable ConfRngSeed{"ConfRngSeed", 69, "Seed for downsampling"}; - TRandom3* rng; +struct CFFilterAll { + + Produces tags; // Configs for events - Configurable ConfIsRun3{ - "ConfIsRun3", - true, - "Is Run3"}; - - Configurable ConfEvtSelectZvtx{ - "ConfEvtSelectZvtx", - true, - "Event selection includes max. z-Vertex"}; - Configurable ConfEvtZvtx{"ConfEvtZvtx", - 10.f, - "Evt sel: Max. z-Vertex (cm)"}; - Configurable ConfEvtOfflineCheck{ - "ConfEvtOfflineCheck", - false, - "Evt sel: check for offline selection"}; - Configurable ConfEvtTimeFrameBorderCheck{ - "ConfEvtTimeFrameBorderCheck", - true, - "Evt sel: check for offline selection"}; - Configurable ConfAutocorRejection{ - "ConfAutocorRejection", - true, - "Rejection autocorrelation pL pairs"}; + struct : ConfigurableGroup { + std::string prefix = "EventSel"; + Configurable zvtx{"zvtx", 12.f, "Max. z-Vertex (cm)"}; + Configurable eventSel{"eventSel", true, "Use sel8"}; + } EventSelection; // Configs for tracks - Configurable ConfDeuteronThPVMom{ - "ConfDeuteronThPVMom", - false, - "True: use momentum at PV instead of TPCinnerparameter for threshold"}; - - Configurable ConfUseManualPIDproton{ - "ConfUseManualPIDproton", - false, - "True: use home-made PID solution for proton "}; - Configurable ConfPIDBBProton{ - "ConfPIDBBProton", - "Users/l/lserksny/PIDProton", - "Path to the CCDB ocject for proton BB param"}; - Configurable ConfPIDBBAntiProton{ - "ConfPIDBBAntiProton", - "Users/l/lserksny/PIDAntiProton", - "Path to the CCDB ocject for antiproton BB param"}; - - Configurable ConfUseManualPIDdeuteron{ - "ConfUseManualPIDdeuteron", - false, - "True: use home-made PID solution for deuteron "}; - Configurable ConfPIDBBDeuteron{ - "ConfPIDBBDeuteron", - "Users/l/lserksny/PIDDeuteron", - "Path to the CCDB ocject for Deuteron BB param"}; - Configurable ConfPIDBBAntiDeuteron{ - "ConfPIDBBAntiDeuteron", - "Users/l/lserksny/PIDAntiDeuteron", - "Path to the CCDB ocject for antiDeuteron BB param"}; - - Configurable ConfUseManualPIDpion{ - "ConfUseManualPIDpion", - false, - "True: use home-made PID solution for pions"}; - Configurable ConfPIDBBPion{ - "ConfPIDBBPion", - "Users/l/lserksny/PIDPion", - "Path to the CCDB ocject for Pion BB param"}; - Configurable ConfPIDBBAntiPion{ - "ConfPIDBBAntiPion", - "Users/l/lserksny/PIDAntiPion", - "Path to the CCDB ocject for antiPion BB param"}; - - Configurable ConfUseManualPIDel{ - "ConfUseManualPIDel", - false, - "True: use home-made PID solution for electron"}; - Configurable ConfPIDBBElectron{ - "ConfPIDBBElectron", - "Users/l/lserksny/PIDElectron", - "Path to the CCDB ocject for Electron BB param"}; - Configurable ConfPIDBBAntiElectron{ - "ConfPIDBBAntiElectron", - "Users/l/lserksny/PIDAntiElectron", - "Path to the CCDB ocject for antiElectron BB param"}; - - Configurable ConfUseManualPIDdaughterPion{ - "ConfUseManualPIDdaughterPion", - false, - "True: use home-made PID solution for pion from V0"}; - Configurable ConfUseManualPIDdaughterProton{ - "ConfUseManualPIDdaughterProton", - false, - "True: use home-made PID solution for proton from V0"}; - - Configurable ConfUseAvgFromCCDB{ - "ConfUseAvgFromCCDB", - false, - "True: use TOF and TPC averages from CCDB"}; - Configurable ConfAvgPath{ - "ConfAvgPath", - "Users/l/lserksny/TPCTOFAvg", - "Path to the CCDB ocject for TOF and TPC averages"}; - - Configurable ConfRejectNotPropagatedTracks{ - "ConfRejectNotPropagatedTracks", - false, - "True: reject not propagated tracks"}; - Configurable ConfTrkEta{ - "ConfTrkEta", - 0.85, - "Eta"}; - Configurable> ConfTPCNClustersMin{ - "ConfTPCNClustersMin", - {CFTrigger::NClustersMin[0], 1, CFTrigger::nTracks, std::vector{"TPCNClusMin"}, CFTrigger::SpeciesMinTPCClustersName}, - "kstar limit for two body trigger"}; - Configurable ConfTrkTPCfCls{ - "ConfTrkTPCfCls", - 0.83, - "Minimum fraction of crossed rows over findable clusters"}; - Configurable ConfTrkTPCcRowsMin{ - "ConfTrkTPCcRowsMin", - 70, - "Minimum number of crossed TPC rows"}; - Configurable ConfTrkTPCsClsMax{ - "ConfTrkTPCsClsMax", - 160, - "Maximum number of shared TPC clusters"}; - Configurable> ConfTrkITSnclsMin{ - "ConfTrkITSnclsMin", - {CFTrigger::ITSCutsTable[0], 1, CFTrigger::nTracks, std::vector{"Cut"}, CFTrigger::SpeciesName}, - "Minimum number of ITS clusters"}; - Configurable> ConfTrkITSnclsIBMin{ - "ConfTrkITSnclsIBMin", - {CFTrigger::ITSCutsTable[0], 1, CFTrigger::nTracks, std::vector{"Cut"}, CFTrigger::SpeciesName}, - "Minimum number of ITS clusters in the inner barrel"}; - Configurable ConfTrkDCAxyMax{ - "ConfTrkDCAxyMax", - 0.15, - "Maximum DCA_xy"}; - Configurable ConfTrkDCAzMax{ - "ConfTrkDCAzMax", - 0.3, - "Maximum DCA_z"}; - // Checks taken from global track definition - Configurable ConfTrkRequireChi2MaxTPC{ - "ConfTrkRequireChi2MaxTPC", false, - "True: require max chi2 per TPC cluster"}; - Configurable ConfTrkRequireChi2MaxITS{ - "ConfTrkRequireChi2MaxITS", false, - "True: require max chi2 per ITS cluster"}; - Configurable - ConfTrkMaxChi2PerClusterTPC{ - "ConfTrkMaxChi2PerClusterTPC", - 4.0f, - "Minimal track selection: max allowed chi2 per TPC cluster"}; // 4.0 is default of - // global tracks - // on 20.01.2023 - Configurable - ConfTrkMaxChi2PerClusterITS{ - "ConfTrkMaxChi2PerClusterITS", - 36.0f, - "Minimal track selection: max allowed chi2 per ITS cluster"}; // 36.0 is default of - // global tracks - // on 20.01.2023 - Configurable ConfTrkTPCRefit{ - "ConfTrkTPCRefit", - false, - "True: require TPC refit"}; - Configurable ConfTrkITSRefit{ - "ConfTrkITSRefit", - false, - "True: require ITS refit"}; - - // PID selections - Configurable> ConfPIDCuts{ - "ConfPIDCuts", - {CFTrigger::pidcutsTable[0], CFTrigger::nTracks, CFTrigger::kNPIDLimits, CFTrigger::SpeciesName, CFTrigger::PidCutsName}, - "Particle PID selections"}; - Configurable> ConfPIDCutsAnti{ - "ConfPIDCutsAnti", - {CFTrigger::pidcutsTableAnti[0], CFTrigger::nTracks, CFTrigger::kNPIDLimits, CFTrigger::SpeciesNameAnti, CFTrigger::PidCutsName}, - "Particle PID selections for antiparticles; perfect case scenario identical to particles"}; - Configurable ConfRejectNOTDeuteron{ - "ConfRejectNOTDeuteron", - false, - "Reject deuteron candidates if they are compatible with electron, pion, proton"}; - Configurable> ConfPIDRejection{ - "ConfPIDRejection", - {CFTrigger::pidRejectionTable[0], CFTrigger::kNParticleRejection, CFTrigger::nPidRejection, CFTrigger::SpeciesRejectionName, CFTrigger::TPCCutName}, - "Particle PID Rejection selections (Deuteron candidates only)"}; - Configurable> ConfPIDTPCTOFAvg{ - "ConfPIDTPCTOFAvg", - {CFTrigger::pidTPCTOFAvgTable[0], CFTrigger::nPidAvg, CFTrigger::nTPCTOFAvg, CFTrigger::SpeciesAvgTPCTOFName, CFTrigger::TPCTOFAvgName}, - "Average expected nSigma of TPC and TOF, which is substracted in calculation of combined TPC and TOF nSigma"}; - - // Momentum selections - Configurable> ConfMomCorDifCut{ - "ConfMomCorDifCuts", - {CFTrigger::MomCorLimits[0], CFTrigger::nTracks, CFTrigger::nMomCorCuts, CFTrigger::SpeciesName, CFTrigger::MomCorCutsName}, - "ratio on momentum correlation difference (particle)"}; - Configurable> ConfMomCorDifCutAnti{ - "ConfMomCorDifCutsAnti", - {CFTrigger::MomCorLimits[0], CFTrigger::nTracks, CFTrigger::nMomCorCuts, CFTrigger::SpeciesNameAnti, CFTrigger::MomCorCutsName}, - "Cut on momentum correlation difference (antipartilce)"}; - Configurable ConfMomCorDifCutFlag{"ConfMomCorDifFlag", false, "Flag for cut on momentum correlation difference"}; - - Configurable> ConfMomCorRatioCut{ - "ConfMomCorRatioCuts", - {CFTrigger::MomCorLimits[0], CFTrigger::nTracks, CFTrigger::nMomCorCuts, CFTrigger::SpeciesName, CFTrigger::MomCorCutsName}, - "Cut on momentum correlation ratio (particle)"}; - Configurable> ConfMomCorRatioCutAnti{ - "ConfMomCorRatioCutsAnti", - {CFTrigger::MomCorLimits[0], CFTrigger::nTracks, CFTrigger::nMomCorCuts, CFTrigger::SpeciesNameAnti, CFTrigger::MomCorCutsName}, - "Cut on momentum correlation ratio (antipartilce)"}; - Configurable ConfMomCorRatioCutFlag{"ConfMomCorRatioFlag", false, "Flag for cut on momentum correlation ratio"}; - - Configurable> ConfPIDForTracking{ - "ConfPIDForTracking", - {CFTrigger::PIDForTrackingTable[0], CFTrigger::nTracks, 2, CFTrigger::SpeciesName, CFTrigger::PIDForTrackingName}, - "Use PID used in tracking up to momentum threshold"}; - - Configurable> ConfPtCuts{ - "ConfPtCuts", - {CFTrigger::ptcutsTable[0], CFTrigger::kNParticleSpecies, CFTrigger::nPtCuts, CFTrigger::SpeciesNameAll, CFTrigger::PtCutsName}, - "Particle Momentum selections"}; + struct : ConfigurableGroup { + std::string prefix = "TrackSel"; + Configurable> trackProperties{"trackProperties", + {cf_trigger::trackSelectionTable[0], + cf_trigger::nTrackNames, + cf_trigger::nTrackSelectionNames, + cf_trigger::trackNames, + cf_trigger::trackSelectionNames}, + "Track Selections"}; + + Configurable> momentum{"momentum", + {cf_trigger::momentumSelectionTable[0], + cf_trigger::nTrackNames, + cf_trigger::nMomentumSelectionNames, + cf_trigger::trackNames, + cf_trigger::momentumSelectionNames}, + "Momentum Selections"}; + + Configurable> pid{"pid", + {cf_trigger::pidSelectionTable[0], + cf_trigger::nTrackNames, + cf_trigger::nPidSelectionNames, + cf_trigger::trackNames, + cf_trigger::pidSelectionNames}, + "PID Selections"}; + } TrackSelections; // Configs for V0 - Configurable ConfV0PtMin{ - "ConfV0PtMin", - 0.f, - "Minimum transverse momentum of V0"}; - Configurable ConfV0DCADaughMax{ - "ConfV0DCADaughMax", - 1.8f, - "Maximum DCA between the V0 daughters"}; - Configurable ConfV0CPAMin{ - "ConfV0CPAMin", - 0.985f, - "Minimum CPA of V0"}; - Configurable ConfV0TranRadV0Min{ - "ConfV0TranRadV0Min", - 0.2f, - "Minimum transverse radius"}; - Configurable ConfV0TranRadV0Max{ - "ConfV0TranRadV0Max", - 100.f, - "Maximum transverse radius"}; - Configurable ConfV0DecVtxMax{"ConfV0DecVtxMax", - 100.f, - "Maximum distance from primary vertex"}; - Configurable ConfV0InvMassLowLimit{ - "ConfV0InvMassLowLimit", - 1.05, - "Lower limit of the V0 invariant mass"}; - Configurable ConfV0InvMassUpLimit{ - "ConfV0InvMassUpLimit", - 1.18, - "Upper limit of the V0 invariant mass"}; - - Configurable ConfV0RejectKaons{"ConfV0RejectKaons", - true, - "Switch to reject kaons"}; - Configurable ConfV0InvKaonMassLowLimit{ - "ConfV0InvKaonMassLowLimit", - 0.49, - "Lower limit of the V0 invariant mass for Kaon rejection"}; - Configurable ConfV0InvKaonMassUpLimit{ - "ConfV0InvKaonMassUpLimit", - 0.505, - "Upper limit of the V0 invariant mass for Kaon rejection"}; - - // config for V0 daughters - Configurable ConfDaughEta{ - "ConfDaughEta", - 0.85f, - "V0 Daugh sel: max eta"}; - Configurable ConfDaughTPCnclsMin{ - "ConfDaughTPCnclsMin", - 60.f, - "V0 Daugh sel: Min. nCls TPC"}; - Configurable ConfDaughDCAMin{ - "ConfDaughDCAMin", - 0.04f, - "V0 Daugh sel: Max. DCA Daugh to PV (cm)"}; - Configurable> ConfDaughPIDCuts{ - "ConfDaughPIDCuts", - {CFTrigger::pidcutsV0DaughterTable[0], CFTrigger::kNV0Daughters, CFTrigger::nPidCutsDaughers, CFTrigger::SpeciesV0DaughterName, CFTrigger::TPCCutName}, - "PID selections for Lambda daughters"}; - - // config for ppPhi struct : ConfigurableGroup { - std::string prefix = "PPPhi"; - Configurable ConfResoInvMassLowLimit{"ConfResoInvMassLowLimit", 1.011461, "Lower limit of the Reso invariant mass"}; - Configurable ConfResoInvMassUpLimit{"ConfResoInvMassUpLimit", 1.027461, "Upper limit of the Reso invariant mass"}; - - Configurable ConfTrkEtaKa{"ConfTrkEtaKa", 0.85, "Eta kaon daughters"}; // 0.8 - Configurable ConfTrkDCAxyKa{"ConfTrkDCAxyKa", 0.15, "DCAxy kaon daughters"}; // 0.1 - Configurable ConfTrkDCAzKa{"ConfTrkDCAzKa", 0.3, "DCAz kaon daughters"}; // 0.2 - Configurable ConfNClusKa{"ConfNClusKa", 70, "NClusters kaon daughters"}; // 0.2 - Configurable ConfNCrossedKa{"ConfNCrossedKa", 65, "NCrossedRows kaon daughters"}; // 0.2 - Configurable ConfTrkTPCfClsKa{"ConfTrkTPCfClsKa", 0.80, "Minimum fraction of crossed rows over findable clusters kaon daughters"}; // 0.2 - - Configurable ConfTrkPtKaUp{"ConfTrkPtKaUp", 6.0, "Pt_up kaon daughters"}; // 2.0 - Configurable ConfTrkPtKaDown{"ConfTrkPtKaDown", 0.05, "Pt_down kaon daughters"}; // 0.15 - Configurable ConfTrkPTPCKaThr{"ConfTrkPTPCKaThr", 0.40, "p_TPC,Thr kaon daughters"}; // 0.4 - Configurable ConfTrkKaSigmaPID{"ConfTrkKaSigmaPID", 3.50, "n_sigma kaon daughters"}; // 3.0 - } PPPhi; - - // config collection for ppRho // + std::string prefix = "V0BuilderOpts"; + Configurable minCrossedRows{"minCrossedRows", 70, "minimum TPC crossed rows for daughter tracks"}; + Configurable dcanegtopv{"dcanegtopv", 0.04, "DCA Neg To PV"}; + Configurable dcapostopv{"dcapostopv", 0.04, "DCA Pos To PV"}; + Configurable v0cospa{"v0cospa", 0.95, "V0 CosPA"}; // double -> N.B. dcos(x)/dx = 0 at x=0) + Configurable dcav0dau{"dcav0dau", 2.0, "DCA V0 Daughters"}; + Configurable v0radius{"v0radius", 0, "v0radius"}; + Configurable maxDaughterEta{"maxDaughterEta", 5, "Maximum daughter eta (in abs value)"}; + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + } V0BuilderOpts; + + struct : ConfigurableGroup { + std::string prefix = "FitterOpts"; + Configurable propagateToPCA{"propagateToPCA", true, "Create tracks version propagated to PCA"}; + Configurable maxR{"maxR", 200., "reject PCA's above this radius"}; + Configurable minParamChange{"minParamChange", 1.e-3, "stop iterations if largest change of any X is smaller than this"}; + Configurable minRelChi2Change{"minRelChi2Change", 0.9, "stop iteraterions if chi2/chi2old > this"}; + Configurable maxDzIni{"maxDzIni", 1.e9, "reject (if>0) PCA candicate if tracks DZ exceeds threshold"}; + Configurable maxDxyIni{"maxDxyIni", 4., "Same as above for DXY"}; + Configurable maxChi2{"maxChi2", 1.e9, "Maximum chi2"}; + Configurable useAbsDCA{"useAbsDCA", true, "Minimise abs. distance rather than chi2"}; + Configurable weightedFinalPCA{"weightedFinalPCA", false, "Weight final PCA"}; + } FitterOpts; + struct : ConfigurableGroup { - std::string prefix = "PPRho"; - Configurable ConfResoRho0InvMassLowLimit{"ConfResoRho0InvMassLowLimit", 0.7, "Lower limit of the RhoReso invariant mass"}; - Configurable ConfResoRho0InvMassUpLimit{"ConfResoRho0InvMassUpLimit", 0.85, "Upper limit of the RhoReso invariant mass"}; + std::string prefix = "LambdaSel"; + Configurable ptMin{"ptMin", 0.f, "Minimum transverse momentum of V0"}; + Configurable dcaDaughMax{"dcaDaughMax", 2.f, "Maximum DCA between the V0 daughters"}; + Configurable cpaMin{"cpaMin", 0.95f, "Minimum CPA of V0"}; + Configurable tranRadMin{"tranRadMin", 0.f, "Minimum transverse radius"}; + Configurable tranRadMax{"tranRadMax", 100.f, "Maximum transverse radius"}; + Configurable decVtxMax{"decVtxMax", 100.f, "Maximum distance from primary vertex"}; + Configurable invMassLow{"invMassLow", 1.05, "Lower limit of the V0 invariant mass"}; + Configurable invMassUp{"invMassUp", 1.18, "Upper limit of the V0 invariant mass"}; + Configurable rejectKaons{"rejectKaons", true, "Switch to reject kaons"}; + Configurable invKaonMassLow{"invKaonMassLow", 0.49, "Lower limit of the V0 invariant mass for Kaon rejection"}; + Configurable invKaonMassUp{"invKaonMassUp", 0.505, "Upper limit of the V0 invariant mass for Kaon rejection"}; + } LambdaSelections; - Configurable ConfTrkPtRho0CandLowLimit{"ConfTrkPtRho0CandLowLimit", 1.8, "Pt_LowLimit Rho0Cand"}; - Configurable ConfTrkPtRho0CandUpLimit{"ConfTrkPtRho0CandUpLimit", 10., "Pt_UpLimit Rho0Cand"}; - } PPRho; + struct : ConfigurableGroup { + std::string prefix = "LambdaDaughterSel"; + Configurable absEtaMax{"absEtaMax", 0.85f, "V0 Daugh sel: max eta"}; + Configurable tpcClusterMin{"tpcClusterMin", 70.f, "V0 Daugh sel: Min. nCls TPC"}; + Configurable dcaMin{"dcaMin", 0.04f, "V0 Daugh sel: Max. DCA Daugh to PV (cm)"}; + Configurable tpcMax{"tpcMax", 5, "PID selections for Lambda daughters"}; + } LambdaDaughterSelections; + + struct : ConfigurableGroup { + std::string prefix = "PhiSel"; + Configurable invMassLow{"invMassLow", 1.011461, "Lower limit of Phi invariant mass"}; + Configurable invMassUp{"invMassUp", 1.027461, "Upper limit of Phi invariant mass"}; + Configurable tightInvMassLow{"tightInvMassLow", 1.011461, "Lower tight limit of Phi invariant mass"}; + Configurable tightInvMassUp{"tightInvMassUp", 1.027461, "Upper tight limit of Phi invariant mass"}; + } PhiSelections; + + struct : ConfigurableGroup { + std::string prefix = "RhoSel"; + Configurable invMassLow{"invMassLow", 0.7, "Lower limit of Rho invariant mass"}; + Configurable invMassUp{"invMassUp", 0.85, "Upper limit of Rho invariant mass"}; + Configurable ptLow{"ptLow", 3, "Lower pt limit for rho"}; + Configurable tightInvMassLow{"tightInvMassLow", 0.73, "Lower tight limit of Rho invariant mass"}; + Configurable tightInvMassUp{"tightInvMassUp", 0.82, "Upper tight limit of Rho invariant mass"}; + } RhoSelections; // Trigger selections - Configurable> ConfTriggerSwitches{ - "ConfTriggerSwitches", - {CFTrigger::triggerSwitches[0], 1, CFTrigger::nAllTriggers, std::vector{"Switch"}, CFTrigger::CFTriggerNamesALL}, - "Turn on specific trigger"}; - - Configurable> ConfQ3Limits{ - "ConfQ3Limits", - {CFTrigger::Q3Limits[0], 1, CFTrigger::kNThreeBodyTriggers, std::vector{"Limit"}, CFTrigger::ThreeBodyFilterNames}, - "Q3 limits for three body trigger"}; - - Configurable> ConfKstarLimits{ - "ConfKstarLimits", - {CFTrigger::KstarLimits[0], 1, CFTrigger::kNTwoBodyTriggers, std::vector{"Limit"}, CFTrigger::TwoBodyFilterNames}, - "kstar limit for two body trigger"}; - - Configurable> ConfDownsample{ - "ConfDownsample", - {CFTrigger::Downsample[0], 2, CFTrigger::nTriggerAllNames, std::vector{"Switch", "Factor"}, CFTrigger::ParticleNames}, - "Downsample individual particle species (Switch has to be larger than 0, Factor has to smaller than 1)"}; + struct : ConfigurableGroup { + std::string prefix = "Triggers"; + Configurable> filterSwitches{"filterSwitches", + {cf_trigger::filterTable[0], + cf_trigger::nSwitches, + cf_trigger::nFilterNames, + cf_trigger::switches, + cf_trigger::filterNames}, + "Switch for triggers"}; + Configurable> limits{"limits", + {cf_trigger::limitTable[0], + cf_trigger::nLimitNames, + cf_trigger::nFilterNames, + cf_trigger::limitNames, + cf_trigger::filterNames}, + "Limits for trigger. Tight limit without downsampling and loose with downsampling"}; + } TriggerSelections; + + struct : ConfigurableGroup { + std::string prefix = "Binning"; + ConfigurableAxis multiplicity{"multiplicity", {200, 0, 200}, "Binning Multiplicity"}; + ConfigurableAxis zvtx{"zvtx", {30, -15, 15}, "Binning Zvertex"}; + + ConfigurableAxis momentum{"momentum", {600, 0, 6}, "Binning Momentum"}; + ConfigurableAxis eta{"eta", {200, -1, 1}, "Binning eta"}; + ConfigurableAxis phi{"phi", {720, 0, o2::constants::math::TwoPI}, "Binning phi"}; + ConfigurableAxis dca{"dca", {100, -0.2, 0.2}, "Binning Dca"}; + + ConfigurableAxis nsigma{"nsigma", {500, -5, 5}, "Binning nsigma"}; + ConfigurableAxis nsigmaComb{"nsigmaComb", {500, 0, 5}, "Binning nsigma comb"}; + ConfigurableAxis tpcSignal{"tpcSignal", {500, 0, 500}, "Binning Tpc Signal"}; + ConfigurableAxis itsSignal{"itsSignal", {150, 0, 15}, "Binning Its Signal"}; + ConfigurableAxis tofSignal{"tofSignal", {120, 0, 1.2}, "Binning Tof Signal"}; + ConfigurableAxis tpcCluster{"tpcCluster", {153, 0, 153}, "Binning Tpc Clusters"}; + ConfigurableAxis tpcChi2{"tpcChi2", {100, 0, 5}, "Binning TPC chi2"}; + ConfigurableAxis itsCluster{"itsCluster", {8, -0.5, 7.5}, "Binning Its Clusters"}; + ConfigurableAxis itsIbCluster{"itsIbCluster", {4, -0.5, 3.5}, "Binning Its Inner Barrel Clusters"}; + ConfigurableAxis itsChi2{"itsChi2", {100, 0, 50}, "Binning ITS chi2"}; + + ConfigurableAxis momCor{"momCor", {100, -1, 1}, "Binning Ratios"}; + ConfigurableAxis ratio{"ratio", {200, 0, 2}, "Binning Ratios"}; + + ConfigurableAxis invMassLambda{"invMassLambda", {200, 1, 1.2}, "Binning Invariant Mass Lambda"}; + ConfigurableAxis invMassK0short{"invMassK0short", {100, 0.48, 0.52}, "Binning Invariant Mass K0short"}; + + ConfigurableAxis dcaDaugh{"dcaDaugh", {200, 0, 2}, "Binning daughter DCA at decay vertex"}; + ConfigurableAxis cpa{"cpa", {100, 0.9, 1}, "Binning CPA"}; + ConfigurableAxis transRad{"transRad", {100, 0, 100}, "Binning Transverse Radius"}; + ConfigurableAxis decayVtx{"decayVtx", {100, 0, 100}, "Binning Decay Vertex"}; + + ConfigurableAxis invMassPhi{"invMassPhi", {700, 0.8, 1.5}, "Binning Invariant Mass Phi"}; + + ConfigurableAxis invMassRho{"invMassRho", {600, 0.6, 1.2}, "Binning Invariant Mass Rho"}; + + ConfigurableAxis q3{"q3", {300, 0, 3}, "Binning Decay Q3"}; + ConfigurableAxis kstar{"kstar", {300, 0, 3}, "Binning Decay Kstar"}; + + } Binning; HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject}; - // HistogramRegistry registryQA{"registryQA", {}, OutputObjHandlingPolicy::AnalysisObject}; - std::vector BBProton, BBAntiproton, BBDeuteron, BBAntideuteron, BBPion, BBAntipion, BBElectron, BBAntielectron, TPCTOFAvg; + // helper object flor building lambdas + o2::pwglf::strangenessBuilderHelper mStraHelper; + Service ccdb; + int mRunNumber = 0; + float mBz = 0.; + + // 4vectors for all particles + std::vector vecProton, vecAntiProton, vecDeuteron, vecAntiDeuteron, vecLambda, vecAntiLambda, vecKaon, vecAntiKaon, vecPhi, vecPion, vecAntiPion, vecRho; + // indices for all particles + std::vector idxProton, idxAntiProton, idxDeuteron, idxAntiDeuteron, idxKaon, idxAntiKaon, idxPion, idxAntiPion; + // indices for lambda daughters + std::vector idxLambdaDaughProton, idxLambdaDaughPion, idxAntiLambdaDaughProton, idxAntiLambdaDaughPion, idxPhiDaughPos, idxPhiDaughNeg, idxRhoDaughPos, idxRhoDaughNeg; + + // arrays to store found pairs/tripplets and trigger decisions + std::array keepEventTightLimit; + std::array keepEventLooseLimit; + std::array signalTightLimit; + std::array signalLooseLimit; + void init(o2::framework::InitContext&) { - rng = new TRandom3(ConfRngSeed.value); - - // init the ccdb - ccdb->setURL("http://alice-ccdb.cern.ch"); - ccdbApi.init("http://alice-ccdb.cern.ch"); - ccdb->setCaching(true); - ccdb->setLocalObjectValidityChecking(); - - // Set avg if not taking from ccdb - if (!ConfUseAvgFromCCDB) { - TPCTOFAvg = {ConfPIDTPCTOFAvg->get("Proton", "TPC Avg"), - ConfPIDTPCTOFAvg->get("Proton", "TOF Avg"), - ConfPIDTPCTOFAvg->get("AntiProton", "TPC Avg"), - ConfPIDTPCTOFAvg->get("AntiProton", "TOF Avg"), - ConfPIDTPCTOFAvg->get("Deuteron", "TPC Avg"), - ConfPIDTPCTOFAvg->get("Deuteron", "TOF Avg"), - ConfPIDTPCTOFAvg->get("AntiDeuteron", "TPC Avg"), - ConfPIDTPCTOFAvg->get("AntiDeuteron", "TOF Avg")}; - } - - // global histograms - registry.add("fProcessedEvents", "CF - event filtered;;Events", HistType::kTH1F, {{10, -0.5, 9.5}}); - std::vector eventTitles = {"all", "rejected", "ppp", "ppL", "pLL", "LLL", "ppPhi", "ppRho", "pD", "LD"}; - for (size_t iBin = 0; iBin < eventTitles.size(); iBin++) { - registry.get(HIST("fProcessedEvents"))->GetXaxis()->SetBinLabel(iBin + 1, eventTitles[iBin].data()); + // setup strangeness builder + mStraHelper.v0selections.minCrossedRows = V0BuilderOpts.minCrossedRows.value; + mStraHelper.v0selections.dcanegtopv = V0BuilderOpts.dcanegtopv.value; + mStraHelper.v0selections.dcapostopv = V0BuilderOpts.dcapostopv.value; + mStraHelper.v0selections.v0cospa = V0BuilderOpts.v0cospa.value; + mStraHelper.v0selections.dcav0dau = V0BuilderOpts.dcav0dau.value; + mStraHelper.v0selections.v0radius = V0BuilderOpts.v0radius.value; + mStraHelper.v0selections.maxDaughterEta = V0BuilderOpts.maxDaughterEta.value; + + mStraHelper.fitter.setPropagateToPCA(FitterOpts.propagateToPCA.value); + mStraHelper.fitter.setMaxR(FitterOpts.maxR.value); + mStraHelper.fitter.setMinParamChange(FitterOpts.minParamChange.value); + mStraHelper.fitter.setMinRelChi2Change(FitterOpts.minRelChi2Change.value); + mStraHelper.fitter.setMaxDZIni(FitterOpts.maxDzIni.value); + mStraHelper.fitter.setMaxDXYIni(FitterOpts.maxDxyIni.value); + mStraHelper.fitter.setMaxChi2(FitterOpts.maxChi2.value); + mStraHelper.fitter.setUseAbsDCA(FitterOpts.useAbsDCA.value); + mStraHelper.fitter.setWeightedFinalPCA(FitterOpts.weightedFinalPCA.value); + + // setup histograms + int allTriggers = 2 * cf_trigger::nFilterNames; + int prossedEventsBins = 3 + allTriggers; + std::vector triggerTitles = {"ppp_LooseQ3", "ppp_TightQ3", + "ppL_LooseQ3", "ppL_TightQ3", + "pLL_LooseQ3", "pLL_TightQ3", + "LLL_LooseQ3", "LLL_TightQ3", + "ppPhi_LooseQ3", "ppPhi_TightQ3", + "ppRho_LooseQ3", "ppRho_TightQ3", + "pD_LooseKstar", "pD_TightKstar", + "LD_LooseKstar", "LD_TightKstar", + "PhiD_LooseKstar", "PhiD_TightKstar", + "RhoD_LooseKstar", "RhoD_TightKstar"}; + + registry.add("fProcessedEvents", "CF - event filtered;;Events", HistType::kTH1F, {{prossedEventsBins, -0.5, prossedEventsBins - 0.5}}); + registry.get(HIST("fProcessedEvents"))->GetXaxis()->SetBinLabel(1, "all"); + registry.get(HIST("fProcessedEvents"))->GetXaxis()->SetBinLabel(2, "accepted_loose"); + registry.get(HIST("fProcessedEvents"))->GetXaxis()->SetBinLabel(3, "accepted_tight"); + + registry.add("fTriggerCorrelations", "CF - Trigger correlations", HistType::kTH2F, {{allTriggers, -0.5, allTriggers - 0.5}, {allTriggers, -0.5, allTriggers - 0.5}}); + + for (size_t iBin = 0; iBin < triggerTitles.size(); iBin++) { + registry.get(HIST("fProcessedEvents"))->GetXaxis()->SetBinLabel(iBin + 4, triggerTitles[iBin].data()); // start triggers from 4th bin + registry.get(HIST("fTriggerCorrelations"))->GetXaxis()->SetBinLabel(iBin + 1, triggerTitles[iBin].data()); + registry.get(HIST("fTriggerCorrelations"))->GetYaxis()->SetBinLabel(iBin + 1, triggerTitles[iBin].data()); } // event cuts - registry.add("EventCuts/fMultiplicityBefore", "Multiplicity of all processed events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); - registry.add("EventCuts/fMultiplicityAfter", "Multiplicity after event cuts;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); - registry.add("EventCuts/fZvtxBefore", "Zvtx of all processed events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); - registry.add("EventCuts/fZvtxAfter", "Zvtx after event cuts;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); - - // mom correlations p vs pTPC - registry.add("TrackCuts/TracksBefore/fMomCorrelationPos", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); - registry.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsPos", "fMomCorrelationAfterCuts;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); - registry.add("TrackCuts/TracksBefore/fMomCorrelationNeg", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); - registry.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsNeg", "fMomCorrelationAfterCuts;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); - - registry.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsProton", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); - registry.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsAntiProton", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); - registry.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsDeuteron", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); - registry.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsAntiDeuteron", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{500, 0.0f, 20.0f}, {500, 0.0f, 20.0f}}}); - - registry.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsPion", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{1000, 0.0f, 20.0f}, {1000, 0.0f, 20.0f}}}); - registry.add("TrackCuts/TracksBefore/fMomCorrelationAfterCutsAntiPion", "fMomCorrelation;p (GeV/c);p_{TPC} (GeV/c)", {HistType::kTH2F, {{1000, 0.0f, 20.0f}, {1000, 0.0f, 20.0f}}}); - - // all tracks - registry.add("TrackCuts/TracksBefore/fPtTrackBefore", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/TracksBefore/fEtaTrackBefore", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - registry.add("TrackCuts/TracksBefore/fPhiTrackBefore", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + registry.add("EventQA/Before/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registry.add("EventQA/Before/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + + registry.add("EventQA/After/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registry.add("EventQA/After/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + + // all tracks before cuts + registry.add("TrackQA/Before/Particle/fPt", "Transverse;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("TrackQA/Before/Particle/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registry.add("TrackQA/Before/Particle/fPhi", "Azimuthal;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + registry.add("TrackQA/Before/Particle/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); + registry.add("TrackQA/Before/Particle/fItsSignal", "ITSSignal;p_{TPC} (GeV/c);ITS Signal", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); + registry.add("TrackQA/Before/Particle/fTpcSignal", "TPCSignal;p_{TPC} (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); + registry.add("TrackQA/Before/Particle/fTofSignal", "TOFSignal;p_{TPC} (GeV/c);TOF Signal", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); + + registry.add("TrackQA/Before/AntiParticle/fPt", "Transverse momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("TrackQA/Before/AntiParticle/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registry.add("TrackQA/Before/AntiParticle/fPhi", "Azimuthal angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + registry.add("TrackQA/Before/AntiParticle/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); + registry.add("TrackQA/Before/AntiParticle/fItsSignal", "ITSSignal;p_{TPC} (GeV/c);ITS Signal", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); + registry.add("TrackQA/Before/AntiParticle/fTpcSignal", "TPCSignal;p_{TPC} (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); + registry.add("TrackQA/Before/AntiParticle/fTofSignal", "TOFSignal;p_{TPC} (GeV/c);TOF Signal", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); // PID vs momentum before cuts - registry.add("TrackCuts/NSigmaBefore/fNsigmaTPCvsPProtonBefore", "NSigmaTPC Proton Before;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/NSigmaBefore/fNsigmaTOFvsPProtonBefore", "NSigmaTOF Proton Before;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/NSigmaBefore/fNsigmaTPCTOFvsPProtonBefore", "NsigmaTPCTOF Proton Before;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - registry.add("TrackCuts/NSigmaBefore/fNsigmaITSvsPProtonBefore", "NSigmaITS Proton Before;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/NSigmaBefore/fNsigmaTPCvsPAntiProtonBefore", "NSigmaTPC AntiProton Before;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/NSigmaBefore/fNsigmaTOFvsPAntiProtonBefore", "NSigmaTOF AntiProton Before;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/NSigmaBefore/fNsigmaTPCTOFvsPAntiProtonBefore", "NSigmaTPCTOF AntiProton Before;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - registry.add("TrackCuts/NSigmaBefore/fNsigmaITSvsPAntiProtonBefore", "NSigmaITS AntiProton Before;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/NSigmaBefore/fNsigmaTPCvsPDeuteronBefore", "NSigmaTPC Deuteron Before;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/NSigmaBefore/fNsigmaTOFvsPDeuteronBefore", "NSigmaTOF Deuteron Before;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/NSigmaBefore/fNsigmaTPCTOFvsPDeuteronBefore", "NSigmaTPCTOF Deuteron Before;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - registry.add("TrackCuts/NSigmaBefore/fNsigmaITSvsPDeuteronBefore", "NSigmaITS Deuteron Before;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - - registry.add("TrackCuts/NSigmaBefore/fNsigmaTPCvsPAntiDeuteronBefore", "NSigmaTPC AntiDeuteron Before;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/NSigmaBefore/fNsigmaTOFvsPAntiDeuteronBefore", "NSigmaTOF AntiDeuteron Before;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/NSigmaBefore/fNsigmaTPCTOFvsPAntiDeuteronBefore", "NSigmaTPCTOF AntiDeuteron Before;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - registry.add("TrackCuts/NSigmaBefore/fNsigmaITSvsPAntiDeuteronBefore", "NSigmaITS AntiDeuteron Before;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - - registry.add("TrackCuts/NSigmaBefore/fNsigmaTPCvsPDeuteronBeforeP", "NSigmaTPC Deuteron BeforeP;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/NSigmaBefore/fNsigmaTPCvsPAntiDeuteronBeforeP", "NSigmaTPC AntiDeuteron BeforeP;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - - // TPC signal - registry.add("TrackCuts/TPCSignal/fTPCSignal", "TPCSignal;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); - registry.add("TrackCuts/TPCSignal/fTPCSignalP", "TPCSignalP;p (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); - registry.add("TrackCuts/TPCSignal/fTPCSignalALLCUTS", "TPCSignalALLCUTS;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); - registry.add("TrackCuts/TPCSignal/fTPCSignalALLCUTSP", "TPCSignalALLCUTSP;p (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); - - // TPC signal anti - registry.add("TrackCuts/TPCSignal/fTPCSignalAnti", "TPCSignal;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); - registry.add("TrackCuts/TPCSignal/fTPCSignalAntiP", "TPCSignalP;p (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); - registry.add("TrackCuts/TPCSignal/fTPCSignalAntiALLCUTS", "TPCSignalALLCUTS;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); - registry.add("TrackCuts/TPCSignal/fTPCSignalAntiALLCUTSP", "TPCSignalALLCUTSP;p(GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {2000, -100.f, 500.f}}}); - - // TPC signal particles - registry.add("TrackCuts/TPCSignal/fTPCSignalProton", "fTPCSignalProton;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); - registry.add("TrackCuts/TPCSignal/fTPCSignalAntiProton", "fTPCSignalAntiProton;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); - registry.add("TrackCuts/TPCSignal/fTPCSignalDeuteron", "fTPCSignalDeuteron;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); - registry.add("TrackCuts/TPCSignal/fTPCSignalAntiDeuteron", "fTPCSignalAntiDeuteron;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); - registry.add("TrackCuts/TPCSignal/fTPCSignalPionMinusV0Daughter", "fTPCSignalPionMinusV0Daughter;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); - registry.add("TrackCuts/TPCSignal/fTPCSignalPionPlusV0Daughter", "fTPCSignalPionPlusV0Daughter;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); - registry.add("TrackCuts/TPCSignal/fTPCSignalProtonMinusV0Daughter", "fTPCSignalProtonMinusV0Daughter;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); - registry.add("TrackCuts/TPCSignal/fTPCSignalProtonPlusV0Daughter", "fTPCSignalProtonPlusV0Daughter;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); - registry.add("TrackCuts/TPCSignal/fTPCSignalPion", "fTPCSignalPion;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); - registry.add("TrackCuts/TPCSignal/fTPCSignalAntiPion", "fTPCSignalAntiPion;p_{TPC} (GeV/c);dE/dx", {HistType::kTH2F, {{500, 0.0f, 6.0f}, {10000, -100.f, 500.f}}}); - - // PID vs momentum before cuts daughters - registry.add("TrackCuts/NSigmaBefore/fNsigmaTPCvsPProtonV0DaughBefore", "NSigmaTPC Proton V0Daught Before;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/NSigmaBefore/fNsigmaTPCvsPPionMinusV0DaughBefore", "NSigmaTPC AntiPion V0Daught Before;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/NSigmaBefore/fNsigmaTPCvsPAntiProtonAntiV0DaughBefore", "NSigmaTPC AntiProton antiV0Daught Before;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/NSigmaBefore/fNsigmaTPCvsPPionPlusAntiV0DaughBefore", "NSigmaTPC Pion antiV0Daught Before;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); + registry.add("TrackQA/Before/Pion/fNsigmaITS", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/Before/Pion/fNsigmaTPC", "NSigmaTPC;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/Before/Pion/fNsigmaTOF", "NSigmaTOF;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/Before/Pion/fNsigmaTPCTOF", "NsigmaTPCTOF;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registry.add("TrackQA/Before/AntiPion/fNsigmaITS", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/Before/AntiPion/fNsigmaTPC", "NSigmaTPC;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/Before/AntiPion/fNsigmaTOF", "NSigmaTOF;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/Before/AntiPion/fNsigmaTPCTOF", "NsigmaTPCTOF;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registry.add("TrackQA/Before/Kaon/fNsigmaITS", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/Before/Kaon/fNsigmaTPC", "NSigmaTPC;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/Before/Kaon/fNsigmaTOF", "NSigmaTOF;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/Before/Kaon/fNsigmaTPCTOF", "NsigmaTPCTOF;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registry.add("TrackQA/Before/AntiKaon/fNsigmaITS", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/Before/AntiKaon/fNsigmaTPC", "NSigmaTPC;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/Before/AntiKaon/fNsigmaTOF", "NSigmaTOF;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/Before/AntiKaon/fNsigmaTPCTOF", "NsigmaTPCTOF;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registry.add("TrackQA/Before/Proton/fNsigmaITS", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/Before/Proton/fNsigmaTPC", "NSigmaTPC;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/Before/Proton/fNsigmaTOF", "NSigmaTOF;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/Before/Proton/fNsigmaTPCTOF", "NsigmaTPCTOF;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registry.add("TrackQA/Before/AntiProton/fNsigmaITS", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/Before/AntiProton/fNsigmaTPC", "NSigmaTPC;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/Before/AntiProton/fNsigmaTOF", "NSigmaTOF;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/Before/AntiProton/fNsigmaTPCTOF", "NsigmaTPCTOF;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registry.add("TrackQA/Before/Deuteron/fNsigmaITS", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/Before/Deuteron/fNsigmaTPC", "NSigmaTPC;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/Before/Deuteron/fNsigmaTOF", "NSigmaTOF;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/Before/Deuteron/fNsigmaTPCTOF", "NsigmaTPCTOF;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registry.add("TrackQA/Before/AntiDeuteron/fNsigmaITS", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/Before/AntiDeuteron/fNsigmaTPC", "NSigmaTPC;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/Before/AntiDeuteron/fNsigmaTOF", "NSigmaTOF;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/Before/AntiDeuteron/fNsigmaTPCTOF", "NsigmaTPCTOF;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + // Pion + registry.add("TrackQA/After/Pion/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("TrackQA/After/Pion/fPTpc", "Momentum at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("TrackQA/After/Pion/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); + registry.add("TrackQA/After/Pion/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registry.add("TrackQA/After/Pion/fPhi", "Azimuthal angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + + registry.add("TrackQA/After/Pion/fNsigmaIts", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/After/Pion/fNsigmaTpc", "NSigmaTPC;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/After/Pion/fNsigmaTof", "NSigmaTOF;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/After/Pion/fNsigmaTpcTof", "NSigmaTPCTOF;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registry.add("TrackQA/After/Pion/fItsSignal", "ITS Signal;p (GeV/c); (cm)", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); + registry.add("TrackQA/After/Pion/fTpcSignal", "TPC Signal;p (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); + registry.add("TrackQA/After/Pion/fTofBeta", "TOF #beta;p (GeV/c);#beta_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); + + registry.add("TrackQA/After/Pion/fDcaXy", "DCA_{xy};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registry.add("TrackQA/After/Pion/fDcaZ", "DCA_{z};p_{T} (GeV/c); DCA_{Z};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + + registry.add("TrackQA/After/Pion/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("TrackQA/After/Pion/fTpcCrossedRows", "TPC Crossed Rows;TPC Crossed Rows;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("TrackQA/After/Pion/fTpcSharedClusters", "TPC Shared Clusters;TPC Shared Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("TrackQA/After/Pion/fTpcSharedClusterOverClusterss", "TPC Shared Clusters/Clusters;TPC Shared Clusters/Clusters;Entries", HistType::kTH1F, {Binning.ratio}); + registry.add("TrackQA/After/Pion/fTpcFindableOverRows", "TPC Findabled/Crossed Rows;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {Binning.ratio}); + registry.add("TrackQA/After/Pion/fTpcChi2OverCluster", "TPC #chi^{2}/Cluster;TPC #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.tpcChi2}); + + registry.add("TrackQA/After/Pion/fItsClusters", "ITS Clusters;ITS Clusters;Entries", HistType::kTH1F, {Binning.itsCluster}); + registry.add("TrackQA/After/Pion/fItsIbClusters", "ITS Inner Barrel Clusters;ITS Inner Barrel Clusters;Entries", HistType::kTH1F, {Binning.itsIbCluster}); + registry.add("TrackQA/After/Pion/fItsChi2OverCluster", "ITS #chi^{2}/Cluster;ITS #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.itsChi2}); + + // antiPion + registry.add("TrackQA/After/AntiPion/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("TrackQA/After/AntiPion/fPTpc", "Momentum at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("TrackQA/After/AntiPion/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); + registry.add("TrackQA/After/AntiPion/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registry.add("TrackQA/After/AntiPion/fPhi", "Azimuthal angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + + registry.add("TrackQA/After/AntiPion/fNsigmaIts", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/After/AntiPion/fNsigmaTpc", "NSigmaTPC;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/After/AntiPion/fNsigmaTof", "NSigmaTOF;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/After/AntiPion/fNsigmaTpcTof", "NSigmaTPCTOF;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registry.add("TrackQA/After/AntiPion/fItsSignal", "ITS Signal;p (GeV/c); (cm)", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); + registry.add("TrackQA/After/AntiPion/fTpcSignal", "TPC Signal;p (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); + registry.add("TrackQA/After/AntiPion/fTofBeta", "TOF #beta;p (GeV/c);#beta_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); + + registry.add("TrackQA/After/AntiPion/fDcaXy", "DCA_{xy};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registry.add("TrackQA/After/AntiPion/fDcaZ", "DCA_{z};p_{T} (GeV/c); DCA_{Z};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + + registry.add("TrackQA/After/AntiPion/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("TrackQA/After/AntiPion/fTpcCrossedRows", "TPC Crossed Rows;TPC Crossed Rows;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("TrackQA/After/AntiPion/fTpcSharedClusters", "TPC Shared Clusters;TPC Shared Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("TrackQA/After/AntiPion/fTpcSharedClusterOverClusterss", "TPC Shared Clusters/Clusters;TPC Shared Clusters/Clusters;Entries", HistType::kTH1F, {Binning.ratio}); + registry.add("TrackQA/After/AntiPion/fTpcFindableOverRows", "TPC Findabled/Crossed Rows;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {Binning.ratio}); + registry.add("TrackQA/After/AntiPion/fTpcChi2OverCluster", "TPC #chi^{2}/Cluster;TPC #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.tpcChi2}); + + registry.add("TrackQA/After/AntiPion/fItsClusters", "ITS Clusters;ITS Clusters;Entries", HistType::kTH1F, {Binning.itsCluster}); + registry.add("TrackQA/After/AntiPion/fItsIbClusters", "ITS Inner Barrel Clusters;ITS Inner Barrel Clusters;Entries", HistType::kTH1F, {Binning.itsIbCluster}); + registry.add("TrackQA/After/AntiPion/fItsChi2OverCluster", "ITS #chi^{2}/Cluster;ITS #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.itsChi2}); + + // Kaon + registry.add("TrackQA/After/Kaon/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("TrackQA/After/Kaon/fPTpc", "Momentum at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("TrackQA/After/Kaon/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); + registry.add("TrackQA/After/Kaon/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registry.add("TrackQA/After/Kaon/fPhi", "Azimuthal angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + + registry.add("TrackQA/After/Kaon/fNsigmaIts", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/After/Kaon/fNsigmaTpc", "NSigmaTPC;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/After/Kaon/fNsigmaTof", "NSigmaTOF;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/After/Kaon/fNsigmaTpcTof", "NSigmaTPCTOF;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registry.add("TrackQA/After/Kaon/fItsSignal", "ITS Signal;p (GeV/c); (cm)", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); + registry.add("TrackQA/After/Kaon/fTpcSignal", "TPC Signal;p (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); + registry.add("TrackQA/After/Kaon/fTofBeta", "TOF #beta;p (GeV/c);#beta_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); + + registry.add("TrackQA/After/Kaon/fDcaXy", "DCA_{xy};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registry.add("TrackQA/After/Kaon/fDcaZ", "DCA_{z};p_{T} (GeV/c); DCA_{Z};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + + registry.add("TrackQA/After/Kaon/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("TrackQA/After/Kaon/fTpcCrossedRows", "TPC Crossed Rows;TPC Crossed Rows;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("TrackQA/After/Kaon/fTpcSharedClusters", "TPC Shared Clusters;TPC Shared Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("TrackQA/After/Kaon/fTpcSharedClusterOverClusterss", "TPC Shared Clusters/Clusters;TPC Shared Clusters/Clusters;Entries", HistType::kTH1F, {Binning.ratio}); + registry.add("TrackQA/After/Kaon/fTpcFindableOverRows", "TPC Findabled/Crossed Rows;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {Binning.ratio}); + registry.add("TrackQA/After/Kaon/fTpcChi2OverCluster", "TPC #chi^{2}/Cluster;TPC #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.tpcChi2}); + + registry.add("TrackQA/After/Kaon/fItsClusters", "ITS Clusters;ITS Clusters;Entries", HistType::kTH1F, {Binning.itsCluster}); + registry.add("TrackQA/After/Kaon/fItsIbClusters", "ITS Inner Barrel Clusters;ITS Inner Barrel Clusters;Entries", HistType::kTH1F, {Binning.itsIbCluster}); + registry.add("TrackQA/After/Kaon/fItsChi2OverCluster", "ITS #chi^{2}/Cluster;ITS #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.itsChi2}); + + // antiKaon + registry.add("TrackQA/After/AntiKaon/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("TrackQA/After/AntiKaon/fPTpc", "Momentum at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("TrackQA/After/AntiKaon/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); + registry.add("TrackQA/After/AntiKaon/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registry.add("TrackQA/After/AntiKaon/fPhi", "Azimuthal angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + + registry.add("TrackQA/After/AntiKaon/fNsigmaIts", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/After/AntiKaon/fNsigmaTpc", "NSigmaTPC;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/After/AntiKaon/fNsigmaTof", "NSigmaTOF;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/After/AntiKaon/fNsigmaTpcTof", "NSigmaTPCTOF;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registry.add("TrackQA/After/AntiKaon/fItsSignal", "ITS Signal;p (GeV/c); (cm)", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); + registry.add("TrackQA/After/AntiKaon/fTpcSignal", "TPC Signal;p (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); + registry.add("TrackQA/After/AntiKaon/fTofBeta", "TOF #beta;p (GeV/c);#beta_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); + + registry.add("TrackQA/After/AntiKaon/fDcaXy", "DCA_{xy};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registry.add("TrackQA/After/AntiKaon/fDcaZ", "DCA_{z};p_{T} (GeV/c); DCA_{Z};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + + registry.add("TrackQA/After/AntiKaon/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("TrackQA/After/AntiKaon/fTpcCrossedRows", "TPC Crossed Rows;TPC Crossed Rows;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("TrackQA/After/AntiKaon/fTpcSharedClusters", "TPC Shared Clusters;TPC Shared Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("TrackQA/After/AntiKaon/fTpcSharedClusterOverClusterss", "TPC Shared Clusters/Clusters;TPC Shared Clusters/Clusters;Entries", HistType::kTH1F, {Binning.ratio}); + registry.add("TrackQA/After/AntiKaon/fTpcFindableOverRows", "TPC Findabled/Crossed Rows;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {Binning.ratio}); + registry.add("TrackQA/After/AntiKaon/fTpcChi2OverCluster", "TPC #chi^{2}/Cluster;TPC #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.tpcChi2}); + + registry.add("TrackQA/After/AntiKaon/fItsClusters", "ITS Clusters;ITS Clusters;Entries", HistType::kTH1F, {Binning.itsCluster}); + registry.add("TrackQA/After/AntiKaon/fItsIbClusters", "ITS Inner Barrel Clusters;ITS Inner Barrel Clusters;Entries", HistType::kTH1F, {Binning.itsIbCluster}); + registry.add("TrackQA/After/AntiKaon/fItsChi2OverCluster", "ITS #chi^{2}/Cluster;ITS #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.itsChi2}); // proton - // TEST P TPC - registry.add("TrackCuts/Proton/fPProton", "Momentum of protons at PV;p (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/Proton/fPTPCProton", "Momentum of protons at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/Proton/fPtProton", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/Proton/fMomCorProtonDif", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); - registry.add("TrackCuts/Proton/fMomCorProtonRatio", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); - registry.add("TrackCuts/Proton/fEtaProton", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - registry.add("TrackCuts/Proton/fPhiProton", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - registry.add("TrackCuts/Proton/fNsigmaTPCvsPProton", "NSigmaTPC Proton;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/Proton/fNsigmaTOFvsPProton", "NSigmaTOF Proton;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/Proton/fNsigmaTPCTOFvsPProton", "NSigmaTPCTOF Proton;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - registry.add("TrackCuts/Proton/fNsigmaITSvsPProton", "NSigmaITS Proton;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - - registry.add("TrackCuts/Proton/fNsigmaTPCvsPProtonP", "NSigmaTPC Proton P;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/Proton/fNsigmaTOFvsPProtonP", "NSigmaTOF Proton P;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/Proton/fNsigmaTPCTOFvsPProtonP", "NSigmaTPCTOF Proton P;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - - registry.add("TrackCuts/Proton/fDCAxyProton", "fDCAxy Proton;DCA_{XY};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - registry.add("TrackCuts/Proton/fDCAzProton", "fDCAz Proton;DCA_{Z};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - registry.add("TrackCuts/Proton/fTPCsClsProton", "fTPCsCls Proton;TPC Shared Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - registry.add("TrackCuts/Proton/fTPCcRowsProton", "fTPCcRows Proton;TPC Crossed Rows;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - registry.add("TrackCuts/Proton/fTrkTPCfClsProton", "fTrkTPCfCls Proton;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {{500, 0.0f, 3.0f}}); - registry.add("TrackCuts/Proton/fTPCnclsProton", "fTPCncls Proton;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); + registry.add("TrackQA/After/Proton/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("TrackQA/After/Proton/fPTpc", "Momentum at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("TrackQA/After/Proton/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); + registry.add("TrackQA/After/Proton/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registry.add("TrackQA/After/Proton/fPhi", "Azimuthal angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + + registry.add("TrackQA/After/Proton/fNsigmaIts", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/After/Proton/fNsigmaTpc", "NSigmaTPC;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/After/Proton/fNsigmaTof", "NSigmaTOF;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/After/Proton/fNsigmaTpcTof", "NSigmaTPCTOF;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registry.add("TrackQA/After/Proton/fItsSignal", "ITS Signal;p (GeV/c); (cm)", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); + registry.add("TrackQA/After/Proton/fTpcSignal", "TPC Signal;p (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); + registry.add("TrackQA/After/Proton/fTofBeta", "TOF #beta;p (GeV/c);#beta_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); + + registry.add("TrackQA/After/Proton/fDcaXy", "DCA_{xy};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registry.add("TrackQA/After/Proton/fDcaZ", "DCA_{z};p_{T} (GeV/c); DCA_{Z};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + + registry.add("TrackQA/After/Proton/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("TrackQA/After/Proton/fTpcCrossedRows", "TPC Crossed Rows;TPC Crossed Rows;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("TrackQA/After/Proton/fTpcSharedClusters", "TPC Shared Clusters;TPC Shared Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("TrackQA/After/Proton/fTpcSharedClusterOverClusterss", "TPC Shared Clusters/Clusters;TPC Shared Clusters/Clusters;Entries", HistType::kTH1F, {Binning.ratio}); + registry.add("TrackQA/After/Proton/fTpcFindableOverRows", "TPC Findabled/Crossed Rows;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {Binning.ratio}); + registry.add("TrackQA/After/Proton/fTpcChi2OverCluster", "TPC #chi^{2}/Cluster;TPC #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.tpcChi2}); + + registry.add("TrackQA/After/Proton/fItsClusters", "ITS Clusters;ITS Clusters;Entries", HistType::kTH1F, {Binning.itsCluster}); + registry.add("TrackQA/After/Proton/fItsIbClusters", "ITS Inner Barrel Clusters;ITS Inner Barrel Clusters;Entries", HistType::kTH1F, {Binning.itsIbCluster}); + registry.add("TrackQA/After/Proton/fItsChi2OverCluster", "ITS #chi^{2}/Cluster;ITS #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.itsChi2}); // antiproton - registry.add("TrackCuts/AntiProton/fPtAntiProton", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/AntiProton/fMomCorAntiProtonDif", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); - registry.add("TrackCuts/AntiProton/fMomCorAntiProtonRatio", "Momentum correlation;p_{reco} (GeV/c); |p_{TPC} - p_{reco}| (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); - registry.add("TrackCuts/AntiProton/fEtaAntiProton", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - registry.add("TrackCuts/AntiProton/fPhiAntiProton", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - registry.add("TrackCuts/AntiProton/fNsigmaTPCvsPAntiProton", "NSigmaTPC AntiProton;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/AntiProton/fNsigmaTOFvsPAntiProton", "NSigmaTOF AntiProton;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/AntiProton/fNsigmaTPCTOFvsPAntiProton", "NSigmaTPCTOF AntiProton;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - registry.add("TrackCuts/AntiProton/fNsigmaITSvsPAntiProton", "NSigmaITS AntiProton;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - - registry.add("TrackCuts/AntiProton/fNsigmaTPCvsPAntiProtonP", "NSigmaTPC AntiProton P;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/AntiProton/fNsigmaTOFvsPAntiProtonP", "NSigmaTOF AntiProton P;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/AntiProton/fNsigmaTPCTOFvsPAntiProtonP", "NSigmaTPCTOF AntiProton P;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - - registry.add("TrackCuts/AntiProton/fDCAxyAntiProton", "fDCAxy AntiProton;DCA_{XY};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - registry.add("TrackCuts/AntiProton/fDCAzAntiProton", "fDCAz AntiProton;DCA_{Z};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - registry.add("TrackCuts/AntiProton/fTPCsClsAntiProton", "fTPCsCls AntiProton;TPC Shared Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - registry.add("TrackCuts/AntiProton/fTPCcRowsAntiProton", "fTPCcRows AntiProton;TPC Crossed Rows;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - registry.add("TrackCuts/AntiProton/fTrkTPCfClsAntiProton", "fTrkTPCfCls AntiProton;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {{500, 0.0f, 3.0f}}); - registry.add("TrackCuts/AntiProton/fTPCnclsAntiProton", "fTPCncls AntiProton;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - - // deuteron - registry.add("TrackCuts/Deuteron/fPtDeuteron", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/Deuteron/fMomCorDeuteronDif", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); - registry.add("TrackCuts/Deuteron/fMomCorDeuteronRatio", "Momentum correlation;p_{reco} (GeV/c); |p_{TPC} - p_{reco}| (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); - registry.add("TrackCuts/Deuteron/fEtaDeuteron", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - registry.add("TrackCuts/Deuteron/fPhiDeuteron", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - registry.add("TrackCuts/Deuteron/fNsigmaTPCvsPDeuteron", "NSigmaTPC Deuteron;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/Deuteron/fNsigmaTOFvsPDeuteron", "NSigmaTOF Deuteron;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/Deuteron/fNsigmaTPCTOFvsPDeuteron", "NSigmaTPCTOF Deuteron;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - registry.add("TrackCuts/Deuteron/fNsigmaITSvsPDeuteron", "NSigmaITS Deuteron;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - - registry.add("TrackCuts/Deuteron/fNsigmaTPCvsPDeuteronP", "NSigmaTPC Deuteron vd P;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/Deuteron/fNsigmaTOFvsPDeuteronP", "NSigmaTOF Deuteron P;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/Deuteron/fNsigmaTPCTOFvsPDeuteronP", "NSigmaTPCTOF Deuteron P;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - - registry.add("TrackCuts/Deuteron/fDCAxyDeuteron", "fDCAxy Deuteron;DCA_{XY};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - registry.add("TrackCuts/Deuteron/fDCAzDeuteron", "fDCAz Deuteron;DCA_{Z};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - registry.add("TrackCuts/Deuteron/fTPCsClsDeuteron", "fTPCsCls Deuteron;TPC Shared Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - registry.add("TrackCuts/Deuteron/fTPCcRowsDeuteron", "fTPCcRows Deuteron;TPC Crossed Rows;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - registry.add("TrackCuts/Deuteron/fTrkTPCfClsDeuteron", "fTrkTPCfCls Deuteron;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {{500, 0.0f, 3.0f}}); - registry.add("TrackCuts/Deuteron/fTPCnclsDeuteron", "fTPCncls Deuteron;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - - // antideuteron - registry.add("TrackCuts/AntiDeuteron/fPtAntiDeuteron", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/AntiDeuteron/fMomCorAntiDeuteronDif", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); - registry.add("TrackCuts/AntiDeuteron/fMomCorAntiDeuteronRatio", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); - registry.add("TrackCuts/AntiDeuteron/fEtaAntiDeuteron", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - registry.add("TrackCuts/AntiDeuteron/fPhiAntiDeuteron", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - registry.add("TrackCuts/AntiDeuteron/fNsigmaTPCvsPAntiDeuteron", "NSigmaTPC AntiDeuteron;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/AntiDeuteron/fNsigmaTOFvsPAntiDeuteron", "NSigmaTOF AntiDeuteron;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/AntiDeuteron/fNsigmaTPCTOFvsPAntiDeuteron", "NSigmaTPCTOF AntiDeuteron;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - registry.add("TrackCuts/AntiDeuteron/fNsigmaITSvsPAntiDeuteron", "NSigmaITS AntiDeuteron;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - - registry.add("TrackCuts/AntiDeuteron/fNsigmaTPCvsPAntiDeuteronP", "NSigmaTPC AntiDeuteron P;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/AntiDeuteron/fNsigmaTOFvsPAntiDeuteronP", "NSigmaTOF AntiDeuteron P;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/AntiDeuteron/fNsigmaTPCTOFvsPAntiDeuteronP", "NSigmaTPCTOF AntiDeuteron P;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - - registry.add("TrackCuts/AntiDeuteron/fDCAxyAntiDeuteron", "fDCAxy AntiDeuteron;DCA_{XY};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - registry.add("TrackCuts/AntiDeuteron/fDCAzAntiDeuteron", "fDCAz AntiDeuteron;DCA_{Z};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - registry.add("TrackCuts/AntiDeuteron/fTPCsClsAntiDeuteron", "fTPCsCls AntiDeuteron;TPC Shared Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - registry.add("TrackCuts/AntiDeuteron/fTPCcRowsAntiDeuteron", "fTPCcRows AntiDeuteron;TPC Crossed Rows;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - registry.add("TrackCuts/AntiDeuteron/fTrkTPCfClsAntiDeuteron", "fTrkTPCfCls AntiDeuteron;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {{500, 0.0f, 3.0f}}); - registry.add("TrackCuts/AntiDeuteron/fTPCnclsAntiDeuteron", "fTPCncls AntiDeuteron;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - - // lambda before selections - registry.add("TrackCuts/V0Before/fInvMassLambdavsAntiLambda", "Invariant mass of Lambda vs AntiLambda;M_{#pi p};Entries", HistType::kTH2F, {{500, 1.03, 1.5}, {500, 1.03, 1.5}}); - registry.add("TrackCuts/V0Before/fPtLambdaBefore", "Transverse momentum of all processed V0s before cuts;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/V0Before/fInvMassLambdaBefore", "Invariant mass of all processed V0s (Lambda) before cuts;M_{#pi p};Entries", HistType::kTH1F, {{500, 1.03, 1.5}}); - registry.add("TrackCuts/V0Before/fInvMassAntiLambdaBefore", "Invariant mass of all processed V0s (antiLambda) before cuts;M_{#pi p};Entries", HistType::kTH1F, {{500, 1.03, 1.5}}); - registry.add("TrackCuts/V0Before/fInvMassV0BeforeKaonvsV0Before", "Invariant mass of rejected K0 vs V0s (V0Before);M_{#pi p};;M_{#pi #pi}", HistType::kTH2F, {{500, 1.03, 1.5}, {500, 0.3, 0.6}}); - registry.add("TrackCuts/V0Before/fV0DCADaugh", "V0DCADaugh;DCA_{daugh};Entries", HistType::kTH1F, {{500, -4, 4}}); - registry.add("TrackCuts/V0Before/fV0CPA", "V0 CPA;CPA;Entries", HistType::kTH1F, {{500, 0.7, 1}}); - registry.add("TrackCuts/V0Before/fV0TranRad", "V0 TranRad;TranRad;Entries", HistType::kTH1F, {{500, 0, 150}}); - registry.add("TrackCuts/V0Before/f0DecVtxX", "V0 DecVtxX;DecVtX;Entries", HistType::kTH1F, {{500, 0, 150}}); - registry.add("TrackCuts/V0Before/f0DecVtxY", "V0 DecVtxY;DecVtY;Entries", HistType::kTH1F, {{500, 0, 150}}); - registry.add("TrackCuts/V0Before/f0DecVtxZ", "V0 DecVtxZ;DecVtz;Entries", HistType::kTH1F, {{500, 0, 150}}); - - registry.add("TrackCuts/V0Before/PosDaughter/Eta", "V0Before Pos Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - registry.add("TrackCuts/V0Before/PosDaughter/DCAXY", "V0Before Pos Daugh DCAXY;DCA_{XY};Entries", HistType::kTH1F, {{500, -2.5f, 2.5f}}); - registry.add("TrackCuts/V0Before/PosDaughter/fTPCncls", "V0Before Pos Daugh TPCncls;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - registry.add("TrackCuts/V0Before/NegDaughter/Eta", "V0Before Neg Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - registry.add("TrackCuts/V0Before/NegDaughter/DCAXY", "V0Before Neg Daugh DCAXY;DCA_{XY};Entries", HistType::kTH1F, {{500, -2.5f, 2.5f}}); - registry.add("TrackCuts/V0Before/NegDaughter/fTPCncls", "V0Before Neg Daugh TPCncls;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - registry.add("TrackCuts/V0Before/PosDaughter/fNsigmaTPCvsPProtonV0Daugh", "NSigmaTPC Proton V0Daught;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/V0Before/NegDaughter/fNsigmaTPCvsPPionMinusV0Daugh", "NSigmaTPC AntiPion V0Daught;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/V0Before/NegDaughter/fNsigmaTPCvsPAntiProtonV0Daugh", "NSigmaTPC Proton V0Daught;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/V0Before/PosDaughter/fNsigmaTPCvsPPionPlusV0Daugh", "NSigmaTPC AntiPion V0Daught;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - - // lambda - registry.add("TrackCuts/Lambda/fPtLambda", "Transverse momentum V0s;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/Lambda/fInvMassLambda", "Invariant mass V0s (Lambda);M_{#pi p};Entries", HistType::kTH1F, {{500, 1.03, 1.5}}); - registry.add("TrackCuts/Lambda/fInvMassLambdaKaonvsLambda", "Invariant mass of rejected K0 vs V0s (Lambda);M_{#pi p};M_{#pi #pi}", HistType::kTH2F, {{500, 1.03, 1.5}, {500, 0.3, 0.6}}); - registry.add("TrackCuts/Lambda/fV0DCADaugh", "V0DCADaugh;DCA_{daugh};Entries", HistType::kTH1F, {{500, -4, 4}}); - registry.add("TrackCuts/Lambda/fV0CPA", "V0 CPA;CPA;Entries", HistType::kTH1F, {{500, 0.7, 1}}); - registry.add("TrackCuts/Lambda/fV0TranRad", "V0 TranRad;TranRad;Entries", HistType::kTH1F, {{500, 0, 150}}); - registry.add("TrackCuts/Lambda/f0DecVtxX", "V0 DecVtxX;DecVtX;Entries", HistType::kTH1F, {{500, 0, 150}}); - registry.add("TrackCuts/Lambda/f0DecVtxY", "V0 DecVtxY;DecVtY;Entries", HistType::kTH1F, {{500, 0, 150}}); - registry.add("TrackCuts/Lambda/f0DecVtxZ", "V0 DecVtxZ;DecVtZ;Entries", HistType::kTH1F, {{500, 0, 150}}); - - // Lambda daughter - registry.add("TrackCuts/Lambda/PosDaughter/Eta", "Lambda Pos Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - registry.add("TrackCuts/Lambda/PosDaughter/DCAXY", "Lambda Pos Daugh DCAXY;DCA_{XY};Entries", HistType::kTH1F, {{500, -2.5f, 2.5f}}); - registry.add("TrackCuts/Lambda/PosDaughter/fTPCncls", "Lambda Pos Daugh TPCncls;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - registry.add("TrackCuts/Lambda/NegDaughter/Eta", "Lambda Neg Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - registry.add("TrackCuts/Lambda/NegDaughter/DCAXY", "Lambda Neg Daugh DCAXY;DCA_{XY};Entries", HistType::kTH1F, {{500, -2.5f, 2.5f}}); - registry.add("TrackCuts/Lambda/NegDaughter/fTPCncls", "Lambda Neg Daugh TPCncls;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - registry.add("TrackCuts/Lambda/PosDaughter/fNsigmaTPCvsPProtonV0Daugh", "NSigmaTPC Proton V0Daught;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/Lambda/NegDaughter/fNsigmaTPCvsPPionMinusV0Daugh", "NSigmaTPC AntiPion V0Daught;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - - // antilambda - registry.add("TrackCuts/AntiLambda/fPtAntiLambda", "Transverse momentum V0s;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/AntiLambda/fInvMassAntiLambda", "Invariant mass V0s (Lambda);M_{#pi p};Entries", HistType::kTH1F, {{500, 1.03, 1.5}}); - registry.add("TrackCuts/AntiLambda/fInvMassAntiLambdaKaonvsAntiLambda", "Invariant mass of rejected K0 vs V0s (Lambda);M_{#pi p};M_{#pi #pi}", HistType::kTH2F, {{500, 1.03, 1.5}, {500, 0.3, 0.6}}); - registry.add("TrackCuts/AntiLambda/fV0DCADaugh", "V0DCADaugh;DCA_{daugh};Entries", HistType::kTH1F, {{500, -4, 4}}); - registry.add("TrackCuts/AntiLambda/fV0CPA", "V0 CPA;CPA;Entries", HistType::kTH1F, {{500, 0.7, 1}}); - registry.add("TrackCuts/AntiLambda/fV0TranRad", "V0 TranRad;TranRad;Entries", HistType::kTH1F, {{500, 0, 150}}); - registry.add("TrackCuts/AntiLambda/f0DecVtxX", "V0 DecVtxX;DecVtX;Entries", HistType::kTH1F, {{500, 0, 150}}); - registry.add("TrackCuts/AntiLambda/f0DecVtxY", "V0 DecVtxY;DecVtY;Entries", HistType::kTH1F, {{500, 0, 150}}); - registry.add("TrackCuts/AntiLambda/f0DecVtxZ", "V0 DecVtxZ;DecVtZ;Entries", HistType::kTH1F, {{500, 0, 150}}); - - // AntiLambda daughter - registry.add("TrackCuts/AntiLambda/PosDaughter/Eta", "AntiLambda Pos Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - registry.add("TrackCuts/AntiLambda/PosDaughter/DCAXY", "AntiLambda Pos Daugh DCAXY;DCA_{XY};Entries", HistType::kTH1F, {{500, -2.5f, 2.5f}}); - registry.add("TrackCuts/AntiLambda/PosDaughter/fTPCncls", "AntiLambda Pos Daugh TPCncls;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - registry.add("TrackCuts/AntiLambda/NegDaughter/Eta", "AntiLambda Neg Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - registry.add("TrackCuts/AntiLambda/NegDaughter/DCAXY", "AntiLambda Neg Daugh DCAXY;DCA_{XY};Entries", HistType::kTH1F, {{500, -2.5f, 2.5f}}); - registry.add("TrackCuts/AntiLambda/NegDaughter/fTPCncls", "AntiLambda Neg Daugh TPCncls;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - registry.add("TrackCuts/AntiLambda/NegDaughter/fNsigmaTPCvsPAntiProtonAntiV0Daugh", "NSigmaTPC AntiProton antiV0Daught;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/AntiLambda/PosDaughter/fNsigmaTPCvsPPionPlusAntiV0Daugh", "NSigmaTPC Pion antiV0Daught;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - - // Phi - - registry.add("TrackCuts/Phi/Before/fInvMass", "Invariant mass V0s;M_{KK};Entries", HistType::kTH1F, {{7000, 0.8, 1.5}}); - registry.add("TrackCuts/Phi/Before/fPt", "Transverse momentum V0s;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/Phi/Before/fEta", "Pseudorapidity of V0;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - registry.add("TrackCuts/Phi/Before/fPhi", "Azimuthal angle of V0;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - - registry.add("TrackCuts/Phi/Before/PosDaughter/fP", "Momentum of Kaons at PV;p (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/Phi/Before/PosDaughter/fPTPC", "Momentum of Kaons at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/Phi/Before/PosDaughter/fPt", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/Phi/Before/PosDaughter/fMomCorDif", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); - registry.add("TrackCuts/Phi/Before/PosDaughter/fMomCorRatio", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); - registry.add("TrackCuts/Phi/Before/PosDaughter/fEta", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - registry.add("TrackCuts/Phi/Before/PosDaughter/fPhi", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - registry.add("TrackCuts/Phi/Before/PosDaughter/fNsigmaTPCvsP", "NSigmaTPC Kaon;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/Phi/Before/PosDaughter/fNsigmaTOFvsP", "NSigmaTOF Kaon;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/Phi/Before/PosDaughter/fNsigmaTPCTOFvsP", "NSigmaTPCTOF Kaon;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - registry.add("TrackCuts/Phi/Before/PosDaughter/fDCAxy", "fDCAxy Kaon;DCA_{XY};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - registry.add("TrackCuts/Phi/Before/PosDaughter/fDCAz", "fDCAz Kaon;DCA_{Z};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - registry.add("TrackCuts/Phi/Before/PosDaughter/fTPCsCls", "fTPCsCls Kaon;TPC Shared Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - registry.add("TrackCuts/Phi/Before/PosDaughter/fTPCcRows", "fTPCcRows Kaon;TPC Crossed Rows;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - registry.add("TrackCuts/Phi/Before/PosDaughter/fTrkTPCfCls", "fTrkTPCfCls Kaon;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {{500, 0.0f, 3.0f}}); - registry.add("TrackCuts/Phi/Before/PosDaughter/fTPCncls", "fTPCncls Kaon;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - - registry.add("TrackCuts/Phi/Before/NegDaughter/fP", "Momentum of Kaons at PV;p (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/Phi/Before/NegDaughter/fPTPC", "Momentum of Kaons at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/Phi/Before/NegDaughter/fPt", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/Phi/Before/NegDaughter/fMomCorDif", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); - registry.add("TrackCuts/Phi/Before/NegDaughter/fMomCorRatio", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); - registry.add("TrackCuts/Phi/Before/NegDaughter/fEta", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - registry.add("TrackCuts/Phi/Before/NegDaughter/fPhi", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - registry.add("TrackCuts/Phi/Before/NegDaughter/fNsigmaTPCvsP", "NSigmaTPC Kaon;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/Phi/Before/NegDaughter/fNsigmaTOFvsP", "NSigmaTOF Kaon;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/Phi/Before/NegDaughter/fNsigmaTPCTOFvsP", "NSigmaTPCTOF Kaon;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - registry.add("TrackCuts/Phi/Before/NegDaughter/fDCAxy", "fDCAxy Kaon;DCA_{XY};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - registry.add("TrackCuts/Phi/Before/NegDaughter/fDCAz", "fDCAz Kaon;DCA_{Z};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - registry.add("TrackCuts/Phi/Before/NegDaughter/fTPCsCls", "fTPCsCls Kaon;TPC Shared Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - registry.add("TrackCuts/Phi/Before/NegDaughter/fTPCcRows", "fTPCcRows Kaon;TPC Crossed Rows;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - registry.add("TrackCuts/Phi/Before/NegDaughter/fTrkTPCfCls", "fTrkTPCfCls Kaon;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {{500, 0.0f, 3.0f}}); - registry.add("TrackCuts/Phi/Before/NegDaughter/fTPCncls", "fTPCncls Kaon;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - - registry.add("TrackCuts/Phi/After/fInvMass", "Invariant mass V0s;M_{KK};Entries", HistType::kTH1F, {{7000, 0.8, 1.5}}); - registry.add("TrackCuts/Phi/After/fPt", "Transverse momentum V0s;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/Phi/After/fEta", "Pseudorapidity of V0;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - registry.add("TrackCuts/Phi/After/fPhi", "Azimuthal angle of V0;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - - // phi daughter - registry.add("TrackCuts/Phi/After/PosDaughter/fPt", "Transverse momentum Pos Daugh tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/Phi/After/PosDaughter/fEta", "Phi Pos Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - registry.add("TrackCuts/Phi/After/PosDaughter/fPhi", "Azimuthal angle of Pos Daugh tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - - registry.add("TrackCuts/Phi/After/NegDaughter/fPt", "Transverse momentum Neg Daugh tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/Phi/After/NegDaughter/fEta", "Phi Neg Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - registry.add("TrackCuts/Phi/After/NegDaughter/fPhi", "Azimuthal angle of Neg Daugh tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - - // pions - registry.add("TrackCuts/Pion/fPPion", "Momentum of Pions at PV;p (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/Pion/fPTPCPion", "Momentum of Pions at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/Pion/fPtPion", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/Pion/fMomCorPionDif", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); - registry.add("TrackCuts/Pion/fMomCorPionRatio", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); - registry.add("TrackCuts/Pion/fEtaPion", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - registry.add("TrackCuts/Pion/fPhiPion", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - registry.add("TrackCuts/Pion/fNsigmaTPCvsPPion", "NSigmaTPC Pion;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/Pion/fNsigmaTOFvsPPion", "NSigmaTOF Pion;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/Pion/fNsigmaTPCTOFvsPPion", "NSigmaTPCTOF Pion;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - - registry.add("TrackCuts/Pion/fNsigmaTPCvsPPionP", "NSigmaTPC Pion P;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/Pion/fNsigmaTOFvsPPionP", "NSigmaTOF Pion P;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/Pion/fNsigmaTPCTOFvsPPionP", "NSigmaTPCTOF Pion P;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - - registry.add("TrackCuts/Pion/fDCAxyPion", "fDCAxy Pion;DCA_{XY};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - registry.add("TrackCuts/Pion/fDCAzPion", "fDCAz Pion;DCA_{Z};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - registry.add("TrackCuts/Pion/fTPCsClsPion", "fTPCsCls Pion;TPC Shared Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - registry.add("TrackCuts/Pion/fTPCcRowsPion", "fTPCcRows Pion;TPC Crossed Rows;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - registry.add("TrackCuts/Pion/fTrkTPCfClsPion", "fTrkTPCfCls Pion;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {{500, 0.0f, 3.0f}}); - registry.add("TrackCuts/Pion/fTPCnclsPion", "fTPCncls Pion;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - - // anti-pions - registry.add("TrackCuts/AntiPion/fPtAntiPion", "Transverse momentum of all processed tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/AntiPion/fMomCorAntiPionDif", "Momentum correlation;p_{reco} (GeV/c); (p_{TPC} - p_{reco}) (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {600, -3, 3}}}); - registry.add("TrackCuts/AntiPion/fMomCorAntiPionRatio", "Momentum correlation;p_{reco} (GeV/c); |p_{TPC} - p_{reco}| (GeV/c)", {HistType::kTH2F, {{500, 0, 10}, {200, -1, 1}}}); - registry.add("TrackCuts/AntiPion/fEtaAntiPion", "Pseudorapidity of all processed tracks;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - registry.add("TrackCuts/AntiPion/fPhiAntiPion", "Azimuthal angle of all processed tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - registry.add("TrackCuts/AntiPion/fNsigmaTPCvsPAntiPion", "NSigmaTPC AntiPion;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/AntiPion/fNsigmaTOFvsPAntiPion", "NSigmaTOF AntiPion;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/AntiPion/fNsigmaTPCTOFvsPAntiPion", "NSigmaTPCTOF AntiPion;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - - registry.add("TrackCuts/AntiPion/fNsigmaTPCvsPAntiPionP", "NSigmaTPC AntiPion P;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/AntiPion/fNsigmaTOFvsPAntiPionP", "NSigmaTOF AntiPion P;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, -10.f, 10.f}}}); - registry.add("TrackCuts/AntiPion/fNsigmaTPCTOFvsPAntiPionP", "NSigmaTPCTOF AntiPion P;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {100, 0.f, 10.f}}}); - - registry.add("TrackCuts/AntiPion/fDCAxyAntiPion", "fDCAxy AntiPion;DCA_{XY};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - registry.add("TrackCuts/AntiPion/fDCAzAntiPion", "fDCAz AntiPion;DCA_{Z};Entries", HistType::kTH1F, {{500, -0.5f, 0.5f}}); - registry.add("TrackCuts/AntiPion/fTPCsClsAntiPion", "fTPCsCls AntiPion;TPC Shared Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - registry.add("TrackCuts/AntiPion/fTPCcRowsAntiPion", "fTPCcRows AntiPion;TPC Crossed Rows;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - registry.add("TrackCuts/AntiPion/fTrkTPCfClsAntiPion", "fTrkTPCfCls AntiPion;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {{500, 0.0f, 3.0f}}); - registry.add("TrackCuts/AntiPion/fTPCnclsAntiPion", "fTPCncls AntiPion;TPC Clusters;Entries", HistType::kTH1F, {{163, -1.0f, 162.0f}}); - - // rho QA - // daughter pos before - registry.add("TrackCuts/Rho/Before/PosDaughter/fInvMass", "Invariant mass Rho Pos Daugh;M_{#pi};Entries", HistType::kTH1F, {{500, 0, 1}}); - registry.add("TrackCuts/Rho/Before/PosDaughter/fPt", "Transverse momentum Rho Pos Daugh tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/Rho/Before/PosDaughter/fEta", "Rho Pos Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - registry.add("TrackCuts/Rho/Before/PosDaughter/fPhi", "Azimuthal angle of Rho Pos Daugh tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - // daughter neg before - registry.add("TrackCuts/Rho/Before/NegDaughter/fInvMass", "Invariant mass Rho Neg Daugh;M_{#pi};Entries", HistType::kTH1F, {{500, 0, 1}}); - registry.add("TrackCuts/Rho/Before/NegDaughter/fPt", "Transverse momentum Rho Neg Daugh tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/Rho/Before/NegDaughter/fEta", "Rho Neg Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - registry.add("TrackCuts/Rho/Before/NegDaughter/fPhi", "Azimuthal angle of Rho Neg Daugh tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - // rhoCand before - registry.add("TrackCuts/Rho/Before/fInvMass", "Invariant mass RhoCand;M_{#pi#pi};Entries", HistType::kTH1F, {{5000, 0, 5}}); - registry.add("TrackCuts/Rho/Before/fPt", "Transverse momentum RhoCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/Rho/Before/fEta", "Pseudorapidity of RhoCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - registry.add("TrackCuts/Rho/Before/fPhi", "Azimuthal angle of RhoCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - // daughter pos after - registry.add("TrackCuts/Rho/After/PosDaughter/fPt", "Transverse momentum RhoCand Pos Daugh tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/Rho/After/PosDaughter/fEta", "RhoCand Pos Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - registry.add("TrackCuts/Rho/After/PosDaughter/fPhi", "Azimuthal angle of RhoCand Pos Daugh tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - // daughter neg after - registry.add("TrackCuts/Rho/After/NegDaughter/fPt", "Transverse momentum RhoCand Neg Daugh tracks;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/Rho/After/NegDaughter/fEta", "RhoCand Neg Daugh Eta;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - registry.add("TrackCuts/Rho/After/NegDaughter/fPhi", "Azimuthal angle of RhoCand Neg Daugh tracks;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); - // rhoCand after - registry.add("TrackCuts/Rho/After/fInvMass", "Invariant mass RhoCand;M_{#pi#pi};Entries", HistType::kTH1F, {{5000, 0, 5}}); - registry.add("TrackCuts/Rho/After/fPt", "Transverse momentum RhoCand;p_{T} (GeV/c);Entries", HistType::kTH1F, {{500, 0, 10}}); - registry.add("TrackCuts/Rho/After/fEta", "Pseudorapidity of RhoCand;#eta;Entries", HistType::kTH1F, {{500, -2, 2}}); - registry.add("TrackCuts/Rho/After/fPhi", "Azimuthal angle of RhoCand;#phi;Entries", HistType::kTH1F, {{720, 0, TMath::TwoPi()}}); + registry.add("TrackQA/After/AntiProton/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("TrackQA/After/AntiProton/fPTpc", "Momentum at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("TrackQA/After/AntiProton/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); + registry.add("TrackQA/After/AntiProton/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registry.add("TrackQA/After/AntiProton/fPhi", "Azimuthal angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + + registry.add("TrackQA/After/AntiProton/fNsigmaIts", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/After/AntiProton/fNsigmaTpc", "NSigmaTPC;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/After/AntiProton/fNsigmaTof", "NSigmaTOF;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/After/AntiProton/fNsigmaTpcTof", "NSigmaTPCTOF;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registry.add("TrackQA/After/AntiProton/fItsSignal", "ITS Signal;p (GeV/c); (cm)", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); + registry.add("TrackQA/After/AntiProton/fTpcSignal", "TPC Signal;p (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); + registry.add("TrackQA/After/AntiProton/fTofBeta", "TOF #beta;p (GeV/c);#beta_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); + + registry.add("TrackQA/After/AntiProton/fDcaXy", "DCA_{xy};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registry.add("TrackQA/After/AntiProton/fDcaZ", "DCA_{z};p_{T} (GeV/c); DCA_{Z};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + + registry.add("TrackQA/After/AntiProton/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("TrackQA/After/AntiProton/fTpcCrossedRows", "TPC Crossed Rows;TPC Crossed Rows;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("TrackQA/After/AntiProton/fTpcSharedClusters", "TPC Shared Clusters;TPC Shared Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("TrackQA/After/AntiProton/fTpcSharedClusterOverClusterss", "TPC Shared Clusters/Clusters;TPC Shared Clusters/Clusters;Entries", HistType::kTH1F, {Binning.ratio}); + registry.add("TrackQA/After/AntiProton/fTpcFindableOverRows", "TPC Findabled/Crossed Rows;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {Binning.ratio}); + registry.add("TrackQA/After/AntiProton/fTpcChi2OverCluster", "TPC #chi^{2}/Cluster;TPC #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.tpcChi2}); + + registry.add("TrackQA/After/AntiProton/fItsClusters", "ITS Clusters;ITS Clusters;Entries", HistType::kTH1F, {Binning.itsCluster}); + registry.add("TrackQA/After/AntiProton/fItsIbClusters", "ITS Inner Barrel Clusters;ITS Inner Barrel Clusters;Entries", HistType::kTH1F, {Binning.itsIbCluster}); + registry.add("TrackQA/After/AntiProton/fItsChi2OverCluster", "ITS #chi^{2}/Cluster;ITS #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.itsChi2}); + + // Deuteron + registry.add("TrackQA/After/Deuteron/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("TrackQA/After/Deuteron/fPTpc", "Momentum at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("TrackQA/After/Deuteron/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); + registry.add("TrackQA/After/Deuteron/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registry.add("TrackQA/After/Deuteron/fPhi", "Azimuthal angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + + registry.add("TrackQA/After/Deuteron/fNsigmaIts", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/After/Deuteron/fNsigmaTpc", "NSigmaTPC;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/After/Deuteron/fNsigmaTof", "NSigmaTOF;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/After/Deuteron/fNsigmaTpcTof", "NSigmaTPCTOF;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registry.add("TrackQA/After/Deuteron/fItsSignal", "ITS Signal;p (GeV/c); (cm)", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); + registry.add("TrackQA/After/Deuteron/fTpcSignal", "TPC Signal;p (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); + registry.add("TrackQA/After/Deuteron/fTofBeta", "TOF #beta;p (GeV/c);#beta_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); + + registry.add("TrackQA/After/Deuteron/fDcaXy", "DCA_{xy};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registry.add("TrackQA/After/Deuteron/fDcaZ", "DCA_{z};p_{T} (GeV/c); DCA_{Z};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + + registry.add("TrackQA/After/Deuteron/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("TrackQA/After/Deuteron/fTpcCrossedRows", "TPC Crossed Rows;TPC Crossed Rows;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("TrackQA/After/Deuteron/fTpcSharedClusters", "TPC Shared Clusters;TPC Shared Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("TrackQA/After/Deuteron/fTpcSharedClusterOverClusterss", "TPC Shared Clusters/Clusters;TPC Shared Clusters/Clusters;Entries", HistType::kTH1F, {Binning.ratio}); + registry.add("TrackQA/After/Deuteron/fTpcFindableOverRows", "TPC Findabled/Crossed Rows;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {Binning.ratio}); + registry.add("TrackQA/After/Deuteron/fTpcChi2OverCluster", "TPC #chi^{2}/Cluster;TPC #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.tpcChi2}); + + registry.add("TrackQA/After/Deuteron/fItsClusters", "ITS Clusters;ITS Clusters;Entries", HistType::kTH1F, {Binning.itsCluster}); + registry.add("TrackQA/After/Deuteron/fItsIbClusters", "ITS Inner Barrel Clusters;ITS Inner Barrel Clusters;Entries", HistType::kTH1F, {Binning.itsIbCluster}); + registry.add("TrackQA/After/Deuteron/fItsChi2OverCluster", "ITS #chi^{2}/Cluster;ITS #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.itsChi2}); + + // AntiDeuteron + registry.add("TrackQA/After/AntiDeuteron/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("TrackQA/After/AntiDeuteron/fPTpc", "Momentum at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("TrackQA/After/AntiDeuteron/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); + registry.add("TrackQA/After/AntiDeuteron/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registry.add("TrackQA/After/AntiDeuteron/fPhi", "Azimuthal angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + + registry.add("TrackQA/After/AntiDeuteron/fNsigmaIts", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/After/AntiDeuteron/fNsigmaTpc", "NSigmaTPC;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/After/AntiDeuteron/fNsigmaTof", "NSigmaTOF;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("TrackQA/After/AntiDeuteron/fNsigmaTpcTof", "NSigmaTPCTOF;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + + registry.add("TrackQA/After/AntiDeuteron/fItsSignal", "ITS Signal;p (GeV/c); (cm)", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); + registry.add("TrackQA/After/AntiDeuteron/fTpcSignal", "TPC Signal;p (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); + registry.add("TrackQA/After/AntiDeuteron/fTofBeta", "TOF #beta;p (GeV/c);#beta_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); + + registry.add("TrackQA/After/AntiDeuteron/fDcaXy", "DCA_{xy};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registry.add("TrackQA/After/AntiDeuteron/fDcaZ", "DCA_{z};p_{T} (GeV/c); DCA_{Z};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + + registry.add("TrackQA/After/AntiDeuteron/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("TrackQA/After/AntiDeuteron/fTpcCrossedRows", "TPC Crossed Rows;TPC Crossed Rows;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("TrackQA/After/AntiDeuteron/fTpcSharedClusters", "TPC Shared Clusters;TPC Shared Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("TrackQA/After/AntiDeuteron/fTpcSharedClusterOverClusterss", "TPC Shared Clusters/Clusters;TPC Shared Clusters/Clusters;Entries", HistType::kTH1F, {Binning.ratio}); + registry.add("TrackQA/After/AntiDeuteron/fTpcFindableOverRows", "TPC Findabled/Crossed Rows;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {Binning.ratio}); + registry.add("TrackQA/After/AntiDeuteron/fTpcChi2OverCluster", "TPC #chi^{2}/Cluster;TPC #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.tpcChi2}); + + registry.add("TrackQA/After/AntiDeuteron/fItsClusters", "ITS Clusters;ITS Clusters;Entries", HistType::kTH1F, {Binning.itsCluster}); + registry.add("TrackQA/After/AntiDeuteron/fItsIbClusters", "ITS Inner Barrel Clusters;ITS Inner Barrel Clusters;Entries", HistType::kTH1F, {Binning.itsIbCluster}); + registry.add("TrackQA/After/AntiDeuteron/fItsChi2OverCluster", "ITS #chi^{2}/Cluster;ITS #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.itsChi2}); + + // Lambda before + registry.add("LambdaQA/Before/fPt", "Transverse momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("LambdaQA/Before/fEta", "Psedurapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registry.add("LambdaQA/Before/fPhi", "Azimuthal Angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + registry.add("LambdaQA/Before/fInvMassLambda", "Invariant mass Lambda;M_{#pi p};Entries", HistType::kTH1F, {Binning.invMassLambda}); + registry.add("LambdaQA/Before/fInvMassAntiLambda", "Invariant mass AntiLambda;M_{#pi p};Entries", HistType::kTH1F, {Binning.invMassLambda}); + registry.add("LambdaQA/Before/fInvMassLambdaVsAntiLambda", "Invariant mass of Lambda vs AntiLambda;M_{#pi p};Entries", HistType::kTH2F, {Binning.invMassLambda, Binning.invMassLambda}); + registry.add("LambdaQA/Before/fInvMassLambdaVsKaon", "Invariant mass of Lambda vs K0;M_{#pi p};;M_{#pi #pi}", HistType::kTH2F, {Binning.invMassLambda, Binning.invMassK0short}); + registry.add("LambdaQA/Before/fInvMassAntiLambdaVsKaon", "Invariant mass of AntiLambda vs K0;M_{#pi p};;M_{#pi #pi}", HistType::kTH2F, {Binning.invMassLambda, Binning.invMassK0short}); + registry.add("LambdaQA/Before/fDcaDaugh", "DCA_{Daugh};DCA_{daugh};Entries", HistType::kTH1F, {Binning.dcaDaugh}); + registry.add("LambdaQA/Before/fCpa", "Cosine of pointing angle;CPA;Entries", HistType::kTH1F, {Binning.cpa}); + registry.add("LambdaQA/Before/fTranRad", "Transverse Radisu;TranRad;Entries", HistType::kTH1F, {Binning.transRad}); + registry.add("LambdaQA/Before/fDecVtx", "Decay vertex displacement;DecVtx;Entries", HistType::kTH1F, {Binning.decayVtx}); + registry.add("LambdaQA/Before/PosDaughter/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("LambdaQA/Before/PosDaughter/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registry.add("LambdaQA/Before/PosDaughter/fPhi", "Azimuthal Angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + registry.add("LambdaQA/Before/PosDaughter/fDcaXy", "DCA_{XY};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registry.add("LambdaQA/Before/PosDaughter/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("LambdaQA/Before/PosDaughter/fNsigmaTpcProton", "NSigmaTPC Proton;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("LambdaQA/Before/PosDaughter/fNsigmaTpcPion", "NSigmaTPC Pion;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("LambdaQA/Before/NegDaughter/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("LambdaQA/Before/NegDaughter/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registry.add("LambdaQA/Before/NegDaughter/fPhi", "Azimuthal Angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + registry.add("LambdaQA/Before/NegDaughter/fDcaXy", "DCA_{XY};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registry.add("LambdaQA/Before/NegDaughter/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("LambdaQA/Before/NegDaughter/fNsigmaTpcProton", "NSigmaTPC AnitProton;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("LambdaQA/Before/NegDaughter/fNsigmaTpcPion", "NSigmaTPC AntiPion;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + + // Lambda after + registry.add("LambdaQA/After/Lambda/fPt", "Transverse momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("LambdaQA/After/Lambda/fEta", "Psedurapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registry.add("LambdaQA/After/Lambda/fPhi", "Azimuthal Angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + registry.add("LambdaQA/After/Lambda/fInvMass", "Invariant mass;M_{#pi p};Entries", HistType::kTH1F, {Binning.invMassLambda}); + registry.add("LambdaQA/After/Lambda/fInvMassLambdaVsAntiLambda", "Invariant mass of Lambda vs AntiLambda;M_{#pi p};Entries", HistType::kTH2F, {Binning.invMassLambda, Binning.invMassLambda}); + registry.add("LambdaQA/After/Lambda/fInvMassLambdaVsKaon", "Invariant mass of rejected K0 vs V0s;M_{#pi p};;M_{#pi #pi}", HistType::kTH2F, {Binning.invMassLambda, Binning.invMassK0short}); + registry.add("LambdaQA/After/Lambda/fDcaDaugh", "DCA_{Daugh};DCA_{daugh};Entries", HistType::kTH1F, {Binning.dcaDaugh}); + registry.add("LambdaQA/After/Lambda/fCpa", "Cosine of pointing angle;CPA;Entries", HistType::kTH1F, {Binning.cpa}); + registry.add("LambdaQA/After/Lambda/fTranRad", "Transverse Radisu;TranRad;Entries", HistType::kTH1F, {Binning.transRad}); + registry.add("LambdaQA/After/Lambda/fDecVtx", "Decay vertex displacement;DecVtx;Entries", HistType::kTH1F, {Binning.decayVtx}); + registry.add("LambdaQA/After/Lambda/PosDaughter/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("LambdaQA/After/Lambda/PosDaughter/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registry.add("LambdaQA/After/Lambda/PosDaughter/fPhi", "Azimuthal Angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + registry.add("LambdaQA/After/Lambda/PosDaughter/fDcaXy", "DCA_{XY};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registry.add("LambdaQA/After/Lambda/PosDaughter/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("LambdaQA/After/Lambda/PosDaughter/fNsigmaTpc", "NSigmaTPC Proton;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("LambdaQA/After/Lambda/NegDaughter/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("LambdaQA/After/Lambda/NegDaughter/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registry.add("LambdaQA/After/Lambda/NegDaughter/fPhi", "Azimuthal Angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + registry.add("LambdaQA/After/Lambda/NegDaughter/fDcaXy", "DCA_{XY};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registry.add("LambdaQA/After/Lambda/NegDaughter/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("LambdaQA/After/Lambda/NegDaughter/fNsigmaTpc", "NSigmaTPC AntiPion;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + + // AntiLambda after + registry.add("LambdaQA/After/AntiLambda/fPt", "Transverse momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("LambdaQA/After/AntiLambda/fEta", "Psedurapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registry.add("LambdaQA/After/AntiLambda/fPhi", "Azimuthal Angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + registry.add("LambdaQA/After/AntiLambda/fInvMass", "Invariant mass;M_{#pi p};Entries", HistType::kTH1F, {Binning.invMassLambda}); + registry.add("LambdaQA/After/AntiLambda/fInvMassAntiLambdaVsLambda", "Invariant mass of Lambda vs AntiLambda;M_{#pi p};Entries", HistType::kTH2F, {Binning.invMassLambda, Binning.invMassLambda}); + registry.add("LambdaQA/After/AntiLambda/fInvMassAntiLambdaVsKaon", "Invariant mass of rejected K0 vs V0s;M_{#pi p};;M_{#pi #pi}", HistType::kTH2F, {Binning.invMassLambda, Binning.invMassK0short}); + registry.add("LambdaQA/After/AntiLambda/fDcaDaugh", "DCA_{Daugh};DCA_{daugh};Entries", HistType::kTH1F, {Binning.dcaDaugh}); + registry.add("LambdaQA/After/AntiLambda/fCpa", "Cosine of pointing angle;CPA;Entries", HistType::kTH1F, {Binning.cpa}); + registry.add("LambdaQA/After/AntiLambda/fTranRad", "Transverse Radisu;TranRad;Entries", HistType::kTH1F, {Binning.transRad}); + registry.add("LambdaQA/After/AntiLambda/fDecVtx", "Decay vertex displacement;DecVtx;Entries", HistType::kTH1F, {Binning.decayVtx}); + registry.add("LambdaQA/After/AntiLambda/PosDaughter/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("LambdaQA/After/AntiLambda/PosDaughter/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registry.add("LambdaQA/After/AntiLambda/PosDaughter/fPhi", "Azimuthal Angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + registry.add("LambdaQA/After/AntiLambda/PosDaughter/fDcaXy", "DCA_{XY};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registry.add("LambdaQA/After/AntiLambda/PosDaughter/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("LambdaQA/After/AntiLambda/PosDaughter/fNsigmaTpc", "NSigmaTPC Proton;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registry.add("LambdaQA/After/AntiLambda/NegDaughter/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("LambdaQA/After/AntiLambda/NegDaughter/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registry.add("LambdaQA/After/AntiLambda/NegDaughter/fPhi", "Azimuthal Angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + registry.add("LambdaQA/After/AntiLambda/NegDaughter/fDcaXy", "DCA_{XY};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registry.add("LambdaQA/After/AntiLambda/NegDaughter/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registry.add("LambdaQA/After/AntiLambda/NegDaughter/fNsigmaTpc", "NSigmaTPC AntiPion;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + + // Phi before + registry.add("PhiQA/Before/fInvMass", "Invariant mass #phi;M_{KK};Entries", HistType::kTH1F, {Binning.invMassPhi}); + registry.add("PhiQA/Before/fPt", "Transverse momentum #phi;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("PhiQA/Before/fEta", "Pseudorapidity of V0;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registry.add("PhiQA/Before/fPhi", "Azimuthal angle of #phi;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + + // Phi after + registry.add("PhiQA/After/fInvMass", "Invariant mass #phi;M_{KK};Entries", HistType::kTH1F, {Binning.invMassPhi}); + registry.add("PhiQA/After/fPt", "Transverse momentum #phi;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("PhiQA/After/fEta", "Pseudorapidity of #phi;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registry.add("PhiQA/After/fPhi", "Azimuthal angle of #Phi;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + + // Rho before + registry.add("RhoQA/Before/fInvMass", "Invariant mass #rho;M_{#pi#pi};Entries", HistType::kTH1F, {Binning.invMassRho}); + registry.add("RhoQA/Before/fPt", "Transverse momentum #rho;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("RhoQA/Before/fEta", "Pseudorapidity of #rho;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registry.add("RhoQA/Before/fPhi", "Azimuthal angle of #rho;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + + // Rho after + registry.add("RhoQA/After/fInvMass", "Invariant mass #rho;M_{#pi#pi};Entries", HistType::kTH1F, {Binning.invMassRho}); + registry.add("RhoQA/After/fPt", "Transverse momentum #rho;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registry.add("RhoQA/After/fEta", "Pseudorapidity of #rho;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registry.add("RhoQA/After/fPhi", "Azimuthal angle of #rho;#phi;Entries", HistType::kTH1F, {Binning.phi}); // for ppp - registry.add("ppp/fMultiplicity", "Multiplicity of all processed events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); - registry.add("ppp/fZvtx", "Zvtx of all processed events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); - registry.add("ppp/fSE_particle", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("ppp/fSE_particle_downsample", "Same Event distribution (downsampled)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("ppp/fSE_antiparticle", "Same Event distribution", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("ppp/fSE_antiparticle_downsample", "Same Event distribution (downsampled)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("ppp/fProtonPtVsQ3", "pT (proton) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); - registry.add("ppp/fAntiProtonPtVsQ3", "pT (antiproton) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); + registry.add("PPP/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registry.add("PPP/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registry.add("PPP/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registry.add("PPP/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registry.add("PPP/fProtonPtVsQ3", "Proton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registry.add("PPP/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); // for ppl - registry.add("ppl/fMultiplicity", "Multiplicity of all processed events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); - registry.add("ppl/fZvtx", "Zvtx of all processed events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); - registry.add("ppl/fSE_particle", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("ppl/fSE_particle_downsample", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("ppl/fSE_antiparticle", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("ppl/fSE_antiparticle_downsample", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("ppl/fProtonPtVsQ3", "pT (proton) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); - registry.add("ppl/fAntiProtonPtVsQ3", "pT (proton) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); - registry.add("ppl/fLambdaPtVsQ3", "pT (lambda) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); - registry.add("ppl/fAntiLambdaPtVsQ3", "pT (antilambda) vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); + registry.add("PPL/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registry.add("PPL/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registry.add("PPL/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registry.add("PPL/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registry.add("PPL/fProtonPtVsQ3", "Proton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registry.add("PPL/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registry.add("PPL/fLambdaPtVsQ3", "Lambda p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registry.add("PPL/fAntiLambdaPtVsQ3", "AntiLambda p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); // for pll - registry.add("pll/fMultiplicity", "Multiplicity of all processed events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); - registry.add("pll/fZvtx", "Zvtx of all processed events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); - registry.add("pll/fSE_particle", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("pll/fSE_particle_downsample", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("pll/fSE_antiparticle", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("pll/fSE_antiparticle_downsample", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("pll/fProtonPtVsQ3", "Q3 vs pT (proton)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); - registry.add("pll/fAntiProtonPtVsQ3", "Q3 vs pT (antiproton)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); - registry.add("pll/fLambdaPtVsQ3", "Q3 vs pT (lambda)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); - registry.add("pll/fAntiLambdaPtVsQ3", "Q3 vs pT (antilambda)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); + registry.add("PLL/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registry.add("PLL/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registry.add("PLL/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); + registry.add("PLL/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); + registry.add("PLL/fProtonPtVsQ3", "Proton p_{T}Q3 vs pT", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registry.add("PLL/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registry.add("PLL/fLambdaPtVsQ3", "Lambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registry.add("PLL/fAntiLambdaPtVsQ3", "AntiLambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); // for lll - registry.add("lll/fMultiplicity", "Multiplicity of all processed events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); - registry.add("lll/fZvtx", "Zvtx of all processed events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); - registry.add("lll/fSE_particle", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("lll/fSE_particle_downsample", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("lll/fSE_antiparticle", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("lll/fSE_antiparticle_downsample", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("lll/fLambdaPtVsQ3", "Q3 vs pT (lambda)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); - registry.add("lll/fAntiLambdaPtVsQ3", "Q3 vs pT (antilambda)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); + registry.add("LLL/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registry.add("LLL/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registry.add("LLL/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registry.add("LLL/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registry.add("LLL/fLambdaPtVsQ3", "Lambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registry.add("LLL/fAntiLambdaPtVsQ3", "AntiLambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); // for ppPhi - registry.add("ppphi/fMultiplicity", "Multiplicity of all triggered events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); - registry.add("ppphi/fZvtx", "Zvtx of all triggered events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); - registry.add("ppphi/fSE_particle", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("ppphi/fSE_particle_downsample", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("ppphi/fSE_antiparticle", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("ppphi/fSE_antiparticle_downsample", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("ppphi/fProtonPtVsQ3", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("ppphi/fPhiPtVsQ3", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("ppphi/fAntiProtonPtVsQ3", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("ppphi/fAntiPhiPtVsQ3", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); + registry.add("PPPhi/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registry.add("PPPhi/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registry.add("PPPhi/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registry.add("PPPhi/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registry.add("PPPhi/fProtonPtVsQ3", "Proton p_{T} vs Q_{3}", HistType::kTH2F, {Binning.momentum, Binning.q3}); + registry.add("PPPhi/fAntiProtonPtVsQ3", "AntiLambda p_{T} vs Q3", HistType::kTH2F, {Binning.momentum, Binning.q3}); + registry.add("PPPhi/fPhiPtVsQ3", "#phi p_{T} vs Q_{3};p_{T} (GeV/c); Q_{3} (GeV/c)", HistType::kTH2F, {Binning.momentum, Binning.q3}); + registry.add("PPPhi/fPhiInvMassVsQ3", "#phi mass vs Q_{3};M_{K^{+}K^{-}} (GeV/c^{2});Q_{3} (GeV/c)", HistType::kTH2F, {Binning.invMassPhi, Binning.q3}); // for ppRho - registry.add("ppRho/fMultiplicity", "Multiplicity of all triggered events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); - registry.add("ppRho/fZvtx", "Zvtx of all triggered events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); - registry.add("ppRho/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("ppRho/fSE_particle_downsample", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("ppRho/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("ppRho/fSE_antiparticle_downsample", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("ppRho/fProtonPtVsQ3", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("ppRho/fAntiProtonPtVsQ3", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("ppRho/fRhoCandPtVsQ3", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {{8000, 0, 8}}); + registry.add("PPRho/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registry.add("PPRho/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registry.add("PPRho/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); + registry.add("PPRho/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); + registry.add("PPRho/fProtonPtVsQ3", "Proton p_{T} vs Q3", HistType::kTH2F, {Binning.momentum, Binning.q3}); + registry.add("PPRho/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q3", HistType::kTH2F, {Binning.momentum, Binning.q3}); + registry.add("PPRho/fRhoPtVsQ3", "#rho p_{T} vs Q3;Q_{3} (GeV/c);SE", HistType::kTH2F, {Binning.momentum, Binning.q3}); + registry.add("PPRho/fRhoInvMassVsQ3", "#rho mass vs Q_{3};M_{#pi^{+}#pi^{-}} (GeV/c^{2});Q_{3} (GeV/c)", HistType::kTH2F, {Binning.invMassRho, Binning.q3}); // for pd - registry.add("pd/fMultiplicity", "Multiplicity of all processed events;Mult;Entries", HistType::kTH1F, {{500, 0, 500}}); - registry.add("pd/fZvtx", "Zvtx of all processed events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); - registry.add("pd/fSE_particle", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("pd/fSE_particle_downsample", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("pd/fSE_antiparticle", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("pd/fSE_antiparticle_downsample", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("pd/fProtonPtVskstar", "pT (proton) vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); - registry.add("pd/fAntiProtonPtVskstar", "pT (antiproton) vs k^{*};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); - registry.add("pd/fDeuteronPtVskstar", "pT (deuteron) vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); - registry.add("pd/fAntiDeuteronPtVskstar", "pT (antideuteron) vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); + registry.add("PD/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registry.add("PD/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registry.add("PD/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registry.add("PD/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registry.add("PD/fProtonPtVskstar", "Proton p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registry.add("PD/fAntiProtonPtVskstar", "AntiProton p_{T} vs k^{*};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registry.add("PD/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registry.add("PD/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); // for ld - registry.add("ld/fMultiplicity", "Multiplicity of all processed events", HistType::kTH1F, {{500, 0, 500}}); - registry.add("ld/fZvtx", "Zvtx of all processed events;Z_{vtx};Entries", HistType::kTH1F, {{500, -15, 15}}); - registry.add("ld/fSE_particle", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("ld/fSE_particle_downsample", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("ld/fSE_antiparticle", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("ld/fSE_antiparticle_downsample", "Same Event distribution;SE;Q_{3} (GeV/c)", HistType::kTH1F, {{8000, 0, 8}}); - registry.add("ld/fDeuteronPtVskstar", "pT (deuteron) vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); - registry.add("ld/fAntiDeuteronPtVskstar", "pT (antideuteron) vs k^{*};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); - registry.add("ld/fLambdaPtVskstar", "pT (lambda) vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); - registry.add("ld/fAntiLambdaPtVskstar", "pT (antilambda) vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {{150, 0, 1.5}, {500, 0, 10}}}); + registry.add("LD/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registry.add("LD/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registry.add("LD/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registry.add("LD/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registry.add("LD/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registry.add("LD/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registry.add("LD/fLambdaPtVskstar", "Lambda p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registry.add("LD/fAntiLambdaPtVskstar", "AntiLambda p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + + // for phid + registry.add("PhiD/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registry.add("PhiD/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registry.add("PhiD/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registry.add("PhiD/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registry.add("PhiD/fPhiPtVskstar", "Phi p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registry.add("PhiD/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registry.add("PhiD/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registry.add("PhiD/fPhiInvMassVskstar", "#phi mass vs k^{*};M_{K^{+}K^{-}} (GeV/c^{2});k^{*} (GeV/c)", HistType::kTH2F, {Binning.invMassRho, Binning.kstar}); + + // for rhod + registry.add("RhoD/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registry.add("RhoD/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registry.add("RhoD/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registry.add("RhoD/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registry.add("RhoD/fRhoPtVskstar", "Rho p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registry.add("RhoD/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registry.add("RhoD/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registry.add("RhoD/fRhoInvMassVskstar", "#rho mass vs k^{*};M_{#pi^{+}#pi^{-}} (GeV/c^{2});k^{*} (GeV/c)", HistType::kTH2F, {Binning.invMassRho, Binning.kstar}); } - float mMassElectron = o2::constants::physics::MassElectron; - float mMassPion = o2::constants::physics::MassPionCharged; - float mMassProton = o2::constants::physics::MassProton; - float mMassLambda = o2::constants::physics::MassLambda; - float mMassDeuteron = o2::constants::physics::MassDeuteron; - float mMassPhi = o2::constants::physics::MassPhi; - float mMassKaonPlus = o2::constants::physics::MassKPlus; - float mMassKaonMinus = o2::constants::physics::MassKMinus; - float mMassRho0 = 0.7665; // GeV/c^2 // o2::constants::physics::MassRho0; //Will not work as this is missing in the central framework, also ROOT reports the lepton production value of 0.77549 GeV/c^2, which is wrong for the hadron production at ALICE. + void initCCDB(int run) + { + if (run != mRunNumber) { + mRunNumber = run; + o2::parameters::GRPMagField* grpmag = ccdb->getForRun("GLO/Config/GRPMagField", run); + o2::base::Propagator::initFieldFromGRP(grpmag); + mBz = static_cast(grpmag->getNominalL3Field()); - int currentRunNumber = -999; - int lastRunNumber = -999; + mStraHelper.fitter.setBz(mBz); + } + if (!mStraHelper.lut) { /// done only once + ccdb->setURL(V0BuilderOpts.ccdbUrl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setFatalWhenNull(true); + auto* lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get("GLO/Param/MatLUT")); + o2::base::Propagator::Instance()->setMatLUT(lut); + mStraHelper.lut = lut; + } + } template - bool isSelectedEvent(T const& col) + bool checkEvent(T const& col) { - if (ConfEvtSelectZvtx && std::abs(col.posZ()) > ConfEvtZvtx) { + if (std::abs(col.posZ()) > EventSelection.zvtx.value) { return false; } - if (ConfEvtOfflineCheck && !col.sel8()) { + if (EventSelection.eventSel.value && !col.sel8()) { return false; } - // if event is close to the timeframe border, return false - if (ConfEvtTimeFrameBorderCheck && !col.selection_bit(aod::evsel::kNoTimeFrameBorder)) { - return false; - } - return true; } template - bool isSelectedTrack(T const& track, CFTrigger::ParticleSpecies partSpecies) + bool checkTrack(T const& track, std::string trackName) { - const auto charge = track.sign(); - const auto pT = track.pt(); - float momCorDif = track.tpcInnerParam() - track.p(); - float momCorRatio = momCorDif / track.p(); - const auto eta = track.eta(); - const auto tpcNClsF = track.tpcNClsFound(); - const auto tpcRClsC = track.tpcCrossedRowsOverFindableCls(); - const auto tpcNClsC = track.tpcNClsCrossedRows(); - const auto tpcNClsS = track.tpcNClsShared(); - const auto itsNCls = track.itsNCls(); - const auto itsNClsIB = track.itsNClsInnerBarrel(); - const auto dcaXY = track.dcaXY(); - const auto dcaZ = track.dcaZ(); - - if (charge > 0) { - if (pT < ConfPtCuts->get(partSpecies, "Pt min (particle)")) { - return false; - } - if (pT > ConfPtCuts->get(partSpecies, "Pt max (particle)")) { - return false; - } - if (ConfMomCorDifCutFlag.value && momCorDif < ConfMomCorDifCut->get(partSpecies, "Momemtum Correlation min")) { - return false; - } - if (ConfMomCorDifCutFlag.value && momCorDif > ConfMomCorDifCut->get(partSpecies, "Momemtum Correlation max")) { - return false; - } - if (ConfMomCorRatioCutFlag.value && momCorRatio < ConfMomCorRatioCut->get(partSpecies, "Momemtum Correlation min")) { - return false; - } - if (ConfMomCorRatioCutFlag.value && momCorRatio > ConfMomCorRatioCut->get(partSpecies, "Momemtum Correlation max")) { - return false; - } - } - if (charge < 0) { - if (pT < ConfPtCuts->get(partSpecies, "Pt min (antiparticle)")) { - return false; - } - if (pT > ConfPtCuts->get(partSpecies, "Pt max (antiparticle)")) { - return false; - } - if (ConfMomCorDifCutFlag.value && momCorDif < ConfMomCorDifCutAnti->get(partSpecies, "Momemtum Correlation min")) { - return false; - } - if (ConfMomCorDifCutFlag.value && momCorDif > ConfMomCorDifCutAnti->get(partSpecies, "Momemtum Correlation max")) { - return false; - } - if (ConfMomCorRatioCutFlag.value && momCorRatio < ConfMomCorRatioCutAnti->get(partSpecies, "Momemtum Correlation min")) { - return false; - } - if (ConfMomCorRatioCutFlag.value && momCorRatio > ConfMomCorRatioCutAnti->get(partSpecies, "Momemtum Correlation max")) { - return false; - } - } - - if (std::abs(eta) > ConfTrkEta) { - return false; - } - if (tpcNClsF < ConfTPCNClustersMin->get("TPCNClusMin", partSpecies)) { - return false; - } - if (tpcRClsC < ConfTrkTPCfCls) { + if (std::abs(track.eta()) > TrackSelections.trackProperties->get(trackName.c_str(), "AbsEtaMax")) { return false; } - if (tpcNClsC < ConfTrkTPCcRowsMin) { + if (track.tpcNClsFound() < TrackSelections.trackProperties->get(trackName.c_str(), "TpcClusterMin")) { return false; } - if (tpcNClsS > ConfTrkTPCsClsMax) { + if (track.tpcNClsCrossedRows() < TrackSelections.trackProperties->get(trackName.c_str(), "TpcRowMin")) { return false; } - if (itsNCls < ConfTrkITSnclsMin->get(static_cast(0), partSpecies)) { + if (track.tpcCrossedRowsOverFindableCls() < TrackSelections.trackProperties->get(trackName.c_str(), "TpcCrossedOverFoundMin")) { return false; } - if (itsNClsIB < ConfTrkITSnclsIBMin->get(static_cast(0), partSpecies)) { + if (track.tpcNClsShared() > TrackSelections.trackProperties->get(trackName.c_str(), "TpcSharedMax")) { return false; } - if (std::abs(dcaXY) > ConfTrkDCAxyMax) { + if (track.tpcFractionSharedCls() > TrackSelections.trackProperties->get(trackName.c_str(), "TpcFracSharedMax")) { return false; } - if (std::abs(dcaZ) > ConfTrkDCAzMax) { + if (track.itsNCls() < TrackSelections.trackProperties->get(trackName.c_str(), "ItsClusterMin")) { return false; } - // TODO: which dca, put dcaxy for now - if (ConfRejectNotPropagatedTracks && std::abs(dcaXY) > 1e3) { + if (track.itsNClsInnerBarrel() < TrackSelections.trackProperties->get(trackName.c_str(), "ItsIbClusterMin")) { return false; } - if (ConfTrkRequireChi2MaxTPC && track.tpcChi2NCl() >= ConfTrkMaxChi2PerClusterTPC) { + if (std::abs(track.dcaXY()) > TrackSelections.trackProperties->get(trackName.c_str(), "AbsDcaXyMax")) { return false; } - if (ConfTrkRequireChi2MaxITS && track.itsChi2NCl() >= ConfTrkMaxChi2PerClusterITS) { + if (std::abs(track.dcaZ()) > TrackSelections.trackProperties->get(trackName.c_str(), "AbsDcaZMax")) { return false; } - if (ConfTrkTPCRefit && !track.hasTPC()) { + if (track.tpcChi2NCl() > TrackSelections.trackProperties->get(trackName.c_str(), "Chi2TpcMax")) { return false; } - if (ConfTrkITSRefit && !track.hasITS()) { + if (track.itsChi2NCl() > TrackSelections.trackProperties->get(trackName.c_str(), "Chi2ItsMax")) { return false; } return true; } - template - bool isSelectedV0Daughter(T const& track, V const& v0, float charge, CFTrigger::V0Daughters species, double nSigmaTPCDaug[2]) + template + bool checkTrackPid(T const& track, std::string trackName) { - const auto tpcNClsF = track.tpcNClsFound(); - float eta = -1; - float dca = -1; - if (charge > 0) { - eta = v0.positiveeta(); - dca = v0.dcapostopv(); - } else if (charge < 0) { - eta = v0.negativeeta(); - dca = v0.dcanegtopv(); - } - const auto sign = track.sign(); - double nSigmaTPC = -999.f; + float momentum = -99; - if (charge < 0 && sign > 0) { - return false; - } - if (charge > 0 && sign < 0) { - return false; - } - if (std::abs(eta) > ConfDaughEta) { - return false; - } - if (tpcNClsF < ConfDaughTPCnclsMin) { - return false; - } - if (std::abs(dca) < ConfDaughDCAMin) { - return false; - } - - switch (species) { - case CFTrigger::kDaughPion: - nSigmaTPC = nSigmaTPCDaug[1]; - break; - case CFTrigger::kDaughProton: - nSigmaTPC = nSigmaTPCDaug[0]; - break; - default: - LOG(fatal) << "Particle species for V0 daughters not found"; - } - - if (nSigmaTPC < ConfDaughPIDCuts->get(species, "TPC min") || - nSigmaTPC > ConfDaughPIDCuts->get(species, "TPC max")) { - return false; + if (TrackSelections.momentum->get(trackName.c_str(), "UseInnerParam") < 0) { + momentum = track.p(); + } else { + momentum = track.tpcInnerParam(); } - return true; - } - template - bool isSelectedTrackPID(T const& track, CFTrigger::ParticleSpecies partSpecies, bool Rejection, double nSigmaTPC[2], int charge) - { - // nSigma should have entries [proton, deuteron, pion] - bool isSelected = false; - bool pThres = true; - float nSigma = -999.; - float nSigmaIts = -999.; - - // check tracking PID - uint8_t SpeciesForTracking = 0; - if (partSpecies == CFTrigger::kProton) { - SpeciesForTracking = o2::track::PID::Proton; - } else if (partSpecies == CFTrigger::kDeuteron) { - SpeciesForTracking = o2::track::PID::Deuteron; - } else if (partSpecies == CFTrigger::kPion) { - SpeciesForTracking = o2::track::PID::Pion; + float nsigmaITS = -99; + float nsigmaTPC = -99; + float nsigmaTPCTOF = -99; + + if (trackName == std::string("Pion")) { + nsigmaITS = track.itsNSigmaPi(); + nsigmaTPC = track.tpcNSigmaPi(); + nsigmaTPCTOF = RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPi(), track.tofNSigmaPi()); + } else if (trackName == std::string("Kaon")) { + nsigmaITS = track.itsNSigmaKa(); + nsigmaTPC = track.tpcNSigmaKa(); + nsigmaTPCTOF = RecoDecay::sqrtSumOfSquares(track.tpcNSigmaKa(), track.tofNSigmaKa()); + } else if (trackName == std::string("Proton")) { + nsigmaITS = track.itsNSigmaPr(); + nsigmaTPC = track.tpcNSigmaPr(); + nsigmaTPCTOF = RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPr(), track.tofNSigmaPr()); + } else if (trackName == std::string("Deuteron")) { + nsigmaITS = track.itsNSigmaDe(); + nsigmaTPC = track.tpcNSigmaDe(); + nsigmaTPCTOF = RecoDecay::sqrtSumOfSquares(track.tpcNSigmaDe(), track.tofNSigmaDe()); } else { - LOG(warn) << "Unknown PID for tracking encountered"; + LOG(fatal) << "Unsupported track type"; } - if (ConfPIDForTracking->get(partSpecies, "Switch") > 0 && track.tpcInnerParam() < ConfPIDForTracking->get(partSpecies, "Momemtum Threshold")) { - if (track.pidForTracking() != SpeciesForTracking) { + if (momentum < TrackSelections.momentum->get(trackName.c_str(), "PThres")) { + if (nsigmaITS < TrackSelections.pid->get(trackName.c_str(), "ItsMin") || nsigmaITS > TrackSelections.pid->get(trackName.c_str(), "ItsMax")) { return false; } - } - - // check momentum threshold - if (track.tpcInnerParam() <= ConfPtCuts->get(partSpecies, "P thres")) { - pThres = true; - } else { - pThres = false; - } - if (CFTrigger::kDeuteron == partSpecies && ConfDeuteronThPVMom) { - if (track.p() <= ConfPtCuts->get(partSpecies, "P thres")) { - pThres = true; - } else { - pThres = false; - } - } - // compute nsigma - switch (partSpecies) { - case CFTrigger::kProton: - nSigmaIts = track.itsNSigmaPr(); - if (pThres) { - nSigma = nSigmaTPC[0]; - } else { - if (charge > 0) { - nSigma = std::sqrt(std::pow(nSigmaTPC[0] - TPCTOFAvg[0], 2) + std::pow(track.tofNSigmaPr() - TPCTOFAvg[1], 2)); - } else { - nSigma = std::sqrt(std::pow(nSigmaTPC[0] - TPCTOFAvg[2], 2) + std::pow(track.tofNSigmaPr() - TPCTOFAvg[3], 2)); - } - } - break; - case CFTrigger::kDeuteron: - nSigmaIts = track.itsNSigmaDe(); - if (pThres) { - nSigma = nSigmaTPC[1]; - } else { - if (charge > 0) { - nSigma = std::sqrt(std::pow(nSigmaTPC[1] - TPCTOFAvg[4], 2) + std::pow(track.tofNSigmaDe() - TPCTOFAvg[5], 2)); - } else { - nSigma = std::sqrt(std::pow(nSigmaTPC[1] - TPCTOFAvg[6], 2) + std::pow(track.tofNSigmaDe() - TPCTOFAvg[7], 2)); - } - } - break; - case CFTrigger::kLambda: - LOG(fatal) << "No PID selection for Lambdas"; - break; - case CFTrigger::kPion: - nSigmaIts = track.itsNSigmaPi(); - if (pThres) { - nSigma = nSigmaTPC[2]; - } else { - if (charge > 0) { - nSigma = std::sqrt(std::pow(nSigmaTPC[2] - TPCTOFAvg[8], 2) + std::pow(track.tofNSigmaPr() - TPCTOFAvg[9], 2)); - } else { - nSigma = std::sqrt(std::pow(nSigmaTPC[2] - TPCTOFAvg[10], 2) + std::pow(track.tofNSigmaPr() - TPCTOFAvg[11], 2)); - } - } - break; - default: - LOG(fatal) << "Particle species not known"; - } - // check if track is selected - - auto TPCmin = (charge > 0) ? ConfPIDCuts->get(partSpecies, CFTrigger::kTPCMin) - : ConfPIDCutsAnti->get(partSpecies, CFTrigger::kTPCMin); - - auto TPCmax = (charge > 0) ? ConfPIDCuts->get(partSpecies, CFTrigger::kTPCMax) - : ConfPIDCutsAnti->get(partSpecies, CFTrigger::kTPCMax); - - auto TPCTOFmax = (charge > 0) ? ConfPIDCuts->get(partSpecies, CFTrigger::kTPCTOF) - : ConfPIDCutsAnti->get(partSpecies, CFTrigger::kTPCTOF); - - auto ITSmin = (charge > 0) ? ConfPIDCuts->get(partSpecies, CFTrigger::kITSmin) - : ConfPIDCutsAnti->get(partSpecies, CFTrigger::kITSmin); - - auto ITSmax = (charge < 0) ? ConfPIDCuts->get(partSpecies, CFTrigger::kITSmax) - : ConfPIDCutsAnti->get(partSpecies, CFTrigger::kITSmax); - - if (pThres) { - if (nSigma > TPCmin && - nSigma < TPCmax && - nSigmaIts > ITSmin && - nSigmaIts < ITSmax) { - isSelected = true; + if (nsigmaTPC < TrackSelections.pid->get(trackName.c_str(), "TpcMin") || nsigmaTPC > TrackSelections.pid->get(trackName.c_str(), "TpcMax")) { + return false; } } else { - if (nSigma < TPCTOFmax) { - isSelected = true; - } - } - // for deuterons normally, we want to reject tracks that have a high - // probablilty of being another particle - if (Rejection) { - double nSigmaPi = track.tpcNSigmaPi(); - double nSigmaEl = track.tpcNSigmaEl(); - if (ConfUseManualPIDpion) { - auto bgScalingPion = 1 / mMassPion; // momentum scaling? - if (BBPion.size() == 6 && charge > 0) - nSigmaPi = updatePID(track, bgScalingPion, BBPion); - if (BBAntipion.size() == 6 && charge < 0) - nSigmaPi = updatePID(track, bgScalingPion, BBAntipion); - } - if (ConfUseManualPIDel) { - auto bgScalingElectron = 1 / mMassElectron; // momentum scaling? - if (BBElectron.size() == 6 && charge < 0) - nSigmaEl = updatePID(track, bgScalingElectron, BBElectron); - if (BBAntielectron.size() == 6 && charge > 0) - nSigmaEl = updatePID(track, bgScalingElectron, BBAntielectron); - } - if ((ConfPIDRejection->get(CFTrigger::kRejProton, CFTrigger::kTPCMin) < nSigmaTPC[0] && - ConfPIDRejection->get(CFTrigger::kRejProton, CFTrigger::kTPCMax) > nSigmaTPC[0]) || - (ConfPIDRejection->get(CFTrigger::kRejPion, CFTrigger::kTPCMin) < nSigmaPi && - ConfPIDRejection->get(CFTrigger::kRejPion, CFTrigger::kTPCMax) > nSigmaPi) || - (ConfPIDRejection->get(CFTrigger::kRejElectron, CFTrigger::kTPCMin) < nSigmaEl && - ConfPIDRejection->get(CFTrigger::kRejElectron, CFTrigger::kTPCMax) > nSigmaEl)) { + if (nsigmaTPCTOF > TrackSelections.pid->get(trackName.c_str(), "TpcTofMax")) { return false; } } - return isSelected; + return true; } - template - bool isSelectedMinimalV0(C const& /*col*/, V const& v0, T const& posTrack, - T const& negTrack, float charge, double nSigmaTPCPos[2], double nSigmaTPCNeg[2]) + bool checkLambda(float lambdaPt, float lambdaDauDca, float lambdaCpa, float lambdaRadius, float lambdaPos, float kaonMass, float lambdaMass) { - const auto signPos = posTrack.sign(); - const auto signNeg = negTrack.sign(); - if (signPos < 0 || signNeg > 0) { - LOG(info) << "Something wrong in isSelectedMinimal"; - LOG(info) << "ERROR - Wrong sign for V0 daughters"; - } - const float pT = v0.pt(); - const std::vector decVtx = {v0.x(), v0.y(), v0.z()}; - const float tranRad = v0.v0radius(); - const float dcaDaughv0 = v0.dcaV0daughters(); - const float cpav0 = v0.v0cosPA(); - - const float invMassLambda = v0.mLambda(); - const float invMassAntiLambda = v0.mAntiLambda(); - - if (charge > 0 && (invMassLambda < ConfV0InvMassLowLimit || invMassLambda > ConfV0InvMassUpLimit)) { - return false; - } - if (charge < 0 && (invMassAntiLambda < ConfV0InvMassLowLimit || invMassAntiLambda > ConfV0InvMassUpLimit)) { + if (lambdaPt < LambdaSelections.ptMin) { return false; } - if (ConfV0RejectKaons) { - const float invMassKaon = v0.mK0Short(); - if (invMassKaon > ConfV0InvKaonMassLowLimit && invMassKaon < ConfV0InvKaonMassUpLimit) { - return false; - } - } - if (pT < ConfV0PtMin) { + if (lambdaDauDca > LambdaSelections.dcaDaughMax) { return false; } - if (dcaDaughv0 > ConfV0DCADaughMax) { + if (lambdaCpa < LambdaSelections.cpaMin) { return false; } - if (cpav0 < ConfV0CPAMin) { + if (lambdaRadius < LambdaSelections.tranRadMin) { return false; } - if (tranRad < ConfV0TranRadV0Min) { + if (lambdaRadius > LambdaSelections.tranRadMax) { return false; } - if (tranRad > ConfV0TranRadV0Max) { + if (lambdaPos > LambdaSelections.decVtxMax) { return false; } - for (size_t i = 0; i < decVtx.size(); i++) { - if (decVtx.at(i) > ConfV0DecVtxMax) { + if (LambdaSelections.rejectKaons) { + if (kaonMass > LambdaSelections.invKaonMassLow && kaonMass < LambdaSelections.invKaonMassUp) { return false; } } - if (charge > 0) { - if (!isSelectedV0Daughter(posTrack, v0, 1, CFTrigger::kDaughProton, nSigmaTPCPos)) { - return false; - } - if (!isSelectedV0Daughter(negTrack, v0, -1, CFTrigger::kDaughPion, nSigmaTPCNeg)) { - return false; - } + if (lambdaMass < LambdaSelections.invMassLow) { + return false; } - if (charge < 0) { - if (!isSelectedV0Daughter(posTrack, v0, 1, CFTrigger::kDaughPion, nSigmaTPCPos)) { - return false; - } - if (!isSelectedV0Daughter(negTrack, v0, -1, CFTrigger::kDaughProton, nSigmaTPCNeg)) { - return false; - } + if (lambdaMass > LambdaSelections.invMassUp) { + return false; } return true; } template - bool isSelectedTrackKaon(T const& track) + bool checkLambdaDaughter(T const& track, float eta, float dca, float nSigmaTPC) { - bool isSelected = false; - if (track.pt() <= PPPhi.ConfTrkPtKaUp.value && track.pt() >= PPPhi.ConfTrkPtKaDown.value && std::abs(track.eta()) <= PPPhi.ConfTrkEtaKa.value && std::abs(track.dcaXY()) <= PPPhi.ConfTrkDCAxyKa.value && std::abs(track.dcaZ()) <= PPPhi.ConfTrkDCAzKa.value && track.tpcNClsCrossedRows() >= PPPhi.ConfNCrossedKa.value && track.tpcNClsFound() >= PPPhi.ConfNClusKa.value && track.tpcCrossedRowsOverFindableCls() >= PPPhi.ConfTrkTPCfClsKa.value) { - if (track.tpcInnerParam() < PPPhi.ConfTrkPTPCKaThr.value && std::abs(track.tpcNSigmaKa()) <= PPPhi.ConfTrkKaSigmaPID.value) { - isSelected = true; - } - if (track.tpcInnerParam() >= PPPhi.ConfTrkPTPCKaThr.value && std::abs(std::sqrt(track.tpcNSigmaKa() * track.tpcNSigmaKa() + track.tofNSigmaKa() * track.tofNSigmaKa())) <= PPPhi.ConfTrkKaSigmaPID.value) { - isSelected = true; - } + if (std::abs(eta) > LambdaDaughterSelections.absEtaMax.value) { + return false; } - return isSelected; - } - - double translatePhi(double phi) - { - if (phi < 0) { - phi += 2 * M_PI; // Add 2 pi to make it positive + if (std::abs(dca) < LambdaDaughterSelections.dcaMin.value) { + return false; } - return phi; + if (track.tpcNClsFound() < LambdaDaughterSelections.tpcClusterMin.value) { + return false; + } + if (std::abs(nSigmaTPC) > LambdaDaughterSelections.tpcMax.value) { + return false; + } + return true; } float getkstar(const ROOT::Math::PtEtaPhiMVector part1, @@ -1453,18 +1055,18 @@ struct CFFilter { const float betay = beta * std::sin(trackSum.Phi()) * std::sin(trackSum.Theta()); const float betaz = beta * std::cos(trackSum.Theta()); - ROOT::Math::PxPyPzMVector PartOneCMS(part1); - ROOT::Math::PxPyPzMVector PartTwoCMS(part2); + ROOT::Math::PxPyPzMVector partOneCMS(part1); + ROOT::Math::PxPyPzMVector partTwoCMS(part2); const ROOT::Math::Boost boostPRF = ROOT::Math::Boost(-betax, -betay, -betaz); - PartOneCMS = boostPRF(PartOneCMS); - PartTwoCMS = boostPRF(PartTwoCMS); - const ROOT::Math::PxPyPzMVector trackRelK = PartOneCMS - PartTwoCMS; + partOneCMS = boostPRF(partOneCMS); + partTwoCMS = boostPRF(partTwoCMS); + const ROOT::Math::PxPyPzMVector trackRelK = partOneCMS - partTwoCMS; return 0.5 * trackRelK.P(); } - ROOT::Math::PxPyPzEVector getqij(const ROOT::Math::PtEtaPhiMVector parti, - const ROOT::Math::PtEtaPhiMVector partj) + ROOT::Math::PxPyPzEVector + getqij(const ROOT::Math::PtEtaPhiMVector parti, const ROOT::Math::PtEtaPhiMVector partj) { ROOT::Math::PxPyPzEVector vecparti(parti); ROOT::Math::PxPyPzEVector vecpartj(partj); @@ -1473,1137 +1075,1120 @@ struct CFFilter { float scaling = trackDifference.Dot(trackSum) / trackSum.Dot(trackSum); return trackDifference - scaling * trackSum; } - float getQ3(const ROOT::Math::PtEtaPhiMVector part1, - const ROOT::Math::PtEtaPhiMVector part2, - const ROOT::Math::PtEtaPhiMVector part3) + float getQ3(const ROOT::Math::PtEtaPhiMVector part1, const ROOT::Math::PtEtaPhiMVector part2, const ROOT::Math::PtEtaPhiMVector part3) { ROOT::Math::PxPyPzEVector q12 = getqij(part1, part2); ROOT::Math::PxPyPzEVector q23 = getqij(part2, part3); ROOT::Math::PxPyPzEVector q31 = getqij(part3, part1); - float Q32 = q12.M2() + q23.M2() + q31.M2(); - return sqrt(-Q32); - } - - std::vector setValuesBB(aod::BCsWithTimestamps::iterator const& bunchCrossing, const std::string ccdbPath) - { - map metadata; - auto h = ccdbApi.retrieveFromTFileAny(ccdbPath, metadata, bunchCrossing.timestamp()); - // auto h = ccdb->getForTimeStamp(ccdbPath, bunchCrossing.timestamp()); //check if possible to use this without getting fatal - if (!h) { - std::vector dummy; - LOG(info) << "File from CCDB in path " << ccdbPath << " was not found for run " << bunchCrossing.runNumber() << ". Will use default PID task values!"; - return dummy; - } - LOG(info) << "File from CCDB in path " << ccdbPath << " was found for run " << bunchCrossing.runNumber() << "!"; - - TAxis* axis = h->GetXaxis(); - std::vector v{static_cast(h->GetBinContent(axis->FindBin("bb1"))), - static_cast(h->GetBinContent(axis->FindBin("bb2"))), - static_cast(h->GetBinContent(axis->FindBin("bb3"))), - static_cast(h->GetBinContent(axis->FindBin("bb4"))), - static_cast(h->GetBinContent(axis->FindBin("bb5"))), - static_cast(h->GetBinContent(axis->FindBin("Resolution")))}; - return v; - } - - std::vector setValuesAvg(aod::BCsWithTimestamps::iterator const& bunchCrossing, const std::string ccdbPath) - { - map metadata; - auto h = ccdbApi.retrieveFromTFileAny(ccdbPath, metadata, bunchCrossing.timestamp()); - // auto h = ccdb->getForTimeStamp(ccdbPath, bunchCrossing.timestamp()); //check if possible to use this without getting fatal - if (!h) { - std::vector dummy{ConfPIDTPCTOFAvg->get("Proton", "TPC Avg"), - ConfPIDTPCTOFAvg->get("Proton", "TOF Avg"), - ConfPIDTPCTOFAvg->get("AntiProton", "TPC Avg"), - ConfPIDTPCTOFAvg->get("AntiProton", "TOF Avg"), - ConfPIDTPCTOFAvg->get("Deuteron", "TPC Avg"), - ConfPIDTPCTOFAvg->get("Deuteron", "TOF Avg"), - ConfPIDTPCTOFAvg->get("AntiDeuteron", "TPC Avg"), - ConfPIDTPCTOFAvg->get("AntiDeuteron", "TOF Avg")}; - LOG(info) << "File from CCDB in path " << ccdbPath << " was not found for run " << bunchCrossing.runNumber() << ". Will use constant values from ConfPIDTPCTOFAvg!"; - return dummy; - } - LOG(info) << "File from CCDB in path " << ccdbPath << " was found for run " << bunchCrossing.runNumber() << "!"; - - TAxis* axis = h->GetXaxis(); - std::vector v{static_cast(h->GetBinContent(axis->FindBin("TPCProton"))), - static_cast(h->GetBinContent(axis->FindBin("TOFProton"))), - static_cast(h->GetBinContent(axis->FindBin("TPCAntiproton"))), - static_cast(h->GetBinContent(axis->FindBin("TOFAntiproton"))), - static_cast(h->GetBinContent(axis->FindBin("TPCDeuteron"))), - static_cast(h->GetBinContent(axis->FindBin("TOFDeuteron"))), - static_cast(h->GetBinContent(axis->FindBin("TPCAntideuteron"))), - static_cast(h->GetBinContent(axis->FindBin("TOFAntideuteron")))}; - return v; + float q32 = q12.M2() + q23.M2() + q31.M2(); + return std::sqrt(-q32); } template - double updatePID(T const& track, double bgScaling, std::vector BB) + float itsSignal(T const& track) { - double expBethe = tpc::BetheBlochAleph(static_cast(track.tpcInnerParam() * bgScaling), BB[0], BB[1], BB[2], BB[3], BB[4]); - double expSigma = expBethe * BB[5]; - return static_cast((track.tpcSignal() - expBethe) / expSigma); - } - - void process(aod::FemtoFullCollision const& col, aod::BCsWithTimestamps const&, aod::FemtoFullTracks const& tracks, o2::aod::V0Datas const& fullV0s) + uint32_t clsizeflag = track.itsClusterSizes(); + auto clSizeLayer0 = (clsizeflag >> (0 * 4)) & 0xf; + auto clSizeLayer1 = (clsizeflag >> (1 * 4)) & 0xf; + auto clSizeLayer2 = (clsizeflag >> (2 * 4)) & 0xf; + auto clSizeLayer3 = (clsizeflag >> (3 * 4)) & 0xf; + auto clSizeLayer4 = (clsizeflag >> (4 * 4)) & 0xf; + auto clSizeLayer5 = (clsizeflag >> (5 * 4)) & 0xf; + auto clSizeLayer6 = (clsizeflag >> (6 * 4)) & 0xf; + int numLayers = 7; + int sumClusterSizes = clSizeLayer1 + clSizeLayer2 + clSizeLayer3 + clSizeLayer4 + clSizeLayer5 + clSizeLayer6 + clSizeLayer0; + float cosLamnda = 1. / std::cosh(track.eta()); + return (static_cast(sumClusterSizes) / numLayers) * cosLamnda; + }; + + void process(cf_trigger::FullCollision const& col, aod::BCs const&, cf_trigger::FullTracks const& tracks, o2::aod::V0s const& v0s) { - if (!ConfIsRun3) { - LOG(fatal) << "Run 2 processing is not implemented!"; - } - - if (ConfUseManualPIDproton || ConfUseManualPIDdeuteron || ConfUseAvgFromCCDB) { - currentRunNumber = col.bc_as().runNumber(); - if (currentRunNumber != lastRunNumber) { - auto bc = col.bc_as(); - if (ConfUseManualPIDproton || ConfUseManualPIDdaughterProton) { - BBProton = setValuesBB(bc, ConfPIDBBProton); - BBAntiproton = setValuesBB(bc, ConfPIDBBAntiProton); - } - if (ConfUseManualPIDdeuteron) { - BBDeuteron = setValuesBB(bc, ConfPIDBBDeuteron); - BBAntideuteron = setValuesBB(bc, ConfPIDBBAntiDeuteron); - } - if (ConfUseManualPIDpion || ConfUseManualPIDdaughterPion) { - BBPion = setValuesBB(bc, ConfPIDBBPion); - BBAntipion = setValuesBB(bc, ConfPIDBBAntiPion); - } - if (ConfUseManualPIDpion) { - BBElectron = setValuesBB(bc, ConfPIDBBElectron); - BBAntielectron = setValuesBB(bc, ConfPIDBBAntiElectron); - } - if (ConfUseAvgFromCCDB) { - TPCTOFAvg = setValuesAvg(bc, ConfAvgPath); - } - lastRunNumber = currentRunNumber; - } - } - - auto tracksWithItsPid = soa::Attach(tracks); + auto tracksWithItsPid = soa::Attach(tracks); registry.fill(HIST("fProcessedEvents"), 0); - registry.fill(HIST("EventCuts/fMultiplicityBefore"), col.multNTracksPV()); - registry.fill(HIST("EventCuts/fZvtxBefore"), col.posZ()); + registry.fill(HIST("EventQA/Before/fMultiplicity"), col.multNTracksPV()); + registry.fill(HIST("EventQA/Before/fZvtx"), col.posZ()); - bool keepEvent3N[CFTrigger::kNThreeBodyTriggers] = {false, false, false, false, false, false}; - int lowQ3Triplets[CFTrigger::kNThreeBodyTriggers] = {0, 0, 0, 0, 0, 0}; - - bool keepEvent2N[CFTrigger::kNTwoBodyTriggers] = {false, false}; - int lowKstarPairs[CFTrigger::kNTwoBodyTriggers] = {0, 0}; - - if (isSelectedEvent(col)) { - - registry.fill(HIST("EventCuts/fMultiplicityAfter"), col.multNTracksPV()); - registry.fill(HIST("EventCuts/fZvtxAfter"), col.posZ()); - - // keep track of proton indices - std::vector ProtonIndex = {}; - std::vector AntiProtonIndex = {}; - - // Prepare vectors for different species - std::vector protons, antiprotons, deuterons, antideuterons, lambdas, antilambdas, kaons, antikaons, phi, pions, antipions, rho; - - // create deuteron and proton vectors (and corresponding antiparticles) for pair and triplet creation - for (auto& track : tracksWithItsPid) { - - double nTPCSigmaP[3]{track.tpcNSigmaPr(), track.tpcNSigmaDe(), track.tpcNSigmaPi()}; - double nTPCSigmaN[3]{track.tpcNSigmaPr(), track.tpcNSigmaDe(), track.tpcNSigmaPi()}; + if (!checkEvent(col)) { + return; + } - if (ConfUseManualPIDproton) { - auto bgScalingProton = 1 / mMassProton; // momentum scaling? - if (BBProton.size() == 6) - nTPCSigmaP[0] = updatePID(track, bgScalingProton, BBProton); - if (BBAntiproton.size() == 6) - nTPCSigmaN[0] = updatePID(track, bgScalingProton, BBAntiproton); - } - if (ConfUseManualPIDdeuteron) { - auto bgScalingDeuteron = 1 / mMassDeuteron; // momentum scaling? - if (BBDeuteron.size() == 6) - nTPCSigmaP[1] = updatePID(track, bgScalingDeuteron, BBDeuteron); - if (BBAntideuteron.size() == 6) - nTPCSigmaN[1] = updatePID(track, bgScalingDeuteron, BBAntideuteron); + registry.fill(HIST("EventQA/After/fMultiplicity"), col.multNTracksPV()); + registry.fill(HIST("EventQA/After/fZvtx"), col.posZ()); + + initCCDB(col.bc().runNumber()); + + // clear particle vectors + vecProton.clear(); + vecAntiProton.clear(); + vecDeuteron.clear(); + vecAntiDeuteron.clear(); + vecLambda.clear(); + vecAntiLambda.clear(); + vecKaon.clear(); + vecAntiKaon.clear(); + vecPhi.clear(); + vecPion.clear(); + vecAntiPion.clear(); + vecRho.clear(); + // clear index vectors for all particles + idxProton.clear(); + idxAntiProton.clear(); + idxDeuteron.clear(); + idxAntiDeuteron.clear(); + idxKaon.clear(); + idxAntiKaon.clear(); + idxPion.clear(); + idxAntiPion.clear(); + // clear index vectors for daughters + idxLambdaDaughProton.clear(); + idxLambdaDaughPion.clear(); + idxAntiLambdaDaughProton.clear(); + idxAntiLambdaDaughPion.clear(); + idxPhiDaughPos.clear(); + idxPhiDaughNeg.clear(); + idxRhoDaughPos.clear(); + idxRhoDaughNeg.clear(); + + for (auto const& track : tracksWithItsPid) { + + // get paritcles + if (track.sign() > 0) { + registry.fill(HIST("TrackQA/Before/Particle/fPt"), track.pt()); + registry.fill(HIST("TrackQA/Before/Particle/fEta"), track.eta()); + registry.fill(HIST("TrackQA/Before/Particle/fPhi"), track.phi()); + registry.fill(HIST("TrackQA/Before/Particle/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + registry.fill(HIST("TrackQA/Before/Particle/fItsSignal"), track.p(), itsSignal(track)); + registry.fill(HIST("TrackQA/Before/Particle/fTpcSignal"), track.p(), track.tpcSignal()); + registry.fill(HIST("TrackQA/Before/Particle/fTofSignal"), track.p(), track.beta()); + + registry.fill(HIST("TrackQA/Before/Pion/fNsigmaITS"), track.p(), track.itsNSigmaPi()); + registry.fill(HIST("TrackQA/Before/Pion/fNsigmaTPC"), track.p(), track.tpcNSigmaPi()); + registry.fill(HIST("TrackQA/Before/Pion/fNsigmaTOF"), track.p(), track.tofNSigmaPi()); + registry.fill(HIST("TrackQA/Before/Pion/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPi(), track.tofNSigmaPi())); + + registry.fill(HIST("TrackQA/Before/Kaon/fNsigmaITS"), track.p(), track.itsNSigmaKa()); + registry.fill(HIST("TrackQA/Before/Kaon/fNsigmaTPC"), track.p(), track.tpcNSigmaKa()); + registry.fill(HIST("TrackQA/Before/Kaon/fNsigmaTOF"), track.p(), track.tofNSigmaKa()); + registry.fill(HIST("TrackQA/Before/Kaon/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaKa(), track.tofNSigmaKa())); + + registry.fill(HIST("TrackQA/Before/Proton/fNsigmaITS"), track.p(), track.itsNSigmaPr()); + registry.fill(HIST("TrackQA/Before/Proton/fNsigmaTPC"), track.p(), track.tpcNSigmaPr()); + registry.fill(HIST("TrackQA/Before/Proton/fNsigmaTOF"), track.p(), track.tofNSigmaPr()); + registry.fill(HIST("TrackQA/Before/Proton/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPr(), track.tofNSigmaPr())); + + registry.fill(HIST("TrackQA/Before/Deuteron/fNsigmaITS"), track.p(), track.itsNSigmaDe()); + registry.fill(HIST("TrackQA/Before/Deuteron/fNsigmaTPC"), track.p(), track.tpcNSigmaDe()); + registry.fill(HIST("TrackQA/Before/Deuteron/fNsigmaTOF"), track.p(), track.tofNSigmaDe()); + registry.fill(HIST("TrackQA/Before/Deuteron/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaDe(), track.tofNSigmaDe())); + + if (checkTrack(track, std::string("Pion")) && checkTrackPid(track, std::string("Pion"))) { + vecPion.emplace_back(track.pt(), track.eta(), track.phi(), o2::constants::physics::MassPionCharged); + idxPion.push_back(track.globalIndex()); + + registry.fill(HIST("TrackQA/After/Pion/fPt"), track.pt()); + registry.fill(HIST("TrackQA/After/Pion/fPTpc"), track.tpcInnerParam()); + registry.fill(HIST("TrackQA/After/Pion/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + registry.fill(HIST("TrackQA/After/Pion/fEta"), track.eta()); + registry.fill(HIST("TrackQA/After/Pion/fPhi"), track.phi()); + + registry.fill(HIST("TrackQA/After/Pion/fNsigmaIts"), track.p(), track.itsNSigmaPi()); + registry.fill(HIST("TrackQA/After/Pion/fNsigmaTpc"), track.p(), track.tpcNSigmaPi()); + registry.fill(HIST("TrackQA/After/Pion/fNsigmaTof"), track.p(), track.tofNSigmaPi()); + registry.fill(HIST("TrackQA/After/Pion/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPi(), track.tofNSigmaPi())); + + registry.fill(HIST("TrackQA/After/Pion/fItsSignal"), track.p(), itsSignal(track)); + registry.fill(HIST("TrackQA/After/Pion/fTpcSignal"), track.p(), track.tpcSignal()); + registry.fill(HIST("TrackQA/After/Pion/fTofBeta"), track.p(), track.beta()); + + registry.fill(HIST("TrackQA/After/Pion/fDcaXy"), track.pt(), track.dcaXY()); + registry.fill(HIST("TrackQA/After/Pion/fDcaZ"), track.pt(), track.dcaZ()); + + registry.fill(HIST("TrackQA/After/Pion/fTpcClusters"), track.tpcNClsFound()); + registry.fill(HIST("TrackQA/After/Pion/fTpcCrossedRows"), track.tpcNClsCrossedRows()); + registry.fill(HIST("TrackQA/After/Pion/fTpcSharedClusters"), track.tpcNClsShared()); + registry.fill(HIST("TrackQA/After/Pion/fTpcSharedClusterOverClusterss"), track.tpcFractionSharedCls()); + registry.fill(HIST("TrackQA/After/Pion/fTpcFindableOverRows"), track.tpcCrossedRowsOverFindableCls()); + registry.fill(HIST("TrackQA/After/Pion/fTpcChi2OverCluster"), track.tpcChi2NCl()); + + registry.fill(HIST("TrackQA/After/Pion/fItsClusters"), track.itsNCls()); + registry.fill(HIST("TrackQA/After/Pion/fItsIbClusters"), track.itsNClsInnerBarrel()); + registry.fill(HIST("TrackQA/After/Pion/fItsChi2OverCluster"), track.itsChi2NCl()); } - registry.fill(HIST("TrackCuts/TracksBefore/fPtTrackBefore"), track.pt()); - registry.fill(HIST("TrackCuts/TracksBefore/fEtaTrackBefore"), track.eta()); - registry.fill(HIST("TrackCuts/TracksBefore/fPhiTrackBefore"), track.phi()); - - if (track.sign() > 0) { - // Fill PID info - registry.fill(HIST("TrackCuts/TPCSignal/fTPCSignal"), track.tpcInnerParam(), track.tpcSignal()); - registry.fill(HIST("TrackCuts/TPCSignal/fTPCSignalP"), track.p(), track.tpcSignal()); - if (isSelectedTrack(track, CFTrigger::kProton)) { - registry.fill(HIST("TrackCuts/TPCSignal/fTPCSignalALLCUTS"), track.tpcInnerParam(), track.tpcSignal()); - registry.fill(HIST("TrackCuts/TPCSignal/fTPCSignalALLCUTSP"), track.p(), track.tpcSignal()); - registry.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationAfterCutsPos"), track.p(), track.tpcInnerParam()); - } - registry.fill(HIST("TrackCuts/NSigmaBefore/fNsigmaTPCvsPProtonBefore"), track.tpcInnerParam(), nTPCSigmaP[0]); - registry.fill(HIST("TrackCuts/NSigmaBefore/fNsigmaTOFvsPProtonBefore"), track.tpcInnerParam(), track.tofNSigmaPr()); - registry.fill(HIST("TrackCuts/NSigmaBefore/fNsigmaTPCTOFvsPProtonBefore"), track.tpcInnerParam(), std::sqrt(std::pow(nTPCSigmaP[0] - TPCTOFAvg[0], 2) + std::pow(track.tofNSigmaPr() - TPCTOFAvg[1], 2))); - registry.fill(HIST("TrackCuts/NSigmaBefore/fNsigmaITSvsPProtonBefore"), track.p(), track.itsNSigmaPr()); - registry.fill(HIST("TrackCuts/NSigmaBefore/fNsigmaTPCvsPDeuteronBefore"), track.tpcInnerParam(), nTPCSigmaP[1]); - registry.fill(HIST("TrackCuts/NSigmaBefore/fNsigmaTOFvsPDeuteronBefore"), track.tpcInnerParam(), track.tofNSigmaDe()); - registry.fill(HIST("TrackCuts/NSigmaBefore/fNsigmaTPCTOFvsPDeuteronBefore"), track.tpcInnerParam(), std::sqrt(std::pow(nTPCSigmaP[1] - TPCTOFAvg[4], 2) + std::pow(track.tofNSigmaDe() - TPCTOFAvg[5], 2))); - registry.fill(HIST("TrackCuts/NSigmaBefore/fNsigmaITSvsPDeuteronBefore"), track.p(), track.itsNSigmaDe()); - registry.fill(HIST("TrackCuts/NSigmaBefore/fNsigmaTPCvsPDeuteronBeforeP"), track.p(), nTPCSigmaP[1]); - registry.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationPos"), track.p(), track.tpcInnerParam()); + if (checkTrack(track, std::string("Kaon")) && checkTrackPid(track, std::string("Kaon"))) { + vecKaon.emplace_back(track.pt(), track.eta(), track.phi(), o2::constants::physics::MassKaonCharged); + idxKaon.push_back(track.globalIndex()); + + registry.fill(HIST("TrackQA/After/Kaon/fPt"), track.pt()); + registry.fill(HIST("TrackQA/After/Kaon/fPTpc"), track.tpcInnerParam()); + registry.fill(HIST("TrackQA/After/Kaon/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + registry.fill(HIST("TrackQA/After/Kaon/fEta"), track.eta()); + registry.fill(HIST("TrackQA/After/Kaon/fPhi"), track.phi()); + + registry.fill(HIST("TrackQA/After/Kaon/fNsigmaIts"), track.p(), track.itsNSigmaKa()); + registry.fill(HIST("TrackQA/After/Kaon/fNsigmaTpc"), track.p(), track.tpcNSigmaKa()); + registry.fill(HIST("TrackQA/After/Kaon/fNsigmaTof"), track.p(), track.tofNSigmaKa()); + registry.fill(HIST("TrackQA/After/Kaon/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaKa(), track.tofNSigmaKa())); + + registry.fill(HIST("TrackQA/After/Kaon/fItsSignal"), track.p(), itsSignal(track)); + registry.fill(HIST("TrackQA/After/Kaon/fTpcSignal"), track.p(), track.tpcSignal()); + registry.fill(HIST("TrackQA/After/Kaon/fTofBeta"), track.p(), track.beta()); + + registry.fill(HIST("TrackQA/After/Kaon/fDcaXy"), track.pt(), track.dcaXY()); + registry.fill(HIST("TrackQA/After/Kaon/fDcaZ"), track.pt(), track.dcaZ()); + + registry.fill(HIST("TrackQA/After/Kaon/fTpcClusters"), track.tpcNClsFound()); + registry.fill(HIST("TrackQA/After/Kaon/fTpcCrossedRows"), track.tpcNClsCrossedRows()); + registry.fill(HIST("TrackQA/After/Kaon/fTpcSharedClusters"), track.tpcNClsShared()); + registry.fill(HIST("TrackQA/After/Kaon/fTpcSharedClusterOverClusterss"), track.tpcFractionSharedCls()); + registry.fill(HIST("TrackQA/After/Kaon/fTpcFindableOverRows"), track.tpcCrossedRowsOverFindableCls()); + registry.fill(HIST("TrackQA/After/Kaon/fTpcChi2OverCluster"), track.tpcChi2NCl()); + + registry.fill(HIST("TrackQA/After/Kaon/fItsClusters"), track.itsNCls()); + registry.fill(HIST("TrackQA/After/Kaon/fItsIbClusters"), track.itsNClsInnerBarrel()); + registry.fill(HIST("TrackQA/After/Kaon/fItsChi2OverCluster"), track.itsChi2NCl()); } - if (track.sign() < 0) { - - registry.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAnti"), track.tpcInnerParam(), track.tpcSignal()); - registry.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAntiP"), track.p(), track.tpcSignal()); - if (isSelectedTrack(track, CFTrigger::kProton)) { - registry.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAntiALLCUTS"), track.tpcInnerParam(), track.tpcSignal()); - registry.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAntiALLCUTSP"), track.p(), track.tpcSignal()); - registry.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationAfterCutsNeg"), track.p(), track.tpcInnerParam()); - } - registry.fill(HIST("TrackCuts/NSigmaBefore/fNsigmaTPCvsPAntiProtonBefore"), track.tpcInnerParam(), nTPCSigmaN[0]); - registry.fill(HIST("TrackCuts/NSigmaBefore/fNsigmaTOFvsPAntiProtonBefore"), track.tpcInnerParam(), track.tofNSigmaPr()); - registry.fill(HIST("TrackCuts/NSigmaBefore/fNsigmaTPCTOFvsPAntiProtonBefore"), track.tpcInnerParam(), std::sqrt(std::pow(nTPCSigmaN[0] - TPCTOFAvg[2], 2) + std::pow(track.tofNSigmaPr() - TPCTOFAvg[3], 2))); - registry.fill(HIST("TrackCuts/NSigmaBefore/fNsigmaITSvsPAntiProtonBefore"), track.p(), track.itsNSigmaPr()); - registry.fill(HIST("TrackCuts/NSigmaBefore/fNsigmaTPCvsPAntiDeuteronBefore"), track.tpcInnerParam(), nTPCSigmaN[1]); - registry.fill(HIST("TrackCuts/NSigmaBefore/fNsigmaTOFvsPAntiDeuteronBefore"), track.tpcInnerParam(), track.tofNSigmaDe()); - registry.fill(HIST("TrackCuts/NSigmaBefore/fNsigmaTPCTOFvsPAntiDeuteronBefore"), track.tpcInnerParam(), std::sqrt(std::pow(nTPCSigmaN[1] - TPCTOFAvg[6], 2) + std::pow(track.tofNSigmaDe() - TPCTOFAvg[7], 2))); - registry.fill(HIST("TrackCuts/NSigmaBefore/fNsigmaITSvsPAntiDeuteronBefore"), track.p(), track.itsNSigmaDe()); - registry.fill(HIST("TrackCuts/NSigmaBefore/fNsigmaTPCvsPAntiDeuteronBeforeP"), track.p(), nTPCSigmaN[1]); - registry.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationNeg"), track.p(), track.tpcInnerParam()); + if (checkTrack(track, std::string("Proton")) && checkTrackPid(track, std::string("Proton"))) { + vecProton.emplace_back(track.pt(), track.eta(), track.phi(), o2::constants::physics::MassProton); + idxProton.push_back(track.globalIndex()); + + registry.fill(HIST("TrackQA/After/Proton/fPt"), track.pt()); + registry.fill(HIST("TrackQA/After/Proton/fPTpc"), track.tpcInnerParam()); + registry.fill(HIST("TrackQA/After/Proton/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + registry.fill(HIST("TrackQA/After/Proton/fEta"), track.eta()); + registry.fill(HIST("TrackQA/After/Proton/fPhi"), track.phi()); + + registry.fill(HIST("TrackQA/After/Proton/fNsigmaIts"), track.p(), track.itsNSigmaPr()); + registry.fill(HIST("TrackQA/After/Proton/fNsigmaTpc"), track.p(), track.tpcNSigmaPr()); + registry.fill(HIST("TrackQA/After/Proton/fNsigmaTof"), track.p(), track.tofNSigmaPr()); + registry.fill(HIST("TrackQA/After/Proton/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPr(), track.tofNSigmaPr())); + + registry.fill(HIST("TrackQA/After/Proton/fItsSignal"), track.p(), itsSignal(track)); + registry.fill(HIST("TrackQA/After/Proton/fTpcSignal"), track.p(), track.tpcSignal()); + registry.fill(HIST("TrackQA/After/Proton/fTofBeta"), track.p(), track.beta()); + + registry.fill(HIST("TrackQA/After/Proton/fDcaXy"), track.pt(), track.dcaXY()); + registry.fill(HIST("TrackQA/After/Proton/fDcaZ"), track.pt(), track.dcaZ()); + + registry.fill(HIST("TrackQA/After/Proton/fTpcClusters"), track.tpcNClsFound()); + registry.fill(HIST("TrackQA/After/Proton/fTpcCrossedRows"), track.tpcNClsCrossedRows()); + registry.fill(HIST("TrackQA/After/Proton/fTpcSharedClusters"), track.tpcNClsShared()); + registry.fill(HIST("TrackQA/After/Proton/fTpcSharedClusterOverClusterss"), track.tpcFractionSharedCls()); + registry.fill(HIST("TrackQA/After/Proton/fTpcFindableOverRows"), track.tpcCrossedRowsOverFindableCls()); + registry.fill(HIST("TrackQA/After/Proton/fTpcChi2OverCluster"), track.tpcChi2NCl()); + + registry.fill(HIST("TrackQA/After/Proton/fItsClusters"), track.itsNCls()); + registry.fill(HIST("TrackQA/After/Proton/fItsIbClusters"), track.itsNClsInnerBarrel()); + registry.fill(HIST("TrackQA/After/Proton/fItsChi2OverCluster"), track.itsChi2NCl()); } - // get protons - if (isSelectedTrack(track, CFTrigger::kProton)) { - ROOT::Math::PtEtaPhiMVector temp(track.pt(), track.eta(), track.phi(), mMassProton); - if (track.sign() > 0 && isSelectedTrackPID(track, CFTrigger::kProton, false, nTPCSigmaP, 1)) { - protons.push_back(temp); - ProtonIndex.push_back(track.globalIndex()); - - registry.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationAfterCutsProton"), track.p(), track.tpcInnerParam()); - - registry.fill(HIST("TrackCuts/TPCSignal/fTPCSignalProton"), track.tpcInnerParam(), track.tpcSignal()); - registry.fill(HIST("TrackCuts/Proton/fPProton"), track.p()); - registry.fill(HIST("TrackCuts/Proton/fPTPCProton"), track.tpcInnerParam()); - registry.fill(HIST("TrackCuts/Proton/fPtProton"), track.pt()); - registry.fill(HIST("TrackCuts/Proton/fMomCorProtonDif"), track.p(), track.tpcInnerParam() - track.p()); - registry.fill(HIST("TrackCuts/Proton/fMomCorProtonRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); - registry.fill(HIST("TrackCuts/Proton/fEtaProton"), track.eta()); - registry.fill(HIST("TrackCuts/Proton/fPhiProton"), track.phi()); - registry.fill(HIST("TrackCuts/Proton/fNsigmaTPCvsPProton"), track.tpcInnerParam(), nTPCSigmaP[0]); - registry.fill(HIST("TrackCuts/Proton/fNsigmaTOFvsPProton"), track.tpcInnerParam(), track.tofNSigmaPr()); - registry.fill(HIST("TrackCuts/Proton/fNsigmaTPCTOFvsPProton"), track.tpcInnerParam(), std::sqrt(std::pow(nTPCSigmaP[0] - TPCTOFAvg[0], 2) + std::pow(track.tofNSigmaPr() - TPCTOFAvg[1], 2))); - registry.fill(HIST("TrackCuts/Proton/fNsigmaITSvsPProton"), track.p(), track.itsNSigmaPr()); - - registry.fill(HIST("TrackCuts/Proton/fNsigmaTPCvsPProtonP"), track.p(), nTPCSigmaP[0]); - registry.fill(HIST("TrackCuts/Proton/fNsigmaTOFvsPProtonP"), track.p(), track.tofNSigmaPr()); - registry.fill(HIST("TrackCuts/Proton/fNsigmaTPCTOFvsPProtonP"), track.p(), std::sqrt(std::pow(nTPCSigmaP[0] - TPCTOFAvg[0], 2) + std::pow(track.tofNSigmaPr() - TPCTOFAvg[1], 2))); - - registry.fill(HIST("TrackCuts/Proton/fDCAxyProton"), track.dcaXY()); - registry.fill(HIST("TrackCuts/Proton/fDCAzProton"), track.dcaZ()); - registry.fill(HIST("TrackCuts/Proton/fTPCsClsProton"), track.tpcNClsShared()); - registry.fill(HIST("TrackCuts/Proton/fTPCcRowsProton"), track.tpcNClsCrossedRows()); - registry.fill(HIST("TrackCuts/Proton/fTrkTPCfClsProton"), track.tpcCrossedRowsOverFindableCls()); - registry.fill(HIST("TrackCuts/Proton/fTPCnclsProton"), track.tpcNClsFound()); - } - if (track.sign() < 0 && isSelectedTrackPID(track, CFTrigger::kProton, false, nTPCSigmaN, -1)) { - antiprotons.push_back(temp); - AntiProtonIndex.push_back(track.globalIndex()); - - registry.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationAfterCutsAntiProton"), track.p(), track.tpcInnerParam()); - - registry.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAntiProton"), track.tpcInnerParam(), track.tpcSignal()); - registry.fill(HIST("TrackCuts/AntiProton/fPtAntiProton"), track.pt()); - registry.fill(HIST("TrackCuts/AntiProton/fMomCorAntiProtonDif"), track.p(), track.tpcInnerParam() - track.p()); - registry.fill(HIST("TrackCuts/AntiProton/fMomCorAntiProtonRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); - registry.fill(HIST("TrackCuts/AntiProton/fEtaAntiProton"), track.eta()); - registry.fill(HIST("TrackCuts/AntiProton/fPhiAntiProton"), track.phi()); - registry.fill(HIST("TrackCuts/AntiProton/fNsigmaTPCvsPAntiProton"), track.tpcInnerParam(), nTPCSigmaN[0]); - registry.fill(HIST("TrackCuts/AntiProton/fNsigmaTOFvsPAntiProton"), track.tpcInnerParam(), track.tofNSigmaPr()); - registry.fill(HIST("TrackCuts/AntiProton/fNsigmaTPCTOFvsPAntiProton"), track.tpcInnerParam(), std::sqrt(std::pow(nTPCSigmaN[0] - TPCTOFAvg[2], 2) + std::pow(track.tofNSigmaPr() - TPCTOFAvg[3], 2))); - registry.fill(HIST("TrackCuts/AntiProton/fNsigmaITSvsPAntiProton"), track.p(), track.itsNSigmaPr()); - - registry.fill(HIST("TrackCuts/AntiProton/fNsigmaTPCvsPAntiProtonP"), track.p(), nTPCSigmaN[0]); - registry.fill(HIST("TrackCuts/AntiProton/fNsigmaTOFvsPAntiProtonP"), track.p(), track.tofNSigmaPr()); - registry.fill(HIST("TrackCuts/AntiProton/fNsigmaTPCTOFvsPAntiProtonP"), track.p(), std::sqrt(std::pow(nTPCSigmaN[0] - TPCTOFAvg[2], 2) + std::pow(track.tofNSigmaPr() - TPCTOFAvg[3], 2))); - - registry.fill(HIST("TrackCuts/AntiProton/fDCAxyAntiProton"), track.dcaXY()); - registry.fill(HIST("TrackCuts/AntiProton/fDCAzAntiProton"), track.dcaZ()); - registry.fill(HIST("TrackCuts/AntiProton/fTPCsClsAntiProton"), track.tpcNClsShared()); - registry.fill(HIST("TrackCuts/AntiProton/fTPCcRowsAntiProton"), track.tpcNClsCrossedRows()); - registry.fill(HIST("TrackCuts/AntiProton/fTrkTPCfClsAntiProton"), track.tpcCrossedRowsOverFindableCls()); - registry.fill(HIST("TrackCuts/AntiProton/fTPCnclsAntiProton"), track.tpcNClsFound()); - } - } - // get deuterons - if (isSelectedTrack(track, CFTrigger::kDeuteron)) { - ROOT::Math::PtEtaPhiMVector temp(track.pt(), track.eta(), track.phi(), mMassDeuteron); - if (track.sign() > 0 && isSelectedTrackPID(track, CFTrigger::kDeuteron, ConfRejectNOTDeuteron.value, nTPCSigmaP, 1)) { - deuterons.push_back(temp); - - registry.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationAfterCutsDeuteron"), track.p(), track.tpcInnerParam()); - - registry.fill(HIST("TrackCuts/TPCSignal/fTPCSignalDeuteron"), track.tpcInnerParam(), track.tpcSignal()); - registry.fill(HIST("TrackCuts/Deuteron/fPtDeuteron"), track.pt()); - registry.fill(HIST("TrackCuts/Deuteron/fMomCorDeuteronDif"), track.p(), track.tpcInnerParam() - track.p()); - registry.fill(HIST("TrackCuts/Deuteron/fMomCorDeuteronRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); - registry.fill(HIST("TrackCuts/Deuteron/fEtaDeuteron"), track.eta()); - registry.fill(HIST("TrackCuts/Deuteron/fPhiDeuteron"), track.phi()); - registry.fill(HIST("TrackCuts/Deuteron/fNsigmaTPCvsPDeuteron"), track.tpcInnerParam(), nTPCSigmaP[1]); - registry.fill(HIST("TrackCuts/Deuteron/fNsigmaTOFvsPDeuteron"), track.tpcInnerParam(), track.tofNSigmaDe()); - registry.fill(HIST("TrackCuts/Deuteron/fNsigmaTPCTOFvsPDeuteron"), track.tpcInnerParam(), std::sqrt(std::pow(nTPCSigmaP[1] - TPCTOFAvg[4], 2) + std::pow(track.tofNSigmaDe() - TPCTOFAvg[5], 2))); - registry.fill(HIST("TrackCuts/Deuteron/fNsigmaITSvsPDeuteron"), track.p(), track.itsNSigmaDe()); - - registry.fill(HIST("TrackCuts/Deuteron/fNsigmaTPCvsPDeuteronP"), track.p(), nTPCSigmaP[1]); - registry.fill(HIST("TrackCuts/Deuteron/fNsigmaTOFvsPDeuteronP"), track.p(), track.tofNSigmaDe()); - registry.fill(HIST("TrackCuts/Deuteron/fNsigmaTPCTOFvsPDeuteronP"), track.p(), std::sqrt(std::pow(nTPCSigmaP[1] - TPCTOFAvg[4], 2) + std::pow(track.tofNSigmaDe() - TPCTOFAvg[5], 2))); - - registry.fill(HIST("TrackCuts/Deuteron/fDCAxyDeuteron"), track.dcaXY()); - registry.fill(HIST("TrackCuts/Deuteron/fDCAzDeuteron"), track.dcaZ()); - registry.fill(HIST("TrackCuts/Deuteron/fTPCsClsDeuteron"), track.tpcNClsShared()); - registry.fill(HIST("TrackCuts/Deuteron/fTPCcRowsDeuteron"), track.tpcNClsCrossedRows()); - registry.fill(HIST("TrackCuts/Deuteron/fTrkTPCfClsDeuteron"), track.tpcCrossedRowsOverFindableCls()); - registry.fill(HIST("TrackCuts/Deuteron/fTPCnclsDeuteron"), track.tpcNClsFound()); - } - if (track.sign() < 0 && isSelectedTrackPID(track, CFTrigger::kDeuteron, ConfRejectNOTDeuteron.value, nTPCSigmaN, -1)) { - antideuterons.push_back(temp); - - registry.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationAfterCutsAntiDeuteron"), track.p(), track.tpcInnerParam()); - - registry.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAntiDeuteron"), track.tpcInnerParam(), track.tpcSignal()); - registry.fill(HIST("TrackCuts/AntiDeuteron/fPtAntiDeuteron"), track.pt()); - registry.fill(HIST("TrackCuts/AntiDeuteron/fMomCorAntiDeuteronDif"), track.p(), track.tpcInnerParam() - track.p()); - registry.fill(HIST("TrackCuts/AntiDeuteron/fMomCorAntiDeuteronRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); - registry.fill(HIST("TrackCuts/AntiDeuteron/fEtaAntiDeuteron"), track.eta()); - registry.fill(HIST("TrackCuts/AntiDeuteron/fPhiAntiDeuteron"), track.phi()); - registry.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaTPCvsPAntiDeuteron"), track.tpcInnerParam(), nTPCSigmaN[1]); - registry.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaTOFvsPAntiDeuteron"), track.tpcInnerParam(), track.tofNSigmaDe()); - registry.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaTPCTOFvsPAntiDeuteron"), track.tpcInnerParam(), std::sqrt(std::pow(nTPCSigmaN[1] - TPCTOFAvg[6], 2) + std::pow(track.tofNSigmaDe() - TPCTOFAvg[7], 2))); - registry.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaITSvsPAntiDeuteron"), track.p(), track.itsNSigmaDe()); - - registry.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaTPCvsPAntiDeuteronP"), track.p(), nTPCSigmaN[1]); - registry.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaTOFvsPAntiDeuteronP"), track.p(), track.tofNSigmaDe()); - registry.fill(HIST("TrackCuts/AntiDeuteron/fNsigmaTPCTOFvsPAntiDeuteronP"), track.p(), std::sqrt(std::pow(nTPCSigmaN[1] - TPCTOFAvg[6], 2) + std::pow(track.tofNSigmaDe() - TPCTOFAvg[7], 2))); - - registry.fill(HIST("TrackCuts/AntiDeuteron/fDCAxyAntiDeuteron"), track.dcaXY()); - registry.fill(HIST("TrackCuts/AntiDeuteron/fDCAzAntiDeuteron"), track.dcaZ()); - registry.fill(HIST("TrackCuts/AntiDeuteron/fTPCsClsAntiDeuteron"), track.tpcNClsShared()); - registry.fill(HIST("TrackCuts/AntiDeuteron/fTPCcRowsAntiDeuteron"), track.tpcNClsCrossedRows()); - registry.fill(HIST("TrackCuts/AntiDeuteron/fTrkTPCfClsAntiDeuteron"), track.tpcCrossedRowsOverFindableCls()); - registry.fill(HIST("TrackCuts/AntiDeuteron/fTPCnclsAntiDeuteron"), track.tpcNClsFound()); - } - } - // get Kaons (Phi Daughters) - if (ConfTriggerSwitches->get("Switch", "ppPhi") > 0.) { - if (isSelectedTrackKaon(track)) { - ROOT::Math::PtEtaPhiMVector temp(track.pt(), track.eta(), track.phi(), mMassKaonPlus); - if (track.sign() > 0) { - temp.SetM(mMassKaonPlus); - kaons.push_back(temp); - registry.fill(HIST("TrackCuts/Phi/Before/PosDaughter/fP"), track.p()); - registry.fill(HIST("TrackCuts/Phi/Before/PosDaughter/fPTPC"), track.tpcInnerParam()); - registry.fill(HIST("TrackCuts/Phi/Before/PosDaughter/fPt"), track.pt()); - registry.fill(HIST("TrackCuts/Phi/Before/PosDaughter/fMomCorDif"), track.p(), track.tpcInnerParam() - track.p()); - registry.fill(HIST("TrackCuts/Phi/Before/PosDaughter/fMomCorRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); - registry.fill(HIST("TrackCuts/Phi/Before/PosDaughter/fEta"), track.eta()); - registry.fill(HIST("TrackCuts/Phi/Before/PosDaughter/fPhi"), track.phi()); - registry.fill(HIST("TrackCuts/Phi/Before/PosDaughter/fNsigmaTPCvsP"), track.tpcInnerParam(), track.tpcNSigmaKa()); - registry.fill(HIST("TrackCuts/Phi/Before/PosDaughter/fNsigmaTOFvsP"), track.tpcInnerParam(), track.tofNSigmaKa()); - registry.fill(HIST("TrackCuts/Phi/Before/PosDaughter/fNsigmaTPCTOFvsP"), track.tpcInnerParam(), std::abs(std::sqrt(track.tpcNSigmaKa() * track.tpcNSigmaKa() + track.tofNSigmaKa() * track.tofNSigmaKa()))); - - registry.fill(HIST("TrackCuts/Phi/Before/PosDaughter/fDCAxy"), track.dcaXY()); - registry.fill(HIST("TrackCuts/Phi/Before/PosDaughter/fDCAz"), track.dcaZ()); - registry.fill(HIST("TrackCuts/Phi/Before/PosDaughter/fTPCsCls"), track.tpcNClsShared()); - registry.fill(HIST("TrackCuts/Phi/Before/PosDaughter/fTPCcRows"), track.tpcNClsCrossedRows()); - registry.fill(HIST("TrackCuts/Phi/Before/PosDaughter/fTrkTPCfCls"), track.tpcCrossedRowsOverFindableCls()); - registry.fill(HIST("TrackCuts/Phi/Before/PosDaughter/fTPCncls"), track.tpcNClsFound()); - } - if (track.sign() < 0) { - temp.SetM(mMassKaonMinus); - antikaons.push_back(temp); - registry.fill(HIST("TrackCuts/Phi/Before/NegDaughter/fP"), track.p()); - registry.fill(HIST("TrackCuts/Phi/Before/NegDaughter/fPTPC"), track.tpcInnerParam()); - registry.fill(HIST("TrackCuts/Phi/Before/NegDaughter/fPt"), track.pt()); - registry.fill(HIST("TrackCuts/Phi/Before/NegDaughter/fMomCorDif"), track.p(), track.tpcInnerParam() - track.p()); - registry.fill(HIST("TrackCuts/Phi/Before/NegDaughter/fMomCorRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); - registry.fill(HIST("TrackCuts/Phi/Before/NegDaughter/fEta"), track.eta()); - registry.fill(HIST("TrackCuts/Phi/Before/NegDaughter/fPhi"), track.phi()); - registry.fill(HIST("TrackCuts/Phi/Before/NegDaughter/fNsigmaTPCvsP"), track.tpcInnerParam(), track.tpcNSigmaKa()); - registry.fill(HIST("TrackCuts/Phi/Before/NegDaughter/fNsigmaTOFvsP"), track.tpcInnerParam(), track.tofNSigmaKa()); - registry.fill(HIST("TrackCuts/Phi/Before/NegDaughter/fNsigmaTPCTOFvsP"), track.tpcInnerParam(), std::abs(std::sqrt(track.tpcNSigmaKa() * track.tpcNSigmaKa() + track.tofNSigmaKa() * track.tofNSigmaKa()))); - - registry.fill(HIST("TrackCuts/Phi/Before/NegDaughter/fDCAxy"), track.dcaXY()); - registry.fill(HIST("TrackCuts/Phi/Before/NegDaughter/fDCAz"), track.dcaZ()); - registry.fill(HIST("TrackCuts/Phi/Before/NegDaughter/fTPCsCls"), track.tpcNClsShared()); - registry.fill(HIST("TrackCuts/Phi/Before/NegDaughter/fTPCcRows"), track.tpcNClsCrossedRows()); - registry.fill(HIST("TrackCuts/Phi/Before/NegDaughter/fTrkTPCfCls"), track.tpcCrossedRowsOverFindableCls()); - registry.fill(HIST("TrackCuts/Phi/Before/NegDaughter/fTPCncls"), track.tpcNClsFound()); - } - } - } - // get pions - if (isSelectedTrack(track, CFTrigger::kPion)) { - ROOT::Math::PtEtaPhiMVector temp(track.pt(), track.eta(), track.phi(), mMassPion); - if (track.sign() > 0 && isSelectedTrackPID(track, CFTrigger::kPion, false, nTPCSigmaP, 1)) { - pions.push_back(temp); - - registry.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationAfterCutsPion"), track.p(), track.tpcInnerParam()); - - registry.fill(HIST("TrackCuts/TPCSignal/fTPCSignalPion"), track.tpcInnerParam(), track.tpcSignal()); - registry.fill(HIST("TrackCuts/Pion/fPPion"), track.p()); - registry.fill(HIST("TrackCuts/Pion/fPTPCPion"), track.tpcInnerParam()); - registry.fill(HIST("TrackCuts/Pion/fPtPion"), track.pt()); - registry.fill(HIST("TrackCuts/Pion/fMomCorPionDif"), track.p(), track.tpcInnerParam() - track.p()); - registry.fill(HIST("TrackCuts/Pion/fMomCorPionRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); - registry.fill(HIST("TrackCuts/Pion/fEtaPion"), track.eta()); - registry.fill(HIST("TrackCuts/Pion/fPhiPion"), track.phi()); - registry.fill(HIST("TrackCuts/Pion/fNsigmaTPCvsPPion"), track.tpcInnerParam(), nTPCSigmaP[2]); - registry.fill(HIST("TrackCuts/Pion/fNsigmaTOFvsPPion"), track.tpcInnerParam(), track.tofNSigmaPi()); - registry.fill(HIST("TrackCuts/Pion/fNsigmaTPCTOFvsPPion"), track.tpcInnerParam(), std::sqrt(std::pow(nTPCSigmaP[2] - TPCTOFAvg[8], 2) + std::pow(track.tofNSigmaPi() - TPCTOFAvg[9], 2))); - - registry.fill(HIST("TrackCuts/Pion/fNsigmaTPCvsPPionP"), track.p(), nTPCSigmaP[2]); - registry.fill(HIST("TrackCuts/Pion/fNsigmaTOFvsPPionP"), track.p(), track.tofNSigmaPi()); - registry.fill(HIST("TrackCuts/Pion/fNsigmaTPCTOFvsPPionP"), track.p(), std::sqrt(std::pow(nTPCSigmaP[2] - TPCTOFAvg[8], 2) + std::pow(track.tofNSigmaPi() - TPCTOFAvg[9], 2))); - - registry.fill(HIST("TrackCuts/Pion/fDCAxyPion"), track.dcaXY()); - registry.fill(HIST("TrackCuts/Pion/fDCAzPion"), track.dcaZ()); - registry.fill(HIST("TrackCuts/Pion/fTPCsClsPion"), track.tpcNClsShared()); - registry.fill(HIST("TrackCuts/Pion/fTPCcRowsPion"), track.tpcNClsCrossedRows()); - registry.fill(HIST("TrackCuts/Pion/fTrkTPCfClsPion"), track.tpcCrossedRowsOverFindableCls()); - registry.fill(HIST("TrackCuts/Pion/fTPCnclsPion"), track.tpcNClsFound()); - } - if (track.sign() < 0 && isSelectedTrackPID(track, CFTrigger::kPion, false, nTPCSigmaN, -1)) { - antipions.push_back(temp); - - registry.fill(HIST("TrackCuts/TracksBefore/fMomCorrelationAfterCutsAntiPion"), track.p(), track.tpcInnerParam()); - - registry.fill(HIST("TrackCuts/TPCSignal/fTPCSignalAntiPion"), track.tpcInnerParam(), track.tpcSignal()); - registry.fill(HIST("TrackCuts/AntiPion/fPtAntiPion"), track.pt()); - registry.fill(HIST("TrackCuts/AntiPion/fMomCorAntiPionDif"), track.p(), track.tpcInnerParam() - track.p()); - registry.fill(HIST("TrackCuts/AntiPion/fMomCorAntiPionRatio"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); - registry.fill(HIST("TrackCuts/AntiPion/fEtaAntiPion"), track.eta()); - registry.fill(HIST("TrackCuts/AntiPion/fPhiAntiPion"), track.phi()); - registry.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCvsPAntiPion"), track.tpcInnerParam(), nTPCSigmaN[2]); - registry.fill(HIST("TrackCuts/AntiPion/fNsigmaTOFvsPAntiPion"), track.tpcInnerParam(), track.tofNSigmaPi()); - registry.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCTOFvsPAntiPion"), track.tpcInnerParam(), std::sqrt(std::pow(nTPCSigmaN[2] - TPCTOFAvg[10], 2) + std::pow(track.tofNSigmaPi() - TPCTOFAvg[11], 2))); - - registry.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCvsPAntiPionP"), track.p(), nTPCSigmaN[2]); - registry.fill(HIST("TrackCuts/AntiPion/fNsigmaTOFvsPAntiPionP"), track.p(), track.tofNSigmaPi()); - registry.fill(HIST("TrackCuts/AntiPion/fNsigmaTPCTOFvsPAntiPionP"), track.p(), std::sqrt(std::pow(nTPCSigmaN[2] - TPCTOFAvg[10], 2) + std::pow(track.tofNSigmaPi() - TPCTOFAvg[11], 2))); - - registry.fill(HIST("TrackCuts/AntiPion/fDCAxyAntiPion"), track.dcaXY()); - registry.fill(HIST("TrackCuts/AntiPion/fDCAzAntiPion"), track.dcaZ()); - registry.fill(HIST("TrackCuts/AntiPion/fTPCsClsAntiPion"), track.tpcNClsShared()); - registry.fill(HIST("TrackCuts/AntiPion/fTPCcRowsAntiPion"), track.tpcNClsCrossedRows()); - registry.fill(HIST("TrackCuts/AntiPion/fTrkTPCfClsAntiPion"), track.tpcCrossedRowsOverFindableCls()); - registry.fill(HIST("TrackCuts/AntiPion/fTPCnclsAntiPion"), track.tpcNClsFound()); - } + if (checkTrack(track, std::string("Deuteron")) && checkTrackPid(track, std::string("Deuteron"))) { + vecDeuteron.emplace_back(track.pt(), track.eta(), track.phi(), o2::constants::physics::MassDeuteron); + idxDeuteron.push_back(track.globalIndex()); + + registry.fill(HIST("TrackQA/After/Deuteron/fPt"), track.pt()); + registry.fill(HIST("TrackQA/After/Deuteron/fPTpc"), track.tpcInnerParam()); + registry.fill(HIST("TrackQA/After/Deuteron/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + registry.fill(HIST("TrackQA/After/Deuteron/fEta"), track.eta()); + registry.fill(HIST("TrackQA/After/Deuteron/fPhi"), track.phi()); + + registry.fill(HIST("TrackQA/After/Deuteron/fNsigmaIts"), track.p(), track.itsNSigmaDe()); + registry.fill(HIST("TrackQA/After/Deuteron/fNsigmaTpc"), track.p(), track.tpcNSigmaDe()); + registry.fill(HIST("TrackQA/After/Deuteron/fNsigmaTof"), track.p(), track.tofNSigmaDe()); + registry.fill(HIST("TrackQA/After/Deuteron/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaDe(), track.tofNSigmaDe())); + + registry.fill(HIST("TrackQA/After/Deuteron/fItsSignal"), track.p(), itsSignal(track)); + registry.fill(HIST("TrackQA/After/Deuteron/fTpcSignal"), track.p(), track.tpcSignal()); + registry.fill(HIST("TrackQA/After/Deuteron/fTofBeta"), track.p(), track.beta()); + + registry.fill(HIST("TrackQA/After/Deuteron/fDcaXy"), track.pt(), track.dcaXY()); + registry.fill(HIST("TrackQA/After/Deuteron/fDcaZ"), track.pt(), track.dcaZ()); + + registry.fill(HIST("TrackQA/After/Deuteron/fTpcClusters"), track.tpcNClsFound()); + registry.fill(HIST("TrackQA/After/Deuteron/fTpcCrossedRows"), track.tpcNClsCrossedRows()); + registry.fill(HIST("TrackQA/After/Deuteron/fTpcSharedClusters"), track.tpcNClsShared()); + registry.fill(HIST("TrackQA/After/Deuteron/fTpcSharedClusterOverClusterss"), track.tpcFractionSharedCls()); + registry.fill(HIST("TrackQA/After/Deuteron/fTpcFindableOverRows"), track.tpcCrossedRowsOverFindableCls()); + registry.fill(HIST("TrackQA/After/Deuteron/fTpcChi2OverCluster"), track.tpcChi2NCl()); + + registry.fill(HIST("TrackQA/After/Deuteron/fItsClusters"), track.itsNCls()); + registry.fill(HIST("TrackQA/After/Deuteron/fItsIbClusters"), track.itsNClsInnerBarrel()); + registry.fill(HIST("TrackQA/After/Deuteron/fItsChi2OverCluster"), track.itsChi2NCl()); } } - // keep track of daugher indices to avoid selfcorrelations - std::vector LambdaPosDaughIndex = {}; - std::vector LambdaNegDaughIndex = {}; - std::vector AntiLambdaPosDaughIndex = {}; - std::vector AntiLambdaNegDaughIndex = {}; - - for (auto& v0 : fullV0s) { - - auto postrack = v0.template posTrack_as(); - auto negtrack = v0.template negTrack_as(); - double nTPCSigmaPos[2]{postrack.tpcNSigmaPr(), postrack.tpcNSigmaPi()}; - double nTPCSigmaNeg[2]{negtrack.tpcNSigmaPr(), negtrack.tpcNSigmaPi()}; - if (ConfUseManualPIDdaughterPion) { - auto bgScalingPion = 1 / mMassPion; // momentum scaling? - if (BBPion.size() == 6) - nTPCSigmaPos[1] = updatePID(postrack, bgScalingPion, BBPion); - if (BBAntipion.size() == 6) - nTPCSigmaNeg[1] = updatePID(negtrack, bgScalingPion, BBAntipion); + if (track.sign() < 0) { + registry.fill(HIST("TrackQA/Before/AntiParticle/fPt"), track.pt()); + registry.fill(HIST("TrackQA/Before/AntiParticle/fEta"), track.eta()); + registry.fill(HIST("TrackQA/Before/AntiParticle/fPhi"), track.phi()); + registry.fill(HIST("TrackQA/Before/AntiParticle/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + registry.fill(HIST("TrackQA/Before/AntiParticle/fItsSignal"), track.p(), itsSignal(track)); + registry.fill(HIST("TrackQA/Before/AntiParticle/fTpcSignal"), track.p(), track.tpcSignal()); + registry.fill(HIST("TrackQA/Before/AntiParticle/fTofSignal"), track.p(), track.beta()); + + registry.fill(HIST("TrackQA/Before/AntiPion/fNsigmaITS"), track.p(), track.itsNSigmaPi()); + registry.fill(HIST("TrackQA/Before/AntiPion/fNsigmaTPC"), track.p(), track.tpcNSigmaPi()); + registry.fill(HIST("TrackQA/Before/AntiPion/fNsigmaTOF"), track.p(), track.tofNSigmaPi()); + registry.fill(HIST("TrackQA/Before/AntiPion/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPi(), track.tofNSigmaPi())); + + registry.fill(HIST("TrackQA/Before/AntiKaon/fNsigmaITS"), track.p(), track.itsNSigmaKa()); + registry.fill(HIST("TrackQA/Before/AntiKaon/fNsigmaTPC"), track.p(), track.tpcNSigmaKa()); + registry.fill(HIST("TrackQA/Before/AntiKaon/fNsigmaTOF"), track.p(), track.tofNSigmaKa()); + registry.fill(HIST("TrackQA/Before/AntiKaon/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaKa(), track.tofNSigmaKa())); + + registry.fill(HIST("TrackQA/Before/AntiProton/fNsigmaITS"), track.p(), track.itsNSigmaPr()); + registry.fill(HIST("TrackQA/Before/AntiProton/fNsigmaTPC"), track.p(), track.tpcNSigmaPr()); + registry.fill(HIST("TrackQA/Before/AntiProton/fNsigmaTOF"), track.p(), track.tofNSigmaPr()); + registry.fill(HIST("TrackQA/Before/AntiProton/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPr(), track.tofNSigmaPr())); + + registry.fill(HIST("TrackQA/Before/AntiDeuteron/fNsigmaITS"), track.p(), track.itsNSigmaDe()); + registry.fill(HIST("TrackQA/Before/AntiDeuteron/fNsigmaTPC"), track.p(), track.tpcNSigmaDe()); + registry.fill(HIST("TrackQA/Before/AntiDeuteron/fNsigmaTOF"), track.p(), track.tofNSigmaDe()); + registry.fill(HIST("TrackQA/Before/AntiDeuteron/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaDe(), track.tofNSigmaDe())); + + if (checkTrack(track, std::string("Pion")) && checkTrackPid(track, std::string("Pion"))) { + vecAntiPion.emplace_back(track.pt(), track.eta(), track.phi(), o2::constants::physics::MassPionCharged); + idxAntiPion.push_back(track.globalIndex()); + + registry.fill(HIST("TrackQA/After/AntiPion/fPt"), track.pt()); + registry.fill(HIST("TrackQA/After/AntiPion/fPTpc"), track.tpcInnerParam()); + registry.fill(HIST("TrackQA/After/AntiPion/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + registry.fill(HIST("TrackQA/After/AntiPion/fEta"), track.eta()); + registry.fill(HIST("TrackQA/After/AntiPion/fPhi"), track.phi()); + + registry.fill(HIST("TrackQA/After/AntiPion/fNsigmaIts"), track.p(), track.itsNSigmaPi()); + registry.fill(HIST("TrackQA/After/AntiPion/fNsigmaTpc"), track.p(), track.tpcNSigmaPi()); + registry.fill(HIST("TrackQA/After/AntiPion/fNsigmaTof"), track.p(), track.tofNSigmaPi()); + registry.fill(HIST("TrackQA/After/AntiPion/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPi(), track.tofNSigmaPi())); + + registry.fill(HIST("TrackQA/After/AntiPion/fItsSignal"), track.p(), itsSignal(track)); + registry.fill(HIST("TrackQA/After/AntiPion/fTpcSignal"), track.p(), track.tpcSignal()); + registry.fill(HIST("TrackQA/After/AntiPion/fTofBeta"), track.p(), track.beta()); + + registry.fill(HIST("TrackQA/After/AntiPion/fDcaXy"), track.pt(), track.dcaXY()); + registry.fill(HIST("TrackQA/After/AntiPion/fDcaZ"), track.pt(), track.dcaZ()); + + registry.fill(HIST("TrackQA/After/AntiPion/fTpcClusters"), track.tpcNClsFound()); + registry.fill(HIST("TrackQA/After/AntiPion/fTpcCrossedRows"), track.tpcNClsCrossedRows()); + registry.fill(HIST("TrackQA/After/AntiPion/fTpcSharedClusters"), track.tpcNClsShared()); + registry.fill(HIST("TrackQA/After/AntiPion/fTpcSharedClusterOverClusterss"), track.tpcFractionSharedCls()); + registry.fill(HIST("TrackQA/After/AntiPion/fTpcFindableOverRows"), track.tpcCrossedRowsOverFindableCls()); + registry.fill(HIST("TrackQA/After/AntiPion/fTpcChi2OverCluster"), track.tpcChi2NCl()); + + registry.fill(HIST("TrackQA/After/AntiPion/fItsClusters"), track.itsNCls()); + registry.fill(HIST("TrackQA/After/AntiPion/fItsIbClusters"), track.itsNClsInnerBarrel()); + registry.fill(HIST("TrackQA/After/AntiPion/fItsChi2OverCluster"), track.itsChi2NCl()); } - if (ConfUseManualPIDdaughterProton) { - auto bgScalingProton = 1 / mMassProton; // momentum scaling? - if (BBProton.size() == 6) - nTPCSigmaPos[0] = updatePID(postrack, bgScalingProton, BBProton); - if (BBAntiproton.size() == 6) - nTPCSigmaNeg[0] = updatePID(negtrack, bgScalingProton, BBAntiproton); + + if (checkTrack(track, std::string("Kaon")) && checkTrackPid(track, std::string("Kaon"))) { + vecAntiKaon.emplace_back(track.pt(), track.eta(), track.phi(), o2::constants::physics::MassKaonCharged); + idxAntiKaon.push_back(track.globalIndex()); + + registry.fill(HIST("TrackQA/After/AntiKaon/fPt"), track.pt()); + registry.fill(HIST("TrackQA/After/AntiKaon/fPTpc"), track.tpcInnerParam()); + registry.fill(HIST("TrackQA/After/AntiKaon/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + registry.fill(HIST("TrackQA/After/AntiKaon/fEta"), track.eta()); + registry.fill(HIST("TrackQA/After/AntiKaon/fPhi"), track.phi()); + + registry.fill(HIST("TrackQA/After/AntiKaon/fNsigmaIts"), track.p(), track.itsNSigmaKa()); + registry.fill(HIST("TrackQA/After/AntiKaon/fNsigmaTpc"), track.p(), track.tpcNSigmaKa()); + registry.fill(HIST("TrackQA/After/AntiKaon/fNsigmaTof"), track.p(), track.tofNSigmaKa()); + registry.fill(HIST("TrackQA/After/AntiKaon/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaKa(), track.tofNSigmaKa())); + + registry.fill(HIST("TrackQA/After/AntiKaon/fItsSignal"), track.p(), itsSignal(track)); + registry.fill(HIST("TrackQA/After/AntiKaon/fTpcSignal"), track.p(), track.tpcSignal()); + registry.fill(HIST("TrackQA/After/AntiKaon/fTofBeta"), track.p(), track.beta()); + + registry.fill(HIST("TrackQA/After/AntiKaon/fDcaXy"), track.pt(), track.dcaXY()); + registry.fill(HIST("TrackQA/After/AntiKaon/fDcaZ"), track.pt(), track.dcaZ()); + + registry.fill(HIST("TrackQA/After/AntiKaon/fTpcClusters"), track.tpcNClsFound()); + registry.fill(HIST("TrackQA/After/AntiKaon/fTpcCrossedRows"), track.tpcNClsCrossedRows()); + registry.fill(HIST("TrackQA/After/AntiKaon/fTpcSharedClusters"), track.tpcNClsShared()); + registry.fill(HIST("TrackQA/After/AntiKaon/fTpcSharedClusterOverClusterss"), track.tpcFractionSharedCls()); + registry.fill(HIST("TrackQA/After/AntiKaon/fTpcFindableOverRows"), track.tpcCrossedRowsOverFindableCls()); + registry.fill(HIST("TrackQA/After/AntiKaon/fTpcChi2OverCluster"), track.tpcChi2NCl()); + + registry.fill(HIST("TrackQA/After/AntiKaon/fItsClusters"), track.itsNCls()); + registry.fill(HIST("TrackQA/After/AntiKaon/fItsIbClusters"), track.itsNClsInnerBarrel()); + registry.fill(HIST("TrackQA/After/AntiKaon/fItsChi2OverCluster"), track.itsChi2NCl()); } - registry.fill(HIST("TrackCuts/V0Before/fPtLambdaBefore"), v0.pt()); - registry.fill(HIST("TrackCuts/V0Before/fInvMassLambdaBefore"), v0.mLambda()); - registry.fill(HIST("TrackCuts/V0Before/fInvMassAntiLambdaBefore"), v0.mAntiLambda()); - registry.fill(HIST("TrackCuts/V0Before/fInvMassLambdavsAntiLambda"), v0.mLambda(), v0.mAntiLambda()); - registry.fill(HIST("TrackCuts/V0Before/fInvMassV0BeforeKaonvsV0Before"), v0.mK0Short(), v0.mLambda()); - registry.fill(HIST("TrackCuts/V0Before/fV0DCADaugh"), v0.dcaV0daughters()); - registry.fill(HIST("TrackCuts/V0Before/fV0CPA"), v0.v0cosPA()); - registry.fill(HIST("TrackCuts/V0Before/fV0TranRad"), v0.v0radius()); - registry.fill(HIST("TrackCuts/V0Before/f0DecVtxX"), v0.x()); - registry.fill(HIST("TrackCuts/V0Before/f0DecVtxY"), v0.y()); - registry.fill(HIST("TrackCuts/V0Before/f0DecVtxZ"), v0.z()); - - registry.fill(HIST("TrackCuts/V0Before/PosDaughter/Eta"), postrack.eta()); - registry.fill(HIST("TrackCuts/V0Before/PosDaughter/DCAXY"), postrack.dcaXY()); - registry.fill(HIST("TrackCuts/V0Before/PosDaughter/fTPCncls"), postrack.tpcNClsFound()); - registry.fill(HIST("TrackCuts/V0Before/NegDaughter/Eta"), negtrack.eta()); - registry.fill(HIST("TrackCuts/V0Before/NegDaughter/DCAXY"), negtrack.dcaXY()); - registry.fill(HIST("TrackCuts/V0Before/NegDaughter/fTPCncls"), negtrack.tpcNClsFound()); - registry.fill(HIST("TrackCuts/V0Before/PosDaughter/fNsigmaTPCvsPProtonV0Daugh"), postrack.tpcInnerParam(), nTPCSigmaPos[0]); - registry.fill(HIST("TrackCuts/V0Before/NegDaughter/fNsigmaTPCvsPPionMinusV0Daugh"), negtrack.tpcInnerParam(), nTPCSigmaNeg[1]); - registry.fill(HIST("TrackCuts/V0Before/NegDaughter/fNsigmaTPCvsPAntiProtonV0Daugh"), negtrack.tpcInnerParam(), nTPCSigmaNeg[0]); - registry.fill(HIST("TrackCuts/V0Before/PosDaughter/fNsigmaTPCvsPPionPlusV0Daugh"), postrack.tpcInnerParam(), nTPCSigmaPos[1]); - - registry.fill(HIST("TrackCuts/NSigmaBefore/fNsigmaTPCvsPProtonV0DaughBefore"), postrack.tpcInnerParam(), nTPCSigmaPos[0]); - registry.fill(HIST("TrackCuts/NSigmaBefore/fNsigmaTPCvsPPionPlusAntiV0DaughBefore"), postrack.tpcInnerParam(), nTPCSigmaNeg[1]); - - registry.fill(HIST("TrackCuts/NSigmaBefore/fNsigmaTPCvsPPionMinusV0DaughBefore"), negtrack.tpcInnerParam(), nTPCSigmaNeg[1]); - registry.fill(HIST("TrackCuts/NSigmaBefore/fNsigmaTPCvsPAntiProtonAntiV0DaughBefore"), negtrack.tpcInnerParam(), nTPCSigmaNeg[0]); - - if (isSelectedMinimalV0(col, v0, postrack, negtrack, 1, nTPCSigmaPos, nTPCSigmaNeg)) { - ROOT::Math::PtEtaPhiMVector temp(v0.pt(), v0.eta(), v0.phi(), mMassLambda); - lambdas.push_back(temp); - LambdaPosDaughIndex.push_back(postrack.globalIndex()); - LambdaNegDaughIndex.push_back(negtrack.globalIndex()); - registry.fill(HIST("TrackCuts/TPCSignal/fTPCSignalProtonPlusV0Daughter"), postrack.tpcInnerParam(), postrack.tpcSignal()); - registry.fill(HIST("TrackCuts/TPCSignal/fTPCSignalPionMinusV0Daughter"), negtrack.tpcInnerParam(), negtrack.tpcSignal()); - registry.fill(HIST("TrackCuts/Lambda/fPtLambda"), v0.pt()); - registry.fill(HIST("TrackCuts/Lambda/fInvMassLambda"), v0.mLambda()); - registry.fill(HIST("TrackCuts/Lambda/fInvMassLambdaKaonvsLambda"), v0.mK0Short(), v0.mLambda()); - registry.fill(HIST("TrackCuts/Lambda/fV0DCADaugh"), v0.dcaV0daughters()); - registry.fill(HIST("TrackCuts/Lambda/fV0CPA"), v0.v0cosPA()); - registry.fill(HIST("TrackCuts/Lambda/fV0TranRad"), v0.v0radius()); - registry.fill(HIST("TrackCuts/Lambda/f0DecVtxX"), v0.x()); - registry.fill(HIST("TrackCuts/Lambda/f0DecVtxY"), v0.y()); - registry.fill(HIST("TrackCuts/Lambda/f0DecVtxZ"), v0.z()); - - registry.fill(HIST("TrackCuts/Lambda/PosDaughter/Eta"), postrack.eta()); - registry.fill(HIST("TrackCuts/Lambda/PosDaughter/DCAXY"), postrack.dcaXY()); - registry.fill(HIST("TrackCuts/Lambda/PosDaughter/fTPCncls"), postrack.tpcNClsFound()); - registry.fill(HIST("TrackCuts/Lambda/NegDaughter/Eta"), negtrack.eta()); - registry.fill(HIST("TrackCuts/Lambda/NegDaughter/DCAXY"), negtrack.dcaXY()); - registry.fill(HIST("TrackCuts/Lambda/NegDaughter/fTPCncls"), negtrack.tpcNClsFound()); - registry.fill(HIST("TrackCuts/Lambda/PosDaughter/fNsigmaTPCvsPProtonV0Daugh"), postrack.tpcInnerParam(), nTPCSigmaPos[0]); - registry.fill(HIST("TrackCuts/Lambda/NegDaughter/fNsigmaTPCvsPPionMinusV0Daugh"), negtrack.tpcInnerParam(), nTPCSigmaNeg[1]); + + if (checkTrack(track, std::string("Proton")) && checkTrackPid(track, std::string("Proton"))) { + vecAntiProton.emplace_back(track.pt(), track.eta(), track.phi(), o2::constants::physics::MassProton); + idxAntiProton.push_back(track.globalIndex()); + + registry.fill(HIST("TrackQA/After/AntiProton/fPt"), track.pt()); + registry.fill(HIST("TrackQA/After/AntiProton/fPTpc"), track.tpcInnerParam()); + registry.fill(HIST("TrackQA/After/AntiProton/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + registry.fill(HIST("TrackQA/After/AntiProton/fEta"), track.eta()); + registry.fill(HIST("TrackQA/After/AntiProton/fPhi"), track.phi()); + + registry.fill(HIST("TrackQA/After/AntiProton/fNsigmaIts"), track.p(), track.itsNSigmaPr()); + registry.fill(HIST("TrackQA/After/AntiProton/fNsigmaTpc"), track.p(), track.tpcNSigmaPr()); + registry.fill(HIST("TrackQA/After/AntiProton/fNsigmaTof"), track.p(), track.tofNSigmaPr()); + registry.fill(HIST("TrackQA/After/AntiProton/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPr(), track.tofNSigmaPr())); + + registry.fill(HIST("TrackQA/After/AntiProton/fItsSignal"), track.p(), itsSignal(track)); + registry.fill(HIST("TrackQA/After/AntiProton/fTpcSignal"), track.p(), track.tpcSignal()); + registry.fill(HIST("TrackQA/After/AntiProton/fTofBeta"), track.p(), track.beta()); + + registry.fill(HIST("TrackQA/After/AntiProton/fDcaXy"), track.pt(), track.dcaXY()); + registry.fill(HIST("TrackQA/After/AntiProton/fDcaZ"), track.pt(), track.dcaZ()); + + registry.fill(HIST("TrackQA/After/AntiProton/fTpcClusters"), track.tpcNClsFound()); + registry.fill(HIST("TrackQA/After/AntiProton/fTpcCrossedRows"), track.tpcNClsCrossedRows()); + registry.fill(HIST("TrackQA/After/AntiProton/fTpcSharedClusters"), track.tpcNClsShared()); + registry.fill(HIST("TrackQA/After/AntiProton/fTpcSharedClusterOverClusterss"), track.tpcFractionSharedCls()); + registry.fill(HIST("TrackQA/After/AntiProton/fTpcFindableOverRows"), track.tpcCrossedRowsOverFindableCls()); + registry.fill(HIST("TrackQA/After/AntiProton/fTpcChi2OverCluster"), track.tpcChi2NCl()); + + registry.fill(HIST("TrackQA/After/AntiProton/fItsClusters"), track.itsNCls()); + registry.fill(HIST("TrackQA/After/AntiProton/fItsIbClusters"), track.itsNClsInnerBarrel()); + registry.fill(HIST("TrackQA/After/AntiProton/fItsChi2OverCluster"), track.itsChi2NCl()); } - if (isSelectedMinimalV0(col, v0, postrack, negtrack, -1, nTPCSigmaPos, nTPCSigmaNeg)) { - ROOT::Math::PtEtaPhiMVector temp(v0.pt(), v0.eta(), v0.phi(), mMassLambda); - antilambdas.push_back(temp); - AntiLambdaPosDaughIndex.push_back(postrack.globalIndex()); - AntiLambdaNegDaughIndex.push_back(negtrack.globalIndex()); - registry.fill(HIST("TrackCuts/TPCSignal/fTPCSignalPionPlusV0Daughter"), postrack.tpcInnerParam(), postrack.tpcSignal()); - registry.fill(HIST("TrackCuts/TPCSignal/fTPCSignalProtonMinusV0Daughter"), negtrack.tpcInnerParam(), negtrack.tpcSignal()); - registry.fill(HIST("TrackCuts/AntiLambda/fPtAntiLambda"), v0.pt()); - registry.fill(HIST("TrackCuts/AntiLambda/fInvMassAntiLambda"), v0.mAntiLambda()); - registry.fill(HIST("TrackCuts/AntiLambda/fInvMassAntiLambdaKaonvsAntiLambda"), v0.mK0Short(), v0.mAntiLambda()); - registry.fill(HIST("TrackCuts/AntiLambda/fV0DCADaugh"), v0.dcaV0daughters()); - registry.fill(HIST("TrackCuts/AntiLambda/fV0CPA"), v0.v0cosPA()); - registry.fill(HIST("TrackCuts/AntiLambda/fV0TranRad"), v0.v0radius()); - registry.fill(HIST("TrackCuts/AntiLambda/f0DecVtxX"), v0.x()); - registry.fill(HIST("TrackCuts/AntiLambda/f0DecVtxY"), v0.y()); - registry.fill(HIST("TrackCuts/AntiLambda/f0DecVtxZ"), v0.z()); - - registry.fill(HIST("TrackCuts/AntiLambda/PosDaughter/Eta"), postrack.eta()); - registry.fill(HIST("TrackCuts/AntiLambda/PosDaughter/DCAXY"), postrack.dcaXY()); - registry.fill(HIST("TrackCuts/AntiLambda/PosDaughter/fTPCncls"), postrack.tpcNClsFound()); - registry.fill(HIST("TrackCuts/AntiLambda/NegDaughter/Eta"), negtrack.eta()); - registry.fill(HIST("TrackCuts/AntiLambda/NegDaughter/DCAXY"), negtrack.dcaXY()); - registry.fill(HIST("TrackCuts/AntiLambda/NegDaughter/fTPCncls"), negtrack.tpcNClsFound()); - registry.fill(HIST("TrackCuts/AntiLambda/NegDaughter/fNsigmaTPCvsPAntiProtonAntiV0Daugh"), negtrack.tpcInnerParam(), nTPCSigmaNeg[0]); - registry.fill(HIST("TrackCuts/AntiLambda/PosDaughter/fNsigmaTPCvsPPionPlusAntiV0Daugh"), postrack.tpcInnerParam(), nTPCSigmaPos[1]); + + if (checkTrack(track, std::string("Deuteron")) && checkTrackPid(track, std::string("Deuteron"))) { + vecAntiDeuteron.emplace_back(track.pt(), track.eta(), track.phi(), o2::constants::physics::MassDeuteron); + idxAntiDeuteron.push_back(track.globalIndex()); + + registry.fill(HIST("TrackQA/After/AntiDeuteron/fPt"), track.pt()); + registry.fill(HIST("TrackQA/After/AntiDeuteron/fPTpc"), track.tpcInnerParam()); + registry.fill(HIST("TrackQA/After/AntiDeuteron/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + registry.fill(HIST("TrackQA/After/AntiDeuteron/fEta"), track.eta()); + registry.fill(HIST("TrackQA/After/AntiDeuteron/fPhi"), track.phi()); + + registry.fill(HIST("TrackQA/After/AntiDeuteron/fNsigmaIts"), track.p(), track.itsNSigmaDe()); + registry.fill(HIST("TrackQA/After/AntiDeuteron/fNsigmaTpc"), track.p(), track.tpcNSigmaDe()); + registry.fill(HIST("TrackQA/After/AntiDeuteron/fNsigmaTof"), track.p(), track.tofNSigmaDe()); + registry.fill(HIST("TrackQA/After/AntiDeuteron/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaDe(), track.tofNSigmaDe())); + + registry.fill(HIST("TrackQA/After/AntiDeuteron/fItsSignal"), track.p(), itsSignal(track)); + registry.fill(HIST("TrackQA/After/AntiDeuteron/fTpcSignal"), track.p(), track.tpcSignal()); + registry.fill(HIST("TrackQA/After/AntiDeuteron/fTofBeta"), track.p(), track.beta()); + + registry.fill(HIST("TrackQA/After/AntiDeuteron/fDcaXy"), track.pt(), track.dcaXY()); + registry.fill(HIST("TrackQA/After/AntiDeuteron/fDcaZ"), track.pt(), track.dcaZ()); + + registry.fill(HIST("TrackQA/After/AntiDeuteron/fTpcClusters"), track.tpcNClsFound()); + registry.fill(HIST("TrackQA/After/AntiDeuteron/fTpcCrossedRows"), track.tpcNClsCrossedRows()); + registry.fill(HIST("TrackQA/After/AntiDeuteron/fTpcSharedClusters"), track.tpcNClsShared()); + registry.fill(HIST("TrackQA/After/AntiDeuteron/fTpcSharedClusterOverClusterss"), track.tpcFractionSharedCls()); + registry.fill(HIST("TrackQA/After/AntiDeuteron/fTpcFindableOverRows"), track.tpcCrossedRowsOverFindableCls()); + registry.fill(HIST("TrackQA/After/AntiDeuteron/fTpcChi2OverCluster"), track.tpcChi2NCl()); + + registry.fill(HIST("TrackQA/After/AntiDeuteron/fItsClusters"), track.itsNCls()); + registry.fill(HIST("TrackQA/After/AntiDeuteron/fItsIbClusters"), track.itsNClsInnerBarrel()); + registry.fill(HIST("TrackQA/After/AntiDeuteron/fItsChi2OverCluster"), track.itsChi2NCl()); } } + } - if (ConfTriggerSwitches->get("Switch", "ppPhi") > 0.) { + // loop over and build v0s + for (auto const& v0 : v0s) { - for (const auto& postrack : kaons) { - for (const auto& negtrack : antikaons) { + auto posTrack = v0.posTrack_as(); + auto negTrack = v0.negTrack_as(); - ROOT::Math::PtEtaPhiMVector temp = postrack + negtrack; + auto posTrackPar = getTrackParCov(posTrack); + auto negTrackPar = getTrackParCov(negTrack); - registry.fill(HIST("TrackCuts/Phi/Before/fInvMass"), temp.M()); - registry.fill(HIST("TrackCuts/Phi/Before/fPt"), temp.pt()); - registry.fill(HIST("TrackCuts/Phi/Before/fEta"), temp.eta()); - registry.fill(HIST("TrackCuts/Phi/Before/fPhi"), translatePhi(temp.phi())); + if (!mStraHelper.buildV0Candidate(v0.collisionId(), col.posX(), col.posY(), col.posZ(), posTrack, negTrack, posTrackPar, negTrackPar, false, false, false)) { + continue; + } - if ((temp.M() >= PPPhi.ConfResoInvMassLowLimit.value) && (temp.M() <= PPPhi.ConfResoInvMassUpLimit.value)) { + float lambdaPt = RecoDecay::sqrtSumOfSquares(mStraHelper.v0.momentum[0], mStraHelper.v0.momentum[1]); + float lambdaPos = std::hypot(mStraHelper.v0.position[0] - col.posX(), mStraHelper.v0.position[1] - col.posY(), mStraHelper.v0.position[2] - col.posZ()); + float lambdaRadius = std::hypot(mStraHelper.v0.position[0], mStraHelper.v0.position[1]); + float lambdaEta = RecoDecay::eta(std::array{mStraHelper.v0.momentum[0], mStraHelper.v0.momentum[1], mStraHelper.v0.momentum[2]}); + float lambdaPhi = RecoDecay::phi(mStraHelper.v0.momentum[0], mStraHelper.v0.momentum[1]); + float lambdaCpa = std::cos(mStraHelper.v0.pointingAngle); + float lambdaDauDca = mStraHelper.v0.daughterDCA; + float lambdaMass = mStraHelper.v0.massLambda; + float antiLambdaMass = mStraHelper.v0.massAntiLambda; + float kaonMass = mStraHelper.v0.massK0Short; + + float posTrackEta = RecoDecay::eta(std::array{mStraHelper.v0.positiveMomentum[0], mStraHelper.v0.positiveMomentum[1], mStraHelper.v0.positiveMomentum[2]}); + float posTrackDca = mStraHelper.v0.positiveDCAxy; + float negTrackEta = RecoDecay::eta(std::array{mStraHelper.v0.negativeMomentum[0], mStraHelper.v0.negativeMomentum[1], mStraHelper.v0.negativeMomentum[2]}); + float negTrackDca = mStraHelper.v0.negativeDCAxy; + + registry.fill(HIST("LambdaQA/Before/fPt"), lambdaPt); + registry.fill(HIST("LambdaQA/Before/fEta"), lambdaEta); + registry.fill(HIST("LambdaQA/Before/fPhi"), lambdaPhi); + registry.fill(HIST("LambdaQA/Before/fInvMassLambda"), lambdaMass); + registry.fill(HIST("LambdaQA/Before/fInvMassAntiLambda"), antiLambdaMass); + registry.fill(HIST("LambdaQA/Before/fInvMassLambdaVsAntiLambda"), lambdaMass, antiLambdaMass); + registry.fill(HIST("LambdaQA/Before/fInvMassLambdaVsKaon"), lambdaMass, kaonMass); + registry.fill(HIST("LambdaQA/Before/fInvMassAntiLambdaVsKaon"), antiLambdaMass, kaonMass); + registry.fill(HIST("LambdaQA/Before/fDcaDaugh"), lambdaDauDca); + registry.fill(HIST("LambdaQA/Before/fCpa"), lambdaCpa); + registry.fill(HIST("LambdaQA/Before/fTranRad"), lambdaRadius); + registry.fill(HIST("LambdaQA/Before/fDecVtx"), lambdaPos); + + registry.fill(HIST("LambdaQA/Before/PosDaughter/fPt"), posTrack.pt()); + registry.fill(HIST("LambdaQA/Before/PosDaughter/fEta"), posTrackEta); + registry.fill(HIST("LambdaQA/Before/PosDaughter/fPhi"), posTrack.phi()); + registry.fill(HIST("LambdaQA/Before/PosDaughter/fDcaXy"), posTrack.pt(), posTrackDca); + registry.fill(HIST("LambdaQA/Before/PosDaughter/fTpcClusters"), posTrack.tpcNClsFound()); + registry.fill(HIST("LambdaQA/Before/PosDaughter/fNsigmaTpcProton"), posTrack.p(), posTrack.tpcNSigmaPr()); + registry.fill(HIST("LambdaQA/Before/PosDaughter/fNsigmaTpcPion"), posTrack.p(), posTrack.tpcNSigmaPi()); + + registry.fill(HIST("LambdaQA/Before/NegDaughter/fPt"), negTrack.pt()); + registry.fill(HIST("LambdaQA/Before/NegDaughter/fEta"), negTrackEta); + registry.fill(HIST("LambdaQA/Before/NegDaughter/fPhi"), negTrack.phi()); + registry.fill(HIST("LambdaQA/Before/NegDaughter/fDcaXy"), negTrack.pt(), negTrackDca); + registry.fill(HIST("LambdaQA/Before/NegDaughter/fTpcClusters"), negTrack.tpcNClsFound()); + registry.fill(HIST("LambdaQA/Before/NegDaughter/fNsigmaTpcProton"), negTrack.p(), negTrack.tpcNSigmaPr()); + registry.fill(HIST("LambdaQA/Before/NegDaughter/fNsigmaTpcPion"), negTrack.p(), negTrack.tpcNSigmaPi()); + + if (checkLambda(lambdaPt, lambdaDauDca, lambdaCpa, lambdaRadius, lambdaPos, kaonMass, lambdaMass) && checkLambdaDaughter(posTrack, posTrackEta, posTrackDca, posTrack.tpcNSigmaPr()) && checkLambdaDaughter(negTrack, negTrackEta, negTrackDca, negTrack.tpcNSigmaPi())) { + vecLambda.emplace_back(lambdaPt, lambdaEta, lambdaPhi, o2::constants::physics::MassLambda0); + idxLambdaDaughProton.push_back(posTrack.globalIndex()); + idxLambdaDaughPion.push_back(negTrack.globalIndex()); + + registry.fill(HIST("LambdaQA/After/Lambda/fPt"), lambdaPt); + registry.fill(HIST("LambdaQA/After/Lambda/fEta"), lambdaEta); + registry.fill(HIST("LambdaQA/After/Lambda/fPhi"), lambdaPhi); + registry.fill(HIST("LambdaQA/After/Lambda/fInvMass"), lambdaMass); + registry.fill(HIST("LambdaQA/After/Lambda/fInvMassLambdaVsAntiLambda"), lambdaMass, antiLambdaMass); + registry.fill(HIST("LambdaQA/After/Lambda/fInvMassLambdaVsKaon"), lambdaMass, kaonMass); + registry.fill(HIST("LambdaQA/After/Lambda/fDcaDaugh"), lambdaDauDca); + registry.fill(HIST("LambdaQA/After/Lambda/fCpa"), lambdaCpa); + registry.fill(HIST("LambdaQA/After/Lambda/fTranRad"), lambdaRadius); + registry.fill(HIST("LambdaQA/After/Lambda/fDecVtx"), lambdaPos); + + registry.fill(HIST("LambdaQA/After/Lambda/PosDaughter/fPt"), posTrack.pt()); + registry.fill(HIST("LambdaQA/After/Lambda/PosDaughter/fEta"), posTrackEta); + registry.fill(HIST("LambdaQA/After/Lambda/PosDaughter/fPhi"), posTrack.phi()); + registry.fill(HIST("LambdaQA/After/Lambda/PosDaughter/fDcaXy"), posTrack.pt(), posTrackDca); + registry.fill(HIST("LambdaQA/After/Lambda/PosDaughter/fTpcClusters"), posTrack.tpcNClsFound()); + registry.fill(HIST("LambdaQA/After/Lambda/PosDaughter/fNsigmaTpc"), posTrack.p(), posTrack.tpcNSigmaPr()); + + registry.fill(HIST("LambdaQA/After/Lambda/NegDaughter/fPt"), negTrack.pt()); + registry.fill(HIST("LambdaQA/After/Lambda/NegDaughter/fEta"), negTrackEta); + registry.fill(HIST("LambdaQA/After/Lambda/NegDaughter/fPhi"), negTrack.phi()); + registry.fill(HIST("LambdaQA/After/Lambda/NegDaughter/fDcaXy"), negTrack.pt(), negTrackDca); + registry.fill(HIST("LambdaQA/After/Lambda/NegDaughter/fTpcClusters"), negTrack.tpcNClsFound()); + registry.fill(HIST("LambdaQA/After/Lambda/NegDaughter/fNsigmaTpc"), negTrack.p(), negTrack.tpcNSigmaPi()); + } - phi.push_back(temp); + if (checkLambda(lambdaPt, lambdaDauDca, lambdaCpa, lambdaRadius, lambdaPos, kaonMass, antiLambdaMass) && checkLambdaDaughter(posTrack, posTrackEta, posTrackDca, posTrack.tpcNSigmaPi()) && checkLambdaDaughter(negTrack, negTrackEta, negTrackDca, negTrack.tpcNSigmaPr())) { + vecAntiLambda.emplace_back(lambdaPt, lambdaEta, lambdaPhi, o2::constants::physics::MassLambda0); + + idxAntiLambdaDaughProton.push_back(negTrack.globalIndex()); + idxAntiLambdaDaughPion.push_back(posTrack.globalIndex()); + + registry.fill(HIST("LambdaQA/After/AntiLambda/fPt"), lambdaPt); + registry.fill(HIST("LambdaQA/After/AntiLambda/fEta"), lambdaEta); + registry.fill(HIST("LambdaQA/After/AntiLambda/fPhi"), lambdaPhi); + registry.fill(HIST("LambdaQA/After/AntiLambda/fInvMass"), antiLambdaMass); + registry.fill(HIST("LambdaQA/After/AntiLambda/fInvMassAntiLambdaVsLambda"), antiLambdaMass, lambdaMass); + registry.fill(HIST("LambdaQA/After/AntiLambda/fInvMassAntiLambdaVsKaon"), antiLambdaMass, kaonMass); + registry.fill(HIST("LambdaQA/After/AntiLambda/fDcaDaugh"), lambdaDauDca); + registry.fill(HIST("LambdaQA/After/AntiLambda/fCpa"), lambdaCpa); + registry.fill(HIST("LambdaQA/After/AntiLambda/fTranRad"), lambdaRadius); + registry.fill(HIST("LambdaQA/After/AntiLambda/fDecVtx"), lambdaPos); + + registry.fill(HIST("LambdaQA/After/AntiLambda/PosDaughter/fPt"), posTrack.pt()); + registry.fill(HIST("LambdaQA/After/AntiLambda/PosDaughter/fEta"), posTrackEta); + registry.fill(HIST("LambdaQA/After/AntiLambda/PosDaughter/fPhi"), posTrack.phi()); + registry.fill(HIST("LambdaQA/After/AntiLambda/PosDaughter/fDcaXy"), posTrack.pt(), posTrackDca); + registry.fill(HIST("LambdaQA/After/AntiLambda/PosDaughter/fTpcClusters"), posTrack.tpcNClsFound()); + registry.fill(HIST("LambdaQA/After/AntiLambda/PosDaughter/fNsigmaTpc"), posTrack.p(), posTrack.tpcNSigmaPr()); + + registry.fill(HIST("LambdaQA/After/AntiLambda/NegDaughter/fPt"), negTrack.pt()); + registry.fill(HIST("LambdaQA/After/AntiLambda/NegDaughter/fEta"), negTrackEta); + registry.fill(HIST("LambdaQA/After/AntiLambda/NegDaughter/fPhi"), negTrack.phi()); + registry.fill(HIST("LambdaQA/After/AntiLambda/NegDaughter/fDcaXy"), negTrack.pt(), negTrackDca); + registry.fill(HIST("LambdaQA/After/AntiLambda/NegDaughter/fTpcClusters"), negTrack.tpcNClsFound()); + registry.fill(HIST("LambdaQA/After/AntiLambda/NegDaughter/fNsigmaTpc"), negTrack.p(), negTrack.tpcNSigmaPi()); + } + } - registry.fill(HIST("TrackCuts/Phi/After/fInvMass"), temp.M()); - registry.fill(HIST("TrackCuts/Phi/After/fPt"), temp.pt()); - registry.fill(HIST("TrackCuts/Phi/After/fEta"), temp.eta()); - registry.fill(HIST("TrackCuts/Phi/After/fPhi"), translatePhi(temp.phi())); + // build phi candidates + for (size_t k1 = 0; k1 < vecKaon.size(); k1++) { + for (size_t k2 = 0; k2 < vecAntiKaon.size(); k2++) { + ROOT::Math::PtEtaPhiMVector phi = vecKaon.at(k1) + vecAntiKaon.at(k2); + + registry.fill(HIST("PhiQA/Before/fInvMass"), phi.M()); + registry.fill(HIST("PhiQA/Before/fPt"), phi.Pt()); + registry.fill(HIST("PhiQA/Before/fEta"), phi.Eta()); + registry.fill(HIST("PhiQA/Before/fPhi"), RecoDecay::constrainAngle(phi.Phi())); + + if ((phi.M() >= PhiSelections.invMassLow.value) && + (phi.M() <= PhiSelections.invMassUp.value)) { + vecPhi.push_back(phi); + idxPhiDaughPos.push_back(idxKaon.at(k1)); + idxPhiDaughNeg.push_back(idxAntiKaon.at(k2)); + + registry.fill(HIST("PhiQA/After/fInvMass"), phi.M()); + registry.fill(HIST("PhiQA/After/fPt"), phi.Pt()); + registry.fill(HIST("PhiQA/After/fEta"), phi.Eta()); + registry.fill(HIST("PhiQA/After/fPhi"), RecoDecay::constrainAngle(phi.Phi())); + } + } + } - registry.fill(HIST("TrackCuts/Phi/After/PosDaughter/fPt"), postrack.pt()); - registry.fill(HIST("TrackCuts/Phi/After/PosDaughter/fEta"), postrack.eta()); - registry.fill(HIST("TrackCuts/Phi/After/PosDaughter/fPhi"), translatePhi(postrack.phi())); + // build rho candidates + for (size_t p1 = 0; p1 < vecPion.size(); p1++) { + for (size_t p2 = 0; p2 < vecAntiPion.size(); p2++) { + ROOT::Math::PtEtaPhiMVector rho = vecPion.at(p1) + vecAntiPion.at(p2); + + registry.fill(HIST("RhoQA/Before/fInvMass"), rho.M()); + registry.fill(HIST("RhoQA/Before/fPt"), rho.Pt()); + registry.fill(HIST("RhoQA/Before/fEta"), rho.Eta()); + registry.fill(HIST("RhoQA/Before/fPhi"), RecoDecay::constrainAngle(rho.Phi())); + + if (((rho.M() >= RhoSelections.invMassLow.value) && (rho.M() <= RhoSelections.invMassUp.value)) && (rho.Pt() >= RhoSelections.ptLow)) { + vecRho.push_back(rho); + idxRhoDaughPos.push_back(idxPion.at(p1)); + idxRhoDaughNeg.push_back(idxAntiPion.at(p2)); + + registry.fill(HIST("RhoQA/After/fInvMass"), rho.M()); + registry.fill(HIST("RhoQA/After/fPt"), rho.Pt()); + registry.fill(HIST("RhoQA/After/fEta"), rho.Eta()); + registry.fill(HIST("RhoQA/After/fPhi"), RecoDecay::constrainAngle(rho.Phi())); + } + } + } - registry.fill(HIST("TrackCuts/Phi/After/NegDaughter/fPt"), negtrack.pt()); - registry.fill(HIST("TrackCuts/Phi/After/NegDaughter/fEta"), negtrack.eta()); - registry.fill(HIST("TrackCuts/Phi/After/NegDaughter/fPhi"), translatePhi(negtrack.phi())); + // reset all arrays + keepEventTightLimit.fill(false); + keepEventLooseLimit.fill(false); + signalTightLimit.fill(0); + signalLooseLimit.fill(0); + + float q3 = 999.f, kstar = 999.f; + + // PPP + if (TriggerSelections.filterSwitches->get("Switch", "PPP") > 0) { + for (size_t p1 = 0; p1 < vecProton.size(); p1++) { + for (size_t p2 = p1 + 1; p2 < vecProton.size(); p2++) { + for (size_t p3 = p2 + 1; p3 < vecProton.size(); p3++) { + q3 = getQ3(vecProton.at(p1), vecProton.at(p2), vecProton.at(p3)); + registry.fill(HIST("PPP/fMultiplicity"), col.multNTracksPV()); + registry.fill(HIST("PPP/fZvtx"), col.posZ()); + registry.fill(HIST("PPP/fSE_particle"), q3); + registry.fill(HIST("PPP/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); + registry.fill(HIST("PPP/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); + registry.fill(HIST("PPP/fProtonPtVsQ3"), vecProton.at(p3).Pt(), q3); + if (q3 < TriggerSelections.limits->get("Loose Limit", "PPP")) { + signalLooseLimit[cf_trigger::kPPP] += 1; + if (q3 < TriggerSelections.limits->get("Tight Limit", "PPP")) { + signalTightLimit[cf_trigger::kPPP] += 1; + } } } } } - - // construct rho cand - if (ConfTriggerSwitches->get("Switch", "ppRho") > 0.) { // here we could select on extra pion properties important for the Rho0Cands - - for (const auto& postrack : pions) { - for (const auto& negtrack : antipions) { - - ROOT::Math::PtEtaPhiMVector temp = postrack + negtrack; - - registry.fill(HIST("TrackCuts/Rho/Before/fInvMass"), temp.M()); - registry.fill(HIST("TrackCuts/Rho/Before/fPt"), temp.pt()); - registry.fill(HIST("TrackCuts/Rho/Before/fEta"), temp.eta()); - registry.fill(HIST("TrackCuts/Rho/Before/fPhi"), translatePhi(temp.phi())); - - registry.fill(HIST("TrackCuts/Rho/Before/PosDaughter/fInvMass"), postrack.M()); - registry.fill(HIST("TrackCuts/Rho/Before/PosDaughter/fPt"), postrack.pt()); - registry.fill(HIST("TrackCuts/Rho/Before/PosDaughter/fEta"), postrack.eta()); - registry.fill(HIST("TrackCuts/Rho/Before/PosDaughter/fPhi"), translatePhi(postrack.phi())); - - registry.fill(HIST("TrackCuts/Rho/Before/PosDaughter/fInvMass"), negtrack.M()); - registry.fill(HIST("TrackCuts/Rho/Before/NegDaughter/fPt"), negtrack.pt()); - registry.fill(HIST("TrackCuts/Rho/Before/NegDaughter/fEta"), negtrack.eta()); - registry.fill(HIST("TrackCuts/Rho/Before/NegDaughter/fPhi"), translatePhi(negtrack.phi())); - - if ((temp.M() >= PPRho.ConfResoRho0InvMassLowLimit.value) && (temp.M() <= PPRho.ConfResoRho0InvMassUpLimit.value) && (temp.pt() >= PPRho.ConfTrkPtRho0CandLowLimit.value) && (temp.pt() <= PPRho.ConfTrkPtRho0CandUpLimit.value)) { - - rho.push_back(temp); - - registry.fill(HIST("TrackCuts/Rho/After/fInvMass"), temp.M()); - registry.fill(HIST("TrackCuts/Rho/After/fPt"), temp.pt()); - registry.fill(HIST("TrackCuts/Rho/After/fEta"), temp.eta()); - registry.fill(HIST("TrackCuts/Rho/After/fPhi"), translatePhi(temp.phi())); - - registry.fill(HIST("TrackCuts/Rho/After/PosDaughter/fPt"), postrack.pt()); - registry.fill(HIST("TrackCuts/Rho/After/PosDaughter/fEta"), postrack.eta()); - registry.fill(HIST("TrackCuts/Rho/After/PosDaughter/fPhi"), translatePhi(postrack.phi())); - - registry.fill(HIST("TrackCuts/Rho/After/NegDaughter/fPt"), negtrack.pt()); - registry.fill(HIST("TrackCuts/Rho/After/NegDaughter/fEta"), negtrack.eta()); - registry.fill(HIST("TrackCuts/Rho/After/NegDaughter/fPhi"), translatePhi(negtrack.phi())); + for (size_t p1 = 0; p1 < vecAntiProton.size(); p1++) { + for (size_t p2 = p1 + 1; p2 < vecAntiProton.size(); p2++) { + for (size_t p3 = p2 + 1; p3 < vecAntiProton.size(); p3++) { + q3 = getQ3(vecAntiProton.at(p1), vecAntiProton.at(p2), vecAntiProton.at(p3)); + registry.fill(HIST("PPP/fMultiplicity"), col.multNTracksPV()); + registry.fill(HIST("PPP/fZvtx"), col.posZ()); + registry.fill(HIST("PPP/fSE_antiparticle"), q3); + registry.fill(HIST("PPP/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); + registry.fill(HIST("PPP/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); + registry.fill(HIST("PPP/fAntiProtonPtVsQ3"), vecAntiProton.at(p3).Pt(), q3); + if (q3 < TriggerSelections.limits->get("Loose Limit", "PPP")) { + signalLooseLimit[cf_trigger::kPPP] += 1; + if (q3 < TriggerSelections.limits->get("Tight Limit", "PPP")) { + signalTightLimit[cf_trigger::kPPP] += 1; + } } } } } - - float Q3 = 999.f, kstar = 999.f; - if (ConfTriggerSwitches->get("Switch", "ppp") > 0.) { - // ppp trigger - for (auto iProton1 = protons.begin(); iProton1 != protons.end(); ++iProton1) { - auto iProton2 = iProton1 + 1; - for (; iProton2 != protons.end(); ++iProton2) { - auto iProton3 = iProton2 + 1; - for (; iProton3 != protons.end(); ++iProton3) { - Q3 = getQ3(*iProton1, *iProton2, *iProton3); - registry.fill(HIST("ppp/fSE_particle"), Q3); - registry.fill(HIST("ppp/fProtonPtVsQ3"), Q3, (*iProton1).Pt()); - registry.fill(HIST("ppp/fProtonPtVsQ3"), Q3, (*iProton2).Pt()); - registry.fill(HIST("ppp/fProtonPtVsQ3"), Q3, (*iProton3).Pt()); - if (Q3 < ConfQ3Limits->get(static_cast(0), CFTrigger::kPPP)) { - if (ConfDownsample->get("Switch", "PPP") > 0) { - if (rng->Uniform(0., 1.) < ConfDownsample->get("Factor", "PPP")) { - registry.fill(HIST("ppp/fSE_particle_downsample"), Q3); - lowQ3Triplets[CFTrigger::kPPP] += 1; - } - } else { - lowQ3Triplets[CFTrigger::kPPP] += 1; - } + } + // PPL + if (TriggerSelections.filterSwitches->get("Switch", "PPL") > 0) { + for (size_t p1 = 0; p1 < vecProton.size(); p1++) { + for (size_t p2 = p1 + 1; p2 < vecProton.size(); p2++) { + for (size_t l1 = 0; l1 < vecLambda.size(); l1++) { + if (idxProton.at(p1) == idxLambdaDaughProton.at(l1) || idxProton.at(p2) == idxLambdaDaughProton.at(l1)) { + continue; + } + q3 = getQ3(vecProton.at(p1), vecProton.at(p2), vecLambda.at(l1)); + registry.fill(HIST("PPL/fMultiplicity"), col.multNTracksPV()); + registry.fill(HIST("PPL/fZvtx"), col.posZ()); + registry.fill(HIST("PPL/fSE_particle"), q3); + registry.fill(HIST("PPL/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); + registry.fill(HIST("PPL/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); + registry.fill(HIST("PPL/fLambdaPtVsQ3"), vecLambda.at(l1).Pt(), q3); + if (q3 < TriggerSelections.limits->get("Loose Limit", "PPL")) { + signalLooseLimit[cf_trigger::kPPL] += 1; + if (q3 < TriggerSelections.limits->get("Tight Limit", "PPL")) { + signalTightLimit[cf_trigger::kPPL] += 1; } } } } - for (auto iAntiProton1 = antiprotons.begin(); iAntiProton1 != antiprotons.end(); ++iAntiProton1) { - auto iAntiProton2 = iAntiProton1 + 1; - for (; iAntiProton2 != antiprotons.end(); ++iAntiProton2) { - auto iAntiProton3 = iAntiProton2 + 1; - for (; iAntiProton3 != antiprotons.end(); ++iAntiProton3) { - Q3 = getQ3(*iAntiProton1, *iAntiProton2, *iAntiProton3); - registry.fill(HIST("ppp/fSE_antiparticle"), Q3); - registry.fill(HIST("ppp/fAntiProtonPtVsQ3"), Q3, (*iAntiProton1).Pt()); - registry.fill(HIST("ppp/fAntiProtonPtVsQ3"), Q3, (*iAntiProton2).Pt()); - registry.fill(HIST("ppp/fAntiProtonPtVsQ3"), Q3, (*iAntiProton3).Pt()); - if (Q3 < ConfQ3Limits->get(static_cast(0), CFTrigger::kPPP)) { - if (ConfDownsample->get("Switch", "aPaPaP") > 0) { - if (rng->Uniform(0., 1.) < ConfDownsample->get("Factor", "aPaPaP")) { - registry.fill(HIST("ppp/fSE_antiparticle_downsample"), Q3); - lowQ3Triplets[CFTrigger::kPPP] += 1; - } - } else { - lowQ3Triplets[CFTrigger::kPPP] += 1; - } + } + for (size_t p1 = 0; p1 < vecAntiProton.size(); p1++) { + for (size_t p2 = p1 + 1; p2 < vecAntiProton.size(); p2++) { + for (size_t l1 = 0; l1 < vecAntiLambda.size(); l1++) { + if (idxAntiProton.at(p1) == idxAntiLambdaDaughProton.at(l1) || idxAntiProton.at(p2) == idxAntiLambdaDaughProton.at(l1)) { + continue; + } + q3 = getQ3(vecAntiProton.at(p1), vecAntiProton.at(p2), vecAntiLambda.at(l1)); + registry.fill(HIST("PPL/fMultiplicity"), col.multNTracksPV()); + registry.fill(HIST("PPL/fZvtx"), col.posZ()); + registry.fill(HIST("PPL/fSE_particle"), q3); + registry.fill(HIST("PPL/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); + registry.fill(HIST("PPL/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); + registry.fill(HIST("PPL/fAntiLambdaPtVsQ3"), vecAntiLambda.at(l1).Pt(), q3); + if (q3 < TriggerSelections.limits->get("Loose Limit", "PPL")) { + signalLooseLimit[cf_trigger::kPPL] += 1; + if (q3 < TriggerSelections.limits->get("Tight Limit", "PPL")) { + signalTightLimit[cf_trigger::kPPL] += 1; } } } } } - if (ConfTriggerSwitches->get("Switch", "ppL") > 0.) { - // ppl trigger - for (auto iProton1 = protons.begin(); iProton1 != protons.end(); ++iProton1) { - auto iProton2 = iProton1 + 1; - auto i1 = std::distance(protons.begin(), iProton1); - for (; iProton2 != protons.end(); ++iProton2) { - auto i2 = std::distance(protons.begin(), iProton2); - for (auto iLambda1 = lambdas.begin(); iLambda1 != lambdas.end(); ++iLambda1) { - auto i3 = std::distance(lambdas.begin(), iLambda1); - if (ConfAutocorRejection.value && - (ProtonIndex.at(i1) == LambdaPosDaughIndex.at(i3) || - ProtonIndex.at(i2) == LambdaPosDaughIndex.at(i3))) { - continue; - } - Q3 = getQ3(*iProton1, *iProton2, *iLambda1); - registry.fill(HIST("ppl/fSE_particle"), Q3); - registry.fill(HIST("ppl/fProtonPtVsQ3"), Q3, (*iProton1).Pt()); - registry.fill(HIST("ppl/fProtonPtVsQ3"), Q3, (*iProton2).Pt()); - registry.fill(HIST("ppl/fLambdaPtVsQ3"), Q3, (*iLambda1).Pt()); - if (Q3 < ConfQ3Limits->get(static_cast(0), CFTrigger::kPPL)) { - if (ConfDownsample->get("Switch", "PPL") > 0) { - if (rng->Uniform(0., 1.) < ConfDownsample->get("Factor", "PPL")) { - registry.fill(HIST("ppl/fSE_particle_downsample"), Q3); - lowQ3Triplets[CFTrigger::kPPL] += 1; - } - } else { - lowQ3Triplets[CFTrigger::kPPL] += 1; - } + } + // PLL + if (TriggerSelections.filterSwitches->get("Switch", "PLL") > 0) { + for (size_t l1 = 0; l1 < vecLambda.size(); l1++) { + for (size_t l2 = l1 + 1; l2 < vecLambda.size(); l2++) { + for (size_t p1 = 0; p1 < vecProton.size(); p1++) { + if (idxProton.at(p1) == idxLambdaDaughProton.at(l1) || idxProton.at(p1) == idxLambdaDaughProton.at(l2)) { + continue; + } + if (idxLambdaDaughProton.at(l1) == idxLambdaDaughProton.at(l2) || idxLambdaDaughPion.at(l1) == idxLambdaDaughPion.at(l2)) { + continue; + } + q3 = getQ3(vecLambda.at(l1), vecLambda.at(l2), vecProton.at(p1)); + registry.fill(HIST("PLL/fMultiplicity"), col.multNTracksPV()); + registry.fill(HIST("PLL/fZvtx"), col.posZ()); + registry.fill(HIST("PLL/fSE_particle"), q3); + registry.fill(HIST("PLL/fLambdaPtVsQ3"), vecLambda.at(l1).Pt(), q3); + registry.fill(HIST("PLL/fLambdaPtVsQ3"), vecLambda.at(l2).Pt(), q3); + registry.fill(HIST("PLL/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); + if (q3 < TriggerSelections.limits->get("Loose Limit", "PLL")) { + signalLooseLimit[cf_trigger::kPLL] += 1; + if (q3 < TriggerSelections.limits->get("Tight Limit", "PLL")) { + signalTightLimit[cf_trigger::kPLL] += 1; } } } } - for (auto iAntiProton1 = antiprotons.begin(); iAntiProton1 != antiprotons.end(); ++iAntiProton1) { - auto iAntiProton2 = iAntiProton1 + 1; - auto i1 = std::distance(antiprotons.begin(), iAntiProton1); - for (; iAntiProton2 != antiprotons.end(); ++iAntiProton2) { - auto i2 = std::distance(antiprotons.begin(), iAntiProton2); - for (auto iAntiLambda1 = antilambdas.begin(); iAntiLambda1 != antilambdas.end(); ++iAntiLambda1) { - auto i3 = std::distance(antilambdas.begin(), iAntiLambda1); - if (ConfAutocorRejection.value && - (AntiProtonIndex.at(i1) == AntiLambdaNegDaughIndex.at(i3) || - AntiProtonIndex.at(i2) == AntiLambdaNegDaughIndex.at(i3))) { - continue; - } - Q3 = getQ3(*iAntiProton1, *iAntiProton2, *iAntiLambda1); - registry.fill(HIST("ppl/fSE_antiparticle"), Q3); - registry.fill(HIST("ppl/fAntiProtonPtVsQ3"), Q3, (*iAntiProton1).Pt()); - registry.fill(HIST("ppl/fAntiProtonPtVsQ3"), Q3, (*iAntiProton2).Pt()); - registry.fill(HIST("ppl/fAntiLambdaPtVsQ3"), Q3, (*iAntiLambda1).Pt()); - if (Q3 < ConfQ3Limits->get(static_cast(0), CFTrigger::kPPL)) { - if (ConfDownsample->get("Switch", "aPaPaL") > 0) { - if (rng->Uniform(0., 1.) < ConfDownsample->get("Factor", "aPaPaL")) { - registry.fill(HIST("ppl/fSE_antiparticle_downsample"), Q3); - lowQ3Triplets[CFTrigger::kPPL] += 1; - } - } else { - lowQ3Triplets[CFTrigger::kPPL] += 1; - } + } + for (size_t l1 = 0; l1 < vecAntiLambda.size(); l1++) { + for (size_t l2 = l1 + 1; l2 < vecAntiLambda.size(); l2++) { + for (size_t p1 = 0; p1 < vecAntiProton.size(); p1++) { + if (idxAntiProton.at(p1) == idxAntiLambdaDaughProton.at(l1) || idxAntiProton.at(p1) == idxAntiLambdaDaughProton.at(l2)) { + continue; + } + if (idxAntiLambdaDaughProton.at(l1) == idxAntiLambdaDaughProton.at(l2) || idxAntiLambdaDaughPion.at(l1) == idxAntiLambdaDaughPion.at(l2)) { + continue; + } + q3 = getQ3(vecAntiLambda.at(l1), vecAntiLambda.at(l2), vecAntiProton.at(p1)); + registry.fill(HIST("PLL/fMultiplicity"), col.multNTracksPV()); + registry.fill(HIST("PLL/fZvtx"), col.posZ()); + registry.fill(HIST("PLL/fSE_antiparticle"), q3); + registry.fill(HIST("PLL/fAntiLambdaPtVsQ3"), vecAntiLambda.at(l1).Pt(), q3); + registry.fill(HIST("PLL/fAntiLambdaPtVsQ3"), vecAntiLambda.at(l2).Pt(), q3); + registry.fill(HIST("PLL/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); + if (q3 < TriggerSelections.limits->get("Loose Limit", "PLL")) { + signalLooseLimit[cf_trigger::kPLL] += 1; + if (q3 < TriggerSelections.limits->get("Tight Limit", "PLL")) { + signalTightLimit[cf_trigger::kPLL] += 1; } } } } } - if (ConfTriggerSwitches->get("Switch", "pLL") > 0.) { - // pll trigger - for (auto iLambda1 = lambdas.begin(); iLambda1 != lambdas.end(); ++iLambda1) { - auto iLambda2 = iLambda1 + 1; - auto i1 = std::distance(lambdas.begin(), iLambda1); - for (; iLambda2 != lambdas.end(); ++iLambda2) { - auto i2 = std::distance(lambdas.begin(), iLambda2); - if (ConfAutocorRejection.value && - (LambdaPosDaughIndex.at(i1) == LambdaPosDaughIndex.at(i2) || - LambdaNegDaughIndex.at(i1) == LambdaNegDaughIndex.at(i2))) { + } + // LLL + if (TriggerSelections.filterSwitches->get("Switch", "LLL") > 0) { + for (size_t l1 = 0; l1 < vecLambda.size(); l1++) { + for (size_t l2 = l1 + 1; l2 < vecLambda.size(); l2++) { + for (size_t l3 = l2 + 1; l3 < vecLambda.size(); l3++) { + if (idxLambdaDaughProton.at(l1) == idxLambdaDaughProton.at(l2) || idxLambdaDaughPion.at(l1) == idxLambdaDaughPion.at(l2) || + idxLambdaDaughProton.at(l2) == idxLambdaDaughProton.at(l3) || idxLambdaDaughPion.at(l2) == idxLambdaDaughPion.at(l3) || + idxLambdaDaughProton.at(l3) == idxLambdaDaughProton.at(l1) || idxLambdaDaughPion.at(l3) == idxLambdaDaughPion.at(l1)) { continue; } - for (auto iProton1 = protons.begin(); iProton1 != protons.end(); ++iProton1) { - auto i3 = std::distance(protons.begin(), iProton1); - if (ConfAutocorRejection.value && - (LambdaPosDaughIndex.at(i1) == ProtonIndex.at(i3) || - LambdaPosDaughIndex.at(i2) == ProtonIndex.at(i3))) { - continue; - } - Q3 = getQ3(*iLambda1, *iLambda2, *iProton1); - registry.fill(HIST("pll/fSE_particle"), Q3); - registry.fill(HIST("pll/fProtonPtVsQ3"), Q3, (*iProton1).Pt()); - registry.fill(HIST("pll/fLambdaPtVsQ3"), Q3, (*iLambda1).Pt()); - registry.fill(HIST("pll/fLambdaPtVsQ3"), Q3, (*iLambda2).Pt()); - if (Q3 < ConfQ3Limits->get(static_cast(0), CFTrigger::kPLL)) { - if (ConfDownsample->get("Switch", "PLL") > 0) { - if (rng->Uniform(0., 1.) < ConfDownsample->get("Factor", "PLL")) { - registry.fill(HIST("pll/fSE_particle_downsample"), Q3); - lowQ3Triplets[CFTrigger::kPLL] += 1; - } - } else { - lowQ3Triplets[CFTrigger::kPLL] += 1; - } + q3 = getQ3(vecLambda.at(l1), vecLambda.at(l2), vecLambda.at(l3)); + registry.fill(HIST("PLL/fMultiplicity"), col.multNTracksPV()); + registry.fill(HIST("PLL/fZvtx"), col.posZ()); + registry.fill(HIST("PLL/fSE_particle"), q3); + registry.fill(HIST("PLL/fLambdaPtVsQ3"), vecLambda.at(l1).Pt(), q3); + registry.fill(HIST("PLL/fLambdaPtVsQ3"), vecLambda.at(l2).Pt(), q3); + registry.fill(HIST("PLL/fLambdaPtVsQ3"), vecLambda.at(l3).Pt(), q3); + if (q3 < TriggerSelections.limits->get("Loose Limit", "LLL")) { + signalLooseLimit[cf_trigger::kLLL] += 1; + if (q3 < TriggerSelections.limits->get("Tight Limit", "LLL")) { + signalTightLimit[cf_trigger::kLLL] += 1; } } } } - for (auto iAntiLambda1 = antilambdas.begin(); iAntiLambda1 != antilambdas.end(); ++iAntiLambda1) { - auto iAntiLambda2 = iAntiLambda1 + 1; - auto i1 = std::distance(antilambdas.begin(), iAntiLambda1); - for (; iAntiLambda2 != antilambdas.end(); ++iAntiLambda2) { - auto i2 = std::distance(antilambdas.begin(), iAntiLambda2); - if (ConfAutocorRejection.value && - (AntiLambdaPosDaughIndex.at(i1) == AntiLambdaPosDaughIndex.at(i2) || - AntiLambdaNegDaughIndex.at(i1) == AntiLambdaNegDaughIndex.at(i2))) { + } + for (size_t l1 = 0; l1 < vecAntiLambda.size(); l1++) { + for (size_t l2 = l1 + 1; l2 < vecAntiLambda.size(); l2++) { + for (size_t l3 = l2 + 1; l3 < vecAntiLambda.size(); l3++) { + if (idxAntiLambdaDaughProton.at(l1) == idxAntiLambdaDaughProton.at(l2) || idxAntiLambdaDaughPion.at(l1) == idxAntiLambdaDaughPion.at(l2) || + idxAntiLambdaDaughProton.at(l2) == idxAntiLambdaDaughProton.at(l3) || idxAntiLambdaDaughPion.at(l2) == idxAntiLambdaDaughPion.at(l3) || + idxAntiLambdaDaughProton.at(l3) == idxAntiLambdaDaughProton.at(l1) || idxAntiLambdaDaughPion.at(l3) == idxAntiLambdaDaughPion.at(l1)) { continue; } - for (auto iAntiProton1 = antiprotons.begin(); iAntiProton1 != antiprotons.end(); ++iAntiProton1) { - auto i3 = std::distance(antiprotons.begin(), iAntiProton1); - if (ConfAutocorRejection.value && - (AntiLambdaNegDaughIndex.at(i1) == AntiProtonIndex.at(i3) || - AntiLambdaNegDaughIndex.at(i2) == AntiProtonIndex.at(i3))) { - continue; - } - Q3 = getQ3(*iAntiLambda1, *iAntiLambda2, *iAntiProton1); - registry.fill(HIST("pll/fSE_antiparticle"), Q3); - registry.fill(HIST("pll/fAntiProtonPtVsQ3"), Q3, (*iAntiProton1).Pt()); - registry.fill(HIST("pll/fAntiLambdaPtVsQ3"), Q3, (*iAntiLambda1).Pt()); - registry.fill(HIST("pll/fAntiLambdaPtVsQ3"), Q3, (*iAntiLambda2).Pt()); - if (Q3 < ConfQ3Limits->get(static_cast(0), CFTrigger::kPLL)) { - if (ConfDownsample->get("Switch", "aPaLaL") > 0) { - if (rng->Uniform(0., 1.) < ConfDownsample->get("Factor", "aPaLaL")) { - registry.fill(HIST("pll/fSE_antiparticle_downsample"), Q3); - lowQ3Triplets[CFTrigger::kPLL] += 1; - } - } else { - lowQ3Triplets[CFTrigger::kPLL] += 1; - } + q3 = getQ3(vecAntiLambda.at(l1), vecAntiLambda.at(l2), vecAntiLambda.at(l3)); + registry.fill(HIST("PLL/fMultiplicity"), col.multNTracksPV()); + registry.fill(HIST("PLL/fZvtx"), col.posZ()); + registry.fill(HIST("PLL/fSE_particle"), q3); + registry.fill(HIST("PLL/fLambdaPtVsQ3"), vecAntiLambda.at(l1).Pt(), q3); + registry.fill(HIST("PLL/fLambdaPtVsQ3"), vecAntiLambda.at(l2).Pt(), q3); + registry.fill(HIST("PLL/fLambdaPtVsQ3"), vecAntiLambda.at(l3).Pt(), q3); + if (q3 < TriggerSelections.limits->get("Loose Limit", "LLL")) { + signalLooseLimit[cf_trigger::kLLL] += 1; + if (q3 < TriggerSelections.limits->get("Tight Limit", "LLL")) { + signalTightLimit[cf_trigger::kLLL] += 1; } } } } } - if (ConfTriggerSwitches->get("Switch", "LLL") > 0.) { - // lll trigger - for (auto iLambda1 = lambdas.begin(); iLambda1 != lambdas.end(); ++iLambda1) { - auto iLambda2 = iLambda1 + 1; - auto i1 = std::distance(lambdas.begin(), iLambda1); - for (; iLambda2 != lambdas.end(); ++iLambda2) { - auto i2 = std::distance(lambdas.begin(), iLambda2); - if (ConfAutocorRejection.value && - (LambdaPosDaughIndex.at(i1) == LambdaPosDaughIndex.at(i2) || - LambdaNegDaughIndex.at(i1) == LambdaNegDaughIndex.at(i2))) { + } + // PPPhi + if (TriggerSelections.filterSwitches->get("Switch", "PPPhi") > 0) { + for (size_t p1 = 0; p1 < vecProton.size(); p1++) { + for (size_t p2 = p1 + 1; p2 < vecProton.size(); p2++) { + for (size_t phi1 = 0; phi1 < vecPhi.size(); phi1++) { + if (idxProton.at(p1) == idxPhiDaughPos.at(phi1) || idxProton.at(p2) == idxPhiDaughPos.at(phi1)) { continue; } - auto iLambda3 = iLambda2 + 1; - for (; iLambda3 != lambdas.end(); ++iLambda3) { - auto i3 = std::distance(lambdas.begin(), iLambda3); - if (ConfAutocorRejection.value && - (LambdaPosDaughIndex.at(i1) == LambdaPosDaughIndex.at(i3) || - LambdaNegDaughIndex.at(i1) == LambdaNegDaughIndex.at(i3) || - LambdaPosDaughIndex.at(i2) == LambdaPosDaughIndex.at(i3) || - LambdaNegDaughIndex.at(i2) == LambdaNegDaughIndex.at(i3))) { - continue; - } - Q3 = getQ3(*iLambda1, *iLambda2, *iLambda3); - registry.fill(HIST("lll/fSE_particle"), Q3); - registry.fill(HIST("lll/fLambdaPtVsQ3"), Q3, (*iLambda1).Pt()); - registry.fill(HIST("lll/fLambdaPtVsQ3"), Q3, (*iLambda2).Pt()); - registry.fill(HIST("lll/fLambdaPtVsQ3"), Q3, (*iLambda3).Pt()); - if (Q3 < ConfQ3Limits->get(static_cast(0), CFTrigger::kLLL)) { - if (ConfDownsample->get("Switch", "LLL") > 0) { - if (rng->Uniform(0., 1.) < ConfDownsample->get("Factor", "LLL")) { - registry.fill(HIST("lll/fSE_particle_downsample"), Q3); - lowQ3Triplets[CFTrigger::kLLL] += 1; - } - } else { - lowQ3Triplets[CFTrigger::kLLL] += 1; - } + q3 = getQ3(vecProton.at(p1), vecProton.at(p2), vecPhi.at(phi1)); + registry.fill(HIST("PPPhi/fMultiplicity"), col.multNTracksPV()); + registry.fill(HIST("PPPhi/fZvtx"), col.posZ()); + registry.fill(HIST("PPPhi/fSE_particle"), q3); + registry.fill(HIST("PPPhi/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); + registry.fill(HIST("PPPhi/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); + registry.fill(HIST("PPPhi/fPhiPtVsQ3"), vecPhi.at(phi1).Pt(), q3); + registry.fill(HIST("PPPhi/fPhiInvMassVsQ3"), vecPhi.at(phi1).M(), q3); + if (q3 < TriggerSelections.limits->get("Loose Limit", "PPPhi")) { + if (q3 < TriggerSelections.limits->get("Tight Limit", "PPPhi") && + vecPhi.at(phi1).M() > PhiSelections.tightInvMassLow.value && vecPhi.at(phi1).M() < PhiSelections.tightInvMassUp.value) { + signalTightLimit[cf_trigger::kPPPhi] += 1; } } } } - for (auto iAntiLambda1 = antilambdas.begin(); iAntiLambda1 != antilambdas.end(); ++iAntiLambda1) { - auto iAntiLambda2 = iAntiLambda1 + 1; - auto i1 = std::distance(antilambdas.begin(), iAntiLambda1); - for (; iAntiLambda2 != antilambdas.end(); ++iAntiLambda2) { - auto i2 = std::distance(antilambdas.begin(), iAntiLambda2); - if (ConfAutocorRejection.value && - (AntiLambdaPosDaughIndex.at(i1) == AntiLambdaPosDaughIndex.at(i2) || - AntiLambdaNegDaughIndex.at(i1) == AntiLambdaNegDaughIndex.at(i2))) { + } + for (size_t p1 = 0; p1 < vecAntiProton.size(); p1++) { + for (size_t p2 = p1 + 1; p2 < vecAntiProton.size(); p2++) { + for (size_t phi1 = 0; phi1 < vecPhi.size(); phi1++) { + if (idxAntiProton.at(p1) == idxPhiDaughNeg.at(phi1) || idxAntiProton.at(p2) == idxPhiDaughNeg.at(phi1)) { continue; } - auto iAntiLambda3 = iAntiLambda2 + 1; - for (; iAntiLambda3 != antilambdas.end(); ++iAntiLambda3) { - auto i3 = std::distance(antilambdas.begin(), iAntiLambda3); - if (ConfAutocorRejection.value && - (AntiLambdaPosDaughIndex.at(i1) == AntiLambdaPosDaughIndex.at(i3) || - AntiLambdaNegDaughIndex.at(i1) == AntiLambdaNegDaughIndex.at(i3) || - AntiLambdaPosDaughIndex.at(i2) == AntiLambdaPosDaughIndex.at(i3) || - AntiLambdaNegDaughIndex.at(i2) == AntiLambdaNegDaughIndex.at(i3))) { - continue; - } - Q3 = getQ3(*iAntiLambda1, *iAntiLambda2, *iAntiLambda3); - registry.fill(HIST("lll/fSE_antiparticle"), Q3); - registry.fill(HIST("lll/fAntiLambdaPtVsQ3"), Q3, (*iAntiLambda1).Pt()); - registry.fill(HIST("lll/fAntiLambdaPtVsQ3"), Q3, (*iAntiLambda2).Pt()); - registry.fill(HIST("lll/fAntiLambdaPtVsQ3"), Q3, (*iAntiLambda3).Pt()); - if (Q3 < ConfQ3Limits->get(static_cast(0), CFTrigger::kLLL)) { - if (ConfDownsample->get("Switch", "aLaLaL") > 0) { - if (rng->Uniform(0., 1.) < ConfDownsample->get("Factor", "aLaLaL")) { - registry.fill(HIST("lll/fSE_antiparticle_downsample"), Q3); - lowQ3Triplets[CFTrigger::kLLL] += 1; - } - } else { - lowQ3Triplets[CFTrigger::kLLL] += 1; - } + q3 = getQ3(vecAntiProton.at(p1), vecAntiProton.at(p2), vecPhi.at(phi1)); + registry.fill(HIST("PPPhi/fMultiplicity"), col.multNTracksPV()); + registry.fill(HIST("PPPhi/fZvtx"), col.posZ()); + registry.fill(HIST("PPPhi/fSE_particle"), q3); + registry.fill(HIST("PPPhi/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); + registry.fill(HIST("PPPhi/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); + registry.fill(HIST("PPPhi/fPhiPtVsQ3"), vecPhi.at(phi1).Pt(), q3); + registry.fill(HIST("PPPhi/fPhiInvMassVsQ3"), vecPhi.at(phi1).M(), q3); + if (q3 < TriggerSelections.limits->get("Loose Limit", "PPPhi")) { + if (q3 < TriggerSelections.limits->get("Tight Limit", "PPPhi") && + vecPhi.at(phi1).M() > PhiSelections.tightInvMassLow.value && vecPhi.at(phi1).M() < PhiSelections.tightInvMassUp.value) { + signalTightLimit[cf_trigger::kPPPhi] += 1; } } } } } - if (ConfTriggerSwitches->get("Switch", "ppPhi") > 0.) { - // ppphi trigger - for (auto iProton1 = protons.begin(); iProton1 != protons.end(); ++iProton1) { - auto iProton2 = iProton1 + 1; - for (; iProton2 != protons.end(); ++iProton2) { - for (auto iPhi1 = phi.begin(); iPhi1 != phi.end(); ++iPhi1) { - Q3 = getQ3(*iProton1, *iProton2, *iPhi1); - registry.fill(HIST("ppphi/fSE_particle"), Q3); - registry.fill(HIST("ppphi/fProtonPtVsQ3"), Q3, (*iProton1).Pt()); - registry.fill(HIST("ppphi/fProtonPtVsQ3"), Q3, (*iProton2).Pt()); - registry.fill(HIST("ppphi/fPhiPtVsQ3"), Q3, (*iPhi1).Pt()); - if (Q3 < ConfQ3Limits->get(static_cast(0), CFTrigger::kPPPhi)) { - if (ConfDownsample->get("Switch", "PPPhi") > 0) { - if (rng->Uniform(0., 1.) < ConfDownsample->get("Factor", "PPPhi")) { - registry.fill(HIST("ppphi/fSE_particle_downsample"), Q3); - lowQ3Triplets[CFTrigger::kPPPhi] += 1; - } - } else { - lowQ3Triplets[CFTrigger::kPPPhi] += 1; - } + } + // PPRho + if (TriggerSelections.filterSwitches->get("Switch", "PPRho") > 0) { + for (size_t p1 = 0; p1 < vecProton.size(); p1++) { + for (size_t p2 = p1 + 1; p2 < vecProton.size(); p2++) { + for (size_t r1 = 0; r1 < vecRho.size(); r1++) { + if (idxProton.at(p1) == idxRhoDaughPos.at(r1) || idxProton.at(p2) == idxRhoDaughPos.at(r1)) { + continue; + } + q3 = getQ3(vecProton.at(p1), vecProton.at(p2), vecRho.at(r1)); + registry.fill(HIST("PPRho/fMultiplicity"), col.multNTracksPV()); + registry.fill(HIST("PPRho/fZvtx"), col.posZ()); + registry.fill(HIST("PPRho/fSE_particle"), q3); + registry.fill(HIST("PPRho/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); + registry.fill(HIST("PPRho/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); + registry.fill(HIST("PPRho/fRhoPtVsQ3"), vecRho.at(r1).Pt(), q3); + registry.fill(HIST("PPRho/fRhoInvMassVsQ3"), vecRho.at(r1).M(), q3); + if (q3 < TriggerSelections.limits->get("Loose Limit", "PPRho")) { + if (q3 < TriggerSelections.limits->get("Tight Limit", "PPRho") && + vecRho.at(r1).M() > RhoSelections.tightInvMassLow.value && vecRho.at(r1).M() < RhoSelections.tightInvMassUp.value) { + signalTightLimit[cf_trigger::kPPRho] += 1; } } } } - // apapphi trigger - for (auto iAntiProton1 = antiprotons.begin(); iAntiProton1 != antiprotons.end(); ++iAntiProton1) { - auto iAntiProton2 = iAntiProton1 + 1; - for (; iAntiProton2 != antiprotons.end(); ++iAntiProton2) { - for (auto iPhi1 = phi.begin(); iPhi1 != phi.end(); ++iPhi1) { - Q3 = getQ3(*iAntiProton1, *iAntiProton2, *iPhi1); - registry.fill(HIST("ppphi/fSE_antiparticle"), Q3); - registry.fill(HIST("ppphi/fAntiProtonPtVsQ3"), Q3, (*iAntiProton1).Pt()); - registry.fill(HIST("ppphi/fAntiProtonPtVsQ3"), Q3, (*iAntiProton2).Pt()); - registry.fill(HIST("ppphi/fAntiPhiPtVsQ3"), Q3, (*iPhi1).Pt()); - if (Q3 < ConfQ3Limits->get(static_cast(0), CFTrigger::kPPPhi)) { - if (ConfDownsample->get("Switch", "aPaPPhi") > 0) { - if (rng->Uniform(0., 1.) < ConfDownsample->get("Factor", "aPaPPhi")) { - registry.fill(HIST("ppphi/fSE_antiparticle_downsample"), Q3); - lowQ3Triplets[CFTrigger::kPPPhi] += 1; - } - } else { - lowQ3Triplets[CFTrigger::kPPPhi] += 1; - } + } + for (size_t p1 = 0; p1 < vecAntiProton.size(); p1++) { + for (size_t p2 = p1 + 1; p2 < vecAntiProton.size(); p2++) { + for (size_t r1 = 0; r1 < vecRho.size(); r1++) { + if (idxAntiProton.at(p1) == idxRhoDaughNeg.at(r1) || idxAntiProton.at(p2) == idxRhoDaughNeg.at(r1)) { + continue; + } + q3 = getQ3(vecAntiProton.at(p1), vecAntiProton.at(p2), vecRho.at(r1)); + registry.fill(HIST("PPRho/fMultiplicity"), col.multNTracksPV()); + registry.fill(HIST("PPRho/fZvtx"), col.posZ()); + registry.fill(HIST("PPRho/fSE_antiparticle"), q3); + registry.fill(HIST("PPRho/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); + registry.fill(HIST("PPRho/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); + registry.fill(HIST("PPRho/fRhoPtVsQ3"), vecRho.at(r1).Pt(), q3); + registry.fill(HIST("PPRho/fRhoInvMassVsQ3"), vecRho.at(r1).M(), q3); + if (q3 < TriggerSelections.limits->get("Loose Limit", "PPRho")) { + if (q3 < TriggerSelections.limits->get("Tight Limit", "PPRho") && + vecRho.at(r1).M() > RhoSelections.tightInvMassLow.value && vecRho.at(r1).M() < RhoSelections.tightInvMassUp.value) { + signalTightLimit[cf_trigger::kPPRho] += 1; } } } } } - if (ConfTriggerSwitches->get("Switch", "ppRho") > 0.) { - // ppRho trigger - for (size_t i = 0; i < protons.size(); ++i) { - for (size_t j = i + 1; j < protons.size(); ++j) { - for (const auto& rhoParticle : rho) { - const auto& Proton1 = protons[i]; - const auto& Proton2 = protons[j]; - - Q3 = getQ3(Proton1, Proton2, rhoParticle); - - registry.fill(HIST("ppRho/fSE_particle"), Q3); - registry.fill(HIST("ppRho/fProtonPtVsQ3"), Q3, Proton1.Pt()); - registry.fill(HIST("ppRho/fProtonPtVsQ3"), Q3, Proton2.Pt()); - registry.fill(HIST("ppRho/fRhoCandPtVsQ3"), Q3, rhoParticle.Pt()); - - if (Q3 < ConfQ3Limits->get(static_cast(0), CFTrigger::kPPRho)) { - if (ConfDownsample->get("Switch", "PPRho") > 0) { - if (rng->Uniform(0., 1.) < ConfDownsample->get("Factor", "PPRho")) { - registry.fill(HIST("ppRho/fSE_particle_downsample"), Q3); - lowQ3Triplets[CFTrigger::kPPRho] += 1; - } - } else { - lowQ3Triplets[CFTrigger::kPPRho] += 1; - } - } + } + // PD + if (TriggerSelections.filterSwitches->get("Switch", "PD") > 0) { + for (size_t p1 = 0; p1 < vecProton.size(); p1++) { + for (size_t d1 = 0; d1 < vecDeuteron.size(); d1++) { + if (idxProton.at(p1) == idxDeuteron.at(d1)) { + continue; + } + kstar = getkstar(vecProton.at(p1), vecDeuteron.at(d1)); + registry.fill(HIST("PD/fMultiplicity"), col.multNTracksPV()); + registry.fill(HIST("PD/fZvtx"), col.posZ()); + registry.fill(HIST("PD/fSE_particle"), kstar); + registry.fill(HIST("PD/fProtonPtVskstar"), vecProton.at(p1).Pt(), kstar); + registry.fill(HIST("PD/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); + if (kstar < TriggerSelections.limits->get("Loose Limit", "PD")) { + signalLooseLimit[cf_trigger::kPD] += 1; + if (kstar < TriggerSelections.limits->get("Tight Limit", "PD")) { + signalTightLimit[cf_trigger::kPD] += 1; } } } - // apapRho trigger - for (size_t i = 0; i < antiprotons.size(); ++i) { - for (size_t j = i + 1; j < antiprotons.size(); ++j) { - for (const auto& rhoParticle : rho) { - const auto& antiProton1 = antiprotons[i]; - const auto& antiProton2 = antiprotons[j]; - - Q3 = getQ3(antiProton1, antiProton2, rhoParticle); - - registry.fill(HIST("ppRho/fSE_antiparticle"), Q3); - registry.fill(HIST("ppRho/fAntiProtonPtVsQ3"), Q3, antiProton1.Pt()); - registry.fill(HIST("ppRho/fAntiProtonPtVsQ3"), Q3, antiProton2.Pt()); - registry.fill(HIST("ppRho/fRhoCandPtVsQ3"), Q3, rhoParticle.Pt()); - - if (Q3 < ConfQ3Limits->get(static_cast(0), CFTrigger::kPPRho)) { - if (ConfDownsample->get("Switch", "aPaPRho") > 0) { - if (rng->Uniform(0., 1.) < ConfDownsample->get("Factor", "aPaPRho")) { - registry.fill(HIST("ppRho/fSE_antiparticle_downsample"), Q3); - lowQ3Triplets[CFTrigger::kPPRho] += 1; - } - } else { - lowQ3Triplets[CFTrigger::kPPRho] += 1; - } - } + } + for (size_t p1 = 0; p1 < vecAntiProton.size(); p1++) { + for (size_t d1 = 0; d1 < vecAntiDeuteron.size(); d1++) { + if (idxAntiProton.at(p1) == idxAntiDeuteron.at(d1)) { + continue; + } + kstar = getkstar(vecAntiProton.at(p1), vecAntiDeuteron.at(d1)); + registry.fill(HIST("PD/fMultiplicity"), col.multNTracksPV()); + registry.fill(HIST("PD/fZvtx"), col.posZ()); + registry.fill(HIST("PD/fSE_antiparticle"), kstar); + registry.fill(HIST("PD/fAntiProtonPtVskstar"), vecAntiProton.at(p1).Pt(), kstar); + registry.fill(HIST("PD/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); + if (kstar < TriggerSelections.limits->get("Loose Limit", "PD")) { + signalLooseLimit[cf_trigger::kPD] += 1; + if (kstar < TriggerSelections.limits->get("Tight Limit", "PD")) { + signalTightLimit[cf_trigger::kPD] += 1; } } } } - - if (ConfTriggerSwitches->get("Switch", "pd") > 0.) { - // pd trigger - for (auto iProton = protons.begin(); iProton != protons.end(); ++iProton) { - for (auto iDeuteron = deuterons.begin(); iDeuteron != deuterons.end(); ++iDeuteron) { - kstar = getkstar(*iProton, *iDeuteron); - registry.fill(HIST("pd/fSE_particle"), kstar); - registry.fill(HIST("pd/fProtonPtVskstar"), kstar, (*iProton).Pt()); - registry.fill(HIST("pd/fDeuteronPtVskstar"), kstar, (*iDeuteron).Pt()); - if (kstar < ConfKstarLimits->get(static_cast(0), CFTrigger::kPD)) { - if (ConfDownsample->get("Switch", "PD") > 0) { - if (rng->Uniform(0., 1.) < ConfDownsample->get("Factor", "PD")) { - registry.fill(HIST("pd/fSE_particle_downsample"), kstar); - lowKstarPairs[CFTrigger::kPD] += 1; - } - } else { - lowKstarPairs[CFTrigger::kPD] += 1; - } + } + // LD + if (TriggerSelections.filterSwitches->get("Switch", "LD") > 0) { + for (size_t l1 = 0; l1 < vecLambda.size(); l1++) { + for (size_t d1 = 0; d1 < vecDeuteron.size(); d1++) { + if (idxLambdaDaughProton.at(l1) == idxDeuteron.at(d1)) { + continue; + } + kstar = getkstar(vecLambda.at(l1), vecDeuteron.at(d1)); + registry.fill(HIST("LD/fMultiplicity"), col.multNTracksPV()); + registry.fill(HIST("LD/fZvtx"), col.posZ()); + registry.fill(HIST("LD/fSE_particle"), kstar); + registry.fill(HIST("LD/fLambdaPtVskstar"), vecLambda.at(l1).Pt(), kstar); + registry.fill(HIST("LD/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); + if (kstar < TriggerSelections.limits->get("Loose Limit", "LD")) { + signalLooseLimit[cf_trigger::kLD] += 1; + if (kstar < TriggerSelections.limits->get("Tight Limit", "LD")) { + signalTightLimit[cf_trigger::kLD] += 1; } } } - - for (auto iAntiProton = antiprotons.begin(); iAntiProton != antiprotons.end(); ++iAntiProton) { - for (auto iAntiDeuteron = antideuterons.begin(); iAntiDeuteron != antideuterons.end(); ++iAntiDeuteron) { - kstar = getkstar(*iAntiProton, *iAntiDeuteron); - registry.fill(HIST("pd/fSE_antiparticle"), kstar); - registry.fill(HIST("pd/fAntiProtonPtVskstar"), kstar, (*iAntiProton).Pt()); - registry.fill(HIST("pd/fAntiDeuteronPtVskstar"), kstar, (*iAntiDeuteron).Pt()); - if (kstar < ConfKstarLimits->get(static_cast(0), CFTrigger::kPD)) { - if (ConfDownsample->get("Switch", "aPaD") > 0) { - if (rng->Uniform(0., 1.) < ConfDownsample->get("Factor", "aPaD")) { - registry.fill(HIST("pd/fSE_antiparticle_downsample"), kstar); - lowKstarPairs[CFTrigger::kPD] += 1; - } - } else { - lowKstarPairs[CFTrigger::kPD] += 1; - } + } + for (size_t l1 = 0; l1 < vecAntiLambda.size(); l1++) { + for (size_t d1 = 0; d1 < vecAntiDeuteron.size(); d1++) { + if (idxAntiLambdaDaughProton.at(l1) == idxAntiDeuteron.at(d1)) { + continue; + } + kstar = getkstar(vecAntiLambda.at(l1), vecAntiDeuteron.at(d1)); + registry.fill(HIST("LD/fMultiplicity"), col.multNTracksPV()); + registry.fill(HIST("LD/fZvtx"), col.posZ()); + registry.fill(HIST("LD/fSE_antiparticle"), kstar); + registry.fill(HIST("LD/fAntiLambdaPtVskstar"), vecAntiLambda.at(l1).Pt(), kstar); + registry.fill(HIST("LD/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); + if (kstar < TriggerSelections.limits->get("Loose Limit", "LD")) { + signalLooseLimit[cf_trigger::kLD] += 1; + if (kstar < TriggerSelections.limits->get("Tight Limit", "LD")) { + signalTightLimit[cf_trigger::kLD] += 1; } } } } - if (ConfTriggerSwitches->get("Switch", "Ld") > 0.) { - // ld trigger - for (auto iDeuteron = deuterons.begin(); iDeuteron != deuterons.end(); ++iDeuteron) { - for (auto iLambda = lambdas.begin(); iLambda != lambdas.end(); ++iLambda) { - kstar = getkstar(*iDeuteron, *iLambda); - registry.fill(HIST("ld/fSE_particle"), kstar); - registry.fill(HIST("ld/fDeuteronPtVskstar"), kstar, (*iDeuteron).Pt()); - registry.fill(HIST("ld/fLambdaPtVskstar"), kstar, (*iLambda).Pt()); - if (kstar < ConfKstarLimits->get(static_cast(0), CFTrigger::kLD)) { - if (ConfDownsample->get("Switch", "LD") > 0) { - if (rng->Uniform(0., 1.) < ConfDownsample->get("Factor", "LD")) { - registry.fill(HIST("ld/fSE_particle_downsample"), kstar); - lowKstarPairs[CFTrigger::kLD] += 1; - } - } else { - lowKstarPairs[CFTrigger::kLD] += 1; - } + } + // PhiD + if (TriggerSelections.filterSwitches->get("Switch", "PhiD") > 0) { + for (size_t phi1 = 0; phi1 < vecPhi.size(); phi1++) { + for (size_t d1 = 0; d1 < vecDeuteron.size(); d1++) { + if (idxPhiDaughPos.at(phi1) == idxDeuteron.at(d1)) { + continue; + } + kstar = getkstar(vecPhi.at(phi1), vecDeuteron.at(d1)); + registry.fill(HIST("PhiD/fMultiplicity"), col.multNTracksPV()); + registry.fill(HIST("PhiD/fZvtx"), col.posZ()); + registry.fill(HIST("PhiD/fSE_particle"), kstar); + registry.fill(HIST("PhiD/fPhiPtVskstar"), vecPhi.at(phi1).Pt(), kstar); + registry.fill(HIST("PhiD/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); + registry.fill(HIST("PhiD/fPhiInvMassVskstar"), vecPhi.at(phi1).M(), kstar); + if (kstar < TriggerSelections.limits->get("Loose Limit", "PhiD")) { + signalLooseLimit[cf_trigger::kPhiD] += 1; + if (kstar < TriggerSelections.limits->get("Tight Limit", "PhiD") && + vecPhi.at(phi1).M() > PhiSelections.tightInvMassLow.value && vecPhi.at(phi1).M() < PhiSelections.tightInvMassUp.value) { + signalTightLimit[cf_trigger::kPhiD] += 1; } } } - for (auto iAntiDeuteron = antideuterons.begin(); iAntiDeuteron != antideuterons.end(); ++iAntiDeuteron) { - for (auto iAntiLambda = antilambdas.begin(); iAntiLambda != antilambdas.end(); ++iAntiLambda) { - kstar = getkstar(*iAntiDeuteron, *iAntiLambda); - registry.fill(HIST("ld/fSE_antiparticle"), kstar); - registry.fill(HIST("ld/fAntiDeuteronPtVskstar"), kstar, (*iAntiDeuteron).Pt()); - registry.fill(HIST("ld/fAntiLambdaPtVskstar"), kstar, (*iAntiLambda).Pt()); - if (kstar < ConfKstarLimits->get(static_cast(0), CFTrigger::kLD)) { - if (ConfDownsample->get("Switch", "aLaD") > 0) { - if (rng->Uniform(0., 1.) < ConfDownsample->get("Factor", "aLaD")) { - registry.fill(HIST("ld/fSE_antiparticle_downsample"), kstar); - lowKstarPairs[CFTrigger::kLD] += 1; - } - } else { - lowKstarPairs[CFTrigger::kLD] += 1; - } + } + for (size_t phi1 = 0; phi1 < vecPhi.size(); phi1++) { + for (size_t d1 = 0; d1 < vecAntiDeuteron.size(); d1++) { + if (idxPhiDaughNeg.at(phi1) == idxAntiDeuteron.at(d1)) { + continue; + } + kstar = getkstar(vecPhi.at(phi1), vecAntiDeuteron.at(d1)); + registry.fill(HIST("PhiD/fMultiplicity"), col.multNTracksPV()); + registry.fill(HIST("PhiD/fZvtx"), col.posZ()); + registry.fill(HIST("PhiD/fSE_antiparticle"), kstar); + registry.fill(HIST("PhiD/fPhiPtVskstar"), vecPhi.at(phi1).Pt(), kstar); + registry.fill(HIST("PhiD/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); + registry.fill(HIST("PhiD/fPhiInvMassVskstar"), vecPhi.at(phi1).M(), kstar); + if (kstar < TriggerSelections.limits->get("Loose Limit", "PhiD")) { + signalLooseLimit[cf_trigger::kPhiD] += 1; + if (kstar < TriggerSelections.limits->get("Tight Limit", "PhiD") && + vecPhi.at(phi1).M() > PhiSelections.tightInvMassLow.value && vecPhi.at(phi1).M() < PhiSelections.tightInvMassUp.value) { + signalTightLimit[cf_trigger::kPhiD] += 1; } } } } - } // if(isSelectedEvent) - - // create tags for three body triggers - if (lowQ3Triplets[CFTrigger::kPPP] > 0) { - keepEvent3N[CFTrigger::kPPP] = true; - registry.fill(HIST("fProcessedEvents"), 2); - registry.fill(HIST("ppp/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("ppp/fZvtx"), col.posZ()); - } - if (lowQ3Triplets[CFTrigger::kPPL] > 0) { - keepEvent3N[CFTrigger::kPPL] = true; - registry.fill(HIST("fProcessedEvents"), 3); - registry.fill(HIST("ppl/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("ppl/fZvtx"), col.posZ()); } - if (lowQ3Triplets[CFTrigger::kPLL] > 0) { - keepEvent3N[CFTrigger::kPLL] = true; - registry.fill(HIST("fProcessedEvents"), 4); - registry.fill(HIST("pll/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("pll/fZvtx"), col.posZ()); - } - if (lowQ3Triplets[CFTrigger::kLLL] > 0) { - keepEvent3N[CFTrigger::kLLL] = true; - registry.fill(HIST("fProcessedEvents"), 5); - registry.fill(HIST("lll/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("lll/fZvtx"), col.posZ()); - } - if (lowQ3Triplets[CFTrigger::kPPPhi] > 0) { - keepEvent3N[CFTrigger::kPPPhi] = true; - registry.fill(HIST("fProcessedEvents"), 6); - registry.fill(HIST("ppphi/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("ppphi/fZvtx"), col.posZ()); - } - if (lowQ3Triplets[CFTrigger::kPPRho] > 0) { - keepEvent3N[CFTrigger::kPPRho] = true; - registry.fill(HIST("fProcessedEvents"), 7); - registry.fill(HIST("ppRho/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("ppRho/fZvtx"), col.posZ()); + // RhoD + if (TriggerSelections.filterSwitches->get("Switch", "RhoD") > 0) { + for (size_t r1 = 0; r1 < vecRho.size(); r1++) { + for (size_t d1 = 0; d1 < vecDeuteron.size(); d1++) { + if (idxRhoDaughPos.at(r1) == idxDeuteron.at(d1)) { + continue; + } + kstar = getkstar(vecRho.at(r1), vecDeuteron.at(d1)); + registry.fill(HIST("RhoD/fMultiplicity"), col.multNTracksPV()); + registry.fill(HIST("RhoD/fZvtx"), col.posZ()); + registry.fill(HIST("RhoD/fSE_particle"), kstar); + registry.fill(HIST("RhoD/fRhoPtVskstar"), vecRho.at(r1).Pt(), kstar); + registry.fill(HIST("RhoD/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); + registry.fill(HIST("RhoD/fRhoInvMassVskstar"), vecRho.at(r1).M(), kstar); + if (kstar < TriggerSelections.limits->get("Loose Limit", "RhoD")) { + signalLooseLimit[cf_trigger::kRhoD] += 1; + if (kstar < TriggerSelections.limits->get("Tight Limit", "RhoD") && + vecRho.at(r1).M() > RhoSelections.tightInvMassLow.value && vecRho.at(r1).M() < RhoSelections.tightInvMassUp.value) { + signalTightLimit[cf_trigger::kRhoD] += 1; + } + } + } + } + for (size_t r1 = 0; r1 < vecRho.size(); r1++) { + for (size_t d1 = 0; d1 < vecAntiDeuteron.size(); d1++) { + if (idxRhoDaughNeg.at(r1) == idxAntiDeuteron.at(d1)) { + continue; + } + kstar = getkstar(vecRho.at(r1), vecAntiDeuteron.at(d1)); + registry.fill(HIST("RhoD/fMultiplicity"), col.multNTracksPV()); + registry.fill(HIST("RhoD/fZvtx"), col.posZ()); + registry.fill(HIST("RhoD/fSE_antiparticle"), kstar); + registry.fill(HIST("RhoD/fRhoPtVskstar"), vecRho.at(r1).Pt(), kstar); + registry.fill(HIST("RhoD/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); + registry.fill(HIST("RhoD/fRhoInvMassVskstar"), vecRho.at(r1).M(), kstar); + if (kstar < TriggerSelections.limits->get("Loose Limit", "RhoD")) { + signalLooseLimit[cf_trigger::kRhoD] += 1; + if (kstar < TriggerSelections.limits->get("Tight Limit", "RhoD") && + vecRho.at(r1).M() > RhoSelections.tightInvMassLow.value && vecRho.at(r1).M() < RhoSelections.tightInvMassUp.value) { + signalTightLimit[cf_trigger::kRhoD] += 1; + } + } + } + } } - // create tags for two body triggers - if (lowKstarPairs[CFTrigger::kPD] > 0) { - keepEvent2N[CFTrigger::kPD] = true; - registry.fill(HIST("fProcessedEvents"), 8); - registry.fill(HIST("pd/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("pd/fZvtx"), col.posZ()); - } - if (lowKstarPairs[CFTrigger::kLD] > 0) { - keepEvent2N[CFTrigger::kLD] = true; - registry.fill(HIST("fProcessedEvents"), 9); - registry.fill(HIST("ld/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("ld/fZvtx"), col.posZ()); + for (int i = 0; i < cf_trigger::kNTriggers; i++) { + if (signalLooseLimit[i] > 0) { + registry.fill(HIST("fProcessedEvents"), 3 + 2 * i); // need offset for filling + keepEventLooseLimit[i] = true; + } + if (signalTightLimit[i] > 0) { + registry.fill(HIST("fProcessedEvents"), 3 + 2 * i + 1); // need offset for filling + keepEventTightLimit[i] = true; + } + for (int j = i; j < cf_trigger::kNTriggers; j++) { + if (signalLooseLimit[i] > 0 && signalLooseLimit[j]) { + registry.fill(HIST("fTriggerCorrelations"), 2 * i, 2 * j); + } + if (signalLooseLimit[i] > 0 && signalTightLimit[j]) { // only one combination needed, fill only entries above diagonal + registry.fill(HIST("fTriggerCorrelations"), 2 * i, 2 * j + 1); + } + if (signalTightLimit[i] > 0 && signalTightLimit[j]) { + registry.fill(HIST("fTriggerCorrelations"), 2 * i + 1, 2 * j + 1); + } + } } - tags(keepEvent3N[CFTrigger::kPPP], - keepEvent3N[CFTrigger::kPPL], - keepEvent3N[CFTrigger::kPLL], - keepEvent3N[CFTrigger::kLLL], - keepEvent3N[CFTrigger::kPPPhi], - // keepEvent3N[CFTrigger::kPPRho], //To be changed once trigger is integrated - keepEvent2N[CFTrigger::kPD], - keepEvent2N[CFTrigger::kLD]); - - if (!keepEvent3N[CFTrigger::kPPP] && !keepEvent3N[CFTrigger::kPPL] && !keepEvent3N[CFTrigger::kPLL] && !keepEvent3N[CFTrigger::kLLL] && !keepEvent3N[CFTrigger::kPPPhi] && !keepEvent3N[CFTrigger::kPPRho] && - !keepEvent2N[CFTrigger::kPD] && !keepEvent2N[CFTrigger::kLD]) { + if (keepEventLooseLimit[cf_trigger::kPPP] || + keepEventLooseLimit[cf_trigger::kPPL] || + keepEventLooseLimit[cf_trigger::kPLL] || + keepEventLooseLimit[cf_trigger::kLLL] || + keepEventLooseLimit[cf_trigger::kPPPhi] || + keepEventLooseLimit[cf_trigger::kPPRho] || + keepEventLooseLimit[cf_trigger::kPD] || + keepEventLooseLimit[cf_trigger::kLD] || + keepEventLooseLimit[cf_trigger::kPhiD] || + keepEventLooseLimit[cf_trigger::kRhoD]) { registry.fill(HIST("fProcessedEvents"), 1); } - } + + if (keepEventTightLimit[cf_trigger::kPPP] || + keepEventTightLimit[cf_trigger::kPPL] || + keepEventTightLimit[cf_trigger::kPLL] || + keepEventTightLimit[cf_trigger::kLLL] || + keepEventTightLimit[cf_trigger::kPPPhi] || + keepEventTightLimit[cf_trigger::kPPRho] || + keepEventTightLimit[cf_trigger::kPD] || + keepEventTightLimit[cf_trigger::kLD] || + keepEventTightLimit[cf_trigger::kPhiD] || + keepEventTightLimit[cf_trigger::kRhoD]) { + registry.fill(HIST("fProcessedEvents"), 2); + } + + tags(keepEventTightLimit[cf_trigger::kPPP], keepEventLooseLimit[cf_trigger::kPPP], + keepEventTightLimit[cf_trigger::kPPL], keepEventLooseLimit[cf_trigger::kPPL], + keepEventTightLimit[cf_trigger::kPLL], keepEventLooseLimit[cf_trigger::kPLL], + keepEventTightLimit[cf_trigger::kLLL], keepEventLooseLimit[cf_trigger::kLLL], + keepEventTightLimit[cf_trigger::kPPPhi], keepEventLooseLimit[cf_trigger::kPPPhi], + keepEventTightLimit[cf_trigger::kPPRho], keepEventLooseLimit[cf_trigger::kPPRho], + keepEventTightLimit[cf_trigger::kPD], keepEventLooseLimit[cf_trigger::kPD], + keepEventTightLimit[cf_trigger::kLD], keepEventLooseLimit[cf_trigger::kLD], + keepEventTightLimit[cf_trigger::kPhiD], keepEventLooseLimit[cf_trigger::kPhiD], + keepEventTightLimit[cf_trigger::kRhoD], keepEventLooseLimit[cf_trigger::kRhoD]); + }; }; WorkflowSpec defineDataProcessing(ConfigContext const& cfg) { - return WorkflowSpec{adaptAnalysisTask(cfg)}; + return WorkflowSpec{adaptAnalysisTask(cfg)}; } diff --git a/EventFiltering/filterTables.h b/EventFiltering/filterTables.h index 1d0212eb9f0..363a7176165 100644 --- a/EventFiltering/filterTables.h +++ b/EventFiltering/filterTables.h @@ -102,15 +102,28 @@ DECLARE_SOA_COLUMN(HfBtoJPsiPrKa, hasHfBtoJPsiPrKa, bool); DECLARE_SOA_COLUMN(HfBtoJPsiPi, hasHfBtoJPsiPi, bool); //! Bc -> JPsi(->mumu)pi+ // CF two body triggers -DECLARE_SOA_COLUMN(PD, hasPD, bool); //! has d-p pair -DECLARE_SOA_COLUMN(LD, hasLD, bool); //! has l-d pair +DECLARE_SOA_COLUMN(PD_TightKstar, hasPD_TightKstar, bool); //! has d-p pair with tight kstar limit +DECLARE_SOA_COLUMN(PD_LooseKstar, hasPD_LooseKstar, bool); //! has d-p pair with loose kstar limit +DECLARE_SOA_COLUMN(LD_TightKstar, hasLD_TightKstar, bool); //! has l-d pair with tight kstar limit +DECLARE_SOA_COLUMN(LD_LooseKstar, hasLD_LooseKstar, bool); //! has l-d pair with loose kstar limit +DECLARE_SOA_COLUMN(PHID_TightKstar, hasPHID_TightKstar, bool); //! has phi-d pair with tight kstar limit +DECLARE_SOA_COLUMN(PHID_LooseKstar, hasPHID_LooseKstar, bool); //! has phi-d pair with loose kstar limit +DECLARE_SOA_COLUMN(RHOD_TightKstar, hasRHOD_TightKstar, bool); //! has rho-d pair with tight kstar limit +DECLARE_SOA_COLUMN(RHOD_LooseKstar, hasRHOD_LooseKstar, bool); //! has rho-d pair with loose kstar limit // CF three body triggers -DECLARE_SOA_COLUMN(PPP, hasPPP, bool); //! has p-p-p triplet -DECLARE_SOA_COLUMN(PPL, hasPPL, bool); //! has p-p-L triplet -DECLARE_SOA_COLUMN(PLL, hasPLL, bool); //! has p-L-L triplet -DECLARE_SOA_COLUMN(LLL, hasLLL, bool); //! has L-L-L tripletD -DECLARE_SOA_COLUMN(PPPHI, hasPPPHI, bool); //! has P-P-PHI triplet +DECLARE_SOA_COLUMN(PPP_TightQ3, hasPPP_TightQ3, bool); //! has p-p-p triplet with tight Q3 limit +DECLARE_SOA_COLUMN(PPP_LooseQ3, hasPPP_LooseQ3, bool); //! has p-p-p triplet with loose Q3 limit +DECLARE_SOA_COLUMN(PPL_TightQ3, hasPPL_TightQ3, bool); //! has p-p-L triplet with tight Q3 limit +DECLARE_SOA_COLUMN(PPL_LooseQ3, hasPPL_LooseQ3, bool); //! has p-p-L triplet with loose Q3 limit +DECLARE_SOA_COLUMN(PLL_TightQ3, hasPLL_TightQ3, bool); //! has p-L-L triplet with tight Q3 limit +DECLARE_SOA_COLUMN(PLL_LooseQ3, hasPLL_LooseQ3, bool); //! has p-L-L triplet with loose Q3 limit +DECLARE_SOA_COLUMN(LLL_TightQ3, hasLLL_TightQ3, bool); //! has L-L-L tripletD with tight Q3 limit +DECLARE_SOA_COLUMN(LLL_LooseQ3, hasLLL_LooseQ3, bool); //! has L-L-L tripletD with loose Q3 limit +DECLARE_SOA_COLUMN(PPPHI_TightQ3, hasPPPHI_TightQ3, bool); //! has P-P-PHI triplet with tight Q3 limit +DECLARE_SOA_COLUMN(PPPHI_LooseQ3, hasPPPHI_LooseQ3, bool); //! has P-P-PHI triplet with loose Q3 limit +DECLARE_SOA_COLUMN(PPRHO_TightQ3, hasPPRHO_TightQ3, bool); //! has P-P-RHO triplet with tight Q3 limit +DECLARE_SOA_COLUMN(PPRHO_LooseQ3, hasPPRHO_highQ3, bool); //! has P-P-RHO triplet with loose Q3 limit // jets DECLARE_SOA_COLUMN(JetChLowPt, hasJetChLowPt, bool); //! low-pT charged jet @@ -269,7 +282,17 @@ DECLARE_SOA_TABLE(HfFilters, "AOD", "HfFilters", //! using HfFilter = HfFilters::iterator; DECLARE_SOA_TABLE(CFFilters, "AOD", "CFFilters", //! - filtering::PPP, filtering::PPL, filtering::PLL, filtering::LLL, filtering::PPPHI, filtering::PD, filtering::LD); + filtering::PPP_TightQ3, filtering::PPP_LooseQ3, + filtering::PPL_TightQ3, filtering::PPL_LooseQ3, + filtering::PLL_TightQ3, filtering::PLL_LooseQ3, + filtering::LLL_TightQ3, filtering::LLL_LooseQ3, + filtering::PPPHI_TightQ3, filtering::PPPHI_LooseQ3, + filtering::PPRHO_TightQ3, filtering::PPRHO_LooseQ3, + filtering::PD_TightKstar, filtering::PD_LooseKstar, + filtering::LD_TightKstar, filtering::LD_LooseKstar, + filtering::PHID_TightKstar, filtering::PHID_LooseKstar, + filtering::RHOD_TightKstar, filtering::RHOD_LooseKstar); + using CfFilter = CFFilters::iterator; // jets diff --git a/PWGLF/TableProducer/Nuspex/hypertriton3bodyfinder.cxx b/PWGLF/TableProducer/Nuspex/hypertriton3bodyfinder.cxx index b4445a5619a..40019d82533 100644 --- a/PWGLF/TableProducer/Nuspex/hypertriton3bodyfinder.cxx +++ b/PWGLF/TableProducer/Nuspex/hypertriton3bodyfinder.cxx @@ -865,7 +865,7 @@ struct hypertriton3bodyFinder { auto ntracks = Ntracks.sliceBy(perCollisionGoodNegTracks, collision.globalIndex()); auto goodtracks = Goodtracks.sliceBy(perCollisionGoodTracks, collision.globalIndex()); - if (!cffilter.hasLD() && UseCFFilter) { + if (!cffilter.hasLD_LooseKstar() && UseCFFilter) { continue; } registry.fill(HIST("hEventCounter"), 1.5); @@ -902,7 +902,7 @@ struct hypertriton3bodyFinder { VirtualLambdaCheck(collision, v0s, 0); VirtualLambdaCheck(collision, fullv0s, 3); - if (!cffilter.hasLD() && UseCFFilter) { + if (!cffilter.hasLD_LooseKstar() && UseCFFilter) { continue; } registry.fill(HIST("hEventCounter"), 1.5); From 39cbfc8bc65b2e3ea3f07f22e84e0ac301dca3e4 Mon Sep 17 00:00:00 2001 From: Samuele Cattaruzzi <124249902+scattaru@users.noreply.github.com> Date: Wed, 23 Apr 2025 10:42:53 +0200 Subject: [PATCH 1063/1650] [PWGHF] Ds-h correlation, added possibility to select a BDT prompt score interval (#10877) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Vít Kučera --- PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx | 51 ++++++++++++-------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx b/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx index 76c4f88c04c..fc4c059c61b 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx @@ -66,7 +66,8 @@ struct HfTaskCorrelationDsHadrons { Configurable> classMl{"classMl", {0, 1, 2}, "Indexes of ML scores to be stored. Three indexes max."}; Configurable> binsPtD{"binsPtD", std::vector{o2::analysis::hf_cuts_ds_to_k_k_pi::vecBinsPt}, "pT bin limits for candidate mass plots and efficiency"}; Configurable> binsPtHadron{"binsPtHadron", std::vector{0.3, 2., 4., 8., 12., 50.}, "pT bin limits for assoc particle efficiency"}; - Configurable> mlOutputPrompt{"mlOutputPrompt", {0.5, 0.5, 0.5, 0.5}, "Machine learning scores for prompt"}; + Configurable> mlOutputPromptMin{"mlOutputPromptMin", {0.5, 0.5, 0.5, 0.5}, "Machine learning scores for prompt"}; + Configurable> mlOutputPromptMax{"mlOutputPromptMax", {1.0, 1.0, 1.0, 1.0}, "Machine learning scores for prompt"}; Configurable> mlOutputBkg{"mlOutputBkg", {0.5, 0.5, 0.5, 0.5}, "Machine learning scores for bkg"}; Configurable> binsPtEfficiencyD{"binsPtEfficiencyD", std::vector{o2::analysis::hf_cuts_ds_to_k_k_pi::vecBinsPt}, "pT bin limits for D-meson efficiency"}; Configurable> binsPtEfficiencyHad{"binsPtEfficiencyHad", std::vector{0.3, 2., 4., 8., 12., 50.}, "pT bin limits for associated particle efficiency"}; @@ -266,6 +267,12 @@ struct HfTaskCorrelationDsHadrons { } } + bool isSelectedCandidate(const int ptBinD, const float bdtScorePrompt, const float bdtScoreBkg) + { + + return (ptBinD != -1 && bdtScorePrompt >= mlOutputPromptMin->at(ptBinD) && bdtScorePrompt <= mlOutputPromptMax->at(ptBinD) && bdtScoreBkg <= mlOutputBkg->at(ptBinD)); + } + void processData(DsHadronPairWithMl const& pairEntries, aod::DsCandRecoInfo const& candidates) { @@ -276,9 +283,10 @@ struct HfTaskCorrelationDsHadrons { float bdtScoreBkg = candidate.mlScoreBkg(); int ptBinD = o2::analysis::findBin(binsPtD, ptD); - if (bdtScorePrompt < mlOutputPrompt->at(ptBinD) || bdtScoreBkg > mlOutputBkg->at(ptBinD)) { + if (!isSelectedCandidate(ptBinD, bdtScorePrompt, bdtScoreBkg)) { continue; } + double efficiencyWeightD = 1.; if (applyEfficiency) { efficiencyWeightD = 1. / efficiencyD->at(o2::analysis::findBin(binsPtEfficiencyD, ptD)); @@ -306,9 +314,10 @@ struct HfTaskCorrelationDsHadrons { int poolBin = pairEntry.poolBin(); int ptBinD = o2::analysis::findBin(binsPtD, ptD); - if (bdtScorePrompt < mlOutputPrompt->at(ptBinD) || bdtScoreBkg > mlOutputBkg->at(ptBinD)) { + if (!isSelectedCandidate(ptBinD, bdtScorePrompt, bdtScoreBkg)) { continue; } + if (trackDcaXY > dcaXYTrackMax || trackDcaZ > dcaZTrackMax || trackTpcCrossedRows < nTpcCrossedRaws) { continue; } @@ -354,9 +363,10 @@ struct HfTaskCorrelationDsHadrons { int ptBinD = o2::analysis::findBin(binsPtD, ptD); bool isDsPrompt = candidate.isPrompt(); - if (bdtScorePrompt < mlOutputPrompt->at(ptBinD) || bdtScoreBkg > mlOutputBkg->at(ptBinD)) { + if (!isSelectedCandidate(ptBinD, bdtScorePrompt, bdtScoreBkg)) { continue; } + double efficiencyWeightD = 1.; if (applyEfficiency) { efficiencyWeightD = 1. / efficiencyD->at(o2::analysis::findBin(binsPtEfficiencyD, ptD)); @@ -393,9 +403,10 @@ struct HfTaskCorrelationDsHadrons { int ptBinD = o2::analysis::findBin(binsPtD, ptD); bool isPhysicalPrimary = pairEntry.isPhysicalPrimary(); - if (bdtScorePrompt < mlOutputPrompt->at(ptBinD) || bdtScoreBkg > mlOutputBkg->at(ptBinD)) { + if (!isSelectedCandidate(ptBinD, bdtScorePrompt, bdtScoreBkg)) { continue; } + if (trackDcaXY > dcaXYTrackMax || trackDcaZ > dcaZTrackMax || trackTpcCrossedRows < nTpcCrossedRaws) { continue; } @@ -415,9 +426,9 @@ struct HfTaskCorrelationDsHadrons { registry.fill(HIST("hCorrel2DVsPtSignalRegionMcRec"), deltaPhi, deltaEta, ptD, ptHadron, statusDsPrompt, poolBin, efficiencyWeight); if (isPhysicalPrimary) { registry.fill(HIST("hCorrel2DVsPtPhysicalPrimaryMcRec"), deltaPhi, deltaEta, ptD, ptHadron, statusDsPrompt, poolBin, efficiencyWeight); - if (statusDsPrompt == 1 && statusPromptHadron == 1) { + if (statusDsPrompt == 1 && statusPromptHadron == RecoDecay::OriginType::Prompt) { registry.fill(HIST("hCorrel2DVsPtSignalRegionPromptDsPromptHadronMcRec"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); - } else if (statusDsPrompt == 0 && statusPromptHadron == 2) { + } else if (statusDsPrompt == 0 && statusPromptHadron == RecoDecay::OriginType::NonPrompt) { registry.fill(HIST("hCorrel2DVsPtSignalRegionNonPromptDsNonPromptHadronMcRec"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); } } @@ -457,12 +468,12 @@ struct HfTaskCorrelationDsHadrons { registry.fill(HIST("hDeltaPhiPtIntMcGen"), deltaPhi); if (isDsPrompt) { registry.fill(HIST("hCorrel2DVsPtMcGenPrompt"), deltaPhi, deltaEta, ptD, ptHadron, poolBin); - if (statusPromptHadron == 1) { + if (statusPromptHadron == RecoDecay::OriginType::Prompt) { registry.fill(HIST("hCorrel2DVsPtMcGenPromptDsPromptHadron"), deltaPhi, deltaEta, ptD, ptHadron, poolBin); } } else { registry.fill(HIST("hCorrel2DVsPtMcGenNonPrompt"), deltaPhi, deltaEta, ptD, ptHadron, poolBin); - if (statusPromptHadron == 2) { + if (statusPromptHadron == RecoDecay::OriginType::NonPrompt) { registry.fill(HIST("hCorrel2DVsPtMcGenNonPromptDsNonPromptHadron"), deltaPhi, deltaEta, ptD, ptHadron, poolBin); } } @@ -487,9 +498,10 @@ struct HfTaskCorrelationDsHadrons { int poolBin = pairEntry.poolBin(); int ptBinD = o2::analysis::findBin(binsPtD, ptD); - if (bdtScorePrompt < mlOutputPrompt->at(ptBinD) || bdtScoreBkg > mlOutputBkg->at(ptBinD)) { + if (!isSelectedCandidate(ptBinD, bdtScorePrompt, bdtScoreBkg)) { continue; } + if (trackDcaXY > dcaXYTrackMax || trackDcaZ > dcaZTrackMax || trackTpcCrossedRows < nTpcCrossedRaws) { continue; } @@ -586,9 +598,10 @@ struct HfTaskCorrelationDsHadrons { int ptBinD = o2::analysis::findBin(binsPtD, ptD); bool isPhysicalPrimary = pairEntry.isPhysicalPrimary(); - if (bdtScorePrompt < mlOutputPrompt->at(ptBinD) || bdtScoreBkg > mlOutputBkg->at(ptBinD)) { + if (!isSelectedCandidate(ptBinD, bdtScorePrompt, bdtScoreBkg)) { continue; } + if (trackDcaXY > dcaXYTrackMax || trackDcaZ > dcaZTrackMax || trackTpcCrossedRows < nTpcCrossedRaws) { continue; } @@ -608,9 +621,9 @@ struct HfTaskCorrelationDsHadrons { registry.fill(HIST("hCorrel2DVsPtSignalRegionMcRec"), deltaPhi, deltaEta, ptD, ptHadron, statusDsPrompt, poolBin, efficiencyWeight); if (isPhysicalPrimary) { registry.fill(HIST("hCorrel2DVsPtPhysicalPrimaryMcRec"), deltaPhi, deltaEta, ptD, ptHadron, statusDsPrompt, poolBin, efficiencyWeight); - if (statusDsPrompt == 1 && statusPromptHadron == 1) { + if (statusDsPrompt == 1 && statusPromptHadron == RecoDecay::OriginType::Prompt) { registry.fill(HIST("hCorrel2DVsPtSignalRegionPromptDsPromptHadronMcRec"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); - } else if (statusDsPrompt == 0 && statusPromptHadron == 2) { + } else if (statusDsPrompt == 0 && statusPromptHadron == RecoDecay::OriginType::NonPrompt) { registry.fill(HIST("hCorrel2DVsPtSignalRegionNonPromptDsNonPromptHadronMcRec"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); } } @@ -720,7 +733,7 @@ struct HfTaskCorrelationDsHadrons { outputMl[iclass] = candidate.mlProbDsToPiKK()[classMl->at(iclass)]; } } - if (outputMl[0] < mlOutputPrompt->at(o2::analysis::findBin(binsPtD, candidate.pt())) || outputMl[2] > mlOutputBkg->at(o2::analysis::findBin(binsPtD, candidate.pt()))) { + if (outputMl[0] < mlOutputPromptMin->at(o2::analysis::findBin(binsPtD, candidate.pt())) || outputMl[0] < mlOutputPromptMax->at(o2::analysis::findBin(binsPtD, candidate.pt())) || outputMl[2] > mlOutputBkg->at(o2::analysis::findBin(binsPtD, candidate.pt()))) { continue; } @@ -802,7 +815,7 @@ struct HfTaskCorrelationDsHadrons { outputMl[iclass] = candidate.mlProbDsToPiKK()[classMl->at(iclass)]; } } - if (outputMl[0] < mlOutputPrompt->at(o2::analysis::findBin(binsPtD, candidate.pt())) || outputMl[2] > mlOutputBkg->at(o2::analysis::findBin(binsPtD, candidate.pt()))) { + if (outputMl[0] < mlOutputPromptMin->at(o2::analysis::findBin(binsPtD, candidate.pt())) || outputMl[0] < mlOutputPromptMax->at(o2::analysis::findBin(binsPtD, candidate.pt())) || outputMl[2] > mlOutputBkg->at(o2::analysis::findBin(binsPtD, candidate.pt()))) { continue; } auto collision = candidate.template collision_as>(); @@ -897,9 +910,9 @@ struct HfTaskCorrelationDsHadrons { } if (separateTrackOrigins) { int trackOrigin = RecoDecay::getCharmHadronOrigin(mcParticles, mcParticle, true); - if (trackOrigin == 1) { // charm orgin + if (trackOrigin == RecoDecay::OriginType::Prompt) { // charm orgin registry.fill(HIST("hPtPrmPromptPartMcGen"), mcParticle.pt()); - } else if (trackOrigin == 2) { // beauty origin + } else if (trackOrigin == RecoDecay::OriginType::NonPrompt) { // beauty origin registry.fill(HIST("hPtPrmNonPromptPartMcGen"), mcParticle.pt()); } } @@ -938,9 +951,9 @@ struct HfTaskCorrelationDsHadrons { // check track origin if (separateTrackOrigins) { int trackOrigin = RecoDecay::getCharmHadronOrigin(mcParticles, mcParticle, true); - if (trackOrigin == 1) { // charm orgin + if (trackOrigin == RecoDecay::OriginType::Prompt) { // charm orgin registry.fill(HIST("hPtPrmPromptPartMcRec"), track.pt()); - } else if (trackOrigin == 2) { // beauty origin + } else if (trackOrigin == RecoDecay::OriginType::NonPrompt) { // beauty origin registry.fill(HIST("hPtPrmNonPromptPartMcRec"), track.pt()); } } From a268ae3b7ec625c630675632723d063c85dafaca Mon Sep 17 00:00:00 2001 From: aimeric-landou <46970521+aimeric-landou@users.noreply.github.com> Date: Wed, 23 Apr 2025 11:59:43 +0200 Subject: [PATCH 1064/1650] [PWGJE] jetSpectraCharged: pTHat cut applied to MCP/MCD jets (#10945) --- PWGJE/Tasks/jetSpectraCharged.cxx | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/PWGJE/Tasks/jetSpectraCharged.cxx b/PWGJE/Tasks/jetSpectraCharged.cxx index 67495485bb6..a1adc4e2f75 100644 --- a/PWGJE/Tasks/jetSpectraCharged.cxx +++ b/PWGJE/Tasks/jetSpectraCharged.cxx @@ -69,6 +69,7 @@ struct JetSpectraCharged { Configurable pTHatMaxMCD{"pTHatMaxMCD", 999.0, "maximum fraction of hard scattering for jet acceptance in detector MC"}; Configurable pTHatMaxMCP{"pTHatMaxMCP", 999.0, "maximum fraction of hard scattering for jet acceptance in particle MC"}; Configurable pTHatExponent{"pTHatExponent", 6.0, "exponent of the event weight for the calculation of pTHat"}; + Configurable pTHatAbsoluteMin{"pTHatAbsoluteMin", -99.0, "minimum value of pTHat"}; Configurable jetPtMax{"jetPtMax", 200., "set jet pT bin max"}; Configurable jetEtaMin{"jetEtaMin", -0.7, "minimum jet pseudorapidity"}; Configurable jetEtaMax{"jetEtaMax", 0.7, "maximum jet pseudorapidity"}; @@ -293,6 +294,10 @@ struct JetSpectraCharged { template void fillJetHistograms(TJets const& jet, float centrality, float weight = 1.0) { + float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); + if (jet.pt() > pTHatMaxMCD * pTHat || pTHat < pTHatAbsoluteMin) { + return; + } if (jet.r() == round(selectedJetsRadius * 100.0f)) { registry.fill(HIST("h_jet_pt"), jet.pt(), weight); registry.fill(HIST("h_jet_eta"), jet.eta(), weight); @@ -313,6 +318,10 @@ struct JetSpectraCharged { template void fillJetAreaSubHistograms(TJets const& jet, float centrality, float rho, float weight = 1.0) { + float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); + if (jet.pt() > pTHatMaxMCD * pTHat || pTHat < pTHatAbsoluteMin) { + return; + } double jetcorrpt = jet.pt() - (rho * jet.area()); if (jet.r() == round(selectedJetsRadius * 100.0f)) { // fill jet histograms after area-based subtraction @@ -338,6 +347,10 @@ struct JetSpectraCharged { template void fillMCPHistograms(TJets const& jet, float weight = 1.0) { + float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); + if (jet.pt() > pTHatMaxMCP * pTHat || pTHat < pTHatAbsoluteMin) { + return; + } if (jet.r() == round(selectedJetsRadius * 100.0f)) { // fill mcp jet histograms registry.fill(HIST("h_jet_pt_part"), jet.pt(), weight); @@ -356,6 +369,10 @@ struct JetSpectraCharged { template void fillMCPAreaSubHistograms(TJets const& jet, float rho = 0.0, float weight = 1.0) { + float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); + if (jet.pt() > pTHatMaxMCP * pTHat || pTHat < pTHatAbsoluteMin) { + return; + } if (jet.r() == round(selectedJetsRadius * 100.0f)) { // fill mcp jet histograms double jetcorrpt = jet.pt() - (rho * jet.area()); @@ -373,6 +390,10 @@ struct JetSpectraCharged { template void fillEventWiseConstituentSubtractedHistograms(TJets const& jet, float centrality, float weight = 1.0) { + float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); + if (jet.pt() > pTHatMaxMCD * pTHat || pTHat < pTHatAbsoluteMin) { + return; + } if (jet.r() == round(selectedJetsRadius * 100.0f)) { registry.fill(HIST("h2_centrality_jet_pt_eventwiseconstituentsubtracted"), centrality, jet.pt(), weight); registry.fill(HIST("jet_observables_eventwiseconstituentsubtracted"), jet.pt(), jet.eta(), jet.phi(), weight); @@ -390,14 +411,14 @@ struct JetSpectraCharged { void fillMatchedHistograms(TBase const& jetMCD, float weight = 1.0) { float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); - if (jetMCD.pt() > pTHatMaxMCD * pTHat) { + if (jetMCD.pt() > pTHatMaxMCD * pTHat || pTHat < pTHatAbsoluteMin) { return; } // fill geometry matched histograms if (checkGeoMatched) { if (jetMCD.has_matchedJetGeo()) { for (const auto& jetMCP : jetMCD.template matchedJetGeo_as>()) { - if (jetMCP.pt() > pTHatMaxMCP * pTHat) { + if (jetMCP.pt() > pTHatMaxMCP * pTHat || pTHat < pTHatAbsoluteMin) { continue; } if (jetMCD.r() == round(selectedJetsRadius * 100.0f)) { From f2e93dee5886f680501d09f7edc3b2cfc66430db Mon Sep 17 00:00:00 2001 From: Mattia Faggin Date: Wed, 23 Apr 2025 14:49:45 +0200 Subject: [PATCH 1065/1650] [PWGHF] add MC matching for Sc(2520) and add ev. sel. for generated Sc (#10860) Co-authored-by: Mattia Faggin --- PWGHF/D2H/Tasks/taskSigmac.cxx | 211 ++++++++++++------ .../DataModel/CandidateReconstructionTables.h | 16 +- .../candidateCreatorSigmac0plusplus.cxx | 124 +++++++--- 3 files changed, 250 insertions(+), 101 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskSigmac.cxx b/PWGHF/D2H/Tasks/taskSigmac.cxx index b7d77b1fea6..e7083d7283e 100644 --- a/PWGHF/D2H/Tasks/taskSigmac.cxx +++ b/PWGHF/D2H/Tasks/taskSigmac.cxx @@ -15,6 +15,8 @@ /// /// \author Mattia Faggin , University and INFN PADOVA +#include + #include "CommonConstants/PhysicsConstants.h" #include "Framework/AnalysisTask.h" #include "Framework/HistogramRegistry.h" @@ -39,9 +41,15 @@ struct HfTaskSigmac { /// consider the new parametrization of the fiducial acceptance (to be seen for reco signal in MC) Configurable yCandGenMax{"yCandGenMax", -1, "Maximum generated Sc rapidity"}; Configurable yCandRecoMax{"yCandRecoMax", -1, "Maximum Sc candidate rapidity"}; + Configurable enableTHn{"enableTHn", false, "enable the usage of THn for Λc+ and Σc0,++"}; + + HfHelper hfHelper; + bool isMc; + static constexpr std::size_t NDaughters{2u}; + + using RecoLc = soa::Join; /// THn for candidate Λc+ and Σc0,++ cut variation - Configurable enableTHn{"enableTHn", false, "enable the usage of THn for Λc+ and Σc0,++"}; ConfigurableAxis thnConfigAxisPt{"thnConfigAxisPt", {16, 0, 16}, ""}; ConfigurableAxis thnConfigAxisGenPt{"thnConfigAxisGenPt", {240, 0, 24}, "Gen pt prompt"}; ConfigurableAxis thnConfigAxisGenPtB{"thnConfigAxisGenPtB", {800, 0, 80}, "Gen pt non-prompt"}; @@ -53,8 +61,23 @@ struct HfTaskSigmac { ConfigurableAxis configAxisDeltaMassSigmaC{"configAxisDeltaMassSigmaC", {200, 0.13, 0.23}, ""}; ConfigurableAxis thnConfigAxisBdtScoreLcBkg{"thnConfigAxisBdtScoreLcBkg", {100, 0., 1.}, ""}; ConfigurableAxis thnConfigAxisBdtScoreLcNonPrompt{"thnConfigAxisBdtScoreLcNonPrompt", {100, 0., 1.}, ""}; - - HfHelper hfHelper; + const AxisSpec thnAxisMassLambdaC{configAxisMassLambdaC, "inv. mass (p K #pi) (GeV/#it{c}^{2})"}; + const AxisSpec thnAxisPtLambdaC{thnConfigAxisPt, "#it{p}_{T}(#Lambda_{c}^{+}) (GeV/#it{c})"}; + const AxisSpec thnAxisPtSigmaC{thnConfigAxisPt, "#it{p}_{T}(#Sigma_{c}^{0,++}) (GeV/#it{c})"}; + const AxisSpec thnAxisDecLength{thnConfigAxisDecLength, "decay length #Lambda_{c}^{+} (cm)"}; + const AxisSpec thnAxisDecLengthXY{thnConfigAxisDecLengthXY, "decay length XY #Lambda_{c}^{+} (cm)"}; + const AxisSpec thnAxisCPA{thnConfigAxisCPA, "cosine of pointing angle #Lambda_{c}^{+}"}; + const AxisSpec thnAxisCPAXY{thnConfigAxisCPAXY, "cosine of pointing angle XY #Lambda_{c}^{+}"}; + const AxisSpec thnAxisOriginMc{3, -0.5, 2.5, "0: none, 1: prompt, 2: non-prompt"}; + const AxisSpec thnAxisChargeSigmaC{3, -0.5, 2.5, "#Sigma_{c}-baryon charge"}; + const AxisSpec thnAxisChannel{4, -0.5, 3.5, "0: direct 1,2,3: resonant"}; + const AxisSpec thnAxisBdtScoreLcBkg{thnConfigAxisBdtScoreLcBkg, "BDT bkg score (Lc)"}; + const AxisSpec thnAxisBdtScoreLcNonPrompt{thnConfigAxisBdtScoreLcNonPrompt, "BDT non-prompt score (Lc)"}; + const AxisSpec thnAxisGenPtLambdaC{thnConfigAxisGenPt, "#it{p}_{T}^{gen}(#Lambda_{c}^{+}) (GeV/#it{c})"}; + const AxisSpec thnAxisGenPtSigmaC{thnConfigAxisGenPt, "#it{p}_{T}^{gen}(#Sigma_{c}^{0,++}) (GeV/#it{c})"}; + const AxisSpec thnAxisGenPtLambdaCBMother{thnConfigAxisGenPtB, "#it{p}_{T}^{gen}(#Lambda_{c}^{+} B mother) (GeV/#it{c})"}; + const AxisSpec thnAxisGenPtSigmaCBMother{thnConfigAxisGenPtB, "#it{p}_{T}^{gen}(#Sigma_{c}^{0,++} B mother) (GeV/#it{c})"}; + const AxisSpec thnAxisGenSigmaCSpecies = {o2::aod::hf_cand_sigmac::Species::NSpecies, -0.5f, +o2::aod::hf_cand_sigmac::Species::NSpecies - 0.5f, "bin 1: #Sigma_{c}(2455), bin 2: #Sigma_{c}(2520)"}; /// analysis histograms HistogramRegistry registry{ @@ -99,10 +122,6 @@ struct HfTaskSigmac { {"Data/hPhiLcFromSc0PlusPlus", "#Lambda_{c}^{+} #leftarrow #Sigma_{c}^{0,++} candidates; #varphi(#Lambda_{c}^{+} #leftarrow #Sigma_{c}^{0,++}); entries;", {HistType::kTH1D, {{72, 0, constants::math::TwoPI}}}}}}; //{"Data/hDeltaMassLcFromSc0PlusPlus", "#Lambda_{c}^{+} #leftarrow #Sigma_{c}^{0,++} candidates; #it{M}(pK#pi#pi) - #it{M}(pK#pi) (GeV/#it{c}^{2}); #it{p}_{T}(#Lambda_{c}^{+} #leftarrow #Sigma_{c}^{0,++}) (GeV/#it{c});", {HistType::kTH2D, {axisDeltaMassSigmaC, {36, 0., 36.}}}}}}; - using RecoLc = soa::Join; - - bool isMc; - /// @brief init function, to define the additional analysis histograms /// @param void init(InitContext&) @@ -246,37 +265,23 @@ struct HfTaskSigmac { /// THn for candidate Λc+ and Σc0,++ cut variation if (enableTHn) { - const AxisSpec thnAxisMassLambdaC{configAxisMassLambdaC, "inv. mass (p K #pi) (GeV/#it{c}^{2})"}; - const AxisSpec thnAxisPtLambdaC{thnConfigAxisPt, "#it{p}_{T}(#Lambda_{c}^{+}) (GeV/#it{c})"}; - const AxisSpec thnAxisPtSigmaC{thnConfigAxisPt, "#it{p}_{T}(#Sigma_{c}^{0,++}) (GeV/#it{c})"}; - const AxisSpec thnAxisDecLength{thnConfigAxisDecLength, "decay length #Lambda_{c}^{+} (cm)"}; - const AxisSpec thnAxisDecLengthXY{thnConfigAxisDecLengthXY, "decay length XY #Lambda_{c}^{+} (cm)"}; - const AxisSpec thnAxisCPA{thnConfigAxisCPA, "cosine of pointing angle #Lambda_{c}^{+}"}; - const AxisSpec thnAxisCPAXY{thnConfigAxisCPAXY, "cosine of pointing angle XY #Lambda_{c}^{+}"}; - const AxisSpec thnAxisOriginMc{3, -0.5, 2.5, "0: none, 1: prompt, 2: non-prompt"}; - const AxisSpec thnAxisChargeSigmaC{3, -0.5, 2.5, "#Sigma_{c}-baryon charge"}; - const AxisSpec thnAxisChannel{4, -0.5, 3.5, "0: direct 1,2,3: resonant"}; - const AxisSpec thnAxisBdtScoreLcBkg{thnConfigAxisBdtScoreLcBkg, "BDT bkg score (Lc)"}; - const AxisSpec thnAxisBdtScoreLcNonPrompt{thnConfigAxisBdtScoreLcNonPrompt, "BDT non-prompt score (Lc)"}; - const AxisSpec thnAxisGenPtLambdaC{thnConfigAxisGenPt, "#it{p}_{T}^{gen}(#Lambda_{c}^{+}) (GeV/#it{c})"}; - const AxisSpec thnAxisGenPtSigmaC{thnConfigAxisGenPt, "#it{p}_{T}^{gen}(#Sigma_{c}^{0,++}) (GeV/#it{c})"}; - const AxisSpec thnAxisGenPtLambdaCBMother{thnConfigAxisGenPtB, "#it{p}_{T}^{gen}(#Lambda_{c}^{+} B mother) (GeV/#it{c})"}; - const AxisSpec thnAxisGenPtSigmaCBMother{thnConfigAxisGenPtB, "#it{p}_{T}^{gen}(#Sigma_{c}^{0,++} B mother) (GeV/#it{c})"}; std::vector axesLambdaCWithMl = {thnAxisPtLambdaC, thnAxisMassLambdaC, thnAxisBdtScoreLcBkg, thnAxisBdtScoreLcNonPrompt, thnAxisOriginMc, thnAxisChannel}; std::vector axesSigmaCWithMl = {thnAxisPtLambdaC, axisDeltaMassSigmaC, thnAxisBdtScoreLcBkg, thnAxisBdtScoreLcNonPrompt, thnAxisOriginMc, thnAxisChannel, thnAxisPtSigmaC, thnAxisChargeSigmaC}; std::vector axesLambdaCWoMl = {thnAxisPtLambdaC, thnAxisMassLambdaC, thnAxisDecLength, thnAxisDecLengthXY, thnAxisCPA, thnAxisCPAXY, thnAxisOriginMc, thnAxisChannel}; std::vector axesSigmaCWoMl = {thnAxisPtLambdaC, axisDeltaMassSigmaC, thnAxisDecLength, thnAxisDecLengthXY, thnAxisCPA, thnAxisCPAXY, thnAxisOriginMc, thnAxisChannel, thnAxisPtSigmaC, thnAxisChargeSigmaC}; if (isMc) { - registry.add("hnLambdaCGen", "THn for Lambdac gen", HistType::kTHnSparseF, {thnAxisGenPtLambdaC, thnAxisGenPtLambdaCBMother, thnAxisOriginMc, thnAxisChannel}); - registry.add("hnSigmaCGen", "THn for Sigmac gen", HistType::kTHnSparseF, {thnAxisGenPtSigmaC, thnAxisGenPtSigmaCBMother, thnAxisOriginMc, thnAxisChannel, thnAxisGenPtLambdaC, thnAxisChargeSigmaC}); + registry.add("MC/generated/hnLambdaCGen", "THn for Lambdac gen", HistType::kTHnSparseF, {thnAxisGenPtLambdaC, thnAxisGenPtLambdaCBMother, thnAxisOriginMc, thnAxisChannel}); + registry.add("MC/generated/hnSigmaCGen", "THn for Sigmac gen", HistType::kTHnSparseF, {thnAxisGenPtSigmaC, thnAxisGenPtSigmaCBMother, thnAxisOriginMc, thnAxisChannel, thnAxisGenPtLambdaC, thnAxisChargeSigmaC, thnAxisGenSigmaCSpecies}); if (doprocessMcWithMl) { axesLambdaCWithMl.push_back(thnAxisGenPtLambdaCBMother); axesSigmaCWithMl.push_back(thnAxisGenPtSigmaCBMother); + axesSigmaCWithMl.push_back(thnAxisGenSigmaCSpecies); registry.add("hnLambdaC", "THn for Lambdac", HistType::kTHnSparseF, axesLambdaCWithMl); registry.add("hnSigmaC", "THn for Sigmac", HistType::kTHnSparseF, axesSigmaCWithMl); } else { axesLambdaCWoMl.push_back(thnAxisGenPtLambdaCBMother); axesSigmaCWoMl.push_back(thnAxisGenPtSigmaCBMother); + axesSigmaCWoMl.push_back(thnAxisGenSigmaCSpecies); registry.add("hnLambdaC", "THn for Lambdac", HistType::kTHnSparseF, axesLambdaCWoMl); registry.add("hnSigmaC", "THn for Sigmac", HistType::kTHnSparseF, axesSigmaCWoMl); } @@ -300,16 +305,16 @@ struct HfTaskSigmac { /// @param candSc Sc candidate /// @return 0: none; 1: only Λc+ → pK-π+ possible; 2: Λc+ → π+K-p possible; 3: both possible template - int isDecayToPKPiToPiKP(L& candidateLc, S& candSc) + int8_t isDecayToPKPiToPiKP(L& candidateLc, S& candSc) { - int channel = 0; + int8_t channel = 0; if ((candidateLc.isSelLcToPKPi() >= 1) && candSc.statusSpreadLcMinvPKPiFromPDG()) { // Λc+ → pK-π+ and within the requested mass to build the Σc0,++ - channel += 1; + SETBIT(channel, o2::aod::hf_cand_sigmac::Decays::PKPi); } if ((candidateLc.isSelLcToPiKP() >= 1) && candSc.statusSpreadLcMinvPiKPFromPDG()) { // Λc+ → π+K-p and within the requested mass to build the Σc0,++ - channel += 2; + SETBIT(channel, o2::aod::hf_cand_sigmac::Decays::PiKP); } return channel; /// 0: none; 1: pK-π+ only; 2: π+K-p only; 3: both possible } @@ -326,6 +331,12 @@ struct HfTaskSigmac { /// loop over the candidate Σc0,++ for (const auto& candSc : candidatesSc) { + /// rapidity selection on Σc0,++ + /// NB: since in data we cannot tag Sc(2455) and Sc(2520), then we use only Sc(2455) for y selection on reconstructed signal + if (yCandRecoMax >= 0. && std::abs(hfHelper.ySc0(candSc)) > yCandRecoMax && std::abs(hfHelper.yScPlusPlus(candSc)) > yCandRecoMax) { + continue; + } + const int8_t chargeSc = candSc.charge(); // either Σc0 or Σc++ /// get the candidate Λc+ used to build the candidate Σc0,++ @@ -333,7 +344,7 @@ struct HfTaskSigmac { const auto& candidateLc = candSc.prongLc_as(); // const int iscandidateLcpKpi = (candidateLc.isSelLcToPKPi() >= 1) && candSc.statusSpreadLcMinvPKPiFromPDG(); // Λc+ → pK-π+ and within the requested mass to build the Σc0,++ // const int iscandidateLcpiKp = (candidateLc.isSelLcToPiKP() >= 1) && candSc.statusSpreadLcMinvPiKPFromPDG(); // Λc+ → π+K-p and within the requested mass to build the Σc0,++ - const int isCandPKPiPiKP = isDecayToPKPiToPiKP(candidateLc, candSc); + const int8_t isCandPKPiPiKP = isDecayToPKPiToPiKP(candidateLc, candSc); double massSc(-1.), massLc(-1.), deltaMass(-1.); double ptSc(candSc.pt()), ptLc(candidateLc.pt()); double etaSc(candSc.eta()), etaLc(candidateLc.eta()); @@ -342,12 +353,12 @@ struct HfTaskSigmac { double decLengthLc(candidateLc.decayLength()), decLengthXYLc(candidateLc.decayLengthXY()); double cpaLc(candidateLc.cpa()), cpaXYLc(candidateLc.cpaXY()); /// candidate Λc+ → pK-π+ (and charge conjugate) within the range of M(pK-π+) chosen in the Σc0,++ builder - if (isCandPKPiPiKP == 1 || isCandPKPiPiKP == 3) { + if (TESTBIT(isCandPKPiPiKP, o2::aod::hf_cand_sigmac::Decays::PKPi)) { massSc = hfHelper.invMassScRecoLcToPKPi(candSc, candidateLc); massLc = hfHelper.invMassLcToPKPi(candidateLc); deltaMass = massSc - massLc; /// fill the histograms - if (chargeSc == 0) { + if (chargeSc == o2::aod::hf_cand_sigmac::ChargeNull) { registry.fill(HIST("Data/hPtSc0"), ptSc); registry.fill(HIST("Data/hEtaSc0"), etaSc); registry.fill(HIST("Data/hPhiSc0"), phiSc); @@ -415,12 +426,12 @@ struct HfTaskSigmac { } } /// end candidate Λc+ → pK-π+ (and charge conjugate) /// candidate Λc+ → π+K-p (and charge conjugate) within the range of M(π+K-p) chosen in the Σc0,++ builder - if (isCandPKPiPiKP == 2 || isCandPKPiPiKP == 3) { + if (TESTBIT(isCandPKPiPiKP, o2::aod::hf_cand_sigmac::Decays::PiKP)) { massSc = hfHelper.invMassScRecoLcToPiKP(candSc, candidateLc); massLc = hfHelper.invMassLcToPiKP(candidateLc); deltaMass = massSc - massLc; /// fill the histograms - if (chargeSc == 0) { + if (chargeSc == o2::aod::hf_cand_sigmac::ChargeNull) { registry.fill(HIST("Data/hPtSc0"), ptSc); registry.fill(HIST("Data/hEtaSc0"), etaSc); registry.fill(HIST("Data/hPhiSc0"), phiSc); @@ -487,7 +498,7 @@ struct HfTaskSigmac { } } } /// end candidate Λc+ → π+K-p (and charge conjugate) - } /// end loop over the candidate Σc0,++ + } /// end loop over the candidate Σc0,++ /// THn for candidate Λc+ cut variation w/o Σc0,++ mass-window cut if (enableTHn) { @@ -534,7 +545,7 @@ struct HfTaskSigmac { } } } /// end THn for candidate Λc+ cut variation w/o Σc0,++ mass-window cut - }; /// end fillHistosData + }; /// end fillHistosData /// @brief function to fill the histograms needed in analysis (MC) /// @param candidatesSc are the reconstructed candidate Σc0,++ with MC info @@ -553,9 +564,11 @@ struct HfTaskSigmac { for (const auto& particle : mcParticlesSc) { /// reject immediately particles different from Σc0,++ - bool isSc0Gen = (std::abs(particle.flagMcMatchGen()) == (1 << aod::hf_cand_sigmac::DecayType::Sc0ToPKPiPi)); - bool isScPlusPlusGen = (std::abs(particle.flagMcMatchGen()) == (1 << aod::hf_cand_sigmac::DecayType::ScplusplusToPKPiPi)); - if (!isSc0Gen && !isScPlusPlusGen) + bool isSc0Gen = (std::abs(particle.flagMcMatchGen()) == BIT(aod::hf_cand_sigmac::DecayType::Sc0ToPKPiPi)); + bool isScStar0Gen = (std::abs(particle.flagMcMatchGen()) == BIT(aod::hf_cand_sigmac::DecayType::ScStar0ToPKPiPi)); + bool isScPlusPlusGen = (std::abs(particle.flagMcMatchGen()) == BIT(aod::hf_cand_sigmac::DecayType::ScplusplusToPKPiPi)); + bool isScStarPlusPlusGen = (std::abs(particle.flagMcMatchGen()) == BIT(aod::hf_cand_sigmac::DecayType::ScStarPlusPlusToPKPiPi)); + if (!isSc0Gen && !isScPlusPlusGen && !isScStar0Gen && !isScStarPlusPlusGen) continue; /// look for generated particles in acceptance @@ -569,8 +582,20 @@ struct HfTaskSigmac { OR consider the new parametrization of the fiducial acceptance (to be seen for reco signal in MC) */ - if (yCandGenMax >= 0. && std::abs(RecoDecay::y(particle.pVector(), o2::constants::physics::MassSigmaC0)) > yCandGenMax) { - continue; + if (yCandGenMax >= 0.) { + double mass = -1; + if (isSc0Gen) { + mass = o2::constants::physics::MassSigmaC0; + } else if (isScPlusPlusGen) { + mass = o2::constants::physics::MassSigmaCPlusPlus; + } else if (isScStar0Gen) { + mass = o2::constants::physics::MassSigmaCStar0; + } else if (isScStarPlusPlusGen) { + mass = o2::constants::physics::MassSigmaCStarPlusPlus; + } + if (mass > -1. && std::abs(RecoDecay::y(particle.pVector(), mass)) > yCandGenMax) { + continue; + } } /// Get the kinematic information of Σc0,++ and the daughters @@ -579,7 +604,7 @@ struct HfTaskSigmac { double ptGenSc(particle.pt()), etaGenSc(particle.eta()), phiGenSc(particle.phi()); double ptGenScBMother(-1.); auto arrayDaughtersIds = particle.daughtersIds(); - if (arrayDaughtersIds.size() != 2) { + if (arrayDaughtersIds.size() != NDaughters) { /// This should never happen LOG(fatal) << "generated Σc0,++ has a number of daughter particles different than 2"; continue; @@ -617,7 +642,13 @@ struct HfTaskSigmac { } /// Fill histograms - if (isSc0Gen) { + int sigmacSpecies = -1; + if (isSc0Gen || isScPlusPlusGen) { + sigmacSpecies = o2::aod::hf_cand_sigmac::Sc2455; + } else if (isScStar0Gen || isScStarPlusPlusGen) { + sigmacSpecies = o2::aod::hf_cand_sigmac::Sc2520; + } + if (isSc0Gen || isScStar0Gen) { /// Generated Σc0 and Λc+ ← Σc0 signals registry.fill(HIST("MC/generated/hPtGenSc0Sig"), ptGenSc, origin, channel); registry.fill(HIST("MC/generated/hEtaGenSc0Sig"), etaGenSc, origin, channel); @@ -639,12 +670,19 @@ struct HfTaskSigmac { registry.fill(HIST("MC/generated/hEtaGenLcFromSc0PlusPlusSig"), etaGenLc, origin, channel); registry.fill(HIST("MC/generated/hPhiGenLcFromSc0PlusPlusSig"), phiGenLc, origin, channel); /// Generated Λc+ ← Σc0,++ signal if (origin == RecoDecay::OriginType::Prompt) { - registry.fill(HIST("hnSigmaCGen"), ptGenSc, ptGenScBMother, origin, channel, ptGenLc, 0); + registry.fill(HIST("MC/generated/hnSigmaCGen"), ptGenSc, ptGenScBMother, origin, channel, ptGenLc, 0, sigmacSpecies); } else { ptGenScBMother = mcParticlesSc.rawIteratorAt(particle.idxBhadMotherPart()).pt(); - registry.fill(HIST("hnSigmaCGen"), ptGenSc, ptGenScBMother, origin, channel, ptGenLc, 0); + registry.fill(HIST("MC/generated/hnSigmaCGen"), ptGenSc, ptGenScBMother, origin, channel, ptGenLc, 0, sigmacSpecies); } - } else if (isScPlusPlusGen) { + + // debug -- uncomment if needed + // it should be solved after the implementation of ev. selection for generated SigmaC particles + // if(origin != RecoDecay::OriginType::Prompt && origin != RecoDecay::OriginType::NonPrompt) { + // LOG(info) << " --> (Sc0 gen) origin " << static_cast(origin) << ", particle.originMcGen() " << static_cast(particle.originMcGen()) << ", particle.flagMcMatchGen() " << static_cast(particle.flagMcMatchGen()) << ", pdg " << particle.pdgCode(); + //} + + } else if (isScPlusPlusGen || isScStarPlusPlusGen) { /// Generated Σc++ and Λc+ ← Σc++ signals registry.fill(HIST("MC/generated/hPtGenScPlusPlusSig"), ptGenSc, origin, channel); registry.fill(HIST("MC/generated/hEtaGenScPlusPlusSig"), etaGenSc, origin, channel); @@ -666,18 +704,24 @@ struct HfTaskSigmac { registry.fill(HIST("MC/generated/hEtaGenLcFromSc0PlusPlusSig"), etaGenLc, origin, channel); registry.fill(HIST("MC/generated/hPhiGenLcFromSc0PlusPlusSig"), phiGenLc, origin, channel); /// Generated Λc+ ← Σc0,++ signal if (origin == RecoDecay::OriginType::Prompt) { - registry.fill(HIST("hnSigmaCGen"), ptGenSc, ptGenScBMother, origin, channel, ptGenLc, 2); + registry.fill(HIST("MC/generated/hnSigmaCGen"), ptGenSc, ptGenScBMother, origin, channel, ptGenLc, 2, sigmacSpecies); } else { ptGenScBMother = mcParticlesSc.rawIteratorAt(particle.idxBhadMotherPart()).pt(); - registry.fill(HIST("hnSigmaCGen"), ptGenSc, ptGenScBMother, origin, channel, ptGenLc, 2); + registry.fill(HIST("MC/generated/hnSigmaCGen"), ptGenSc, ptGenScBMother, origin, channel, ptGenLc, 2, sigmacSpecies); } + + // debug -- uncomment if needed + // it should be solved after the implementation of ev. selection for generated SigmaC particles + // if(origin != RecoDecay::OriginType::Prompt && origin != RecoDecay::OriginType::NonPrompt) { + // LOG(info) << " --> (Sc++ gen) origin " << static_cast(origin) << ", particle.originMcGen() " << static_cast(particle.originMcGen()) << ", particle.flagMcMatchGen() " << static_cast(particle.flagMcMatchGen()) << ", pdg " << particle.pdgCode(); + //} } } /// end loop over Sc generated particles /// loop over Lc generated particles for (const auto& particle : mcParticlesLc) { - if (std::abs(particle.flagMcMatchGen()) != 1 << aod::hf_cand_3prong::DecayType::LcToPKPi) { + if (std::abs(particle.flagMcMatchGen()) != BIT(aod::hf_cand_3prong::DecayType::LcToPKPi)) { continue; } if (yCandGenMax >= 0. && std::abs(RecoDecay::y(particle.pVector(), o2::constants::physics::MassLambdaCPlus)) > yCandGenMax) { @@ -687,10 +731,10 @@ struct HfTaskSigmac { int origin = particle.originMcGen(); int channel = particle.flagMcDecayChanGen(); if (origin == RecoDecay::OriginType::Prompt) { - registry.fill(HIST("hnLambdaCGen"), ptGenLc, ptGenLcBMother, origin, channel); + registry.fill(HIST("MC/generated/hnLambdaCGen"), ptGenLc, ptGenLcBMother, origin, channel); } else { ptGenLcBMother = mcParticlesLc.rawIteratorAt(particle.idxBhadMotherPart()).pt(); - registry.fill(HIST("hnLambdaCGen"), ptGenLc, ptGenLcBMother, origin, channel); + registry.fill(HIST("MC/generated/hnLambdaCGen"), ptGenLc, ptGenLcBMother, origin, channel); } } /// end loop over Lc generated particles @@ -698,10 +742,12 @@ struct HfTaskSigmac { for (const auto& candSc : candidatesSc) { /// Candidate selected as Σc0 and/or Σc++ - if (!(candSc.hfflag() & 1 << aod::hf_cand_sigmac::DecayType::Sc0ToPKPiPi) && !(candSc.hfflag() & 1 << aod::hf_cand_sigmac::DecayType::ScplusplusToPKPiPi)) { + if (!(candSc.hfflag() & BIT(aod::hf_cand_sigmac::DecayType::Sc0ToPKPiPi)) && !(candSc.hfflag() & BIT(aod::hf_cand_sigmac::DecayType::ScplusplusToPKPiPi)) && // Σc0,++(2455) + !(candSc.hfflag() & BIT(aod::hf_cand_sigmac::DecayType::ScStar0ToPKPiPi)) && !(candSc.hfflag() & BIT(aod::hf_cand_sigmac::DecayType::ScStarPlusPlusToPKPiPi))) { // Σc0,++(2520) continue; } /// rapidity selection on Σc0,++ + /// NB: since in data we cannot tag Sc(2455) and Sc(2520), then we use only Sc(2455) for y selection on reconstructed signal if (yCandRecoMax >= 0. && std::abs(hfHelper.ySc0(candSc)) > yCandRecoMax && std::abs(hfHelper.yScPlusPlus(candSc)) > yCandRecoMax) { continue; } @@ -712,14 +758,28 @@ struct HfTaskSigmac { /// get the candidate Λc+ used to build the Σc0 /// and understand which mass hypotheses are possible const auto& candidateLc = candSc.prongLc_as(); - const int isCandPKPiPiKP = isDecayToPKPiToPiKP(candidateLc, candSc); + const int8_t isCandPKPiPiKP = isDecayToPKPiToPiKP(candidateLc, candSc); // candidateLc.flagMcDecayChanRec(); - /// Reconstructed Σc0 signal - if (std::abs(candSc.flagMcMatchRec()) == 1 << aod::hf_cand_sigmac::DecayType::Sc0ToPKPiPi && (chargeSc == 0)) { + bool isTrueSc0Reco = std::abs(candSc.flagMcMatchRec()) == BIT(aod::hf_cand_sigmac::DecayType::Sc0ToPKPiPi); + bool isTrueScStar0Reco = std::abs(candSc.flagMcMatchRec()) == BIT(aod::hf_cand_sigmac::DecayType::ScStar0ToPKPiPi); + bool isTrueScPlusPlusReco = std::abs(candSc.flagMcMatchRec()) == BIT(aod::hf_cand_sigmac::DecayType::ScplusplusToPKPiPi); + bool isTrueScStarPlusPlusReco = std::abs(candSc.flagMcMatchRec()) == BIT(aod::hf_cand_sigmac::DecayType::ScStarPlusPlusToPKPiPi); + int sigmacSpecies = -1; + if ((isTrueSc0Reco || isTrueScStar0Reco) && (chargeSc == o2::aod::hf_cand_sigmac::ChargeNull)) { + /// Reconstructed Σc0 signal // Get the corresponding MC particle for Sc, found as the mother of the soft pion - auto indexMcScRec = RecoDecay::getMother(mcParticles, candSc.prong1_as().mcParticle(), o2::constants::physics::Pdg::kSigmaC0, true); + int indexMcScRec = -1; + if (isTrueSc0Reco) { + // Σc0(2455) + indexMcScRec = RecoDecay::getMother(mcParticles, candSc.prong1_as().mcParticle(), o2::constants::physics::Pdg::kSigmaC0, true); + sigmacSpecies = o2::aod::hf_cand_sigmac::Sc2455; + } else if (isTrueScStar0Reco) { + // Σc0(2520) + indexMcScRec = RecoDecay::getMother(mcParticles, candSc.prong1_as().mcParticle(), o2::constants::physics::Pdg::kSigmaCStar0, true); + sigmacSpecies = o2::aod::hf_cand_sigmac::Sc2520; + } auto particleSc = mcParticles.rawIteratorAt(indexMcScRec); // Get the corresponding MC particle for Lc auto arrayDaughtersLc = std::array{candidateLc.template prong0_as(), candidateLc.template prong1_as(), candidateLc.template prong2_as()}; @@ -743,7 +803,7 @@ struct HfTaskSigmac { auto channel = candidateLc.flagMcDecayChanRec(); /// 0: direct; 1: Λc± → p± K*; 2: Λc± → Δ(1232)±± K∓; 3: Λc± → Λ(1520) π± /// candidate Λc+ → pK-π+ (and charge conjugate) within the range of M(pK-π+) chosen in the Σc0,++ builder - if ((isCandPKPiPiKP == 1 || isCandPKPiPiKP == 3) && std::abs(candidateLc.template prong0_as().mcParticle().pdgCode()) == kProton) { + if ((TESTBIT(isCandPKPiPiKP, o2::aod::hf_cand_sigmac::Decays::PKPi)) && std::abs(candidateLc.template prong0_as().mcParticle().pdgCode()) == kProton) { massSc = hfHelper.invMassScRecoLcToPKPi(candSc, candidateLc); massLc = hfHelper.invMassLcToPKPi(candidateLc); deltaMass = massSc - massLc; @@ -808,16 +868,16 @@ struct HfTaskSigmac { outputMl.at(0) = candidateLc.mlProbLcToPKPi()[0]; /// bkg score outputMl.at(1) = candidateLc.mlProbLcToPKPi()[2]; /// non-prompt score } - registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, outputMl.at(0), outputMl.at(1), origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart()); + registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, outputMl.at(0), outputMl.at(1), origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart(), sigmacSpecies); } else { /// fill w/o BDT information - registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart()); + registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart(), sigmacSpecies); } } } /// end candidate Λc+ → pK-π+ (and charge conjugate) /// candidate Λc+ → π+K-p (and charge conjugate) within the range of M(π+K-p) chosen in the Σc0,++ builder - if ((isCandPKPiPiKP == 2 || isCandPKPiPiKP == 3) && std::abs(candidateLc.template prong0_as().mcParticle().pdgCode()) == kPiPlus) { + if ((TESTBIT(isCandPKPiPiKP, o2::aod::hf_cand_sigmac::Decays::PiKP)) && std::abs(candidateLc.template prong0_as().mcParticle().pdgCode()) == kPiPlus) { massSc = hfHelper.invMassScRecoLcToPiKP(candSc, candidateLc); massLc = hfHelper.invMassLcToPiKP(candidateLc); deltaMass = massSc - massLc; @@ -882,19 +942,28 @@ struct HfTaskSigmac { outputMl.at(0) = candidateLc.mlProbLcToPiKP()[0]; /// bkg score outputMl.at(1) = candidateLc.mlProbLcToPiKP()[2]; /// non-prompt score } - registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, outputMl.at(0), outputMl.at(1), origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart()); + registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, outputMl.at(0), outputMl.at(1), origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart(), sigmacSpecies); } else { /// fill w/o BDT information - registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart()); + registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart(), sigmacSpecies); } } } /// end candidate Λc+ → π+K-p (and charge conjugate) /// end reconstructed Σc0 signal - } else if (std::abs(candSc.flagMcMatchRec()) == 1 << aod::hf_cand_sigmac::DecayType::ScplusplusToPKPiPi && (std::abs(chargeSc) == 2)) { + } else if ((isTrueScPlusPlusReco || isTrueScStarPlusPlusReco) && (std::abs(chargeSc) == o2::aod::hf_cand_sigmac::ChargePlusPlus)) { /// Reconstructed Σc++ signal // Get the corresponding MC particle for Sc, found as the mother of the soft pion - auto indexMcScRec = RecoDecay::getMother(mcParticles, candSc.prong1_as().mcParticle(), o2::constants::physics::Pdg::kSigmaCPlusPlus, true); + int indexMcScRec = -1; + if (isTrueScPlusPlusReco) { + // Σc0(2455) + indexMcScRec = RecoDecay::getMother(mcParticles, candSc.prong1_as().mcParticle(), o2::constants::physics::Pdg::kSigmaCPlusPlus, true); + sigmacSpecies = o2::aod::hf_cand_sigmac::Sc2455; + } else if (isTrueScStarPlusPlusReco) { + // Σc0(2520) + indexMcScRec = RecoDecay::getMother(mcParticles, candSc.prong1_as().mcParticle(), o2::constants::physics::Pdg::kSigmaCStarPlusPlus, true); + sigmacSpecies = o2::aod::hf_cand_sigmac::Sc2520; + } auto particleSc = mcParticles.rawIteratorAt(indexMcScRec); // Get the corresponding MC particle for Lc auto arrayDaughtersLc = std::array{candidateLc.template prong0_as(), candidateLc.template prong1_as(), candidateLc.template prong2_as()}; @@ -918,7 +987,7 @@ struct HfTaskSigmac { auto channel = candidateLc.flagMcDecayChanRec(); /// 0: direct; 1: Λc± → p± K*; 2: Λc± → Δ(1232)±± K∓; 3: Λc± → Λ(1520) π± /// candidate Λc+ → pK-π+ (and charge conjugate) within the range of M(pK-π+) chosen in the Σc0,++ builder - if ((isCandPKPiPiKP == 1 || isCandPKPiPiKP == 3) && std::abs(candidateLc.template prong0_as().mcParticle().pdgCode()) == kProton) { + if ((TESTBIT(isCandPKPiPiKP, o2::aod::hf_cand_sigmac::Decays::PKPi)) && std::abs(candidateLc.template prong0_as().mcParticle().pdgCode()) == kProton) { massSc = hfHelper.invMassScRecoLcToPKPi(candSc, candidateLc); massLc = hfHelper.invMassLcToPKPi(candidateLc); deltaMass = massSc - massLc; @@ -983,16 +1052,16 @@ struct HfTaskSigmac { outputMl.at(0) = candidateLc.mlProbLcToPKPi()[0]; /// bkg score outputMl.at(1) = candidateLc.mlProbLcToPKPi()[2]; /// non-prompt score } - registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, outputMl.at(0), outputMl.at(1), origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart()); + registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, outputMl.at(0), outputMl.at(1), origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart(), sigmacSpecies); } else { /// fill w/o BDT information - registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart()); + registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart(), sigmacSpecies); } } } /// end candidate Λc+ → pK-π+ (and charge conjugate) /// candidate Λc+ → π+K-p (and charge conjugate) within the range of M(π+K-p) chosen in the Σc0,++ builder - if ((isCandPKPiPiKP == 2 || isCandPKPiPiKP == 3) && std::abs(candidateLc.template prong0_as().mcParticle().pdgCode()) == kPiPlus) { + if ((TESTBIT(isCandPKPiPiKP, o2::aod::hf_cand_sigmac::Decays::PiKP)) && std::abs(candidateLc.template prong0_as().mcParticle().pdgCode()) == kPiPlus) { massSc = hfHelper.invMassScRecoLcToPiKP(candSc, candidateLc); massLc = hfHelper.invMassLcToPiKP(candidateLc); deltaMass = massSc - massLc; @@ -1055,15 +1124,15 @@ struct HfTaskSigmac { outputMl.at(0) = candidateLc.mlProbLcToPiKP()[0]; /// bkg score outputMl.at(1) = candidateLc.mlProbLcToPiKP()[2]; /// non-prompt score } - registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, outputMl.at(0), outputMl.at(1), origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart()); + registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, outputMl.at(0), outputMl.at(1), origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart(), sigmacSpecies); } else { /// fill w/o BDT information - registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart()); + registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart(), sigmacSpecies); } } } /// end candidate Λc+ → π+K-p (and charge conjugate) - } /// end reconstructed Σc++ signal + } /// end reconstructed Σc++ signal } /// end loop on reconstructed Σc0,++ diff --git a/PWGHF/DataModel/CandidateReconstructionTables.h b/PWGHF/DataModel/CandidateReconstructionTables.h index 7ee144ca397..754de37ec45 100644 --- a/PWGHF/DataModel/CandidateReconstructionTables.h +++ b/PWGHF/DataModel/CandidateReconstructionTables.h @@ -2064,7 +2064,17 @@ DECLARE_SOA_COLUMN(OriginMcGen, originMcGen, int8_t); //! particle origin, // mapping of decay types enum DecayType { Sc0ToPKPiPi = 0, - ScplusplusToPKPiPi }; + ScplusplusToPKPiPi, + ScStar0ToPKPiPi, + ScStarPlusPlusToPKPiPi }; +enum Species : int { Sc2455 = 0, + Sc2520, + NSpecies }; +enum Decays : int { PKPi = 0, + PiKP, + NDecays }; +constexpr int ChargeNull = 0; +constexpr int ChargePlusPlus = 2; } // namespace hf_cand_sigmac // declare dedicated Σc0,++ decay candidate table @@ -2293,8 +2303,8 @@ DECLARE_SOA_DYNAMIC_COLUMN(PtSoftPi, ptSoftPi, [](float pxSoftPi, float pySoftPi DECLARE_SOA_DYNAMIC_COLUMN(PVecSoftPi, pVecSoftPi, [](float px, float py, float pz) -> std::array { return std::array{px, py, pz}; }); // MC matching result: -DECLARE_SOA_COLUMN(FlagMcMatchRec, flagMcMatchRec, int8_t); //! reconstruction level -DECLARE_SOA_COLUMN(FlagMcMatchGen, flagMcMatchGen, int8_t); //! generator level +DECLARE_SOA_COLUMN(FlagMcMatchRec, flagMcMatchRec, int8_t); //! reconstruction level +DECLARE_SOA_COLUMN(FlagMcMatchGen, flagMcMatchGen, int8_t); //! generator level DECLARE_SOA_COLUMN(FlagMcMatchRecD0, flagMcMatchRecD0, int8_t); //! reconstruction level DECLARE_SOA_COLUMN(FlagMcMatchGenD0, flagMcMatchGenD0, int8_t); //! generator level diff --git a/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx b/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx index e882dcd2dba..c3cfe2d6049 100644 --- a/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx +++ b/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx @@ -39,6 +39,7 @@ #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/Utils/utilsBfieldCCDB.h" // for dca recalculation +#include "PWGHF/Utils/utilsEvSelHf.h" using namespace o2; using namespace o2::analysis; @@ -142,7 +143,8 @@ struct HfCandidateCreatorSigmac0plusplus { softPiCuts.SetMaxChi2PerClusterITS(softPiChi2Max); // ITS hitmap std::set setSoftPiItsHitMap; // = {}; - for (int idItsLayer = 0; idItsLayer < 7; idItsLayer++) { + constexpr std::size_t NLayersIts = 7; + for (std::size_t idItsLayer = 0u; idItsLayer < NLayersIts; idItsLayer++) { if (TESTBIT(softPiItsHitMap, idItsLayer)) { setSoftPiItsHitMap.insert(static_cast(idItsLayer)); } @@ -178,7 +180,7 @@ struct HfCandidateCreatorSigmac0plusplus { /// keep only the candidates flagged as possible Λc+ (and charge conj.) decaying into a charged pion, kaon and proton /// if not selected, skip it and go to the next one - if (!(candLc.hfflag() & 1 << aod::hf_cand_3prong::DecayType::LcToPKPi)) { + if (!(candLc.hfflag() & BIT(aod::hf_cand_3prong::DecayType::LcToPKPi))) { continue; } /// keep only the candidates Λc+ (and charge conj.) within the desired rapidity @@ -234,7 +236,7 @@ struct HfCandidateCreatorSigmac0plusplus { int chargeLc = candLc.template prong0_as().sign() + candLc.template prong1_as().sign() + candLc.template prong2_as().sign(); int chargeSoftPi = trackSoftPi.sign(); int8_t chargeSigmac = chargeLc + chargeSoftPi; - if (std::abs(chargeSigmac) != 0 && std::abs(chargeSigmac) != 2) { + if (std::abs(chargeSigmac) != o2::aod::hf_cand_sigmac::ChargeNull && std::abs(chargeSigmac) != o2::aod::hf_cand_sigmac::ChargePlusPlus) { /// this shall never happen LOG(fatal) << ">>> Sc candidate with charge +1 built, not possible! Charge Lc: " << chargeLc << ", charge soft pion: " << chargeSoftPi; } @@ -387,26 +389,31 @@ struct HfCandidateSigmac0plusplusMc { Produces rowMCMatchScRec; Produces rowMCMatchScGen; + o2::hf_evsel::HfEventSelectionMc hfEvSelMc; // mc event selection and monitoring + + using BCsInfo = soa::Join; using LambdacMc = soa::Join; // using LambdacMcGen = soa::Join; + using McCollisionsNoCents = soa::Join; + + PresliceUnsorted colPerMcCollision = aod::mccollisionlabel::mcCollisionId; - float zPvPosMax{1000.f}; + HistogramRegistry registry{"registry"}; /// @brief init function void init(InitContext& initContext) { const auto& workflows = initContext.services().get(); for (const DeviceSpec& device : workflows.devices) { - if (device.name.compare("hf-candidate-creator-3prong") == 0) { // here we assume that the hf-candidate-creator-3prong is in the workflow - for (const auto& option : device.options) { - if (option.name.compare("hfEvSel.zPvPosMax") == 0) { - zPvPosMax = option.defaultValue.get(); - break; - } - } + // here we assume that the hf-candidate-creator-3prong is in the workflow + // configure the ev. sel from that workflow + if (device.name.compare("hf-candidate-creator-3prong") == 0) { + hfEvSelMc.configureFromDevice(device); break; } } + + hfEvSelMc.addHistograms(registry); // particles monitoring } /// @brief dummy process function, to be run on data @@ -419,7 +426,9 @@ struct HfCandidateSigmac0plusplusMc { void processMc(aod::McParticles const& mcParticles, aod::TracksWMc const& tracks, LambdacMc const& candsLc /*, const LambdacMcGen&*/, - aod::McCollisions const&) + McCollisionsNoCents const& collInfos, + aod::McCollisions const&, + BCsInfo const&) { // Match reconstructed candidates. @@ -442,7 +451,7 @@ struct HfCandidateSigmac0plusplusMc { /// skip immediately the candidate Σc0,++ w/o a Λc+ matched to MC auto candLc = candSigmac.prongLc_as(); - if (!(std::abs(candLc.flagMcMatchRec()) == 1 << aod::hf_cand_3prong::DecayType::LcToPKPi)) { /// (*) + if (!(std::abs(candLc.flagMcMatchRec()) == BIT(aod::hf_cand_3prong::DecayType::LcToPKPi))) { /// (*) rowMCMatchScRec(flag, origin, -1.f, 0); continue; } @@ -453,25 +462,46 @@ struct HfCandidateSigmac0plusplusMc { candLc.prong2_as(), candSigmac.prong1_as()}; chargeSigmac = candSigmac.charge(); - if (chargeSigmac == 0) { + if (chargeSigmac == o2::aod::hf_cand_sigmac::ChargeNull) { /// candidate Σc0 /// 3 levels: /// 1. Σc0 → Λc+ π-,+ /// 2. Λc+ → pK-π+ direct (i) or Λc+ → resonant channel Λc± → p± K*, Λc± → Δ(1232)±± K∓ or Λc± → Λ(1520) π± (ii) /// 3. in case of (ii): resonant channel to pK-π+ + + /// look for Σc0(2455) indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, Pdg::kSigmaC0, std::array{+kProton, -kKPlus, +kPiPlus, -kPiPlus}, true, &sign, 3); if (indexRec > -1) { /// due to (*) no need to check anything for LambdaC - flag = sign * (1 << aod::hf_cand_sigmac::DecayType::Sc0ToPKPiPi); + flag = sign * BIT(aod::hf_cand_sigmac::DecayType::Sc0ToPKPiPi); + } + + /// look for Σc0(2520) + if (flag == 0) { + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, Pdg::kSigmaCStar0, std::array{+kProton, -kKPlus, +kPiPlus, -kPiPlus}, true, &sign, 3); + if (indexRec > -1) { /// due to (*) no need to check anything for LambdaC + flag = sign * BIT(aod::hf_cand_sigmac::DecayType::ScStar0ToPKPiPi); + } } - } else if (std::abs(chargeSigmac) == 2) { + + } else if (std::abs(chargeSigmac) == o2::aod::hf_cand_sigmac::ChargePlusPlus) { /// candidate Σc++ /// 3 levels: /// 1. Σc0 → Λc+ π-,+ /// 2. Λc+ → pK-π+ direct (i) or Λc+ → resonant channel Λc± → p± K*, Λc± → Δ(1232)±± K∓ or Λc± → Λ(1520) π± (ii) /// 3. in case of (ii): resonant channel to pK-π+ + + /// look for Σc++(2455) indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, Pdg::kSigmaCPlusPlus, std::array{+kProton, -kKPlus, +kPiPlus, +kPiPlus}, true, &sign, 3); if (indexRec > -1) { /// due to (*) no need to check anything for LambdaC - flag = sign * (1 << aod::hf_cand_sigmac::DecayType::ScplusplusToPKPiPi); + flag = sign * BIT(aod::hf_cand_sigmac::DecayType::ScplusplusToPKPiPi); + } + + /// look for Σc++(2520) + if (flag == 0) { + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, Pdg::kSigmaCStarPlusPlus, std::array{+kProton, -kKPlus, +kPiPlus, +kPiPlus}, true, &sign, 3); + if (indexRec > -1) { /// due to (*) no need to check anything for LambdaC + flag = sign * BIT(aod::hf_cand_sigmac::DecayType::ScStarPlusPlusToPKPiPi); + } } } @@ -495,9 +525,16 @@ struct HfCandidateSigmac0plusplusMc { origin = 0; std::vector idxBhadMothers{}; + /// MC ev. selection done w/o centrality estimator + /// In case of need, readapt the code templetizing the function auto mcCollision = particle.mcCollision(); - float zPv = mcCollision.posZ(); - if (zPv < -zPvPosMax || zPv > zPvPosMax) { // to avoid counting particles in collisions with Zvtx larger than the maximum, we do not match them + float centrality{-1.f}; + uint16_t rejectionMask{0}; + const auto collSlice = collInfos.sliceBy(colPerMcCollision, mcCollision.globalIndex()); + rejectionMask = hfEvSelMc.getHfMcCollisionRejectionMask(mcCollision, collSlice, centrality); + hfEvSelMc.fillHistograms(mcCollision, rejectionMask, 0); + if (rejectionMask != 0) { + // at least one event selection not satisfied --> reject gen particles from this collision rowMCMatchScGen(flag, origin, -1); continue; } @@ -507,36 +544,63 @@ struct HfCandidateSigmac0plusplusMc { /// 2. Λc+ → pK-π+ direct (i) or Λc+ → resonant channel Λc± → p± K*, Λc± → Δ(1232)±± K∓ or Λc± → Λ(1520) π± (ii) /// 3. in case of (ii): resonant channel to pK-π+ /// → here we check level 1. first, and then levels 2. and 3. are inherited by the Λc+ → pK-π+ MC matching in candidateCreator3Prong.cxx + + /// look for Σc0,++(2455) if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kSigmaC0, std::array{static_cast(Pdg::kLambdaCPlus), static_cast(kPiMinus)}, true, &sign, 1)) { - // generated Σc0 - // for (const auto& daughter : particle.daughters_as()) { + // generated Σc0(2455) for (const auto& daughter : particle.daughters_as()) { // look for Λc+ daughter decaying in pK-π+ if (std::abs(daughter.pdgCode()) != Pdg::kLambdaCPlus) continue; - // if (std::abs(daughter.flagMcMatchGen()) == (1 << aod::hf_cand_3prong::DecayType::LcToPKPi)) { if (RecoDecay::isMatchedMCGen(mcParticles, daughter, Pdg::kLambdaCPlus, std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2)) { /// Λc+ daughter decaying in pK-π+ found! - flag = sign * (1 << aod::hf_cand_sigmac::DecayType::Sc0ToPKPiPi); + flag = sign * BIT(aod::hf_cand_sigmac::DecayType::Sc0ToPKPiPi); break; } } } else if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kSigmaCPlusPlus, std::array{static_cast(Pdg::kLambdaCPlus), static_cast(kPiPlus)}, true, &sign, 1)) { - // generated Σc++ - // for (const auto& daughter : particle.daughters_as()) { + // generated Σc++(2455) for (const auto& daughter : particle.daughters_as()) { // look for Λc+ daughter decaying in pK-π+ if (std::abs(daughter.pdgCode()) != Pdg::kLambdaCPlus) continue; - // if (std::abs(daughter.flagMcMatchGen()) == (1 << aod::hf_cand_3prong::DecayType::LcToPKPi)) { if (RecoDecay::isMatchedMCGen(mcParticles, daughter, Pdg::kLambdaCPlus, std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2)) { /// Λc+ daughter decaying in pK-π+ found! - flag = sign * (1 << aod::hf_cand_sigmac::DecayType::ScplusplusToPKPiPi); + flag = sign * BIT(aod::hf_cand_sigmac::DecayType::ScplusplusToPKPiPi); break; } } } + /// look for Σc0,++(2520) + if (flag == 0) { + if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kSigmaCStar0, std::array{static_cast(Pdg::kLambdaCPlus), static_cast(kPiMinus)}, true, &sign, 1)) { + // generated Σc0(2520) + for (const auto& daughter : particle.daughters_as()) { + // look for Λc+ daughter decaying in pK-π+ + if (std::abs(daughter.pdgCode()) != Pdg::kLambdaCPlus) + continue; + if (RecoDecay::isMatchedMCGen(mcParticles, daughter, Pdg::kLambdaCPlus, std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2)) { + /// Λc+ daughter decaying in pK-π+ found! + flag = sign * BIT(aod::hf_cand_sigmac::DecayType::ScStar0ToPKPiPi); + break; + } + } + } else if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kSigmaCStarPlusPlus, std::array{static_cast(Pdg::kLambdaCPlus), static_cast(kPiPlus)}, true, &sign, 1)) { + // generated Σc++(2520) + for (const auto& daughter : particle.daughters_as()) { + // look for Λc+ daughter decaying in pK-π+ + if (std::abs(daughter.pdgCode()) != Pdg::kLambdaCPlus) + continue; + if (RecoDecay::isMatchedMCGen(mcParticles, daughter, Pdg::kLambdaCPlus, std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2)) { + /// Λc+ daughter decaying in pK-π+ found! + flag = sign * BIT(aod::hf_cand_sigmac::DecayType::ScStarPlusPlusToPKPiPi); + break; + } + } + } + } + /// check the origin (prompt vs. non-prompt) if (flag != 0) { origin = RecoDecay::getCharmHadronOrigin(mcParticles, particle, false, &idxBhadMothers); @@ -547,6 +611,12 @@ struct HfCandidateSigmac0plusplusMc { } else { rowMCMatchScGen(flag, origin, -1); } + + // debug + // if(origin != RecoDecay::OriginType::Prompt && origin != RecoDecay::OriginType::NonPrompt) { + // LOG(info) << " --> origin " << static_cast(origin) << ", flag " << static_cast(flag); + //} + } /// end loop over mcParticles } /// end processMc PROCESS_SWITCH(HfCandidateSigmac0plusplusMc, processMc, "Process MC", false); From eb341e671948c99b831e9bb482175561884187d0 Mon Sep 17 00:00:00 2001 From: Antonio Palasciano <52152842+apalasciano@users.noreply.github.com> Date: Wed, 23 Apr 2025 15:30:53 +0200 Subject: [PATCH 1066/1650] [PWGHF,Trigger] Separate proton pt threshold for LcRes and ThetaC (#10947) --- EventFiltering/PWGHF/HFFilter.cxx | 13 +++++++--- EventFiltering/PWGHF/HFFilterHelpers.h | 34 +++++++++++++++++--------- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/EventFiltering/PWGHF/HFFilter.cxx b/EventFiltering/PWGHF/HFFilter.cxx index a0830524997..14390515f56 100644 --- a/EventFiltering/PWGHF/HFFilter.cxx +++ b/EventFiltering/PWGHF/HFFilter.cxx @@ -75,7 +75,7 @@ struct HfFilter { // Main struct for HF triggers // nsigma PID (except for V0 and cascades) Configurable> nSigmaPidCuts{"nSigmaPidCuts", {cutsNsigma[0], 4, 8, labelsRowsNsigma, labelsColumnsNsigma}, "Nsigma cuts for ITS/TPC/TOF PID (except for V0 and cascades)"}; // min and max pts for tracks and bachelors (except for V0 and cascades) - Configurable> ptCuts{"ptCuts", {cutsPt[0], 2, 9, labelsRowsCutsPt, labelsColumnsCutsPt}, "minimum and maximum pT for bachelor tracks (except for V0 and cascades)"}; + Configurable> ptCuts{"ptCuts", {cutsPt[0], 2, 10, labelsRowsCutsPt, labelsColumnsCutsPt}, "minimum and maximum pT for bachelor tracks (except for V0 and cascades)"}; // parameters for high-pT triggers Configurable> ptThresholds{"ptThresholds", {cutsHighPtThresholds[0], 1, 2, labelsEmpty, labelsColumnsHighPtThresholds}, "pT treshold for high pT charm hadron candidates for kHighPt triggers in GeV/c"}; @@ -208,6 +208,7 @@ struct HfFilter { // Main struct for HF triggers helper.setPtLimitsDeuteronForFemto(ptCuts->get(0u, 6u), ptCuts->get(1u, 6u)); helper.setPtLimitsCharmBaryonBachelor(ptCuts->get(0u, 3u), ptCuts->get(1u, 3u)); helper.setPtLimitsLcResonanceBachelor(ptCuts->get(0u, 8u), ptCuts->get(1u, 8u)); + helper.setPtLimitsThetaCBachelor(ptCuts->get(0u, 9u), ptCuts->get(1u, 9u)); helper.setCutsSingleTrackBeauty(cutsTrackBeauty3Prong, cutsTrackBeauty4Prong, cutsTrackBeauty4Prong); helper.setCutsSingleTrackCharmBaryonBachelor(cutsTrackCharmBaryonBachelor); helper.setCutsBhadrons(cutsBtoHadrons.cutsBplus, cutsBtoHadrons.cutsBzeroToDstar, cutsBtoHadrons.cutsBc, cutsBtoHadrons.cutsBzero, cutsBtoHadrons.cutsBs, cutsBtoHadrons.cutsLb, cutsBtoHadrons.cutsXib); @@ -977,11 +978,14 @@ struct HfFilter { // Main struct for HF triggers o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParBachelorProton, 2.f, noMatCorr, &dcaInfoBachProton); } std::array pVecProton = trackProton.pVector(); - bool isSelProton = helper.isSelectedProtonFromLcReso(trackProton); - if (isSelProton) { + bool isSelPIDProton = helper.isSelectedProton4CharmOrBeautyBaryons(trackProton); + if (isSelPIDProton) { if (!keepEvent[kPrCharm2P]) { // we first look for a D*+ for (const auto& trackBachelorId : trackIdsThisCollision) { // start loop over tracks to find bachelor pion + if (!helper.isSelectedProtonFromLcResoOrThetaC(trackProton)) { + continue; + } // stop here if proton below pT threshold for thetaC to avoid computational losses auto trackBachelor = tracks.rawIteratorAt(trackBachelorId.trackId()); if (trackBachelor.globalIndex() == trackPos.globalIndex() || trackBachelor.globalIndex() == trackNeg.globalIndex() || trackBachelor.globalIndex() == trackProton.globalIndex()) { continue; @@ -1064,6 +1068,9 @@ struct HfFilter { // Main struct for HF triggers if (pt2Prong < cutsPtDeltaMassCharmReso->get(3u, 11u)) { continue; } + if (!helper.isSelectedProtonFromLcResoOrThetaC(trackProton)) { + continue; + } float massLcStarCand{-999.}, massLcStarBarCand{-999.}; float massDiffLcStarCand{-999.}, massDiffLcStarBarCand{-999.}; bool isRightSignLcStar{false}, isRightSignLcStarBar{false}; diff --git a/EventFiltering/PWGHF/HFFilterHelpers.h b/EventFiltering/PWGHF/HFFilterHelpers.h index bbd792841a3..798a96b1ec7 100644 --- a/EventFiltering/PWGHF/HFFilterHelpers.h +++ b/EventFiltering/PWGHF/HFFilterHelpers.h @@ -298,9 +298,9 @@ constexpr float cutsPtThresholdsForFemto[1][2] = {{8., 1.4}}; // proton, deutero static const std::vector labelsColumnsPtThresholdsForFemto = {"Proton", "Deuteron"}; // min and max pT for all tracks combined (except for V0 and cascades) -constexpr float cutsPt[2][9] = {{1., 0.1, 0.8, 0.5, 0.1, 0.2, 0.4, 0.5, 0.3}, - {100000., 100000., 5., 100000., 100000., 100000., 100000., 100000., 100000.}}; // beauty, D*, femto, SigmaC, Xic*+ -> SigmaC++K-, beauty to JPsi, Lc*->D0p -static const std::vector labelsColumnsCutsPt = {"Beauty", "DstarPlus", "PrForFemto", "CharmBaryon", "SoftPiSigmaC", "SoftKaonXicResoToSigmaC", "DeForFemto", "BeautyToJPsi", "PrForLcReso"}; +constexpr float cutsPt[2][10] = {{1., 0.1, 0.8, 0.5, 0.1, 0.2, 0.4, 0.5, 0.3, 0.3}, + {100000., 100000., 5., 100000., 100000., 100000., 100000., 100000., 100000., 100000.}}; // beauty, D*, femto, SigmaC, Xic*+ -> SigmaC++K-, beauty to JPsi, Lc*->D0p +static const std::vector labelsColumnsCutsPt = {"Beauty", "DstarPlus", "PrForFemto", "CharmBaryon", "SoftPiSigmaC", "SoftKaonXicResoToSigmaC", "DeForFemto", "BeautyToJPsi", "PrForLcReso", "PrForThetaC"}; static const std::vector labelsRowsCutsPt = {"Minimum", "Maximum"}; // PID cuts @@ -481,6 +481,11 @@ class HfFilterHelper mPtMinLcResonanceBachelor = minPt; mPtMaxLcResonanceBachelor = maxPt; } + void setPtLimitsThetaCBachelor(float minPt, float maxPt) + { + mPtMinThetaCBachelor = minPt; + mPtMaxThetaCBachelor = maxPt; + } void setNsigmaProtonCutsForFemto(std::array nSigmaCuts) { mNSigmaPrCutsForFemto = nSigmaCuts; } void setNsigmaDeuteronCutsForFemto(std::array nSigmaCuts) { mNSigmaDeCutsForFemto = nSigmaCuts; } @@ -628,8 +633,8 @@ class HfFilterHelper bool isSelectedXiBach(T const& trackParCasc, T const& trackParBachelor, int8_t isSelBachelor, C const& collision, o2::vertexing::DCAFitterN<2>& dcaFitter, const int& activateQA, H2 hMassVsPtXiPi, H2 hMassVsPtXiKa); template bool isSelectedXiBachBach(T const& trackParCasc, std::array const& trackParBachelor, C const& collision, o2::vertexing::DCAFitterN& dcaFitter, const int& activateQA, H2 hMassVsPtXiPiPi); - template - bool isSelectedProtonFromLcReso(const T& track); + template + bool isSelectedProtonFromLcResoOrThetaC(const T& track); // helpers template T computeRelativeMomentum(const std::array& pTrack, const std::array& CharmCandMomentum, const T& CharmMass); @@ -682,6 +687,7 @@ class HfFilterHelper float mPtMinDeuteronForFemto{0.8}; // minimum pt for the deuteron for femto float mPtMinCharmBaryonBachelor{0.5}; // minimum pt for the bachelor pion from Xic/Omegac decays float mPtMinLcResonanceBachelor{0.3}; // minimum pt for the bachelor proton from Lc resonance decays + float mPtMinThetaCBachelor{0.3}; // minimum pt for the bachelor proton from ThetaC decays float mPtMaxSoftPionForDstar{2.}; // maximum pt for the D*+ soft pion float mPtMaxBeautyBachelor{100000.}; // maximum pt for the b-hadron pion daughter float mPtMaxBeautyToJPsiBachelor{100000.}; // maximum pt for the b-hadron -> JPsi X daughters (not the muons) @@ -689,6 +695,7 @@ class HfFilterHelper float mPtMaxDeuteronForFemto{5.0}; // maximum pt for the deuteron for femto float mPtMaxCharmBaryonBachelor{100000.}; // maximum pt for the bachelor pion from Xic/Omegac decays float mPtMaxLcResonanceBachelor{100000.}; // maximum pt for the bachelor proton from Lc resonance decays + float mPtMaxThetaCBachelor{100000.}; // maximum pt for the bachelor proton from ThetaC decays float mPtThresholdProtonForFemto{8.}; // pt threshold to change strategy for proton PID for femto float mPtThresholdDeuteronForFemto{1.4}; // pt threshold to change strategy for deuteron PID for femto float mPtMinSigmaCZero{0.f}; // pt min SigmaC0 candidate @@ -1945,19 +1952,22 @@ inline bool HfFilterHelper::isSelectedKaon4Charm3ProngOrBeautyToJPsi(const T& tr /// Basic selection of proton candidates forLc and ThetaC decays /// \param track is a track /// \return true if track passes all cuts -template -inline bool HfFilterHelper::isSelectedProtonFromLcReso(const T& track) +template +inline bool HfFilterHelper::isSelectedProtonFromLcResoOrThetaC(const T& track) { // pt selections float pt = track.pt(); - if (pt < mPtMinLcResonanceBachelor || pt > mPtMaxLcResonanceBachelor) { - return false; + if constexpr (is4ThetaC) { + if (pt < mPtMinThetaCBachelor || pt > mPtMaxThetaCBachelor) { + return false; + } + } else { + if (pt < mPtMinLcResonanceBachelor || pt > mPtMaxLcResonanceBachelor) { + return false; + } } - /// PID selection - return isSelectedProton4CharmOrBeautyBaryons(track); - return true; } From 311c04e6f61d806daf9f9a64d756a64135d41940 Mon Sep 17 00:00:00 2001 From: Ionut Cristian Arsene Date: Wed, 23 Apr 2025 15:44:30 +0200 Subject: [PATCH 1067/1650] [PWGDQ] adding a histogram subgroup for the filterPP task (#10951) Co-authored-by: Ionut Cristian Arsene --- PWGDQ/Core/HistogramsLibrary.cxx | 6 ++++++ PWGDQ/Tasks/filterPPwithAssociation.cxx | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 2e9af6359f6..d2c662898ce 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -916,6 +916,12 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h } if (!groupStr.CompareTo("pair")) { + if (subGroupStr.Contains("cepf")) { + hm->AddHistogram(histClass, "Mass", "", false, 300, 0.0, 12.0, VarManager::kMass); + hm->AddHistogram(histClass, "Mass_Pt", "", false, 300, 0.0, 12.0, VarManager::kMass, 10, 0.0, 20.0, VarManager::kPt); + hm->AddHistogram(histClass, "Mass_Y", "", false, 300, 0.0, 12.0, VarManager::kMass, 100, -5.0, 5.0, VarManager::kRap); + hm->AddHistogram(histClass, "Y_Pt", "", false, 100, -5.0, 5.0, VarManager::kRap, 20, 0.0, 20.0, VarManager::kPt); + } if (subGroupStr.Contains("mult_pvcontrib")) { hm->AddHistogram(histClass, "Mass_VtxNcontribReal", "Mass vs VtxNcontribReal", false, 200, 2.0, 5.0, VarManager::kMass, 200, 0, 200.0, VarManager::kVtxNcontribReal); } diff --git a/PWGDQ/Tasks/filterPPwithAssociation.cxx b/PWGDQ/Tasks/filterPPwithAssociation.cxx index 34a3d053312..532482e641b 100644 --- a/PWGDQ/Tasks/filterPPwithAssociation.cxx +++ b/PWGDQ/Tasks/filterPPwithAssociation.cxx @@ -717,7 +717,7 @@ struct DQFilterPPTask { histNames += value; histNames += ";"; } - DefineHistograms(fHistMan, histNames.Data()); + DefineHistograms(fHistMan, histNames.Data(), "cepf"); VarManager::SetUseVars(fHistMan->GetUsedVars()); fOutputList.setObject(fHistMan->GetMainHistogramList()); } From 115f2f68f112a8e675e3b533798ab39130a48cee Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Wed, 23 Apr 2025 18:31:16 +0200 Subject: [PATCH 1068/1650] [PWGLF,Trigger] feat(nucleiFilter): Implement 2-body vertex finding for He-V0 selection (#10954) --- EventFiltering/PWGLF/nucleiFilter.cxx | 62 +++++++++++++++++++-------- 1 file changed, 45 insertions(+), 17 deletions(-) diff --git a/EventFiltering/PWGLF/nucleiFilter.cxx b/EventFiltering/PWGLF/nucleiFilter.cxx index 1db68711b36..4b22c95c3b1 100644 --- a/EventFiltering/PWGLF/nucleiFilter.cxx +++ b/EventFiltering/PWGLF/nucleiFilter.cxx @@ -102,6 +102,7 @@ struct nucleiFilter { Configurable cfgCutDCAxy{"cfgCutDCAxy", 3, "Max DCAxy"}; Configurable cfgCutDCAz{"cfgCutDCAz", 10, "Max DCAz"}; Configurable cfgCutKstar{"cfgCutKstar", 1.f, "Kstar cut for triton femto trigger"}; + Configurable cfgCutCosPAheV0{"cfgCutCosPAheV0", 0.99, "CosPA cut for HeV0"}; Configurable> cfgBetheBlochParams{"cfgBetheBlochParams", {betheBlochDefault[0], nNuclei, 6, nucleiNames, betheBlochParNames}, "TPC Bethe-Bloch parameterisation for light nuclei"}; Configurable> cfgMomentumScalingBetheBloch{"cfgMomentumScalingBetheBloch", {bbMomScalingDefault[0], nNuclei, 2, nucleiNames, matterOrNot}, "TPC Bethe-Bloch momentum scaling for light nuclei"}; @@ -112,16 +113,17 @@ struct nucleiFilter { // variable/tool for hypertriton 3body decay int mRunNumber; - float d_bz; + float mBz; Service ccdb; using TrackCandidates = soa::Join; // FIXME: positio has been changed o2::aod::pidtofgeneric::TofPidNewCollision bachelorTOFPID; o2::base::MatLayerCylSet* lut = nullptr; + o2::vertexing::DCAFitterN<2> fitter2body; o2::vertexing::DCAFitterN<3> fitter3body; o2::pid::tof::TOFResoParamsV2 mRespParamsV2; // configurable for hypertriton 3body decay struct : ConfigurableGroup { - Configurable d_bz_input{"trgH3L3Body.d_bz", -999, "bz field, -999 is automatic"}; + Configurable bFieldInput{"trgH3L3Body.mBz", -999, "bz field, -999 is automatic"}; Configurable minCosPA3body{"trgH3L3Body.minCosPA3body", 0.9995, "minCosPA3body"}; Configurable dcavtxdau{"trgH3L3Body.dcavtxdau", 0.02, "meen DCA among Daughters"}; Configurable dcapiontopv{"trgH3L3Body.dcapiontopv", 0.05, "DCA Pion To PV"}; @@ -200,6 +202,14 @@ struct nucleiFilter { fitter3body.setMaxChi2(1e9); fitter3body.setUseAbsDCA(true); + fitter2body.setPropagateToPCA(true); + fitter2body.setMaxR(200.); + fitter2body.setMinParamChange(1e-3); + fitter2body.setMinRelChi2Change(0.9); + fitter2body.setMaxDZIni(1e9); + fitter2body.setMaxChi2(1e9); + fitter2body.setUseAbsDCA(true); + ccdb->setURL(trgH3L3Body.ccdburl); ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); @@ -213,12 +223,11 @@ struct nucleiFilter { } // In case override, don't proceed, please - no CCDB access required - if (trgH3L3Body.d_bz_input > -990) { - d_bz = trgH3L3Body.d_bz_input; - fitter3body.setBz(d_bz); + if (trgH3L3Body.bFieldInput > -990) { + mBz = trgH3L3Body.bFieldInput; o2::parameters::GRPMagField grpmag; - if (std::fabs(d_bz) > 1e-5) { - grpmag.setL3Current(30000.f / (d_bz / 5.0f)); + if (std::fabs(mBz) > 1e-5) { + grpmag.setL3Current(30000.f / (mBz / 5.0f)); } o2::base::Propagator::initFieldFromGRP(&grpmag); mRunNumber = bc.runNumber(); @@ -231,8 +240,8 @@ struct nucleiFilter { if (grpo) { o2::base::Propagator::initFieldFromGRP(grpo); // Fetch magnetic field from ccdb for current collision - d_bz = grpo->getNominalL3Field(); - LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; + mBz = grpo->getNominalL3Field(); + LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << mBz << " kZG"; } else { grpmag = ccdb->getForTimeStamp(trgH3L3Body.grpmagPath, run3grp_timestamp); if (!grpmag) { @@ -240,13 +249,14 @@ struct nucleiFilter { } o2::base::Propagator::initFieldFromGRP(grpmag); // Fetch magnetic field from ccdb for current collision - // d_bz = std::lround(5.f * grpmag->getL3Current() / 30000.f); - d_bz = o2::base::Propagator::Instance()->getNominalBz(); - LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; + // mBz = std::lround(5.f * grpmag->getL3Current() / 30000.f); + mBz = o2::base::Propagator::Instance()->getNominalBz(); + LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << mBz << " kZG"; } mRunNumber = bc.runNumber(); // Set magnetic field value once known - fitter3body.setBz(d_bz); + fitter2body.setBz(mBz); + fitter3body.setBz(mBz); if (trgH3L3Body.useMatCorrType == 2) { // setMatLUT only after magfield has been initalized @@ -457,11 +467,29 @@ struct nucleiFilter { float nSigmas[2]{ cfgBetheBlochParams->get(2, 5u) > 0.f ? getNsigma(posTrack, 2, 0) : posTrack.tpcNSigmaHe(), cfgBetheBlochParams->get(2, 5u) > 0.f ? getNsigma(negTrack, 2, 1) : negTrack.tpcNSigmaHe()}; - if ((nSigmas[0] > cfgCutsPID->get(2, 0u) && nSigmas[0] < cfgCutsPID->get(2, 1u)) || - (nSigmas[1] > cfgCutsPID->get(2, 0u) && nSigmas[1] < cfgCutsPID->get(2, 1u))) { - keepEvent[kHeV0] = true; - break; + if ((nSigmas[0] < cfgCutsPID->get(2, 0u) || nSigmas[0] > cfgCutsPID->get(2, 1u)) && + (nSigmas[1] < cfgCutsPID->get(2, 0u) || nSigmas[1] > cfgCutsPID->get(2, 1u))) { + continue; + } + int n2bodyVtx = fitter2body.process(getTrackParCov(posTrack), getTrackParCov(negTrack)); + if (n2bodyVtx == 0) { + continue; + } + auto vtxXYZ = fitter2body.getPCACandidate(); + o2::gpu::gpustd::array mom = {0.}; + vtxXYZ[0] -= collision.posX(); + vtxXYZ[1] -= collision.posY(); + vtxXYZ[2] -= collision.posZ(); + auto momTrackParCov = fitter2body.createParentTrackPar(); + momTrackParCov.getPxPyPzGlo(mom); + double cosPA = (vtxXYZ[0] * mom[0] + vtxXYZ[1] * mom[1] + vtxXYZ[2] * mom[2]) / + std::sqrt((vtxXYZ[0] * vtxXYZ[0] + vtxXYZ[1] * vtxXYZ[1] + vtxXYZ[2] * vtxXYZ[2]) * + (mom[0] * mom[0] + mom[1] * mom[1] + mom[2] * mom[2])); + if (cosPA < cfgCutCosPAheV0) { + continue; } + keepEvent[kHeV0] = true; + break; } // From 6b67013574791816c99a9c2150dcd35d6757b5d1 Mon Sep 17 00:00:00 2001 From: Junlee Kim Date: Thu, 24 Apr 2025 01:35:21 +0900 Subject: [PATCH 1069/1650] [PWGLF] fixing bug (#10948) --- PWGLF/Tasks/Strangeness/lambdalambda.cxx | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdalambda.cxx b/PWGLF/Tasks/Strangeness/lambdalambda.cxx index 01fe793e2df..bf8579f105d 100644 --- a/PWGLF/Tasks/Strangeness/lambdalambda.cxx +++ b/PWGLF/Tasks/Strangeness/lambdalambda.cxx @@ -144,8 +144,7 @@ struct lambdalambda { ConfigurableAxis RadiusAxis{"RadiusAxis", {100, 0, 5}, "radius of v0v0"}; ConfigurableAxis CPAAxis{"CPAAxis", {102, -1.02, 1.02}, "CPA of v0v0"}; ConfigurableAxis DistanceAxis{"DistanceAxis", {100, 0, 10}, "distance of v0v0"}; - ConfigurableAxis DCARAxis{"DCARAxis", {100, 0, 2}, "DCA of v0v0R"}; - ConfigurableAxis DCAZAxis{"DCAZAxis", {100, -2, 2}, "DCA of v0v0Z"}; + ConfigurableAxis DCAAxis{"DCAAxis", {100, 0, 2}, "DCA of v0v0R"}; TF1* fMultPVCutLow = nullptr; TF1* fMultPVCutHigh = nullptr; @@ -169,14 +168,12 @@ struct lambdalambda { histos.add("Radius_V0V0_full", "", {HistType::kTHnSparseF, {massAxis, ptAxis, RadiusAxis, combAxis}}); histos.add("CPA_V0V0_full", "", {HistType::kTHnSparseF, {massAxis, ptAxis, CPAAxis, combAxis}}); histos.add("Distance_V0V0_full", "", {HistType::kTHnSparseF, {massAxis, ptAxis, DistanceAxis, combAxis}}); - histos.add("DCAR_V0V0_full", "", {HistType::kTHnSparseF, {massAxis, ptAxis, DCARAxis, combAxis}}); - histos.add("DCAZ_V0V0_full", "", {HistType::kTHnSparseF, {massAxis, ptAxis, DCAZAxis, combAxis}}); + histos.add("DCA_V0V0_full", "", {HistType::kTHnSparseF, {massAxis, ptAxis, DCAAxis, combAxis}}); histos.add("Radius_V0V0_sel", "", {HistType::kTHnSparseF, {massAxis, ptAxis, RadiusAxis, combAxis}}); histos.add("CPA_V0V0_sel", "", {HistType::kTHnSparseF, {massAxis, ptAxis, CPAAxis, combAxis}}); histos.add("Distance_V0V0_sel", "", {HistType::kTHnSparseF, {massAxis, ptAxis, DistanceAxis, combAxis}}); - histos.add("DCAR_V0V0_sel", "", {HistType::kTHnSparseF, {massAxis, ptAxis, DCARAxis, combAxis}}); - histos.add("DCAZ_V0V0_sel", "", {HistType::kTHnSparseF, {massAxis, ptAxis, DCAZAxis, combAxis}}); + histos.add("DCA_V0V0_sel", "", {HistType::kTHnSparseF, {massAxis, ptAxis, DCAAxis, combAxis}}); histos.add("h_InvMass_same", "", {HistType::kTHnSparseF, {massAxis, ptAxis, centAxis, combAxis}}); histos.add("h_InvMass_mixed", "", {HistType::kTHnSparseF, {massAxis, ptAxis, centAxis, combAxis}}); From a083ffc8a109a84fc5f105b1ffe4900fe81644c2 Mon Sep 17 00:00:00 2001 From: prottayCMT <61418725+prottayCMT@users.noreply.github.com> Date: Wed, 23 Apr 2025 18:36:38 +0200 Subject: [PATCH 1070/1650] [PWGLF] removed unnecessary table subscriptions (#10943) Co-authored-by: Prottay Das --- PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx index 666296c1d90..091593281e9 100644 --- a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx +++ b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx @@ -281,7 +281,8 @@ struct LfTaskLambdaSpinCorr { Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; Filter centralityFilter = (nabs(aod::cent::centFT0C) < cfgCutCentralityMax && nabs(aod::cent::centFT0C) > cfgCutCentralityMin); - using EventCandidates = soa::Filtered>; + // using EventCandidates = soa::Filtered>; + using EventCandidates = soa::Filtered>; using AllTrackCandidates = soa::Join; using ResoV0s = aod::V0Datas; From d393914c461c67d3bc92e90408e29a050867bfab Mon Sep 17 00:00:00 2001 From: Nicolas Strangmann <77485327+nstrangm@users.noreply.github.com> Date: Wed, 23 Apr 2025 18:43:57 +0200 Subject: [PATCH 1071/1650] [PWGEM/PhotonMeson,PWGJE/EMCal] Add bc wise skimming and analysis task (#10958) Co-authored-by: Nicolas Strangmann --- PWGEM/PhotonMeson/DataModel/bcWiseTables.h | 146 ++++++++++ .../PhotonMeson/TableProducer/CMakeLists.txt | 5 + .../TableProducer/bcWiseClusterSkimmer.cxx | 274 ++++++++++++++++++ PWGEM/PhotonMeson/Tasks/CMakeLists.txt | 5 + PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx | 218 ++++++++++++++ PWGJE/DataModel/EMCALClusters.h | 6 + PWGJE/TableProducer/emcalCorrectionTask.cxx | 9 + 7 files changed, 663 insertions(+) create mode 100644 PWGEM/PhotonMeson/DataModel/bcWiseTables.h create mode 100644 PWGEM/PhotonMeson/TableProducer/bcWiseClusterSkimmer.cxx create mode 100644 PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx diff --git a/PWGEM/PhotonMeson/DataModel/bcWiseTables.h b/PWGEM/PhotonMeson/DataModel/bcWiseTables.h new file mode 100644 index 00000000000..082b65b48fa --- /dev/null +++ b/PWGEM/PhotonMeson/DataModel/bcWiseTables.h @@ -0,0 +1,146 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// +/// \file bcWiseTables.h +/// +/// \brief This header provides the table definitions to store very lightweight EMCal clusters per BC +/// +/// \author Nicolas Strangmann (nicolas.strangmann@cern.ch) - Goethe University Frankfurt +/// + +#ifndef PWGEM_PHOTONMESON_DATAMODEL_BCWISETABLES_H_ +#define PWGEM_PHOTONMESON_DATAMODEL_BCWISETABLES_H_ + +#include "Framework/AnalysisDataModel.h" + +namespace o2::aod +{ + +namespace emdownscaling +{ +enum Observables { + kDefinition, + kEnergy, + kEta, + kPhi, + kNCells, + kM02, + kTime, + kFT0MCent, + kZVtx, + kFT0Amp, + kCellAmpSum, + kpT, + nObservables +}; + +// Values in tables are stored in downscaled format to save disk space +const float downscalingFactors[nObservables]{ + 1E0, // Cluster definition + 1E3, // Cluster energy + 1E4, // Cluster eta + 1E4, // Cluster phi + 1E0, // Number of cells + 1E4, // M02 + 1E2, // Cluster time + 2E0, // FT0M centrality + 1E3, // Z-vertex position + 1E0, // FT0M amplitude + 1E0, // Cell energy + 1E3}; // MC pi0 pt +} // namespace emdownscaling + +namespace bcwisebc +{ +DECLARE_SOA_COLUMN(HasFT0, hasFT0, bool); //! has_foundFT0() +DECLARE_SOA_COLUMN(HasTVX, hasTVX, bool); //! has the TVX trigger flag +DECLARE_SOA_COLUMN(HaskTVXinEMC, haskTVXinEMC, bool); //! kTVXinEMC +DECLARE_SOA_COLUMN(HasEMCCell, hasEMCCell, bool); //! at least one EMCal cell in the BC +DECLARE_SOA_COLUMN(HasNoTFROFBorder, hasNoTFROFBorder, bool); //! not in the TF border or ITS ROF border region +DECLARE_SOA_COLUMN(StoredFT0MAmplitude, storedFT0MAmplitude, unsigned int); //! ft0a+c amplitude +DECLARE_SOA_COLUMN(StoredEMCalnCells, storedEMCalnCells, unsigned int); //! number of emcal cells +DECLARE_SOA_COLUMN(StoredEMCalCellEnergy, storedEMCalCellEnergy, float); //! sum of energy in emcal cells +} // namespace bcwisebc +DECLARE_SOA_TABLE(BCWiseBCs, "AOD", "BCWISEBCS", //! table of bc wise centrality estimation and event selection input + o2::soa::Index<>, bcwisebc::HasFT0, bcwisebc::HasTVX, bcwisebc::HaskTVXinEMC, bcwisebc::HasEMCCell, bcwisebc::HasNoTFROFBorder, + bcwisebc::StoredFT0MAmplitude, bcwisebc::StoredEMCalnCells, bcwisebc::StoredEMCalCellEnergy); + +DECLARE_SOA_INDEX_COLUMN(BCWiseBC, bcWiseBC); //! bunch crossing ID used as index + +namespace bcwisecollision +{ +DECLARE_SOA_COLUMN(StoredCentrality, storedCentrality, uint8_t); //! FT0M centrality (0-100) (x2) +DECLARE_SOA_COLUMN(StoredZVtx, storedZVtx, int16_t); //! Z-vertex position (x1000) + +DECLARE_SOA_DYNAMIC_COLUMN(Centrality, centrality, [](uint8_t storedcentrality) -> float { return storedcentrality / emdownscaling::downscalingFactors[emdownscaling::kFT0MCent]; }); //! Centrality (0-100) +DECLARE_SOA_DYNAMIC_COLUMN(ZVtx, zVtx, [](uint8_t storedzvtx) -> float { return storedzvtx / emdownscaling::downscalingFactors[emdownscaling::kZVtx]; }); //! Centrality (0-100) +} // namespace bcwisecollision +DECLARE_SOA_TABLE(BCWiseCollisions, "AOD", "BCWISECOLLS", //! table of skimmed EMCal clusters + o2::soa::Index<>, BCWiseBCId, bcwisecollision::StoredCentrality, bcwisecollision::StoredZVtx, + bcwisecollision::Centrality, bcwisecollision::ZVtx); + +namespace bcwisecluster +{ +DECLARE_SOA_COLUMN(StoredDefinition, storedDefinition, uint8_t); //! cluster definition, see EMCALClusterDefinition.h +DECLARE_SOA_COLUMN(StoredE, storedE, uint16_t); //! cluster energy (1 MeV -> Maximum cluster energy of ~65 GeV) +DECLARE_SOA_COLUMN(StoredEta, storedEta, int16_t); //! cluster pseudorapidity (x10,000) +DECLARE_SOA_COLUMN(StoredPhi, storedPhi, uint16_t); //! cluster azimuthal angle (x10 000) from 0 to 2pi +DECLARE_SOA_COLUMN(StoredNCells, storedNCells, uint8_t); //! number of cells in cluster +DECLARE_SOA_COLUMN(StoredM02, storedM02, uint16_t); //! shower shape long axis (x10 000) +DECLARE_SOA_COLUMN(StoredTime, storedTime, int16_t); //! cluster time (10 ps resolution) +DECLARE_SOA_COLUMN(StoredIsExotic, storedIsExotic, bool); //! flag to mark cluster as exotic + +DECLARE_SOA_DYNAMIC_COLUMN(Definition, definition, [](uint8_t storedDefinition) -> uint8_t { return storedDefinition; }); //! cluster definition, see EMCALClusterDefinition.h +DECLARE_SOA_DYNAMIC_COLUMN(E, e, [](uint16_t storedE) -> float { return storedE / emdownscaling::downscalingFactors[emdownscaling::kEnergy]; }); //! cluster energy (GeV) +DECLARE_SOA_DYNAMIC_COLUMN(Eta, eta, [](int16_t storedEta) -> float { return storedEta / emdownscaling::downscalingFactors[emdownscaling::kEta]; }); //! cluster pseudorapidity +DECLARE_SOA_DYNAMIC_COLUMN(Phi, phi, [](uint16_t storedPhi) -> float { return storedPhi / emdownscaling::downscalingFactors[emdownscaling::kPhi]; }); //! cluster azimuthal angle (0 to 2pi) +DECLARE_SOA_DYNAMIC_COLUMN(NCells, nCells, [](uint16_t storedNCells) -> uint16_t { return storedNCells; }); //! number of cells in cluster +DECLARE_SOA_DYNAMIC_COLUMN(M02, m02, [](uint16_t storedM02) -> float { return storedM02 / emdownscaling::downscalingFactors[emdownscaling::kM02]; }); //! shower shape long axis +DECLARE_SOA_DYNAMIC_COLUMN(Time, time, [](int16_t storedTime) -> float { return storedTime / emdownscaling::downscalingFactors[emdownscaling::kTime]; }); //! cluster time (ns) +DECLARE_SOA_DYNAMIC_COLUMN(IsExotic, isExotic, [](bool storedIsExotic) -> bool { return storedIsExotic; }); //! flag to mark cluster as exotic + +DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, [](float storedE, float storedEta) -> float { return storedE / emdownscaling::downscalingFactors[emdownscaling::kEnergy] / std::cosh(storedEta / emdownscaling::downscalingFactors[emdownscaling::kEta]); }); //! cluster pt, assuming m=0 (photons) +} // namespace bcwisecluster + +DECLARE_SOA_TABLE(BCWiseClusters, "AOD", "BCWISECLUSTERS", //! table of skimmed EMCal clusters + o2::soa::Index<>, BCWiseBCId, bcwisecluster::StoredDefinition, bcwisecluster::StoredE, bcwisecluster::StoredEta, bcwisecluster::StoredPhi, bcwisecluster::StoredNCells, bcwisecluster::StoredM02, bcwisecluster::StoredTime, bcwisecluster::StoredIsExotic, + bcwisecluster::Definition, bcwisecluster::E, bcwisecluster::Eta, bcwisecluster::Phi, bcwisecluster::NCells, bcwisecluster::M02, bcwisecluster::Time, bcwisecluster::IsExotic, + bcwisecluster::Pt); + +namespace bcwisemcpi0s +{ +DECLARE_SOA_COLUMN(ParticleIdPi0, particleIdPi0, int); //! ID of the pi0 in the MC stack +DECLARE_SOA_COLUMN(StoredPt, storedPt, uint16_t); //! Transverse momentum of generated pi0 (10 MeV) +DECLARE_SOA_COLUMN(IsAccepted, isAccepted, bool); //! Both decay photons are within the EMCal acceptance +DECLARE_SOA_COLUMN(IsPrimary, isPrimary, bool); //! mcParticle.isPhysicalPrimary() || mcParticle.producedByGenerator() +DECLARE_SOA_COLUMN(IsFromWD, isFromWD, bool); //! Pi0 from a weak decay according to pwgem::photonmeson::utils::mcutil::IsFromWD + +DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, [](uint16_t storedpt) -> float { return storedpt / emdownscaling::downscalingFactors[emdownscaling::kpT]; }); //! pT of pi0 (GeV) +} // namespace bcwisemcpi0s + +DECLARE_SOA_TABLE(BCWiseMCPi0s, "AOD", "BCWISEMCPI0S", //! table of pi0s on MC level + o2::soa::Index<>, BCWiseBCId, bcwisemcpi0s::ParticleIdPi0, bcwisemcpi0s::StoredPt, bcwisemcpi0s::IsAccepted, bcwisemcpi0s::IsPrimary, bcwisemcpi0s::IsFromWD, + bcwisemcpi0s::Pt); + +namespace bcwisemccluster +{ +DECLARE_SOA_COLUMN(StoredE, storedE, uint16_t); //! energy of cluster inducing particle (1 MeV precision) + +DECLARE_SOA_DYNAMIC_COLUMN(E, e, [](uint16_t storedE) -> float { return storedE / emdownscaling::downscalingFactors[emdownscaling::kEnergy]; }); //! energy of cluster inducing particle (GeV) +} // namespace bcwisemccluster + +DECLARE_SOA_TABLE(BCWiseMCClusters, "AOD", "BCWISEMCCLS", //! table of MC information for clusters -> To be joined with the cluster table + o2::soa::Index<>, BCWiseBCId, bcwisemccluster::StoredE, bcwisemcpi0s::ParticleIdPi0, + bcwisemccluster::E); + +} // namespace o2::aod + +#endif // PWGEM_PHOTONMESON_DATAMODEL_BCWISETABLES_H_ diff --git a/PWGEM/PhotonMeson/TableProducer/CMakeLists.txt b/PWGEM/PhotonMeson/TableProducer/CMakeLists.txt index ede83862a3f..10266dcb8c2 100644 --- a/PWGEM/PhotonMeson/TableProducer/CMakeLists.txt +++ b/PWGEM/PhotonMeson/TableProducer/CMakeLists.txt @@ -44,6 +44,11 @@ o2physics_add_dpl_workflow(skimmer-gamma-calo PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(bc-wise-cluster-skimmer + SOURCES bcWiseClusterSkimmer.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2::EMCALBase O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(skimmer-phos SOURCES skimmerPHOS.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::PHOSBase diff --git a/PWGEM/PhotonMeson/TableProducer/bcWiseClusterSkimmer.cxx b/PWGEM/PhotonMeson/TableProducer/bcWiseClusterSkimmer.cxx new file mode 100644 index 00000000000..2cdaf79f2f0 --- /dev/null +++ b/PWGEM/PhotonMeson/TableProducer/bcWiseClusterSkimmer.cxx @@ -0,0 +1,274 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// +/// \file bcWiseClusterSkimmer.cxx +/// +/// \brief This task creates minimalistic skimmed tables containing EMC clusters and centrality information +/// +/// \author Nicolas Strangmann (nicolas.strangmann@cern.ch) - Goethe University Frankfurt +/// + +#include +#include + +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" + +#include "DetectorsBase/GeometryManager.h" +#include "EMCALBase/Geometry.h" + +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Centrality.h" +#include "PWGJE/DataModel/EMCALClusters.h" +#include "PWGEM/PhotonMeson/Utils/MCUtilities.h" +#include "PWGEM/PhotonMeson/DataModel/bcWiseTables.h" + +using namespace o2; +using namespace o2::aod::emdownscaling; +using namespace o2::framework; + +using MyCollisions = soa::Join; +using MyMCCollisions = soa::Join; +using MyBCs = soa::Join; + +using SelectedUniqueClusters = soa::Filtered; // Clusters from collisions with only one collision in the BC +using SelectedUniqueMCClusters = soa::Filtered>; // Clusters from collisions with only one collision in the BC +using SelectedAmbiguousClusters = soa::Filtered; // Clusters from BCs with multiple collisions (no vertex assignment possible) +using SelectedAmbiguousMCClusters = soa::Filtered>; // Clusters from BCs with multiple collisions (no vertex assignment possible) +using SelectedCells = o2::soa::Filtered; + +struct bcWiseClusterSkimmer { + Produces bcTable; + Produces clusterTable; + Produces collisionTable; + Produces mcpi0Table; + Produces mcclusterTable; + + PresliceUnsorted perFoundBC = aod::evsel::foundBCId; + Preslice perCol = aod::emcalcluster::collisionId; + Preslice perBC = aod::emcalcluster::bcId; + Preslice cellsPerBC = aod::calo::bcId; + + Configurable cfgMinClusterEnergy{"cfgMinClusterEnergy", 0.5, "Minimum energy of selected clusters (GeV)"}; + Configurable cfgMinM02{"cfgMinM02", -1., "Minimum M02 of selected clusters"}; + Configurable cfgMaxM02{"cfgMaxM02", 5., "Maximum M02 of selected clusters"}; + Configurable cfgMinTime{"cfgMinTime", -25, "Minimum time of selected clusters (ns)"}; + Configurable cfgMaxTime{"cfgMaxTime", 25, "Maximum time of selected clusters (ns)"}; + Configurable cfgRapidityCut{"cfgRapidityCut", 0.8f, "Maximum absolute rapidity of counted generated particles"}; + + expressions::Filter energyFilter = aod::emcalcluster::energy > cfgMinClusterEnergy; + expressions::Filter m02Filter = (aod::emcalcluster::nCells == 1 || (aod::emcalcluster::m02 > cfgMinM02 && aod::emcalcluster::m02 < cfgMaxM02)); + expressions::Filter timeFilter = (aod::emcalcluster::time > cfgMinTime && aod::emcalcluster::time < cfgMaxTime); + expressions::Filter emccellfilter = aod::calo::caloType == 1; + + HistogramRegistry mHistManager{"output", {}, OutputObjHandlingPolicy::AnalysisObject, false, false}; + + void init(framework::InitContext&) + { + const int nEventBins = 6; + mHistManager.add("nBCs", "Number of BCs;;#bf{#it{N}_{BCs}}", HistType::kTH1F, {{nEventBins, -0.5, 5.5}}); + const TString binLabels[nEventBins] = {"All", "FT0", "TVX", "kTVXinEMC", "Cell", "NoBorder"}; + for (int iBin = 0; iBin < nEventBins; iBin++) + mHistManager.get(HIST("nBCs"))->GetXaxis()->SetBinLabel(iBin + 1, binLabels[iBin]); + + mHistManager.add("hAmplitudeVsCentrality", "FT0M AmplitudeVsCentrality;FT0M Centrality;FT0M Amplitude", HistType::kTH2F, {{105, 0, 105}, {400, 0, 200000}}); + mHistManager.add("sumAmp", "Sum Amplitude", HistType::kTH1F, {{1000, 0., 10.}}); + mHistManager.add("nCells", "Number of EMCal cells", HistType::kTH1F, {{5000, -0.5, 5000.5}}); + + LOG(info) << "| Timing cut: " << cfgMinTime << " < t < " << cfgMaxTime; + LOG(info) << "| M02 cut: " << cfgMinM02 << " < M02 < " << cfgMaxM02; + LOG(info) << "| E cut: E > " << cfgMinClusterEnergy; + + o2::emcal::Geometry::GetInstanceFromRunNumber(300000); + } + + /// \brief Process EMCAL clusters (either ambigous or unique) + template + OutputType convertForStorage(InputType const& valueIn, Observables observable) + { + double valueToBeChecked = valueIn * downscalingFactors[observable]; + if (valueToBeChecked < std::numeric_limits::lowest()) { + LOG(warning) << "Value " << valueToBeChecked << " of observable " << observable << " below lowest possible value of " << typeid(OutputType).name() << ": " << static_cast(std::numeric_limits::lowest()); + valueToBeChecked = static_cast(std::numeric_limits::lowest()); + } + if (valueToBeChecked > std::numeric_limits::max()) { + LOG(warning) << "Value " << valueToBeChecked << " of observable " << observable << " obove highest possible value of " << typeid(OutputType).name() << ": " << static_cast(std::numeric_limits::max()); + valueToBeChecked = static_cast(std::numeric_limits::max()); + } + + return static_cast(valueToBeChecked); + } + + /// \brief Process EMCAL clusters (either ambigous or unique) + template + void processClusters(Clusters const& clusters, const int bcID) + { + for (const auto& cluster : clusters) { + clusterTable(bcID, + convertForStorage(cluster.definition(), kDefinition), + convertForStorage(cluster.energy(), kEnergy), + convertForStorage(cluster.eta(), kEta), + convertForStorage(cluster.phi(), kPhi), + convertForStorage(cluster.nCells(), kNCells), + convertForStorage(cluster.m02(), kM02), + convertForStorage(cluster.time(), kTime), + cluster.isExotic()); + } + } + + template + void processClusterMCInfo(Clusters const& clusters, const int bcID, aod::McParticles const& mcParticles) + { + for (const auto& cluster : clusters) { + float clusterInducerEnergy = 0.; + int pi0MCIndex = -1; + if (cluster.amplitudeA().size() > 0) { + int clusterInducerId = cluster.mcParticleIds()[0]; + auto clusterInducer = mcParticles.iteratorAt(clusterInducerId); + clusterInducerEnergy = clusterInducer.e(); + int daughterId = aod::pwgem::photonmeson::utils::mcutil::FindMotherInChain(clusterInducer, mcParticles, std::vector{111}); + if (daughterId > 0) { + pi0MCIndex = mcParticles.iteratorAt(daughterId).mothersIds()[0]; + } + } + mcclusterTable(bcID, convertForStorage(clusterInducerEnergy, kEnergy), pi0MCIndex); + } + } + + void processEventProperties(const auto& bc, const auto& collisionsInBC, const auto& cellsInBC) + { + float sumAmp = 0.; + for (const auto& cell : cellsInBC) + sumAmp += cell.amplitude(); + mHistManager.fill(HIST("sumAmp"), sumAmp); + mHistManager.fill(HIST("nCells"), cellsInBC.size()); + + bool hasFT0 = bc.has_foundFT0(); + bool hasTVX = bc.selection_bit(aod::evsel::kIsTriggerTVX); + bool haskTVXinEMC = bc.alias_bit(kTVXinEMC); + bool hasEMCCell = cellsInBC.size() > 0; + bool hasNoTFROFBorder = bc.selection_bit(aod::evsel::kNoTimeFrameBorder) && bc.selection_bit(aod::evsel::kNoITSROFrameBorder); + mHistManager.fill(HIST("nBCs"), 0); + if (hasFT0) + mHistManager.fill(HIST("nBCs"), 1); + if (hasTVX) + mHistManager.fill(HIST("nBCs"), 2); + if (haskTVXinEMC) + mHistManager.fill(HIST("nBCs"), 3); + if (hasEMCCell) + mHistManager.fill(HIST("nBCs"), 4); + if (hasNoTFROFBorder) + mHistManager.fill(HIST("nBCs"), 5); + + float ft0Amp = hasFT0 ? bc.foundFT0().sumAmpA() + bc.foundFT0().sumAmpC() : 0.; + + bcTable(hasFT0, hasTVX, haskTVXinEMC, hasEMCCell, hasNoTFROFBorder, convertForStorage(ft0Amp, kFT0Amp), convertForStorage(cellsInBC.size(), kNCells), convertForStorage(sumAmp, kCellAmpSum)); + + for (const auto& collision : collisionsInBC) { + collisionTable(bcTable.lastIndex(), convertForStorage(collision.centFT0M(), kFT0MCent), convertForStorage(collision.posZ(), kZVtx)); + mHistManager.fill(HIST("hAmplitudeVsCentrality"), collision.centFT0M(), ft0Amp); + } + + if (collisionsInBC.size() == 0) + mHistManager.fill(HIST("hAmplitudeVsCentrality"), 103, ft0Amp); + } + + template + bool isGammaGammaDecay(TMCParticle mcParticle, TMCParticles mcParticles) + { + auto daughtersIds = mcParticle.daughtersIds(); + if (daughtersIds.size() != 2) + return false; + for (const auto& daughterId : daughtersIds) { + if (mcParticles.iteratorAt(daughterId).pdgCode() != 22) + return false; + } + return true; + } + + template + bool isAccepted(TMCParticle mcParticle, TMCParticles mcParticles) + { + auto daughtersIds = mcParticle.daughtersIds(); + if (daughtersIds.size() != 2) + return false; + for (const auto& daughterId : daughtersIds) { + if (mcParticles.iteratorAt(daughterId).pdgCode() != 22) + return false; + int iCellID = -1; + try { + iCellID = emcal::Geometry::GetInstance()->GetAbsCellIdFromEtaPhi(mcParticles.iteratorAt(daughterId).eta(), mcParticles.iteratorAt(daughterId).phi()); + } catch (emcal::InvalidPositionException& e) { + iCellID = -1; + } + if (iCellID == -1) + return false; + } + return true; + } + + void processData(MyBCs const& bcs, MyCollisions const& collisions, aod::FT0s const&, SelectedCells const& cells, SelectedUniqueClusters const& uClusters, SelectedAmbiguousClusters const& aClusters) + { + for (const auto& bc : bcs) { + auto collisionsInBC = collisions.sliceBy(perFoundBC, bc.globalIndex()); + auto cellsInBC = cells.sliceBy(cellsPerBC, bc.globalIndex()); + + processEventProperties(bc, collisionsInBC, cellsInBC); + + if (collisionsInBC.size() == 1) { + auto clustersInBC = uClusters.sliceBy(perCol, collisionsInBC.begin().globalIndex()); + processClusters(clustersInBC, bcTable.lastIndex()); + } else { + auto clustersInBC = aClusters.sliceBy(perBC, bc.globalIndex()); + processClusters(clustersInBC, bcTable.lastIndex()); + } + } + } + PROCESS_SWITCH(bcWiseClusterSkimmer, processData, "Run skimming for data", true); + + Preslice mcCollperBC = aod::mccollision::bcId; + Preslice perMcCollision = aod::mcparticle::mcCollisionId; + + void processMC(MyBCs const& bcs, MyMCCollisions const& collisions, aod::McCollisions const& mcCollisions, aod::FT0s const&, SelectedCells const& cells, SelectedUniqueMCClusters const& uClusters, SelectedAmbiguousMCClusters const& aClusters, aod::McParticles const& mcParticles) + { + for (const auto& bc : bcs) { + auto collisionsInBC = collisions.sliceBy(perFoundBC, bc.globalIndex()); + auto cellsInBC = cells.sliceBy(cellsPerBC, bc.globalIndex()); + + processEventProperties(bc, collisionsInBC, cellsInBC); + + auto mcCollisionsBC = mcCollisions.sliceBy(mcCollperBC, bc.globalIndex()); + for (const auto& mcCollision : mcCollisionsBC) { + auto mcParticlesInColl = mcParticles.sliceBy(perMcCollision, mcCollision.globalIndex()); + for (const auto& mcParticle : mcParticlesInColl) { + if (mcParticle.pdgCode() != 111 || fabs(mcParticle.y()) > cfgRapidityCut || !isGammaGammaDecay(mcParticle, mcParticles)) + continue; + bool isPrimary = mcParticle.isPhysicalPrimary() || mcParticle.producedByGenerator(); + bool isFromWD = (aod::pwgem::photonmeson::utils::mcutil::IsFromWD(mcCollision, mcParticle, mcParticles)) > 0; + mcpi0Table(bc.globalIndex(), mcParticle.globalIndex(), convertForStorage(mcParticle.pt(), kpT), isAccepted(mcParticle, mcParticles), isPrimary, isFromWD); + } + } + + if (collisionsInBC.size() == 1) { + auto clustersInBC = uClusters.sliceBy(perCol, collisionsInBC.begin().globalIndex()); + processClusters(clustersInBC, bcTable.lastIndex()); + processClusterMCInfo(clustersInBC, bc.globalIndex(), mcParticles); + } else { + auto clustersInBC = aClusters.sliceBy(perBC, bc.globalIndex()); + processClusters(clustersInBC, bcTable.lastIndex()); + processClusterMCInfo(clustersInBC, bc.globalIndex(), mcParticles); + } + } + } + PROCESS_SWITCH(bcWiseClusterSkimmer, processMC, "Run skimming for MC", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc)}; } diff --git a/PWGEM/PhotonMeson/Tasks/CMakeLists.txt b/PWGEM/PhotonMeson/Tasks/CMakeLists.txt index ef25948726c..975a217fab7 100644 --- a/PWGEM/PhotonMeson/Tasks/CMakeLists.txt +++ b/PWGEM/PhotonMeson/Tasks/CMakeLists.txt @@ -24,6 +24,11 @@ o2physics_add_dpl_workflow(emc-pi0-qc PUBLIC_LINK_LIBRARIES O2::Framework O2::EMCALBase O2::EMCALCalib O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(emc-bc-wise-pi0 + SOURCES emcalBcWisePi0.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2::EMCALBase O2::EMCALCalib O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(pcm-qc SOURCES pcmQC.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2::DetectorsBase O2Physics::AnalysisCore O2Physics::PWGEMPhotonMesonCore diff --git a/PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx b/PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx new file mode 100644 index 00000000000..d8b1599d596 --- /dev/null +++ b/PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx @@ -0,0 +1,218 @@ +// Copyright 2019-2024 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +// +/// +/// \file emcalBcWisePi0.cxx +/// +/// \brief Task that extracts pi0s from BC wise derived data of EMCal clusters +/// +/// \author Nicolas Strangmann (nicolas.strangmann@cern.ch) Goethe University Frankfurt +/// + +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" + +#include "TString.h" +#include "Math/Vector4D.h" +#include "Math/Vector3D.h" +#include "Math/LorentzRotation.h" +#include "Math/Rotation3D.h" +#include "Math/AxisAngle.h" + +#include "CommonConstants/MathConstants.h" +#include "EMCALBase/Geometry.h" +#include "PWGEM/PhotonMeson/DataModel/bcWiseTables.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +struct EmcalBcWisePi0 { + HistogramRegistry mHistManager{"EmcalGammaGammaBcWiseHistograms"}; + + Configurable cfgClusterDefinition{"cfgClusterDefinition", 10, "Clusterizer to be selected, e.g. 13 for kV3MostSplitLowSeed"}; + Configurable cfgMinClusterEnergy{"cfgMinClusterEnergy", 0.7, "Minimum energy of selected clusters (GeV)"}; + Configurable cfgMinM02{"cfgMinM02", 0.1, "Minimum M02 of selected clusters"}; + Configurable cfgMaxM02{"cfgMaxM02", 0.7, "Maximum M02 of selected clusters"}; + Configurable cfgMinTime{"cfgMinTime", -15, "Minimum time of selected clusters (ns)"}; + Configurable cfgMaxTime{"cfgMaxTime", 15, "Maximum time of selected clusters (ns)"}; + Configurable cfgRapidityCut{"cfgRapidityCut", 0.8f, "Maximum absolute rapidity of counted particles"}; + Configurable cfgMinOpenAngle{"cfgMinOpenAngle", 0.0202, "Minimum opening angle between photons"}; + Configurable cfgDistanceToEdge{"cfgDistanceToEdge", 1, "Distance to edge in cells required for rotated cluster to be accepted"}; + Configurable cfgBGEventDownsampling{"cfgBGEventDownsampling", 1, "Only calculate background for every n-th event (performance reasons in PbPb)"}; + + static constexpr float DefaultCentralityWindow[2] = {-1., 101.}; + Configurable> cfgCentralityWindow{"cfgCentralityWindow", {DefaultCentralityWindow, 2, {"Min_Centrality", "Max_Centrality"}}, "Select centrality window (also requires unique collision)"}; + + Filter clusterDefinitionFilter = aod::bcwisecluster::storedDefinition == static_cast(cfgClusterDefinition); + Filter energyFilter = aod::bcwisecluster::storedE > static_cast(cfgMinClusterEnergy* aod::emdownscaling::downscalingFactors[aod::emdownscaling::kEnergy]); + Filter m02Filter = (aod::bcwisecluster::storedNCells == static_cast(1) || (aod::bcwisecluster::storedM02 > static_cast(cfgMinM02 * aod::emdownscaling::downscalingFactors[aod::emdownscaling::kM02]) && aod::bcwisecluster::storedM02 < static_cast(cfgMaxM02 * aod::emdownscaling::downscalingFactors[aod::emdownscaling::kM02]))); + Filter timeFilter = (aod::bcwisecluster::storedTime > static_cast(cfgMinTime * aod::emdownscaling::downscalingFactors[aod::emdownscaling::kTime]) && aod::bcwisecluster::storedTime < static_cast(cfgMaxTime * aod::emdownscaling::downscalingFactors[aod::emdownscaling::kTime])); + + emcal::Geometry* emcalGeom; + + void init(InitContext const&) + { + emcalGeom = emcal::Geometry::GetInstanceFromRunNumber(300000); + const int nEventBins = 8; + mHistManager.add("nBCs", "Number of BCs;;#bf{#it{N}_{BC}}", HistType::kTH1F, {{nEventBins, -0.5, 7.5}}); + const TString binLabels[nEventBins] = {"All", "FT0", "TVX", "kTVXinEMC", "Cell", "Cluster", "NoBorder", "Collision"}; + for (int iBin = 0; iBin < nEventBins; iBin++) + mHistManager.get(HIST("nBCs"))->GetXaxis()->SetBinLabel(iBin + 1, binLabels[iBin]); + + mHistManager.add("Centrality", "FT0M centrality;FT0M centrality (%);#bf{#it{N}_{BC} (only BCs containing exactly 1 collision)}", HistType::kTH1F, {{100, 0., 100.}}); + + mHistManager.add("clusterE", "Energy of cluster;#bf{#it{E} (GeV)};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{200, 0, 20}}); + mHistManager.add("clusterM02", "Shape of cluster;#bf{#it{M}_{02}};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{200, 0, 2}}); + mHistManager.add("clusterTime", "Time of cluster;#bf{#it{t} (ns)};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{200, -100, 100}}); + mHistManager.add("clusterNCells", "Number of cells per cluster;#bf{#it{N}_{cells}};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{51, 0., 50.5}}); + mHistManager.add("clusterExotic", "Is cluster exotic?;#bf{Exotic?};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{2, -0.5, 1.5}}); + mHistManager.add("clusterEtaPhi", "Eta/Phi distribution of clusters;#eta;#phi", HistType::kTH2F, {{400, -0.8, 0.8}, {400, 0, constants::math::TwoPI}}); + + mHistManager.add("invMassVsPt", "Invariant mass and pT of meson candidates", HistType::kTH2F, {{400, 0., 0.8}, {200, 0., 20.}}); + mHistManager.add("invMassVsPtBackground", "Invariant mass and pT of background meson candidates", HistType::kTH2F, {{400, 0., 0.8}, {200, 0., 20.}}); + } + + /// \brief returns if cluster is too close to edge of EMCal + bool isTooCloseToEdge(const int cellID, const int DistanceToBorder = 1) + { + if (DistanceToBorder <= 0) + return false; + if (cellID < 0) + return true; + + // check distance to border in case the cell is okay + auto [iSupMod, iMod, iPhi, iEta] = emcalGeom->GetCellIndex(cellID); + auto [irow, icol] = emcalGeom->GetCellPhiEtaIndexInSModule(iSupMod, iMod, iPhi, iEta); + int iRowLast = (emcalGeom->GetSMType(iSupMod) == o2::emcal::EMCALSMType::EMCAL_THIRD || emcalGeom->GetSMType(iSupMod) == o2::emcal::EMCALSMType::DCAL_EXT) ? 8 : 24; + + return (irow < DistanceToBorder || (iRowLast - irow) <= DistanceToBorder); + } + + void fillEventHists(const auto& bc, const auto& collisions, const auto& clusters) + { + mHistManager.fill(HIST("nBCs"), 0); + if (bc.hasFT0()) + mHistManager.fill(HIST("nBCs"), 1); + if (bc.hasTVX()) + mHistManager.fill(HIST("nBCs"), 2); + if (bc.haskTVXinEMC()) + mHistManager.fill(HIST("nBCs"), 3); + if (bc.hasEMCCell()) + mHistManager.fill(HIST("nBCs"), 4); + if (clusters.size() > 0) + mHistManager.fill(HIST("nBCs"), 5); + if (bc.hasNoTFROFBorder()) + mHistManager.fill(HIST("nBCs"), 6); + if (collisions.size() > 0) + mHistManager.fill(HIST("nBCs"), 7); + + if (collisions.size() == 1) { + for (const auto& collision : collisions) + mHistManager.fill(HIST("Centrality"), collision.centrality()); + } + } + + void fillClusterHists(const auto& clusters) + { + for (const auto& cluster : clusters) { + mHistManager.fill(HIST("clusterE"), cluster.e()); + mHistManager.fill(HIST("clusterM02"), cluster.m02()); + mHistManager.fill(HIST("clusterTime"), cluster.time()); + mHistManager.fill(HIST("clusterNCells"), cluster.nCells()); + mHistManager.fill(HIST("clusterEtaPhi"), cluster.eta(), cluster.phi()); + mHistManager.fill(HIST("clusterExotic"), cluster.isExotic()); + } + } + + void reconstructMesons(const auto& clusters, int bcId) + { + for (const auto& [g1, g2] : soa::combinations(soa::CombinationsStrictlyUpperIndexPolicy(clusters, clusters))) { + ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.); + ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.); + ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; + if (std::fabs(v12.Rapidity()) > cfgRapidityCut) + continue; + + float openingAngle12 = std::acos(v1.Vect().Dot(v2.Vect()) / (v1.P() * v2.P())); + if (openingAngle12 < cfgMinOpenAngle) + continue; + + mHistManager.fill(HIST("invMassVsPt"), v12.M(), v12.Pt()); + + if (clusters.size() < 3) + continue; + + if (bcId % cfgBGEventDownsampling != 0) + continue; + + // "else: Calculate background" + + ROOT::Math::AxisAngle rotationAxis(v12.Vect(), constants::math::PIHalf); + ROOT::Math::Rotation3D rotationMatrix(rotationAxis); + for (ROOT::Math::PtEtaPhiMVector vi : {v1, v2}) { + + vi = rotationMatrix * vi; + + try { + int iCellID = emcalGeom->GetAbsCellIdFromEtaPhi(vi.Eta(), vi.Phi()); + if (isTooCloseToEdge(iCellID, cfgDistanceToEdge)) + continue; + } catch (o2::emcal::InvalidPositionException& e) { + continue; + } + + for (const auto& g3 : clusters) { + if (g3.globalIndex() == g1.globalIndex() || g3.globalIndex() == g2.globalIndex()) + continue; + + ROOT::Math::PtEtaPhiMVector v3(g3.pt(), g3.eta(), g3.phi(), 0.); + + float openingAnglei3 = std::acos(vi.Vect().Dot(v3.Vect()) / (vi.P() * v3.P())); + if (openingAnglei3 < cfgMinOpenAngle) + continue; + + ROOT::Math::PtEtaPhiMVector vBG = v3 + vi; + + mHistManager.fill(HIST("invMassVsPtBackground"), vBG.M(), vBG.Pt()); + } + } + } + } + + bool isCentralitySelected(const auto& collisions) + { + if (cfgCentralityWindow->get("Min_Centrality") > -0.5 || cfgCentralityWindow->get("Max_Centrality") < 100.5) { // Centrality window is set + if (collisions.size() != 1) + return false; + for (const auto& collision : collisions) { + if (collision.centrality() < cfgCentralityWindow->get("Min_Centrality") || collision.centrality() > cfgCentralityWindow->get("Max_Centrality")) + return false; + } + } + return true; + } + + void process(aod::BCWiseBCs::iterator const& bc, aod::BCWiseCollisions const& collisions, soa::Filtered const& clusters) + { + if (!isCentralitySelected(collisions)) + return; + + fillEventHists(bc, collisions, clusters); + + fillClusterHists(clusters); + + reconstructMesons(clusters, bc.globalIndex()); + } +}; + +WorkflowSpec defineDataProcessing(o2::framework::ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc)}; } diff --git a/PWGJE/DataModel/EMCALClusters.h b/PWGJE/DataModel/EMCALClusters.h index 1981fd635aa..c634b4b017e 100644 --- a/PWGJE/DataModel/EMCALClusters.h +++ b/PWGJE/DataModel/EMCALClusters.h @@ -135,6 +135,12 @@ DECLARE_SOA_TABLE(EMCALMCClusters, "AOD", "EMCALMCCLUSTERS", //! using EMCALMCCluster = EMCALMCClusters::iterator; +// table of cluster MC info that could not be matched to a collision +DECLARE_SOA_TABLE(EMCALAmbiguousMCClusters, "AOD", "EMCALAMBMCCLS", //! + emcalclustermc::McParticleIds, emcalclustermc::AmplitudeA); + +using EMCALAmbiguousMCCluster = EMCALAmbiguousMCClusters::iterator; + namespace emcalclustercell { // declare index column pointing to cluster table diff --git a/PWGJE/TableProducer/emcalCorrectionTask.cxx b/PWGJE/TableProducer/emcalCorrectionTask.cxx index 2b121530d5d..bf72e3275d6 100644 --- a/PWGJE/TableProducer/emcalCorrectionTask.cxx +++ b/PWGJE/TableProducer/emcalCorrectionTask.cxx @@ -65,6 +65,7 @@ struct EmcalCorrectionTask { Produces clusters; Produces mcclusters; Produces clustersAmbiguous; + Produces mcclustersAmbiguous; Produces clustercells; // cells belonging to given cluster Produces clustercellsambiguous; Produces matchedTracks; @@ -702,6 +703,10 @@ struct EmcalCorrectionTask { { int cellindex = -1; clustersAmbiguous.reserve(mAnalysisClusters.size()); + if (mClusterLabels.size() > 0) { + mcclustersAmbiguous.reserve(mClusterLabels.size()); + } + unsigned int iCluster = 0; for (const auto& cluster : mAnalysisClusters) { auto pos = cluster.getGlobalPosition(); pos = pos - math_utils::Point3D{0., 0., 0.}; @@ -730,12 +735,16 @@ struct EmcalCorrectionTask { cluster.getM20(), cluster.getNCells(), cluster.getClusterTime(), cluster.getIsExotic(), cluster.getDistanceToBadChannel(), cluster.getNExMax(), static_cast(mClusterDefinitions.at(iClusterizer))); + if (mClusterLabels.size() > 0) { + mcclustersAmbiguous(mClusterLabels[iCluster].getLabels(), mClusterLabels[iCluster].getEnergyFractions()); + } clustercellsambiguous.reserve(cluster.getNCells()); for (int ncell = 0; ncell < cluster.getNCells(); ncell++) { cellindex = cluster.getCellIndex(ncell); clustercellsambiguous(clustersAmbiguous.lastIndex(), cellIndicesBC[cellindex]); } // end of cells of cluster loop + iCluster++; } // end of cluster loop } From 8a4bc16c6739a0a7f1925d5ef1b68d733c92d0de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Wed, 23 Apr 2025 19:30:30 +0200 Subject: [PATCH 1072/1650] [Infrastructure] O2 linter: Support severity levels and tolerated tests per directory (#10899) --- .github/workflows/o2-linter.yml | 37 ++++++- Scripts/o2_linter.py | 165 ++++++++++++++++++++++---------- 2 files changed, 146 insertions(+), 56 deletions(-) diff --git a/.github/workflows/o2-linter.yml b/.github/workflows/o2-linter.yml index 8e150e970fd..099209da6e6 100644 --- a/.github/workflows/o2-linter.yml +++ b/.github/workflows/o2-linter.yml @@ -2,10 +2,10 @@ # Find issues in O2 code name: O2 linter -'on': [pull_request, push] +"on": [pull_request_target, push] permissions: {} env: - MAIN_BRANCH: master + BRANCH_MAIN: master concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }} @@ -15,20 +15,47 @@ jobs: o2-linter: name: O2 linter runs-on: ubuntu-24.04 + permissions: + pull-requests: write steps: + - name: Set branches + run: | + if [[ "${{ github.event_name }}" == "push" ]]; then + branch_head="${{ github.ref }}" + branch_base="${{ env.BRANCH_MAIN }}" + else + branch_head="refs/pull/${{ github.event.pull_request.number }}/merge" + branch_base="${{ github.event.pull_request.base.ref }}" + fi + echo BRANCH_HEAD="$branch_head" >> "$GITHUB_ENV" + echo BRANCH_BASE="$branch_base" >> "$GITHUB_ENV" - name: Checkout Code uses: actions/checkout@v4 with: + ref: ${{ env.BRANCH_HEAD }} fetch-depth: 0 # needed to get the full history - name: Run tests + id: linter run: | - # Diff against the common ancestor of the source branch and the main branch. - readarray -t files < <(git diff --diff-filter d --name-only origin/${{ env.MAIN_BRANCH }}...) + # Diff against the common ancestor of the source (head) branch and the target (base) branch. + echo "Diffing ${{ env.BRANCH_HEAD }} against ${{ env.BRANCH_BASE }}." + readarray -t files < <(git diff --diff-filter d --name-only origin/${{ env.BRANCH_BASE }}...) if [ ${#files[@]} -eq 0 ]; then echo "::notice::No files to lint." + echo "linter_ran=0" >> "$GITHUB_OUTPUT" exit 0 fi - [ ${{ github.event_name }} == 'pull_request' ] && options="-g" + echo "linter_ran=1" >> "$GITHUB_OUTPUT" + [[ "${{ github.event_name }}" == "pull_request_target" ]] && options="-g" # shellcheck disable=SC2086 # Ignore unquoted options. python3 Scripts/o2_linter.py $options "${files[@]}" echo "Tip: If you allow actions in your fork repository, O2 linter will run when you push commits." + - name: Comment PR + if: (success() || failure()) && (github.event_name == 'pull_request_target' && steps.linter.outputs.linter_ran == 1) + uses: thollander/actions-comment-pull-request@v3 + with: + comment-tag: o2-linter + message: "**O2 linter results:** + ❌ ${{ steps.linter.outputs.n_issues }} errors, + ⚠️ ${{ steps.linter.outputs.n_tolerated }} warnings, + 🔕 ${{ steps.linter.outputs.n_disabled }} disabled" diff --git a/Scripts/o2_linter.py b/Scripts/o2_linter.py index bf365180c5f..fbc4bacc2cd 100644 --- a/Scripts/o2_linter.py +++ b/Scripts/o2_linter.py @@ -22,10 +22,28 @@ import re import sys from enum import Enum +from pathlib import Path from typing import Union github_mode = False # GitHub mode prefix_disable = "o2-linter: disable=" # prefix for disabling tests +file_config = "o2linter_config" # name of the configuration file (applied per directory) +# If this file exists in the path of the tested file, +# failures of tests listed in this file will not make the linter fail. + + +# issue severity levels +class Severity(Enum): + WARNING = 1 + ERROR = 2 + DEFAULT = ERROR + + +# strings for error messages +message_levels = { + Severity.WARNING: "warning", + Severity.ERROR: "error", +} class Reference(Enum): @@ -126,16 +144,6 @@ def camel_case_to_kebab_case(line: str) -> str: return "".join(new_line) -def print_error(path: str, line: Union[int, None], title: str, message: str): - """Format and print error message.""" - # return # Use to suppress error messages. - str_line = "" if line is None else f"{line}:" - print(f"{path}:{str_line} {message} [{title}]") # terminal format - if github_mode: - str_line = "" if line is None else f",line={line}" - print(f"::warning file={path}{str_line},title=[{title}]::{message}") # GitHub annotation format - - def is_comment_cpp(line: str) -> bool: """Test whether a line is a C++ comment.""" return line.strip().startswith(("//", "/*")) @@ -188,6 +196,23 @@ def direction(char: str) -> int: return list_ranges +def get_tolerated_tests(path: str) -> "list[str]": + """Get the list of tolerated tests. + + Looks for the configuration file. + Starts in the test file directory and iterates through parents. + """ + tests: list[str] = [] + for directory in Path(path).resolve().parents: + path_tests = directory / file_config + if path_tests.is_file(): + with path_tests.open() as content: + tests = [line.strip() for line in content.readlines() if line.strip()] + print(f"{path}:0: info: Tolerating tests from {path_tests}. {tests}") + break + return tests + + class TestSpec: """Prototype of a test class""" @@ -195,10 +220,14 @@ class TestSpec: message: str = "Test failed" # error message rationale: str = "Rationale missing" # brief rationale explanation references: "list[Reference]" = [] # list of references relevant for this rule + severity_default: Severity = Severity.DEFAULT + severity_current: Severity = Severity.DEFAULT suffixes: "list[str]" = [] # suffixes of files to test per_line: bool = True # Test lines separately one by one. + tolerated: bool = False # flag for tolerating issues n_issues: int = 0 # issue counter n_disabled: int = 0 # counter of disabled issues + n_tolerated: int = 0 # counter of tolerated issues def file_matches(self, path: str) -> bool: """Test whether the path matches the pattern for files to test.""" @@ -217,6 +246,16 @@ def is_disabled(self, line: str, prefix_comment="//") -> bool: return True return False + def print_error(self, path: str, line: Union[int, None], message: str): + """Format and print error message.""" + # return # Use to suppress error messages. + line = line or 0 + # terminal format + print(f"{path}:{line}: {message_levels[self.severity_current]}: {message} [{self.name}]") + if github_mode and not self.tolerated: # Annotate only not tolerated issues. + # GitHub annotation format + print(f"::{message_levels[self.severity_current]} file={path},line={line},title=[{self.name}]::{message}") + def test_line(self, line: str) -> bool: """Test a line.""" raise NotImplementedError() @@ -225,10 +264,11 @@ def test_file(self, path: str, content) -> bool: """Test a file in a way that cannot be done line by line.""" raise NotImplementedError() - def run(self, path: str, content) -> bool: + def run(self, path: str, content: "list[str]") -> bool: """Run the test.""" # print(content) passed = True + self.severity_current = Severity.WARNING if self.tolerated else self.severity_default if not self.file_matches(path): return passed # print(f"Running test {self.name} for {path} with {len(content)} lines") @@ -243,14 +283,20 @@ def run(self, path: str, content) -> bool: continue if not self.test_line(line): passed = False - self.n_issues += 1 - print_error(path, i + 1, self.name, self.message) + if self.tolerated: + self.n_tolerated += 1 + else: + self.n_issues += 1 + self.print_error(path, i + 1, self.message) else: passed = self.test_file(path, content) if not passed: - self.n_issues += 1 - print_error(path, None, self.name, self.message) - return passed + if self.tolerated: + self.n_tolerated += 1 + else: + self.n_issues += 1 + self.print_error(path, None, self.message) + return passed or self.tolerated ########################## @@ -627,15 +673,14 @@ def test_file(self, path: str, content) -> bool: words = line.split() if len(words) < 2: passed = False - print_error( + self.print_error( path, i + 1, - self.name, "Failed to get the process function name. Keep it on the same line as the switch.", ) continue names_functions.append(words[1][:-1]) # Remove the trailing comma. - # print_error(path, i + 1, self.name, f"Got process function name {words[1][:-1]}.") + # self.print_error(path, i + 1, f"Got process function name {words[1][:-1]}.") # Test process functions. for i, line in enumerate(content): line = line.strip() @@ -672,7 +717,7 @@ def test_file(self, path: str, content) -> bool: for arg in words: if not re.search(r"([\w>] const|const [\w<>:]+)&", arg): passed = False - print_error(path, i + 1, self.name, f"Argument {arg} is not const&.") + self.print_error(path, i + 1, f"Argument {arg} is not const&.") line_process = 0 return passed @@ -692,7 +737,7 @@ class TestWorkflowOptions(TestSpec): def test_file(self, path: str, content) -> bool: is_inside_define = False # Are we inside defineDataProcessing? - for i, line in enumerate(content): # pylint: disable=unused-variable + for _i, line in enumerate(content): # pylint: disable=unused-variable if not line.strip(): continue if self.is_disabled(line): @@ -784,7 +829,7 @@ def test_file(self, path: str, content) -> bool: for item in doc_items: if re.search(rf"^{doc_prefix} [\\@]{item['keyword']} +{item['pattern']}", line): item["found"] = True - # print_error(path, i + 1, self.name, f"Found \{item['keyword']}.") + # self.print_error(path, i + 1, f"Found \{item['keyword']}.") break if all(item["found"] for item in doc_items): # All items have been found. passed = True @@ -792,10 +837,9 @@ def test_file(self, path: str, content) -> bool: if not passed: for item in doc_items: if not item["found"]: - print_error( + self.print_error( path, last_doc_line, - self.name, f"Documentation for \\{item['keyword']} is missing, incorrect or misplaced.", ) return passed @@ -1203,14 +1247,14 @@ def test_file(self, path: str, content) -> bool: workflow_name = line.strip().split("(")[1].split()[0] if not is_kebab_case(workflow_name): passed = False - print_error(path, i + 1, self.name, f"Invalid workflow name: {workflow_name}.") + self.print_error(path, i + 1, f"Invalid workflow name: {workflow_name}.") continue # Extract workflow file name. next_line = content[i + 1].strip() words = next_line.split() if words[0] != "SOURCES": passed = False - print_error(path, i + 2, self.name, f"Did not find sources for workflow: {workflow_name}.") + self.print_error(path, i + 2, f"Did not find sources for workflow: {workflow_name}.") continue workflow_file_name = os.path.basename(words[1]) # the actual file name # Generate the file name matching the workflow name. @@ -1218,10 +1262,9 @@ def test_file(self, path: str, content) -> bool: # Compare the actual and expected file names. if expected_workflow_file_name != workflow_file_name: passed = False - print_error( + self.print_error( path, i + 1, - self.name, f"Workflow name {workflow_name} does not match its file name {workflow_file_name}. " f"(Matches {expected_workflow_file_name}.)", ) @@ -1273,7 +1316,7 @@ def test_file(self, path: str, content) -> bool: line = line[(index + len("adaptAnalysisTask<")) :] # Extract struct name. if not (match := re.match(r"([^>]+)", line)): - print_error(path, i + 1, self.name, f'Failed to extract struct name from "{line}".') + self.print_error(path, i + 1, f'Failed to extract struct name from "{line}".') return False struct_name = match.group(1) if (index := struct_name.find("<")) > -1: @@ -1294,7 +1337,7 @@ def test_file(self, path: str, content) -> bool: passed = False # Extract explicit task name. if not (match := re.search(r"TaskName\{\"([^\}]+)\"\}", line)): - print_error(path, i + 1, self.name, f'Failed to extract explicit task name from "{line}".') + self.print_error(path, i + 1, f'Failed to extract explicit task name from "{line}".') return False task_name = match.group(1) # print(f"{i + 1}: Got struct \"{struct_name}\" with task name \"{task_name}\".") @@ -1309,10 +1352,9 @@ def test_file(self, path: str, content) -> bool: device_name_from_task_name ) # struct name matching the TaskName if not is_kebab_case(device_name_from_task_name): - print_error( + self.print_error( path, i + 1, - self.name, f"Specified task name {task_name} produces an invalid device name " f"{device_name_from_task_name}.", ) @@ -1320,10 +1362,9 @@ def test_file(self, path: str, content) -> bool: elif device_name_from_struct_name == device_name_from_task_name: # If the task name results in the same device name as the struct name would, # TaskName is redundant and should be removed. - print_error( + self.print_error( path, i + 1, - self.name, f"Specified task name {task_name} and the struct name {struct_name} produce " f"the same device name {device_name_from_struct_name}. TaskName is redundant.", ) @@ -1332,10 +1373,9 @@ def test_file(self, path: str, content) -> bool: # If the device names generated from the task name and from the struct name differ in hyphenation, # capitalisation of the struct name should be fixed and TaskName should be removed. # (special cases: alice3-, -2prong) - print_error( + self.print_error( path, i + 1, - self.name, f"Device names {device_name_from_task_name} and {device_name_from_struct_name} generated " f"from the specified task name {task_name} and from the struct name {struct_name}, " f"respectively, differ in hyphenation. Consider fixing capitalisation of the struct name " @@ -1347,10 +1387,9 @@ def test_file(self, path: str, content) -> bool: # from the struct name, accept it if the struct is templated. If the struct is not templated, # extension is acceptable if adaptAnalysisTask is called multiple times for the same struct. if not struct_templated: - print_error( + self.print_error( path, i + 1, - self.name, f"Device name {device_name_from_task_name} from the specified task name " f"{task_name} is an extension of the device name {device_name_from_struct_name} " f"from the struct name {struct_name} but the struct is not templated. " @@ -1358,16 +1397,15 @@ def test_file(self, path: str, content) -> bool: ) passed = False # else: - # print_error(path, i + 1, self.name, f"Device name {device_name_from_task_name} from + # self.print_error(path, i + 1, f"Device name {device_name_from_task_name} from # the specified task name {task_name} is an extension of the device name # {device_name_from_struct_name} from the struct name {struct_name} and the struct is templated. # All good") else: # Other cases should be rejected. - print_error( + self.print_error( path, i + 1, - self.name, f"Specified task name {task_name} produces device name {device_name_from_task_name} " f"which does not match the device name {device_name_from_struct_name} from " f"the struct name {struct_name}. (Matching struct name {struct_name_from_device_name})", @@ -1580,10 +1618,9 @@ def test_file(self, path: str, content) -> bool: first_line < last_line_last_member ): # The current category starts before the end of the previous category. passed = False - print_error( + self.print_error( path, first_line, - self.name, f"{struct_name}: {member.strip()} appears too early " f"(before end of {self.member_order[index_last_member].strip()}).", ) @@ -1610,7 +1647,7 @@ def main(): global github_mode # pylint: disable=global-statement # noqa: PLW0603 github_mode = True - tests = [] # list of activated tests + tests: list[TestSpec] = [] # list of activated tests # Bad practice enable_bad_practice = True @@ -1687,8 +1724,10 @@ def main(): continue try: with open(path, encoding="utf-8") as file: + tolerated_tests = get_tolerated_tests(path) content = file.readlines() for test in tests: + test.tolerated = test.name in tolerated_tests result = test.run(path, content) if not result: n_files_bad[test.name] += 1 @@ -1698,20 +1737,29 @@ def main(): print(f'Failed to open file "{path}".') sys.exit(1) - # Report results for tests that failed or were disabled. - if not passed or any(n > 0 for n in (test.n_disabled for test in tests)): - print("\nResults for failed and disabled tests") + # Report results for tests that failed or were disabled or were tolerated. + n_issues, n_disabled, n_tolerated = 0, 0, 0 # global counters + if not passed or any(n > 0 for n in (test.n_disabled + test.n_tolerated for test in tests)): + print("\nResults for failed, tolerated and disabled tests") len_max = max(len(name) for name in test_names) - print(f"test{' ' * (len_max - len('test'))}\tissues\tdisabled\tbad files\trationale") + print(f"test{' ' * (len_max - len('test'))}\tissues\ttolerated\tdisabled\tbad files\trationale") + print("-" * len_max) ref_names = [] for test in tests: - if any(n > 0 for n in (test.n_issues, test.n_disabled, n_files_bad[test.name])): + if any(n > 0 for n in (test.n_issues, test.n_disabled, test.n_tolerated, n_files_bad[test.name])): ref_ids = [ref.value for ref in test.references] ref_names += test.references print( - f"{test.name}{' ' * (len_max - len(test.name))}\t{test.n_issues}\t{test.n_disabled}" - f"\t\t{n_files_bad[test.name]}\t\t{test.rationale} {ref_ids}" + f"{test.name}{' ' * (len_max - len(test.name))}\t{test.n_issues}\t{test.n_tolerated}" + f"\t\t{test.n_disabled}\t\t{n_files_bad[test.name]}\t\t{test.rationale} {ref_ids}" ) + n_issues += test.n_issues + n_disabled += test.n_disabled + n_tolerated += test.n_tolerated + print("-" * len_max) + # Print the totals. + name_total = "total" + print(f"{name_total}{' ' * (len_max - len(name_total))}\t{n_issues}\t{n_tolerated}\t\t{n_disabled}") # Print list of references for listed tests. print("\nReferences") ref_names = list(dict.fromkeys(ref_names)) @@ -1733,14 +1781,29 @@ def main(): f'Exceptionally, you can disable a test for a line by adding a comment with "{prefix_disable}"' " followed by the name of the test and parentheses with a reason for the exception." ) + msg_tolerate = f'To tolerate certain issues in a directory, add a line with the test name in "{file_config}".' if github_mode: print(f"\n::error title={title_result}::{msg_result}") print(f"::notice::{msg_disable}") + print(f"::notice::{msg_tolerate}") else: print(f"\n{title_result}: {msg_result}") print(msg_disable) + print(msg_tolerate) + + # Make results available to the GitHub actions. + if github_mode: + try: + with open(os.environ["GITHUB_OUTPUT"], "a", encoding="utf-8") as fh: + print(f"n_issues={n_issues}", file=fh) + print(f"n_disabled={n_disabled}", file=fh) + print(f"n_tolerated={n_tolerated}", file=fh) + except KeyError: + print("Skipping writing in GITHUB_OUTPUT.") + # Print tips. print("\nTip: You can run the O2 linter locally with: python3 Scripts/o2_linter.py ") + if not passed: sys.exit(1) From 0d5f8494ea969041b7953f4bdfaf5ff268b69962 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Wed, 23 Apr 2025 20:12:07 +0200 Subject: [PATCH 1073/1650] [PWGLF] Fix bug related to daughter index (#10960) --- EventFiltering/PWGLF/filterdoublephi.cxx | 2 +- PWGLF/Tasks/Resonances/doublephimeson.cxx | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/EventFiltering/PWGLF/filterdoublephi.cxx b/EventFiltering/PWGLF/filterdoublephi.cxx index e6561a07c8c..241a70aef9e 100644 --- a/EventFiltering/PWGLF/filterdoublephi.cxx +++ b/EventFiltering/PWGLF/filterdoublephi.cxx @@ -259,7 +259,7 @@ struct filterdoublephi { auto i6 = std::distance(phiresonance.begin(), if2); PhiVectorDummy2 = phiresonance.at(i6); PhiPair = PhiVectorDummy + PhiVectorDummy2; - if ((Phid1Index.at(i5) != Phid1Index.at(i6)) && (Phid2Index.at(i5) != Phid2Index.at(i6)) && PhiPair.M() > MinPhiPairMass && PhiPair.M() < MaxPhiPairMass && PhiPair.Pt() > MinPhiPairPt) { + if (!(Phid1Index.at(i5) == Phid1Index.at(i6) && Phid2Index.at(i5) == Phid2Index.at(i6)) && PhiPair.M() > MinPhiPairMass && PhiPair.M() < MaxPhiPairMass && PhiPair.Pt() > MinPhiPairPt) { qaRegistry.fill(HIST("hInvMassDoublePhi"), PhiPair.M(), PhiPair.Pt()); keepEventDoublePhi = true; } diff --git a/PWGLF/Tasks/Resonances/doublephimeson.cxx b/PWGLF/Tasks/Resonances/doublephimeson.cxx index 9f10015c021..6669df802f5 100644 --- a/PWGLF/Tasks/Resonances/doublephimeson.cxx +++ b/PWGLF/Tasks/Resonances/doublephimeson.cxx @@ -45,6 +45,8 @@ struct doublephimeson { Configurable strategyPID2{"strategyPID2", 0, "PID strategy 2"}; Configurable minPhiMass{"minPhiMass", 1.01, "Minimum phi mass"}; Configurable maxPhiMass{"maxPhiMass", 1.03, "Maximum phi mass"}; + Configurable minExoticMass{"minExoticMass", 2.4, "Minimum Exotic mass"}; + Configurable maxExoticMass{"maxExoticMass", 3.2, "Maximum Exotic mass"}; Configurable additionalEvsel{"additionalEvsel", false, "Additional event selection"}; Configurable isDeep{"isDeep", true, "Store deep angle"}; Configurable cutMinNsigmaTPC{"cutMinNsigmaTPC", -2.5, "nsigma cut TPC"}; @@ -332,14 +334,20 @@ struct doublephimeson { if (!selectionPID(phitrackd2.phid2TPC(), phitrackd2.phid2TOF(), phitrackd2.phid2TOFHit(), strategyPID2, kaonminusd2pt)) { continue; } - if (phitrackd1.phid1Index() == phitrackd2.phid1Index()) { - continue; - } - if (phitrackd1.phid2Index() == phitrackd2.phid2Index()) { + // if (phitrackd1.phid1Index() == phitrackd2.phid1Index()) { + // continue; + // } + // if (phitrackd1.phid2Index() == phitrackd2.phid2Index()) { + // continue; + // } + if (phitrackd1.phid1Index() == phitrackd2.phid1Index() && phitrackd1.phid2Index() == phitrackd2.phid2Index()) { continue; } Phid2.SetXYZM(phitrackd2.phiPx(), phitrackd2.phiPy(), phitrackd2.phiPz(), phitrackd2.phiMass()); exotic = Phid1 + Phid2; + if (exotic.M() < minExoticMass || exotic.M() > maxExoticMass) { + continue; + } // auto cosThetaStar = getCosTheta(exotic, Phid1); // auto kstar = getkstar(Phid1, Phid2); auto deltaR = TMath::Sqrt(TMath::Power(Phid1.Phi() - Phid2.Phi(), 2.0) + TMath::Power(Phid1.Eta() - Phid2.Eta(), 2.0)); From 9bdb069da67fcfef883b933913d8d9d243196a98 Mon Sep 17 00:00:00 2001 From: Chiara De Martin <39315597+ChiaraDeMartin95@users.noreply.github.com> Date: Wed, 23 Apr 2025 20:59:35 +0200 Subject: [PATCH 1074/1650] [PWGLF,Trigger] fix definition of DCAToPV (#10961) Co-authored-by: Chiara De Martin --- EventFiltering/PWGLF/strangenessFilter.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EventFiltering/PWGLF/strangenessFilter.cxx b/EventFiltering/PWGLF/strangenessFilter.cxx index 952436eebcd..fea1290cc0c 100644 --- a/EventFiltering/PWGLF/strangenessFilter.cxx +++ b/EventFiltering/PWGLF/strangenessFilter.cxx @@ -61,7 +61,7 @@ static const std::vector speciesNames{"Xi", "Omega"}; float CalculateDCAStraightToPV(float X, float Y, float Z, float Px, float Py, float Pz, float pvX, float pvY, float pvZ) { - return std::hypot((pvY - Y) * Pz - (pvZ - Z) * Py, (pvX - X) * Pz - (pvZ - Z) * Px, (pvX - X) * Py - (pvY - Y) * Px) / (Px * Px + Py * Py + Pz * Pz); + return std::hypot((pvY - Y) * Pz - (pvZ - Z) * Py, (pvX - X) * Pz - (pvZ - Z) * Px, (pvX - X) * Py - (pvY - Y) * Px) / std::sqrt(Px * Px + Py * Py + Pz * Pz); } struct strangenessFilter { From 98161de50fcb252899dd44a9f37be20cd95f5156 Mon Sep 17 00:00:00 2001 From: Noor Koster <82090643+cnkoster@users.noreply.github.com> Date: Wed, 23 Apr 2025 21:12:40 +0200 Subject: [PATCH 1075/1650] [PWGCF] Reduce number of CCDB calls and add event selections (#10946) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/TableProducer/zdcQVectors.cxx | 503 ++++++++++++++--------- 1 file changed, 306 insertions(+), 197 deletions(-) diff --git a/PWGCF/Flow/TableProducer/zdcQVectors.cxx b/PWGCF/Flow/TableProducer/zdcQVectors.cxx index 13c2064e28f..21fcbdc3c55 100644 --- a/PWGCF/Flow/TableProducer/zdcQVectors.cxx +++ b/PWGCF/Flow/TableProducer/zdcQVectors.cxx @@ -64,10 +64,6 @@ using namespace o2::framework::expressions; using namespace o2::aod::track; using namespace o2::aod::evsel; -// define my..... -using UsedCollisions = soa::Join; -using BCsRun3 = soa::Join; - namespace o2::analysis::qvectortask { int counter = 0; @@ -112,9 +108,9 @@ struct ZdcQVectors { ConfigurableAxis axisVxBig{"axisVxBig", {3, -0.01, 0.01}, "for Pos X of collision"}; ConfigurableAxis axisVyBig{"axisVyBig", {3, -0.01, 0.01}, "for Pos Y of collision"}; ConfigurableAxis axisVzBig{"axisVzBig", {3, -10, 10}, "for Pos Z of collision"}; - ConfigurableAxis axisVx{"axisVx", {10, -0.01, 0.01}, "for Pos X of collision"}; - ConfigurableAxis axisVy{"axisVy", {10, -0.01, 0.01}, "for Pos Y of collision"}; - ConfigurableAxis axisVz{"axisVz", {10, -10, 1}, "for vz of collision"}; + ConfigurableAxis axisVx{"axisVx", {100, -0.01, 0.01}, "for Pos X of collision"}; + ConfigurableAxis axisVy{"axisVy", {100, -0.01, 0.01}, "for Pos Y of collision"}; + ConfigurableAxis axisVz{"axisVz", {100, -10, 10}, "for vz of collision"}; // Centrality Estimators -> standard is FT0C O2_DEFINE_CONFIGURABLE(cfgFT0Cvariant1, bool, false, "Set centrality estimator to cfgFT0Cvariant1"); @@ -122,7 +118,7 @@ struct ZdcQVectors { O2_DEFINE_CONFIGURABLE(cfgFV0A, bool, false, "Set centrality estimator to cfgFV0A"); O2_DEFINE_CONFIGURABLE(cfgNGlobal, bool, false, "Set centrality estimator to cfgNGlobal"); - O2_DEFINE_CONFIGURABLE(cfgCutVertex, float, 10.0f, "Accepted z-vertex range") + O2_DEFINE_CONFIGURABLE(cfgVtxZ, float, 10.0f, "Accepted z-vertex range") O2_DEFINE_CONFIGURABLE(cfgCutPtPOIMin, float, 0.2f, "Minimal.q pT for poi tracks") O2_DEFINE_CONFIGURABLE(cfgCutPtPOIMax, float, 10.0f, "Maximal pT for poi tracks") O2_DEFINE_CONFIGURABLE(cfgCutPtMin, float, 0.2f, "Minimal pT for ref tracks") @@ -133,12 +129,44 @@ struct ZdcQVectors { O2_DEFINE_CONFIGURABLE(cfgEnergyCal, std::string, "Users/c/ckoster/ZDC/LHC23_zzh_pass4/Energy", "ccdb path for energy calibration histos") O2_DEFINE_CONFIGURABLE(cfgMeanv, std::string, "Users/c/ckoster/ZDC/LHC23_zzh_pass4/vmean", "ccdb path for mean v histos") O2_DEFINE_CONFIGURABLE(cfgMinEntriesSparseBin, int, 100, "Minimal number of entries allowed in 4D recentering histogram to use for recentering.") + O2_DEFINE_CONFIGURABLE(cfgRec, std::string, "Users/c/ckoster/ZDC/LHC23_PbPb_pass4/", "ccdb path for recentering histos"); + O2_DEFINE_CONFIGURABLE(cfgFillCommonRegistry, bool, true, "Fill common registry with histograms"); + + // Additional event selections + O2_DEFINE_CONFIGURABLE(cfgEvSelsMaxOccupancy, int, 10000, "Maximum occupancy of selected events"); + O2_DEFINE_CONFIGURABLE(cfgEvSelsNoSameBunchPileupCut, bool, true, "kNoSameBunchPileupCut"); + O2_DEFINE_CONFIGURABLE(cfgEvSelsIsGoodZvtxFT0vsPV, bool, true, "kIsGoodZvtxFT0vsPV"); + O2_DEFINE_CONFIGURABLE(cfgEvSelsNoCollInTimeRangeStandard, bool, true, "kNoCollInTimeRangeStandard"); + O2_DEFINE_CONFIGURABLE(cfgEvSelsDoOccupancySel, bool, true, "Bool for event selection on detector occupancy"); + O2_DEFINE_CONFIGURABLE(cfgEvSelsIsVertexITSTPC, bool, true, "Selects collisions with at least one ITS-TPC track"); + O2_DEFINE_CONFIGURABLE(cfgEvSelsIsGoodITSLayersAll, bool, true, "Cut time intervals with dead ITS staves"); + O2_DEFINE_CONFIGURABLE(cfgEvSelsCentMin, float, 0, "Minimum cenrality for selected events"); + O2_DEFINE_CONFIGURABLE(cfgEvSelsCentMax, float, 90, "Maximum cenrality for selected events"); + + // define my..... + // Filter collisionFilter = nabs(aod::collision::posZ) < cfgVtxZ; + using UsedCollisions = soa::Join; + using BCsRun3 = soa::Join; + + enum SelectionCriteria { + evSel_Zvtx, + evSel_sel8, + evSel_occupancy, + evSel_kNoSameBunchPileup, + evSel_kIsGoodZvtxFT0vsPV, + evSel_kNoCollInTimeRangeStandard, + evSel_kIsVertexITSTPC, + evSel_CentCuts, + evSel_kIsGoodITSLayersAll, + evSel_isSelectedZDC, + nEventSelections + }; - Configurable> cfgRec1{"cfgRec1", {"Users/c/ckoster/ZDC/LHC23_zzh_pass4/it1_step1", "Users/c/ckoster/ZDC/LHC23_zzh_pass4/it1_step2", "Users/c/ckoster/ZDC/LHC23_zzh_pass4/it1_step3", "Users/c/ckoster/ZDC/LHC23_zzh_pass4/it1_step4", "Users/c/ckoster/ZDC/LHC23_zzh_pass4/it1_step5"}, "ccdb paths for recentering calibration histos iteration 1"}; - Configurable> cfgRec2{"cfgRec2", {"Users/c/ckoster/ZDC/LHC23_zzh_pass4/it2_step1", "Users/c/ckoster/ZDC/LHC23_zzh_pass4/it2_step2", "Users/c/ckoster/ZDC/LHC23_zzh_pass4/it2_step3", "Users/c/ckoster/ZDC/LHC23_zzh_pass4/it2_step4", "Users/c/ckoster/ZDC/LHC23_zzh_pass4/it2_step5"}, "ccdb paths for recentering calibration histos iteration 2"}; - Configurable> cfgRec3{"cfgRec3", {"Users/c/ckoster/ZDC/LHC23_zzh_pass4/it3_step1", "Users/c/ckoster/ZDC/LHC23_zzh_pass4/it3_step2", "Users/c/ckoster/ZDC/LHC23_zzh_pass4/it3_step3", "Users/c/ckoster/ZDC/LHC23_zzh_pass4/it3_step4", "Users/c/ckoster/ZDC/LHC23_zzh_pass4/it3_step5"}, "ccdb paths for recentering calibration histos iteration 3"}; - Configurable> cfgRec4{"cfgRec4", {"Users/c/ckoster/ZDC/LHC23_zzh_pass4/it4_step1", "Users/c/ckoster/ZDC/LHC23_zzh_pass4/it4_step2", "Users/c/ckoster/ZDC/LHC23_zzh_pass4/it4_step3", "Users/c/ckoster/ZDC/LHC23_zzh_pass4/it4_step4", "Users/c/ckoster/ZDC/LHC23_zzh_pass4/it4_step5"}, "ccdb paths for recentering calibration histos iteration 4"}; - Configurable> cfgRec5{"cfgRec5", {"Users/c/ckoster/ZDC/LHC23_zzh_pass4/it5_step1", "Users/c/ckoster/ZDC/LHC23_zzh_pass4/it5_step2", "Users/c/ckoster/ZDC/LHC23_zzh_pass4/it5_step3", "Users/c/ckoster/ZDC/LHC23_zzh_pass4/it5_step4", "Users/c/ckoster/ZDC/LHC23_zzh_pass4/it5_step5"}, "ccdb paths for recentering calibration histos iteration 5"}; + enum CalibModes { + kEnergyCal, + kMeanv, + kRec + }; // Define output HistogramRegistry registry{"Registry"}; @@ -147,8 +175,8 @@ struct ZdcQVectors { // keep track of calibration histos for each given step and iteration struct Calib { - std::vector> calibList = std::vector>(7, std::vector(8, nullptr)); - std::vector> calibfilesLoaded = std::vector>(7, std::vector(8, false)); + std::vector calibList = std::vector(3, nullptr); // [0] Enerfy cal, [1] vmean, [2] recentering + std::vector calibfilesLoaded = std::vector(3, false); int atStep = 0; int atIteration = 0; } cal; @@ -170,23 +198,21 @@ struct ZdcQVectors { std::vector sides = {"A", "C"}; std::vector capCOORDS = {"X", "Y"}; - // Tower mean energies vs. centrality used for tower gain equalisation - for (int tower = 0; tower < 10; tower++) { - namesEcal[tower] = TString::Format("hZN%s_mean_t%i_cent", sides[(tower < 5) ? 0 : 1], tower % 5); - registry.add(Form("Energy/%s", namesEcal[tower].Data()), Form("%s", namesEcal[tower].Data()), kTProfile2D, {{1, 0, 1}, axisCent}); - } - - registry.add(Form("before/QA/hSPplaneA"), "hSPplaneA", kTH2D, {{100, -4, 4}, axisCent10}); - registry.add(Form("before/QA/hSPplaneC"), "hSPplaneC", kTH2D, {{100, -4, 4}, axisCent10}); - registry.add(Form("before/QA/hSPplaneFull"), "hSPplaneFull", kTH2D, {{100, -4, 4}, axisCent10}); - for (const auto& side : sides) { - registry.add(Form("before/hZN%s_Qx_vs_Qy", side), Form("hZN%s_Qx_vs_Qy", side), kTH2F, {axisQ, axisQ}); - } + if (cfgFillCommonRegistry) { + registry.add(Form("QA/before/hSPplaneA"), "hSPplaneA", kTH2D, {{100, -4, 4}, axisCent10}); + registry.add(Form("QA/before/hSPplaneC"), "hSPplaneC", kTH2D, {{100, -4, 4}, axisCent10}); + registry.add(Form("QA/before/hSPplaneFull"), "hSPplaneFull", kTH2D, {{100, -4, 4}, axisCent10}); + for (const auto& side : sides) { + registry.add(Form("QA/before/hZN%s_Qx_vs_Qy", side), Form("hZN%s_Qx_vs_Qy", side), kTH2F, {axisQ, axisQ}); + } for (const auto& COORD1 : capCOORDS) { for (const auto& COORD2 : capCOORDS) { // Now we get: & vs. Centrality - registry.add(Form("before/QA/hQ%sA_Q%sC_vs_cent", COORD1, COORD2), Form("hQ%sA_Q%sC_vs_cent", COORD1, COORD2), kTProfile, {axisCent}); + registry.add(Form("QA/before/hQ%sA_Q%sC_vs_cent", COORD1, COORD2), Form("hQ%sA_Q%sC_vs_cent", COORD1, COORD2), kTProfile, {axisCent}); + registry.add(Form("QA/before/hQ%sA_Q%sC_vs_vx", COORD1, COORD2), Form("hQ%sA_Q%sC_vs_vx", COORD1, COORD2), kTProfile, {axisVx}); + registry.add(Form("QA/before/hQ%sA_Q%sC_vs_vy", COORD1, COORD2), Form("hQ%sA_Q%sC_vs_vy", COORD1, COORD2), kTProfile, {axisVy}); + registry.add(Form("QA/before/hQ%sA_Q%sC_vs_vz", COORD1, COORD2), Form("hQ%sA_Q%sC_vs_vz", COORD1, COORD2), kTProfile, {axisVz}); } } @@ -194,10 +220,10 @@ struct ZdcQVectors { // Sides is {A,C} and capcoords is {X,Y} for (const auto& side : sides) { for (const auto& coord : capCOORDS) { - registry.add(Form("before/QA/hQ%s%s_vs_cent", coord, side), Form("hQ%s%s_vs_cent", coord, side), {HistType::kTProfile, {axisCent10}}); - registry.add(Form("before/QA/hQ%s%s_vs_vx", coord, side), Form("hQ%s%s_vs_vx", coord, side), {HistType::kTProfile, {axisVx}}); - registry.add(Form("before/QA/hQ%s%s_vs_vy", coord, side), Form("hQ%s%s_vs_vy", coord, side), {HistType::kTProfile, {axisVy}}); - registry.add(Form("before/QA/hQ%s%s_vs_vz", coord, side), Form("hQ%s%s_vs_vz", coord, side), {HistType::kTProfile, {axisVz}}); + registry.add(Form("QA/before/hQ%s%s_vs_cent", coord, side), Form("hQ%s%s_vs_cent", coord, side), {HistType::kTProfile, {axisCent10}}); + registry.add(Form("QA/before/hQ%s%s_vs_vx", coord, side), Form("hQ%s%s_vs_vx", coord, side), {HistType::kTProfile, {axisVx}}); + registry.add(Form("QA/before/hQ%s%s_vs_vy", coord, side), Form("hQ%s%s_vs_vy", coord, side), {HistType::kTProfile, {axisVy}}); + registry.add(Form("QA/before/hQ%s%s_vs_vz", coord, side), Form("hQ%s%s_vs_vz", coord, side), {HistType::kTProfile, {axisVz}}); names[0].push_back(TString::Format("hQ%s%s_mean_Cent_V_run", coord, side)); names[1].push_back(TString::Format("hQ%s%s_mean_cent_run", coord, side)); @@ -207,142 +233,215 @@ struct ZdcQVectors { } // end of capCOORDS } // end of sides - // recentered q-vectors (to check what steps are finished in the end) - - registry.add("vmean/hvertex_vx", "hvertex_vx", kTProfile, {{1, 0., 1.}}); - registry.add("vmean/hvertex_vy", "hvertex_vy", kTProfile, {{1, 0., 1.}}); - registry.add("vmean/hvertex_vz", "hvertex_vz", kTProfile, {{1, 0., 1.}}); - registry.add("QA/centrality_before", "centrality_before", kTH1D, {{200, 0, 100}}); registry.add("QA/centrality_after", "centrality_after", kTH1D, {{200, 0, 100}}); registry.add("QA/ZNA_Energy", "ZNA_Energy", kTProfile, {{8, 0, 8}}); registry.add("QA/ZNC_Energy", "ZNC_Energy", kTProfile, {{8, 0, 8}}); - registry.addClone("before/", "after/"); + registry.add("QA/before/ZNA_pm1", "ZNA_pm1", kTProfile, {{1, 0, 1.}}); + registry.add("QA/before/ZNA_pm2", "ZNA_pm2", kTProfile, {{1, 0, 1.}}); + registry.add("QA/before/ZNA_pm3", "ZNA_pm3", kTProfile, {{1, 0, 1.}}); + registry.add("QA/before/ZNA_pm4", "ZNA_pm4", kTProfile, {{1, 0, 1.}}); + + registry.add("QA/before/ZNC_pm1", "ZNC_pm1", kTProfile, {{1, 0, 1.}}); + registry.add("QA/before/ZNC_pm2", "ZNC_pm2", kTProfile, {{1, 0, 1.}}); + registry.add("QA/before/ZNC_pm3", "ZNC_pm3", kTProfile, {{1, 0, 1.}}); + registry.add("QA/before/ZNC_pm4", "ZNC_pm4", kTProfile, {{1, 0, 1.}}); + + registry.addClone("QA/before/", "QA/after/"); + } + + // Tower mean energies vs. centrality used for tower gain equalisation + int totalTowers = 10; + int totalTowersPerSide = 5; + for (int tower = 0; tower < totalTowers; tower++) { + namesEcal[tower] = TString::Format("hZN%s_mean_t%i_cent", sides[(tower < totalTowersPerSide) ? 0 : 1], tower % 5); + registry.add(Form("Energy/%s", namesEcal[tower].Data()), Form("%s", namesEcal[tower].Data()), kTProfile2D, {{1, 0, 1}, axisCent}); + } + + // recentered q-vectors (to check what steps are finished in the end) + registry.add("vmean/hvertex_vx", "hvertex_vx", kTProfile, {{1, 0., 1.}}); + registry.add("vmean/hvertex_vy", "hvertex_vy", kTProfile, {{1, 0., 1.}}); + registry.add("vmean/hvertex_vz", "hvertex_vz", kTProfile, {{1, 0., 1.}}); + + registry.add("hEventCount", "Number of Event; Cut; #Events Passed Cut", {HistType::kTH1D, {{nEventSelections, 0, nEventSelections}}}); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_Zvtx + 1, "Z vertex cut event"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_sel8 + 1, "Sel8"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_occupancy + 1, "kOccupancy"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_kNoSameBunchPileup + 1, "kNoSameBunchPileup"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_kIsGoodZvtxFT0vsPV + 1, "kIsGoodZvtxFT0vsPV"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_kNoCollInTimeRangeStandard + 1, "kNoCollInTimeRangeStandard"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_kIsVertexITSTPC + 1, "kIsVertexITSTPC"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_CentCuts + 1, "Cenrality range"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_kIsGoodITSLayersAll + 1, "kkIsGoodITSLayersAll"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_isSelectedZDC + 1, "isSelected"); } - template - inline void fillCommonRegistry(double qxa, double qya, double qxc, double qyc, std::vector v, double centrality) + template + bool eventSelected(TCollision collision, const float& centrality) { - // loop for filling multiple histograms with different naming patterns - // Always fill the uncentered "raw" Q-vector histos! - static constexpr std::string_view Time[] = {"before", "after"}; + if (std::fabs(collision.posZ()) > cfgVtxZ) + return 0; + registry.fill(HIST("hEventCount"), evSel_sel8); + + if (!collision.sel8()) + return 0; + registry.fill(HIST("hEventCount"), evSel_sel8); + + // Occupancy + if (cfgEvSelsDoOccupancySel) { + auto occupancy = collision.trackOccupancyInTimeRange(); + if (occupancy > cfgEvSelsMaxOccupancy) { + return 0; + } + registry.fill(HIST("hEventCount"), evSel_occupancy); + } - registry.fill(HIST(Time[ft]) + HIST("/hZNA_Qx_vs_Qy"), qxa, qya); - registry.fill(HIST(Time[ft]) + HIST("/hZNC_Qx_vs_Qy"), qxc, qyc); + if (cfgEvSelsNoSameBunchPileupCut) { + if (!collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { + // rejects collisions which are associated with the same "found-by-T0" bunch crossing + // https://indico.cern.ch/event/1396220/#1-event-selection-with-its-rof + return 0; + } + registry.fill(HIST("hEventCount"), evSel_kNoSameBunchPileup); + } + if (cfgEvSelsIsGoodZvtxFT0vsPV) { + if (!collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { + // removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference + // use this cut at low multiplicities with caution + return 0; + } + registry.fill(HIST("hEventCount"), evSel_kIsGoodZvtxFT0vsPV); + } + if (cfgEvSelsNoCollInTimeRangeStandard) { + if (!collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + // Rejection of the collisions which have other events nearby + return 0; + } + registry.fill(HIST("hEventCount"), evSel_kNoCollInTimeRangeStandard); + } + + if (cfgEvSelsIsVertexITSTPC) { + if (!collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) { + // selects collisions with at least one ITS-TPC track, and thus rejects vertices built from ITS-only tracks + return 0; + } + registry.fill(HIST("hEventCount"), evSel_kIsVertexITSTPC); + } - registry.fill(HIST(Time[ft]) + HIST("/QA/hQXA_QXC_vs_cent"), centrality, qxa * qxc); - registry.fill(HIST(Time[ft]) + HIST("/QA/hQYA_QYC_vs_cent"), centrality, qya * qyc); - registry.fill(HIST(Time[ft]) + HIST("/QA/hQYA_QXC_vs_cent"), centrality, qya * qxc); - registry.fill(HIST(Time[ft]) + HIST("/QA/hQXA_QYC_vs_cent"), centrality, qxa * qyc); + if (centrality > cfgEvSelsCentMax || centrality < cfgEvSelsCentMin) + return 0; + registry.fill(HIST("hEventCount"), evSel_CentCuts); - registry.fill(HIST(Time[ft]) + HIST("/QA/hQXA_vs_cent"), centrality, qxa); - registry.fill(HIST(Time[ft]) + HIST("/QA/hQYA_vs_cent"), centrality, qya); - registry.fill(HIST(Time[ft]) + HIST("/QA/hQXC_vs_cent"), centrality, qxc); - registry.fill(HIST(Time[ft]) + HIST("/QA/hQYC_vs_cent"), centrality, qyc); + if (cfgEvSelsIsGoodITSLayersAll) { + if (!collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + // New event selection bits to cut time intervals with dead ITS staves + // https://indico.cern.ch/event/1493023/ (09-01-2025) + return 0; + } + registry.fill(HIST("hEventCount"), evSel_kIsGoodITSLayersAll); + } - registry.fill(HIST(Time[ft]) + HIST("/QA/hQXA_vs_vx"), v[0], qxa); - registry.fill(HIST(Time[ft]) + HIST("/QA/hQYA_vs_vx"), v[0], qya); - registry.fill(HIST(Time[ft]) + HIST("/QA/hQXC_vs_vx"), v[0], qxc); - registry.fill(HIST(Time[ft]) + HIST("/QA/hQYC_vs_vx"), v[0], qyc); + return 1; + } - registry.fill(HIST(Time[ft]) + HIST("/QA/hQXA_vs_vy"), v[1], qxa); - registry.fill(HIST(Time[ft]) + HIST("/QA/hQYA_vs_vy"), v[1], qya); - registry.fill(HIST(Time[ft]) + HIST("/QA/hQXC_vs_vy"), v[1], qxc); - registry.fill(HIST(Time[ft]) + HIST("/QA/hQYC_vs_vy"), v[1], qyc); + template + inline void fillCommonRegistry(double qxa, double qya, double qxc, double qyc, std::vector v, double centrality) + { + // loop for filling multiple histograms with different naming patterns + // Always fill the uncentered "raw" Q-vector histos! + static constexpr std::string_view Time[] = {"before", "after"}; - registry.fill(HIST(Time[ft]) + HIST("/QA/hQXA_vs_vz"), v[2], qxa); - registry.fill(HIST(Time[ft]) + HIST("/QA/hQYA_vs_vz"), v[2], qya); - registry.fill(HIST(Time[ft]) + HIST("/QA/hQXC_vs_vz"), v[2], qxc); - registry.fill(HIST(Time[ft]) + HIST("/QA/hQYC_vs_vz"), v[2], qyc); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hZNA_Qx_vs_Qy"), qxa, qya); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hZNC_Qx_vs_Qy"), qxc, qyc); + + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQXA_QXC_vs_cent"), centrality, qxa * qxc); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQYA_QYC_vs_cent"), centrality, qya * qyc); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQYA_QXC_vs_cent"), centrality, qya * qxc); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQXA_QYC_vs_cent"), centrality, qxa * qyc); + + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQXA_vs_cent"), centrality, qxa); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQYA_vs_cent"), centrality, qya); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQXC_vs_cent"), centrality, qxc); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQYC_vs_cent"), centrality, qyc); + + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQXA_vs_vx"), v[0], qxa); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQYA_vs_vx"), v[0], qya); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQXC_vs_vx"), v[0], qxc); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQYC_vs_vx"), v[0], qyc); + + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQXA_QXC_vs_vx"), v[0], qxa * qxc); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQYA_QYC_vs_vx"), v[0], qya * qyc); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQYA_QXC_vs_vx"), v[0], qya * qxc); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQXA_QYC_vs_vx"), v[0], qxa * qyc); + + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQXA_vs_vy"), v[1], qxa); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQYA_vs_vy"), v[1], qya); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQXC_vs_vy"), v[1], qxc); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQYC_vs_vy"), v[1], qyc); + + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQXA_QXC_vs_vy"), v[1], qxa * qxc); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQYA_QYC_vs_vy"), v[1], qya * qyc); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQYA_QXC_vs_vy"), v[1], qya * qxc); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQXA_QYC_vs_vy"), v[1], qxa * qyc); + + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQXA_vs_vz"), v[2], qxa); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQYA_vs_vz"), v[2], qya); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQXC_vs_vz"), v[2], qxc); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQYC_vs_vz"), v[2], qyc); + + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQXA_QXC_vs_vz"), v[2], qxa * qxc); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQYA_QYC_vs_vz"), v[2], qya * qyc); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQYA_QXC_vs_vz"), v[2], qya * qxc); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hQXA_QYC_vs_vz"), v[2], qxa * qyc); // add psi!! double psiA = 1.0 * std::atan2(qxc, qxa); - registry.fill(HIST(Time[ft]) + HIST("/QA/hSPplaneA"), psiA, centrality, 1); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hSPplaneA"), psiA, centrality, 1); double psiC = 1.0 * std::atan2(qyc, qya); - registry.fill(HIST(Time[ft]) + HIST("/QA/hSPplaneC"), psiC, centrality, 1); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hSPplaneC"), psiC, centrality, 1); double psiFull = 1.0 * std::atan2(qxc + qyc, qxa + qya); - registry.fill(HIST(Time[ft]) + HIST("/QA/hSPplaneFull"), psiFull, centrality, 1); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hSPplaneFull"), psiFull, centrality, 1); } - void loadCalibrations(int iteration, int step, uint64_t timestamp, std::string ccdb_dir, std::vector names) + template + void loadCalibrations(uint64_t timestamp, std::string ccdb_dir) { // iteration = 0 (Energy calibration) -> step 0 only // iteration 1,2,3,4,5 = recentering -> 5 steps per iteration (1x 4D + 4x 1D) - if (cal.calibfilesLoaded[iteration][step]) + if (cal.calibfilesLoaded[cm]) return; if (ccdb_dir.empty() == false) { - - cal.calibList[iteration][step] = ccdb->getForTimeStamp(ccdb_dir, timestamp); - - if (cal.calibList[iteration][step]) { - for (std::size_t i = 0; i < names.size(); i++) { - TObject* obj = reinterpret_cast(cal.calibList[iteration][step]->FindObject(Form("%s", names[i].Data()))); - if (!obj) { - if (counter < 1) { - LOGF(error, "Object %s not found!!", names[i].Data()); - return; - } - } - // Try to cast to TProfile - if (TProfile* profile = dynamic_cast(obj)) { - if (profile->GetEntries() < 1) { - if (counter < 1) - LOGF(info, "%s (TProfile) is empty! Produce calibration file at given step", names[i].Data()); - cal.calibfilesLoaded[iteration][step] = false; - return; - } - if (counter < 1) - LOGF(info, "Loaded TProfile: %s", names[i].Data()); - } else if (TProfile2D* profile2D = dynamic_cast(obj)) { - if (profile2D->GetEntries() < 1) { - if (counter < 1) - LOGF(info, "%s (TProfile2D) is empty! Produce calibration file at given step", names[i].Data()); - cal.calibfilesLoaded[iteration][step] = false; - return; - } - if (counter < 1) - LOGF(info, "Loaded TProfile2D: %s", names[i].Data()); - } else if (THnSparse* sparse = dynamic_cast(obj)) { - if (sparse->GetEntries() < 1) { - if (counter < 1) - LOGF(info, "%s (THnSparse) is empty! Produce calibration file at given step", names[i].Data()); - cal.calibfilesLoaded[iteration][step] = false; - return; - } - if (counter < 1) - LOGF(info, "Loaded THnSparse: %s", names[i].Data()); - } - } // end of for loop - } else { - // when (cal.calib[iteration][step])=false! - if (counter < 1) - LOGF(warning, "Could not load TList with calibration histos from %s", ccdb_dir.c_str()); - cal.calibfilesLoaded[iteration][step] = false; - return; - } - if (counter < 1) - LOGF(info, "<--------OK----------> Calibrations loaded for cal.calibfilesLoaded[%i][%i]", iteration, step); - cal.calibfilesLoaded[iteration][step] = true; - cal.atIteration = iteration; - cal.atStep = step; - return; + cal.calibList[cm] = ccdb->getForTimeStamp(ccdb_dir, timestamp); + cal.calibfilesLoaded[cm] = true; + LOGF(info, "Loaded calibration histos from %s", ccdb_dir.c_str()); } else { - if (counter < 1) - LOGF(info, "<--------X-----------> Calibrations not loaded for iteration %i and step %i cfg = empty!", iteration, step); + LOGF(info, "No ccdb path given for calibration histos. Do not recenter."); } } - template - double getCorrection(int iteration, int step, const char* objName) + template + double getCorrection(const char* objName, int iteration = 0, int step = 0) { T* hist = nullptr; double calibConstant{0}; - hist = reinterpret_cast(cal.calibList[iteration][step]->FindObject(Form("%s", objName))); + if (cm == kEnergyCal) { + TList* list = cal.calibList[cm]; + hist = reinterpret_cast(list->FindObject(Form("%s", objName))); + } else if (cm == kMeanv) { + TList* list = cal.calibList[cm]; + hist = reinterpret_cast(list->FindObject(Form("%s", objName))); + } else if (cm == kRec) { + TList* list = reinterpret_cast(cal.calibList[cm]->FindObject(Form("it%i_step%i", iteration, step))); + hist = reinterpret_cast(list->FindObject(Form("%s", objName))); + cal.atStep = step; + cal.atIteration = iteration; + } + if (!hist) { LOGF(fatal, "%s not available.. Abort..", objName); } @@ -419,15 +518,16 @@ struct ZdcQVectors { if (cfgNGlobal) cent = collision.centNGlobal(); - if (cent < 0 || cent > 90) { + registry.fill(HIST("QA/centrality_before"), cent); + + if (!eventSelected(collision, cent)) { + // event not selected isSelected = false; spTableZDC(runnumber, cent, v[0], v[1], v[2], 0, 0, 0, 0, isSelected, 0, 0); counter++; return; } - registry.fill(HIST("QA/centrality_before"), cent); - const auto& foundBC = collision.foundBC_as(); if (!foundBC.has_zdc()) { @@ -445,35 +545,33 @@ struct ZdcQVectors { // load new calibrations for new runs only if (runnumber != lastRunNumber) { - cal.calibfilesLoaded.clear(); - cal.calibfilesLoaded.resize(7, std::vector(8, false)); - - cal.calibList.clear(); - cal.calibList.resize(7, std::vector(8, nullptr)); + cal.calibfilesLoaded[2] = false; + cal.calibList[2] = nullptr; lastRunNumber = runnumber; } const auto& zdcCol = foundBC.zdc(); // Get the raw energies eZN[8] (not the common A,C) - for (int tower = 0; tower < 8; tower++) { - eZN[tower] = (tower < 4) ? zdcCol.energySectorZNA()[tower] : zdcCol.energySectorZNC()[tower % 4]; + int nTowers = 8; + int nTowersPerSide = 4; + + for (int tower = 0; tower < nTowers; tower++) { + eZN[tower] = (tower < nTowersPerSide) ? zdcCol.energySectorZNA()[tower] : zdcCol.energySectorZNC()[tower % nTowersPerSide]; } // load the calibration histos for iteration 0 step 0 (Energy Calibration) - loadCalibrations(0, 0, foundBC.timestamp(), cfgEnergyCal.value, namesEcal); + loadCalibrations(foundBC.timestamp(), cfgEnergyCal.value); - if (!cal.calibfilesLoaded[0][0]) { + if (!cal.calibfilesLoaded[0]) { if (counter < 1) { LOGF(info, " --> No Energy calibration files found.. -> Only Energy calibration will be done. "); } } // load the calibrations for the mean v - loadCalibrations(0, 1, foundBC.timestamp(), cfgMeanv.value, vnames); + loadCalibrations(foundBC.timestamp(), cfgMeanv.value); - if (!cal.calibfilesLoaded[0][1]) { - if (counter < 1) - LOGF(warning, " --> No mean V found.. -> THis wil lead to wrong axis for vx, vy (will be created in vmean/)"); + if (!cal.calibfilesLoaded[1]) { registry.get(HIST("vmean/hvertex_vx"))->Fill(Form("%d", runnumber), v[0]); registry.get(HIST("vmean/hvertex_vy"))->Fill(Form("%d", runnumber), v[1]); registry.get(HIST("vmean/hvertex_vz"))->Fill(Form("%d", runnumber), v[2]); @@ -482,10 +580,10 @@ struct ZdcQVectors { bool isZNAhit = true; bool isZNChit = true; - for (int i = 0; i < 8; ++i) { - if (i < 4 && eZN[i] <= 0) + for (int i = 0; i < nTowers; ++i) { + if (i < nTowersPerSide && eZN[i] <= 0) isZNAhit = false; - if (i > 3 && eZN[i] <= 0) + if (i >= nTowersPerSide && eZN[i] <= 0) isZNChit = false; } @@ -518,7 +616,10 @@ struct ZdcQVectors { return; } - if (!cal.calibfilesLoaded[0][0]) { + registry.fill(HIST("hEventCount"), evSel_isSelectedZDC); + + // Do not continue if Energy calibration is not loaded + if (!cal.calibfilesLoaded[0]) { counter++; isSelected = false; spTableZDC(runnumber, centrality, v[0], v[1], v[2], 0, 0, 0, 0, isSelected, 0, 0); @@ -527,8 +628,8 @@ struct ZdcQVectors { // Now start gain equalisation! // Fill the list with calibration constants. - for (int tower = 0; tower < 10; tower++) { - meanEZN[tower] = getCorrection(0, 0, namesEcal[tower].Data()); + for (int tower = 0; tower < (nTowers + 2); tower++) { + meanEZN[tower] = getCorrection(namesEcal[tower].Data()); } // Use the calibration constants but now only loop over towers 1-4 @@ -537,24 +638,42 @@ struct ZdcQVectors { for (const auto& tower : towersNocom) { if (meanEZN[tower] > 0) { - double ecommon = (tower > 4) ? meanEZN[5] : meanEZN[0]; + double ecommon = (tower > nTowersPerSide) ? meanEZN[5] : meanEZN[0]; e[calibtower] = eZN[calibtower] * (0.25 * ecommon) / meanEZN[tower]; } calibtower++; } - for (int i = 0; i < 4; i++) { + for (int i = 0; i < nTowersPerSide; i++) { float bincenter = i + .5; registry.fill(HIST("QA/ZNA_Energy"), bincenter, eZN[i]); registry.fill(HIST("QA/ZNA_Energy"), bincenter + 4, e[i]); registry.fill(HIST("QA/ZNC_Energy"), bincenter, eZN[i + 4]); registry.fill(HIST("QA/ZNC_Energy"), bincenter + 4, e[i + 4]); + + registry.get(HIST("QA/before/ZNA_pm1"))->Fill(Form("%d", runnumber), eZN[0]); + registry.get(HIST("QA/before/ZNA_pm2"))->Fill(Form("%d", runnumber), eZN[1]); + registry.get(HIST("QA/before/ZNA_pm3"))->Fill(Form("%d", runnumber), eZN[2]); + registry.get(HIST("QA/before/ZNA_pm4"))->Fill(Form("%d", runnumber), eZN[3]); + registry.get(HIST("QA/before/ZNC_pm1"))->Fill(Form("%d", runnumber), eZN[4]); + registry.get(HIST("QA/before/ZNC_pm2"))->Fill(Form("%d", runnumber), eZN[5]); + registry.get(HIST("QA/before/ZNC_pm3"))->Fill(Form("%d", runnumber), eZN[6]); + registry.get(HIST("QA/before/ZNC_pm4"))->Fill(Form("%d", runnumber), eZN[7]); + + registry.get(HIST("QA/after/ZNA_pm1"))->Fill(Form("%d", runnumber), e[0]); + registry.get(HIST("QA/after/ZNA_pm2"))->Fill(Form("%d", runnumber), e[1]); + registry.get(HIST("QA/after/ZNA_pm3"))->Fill(Form("%d", runnumber), e[2]); + registry.get(HIST("QA/after/ZNA_pm4"))->Fill(Form("%d", runnumber), e[3]); + registry.get(HIST("QA/after/ZNC_pm1"))->Fill(Form("%d", runnumber), e[4]); + registry.get(HIST("QA/after/ZNC_pm2"))->Fill(Form("%d", runnumber), e[5]); + registry.get(HIST("QA/after/ZNC_pm3"))->Fill(Form("%d", runnumber), e[6]); + registry.get(HIST("QA/after/ZNC_pm4"))->Fill(Form("%d", runnumber), e[7]); } // Now calculate Q-vector - for (int tower = 0; tower < 8; tower++) { - int side = (tower > 3) ? 1 : 0; - int sector = tower % 4; + for (int tower = 0; tower < nTowers; tower++) { + int side = (tower >= nTowersPerSide) ? 1 : 0; + int sector = tower % nTowersPerSide; double energy = std::pow(e[tower], alphaZDC); sumZN[side] += energy; xEnZN[side] += (side == 0) ? -1.0 * pxZDC[sector] * energy : pxZDC[sector] * energy; @@ -562,47 +681,36 @@ struct ZdcQVectors { } // "QXA", "QYA", "QXC", "QYC" - for (int i = 0; i < 2; ++i) { + int sides = 2; + for (int i = 0; i < sides; ++i) { if (sumZN[i] > 0) { q[i * 2] = xEnZN[i] / sumZN[i]; // for QXA[0] and QXC[2] q[i * 2 + 1] = yEnZN[i] / sumZN[i]; // for QYA[1] and QYC[3] } } - if (cal.calibfilesLoaded[0][1]) { - v[0] = v[0] - getCorrection(0, 1, vnames[0].Data()); - v[1] = v[1] - getCorrection(0, 1, vnames[1].Data()); + if (cal.calibfilesLoaded[1]) { + v[0] = v[0] - getCorrection(vnames[0].Data()); + v[1] = v[1] - getCorrection(vnames[1].Data()); + } else { + LOGF(warning, " --> No mean V found.. -> THis wil lead to wrong axis for vx, vy (will be created in vmean/)"); + return; } - for (int iteration = 1; iteration < 6; iteration++) { - std::vector ccdbDirs; - if (iteration == 1) - ccdbDirs = cfgRec1.value; - if (iteration == 2) - ccdbDirs = cfgRec2.value; - if (iteration == 3) - ccdbDirs = cfgRec3.value; - if (iteration == 4) - ccdbDirs = cfgRec4.value; - if (iteration == 5) - ccdbDirs = cfgRec5.value; - - for (int step = 0; step < 5; step++) { - loadCalibrations(iteration, step, foundBC.timestamp(), (ccdbDirs)[step], names[step]); - } - } + loadCalibrations(foundBC.timestamp(), cfgRec.value); std::vector qRec(q); if (cal.atIteration == 0) { if (isSelected) - fillCommonRegistry(q[0], q[1], q[2], q[3], v, centrality); - + if (cfgFillCommonRegistry) + fillCommonRegistry(q[0], q[1], q[2], q[3], v, centrality); spTableZDC(runnumber, centrality, v[0], v[1], v[2], q[0], q[1], q[2], q[3], isSelected, 0, 0); counter++; return; - } else if (cal.atIteration == 5 && cal.atStep == 4) { - fillCommonRegistry(q[0], q[1], q[2], q[3], v, centrality); + } else { + if (cfgFillCommonRegistry) + fillCommonRegistry(q[0], q[1], q[2], q[3], v, centrality); // vector of 4 std::vector corrQxA; @@ -612,18 +720,21 @@ struct ZdcQVectors { int pb = 0; - for (int it = 1; it < 6; it++) { - corrQxA.push_back(getCorrection(it, 0, names[0][0].Data())); - corrQyA.push_back(getCorrection(it, 0, names[0][1].Data())); - corrQxC.push_back(getCorrection(it, 0, names[0][2].Data())); - corrQyC.push_back(getCorrection(it, 0, names[0][3].Data())); + int nIterations = 6; + int nSteps = 5; + + for (int it = 1; it < nIterations; it++) { + corrQxA.push_back(getCorrection(names[0][0].Data(), it, 0)); + corrQyA.push_back(getCorrection(names[0][1].Data(), it, 0)); + corrQxC.push_back(getCorrection(names[0][2].Data(), it, 0)); + corrQyC.push_back(getCorrection(names[0][3].Data(), it, 0)); pb++; - for (int step = 1; step < 5; step++) { - corrQxA.push_back(getCorrection(it, step, names[step][0].Data())); - corrQyA.push_back(getCorrection(it, step, names[step][1].Data())); - corrQxC.push_back(getCorrection(it, step, names[step][2].Data())); - corrQyC.push_back(getCorrection(it, step, names[step][3].Data())); + for (int step = 1; step < nSteps; step++) { + corrQxA.push_back(getCorrection(names[step][0].Data(), it, step)); + corrQyA.push_back(getCorrection(names[step][1].Data(), it, step)); + corrQxC.push_back(getCorrection(names[step][2].Data(), it, step)); + corrQyC.push_back(getCorrection(names[step][3].Data(), it, step)); pb++; } } @@ -636,7 +747,8 @@ struct ZdcQVectors { } if (isSelected) { - fillCommonRegistry(qRec[0], qRec[1], qRec[2], qRec[3], v, centrality); + if (cfgFillCommonRegistry) + fillCommonRegistry(qRec[0], qRec[1], qRec[2], qRec[3], v, centrality); registry.fill(HIST("QA/centrality_after"), centrality); } @@ -646,9 +758,6 @@ struct ZdcQVectors { counter++; return; - } else { - if (counter < 1) - LOGF(info, "Recentering not complete!! q-vectors at iteration %i and step %i!!!!", cal.atIteration, cal.atStep + 1); } LOGF(warning, "We return without saving table... -> THis is a problem"); } // end of process From 6e645f4c77ab48646b925424ad51fd24971b7545 Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Wed, 23 Apr 2025 21:46:55 +0200 Subject: [PATCH 1076/1650] [PWGLF] Autodetect fix: properly find versioned tables (#10962) Co-authored-by: ALICE Builder --- .../Strangeness/strangenessbuilder.cxx | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx index 553a0f74e36..38250425e4b 100644 --- a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx @@ -35,6 +35,7 @@ #include #include +#include "Framework/DataSpecUtils.h" #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" @@ -486,6 +487,7 @@ struct StrangenessBuilder { LOGF(info, "Configuring tables to generate"); auto& workflows = context.services().get(); + TString listOfRequestors[nTables]; for (int i = 0; i < nTables; i++) { // adjust bookkeeping histogram h->GetXaxis()->SetBinLabel(i + 1, tableNames[i].c_str()); @@ -503,9 +505,17 @@ struct StrangenessBuilder { for (auto const& input : device.inputs) { if (device.name.compare("strangenessbuilder-initializer") == 0) continue; // don't listen to the initializer - if (input.matcher.binding == tableNames[i]) { - LOGF(info, "Device %s has subscribed to %s", device.name, tableNames[i]); - mEnabledTables[i] = 1; + if (DataSpecUtils::partialMatch(input.matcher, o2::header::DataOrigin("AOD"))) { + auto&& [origin, description, version] = DataSpecUtils::asConcreteDataMatcher(input.matcher); + std::string tableNameWithVersion = tableNames[i]; + if (version > 0) { + tableNameWithVersion += Form("_%03d", version); + } + if (input.matcher.binding == tableNameWithVersion) { + LOGF(info, "Device %s has subscribed to %s (version %i)", device.name, tableNames[i], version); + listOfRequestors[i].Append(Form("%s ", device.name.c_str())); + mEnabledTables[i] = 1; + } } } } @@ -540,7 +550,7 @@ struct StrangenessBuilder { for (int i = 0; i < nTables; i++) { // printout to be improved in the future if (mEnabledTables[i]) { - LOGF(info, " -~> Table enabled: %s", tableNames[i]); + LOGF(info, " -~> Table enabled: %s, requested by %s", tableNames[i], listOfRequestors[i].Data()); h->SetBinContent(i + 1, 0); // mark enabled } } From d57d0926626325985b86cd198a3b13c4d919c01f Mon Sep 17 00:00:00 2001 From: amaringarcia Date: Wed, 23 Apr 2025 21:52:39 +0200 Subject: [PATCH 1077/1650] =?UTF-8?q?[DPG]=20:=20adding=20configurable=20f?= =?UTF-8?q?or=20trigger,=20use=20std=20functions,=20add=20ident=E2=80=A6?= =?UTF-8?q?=20(#10950)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DPG/Tasks/TPC/tpcSkimsTableCreator.cxx | 32 ++++++++--- DPG/Tasks/TPC/tpcSkimsTableCreator.h | 5 ++ PWGDQ/DataModel/ReducedInfoTables.h | 10 +++- PWGDQ/Tasks/v0selector.cxx | 77 +++++++++++++++++--------- 4 files changed, 90 insertions(+), 34 deletions(-) diff --git a/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx b/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx index 77b563c5567..480e3c9d04b 100644 --- a/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx +++ b/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx @@ -20,6 +20,7 @@ #include #include #include +#include /// ROOT #include "TRandom3.h" /// O2 @@ -53,6 +54,7 @@ struct TreeWriterTpcV0 { using Trks = soa::Join; using Colls = soa::Join; using MyBCTable = soa::Join; + using V0sWithID = soa::Join; /// Tables to be produced Produces rowTPCTree; @@ -63,6 +65,7 @@ struct TreeWriterTpcV0 { Configurable nClNorm{"nClNorm", 152., "Number of cluster normalization. Run 2: 159, Run 3 152"}; Configurable applyEvSel{"applyEvSel", 2, "Flag to apply rapidity cut: 0 -> no event selection, 1 -> Run 2 event selection, 2 -> Run 3 event selection"}; Configurable trackSelection{"trackSelection", 1, "Track selection: 0 -> No Cut, 1 -> kGlobalTrack, 2 -> kGlobalTrackWoPtEta, 3 -> kGlobalTrackWoDCA, 4 -> kQualityTracks, 5 -> kInAcceptanceTracks"}; + Configurable irSource{"irSource", "T0VTX", "Estimator of the interaction rate (Recommended: pp --> T0VTX, Pb-Pb --> ZNC hadronic)"}; /// Configurables downsampling Configurable dwnSmplFactor_Pi{"dwnSmplFactor_Pi", 1., "downsampling factor for pions, default fraction to keep is 1."}; Configurable dwnSmplFactor_Pr{"dwnSmplFactor_Pr", 1., "downsampling factor for protons, default fraction to keep is 1."}; @@ -90,6 +93,7 @@ struct TreeWriterTpcV0 { { const double ncl = track.tpcNClsFound(); + const double nclPID = track.tpcNClsFindableMinusPID(); const double p = track.tpcInnerParam(); const double mass = o2::track::pid_constants::sMasses[id]; const double bg = p / mass; @@ -118,6 +122,7 @@ struct TreeWriterTpcV0 { bg, multTPC / 11000., std::sqrt(nClNorm / ncl), + nclPID, id, nSigmaTPC, nSigmaTOF, @@ -140,6 +145,7 @@ struct TreeWriterTpcV0 { { const double ncl = track.tpcNClsFound(); + const double nclPID = track.tpcNClsFindableMinusPID(); const double p = track.tpcInnerParam(); const double mass = o2::track::pid_constants::sMasses[id]; const double bg = p / mass; @@ -168,6 +174,7 @@ struct TreeWriterTpcV0 { bg, multTPC / 11000., std::sqrt(nClNorm / ncl), + nclPID, id, nSigmaTPC, nSigmaTOF, @@ -252,7 +259,7 @@ struct TreeWriterTpcV0 { } /// Apply a track quality selection with a filter! - void processStandard(Colls::iterator const& collision, soa::Filtered const& tracks, aod::V0Datas const& v0s, aod::BCsWithTimestamps const&) + void processStandard(Colls::iterator const& collision, soa::Filtered const& tracks, V0sWithID const& v0s, aod::BCsWithTimestamps const&) { /// Check event slection if (!isEventSelected(collision, tracks)) { @@ -260,7 +267,7 @@ struct TreeWriterTpcV0 { } auto bc = collision.bc_as(); const int runnumber = bc.runNumber(); - float hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), runnumber, "ZNC hadronic") * 1.e-3; + float hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), runnumber, irSource) * 1.e-3; rowTPCTree.reserve(tracks.size()); @@ -268,6 +275,9 @@ struct TreeWriterTpcV0 { for (const auto& v0 : v0s) { auto posTrack = v0.posTrack_as>(); auto negTrack = v0.negTrack_as>(); + if (v0.v0addid() == -1) { + continue; + } // gamma if (static_cast(posTrack.pidbit() & (1 << 0)) && static_cast(negTrack.pidbit() & (1 << 0))) { if (downsampleTsalisCharged(posTrack.pt(), downsamplingTsalisElectrons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Electron], maxPt4dwnsmplTsalisElectrons)) { @@ -313,8 +323,8 @@ struct TreeWriterTpcV0 { PROCESS_SWITCH(TreeWriterTpcV0, processStandard, "Standard V0 Samples for PID", true); Preslice perCollisionTracks = aod::track::collisionId; - Preslice perCollisionV0s = aod::v0data::collisionId; - void processWithTrQA(Colls const& collisions, Trks const& myTracks, aod::V0Datas const& myV0s, MyBCTable const&, aod::TracksQA_002 const& tracksQA) + Preslice perCollisionV0s = aod::v0data::collisionId; + void processWithTrQA(Colls const& collisions, Trks const& myTracks, V0sWithID const& myV0s, MyBCTable const&, aod::TracksQA_002 const& tracksQA) { std::vector labelTrack2TrackQA; labelTrack2TrackQA.clear(); @@ -333,7 +343,7 @@ struct TreeWriterTpcV0 { } auto bc = collision.bc_as(); const int runnumber = bc.runNumber(); - float hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), runnumber, "ZNC hadronic") * 1.e-3; + float hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), runnumber, irSource) * 1.e-3; const int bcGlobalIndex = bc.globalIndex(); const int bcTimeFrameId = bc.tfId(); const int bcBcInTimeFrame = bc.bcInTF(); @@ -342,6 +352,9 @@ struct TreeWriterTpcV0 { for (const auto& v0 : v0s) { auto posTrack = v0.posTrack_as(); auto negTrack = v0.negTrack_as(); + if (v0.v0addid() == -1) { + continue; + } aod::TracksQA_002::iterator posTrackQA; aod::TracksQA_002::iterator negTrackQA; bool existPosTrkQA; @@ -432,6 +445,7 @@ struct TreeWriterTPCTOF { Configurable applyEvSel{"applyEvSel", 2, "Flag to apply rapidity cut: 0 -> no event selection, 1 -> Run 2 event selection, 2 -> Run 3 event selection"}; Configurable applyTrkSel{"applyTrkSel", 1, "Flag to apply track selection: 0 -> no track selection, 1 -> track selection"}; Configurable trackSelection{"trackSelection", 1, "Track selection: 0 -> No Cut, 1 -> kGlobalTrack, 2 -> kGlobalTrackWoPtEta, 3 -> kGlobalTrackWoDCA, 4 -> kQualityTracks, 5 -> kInAcceptanceTracks"}; + Configurable irSource{"irSource", "T0VTX", "Estimator of the interaction rate (Recommended: pp --> T0VTX, Pb-Pb --> ZNC hadronic)"}; /// Triton Configurable maxMomTPCOnlyTr{"maxMomTPCOnlyTr", 1.5, "Maximum momentum for TPC only cut triton"}; Configurable maxMomHardCutOnlyTr{"maxMomHardCutOnlyTr", 50, "Maximum TPC inner momentum for triton"}; @@ -517,6 +531,7 @@ struct TreeWriterTPCTOF { { const double ncl = track.tpcNClsFound(); + const double nclPID = track.tpcNClsFindableMinusPID(); const double p = track.tpcInnerParam(); const double mass = o2::track::pid_constants::sMasses[id]; const double bg = p / mass; @@ -538,6 +553,7 @@ struct TreeWriterTPCTOF { bg, multTPC / 11000., std::sqrt(nClNorm / ncl), + nclPID, id, nSigmaTPC, nSigmaTOF, @@ -553,6 +569,7 @@ struct TreeWriterTPCTOF { { const double ncl = track.tpcNClsFound(); + const double nclPID = track.tpcNClsFindableMinusPID(); const double p = track.tpcInnerParam(); const double mass = o2::track::pid_constants::sMasses[id]; const double bg = p / mass; @@ -574,6 +591,7 @@ struct TreeWriterTPCTOF { bg, multTPC / 11000., std::sqrt(nClNorm / ncl), + nclPID, id, nSigmaTPC, nSigmaTOF, @@ -628,7 +646,7 @@ struct TreeWriterTPCTOF { } auto bc = collision.bc_as(); const int runnumber = bc.runNumber(); - float hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), runnumber, "ZNC hadronic") * 1.e-3; + float hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), runnumber, irSource) * 1.e-3; rowTPCTOFTree.reserve(tracks.size()); for (auto const& trk : tracks) { @@ -688,7 +706,7 @@ struct TreeWriterTPCTOF { } auto bc = collision.bc_as(); const int runnumber = bc.runNumber(); - float hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), runnumber, "ZNC hadronic") * 1.e-3; + float hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), runnumber, irSource) * 1.e-3; const int bcGlobalIndex = bc.globalIndex(); const int bcTimeFrameId = bc.tfId(); const int bcBcInTimeFrame = bc.bcInTF(); diff --git a/DPG/Tasks/TPC/tpcSkimsTableCreator.h b/DPG/Tasks/TPC/tpcSkimsTableCreator.h index 0f7e2264a25..1dcab1abfae 100644 --- a/DPG/Tasks/TPC/tpcSkimsTableCreator.h +++ b/DPG/Tasks/TPC/tpcSkimsTableCreator.h @@ -33,6 +33,7 @@ DECLARE_SOA_COLUMN(Mass, mass, float); DECLARE_SOA_COLUMN(BetaGamma, bg, float); DECLARE_SOA_COLUMN(NormMultTPC, normMultTPC, float); DECLARE_SOA_COLUMN(NormNClustersTPC, normNClustersTPC, float); +DECLARE_SOA_COLUMN(NormNClustersTPCPID, normNClustersTPCPID, float); DECLARE_SOA_COLUMN(PidIndex, pidIndexTPC, uint8_t); DECLARE_SOA_COLUMN(NSigTPC, nsigTPC, float); DECLARE_SOA_COLUMN(NSigTOF, nsigTOF, float); @@ -64,6 +65,7 @@ DECLARE_SOA_TABLE(SkimmedTPCV0Tree, "AOD", "TPCSKIMV0TREE", tpcskims::BetaGamma, tpcskims::NormMultTPC, tpcskims::NormNClustersTPC, + tpcskims::NormNClustersTPCPID, tpcskims::PidIndex, tpcskims::NSigTPC, tpcskims::NSigTOF, @@ -90,6 +92,7 @@ DECLARE_SOA_TABLE(SkimmedTPCV0TreeWithTrkQA, "AOD", "TPCSKIMV0WQA", tpcskims::BetaGamma, tpcskims::NormMultTPC, tpcskims::NormNClustersTPC, + tpcskims::NormNClustersTPCPID, tpcskims::PidIndex, tpcskims::NSigTPC, tpcskims::NSigTOF, @@ -129,6 +132,7 @@ DECLARE_SOA_TABLE(SkimmedTPCTOFTree, "AOD", "TPCTOFSKIMTREE", tpcskims::BetaGamma, tpcskims::NormMultTPC, tpcskims::NormNClustersTPC, + tpcskims::NormNClustersTPCPID, tpcskims::PidIndex, tpcskims::NSigTPC, tpcskims::NSigTOF, @@ -150,6 +154,7 @@ DECLARE_SOA_TABLE(SkimmedTPCTOFTreeWithTrkQA, "AOD", "TPCTOFSKIMWQA", tpcskims::BetaGamma, tpcskims::NormMultTPC, tpcskims::NormNClustersTPC, + tpcskims::NormNClustersTPCPID, tpcskims::PidIndex, tpcskims::NSigTPC, tpcskims::NSigTOF, diff --git a/PWGDQ/DataModel/ReducedInfoTables.h b/PWGDQ/DataModel/ReducedInfoTables.h index ca79b6becb3..dcf27f9ac9c 100644 --- a/PWGDQ/DataModel/ReducedInfoTables.h +++ b/PWGDQ/DataModel/ReducedInfoTables.h @@ -905,7 +905,7 @@ DECLARE_SOA_COLUMN(Pt, pt, float); //! DECLARE_SOA_COLUMN(Eta, eta, float); //! DECLARE_SOA_COLUMN(Phi, phi, float); //! DECLARE_SOA_COLUMN(Sign, sign, int); //! -DECLARE_SOA_COLUMN(McDecision, mcDecision, uint16_t); //! +DECLARE_SOA_COLUMN(McDecision, mcDecision, uint32_t); //! } // namespace fwdpid DECLARE_SOA_TABLE(FwdPidsAll, "AOD", "RTFWDPIDALL", //! @@ -1012,6 +1012,14 @@ DECLARE_SOA_TABLE(V0Bits, "AOD", "V0BITS", //! // iterators using V0Bit = V0Bits::iterator; +namespace v0mapID +{ +DECLARE_SOA_COLUMN(V0AddID, v0addid, int8_t); //! +} // namespace v0mapID + +DECLARE_SOA_TABLE(V0MapID, "AOD", "V0MAPID", //! + v0mapID::V0AddID); + namespace DalBits { DECLARE_SOA_COLUMN(DALITZBits, dalitzBits, uint8_t); //! diff --git a/PWGDQ/Tasks/v0selector.cxx b/PWGDQ/Tasks/v0selector.cxx index 52068b44958..0c970d80c91 100644 --- a/PWGDQ/Tasks/v0selector.cxx +++ b/PWGDQ/Tasks/v0selector.cxx @@ -21,6 +21,7 @@ #include #include #include +#include #include "Math/Vector4D.h" #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -74,6 +75,7 @@ struct v0selector { Configurable cutQTK0SHigh{"cutQTK0SHigh", 0.215, "cutQTK0SHigh"}; Configurable cutAPK0SLow{"cutAPK0SLow", 0.199, "cutAPK0SLow"}; Configurable cutAPK0SHigh{"cutAPK0SHigh", 0.8, "cutAPK0SHigh"}; + Configurable cutAPK0SHighTop{"cutAPK0SHighTop", 0.9, "cutAPK0SHighTop"}; // Lambda & A-Lambda cuts Configurable cutQTL{"cutQTL", 0.03, "cutQTL"}; Configurable cutAlphaLLow{"cutAlphaLLow", 0.35, "cutAlphaLLow"}; @@ -83,6 +85,7 @@ struct v0selector { Configurable cutAPL1{"cutAPL1", 0.107, "cutAPL1"}; Configurable cutAPL2{"cutAPL2", -0.69, "cutAPL2"}; Configurable cutAPL3{"cutAPL3", 0.5, "cutAPL3"}; + Configurable produceV0ID{"produceV0ID", false, "Produce additional V0ID table"}; enum { // Reconstructed V0 kUndef = -1, @@ -94,6 +97,7 @@ struct v0selector { }; Produces v0bits; + Produces v0mapID; // int checkV0(const array& ppos, const array& pneg) int checkV0(const float alpha, const float qt) @@ -117,31 +121,32 @@ struct v0selector { // const float cutAPL[3] = {0.107, -0.69, 0.5}; // parameters for curved QT cut if (qt < cutQTG) { - if ((TMath::Abs(alpha) < cutAlphaG)) { + if ((std::abs(alpha) < cutAlphaG)) { return kGamma; } } if (qt < cutQTG2) { // additional region - should help high pT gammas - if ((TMath::Abs(alpha) > cutAlphaGLow) && (TMath::Abs(alpha) < cutAlphaGHigh)) { + if ((std::abs(alpha) > cutAlphaGLow) && (std::abs(alpha) < cutAlphaGHigh)) { return kGamma; } } // Check for K0S candidates - float q = cutAPK0SLow * TMath::Sqrt(TMath::Abs(1 - alpha * alpha / (cutAPK0SHigh * cutAPK0SHigh))); - if ((qt > cutQTK0SLow) && (qt < cutQTK0SHigh) && (qt > q)) { + float q = cutAPK0SLow * std::sqrt(std::abs(1.0f - alpha * alpha / (cutAPK0SHigh * cutAPK0SHigh))); + float qtop = cutQTK0SHigh * std::sqrt(std::abs(1.0f - alpha * alpha / (cutAPK0SHighTop * cutAPK0SHighTop))); + if ((qt > cutQTK0SLow) && (qt < cutQTK0SHigh) && (qt > q) && (qt < qtop)) { return kK0S; } // Check for Lambda candidates - q = cutAPL1 * TMath::Sqrt(TMath::Abs(1 - ((alpha + cutAPL2) * (alpha + cutAPL2)) / (cutAPL3 * cutAPL3))); + q = cutAPL1 * std::sqrt(std::abs(1.0f - ((alpha + cutAPL2) * (alpha + cutAPL2)) / (cutAPL3 * cutAPL3))); if ((alpha > cutAlphaLLow) && (alpha < cutAlphaLHigh) && (qt > cutQTL) && (qt < q)) { return kLambda; } // Check for AntiLambda candidates - q = cutAPL1 * TMath::Sqrt(TMath::Abs(1 - ((alpha - cutAPL2) * (alpha - cutAPL2)) / (cutAPL3 * cutAPL3))); + q = cutAPL1 * std::sqrt(std::abs(1.0f - ((alpha - cutAPL2) * (alpha - cutAPL2)) / (cutAPL3 * cutAPL3))); if ((alpha > cutAlphaALLow) && (alpha < cutAlphaALHigh) && (qt > cutQTL) && (qt < q)) { return kAntiLambda; } @@ -189,14 +194,22 @@ struct v0selector { registry.add("hDCAzNegToPV", "hDCAzNegToPV", HistType::kTH1F, {{1000, -5.0f, 5.0f}}); registry.add("hDCAV0Dau", "hDCAV0Dau", HistType::kTH1F, {{1000, 0.0f, 10.0f}}); registry.add("hV0APplot", "hV0APplot", HistType::kTH2F, {{200, -1.0f, +1.0f}, {250, 0.0f, 0.25f}}); + registry.add("hV0APplotSelected", "hV0APplotSelected", HistType::kTH2F, {{200, -1.0f, +1.0f}, {250, 0.0f, 0.25f}}); registry.add("hV0Psi", "hV0Psi", HistType::kTH2F, {{100, 0, TMath::PiOver2()}, {100, 0, 0.1}}); } } void process(aod::V0Datas const& V0s, FullTracksExt const& tracks, aod::Collisions const&) { - std::map pidmap; - + std::vector pidmap; + pidmap.clear(); + pidmap.resize(tracks.size(), 0); + + std::vector v0pidmap; + v0pidmap.clear(); + if (produceV0ID.value) { + v0pidmap.resize(V0s.size(), -1); + } for (auto& V0 : V0s) { // if (!(V0.posTrack_as().trackType() & o2::aod::track::TPCrefit)) { // continue; @@ -209,10 +222,10 @@ struct v0selector { if (fillhisto) { registry.fill(HIST("hV0Candidate"), 1); } - if (fabs(V0.posTrack_as().eta()) > 0.9) { + if (std::fabs(V0.posTrack_as().eta()) > 0.9) { continue; } - if (fabs(V0.negTrack_as().eta()) > 0.9) { + if (std::fabs(V0.negTrack_as().eta()) > 0.9) { continue; } @@ -222,25 +235,22 @@ struct v0selector { if (V0.negTrack_as().tpcNClsCrossedRows() < mincrossedrows) { continue; } - if (V0.posTrack_as().tpcChi2NCl() > maxchi2tpc) { continue; } if (V0.negTrack_as().tpcChi2NCl() > maxchi2tpc) { continue; } - - if (fabs(V0.posTrack_as().dcaXY()) < dcamin) { + if (std::fabs(V0.posTrack_as().dcaXY()) < dcamin) { continue; } - if (fabs(V0.negTrack_as().dcaXY()) < dcamin) { + if (std::fabs(V0.negTrack_as().dcaXY()) < dcamin) { continue; } - - if (fabs(V0.posTrack_as().dcaXY()) > dcamax) { + if (std::fabs(V0.posTrack_as().dcaXY()) > dcamax) { continue; } - if (fabs(V0.negTrack_as().dcaXY()) > dcamax) { + if (std::fabs(V0.negTrack_as().dcaXY()) > dcamax) { continue; } @@ -304,15 +314,24 @@ struct v0selector { // printf("This is not [Gamma/K0S/Lambda/AntiLambda] candidate.\n"); continue; } + if (fillhisto) { + registry.fill(HIST("hV0APplotSelected"), V0.alpha(), V0.qtarm()); + } + auto storeV0AddID = [&](auto gix, auto id) { + if (produceV0ID.value) { + v0pidmap[gix] = id; + } + }; if (v0id == kGamma) { // photon conversion if (fillhisto) { registry.fill(HIST("hMassGamma"), V0radius, mGamma); registry.fill(HIST("hV0Psi"), psipair, mGamma); } - if (mGamma < v0max_mee && TMath::Abs(V0.posTrack_as().tpcNSigmaEl()) < cutNsigmaElTPC && TMath::Abs(V0.negTrack_as().tpcNSigmaEl()) < cutNsigmaElTPC && TMath::Abs(psipair) < maxpsipair) { + if (mGamma < v0max_mee && std::abs(V0.posTrack_as().tpcNSigmaEl()) < cutNsigmaElTPC && std::abs(V0.negTrack_as().tpcNSigmaEl()) < cutNsigmaElTPC && std::abs(psipair) < maxpsipair) { pidmap[V0.posTrackId()] |= (uint8_t(1) << kGamma); pidmap[V0.negTrackId()] |= (uint8_t(1) << kGamma); + storeV0AddID(V0.globalIndex(), kGamma); if (fillhisto) { registry.fill(HIST("hGammaRxy"), V0.x(), V0.y()); } @@ -324,33 +343,39 @@ struct v0selector { registry.fill(HIST("hMassK0SEta"), V0.eta(), mK0S); registry.fill(HIST("hMassK0SPhi"), V0.phi(), mK0S); } - if ((0.48 < mK0S && mK0S < 0.51) && TMath::Abs(V0.posTrack_as().tpcNSigmaPi()) < cutNsigmaPiTPC && TMath::Abs(V0.negTrack_as().tpcNSigmaPi()) < cutNsigmaPiTPC) { + if ((0.48 < mK0S && mK0S < 0.51) && std::abs(V0.posTrack_as().tpcNSigmaPi()) < cutNsigmaPiTPC && std::abs(V0.negTrack_as().tpcNSigmaPi()) < cutNsigmaPiTPC) { pidmap[V0.posTrackId()] |= (uint8_t(1) << kK0S); pidmap[V0.negTrackId()] |= (uint8_t(1) << kK0S); + storeV0AddID(V0.globalIndex(), kK0S); } } else if (v0id == kLambda) { // L->p + pi- if (fillhisto) { registry.fill(HIST("hMassLambda"), V0radius, mLambda); } - if (v0id == kLambda && (1.110 < mLambda && mLambda < 1.120) && TMath::Abs(V0.posTrack_as().tpcNSigmaPr()) < cutNsigmaPrTPC && TMath::Abs(V0.negTrack_as().tpcNSigmaPi()) < cutNsigmaPiTPC) { + if (v0id == kLambda && (1.110 < mLambda && mLambda < 1.120) && std::abs(V0.posTrack_as().tpcNSigmaPr()) < cutNsigmaPrTPC && std::abs(V0.negTrack_as().tpcNSigmaPi()) < cutNsigmaPiTPC) { pidmap[V0.posTrackId()] |= (uint8_t(1) << kLambda); pidmap[V0.negTrackId()] |= (uint8_t(1) << kLambda); + storeV0AddID(V0.globalIndex(), kLambda); } } else if (v0id == kAntiLambda) { // Lbar -> pbar + pi+ if (fillhisto) { registry.fill(HIST("hMassAntiLambda"), V0radius, mAntiLambda); } - if ((1.110 < mAntiLambda && mAntiLambda < 1.120) && TMath::Abs(V0.posTrack_as().tpcNSigmaPi()) < cutNsigmaPiTPC && TMath::Abs(V0.negTrack_as().tpcNSigmaPr()) < cutNsigmaPrTPC) { + if ((1.110 < mAntiLambda && mAntiLambda < 1.120) && std::abs(V0.posTrack_as().tpcNSigmaPi()) < cutNsigmaPiTPC && std::abs(V0.negTrack_as().tpcNSigmaPr()) < cutNsigmaPrTPC) { pidmap[V0.posTrackId()] |= (uint8_t(1) << kAntiLambda); pidmap[V0.negTrackId()] |= (uint8_t(1) << kAntiLambda); + storeV0AddID(V0.globalIndex(), kAntiLambda); } } - // printf("posTrackId = %d\n",V0.posTrackId()); // printf("negTrackId = %d\n",V0.negTrackId()); } // end of V0 loop - + if (produceV0ID.value) { + for (auto& V0 : V0s) { + v0mapID(v0pidmap[V0.globalIndex()]); + } + } for (auto& track : tracks) { // printf("setting pidmap[%lld] = %d\n",track.globalIndex(),pidmap[track.globalIndex()]); v0bits(pidmap[track.globalIndex()]); @@ -455,15 +480,15 @@ struct trackPIDQA { continue; } - if (fabs(track.dcaXY()) < dcamin) { + if (std::fabs(track.dcaXY()) < dcamin) { continue; } - if (fabs(track.dcaXY()) > dcamax) { + if (std::fabs(track.dcaXY()) > dcamax) { continue; } - if (fabs(track.eta()) > 0.9) { + if (std::fabs(track.eta()) > 0.9) { continue; } From 1028cd03ca6d493c3e770910714b40e48d4169e5 Mon Sep 17 00:00:00 2001 From: mj525 <99000728+mjkim525@users.noreply.github.com> Date: Thu, 24 Apr 2025 06:49:38 +0900 Subject: [PATCH 1078/1650] [PWGLF] Updates to xi* analysis code and resonanceMergeDF for event-mixing (#10939) Co-authored-by: ALICE Action Bot --- .../Resonances/resonanceMergeDF.cxx | 223 +++++++++++++++++- PWGLF/Tasks/Resonances/xi1530Analysisqa.cxx | 114 ++++++--- 2 files changed, 294 insertions(+), 43 deletions(-) mode change 100755 => 100644 PWGLF/Tasks/Resonances/xi1530Analysisqa.cxx diff --git a/PWGLF/TableProducer/Resonances/resonanceMergeDF.cxx b/PWGLF/TableProducer/Resonances/resonanceMergeDF.cxx index e7c31d1010e..99ba4ec391d 100644 --- a/PWGLF/TableProducer/Resonances/resonanceMergeDF.cxx +++ b/PWGLF/TableProducer/Resonances/resonanceMergeDF.cxx @@ -98,18 +98,32 @@ struct ResonanceMergeDF { std::vector> vecOfTuples; std::vector>> vecOfVecOfTuples; + std::vector>> + vecOfVecOfTuplesCasc; void processTrackDataDF(aod::ResoCollisions::iterator const& collision, aod::ResoTracks const& tracks) { int nCollisions = nDF; vecOfTuples.push_back(std::make_tuple(collision.posX(), collision.posY(), collision.posZ(), collision.cent(), 0, 0, 0)); std::vector> @@ -143,7 +157,6 @@ struct ResonanceMergeDF { track.px(), track.py(), track.pz(), - track.sign(), (uint8_t)track.tpcNClsCrossedRows(), (uint8_t)track.tpcNClsFound(), static_cast(track.dcaXY() * 10000), @@ -196,11 +209,213 @@ struct ResonanceMergeDF { } vecOfTuples.clear(); - vecOfVecOfTuples.clear(); // + vecOfVecOfTuples.clear(); } PROCESS_SWITCH(ResonanceMergeDF, processTrackDataDF, "Process for data merged DF", true); + void processTrackDataDFCasc(aod::ResoCollisions::iterator const& collision, aod::ResoTracks const& tracks, aod::ResoCascades const& trackCascs) + { + + int nCollisions = nDF; + vecOfTuples.push_back(std::make_tuple(collision.posX(), collision.posY(), collision.posZ(), collision.cent(), 0, 0, 0)); + std::vector> + innerVector; + std::vector> + innerVectorCasc; + for (const auto& track : tracks) { + if (cpidCut) { + if (!track.hasTOF()) { + if (std::abs(track.tpcNSigmaPr()) > nsigmaPr && std::abs(track.tpcNSigmaKa()) > nsigmaKa) + continue; + + if (crejtpc && (std::abs(track.tpcNSigmaPr()) > std::abs(track.tpcNSigmaPi()) && std::abs(track.tpcNSigmaKa()) > std::abs(track.tpcNSigmaPi()))) + continue; + + } else { + if (std::abs(track.tofNSigmaPr()) > nsigmatofPr && std::abs(track.tofNSigmaKa()) > nsigmatofKa) + continue; + + if (crejtof && (std::abs(track.tofNSigmaPr()) > std::abs(track.tofNSigmaPi()) && std::abs(track.tofNSigmaKa()) > std::abs(track.tofNSigmaPi()))) + continue; + } + + if (std::abs(track.dcaXY()) > cDCAXY) + continue; + if (std::abs(track.dcaZ()) > cDCAZ) + continue; + } + + innerVector.push_back(std::make_tuple( + // track.trackId(), + track.pt(), + track.px(), + track.py(), + track.pz(), + (uint8_t)track.tpcNClsCrossedRows(), + (uint8_t)track.tpcNClsFound(), + static_cast(track.dcaXY() * 10000), + static_cast(track.dcaZ() * 10000), + (int8_t)(track.tpcNSigmaPi() * 10), + (int8_t)(track.tpcNSigmaKa() * 10), + (int8_t)(track.tpcNSigmaPr() * 10), + (int8_t)(track.tofNSigmaPi() * 10), + (int8_t)(track.tofNSigmaKa() * 10), + (int8_t)(track.tofNSigmaPr() * 10), + (int8_t)(track.tpcSignal() * 10), + track.trackFlags())); + } + + for (const auto& trackCasc : trackCascs) { + innerVectorCasc.push_back(std::make_tuple( + trackCasc.pt(), + trackCasc.px(), + trackCasc.py(), + trackCasc.pz(), + const_cast(trackCasc.cascadeIndices()), + (int8_t)(trackCasc.daughterTPCNSigmaPosPi() * 10), + (int8_t)(trackCasc.daughterTPCNSigmaPosKa() * 10), + (int8_t)(trackCasc.daughterTPCNSigmaPosPr() * 10), + (int8_t)(trackCasc.daughterTPCNSigmaNegPi() * 10), + (int8_t)(trackCasc.daughterTPCNSigmaNegKa() * 10), + (int8_t)(trackCasc.daughterTPCNSigmaNegPr() * 10), + (int8_t)(trackCasc.daughterTPCNSigmaBachPi() * 10), + (int8_t)(trackCasc.daughterTPCNSigmaBachKa() * 10), + (int8_t)(trackCasc.daughterTPCNSigmaBachPr() * 10), + (int8_t)(trackCasc.daughterTOFNSigmaPosPi() * 10), + (int8_t)(trackCasc.daughterTOFNSigmaPosKa() * 10), + (int8_t)(trackCasc.daughterTOFNSigmaPosPr() * 10), + (int8_t)(trackCasc.daughterTOFNSigmaNegPi() * 10), + (int8_t)(trackCasc.daughterTOFNSigmaNegKa() * 10), + (int8_t)(trackCasc.daughterTOFNSigmaNegPr() * 10), + (int8_t)(trackCasc.daughterTOFNSigmaBachPi() * 10), + (int8_t)(trackCasc.daughterTOFNSigmaBachKa() * 10), + (int8_t)(trackCasc.daughterTOFNSigmaBachPr() * 10), + trackCasc.v0CosPA(), + trackCasc.cascCosPA(), + trackCasc.daughDCA(), + trackCasc.cascDaughDCA(), + trackCasc.dcapostopv(), + trackCasc.dcanegtopv(), + trackCasc.dcabachtopv(), + trackCasc.dcav0topv(), + trackCasc.dcaXYCascToPV(), + trackCasc.dcaZCascToPV(), + trackCasc.sign(), + trackCasc.mLambda(), + trackCasc.mXi(), + trackCasc.transRadius(), trackCasc.cascTransRadius(), trackCasc.decayVtxX(), trackCasc.decayVtxY(), trackCasc.decayVtxZ())); + } + + vecOfVecOfTuples.push_back(innerVector); + vecOfVecOfTuplesCasc.push_back(innerVectorCasc); + innerVector.clear(); + innerVectorCasc.clear(); + + df++; + LOGF(info, "collisions: df = %i", df); + if (df < nCollisions) + return; + df = 0; + + for (size_t i = 0; i < vecOfTuples.size(); ++i) { + const auto& tuple = vecOfTuples[i]; + const auto& innerVector = vecOfVecOfTuples[i]; + const auto& innerVectorCasc = vecOfVecOfTuplesCasc[i]; + + histos.fill(HIST("Event/h1d_ft0_mult_percentile"), std::get<3>(tuple)); + resoCollisionsdf(0, std::get<0>(tuple), std::get<1>(tuple), std::get<2>(tuple), std::get<3>(tuple), std::get<4>(tuple), std::get<5>(tuple), 0., 0., 0., 0., 0, std::get<6>(tuple)); + // LOGF(info, "collisions: Index = %d ) %f - %f - %f %f %d -- %d", std::get<0>(tuple).globalIndex(),std::get<1>(tuple),std::get<2>(tuple), std::get<3>(tuple), std::get<4>(tuple), std::get<5>(tuple).size(),resoCollisionsdf.lastIndex()); + + for (const auto& tuple : innerVector) { + reso2trksdf(resoCollisionsdf.lastIndex(), + std::get<0>(tuple), + std::get<1>(tuple), + std::get<2>(tuple), + std::get<3>(tuple), + std::get<4>(tuple), + std::get<5>(tuple), + std::get<6>(tuple), + std::get<7>(tuple), + std::get<8>(tuple), + std::get<9>(tuple), + std::get<10>(tuple), + std::get<11>(tuple), + std::get<12>(tuple), + std::get<13>(tuple), + std::get<14>(tuple), + std::get<15>(tuple)); + } + + for (const auto& tuple : innerVectorCasc) { + reso2cascadesdf(resoCollisionsdf.lastIndex(), + std::get<0>(tuple), + std::get<1>(tuple), + std::get<2>(tuple), + std::get<3>(tuple), + std::get<4>(tuple), + std::get<5>(tuple), + std::get<6>(tuple), + std::get<7>(tuple), + std::get<8>(tuple), + std::get<9>(tuple), + std::get<10>(tuple), + std::get<11>(tuple), + std::get<12>(tuple), + std::get<13>(tuple), + std::get<14>(tuple), + std::get<15>(tuple), + std::get<16>(tuple), + std::get<17>(tuple), + std::get<18>(tuple), + std::get<19>(tuple), + std::get<20>(tuple), + std::get<21>(tuple), + std::get<22>(tuple), + std::get<23>(tuple), + std::get<24>(tuple), + std::get<25>(tuple), + std::get<26>(tuple), + std::get<27>(tuple), + std::get<28>(tuple), + std::get<29>(tuple), + std::get<30>(tuple), + std::get<31>(tuple), + std::get<32>(tuple), + std::get<33>(tuple), + std::get<34>(tuple), + std::get<35>(tuple), + std::get<36>(tuple), + std::get<37>(tuple), + std::get<38>(tuple), + std::get<39>(tuple), + std::get<40>(tuple)); + } + } + + vecOfTuples.clear(); + vecOfVecOfTuples.clear(); + vecOfVecOfTuplesCasc.clear(); // + } + + PROCESS_SWITCH(ResonanceMergeDF, processTrackDataDFCasc, "Process for data merged DF for cascade", false); + void processLambdaStarCandidate(aod::ResoCollisions::iterator const& collision, aod::ResoTracks const& tracks) { diff --git a/PWGLF/Tasks/Resonances/xi1530Analysisqa.cxx b/PWGLF/Tasks/Resonances/xi1530Analysisqa.cxx old mode 100755 new mode 100644 index 2361457f620..53e7f283150 --- a/PWGLF/Tasks/Resonances/xi1530Analysisqa.cxx +++ b/PWGLF/Tasks/Resonances/xi1530Analysisqa.cxx @@ -13,7 +13,8 @@ /// \brief Reconstruction of Xi* resonance. /// /// \author Min-jae Kim , Bong-Hwi Lim -#include +// #include +#include "Math/Vector4D.h" #include "TF1.h" #include "TRandom3.h" @@ -34,6 +35,7 @@ using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::soa; using namespace o2::constants::physics; +using LorentzVectorPtEtaPhiMass = ROOT::Math::PtEtaPhiMVector; // Service pdgDB; enum { @@ -53,8 +55,8 @@ struct Xi1530Analysisqa { // Basic set-up // SliceCache cache; - // Preslice perRCol = aod::resodaughter::resoCollisionId; - // Preslice perCollision = aod::track::collisionId; + Preslice perRCol = aod::resodaughter::resoCollisionId; + Preslice perCollision = aod::track::collisionId; HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; using ResoMCCols = soa::Join; @@ -72,10 +74,7 @@ struct Xi1530Analysisqa { Configurable invMass1D{"invMass1D", true, "Invariant mass 1D"}; Configurable studyAntiparticle{"studyAntiparticle", true, "Study anti-particles separately"}; Configurable pidPlots{"pidPlots", true, "Make TPC and TOF PID plots"}; - Configurable additionalQAplots{"additionalQAplots", true, "Additional QA plots"}; - Configurable additionalQAeventPlots{"additionalQAeventPlots", true, "Additional QA event plots"}; - Configurable additionalMEPlots{"additionalMEPlots", true, "Additional Mixed event plots"}; // Event Mixing Configurable nEvtMixing{"nEvtMixing", 10, "Number of events to mix"}; @@ -96,7 +95,7 @@ struct Xi1530Analysisqa { Configurable tofAtHighPt{"tofAtHighPt", false, "Use TOF at high pT"}; Configurable cfgTPCcluster{"cfgTPCcluster", 1, "Minimum Number of TPC cluster"}; // Minmimum - Configurable cfgTPCRows{"cfgTPCRows", 70, "Minimum Number of TPC Crossed Rows "}; + Configurable cfgTPCRows{"cfgTPCRows", 80, "Minimum Number of TPC Crossed Rows "}; Configurable cfgRatioTPCRowsOverFindableCls{"cfgRatioTPCRowsOverFindableCls", 0.8, "Minimum of TPC Crossed Rows to Findable Clusters"}; // Minmimum Configurable cfgUseTPCRefit{"cfgUseTPCRefit", true, "Require TPC Refit"}; @@ -159,6 +158,8 @@ struct Xi1530Analysisqa { Configurable cPIDBound{"cPIDBound", 6.349, "configurable for replacing to .has"}; + Configurable cMinTOFpt{"cMinTOFpt", 0.5, "Maximum TOF pt cut"}; + // PID Selections for Pion First Configurable cMaxtpcnSigmaPionFirst{"cMaxtpcnSigmaPionFirst", 4.0, "TPC nSigma cut for Pion First"}; Configurable cMaxtofnSigmaPionFirst{"cMaxtofnSigmaPionFirst", 3.0, "TOF nSigma cut for Pion First"}; @@ -236,7 +237,7 @@ struct Xi1530Analysisqa { AxisSpec pidQAAxis = {65, -6.5, 6.5}; AxisSpec flagAxis = {9, 0, 9, "Flags"}; - if (additionalQAeventPlots) { + { // Test on Mixed event histos.add("TestME/hCollisionIndexSameE", "coll index sameE", HistType::kTH1F, {{500, 0.0f, 500.0f}}); histos.add("TestME/hCollisionIndexMixedE", "coll index mixedE", HistType::kTH1F, {{500, 0.0f, 500.0f}}); @@ -268,15 +269,11 @@ struct Xi1530Analysisqa { } } - if (additionalMEPlots) { + if (doprocessMEDF || doprocessMEMicro) { histos.add("Xi1530invmassME_DS", "Invariant mass of Xi(1530)0 mixed event DS", kTH1F, {invMassAxis}); histos.add("Xi1530invmassME_DSAnti", "Invariant mass of Xi(1530)0 mixed event DSAnti", kTH1F, {invMassAxis}); } - // TPC ncluster distirbutions - // histos.add("TPCncluster/TPCnclusterpifirst", "TPC ncluster distribution", kTH1F, {{160, 0, 160, "TPC nCluster"}}); - // histos.add("TPCncluster/TPCnclusterPhipifirst", "TPC ncluster vs phi", kTH2F, {{160, 0, 160, "TPC nCluster"}, {63, 0, 6.28, "#phi"}}); - // DCA QA to candidates for first pion and Xi- histos.add("QAbefore/trkDCAxy_pi", "DCAxy distribution of pion track candidates", HistType::kTH2F, {ptAxis, dcaxyAxis}); histos.add("QAbefore/trkDCAxy_Xi", "DCAxy distribution of Xi- track candidates", HistType::kTH2F, {ptAxis, dcaxyAxis}); @@ -350,7 +347,7 @@ struct Xi1530Analysisqa { histos.add("h3XiinvmassLSAnti", "Invariant mass of Anti-Xi- same sign", kTHnSparseF, {centAxis, ptAxis, invMassAxisCasc, flagAxis}); } - if (additionalMEPlots) { + if (doprocessMEDF || doprocessMEMicro) { histos.add("h3Xi1530invmassME_DS", "Invariant mass of Xi(1530)0 mixed event DS", kTHnSparseF, {centAxis, ptAxis, invMassAxis, flagAxis}); histos.add("h3XiinvmassME_DS", "Invariant mass of Xi- mixed event DS", kTHnSparseF, {centAxis, ptAxis, invMassAxisCasc, flagAxis}); @@ -550,19 +547,31 @@ struct Xi1530Analysisqa { return true; } - bool pidSelector(float TPCNsigma, float TOFNsigma, const PidSelectionParam& params, bool tofAtHighPt) + bool pidSelector(float TPCNsigma, float TOFNsigma, const PidSelectionParam& params, bool tofAtHighPt, float trackPt) { bool tpcPIDPassed{false}, tofPIDPassed{false}; - if (tofAtHighPt) { - // TOF based PID - if (hasSubsystemInfo(TOFNsigma) && std::abs(TOFNsigma) < params.cMaxTOFnSigma) { - return true; + if (tofAtHighPt && trackPt > cMinTOFpt) { + if (std::abs(TPCNsigma) < params.cMaxTPCnSigma) { + tpcPIDPassed = true; } - if (!hasSubsystemInfo(TOFNsigma) && std::abs(TPCNsigma) < params.cMaxTPCnSigma) { + + if (params.cByPassTOF && tpcPIDPassed) { return true; } - return false; + + if (hasSubsystemInfo(TOFNsigma)) { + if (std::abs(TOFNsigma) < params.cMaxTOFnSigma) { + tofPIDPassed = true; + } + if ((params.nsigmaCutCombined > 0) && + (TPCNsigma * TPCNsigma + TOFNsigma * TOFNsigma < params.nsigmaCutCombined * params.nsigmaCutCombined)) { + tofPIDPassed = true; + } + } else { + tofPIDPassed = true; + } + return tpcPIDPassed && tofPIDPassed; } else { if (std::abs(TPCNsigma) < params.cMaxTPCnSigma) { @@ -594,7 +603,8 @@ struct Xi1530Analysisqa { bool selectionPIDPionFirst(const T& candidate) { - static float tpcNsigmaPionFirst, tofNsigmaPionFirst; + float tpcNsigmaPionFirst, tofNsigmaPionFirst; + float trackPt = candidate.pt(); if constexpr (IsResoMicrotrack) { tpcNsigmaPionFirst = o2::aod::resodmciroaughter::PidNSigma::getTPCnSigma(candidate.pidNSigmaPiFlag()); @@ -606,7 +616,7 @@ struct Xi1530Analysisqa { PidSelectionParam pionFirstParams = {cMaxtpcnSigmaPionFirst, cMaxtofnSigmaPionFirst, cByPassTOFPionFirst, nsigmaCutCombinedPionFirst}; - return pidSelector(tpcNsigmaPionFirst, tofNsigmaPionFirst, pionFirstParams, tofAtHighPt); + return pidSelector(tpcNsigmaPionFirst, tofNsigmaPionFirst, pionFirstParams, tofAtHighPt, trackPt); } template @@ -617,6 +627,7 @@ struct Xi1530Analysisqa { float tpcNsigmaBachelor, tofNsigmaBachelor; float tpcNsigmaPion, tofNsigmaPion; float tpcNsigmaProton, tofNsigmaProton; + float trackPt = candidate.pt(); if (candidate.sign() < 0) { // Xi- candidates tpcNsigmaBachelor = candidate.daughterTPCNSigmaBachPi(); @@ -643,9 +654,9 @@ struct Xi1530Analysisqa { PidSelectionParam pionParams = {cMaxtpcnSigmaPion, cMaxtofnSigmaPion, cByPassTOFPion, nsigmaCutCombinedPion}; PidSelectionParam protonParams = {cMaxtpcnSigmaProton, cMaxtofnSigmaProton, cByPassTOFProton, nsigmaCutCombinedProton}; - lConsistentWithXi = pidSelector(tpcNsigmaBachelor, tofNsigmaBachelor, bachelorParams, tofAtHighPt); - lConsistentWithPion = pidSelector(tpcNsigmaPion, tofNsigmaPion, pionParams, tofAtHighPt); - lConsistentWithProton = pidSelector(tpcNsigmaProton, tofNsigmaProton, protonParams, tofAtHighPt); + lConsistentWithXi = pidSelector(tpcNsigmaBachelor, tofNsigmaBachelor, bachelorParams, tofAtHighPt, trackPt); + lConsistentWithPion = pidSelector(tpcNsigmaPion, tofNsigmaPion, pionParams, tofAtHighPt, trackPt); + lConsistentWithProton = pidSelector(tpcNsigmaProton, tofNsigmaProton, protonParams, tofAtHighPt, trackPt); lConsistentWithLambda = lConsistentWithProton && lConsistentWithPion; @@ -657,7 +668,7 @@ struct Xi1530Analysisqa { { auto multiplicity = collision.cent(); - if (additionalQAeventPlots) { + { if constexpr (!IsMix) { histos.fill(HIST("QAevent/hVertexZSameE"), collision.posZ()); histos.fill(HIST("QAevent/hMultiplicityPercentSameE"), collision.cent()); @@ -671,11 +682,11 @@ struct Xi1530Analysisqa { } } - TLorentzVector lDecayDaughter1, lDecayDaughter2, lResonance; // It will be replaced to use RecoDecay (In fixing...) + LorentzVectorPtEtaPhiMass lDecayDaughter1, lDecayDaughter2, lResonance; // It will be replaced to use RecoDecay (In fixing...) for (const auto& [trk1, trk2] : combinations(CombinationsFullIndexPolicy(dTracks1, dTracks2))) { - if (additionalQAeventPlots) { + { if constexpr (!IsMix) { histos.fill(HIST("TestME/hPairsCounterSameE"), 1.0); } else { @@ -873,8 +884,8 @@ struct Xi1530Analysisqa { } } - lDecayDaughter1.SetPtEtaPhiM(trk1ptPi, trk1.eta(), trk1.phi(), massPi); - lDecayDaughter2.SetPtEtaPhiM(trk2ptXi, trk2.eta(), trk2.phi(), trk2.mXi()); + lDecayDaughter1 = LorentzVectorPtEtaPhiMass(trk1ptPi, trk1.eta(), trk1.phi(), massPi); + lDecayDaughter2 = LorentzVectorPtEtaPhiMass(trk2ptXi, trk2.eta(), trk2.phi(), trk2.mXi()); lResonance = lDecayDaughter1 + lDecayDaughter2; auto lResonancePt = lResonance.Pt(); @@ -1039,8 +1050,8 @@ struct Xi1530Analysisqa { void processData(aod::ResoCollision const& resoCollision, aod::ResoTracks const& resoTracks, aod::ResoCascades const& cascTracks) { - if (additionalQAeventPlots) - histos.fill(HIST("QAevent/hEvtCounterSameE"), 1.0); + + histos.fill(HIST("QAevent/hEvtCounterSameE"), 1.0); fillHistograms(resoCollision, resoTracks, cascTracks); } @@ -1106,12 +1117,35 @@ struct Xi1530Analysisqa { void processDataMicro(aod::ResoCollision const& resoCollision, aod::ResoMicroTracks const& resomicrotracks, aod::ResoCascades const& cascTracks) { - if (additionalQAeventPlots) - histos.fill(HIST("QAevent/hEvtCounterSameE"), 1.0); + + histos.fill(HIST("QAevent/hEvtCounterSameE"), 1.0); fillHistograms(resoCollision, resomicrotracks, cascTracks); } using BinningTypeVtxZT0M = ColumnBinningPolicy; + Preslice perRColdf = aod::resodaughter::resoCollisionDFId; + Preslice perRColdfCasc = aod::resodaughter::resoCollisionDFId; + + void processMEDF(aod::ResoCollisionDFs const& resoCollisions, aod::ResoTrackDFs const& resotracks, aod::ResoCascadeDFs const& cascTracks) + { + + auto tracksTuple = std::make_tuple(resotracks, cascTracks); + + BinningTypeVtxZT0M colBinning{{cfgVtxBins, cfgMultBins}, true}; + Pair pairs{colBinning, nEvtMixing, -1, resoCollisions, tracksTuple, &cache}; + + for (const auto& [collision1, tracks1, collision2, tracks2] : pairs) { + + histos.fill(HIST("QAevent/hEvtCounterMixedE"), 1.0); + fillHistograms(collision1, tracks1, tracks2); + } + } + void processDataDF(aod::ResoCollisionDF const& resoCollision, aod::ResoTrackDFs const& resotracks, aod::ResoCascadeDFs const& cascTracks) + { + + fillHistograms(resoCollision, resotracks, cascTracks); + } + void processMEMicro(aod::ResoCollisions const& resoCollisions, aod::ResoMicroTracks const& resomicrotracks, aod::ResoCascades const& cascTracks) { auto tracksTuple = std::make_tuple(resomicrotracks, cascTracks); @@ -1120,8 +1154,8 @@ struct Xi1530Analysisqa { Pair pairs{colBinning, nEvtMixing, -1, resoCollisions, tracksTuple, &cache}; for (const auto& [collision1, tracks1, collision2, tracks2] : pairs) { - if (additionalQAeventPlots) - histos.fill(HIST("QAevent/hEvtCounterMixedE"), 1.0); + + histos.fill(HIST("QAevent/hEvtCounterMixedE"), 1.0); fillHistograms(collision1, tracks1, tracks2); } } @@ -1129,8 +1163,10 @@ struct Xi1530Analysisqa { PROCESS_SWITCH(Xi1530Analysisqa, processData, "Process Event for Data", false); PROCESS_SWITCH(Xi1530Analysisqa, processMC, "Process Event for MC (Reconstructed)", false); PROCESS_SWITCH(Xi1530Analysisqa, processMCTrue, "Process Event for MC (Generated)", false); - PROCESS_SWITCH(Xi1530Analysisqa, processDataMicro, "Process Event for Data (MicroTrack for first pion)", true); - PROCESS_SWITCH(Xi1530Analysisqa, processMEMicro, "Process EventMixing", true); + PROCESS_SWITCH(Xi1530Analysisqa, processDataMicro, "Process Event for Data (MicroTrack)", false); + PROCESS_SWITCH(Xi1530Analysisqa, processMEMicro, "Process EventMixing (MicroTrack) ", false); + PROCESS_SWITCH(Xi1530Analysisqa, processMEDF, "Process EventMixing (DF) ", true); + PROCESS_SWITCH(Xi1530Analysisqa, processDataDF, "Process Event for Data (DF) ", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 59e5dd001a8f28a82264822bff7ae371f6e1de3b Mon Sep 17 00:00:00 2001 From: sangwoo <141385263+sangwoo184@users.noreply.github.com> Date: Thu, 24 Apr 2025 16:07:47 +0900 Subject: [PATCH 1079/1650] [PWGLF] remove useless configurations and tables and change configuration names (#10918) Co-authored-by: sangwoo --- PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx | 35 +++++++++----------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx index 9bc3c7d40f9..4602483e636 100644 --- a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx +++ b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx @@ -61,7 +61,6 @@ #include "CCDB/BasicCCDBManager.h" // from phi -#include "PWGLF/DataModel/EPCalibrationTables.h" #include "Common/DataModel/PIDResponseITS.h" using namespace o2; @@ -85,8 +84,8 @@ struct F0980pbpbanalysis { Configurable cfgCutVertex{"cfgCutVertex", 10.0, "PV selection"}; Configurable cfgQvecSel{"cfgQvecSel", true, "Reject events when no QVector"}; Configurable cfgOccupancySel{"cfgOccupancySel", false, "Occupancy selection"}; - Configurable cfgMaxOccupancy{"cfgMaxOccupancy", 999999, "maximum occupancy of tracks in neighbouring collisions in a given time range"}; - Configurable cfgMinOccupancy{"cfgMinOccupancy", -100, "maximum occupancy of tracks in neighbouring collisions in a given time range"}; + Configurable cfgOccupancyMax{"cfgOccupancyMax", 999999, "maximum occupancy of tracks in neighbouring collisions in a given time range"}; + Configurable cfgOccupancyMin{"cfgOccupancyMin", -100, "minimum occupancy of tracks in neighbouring collisions in a given time range"}; Configurable cfgNCollinTR{"cfgNCollinTR", false, "Additional selection for the number of coll in time range"}; Configurable cfgPVSel{"cfgPVSel", false, "Additional PV selection flag for syst"}; Configurable cfgPV{"cfgPV", 8.0, "Additional PV selection range for syst"}; @@ -101,8 +100,8 @@ struct F0980pbpbanalysis { Configurable cfgTPCcluster{"cfgTPCcluster", 70, "Number of TPC cluster"}; Configurable cfgRatioTPCRowsOverFindableCls{"cfgRatioTPCRowsOverFindableCls", 0.8, "TPC Crossed Rows to Findable Clusters"}; - Configurable cfgMinRap{"cfgMinRap", -0.5, "Minimum rapidity for pair"}; - Configurable cfgMaxRap{"cfgMaxRap", 0.5, "Maximum rapidity for pair"}; + Configurable cfgRapMin{"cfgRapMin", -0.5, "Minimum rapidity for pair"}; + Configurable cfgRapMax{"cfgRapMax", 0.5, "Maximum rapidity for pair"}; Configurable cfgPrimaryTrack{"cfgPrimaryTrack", true, "Primary track selection"}; Configurable cfgGlobalWoDCATrack{"cfgGlobalWoDCATrack", true, "Global track selection without DCA"}; @@ -115,24 +114,23 @@ struct F0980pbpbanalysis { Configurable cfgSelectPID{"cfgSelectPID", 0, "PID selection type"}; Configurable cfgSelectPtl{"cfgSelectPtl", 0, "Particle selection type"}; - Configurable cfgnMods{"cfgnMods", 1, "The number of modulations of interest starting from 2"}; + Configurable cfgNMods{"cfgNMods", 1, "The number of modulations of interest starting from 2"}; Configurable cfgNQvec{"cfgNQvec", 7, "The number of total Qvectors for looping over the task"}; Configurable cfgQvecDetName{"cfgQvecDetName", "FT0C", "The name of detector to be analyzed"}; Configurable cfgQvecRefAName{"cfgQvecRefAName", "TPCpos", "The name of detector for reference A"}; Configurable cfgQvecRefBName{"cfgQvecRefBName", "TPCneg", "The name of detector for reference B"}; - Configurable cfgRotBkg{"cfgRotBkg", true, "flag to construct rotational backgrounds"}; - Configurable cfgNRotBkg{"cfgNRotBkg", 10, "the number of rotational backgrounds"}; + Configurable cfgRotBkgSel{"cfgRotBkgSel", true, "flag to construct rotational backgrounds"}; + Configurable cfgRotBkgNum{"cfgRotBkgNum", 10, "the number of rotational backgrounds"}; // for phi test Configurable cfgTPCFinableClsSel{"cfgTPCFinableClsSel", true, "TPC Crossed Rows to Findable Clusters selection flag"}; Configurable cfgITSClsSel{"cfgITSClsSel", false, "ITS cluster selection flag"}; Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; - Configurable cfgpTDepPID{"cfgpTDepPID", false, "pT dependent PID"}; - Configurable cfgBetaCutSel{"cfgBetaCutSel", false, "TOF beta cut selection flag"}; - Configurable cfgCutTOFBeta{"cfgCutTOFBeta", 0.0, "cut TOF beta"}; - Configurable isDeepAngle{"isDeepAngle", true, "Deep Angle cut"}; + Configurable cfgTOFBetaSel{"cfgTOFBetaSel", false, "TOF beta cut selection flag"}; + Configurable cfgTOFBetaCut{"cfgTOFBetaCut", 0.0, "cut TOF beta"}; + Configurable cfgDeepAngleSel{"cfgDeepAngleSel", true, "Deep Angle cut"}; Configurable cfgDeepAngle{"cfgDeepAngle", 0.04, "Deep Angle cut value"}; ConfigurableAxis massAxis{"massAxis", {400, 0.2, 2.2}, "Invariant mass axis"}; @@ -186,8 +184,7 @@ struct F0980pbpbanalysis { // Filter PIDcutFilter = nabs(aod::pidtpc::tpcNSigmaKa) < cMaxTPCnSigmaPion; // Filter PIDcutFilter = nabs(aod::pidTPCFullKa::tpcNSigmaKa) < cMaxTPCnSigmaPion; - using EventCandidates = soa::Filtered>; - // aod::EPCalibrationTables 추가됨 + using EventCandidates = soa::Filtered>; using TrackCandidates = soa::Filtered>; // aod::pidTOFbeta 추가됨 @@ -239,7 +236,7 @@ struct F0980pbpbanalysis { if (cfgQvecSel && (collision.qvecAmp()[detId] < 1e-4 || collision.qvecAmp()[refAId] < 1e-4 || collision.qvecAmp()[refBId] < 1e-4)) { return 0; } - if (cfgOccupancySel && (collision.trackOccupancyInTimeRange() > cfgMaxOccupancy || collision.trackOccupancyInTimeRange() < cfgMinOccupancy)) { + if (cfgOccupancySel && (collision.trackOccupancyInTimeRange() > cfgOccupancyMax || collision.trackOccupancyInTimeRange() < cfgOccupancyMin)) { return 0; } if (cfgNCollinTR && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { @@ -349,7 +346,7 @@ struct F0980pbpbanalysis { p1 = track1.p(); p2 = track2.p(); angle = std::acos((pt1 * pt2 + pz1 * pz2) / (p1 * p2)); - if (isDeepAngle && angle < cfgDeepAngle) { + if (cfgDeepAngleSel && angle < cfgDeepAngle) { return 0; } return 1; @@ -434,7 +431,7 @@ struct F0980pbpbanalysis { pion2.SetXYZM(trk2.px(), trk2.py(), trk2.pz(), massPtl); reco = pion1 + pion2; - if (reco.Rapidity() > cfgMaxRap || reco.Rapidity() < cfgMinRap) { + if (reco.Rapidity() > cfgRapMax || reco.Rapidity() < cfgRapMin) { continue; } @@ -448,8 +445,8 @@ struct F0980pbpbanalysis { histos.fill(HIST("hInvMass_f0980_LSmm_EPA"), reco.M(), reco.Pt(), centrality, relPhi); } - if (cfgRotBkg && trk1.sign() * trk2.sign() < 0) { - for (int nr = 0; nr < cfgNRotBkg; nr++) { + if (cfgRotBkgSel && trk1.sign() * trk2.sign() < 0) { + for (int nr = 0; nr < cfgRotBkgNum; nr++) { auto randomPhi = rn->Uniform(o2::constants::math::PI * 5.0 / 6.0, o2::constants::math::PI * 7.0 / 6.0); randomPhi += pion2.Phi(); pion2Rot.SetXYZM(pion2.Pt() * std::cos(randomPhi), pion2.Pt() * std::sin(randomPhi), trk2.pz(), massPtl); From 7bd6dba7e63e1ec994887f59ec325444246ed766 Mon Sep 17 00:00:00 2001 From: Zhenjun Xiong <108917659+zjxiongOvO@users.noreply.github.com> Date: Thu, 24 Apr 2025 10:34:24 +0200 Subject: [PATCH 1080/1650] [PWGDQ,PWGEM] Remove unused code (#10892) --- PWGDQ/Core/VarManager.cxx | 85 ++------------------ PWGDQ/Core/VarManager.h | 34 +------- PWGDQ/TableProducer/tableMaker.cxx | 8 -- PWGDQ/TableProducer/tableMaker_withAssoc.cxx | 6 -- PWGDQ/Tasks/dqEfficiency_withAssoc.cxx | 26 +++--- PWGDQ/Tasks/dqFlow.cxx | 27 ++++--- PWGDQ/Tasks/tableReader.cxx | 5 -- PWGDQ/Tasks/tableReader_withAssoc.cxx | 22 +++-- PWGEM/Dilepton/Tasks/tableReaderBarrel.cxx | 5 -- 9 files changed, 44 insertions(+), 174 deletions(-) diff --git a/PWGDQ/Core/VarManager.cxx b/PWGDQ/Core/VarManager.cxx index f9a71a28c9b..0467abfd240 100644 --- a/PWGDQ/Core/VarManager.cxx +++ b/PWGDQ/Core/VarManager.cxx @@ -28,9 +28,6 @@ bool VarManager::fgUsedVars[VarManager::kNVars] = {false}; bool VarManager::fgUsedKF = false; float VarManager::fgMagField = 0.5; float VarManager::fgValues[VarManager::kNVars] = {0.0f}; -std::map VarManager::fgRunMap; -TString VarManager::fgRunStr = ""; -std::vector VarManager::fgRunList = {0}; float VarManager::fgCenterOfMassEnergy = 13600; // GeV float VarManager::fgMassofCollidingParticle = 9.382720; // GeV float VarManager::fgTPCInterSectorBoundary = 1.0; // cm @@ -110,69 +107,6 @@ void VarManager::ResetValues(int startValue, int endValue, float* values) } } -//__________________________________________________________________ -void VarManager::SetRunNumbers(int n, int* runs) -{ - // - // maps the list of runs such that one can plot the list of runs nicely in a histogram axis - // - for (int i = 0; i < n; ++i) { - fgRunMap[runs[i]] = i + 1; - fgRunStr += Form("%d;", runs[i]); - } -} - -//__________________________________________________________________ -void VarManager::SetRunNumbers(std::vector runs) -{ - // - // maps the list of runs such that one can plot the list of runs nicely in a histogram axis - // - int i = 0; - for (auto run = runs.begin(); run != runs.end(); run++, i++) { - fgRunMap[*run] = i + 1; - fgRunStr += Form("%d;", *run); - } - fgRunList = runs; -} - -//__________________________________________________________________ -void VarManager::SetDummyRunlist(int InitRunnumber) -{ - // - // runlist for the different periods - fgRunList.clear(); - fgRunList.push_back(InitRunnumber); - fgRunList.push_back(InitRunnumber + 100); -} - -//__________________________________________________________________ -int VarManager::GetDummyFirst() -{ - // - // Get the fist index of the vector of run numbers - // - return fgRunList[0]; -} -//__________________________________________________________________ -int VarManager::GetDummyLast() -{ - // - // Get the last index of the vector of run numbers - // - return fgRunList[fgRunList.size() - 1]; -} -//_________________________________________________________________ -float VarManager::GetRunIndex(double Runnumber) -{ - // - // Get the index of RunNumber in it's runlist - // - int runNumber = static_cast(Runnumber); - auto runIndex = std::find(fgRunList.begin(), fgRunList.end(), runNumber); - float index = std::distance(fgRunList.begin(), runIndex); - return index; -} //__________________________________________________________________ void VarManager::SetCollisionSystem(TString system, float energy) { @@ -191,15 +125,12 @@ void VarManager::SetCollisionSystem(TString system, float energy) } //__________________________________________________________________ -void VarManager::FillEventDerived(float* values) -{ - // - // Fill event-wise derived quantities (these are all quantities which can be computed just based on the values already filled in the FillEvent() function) - // - if (fgUsedVars[kRunId]) { - values[kRunId] = (fgRunMap.size() > 0 ? fgRunMap[static_cast(values[kRunNo])] : 0); - } -} +// void VarManager::FillEventDerived(float* values) +// { +// // +// // Fill event-wise derived quantities (these are all quantities which can be computed just based on the values already filled in the FillEvent() function) +// // +// } //__________________________________________________________________ void VarManager::FillTrackDerived(float* values) @@ -230,8 +161,6 @@ void VarManager::SetDefaultVarNames() fgVariableNames[kRunNo] = "Run number"; fgVariableUnits[kRunNo] = ""; - fgVariableNames[kRunId] = "Run number"; - fgVariableUnits[kRunId] = ""; fgVariableNames[kBC] = "Bunch crossing"; fgVariableUnits[kBC] = ""; fgVariableNames[kTimeFromSOR] = "time since SOR"; @@ -1095,8 +1024,6 @@ void VarManager::SetDefaultVarNames() // Set the variables short names map. This is needed for dynamic configuration via JSON files fgVarNamesMap["kNothing"] = kNothing; fgVarNamesMap["kRunNo"] = kRunNo; - fgVarNamesMap["kRunId"] = kRunId; - fgVarNamesMap["kRunIndex"] = kRunIndex; fgVarNamesMap["kNRunWiseVariables"] = kNRunWiseVariables; fgVarNamesMap["kTimestamp"] = kTimestamp; fgVarNamesMap["kTimeFromSOR"] = kTimeFromSOR; diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 5a193eb0415..c7f2cd57cfa 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -175,8 +175,6 @@ class VarManager : public TObject kNothing = -1, // Run wise variables kRunNo = 0, - kRunId, - kRunIndex, kNRunWiseVariables, // Event wise variables @@ -898,29 +896,6 @@ class VarManager : public TObject return false; } - static void SetRunNumbers(int n, int* runs); - static void SetRunNumbers(std::vector runs); - static float GetRunIndex(double); - static void SetDummyRunlist(int InitRunnumber); - static int GetDummyFirst(); - static int GetDummyLast(); - static int GetDummyNRuns() - { - if (fgRunMap.size() == 0) { - return 101; - } else { - return fgRunMap.size(); - } - } - static int GetNRuns() - { - return fgRunMap.size(); - } - static TString GetRunStr() - { - return fgRunStr; - } - // Setup the collision system static void SetCollisionSystem(TString system, float energy); @@ -1159,9 +1134,6 @@ class VarManager : public TObject static void SetVariableDependencies(); // toggle those variables on which other used variables might depend static float fgMagField; - static std::map fgRunMap; // map of runs to be used in histogram axes - static TString fgRunStr; // semi-colon separated list of runs, to be used for histogram axis labels - static std::vector fgRunList; // vector of runs, to be used for histogram axis static float fgCenterOfMassEnergy; // collision energy static float fgMassofCollidingParticle; // mass of the colliding particle static float fgTPCInterSectorBoundary; // TPC inter-sector border size at the TPC outer radius, in cm @@ -1172,7 +1144,7 @@ class VarManager : public TObject static uint64_t fgSOR; // Timestamp for start of run static uint64_t fgEOR; // Timestamp for end of run - static void FillEventDerived(float* values = nullptr); + // static void FillEventDerived(float* values = nullptr); static void FillTrackDerived(float* values = nullptr); template static auto getRotatedCovMatrixXX(const T& matrix, U phi, V theta); @@ -1442,7 +1414,6 @@ void VarManager::FillBC(T const& bc, float* values) values[kBCOrbit] = bc.globalBC() % o2::constants::lhc::LHCMaxBunches; values[kTimestamp] = bc.timestamp(); values[kTimeFromSOR] = (fgSOR > 0 ? (bc.timestamp() - fgSOR) / 60000. : -1.0); - values[kRunIndex] = GetRunIndex(bc.runNumber()); } template @@ -1611,7 +1582,6 @@ void VarManager::FillEvent(T const& event, float* values) if constexpr ((fillMap & ReducedEvent) > 0) { values[kRunNo] = event.runNumber(); - values[kRunIndex] = GetRunIndex(event.runNumber()); values[kVtxX] = event.posX(); values[kVtxY] = event.posY(); values[kVtxZ] = event.posZ(); @@ -1903,7 +1873,7 @@ void VarManager::FillEvent(T const& event, float* values) FillZDC(event, values); } - FillEventDerived(values); + // FillEventDerived(values); } template diff --git a/PWGDQ/TableProducer/tableMaker.cxx b/PWGDQ/TableProducer/tableMaker.cxx index 74545704593..bde53864977 100644 --- a/PWGDQ/TableProducer/tableMaker.cxx +++ b/PWGDQ/TableProducer/tableMaker.cxx @@ -206,8 +206,6 @@ struct TableMaker { Configurable fConfigComputeTPCpostCalib{"cfgTPCpostCalib", false, "If true, compute TPC post-calibrated n-sigmas(electrons, pions, protons)"}; Configurable fConfigComputeTPCpostCalibKaon{"cfgTPCpostCalibKaon", false, "If true, compute TPC post-calibrated n-sigmas for kaons"}; Configurable fConfigIsOnlyforMaps{"cfgIsforMaps", false, "If true, run for postcalibration maps only"}; - Configurable fConfigDummyRunlist{"cfgDummyRunlist", false, "If true, use dummy runlist"}; - Configurable fConfigInitRunNumber{"cfgInitRunNumber", 543215, "Initial run number used in run by run checks"}; Configurable fPropMuon{"cfgPropMuon", false, "Propgate muon tracks through absorber"}; Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; @@ -334,10 +332,6 @@ struct TableMaker { } } - if (fConfigDummyRunlist) { - VarManager::SetDummyRunlist(fConfigInitRunNumber); - } - DefineHistograms(histClasses); // define all histograms VarManager::SetUseVars(fHistMan->GetUsedVars()); // provide the list of required variables so that VarManager knows what to fill fOutputList.setObject(fHistMan->GetMainHistogramList()); @@ -441,7 +435,6 @@ struct TableMaker { VarManager::fgValues[VarManager::kRunNo] = bc.runNumber(); VarManager::fgValues[VarManager::kBC] = bc.globalBC(); VarManager::fgValues[VarManager::kTimestamp] = bc.timestamp(); - VarManager::fgValues[VarManager::kRunIndex] = VarManager::GetRunIndex(bc.runNumber()); VarManager::FillEvent(collision); // extract event information and place it in the fValues array if (fDoDetailedQA) { fHistMan->FillHistClass("Event_BeforeCuts", VarManager::fgValues); @@ -915,7 +908,6 @@ struct TableMaker { VarManager::fgValues[VarManager::kRunNo] = bc.runNumber(); VarManager::fgValues[VarManager::kBC] = bc.globalBC(); VarManager::fgValues[VarManager::kTimestamp] = bc.timestamp(); - VarManager::fgValues[VarManager::kRunIndex] = VarManager::GetRunIndex(bc.runNumber()); VarManager::FillEvent(collision); // extract event information and place it in the fValues array if (fDoDetailedQA) { fHistMan->FillHistClass("Event_BeforeCuts", VarManager::fgValues); diff --git a/PWGDQ/TableProducer/tableMaker_withAssoc.cxx b/PWGDQ/TableProducer/tableMaker_withAssoc.cxx index 7adb6fbf23c..ce6dbeb11ec 100644 --- a/PWGDQ/TableProducer/tableMaker_withAssoc.cxx +++ b/PWGDQ/TableProducer/tableMaker_withAssoc.cxx @@ -233,8 +233,6 @@ struct TableMaker { Configurable fConfigComputeTPCpostCalibKaon{"cfgTPCpostCalibKaon", false, "If true, compute TPC post-calibrated n-sigmas for kaons"}; Configurable fConfigIsOnlyforMaps{"cfgIsforMaps", false, "If true, run for postcalibration maps only"}; Configurable fConfigSaveElectronSample{"cfgSaveElectronSample", false, "If true, only save electron sample"}; - Configurable fConfigDummyRunlist{"cfgDummyRunlist", false, "If true, use dummy runlist"}; - Configurable fConfigInitRunNumber{"cfgInitRunNumber", 543215, "Initial run number used in run by run checks"}; } fConfigPostCalibTPC; struct : ConfigurableGroup { @@ -397,10 +395,6 @@ struct TableMaker { } } - if (fConfigPostCalibTPC.fConfigDummyRunlist) { - VarManager::SetDummyRunlist(fConfigPostCalibTPC.fConfigInitRunNumber); - } - DefineHistograms(histClasses); // define all histograms // Additional histogram via the JSON configurable TString addHistsStr = fConfigHistOutput.fConfigAddJSONHistograms.value; diff --git a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx index 99f508a8b1e..a6d69a121d1 100644 --- a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx +++ b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -394,8 +395,6 @@ struct AnalysisTrackSelection { Configurable fConfigNoLaterThan{"ccdb-no-later-than", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; Configurable fConfigComputeTPCpostCalib{"cfgTPCpostCalib", false, "If true, compute TPC post-calibrated n-sigmas"}; Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; - Configurable fConfigDummyRunlist{"cfgDummyRunlist", false, "If true, use dummy runlist"}; - Configurable fConfigInitRunNumber{"cfgInitRunNumber", 543215, "Initial run number used in run by run checks"}; Configurable fConfigMCSignals{"cfgTrackMCSignals", "", "Comma separated list of MC signals"}; Configurable fConfigMCSignalsJSON{"cfgTrackMCsignalsJSON", "", "Additional list of MC signals via JSON"}; @@ -433,7 +432,7 @@ struct AnalysisTrackSelection { if (addTrackCutsStr != "") { std::vector addTrackCuts = dqcuts::GetCutsFromJSON(addTrackCutsStr.Data()); for (auto& t : addTrackCuts) { - fTrackCuts.push_back((AnalysisCompositeCut*)t); + fTrackCuts.push_back(reinterpret_cast(t)); } } VarManager::SetUseVars(AnalysisCut::fgUsedVars); // provide the list of required variables so that VarManager knows what to fill @@ -493,9 +492,6 @@ struct AnalysisTrackSelection { fOutputList.setObject(fHistMan->GetMainHistogramList()); } - if (fConfigDummyRunlist) { - VarManager::SetDummyRunlist(fConfigInitRunNumber); - } if (fConfigComputeTPCpostCalib) { fCCDB->setURL(fConfigCcdbUrl.value); fCCDB->setCaching(true); @@ -760,7 +756,7 @@ struct AnalysisMuonSelection { if (addCutsStr != "") { std::vector addCuts = dqcuts::GetCutsFromJSON(addCutsStr.Data()); for (auto& t : addCuts) { - fMuonCuts.push_back((AnalysisCompositeCut*)t); + fMuonCuts.push_back(reinterpret_cast(t)); } } VarManager::SetUseVars(AnalysisCut::fgUsedVars); // provide the list of required variables so that VarManager knows what to fill @@ -2203,7 +2199,7 @@ struct AnalysisAsymmetricPairing { if (addPairCutsStr != "") { std::vector addPairCuts = dqcuts::GetCutsFromJSON(addPairCutsStr.Data()); for (auto& t : addPairCuts) { - fPairCuts.push_back((AnalysisCompositeCut*)t); + fPairCuts.push_back(reinterpret_cast(t)); cutNamesStr += Form(",%s", t->GetName()); } } @@ -3290,7 +3286,7 @@ struct AnalysisDileptonTrack { // loop over all the upstream cuts and make a bit mask for the track cuts specified in this task for (int icut = 0; icut < cfgTrackSelection_objArrayTrackCuts->GetEntries(); icut++) { if (cfgDileptonTrack_objArrayTrackCuts->FindObject(cfgTrackSelection_objArrayTrackCuts->At(icut)->GetName())) { - fTrackCutBitMap |= (uint32_t(1) << icut); + fTrackCutBitMap |= (static_cast(1) << icut); } } // finally, store the total number of upstream tasks, for easy access @@ -3358,7 +3354,7 @@ struct AnalysisDileptonTrack { for (int iCutTrack = 0; iCutTrack < fNCuts; iCutTrack++) { // here we check that this track cut is one of those required to associate with the dileptons - if (!(fTrackCutBitMap & (uint32_t(1) << iCutTrack))) { + if (!(fTrackCutBitMap & (static_cast(1) << iCutTrack))) { continue; } @@ -3593,13 +3589,13 @@ struct AnalysisDileptonTrack { // loop over specified track cuts (the tracks to be combined with the dileptons) for (int iTrackCut = 0; iTrackCut < fNCuts; iTrackCut++) { - if (!(trackSelection & (uint32_t(1) << iTrackCut))) { + if (!(trackSelection & (static_cast(1) << iTrackCut))) { continue; } fHistMan->FillHistClass(Form("DileptonTrack_%s_%s", fTrackCutNames[icut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); for (uint32_t isig = 0; isig < fRecMCSignals.size(); isig++) { - if (mcDecision & (uint32_t(1) << isig)) { + if (mcDecision & (static_cast(1) << isig)) { fHistMan->FillHistClass(Form("DileptonTrackMCMatched_%s_%s_%s", fTrackCutNames[icut].Data(), fTrackCutNames[iTrackCut].Data(), fRecMCSignals[isig]->GetName()), fValuesHadron); } } @@ -3609,7 +3605,7 @@ struct AnalysisDileptonTrack { if (dilepton.commonFilterMap_bit(fCommonTrackCutMap[iCommonCut])) { fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); for (uint32_t isig = 0; isig < fRecMCSignals.size(); isig++) { - if (mcDecision & (uint32_t(1) << isig)) { + if (mcDecision & (static_cast(1) << isig)) { fHistMan->FillHistClass(Form("DileptonTrackMCMatched_%s_%s_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fTrackCutNames[iTrackCut].Data(), fRecMCSignals[isig]->GetName()), fValuesHadron); } } @@ -3619,7 +3615,7 @@ struct AnalysisDileptonTrack { if (dilepton.pairFilterMap_bit(iPairCut)) { fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s", fTrackCutNames[icut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); for (uint32_t isig = 0; isig < fRecMCSignals.size(); isig++) { - if (mcDecision & (uint32_t(1) << isig)) { + if (mcDecision & (static_cast(1) << isig)) { fHistMan->FillHistClass(Form("DileptonTrackMCMatched_%s_%s_%s_%s", fTrackCutNames[icut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data(), fRecMCSignals[isig]->GetName()), fValuesHadron); } } @@ -3627,7 +3623,7 @@ struct AnalysisDileptonTrack { if (dilepton.commonFilterMap_bit(fCommonTrackCutMap[iCommonCut])) { fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); for (uint32_t isig = 0; isig < fRecMCSignals.size(); isig++) { - if (mcDecision & (uint32_t(1) << isig)) { + if (mcDecision & (static_cast(1) << isig)) { fHistMan->FillHistClass(Form("DileptonTrackMCMatched_%s_%s_%s_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data(), fRecMCSignals[isig]->GetName()), fValuesHadron); } } diff --git a/PWGDQ/Tasks/dqFlow.cxx b/PWGDQ/Tasks/dqFlow.cxx index d9210685a2e..ad500439924 100644 --- a/PWGDQ/Tasks/dqFlow.cxx +++ b/PWGDQ/Tasks/dqFlow.cxx @@ -16,11 +16,13 @@ /// o2-analysis-timestamp --aod-file AO2D.root -b | o2-analysis-event-selection -b | o2-analysis-multiplicity-table -b | o2-analysis-centrality-table -b | o2-analysis-fdd-converter -b | o2-analysis-trackselection -b | o2-analysis-trackextension -b | o2-analysis-pid-tpc-full -b | o2-analysis-pid-tof-full -b | o2-analysis-pid-tof-base -b | o2-analysis-pid-tof-beta -b | o2-analysis-dq-flow -b /// tested (June 2, 2022) on AO2D.root files from train production 242 +#include +#include +#include +#include #include #include #include -#include -#include #include #include "CCDB/BasicCCDBManager.h" #include "Framework/runDataProcessing.h" @@ -69,15 +71,18 @@ using MyEventsWithCentRun3 = soa::Join; using MyEventsWithCentQvectRun3 = soa::Join; -using MyBarrelTracks = soa::Join; -using MyBarrelTracksWithCov = soa::Join; +// using MyBarrelTracks = soa::Join; +// using MyBarrelTracksWithCov = soa::Joini; + +using MyBarrelTracks = soa::Join; +using MyBarrelTracksWithCov = soa::Join; using MyTracks = soa::Filtered>; using MyMuons = aod::FwdTracks; using MyMuonsWithCov = soa::Join; diff --git a/PWGDQ/Tasks/tableReader.cxx b/PWGDQ/Tasks/tableReader.cxx index 2249aba8163..eb5d6dae897 100644 --- a/PWGDQ/Tasks/tableReader.cxx +++ b/PWGDQ/Tasks/tableReader.cxx @@ -326,8 +326,6 @@ struct AnalysisTrackSelection { Configurable fConfigNoLaterThan{"ccdb-no-later-than", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; Configurable fConfigComputeTPCpostCalib{"cfgTPCpostCalib", false, "If true, compute TPC post-calibrated n-sigmas"}; Configurable fConfigRunPeriods{"cfgRunPeriods", "LHC22f", "run periods for used data"}; - Configurable fConfigDummyRunlist{"cfgDummyRunlist", false, "If true, use dummy runlist"}; - Configurable fConfigInitRunNumber{"cfgInitRunNumber", 543215, "Initial run number used in run by run checks"}; Service fCCDB; @@ -370,9 +368,6 @@ struct AnalysisTrackSelection { VarManager::SetUseVars(fHistMan->GetUsedVars()); // provide the list of required variables so that VarManager knows what to fill fOutputList.setObject(fHistMan->GetMainHistogramList()); } - if (fConfigDummyRunlist) { - VarManager::SetDummyRunlist(fConfigInitRunNumber); - } if (fConfigComputeTPCpostCalib) { // CCDB configuration fCCDB->setURL(fConfigCcdbUrl.value); diff --git a/PWGDQ/Tasks/tableReader_withAssoc.cxx b/PWGDQ/Tasks/tableReader_withAssoc.cxx index 5f7912211b2..7d19373fdb1 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.cxx +++ b/PWGDQ/Tasks/tableReader_withAssoc.cxx @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -486,8 +487,6 @@ struct AnalysisTrackSelection { Configurable fConfigComputeTPCpostCalib{"cfgTPCpostCalib", false, "If true, compute TPC post-calibrated n-sigmas"}; Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; - Configurable fConfigDummyRunlist{"cfgDummyRunlist", false, "If true, use dummy runlist"}; - Configurable fConfigInitRunNumber{"cfgInitRunNumber", 543215, "Initial run number used in run by run checks"}; // Track related options Configurable fPropTrack{"cfgPropTrack", true, "Propgate tracks to associated collision to recalculate DCA and momentum vector"}; @@ -522,7 +521,7 @@ struct AnalysisTrackSelection { if (addTrackCutsStr != "") { std::vector addTrackCuts = dqcuts::GetCutsFromJSON(addTrackCutsStr.Data()); for (auto& t : addTrackCuts) { - fTrackCuts.push_back((AnalysisCompositeCut*)t); + fTrackCuts.push_back(reinterpret_cast(t)); } } @@ -547,9 +546,6 @@ struct AnalysisTrackSelection { VarManager::SetUseVars(fHistMan->GetUsedVars()); // provide the list of required variables so that VarManager knows what to fill fOutputList.setObject(fHistMan->GetMainHistogramList()); } - if (fConfigDummyRunlist) { - VarManager::SetDummyRunlist(fConfigInitRunNumber); - } fCCDB->setURL(fConfigCcdbUrl.value); fCCDB->setCaching(true); @@ -770,7 +766,7 @@ struct AnalysisMuonSelection { if (addCutsStr != "") { std::vector addCuts = dqcuts::GetCutsFromJSON(addCutsStr.Data()); for (auto& t : addCuts) { - fMuonCuts.push_back((AnalysisCompositeCut*)t); + fMuonCuts.push_back(reinterpret_cast(t)); } } @@ -2144,7 +2140,7 @@ struct AnalysisAsymmetricPairing { if (addPairCutsStr != "") { std::vector addPairCuts = dqcuts::GetCutsFromJSON(addPairCutsStr.Data()); for (auto& t : addPairCuts) { - fPairCuts.push_back((AnalysisCompositeCut*)t); + fPairCuts.push_back(reinterpret_cast(t)); cutNamesStr += Form(",%s", t->GetName()); } } @@ -2928,7 +2924,7 @@ struct AnalysisDileptonTrack { } for (int icut = 0; icut < cfgTrackSelection_objArrayTrackCuts->GetEntries(); icut++) { if (cfgDileptonTrack_objArrayTrackCuts->FindObject(cfgTrackSelection_objArrayTrackCuts->At(icut)->GetName())) { - fTrackCutBitMap |= (uint32_t(1) << icut); + fTrackCutBitMap |= (static_cast(1) << icut); } } fNCuts = fTrackCutNames.size(); @@ -2995,7 +2991,7 @@ struct AnalysisDileptonTrack { for (int iCutTrack = 0; iCutTrack < fNCuts; iCutTrack++) { // here we check that this track cut is one of those required to associate with the dileptons - if (!(fTrackCutBitMap & (uint32_t(1) << iCutTrack))) { + if (!(fTrackCutBitMap & (static_cast(1) << iCutTrack))) { continue; } @@ -3174,7 +3170,7 @@ struct AnalysisDileptonTrack { // loop over specified track cuts (the tracks to be combined with the dileptons) for (int iTrackCut = 0; iTrackCut < fNCuts; iTrackCut++) { - if (!(trackSelection & (uint32_t(1) << iTrackCut))) { + if (!(trackSelection & (static_cast(1) << iTrackCut))) { continue; } fHistMan->FillHistClass(Form("DileptonTrack_%s_%s", fTrackCutNames[icut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); @@ -3319,7 +3315,7 @@ struct AnalysisDileptonTrack { continue; } for (uint32_t iTrackCut = 0; iTrackCut < fTrackCutNames.size(); iTrackCut++) { - if (trackSelection & (uint32_t(1) << iTrackCut)) { + if (trackSelection & (static_cast(1) << iTrackCut)) { fHistMan->FillHistClass(Form("DileptonTrackME_%s_%s", fTrackCutNames[icut].Data(), fTrackCutNames[iTrackCut].Data()), VarManager::fgValues); } } @@ -3364,7 +3360,7 @@ struct AnalysisDileptonTrack { continue; } for (uint32_t iTrackCut = 0; iTrackCut < fTrackCutNames.size(); iTrackCut++) { - if (muonSelection & (uint32_t(1) << iTrackCut)) { + if (muonSelection & (static_cast(1) << iTrackCut)) { fHistMan->FillHistClass(Form("DileptonTrackME_%s_%s", fTrackCutNames[icut].Data(), fTrackCutNames[iTrackCut].Data()), VarManager::fgValues); } } diff --git a/PWGEM/Dilepton/Tasks/tableReaderBarrel.cxx b/PWGEM/Dilepton/Tasks/tableReaderBarrel.cxx index d78ef01676c..819a85efe65 100644 --- a/PWGEM/Dilepton/Tasks/tableReaderBarrel.cxx +++ b/PWGEM/Dilepton/Tasks/tableReaderBarrel.cxx @@ -291,8 +291,6 @@ struct AnalysisTrackSelection { Configurable fConfigNoLaterThan{"ccdb-no-later-than", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; Configurable fConfigComputeTPCpostCalib{"cfgTPCpostCalib", false, "If true, compute TPC post-calibrated n-sigmas"}; Configurable fConfigRunPeriods{"cfgRunPeriods", "LHC22f", "run periods for used data"}; - Configurable fConfigDummyRunlist{"cfgDummyRunlist", false, "If true, use dummy runlist"}; - Configurable fConfigInitRunNumber{"cfgInitRunNumber", 543215, "Initial run number used in run by run checks"}; Configurable fConfigNbTrackCut{"cfgNbTrackCut", 1, "Number of cuts including prefilter cut, need to be below 30"}; std::vector fTrackCuts; @@ -372,9 +370,6 @@ struct AnalysisTrackSelection { VarManager::SetUseVars(fHistMan->GetUsedVars()); // provide the list of required variables so that VarManager knows what to fill fOutputList.setObject(fHistMan->GetMainHistogramList()); } - if (fConfigDummyRunlist) { - VarManager::SetDummyRunlist(fConfigInitRunNumber); - } if (fConfigComputeTPCpostCalib) { // CCDB configuration fCCDB->setURL(fConfigCcdbUrl.value); From d74090e6564bf238c48e7ed80c21733c8d807e80 Mon Sep 17 00:00:00 2001 From: Bhagyarathi Sahoo Date: Thu, 24 Apr 2025 14:37:28 +0530 Subject: [PATCH 1081/1650] [PWGDQ] Adding polarization variable in production plane (#10928) Co-authored-by: ALICE Action Bot --- PWGDQ/Core/HistogramsLibrary.cxx | 12 ++++++++++++ PWGDQ/Core/VarManager.cxx | 8 +++++++- PWGDQ/Core/VarManager.h | 13 +++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index d2c662898ce..8efe158abde 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -1202,6 +1202,18 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "Mass_Pt_cosThetaCS_phiCS", "", 4, varspTCS, binspT, xminpT, xmaxpT, 0, -1, kFALSE); hm->AddHistogram(histClass, "Mass_y_cosThetaCS_phiCS", "", 4, varsrapCS, binsy, xminy, xmaxy, 0, -1, kFALSE); } + if (subGroupStr.Contains("dimuon-polarization-pp")) { + int varspTPP[4] = {VarManager::kMass, VarManager::kPt, VarManager::kCosThetaPP, VarManager::kPhiPP}; + int varsrapPP[4] = {VarManager::kMass, VarManager::kRap, VarManager::kCosThetaPP, VarManager::kPhiPP}; + int binspT[4] = {100, 20, 20, 20}; + int binsy[4] = {100, 10, 20, 20}; + double xminpT[4] = {1., 0., -1., -3.14}; + double xmaxpT[4] = {5., 20., 1., +3.14}; + double xminy[4] = {1., 2.5, -1., -3.14}; + double xmaxy[4] = {5., 4.0, 1., +3.14}; + hm->AddHistogram(histClass, "Mass_Pt_cosThetaPP_phiPP", "", 4, varspTPP, binspT, xminpT, xmaxpT, 0, -1, kFALSE); + hm->AddHistogram(histClass, "Mass_y_cosThetaPP_phiPP", "", 4, varsrapPP, binsy, xminy, xmaxy, 0, -1, kFALSE); + } if (subGroupStr.Contains("upsilon-polarization-he")) { int varspTHE[4] = {VarManager::kMass, VarManager::kPt, VarManager::kCosThetaHE, VarManager::kPhiHE}; int varsrapHE[4] = {VarManager::kMass, VarManager::kRap, VarManager::kCosThetaHE, VarManager::kPhiHE}; diff --git a/PWGDQ/Core/VarManager.cxx b/PWGDQ/Core/VarManager.cxx index 0467abfd240..c329641916a 100644 --- a/PWGDQ/Core/VarManager.cxx +++ b/PWGDQ/Core/VarManager.cxx @@ -920,7 +920,7 @@ void VarManager::SetDefaultVarNames() fgVariableUnits[kDeltaPhi] = "rad."; fgVariableNames[kDeltaPhiSym] = "#Delta#phi"; fgVariableUnits[kDeltaPhiSym] = "rad."; - fgVariableNames[kCosThetaHE] = "cos#it{#theta}"; + fgVariableNames[kCosThetaHE] = "cos#it{#theta}_{HE}"; fgVariableUnits[kCosThetaHE] = ""; fgVariableNames[kPhiHE] = "#varphi_{HE}"; fgVariableUnits[kPhiHE] = "rad."; @@ -928,6 +928,10 @@ void VarManager::SetDefaultVarNames() fgVariableUnits[kCosThetaCS] = ""; fgVariableNames[kPhiCS] = "#varphi_{CS}"; fgVariableUnits[kPhiCS] = "rad."; + fgVariableNames[kCosThetaPP] = "cos#it{#theta}_{PP}"; + fgVariableUnits[kCosThetaPP] = ""; + fgVariableNames[kPhiPP] = "#varphi_{PP}"; + fgVariableUnits[kPhiPP] = "rad."; fgVariableNames[kCosPhiVP] = "cos#it{#varphi}_{VP}"; fgVariableUnits[kCosPhiVP] = ""; fgVariableNames[kPhiVP] = "#varphi_{VP} - #Psi_{2}"; @@ -1467,8 +1471,10 @@ void VarManager::SetDefaultVarNames() fgVarNamesMap["kVertexingChi2PCA"] = kVertexingChi2PCA; fgVarNamesMap["kCosThetaHE"] = kCosThetaHE; fgVarNamesMap["kCosThetaCS"] = kCosThetaCS; + fgVarNamesMap["kCosThetaPP"] = kCosThetaPP; fgVarNamesMap["kPhiHE"] = kPhiHE; fgVarNamesMap["kPhiCS"] = kPhiCS; + fgVarNamesMap["kPhiPP"] = kPhiPP; fgVarNamesMap["kCosPhiVP"] = kCosPhiVP; fgVarNamesMap["kPhiVP"] = kPhiVP; fgVarNamesMap["kDeltaPhiPair2"] = kDeltaPhiPair2; diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index c7f2cd57cfa..0f27dd6f260 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -646,8 +646,10 @@ class VarManager : public TObject kVertexingChi2PCA, kCosThetaHE, kCosThetaCS, + kCosThetaPP, kPhiHE, kPhiCS, + kPhiPP, kCosPhiVP, kPhiVP, kDeltaPhiPair2, @@ -2826,6 +2828,9 @@ void VarManager::FillPair(T1 const& t1, T2 const& t2, float* values) ROOT::Math::XYZVectorF yaxis_CS{(Beam1_CM.Cross(Beam2_CM)).Unit()}; ROOT::Math::XYZVectorF xaxis_CS{(yaxis_CS.Cross(zaxis_CS)).Unit()}; + // Production frame + ROOT::Math::XYZVector normalVec = ROOT::Math::XYZVector(v12.Py(), -v12.Px(), 0.f); + if (fgUsedVars[kCosThetaHE]) { values[kCosThetaHE] = (t1.sign() > 0 ? zaxis_HE.Dot(v1_CM) : zaxis_HE.Dot(v2_CM)); } @@ -2842,6 +2847,14 @@ void VarManager::FillPair(T1 const& t1, T2 const& t2, float* values) values[kPhiCS] = (t1.sign() > 0 ? TMath::ATan2(yaxis_CS.Dot(v1_CM), xaxis_CS.Dot(v1_CM)) : TMath::ATan2(yaxis_CS.Dot(v2_CM), xaxis_CS.Dot(v2_CM))); } + if (fgUsedVars[kCosThetaPP]) { + values[kCosThetaPP] = (t1.sign() > 0 ? normalVec.Dot(v1_CM) : normalVec.Dot(v2_CM)); + } + + if (fgUsedVars[kPhiPP]) { + values[kPhiPP] = (t1.sign() > 0 ? TMath::ATan2((normalVec.Dot(v1_CM)), zaxis_HE.Dot(v1_CM)) : TMath::ATan2((normalVec.Dot(v2_CM)), zaxis_HE.Dot(v2_CM))); + } + if constexpr ((pairType == kDecayToEE) && ((fillMap & TrackCov) > 0 || (fillMap & ReducedTrackBarrelCov) > 0)) { if (fgUsedVars[kQuadDCAabsXY] || fgUsedVars[kQuadDCAsigXY] || fgUsedVars[kQuadDCAabsZ] || fgUsedVars[kQuadDCAsigZ] || fgUsedVars[kQuadDCAsigXYZ] || fgUsedVars[kSignQuadDCAsigXY]) { From 29c99d441adf89b72ddb326b6beb197d8807f667 Mon Sep 17 00:00:00 2001 From: Nicolas Strangmann <77485327+nstrangm@users.noreply.github.com> Date: Thu, 24 Apr 2025 11:27:54 +0200 Subject: [PATCH 1082/1650] [PWGEM/PhotonMeson] Add multiplicity cut for HNM analysis (#10963) Co-authored-by: Nicolas Strangmann Co-authored-by: ALICE Action Bot --- PWGEM/PhotonMeson/Tasks/HeavyNeutralMeson.cxx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/PWGEM/PhotonMeson/Tasks/HeavyNeutralMeson.cxx b/PWGEM/PhotonMeson/Tasks/HeavyNeutralMeson.cxx index 56ef57a6d79..b416f173480 100644 --- a/PWGEM/PhotonMeson/Tasks/HeavyNeutralMeson.cxx +++ b/PWGEM/PhotonMeson/Tasks/HeavyNeutralMeson.cxx @@ -128,6 +128,7 @@ struct HeavyNeutralMeson { Configurable> cfgMassWindowOmega{"cfgMassWindowOmega", {DefaultMassWindows[0], 4, {"pi0_min", "pi0_max", "omega_min", "omega_max"}}, "Mass window for selected omegas and their decay pi0"}; Configurable> cfgMassWindowEtaPrime{"cfgMassWindowEtaPrime", {DefaultMassWindows[1], 4, {"eta_min", "eta_max", "etaprime_min", "etaprime_max"}}, "Mass window for selected eta' and their decay eta"}; + Configurable cfgMaxMultiplicity{"cfgMaxMultiplicity", 5000, "Maximum number of tracks in a collision (can be used to increase the S/B -> Very experimental)"}; Configurable cfgMinGGPtOverHNMPt{"cfgMinGGPtOverHNMPt", 0., "Minimum ratio of the pT of the gamma gamma pair over the pT of the HNM (can be used to increase the S/B)"}; HistogramRegistry mHistManager{"HeavyNeutralMesonHistograms", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -210,6 +211,9 @@ struct HeavyNeutralMeson { if (confEvtRequireSel8 && !col.sel8()) { return false; } + if (col.multNTracksPV() > cfgMaxMultiplicity) { + return false; + } return true; } From f768d8c6c941d711aec881d12ce89f846f49446d Mon Sep 17 00:00:00 2001 From: Oleksii Lubynets Date: Thu, 24 Apr 2025 13:49:09 +0200 Subject: [PATCH 1083/1650] [PWGHF] KFParticle based 3 prong decay reconstruction development (#10610) --- PWGHF/Core/SelectorCuts.h | 15 + .../TableProducer/candidateCreator3Prong.cxx | 31 +- PWGHF/TableProducer/candidateSelectorLc.cxx | 203 ++++++--- PWGHF/TableProducer/treeCreatorLcToPKPi.cxx | 395 +++++++++++++----- 4 files changed, 482 insertions(+), 162 deletions(-) diff --git a/PWGHF/Core/SelectorCuts.h b/PWGHF/Core/SelectorCuts.h index a3313abe79e..b064642fe90 100644 --- a/PWGHF/Core/SelectorCuts.h +++ b/PWGHF/Core/SelectorCuts.h @@ -465,6 +465,7 @@ namespace hf_cuts_lc_to_p_k_pi { static constexpr int NBinsPt = 10; static constexpr int NCutVars = 11; +static constexpr int NCutKfVars = 12; // default values for the pT bin edges (can be used to configure histogram axis) // offset by 1 from the bin numbers in cuts array constexpr double BinsPt[NBinsPt + 1] = { @@ -493,6 +494,19 @@ constexpr double Cuts[NBinsPt][NCutVars] = {{0.4, 0.4, 0.4, 0.4, 0., 0.005, 0., {0.4, 0.4, 0.4, 0.4, 0., 0.005, 0., 0., 0., 1e+10, -1.}, /* 12 < pT < 24 */ {0.4, 0.4, 0.4, 0.4, 0., 0.005, 0., 0., 0., 1e+10, -1.}}; /* 24 < pT < 36 */ +// default value for the cuts Chi2Prim Chi2Geo DCA, cm Chi2Geo Chi2Topo +// P K Pi KPi PPi PK KPi PPi PK ↓ LdL ↓ +constexpr double CutsKf[NBinsPt][NCutKfVars] = {{3., 3., 3., 3., 3., 3., 0.01, 0.01, 0.01, 3., 5., 5.}, /* 0 < pT < 1 */ + {3., 3., 3., 3., 3., 3., 0.01, 0.01, 0.01, 3., 5., 5.}, /* 1 < pT < 2 */ + {3., 3., 3., 3., 3., 3., 0.01, 0.01, 0.01, 3., 5., 5.}, /* 2 < pT < 3 */ + {3., 3., 3., 3., 3., 3., 0.01, 0.01, 0.01, 3., 5., 5.}, /* 3 < pT < 4 */ + {3., 3., 3., 3., 3., 3., 0.01, 0.01, 0.01, 3., 5., 5.}, /* 4 < pT < 5 */ + {3., 3., 3., 3., 3., 3., 0.01, 0.01, 0.01, 3., 5., 5.}, /* 5 < pT < 6 */ + {3., 3., 3., 3., 3., 3., 0.01, 0.01, 0.01, 3., 5., 5.}, /* 6 < pT < 8 */ + {3., 3., 3., 3., 3., 3., 0.01, 0.01, 0.01, 3., 5., 5.}, /* 8 < pT < 12 */ + {3., 3., 3., 3., 3., 3., 0.01, 0.01, 0.01, 3., 5., 5.}, /* 12 < pT < 24 */ + {3., 3., 3., 3., 3., 3., 0.01, 0.01, 0.01, 3., 5., 5.}}; /* 24 < pT < 36 */ + // row labels static const std::vector labelsPt = { "pT bin 0", @@ -508,6 +522,7 @@ static const std::vector labelsPt = { // column labels static const std::vector labelsCutVar = {"m", "pT p", "pT K", "pT Pi", "Chi2PCA", "decay length", "cos pointing angle", "decLengthXY", "normDecLXY", "impParXY", "mass (Kpi)"}; +static const std::vector labelsCutKfVar = {"kfChi2PrimPr", "kfChi2PrimKa", "kfChi2PrimPi", "kfChi2GeoKaPi", "kfChi2GeoPrPi", "kfChi2GeoPrKa", "kfDcaKaPi", "kfDcaPrPi", "kfDcaPrKa", "kfChi2Geo", "kfLdL", "kfChi2Topo"}; } // namespace hf_cuts_lc_to_p_k_pi namespace hf_cuts_lc_to_k0s_p diff --git a/PWGHF/TableProducer/candidateCreator3Prong.cxx b/PWGHF/TableProducer/candidateCreator3Prong.cxx index 24d9496630c..20e068d1e09 100644 --- a/PWGHF/TableProducer/candidateCreator3Prong.cxx +++ b/PWGHF/TableProducer/candidateCreator3Prong.cxx @@ -85,6 +85,9 @@ struct HfCandidateCreator3Prong { Configurable createDs{"createDs", false, "enable Ds+/- candidate creation"}; Configurable createLc{"createLc", false, "enable Lc+/- candidate creation"}; Configurable createXic{"createXic", false, "enable Xic+/- candidate creation"}; + // KF + Configurable applyTopoConstraint{"applyTopoConstraint", false, "apply origin from PV hypothesis for created candidate, works only in KF mode"}; + Configurable applyInvMassConstraint{"applyInvMassConstraint", false, "apply particle type hypothesis to recalculate created candidate's momentum, works only in KF mode"}; HfEventSelection hfEvSel; // event selection and monitoring o2::vertexing::DCAFitterN<3> df; // 3-prong vertex fitter @@ -149,6 +152,10 @@ struct HfCandidateCreator3Prong { LOGP(fatal, "At least one particle specie should be enabled for the creation."); } + if (createLc && createXic && applyInvMassConstraint) { + LOGP(fatal, "Unable to apply invariant mass constraint due to ambiguity of mass hypothesis: only one of Lc and Xic can be reconstructed."); + } + // histograms registry.add("hMass3PKPi", "3-prong candidates;inv. mass (pK#pi) (GeV/#it{c}^{2});entries", {HistType::kTH1D, {{1200, 1.8, 3.0}}}); registry.add("hMass3PiKP", "3-prong candidates;inv. mass (#pi Kp) (GeV/#it{c}^{2});entries", {HistType::kTH1D, {{1200, 1.8, 3.0}}}); @@ -487,6 +494,15 @@ struct HfCandidateCreator3Prong { kfCandPiKK.SetConstructMethod(2); kfCandPiKK.Construct(kfDaughtersPiKK, 3); + const float chi2topo = kfCalculateChi2ToPrimaryVertex(kfCandPKPi, kfpV); + + if (applyTopoConstraint) { // constraints applied after chi2topo getter - to preserve unbiased value of chi2topo + for (const auto& kfCand : std::array{&kfCandPKPi, &kfCandPiKP, &kfCandPiKPi, &kfCandKKPi, &kfCandPiKK}) { + kfCand->SetProductionVertex(kfpV); + kfCand->TransportToDecayVertex(); + } + } + KFParticle kfPairKPi; const KFParticle* kfDaughtersKPi[3] = {&kfSecondKaon, &kfThirdPion}; kfPairKPi.SetConstructMethod(2); @@ -505,8 +521,15 @@ struct HfCandidateCreator3Prong { const float massKPi = kfPairKPi.GetMass(); const float massPiK = kfPairPiK.GetMass(); + if (applyInvMassConstraint) { // constraints applied after minv getters - to preserve unbiased values of minv + kfCandPKPi.SetNonlinearMassConstraint(createLc ? MassLambdaCPlus : MassXiCPlus); + kfCandPiKP.SetNonlinearMassConstraint(createLc ? MassLambdaCPlus : MassXiCPlus); + kfCandPiKPi.SetNonlinearMassConstraint(MassDPlus); + kfCandKKPi.SetNonlinearMassConstraint(MassDS); + kfCandPiKK.SetNonlinearMassConstraint(MassDS); + } + const float chi2geo = kfCandPKPi.Chi2() / kfCandPKPi.NDF(); - const float chi2topo = kfCalculateChi2ToPrimaryVertex(kfCandPKPi, kfpV); const std::pair ldl = kfCalculateLdL(kfCandPKPi, kfpV); std::array pProng0 = kfCalculateProngMomentumInSecondaryVertex(kfFirstProton, kfCandPiKP); @@ -787,6 +810,8 @@ struct HfCandidateCreator3ProngExpressions { Configurable matchKinkedDecayTopology{"matchKinkedDecayTopology", false, "Match also candidates with tracks that decay with kinked topology"}; Configurable matchInteractionsWithMaterial{"matchInteractionsWithMaterial", false, "Match also candidates with tracks that interact with material"}; + constexpr static std::size_t NDaughtersResonant{2u}; + HfEventSelectionMc hfEvSelMc; // mc event selection and monitoring using BCsInfo = soa::Join; @@ -924,7 +949,7 @@ struct HfCandidateCreator3ProngExpressions { swapping = int8_t(std::abs(arrayDaughters[0].mcParticle().pdgCode()) == kPiPlus); } RecoDecay::getDaughters(mcParticles.rawIteratorAt(indexRec), &arrDaughIndex, std::array{0}, 1); - if (arrDaughIndex.size() == 2) { + if (arrDaughIndex.size() == NDaughtersResonant) { for (auto iProng = 0u; iProng < arrDaughIndex.size(); ++iProng) { auto daughI = mcParticles.rawIteratorAt(arrDaughIndex[iProng]); arrPDGDaugh[iProng] = std::abs(daughI.pdgCode()); @@ -970,7 +995,7 @@ struct HfCandidateCreator3ProngExpressions { swapping = int8_t(std::abs(arrayDaughters[0].mcParticle().pdgCode()) == kPiPlus); } RecoDecay::getDaughters(mcParticles.rawIteratorAt(indexRec), &arrDaughIndex, std::array{0}, 1); - if (arrDaughIndex.size() == 2) { + if (arrDaughIndex.size() == NDaughtersResonant) { for (auto iProng = 0u; iProng < arrDaughIndex.size(); ++iProng) { auto daughI = mcParticles.rawIteratorAt(arrDaughIndex[iProng]); arrPDGDaugh[iProng] = std::abs(daughI.pdgCode()); diff --git a/PWGHF/TableProducer/candidateSelectorLc.cxx b/PWGHF/TableProducer/candidateSelectorLc.cxx index 0585fd66b5f..b330b8a59f4 100644 --- a/PWGHF/TableProducer/candidateSelectorLc.cxx +++ b/PWGHF/TableProducer/candidateSelectorLc.cxx @@ -73,6 +73,9 @@ struct HfCandidateSelectorLc { // topological cuts Configurable> binsPt{"binsPt", std::vector{hf_cuts_lc_to_p_k_pi::vecBinsPt}, "pT bin limits"}; Configurable> cuts{"cuts", {hf_cuts_lc_to_p_k_pi::Cuts[0], hf_cuts_lc_to_p_k_pi::NBinsPt, hf_cuts_lc_to_p_k_pi::NCutVars, hf_cuts_lc_to_p_k_pi::labelsPt, hf_cuts_lc_to_p_k_pi::labelsCutVar}, "Lc candidate selection per pT bin"}; + Configurable> kfCuts{"kfCuts", {hf_cuts_lc_to_p_k_pi::CutsKf[0], hf_cuts_lc_to_p_k_pi::NBinsPt, hf_cuts_lc_to_p_k_pi::NCutKfVars, hf_cuts_lc_to_p_k_pi::labelsPt, hf_cuts_lc_to_p_k_pi::labelsCutKfVar}, "Lc candidate selection per pT bin with KF-associated variables"}; + Configurable applyNonKfCuts{"applyNonKfCuts", true, "Whether to apply non-KF cuts when running in KF mode. In DCAFitter mode this field is not effective"}; + Configurable applyKfCuts{"applyKfCuts", true, "Whether to apply KF cuts when running in KF mode. In DCAFitter mode this field is not effective"}; // QA switch Configurable activateQA{"activateQA", false, "Flag to enable QA histogram"}; // ML inference @@ -175,7 +178,7 @@ struct HfCandidateSelectorLc { /// Conjugate-independent topological cuts /// \param candidate is candidate /// \return true if candidate passes all cuts - template + template bool selectionTopol(const T& candidate) { auto candpT = candidate.pt(); @@ -190,33 +193,54 @@ struct HfCandidateSelectorLc { return false; } - // cosine of pointing angle - if (candidate.cpa() <= cuts->get(pTBin, "cos pointing angle")) { - return false; - } + if (reconstructionType == aod::hf_cand::VertexerType::DCAFitter || (reconstructionType == aod::hf_cand::VertexerType::KfParticle && applyNonKfCuts)) { + // cosine of pointing angle + if (candidate.cpa() <= cuts->get(pTBin, "cos pointing angle")) { + return false; + } - // candidate chi2PCA - if (candidate.chi2PCA() > cuts->get(pTBin, "Chi2PCA")) { - return false; - } + // candidate chi2PCA + if (candidate.chi2PCA() > cuts->get(pTBin, "Chi2PCA")) { + return false; + } - if (candidate.decayLength() <= cuts->get(pTBin, "decay length")) { - return false; - } + if (candidate.decayLength() <= cuts->get(pTBin, "decay length")) { + return false; + } - // candidate decay length XY - if (candidate.decayLengthXY() <= cuts->get(pTBin, "decLengthXY")) { - return false; - } + // candidate decay length XY + if (candidate.decayLengthXY() <= cuts->get(pTBin, "decLengthXY")) { + return false; + } - // candidate normalized decay length XY - if (candidate.decayLengthXYNormalised() < cuts->get(pTBin, "normDecLXY")) { - return false; + // candidate normalized decay length XY + if (candidate.decayLengthXYNormalised() < cuts->get(pTBin, "normDecLXY")) { + return false; + } + + // candidate impact parameter XY + if (std::abs(candidate.impactParameterXY()) > cuts->get(pTBin, "impParXY")) { + return false; + } } - // candidate impact parameter XY - if (std::abs(candidate.impactParameterXY()) > cuts->get(pTBin, "impParXY")) { - return false; + if constexpr (reconstructionType == aod::hf_cand::VertexerType::KfParticle) { + if (applyKfCuts) { + // candidate chi2geo of the triplet of prongs + if (candidate.kfChi2Geo() > kfCuts->get(pTBin, "kfChi2Geo")) { + return false; + } + + // candidate's decay point separation from the PV in terms of its error + if (candidate.kfDecayLength() / candidate.kfDecayLengthError() < kfCuts->get(pTBin, "kfLdL")) { + return false; + } + + // candidate's chi2 to the PV + if (candidate.kfChi2Topo() > kfCuts->get(pTBin, "kfChi2Topo")) { + return false; + } + } } if (!isSelectedCandidateProngDca(candidate)) { @@ -242,40 +266,117 @@ struct HfCandidateSelectorLc { return false; } - // cut on daughter pT - if (trackProton.pt() < cuts->get(pTBin, "pT p") || trackKaon.pt() < cuts->get(pTBin, "pT K") || trackPion.pt() < cuts->get(pTBin, "pT Pi")) { - return false; - } + if (reconstructionType == aod::hf_cand::VertexerType::DCAFitter || (reconstructionType == aod::hf_cand::VertexerType::KfParticle && applyNonKfCuts)) { - // cut on Lc->pKpi, piKp mass values - /// cut on the Kpi pair invariant mass, to study Lc->pK*(->Kpi) - float massLc, massKPi; - if constexpr (reconstructionType == aod::hf_cand::VertexerType::DCAFitter) { - if (trackProton.globalIndex() == candidate.prong0Id()) { - massLc = hfHelper.invMassLcToPKPi(candidate); - massKPi = hfHelper.invMassKPiPairLcToPKPi(candidate); - } else { - massLc = hfHelper.invMassLcToPiKP(candidate); - massKPi = hfHelper.invMassKPiPairLcToPiKP(candidate); + // cut on daughter pT + if (trackProton.pt() < cuts->get(pTBin, "pT p") || trackKaon.pt() < cuts->get(pTBin, "pT K") || trackPion.pt() < cuts->get(pTBin, "pT Pi")) { + return false; } - } else if constexpr (reconstructionType == aod::hf_cand::VertexerType::KfParticle) { - if (trackProton.globalIndex() == candidate.prong0Id()) { - massLc = candidate.kfMassPKPi(); - massKPi = candidate.kfMassKPi(); - } else { - massLc = candidate.kfMassPiKP(); - massKPi = candidate.kfMassPiK(); + + float massLc, massKPi; + if constexpr (reconstructionType == aod::hf_cand::VertexerType::DCAFitter) { + if (trackProton.globalIndex() == candidate.prong0Id()) { + massLc = hfHelper.invMassLcToPKPi(candidate); + massKPi = hfHelper.invMassKPiPairLcToPKPi(candidate); + } else { + massLc = hfHelper.invMassLcToPiKP(candidate); + massKPi = hfHelper.invMassKPiPairLcToPiKP(candidate); + } + } else if constexpr (reconstructionType == aod::hf_cand::VertexerType::KfParticle) { + if (trackProton.globalIndex() == candidate.prong0Id()) { + massLc = candidate.kfMassPKPi(); + massKPi = candidate.kfMassKPi(); + } else { + massLc = candidate.kfMassPiKP(); + massKPi = candidate.kfMassPiK(); + } } - } - if (std::abs(massLc - o2::constants::physics::MassLambdaCPlus) > cuts->get(pTBin, "m")) { - return false; + // cut on Lc->pKpi, piKp mass values + if (std::abs(massLc - o2::constants::physics::MassLambdaCPlus) > cuts->get(pTBin, "m")) { + return false; + } + + /// cut on the Kpi pair invariant mass, to study Lc->pK*(->Kpi) + const double cutMassKPi = cuts->get(pTBin, "mass (Kpi)"); + if (cutMassKPi > 0 && std::abs(massKPi - massK0Star892) > cutMassKPi) { + return false; + } } - /// cut on the Kpi pair invariant mass, to study Lc->pK*(->Kpi) - const double cutMassKPi = cuts->get(pTBin, "mass (Kpi)"); - if (cutMassKPi > 0 && std::abs(massKPi - massK0Star892) > cutMassKPi) { - return false; + if constexpr (reconstructionType == aod::hf_cand::VertexerType::KfParticle) { + if (applyKfCuts) { + const float chi2PrimProng0 = candidate.kfChi2PrimProng0(); + const float chi2PrimProng1 = candidate.kfChi2PrimProng1(); + const float chi2PrimProng2 = candidate.kfChi2PrimProng2(); + + const float chi2GeoProng1Prong2 = candidate.kfChi2GeoProng1Prong2(); + const float chi2GeoProng0Prong2 = candidate.kfChi2GeoProng0Prong2(); + const float chi2GeoProng0Prong1 = candidate.kfChi2GeoProng0Prong1(); + + const float dcaProng1Prong2 = candidate.kfDcaProng1Prong2(); + const float dcaProng0Prong2 = candidate.kfDcaProng0Prong2(); + const float dcaProng0Prong1 = candidate.kfDcaProng0Prong1(); + + const double cutChi2PrimPr = kfCuts->get(pTBin, "kfChi2PrimPr"); + const double cutChi2PrimKa = kfCuts->get(pTBin, "kfChi2PrimKa"); + const double cutChi2PrimPi = kfCuts->get(pTBin, "kfChi2PrimPi"); + + const double cutChi2GeoKaPi = kfCuts->get(pTBin, "kfChi2GeoKaPi"); + const double cutChi2GeoPrPi = kfCuts->get(pTBin, "kfChi2GeoPrPi"); + const double cutChi2GeoPrKa = kfCuts->get(pTBin, "kfChi2GeoPrKa"); + + const double cutDcaKaPi = kfCuts->get(pTBin, "kfDcaKaPi"); + const double cutDcaPrPi = kfCuts->get(pTBin, "kfDcaPrPi"); + const double cutDcaPrKa = kfCuts->get(pTBin, "kfDcaPrKa"); + + // kaon's chi2 to the PV + if (chi2PrimProng1 < cutChi2PrimKa) { + return false; + } + + // chi2geo between proton and pion + if (chi2GeoProng0Prong2 > cutChi2GeoPrPi) { + return false; + } + + // dca between proton and pion + if (dcaProng0Prong2 > cutDcaPrPi) { + return false; + } + + const bool isPKPi = trackProton.globalIndex() == candidate.prong0Id(); + + // 0-th prong chi2 to the PV + if (chi2PrimProng0 < (isPKPi ? cutChi2PrimPr : cutChi2PrimPi)) { + return false; + } + + // 2-nd prong chi2 to the PV + if (chi2PrimProng2 < (isPKPi ? cutChi2PrimPi : cutChi2PrimPr)) { + return false; + } + + // chi2geo between 1-st and 2-nd prongs + if (chi2GeoProng1Prong2 > (isPKPi ? cutChi2GeoKaPi : cutChi2GeoPrKa)) { + return false; + } + + // chi2geo between 0-th and 1-st prongs + if (chi2GeoProng0Prong1 > (isPKPi ? cutChi2GeoPrKa : cutChi2GeoKaPi)) { + return false; + } + + // dca between 1-st and 2-nd prongs + if (dcaProng1Prong2 > (isPKPi ? cutDcaKaPi : cutDcaPrKa)) { + return false; + } + + // dca between 0-th and 1-st prongs + if (dcaProng0Prong1 > (isPKPi ? cutDcaPrKa : cutDcaKaPi)) { + return false; + } + } } return true; @@ -358,7 +459,7 @@ struct HfCandidateSelectorLc { } // conjugate-independent topological selection - if (!selectionTopol(candidate)) { + if (!selectionTopol(candidate)) { hfSelLcCandidate(statusLcToPKPi, statusLcToPiKP); if (applyMl) { hfMlLcToPKPiCandidate(outputMlLcToPKPi, outputMlLcToPiKP); diff --git a/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx b/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx index 5b2c5225ba0..2842968ab6c 100644 --- a/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx +++ b/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx @@ -131,8 +131,28 @@ DECLARE_SOA_COLUMN(ErrP, errP, float); //! mom DECLARE_SOA_COLUMN(ErrPt, errPt, float); //! transverse momentum error DECLARE_SOA_COLUMN(IsSelected, isSelected, int); //! flag whether candidate was selected in candidateSelectorLc task DECLARE_SOA_COLUMN(SigBgStatus, sigBgStatus, int); //! 0 bg, 1 prompt, 2 non-prompt, 3 wrong order of prongs, -1 default value (impossible, should not be the case), -999 for data +DECLARE_SOA_COLUMN(NSigTpcPi, nSigTpcPi, float); +DECLARE_SOA_COLUMN(NSigTpcKa, nSigTpcKa, float); +DECLARE_SOA_COLUMN(NSigTpcPr, nSigTpcPr, float); +DECLARE_SOA_COLUMN(NSigTofPi, nSigTofPi, float); +DECLARE_SOA_COLUMN(NSigTofKa, nSigTofKa, float); +DECLARE_SOA_COLUMN(NSigTofPr, nSigTofPr, float); +DECLARE_SOA_COLUMN(NSigTpcTofPi, nSigTpcTofPi, float); +DECLARE_SOA_COLUMN(NSigTpcTofKa, nSigTpcTofKa, float); +DECLARE_SOA_COLUMN(NSigTpcTofPr, nSigTpcTofPr, float); +DECLARE_SOA_COLUMN(MultNTracksPV, multNTracksPV, int); } // namespace kf +namespace kf_collision +{ +DECLARE_SOA_COLUMN(PosXErr, posXErr, float); //! PV X coordinate uncertainty +DECLARE_SOA_COLUMN(PosYErr, posYErr, float); //! PV Y coordinate uncertainty +DECLARE_SOA_COLUMN(PosZErr, posZErr, float); //! PV Z coordinate uncertainty +DECLARE_SOA_COLUMN(McPosX, mcPosX, float); //! PV X coordinate uncertainty +DECLARE_SOA_COLUMN(McPosY, mcPosY, float); //! PV Y coordinate uncertainty +DECLARE_SOA_COLUMN(McPosZ, mcPosZ, float); //! PV Z coordinate uncertainty +} // namespace kf_collision + namespace mc_match { DECLARE_SOA_COLUMN(P, p, float); //! Momentum, GeV/c @@ -161,7 +181,17 @@ DECLARE_SOA_TABLE(HfCandLcKFs, "AOD", "HFCANDLCKF", kf::Chi2GeoProtonKaon, kf::Chi2GeoProtonPion, kf::Chi2GeoPionKaon, kf::Chi2Geo, kf::Chi2Topo, kf::DecayLength, kf::DecayLengthError, kf::DecayLengthNormalised, kf::T, kf::ErrT, kf::MassInv, kf::P, kf::Pt, kf::ErrP, kf::ErrPt, - kf::IsSelected, kf::SigBgStatus); + kf::IsSelected, kf::SigBgStatus, + kf::MultNTracksPV, + kf::NSigTpcPr, + kf::NSigTpcKa, + kf::NSigTpcPi, + kf::NSigTofPr, + kf::NSigTofKa, + kf::NSigTofPi, + kf::NSigTpcTofPr, + kf::NSigTpcTofKa, + kf::NSigTpcTofPi); DECLARE_SOA_TABLE(HfCandLcLites, "AOD", "HFCANDLCLITE", collision::PosX, @@ -293,6 +323,12 @@ DECLARE_SOA_TABLE(HfCandLcFullEvs, "AOD", "HFCANDLCFULLEV", collision::PosX, collision::PosY, collision::PosZ, + kf_collision::PosXErr, + kf_collision::PosYErr, + kf_collision::PosZErr, + kf_collision::McPosX, + kf_collision::McPosY, + kf_collision::McPosZ, full::IsEventReject, full::RunNumber, full::CentFT0A, @@ -300,7 +336,8 @@ DECLARE_SOA_TABLE(HfCandLcFullEvs, "AOD", "HFCANDLCFULLEV", full::CentFT0M, full::CentFV0A, full::CentFDDM, - full::MultZeqNTracksPV); + full::MultZeqNTracksPV, + kf::MultNTracksPV); DECLARE_SOA_TABLE(HfCandLcFullPs, "AOD", "HFCANDLCFULLP", full::Pt, @@ -308,7 +345,16 @@ DECLARE_SOA_TABLE(HfCandLcFullPs, "AOD", "HFCANDLCFULLP", full::Phi, full::Y, full::FlagMc, - full::OriginMcGen); + full::OriginMcGen, + mc_match::P, + mc_match::XDecay, + mc_match::YDecay, + mc_match::ZDecay, + mc_match::LDecay, + mc_match::TDecay, + mc_match::XEvent, + mc_match::YEvent, + mc_match::ZEvent); } // namespace o2::aod @@ -351,10 +397,10 @@ struct HfTreeCreatorLcToPKPi { /// \brief function which determines if the candidate corresponds to MC-particle or belongs to a combinatorial background /// \param candidate candidate to be checked for being signal or background - /// \param CandFlag 0 for PKPi hypothesis and 1 for PiKP hypothesis + /// \param candFlag 0 for PKPi hypothesis and 1 for PiKP hypothesis /// \return SigBgStatus enum with value encoding MC status of the candidate template - SigBgStatus determineSignalBgStatus(const CandType& candidate, int CandFlag) + SigBgStatus determineSignalBgStatus(const CandType& candidate, int candFlag) { const int flag = candidate.flagMcMatchRec(); const int origin = candidate.originMcRec(); @@ -364,7 +410,7 @@ struct HfTreeCreatorLcToPKPi { if (std::abs(flag) == (1 << o2::aod::hf_cand_3prong::DecayType::LcToPKPi)) { if (swapped == 0) { - if (CandFlag == 0) { + if (candFlag == 0) { if (origin == RecoDecay::OriginType::Prompt) status = Prompt; else if (origin == RecoDecay::OriginType::NonPrompt) @@ -373,7 +419,7 @@ struct HfTreeCreatorLcToPKPi { status = WrongOrder; } } else { - if (CandFlag == 1) { + if (candFlag == 1) { if (origin == RecoDecay::OriginType::Prompt) status = Prompt; else if (origin == RecoDecay::OriginType::NonPrompt) @@ -431,6 +477,8 @@ struct HfTreeCreatorLcToPKPi { centFDDM = collision.centFDDM(); } + auto mcCollision = collision.template mcCollision_as(); + rowCandidateFullEvents( collision.globalIndex(), collision.mcCollisionId(), @@ -438,6 +486,12 @@ struct HfTreeCreatorLcToPKPi { collision.posX(), collision.posY(), collision.posZ(), + std::sqrt(collision.covXX()), + std::sqrt(collision.covYY()), + std::sqrt(collision.covZZ()), + mcCollision.posX(), + mcCollision.posY(), + mcCollision.posZ(), 0, collision.bc().runNumber(), centFT0A, @@ -445,7 +499,8 @@ struct HfTreeCreatorLcToPKPi { centFT0M, centFV0A, centFDDM, - collision.multZeqNTracksPV()); + collision.multZeqNTracksPV(), + collision.multNTracksPV()); } // Filling candidate properties @@ -469,23 +524,27 @@ struct HfTreeCreatorLcToPKPi { auto trackPos1 = candidate.template prong0_as>(); // positive daughter (negative for the antiparticles) auto trackNeg = candidate.template prong1_as>(); // negative daughter (positive for the antiparticles) auto trackPos2 = candidate.template prong2_as>(); // positive daughter (negative for the antiparticles) - auto fillTable = [&](int CandFlag) { + auto collision = candidate.template collision_as(); + auto fillTable = [&](int candFlag) { double pseudoRndm = trackPos1.pt() * 1000. - static_cast(trackPos1.pt() * 1000); - const int FunctionSelection = CandFlag == 0 ? candidate.isSelLcToPKPi() : candidate.isSelLcToPiKP(); - const int sigbgstatus = determineSignalBgStatus(candidate, CandFlag); - bool isMcCandidateSignal = (sigbgstatus == Prompt) || (sigbgstatus == NonPrompt); - if (FunctionSelection >= selectionFlagLc && (/*keep all*/ (!keepOnlySignalMc && !keepOnlyBkg) || /*keep only signal*/ (keepOnlySignalMc && isMcCandidateSignal) || /*keep only background and downsample it*/ (keepOnlyBkg && !isMcCandidateSignal && (candidate.pt() > downSampleBkgPtMax || (pseudoRndm < downSampleBkgFactor && candidate.pt() < downSampleBkgPtMax))))) { - float FunctionInvMass, FunctionInvMassKPi; + const int functionSelection = candFlag == 0 ? candidate.isSelLcToPKPi() : candidate.isSelLcToPiKP(); + const int sigbgstatus = determineSignalBgStatus(candidate, candFlag); + const bool isMcCandidateSignal = (sigbgstatus == Prompt) || (sigbgstatus == NonPrompt); + const bool passSelection = functionSelection >= selectionFlagLc; + const bool keepAll = !keepOnlySignalMc && !keepOnlyBkg; + const bool notSkippedBkg = isMcCandidateSignal || candidate.pt() > downSampleBkgPtMax || pseudoRndm < downSampleBkgFactor; + if (passSelection && notSkippedBkg && (keepAll || (keepOnlySignalMc && isMcCandidateSignal) || (keepOnlyBkg && !isMcCandidateSignal))) { + float functionInvMass, functionInvMassKPi; if constexpr (reconstructionType == aod::hf_cand::VertexerType::DCAFitter) { - FunctionInvMass = CandFlag == 0 ? hfHelper.invMassLcToPKPi(candidate) : hfHelper.invMassLcToPiKP(candidate); - FunctionInvMassKPi = CandFlag == 0 ? hfHelper.invMassKPiPairLcToPKPi(candidate) : hfHelper.invMassKPiPairLcToPiKP(candidate); + functionInvMass = candFlag == 0 ? hfHelper.invMassLcToPKPi(candidate) : hfHelper.invMassLcToPiKP(candidate); + functionInvMassKPi = candFlag == 0 ? hfHelper.invMassKPiPairLcToPKPi(candidate) : hfHelper.invMassKPiPairLcToPiKP(candidate); } else { - FunctionInvMass = CandFlag == 0 ? candidate.kfMassPKPi() : candidate.kfMassPiKP(); - FunctionInvMassKPi = CandFlag == 0 ? candidate.kfMassKPi() : candidate.kfMassPiK(); + functionInvMass = candFlag == 0 ? candidate.kfMassPKPi() : candidate.kfMassPiKP(); + functionInvMassKPi = candFlag == 0 ? candidate.kfMassKPi() : candidate.kfMassPiK(); } - const float FunctionCt = hfHelper.ctLc(candidate); - const float FunctionY = hfHelper.yLc(candidate); - const float FunctionE = hfHelper.eLc(candidate); + const float functionCt = hfHelper.ctLc(candidate); + const float functionY = hfHelper.yLc(candidate); + const float functionE = hfHelper.eLc(candidate); if (fillCandidateLiteTable) { rowCandidateLite( candidate.posX(), @@ -517,20 +576,20 @@ struct HfTreeCreatorLcToPKPi { trackNeg.tpcTofNSigmaKa(), trackPos2.tpcTofNSigmaPi(), trackPos2.tpcTofNSigmaPr(), - 1 << CandFlag, - FunctionInvMass, + 1 << candFlag, + functionInvMass, candidate.pt(), candidate.cpa(), candidate.cpaXY(), - FunctionCt, + functionCt, candidate.eta(), candidate.phi(), - FunctionY, + functionY, candidate.flagMcMatchRec(), candidate.originMcRec(), candidate.isCandidateSwapped(), candidate.flagMcDecayChanRec(), - FunctionInvMassKPi); + functionInvMassKPi); if (fillCollIdTable) { /// save also candidate collision indices @@ -594,26 +653,71 @@ struct HfTreeCreatorLcToPKPi { trackNeg.tpcTofNSigmaKa(), trackPos2.tpcTofNSigmaPi(), trackPos2.tpcTofNSigmaPr(), - 1 << CandFlag, - FunctionInvMass, + 1 << candFlag, + functionInvMass, candidate.pt(), candidate.p(), candidate.cpa(), candidate.cpaXY(), - FunctionCt, + functionCt, candidate.eta(), candidate.phi(), - FunctionY, - FunctionE, + functionY, + functionE, candidate.flagMcMatchRec(), candidate.originMcRec(), candidate.isCandidateSwapped(), candidate.globalIndex(), candidate.flagMcDecayChanRec(), - FunctionInvMassKPi); + functionInvMassKPi); } if constexpr (reconstructionType == aod::hf_cand::VertexerType::KfParticle) { + float chi2primProton; + float chi2primPion; + float dcaProtonKaon; + float dcaPionKaon; + float chi2GeoProtonKaon; + float chi2GeoPionKaon; + float mass; + float valueTpcNSigmaPr; + const float valueTpcNSigmaKa = trackNeg.tpcNSigmaKa(); + float valueTpcNSigmaPi; + float valueTofNSigmaPr; + const float valueTofNSigmaKa = trackNeg.tofNSigmaKa(); + float valueTofNSigmaPi; + float valueTpcTofNSigmaPr; + const float valueTpcTofNSigmaKa = trackNeg.tpcTofNSigmaKa(); + float valueTpcTofNSigmaPi; + if (candFlag == 0) { + chi2primProton = candidate.kfChi2PrimProng0(); + chi2primPion = candidate.kfChi2PrimProng2(); + dcaProtonKaon = candidate.kfDcaProng0Prong1(); + dcaPionKaon = candidate.kfDcaProng1Prong2(); + chi2GeoProtonKaon = candidate.kfChi2GeoProng0Prong1(); + chi2GeoPionKaon = candidate.kfChi2GeoProng1Prong2(); + mass = candidate.kfMassPKPi(); + valueTpcNSigmaPr = trackPos1.tpcNSigmaPr(); + valueTpcNSigmaPi = trackPos2.tpcNSigmaPi(); + valueTofNSigmaPr = trackPos1.tofNSigmaPr(); + valueTofNSigmaPi = trackPos2.tofNSigmaPi(); + valueTpcTofNSigmaPr = trackPos1.tpcTofNSigmaPr(); + valueTpcTofNSigmaPi = trackPos2.tpcTofNSigmaPi(); + } else { + chi2primProton = candidate.kfChi2PrimProng2(); + chi2primPion = candidate.kfChi2PrimProng0(); + dcaProtonKaon = candidate.kfDcaProng1Prong2(); + dcaPionKaon = candidate.kfDcaProng0Prong1(); + chi2GeoProtonKaon = candidate.kfChi2GeoProng1Prong2(); + chi2GeoPionKaon = candidate.kfChi2GeoProng0Prong1(); + mass = candidate.kfMassPiKP(); + valueTpcNSigmaPr = trackPos2.tpcNSigmaPr(); + valueTpcNSigmaPi = trackPos1.tpcNSigmaPi(); + valueTofNSigmaPr = trackPos2.tofNSigmaPr(); + valueTofNSigmaPi = trackPos1.tofNSigmaPi(); + valueTpcTofNSigmaPr = trackPos2.tpcTofNSigmaPr(); + valueTpcTofNSigmaPi = trackPos1.tpcTofNSigmaPi(); + } const float svX = candidate.xSecondaryVertex(); const float svY = candidate.ySecondaryVertex(); const float svZ = candidate.zSecondaryVertex(); @@ -623,18 +727,12 @@ struct HfTreeCreatorLcToPKPi { const float pvErrX = candidate.kfXPVError(); const float pvErrY = candidate.kfYPVError(); const float pvErrZ = candidate.kfZPVError(); - const float chi2primProton = CandFlag == 0 ? candidate.kfChi2PrimProng0() : candidate.kfChi2PrimProng2(); const float chi2primKaon = candidate.kfChi2PrimProng1(); - const float chi2primPion = CandFlag == 0 ? candidate.kfChi2PrimProng2() : candidate.kfChi2PrimProng0(); - const float dcaProtonKaon = CandFlag == 0 ? candidate.kfDcaProng0Prong1() : candidate.kfDcaProng1Prong2(); const float dcaProtonPion = candidate.kfDcaProng0Prong2(); - const float dcaPionKaon = CandFlag == 0 ? candidate.kfDcaProng1Prong2() : candidate.kfDcaProng0Prong1(); - const float chi2GeoProtonKaon = CandFlag == 0 ? candidate.kfChi2GeoProng0Prong1() : candidate.kfChi2GeoProng1Prong2(); const float chi2GeoProtonPion = candidate.kfChi2GeoProng0Prong2(); - const float chi2GeoPionKaon = CandFlag == 0 ? candidate.kfChi2GeoProng1Prong2() : candidate.kfChi2GeoProng0Prong1(); const float chi2Geo = candidate.kfChi2Geo(); const float chi2Topo = candidate.kfChi2Topo(); - const float l = candidate.kfDecayLength(); + const float decayLength = candidate.kfDecayLength(); const float dl = candidate.kfDecayLengthError(); const float pt = std::sqrt(candidate.kfPx() * candidate.kfPx() + candidate.kfPy() * candidate.kfPy()); const float deltaPt = std::sqrt(candidate.kfPx() * candidate.kfPx() * candidate.kfErrorPx() * candidate.kfErrorPx() + @@ -644,21 +742,30 @@ struct HfTreeCreatorLcToPKPi { const float deltaP = std::sqrt(pt * pt * deltaPt * deltaPt + candidate.kfPz() * candidate.kfPz() * candidate.kfErrorPz() * candidate.kfErrorPz()) / p; - const float t = l * MassLambdaCPlus / LightSpeedCm2PS / p; + const float lifetime = decayLength * MassLambdaCPlus / LightSpeedCm2PS / p; const float deltaT = dl * MassLambdaCPlus / LightSpeedCm2PS / p; - const float mass = CandFlag == 0 ? candidate.kfMassPKPi() : candidate.kfMassPiKP(); rowCandidateKF( svX, svY, svZ, svErrX, svErrY, svErrZ, pvErrX, pvErrY, pvErrZ, chi2primProton, chi2primKaon, chi2primPion, dcaProtonKaon, dcaProtonPion, dcaPionKaon, chi2GeoProtonKaon, chi2GeoProtonPion, chi2GeoPionKaon, - chi2Geo, chi2Topo, l, dl, l / dl, t, deltaT, + chi2Geo, chi2Topo, decayLength, dl, decayLength / dl, lifetime, deltaT, mass, p, pt, deltaP, deltaPt, - FunctionSelection, sigbgstatus); + functionSelection, sigbgstatus, + collision.multNTracksPV(), + valueTpcNSigmaPr, + valueTpcNSigmaKa, + valueTpcNSigmaPi, + valueTofNSigmaPr, + valueTofNSigmaKa, + valueTofNSigmaPi, + valueTpcTofNSigmaPr, + valueTpcTofNSigmaKa, + valueTpcTofNSigmaPi); } if (fillCandidateMcTable) { - float p, pt, svX, svY, svZ, pvX, pvY, pvZ, l, t; + float p, pt, svX, svY, svZ, pvX, pvY, pvZ, decayLength, lifetime; if (!isMcCandidateSignal) { p = UndefValueFloat; pt = UndefValueFloat; @@ -668,8 +775,8 @@ struct HfTreeCreatorLcToPKPi { pvX = UndefValueFloat; pvY = UndefValueFloat; pvZ = UndefValueFloat; - l = UndefValueFloat; - t = UndefValueFloat; + decayLength = UndefValueFloat; + lifetime = UndefValueFloat; } else { auto mcParticleProng0 = candidate.template prong0_as>().template mcParticle_as>(); auto indexMother = RecoDecay::getMother(particles, mcParticleProng0, o2::constants::physics::Pdg::kLambdaCPlus, true); @@ -685,12 +792,12 @@ struct HfTreeCreatorLcToPKPi { svX = mcParticleProng0.vx(); svY = mcParticleProng0.vy(); svZ = mcParticleProng0.vz(); - l = std::sqrt((svX - pvX) * (svX - pvX) + (svY - pvY) * (svY - pvY) + (svZ - pvZ) * (svZ - pvZ)); - t = mcParticleProng0.vt() * NanoToPico / gamma; // from ns to ps * from lab time to proper time + decayLength = RecoDecay::distance(std::array{svX, svY, svZ}, std::array{pvX, pvY, pvZ}); + lifetime = mcParticleProng0.vt() * NanoToPico / gamma; // from ns to ps * from lab time to proper time } rowCandidateMC( p, pt, - svX, svY, svZ, l, t, + svX, svY, svZ, decayLength, lifetime, pvX, pvY, pvZ); } } @@ -704,13 +811,29 @@ struct HfTreeCreatorLcToPKPi { rowCandidateFullParticles.reserve(particles.size()); for (const auto& particle : particles) { if (std::abs(particle.flagMcMatchGen()) == 1 << aod::hf_cand_3prong::DecayType::LcToPKPi) { + auto mcDaughter0 = particle.template daughters_as>().begin(); + auto mcCollision = particle.template mcCollision_as(); + auto p = particle.p(); + const float p2m = p / MassLambdaCPlus; + const float gamma = std::sqrt(1 + p2m * p2m); // mother's particle Lorentz factor + const float pvX = mcCollision.posX(); + const float pvY = mcCollision.posY(); + const float pvZ = mcCollision.posZ(); + const float svX = mcDaughter0.vx(); + const float svY = mcDaughter0.vy(); + const float svZ = mcDaughter0.vz(); + const float l = RecoDecay::distance(std::array{svX, svY, svZ}, std::array{pvX, pvY, pvZ}); + const float t = mcDaughter0.vt() * NanoToPico / gamma; // from ns to ps * from lab time to proper time rowCandidateFullParticles( particle.pt(), particle.eta(), particle.phi(), RecoDecay::y(particle.pVector(), o2::constants::physics::MassLambdaCPlus), particle.flagMcMatchGen(), - particle.originMcGen()); + particle.originMcGen(), + p, + svX, svY, svZ, l, t, + pvX, pvY, pvZ); } } } @@ -722,7 +845,7 @@ struct HfTreeCreatorLcToPKPi { /// \param particles Generated particle table /// \param tracks Track table /// \param bcs Bunch-crossing table - void processMcNoCentralityWithDCAFitterN(soa::Join const& collisions, + void processMcNoCentralityWithDCAFitterN(soa::Join const& collisions, aod::McCollisions const& mcCollisions, soa::Join const& candidates, soa::Join const& particles, @@ -738,7 +861,7 @@ struct HfTreeCreatorLcToPKPi { /// \param candidates Lc->pKpi candidate table /// \param tracks Track table /// \param bcs Bunch-crossing table - void processMcWithCentralityWithDCAFitterN(soa::Join const& collisions, + void processMcWithCentralityWithDCAFitterN(soa::Join const& collisions, aod::McCollisions const& mcCollisions, soa::Join const& candidates, soa::Join const& particles, @@ -755,7 +878,7 @@ struct HfTreeCreatorLcToPKPi { /// \param particles Generated particle table /// \param tracks Track table /// \param bcs Bunch-crossing table - void processMcNoCentralityWithKFParticle(soa::Join const& collisions, + void processMcNoCentralityWithKFParticle(soa::Join const& collisions, aod::McCollisions const& mcCollisions, soa::Join const& candidates, soa::Join const& particles, @@ -771,7 +894,7 @@ struct HfTreeCreatorLcToPKPi { /// \param candidates Lc->pKpi candidate table /// \param tracks Track table /// \param bcs Bunch-crossing table - void processMcWithCentralityWithKFParticle(soa::Join const& collisions, + void processMcWithCentralityWithKFParticle(soa::Join const& collisions, aod::McCollisions const& mcCollisions, soa::Join const& candidates, soa::Join const& particles, @@ -814,6 +937,12 @@ struct HfTreeCreatorLcToPKPi { collision.posX(), collision.posY(), collision.posZ(), + std::sqrt(collision.covXX()), + std::sqrt(collision.covYY()), + std::sqrt(collision.covZZ()), + UndefValueFloat, + UndefValueFloat, + UndefValueFloat, 0, collision.bc().runNumber(), centFT0A, @@ -821,7 +950,8 @@ struct HfTreeCreatorLcToPKPi { centFT0M, centFV0A, centFDDM, - collision.multZeqNTracksPV()); + collision.multZeqNTracksPV(), + collision.multNTracksPV()); } // Filling candidate properties @@ -842,21 +972,22 @@ struct HfTreeCreatorLcToPKPi { auto trackPos1 = candidate.template prong0_as(); // positive daughter (negative for the antiparticles) auto trackNeg = candidate.template prong1_as(); // negative daughter (positive for the antiparticles) auto trackPos2 = candidate.template prong2_as(); // positive daughter (negative for the antiparticles) - auto fillTable = [&](int CandFlag) { + auto collision = candidate.template collision_as(); + auto fillTable = [&](int candFlag) { double pseudoRndm = trackPos1.pt() * 1000. - static_cast(trackPos1.pt() * 1000); - const int FunctionSelection = CandFlag == 0 ? candidate.isSelLcToPKPi() : candidate.isSelLcToPiKP(); - if (FunctionSelection >= selectionFlagLc && (candidate.pt() > downSampleBkgPtMax || (pseudoRndm < downSampleBkgFactor && candidate.pt() < downSampleBkgPtMax))) { - float FunctionInvMass, FunctionInvMassKPi; + const int functionSelection = candFlag == 0 ? candidate.isSelLcToPKPi() : candidate.isSelLcToPiKP(); + if (functionSelection >= selectionFlagLc && (candidate.pt() > downSampleBkgPtMax || (pseudoRndm < downSampleBkgFactor && candidate.pt() < downSampleBkgPtMax))) { + float functionInvMass, functionInvMassKPi; if constexpr (reconstructionType == aod::hf_cand::VertexerType::DCAFitter) { - FunctionInvMass = CandFlag == 0 ? hfHelper.invMassLcToPKPi(candidate) : hfHelper.invMassLcToPiKP(candidate); - FunctionInvMassKPi = CandFlag == 0 ? hfHelper.invMassKPiPairLcToPKPi(candidate) : hfHelper.invMassKPiPairLcToPiKP(candidate); + functionInvMass = candFlag == 0 ? hfHelper.invMassLcToPKPi(candidate) : hfHelper.invMassLcToPiKP(candidate); + functionInvMassKPi = candFlag == 0 ? hfHelper.invMassKPiPairLcToPKPi(candidate) : hfHelper.invMassKPiPairLcToPiKP(candidate); } else { - FunctionInvMass = CandFlag == 0 ? candidate.kfMassPKPi() : candidate.kfMassPiKP(); - FunctionInvMassKPi = CandFlag == 0 ? candidate.kfMassKPi() : candidate.kfMassPiK(); + functionInvMass = candFlag == 0 ? candidate.kfMassPKPi() : candidate.kfMassPiKP(); + functionInvMassKPi = candFlag == 0 ? candidate.kfMassKPi() : candidate.kfMassPiK(); } - const float FunctionCt = hfHelper.ctLc(candidate); - const float FunctionY = hfHelper.yLc(candidate); - const float FunctionE = hfHelper.eLc(candidate); + const float functionCt = hfHelper.ctLc(candidate); + const float functionY = hfHelper.yLc(candidate); + const float functionE = hfHelper.eLc(candidate); if (fillCandidateLiteTable) { rowCandidateLite( candidate.posX(), @@ -888,20 +1019,20 @@ struct HfTreeCreatorLcToPKPi { trackNeg.tpcTofNSigmaKa(), trackPos2.tpcTofNSigmaPi(), trackPos2.tpcTofNSigmaPr(), - 1 << CandFlag, - FunctionInvMass, + 1 << candFlag, + functionInvMass, candidate.pt(), candidate.cpa(), candidate.cpaXY(), - FunctionCt, + functionCt, candidate.eta(), candidate.phi(), - FunctionY, + functionY, 0., 0., 0., -1, - FunctionInvMassKPi); + functionInvMassKPi); if (fillCollIdTable) { /// save also candidate collision indices @@ -966,44 +1097,83 @@ struct HfTreeCreatorLcToPKPi { trackNeg.tpcTofNSigmaKa(), trackPos2.tpcTofNSigmaPi(), trackPos2.tpcTofNSigmaPr(), - 1 << CandFlag, - FunctionInvMass, + 1 << candFlag, + functionInvMass, candidate.pt(), candidate.p(), candidate.cpa(), candidate.cpaXY(), - FunctionCt, + functionCt, candidate.eta(), candidate.phi(), - FunctionY, - FunctionE, + functionY, + functionE, 0., 0., 0., candidate.globalIndex(), -1, - FunctionInvMassKPi); + functionInvMassKPi); } if constexpr (reconstructionType == aod::hf_cand::VertexerType::KfParticle) { - const float X = candidate.xSecondaryVertex(); - const float Y = candidate.ySecondaryVertex(); - const float Z = candidate.zSecondaryVertex(); - const float ErrX = candidate.kfXError(); - const float ErrY = candidate.kfYError(); - const float ErrZ = candidate.kfZError(); - const float ErrPVX = candidate.kfXPVError(); - const float ErrPVY = candidate.kfYPVError(); - const float ErrPVZ = candidate.kfZPVError(); - const float chi2prim_proton = CandFlag == 0 ? candidate.kfChi2PrimProng0() : candidate.kfChi2PrimProng2(); - const float chi2prim_kaon = candidate.kfChi2PrimProng1(); - const float chi2prim_pion = CandFlag == 0 ? candidate.kfChi2PrimProng2() : candidate.kfChi2PrimProng0(); - const float dca_proton_kaon = CandFlag == 0 ? candidate.kfDcaProng0Prong1() : candidate.kfDcaProng1Prong2(); - const float dca_proton_pion = candidate.kfDcaProng0Prong2(); - const float dca_pion_kaon = CandFlag == 0 ? candidate.kfDcaProng1Prong2() : candidate.kfDcaProng0Prong1(); - const float chi2Geo_proton_kaon = CandFlag == 0 ? candidate.kfChi2GeoProng0Prong1() : candidate.kfChi2GeoProng1Prong2(); - const float chi2Geo_proton_pion = candidate.kfChi2GeoProng0Prong2(); - const float chi2Geo_pion_kaon = CandFlag == 0 ? candidate.kfChi2GeoProng1Prong2() : candidate.kfChi2GeoProng0Prong1(); + float chi2primProton; + float chi2primPion; + float dcaProtonKaon; + float dcaPionKaon; + float chi2GeoProtonKaon; + float chi2GeoPionKaon; + float mass; + float valueTpcNSigmaPr; + const float valueTpcNSigmaKa = trackNeg.tpcNSigmaKa(); + float valueTpcNSigmaPi; + float valueTofNSigmaPr; + const float valueTofNSigmaKa = trackNeg.tofNSigmaKa(); + float valueTofNSigmaPi; + float valueTpcTofNSigmaPr; + const float valueTpcTofNSigmaKa = trackNeg.tpcTofNSigmaKa(); + float valueTpcTofNSigmaPi; + if (candFlag == 0) { + chi2primProton = candidate.kfChi2PrimProng0(); + chi2primPion = candidate.kfChi2PrimProng2(); + dcaProtonKaon = candidate.kfDcaProng0Prong1(); + dcaPionKaon = candidate.kfDcaProng1Prong2(); + chi2GeoProtonKaon = candidate.kfChi2GeoProng0Prong1(); + chi2GeoPionKaon = candidate.kfChi2GeoProng1Prong2(); + mass = candidate.kfMassPKPi(); + valueTpcNSigmaPr = trackPos1.tpcNSigmaPr(); + valueTpcNSigmaPi = trackPos2.tpcNSigmaPi(); + valueTofNSigmaPr = trackPos1.tofNSigmaPr(); + valueTofNSigmaPi = trackPos2.tofNSigmaPi(); + valueTpcTofNSigmaPr = trackPos1.tpcTofNSigmaPr(); + valueTpcTofNSigmaPi = trackPos2.tpcTofNSigmaPi(); + } else { + chi2primProton = candidate.kfChi2PrimProng2(); + chi2primPion = candidate.kfChi2PrimProng0(); + dcaProtonKaon = candidate.kfDcaProng1Prong2(); + dcaPionKaon = candidate.kfDcaProng0Prong1(); + chi2GeoProtonKaon = candidate.kfChi2GeoProng1Prong2(); + chi2GeoPionKaon = candidate.kfChi2GeoProng0Prong1(); + mass = candidate.kfMassPiKP(); + valueTpcNSigmaPr = trackPos2.tpcNSigmaPr(); + valueTpcNSigmaPi = trackPos1.tpcNSigmaPi(); + valueTofNSigmaPr = trackPos2.tofNSigmaPr(); + valueTofNSigmaPi = trackPos1.tofNSigmaPi(); + valueTpcTofNSigmaPr = trackPos2.tpcTofNSigmaPr(); + valueTpcTofNSigmaPi = trackPos1.tpcTofNSigmaPi(); + } + const float x = candidate.xSecondaryVertex(); + const float y = candidate.ySecondaryVertex(); + const float z = candidate.zSecondaryVertex(); + const float errX = candidate.kfXError(); + const float errY = candidate.kfYError(); + const float errZ = candidate.kfZError(); + const float errPVX = candidate.kfXPVError(); + const float errPVY = candidate.kfYPVError(); + const float errPVZ = candidate.kfZPVError(); + const float chi2primKaon = candidate.kfChi2PrimProng1(); + const float dcaProtonPion = candidate.kfDcaProng0Prong2(); + const float chi2GeoProtonPion = candidate.kfChi2GeoProng0Prong2(); const float chi2Geo = candidate.kfChi2Geo(); const float chi2Topo = candidate.kfChi2Topo(); const float l = candidate.kfDecayLength(); @@ -1016,18 +1186,27 @@ struct HfTreeCreatorLcToPKPi { const float deltaP = std::sqrt(pt * pt * deltaPt * deltaPt + candidate.kfPz() * candidate.kfPz() * candidate.kfErrorPz() * candidate.kfErrorPz()) / p; - const float T = l * MassLambdaCPlus / LightSpeedCm2PS / p; + const float t = l * MassLambdaCPlus / LightSpeedCm2PS / p; const float deltaT = dl * MassLambdaCPlus / LightSpeedCm2PS / p; - const float mass = CandFlag == 0 ? candidate.kfMassPKPi() : candidate.kfMassPiKP(); rowCandidateKF( - X, Y, Z, ErrX, ErrY, ErrZ, - ErrPVX, ErrPVY, ErrPVZ, - chi2prim_proton, chi2prim_kaon, chi2prim_pion, - dca_proton_kaon, dca_proton_pion, dca_pion_kaon, - chi2Geo_proton_kaon, chi2Geo_proton_pion, chi2Geo_pion_kaon, - chi2Geo, chi2Topo, l, dl, l / dl, T, deltaT, + x, y, z, errX, errY, errZ, + errPVX, errPVY, errPVZ, + chi2primProton, chi2primKaon, chi2primPion, + dcaProtonKaon, dcaProtonPion, dcaPionKaon, + chi2GeoProtonKaon, chi2GeoProtonPion, chi2GeoPionKaon, + chi2Geo, chi2Topo, l, dl, l / dl, t, deltaT, mass, p, pt, deltaP, deltaPt, - FunctionSelection, UndefValueInt); + functionSelection, UndefValueInt, + collision.multNTracksPV(), + valueTpcNSigmaPr, + valueTpcNSigmaKa, + valueTpcNSigmaPi, + valueTofNSigmaPr, + valueTofNSigmaKa, + valueTofNSigmaPi, + valueTpcTofNSigmaPr, + valueTpcTofNSigmaKa, + valueTpcTofNSigmaPi); } } }; @@ -1042,7 +1221,7 @@ struct HfTreeCreatorLcToPKPi { /// \param candidates Lc->pKpi candidate table /// \param tracks Track table /// \param bcs Bunch-crossing table - void processDataNoCentralityWithDCAFitterN(soa::Join const& collisions, + void processDataNoCentralityWithDCAFitterN(soa::Join const& collisions, soa::Join const& candidates, TracksWPid const& tracks, aod::BCs const& bcs) { @@ -1055,7 +1234,7 @@ struct HfTreeCreatorLcToPKPi { /// \param candidates Lc->pKpi candidate table /// \param tracks Track table /// \param bcs Bunch-crossing table - void processDataWithCentralityWithDCAFitterN(soa::Join const& collisions, + void processDataWithCentralityWithDCAFitterN(soa::Join const& collisions, soa::Join const& candidates, TracksWPid const& tracks, aod::BCs const& bcs) { @@ -1068,7 +1247,7 @@ struct HfTreeCreatorLcToPKPi { /// \param candidates Lc->pKpi candidate table /// \param tracks Track table /// \param bcs Bunch-crossing table - void processDataNoCentralityWithKFParticle(soa::Join const& collisions, + void processDataNoCentralityWithKFParticle(soa::Join const& collisions, soa::Join const& candidates, TracksWPid const& tracks, aod::BCs const& bcs) { @@ -1081,7 +1260,7 @@ struct HfTreeCreatorLcToPKPi { /// \param candidates Lc->pKpi candidate table /// \param tracks Track table /// \param bcs Bunch-crossing table - void processDataWithCentralityWithKFParticle(soa::Join const& collisions, + void processDataWithCentralityWithKFParticle(soa::Join const& collisions, soa::Join const& candidates, TracksWPid const& tracks, aod::BCs const& bcs) { From 74ecb8f57748a5c3b09b15af4470446a870033cb Mon Sep 17 00:00:00 2001 From: Katarzyna <116073883+kgwizdzi@users.noreply.github.com> Date: Thu, 24 Apr 2025 15:44:00 +0200 Subject: [PATCH 1084/1650] [PWGCF] FemtoUniverse - update in efficiency task (#10970) --- .../Tasks/femtoUniverseEfficiencyBase.cxx | 320 ++++++++++-------- 1 file changed, 176 insertions(+), 144 deletions(-) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniverseEfficiencyBase.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniverseEfficiencyBase.cxx index cad94a05c60..42605c6c059 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniverseEfficiencyBase.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniverseEfficiencyBase.cxx @@ -30,65 +30,89 @@ using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::soa; -struct femtoUniverseEfficiencyBase { +struct FemtoUniverseEfficiencyBase { SliceCache cache; using FemtoFullParticles = soa::Join; Preslice perCol = aod::femtouniverseparticle::fdCollisionId; - Configurable ConfIsDebug{"ConfIsDebug", true, "Enable debug histograms"}; + Configurable confIsDebug{"confIsDebug", true, "Enable debug histograms"}; // Collisions - Configurable ConfZVertex{"ConfZVertex", 10.f, "Event sel: Maximum z-Vertex (cm)"}; + Configurable confZVertex{"confZVertex", 10.f, "Event sel: Maximum z-Vertex (cm)"}; - Filter collisionFilter = (nabs(aod::collision::posZ) < ConfZVertex); + Filter collisionFilter = (nabs(aod::collision::posZ) < confZVertex); using FilteredFDCollisions = soa::Filtered; using FilteredFDCollision = FilteredFDCollisions::iterator; /// Particle selection part /// Configurables for both particles - ConfigurableAxis ConfTempFitVarpTBins{"ConfTempFitVarpTBins", {20, 0.5, 4.05}, "Binning of the pT in the pT vs. TempFitVar plot"}; - ConfigurableAxis ConfTempFitVarPDGBins{"ConfTempFitVarPDGBins", {6000, -2300, 2300}, "Binning of the PDG code in the pT vs. TempFitVar plot"}; - ConfigurableAxis ConfTempFitVarCPABins{"ConfTempFitVarCPABins", {1000, 0.9, 1}, "Binning of the pointing angle cosinus in the pT vs. TempFitVar plot"}; - ConfigurableAxis ConfTempFitVarDCABins{"ConfTempFitVarDCABins", {1000, -5, 5}, "Binning of the PDG code in the pT vs. TempFitVar plot"}; + ConfigurableAxis confTempFitVarpTBins{"confTempFitVarpTBins", {20, 0.5, 4.05}, "Binning of the pT in the pT vs. TempFitVar plot"}; + ConfigurableAxis confTempFitVarPDGBins{"confTempFitVarPDGBins", {6000, -2300, 2300}, "Binning of the PDG code in the pT vs. TempFitVar plot"}; + ConfigurableAxis confTempFitVarCPABins{"confTempFitVarCPABins", {1000, 0.9, 1}, "Binning of the pointing angle cosinus in the pT vs. TempFitVar plot"}; + ConfigurableAxis confTempFitVarDCABins{"confTempFitVarDCABins", {1000, -5, 5}, "Binning of the PDG code in the pT vs. TempFitVar plot"}; struct : o2::framework::ConfigurableGroup { - Configurable ConfEtaMax{"ConfEtaMax", 0.8f, "Higher limit for |Eta| (the same for both particles)"}; - Configurable ConfMomProton{"ConfMomProton", 0.75, "Momentum threshold for proton identification using TOF"}; - Configurable ConfMomPion{"ConfMomPion", 0.75, "Momentum threshold for pion identification using TOF"}; - Configurable ConfNsigmaCombinedProton{"ConfNsigmaCombinedProton", 3.0, "TPC and TOF Proton Sigma (combined) for momentum > ConfMomProton"}; - Configurable ConfNsigmaTPCProton{"ConfNsigmaTPCProton", 3.0, "TPC Proton Sigma for momentum < ConfMomProton"}; - Configurable ConfNsigmaCombinedPion{"ConfNsigmaCombinedPion", 3.0, "TPC and TOF Pion Sigma (combined) for momentum > ConfMomPion"}; - Configurable ConfNsigmaTPCPion{"ConfNsigmaTPCPion", 3.0, "TPC Pion Sigma for momentum < ConfMomPion"}; + Configurable confEtaMax{"confEtaMax", 0.8f, "Higher limit for |Eta| (the same for both particles)"}; + Configurable confMomProton{"confMomProton", 0.75, "Momentum threshold for proton identification using TOF"}; + Configurable confMomPion{"confMomPion", 0.75, "Momentum threshold for pion identification using TOF"}; + Configurable confNsigmaCombinedProton{"confNsigmaCombinedProton", 3.0, "TPC and TOF Proton Sigma (combined) for momentum > confMomProton"}; + Configurable confNsigmaTPCProton{"confNsigmaTPCProton", 3.0, "TPC Proton Sigma for momentum < confMomProton"}; + Configurable confNsigmaCombinedPion{"confNsigmaCombinedPion", 3.0, "TPC and TOF Pion Sigma (combined) for momentum > confMomPion"}; + Configurable confNsigmaTPCPion{"confNsigmaTPCPion", 3.0, "TPC Pion Sigma for momentum < confMomPion"}; } ConfBothTracks; /// Lambda cuts - Configurable ConfV0InvMassLowLimit{"ConfV0InvV0MassLowLimit", 1.10, "Lower limit of the V0 invariant mass"}; - Configurable ConfV0InvMassUpLimit{"ConfV0InvV0MassUpLimit", 1.13, "Upper limit of the V0 invariant mass"}; + Configurable confV0InvMassLowLimit{"confV0InvMassLowLimit", 1.10, "Lower limit of the V0 invariant mass"}; + Configurable confV0InvMassUpLimit{"confV0InvMassUpLimit", 1.13, "Upper limit of the V0 invariant mass"}; /// Kaon configurable - Configurable IsKaonRun2{"IsKaonRun2", false, "Enable kaon selection used in Run2"}; // to check consistency with Run2 results + Configurable isKaonRun2{"isKaonRun2", false, "Enable kaon selection used in Run2"}; // to check consistency with Run2 results + struct : o2::framework::ConfigurableGroup { + // Momentum thresholds for Run2 and Run3 + Configurable confMomKaonRun2{"confMomKaonRun2", 0.4, "Momentum threshold for kaon identification using ToF (Run2)"}; + Configurable confMomKaonRun3{"confMomKaonRun3", 0.3, "Momentum threshold for kaon identification using ToF (Run3)"}; + Configurable confMomKaon045{"confMomKaon045", 0.45, "Momentum threshold for kaon identification pT = 0.45 GeV/c"}; + Configurable confMomKaon055{"confMomKaon055", 0.55, "Momentum threshold for kaon identification pT = 0.55 GeV/c"}; + Configurable confMomKaon08{"confMomKaon08", 0.8, "Momentum threshold for kaon identification pT = 0.8 GeV/c"}; + Configurable confMomKaon15{"confMomKaon15", 1.5, "Momentum threshold for kaon identification pT = 1.5 GeV/c"}; + // n sigma cuts for Run 2 + Configurable confKaonNsigmaTPCbelow04Run2{"confKaonNsigmaTPCbelow04Run2", 2.0, "Reject kaons with pT below 0.4 if TPC n sigma is above this value."}; + Configurable confKaonNsigmaTPCfrom04to045Run2{"confKaonNsigmaTPCfrom04to045Run2", 1.0, "Reject kaons within pT from 0.4 to 0.45 if TPC n sigma is above this value."}; + Configurable confKaonNsigmaTPCfrom045to08Run2{"confKaonNsigmaTPCfrom045to08Run2", 3.0, "Reject kaons within pT from 0.45 to 0.8 if TPC n sigma is above this value."}; + Configurable confKaonNsigmaTOFfrom045to08Run2{"confKaonNsigmaTOFfrom045to08Run2", 2.0, "Reject kaons within pT from 0.45 to 0.8 if ToF n sigma is above this value."}; + Configurable confKaonNsigmaTPCfrom08to15Run2{"confKaonNsigmaTPCfrom08to15Run2", 3.0, "Reject kaons within pT from 0.8 to 1.5 if TPC n sigma is above this value."}; + Configurable confKaonNsigmaTOFfrom08to15Run2{"confKaonNsigmaTOFfrom08to15Run2", 1.5, "Reject kaons within pT from 0.8 to 1.5 if ToF n sigma is above this value."}; + // n sigma cuts for Run 3 + Configurable confKaonNsigmaTPCfrom0to03{"confKaonNsigmaTPCfrom0to03", 3.0, "Reject kaons within pT from 0.0 to 0.3 if TPC n sigma is above this value."}; + Configurable confKaonNsigmaTPCfrom03to045{"confKaonNsigmaTPCfrom03to045", 2.0, "Reject kaons within pT from 0.3 to 0.45 if TPC n sigma is above this value."}; + Configurable confKaonNsigmaTPCfrom045to055{"confKaonNsigmaTPCfrom045to055", 1.0, "Reject kaons within pT from 0.45 to 0.55 if TPC n sigma is above this value."}; + Configurable confKaonNsigmaTPCfrom055to15{"confKaonNsigmaTPCfrom055to15", 3.0, "Reject kaons within pT from 0.55 to 1.5 if TPC n sigma is above this value."}; + Configurable confKaonNsigmaTOFfrom055to15{"confKaonNsigmaTOFfrom055to15", 3.0, "Reject kaons within pT from 0.55 to 1.5 if ToF n sigma is above this value."}; + Configurable confKaonNsigmaTPCfrom15{"confKaonNsigmaTPCfrom15", 3.0, "Reject kaons with pT above 1.5 if TPC n sigma is above this value."}; + Configurable confKaonNsigmaTOFfrom15{"confKaonNsigmaTOFfrom15", 2.0, "Reject kaons with pT above 1.5 if ToF n sigma is above this value.."}; + } ConfKaonSelection; /// Deuteron configurables struct : o2::framework::ConfigurableGroup { - Configurable ConfNsigmaTPCDe{"ConfNsigmaTPCDe", 2.0f, "TPC Deuteron Sigma for momentum < ConfTOFpMinDe"}; - Configurable ConfNsigmaTOFDe{"ConfNsigmaTOFDe", 2.0f, "TOF Deuteron Sigma"}; - Configurable ConfTOFpMinDe{"ConfTOFpMinDe", 0.5f, "Min. momentum for deuterons for which TOF is required for PID"}; - Configurable ConfPLowDe{"ConfPLowDe", 0.8f, "Lower limit for momentum for deuterons"}; - Configurable ConfPHighDe{"ConfPHighDe", 1.8f, "Higher limit for momentum for deuterons"}; + Configurable confNsigmaTPCDe{"confNsigmaTPCDe", 2.0f, "TPC Deuteron Sigma for momentum < confTOFpMinDe"}; + Configurable confNsigmaTOFDe{"confNsigmaTOFDe", 2.0f, "TOF Deuteron Sigma"}; + Configurable confTOFpMinDe{"confTOFpMinDe", 0.5f, "Min. momentum for deuterons for which TOF is required for PID"}; + Configurable confPLowDe{"confPLowDe", 0.8f, "Lower limit for momentum for deuterons"}; + Configurable confPHighDe{"confPHighDe", 1.8f, "Higher limit for momentum for deuterons"}; } deuteronconfigs; /// Particle 1 - Configurable ConfPDGCodePartOne{"ConfPDGCodePartOne", 2212, "Particle 1 - PDG code"}; - Configurable ConfParticleTypePartOne{"ConfParticleTypePartOne", aod::femtouniverseparticle::ParticleType::kTrack, "Particle 1 - particle type: 0 - track, 2 - V0, 6 - phi"}; - Configurable ConfNoPDGPartOne{"ConfNoPDGPartOne", false, "0: selecting part one by PDG, 1: no PID selection"}; - Configurable ConfPtLowPart1{"ConfPtLowPart1", 0.2, "Lower limit for Pt for the first particle"}; - Configurable ConfPtHighPart1{"ConfPtHighPart1", 2.5, "Higher limit for Pt for the first particle"}; - Configurable ConfChargePart1{"ConfChargePart1", 1, "Charge of the first particle"}; + Configurable confPDGCodePartOne{"confPDGCodePartOne", 2212, "Particle 1 - PDG code"}; + Configurable confParticleTypePartOne{"confParticleTypePartOne", aod::femtouniverseparticle::ParticleType::kTrack, "Particle 1 - particle type: 0 - track, 2 - V0, 6 - phi"}; + Configurable confNoPDGPartOne{"confNoPDGPartOne", false, "0: selecting part one by PDG, 1: no PID selection"}; + Configurable confPtLowPart1{"confPtLowPart1", 0.2, "Lower limit for Pt for the first particle"}; + Configurable confPtHighPart1{"confPtHighPart1", 2.5, "Higher limit for Pt for the first particle"}; + Configurable confChargePart1{"confChargePart1", 1, "Charge of the first particle"}; /// Partition for particle 1 - Partition partsOneMCGen = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kMCTruthTrack)) && aod::femtouniverseparticle::pt < ConfPtHighPart1 && aod::femtouniverseparticle::pt > ConfPtLowPart1&& nabs(aod::femtouniverseparticle::eta) < ConfBothTracks.ConfEtaMax; + Partition partsOneMCGen = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kMCTruthTrack)) && (aod::femtouniverseparticle::pt < confPtHighPart1) && (aod::femtouniverseparticle::pt > confPtLowPart1) && (nabs(aod::femtouniverseparticle::eta) < ConfBothTracks.confEtaMax); - Partition partsTrackOneMCReco = aod::femtouniverseparticle::pt < ConfPtHighPart1 && aod::femtouniverseparticle::pt > ConfPtLowPart1&& nabs(aod::femtouniverseparticle::eta) < ConfBothTracks.ConfEtaMax; + Partition partsTrackOneMCReco = (aod::femtouniverseparticle::pt < confPtHighPart1) && (aod::femtouniverseparticle::pt > confPtLowPart1) && (nabs(aod::femtouniverseparticle::eta) < ConfBothTracks.confEtaMax); /// Histogramming for particle 1 FemtoUniverseParticleHisto trackHistoPartOneGen; @@ -98,18 +122,18 @@ struct femtoUniverseEfficiencyBase { FemtoUniverseParticleHisto trackHistoV0OneChildNegRec; /// Particle 2 - Configurable ConfIsSame{"ConfIsSame", false, "Pairs of the same particle"}; - Configurable ConfPDGCodePartTwo{"ConfPDGCodePartTwo", 333, "Particle 2 - PDG code"}; - Configurable ConfParticleTypePartTwo{"ConfParticleTypePartTwo", aod::femtouniverseparticle::ParticleType::kTrack, "Particle 2 - particle type: 0 - track, 2 - V0, 6 - phi"}; - Configurable ConfNoPDGPartTwo{"ConfNoPDGPartTwo", false, "0: selecting part two by PDG, 1: no PID selection"}; - Configurable ConfPtLowPart2{"ConfPtLowPart2", 0.2, "Lower limit for Pt for the second particle"}; - Configurable ConfPtHighPart2{"ConfPtHighPart2", 2.5, "Higher limit for Pt for the second particle"}; - Configurable ConfChargePart2{"ConfChargePart2", 1, "Charge of the second particle"}; + Configurable confIsSame{"confIsSame", false, "Pairs of the same particle"}; + Configurable confPDGCodePartTwo{"confPDGCodePartTwo", 333, "Particle 2 - PDG code"}; + Configurable confParticleTypePartTwo{"confParticleTypePartTwo", aod::femtouniverseparticle::ParticleType::kTrack, "Particle 2 - particle type: 0 - track, 2 - V0, 6 - phi"}; + Configurable confNoPDGPartTwo{"confNoPDGPartTwo", false, "0: selecting part two by PDG, 1: no PID selection"}; + Configurable confPtLowPart2{"confPtLowPart2", 0.2, "Lower limit for Pt for the second particle"}; + Configurable confPtHighPart2{"confPtHighPart2", 2.5, "Higher limit for Pt for the second particle"}; + Configurable confChargePart2{"confChargePart2", 1, "Charge of the second particle"}; /// Partition for particle 2 - Partition partsTwoGen = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kMCTruthTrack)) && aod::femtouniverseparticle::pt < ConfPtHighPart2 && aod::femtouniverseparticle::pt > ConfPtLowPart2&& nabs(aod::femtouniverseparticle::eta) < ConfBothTracks.ConfEtaMax; + Partition partsTwoMCGen = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kMCTruthTrack)) && (aod::femtouniverseparticle::pt < confPtHighPart2) && (aod::femtouniverseparticle::pt > confPtLowPart2) && (nabs(aod::femtouniverseparticle::eta) < ConfBothTracks.confEtaMax); - Partition partsTrackTwoMCReco = aod::femtouniverseparticle::pt < ConfPtHighPart2 && aod::femtouniverseparticle::pt > ConfPtLowPart2&& nabs(aod::femtouniverseparticle::eta) < ConfBothTracks.ConfEtaMax; + Partition partsTrackTwoMCReco = (aod::femtouniverseparticle::pt < confPtHighPart2) && (aod::femtouniverseparticle::pt > confPtLowPart2) && (nabs(aod::femtouniverseparticle::eta) < ConfBothTracks.confEtaMax); /// Histogramming for particle 2 FemtoUniverseParticleHisto trackHistoPartTwoGen; @@ -132,43 +156,43 @@ struct femtoUniverseEfficiencyBase { { eventHisto.init(&qaRegistry); - trackHistoPartOneGen.init(&qaRegistry, ConfTempFitVarpTBins, ConfTempFitVarPDGBins, 0, ConfPDGCodePartOne, false); - trackHistoPartOneRec.init(&qaRegistry, ConfTempFitVarpTBins, ConfTempFitVarDCABins, 0, ConfPDGCodePartOne, ConfIsDebug); + trackHistoPartOneGen.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarPDGBins, 0, confPDGCodePartOne, false); + trackHistoPartOneRec.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarDCABins, 0, confPDGCodePartOne, confIsDebug); registryMCOrigin.add("part1/hPt", " ;#it{p}_{T} (GeV/c); Entries", {HistType::kTH1F, {{240, 0, 6}}}); registryPDG.add("part1/PDGvspT", "PDG;#it{p}_{T} (GeV/c); PDG", {HistType::kTH2F, {{500, 0, 5}, {16001, -8000.5, 8000.5}}}); - if (ConfParticleTypePartOne == uint8_t(aod::femtouniverseparticle::ParticleType::kV0)) { - trackHistoV0OneRec.init(&qaRegistry, ConfTempFitVarpTBins, ConfTempFitVarCPABins, 0, ConfPDGCodePartOne, ConfIsDebug); - trackHistoV0OneChildPosRec.init(&qaRegistry, ConfTempFitVarpTBins, ConfTempFitVarDCABins, 0, 0, ConfIsDebug, "posChildV0_1"); - trackHistoV0OneChildNegRec.init(&qaRegistry, ConfTempFitVarpTBins, ConfTempFitVarDCABins, 0, 0, ConfIsDebug, "negChildV0_1"); + if (confParticleTypePartOne == uint8_t(aod::femtouniverseparticle::ParticleType::kV0)) { + trackHistoV0OneRec.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarCPABins, 0, confPDGCodePartOne, confIsDebug); + trackHistoV0OneChildPosRec.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarDCABins, 0, 0, confIsDebug, "posChildV0_1"); + trackHistoV0OneChildNegRec.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarDCABins, 0, 0, confIsDebug, "negChildV0_1"); registryPDG.add("part1/dpositive/PDGvspT", "PDG;#it{p}_{T} (GeV/c); PDG", {HistType::kTH2F, {{500, 0, 5}, {16001, -8000.5, 8000.5}}}); registryPDG.add("part1/dnegative/PDGvspT", "PDG;#it{p}_{T} (GeV/c); PDG", {HistType::kTH2F, {{500, 0, 5}, {16001, -8000.5, 8000.5}}}); } registryPDG.add("part2/PDGvspT", "PDG;#it{p}_{T} (GeV/c); PDG", {HistType::kTH2F, {{500, 0, 5}, {16001, -8000.5, 8000.5}}}); - if (!ConfIsSame) { - trackHistoPartTwoGen.init(&qaRegistry, ConfTempFitVarpTBins, ConfTempFitVarPDGBins, 0, ConfPDGCodePartTwo, false); - trackHistoPartTwoRec.init(&qaRegistry, ConfTempFitVarpTBins, ConfTempFitVarDCABins, 0, ConfPDGCodePartTwo, ConfIsDebug); + if (!confIsSame) { + trackHistoPartTwoGen.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarPDGBins, 0, confPDGCodePartTwo, false); + trackHistoPartTwoRec.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarDCABins, 0, confPDGCodePartTwo, confIsDebug); registryMCOrigin.add("part2/hPt", " ;#it{p}_{T} (GeV/c); Entries", {HistType::kTH1F, {{240, 0, 6}}}); - if (ConfParticleTypePartTwo == uint8_t(aod::femtouniverseparticle::ParticleType::kV0)) { - trackHistoV0TwoRec.init(&qaRegistry, ConfTempFitVarpTBins, ConfTempFitVarCPABins, 0, ConfPDGCodePartTwo, ConfIsDebug); - trackHistoV0TwoChildPosRec.init(&qaRegistry, ConfTempFitVarpTBins, ConfTempFitVarDCABins, 0, 0, ConfIsDebug, "posChildV0_2"); - trackHistoV0TwoChildNegRec.init(&qaRegistry, ConfTempFitVarpTBins, ConfTempFitVarDCABins, 0, 0, ConfIsDebug, "negChildV0_2"); + if (confParticleTypePartTwo == uint8_t(aod::femtouniverseparticle::ParticleType::kV0)) { + trackHistoV0TwoRec.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarCPABins, 0, confPDGCodePartTwo, confIsDebug); + trackHistoV0TwoChildPosRec.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarDCABins, 0, 0, confIsDebug, "posChildV0_2"); + trackHistoV0TwoChildNegRec.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarDCABins, 0, 0, confIsDebug, "negChildV0_2"); registryPDG.add("part2/dpositive/PDGvspT", "PDG;#it{p}_{T} (GeV/c); PDG", {HistType::kTH2F, {{500, 0, 5}, {16001, -8000.5, 8000.5}}}); registryPDG.add("part2/dnegative/PDGvspT", "PDG;#it{p}_{T} (GeV/c); PDG", {HistType::kTH2F, {{500, 0, 5}, {16001, -8000.5, 8000.5}}}); } } } - bool IsProtonNSigma(float mom, float nsigmaTPCPr, float nsigmaTOFPr) // previous version from: https://github.com/alisw/AliPhysics/blob/master/PWGCF/FEMTOSCOPY/AliFemtoUser/AliFemtoMJTrackCut.cxx + bool isProtonNSigma(float mom, float nsigmaTPCPr, float nsigmaTOFPr) // previous version from: https://github.com/alisw/AliPhysics/blob/master/PWGCF/FEMTOSCOPY/AliFemtoUser/AliFemtoMJTrackCut.cxx { - if (mom < ConfBothTracks.ConfMomProton) { - if (TMath::Abs(nsigmaTPCPr) < ConfBothTracks.ConfNsigmaTPCProton) { + if (mom < ConfBothTracks.confMomProton) { + if (std::abs(nsigmaTPCPr) < ConfBothTracks.confNsigmaTPCProton) { return true; } else { return false; } } else { - if (TMath::Hypot(nsigmaTOFPr, nsigmaTPCPr) < ConfBothTracks.ConfNsigmaCombinedProton) { + if (std::hypot(nsigmaTOFPr, nsigmaTPCPr) < ConfBothTracks.confNsigmaCombinedProton) { return true; } else { return false; @@ -177,49 +201,49 @@ struct femtoUniverseEfficiencyBase { return false; } - bool IsKaonNSigma(float mom, float nsigmaTPCK, float nsigmaTOFK) + bool isKaonNSigma(float mom, float nsigmaTPCK, float nsigmaTOFK) { - if (IsKaonRun2 == true) { - if (mom < 0.4) { - return TMath::Abs(nsigmaTPCK) < 2; - } else if (mom > 0.4 && mom < 0.45) { - return TMath::Abs(nsigmaTPCK) < 1; - } else if (mom > 0.45 && mom < 0.8) { - return (TMath::Abs(nsigmaTPCK) < 3 && TMath::Abs(nsigmaTOFK) < 2); - } else if (mom > 0.8 && mom < 1.5) { - return (TMath::Abs(nsigmaTPCK) < 3 && TMath::Abs(nsigmaTOFK) < 1.5); + if (isKaonRun2 == true) { + if (mom < ConfKaonSelection.confMomKaonRun2) { // < 0.4 GeV/c + return std::abs(nsigmaTPCK) < ConfKaonSelection.confKaonNsigmaTPCbelow04Run2; + } else if (mom > ConfKaonSelection.confMomKaonRun2 && mom < ConfKaonSelection.confMomKaon045) { // 0.4 - 0.45 + return std::abs(nsigmaTPCK) < ConfKaonSelection.confKaonNsigmaTPCfrom04to045Run2; + } else if (mom > ConfKaonSelection.confMomKaon045 && mom < ConfKaonSelection.confMomKaon08) { // 0.45 - 0.8 + return (std::abs(nsigmaTPCK) < ConfKaonSelection.confKaonNsigmaTPCfrom045to08Run2 && std::abs(nsigmaTOFK) < ConfKaonSelection.confKaonNsigmaTOFfrom045to08Run2); + } else if (mom > ConfKaonSelection.confMomKaon08 && mom < ConfKaonSelection.confMomKaon15) { // 0.8 - 1.5 + return (std::abs(nsigmaTPCK) < ConfKaonSelection.confKaonNsigmaTPCfrom08to15Run2 && std::abs(nsigmaTOFK) < ConfKaonSelection.confKaonNsigmaTOFfrom08to15Run2); } else { return false; } } else { - if (mom < 0.3) { // 0.0-0.3 - if (TMath::Abs(nsigmaTPCK) < 3.0) { + if (mom < ConfKaonSelection.confMomKaonRun3) { // 0.0-0.3 + if (std::abs(nsigmaTPCK) < ConfKaonSelection.confKaonNsigmaTPCfrom0to03) { return true; } else { return false; } - } else if (mom < 0.45) { // 0.30 - 0.45 - if (TMath::Abs(nsigmaTPCK) < 2.0) { + } else if (mom < ConfKaonSelection.confMomKaon045) { // 0.30 - 0.45 + if (std::abs(nsigmaTPCK) < ConfKaonSelection.confKaonNsigmaTPCfrom03to045) { return true; } else { return false; } - } else if (mom < 0.55) { // 0.45-0.55 - if (TMath::Abs(nsigmaTPCK) < 1.0) { + } else if (mom < ConfKaonSelection.confMomKaon055) { // 0.45-0.55 + if (std::abs(nsigmaTPCK) < ConfKaonSelection.confKaonNsigmaTPCfrom045to055) { return true; } else { return false; } - } else if (mom < 1.5) { // 0.55-1.5 (now we use TPC and TOF) - if ((TMath::Abs(nsigmaTOFK) < 3.0) && (TMath::Abs(nsigmaTPCK) < 3.0)) { + } else if (mom < ConfKaonSelection.confMomKaon15) { // 0.55-1.5 (now we use TPC and TOF) + if ((std::abs(nsigmaTOFK) < ConfKaonSelection.confKaonNsigmaTOFfrom055to15) && (std::abs(nsigmaTPCK) < ConfKaonSelection.confKaonNsigmaTPCfrom055to15)) { { return true; } } else { return false; } - } else if (mom > 1.5) { // 1.5 - - if ((TMath::Abs(nsigmaTOFK) < 2.0) && (TMath::Abs(nsigmaTPCK) < 3.0)) { + } else if (mom > ConfKaonSelection.confMomKaon15) { // > 1.5 GeV/c + if ((std::abs(nsigmaTOFK) < ConfKaonSelection.confKaonNsigmaTOFfrom15) && (std::abs(nsigmaTPCK) < ConfKaonSelection.confKaonNsigmaTPCfrom15)) { return true; } else { return false; @@ -230,16 +254,16 @@ struct femtoUniverseEfficiencyBase { } } - bool IsPionNSigma(float mom, float nsigmaTPCPi, float nsigmaTOFPi) + bool isPionNSigma(float mom, float nsigmaTPCPi, float nsigmaTOFPi) { - if (mom < ConfBothTracks.ConfMomPion) { - if (TMath::Abs(nsigmaTPCPi) < ConfBothTracks.ConfNsigmaTPCPion) { + if (mom < ConfBothTracks.confMomPion) { + if (std::abs(nsigmaTPCPi) < ConfBothTracks.confNsigmaTPCPion) { return true; } else { return false; } } else { - if (TMath::Hypot(nsigmaTOFPi, nsigmaTPCPi) < ConfBothTracks.ConfNsigmaCombinedPion) { + if (std::hypot(nsigmaTOFPi, nsigmaTPCPi) < ConfBothTracks.confNsigmaCombinedPion) { return true; } else { return false; @@ -248,37 +272,37 @@ struct femtoUniverseEfficiencyBase { return false; } - bool IsDeuteronNSigma(float mom, float nsigmaTPCDe, float nsigmaTOFDe) + bool isDeuteronNSigma(float mom, float nsigmaTPCDe, float nsigmaTOFDe) { - if (mom > deuteronconfigs.ConfPLowDe && mom < deuteronconfigs.ConfPHighDe) { - if (mom < deuteronconfigs.ConfTOFpMinDe) { - return (TMath::Abs(nsigmaTPCDe) < deuteronconfigs.ConfNsigmaTPCDe); + if (mom > deuteronconfigs.confPLowDe && mom < deuteronconfigs.confPHighDe) { + if (mom < deuteronconfigs.confTOFpMinDe) { + return (std::abs(nsigmaTPCDe) < deuteronconfigs.confNsigmaTPCDe); } else { - return (TMath::Abs(nsigmaTOFDe) < deuteronconfigs.ConfNsigmaTOFDe && (TMath::Abs(nsigmaTPCDe) < deuteronconfigs.ConfNsigmaTPCDe)); + return (std::abs(nsigmaTOFDe) < deuteronconfigs.confNsigmaTOFDe && (std::abs(nsigmaTPCDe) < deuteronconfigs.confNsigmaTPCDe)); } } else { return false; } } - bool IsParticleNSigma(int pdgCode, float mom, float nsigmaTPCPr, float nsigmaTOFPr, float nsigmaTPCPi, float nsigmaTOFPi, float nsigmaTPCK, float nsigmaTOFK, float nsigmaTPCDe, float nsigmaTOFDe) + bool isParticleNSigma(int pdgCode, float mom, float nsigmaTPCPr, float nsigmaTOFPr, float nsigmaTPCPi, float nsigmaTOFPi, float nsigmaTPCK, float nsigmaTOFK, float nsigmaTPCDe, float nsigmaTOFDe) { switch (pdgCode) { case 2212: // Proton case -2212: // anty Proton - return IsProtonNSigma(mom, nsigmaTPCPr, nsigmaTOFPr); + return isProtonNSigma(mom, nsigmaTPCPr, nsigmaTOFPr); break; case 211: // Pion case -211: // Pion- - return IsPionNSigma(mom, nsigmaTPCPi, nsigmaTOFPi); + return isPionNSigma(mom, nsigmaTPCPi, nsigmaTOFPi); break; case 321: // Kaon+ case -321: // Kaon- - return IsKaonNSigma(mom, nsigmaTPCK, nsigmaTOFK); + return isKaonNSigma(mom, nsigmaTPCK, nsigmaTOFK); break; case 1000010020: // Deuteron case -1000010020: // Antideuteron - return IsDeuteronNSigma(mom, nsigmaTPCDe, nsigmaTOFDe); + return isDeuteronNSigma(mom, nsigmaTPCDe, nsigmaTOFDe); break; default: return false; @@ -287,7 +311,7 @@ struct femtoUniverseEfficiencyBase { bool invMLambda(float invMassLambda, float invMassAntiLambda) { - if ((invMassLambda < ConfV0InvMassLowLimit || invMassLambda > ConfV0InvMassUpLimit) && (invMassAntiLambda < ConfV0InvMassLowLimit || invMassAntiLambda > ConfV0InvMassUpLimit)) { + if ((invMassLambda < confV0InvMassLowLimit || invMassLambda > confV0InvMassUpLimit) && (invMassAntiLambda < confV0InvMassLowLimit || invMassAntiLambda > confV0InvMassUpLimit)) { return false; } return true; @@ -308,16 +332,16 @@ struct femtoUniverseEfficiencyBase { void doMCGen(PartitionType grouppartsOneMCGen, PartitionType grouppartsTwoMCGen) { /// Histogramming same event - for (auto& part : grouppartsOneMCGen) { - if (!ConfNoPDGPartOne && part.tempFitVar() != ConfPDGCodePartOne) { + for (const auto& part : grouppartsOneMCGen) { + if (!confNoPDGPartOne && part.tempFitVar() != confPDGCodePartOne) { continue; } trackHistoPartOneGen.fillQA(part); } - if (!ConfIsSame) { - for (auto& part : grouppartsTwoMCGen) { - if (!ConfNoPDGPartTwo && part.tempFitVar() != ConfPDGCodePartTwo) { + if (!confIsSame) { + for (const auto& part : grouppartsTwoMCGen) { + if (!confNoPDGPartTwo && part.tempFitVar() != confPDGCodePartTwo) { continue; } trackHistoPartTwoGen.fillQA(part); @@ -335,8 +359,8 @@ struct femtoUniverseEfficiencyBase { void doMCRecTrackTrack(PartitionType grouppartsOneMCRec, PartitionType grouppartsTwoMCRec) { /// Histogramming same event - for (auto& part : grouppartsOneMCRec) { - if (part.partType() != ConfParticleTypePartOne || part.sign() != ConfChargePart1 || !IsParticleNSigma(ConfPDGCodePartOne, part.p(), trackCuts.getNsigmaTPC(part, o2::track::PID::Proton), trackCuts.getNsigmaTOF(part, o2::track::PID::Proton), trackCuts.getNsigmaTPC(part, o2::track::PID::Pion), trackCuts.getNsigmaTOF(part, o2::track::PID::Pion), trackCuts.getNsigmaTPC(part, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(part, o2::track::PID::Kaon), trackCuts.getNsigmaTPC(part, o2::track::PID::Deuteron), trackCuts.getNsigmaTOF(part, o2::track::PID::Deuteron))) { + for (const auto& part : grouppartsOneMCRec) { + if (part.partType() != confParticleTypePartOne || part.sign() != confChargePart1 || !isParticleNSigma(confPDGCodePartOne, part.p(), trackCuts.getNsigmaTPC(part, o2::track::PID::Proton), trackCuts.getNsigmaTOF(part, o2::track::PID::Proton), trackCuts.getNsigmaTPC(part, o2::track::PID::Pion), trackCuts.getNsigmaTOF(part, o2::track::PID::Pion), trackCuts.getNsigmaTPC(part, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(part, o2::track::PID::Kaon), trackCuts.getNsigmaTPC(part, o2::track::PID::Deuteron), trackCuts.getNsigmaTOF(part, o2::track::PID::Deuteron))) { continue; } trackHistoPartOneRec.fillQA(part); @@ -346,13 +370,17 @@ struct femtoUniverseEfficiencyBase { } const auto mcParticle = part.fdMCParticle(); + if (!(mcParticle.partOriginMCTruth() == aod::femtouniverse_mc_particle::ParticleOriginMCTruth::kPrimary)) { + continue; + } + registryPDG.fill(HIST("part1/PDGvspT"), part.pt(), mcParticle.pdgMCTruth()); registryMCOrigin.fill(HIST("part1/hPt"), mcParticle.pt()); } - if (!ConfIsSame) { - for (auto& part : grouppartsTwoMCRec) { - if (part.partType() != ConfParticleTypePartTwo || part.sign() != ConfChargePart2 || !IsParticleNSigma(ConfPDGCodePartTwo, part.p(), trackCuts.getNsigmaTPC(part, o2::track::PID::Proton), trackCuts.getNsigmaTOF(part, o2::track::PID::Proton), trackCuts.getNsigmaTPC(part, o2::track::PID::Pion), trackCuts.getNsigmaTOF(part, o2::track::PID::Pion), trackCuts.getNsigmaTPC(part, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(part, o2::track::PID::Kaon), trackCuts.getNsigmaTPC(part, o2::track::PID::Deuteron), trackCuts.getNsigmaTOF(part, o2::track::PID::Deuteron))) { + if (!confIsSame) { + for (const auto& part : grouppartsTwoMCRec) { + if (part.partType() != confParticleTypePartTwo || part.sign() != confChargePart2 || !isParticleNSigma(confPDGCodePartTwo, part.p(), trackCuts.getNsigmaTPC(part, o2::track::PID::Proton), trackCuts.getNsigmaTOF(part, o2::track::PID::Proton), trackCuts.getNsigmaTPC(part, o2::track::PID::Pion), trackCuts.getNsigmaTOF(part, o2::track::PID::Pion), trackCuts.getNsigmaTPC(part, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(part, o2::track::PID::Kaon), trackCuts.getNsigmaTPC(part, o2::track::PID::Deuteron), trackCuts.getNsigmaTOF(part, o2::track::PID::Deuteron))) { continue; } @@ -363,6 +391,10 @@ struct femtoUniverseEfficiencyBase { } const auto mcParticle = part.fdMCParticle(); + if (!(mcParticle.partOriginMCTruth() == aod::femtouniverse_mc_particle::ParticleOriginMCTruth::kPrimary)) { + continue; + } + registryPDG.fill(HIST("part2/PDGvspT"), part.pt(), mcParticle.pdgMCTruth()); registryMCOrigin.fill(HIST("part2/hPt"), mcParticle.pt()); } @@ -379,8 +411,8 @@ struct femtoUniverseEfficiencyBase { void doMCRecTrackPhi(PartitionType grouppartsOneMCRec, PartitionType grouppartsTwoMCRec) { // part1 is track and part2 is Phi - for (auto& part : grouppartsOneMCRec) { - if (part.partType() != ConfParticleTypePartOne || part.sign() != ConfChargePart1 || !IsParticleNSigma(ConfPDGCodePartOne, part.p(), trackCuts.getNsigmaTPC(part, o2::track::PID::Proton), trackCuts.getNsigmaTOF(part, o2::track::PID::Proton), trackCuts.getNsigmaTPC(part, o2::track::PID::Pion), trackCuts.getNsigmaTOF(part, o2::track::PID::Pion), trackCuts.getNsigmaTPC(part, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(part, o2::track::PID::Kaon), trackCuts.getNsigmaTPC(part, o2::track::PID::Deuteron), trackCuts.getNsigmaTOF(part, o2::track::PID::Deuteron))) { + for (const auto& part : grouppartsOneMCRec) { + if (part.partType() != confParticleTypePartOne || part.sign() != confChargePart1 || !isParticleNSigma(confPDGCodePartOne, part.p(), trackCuts.getNsigmaTPC(part, o2::track::PID::Proton), trackCuts.getNsigmaTOF(part, o2::track::PID::Proton), trackCuts.getNsigmaTPC(part, o2::track::PID::Pion), trackCuts.getNsigmaTOF(part, o2::track::PID::Pion), trackCuts.getNsigmaTPC(part, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(part, o2::track::PID::Kaon), trackCuts.getNsigmaTPC(part, o2::track::PID::Deuteron), trackCuts.getNsigmaTOF(part, o2::track::PID::Deuteron))) { continue; } trackHistoPartOneRec.fillQA(part); @@ -394,9 +426,9 @@ struct femtoUniverseEfficiencyBase { registryMCOrigin.fill(HIST("part1/hPt"), mcParticle.pt()); } - if (!ConfIsSame) { - for (auto& part : grouppartsTwoMCRec) { - if (part.partType() != ConfParticleTypePartTwo || part.sign() != ConfChargePart2) { + if (!confIsSame) { + for (const auto& part : grouppartsTwoMCRec) { + if (part.partType() != confParticleTypePartTwo || part.sign() != confChargePart2) { continue; } @@ -425,19 +457,19 @@ struct femtoUniverseEfficiencyBase { void doMCRecV0V0(PartitionType grouppartsOneMCRec, PartitionType grouppartsTwoMCRec, ParticlesType parts) { /// Histogramming same event - for (auto& part : grouppartsOneMCRec) { + for (const auto& part : grouppartsOneMCRec) { - if (part.partType() != ConfParticleTypePartOne || !invMLambda(part.mLambda(), part.mAntiLambda())) { + if (part.partType() != confParticleTypePartOne || !invMLambda(part.mLambda(), part.mAntiLambda())) { continue; } const auto& posChild = parts.iteratorAt(part.index() - 2); const auto& negChild = parts.iteratorAt(part.index() - 1); - if (ConfPDGCodePartOne > 0 && (!IsProtonNSigma(0, trackCuts.getNsigmaTPC(posChild, o2::track::PID::Proton), trackCuts.getNsigmaTOF(posChild, o2::track::PID::Proton)) || !IsPionNSigma(0, trackCuts.getNsigmaTPC(negChild, o2::track::PID::Pion), trackCuts.getNsigmaTOF(negChild, o2::track::PID::Pion)))) { // give momentum as 0 to only check TPC nSigma, not combined with TOF + if (confPDGCodePartOne > 0 && (!isProtonNSigma(0, trackCuts.getNsigmaTPC(posChild, o2::track::PID::Proton), trackCuts.getNsigmaTOF(posChild, o2::track::PID::Proton)) || !isPionNSigma(0, trackCuts.getNsigmaTPC(negChild, o2::track::PID::Pion), trackCuts.getNsigmaTOF(negChild, o2::track::PID::Pion)))) { // give momentum as 0 to only check TPC nSigma, not combined with TOF continue; } - if (ConfPDGCodePartOne < 0 && (!IsProtonNSigma(0, trackCuts.getNsigmaTPC(negChild, o2::track::PID::Proton), trackCuts.getNsigmaTOF(negChild, o2::track::PID::Proton)) || !IsPionNSigma(0, trackCuts.getNsigmaTPC(posChild, o2::track::PID::Pion), trackCuts.getNsigmaTOF(posChild, o2::track::PID::Pion)))) { // give momentum as 0 to only check TPC nSigma, not combined with TOF + if (confPDGCodePartOne < 0 && (!isProtonNSigma(0, trackCuts.getNsigmaTPC(negChild, o2::track::PID::Proton), trackCuts.getNsigmaTOF(negChild, o2::track::PID::Proton)) || !isPionNSigma(0, trackCuts.getNsigmaTPC(posChild, o2::track::PID::Pion), trackCuts.getNsigmaTOF(posChild, o2::track::PID::Pion)))) { // give momentum as 0 to only check TPC nSigma, not combined with TOF continue; } @@ -458,20 +490,20 @@ struct femtoUniverseEfficiencyBase { registryMCOrigin.fill(HIST("part1/hPt"), mcParticle.pt()); } - if (!ConfIsSame) { - for (auto& part : grouppartsTwoMCRec) { + if (!confIsSame) { + for (const auto& part : grouppartsTwoMCRec) { - if (part.partType() != ConfParticleTypePartTwo || !invMLambda(part.mLambda(), part.mAntiLambda())) { + if (part.partType() != confParticleTypePartTwo || !invMLambda(part.mLambda(), part.mAntiLambda())) { continue; } const auto& posChild = parts.iteratorAt(part.index() - 2); const auto& negChild = parts.iteratorAt(part.index() - 1); - if (ConfPDGCodePartTwo > 0 && (!IsProtonNSigma(0, trackCuts.getNsigmaTPC(posChild, o2::track::PID::Proton), trackCuts.getNsigmaTOF(posChild, o2::track::PID::Proton)) || !IsPionNSigma(0, trackCuts.getNsigmaTPC(negChild, o2::track::PID::Pion), trackCuts.getNsigmaTOF(negChild, o2::track::PID::Pion)))) { // give momentum as 0 to only check TPC nSigma, not combined with TOF + if (confPDGCodePartTwo > 0 && (!isProtonNSigma(0, trackCuts.getNsigmaTPC(posChild, o2::track::PID::Proton), trackCuts.getNsigmaTOF(posChild, o2::track::PID::Proton)) || !isPionNSigma(0, trackCuts.getNsigmaTPC(negChild, o2::track::PID::Pion), trackCuts.getNsigmaTOF(negChild, o2::track::PID::Pion)))) { // give momentum as 0 to only check TPC nSigma, not combined with TOF continue; } - if (ConfPDGCodePartTwo < 0 && (!IsProtonNSigma(0, trackCuts.getNsigmaTPC(negChild, o2::track::PID::Proton), trackCuts.getNsigmaTOF(negChild, o2::track::PID::Proton)) || !IsPionNSigma(0, trackCuts.getNsigmaTPC(posChild, o2::track::PID::Pion), trackCuts.getNsigmaTOF(posChild, o2::track::PID::Pion)))) { // give momentum as 0 to only check TPC nSigma, not combined with TOF + if (confPDGCodePartTwo < 0 && (!isProtonNSigma(0, trackCuts.getNsigmaTPC(negChild, o2::track::PID::Proton), trackCuts.getNsigmaTOF(negChild, o2::track::PID::Proton)) || !isPionNSigma(0, trackCuts.getNsigmaTPC(posChild, o2::track::PID::Pion), trackCuts.getNsigmaTOF(posChild, o2::track::PID::Pion)))) { // give momentum as 0 to only check TPC nSigma, not combined with TOF continue; } @@ -507,8 +539,8 @@ struct femtoUniverseEfficiencyBase { { // part1 is track and part2 is V0 /// Histogramming same event - for (auto& part : grouppartsOneMCRec) { - if (part.partType() != ConfParticleTypePartOne || part.sign() != ConfChargePart1 || !IsParticleNSigma(ConfPDGCodePartOne, part.p(), trackCuts.getNsigmaTPC(part, o2::track::PID::Proton), trackCuts.getNsigmaTOF(part, o2::track::PID::Proton), trackCuts.getNsigmaTPC(part, o2::track::PID::Pion), trackCuts.getNsigmaTOF(part, o2::track::PID::Pion), trackCuts.getNsigmaTPC(part, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(part, o2::track::PID::Kaon), trackCuts.getNsigmaTPC(part, o2::track::PID::Deuteron), trackCuts.getNsigmaTOF(part, o2::track::PID::Deuteron))) { + for (const auto& part : grouppartsOneMCRec) { + if (part.partType() != confParticleTypePartOne || part.sign() != confChargePart1 || !isParticleNSigma(confPDGCodePartOne, part.p(), trackCuts.getNsigmaTPC(part, o2::track::PID::Proton), trackCuts.getNsigmaTOF(part, o2::track::PID::Proton), trackCuts.getNsigmaTPC(part, o2::track::PID::Pion), trackCuts.getNsigmaTOF(part, o2::track::PID::Pion), trackCuts.getNsigmaTPC(part, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(part, o2::track::PID::Kaon), trackCuts.getNsigmaTPC(part, o2::track::PID::Deuteron), trackCuts.getNsigmaTOF(part, o2::track::PID::Deuteron))) { continue; } @@ -521,19 +553,19 @@ struct femtoUniverseEfficiencyBase { registryMCOrigin.fill(HIST("part1/hPt"), mcParticle.pt()); } - if (!ConfIsSame) { - for (auto& part : grouppartsTwoMCRec) { + if (!confIsSame) { + for (const auto& part : grouppartsTwoMCRec) { - if (part.partType() != ConfParticleTypePartTwo || !invMLambda(part.mLambda(), part.mAntiLambda())) { + if (part.partType() != confParticleTypePartTwo || !invMLambda(part.mLambda(), part.mAntiLambda())) { continue; } const auto& posChild = parts.iteratorAt(part.index() - 2); const auto& negChild = parts.iteratorAt(part.index() - 1); - if (ConfPDGCodePartTwo > 0 && (!IsProtonNSigma(0, trackCuts.getNsigmaTPC(posChild, o2::track::PID::Proton), trackCuts.getNsigmaTOF(posChild, o2::track::PID::Proton)) || !IsPionNSigma(0, trackCuts.getNsigmaTPC(negChild, o2::track::PID::Pion), trackCuts.getNsigmaTOF(negChild, o2::track::PID::Pion)))) { // give momentum as 0 to only check TPC nSigma, not combined with TOF + if (confPDGCodePartTwo > 0 && (!isProtonNSigma(0, trackCuts.getNsigmaTPC(posChild, o2::track::PID::Proton), trackCuts.getNsigmaTOF(posChild, o2::track::PID::Proton)) || !isPionNSigma(0, trackCuts.getNsigmaTPC(negChild, o2::track::PID::Pion), trackCuts.getNsigmaTOF(negChild, o2::track::PID::Pion)))) { // give momentum as 0 to only check TPC nSigma, not combined with TOF continue; } - if (ConfPDGCodePartTwo < 0 && (!IsProtonNSigma(0, trackCuts.getNsigmaTPC(negChild, o2::track::PID::Proton), trackCuts.getNsigmaTOF(negChild, o2::track::PID::Proton)) || !IsPionNSigma(0, trackCuts.getNsigmaTPC(posChild, o2::track::PID::Pion), trackCuts.getNsigmaTOF(posChild, o2::track::PID::Pion)))) { // give momentum as 0 to only check TPC nSigma, not combined with TOF + if (confPDGCodePartTwo < 0 && (!isProtonNSigma(0, trackCuts.getNsigmaTPC(negChild, o2::track::PID::Proton), trackCuts.getNsigmaTOF(negChild, o2::track::PID::Proton)) || !isPionNSigma(0, trackCuts.getNsigmaTPC(posChild, o2::track::PID::Pion), trackCuts.getNsigmaTOF(posChild, o2::track::PID::Pion)))) { // give momentum as 0 to only check TPC nSigma, not combined with TOF continue; } @@ -558,96 +590,96 @@ struct femtoUniverseEfficiencyBase { /// process function for to call doMCRecTrackTrack with Data /// \param col subscribe to the collision table (Data) - void processTrackTrack(FilteredFDCollision& col, - FemtoFullParticles&, aod::FdMCParticles const&) + void processTrackTrack(FilteredFDCollision const& col, + FemtoFullParticles const&, aod::FdMCParticles const&) { fillCollision(col); // MCGen auto thegrouppartsOneMCGen = partsOneMCGen->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - auto thegrouppartsTwoMCGen = partsTwoGen->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + auto thegrouppartsTwoMCGen = partsTwoMCGen->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); doMCGen(thegrouppartsOneMCGen, thegrouppartsTwoMCGen); // MCRec auto thegroupPartsTrackOneRec = partsTrackOneMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); auto thegroupPartsTrackTwoRec = partsTrackTwoMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - if (ConfIsDebug) { + if (confIsDebug) { doMCRecTrackTrack(thegroupPartsTrackOneRec, thegroupPartsTrackTwoRec); } else { doMCRecTrackTrack(thegroupPartsTrackOneRec, thegroupPartsTrackTwoRec); } } - PROCESS_SWITCH(femtoUniverseEfficiencyBase, processTrackTrack, "Enable processing track-track efficiency task", true); + PROCESS_SWITCH(FemtoUniverseEfficiencyBase, processTrackTrack, "Enable processing track-track efficiency task", true); /// process function for to call doMCRecTrackPhi with Data /// \param col subscribe to the collision table (Data) - void processTrackPhi(FilteredFDCollision& col, - FemtoFullParticles&, aod::FdMCParticles const&) + void processTrackPhi(FilteredFDCollision const& col, + FemtoFullParticles const&, aod::FdMCParticles const&) { fillCollision(col); // MCGen auto thegrouppartsOneMCGen = partsOneMCGen->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - auto thegrouppartsTwoMCGen = partsTwoGen->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + auto thegrouppartsTwoMCGen = partsTwoMCGen->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); doMCGen(thegrouppartsOneMCGen, thegrouppartsTwoMCGen); // MCRec auto thegroupPartsTrackOneRec = partsTrackOneMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); auto thegroupPartsTrackTwoRec = partsTrackTwoMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - if (ConfIsDebug) { + if (confIsDebug) { doMCRecTrackPhi(thegroupPartsTrackOneRec, thegroupPartsTrackTwoRec); } else { doMCRecTrackPhi(thegroupPartsTrackOneRec, thegroupPartsTrackTwoRec); } } - PROCESS_SWITCH(femtoUniverseEfficiencyBase, processTrackPhi, "Enable processing track-phi efficiency task", false); + PROCESS_SWITCH(FemtoUniverseEfficiencyBase, processTrackPhi, "Enable processing track-phi efficiency task", false); /// process function for to call doMCRecV0V0 with Data /// \param col subscribe to the collision table (Data) /// \param parts subscribe to the femtoUniverseParticleTable - void processV0V0(FilteredFDCollision& col, - FemtoFullParticles& parts, aod::FdMCParticles const&) + void processV0V0(FilteredFDCollision const& col, + FemtoFullParticles const& parts, aod::FdMCParticles const&) { fillCollision(col); // MCGen auto thegrouppartsOneMCGen = partsOneMCGen->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - auto thegrouppartsTwoMCGen = partsTwoGen->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + auto thegrouppartsTwoMCGen = partsTwoMCGen->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); doMCGen(thegrouppartsOneMCGen, thegrouppartsTwoMCGen); // MCRec auto thegroupPartsTrackOneRec = partsTrackOneMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); auto thegroupPartsTrackTwoRec = partsTrackTwoMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - if (ConfIsDebug) { + if (confIsDebug) { doMCRecV0V0(thegroupPartsTrackOneRec, thegroupPartsTrackTwoRec, parts); } else { doMCRecV0V0(thegroupPartsTrackOneRec, thegroupPartsTrackTwoRec, parts); } } - PROCESS_SWITCH(femtoUniverseEfficiencyBase, processV0V0, "Enable processing V0-V0 efficiency task", false); + PROCESS_SWITCH(FemtoUniverseEfficiencyBase, processV0V0, "Enable processing V0-V0 efficiency task", false); /// process function for to call doMCRecTrackV0 with Data /// \param col subscribe to the collision table (Data) /// \param parts subscribe to the femtoUniverseParticleTable - void processTrackV0(FilteredFDCollision& col, - FemtoFullParticles& parts, aod::FdMCParticles const&) + void processTrackV0(FilteredFDCollision const& col, + FemtoFullParticles const& parts, aod::FdMCParticles const&) { fillCollision(col); // MCGen auto thegrouppartsOneMCGen = partsOneMCGen->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - auto thegrouppartsTwoMCGen = partsTwoGen->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + auto thegrouppartsTwoMCGen = partsTwoMCGen->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); doMCGen(thegrouppartsOneMCGen, thegrouppartsTwoMCGen); // MCRec auto thegroupPartsTrackOneRec = partsTrackOneMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); auto thegroupPartsTrackTwoRec = partsTrackTwoMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - if (ConfIsDebug) { + if (confIsDebug) { doMCRecTrackV0(thegroupPartsTrackOneRec, thegroupPartsTrackTwoRec, parts); } else { doMCRecTrackV0(thegroupPartsTrackOneRec, thegroupPartsTrackTwoRec, parts); } } - PROCESS_SWITCH(femtoUniverseEfficiencyBase, processTrackV0, "Enable processing track-V0 efficiency task", false); + PROCESS_SWITCH(FemtoUniverseEfficiencyBase, processTrackV0, "Enable processing track-V0 efficiency task", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { WorkflowSpec workflow{ - adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc), }; return workflow; } From 3bfcb0a85af44e965292613e7871172638b967f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Thu, 24 Apr 2025 15:59:02 +0200 Subject: [PATCH 1085/1650] [Common] Split PIDResponse between TPC and TOF (#10119) --- Common/DataModel/CMakeLists.txt | 3 + Common/DataModel/PIDResponse.h | 782 +------------------- Common/DataModel/PIDResponseCombined.h | 76 ++ Common/DataModel/PIDResponseTOF.h | 485 ++++++++++++ Common/DataModel/PIDResponseTPC.h | 411 ++++++++++ Common/TableProducer/PID/pidBayes.cxx | 10 +- Common/TableProducer/PID/pidTOF.cxx | 99 ++- Common/TableProducer/PID/pidTOFBase.h | 1 + Common/TableProducer/PID/pidTOFMerge.cxx | 63 +- Common/TableProducer/PID/pidTPC.cxx | 4 +- Common/TableProducer/PID/pidTPCBase.h | 2 +- Common/TableProducer/match-mft-mch-data.cxx | 1 - Common/TableProducer/mcCollsExtra.cxx | 1 - Common/Tools/PID/checkPidPacking.cxx | 11 +- Common/Tools/aodDataModelGraph.cxx | 16 +- 15 files changed, 1087 insertions(+), 878 deletions(-) create mode 100644 Common/DataModel/PIDResponseCombined.h create mode 100644 Common/DataModel/PIDResponseTOF.h create mode 100644 Common/DataModel/PIDResponseTPC.h diff --git a/Common/DataModel/CMakeLists.txt b/Common/DataModel/CMakeLists.txt index 4891b1a95e9..79e6cba8b5d 100644 --- a/Common/DataModel/CMakeLists.txt +++ b/Common/DataModel/CMakeLists.txt @@ -16,6 +16,9 @@ o2physics_add_header_only_library(DataModel FT0Corrected.h Multiplicity.h PIDResponse.h + PIDResponseITS.h + PIDResponseTOF.h + PIDResponseTPC.h CollisionAssociationTables.h TrackSelectionTables.h McCollisionExtra.h diff --git a/Common/DataModel/PIDResponse.h b/Common/DataModel/PIDResponse.h index 90eb0e55112..eee2e4df2e3 100644 --- a/Common/DataModel/PIDResponse.h +++ b/Common/DataModel/PIDResponse.h @@ -13,802 +13,34 @@ /// \file PIDResponse.h /// \author Nicolò Jacazio nicolo.jacazio@cern.ch /// \brief Set of tables, tasks and utilities to provide the interface between -/// the analysis data model and the PID response +/// the analysis data model and the PID response. This is interim. To be removed /// #ifndef COMMON_DATAMODEL_PIDRESPONSE_H_ #define COMMON_DATAMODEL_PIDRESPONSE_H_ -#include - -// O2 includes -#include "Framework/ASoA.h" -#include "Framework/AnalysisDataModel.h" -#include "ReconstructionDataFormats/PID.h" -#include "Framework/Logger.h" +#include "PIDResponseTOF.h" +#include "PIDResponseTPC.h" +#include "PIDResponseCombined.h" namespace o2::aod { namespace pidutils { -// Function to pack a float into a binned value in table +// Function to pack a float into a binned value in table (interim solution) template void packInTable(const float& valueToBin, T& table) { - if (valueToBin <= binningType::binned_min) { - table(binningType::underflowBin); - } else if (valueToBin >= binningType::binned_max) { - table(binningType::overflowBin); - } else if (valueToBin >= 0) { - table(static_cast((valueToBin / binningType::bin_width) + 0.5f)); - } else { - table(static_cast((valueToBin / binningType::bin_width) - 0.5f)); - } + binningType::packInTable(valueToBin, table); } // Function to unpack a binned value into a float template float unPackInTable(const typename binningType::binned_t& valueToUnpack) { - return binningType::bin_width * static_cast(valueToUnpack); -} - -// Checkers for TOF PID hypothesis availability (runtime) -template -using hasTOFEl = decltype(std::declval().tofNSigmaEl()); -template -using hasTOFMu = decltype(std::declval().tofNSigmaMu()); -template -using hasTOFPi = decltype(std::declval().tofNSigmaPi()); -template -using hasTOFKa = decltype(std::declval().tofNSigmaKa()); -template -using hasTOFPr = decltype(std::declval().tofNSigmaPr()); -template -using hasTOFDe = decltype(std::declval().tofNSigmaDe()); -template -using hasTOFTr = decltype(std::declval().tofNSigmaTr()); -template -using hasTOFHe = decltype(std::declval().tofNSigmaHe()); -template -using hasTOFAl = decltype(std::declval().tofNSigmaAl()); - -// Checkers for TPC PID hypothesis availability (runtime) -template -using hasTPCEl = decltype(std::declval().tpcNSigmaEl()); -template -using hasTPCMu = decltype(std::declval().tpcNSigmaMu()); -template -using hasTPCPi = decltype(std::declval().tpcNSigmaPi()); -template -using hasTPCKa = decltype(std::declval().tpcNSigmaKa()); -template -using hasTPCPr = decltype(std::declval().tpcNSigmaPr()); -template -using hasTPCDe = decltype(std::declval().tpcNSigmaDe()); -template -using hasTPCTr = decltype(std::declval().tpcNSigmaTr()); -template -using hasTPCHe = decltype(std::declval().tpcNSigmaHe()); -template -using hasTPCAl = decltype(std::declval().tpcNSigmaAl()); - -// PID index as template argument -#define PER_SPECIES_WRAPPER(functionName) \ - template \ - auto functionName(const TrackType& track) \ - { \ - if constexpr (index == o2::track::PID::Electron) { \ - return track.functionName##El(); \ - } else if constexpr (index == o2::track::PID::Muon) { \ - return track.functionName##Mu(); \ - } else if constexpr (index == o2::track::PID::Pion) { \ - return track.functionName##Pi(); \ - } else if constexpr (index == o2::track::PID::Kaon) { \ - return track.functionName##Ka(); \ - } else if constexpr (index == o2::track::PID::Proton) { \ - return track.functionName##Pr(); \ - } else if constexpr (index == o2::track::PID::Deuteron) { \ - return track.functionName##De(); \ - } else if constexpr (index == o2::track::PID::Triton) { \ - return track.functionName##Tr(); \ - } else if constexpr (index == o2::track::PID::Helium3) { \ - return track.functionName##He(); \ - } else if constexpr (index == o2::track::PID::Alpha) { \ - return track.functionName##Al(); \ - } \ - } - -PER_SPECIES_WRAPPER(tofNSigma); -PER_SPECIES_WRAPPER(tofExpSigma); -template -auto tofExpSignal(const TrackType& track) -{ - if constexpr (index == o2::track::PID::Electron) { - return track.tofExpSignalEl(track.tofSignal()); - } else if constexpr (index == o2::track::PID::Muon) { - return track.tofExpSignalMu(track.tofSignal()); - } else if constexpr (index == o2::track::PID::Pion) { - return track.tofExpSignalPi(track.tofSignal()); - } else if constexpr (index == o2::track::PID::Kaon) { - return track.tofExpSignalKa(track.tofSignal()); - } else if constexpr (index == o2::track::PID::Proton) { - return track.tofExpSignalPr(track.tofSignal()); - } else if constexpr (index == o2::track::PID::Deuteron) { - return track.tofExpSignalDe(track.tofSignal()); - } else if constexpr (index == o2::track::PID::Triton) { - return track.tofExpSignalTr(track.tofSignal()); - } else if constexpr (index == o2::track::PID::Helium3) { - return track.tofExpSignalHe(track.tofSignal()); - } else if constexpr (index == o2::track::PID::Alpha) { - return track.tofExpSignalAl(track.tofSignal()); - } -} -PER_SPECIES_WRAPPER(tofExpSignalDiff); - -PER_SPECIES_WRAPPER(tpcNSigma); -PER_SPECIES_WRAPPER(tpcExpSigma); -template -auto tpcExpSignal(const TrackType& track) -{ - if constexpr (index == o2::track::PID::Electron) { - return track.tpcExpSignalEl(track.tpcSignal()); - } else if constexpr (index == o2::track::PID::Muon) { - return track.tpcExpSignalMu(track.tpcSignal()); - } else if constexpr (index == o2::track::PID::Pion) { - return track.tpcExpSignalPi(track.tpcSignal()); - } else if constexpr (index == o2::track::PID::Kaon) { - return track.tpcExpSignalKa(track.tpcSignal()); - } else if constexpr (index == o2::track::PID::Proton) { - return track.tpcExpSignalPr(track.tpcSignal()); - } else if constexpr (index == o2::track::PID::Deuteron) { - return track.tpcExpSignalDe(track.tpcSignal()); - } else if constexpr (index == o2::track::PID::Triton) { - return track.tpcExpSignalTr(track.tpcSignal()); - } else if constexpr (index == o2::track::PID::Helium3) { - return track.tpcExpSignalHe(track.tpcSignal()); - } else if constexpr (index == o2::track::PID::Alpha) { - return track.tpcExpSignalAl(track.tpcSignal()); - } -} -PER_SPECIES_WRAPPER(tpcExpSignalDiff); - -#undef PER_SPECIES_WRAPPER - -// PID index as function argument for TOF -#define PER_SPECIES_WRAPPER(functionName) \ - template \ - auto functionName(const o2::track::PID::ID index, const TrackType& track) \ - { \ - switch (index) { \ - case o2::track::PID::Electron: \ - if constexpr (std::experimental::is_detected::value) { \ - return track.functionName##El(); \ - } \ - case o2::track::PID::Muon: \ - if constexpr (std::experimental::is_detected::value) { \ - return track.functionName##Mu(); \ - } \ - case o2::track::PID::Pion: \ - if constexpr (std::experimental::is_detected::value) { \ - return track.functionName##Pi(); \ - } \ - case o2::track::PID::Kaon: \ - if constexpr (std::experimental::is_detected::value) { \ - return track.functionName##Ka(); \ - } \ - case o2::track::PID::Proton: \ - if constexpr (std::experimental::is_detected::value) { \ - return track.functionName##Pr(); \ - } \ - case o2::track::PID::Deuteron: \ - if constexpr (std::experimental::is_detected::value) { \ - return track.functionName##De(); \ - } \ - case o2::track::PID::Triton: \ - if constexpr (std::experimental::is_detected::value) { \ - return track.functionName##Tr(); \ - } \ - case o2::track::PID::Helium3: \ - if constexpr (std::experimental::is_detected::value) { \ - return track.functionName##He(); \ - } \ - case o2::track::PID::Alpha: \ - if constexpr (std::experimental::is_detected::value) { \ - return track.functionName##Al(); \ - } \ - default: \ - LOGF(fatal, "TOF PID table for PID index %i (%s) is not available", index, o2::track::PID::getName(index)); \ - return 0.f; \ - } \ - } - -PER_SPECIES_WRAPPER(tofNSigma); -PER_SPECIES_WRAPPER(tofExpSigma); -template -auto tofExpSignal(const o2::track::PID::ID index, const TrackType& track) -{ - switch (index) { - case o2::track::PID::Electron: - if constexpr (std::experimental::is_detected::value) { - return track.tofExpSignalEl(track.tofSignal()); - } - case o2::track::PID::Muon: - if constexpr (std::experimental::is_detected::value) { - return track.tofExpSignalMu(track.tofSignal()); - } - case o2::track::PID::Pion: - if constexpr (std::experimental::is_detected::value) { - return track.tofExpSignalPi(track.tofSignal()); - } - case o2::track::PID::Kaon: - if constexpr (std::experimental::is_detected::value) { - return track.tofExpSignalKa(track.tofSignal()); - } - case o2::track::PID::Proton: - if constexpr (std::experimental::is_detected::value) { - return track.tofExpSignalPr(track.tofSignal()); - } - case o2::track::PID::Deuteron: - if constexpr (std::experimental::is_detected::value) { - return track.tofExpSignalDe(track.tofSignal()); - } - case o2::track::PID::Triton: - if constexpr (std::experimental::is_detected::value) { - return track.tofExpSignalTr(track.tofSignal()); - } - case o2::track::PID::Helium3: - if constexpr (std::experimental::is_detected::value) { - return track.tofExpSignalHe(track.tofSignal()); - } - case o2::track::PID::Alpha: - if constexpr (std::experimental::is_detected::value) { - return track.tofExpSignalAl(track.tofSignal()); - } - default: - LOGF(fatal, "TOF PID table for PID index %i (%s) is not available", index, o2::track::PID::getName(index)); - return 0.f; - } -} -PER_SPECIES_WRAPPER(tofExpSignalDiff); - -#undef PER_SPECIES_WRAPPER - -// PID index as function argument for TPC -#define PER_SPECIES_WRAPPER(functionName) \ - template \ - auto functionName(const o2::track::PID::ID index, const TrackType& track) \ - { \ - switch (index) { \ - case o2::track::PID::Electron: \ - if constexpr (std::experimental::is_detected::value) { \ - return track.functionName##El(); \ - } \ - case o2::track::PID::Muon: \ - if constexpr (std::experimental::is_detected::value) { \ - return track.functionName##Mu(); \ - } \ - case o2::track::PID::Pion: \ - if constexpr (std::experimental::is_detected::value) { \ - return track.functionName##Pi(); \ - } \ - case o2::track::PID::Kaon: \ - if constexpr (std::experimental::is_detected::value) { \ - return track.functionName##Ka(); \ - } \ - case o2::track::PID::Proton: \ - if constexpr (std::experimental::is_detected::value) { \ - return track.functionName##Pr(); \ - } \ - case o2::track::PID::Deuteron: \ - if constexpr (std::experimental::is_detected::value) { \ - return track.functionName##De(); \ - } \ - case o2::track::PID::Triton: \ - if constexpr (std::experimental::is_detected::value) { \ - return track.functionName##Tr(); \ - } \ - case o2::track::PID::Helium3: \ - if constexpr (std::experimental::is_detected::value) { \ - return track.functionName##He(); \ - } \ - case o2::track::PID::Alpha: \ - if constexpr (std::experimental::is_detected::value) { \ - return track.functionName##Al(); \ - } \ - default: \ - LOGF(fatal, "TPC PID table for PID index %i (%s) is not available", index, o2::track::PID::getName(index)); \ - return 0.f; \ - } \ - } - -PER_SPECIES_WRAPPER(tpcNSigma); -PER_SPECIES_WRAPPER(tpcExpSigma); -template -auto tpcExpSignal(const o2::track::PID::ID index, const TrackType& track) -{ - switch (index) { - case o2::track::PID::Electron: - if constexpr (std::experimental::is_detected::value) { - return track.tpcExpSignalEl(track.tpcSignal()); - } - case o2::track::PID::Muon: - if constexpr (std::experimental::is_detected::value) { - return track.tpcExpSignalMu(track.tpcSignal()); - } - case o2::track::PID::Pion: - if constexpr (std::experimental::is_detected::value) { - return track.tpcExpSignalPi(track.tpcSignal()); - } - case o2::track::PID::Kaon: - if constexpr (std::experimental::is_detected::value) { - return track.tpcExpSignalKa(track.tpcSignal()); - } - case o2::track::PID::Proton: - if constexpr (std::experimental::is_detected::value) { - return track.tpcExpSignalPr(track.tpcSignal()); - } - case o2::track::PID::Deuteron: - if constexpr (std::experimental::is_detected::value) { - return track.tpcExpSignalDe(track.tpcSignal()); - } - case o2::track::PID::Triton: - if constexpr (std::experimental::is_detected::value) { - return track.tpcExpSignalTr(track.tpcSignal()); - } - case o2::track::PID::Helium3: - if constexpr (std::experimental::is_detected::value) { - return track.tpcExpSignalHe(track.tpcSignal()); - } - case o2::track::PID::Alpha: - if constexpr (std::experimental::is_detected::value) { - return track.tpcExpSignalAl(track.tpcSignal()); - } - default: - LOGF(fatal, "TPC PID table for PID index %i (%s) is not available", index, o2::track::PID::getName(index)); - return 0.f; - } + return binningType::unPackInTable(valueToUnpack); } -PER_SPECIES_WRAPPER(tpcExpSignalDiff); - -#undef PER_SPECIES_WRAPPER - } // namespace pidutils - -namespace pidflags -{ - -namespace enums -{ -enum PIDFlags : uint8_t { - EvTimeUndef = 0x0, // Event collision not set, corresponding to the LHC Fill event time - EvTimeTOF = 0x1, // Event collision time from TOF - EvTimeT0AC = 0x2, // Event collision time from the FT0AC - EvTimeTOFT0AC = 0x4 // Event collision time from the TOF and FT0AC -}; -} - -DECLARE_SOA_COLUMN(GoodTOFMatch, goodTOFMatch, bool); //! Bool for the TOF PID information on the single track information -DECLARE_SOA_COLUMN(TOFFlags, tofFlags, uint8_t); //! Flag for the complementary TOF PID information for the event time -DECLARE_SOA_DYNAMIC_COLUMN(IsEvTimeDefined, isEvTimeDefined, //! True if the Event Time was computed with any method i.e. there is a usable event time - [](uint8_t flags) -> bool { return (flags > 0); }); -DECLARE_SOA_DYNAMIC_COLUMN(IsEvTimeTOF, isEvTimeTOF, //! True if the Event Time was computed with the TOF - [](uint8_t flags) -> bool { return (flags & enums::PIDFlags::EvTimeTOF) == enums::PIDFlags::EvTimeTOF; }); -DECLARE_SOA_DYNAMIC_COLUMN(IsEvTimeT0AC, isEvTimeT0AC, //! True if the Event Time was computed with the T0AC - [](uint8_t flags) -> bool { return (flags & enums::PIDFlags::EvTimeT0AC) == enums::PIDFlags::EvTimeT0AC; }); -DECLARE_SOA_DYNAMIC_COLUMN(IsEvTimeTOFT0AC, isEvTimeTOFT0AC, //! True if the Event Time was computed with the TOF and T0AC - [](uint8_t flags) -> bool { return (flags & enums::PIDFlags::EvTimeTOFT0AC) == enums::PIDFlags::EvTimeTOFT0AC; }); - -} // namespace pidflags - -namespace pidtofsignal -{ -DECLARE_SOA_COLUMN(TOFSignal, tofSignal, float); //! TOF signal from track time -DECLARE_SOA_DYNAMIC_COLUMN(EventCollisionTime, eventCollisionTime, //! Event collision time used for the track. Needs the TOF - [](float signal, float tMinusTexp, float texp) -> float { return texp + tMinusTexp - signal; }); - -} // namespace pidtofsignal - -namespace pidtofevtime -{ -DECLARE_SOA_COLUMN(TOFEvTime, tofEvTime, float); //! event time for TOF signal. Can be obtained via a combination of detectors e.g. TOF, FT0A, FT0C -DECLARE_SOA_COLUMN(TOFEvTimeErr, tofEvTimeErr, float); //! event time error for TOF. Can be obtained via a combination of detectors e.g. TOF, FT0A, FT0C -} // namespace pidtofevtime - -namespace pidtofbeta -{ -DECLARE_SOA_COLUMN(Beta, beta, float); //! TOF beta -DECLARE_SOA_COLUMN(BetaError, betaerror, float); //! Uncertainty on the TOF beta -// -DECLARE_SOA_COLUMN(ExpBetaEl, expbetael, float); //! Expected beta of electron -DECLARE_SOA_COLUMN(ExpBetaElError, expbetaelerror, float); //! Expected uncertainty on the beta of electron -// -DECLARE_SOA_COLUMN(SeparationBetaEl, separationbetael, float); //! Separation computed with the expected beta for electrons -DECLARE_SOA_DYNAMIC_COLUMN(DiffBetaEl, diffbetael, //! Difference between the measured and the expected beta for electrons - [](float beta, float expbetael) -> float { return beta - expbetael; }); -} // namespace pidtofbeta - -namespace pidtofmass -{ -DECLARE_SOA_COLUMN(TOFMass, mass, float); //! TOF mass -} // namespace pidtofmass - -namespace pidtof -{ -// Expected times -DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalEl, tofExpSignalEl, //! Expected time for electron - [](float nsigma, float sigma, float tofsignal) -> float { return tofsignal - nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalMu, tofExpSignalMu, //! Expected time for muon - [](float nsigma, float sigma, float tofsignal) -> float { return tofsignal - nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalPi, tofExpSignalPi, //! Expected time for pion - [](float nsigma, float sigma, float tofsignal) -> float { return tofsignal - nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalKa, tofExpSignalKa, //! Expected time for kaon - [](float nsigma, float sigma, float tofsignal) -> float { return tofsignal - nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalPr, tofExpSignalPr, //! Expected time for proton - [](float nsigma, float sigma, float tofsignal) -> float { return tofsignal - nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalDe, tofExpSignalDe, //! Expected time for deuteron - [](float nsigma, float sigma, float tofsignal) -> float { return tofsignal - nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalTr, tofExpSignalTr, //! Expected time for triton - [](float nsigma, float sigma, float tofsignal) -> float { return tofsignal - nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalHe, tofExpSignalHe, //! Expected time for helium3 - [](float nsigma, float sigma, float tofsignal) -> float { return tofsignal - nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalAl, tofExpSignalAl, //! Expected time for alpha - [](float nsigma, float sigma, float tofsignal) -> float { return tofsignal - nsigma * sigma; }); -// Delta with respect to signal -DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalDiffEl, tofExpSignalDiffEl, //! Difference between signal and expected for electron - [](float nsigma, float sigma) -> float { return nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalDiffMu, tofExpSignalDiffMu, //! Difference between signal and expected for muon - [](float nsigma, float sigma) -> float { return nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalDiffPi, tofExpSignalDiffPi, //! Difference between signal and expected for pion - [](float nsigma, float sigma) -> float { return nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalDiffKa, tofExpSignalDiffKa, //! Difference between signal and expected for kaon - [](float nsigma, float sigma) -> float { return nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalDiffPr, tofExpSignalDiffPr, //! Difference between signal and expected for proton - [](float nsigma, float sigma) -> float { return nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalDiffDe, tofExpSignalDiffDe, //! Difference between signal and expected for deuteron - [](float nsigma, float sigma) -> float { return nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalDiffTr, tofExpSignalDiffTr, //! Difference between signal and expected for triton - [](float nsigma, float sigma) -> float { return nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalDiffHe, tofExpSignalDiffHe, //! Difference between signal and expected for helium3 - [](float nsigma, float sigma) -> float { return nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalDiffAl, tofExpSignalDiffAl, //! Difference between signal and expected for alpha - [](float nsigma, float sigma) -> float { return nsigma * sigma; }); -// Expected sigma -DECLARE_SOA_COLUMN(TOFExpSigmaEl, tofExpSigmaEl, float); //! Expected resolution with the TOF detector for electron -DECLARE_SOA_COLUMN(TOFExpSigmaMu, tofExpSigmaMu, float); //! Expected resolution with the TOF detector for muon -DECLARE_SOA_COLUMN(TOFExpSigmaPi, tofExpSigmaPi, float); //! Expected resolution with the TOF detector for pion -DECLARE_SOA_COLUMN(TOFExpSigmaKa, tofExpSigmaKa, float); //! Expected resolution with the TOF detector for kaon -DECLARE_SOA_COLUMN(TOFExpSigmaPr, tofExpSigmaPr, float); //! Expected resolution with the TOF detector for proton -DECLARE_SOA_COLUMN(TOFExpSigmaDe, tofExpSigmaDe, float); //! Expected resolution with the TOF detector for deuteron -DECLARE_SOA_COLUMN(TOFExpSigmaTr, tofExpSigmaTr, float); //! Expected resolution with the TOF detector for triton -DECLARE_SOA_COLUMN(TOFExpSigmaHe, tofExpSigmaHe, float); //! Expected resolution with the TOF detector for helium3 -DECLARE_SOA_COLUMN(TOFExpSigmaAl, tofExpSigmaAl, float); //! Expected resolution with the TOF detector for alpha -// NSigma -DECLARE_SOA_COLUMN(TOFNSigmaEl, tofNSigmaEl, float); //! Nsigma separation with the TOF detector for electron -DECLARE_SOA_COLUMN(TOFNSigmaMu, tofNSigmaMu, float); //! Nsigma separation with the TOF detector for muon -DECLARE_SOA_COLUMN(TOFNSigmaPi, tofNSigmaPi, float); //! Nsigma separation with the TOF detector for pion -DECLARE_SOA_COLUMN(TOFNSigmaKa, tofNSigmaKa, float); //! Nsigma separation with the TOF detector for kaon -DECLARE_SOA_COLUMN(TOFNSigmaPr, tofNSigmaPr, float); //! Nsigma separation with the TOF detector for proton -DECLARE_SOA_COLUMN(TOFNSigmaDe, tofNSigmaDe, float); //! Nsigma separation with the TOF detector for deuteron -DECLARE_SOA_COLUMN(TOFNSigmaTr, tofNSigmaTr, float); //! Nsigma separation with the TOF detector for triton -DECLARE_SOA_COLUMN(TOFNSigmaHe, tofNSigmaHe, float); //! Nsigma separation with the TOF detector for helium3 -DECLARE_SOA_COLUMN(TOFNSigmaAl, tofNSigmaAl, float); //! Nsigma separation with the TOF detector for alpha -} // namespace pidtof - -// Macro to convert the stored Nsigmas to floats -#define DEFINE_UNWRAP_NSIGMA_COLUMN(COLUMN, COLUMN_NAME) \ - DECLARE_SOA_DYNAMIC_COLUMN(COLUMN, COLUMN_NAME, \ - [](binning::binned_t nsigma_binned) -> float { return o2::aod::pidutils::unPackInTable(nsigma_binned); }); - -namespace pidtof_tiny -{ -struct binning { - public: - typedef int8_t binned_t; - static constexpr int nbins = (1 << 8 * sizeof(binned_t)) - 2; - static constexpr binned_t overflowBin = nbins >> 1; - static constexpr binned_t underflowBin = -(nbins >> 1); - static constexpr float binned_max = 6.35; - static constexpr float binned_min = -6.35; - static constexpr float bin_width = (binned_max - binned_min) / nbins; -}; - -// NSigma with reduced size 8 bit -DECLARE_SOA_COLUMN(TOFNSigmaStoreEl, tofNSigmaStoreEl, binning::binned_t); //! Stored binned nsigma with the TOF detector for electron -DECLARE_SOA_COLUMN(TOFNSigmaStoreMu, tofNSigmaStoreMu, binning::binned_t); //! Stored binned nsigma with the TOF detector for muon -DECLARE_SOA_COLUMN(TOFNSigmaStorePi, tofNSigmaStorePi, binning::binned_t); //! Stored binned nsigma with the TOF detector for pion -DECLARE_SOA_COLUMN(TOFNSigmaStoreKa, tofNSigmaStoreKa, binning::binned_t); //! Stored binned nsigma with the TOF detector for kaon -DECLARE_SOA_COLUMN(TOFNSigmaStorePr, tofNSigmaStorePr, binning::binned_t); //! Stored binned nsigma with the TOF detector for proton -DECLARE_SOA_COLUMN(TOFNSigmaStoreDe, tofNSigmaStoreDe, binning::binned_t); //! Stored binned nsigma with the TOF detector for deuteron -DECLARE_SOA_COLUMN(TOFNSigmaStoreTr, tofNSigmaStoreTr, binning::binned_t); //! Stored binned nsigma with the TOF detector for triton -DECLARE_SOA_COLUMN(TOFNSigmaStoreHe, tofNSigmaStoreHe, binning::binned_t); //! Stored binned nsigma with the TOF detector for helium3 -DECLARE_SOA_COLUMN(TOFNSigmaStoreAl, tofNSigmaStoreAl, binning::binned_t); //! Stored binned nsigma with the TOF detector for alpha -// NSigma with reduced size in [binned_min, binned_max] bin size bin_width -DEFINE_UNWRAP_NSIGMA_COLUMN(TOFNSigmaEl, tofNSigmaEl); //! Unwrapped (float) nsigma with the TOF detector for electron -DEFINE_UNWRAP_NSIGMA_COLUMN(TOFNSigmaMu, tofNSigmaMu); //! Unwrapped (float) nsigma with the TOF detector for muon -DEFINE_UNWRAP_NSIGMA_COLUMN(TOFNSigmaPi, tofNSigmaPi); //! Unwrapped (float) nsigma with the TOF detector for pion -DEFINE_UNWRAP_NSIGMA_COLUMN(TOFNSigmaKa, tofNSigmaKa); //! Unwrapped (float) nsigma with the TOF detector for kaon -DEFINE_UNWRAP_NSIGMA_COLUMN(TOFNSigmaPr, tofNSigmaPr); //! Unwrapped (float) nsigma with the TOF detector for proton -DEFINE_UNWRAP_NSIGMA_COLUMN(TOFNSigmaDe, tofNSigmaDe); //! Unwrapped (float) nsigma with the TOF detector for deuteron -DEFINE_UNWRAP_NSIGMA_COLUMN(TOFNSigmaTr, tofNSigmaTr); //! Unwrapped (float) nsigma with the TOF detector for triton -DEFINE_UNWRAP_NSIGMA_COLUMN(TOFNSigmaHe, tofNSigmaHe); //! Unwrapped (float) nsigma with the TOF detector for helium3 -DEFINE_UNWRAP_NSIGMA_COLUMN(TOFNSigmaAl, tofNSigmaAl); //! Unwrapped (float) nsigma with the TOF detector for alpha - -} // namespace pidtof_tiny - -DECLARE_SOA_TABLE(TOFSignal, "AOD", "TOFSignal", //! Table of the TOF signal - pidtofsignal::TOFSignal, - pidtofsignal::EventCollisionTime); - -DECLARE_SOA_TABLE(TOFEvTime, "AOD", "TOFEvTime", //! Table of the TOF event time. One entry per track. - pidtofevtime::TOFEvTime, - pidtofevtime::TOFEvTimeErr); - -DECLARE_SOA_TABLE(pidTOFFlags, "AOD", "pidTOFFlags", //! Table of the flags for TOF signal quality on the track level - pidflags::GoodTOFMatch); - -DECLARE_SOA_TABLE(pidTOFbeta, "AOD", "pidTOFbeta", //! Table of the TOF beta - pidtofbeta::Beta, pidtofbeta::BetaError); - -DECLARE_SOA_TABLE(pidTOFmass, "AOD", "pidTOFmass", //! Table of the TOF mass - pidtofmass::TOFMass); - -DECLARE_SOA_TABLE(pidEvTimeFlags, "AOD", "pidEvTimeFlags", //! Table of the PID flags for the event time tables - pidflags::TOFFlags, - pidflags::IsEvTimeDefined, - pidflags::IsEvTimeTOF, - pidflags::IsEvTimeT0AC, - pidflags::IsEvTimeTOFT0AC); - -// Per particle tables -DECLARE_SOA_TABLE(pidTOFFullEl, "AOD", "pidTOFFullEl", //! Table of the TOF (full) response with expected signal, expected resolution and Nsigma for electron - pidtof::TOFExpSignalDiffEl, - pidtof::TOFExpSignalEl, - pidtof::TOFExpSigmaEl, pidtof::TOFNSigmaEl); -DECLARE_SOA_TABLE(pidTOFFullMu, "AOD", "pidTOFFullMu", //! Table of the TOF (full) response with expected signal, expected resolution and Nsigma for muon - pidtof::TOFExpSignalDiffMu, - pidtof::TOFExpSignalMu, - pidtof::TOFExpSigmaMu, pidtof::TOFNSigmaMu); -DECLARE_SOA_TABLE(pidTOFFullPi, "AOD", "pidTOFFullPi", //! Table of the TOF (full) response with expected signal, expected resolution and Nsigma for pion - pidtof::TOFExpSignalDiffPi, - pidtof::TOFExpSignalPi, - pidtof::TOFExpSigmaPi, pidtof::TOFNSigmaPi); -DECLARE_SOA_TABLE(pidTOFFullKa, "AOD", "pidTOFFullKa", //! Table of the TOF (full) response with expected signal, expected resolution and Nsigma for kaon - pidtof::TOFExpSignalDiffKa, - pidtof::TOFExpSignalKa, - pidtof::TOFExpSigmaKa, pidtof::TOFNSigmaKa); -DECLARE_SOA_TABLE(pidTOFFullPr, "AOD", "pidTOFFullPr", //! Table of the TOF (full) response with expected signal, expected resolution and Nsigma for proton - pidtof::TOFExpSignalDiffPr, - pidtof::TOFExpSignalPr, - pidtof::TOFExpSigmaPr, pidtof::TOFNSigmaPr); -DECLARE_SOA_TABLE(pidTOFFullDe, "AOD", "pidTOFFullDe", //! Table of the TOF (full) response with expected signal, expected resolution and Nsigma for deuteron - pidtof::TOFExpSignalDiffDe, - pidtof::TOFExpSignalDe, - pidtof::TOFExpSigmaDe, pidtof::TOFNSigmaDe); -DECLARE_SOA_TABLE(pidTOFFullTr, "AOD", "pidTOFFullTr", //! Table of the TOF (full) response with expected signal, expected resolution and Nsigma for triton - pidtof::TOFExpSignalDiffTr, - pidtof::TOFExpSignalTr, - pidtof::TOFExpSigmaTr, pidtof::TOFNSigmaTr); -DECLARE_SOA_TABLE(pidTOFFullHe, "AOD", "pidTOFFullHe", //! Table of the TOF (full) response with expected signal, expected resolution and Nsigma for helium3 - pidtof::TOFExpSignalDiffHe, - pidtof::TOFExpSignalHe, - pidtof::TOFExpSigmaHe, pidtof::TOFNSigmaHe); -DECLARE_SOA_TABLE(pidTOFFullAl, "AOD", "pidTOFFullAl", //! Table of the TOF (full) response with expected signal, expected resolution and Nsigma for alpha - pidtof::TOFExpSignalDiffAl, - pidtof::TOFExpSignalAl, - pidtof::TOFExpSigmaAl, pidtof::TOFNSigmaAl); - -// Tiny size tables -DECLARE_SOA_TABLE(pidTOFEl, "AOD", "pidTOFEl", //! Table of the TOF response with binned Nsigma for electron - pidtof_tiny::TOFNSigmaStoreEl, pidtof_tiny::TOFNSigmaEl); -DECLARE_SOA_TABLE(pidTOFMu, "AOD", "pidTOFMu", //! Table of the TOF response with binned Nsigma for muon - pidtof_tiny::TOFNSigmaStoreMu, pidtof_tiny::TOFNSigmaMu); -DECLARE_SOA_TABLE(pidTOFPi, "AOD", "pidTOFPi", //! Table of the TOF response with binned Nsigma for pion - pidtof_tiny::TOFNSigmaStorePi, pidtof_tiny::TOFNSigmaPi); -DECLARE_SOA_TABLE(pidTOFKa, "AOD", "pidTOFKa", //! Table of the TOF response with binned Nsigma for kaon - pidtof_tiny::TOFNSigmaStoreKa, pidtof_tiny::TOFNSigmaKa); -DECLARE_SOA_TABLE(pidTOFPr, "AOD", "pidTOFPr", //! Table of the TOF response with binned Nsigma for proton - pidtof_tiny::TOFNSigmaStorePr, pidtof_tiny::TOFNSigmaPr); -DECLARE_SOA_TABLE(pidTOFDe, "AOD", "pidTOFDe", //! Table of the TOF response with binned Nsigma for deuteron - pidtof_tiny::TOFNSigmaStoreDe, pidtof_tiny::TOFNSigmaDe); -DECLARE_SOA_TABLE(pidTOFTr, "AOD", "pidTOFTr", //! Table of the TOF response with binned Nsigma for triton - pidtof_tiny::TOFNSigmaStoreTr, pidtof_tiny::TOFNSigmaTr); -DECLARE_SOA_TABLE(pidTOFHe, "AOD", "pidTOFHe", //! Table of the TOF response with binned Nsigma for helium3 - pidtof_tiny::TOFNSigmaStoreHe, pidtof_tiny::TOFNSigmaHe); -DECLARE_SOA_TABLE(pidTOFAl, "AOD", "pidTOFAl", //! Table of the TOF response with binned Nsigma for alpha - pidtof_tiny::TOFNSigmaStoreAl, pidtof_tiny::TOFNSigmaAl); - -namespace mcpidtpc -{ -// Tuned MC on data -DECLARE_SOA_COLUMN(DeDxTunedMc, mcTunedTPCSignal, float); //! TPC signal after TuneOnData application for MC -} // namespace mcpidtpc - -DECLARE_SOA_TABLE(mcTPCTuneOnData, "AOD", "MCTPCTUNEONDATA", mcpidtpc::DeDxTunedMc); - -namespace pidtpc -{ -// Expected signals -DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalEl, tpcExpSignalEl, //! Expected signal with the TPC detector for electron - [](float nsigma, float sigma, float tpcsignal) -> float { return tpcsignal - nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalMu, tpcExpSignalMu, //! Expected signal with the TPC detector for muon - [](float nsigma, float sigma, float tpcsignal) -> float { return tpcsignal - nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalPi, tpcExpSignalPi, //! Expected signal with the TPC detector for pion - [](float nsigma, float sigma, float tpcsignal) -> float { return tpcsignal - nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalKa, tpcExpSignalKa, //! Expected signal with the TPC detector for kaon - [](float nsigma, float sigma, float tpcsignal) -> float { return tpcsignal - nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalPr, tpcExpSignalPr, //! Expected signal with the TPC detector for proton - [](float nsigma, float sigma, float tpcsignal) -> float { return tpcsignal - nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalDe, tpcExpSignalDe, //! Expected signal with the TPC detector for deuteron - [](float nsigma, float sigma, float tpcsignal) -> float { return tpcsignal - nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalTr, tpcExpSignalTr, //! Expected signal with the TPC detector for triton - [](float nsigma, float sigma, float tpcsignal) -> float { return tpcsignal - nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalHe, tpcExpSignalHe, //! Expected signal with the TPC detector for helium3 - [](float nsigma, float sigma, float tpcsignal) -> float { return tpcsignal - nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalAl, tpcExpSignalAl, //! Expected signal with the TPC detector for alpha - [](float nsigma, float sigma, float tpcsignal) -> float { return tpcsignal - nsigma * sigma; }); -// Expected signals difference -DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalDiffEl, tpcExpSignalDiffEl, //! Difference between signal and expected for electron - [](float nsigma, float sigma) -> float { return nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalDiffMu, tpcExpSignalDiffMu, //! Difference between signal and expected for muon - [](float nsigma, float sigma) -> float { return nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalDiffPi, tpcExpSignalDiffPi, //! Difference between signal and expected for pion - [](float nsigma, float sigma) -> float { return nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalDiffKa, tpcExpSignalDiffKa, //! Difference between signal and expected for kaon - [](float nsigma, float sigma) -> float { return nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalDiffPr, tpcExpSignalDiffPr, //! Difference between signal and expected for proton - [](float nsigma, float sigma) -> float { return nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalDiffDe, tpcExpSignalDiffDe, //! Difference between signal and expected for deuteron - [](float nsigma, float sigma) -> float { return nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalDiffTr, tpcExpSignalDiffTr, //! Difference between signal and expected for triton - [](float nsigma, float sigma) -> float { return nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalDiffHe, tpcExpSignalDiffHe, //! Difference between signal and expected for helium3 - [](float nsigma, float sigma) -> float { return nsigma * sigma; }); -DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalDiffAl, tpcExpSignalDiffAl, //! Difference between signal and expected for alpha - [](float nsigma, float sigma) -> float { return nsigma * sigma; }); -// Expected sigma -DECLARE_SOA_COLUMN(TPCExpSigmaEl, tpcExpSigmaEl, float); //! Expected resolution with the TPC detector for electron -DECLARE_SOA_COLUMN(TPCExpSigmaMu, tpcExpSigmaMu, float); //! Expected resolution with the TPC detector for muon -DECLARE_SOA_COLUMN(TPCExpSigmaPi, tpcExpSigmaPi, float); //! Expected resolution with the TPC detector for pion -DECLARE_SOA_COLUMN(TPCExpSigmaKa, tpcExpSigmaKa, float); //! Expected resolution with the TPC detector for kaon -DECLARE_SOA_COLUMN(TPCExpSigmaPr, tpcExpSigmaPr, float); //! Expected resolution with the TPC detector for proton -DECLARE_SOA_COLUMN(TPCExpSigmaDe, tpcExpSigmaDe, float); //! Expected resolution with the TPC detector for deuteron -DECLARE_SOA_COLUMN(TPCExpSigmaTr, tpcExpSigmaTr, float); //! Expected resolution with the TPC detector for triton -DECLARE_SOA_COLUMN(TPCExpSigmaHe, tpcExpSigmaHe, float); //! Expected resolution with the TPC detector for helium3 -DECLARE_SOA_COLUMN(TPCExpSigmaAl, tpcExpSigmaAl, float); //! Expected resolution with the TPC detector for alpha -// NSigma -DECLARE_SOA_COLUMN(TPCNSigmaEl, tpcNSigmaEl, float); //! Nsigma separation with the TPC detector for electron -DECLARE_SOA_COLUMN(TPCNSigmaMu, tpcNSigmaMu, float); //! Nsigma separation with the TPC detector for muon -DECLARE_SOA_COLUMN(TPCNSigmaPi, tpcNSigmaPi, float); //! Nsigma separation with the TPC detector for pion -DECLARE_SOA_COLUMN(TPCNSigmaKa, tpcNSigmaKa, float); //! Nsigma separation with the TPC detector for kaon -DECLARE_SOA_COLUMN(TPCNSigmaPr, tpcNSigmaPr, float); //! Nsigma separation with the TPC detector for proton -DECLARE_SOA_COLUMN(TPCNSigmaDe, tpcNSigmaDe, float); //! Nsigma separation with the TPC detector for deuteron -DECLARE_SOA_COLUMN(TPCNSigmaTr, tpcNSigmaTr, float); //! Nsigma separation with the TPC detector for triton -DECLARE_SOA_COLUMN(TPCNSigmaHe, tpcNSigmaHe, float); //! Nsigma separation with the TPC detector for helium3 -DECLARE_SOA_COLUMN(TPCNSigmaAl, tpcNSigmaAl, float); //! Nsigma separation with the TPC detector for alpha - -} // namespace pidtpc - -namespace pidtpc_tiny -{ - -struct binning { - public: - typedef int8_t binned_t; - static constexpr int nbins = (1 << 8 * sizeof(binned_t)) - 2; - static constexpr binned_t overflowBin = nbins >> 1; - static constexpr binned_t underflowBin = -(nbins >> 1); - static constexpr float binned_max = 6.35; - static constexpr float binned_min = -6.35; - static constexpr float bin_width = (binned_max - binned_min) / nbins; -}; - -// NSigma with reduced size -DECLARE_SOA_COLUMN(TPCNSigmaStoreEl, tpcNSigmaStoreEl, binning::binned_t); //! Stored binned nsigma with the TPC detector for electron -DECLARE_SOA_COLUMN(TPCNSigmaStoreMu, tpcNSigmaStoreMu, binning::binned_t); //! Stored binned nsigma with the TPC detector for muon -DECLARE_SOA_COLUMN(TPCNSigmaStorePi, tpcNSigmaStorePi, binning::binned_t); //! Stored binned nsigma with the TPC detector for pion -DECLARE_SOA_COLUMN(TPCNSigmaStoreKa, tpcNSigmaStoreKa, binning::binned_t); //! Stored binned nsigma with the TPC detector for kaon -DECLARE_SOA_COLUMN(TPCNSigmaStorePr, tpcNSigmaStorePr, binning::binned_t); //! Stored binned nsigma with the TPC detector for proton -DECLARE_SOA_COLUMN(TPCNSigmaStoreDe, tpcNSigmaStoreDe, binning::binned_t); //! Stored binned nsigma with the TPC detector for deuteron -DECLARE_SOA_COLUMN(TPCNSigmaStoreTr, tpcNSigmaStoreTr, binning::binned_t); //! Stored binned nsigma with the TPC detector for triton -DECLARE_SOA_COLUMN(TPCNSigmaStoreHe, tpcNSigmaStoreHe, binning::binned_t); //! Stored binned nsigma with the TPC detector for helium3 -DECLARE_SOA_COLUMN(TPCNSigmaStoreAl, tpcNSigmaStoreAl, binning::binned_t); //! Stored binned nsigma with the TPC detector for alpha -// NSigma with reduced size in [binned_min, binned_max] bin size bin_width -DEFINE_UNWRAP_NSIGMA_COLUMN(TPCNSigmaEl, tpcNSigmaEl); //! Unwrapped (float) nsigma with the TPC detector for electron -DEFINE_UNWRAP_NSIGMA_COLUMN(TPCNSigmaMu, tpcNSigmaMu); //! Unwrapped (float) nsigma with the TPC detector for muon -DEFINE_UNWRAP_NSIGMA_COLUMN(TPCNSigmaPi, tpcNSigmaPi); //! Unwrapped (float) nsigma with the TPC detector for pion -DEFINE_UNWRAP_NSIGMA_COLUMN(TPCNSigmaKa, tpcNSigmaKa); //! Unwrapped (float) nsigma with the TPC detector for kaon -DEFINE_UNWRAP_NSIGMA_COLUMN(TPCNSigmaPr, tpcNSigmaPr); //! Unwrapped (float) nsigma with the TPC detector for proton -DEFINE_UNWRAP_NSIGMA_COLUMN(TPCNSigmaDe, tpcNSigmaDe); //! Unwrapped (float) nsigma with the TPC detector for deuteron -DEFINE_UNWRAP_NSIGMA_COLUMN(TPCNSigmaTr, tpcNSigmaTr); //! Unwrapped (float) nsigma with the TPC detector for triton -DEFINE_UNWRAP_NSIGMA_COLUMN(TPCNSigmaHe, tpcNSigmaHe); //! Unwrapped (float) nsigma with the TPC detector for helium3 -DEFINE_UNWRAP_NSIGMA_COLUMN(TPCNSigmaAl, tpcNSigmaAl); //! Unwrapped (float) nsigma with the TPC detector for alpha - -} // namespace pidtpc_tiny - -// Per particle tables -DECLARE_SOA_TABLE(pidTPCFullEl, "AOD", "pidTPCFullEl", //! Table of the TPC (full) response with expected signal, expected resolution and Nsigma for electron - pidtpc::TPCExpSignalEl, pidtpc::TPCExpSignalDiffEl, pidtpc::TPCExpSigmaEl, pidtpc::TPCNSigmaEl); -DECLARE_SOA_TABLE(pidTPCFullMu, "AOD", "pidTPCFullMu", //! Table of the TPC (full) response with expected signal, expected resolution and Nsigma for muon - pidtpc::TPCExpSignalMu, pidtpc::TPCExpSignalDiffMu, pidtpc::TPCExpSigmaMu, pidtpc::TPCNSigmaMu); -DECLARE_SOA_TABLE(pidTPCFullPi, "AOD", "pidTPCFullPi", //! Table of the TPC (full) response with expected signal, expected resolution and Nsigma for pion - pidtpc::TPCExpSignalPi, pidtpc::TPCExpSignalDiffPi, pidtpc::TPCExpSigmaPi, pidtpc::TPCNSigmaPi); -DECLARE_SOA_TABLE(pidTPCFullKa, "AOD", "pidTPCFullKa", //! Table of the TPC (full) response with expected signal, expected resolution and Nsigma for kaon - pidtpc::TPCExpSignalKa, pidtpc::TPCExpSignalDiffKa, pidtpc::TPCExpSigmaKa, pidtpc::TPCNSigmaKa); -DECLARE_SOA_TABLE(pidTPCFullPr, "AOD", "pidTPCFullPr", //! Table of the TPC (full) response with expected signal, expected resolution and Nsigma for proton - pidtpc::TPCExpSignalPr, pidtpc::TPCExpSignalDiffPr, pidtpc::TPCExpSigmaPr, pidtpc::TPCNSigmaPr); -DECLARE_SOA_TABLE(pidTPCFullDe, "AOD", "pidTPCFullDe", //! Table of the TPC (full) response with expected signal, expected resolution and Nsigma for deuteron - pidtpc::TPCExpSignalDe, pidtpc::TPCExpSignalDiffDe, pidtpc::TPCExpSigmaDe, pidtpc::TPCNSigmaDe); -DECLARE_SOA_TABLE(pidTPCFullTr, "AOD", "pidTPCFullTr", //! Table of the TPC (full) response with expected signal, expected resolution and Nsigma for triton - pidtpc::TPCExpSignalTr, pidtpc::TPCExpSignalDiffTr, pidtpc::TPCExpSigmaTr, pidtpc::TPCNSigmaTr); -DECLARE_SOA_TABLE(pidTPCFullHe, "AOD", "pidTPCFullHe", //! Table of the TPC (full) response with expected signal, expected resolution and Nsigma for helium3 - pidtpc::TPCExpSignalHe, pidtpc::TPCExpSignalDiffHe, pidtpc::TPCExpSigmaHe, pidtpc::TPCNSigmaHe); -DECLARE_SOA_TABLE(pidTPCFullAl, "AOD", "pidTPCFullAl", //! Table of the TPC (full) response with expected signal, expected resolution and Nsigma for alpha - pidtpc::TPCExpSignalAl, pidtpc::TPCExpSignalDiffAl, pidtpc::TPCExpSigmaAl, pidtpc::TPCNSigmaAl); - -// Tiny size tables -DECLARE_SOA_TABLE(pidTPCEl, "AOD", "pidTPCEl", //! Table of the TPC response with binned Nsigma for electron - pidtpc_tiny::TPCNSigmaStoreEl, pidtpc_tiny::TPCNSigmaEl); -DECLARE_SOA_TABLE(pidTPCMu, "AOD", "pidTPCMu", //! Table of the TPC response with binned Nsigma for muon - pidtpc_tiny::TPCNSigmaStoreMu, pidtpc_tiny::TPCNSigmaMu); -DECLARE_SOA_TABLE(pidTPCPi, "AOD", "pidTPCPi", //! Table of the TPC response with binned Nsigma for pion - pidtpc_tiny::TPCNSigmaStorePi, pidtpc_tiny::TPCNSigmaPi); -DECLARE_SOA_TABLE(pidTPCKa, "AOD", "pidTPCKa", //! Table of the TPC response with binned Nsigma for kaon - pidtpc_tiny::TPCNSigmaStoreKa, pidtpc_tiny::TPCNSigmaKa); -DECLARE_SOA_TABLE(pidTPCPr, "AOD", "pidTPCPr", //! Table of the TPC response with binned Nsigma for proton - pidtpc_tiny::TPCNSigmaStorePr, pidtpc_tiny::TPCNSigmaPr); -DECLARE_SOA_TABLE(pidTPCDe, "AOD", "pidTPCDe", //! Table of the TPC response with binned Nsigma for deuteron - pidtpc_tiny::TPCNSigmaStoreDe, pidtpc_tiny::TPCNSigmaDe); -DECLARE_SOA_TABLE(pidTPCTr, "AOD", "pidTPCTr", //! Table of the TPC response with binned Nsigma for triton - pidtpc_tiny::TPCNSigmaStoreTr, pidtpc_tiny::TPCNSigmaTr); -DECLARE_SOA_TABLE(pidTPCHe, "AOD", "pidTPCHe", //! Table of the TPC response with binned Nsigma for helium3 - pidtpc_tiny::TPCNSigmaStoreHe, pidtpc_tiny::TPCNSigmaHe); -DECLARE_SOA_TABLE(pidTPCAl, "AOD", "pidTPCAl", //! Table of the TPC response with binned Nsigma for alpha - pidtpc_tiny::TPCNSigmaStoreAl, pidtpc_tiny::TPCNSigmaAl); - -#undef DEFINE_UNWRAP_NSIGMA_COLUMN - -namespace pidbayes -{ -typedef int8_t binned_prob_t; -// Bayesian probabilities with reduced size -DECLARE_SOA_COLUMN(BayesEl, bayesEl, binned_prob_t); //! Bayesian probability for electron expressed in % -DECLARE_SOA_COLUMN(BayesMu, bayesMu, binned_prob_t); //! Bayesian probability for muon expressed in % -DECLARE_SOA_COLUMN(BayesPi, bayesPi, binned_prob_t); //! Bayesian probability for pion expressed in % -DECLARE_SOA_COLUMN(BayesKa, bayesKa, binned_prob_t); //! Bayesian probability for kaon expressed in % -DECLARE_SOA_COLUMN(BayesPr, bayesPr, binned_prob_t); //! Bayesian probability for proton expressed in % -DECLARE_SOA_COLUMN(BayesDe, bayesDe, binned_prob_t); //! Bayesian probability for deuteron expressed in % -DECLARE_SOA_COLUMN(BayesTr, bayesTr, binned_prob_t); //! Bayesian probability for triton expressed in % -DECLARE_SOA_COLUMN(BayesHe, bayesHe, binned_prob_t); //! Bayesian probability for helium3 expressed in % -DECLARE_SOA_COLUMN(BayesAl, bayesAl, binned_prob_t); //! Bayesian probability for alpha expressed in % -DECLARE_SOA_COLUMN(BayesProb, bayesProb, binned_prob_t); //! Bayesian probability of the most probable ID -DECLARE_SOA_COLUMN(BayesID, bayesID, o2::track::pid_constants::ID); //! Most probable ID - -} // namespace pidbayes - -// Table for each particle hypothesis -DECLARE_SOA_TABLE(pidBayesEl, "AOD", "pidBayesEl", //! Binned (in percentage) Bayesian probability of having a Electron - pidbayes::BayesEl); -DECLARE_SOA_TABLE(pidBayesMu, "AOD", "pidBayesMu", //! Binned (in percentage) Bayesian probability of having a Muon - pidbayes::BayesMu); -DECLARE_SOA_TABLE(pidBayesPi, "AOD", "pidBayesPi", //! Binned (in percentage) Bayesian probability of having a Pion - pidbayes::BayesPi); -DECLARE_SOA_TABLE(pidBayesKa, "AOD", "pidBayesKa", //! Binned (in percentage) Bayesian probability of having a Kaon - pidbayes::BayesKa); -DECLARE_SOA_TABLE(pidBayesPr, "AOD", "pidBayesPr", //! Binned (in percentage) Bayesian probability of having a Proton - pidbayes::BayesPr); -DECLARE_SOA_TABLE(pidBayesDe, "AOD", "pidBayesDe", //! Binned (in percentage) Bayesian probability of having a Deuteron - pidbayes::BayesDe); -DECLARE_SOA_TABLE(pidBayesTr, "AOD", "pidBayesTr", //! Binned (in percentage) Bayesian probability of having a Triton - pidbayes::BayesTr); -DECLARE_SOA_TABLE(pidBayesHe, "AOD", "pidBayesHe", //! Binned (in percentage) Bayesian probability of having a Helium3 - pidbayes::BayesHe); -DECLARE_SOA_TABLE(pidBayesAl, "AOD", "pidBayesAl", //! Binned (in percentage) Bayesian probability of having a Alpha - pidbayes::BayesAl); - -// Table for the most probable particle -DECLARE_SOA_TABLE(pidBayes, "AOD", "pidBayes", pidbayes::BayesProb, pidbayes::BayesID); //! Index of the most probable ID and its bayesian probability - } // namespace o2::aod #endif // COMMON_DATAMODEL_PIDRESPONSE_H_ diff --git a/Common/DataModel/PIDResponseCombined.h b/Common/DataModel/PIDResponseCombined.h new file mode 100644 index 00000000000..4b54d214838 --- /dev/null +++ b/Common/DataModel/PIDResponseCombined.h @@ -0,0 +1,76 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// +/// \file PIDResponseCombined.h +/// \author Nicolò Jacazio nicolo.jacazio@cern.ch +/// \brief Set of tables, tasks and utilities to provide the interface between +/// the analysis data model and the combined PID response +/// + +#ifndef COMMON_DATAMODEL_PIDRESPONSECOMBINED_H_ +#define COMMON_DATAMODEL_PIDRESPONSECOMBINED_H_ + +#include + +// O2 includes +#include "Framework/ASoA.h" +#include "Framework/AnalysisDataModel.h" +#include "ReconstructionDataFormats/PID.h" +#include "Framework/Logger.h" + +namespace o2::aod +{ + +namespace pidbayes +{ +typedef int8_t binned_prob_t; +// Bayesian probabilities with reduced size +DECLARE_SOA_COLUMN(BayesEl, bayesEl, binned_prob_t); //! Bayesian probability for electron expressed in % +DECLARE_SOA_COLUMN(BayesMu, bayesMu, binned_prob_t); //! Bayesian probability for muon expressed in % +DECLARE_SOA_COLUMN(BayesPi, bayesPi, binned_prob_t); //! Bayesian probability for pion expressed in % +DECLARE_SOA_COLUMN(BayesKa, bayesKa, binned_prob_t); //! Bayesian probability for kaon expressed in % +DECLARE_SOA_COLUMN(BayesPr, bayesPr, binned_prob_t); //! Bayesian probability for proton expressed in % +DECLARE_SOA_COLUMN(BayesDe, bayesDe, binned_prob_t); //! Bayesian probability for deuteron expressed in % +DECLARE_SOA_COLUMN(BayesTr, bayesTr, binned_prob_t); //! Bayesian probability for triton expressed in % +DECLARE_SOA_COLUMN(BayesHe, bayesHe, binned_prob_t); //! Bayesian probability for helium3 expressed in % +DECLARE_SOA_COLUMN(BayesAl, bayesAl, binned_prob_t); //! Bayesian probability for alpha expressed in % +DECLARE_SOA_COLUMN(BayesProb, bayesProb, binned_prob_t); //! Bayesian probability of the most probable ID +DECLARE_SOA_COLUMN(BayesID, bayesID, o2::track::pid_constants::ID); //! Most probable ID + +} // namespace pidbayes + +// Table for each particle hypothesis +DECLARE_SOA_TABLE(pidBayesEl, "AOD", "pidBayesEl", //! Binned (in percentage) Bayesian probability of having a Electron + pidbayes::BayesEl); +DECLARE_SOA_TABLE(pidBayesMu, "AOD", "pidBayesMu", //! Binned (in percentage) Bayesian probability of having a Muon + pidbayes::BayesMu); +DECLARE_SOA_TABLE(pidBayesPi, "AOD", "pidBayesPi", //! Binned (in percentage) Bayesian probability of having a Pion + pidbayes::BayesPi); +DECLARE_SOA_TABLE(pidBayesKa, "AOD", "pidBayesKa", //! Binned (in percentage) Bayesian probability of having a Kaon + pidbayes::BayesKa); +DECLARE_SOA_TABLE(pidBayesPr, "AOD", "pidBayesPr", //! Binned (in percentage) Bayesian probability of having a Proton + pidbayes::BayesPr); +DECLARE_SOA_TABLE(pidBayesDe, "AOD", "pidBayesDe", //! Binned (in percentage) Bayesian probability of having a Deuteron + pidbayes::BayesDe); +DECLARE_SOA_TABLE(pidBayesTr, "AOD", "pidBayesTr", //! Binned (in percentage) Bayesian probability of having a Triton + pidbayes::BayesTr); +DECLARE_SOA_TABLE(pidBayesHe, "AOD", "pidBayesHe", //! Binned (in percentage) Bayesian probability of having a Helium3 + pidbayes::BayesHe); +DECLARE_SOA_TABLE(pidBayesAl, "AOD", "pidBayesAl", //! Binned (in percentage) Bayesian probability of having a Alpha + pidbayes::BayesAl); + +// Table for the most probable particle +DECLARE_SOA_TABLE(pidBayes, "AOD", "pidBayes", pidbayes::BayesProb, pidbayes::BayesID); //! Index of the most probable ID and its bayesian probability + +} // namespace o2::aod + +#endif // COMMON_DATAMODEL_PIDRESPONSECOMBINED_H_ diff --git a/Common/DataModel/PIDResponseTOF.h b/Common/DataModel/PIDResponseTOF.h new file mode 100644 index 00000000000..aa3d768c8d2 --- /dev/null +++ b/Common/DataModel/PIDResponseTOF.h @@ -0,0 +1,485 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// +/// \file PIDResponseTOF.h +/// \since 2024-11-15 +/// \author Nicolò Jacazio nicolo.jacazio@cern.ch +/// \brief Set of tables, tasks and utilities to provide the interface between +/// the analysis data model and the PID response of the TOF +/// + +#ifndef COMMON_DATAMODEL_PIDRESPONSETOF_H_ +#define COMMON_DATAMODEL_PIDRESPONSETOF_H_ + +#include + +// O2 includes +#include "Framework/ASoA.h" +#include "Framework/AnalysisDataModel.h" +#include "ReconstructionDataFormats/PID.h" +#include "Framework/Logger.h" + +namespace o2::aod +{ +namespace pidutils +{ + +// Checkers for TOF PID hypothesis availability (runtime) +template +using hasTOFEl = decltype(std::declval().tofNSigmaEl()); +template +using hasTOFMu = decltype(std::declval().tofNSigmaMu()); +template +using hasTOFPi = decltype(std::declval().tofNSigmaPi()); +template +using hasTOFKa = decltype(std::declval().tofNSigmaKa()); +template +using hasTOFPr = decltype(std::declval().tofNSigmaPr()); +template +using hasTOFDe = decltype(std::declval().tofNSigmaDe()); +template +using hasTOFTr = decltype(std::declval().tofNSigmaTr()); +template +using hasTOFHe = decltype(std::declval().tofNSigmaHe()); +template +using hasTOFAl = decltype(std::declval().tofNSigmaAl()); + +// PID index as template argument +#define perSpeciesWrapper(functionName) \ + template \ + auto functionName(const TrackType& track) \ + { \ + if constexpr (index == o2::track::PID::Electron) { \ + return track.functionName##El(); \ + } else if constexpr (index == o2::track::PID::Muon) { \ + return track.functionName##Mu(); \ + } else if constexpr (index == o2::track::PID::Pion) { \ + return track.functionName##Pi(); \ + } else if constexpr (index == o2::track::PID::Kaon) { \ + return track.functionName##Ka(); \ + } else if constexpr (index == o2::track::PID::Proton) { \ + return track.functionName##Pr(); \ + } else if constexpr (index == o2::track::PID::Deuteron) { \ + return track.functionName##De(); \ + } else if constexpr (index == o2::track::PID::Triton) { \ + return track.functionName##Tr(); \ + } else if constexpr (index == o2::track::PID::Helium3) { \ + return track.functionName##He(); \ + } else if constexpr (index == o2::track::PID::Alpha) { \ + return track.functionName##Al(); \ + } \ + } + +perSpeciesWrapper(tofNSigma); +perSpeciesWrapper(tofExpSigma); +template +auto tofExpSignal(const TrackType& track) +{ + if constexpr (index == o2::track::PID::Electron) { + return track.tofExpSignalEl(track.tofSignal()); + } else if constexpr (index == o2::track::PID::Muon) { + return track.tofExpSignalMu(track.tofSignal()); + } else if constexpr (index == o2::track::PID::Pion) { + return track.tofExpSignalPi(track.tofSignal()); + } else if constexpr (index == o2::track::PID::Kaon) { + return track.tofExpSignalKa(track.tofSignal()); + } else if constexpr (index == o2::track::PID::Proton) { + return track.tofExpSignalPr(track.tofSignal()); + } else if constexpr (index == o2::track::PID::Deuteron) { + return track.tofExpSignalDe(track.tofSignal()); + } else if constexpr (index == o2::track::PID::Triton) { + return track.tofExpSignalTr(track.tofSignal()); + } else if constexpr (index == o2::track::PID::Helium3) { + return track.tofExpSignalHe(track.tofSignal()); + } else if constexpr (index == o2::track::PID::Alpha) { + return track.tofExpSignalAl(track.tofSignal()); + } +} +perSpeciesWrapper(tofExpSignalDiff); + +#undef perSpeciesWrapper + +// PID index as function argument for TOF +#define perSpeciesWrapper(functionName) \ + template \ + auto functionName(const o2::track::PID::ID index, const TrackType& track) \ + { \ + switch (index) { \ + case o2::track::PID::Electron: \ + if constexpr (std::experimental::is_detected::value) { \ + return track.functionName##El(); \ + } \ + case o2::track::PID::Muon: \ + if constexpr (std::experimental::is_detected::value) { \ + return track.functionName##Mu(); \ + } \ + case o2::track::PID::Pion: \ + if constexpr (std::experimental::is_detected::value) { \ + return track.functionName##Pi(); \ + } \ + case o2::track::PID::Kaon: \ + if constexpr (std::experimental::is_detected::value) { \ + return track.functionName##Ka(); \ + } \ + case o2::track::PID::Proton: \ + if constexpr (std::experimental::is_detected::value) { \ + return track.functionName##Pr(); \ + } \ + case o2::track::PID::Deuteron: \ + if constexpr (std::experimental::is_detected::value) { \ + return track.functionName##De(); \ + } \ + case o2::track::PID::Triton: \ + if constexpr (std::experimental::is_detected::value) { \ + return track.functionName##Tr(); \ + } \ + case o2::track::PID::Helium3: \ + if constexpr (std::experimental::is_detected::value) { \ + return track.functionName##He(); \ + } \ + case o2::track::PID::Alpha: \ + if constexpr (std::experimental::is_detected::value) { \ + return track.functionName##Al(); \ + } \ + default: \ + LOGF(fatal, "TOF PID table for PID index %i (%s) is not available", index, o2::track::PID::getName(index)); \ + return 0.f; \ + } \ + } + +perSpeciesWrapper(tofNSigma); +perSpeciesWrapper(tofExpSigma); +template +auto tofExpSignal(const o2::track::PID::ID index, const TrackType& track) +{ + switch (index) { + case o2::track::PID::Electron: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSignalEl(track.tofSignal()); + } + case o2::track::PID::Muon: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSignalMu(track.tofSignal()); + } + case o2::track::PID::Pion: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSignalPi(track.tofSignal()); + } + case o2::track::PID::Kaon: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSignalKa(track.tofSignal()); + } + case o2::track::PID::Proton: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSignalPr(track.tofSignal()); + } + case o2::track::PID::Deuteron: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSignalDe(track.tofSignal()); + } + case o2::track::PID::Triton: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSignalTr(track.tofSignal()); + } + case o2::track::PID::Helium3: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSignalHe(track.tofSignal()); + } + case o2::track::PID::Alpha: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSignalAl(track.tofSignal()); + } + default: + LOGF(fatal, "TOF PID table for PID index %i (%s) is not available", index, o2::track::PID::getName(index)); + return 0.f; + } +} +perSpeciesWrapper(tofExpSignalDiff); + +#undef perSpeciesWrapper + +} // namespace pidutils + +namespace pidtof +{ +// Expected signals +DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalEl, tofExpSignalEl, //! Expected time for electron + [](float nsigma, float sigma, float tofsignal) -> float { return tofsignal - nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalMu, tofExpSignalMu, //! Expected time for muon + [](float nsigma, float sigma, float tofsignal) -> float { return tofsignal - nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalPi, tofExpSignalPi, //! Expected time for pion + [](float nsigma, float sigma, float tofsignal) -> float { return tofsignal - nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalKa, tofExpSignalKa, //! Expected time for kaon + [](float nsigma, float sigma, float tofsignal) -> float { return tofsignal - nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalPr, tofExpSignalPr, //! Expected time for proton + [](float nsigma, float sigma, float tofsignal) -> float { return tofsignal - nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalDe, tofExpSignalDe, //! Expected time for deuteron + [](float nsigma, float sigma, float tofsignal) -> float { return tofsignal - nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalTr, tofExpSignalTr, //! Expected time for triton + [](float nsigma, float sigma, float tofsignal) -> float { return tofsignal - nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalHe, tofExpSignalHe, //! Expected time for helium3 + [](float nsigma, float sigma, float tofsignal) -> float { return tofsignal - nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalAl, tofExpSignalAl, //! Expected time for alpha + [](float nsigma, float sigma, float tofsignal) -> float { return tofsignal - nsigma * sigma; }); +// Delta with respect to signal +DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalDiffEl, tofExpSignalDiffEl, //! Difference between signal and expected for electron + [](float nsigma, float sigma) -> float { return nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalDiffMu, tofExpSignalDiffMu, //! Difference between signal and expected for muon + [](float nsigma, float sigma) -> float { return nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalDiffPi, tofExpSignalDiffPi, //! Difference between signal and expected for pion + [](float nsigma, float sigma) -> float { return nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalDiffKa, tofExpSignalDiffKa, //! Difference between signal and expected for kaon + [](float nsigma, float sigma) -> float { return nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalDiffPr, tofExpSignalDiffPr, //! Difference between signal and expected for proton + [](float nsigma, float sigma) -> float { return nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalDiffDe, tofExpSignalDiffDe, //! Difference between signal and expected for deuteron + [](float nsigma, float sigma) -> float { return nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalDiffTr, tofExpSignalDiffTr, //! Difference between signal and expected for triton + [](float nsigma, float sigma) -> float { return nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalDiffHe, tofExpSignalDiffHe, //! Difference between signal and expected for helium3 + [](float nsigma, float sigma) -> float { return nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TOFExpSignalDiffAl, tofExpSignalDiffAl, //! Difference between signal and expected for alpha + [](float nsigma, float sigma) -> float { return nsigma * sigma; }); +// Expected sigma +DECLARE_SOA_COLUMN(TOFExpSigmaEl, tofExpSigmaEl, float); //! Expected resolution with the TOF detector for electron +DECLARE_SOA_COLUMN(TOFExpSigmaMu, tofExpSigmaMu, float); //! Expected resolution with the TOF detector for muon +DECLARE_SOA_COLUMN(TOFExpSigmaPi, tofExpSigmaPi, float); //! Expected resolution with the TOF detector for pion +DECLARE_SOA_COLUMN(TOFExpSigmaKa, tofExpSigmaKa, float); //! Expected resolution with the TOF detector for kaon +DECLARE_SOA_COLUMN(TOFExpSigmaPr, tofExpSigmaPr, float); //! Expected resolution with the TOF detector for proton +DECLARE_SOA_COLUMN(TOFExpSigmaDe, tofExpSigmaDe, float); //! Expected resolution with the TOF detector for deuteron +DECLARE_SOA_COLUMN(TOFExpSigmaTr, tofExpSigmaTr, float); //! Expected resolution with the TOF detector for triton +DECLARE_SOA_COLUMN(TOFExpSigmaHe, tofExpSigmaHe, float); //! Expected resolution with the TOF detector for helium3 +DECLARE_SOA_COLUMN(TOFExpSigmaAl, tofExpSigmaAl, float); //! Expected resolution with the TOF detector for alpha +// NSigma +DECLARE_SOA_COLUMN(TOFNSigmaEl, tofNSigmaEl, float); //! Nsigma separation with the TOF detector for electron +DECLARE_SOA_COLUMN(TOFNSigmaMu, tofNSigmaMu, float); //! Nsigma separation with the TOF detector for muon +DECLARE_SOA_COLUMN(TOFNSigmaPi, tofNSigmaPi, float); //! Nsigma separation with the TOF detector for pion +DECLARE_SOA_COLUMN(TOFNSigmaKa, tofNSigmaKa, float); //! Nsigma separation with the TOF detector for kaon +DECLARE_SOA_COLUMN(TOFNSigmaPr, tofNSigmaPr, float); //! Nsigma separation with the TOF detector for proton +DECLARE_SOA_COLUMN(TOFNSigmaDe, tofNSigmaDe, float); //! Nsigma separation with the TOF detector for deuteron +DECLARE_SOA_COLUMN(TOFNSigmaTr, tofNSigmaTr, float); //! Nsigma separation with the TOF detector for triton +DECLARE_SOA_COLUMN(TOFNSigmaHe, tofNSigmaHe, float); //! Nsigma separation with the TOF detector for helium3 +DECLARE_SOA_COLUMN(TOFNSigmaAl, tofNSigmaAl, float); //! Nsigma separation with the TOF detector for alpha + +} // namespace pidtof + +namespace pidtof_tiny +{ +struct binning { + public: + typedef int8_t binned_t; + static constexpr int nbins = (1 << 8 * sizeof(binned_t)) - 2; + static constexpr binned_t overflowBin = nbins >> 1; + static constexpr binned_t underflowBin = -(nbins >> 1); + static constexpr float binned_max = 6.35; + static constexpr float binned_min = -6.35; + static constexpr float bin_width = (binned_max - binned_min) / nbins; + + // Function to pack a float into a binned value in table + template + static void packInTable(const float& valueToBin, T& table) + { + if (valueToBin <= binned_min) { + table(underflowBin); + } else if (valueToBin >= binned_max) { + table(overflowBin); + } else if (valueToBin >= 0) { + table(static_cast((valueToBin / bin_width) + 0.5f)); + } else { + table(static_cast((valueToBin / bin_width) - 0.5f)); + } + } + + // Function to unpack a binned value into a float + static float unPackInTable(const binned_t& valueToUnpack) + { + return bin_width * static_cast(valueToUnpack); + } +}; + +// NSigma with reduced size 8 bit +DECLARE_SOA_COLUMN(TOFNSigmaStoreEl, tofNSigmaStoreEl, binning::binned_t); //! Stored binned nsigma with the TOF detector for electron +DECLARE_SOA_COLUMN(TOFNSigmaStoreMu, tofNSigmaStoreMu, binning::binned_t); //! Stored binned nsigma with the TOF detector for muon +DECLARE_SOA_COLUMN(TOFNSigmaStorePi, tofNSigmaStorePi, binning::binned_t); //! Stored binned nsigma with the TOF detector for pion +DECLARE_SOA_COLUMN(TOFNSigmaStoreKa, tofNSigmaStoreKa, binning::binned_t); //! Stored binned nsigma with the TOF detector for kaon +DECLARE_SOA_COLUMN(TOFNSigmaStorePr, tofNSigmaStorePr, binning::binned_t); //! Stored binned nsigma with the TOF detector for proton +DECLARE_SOA_COLUMN(TOFNSigmaStoreDe, tofNSigmaStoreDe, binning::binned_t); //! Stored binned nsigma with the TOF detector for deuteron +DECLARE_SOA_COLUMN(TOFNSigmaStoreTr, tofNSigmaStoreTr, binning::binned_t); //! Stored binned nsigma with the TOF detector for triton +DECLARE_SOA_COLUMN(TOFNSigmaStoreHe, tofNSigmaStoreHe, binning::binned_t); //! Stored binned nsigma with the TOF detector for helium3 +DECLARE_SOA_COLUMN(TOFNSigmaStoreAl, tofNSigmaStoreAl, binning::binned_t); //! Stored binned nsigma with the TOF detector for alpha + +// NSigma with reduced size in [binned_min, binned_max] bin size bin_width +DECLARE_SOA_DYNAMIC_COLUMN(TOFNSigmaEl, tofNSigmaEl, //! Unwrapped (float) nsigma with the TOF detector for electron + [](binning::binned_t nsigma_binned) -> float { return binning::unPackInTable(nsigma_binned); }); +DECLARE_SOA_DYNAMIC_COLUMN(TOFNSigmaMu, tofNSigmaMu, //! Unwrapped (float) nsigma with the TOF detector for muon + [](binning::binned_t nsigma_binned) -> float { return binning::unPackInTable(nsigma_binned); }); +DECLARE_SOA_DYNAMIC_COLUMN(TOFNSigmaPi, tofNSigmaPi, //! Unwrapped (float) nsigma with the TOF detector for pion + [](binning::binned_t nsigma_binned) -> float { return binning::unPackInTable(nsigma_binned); }); +DECLARE_SOA_DYNAMIC_COLUMN(TOFNSigmaKa, tofNSigmaKa, //! Unwrapped (float) nsigma with the TOF detector for kaon + [](binning::binned_t nsigma_binned) -> float { return binning::unPackInTable(nsigma_binned); }); +DECLARE_SOA_DYNAMIC_COLUMN(TOFNSigmaPr, tofNSigmaPr, //! Unwrapped (float) nsigma with the TOF detector for proton + [](binning::binned_t nsigma_binned) -> float { return binning::unPackInTable(nsigma_binned); }); +DECLARE_SOA_DYNAMIC_COLUMN(TOFNSigmaDe, tofNSigmaDe, //! Unwrapped (float) nsigma with the TOF detector for deuteron + [](binning::binned_t nsigma_binned) -> float { return binning::unPackInTable(nsigma_binned); }); +DECLARE_SOA_DYNAMIC_COLUMN(TOFNSigmaTr, tofNSigmaTr, //! Unwrapped (float) nsigma with the TOF detector for triton + [](binning::binned_t nsigma_binned) -> float { return binning::unPackInTable(nsigma_binned); }); +DECLARE_SOA_DYNAMIC_COLUMN(TOFNSigmaHe, tofNSigmaHe, //! Unwrapped (float) nsigma with the TOF detector for helium3 + [](binning::binned_t nsigma_binned) -> float { return binning::unPackInTable(nsigma_binned); }); +DECLARE_SOA_DYNAMIC_COLUMN(TOFNSigmaAl, tofNSigmaAl, //! Unwrapped (float) nsigma with the TOF detector for alpha + [](binning::binned_t nsigma_binned) -> float { return binning::unPackInTable(nsigma_binned); }); + +} // namespace pidtof_tiny + +// Per particle tables +DECLARE_SOA_TABLE(pidTOFFullEl, "AOD", "pidTOFFullEl", //! Table of the TOF (full) response with expected signal, expected resolution and Nsigma for electron + pidtof::TOFExpSignalDiffEl, + pidtof::TOFExpSignalEl, + pidtof::TOFExpSigmaEl, pidtof::TOFNSigmaEl); +DECLARE_SOA_TABLE(pidTOFFullMu, "AOD", "pidTOFFullMu", //! Table of the TOF (full) response with expected signal, expected resolution and Nsigma for muon + pidtof::TOFExpSignalDiffMu, + pidtof::TOFExpSignalMu, + pidtof::TOFExpSigmaMu, pidtof::TOFNSigmaMu); +DECLARE_SOA_TABLE(pidTOFFullPi, "AOD", "pidTOFFullPi", //! Table of the TOF (full) response with expected signal, expected resolution and Nsigma for pion + pidtof::TOFExpSignalDiffPi, + pidtof::TOFExpSignalPi, + pidtof::TOFExpSigmaPi, pidtof::TOFNSigmaPi); +DECLARE_SOA_TABLE(pidTOFFullKa, "AOD", "pidTOFFullKa", //! Table of the TOF (full) response with expected signal, expected resolution and Nsigma for kaon + pidtof::TOFExpSignalDiffKa, + pidtof::TOFExpSignalKa, + pidtof::TOFExpSigmaKa, pidtof::TOFNSigmaKa); +DECLARE_SOA_TABLE(pidTOFFullPr, "AOD", "pidTOFFullPr", //! Table of the TOF (full) response with expected signal, expected resolution and Nsigma for proton + pidtof::TOFExpSignalDiffPr, + pidtof::TOFExpSignalPr, + pidtof::TOFExpSigmaPr, pidtof::TOFNSigmaPr); +DECLARE_SOA_TABLE(pidTOFFullDe, "AOD", "pidTOFFullDe", //! Table of the TOF (full) response with expected signal, expected resolution and Nsigma for deuteron + pidtof::TOFExpSignalDiffDe, + pidtof::TOFExpSignalDe, + pidtof::TOFExpSigmaDe, pidtof::TOFNSigmaDe); +DECLARE_SOA_TABLE(pidTOFFullTr, "AOD", "pidTOFFullTr", //! Table of the TOF (full) response with expected signal, expected resolution and Nsigma for triton + pidtof::TOFExpSignalDiffTr, + pidtof::TOFExpSignalTr, + pidtof::TOFExpSigmaTr, pidtof::TOFNSigmaTr); +DECLARE_SOA_TABLE(pidTOFFullHe, "AOD", "pidTOFFullHe", //! Table of the TOF (full) response with expected signal, expected resolution and Nsigma for helium3 + pidtof::TOFExpSignalDiffHe, + pidtof::TOFExpSignalHe, + pidtof::TOFExpSigmaHe, pidtof::TOFNSigmaHe); +DECLARE_SOA_TABLE(pidTOFFullAl, "AOD", "pidTOFFullAl", //! Table of the TOF (full) response with expected signal, expected resolution and Nsigma for alpha + pidtof::TOFExpSignalDiffAl, + pidtof::TOFExpSignalAl, + pidtof::TOFExpSigmaAl, pidtof::TOFNSigmaAl); + +// Tiny size tables +DECLARE_SOA_TABLE(pidTOFEl, "AOD", "pidTOFEl", //! Table of the TOF response with binned Nsigma for electron + pidtof_tiny::TOFNSigmaStoreEl, pidtof_tiny::TOFNSigmaEl); +DECLARE_SOA_TABLE(pidTOFMu, "AOD", "pidTOFMu", //! Table of the TOF response with binned Nsigma for muon + pidtof_tiny::TOFNSigmaStoreMu, pidtof_tiny::TOFNSigmaMu); +DECLARE_SOA_TABLE(pidTOFPi, "AOD", "pidTOFPi", //! Table of the TOF response with binned Nsigma for pion + pidtof_tiny::TOFNSigmaStorePi, pidtof_tiny::TOFNSigmaPi); +DECLARE_SOA_TABLE(pidTOFKa, "AOD", "pidTOFKa", //! Table of the TOF response with binned Nsigma for kaon + pidtof_tiny::TOFNSigmaStoreKa, pidtof_tiny::TOFNSigmaKa); +DECLARE_SOA_TABLE(pidTOFPr, "AOD", "pidTOFPr", //! Table of the TOF response with binned Nsigma for proton + pidtof_tiny::TOFNSigmaStorePr, pidtof_tiny::TOFNSigmaPr); +DECLARE_SOA_TABLE(pidTOFDe, "AOD", "pidTOFDe", //! Table of the TOF response with binned Nsigma for deuteron + pidtof_tiny::TOFNSigmaStoreDe, pidtof_tiny::TOFNSigmaDe); +DECLARE_SOA_TABLE(pidTOFTr, "AOD", "pidTOFTr", //! Table of the TOF response with binned Nsigma for triton + pidtof_tiny::TOFNSigmaStoreTr, pidtof_tiny::TOFNSigmaTr); +DECLARE_SOA_TABLE(pidTOFHe, "AOD", "pidTOFHe", //! Table of the TOF response with binned Nsigma for helium3 + pidtof_tiny::TOFNSigmaStoreHe, pidtof_tiny::TOFNSigmaHe); +DECLARE_SOA_TABLE(pidTOFAl, "AOD", "pidTOFAl", //! Table of the TOF response with binned Nsigma for alpha + pidtof_tiny::TOFNSigmaStoreAl, pidtof_tiny::TOFNSigmaAl); + +// Extra tables +namespace pidflags +{ + +namespace enums +{ +enum PIDFlags : uint8_t { + EvTimeUndef = 0x0, // Event collision not set, corresponding to the LHC Fill event time + EvTimeTOF = 0x1, // Event collision time from TOF + EvTimeT0AC = 0x2, // Event collision time from the FT0AC + EvTimeTOFT0AC = 0x4 // Event collision time from the TOF and FT0AC +}; +} + +DECLARE_SOA_COLUMN(GoodTOFMatch, goodTOFMatch, bool); //! Bool for the TOF PID information on the single track information +DECLARE_SOA_COLUMN(TOFFlags, tofFlags, uint8_t); //! Flag for the complementary TOF PID information for the event time +DECLARE_SOA_DYNAMIC_COLUMN(IsEvTimeDefined, isEvTimeDefined, //! True if the Event Time was computed with any method i.e. there is a usable event time + [](uint8_t flags) -> bool { return (flags > 0); }); +DECLARE_SOA_DYNAMIC_COLUMN(IsEvTimeTOF, isEvTimeTOF, //! True if the Event Time was computed with the TOF + [](uint8_t flags) -> bool { return (flags & enums::PIDFlags::EvTimeTOF) == enums::PIDFlags::EvTimeTOF; }); +DECLARE_SOA_DYNAMIC_COLUMN(IsEvTimeT0AC, isEvTimeT0AC, //! True if the Event Time was computed with the T0AC + [](uint8_t flags) -> bool { return (flags & enums::PIDFlags::EvTimeT0AC) == enums::PIDFlags::EvTimeT0AC; }); +DECLARE_SOA_DYNAMIC_COLUMN(IsEvTimeTOFT0AC, isEvTimeTOFT0AC, //! True if the Event Time was computed with the TOF and T0AC + [](uint8_t flags) -> bool { return (flags & enums::PIDFlags::EvTimeTOFT0AC) == enums::PIDFlags::EvTimeTOFT0AC; }); + +} // namespace pidflags + +DECLARE_SOA_TABLE(pidTOFFlags, "AOD", "pidTOFFlags", //! Table of the flags for TOF signal quality on the track level + pidflags::GoodTOFMatch); + +DECLARE_SOA_TABLE(pidEvTimeFlags, "AOD", "pidEvTimeFlags", //! Table of the PID flags for the event time tables + pidflags::TOFFlags, + pidflags::IsEvTimeDefined, + pidflags::IsEvTimeTOF, + pidflags::IsEvTimeT0AC, + pidflags::IsEvTimeTOFT0AC); + +namespace pidtofsignal +{ +DECLARE_SOA_COLUMN(TOFSignal, tofSignal, float); //! TOF signal from track time +DECLARE_SOA_DYNAMIC_COLUMN(EventCollisionTime, eventCollisionTime, //! Event collision time used for the track. Needs the TOF + [](float signal, float tMinusTexp, float texp) -> float { return texp + tMinusTexp - signal; }); + +} // namespace pidtofsignal + +DECLARE_SOA_TABLE(TOFSignal, "AOD", "TOFSignal", //! Table of the TOF signal + pidtofsignal::TOFSignal, + pidtofsignal::EventCollisionTime); + +namespace pidtofevtime +{ +DECLARE_SOA_COLUMN(TOFEvTime, tofEvTime, float); //! event time for TOF signal. Can be obtained via a combination of detectors e.g. TOF, FT0A, FT0C +DECLARE_SOA_COLUMN(TOFEvTimeErr, tofEvTimeErr, float); //! event time error for TOF. Can be obtained via a combination of detectors e.g. TOF, FT0A, FT0C +} // namespace pidtofevtime + +DECLARE_SOA_TABLE(TOFEvTime, "AOD", "TOFEvTime", //! Table of the TOF event time. One entry per track. + pidtofevtime::TOFEvTime, + pidtofevtime::TOFEvTimeErr); + +namespace pidtofbeta +{ +DECLARE_SOA_COLUMN(Beta, beta, float); //! TOF beta +DECLARE_SOA_COLUMN(BetaError, betaerror, float); //! Uncertainty on the TOF beta +// +DECLARE_SOA_COLUMN(ExpBetaEl, expbetael, float); //! Expected beta of electron +DECLARE_SOA_COLUMN(ExpBetaElError, expbetaelerror, float); //! Expected uncertainty on the beta of electron +// +DECLARE_SOA_COLUMN(SeparationBetaEl, separationbetael, float); //! Separation computed with the expected beta for electrons +DECLARE_SOA_DYNAMIC_COLUMN(DiffBetaEl, diffbetael, //! Difference between the measured and the expected beta for electrons + [](float beta, float expbetael) -> float { return beta - expbetael; }); +} // namespace pidtofbeta + +DECLARE_SOA_TABLE(pidTOFbeta, "AOD", "pidTOFbeta", //! Table of the TOF beta + pidtofbeta::Beta, pidtofbeta::BetaError); + +namespace pidtofmass +{ +DECLARE_SOA_COLUMN(TOFMass, mass, float); //! TOF mass +} // namespace pidtofmass + +DECLARE_SOA_TABLE(pidTOFmass, "AOD", "pidTOFmass", //! Table of the TOF mass + pidtofmass::TOFMass); + +} // namespace o2::aod + +#endif // COMMON_DATAMODEL_PIDRESPONSETOF_H_ diff --git a/Common/DataModel/PIDResponseTPC.h b/Common/DataModel/PIDResponseTPC.h new file mode 100644 index 00000000000..a22d5c9c008 --- /dev/null +++ b/Common/DataModel/PIDResponseTPC.h @@ -0,0 +1,411 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// +/// \file PIDResponseTPC.h +/// \since 2024-11-15 +/// \author Nicolò Jacazio nicolo.jacazio@cern.ch +/// \brief Set of tables, tasks and utilities to provide the interface between +/// the analysis data model and the PID response of the TPC +/// + +#ifndef COMMON_DATAMODEL_PIDRESPONSETPC_H_ +#define COMMON_DATAMODEL_PIDRESPONSETPC_H_ + +#include + +// O2 includes +#include "Framework/ASoA.h" +#include "Framework/AnalysisDataModel.h" +#include "ReconstructionDataFormats/PID.h" +#include "Framework/Logger.h" + +namespace o2::aod +{ +namespace pidutils +{ + +// Checkers for TPC PID hypothesis availability (runtime) +template +using hasTPCEl = decltype(std::declval().tpcNSigmaEl()); +template +using hasTPCMu = decltype(std::declval().tpcNSigmaMu()); +template +using hasTPCPi = decltype(std::declval().tpcNSigmaPi()); +template +using hasTPCKa = decltype(std::declval().tpcNSigmaKa()); +template +using hasTPCPr = decltype(std::declval().tpcNSigmaPr()); +template +using hasTPCDe = decltype(std::declval().tpcNSigmaDe()); +template +using hasTPCTr = decltype(std::declval().tpcNSigmaTr()); +template +using hasTPCHe = decltype(std::declval().tpcNSigmaHe()); +template +using hasTPCAl = decltype(std::declval().tpcNSigmaAl()); + +// PID index as template argument +#define perSpeciesWrapper(functionName) \ + template \ + auto functionName(const TrackType& track) \ + { \ + if constexpr (index == o2::track::PID::Electron) { \ + return track.functionName##El(); \ + } else if constexpr (index == o2::track::PID::Muon) { \ + return track.functionName##Mu(); \ + } else if constexpr (index == o2::track::PID::Pion) { \ + return track.functionName##Pi(); \ + } else if constexpr (index == o2::track::PID::Kaon) { \ + return track.functionName##Ka(); \ + } else if constexpr (index == o2::track::PID::Proton) { \ + return track.functionName##Pr(); \ + } else if constexpr (index == o2::track::PID::Deuteron) { \ + return track.functionName##De(); \ + } else if constexpr (index == o2::track::PID::Triton) { \ + return track.functionName##Tr(); \ + } else if constexpr (index == o2::track::PID::Helium3) { \ + return track.functionName##He(); \ + } else if constexpr (index == o2::track::PID::Alpha) { \ + return track.functionName##Al(); \ + } \ + } + +perSpeciesWrapper(tpcNSigma); +perSpeciesWrapper(tpcExpSigma); +template +auto tpcExpSignal(const TrackType& track) +{ + if constexpr (index == o2::track::PID::Electron) { + return track.tpcExpSignalEl(track.tpcSignal()); + } else if constexpr (index == o2::track::PID::Muon) { + return track.tpcExpSignalMu(track.tpcSignal()); + } else if constexpr (index == o2::track::PID::Pion) { + return track.tpcExpSignalPi(track.tpcSignal()); + } else if constexpr (index == o2::track::PID::Kaon) { + return track.tpcExpSignalKa(track.tpcSignal()); + } else if constexpr (index == o2::track::PID::Proton) { + return track.tpcExpSignalPr(track.tpcSignal()); + } else if constexpr (index == o2::track::PID::Deuteron) { + return track.tpcExpSignalDe(track.tpcSignal()); + } else if constexpr (index == o2::track::PID::Triton) { + return track.tpcExpSignalTr(track.tpcSignal()); + } else if constexpr (index == o2::track::PID::Helium3) { + return track.tpcExpSignalHe(track.tpcSignal()); + } else if constexpr (index == o2::track::PID::Alpha) { + return track.tpcExpSignalAl(track.tpcSignal()); + } +} +perSpeciesWrapper(tpcExpSignalDiff); + +#undef perSpeciesWrapper + +// PID index as function argument for TPC +#define perSpeciesWrapper(functionName) \ + template \ + auto functionName(const o2::track::PID::ID index, const TrackType& track) \ + { \ + switch (index) { \ + case o2::track::PID::Electron: \ + if constexpr (std::experimental::is_detected::value) { \ + return track.functionName##El(); \ + } \ + case o2::track::PID::Muon: \ + if constexpr (std::experimental::is_detected::value) { \ + return track.functionName##Mu(); \ + } \ + case o2::track::PID::Pion: \ + if constexpr (std::experimental::is_detected::value) { \ + return track.functionName##Pi(); \ + } \ + case o2::track::PID::Kaon: \ + if constexpr (std::experimental::is_detected::value) { \ + return track.functionName##Ka(); \ + } \ + case o2::track::PID::Proton: \ + if constexpr (std::experimental::is_detected::value) { \ + return track.functionName##Pr(); \ + } \ + case o2::track::PID::Deuteron: \ + if constexpr (std::experimental::is_detected::value) { \ + return track.functionName##De(); \ + } \ + case o2::track::PID::Triton: \ + if constexpr (std::experimental::is_detected::value) { \ + return track.functionName##Tr(); \ + } \ + case o2::track::PID::Helium3: \ + if constexpr (std::experimental::is_detected::value) { \ + return track.functionName##He(); \ + } \ + case o2::track::PID::Alpha: \ + if constexpr (std::experimental::is_detected::value) { \ + return track.functionName##Al(); \ + } \ + default: \ + LOGF(fatal, "TPC PID table for PID index %i (%s) is not available", index, o2::track::PID::getName(index)); \ + return 0.f; \ + } \ + } + +perSpeciesWrapper(tpcNSigma); +perSpeciesWrapper(tpcExpSigma); +template +auto tpcExpSignal(const o2::track::PID::ID index, const TrackType& track) +{ + switch (index) { + case o2::track::PID::Electron: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSignalEl(track.tpcSignal()); + } + case o2::track::PID::Muon: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSignalMu(track.tpcSignal()); + } + case o2::track::PID::Pion: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSignalPi(track.tpcSignal()); + } + case o2::track::PID::Kaon: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSignalKa(track.tpcSignal()); + } + case o2::track::PID::Proton: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSignalPr(track.tpcSignal()); + } + case o2::track::PID::Deuteron: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSignalDe(track.tpcSignal()); + } + case o2::track::PID::Triton: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSignalTr(track.tpcSignal()); + } + case o2::track::PID::Helium3: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSignalHe(track.tpcSignal()); + } + case o2::track::PID::Alpha: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSignalAl(track.tpcSignal()); + } + default: + LOGF(fatal, "TPC PID table for PID index %i (%s) is not available", index, o2::track::PID::getName(index)); + return 0.f; + } +} +perSpeciesWrapper(tpcExpSignalDiff); + +#undef perSpeciesWrapper + +} // namespace pidutils + +namespace pidtpc +{ +// Expected signals +DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalEl, tpcExpSignalEl, //! Expected signal with the TPC detector for electron + [](float nsigma, float sigma, float tpcsignal) -> float { return tpcsignal - nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalMu, tpcExpSignalMu, //! Expected signal with the TPC detector for muon + [](float nsigma, float sigma, float tpcsignal) -> float { return tpcsignal - nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalPi, tpcExpSignalPi, //! Expected signal with the TPC detector for pion + [](float nsigma, float sigma, float tpcsignal) -> float { return tpcsignal - nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalKa, tpcExpSignalKa, //! Expected signal with the TPC detector for kaon + [](float nsigma, float sigma, float tpcsignal) -> float { return tpcsignal - nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalPr, tpcExpSignalPr, //! Expected signal with the TPC detector for proton + [](float nsigma, float sigma, float tpcsignal) -> float { return tpcsignal - nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalDe, tpcExpSignalDe, //! Expected signal with the TPC detector for deuteron + [](float nsigma, float sigma, float tpcsignal) -> float { return tpcsignal - nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalTr, tpcExpSignalTr, //! Expected signal with the TPC detector for triton + [](float nsigma, float sigma, float tpcsignal) -> float { return tpcsignal - nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalHe, tpcExpSignalHe, //! Expected signal with the TPC detector for helium3 + [](float nsigma, float sigma, float tpcsignal) -> float { return tpcsignal - nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalAl, tpcExpSignalAl, //! Expected signal with the TPC detector for alpha + [](float nsigma, float sigma, float tpcsignal) -> float { return tpcsignal - nsigma * sigma; }); +// Delta with respect to signal +DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalDiffEl, tpcExpSignalDiffEl, //! Difference between signal and expected for electron + [](float nsigma, float sigma) -> float { return nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalDiffMu, tpcExpSignalDiffMu, //! Difference between signal and expected for muon + [](float nsigma, float sigma) -> float { return nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalDiffPi, tpcExpSignalDiffPi, //! Difference between signal and expected for pion + [](float nsigma, float sigma) -> float { return nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalDiffKa, tpcExpSignalDiffKa, //! Difference between signal and expected for kaon + [](float nsigma, float sigma) -> float { return nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalDiffPr, tpcExpSignalDiffPr, //! Difference between signal and expected for proton + [](float nsigma, float sigma) -> float { return nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalDiffDe, tpcExpSignalDiffDe, //! Difference between signal and expected for deuteron + [](float nsigma, float sigma) -> float { return nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalDiffTr, tpcExpSignalDiffTr, //! Difference between signal and expected for triton + [](float nsigma, float sigma) -> float { return nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalDiffHe, tpcExpSignalDiffHe, //! Difference between signal and expected for helium3 + [](float nsigma, float sigma) -> float { return nsigma * sigma; }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCExpSignalDiffAl, tpcExpSignalDiffAl, //! Difference between signal and expected for alpha + [](float nsigma, float sigma) -> float { return nsigma * sigma; }); +// Expected sigma +DECLARE_SOA_COLUMN(TPCExpSigmaEl, tpcExpSigmaEl, float); //! Expected resolution with the TPC detector for electron +DECLARE_SOA_COLUMN(TPCExpSigmaMu, tpcExpSigmaMu, float); //! Expected resolution with the TPC detector for muon +DECLARE_SOA_COLUMN(TPCExpSigmaPi, tpcExpSigmaPi, float); //! Expected resolution with the TPC detector for pion +DECLARE_SOA_COLUMN(TPCExpSigmaKa, tpcExpSigmaKa, float); //! Expected resolution with the TPC detector for kaon +DECLARE_SOA_COLUMN(TPCExpSigmaPr, tpcExpSigmaPr, float); //! Expected resolution with the TPC detector for proton +DECLARE_SOA_COLUMN(TPCExpSigmaDe, tpcExpSigmaDe, float); //! Expected resolution with the TPC detector for deuteron +DECLARE_SOA_COLUMN(TPCExpSigmaTr, tpcExpSigmaTr, float); //! Expected resolution with the TPC detector for triton +DECLARE_SOA_COLUMN(TPCExpSigmaHe, tpcExpSigmaHe, float); //! Expected resolution with the TPC detector for helium3 +DECLARE_SOA_COLUMN(TPCExpSigmaAl, tpcExpSigmaAl, float); //! Expected resolution with the TPC detector for alpha +// NSigma +DECLARE_SOA_COLUMN(TPCNSigmaEl, tpcNSigmaEl, float); //! Nsigma separation with the TPC detector for electron +DECLARE_SOA_COLUMN(TPCNSigmaMu, tpcNSigmaMu, float); //! Nsigma separation with the TPC detector for muon +DECLARE_SOA_COLUMN(TPCNSigmaPi, tpcNSigmaPi, float); //! Nsigma separation with the TPC detector for pion +DECLARE_SOA_COLUMN(TPCNSigmaKa, tpcNSigmaKa, float); //! Nsigma separation with the TPC detector for kaon +DECLARE_SOA_COLUMN(TPCNSigmaPr, tpcNSigmaPr, float); //! Nsigma separation with the TPC detector for proton +DECLARE_SOA_COLUMN(TPCNSigmaDe, tpcNSigmaDe, float); //! Nsigma separation with the TPC detector for deuteron +DECLARE_SOA_COLUMN(TPCNSigmaTr, tpcNSigmaTr, float); //! Nsigma separation with the TPC detector for triton +DECLARE_SOA_COLUMN(TPCNSigmaHe, tpcNSigmaHe, float); //! Nsigma separation with the TPC detector for helium3 +DECLARE_SOA_COLUMN(TPCNSigmaAl, tpcNSigmaAl, float); //! Nsigma separation with the TPC detector for alpha + +} // namespace pidtpc + +namespace pidtpc_tiny +{ +struct binning { + public: + typedef int8_t binned_t; + static constexpr int nbins = (1 << 8 * sizeof(binned_t)) - 2; + static constexpr binned_t overflowBin = nbins >> 1; + static constexpr binned_t underflowBin = -(nbins >> 1); + static constexpr float binned_max = 6.35; + static constexpr float binned_min = -6.35; + static constexpr float bin_width = (binned_max - binned_min) / nbins; + + // Function to pack a float into a binned value in table + template + static void packInTable(const float& valueToBin, T& table) + { + if (valueToBin <= binned_min) { + table(underflowBin); + } else if (valueToBin >= binned_max) { + table(overflowBin); + } else if (valueToBin >= 0) { + table(static_cast((valueToBin / bin_width) + 0.5f)); + } else { + table(static_cast((valueToBin / bin_width) - 0.5f)); + } + } + + // Function to unpack a binned value into a float + static float unPackInTable(const binned_t& valueToUnpack) + { + return bin_width * static_cast(valueToUnpack); + } +}; + +// NSigma with reduced size 8 bit +DECLARE_SOA_COLUMN(TPCNSigmaStoreEl, tpcNSigmaStoreEl, binning::binned_t); //! Stored binned nsigma with the TPC detector for electron +DECLARE_SOA_COLUMN(TPCNSigmaStoreMu, tpcNSigmaStoreMu, binning::binned_t); //! Stored binned nsigma with the TPC detector for muon +DECLARE_SOA_COLUMN(TPCNSigmaStorePi, tpcNSigmaStorePi, binning::binned_t); //! Stored binned nsigma with the TPC detector for pion +DECLARE_SOA_COLUMN(TPCNSigmaStoreKa, tpcNSigmaStoreKa, binning::binned_t); //! Stored binned nsigma with the TPC detector for kaon +DECLARE_SOA_COLUMN(TPCNSigmaStorePr, tpcNSigmaStorePr, binning::binned_t); //! Stored binned nsigma with the TPC detector for proton +DECLARE_SOA_COLUMN(TPCNSigmaStoreDe, tpcNSigmaStoreDe, binning::binned_t); //! Stored binned nsigma with the TPC detector for deuteron +DECLARE_SOA_COLUMN(TPCNSigmaStoreTr, tpcNSigmaStoreTr, binning::binned_t); //! Stored binned nsigma with the TPC detector for triton +DECLARE_SOA_COLUMN(TPCNSigmaStoreHe, tpcNSigmaStoreHe, binning::binned_t); //! Stored binned nsigma with the TPC detector for helium3 +DECLARE_SOA_COLUMN(TPCNSigmaStoreAl, tpcNSigmaStoreAl, binning::binned_t); //! Stored binned nsigma with the TPC detector for alpha + +// NSigma with reduced size in [binned_min, binned_max] bin size bin_width +DECLARE_SOA_DYNAMIC_COLUMN(TPCNSigmaEl, tpcNSigmaEl, //! Unwrapped (float) nsigma with the TPC detector for electron + [](binning::binned_t nsigma_binned) -> float { return binning::unPackInTable(nsigma_binned); }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCNSigmaMu, tpcNSigmaMu, //! Unwrapped (float) nsigma with the TPC detector for muon + [](binning::binned_t nsigma_binned) -> float { return binning::unPackInTable(nsigma_binned); }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCNSigmaPi, tpcNSigmaPi, //! Unwrapped (float) nsigma with the TPC detector for pion + [](binning::binned_t nsigma_binned) -> float { return binning::unPackInTable(nsigma_binned); }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCNSigmaKa, tpcNSigmaKa, //! Unwrapped (float) nsigma with the TPC detector for kaon + [](binning::binned_t nsigma_binned) -> float { return binning::unPackInTable(nsigma_binned); }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCNSigmaPr, tpcNSigmaPr, //! Unwrapped (float) nsigma with the TPC detector for proton + [](binning::binned_t nsigma_binned) -> float { return binning::unPackInTable(nsigma_binned); }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCNSigmaDe, tpcNSigmaDe, //! Unwrapped (float) nsigma with the TPC detector for deuteron + [](binning::binned_t nsigma_binned) -> float { return binning::unPackInTable(nsigma_binned); }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCNSigmaTr, tpcNSigmaTr, //! Unwrapped (float) nsigma with the TPC detector for triton + [](binning::binned_t nsigma_binned) -> float { return binning::unPackInTable(nsigma_binned); }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCNSigmaHe, tpcNSigmaHe, //! Unwrapped (float) nsigma with the TPC detector for helium3 + [](binning::binned_t nsigma_binned) -> float { return binning::unPackInTable(nsigma_binned); }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCNSigmaAl, tpcNSigmaAl, //! Unwrapped (float) nsigma with the TPC detector for alpha + [](binning::binned_t nsigma_binned) -> float { return binning::unPackInTable(nsigma_binned); }); + +} // namespace pidtpc_tiny + +// Per particle tables +DECLARE_SOA_TABLE(pidTPCFullEl, "AOD", "pidTPCFullEl", //! Table of the TPC (full) response with expected signal, expected resolution and Nsigma for electron + pidtpc::TPCExpSignalEl, + pidtpc::TPCExpSignalDiffEl, + pidtpc::TPCExpSigmaEl, pidtpc::TPCNSigmaEl); +DECLARE_SOA_TABLE(pidTPCFullMu, "AOD", "pidTPCFullMu", //! Table of the TPC (full) response with expected signal, expected resolution and Nsigma for muon + pidtpc::TPCExpSignalMu, + pidtpc::TPCExpSignalDiffMu, + pidtpc::TPCExpSigmaMu, pidtpc::TPCNSigmaMu); +DECLARE_SOA_TABLE(pidTPCFullPi, "AOD", "pidTPCFullPi", //! Table of the TPC (full) response with expected signal, expected resolution and Nsigma for pion + pidtpc::TPCExpSignalPi, + pidtpc::TPCExpSignalDiffPi, + pidtpc::TPCExpSigmaPi, pidtpc::TPCNSigmaPi); +DECLARE_SOA_TABLE(pidTPCFullKa, "AOD", "pidTPCFullKa", //! Table of the TPC (full) response with expected signal, expected resolution and Nsigma for kaon + pidtpc::TPCExpSignalKa, + pidtpc::TPCExpSignalDiffKa, + pidtpc::TPCExpSigmaKa, pidtpc::TPCNSigmaKa); +DECLARE_SOA_TABLE(pidTPCFullPr, "AOD", "pidTPCFullPr", //! Table of the TPC (full) response with expected signal, expected resolution and Nsigma for proton + pidtpc::TPCExpSignalPr, + pidtpc::TPCExpSignalDiffPr, + pidtpc::TPCExpSigmaPr, pidtpc::TPCNSigmaPr); +DECLARE_SOA_TABLE(pidTPCFullDe, "AOD", "pidTPCFullDe", //! Table of the TPC (full) response with expected signal, expected resolution and Nsigma for deuteron + pidtpc::TPCExpSignalDe, + pidtpc::TPCExpSignalDiffDe, + pidtpc::TPCExpSigmaDe, pidtpc::TPCNSigmaDe); +DECLARE_SOA_TABLE(pidTPCFullTr, "AOD", "pidTPCFullTr", //! Table of the TPC (full) response with expected signal, expected resolution and Nsigma for triton + pidtpc::TPCExpSignalTr, + pidtpc::TPCExpSignalDiffTr, + pidtpc::TPCExpSigmaTr, pidtpc::TPCNSigmaTr); +DECLARE_SOA_TABLE(pidTPCFullHe, "AOD", "pidTPCFullHe", //! Table of the TPC (full) response with expected signal, expected resolution and Nsigma for helium3 + pidtpc::TPCExpSignalHe, + pidtpc::TPCExpSignalDiffHe, + pidtpc::TPCExpSigmaHe, pidtpc::TPCNSigmaHe); +DECLARE_SOA_TABLE(pidTPCFullAl, "AOD", "pidTPCFullAl", //! Table of the TPC (full) response with expected signal, expected resolution and Nsigma for alpha + pidtpc::TPCExpSignalAl, + pidtpc::TPCExpSignalDiffAl, + pidtpc::TPCExpSigmaAl, pidtpc::TPCNSigmaAl); + +// Tiny size tables +DECLARE_SOA_TABLE(pidTPCEl, "AOD", "pidTPCEl", //! Table of the TPC response with binned Nsigma for electron + pidtpc_tiny::TPCNSigmaStoreEl, pidtpc_tiny::TPCNSigmaEl); +DECLARE_SOA_TABLE(pidTPCMu, "AOD", "pidTPCMu", //! Table of the TPC response with binned Nsigma for muon + pidtpc_tiny::TPCNSigmaStoreMu, pidtpc_tiny::TPCNSigmaMu); +DECLARE_SOA_TABLE(pidTPCPi, "AOD", "pidTPCPi", //! Table of the TPC response with binned Nsigma for pion + pidtpc_tiny::TPCNSigmaStorePi, pidtpc_tiny::TPCNSigmaPi); +DECLARE_SOA_TABLE(pidTPCKa, "AOD", "pidTPCKa", //! Table of the TPC response with binned Nsigma for kaon + pidtpc_tiny::TPCNSigmaStoreKa, pidtpc_tiny::TPCNSigmaKa); +DECLARE_SOA_TABLE(pidTPCPr, "AOD", "pidTPCPr", //! Table of the TPC response with binned Nsigma for proton + pidtpc_tiny::TPCNSigmaStorePr, pidtpc_tiny::TPCNSigmaPr); +DECLARE_SOA_TABLE(pidTPCDe, "AOD", "pidTPCDe", //! Table of the TPC response with binned Nsigma for deuteron + pidtpc_tiny::TPCNSigmaStoreDe, pidtpc_tiny::TPCNSigmaDe); +DECLARE_SOA_TABLE(pidTPCTr, "AOD", "pidTPCTr", //! Table of the TPC response with binned Nsigma for triton + pidtpc_tiny::TPCNSigmaStoreTr, pidtpc_tiny::TPCNSigmaTr); +DECLARE_SOA_TABLE(pidTPCHe, "AOD", "pidTPCHe", //! Table of the TPC response with binned Nsigma for helium3 + pidtpc_tiny::TPCNSigmaStoreHe, pidtpc_tiny::TPCNSigmaHe); +DECLARE_SOA_TABLE(pidTPCAl, "AOD", "pidTPCAl", //! Table of the TPC response with binned Nsigma for alpha + pidtpc_tiny::TPCNSigmaStoreAl, pidtpc_tiny::TPCNSigmaAl); + +// Extra tables +namespace mcpidtpc +{ +// Tuned MC on data +DECLARE_SOA_COLUMN(DeDxTunedMc, mcTunedTPCSignal, float); //! TPC signal after TuneOnData application for MC +} // namespace mcpidtpc + +DECLARE_SOA_TABLE(mcTPCTuneOnData, "AOD", "MCTPCTUNEONDATA", mcpidtpc::DeDxTunedMc); + +} // namespace o2::aod + +#endif // COMMON_DATAMODEL_PIDRESPONSETPC_H_ diff --git a/Common/TableProducer/PID/pidBayes.cxx b/Common/TableProducer/PID/pidBayes.cxx index c990875e967..abedb281668 100644 --- a/Common/TableProducer/PID/pidBayes.cxx +++ b/Common/TableProducer/PID/pidBayes.cxx @@ -16,6 +16,12 @@ /// Only the tables for the mass hypotheses requested are filled, the others are sent empty. /// +#include +#include +#include +#include +#include + // O2 includes #include "Framework/AnalysisTask.h" #include "Framework/HistogramRegistry.h" @@ -28,7 +34,9 @@ #include "Common/Core/PID/PIDTOF.h" #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/TrackSelectionTables.h" -#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/PIDResponseCombined.h" +#include "Common/DataModel/PIDResponseTPC.h" +#include "Common/DataModel/PIDResponseTOF.h" #include "pidTOFBase.h" diff --git a/Common/TableProducer/PID/pidTOF.cxx b/Common/TableProducer/PID/pidTOF.cxx index f26df966313..076cc0c26de 100644 --- a/Common/TableProducer/PID/pidTOF.cxx +++ b/Common/TableProducer/PID/pidTOF.cxx @@ -232,40 +232,31 @@ struct tofPid { { switch (id) { case 0: - aod::pidutils::packInTable(-999.f, - tablePIDEl); + aod::pidtof_tiny::binning::packInTable(-999.f, tablePIDEl); break; case 1: - aod::pidutils::packInTable(-999.f, - tablePIDMu); + aod::pidtof_tiny::binning::packInTable(-999.f, tablePIDMu); break; case 2: - aod::pidutils::packInTable(-999.f, - tablePIDPi); + aod::pidtof_tiny::binning::packInTable(-999.f, tablePIDPi); break; case 3: - aod::pidutils::packInTable(-999.f, - tablePIDKa); + aod::pidtof_tiny::binning::packInTable(-999.f, tablePIDKa); break; case 4: - aod::pidutils::packInTable(-999.f, - tablePIDPr); + aod::pidtof_tiny::binning::packInTable(-999.f, tablePIDPr); break; case 5: - aod::pidutils::packInTable(-999.f, - tablePIDDe); + aod::pidtof_tiny::binning::packInTable(-999.f, tablePIDDe); break; case 6: - aod::pidutils::packInTable(-999.f, - tablePIDTr); + aod::pidtof_tiny::binning::packInTable(-999.f, tablePIDTr); break; case 7: - aod::pidutils::packInTable(-999.f, - tablePIDHe); + aod::pidtof_tiny::binning::packInTable(-999.f, tablePIDHe); break; case 8: - aod::pidutils::packInTable(-999.f, - tablePIDAl); + aod::pidtof_tiny::binning::packInTable(-999.f, tablePIDAl); break; default: LOG(fatal) << "Wrong particle ID in makeTableEmpty()"; @@ -326,40 +317,40 @@ struct tofPid { for (auto const& pidId : mEnabledParticles) { // Loop on enabled particle hypotheses switch (pidId) { case 0: - aod::pidutils::packInTable(responseEl.GetSeparation(mRespParamsV2, trkInColl), - tablePIDEl); + aod::pidtof_tiny::binning::packInTable(responseEl.GetSeparation(mRespParamsV2, trkInColl), + tablePIDEl); break; case 1: - aod::pidutils::packInTable(responseMu.GetSeparation(mRespParamsV2, trkInColl), - tablePIDMu); + aod::pidtof_tiny::binning::packInTable(responseMu.GetSeparation(mRespParamsV2, trkInColl), + tablePIDMu); break; case 2: - aod::pidutils::packInTable(responsePi.GetSeparation(mRespParamsV2, trkInColl), - tablePIDPi); + aod::pidtof_tiny::binning::packInTable(responsePi.GetSeparation(mRespParamsV2, trkInColl), + tablePIDPi); break; case 3: - aod::pidutils::packInTable(responseKa.GetSeparation(mRespParamsV2, trkInColl), - tablePIDKa); + aod::pidtof_tiny::binning::packInTable(responseKa.GetSeparation(mRespParamsV2, trkInColl), + tablePIDKa); break; case 4: - aod::pidutils::packInTable(responsePr.GetSeparation(mRespParamsV2, trkInColl), - tablePIDPr); + aod::pidtof_tiny::binning::packInTable(responsePr.GetSeparation(mRespParamsV2, trkInColl), + tablePIDPr); break; case 5: - aod::pidutils::packInTable(responseDe.GetSeparation(mRespParamsV2, trkInColl), - tablePIDDe); + aod::pidtof_tiny::binning::packInTable(responseDe.GetSeparation(mRespParamsV2, trkInColl), + tablePIDDe); break; case 6: - aod::pidutils::packInTable(responseTr.GetSeparation(mRespParamsV2, trkInColl), - tablePIDTr); + aod::pidtof_tiny::binning::packInTable(responseTr.GetSeparation(mRespParamsV2, trkInColl), + tablePIDTr); break; case 7: - aod::pidutils::packInTable(responseHe.GetSeparation(mRespParamsV2, trkInColl), - tablePIDHe); + aod::pidtof_tiny::binning::packInTable(responseHe.GetSeparation(mRespParamsV2, trkInColl), + tablePIDHe); break; case 8: - aod::pidutils::packInTable(responseAl.GetSeparation(mRespParamsV2, trkInColl), - tablePIDAl); + aod::pidtof_tiny::binning::packInTable(responseAl.GetSeparation(mRespParamsV2, trkInColl), + tablePIDAl); break; default: LOG(fatal) << "Wrong particle ID in processWSlice()"; @@ -414,40 +405,40 @@ struct tofPid { for (auto const& pidId : mEnabledParticles) { // Loop on enabled particle hypotheses switch (pidId) { case 0: - aod::pidutils::packInTable(responseEl.GetSeparation(mRespParamsV2, track), - tablePIDEl); + aod::pidtof_tiny::binning::packInTable(responseEl.GetSeparation(mRespParamsV2, track), + tablePIDEl); break; case 1: - aod::pidutils::packInTable(responseMu.GetSeparation(mRespParamsV2, track), - tablePIDMu); + aod::pidtof_tiny::binning::packInTable(responseMu.GetSeparation(mRespParamsV2, track), + tablePIDMu); break; case 2: - aod::pidutils::packInTable(responsePi.GetSeparation(mRespParamsV2, track), - tablePIDPi); + aod::pidtof_tiny::binning::packInTable(responsePi.GetSeparation(mRespParamsV2, track), + tablePIDPi); break; case 3: - aod::pidutils::packInTable(responseKa.GetSeparation(mRespParamsV2, track), - tablePIDKa); + aod::pidtof_tiny::binning::packInTable(responseKa.GetSeparation(mRespParamsV2, track), + tablePIDKa); break; case 4: - aod::pidutils::packInTable(responsePr.GetSeparation(mRespParamsV2, track), - tablePIDPr); + aod::pidtof_tiny::binning::packInTable(responsePr.GetSeparation(mRespParamsV2, track), + tablePIDPr); break; case 5: - aod::pidutils::packInTable(responseDe.GetSeparation(mRespParamsV2, track), - tablePIDDe); + aod::pidtof_tiny::binning::packInTable(responseDe.GetSeparation(mRespParamsV2, track), + tablePIDDe); break; case 6: - aod::pidutils::packInTable(responseTr.GetSeparation(mRespParamsV2, track), - tablePIDTr); + aod::pidtof_tiny::binning::packInTable(responseTr.GetSeparation(mRespParamsV2, track), + tablePIDTr); break; case 7: - aod::pidutils::packInTable(responseHe.GetSeparation(mRespParamsV2, track), - tablePIDHe); + aod::pidtof_tiny::binning::packInTable(responseHe.GetSeparation(mRespParamsV2, track), + tablePIDHe); break; case 8: - aod::pidutils::packInTable(responseAl.GetSeparation(mRespParamsV2, track), - tablePIDAl); + aod::pidtof_tiny::binning::packInTable(responseAl.GetSeparation(mRespParamsV2, track), + tablePIDAl); break; default: LOG(fatal) << "Wrong particle ID in processWoSlice()"; diff --git a/Common/TableProducer/PID/pidTOFBase.h b/Common/TableProducer/PID/pidTOFBase.h index 2861cf883ce..44367eacb75 100644 --- a/Common/TableProducer/PID/pidTOFBase.h +++ b/Common/TableProducer/PID/pidTOFBase.h @@ -24,6 +24,7 @@ // O2Physics #include "PID/ParamBase.h" #include "PID/PIDTOF.h" +#include "Common/DataModel/PIDResponseTOF.h" #include "Common/DataModel/PIDResponse.h" static constexpr int nSpecies = 9; diff --git a/Common/TableProducer/PID/pidTOFMerge.cxx b/Common/TableProducer/PID/pidTOFMerge.cxx index 2d2fd282bfd..7de835f4653 100644 --- a/Common/TableProducer/PID/pidTOFMerge.cxx +++ b/Common/TableProducer/PID/pidTOFMerge.cxx @@ -1083,72 +1083,63 @@ struct tofPidMerge { if (fullTable) { tablePIDFullEl(-999.f, -999.f); } else { - aod::pidutils::packInTable(-999.f, - tablePIDEl); + aod::pidtof_tiny::binning::packInTable(-999.f, tablePIDEl); } break; case kIdxMu: if (fullTable) { tablePIDFullMu(-999.f, -999.f); } else { - aod::pidutils::packInTable(-999.f, - tablePIDMu); + aod::pidtof_tiny::binning::packInTable(-999.f, tablePIDMu); } break; case kIdxPi: if (fullTable) { tablePIDFullPi(-999.f, -999.f); } else { - aod::pidutils::packInTable(-999.f, - tablePIDPi); + aod::pidtof_tiny::binning::packInTable(-999.f, tablePIDPi); } break; case kIdxKa: if (fullTable) { tablePIDFullKa(-999.f, -999.f); } else { - aod::pidutils::packInTable(-999.f, - tablePIDKa); + aod::pidtof_tiny::binning::packInTable(-999.f, tablePIDKa); } break; case kIdxPr: if (fullTable) { tablePIDFullPr(-999.f, -999.f); } else { - aod::pidutils::packInTable(-999.f, - tablePIDPr); + aod::pidtof_tiny::binning::packInTable(-999.f, tablePIDPr); } break; case kIdxDe: if (fullTable) { tablePIDFullDe(-999.f, -999.f); } else { - aod::pidutils::packInTable(-999.f, - tablePIDDe); + aod::pidtof_tiny::binning::packInTable(-999.f, tablePIDDe); } break; case kIdxTr: if (fullTable) { tablePIDFullTr(-999.f, -999.f); } else { - aod::pidutils::packInTable(-999.f, - tablePIDTr); + aod::pidtof_tiny::binning::packInTable(-999.f, tablePIDTr); } break; case kIdxHe: if (fullTable) { tablePIDFullHe(-999.f, -999.f); } else { - aod::pidutils::packInTable(-999.f, - tablePIDHe); + aod::pidtof_tiny::binning::packInTable(-999.f, tablePIDHe); } break; case kIdxAl: if (fullTable) { tablePIDFullAl(-999.f, -999.f); } else { - aod::pidutils::packInTable(-999.f, - tablePIDAl); + aod::pidtof_tiny::binning::packInTable(-999.f, tablePIDAl); } break; default: @@ -1202,47 +1193,47 @@ struct tofPidMerge { switch (pidId) { case kIdxEl: { nsigma = responseEl.GetSeparation(mRespParamsV3, trk); - aod::pidutils::packInTable(nsigma, tablePIDEl); + aod::pidtof_tiny::binning::packInTable(nsigma, tablePIDEl); break; } case kIdxMu: { nsigma = responseMu.GetSeparation(mRespParamsV3, trk); - aod::pidutils::packInTable(nsigma, tablePIDMu); + aod::pidtof_tiny::binning::packInTable(nsigma, tablePIDMu); break; } case kIdxPi: { nsigma = responsePi.GetSeparation(mRespParamsV3, trk); - aod::pidutils::packInTable(nsigma, tablePIDPi); + aod::pidtof_tiny::binning::packInTable(nsigma, tablePIDPi); break; } case kIdxKa: { nsigma = responseKa.GetSeparation(mRespParamsV3, trk); - aod::pidutils::packInTable(nsigma, tablePIDKa); + aod::pidtof_tiny::binning::packInTable(nsigma, tablePIDKa); break; } case kIdxPr: { nsigma = responsePr.GetSeparation(mRespParamsV3, trk); - aod::pidutils::packInTable(nsigma, tablePIDPr); + aod::pidtof_tiny::binning::packInTable(nsigma, tablePIDPr); break; } case kIdxDe: { nsigma = responseDe.GetSeparation(mRespParamsV3, trk); - aod::pidutils::packInTable(nsigma, tablePIDDe); + aod::pidtof_tiny::binning::packInTable(nsigma, tablePIDDe); break; } case kIdxTr: { nsigma = responseTr.GetSeparation(mRespParamsV3, trk); - aod::pidutils::packInTable(nsigma, tablePIDTr); + aod::pidtof_tiny::binning::packInTable(nsigma, tablePIDTr); break; } case kIdxHe: { nsigma = responseHe.GetSeparation(mRespParamsV3, trk); - aod::pidutils::packInTable(nsigma, tablePIDHe); + aod::pidtof_tiny::binning::packInTable(nsigma, tablePIDHe); break; } case kIdxAl: { nsigma = responseAl.GetSeparation(mRespParamsV3, trk); - aod::pidutils::packInTable(nsigma, tablePIDAl); + aod::pidtof_tiny::binning::packInTable(nsigma, tablePIDAl); break; } default: @@ -1364,47 +1355,47 @@ struct tofPidMerge { switch (pidId) { case kIdxEl: { nsigma = responseEl.GetSeparation(mRespParamsV3, trk); - aod::pidutils::packInTable(nsigma, tablePIDEl); + aod::pidtof_tiny::binning::packInTable(nsigma, tablePIDEl); break; } case kIdxMu: { nsigma = responseMu.GetSeparation(mRespParamsV3, trk); - aod::pidutils::packInTable(nsigma, tablePIDMu); + aod::pidtof_tiny::binning::packInTable(nsigma, tablePIDMu); break; } case kIdxPi: { nsigma = responsePi.GetSeparation(mRespParamsV3, trk); - aod::pidutils::packInTable(nsigma, tablePIDPi); + aod::pidtof_tiny::binning::packInTable(nsigma, tablePIDPi); break; } case kIdxKa: { nsigma = responseKa.GetSeparation(mRespParamsV3, trk); - aod::pidutils::packInTable(nsigma, tablePIDKa); + aod::pidtof_tiny::binning::packInTable(nsigma, tablePIDKa); break; } case kIdxPr: { nsigma = responsePr.GetSeparation(mRespParamsV3, trk); - aod::pidutils::packInTable(nsigma, tablePIDPr); + aod::pidtof_tiny::binning::packInTable(nsigma, tablePIDPr); break; } case kIdxDe: { nsigma = responseDe.GetSeparation(mRespParamsV3, trk); - aod::pidutils::packInTable(nsigma, tablePIDDe); + aod::pidtof_tiny::binning::packInTable(nsigma, tablePIDDe); break; } case kIdxTr: { nsigma = responseTr.GetSeparation(mRespParamsV3, trk); - aod::pidutils::packInTable(nsigma, tablePIDTr); + aod::pidtof_tiny::binning::packInTable(nsigma, tablePIDTr); break; } case kIdxHe: { nsigma = responseHe.GetSeparation(mRespParamsV3, trk); - aod::pidutils::packInTable(nsigma, tablePIDHe); + aod::pidtof_tiny::binning::packInTable(nsigma, tablePIDHe); break; } case kIdxAl: { nsigma = responseAl.GetSeparation(mRespParamsV3, trk); - aod::pidutils::packInTable(nsigma, tablePIDAl); + aod::pidtof_tiny::binning::packInTable(nsigma, tablePIDAl); break; } default: diff --git a/Common/TableProducer/PID/pidTPC.cxx b/Common/TableProducer/PID/pidTPC.cxx index 1fe071f2717..64500a47cb7 100644 --- a/Common/TableProducer/PID/pidTPC.cxx +++ b/Common/TableProducer/PID/pidTPC.cxx @@ -35,7 +35,7 @@ #include "Framework/ASoAHelpers.h" #include "ReconstructionDataFormats/Track.h" #include "CCDB/CcdbApi.h" -#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/PIDResponseTPC.h" #include "Common/Core/PID/TPCPIDResponse.h" #include "Framework/AnalysisDataModel.h" #include "Common/DataModel/Multiplicity.h" @@ -458,7 +458,7 @@ struct tpcPid { if (flagFull) tableFull(expSigma, nSigma); if (flagTiny) - aod::pidutils::packInTable(nSigma, tableTiny); + aod::pidtpc_tiny::binning::packInTable(nSigma, tableTiny); }; void processStandard(Coll const& collisions, Trks const& tracks, aod::BCsWithTimestamps const& bcs) diff --git a/Common/TableProducer/PID/pidTPCBase.h b/Common/TableProducer/PID/pidTPCBase.h index a882a598ef9..937eea21c48 100644 --- a/Common/TableProducer/PID/pidTPCBase.h +++ b/Common/TableProducer/PID/pidTPCBase.h @@ -19,7 +19,7 @@ #define COMMON_TABLEPRODUCER_PID_PIDTPCBASE_H_ #include "Common/DataModel/Multiplicity.h" -#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/PIDResponseTPC.h" namespace o2::aod { diff --git a/Common/TableProducer/match-mft-mch-data.cxx b/Common/TableProducer/match-mft-mch-data.cxx index b566d9531f8..01139da21ba 100644 --- a/Common/TableProducer/match-mft-mch-data.cxx +++ b/Common/TableProducer/match-mft-mch-data.cxx @@ -19,7 +19,6 @@ #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Centrality.h" #include "Common/CCDB/TriggerAliases.h" -#include "Common/DataModel/PIDResponse.h" #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/MftmchMatchingML.h" #include "Common/DataModel/MatchMFTMuonData.h" diff --git a/Common/TableProducer/mcCollsExtra.cxx b/Common/TableProducer/mcCollsExtra.cxx index c085969c5af..452930494ba 100644 --- a/Common/TableProducer/mcCollsExtra.cxx +++ b/Common/TableProducer/mcCollsExtra.cxx @@ -39,7 +39,6 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Centrality.h" -#include "Common/DataModel/PIDResponse.h" #include "DetectorsBase/Propagator.h" #include "DetectorsBase/GeometryManager.h" #include "DataFormatsParameters/GRPObject.h" diff --git a/Common/Tools/PID/checkPidPacking.cxx b/Common/Tools/PID/checkPidPacking.cxx index c503ee1b288..84f72c4f48c 100644 --- a/Common/Tools/PID/checkPidPacking.cxx +++ b/Common/Tools/PID/checkPidPacking.cxx @@ -16,7 +16,10 @@ /// \since 03/05/2024 /// -#include "Common/DataModel/PIDResponse.h" +#include + +#include "Common/DataModel/PIDResponseTOF.h" +#include "Common/DataModel/PIDResponseTPC.h" #include "TH1F.h" #include "TCanvas.h" #include "TRandom.h" @@ -32,7 +35,7 @@ bool process(std::string outputName, int nevents = 100000) NsigmaContainer() {} void operator()(const int8_t& packed) { mPacked = packed; } int8_t mPacked = 0; - float unpack() { return aod::pidutils::unPackInTable(mPacked); } + float unpack() { return T::unPackInTable(mPacked); } } container; TH1F* hgaus = new TH1F("hgaus", "", 20 / T::bin_width, @@ -55,12 +58,12 @@ bool process(std::string outputName, int nevents = 100000) for (int i = 0; i < nevents; i++) { float nsigma = gRandom->Gaus(0, 1); hgaus->Fill(nsigma); - aod::pidutils::packInTable(nsigma, container); + T::packInTable(nsigma, container); hgausPacked->Fill(container.unpack()); nsigma = gRandom->Uniform(-10, 10); huniform->Fill(nsigma); - aod::pidutils::packInTable(nsigma, container); + T::packInTable(nsigma, container); huniformPacked->Fill(container.unpack()); } diff --git a/Common/Tools/aodDataModelGraph.cxx b/Common/Tools/aodDataModelGraph.cxx index 3b1afaba2ca..da854a700f5 100644 --- a/Common/Tools/aodDataModelGraph.cxx +++ b/Common/Tools/aodDataModelGraph.cxx @@ -8,10 +8,15 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. + #include +#include +#include +#include #include "Framework/AnalysisDataModel.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" -#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/PIDResponseTOF.h" +#include "Common/DataModel/PIDResponseTPC.h" #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/Centrality.h" #include "Common/DataModel/TrackSelectionTables.h" @@ -87,8 +92,13 @@ template Style getStyleFor() { auto label = MetadataTrait::metadata::tableLabel(); - auto entry = std::find_if(tableStyles.begin(), tableStyles.end(), [&](auto&& x) { if (std::string(label).find(x.first) != std::string::npos) { return true; -}return false; }); + auto entry = std::find_if(tableStyles.begin(), tableStyles.end(), + [&](auto&& x) { + if (std::string(label).find(x.first) != std::string::npos) { + return true; + } + return false; + }); if (entry != tableStyles.end()) { auto value = *entry; return styles[value.second]; From 9a32e169389064543b1d11e28ac769e59d2d6f8c Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Thu, 24 Apr 2025 16:02:28 +0200 Subject: [PATCH 1086/1650] [PWGLF] Tiny change for more useful logs (#10966) --- PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx index 38250425e4b..71f0fca40ce 100644 --- a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx @@ -497,6 +497,7 @@ struct StrangenessBuilder { int f = enabledTables->get(tableNames[i].c_str(), "enable"); if (f == 1) { mEnabledTables[i] = 1; + listOfRequestors[i] = "manual enabling"; } if (f == -1) { // autodetect this table in other devices From 21c7a388bd345336845540022f7c492ff3d6666b Mon Sep 17 00:00:00 2001 From: Nicolas Strangmann <77485327+nstrangm@users.noreply.github.com> Date: Thu, 24 Apr 2025 18:04:18 +0200 Subject: [PATCH 1087/1650] [PWGEM,Trigger] [EventFiltering] Remove HNM spectra trigger (#10974) Co-authored-by: Nicolas Strangmann Co-authored-by: ALICE Action Bot --- .../PWGEM/HeavyNeutralMesonFilter.cxx | 43 +++++++++++++++---- EventFiltering/filterTables.h | 24 +++++------ 2 files changed, 46 insertions(+), 21 deletions(-) diff --git a/EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx b/EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx index 5d8fd72ba39..abfc9dec88f 100644 --- a/EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx +++ b/EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx @@ -170,8 +170,6 @@ struct HeavyNeutralMesonFilter { std::vector etaPrimeEMC, etaPrimePCM, omegaEMC, omegaPCM, proton, antiproton, deuteron, antideuteron, pion, antipion; float mMassProton = constants::physics::MassProton; float mMassDeuteron = constants::physics::MassDeuteron; - float mMassOmega = 0.782; - float mMassEtaPrime = 0.957; float mMassPionCharged = constants::physics::MassPionCharged; Preslice perCollisionPCM = aod::v0photonkf::collisionId; @@ -416,6 +414,7 @@ struct HeavyNeutralMesonFilter { mHistManager.add(Form("%s%s/f%sPtVskstar_%s", iHNM, iFemtoPartner, iHNM, iEMCPCM), Form("K* vs %s pt;#bf{#it{K}^{*} (GeV/#it{c})};#bf{#it{p}_{T}^{%s} (GeV/#it{c})}", iHNM, iHNM), HistType::kTH2F, {{{150, 0, 1.5}, {500, 0, 10}}}); mHistManager.add(Form("%s%s/f%sPtVskstar_%s", iHNM, iFemtoPartner, iFemtoPartner, iEMCPCM), Form("K* vs %s pt;#bf{#it{K}^{*} (GeV/#it{c})};#bf{#it{p}_{T}^{%s} (GeV/#it{c})}", iFemtoPartner, iFemtoPartner), HistType::kTH2F, {{{150, 0, 1.5}, {500, 0, 10}}}); mHistManager.add(Form("%s%s/fAnti%sPtVskstar_%s", iHNM, iFemtoPartner, iFemtoPartner, iEMCPCM), Form("K* vs #bar{%s} pt;#bf{#it{K}^{*} (GeV/#it{c})};#bf{#it{p}_{T}^{#bar{%s}} (GeV/#it{c})}", iFemtoPartner, iFemtoPartner), HistType::kTH2F, {{{150, 0, 1.5}, {500, 0, 10}}}); + mHistManager.add(Form("%s%s/fInvMassVsKStar_%s", iHNM, iFemtoPartner, iEMCPCM), "Invariant mass and K* of heavy neutral meson candidates;#bf{#it{M}^{#pi^{+}#pi^{-}#gamma#gamma} (GeV/#it{c}^{2})};#bf{#it{K}^{*} (GeV/#it{c})}", HistType::kTH2F, {{600, 0.6, 1.2}, {250, 0., 1.}}); } } } @@ -430,6 +429,7 @@ struct HeavyNeutralMesonFilter { mHistManager.add(Form("pp%s/fProtonPtVsQ3_%s", iHNM, iEMCPCM), "pT (proton) vs Q_{3};#bf{#it{Q}_{3} (GeV/#it{c})};#bf{#it{p}_{T}^{p} (GeV/#it{c})}", HistType::kTH2F, {{{150, 0, 1.5}, {500, 0, 10}}}); mHistManager.add(Form("pp%s/f%sCandPtVsQ3_%s", iHNM, iHNM, iEMCPCM), Form("pT (%s) vs Q_{3};#bf{#it{Q}_{3} (GeV/#it{c})};#bf{#it{p}_{T}^{%s} (GeV/#it{c})}", iHNM, iHNM), HistType::kTH2F, {{{150, 0, 1.5}, {500, 0, 10}}}); mHistManager.add(Form("pp%s/fAntiProtonPtVsQ3_%s", iHNM, iEMCPCM), "pT (antiproton) vs Q_{3};#bf{#it{Q}_{3} (GeV/#it{c})};#bf{#it{p}_{T}^{#bar{p}} (GeV/#it{c})}", HistType::kTH2F, {{{150, 0, 1.5}, {500, 0, 10}}}); + mHistManager.add(Form("pp%s/fInvMassVsQ3_%s", iHNM, iEMCPCM), "Invariant mass and Q3 of heavy neutral meson candidates;#bf{#it{M}^{#pi^{+}#pi^{-}#gamma#gamma} (GeV/#it{c}^{2})};#bf{#it{Q}_{3} (GeV/#it{c})}", HistType::kTH2F, {{600, 0.6, 1.2}, {250, 0., 1.}}); } } @@ -761,6 +761,7 @@ struct HeavyNeutralMesonFilter { mHistManager.fill(HIST("ppomega/fProtonPtVsQ3_PCM"), q3, proton1.Pt()); mHistManager.fill(HIST("ppomega/fProtonPtVsQ3_PCM"), q3, proton2.Pt()); mHistManager.fill(HIST("ppomega/fomegaCandPtVsQ3_PCM"), q3, omegaParticles.Pt()); + mHistManager.fill(HIST("ppomega/fInvMassVsQ3_PCM"), omegaParticles.M(), q3); if (q3 < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kPPOmega)) lowMomentumMultiplets[hnmtrigger::kPPOmega] += 1; @@ -773,6 +774,7 @@ struct HeavyNeutralMesonFilter { mHistManager.fill(HIST("ppomega/fProtonPtVsQ3_EMC"), q3, proton1.Pt()); mHistManager.fill(HIST("ppomega/fProtonPtVsQ3_EMC"), q3, proton2.Pt()); mHistManager.fill(HIST("ppomega/fomegaCandPtVsQ3_EMC"), q3, omegaParticles.Pt()); + mHistManager.fill(HIST("ppomega/fInvMassVsQ3_EMC"), omegaParticles.M(), q3); if (q3 < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kPPOmega)) lowMomentumMultiplets[hnmtrigger::kPPOmega] += 1; @@ -791,6 +793,7 @@ struct HeavyNeutralMesonFilter { mHistManager.fill(HIST("ppomega/fAntiProtonPtVsQ3_PCM"), q3, antiProton1.Pt()); mHistManager.fill(HIST("ppomega/fAntiProtonPtVsQ3_PCM"), q3, antiProton2.Pt()); mHistManager.fill(HIST("ppomega/fomegaCandPtVsQ3_PCM"), q3, omegaParticles.Pt()); + mHistManager.fill(HIST("ppomega/fInvMassVsQ3_PCM"), omegaParticles.M(), q3); if (q3 < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kPPOmega)) lowMomentumMultiplets[hnmtrigger::kPPOmega] += 1; @@ -803,6 +806,7 @@ struct HeavyNeutralMesonFilter { mHistManager.fill(HIST("ppomega/fAntiProtonPtVsQ3_EMC"), q3, antiProton1.Pt()); mHistManager.fill(HIST("ppomega/fAntiProtonPtVsQ3_EMC"), q3, antiProton2.Pt()); mHistManager.fill(HIST("ppomega/fomegaCandPtVsQ3_EMC"), q3, omegaParticles.Pt()); + mHistManager.fill(HIST("ppomega/fInvMassVsQ3_EMC"), omegaParticles.M(), q3); if (q3 < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kPPOmega)) lowMomentumMultiplets[hnmtrigger::kPPOmega] += 1; @@ -823,6 +827,7 @@ struct HeavyNeutralMesonFilter { mHistManager.fill(HIST("ppetaprime/fProtonPtVsQ3_PCM"), q3, proton1.Pt()); mHistManager.fill(HIST("ppetaprime/fProtonPtVsQ3_PCM"), q3, proton2.Pt()); mHistManager.fill(HIST("ppetaprime/fetaprimeCandPtVsQ3_PCM"), q3, etaParticles.Pt()); + mHistManager.fill(HIST("ppetaprime/fInvMassVsQ3_PCM"), etaParticles.M(), q3); if (q3 < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kPPEtaPrime)) lowMomentumMultiplets[hnmtrigger::kPPEtaPrime] += 1; @@ -835,6 +840,7 @@ struct HeavyNeutralMesonFilter { mHistManager.fill(HIST("ppetaprime/fProtonPtVsQ3_EMC"), q3, proton1.Pt()); mHistManager.fill(HIST("ppetaprime/fProtonPtVsQ3_EMC"), q3, proton2.Pt()); mHistManager.fill(HIST("ppetaprime/fetaprimeCandPtVsQ3_EMC"), q3, etaParticles.Pt()); + mHistManager.fill(HIST("ppetaprime/fInvMassVsQ3_EMC"), etaParticles.M(), q3); if (q3 < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kPPEtaPrime)) lowMomentumMultiplets[hnmtrigger::kPPEtaPrime] += 1; @@ -853,6 +859,7 @@ struct HeavyNeutralMesonFilter { mHistManager.fill(HIST("ppetaprime/fAntiProtonPtVsQ3_PCM"), q3, antiProton1.Pt()); mHistManager.fill(HIST("ppetaprime/fAntiProtonPtVsQ3_PCM"), q3, antiProton2.Pt()); mHistManager.fill(HIST("ppetaprime/fetaprimeCandPtVsQ3_PCM"), q3, etaParticles.Pt()); + mHistManager.fill(HIST("ppetaprime/fInvMassVsQ3_PCM"), etaParticles.M(), q3); if (q3 < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kPPEtaPrime)) lowMomentumMultiplets[hnmtrigger::kPPEtaPrime] += 1; @@ -865,6 +872,7 @@ struct HeavyNeutralMesonFilter { mHistManager.fill(HIST("ppetaprime/fAntiProtonPtVsQ3_EMC"), q3, antiProton1.Pt()); mHistManager.fill(HIST("ppetaprime/fAntiProtonPtVsQ3_EMC"), q3, antiProton2.Pt()); mHistManager.fill(HIST("ppetaprime/fetaprimeCandPtVsQ3_EMC"), q3, etaParticles.Pt()); + mHistManager.fill(HIST("ppetaprime/fInvMassVsQ3_EMC"), etaParticles.M(), q3); if (q3 < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kPPEtaPrime)) lowMomentumMultiplets[hnmtrigger::kPPEtaPrime] += 1; @@ -887,6 +895,7 @@ struct HeavyNeutralMesonFilter { mHistManager.fill(HIST("omegad/fSE_particle_PCM"), kstar); mHistManager.fill(HIST("omegad/fomegaPtVskstar_PCM"), kstar, (*iomega).Pt()); mHistManager.fill(HIST("omegad/fdPtVskstar_PCM"), kstar, (*iDeuteron).Pt()); + mHistManager.fill(HIST("omegad/fInvMassVsKStar_PCM"), (*iomega).M(), kstar); if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kOmegaD)) lowMomentumMultiplets[hnmtrigger::kOmegaD] += 1; @@ -898,6 +907,7 @@ struct HeavyNeutralMesonFilter { mHistManager.fill(HIST("omegad/fSE_Antiparticle_PCM"), kstar); mHistManager.fill(HIST("omegad/fomegaPtVskstar_PCM"), kstar, (*iomega).Pt()); mHistManager.fill(HIST("omegad/fAntidPtVskstar_PCM"), kstar, (*iAntiDeuteron).Pt()); + mHistManager.fill(HIST("omegad/fInvMassVsKStar_PCM"), (*iomega).M(), kstar); if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kOmegaD)) lowMomentumMultiplets[hnmtrigger::kOmegaD] += 1; @@ -911,6 +921,7 @@ struct HeavyNeutralMesonFilter { mHistManager.fill(HIST("omegad/fSE_particle_EMC"), kstar); mHistManager.fill(HIST("omegad/fomegaPtVskstar_EMC"), kstar, (*iomega).Pt()); mHistManager.fill(HIST("omegad/fdPtVskstar_EMC"), kstar, (*iDeuteron).Pt()); + mHistManager.fill(HIST("omegad/fInvMassVsKStar_EMC"), (*iomega).M(), kstar); if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kOmegaD)) lowMomentumMultiplets[hnmtrigger::kOmegaD] += 1; @@ -922,6 +933,7 @@ struct HeavyNeutralMesonFilter { mHistManager.fill(HIST("omegad/fSE_Antiparticle_EMC"), kstar); mHistManager.fill(HIST("omegad/fomegaPtVskstar_EMC"), kstar, (*iomega).Pt()); mHistManager.fill(HIST("omegad/fAntidPtVskstar_EMC"), kstar, (*iAntiDeuteron).Pt()); + mHistManager.fill(HIST("omegad/fInvMassVsKStar_EMC"), (*iomega).M(), kstar); if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kOmegaD)) lowMomentumMultiplets[hnmtrigger::kOmegaD] += 1; @@ -937,6 +949,7 @@ struct HeavyNeutralMesonFilter { mHistManager.fill(HIST("etaprimed/fSE_particle_PCM"), kstar); mHistManager.fill(HIST("etaprimed/fetaprimePtVskstar_PCM"), kstar, (*ietaprime).Pt()); mHistManager.fill(HIST("etaprimed/fdPtVskstar_PCM"), kstar, (*iDeuteron).Pt()); + mHistManager.fill(HIST("etaprimed/fInvMassVsKStar_PCM"), (*ietaprime).M(), kstar); if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kEtaPrimeD)) lowMomentumMultiplets[hnmtrigger::kEtaPrimeD] += 1; @@ -948,6 +961,7 @@ struct HeavyNeutralMesonFilter { mHistManager.fill(HIST("etaprimed/fSE_Antiparticle_PCM"), kstar); mHistManager.fill(HIST("etaprimed/fetaprimePtVskstar_PCM"), kstar, (*ietaprime).Pt()); mHistManager.fill(HIST("etaprimed/fAntidPtVskstar_PCM"), kstar, (*iAntiDeuteron).Pt()); + mHistManager.fill(HIST("etaprimed/fInvMassVsKStar_PCM"), (*ietaprime).M(), kstar); if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kEtaPrimeD)) lowMomentumMultiplets[hnmtrigger::kEtaPrimeD] += 1; @@ -961,6 +975,7 @@ struct HeavyNeutralMesonFilter { mHistManager.fill(HIST("etaprimed/fSE_particle_EMC"), kstar); mHistManager.fill(HIST("etaprimed/fetaprimePtVskstar_EMC"), kstar, (*ietaprime).Pt()); mHistManager.fill(HIST("etaprimed/fdPtVskstar_EMC"), kstar, (*iDeuteron).Pt()); + mHistManager.fill(HIST("etaprimed/fInvMassVsKStar_EMC"), (*ietaprime).M(), kstar); if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kEtaPrimeD)) lowMomentumMultiplets[hnmtrigger::kEtaPrimeD] += 1; @@ -972,6 +987,7 @@ struct HeavyNeutralMesonFilter { mHistManager.fill(HIST("etaprimed/fSE_Antiparticle_EMC"), kstar); mHistManager.fill(HIST("etaprimed/fetaprimePtVskstar_EMC"), kstar, (*ietaprime).Pt()); mHistManager.fill(HIST("etaprimed/fAntidPtVskstar_EMC"), kstar, (*iAntiDeuteron).Pt()); + mHistManager.fill(HIST("etaprimed/fInvMassVsKStar_EMC"), (*ietaprime).M(), kstar); if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kEtaPrimeD)) lowMomentumMultiplets[hnmtrigger::kEtaPrimeD] += 1; @@ -987,6 +1003,7 @@ struct HeavyNeutralMesonFilter { mHistManager.fill(HIST("omegap/fSE_particle_PCM"), kstar); mHistManager.fill(HIST("omegap/fomegaPtVskstar_PCM"), kstar, (*iomega).Pt()); mHistManager.fill(HIST("omegap/fpPtVskstar_PCM"), kstar, (*iProton).Pt()); + mHistManager.fill(HIST("omegap/fInvMassVsKStar_PCM"), (*iomega).M(), kstar); if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kOmegaP)) lowMomentumMultiplets[hnmtrigger::kOmegaP] += 1; @@ -998,6 +1015,7 @@ struct HeavyNeutralMesonFilter { mHistManager.fill(HIST("omegap/fSE_Antiparticle_PCM"), kstar); mHistManager.fill(HIST("omegap/fomegaPtVskstar_PCM"), kstar, (*iomega).Pt()); mHistManager.fill(HIST("omegap/fAntipPtVskstar_PCM"), kstar, (*iAntiProton).Pt()); + mHistManager.fill(HIST("omegap/fInvMassVsKStar_PCM"), (*iomega).M(), kstar); if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kOmegaP)) lowMomentumMultiplets[hnmtrigger::kOmegaP] += 1; @@ -1011,6 +1029,7 @@ struct HeavyNeutralMesonFilter { mHistManager.fill(HIST("omegap/fSE_particle_EMC"), kstar); mHistManager.fill(HIST("omegap/fomegaPtVskstar_EMC"), kstar, (*iomega).Pt()); mHistManager.fill(HIST("omegap/fpPtVskstar_EMC"), kstar, (*iProton).Pt()); + mHistManager.fill(HIST("omegap/fInvMassVsKStar_EMC"), (*iomega).M(), kstar); if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kOmegaP)) lowMomentumMultiplets[hnmtrigger::kOmegaP] += 1; @@ -1022,6 +1041,7 @@ struct HeavyNeutralMesonFilter { mHistManager.fill(HIST("omegap/fSE_Antiparticle_EMC"), kstar); mHistManager.fill(HIST("omegap/fomegaPtVskstar_EMC"), kstar, (*iomega).Pt()); mHistManager.fill(HIST("omegap/fAntipPtVskstar_EMC"), kstar, (*iAntiProton).Pt()); + mHistManager.fill(HIST("omegap/fInvMassVsKStar_EMC"), (*iomega).M(), kstar); if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kOmegaP)) lowMomentumMultiplets[hnmtrigger::kOmegaP] += 1; @@ -1037,6 +1057,7 @@ struct HeavyNeutralMesonFilter { mHistManager.fill(HIST("etaprimep/fSE_particle_PCM"), kstar); mHistManager.fill(HIST("etaprimep/fetaprimePtVskstar_PCM"), kstar, (*ietaprime).Pt()); mHistManager.fill(HIST("etaprimep/fpPtVskstar_PCM"), kstar, (*iProton).Pt()); + mHistManager.fill(HIST("etaprimep/fInvMassVsKStar_PCM"), (*ietaprime).M(), kstar); if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kEtaPrimeP)) lowMomentumMultiplets[hnmtrigger::kEtaPrimeP] += 1; @@ -1048,6 +1069,7 @@ struct HeavyNeutralMesonFilter { mHistManager.fill(HIST("etaprimep/fSE_Antiparticle_PCM"), kstar); mHistManager.fill(HIST("etaprimep/fetaprimePtVskstar_PCM"), kstar, (*ietaprime).Pt()); mHistManager.fill(HIST("etaprimep/fAntipPtVskstar_PCM"), kstar, (*iAntiProton).Pt()); + mHistManager.fill(HIST("etaprimep/fInvMassVsKStar_PCM"), (*ietaprime).M(), kstar); if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kEtaPrimeP)) lowMomentumMultiplets[hnmtrigger::kEtaPrimeP] += 1; @@ -1061,6 +1083,7 @@ struct HeavyNeutralMesonFilter { mHistManager.fill(HIST("etaprimep/fSE_particle_EMC"), kstar); mHistManager.fill(HIST("etaprimep/fetaprimePtVskstar_EMC"), kstar, (*ietaprime).Pt()); mHistManager.fill(HIST("etaprimep/fpPtVskstar_EMC"), kstar, (*iProton).Pt()); + mHistManager.fill(HIST("etaprimep/fInvMassVsKStar_EMC"), (*ietaprime).M(), kstar); if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kEtaPrimeP)) lowMomentumMultiplets[hnmtrigger::kEtaPrimeP] += 1; @@ -1072,6 +1095,7 @@ struct HeavyNeutralMesonFilter { mHistManager.fill(HIST("etaprimep/fSE_Antiparticle_EMC"), kstar); mHistManager.fill(HIST("etaprimep/fetaprimePtVskstar_EMC"), kstar, (*ietaprime).Pt()); mHistManager.fill(HIST("etaprimep/fAntipPtVskstar_EMC"), kstar, (*iAntiProton).Pt()); + mHistManager.fill(HIST("etaprimep/fInvMassVsKStar_EMC"), (*ietaprime).M(), kstar); if (kstar < cfgKinematicLimits->get(static_cast(0), hnmtrigger::kEtaPrimeP)) lowMomentumMultiplets[hnmtrigger::kEtaPrimeP] += 1; @@ -1124,10 +1148,11 @@ struct HeavyNeutralMesonFilter { // - 4 high pT spectrum trigger flags (PCM & EMC * omega & eta') // - 4 femto trigger flags (p-omega, p-eta', d-omega || pp-omega, d-eta' || pp-eta') // ------------------------------------------------------------------------------------- - tags(colContainsPCMOmega, colContainsEMCOmega, colContainsPCMEtaPrime, colContainsEMCEtaPrime, keepFemtoEvent[hnmtrigger::kOmegaP], keepFemtoEvent[hnmtrigger::kEtaPrimeP], - keepFemtoEvent[hnmtrigger::kPPOmega] || keepFemtoEvent[hnmtrigger::kOmegaD], keepFemtoEvent[hnmtrigger::kPPEtaPrime] || keepFemtoEvent[hnmtrigger::kEtaPrimeD]); + tags(keepFemtoEvent[hnmtrigger::kOmegaP], keepFemtoEvent[hnmtrigger::kPPOmega], keepFemtoEvent[hnmtrigger::kOmegaD], keepFemtoEvent[hnmtrigger::kEtaPrimeP], keepFemtoEvent[hnmtrigger::kPPEtaPrime], keepFemtoEvent[hnmtrigger::kEtaPrimeD]); + // tags(colContainsPCMOmega, colContainsEMCOmega, colContainsPCMEtaPrime, colContainsEMCEtaPrime, keepFemtoEvent[hnmtrigger::kOmegaP], keepFemtoEvent[hnmtrigger::kEtaPrimeP], + // keepFemtoEvent[hnmtrigger::kPPOmega] || keepFemtoEvent[hnmtrigger::kOmegaD], keepFemtoEvent[hnmtrigger::kPPEtaPrime] || keepFemtoEvent[hnmtrigger::kEtaPrimeD]); - if (!colContainsPCMOmega && !colContainsEMCOmega && !colContainsPCMEtaPrime && !colContainsEMCEtaPrime && !keepFemtoEvent[hnmtrigger::kPPOmega] && !keepFemtoEvent[hnmtrigger::kOmegaP] && !keepFemtoEvent[hnmtrigger::kPPEtaPrime] && !keepFemtoEvent[hnmtrigger::kEtaPrimeP] && !keepFemtoEvent[hnmtrigger::kOmegaD] && !keepFemtoEvent[hnmtrigger::kEtaPrimeD]) + if (!keepFemtoEvent[hnmtrigger::kPPOmega] && !keepFemtoEvent[hnmtrigger::kOmegaP] && !keepFemtoEvent[hnmtrigger::kPPEtaPrime] && !keepFemtoEvent[hnmtrigger::kEtaPrimeP] && !keepFemtoEvent[hnmtrigger::kOmegaD] && !keepFemtoEvent[hnmtrigger::kEtaPrimeD]) mHistManager.fill(HIST("fProcessedEvents"), 1); // Fill "rejected", if no trigger selected the event } @@ -1202,7 +1227,7 @@ struct HeavyNeutralMesonFilter { if (heavyNeutralMeson.gg->isPi0 && massHNM > cfgMassWindowOmega->get("omega_min") && massHNM < cfgMassWindowOmega->get("omega_max")) { if (heavyNeutralMeson.gg->reconstructionType == photonpair::kPCMPCM) { if (heavyNeutralMeson.pT() > cfgMinHNMPtsFemtoTrigger->get("PCM_omega")) { - omegaPCM.emplace_back(heavyNeutralMeson.pT(), heavyNeutralMeson.eta(), RecoDecay::constrainAngle(heavyNeutralMeson.phi()), mMassOmega); + omegaPCM.emplace_back(heavyNeutralMeson.pT(), heavyNeutralMeson.eta(), RecoDecay::constrainAngle(heavyNeutralMeson.phi()), massHNM); mHistManager.fill(HIST("HNM/After/Omega/PCM/fInvMassVsPt"), massHNM, heavyNeutralMeson.pT()); mHistManager.fill(HIST("HNM/After/Omega/PCM/fEta"), heavyNeutralMeson.eta()); mHistManager.fill(HIST("HNM/After/Omega/PCM/fPhi"), RecoDecay::constrainAngle(heavyNeutralMeson.phi())); @@ -1211,7 +1236,7 @@ struct HeavyNeutralMesonFilter { colContainsPCMOmega = true; } else if (heavyNeutralMeson.gg->reconstructionType == photonpair::kEMCEMC) { if (heavyNeutralMeson.pT() > cfgMinHNMPtsFemtoTrigger->get("EMC_omega")) { - omegaEMC.emplace_back(heavyNeutralMeson.pT(), heavyNeutralMeson.eta(), RecoDecay::constrainAngle(heavyNeutralMeson.phi()), mMassOmega); + omegaEMC.emplace_back(heavyNeutralMeson.pT(), heavyNeutralMeson.eta(), RecoDecay::constrainAngle(heavyNeutralMeson.phi()), massHNM); mHistManager.fill(HIST("HNM/After/Omega/EMC/fInvMassVsPt"), massHNM, heavyNeutralMeson.pT()); mHistManager.fill(HIST("HNM/After/Omega/EMC/fEta"), heavyNeutralMeson.eta()); mHistManager.fill(HIST("HNM/After/Omega/EMC/fPhi"), RecoDecay::constrainAngle(heavyNeutralMeson.phi())); @@ -1222,7 +1247,7 @@ struct HeavyNeutralMesonFilter { } else if (heavyNeutralMeson.gg->isEta && massHNM > cfgMassWindowEtaPrime->get("etaprime_min") && massHNM < cfgMassWindowEtaPrime->get("etaprime_max")) { if (heavyNeutralMeson.gg->reconstructionType == photonpair::kPCMPCM) { if (heavyNeutralMeson.pT() > cfgMinHNMPtsFemtoTrigger->get("PCM_etaprime")) { - etaPrimePCM.emplace_back(heavyNeutralMeson.pT(), heavyNeutralMeson.eta(), RecoDecay::constrainAngle(heavyNeutralMeson.phi()), mMassEtaPrime); + etaPrimePCM.emplace_back(heavyNeutralMeson.pT(), heavyNeutralMeson.eta(), RecoDecay::constrainAngle(heavyNeutralMeson.phi()), massHNM); mHistManager.fill(HIST("HNM/After/EtaPrime/PCM/fInvMassVsPt"), massHNM, heavyNeutralMeson.pT()); mHistManager.fill(HIST("HNM/After/EtaPrime/PCM/fEta"), heavyNeutralMeson.eta()); mHistManager.fill(HIST("HNM/After/EtaPrime/PCM/fPhi"), RecoDecay::constrainAngle(heavyNeutralMeson.phi())); @@ -1231,7 +1256,7 @@ struct HeavyNeutralMesonFilter { colContainsPCMEtaPrime = true; } else if (heavyNeutralMeson.gg->reconstructionType == photonpair::kEMCEMC) { if (heavyNeutralMeson.pT() > cfgMinHNMPtsFemtoTrigger->get("EMC_etaprime")) { - etaPrimeEMC.emplace_back(heavyNeutralMeson.pT(), heavyNeutralMeson.eta(), RecoDecay::constrainAngle(heavyNeutralMeson.phi()), mMassEtaPrime); + etaPrimeEMC.emplace_back(heavyNeutralMeson.pT(), heavyNeutralMeson.eta(), RecoDecay::constrainAngle(heavyNeutralMeson.phi()), massHNM); mHistManager.fill(HIST("HNM/After/EtaPrime/EMC/fInvMassVsPt"), massHNM, heavyNeutralMeson.pT()); mHistManager.fill(HIST("HNM/After/EtaPrime/EMC/fEta"), heavyNeutralMeson.eta()); mHistManager.fill(HIST("HNM/After/EtaPrime/EMC/fPhi"), RecoDecay::constrainAngle(heavyNeutralMeson.phi())); diff --git a/EventFiltering/filterTables.h b/EventFiltering/filterTables.h index 363a7176165..a5486b60984 100644 --- a/EventFiltering/filterTables.h +++ b/EventFiltering/filterTables.h @@ -196,14 +196,16 @@ DECLARE_SOA_COLUMN(PCMHighPtPhoton, hasPCMHighPtPhoton, bool); //! PCM high pT p DECLARE_SOA_COLUMN(PCMandEE, hasPCMandEE, bool); //! PCM and ee // heavy meson filters -DECLARE_SOA_COLUMN(PCMOmegaMeson, hasPCMOmegaMeson, bool); //! Omega meson candidate (3pi) in the collision -DECLARE_SOA_COLUMN(EMCOmegaMeson, hasEMCOmegaMeson, bool); //! Omega meson candidate (3pi) in the collision -DECLARE_SOA_COLUMN(PCMEtaPrimeMeson, hasPCMEtaPrimeMeson, bool); //! Eta' meson candidate (3pi) in the collision -DECLARE_SOA_COLUMN(EMCEtaPrimeMeson, hasEMCEtaPrimeMeson, bool); //! Eta' meson candidate (3pi) in the collision -DECLARE_SOA_COLUMN(POmega, hasPPOmega, bool); //! Pomega meson candidate (3pi) in the collision -DECLARE_SOA_COLUMN(PEtaPrime, hasPEtaPrime, bool); //! PPEta' meson candidate (3pi) in the collision -DECLARE_SOA_COLUMN(OmegadOrPP, hasOmegadOrPP, bool); //! Omegad' meson candidate (3pi) in the collision -DECLARE_SOA_COLUMN(EtaPrimedOrPP, hasEtaPrimedOrPP, bool); //! Eta'd meson candidate (3pi) in the collision +// DECLARE_SOA_COLUMN(PCMOmegaMeson, hasPCMOmegaMeson, bool); //! Omega meson candidate (3pi) in the collision +// DECLARE_SOA_COLUMN(EMCOmegaMeson, hasEMCOmegaMeson, bool); //! Omega meson candidate (3pi) in the collision +// DECLARE_SOA_COLUMN(PCMEtaPrimeMeson, hasPCMEtaPrimeMeson, bool); //! Eta' meson candidate (3pi) in the collision +// DECLARE_SOA_COLUMN(EMCEtaPrimeMeson, hasEMCEtaPrimeMeson, bool); //! Eta' meson candidate (3pi) in the collision +DECLARE_SOA_COLUMN(OmegaP, hasOmegaP, bool); //! omegaP meson candidate (3pi) in the collision +DECLARE_SOA_COLUMN(OmegaPP, hasOmegaPP, bool); //! omegaPP meson candidate (3pi) in the collision +DECLARE_SOA_COLUMN(Omegad, hasOmegad, bool); //! omegad meson candidate (3pi) in the collision +DECLARE_SOA_COLUMN(EtaPrimeP, hasEtaPrimeP, bool); //! eta'P meson candidate (3pi) in the collision +DECLARE_SOA_COLUMN(EtaPrimePP, hasEtaPrimePP, bool); //! eta'PP meson candidate (3pi) in the collision +DECLARE_SOA_COLUMN(EtaPrimed, hasEtaPrimed, bool); //! eta'd meson candidate (3pi) in the collision } // namespace filtering @@ -347,10 +349,8 @@ using PhotonFilter = PhotonFilters::iterator; // heavy mesons DECLARE_SOA_TABLE(HeavyNeutralMesonFilters, "AOD", "HeavyNeutralMesonFilters", //! - filtering::PCMOmegaMeson, filtering::EMCOmegaMeson, - filtering::PCMEtaPrimeMeson, filtering::EMCEtaPrimeMeson, - filtering::POmega, filtering::PEtaPrime, - filtering::OmegadOrPP, filtering::EtaPrimedOrPP); + filtering::OmegaP, filtering::OmegaPP, filtering::Omegad, + filtering::EtaPrimeP, filtering::EtaPrimePP, filtering::EtaPrimed); using HeavyNeutralMesonFilter = HeavyNeutralMesonFilters::iterator; From ce05118538c529a124b3b693ab9df7990ad780f6 Mon Sep 17 00:00:00 2001 From: Marcello Di Costanzo <96481191+Marcellocosti@users.noreply.github.com> Date: Thu, 24 Apr 2025 18:13:14 +0200 Subject: [PATCH 1088/1650] [PWGHF] Improve clarity in D+ tree creator (#10976) Co-authored-by: ALICE Action Bot --- .../TableProducer/treeCreatorDplusToPiKPi.cxx | 206 ++++++------------ 1 file changed, 71 insertions(+), 135 deletions(-) diff --git a/PWGHF/TableProducer/treeCreatorDplusToPiKPi.cxx b/PWGHF/TableProducer/treeCreatorDplusToPiKPi.cxx index 8a8705cacce..495ddc42148 100644 --- a/PWGHF/TableProducer/treeCreatorDplusToPiKPi.cxx +++ b/PWGHF/TableProducer/treeCreatorDplusToPiKPi.cxx @@ -252,7 +252,6 @@ struct HfTreeCreatorDplusToPiKPi { Configurable fillCandidateLiteTable{"fillCandidateLiteTable", false, "Switch to fill lite table with candidate properties"}; // parameters for production of training samples Configurable fillOnlySignal{"fillOnlySignal", false, "Flag to fill derived tables with signal for ML trainings"}; - Configurable fillOnlySignalMl{"fillOnlySignalMl", false, "Flag to fill derived tables with MC and ML info"}; Configurable fillOnlyBackground{"fillOnlyBackground", false, "Flag to fill derived tables with background for ML trainings"}; Configurable downSampleBkgFactor{"downSampleBkgFactor", 1., "Fraction of background candidates to keep for ML trainings"}; Configurable ptMaxForDownSample{"ptMaxForDownSample", 10., "Maximum pt for the application of the downsampling factor"}; @@ -485,87 +484,6 @@ struct HfTreeCreatorDplusToPiKPi { PROCESS_SWITCH(HfTreeCreatorDplusToPiKPi, processData, "Process data", true); - void processMc(aod::Collisions const& collisions, - aod::McCollisions const&, - SelectedCandidatesMc const& candidates, - MatchedGenCandidatesMc const& particles, - SelectedCandidatesMcWithMl const&, - TracksWPid const&) - { - // Filling event properties - rowCandidateFullEvents.reserve(collisions.size()); - for (const auto& collision : collisions) { - fillEvent(collision, 0, 1); - } - - // Filling candidate properties - if (fillOnlySignal) { - if (fillCandidateLiteTable) { - rowCandidateLite.reserve(reconstructedCandSig.size()); - } else { - rowCandidateFull.reserve(reconstructedCandSig.size()); - } - for (const auto& candidate : reconstructedCandSig) { - fillCandidateTable(candidate); - } - } else if (fillOnlySignalMl) { - rowCandidateMl.reserve(reconstructedCandSigMl.size()); - if (fillCandidateLiteTable) { - rowCandidateLite.reserve(reconstructedCandSigMl.size()); - } else { - rowCandidateFull.reserve(reconstructedCandSigMl.size()); - } - for (const auto& candidate : reconstructedCandSigMl) { - if (downSampleBkgFactor < 1.) { - float pseudoRndm = candidate.ptProng0() * 1000. - static_cast(candidate.ptProng0() * 1000); - if (candidate.pt() < ptMaxForDownSample && pseudoRndm >= downSampleBkgFactor) { - continue; - } - } - fillCandidateTable(candidate); - } - } else if (fillOnlyBackground) { - if (fillCandidateLiteTable) { - rowCandidateLite.reserve(reconstructedCandBkg.size()); - } else { - rowCandidateFull.reserve(reconstructedCandBkg.size()); - } - for (const auto& candidate : reconstructedCandBkg) { - if (downSampleBkgFactor < 1.) { - float pseudoRndm = candidate.ptProng0() * 1000. - static_cast(candidate.ptProng0() * 1000); - if (candidate.pt() < ptMaxForDownSample && pseudoRndm >= downSampleBkgFactor) { - continue; - } - } - fillCandidateTable(candidate); - } - } else { - if (fillCandidateLiteTable) { - rowCandidateLite.reserve(candidates.size()); - } else { - rowCandidateFull.reserve(candidates.size()); - } - for (const auto& candidate : candidates) { - fillCandidateTable(candidate); - } - } - - // Filling particle properties - rowCandidateFullParticles.reserve(particles.size()); - for (const auto& particle : particles) { - rowCandidateFullParticles( - particle.mcCollision().bcId(), - particle.pt(), - particle.eta(), - particle.phi(), - RecoDecay::y(particle.pVector(), o2::constants::physics::MassDPlus), - particle.flagMcMatchGen(), - particle.originMcGen()); - } - } - - PROCESS_SWITCH(HfTreeCreatorDplusToPiKPi, processMc, "Process MC", false); - void processDataWCent(CollisionsCent const& collisions, soa::Filtered> const& candidates, TracksWPid const&) @@ -595,12 +513,12 @@ struct HfTreeCreatorDplusToPiKPi { PROCESS_SWITCH(HfTreeCreatorDplusToPiKPi, processDataWCent, "Process data with cent", false); - void processMcWCent(CollisionsCent const& collisions, - aod::McCollisions const&, - SelectedCandidatesMc const& candidates, - MatchedGenCandidatesMc const& particles, - SelectedCandidatesMcWithMl const&, - TracksWPid const&) + template + void fillMcTables(CollType const& collisions, + aod::McCollisions const&, + CandType const& candidates, + MatchedGenCandidatesMc const& particles, + TracksWPid const&) { // Filling event properties rowCandidateFullEvents.reserve(collisions.size()); @@ -609,55 +527,19 @@ struct HfTreeCreatorDplusToPiKPi { } // Filling candidate properties - if (fillOnlySignal) { - if (fillCandidateLiteTable) { - rowCandidateLite.reserve(reconstructedCandSig.size()); - } else { - rowCandidateFull.reserve(reconstructedCandSig.size()); - } - for (const auto& candidate : reconstructedCandSig) { - fillCandidateTable(candidate); - } - } else if (fillOnlySignalMl) { - rowCandidateMl.reserve(reconstructedCandSigMl.size()); - if (fillCandidateLiteTable) { - rowCandidateLite.reserve(reconstructedCandSigMl.size()); - } else { - rowCandidateFull.reserve(reconstructedCandSigMl.size()); - } - for (const auto& candidate : reconstructedCandSigMl) { - if (downSampleBkgFactor < 1.) { - float pseudoRndm = candidate.ptProng0() * 1000. - static_cast(candidate.ptProng0() * 1000); - if (candidate.pt() < ptMaxForDownSample && pseudoRndm >= downSampleBkgFactor) { - continue; - } - } - fillCandidateTable(candidate); - } - } else if (fillOnlyBackground) { - if (fillCandidateLiteTable) { - rowCandidateLite.reserve(reconstructedCandBkg.size()); - } else { - rowCandidateFull.reserve(reconstructedCandBkg.size()); - } - for (const auto& candidate : reconstructedCandBkg) { - if (downSampleBkgFactor < 1.) { - float pseudoRndm = candidate.ptProng0() * 1000. - static_cast(candidate.ptProng0() * 1000); - if (candidate.pt() < ptMaxForDownSample && pseudoRndm >= downSampleBkgFactor) { - continue; - } - } - fillCandidateTable(candidate); - } + if (fillCandidateLiteTable) { + rowCandidateLite.reserve(candidates.size()); } else { - if (fillCandidateLiteTable) { - rowCandidateLite.reserve(candidates.size()); - } else { - rowCandidateFull.reserve(candidates.size()); - } - for (const auto& candidate : candidates) { - fillCandidateTable(candidate); + rowCandidateFull.reserve(candidates.size()); + } + for (const auto& candidate : candidates) { + if (downSampleBkgFactor < 1.) { + float pseudoRndm = candidate.ptProng0() * 1000. - static_cast(candidate.ptProng0() * 1000); + if (candidate.pt() < ptMaxForDownSample && pseudoRndm >= downSampleBkgFactor) { + continue; + } } + fillCandidateTable(candidate); } // Filling particle properties @@ -674,7 +556,61 @@ struct HfTreeCreatorDplusToPiKPi { } } + void processMc(aod::Collisions const& collisions, + aod::McCollisions const& mccollisions, + SelectedCandidatesMc const& candidates, + MatchedGenCandidatesMc const& particles, + TracksWPid const& tracks) + { + if (fillOnlySignal) { + fillMcTables(collisions, mccollisions, reconstructedCandSig, particles, tracks); + } else if (fillOnlyBackground) { + fillMcTables(collisions, mccollisions, reconstructedCandBkg, particles, tracks); + } else { + fillMcTables(collisions, mccollisions, candidates, particles, tracks); + } + } + + PROCESS_SWITCH(HfTreeCreatorDplusToPiKPi, processMc, "Process MC", false); + + void processMcWCent(CollisionsCent const& collisions, + aod::McCollisions const& mccollisions, + SelectedCandidatesMc const& candidates, + MatchedGenCandidatesMc const& particles, + TracksWPid const& tracks) + { + if (fillOnlySignal) { + fillMcTables(collisions, mccollisions, reconstructedCandSig, particles, tracks); + } else if (fillOnlyBackground) { + fillMcTables(collisions, mccollisions, reconstructedCandBkg, particles, tracks); + } else { + fillMcTables(collisions, mccollisions, candidates, particles, tracks); + } + } + PROCESS_SWITCH(HfTreeCreatorDplusToPiKPi, processMcWCent, "Process MC with cent", false); + + void processMcSgnWMl(aod::Collisions const& collisions, + aod::McCollisions const& mccollisions, + SelectedCandidatesMcWithMl const&, + MatchedGenCandidatesMc const& particles, + TracksWPid const& tracks) + { + fillMcTables(collisions, mccollisions, reconstructedCandSigMl, particles, tracks); + } + + PROCESS_SWITCH(HfTreeCreatorDplusToPiKPi, processMcSgnWMl, "Process MC signal with ML info", false); + + void processMcSgnWCentMl(CollisionsCent const& collisions, + aod::McCollisions const& mccollisions, + SelectedCandidatesMcWithMl const&, + MatchedGenCandidatesMc const& particles, + TracksWPid const& tracks) + { + fillMcTables(collisions, mccollisions, reconstructedCandSigMl, particles, tracks); + } + + PROCESS_SWITCH(HfTreeCreatorDplusToPiKPi, processMcSgnWCentMl, "Process MC signal with cent and ML info", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 43823d9a41fe8ecdc83266f91aed01af2cedf733 Mon Sep 17 00:00:00 2001 From: Nicolas Strangmann <77485327+nstrangm@users.noreply.github.com> Date: Thu, 24 Apr 2025 18:21:08 +0200 Subject: [PATCH 1089/1650] [PWGEM/PhotonMeson] Fix index of bc wise table (#10977) Co-authored-by: Nicolas Strangmann --- PWGEM/PhotonMeson/DataModel/bcWiseTables.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PWGEM/PhotonMeson/DataModel/bcWiseTables.h b/PWGEM/PhotonMeson/DataModel/bcWiseTables.h index 082b65b48fa..8799a664eee 100644 --- a/PWGEM/PhotonMeson/DataModel/bcWiseTables.h +++ b/PWGEM/PhotonMeson/DataModel/bcWiseTables.h @@ -69,7 +69,7 @@ DECLARE_SOA_COLUMN(StoredFT0MAmplitude, storedFT0MAmplitude, unsigned int); //! DECLARE_SOA_COLUMN(StoredEMCalnCells, storedEMCalnCells, unsigned int); //! number of emcal cells DECLARE_SOA_COLUMN(StoredEMCalCellEnergy, storedEMCalCellEnergy, float); //! sum of energy in emcal cells } // namespace bcwisebc -DECLARE_SOA_TABLE(BCWiseBCs, "AOD", "BCWISEBCS", //! table of bc wise centrality estimation and event selection input +DECLARE_SOA_TABLE(BCWiseBCs, "AOD", "BCWISEBC", //! table of bc wise centrality estimation and event selection input o2::soa::Index<>, bcwisebc::HasFT0, bcwisebc::HasTVX, bcwisebc::HaskTVXinEMC, bcwisebc::HasEMCCell, bcwisebc::HasNoTFROFBorder, bcwisebc::StoredFT0MAmplitude, bcwisebc::StoredEMCalnCells, bcwisebc::StoredEMCalCellEnergy); @@ -83,7 +83,7 @@ DECLARE_SOA_COLUMN(StoredZVtx, storedZVtx, int16_t); //! Z-vertex po DECLARE_SOA_DYNAMIC_COLUMN(Centrality, centrality, [](uint8_t storedcentrality) -> float { return storedcentrality / emdownscaling::downscalingFactors[emdownscaling::kFT0MCent]; }); //! Centrality (0-100) DECLARE_SOA_DYNAMIC_COLUMN(ZVtx, zVtx, [](uint8_t storedzvtx) -> float { return storedzvtx / emdownscaling::downscalingFactors[emdownscaling::kZVtx]; }); //! Centrality (0-100) } // namespace bcwisecollision -DECLARE_SOA_TABLE(BCWiseCollisions, "AOD", "BCWISECOLLS", //! table of skimmed EMCal clusters +DECLARE_SOA_TABLE(BCWiseCollisions, "AOD", "BCWISECOLL", //! table of skimmed EMCal clusters o2::soa::Index<>, BCWiseBCId, bcwisecollision::StoredCentrality, bcwisecollision::StoredZVtx, bcwisecollision::Centrality, bcwisecollision::ZVtx); @@ -110,7 +110,7 @@ DECLARE_SOA_DYNAMIC_COLUMN(IsExotic, isExotic, [](bool storedIsExotic) -> bool { DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, [](float storedE, float storedEta) -> float { return storedE / emdownscaling::downscalingFactors[emdownscaling::kEnergy] / std::cosh(storedEta / emdownscaling::downscalingFactors[emdownscaling::kEta]); }); //! cluster pt, assuming m=0 (photons) } // namespace bcwisecluster -DECLARE_SOA_TABLE(BCWiseClusters, "AOD", "BCWISECLUSTERS", //! table of skimmed EMCal clusters +DECLARE_SOA_TABLE(BCWiseClusters, "AOD", "BCWISECLUSTER", //! table of skimmed EMCal clusters o2::soa::Index<>, BCWiseBCId, bcwisecluster::StoredDefinition, bcwisecluster::StoredE, bcwisecluster::StoredEta, bcwisecluster::StoredPhi, bcwisecluster::StoredNCells, bcwisecluster::StoredM02, bcwisecluster::StoredTime, bcwisecluster::StoredIsExotic, bcwisecluster::Definition, bcwisecluster::E, bcwisecluster::Eta, bcwisecluster::Phi, bcwisecluster::NCells, bcwisecluster::M02, bcwisecluster::Time, bcwisecluster::IsExotic, bcwisecluster::Pt); @@ -126,7 +126,7 @@ DECLARE_SOA_COLUMN(IsFromWD, isFromWD, bool); //! Pi0 from a weak decay DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, [](uint16_t storedpt) -> float { return storedpt / emdownscaling::downscalingFactors[emdownscaling::kpT]; }); //! pT of pi0 (GeV) } // namespace bcwisemcpi0s -DECLARE_SOA_TABLE(BCWiseMCPi0s, "AOD", "BCWISEMCPI0S", //! table of pi0s on MC level +DECLARE_SOA_TABLE(BCWiseMCPi0s, "AOD", "BCWISEMCPI0", //! table of pi0s on MC level o2::soa::Index<>, BCWiseBCId, bcwisemcpi0s::ParticleIdPi0, bcwisemcpi0s::StoredPt, bcwisemcpi0s::IsAccepted, bcwisemcpi0s::IsPrimary, bcwisemcpi0s::IsFromWD, bcwisemcpi0s::Pt); From 0f905253a8833eaaf4856d7d52c78b15a76c5cc1 Mon Sep 17 00:00:00 2001 From: rolavick Date: Thu, 24 Apr 2025 19:19:30 +0200 Subject: [PATCH 1090/1650] [PWGUD] TauTable producer fills MC tables (#10971) Co-authored-by: ALICE Action Bot --- PWGUD/DataModel/TauEventTables.h | 224 +++++++++++ PWGUD/TableProducer/tauEventTableProducer.cxx | 354 +++++++++++++----- 2 files changed, 491 insertions(+), 87 deletions(-) create mode 100644 PWGUD/DataModel/TauEventTables.h diff --git a/PWGUD/DataModel/TauEventTables.h b/PWGUD/DataModel/TauEventTables.h new file mode 100644 index 00000000000..f508cbc2c4d --- /dev/null +++ b/PWGUD/DataModel/TauEventTables.h @@ -0,0 +1,224 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// +/// \file TauEventTables.h +/// \author Roman Lavička +/// \since 2025-04-23 +/// \brief A table to store information about events preselected to be candidates for UPC gammagamma->tautau +/// + +#ifndef ALISW_TAUEVENTTABLES_H +#define ALISW_TAUEVENTTABLES_H + +#include "Framework/AnalysisDataModel.h" + +namespace o2::aod +{ +namespace tau_tree +{ +// event info +DECLARE_SOA_COLUMN(RunNumber, runNumber, int32_t); +DECLARE_SOA_COLUMN(Bc, bc, int); +DECLARE_SOA_COLUMN(TotalTracks, totalTracks, int); +DECLARE_SOA_COLUMN(NumContrib, numContrib, int); +DECLARE_SOA_COLUMN(GlobalNonPVtracks, globalNonPVtracks, int); +DECLARE_SOA_COLUMN(PosX, posX, float); +DECLARE_SOA_COLUMN(PosY, posY, float); +DECLARE_SOA_COLUMN(PosZ, posZ, float); +DECLARE_SOA_COLUMN(RecoMode, recoMode, int); +DECLARE_SOA_COLUMN(OccupancyInTime, occupancyInTime, int); +DECLARE_SOA_COLUMN(HadronicRate, hadronicRate, double); +DECLARE_SOA_COLUMN(Trs, trs, int); +DECLARE_SOA_COLUMN(Trofs, trofs, int); +DECLARE_SOA_COLUMN(Hmpr, hmpr, int); +DECLARE_SOA_COLUMN(Tfb, tfb, int); +DECLARE_SOA_COLUMN(ItsRofb, itsRofb, int); +DECLARE_SOA_COLUMN(Sbp, sbp, int); +DECLARE_SOA_COLUMN(ZvtxFT0vsPv, zvtxFT0vsPv, int); +DECLARE_SOA_COLUMN(VtxITSTPC, vtxITSTPC, int); +// FIT info +DECLARE_SOA_COLUMN(TotalFT0AmplitudeA, totalFT0AmplitudeA, float); +DECLARE_SOA_COLUMN(TotalFT0AmplitudeC, totalFT0AmplitudeC, float); +DECLARE_SOA_COLUMN(TotalFV0AmplitudeA, totalFV0AmplitudeA, float); +DECLARE_SOA_COLUMN(EnergyCommonZNA, energyCommonZNA, float); +DECLARE_SOA_COLUMN(EnergyCommonZNC, energyCommonZNC, float); +DECLARE_SOA_COLUMN(TimeFT0A, timeFT0A, float); +DECLARE_SOA_COLUMN(TimeFT0C, timeFT0C, float); +DECLARE_SOA_COLUMN(TimeFV0A, timeFV0A, float); +DECLARE_SOA_COLUMN(TimeZNA, timeZNA, float); +DECLARE_SOA_COLUMN(TimeZNC, timeZNC, float); +// tracks +DECLARE_SOA_COLUMN(TrkPx, trkPx, float[2]); +DECLARE_SOA_COLUMN(TrkPy, trkPy, float[2]); +DECLARE_SOA_COLUMN(TrkPz, trkPz, float[2]); +DECLARE_SOA_COLUMN(TrkSign, trkSign, int[2]); +DECLARE_SOA_COLUMN(TrkDCAxy, trkDCAxy, float[2]); +DECLARE_SOA_COLUMN(TrkDCAz, trkDCAz, float[2]); +DECLARE_SOA_COLUMN(TrkTimeRes, trkTimeRes, float[2]); +DECLARE_SOA_COLUMN(Trk1ITSclusterSizes, trk1ITSclusterSizes, uint32_t); +DECLARE_SOA_COLUMN(Trk2ITSclusterSizes, trk2ITSclusterSizes, uint32_t); +DECLARE_SOA_COLUMN(TrkTPCsignal, trkTPCsignal, float[2]); +DECLARE_SOA_COLUMN(TrkTPCnSigmaEl, trkTPCnSigmaEl, float[2]); +DECLARE_SOA_COLUMN(TrkTPCnSigmaMu, trkTPCnSigmaMu, float[2]); +DECLARE_SOA_COLUMN(TrkTPCnSigmaPi, trkTPCnSigmaPi, float[2]); +DECLARE_SOA_COLUMN(TrkTPCnSigmaKa, trkTPCnSigmaKa, float[2]); +DECLARE_SOA_COLUMN(TrkTPCnSigmaPr, trkTPCnSigmaPr, float[2]); +DECLARE_SOA_COLUMN(TrkTPCinnerParam, trkTPCinnerParam, float[2]); +DECLARE_SOA_COLUMN(TrkTOFsignal, trkTOFsignal, float[2]); +DECLARE_SOA_COLUMN(TrkTOFnSigmaEl, trkTOFnSigmaEl, float[2]); +DECLARE_SOA_COLUMN(TrkTOFnSigmaMu, trkTOFnSigmaMu, float[2]); +DECLARE_SOA_COLUMN(TrkTOFnSigmaPi, trkTOFnSigmaPi, float[2]); +DECLARE_SOA_COLUMN(TrkTOFnSigmaKa, trkTOFnSigmaKa, float[2]); +DECLARE_SOA_COLUMN(TrkTOFnSigmaPr, trkTOFnSigmaPr, float[2]); +DECLARE_SOA_COLUMN(TrkTOFexpMom, trkTOFexpMom, float[2]); +// truth event +DECLARE_SOA_COLUMN(TrueChannel, trueChannel, int); +DECLARE_SOA_COLUMN(TrueHasRecoColl, trueHasRecoColl, bool); +DECLARE_SOA_COLUMN(TruePosX, truePosX, float); +DECLARE_SOA_COLUMN(TruePosY, truePosY, float); +DECLARE_SOA_COLUMN(TruePosZ, truePosZ, float); +// truth particles +DECLARE_SOA_COLUMN(TrueTauPx, trueTauPx, float[2]); +DECLARE_SOA_COLUMN(TrueTauPy, trueTauPy, float[2]); +DECLARE_SOA_COLUMN(TrueTauPz, trueTauPz, float[2]); +DECLARE_SOA_COLUMN(TrueDaugPx, trueDaugPx, float[2]); +DECLARE_SOA_COLUMN(TrueDaugPy, trueDaugPy, float[2]); +DECLARE_SOA_COLUMN(TrueDaugPz, trueDaugPz, float[2]); +DECLARE_SOA_COLUMN(TrueDaugPdgCode, trueDaugPdgCode, int[2]); +// additional info +DECLARE_SOA_COLUMN(ProblematicEvent, problematicEvent, bool); + +} // namespace tau_tree +DECLARE_SOA_TABLE(TauTwoTracks, "AOD", "TAUTWOTRACK", + tau_tree::RunNumber, + tau_tree::Bc, + tau_tree::TotalTracks, + tau_tree::NumContrib, + tau_tree::GlobalNonPVtracks, + tau_tree::PosX, + tau_tree::PosY, + tau_tree::PosZ, + tau_tree::RecoMode, + tau_tree::OccupancyInTime, + tau_tree::HadronicRate, + tau_tree::Trs, + tau_tree::Trofs, + tau_tree::Hmpr, + tau_tree::Tfb, + tau_tree::ItsRofb, + tau_tree::Sbp, + tau_tree::ZvtxFT0vsPv, + tau_tree::VtxITSTPC, + tau_tree::TotalFT0AmplitudeA, + tau_tree::TotalFT0AmplitudeC, + tau_tree::TotalFV0AmplitudeA, + tau_tree::EnergyCommonZNA, + tau_tree::EnergyCommonZNC, + tau_tree::TimeFT0A, + tau_tree::TimeFT0C, + tau_tree::TimeFV0A, + tau_tree::TimeZNA, + tau_tree::TimeZNC, + tau_tree::TrkPx, + tau_tree::TrkPy, + tau_tree::TrkPz, + tau_tree::TrkSign, + tau_tree::TrkDCAxy, + tau_tree::TrkDCAz, + tau_tree::TrkTimeRes, + tau_tree::Trk1ITSclusterSizes, + tau_tree::Trk2ITSclusterSizes, + tau_tree::TrkTPCsignal, + tau_tree::TrkTPCnSigmaEl, + tau_tree::TrkTPCnSigmaMu, + tau_tree::TrkTPCnSigmaPi, + tau_tree::TrkTPCnSigmaKa, + tau_tree::TrkTPCnSigmaPr, + tau_tree::TrkTPCinnerParam, + tau_tree::TrkTOFsignal, + tau_tree::TrkTOFnSigmaEl, + tau_tree::TrkTOFnSigmaMu, + tau_tree::TrkTOFnSigmaPi, + tau_tree::TrkTOFnSigmaKa, + tau_tree::TrkTOFnSigmaPr, + tau_tree::TrkTOFexpMom); + +DECLARE_SOA_TABLE(TrueTauTwoTracks, "AOD", "TRUETAUTWOTRACK", + tau_tree::RunNumber, + tau_tree::Bc, + tau_tree::TotalTracks, + tau_tree::NumContrib, + tau_tree::GlobalNonPVtracks, + tau_tree::PosX, + tau_tree::PosY, + tau_tree::PosZ, + tau_tree::RecoMode, + tau_tree::OccupancyInTime, + tau_tree::HadronicRate, + tau_tree::Trs, + tau_tree::Trofs, + tau_tree::Hmpr, + tau_tree::Tfb, + tau_tree::ItsRofb, + tau_tree::Sbp, + tau_tree::ZvtxFT0vsPv, + tau_tree::VtxITSTPC, + tau_tree::TotalFT0AmplitudeA, + tau_tree::TotalFT0AmplitudeC, + tau_tree::TotalFV0AmplitudeA, + tau_tree::EnergyCommonZNA, + tau_tree::EnergyCommonZNC, + tau_tree::TimeFT0A, + tau_tree::TimeFT0C, + tau_tree::TimeFV0A, + tau_tree::TimeZNA, + tau_tree::TimeZNC, + tau_tree::TrkPx, + tau_tree::TrkPy, + tau_tree::TrkPz, + tau_tree::TrkSign, + tau_tree::TrkDCAxy, + tau_tree::TrkDCAz, + tau_tree::TrkTimeRes, + tau_tree::Trk1ITSclusterSizes, + tau_tree::Trk2ITSclusterSizes, + tau_tree::TrkTPCsignal, + tau_tree::TrkTPCnSigmaEl, + tau_tree::TrkTPCnSigmaMu, + tau_tree::TrkTPCnSigmaPi, + tau_tree::TrkTPCnSigmaKa, + tau_tree::TrkTPCnSigmaPr, + tau_tree::TrkTPCinnerParam, + tau_tree::TrkTOFsignal, + tau_tree::TrkTOFnSigmaEl, + tau_tree::TrkTOFnSigmaMu, + tau_tree::TrkTOFnSigmaPi, + tau_tree::TrkTOFnSigmaKa, + tau_tree::TrkTOFnSigmaPr, + tau_tree::TrkTOFexpMom, + tau_tree::TrueChannel, + tau_tree::TrueHasRecoColl, + tau_tree::TruePosX, + tau_tree::TruePosY, + tau_tree::TruePosZ, + tau_tree::TrueTauPx, + tau_tree::TrueTauPy, + tau_tree::TrueTauPz, + tau_tree::TrueDaugPx, + tau_tree::TrueDaugPy, + tau_tree::TrueDaugPz, + tau_tree::TrueDaugPdgCode, + tau_tree::ProblematicEvent); + +} // namespace o2::aod + +#endif // ALISW_TAUEVENTTABLES_H diff --git a/PWGUD/TableProducer/tauEventTableProducer.cxx b/PWGUD/TableProducer/tauEventTableProducer.cxx index 035cd4de860..8293a76fd4a 100644 --- a/PWGUD/TableProducer/tauEventTableProducer.cxx +++ b/PWGUD/TableProducer/tauEventTableProducer.cxx @@ -40,7 +40,7 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "PWGUD/Core/UPCTauCentralBarrelHelperRL.h" #include "PWGUD/DataModel/UDTables.h" -#include "PWGUD/DataModel/UDIndex.h" // for UDMcParticles2UDTracks table +#include "PWGUD/DataModel/TauEventTables.h" #include "PWGUD/Core/SGSelector.h" // ROOT headers @@ -52,82 +52,9 @@ using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::constants::physics; -namespace o2::aod -{ -namespace tau_tree -{ -// event info -DECLARE_SOA_COLUMN(RunNumber, runNumber, int32_t); -DECLARE_SOA_COLUMN(Bc, bc, int); -DECLARE_SOA_COLUMN(TotalTracks, totalTracks, int); -DECLARE_SOA_COLUMN(NumContrib, numContrib, int); -DECLARE_SOA_COLUMN(GlobalNonPVtracks, globalNonPVtracks, int); -DECLARE_SOA_COLUMN(PosX, posX, float); -DECLARE_SOA_COLUMN(PosY, posY, float); -DECLARE_SOA_COLUMN(PosZ, posZ, float); -DECLARE_SOA_COLUMN(RecoMode, recoMode, int); -DECLARE_SOA_COLUMN(OccupancyInTime, occupancyInTime, int); -DECLARE_SOA_COLUMN(HadronicRate, hadronicRate, double); -DECLARE_SOA_COLUMN(Trs, trs, int); -DECLARE_SOA_COLUMN(Trofs, trofs, int); -DECLARE_SOA_COLUMN(Hmpr, hmpr, int); -DECLARE_SOA_COLUMN(Tfb, tfb, int); -DECLARE_SOA_COLUMN(ItsRofb, itsRofb, int); -DECLARE_SOA_COLUMN(Sbp, sbp, int); -DECLARE_SOA_COLUMN(ZvtxFT0vsPv, zvtxFT0vsPv, int); -DECLARE_SOA_COLUMN(VtxITSTPC, vtxITSTPC, int); -// FIT info -DECLARE_SOA_COLUMN(TotalFT0AmplitudeA, totalFT0AmplitudeA, float); -DECLARE_SOA_COLUMN(TotalFT0AmplitudeC, totalFT0AmplitudeC, float); -DECLARE_SOA_COLUMN(TotalFV0AmplitudeA, totalFV0AmplitudeA, float); -DECLARE_SOA_COLUMN(EnergyCommonZNA, energyCommonZNA, float); -DECLARE_SOA_COLUMN(EnergyCommonZNC, energyCommonZNC, float); -DECLARE_SOA_COLUMN(TimeFT0A, timeFT0A, float); -DECLARE_SOA_COLUMN(TimeFT0C, timeFT0C, float); -DECLARE_SOA_COLUMN(TimeFV0A, timeFV0A, float); -DECLARE_SOA_COLUMN(TimeZNA, timeZNA, float); -DECLARE_SOA_COLUMN(TimeZNC, timeZNC, float); -// tracks -DECLARE_SOA_COLUMN(TrkPx, trkPx, float[2]); -DECLARE_SOA_COLUMN(TrkPy, trkPy, float[2]); -DECLARE_SOA_COLUMN(TrkPz, trkPz, float[2]); -DECLARE_SOA_COLUMN(TrkSign, trkSign, int[2]); -DECLARE_SOA_COLUMN(TrkDCAxy, trkDCAxy, float[2]); -DECLARE_SOA_COLUMN(TrkDCAz, trkDCAz, float[2]); -DECLARE_SOA_COLUMN(TrkTimeRes, trkTimeRes, float[2]); -DECLARE_SOA_COLUMN(Trk1ITSclusterSizes, trk1ITSclusterSizes, uint32_t); -DECLARE_SOA_COLUMN(Trk2ITSclusterSizes, trk2ITSclusterSizes, uint32_t); -DECLARE_SOA_COLUMN(TrkTPCsignal, trkTPCsignal, float[2]); -DECLARE_SOA_COLUMN(TrkTPCnSigmaEl, trkTPCnSigmaEl, float[2]); -DECLARE_SOA_COLUMN(TrkTPCnSigmaMu, trkTPCnSigmaMu, float[2]); -DECLARE_SOA_COLUMN(TrkTPCnSigmaPi, trkTPCnSigmaPi, float[2]); -DECLARE_SOA_COLUMN(TrkTPCnSigmaKa, trkTPCnSigmaKa, float[2]); -DECLARE_SOA_COLUMN(TrkTPCnSigmaPr, trkTPCnSigmaPr, float[2]); -DECLARE_SOA_COLUMN(TrkTPCinnerParam, trkTPCinnerParam, float[2]); -DECLARE_SOA_COLUMN(TrkTOFsignal, trkTOFsignal, float[2]); -DECLARE_SOA_COLUMN(TrkTOFnSigmaEl, trkTOFnSigmaEl, float[2]); -DECLARE_SOA_COLUMN(TrkTOFnSigmaMu, trkTOFnSigmaMu, float[2]); -DECLARE_SOA_COLUMN(TrkTOFnSigmaPi, trkTOFnSigmaPi, float[2]); -DECLARE_SOA_COLUMN(TrkTOFnSigmaKa, trkTOFnSigmaKa, float[2]); -DECLARE_SOA_COLUMN(TrkTOFnSigmaPr, trkTOFnSigmaPr, float[2]); -DECLARE_SOA_COLUMN(TrkTOFexpMom, trkTOFexpMom, float[2]); - -} // namespace tau_tree -DECLARE_SOA_TABLE(TauTwoTracks, "AOD", "TAUTWOTRACK", - tau_tree::RunNumber, tau_tree::Bc, tau_tree::TotalTracks, tau_tree::NumContrib, tau_tree::GlobalNonPVtracks, tau_tree::PosX, tau_tree::PosY, tau_tree::PosZ, - tau_tree::RecoMode, tau_tree::OccupancyInTime, tau_tree::HadronicRate, - tau_tree::Trs, tau_tree::Trofs, tau_tree::Hmpr, tau_tree::Tfb, tau_tree::ItsRofb, tau_tree::Sbp, tau_tree::ZvtxFT0vsPv, tau_tree::VtxITSTPC, - tau_tree::TotalFT0AmplitudeA, tau_tree::TotalFT0AmplitudeC, tau_tree::TotalFV0AmplitudeA, tau_tree::EnergyCommonZNA, tau_tree::EnergyCommonZNC, - tau_tree::TimeFT0A, tau_tree::TimeFT0C, tau_tree::TimeFV0A, tau_tree::TimeZNA, tau_tree::TimeZNC, - tau_tree::TrkPx, tau_tree::TrkPy, tau_tree::TrkPz, tau_tree::TrkSign, tau_tree::TrkDCAxy, tau_tree::TrkDCAz, tau_tree::TrkTimeRes, - tau_tree::Trk1ITSclusterSizes, tau_tree::Trk2ITSclusterSizes, - tau_tree::TrkTPCsignal, tau_tree::TrkTPCnSigmaEl, tau_tree::TrkTPCnSigmaMu, tau_tree::TrkTPCnSigmaPi, tau_tree::TrkTPCnSigmaKa, tau_tree::TrkTPCnSigmaPr, tau_tree::TrkTPCinnerParam, - tau_tree::TrkTOFsignal, tau_tree::TrkTOFnSigmaEl, tau_tree::TrkTOFnSigmaMu, tau_tree::TrkTOFnSigmaPi, tau_tree::TrkTOFnSigmaKa, tau_tree::TrkTOFnSigmaPr, tau_tree::TrkTOFexpMom); - -} // namespace o2::aod - struct TauEventTableProducer { Produces tauTwoTracks; + Produces trueTauTwoTracks; // Global varialbes Service pdg; @@ -197,9 +124,6 @@ struct TauEventTableProducer { using FullMCUDTracks = soa::Join; using FullMCSGUDCollisions = soa::Join; using FullMCSGUDCollision = FullMCSGUDCollisions::iterator; - using UDMcParticlesWithUDTracks = soa::Join; - using UDMcCollisionsWithUDCollisions = soa::Join; - using UDMcCollisionsWithUDCollision = UDMcCollisionsWithUDCollisions::iterator; // init void init(InitContext&) @@ -209,6 +133,8 @@ struct TauEventTableProducer { mySetITShitsRule(cutGlobalTrack.cutITShitsRule); + histos.add("Truth/hTroubles", "Counter of unwanted issues;;Number of troubles (-)", HistType::kTH1D, {{15, 0.5, 15.5}}); + } // end init template @@ -480,16 +406,270 @@ struct TauEventTableProducer { } PROCESS_SWITCH(TauEventTableProducer, processDataSG, "Iterate UD tables with measured data created by SG-Candidate-Producer.", false); - void processMonteCarlo(UDMcCollisionsWithUDCollision const& mccollision, - FullMCSGUDCollisions const&, - FullUDTracks const&, - UDMcParticlesWithUDTracks const&) + PresliceUnsorted partPerMcCollision = aod::udmcparticle::udMcCollisionId; + PresliceUnsorted colPerMcCollision = aod::udcollision::udMcCollisionId; + PresliceUnsorted trackPerMcParticle = aod::udmctracklabel::udMcParticleId; + Preslice trackPerCollision = aod::udtrack::udCollisionId; // sorted preslice used because the pair track-collision is already sorted in processDataSG function + + void processMonteCarlo(aod::UDMcCollisions const& mccollisions, + aod::UDMcParticles const& parts, + FullMCSGUDCollisions const& recolls, + FullMCUDTracks const& trks) { - LOGF(info, "mccollision idx %i", mccollision.globalIndex()); - if (mccollision.has_udcollisions()) { - auto const& collFromMcColl = mccollision.udcollisions_as(); - LOGF(info, "collision size %i ", collFromMcColl.size()); - } + // start loop over generated collisions + for (const auto& mccoll : mccollisions) { + + // prepare local variables for output table + int32_t runNumber = -999; + int bc = -999; + int nTrks[3] = {-999, -999, -999}; // totalTracks, numContrib, globalNonPVtracks + float vtxPos[3] = {-999., -999., -999.}; + int recoMode = -999; + int occupancy = -999.; + double hadronicRate = -999.; + int bcSels[8] = {-999, -999, -999, -999, -999, -999, -999, -999}; + float amplitudesFIT[3] = {-999., -999., -999.}; // FT0A, FT0C, FV0 + float timesFIT[3] = {-999., -999., -999.}; // FT0A, FT0C, FV0 + + float px[2] = {-999., -999.}; + float py[2] = {-999., -999.}; + float pz[2] = {-999., -999.}; + int sign[2] = {-999, -999}; + float dcaxy[2] = {-999., -999.}; + float dcaz[2] = {-999., -999.}; + float trkTimeRes[2] = {-999., -999.}; + uint32_t itsClusterSizesTrk1 = 4294967295; + uint32_t itsClusterSizesTrk2 = 4294967295; + float tpcSignal[2] = {-999, -999}; + float tpcEl[2] = {-999, -999}; + float tpcMu[2] = {-999, -999}; + float tpcPi[2] = {-999, -999}; + float tpcKa[2] = {-999, -999}; + float tpcPr[2] = {-999, -999}; + float tpcIP[2] = {-999, -999}; + float tofSignal[2] = {-999, -999}; + float tofEl[2] = {-999, -999}; + float tofMu[2] = {-999, -999}; + float tofPi[2] = {-999, -999}; + float tofKa[2] = {-999, -999}; + float tofPr[2] = {-999, -999}; + float tofEP[2] = {-999, -999}; + + int trueChannel = -1; + bool trueHasRecoColl = false; + float trueTauX[2] = {-999., -999.}; + float trueTauY[2] = {-999., -999.}; + float trueTauZ[2] = {-999., -999.}; + float trueDaugX[2] = {-999., -999.}; + float trueDaugY[2] = {-999., -999.}; + float trueDaugZ[2] = {-999., -999.}; + int trueDaugPdgCode[2] = {-999, -999}; + bool problem = false; + + // find reconstructed collisions associated to the generated collision + auto const& collFromMcColls = recolls.sliceBy(colPerMcCollision, mccoll.globalIndex()); + // check the generated collision was reconstructed + if (collFromMcColls.size() > 0) { // get the truth and reco-level info + trueHasRecoColl = true; + // check there is exactly one reco-level collision associated to generated collision + if (collFromMcColls.size() > 1) { + if (verboseInfo) + printLargeMessage("Truth collision has more than 1 reco collision. Skipping this event."); + histos.get(HIST("Truth/hTroubles"))->Fill(1); + problem = true; + continue; + } + // grap reco-level collision + auto const& collFromMcColl = collFromMcColls.iteratorAt(0); + // grab tracks from the reco-level collision to get info to match measured data tables (processDataSG function) + auto const& trksFromColl = trks.sliceBy(trackPerCollision, collFromMcColl.globalIndex()); + int countTracksPerCollision = 0; + int countGoodNonPVtracks = 0; + for (auto const& trkFromColl : trksFromColl) { + countTracksPerCollision++; + if (!trkFromColl.isPVContributor()) { + countGoodNonPVtracks++; + continue; + } + } + + // fill info for reconstructed collision + runNumber = collFromMcColl.runNumber(); + bc = collFromMcColl.globalBC(); + nTrks[0] = countTracksPerCollision; + nTrks[1] = collFromMcColl.numContrib(); + nTrks[2] = countGoodNonPVtracks; + vtxPos[0] = collFromMcColl.posX(); + vtxPos[1] = collFromMcColl.posY(); + vtxPos[2] = collFromMcColl.posZ(); + recoMode = collFromMcColl.flags(); + occupancy = collFromMcColl.occupancyInTime(); + hadronicRate = collFromMcColl.hadronicRate(); + bcSels[0] = collFromMcColl.trs(); + bcSels[1] = collFromMcColl.trofs(); + bcSels[2] = collFromMcColl.hmpr(); + bcSels[3] = collFromMcColl.tfb(); + bcSels[4] = collFromMcColl.itsROFb(); + bcSels[5] = collFromMcColl.sbp(); + bcSels[6] = collFromMcColl.zVtxFT0vPV(); + bcSels[7] = collFromMcColl.vtxITSTPC(); + amplitudesFIT[0] = collFromMcColl.totalFT0AmplitudeA(); + amplitudesFIT[1] = collFromMcColl.totalFT0AmplitudeC(); + amplitudesFIT[2] = collFromMcColl.totalFV0AmplitudeA(); + timesFIT[0] = collFromMcColl.timeFT0A(); + timesFIT[1] = collFromMcColl.timeFT0C(); + timesFIT[2] = collFromMcColl.timeFV0A(); + + // get particles associated to generated collision + auto const& partsFromMcColl = parts.sliceBy(partPerMcCollision, mccoll.globalIndex()); + int countMothers = 0; + for (const auto& particle : partsFromMcColl) { + // select only tauons with checking if particle has no mother + if (particle.has_mothers()) + continue; + countMothers++; + // check the generated collision does not have more than 2 tauons + if (countMothers > 2) { + if (verboseInfo) + printLargeMessage("Truth collision has more than 2 no mother particles. Breaking the particle loop."); + histos.get(HIST("Truth/hTroubles"))->Fill(2); + problem = true; + break; + } + // fill info for each tau + trueTauX[countMothers - 1] = particle.px(); + trueTauY[countMothers - 1] = particle.py(); + trueTauZ[countMothers - 1] = particle.pz(); + + // get daughters of the tau + const auto& daughters = particle.daughters_as(); + int countDaughters = 0; + for (const auto& daughter : daughters) { + // check if it is the charged particle (= no pi0 or neutrino) + if (enumMyParticle(daughter.pdgCode()) == -1) + continue; + countDaughters++; + // check there is only 1 charged daughter related to 1 tau + if (countDaughters > 1) { + if (verboseInfo) + printLargeMessage("Truth collision has more than 1 charged daughters of no mother particles. Breaking the daughter loop."); + histos.get(HIST("Truth/hTroubles"))->Fill(3); + problem = true; + break; + } + // fill info for each daughter + trueDaugX[countMothers - 1] = daughter.px(); + trueDaugY[countMothers - 1] = daughter.py(); + trueDaugZ[countMothers - 1] = daughter.pz(); + trueDaugPdgCode[countMothers - 1] = daughter.pdgCode(); + + // get tracks associated to MC daughter (how well the daughter was reconstructed) + auto const& tracksFromDaughter = trks.sliceBy(trackPerMcParticle, daughter.globalIndex()); + // check there is exactly 1 track per 1 particle + if (tracksFromDaughter.size() > 1) { + if (verboseInfo) + printLargeMessage("Daughter has more than 1 associated track. Skipping this daughter."); + histos.get(HIST("Truth/hTroubles"))->Fill(4); + problem = true; + continue; + } + // grab the track and fill info for reconstructed track (should be done twice) + const auto& trk = tracksFromDaughter.iteratorAt(0); + px[countMothers - 1] = trk.px(); + py[countMothers - 1] = trk.py(); + pz[countMothers - 1] = trk.pz(); + sign[countMothers - 1] = trk.sign(); + dcaxy[countMothers - 1] = trk.dcaXY(); + dcaz[countMothers - 1] = trk.dcaZ(); + trkTimeRes[countMothers - 1] = trk.trackTimeRes(); + if (countMothers == 1) { + itsClusterSizesTrk1 = trk.itsClusterSizes(); + } else { + itsClusterSizesTrk2 = trk.itsClusterSizes(); + } + tpcSignal[countMothers - 1] = trk.tpcSignal(); + tpcEl[countMothers - 1] = trk.tpcNSigmaEl(); + tpcMu[countMothers - 1] = trk.tpcNSigmaMu(); + tpcPi[countMothers - 1] = trk.tpcNSigmaPi(); + tpcKa[countMothers - 1] = trk.tpcNSigmaKa(); + tpcPr[countMothers - 1] = trk.tpcNSigmaPr(); + tpcIP[countMothers - 1] = trk.tpcInnerParam(); + tofSignal[countMothers - 1] = trk.tofSignal(); + tofEl[countMothers - 1] = trk.tofNSigmaEl(); + tofMu[countMothers - 1] = trk.tofNSigmaMu(); + tofPi[countMothers - 1] = trk.tofNSigmaPi(); + tofKa[countMothers - 1] = trk.tofNSigmaKa(); + tofPr[countMothers - 1] = trk.tofNSigmaPr(); + tofEP[countMothers - 1] = trk.tofExpMom(); + } // daughters + } // particles + } else { // get only the truth information. The reco-level info is left on default + // get particles associated to generated collision + auto const& partsFromMcColl = parts.sliceBy(partPerMcCollision, mccoll.globalIndex()); + int countMothers = 0; + for (const auto& particle : partsFromMcColl) { + // select only tauons with checking if particle has no mother + if (particle.has_mothers()) + continue; + countMothers++; + // check the generated collision does not have more than 2 tauons + if (countMothers > 2) { + if (verboseInfo) + printLargeMessage("Truth collision has more than 2 no mother particles. Breaking the particle loop."); + histos.get(HIST("Truth/hTroubles"))->Fill(12); + problem = true; + break; + } + // fill info for each tau + trueTauX[countMothers - 1] = particle.px(); + trueTauY[countMothers - 1] = particle.py(); + trueTauZ[countMothers - 1] = particle.pz(); + + // get daughters of the tau + const auto& daughters = particle.daughters_as(); + int countDaughters = 0; + for (const auto& daughter : daughters) { + // select only the charged particle (= no pi0 or neutrino) + if (enumMyParticle(daughter.pdgCode()) == -1) + continue; + countDaughters++; + // check there is only 1 charged daughter related to 1 tau + if (countDaughters > 1) { + if (verboseInfo) + printLargeMessage("Truth collision has more than 1 charged daughters of no mother particles. Breaking the daughter loop."); + histos.get(HIST("Truth/hTroubles"))->Fill(13); + problem = true; + break; + } + // fill info for each daughter + trueDaugX[countMothers - 1] = daughter.px(); + trueDaugY[countMothers - 1] = daughter.py(); + trueDaugZ[countMothers - 1] = daughter.pz(); + trueDaugPdgCode[countMothers - 1] = daughter.pdgCode(); + } // daughters + } // particles + } // collisions + + // decide the channel and set the variable. Only two cahnnels suported now. + if ((enumMyParticle(trueDaugPdgCode[0]) == P_ELECTRON) && (enumMyParticle(trueDaugPdgCode[1]) == P_ELECTRON)) + trueChannel = CH_EE; + if ((enumMyParticle(trueDaugPdgCode[0]) == P_ELECTRON) && ((enumMyParticle(trueDaugPdgCode[1]) == P_PION) || (enumMyParticle(trueDaugPdgCode[1]) == P_MUON))) + trueChannel = CH_EMUPI; + if ((enumMyParticle(trueDaugPdgCode[1]) == P_ELECTRON) && ((enumMyParticle(trueDaugPdgCode[0]) == P_PION) || (enumMyParticle(trueDaugPdgCode[0]) == P_MUON))) + trueChannel = CH_EMUPI; + + trueTauTwoTracks(runNumber, bc, nTrks[0], nTrks[1], nTrks[2], vtxPos[0], vtxPos[1], vtxPos[2], + recoMode, occupancy, hadronicRate, bcSels[0], bcSels[1], bcSels[2], + bcSels[3], bcSels[4], bcSels[5], bcSels[6], bcSels[7], + amplitudesFIT[0], amplitudesFIT[1], amplitudesFIT[2], -999., -999., // no ZDC info in MC + timesFIT[0], timesFIT[1], timesFIT[2], -999., -999., // no ZDC info in MC + px, py, pz, sign, dcaxy, dcaz, trkTimeRes, + itsClusterSizesTrk1, itsClusterSizesTrk2, + tpcSignal, tpcEl, tpcMu, tpcPi, tpcKa, tpcPr, tpcIP, + tofSignal, tofEl, tofMu, tofPi, tofKa, tofPr, tofEP, + trueChannel, trueHasRecoColl, mccoll.posX(), mccoll.posY(), mccoll.posZ(), + trueTauX, trueTauY, trueTauZ, trueDaugX, trueDaugY, trueDaugZ, trueDaugPdgCode, problem); + } // mccollisions } PROCESS_SWITCH(TauEventTableProducer, processMonteCarlo, "Iterate UD tables with simulated data created by SG-Candidate-Producer.", false); }; From a244981d95417b370624379133a2ad138fff534e Mon Sep 17 00:00:00 2001 From: Thorkj <154221526+Thorkj@users.noreply.github.com> Date: Thu, 24 Apr 2025 20:34:59 +0200 Subject: [PATCH 1091/1650] [PWGCF] Large changes to event mixing making Nch calculation not needed (#10969) --- .../Tasks/corrSparse.cxx | 131 +++++++++--------- 1 file changed, 69 insertions(+), 62 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx b/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx index 33cee50dbca..b80b3e2692b 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx @@ -28,6 +28,7 @@ #include "Common/Core/RecoDecay.h" #include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/Centrality.h" #include "PWGCF/DataModel/CorrelationsDerived.h" @@ -54,39 +55,6 @@ DECLARE_SOA_TABLE(Multiplicity, "AOD", "MULTIPLICITY", // define the filtered collisions and tracks #define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable NAME{#NAME, DEFAULT, HELP}; -struct CalcNch { - O2_DEFINE_CONFIGURABLE(cfgZVtxCut, float, 10.0f, "Accepted z-vertex range") - O2_DEFINE_CONFIGURABLE(cfgPtCutMin, float, 0.2f, "minimum accepted track pT") - O2_DEFINE_CONFIGURABLE(cfgPtCutMax, float, 10.0f, "maximum accepted track pT") - O2_DEFINE_CONFIGURABLE(cfgEtaCut, float, 10.0f, "Eta cut") - O2_DEFINE_CONFIGURABLE(cfgMinMixEventNum, int, 5, "Minimum number of events to mix") - - Filter trackFilter = (nabs(aod::track::eta) < cfgEtaCut) && (aod::track::pt > cfgPtCutMin) && (aod::track::pt < cfgPtCutMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)); - - using AodCollisions = soa::Join; // aod::CentFT0Cs - using AodTracks = soa::Filtered>; - - Produces multiplicityNch; - - HistogramRegistry registry{"registry"}; - - void init(InitContext&) - { - AxisSpec axisNch = {100, 0, 100}; - AxisSpec axisVrtx = {10, -10, 10}; - - registry.add("Ncharge", "N_{charge}", {HistType::kTH1D, {axisNch}}); - registry.add("zVtx_all", "zVtx_all", {HistType::kTH1D, {axisVrtx}}); - } - - void process(AodCollisions::iterator const& collision, AodTracks const& tracks) - { - multiplicityNch(tracks.size()); - registry.fill(HIST("Ncharge"), tracks.size()); - registry.fill(HIST("zVtx_all"), collision.posZ()); - } -}; - struct CorrSparse { Service ccdb; @@ -100,13 +68,16 @@ struct CorrSparse { O2_DEFINE_CONFIGURABLE(cfgMergingCut, float, 0.0, "Merging cut on track merge") O2_DEFINE_CONFIGURABLE(cfgRadiusLow, float, 0.8, "Low radius for merging cut") O2_DEFINE_CONFIGURABLE(cfgRadiusHigh, float, 2.5, "High radius for merging cut") - O2_DEFINE_CONFIGURABLE(etaMftTrackMin, float, -5.0, "Minimum eta for MFT track") - O2_DEFINE_CONFIGURABLE(etaMftTrackMax, float, 0.0, "Maximum eta for MFT track") + O2_DEFINE_CONFIGURABLE(etaMftTrackMin, float, 3.6, "Minimum eta for MFT track") + O2_DEFINE_CONFIGURABLE(etaMftTrackMax, float, 2.5, "Maximum eta for MFT track") O2_DEFINE_CONFIGURABLE(nClustersMftTrack, int, 5, "Minimum number of clusters for MFT track") O2_DEFINE_CONFIGURABLE(cfgSampleSize, double, 10, "Sample size for mixed event") Configurable processMFT{"processMFT", true, "Associate particle from MFT"}; + SliceCache cache; + SliceCache cacheNch; + ConfigurableAxis axisVertex{"axisVertex", {10, -10, 10}, "vertex axis for histograms"}; ConfigurableAxis axisEta{"axisEta", {40, -1., 1.}, "eta axis for histograms"}; ConfigurableAxis axisPhi{"axisPhi", {72, 0.0, constants::math::TwoPI}, "phi axis for histograms"}; @@ -125,7 +96,7 @@ struct CorrSparse { ConfigurableAxis axisPtEfficiency{"axisPtEfficiency", {VARIABLE_WIDTH, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0}, "pt axis for efficiency histograms"}; // make the filters and cuts. - Filter collisionFilter = (nabs(aod::collision::posZ) < cfgZVtxCut) && (aod::corrsparse::multiplicity) > cfgMinMult && (aod::corrsparse::multiplicity) < cfgMaxMult && (aod::evsel::sel8) == true; + Filter collisionFilter = (nabs(aod::collision::posZ) < cfgZVtxCut) && (aod::evsel::sel8) == true; Filter trackFilter = (nabs(aod::track::eta) < cfgEtaCut) && (aod::track::pt > cfgPtCutMin) && (aod::track::pt < cfgPtCutMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)); // Define the outputs @@ -134,7 +105,7 @@ struct CorrSparse { HistogramRegistry registry{"registry"}; - using AodCollisions = soa::Filtered>; // aod::CentFT0Cs + using AodCollisions = soa::Filtered>; // aod::CentFT0Cs using AodTracks = soa::Filtered>; void init(InitContext&) @@ -155,11 +126,12 @@ struct CorrSparse { registry.add("Eta", "Eta", {HistType::kTH1D, {axisEta}}); registry.add("pT", "pT", {HistType::kTH1D, {axisPtTrigger}}); registry.add("Nch", "N_{ch}", {HistType::kTH1D, {axisMultiplicity}}); + registry.add("Nch_used", "N_{ch}", {HistType::kTH1D, {axisMultiplicity}}); // histogram to see how many events are in the same and mixed event registry.add("zVtx", "zVtx", {HistType::kTH1D, {axisVertex}}); - registry.add("Trig_hist", "", {HistType::kTHnSparseF, {{axisMultiplicity, axisVertex, axisPtTrigger}}}); + registry.add("Trig_hist", "", {HistType::kTHnSparseF, {{axisSample, axisVertex, axisPtTrigger}}}); - registry.add("eventcount", "bin", {HistType::kTH1F, {{3, 0, 3, "bin"}}}); // histogram to see how many events are in the same and mixed event + registry.add("eventcount", "bin", {HistType::kTH1F, {{4, 0, 4, "bin"}}}); // histogram to see how many events are in the same and mixed event std::vector corrAxis = {{axisSample, "Sample"}, {axisVertex, "z-vtx (cm)"}, @@ -219,11 +191,21 @@ struct CorrSparse { template void fillYield(TCollision collision, TTracks tracks) // function to fill the yield and etaphi histograms. { + registry.fill(HIST("Nch"), tracks.size()); registry.fill(HIST("zVtx"), collision.posZ()); for (auto const& track1 : tracks) { - registry.fill(HIST("Phi"), track1.phi()); + + if (processMFT) { + if constexpr (std::is_same_v) { + if (!isAcceptedMftTrack(track1)) { + continue; + } + } + } + + registry.fill(HIST("Phi"), RecoDecay::constrainAngle(track1.phi(), 0.0)); registry.fill(HIST("Eta"), track1.eta()); registry.fill(HIST("pT"), track1.pt()); } @@ -255,7 +237,7 @@ struct CorrSparse { // template - void fillCorrelations(TTracks tracks1, TTracksAssoc tracks2, float posZ, int system, float Nch, int magneticField) // function to fill the Output functions (sparse) and the delta eta and delta phi histograms + void fillCorrelations(TTracks tracks1, TTracksAssoc tracks2, float posZ, int system, int magneticField) // function to fill the Output functions (sparse) and the delta eta and delta phi histograms { int fSampleIndex = gRandom->Uniform(0, cfgSampleSize); @@ -264,7 +246,8 @@ struct CorrSparse { for (auto const& track1 : tracks1) { if (system == SameEvent) { - registry.fill(HIST("Trig_hist"), Nch, posZ, track1.pt()); + registry.fill(HIST("Nch_used"), tracks1.size()); + registry.fill(HIST("Trig_hist"), fSampleIndex, posZ, track1.pt()); } for (auto const& track2 : tracks2) { @@ -290,13 +273,13 @@ struct CorrSparse { const double kLimit = 3.0 * cfgMergingCut; - bool bIsBelow = kFALSE; + bool bIsBelow = false; if (std::abs(dPhiStarLow) < kLimit || std::abs(dPhiStarHigh) < kLimit || dPhiStarLow * dPhiStarHigh < 0) { for (double rad(cfgRadiusLow); rad < cfgRadiusHigh; rad += 0.01) { double dPhiStar = getDPhiStar(track1, track2, rad, magneticField); if (std::abs(dPhiStar) < kLimit) { - bIsBelow = kTRUE; + bIsBelow = true; break; } } @@ -325,58 +308,82 @@ struct CorrSparse { auto bc = collision.bc_as(); registry.fill(HIST("eventcount"), SameEvent); // because its same event i put it in the 1 bin - fillYield(collision, tracks); if (processMFT) { + fillYield(collision, mfts); + + if (tracks.size() < cfgMinMult || tracks.size() >= cfgMaxMult) { + return; + } - fillCorrelations(tracks, mfts, collision.posZ(), SameEvent, tracks.size(), getMagneticField(bc.timestamp())); + fillCorrelations(tracks, mfts, collision.posZ(), SameEvent, getMagneticField(bc.timestamp())); } else { + fillYield(collision, tracks); + + if (tracks.size() < cfgMinMult || tracks.size() >= cfgMaxMult) { + return; + } - fillCorrelations(tracks, tracks, collision.posZ(), SameEvent, tracks.size(), getMagneticField(bc.timestamp())); + fillCorrelations(tracks, tracks, collision.posZ(), SameEvent, getMagneticField(bc.timestamp())); } } PROCESS_SWITCH(CorrSparse, processSame, "Process same event", true); - // event mixing - SliceCache cache; - using MixedBinning = ColumnBinningPolicy; - // the process for filling the mixed events void processMixed(AodCollisions const& collisions, AodTracks const& tracks, aod::MFTTracks const& MFTtracks, aod::BCsWithTimestamps const&) { + auto getTracksSize = [&tracks, this](AodCollisions::iterator const& collision) { + auto associatedTracks = tracks.sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), this->cache); + auto mult = associatedTracks.size(); + return mult; + }; + + using MixedBinning = FlexibleBinningPolicy, aod::collision::PosZ, decltype(getTracksSize)>; + + MixedBinning binningOnVtxAndMult{{getTracksSize}, {vtxMix, multMix}, true}; + if (processMFT) { - MixedBinning binningOnVtxAndMult{{vtxMix, multMix}, true}; // true is for 'ignore overflows' (true by default) - auto tracksTuple = std::make_tuple(tracks, MFTtracks); - SameKindPair pairs{binningOnVtxAndMult, cfgMinMixEventNum, -1, collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip - for (auto const& [collision1, tracks1, collision2, tracks2] : pairs) { + auto tracksTuple = std::make_tuple(tracks, MFTtracks); + Pair pair{binningOnVtxAndMult, cfgMinMixEventNum, -1, collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip + for (auto const& [collision1, tracks1, collision2, tracks2] : pair) { registry.fill(HIST("eventcount"), MixedEvent); // fill the mixed event in the 3 bin auto bc = collision1.bc_as(); - fillCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent, tracks1.size(), getMagneticField(bc.timestamp())); + if ((tracks1.size() < cfgMinMult || tracks1.size() >= cfgMaxMult)) + continue; + + if ((tracks2.size() < cfgMinMult || tracks2.size() >= cfgMaxMult)) + continue; + + fillCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent, getMagneticField(bc.timestamp())); } } else { - MixedBinning binningOnVtxAndMult{{vtxMix, multMix}, true}; // true is for 'ignore overflows' (true by default) auto tracksTuple = std::make_tuple(tracks, tracks); - SameKindPair pairs{binningOnVtxAndMult, cfgMinMixEventNum, -1, collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip - - for (auto const& [collision1, tracks1, collision2, tracks2] : pairs) { + Pair pair{binningOnVtxAndMult, cfgMinMixEventNum, -1, collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip + for (auto const& [collision1, tracks1, collision2, tracks2] : pair) { registry.fill(HIST("eventcount"), MixedEvent); // fill the mixed event in the 3 bin auto bc = collision1.bc_as(); - fillCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent, tracks1.size(), getMagneticField(bc.timestamp())); + if ((tracks1.size() < cfgMinMult || tracks1.size() >= cfgMaxMult)) + continue; + + if ((tracks2.size() < cfgMinMult || tracks2.size() >= cfgMaxMult)) + continue; + + fillCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent, getMagneticField(bc.timestamp())); } } } + PROCESS_SWITCH(CorrSparse, processMixed, "Process mixed events", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc), adaptAnalysisTask(cfgc), }; } From 5c0f0f69114938480a1565505a42ceebeafe523c Mon Sep 17 00:00:00 2001 From: Victor Gonzalez Date: Fri, 25 Apr 2025 01:18:34 +0200 Subject: [PATCH 1092/1650] [PWGCF] DptDpt - Adaptation to the nightly tests without event selection (#10982) Co-authored-by: Victor --- PWGCF/TableProducer/dptdptfilter.cxx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/PWGCF/TableProducer/dptdptfilter.cxx b/PWGCF/TableProducer/dptdptfilter.cxx index 93de67eff5c..cc29cd7ece8 100644 --- a/PWGCF/TableProducer/dptdptfilter.cxx +++ b/PWGCF/TableProducer/dptdptfilter.cxx @@ -540,6 +540,9 @@ struct DptDptFilter { void processWithoutCentDetectorLevel(aod::CollisionEvSel const& collision, DptDptFullTracksDetLevel const& ftracks, aod::McParticles const&, const aod::BCsWithTimestamps&); PROCESS_SWITCH(DptDptFilter, processWithoutCentDetectorLevel, "Process MC detector level without centrality", false); + void processWithoutCentWithoutEvSelDetectorLevel(soa::Join::iterator const& collision, DptDptFullTracksDetLevel const& ftracks, aod::McParticles const&, const aod::BCsWithTimestamps&); + PROCESS_SWITCH(DptDptFilter, processWithoutCentWithoutEvSelDetectorLevel, "Process MC detector level without centrality nor event selections", false); + template bool processGenerated(CollisionObject const& mccollision, ParticlesList const& mcparticles, float centormult); @@ -647,6 +650,11 @@ void DptDptFilter::processWithoutCentDetectorLevel(aod::CollisionEvSel const& co processReconstructed(collision, ftracks, 50.0); } +void DptDptFilter::processWithoutCentWithoutEvSelDetectorLevel(soa::Join::iterator const& collision, DptDptFullTracksDetLevel const& ftracks, aod::McParticles const&, aod::BCsWithTimestamps const&) +{ + processReconstructed(collision, ftracks, 50.0); +} + template bool DptDptFilter::processGenerated(CollisionObject const& mccollision, ParticlesList const&, float centormult) { From 338307edd8210d2106958266cdebb89909f1acf2 Mon Sep 17 00:00:00 2001 From: ariedel-cern <85537041+ariedel-cern@users.noreply.github.com> Date: Fri, 25 Apr 2025 08:02:48 +0200 Subject: [PATCH 1093/1650] [PWGCF,Trigger] Add QA histograms (#10983) --- EventFiltering/PWGCF/CFFilterAll.cxx | 2315 +++++++++++++++----------- 1 file changed, 1360 insertions(+), 955 deletions(-) diff --git a/EventFiltering/PWGCF/CFFilterAll.cxx b/EventFiltering/PWGCF/CFFilterAll.cxx index 6d272e825cf..04c52fe92ce 100644 --- a/EventFiltering/PWGCF/CFFilterAll.cxx +++ b/EventFiltering/PWGCF/CFFilterAll.cxx @@ -296,7 +296,10 @@ struct CFFilterAll { } Binning; - HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject}; + // define histogram registry + // because we have so many histograms, we need to have 2 registries + HistogramRegistry registryParticleQA{"ParticleQA", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry registryTriggerQA{"TriggerQA", {}, OutputObjHandlingPolicy::AnalysisObject}; // helper object flor building lambdas o2::pwglf::strangenessBuilderHelper mStraHelper; @@ -353,519 +356,671 @@ struct CFFilterAll { "PhiD_LooseKstar", "PhiD_TightKstar", "RhoD_LooseKstar", "RhoD_TightKstar"}; - registry.add("fProcessedEvents", "CF - event filtered;;Events", HistType::kTH1F, {{prossedEventsBins, -0.5, prossedEventsBins - 0.5}}); - registry.get(HIST("fProcessedEvents"))->GetXaxis()->SetBinLabel(1, "all"); - registry.get(HIST("fProcessedEvents"))->GetXaxis()->SetBinLabel(2, "accepted_loose"); - registry.get(HIST("fProcessedEvents"))->GetXaxis()->SetBinLabel(3, "accepted_tight"); + registryTriggerQA.add("fProcessedEvents", "CF - event filtered;;Events", HistType::kTH1F, {{prossedEventsBins, -0.5, prossedEventsBins - 0.5}}); + registryTriggerQA.get(HIST("fProcessedEvents"))->GetXaxis()->SetBinLabel(1, "all"); + registryTriggerQA.get(HIST("fProcessedEvents"))->GetXaxis()->SetBinLabel(2, "accepted_loose"); + registryTriggerQA.get(HIST("fProcessedEvents"))->GetXaxis()->SetBinLabel(3, "accepted_tight"); - registry.add("fTriggerCorrelations", "CF - Trigger correlations", HistType::kTH2F, {{allTriggers, -0.5, allTriggers - 0.5}, {allTriggers, -0.5, allTriggers - 0.5}}); + registryTriggerQA.add("fTriggerCorrelations", "CF - Trigger correlations", HistType::kTH2F, {{allTriggers, -0.5, allTriggers - 0.5}, {allTriggers, -0.5, allTriggers - 0.5}}); for (size_t iBin = 0; iBin < triggerTitles.size(); iBin++) { - registry.get(HIST("fProcessedEvents"))->GetXaxis()->SetBinLabel(iBin + 4, triggerTitles[iBin].data()); // start triggers from 4th bin - registry.get(HIST("fTriggerCorrelations"))->GetXaxis()->SetBinLabel(iBin + 1, triggerTitles[iBin].data()); - registry.get(HIST("fTriggerCorrelations"))->GetYaxis()->SetBinLabel(iBin + 1, triggerTitles[iBin].data()); + registryTriggerQA.get(HIST("fProcessedEvents"))->GetXaxis()->SetBinLabel(iBin + 4, triggerTitles[iBin].data()); // start triggers from 4th bin + registryTriggerQA.get(HIST("fTriggerCorrelations"))->GetXaxis()->SetBinLabel(iBin + 1, triggerTitles[iBin].data()); + registryTriggerQA.get(HIST("fTriggerCorrelations"))->GetYaxis()->SetBinLabel(iBin + 1, triggerTitles[iBin].data()); } // event cuts - registry.add("EventQA/Before/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); - registry.add("EventQA/Before/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryParticleQA.add("EventQA/Before/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryParticleQA.add("EventQA/Before/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); - registry.add("EventQA/After/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); - registry.add("EventQA/After/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryParticleQA.add("EventQA/After/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryParticleQA.add("EventQA/After/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); // all tracks before cuts - registry.add("TrackQA/Before/Particle/fPt", "Transverse;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("TrackQA/Before/Particle/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); - registry.add("TrackQA/Before/Particle/fPhi", "Azimuthal;#varphi;Entries", HistType::kTH1F, {Binning.phi}); - registry.add("TrackQA/Before/Particle/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); - registry.add("TrackQA/Before/Particle/fItsSignal", "ITSSignal;p_{TPC} (GeV/c);ITS Signal", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); - registry.add("TrackQA/Before/Particle/fTpcSignal", "TPCSignal;p_{TPC} (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); - registry.add("TrackQA/Before/Particle/fTofSignal", "TOFSignal;p_{TPC} (GeV/c);TOF Signal", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); - - registry.add("TrackQA/Before/AntiParticle/fPt", "Transverse momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("TrackQA/Before/AntiParticle/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); - registry.add("TrackQA/Before/AntiParticle/fPhi", "Azimuthal angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); - registry.add("TrackQA/Before/AntiParticle/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); - registry.add("TrackQA/Before/AntiParticle/fItsSignal", "ITSSignal;p_{TPC} (GeV/c);ITS Signal", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); - registry.add("TrackQA/Before/AntiParticle/fTpcSignal", "TPCSignal;p_{TPC} (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); - registry.add("TrackQA/Before/AntiParticle/fTofSignal", "TOFSignal;p_{TPC} (GeV/c);TOF Signal", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); + registryParticleQA.add("TrackQA/Before/Particle/fPt", "Transverse;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("TrackQA/Before/Particle/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registryParticleQA.add("TrackQA/Before/Particle/fPhi", "Azimuthal;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + registryParticleQA.add("TrackQA/Before/Particle/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); + registryParticleQA.add("TrackQA/Before/Particle/fItsSignal", "ITSSignal;p_{TPC} (GeV/c);ITS Signal", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); + registryParticleQA.add("TrackQA/Before/Particle/fTpcSignal", "TPCSignal;p_{TPC} (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); + registryParticleQA.add("TrackQA/Before/Particle/fTofSignal", "TOFSignal;p_{TPC} (GeV/c);TOF Signal", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); + + registryParticleQA.add("TrackQA/Before/AntiParticle/fPt", "Transverse momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("TrackQA/Before/AntiParticle/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registryParticleQA.add("TrackQA/Before/AntiParticle/fPhi", "Azimuthal angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + registryParticleQA.add("TrackQA/Before/AntiParticle/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); + registryParticleQA.add("TrackQA/Before/AntiParticle/fItsSignal", "ITSSignal;p_{TPC} (GeV/c);ITS Signal", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); + registryParticleQA.add("TrackQA/Before/AntiParticle/fTpcSignal", "TPCSignal;p_{TPC} (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); + registryParticleQA.add("TrackQA/Before/AntiParticle/fTofSignal", "TOFSignal;p_{TPC} (GeV/c);TOF Signal", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); // PID vs momentum before cuts - registry.add("TrackQA/Before/Pion/fNsigmaITS", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/Before/Pion/fNsigmaTPC", "NSigmaTPC;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/Before/Pion/fNsigmaTOF", "NSigmaTOF;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/Before/Pion/fNsigmaTPCTOF", "NsigmaTPCTOF;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); - - registry.add("TrackQA/Before/AntiPion/fNsigmaITS", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/Before/AntiPion/fNsigmaTPC", "NSigmaTPC;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/Before/AntiPion/fNsigmaTOF", "NSigmaTOF;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/Before/AntiPion/fNsigmaTPCTOF", "NsigmaTPCTOF;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); - - registry.add("TrackQA/Before/Kaon/fNsigmaITS", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/Before/Kaon/fNsigmaTPC", "NSigmaTPC;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/Before/Kaon/fNsigmaTOF", "NSigmaTOF;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/Before/Kaon/fNsigmaTPCTOF", "NsigmaTPCTOF;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); - - registry.add("TrackQA/Before/AntiKaon/fNsigmaITS", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/Before/AntiKaon/fNsigmaTPC", "NSigmaTPC;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/Before/AntiKaon/fNsigmaTOF", "NSigmaTOF;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/Before/AntiKaon/fNsigmaTPCTOF", "NsigmaTPCTOF;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); - - registry.add("TrackQA/Before/Proton/fNsigmaITS", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/Before/Proton/fNsigmaTPC", "NSigmaTPC;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/Before/Proton/fNsigmaTOF", "NSigmaTOF;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/Before/Proton/fNsigmaTPCTOF", "NsigmaTPCTOF;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); - - registry.add("TrackQA/Before/AntiProton/fNsigmaITS", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/Before/AntiProton/fNsigmaTPC", "NSigmaTPC;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/Before/AntiProton/fNsigmaTOF", "NSigmaTOF;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/Before/AntiProton/fNsigmaTPCTOF", "NsigmaTPCTOF;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); - - registry.add("TrackQA/Before/Deuteron/fNsigmaITS", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/Before/Deuteron/fNsigmaTPC", "NSigmaTPC;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/Before/Deuteron/fNsigmaTOF", "NSigmaTOF;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/Before/Deuteron/fNsigmaTPCTOF", "NsigmaTPCTOF;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); - - registry.add("TrackQA/Before/AntiDeuteron/fNsigmaITS", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/Before/AntiDeuteron/fNsigmaTPC", "NSigmaTPC;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/Before/AntiDeuteron/fNsigmaTOF", "NSigmaTOF;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/Before/AntiDeuteron/fNsigmaTPCTOF", "NsigmaTPCTOF;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + registryParticleQA.add("TrackQA/Before/Pion/fNsigmaITS", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/Before/Pion/fNsigmaTPC", "NSigmaTPC;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/Before/Pion/fNsigmaTOF", "NSigmaTOF;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/Before/Pion/fNsigmaTPCTOF", "NsigmaTPCTOF;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registryParticleQA.add("TrackQA/Before/AntiPion/fNsigmaITS", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/Before/AntiPion/fNsigmaTPC", "NSigmaTPC;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/Before/AntiPion/fNsigmaTOF", "NSigmaTOF;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/Before/AntiPion/fNsigmaTPCTOF", "NsigmaTPCTOF;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registryParticleQA.add("TrackQA/Before/Kaon/fNsigmaITS", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/Before/Kaon/fNsigmaTPC", "NSigmaTPC;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/Before/Kaon/fNsigmaTOF", "NSigmaTOF;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/Before/Kaon/fNsigmaTPCTOF", "NsigmaTPCTOF;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registryParticleQA.add("TrackQA/Before/AntiKaon/fNsigmaITS", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/Before/AntiKaon/fNsigmaTPC", "NSigmaTPC;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/Before/AntiKaon/fNsigmaTOF", "NSigmaTOF;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/Before/AntiKaon/fNsigmaTPCTOF", "NsigmaTPCTOF;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registryParticleQA.add("TrackQA/Before/Proton/fNsigmaITS", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/Before/Proton/fNsigmaTPC", "NSigmaTPC;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/Before/Proton/fNsigmaTOF", "NSigmaTOF;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/Before/Proton/fNsigmaTPCTOF", "NsigmaTPCTOF;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registryParticleQA.add("TrackQA/Before/AntiProton/fNsigmaITS", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/Before/AntiProton/fNsigmaTPC", "NSigmaTPC;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/Before/AntiProton/fNsigmaTOF", "NSigmaTOF;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/Before/AntiProton/fNsigmaTPCTOF", "NsigmaTPCTOF;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registryParticleQA.add("TrackQA/Before/Deuteron/fNsigmaITS", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/Before/Deuteron/fNsigmaTPC", "NSigmaTPC;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/Before/Deuteron/fNsigmaTOF", "NSigmaTOF;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/Before/Deuteron/fNsigmaTPCTOF", "NsigmaTPCTOF;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registryParticleQA.add("TrackQA/Before/AntiDeuteron/fNsigmaITS", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/Before/AntiDeuteron/fNsigmaTPC", "NSigmaTPC;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/Before/AntiDeuteron/fNsigmaTOF", "NSigmaTOF;p_{TPC} (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/Before/AntiDeuteron/fNsigmaTPCTOF", "NsigmaTPCTOF;p_{TPC} (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); // Pion - registry.add("TrackQA/After/Pion/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("TrackQA/After/Pion/fPTpc", "Momentum at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("TrackQA/After/Pion/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); - registry.add("TrackQA/After/Pion/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); - registry.add("TrackQA/After/Pion/fPhi", "Azimuthal angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); - - registry.add("TrackQA/After/Pion/fNsigmaIts", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/After/Pion/fNsigmaTpc", "NSigmaTPC;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/After/Pion/fNsigmaTof", "NSigmaTOF;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/After/Pion/fNsigmaTpcTof", "NSigmaTPCTOF;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); - - registry.add("TrackQA/After/Pion/fItsSignal", "ITS Signal;p (GeV/c); (cm)", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); - registry.add("TrackQA/After/Pion/fTpcSignal", "TPC Signal;p (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); - registry.add("TrackQA/After/Pion/fTofBeta", "TOF #beta;p (GeV/c);#beta_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); - - registry.add("TrackQA/After/Pion/fDcaXy", "DCA_{xy};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); - registry.add("TrackQA/After/Pion/fDcaZ", "DCA_{z};p_{T} (GeV/c); DCA_{Z};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); - - registry.add("TrackQA/After/Pion/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("TrackQA/After/Pion/fTpcCrossedRows", "TPC Crossed Rows;TPC Crossed Rows;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("TrackQA/After/Pion/fTpcSharedClusters", "TPC Shared Clusters;TPC Shared Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("TrackQA/After/Pion/fTpcSharedClusterOverClusterss", "TPC Shared Clusters/Clusters;TPC Shared Clusters/Clusters;Entries", HistType::kTH1F, {Binning.ratio}); - registry.add("TrackQA/After/Pion/fTpcFindableOverRows", "TPC Findabled/Crossed Rows;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {Binning.ratio}); - registry.add("TrackQA/After/Pion/fTpcChi2OverCluster", "TPC #chi^{2}/Cluster;TPC #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.tpcChi2}); - - registry.add("TrackQA/After/Pion/fItsClusters", "ITS Clusters;ITS Clusters;Entries", HistType::kTH1F, {Binning.itsCluster}); - registry.add("TrackQA/After/Pion/fItsIbClusters", "ITS Inner Barrel Clusters;ITS Inner Barrel Clusters;Entries", HistType::kTH1F, {Binning.itsIbCluster}); - registry.add("TrackQA/After/Pion/fItsChi2OverCluster", "ITS #chi^{2}/Cluster;ITS #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.itsChi2}); + registryParticleQA.add("TrackQA/After/Pion/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("TrackQA/After/Pion/fPTpc", "Momentum at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("TrackQA/After/Pion/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); + registryParticleQA.add("TrackQA/After/Pion/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registryParticleQA.add("TrackQA/After/Pion/fPhi", "Azimuthal angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + + registryParticleQA.add("TrackQA/After/Pion/fNsigmaIts", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/After/Pion/fNsigmaTpc", "NSigmaTPC;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/After/Pion/fNsigmaTof", "NSigmaTOF;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/After/Pion/fNsigmaTpcTof", "NSigmaTPCTOF;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registryParticleQA.add("TrackQA/After/Pion/fItsSignal", "ITS Signal;p (GeV/c); (cm)", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); + registryParticleQA.add("TrackQA/After/Pion/fTpcSignal", "TPC Signal;p (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); + registryParticleQA.add("TrackQA/After/Pion/fTofBeta", "TOF #beta;p (GeV/c);#beta_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); + + registryParticleQA.add("TrackQA/After/Pion/fDcaXy", "DCA_{xy};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registryParticleQA.add("TrackQA/After/Pion/fDcaZ", "DCA_{z};p_{T} (GeV/c); DCA_{Z};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + + registryParticleQA.add("TrackQA/After/Pion/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("TrackQA/After/Pion/fTpcCrossedRows", "TPC Crossed Rows;TPC Crossed Rows;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("TrackQA/After/Pion/fTpcSharedClusters", "TPC Shared Clusters;TPC Shared Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("TrackQA/After/Pion/fTpcSharedClusterOverClusterss", "TPC Shared Clusters/Clusters;TPC Shared Clusters/Clusters;Entries", HistType::kTH1F, {Binning.ratio}); + registryParticleQA.add("TrackQA/After/Pion/fTpcFindableOverRows", "TPC Findabled/Crossed Rows;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {Binning.ratio}); + registryParticleQA.add("TrackQA/After/Pion/fTpcChi2OverCluster", "TPC #chi^{2}/Cluster;TPC #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.tpcChi2}); + + registryParticleQA.add("TrackQA/After/Pion/fItsClusters", "ITS Clusters;ITS Clusters;Entries", HistType::kTH1F, {Binning.itsCluster}); + registryParticleQA.add("TrackQA/After/Pion/fItsIbClusters", "ITS Inner Barrel Clusters;ITS Inner Barrel Clusters;Entries", HistType::kTH1F, {Binning.itsIbCluster}); + registryParticleQA.add("TrackQA/After/Pion/fItsChi2OverCluster", "ITS #chi^{2}/Cluster;ITS #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.itsChi2}); // antiPion - registry.add("TrackQA/After/AntiPion/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("TrackQA/After/AntiPion/fPTpc", "Momentum at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("TrackQA/After/AntiPion/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); - registry.add("TrackQA/After/AntiPion/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); - registry.add("TrackQA/After/AntiPion/fPhi", "Azimuthal angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); - - registry.add("TrackQA/After/AntiPion/fNsigmaIts", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/After/AntiPion/fNsigmaTpc", "NSigmaTPC;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/After/AntiPion/fNsigmaTof", "NSigmaTOF;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/After/AntiPion/fNsigmaTpcTof", "NSigmaTPCTOF;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); - - registry.add("TrackQA/After/AntiPion/fItsSignal", "ITS Signal;p (GeV/c); (cm)", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); - registry.add("TrackQA/After/AntiPion/fTpcSignal", "TPC Signal;p (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); - registry.add("TrackQA/After/AntiPion/fTofBeta", "TOF #beta;p (GeV/c);#beta_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); - - registry.add("TrackQA/After/AntiPion/fDcaXy", "DCA_{xy};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); - registry.add("TrackQA/After/AntiPion/fDcaZ", "DCA_{z};p_{T} (GeV/c); DCA_{Z};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); - - registry.add("TrackQA/After/AntiPion/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("TrackQA/After/AntiPion/fTpcCrossedRows", "TPC Crossed Rows;TPC Crossed Rows;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("TrackQA/After/AntiPion/fTpcSharedClusters", "TPC Shared Clusters;TPC Shared Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("TrackQA/After/AntiPion/fTpcSharedClusterOverClusterss", "TPC Shared Clusters/Clusters;TPC Shared Clusters/Clusters;Entries", HistType::kTH1F, {Binning.ratio}); - registry.add("TrackQA/After/AntiPion/fTpcFindableOverRows", "TPC Findabled/Crossed Rows;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {Binning.ratio}); - registry.add("TrackQA/After/AntiPion/fTpcChi2OverCluster", "TPC #chi^{2}/Cluster;TPC #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.tpcChi2}); - - registry.add("TrackQA/After/AntiPion/fItsClusters", "ITS Clusters;ITS Clusters;Entries", HistType::kTH1F, {Binning.itsCluster}); - registry.add("TrackQA/After/AntiPion/fItsIbClusters", "ITS Inner Barrel Clusters;ITS Inner Barrel Clusters;Entries", HistType::kTH1F, {Binning.itsIbCluster}); - registry.add("TrackQA/After/AntiPion/fItsChi2OverCluster", "ITS #chi^{2}/Cluster;ITS #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.itsChi2}); + registryParticleQA.add("TrackQA/After/AntiPion/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("TrackQA/After/AntiPion/fPTpc", "Momentum at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("TrackQA/After/AntiPion/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); + registryParticleQA.add("TrackQA/After/AntiPion/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registryParticleQA.add("TrackQA/After/AntiPion/fPhi", "Azimuthal angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + + registryParticleQA.add("TrackQA/After/AntiPion/fNsigmaIts", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/After/AntiPion/fNsigmaTpc", "NSigmaTPC;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/After/AntiPion/fNsigmaTof", "NSigmaTOF;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/After/AntiPion/fNsigmaTpcTof", "NSigmaTPCTOF;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registryParticleQA.add("TrackQA/After/AntiPion/fItsSignal", "ITS Signal;p (GeV/c); (cm)", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); + registryParticleQA.add("TrackQA/After/AntiPion/fTpcSignal", "TPC Signal;p (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); + registryParticleQA.add("TrackQA/After/AntiPion/fTofBeta", "TOF #beta;p (GeV/c);#beta_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); + + registryParticleQA.add("TrackQA/After/AntiPion/fDcaXy", "DCA_{xy};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registryParticleQA.add("TrackQA/After/AntiPion/fDcaZ", "DCA_{z};p_{T} (GeV/c); DCA_{Z};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + + registryParticleQA.add("TrackQA/After/AntiPion/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("TrackQA/After/AntiPion/fTpcCrossedRows", "TPC Crossed Rows;TPC Crossed Rows;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("TrackQA/After/AntiPion/fTpcSharedClusters", "TPC Shared Clusters;TPC Shared Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("TrackQA/After/AntiPion/fTpcSharedClusterOverClusterss", "TPC Shared Clusters/Clusters;TPC Shared Clusters/Clusters;Entries", HistType::kTH1F, {Binning.ratio}); + registryParticleQA.add("TrackQA/After/AntiPion/fTpcFindableOverRows", "TPC Findabled/Crossed Rows;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {Binning.ratio}); + registryParticleQA.add("TrackQA/After/AntiPion/fTpcChi2OverCluster", "TPC #chi^{2}/Cluster;TPC #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.tpcChi2}); + + registryParticleQA.add("TrackQA/After/AntiPion/fItsClusters", "ITS Clusters;ITS Clusters;Entries", HistType::kTH1F, {Binning.itsCluster}); + registryParticleQA.add("TrackQA/After/AntiPion/fItsIbClusters", "ITS Inner Barrel Clusters;ITS Inner Barrel Clusters;Entries", HistType::kTH1F, {Binning.itsIbCluster}); + registryParticleQA.add("TrackQA/After/AntiPion/fItsChi2OverCluster", "ITS #chi^{2}/Cluster;ITS #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.itsChi2}); // Kaon - registry.add("TrackQA/After/Kaon/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("TrackQA/After/Kaon/fPTpc", "Momentum at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("TrackQA/After/Kaon/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); - registry.add("TrackQA/After/Kaon/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); - registry.add("TrackQA/After/Kaon/fPhi", "Azimuthal angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); - - registry.add("TrackQA/After/Kaon/fNsigmaIts", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/After/Kaon/fNsigmaTpc", "NSigmaTPC;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/After/Kaon/fNsigmaTof", "NSigmaTOF;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/After/Kaon/fNsigmaTpcTof", "NSigmaTPCTOF;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); - - registry.add("TrackQA/After/Kaon/fItsSignal", "ITS Signal;p (GeV/c); (cm)", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); - registry.add("TrackQA/After/Kaon/fTpcSignal", "TPC Signal;p (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); - registry.add("TrackQA/After/Kaon/fTofBeta", "TOF #beta;p (GeV/c);#beta_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); - - registry.add("TrackQA/After/Kaon/fDcaXy", "DCA_{xy};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); - registry.add("TrackQA/After/Kaon/fDcaZ", "DCA_{z};p_{T} (GeV/c); DCA_{Z};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); - - registry.add("TrackQA/After/Kaon/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("TrackQA/After/Kaon/fTpcCrossedRows", "TPC Crossed Rows;TPC Crossed Rows;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("TrackQA/After/Kaon/fTpcSharedClusters", "TPC Shared Clusters;TPC Shared Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("TrackQA/After/Kaon/fTpcSharedClusterOverClusterss", "TPC Shared Clusters/Clusters;TPC Shared Clusters/Clusters;Entries", HistType::kTH1F, {Binning.ratio}); - registry.add("TrackQA/After/Kaon/fTpcFindableOverRows", "TPC Findabled/Crossed Rows;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {Binning.ratio}); - registry.add("TrackQA/After/Kaon/fTpcChi2OverCluster", "TPC #chi^{2}/Cluster;TPC #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.tpcChi2}); - - registry.add("TrackQA/After/Kaon/fItsClusters", "ITS Clusters;ITS Clusters;Entries", HistType::kTH1F, {Binning.itsCluster}); - registry.add("TrackQA/After/Kaon/fItsIbClusters", "ITS Inner Barrel Clusters;ITS Inner Barrel Clusters;Entries", HistType::kTH1F, {Binning.itsIbCluster}); - registry.add("TrackQA/After/Kaon/fItsChi2OverCluster", "ITS #chi^{2}/Cluster;ITS #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.itsChi2}); + registryParticleQA.add("TrackQA/After/Kaon/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("TrackQA/After/Kaon/fPTpc", "Momentum at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("TrackQA/After/Kaon/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); + registryParticleQA.add("TrackQA/After/Kaon/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registryParticleQA.add("TrackQA/After/Kaon/fPhi", "Azimuthal angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + + registryParticleQA.add("TrackQA/After/Kaon/fNsigmaIts", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/After/Kaon/fNsigmaTpc", "NSigmaTPC;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/After/Kaon/fNsigmaTof", "NSigmaTOF;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/After/Kaon/fNsigmaTpcTof", "NSigmaTPCTOF;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registryParticleQA.add("TrackQA/After/Kaon/fItsSignal", "ITS Signal;p (GeV/c); (cm)", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); + registryParticleQA.add("TrackQA/After/Kaon/fTpcSignal", "TPC Signal;p (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); + registryParticleQA.add("TrackQA/After/Kaon/fTofBeta", "TOF #beta;p (GeV/c);#beta_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); + + registryParticleQA.add("TrackQA/After/Kaon/fDcaXy", "DCA_{xy};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registryParticleQA.add("TrackQA/After/Kaon/fDcaZ", "DCA_{z};p_{T} (GeV/c); DCA_{Z};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + + registryParticleQA.add("TrackQA/After/Kaon/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("TrackQA/After/Kaon/fTpcCrossedRows", "TPC Crossed Rows;TPC Crossed Rows;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("TrackQA/After/Kaon/fTpcSharedClusters", "TPC Shared Clusters;TPC Shared Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("TrackQA/After/Kaon/fTpcSharedClusterOverClusterss", "TPC Shared Clusters/Clusters;TPC Shared Clusters/Clusters;Entries", HistType::kTH1F, {Binning.ratio}); + registryParticleQA.add("TrackQA/After/Kaon/fTpcFindableOverRows", "TPC Findabled/Crossed Rows;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {Binning.ratio}); + registryParticleQA.add("TrackQA/After/Kaon/fTpcChi2OverCluster", "TPC #chi^{2}/Cluster;TPC #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.tpcChi2}); + + registryParticleQA.add("TrackQA/After/Kaon/fItsClusters", "ITS Clusters;ITS Clusters;Entries", HistType::kTH1F, {Binning.itsCluster}); + registryParticleQA.add("TrackQA/After/Kaon/fItsIbClusters", "ITS Inner Barrel Clusters;ITS Inner Barrel Clusters;Entries", HistType::kTH1F, {Binning.itsIbCluster}); + registryParticleQA.add("TrackQA/After/Kaon/fItsChi2OverCluster", "ITS #chi^{2}/Cluster;ITS #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.itsChi2}); // antiKaon - registry.add("TrackQA/After/AntiKaon/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("TrackQA/After/AntiKaon/fPTpc", "Momentum at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("TrackQA/After/AntiKaon/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); - registry.add("TrackQA/After/AntiKaon/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); - registry.add("TrackQA/After/AntiKaon/fPhi", "Azimuthal angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); - - registry.add("TrackQA/After/AntiKaon/fNsigmaIts", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/After/AntiKaon/fNsigmaTpc", "NSigmaTPC;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/After/AntiKaon/fNsigmaTof", "NSigmaTOF;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/After/AntiKaon/fNsigmaTpcTof", "NSigmaTPCTOF;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); - - registry.add("TrackQA/After/AntiKaon/fItsSignal", "ITS Signal;p (GeV/c); (cm)", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); - registry.add("TrackQA/After/AntiKaon/fTpcSignal", "TPC Signal;p (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); - registry.add("TrackQA/After/AntiKaon/fTofBeta", "TOF #beta;p (GeV/c);#beta_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); - - registry.add("TrackQA/After/AntiKaon/fDcaXy", "DCA_{xy};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); - registry.add("TrackQA/After/AntiKaon/fDcaZ", "DCA_{z};p_{T} (GeV/c); DCA_{Z};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); - - registry.add("TrackQA/After/AntiKaon/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("TrackQA/After/AntiKaon/fTpcCrossedRows", "TPC Crossed Rows;TPC Crossed Rows;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("TrackQA/After/AntiKaon/fTpcSharedClusters", "TPC Shared Clusters;TPC Shared Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("TrackQA/After/AntiKaon/fTpcSharedClusterOverClusterss", "TPC Shared Clusters/Clusters;TPC Shared Clusters/Clusters;Entries", HistType::kTH1F, {Binning.ratio}); - registry.add("TrackQA/After/AntiKaon/fTpcFindableOverRows", "TPC Findabled/Crossed Rows;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {Binning.ratio}); - registry.add("TrackQA/After/AntiKaon/fTpcChi2OverCluster", "TPC #chi^{2}/Cluster;TPC #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.tpcChi2}); - - registry.add("TrackQA/After/AntiKaon/fItsClusters", "ITS Clusters;ITS Clusters;Entries", HistType::kTH1F, {Binning.itsCluster}); - registry.add("TrackQA/After/AntiKaon/fItsIbClusters", "ITS Inner Barrel Clusters;ITS Inner Barrel Clusters;Entries", HistType::kTH1F, {Binning.itsIbCluster}); - registry.add("TrackQA/After/AntiKaon/fItsChi2OverCluster", "ITS #chi^{2}/Cluster;ITS #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.itsChi2}); + registryParticleQA.add("TrackQA/After/AntiKaon/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("TrackQA/After/AntiKaon/fPTpc", "Momentum at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("TrackQA/After/AntiKaon/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); + registryParticleQA.add("TrackQA/After/AntiKaon/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registryParticleQA.add("TrackQA/After/AntiKaon/fPhi", "Azimuthal angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + + registryParticleQA.add("TrackQA/After/AntiKaon/fNsigmaIts", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/After/AntiKaon/fNsigmaTpc", "NSigmaTPC;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/After/AntiKaon/fNsigmaTof", "NSigmaTOF;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/After/AntiKaon/fNsigmaTpcTof", "NSigmaTPCTOF;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registryParticleQA.add("TrackQA/After/AntiKaon/fItsSignal", "ITS Signal;p (GeV/c); (cm)", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); + registryParticleQA.add("TrackQA/After/AntiKaon/fTpcSignal", "TPC Signal;p (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); + registryParticleQA.add("TrackQA/After/AntiKaon/fTofBeta", "TOF #beta;p (GeV/c);#beta_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); + + registryParticleQA.add("TrackQA/After/AntiKaon/fDcaXy", "DCA_{xy};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registryParticleQA.add("TrackQA/After/AntiKaon/fDcaZ", "DCA_{z};p_{T} (GeV/c); DCA_{Z};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + + registryParticleQA.add("TrackQA/After/AntiKaon/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("TrackQA/After/AntiKaon/fTpcCrossedRows", "TPC Crossed Rows;TPC Crossed Rows;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("TrackQA/After/AntiKaon/fTpcSharedClusters", "TPC Shared Clusters;TPC Shared Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("TrackQA/After/AntiKaon/fTpcSharedClusterOverClusterss", "TPC Shared Clusters/Clusters;TPC Shared Clusters/Clusters;Entries", HistType::kTH1F, {Binning.ratio}); + registryParticleQA.add("TrackQA/After/AntiKaon/fTpcFindableOverRows", "TPC Findabled/Crossed Rows;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {Binning.ratio}); + registryParticleQA.add("TrackQA/After/AntiKaon/fTpcChi2OverCluster", "TPC #chi^{2}/Cluster;TPC #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.tpcChi2}); + + registryParticleQA.add("TrackQA/After/AntiKaon/fItsClusters", "ITS Clusters;ITS Clusters;Entries", HistType::kTH1F, {Binning.itsCluster}); + registryParticleQA.add("TrackQA/After/AntiKaon/fItsIbClusters", "ITS Inner Barrel Clusters;ITS Inner Barrel Clusters;Entries", HistType::kTH1F, {Binning.itsIbCluster}); + registryParticleQA.add("TrackQA/After/AntiKaon/fItsChi2OverCluster", "ITS #chi^{2}/Cluster;ITS #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.itsChi2}); // proton - registry.add("TrackQA/After/Proton/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("TrackQA/After/Proton/fPTpc", "Momentum at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("TrackQA/After/Proton/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); - registry.add("TrackQA/After/Proton/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); - registry.add("TrackQA/After/Proton/fPhi", "Azimuthal angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); - - registry.add("TrackQA/After/Proton/fNsigmaIts", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/After/Proton/fNsigmaTpc", "NSigmaTPC;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/After/Proton/fNsigmaTof", "NSigmaTOF;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/After/Proton/fNsigmaTpcTof", "NSigmaTPCTOF;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); - - registry.add("TrackQA/After/Proton/fItsSignal", "ITS Signal;p (GeV/c); (cm)", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); - registry.add("TrackQA/After/Proton/fTpcSignal", "TPC Signal;p (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); - registry.add("TrackQA/After/Proton/fTofBeta", "TOF #beta;p (GeV/c);#beta_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); - - registry.add("TrackQA/After/Proton/fDcaXy", "DCA_{xy};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); - registry.add("TrackQA/After/Proton/fDcaZ", "DCA_{z};p_{T} (GeV/c); DCA_{Z};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); - - registry.add("TrackQA/After/Proton/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("TrackQA/After/Proton/fTpcCrossedRows", "TPC Crossed Rows;TPC Crossed Rows;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("TrackQA/After/Proton/fTpcSharedClusters", "TPC Shared Clusters;TPC Shared Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("TrackQA/After/Proton/fTpcSharedClusterOverClusterss", "TPC Shared Clusters/Clusters;TPC Shared Clusters/Clusters;Entries", HistType::kTH1F, {Binning.ratio}); - registry.add("TrackQA/After/Proton/fTpcFindableOverRows", "TPC Findabled/Crossed Rows;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {Binning.ratio}); - registry.add("TrackQA/After/Proton/fTpcChi2OverCluster", "TPC #chi^{2}/Cluster;TPC #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.tpcChi2}); - - registry.add("TrackQA/After/Proton/fItsClusters", "ITS Clusters;ITS Clusters;Entries", HistType::kTH1F, {Binning.itsCluster}); - registry.add("TrackQA/After/Proton/fItsIbClusters", "ITS Inner Barrel Clusters;ITS Inner Barrel Clusters;Entries", HistType::kTH1F, {Binning.itsIbCluster}); - registry.add("TrackQA/After/Proton/fItsChi2OverCluster", "ITS #chi^{2}/Cluster;ITS #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.itsChi2}); + registryParticleQA.add("TrackQA/After/Proton/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("TrackQA/After/Proton/fPTpc", "Momentum at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("TrackQA/After/Proton/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); + registryParticleQA.add("TrackQA/After/Proton/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registryParticleQA.add("TrackQA/After/Proton/fPhi", "Azimuthal angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + + registryParticleQA.add("TrackQA/After/Proton/fNsigmaIts", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/After/Proton/fNsigmaTpc", "NSigmaTPC;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/After/Proton/fNsigmaTof", "NSigmaTOF;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/After/Proton/fNsigmaTpcTof", "NSigmaTPCTOF;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registryParticleQA.add("TrackQA/After/Proton/fItsSignal", "ITS Signal;p (GeV/c); (cm)", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); + registryParticleQA.add("TrackQA/After/Proton/fTpcSignal", "TPC Signal;p (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); + registryParticleQA.add("TrackQA/After/Proton/fTofBeta", "TOF #beta;p (GeV/c);#beta_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); + + registryParticleQA.add("TrackQA/After/Proton/fDcaXy", "DCA_{xy};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registryParticleQA.add("TrackQA/After/Proton/fDcaZ", "DCA_{z};p_{T} (GeV/c); DCA_{Z};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + + registryParticleQA.add("TrackQA/After/Proton/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("TrackQA/After/Proton/fTpcCrossedRows", "TPC Crossed Rows;TPC Crossed Rows;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("TrackQA/After/Proton/fTpcSharedClusters", "TPC Shared Clusters;TPC Shared Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("TrackQA/After/Proton/fTpcSharedClusterOverClusterss", "TPC Shared Clusters/Clusters;TPC Shared Clusters/Clusters;Entries", HistType::kTH1F, {Binning.ratio}); + registryParticleQA.add("TrackQA/After/Proton/fTpcFindableOverRows", "TPC Findabled/Crossed Rows;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {Binning.ratio}); + registryParticleQA.add("TrackQA/After/Proton/fTpcChi2OverCluster", "TPC #chi^{2}/Cluster;TPC #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.tpcChi2}); + + registryParticleQA.add("TrackQA/After/Proton/fItsClusters", "ITS Clusters;ITS Clusters;Entries", HistType::kTH1F, {Binning.itsCluster}); + registryParticleQA.add("TrackQA/After/Proton/fItsIbClusters", "ITS Inner Barrel Clusters;ITS Inner Barrel Clusters;Entries", HistType::kTH1F, {Binning.itsIbCluster}); + registryParticleQA.add("TrackQA/After/Proton/fItsChi2OverCluster", "ITS #chi^{2}/Cluster;ITS #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.itsChi2}); // antiproton - registry.add("TrackQA/After/AntiProton/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("TrackQA/After/AntiProton/fPTpc", "Momentum at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("TrackQA/After/AntiProton/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); - registry.add("TrackQA/After/AntiProton/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); - registry.add("TrackQA/After/AntiProton/fPhi", "Azimuthal angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); - - registry.add("TrackQA/After/AntiProton/fNsigmaIts", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/After/AntiProton/fNsigmaTpc", "NSigmaTPC;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/After/AntiProton/fNsigmaTof", "NSigmaTOF;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/After/AntiProton/fNsigmaTpcTof", "NSigmaTPCTOF;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); - - registry.add("TrackQA/After/AntiProton/fItsSignal", "ITS Signal;p (GeV/c); (cm)", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); - registry.add("TrackQA/After/AntiProton/fTpcSignal", "TPC Signal;p (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); - registry.add("TrackQA/After/AntiProton/fTofBeta", "TOF #beta;p (GeV/c);#beta_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); - - registry.add("TrackQA/After/AntiProton/fDcaXy", "DCA_{xy};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); - registry.add("TrackQA/After/AntiProton/fDcaZ", "DCA_{z};p_{T} (GeV/c); DCA_{Z};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); - - registry.add("TrackQA/After/AntiProton/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("TrackQA/After/AntiProton/fTpcCrossedRows", "TPC Crossed Rows;TPC Crossed Rows;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("TrackQA/After/AntiProton/fTpcSharedClusters", "TPC Shared Clusters;TPC Shared Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("TrackQA/After/AntiProton/fTpcSharedClusterOverClusterss", "TPC Shared Clusters/Clusters;TPC Shared Clusters/Clusters;Entries", HistType::kTH1F, {Binning.ratio}); - registry.add("TrackQA/After/AntiProton/fTpcFindableOverRows", "TPC Findabled/Crossed Rows;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {Binning.ratio}); - registry.add("TrackQA/After/AntiProton/fTpcChi2OverCluster", "TPC #chi^{2}/Cluster;TPC #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.tpcChi2}); - - registry.add("TrackQA/After/AntiProton/fItsClusters", "ITS Clusters;ITS Clusters;Entries", HistType::kTH1F, {Binning.itsCluster}); - registry.add("TrackQA/After/AntiProton/fItsIbClusters", "ITS Inner Barrel Clusters;ITS Inner Barrel Clusters;Entries", HistType::kTH1F, {Binning.itsIbCluster}); - registry.add("TrackQA/After/AntiProton/fItsChi2OverCluster", "ITS #chi^{2}/Cluster;ITS #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.itsChi2}); + registryParticleQA.add("TrackQA/After/AntiProton/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("TrackQA/After/AntiProton/fPTpc", "Momentum at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("TrackQA/After/AntiProton/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); + registryParticleQA.add("TrackQA/After/AntiProton/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registryParticleQA.add("TrackQA/After/AntiProton/fPhi", "Azimuthal angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + + registryParticleQA.add("TrackQA/After/AntiProton/fNsigmaIts", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/After/AntiProton/fNsigmaTpc", "NSigmaTPC;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/After/AntiProton/fNsigmaTof", "NSigmaTOF;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/After/AntiProton/fNsigmaTpcTof", "NSigmaTPCTOF;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registryParticleQA.add("TrackQA/After/AntiProton/fItsSignal", "ITS Signal;p (GeV/c); (cm)", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); + registryParticleQA.add("TrackQA/After/AntiProton/fTpcSignal", "TPC Signal;p (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); + registryParticleQA.add("TrackQA/After/AntiProton/fTofBeta", "TOF #beta;p (GeV/c);#beta_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); + + registryParticleQA.add("TrackQA/After/AntiProton/fDcaXy", "DCA_{xy};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registryParticleQA.add("TrackQA/After/AntiProton/fDcaZ", "DCA_{z};p_{T} (GeV/c); DCA_{Z};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + + registryParticleQA.add("TrackQA/After/AntiProton/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("TrackQA/After/AntiProton/fTpcCrossedRows", "TPC Crossed Rows;TPC Crossed Rows;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("TrackQA/After/AntiProton/fTpcSharedClusters", "TPC Shared Clusters;TPC Shared Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("TrackQA/After/AntiProton/fTpcSharedClusterOverClusterss", "TPC Shared Clusters/Clusters;TPC Shared Clusters/Clusters;Entries", HistType::kTH1F, {Binning.ratio}); + registryParticleQA.add("TrackQA/After/AntiProton/fTpcFindableOverRows", "TPC Findabled/Crossed Rows;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {Binning.ratio}); + registryParticleQA.add("TrackQA/After/AntiProton/fTpcChi2OverCluster", "TPC #chi^{2}/Cluster;TPC #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.tpcChi2}); + + registryParticleQA.add("TrackQA/After/AntiProton/fItsClusters", "ITS Clusters;ITS Clusters;Entries", HistType::kTH1F, {Binning.itsCluster}); + registryParticleQA.add("TrackQA/After/AntiProton/fItsIbClusters", "ITS Inner Barrel Clusters;ITS Inner Barrel Clusters;Entries", HistType::kTH1F, {Binning.itsIbCluster}); + registryParticleQA.add("TrackQA/After/AntiProton/fItsChi2OverCluster", "ITS #chi^{2}/Cluster;ITS #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.itsChi2}); // Deuteron - registry.add("TrackQA/After/Deuteron/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("TrackQA/After/Deuteron/fPTpc", "Momentum at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("TrackQA/After/Deuteron/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); - registry.add("TrackQA/After/Deuteron/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); - registry.add("TrackQA/After/Deuteron/fPhi", "Azimuthal angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); - - registry.add("TrackQA/After/Deuteron/fNsigmaIts", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/After/Deuteron/fNsigmaTpc", "NSigmaTPC;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/After/Deuteron/fNsigmaTof", "NSigmaTOF;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/After/Deuteron/fNsigmaTpcTof", "NSigmaTPCTOF;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); - - registry.add("TrackQA/After/Deuteron/fItsSignal", "ITS Signal;p (GeV/c); (cm)", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); - registry.add("TrackQA/After/Deuteron/fTpcSignal", "TPC Signal;p (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); - registry.add("TrackQA/After/Deuteron/fTofBeta", "TOF #beta;p (GeV/c);#beta_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); - - registry.add("TrackQA/After/Deuteron/fDcaXy", "DCA_{xy};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); - registry.add("TrackQA/After/Deuteron/fDcaZ", "DCA_{z};p_{T} (GeV/c); DCA_{Z};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); - - registry.add("TrackQA/After/Deuteron/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("TrackQA/After/Deuteron/fTpcCrossedRows", "TPC Crossed Rows;TPC Crossed Rows;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("TrackQA/After/Deuteron/fTpcSharedClusters", "TPC Shared Clusters;TPC Shared Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("TrackQA/After/Deuteron/fTpcSharedClusterOverClusterss", "TPC Shared Clusters/Clusters;TPC Shared Clusters/Clusters;Entries", HistType::kTH1F, {Binning.ratio}); - registry.add("TrackQA/After/Deuteron/fTpcFindableOverRows", "TPC Findabled/Crossed Rows;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {Binning.ratio}); - registry.add("TrackQA/After/Deuteron/fTpcChi2OverCluster", "TPC #chi^{2}/Cluster;TPC #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.tpcChi2}); - - registry.add("TrackQA/After/Deuteron/fItsClusters", "ITS Clusters;ITS Clusters;Entries", HistType::kTH1F, {Binning.itsCluster}); - registry.add("TrackQA/After/Deuteron/fItsIbClusters", "ITS Inner Barrel Clusters;ITS Inner Barrel Clusters;Entries", HistType::kTH1F, {Binning.itsIbCluster}); - registry.add("TrackQA/After/Deuteron/fItsChi2OverCluster", "ITS #chi^{2}/Cluster;ITS #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.itsChi2}); + registryParticleQA.add("TrackQA/After/Deuteron/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("TrackQA/After/Deuteron/fPTpc", "Momentum at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("TrackQA/After/Deuteron/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); + registryParticleQA.add("TrackQA/After/Deuteron/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registryParticleQA.add("TrackQA/After/Deuteron/fPhi", "Azimuthal angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + + registryParticleQA.add("TrackQA/After/Deuteron/fNsigmaIts", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/After/Deuteron/fNsigmaTpc", "NSigmaTPC;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/After/Deuteron/fNsigmaTof", "NSigmaTOF;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/After/Deuteron/fNsigmaTpcTof", "NSigmaTPCTOF;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); + + registryParticleQA.add("TrackQA/After/Deuteron/fItsSignal", "ITS Signal;p (GeV/c); (cm)", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); + registryParticleQA.add("TrackQA/After/Deuteron/fTpcSignal", "TPC Signal;p (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); + registryParticleQA.add("TrackQA/After/Deuteron/fTofBeta", "TOF #beta;p (GeV/c);#beta_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); + + registryParticleQA.add("TrackQA/After/Deuteron/fDcaXy", "DCA_{xy};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registryParticleQA.add("TrackQA/After/Deuteron/fDcaZ", "DCA_{z};p_{T} (GeV/c); DCA_{Z};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + + registryParticleQA.add("TrackQA/After/Deuteron/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("TrackQA/After/Deuteron/fTpcCrossedRows", "TPC Crossed Rows;TPC Crossed Rows;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("TrackQA/After/Deuteron/fTpcSharedClusters", "TPC Shared Clusters;TPC Shared Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("TrackQA/After/Deuteron/fTpcSharedClusterOverClusterss", "TPC Shared Clusters/Clusters;TPC Shared Clusters/Clusters;Entries", HistType::kTH1F, {Binning.ratio}); + registryParticleQA.add("TrackQA/After/Deuteron/fTpcFindableOverRows", "TPC Findabled/Crossed Rows;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {Binning.ratio}); + registryParticleQA.add("TrackQA/After/Deuteron/fTpcChi2OverCluster", "TPC #chi^{2}/Cluster;TPC #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.tpcChi2}); + + registryParticleQA.add("TrackQA/After/Deuteron/fItsClusters", "ITS Clusters;ITS Clusters;Entries", HistType::kTH1F, {Binning.itsCluster}); + registryParticleQA.add("TrackQA/After/Deuteron/fItsIbClusters", "ITS Inner Barrel Clusters;ITS Inner Barrel Clusters;Entries", HistType::kTH1F, {Binning.itsIbCluster}); + registryParticleQA.add("TrackQA/After/Deuteron/fItsChi2OverCluster", "ITS #chi^{2}/Cluster;ITS #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.itsChi2}); // AntiDeuteron - registry.add("TrackQA/After/AntiDeuteron/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("TrackQA/After/AntiDeuteron/fPTpc", "Momentum at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("TrackQA/After/AntiDeuteron/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); - registry.add("TrackQA/After/AntiDeuteron/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); - registry.add("TrackQA/After/AntiDeuteron/fPhi", "Azimuthal angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); - - registry.add("TrackQA/After/AntiDeuteron/fNsigmaIts", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/After/AntiDeuteron/fNsigmaTpc", "NSigmaTPC;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/After/AntiDeuteron/fNsigmaTof", "NSigmaTOF;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("TrackQA/After/AntiDeuteron/fNsigmaTpcTof", "NSigmaTPCTOF;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - - registry.add("TrackQA/After/AntiDeuteron/fItsSignal", "ITS Signal;p (GeV/c); (cm)", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); - registry.add("TrackQA/After/AntiDeuteron/fTpcSignal", "TPC Signal;p (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); - registry.add("TrackQA/After/AntiDeuteron/fTofBeta", "TOF #beta;p (GeV/c);#beta_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); - - registry.add("TrackQA/After/AntiDeuteron/fDcaXy", "DCA_{xy};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); - registry.add("TrackQA/After/AntiDeuteron/fDcaZ", "DCA_{z};p_{T} (GeV/c); DCA_{Z};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); - - registry.add("TrackQA/After/AntiDeuteron/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("TrackQA/After/AntiDeuteron/fTpcCrossedRows", "TPC Crossed Rows;TPC Crossed Rows;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("TrackQA/After/AntiDeuteron/fTpcSharedClusters", "TPC Shared Clusters;TPC Shared Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("TrackQA/After/AntiDeuteron/fTpcSharedClusterOverClusterss", "TPC Shared Clusters/Clusters;TPC Shared Clusters/Clusters;Entries", HistType::kTH1F, {Binning.ratio}); - registry.add("TrackQA/After/AntiDeuteron/fTpcFindableOverRows", "TPC Findabled/Crossed Rows;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {Binning.ratio}); - registry.add("TrackQA/After/AntiDeuteron/fTpcChi2OverCluster", "TPC #chi^{2}/Cluster;TPC #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.tpcChi2}); - - registry.add("TrackQA/After/AntiDeuteron/fItsClusters", "ITS Clusters;ITS Clusters;Entries", HistType::kTH1F, {Binning.itsCluster}); - registry.add("TrackQA/After/AntiDeuteron/fItsIbClusters", "ITS Inner Barrel Clusters;ITS Inner Barrel Clusters;Entries", HistType::kTH1F, {Binning.itsIbCluster}); - registry.add("TrackQA/After/AntiDeuteron/fItsChi2OverCluster", "ITS #chi^{2}/Cluster;ITS #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.itsChi2}); + registryParticleQA.add("TrackQA/After/AntiDeuteron/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("TrackQA/After/AntiDeuteron/fPTpc", "Momentum at TPC inner wall;p_{TPC} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("TrackQA/After/AntiDeuteron/fMomCor", "Momentum correlation;p_{reco} (GeV/c); p_{TPC} - p_{reco} / p_{reco}", {HistType::kTH2F, {Binning.momentum, Binning.momCor}}); + registryParticleQA.add("TrackQA/After/AntiDeuteron/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registryParticleQA.add("TrackQA/After/AntiDeuteron/fPhi", "Azimuthal angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + + registryParticleQA.add("TrackQA/After/AntiDeuteron/fNsigmaIts", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/After/AntiDeuteron/fNsigmaTpc", "NSigmaTPC;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/After/AntiDeuteron/fNsigmaTof", "NSigmaTOF;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/After/AntiDeuteron/fNsigmaTpcTof", "NSigmaTPCTOF;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + + registryParticleQA.add("TrackQA/After/AntiDeuteron/fItsSignal", "ITS Signal;p (GeV/c); (cm)", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); + registryParticleQA.add("TrackQA/After/AntiDeuteron/fTpcSignal", "TPC Signal;p (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); + registryParticleQA.add("TrackQA/After/AntiDeuteron/fTofBeta", "TOF #beta;p (GeV/c);#beta_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.tofSignal}}); + + registryParticleQA.add("TrackQA/After/AntiDeuteron/fDcaXy", "DCA_{xy};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registryParticleQA.add("TrackQA/After/AntiDeuteron/fDcaZ", "DCA_{z};p_{T} (GeV/c); DCA_{Z};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + + registryParticleQA.add("TrackQA/After/AntiDeuteron/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("TrackQA/After/AntiDeuteron/fTpcCrossedRows", "TPC Crossed Rows;TPC Crossed Rows;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("TrackQA/After/AntiDeuteron/fTpcSharedClusters", "TPC Shared Clusters;TPC Shared Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("TrackQA/After/AntiDeuteron/fTpcSharedClusterOverClusterss", "TPC Shared Clusters/Clusters;TPC Shared Clusters/Clusters;Entries", HistType::kTH1F, {Binning.ratio}); + registryParticleQA.add("TrackQA/After/AntiDeuteron/fTpcFindableOverRows", "TPC Findabled/Crossed Rows;TPC Findable/CrossedRows;Entries", HistType::kTH1F, {Binning.ratio}); + registryParticleQA.add("TrackQA/After/AntiDeuteron/fTpcChi2OverCluster", "TPC #chi^{2}/Cluster;TPC #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.tpcChi2}); + + registryParticleQA.add("TrackQA/After/AntiDeuteron/fItsClusters", "ITS Clusters;ITS Clusters;Entries", HistType::kTH1F, {Binning.itsCluster}); + registryParticleQA.add("TrackQA/After/AntiDeuteron/fItsIbClusters", "ITS Inner Barrel Clusters;ITS Inner Barrel Clusters;Entries", HistType::kTH1F, {Binning.itsIbCluster}); + registryParticleQA.add("TrackQA/After/AntiDeuteron/fItsChi2OverCluster", "ITS #chi^{2}/Cluster;ITS #chi^{2}/Cluster;Entries", HistType::kTH1F, {Binning.itsChi2}); // Lambda before - registry.add("LambdaQA/Before/fPt", "Transverse momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("LambdaQA/Before/fEta", "Psedurapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); - registry.add("LambdaQA/Before/fPhi", "Azimuthal Angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); - registry.add("LambdaQA/Before/fInvMassLambda", "Invariant mass Lambda;M_{#pi p};Entries", HistType::kTH1F, {Binning.invMassLambda}); - registry.add("LambdaQA/Before/fInvMassAntiLambda", "Invariant mass AntiLambda;M_{#pi p};Entries", HistType::kTH1F, {Binning.invMassLambda}); - registry.add("LambdaQA/Before/fInvMassLambdaVsAntiLambda", "Invariant mass of Lambda vs AntiLambda;M_{#pi p};Entries", HistType::kTH2F, {Binning.invMassLambda, Binning.invMassLambda}); - registry.add("LambdaQA/Before/fInvMassLambdaVsKaon", "Invariant mass of Lambda vs K0;M_{#pi p};;M_{#pi #pi}", HistType::kTH2F, {Binning.invMassLambda, Binning.invMassK0short}); - registry.add("LambdaQA/Before/fInvMassAntiLambdaVsKaon", "Invariant mass of AntiLambda vs K0;M_{#pi p};;M_{#pi #pi}", HistType::kTH2F, {Binning.invMassLambda, Binning.invMassK0short}); - registry.add("LambdaQA/Before/fDcaDaugh", "DCA_{Daugh};DCA_{daugh};Entries", HistType::kTH1F, {Binning.dcaDaugh}); - registry.add("LambdaQA/Before/fCpa", "Cosine of pointing angle;CPA;Entries", HistType::kTH1F, {Binning.cpa}); - registry.add("LambdaQA/Before/fTranRad", "Transverse Radisu;TranRad;Entries", HistType::kTH1F, {Binning.transRad}); - registry.add("LambdaQA/Before/fDecVtx", "Decay vertex displacement;DecVtx;Entries", HistType::kTH1F, {Binning.decayVtx}); - registry.add("LambdaQA/Before/PosDaughter/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("LambdaQA/Before/PosDaughter/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); - registry.add("LambdaQA/Before/PosDaughter/fPhi", "Azimuthal Angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); - registry.add("LambdaQA/Before/PosDaughter/fDcaXy", "DCA_{XY};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); - registry.add("LambdaQA/Before/PosDaughter/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("LambdaQA/Before/PosDaughter/fNsigmaTpcProton", "NSigmaTPC Proton;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("LambdaQA/Before/PosDaughter/fNsigmaTpcPion", "NSigmaTPC Pion;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("LambdaQA/Before/NegDaughter/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("LambdaQA/Before/NegDaughter/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); - registry.add("LambdaQA/Before/NegDaughter/fPhi", "Azimuthal Angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); - registry.add("LambdaQA/Before/NegDaughter/fDcaXy", "DCA_{XY};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); - registry.add("LambdaQA/Before/NegDaughter/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("LambdaQA/Before/NegDaughter/fNsigmaTpcProton", "NSigmaTPC AnitProton;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("LambdaQA/Before/NegDaughter/fNsigmaTpcPion", "NSigmaTPC AntiPion;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("LambdaQA/Before/fPt", "Transverse momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("LambdaQA/Before/fEta", "Psedurapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registryParticleQA.add("LambdaQA/Before/fPhi", "Azimuthal Angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + registryParticleQA.add("LambdaQA/Before/fInvMassLambda", "Invariant mass Lambda;M_{#pi p};Entries", HistType::kTH1F, {Binning.invMassLambda}); + registryParticleQA.add("LambdaQA/Before/fInvMassAntiLambda", "Invariant mass AntiLambda;M_{#pi p};Entries", HistType::kTH1F, {Binning.invMassLambda}); + registryParticleQA.add("LambdaQA/Before/fInvMassLambdaVsAntiLambda", "Invariant mass of Lambda vs AntiLambda;M_{#pi p};Entries", HistType::kTH2F, {Binning.invMassLambda, Binning.invMassLambda}); + registryParticleQA.add("LambdaQA/Before/fInvMassLambdaVsKaon", "Invariant mass of Lambda vs K0;M_{#pi p};;M_{#pi #pi}", HistType::kTH2F, {Binning.invMassLambda, Binning.invMassK0short}); + registryParticleQA.add("LambdaQA/Before/fInvMassAntiLambdaVsKaon", "Invariant mass of AntiLambda vs K0;M_{#pi p};;M_{#pi #pi}", HistType::kTH2F, {Binning.invMassLambda, Binning.invMassK0short}); + registryParticleQA.add("LambdaQA/Before/fDcaDaugh", "DCA_{Daugh};DCA_{daugh};Entries", HistType::kTH1F, {Binning.dcaDaugh}); + registryParticleQA.add("LambdaQA/Before/fCpa", "Cosine of pointing angle;CPA;Entries", HistType::kTH1F, {Binning.cpa}); + registryParticleQA.add("LambdaQA/Before/fTranRad", "Transverse Radisu;TranRad;Entries", HistType::kTH1F, {Binning.transRad}); + registryParticleQA.add("LambdaQA/Before/fDecVtx", "Decay vertex displacement;DecVtx;Entries", HistType::kTH1F, {Binning.decayVtx}); + registryParticleQA.add("LambdaQA/Before/PosDaughter/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("LambdaQA/Before/PosDaughter/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registryParticleQA.add("LambdaQA/Before/PosDaughter/fPhi", "Azimuthal Angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + registryParticleQA.add("LambdaQA/Before/PosDaughter/fDcaXy", "DCA_{XY};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registryParticleQA.add("LambdaQA/Before/PosDaughter/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("LambdaQA/Before/PosDaughter/fNsigmaTpcProton", "NSigmaTPC Proton;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("LambdaQA/Before/PosDaughter/fNsigmaTpcPion", "NSigmaTPC Pion;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("LambdaQA/Before/NegDaughter/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("LambdaQA/Before/NegDaughter/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registryParticleQA.add("LambdaQA/Before/NegDaughter/fPhi", "Azimuthal Angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + registryParticleQA.add("LambdaQA/Before/NegDaughter/fDcaXy", "DCA_{XY};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registryParticleQA.add("LambdaQA/Before/NegDaughter/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("LambdaQA/Before/NegDaughter/fNsigmaTpcProton", "NSigmaTPC AnitProton;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("LambdaQA/Before/NegDaughter/fNsigmaTpcPion", "NSigmaTPC AntiPion;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); // Lambda after - registry.add("LambdaQA/After/Lambda/fPt", "Transverse momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("LambdaQA/After/Lambda/fEta", "Psedurapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); - registry.add("LambdaQA/After/Lambda/fPhi", "Azimuthal Angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); - registry.add("LambdaQA/After/Lambda/fInvMass", "Invariant mass;M_{#pi p};Entries", HistType::kTH1F, {Binning.invMassLambda}); - registry.add("LambdaQA/After/Lambda/fInvMassLambdaVsAntiLambda", "Invariant mass of Lambda vs AntiLambda;M_{#pi p};Entries", HistType::kTH2F, {Binning.invMassLambda, Binning.invMassLambda}); - registry.add("LambdaQA/After/Lambda/fInvMassLambdaVsKaon", "Invariant mass of rejected K0 vs V0s;M_{#pi p};;M_{#pi #pi}", HistType::kTH2F, {Binning.invMassLambda, Binning.invMassK0short}); - registry.add("LambdaQA/After/Lambda/fDcaDaugh", "DCA_{Daugh};DCA_{daugh};Entries", HistType::kTH1F, {Binning.dcaDaugh}); - registry.add("LambdaQA/After/Lambda/fCpa", "Cosine of pointing angle;CPA;Entries", HistType::kTH1F, {Binning.cpa}); - registry.add("LambdaQA/After/Lambda/fTranRad", "Transverse Radisu;TranRad;Entries", HistType::kTH1F, {Binning.transRad}); - registry.add("LambdaQA/After/Lambda/fDecVtx", "Decay vertex displacement;DecVtx;Entries", HistType::kTH1F, {Binning.decayVtx}); - registry.add("LambdaQA/After/Lambda/PosDaughter/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("LambdaQA/After/Lambda/PosDaughter/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); - registry.add("LambdaQA/After/Lambda/PosDaughter/fPhi", "Azimuthal Angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); - registry.add("LambdaQA/After/Lambda/PosDaughter/fDcaXy", "DCA_{XY};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); - registry.add("LambdaQA/After/Lambda/PosDaughter/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("LambdaQA/After/Lambda/PosDaughter/fNsigmaTpc", "NSigmaTPC Proton;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("LambdaQA/After/Lambda/NegDaughter/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("LambdaQA/After/Lambda/NegDaughter/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); - registry.add("LambdaQA/After/Lambda/NegDaughter/fPhi", "Azimuthal Angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); - registry.add("LambdaQA/After/Lambda/NegDaughter/fDcaXy", "DCA_{XY};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); - registry.add("LambdaQA/After/Lambda/NegDaughter/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("LambdaQA/After/Lambda/NegDaughter/fNsigmaTpc", "NSigmaTPC AntiPion;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("LambdaQA/After/Lambda/fPt", "Transverse momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("LambdaQA/After/Lambda/fEta", "Psedurapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registryParticleQA.add("LambdaQA/After/Lambda/fPhi", "Azimuthal Angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + registryParticleQA.add("LambdaQA/After/Lambda/fInvMass", "Invariant mass;M_{#pi p};Entries", HistType::kTH1F, {Binning.invMassLambda}); + registryParticleQA.add("LambdaQA/After/Lambda/fInvMassLambdaVsAntiLambda", "Invariant mass of Lambda vs AntiLambda;M_{#pi p};Entries", HistType::kTH2F, {Binning.invMassLambda, Binning.invMassLambda}); + registryParticleQA.add("LambdaQA/After/Lambda/fInvMassLambdaVsKaon", "Invariant mass of rejected K0 vs V0s;M_{#pi p};;M_{#pi #pi}", HistType::kTH2F, {Binning.invMassLambda, Binning.invMassK0short}); + registryParticleQA.add("LambdaQA/After/Lambda/fDcaDaugh", "DCA_{Daugh};DCA_{daugh};Entries", HistType::kTH1F, {Binning.dcaDaugh}); + registryParticleQA.add("LambdaQA/After/Lambda/fCpa", "Cosine of pointing angle;CPA;Entries", HistType::kTH1F, {Binning.cpa}); + registryParticleQA.add("LambdaQA/After/Lambda/fTranRad", "Transverse Radisu;TranRad;Entries", HistType::kTH1F, {Binning.transRad}); + registryParticleQA.add("LambdaQA/After/Lambda/fDecVtx", "Decay vertex displacement;DecVtx;Entries", HistType::kTH1F, {Binning.decayVtx}); + registryParticleQA.add("LambdaQA/After/Lambda/PosDaughter/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("LambdaQA/After/Lambda/PosDaughter/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registryParticleQA.add("LambdaQA/After/Lambda/PosDaughter/fPhi", "Azimuthal Angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + registryParticleQA.add("LambdaQA/After/Lambda/PosDaughter/fDcaXy", "DCA_{XY};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registryParticleQA.add("LambdaQA/After/Lambda/PosDaughter/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("LambdaQA/After/Lambda/PosDaughter/fNsigmaTpc", "NSigmaTPC Proton;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("LambdaQA/After/Lambda/NegDaughter/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("LambdaQA/After/Lambda/NegDaughter/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registryParticleQA.add("LambdaQA/After/Lambda/NegDaughter/fPhi", "Azimuthal Angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + registryParticleQA.add("LambdaQA/After/Lambda/NegDaughter/fDcaXy", "DCA_{XY};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registryParticleQA.add("LambdaQA/After/Lambda/NegDaughter/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("LambdaQA/After/Lambda/NegDaughter/fNsigmaTpc", "NSigmaTPC AntiPion;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); // AntiLambda after - registry.add("LambdaQA/After/AntiLambda/fPt", "Transverse momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("LambdaQA/After/AntiLambda/fEta", "Psedurapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); - registry.add("LambdaQA/After/AntiLambda/fPhi", "Azimuthal Angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); - registry.add("LambdaQA/After/AntiLambda/fInvMass", "Invariant mass;M_{#pi p};Entries", HistType::kTH1F, {Binning.invMassLambda}); - registry.add("LambdaQA/After/AntiLambda/fInvMassAntiLambdaVsLambda", "Invariant mass of Lambda vs AntiLambda;M_{#pi p};Entries", HistType::kTH2F, {Binning.invMassLambda, Binning.invMassLambda}); - registry.add("LambdaQA/After/AntiLambda/fInvMassAntiLambdaVsKaon", "Invariant mass of rejected K0 vs V0s;M_{#pi p};;M_{#pi #pi}", HistType::kTH2F, {Binning.invMassLambda, Binning.invMassK0short}); - registry.add("LambdaQA/After/AntiLambda/fDcaDaugh", "DCA_{Daugh};DCA_{daugh};Entries", HistType::kTH1F, {Binning.dcaDaugh}); - registry.add("LambdaQA/After/AntiLambda/fCpa", "Cosine of pointing angle;CPA;Entries", HistType::kTH1F, {Binning.cpa}); - registry.add("LambdaQA/After/AntiLambda/fTranRad", "Transverse Radisu;TranRad;Entries", HistType::kTH1F, {Binning.transRad}); - registry.add("LambdaQA/After/AntiLambda/fDecVtx", "Decay vertex displacement;DecVtx;Entries", HistType::kTH1F, {Binning.decayVtx}); - registry.add("LambdaQA/After/AntiLambda/PosDaughter/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("LambdaQA/After/AntiLambda/PosDaughter/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); - registry.add("LambdaQA/After/AntiLambda/PosDaughter/fPhi", "Azimuthal Angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); - registry.add("LambdaQA/After/AntiLambda/PosDaughter/fDcaXy", "DCA_{XY};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); - registry.add("LambdaQA/After/AntiLambda/PosDaughter/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("LambdaQA/After/AntiLambda/PosDaughter/fNsigmaTpc", "NSigmaTPC Proton;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registry.add("LambdaQA/After/AntiLambda/NegDaughter/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("LambdaQA/After/AntiLambda/NegDaughter/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); - registry.add("LambdaQA/After/AntiLambda/NegDaughter/fPhi", "Azimuthal Angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); - registry.add("LambdaQA/After/AntiLambda/NegDaughter/fDcaXy", "DCA_{XY};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); - registry.add("LambdaQA/After/AntiLambda/NegDaughter/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); - registry.add("LambdaQA/After/AntiLambda/NegDaughter/fNsigmaTpc", "NSigmaTPC AntiPion;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("LambdaQA/After/AntiLambda/fPt", "Transverse momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("LambdaQA/After/AntiLambda/fEta", "Psedurapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registryParticleQA.add("LambdaQA/After/AntiLambda/fPhi", "Azimuthal Angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + registryParticleQA.add("LambdaQA/After/AntiLambda/fInvMass", "Invariant mass;M_{#pi p};Entries", HistType::kTH1F, {Binning.invMassLambda}); + registryParticleQA.add("LambdaQA/After/AntiLambda/fInvMassAntiLambdaVsLambda", "Invariant mass of Lambda vs AntiLambda;M_{#pi p};Entries", HistType::kTH2F, {Binning.invMassLambda, Binning.invMassLambda}); + registryParticleQA.add("LambdaQA/After/AntiLambda/fInvMassAntiLambdaVsKaon", "Invariant mass of rejected K0 vs V0s;M_{#pi p};;M_{#pi #pi}", HistType::kTH2F, {Binning.invMassLambda, Binning.invMassK0short}); + registryParticleQA.add("LambdaQA/After/AntiLambda/fDcaDaugh", "DCA_{Daugh};DCA_{daugh};Entries", HistType::kTH1F, {Binning.dcaDaugh}); + registryParticleQA.add("LambdaQA/After/AntiLambda/fCpa", "Cosine of pointing angle;CPA;Entries", HistType::kTH1F, {Binning.cpa}); + registryParticleQA.add("LambdaQA/After/AntiLambda/fTranRad", "Transverse Radisu;TranRad;Entries", HistType::kTH1F, {Binning.transRad}); + registryParticleQA.add("LambdaQA/After/AntiLambda/fDecVtx", "Decay vertex displacement;DecVtx;Entries", HistType::kTH1F, {Binning.decayVtx}); + registryParticleQA.add("LambdaQA/After/AntiLambda/PosDaughter/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("LambdaQA/After/AntiLambda/PosDaughter/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registryParticleQA.add("LambdaQA/After/AntiLambda/PosDaughter/fPhi", "Azimuthal Angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + registryParticleQA.add("LambdaQA/After/AntiLambda/PosDaughter/fDcaXy", "DCA_{XY};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registryParticleQA.add("LambdaQA/After/AntiLambda/PosDaughter/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("LambdaQA/After/AntiLambda/PosDaughter/fNsigmaTpc", "NSigmaTPC Proton;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("LambdaQA/After/AntiLambda/NegDaughter/fPt", "Transverse Momentum;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("LambdaQA/After/AntiLambda/NegDaughter/fEta", "Pseudorapidity;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registryParticleQA.add("LambdaQA/After/AntiLambda/NegDaughter/fPhi", "Azimuthal Angle;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + registryParticleQA.add("LambdaQA/After/AntiLambda/NegDaughter/fDcaXy", "DCA_{XY};p_{T} (GeV/c); DCA_{XY};Entries", HistType::kTH2F, {Binning.momentum, Binning.dca}); + registryParticleQA.add("LambdaQA/After/AntiLambda/NegDaughter/fTpcClusters", "TPC Clusters;TPC Clusters;Entries", HistType::kTH1F, {Binning.tpcCluster}); + registryParticleQA.add("LambdaQA/After/AntiLambda/NegDaughter/fNsigmaTpc", "NSigmaTPC AntiPion;p_{TPC} (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); // Phi before - registry.add("PhiQA/Before/fInvMass", "Invariant mass #phi;M_{KK};Entries", HistType::kTH1F, {Binning.invMassPhi}); - registry.add("PhiQA/Before/fPt", "Transverse momentum #phi;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("PhiQA/Before/fEta", "Pseudorapidity of V0;#eta;Entries", HistType::kTH1F, {Binning.eta}); - registry.add("PhiQA/Before/fPhi", "Azimuthal angle of #phi;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + registryParticleQA.add("PhiQA/Before/fInvMass", "Invariant mass #phi;M_{KK};Entries", HistType::kTH1F, {Binning.invMassPhi}); + registryParticleQA.add("PhiQA/Before/fPt", "Transverse momentum #phi;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("PhiQA/Before/fEta", "Pseudorapidity of V0;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registryParticleQA.add("PhiQA/Before/fPhi", "Azimuthal angle of #phi;#varphi;Entries", HistType::kTH1F, {Binning.phi}); // Phi after - registry.add("PhiQA/After/fInvMass", "Invariant mass #phi;M_{KK};Entries", HistType::kTH1F, {Binning.invMassPhi}); - registry.add("PhiQA/After/fPt", "Transverse momentum #phi;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("PhiQA/After/fEta", "Pseudorapidity of #phi;#eta;Entries", HistType::kTH1F, {Binning.eta}); - registry.add("PhiQA/After/fPhi", "Azimuthal angle of #Phi;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + registryParticleQA.add("PhiQA/After/fInvMass", "Invariant mass #phi;M_{KK};Entries", HistType::kTH1F, {Binning.invMassPhi}); + registryParticleQA.add("PhiQA/After/fPt", "Transverse momentum #phi;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("PhiQA/After/fEta", "Pseudorapidity of #phi;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registryParticleQA.add("PhiQA/After/fPhi", "Azimuthal angle of #Phi;#varphi;Entries", HistType::kTH1F, {Binning.phi}); // Rho before - registry.add("RhoQA/Before/fInvMass", "Invariant mass #rho;M_{#pi#pi};Entries", HistType::kTH1F, {Binning.invMassRho}); - registry.add("RhoQA/Before/fPt", "Transverse momentum #rho;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("RhoQA/Before/fEta", "Pseudorapidity of #rho;#eta;Entries", HistType::kTH1F, {Binning.eta}); - registry.add("RhoQA/Before/fPhi", "Azimuthal angle of #rho;#varphi;Entries", HistType::kTH1F, {Binning.phi}); + registryParticleQA.add("RhoQA/Before/fInvMass", "Invariant mass #rho;M_{#pi#pi};Entries", HistType::kTH1F, {Binning.invMassRho}); + registryParticleQA.add("RhoQA/Before/fPt", "Transverse momentum #rho;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("RhoQA/Before/fEta", "Pseudorapidity of #rho;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registryParticleQA.add("RhoQA/Before/fPhi", "Azimuthal angle of #rho;#varphi;Entries", HistType::kTH1F, {Binning.phi}); // Rho after - registry.add("RhoQA/After/fInvMass", "Invariant mass #rho;M_{#pi#pi};Entries", HistType::kTH1F, {Binning.invMassRho}); - registry.add("RhoQA/After/fPt", "Transverse momentum #rho;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); - registry.add("RhoQA/After/fEta", "Pseudorapidity of #rho;#eta;Entries", HistType::kTH1F, {Binning.eta}); - registry.add("RhoQA/After/fPhi", "Azimuthal angle of #rho;#phi;Entries", HistType::kTH1F, {Binning.phi}); + registryParticleQA.add("RhoQA/After/fInvMass", "Invariant mass #rho;M_{#pi#pi};Entries", HistType::kTH1F, {Binning.invMassRho}); + registryParticleQA.add("RhoQA/After/fPt", "Transverse momentum #rho;p_{T} (GeV/c);Entries", HistType::kTH1F, {Binning.momentum}); + registryParticleQA.add("RhoQA/After/fEta", "Pseudorapidity of #rho;#eta;Entries", HistType::kTH1F, {Binning.eta}); + registryParticleQA.add("RhoQA/After/fPhi", "Azimuthal angle of #rho;#phi;Entries", HistType::kTH1F, {Binning.phi}); // for ppp - registry.add("PPP/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); - registry.add("PPP/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); - registry.add("PPP/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); - registry.add("PPP/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); - registry.add("PPP/fProtonPtVsQ3", "Proton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registry.add("PPP/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PPP/all/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("PPP/all/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("PPP/all/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PPP/all/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PPP/all/fProtonPtVsQ3", "Proton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PPP/all/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PPP/loose/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("PPP/loose/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("PPP/loose/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PPP/loose/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PPP/loose/fProtonPtVsQ3", "Proton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PPP/loose/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PPP/tight/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("PPP/tight/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("PPP/tight/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PPP/tight/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PPP/tight/fProtonPtVsQ3", "Proton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PPP/tight/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); // for ppl - registry.add("PPL/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); - registry.add("PPL/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); - registry.add("PPL/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); - registry.add("PPL/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); - registry.add("PPL/fProtonPtVsQ3", "Proton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registry.add("PPL/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registry.add("PPL/fLambdaPtVsQ3", "Lambda p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registry.add("PPL/fAntiLambdaPtVsQ3", "AntiLambda p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PPL/all/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("PPL/all/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("PPL/all/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PPL/all/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PPL/all/fProtonPtVsQ3", "Proton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PPL/all/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PPL/all/fLambdaPtVsQ3", "Lambda p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PPL/all/fAntiLambdaPtVsQ3", "AntiLambda p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PPL/loose/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("PPL/loose/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("PPL/loose/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PPL/loose/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PPL/loose/fProtonPtVsQ3", "Proton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PPL/loose/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PPL/loose/fLambdaPtVsQ3", "Lambda p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PPL/loose/fAntiLambdaPtVsQ3", "AntiLambda p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PPL/tight/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("PPL/tight/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("PPL/tight/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PPL/tight/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PPL/tight/fProtonPtVsQ3", "Proton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PPL/tight/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PPL/tight/fLambdaPtVsQ3", "Lambda p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PPL/tight/fAntiLambdaPtVsQ3", "AntiLambda p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); // for pll - registry.add("PLL/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); - registry.add("PLL/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); - registry.add("PLL/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); - registry.add("PLL/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); - registry.add("PLL/fProtonPtVsQ3", "Proton p_{T}Q3 vs pT", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registry.add("PLL/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registry.add("PLL/fLambdaPtVsQ3", "Lambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registry.add("PLL/fAntiLambdaPtVsQ3", "AntiLambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PLL/all/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("PLL/all/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("PLL/all/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PLL/all/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PLL/all/fProtonPtVsQ3", "Proton p_{T}Q3 vs pT", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PLL/all/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PLL/all/fLambdaPtVsQ3", "Lambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PLL/all/fAntiLambdaPtVsQ3", "AntiLambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PLL/loose/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("PLL/loose/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("PLL/loose/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PLL/loose/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PLL/loose/fProtonPtVsQ3", "Proton p_{T}Q3 vs pT", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PLL/loose/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PLL/loose/fLambdaPtVsQ3", "Lambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PLL/loose/fAntiLambdaPtVsQ3", "AntiLambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PLL/tight/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("PLL/tight/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("PLL/tight/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PLL/tight/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PLL/tight/fProtonPtVsQ3", "Proton p_{T}Q3 vs pT", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PLL/tight/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PLL/tight/fLambdaPtVsQ3", "Lambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PLL/tight/fAntiLambdaPtVsQ3", "AntiLambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); // for lll - registry.add("LLL/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); - registry.add("LLL/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); - registry.add("LLL/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); - registry.add("LLL/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); - registry.add("LLL/fLambdaPtVsQ3", "Lambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registry.add("LLL/fAntiLambdaPtVsQ3", "AntiLambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("LLL/all/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("LLL/all/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("LLL/all/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("LLL/all/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("LLL/all/fLambdaPtVsQ3", "Lambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("LLL/all/fAntiLambdaPtVsQ3", "AntiLambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("LLL/loose/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("LLL/loose/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("LLL/loose/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("LLL/loose/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("LLL/loose/fLambdaPtVsQ3", "Lambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("LLL/loose/fAntiLambdaPtVsQ3", "AntiLambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("LLL/tight/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("LLL/tight/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("LLL/tight/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("LLL/tight/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("LLL/tight/fLambdaPtVsQ3", "Lambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("LLL/tight/fAntiLambdaPtVsQ3", "AntiLambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); // for ppPhi - registry.add("PPPhi/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); - registry.add("PPPhi/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); - registry.add("PPPhi/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); - registry.add("PPPhi/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); - registry.add("PPPhi/fProtonPtVsQ3", "Proton p_{T} vs Q_{3}", HistType::kTH2F, {Binning.momentum, Binning.q3}); - registry.add("PPPhi/fAntiProtonPtVsQ3", "AntiLambda p_{T} vs Q3", HistType::kTH2F, {Binning.momentum, Binning.q3}); - registry.add("PPPhi/fPhiPtVsQ3", "#phi p_{T} vs Q_{3};p_{T} (GeV/c); Q_{3} (GeV/c)", HistType::kTH2F, {Binning.momentum, Binning.q3}); - registry.add("PPPhi/fPhiInvMassVsQ3", "#phi mass vs Q_{3};M_{K^{+}K^{-}} (GeV/c^{2});Q_{3} (GeV/c)", HistType::kTH2F, {Binning.invMassPhi, Binning.q3}); + registryTriggerQA.add("PPPhi/all/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("PPPhi/all/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("PPPhi/all/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PPPhi/all/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PPPhi/all/fProtonPtVsQ3", "Proton p_{T} vs Q_{3}", HistType::kTH2F, {Binning.momentum, Binning.q3}); + registryTriggerQA.add("PPPhi/all/fAntiProtonPtVsQ3", "AntiLambda p_{T} vs Q3", HistType::kTH2F, {Binning.momentum, Binning.q3}); + registryTriggerQA.add("PPPhi/all/fPhiPtVsQ3", "#phi p_{T} vs Q_{3};p_{T} (GeV/c); Q_{3} (GeV/c)", HistType::kTH2F, {Binning.momentum, Binning.q3}); + registryTriggerQA.add("PPPhi/all/fPhiInvMassVsQ3", "#phi mass vs Q_{3};M_{K^{+}K^{-}} (GeV/c^{2});Q_{3} (GeV/c)", HistType::kTH2F, {Binning.invMassPhi, Binning.q3}); + registryTriggerQA.add("PPPhi/loose/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("PPPhi/loose/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("PPPhi/loose/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PPPhi/loose/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PPPhi/loose/fProtonPtVsQ3", "Proton p_{T} vs Q_{3}", HistType::kTH2F, {Binning.momentum, Binning.q3}); + registryTriggerQA.add("PPPhi/loose/fAntiProtonPtVsQ3", "AntiLambda p_{T} vs Q3", HistType::kTH2F, {Binning.momentum, Binning.q3}); + registryTriggerQA.add("PPPhi/loose/fPhiPtVsQ3", "#phi p_{T} vs Q_{3};p_{T} (GeV/c); Q_{3} (GeV/c)", HistType::kTH2F, {Binning.momentum, Binning.q3}); + registryTriggerQA.add("PPPhi/loose/fPhiInvMassVsQ3", "#phi mass vs Q_{3};M_{K^{+}K^{-}} (GeV/c^{2});Q_{3} (GeV/c)", HistType::kTH2F, {Binning.invMassPhi, Binning.q3}); + registryTriggerQA.add("PPPhi/tight/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("PPPhi/tight/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("PPPhi/tight/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PPPhi/tight/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PPPhi/tight/fProtonPtVsQ3", "Proton p_{T} vs Q_{3}", HistType::kTH2F, {Binning.momentum, Binning.q3}); + registryTriggerQA.add("PPPhi/tight/fAntiProtonPtVsQ3", "AntiLambda p_{T} vs Q3", HistType::kTH2F, {Binning.momentum, Binning.q3}); + registryTriggerQA.add("PPPhi/tight/fPhiPtVsQ3", "#phi p_{T} vs Q_{3};p_{T} (GeV/c); Q_{3} (GeV/c)", HistType::kTH2F, {Binning.momentum, Binning.q3}); + registryTriggerQA.add("PPPhi/tight/fPhiInvMassVsQ3", "#phi mass vs Q_{3};M_{K^{+}K^{-}} (GeV/c^{2});Q_{3} (GeV/c)", HistType::kTH2F, {Binning.invMassPhi, Binning.q3}); // for ppRho - registry.add("PPRho/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); - registry.add("PPRho/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); - registry.add("PPRho/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); - registry.add("PPRho/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); - registry.add("PPRho/fProtonPtVsQ3", "Proton p_{T} vs Q3", HistType::kTH2F, {Binning.momentum, Binning.q3}); - registry.add("PPRho/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q3", HistType::kTH2F, {Binning.momentum, Binning.q3}); - registry.add("PPRho/fRhoPtVsQ3", "#rho p_{T} vs Q3;Q_{3} (GeV/c);SE", HistType::kTH2F, {Binning.momentum, Binning.q3}); - registry.add("PPRho/fRhoInvMassVsQ3", "#rho mass vs Q_{3};M_{#pi^{+}#pi^{-}} (GeV/c^{2});Q_{3} (GeV/c)", HistType::kTH2F, {Binning.invMassRho, Binning.q3}); + registryTriggerQA.add("PPRho/all/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("PPRho/all/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("PPRho/all/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PPRho/all/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PPRho/all/fProtonPtVsQ3", "Proton p_{T} vs Q3", HistType::kTH2F, {Binning.momentum, Binning.q3}); + registryTriggerQA.add("PPRho/all/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q3", HistType::kTH2F, {Binning.momentum, Binning.q3}); + registryTriggerQA.add("PPRho/all/fRhoPtVsQ3", "#rho p_{T} vs Q3;Q_{3} (GeV/c);SE", HistType::kTH2F, {Binning.momentum, Binning.q3}); + registryTriggerQA.add("PPRho/all/fRhoInvMassVsQ3", "#rho mass vs Q_{3};M_{#pi^{+}#pi^{-}} (GeV/c^{2});Q_{3} (GeV/c)", HistType::kTH2F, {Binning.invMassRho, Binning.q3}); + registryTriggerQA.add("PPRho/loose/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("PPRho/loose/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("PPRho/loose/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PPRho/loose/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PPRho/loose/fProtonPtVsQ3", "Proton p_{T} vs Q3", HistType::kTH2F, {Binning.momentum, Binning.q3}); + registryTriggerQA.add("PPRho/loose/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q3", HistType::kTH2F, {Binning.momentum, Binning.q3}); + registryTriggerQA.add("PPRho/loose/fRhoPtVsQ3", "#rho p_{T} vs Q3;Q_{3} (GeV/c);SE", HistType::kTH2F, {Binning.momentum, Binning.q3}); + registryTriggerQA.add("PPRho/loose/fRhoInvMassVsQ3", "#rho mass vs Q_{3};M_{#pi^{+}#pi^{-}} (GeV/c^{2});Q_{3} (GeV/c)", HistType::kTH2F, {Binning.invMassRho, Binning.q3}); + registryTriggerQA.add("PPRho/tight/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("PPRho/tight/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("PPRho/tight/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PPRho/tight/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); + registryTriggerQA.add("PPRho/tight/fProtonPtVsQ3", "Proton p_{T} vs Q3", HistType::kTH2F, {Binning.momentum, Binning.q3}); + registryTriggerQA.add("PPRho/tight/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q3", HistType::kTH2F, {Binning.momentum, Binning.q3}); + registryTriggerQA.add("PPRho/tight/fRhoPtVsQ3", "#rho p_{T} vs Q3;Q_{3} (GeV/c);SE", HistType::kTH2F, {Binning.momentum, Binning.q3}); + registryTriggerQA.add("PPRho/tight/fRhoInvMassVsQ3", "#rho mass vs Q_{3};M_{#pi^{+}#pi^{-}} (GeV/c^{2});Q_{3} (GeV/c)", HistType::kTH2F, {Binning.invMassRho, Binning.q3}); // for pd - registry.add("PD/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); - registry.add("PD/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); - registry.add("PD/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registry.add("PD/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registry.add("PD/fProtonPtVskstar", "Proton p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registry.add("PD/fAntiProtonPtVskstar", "AntiProton p_{T} vs k^{*};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registry.add("PD/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registry.add("PD/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("PD/all/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("PD/all/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("PD/all/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("PD/all/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("PD/all/fProtonPtVskstar", "Proton p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("PD/all/fAntiProtonPtVskstar", "AntiProton p_{T} vs k^{*};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("PD/all/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("PD/all/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("PD/loose/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("PD/loose/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("PD/loose/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("PD/loose/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("PD/loose/fProtonPtVskstar", "Proton p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("PD/loose/fAntiProtonPtVskstar", "AntiProton p_{T} vs k^{*};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("PD/loose/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("PD/loose/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("PD/tight/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("PD/tight/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("PD/tight/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("PD/tight/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("PD/tight/fProtonPtVskstar", "Proton p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("PD/tight/fAntiProtonPtVskstar", "AntiProton p_{T} vs k^{*};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("PD/tight/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("PD/tight/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); // for ld - registry.add("LD/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); - registry.add("LD/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); - registry.add("LD/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registry.add("LD/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registry.add("LD/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registry.add("LD/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registry.add("LD/fLambdaPtVskstar", "Lambda p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registry.add("LD/fAntiLambdaPtVskstar", "AntiLambda p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("LD/all/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("LD/all/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("LD/all/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("LD/all/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("LD/all/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("LD/all/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("LD/all/fLambdaPtVskstar", "Lambda p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("LD/all/fAntiLambdaPtVskstar", "AntiLambda p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("LD/loose/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("LD/loose/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("LD/loose/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("LD/loose/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("LD/loose/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("LD/loose/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("LD/loose/fLambdaPtVskstar", "Lambda p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("LD/loose/fAntiLambdaPtVskstar", "AntiLambda p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("LD/tight/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("LD/tight/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("LD/tight/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("LD/tight/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("LD/tight/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("LD/tight/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("LD/tight/fLambdaPtVskstar", "Lambda p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("LD/tight/fAntiLambdaPtVskstar", "AntiLambda p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); // for phid - registry.add("PhiD/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); - registry.add("PhiD/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); - registry.add("PhiD/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registry.add("PhiD/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registry.add("PhiD/fPhiPtVskstar", "Phi p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registry.add("PhiD/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registry.add("PhiD/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registry.add("PhiD/fPhiInvMassVskstar", "#phi mass vs k^{*};M_{K^{+}K^{-}} (GeV/c^{2});k^{*} (GeV/c)", HistType::kTH2F, {Binning.invMassRho, Binning.kstar}); + registryTriggerQA.add("PhiD/all/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("PhiD/all/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("PhiD/all/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("PhiD/all/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("PhiD/all/fPhiPtVskstar", "Phi p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("PhiD/all/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("PhiD/all/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("PhiD/all/fPhiInvMassVskstar", "#phi mass vs k^{*};M_{K^{+}K^{-}} (GeV/c^{2});k^{*} (GeV/c)", HistType::kTH2F, {Binning.invMassRho, Binning.kstar}); + registryTriggerQA.add("PhiD/loose/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("PhiD/loose/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("PhiD/loose/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("PhiD/loose/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("PhiD/loose/fPhiPtVskstar", "Phi p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("PhiD/loose/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("PhiD/loose/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("PhiD/loose/fPhiInvMassVskstar", "#phi mass vs k^{*};M_{K^{+}K^{-}} (GeV/c^{2});k^{*} (GeV/c)", HistType::kTH2F, {Binning.invMassRho, Binning.kstar}); + registryTriggerQA.add("PhiD/tight/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("PhiD/tight/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("PhiD/tight/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("PhiD/tight/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("PhiD/tight/fPhiPtVskstar", "Phi p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("PhiD/tight/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("PhiD/tight/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("PhiD/tight/fPhiInvMassVskstar", "#phi mass vs k^{*};M_{K^{+}K^{-}} (GeV/c^{2});k^{*} (GeV/c)", HistType::kTH2F, {Binning.invMassRho, Binning.kstar}); // for rhod - registry.add("RhoD/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); - registry.add("RhoD/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); - registry.add("RhoD/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registry.add("RhoD/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registry.add("RhoD/fRhoPtVskstar", "Rho p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registry.add("RhoD/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registry.add("RhoD/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registry.add("RhoD/fRhoInvMassVskstar", "#rho mass vs k^{*};M_{#pi^{+}#pi^{-}} (GeV/c^{2});k^{*} (GeV/c)", HistType::kTH2F, {Binning.invMassRho, Binning.kstar}); + registryTriggerQA.add("RhoD/all/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("RhoD/all/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("RhoD/all/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("RhoD/all/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("RhoD/all/fRhoPtVskstar", "Rho p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("RhoD/all/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("RhoD/all/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("RhoD/all/fRhoInvMassVskstar", "#rho mass vs k^{*};M_{#pi^{+}#pi^{-}} (GeV/c^{2});k^{*} (GeV/c)", HistType::kTH2F, {Binning.invMassRho, Binning.kstar}); + registryTriggerQA.add("RhoD/loose/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("RhoD/loose/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("RhoD/loose/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("RhoD/loose/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("RhoD/loose/fRhoPtVskstar", "Rho p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("RhoD/loose/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("RhoD/loose/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("RhoD/loose/fRhoInvMassVskstar", "#rho mass vs k^{*};M_{#pi^{+}#pi^{-}} (GeV/c^{2});k^{*} (GeV/c)", HistType::kTH2F, {Binning.invMassRho, Binning.kstar}); + registryTriggerQA.add("RhoD/tight/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); + registryTriggerQA.add("RhoD/tight/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); + registryTriggerQA.add("RhoD/tight/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("RhoD/tight/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("RhoD/tight/fRhoPtVskstar", "Rho p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("RhoD/tight/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("RhoD/tight/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("RhoD/tight/fRhoInvMassVskstar", "#rho mass vs k^{*};M_{#pi^{+}#pi^{-}} (GeV/c^{2});k^{*} (GeV/c)", HistType::kTH2F, {Binning.invMassRho, Binning.kstar}); } void initCCDB(int run) @@ -904,6 +1059,12 @@ struct CFFilterAll { template bool checkTrack(T const& track, std::string trackName) { + if (track.pt() < TrackSelections.momentum->get(trackName.c_str(), "PtMin")) { + return false; + } + if (track.pt() > TrackSelections.momentum->get(trackName.c_str(), "PtMax")) { + return false; + } if (std::abs(track.eta()) > TrackSelections.trackProperties->get(trackName.c_str(), "AbsEtaMax")) { return false; } @@ -1106,16 +1267,16 @@ struct CFFilterAll { auto tracksWithItsPid = soa::Attach(tracks); - registry.fill(HIST("fProcessedEvents"), 0); - registry.fill(HIST("EventQA/Before/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("EventQA/Before/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("fProcessedEvents"), 0); + registryParticleQA.fill(HIST("EventQA/Before/fMultiplicity"), col.multNTracksPV()); + registryParticleQA.fill(HIST("EventQA/Before/fZvtx"), col.posZ()); if (!checkEvent(col)) { return; } - registry.fill(HIST("EventQA/After/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("EventQA/After/fZvtx"), col.posZ()); + registryParticleQA.fill(HIST("EventQA/After/fMultiplicity"), col.multNTracksPV()); + registryParticleQA.fill(HIST("EventQA/After/fZvtx"), col.posZ()); initCCDB(col.bc().runNumber()); @@ -1155,334 +1316,334 @@ struct CFFilterAll { // get paritcles if (track.sign() > 0) { - registry.fill(HIST("TrackQA/Before/Particle/fPt"), track.pt()); - registry.fill(HIST("TrackQA/Before/Particle/fEta"), track.eta()); - registry.fill(HIST("TrackQA/Before/Particle/fPhi"), track.phi()); - registry.fill(HIST("TrackQA/Before/Particle/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); - registry.fill(HIST("TrackQA/Before/Particle/fItsSignal"), track.p(), itsSignal(track)); - registry.fill(HIST("TrackQA/Before/Particle/fTpcSignal"), track.p(), track.tpcSignal()); - registry.fill(HIST("TrackQA/Before/Particle/fTofSignal"), track.p(), track.beta()); - - registry.fill(HIST("TrackQA/Before/Pion/fNsigmaITS"), track.p(), track.itsNSigmaPi()); - registry.fill(HIST("TrackQA/Before/Pion/fNsigmaTPC"), track.p(), track.tpcNSigmaPi()); - registry.fill(HIST("TrackQA/Before/Pion/fNsigmaTOF"), track.p(), track.tofNSigmaPi()); - registry.fill(HIST("TrackQA/Before/Pion/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPi(), track.tofNSigmaPi())); - - registry.fill(HIST("TrackQA/Before/Kaon/fNsigmaITS"), track.p(), track.itsNSigmaKa()); - registry.fill(HIST("TrackQA/Before/Kaon/fNsigmaTPC"), track.p(), track.tpcNSigmaKa()); - registry.fill(HIST("TrackQA/Before/Kaon/fNsigmaTOF"), track.p(), track.tofNSigmaKa()); - registry.fill(HIST("TrackQA/Before/Kaon/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaKa(), track.tofNSigmaKa())); - - registry.fill(HIST("TrackQA/Before/Proton/fNsigmaITS"), track.p(), track.itsNSigmaPr()); - registry.fill(HIST("TrackQA/Before/Proton/fNsigmaTPC"), track.p(), track.tpcNSigmaPr()); - registry.fill(HIST("TrackQA/Before/Proton/fNsigmaTOF"), track.p(), track.tofNSigmaPr()); - registry.fill(HIST("TrackQA/Before/Proton/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPr(), track.tofNSigmaPr())); - - registry.fill(HIST("TrackQA/Before/Deuteron/fNsigmaITS"), track.p(), track.itsNSigmaDe()); - registry.fill(HIST("TrackQA/Before/Deuteron/fNsigmaTPC"), track.p(), track.tpcNSigmaDe()); - registry.fill(HIST("TrackQA/Before/Deuteron/fNsigmaTOF"), track.p(), track.tofNSigmaDe()); - registry.fill(HIST("TrackQA/Before/Deuteron/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaDe(), track.tofNSigmaDe())); + registryParticleQA.fill(HIST("TrackQA/Before/Particle/fPt"), track.pt()); + registryParticleQA.fill(HIST("TrackQA/Before/Particle/fEta"), track.eta()); + registryParticleQA.fill(HIST("TrackQA/Before/Particle/fPhi"), track.phi()); + registryParticleQA.fill(HIST("TrackQA/Before/Particle/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + registryParticleQA.fill(HIST("TrackQA/Before/Particle/fItsSignal"), track.p(), itsSignal(track)); + registryParticleQA.fill(HIST("TrackQA/Before/Particle/fTpcSignal"), track.p(), track.tpcSignal()); + registryParticleQA.fill(HIST("TrackQA/Before/Particle/fTofSignal"), track.p(), track.beta()); + + registryParticleQA.fill(HIST("TrackQA/Before/Pion/fNsigmaITS"), track.p(), track.itsNSigmaPi()); + registryParticleQA.fill(HIST("TrackQA/Before/Pion/fNsigmaTPC"), track.p(), track.tpcNSigmaPi()); + registryParticleQA.fill(HIST("TrackQA/Before/Pion/fNsigmaTOF"), track.p(), track.tofNSigmaPi()); + registryParticleQA.fill(HIST("TrackQA/Before/Pion/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPi(), track.tofNSigmaPi())); + + registryParticleQA.fill(HIST("TrackQA/Before/Kaon/fNsigmaITS"), track.p(), track.itsNSigmaKa()); + registryParticleQA.fill(HIST("TrackQA/Before/Kaon/fNsigmaTPC"), track.p(), track.tpcNSigmaKa()); + registryParticleQA.fill(HIST("TrackQA/Before/Kaon/fNsigmaTOF"), track.p(), track.tofNSigmaKa()); + registryParticleQA.fill(HIST("TrackQA/Before/Kaon/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaKa(), track.tofNSigmaKa())); + + registryParticleQA.fill(HIST("TrackQA/Before/Proton/fNsigmaITS"), track.p(), track.itsNSigmaPr()); + registryParticleQA.fill(HIST("TrackQA/Before/Proton/fNsigmaTPC"), track.p(), track.tpcNSigmaPr()); + registryParticleQA.fill(HIST("TrackQA/Before/Proton/fNsigmaTOF"), track.p(), track.tofNSigmaPr()); + registryParticleQA.fill(HIST("TrackQA/Before/Proton/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPr(), track.tofNSigmaPr())); + + registryParticleQA.fill(HIST("TrackQA/Before/Deuteron/fNsigmaITS"), track.p(), track.itsNSigmaDe()); + registryParticleQA.fill(HIST("TrackQA/Before/Deuteron/fNsigmaTPC"), track.p(), track.tpcNSigmaDe()); + registryParticleQA.fill(HIST("TrackQA/Before/Deuteron/fNsigmaTOF"), track.p(), track.tofNSigmaDe()); + registryParticleQA.fill(HIST("TrackQA/Before/Deuteron/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaDe(), track.tofNSigmaDe())); if (checkTrack(track, std::string("Pion")) && checkTrackPid(track, std::string("Pion"))) { vecPion.emplace_back(track.pt(), track.eta(), track.phi(), o2::constants::physics::MassPionCharged); idxPion.push_back(track.globalIndex()); - registry.fill(HIST("TrackQA/After/Pion/fPt"), track.pt()); - registry.fill(HIST("TrackQA/After/Pion/fPTpc"), track.tpcInnerParam()); - registry.fill(HIST("TrackQA/After/Pion/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); - registry.fill(HIST("TrackQA/After/Pion/fEta"), track.eta()); - registry.fill(HIST("TrackQA/After/Pion/fPhi"), track.phi()); - - registry.fill(HIST("TrackQA/After/Pion/fNsigmaIts"), track.p(), track.itsNSigmaPi()); - registry.fill(HIST("TrackQA/After/Pion/fNsigmaTpc"), track.p(), track.tpcNSigmaPi()); - registry.fill(HIST("TrackQA/After/Pion/fNsigmaTof"), track.p(), track.tofNSigmaPi()); - registry.fill(HIST("TrackQA/After/Pion/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPi(), track.tofNSigmaPi())); - - registry.fill(HIST("TrackQA/After/Pion/fItsSignal"), track.p(), itsSignal(track)); - registry.fill(HIST("TrackQA/After/Pion/fTpcSignal"), track.p(), track.tpcSignal()); - registry.fill(HIST("TrackQA/After/Pion/fTofBeta"), track.p(), track.beta()); - - registry.fill(HIST("TrackQA/After/Pion/fDcaXy"), track.pt(), track.dcaXY()); - registry.fill(HIST("TrackQA/After/Pion/fDcaZ"), track.pt(), track.dcaZ()); - - registry.fill(HIST("TrackQA/After/Pion/fTpcClusters"), track.tpcNClsFound()); - registry.fill(HIST("TrackQA/After/Pion/fTpcCrossedRows"), track.tpcNClsCrossedRows()); - registry.fill(HIST("TrackQA/After/Pion/fTpcSharedClusters"), track.tpcNClsShared()); - registry.fill(HIST("TrackQA/After/Pion/fTpcSharedClusterOverClusterss"), track.tpcFractionSharedCls()); - registry.fill(HIST("TrackQA/After/Pion/fTpcFindableOverRows"), track.tpcCrossedRowsOverFindableCls()); - registry.fill(HIST("TrackQA/After/Pion/fTpcChi2OverCluster"), track.tpcChi2NCl()); - - registry.fill(HIST("TrackQA/After/Pion/fItsClusters"), track.itsNCls()); - registry.fill(HIST("TrackQA/After/Pion/fItsIbClusters"), track.itsNClsInnerBarrel()); - registry.fill(HIST("TrackQA/After/Pion/fItsChi2OverCluster"), track.itsChi2NCl()); + registryParticleQA.fill(HIST("TrackQA/After/Pion/fPt"), track.pt()); + registryParticleQA.fill(HIST("TrackQA/After/Pion/fPTpc"), track.tpcInnerParam()); + registryParticleQA.fill(HIST("TrackQA/After/Pion/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + registryParticleQA.fill(HIST("TrackQA/After/Pion/fEta"), track.eta()); + registryParticleQA.fill(HIST("TrackQA/After/Pion/fPhi"), track.phi()); + + registryParticleQA.fill(HIST("TrackQA/After/Pion/fNsigmaIts"), track.p(), track.itsNSigmaPi()); + registryParticleQA.fill(HIST("TrackQA/After/Pion/fNsigmaTpc"), track.p(), track.tpcNSigmaPi()); + registryParticleQA.fill(HIST("TrackQA/After/Pion/fNsigmaTof"), track.p(), track.tofNSigmaPi()); + registryParticleQA.fill(HIST("TrackQA/After/Pion/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPi(), track.tofNSigmaPi())); + + registryParticleQA.fill(HIST("TrackQA/After/Pion/fItsSignal"), track.p(), itsSignal(track)); + registryParticleQA.fill(HIST("TrackQA/After/Pion/fTpcSignal"), track.p(), track.tpcSignal()); + registryParticleQA.fill(HIST("TrackQA/After/Pion/fTofBeta"), track.p(), track.beta()); + + registryParticleQA.fill(HIST("TrackQA/After/Pion/fDcaXy"), track.pt(), track.dcaXY()); + registryParticleQA.fill(HIST("TrackQA/After/Pion/fDcaZ"), track.pt(), track.dcaZ()); + + registryParticleQA.fill(HIST("TrackQA/After/Pion/fTpcClusters"), track.tpcNClsFound()); + registryParticleQA.fill(HIST("TrackQA/After/Pion/fTpcCrossedRows"), track.tpcNClsCrossedRows()); + registryParticleQA.fill(HIST("TrackQA/After/Pion/fTpcSharedClusters"), track.tpcNClsShared()); + registryParticleQA.fill(HIST("TrackQA/After/Pion/fTpcSharedClusterOverClusterss"), track.tpcFractionSharedCls()); + registryParticleQA.fill(HIST("TrackQA/After/Pion/fTpcFindableOverRows"), track.tpcCrossedRowsOverFindableCls()); + registryParticleQA.fill(HIST("TrackQA/After/Pion/fTpcChi2OverCluster"), track.tpcChi2NCl()); + + registryParticleQA.fill(HIST("TrackQA/After/Pion/fItsClusters"), track.itsNCls()); + registryParticleQA.fill(HIST("TrackQA/After/Pion/fItsIbClusters"), track.itsNClsInnerBarrel()); + registryParticleQA.fill(HIST("TrackQA/After/Pion/fItsChi2OverCluster"), track.itsChi2NCl()); } if (checkTrack(track, std::string("Kaon")) && checkTrackPid(track, std::string("Kaon"))) { vecKaon.emplace_back(track.pt(), track.eta(), track.phi(), o2::constants::physics::MassKaonCharged); idxKaon.push_back(track.globalIndex()); - registry.fill(HIST("TrackQA/After/Kaon/fPt"), track.pt()); - registry.fill(HIST("TrackQA/After/Kaon/fPTpc"), track.tpcInnerParam()); - registry.fill(HIST("TrackQA/After/Kaon/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); - registry.fill(HIST("TrackQA/After/Kaon/fEta"), track.eta()); - registry.fill(HIST("TrackQA/After/Kaon/fPhi"), track.phi()); - - registry.fill(HIST("TrackQA/After/Kaon/fNsigmaIts"), track.p(), track.itsNSigmaKa()); - registry.fill(HIST("TrackQA/After/Kaon/fNsigmaTpc"), track.p(), track.tpcNSigmaKa()); - registry.fill(HIST("TrackQA/After/Kaon/fNsigmaTof"), track.p(), track.tofNSigmaKa()); - registry.fill(HIST("TrackQA/After/Kaon/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaKa(), track.tofNSigmaKa())); - - registry.fill(HIST("TrackQA/After/Kaon/fItsSignal"), track.p(), itsSignal(track)); - registry.fill(HIST("TrackQA/After/Kaon/fTpcSignal"), track.p(), track.tpcSignal()); - registry.fill(HIST("TrackQA/After/Kaon/fTofBeta"), track.p(), track.beta()); - - registry.fill(HIST("TrackQA/After/Kaon/fDcaXy"), track.pt(), track.dcaXY()); - registry.fill(HIST("TrackQA/After/Kaon/fDcaZ"), track.pt(), track.dcaZ()); - - registry.fill(HIST("TrackQA/After/Kaon/fTpcClusters"), track.tpcNClsFound()); - registry.fill(HIST("TrackQA/After/Kaon/fTpcCrossedRows"), track.tpcNClsCrossedRows()); - registry.fill(HIST("TrackQA/After/Kaon/fTpcSharedClusters"), track.tpcNClsShared()); - registry.fill(HIST("TrackQA/After/Kaon/fTpcSharedClusterOverClusterss"), track.tpcFractionSharedCls()); - registry.fill(HIST("TrackQA/After/Kaon/fTpcFindableOverRows"), track.tpcCrossedRowsOverFindableCls()); - registry.fill(HIST("TrackQA/After/Kaon/fTpcChi2OverCluster"), track.tpcChi2NCl()); - - registry.fill(HIST("TrackQA/After/Kaon/fItsClusters"), track.itsNCls()); - registry.fill(HIST("TrackQA/After/Kaon/fItsIbClusters"), track.itsNClsInnerBarrel()); - registry.fill(HIST("TrackQA/After/Kaon/fItsChi2OverCluster"), track.itsChi2NCl()); + registryParticleQA.fill(HIST("TrackQA/After/Kaon/fPt"), track.pt()); + registryParticleQA.fill(HIST("TrackQA/After/Kaon/fPTpc"), track.tpcInnerParam()); + registryParticleQA.fill(HIST("TrackQA/After/Kaon/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + registryParticleQA.fill(HIST("TrackQA/After/Kaon/fEta"), track.eta()); + registryParticleQA.fill(HIST("TrackQA/After/Kaon/fPhi"), track.phi()); + + registryParticleQA.fill(HIST("TrackQA/After/Kaon/fNsigmaIts"), track.p(), track.itsNSigmaKa()); + registryParticleQA.fill(HIST("TrackQA/After/Kaon/fNsigmaTpc"), track.p(), track.tpcNSigmaKa()); + registryParticleQA.fill(HIST("TrackQA/After/Kaon/fNsigmaTof"), track.p(), track.tofNSigmaKa()); + registryParticleQA.fill(HIST("TrackQA/After/Kaon/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaKa(), track.tofNSigmaKa())); + + registryParticleQA.fill(HIST("TrackQA/After/Kaon/fItsSignal"), track.p(), itsSignal(track)); + registryParticleQA.fill(HIST("TrackQA/After/Kaon/fTpcSignal"), track.p(), track.tpcSignal()); + registryParticleQA.fill(HIST("TrackQA/After/Kaon/fTofBeta"), track.p(), track.beta()); + + registryParticleQA.fill(HIST("TrackQA/After/Kaon/fDcaXy"), track.pt(), track.dcaXY()); + registryParticleQA.fill(HIST("TrackQA/After/Kaon/fDcaZ"), track.pt(), track.dcaZ()); + + registryParticleQA.fill(HIST("TrackQA/After/Kaon/fTpcClusters"), track.tpcNClsFound()); + registryParticleQA.fill(HIST("TrackQA/After/Kaon/fTpcCrossedRows"), track.tpcNClsCrossedRows()); + registryParticleQA.fill(HIST("TrackQA/After/Kaon/fTpcSharedClusters"), track.tpcNClsShared()); + registryParticleQA.fill(HIST("TrackQA/After/Kaon/fTpcSharedClusterOverClusterss"), track.tpcFractionSharedCls()); + registryParticleQA.fill(HIST("TrackQA/After/Kaon/fTpcFindableOverRows"), track.tpcCrossedRowsOverFindableCls()); + registryParticleQA.fill(HIST("TrackQA/After/Kaon/fTpcChi2OverCluster"), track.tpcChi2NCl()); + + registryParticleQA.fill(HIST("TrackQA/After/Kaon/fItsClusters"), track.itsNCls()); + registryParticleQA.fill(HIST("TrackQA/After/Kaon/fItsIbClusters"), track.itsNClsInnerBarrel()); + registryParticleQA.fill(HIST("TrackQA/After/Kaon/fItsChi2OverCluster"), track.itsChi2NCl()); } if (checkTrack(track, std::string("Proton")) && checkTrackPid(track, std::string("Proton"))) { vecProton.emplace_back(track.pt(), track.eta(), track.phi(), o2::constants::physics::MassProton); idxProton.push_back(track.globalIndex()); - registry.fill(HIST("TrackQA/After/Proton/fPt"), track.pt()); - registry.fill(HIST("TrackQA/After/Proton/fPTpc"), track.tpcInnerParam()); - registry.fill(HIST("TrackQA/After/Proton/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); - registry.fill(HIST("TrackQA/After/Proton/fEta"), track.eta()); - registry.fill(HIST("TrackQA/After/Proton/fPhi"), track.phi()); - - registry.fill(HIST("TrackQA/After/Proton/fNsigmaIts"), track.p(), track.itsNSigmaPr()); - registry.fill(HIST("TrackQA/After/Proton/fNsigmaTpc"), track.p(), track.tpcNSigmaPr()); - registry.fill(HIST("TrackQA/After/Proton/fNsigmaTof"), track.p(), track.tofNSigmaPr()); - registry.fill(HIST("TrackQA/After/Proton/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPr(), track.tofNSigmaPr())); - - registry.fill(HIST("TrackQA/After/Proton/fItsSignal"), track.p(), itsSignal(track)); - registry.fill(HIST("TrackQA/After/Proton/fTpcSignal"), track.p(), track.tpcSignal()); - registry.fill(HIST("TrackQA/After/Proton/fTofBeta"), track.p(), track.beta()); - - registry.fill(HIST("TrackQA/After/Proton/fDcaXy"), track.pt(), track.dcaXY()); - registry.fill(HIST("TrackQA/After/Proton/fDcaZ"), track.pt(), track.dcaZ()); - - registry.fill(HIST("TrackQA/After/Proton/fTpcClusters"), track.tpcNClsFound()); - registry.fill(HIST("TrackQA/After/Proton/fTpcCrossedRows"), track.tpcNClsCrossedRows()); - registry.fill(HIST("TrackQA/After/Proton/fTpcSharedClusters"), track.tpcNClsShared()); - registry.fill(HIST("TrackQA/After/Proton/fTpcSharedClusterOverClusterss"), track.tpcFractionSharedCls()); - registry.fill(HIST("TrackQA/After/Proton/fTpcFindableOverRows"), track.tpcCrossedRowsOverFindableCls()); - registry.fill(HIST("TrackQA/After/Proton/fTpcChi2OverCluster"), track.tpcChi2NCl()); - - registry.fill(HIST("TrackQA/After/Proton/fItsClusters"), track.itsNCls()); - registry.fill(HIST("TrackQA/After/Proton/fItsIbClusters"), track.itsNClsInnerBarrel()); - registry.fill(HIST("TrackQA/After/Proton/fItsChi2OverCluster"), track.itsChi2NCl()); + registryParticleQA.fill(HIST("TrackQA/After/Proton/fPt"), track.pt()); + registryParticleQA.fill(HIST("TrackQA/After/Proton/fPTpc"), track.tpcInnerParam()); + registryParticleQA.fill(HIST("TrackQA/After/Proton/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + registryParticleQA.fill(HIST("TrackQA/After/Proton/fEta"), track.eta()); + registryParticleQA.fill(HIST("TrackQA/After/Proton/fPhi"), track.phi()); + + registryParticleQA.fill(HIST("TrackQA/After/Proton/fNsigmaIts"), track.p(), track.itsNSigmaPr()); + registryParticleQA.fill(HIST("TrackQA/After/Proton/fNsigmaTpc"), track.p(), track.tpcNSigmaPr()); + registryParticleQA.fill(HIST("TrackQA/After/Proton/fNsigmaTof"), track.p(), track.tofNSigmaPr()); + registryParticleQA.fill(HIST("TrackQA/After/Proton/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPr(), track.tofNSigmaPr())); + + registryParticleQA.fill(HIST("TrackQA/After/Proton/fItsSignal"), track.p(), itsSignal(track)); + registryParticleQA.fill(HIST("TrackQA/After/Proton/fTpcSignal"), track.p(), track.tpcSignal()); + registryParticleQA.fill(HIST("TrackQA/After/Proton/fTofBeta"), track.p(), track.beta()); + + registryParticleQA.fill(HIST("TrackQA/After/Proton/fDcaXy"), track.pt(), track.dcaXY()); + registryParticleQA.fill(HIST("TrackQA/After/Proton/fDcaZ"), track.pt(), track.dcaZ()); + + registryParticleQA.fill(HIST("TrackQA/After/Proton/fTpcClusters"), track.tpcNClsFound()); + registryParticleQA.fill(HIST("TrackQA/After/Proton/fTpcCrossedRows"), track.tpcNClsCrossedRows()); + registryParticleQA.fill(HIST("TrackQA/After/Proton/fTpcSharedClusters"), track.tpcNClsShared()); + registryParticleQA.fill(HIST("TrackQA/After/Proton/fTpcSharedClusterOverClusterss"), track.tpcFractionSharedCls()); + registryParticleQA.fill(HIST("TrackQA/After/Proton/fTpcFindableOverRows"), track.tpcCrossedRowsOverFindableCls()); + registryParticleQA.fill(HIST("TrackQA/After/Proton/fTpcChi2OverCluster"), track.tpcChi2NCl()); + + registryParticleQA.fill(HIST("TrackQA/After/Proton/fItsClusters"), track.itsNCls()); + registryParticleQA.fill(HIST("TrackQA/After/Proton/fItsIbClusters"), track.itsNClsInnerBarrel()); + registryParticleQA.fill(HIST("TrackQA/After/Proton/fItsChi2OverCluster"), track.itsChi2NCl()); } if (checkTrack(track, std::string("Deuteron")) && checkTrackPid(track, std::string("Deuteron"))) { vecDeuteron.emplace_back(track.pt(), track.eta(), track.phi(), o2::constants::physics::MassDeuteron); idxDeuteron.push_back(track.globalIndex()); - registry.fill(HIST("TrackQA/After/Deuteron/fPt"), track.pt()); - registry.fill(HIST("TrackQA/After/Deuteron/fPTpc"), track.tpcInnerParam()); - registry.fill(HIST("TrackQA/After/Deuteron/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); - registry.fill(HIST("TrackQA/After/Deuteron/fEta"), track.eta()); - registry.fill(HIST("TrackQA/After/Deuteron/fPhi"), track.phi()); - - registry.fill(HIST("TrackQA/After/Deuteron/fNsigmaIts"), track.p(), track.itsNSigmaDe()); - registry.fill(HIST("TrackQA/After/Deuteron/fNsigmaTpc"), track.p(), track.tpcNSigmaDe()); - registry.fill(HIST("TrackQA/After/Deuteron/fNsigmaTof"), track.p(), track.tofNSigmaDe()); - registry.fill(HIST("TrackQA/After/Deuteron/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaDe(), track.tofNSigmaDe())); - - registry.fill(HIST("TrackQA/After/Deuteron/fItsSignal"), track.p(), itsSignal(track)); - registry.fill(HIST("TrackQA/After/Deuteron/fTpcSignal"), track.p(), track.tpcSignal()); - registry.fill(HIST("TrackQA/After/Deuteron/fTofBeta"), track.p(), track.beta()); - - registry.fill(HIST("TrackQA/After/Deuteron/fDcaXy"), track.pt(), track.dcaXY()); - registry.fill(HIST("TrackQA/After/Deuteron/fDcaZ"), track.pt(), track.dcaZ()); - - registry.fill(HIST("TrackQA/After/Deuteron/fTpcClusters"), track.tpcNClsFound()); - registry.fill(HIST("TrackQA/After/Deuteron/fTpcCrossedRows"), track.tpcNClsCrossedRows()); - registry.fill(HIST("TrackQA/After/Deuteron/fTpcSharedClusters"), track.tpcNClsShared()); - registry.fill(HIST("TrackQA/After/Deuteron/fTpcSharedClusterOverClusterss"), track.tpcFractionSharedCls()); - registry.fill(HIST("TrackQA/After/Deuteron/fTpcFindableOverRows"), track.tpcCrossedRowsOverFindableCls()); - registry.fill(HIST("TrackQA/After/Deuteron/fTpcChi2OverCluster"), track.tpcChi2NCl()); - - registry.fill(HIST("TrackQA/After/Deuteron/fItsClusters"), track.itsNCls()); - registry.fill(HIST("TrackQA/After/Deuteron/fItsIbClusters"), track.itsNClsInnerBarrel()); - registry.fill(HIST("TrackQA/After/Deuteron/fItsChi2OverCluster"), track.itsChi2NCl()); + registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fPt"), track.pt()); + registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fPTpc"), track.tpcInnerParam()); + registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fEta"), track.eta()); + registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fPhi"), track.phi()); + + registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fNsigmaIts"), track.p(), track.itsNSigmaDe()); + registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fNsigmaTpc"), track.p(), track.tpcNSigmaDe()); + registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fNsigmaTof"), track.p(), track.tofNSigmaDe()); + registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaDe(), track.tofNSigmaDe())); + + registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fItsSignal"), track.p(), itsSignal(track)); + registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fTpcSignal"), track.p(), track.tpcSignal()); + registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fTofBeta"), track.p(), track.beta()); + + registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fDcaXy"), track.pt(), track.dcaXY()); + registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fDcaZ"), track.pt(), track.dcaZ()); + + registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fTpcClusters"), track.tpcNClsFound()); + registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fTpcCrossedRows"), track.tpcNClsCrossedRows()); + registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fTpcSharedClusters"), track.tpcNClsShared()); + registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fTpcSharedClusterOverClusterss"), track.tpcFractionSharedCls()); + registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fTpcFindableOverRows"), track.tpcCrossedRowsOverFindableCls()); + registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fTpcChi2OverCluster"), track.tpcChi2NCl()); + + registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fItsClusters"), track.itsNCls()); + registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fItsIbClusters"), track.itsNClsInnerBarrel()); + registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fItsChi2OverCluster"), track.itsChi2NCl()); } } if (track.sign() < 0) { - registry.fill(HIST("TrackQA/Before/AntiParticle/fPt"), track.pt()); - registry.fill(HIST("TrackQA/Before/AntiParticle/fEta"), track.eta()); - registry.fill(HIST("TrackQA/Before/AntiParticle/fPhi"), track.phi()); - registry.fill(HIST("TrackQA/Before/AntiParticle/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); - registry.fill(HIST("TrackQA/Before/AntiParticle/fItsSignal"), track.p(), itsSignal(track)); - registry.fill(HIST("TrackQA/Before/AntiParticle/fTpcSignal"), track.p(), track.tpcSignal()); - registry.fill(HIST("TrackQA/Before/AntiParticle/fTofSignal"), track.p(), track.beta()); - - registry.fill(HIST("TrackQA/Before/AntiPion/fNsigmaITS"), track.p(), track.itsNSigmaPi()); - registry.fill(HIST("TrackQA/Before/AntiPion/fNsigmaTPC"), track.p(), track.tpcNSigmaPi()); - registry.fill(HIST("TrackQA/Before/AntiPion/fNsigmaTOF"), track.p(), track.tofNSigmaPi()); - registry.fill(HIST("TrackQA/Before/AntiPion/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPi(), track.tofNSigmaPi())); - - registry.fill(HIST("TrackQA/Before/AntiKaon/fNsigmaITS"), track.p(), track.itsNSigmaKa()); - registry.fill(HIST("TrackQA/Before/AntiKaon/fNsigmaTPC"), track.p(), track.tpcNSigmaKa()); - registry.fill(HIST("TrackQA/Before/AntiKaon/fNsigmaTOF"), track.p(), track.tofNSigmaKa()); - registry.fill(HIST("TrackQA/Before/AntiKaon/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaKa(), track.tofNSigmaKa())); - - registry.fill(HIST("TrackQA/Before/AntiProton/fNsigmaITS"), track.p(), track.itsNSigmaPr()); - registry.fill(HIST("TrackQA/Before/AntiProton/fNsigmaTPC"), track.p(), track.tpcNSigmaPr()); - registry.fill(HIST("TrackQA/Before/AntiProton/fNsigmaTOF"), track.p(), track.tofNSigmaPr()); - registry.fill(HIST("TrackQA/Before/AntiProton/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPr(), track.tofNSigmaPr())); - - registry.fill(HIST("TrackQA/Before/AntiDeuteron/fNsigmaITS"), track.p(), track.itsNSigmaDe()); - registry.fill(HIST("TrackQA/Before/AntiDeuteron/fNsigmaTPC"), track.p(), track.tpcNSigmaDe()); - registry.fill(HIST("TrackQA/Before/AntiDeuteron/fNsigmaTOF"), track.p(), track.tofNSigmaDe()); - registry.fill(HIST("TrackQA/Before/AntiDeuteron/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaDe(), track.tofNSigmaDe())); + registryParticleQA.fill(HIST("TrackQA/Before/AntiParticle/fPt"), track.pt()); + registryParticleQA.fill(HIST("TrackQA/Before/AntiParticle/fEta"), track.eta()); + registryParticleQA.fill(HIST("TrackQA/Before/AntiParticle/fPhi"), track.phi()); + registryParticleQA.fill(HIST("TrackQA/Before/AntiParticle/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + registryParticleQA.fill(HIST("TrackQA/Before/AntiParticle/fItsSignal"), track.p(), itsSignal(track)); + registryParticleQA.fill(HIST("TrackQA/Before/AntiParticle/fTpcSignal"), track.p(), track.tpcSignal()); + registryParticleQA.fill(HIST("TrackQA/Before/AntiParticle/fTofSignal"), track.p(), track.beta()); + + registryParticleQA.fill(HIST("TrackQA/Before/AntiPion/fNsigmaITS"), track.p(), track.itsNSigmaPi()); + registryParticleQA.fill(HIST("TrackQA/Before/AntiPion/fNsigmaTPC"), track.p(), track.tpcNSigmaPi()); + registryParticleQA.fill(HIST("TrackQA/Before/AntiPion/fNsigmaTOF"), track.p(), track.tofNSigmaPi()); + registryParticleQA.fill(HIST("TrackQA/Before/AntiPion/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPi(), track.tofNSigmaPi())); + + registryParticleQA.fill(HIST("TrackQA/Before/AntiKaon/fNsigmaITS"), track.p(), track.itsNSigmaKa()); + registryParticleQA.fill(HIST("TrackQA/Before/AntiKaon/fNsigmaTPC"), track.p(), track.tpcNSigmaKa()); + registryParticleQA.fill(HIST("TrackQA/Before/AntiKaon/fNsigmaTOF"), track.p(), track.tofNSigmaKa()); + registryParticleQA.fill(HIST("TrackQA/Before/AntiKaon/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaKa(), track.tofNSigmaKa())); + + registryParticleQA.fill(HIST("TrackQA/Before/AntiProton/fNsigmaITS"), track.p(), track.itsNSigmaPr()); + registryParticleQA.fill(HIST("TrackQA/Before/AntiProton/fNsigmaTPC"), track.p(), track.tpcNSigmaPr()); + registryParticleQA.fill(HIST("TrackQA/Before/AntiProton/fNsigmaTOF"), track.p(), track.tofNSigmaPr()); + registryParticleQA.fill(HIST("TrackQA/Before/AntiProton/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPr(), track.tofNSigmaPr())); + + registryParticleQA.fill(HIST("TrackQA/Before/AntiDeuteron/fNsigmaITS"), track.p(), track.itsNSigmaDe()); + registryParticleQA.fill(HIST("TrackQA/Before/AntiDeuteron/fNsigmaTPC"), track.p(), track.tpcNSigmaDe()); + registryParticleQA.fill(HIST("TrackQA/Before/AntiDeuteron/fNsigmaTOF"), track.p(), track.tofNSigmaDe()); + registryParticleQA.fill(HIST("TrackQA/Before/AntiDeuteron/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaDe(), track.tofNSigmaDe())); if (checkTrack(track, std::string("Pion")) && checkTrackPid(track, std::string("Pion"))) { vecAntiPion.emplace_back(track.pt(), track.eta(), track.phi(), o2::constants::physics::MassPionCharged); idxAntiPion.push_back(track.globalIndex()); - registry.fill(HIST("TrackQA/After/AntiPion/fPt"), track.pt()); - registry.fill(HIST("TrackQA/After/AntiPion/fPTpc"), track.tpcInnerParam()); - registry.fill(HIST("TrackQA/After/AntiPion/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); - registry.fill(HIST("TrackQA/After/AntiPion/fEta"), track.eta()); - registry.fill(HIST("TrackQA/After/AntiPion/fPhi"), track.phi()); - - registry.fill(HIST("TrackQA/After/AntiPion/fNsigmaIts"), track.p(), track.itsNSigmaPi()); - registry.fill(HIST("TrackQA/After/AntiPion/fNsigmaTpc"), track.p(), track.tpcNSigmaPi()); - registry.fill(HIST("TrackQA/After/AntiPion/fNsigmaTof"), track.p(), track.tofNSigmaPi()); - registry.fill(HIST("TrackQA/After/AntiPion/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPi(), track.tofNSigmaPi())); - - registry.fill(HIST("TrackQA/After/AntiPion/fItsSignal"), track.p(), itsSignal(track)); - registry.fill(HIST("TrackQA/After/AntiPion/fTpcSignal"), track.p(), track.tpcSignal()); - registry.fill(HIST("TrackQA/After/AntiPion/fTofBeta"), track.p(), track.beta()); - - registry.fill(HIST("TrackQA/After/AntiPion/fDcaXy"), track.pt(), track.dcaXY()); - registry.fill(HIST("TrackQA/After/AntiPion/fDcaZ"), track.pt(), track.dcaZ()); - - registry.fill(HIST("TrackQA/After/AntiPion/fTpcClusters"), track.tpcNClsFound()); - registry.fill(HIST("TrackQA/After/AntiPion/fTpcCrossedRows"), track.tpcNClsCrossedRows()); - registry.fill(HIST("TrackQA/After/AntiPion/fTpcSharedClusters"), track.tpcNClsShared()); - registry.fill(HIST("TrackQA/After/AntiPion/fTpcSharedClusterOverClusterss"), track.tpcFractionSharedCls()); - registry.fill(HIST("TrackQA/After/AntiPion/fTpcFindableOverRows"), track.tpcCrossedRowsOverFindableCls()); - registry.fill(HIST("TrackQA/After/AntiPion/fTpcChi2OverCluster"), track.tpcChi2NCl()); - - registry.fill(HIST("TrackQA/After/AntiPion/fItsClusters"), track.itsNCls()); - registry.fill(HIST("TrackQA/After/AntiPion/fItsIbClusters"), track.itsNClsInnerBarrel()); - registry.fill(HIST("TrackQA/After/AntiPion/fItsChi2OverCluster"), track.itsChi2NCl()); + registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fPt"), track.pt()); + registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fPTpc"), track.tpcInnerParam()); + registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fEta"), track.eta()); + registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fPhi"), track.phi()); + + registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fNsigmaIts"), track.p(), track.itsNSigmaPi()); + registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fNsigmaTpc"), track.p(), track.tpcNSigmaPi()); + registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fNsigmaTof"), track.p(), track.tofNSigmaPi()); + registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPi(), track.tofNSigmaPi())); + + registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fItsSignal"), track.p(), itsSignal(track)); + registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fTpcSignal"), track.p(), track.tpcSignal()); + registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fTofBeta"), track.p(), track.beta()); + + registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fDcaXy"), track.pt(), track.dcaXY()); + registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fDcaZ"), track.pt(), track.dcaZ()); + + registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fTpcClusters"), track.tpcNClsFound()); + registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fTpcCrossedRows"), track.tpcNClsCrossedRows()); + registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fTpcSharedClusters"), track.tpcNClsShared()); + registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fTpcSharedClusterOverClusterss"), track.tpcFractionSharedCls()); + registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fTpcFindableOverRows"), track.tpcCrossedRowsOverFindableCls()); + registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fTpcChi2OverCluster"), track.tpcChi2NCl()); + + registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fItsClusters"), track.itsNCls()); + registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fItsIbClusters"), track.itsNClsInnerBarrel()); + registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fItsChi2OverCluster"), track.itsChi2NCl()); } if (checkTrack(track, std::string("Kaon")) && checkTrackPid(track, std::string("Kaon"))) { vecAntiKaon.emplace_back(track.pt(), track.eta(), track.phi(), o2::constants::physics::MassKaonCharged); idxAntiKaon.push_back(track.globalIndex()); - registry.fill(HIST("TrackQA/After/AntiKaon/fPt"), track.pt()); - registry.fill(HIST("TrackQA/After/AntiKaon/fPTpc"), track.tpcInnerParam()); - registry.fill(HIST("TrackQA/After/AntiKaon/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); - registry.fill(HIST("TrackQA/After/AntiKaon/fEta"), track.eta()); - registry.fill(HIST("TrackQA/After/AntiKaon/fPhi"), track.phi()); - - registry.fill(HIST("TrackQA/After/AntiKaon/fNsigmaIts"), track.p(), track.itsNSigmaKa()); - registry.fill(HIST("TrackQA/After/AntiKaon/fNsigmaTpc"), track.p(), track.tpcNSigmaKa()); - registry.fill(HIST("TrackQA/After/AntiKaon/fNsigmaTof"), track.p(), track.tofNSigmaKa()); - registry.fill(HIST("TrackQA/After/AntiKaon/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaKa(), track.tofNSigmaKa())); - - registry.fill(HIST("TrackQA/After/AntiKaon/fItsSignal"), track.p(), itsSignal(track)); - registry.fill(HIST("TrackQA/After/AntiKaon/fTpcSignal"), track.p(), track.tpcSignal()); - registry.fill(HIST("TrackQA/After/AntiKaon/fTofBeta"), track.p(), track.beta()); - - registry.fill(HIST("TrackQA/After/AntiKaon/fDcaXy"), track.pt(), track.dcaXY()); - registry.fill(HIST("TrackQA/After/AntiKaon/fDcaZ"), track.pt(), track.dcaZ()); - - registry.fill(HIST("TrackQA/After/AntiKaon/fTpcClusters"), track.tpcNClsFound()); - registry.fill(HIST("TrackQA/After/AntiKaon/fTpcCrossedRows"), track.tpcNClsCrossedRows()); - registry.fill(HIST("TrackQA/After/AntiKaon/fTpcSharedClusters"), track.tpcNClsShared()); - registry.fill(HIST("TrackQA/After/AntiKaon/fTpcSharedClusterOverClusterss"), track.tpcFractionSharedCls()); - registry.fill(HIST("TrackQA/After/AntiKaon/fTpcFindableOverRows"), track.tpcCrossedRowsOverFindableCls()); - registry.fill(HIST("TrackQA/After/AntiKaon/fTpcChi2OverCluster"), track.tpcChi2NCl()); - - registry.fill(HIST("TrackQA/After/AntiKaon/fItsClusters"), track.itsNCls()); - registry.fill(HIST("TrackQA/After/AntiKaon/fItsIbClusters"), track.itsNClsInnerBarrel()); - registry.fill(HIST("TrackQA/After/AntiKaon/fItsChi2OverCluster"), track.itsChi2NCl()); + registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fPt"), track.pt()); + registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fPTpc"), track.tpcInnerParam()); + registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fEta"), track.eta()); + registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fPhi"), track.phi()); + + registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fNsigmaIts"), track.p(), track.itsNSigmaKa()); + registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fNsigmaTpc"), track.p(), track.tpcNSigmaKa()); + registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fNsigmaTof"), track.p(), track.tofNSigmaKa()); + registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaKa(), track.tofNSigmaKa())); + + registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fItsSignal"), track.p(), itsSignal(track)); + registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fTpcSignal"), track.p(), track.tpcSignal()); + registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fTofBeta"), track.p(), track.beta()); + + registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fDcaXy"), track.pt(), track.dcaXY()); + registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fDcaZ"), track.pt(), track.dcaZ()); + + registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fTpcClusters"), track.tpcNClsFound()); + registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fTpcCrossedRows"), track.tpcNClsCrossedRows()); + registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fTpcSharedClusters"), track.tpcNClsShared()); + registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fTpcSharedClusterOverClusterss"), track.tpcFractionSharedCls()); + registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fTpcFindableOverRows"), track.tpcCrossedRowsOverFindableCls()); + registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fTpcChi2OverCluster"), track.tpcChi2NCl()); + + registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fItsClusters"), track.itsNCls()); + registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fItsIbClusters"), track.itsNClsInnerBarrel()); + registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fItsChi2OverCluster"), track.itsChi2NCl()); } if (checkTrack(track, std::string("Proton")) && checkTrackPid(track, std::string("Proton"))) { vecAntiProton.emplace_back(track.pt(), track.eta(), track.phi(), o2::constants::physics::MassProton); idxAntiProton.push_back(track.globalIndex()); - registry.fill(HIST("TrackQA/After/AntiProton/fPt"), track.pt()); - registry.fill(HIST("TrackQA/After/AntiProton/fPTpc"), track.tpcInnerParam()); - registry.fill(HIST("TrackQA/After/AntiProton/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); - registry.fill(HIST("TrackQA/After/AntiProton/fEta"), track.eta()); - registry.fill(HIST("TrackQA/After/AntiProton/fPhi"), track.phi()); - - registry.fill(HIST("TrackQA/After/AntiProton/fNsigmaIts"), track.p(), track.itsNSigmaPr()); - registry.fill(HIST("TrackQA/After/AntiProton/fNsigmaTpc"), track.p(), track.tpcNSigmaPr()); - registry.fill(HIST("TrackQA/After/AntiProton/fNsigmaTof"), track.p(), track.tofNSigmaPr()); - registry.fill(HIST("TrackQA/After/AntiProton/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPr(), track.tofNSigmaPr())); - - registry.fill(HIST("TrackQA/After/AntiProton/fItsSignal"), track.p(), itsSignal(track)); - registry.fill(HIST("TrackQA/After/AntiProton/fTpcSignal"), track.p(), track.tpcSignal()); - registry.fill(HIST("TrackQA/After/AntiProton/fTofBeta"), track.p(), track.beta()); - - registry.fill(HIST("TrackQA/After/AntiProton/fDcaXy"), track.pt(), track.dcaXY()); - registry.fill(HIST("TrackQA/After/AntiProton/fDcaZ"), track.pt(), track.dcaZ()); - - registry.fill(HIST("TrackQA/After/AntiProton/fTpcClusters"), track.tpcNClsFound()); - registry.fill(HIST("TrackQA/After/AntiProton/fTpcCrossedRows"), track.tpcNClsCrossedRows()); - registry.fill(HIST("TrackQA/After/AntiProton/fTpcSharedClusters"), track.tpcNClsShared()); - registry.fill(HIST("TrackQA/After/AntiProton/fTpcSharedClusterOverClusterss"), track.tpcFractionSharedCls()); - registry.fill(HIST("TrackQA/After/AntiProton/fTpcFindableOverRows"), track.tpcCrossedRowsOverFindableCls()); - registry.fill(HIST("TrackQA/After/AntiProton/fTpcChi2OverCluster"), track.tpcChi2NCl()); - - registry.fill(HIST("TrackQA/After/AntiProton/fItsClusters"), track.itsNCls()); - registry.fill(HIST("TrackQA/After/AntiProton/fItsIbClusters"), track.itsNClsInnerBarrel()); - registry.fill(HIST("TrackQA/After/AntiProton/fItsChi2OverCluster"), track.itsChi2NCl()); + registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fPt"), track.pt()); + registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fPTpc"), track.tpcInnerParam()); + registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fEta"), track.eta()); + registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fPhi"), track.phi()); + + registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fNsigmaIts"), track.p(), track.itsNSigmaPr()); + registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fNsigmaTpc"), track.p(), track.tpcNSigmaPr()); + registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fNsigmaTof"), track.p(), track.tofNSigmaPr()); + registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPr(), track.tofNSigmaPr())); + + registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fItsSignal"), track.p(), itsSignal(track)); + registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fTpcSignal"), track.p(), track.tpcSignal()); + registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fTofBeta"), track.p(), track.beta()); + + registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fDcaXy"), track.pt(), track.dcaXY()); + registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fDcaZ"), track.pt(), track.dcaZ()); + + registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fTpcClusters"), track.tpcNClsFound()); + registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fTpcCrossedRows"), track.tpcNClsCrossedRows()); + registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fTpcSharedClusters"), track.tpcNClsShared()); + registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fTpcSharedClusterOverClusterss"), track.tpcFractionSharedCls()); + registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fTpcFindableOverRows"), track.tpcCrossedRowsOverFindableCls()); + registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fTpcChi2OverCluster"), track.tpcChi2NCl()); + + registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fItsClusters"), track.itsNCls()); + registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fItsIbClusters"), track.itsNClsInnerBarrel()); + registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fItsChi2OverCluster"), track.itsChi2NCl()); } if (checkTrack(track, std::string("Deuteron")) && checkTrackPid(track, std::string("Deuteron"))) { vecAntiDeuteron.emplace_back(track.pt(), track.eta(), track.phi(), o2::constants::physics::MassDeuteron); idxAntiDeuteron.push_back(track.globalIndex()); - registry.fill(HIST("TrackQA/After/AntiDeuteron/fPt"), track.pt()); - registry.fill(HIST("TrackQA/After/AntiDeuteron/fPTpc"), track.tpcInnerParam()); - registry.fill(HIST("TrackQA/After/AntiDeuteron/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); - registry.fill(HIST("TrackQA/After/AntiDeuteron/fEta"), track.eta()); - registry.fill(HIST("TrackQA/After/AntiDeuteron/fPhi"), track.phi()); - - registry.fill(HIST("TrackQA/After/AntiDeuteron/fNsigmaIts"), track.p(), track.itsNSigmaDe()); - registry.fill(HIST("TrackQA/After/AntiDeuteron/fNsigmaTpc"), track.p(), track.tpcNSigmaDe()); - registry.fill(HIST("TrackQA/After/AntiDeuteron/fNsigmaTof"), track.p(), track.tofNSigmaDe()); - registry.fill(HIST("TrackQA/After/AntiDeuteron/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaDe(), track.tofNSigmaDe())); - - registry.fill(HIST("TrackQA/After/AntiDeuteron/fItsSignal"), track.p(), itsSignal(track)); - registry.fill(HIST("TrackQA/After/AntiDeuteron/fTpcSignal"), track.p(), track.tpcSignal()); - registry.fill(HIST("TrackQA/After/AntiDeuteron/fTofBeta"), track.p(), track.beta()); - - registry.fill(HIST("TrackQA/After/AntiDeuteron/fDcaXy"), track.pt(), track.dcaXY()); - registry.fill(HIST("TrackQA/After/AntiDeuteron/fDcaZ"), track.pt(), track.dcaZ()); - - registry.fill(HIST("TrackQA/After/AntiDeuteron/fTpcClusters"), track.tpcNClsFound()); - registry.fill(HIST("TrackQA/After/AntiDeuteron/fTpcCrossedRows"), track.tpcNClsCrossedRows()); - registry.fill(HIST("TrackQA/After/AntiDeuteron/fTpcSharedClusters"), track.tpcNClsShared()); - registry.fill(HIST("TrackQA/After/AntiDeuteron/fTpcSharedClusterOverClusterss"), track.tpcFractionSharedCls()); - registry.fill(HIST("TrackQA/After/AntiDeuteron/fTpcFindableOverRows"), track.tpcCrossedRowsOverFindableCls()); - registry.fill(HIST("TrackQA/After/AntiDeuteron/fTpcChi2OverCluster"), track.tpcChi2NCl()); - - registry.fill(HIST("TrackQA/After/AntiDeuteron/fItsClusters"), track.itsNCls()); - registry.fill(HIST("TrackQA/After/AntiDeuteron/fItsIbClusters"), track.itsNClsInnerBarrel()); - registry.fill(HIST("TrackQA/After/AntiDeuteron/fItsChi2OverCluster"), track.itsChi2NCl()); + registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fPt"), track.pt()); + registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fPTpc"), track.tpcInnerParam()); + registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fMomCor"), track.p(), (track.tpcInnerParam() - track.p()) / track.p()); + registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fEta"), track.eta()); + registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fPhi"), track.phi()); + + registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fNsigmaIts"), track.p(), track.itsNSigmaDe()); + registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fNsigmaTpc"), track.p(), track.tpcNSigmaDe()); + registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fNsigmaTof"), track.p(), track.tofNSigmaDe()); + registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaDe(), track.tofNSigmaDe())); + + registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fItsSignal"), track.p(), itsSignal(track)); + registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fTpcSignal"), track.p(), track.tpcSignal()); + registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fTofBeta"), track.p(), track.beta()); + + registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fDcaXy"), track.pt(), track.dcaXY()); + registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fDcaZ"), track.pt(), track.dcaZ()); + + registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fTpcClusters"), track.tpcNClsFound()); + registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fTpcCrossedRows"), track.tpcNClsCrossedRows()); + registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fTpcSharedClusters"), track.tpcNClsShared()); + registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fTpcSharedClusterOverClusterss"), track.tpcFractionSharedCls()); + registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fTpcFindableOverRows"), track.tpcCrossedRowsOverFindableCls()); + registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fTpcChi2OverCluster"), track.tpcChi2NCl()); + + registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fItsClusters"), track.itsNCls()); + registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fItsIbClusters"), track.itsNClsInnerBarrel()); + registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fItsChi2OverCluster"), track.itsChi2NCl()); } } } @@ -1516,64 +1677,64 @@ struct CFFilterAll { float negTrackEta = RecoDecay::eta(std::array{mStraHelper.v0.negativeMomentum[0], mStraHelper.v0.negativeMomentum[1], mStraHelper.v0.negativeMomentum[2]}); float negTrackDca = mStraHelper.v0.negativeDCAxy; - registry.fill(HIST("LambdaQA/Before/fPt"), lambdaPt); - registry.fill(HIST("LambdaQA/Before/fEta"), lambdaEta); - registry.fill(HIST("LambdaQA/Before/fPhi"), lambdaPhi); - registry.fill(HIST("LambdaQA/Before/fInvMassLambda"), lambdaMass); - registry.fill(HIST("LambdaQA/Before/fInvMassAntiLambda"), antiLambdaMass); - registry.fill(HIST("LambdaQA/Before/fInvMassLambdaVsAntiLambda"), lambdaMass, antiLambdaMass); - registry.fill(HIST("LambdaQA/Before/fInvMassLambdaVsKaon"), lambdaMass, kaonMass); - registry.fill(HIST("LambdaQA/Before/fInvMassAntiLambdaVsKaon"), antiLambdaMass, kaonMass); - registry.fill(HIST("LambdaQA/Before/fDcaDaugh"), lambdaDauDca); - registry.fill(HIST("LambdaQA/Before/fCpa"), lambdaCpa); - registry.fill(HIST("LambdaQA/Before/fTranRad"), lambdaRadius); - registry.fill(HIST("LambdaQA/Before/fDecVtx"), lambdaPos); - - registry.fill(HIST("LambdaQA/Before/PosDaughter/fPt"), posTrack.pt()); - registry.fill(HIST("LambdaQA/Before/PosDaughter/fEta"), posTrackEta); - registry.fill(HIST("LambdaQA/Before/PosDaughter/fPhi"), posTrack.phi()); - registry.fill(HIST("LambdaQA/Before/PosDaughter/fDcaXy"), posTrack.pt(), posTrackDca); - registry.fill(HIST("LambdaQA/Before/PosDaughter/fTpcClusters"), posTrack.tpcNClsFound()); - registry.fill(HIST("LambdaQA/Before/PosDaughter/fNsigmaTpcProton"), posTrack.p(), posTrack.tpcNSigmaPr()); - registry.fill(HIST("LambdaQA/Before/PosDaughter/fNsigmaTpcPion"), posTrack.p(), posTrack.tpcNSigmaPi()); - - registry.fill(HIST("LambdaQA/Before/NegDaughter/fPt"), negTrack.pt()); - registry.fill(HIST("LambdaQA/Before/NegDaughter/fEta"), negTrackEta); - registry.fill(HIST("LambdaQA/Before/NegDaughter/fPhi"), negTrack.phi()); - registry.fill(HIST("LambdaQA/Before/NegDaughter/fDcaXy"), negTrack.pt(), negTrackDca); - registry.fill(HIST("LambdaQA/Before/NegDaughter/fTpcClusters"), negTrack.tpcNClsFound()); - registry.fill(HIST("LambdaQA/Before/NegDaughter/fNsigmaTpcProton"), negTrack.p(), negTrack.tpcNSigmaPr()); - registry.fill(HIST("LambdaQA/Before/NegDaughter/fNsigmaTpcPion"), negTrack.p(), negTrack.tpcNSigmaPi()); + registryParticleQA.fill(HIST("LambdaQA/Before/fPt"), lambdaPt); + registryParticleQA.fill(HIST("LambdaQA/Before/fEta"), lambdaEta); + registryParticleQA.fill(HIST("LambdaQA/Before/fPhi"), lambdaPhi); + registryParticleQA.fill(HIST("LambdaQA/Before/fInvMassLambda"), lambdaMass); + registryParticleQA.fill(HIST("LambdaQA/Before/fInvMassAntiLambda"), antiLambdaMass); + registryParticleQA.fill(HIST("LambdaQA/Before/fInvMassLambdaVsAntiLambda"), lambdaMass, antiLambdaMass); + registryParticleQA.fill(HIST("LambdaQA/Before/fInvMassLambdaVsKaon"), lambdaMass, kaonMass); + registryParticleQA.fill(HIST("LambdaQA/Before/fInvMassAntiLambdaVsKaon"), antiLambdaMass, kaonMass); + registryParticleQA.fill(HIST("LambdaQA/Before/fDcaDaugh"), lambdaDauDca); + registryParticleQA.fill(HIST("LambdaQA/Before/fCpa"), lambdaCpa); + registryParticleQA.fill(HIST("LambdaQA/Before/fTranRad"), lambdaRadius); + registryParticleQA.fill(HIST("LambdaQA/Before/fDecVtx"), lambdaPos); + + registryParticleQA.fill(HIST("LambdaQA/Before/PosDaughter/fPt"), posTrack.pt()); + registryParticleQA.fill(HIST("LambdaQA/Before/PosDaughter/fEta"), posTrackEta); + registryParticleQA.fill(HIST("LambdaQA/Before/PosDaughter/fPhi"), posTrack.phi()); + registryParticleQA.fill(HIST("LambdaQA/Before/PosDaughter/fDcaXy"), posTrack.pt(), posTrackDca); + registryParticleQA.fill(HIST("LambdaQA/Before/PosDaughter/fTpcClusters"), posTrack.tpcNClsFound()); + registryParticleQA.fill(HIST("LambdaQA/Before/PosDaughter/fNsigmaTpcProton"), posTrack.p(), posTrack.tpcNSigmaPr()); + registryParticleQA.fill(HIST("LambdaQA/Before/PosDaughter/fNsigmaTpcPion"), posTrack.p(), posTrack.tpcNSigmaPi()); + + registryParticleQA.fill(HIST("LambdaQA/Before/NegDaughter/fPt"), negTrack.pt()); + registryParticleQA.fill(HIST("LambdaQA/Before/NegDaughter/fEta"), negTrackEta); + registryParticleQA.fill(HIST("LambdaQA/Before/NegDaughter/fPhi"), negTrack.phi()); + registryParticleQA.fill(HIST("LambdaQA/Before/NegDaughter/fDcaXy"), negTrack.pt(), negTrackDca); + registryParticleQA.fill(HIST("LambdaQA/Before/NegDaughter/fTpcClusters"), negTrack.tpcNClsFound()); + registryParticleQA.fill(HIST("LambdaQA/Before/NegDaughter/fNsigmaTpcProton"), negTrack.p(), negTrack.tpcNSigmaPr()); + registryParticleQA.fill(HIST("LambdaQA/Before/NegDaughter/fNsigmaTpcPion"), negTrack.p(), negTrack.tpcNSigmaPi()); if (checkLambda(lambdaPt, lambdaDauDca, lambdaCpa, lambdaRadius, lambdaPos, kaonMass, lambdaMass) && checkLambdaDaughter(posTrack, posTrackEta, posTrackDca, posTrack.tpcNSigmaPr()) && checkLambdaDaughter(negTrack, negTrackEta, negTrackDca, negTrack.tpcNSigmaPi())) { vecLambda.emplace_back(lambdaPt, lambdaEta, lambdaPhi, o2::constants::physics::MassLambda0); idxLambdaDaughProton.push_back(posTrack.globalIndex()); idxLambdaDaughPion.push_back(negTrack.globalIndex()); - registry.fill(HIST("LambdaQA/After/Lambda/fPt"), lambdaPt); - registry.fill(HIST("LambdaQA/After/Lambda/fEta"), lambdaEta); - registry.fill(HIST("LambdaQA/After/Lambda/fPhi"), lambdaPhi); - registry.fill(HIST("LambdaQA/After/Lambda/fInvMass"), lambdaMass); - registry.fill(HIST("LambdaQA/After/Lambda/fInvMassLambdaVsAntiLambda"), lambdaMass, antiLambdaMass); - registry.fill(HIST("LambdaQA/After/Lambda/fInvMassLambdaVsKaon"), lambdaMass, kaonMass); - registry.fill(HIST("LambdaQA/After/Lambda/fDcaDaugh"), lambdaDauDca); - registry.fill(HIST("LambdaQA/After/Lambda/fCpa"), lambdaCpa); - registry.fill(HIST("LambdaQA/After/Lambda/fTranRad"), lambdaRadius); - registry.fill(HIST("LambdaQA/After/Lambda/fDecVtx"), lambdaPos); - - registry.fill(HIST("LambdaQA/After/Lambda/PosDaughter/fPt"), posTrack.pt()); - registry.fill(HIST("LambdaQA/After/Lambda/PosDaughter/fEta"), posTrackEta); - registry.fill(HIST("LambdaQA/After/Lambda/PosDaughter/fPhi"), posTrack.phi()); - registry.fill(HIST("LambdaQA/After/Lambda/PosDaughter/fDcaXy"), posTrack.pt(), posTrackDca); - registry.fill(HIST("LambdaQA/After/Lambda/PosDaughter/fTpcClusters"), posTrack.tpcNClsFound()); - registry.fill(HIST("LambdaQA/After/Lambda/PosDaughter/fNsigmaTpc"), posTrack.p(), posTrack.tpcNSigmaPr()); - - registry.fill(HIST("LambdaQA/After/Lambda/NegDaughter/fPt"), negTrack.pt()); - registry.fill(HIST("LambdaQA/After/Lambda/NegDaughter/fEta"), negTrackEta); - registry.fill(HIST("LambdaQA/After/Lambda/NegDaughter/fPhi"), negTrack.phi()); - registry.fill(HIST("LambdaQA/After/Lambda/NegDaughter/fDcaXy"), negTrack.pt(), negTrackDca); - registry.fill(HIST("LambdaQA/After/Lambda/NegDaughter/fTpcClusters"), negTrack.tpcNClsFound()); - registry.fill(HIST("LambdaQA/After/Lambda/NegDaughter/fNsigmaTpc"), negTrack.p(), negTrack.tpcNSigmaPi()); + registryParticleQA.fill(HIST("LambdaQA/After/Lambda/fPt"), lambdaPt); + registryParticleQA.fill(HIST("LambdaQA/After/Lambda/fEta"), lambdaEta); + registryParticleQA.fill(HIST("LambdaQA/After/Lambda/fPhi"), lambdaPhi); + registryParticleQA.fill(HIST("LambdaQA/After/Lambda/fInvMass"), lambdaMass); + registryParticleQA.fill(HIST("LambdaQA/After/Lambda/fInvMassLambdaVsAntiLambda"), lambdaMass, antiLambdaMass); + registryParticleQA.fill(HIST("LambdaQA/After/Lambda/fInvMassLambdaVsKaon"), lambdaMass, kaonMass); + registryParticleQA.fill(HIST("LambdaQA/After/Lambda/fDcaDaugh"), lambdaDauDca); + registryParticleQA.fill(HIST("LambdaQA/After/Lambda/fCpa"), lambdaCpa); + registryParticleQA.fill(HIST("LambdaQA/After/Lambda/fTranRad"), lambdaRadius); + registryParticleQA.fill(HIST("LambdaQA/After/Lambda/fDecVtx"), lambdaPos); + + registryParticleQA.fill(HIST("LambdaQA/After/Lambda/PosDaughter/fPt"), posTrack.pt()); + registryParticleQA.fill(HIST("LambdaQA/After/Lambda/PosDaughter/fEta"), posTrackEta); + registryParticleQA.fill(HIST("LambdaQA/After/Lambda/PosDaughter/fPhi"), posTrack.phi()); + registryParticleQA.fill(HIST("LambdaQA/After/Lambda/PosDaughter/fDcaXy"), posTrack.pt(), posTrackDca); + registryParticleQA.fill(HIST("LambdaQA/After/Lambda/PosDaughter/fTpcClusters"), posTrack.tpcNClsFound()); + registryParticleQA.fill(HIST("LambdaQA/After/Lambda/PosDaughter/fNsigmaTpc"), posTrack.p(), posTrack.tpcNSigmaPr()); + + registryParticleQA.fill(HIST("LambdaQA/After/Lambda/NegDaughter/fPt"), negTrack.pt()); + registryParticleQA.fill(HIST("LambdaQA/After/Lambda/NegDaughter/fEta"), negTrackEta); + registryParticleQA.fill(HIST("LambdaQA/After/Lambda/NegDaughter/fPhi"), negTrack.phi()); + registryParticleQA.fill(HIST("LambdaQA/After/Lambda/NegDaughter/fDcaXy"), negTrack.pt(), negTrackDca); + registryParticleQA.fill(HIST("LambdaQA/After/Lambda/NegDaughter/fTpcClusters"), negTrack.tpcNClsFound()); + registryParticleQA.fill(HIST("LambdaQA/After/Lambda/NegDaughter/fNsigmaTpc"), negTrack.p(), negTrack.tpcNSigmaPi()); } if (checkLambda(lambdaPt, lambdaDauDca, lambdaCpa, lambdaRadius, lambdaPos, kaonMass, antiLambdaMass) && checkLambdaDaughter(posTrack, posTrackEta, posTrackDca, posTrack.tpcNSigmaPi()) && checkLambdaDaughter(negTrack, negTrackEta, negTrackDca, negTrack.tpcNSigmaPr())) { @@ -1582,30 +1743,30 @@ struct CFFilterAll { idxAntiLambdaDaughProton.push_back(negTrack.globalIndex()); idxAntiLambdaDaughPion.push_back(posTrack.globalIndex()); - registry.fill(HIST("LambdaQA/After/AntiLambda/fPt"), lambdaPt); - registry.fill(HIST("LambdaQA/After/AntiLambda/fEta"), lambdaEta); - registry.fill(HIST("LambdaQA/After/AntiLambda/fPhi"), lambdaPhi); - registry.fill(HIST("LambdaQA/After/AntiLambda/fInvMass"), antiLambdaMass); - registry.fill(HIST("LambdaQA/After/AntiLambda/fInvMassAntiLambdaVsLambda"), antiLambdaMass, lambdaMass); - registry.fill(HIST("LambdaQA/After/AntiLambda/fInvMassAntiLambdaVsKaon"), antiLambdaMass, kaonMass); - registry.fill(HIST("LambdaQA/After/AntiLambda/fDcaDaugh"), lambdaDauDca); - registry.fill(HIST("LambdaQA/After/AntiLambda/fCpa"), lambdaCpa); - registry.fill(HIST("LambdaQA/After/AntiLambda/fTranRad"), lambdaRadius); - registry.fill(HIST("LambdaQA/After/AntiLambda/fDecVtx"), lambdaPos); - - registry.fill(HIST("LambdaQA/After/AntiLambda/PosDaughter/fPt"), posTrack.pt()); - registry.fill(HIST("LambdaQA/After/AntiLambda/PosDaughter/fEta"), posTrackEta); - registry.fill(HIST("LambdaQA/After/AntiLambda/PosDaughter/fPhi"), posTrack.phi()); - registry.fill(HIST("LambdaQA/After/AntiLambda/PosDaughter/fDcaXy"), posTrack.pt(), posTrackDca); - registry.fill(HIST("LambdaQA/After/AntiLambda/PosDaughter/fTpcClusters"), posTrack.tpcNClsFound()); - registry.fill(HIST("LambdaQA/After/AntiLambda/PosDaughter/fNsigmaTpc"), posTrack.p(), posTrack.tpcNSigmaPr()); - - registry.fill(HIST("LambdaQA/After/AntiLambda/NegDaughter/fPt"), negTrack.pt()); - registry.fill(HIST("LambdaQA/After/AntiLambda/NegDaughter/fEta"), negTrackEta); - registry.fill(HIST("LambdaQA/After/AntiLambda/NegDaughter/fPhi"), negTrack.phi()); - registry.fill(HIST("LambdaQA/After/AntiLambda/NegDaughter/fDcaXy"), negTrack.pt(), negTrackDca); - registry.fill(HIST("LambdaQA/After/AntiLambda/NegDaughter/fTpcClusters"), negTrack.tpcNClsFound()); - registry.fill(HIST("LambdaQA/After/AntiLambda/NegDaughter/fNsigmaTpc"), negTrack.p(), negTrack.tpcNSigmaPi()); + registryParticleQA.fill(HIST("LambdaQA/After/AntiLambda/fPt"), lambdaPt); + registryParticleQA.fill(HIST("LambdaQA/After/AntiLambda/fEta"), lambdaEta); + registryParticleQA.fill(HIST("LambdaQA/After/AntiLambda/fPhi"), lambdaPhi); + registryParticleQA.fill(HIST("LambdaQA/After/AntiLambda/fInvMass"), antiLambdaMass); + registryParticleQA.fill(HIST("LambdaQA/After/AntiLambda/fInvMassAntiLambdaVsLambda"), antiLambdaMass, lambdaMass); + registryParticleQA.fill(HIST("LambdaQA/After/AntiLambda/fInvMassAntiLambdaVsKaon"), antiLambdaMass, kaonMass); + registryParticleQA.fill(HIST("LambdaQA/After/AntiLambda/fDcaDaugh"), lambdaDauDca); + registryParticleQA.fill(HIST("LambdaQA/After/AntiLambda/fCpa"), lambdaCpa); + registryParticleQA.fill(HIST("LambdaQA/After/AntiLambda/fTranRad"), lambdaRadius); + registryParticleQA.fill(HIST("LambdaQA/After/AntiLambda/fDecVtx"), lambdaPos); + + registryParticleQA.fill(HIST("LambdaQA/After/AntiLambda/PosDaughter/fPt"), posTrack.pt()); + registryParticleQA.fill(HIST("LambdaQA/After/AntiLambda/PosDaughter/fEta"), posTrackEta); + registryParticleQA.fill(HIST("LambdaQA/After/AntiLambda/PosDaughter/fPhi"), posTrack.phi()); + registryParticleQA.fill(HIST("LambdaQA/After/AntiLambda/PosDaughter/fDcaXy"), posTrack.pt(), posTrackDca); + registryParticleQA.fill(HIST("LambdaQA/After/AntiLambda/PosDaughter/fTpcClusters"), posTrack.tpcNClsFound()); + registryParticleQA.fill(HIST("LambdaQA/After/AntiLambda/PosDaughter/fNsigmaTpc"), posTrack.p(), posTrack.tpcNSigmaPr()); + + registryParticleQA.fill(HIST("LambdaQA/After/AntiLambda/NegDaughter/fPt"), negTrack.pt()); + registryParticleQA.fill(HIST("LambdaQA/After/AntiLambda/NegDaughter/fEta"), negTrackEta); + registryParticleQA.fill(HIST("LambdaQA/After/AntiLambda/NegDaughter/fPhi"), negTrack.phi()); + registryParticleQA.fill(HIST("LambdaQA/After/AntiLambda/NegDaughter/fDcaXy"), negTrack.pt(), negTrackDca); + registryParticleQA.fill(HIST("LambdaQA/After/AntiLambda/NegDaughter/fTpcClusters"), negTrack.tpcNClsFound()); + registryParticleQA.fill(HIST("LambdaQA/After/AntiLambda/NegDaughter/fNsigmaTpc"), negTrack.p(), negTrack.tpcNSigmaPi()); } } @@ -1614,10 +1775,10 @@ struct CFFilterAll { for (size_t k2 = 0; k2 < vecAntiKaon.size(); k2++) { ROOT::Math::PtEtaPhiMVector phi = vecKaon.at(k1) + vecAntiKaon.at(k2); - registry.fill(HIST("PhiQA/Before/fInvMass"), phi.M()); - registry.fill(HIST("PhiQA/Before/fPt"), phi.Pt()); - registry.fill(HIST("PhiQA/Before/fEta"), phi.Eta()); - registry.fill(HIST("PhiQA/Before/fPhi"), RecoDecay::constrainAngle(phi.Phi())); + registryParticleQA.fill(HIST("PhiQA/Before/fInvMass"), phi.M()); + registryParticleQA.fill(HIST("PhiQA/Before/fPt"), phi.Pt()); + registryParticleQA.fill(HIST("PhiQA/Before/fEta"), phi.Eta()); + registryParticleQA.fill(HIST("PhiQA/Before/fPhi"), RecoDecay::constrainAngle(phi.Phi())); if ((phi.M() >= PhiSelections.invMassLow.value) && (phi.M() <= PhiSelections.invMassUp.value)) { @@ -1625,10 +1786,10 @@ struct CFFilterAll { idxPhiDaughPos.push_back(idxKaon.at(k1)); idxPhiDaughNeg.push_back(idxAntiKaon.at(k2)); - registry.fill(HIST("PhiQA/After/fInvMass"), phi.M()); - registry.fill(HIST("PhiQA/After/fPt"), phi.Pt()); - registry.fill(HIST("PhiQA/After/fEta"), phi.Eta()); - registry.fill(HIST("PhiQA/After/fPhi"), RecoDecay::constrainAngle(phi.Phi())); + registryParticleQA.fill(HIST("PhiQA/After/fInvMass"), phi.M()); + registryParticleQA.fill(HIST("PhiQA/After/fPt"), phi.Pt()); + registryParticleQA.fill(HIST("PhiQA/After/fEta"), phi.Eta()); + registryParticleQA.fill(HIST("PhiQA/After/fPhi"), RecoDecay::constrainAngle(phi.Phi())); } } } @@ -1638,20 +1799,20 @@ struct CFFilterAll { for (size_t p2 = 0; p2 < vecAntiPion.size(); p2++) { ROOT::Math::PtEtaPhiMVector rho = vecPion.at(p1) + vecAntiPion.at(p2); - registry.fill(HIST("RhoQA/Before/fInvMass"), rho.M()); - registry.fill(HIST("RhoQA/Before/fPt"), rho.Pt()); - registry.fill(HIST("RhoQA/Before/fEta"), rho.Eta()); - registry.fill(HIST("RhoQA/Before/fPhi"), RecoDecay::constrainAngle(rho.Phi())); + registryParticleQA.fill(HIST("RhoQA/Before/fInvMass"), rho.M()); + registryParticleQA.fill(HIST("RhoQA/Before/fPt"), rho.Pt()); + registryParticleQA.fill(HIST("RhoQA/Before/fEta"), rho.Eta()); + registryParticleQA.fill(HIST("RhoQA/Before/fPhi"), RecoDecay::constrainAngle(rho.Phi())); if (((rho.M() >= RhoSelections.invMassLow.value) && (rho.M() <= RhoSelections.invMassUp.value)) && (rho.Pt() >= RhoSelections.ptLow)) { vecRho.push_back(rho); idxRhoDaughPos.push_back(idxPion.at(p1)); idxRhoDaughNeg.push_back(idxAntiPion.at(p2)); - registry.fill(HIST("RhoQA/After/fInvMass"), rho.M()); - registry.fill(HIST("RhoQA/After/fPt"), rho.Pt()); - registry.fill(HIST("RhoQA/After/fEta"), rho.Eta()); - registry.fill(HIST("RhoQA/After/fPhi"), RecoDecay::constrainAngle(rho.Phi())); + registryParticleQA.fill(HIST("RhoQA/After/fInvMass"), rho.M()); + registryParticleQA.fill(HIST("RhoQA/After/fPt"), rho.Pt()); + registryParticleQA.fill(HIST("RhoQA/After/fEta"), rho.Eta()); + registryParticleQA.fill(HIST("RhoQA/After/fPhi"), RecoDecay::constrainAngle(rho.Phi())); } } } @@ -1670,16 +1831,28 @@ struct CFFilterAll { for (size_t p2 = p1 + 1; p2 < vecProton.size(); p2++) { for (size_t p3 = p2 + 1; p3 < vecProton.size(); p3++) { q3 = getQ3(vecProton.at(p1), vecProton.at(p2), vecProton.at(p3)); - registry.fill(HIST("PPP/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("PPP/fZvtx"), col.posZ()); - registry.fill(HIST("PPP/fSE_particle"), q3); - registry.fill(HIST("PPP/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); - registry.fill(HIST("PPP/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); - registry.fill(HIST("PPP/fProtonPtVsQ3"), vecProton.at(p3).Pt(), q3); + registryTriggerQA.fill(HIST("PPP/all/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PPP/all/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PPP/all/fSE_particle"), q3); + registryTriggerQA.fill(HIST("PPP/all/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PPP/all/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); + registryTriggerQA.fill(HIST("PPP/all/fProtonPtVsQ3"), vecProton.at(p3).Pt(), q3); if (q3 < TriggerSelections.limits->get("Loose Limit", "PPP")) { signalLooseLimit[cf_trigger::kPPP] += 1; + registryTriggerQA.fill(HIST("PPP/loose/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PPP/loose/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PPP/loose/fSE_particle"), q3); + registryTriggerQA.fill(HIST("PPP/loose/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PPP/loose/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); + registryTriggerQA.fill(HIST("PPP/loose/fProtonPtVsQ3"), vecProton.at(p3).Pt(), q3); if (q3 < TriggerSelections.limits->get("Tight Limit", "PPP")) { signalTightLimit[cf_trigger::kPPP] += 1; + registryTriggerQA.fill(HIST("PPP/tight/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PPP/tight/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PPP/tight/fSE_particle"), q3); + registryTriggerQA.fill(HIST("PPP/tight/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PPP/tight/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); + registryTriggerQA.fill(HIST("PPP/tight/fProtonPtVsQ3"), vecProton.at(p3).Pt(), q3); } } } @@ -1689,16 +1862,28 @@ struct CFFilterAll { for (size_t p2 = p1 + 1; p2 < vecAntiProton.size(); p2++) { for (size_t p3 = p2 + 1; p3 < vecAntiProton.size(); p3++) { q3 = getQ3(vecAntiProton.at(p1), vecAntiProton.at(p2), vecAntiProton.at(p3)); - registry.fill(HIST("PPP/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("PPP/fZvtx"), col.posZ()); - registry.fill(HIST("PPP/fSE_antiparticle"), q3); - registry.fill(HIST("PPP/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); - registry.fill(HIST("PPP/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); - registry.fill(HIST("PPP/fAntiProtonPtVsQ3"), vecAntiProton.at(p3).Pt(), q3); + registryTriggerQA.fill(HIST("PPP/all/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PPP/all/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PPP/all/fSE_antiparticle"), q3); + registryTriggerQA.fill(HIST("PPP/all/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PPP/all/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); + registryTriggerQA.fill(HIST("PPP/all/fAntiProtonPtVsQ3"), vecAntiProton.at(p3).Pt(), q3); if (q3 < TriggerSelections.limits->get("Loose Limit", "PPP")) { signalLooseLimit[cf_trigger::kPPP] += 1; + registryTriggerQA.fill(HIST("PPP/loose/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PPP/loose/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PPP/loose/fSE_antiparticle"), q3); + registryTriggerQA.fill(HIST("PPP/loose/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PPP/loose/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); + registryTriggerQA.fill(HIST("PPP/loose/fAntiProtonPtVsQ3"), vecAntiProton.at(p3).Pt(), q3); if (q3 < TriggerSelections.limits->get("Tight Limit", "PPP")) { signalTightLimit[cf_trigger::kPPP] += 1; + registryTriggerQA.fill(HIST("PPP/tight/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PPP/tight/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PPP/tight/fSE_antiparticle"), q3); + registryTriggerQA.fill(HIST("PPP/tight/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PPP/tight/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); + registryTriggerQA.fill(HIST("PPP/tight/fAntiProtonPtVsQ3"), vecAntiProton.at(p3).Pt(), q3); } } } @@ -1714,16 +1899,28 @@ struct CFFilterAll { continue; } q3 = getQ3(vecProton.at(p1), vecProton.at(p2), vecLambda.at(l1)); - registry.fill(HIST("PPL/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("PPL/fZvtx"), col.posZ()); - registry.fill(HIST("PPL/fSE_particle"), q3); - registry.fill(HIST("PPL/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); - registry.fill(HIST("PPL/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); - registry.fill(HIST("PPL/fLambdaPtVsQ3"), vecLambda.at(l1).Pt(), q3); + registryTriggerQA.fill(HIST("PPL/all/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PPL/all/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PPL/all/fSE_particle"), q3); + registryTriggerQA.fill(HIST("PPL/all/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PPL/all/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); + registryTriggerQA.fill(HIST("PPL/all/fLambdaPtVsQ3"), vecLambda.at(l1).Pt(), q3); if (q3 < TriggerSelections.limits->get("Loose Limit", "PPL")) { signalLooseLimit[cf_trigger::kPPL] += 1; + registryTriggerQA.fill(HIST("PPL/loose/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PPL/loose/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PPL/loose/fSE_particle"), q3); + registryTriggerQA.fill(HIST("PPL/loose/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PPL/loose/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); + registryTriggerQA.fill(HIST("PPL/loose/fLambdaPtVsQ3"), vecLambda.at(l1).Pt(), q3); if (q3 < TriggerSelections.limits->get("Tight Limit", "PPL")) { signalTightLimit[cf_trigger::kPPL] += 1; + registryTriggerQA.fill(HIST("PPL/tight/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PPL/tight/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PPL/tight/fSE_particle"), q3); + registryTriggerQA.fill(HIST("PPL/tight/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PPL/tight/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); + registryTriggerQA.fill(HIST("PPL/tight/fLambdaPtVsQ3"), vecLambda.at(l1).Pt(), q3); } } } @@ -1736,16 +1933,28 @@ struct CFFilterAll { continue; } q3 = getQ3(vecAntiProton.at(p1), vecAntiProton.at(p2), vecAntiLambda.at(l1)); - registry.fill(HIST("PPL/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("PPL/fZvtx"), col.posZ()); - registry.fill(HIST("PPL/fSE_particle"), q3); - registry.fill(HIST("PPL/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); - registry.fill(HIST("PPL/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); - registry.fill(HIST("PPL/fAntiLambdaPtVsQ3"), vecAntiLambda.at(l1).Pt(), q3); + registryTriggerQA.fill(HIST("PPL/all/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PPL/all/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PPL/all/fSE_particle"), q3); + registryTriggerQA.fill(HIST("PPL/all/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PPL/all/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); + registryTriggerQA.fill(HIST("PPL/all/fAntiLambdaPtVsQ3"), vecAntiLambda.at(l1).Pt(), q3); if (q3 < TriggerSelections.limits->get("Loose Limit", "PPL")) { signalLooseLimit[cf_trigger::kPPL] += 1; + registryTriggerQA.fill(HIST("PPL/loose/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PPL/loose/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PPL/loose/fSE_antiparticle"), q3); + registryTriggerQA.fill(HIST("PPL/loose/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PPL/loose/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); + registryTriggerQA.fill(HIST("PPL/loose/fAntiLambdaPtVsQ3"), vecAntiLambda.at(l1).Pt(), q3); if (q3 < TriggerSelections.limits->get("Tight Limit", "PPL")) { signalTightLimit[cf_trigger::kPPL] += 1; + registryTriggerQA.fill(HIST("PPL/tight/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PPL/tight/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PPL/tight/fSE_antiparticle"), q3); + registryTriggerQA.fill(HIST("PPL/tight/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PPL/tight/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); + registryTriggerQA.fill(HIST("PPL/tight/fAntiLambdaPtVsQ3"), vecAntiLambda.at(l1).Pt(), q3); } } } @@ -1764,16 +1973,28 @@ struct CFFilterAll { continue; } q3 = getQ3(vecLambda.at(l1), vecLambda.at(l2), vecProton.at(p1)); - registry.fill(HIST("PLL/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("PLL/fZvtx"), col.posZ()); - registry.fill(HIST("PLL/fSE_particle"), q3); - registry.fill(HIST("PLL/fLambdaPtVsQ3"), vecLambda.at(l1).Pt(), q3); - registry.fill(HIST("PLL/fLambdaPtVsQ3"), vecLambda.at(l2).Pt(), q3); - registry.fill(HIST("PLL/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PLL/all/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PLL/all/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PLL/all/fSE_particle"), q3); + registryTriggerQA.fill(HIST("PLL/all/fLambdaPtVsQ3"), vecLambda.at(l1).Pt(), q3); + registryTriggerQA.fill(HIST("PLL/all/fLambdaPtVsQ3"), vecLambda.at(l2).Pt(), q3); + registryTriggerQA.fill(HIST("PLL/all/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); if (q3 < TriggerSelections.limits->get("Loose Limit", "PLL")) { signalLooseLimit[cf_trigger::kPLL] += 1; + registryTriggerQA.fill(HIST("PLL/loose/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PLL/loose/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PLL/loose/fSE_particle"), q3); + registryTriggerQA.fill(HIST("PLL/loose/fLambdaPtVsQ3"), vecLambda.at(l1).Pt(), q3); + registryTriggerQA.fill(HIST("PLL/loose/fLambdaPtVsQ3"), vecLambda.at(l2).Pt(), q3); + registryTriggerQA.fill(HIST("PLL/loose/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); if (q3 < TriggerSelections.limits->get("Tight Limit", "PLL")) { signalTightLimit[cf_trigger::kPLL] += 1; + registryTriggerQA.fill(HIST("PLL/tight/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PLL/tight/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PLL/tight/fSE_particle"), q3); + registryTriggerQA.fill(HIST("PLL/tight/fLambdaPtVsQ3"), vecLambda.at(l1).Pt(), q3); + registryTriggerQA.fill(HIST("PLL/tight/fLambdaPtVsQ3"), vecLambda.at(l2).Pt(), q3); + registryTriggerQA.fill(HIST("PLL/tight/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); } } } @@ -1789,16 +2010,28 @@ struct CFFilterAll { continue; } q3 = getQ3(vecAntiLambda.at(l1), vecAntiLambda.at(l2), vecAntiProton.at(p1)); - registry.fill(HIST("PLL/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("PLL/fZvtx"), col.posZ()); - registry.fill(HIST("PLL/fSE_antiparticle"), q3); - registry.fill(HIST("PLL/fAntiLambdaPtVsQ3"), vecAntiLambda.at(l1).Pt(), q3); - registry.fill(HIST("PLL/fAntiLambdaPtVsQ3"), vecAntiLambda.at(l2).Pt(), q3); - registry.fill(HIST("PLL/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PLL/all/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PLL/all/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PLL/all/fSE_antiparticle"), q3); + registryTriggerQA.fill(HIST("PLL/all/fAntiLambdaPtVsQ3"), vecAntiLambda.at(l1).Pt(), q3); + registryTriggerQA.fill(HIST("PLL/all/fAntiLambdaPtVsQ3"), vecAntiLambda.at(l2).Pt(), q3); + registryTriggerQA.fill(HIST("PLL/all/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); if (q3 < TriggerSelections.limits->get("Loose Limit", "PLL")) { signalLooseLimit[cf_trigger::kPLL] += 1; + registryTriggerQA.fill(HIST("PLL/loose/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PLL/loose/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PLL/loose/fSE_antiparticle"), q3); + registryTriggerQA.fill(HIST("PLL/loose/fAntiLambdaPtVsQ3"), vecAntiLambda.at(l1).Pt(), q3); + registryTriggerQA.fill(HIST("PLL/loose/fAntiLambdaPtVsQ3"), vecAntiLambda.at(l2).Pt(), q3); + registryTriggerQA.fill(HIST("PLL/loose/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); if (q3 < TriggerSelections.limits->get("Tight Limit", "PLL")) { signalTightLimit[cf_trigger::kPLL] += 1; + registryTriggerQA.fill(HIST("PLL/tight/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PLL/tight/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PLL/tight/fSE_antiparticle"), q3); + registryTriggerQA.fill(HIST("PLL/tight/fAntiLambdaPtVsQ3"), vecAntiLambda.at(l1).Pt(), q3); + registryTriggerQA.fill(HIST("PLL/tight/fAntiLambdaPtVsQ3"), vecAntiLambda.at(l2).Pt(), q3); + registryTriggerQA.fill(HIST("PLL/tight/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); } } } @@ -1816,16 +2049,28 @@ struct CFFilterAll { continue; } q3 = getQ3(vecLambda.at(l1), vecLambda.at(l2), vecLambda.at(l3)); - registry.fill(HIST("PLL/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("PLL/fZvtx"), col.posZ()); - registry.fill(HIST("PLL/fSE_particle"), q3); - registry.fill(HIST("PLL/fLambdaPtVsQ3"), vecLambda.at(l1).Pt(), q3); - registry.fill(HIST("PLL/fLambdaPtVsQ3"), vecLambda.at(l2).Pt(), q3); - registry.fill(HIST("PLL/fLambdaPtVsQ3"), vecLambda.at(l3).Pt(), q3); + registryTriggerQA.fill(HIST("LLL/all/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("LLL/all/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("LLL/all/fSE_particle"), q3); + registryTriggerQA.fill(HIST("LLL/all/fLambdaPtVsQ3"), vecLambda.at(l1).Pt(), q3); + registryTriggerQA.fill(HIST("LLL/all/fLambdaPtVsQ3"), vecLambda.at(l2).Pt(), q3); + registryTriggerQA.fill(HIST("LLL/all/fLambdaPtVsQ3"), vecLambda.at(l3).Pt(), q3); if (q3 < TriggerSelections.limits->get("Loose Limit", "LLL")) { signalLooseLimit[cf_trigger::kLLL] += 1; + registryTriggerQA.fill(HIST("LLL/loose/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("LLL/loose/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("LLL/loose/fSE_particle"), q3); + registryTriggerQA.fill(HIST("LLL/loose/fLambdaPtVsQ3"), vecLambda.at(l1).Pt(), q3); + registryTriggerQA.fill(HIST("LLL/loose/fLambdaPtVsQ3"), vecLambda.at(l2).Pt(), q3); + registryTriggerQA.fill(HIST("LLL/loose/fLambdaPtVsQ3"), vecLambda.at(l3).Pt(), q3); if (q3 < TriggerSelections.limits->get("Tight Limit", "LLL")) { signalTightLimit[cf_trigger::kLLL] += 1; + registryTriggerQA.fill(HIST("LLL/tight/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("LLL/tight/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("LLL/tight/fSE_particle"), q3); + registryTriggerQA.fill(HIST("LLL/tight/fLambdaPtVsQ3"), vecLambda.at(l1).Pt(), q3); + registryTriggerQA.fill(HIST("LLL/tight/fLambdaPtVsQ3"), vecLambda.at(l2).Pt(), q3); + registryTriggerQA.fill(HIST("LLL/tight/fLambdaPtVsQ3"), vecLambda.at(l3).Pt(), q3); } } } @@ -1840,16 +2085,28 @@ struct CFFilterAll { continue; } q3 = getQ3(vecAntiLambda.at(l1), vecAntiLambda.at(l2), vecAntiLambda.at(l3)); - registry.fill(HIST("PLL/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("PLL/fZvtx"), col.posZ()); - registry.fill(HIST("PLL/fSE_particle"), q3); - registry.fill(HIST("PLL/fLambdaPtVsQ3"), vecAntiLambda.at(l1).Pt(), q3); - registry.fill(HIST("PLL/fLambdaPtVsQ3"), vecAntiLambda.at(l2).Pt(), q3); - registry.fill(HIST("PLL/fLambdaPtVsQ3"), vecAntiLambda.at(l3).Pt(), q3); + registryTriggerQA.fill(HIST("LLL/all/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("LLL/all/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("LLL/all/fSE_antiparticle"), q3); + registryTriggerQA.fill(HIST("LLL/all/fLambdaPtVsQ3"), vecAntiLambda.at(l1).Pt(), q3); + registryTriggerQA.fill(HIST("LLL/all/fLambdaPtVsQ3"), vecAntiLambda.at(l2).Pt(), q3); + registryTriggerQA.fill(HIST("LLL/all/fLambdaPtVsQ3"), vecAntiLambda.at(l3).Pt(), q3); if (q3 < TriggerSelections.limits->get("Loose Limit", "LLL")) { signalLooseLimit[cf_trigger::kLLL] += 1; + registryTriggerQA.fill(HIST("LLL/loose/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("LLL/loose/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("LLL/loose/fSE_antiparticle"), q3); + registryTriggerQA.fill(HIST("LLL/loose/fLambdaPtVsQ3"), vecAntiLambda.at(l1).Pt(), q3); + registryTriggerQA.fill(HIST("LLL/loose/fLambdaPtVsQ3"), vecAntiLambda.at(l2).Pt(), q3); + registryTriggerQA.fill(HIST("LLL/loose/fLambdaPtVsQ3"), vecAntiLambda.at(l3).Pt(), q3); if (q3 < TriggerSelections.limits->get("Tight Limit", "LLL")) { signalTightLimit[cf_trigger::kLLL] += 1; + registryTriggerQA.fill(HIST("LLL/tight/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("LLL/tight/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("LLL/tight/fSE_antiparticle"), q3); + registryTriggerQA.fill(HIST("LLL/tight/fLambdaPtVsQ3"), vecAntiLambda.at(l1).Pt(), q3); + registryTriggerQA.fill(HIST("LLL/tight/fLambdaPtVsQ3"), vecAntiLambda.at(l2).Pt(), q3); + registryTriggerQA.fill(HIST("LLL/tight/fLambdaPtVsQ3"), vecAntiLambda.at(l3).Pt(), q3); } } } @@ -1865,17 +2122,32 @@ struct CFFilterAll { continue; } q3 = getQ3(vecProton.at(p1), vecProton.at(p2), vecPhi.at(phi1)); - registry.fill(HIST("PPPhi/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("PPPhi/fZvtx"), col.posZ()); - registry.fill(HIST("PPPhi/fSE_particle"), q3); - registry.fill(HIST("PPPhi/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); - registry.fill(HIST("PPPhi/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); - registry.fill(HIST("PPPhi/fPhiPtVsQ3"), vecPhi.at(phi1).Pt(), q3); - registry.fill(HIST("PPPhi/fPhiInvMassVsQ3"), vecPhi.at(phi1).M(), q3); + registryTriggerQA.fill(HIST("PPPhi/all/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PPPhi/all/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PPPhi/all/fSE_particle"), q3); + registryTriggerQA.fill(HIST("PPPhi/all/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PPPhi/all/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); + registryTriggerQA.fill(HIST("PPPhi/all/fPhiPtVsQ3"), vecPhi.at(phi1).Pt(), q3); + registryTriggerQA.fill(HIST("PPPhi/all/fPhiInvMassVsQ3"), vecPhi.at(phi1).M(), q3); if (q3 < TriggerSelections.limits->get("Loose Limit", "PPPhi")) { + signalLooseLimit[cf_trigger::kPPPhi] += 1; + registryTriggerQA.fill(HIST("PPPhi/loose/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PPPhi/loose/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PPPhi/loose/fSE_particle"), q3); + registryTriggerQA.fill(HIST("PPPhi/loose/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PPPhi/loose/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); + registryTriggerQA.fill(HIST("PPPhi/loose/fPhiPtVsQ3"), vecPhi.at(phi1).Pt(), q3); + registryTriggerQA.fill(HIST("PPPhi/loose/fPhiInvMassVsQ3"), vecPhi.at(phi1).M(), q3); if (q3 < TriggerSelections.limits->get("Tight Limit", "PPPhi") && vecPhi.at(phi1).M() > PhiSelections.tightInvMassLow.value && vecPhi.at(phi1).M() < PhiSelections.tightInvMassUp.value) { signalTightLimit[cf_trigger::kPPPhi] += 1; + registryTriggerQA.fill(HIST("PPPhi/tight/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PPPhi/tight/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PPPhi/tight/fSE_particle"), q3); + registryTriggerQA.fill(HIST("PPPhi/tight/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PPPhi/tight/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); + registryTriggerQA.fill(HIST("PPPhi/tight/fPhiPtVsQ3"), vecPhi.at(phi1).Pt(), q3); + registryTriggerQA.fill(HIST("PPPhi/tight/fPhiInvMassVsQ3"), vecPhi.at(phi1).M(), q3); } } } @@ -1888,17 +2160,32 @@ struct CFFilterAll { continue; } q3 = getQ3(vecAntiProton.at(p1), vecAntiProton.at(p2), vecPhi.at(phi1)); - registry.fill(HIST("PPPhi/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("PPPhi/fZvtx"), col.posZ()); - registry.fill(HIST("PPPhi/fSE_particle"), q3); - registry.fill(HIST("PPPhi/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); - registry.fill(HIST("PPPhi/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); - registry.fill(HIST("PPPhi/fPhiPtVsQ3"), vecPhi.at(phi1).Pt(), q3); - registry.fill(HIST("PPPhi/fPhiInvMassVsQ3"), vecPhi.at(phi1).M(), q3); + registryTriggerQA.fill(HIST("PPPhi/all/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PPPhi/all/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PPPhi/all/fSE_antiparticle"), q3); + registryTriggerQA.fill(HIST("PPPhi/all/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PPPhi/all/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); + registryTriggerQA.fill(HIST("PPPhi/all/fPhiPtVsQ3"), vecPhi.at(phi1).Pt(), q3); + registryTriggerQA.fill(HIST("PPPhi/all/fPhiInvMassVsQ3"), vecPhi.at(phi1).M(), q3); if (q3 < TriggerSelections.limits->get("Loose Limit", "PPPhi")) { + signalLooseLimit[cf_trigger::kPPPhi] += 1; + registryTriggerQA.fill(HIST("PPPhi/loose/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PPPhi/loose/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PPPhi/loose/fSE_antiparticle"), q3); + registryTriggerQA.fill(HIST("PPPhi/loose/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PPPhi/loose/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); + registryTriggerQA.fill(HIST("PPPhi/loose/fPhiPtVsQ3"), vecPhi.at(phi1).Pt(), q3); + registryTriggerQA.fill(HIST("PPPhi/loose/fPhiInvMassVsQ3"), vecPhi.at(phi1).M(), q3); if (q3 < TriggerSelections.limits->get("Tight Limit", "PPPhi") && vecPhi.at(phi1).M() > PhiSelections.tightInvMassLow.value && vecPhi.at(phi1).M() < PhiSelections.tightInvMassUp.value) { signalTightLimit[cf_trigger::kPPPhi] += 1; + registryTriggerQA.fill(HIST("PPPhi/tight/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PPPhi/tight/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PPPhi/tight/fSE_antiparticle"), q3); + registryTriggerQA.fill(HIST("PPPhi/tight/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PPPhi/tight/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); + registryTriggerQA.fill(HIST("PPPhi/tight/fPhiPtVsQ3"), vecPhi.at(phi1).Pt(), q3); + registryTriggerQA.fill(HIST("PPPhi/tight/fPhiInvMassVsQ3"), vecPhi.at(phi1).M(), q3); } } } @@ -1914,17 +2201,32 @@ struct CFFilterAll { continue; } q3 = getQ3(vecProton.at(p1), vecProton.at(p2), vecRho.at(r1)); - registry.fill(HIST("PPRho/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("PPRho/fZvtx"), col.posZ()); - registry.fill(HIST("PPRho/fSE_particle"), q3); - registry.fill(HIST("PPRho/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); - registry.fill(HIST("PPRho/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); - registry.fill(HIST("PPRho/fRhoPtVsQ3"), vecRho.at(r1).Pt(), q3); - registry.fill(HIST("PPRho/fRhoInvMassVsQ3"), vecRho.at(r1).M(), q3); + registryTriggerQA.fill(HIST("PPRho/all/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PPRho/all/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PPRho/all/fSE_particle"), q3); + registryTriggerQA.fill(HIST("PPRho/all/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PPRho/all/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); + registryTriggerQA.fill(HIST("PPRho/all/fRhoPtVsQ3"), vecRho.at(r1).Pt(), q3); + registryTriggerQA.fill(HIST("PPRho/all/fRhoInvMassVsQ3"), vecRho.at(r1).M(), q3); if (q3 < TriggerSelections.limits->get("Loose Limit", "PPRho")) { + signalLooseLimit[cf_trigger::kPPRho] += 1; + registryTriggerQA.fill(HIST("PPRho/loose/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PPRho/loose/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PPRho/loose/fSE_particle"), q3); + registryTriggerQA.fill(HIST("PPRho/loose/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PPRho/loose/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); + registryTriggerQA.fill(HIST("PPRho/loose/fRhoPtVsQ3"), vecRho.at(r1).Pt(), q3); + registryTriggerQA.fill(HIST("PPRho/loose/fRhoInvMassVsQ3"), vecRho.at(r1).M(), q3); if (q3 < TriggerSelections.limits->get("Tight Limit", "PPRho") && vecRho.at(r1).M() > RhoSelections.tightInvMassLow.value && vecRho.at(r1).M() < RhoSelections.tightInvMassUp.value) { signalTightLimit[cf_trigger::kPPRho] += 1; + registryTriggerQA.fill(HIST("PPRho/tight/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PPRho/tight/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PPRho/tight/fSE_particle"), q3); + registryTriggerQA.fill(HIST("PPRho/tight/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PPRho/tight/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); + registryTriggerQA.fill(HIST("PPRho/tight/fRhoPtVsQ3"), vecRho.at(r1).Pt(), q3); + registryTriggerQA.fill(HIST("PPRho/tight/fRhoInvMassVsQ3"), vecRho.at(r1).M(), q3); } } } @@ -1937,17 +2239,32 @@ struct CFFilterAll { continue; } q3 = getQ3(vecAntiProton.at(p1), vecAntiProton.at(p2), vecRho.at(r1)); - registry.fill(HIST("PPRho/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("PPRho/fZvtx"), col.posZ()); - registry.fill(HIST("PPRho/fSE_antiparticle"), q3); - registry.fill(HIST("PPRho/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); - registry.fill(HIST("PPRho/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); - registry.fill(HIST("PPRho/fRhoPtVsQ3"), vecRho.at(r1).Pt(), q3); - registry.fill(HIST("PPRho/fRhoInvMassVsQ3"), vecRho.at(r1).M(), q3); + registryTriggerQA.fill(HIST("PPRho/all/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PPRho/all/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PPRho/all/fSE_antiparticle"), q3); + registryTriggerQA.fill(HIST("PPRho/all/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PPRho/all/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); + registryTriggerQA.fill(HIST("PPRho/all/fRhoPtVsQ3"), vecRho.at(r1).Pt(), q3); + registryTriggerQA.fill(HIST("PPRho/all/fRhoInvMassVsQ3"), vecRho.at(r1).M(), q3); if (q3 < TriggerSelections.limits->get("Loose Limit", "PPRho")) { + signalLooseLimit[cf_trigger::kPPRho] += 1; + registryTriggerQA.fill(HIST("PPRho/loose/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PPRho/loose/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PPRho/loose/fSE_antiparticle"), q3); + registryTriggerQA.fill(HIST("PPRho/loose/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PPRho/loose/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); + registryTriggerQA.fill(HIST("PPRho/loose/fRhoPtVsQ3"), vecRho.at(r1).Pt(), q3); + registryTriggerQA.fill(HIST("PPRho/loose/fRhoInvMassVsQ3"), vecRho.at(r1).M(), q3); if (q3 < TriggerSelections.limits->get("Tight Limit", "PPRho") && vecRho.at(r1).M() > RhoSelections.tightInvMassLow.value && vecRho.at(r1).M() < RhoSelections.tightInvMassUp.value) { signalTightLimit[cf_trigger::kPPRho] += 1; + registryTriggerQA.fill(HIST("PPRho/tight/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PPRho/tight/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PPRho/tight/fSE_antiparticle"), q3); + registryTriggerQA.fill(HIST("PPRho/tight/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PPRho/tight/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); + registryTriggerQA.fill(HIST("PPRho/tight/fRhoPtVsQ3"), vecRho.at(r1).Pt(), q3); + registryTriggerQA.fill(HIST("PPRho/tight/fRhoInvMassVsQ3"), vecRho.at(r1).M(), q3); } } } @@ -1962,15 +2279,25 @@ struct CFFilterAll { continue; } kstar = getkstar(vecProton.at(p1), vecDeuteron.at(d1)); - registry.fill(HIST("PD/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("PD/fZvtx"), col.posZ()); - registry.fill(HIST("PD/fSE_particle"), kstar); - registry.fill(HIST("PD/fProtonPtVskstar"), vecProton.at(p1).Pt(), kstar); - registry.fill(HIST("PD/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("PD/all/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PD/all/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PD/all/fSE_particle"), kstar); + registryTriggerQA.fill(HIST("PD/all/fProtonPtVskstar"), vecProton.at(p1).Pt(), kstar); + registryTriggerQA.fill(HIST("PD/all/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); if (kstar < TriggerSelections.limits->get("Loose Limit", "PD")) { signalLooseLimit[cf_trigger::kPD] += 1; + registryTriggerQA.fill(HIST("PD/loose/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PD/loose/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PD/loose/fSE_particle"), kstar); + registryTriggerQA.fill(HIST("PD/loose/fProtonPtVskstar"), vecProton.at(p1).Pt(), kstar); + registryTriggerQA.fill(HIST("PD/loose/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); if (kstar < TriggerSelections.limits->get("Tight Limit", "PD")) { signalTightLimit[cf_trigger::kPD] += 1; + registryTriggerQA.fill(HIST("PD/tight/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PD/tight/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PD/tight/fSE_particle"), kstar); + registryTriggerQA.fill(HIST("PD/tight/fProtonPtVskstar"), vecProton.at(p1).Pt(), kstar); + registryTriggerQA.fill(HIST("PD/tight/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); } } } @@ -1981,15 +2308,25 @@ struct CFFilterAll { continue; } kstar = getkstar(vecAntiProton.at(p1), vecAntiDeuteron.at(d1)); - registry.fill(HIST("PD/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("PD/fZvtx"), col.posZ()); - registry.fill(HIST("PD/fSE_antiparticle"), kstar); - registry.fill(HIST("PD/fAntiProtonPtVskstar"), vecAntiProton.at(p1).Pt(), kstar); - registry.fill(HIST("PD/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("PD/all/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PD/all/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PD/all/fSE_antiparticle"), kstar); + registryTriggerQA.fill(HIST("PD/all/fAntiProtonPtVskstar"), vecAntiProton.at(p1).Pt(), kstar); + registryTriggerQA.fill(HIST("PD/all/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); if (kstar < TriggerSelections.limits->get("Loose Limit", "PD")) { signalLooseLimit[cf_trigger::kPD] += 1; + registryTriggerQA.fill(HIST("PD/loose/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PD/loose/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PD/loose/fSE_antiparticle"), kstar); + registryTriggerQA.fill(HIST("PD/loose/fAntiProtonPtVskstar"), vecAntiProton.at(p1).Pt(), kstar); + registryTriggerQA.fill(HIST("PD/loose/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); if (kstar < TriggerSelections.limits->get("Tight Limit", "PD")) { signalTightLimit[cf_trigger::kPD] += 1; + registryTriggerQA.fill(HIST("PD/tight/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PD/tight/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PD/tight/fSE_antiparticle"), kstar); + registryTriggerQA.fill(HIST("PD/tight/fAntiProtonPtVskstar"), vecAntiProton.at(p1).Pt(), kstar); + registryTriggerQA.fill(HIST("PD/tight/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); } } } @@ -2003,15 +2340,25 @@ struct CFFilterAll { continue; } kstar = getkstar(vecLambda.at(l1), vecDeuteron.at(d1)); - registry.fill(HIST("LD/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("LD/fZvtx"), col.posZ()); - registry.fill(HIST("LD/fSE_particle"), kstar); - registry.fill(HIST("LD/fLambdaPtVskstar"), vecLambda.at(l1).Pt(), kstar); - registry.fill(HIST("LD/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("LD/all/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("LD/all/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("LD/all/fSE_particle"), kstar); + registryTriggerQA.fill(HIST("LD/all/fLambdaPtVskstar"), vecLambda.at(l1).Pt(), kstar); + registryTriggerQA.fill(HIST("LD/all/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); if (kstar < TriggerSelections.limits->get("Loose Limit", "LD")) { signalLooseLimit[cf_trigger::kLD] += 1; + registryTriggerQA.fill(HIST("LD/loose/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("LD/loose/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("LD/loose/fSE_particle"), kstar); + registryTriggerQA.fill(HIST("LD/loose/fLambdaPtVskstar"), vecLambda.at(l1).Pt(), kstar); + registryTriggerQA.fill(HIST("LD/loose/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); if (kstar < TriggerSelections.limits->get("Tight Limit", "LD")) { signalTightLimit[cf_trigger::kLD] += 1; + registryTriggerQA.fill(HIST("LD/tight/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("LD/tight/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("LD/tight/fSE_particle"), kstar); + registryTriggerQA.fill(HIST("LD/tight/fLambdaPtVskstar"), vecLambda.at(l1).Pt(), kstar); + registryTriggerQA.fill(HIST("LD/tight/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); } } } @@ -2022,15 +2369,25 @@ struct CFFilterAll { continue; } kstar = getkstar(vecAntiLambda.at(l1), vecAntiDeuteron.at(d1)); - registry.fill(HIST("LD/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("LD/fZvtx"), col.posZ()); - registry.fill(HIST("LD/fSE_antiparticle"), kstar); - registry.fill(HIST("LD/fAntiLambdaPtVskstar"), vecAntiLambda.at(l1).Pt(), kstar); - registry.fill(HIST("LD/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("LD/all/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("LD/all/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("LD/all/fSE_antiparticle"), kstar); + registryTriggerQA.fill(HIST("LD/all/fAntiLambdaPtVskstar"), vecAntiLambda.at(l1).Pt(), kstar); + registryTriggerQA.fill(HIST("LD/all/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); if (kstar < TriggerSelections.limits->get("Loose Limit", "LD")) { signalLooseLimit[cf_trigger::kLD] += 1; + registryTriggerQA.fill(HIST("LD/loose/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("LD/loose/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("LD/loose/fSE_antiparticle"), kstar); + registryTriggerQA.fill(HIST("LD/loose/fAntiLambdaPtVskstar"), vecAntiLambda.at(l1).Pt(), kstar); + registryTriggerQA.fill(HIST("LD/loose/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); if (kstar < TriggerSelections.limits->get("Tight Limit", "LD")) { signalTightLimit[cf_trigger::kLD] += 1; + registryTriggerQA.fill(HIST("LD/tight/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("LD/tight/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("LD/tight/fSE_antiparticle"), kstar); + registryTriggerQA.fill(HIST("LD/tight/fAntiLambdaPtVskstar"), vecAntiLambda.at(l1).Pt(), kstar); + registryTriggerQA.fill(HIST("LD/tight/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); } } } @@ -2044,17 +2401,29 @@ struct CFFilterAll { continue; } kstar = getkstar(vecPhi.at(phi1), vecDeuteron.at(d1)); - registry.fill(HIST("PhiD/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("PhiD/fZvtx"), col.posZ()); - registry.fill(HIST("PhiD/fSE_particle"), kstar); - registry.fill(HIST("PhiD/fPhiPtVskstar"), vecPhi.at(phi1).Pt(), kstar); - registry.fill(HIST("PhiD/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); - registry.fill(HIST("PhiD/fPhiInvMassVskstar"), vecPhi.at(phi1).M(), kstar); + registryTriggerQA.fill(HIST("PhiD/all/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PhiD/all/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PhiD/all/fSE_particle"), kstar); + registryTriggerQA.fill(HIST("PhiD/all/fPhiPtVskstar"), vecPhi.at(phi1).Pt(), kstar); + registryTriggerQA.fill(HIST("PhiD/all/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("PhiD/all/fPhiInvMassVskstar"), vecPhi.at(phi1).M(), kstar); if (kstar < TriggerSelections.limits->get("Loose Limit", "PhiD")) { signalLooseLimit[cf_trigger::kPhiD] += 1; + registryTriggerQA.fill(HIST("PhiD/loose/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PhiD/loose/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PhiD/loose/fSE_particle"), kstar); + registryTriggerQA.fill(HIST("PhiD/loose/fPhiPtVskstar"), vecPhi.at(phi1).Pt(), kstar); + registryTriggerQA.fill(HIST("PhiD/loose/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("PhiD/loose/fPhiInvMassVskstar"), vecPhi.at(phi1).M(), kstar); if (kstar < TriggerSelections.limits->get("Tight Limit", "PhiD") && vecPhi.at(phi1).M() > PhiSelections.tightInvMassLow.value && vecPhi.at(phi1).M() < PhiSelections.tightInvMassUp.value) { signalTightLimit[cf_trigger::kPhiD] += 1; + registryTriggerQA.fill(HIST("PhiD/tight/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PhiD/tight/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PhiD/tight/fSE_particle"), kstar); + registryTriggerQA.fill(HIST("PhiD/tight/fPhiPtVskstar"), vecPhi.at(phi1).Pt(), kstar); + registryTriggerQA.fill(HIST("PhiD/tight/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("PhiD/tight/fPhiInvMassVskstar"), vecPhi.at(phi1).M(), kstar); } } } @@ -2065,17 +2434,29 @@ struct CFFilterAll { continue; } kstar = getkstar(vecPhi.at(phi1), vecAntiDeuteron.at(d1)); - registry.fill(HIST("PhiD/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("PhiD/fZvtx"), col.posZ()); - registry.fill(HIST("PhiD/fSE_antiparticle"), kstar); - registry.fill(HIST("PhiD/fPhiPtVskstar"), vecPhi.at(phi1).Pt(), kstar); - registry.fill(HIST("PhiD/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); - registry.fill(HIST("PhiD/fPhiInvMassVskstar"), vecPhi.at(phi1).M(), kstar); + registryTriggerQA.fill(HIST("PhiD/all/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PhiD/all/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PhiD/all/fSE_antiparticle"), kstar); + registryTriggerQA.fill(HIST("PhiD/all/fPhiPtVskstar"), vecPhi.at(phi1).Pt(), kstar); + registryTriggerQA.fill(HIST("PhiD/all/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("PhiD/all/fPhiInvMassVskstar"), vecPhi.at(phi1).M(), kstar); if (kstar < TriggerSelections.limits->get("Loose Limit", "PhiD")) { signalLooseLimit[cf_trigger::kPhiD] += 1; + registryTriggerQA.fill(HIST("PhiD/loose/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PhiD/loose/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PhiD/loose/fSE_antiparticle"), kstar); + registryTriggerQA.fill(HIST("PhiD/loose/fPhiPtVskstar"), vecPhi.at(phi1).Pt(), kstar); + registryTriggerQA.fill(HIST("PhiD/loose/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("PhiD/loose/fPhiInvMassVskstar"), vecPhi.at(phi1).M(), kstar); if (kstar < TriggerSelections.limits->get("Tight Limit", "PhiD") && vecPhi.at(phi1).M() > PhiSelections.tightInvMassLow.value && vecPhi.at(phi1).M() < PhiSelections.tightInvMassUp.value) { signalTightLimit[cf_trigger::kPhiD] += 1; + registryTriggerQA.fill(HIST("PhiD/tight/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("PhiD/tight/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("PhiD/tight/fSE_antiparticle"), kstar); + registryTriggerQA.fill(HIST("PhiD/tight/fPhiPtVskstar"), vecPhi.at(phi1).Pt(), kstar); + registryTriggerQA.fill(HIST("PhiD/tight/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("PhiD/tight/fPhiInvMassVskstar"), vecPhi.at(phi1).M(), kstar); } } } @@ -2089,17 +2470,29 @@ struct CFFilterAll { continue; } kstar = getkstar(vecRho.at(r1), vecDeuteron.at(d1)); - registry.fill(HIST("RhoD/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("RhoD/fZvtx"), col.posZ()); - registry.fill(HIST("RhoD/fSE_particle"), kstar); - registry.fill(HIST("RhoD/fRhoPtVskstar"), vecRho.at(r1).Pt(), kstar); - registry.fill(HIST("RhoD/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); - registry.fill(HIST("RhoD/fRhoInvMassVskstar"), vecRho.at(r1).M(), kstar); + registryTriggerQA.fill(HIST("RhoD/all/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("RhoD/all/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("RhoD/all/fSE_particle"), kstar); + registryTriggerQA.fill(HIST("RhoD/all/fRhoPtVskstar"), vecRho.at(r1).Pt(), kstar); + registryTriggerQA.fill(HIST("RhoD/all/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("RhoD/all/fRhoInvMassVskstar"), vecRho.at(r1).M(), kstar); if (kstar < TriggerSelections.limits->get("Loose Limit", "RhoD")) { signalLooseLimit[cf_trigger::kRhoD] += 1; + registryTriggerQA.fill(HIST("RhoD/loose/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("RhoD/loose/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("RhoD/loose/fSE_particle"), kstar); + registryTriggerQA.fill(HIST("RhoD/loose/fRhoPtVskstar"), vecRho.at(r1).Pt(), kstar); + registryTriggerQA.fill(HIST("RhoD/loose/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("RhoD/loose/fRhoInvMassVskstar"), vecRho.at(r1).M(), kstar); if (kstar < TriggerSelections.limits->get("Tight Limit", "RhoD") && vecRho.at(r1).M() > RhoSelections.tightInvMassLow.value && vecRho.at(r1).M() < RhoSelections.tightInvMassUp.value) { signalTightLimit[cf_trigger::kRhoD] += 1; + registryTriggerQA.fill(HIST("RhoD/tight/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("RhoD/tight/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("RhoD/tight/fSE_particle"), kstar); + registryTriggerQA.fill(HIST("RhoD/tight/fRhoPtVskstar"), vecRho.at(r1).Pt(), kstar); + registryTriggerQA.fill(HIST("RhoD/tight/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("RhoD/tight/fRhoInvMassVskstar"), vecRho.at(r1).M(), kstar); } } } @@ -2110,17 +2503,29 @@ struct CFFilterAll { continue; } kstar = getkstar(vecRho.at(r1), vecAntiDeuteron.at(d1)); - registry.fill(HIST("RhoD/fMultiplicity"), col.multNTracksPV()); - registry.fill(HIST("RhoD/fZvtx"), col.posZ()); - registry.fill(HIST("RhoD/fSE_antiparticle"), kstar); - registry.fill(HIST("RhoD/fRhoPtVskstar"), vecRho.at(r1).Pt(), kstar); - registry.fill(HIST("RhoD/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); - registry.fill(HIST("RhoD/fRhoInvMassVskstar"), vecRho.at(r1).M(), kstar); + registryTriggerQA.fill(HIST("RhoD/all/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("RhoD/all/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("RhoD/all/fSE_antiparticle"), kstar); + registryTriggerQA.fill(HIST("RhoD/all/fRhoPtVskstar"), vecRho.at(r1).Pt(), kstar); + registryTriggerQA.fill(HIST("RhoD/all/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("RhoD/all/fRhoInvMassVskstar"), vecRho.at(r1).M(), kstar); if (kstar < TriggerSelections.limits->get("Loose Limit", "RhoD")) { signalLooseLimit[cf_trigger::kRhoD] += 1; + registryTriggerQA.fill(HIST("RhoD/loose/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("RhoD/loose/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("RhoD/loose/fSE_antiparticle"), kstar); + registryTriggerQA.fill(HIST("RhoD/loose/fRhoPtVskstar"), vecRho.at(r1).Pt(), kstar); + registryTriggerQA.fill(HIST("RhoD/loose/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("RhoD/loose/fRhoInvMassVskstar"), vecRho.at(r1).M(), kstar); if (kstar < TriggerSelections.limits->get("Tight Limit", "RhoD") && vecRho.at(r1).M() > RhoSelections.tightInvMassLow.value && vecRho.at(r1).M() < RhoSelections.tightInvMassUp.value) { signalTightLimit[cf_trigger::kRhoD] += 1; + registryTriggerQA.fill(HIST("RhoD/tight/fMultiplicity"), col.multNTracksPV()); + registryTriggerQA.fill(HIST("RhoD/tight/fZvtx"), col.posZ()); + registryTriggerQA.fill(HIST("RhoD/tight/fSE_antiparticle"), kstar); + registryTriggerQA.fill(HIST("RhoD/tight/fRhoPtVskstar"), vecRho.at(r1).Pt(), kstar); + registryTriggerQA.fill(HIST("RhoD/tight/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("RhoD/tight/fRhoInvMassVskstar"), vecRho.at(r1).M(), kstar); } } } @@ -2129,22 +2534,22 @@ struct CFFilterAll { for (int i = 0; i < cf_trigger::kNTriggers; i++) { if (signalLooseLimit[i] > 0) { - registry.fill(HIST("fProcessedEvents"), 3 + 2 * i); // need offset for filling + registryTriggerQA.fill(HIST("fProcessedEvents"), 3 + 2 * i); // need offset for filling keepEventLooseLimit[i] = true; } if (signalTightLimit[i] > 0) { - registry.fill(HIST("fProcessedEvents"), 3 + 2 * i + 1); // need offset for filling + registryTriggerQA.fill(HIST("fProcessedEvents"), 3 + 2 * i + 1); // need offset for filling keepEventTightLimit[i] = true; } for (int j = i; j < cf_trigger::kNTriggers; j++) { if (signalLooseLimit[i] > 0 && signalLooseLimit[j]) { - registry.fill(HIST("fTriggerCorrelations"), 2 * i, 2 * j); + registryTriggerQA.fill(HIST("fTriggerCorrelations"), 2 * i, 2 * j); } if (signalLooseLimit[i] > 0 && signalTightLimit[j]) { // only one combination needed, fill only entries above diagonal - registry.fill(HIST("fTriggerCorrelations"), 2 * i, 2 * j + 1); + registryTriggerQA.fill(HIST("fTriggerCorrelations"), 2 * i, 2 * j + 1); } if (signalTightLimit[i] > 0 && signalTightLimit[j]) { - registry.fill(HIST("fTriggerCorrelations"), 2 * i + 1, 2 * j + 1); + registryTriggerQA.fill(HIST("fTriggerCorrelations"), 2 * i + 1, 2 * j + 1); } } } @@ -2159,7 +2564,7 @@ struct CFFilterAll { keepEventLooseLimit[cf_trigger::kLD] || keepEventLooseLimit[cf_trigger::kPhiD] || keepEventLooseLimit[cf_trigger::kRhoD]) { - registry.fill(HIST("fProcessedEvents"), 1); + registryTriggerQA.fill(HIST("fProcessedEvents"), 1); } if (keepEventTightLimit[cf_trigger::kPPP] || @@ -2172,7 +2577,7 @@ struct CFFilterAll { keepEventTightLimit[cf_trigger::kLD] || keepEventTightLimit[cf_trigger::kPhiD] || keepEventTightLimit[cf_trigger::kRhoD]) { - registry.fill(HIST("fProcessedEvents"), 2); + registryTriggerQA.fill(HIST("fProcessedEvents"), 2); } tags(keepEventTightLimit[cf_trigger::kPPP], keepEventLooseLimit[cf_trigger::kPPP], From 51c7d26cc2fe5e485b57dc4d197e2849cd600cc9 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Fri, 25 Apr 2025 08:08:12 +0200 Subject: [PATCH 1094/1650] [PWGLF,Trigger] Add strangeness helper in filter and fix daughter index check (#10980) --- EventFiltering/CMakeLists.txt | 2 +- EventFiltering/PWGLF/filterdoublephi.cxx | 2 +- EventFiltering/PWGLF/filterf1proton.cxx | 305 +++++++++++++++++++++- PWGLF/Tasks/Resonances/doublephimeson.cxx | 5 +- 4 files changed, 303 insertions(+), 11 deletions(-) diff --git a/EventFiltering/CMakeLists.txt b/EventFiltering/CMakeLists.txt index a6001817596..554431848c9 100644 --- a/EventFiltering/CMakeLists.txt +++ b/EventFiltering/CMakeLists.txt @@ -109,7 +109,7 @@ o2physics_add_dpl_workflow(heavy-neutral-meson-filter o2physics_add_dpl_workflow(lf-f1proton-filter SOURCES PWGLF/filterf1proton.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DetectorsBase + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore KFParticle::KFParticle O2::DetectorsBase COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(lf-doublephi-filter diff --git a/EventFiltering/PWGLF/filterdoublephi.cxx b/EventFiltering/PWGLF/filterdoublephi.cxx index 241a70aef9e..dbaec8fc474 100644 --- a/EventFiltering/PWGLF/filterdoublephi.cxx +++ b/EventFiltering/PWGLF/filterdoublephi.cxx @@ -259,7 +259,7 @@ struct filterdoublephi { auto i6 = std::distance(phiresonance.begin(), if2); PhiVectorDummy2 = phiresonance.at(i6); PhiPair = PhiVectorDummy + PhiVectorDummy2; - if (!(Phid1Index.at(i5) == Phid1Index.at(i6) && Phid2Index.at(i5) == Phid2Index.at(i6)) && PhiPair.M() > MinPhiPairMass && PhiPair.M() < MaxPhiPairMass && PhiPair.Pt() > MinPhiPairPt) { + if (!(Phid1Index.at(i5) == Phid1Index.at(i6) || Phid2Index.at(i5) == Phid2Index.at(i6)) && PhiPair.M() > MinPhiPairMass && PhiPair.M() < MaxPhiPairMass && PhiPair.Pt() > MinPhiPairPt) { qaRegistry.fill(HIST("hInvMassDoublePhi"), PhiPair.M(), PhiPair.Pt()); keepEventDoublePhi = true; } diff --git a/EventFiltering/PWGLF/filterf1proton.cxx b/EventFiltering/PWGLF/filterf1proton.cxx index 0d3d643207e..ed193004ad1 100644 --- a/EventFiltering/PWGLF/filterf1proton.cxx +++ b/EventFiltering/PWGLF/filterf1proton.cxx @@ -17,12 +17,19 @@ #include #include #include +#include #include #include #include #include #include - +#include +#include "DataFormatsParameters/GRPMagField.h" +#include "DataFormatsParameters/GRPObject.h" +#include "ReconstructionDataFormats/Track.h" +#include "ReconstructionDataFormats/TrackParametrization.h" +#include "Common/Core/RecoDecay.h" +#include "Common/Core/trackUtilities.h" #include "../filterTables.h" #include "Framework/ASoAHelpers.h" #include "Framework/AnalysisDataModel.h" @@ -36,6 +43,8 @@ #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/PIDResponse.h" #include "PWGLF/DataModel/LFStrangenessTables.h" +#include "PWGLF/Utils/strangenessBuilderHelper.h" +#include "PWGLF/DataModel/LFParticleIdentification.h" #include "CommonConstants/PhysicsConstants.h" #include "DataFormatsTPC/BetheBlochAleph.h" #include "CCDB/BasicCCDBManager.h" @@ -151,8 +160,22 @@ struct filterf1proton { }, OutputObjHandlingPolicy::AnalysisObject}; + // helper object + o2::pwglf::strangenessBuilderHelper mStraHelper; + int mRunNumber = 0; + float mBz = 0.; + void init(o2::framework::InitContext&) { + // set V0 parameters in the helper + mStraHelper.v0selections.minCrossedRows = ConfDaughTPCnclsMin; + mStraHelper.v0selections.dcanegtopv = ConfDaughDCAMin; + mStraHelper.v0selections.dcapostopv = ConfDaughDCAMin; // get the minimum one + mStraHelper.v0selections.v0cospa = ConfV0CPAMin; + mStraHelper.v0selections.dcav0dau = ConfV0DCADaughMax; + mStraHelper.v0selections.v0radius = ConfV0TranRadV0Min; + mStraHelper.v0selections.maxDaughterEta = ConfDaughEta; + ccdb->setURL(url.value); ccdbApi.init(url); ccdb->setCaching(true); @@ -163,6 +186,26 @@ struct filterf1proton { hProcessedEvents->GetXaxis()->SetBinLabel(3, aod::filtering::TriggerEventF1Proton::columnLabel()); } + void initCCDB(int run) + { + if (run != mRunNumber) { + mRunNumber = run; + o2::parameters::GRPMagField* grpmag = ccdb->getForRun("GLO/Config/GRPMagField", run); + o2::base::Propagator::initFieldFromGRP(grpmag); + mBz = static_cast(grpmag->getNominalL3Field()); + mStraHelper.fitter.setBz(mBz); + } + if (!mStraHelper.lut) { /// done only once + ccdb->setURL(url.value); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setFatalWhenNull(true); + auto* lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get("GLO/Param/MatLUT")); + o2::base::Propagator::Instance()->setMatLUT(lut); + mStraHelper.lut = lut; + } + } + template bool isSelectedEvent(T const& col) { @@ -257,10 +300,10 @@ struct filterf1proton { bool isSelectedV0Daughter(T const& track, float charge, double nsigmaV0Daughter) { const auto eta = track.eta(); - const auto tpcNClsF = track.tpcNClsFound(); + // const auto tpcNClsF = track.tpcNClsFound(); + const auto tpcNClsF = track.tpcNClsCrossedRows(); const auto dcaXY = track.dcaXY(); const auto sign = track.sign(); - if (charge < 0 && sign > 0) { return false; } @@ -276,7 +319,6 @@ struct filterf1proton { if (std::abs(dcaXY) < ConfDaughDCAMin) { return false; } - if (std::abs(nsigmaV0Daughter) > ConfDaughPIDCuts) { return false; } @@ -435,7 +477,7 @@ struct filterf1proton { // using EventCandidates = soa::Join; using EventCandidates = aod::Collisions; using ResoV0s = aod::V0Datas; - using PrimaryTrackCandidates = soa::Filtered>; @@ -572,8 +614,8 @@ struct filterf1proton { if (!SelectionV0(collision, v0)) { continue; } - auto postrack = v0.template posTrack_as(); - auto negtrack = v0.template negTrack_as(); + auto postrack = v0.posTrack_as(); + auto negtrack = v0.negTrack_as(); double nTPCSigmaPos[1]{postrack.tpcNSigmaPi()}; double nTPCSigmaNeg[1]{negtrack.tpcNSigmaPi()}; if (ConfUseManualPIDdaughterPion) { @@ -655,7 +697,254 @@ struct filterf1proton { } tags(keepEventF1Proton); } - PROCESS_SWITCH(filterf1proton, processF1Proton, "Process for trigger", true); + PROCESS_SWITCH(filterf1proton, processF1Proton, "Process for trigger", false); + TLorentzVector v0Dummy; + void processF1ProtonHelper(EventCandidates::iterator const& collision, aod::BCsWithTimestamps const&, PrimaryTrackCandidates const& tracks, aod::V0s const& V0s) + { + initCCDB(collision.bc().runNumber()); + bool keepEventF1Proton = false; + int numberF1 = 0; + if (isSelectedEvent(collision)) { + if (ConfUseManualPIDproton || ConfUseManualPIDkaon || ConfUseManualPIDpion) { + currentRunNumber = collision.bc_as().runNumber(); + if (currentRunNumber != lastRunNumber) { + auto bc = collision.bc_as(); + if (ConfUseManualPIDproton) { + BBProton = setValuesBB(ccdbApi, bc, ConfPIDBBProton); + BBAntiproton = setValuesBB(ccdbApi, bc, ConfPIDBBAntiProton); + } + if (ConfUseManualPIDpion) { + BBPion = setValuesBB(ccdbApi, bc, ConfPIDBBPion); + BBAntipion = setValuesBB(ccdbApi, bc, ConfPIDBBAntiPion); + } + if (ConfUseManualPIDkaon) { + BBKaon = setValuesBB(ccdbApi, bc, ConfPIDBBKaon); + BBAntikaon = setValuesBB(ccdbApi, bc, ConfPIDBBAntiKaon); + } + lastRunNumber = currentRunNumber; + } + } + + // keep track of indices + std::vector PionIndex = {}; + std::vector KaonIndex = {}; + std::vector ProtonIndex = {}; + + // keep charge of track + std::vector PionCharge = {}; + std::vector KaonCharge = {}; + std::vector ProtonCharge = {}; + + // Prepare vectors for different species + std::vector protons, kaons, pions, kshorts; + float kstar = 999.f; + + for (auto& track : tracks) { + + if (!isSelectedTrack(track)) + continue; + qaRegistry.fill(HIST("hDCAxy"), track.dcaXY()); + qaRegistry.fill(HIST("hDCAz"), track.dcaZ()); + qaRegistry.fill(HIST("hEta"), track.eta()); + qaRegistry.fill(HIST("hPhi"), track.phi()); + double nTPCSigmaP[3]{track.tpcNSigmaPi(), track.tpcNSigmaKa(), track.tpcNSigmaPr()}; + double nTPCSigmaN[3]{track.tpcNSigmaPi(), track.tpcNSigmaKa(), track.tpcNSigmaPr()}; + if (ConfUseManualPIDproton) { + auto bgScalingProton = 1 / massPr; // momentum scaling? + if (BBProton.size() == 6) + nTPCSigmaP[2] = updatePID(track, bgScalingProton, BBProton); + if (BBAntiproton.size() == 6) + nTPCSigmaN[2] = updatePID(track, bgScalingProton, BBAntiproton); + } + if (ConfUseManualPIDkaon) { + auto bgScalingKaon = 1 / massKa; // momentum scaling? + if (BBKaon.size() == 6) + nTPCSigmaP[1] = updatePID(track, bgScalingKaon, BBKaon); + if (BBAntikaon.size() == 6) + nTPCSigmaN[1] = updatePID(track, bgScalingKaon, BBAntikaon); + } + if (ConfUseManualPIDpion) { + auto bgScalingPion = 1 / massPi; // momentum scaling? + if (BBPion.size() == 6) + nTPCSigmaP[0] = updatePID(track, bgScalingPion, BBPion); + if (BBAntipion.size() == 6) + nTPCSigmaN[0] = updatePID(track, bgScalingPion, BBAntipion); + } + + if ((track.sign() > 0 && SelectionPID(track, strategyPIDPion, 0, nTPCSigmaP[0])) || (track.sign() < 0 && SelectionPID(track, strategyPIDPion, 0, nTPCSigmaN[0]))) { + ROOT::Math::PtEtaPhiMVector temp(track.pt(), track.eta(), track.phi(), massPi); + pions.push_back(temp); + PionIndex.push_back(track.globalIndex()); + PionCharge.push_back(track.sign()); + if (track.sign() > 0) { + qaRegistry.fill(HIST("hNsigmaPtpionTPC"), nTPCSigmaP[0], track.pt()); + } + if (track.sign() < 0) { + qaRegistry.fill(HIST("hNsigmaPtpionTPC"), nTPCSigmaN[0], track.pt()); + } + if (track.hasTOF()) { + qaRegistry.fill(HIST("hNsigmaPtpionTOF"), track.tofNSigmaPi(), track.pt()); + } + } + + if ((track.pt() > cMinKaonPt && track.sign() > 0 && SelectionPID(track, strategyPIDKaon, 1, nTPCSigmaP[1])) || (track.pt() > cMinKaonPt && track.sign() < 0 && SelectionPID(track, strategyPIDKaon, 1, nTPCSigmaN[1]))) { + ROOT::Math::PtEtaPhiMVector temp(track.pt(), track.eta(), track.phi(), massKa); + kaons.push_back(temp); + KaonIndex.push_back(track.globalIndex()); + KaonCharge.push_back(track.sign()); + if (track.sign() > 0) { + qaRegistry.fill(HIST("hNsigmaPtkaonTPC"), nTPCSigmaP[1], track.pt()); + } + if (track.sign() < 0) { + qaRegistry.fill(HIST("hNsigmaPtkaonTPC"), nTPCSigmaN[1], track.pt()); + } + if (track.hasTOF()) { + qaRegistry.fill(HIST("hNsigmaPtkaonTOF"), track.tofNSigmaKa(), track.pt()); + } + } + + if ((track.pt() < cMaxProtonPt && track.sign() > 0 && SelectionPID(track, strategyPIDProton, 2, nTPCSigmaP[2])) || (track.pt() < cMaxProtonPt && track.sign() < 0 && SelectionPID(track, strategyPIDProton, 2, nTPCSigmaN[2]))) { + ROOT::Math::PtEtaPhiMVector temp(track.pt(), track.eta(), track.phi(), massPr); + qaRegistry.fill(HIST("hMommentumCorr"), track.p() / track.sign(), track.p() - track.tpcInnerParam()); + if (ConfFakeProton && !isFakeProton(track)) { + protons.push_back(temp); + ProtonIndex.push_back(track.globalIndex()); + ProtonCharge.push_back(track.sign()); + } + if (track.sign() > 0) { + qaRegistry.fill(HIST("hNsigmaPtprotonTPC"), nTPCSigmaP[2], track.pt()); + } + if (track.sign() < 0) { + qaRegistry.fill(HIST("hNsigmaPtprotonTPC"), nTPCSigmaN[2], track.pt()); + } + if (track.hasTOF()) { + qaRegistry.fill(HIST("hNsigmaPtprotonTOF"), track.tofNSigmaPr(), track.pt()); + } + } + } // track loop end + + // keep track of daugher indices to avoid selfcorrelations + std::vector KshortPosDaughIndex = {}; + std::vector KshortNegDaughIndex = {}; + + for (auto& v0 : V0s) { + + auto postrack = v0.template posTrack_as(); + auto negtrack = v0.template negTrack_as(); + auto trackparpos = getTrackParCov(postrack); + auto trackparneg = getTrackParCov(negtrack); + if (!mStraHelper.buildV0Candidate(v0.collisionId(), collision.posX(), collision.posY(), collision.posZ(), postrack, negtrack, trackparpos, trackparneg)) { + continue; + } + + if (fabs(mStraHelper.v0.dcaToPV) > cMaxV0DCA) { + continue; + } + auto v0px = mStraHelper.v0.momentum[0]; + auto v0py = mStraHelper.v0.momentum[1]; + auto v0pz = mStraHelper.v0.momentum[2]; + auto pT = std::sqrt(v0px * v0px + v0py * v0py); + if (pT < ConfV0PtMin) { + continue; + } + if (std::hypot(mStraHelper.v0.position[0], mStraHelper.v0.position[1]) < ConfV0TranRadV0Min) { + continue; + } + if (std::hypot(mStraHelper.v0.position[0], mStraHelper.v0.position[1]) > ConfV0TranRadV0Max) { + continue; + } + double distovertotmom = std::hypot(mStraHelper.v0.position[0] - collision.posX(), mStraHelper.v0.position[1] - collision.posY(), mStraHelper.v0.position[2] - collision.posZ()) / (std::hypot(mStraHelper.v0.momentum[0], mStraHelper.v0.momentum[1], mStraHelper.v0.momentum[2]) + 1e-13); + if (distovertotmom * o2::constants::physics::MassK0Short > cMaxV0LifeTime) { + continue; + } + float lowmasscutks0 = 0.497 - 2.0 * cSigmaMassKs0; + float highmasscutks0 = 0.497 + 2.0 * cSigmaMassKs0; + if (mStraHelper.v0.massK0Short < lowmasscutks0 || mStraHelper.v0.massK0Short > highmasscutks0) { + continue; + } + double nTPCSigmaPos[1]{postrack.tpcNSigmaPi()}; + double nTPCSigmaNeg[1]{negtrack.tpcNSigmaPi()}; + if (ConfUseManualPIDdaughterPion) { + auto bgScalingPion = 1 / massPi; // momentum scaling? + if (BBPion.size() == 6) + nTPCSigmaPos[0] = updatePID(postrack, bgScalingPion, BBPion); + if (BBAntipion.size() == 6) + nTPCSigmaNeg[0] = updatePID(negtrack, bgScalingPion, BBAntipion); + } + if (!isSelectedV0Daughter(postrack, 1, nTPCSigmaPos[0])) { + continue; + } + if (!isSelectedV0Daughter(negtrack, -1, nTPCSigmaNeg[0])) { + continue; + } + v0Dummy.SetXYZM(v0px, v0py, v0pz, mStraHelper.v0.massK0Short); + qaRegistry.fill(HIST("hInvMassk0"), v0Dummy.M(), pT); + ROOT::Math::PtEtaPhiMVector temp(pT, v0Dummy.Eta(), v0Dummy.Phi(), mStraHelper.v0.massK0Short); + kshorts.push_back(temp); + KshortPosDaughIndex.push_back(postrack.globalIndex()); + KshortNegDaughIndex.push_back(negtrack.globalIndex()); + } + + if (pions.size() != 0 && kaons.size() != 0 && kshorts.size() != 0) { + for (auto ipion = pions.begin(); ipion != pions.end(); ++ipion) { + for (auto ikaon = kaons.begin(); ikaon != kaons.end(); ++ikaon) { + auto i1 = std::distance(pions.begin(), ipion); + auto i2 = std::distance(kaons.begin(), ikaon); + // if(PionCharge.at(i1)*KaonCharge.at(i2)>0)continue; + if (PionIndex.at(i1) == KaonIndex.at(i2)) + continue; + for (auto ikshort = kshorts.begin(); ikshort != kshorts.end(); ++ikshort) { + auto i3 = std::distance(kshorts.begin(), ikshort); + if (PionIndex.at(i1) == KshortPosDaughIndex.at(i3)) + continue; + if (PionIndex.at(i1) == KshortNegDaughIndex.at(i3)) + continue; + KKs0Vector = kaons.at(i2) + kshorts.at(i3); + if (KKs0Vector.M() > cMaxMassKKs0) + continue; + F1Vector = KKs0Vector + pions.at(i1); + if (F1Vector.M() > cMaxMassF1) + continue; + if (F1Vector.Pt() < cMinF1Pt) + continue; + if (PionCharge.at(i1) * KaonCharge.at(i2) > 0) { + qaRegistry.fill(HIST("hInvMassf1Like"), F1Vector.M(), F1Vector.Pt()); + continue; + } + qaRegistry.fill(HIST("hInvMassf1"), F1Vector.M(), F1Vector.Pt()); + numberF1 = numberF1 + 1; + for (auto iproton = protons.begin(); iproton != protons.end(); ++iproton) { + auto i4 = std::distance(protons.begin(), iproton); + if (ProtonIndex.at(i4) == PionIndex.at(i1)) + continue; + if (ProtonIndex.at(i4) == KaonIndex.at(i2)) + continue; + if (ProtonIndex.at(i4) == KshortPosDaughIndex.at(i3)) + continue; + if (ProtonIndex.at(i4) == KshortNegDaughIndex.at(i3)) + continue; + kstar = getkstar(F1Vector, *iproton); + qaRegistry.fill(HIST("hkstarDist"), kstar); + if (kstar > cMaxRelMom) + continue; + qaRegistry.fill(HIST("hInvMassf1kstar"), F1Vector.M(), F1Vector.Pt(), kstar); + keepEventF1Proton = true; + } + } + } + } + } + } + hProcessedEvents->Fill(0.5); + if (numberF1 > 0) { + hProcessedEvents->Fill(1.5); + } + if (keepEventF1Proton) { + hProcessedEvents->Fill(2.5); + } + tags(keepEventF1Proton); + } + PROCESS_SWITCH(filterf1proton, processF1ProtonHelper, "Process for trigger with helper v0 task", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfg) diff --git a/PWGLF/Tasks/Resonances/doublephimeson.cxx b/PWGLF/Tasks/Resonances/doublephimeson.cxx index 6669df802f5..78aee4aaf9b 100644 --- a/PWGLF/Tasks/Resonances/doublephimeson.cxx +++ b/PWGLF/Tasks/Resonances/doublephimeson.cxx @@ -340,7 +340,10 @@ struct doublephimeson { // if (phitrackd1.phid2Index() == phitrackd2.phid2Index()) { // continue; // } - if (phitrackd1.phid1Index() == phitrackd2.phid1Index() && phitrackd1.phid2Index() == phitrackd2.phid2Index()) { + if (phitrackd1.phid1Index() == phitrackd2.phid1Index()) { + continue; + } + if (phitrackd1.phid2Index() == phitrackd2.phid2Index()) { continue; } Phid2.SetXYZM(phitrackd2.phiPx(), phitrackd2.phiPy(), phitrackd2.phiPz(), phitrackd2.phiMass()); From d09f26df0b5c79fc4edce82a0059420ca83bce89 Mon Sep 17 00:00:00 2001 From: aimeric-landou <46970521+aimeric-landou@users.noreply.github.com> Date: Fri, 25 Apr 2025 09:32:14 +0200 Subject: [PATCH 1095/1650] [PWGJE] eventWeight fix for fake collisions (#10959) --- PWGJE/TableProducer/derivedDataProducer.cxx | 5 ++--- PWGJE/TableProducer/jetEventWeightMCD.cxx | 4 ++-- PWGJE/Tasks/jetFinderQA.cxx | 2 +- PWGJE/Tasks/jetSpectraCharged.cxx | 10 +++------- 4 files changed, 8 insertions(+), 13 deletions(-) diff --git a/PWGJE/TableProducer/derivedDataProducer.cxx b/PWGJE/TableProducer/derivedDataProducer.cxx index a946d93b997..3398b33ce42 100644 --- a/PWGJE/TableProducer/derivedDataProducer.cxx +++ b/PWGJE/TableProducer/derivedDataProducer.cxx @@ -241,12 +241,11 @@ struct JetDerivedDataProducerTask { void processMcCollisionLabels(soa::Join::iterator const& collision, aod::McCollisions const&) { + products.jMcCollisionsLabelTable(collision.mcCollisionId()); // collision.mcCollisionId() returns -1 if collision has no associated mcCollision if (collision.has_mcCollision()) { - products.jMcCollisionsLabelTable(collision.mcCollisionId()); products.jCollisionMcInfosTable(collision.mcCollision().weight(), collision.mcCollision().getSubGeneratorId()); } else { - products.jMcCollisionsLabelTable(-1); - products.jCollisionMcInfosTable(-1.0, jetderiveddatautilities::JCollisionSubGeneratorId::none); + products.jCollisionMcInfosTable(0.0, jetderiveddatautilities::JCollisionSubGeneratorId::none); } } PROCESS_SWITCH(JetDerivedDataProducerTask, processMcCollisionLabels, "produces derived MC collision labels table", false); diff --git a/PWGJE/TableProducer/jetEventWeightMCD.cxx b/PWGJE/TableProducer/jetEventWeightMCD.cxx index 0709a362d7f..40ea278c51e 100644 --- a/PWGJE/TableProducer/jetEventWeightMCD.cxx +++ b/PWGJE/TableProducer/jetEventWeightMCD.cxx @@ -40,14 +40,14 @@ struct JetEventWeightMCDTask { void processMCDetectorLevelEventWeight(MCDetectorLevelJetTable const& jet, soa::Join const&, aod::JetMcCollisions const&) { auto collision = jet.template collision_as>(); - mcDetectorLevelWeightsTable(jet.globalIndex(), collision.mcCollision().weight()); + mcDetectorLevelWeightsTable(jet.globalIndex(), collision.weight()); } PROCESS_SWITCH(JetEventWeightMCDTask, processMCDetectorLevelEventWeight, "Fill event weight tables for detector level MC jets", false); void processMCDetectorLevelEventWiseSubtractedEventWeight(MCDetectorLevelEventWiseSubtractedJetTable const& jet, soa::Join const&, aod::JetMcCollisions const&) { auto collision = jet.template collision_as>(); - mcDetectorLevelEventWiseSubtractedWeightsTable(jet.globalIndex(), collision.mcCollision().weight()); + mcDetectorLevelEventWiseSubtractedWeightsTable(jet.globalIndex(), collision.weight()); } PROCESS_SWITCH(JetEventWeightMCDTask, processMCDetectorLevelEventWiseSubtractedEventWeight, "Fill event weight tables for detector level MC jets", false); }; diff --git a/PWGJE/Tasks/jetFinderQA.cxx b/PWGJE/Tasks/jetFinderQA.cxx index 255cecfad63..c2fd285a7a2 100644 --- a/PWGJE/Tasks/jetFinderQA.cxx +++ b/PWGJE/Tasks/jetFinderQA.cxx @@ -1191,7 +1191,7 @@ struct JetFinderQATask { aod::JetMcCollisions const&, soa::Filtered> const& tracks) { - float eventWeight = collision.mcCollision().weight(); + float eventWeight = collision.weight(); if (skipMBGapEvents && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { return; } diff --git a/PWGJE/Tasks/jetSpectraCharged.cxx b/PWGJE/Tasks/jetSpectraCharged.cxx index a1adc4e2f75..f1dfda25418 100644 --- a/PWGJE/Tasks/jetSpectraCharged.cxx +++ b/PWGJE/Tasks/jetSpectraCharged.cxx @@ -552,10 +552,7 @@ struct JetSpectraCharged { aod::JetMcCollisions const&, soa::Filtered> const& tracks) { - if (!collision.has_mcCollision()) { // the collision is fake and has no associated mc coll; skip as .mccollision() cannot be called - return; - } - float eventWeight = collision.mcCollision().weight(); + float eventWeight = collision.weight(); if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { return; } @@ -590,11 +587,10 @@ struct JetSpectraCharged { void processCollisionsWeighted(soa::Join::iterator const& collision, aod::JetMcCollisions const&) { - if (!collision.has_mcCollision()) { // the collision is fake and has no associated mc coll; skip as .mccollision() cannot be called + if (!collision.has_mcCollision()) { registry.fill(HIST("h_fakecollisions"), 0.5); - return; } - float eventWeight = collision.mcCollision().weight(); + float eventWeight = collision.weight(); registry.fill(HIST("h_collisions"), 0.5); registry.fill(HIST("h_collisions_weighted"), 0.5, eventWeight); if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { From 3651810b5fd30c233f1be35cf67e7b860564a6ae Mon Sep 17 00:00:00 2001 From: Archita-Dash <91664849+Archita-Dash@users.noreply.github.com> Date: Fri, 25 Apr 2025 09:32:43 +0200 Subject: [PATCH 1096/1650] [PWGJE] process function to study multiplicity dependence of fulljets and NEF (#10953) Co-authored-by: ALICE Action Bot --- PWGJE/Tasks/fullJetSpectraPP.cxx | 636 ++++++++++++++++++++++--------- 1 file changed, 452 insertions(+), 184 deletions(-) diff --git a/PWGJE/Tasks/fullJetSpectraPP.cxx b/PWGJE/Tasks/fullJetSpectraPP.cxx index 8cdc23ebf9c..a8eb7399502 100644 --- a/PWGJE/Tasks/fullJetSpectraPP.cxx +++ b/PWGJE/Tasks/fullJetSpectraPP.cxx @@ -49,8 +49,7 @@ using namespace o2; using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; - -using EMCCollisions = o2::soa::Join; // needed for the workaround to access EMCAL trigger bits +// using namespace jetderiveddatautilities; struct FullJetSpectrapp { @@ -61,8 +60,9 @@ struct FullJetSpectrapp { Configurable centralityMin{"centralityMin", -999.0, "minimum centrality"}; Configurable centralityMax{"centralityMax", 999.0, "maximum centrality"}; Configurable doEMCALEventWorkaround{"doEMCALEventWorkaround", false, "apply the workaround to read the EMC trigger bit by requiring a cell content in the EMCAL"}; - Configurable doMBGapTrigger{"doMBGapTrigger", true, "set to true only when using MB-Gap Trigger JJ MC"}; - Configurable doMBMC{"doMBMC", false, "set to true only when using MB MC"}; + Configurable doMBGapTrigger{"doMBGapTrigger", true, "set to true only when using MB-Gap Trigger JJ MC to reject MB events at the collision and track level"}; + // Configurable doMBMC{"doMBMC", false, "set to true only when using MB MC"}; + Configurable checkMcCollisionIsMatched{"checkMcCollisionIsMatched", false, "0: count whole MCcollisions, 1: select MCcollisions which only have their correspond collisions"}; // Jet configurables Configurable selectedJetsRadius{"selectedJetsRadius", 0.4, "resolution parameter for histograms without radius"}; @@ -84,7 +84,7 @@ struct FullJetSpectrapp { Configurable trackPhiMin{"trackPhiMin", 1.396, "minimum track phi"}; Configurable trackPhiMax{"trackPhiMax", 3.283, "maximum track phi"}; Configurable trackSelections{"trackSelections", "globalTracks", "set track selections"}; - Configurable eventSelections{"eventSelections", "sel8Full", "choose event selection"}; + Configurable eventSelections{"eventSelections", "selMCFull", "choose event selection"}; Configurable particleSelections{"particleSelections", "PhysicalPrimary", "set particle selections"}; // Cluster configurables @@ -95,13 +95,13 @@ struct FullJetSpectrapp { Configurable clusterPhiMin{"clusterPhiMin", 1.396, "minimum cluster phi"}; Configurable clusterPhiMax{"clusterPhiMax", 3.283, "maximum cluster phi"}; Configurable clusterEnergyMin{"clusterEnergyMin", 0.3, "minimum cluster energy in EMCAL (GeV)"}; - Configurable clusterTimeMin{"clusterTimeMin", -20., "minimum cluster time (ns)"}; + Configurable clusterTimeMin{"clusterTimeMin", -15., "minimum cluster time (ns)"}; Configurable clusterTimeMax{"clusterTimeMax", 15., "maximum cluster time (ns)"}; Configurable clusterRejectExotics{"clusterRejectExotics", true, "Reject exotic clusters"}; Configurable pTHatMaxMCD{"pTHatMaxMCD", 999.0, "maximum fraction of hard scattering for jet acceptance in detector MC"}; Configurable pTHatMaxMCP{"pTHatMaxMCP", 999.0, "maximum fraction of hard scattering for jet acceptance in particle MC"}; - Configurable pTHatExponent{"pTHatExponent", 4.0, "exponent of the event weight for the calculation of pTHat"}; // 6 for MB MC and 4 for JJ MC + Configurable pTHatExponent{"pTHatExponent", 4.0, "exponent of the event weight for the calculation of pTHeventSelectionBitsat"}; // 6 for MB MC and 4 for JJ MC Configurable pTHatAbsoluteMin{"pTHatAbsoluteMin", -99.0, "minimum value of pTHat"}; int trackSelection = -1; @@ -118,30 +118,40 @@ struct FullJetSpectrapp { { if (doprocessTracks) { auto h_collisions_unweighted = registry.get(HIST("h_collisions_unweighted")); - h_collisions_unweighted->GetXaxis()->SetBinLabel(1, "total events"); - h_collisions_unweighted->GetXaxis()->SetBinLabel(2, "JetsData with kTVXinEMC"); - h_collisions_unweighted->GetXaxis()->SetBinLabel(3, "JetsMCD with kTVXinEMC"); - h_collisions_unweighted->GetXaxis()->SetBinLabel(4, "Tracks with kTVXinEMC"); - h_collisions_unweighted->GetXaxis()->SetBinLabel(5, "JetsMCPMCDMatched with kTVXinEMC"); - h_collisions_unweighted->GetXaxis()->SetBinLabel(6, "JetsData w/o kTVXinEMC"); - h_collisions_unweighted->GetXaxis()->SetBinLabel(7, "JetsMCD w/o kTVXinEMC"); - h_collisions_unweighted->GetXaxis()->SetBinLabel(8, "Tracks w/o kTVXinEMC"); - h_collisions_unweighted->GetXaxis()->SetBinLabel(9, "JetsMCPMCDMatched w/o kTVXinEMC"); - h_collisions_unweighted->GetXaxis()->SetBinLabel(10, "Fake Matched MCD Jets"); - h_collisions_unweighted->GetXaxis()->SetBinLabel(11, "Fake Matched MCP Jets"); + h_collisions_unweighted->GetXaxis()->SetBinLabel(1, "AllUnweightedDetColl"); + h_collisions_unweighted->GetXaxis()->SetBinLabel(2, "UnweightedCollWithVertexZ"); + h_collisions_unweighted->GetXaxis()->SetBinLabel(3, "EMCAcceptedUnweightedColl"); + h_collisions_unweighted->GetXaxis()->SetBinLabel(4, "UnweightedCollAfterTrackSel"); } if (doprocessTracksWeighted) { auto h_collisions_weighted = registry.get(HIST("h_collisions_weighted")); - h_collisions_weighted->GetXaxis()->SetBinLabel(1, "total events"); - h_collisions_weighted->GetXaxis()->SetBinLabel(2, "JetsMCDWeighted with kTVXinEMC"); - h_collisions_weighted->GetXaxis()->SetBinLabel(3, "JetsMCPMCDMatchedWeighted with kTVXinEMC"); - h_collisions_weighted->GetXaxis()->SetBinLabel(4, "TracksWeighted with kTVXinEMC"); - h_collisions_weighted->GetXaxis()->SetBinLabel(5, "JetsMCDWeighted w/o kTVXinEMC"); - h_collisions_weighted->GetXaxis()->SetBinLabel(6, "JetsMCPMCDMatchedWeighted w/o kTVXinEMC"); - h_collisions_weighted->GetXaxis()->SetBinLabel(7, "TracksWeighted w/o kTVXinEMC"); - h_collisions_weighted->GetXaxis()->SetBinLabel(8, "Fake Matched Weighted MCD Jets"); - h_collisions_weighted->GetXaxis()->SetBinLabel(9, "Fake Matched Weighted MCP Jets"); + h_collisions_weighted->GetXaxis()->SetBinLabel(1, "AllWeightedDetColl"); + h_collisions_weighted->GetXaxis()->SetBinLabel(2, "WeightedCollWithVertexZ"); + h_collisions_weighted->GetXaxis()->SetBinLabel(3, "EMCAcceptedWeightedColl"); + h_collisions_weighted->GetXaxis()->SetBinLabel(4, "WeightedCollAfterTrackSel"); + } + + if (doprocessJetsData || doprocessJetsMCD || doprocessJetsMCDWeighted) { + auto h_Detcollision_counter = registry.get(HIST("h_Detcollision_counter")); + h_Detcollision_counter->GetXaxis()->SetBinLabel(1, "allDetColl"); + h_Detcollision_counter->GetXaxis()->SetBinLabel(2, "DetCollWithVertexZ"); + h_Detcollision_counter->GetXaxis()->SetBinLabel(3, "EMCAcceptedDetColl"); + } + + if (doprocessJetsMCP || doprocessJetsMCPWeighted) { + auto h_Partcollision_counter = registry.get(HIST("h_Partcollision_counter")); + h_Partcollision_counter->GetXaxis()->SetBinLabel(1, "allMcColl"); + h_Partcollision_counter->GetXaxis()->SetBinLabel(2, "McCollWithVertexZ"); + h_Partcollision_counter->GetXaxis()->SetBinLabel(3, "DetCollWithSize>1"); + h_Partcollision_counter->GetXaxis()->SetBinLabel(4, "EMCAcceptedDetColl"); + } + + if (doprocessJetsMCPMCDMatched || doprocessJetsMCPMCDMatchedWeighted) { + auto h_Matchedcollision_counter = registry.get(HIST("h_Matchedcollision_counter")); + h_Matchedcollision_counter->GetXaxis()->SetBinLabel(1, "allDetColl"); + h_Matchedcollision_counter->GetXaxis()->SetBinLabel(2, "DetCollWithVertexZ"); + h_Matchedcollision_counter->GetXaxis()->SetBinLabel(3, "EMCAcceptedDetColl"); } } @@ -187,6 +197,8 @@ struct FullJetSpectrapp { // Jet QA histograms if (doprocessJetsData || doprocessJetsMCD || doprocessJetsMCDWeighted) { + registry.add("h_Detcollision_counter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.}}}); + registry.add("h_full_jet_pt", "#it{p}_{T,jet};#it{p}_{T_jet} (GeV/#it{c});entries", {HistType::kTH1F, {{350, 0., 350.}}}); registry.add("h_full_jet_pt_pTHatcut", "#it{p}_{T,jet};#it{p}_{T_jet} (GeV/#it{c});entries", {HistType::kTH1F, {{350, 0., 350.}}}); registry.add("h_full_jet_eta", "jet #eta;#eta_{jet};entries", {HistType::kTH1F, {{100, -1., 1.}}}); @@ -216,6 +228,8 @@ struct FullJetSpectrapp { registry.add("h2_jet_etaphi", "jet #eta vs jet #varphi; #eta_{jet};#varphi_{jet}", {HistType::kTH2F, {{100, -1., 1.}, {160, -1., 7.}}}); } if (doprocessJetsMCP || doprocessJetsMCPWeighted) { + registry.add("h_Partcollision_counter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); + registry.add("h_full_mcpjet_tablesize", "", {HistType::kTH1F, {{4, 0., 5.}}}); registry.add("h_full_mcpjet_ntracks", "", {HistType::kTH1F, {{200, -0.5, 200.}}}); registry.add("h_full_jet_pt_part", "jet pT;#it{p}_{T_jet} (GeV/#it{c});entries", {HistType::kTH1F, {{350, 0., 350.}}}); @@ -238,9 +252,14 @@ struct FullJetSpectrapp { registry.add("h2_track_etaphi_part", "jet_track #eta vs jet_track #varphi; #eta_{track};#varphi_{track}", {HistType::kTH2F, {{500, -5., 5.}, {160, -1., 7.}}}); registry.add("h2_jet_etaphi_part", "jet #eta vs jet #varphi; #eta_{jet};#varphi_{jet}", {HistType::kTH2F, {{100, -1., 1.}, {160, -1., 7.}}}); + + registry.add("h_NOmcpemcalcollisions", "event status;entries", {HistType::kTH1F, {{100, 0., 100.}}}); + registry.add("h_mcpemcalcollisions", "event status;entries", {HistType::kTH1F, {{100, 0., 100.}}}); } if (doprocessJetsMCPMCDMatched || doprocessJetsMCPMCDMatchedWeighted) { + registry.add("h_Matchedcollision_counter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); + registry.add("h_full_matchedmcdjet_tablesize", "", {HistType::kTH1F, {{350, 0., 350.}}}); registry.add("h_full_matchedmcpjet_tablesize", "", {HistType::kTH1F, {{350, 0., 350.}}}); registry.add("h_full_matchedmcdjet_ntracks", "", {HistType::kTH1F, {{200, -0.5, 200.}}}); @@ -269,7 +288,14 @@ struct FullJetSpectrapp { registry.add("h2_full_fakemcdjets", "Fake MCD Jets; p_{T,det} (GeV/c); NCounts", {HistType::kTH2F, {{350, 0., 350.}, {100, 0., 100.}}}); registry.add("h2_full_fakemcpjets", "Fake MCP Jets; p_{T,part} (GeV/c); NCounts", {HistType::kTH2F, {{350, 0., 350.}, {100, 0., 100.}}}); // Response Matrix - registry.add("h_full_jet_ResponseMatrix", "Full Jets Response Matrix; p_{T,det} (GeV/c); p_{T,part} (GeV/c)", {HistType::kTH2F, {{200, 0., 200.}, {200, 0., 200.}}}); + registry.add("h_full_jet_ResponseMatrix", "Full Jets Response Matrix; p_{T,det} (GeV/c); p_{T,part} (GeV/c)", {HistType::kTH2F, {{350, 0., 350.}, {350, 0., 350.}}}); + } + + if (doprocessCollisionsWeightedWithMultiplicity || doprocessMBCollisionsWithMultiplicity) { + registry.add("h_FT0Mults_occupancy", "", {HistType::kTH1F, {{3500, 0., 3500.}}}); + registry.add("h2_full_jet_FT0Amplitude", "; FT0C Amplitude; Counts", {HistType::kTH1F, {{3500, 0., 3500.}}}); + registry.add("h2_full_jet_jetpTDetVsFT0Mults", "; p_{T,det} (GeV/c); FT0C Multiplicity", {HistType::kTH2F, {{350, 0., 350.}, {3500, 0., 3500.}}}); + registry.add("h3_full_jet_jetpTDet_FT0Mults_NEF", "; p_{T,det} (GeV/c); FT0C Multiplicity, NEF", {HistType::kTH3F, {{350, 0., 350.}, {3500, 0., 3500.}, {105, 0.0, 1.05}}}); } // Label the histograms @@ -277,6 +303,9 @@ struct FullJetSpectrapp { } // init + using EMCCollisionsData = o2::soa::Join; // JetCollisions with EMCAL Collision Labels + using EMCCollisionsMCD = o2::soa::Join; // where, JetCollisionsMCD = JetCollisions+JMcCollisionLbs + using FullJetTableDataJoined = soa::Join; using JetTableMCDJoined = soa::Join; using JetTableMCDWeightedJoined = soa::Join; @@ -297,6 +326,7 @@ struct FullJetSpectrapp { aod::EMCALClusterDefinition clusterDefinition = aod::emcalcluster::getClusterDefinitionFromString(clusterDefinitionS.value); Filter clusterFilter = (aod::jcluster::definition == static_cast(clusterDefinition) && aod::jcluster::eta > clusterEtaMin && aod::jcluster::eta < clusterEtaMax && aod::jcluster::phi >= clusterPhiMin && aod::jcluster::phi <= clusterPhiMax && aod::jcluster::energy >= clusterEnergyMin && aod::jcluster::time > clusterTimeMin && aod::jcluster::time < clusterTimeMax && (clusterRejectExotics && aod::jcluster::isExotic != true)); Preslice JetMCPPerMcCollision = aod::jet::mcCollisionId; + PresliceUnsorted> CollisionsPerMCPCollision = aod::jmccollisionlb::mcCollisionId; template bool isAcceptedJet(U const& jet) @@ -471,37 +501,37 @@ struct FullJetSpectrapp { return; } - if (jetBase.has_matchedJetGeo()) { // geometrical jet matching only needed for pp - here,matching Base(Det.level) with Tag (Part. level) jets - registry.fill(HIST("h_full_matchedmcdjet_tablesize"), jetBase.size(), weight); - registry.fill(HIST("h_full_matchedmcdjet_ntracks"), jetBase.tracksIds().size(), weight); - registry.fill(HIST("h2_matchedjet_etaphiDet"), jetBase.eta(), jetBase.phi(), weight); + if (jetBase.has_matchedJetGeo()) { // geometrical jet matching only needed for pp - here,matching Base(Det.level) with Tag (Part. level) jets + registry.fill(HIST("h_full_matchedmcdjet_tablesize"), jetBase.size(), weight); + registry.fill(HIST("h_full_matchedmcdjet_ntracks"), jetBase.tracksIds().size(), weight); + registry.fill(HIST("h2_matchedjet_etaphiDet"), jetBase.eta(), jetBase.phi(), weight); - for (auto& jetTag : jetBase.template matchedJetGeo_as>()) { - if (jetTag.pt() > pTHatMaxMCP * pTHat || pTHat < pTHatAbsoluteMin) { // MCP outlier rejection - continue; - } - auto deltaEta = jetBase.eta() - jetTag.eta(); - auto deltaPhi = jetBase.phi() - jetTag.phi(); - auto deltaR = jetutilities::deltaR(jetBase, jetTag); - - registry.fill(HIST("h_full_jet_deltaR"), deltaR, weight); - registry.fill(HIST("h_full_matchedmcpjet_tablesize"), jetTag.size(), weight); - registry.fill(HIST("h_full_matchedmcpjet_ntracks"), jetTag.tracksIds().size(), weight); - registry.fill(HIST("h2_matchedjet_etaphiPart"), jetTag.eta(), jetTag.phi(), weight); - registry.fill(HIST("h2_matchedjet_deltaEtaCorr"), jetBase.eta(), jetTag.eta(), weight); - registry.fill(HIST("h2_matchedjet_deltaPhiCorr"), jetBase.phi(), jetTag.phi(), weight); - - // JES for fulljets - registry.fill(HIST("h2_full_jet_energyscaleDet"), jetBase.pt(), (jetBase.pt() - jetTag.pt()) / jetTag.pt(), weight); - registry.fill(HIST("h2_full_jet_energyscalePart"), jetTag.pt(), (jetBase.pt() - jetTag.pt()) / jetTag.pt(), weight); - registry.fill(HIST("h3_full_jet_energyscalePart"), jetBase.r() / 100.0, jetTag.pt(), (jetBase.pt() - jetTag.pt()) / jetTag.pt(), weight); - registry.fill(HIST("h2_full_jet_etaresolutionPart"), jetTag.pt(), deltaEta / jetTag.eta(), weight); - registry.fill(HIST("h2_full_jet_phiresolutionPart"), jetTag.pt(), deltaPhi / jetTag.phi(), weight); - - // Response Matrix - registry.fill(HIST("h_full_jet_ResponseMatrix"), jetBase.pt(), jetTag.pt(), weight); // MCD vs MCP jet pT - } // jetTag - } // jetBase + for (auto& jetTag : jetBase.template matchedJetGeo_as>()) { + if (jetTag.pt() > pTHatMaxMCP * pTHat || pTHat < pTHatAbsoluteMin) { // MCP outlier rejection + continue; + } + auto deltaEta = jetBase.eta() - jetTag.eta(); + auto deltaPhi = jetBase.phi() - jetTag.phi(); + auto deltaR = jetutilities::deltaR(jetBase, jetTag); + + registry.fill(HIST("h_full_jet_deltaR"), deltaR, weight); + registry.fill(HIST("h_full_matchedmcpjet_tablesize"), jetTag.size(), weight); + registry.fill(HIST("h_full_matchedmcpjet_ntracks"), jetTag.tracksIds().size(), weight); + registry.fill(HIST("h2_matchedjet_etaphiPart"), jetTag.eta(), jetTag.phi(), weight); + registry.fill(HIST("h2_matchedjet_deltaEtaCorr"), jetBase.eta(), jetTag.eta(), weight); + registry.fill(HIST("h2_matchedjet_deltaPhiCorr"), jetBase.phi(), jetTag.phi(), weight); + + // JES for fulljets + registry.fill(HIST("h2_full_jet_energyscaleDet"), jetBase.pt(), (jetBase.pt() - jetTag.pt()) / jetTag.pt(), weight); + registry.fill(HIST("h2_full_jet_energyscalePart"), jetTag.pt(), (jetBase.pt() - jetTag.pt()) / jetTag.pt(), weight); + registry.fill(HIST("h3_full_jet_energyscalePart"), jetBase.r() / 100.0, jetTag.pt(), (jetBase.pt() - jetTag.pt()) / jetTag.pt(), weight); + registry.fill(HIST("h2_full_jet_etaresolutionPart"), jetTag.pt(), deltaEta / jetTag.eta(), weight); + registry.fill(HIST("h2_full_jet_phiresolutionPart"), jetTag.pt(), deltaPhi / jetTag.phi(), weight); + + // Response Matrix + registry.fill(HIST("h_full_jet_ResponseMatrix"), jetBase.pt(), jetTag.pt(), weight); // MCD vs MCP jet pT + } // jetTag + } // jetBase } void processDummy(aod::JetCollisions const&) @@ -509,31 +539,34 @@ struct FullJetSpectrapp { } PROCESS_SWITCH(FullJetSpectrapp, processDummy, "dummy task", true); - void processJetsData(soa::Filtered::iterator const& collision, FullJetTableDataJoined const& jets, aod::JetTracks const&, aod::JetClusters const&) + void processJetsData(soa::Filtered::iterator const& collision, FullJetTableDataJoined const& jets, aod::JetTracks const&, aod::JetClusters const&) { - registry.fill(HIST("h_collisions_unweighted"), 1.0); // total events bool eventAccepted = false; + registry.fill(HIST("h_Detcollision_counter"), 0.5); - // if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { - // return; - // } - + if (fabs(collision.posZ()) > VertexZCut) { + return; + } + registry.fill(HIST("h_Detcollision_counter"), 1.5); + if (doMBGapTrigger && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + return; + } + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, doMBGapTrigger)) { + return; + } if (doEMCALEventWorkaround) { if (collision.isEmcalReadout() && !collision.isAmbiguous()) { // i.e. EMCAL has a cell content eventAccepted = true; if (collision.alias_bit(kTVXinEMC)) { - registry.fill(HIST("h_collisions_unweighted"), 2.0); // JetsData with kTVXinEMC } } } else { if (!collision.isAmbiguous() && jetderiveddatautilities::eventEMCAL(collision) && collision.alias_bit(kTVXinEMC)) { eventAccepted = true; - registry.fill(HIST("h_collisions_unweighted"), 2.0); // JetsData with kTVXinEMC } } if (!eventAccepted) { - registry.fill(HIST("h_collisions_unweighted"), 6.0); // JetsData w/o kTVXinEMC for (auto const& jet : jets) { if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax) || !isAcceptedJet(jet)) { fillRejectedJetHistograms(jet, 1.0); @@ -541,6 +574,7 @@ struct FullJetSpectrapp { } return; } + registry.fill(HIST("h_Detcollision_counter"), 2.5); for (auto const& jet : jets) { if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { @@ -557,27 +591,34 @@ struct FullJetSpectrapp { } PROCESS_SWITCH(FullJetSpectrapp, processJetsData, "Full Jets Data", false); - void processJetsMCD(soa::Filtered>::iterator const& collision, JetTableMCDJoined const& jets, aod::JetTracks const&, aod::JetClusters const&) + void processJetsMCD(soa::Filtered::iterator const& collision, JetTableMCDJoined const& jets, aod::JetTracks const&, aod::JetClusters const&) { - registry.fill(HIST("h_collisions_unweighted"), 1.0); // total events bool eventAccepted = false; + registry.fill(HIST("h_Detcollision_counter"), 0.5); + if (fabs(collision.posZ()) > VertexZCut) { + return; + } + registry.fill(HIST("h_Detcollision_counter"), 1.5); + if (doMBGapTrigger && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + return; + } + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, doMBGapTrigger)) { + return; + } if (doEMCALEventWorkaround) { if (collision.isEmcalReadout() && !collision.isAmbiguous()) { // i.e. EMCAL has a cell content eventAccepted = true; if (collision.alias_bit(kTVXinEMC)) { - registry.fill(HIST("h_collisions_unweighted"), 3.0); // JetsMCD with kTVXinEMC } } } else { if (!collision.isAmbiguous() && jetderiveddatautilities::eventEMCAL(collision) && collision.alias_bit(kTVXinEMC)) { eventAccepted = true; - registry.fill(HIST("h_collisions_unweighted"), 3.0); // JetsMCD with kTVXinEMC } } if (!eventAccepted) { - registry.fill(HIST("h_collisions_unweighted"), 7.0); // JetsMCD w/o kTVXinEMC for (auto const& jet : jets) { if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax) || !isAcceptedJet(jet)) { fillRejectedJetHistograms(jet, 1.0); @@ -585,6 +626,7 @@ struct FullJetSpectrapp { } return; } + registry.fill(HIST("h_Detcollision_counter"), 2.5); for (auto const& jet : jets) { if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { @@ -601,32 +643,35 @@ struct FullJetSpectrapp { } PROCESS_SWITCH(FullJetSpectrapp, processJetsMCD, "Full Jets at Detector Level", false); - void processJetsMCDWeighted(soa::Filtered>::iterator const& collision, JetTableMCDWeightedJoined const& jets, aod::JMcCollisions const&, aod::JetTracks const&, aod::JetClusters const&) + void processJetsMCDWeighted(soa::Filtered::iterator const& collision, JetTableMCDWeightedJoined const& jets, aod::JMcCollisions const&, aod::JetTracks const&, aod::JetClusters const&) { - registry.fill(HIST("h_collisions_weighted"), 1.0); // total events bool eventAccepted = false; - // if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { - // return; - // } + registry.fill(HIST("h_Detcollision_counter"), 0.5); + if (fabs(collision.posZ()) > VertexZCut) { + return; + } + registry.fill(HIST("h_Detcollision_counter"), 1.5); + if (doMBGapTrigger && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + return; + } + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, doMBGapTrigger)) { + return; + } if (doEMCALEventWorkaround) { if (collision.isEmcalReadout() && !collision.isAmbiguous()) { // i.e. EMCAL has a cell content eventAccepted = true; if (collision.alias_bit(kTVXinEMC)) { - registry.fill(HIST("h_collisions_weighted"), 2.0); // JetsMCDWeighted with kTVXinEMC } } } else { if (!collision.isAmbiguous() && jetderiveddatautilities::eventEMCAL(collision) && collision.alias_bit(kTVXinEMC)) { eventAccepted = true; - registry.fill(HIST("h_collisions_weighted"), 2.0); // JetsMCDWeighted with kTVXinEMC } } if (!eventAccepted) { - registry.fill(HIST("h_collisions_weighted"), 5.0); // JetsMCDWeighted w/o kTVXinEMC - for (auto const& jet : jets) { if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax) || !isAcceptedJet(jet)) { fillRejectedJetHistograms(jet, collision.mcCollision().weight()); @@ -634,6 +679,7 @@ struct FullJetSpectrapp { } return; } + registry.fill(HIST("h_Detcollision_counter"), 2.5); for (auto const& jet : jets) { if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { @@ -645,9 +691,6 @@ struct FullJetSpectrapp { if (!isAcceptedJet(jet)) { continue; } - if (doMBGapTrigger && collision.mcCollision().weight() == 1) { - continue; - } // this cut only to be used for calculating Jet Purity and not for Response Matrix // this is mainly applied to remove all high weight jets causing big fluctuations @@ -661,116 +704,160 @@ struct FullJetSpectrapp { } PROCESS_SWITCH(FullJetSpectrapp, processJetsMCDWeighted, "Full Jets at Detector Level on weighted events", false); - void processJetsMCP(typename JetTableMCPJoined::iterator const& jet, aod::JetParticles const&) - { - if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { - return; - } - if (!isAcceptedJet(jet)) { - return; - } - fillMCPHistograms(jet); - } - PROCESS_SWITCH(FullJetSpectrapp, processJetsMCP, "Full Jets at Particle Level", false); - - void processJetsMCPWeighted(typename JetTableMCPWeightedJoined::iterator const& jet, aod::JetParticles const&, aod::JetMcCollisions const&) + void processJetsMCP(aod::JetMcCollision const& mccollision, JetTableMCPJoined const& jets, aod::JetParticles const&, soa::SmallGroups const& collisions) { + bool eventAccepted = false; - if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + registry.fill(HIST("h_Partcollision_counter"), 0.5); + if (fabs(mccollision.posZ()) > VertexZCut) { return; } - if (!isAcceptedJet(jet)) { + registry.fill(HIST("h_Partcollision_counter"), 1.5); + if (collisions.size() < 1) { return; } - if (doMBGapTrigger && jet.eventWeight() == 1) { + registry.fill(HIST("h_Partcollision_counter"), 2.5); + for (auto const& collision : collisions) { + if (doMBGapTrigger && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + return; + } + if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, doMBGapTrigger)) { + eventAccepted = true; + // return; + } + if (doEMCALEventWorkaround) { + if (collision.isEmcalReadout() && !collision.isAmbiguous()) { // i.e. EMCAL has a cell content + eventAccepted = true; + if (collision.alias_bit(kTVXinEMC)) { + } + } + } else { + if (!collision.isAmbiguous() && jetderiveddatautilities::eventEMCAL(collision) && collision.alias_bit(kTVXinEMC)) { + eventAccepted = true; + } + } + } + if (!eventAccepted) { return; } + registry.fill(HIST("h_Partcollision_counter"), 3.5); - fillMCPHistograms(jet, jet.eventWeight()); + for (auto const& jet : jets) { + if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + if (!isAcceptedJet(jet)) { + continue; + } + if (checkMcCollisionIsMatched) { // basically checks if the same collisions are generated at the Part level as those at the Det level + auto collisionspermcpjet = collisions.sliceBy(CollisionsPerMCPCollision, jet.mcCollisionId()); + if (collisionspermcpjet.size() >= 1 && jetderiveddatautilities::selectCollision(collisionspermcpjet.begin(), eventSelectionBits)) { + // Now here for every matched collision, I fill the corresponding jet histograms. + fillMCPHistograms(jet); + } + } else { + fillMCPHistograms(jet); + } + } } - PROCESS_SWITCH(FullJetSpectrapp, processJetsMCPWeighted, "Full Jets at Particle Level on weighted events", false); + PROCESS_SWITCH(FullJetSpectrapp, processJetsMCP, "Full Jets at Particle Level", false); - void processTracks(soa::Filtered::iterator const& collision, soa::Filtered const& tracks, soa::Filtered const& clusters) + void processJetsMCPWeighted(aod::JetMcCollision const& mccollision, JetTableMCPWeightedJoined const& jets, aod::JetParticles const&, soa::SmallGroups const& collisions) { - registry.fill(HIST("h_collisions_unweighted"), 1.0); // total events bool eventAccepted = false; - if (fabs(collision.posZ()) > VertexZCut) { + + registry.fill(HIST("h_Partcollision_counter"), 0.5); + if (fabs(mccollision.posZ()) > VertexZCut) { return; } - // if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { - // return; - // } - // needed for the workaround to access EMCAL trigger bits. - This is needed for the MC productions in which the EMC trigger bits are missing. (MB MC LHC24f3, for ex.) - // It first requires for atleast a cell in EMCAL to have energy content. - // Once it finds a cell content, - // it then checks if the collision is not an ambiguous collision (i.e. it has to be a unique collision = no bunch pile up) - // If all of these conditions are satisfied then it checks for the required trigger bit in EMCAL. - // For LHC22o, since the EMCAL didn't have hardware triggers, one would only require MB trigger (kTVXinEMC) in the EMCAL. - - if (doEMCALEventWorkaround) { - if (collision.isEmcalReadout() && !collision.isAmbiguous()) { // i.e. EMCAL has a cell content - eventAccepted = true; - if (collision.alias_bit(kTVXinEMC)) { - registry.fill(HIST("h_collisions_unweighted"), 4.0); // Tracks with kTVXinEMC - } + registry.fill(HIST("h_Partcollision_counter"), 1.5); + if (collisions.size() < 1) { + return; + } + registry.fill(HIST("h_Partcollision_counter"), 2.5); + for (auto const& collision : collisions) { + if (doMBGapTrigger && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + return; } - } else { - // Check if EMCAL was readout with the MB trigger(kTVXinEMC) fired. If not then reject the event and exit the function. - // This is the default check for the simulations with proper trigger flags not requiring the above workaround. - if (!collision.isAmbiguous() && jetderiveddatautilities::eventEMCAL(collision) && collision.alias_bit(kTVXinEMC)) { + if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, doMBGapTrigger)) { eventAccepted = true; - registry.fill(HIST("h_collisions_unweighted"), 4.0); // Tracks with kTVXinEMC + } + if (doEMCALEventWorkaround) { + if (collision.isEmcalReadout() && !collision.isAmbiguous()) { // i.e. EMCAL has a cell content + eventAccepted = true; + if (collision.alias_bit(kTVXinEMC)) { + } + } + } else { + if (!collision.isAmbiguous() && jetderiveddatautilities::eventEMCAL(collision) && collision.alias_bit(kTVXinEMC)) { + eventAccepted = true; + } } } - if (!eventAccepted) { - registry.fill(HIST("h_collisions_unweighted"), 8.0); // Tracks w/o kTVXinEMC return; } - // Fill Accepted events histos - fillTrackHistograms(tracks, clusters, 1.0); + registry.fill(HIST("h_Partcollision_counter"), 3.5); + + for (auto const& jet : jets) { + if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + return; + } + if (!isAcceptedJet(jet)) { + return; + } + if (doMBGapTrigger && jet.eventWeight() == 1) { + return; + } + + if (checkMcCollisionIsMatched) { + auto collisionspermcpjet = collisions.sliceBy(CollisionsPerMCPCollision, jet.mcCollisionId()); + + if (collisionspermcpjet.size() >= 1 && jetderiveddatautilities::selectCollision(collisionspermcpjet.begin(), eventSelectionBits)) { + fillMCPHistograms(jet, jet.eventWeight()); + } + } else { + fillMCPHistograms(jet, jet.eventWeight()); + } + } } - PROCESS_SWITCH(FullJetSpectrapp, processTracks, "Full Jet tracks", false); + PROCESS_SWITCH(FullJetSpectrapp, processJetsMCPWeighted, "Full Jets at Particle Level on weighted events", false); - void processJetsMCPMCDMatched(soa::Filtered>::iterator const& collision, JetTableMCDMatchedJoined const& mcdjets, JetTableMCPMatchedJoined const& mcpjets, aod::JMcCollisions const&, aod::JetTracks const&, aod::JetClusters const&, aod::JetParticles const&) + void processJetsMCPMCDMatched(soa::Filtered::iterator const& collision, JetTableMCDMatchedJoined const& mcdjets, JetTableMCPMatchedJoined const& mcpjets, aod::JMcCollisions const&, aod::JetTracks const&, aod::JetClusters const&, aod::JetParticles const&) { - registry.fill(HIST("h_collisions_unweighted"), 1.0); // total events bool eventAccepted = false; int fakemcdjet = 0; int fakemcpjet = 0; - // float pTHat = 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); + const auto mcpJetsPerMcCollision = mcpjets.sliceBy(JetMCPPerMcCollision, collision.mcCollisionId()); + + registry.fill(HIST("h_Matchedcollision_counter"), 0.5); + if (fabs(collision.posZ()) > VertexZCut) { // making double sure this condition is satisfied return; } - // if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { - // return; - // } - const auto mcpJetsPerMcCollision = mcpjets.sliceBy(JetMCPPerMcCollision, collision.mcCollisionId()); + registry.fill(HIST("h_Matchedcollision_counter"), 1.5); - // for (auto mcpjet : mcpJetsPerMcCollision) { - // if (mcpjet.pt() > pTHatMaxMCP * pTHat) { // outlier rejection for MCP - // return; - // } - // } - //**start of event selection** + if (doMBGapTrigger && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + return; + } + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, doMBGapTrigger)) { + return; + } if (doEMCALEventWorkaround) { if (collision.isEmcalReadout() && !collision.isAmbiguous()) { // i.e. EMCAL has a cell content eventAccepted = true; if (collision.alias_bit(kTVXinEMC)) { - registry.fill(HIST("h_collisions_unweighted"), 5.0); // JetsMCPMCDMatched with kTVXinEMC } } } else { if (!collision.isAmbiguous() && jetderiveddatautilities::eventEMCAL(collision) && collision.alias_bit(kTVXinEMC)) { eventAccepted = true; - registry.fill(HIST("h_collisions_unweighted"), 5.0); // JetsMCPMCDMatched with kTVXinEMC } } if (!eventAccepted) { - registry.fill(HIST("h_collisions_unweighted"), 9.0); // JetsMCPMCDMatched w/o kTVXinEMC return; } - //**end of event selection** + registry.fill(HIST("h_Matchedcollision_counter"), 2.5); for (const auto& mcdjet : mcdjets) { if (!jetfindingutilities::isInEtaAcceptance(mcdjet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { @@ -779,47 +866,41 @@ struct FullJetSpectrapp { // Check if MCD jet is within the EMCAL fiducial region; if not then flag it as a fake jet if (mcdjet.phi() < jetPhiMin || mcdjet.phi() > jetPhiMax || mcdjet.eta() < jetEtaMin || mcdjet.eta() > jetEtaMax) { fakemcdjet++; - registry.fill(HIST("h_collisions_unweighted"), 10.0); // Fake Matched MCD Jets registry.fill(HIST("h2_full_fakemcdjets"), mcdjet.pt(), fakemcdjet, 1.0); continue; } if (!isAcceptedJet(mcdjet)) { continue; } - for (auto& mcpjet : mcdjet.template matchedJetGeo_as()) { // apply emcal fiducial cuts to the matched particle level jets if (mcpjet.eta() > jetEtaMax || mcpjet.eta() < jetEtaMin || mcpjet.phi() > jetPhiMax || mcpjet.phi() < jetPhiMin) { fakemcpjet++; - registry.fill(HIST("h_collisions_unweighted"), 11.0); // Fake Matched MCP Jets registry.fill(HIST("h2_full_fakemcpjets"), mcpjet.pt(), fakemcpjet, 1.0); continue; } } // mcpjet loop - - // // Fill MCD jet histograms if a valid MCP jet match was found within the EMCAL region - // registry.fill(HIST("h_full_matchedmcpjet_eta"), mcpjet.eta(), 1.0); - // registry.fill(HIST("h_full_matchedmcpjet_phi"), mcpjet.phi(), 1.0); - fillMatchedHistograms(mcdjet); + fillMatchedHistograms(mcdjet); } // mcdjet loop } PROCESS_SWITCH(FullJetSpectrapp, processJetsMCPMCDMatched, "Full Jet finder MCP matched to MCD", false); - void processJetsMCPMCDMatchedWeighted(soa::Filtered>::iterator const& collision, JetTableMCDMatchedWeightedJoined const& mcdjets, JetTableMCPMatchedWeightedJoined const& mcpjets, aod::JMcCollisions const&, aod::JetTracks const&, aod::JetClusters const&, aod::JetParticles const&) + void processJetsMCPMCDMatchedWeighted(soa::Filtered::iterator const& collision, JetTableMCDMatchedWeightedJoined const& mcdjets, JetTableMCPMatchedWeightedJoined const& mcpjets, aod::JMcCollisions const&, aod::JetTracks const&, aod::JetClusters const&, aod::JetParticles const&) { float eventWeight = collision.mcCollision().weight(); + registry.fill(HIST("h_Matchedcollision_counter"), 0.5); if (fabs(collision.posZ()) > VertexZCut) { // making double sure this condition is satisfied return; } - if (doMBGapTrigger && eventWeight == 1) { + registry.fill(HIST("h_Matchedcollision_counter"), 1.5); + + if (doMBGapTrigger && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + return; + } + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, doMBGapTrigger)) { return; } - // if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { - // return; - // } - - registry.fill(HIST("h_collisions_weighted"), 1.0, eventWeight); // total events with eventWeight!=1 bool eventAccepted = false; int fakemcdjet = 0; int fakemcpjet = 0; @@ -831,31 +912,28 @@ struct FullJetSpectrapp { return; } } - if (doEMCALEventWorkaround) { if (collision.isEmcalReadout() && !collision.isAmbiguous()) { // i.e. EMCAL has a cell content eventAccepted = true; if (collision.alias_bit(kTVXinEMC)) { - registry.fill(HIST("h_collisions_weighted"), 3.0, eventWeight); // JetsMCPMCDMatchedWeighted with kTVXinEMC + registry.fill(HIST("h_Matchedcollision_counter"), eventWeight); } } } else { if (!collision.isAmbiguous() && jetderiveddatautilities::eventEMCAL(collision) && collision.alias_bit(kTVXinEMC)) { eventAccepted = true; - registry.fill(HIST("h_collisions_weighted"), 3.0, eventWeight); // JetsMCPMCDMatchedWeighted with kTVXinEMC + registry.fill(HIST("h_Matchedcollision_counter"), eventWeight); } } - if (!eventAccepted) { - registry.fill(HIST("h_collisions_weighted"), 6.0, eventWeight); // JetsMCPMCDMatchedWeighted w/o kTVXinEMC return; } + registry.fill(HIST("h_Matchedcollision_counter"), 2.5); for (const auto& mcdjet : mcdjets) { // Check if MCD jet is within the EMCAL fiducial region; if not then flag it as a fake jet if (mcdjet.phi() < jetPhiMin || mcdjet.phi() > jetPhiMax || mcdjet.eta() < jetEtaMin || mcdjet.eta() > jetEtaMax) { fakemcdjet++; - registry.fill(HIST("h_collisions_weighted"), 8.0); // Fake Matched Weighted MCD Jets registry.fill(HIST("h2_full_fakemcdjets"), mcdjet.pt(), fakemcdjet, eventWeight); continue; } @@ -870,7 +948,6 @@ struct FullJetSpectrapp { // apply emcal fiducial cuts to the matched particle level jets if (mcpjet.eta() > jetEtaMax || mcpjet.eta() < jetEtaMin || mcpjet.phi() > jetPhiMax || mcpjet.phi() < jetPhiMin) { fakemcpjet++; - registry.fill(HIST("h_collisions_weighted"), 9.0); // Fake Matched Weighted MCP Jets registry.fill(HIST("h2_full_fakemcpjets"), mcpjet.pt(), fakemcpjet, eventWeight); continue; } @@ -878,31 +955,87 @@ struct FullJetSpectrapp { registry.fill(HIST("h_full_matchedmcpjet_eta"), mcpjet.eta(), eventWeight); registry.fill(HIST("h_full_matchedmcpjet_phi"), mcpjet.phi(), eventWeight); } // mcpjet - // Fill MCD jet histograms if a valid MCP jet match was found within the EMCAL region - // registry.fill(HIST("h_full_matchedmcdjet_eta"), mcdjet.eta(), eventWeight); - // registry.fill(HIST("h_full_matchedmcdjet_phi"), mcdjet.phi(), eventWeight); - fillMatchedHistograms(mcdjet, mcdjet.eventWeight()); + fillMatchedHistograms(mcdjet, eventWeight); } // mcdjet } PROCESS_SWITCH(FullJetSpectrapp, processJetsMCPMCDMatchedWeighted, "Full Jet finder MCP matched to MCD on weighted events", false); - void processTracksWeighted(soa::Filtered>::iterator const& collision, + void processTracks(soa::Filtered::iterator const& collision, soa::Filtered const& tracks, soa::Filtered const& clusters) + { + bool eventAccepted = false; + + registry.fill(HIST("h_collisions_unweighted"), 0.5); + if (fabs(collision.posZ()) > VertexZCut) { + return; + } + registry.fill(HIST("h_collisions_unweighted"), 1.5); + if (doMBGapTrigger && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + return; + } + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, doMBGapTrigger)) { + return; + } + // needed for the workaround to access EMCAL trigger bits. - This is needed for the MC productions in which the EMC trigger bits are missing. (MB MC LHC24f3, for ex.) + // It first requires for atleast a cell in EMCAL to have energy content. + // Once it finds a cell content, + // it then checks if the collision is not an ambiguous collision (i.e. it has to be a unique collision = no bunch pile up) + // If all of these conditions are satisfied then it checks for the required trigger bit in EMCAL. + // For LHC22o, since the EMCAL didn't have hardware triggers, one would only require MB trigger (kTVXinEMC) in the EMCAL. + + if (doEMCALEventWorkaround) { + if (collision.isEmcalReadout() && !collision.isAmbiguous()) { // i.e. EMCAL has a cell content + eventAccepted = true; + if (collision.alias_bit(kTVXinEMC)) { + registry.fill(HIST("h_collisions_unweighted"), 4.0); // Tracks with kTVXinEMC + registry.fill(HIST("h_Detcollision_counter"), 1.0); + } + } + } else { + // Check if EMCAL was readout with the MB trigger(kTVXinEMC) fired. If not then reject the event and exit the function. + // This is the default check for the simulations with proper trigger flags not requiring the above workaround. + if (!collision.isAmbiguous() && jetderiveddatautilities::eventEMCAL(collision) && collision.alias_bit(kTVXinEMC)) { + eventAccepted = true; + registry.fill(HIST("h_collisions_unweighted"), 4.0); // Tracks with kTVXinEMC + registry.fill(HIST("h_Detcollision_counter"), 1.0); + } + } + + if (!eventAccepted) { + registry.fill(HIST("h_collisions_unweighted"), 8.0); // Tracks w/o kTVXinEMC + return; + } + registry.fill(HIST("h_collisions_unweighted"), 2.5); + + for (auto const& track : tracks) { + if (!jetderiveddatautilities::selectTrack(track, trackSelection)) { + continue; + } + // Fill Accepted events histos + fillTrackHistograms(tracks, clusters, 1.0); + } + registry.fill(HIST("h_collisions_unweighted"), 3.5); + } + PROCESS_SWITCH(FullJetSpectrapp, processTracks, "Full Jet tracks", false); + + void processTracksWeighted(soa::Filtered::iterator const& collision, aod::JMcCollisions const&, soa::Filtered const& tracks, soa::Filtered const& clusters) { bool eventAccepted = false; float eventWeight = collision.mcCollision().weight(); + + registry.fill(HIST("h_collisions_weighted"), 0.5); if (fabs(collision.posZ()) > VertexZCut) { return; } - if (eventWeight == 1) { + registry.fill(HIST("h_collisions_weighted"), 1.5); + if (doMBGapTrigger && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + return; + } + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, doMBGapTrigger)) { return; } - // if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { - // return; - // } - // set "doMBGapTrigger" to true only if you are testing with MB Gap-triggers if (doMBGapTrigger && eventWeight == 1) { return; } @@ -917,8 +1050,6 @@ struct FullJetSpectrapp { } } } else { - // Check if EMCAL was readout with the MB trigger(kTVXinEMC) fired. If not then reject the event and exit the function. - // This is the default check for the simulations with proper trigger flags not requiring the above workaround. if (!collision.isAmbiguous() && jetderiveddatautilities::eventEMCAL(collision) && collision.alias_bit(kTVXinEMC)) { eventAccepted = true; registry.fill(HIST("h_collisions_weighted"), 4.0, eventWeight); // TracksWeighted with kTVXinEMC @@ -929,11 +1060,148 @@ struct FullJetSpectrapp { registry.fill(HIST("h_collisions_weighted"), 7.0, eventWeight); // TracksWeighted w/o kTVXinEMC return; } - // registry.fill(HIST("h_gaptrig_collisions"), 1.0, eventWeight); - fillTrackHistograms(tracks, clusters, eventWeight); + registry.fill(HIST("h_collisions_weighted"), 2.5); + + for (auto const& track : tracks) { + if (!jetderiveddatautilities::selectTrack(track, trackSelection)) { + continue; + } + // Fill Accepted events histos + fillTrackHistograms(tracks, clusters, 1.0); + } + registry.fill(HIST("h_collisions_weighted"), 3.5); } PROCESS_SWITCH(FullJetSpectrapp, processTracksWeighted, "Full Jet tracks weighted", false); + void processCollisionsWeightedWithMultiplicity(soa::Filtered>::iterator const& collision, JetTableMCDWeightedJoined const& mcdjets, aod::JMcCollisions const&, soa::Filtered const& tracks, soa::Filtered const& clusters) + { + bool eventAccepted = false; + float eventWeight = collision.mcCollision().weight(); + float neutralEnergy = 0.0; + + if (fabs(collision.posZ()) > VertexZCut) { + return; + } + if (doMBGapTrigger && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + return; + } + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, doMBGapTrigger)) { + return; + } + if (doMBGapTrigger && eventWeight == 1) { + return; + } + + if (doEMCALEventWorkaround) { + if (collision.isEmcalReadout() && !collision.isAmbiguous()) { // i.e. EMCAL has a cell content + eventAccepted = true; + fillTrackHistograms(tracks, clusters, eventWeight); + if (collision.alias_bit(kTVXinEMC)) { + } + } + } else { + if (!collision.isAmbiguous() && jetderiveddatautilities::eventEMCAL(collision) && collision.alias_bit(kTVXinEMC)) { + eventAccepted = true; + } + } + + if (!eventAccepted) { + return; + } + for (auto const& track : tracks) { + if (!jetderiveddatautilities::selectTrack(track, trackSelection)) { + continue; + } + } + registry.fill(HIST("h_FT0Mults_occupancy"), collision.multiplicity()); + + for (auto const& mcdjet : mcdjets) { + float pTHat = 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); + if (mcdjet.pt() > pTHatMaxMCD * pTHat || pTHat < pTHatAbsoluteMin) { // MCD jets outlier rejection + return; + } + if (!jetfindingutilities::isInEtaAcceptance(mcdjet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + if (mcdjet.phi() < jetPhiMin || mcdjet.phi() > jetPhiMax) { + continue; + } + if (!isAcceptedJet(mcdjet)) { + continue; + } + registry.fill(HIST("h2_full_jet_jetpTDetVsFT0Mults"), mcdjet.pt(), collision.multiplicity(), eventWeight); + + for (auto const& cluster : clusters) { + neutralEnergy += cluster.energy(); + } + auto NEF = neutralEnergy / mcdjet.energy(); + registry.fill(HIST("h3_full_jet_jetpTDet_FT0Mults_NEF"), mcdjet.pt(), collision.multiplicity(), NEF, eventWeight); + } + } + PROCESS_SWITCH(FullJetSpectrapp, processCollisionsWeightedWithMultiplicity, "Weighted Collisions for Full Jets Multiplicity Studies", false); + + void processMBCollisionsWithMultiplicity(soa::Filtered>::iterator const& collision, JetTableMCDJoined const& mcdjets, aod::JMcCollisions const&, soa::Filtered const& tracks, soa::Filtered const& clusters) + { + bool eventAccepted = false; + float pTHat = 10. / (std::pow(1.0, 1.0 / pTHatExponent)); + float neutralEnergy = 0.0; + + if (fabs(collision.posZ()) > VertexZCut) { + return; + } + if (doMBGapTrigger && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + return; + } + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, doMBGapTrigger)) { + return; + } + + if (doEMCALEventWorkaround) { + if (collision.isEmcalReadout() && !collision.isAmbiguous()) { // i.e. EMCAL has a cell content + eventAccepted = true; + fillTrackHistograms(tracks, clusters, 1.0); + if (collision.alias_bit(kTVXinEMC)) { + } + } + } else { + if (!collision.isAmbiguous() && jetderiveddatautilities::eventEMCAL(collision) && collision.alias_bit(kTVXinEMC)) { + eventAccepted = true; + } + } + + if (!eventAccepted) { + return; + } + for (auto const& track : tracks) { + if (!jetderiveddatautilities::selectTrack(track, trackSelection)) { + continue; + } + } + registry.fill(HIST("h_FT0Mults_occupancy"), collision.multiplicity()); + + for (auto const& mcdjet : mcdjets) { + if (mcdjet.pt() > pTHatMaxMCD * pTHat || pTHat < pTHatAbsoluteMin) { // MCD (Detector Level) Outlier Rejection + return; + } + if (!jetfindingutilities::isInEtaAcceptance(mcdjet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + if (mcdjet.phi() < jetPhiMin || mcdjet.phi() > jetPhiMax) { + continue; + } + if (!isAcceptedJet(mcdjet)) { + continue; + } + registry.fill(HIST("h2_full_jet_jetpTDetVsFT0Mults"), mcdjet.pt(), collision.multiplicity(), 1.0); + + for (auto const& cluster : clusters) { + neutralEnergy += cluster.energy(); + } + auto NEF = neutralEnergy / mcdjet.energy(); + registry.fill(HIST("h3_full_jet_jetpTDet_FT0Mults_NEF"), mcdjet.pt(), collision.multiplicity(), NEF, 1.0); + } + } + PROCESS_SWITCH(FullJetSpectrapp, processMBCollisionsWithMultiplicity, "MB Collisions for Full Jets Multiplicity Studies", false); }; // struct WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 3f6389bf640a1015fb8e707d1a9c41d225e73d97 Mon Sep 17 00:00:00 2001 From: Fabrizio Date: Fri, 25 Apr 2025 09:41:12 +0200 Subject: [PATCH 1097/1650] [PWGHF] Add RCT selection in HF event selection utils (#10949) Co-authored-by: ALICE Action Bot --- .../dataCreatorCharmHadPiReduced.cxx | 3 + .../dataCreatorCharmResoReduced.cxx | 3 + .../TableProducer/candidateCreator2Prong.cxx | 8 +- .../TableProducer/candidateCreator3Prong.cxx | 9 +- .../TableProducer/candidateCreatorCascade.cxx | 8 +- PWGHF/TableProducer/candidateCreatorDstar.cxx | 8 +- .../candidateCreatorSigmac0plusplus.cxx | 5 +- .../candidateCreatorXic0Omegac0.cxx | 8 +- PWGHF/Utils/utilsEvSelHf.h | 88 +++++++++++++++++-- 9 files changed, 113 insertions(+), 27 deletions(-) diff --git a/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx b/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx index 869e037c788..6856154e1ed 100644 --- a/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx +++ b/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx @@ -291,6 +291,9 @@ struct HfDataCreatorCharmHadPiReduced { setLabelHistoCands(hCandidatesD0); setLabelHistoCands(hCandidatesDPlus); setLabelHistoCands(hCandidatesDs); + + // init HF event selection helper + hfEvSel.init(registry); } /// Pion selection (D Pi <-- B0) diff --git a/PWGHF/D2H/TableProducer/dataCreatorCharmResoReduced.cxx b/PWGHF/D2H/TableProducer/dataCreatorCharmResoReduced.cxx index 714de7448ac..d11a2db65d6 100644 --- a/PWGHF/D2H/TableProducer/dataCreatorCharmResoReduced.cxx +++ b/PWGHF/D2H/TableProducer/dataCreatorCharmResoReduced.cxx @@ -302,6 +302,9 @@ struct HfDataCreatorCharmResoReduced { fitter.setMaxChi2(1e9); fitter.setUseAbsDCA(true); fitter.setWeightedFinalPCA(false); + + // init HF event selection helper + hfEvSel.init(registry); } /// Basic track quality selections for V0 daughters diff --git a/PWGHF/TableProducer/candidateCreator2Prong.cxx b/PWGHF/TableProducer/candidateCreator2Prong.cxx index 576e5413c11..66e11d2559d 100644 --- a/PWGHF/TableProducer/candidateCreator2Prong.cxx +++ b/PWGHF/TableProducer/candidateCreator2Prong.cxx @@ -147,7 +147,9 @@ struct HfCandidateCreator2Prong { registry.add("hDcaZProngs", "DCAz of 2-prong candidate daughters;#it{p}_{T} (GeV/#it{c};#it{d}_{z}) (#mum);entries", {HistType::kTH2F, {{100, 0., 20.}, {200, -500., 500.}}}); registry.add("hVertexerType", "Use KF or DCAFitterN;Vertexer type;entries", {HistType::kTH1D, {{2, -0.5, 1.5}}}); // See o2::aod::hf_cand::VertexerType hCandidates = registry.add("hCandidates", "candidates counter", {HistType::kTH1D, {axisCands}}); - hfEvSel.addHistograms(registry); // collision monitoring + + // init HF event selection helper + hfEvSel.init(registry); massPi = MassPiPlus; massK = MassKPlus; @@ -713,11 +715,11 @@ struct HfCandidateCreator2ProngExpressions { const auto& workflows = initContext.services().get(); for (const DeviceSpec& device : workflows.devices) { if (device.name.compare("hf-candidate-creator-2prong") == 0) { - hfEvSelMc.configureFromDevice(device); + // init HF event selection helper + hfEvSelMc.init(device, registry); break; } } - hfEvSelMc.addHistograms(registry); // particles monitoring } /// Performs MC matching. diff --git a/PWGHF/TableProducer/candidateCreator3Prong.cxx b/PWGHF/TableProducer/candidateCreator3Prong.cxx index 20e068d1e09..b8e43e61c75 100644 --- a/PWGHF/TableProducer/candidateCreator3Prong.cxx +++ b/PWGHF/TableProducer/candidateCreator3Prong.cxx @@ -175,7 +175,9 @@ struct HfCandidateCreator3Prong { registry.add("hDcaXYProngs", "DCAxy of 3-prong candidate daughters;#it{p}_{T} (GeV/#it{c};#it{d}_{xy}) (#mum);entries", {HistType::kTH2F, {{100, 0., 20.}, {200, -500., 500.}}}); registry.add("hDcaZProngs", "DCAz of 3-prong candidate daughters;#it{p}_{T} (GeV/#it{c};#it{d}_{z}) (#mum);entries", {HistType::kTH2F, {{100, 0., 20.}, {200, -500., 500.}}}); hCandidates = registry.add("hCandidates", "candidates counter", {HistType::kTH1D, {axisCands}}); - hfEvSel.addHistograms(registry); // collision monitoring + + // init HF event selection helper + hfEvSel.init(registry); massP = MassProton; massPi = MassPiPlus; @@ -838,12 +840,11 @@ struct HfCandidateCreator3ProngExpressions { const auto& workflows = initContext.services().get(); for (const DeviceSpec& device : workflows.devices) { if (device.name.compare("hf-candidate-creator-3prong") == 0) { - hfEvSelMc.configureFromDevice(device); + // init HF event selection helper + hfEvSelMc.init(device, registry); break; } } - - hfEvSelMc.addHistograms(registry); // particles monitoring } /// Performs MC matching. diff --git a/PWGHF/TableProducer/candidateCreatorCascade.cxx b/PWGHF/TableProducer/candidateCreatorCascade.cxx index 23c26f7ae7c..25c7a343849 100644 --- a/PWGHF/TableProducer/candidateCreatorCascade.cxx +++ b/PWGHF/TableProducer/candidateCreatorCascade.cxx @@ -118,7 +118,9 @@ struct HfCandidateCreatorCascade { registry.add("hCovPVXX", "2-prong candidates;XX element of cov. matrix of prim. vtx. position (cm^{2});entries", {HistType::kTH1F, {{100, 0., 1.e-4}}}); registry.add("hCovSVXX", "2-prong candidates;XX element of cov. matrix of sec. vtx. position (cm^{2});entries", {HistType::kTH1F, {{100, 0., 0.2}}}); hCandidates = registry.add("hCandidates", "candidates counter", {HistType::kTH1D, {axisCands}}); - hfEvSel.addHistograms(registry); // collision monitoring + + // init HF event selection helper + hfEvSel.init(registry); massP = MassProton; massK0s = MassK0Short; @@ -471,11 +473,11 @@ struct HfCandidateCreatorCascadeMc { const auto& workflows = initContext.services().get(); for (const DeviceSpec& device : workflows.devices) { if (device.name.compare("hf-candidate-creator-cascade") == 0) { - hfEvSelMc.configureFromDevice(device); + // init HF event selection helper + hfEvSelMc.init(device, registry); break; } } - hfEvSelMc.addHistograms(registry); // particles monitoring } template diff --git a/PWGHF/TableProducer/candidateCreatorDstar.cxx b/PWGHF/TableProducer/candidateCreatorDstar.cxx index 110edad7cfb..5c49e472511 100644 --- a/PWGHF/TableProducer/candidateCreatorDstar.cxx +++ b/PWGHF/TableProducer/candidateCreatorDstar.cxx @@ -136,7 +136,9 @@ struct HfCandidateCreatorDstar { } hCandidates = registry.add("hCandidates", "candidates counter", {HistType::kTH1D, {axisCands}}); - hfEvSel.addHistograms(registry); // collision monitoring + + // init HF event selection helper + hfEvSel.init(registry); // LOG(info) << "Init Function Invoked"; massPi = MassPiPlus; @@ -534,11 +536,11 @@ struct HfCandidateCreatorDstarExpressions { const auto& workflows = initContext.services().get(); for (const DeviceSpec& device : workflows.devices) { if (device.name.compare("hf-candidate-creator-dstar") == 0) { - hfEvSelMc.configureFromDevice(device); + // init HF event selection helper + hfEvSelMc.init(device, registry); break; } } - hfEvSelMc.addHistograms(registry); // particles monitoring } /// Perform MC Matching. diff --git a/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx b/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx index c3cfe2d6049..1e6c7d982a4 100644 --- a/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx +++ b/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx @@ -408,12 +408,11 @@ struct HfCandidateSigmac0plusplusMc { // here we assume that the hf-candidate-creator-3prong is in the workflow // configure the ev. sel from that workflow if (device.name.compare("hf-candidate-creator-3prong") == 0) { - hfEvSelMc.configureFromDevice(device); + // init HF event selection helper + hfEvSelMc.init(device, registry); break; } } - - hfEvSelMc.addHistograms(registry); // particles monitoring } /// @brief dummy process function, to be run on data diff --git a/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx b/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx index 01a52fc073e..f8dc5597cfc 100644 --- a/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx +++ b/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx @@ -341,7 +341,9 @@ struct HfCandidateCreatorXic0Omegac0 { registry.add("hKFcosPaV0ToCasc", "hKFcosPaV0ToCasc", kTH1D, {{5000, 0.8f, 1.1f}}); registry.add("hKFcosPaCascToOmegac", "hKFcosPaCascToOmegac", kTH1D, {{5000, 0.8f, 1.1f}}); } - hfEvSel.addHistograms(registry); // collision monitoring + + // init HF event selection helper + hfEvSel.init(registry); df.setPropagateToPCA(propagateToPCA); df.setMaxR(maxR); @@ -1879,11 +1881,11 @@ struct HfCandidateCreatorXic0Omegac0Mc { const auto& workflows = initContext.services().get(); for (const DeviceSpec& device : workflows.devices) { if (device.name.compare("hf-candidate-creator-xic0-omegac0") == 0) { - hfEvSelMc.configureFromDevice(device); + // init HF event selection helper + hfEvSelMc.init(device, registry); break; } } - hfEvSelMc.addHistograms(registry); // particles monitoring hGenCharmBaryonPtRapidityTightXicToXiPi = registry.add("hGenCharmBaryonPtRapidityTightXicToXiPi", "Generated charm baryon #it{p}_{T};#it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1D, {{20, 0.0, 20.0}}}); // keep track of generated candidates pt when |y|<0.5 hGenCharmBaryonPtRapidityLooseXicToXiPi = registry.add("hGenCharmBaryonPtRapidityLooseXicToXiPi", "Generated charm baryon #it{p}_{T};#it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1D, {{20, 0.0, 20.0}}}); // keep track of generated candidates pt when |y|<0.8 diff --git a/PWGHF/Utils/utilsEvSelHf.h b/PWGHF/Utils/utilsEvSelHf.h index a3500da73da..4103cd517de 100644 --- a/PWGHF/Utils/utilsEvSelHf.h +++ b/PWGHF/Utils/utilsEvSelHf.h @@ -27,6 +27,7 @@ #include "Framework/OutputObjHeader.h" #include "Common/CCDB/EventSelectionParams.h" +#include "Common/CCDB/RCTSelectionFlags.h" #include "EventFiltering/Zorro.h" #include "EventFiltering/ZorroSummary.h" #include "PWGLF/DataModel/mcCentrality.h" @@ -82,6 +83,7 @@ namespace o2::hf_evsel // event rejection types enum EventRejection { None = 0, + Rct, SoftwareTrigger, Centrality, Trigger, @@ -110,6 +112,7 @@ void setEventRejectionLabels(Histo& hRejection, std::string softwareTriggerLabel { // Puts labels on the collision monitoring histogram. hRejection->GetXaxis()->SetBinLabel(EventRejection::None + 1, "All"); + hRejection->GetXaxis()->SetBinLabel(EventRejection::Rct + 1, "RCT"); hRejection->GetXaxis()->SetBinLabel(EventRejection::SoftwareTrigger + 1, softwareTriggerLabel.data()); hRejection->GetXaxis()->SetBinLabel(EventRejection::Centrality + 1, "Centrality"); hRejection->GetXaxis()->SetBinLabel(EventRejection::Trigger + 1, "Trigger"); @@ -155,6 +158,10 @@ struct HfEventSelection : o2::framework::ConfigurableGroup { o2::framework::Configurable ccdbPathSoftwareTrigger{"ccdbPathSoftwareTrigger", "Users/m/mpuccio/EventFiltering/OTS/Chunked/", "ccdb path for ZORRO objects"}; o2::framework::ConfigurableAxis th2ConfigAxisCent{"th2ConfigAxisCent", {100, 0., 100.}, ""}; o2::framework::ConfigurableAxis th2ConfigAxisOccupancy{"th2ConfigAxisOccupancy", {14, 0, 14000}, ""}; + o2::framework::Configurable requireGoodRct{"requireGoodRct", false, "Flag to require good RCT"}; + o2::framework::Configurable rctLabel{"rctLabel", "CBT_hadronPID", "RCT selection flag (CBT, CBT_hadronPID, CBT_electronPID, CCBT_calo, CBT_muon, CBT_muon_glo)"}; + o2::framework::Configurable rctCheckZDC{"rctCheckZDC", false, "RCT flag to check whether the ZDC is present or not"}; + o2::framework::Configurable rctTreatLimitedAcceptanceAsBad{"rctTreatLimitedAcceptanceAsBad", false, "RCT flag to reject events with limited acceptance for selected detectors"}; // histogram names static constexpr char NameHistCollisions[] = "hCollisions"; @@ -169,6 +176,9 @@ struct HfEventSelection : o2::framework::ConfigurableGroup { std::shared_ptr hCollisions, hSelCollisionsCent, hPosZBeforeEvSel, hPosZAfterEvSel, hPosXAfterEvSel, hPosYAfterEvSel, hNumPvContributorsAfterSel; std::shared_ptr hCollisionsCentOcc; + // util to retrieve the RCT info from CCDB + o2::aod::rctsel::RCTFlagsChecker rctChecker; + // util to retrieve trigger mask in case of software triggers Zorro zorro; o2::framework::OutputObj zorroSummary{"zorroSummary"}; @@ -190,11 +200,24 @@ struct HfEventSelection : o2::framework::ConfigurableGroup { const o2::framework::AxisSpec th2AxisCent{th2ConfigAxisCent, "Centrality"}; const o2::framework::AxisSpec th2AxisOccupancy{th2ConfigAxisOccupancy, "Occupancy"}; hCollisionsCentOcc = registry.add(NameHistCollisionsCentOcc, "selected events;Centrality; Occupancy", {o2::framework::HistType::kTH2D, {th2AxisCent, th2AxisOccupancy}}); + } + + /// \brief Inits the HF event selection object + /// \param registry reference to the histogram registry + void init(o2::framework::HistogramRegistry& registry) + { + // we initialise the RCT checker + if (requireGoodRct) { + rctChecker.init(rctLabel.value, rctCheckZDC.value, rctTreatLimitedAcceptanceAsBad.value); + } // we initialise the summary object if (softwareTrigger.value != "") { zorroSummary.setObject(zorro.getZorroSummary()); } + + // we initialise histograms + addHistograms(registry); } /// \brief Applies event selection. @@ -218,6 +241,10 @@ struct HfEventSelection : o2::framework::ConfigurableGroup { } if constexpr (useEvSel) { + /// RCT condition + if (requireGoodRct && !rctChecker.checkTable(collision)) { + SETBIT(rejectionMask, EventRejection::Rct); + } /// trigger condition if ((useSel8Trigger && !collision.sel8()) || (!useSel8Trigger && triggerClass > -1 && !collision.alias_bit(triggerClass))) { SETBIT(rejectionMask, EventRejection::Trigger); @@ -333,14 +360,21 @@ struct HfEventSelection : o2::framework::ConfigurableGroup { struct HfEventSelectionMc { // event selection parameters (in chronological order of application) - bool useSel8Trigger{false}; // Apply the Sel8 selection - bool useTvxTrigger{false}; // Apply the TVX trigger - bool useTimeFrameBorderCut{true}; // Apply TF border cut - bool useItsRofBorderCut{false}; // Apply the ITS RO frame border cut - float zPvPosMin{-1000.f}; // Minimum PV posZ (cm) - float zPvPosMax{1000.f}; // Maximum PV posZ (cm) - float centralityMin{0.f}; // Minimum centrality - float centralityMax{100.f}; // Maximum centrality + bool useSel8Trigger{false}; // Apply the Sel8 selection + bool useTvxTrigger{false}; // Apply the TVX trigger + bool useTimeFrameBorderCut{true}; // Apply TF border cut + bool useItsRofBorderCut{false}; // Apply the ITS RO frame border cut + float zPvPosMin{-1000.f}; // Minimum PV posZ (cm) + float zPvPosMax{1000.f}; // Maximum PV posZ (cm) + float centralityMin{0.f}; // Minimum centrality + float centralityMax{100.f}; // Maximum centrality + bool requireGoodRct{false}; // Apply RCT selection + std::string rctLabel{""}; // RCT selection flag + bool rctCheckZDC; // require ZDC from RCT + bool rctTreatLimitedAcceptanceAsBad; // RCT flag to reject events with limited acceptance for selected detectors + + // util to retrieve the RCT info from CCDB + o2::aod::rctsel::RCTFlagsChecker rctChecker; // histogram names static constexpr char NameHistGenCollisionsCent[] = "hGenCollisionsCent"; @@ -364,6 +398,9 @@ struct HfEventSelectionMc { setEventRejectionLabels(hParticles); } + /// \brief Configures the object from the reco workflow + /// \param registry reference to the histogram registry + /// \param device device spec to get the configs from the reco workflow void configureFromDevice(const o2::framework::DeviceSpec& device) { for (const auto& option : device.options) { @@ -383,10 +420,35 @@ struct HfEventSelectionMc { centralityMin = option.defaultValue.get(); } else if (option.name.compare("hfEvSel.centralityMax") == 0) { centralityMax = option.defaultValue.get(); + } else if (option.name.compare("hfEvSel.requireGoodRct") == 0) { + requireGoodRct = option.defaultValue.get(); + } else if (option.name.compare("hfEvSel.rctLabel") == 0) { + rctLabel = option.defaultValue.get(); + } else if (option.name.compare("hfEvSel.rctCheckZDC") == 0) { + rctCheckZDC = option.defaultValue.get(); + } else if (option.name.compare("hfEvSel.rctTreatLimitedAcceptanceAsBad") == 0) { + rctTreatLimitedAcceptanceAsBad = option.defaultValue.get(); } } } + /// \brief Inits the HF event selection object + /// \param device device spec to get the configs from the reco workflow + /// \param registry reference to the histogram registry + void init(const o2::framework::DeviceSpec& device, o2::framework::HistogramRegistry& registry) + { + // we get the configuration from the reco workflow + configureFromDevice(device); + + // we initialise the RCT checker + if (requireGoodRct) { + rctChecker.init(rctLabel, rctCheckZDC, rctTreatLimitedAcceptanceAsBad); + } + + // we initialise histograms + addHistograms(registry); + } + /// \brief Function to apply event selections to generated MC collisions /// \param mcCollision MC collision to test against the selection criteria /// \param collSlice collection of reconstructed collisions @@ -406,6 +468,16 @@ struct HfEventSelectionMc { SETBIT(rejectionMask, EventRejection::Centrality); } } + + /// RCT condition + if (requireGoodRct) { + for (auto const& collision : collSlice) { + if (!rctChecker.checkTable(collision)) { + SETBIT(rejectionMask, EventRejection::Rct); + break; + } + } + } /// Sel8 trigger selection if (useSel8Trigger && (!bc.selection_bit(o2::aod::evsel::kIsTriggerTVX) || !bc.selection_bit(o2::aod::evsel::kNoTimeFrameBorder) || !bc.selection_bit(o2::aod::evsel::kNoITSROFrameBorder))) { SETBIT(rejectionMask, EventRejection::Trigger); From 8e0780e76846bf850029c3040d4c7b7302efcff1 Mon Sep 17 00:00:00 2001 From: Katarzyna <116073883+kgwizdzi@users.noreply.github.com> Date: Fri, 25 Apr 2025 13:57:56 +0200 Subject: [PATCH 1098/1650] [PWGCF] FemtoUniverse - update in efficiency base task (#10987) --- .../Tasks/femtoUniverseEfficiencyBase.cxx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniverseEfficiencyBase.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniverseEfficiencyBase.cxx index 42605c6c059..490540b9dea 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniverseEfficiencyBase.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniverseEfficiencyBase.cxx @@ -363,7 +363,6 @@ struct FemtoUniverseEfficiencyBase { if (part.partType() != confParticleTypePartOne || part.sign() != confChargePart1 || !isParticleNSigma(confPDGCodePartOne, part.p(), trackCuts.getNsigmaTPC(part, o2::track::PID::Proton), trackCuts.getNsigmaTOF(part, o2::track::PID::Proton), trackCuts.getNsigmaTPC(part, o2::track::PID::Pion), trackCuts.getNsigmaTOF(part, o2::track::PID::Pion), trackCuts.getNsigmaTPC(part, o2::track::PID::Kaon), trackCuts.getNsigmaTOF(part, o2::track::PID::Kaon), trackCuts.getNsigmaTPC(part, o2::track::PID::Deuteron), trackCuts.getNsigmaTOF(part, o2::track::PID::Deuteron))) { continue; } - trackHistoPartOneRec.fillQA(part); if (!part.has_fdMCParticle()) { continue; @@ -374,6 +373,11 @@ struct FemtoUniverseEfficiencyBase { continue; } + if (!(std::abs(mcParticle.pdgMCTruth()) == std::abs(confPDGCodePartOne))) { + continue; + } + + trackHistoPartOneRec.fillQA(part); registryPDG.fill(HIST("part1/PDGvspT"), part.pt(), mcParticle.pdgMCTruth()); registryMCOrigin.fill(HIST("part1/hPt"), mcParticle.pt()); } @@ -384,8 +388,6 @@ struct FemtoUniverseEfficiencyBase { continue; } - trackHistoPartTwoRec.fillQA(part); - if (!part.has_fdMCParticle()) { continue; } @@ -395,6 +397,11 @@ struct FemtoUniverseEfficiencyBase { continue; } + if (!(std::abs(mcParticle.pdgMCTruth()) == std::abs(confPDGCodePartTwo))) { + continue; + } + + trackHistoPartTwoRec.fillQA(part); registryPDG.fill(HIST("part2/PDGvspT"), part.pt(), mcParticle.pdgMCTruth()); registryMCOrigin.fill(HIST("part2/hPt"), mcParticle.pt()); } From 402ce9edc70e288bc4a164cfe2e8e756da6026bb Mon Sep 17 00:00:00 2001 From: Lars <146946151+ljoergen@users.noreply.github.com> Date: Fri, 25 Apr 2025 14:58:27 +0200 Subject: [PATCH 1099/1650] [PWGLF] angularCorrelationsInJets.cxx: added random event rejection (#10988) Co-authored-by: ALICE Action Bot --- .../Nuspex/angularCorrelationsInJets.cxx | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx b/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx index a0cbae145e3..98ee6bfa968 100644 --- a/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx +++ b/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx @@ -18,6 +18,7 @@ #include #include #include +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -66,6 +67,8 @@ struct AngularCorrelationsInJets { Configurable doJetCorrelations{"doJetCorrelations", false, "measure correlations for all particles inside jets"}; Configurable doFullCorrelations{"doFullCorrelations", false, "measure correlations for all particles in an event"}; Configurable measureKaons{"measureKaons", false, "measure correlations for K-K"}; + Configurable rejectEvents{"rejectEvents", false, "reject some events"}; + Configurable rejectionPercentage{"rejectionPercentage", 3, "percentage of events to reject"}; // Track Cuts Configurable minNCrossedRowsTPC{"minNCrossedRowsTPC", 80, "min number of crossed rows TPC"}; @@ -163,6 +166,7 @@ struct AngularCorrelationsInJets { // Counters registryData.add("numberOfEvents", "Number of events", HistType::kTH1I, {{1, 0, 1}}); + registryData.add("numberRejectedEvents", "Number of events rejected", HistType::kTH1I, {{2, 0, 2, "counter"}}); registryData.add("numberOfJets", "Total number of jets", HistType::kTH1I, {{1, 0, 1}}); registryData.add("eventProtocol", "Event protocol", HistType::kTH1I, {{20, 0, 20}}); registryData.add("trackProtocol", "Track protocol", HistType::kTH1I, {{20, 0, 20}}); @@ -312,6 +316,18 @@ struct AngularCorrelationsInJets { mRunNumber = bc.runNumber(); } + bool shouldRejectEvent() + { + static std::random_device rd; + static std::mt19937 gen(rd()); + static std::uniform_int_distribution<> dis(0, 99); + int randomNumber = dis(gen); + if (randomNumber > rejectionPercentage) { + return false; // accept event + } + return true; // reject event + } + template bool hasITSHit(const T& track, int layer) { @@ -1250,6 +1266,16 @@ struct AngularCorrelationsInJets { BCsWithRun2Info const&) { for (const auto& collision : collisions) { + if (rejectEvents) { + // event counter: before event rejection + registryData.fill(HIST("numberRejectedEvents"), 0); + + if (shouldRejectEvent()) + continue; + + // event counter: after event rejection + registryData.fill(HIST("numberRejectedEvents"), 1); + } auto bc = collision.bc_as(); initCCDB(bc); @@ -1270,6 +1296,16 @@ struct AngularCorrelationsInJets { soa::Filtered const& tracks) { for (const auto& collision : collisions) { + if (rejectEvents) { + // event counter: before event rejection + registryData.fill(HIST("numberRejectedEvents"), 0); + + if (shouldRejectEvent()) + continue; + + // event counter: after event rejection + registryData.fill(HIST("numberRejectedEvents"), 1); + } registryData.fill(HIST("eventProtocol"), 0); if (!collision.sel8()) continue; @@ -1288,6 +1324,16 @@ struct AngularCorrelationsInJets { void processMCRun2(McCollisions const& collisions, soa::Filtered const& tracks, BCsWithRun2Info const&, aod::McParticles const&, aod::McCollisions const&) { for (const auto& collision : collisions) { + if (rejectEvents) { + // event counter: before event rejection + registryData.fill(HIST("numberRejectedEvents"), 0); + + if (shouldRejectEvent()) + continue; + + // event counter: after event rejection + registryData.fill(HIST("numberRejectedEvents"), 1); + } auto bc = collision.bc_as(); initCCDB(bc); @@ -1307,6 +1353,16 @@ struct AngularCorrelationsInJets { void processMCRun3(McCollisions const& collisions, soa::Filtered const& tracks, aod::McParticles const&, aod::McCollisions const&) { for (const auto& collision : collisions) { + if (rejectEvents) { + // event counter: before event rejection + registryData.fill(HIST("numberRejectedEvents"), 0); + + if (shouldRejectEvent()) + continue; + + // event counter: after event rejection + registryData.fill(HIST("numberRejectedEvents"), 1); + } registryData.fill(HIST("eventProtocol"), 0); if (!collision.sel8()) continue; From 24c1e518ced95db86598a2ed29bc80ce0eec47f9 Mon Sep 17 00:00:00 2001 From: Florian Jonas Date: Fri, 25 Apr 2025 15:29:49 +0200 Subject: [PATCH 1100/1650] [PWGJE] fixed wrong data type for isolation energy (#10989) Co-authored-by: ALICE Action Bot --- PWGJE/DataModel/GammaJetAnalysisTree.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGJE/DataModel/GammaJetAnalysisTree.h b/PWGJE/DataModel/GammaJetAnalysisTree.h index 7d468a339e7..cfd58f75773 100644 --- a/PWGJE/DataModel/GammaJetAnalysisTree.h +++ b/PWGJE/DataModel/GammaJetAnalysisTree.h @@ -52,7 +52,7 @@ DECLARE_SOA_COLUMN(Time, time, float); //! clust DECLARE_SOA_COLUMN(IsExotic, isExotic, bool); //! flag to mark cluster as exotic DECLARE_SOA_COLUMN(DistanceToBadChannel, distanceToBadChannel, float); //! distance to bad channel DECLARE_SOA_COLUMN(NLM, nlm, ushort); //! number of local maxima -DECLARE_SOA_COLUMN(IsoRaw, isoraw, ushort); //! isolation in cone not corrected for Rho +DECLARE_SOA_COLUMN(IsoRaw, isoraw, float); //! isolation in cone not corrected for Rho DECLARE_SOA_COLUMN(PerpConeRho, perpconerho, float); //! rho in perpendicular cone DECLARE_SOA_COLUMN(TMdeltaPhi, tmdeltaphi, float); //! delta phi between cluster and closest match DECLARE_SOA_COLUMN(TMdeltaEta, tmdeltaeta, float); //! delta eta between cluster and closest match From 75451072f730114f172fc771ecf8949b31332a1a Mon Sep 17 00:00:00 2001 From: Sigurd Nese <32108009+sigurdnese@users.noreply.github.com> Date: Fri, 25 Apr 2025 17:08:12 +0200 Subject: [PATCH 1101/1650] [PWGDQ] Improvements to UPC D0 MC analysis (#10992) --- PWGDQ/Core/MCSignalLibrary.cxx | 17 ++ .../TableProducer/tableMakerMC_withAssoc.cxx | 43 ++++- PWGDQ/Tasks/dqEfficiency_withAssoc.cxx | 165 ++++++++++++------ 3 files changed, 168 insertions(+), 57 deletions(-) diff --git a/PWGDQ/Core/MCSignalLibrary.cxx b/PWGDQ/Core/MCSignalLibrary.cxx index 614dcc3a2c4..53bff5b2b3d 100644 --- a/PWGDQ/Core/MCSignalLibrary.cxx +++ b/PWGDQ/Core/MCSignalLibrary.cxx @@ -1471,12 +1471,29 @@ MCSignal* o2::aod::dqmcsignals::GetMCSignal(const char* name) signal = new MCSignal(name, "D0", {prong}, {-1}); return signal; } + if (!nameStr.compare("nonPromptD0")) { + MCProng prong(2, {Pdg::kD0, 503}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); + signal = new MCSignal(name, "Non-prompt D0", {prong}, {-1}); + return signal; + } + if (!nameStr.compare("D0FS")) { + MCProng prong(1, {Pdg::kD0}, {true}, {false}, {0}, {0}, {false}); + prong.SetSourceBit(0, MCProng::kHEPMCFinalState); + signal = new MCSignal(name, "D0", {prong}, {-1}); + return signal; + } if (!nameStr.compare("KPiFromD0")) { MCProng prongKaon(2, {321, Pdg::kD0}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); MCProng prongPion(2, {211, Pdg::kD0}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); signal = new MCSignal(name, "Kaon and pion pair from D0", {prongKaon, prongPion}, {1, 1}); return signal; } + if (!nameStr.compare("KPiFromD0Reflected")) { + MCProng prongFalseKaon(2, {211, Pdg::kD0}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); + MCProng prongFalsePion(2, {321, Pdg::kD0}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); + signal = new MCSignal(name, "Kaon and pion pair from D0 with reflected mass assumption", {prongFalseKaon, prongFalsePion}, {1, 1}); + return signal; + } if (!nameStr.compare("Dcharged")) { MCProng prong(1, {Pdg::kDPlus}, {true}, {false}, {0}, {0}, {false}); signal = new MCSignal(name, "D+/-", {prong}, {-1}); diff --git a/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx b/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx index aa35c36a0ec..440a24a3ec1 100644 --- a/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx +++ b/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx @@ -16,6 +16,7 @@ // The skimmed MC stack includes the MC truth particles corresponding to the list of user specified MC signals (see MCsignal.h) // and the MC truth particles corresponding to the reconstructed tracks selected by the specified track cuts on reconstructed data. +#include #include #include #include @@ -86,6 +87,7 @@ using MyMuonsWithCov = soa::Join; using MyEventsWithMults = soa::Join; +using MyEventsWithMultsAndRapidityGapFilter = soa::Join; using MyEventsWithCent = soa::Join; using MyEventsWithCentAndMults = soa::Join; using MFTTrackLabeled = soa::Join; @@ -95,6 +97,7 @@ constexpr static uint32_t gkEventFillMap = VarManager::ObjTypes::BC | VarManager constexpr static uint32_t gkEventFillMapWithMults = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision | VarManager::ObjTypes::CollisionMult | VarManager::ObjTypes::CollisionMultExtra; // constexpr static uint32_t gkEventFillMapWithCent = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision | VarManager::ObjTypes::CollisionCent; constexpr static uint32_t gkEventFillMapWithCentAndMults = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision | VarManager::ObjTypes::CollisionCent | VarManager::CollisionMult | VarManager::CollisionMultExtra; +constexpr static uint32_t gkEventFillMapWithMultsRapidityGapFilter = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision | VarManager::ObjTypes::CollisionMult | VarManager::ObjTypes::CollisionMultExtra | VarManager::ObjTypes::RapidityGapFilter; // constexpr static uint32_t gkEventMCFillMap = VarManager::ObjTypes::CollisionMC; // constexpr static uint32_t gkTrackFillMap = VarManager::ObjTypes::Track | VarManager::ObjTypes::TrackExtra | VarManager::ObjTypes::TrackDCA | VarManager::ObjTypes::TrackSelection | VarManager::ObjTypes::TrackPID; constexpr static uint32_t gkTrackFillMapWithCov = VarManager::ObjTypes::Track | VarManager::ObjTypes::TrackExtra | VarManager::ObjTypes::TrackDCA | VarManager::ObjTypes::TrackSelection | VarManager::ObjTypes::TrackCov | VarManager::ObjTypes::TrackPID; @@ -236,7 +239,7 @@ struct TableMakerMC { { // Check whether barrel or muon are enabled bool isProcessBCenabled = context.mOptions.get("processPP"); - bool isBarrelEnabled = (context.mOptions.get("processPP") || context.mOptions.get("processPPBarrelOnly") || context.mOptions.get("processPbPbBarrelOnly")); + bool isBarrelEnabled = (context.mOptions.get("processPP") || context.mOptions.get("processPPBarrelOnly") || context.mOptions.get("processPbPbBarrelOnly") || context.mOptions.get("processPbPbWithFilterBarrelOnly")); bool isMuonEnabled = (context.mOptions.get("processPP") || context.mOptions.get("processPPMuonOnlyBasic") || context.mOptions.get("processPPMuonOnly") || context.mOptions.get("processPbPbMuonOnly")); // Make sure at least one process function is enabled if (!(isProcessBCenabled || isBarrelEnabled || isMuonEnabled)) { @@ -553,6 +556,13 @@ struct TableMakerMC { } (reinterpret_cast(fStatsList->At(0)))->Fill(1.0, static_cast(o2::aod::evsel::kNsel)); + // apply the event filter + if constexpr ((TEventFillMap & VarManager::ObjTypes::RapidityGapFilter) > 0) { + if (!collision.eventFilter()) { + continue; + } + } + auto bc = collision.template bc_as(); // store the selection decisions uint64_t tag = static_cast(0); @@ -562,6 +572,10 @@ struct TableMakerMC { if (bcEvSel.globalIndex() != bc.globalIndex()) { tag |= (static_cast(1) << 0); } + // Put the 8 first bits of the event filter in the last 8 bits of the tag + if constexpr ((TEventFillMap & VarManager::ObjTypes::RapidityGapFilter) > 0) { + tag |= (collision.eventFilter() << 56); + } // Compute BC and event quantities and fill histograms VarManager::ResetValues(0, VarManager::kNEventWiseVariables); @@ -602,16 +616,25 @@ struct TableMakerMC { event(tag, bc.runNumber(), collision.posX(), collision.posY(), collision.posZ(), collision.numContrib(), collision.collisionTime(), collision.collisionTimeRes()); if constexpr ((TEventFillMap & VarManager::ObjTypes::CollisionMult) > 0) { multTPC = collision.multTPC(); - multFV0A = collision.multFV0A(); multFV0C = collision.multFV0C(); - multFT0A = collision.multFT0A(); - multFT0C = collision.multFT0C(); - multFDDA = collision.multFDDA(); - multFDDC = collision.multFDDC(); multZNA = collision.multZNA(); multZNC = collision.multZNC(); multTracklets = collision.multTracklets(); multTracksPV = collision.multNTracksPV(); + if constexpr ((TEventFillMap & VarManager::ObjTypes::RapidityGapFilter) > 0) { + // Use the FIT signals from the nearest BC with FIT amplitude above threshold + multFV0A = collision.newBcMultFV0A(); + multFT0A = collision.newBcMultFT0A(); + multFT0C = collision.newBcMultFT0C(); + multFDDA = collision.newBcMultFDDA(); + multFDDC = collision.newBcMultFDDC(); + } else { + multFV0A = collision.multFV0A(); + multFT0A = collision.multFT0A(); + multFT0C = collision.multFT0C(); + multFDDA = collision.multFDDA(); + multFDDC = collision.multFDDC(); + } } if constexpr ((TEventFillMap & VarManager::ObjTypes::CollisionCent) > 0) { centFT0C = collision.centFT0C(); @@ -1338,6 +1361,13 @@ struct TableMakerMC { fullSkimming(collisions, bcs, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr, mcCollisions, mcParticles); } + void processPbPbWithFilterBarrelOnly(MyEventsWithMultsAndRapidityGapFilter const& collisions, aod::BCsWithTimestamps const& bcs, + MyBarrelTracksWithCov const& tracksBarrel, aod::TrackAssoc const& trackAssocs, + aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) + { + fullSkimming(collisions, bcs, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr, mcCollisions, mcParticles); + } + void processPbPbMuonOnly(MyEventsWithCentAndMults const& collisions, aod::BCsWithTimestamps const& bcs, MyMuonsWithCov const& tracksMuon, MFTTrackLabeled const& mftTracks, aod::FwdTrackAssoc const& fwdTrackAssocs, aod::MFTTrackAssoc const& mftAssocs, @@ -1363,6 +1393,7 @@ struct TableMakerMC { PROCESS_SWITCH(TableMakerMC, processPPMuonOnly, "Produce only muon skims, pp settings", false); PROCESS_SWITCH(TableMakerMC, processPbPb, "Produce both barrel and muon skims, PbPb settings", false); PROCESS_SWITCH(TableMakerMC, processPbPbBarrelOnly, "Produce only barrel skims, PbPb settings", false); + PROCESS_SWITCH(TableMakerMC, processPbPbWithFilterBarrelOnly, "Produce only barrel skims, pp settings with rapidity gap filter ", false); PROCESS_SWITCH(TableMakerMC, processPbPbMuonOnly, "Produce only muon skims, PbPb settings", false); PROCESS_SWITCH(TableMakerMC, processOnlyBCs, "Analyze the BCs to store sampled lumi", false); }; diff --git a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx index a6d69a121d1..f747556ac49 100644 --- a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx +++ b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx @@ -118,6 +118,7 @@ using MyEvents = soa::Join; using MyEventsVtxCov = soa::Join; using MyEventsVtxCovSelected = soa::Join; +using MyEventsVtxCovSelectedMultExtra = soa::Join; using MyEventsVtxCovSelectedQvector = soa::Join; using MyEventsQvector = soa::Join; @@ -137,6 +138,7 @@ using MyMuonTracksWithCovWithAmbiguities = soa::Join fConfigPropToPCA{"cfgPropToPCA", false, "Propagate tracks to secondary vertex"}; Configurable fConfigLutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; - Configurable fConfigRunMCGenPair{"cfgRunMCGenPair", false, "Do pairing of true MC particles"}; Configurable fConfigMCGenSignals{"cfgBarrelMCGenSignals", "", "Comma separated list of MC signals (generated)"}; Configurable fConfigMCRecSignals{"cfgBarrelMCRecSignals", "", "Comma separated list of MC signals (reconstructed)"}; + Configurable fConfigMCRecSignalsJSON{"cfgMCRecSignalsJSON", "", "Additional list of MC signals (reconstructed) via JSON"}; + Configurable fConfigMCGenSignalsJSON{"cfgMCGenSignalsJSON", "", "Comma separated list of MC signals (generated) via JSON"}; Service fCCDB; @@ -2141,8 +2144,8 @@ struct AnalysisAsymmetricPairing { std::vector fPairCuts; int fNPairHistPrefixes; - std::vector fRecMCSignals; - std::vector fGenMCSignals; + std::vector fRecMCSignals; + std::vector fGenMCSignals; // Filter masks to find legs in BarrelTrackCuts table uint32_t fLegAFilterMask; @@ -2161,6 +2164,8 @@ struct AnalysisAsymmetricPairing { int fNPairCuts = 0; int fNCommonTrackCuts; + Filter eventFilter = aod::dqanalysisflags::isEventSelected > static_cast(0); + Preslice> trackAssocsPerCollision = aod::reducedtrack_association::reducedeventId; // Partitions for triplets and asymmetric pairs @@ -2173,6 +2178,7 @@ struct AnalysisAsymmetricPairing { void init(o2::framework::InitContext& context) { + bool isMCGen = context.mOptions.get("processMCGen") || context.mOptions.get("processMCGenWithEventSelection"); if (context.mOptions.get("processDummy")) { return; } @@ -2211,7 +2217,7 @@ struct AnalysisAsymmetricPairing { for (int isig = 0; isig < objRecSigArray->GetEntries(); ++isig) { MCSignal* sig = o2::aod::dqmcsignals::GetMCSignal(objRecSigArray->At(isig)->GetName()); if (sig) { - fRecMCSignals.push_back(*sig); + fRecMCSignals.push_back(sig); } } @@ -2262,7 +2268,7 @@ struct AnalysisAsymmetricPairing { uint32_t fConstructedLegCFilterMask = 0; TString legCutsStr = fConfigLegCuts.value; std::unique_ptr objArrayLegs(legCutsStr.Tokenize(",")); - if (objArrayLegs->GetEntries() == 0) { + if (objArrayLegs->GetEntries() == 0 && !isMCGen) { LOG(fatal) << "No cuts defining legs. Check the config!"; } fNLegCuts = objArrayLegs->GetEntries(); @@ -2351,13 +2357,13 @@ struct AnalysisAsymmetricPairing { auto sig = fRecMCSignals.at(isig); int offset = fNLegCuts * isig * (1 + fNCommonTrackCuts + fNPairCuts + fNCommonTrackCuts * fNPairCuts); names = { - Form("TripletsBarrelSE_%s_%s", legsStr.Data(), sig.GetName())}; + Form("TripletsBarrelSE_%s_%s", legsStr.Data(), sig->GetName())}; histNames += Form("%s;", names[0].Data()); fBarrelHistNamesMCmatched[offset + icut] = names; for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { names = {}; - names.push_back(Form("TripletsBarrelSE_%s_%s_%s", legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), sig.GetName())); + names.push_back(Form("TripletsBarrelSE_%s_%s_%s", legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), sig->GetName())); histNames += Form("%s;", names[0].Data()); fBarrelHistNamesMCmatched[offset + fNLegCuts + icut * fNCommonTrackCuts + iCommonCut] = names; } @@ -2366,12 +2372,12 @@ struct AnalysisAsymmetricPairing { std::unique_ptr objArrayPair(cutNamesStr.Tokenize(",")); for (int iPairCut = 0; iPairCut < fNPairCuts; ++iPairCut) { // loop over pair cuts names = {}; - names.push_back(Form("TripletsBarrelSE_%s_%s_%s", legsStr.Data(), objArrayPair->At(iPairCut)->GetName(), sig.GetName())); + names.push_back(Form("TripletsBarrelSE_%s_%s_%s", legsStr.Data(), objArrayPair->At(iPairCut)->GetName(), sig->GetName())); histNames += Form("%s;", names[0].Data()); fBarrelHistNamesMCmatched[offset + fNLegCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut] = names; for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { names = {}; - names.push_back(Form("TripletsBarrelSE_%s_%s_%s_%s", legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), objArrayPair->At(iPairCut)->GetName(), sig.GetName())); + names.push_back(Form("TripletsBarrelSE_%s_%s_%s_%s", legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), objArrayPair->At(iPairCut)->GetName(), sig->GetName())); histNames += Form("%s;", names[0].Data()); fBarrelHistNamesMCmatched[offset + (fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * (1 + fNPairCuts) + iPairCut] = names; } // end loop (common cuts) @@ -2432,7 +2438,7 @@ struct AnalysisAsymmetricPairing { names.push_back(Form("%s_%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), objArrayPair->At(iPairCut)->GetName())); histNames += Form("%s;", names[iPrefix].Data()); } - fTrackHistNames[(fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * (1 + fNPairCuts) + iPairCut] = names; + fTrackHistNames[(fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * fNPairCuts + iPairCut] = names; } // end loop (common cuts) } // end loop (pair cuts) } // end if (pair cuts) @@ -2444,12 +2450,12 @@ struct AnalysisAsymmetricPairing { names = {}; int offset = fNLegCuts * isig * (1 + fNCommonTrackCuts + fNPairCuts + fNCommonTrackCuts * fNPairCuts); for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) { - names.push_back(Form("%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), sig.GetName())); + names.push_back(Form("%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), sig->GetName())); histNames += Form("%s;", names[iPrefix].Data()); } if (fConfigReflectedHistograms.value) { for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) { - names.push_back(Form("%s_reflected_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), sig.GetName())); + names.push_back(Form("%s_reflected_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), sig->GetName())); histNames += Form("%s;", names[fNPairHistPrefixes + iPrefix].Data()); } } @@ -2458,7 +2464,7 @@ struct AnalysisAsymmetricPairing { for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { names = {}; for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) { - names.push_back(Form("%s_%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), sig.GetName())); + names.push_back(Form("%s_%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), sig->GetName())); histNames += Form("%s;", names[iPrefix].Data()); } fBarrelHistNamesMCmatched[offset + fNLegCuts + icut * fNCommonTrackCuts + iCommonCut] = names; @@ -2469,17 +2475,17 @@ struct AnalysisAsymmetricPairing { for (int iPairCut = 0; iPairCut < fNPairCuts; ++iPairCut) { // loop over pair cuts names = {}; for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) { - names.push_back(Form("%s_%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), objArrayPair->At(iPairCut)->GetName(), sig.GetName())); + names.push_back(Form("%s_%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), objArrayPair->At(iPairCut)->GetName(), sig->GetName())); histNames += Form("%s;", names[iPrefix].Data()); } fBarrelHistNamesMCmatched[offset + fNLegCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut] = names; for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { names = {}; for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) { - names.push_back(Form("%s_%s_%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), objArrayPair->At(iPairCut)->GetName(), sig.GetName())); + names.push_back(Form("%s_%s_%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), objArrayPair->At(iPairCut)->GetName(), sig->GetName())); histNames += Form("%s;", names[iPrefix].Data()); } - fBarrelHistNamesMCmatched[offset + (fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * (1 + fNPairCuts) + iPairCut] = names; + fBarrelHistNamesMCmatched[offset + (fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * fNPairCuts + iPairCut] = names; } // end loop (common cuts) } // end loop (pair cuts) } // end if (pair cuts) @@ -2488,6 +2494,18 @@ struct AnalysisAsymmetricPairing { } } + // Add the reco MCSignals from the JSON config + TString addMCSignalsStr = fConfigMCRecSignalsJSON.value; + if (addMCSignalsStr != "") { + std::vector addMCSignals = dqmcsignals::GetMCSignalsFromJSON(addMCSignalsStr.Data()); + for (auto& mcIt : addMCSignals) { + if (mcIt->GetNProngs() != 3) { + LOG(fatal) << "Signal at reconstructed level requested (" << mcIt->GetName() << ") " << "does not have 3 prongs! Fix it"; + } + fRecMCSignals.push_back(mcIt); + } + } + // Add histogram classes for each specified MCsignal at the generator level // TODO: create a std::vector of hist classes to be used at Fill time, to avoid using Form in the process function TString sigGenNamesStr = fConfigMCGenSignals.value; @@ -2496,8 +2514,22 @@ struct AnalysisAsymmetricPairing { MCSignal* sig = o2::aod::dqmcsignals::GetMCSignal(objGenSigArray->At(isig)->GetName()); if (sig) { if (sig->GetNProngs() == 1) { // NOTE: 1-prong signals required - fGenMCSignals.push_back(*sig); + fGenMCSignals.push_back(sig); histNames += Form("MCTruthGen_%s;", sig->GetName()); // TODO: Add these names to a std::vector to avoid using Form in the process function + histNames += Form("MCTruthGenSel_%s;", sig->GetName()); // TODO: Add these names to a std::vector to avoid using Form in the process function + } + } + } + + // Add the gen MCSignals from the JSON config + addMCSignalsStr = fConfigMCGenSignalsJSON.value; + if (addMCSignalsStr != "") { + std::vector addMCSignals = dqmcsignals::GetMCSignalsFromJSON(addMCSignalsStr.Data()); + for (auto& mcIt : addMCSignals) { + if (mcIt->GetNProngs() == 1) { + fGenMCSignals.push_back(mcIt); + histNames += Form("MCTruthGen_%s;", mcIt->GetName()); // TODO: Add these names to a std::vector to avoid using Form in the process function + histNames += Form("MCTruthGenSel_%s;", mcIt->GetName()); // TODO: Add these names to a std::vector to avoid using Form in the process function } } } @@ -2680,7 +2712,7 @@ struct AnalysisAsymmetricPairing { for (auto sig = fRecMCSignals.begin(); sig != fRecMCSignals.end(); sig++, isig++) { if (t1.has_reducedMCTrack() && t2.has_reducedMCTrack()) { VarManager::FillPairMC(t1.reducedMCTrack(), t2.reducedMCTrack()); - if ((*sig).CheckSignal(true, t1.reducedMCTrack(), t2.reducedMCTrack())) { + if ((*sig)->CheckSignal(true, t1.reducedMCTrack(), t2.reducedMCTrack())) { mcDecision |= static_cast(1) << isig; } } @@ -2806,24 +2838,24 @@ struct AnalysisAsymmetricPairing { for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { if (twoTrackCommonFilter & fCommonTrackCutFilterMasks[iCommonCut]) { if (sign1 * sign2 < 0) { - fHistMan->FillHistClass(histNames[(fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * (1 + fNPairCuts) + iPairCut][0].Data(), VarManager::fgValues); + fHistMan->FillHistClass(histNames[(fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * fNPairCuts + iPairCut][0].Data(), VarManager::fgValues); } else if (fConfigSameSignHistograms.value) { if (sign1 > 0) { - fHistMan->FillHistClass(histNames[(fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * (1 + fNPairCuts) + iPairCut][1].Data(), VarManager::fgValues); + fHistMan->FillHistClass(histNames[(fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * fNPairCuts + iPairCut][1].Data(), VarManager::fgValues); } else { - fHistMan->FillHistClass(histNames[(fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * (1 + fNPairCuts) + iPairCut][2].Data(), VarManager::fgValues); + fHistMan->FillHistClass(histNames[(fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * fNPairCuts + iPairCut][2].Data(), VarManager::fgValues); } } for (unsigned int isig = 0; isig < fRecMCSignals.size(); isig++) { // loop over MC signals int offset = fNLegCuts * isig * (1 + fNCommonTrackCuts + fNPairCuts + fNCommonTrackCuts * fNPairCuts); if (mcDecision & (static_cast(1) << isig)) { if (sign1 * sign2 < 0) { - fHistMan->FillHistClass(histNamesMC[offset + (fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * (1 + fNPairCuts) + iPairCut][0].Data(), VarManager::fgValues); + fHistMan->FillHistClass(histNamesMC[offset + (fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * fNPairCuts + iPairCut][0].Data(), VarManager::fgValues); } else if (fConfigSameSignHistograms.value) { if (sign1 > 0) { - fHistMan->FillHistClass(histNamesMC[offset + (fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * (1 + fNPairCuts) + iPairCut][1].Data(), VarManager::fgValues); + fHistMan->FillHistClass(histNamesMC[offset + (fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * fNPairCuts + iPairCut][1].Data(), VarManager::fgValues); } else { - fHistMan->FillHistClass(histNamesMC[offset + (fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * (1 + fNPairCuts) + iPairCut][2].Data(), VarManager::fgValues); + fHistMan->FillHistClass(histNamesMC[offset + (fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * fNPairCuts + iPairCut][2].Data(), VarManager::fgValues); } } } @@ -2968,7 +3000,7 @@ struct AnalysisAsymmetricPairing { mcDecision = 0; for (auto sig = fRecMCSignals.begin(); sig != fRecMCSignals.end(); sig++, isig++) { if (t1.has_reducedMCTrack() && t2.has_reducedMCTrack() && t3.has_reducedMCTrack()) { - if ((*sig).CheckSignal(true, t1.reducedMCTrack(), t2.reducedMCTrack(), t3.reducedMCTrack())) { + if ((*sig)->CheckSignal(true, t1.reducedMCTrack(), t2.reducedMCTrack(), t3.reducedMCTrack())) { mcDecision |= (static_cast(1) << isig); } } @@ -3035,48 +3067,76 @@ struct AnalysisAsymmetricPairing { } // end loop (cuts) } - PresliceUnsorted perReducedMcEvent = aod::reducedtrackMC::reducedMCeventId; + void processKaonPionSkimmed(MyEventsVtxCovSelected const& events, + soa::Join const& barrelAssocs, + MyBarrelTracksWithCovWithAmbiguities const& barrelTracks, + ReducedMCEvents const& mcEvents, ReducedMCTracks const& mcTracks) + { + runAsymmetricPairing(events, trackAssocsPerCollision, barrelAssocs, barrelTracks, mcEvents, mcTracks); + } + + void processKaonPionSkimmedMultExtra(MyEventsVtxCovSelectedMultExtra const& events, + soa::Join const& barrelAssocs, + MyBarrelTracksWithCovWithAmbiguities const& barrelTracks, + ReducedMCEvents const& mcEvents, ReducedMCTracks const& mcTracks) + { + runAsymmetricPairing(events, trackAssocsPerCollision, barrelAssocs, barrelTracks, mcEvents, mcTracks); + } + + void processKaonPionPionSkimmed(MyEventsVtxCovSelected const& events, + soa::Join const& barrelAssocs, + MyBarrelTracksWithCovWithAmbiguities const& barrelTracks, + ReducedMCEvents const& mcEvents, ReducedMCTracks const& mcTracks) + { + runThreeProng(events, trackAssocsPerCollision, barrelAssocs, barrelTracks, mcEvents, mcTracks, VarManager::kTripleCandidateToKPiPi); + } - void runMCGen(ReducedMCTracks const& mcTracks) + void processMCGen(ReducedMCTracks const& mcTracks) { // loop over mc stack and fill histograms for pure MC truth signals // group all the MC tracks which belong to the MC event corresponding to the current reconstructed event + // auto groupedMCTracks = tracksMC.sliceBy(aod::reducedtrackMC::reducedMCeventId, event.reducedMCevent().globalIndex()); for (auto& mctrack : mcTracks) { + VarManager::FillTrackMC(mcTracks, mctrack); // NOTE: Signals are checked here mostly based on the skimmed MC stack, so depending on the requested signal, the stack could be incomplete. // NOTE: However, the working model is that the decisions on MC signals are precomputed during skimming and are stored in the mcReducedFlags member. // TODO: Use the mcReducedFlags to select signals for (auto& sig : fGenMCSignals) { - if (sig.GetNProngs() != 1) { // NOTE: 1-prong signals required here - continue; - } - bool checked = false; - checked = sig.CheckSignal(true, mctrack); - if (checked) { - fHistMan->FillHistClass(Form("MCTruthGen_%s", sig.GetName()), VarManager::fgValues); + if (sig->CheckSignal(true, mctrack)) { + fHistMan->FillHistClass(Form("MCTruthGen_%s", sig->GetName()), VarManager::fgValues); } } } - } // end runMCGen - - void processKaonPionSkimmed(MyEventsVtxCovSelected const& events, - soa::Join const& barrelAssocs, - MyBarrelTracksWithCovWithAmbiguities const& barrelTracks, - ReducedMCEvents const& mcEvents, ReducedMCTracks const& mcTracks) - { - runAsymmetricPairing(events, trackAssocsPerCollision, barrelAssocs, barrelTracks, mcEvents, mcTracks); - if (fConfigRunMCGenPair) - runMCGen(mcTracks); } - void processKaonPionPionSkimmed(MyEventsVtxCovSelected const& events, - soa::Join const& barrelAssocs, - MyBarrelTracksWithCovWithAmbiguities const& barrelTracks, - ReducedMCEvents const& mcEvents, ReducedMCTracks const& mcTracks) + PresliceUnsorted perReducedMcEvent = aod::reducedtrackMC::reducedMCeventId; + + void processMCGenWithEventSelection(soa::Filtered const& events, + ReducedMCEvents const& /*mcEvents*/, ReducedMCTracks const& mcTracks) { - runThreeProng(events, trackAssocsPerCollision, barrelAssocs, barrelTracks, mcEvents, mcTracks, VarManager::kTripleCandidateToKPiPi); - if (fConfigRunMCGenPair) - runMCGen(mcTracks); + for (auto& event : events) { + if (!event.isEventSelected_bit(0)) { + continue; + } + if (!event.has_reducedMCevent()) { + continue; + } + + auto groupedMCTracks = mcTracks.sliceBy(perReducedMcEvent, event.reducedMCeventId()); + groupedMCTracks.bindInternalIndicesTo(&mcTracks); + for (auto& track : groupedMCTracks) { + + VarManager::FillTrackMC(mcTracks, track); + + auto track_raw = groupedMCTracks.rawIteratorAt(track.globalIndex()); + for (auto& sig : fGenMCSignals) { + if (sig->CheckSignal(true, track_raw)) { + fHistMan->FillHistClass(Form("MCTruthGenSel_%s", sig->GetName()), VarManager::fgValues); + } + } + } + } // end loop over reconstructed events } void processDummy(MyEvents&) @@ -3085,7 +3145,10 @@ struct AnalysisAsymmetricPairing { } PROCESS_SWITCH(AnalysisAsymmetricPairing, processKaonPionSkimmed, "Run kaon pion pairing, with skimmed tracks", false); + PROCESS_SWITCH(AnalysisAsymmetricPairing, processKaonPionSkimmedMultExtra, "Run kaon pion pairing, with skimmed tracks", false); PROCESS_SWITCH(AnalysisAsymmetricPairing, processKaonPionPionSkimmed, "Run kaon pion pion triplets, with skimmed tracks", false); + PROCESS_SWITCH(AnalysisAsymmetricPairing, processMCGen, "Loop over MC particle stack and fill generator level histograms", false); + PROCESS_SWITCH(AnalysisAsymmetricPairing, processMCGenWithEventSelection, "Loop over MC particle stack and fill generator level histograms", false); PROCESS_SWITCH(AnalysisAsymmetricPairing, processDummy, "Dummy function, enabled only if none of the others are enabled", true); }; From c15d276684bc53b0a7cc1a4ec7abce180f44db25 Mon Sep 17 00:00:00 2001 From: Marvin Hemmer <53471402+mhemmer-cern@users.noreply.github.com> Date: Fri, 25 Apr 2025 17:59:35 +0200 Subject: [PATCH 1102/1650] [PWGJE,EMCAL-670] Update BC selection to EMCal QA task (#10991) --- PWGJE/Core/utilsBcSelEMC.h | 41 ++------------------------------------ 1 file changed, 2 insertions(+), 39 deletions(-) diff --git a/PWGJE/Core/utilsBcSelEMC.h b/PWGJE/Core/utilsBcSelEMC.h index 1796d130d7f..c613bba70e2 100644 --- a/PWGJE/Core/utilsBcSelEMC.h +++ b/PWGJE/Core/utilsBcSelEMC.h @@ -35,11 +35,6 @@ enum EventRejection { TvxTrigger, TimeFrameBorderCut, ItsRofBorderCut, - IsGoodZvtxFT0vsPV, - NoSameBunchPileup, - NoCollInTimeRangeNarrow, - NoCollInTimeRangeStandard, - NoCollInRofStandard, NEventRejection }; @@ -56,11 +51,6 @@ void setEventRejectionLabels(Histo& hRejection) hRejection->GetXaxis()->SetBinLabel(EventRejection::TvxTrigger + 1, "TVX Trigger"); hRejection->GetXaxis()->SetBinLabel(EventRejection::TimeFrameBorderCut + 1, "TF border"); hRejection->GetXaxis()->SetBinLabel(EventRejection::ItsRofBorderCut + 1, "ITS ROF border"); - hRejection->GetXaxis()->SetBinLabel(EventRejection::IsGoodZvtxFT0vsPV + 1, "PV #it{z} consistency FT0 timing"); - hRejection->GetXaxis()->SetBinLabel(EventRejection::NoSameBunchPileup + 1, "No same-bunch pile-up"); - hRejection->GetXaxis()->SetBinLabel(EventRejection::NoCollInTimeRangeNarrow + 1, "No coll timerange narrow"); - hRejection->GetXaxis()->SetBinLabel(EventRejection::NoCollInTimeRangeStandard + 1, "No coll timerange strict"); - hRejection->GetXaxis()->SetBinLabel(EventRejection::NoCollInRofStandard + 1, "No coll in ROF std"); } struct EMCEventSelection : o2::framework::ConfigurableGroup { @@ -71,12 +61,6 @@ struct EMCEventSelection : o2::framework::ConfigurableGroup { o2::framework::Configurable useTvxTrigger{"useTvxTrigger", true, "Apply TVX trigger sel"}; o2::framework::Configurable useTimeFrameBorderCut{"useTimeFrameBorderCut", true, "Apply TF border cut"}; o2::framework::Configurable useItsRofBorderCut{"useItsRofBorderCut", true, "Apply ITS ROF border cut"}; - o2::framework::Configurable useIsGoodZvtxFT0vsPV{"useIsGoodZvtxFT0vsPV", false, "Check consistency between PVz from central barrel with that from FT0 timing"}; - o2::framework::Configurable useNoSameBunchPileup{"useNoSameBunchPileup", false, "Exclude collisions in bunches with more than 1 reco. PV"}; - o2::framework::Configurable useNoCollInTimeRangeNarrow{"useNoCollInTimeRangeNarrow", false, "Reject collisions in time range narrow"}; - o2::framework::Configurable useNoCollInTimeRangeStandard{"useNoCollInTimeRangeStandard", false, "Reject collisions in time range strict"}; - o2::framework::Configurable useNoCollInRofStandard{"useNoCollInRofStandard", false, "Reject collisions in ROF standard"}; - // histogram names static constexpr char NameHistBCs[] = "hBCs"; @@ -103,8 +87,8 @@ struct EMCEventSelection : o2::framework::ConfigurableGroup { if constexpr (useEvSel) { /// trigger condition - bool sel8 = bc.selection_bit(o2::aod::evsel::kIsBBT0A) && bc.selection_bit(o2::aod::evsel::kIsBBT0C); - if ((useSel8Trigger && sel8) || (!useSel8Trigger && triggerClass > -1 && !bc.alias_bit(triggerClass))) { + bool sel8 = bc.selection_bit(o2::aod::evsel::kIsTriggerTVX) && bc.selection_bit(o2::aod::evsel::kNoTimeFrameBorder) && bc.selection_bit(o2::aod::evsel::kNoITSROFrameBorder); + if ((useSel8Trigger && !sel8) || (!useSel8Trigger && triggerClass > -1 && !bc.alias_bit(triggerClass))) { SETBIT(rejectionMask, EventRejection::Trigger); } /// TVX trigger selection @@ -119,27 +103,6 @@ struct EMCEventSelection : o2::framework::ConfigurableGroup { if (useItsRofBorderCut && !bc.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { SETBIT(rejectionMask, EventRejection::ItsRofBorderCut); } - /// PVz consistency tracking - FT0 timing - if (useIsGoodZvtxFT0vsPV && !bc.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { - SETBIT(rejectionMask, EventRejection::IsGoodZvtxFT0vsPV); - } - /// remove collisions in bunches with more than 1 reco bc - /// POTENTIALLY BAD FOR BEAUTY ANALYSES - if (useNoSameBunchPileup && !bc.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { - SETBIT(rejectionMask, EventRejection::NoSameBunchPileup); - } - /// No collisions in time range narrow - if (useNoCollInTimeRangeNarrow && !bc.selection_bit(o2::aod::evsel::kNoCollInTimeRangeNarrow)) { - SETBIT(rejectionMask, EventRejection::NoCollInTimeRangeNarrow); - } - /// No collisions in time range strict - if (useNoCollInTimeRangeStandard && !bc.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { - SETBIT(rejectionMask, EventRejection::NoCollInTimeRangeStandard); - } - /// No collisions in ROF standard - if (useNoCollInRofStandard && !bc.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { - SETBIT(rejectionMask, EventRejection::NoCollInRofStandard); - } } return rejectionMask; } From c6056a0f14b3840a172db0c14a9f2b79a2b2860a Mon Sep 17 00:00:00 2001 From: omvazque Date: Fri, 25 Apr 2025 13:02:02 -0500 Subject: [PATCH 1103/1650] [PWGLF] Add a minimum Nch Sel. (#10990) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 24 ++++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index de05a2bf275..8fa4b2be38a 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -90,9 +90,6 @@ struct UccZdc { Configurable nBinsTDC{"nBinsTDC", 150, "nbinsTDC"}; Configurable minTdc{"minTdc", -15.0, "minimum TDC"}; Configurable maxTdc{"maxTdc", 15.0, "maximum TDC"}; - Configurable minMeanpT{"minMeanpT", 0.5, "minimum [pT]"}; - Configurable maxMeanpT{"maxMeanpT", 1.1, "maximum [pT]"}; - Configurable nBinsMeanpT{"nBinsMeanpT", 160, "# bins [pT]"}; ConfigurableAxis binsPt{"binsPt", {VARIABLE_WIDTH, 0.0, 0.1, 0.12}, "pT binning"}; ConfigurableAxis binsCent{"binsCent", {VARIABLE_WIDTH, 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.}, "T0C binning"}; @@ -108,6 +105,7 @@ struct UccZdc { Configurable isTDCcut{"isTDCcut", false, "Use TDC cut?"}; Configurable isZEMcut{"isZEMcut", true, "Use ZEM cut?"}; + Configurable minNchSel{"minNchSel", 5., "min Nch Selection"}; Configurable znBasedCut{"znBasedCut", 100, "ZN-based cut"}; Configurable zemCut{"zemCut", 1000., "ZEM cut"}; Configurable tdcCut{"tdcCut", 1., "TDC cut"}; @@ -296,13 +294,13 @@ struct UccZdc { registry.add("NchVsFT0C", ";T0C (#times 1/100, -3.3 < #eta < -2.1);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFT0, 0., 950.}, {nBinsNch, minNch, maxNch}}}); registry.add("NchVsFT0M", ";T0A+T0C (#times 1/100, -3.3 < #eta < -2.1 and 3.5 < #eta < 4.9);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFT0, 0., 3000.}, {nBinsNch, minNch, maxNch}}}); - registry.add("NchVsFT0A", ";T0A (#times 1/100, 3.5 < #eta < 4.9);#it{N}_{ch} (|#eta|<0.8);", kTProfile, {{nBinsAmpFT0, 0., maxAmpFT0}}); - registry.add("NchVsFV0A", ";V0A (#times 1/100, 2.2 < #eta < 5);#it{N}_{ch} (|#eta|<0.8);", kTProfile, {{nBinsAmpFV0, 0., maxAmpFV0}}); + registry.add("NchVsFT0A", ";T0A (#times 1/100, 3.5 < #eta < 4.9);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsNch, minNch, maxNch}}}); + registry.add("NchVsFV0A", ";V0A (#times 1/100, 2.2 < #eta < 5);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFV0, 0., maxAmpFV0}, {nBinsNch, minNch, maxNch}}}); registry.add("NchVsEt", ";#it{E}_{T} (|#eta|<0.8);#LTITS+TPC tracks#GT (|#eta|<0.8);", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsNch, minNch, maxNch}}}); registry.add("NchVsMeanPt", ";#it{N}_{ch} (|#eta|<0.8);#LT[#it{p}_{T}]#GT (|#eta|<0.8);", kTProfile, {{nBinsNch, minNch, maxNch}}); - registry.add("NchVsNPV", ";#it{N}_{PV} (|#eta|<1);#LT ITS+TPC tracks #GT (|#eta|<0.8);", kTProfile, {{6000, -0.5, 5999.5}}); - registry.add("NchVsITStracks", ";ITS tracks nCls >= 5;#LTITS+TPC tracks#GT (|#eta|<0.8);", kTProfile, {{6000, -0.5, 5999.5}}); + registry.add("NchVsNPV", ";#it{N}_{PV} (|#eta|<1);ITS+TPC tracks (|#eta|<0.8);", kTH2F, {{{300, -0.5, 5999.5}, {nBinsNch, minNch, maxNch}}}); + registry.add("NchVsITStracks", ";ITS tracks nCls >= 5;TITS+TPC tracks (|#eta|<0.8);", kTH2F, {{{300, -0.5, 5999.5}, {nBinsNch, minNch, maxNch}}}); registry.add("ZNCVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNC;", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, minNch, maxZN}}}); registry.add("ZNAVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA;", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, minNch, maxZN}}}); registry.add("ZNVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA+ZNC;", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, minNch, maxZN}}}); @@ -544,13 +542,15 @@ struct UccZdc { registry.fill(HIST("NchVsFT0M"), (aT0A + aT0C) / 100., glbTracks); registry.fill(HIST("NchVsEt"), et, glbTracks); - registry.fill(HIST("NchVsMeanPt"), glbTracks, meanpt / glbTracks); registry.fill(HIST("NchVsNPV"), collision.multNTracksPVeta1(), glbTracks); registry.fill(HIST("NchVsITStracks"), itsTracks, glbTracks); registry.fill(HIST("ZNAVsNch"), glbTracks, znA); registry.fill(HIST("ZNCVsNch"), glbTracks, znC); registry.fill(HIST("ZNVsNch"), glbTracks, sumZNs); registry.fill(HIST("ZNDifVsNch"), glbTracks, znA - znC); + if (glbTracks >= minNchSel) { + registry.fill(HIST("NchVsMeanPt"), glbTracks, meanpt / glbTracks); + } } PROCESS_SWITCH(UccZdc, processQA, "Process QA", true); @@ -633,7 +633,7 @@ struct UccZdc { p1 = p2 = p3 = p4 = w1 = w2 = w3 = w4 = 0.0; getPTpowers(pTs, wIs, p1, w1, p2, w2, p3, w3, p4, w4); const double nch{static_cast(pTs.size())}; - if (!(nch != 0.)) { + if (nch < minNchSel) { return; } @@ -723,7 +723,7 @@ struct UccZdc { } const double nch{static_cast(pTs.size())}; - if (!(nch != 0.)) { + if (nch < minNchSel) { return; } @@ -778,6 +778,10 @@ struct UccZdc { } const double nchMC{static_cast(pTsMC.size())}; + if (nchMC < minNchSel) { + return; + } + double p1MC, p2MC, p3MC, p4MC, w1MC, w2MC, w3MC, w4MC; p1MC = p2MC = p3MC = p4MC = w1MC = w2MC = w3MC = w4MC = 0.0; getPTpowers(pTsMC, wIsMC, p1MC, w1MC, p2MC, w2MC, p3MC, w3MC, p4MC, w4MC); From 39d78f98f53b00664b79222426e274965894e64f Mon Sep 17 00:00:00 2001 From: Gianni Shigeru Setoue Liveraro <81832939+gianniliveraro@users.noreply.github.com> Date: Fri, 25 Apr 2025 15:50:02 -0300 Subject: [PATCH 1104/1650] [PWGLF] Improvements in sigma0 tasks (#10981) Co-authored-by: ALICE Action Bot --- PWGLF/DataModel/LFSigmaTables.h | 18 +- .../TableProducer/Strangeness/CMakeLists.txt | 2 +- .../Strangeness/sigma0builder.cxx | 809 ++++++--- PWGLF/Tasks/QC/strderivedGenQA.cxx | 2 + PWGLF/Tasks/Strangeness/sigmaanalysis.cxx | 1605 ++++++++--------- 5 files changed, 1247 insertions(+), 1189 deletions(-) diff --git a/PWGLF/DataModel/LFSigmaTables.h b/PWGLF/DataModel/LFSigmaTables.h index 08b511bf1ca..0980b6891ad 100644 --- a/PWGLF/DataModel/LFSigmaTables.h +++ b/PWGLF/DataModel/LFSigmaTables.h @@ -36,6 +36,7 @@ DECLARE_SOA_COLUMN(SigmaOPAngle, sigmaOPAngle, float); DECLARE_SOA_COLUMN(SigmaCentrality, sigmaCentrality, float); DECLARE_SOA_COLUMN(SigmaRunNumber, sigmaRunNumber, int); DECLARE_SOA_COLUMN(SigmaTimestamp, sigmaTimestamp, uint64_t); +DECLARE_SOA_COLUMN(SigmaIR, sigmaIR, float); } // namespace sigma0Core @@ -46,7 +47,8 @@ DECLARE_SOA_TABLE(Sigma0Cores, "AOD", "SIGMA0CORES", sigma0Core::SigmaOPAngle, sigma0Core::SigmaCentrality, sigma0Core::SigmaRunNumber, - sigma0Core::SigmaTimestamp); + sigma0Core::SigmaTimestamp, + sigma0Core::SigmaIR); // For Photon extra info namespace sigmaPhotonExtra @@ -81,6 +83,8 @@ DECLARE_SOA_COLUMN(PhotonPosITSCls, photonPosITSCls, int); DECLARE_SOA_COLUMN(PhotonNegITSCls, photonNegITSCls, int); DECLARE_SOA_COLUMN(PhotonPosITSChi2PerNcl, photonPosITSChi2PerNcl, float); DECLARE_SOA_COLUMN(PhotonNegITSChi2PerNcl, photonNegITSChi2PerNcl, float); +DECLARE_SOA_COLUMN(PhotonPosTrackCode, photonPosTrackCode, uint8_t); +DECLARE_SOA_COLUMN(PhotonNegTrackCode, photonNegTrackCode, uint8_t); DECLARE_SOA_COLUMN(PhotonV0Type, photonV0Type, uint8_t); DECLARE_SOA_COLUMN(GammaBDTScore, gammaBDTScore, float); @@ -117,6 +121,8 @@ DECLARE_SOA_TABLE(SigmaPhotonExtras, "AOD", "SIGMA0PHOTON", sigmaPhotonExtra::PhotonNegITSCls, sigmaPhotonExtra::PhotonPosITSChi2PerNcl, sigmaPhotonExtra::PhotonNegITSChi2PerNcl, + sigmaPhotonExtra::PhotonPosTrackCode, + sigmaPhotonExtra::PhotonNegTrackCode, sigmaPhotonExtra::PhotonV0Type, sigmaPhotonExtra::GammaBDTScore); @@ -159,6 +165,8 @@ DECLARE_SOA_COLUMN(LambdaPosITSCls, lambdaPosITSCls, int); DECLARE_SOA_COLUMN(LambdaNegITSCls, lambdaNegITSCls, int); DECLARE_SOA_COLUMN(LambdaPosITSChi2PerNcl, lambdaPosChi2PerNcl, float); DECLARE_SOA_COLUMN(LambdaNegITSChi2PerNcl, lambdaNegChi2PerNcl, float); +DECLARE_SOA_COLUMN(LambdaPosTrackCode, lambdaPosTrackCode, uint8_t); +DECLARE_SOA_COLUMN(LambdaNegTrackCode, lambdaNegTrackCode, uint8_t); DECLARE_SOA_COLUMN(LambdaV0Type, lambdaV0Type, uint8_t); DECLARE_SOA_COLUMN(LambdaBDTScore, lambdaBDTScore, float); DECLARE_SOA_COLUMN(AntiLambdaBDTScore, antilambdaBDTScore, float); @@ -202,6 +210,8 @@ DECLARE_SOA_TABLE(SigmaLambdaExtras, "AOD", "SIGMA0LAMBDA", sigmaLambdaExtra::LambdaNegITSCls, sigmaLambdaExtra::LambdaPosITSChi2PerNcl, sigmaLambdaExtra::LambdaNegITSChi2PerNcl, + sigmaLambdaExtra::LambdaPosTrackCode, + sigmaLambdaExtra::LambdaNegTrackCode, sigmaLambdaExtra::LambdaV0Type, sigmaLambdaExtra::LambdaBDTScore, sigmaLambdaExtra::AntiLambdaBDTScore); @@ -216,10 +226,12 @@ DECLARE_SOA_COLUMN(PhotonCandPDGCode, photonCandPDGCode, int); DECLARE_SOA_COLUMN(PhotonCandPDGCodeMother, photonCandPDGCodeMother, int); DECLARE_SOA_COLUMN(IsPhotonCandPrimary, isPhotonCandPrimary, bool); DECLARE_SOA_COLUMN(PhotonMCPt, photonMCPt, float); +DECLARE_SOA_COLUMN(PhotonIsCorrectlyAssoc, photonIsCorrectlyAssoc, bool); DECLARE_SOA_COLUMN(LambdaCandPDGCode, lambdaCandPDGCode, int); DECLARE_SOA_COLUMN(LambdaCandPDGCodeMother, lambdaCandPDGCodeMother, int); DECLARE_SOA_COLUMN(IsLambdaCandPrimary, isLambdaCandPrimary, bool); DECLARE_SOA_COLUMN(LambdaMCPt, lambdaMCPt, float); +DECLARE_SOA_COLUMN(LambdaIsCorrectlyAssoc, lambdaIsCorrectlyAssoc, bool); } // namespace sigmaMCCore @@ -231,10 +243,12 @@ DECLARE_SOA_TABLE(SigmaMCCores, "AOD", "SIGMA0MCCORES", sigmaMCCore::PhotonCandPDGCodeMother, sigmaMCCore::IsPhotonCandPrimary, sigmaMCCore::PhotonMCPt, + sigmaMCCore::PhotonIsCorrectlyAssoc, sigmaMCCore::LambdaCandPDGCode, sigmaMCCore::LambdaCandPDGCodeMother, sigmaMCCore::IsLambdaCandPrimary, - sigmaMCCore::LambdaMCPt); + sigmaMCCore::LambdaMCPt, + sigmaMCCore::LambdaIsCorrectlyAssoc); } // namespace o2::aod #endif // PWGLF_DATAMODEL_LFSIGMATABLES_H_ diff --git a/PWGLF/TableProducer/Strangeness/CMakeLists.txt b/PWGLF/TableProducer/Strangeness/CMakeLists.txt index 84f22d54d1d..6d9f2c04646 100644 --- a/PWGLF/TableProducer/Strangeness/CMakeLists.txt +++ b/PWGLF/TableProducer/Strangeness/CMakeLists.txt @@ -149,7 +149,7 @@ o2physics_add_dpl_workflow(cascademlselection o2physics_add_dpl_workflow(sigma0builder SOURCES sigma0builder.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::MLCore + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::MLCore O2Physics::AnalysisCCDB COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(lambdajetpolarizationbuilder diff --git a/PWGLF/TableProducer/Strangeness/sigma0builder.cxx b/PWGLF/TableProducer/Strangeness/sigma0builder.cxx index 8dfb0cfed27..d633b5b7566 100644 --- a/PWGLF/TableProducer/Strangeness/sigma0builder.cxx +++ b/PWGLF/TableProducer/Strangeness/sigma0builder.cxx @@ -38,6 +38,7 @@ #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Centrality.h" #include "Common/DataModel/PIDResponse.h" +#include "Common/CCDB/ctpRateFetcher.h" #include "PWGLF/DataModel/LFStrangenessTables.h" #include "PWGLF/DataModel/LFStrangenessPIDTables.h" #include "PWGLF/DataModel/LFStrangenessMLTables.h" @@ -55,11 +56,13 @@ using namespace o2::framework; using namespace o2::framework::expressions; using std::array; using dauTracks = soa::Join; -// using V0DerivedMCDatas = soa::Join; using V0DerivedMCDatas = soa::Join; using V0StandardDerivedDatas = soa::Join; struct sigma0builder { + Service ccdb; + ctpRateFetcher rateFetcher; + SliceCache cache; Produces sigma0cores; // save sigma0 candidates for analysis @@ -71,11 +74,27 @@ struct sigma0builder { Preslice perCollisionMCDerived = o2::aod::v0data::straCollisionId; Preslice perCollisionSTDDerived = o2::aod::v0data::straCollisionId; + // pack track quality but separte also afterburner + // dynamic range: 0-31 + enum selection : int { hasTPC = 0, + hasITSTracker, + hasITSAfterburner, + hasTRD, + hasTOF }; + // Histogram registry HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; - // Event selection + Configurable fillQAhistos{"fillQAhistos", false, "if true, fill QA histograms"}; + Configurable fillBkgQAhistos{"fillBkgQAhistos", false, "if true, fill MC QA histograms for Bkg study"}; + Configurable doPi0QA{"doPi0QA", true, "Flag to fill QA histos for pi0 rejection study."}; + Configurable doAssocStudy{"doAssocStudy", false, "Do v0 to collision association study."}; + + // Event level Configurable doPPAnalysis{"doPPAnalysis", true, "if in pp, set to true"}; + Configurable fGetIR{"fGetIR", false, "Flag to retrieve the IR info."}; + Configurable fIRCrashOnNull{"fIRCrashOnNull", false, "Flag to avoid CTP RateFetcher crash."}; + Configurable irSource{"irSource", "T0VTX", "Estimator of the interaction rate (Recommended: pp --> T0VTX, Pb-Pb --> ZNC hadronic)"}; struct : ConfigurableGroup { Configurable requireSel8{"requireSel8", true, "require sel8 event selection"}; @@ -131,7 +150,6 @@ struct sigma0builder { Configurable SigmaMaxRap{"SigmaMaxRap", 0.8, "Max sigma0 rapidity"}; //// Extras: - Configurable doPi0QA{"doPi0QA", true, "Flag to fill QA histos for pi0 rejection study."}; Configurable Pi0PhotonMinDCADauToPv{"Pi0PhotonMinDCADauToPv", 0.0, "Min DCA daughter To PV (cm)"}; Configurable Pi0PhotonMaxDCAV0Dau{"Pi0PhotonMaxDCAV0Dau", 3.5, "Max DCA V0 Daughters (cm)"}; Configurable Pi0PhotonMinTPCCrossedRows{"Pi0PhotonMinTPCCrossedRows", 0, "Min daughter TPC Crossed Rows"}; @@ -148,13 +166,13 @@ struct sigma0builder { // base properties ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.2f, 2.4f, 2.6f, 2.8f, 3.0f, 3.2f, 3.4f, 3.6f, 3.8f, 4.0f, 4.4f, 4.8f, 5.2f, 5.6f, 6.0f, 6.5f, 7.0f, 7.5f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 17.0f, 19.0f, 21.0f, 23.0f, 25.0f, 30.0f, 35.0f, 40.0f, 50.0f}, "pt axis for analysis"}; ConfigurableAxis axisCentrality{"axisCentrality", {VARIABLE_WIDTH, 0.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f, 110.0f}, "Centrality"}; - ConfigurableAxis axisInvPt{"axisInvPt", {VARIABLE_WIDTH, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 2.0, 5.0, 10.0, 20.0, 50.0}, ""}; - ConfigurableAxis axisDeltaPt{"axisDeltaPt", {200, -500.0, 500.0}, ""}; // Invariant Mass - ConfigurableAxis axisSigmaMass{"axisSigmaMass", {1000, 1.10f, 1.30f}, "M_{#Sigma^{0}} (GeV/c^{2})"}; + ConfigurableAxis axisSigmaMass{"axisSigmaMass", {500, 1.10f, 1.30f}, "M_{#Sigma^{0}} (GeV/c^{2})"}; ConfigurableAxis axisLambdaMass{"axisLambdaMass", {200, 1.05f, 1.151f}, "M_{#Lambda} (GeV/c^{2})"}; - ConfigurableAxis axisPhotonMass{"axisPhotonMass", {600, -0.1f, 0.5f}, "M_{#Gamma}"}; + ConfigurableAxis axisPhotonMass{"axisPhotonMass", {200, -0.1f, 0.5f}, "M_{#Gamma}"}; + ConfigurableAxis axisPi0Mass{"axisPi0Mass", {200, 0.08f, 0.18f}, "M_{#Pi^{0}}"}; + ConfigurableAxis axisK0SMass{"axisK0SMass", {200, 0.4f, 0.6f}, "M_{K^{0}}"}; // AP plot axes ConfigurableAxis axisAPAlpha{"axisAPAlpha", {220, -1.1f, 1.1f}, "V0 AP alpha"}; @@ -165,16 +183,25 @@ struct sigma0builder { // topological variable QA axes ConfigurableAxis axisDCAtoPV{"axisDCAtoPV", {500, 0.0f, 50.0f}, "DCA (cm)"}; + ConfigurableAxis axisXY{"axisXY", {120, -120.0f, 120.0f}, "XY axis"}; ConfigurableAxis axisDCAdau{"axisDCAdau", {50, 0.0f, 5.0f}, "DCA (cm)"}; ConfigurableAxis axisRadius{"axisRadius", {240, 0.0f, 120.0f}, "V0 radius (cm)"}; + ConfigurableAxis axisPA{"axisPA", {100, 0.0f, 1}, "Pointing angle"}; ConfigurableAxis axisRapidity{"axisRapidity", {100, -2.0f, 2.0f}, "Rapidity"}; - ConfigurableAxis axisCandSel{"axisCandSel", {13, 0.5f, +13.5f}, "Candidate Selection"}; + ConfigurableAxis axisCandSel{"axisCandSel", {7, 0.5f, +7.5f}, "Candidate Selection"}; + ConfigurableAxis axisMonteCarloNch{"axisMonteCarloNch", {300, 0.0f, 3000.0f}, "N_{ch} MC"}; + ConfigurableAxis axisIRBinning{"axisIRBinning", {150, 0, 1500}, "Binning for the interaction rate (kHz)"}; int nSigmaCandidates = 0; void init(InitContext const&) { + // setting CCDB service + ccdb->setURL("http://alice-ccdb.cern.ch"); + ccdb->setCaching(true); + ccdb->setFatalWhenNull(false); + // Event Counters - histos.add("hEventSelection", "hEventSelection", kTH1F, {{20, -0.5f, +18.5f}}); + histos.add("hEventSelection", "hEventSelection", kTH1D, {{19, -0.5f, +18.5f}}); histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(1, "All collisions"); histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(2, "sel8 cut"); histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(3, "kIsTriggerTVX"); @@ -199,93 +226,121 @@ struct sigma0builder { histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(18, "Above max occup."); } - histos.add("hEventCentrality", "hEventCentrality", kTH1F, {axisCentrality}); - histos.add("hCandidateBuilderSelection", "hCandidateBuilderSelection", kTH1F, {axisCandSel}); - histos.get(HIST("hCandidateBuilderSelection"))->GetXaxis()->SetBinLabel(1, "No Sel"); - histos.get(HIST("hCandidateBuilderSelection"))->GetXaxis()->SetBinLabel(2, "Photon Mass Cut"); - histos.get(HIST("hCandidateBuilderSelection"))->GetXaxis()->SetBinLabel(3, "Photon DauEta Cut"); - histos.get(HIST("hCandidateBuilderSelection"))->GetXaxis()->SetBinLabel(4, "Photon DCAToPV Cut"); - histos.get(HIST("hCandidateBuilderSelection"))->GetXaxis()->SetBinLabel(5, "Photon DCADau Cut"); - histos.get(HIST("hCandidateBuilderSelection"))->GetXaxis()->SetBinLabel(6, "Photon Radius Cut"); - histos.get(HIST("hCandidateBuilderSelection"))->GetXaxis()->SetBinLabel(7, "Lambda Mass Cut"); - histos.get(HIST("hCandidateBuilderSelection"))->GetXaxis()->SetBinLabel(8, "Lambda DauEta Cut"); - histos.get(HIST("hCandidateBuilderSelection"))->GetXaxis()->SetBinLabel(9, "Lambda DCAToPV Cut"); - histos.get(HIST("hCandidateBuilderSelection"))->GetXaxis()->SetBinLabel(10, "Lambda Radius Cut"); - histos.get(HIST("hCandidateBuilderSelection"))->GetXaxis()->SetBinLabel(11, "Lambda DCADau Cut"); - histos.get(HIST("hCandidateBuilderSelection"))->GetXaxis()->SetBinLabel(12, "Sigma Mass Window"); - histos.get(HIST("hCandidateBuilderSelection"))->GetXaxis()->SetBinLabel(13, "Sigma Y Window"); - - // For QA: - histos.add("Selection/hPhotonMass", "hPhotonMass", kTH1F, {axisPhotonMass}); - histos.add("Selection/hPhotonNegEta", "hPhotonNegEta", kTH1F, {axisRapidity}); - histos.add("Selection/hPhotonPosEta", "hPhotonPosEta", kTH1F, {axisRapidity}); - histos.add("Selection/hPhotonDCANegToPV", "hPhotonDCANegToPV", kTH1F, {axisDCAtoPV}); - histos.add("Selection/hPhotonDCAPosToPV", "hPhotonDCAPosToPV", kTH1F, {axisDCAtoPV}); - histos.add("Selection/hPhotonDCADau", "hPhotonDCADau", kTH1F, {axisDCAdau}); - histos.add("Selection/hPhotonRadius", "hPhotonRadius", kTH1F, {axisRadius}); - histos.add("Selection/hLambdaMass", "hLambdaMass", kTH1F, {axisLambdaMass}); - histos.add("Selection/hAntiLambdaMass", "hAntiLambdaMass", kTH1F, {axisLambdaMass}); - histos.add("Selection/hLambdaNegEta", "hLambdaNegEta", kTH1F, {axisRapidity}); - histos.add("Selection/hLambdaPosEta", "hLambdaPosEta", kTH1F, {axisRapidity}); - histos.add("Selection/hLambdaDCANegToPV", "hLambdaDCANegToPV", kTH1F, {axisDCAtoPV}); - histos.add("Selection/hLambdaDCAPosToPV", "hLambdaDCAPosToPV", kTH1F, {axisDCAtoPV}); - histos.add("Selection/hLambdaDCADau", "hLambdaDCADau", kTH1F, {axisDCAdau}); - histos.add("Selection/hLambdaRadius", "hLambdaRadius", kTH1F, {axisRadius}); - histos.add("Selection/hSigmaMass", "hSigmaMass", kTH1F, {axisSigmaMass}); - histos.add("Selection/hSigmaMassWindow", "hSigmaMassWindow", kTH1F, {{1000, -0.09f, 0.11f}}); - histos.add("Selection/hSigmaY", "hSigmaY", kTH1F, {axisRapidity}); - - histos.add("GeneralQA/h2dMassGammaVsK0S", "h2dMassGammaVsK0S", kTH2D, {axisPhotonMass, {200, 0.4f, 0.6f}}); - histos.add("GeneralQA/h2dMassLambdaVsK0S", "h2dMassLambdaVsK0S", kTH2D, {axisLambdaMass, {200, 0.4f, 0.6f}}); - histos.add("GeneralQA/h2dMassGammaVsLambda", "h2dMassGammaVsLambda", kTH2D, {axisPhotonMass, axisLambdaMass}); - histos.add("GeneralQA/h3dMassSigma0VsDaupTs", "h3dMassSigma0VsDaupTs", kTH3F, {axisPt, axisPt, axisSigmaMass}); - histos.add("GeneralQA/h2dMassGammaVsK0SAfterMassSel", "h2dMassGammaVsK0SAfterMassSel", kTH2D, {axisPhotonMass, {200, 0.4f, 0.6f}}); - histos.add("GeneralQA/h2dMassLambdaVsK0SAfterMassSel", "h2dMassLambdaVsK0SAfterMassSel", kTH2D, {axisLambdaMass, {200, 0.4f, 0.6f}}); - histos.add("GeneralQA/h2dMassGammaVsLambdaAfterMassSel", "h2dMassGammaVsLambdaAfterMassSel", kTH2D, {axisPhotonMass, axisLambdaMass}); - histos.add("GeneralQA/h2dPtVsMassPi0BeforeSel_Candidates", "h2dPtVsMassPi0BeforeSel_Candidates", kTH2D, {axisPt, {500, 0.08f, 0.18f}}); - histos.add("GeneralQA/h2dPtVsMassPi0AfterSel_Candidates", "h2dPtVsMassPi0AfterSel_Candidates", kTH2D, {axisPt, {500, 0.08f, 0.18f}}); - histos.add("GeneralQA/h3dV0XYZ", "h3dV0XYZ", kTH3F, {{400, -200, 200}, {400, -200, 200}, {240, -120.0f, 120.0f}}); + histos.add("hEventCentrality", "hEventCentrality", kTH1D, {axisCentrality}); + + histos.add("PhotonSel/hSelectionStatistics", "hSelectionStatistics", kTH1D, {axisCandSel}); + histos.get(HIST("PhotonSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(1, "No Sel"); + histos.get(HIST("PhotonSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(2, "Photon Mass Cut"); + histos.get(HIST("PhotonSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(3, "Photon DauEta Cut"); + histos.get(HIST("PhotonSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(4, "Photon DCAToPV Cut"); + histos.get(HIST("PhotonSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(5, "Photon DCADau Cut"); + histos.get(HIST("PhotonSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(6, "Photon Radius Cut"); + + histos.add("PhotonSel/hPhotonMass", "hPhotonMass", kTH1F, {axisPhotonMass}); + histos.add("PhotonSel/hPhotonNegEta", "hPhotonNegEta", kTH1F, {axisRapidity}); + histos.add("PhotonSel/hPhotonPosEta", "hPhotonPosEta", kTH1F, {axisRapidity}); + histos.add("PhotonSel/hPhotonDCANegToPV", "hPhotonDCANegToPV", kTH1F, {axisDCAtoPV}); + histos.add("PhotonSel/hPhotonDCAPosToPV", "hPhotonDCAPosToPV", kTH1F, {axisDCAtoPV}); + histos.add("PhotonSel/hPhotonDCADau", "hPhotonDCADau", kTH1F, {axisDCAdau}); + histos.add("PhotonSel/hPhotonRadius", "hPhotonRadius", kTH1F, {axisRadius}); + + histos.add("LambdaSel/hSelectionStatistics", "hSelectionStatistics", kTH1D, {axisCandSel}); + histos.get(HIST("LambdaSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(1, "No Sel"); + histos.get(HIST("LambdaSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(2, "Lambda Mass Cut"); + histos.get(HIST("LambdaSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(3, "Lambda DauEta Cut"); + histos.get(HIST("LambdaSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(4, "Lambda DCAToPV Cut"); + histos.get(HIST("LambdaSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(5, "Lambda Radius Cut"); + histos.get(HIST("LambdaSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(6, "Lambda DCADau Cut"); + + histos.add("LambdaSel/hLambdaMass", "hLambdaMass", kTH1F, {axisLambdaMass}); + histos.add("LambdaSel/hAntiLambdaMass", "hAntiLambdaMass", kTH1F, {axisLambdaMass}); + histos.add("LambdaSel/hLambdaNegEta", "hLambdaNegEta", kTH1F, {axisRapidity}); + histos.add("LambdaSel/hLambdaPosEta", "hLambdaPosEta", kTH1F, {axisRapidity}); + histos.add("LambdaSel/hLambdaDCANegToPV", "hLambdaDCANegToPV", kTH1F, {axisDCAtoPV}); + histos.add("LambdaSel/hLambdaDCAPosToPV", "hLambdaDCAPosToPV", kTH1F, {axisDCAtoPV}); + histos.add("LambdaSel/hLambdaDCADau", "hLambdaDCADau", kTH1F, {axisDCAdau}); + histos.add("LambdaSel/hLambdaRadius", "hLambdaRadius", kTH1F, {axisRadius}); + + histos.add("SigmaSel/hSelectionStatistics", "hSelectionStatistics", kTH1D, {axisCandSel}); + histos.get(HIST("SigmaSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(1, "No Sel"); + histos.get(HIST("SigmaSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(2, "Sigma Mass Window"); + histos.get(HIST("SigmaSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(3, "Sigma Y Window"); + + // For selection: + histos.add("SigmaSel/h3dMassSigma0BeforeSel", "h3dMassSigma0BeforeSel", kTH3F, {axisCentrality, axisPt, axisSigmaMass}); + histos.add("SigmaSel/hSigmaMass", "hSigmaMass", kTH1F, {axisSigmaMass}); + histos.add("SigmaSel/hSigmaMassWindow", "hSigmaMassWindow", kTH1F, {{200, -0.09f, 0.11f}}); + histos.add("SigmaSel/hSigmaY", "hSigmaY", kTH1F, {axisRapidity}); + histos.add("SigmaSel/hSigmaMassSelected", "hSigmaMassSelected", kTH1F, {axisSigmaMass}); + histos.add("SigmaSel/h3dMassSigma0AfterSel", "h3dMassSigma0AfterSel", kTH3F, {axisCentrality, axisPt, axisSigmaMass}); + + if (fillQAhistos) { + histos.add("GeneralQA/h2dMassGammaVsK0S", "h2dMassGammaVsK0S", kTH2D, {axisPhotonMass, axisK0SMass}); + histos.add("GeneralQA/h2dMassLambdaVsK0S", "h2dMassLambdaVsK0S", kTH2D, {axisLambdaMass, axisK0SMass}); + histos.add("GeneralQA/h2dMassGammaVsLambda", "h2dMassGammaVsLambda", kTH2D, {axisPhotonMass, axisLambdaMass}); + histos.add("GeneralQA/h2dMassLambdaVsGamma", "h2dMassLambdaVsGamma", kTH2D, {axisLambdaMass, axisPhotonMass}); + histos.add("GeneralQA/h3dMassSigma0VsDaupTs", "h3dMassSigma0VsDaupTs", kTH3F, {axisPt, axisPt, axisSigmaMass}); + histos.add("GeneralQA/h2dMassGammaVsK0SAfterMassSel", "h2dMassGammaVsK0SAfterMassSel", kTH2D, {axisPhotonMass, axisK0SMass}); + histos.add("GeneralQA/h2dMassLambdaVsK0SAfterMassSel", "h2dMassLambdaVsK0SAfterMassSel", kTH2D, {axisLambdaMass, axisK0SMass}); + histos.add("GeneralQA/h2dMassGammaVsLambdaAfterMassSel", "h2dMassGammaVsLambdaAfterMassSel", kTH2D, {axisPhotonMass, axisLambdaMass}); + histos.add("GeneralQA/h2dV0XY", "h2dV0XY", kTH2F, {axisXY, axisXY}); + } + + if (fGetIR) { + histos.add("GeneralQA/hRunNumberNegativeIR", "", kTH1D, {{1, 0., 1.}}); + histos.add("GeneralQA/hInteractionRate", "hInteractionRate", kTH1F, {axisIRBinning}); + histos.add("GeneralQA/hCentralityVsInteractionRate", "hCentralityVsInteractionRate", kTH2F, {axisCentrality, axisIRBinning}); + } + + if (doAssocStudy && doprocessMonteCarlo) { + histos.add("V0AssoQA/h2dIRVsPt_TrueGamma", "h2dIRVsPt_TrueGamma", kTH2F, {axisIRBinning, axisPt}); + histos.add("V0AssoQA/h3dPAVsIRVsPt_TrueGamma", "h3dPAVsIRVsPt_TrueGamma", kTH3F, {axisPA, axisIRBinning, axisPt}); + histos.add("V0AssoQA/h2dIRVsPt_TrueGamma_BadCollAssig", "h2dIRVsPt_TrueGamma_BadCollAssig", kTH2F, {axisIRBinning, axisPt}); + histos.add("V0AssoQA/h3dPAVsIRVsPt_TrueGamma_BadCollAssig", "h3dPAVsIRVsPt_TrueGamma_BadCollAssig", kTH3F, {axisPA, axisIRBinning, axisPt}); + + histos.add("V0AssoQA/h2dIRVsPt_TrueLambda", "h2dIRVsPt_TrueLambda", kTH2F, {axisIRBinning, axisPt}); + histos.add("V0AssoQA/h3dPAVsIRVsPt_TrueLambda", "h3dPAVsIRVsPt_TrueLambda", kTH3F, {axisPA, axisIRBinning, axisPt}); + histos.add("V0AssoQA/h2dIRVsPt_TrueLambda_BadCollAssig", "h2dIRVsPt_TrueLambda_BadCollAssig", kTH2F, {axisIRBinning, axisPt}); + histos.add("V0AssoQA/h3dPAVsIRVsPt_TrueLambda_BadCollAssig", "h3dPAVsIRVsPt_TrueLambda_BadCollAssig", kTH3F, {axisPA, axisIRBinning, axisPt}); + } // MC - histos.add("MC/h2dPtVsCentrality_GammaBeforeSel", "h2dPtVsCentrality_GammaBeforeSel", kTH2D, {axisCentrality, axisPt}); - histos.add("MC/h2dPtVsCentrality_LambdaBeforeSel", "h2dPtVsCentrality_LambdaBeforeSel", kTH2D, {axisCentrality, axisPt}); - histos.add("MC/h2dPtVsCentrality_AntiLambdaBeforeSel", "h2dPtVsCentrality_AntiLambdaBeforeSel", kTH2D, {axisCentrality, axisPt}); - histos.add("MC/h2dPtVsCentrality_GammaSigma0", "h2dPtVsCentrality_GammaSigma0", kTH2D, {axisCentrality, axisPt}); - histos.add("MC/h2dPtVsCentrality_LambdaSigma0", "h2dPtVsCentrality_LambdaSigma0", kTH2D, {axisCentrality, axisPt}); - histos.add("MC/h2dPtVsCentrality_Sigma0BeforeSel", "h2dPtVsCentrality_Sigma0BeforeSel", kTH2D, {axisCentrality, axisPt}); - histos.add("MC/h2dPtVsCentrality_Sigma0AfterSel", "h2dPtVsCentrality_Sigma0AfterSel", kTH2D, {axisCentrality, axisPt}); - histos.add("MC/h2dPtVsCentrality_AntiSigma0BeforeSel", "h2dPtVsCentrality_AntiSigma0BeforeSel", kTH2D, {axisCentrality, axisPt}); - histos.add("MC/h2dPtVsCentrality_GammaAntiSigma0", "h2dPtVsCentrality_GammaAntiSigma0", kTH2D, {axisCentrality, axisPt}); - histos.add("MC/h2dPtVsCentrality_LambdaAntiSigma0", "h2dPtVsCentrality_LambdaAntiSigma0", kTH2D, {axisCentrality, axisPt}); - histos.add("MC/h2dPtVsCentrality_AntiSigma0AfterSel", "h2dPtVsCentrality_AntiSigma0AfterSel", kTH2D, {axisCentrality, axisPt}); - histos.add("MC/h3dGammasXYZ", "h3dGammasXYZ", kTH3F, {{400, -200, 200}, {400, -200, 200}, {240, -120.0f, 120.0f}}); - - // Sigma vs Daughters pT - histos.add("MC/h2dSigmaPtVsLambdaPt", "h2dSigmaPtVsLambdaPt", kTH2D, {axisPt, axisPt}); - histos.add("MC/h2dSigmaPtVsGammaPt", "h2dSigmaPtVsGammaPt", kTH2D, {axisPt, axisPt}); - - // pT Resolution: - histos.add("MC/h2dLambdaPtResolution", "h2dLambdaPtResolution", kTH2D, {axisInvPt, axisDeltaPt}); - histos.add("MC/h2dGammaPtResolution", "h2dGammaPtResolution", kTH2D, {axisInvPt, axisDeltaPt}); + if (doprocessMonteCarlo) { + histos.add("MC/h2dPtVsCentralityBeforeSel_MCAssocGamma", "h2dPtVsCentralityBeforeSel_MCAssocGamma", kTH2D, {axisCentrality, axisPt}); + histos.add("MC/h2dPtVsCentralityBeforeSel_MCAssocLambda", "h2dPtVsCentralityBeforeSel_MCAssocLambda", kTH2D, {axisCentrality, axisPt}); + histos.add("MC/h2dPtVsCentralityBeforeSel_MCAssocALambda", "h2dPtVsCentralityBeforeSel_MCAssocALambda", kTH2D, {axisCentrality, axisPt}); + histos.add("MC/h2dPtVsCentralityBeforeSel_MCAssocSigma0", "h2dPtVsCentralityBeforeSel_MCAssocSigma0", kTH2D, {axisCentrality, axisPt}); + histos.add("MC/h2dPtVsCentralityBeforeSel_MCAssocASigma0", "h2dPtVsCentralityBeforeSel_MCAssocASigma0", kTH2D, {axisCentrality, axisPt}); + histos.add("MC/h2dSigma0PtVsLambdaPtBeforeSel_MCAssoc", "h2dSigma0PtVsLambdaPtBeforeSel_MCAssoc", kTH2D, {axisPt, axisPt}); + histos.add("MC/h2dSigma0PtVsGammaPtBeforeSel_MCAssoc", "h2dSigma0PtVsGammaPtBeforeSel_MCAssoc", kTH2D, {axisPt, axisPt}); + histos.add("MC/h2dPtVsCentralityAfterSel_MCAssocSigma0", "h2dPtVsCentralityAfterSel_MCAssocSigma0", kTH2D, {axisCentrality, axisPt}); + histos.add("MC/h2dPtVsCentralityAfterSel_MCAssocASigma0", "h2dPtVsCentralityAfterSel_MCAssocASigma0", kTH2D, {axisCentrality, axisPt}); + histos.add("MC/h2dGammaXYConversion", "h2dGammaXYConversion", kTH2F, {axisXY, axisXY}); + } // For background decomposition - histos.add("MC/h2dPtVsMassSigma_All", "h2dPtVsMassSigma_All", kTH2D, {axisPt, axisSigmaMass}); - histos.add("MC/h2dPtVsMassSigma_SignalOnly", "h2dPtVsMassSigma_SignalOnly", kTH2D, {axisPt, axisSigmaMass}); - histos.add("MC/h2dPtVsMassSigma_TrueDaughters", "h2dPtVsMassSigma_TrueDaughters", kTH2D, {axisPt, axisSigmaMass}); - histos.add("MC/h2dPtVsMassSigma_TrueGammaFakeLambda", "h2dPtVsMassSigma_TrueGammaFakeLambda", kTH2D, {axisPt, axisSigmaMass}); - histos.add("MC/h2dPtVsMassSigma_FakeGammaTrueLambda", "h2dPtVsMassSigma_FakeGammaTrueLambda", kTH2D, {axisPt, axisSigmaMass}); - histos.add("MC/h2dPtVsMassSigma_FakeDaughters", "h2dPtVsMassSigma_FakeDaughters", kTH2D, {axisPt, axisSigmaMass}); - histos.add("MC/h2dTrueDaughtersMatrix", "h2dTrueDaughtersMatrix", kTHnSparseD, {{10001, -5000.5f, +5000.5f}, {10001, -5000.5f, +5000.5f}}); - histos.add("MC/h2dTrueGammaFakeLambdaMatrix", "h2dTrueGammaFakeLambdaMatrix", kTHnSparseD, {{10001, -5000.5f, +5000.5f}, {10001, -5000.5f, +5000.5f}}); - histos.add("MC/h2dFakeGammaTrueLambdaMatrix", "h2dFakeGammaTrueLambdaMatrix", kTHnSparseD, {{10001, -5000.5f, +5000.5f}, {10001, -5000.5f, +5000.5f}}); - histos.add("MC/h2dFakeDaughtersMatrix", "h2dFakeDaughtersMatrix", kTHnSparseD, {{10001, -5000.5f, +5000.5f}, {10001, -5000.5f, +5000.5f}}); + if (fillBkgQAhistos && doprocessMonteCarlo) { + histos.add("BkgStudy/h2dPtVsMassSigma_All", "h2dPtVsMassSigma_All", kTH2D, {axisPt, axisSigmaMass}); + histos.add("BkgStudy/h2dPtVsMassSigma_TrueDaughters", "h2dPtVsMassSigma_TrueDaughters", kTH2D, {axisPt, axisSigmaMass}); + histos.add("BkgStudy/h2dPtVsMassSigma_TrueGammaFakeLambda", "h2dPtVsMassSigma_TrueGammaFakeLambda", kTH2D, {axisPt, axisSigmaMass}); + histos.add("BkgStudy/h2dPtVsMassSigma_FakeGammaTrueLambda", "h2dPtVsMassSigma_FakeGammaTrueLambda", kTH2D, {axisPt, axisSigmaMass}); + histos.add("BkgStudy/h2dPtVsMassSigma_FakeDaughters", "h2dPtVsMassSigma_FakeDaughters", kTH2D, {axisPt, axisSigmaMass}); + histos.add("BkgStudy/h2dTrueDaughtersMatrix", "h2dTrueDaughtersMatrix", kTHnSparseD, {{10001, -5000.5f, +5000.5f}, {10001, -5000.5f, +5000.5f}}); + histos.add("BkgStudy/h2dTrueGammaFakeLambdaMatrix", "h2dTrueGammaFakeLambdaMatrix", kTHnSparseD, {{10001, -5000.5f, +5000.5f}, {10001, -5000.5f, +5000.5f}}); + histos.add("BkgStudy/h2dFakeGammaTrueLambdaMatrix", "h2dFakeGammaTrueLambdaMatrix", kTHnSparseD, {{10001, -5000.5f, +5000.5f}, {10001, -5000.5f, +5000.5f}}); + histos.add("BkgStudy/h2dFakeDaughtersMatrix", "h2dFakeDaughtersMatrix", kTHnSparseD, {{10001, -5000.5f, +5000.5f}, {10001, -5000.5f, +5000.5f}}); + } // For Pi0 QA - histos.add("MC/h2dPtVsMassPi0BeforeSel_SignalOnly", "h2dPtVsMassPi0BeforeSel_SignalOnly", kTH2D, {axisPt, {500, 0.08f, 0.18f}}); - histos.add("MC/h2dPtVsMassPi0AfterSel_SignalOnly", "h2dPtVsMassPi0AfterSel_SignalOnly", kTH2D, {axisPt, {500, 0.08f, 0.18f}}); + if (doPi0QA) { + histos.add("Pi0QA/h2dPtVsMassPi0BeforeSel_MCAssoc", "h2dPtVsMassPi0BeforeSel_MCAssoc", kTH2D, {axisPt, axisPi0Mass}); + histos.add("Pi0QA/h2dPtVsMassPi0AfterSel_MCAssoc", "h2dPtVsMassPi0AfterSel_MCAssoc", kTH2D, {axisPt, axisPi0Mass}); + histos.add("Pi0QA/h2dPtVsMassPi0BeforeSel_Candidates", "h2dPtVsMassPi0BeforeSel_Candidates", kTH2D, {axisPt, axisPi0Mass}); + histos.add("Pi0QA/h2dPtVsMassPi0AfterSel_Candidates", "h2dPtVsMassPi0AfterSel_Candidates", kTH2D, {axisPt, axisPi0Mass}); + } - histos.add("h3dMassSigmasBeforeSel", "h3dMassSigmasBeforeSel", kTH3F, {axisCentrality, axisPt, axisSigmaMass}); - histos.add("h3dMassSigmasAfterSel", "h3dMassSigmasAfterSel", kTH3F, {axisCentrality, axisPt, axisSigmaMass}); + if (doprocessGeneratedCollRun3) + histos.add("Gen/hNEventsNch", "hNEventsNch", kTH1D, {axisMonteCarloNch}); } template @@ -396,15 +451,74 @@ struct sigma0builder { return true; } + void runBkgAnalysis(bool fIsSigma, bool fIsAntiSigma, int PhotonPDGCode, int PhotonPDGCodeMother, int LambdaPDGCode, int LambdaPDGCodeMother, float sigmapT, float sigmaMass) + { + histos.fill(HIST("BkgStudy/h2dPtVsMassSigma_All"), sigmapT, sigmaMass); + + // Real Gamma x Real Lambda - but not from the same sigma0/antisigma0! + if ((PhotonPDGCode == 22) && ((LambdaPDGCode == 3122) || (LambdaPDGCode == -3122)) && (!fIsSigma && !fIsAntiSigma)) { + histos.fill(HIST("BkgStudy/h2dPtVsMassSigma_TrueDaughters"), sigmapT, sigmaMass); + histos.fill(HIST("BkgStudy/h2dTrueDaughtersMatrix"), LambdaPDGCodeMother, PhotonPDGCodeMother); + } + + // Real Gamma x fake Lambda + if ((PhotonPDGCode == 22) && (LambdaPDGCode != 3122) && (LambdaPDGCode != -3122)) { + histos.fill(HIST("BkgStudy/h2dPtVsMassSigma_TrueGammaFakeLambda"), sigmapT, sigmaMass); + histos.fill(HIST("BkgStudy/h2dTrueGammaFakeLambdaMatrix"), LambdaPDGCodeMother, PhotonPDGCodeMother); + } + + // Fake Gamma x Real Lambda + if ((PhotonPDGCode != 22) && ((LambdaPDGCode == 3122) || (LambdaPDGCode == -3122))) { + histos.fill(HIST("BkgStudy/h2dPtVsMassSigma_FakeGammaTrueLambda"), sigmapT, sigmaMass); + histos.fill(HIST("BkgStudy/h2dFakeGammaTrueLambdaMatrix"), LambdaPDGCodeMother, PhotonPDGCodeMother); + } + + // Fake Gamma x Fake Lambda + if ((PhotonPDGCode != 22) && (LambdaPDGCode != 3122) && (LambdaPDGCode != -3122)) { + histos.fill(HIST("BkgStudy/h2dPtVsMassSigma_FakeDaughters"), sigmapT, sigmaMass); + histos.fill(HIST("BkgStudy/h2dFakeDaughtersMatrix"), LambdaPDGCodeMother, PhotonPDGCodeMother); + } + } + + template + void analyzeV0CollAssoc(TCollision const& collision, TV0Object const& fullv0s, std::vector selV0Indices, float IR) + { + auto v0MCCollision = collision.template straMCCollision_as>(); + + for (size_t i = 0; i < selV0Indices.size(); ++i) { + auto v0 = fullv0s.rawIteratorAt(selV0Indices[i]); + auto v0MC = v0.template v0MCCore_as>(); + + float V0MCpT = RecoDecay::pt(array{v0MC.pxMC(), v0MC.pyMC()}); + float V0PA = TMath::ACos(v0.v0cosPA()); + bool fIsV0CorrectlyAssigned = (v0MC.straMCCollisionId() == v0MCCollision.globalIndex()); + + if (v0MC.pdgCode() == 22) { // True Gamma + histos.fill(HIST("V0AssoQA/h2dIRVsPt_TrueGamma"), IR, V0MCpT); + histos.fill(HIST("V0AssoQA/h3dPAVsIRVsPt_TrueGamma"), V0PA, IR, V0MCpT); + + if (!fIsV0CorrectlyAssigned) { + histos.fill(HIST("V0AssoQA/h2dIRVsPt_TrueGamma_BadCollAssig"), IR, V0MCpT); + histos.fill(HIST("V0AssoQA/h3dPAVsIRVsPt_TrueGamma_BadCollAssig"), V0PA, IR, V0MCpT); + } + } + if (v0MC.pdgCode() == 3122) { // True Lambda + histos.fill(HIST("V0AssoQA/h2dIRVsPt_TrueLambda"), IR, V0MCpT); + histos.fill(HIST("V0AssoQA/h3dPAVsIRVsPt_TrueLambda"), V0PA, IR, V0MCpT); + + if (!fIsV0CorrectlyAssigned) { + histos.fill(HIST("V0AssoQA/h2dIRVsPt_TrueLambda_BadCollAssig"), IR, V0MCpT); + histos.fill(HIST("V0AssoQA/h3dPAVsIRVsPt_TrueLambda_BadCollAssig"), V0PA, IR, V0MCpT); + } + } + } + } template void runPi0QA(TV0Object const& gamma1, TV0Object const& gamma2) { - // Check if both V0s are made of the same tracks if (gamma1.posTrackExtraId() == gamma2.posTrackExtraId() || - gamma1.negTrackExtraId() == gamma2.negTrackExtraId() || - gamma1.posTrackExtraId() == gamma2.negTrackExtraId() || - gamma1.negTrackExtraId() == gamma2.posTrackExtraId()) { + gamma1.negTrackExtraId() == gamma2.negTrackExtraId()) { return; } @@ -430,13 +544,13 @@ struct sigma0builder { gamma1MC.pdgCodeMother() == 111 && gamma2MC.pdgCodeMother() == 111 && gamma1.motherMCPartId() == gamma2.motherMCPartId()) { fIsPi0 = true; - histos.fill(HIST("MC/h2dPtVsMassPi0BeforeSel_SignalOnly"), pi0Pt, pi0Mass); + histos.fill(HIST("Pi0QA/h2dPtVsMassPi0BeforeSel_MCAssoc"), pi0Pt, pi0Mass); } } - } else { - histos.fill(HIST("GeneralQA/h2dPtVsMassPi0BeforeSel_Candidates"), pi0Pt, pi0Mass); } + histos.fill(HIST("Pi0QA/h2dPtVsMassPi0BeforeSel_Candidates"), pi0Pt, pi0Mass); + // Photon-specific selections auto posTrackGamma1 = gamma1.template posTrackExtra_as(); auto negTrackGamma1 = gamma1.template negTrackExtra_as(); @@ -491,23 +605,16 @@ struct sigma0builder { } // Fill histograms - if (fIsMC) { - if (fIsPi0) - histos.fill(HIST("MC/h2dPtVsMassPi0AfterSel_SignalOnly"), pi0Pt, pi0Mass); - } else { - histos.fill(HIST("GeneralQA/h2dPtVsMassPi0AfterSel_Candidates"), pi0Pt, pi0Mass); - } + histos.fill(HIST("Pi0QA/h2dPtVsMassPi0AfterSel_Candidates"), pi0Pt, pi0Mass); + if (fIsMC && fIsPi0) + histos.fill(HIST("Pi0QA/h2dPtVsMassPi0AfterSel_MCAssoc"), pi0Pt, pi0Mass); } - // Process sigma candidate and store properties in object + // Process photon candidate template - bool processSigmaCandidate(TV0Object const& lambda, TV0Object const& gamma) + bool processPhotonCandidate(TV0Object const& gamma) { - if ((lambda.v0Type() == 0) || (gamma.v0Type() == 0)) - return false; - - // Checking if both V0s are made of the very same tracks - if ((gamma.posTrackExtraId() == lambda.posTrackExtraId()) || (gamma.negTrackExtraId() == lambda.negTrackExtraId()) || (gamma.posTrackExtraId() == lambda.negTrackExtraId()) || (gamma.negTrackExtraId() == lambda.posTrackExtraId()) || (gamma.posTrackExtraId() == lambda.negTrackExtraId())) + if (gamma.v0Type() == 0) return false; if (useMLScores) { @@ -515,120 +622,126 @@ struct sigma0builder { if (gamma.gammaBDTScore() <= Gamma_MLThreshold) return false; - // Lambda and AntiLambda selection - if ((lambda.lambdaBDTScore() <= Lambda_MLThreshold) && (lambda.antiLambdaBDTScore() <= AntiLambda_MLThreshold)) - return false; - } else { // Standard selection // Gamma basic selection criteria: - histos.fill(HIST("hCandidateBuilderSelection"), 1.); - histos.fill(HIST("Selection/hPhotonMass"), gamma.mGamma()); + histos.fill(HIST("PhotonSel/hSelectionStatistics"), 1.); + histos.fill(HIST("PhotonSel/hPhotonMass"), gamma.mGamma()); if ((gamma.mGamma() < 0) || (gamma.mGamma() > PhotonMaxMass)) return false; - histos.fill(HIST("Selection/hPhotonNegEta"), gamma.negativeeta()); - histos.fill(HIST("Selection/hPhotonPosEta"), gamma.positiveeta()); - histos.fill(HIST("hCandidateBuilderSelection"), 2.); + histos.fill(HIST("PhotonSel/hPhotonNegEta"), gamma.negativeeta()); + histos.fill(HIST("PhotonSel/hPhotonPosEta"), gamma.positiveeta()); + histos.fill(HIST("PhotonSel/hSelectionStatistics"), 2.); if ((TMath::Abs(gamma.negativeeta()) > PhotonMaxDauPseudoRap) || (TMath::Abs(gamma.positiveeta()) > PhotonMaxDauPseudoRap)) return false; - histos.fill(HIST("Selection/hPhotonDCANegToPV"), TMath::Abs(gamma.dcanegtopv())); - histos.fill(HIST("Selection/hPhotonDCAPosToPV"), TMath::Abs(gamma.dcapostopv())); - histos.fill(HIST("hCandidateBuilderSelection"), 3.); + histos.fill(HIST("PhotonSel/hPhotonDCANegToPV"), TMath::Abs(gamma.dcanegtopv())); + histos.fill(HIST("PhotonSel/hPhotonDCAPosToPV"), TMath::Abs(gamma.dcapostopv())); + histos.fill(HIST("PhotonSel/hSelectionStatistics"), 3.); if ((TMath::Abs(gamma.dcapostopv()) < PhotonMinDCAToPv) || (TMath::Abs(gamma.dcanegtopv()) < PhotonMinDCAToPv)) return false; - histos.fill(HIST("Selection/hPhotonDCADau"), TMath::Abs(gamma.dcaV0daughters())); - histos.fill(HIST("hCandidateBuilderSelection"), 4.); + histos.fill(HIST("PhotonSel/hPhotonDCADau"), TMath::Abs(gamma.dcaV0daughters())); + histos.fill(HIST("PhotonSel/hSelectionStatistics"), 4.); if (TMath::Abs(gamma.dcaV0daughters()) > PhotonMaxDCAV0Dau) return false; - histos.fill(HIST("Selection/hPhotonRadius"), gamma.v0radius()); - histos.fill(HIST("hCandidateBuilderSelection"), 5.); + histos.fill(HIST("PhotonSel/hPhotonRadius"), gamma.v0radius()); + histos.fill(HIST("PhotonSel/hSelectionStatistics"), 5.); if ((gamma.v0radius() < PhotonMinRadius) || (gamma.v0radius() > PhotonMaxRadius)) return false; + histos.fill(HIST("PhotonSel/hSelectionStatistics"), 6.); + } + return true; + } + + // Process photon candidate + template + bool processLambdaCandidate(TV0Object const& lambda) + { + if (lambda.v0Type() != 1) + return false; + + if (useMLScores) { + if ((lambda.lambdaBDTScore() <= Lambda_MLThreshold) && (lambda.antiLambdaBDTScore() <= AntiLambda_MLThreshold)) + return false; + } else { // Lambda basic selection criteria: - histos.fill(HIST("hCandidateBuilderSelection"), 6.); - histos.fill(HIST("Selection/hLambdaMass"), lambda.mLambda()); - histos.fill(HIST("Selection/hAntiLambdaMass"), lambda.mAntiLambda()); + histos.fill(HIST("LambdaSel/hSelectionStatistics"), 1.); + histos.fill(HIST("LambdaSel/hLambdaMass"), lambda.mLambda()); + histos.fill(HIST("LambdaSel/hAntiLambdaMass"), lambda.mAntiLambda()); if ((TMath::Abs(lambda.mLambda() - o2::constants::physics::MassLambda0) > LambdaWindow) && (TMath::Abs(lambda.mAntiLambda() - o2::constants::physics::MassLambda0) > LambdaWindow)) return false; - histos.fill(HIST("Selection/hLambdaNegEta"), lambda.negativeeta()); - histos.fill(HIST("Selection/hLambdaPosEta"), lambda.positiveeta()); - histos.fill(HIST("hCandidateBuilderSelection"), 7.); + histos.fill(HIST("LambdaSel/hLambdaNegEta"), lambda.negativeeta()); + histos.fill(HIST("LambdaSel/hLambdaPosEta"), lambda.positiveeta()); + histos.fill(HIST("LambdaSel/hSelectionStatistics"), 2.); if ((TMath::Abs(lambda.negativeeta()) > LambdaDauPseudoRap) || (TMath::Abs(lambda.positiveeta()) > LambdaDauPseudoRap)) return false; - histos.fill(HIST("Selection/hLambdaDCANegToPV"), lambda.dcanegtopv()); - histos.fill(HIST("Selection/hLambdaDCAPosToPV"), lambda.dcapostopv()); - histos.fill(HIST("hCandidateBuilderSelection"), 8.); + histos.fill(HIST("LambdaSel/hLambdaDCANegToPV"), lambda.dcanegtopv()); + histos.fill(HIST("LambdaSel/hLambdaDCAPosToPV"), lambda.dcapostopv()); + histos.fill(HIST("LambdaSel/hSelectionStatistics"), 3.); if ((TMath::Abs(lambda.dcapostopv()) < LambdaMinDCAPosToPv) || (TMath::Abs(lambda.dcanegtopv()) < LambdaMinDCANegToPv)) return false; - histos.fill(HIST("Selection/hLambdaRadius"), lambda.v0radius()); - histos.fill(HIST("hCandidateBuilderSelection"), 9.); + histos.fill(HIST("LambdaSel/hLambdaRadius"), lambda.v0radius()); + histos.fill(HIST("LambdaSel/hSelectionStatistics"), 4.); if ((lambda.v0radius() < LambdaMinv0radius) || (lambda.v0radius() > LambdaMaxv0radius)) return false; - histos.fill(HIST("Selection/hLambdaDCADau"), lambda.dcaV0daughters()); - histos.fill(HIST("hCandidateBuilderSelection"), 10.); + histos.fill(HIST("LambdaSel/hLambdaDCADau"), lambda.dcaV0daughters()); + histos.fill(HIST("LambdaSel/hSelectionStatistics"), 5.); if (TMath::Abs(lambda.dcaV0daughters()) > LambdaMaxDCAV0Dau) return false; - histos.fill(HIST("hCandidateBuilderSelection"), 11.); + histos.fill(HIST("LambdaSel/hSelectionStatistics"), 6.); + } + + return true; + } + /////////// + // Process sigma candidate and store properties in object + template + bool buildSigma0(TV0Object const& lambda, TV0Object const& gamma) + { + // Checking if both V0s are made of the very same tracks + if (gamma.posTrackExtraId() == lambda.posTrackExtraId() || + gamma.negTrackExtraId() == lambda.negTrackExtraId()) { + return false; } + // Sigma0 candidate properties std::array pVecPhotons{gamma.px(), gamma.py(), gamma.pz()}; std::array pVecLambda{lambda.px(), lambda.py(), lambda.pz()}; auto arrMom = std::array{pVecPhotons, pVecLambda}; float sigmamass = RecoDecay::m(arrMom, std::array{o2::constants::physics::MassPhoton, o2::constants::physics::MassLambda0}); float sigmarap = RecoDecay::y(std::array{gamma.px() + lambda.px(), gamma.py() + lambda.py(), gamma.pz() + lambda.pz()}, o2::constants::physics::MassSigma0); - float SigmapT = RecoDecay::pt(array{gamma.px() + lambda.px(), gamma.py() + lambda.py()}); - - histos.fill(HIST("Selection/hSigmaMass"), sigmamass); - histos.fill(HIST("Selection/hSigmaMassWindow"), sigmamass - 1.192642); - histos.fill(HIST("GeneralQA/h2dMassGammaVsK0S"), gamma.mGamma(), gamma.mK0Short()); - histos.fill(HIST("GeneralQA/h2dMassLambdaVsK0S"), lambda.mLambda(), lambda.mK0Short()); - histos.fill(HIST("GeneralQA/h2dMassGammaVsLambda"), gamma.mGamma(), lambda.mLambda()); - histos.fill(HIST("GeneralQA/h3dMassSigma0VsDaupTs"), gamma.pt(), lambda.pt(), sigmamass); - - if constexpr (requires { gamma.pdgCode(); } && requires { lambda.pdgCode(); }) { - - histos.fill(HIST("MC/h2dPtVsMassSigma_All"), SigmapT, sigmamass); - - // Real Gamma x Real Lambda - but not from the same sigma0/antisigma0! - if ((gamma.pdgCode() == 22) && ((lambda.pdgCode() == 3122) || (lambda.pdgCode() == -3122)) && (gamma.motherMCPartId() != lambda.motherMCPartId())) { - histos.fill(HIST("MC/h2dPtVsMassSigma_TrueDaughters"), SigmapT, sigmamass); - histos.fill(HIST("MC/h2dTrueDaughtersMatrix"), lambda.pdgCodeMother(), gamma.pdgCodeMother()); - } - - // Real Gamma x fake Lambda - if ((gamma.pdgCode() == 22) && (lambda.pdgCode() != 3122) && (lambda.pdgCode() != -3122)) { - histos.fill(HIST("MC/h2dPtVsMassSigma_TrueGammaFakeLambda"), SigmapT, sigmamass); - histos.fill(HIST("MC/h2dTrueGammaFakeLambdaMatrix"), lambda.pdgCodeMother(), gamma.pdgCodeMother()); - } - // Fake Gamma x Real Lambda - if ((gamma.pdgCode() != 22) && ((lambda.pdgCode() == 3122) || (lambda.pdgCode() == -3122))) { - histos.fill(HIST("MC/h2dPtVsMassSigma_FakeGammaTrueLambda"), SigmapT, sigmamass); - histos.fill(HIST("MC/h2dFakeGammaTrueLambdaMatrix"), lambda.pdgCodeMother(), gamma.pdgCodeMother()); - } + histos.fill(HIST("SigmaSel/hSelectionStatistics"), 1.); + histos.fill(HIST("SigmaSel/hSigmaMass"), sigmamass); + histos.fill(HIST("SigmaSel/hSigmaMassWindow"), sigmamass - 1.192642); - // Fake Gamma x Fake Lambda - if ((gamma.pdgCode() != 22) && (lambda.pdgCode() != 3122) && (lambda.pdgCode() != -3122)) { - histos.fill(HIST("MC/h2dPtVsMassSigma_FakeDaughters"), SigmapT, sigmamass); - histos.fill(HIST("MC/h2dFakeDaughtersMatrix"), lambda.pdgCodeMother(), gamma.pdgCodeMother()); - } + if (fillQAhistos) { + histos.fill(HIST("GeneralQA/h2dMassGammaVsK0S"), gamma.mGamma(), gamma.mK0Short()); + histos.fill(HIST("GeneralQA/h2dMassLambdaVsK0S"), lambda.mLambda(), lambda.mK0Short()); + histos.fill(HIST("GeneralQA/h2dMassGammaVsLambda"), gamma.mGamma(), gamma.mLambda()); + histos.fill(HIST("GeneralQA/h2dMassLambdaVsGamma"), lambda.mLambda(), lambda.mGamma()); + histos.fill(HIST("GeneralQA/h3dMassSigma0VsDaupTs"), gamma.pt(), lambda.pt(), sigmamass); } if (TMath::Abs(sigmamass - 1.192642) > Sigma0Window) return false; - histos.fill(HIST("GeneralQA/h2dMassGammaVsK0SAfterMassSel"), gamma.mGamma(), gamma.mK0Short()); - histos.fill(HIST("GeneralQA/h2dMassLambdaVsK0SAfterMassSel"), lambda.mLambda(), lambda.mK0Short()); - histos.fill(HIST("GeneralQA/h2dMassGammaVsLambdaAfterMassSel"), gamma.mGamma(), lambda.mLambda()); - histos.fill(HIST("Selection/hSigmaY"), sigmarap); - histos.fill(HIST("hCandidateBuilderSelection"), 12.); + histos.fill(HIST("SigmaSel/hSigmaY"), sigmarap); + histos.fill(HIST("SigmaSel/hSelectionStatistics"), 2.); if (TMath::Abs(sigmarap) > SigmaMaxRap) return false; - histos.fill(HIST("hCandidateBuilderSelection"), 13.); - histos.fill(HIST("GeneralQA/h3dV0XYZ"), gamma.x(), gamma.y(), gamma.z()); + histos.fill(HIST("SigmaSel/hSigmaMassSelected"), sigmamass); + histos.fill(HIST("SigmaSel/hSelectionStatistics"), 3.); + + if (fillQAhistos) { + histos.fill(HIST("GeneralQA/h2dMassGammaVsK0SAfterMassSel"), gamma.mGamma(), gamma.mK0Short()); + histos.fill(HIST("GeneralQA/h2dMassLambdaVsK0SAfterMassSel"), lambda.mLambda(), lambda.mK0Short()); + histos.fill(HIST("GeneralQA/h2dMassGammaVsLambdaAfterMassSel"), gamma.mGamma(), lambda.mLambda()); + histos.fill(HIST("GeneralQA/h2dV0XY"), gamma.x(), gamma.y()); + } + return true; } @@ -636,7 +749,6 @@ struct sigma0builder { template void fillTables(TV0Object const& lambda, TV0Object const& gamma, TCollision const& coll) { - float GammaBDTScore = gamma.gammaBDTScore(); float LambdaBDTScore = lambda.lambdaBDTScore(); float AntiLambdaBDTScore = lambda.antiLambdaBDTScore(); @@ -678,6 +790,18 @@ struct sigma0builder { float fPhotonNegITSChi2PerNcl = negTrackGamma.itsChi2PerNcl(); uint8_t fPhotonV0Type = gamma.v0Type(); + uint8_t fPhotonPosTrackCode = ((uint8_t(posTrackGamma.hasTPC()) << hasTPC) | + (uint8_t(posTrackGamma.hasITSTracker()) << hasITSTracker) | + (uint8_t(posTrackGamma.hasITSAfterburner()) << hasITSAfterburner) | + (uint8_t(posTrackGamma.hasTRD()) << hasTRD) | + (uint8_t(posTrackGamma.hasTOF()) << hasTOF)); + + uint8_t fPhotonNegTrackCode = ((uint8_t(negTrackGamma.hasTPC()) << hasTPC) | + (uint8_t(negTrackGamma.hasITSTracker()) << hasITSTracker) | + (uint8_t(negTrackGamma.hasITSAfterburner()) << hasITSAfterburner) | + (uint8_t(negTrackGamma.hasTRD()) << hasTRD) | + (uint8_t(negTrackGamma.hasTOF()) << hasTOF)); + // Lambda auto posTrackLambda = lambda.template posTrackExtra_as(); auto negTrackLambda = lambda.template negTrackExtra_as(); @@ -722,6 +846,18 @@ struct sigma0builder { float fLambdaNegITSChi2PerNcl = negTrackLambda.itsChi2PerNcl(); uint8_t fLambdaV0Type = lambda.v0Type(); + uint8_t fLambdaPosTrackCode = ((uint8_t(posTrackLambda.hasTPC()) << hasTPC) | + (uint8_t(posTrackLambda.hasITSTracker()) << hasITSTracker) | + (uint8_t(posTrackLambda.hasITSAfterburner()) << hasITSAfterburner) | + (uint8_t(posTrackLambda.hasTRD()) << hasTRD) | + (uint8_t(posTrackLambda.hasTOF()) << hasTOF)); + + uint8_t fLambdaNegTrackCode = ((uint8_t(negTrackLambda.hasTPC()) << hasTPC) | + (uint8_t(negTrackLambda.hasITSTracker()) << hasITSTracker) | + (uint8_t(negTrackLambda.hasITSAfterburner()) << hasITSAfterburner) | + (uint8_t(negTrackLambda.hasTRD()) << hasTRD) | + (uint8_t(negTrackLambda.hasTOF()) << hasTOF)); + // Sigma0 candidate properties std::array pVecPhotons{gamma.px(), gamma.py(), gamma.pz()}; std::array pVecLambda{lambda.px(), lambda.py(), lambda.pz()}; @@ -735,18 +871,22 @@ struct sigma0builder { float fSigmaRap = RecoDecay::y(std::array{gamma.px() + lambda.px(), gamma.py() + lambda.py(), gamma.pz() + lambda.pz()}, o2::constants::physics::MassSigma0); float fSigmaOPAngle = v1.Angle(v2); float fSigmaCentrality = coll.centFT0C(); - float fSigmaTimeStamp = coll.timestamp(); - float fSigmaRunNumber = coll.runNumber(); + uint64_t fSigmaTimeStamp = coll.timestamp(); + int fSigmaRunNumber = coll.runNumber(); + float fSigmaIR = -1; + + if (fGetIR) + fSigmaIR = rateFetcher.fetch(ccdb.service, coll.timestamp(), coll.runNumber(), irSource, fIRCrashOnNull) * 1.e-3; // Filling TTree for ML analysis - sigma0cores(fSigmapT, fSigmaMass, fSigmaRap, fSigmaOPAngle, fSigmaCentrality, fSigmaRunNumber, fSigmaTimeStamp); + sigma0cores(fSigmapT, fSigmaMass, fSigmaRap, fSigmaOPAngle, fSigmaCentrality, fSigmaRunNumber, fSigmaTimeStamp, fSigmaIR); sigmaPhotonExtras(fPhotonPt, fPhotonMass, fPhotonQt, fPhotonAlpha, fPhotonRadius, fPhotonCosPA, fPhotonDCADau, fPhotonDCANegPV, fPhotonDCAPosPV, fPhotonZconv, fPhotonEta, fPhotonY, fPhotonPhi, fPhotonPosTPCNSigmaEl, fPhotonNegTPCNSigmaEl, fPhotonPosTPCNSigmaPi, fPhotonNegTPCNSigmaPi, fPhotonPosTPCCrossedRows, fPhotonNegTPCCrossedRows, fPhotonPosPt, fPhotonNegPt, fPhotonPosEta, fPhotonNegEta, fPhotonPosY, fPhotonNegY, fPhotonPsiPair, - fPhotonPosITSCls, fPhotonNegITSCls, fPhotonPosITSChi2PerNcl, fPhotonNegITSChi2PerNcl, + fPhotonPosITSCls, fPhotonNegITSCls, fPhotonPosITSChi2PerNcl, fPhotonNegITSChi2PerNcl, fPhotonPosTrackCode, fPhotonNegTrackCode, fPhotonV0Type, GammaBDTScore); sigmaLambdaExtras(fLambdaPt, fLambdaMass, fAntiLambdaMass, fLambdaQt, fLambdaAlpha, fLambdaLifeTime, @@ -756,83 +896,118 @@ struct sigma0builder { fLambdaPrTOFNSigma, fLambdaPiTOFNSigma, fALambdaPrTOFNSigma, fALambdaPiTOFNSigma, fLambdaPosTPCCrossedRows, fLambdaNegTPCCrossedRows, fLambdaPosPt, fLambdaNegPt, fLambdaPosEta, fLambdaNegEta, fLambdaPosPrY, fLambdaPosPiY, fLambdaNegPrY, fLambdaNegPiY, - fLambdaPosITSCls, fLambdaNegITSCls, fLambdaPosITSChi2PerNcl, fLambdaNegITSChi2PerNcl, + fLambdaPosITSCls, fLambdaNegITSCls, fLambdaPosITSChi2PerNcl, fLambdaNegITSChi2PerNcl, fLambdaPosTrackCode, fLambdaNegTrackCode, fLambdaV0Type, LambdaBDTScore, AntiLambdaBDTScore); } - void processMonteCarlo(soa::Join const& collisions, V0DerivedMCDatas const& V0s, dauTracks const&, aod::MotherMCParts const&, soa::Join const&, soa::Join const&) + void processMonteCarlo(soa::Join const& collisions, V0DerivedMCDatas const& fullV0s, dauTracks const&, aod::MotherMCParts const&, soa::Join const&, soa::Join const&) { for (const auto& coll : collisions) { - if (!IsEventAccepted(coll, true)) { + + if (!IsEventAccepted(coll, true)) continue; - } + // Do analysis with collision-grouped V0s, retain full collision information const uint64_t collIdx = coll.globalIndex(); - auto V0Table_thisCollision = V0s.sliceBy(perCollisionMCDerived, collIdx); + auto V0s = fullV0s.sliceBy(perCollisionMCDerived, collIdx); - histos.fill(HIST("hEventCentrality"), coll.centFT0C()); - // V0 table sliced - for (auto& gamma : V0Table_thisCollision) { // selecting photons from Sigma0 - float centrality = coll.centFT0C(); + float centrality = coll.centFT0C(); + histos.fill(HIST("hEventCentrality"), centrality); - if (!gamma.has_v0MCCore()) + bool fhasMCColl = false; + if (coll.has_straMCCollision()) + fhasMCColl = true; + + //_______________________________________________ + // Retrieving IR info + float interactionRate = -1; + if (fGetIR) { + interactionRate = rateFetcher.fetch(ccdb.service, coll.timestamp(), coll.runNumber(), irSource, fIRCrashOnNull) * 1.e-3; + + if (interactionRate < 0) + histos.get(HIST("GeneralQA/hRunNumberNegativeIR"))->Fill(Form("%d", coll.runNumber()), 1); + + histos.fill(HIST("GeneralQA/hInteractionRate"), interactionRate); + histos.fill(HIST("GeneralQA/hCentralityVsInteractionRate"), centrality, interactionRate); + } + + std::vector bestGammasArray; + std::vector bestLambdasArray; + + //_______________________________________________ + // V0s loop + for (auto& v0 : V0s) { + if (!v0.has_v0MCCore()) continue; - auto gammaMC = gamma.v0MCCore_as>(); + auto v0MC = v0.v0MCCore_as>(); - // Auxiliary histograms: - if (gammaMC.pdgCode() == 22) { - histos.fill(HIST("MC/h3dGammasXYZ"), gamma.x(), gamma.y(), gamma.z()); - float GammaY = TMath::Abs(RecoDecay::y(std::array{gamma.px(), gamma.py(), gamma.pz()}, o2::constants::physics::MassGamma)); - float gammaMCpT = RecoDecay::pt(array{gammaMC.pxMC(), gammaMC.pyMC()}); + if (v0MC.pdgCode() == 22) { + histos.fill(HIST("MC/h2dGammaXYConversion"), v0.x(), v0.y()); + float GammaY = TMath::Abs(RecoDecay::y(std::array{v0.px(), v0.py(), v0.pz()}, o2::constants::physics::MassGamma)); if (GammaY < 0.5) { // rapidity selection - histos.fill(HIST("MC/h2dPtVsCentrality_GammaBeforeSel"), centrality, gamma.pt()); // isgamma - if (gammaMCpT > 0) - histos.fill(HIST("MC/h2dGammaPtResolution"), 1.f / gammaMCpT, gamma.pt() - gammaMCpT); // pT resolution - - if (gammaMC.pdgCodeMother() == 3212) { - histos.fill(HIST("MC/h2dPtVsCentrality_GammaSigma0"), centrality, gamma.pt()); // isgamma from sigma - } - if (gammaMC.pdgCodeMother() == -3212) { - histos.fill(HIST("MC/h2dPtVsCentrality_GammaAntiSigma0"), centrality, gamma.pt()); // isgamma from sigma - } + histos.fill(HIST("MC/h2dPtVsCentralityBeforeSel_MCAssocGamma"), centrality, v0.pt()); // isgamma } } - if (gammaMC.pdgCode() == 3122) { // Is Lambda - float LambdaY = TMath::Abs(RecoDecay::y(std::array{gamma.px(), gamma.py(), gamma.pz()}, o2::constants::physics::MassLambda)); - float lambdaMCpT = RecoDecay::pt(array{gammaMC.pxMC(), gammaMC.pyMC()}); - if (LambdaY < 0.5) { // rapidity selection - histos.fill(HIST("MC/h2dPtVsCentrality_LambdaBeforeSel"), centrality, gamma.pt()); - if (lambdaMCpT > 0) - histos.fill(HIST("MC/h2dLambdaPtResolution"), 1.f / lambdaMCpT, gamma.pt() - lambdaMCpT); // pT resolution - if (gammaMC.pdgCodeMother() == 3212) { - histos.fill(HIST("MC/h2dPtVsCentrality_LambdaSigma0"), centrality, gamma.pt()); - } - } + + float lambdaY = TMath::Abs(RecoDecay::y(std::array{v0.px(), v0.py(), v0.pz()}, o2::constants::physics::MassLambda)); + if (lambdaY < 0.5) { + if (v0MC.pdgCode() == 3122) // Is Lambda + histos.fill(HIST("MC/h2dPtVsCentralityBeforeSel_MCAssocLambda"), centrality, v0.pt()); + if (v0MC.pdgCode() == -3122) // Is AntiLambda + histos.fill(HIST("MC/h2dPtVsCentralityBeforeSel_MCAssocALambda"), centrality, v0.pt()); } - if (gammaMC.pdgCode() == -3122) { // Is AntiLambda - float AntiLambdaY = TMath::Abs(RecoDecay::y(std::array{gamma.px(), gamma.py(), gamma.pz()}, o2::constants::physics::MassLambda)); - if (AntiLambdaY < 0.5) { // rapidity selection - histos.fill(HIST("MC/h2dPtVsCentrality_AntiLambdaBeforeSel"), centrality, gamma.pt()); - if (gammaMC.pdgCodeMother() == -3212) { - histos.fill(HIST("MC/h2dPtVsCentrality_LambdaAntiSigma0"), centrality, gamma.pt()); // isantilambda from antisigma - } + + if (processPhotonCandidate(v0)) // selecting photons + bestGammasArray.push_back(v0.globalIndex()); // Save indices of best gamma candidates + + if (processLambdaCandidate(v0)) // selecting lambdas + bestLambdasArray.push_back(v0.globalIndex()); // Save indices of best lambda candidates + } + + //_______________________________________________ + // Pi0 optional loop + if (doPi0QA) { + for (size_t i = 0; i < bestGammasArray.size(); ++i) { + auto gamma1 = fullV0s.rawIteratorAt(bestGammasArray[i]); + for (size_t j = i + 1; j < bestGammasArray.size(); ++j) { + auto gamma2 = fullV0s.rawIteratorAt(bestGammasArray[j]); + runPi0QA(gamma1, gamma2); } } + } - for (auto& lambda : V0Table_thisCollision) { // selecting lambdas from Sigma0 - if (!lambda.has_v0MCCore()) - continue; + //_______________________________________________ + // Wrongly collision association study + if (doAssocStudy && fhasMCColl) { + analyzeV0CollAssoc(coll, fullV0s, bestGammasArray, interactionRate); // Gamma + analyzeV0CollAssoc(coll, fullV0s, bestLambdasArray, interactionRate); // Lambda + } + + //_______________________________________________ + // Sigma0 loop + for (size_t i = 0; i < bestGammasArray.size(); ++i) { + auto gamma = fullV0s.rawIteratorAt(bestGammasArray[i]); + + if (!gamma.has_v0MCCore()) + continue; + + auto gammaMC = gamma.v0MCCore_as>(); + + bool fIsPhotonCorrectlyAssign = false; + if (fhasMCColl) { + auto gammaMCCollision = coll.template straMCCollision_as>(); + fIsPhotonCorrectlyAssign = (gammaMC.straMCCollisionId() == gammaMCCollision.globalIndex()); + } + + for (size_t j = 0; j < bestLambdasArray.size(); ++j) { + auto lambda = fullV0s.iteratorAt(bestLambdasArray[j]); - if (lambda.v0Type() != 1) { // safeguard to avoid TPC-only photons + if (!lambda.has_v0MCCore()) continue; - } auto lambdaMC = lambda.v0MCCore_as>(); - if (doPi0QA) // Pi0 QA study - runPi0QA(gamma, lambda); - // Sigma0 candidate properties std::array pVecPhotons{gamma.px(), gamma.py(), gamma.pz()}; std::array pVecLambda{lambda.px(), lambda.py(), lambda.pz()}; @@ -841,78 +1016,135 @@ struct sigma0builder { float SigmapT = RecoDecay::pt(array{gamma.px() + lambda.px(), gamma.py() + lambda.py()}); float SigmaY = TMath::Abs(RecoDecay::y(std::array{gamma.px() + lambda.px(), gamma.py() + lambda.py(), gamma.pz() + lambda.pz()}, o2::constants::physics::MassSigma0)); - if ((gammaMC.pdgCode() == 22) && (gammaMC.pdgCodeMother() == 3212) && (lambdaMC.pdgCode() == 3122) && (lambdaMC.pdgCodeMother() == 3212) && (gamma.motherMCPartId() == lambda.motherMCPartId()) && (SigmaY < 0.5)) { - histos.fill(HIST("MC/h2dPtVsCentrality_Sigma0BeforeSel"), centrality, RecoDecay::pt(array{gamma.px() + lambda.px(), gamma.py() + lambda.py()})); - histos.fill(HIST("MC/h2dSigmaPtVsLambdaPt"), SigmapT, lambda.pt()); - histos.fill(HIST("MC/h2dSigmaPtVsGammaPt"), SigmapT, gamma.pt()); - } - if ((gammaMC.pdgCode() == 22) && (gammaMC.pdgCodeMother() == -3212) && (lambdaMC.pdgCode() == -3122) && (lambdaMC.pdgCodeMother() == -3212) && (gamma.motherMCPartId() == lambda.motherMCPartId()) && (SigmaY < 0.5)) - histos.fill(HIST("MC/h2dPtVsCentrality_AntiSigma0BeforeSel"), centrality, SigmapT); - - if (!processSigmaCandidate(lambda, gamma)) // basic selection - continue; - + // MC properties bool fIsSigma = false; bool fIsAntiSigma = false; - float SigmaMCpT = RecoDecay::pt(array{gammaMC.pxMC() + lambdaMC.pxMC(), gammaMC.pyMC() + lambdaMC.pyMC()}); bool fIsPhotonPrimary = gammaMC.isPhysicalPrimary(); + bool fIsLambdaPrimary = lambdaMC.isPhysicalPrimary(); + bool fIsLambdaCorrectlyAssign = false; + int PhotonCandPDGCode = gammaMC.pdgCode(); int PhotonCandPDGCodeMother = gammaMC.pdgCodeMother(); - float PhotonMCpT = RecoDecay::pt(array{gammaMC.pxMC(), gammaMC.pyMC()}); - bool fIsLambdaPrimary = lambdaMC.isPhysicalPrimary(); int LambdaCandPDGCode = lambdaMC.pdgCode(); int LambdaCandPDGCodeMother = lambdaMC.pdgCodeMother(); + + float SigmaMCpT = RecoDecay::pt(array{gammaMC.pxMC() + lambdaMC.pxMC(), gammaMC.pyMC() + lambdaMC.pyMC()}); + float PhotonMCpT = RecoDecay::pt(array{gammaMC.pxMC(), gammaMC.pyMC()}); float LambdaMCpT = RecoDecay::pt(array{lambdaMC.pxMC(), lambdaMC.pyMC()}); - if ((gammaMC.pdgCode() == 22) && (gammaMC.pdgCodeMother() == 3212) && (lambdaMC.pdgCode() == 3122) && (lambdaMC.pdgCodeMother() == 3212) && (gamma.motherMCPartId() == lambda.motherMCPartId())) { - fIsSigma = true; - histos.fill(HIST("MC/h2dPtVsCentrality_Sigma0AfterSel"), centrality, RecoDecay::pt(array{gamma.px() + lambda.px(), gamma.py() + lambda.py()})); + if (fhasMCColl) { + auto lambdaMCCollision = coll.template straMCCollision_as>(); + fIsLambdaCorrectlyAssign = (lambdaMC.straMCCollisionId() == lambdaMCCollision.globalIndex()); } - if ((gammaMC.pdgCode() == 22) && (gammaMC.pdgCodeMother() == -3212) && (lambdaMC.pdgCode() == -3122) && (lambdaMC.pdgCodeMother() == -3212) && (gamma.motherMCPartId() == lambda.motherMCPartId())) { + + if ((PhotonCandPDGCode == 22) && (PhotonCandPDGCodeMother == 3212) && (LambdaCandPDGCode == 3122) && (LambdaCandPDGCodeMother == 3212) && (gamma.motherMCPartId() == lambda.motherMCPartId())) + fIsSigma = true; + if ((PhotonCandPDGCode == 22) && (PhotonCandPDGCodeMother == -3212) && (LambdaCandPDGCode == -3122) && (LambdaCandPDGCodeMother == -3212) && (gamma.motherMCPartId() == lambda.motherMCPartId())) fIsAntiSigma = true; - histos.fill(HIST("MC/h2dPtVsCentrality_AntiSigma0AfterSel"), centrality, RecoDecay::pt(array{gamma.px() + lambda.px(), gamma.py() + lambda.py()})); - // TH3D Mass histogram + + if (SigmaY < 0.5) { + if (fIsSigma) { + histos.fill(HIST("MC/h2dPtVsCentralityBeforeSel_MCAssocSigma0"), centrality, SigmaMCpT); + histos.fill(HIST("MC/h2dSigma0PtVsLambdaPtBeforeSel_MCAssoc"), SigmaMCpT, LambdaMCpT); + histos.fill(HIST("MC/h2dSigma0PtVsGammaPtBeforeSel_MCAssoc"), SigmaMCpT, PhotonMCpT); + } + if (fIsAntiSigma) + histos.fill(HIST("MC/h2dPtVsCentralityBeforeSel_MCAssocASigma0"), centrality, SigmaMCpT); } + + histos.fill(HIST("SigmaSel/h3dMassSigma0BeforeSel"), centrality, SigmapT, SigmaMass); + + // Build sigma0 candidate, please + if (!buildSigma0(lambda, gamma)) + continue; + + // Filling histos and tables + histos.fill(HIST("SigmaSel/h3dMassSigma0AfterSel"), centrality, SigmapT, SigmaMass); + + if (SigmaY < 0.5) { + if (fIsSigma) + histos.fill(HIST("MC/h2dPtVsCentralityAfterSel_MCAssocSigma0"), centrality, SigmaMCpT); + if (fIsAntiSigma) + histos.fill(HIST("MC/h2dPtVsCentralityAfterSel_MCAssocASigma0"), centrality, SigmaMCpT); + } + + if (fillBkgQAhistos) + runBkgAnalysis(fIsSigma, fIsAntiSigma, PhotonCandPDGCode, PhotonCandPDGCodeMother, LambdaCandPDGCode, LambdaCandPDGCodeMother, SigmapT, SigmaMass); + + // Fill Tables please sigma0mccores(fIsSigma, fIsAntiSigma, SigmaMCpT, - PhotonCandPDGCode, PhotonCandPDGCodeMother, fIsPhotonPrimary, PhotonMCpT, - LambdaCandPDGCode, LambdaCandPDGCodeMother, fIsLambdaPrimary, LambdaMCpT); + PhotonCandPDGCode, PhotonCandPDGCodeMother, fIsPhotonPrimary, PhotonMCpT, fIsPhotonCorrectlyAssign, + LambdaCandPDGCode, LambdaCandPDGCodeMother, fIsLambdaPrimary, LambdaMCpT, fIsLambdaCorrectlyAssign); fillTables(lambda, gamma, coll); // filling tables with accepted candidates nSigmaCandidates++; - if (nSigmaCandidates % 5000 == 0) { + if (nSigmaCandidates % 10000 == 0) LOG(info) << "Sigma0 Candidates built: " << nSigmaCandidates; - } - - // QA histograms - // Signal only (sigma0+antisigma0) - if (fIsSigma || fIsAntiSigma) - histos.fill(HIST("MC/h2dPtVsMassSigma_SignalOnly"), SigmapT, SigmaMass); } } } } - void processRealData(soa::Join const& collisions, V0StandardDerivedDatas const& V0s, dauTracks const&) + void processRealData(soa::Join const& collisions, V0StandardDerivedDatas const& fullV0s, dauTracks const&) { for (const auto& coll : collisions) { - if (!IsEventAccepted(coll, true)) { + + if (!IsEventAccepted(coll, true)) continue; - } + // Do analysis with collision-grouped V0s, retain full collision information const uint64_t collIdx = coll.globalIndex(); - auto V0Table_thisCollision = V0s.sliceBy(perCollisionSTDDerived, collIdx); + auto V0s = fullV0s.sliceBy(perCollisionSTDDerived, collIdx); - histos.fill(HIST("hEventCentrality"), coll.centFT0C()); - // V0 table sliced - for (auto& gamma : V0Table_thisCollision) { // selecting photons from Sigma0 - for (auto& lambda : V0Table_thisCollision) { // selecting lambdas from Sigma0 - if (doPi0QA) // Pi0 QA study - runPi0QA(gamma, lambda); + float centrality = coll.centFT0C(); + histos.fill(HIST("hEventCentrality"), centrality); - if (lambda.v0Type() != 1) { // safeguard to avoid TPC-only photons - continue; + //_______________________________________________ + // Retrieving IR info + float interactionRate = -1; + if (fGetIR) { + interactionRate = rateFetcher.fetch(ccdb.service, coll.timestamp(), coll.runNumber(), irSource, fIRCrashOnNull) * 1.e-3; + + if (interactionRate < 0) + histos.get(HIST("GeneralQA/hRunNumberNegativeIR"))->Fill(Form("%d", coll.runNumber()), 1); + + histos.fill(HIST("GeneralQA/hInteractionRate"), interactionRate); + histos.fill(HIST("GeneralQA/hCentralityVsInteractionRate"), centrality, interactionRate); + } + + std::vector bestGammasArray; + std::vector bestLambdasArray; + + //_______________________________________________ + // V0s loop + for (auto& v0 : V0s) { + if (processPhotonCandidate(v0)) // selecting photons + bestGammasArray.push_back(v0.globalIndex()); // Save indices of best gamma candidates + + if (processLambdaCandidate(v0)) // selecting lambdas + bestLambdasArray.push_back(v0.globalIndex()); // Save indices of best lambda candidates + } + + //_______________________________________________ + // Pi0 optional loop + if (doPi0QA) { + for (size_t i = 0; i < bestGammasArray.size(); ++i) { + auto gamma1 = fullV0s.rawIteratorAt(bestGammasArray[i]); + for (size_t j = i + 1; j < bestGammasArray.size(); ++j) { + auto gamma2 = fullV0s.rawIteratorAt(bestGammasArray[j]); + runPi0QA(gamma1, gamma2); } + } + } + + //_______________________________________________ + // Sigma0 nested loop + for (size_t i = 0; i < bestGammasArray.size(); ++i) { + auto gamma = fullV0s.rawIteratorAt(bestGammasArray[i]); + + for (size_t j = 0; j < bestLambdasArray.size(); ++j) { + auto lambda = fullV0s.iteratorAt(bestLambdasArray[j]); // Sigma0 candidate properties std::array pVecPhotons{gamma.px(), gamma.py(), gamma.pz()}; @@ -920,27 +1152,34 @@ struct sigma0builder { auto arrMom = std::array{pVecPhotons, pVecLambda}; float SigmaMass = RecoDecay::m(arrMom, std::array{o2::constants::physics::MassPhoton, o2::constants::physics::MassLambda0}); float SigmapT = RecoDecay::pt(array{gamma.px() + lambda.px(), gamma.py() + lambda.py()}); - // float SigmaY = TMath::Abs(RecoDecay::y(std::array{gamma.px() + lambda.px(), gamma.py() + lambda.py(), gamma.pz() + lambda.pz()}, o2::constants::physics::MassSigma0)); - histos.fill(HIST("h3dMassSigmasBeforeSel"), coll.centFT0C(), SigmapT, SigmaMass); - if (!processSigmaCandidate(lambda, gamma)) // applying selection for reconstruction - continue; + histos.fill(HIST("SigmaSel/h3dMassSigma0BeforeSel"), centrality, SigmapT, SigmaMass); - histos.fill(HIST("h3dMassSigmasAfterSel"), coll.centFT0C(), SigmapT, SigmaMass); + // Building sigma0 candidate + if (!buildSigma0(lambda, gamma)) + continue; fillTables(lambda, gamma, coll); // filling tables with accepted candidates + histos.fill(HIST("SigmaSel/h3dMassSigma0AfterSel"), centrality, SigmapT, SigmaMass); + nSigmaCandidates++; - if (nSigmaCandidates % 5000 == 0) { + if (nSigmaCandidates % 10000 == 0) LOG(info) << "Sigma0 Candidates built: " << nSigmaCandidates; - } } } } } + // Simulated processing in Run 3 (subscribes to MC information too) + void processGeneratedCollRun3(soa::Join::iterator const& mcCollision) + { + histos.fill(HIST("Gen/hNEventsNch"), mcCollision.multMCNParticlesEta05()); + } + PROCESS_SWITCH(sigma0builder, processMonteCarlo, "process as if MC data", false); PROCESS_SWITCH(sigma0builder, processRealData, "process as if real data", true); + PROCESS_SWITCH(sigma0builder, processGeneratedCollRun3, "process generated MC collisions", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) diff --git a/PWGLF/Tasks/QC/strderivedGenQA.cxx b/PWGLF/Tasks/QC/strderivedGenQA.cxx index 7e232b1dd97..201dcd99ac2 100644 --- a/PWGLF/Tasks/QC/strderivedGenQA.cxx +++ b/PWGLF/Tasks/QC/strderivedGenQA.cxx @@ -320,6 +320,7 @@ struct strderivedGenQA { histos.add("MCV0/Gamma/hdcaDau", "hdcaDau", kTH1F, {axisDCAdau}); histos.add("MCV0/Gamma/hdcaNegtopv", "hdcaNegtopv", kTH1F, {axisDCAToPV}); histos.add("MCV0/Gamma/hdcaPostopv", "hdcaPostopv", kTH1F, {axisDCAToPV}); + histos.add("MCV0/Gamma/hZ", "hZ", kTH1F, {{240, -120.0f, 120.0f}}); histos.add("MCV0/Lambda/h2dpTResolution", "h2dpTResolution", kTH2F, {axisPt, axisPtResolution}); histos.add("MCV0/Lambda/h2dMass", "h2dMass", kTH2F, {axisPt, axisMassLambda}); @@ -804,6 +805,7 @@ struct strderivedGenQA { histos.fill(HIST("MCV0/Gamma/hdcaDau"), v0.dcaV0daughters()); histos.fill(HIST("MCV0/Gamma/hdcaNegtopv"), v0.dcanegtopv()); histos.fill(HIST("MCV0/Gamma/hdcaPostopv"), v0.dcapostopv()); + histos.fill(HIST("MCV0/Gamma/hZ"), v0.z()); } if (v0MC.pdgCode() == 3122) { // IsLambda histos.fill(HIST("MCV0/h2dArmenterosP"), v0.alpha(), v0.qtarm()); diff --git a/PWGLF/Tasks/Strangeness/sigmaanalysis.cxx b/PWGLF/Tasks/Strangeness/sigmaanalysis.cxx index f2e04920d50..2e88ccc50b4 100644 --- a/PWGLF/Tasks/Strangeness/sigmaanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/sigmaanalysis.cxx @@ -37,7 +37,6 @@ #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Centrality.h" #include "Common/DataModel/PIDResponse.h" -#include "Common/CCDB/ctpRateFetcher.h" #include "PWGLF/DataModel/LFStrangenessTables.h" #include "PWGLF/DataModel/LFStrangenessPIDTables.h" #include "PWGLF/DataModel/LFStrangenessMLTables.h" @@ -58,47 +57,31 @@ using std::array; using V0MCSigmas = soa::Join; using V0Sigmas = soa::Join; +static const std::vector PhotonSels = {"NoSel", "V0Type", "DaupT", "DCADauToPV", + "DCADau", "DauTPCCR", "TPCNSigmaEl", "V0pT", + "Y", "V0Radius", "RZCut", "Armenteros", "CosPA", + "PsiPair", "Phi", "Mass"}; + +static const std::vector LambdaSels = {"NoSel", "V0Radius", "DCADau", "Armenteros", + "CosPA", "Y", "TPCCR", "DauITSCls", "Lifetime", + "TPCTOFPID", "DCADauToPV", "Mass"}; + +static const std::vector DirList = {"BeforeSel", "AfterSel"}; + struct sigmaanalysis { - Service ccdb; - ctpRateFetcher rateFetcher; HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + Configurable fillQAhistos{"fillQAhistos", false, "if true, fill QA histograms"}; + Configurable fillBkgQAhistos{"fillBkgQAhistos", false, "if true, fill MC QA histograms for Bkg study. Only works with MC."}; + Configurable fillpTResoQAhistos{"fillpTResoQAhistos", false, "if true, fill MC QA histograms for pT resolution study. Only works with MC."}; + // Interaction rate selection: - // Event selection - Configurable doPPAnalysis{"doPPAnalysis", true, "if in pp, set to true"}; Configurable fGetIR{"fGetIR", false, "Flag to retrieve the IR info."}; - Configurable irSource{"irSource", "T0VTX", "Estimator of the interaction rate (Recommended: pp --> T0VTX, Pb-Pb --> ZNC hadronic)"}; Configurable minIR{"minIR", -1, "Min Interaction Rate (kHz). Leave -1 if no selection desired."}; Configurable maxIR{"maxIR", -1, "Max Interaction Rate (kHz). Leave -1 if no selection desired."}; - struct : ConfigurableGroup { - Configurable requireSel8{"requireSel8", true, "require sel8 event selection"}; - Configurable requireTriggerTVX{"requireTriggerTVX", true, "require FT0 vertex (acceptable FT0C-FT0A time difference) at trigger level"}; - Configurable rejectITSROFBorder{"rejectITSROFBorder", true, "reject events at ITS ROF border"}; - Configurable rejectTFBorder{"rejectTFBorder", true, "reject events at TF border"}; - Configurable requireIsVertexITSTPC{"requireIsVertexITSTPC", true, "require events with at least one ITS-TPC track"}; - Configurable requireIsGoodZvtxFT0VsPV{"requireIsGoodZvtxFT0VsPV", true, "require events with PV position along z consistent (within 1 cm) between PV reconstructed using tracks and PV using FT0 A-C time difference"}; - Configurable requireIsVertexTOFmatched{"requireIsVertexTOFmatched", false, "require events with at least one of vertex contributors matched to TOF"}; - Configurable requireIsVertexTRDmatched{"requireIsVertexTRDmatched", false, "require events with at least one of vertex contributors matched to TRD"}; - Configurable rejectSameBunchPileup{"rejectSameBunchPileup", false, "reject collisions in case of pileup with another collision in the same foundBC"}; - Configurable requireNoCollInTimeRangeStd{"requireNoCollInTimeRangeStd", false, "reject collisions corrupted by the cannibalism, with other collisions within +/- 2 microseconds or mult above a certain threshold in -4 - -2 microseconds"}; - Configurable requireNoCollInTimeRangeStrict{"requireNoCollInTimeRangeStrict", false, "reject collisions corrupted by the cannibalism, with other collisions within +/- 10 microseconds"}; - Configurable requireNoCollInTimeRangeNarrow{"requireNoCollInTimeRangeNarrow", false, "reject collisions corrupted by the cannibalism, with other collisions within +/- 2 microseconds"}; - Configurable requireNoCollInTimeRangeVzDep{"requireNoCollInTimeRangeVzDep", false, "reject collisions corrupted by the cannibalism, with other collisions with pvZ of drifting TPC tracks from past/future collisions within 2.5 cm the current pvZ"}; - Configurable requireNoCollInROFStd{"requireNoCollInROFStd", false, "reject collisions corrupted by the cannibalism, with other collisions within the same ITS ROF with mult. above a certain threshold"}; - Configurable requireNoCollInROFStrict{"requireNoCollInROFStrict", false, "reject collisions corrupted by the cannibalism, with other collisions within the same ITS ROF"}; - Configurable requireINEL0{"requireINEL0", false, "require INEL>0 event selection"}; - Configurable requireINEL1{"requireINEL1", false, "require INEL>1 event selection"}; - Configurable maxZVtxPosition{"maxZVtxPosition", 10., "max Z vtx position"}; - Configurable useFT0CbasedOccupancy{"useFT0CbasedOccupancy", false, "Use sum of FT0-C amplitudes for estimating occupancy? (if not, use track-based definition)"}; - // fast check on occupancy - Configurable minOccupancy{"minOccupancy", -1, "minimum occupancy from neighbouring collisions"}; - Configurable maxOccupancy{"maxOccupancy", -1, "maximum occupancy from neighbouring collisions"}; - } eventSelections; - // Analysis strategy: Configurable fUseMLSel{"fUseMLSel", false, "Flag to use ML selection. If False, the standard selection is applied."}; - Configurable fProcessMonteCarlo{"fProcessMonteCarlo", false, "Flag to process MC data."}; Configurable fselLambdaTPCPID{"fselLambdaTPCPID", true, "Flag to select lambda-like candidates using TPC NSigma."}; Configurable fselLambdaTOFPID{"fselLambdaTOFPID", false, "Flag to select lambda-like candidates using TOF NSigma."}; Configurable doMCAssociation{"doMCAssociation", false, "Flag to process only signal candidates. Use only with processMonteCarlo!"}; @@ -143,8 +126,6 @@ struct sigmaanalysis { Configurable PhotonMinTPCCrossedRows{"PhotonMinTPCCrossedRows", 30, "Min daughter TPC Crossed Rows"}; Configurable PhotonMinTPCNSigmas{"PhotonMinTPCNSigmas", -7, "Min TPC NSigmas for daughters"}; Configurable PhotonMaxTPCNSigmas{"PhotonMaxTPCNSigmas", 7, "Max TPC NSigmas for daughters"}; - Configurable PiMaxTPCNSigmas{"PiMaxTPCNSigmas", 1, "Max TPC NSigmas for pi rejection"}; - Configurable piMaxpT{"piMaxpT", 3.5, "Max pT for pi rejection"}; Configurable PhotonMinPt{"PhotonMinPt", 0.0, "Min photon pT (GeV/c)"}; Configurable PhotonMaxPt{"PhotonMaxPt", 50.0, "Max photon pT (GeV/c)"}; Configurable PhotonMaxRap{"PhotonMaxRap", 0.5, "Max photon rapidity"}; @@ -158,10 +139,10 @@ struct sigmaanalysis { Configurable PhotonPsiPairMax{"PhotonPsiPairMax", 1e+9, "maximum psi angle of the track pair"}; Configurable PhotonMaxDauEta{"PhotonMaxDauEta", 0.8, "Max pseudorapidity of daughter tracks"}; Configurable PhotonLineCutZ0{"PhotonLineCutZ0", 7.0, "The offset for the linecute used in the Z vs R plot"}; - Configurable PhotonPhiMin1{"PhotonPhiMin1", -1, "Phi min value for photons, region 1 (leave negative if no selection desired)"}; - Configurable PhotonPhiMax1{"PhotonPhiMax1", -1, "Phi max value for photons, region 1 (leave negative if no selection desired)"}; - Configurable PhotonPhiMin2{"PhotonPhiMin2", -1, "Phi max value for photons, region 2 (leave negative if no selection desired)"}; - Configurable PhotonPhiMax2{"PhotonPhiMax2", -1, "Phi min value for photons, region 2 (leave negative if no selection desired)"}; + Configurable PhotonPhiMin1{"PhotonPhiMin1", -1, "Phi min value to reject photons, region 1 (leave negative if no selection desired)"}; + Configurable PhotonPhiMax1{"PhotonPhiMax1", -1, "Phi max value to reject photons, region 1 (leave negative if no selection desired)"}; + Configurable PhotonPhiMin2{"PhotonPhiMin2", -1, "Phi max value to reject photons, region 2 (leave negative if no selection desired)"}; + Configurable PhotonPhiMax2{"PhotonPhiMax2", -1, "Phi min value to reject photons, region 2 (leave negative if no selection desired)"}; Configurable SigmaMaxRap{"SigmaMaxRap", 0.5, "Max sigma0 rapidity"}; @@ -172,12 +153,12 @@ struct sigmaanalysis { ConfigurableAxis axisInvPt{"axisInvPt", {VARIABLE_WIDTH, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 2.0, 5.0, 10.0, 20.0, 50.0}, ""}; ConfigurableAxis axisDeltaPt{"axisDeltaPt", {400, -50.0, 50.0}, ""}; ConfigurableAxis axisRapidity{"axisRapidity", {100, -2.0f, 2.0f}, "Rapidity"}; - ConfigurableAxis axisIRBinning{"axisIRBinning", {5000, 0, 1500}, "Binning for the interaction rate (kHz)"}; + ConfigurableAxis axisIRBinning{"axisIRBinning", {150, 0, 1500}, "Binning for the interaction rate (kHz)"}; // Invariant Mass - ConfigurableAxis axisSigmaMass{"axisSigmaMass", {1000, 1.10f, 1.30f}, "M_{#Sigma^{0}} (GeV/c^{2})"}; + ConfigurableAxis axisSigmaMass{"axisSigmaMass", {500, 1.10f, 1.30f}, "M_{#Sigma^{0}} (GeV/c^{2})"}; ConfigurableAxis axisLambdaMass{"axisLambdaMass", {200, 1.05f, 1.151f}, "M_{#Lambda} (GeV/c^{2})"}; - ConfigurableAxis axisPhotonMass{"axisPhotonMass", {600, -0.1f, 0.5f}, "M_{#Gamma}"}; + ConfigurableAxis axisPhotonMass{"axisPhotonMass", {200, -0.1f, 0.5f}, "M_{#Gamma}"}; // AP plot axes ConfigurableAxis axisAPAlpha{"axisAPAlpha", {220, -1.1f, 1.1f}, "V0 AP alpha"}; @@ -189,422 +170,711 @@ struct sigmaanalysis { ConfigurableAxis axisChi2PerNcl{"axisChi2PerNcl", {80, -40, 40}, "Chi2 Per Ncl"}; ConfigurableAxis axisTPCNSigma{"axisTPCNSigma", {120, -30, 30}, "TPC NSigma"}; ConfigurableAxis axisTOFNSigma{"axisTOFNSigma", {120, -30, 30}, "TOF NSigma"}; - ConfigurableAxis axisLifetime{"axisLifetime", {200, 0, 200}, "Chi2 Per Ncl"}; + ConfigurableAxis axisLifetime{"axisLifetime", {100, 0, 100}, "Chi2 Per Ncl"}; // topological variable QA axes ConfigurableAxis axisRadius{"axisRadius", {240, 0.0f, 120.0f}, "V0 radius (cm)"}; ConfigurableAxis axisDCAtoPV{"axisDCAtoPV", {500, 0.0f, 50.0f}, "DCA (cm)"}; ConfigurableAxis axisDCAdau{"axisDCAdau", {50, 0.0f, 5.0f}, "DCA (cm)"}; ConfigurableAxis axisCosPA{"axisCosPA", {200, 0.5f, 1.0f}, "Cosine of pointing angle"}; - ConfigurableAxis axisPsiPair{"axisPsiPair", {500, -5.0f, 5.0f}, "Psipair for photons"}; - ConfigurableAxis axisCandSel{"axisCandSel", {32, 0.5f, +32.5f}, "Candidate Selection"}; + ConfigurableAxis axisPA{"axisPA", {100, 0.0f, 1}, "Pointing angle"}; + ConfigurableAxis axisPsiPair{"axisPsiPair", {250, -5.0f, 5.0f}, "Psipair for photons"}; + ConfigurableAxis axisPhi{"axisPhi", {200, 0, 2 * o2::constants::math::PI}, "Phi for photons"}; + ConfigurableAxis axisZ{"axisZ", {120, -120.0f, 120.0f}, "V0 Z position (cm)"}; + + ConfigurableAxis axisCandSel{"axisCandSel", {20, 0.5f, +20.5f}, "Candidate Selection"}; // ML ConfigurableAxis MLProb{"MLOutput", {100, 0.0f, 1.0f}, ""}; - int nSigmaCandidates = 0; + void init(InitContext const&) { - // setting CCDB service - ccdb->setURL("http://alice-ccdb.cern.ch"); - ccdb->setCaching(true); - ccdb->setFatalWhenNull(false); - - // Event Counters - histos.add("hEventSelection", "hEventSelection", kTH1F, {{20, -0.5f, +18.5f}}); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(1, "All collisions"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(2, "sel8 cut"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(3, "kIsTriggerTVX"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(4, "kNoITSROFrameBorder"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(5, "kNoTimeFrameBorder"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(6, "posZ cut"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(7, "kIsVertexITSTPC"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(8, "kIsGoodZvtxFT0vsPV"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(9, "kIsVertexTOFmatched"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(10, "kIsVertexTRDmatched"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(11, "kNoSameBunchPileup"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(12, "kNoCollInTimeRangeStd"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(13, "kNoCollInTimeRangeStrict"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(14, "kNoCollInTimeRangeNarrow"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(15, "kNoCollInRofStd"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(16, "kNoCollInRofStrict"); - if (doPPAnalysis) { - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(17, "INEL>0"); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(18, "INEL>1"); + + for (const auto& histodir : DirList) { + + histos.add(histodir + "/Photon/hTrackCode", "hTrackCode", kTH1F, {{11, 0.5f, 11.5f}}); + histos.add(histodir + "/Photon/hV0Type", "hV0Type", kTH1F, {{8, 0.5f, 8.5f}}); + histos.add(histodir + "/Photon/hNegpT", "hNegpT", kTH1F, {axisPt}); + histos.add(histodir + "/Photon/hPospT", "hPospT", kTH1F, {axisPt}); + histos.add(histodir + "/Photon/hDCANegToPV", "hDCANegToPV", kTH1F, {axisDCAtoPV}); + histos.add(histodir + "/Photon/hDCAPosToPV", "hDCAPosToPV", kTH1F, {axisDCAtoPV}); + histos.add(histodir + "/Photon/hDCADau", "hDCADau", kTH1F, {axisDCAdau}); + histos.add(histodir + "/Photon/hPosTPCCR", "hPosTPCCR", kTH1F, {axisTPCrows}); + histos.add(histodir + "/Photon/hNegTPCCR", "hNegTPCCR", kTH1F, {axisTPCrows}); + histos.add(histodir + "/Photon/h2dPosTPCNSigmaEl", "h2dPosTPCNSigmaEl", kTH2F, {axisPt, axisTPCNSigma}); + histos.add(histodir + "/Photon/h2dNegTPCNSigmaEl", "h2dNegTPCNSigmaEl", kTH2F, {axisPt, axisTPCNSigma}); + histos.add(histodir + "/Photon/h2dPosTPCNSigmaPi", "h2dPosTPCNSigmaPi", kTH2F, {axisPt, axisTPCNSigma}); + histos.add(histodir + "/Photon/h2dNegTPCNSigmaPi", "h2dNegTPCNSigmaPi", kTH2F, {axisPt, axisTPCNSigma}); + histos.add(histodir + "/Photon/hpT", "hpT", kTH1F, {axisPt}); + histos.add(histodir + "/Photon/hY", "hY", kTH1F, {axisRapidity}); + histos.add(histodir + "/Photon/hPosEta", "hPosEta", kTH1F, {axisRapidity}); + histos.add(histodir + "/Photon/hNegEta", "hNegEta", kTH1F, {axisRapidity}); + histos.add(histodir + "/Photon/hRadius", "hRadius", kTH1F, {axisRadius}); + histos.add(histodir + "/Photon/hZ", "hZ", kTH1F, {axisZ}); + histos.add(histodir + "/Photon/h2dRZCut", "h2dRZCut", kTH2F, {axisZ, axisRadius}); + histos.add(histodir + "/Photon/h2dRZPlane", "h2dRZPlane", kTH2F, {axisZ, axisRadius}); + histos.add(histodir + "/Photon/hCosPA", "hCosPA", kTH1F, {axisCosPA}); + histos.add(histodir + "/Photon/hPsiPair", "hPsiPair", kTH1F, {axisPsiPair}); + histos.add(histodir + "/Photon/hPhi", "hPhi", kTH1F, {axisPhi}); + histos.add(histodir + "/Photon/h3dMass", "h3dMass", kTH3F, {axisCentrality, axisPt, axisPhotonMass}); + histos.add(histodir + "/Photon/hMass", "hMass", kTH1F, {axisPhotonMass}); + + histos.add(histodir + "/Lambda/hTrackCode", "hTrackCode", kTH1F, {{11, 0.5f, 11.5f}}); + histos.add(histodir + "/Lambda/hRadius", "hRadius", kTH1F, {axisRadius}); + histos.add(histodir + "/Lambda/hDCADau", "hDCADau", kTH1F, {axisDCAdau}); + histos.add(histodir + "/Lambda/hCosPA", "hCosPA", kTH1F, {axisCosPA}); + histos.add(histodir + "/Lambda/hY", "hY", kTH1F, {axisRapidity}); + histos.add(histodir + "/Lambda/hPosEta", "hPosEta", kTH1F, {axisRapidity}); + histos.add(histodir + "/Lambda/hNegEta", "hNegEta", kTH1F, {axisRapidity}); + histos.add(histodir + "/Lambda/hPosTPCCR", "hPosTPCCR", kTH1F, {axisTPCrows}); + histos.add(histodir + "/Lambda/hNegTPCCR", "hNegTPCCR", kTH1F, {axisTPCrows}); + histos.add(histodir + "/Lambda/hPosITSCls", "hPosITSCls", kTH1F, {axisNCls}); + histos.add(histodir + "/Lambda/hNegITSCls", "hNegITSCls", kTH1F, {axisNCls}); + histos.add(histodir + "/Lambda/hPosChi2PerNc", "hPosChi2PerNc", kTH1F, {axisChi2PerNcl}); + histos.add(histodir + "/Lambda/hNegChi2PerNc", "hNegChi2PerNc", kTH1F, {axisChi2PerNcl}); + histos.add(histodir + "/Lambda/hLifeTime", "hLifeTime", kTH1F, {axisLifetime}); + histos.add(histodir + "/Lambda/h2dTPCvsTOFNSigma_LambdaPr", "h2dTPCvsTOFNSigma_LambdaPr", kTH2F, {axisTPCNSigma, axisTOFNSigma}); + histos.add(histodir + "/Lambda/h2dTPCvsTOFNSigma_LambdaPi", "h2dTPCvsTOFNSigma_LambdaPi", kTH2F, {axisTPCNSigma, axisTOFNSigma}); + histos.add(histodir + "/Lambda/hLambdaDCANegToPV", "hLambdaDCANegToPV", kTH1F, {axisDCAtoPV}); + histos.add(histodir + "/Lambda/hLambdaDCAPosToPV", "hLambdaDCAPosToPV", kTH1F, {axisDCAtoPV}); + histos.add(histodir + "/Lambda/hLambdapT", "hLambdapT", kTH1F, {axisPt}); + histos.add(histodir + "/Lambda/hLambdaMass", "hLambdaMass", kTH1F, {axisLambdaMass}); + histos.add(histodir + "/Lambda/h3dLambdaMass", "h3dLambdaMass", kTH3F, {axisCentrality, axisPt, axisLambdaMass}); + histos.add(histodir + "/Lambda/h2dTPCvsTOFNSigma_ALambdaPr", "h2dTPCvsTOFNSigma_ALambdaPr", kTH2F, {axisTPCNSigma, axisTOFNSigma}); + histos.add(histodir + "/Lambda/h2dTPCvsTOFNSigma_ALambdaPi", "h2dTPCvsTOFNSigma_ALambdaPi", kTH2F, {axisTPCNSigma, axisTOFNSigma}); + histos.add(histodir + "/Lambda/hALambdaDCANegToPV", "hALambdaDCANegToPV", kTH1F, {axisDCAtoPV}); + histos.add(histodir + "/Lambda/hALambdaDCAPosToPV", "hALambdaDCAPosToPV", kTH1F, {axisDCAtoPV}); + histos.add(histodir + "/Lambda/hALambdapT", "hALambdapT", kTH1F, {axisPt}); + histos.add(histodir + "/Lambda/hAntiLambdaMass", "hAntiLambdaMass", kTH1F, {axisLambdaMass}); + histos.add(histodir + "/Lambda/h3dAntiLambdaMass", "h3dAntiLambdaMass", kTH3F, {axisCentrality, axisPt, axisLambdaMass}); + + histos.add(histodir + "/h2dArmenteros", "h2dArmenteros", kTH2F, {axisAPAlpha, axisAPQt}); + + histos.add(histodir + "/Sigma0/hMass", "hMass", kTH1F, {axisSigmaMass}); + histos.add(histodir + "/Sigma0/hPt", "hPt", kTH1F, {axisPt}); + histos.add(histodir + "/Sigma0/hY", "hY", kTH1F, {axisRapidity}); + histos.add(histodir + "/Sigma0/h3dMass", "h3dMass", kTH3F, {axisCentrality, axisPt, axisSigmaMass}); + histos.add(histodir + "/Sigma0/h3dPhotonRadiusVsMassSigma", "h3dPhotonRadiusVsMassSigma", kTH3F, {axisCentrality, axisRadius, axisSigmaMass}); + histos.add(histodir + "/Sigma0/h2dpTVsOPAngle", "h2dpTVsOPAngle", kTH2F, {axisPt, {140, 0.0f, +7.0f}}); + + histos.add(histodir + "/ASigma0/hMass", "hMass", kTH1F, {axisSigmaMass}); + histos.add(histodir + "/ASigma0/hPt", "hPt", kTH1F, {axisPt}); + histos.add(histodir + "/ASigma0/hY", "hY", kTH1F, {axisRapidity}); + histos.add(histodir + "/ASigma0/h3dMass", "h3dMass", kTH3F, {axisCentrality, axisPt, axisSigmaMass}); + histos.add(histodir + "/ASigma0/h3dPhotonRadiusVsMassSigma", "h3dPhotonRadiusVsMassSigma", kTH3F, {axisCentrality, axisRadius, axisSigmaMass}); + histos.add(histodir + "/ASigma0/h2dpTVsOPAngle", "h2dpTVsOPAngle", kTH2F, {axisPt, {140, 0.0f, +7.0f}}); + + // Process MC + if (doprocessMonteCarlo) { + histos.add(histodir + "/MC/Photon/hV0ToCollAssoc", "hV0ToCollAssoc", kTH1F, {{2, 0.0f, 2.0f}}); + histos.add(histodir + "/MC/Photon/hPt", "hPt", kTH1F, {axisPt}); + histos.add(histodir + "/MC/Photon/hMCPt", "hMCPt", kTH1F, {axisPt}); + histos.add(histodir + "/MC/Photon/h2dPosTPCNSigmaEl", "h2dPosTPCNSigmaEl", kTH2F, {axisPt, axisTPCNSigma}); + histos.add(histodir + "/MC/Photon/h2dNegTPCNSigmaEl", "h2dNegTPCNSigmaEl", kTH2F, {axisPt, axisTPCNSigma}); + histos.add(histodir + "/MC/Photon/h2dPosTPCNSigmaPi", "h2dPosTPCNSigmaPi", kTH2F, {axisPt, axisTPCNSigma}); + histos.add(histodir + "/MC/Photon/h2dNegTPCNSigmaPi", "h2dNegTPCNSigmaPi", kTH2F, {axisPt, axisTPCNSigma}); + histos.add(histodir + "/MC/Photon/h2dIRVsPt", "h2dIRVsPt", kTH2F, {axisIRBinning, axisPt}); + histos.add(histodir + "/MC/Photon/h3dPAVsIRVsPt", "h3dPAVsIRVsPt", kTH3F, {axisPA, axisIRBinning, axisPt}); + histos.add(histodir + "/MC/Photon/h2dIRVsPt_BadCollAssig", "h2dIRVsPt_BadCollAssig", kTH2F, {axisIRBinning, axisPt}); + histos.add(histodir + "/MC/Photon/h3dPAVsIRVsPt_BadCollAssig", "h3dPAVsIRVsPt_BadCollAssig", kTH3F, {axisPA, axisIRBinning, axisPt}); + + histos.add(histodir + "/MC/Lambda/hV0ToCollAssoc", "hV0ToCollAssoc", kTH1F, {{2, 0.0f, 2.0f}}); + histos.add(histodir + "/MC/Lambda/hPt", "hPt", kTH1F, {axisPt}); + histos.add(histodir + "/MC/Lambda/hMCPt", "hMCPt", kTH1F, {axisPt}); + histos.add(histodir + "/MC/Lambda/h3dTPCvsTOFNSigma_Pr", "h3dTPCvsTOFNSigma_Pr", kTH3F, {axisTPCNSigma, axisTOFNSigma, axisPt}); + histos.add(histodir + "/MC/Lambda/h3dTPCvsTOFNSigma_Pi", "h3dTPCvsTOFNSigma_Pi", kTH3F, {axisTPCNSigma, axisTOFNSigma, axisPt}); + + histos.add(histodir + "/MC/ALambda/hV0ToCollAssoc", "hV0ToCollAssoc", kTH1F, {{2, 0.0f, 2.0f}}); + histos.add(histodir + "/MC/ALambda/hPt", "hPt", kTH1F, {axisPt}); + histos.add(histodir + "/MC/ALambda/hMCPt", "hMCPt", kTH1F, {axisPt}); + histos.add(histodir + "/MC/ALambda/h3dTPCvsTOFNSigma_Pr", "h3dTPCvsTOFNSigma_Pr", kTH3F, {axisTPCNSigma, axisTOFNSigma, axisPt}); + histos.add(histodir + "/MC/ALambda/h3dTPCvsTOFNSigma_Pi", "h3dTPCvsTOFNSigma_Pi", kTH3F, {axisTPCNSigma, axisTOFNSigma, axisPt}); + + histos.add(histodir + "/MC/h2dArmenteros", "h2dArmenteros", kTH2F, {axisAPAlpha, axisAPQt}); + + histos.add(histodir + "/MC/Sigma0/hPt", "hPt", kTH1F, {axisPt}); + histos.add(histodir + "/MC/Sigma0/hMCPt", "hMCPt", kTH1F, {axisPt}); + histos.add(histodir + "/MC/Sigma0/h2dMCPtVsLambdaMCPt", "h2dMCPtVsLambdaMCPt", kTH2F, {axisPt, axisPt}); + histos.add(histodir + "/MC/Sigma0/h2dMCPtVsGammaMCPt", "h2dMCPtVsGammaMCPt", kTH2F, {axisPt, axisPt}); + histos.add(histodir + "/MC/Sigma0/hMass", "hMass", kTH1F, {axisSigmaMass}); + histos.add(histodir + "/MC/Sigma0/h3dMass", "h3dMass", kTH3F, {axisCentrality, axisPt, axisSigmaMass}); + + histos.add(histodir + "/MC/ASigma0/hPt", "hPt", kTH1F, {axisPt}); + histos.add(histodir + "/MC/ASigma0/hMCPt", "hMCPt", kTH1F, {axisPt}); + histos.add(histodir + "/MC/ASigma0/h2dMCPtVsLambdaMCPt", "h2dMCPtVsLambdaMCPt", kTH2F, {axisPt, axisPt}); + histos.add(histodir + "/MC/ASigma0/h2dMCPtVsPhotonMCPt", "h2dMCPtVsPhotonMCPt", kTH2F, {axisPt, axisPt}); + histos.add(histodir + "/MC/ASigma0/hMass", "hMass", kTH1F, {axisSigmaMass}); + histos.add(histodir + "/MC/ASigma0/h3dMass", "h3dMass", kTH3F, {axisCentrality, axisPt, axisSigmaMass}); + + // 1/pT Resolution: + if (fillpTResoQAhistos && histodir == "BeforeSel") { + histos.add(histodir + "/MC/pTReso/h3dGammaPtResoVsTPCCR", "h3dGammaPtResoVsTPCCR", kTH3F, {axisInvPt, axisDeltaPt, axisTPCrows}); + histos.add(histodir + "/MC/pTReso/h3dGammaPtResoVsTPCCR", "h3dGammaPtResoVsTPCCR", kTH3F, {axisInvPt, axisDeltaPt, axisTPCrows}); + histos.add(histodir + "/MC/pTReso/h2dGammaPtResolution", "h2dGammaPtResolution", kTH2F, {axisInvPt, axisDeltaPt}); + histos.add(histodir + "/MC/pTReso/h2dLambdaPtResolution", "h2dLambdaPtResolution", kTH2F, {axisInvPt, axisDeltaPt}); + histos.add(histodir + "/MC/pTReso/h3dLambdaPtResoVsTPCCR", "h3dLambdaPtResoVsTPCCR", kTH3F, {axisInvPt, axisDeltaPt, axisTPCrows}); + histos.add(histodir + "/MC/pTReso/h3dLambdaPtResoVsTPCCR", "h3dLambdaPtResoVsTPCCR", kTH3F, {axisInvPt, axisDeltaPt, axisTPCrows}); + histos.add(histodir + "/MC/pTReso/h2dAntiLambdaPtResolution", "h2dAntiLambdaPtResolution", kTH2F, {axisInvPt, axisDeltaPt}); + histos.add(histodir + "/MC/pTReso/h3dAntiLambdaPtResoVsTPCCR", "h3dAntiLambdaPtResoVsTPCCR", kTH3F, {axisInvPt, axisDeltaPt, axisTPCrows}); + histos.add(histodir + "/MC/pTReso/h3dAntiLambdaPtResoVsTPCCR", "h3dAntiLambdaPtResoVsTPCCR", kTH3F, {axisInvPt, axisDeltaPt, axisTPCrows}); + histos.add(histodir + "/MC/pTReso/h2dSigma0PtResolution", "h2dSigma0PtResolution", kTH2F, {axisInvPt, axisDeltaPt}); + histos.add(histodir + "/MC/pTReso/h2dAntiSigma0PtResolution", "h2dAntiSigma0PtResolution", kTH2F, {axisInvPt, axisDeltaPt}); + } + + // For background decomposition study + if (fillBkgQAhistos) { + histos.add(histodir + "/MC/BkgStudy/h2dPtVsMassSigma_All", "h2dPtVsMassSigma_All", kTH2F, {axisPt, axisSigmaMass}); + histos.add(histodir + "/MC/BkgStudy/h2dPtVsMassSigma_TrueDaughters", "h2dPtVsMassSigma_TrueDaughters", kTH2F, {axisPt, axisSigmaMass}); + histos.add(histodir + "/MC/BkgStudy/h2dTrueDaughtersMatrix", "h2dTrueDaughtersMatrix", kTHnSparseD, {{10001, -5000.5f, +5000.5f}, {10001, -5000.5f, +5000.5f}}); + histos.add(histodir + "/MC/BkgStudy/h2dPtVsMassSigma_TrueGammaFakeLambda", "h2dPtVsMassSigma_TrueGammaFakeLambda", kTH2F, {axisPt, axisSigmaMass}); + histos.add(histodir + "/MC/BkgStudy/h2dPtVsMassSigma_FakeGammaTrueLambda", "h2dPtVsMassSigma_FakeGammaTrueLambda", kTH2F, {axisPt, axisSigmaMass}); + histos.add(histodir + "/MC/BkgStudy/h2dPtVsMassSigma_FakeDaughters", "h2dPtVsMassSigma_FakeDaughters", kTH2F, {axisPt, axisSigmaMass}); + } + } + } + + // Selections + histos.add("Selection/Photon/hCandidateSel", "hCandidateSel", kTH1F, {axisCandSel}); + histos.add("Selection/Lambda/hCandidateSel", "hCandidateSel", kTH1F, {axisCandSel}); + + for (size_t i = 0; i < PhotonSels.size(); ++i) { + const auto& sel = PhotonSels[i]; + + histos.add(Form("Selection/Photon/h2d%s", sel.c_str()), ("h2d" + sel).c_str(), kTH2F, {axisPt, axisPhotonMass}); + histos.get(HIST("Selection/Photon/hCandidateSel"))->GetXaxis()->SetBinLabel(i + 1, sel.c_str()); + histos.add(Form("Selection/Sigma0/h2dPhoton%s", sel.c_str()), ("h2dPhoton" + sel).c_str(), kTH2F, {axisPt, axisSigmaMass}); + } + + for (size_t i = 0; i < LambdaSels.size(); ++i) { + const auto& sel = LambdaSels[i]; + + histos.add(Form("Selection/Lambda/h2d%s", sel.c_str()), ("h2d" + sel).c_str(), kTH2F, {axisPt, axisLambdaMass}); + histos.get(HIST("Selection/Lambda/hCandidateSel"))->GetXaxis()->SetBinLabel(i + 1, sel.c_str()); + histos.add(Form("Selection/Sigma0/h2dLambda%s", sel.c_str()), ("h2dLambda" + sel).c_str(), kTH2F, {axisPt, axisSigmaMass}); + } + } + + //__________________________________________ + template + int retrieveV0TrackCode(TV0Object const& sigma) + { + + int TrkCode = 10; // 1: TPC-only, 2: TPC+Something, 3: ITS-Only, 4: ITS+TPC + Something, 10: anything else + + if (isGamma) { + if (sigma.photonPosTrackCode() == 1 && sigma.photonNegTrackCode() == 1) + TrkCode = 1; + if ((sigma.photonPosTrackCode() != 1 && sigma.photonNegTrackCode() == 1) || (sigma.photonPosTrackCode() == 1 && sigma.photonNegTrackCode() != 1)) + TrkCode = 2; + if (sigma.photonPosTrackCode() == 3 && sigma.photonNegTrackCode() == 3) + TrkCode = 3; + if (sigma.photonPosTrackCode() == 2 || sigma.photonNegTrackCode() == 2) + TrkCode = 4; } else { - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(17, "Below min occup."); - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(18, "Above max occup."); + if (sigma.lambdaPosTrackCode() == 1 && sigma.lambdaNegTrackCode() == 1) + TrkCode = 1; + if ((sigma.lambdaPosTrackCode() != 1 && sigma.lambdaNegTrackCode() == 1) || (sigma.lambdaPosTrackCode() == 1 && sigma.lambdaNegTrackCode() != 1)) + TrkCode = 2; + if (sigma.lambdaPosTrackCode() == 3 && sigma.lambdaNegTrackCode() == 3) + TrkCode = 3; + if (sigma.lambdaPosTrackCode() == 2 || sigma.lambdaNegTrackCode() == 2) + TrkCode = 4; } - // All candidates received - histos.add("GeneralQA/hInteractionRate", "hInteractionRate", kTH1F, {axisIRBinning}); - histos.add("GeneralQA/hInteractionRatePerColl", "hInteractionRatePerColl", kTH1F, {axisIRBinning}); - histos.add("GeneralQA/hCentralityVsInteractionRate", "hCentralityVsInteractionRate", kTH2F, {axisCentrality, axisIRBinning}); - histos.add("GeneralQA/hCentralityVsInteractionRatePerColl", "hCentralityVsInteractionRatePerColl", kTH2F, {axisCentrality, axisIRBinning}); - histos.add("GeneralQA/h2dArmenterosBeforeSel", "h2dArmenterosBeforeSel", {HistType::kTH2F, {axisAPAlpha, axisAPQt}}); - histos.add("GeneralQA/h2dArmenterosAfterSel", "h2dArmenterosAfterSel", {HistType::kTH2F, {axisAPAlpha, axisAPQt}}); - histos.add("GeneralQA/hMassSigma0BeforeSel", "hMassSigma0BeforeSel", kTH1F, {axisSigmaMass}); - - // Candidates Counters - histos.add("GeneralQA/hCandidateAnalysisSelection", "hCandidateAnalysisSelection", kTH1F, {axisCandSel}); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(1, "No Sel"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(2, "Photon V0Type"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(3, "Photon DauPt"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(4, "Photon DCAToPV"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(5, "Photon DCADau"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(6, "Photon TPCCrossedRows"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(7, "Photon TPCNSigmaEl"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(8, "Photon TPCNSigmaPi"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(9, "Photon Pt"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(10, "Photon Y/Eta"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(11, "Photon Radius"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(12, "Photon RZ line"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(13, "Photon QT"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(14, "Photon Alpha"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(15, "Photon CosPA"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(16, "Photon PsiPair"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(17, "Photon Phi"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(18, "Photon Mass"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(19, "Lambda Radius"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(20, "Lambda DCADau"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(21, "Lambda QT"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(22, "Lambda Alpha"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(23, "Lambda CosPA"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(24, "Lambda Y/Eta"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(25, "Lambda TPCCrossedRows"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(26, "Lambda ITSNCls"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(27, "Lambda Lifetime"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(28, "Lambda/ALambda PID"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(29, "Lambda/ALambda DCAToPV"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(30, "Lambda/ALambda Mass"); - histos.get(HIST("GeneralQA/hCandidateAnalysisSelection"))->GetXaxis()->SetBinLabel(31, "Sigma Y"); - - // Photon Selection QA histos - histos.add("GeneralQA/hPhotonV0Type", "hPhotonV0Type", kTH1F, {{8, 0.5f, 8.5f}}); - histos.add("GeneralQA/hPhotonNegpT", "hPhotonNegpT", kTH1F, {axisPt}); - histos.add("GeneralQA/hPhotonPospT", "hPhotonPospT", kTH1F, {axisPt}); - histos.add("GeneralQA/hPhotonDCANegToPV", "hPhotonDCANegToPV", kTH1F, {axisDCAtoPV}); - histos.add("GeneralQA/hPhotonDCAPosToPV", "hPhotonDCAPosToPV", kTH1F, {axisDCAtoPV}); - histos.add("GeneralQA/hPhotonDCADau", "hPhotonDCADau", kTH1F, {axisDCAdau}); - histos.add("GeneralQA/hPhotonPosTPCCR", "hPhotonPosTPCCR", kTH1F, {axisTPCrows}); - histos.add("GeneralQA/hPhotonNegTPCCR", "hPhotonNegTPCCR", kTH1F, {axisTPCrows}); - histos.add("GeneralQA/h2dPhotonPosTPCNSigmaEl", "h2dPhotonPosTPCNSigmaEl", {HistType::kTH2F, {axisPt, {30, -15.0f, 15.0f}}}); - histos.add("GeneralQA/h2dPhotonNegTPCNSigmaEl", "h2dPhotonNegTPCNSigmaEl", {HistType::kTH2F, {axisPt, {30, -15.0f, 15.0f}}}); - histos.add("GeneralQA/h2dPhotonPosTPCNSigmaPi", "h2dPhotonPosTPCNSigmaPi", {HistType::kTH2F, {axisPt, {30, -15.0f, 15.0f}}}); - histos.add("GeneralQA/h2dPhotonNegTPCNSigmaPi", "h2dPhotonNegTPCNSigmaPi", {HistType::kTH2F, {axisPt, {30, -15.0f, 15.0f}}}); - histos.add("GeneralQA/hPhotonpT", "hPhotonpT", kTH1F, {axisPt}); - histos.add("GeneralQA/hPhotonY", "hPhotonY", kTH1F, {axisRapidity}); - histos.add("GeneralQA/hPhotonPosEta", "hPhotonPosEta", kTH1F, {axisRapidity}); - histos.add("GeneralQA/hPhotonNegEta", "hPhotonNegEta", kTH1F, {axisRapidity}); - histos.add("GeneralQA/hPhotonRadius", "hPhotonRadius", kTH1F, {axisRadius}); - histos.add("GeneralQA/hPhotonZ", "hPhotonZ", kTH1F, {{240, 0.0f, 120.0f}}); - histos.add("GeneralQA/h2dRZCut", "h2dRZCut", {HistType::kTH2F, {{240, -120.0f, 120.0f}, axisRadius}}); - histos.add("GeneralQA/h2dRZPlane", "h2dRZPlane", {HistType::kTH2F, {{240, -120.0f, 120.0f}, axisRadius}}); - histos.add("GeneralQA/h2dPhotonArmenteros", "h2dPhotonArmenteros", {HistType::kTH2F, {axisAPAlpha, axisAPQt}}); - histos.add("GeneralQA/hPhotonCosPA", "hPhotonCosPA", kTH1F, {axisCosPA}); - histos.add("GeneralQA/hPhotonPsiPair", "hPhotonPsiPair", kTH1F, {axisPsiPair}); - histos.add("GeneralQA/hPhotonPhi", "hPhotonPhi", kTH1F, {{200, 0, 2 * o2::constants::math::PI}}); - histos.add("GeneralQA/h3dPhotonMass", "h3dPhotonMass", kTH3F, {axisCentrality, axisPt, axisPhotonMass}); - - // Lambda Selection QA histos - histos.add("GeneralQA/hLambdaRadius", "hLambdaRadius", kTH1F, {axisRadius}); - histos.add("GeneralQA/hLambdaDCADau", "hLambdaDCADau", kTH1F, {axisDCAdau}); - histos.add("GeneralQA/h2dLambdaArmenteros", "h2dLambdaArmenteros", {HistType::kTH2F, {axisAPAlpha, axisAPQt}}); - histos.add("GeneralQA/hLambdaCosPA", "hLambdaCosPA", kTH1F, {axisCosPA}); - histos.add("GeneralQA/hLambdaY", "hLambdaY", kTH1F, {axisRapidity}); - histos.add("GeneralQA/hLambdaPosEta", "hLambdaPosEta", kTH1F, {axisRapidity}); - histos.add("GeneralQA/hLambdaNegEta", "hLambdaNegEta", kTH1F, {axisRapidity}); - histos.add("GeneralQA/hLambdaPosTPCCR", "hLambdaPosTPCCR", kTH1F, {axisTPCrows}); - histos.add("GeneralQA/hLambdaNegTPCCR", "hLambdaNegTPCCR", kTH1F, {axisTPCrows}); - histos.add("GeneralQA/hLambdaPosITSCls", "hLambdaPosITSCls", kTH1F, {axisNCls}); - histos.add("GeneralQA/hLambdaNegITSCls", "hLambdaNegITSCls", kTH1F, {axisNCls}); - histos.add("GeneralQA/hLambdaPosChi2PerNc", "hLambdaPosChi2PerNc", kTH1F, {axisChi2PerNcl}); - histos.add("GeneralQA/hLambdaNegChi2PerNc", "hLambdaNegChi2PerNc", kTH1F, {axisChi2PerNcl}); - histos.add("GeneralQA/hLambdaLifeTime", "hLambdaLifeTime", kTH1F, {axisLifetime}); - - histos.add("GeneralQA/h2dTPCvsTOFNSigma_LambdaPr", "h2dTPCvsTOFNSigma_LambdaPr", {HistType::kTH2F, {axisTPCNSigma, axisTOFNSigma}}); - histos.add("GeneralQA/h2dTPCvsTOFNSigma_LambdaPi", "h2dTPCvsTOFNSigma_LambdaPi", {HistType::kTH2F, {axisTPCNSigma, axisTOFNSigma}}); - histos.add("GeneralQA/hLambdaDCANegToPV", "hLambdaDCANegToPV", kTH1F, {axisDCAtoPV}); - histos.add("GeneralQA/hLambdaDCAPosToPV", "hLambdaDCAPosToPV", kTH1F, {axisDCAtoPV}); - histos.add("GeneralQA/h3dLambdaMass", "h3dLambdaMass", kTH3F, {axisCentrality, axisPt, axisLambdaMass}); - histos.add("GeneralQA/h2dTPCvsTOFNSigma_ALambdaPr", "h2dTPCvsTOFNSigma_ALambdaPr", {HistType::kTH2F, {axisTPCNSigma, axisTOFNSigma}}); - histos.add("GeneralQA/h2dTPCvsTOFNSigma_ALambdaPi", "h2dTPCvsTOFNSigma_ALambdaPi", {HistType::kTH2F, {axisTPCNSigma, axisTOFNSigma}}); - histos.add("GeneralQA/hALambdaDCANegToPV", "hALambdaDCANegToPV", kTH1F, {axisDCAtoPV}); - histos.add("GeneralQA/hALambdaDCAPosToPV", "hALambdaDCAPosToPV", kTH1F, {axisDCAtoPV}); - histos.add("GeneralQA/h3dAntiLambdaMass", "h3dAntiLambdaMass", kTH3F, {axisCentrality, axisPt, axisLambdaMass}); - - histos.add("GeneralQA/hPhotonMassSelected", "hPhotonMassSelected", kTH1F, {axisPhotonMass}); - histos.add("GeneralQA/hLambdaMassSelected", "hLambdaMassSelected", kTH1F, {axisLambdaMass}); - histos.add("GeneralQA/hAntiLambdaMassSelected", "hAntiLambdaMassSelected", kTH1F, {axisLambdaMass}); - - histos.add("GeneralQA/hSigmaY", "hSigmaY", kTH1F, {axisRapidity}); - histos.add("GeneralQA/hSigmaOPAngle", "hSigmaOPAngle", kTH1F, {{140, 0.0f, +7.0f}}); - - // Specific sigma0 QA - histos.add("SigmaSelQA/h2dPhotonV0Type", "h2dPhotonV0Type", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaSelQA/h2dPhotonMass", "h2dPhotonMass", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaSelQA/h2dPhotonDaupT", "h2dPhotonDaupT", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaSelQA/h2dPhotonDCADauToPV", "h2dPhotonDCADauToPV", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaSelQA/h2dPhotonDCADau", "h2dPhotonDCADau", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaSelQA/h2dPhotonDauTPCCR", "h2dPhotonDauTPCCR", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaSelQA/h2dPhotonTPCNSigmaEl", "h2dPhotonTPCNSigmaEl", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaSelQA/h2dPhotonpT", "h2dPhotonpT", {HistType::kTH2F, {axisPt, axisSigmaMass}}); // - histos.add("SigmaSelQA/h2dPhotonY", "h2dPhotonY", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaSelQA/h2dPhotonRadius", "h2dPhotonRadius", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaSelQA/h2dRZCut", "h2dRZCut", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaSelQA/h2dPhotonArmenteros", "h2dPhotonArmenteros", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaSelQA/h2dPhotonCosPA", "h2dPhotonCosPA", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaSelQA/h2dPhotonPsiPair", "h2dPhotonPsiPair", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaSelQA/h2dLambdaRadius", "h2dLambdaRadius", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaSelQA/h2dLambdaDCADau", "h2dLambdaDCADau", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaSelQA/h2dLambdaArmenteros", "h2dLambdaArmenteros", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaSelQA/h2dLambdaCosPA", "h2dLambdaCosPA", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaSelQA/h2dLambdaY", "h2dLambdaY", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaSelQA/h2dLambdaDauTPCCR", "h2dLambdaDauTPCCR", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaSelQA/h2dLambdaDauITSCls", "h2dLambdaDauITSCls", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaSelQA/h2dLambdaLifeTime", "h2dLambdaLifeTime", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaSelQA/h2dTPCvsTOFNSigma_Lambda", "h2dTPCvsTOFNSigma_Lambda", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaSelQA/h2dLambdaDCADauToPV", "h2dLambdaDCADauToPV", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaSelQA/h2dLambdaMass", "h2dLambdaMass", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaSelQA/h2dTPCvsTOFNSigma_ALambda", "h2dTPCvsTOFNSigma_ALambda", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaSelQA/h2dALambdaDCADauToPV", "h2dALambdaDCADauToPV", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaSelQA/h2dAntiLambdaMass", "h2dAntiLambdaMass", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - histos.add("SigmaSelQA/h2dSigmaY", "h2dSigmaY", {HistType::kTH2F, {axisPt, axisSigmaMass}}); - - // Specific photon QA - histos.add("PhotonSelQA/h2dPhotonBaseline", "h2dPhotonBaseline", {HistType::kTH2F, {axisPt, axisPhotonMass}}); - histos.add("PhotonSelQA/h2dPhotonV0Type", "h2dPhotonV0Type", {HistType::kTH2F, {axisPt, axisPhotonMass}}); - histos.add("PhotonSelQA/h2dPhotonMass", "h2dPhotonMass", {HistType::kTH2F, {axisPt, axisPhotonMass}}); - histos.add("PhotonSelQA/h2dPhotonDaupT", "h2dPhotonDaupT", {HistType::kTH2F, {axisPt, axisPhotonMass}}); - histos.add("PhotonSelQA/h2dPhotonDCADauToPV", "h2dPhotonDCADauToPV", {HistType::kTH2F, {axisPt, axisPhotonMass}}); - histos.add("PhotonSelQA/h2dPhotonDCADau", "h2dPhotonDCADau", {HistType::kTH2F, {axisPt, axisPhotonMass}}); - histos.add("PhotonSelQA/h2dPhotonDauTPCCR", "h2dPhotonDauTPCCR", {HistType::kTH2F, {axisPt, axisPhotonMass}}); - histos.add("PhotonSelQA/h2dPhotonTPCNSigmaEl", "h2dPhotonTPCNSigmaEl", {HistType::kTH2F, {axisPt, axisPhotonMass}}); - histos.add("PhotonSelQA/h2dPhotonpT", "h2dPhotonpT", {HistType::kTH2F, {axisPt, axisPhotonMass}}); // - histos.add("PhotonSelQA/h2dPhotonY", "h2dPhotonY", {HistType::kTH2F, {axisPt, axisPhotonMass}}); - histos.add("PhotonSelQA/h2dPhotonRadius", "h2dPhotonRadius", {HistType::kTH2F, {axisPt, axisPhotonMass}}); - histos.add("PhotonSelQA/h2dRZCut", "h2dRZCut", {HistType::kTH2F, {axisPt, axisPhotonMass}}); - histos.add("PhotonSelQA/h2dPhotonArmenteros", "h2dPhotonArmenteros", {HistType::kTH2F, {axisPt, axisPhotonMass}}); - histos.add("PhotonSelQA/h2dPhotonCosPA", "h2dPhotonCosPA", {HistType::kTH2F, {axisPt, axisPhotonMass}}); - histos.add("PhotonSelQA/h2dPhotonPsiPair", "h2dPhotonPsiPair", {HistType::kTH2F, {axisPt, axisPhotonMass}}); - histos.add("PhotonSelQA/h2dPhotonPhi", "h2dPhotonPhi", {HistType::kTH2F, {axisPt, axisPhotonMass}}); - - // Specific Lambda/ALambda QA - histos.add("LambdaSelQA/h2dLambdaBaseline", "h2dLambdaBaseline", {HistType::kTH2F, {axisPt, axisLambdaMass}}); - histos.add("LambdaSelQA/h2dLambdaRadius", "h2dLambdaRadius", {HistType::kTH2F, {axisPt, axisLambdaMass}}); - histos.add("LambdaSelQA/h2dLambdaDCADau", "h2dLambdaDCADau", {HistType::kTH2F, {axisPt, axisLambdaMass}}); - histos.add("LambdaSelQA/h2dLambdaArmenteros", "h2dLambdaArmenteros", {HistType::kTH2F, {axisPt, axisLambdaMass}}); - histos.add("LambdaSelQA/h2dLambdaCosPA", "h2dLambdaCosPA", {HistType::kTH2F, {axisPt, axisLambdaMass}}); - histos.add("LambdaSelQA/h2dLambdaY", "h2dLambdaY", {HistType::kTH2F, {axisPt, axisLambdaMass}}); - histos.add("LambdaSelQA/h2dLambdaDauTPCCR", "h2dLambdaDauTPCCR", {HistType::kTH2F, {axisPt, axisLambdaMass}}); - histos.add("LambdaSelQA/h2dLambdaDauITSCls", "h2dLambdaDauITSCls", {HistType::kTH2F, {axisPt, axisLambdaMass}}); - histos.add("LambdaSelQA/h2dLambdaLifeTime", "h2dLambdaLifeTime", {HistType::kTH2F, {axisPt, axisLambdaMass}}); - histos.add("LambdaSelQA/h2dTPCvsTOFNSigma_Lambda", "h2dTPCvsTOFNSigma_Lambda", {HistType::kTH2F, {axisPt, axisLambdaMass}}); - histos.add("LambdaSelQA/h2dLambdaDCADauToPV", "h2dLambdaDCADauToPV", {HistType::kTH2F, {axisPt, axisLambdaMass}}); - histos.add("LambdaSelQA/h2dLambdaMass", "h2dLambdaMass", {HistType::kTH2F, {axisPt, axisLambdaMass}}); - - // For Signal Extraction - - // Sigma0 - histos.add("Sigma0/h3dMassSigma0", "h3dMassSigma0", kTH3F, {axisCentrality, axisPt, axisSigmaMass}); - histos.add("Sigma0/h3dPhotonRadiusVsMassSigma0", "h3dPhotonRadiusVsMassSigma0", kTH3F, {axisCentrality, axisRadius, axisSigmaMass}); - histos.add("Sigma0/hMassSigma0", "hMassSigma0", kTH1F, {axisSigmaMass}); - histos.add("Sigma0/hPtSigma0", "hPtSigma0", kTH1F, {axisPt}); - histos.add("Sigma0/hRapiditySigma0", "hRapiditySigma0", kTH1F, {axisRapidity}); - - // AntiSigma0 - histos.add("AntiSigma0/h3dMassAntiSigma0", "h3dMassAntiSigma0", kTH3F, {axisCentrality, axisPt, axisSigmaMass}); - histos.add("AntiSigma0/h3dPhotonRadiusVsMassAntiSigma0", "h3dPhotonRadiusVsMassAntiSigma0", kTH3F, {axisCentrality, axisRadius, axisSigmaMass}); - histos.add("AntiSigma0/hMassAntiSigma0", "hMassAntiSigma0", kTH1F, {axisSigmaMass}); - histos.add("AntiSigma0/hPtAntiSigma0", "hPtAntiSigma0", kTH1F, {axisPt}); - histos.add("AntiSigma0/hRapidityAntiSigma0", "hRapidityAntiSigma0", kTH1F, {axisRapidity}); - - if (fProcessMonteCarlo) { - - // Kinematic - histos.add("MC/h3dMassSigma0", "h3dMassSigma0", kTH3F, {axisCentrality, axisPt, axisSigmaMass}); - histos.add("MC/h3dMassAntiSigma0", "h3dMassSigma0", kTH3F, {axisCentrality, axisPt, axisSigmaMass}); - histos.add("MC/h3dMassAllSigma0sBeforesel", "h3dMassAllSigma0sBeforesel", kTH3F, {axisCentrality, axisPt, axisSigmaMass}); - histos.add("MC/h2dArmenterosBeforeSel", "h2dArmenterosBeforeSel", {HistType::kTH2F, {axisAPAlpha, axisAPQt}}); - histos.add("MC/h2dArmenterosAfterSel", "h2dArmenterosAfterSel", {HistType::kTH2F, {axisAPAlpha, axisAPQt}}); - - // Sigma0 QA - histos.add("MC/hMassSigma0BeforeSel", "hMassSigma0BeforeSel", kTH1F, {axisSigmaMass}); - histos.add("MC/hPtSigma0BeforeSel", "hPtSigma0BeforeSel", kTH1F, {axisPt}); - histos.add("MC/hMassSigma0", "hMassSigma0", kTH1F, {axisSigmaMass}); - histos.add("MC/hPtSigma0", "hPtSigma0", kTH1F, {axisPt}); - histos.add("MC/hMassAntiSigma0", "hMassAntiSigma0", kTH1F, {axisSigmaMass}); - histos.add("MC/hPtAntiSigma0", "hPtAntiSigma0", kTH1F, {axisPt}); - - // For background decomposition - histos.add("MC/h2dPtVsMassSigma_SignalBkg", "h2dPtVsMassSigma_SignalBkg", kTH2D, {axisPt, axisSigmaMass}); - histos.add("MC/h2dPtVsMassSigma_SignalOnly", "h2dPtVsMassSigma_SignalOnly", kTH2D, {axisPt, axisSigmaMass}); - histos.add("MC/h2dPtVsMassSigma_TrueDaughters", "h2dPtVsMassSigma_TrueDaughters", kTH2D, {axisPt, axisSigmaMass}); - histos.add("MC/h2dPtVsMassSigma_TrueGammaFakeLambda", "h2dPtVsMassSigma_TrueGammaFakeLambda", kTH2D, {axisPt, axisSigmaMass}); - histos.add("MC/h2dPtVsMassSigma_FakeGammaTrueLambda", "h2dPtVsMassSigma_FakeGammaTrueLambda", kTH2D, {axisPt, axisSigmaMass}); - histos.add("MC/h2dPtVsMassSigma_FakeDaughters", "h2dPtVsMassSigma_FakeDaughters", kTH2D, {axisPt, axisSigmaMass}); - histos.add("MC/h2dTrueDaughtersMatrix", "h2dTrueDaughtersMatrix", kTHnSparseD, {{10001, -5000.5f, +5000.5f}, {10001, -5000.5f, +5000.5f}}); - - // For new selection studies: - //// Opening angle between daughters - histos.add("MC/h2dPtVsOPAngle_SignalOnly", "h2dPtVsOPAngle_SignalOnly", kTH2D, {axisPt, {140, 0.0f, +7.0f}}); - histos.add("MC/h2dPtVsOPAngle_TrueDaughters", "h2dPtVsOPAngle_TrueDaughters", kTH2D, {axisPt, {140, 0.0f, +7.0f}}); - histos.add("MC/h2dPtVsMassSigma_AfterOPAngleSel", "h2dPtVsMassSigma_AfterOPAngleSel", kTH2D, {axisPt, axisSigmaMass}); - - // For efficiency/Purity studies - // Before any selection - histos.add("MC/hPtTrueLambda_BeforeSel", "hPtTrueLambda_BeforeSel", kTH1F, {axisPt}); // Signal only - histos.add("MC/hPtTrueAntiLambda_BeforeSel", "hPtTrueAntiLambda_BeforeSel", kTH1F, {axisPt}); // Signal only - histos.add("MC/hPtTrueGamma_BeforeSel", "hPtTrueGamma_BeforeSel", kTH1F, {axisPt}); // Signal only - histos.add("MC/hPtTrueSigma_BeforeSel", "hPtTrueSigma_BeforeSel", kTH1F, {axisPt}); // Signal only - histos.add("MC/hPtTrueAntiSigma_BeforeSel", "hPtTrueAntiSigma_BeforeSel", kTH1F, {axisPt}); // Signal only - histos.add("MC/hPtLambdaCand_BeforeSel", "hPtLambdaCand_BeforeSel", kTH1F, {axisPt}); // Bkg + Signal - histos.add("MC/hPtGammaCand_BeforeSel", "hPtGammaCand_BeforeSel", kTH1F, {axisPt}); // Bkg + Signal - histos.add("MC/hPtSigmaCand_BeforeSel", "hPtGammaCand_BeforeSel", kTH1F, {axisPt}); // Bkg + Signal - - // After analysis selections - histos.add("MC/hPtTrueLambda_AfterSel", "hPtTrueLambda_AfterSel", kTH1F, {axisPt}); // Signal only - histos.add("MC/hPtTrueAntiLambda_AfterSel", "hPtTrueAntiLambda_AfterSel", kTH1F, {axisPt}); // Signal only - histos.add("MC/hPtTrueGamma_AfterSel", "hPtTrueGamma_AfterSel", kTH1F, {axisPt}); // Signal only - histos.add("MC/hPtTrueSigma_AfterSel", "hPtTrueSigma_AfterSel", kTH1F, {axisPt}); // Signal only - - histos.add("MC/hPtLambdaCand_AfterSel", "hPtLambdaCand_AfterSel", kTH1F, {axisPt}); - histos.add("MC/hPtGammaCand_AfterSel", "hPtGammaCand_AfterSel", kTH1F, {axisPt}); - histos.add("MC/hPtSigmaCand_AfterSel", "hPtSigmaCand_AfterSel", kTH1F, {axisPt}); - - // TPC vs TOF N Sigmas distributions - histos.add("MC/h3dTPCvsTOFNSigma_LambdaPr", "h3dTPCvsTOFNSigma_LambdaPr", kTH3F, {axisTPCNSigma, axisTOFNSigma, axisPt}); - histos.add("MC/h3dTPCvsTOFNSigma_LambdaPi", "h3dTPCvsTOFNSigma_LambdaPi", kTH3F, {axisTPCNSigma, axisTOFNSigma, axisPt}); - histos.add("MC/h3dTPCvsTOFNSigma_TrueLambdaPr", "h3dTPCvsTOFNSigma_TrueLambdaPr", kTH3F, {axisTPCNSigma, axisTOFNSigma, axisPt}); - histos.add("MC/h3dTPCvsTOFNSigma_TrueLambdaPi", "h3dTPCvsTOFNSigma_TrueLambdaPi", kTH3F, {axisTPCNSigma, axisTOFNSigma, axisPt}); - histos.add("MC/h3dTPCvsTOFNSigma_TrueALambdaPr", "h3dTPCvsTOFNSigma_TrueALambdaPr", kTH3F, {axisTPCNSigma, axisTOFNSigma, axisPt}); - histos.add("MC/h3dTPCvsTOFNSigma_TrueALambdaPi", "h3dTPCvsTOFNSigma_TrueALambdaPi", kTH3F, {axisTPCNSigma, axisTOFNSigma, axisPt}); - - // QA of PID selections: - //// TPC PID - histos.add("MC/hPtTrueLambda_passedTPCPID", "hPtTrueLambda_passedTPCPID", kTH1F, {axisPt}); - histos.add("MC/hPtLambdaCandidates_passedTPCPID", "hPtLambdaCandidates_passedTPCPID", kTH1F, {axisPt}); - - //// TOF PID - histos.add("MC/hPtTrueLambda_passedTOFPID", "hPtTrueLambda_passedTOFPID", kTH1F, {axisPt}); - histos.add("MC/hPtLambdaCandidates_passedTOFPID", "hPtLambdaCandidates_passedTOFPID", kTH1F, {axisPt}); - - //// TPC+TOF PID - histos.add("MC/hPtTrueLambda_passedTPCTOFPID", "hPtTrueLambda_passedTPCTOFPID", kTH1F, {axisPt}); - histos.add("MC/hPtLambdaCandidates_passedTPCTOFPID", "hPtLambdaCandidates_passedTPCTOFPID", kTH1F, {axisPt}); - - // 1/pT Resolution: - histos.add("MC/h2dLambdaPtResolution", "h2dLambdaPtResolution", kTH2D, {axisInvPt, axisDeltaPt}); - histos.add("MC/h2dAntiLambdaPtResolution", "h2dAntiLambdaPtResolution", kTH2D, {axisInvPt, axisDeltaPt}); - histos.add("MC/h2dGammaPtResolution", "h2dGammaPtResolution", kTH2D, {axisInvPt, axisDeltaPt}); - histos.add("MC/h2dSigma0PtResolution", "h2dSigma0PtResolution", kTH2D, {axisInvPt, axisDeltaPt}); - histos.add("MC/h2dAntiSigma0PtResolution", "h2dAntiSigma0PtResolution", kTH2D, {axisInvPt, axisDeltaPt}); - histos.add("MC/h3dLambdaPtResoVsTPCCR", "h3dLambdaPtResoVsTPCCR", kTH3F, {axisInvPt, axisDeltaPt, {320, -160.0f, 160.0f}}); - histos.add("MC/h3dAntiLambdaPtResoVsTPCCR", "h3dAntiLambdaPtResoVsTPCCR", kTH3F, {axisInvPt, axisDeltaPt, {320, -160.0f, 160.0f}}); - histos.add("MC/h3dGammaPtResoVsTPCCR", "h3dGammaPtResoVsTPCCR", kTH3F, {axisInvPt, axisDeltaPt, {320, -160.0f, 160.0f}}); - - // pTMC info: - histos.add("MC/h2dSigmaMCPtVsLambdaMCPt", "h2dSigmaMCPtVsLambdaMCPt", kTH2D, {axisPt, axisPt}); - histos.add("MC/h2dSigmaMCPtVsGammaMCPt", "h2dSigmaMCPtVsGammaMCPt", kTH2D, {axisPt, axisPt}); + return TrkCode; + } + + template + void getpTResolution(TV0Object const& sigma) + { + + //_______________________________________ + // Gamma MC association + if (sigma.photonCandPDGCode() == 22) { + if (sigma.photonMCPt() > 0) { + histos.fill(HIST("BeforeSel/MC/pTReso/h3dGammaPtResoVsTPCCR"), 1.f / sigma.lambdaMCPt(), 1.f / sigma.lambdaPt() - 1.f / sigma.lambdaMCPt(), -1 * sigma.photonNegTPCCrossedRows()); // 1/pT resolution + histos.fill(HIST("BeforeSel/MC/pTReso/h3dGammaPtResoVsTPCCR"), 1.f / sigma.lambdaMCPt(), 1.f / sigma.lambdaPt() - 1.f / sigma.lambdaMCPt(), sigma.photonPosTPCCrossedRows()); // 1/pT resolution + histos.fill(HIST("BeforeSel/MC/pTReso/h2dGammaPtResolution"), 1.f / sigma.photonMCPt(), 1.f / sigma.photonPt() - 1.f / sigma.photonMCPt()); // pT resolution + } + } + + //_______________________________________ + // Lambda MC association + if (sigma.lambdaCandPDGCode() == 3122) { + if (sigma.lambdaMCPt() > 0) { + histos.fill(HIST("BeforeSel/MC/pTReso/h2dLambdaPtResolution"), 1.f / sigma.lambdaMCPt(), 1.f / sigma.lambdaPt() - 1.f / sigma.lambdaMCPt()); // 1/pT resolution + histos.fill(HIST("BeforeSel/MC/pTReso/h3dLambdaPtResoVsTPCCR"), 1.f / sigma.lambdaMCPt(), 1.f / sigma.lambdaPt() - 1.f / sigma.lambdaMCPt(), -1 * sigma.lambdaNegTPCCrossedRows()); // 1/pT resolution + histos.fill(HIST("BeforeSel/MC/pTReso/h3dLambdaPtResoVsTPCCR"), 1.f / sigma.lambdaMCPt(), 1.f / sigma.lambdaPt() - 1.f / sigma.lambdaMCPt(), sigma.lambdaPosTPCCrossedRows()); // 1/pT resolution + } + } + + //_______________________________________ + // AntiLambda MC association + if (sigma.lambdaCandPDGCode() == -3122) { + if (sigma.lambdaMCPt() > 0) { + histos.fill(HIST("BeforeSel/MC/pTReso/h2dAntiLambdaPtResolution"), 1.f / sigma.lambdaMCPt(), 1.f / sigma.lambdaPt() - 1.f / sigma.lambdaMCPt()); // pT resolution + histos.fill(HIST("BeforeSel/MC/pTReso/h3dAntiLambdaPtResoVsTPCCR"), 1.f / sigma.lambdaMCPt(), 1.f / sigma.lambdaPt() - 1.f / sigma.lambdaMCPt(), -1 * sigma.lambdaNegTPCCrossedRows()); // 1/pT resolution + histos.fill(HIST("BeforeSel/MC/pTReso/h3dAntiLambdaPtResoVsTPCCR"), 1.f / sigma.lambdaMCPt(), 1.f / sigma.lambdaPt() - 1.f / sigma.lambdaMCPt(), sigma.lambdaPosTPCCrossedRows()); // 1/pT resolution + } + } + + //_______________________________________ + // Sigma and AntiSigma MC association + if (sigma.isSigma()) { + if (sigma.sigmaMCPt() > 0) + histos.fill(HIST("BeforeSel/MC/pTReso/h2dSigma0PtResolution"), 1.f / sigma.sigmaMCPt(), 1.f / sigma.sigmapT() - 1.f / sigma.sigmaMCPt()); // pT resolution + } + if (sigma.isAntiSigma()) { + if (sigma.sigmaMCPt() > 0) + histos.fill(HIST("BeforeSel/MC/pTReso/h2dAntiSigma0PtResolution"), 1.f / sigma.sigmaMCPt(), 1.f / sigma.sigmapT() - 1.f / sigma.sigmaMCPt()); // pT resolution } } - template - bool IsEventAccepted(TCollision collision) - // check whether the collision passes our collision selections + // To save histograms for background analysis + template + void runBkgAnalysis(TV0Object const& sigma) { - histos.fill(HIST("hEventSelection"), 0. /* all collisions */); - if (eventSelections.requireSel8 && !collision.sel8()) { - return false; + // Check whether it is before or after selections + static constexpr std::string_view MainDir[] = {"BeforeSel", "AfterSel"}; + + bool fIsSigma = sigma.isSigma(); + bool fIsAntiSigma = sigma.isAntiSigma(); + int PhotonPDGCode = sigma.photonCandPDGCode(); + int PhotonPDGCodeMother = sigma.photonCandPDGCodeMother(); + int LambdaPDGCode = sigma.lambdaCandPDGCode(); + int LambdaPDGCodeMother = sigma.lambdaCandPDGCodeMother(); + float sigmapT = sigma.sigmapT(); + float sigmaMass = sigma.sigmaMass(); + + histos.fill(HIST(MainDir[mode]) + HIST("/MC/BkgStudy/h2dPtVsMassSigma_All"), sigmapT, sigmaMass); + + //_______________________________________ + // Real Gamma x Real Lambda - but not from the same sigma0/antisigma0! + if ((PhotonPDGCode == 22) && ((LambdaPDGCode == 3122) || (LambdaPDGCode == -3122)) && (!fIsSigma && !fIsAntiSigma)) { + histos.fill(HIST(MainDir[mode]) + HIST("/MC/BkgStudy/h2dPtVsMassSigma_TrueDaughters"), sigmapT, sigmaMass); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/BkgStudy/h2dTrueDaughtersMatrix"), LambdaPDGCodeMother, PhotonPDGCodeMother); } - histos.fill(HIST("hEventSelection"), 1 /* sel8 collisions */); - if (eventSelections.requireTriggerTVX && !collision.selection_bit(aod::evsel::kIsTriggerTVX)) { - return false; + + //_______________________________________ + // Real Gamma x fake Lambda + if ((PhotonPDGCode == 22) && (LambdaPDGCode != 3122) && (LambdaPDGCode != -3122)) + histos.fill(HIST(MainDir[mode]) + HIST("/MC/BkgStudy/h2dPtVsMassSigma_TrueGammaFakeLambda"), sigmapT, sigmaMass); + + //_______________________________________ + // Fake Gamma x Real Lambda + if ((PhotonPDGCode != 22) && ((LambdaPDGCode == 3122) || (LambdaPDGCode == -3122))) + histos.fill(HIST(MainDir[mode]) + HIST("/MC/BkgStudy/h2dPtVsMassSigma_FakeGammaTrueLambda"), sigmapT, sigmaMass); + + //_______________________________________ + // Fake Gamma x Fake Lambda + if ((PhotonPDGCode != 22) && (LambdaPDGCode != 3122) && (LambdaPDGCode != -3122)) + histos.fill(HIST(MainDir[mode]) + HIST("/MC/BkgStudy/h2dPtVsMassSigma_FakeDaughters"), sigmapT, sigmaMass); + } + + template + void fillQAHistos(TV0Object const& sigma) + { + + // Check whether it is before or after selections + // static std::string main_dir; + // main_dir = IsBeforeSel ? "BeforeSel" : "AfterSel"; + static constexpr std::string_view MainDir[] = {"BeforeSel", "AfterSel"}; + + // Get V0trackCode + int GammaTrkCode = retrieveV0TrackCode(sigma); + int LambdaTrkCode = retrieveV0TrackCode(sigma); + + float photonRZLineCut = TMath::Abs(sigma.photonZconv()) * TMath::Tan(2 * TMath::ATan(TMath::Exp(-PhotonMaxDauEta))) - PhotonLineCutZ0; + //_______________________________________ + // Photon + histos.fill(HIST(MainDir[mode]) + HIST("/Photon/hTrackCode"), GammaTrkCode); + histos.fill(HIST(MainDir[mode]) + HIST("/Photon/hV0Type"), sigma.photonV0Type()); + histos.fill(HIST(MainDir[mode]) + HIST("/Photon/hNegpT"), sigma.photonNegPt()); + histos.fill(HIST(MainDir[mode]) + HIST("/Photon/hPospT"), sigma.photonPosPt()); + histos.fill(HIST(MainDir[mode]) + HIST("/Photon/hDCANegToPV"), sigma.photonDCANegPV()); + histos.fill(HIST(MainDir[mode]) + HIST("/Photon/hDCAPosToPV"), sigma.photonDCAPosPV()); + histos.fill(HIST(MainDir[mode]) + HIST("/Photon/hDCADau"), sigma.photonDCADau()); + histos.fill(HIST(MainDir[mode]) + HIST("/Photon/hPosTPCCR"), sigma.photonPosTPCCrossedRows()); + histos.fill(HIST(MainDir[mode]) + HIST("/Photon/hNegTPCCR"), sigma.photonNegTPCCrossedRows()); + histos.fill(HIST(MainDir[mode]) + HIST("/Photon/h2dPosTPCNSigmaEl"), sigma.photonPosPt(), sigma.photonPosTPCNSigmaEl()); + histos.fill(HIST(MainDir[mode]) + HIST("/Photon/h2dNegTPCNSigmaEl"), sigma.photonNegPt(), sigma.photonNegTPCNSigmaEl()); + histos.fill(HIST(MainDir[mode]) + HIST("/Photon/h2dPosTPCNSigmaPi"), sigma.photonPosPt(), sigma.photonPosTPCNSigmaPi()); + histos.fill(HIST(MainDir[mode]) + HIST("/Photon/h2dNegTPCNSigmaPi"), sigma.photonNegPt(), sigma.photonNegTPCNSigmaPi()); + histos.fill(HIST(MainDir[mode]) + HIST("/Photon/hpT"), sigma.photonPt()); + histos.fill(HIST(MainDir[mode]) + HIST("/Photon/hY"), sigma.photonY()); + histos.fill(HIST(MainDir[mode]) + HIST("/Photon/hPosEta"), sigma.photonPosEta()); + histos.fill(HIST(MainDir[mode]) + HIST("/Photon/hNegEta"), sigma.photonNegEta()); + histos.fill(HIST(MainDir[mode]) + HIST("/Photon/hRadius"), sigma.photonRadius()); + histos.fill(HIST(MainDir[mode]) + HIST("/Photon/hZ"), sigma.photonZconv()); + histos.fill(HIST(MainDir[mode]) + HIST("/Photon/h2dRZCut"), sigma.photonRadius(), photonRZLineCut); + histos.fill(HIST(MainDir[mode]) + HIST("/Photon/h2dRZPlane"), sigma.photonZconv(), sigma.photonRadius()); + histos.fill(HIST(MainDir[mode]) + HIST("/Photon/hCosPA"), sigma.photonCosPA()); + histos.fill(HIST(MainDir[mode]) + HIST("/Photon/hPsiPair"), sigma.photonPsiPair()); + histos.fill(HIST(MainDir[mode]) + HIST("/Photon/hPhi"), sigma.photonPhi()); + histos.fill(HIST(MainDir[mode]) + HIST("/Photon/h3dMass"), sigma.sigmaCentrality(), sigma.photonPt(), sigma.photonMass()); + histos.fill(HIST(MainDir[mode]) + HIST("/Photon/hMass"), sigma.photonMass()); + + //_______________________________________ + // Lambdas + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/hTrackCode"), LambdaTrkCode); + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/hRadius"), sigma.lambdaRadius()); + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/hDCADau"), sigma.lambdaDCADau()); + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/hCosPA"), sigma.lambdaCosPA()); + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/hY"), sigma.lambdaY()); + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/hPosEta"), sigma.lambdaPosEta()); + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/hNegEta"), sigma.lambdaNegEta()); + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/hPosTPCCR"), sigma.lambdaPosTPCCrossedRows()); + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/hNegTPCCR"), sigma.lambdaNegTPCCrossedRows()); + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/hPosITSCls"), sigma.lambdaPosITSCls()); + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/hNegITSCls"), sigma.lambdaNegITSCls()); + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/hPosChi2PerNc"), sigma.lambdaPosChi2PerNcl()); + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/hNegChi2PerNc"), sigma.lambdaNegChi2PerNcl()); + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/hLifeTime"), sigma.lambdaLifeTime()); + + //_______________________________________ + // Sigmas and Lambdas + histos.fill(HIST(MainDir[mode]) + HIST("/h2dArmenteros"), sigma.photonAlpha(), sigma.photonQt()); + histos.fill(HIST(MainDir[mode]) + HIST("/h2dArmenteros"), sigma.lambdaAlpha(), sigma.lambdaQt()); + + if (sigma.lambdaAlpha() > 0) { + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/h2dTPCvsTOFNSigma_LambdaPr"), sigma.lambdaPosPrTPCNSigma(), sigma.lambdaPrTOFNSigma()); + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/h2dTPCvsTOFNSigma_LambdaPi"), sigma.lambdaNegPiTPCNSigma(), sigma.lambdaPiTOFNSigma()); + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/hLambdaDCANegToPV"), sigma.lambdaDCANegPV()); + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/hLambdaDCAPosToPV"), sigma.lambdaDCAPosPV()); + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/hLambdapT"), sigma.lambdaPt()); + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/hLambdaMass"), sigma.lambdaMass()); + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/h3dLambdaMass"), sigma.sigmaCentrality(), sigma.lambdaPt(), sigma.lambdaMass()); + + histos.fill(HIST(MainDir[mode]) + HIST("/Sigma0/hMass"), sigma.sigmaMass()); + histos.fill(HIST(MainDir[mode]) + HIST("/Sigma0/hPt"), sigma.sigmapT()); + histos.fill(HIST(MainDir[mode]) + HIST("/Sigma0/hY"), sigma.sigmaRapidity()); + histos.fill(HIST(MainDir[mode]) + HIST("/Sigma0/h3dMass"), sigma.sigmaCentrality(), sigma.sigmapT(), sigma.sigmaMass()); + histos.fill(HIST(MainDir[mode]) + HIST("/Sigma0/h3dPhotonRadiusVsMassSigma"), sigma.sigmaCentrality(), sigma.photonRadius(), sigma.sigmaMass()); + histos.fill(HIST(MainDir[mode]) + HIST("/Sigma0/h2dpTVsOPAngle"), sigma.sigmapT(), sigma.sigmaOPAngle()); + } else { + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/h2dTPCvsTOFNSigma_ALambdaPr"), sigma.lambdaNegPrTPCNSigma(), sigma.aLambdaPrTOFNSigma()); + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/h2dTPCvsTOFNSigma_ALambdaPi"), sigma.lambdaPosPiTPCNSigma(), sigma.aLambdaPiTOFNSigma()); + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/hALambdaDCANegToPV"), sigma.lambdaDCANegPV()); + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/hALambdaDCAPosToPV"), sigma.lambdaDCAPosPV()); + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/hALambdapT"), sigma.lambdaPt()); + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/hAntiLambdaMass"), sigma.antilambdaMass()); + histos.fill(HIST(MainDir[mode]) + HIST("/Lambda/h3dAntiLambdaMass"), sigma.sigmaCentrality(), sigma.lambdaPt(), sigma.antilambdaMass()); + + histos.fill(HIST(MainDir[mode]) + HIST("/ASigma0/hMass"), sigma.sigmaMass()); + histos.fill(HIST(MainDir[mode]) + HIST("/ASigma0/hPt"), sigma.sigmapT()); + histos.fill(HIST(MainDir[mode]) + HIST("/ASigma0/hY"), sigma.sigmaRapidity()); + histos.fill(HIST(MainDir[mode]) + HIST("/ASigma0/h3dMass"), sigma.sigmaCentrality(), sigma.sigmapT(), sigma.sigmaMass()); + histos.fill(HIST(MainDir[mode]) + HIST("/ASigma0/h3dPhotonRadiusVsMassSigma"), sigma.sigmaCentrality(), sigma.photonRadius(), sigma.sigmaMass()); + histos.fill(HIST(MainDir[mode]) + HIST("/ASigma0/h2dpTVsOPAngle"), sigma.sigmapT(), sigma.sigmaOPAngle()); } - histos.fill(HIST("hEventSelection"), 2 /* FT0 vertex (acceptable FT0C-FT0A time difference) collisions */); - if (eventSelections.rejectITSROFBorder && !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { - return false; + + //_______________________________________ + // MC specific + if (doprocessMonteCarlo) { + if constexpr (requires { sigma.lambdaCandPDGCode(); sigma.photonCandPDGCode(); }) { + + //_______________________________________ + // Gamma MC association + if (sigma.photonCandPDGCode() == 22) { + histos.fill(HIST(MainDir[mode]) + HIST("/MC/Photon/hV0ToCollAssoc"), sigma.photonIsCorrectlyAssoc()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/Photon/hPt"), sigma.photonPt()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/Photon/hMCPt"), sigma.photonMCPt()); + + histos.fill(HIST(MainDir[mode]) + HIST("/MC/Photon/h2dPosTPCNSigmaEl"), sigma.photonPosPt(), sigma.photonPosTPCNSigmaEl()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/Photon/h2dNegTPCNSigmaEl"), sigma.photonNegPt(), sigma.photonNegTPCNSigmaEl()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/Photon/h2dPosTPCNSigmaPi"), sigma.photonPosPt(), sigma.photonPosTPCNSigmaPi()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/Photon/h2dNegTPCNSigmaPi"), sigma.photonNegPt(), sigma.photonNegTPCNSigmaPi()); + + histos.fill(HIST(MainDir[mode]) + HIST("/MC/Photon/h2dIRVsPt"), sigma.sigmaIR(), sigma.photonMCPt()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/Photon/h3dPAVsIRVsPt"), TMath::ACos(sigma.photonCosPA()), sigma.sigmaIR(), sigma.photonMCPt()); + + if (!sigma.photonIsCorrectlyAssoc()) { + histos.fill(HIST(MainDir[mode]) + HIST("/MC/Photon/h2dIRVsPt_BadCollAssig"), sigma.sigmaIR(), sigma.photonMCPt()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/Photon/h3dPAVsIRVsPt_BadCollAssig"), TMath::ACos(sigma.photonCosPA()), sigma.sigmaIR(), sigma.photonMCPt()); + } + } + + //_______________________________________ + // Lambda MC association + if (sigma.lambdaCandPDGCode() == 3122) { + histos.fill(HIST(MainDir[mode]) + HIST("/MC/Lambda/hV0ToCollAssoc"), sigma.lambdaIsCorrectlyAssoc()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/Lambda/hPt"), sigma.lambdaPt()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/Lambda/hMCPt"), sigma.lambdaMCPt()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/Lambda/h3dTPCvsTOFNSigma_Pr"), sigma.lambdaPosPrTPCNSigma(), sigma.lambdaPrTOFNSigma(), sigma.lambdaPt()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/Lambda/h3dTPCvsTOFNSigma_Pi"), sigma.lambdaNegPiTPCNSigma(), sigma.lambdaPiTOFNSigma(), sigma.lambdaPt()); + } + + //_______________________________________ + // AntiLambda MC association + if (sigma.lambdaCandPDGCode() == -3122) { + histos.fill(HIST(MainDir[mode]) + HIST("/MC/ALambda/hV0ToCollAssoc"), sigma.lambdaIsCorrectlyAssoc()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/ALambda/hPt"), sigma.lambdaPt()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/ALambda/hMCPt"), sigma.lambdaMCPt()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/ALambda/h3dTPCvsTOFNSigma_Pr"), sigma.lambdaNegPrTPCNSigma(), sigma.aLambdaPrTOFNSigma(), sigma.lambdaPt()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/ALambda/h3dTPCvsTOFNSigma_Pi"), sigma.lambdaPosPiTPCNSigma(), sigma.aLambdaPiTOFNSigma(), sigma.lambdaPt()); + } + + //_______________________________________ + // Sigma0 MC association + if (sigma.isSigma()) { + histos.fill(HIST(MainDir[mode]) + HIST("/MC/h2dArmenteros"), sigma.photonAlpha(), sigma.photonQt()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/h2dArmenteros"), sigma.lambdaAlpha(), sigma.lambdaQt()); + + histos.fill(HIST(MainDir[mode]) + HIST("/MC/Sigma0/hPt"), sigma.sigmapT()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/Sigma0/hMCPt"), sigma.sigmaMCPt()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/Sigma0/h2dMCPtVsLambdaMCPt"), sigma.sigmaMCPt(), sigma.lambdaMCPt()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/Sigma0/h2dMCPtVsGammaMCPt"), sigma.sigmaMCPt(), sigma.photonMCPt()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/Sigma0/hMass"), sigma.sigmaMass()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/Sigma0/h3dMass"), sigma.sigmaCentrality(), sigma.sigmapT(), sigma.sigmaMass()); + } + + //_______________________________________ + // AntiSigma0 MC association + if (sigma.isAntiSigma()) { + histos.fill(HIST(MainDir[mode]) + HIST("/MC/h2dArmenteros"), sigma.photonAlpha(), sigma.photonQt()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/h2dArmenteros"), sigma.lambdaAlpha(), sigma.lambdaQt()); + + histos.fill(HIST(MainDir[mode]) + HIST("/MC/ASigma0/hPt"), sigma.sigmapT()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/ASigma0/hMCPt"), sigma.sigmaMCPt()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/ASigma0/h2dMCPtVsLambdaMCPt"), sigma.sigmaMCPt(), sigma.lambdaMCPt()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/ASigma0/h2dMCPtVsPhotonMCPt"), sigma.sigmaMCPt(), sigma.photonMCPt()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/ASigma0/hMass"), sigma.sigmaMass()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/ASigma0/h3dMass"), sigma.sigmaCentrality(), sigma.sigmapT(), sigma.sigmaMass()); + } + + // For background studies: + if (fillBkgQAhistos) + runBkgAnalysis(sigma); + + //_______________________________________ + // pT resolution histos + if ((mode == 0) && fillpTResoQAhistos) + getpTResolution(sigma); + } } - histos.fill(HIST("hEventSelection"), 3 /* Not at ITS ROF border */); - if (eventSelections.rejectTFBorder && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { - return false; + } + + template + void fillSelHistos(TV0Object const& sigma, int PDGRequired) + { + + static constexpr std::string_view PhotonSelsLocal[] = {"NoSel", "V0Type", "DaupT", "DCADauToPV", + "DCADau", "DauTPCCR", "TPCNSigmaEl", "V0pT", + "Y", "V0Radius", "RZCut", "Armenteros", "CosPA", + "PsiPair", "Phi", "Mass"}; + + static constexpr std::string_view LambdaSelsLocal[] = {"NoSel", "V0Radius", "DCADau", "Armenteros", + "CosPA", "Y", "TPCCR", "DauITSCls", "Lifetime", + "TPCTOFPID", "DCADauToPV", "Mass"}; + + if (PDGRequired == 22) { + if constexpr (selection_index >= 0 && selection_index < (int)std::size(PhotonSelsLocal)) { + histos.fill(HIST("Selection/Photon/hCandidateSel"), selection_index); + histos.fill(HIST("Selection/Photon/h2d") + HIST(PhotonSelsLocal[selection_index]), sigma.photonPt(), sigma.photonMass()); + histos.fill(HIST("Selection/Sigma0/h2dPhoton") + HIST(PhotonSelsLocal[selection_index]), sigma.sigmapT(), sigma.sigmaMass()); + } } - histos.fill(HIST("hEventSelection"), 4 /* Not at TF border */); - if (std::abs(collision.posZ()) > eventSelections.maxZVtxPosition) { - return false; + + if (PDGRequired == 3122) { + if constexpr (selection_index >= 0 && selection_index < (int)std::size(LambdaSelsLocal)) { + histos.fill(HIST("Selection/Lambda/hCandidateSel"), selection_index); + histos.fill(HIST("Selection/Lambda/h2d") + HIST(LambdaSelsLocal[selection_index]), sigma.lambdaPt(), sigma.lambdaMass()); + histos.fill(HIST("Selection/Sigma0/h2dLambda") + HIST(LambdaSelsLocal[selection_index]), sigma.sigmapT(), sigma.sigmaMass()); + } } - histos.fill(HIST("hEventSelection"), 5 /* vertex-Z selected */); - if (eventSelections.requireIsVertexITSTPC && !collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) { + } + + // Apply specific selections for photons + template + bool selectPhoton(TV0Object const& cand) + { + fillSelHistos<0>(cand, 22); + if (cand.photonV0Type() != Photonv0TypeSel && Photonv0TypeSel > -1) return false; - } - histos.fill(HIST("hEventSelection"), 6 /* Contains at least one ITS-TPC track */); - if (eventSelections.requireIsGoodZvtxFT0VsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { + + fillSelHistos<1>(cand, 22); + if ((cand.photonPosPt() < PhotonDauMinPt) || (cand.photonNegPt() < PhotonDauMinPt)) return false; - } - histos.fill(HIST("hEventSelection"), 7 /* PV position consistency check */); - if (eventSelections.requireIsVertexTOFmatched && !collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) { + + fillSelHistos<2>(cand, 22); + if ((TMath::Abs(cand.photonDCAPosPV()) < PhotonMinDCADauToPv) || (TMath::Abs(cand.photonDCANegPV()) < PhotonMinDCADauToPv)) return false; - } - histos.fill(HIST("hEventSelection"), 8 /* PV with at least one contributor matched with TOF */); - if (eventSelections.requireIsVertexTRDmatched && !collision.selection_bit(o2::aod::evsel::kIsVertexTRDmatched)) { + + fillSelHistos<3>(cand, 22); + if (TMath::Abs(cand.photonDCADau()) > PhotonMaxDCAV0Dau) return false; - } - histos.fill(HIST("hEventSelection"), 9 /* PV with at least one contributor matched with TRD */); - if (eventSelections.rejectSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { + + fillSelHistos<4>(cand, 22); + if ((cand.photonPosTPCCrossedRows() < PhotonMinTPCCrossedRows) || (cand.photonNegTPCCrossedRows() < PhotonMinTPCCrossedRows)) return false; - } - histos.fill(HIST("hEventSelection"), 10 /* Not at same bunch pile-up */); - if (eventSelections.requireNoCollInTimeRangeStd && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + + fillSelHistos<5>(cand, 22); + if (((cand.photonPosTPCNSigmaEl() < PhotonMinTPCNSigmas) || (cand.photonPosTPCNSigmaEl() > PhotonMaxTPCNSigmas))) return false; - } - histos.fill(HIST("hEventSelection"), 11 /* No other collision within +/- 2 microseconds or mult above a certain threshold in -4 - -2 microseconds*/); - if (eventSelections.requireNoCollInTimeRangeStrict && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStrict)) { + + if (((cand.photonNegTPCNSigmaEl() < PhotonMinTPCNSigmas) || (cand.photonNegTPCNSigmaEl() > PhotonMaxTPCNSigmas))) return false; - } - histos.fill(HIST("hEventSelection"), 12 /* No other collision within +/- 10 microseconds */); - if (eventSelections.requireNoCollInTimeRangeNarrow && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeNarrow)) { + + fillSelHistos<6>(cand, 22); + if ((cand.photonPt() < PhotonMinPt) || (cand.photonPt() > PhotonMaxPt)) return false; - } - histos.fill(HIST("hEventSelection"), 13 /* No other collision within +/- 2 microseconds */); - if (eventSelections.requireNoCollInROFStd && !collision.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { + + fillSelHistos<7>(cand, 22); + if ((TMath::Abs(cand.photonY()) > PhotonMaxRap) || (TMath::Abs(cand.photonPosEta()) > PhotonMaxDauEta) || (TMath::Abs(cand.photonNegEta()) > PhotonMaxDauEta)) return false; - } - histos.fill(HIST("hEventSelection"), 14 /* No other collision within the same ITS ROF with mult. above a certain threshold */); - if (eventSelections.requireNoCollInROFStrict && !collision.selection_bit(o2::aod::evsel::kNoCollInRofStrict)) { + + fillSelHistos<8>(cand, 22); + if ((cand.photonRadius() < PhotonMinRadius) || (cand.photonRadius() > PhotonMaxRadius)) return false; - } - histos.fill(HIST("hEventSelection"), 15 /* No other collision within the same ITS ROF */); - if (doPPAnalysis) { // we are in pp - if (eventSelections.requireINEL0 && collision.multNTracksPVeta1() < 1) { + + fillSelHistos<9>(cand, 22); + float photonRZLineCut = TMath::Abs(cand.photonZconv()) * TMath::Tan(2 * TMath::ATan(TMath::Exp(-PhotonMaxDauEta))) - PhotonLineCutZ0; + if ((TMath::Abs(cand.photonRadius()) < photonRZLineCut) || (TMath::Abs(cand.photonZconv()) > PhotonMaxZ)) + return false; + + fillSelHistos<10>(cand, 22); + if (cand.photonQt() > PhotonMaxQt) + return false; + + if (TMath::Abs(cand.photonAlpha()) > PhotonMaxAlpha) + return false; + + fillSelHistos<11>(cand, 22); + if (cand.photonCosPA() < PhotonMinV0cospa) + return false; + + fillSelHistos<12>(cand, 22); + if (TMath::Abs(cand.photonPsiPair()) > PhotonPsiPairMax) + return false; + + fillSelHistos<13>(cand, 22); + if ((((cand.photonPhi() > PhotonPhiMin1) && (cand.photonPhi() < PhotonPhiMax1)) || ((cand.photonPhi() > PhotonPhiMin2) && (cand.photonPhi() < PhotonPhiMax2))) && ((PhotonPhiMin1 != -1) && (PhotonPhiMax1 != -1) && (PhotonPhiMin2 != -1) && (PhotonPhiMax2 != -1))) + return false; + + fillSelHistos<14>(cand, 22); + if (TMath::Abs(cand.photonMass()) > PhotonMaxMass) + return false; + + fillSelHistos<15>(cand, 22); + return true; + } + + // Apply specific selections for lambdas + template + bool selectLambda(TV0Object const& cand) + { + fillSelHistos<0>(cand, 3122); + if ((cand.lambdaRadius() < LambdaMinv0radius) || (cand.lambdaRadius() > LambdaMaxv0radius)) + return false; + + fillSelHistos<1>(cand, 3122); + if (TMath::Abs(cand.lambdaDCADau()) > LambdaMaxDCAV0Dau) + return false; + + fillSelHistos<2>(cand, 3122); + if ((cand.lambdaQt() < LambdaMinQt) || (cand.lambdaQt() > LambdaMaxQt)) + return false; + + if ((TMath::Abs(cand.lambdaAlpha()) < LambdaMinAlpha) || (TMath::Abs(cand.lambdaAlpha()) > LambdaMaxAlpha)) + return false; + + fillSelHistos<3>(cand, 3122); + if (cand.lambdaCosPA() < LambdaMinv0cospa) + return false; + + fillSelHistos<4>(cand, 3122); + if ((TMath::Abs(cand.lambdaY()) > LambdaMaxRap) || (TMath::Abs(cand.lambdaPosEta()) > LambdaMaxDauEta) || (TMath::Abs(cand.lambdaNegEta()) > LambdaMaxDauEta)) + return false; + + fillSelHistos<5>(cand, 3122); + if ((cand.lambdaPosTPCCrossedRows() < LambdaMinTPCCrossedRows) || (cand.lambdaNegTPCCrossedRows() < LambdaMinTPCCrossedRows)) + return false; + + fillSelHistos<6>(cand, 3122); + // check minimum number of ITS clusters + reject ITS afterburner tracks if requested + bool posIsFromAfterburner = cand.lambdaPosChi2PerNcl() < 0; + bool negIsFromAfterburner = cand.lambdaNegChi2PerNcl() < 0; + if (cand.lambdaPosITSCls() < LambdaMinITSclusters && (!LambdaRejectPosITSafterburner || posIsFromAfterburner)) + return false; + if (cand.lambdaNegITSCls() < LambdaMinITSclusters && (!LambdaRejectNegITSafterburner || negIsFromAfterburner)) + return false; + + fillSelHistos<7>(cand, 3122); + if (cand.lambdaLifeTime() > LambdaMaxLifeTime) + return false; + + // Separating lambda and antilambda selections: + fillSelHistos<8>(cand, 3122); + if (cand.lambdaAlpha() > 0) { // Lambda selection + // TPC Selection + if (fselLambdaTPCPID && (TMath::Abs(cand.lambdaPosPrTPCNSigma()) > LambdaMaxTPCNSigmas)) return false; - } - histos.fill(HIST("hEventSelection"), 16 /* INEL > 0 */); - if (eventSelections.requireINEL1 && collision.multNTracksPVeta1() < 2) { + if (fselLambdaTPCPID && (TMath::Abs(cand.lambdaNegPiTPCNSigma()) > LambdaMaxTPCNSigmas)) return false; - } - histos.fill(HIST("hEventSelection"), 17 /* INEL > 1 */); - } else { // we are in Pb-Pb - float collisionOccupancy = eventSelections.useFT0CbasedOccupancy ? collision.ft0cOccupancyInTimeRange() : collision.trackOccupancyInTimeRange(); - if (eventSelections.minOccupancy >= 0 && collisionOccupancy < eventSelections.minOccupancy) { + + // TOF Selection + if (fselLambdaTOFPID && (TMath::Abs(cand.lambdaPrTOFNSigma()) > LambdaPrMaxTOFNSigmas)) return false; - } - histos.fill(HIST("hEventSelection"), 16 /* Below min occupancy */); - if (eventSelections.maxOccupancy >= 0 && collisionOccupancy > eventSelections.maxOccupancy) { + if (fselLambdaTOFPID && (TMath::Abs(cand.lambdaPiTOFNSigma()) > LambdaPiMaxTOFNSigmas)) return false; - } - histos.fill(HIST("hEventSelection"), 17 /* Above max occupancy */); + + // DCA Selection + fillSelHistos<9>(cand, 3122); + if ((TMath::Abs(cand.lambdaDCAPosPV()) < LambdaMinDCAPosToPv) || (TMath::Abs(cand.lambdaDCANegPV()) < LambdaMinDCANegToPv)) + return false; + + // Mass Selection + fillSelHistos<10>(cand, 3122); + if (TMath::Abs(cand.lambdaMass() - o2::constants::physics::MassLambda0) > LambdaWindow) + return false; + + fillSelHistos<11>(cand, 3122); + + } else { // AntiLambda selection + + // TPC Selection + if (fselLambdaTPCPID && (TMath::Abs(cand.lambdaPosPiTPCNSigma()) > LambdaMaxTPCNSigmas)) + return false; + if (fselLambdaTPCPID && (TMath::Abs(cand.lambdaNegPrTPCNSigma()) > LambdaMaxTPCNSigmas)) + return false; + + // TOF Selection + if (fselLambdaTOFPID && (TMath::Abs(cand.aLambdaPrTOFNSigma()) > LambdaPrMaxTOFNSigmas)) + return false; + if (fselLambdaTOFPID && (TMath::Abs(cand.aLambdaPiTOFNSigma()) > LambdaPiMaxTOFNSigmas)) + return false; + + // DCA Selection + fillSelHistos<9>(cand, 3122); + if ((TMath::Abs(cand.lambdaDCAPosPV()) < ALambdaMinDCAPosToPv) || (TMath::Abs(cand.lambdaDCANegPV()) < ALambdaMinDCANegToPv)) + return false; + + // Mass Selection + fillSelHistos<10>(cand, 3122); + if (TMath::Abs(cand.antilambdaMass() - o2::constants::physics::MassLambda0) > LambdaWindow) + return false; + + fillSelHistos<11>(cand, 3122); } + return true; } - // Apply selections in sigma candidates + // Apply selections in sigma0 candidates template - bool processSigmaCandidate(TV0Object const& cand, bool isLambdalike) + bool processSigmaCandidate(TV0Object const& cand) { + // Optionally Select on Interaction Rate + if (fGetIR && (maxIR != -1) && (minIR != -1) && ((cand.sigmaIR() <= minIR) || (cand.sigmaIR() >= maxIR))) { + return false; + } + + // Do ML analysis if (fUseMLSel) { if ((cand.gammaBDTScore() == -1) || (cand.lambdaBDTScore() == -1) || (cand.antilambdaBDTScore() == -1)) { LOGF(fatal, "ML Score is not available! Please, enable gamma and lambda selection with ML in sigmabuilder!"); } - // Gamma selection: + // Photon selection: if (cand.gammaBDTScore() <= Gamma_MLThreshold) return false; @@ -615,311 +885,25 @@ struct sigmaanalysis { // AntiLambda selection: if (cand.antilambdaBDTScore() <= AntiLambda_MLThreshold) return false; - } else { - bool isMCTrueLambda = false; - bool isMCTruePhoton = false; - if constexpr (requires { cand.lambdaCandPDGCode(); cand.photonCandPDGCode(); }) { - if (cand.photonCandPDGCode() == 22) - isMCTruePhoton = true; - if (cand.lambdaCandPDGCode() == 3122) - isMCTrueLambda = true; - } + } - // Photon Selections - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 1.); - histos.fill(HIST("GeneralQA/hPhotonV0Type"), cand.photonV0Type()); - if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) - histos.fill(HIST("PhotonSelQA/h2dPhotonBaseline"), cand.photonPt(), cand.photonMass()); - if (cand.photonV0Type() != Photonv0TypeSel && Photonv0TypeSel > -1) - return false; - histos.fill(HIST("SigmaSelQA/h2dPhotonV0Type"), cand.sigmapT(), cand.sigmaMass()); - if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) - histos.fill(HIST("PhotonSelQA/h2dPhotonV0Type"), cand.photonPt(), cand.photonMass()); - - // histos.fill(HIST("GeneralQA/h3dPhotonMass"), cand.sigmaCentrality(), cand.photonPt(), cand.photonMass()); - // histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 2.); - // if (TMath::Abs(cand.photonMass()) > PhotonMaxMass) - // return false; - // histos.fill(HIST("SigmaSelQA/h2dPhotonMass"), cand.sigmapT(), cand.sigmaMass()); - // if (isMCTruePhoton || doPhotonLambdaSelQA) histos.fill(HIST("PhotonSelQA/h2dPhotonMass"), cand.photonPt(), cand.photonMass()); - - histos.fill(HIST("GeneralQA/hPhotonNegpT"), cand.photonNegPt()); - histos.fill(HIST("GeneralQA/hPhotonPospT"), cand.photonPosPt()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 2.); - if ((cand.photonPosPt() < PhotonDauMinPt) || (cand.photonNegPt() < PhotonDauMinPt)) - return false; - histos.fill(HIST("SigmaSelQA/h2dPhotonDaupT"), cand.sigmapT(), cand.sigmaMass()); - if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) - histos.fill(HIST("PhotonSelQA/h2dPhotonDaupT"), cand.photonPt(), cand.photonMass()); - histos.fill(HIST("GeneralQA/hPhotonDCANegToPV"), cand.photonDCANegPV()); - histos.fill(HIST("GeneralQA/hPhotonDCAPosToPV"), cand.photonDCAPosPV()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 3.); - if ((TMath::Abs(cand.photonDCAPosPV()) < PhotonMinDCADauToPv) || (TMath::Abs(cand.photonDCANegPV()) < PhotonMinDCADauToPv)) - return false; - histos.fill(HIST("SigmaSelQA/h2dPhotonDCADauToPV"), cand.sigmapT(), cand.sigmaMass()); - if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) - histos.fill(HIST("PhotonSelQA/h2dPhotonDCADauToPV"), cand.photonPt(), cand.photonMass()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 4.); - histos.fill(HIST("GeneralQA/hPhotonDCADau"), cand.photonDCADau()); - if (TMath::Abs(cand.photonDCADau()) > PhotonMaxDCAV0Dau) - return false; - histos.fill(HIST("SigmaSelQA/h2dPhotonDCADau"), cand.sigmapT(), cand.sigmaMass()); - if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) - histos.fill(HIST("PhotonSelQA/h2dPhotonDCADau"), cand.photonPt(), cand.photonMass()); - histos.fill(HIST("GeneralQA/hPhotonPosTPCCR"), cand.photonPosTPCCrossedRows()); - histos.fill(HIST("GeneralQA/hPhotonNegTPCCR"), cand.photonNegTPCCrossedRows()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 5.); - if ((cand.photonPosTPCCrossedRows() < PhotonMinTPCCrossedRows) || (cand.photonNegTPCCrossedRows() < PhotonMinTPCCrossedRows)) - return false; - histos.fill(HIST("SigmaSelQA/h2dPhotonDauTPCCR"), cand.sigmapT(), cand.sigmaMass()); - if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) - histos.fill(HIST("PhotonSelQA/h2dPhotonDauTPCCR"), cand.photonPt(), cand.photonMass()); - histos.fill(HIST("GeneralQA/h2dPhotonPosTPCNSigmaEl"), cand.photonPosPt(), cand.photonPosTPCNSigmaEl()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 6.); - if (((cand.photonPosTPCNSigmaEl() < PhotonMinTPCNSigmas) || (cand.photonPosTPCNSigmaEl() > PhotonMaxTPCNSigmas))) - return false; - histos.fill(HIST("GeneralQA/h2dPhotonNegTPCNSigmaEl"), cand.photonNegPt(), cand.photonNegTPCNSigmaEl()); - if (((cand.photonNegTPCNSigmaEl() < PhotonMinTPCNSigmas) || (cand.photonNegTPCNSigmaEl() > PhotonMaxTPCNSigmas))) - return false; - histos.fill(HIST("SigmaSelQA/h2dPhotonTPCNSigmaEl"), cand.sigmapT(), cand.sigmaMass()); - if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) - histos.fill(HIST("PhotonSelQA/h2dPhotonTPCNSigmaEl"), cand.photonPt(), cand.photonMass()); - histos.fill(HIST("GeneralQA/h2dPhotonPosTPCNSigmaPi"), cand.photonPosPt(), cand.photonPosTPCNSigmaPi()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 7.); - if (((TMath::Abs(cand.photonPosTPCNSigmaPi()) < PiMaxTPCNSigmas) && cand.photonPosPt() <= piMaxpT)) - return false; - histos.fill(HIST("GeneralQA/h2dPhotonNegTPCNSigmaPi"), cand.photonNegPt(), cand.photonNegTPCNSigmaPi()); - if (((TMath::Abs(cand.photonNegTPCNSigmaPi()) < PiMaxTPCNSigmas) && cand.photonNegPt() <= piMaxpT)) - return false; - histos.fill(HIST("GeneralQA/hPhotonpT"), cand.photonPt()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 8.); - if ((cand.photonPt() < PhotonMinPt) || (cand.photonPt() > PhotonMaxPt)) - return false; - histos.fill(HIST("SigmaSelQA/h2dPhotonpT"), cand.sigmapT(), cand.sigmaMass()); - if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) - histos.fill(HIST("PhotonSelQA/h2dPhotonpT"), cand.photonPt(), cand.photonMass()); - histos.fill(HIST("GeneralQA/hPhotonY"), cand.photonY()); - histos.fill(HIST("GeneralQA/hPhotonPosEta"), cand.photonPosEta()); - histos.fill(HIST("GeneralQA/hPhotonNegEta"), cand.photonNegEta()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 9.); - if ((TMath::Abs(cand.photonY()) > PhotonMaxRap) || (TMath::Abs(cand.photonPosEta()) > PhotonMaxDauEta) || (TMath::Abs(cand.photonNegEta()) > PhotonMaxDauEta)) - return false; - histos.fill(HIST("SigmaSelQA/h2dPhotonY"), cand.sigmapT(), cand.sigmaMass()); - if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) - histos.fill(HIST("PhotonSelQA/h2dPhotonY"), cand.photonPt(), cand.photonMass()); - histos.fill(HIST("GeneralQA/hPhotonRadius"), cand.photonRadius()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 10.); - if ((cand.photonRadius() < PhotonMinRadius) || (cand.photonRadius() > PhotonMaxRadius)) - return false; - float photonRZLineCut = TMath::Abs(cand.photonZconv()) * TMath::Tan(2 * TMath::ATan(TMath::Exp(-PhotonMaxDauEta))) - PhotonLineCutZ0; - histos.fill(HIST("SigmaSelQA/h2dPhotonRadius"), cand.sigmapT(), cand.sigmaMass()); - if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) - histos.fill(HIST("PhotonSelQA/h2dPhotonRadius"), cand.photonPt(), cand.photonMass()); - histos.fill(HIST("GeneralQA/hPhotonZ"), cand.photonZconv()); - histos.fill(HIST("GeneralQA/h2dRZCut"), cand.photonRadius(), photonRZLineCut); - histos.fill(HIST("GeneralQA/h2dRZPlane"), cand.photonZconv(), cand.photonRadius()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 11.); - if ((TMath::Abs(cand.photonRadius()) < photonRZLineCut) || (TMath::Abs(cand.photonZconv()) > PhotonMaxZ)) - return false; - histos.fill(HIST("SigmaSelQA/h2dRZCut"), cand.sigmapT(), cand.sigmaMass()); - if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) - histos.fill(HIST("PhotonSelQA/h2dRZCut"), cand.photonPt(), cand.photonMass()); - histos.fill(HIST("GeneralQA/h2dPhotonArmenteros"), cand.photonAlpha(), cand.photonQt()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 12.); - if (cand.photonQt() > PhotonMaxQt) - return false; - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 13.); - if (TMath::Abs(cand.photonAlpha()) > PhotonMaxAlpha) - return false; - histos.fill(HIST("SigmaSelQA/h2dPhotonArmenteros"), cand.sigmapT(), cand.sigmaMass()); - if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) - histos.fill(HIST("PhotonSelQA/h2dPhotonArmenteros"), cand.photonPt(), cand.photonMass()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 14.); - histos.fill(HIST("GeneralQA/hPhotonCosPA"), cand.photonCosPA()); - if (cand.photonCosPA() < PhotonMinV0cospa) - return false; - histos.fill(HIST("SigmaSelQA/h2dPhotonCosPA"), cand.sigmapT(), cand.sigmaMass()); - if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) - histos.fill(HIST("PhotonSelQA/h2dPhotonCosPA"), cand.photonPt(), cand.photonMass()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 15.); - histos.fill(HIST("GeneralQA/hPhotonPsiPair"), cand.photonPsiPair()); - if (TMath::Abs(cand.photonPsiPair()) > PhotonPsiPairMax) - return false; - histos.fill(HIST("SigmaSelQA/h2dPhotonPsiPair"), cand.sigmapT(), cand.sigmaMass()); - if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) - histos.fill(HIST("PhotonSelQA/h2dPhotonPsiPair"), cand.photonPt(), cand.photonMass()); + // Go for standard analysis + else { - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 16.); - histos.fill(HIST("GeneralQA/hPhotonPhi"), cand.photonPhi()); - if (((cand.photonPhi() < PhotonPhiMin1) || ((cand.photonPhi() > PhotonPhiMax1) && (cand.photonPhi() < PhotonPhiMin2)) || ((cand.photonPhi() > PhotonPhiMax2) && (PhotonPhiMax2 != -1)))) - return false; - if ((isMCTruePhoton || doPhotonLambdaSelQA) && (TMath::Abs(cand.photonMass()) <= PhotonMaxMass)) - histos.fill(HIST("PhotonSelQA/h2dPhotonPhi"), cand.photonPt(), cand.photonMass()); - histos.fill(HIST("GeneralQA/h3dPhotonMass"), cand.sigmaCentrality(), cand.photonPt(), cand.photonMass()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 17.); - if (TMath::Abs(cand.photonMass()) > PhotonMaxMass) - return false; - histos.fill(HIST("SigmaSelQA/h2dPhotonMass"), cand.sigmapT(), cand.sigmaMass()); - if (isMCTruePhoton || doPhotonLambdaSelQA) - histos.fill(HIST("PhotonSelQA/h2dPhotonMass"), cand.photonPt(), cand.photonMass()); - - // #### - // Lambda selections - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 18.); - histos.fill(HIST("GeneralQA/hLambdaRadius"), cand.lambdaRadius()); - if ((isMCTrueLambda || doPhotonLambdaSelQA) && (TMath::Abs(cand.lambdaMass() - o2::constants::physics::MassLambda0) < LambdaWindow)) - histos.fill(HIST("LambdaSelQA/h2dLambdaBaseline"), cand.lambdaPt(), cand.lambdaMass()); - if ((cand.lambdaRadius() < LambdaMinv0radius) || (cand.lambdaRadius() > LambdaMaxv0radius)) - return false; - histos.fill(HIST("SigmaSelQA/h2dLambdaRadius"), cand.sigmapT(), cand.sigmaMass()); - if ((isMCTrueLambda || doPhotonLambdaSelQA) && (TMath::Abs(cand.lambdaMass() - o2::constants::physics::MassLambda0) < LambdaWindow)) - histos.fill(HIST("LambdaSelQA/h2dLambdaRadius"), cand.lambdaPt(), cand.lambdaMass()); - histos.fill(HIST("GeneralQA/hLambdaDCADau"), cand.lambdaDCADau()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 19.); - if (TMath::Abs(cand.lambdaDCADau()) > LambdaMaxDCAV0Dau) - return false; - histos.fill(HIST("SigmaSelQA/h2dLambdaDCADau"), cand.sigmapT(), cand.sigmaMass()); - if ((isMCTrueLambda || doPhotonLambdaSelQA) && (TMath::Abs(cand.lambdaMass() - o2::constants::physics::MassLambda0) < LambdaWindow)) - histos.fill(HIST("LambdaSelQA/h2dLambdaDCADau"), cand.lambdaPt(), cand.lambdaMass()); - histos.fill(HIST("GeneralQA/h2dLambdaArmenteros"), cand.lambdaAlpha(), cand.lambdaQt()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 20.); - if ((cand.lambdaQt() < LambdaMinQt) || (cand.lambdaQt() > LambdaMaxQt)) - return false; - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 21.); - if ((TMath::Abs(cand.lambdaAlpha()) < LambdaMinAlpha) || (TMath::Abs(cand.lambdaAlpha()) > LambdaMaxAlpha)) - return false; - histos.fill(HIST("SigmaSelQA/h2dLambdaArmenteros"), cand.sigmapT(), cand.sigmaMass()); - if ((isMCTrueLambda || doPhotonLambdaSelQA) && (TMath::Abs(cand.lambdaMass() - o2::constants::physics::MassLambda0) < LambdaWindow)) - histos.fill(HIST("LambdaSelQA/h2dLambdaArmenteros"), cand.lambdaPt(), cand.lambdaMass()); - histos.fill(HIST("GeneralQA/hLambdaCosPA"), cand.lambdaCosPA()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 22.); - if (cand.lambdaCosPA() < LambdaMinv0cospa) - return false; - histos.fill(HIST("SigmaSelQA/h2dLambdaCosPA"), cand.sigmapT(), cand.sigmaMass()); - if ((isMCTrueLambda || doPhotonLambdaSelQA) && (TMath::Abs(cand.lambdaMass() - o2::constants::physics::MassLambda0) < LambdaWindow)) - histos.fill(HIST("LambdaSelQA/h2dLambdaCosPA"), cand.lambdaPt(), cand.lambdaMass()); - histos.fill(HIST("GeneralQA/hLambdaY"), cand.lambdaY()); - histos.fill(HIST("GeneralQA/hLambdaPosEta"), cand.lambdaPosEta()); - histos.fill(HIST("GeneralQA/hLambdaNegEta"), cand.lambdaNegEta()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 23.); - if ((TMath::Abs(cand.lambdaY()) > LambdaMaxRap) || (TMath::Abs(cand.lambdaPosEta()) > LambdaMaxDauEta) || (TMath::Abs(cand.lambdaNegEta()) > LambdaMaxDauEta)) + // Photon specific selections + if (!selectPhoton(cand)) return false; - histos.fill(HIST("SigmaSelQA/h2dLambdaY"), cand.sigmapT(), cand.sigmaMass()); - if ((isMCTrueLambda || doPhotonLambdaSelQA) && (TMath::Abs(cand.lambdaMass() - o2::constants::physics::MassLambda0) < LambdaWindow)) - histos.fill(HIST("LambdaSelQA/h2dLambdaY"), cand.lambdaPt(), cand.lambdaMass()); - histos.fill(HIST("GeneralQA/hLambdaPosTPCCR"), cand.lambdaPosTPCCrossedRows()); - histos.fill(HIST("GeneralQA/hLambdaNegTPCCR"), cand.lambdaNegTPCCrossedRows()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 24.); - if ((cand.lambdaPosTPCCrossedRows() < LambdaMinTPCCrossedRows) || (cand.lambdaNegTPCCrossedRows() < LambdaMinTPCCrossedRows)) - return false; - histos.fill(HIST("SigmaSelQA/h2dLambdaDauTPCCR"), cand.sigmapT(), cand.sigmaMass()); - if ((isMCTrueLambda || doPhotonLambdaSelQA) && (TMath::Abs(cand.lambdaMass() - o2::constants::physics::MassLambda0) < LambdaWindow)) - histos.fill(HIST("LambdaSelQA/h2dLambdaDauTPCCR"), cand.lambdaPt(), cand.lambdaMass()); - histos.fill(HIST("GeneralQA/hLambdaPosITSCls"), cand.lambdaPosITSCls()); - histos.fill(HIST("GeneralQA/hLambdaNegITSCls"), cand.lambdaNegITSCls()); - histos.fill(HIST("GeneralQA/hLambdaPosChi2PerNc"), cand.lambdaPosChi2PerNcl()); - histos.fill(HIST("GeneralQA/hLambdaNegChi2PerNc"), cand.lambdaNegChi2PerNcl()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 25.); - // check minimum number of ITS clusters + reject ITS afterburner tracks if requested - bool posIsFromAfterburner = cand.lambdaPosChi2PerNcl() < 0; - bool negIsFromAfterburner = cand.lambdaNegChi2PerNcl() < 0; - if (cand.lambdaPosITSCls() < LambdaMinITSclusters && (!LambdaRejectPosITSafterburner || posIsFromAfterburner)) - return false; - if (cand.lambdaNegITSCls() < LambdaMinITSclusters && (!LambdaRejectNegITSafterburner || negIsFromAfterburner)) - return false; - histos.fill(HIST("SigmaSelQA/h2dLambdaDauITSCls"), cand.sigmapT(), cand.sigmaMass()); - if ((isMCTrueLambda || doPhotonLambdaSelQA) && (TMath::Abs(cand.lambdaMass() - o2::constants::physics::MassLambda0) < LambdaWindow)) - histos.fill(HIST("LambdaSelQA/h2dLambdaDauITSCls"), cand.lambdaPt(), cand.lambdaMass()); - histos.fill(HIST("GeneralQA/hLambdaLifeTime"), cand.lambdaLifeTime()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 26.); - if (cand.lambdaLifeTime() > LambdaMaxLifeTime) + + // Lambda specific selections + if (!selectLambda(cand)) return false; - histos.fill(HIST("SigmaSelQA/h2dLambdaLifeTime"), cand.sigmapT(), cand.sigmaMass()); - if ((isMCTrueLambda || doPhotonLambdaSelQA) && (TMath::Abs(cand.lambdaMass() - o2::constants::physics::MassLambda0) < LambdaWindow)) - histos.fill(HIST("LambdaSelQA/h2dLambdaLifeTime"), cand.lambdaPt(), cand.lambdaMass()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 27.); - // Separating lambda and antilambda selections: - if (isLambdalike) { // Lambda selection - histos.fill(HIST("GeneralQA/h2dTPCvsTOFNSigma_LambdaPr"), cand.lambdaPosPrTPCNSigma(), cand.lambdaPrTOFNSigma()); - histos.fill(HIST("GeneralQA/h2dTPCvsTOFNSigma_LambdaPi"), cand.lambdaNegPiTPCNSigma(), cand.lambdaPiTOFNSigma()); - - // TPC Selection - if (fselLambdaTPCPID && (TMath::Abs(cand.lambdaPosPrTPCNSigma()) > LambdaMaxTPCNSigmas)) - return false; - if (fselLambdaTPCPID && (TMath::Abs(cand.lambdaNegPiTPCNSigma()) > LambdaMaxTPCNSigmas)) - return false; - - // TOF Selection - if (fselLambdaTOFPID && (TMath::Abs(cand.lambdaPrTOFNSigma()) > LambdaPrMaxTOFNSigmas)) - return false; - if (fselLambdaTOFPID && (TMath::Abs(cand.lambdaPiTOFNSigma()) > LambdaPiMaxTOFNSigmas)) - return false; - - histos.fill(HIST("SigmaSelQA/h2dTPCvsTOFNSigma_Lambda"), cand.sigmapT(), cand.sigmaMass()); - if ((isMCTrueLambda || doPhotonLambdaSelQA) && (TMath::Abs(cand.lambdaMass() - o2::constants::physics::MassLambda0) < LambdaWindow)) - histos.fill(HIST("LambdaSelQA/h2dTPCvsTOFNSigma_Lambda"), cand.lambdaPt(), cand.lambdaMass()); - // DCA Selection - histos.fill(HIST("GeneralQA/hLambdaDCANegToPV"), cand.lambdaDCANegPV()); - histos.fill(HIST("GeneralQA/hLambdaDCAPosToPV"), cand.lambdaDCAPosPV()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 28.); - if ((TMath::Abs(cand.lambdaDCAPosPV()) < LambdaMinDCAPosToPv) || (TMath::Abs(cand.lambdaDCANegPV()) < LambdaMinDCANegToPv)) - return false; - histos.fill(HIST("SigmaSelQA/h2dLambdaDCADauToPV"), cand.sigmapT(), cand.sigmaMass()); - if ((isMCTrueLambda || doPhotonLambdaSelQA) && (TMath::Abs(cand.lambdaMass() - o2::constants::physics::MassLambda0) < LambdaWindow)) - histos.fill(HIST("LambdaSelQA/h2dLambdaDCADauToPV"), cand.lambdaPt(), cand.lambdaMass()); - - // Mass Selection - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 29.); - histos.fill(HIST("GeneralQA/h3dLambdaMass"), cand.sigmaCentrality(), cand.lambdaPt(), cand.lambdaMass()); - if (TMath::Abs(cand.lambdaMass() - o2::constants::physics::MassLambda0) > LambdaWindow) - return false; - histos.fill(HIST("SigmaSelQA/h2dLambdaMass"), cand.sigmapT(), cand.sigmaMass()); - if (isMCTrueLambda || doPhotonLambdaSelQA) - histos.fill(HIST("LambdaSelQA/h2dLambdaMass"), cand.lambdaPt(), cand.lambdaMass()); - - } else { // AntiLambda selection - histos.fill(HIST("GeneralQA/h2dTPCvsTOFNSigma_ALambdaPr"), cand.lambdaNegPrTPCNSigma(), cand.aLambdaPrTOFNSigma()); - histos.fill(HIST("GeneralQA/h2dTPCvsTOFNSigma_ALambdaPi"), cand.lambdaPosPiTPCNSigma(), cand.aLambdaPiTOFNSigma()); - - // TPC Selection - if (fselLambdaTPCPID && (TMath::Abs(cand.lambdaPosPiTPCNSigma()) > LambdaMaxTPCNSigmas)) - return false; - if (fselLambdaTPCPID && (TMath::Abs(cand.lambdaNegPrTPCNSigma()) > LambdaMaxTPCNSigmas)) - return false; - - // TOF Selection - if (fselLambdaTOFPID && (TMath::Abs(cand.aLambdaPrTOFNSigma()) > LambdaPrMaxTOFNSigmas)) - return false; - if (fselLambdaTOFPID && (TMath::Abs(cand.aLambdaPiTOFNSigma()) > LambdaPiMaxTOFNSigmas)) - return false; - - histos.fill(HIST("SigmaSelQA/h2dTPCvsTOFNSigma_ALambda"), cand.sigmapT(), cand.sigmaMass()); - // DCA Selection - histos.fill(HIST("GeneralQA/hALambdaDCANegToPV"), cand.lambdaDCANegPV()); - histos.fill(HIST("GeneralQA/hALambdaDCAPosToPV"), cand.lambdaDCAPosPV()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 28.); - if ((TMath::Abs(cand.lambdaDCAPosPV()) < ALambdaMinDCAPosToPv) || (TMath::Abs(cand.lambdaDCANegPV()) < ALambdaMinDCANegToPv)) - return false; - - histos.fill(HIST("SigmaSelQA/h2dALambdaDCADauToPV"), cand.sigmapT(), cand.sigmaMass()); - // Mass Selection - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 29.); - histos.fill(HIST("GeneralQA/h3dAntiLambdaMass"), cand.sigmaCentrality(), cand.lambdaPt(), cand.antilambdaMass()); - if (TMath::Abs(cand.antilambdaMass() - o2::constants::physics::MassLambda0) > LambdaWindow) - return false; - histos.fill(HIST("SigmaSelQA/h2dAntiLambdaMass"), cand.sigmapT(), cand.sigmaMass()); - } - // Sigma0 selection - histos.fill(HIST("GeneralQA/hSigmaY"), cand.sigmaRapidity()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 30.); + // Sigma0 specific selections if (TMath::Abs(cand.sigmaRapidity()) > SigmaMaxRap) return false; - histos.fill(HIST("SigmaSelQA/h2dSigmaY"), cand.sigmapT(), cand.sigmaMass()); - histos.fill(HIST("GeneralQA/hSigmaOPAngle"), cand.sigmaOPAngle()); - histos.fill(HIST("GeneralQA/hCandidateAnalysisSelection"), 31.); } + return true; } @@ -929,218 +913,37 @@ struct sigmaanalysis { if (doMCAssociation && !(sigma.isSigma() || sigma.isAntiSigma())) { continue; } - if (fGetIR) { - double interactionRate = rateFetcher.fetch(ccdb.service, sigma.sigmaTimestamp(), sigma.sigmaRunNumber(), irSource) * 1.e-3; - histos.fill(HIST("GeneralQA/hInteractionRate"), interactionRate); - histos.fill(HIST("GeneralQA/hCentralityVsInteractionRate"), sigma.sigmaCentrality(), interactionRate); - if ((maxIR != -1) && (minIR != -1) && ((interactionRate <= minIR) || (interactionRate >= maxIR))) { - continue; - } - } - - // Filling histos before analysis selection - histos.fill(HIST("MC/h2dSigmaMCPtVsLambdaMCPt"), sigma.sigmaMCPt(), sigma.lambdaMCPt()); - histos.fill(HIST("MC/h2dSigmaMCPtVsGammaMCPt"), sigma.sigmaMCPt(), sigma.photonMCPt()); - histos.fill(HIST("MC/h3dMassAllSigma0sBeforesel"), sigma.sigmaCentrality(), sigma.sigmapT(), sigma.sigmaMass()); - histos.fill(HIST("MC/h2dArmenterosBeforeSel"), sigma.photonAlpha(), sigma.photonQt()); - histos.fill(HIST("MC/h2dArmenterosBeforeSel"), sigma.lambdaAlpha(), sigma.lambdaQt()); - histos.fill(HIST("MC/hMassSigma0BeforeSel"), sigma.sigmaMass()); - histos.fill(HIST("MC/hPtSigma0BeforeSel"), sigma.sigmapT()); - histos.fill(HIST("MC/hPtGammaCand_BeforeSel"), sigma.photonPt()); - histos.fill(HIST("MC/hPtLambdaCand_BeforeSel"), sigma.lambdaPt()); - histos.fill(HIST("MC/hPtSigmaCand_BeforeSel"), sigma.sigmapT()); - - if (sigma.photonCandPDGCode() == 22) { - histos.fill(HIST("MC/hPtTrueGamma_BeforeSel"), sigma.photonPt()); - if (sigma.photonMCPt() > 0) { - histos.fill(HIST("MC/h3dGammaPtResoVsTPCCR"), 1.f / sigma.lambdaMCPt(), 1.f / sigma.lambdaPt() - 1.f / sigma.lambdaMCPt(), -1 * sigma.photonNegTPCCrossedRows()); // 1/pT resolution - histos.fill(HIST("MC/h3dGammaPtResoVsTPCCR"), 1.f / sigma.lambdaMCPt(), 1.f / sigma.lambdaPt() - 1.f / sigma.lambdaMCPt(), sigma.photonPosTPCCrossedRows()); // 1/pT resolution - histos.fill(HIST("MC/h2dGammaPtResolution"), 1.f / sigma.photonMCPt(), 1.f / sigma.photonPt() - 1.f / sigma.photonMCPt()); // pT resolution - } - } - if (sigma.lambdaCandPDGCode() == 3122) { - histos.fill(HIST("MC/hPtTrueLambda_BeforeSel"), sigma.lambdaPt()); - if (sigma.lambdaMCPt() > 0) { - histos.fill(HIST("MC/h2dLambdaPtResolution"), 1.f / sigma.lambdaMCPt(), 1.f / sigma.lambdaPt() - 1.f / sigma.lambdaMCPt()); // 1/pT resolution - histos.fill(HIST("MC/h3dLambdaPtResoVsTPCCR"), 1.f / sigma.lambdaMCPt(), 1.f / sigma.lambdaPt() - 1.f / sigma.lambdaMCPt(), -1 * sigma.lambdaNegTPCCrossedRows()); // 1/pT resolution - histos.fill(HIST("MC/h3dLambdaPtResoVsTPCCR"), 1.f / sigma.lambdaMCPt(), 1.f / sigma.lambdaPt() - 1.f / sigma.lambdaMCPt(), sigma.lambdaPosTPCCrossedRows()); // 1/pT resolution - } - } - if (sigma.lambdaCandPDGCode() == -3122) { - if (sigma.lambdaMCPt() > 0) { - histos.fill(HIST("MC/h2dAntiLambdaPtResolution"), 1.f / sigma.lambdaMCPt(), 1.f / sigma.lambdaPt() - 1.f / sigma.lambdaMCPt()); // pT resolution - histos.fill(HIST("MC/h3dAntiLambdaPtResoVsTPCCR"), 1.f / sigma.lambdaMCPt(), 1.f / sigma.lambdaPt() - 1.f / sigma.lambdaMCPt(), -1 * sigma.lambdaNegTPCCrossedRows()); // 1/pT resolution - histos.fill(HIST("MC/h3dAntiLambdaPtResoVsTPCCR"), 1.f / sigma.lambdaMCPt(), 1.f / sigma.lambdaPt() - 1.f / sigma.lambdaMCPt(), sigma.lambdaPosTPCCrossedRows()); // 1/pT resolution - } - histos.fill(HIST("MC/hPtTrueAntiLambda_BeforeSel"), sigma.lambdaPt()); - } - if (sigma.isSigma()) { - histos.fill(HIST("MC/hPtTrueSigma_BeforeSel"), sigma.sigmapT()); - if (sigma.sigmaMCPt() > 0) - histos.fill(HIST("MC/h2dSigma0PtResolution"), 1.f / sigma.sigmaMCPt(), 1.f / sigma.sigmapT() - 1.f / sigma.sigmaMCPt()); // pT resolution - } - if (sigma.isAntiSigma()) { - histos.fill(HIST("MC/hPtTrueAntiSigma_BeforeSel"), sigma.sigmapT()); - if (sigma.sigmaMCPt() > 0) - histos.fill(HIST("MC/h2dAntiSigma0PtResolution"), 1.f / sigma.sigmaMCPt(), 1.f / sigma.sigmapT() - 1.f / sigma.sigmaMCPt()); // pT resolution - } - - if (sigma.lambdaAlpha() > 0) { // Lambda Analysis - if (!processSigmaCandidate(sigma, true)) - continue; - // For Lambda PID Studies - histos.fill(HIST("MC/hPtLambdaCand_AfterSel"), sigma.lambdaPt()); - histos.fill(HIST("MC/h3dTPCvsTOFNSigma_LambdaPr"), sigma.lambdaPosPrTPCNSigma(), sigma.lambdaPrTOFNSigma(), sigma.lambdaPt()); - histos.fill(HIST("MC/h3dTPCvsTOFNSigma_LambdaPi"), sigma.lambdaNegPiTPCNSigma(), sigma.lambdaPiTOFNSigma(), sigma.lambdaPt()); - - if (sigma.lambdaCandPDGCode() == 3122) { - histos.fill(HIST("MC/hPtTrueLambda_AfterSel"), sigma.lambdaPt()); - histos.fill(HIST("MC/h3dTPCvsTOFNSigma_TrueLambdaPr"), sigma.lambdaPosPrTPCNSigma(), sigma.lambdaPrTOFNSigma(), sigma.lambdaPt()); - histos.fill(HIST("MC/h3dTPCvsTOFNSigma_TrueLambdaPi"), sigma.lambdaNegPiTPCNSigma(), sigma.lambdaPiTOFNSigma(), sigma.lambdaPt()); - } - histos.fill(HIST("GeneralQA/hLambdaMassSelected"), sigma.lambdaMass()); - histos.fill(HIST("Sigma0/hMassSigma0"), sigma.sigmaMass()); - histos.fill(HIST("Sigma0/hPtSigma0"), sigma.sigmapT()); - histos.fill(HIST("Sigma0/hRapiditySigma0"), sigma.sigmaRapidity()); - histos.fill(HIST("Sigma0/h3dMassSigma0"), sigma.sigmaCentrality(), sigma.sigmapT(), sigma.sigmaMass()); - histos.fill(HIST("Sigma0/h3dPhotonRadiusVsMassSigma0"), sigma.sigmaCentrality(), sigma.photonRadius(), sigma.sigmaMass()); - - if (sigma.isSigma()) { // Signal study - histos.fill(HIST("MC/h2dArmenterosAfterSel"), sigma.photonAlpha(), sigma.photonQt()); - histos.fill(HIST("MC/h2dArmenterosAfterSel"), sigma.lambdaAlpha(), sigma.lambdaQt()); - histos.fill(HIST("MC/hMassSigma0"), sigma.sigmaMass()); - histos.fill(HIST("MC/hPtSigma0"), sigma.sigmapT()); - histos.fill(HIST("MC/h3dMassSigma0"), sigma.sigmaCentrality(), sigma.sigmapT(), sigma.sigmaMass()); - histos.fill(HIST("MC/h2dPtVsMassSigma_SignalOnly"), sigma.sigmapT(), sigma.sigmaMass()); - histos.fill(HIST("MC/hPtTrueSigma_AfterSel"), sigma.sigmapT()); - } - } else { // AntiLambda Analysis - if (!processSigmaCandidate(sigma, false)) - continue; + // Fill histos before any selection + fillQAHistos<0>(sigma); - if (sigma.lambdaCandPDGCode() == -3122) { - histos.fill(HIST("MC/hPtTrueAntiLambda_AfterSel"), sigma.lambdaPt()); - histos.fill(HIST("MC/h3dTPCvsTOFNSigma_TrueALambdaPr"), sigma.lambdaNegPrTPCNSigma(), sigma.aLambdaPrTOFNSigma(), sigma.lambdaPt()); - histos.fill(HIST("MC/h3dTPCvsTOFNSigma_TrueALambdaPi"), sigma.lambdaPosPiTPCNSigma(), sigma.aLambdaPiTOFNSigma(), sigma.lambdaPt()); - } - histos.fill(HIST("GeneralQA/hAntiLambdaMassSelected"), sigma.antilambdaMass()); - histos.fill(HIST("AntiSigma0/hMassAntiSigma0"), sigma.sigmaMass()); - histos.fill(HIST("AntiSigma0/hPtAntiSigma0"), sigma.sigmapT()); - histos.fill(HIST("AntiSigma0/hRapidityAntiSigma0"), sigma.sigmaRapidity()); - histos.fill(HIST("AntiSigma0/h3dMassAntiSigma0"), sigma.sigmaCentrality(), sigma.sigmapT(), sigma.sigmaMass()); - histos.fill(HIST("AntiSigma0/h3dPhotonRadiusVsMassAntiSigma0"), sigma.sigmaCentrality(), sigma.photonRadius(), sigma.sigmaMass()); - if (sigma.isAntiSigma()) { // Signal study - histos.fill(HIST("MC/h2dArmenterosAfterSel"), sigma.photonAlpha(), sigma.photonQt()); - histos.fill(HIST("MC/h2dArmenterosAfterSel"), sigma.lambdaAlpha(), sigma.lambdaQt()); - histos.fill(HIST("MC/hMassAntiSigma0"), sigma.sigmaMass()); - histos.fill(HIST("MC/hPtAntiSigma0"), sigma.sigmapT()); - histos.fill(HIST("MC/h3dMassAntiSigma0"), sigma.sigmaCentrality(), sigma.sigmapT(), sigma.sigmaMass()); - histos.fill(HIST("MC/h2dPtVsMassSigma_SignalOnly"), sigma.sigmapT(), sigma.sigmaMass()); - histos.fill(HIST("MC/hPtTrueSigma_AfterSel"), sigma.sigmapT()); - } - } - - // Fill histos after selection, please - histos.fill(HIST("MC/hPtGammaCand_AfterSel"), sigma.photonPt()); - histos.fill(HIST("GeneralQA/hPhotonMassSelected"), sigma.photonMass()); - histos.fill(HIST("MC/hPtSigmaCand_AfterSel"), sigma.sigmapT()); - - if (sigma.photonCandPDGCode() == 22) { - histos.fill(HIST("MC/hPtTrueGamma_AfterSel"), sigma.photonPt()); - } - - // For background studies: - histos.fill(HIST("MC/h2dPtVsMassSigma_SignalBkg"), sigma.sigmapT(), sigma.sigmaMass()); - // Real Gamma x Real Lambda - but not from the same sigma0/antisigma0! - if ((sigma.photonCandPDGCode() == 22) && ((sigma.lambdaCandPDGCode() == 3122) || (sigma.lambdaCandPDGCode() == -3122)) && !(sigma.isSigma()) && !(sigma.isAntiSigma())) { - histos.fill(HIST("MC/h2dPtVsMassSigma_TrueDaughters"), sigma.sigmapT(), sigma.sigmaMass()); - histos.fill(HIST("MC/h2dTrueDaughtersMatrix"), sigma.lambdaCandPDGCodeMother(), sigma.photonCandPDGCodeMother()); - histos.fill(HIST("MC/h2dPtVsOPAngle_TrueDaughters"), sigma.sigmapT(), sigma.sigmaOPAngle()); - } - // Real Gamma x fake Lambda - if ((sigma.photonCandPDGCode() == 22) && (sigma.lambdaCandPDGCode() != 3122) && (sigma.lambdaCandPDGCode() != -3122)) - histos.fill(HIST("MC/h2dPtVsMassSigma_TrueGammaFakeLambda"), sigma.sigmapT(), sigma.sigmaMass()); - - // Fake Gamma x Real Lambda - if ((sigma.photonCandPDGCode() != 22) && ((sigma.lambdaCandPDGCode() == 3122) || (sigma.lambdaCandPDGCode() == -3122))) - histos.fill(HIST("MC/h2dPtVsMassSigma_FakeGammaTrueLambda"), sigma.sigmapT(), sigma.sigmaMass()); + // Select sigma0 candidates + if (!processSigmaCandidate(sigma)) + continue; - // Fake Gamma x Fake Lambda - if ((sigma.photonCandPDGCode() != 22) && (sigma.lambdaCandPDGCode() != 3122) && (sigma.lambdaCandPDGCode() != -3122)) - histos.fill(HIST("MC/h2dPtVsMassSigma_FakeDaughters"), sigma.sigmapT(), sigma.sigmaMass()); + // Fill histos after all selections + fillQAHistos<1>(sigma); } } void processRealData(V0Sigmas const& sigmas) { for (auto& sigma : sigmas) { // selecting Sigma0-like candidates - if (fGetIR) { - double interactionRate = rateFetcher.fetch(ccdb.service, sigma.sigmaTimestamp(), sigma.sigmaRunNumber(), irSource) * 1.e-3; - histos.fill(HIST("GeneralQA/hInteractionRate"), interactionRate); - histos.fill(HIST("GeneralQA/hCentralityVsInteractionRate"), sigma.sigmaCentrality(), interactionRate); - if ((maxIR != -1) && (minIR != -1) && ((interactionRate <= minIR) || (interactionRate >= maxIR))) { - continue; - } - } - histos.fill(HIST("GeneralQA/h2dArmenterosBeforeSel"), sigma.photonAlpha(), sigma.photonQt()); - histos.fill(HIST("GeneralQA/h2dArmenterosBeforeSel"), sigma.lambdaAlpha(), sigma.lambdaQt()); - histos.fill(HIST("GeneralQA/hMassSigma0BeforeSel"), sigma.sigmaMass()); - - nSigmaCandidates++; - if (nSigmaCandidates % 100000 == 0) { - LOG(info) << "Sigma0-like Candidates processed: " << nSigmaCandidates; - } - if (sigma.lambdaAlpha() > 0) { - // Perform analysis selection for sigma0 - if (!processSigmaCandidate(sigma, true)) - continue; - - histos.fill(HIST("GeneralQA/h2dArmenterosAfterSel"), sigma.photonAlpha(), sigma.photonQt()); - histos.fill(HIST("GeneralQA/h2dArmenterosAfterSel"), sigma.lambdaAlpha(), sigma.lambdaQt()); - histos.fill(HIST("GeneralQA/hLambdaMassSelected"), sigma.lambdaMass()); - histos.fill(HIST("Sigma0/hMassSigma0"), sigma.sigmaMass()); - histos.fill(HIST("Sigma0/hPtSigma0"), sigma.sigmapT()); - histos.fill(HIST("Sigma0/hRapiditySigma0"), sigma.sigmaRapidity()); - histos.fill(HIST("Sigma0/h3dMassSigma0"), sigma.sigmaCentrality(), sigma.sigmapT(), sigma.sigmaMass()); - histos.fill(HIST("Sigma0/h3dPhotonRadiusVsMassSigma0"), sigma.sigmaCentrality(), sigma.photonRadius(), sigma.sigmaMass()); - - } else { - - // Perform analysis selection for antisigma0 - if (!processSigmaCandidate(sigma, false)) - continue; - - histos.fill(HIST("GeneralQA/h2dArmenterosAfterSel"), sigma.photonAlpha(), sigma.photonQt()); - histos.fill(HIST("GeneralQA/h2dArmenterosAfterSel"), sigma.lambdaAlpha(), sigma.lambdaQt()); - histos.fill(HIST("GeneralQA/hAntiLambdaMassSelected"), sigma.antilambdaMass()); - histos.fill(HIST("AntiSigma0/hMassAntiSigma0"), sigma.sigmaMass()); - histos.fill(HIST("AntiSigma0/hPtAntiSigma0"), sigma.sigmapT()); - histos.fill(HIST("AntiSigma0/hRapidityAntiSigma0"), sigma.sigmaRapidity()); - histos.fill(HIST("AntiSigma0/h3dMassAntiSigma0"), sigma.sigmaCentrality(), sigma.sigmapT(), sigma.sigmaMass()); - histos.fill(HIST("AntiSigma0/h3dPhotonRadiusVsMassAntiSigma0"), sigma.sigmaCentrality(), sigma.photonRadius(), sigma.sigmaMass()); - } - histos.fill(HIST("GeneralQA/hPhotonMassSelected"), sigma.photonMass()); - } - } + // Fill histos before any selection + fillQAHistos<0>(sigma); - void processCollisions(soa::Join const& collisions) - { - for (const auto& coll : collisions) { - if (!IsEventAccepted(coll)) { + // Select sigma0 candidates + if (!processSigmaCandidate(sigma)) continue; - } - double interactionRate = rateFetcher.fetch(ccdb.service, coll.timestamp(), coll.runNumber(), irSource) * 1.e-3; - histos.fill(HIST("GeneralQA/hInteractionRatePerColl"), interactionRate); - histos.fill(HIST("GeneralQA/hCentralityVsInteractionRatePerColl"), coll.centFT0C(), interactionRate); + + // Fill histos after all selections + fillQAHistos<1>(sigma); } } - // PROCESS_SWITCH(sigmaanalysis, processCounterQA, "Check standard counter correctness", true); PROCESS_SWITCH(sigmaanalysis, processMonteCarlo, "Do Monte-Carlo-based analysis", false); PROCESS_SWITCH(sigmaanalysis, processRealData, "Do real data analysis", true); - PROCESS_SWITCH(sigmaanalysis, processCollisions, "Process collisions to retrieve IR info", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 6411a91631d399b33e13be50475552f51b1d8a98 Mon Sep 17 00:00:00 2001 From: nepeivodaRS <94179174+nepeivodaRS@users.noreply.github.com> Date: Fri, 25 Apr 2025 23:06:03 +0200 Subject: [PATCH 1105/1650] [PWGLF] Add neutrons and RCT selection (#10975) Co-authored-by: ALICE Action Bot --- .../Tasks/Strangeness/derivedupcanalysis.cxx | 652 ++++++++++++------ PWGLF/Utils/strangenessMasks.h | 9 +- 2 files changed, 447 insertions(+), 214 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/derivedupcanalysis.cxx b/PWGLF/Tasks/Strangeness/derivedupcanalysis.cxx index af47c618d7a..3704d58ab57 100644 --- a/PWGLF/Tasks/Strangeness/derivedupcanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/derivedupcanalysis.cxx @@ -17,11 +17,11 @@ #include #include #include -#include #include #include #include #include +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -45,6 +45,8 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; +using namespace o2::aod::rctsel; + using std::array; using DauTracks = soa::Join; @@ -56,6 +58,8 @@ using V0CandidatesMC = soa::Join; using CascadeCandidatesMC = soa::Join; +using NeutronsMC = soa::Join; + using CascMCCoresFull = soa::Join; using StraCollisonFull = soa::Join::iterator; @@ -81,18 +85,27 @@ struct Derivedupcanalysis { Configurable> generatorIds{"generatorIds", std::vector{-1}, "MC generatorIds to process"}; // Event selections - Configurable rejectITSROFBorder{"rejectITSROFBorder", true, "reject events at ITS ROF border"}; - Configurable rejectTFBorder{"rejectTFBorder", true, "reject events at TF border"}; - Configurable rejectSameBunchPileup{"rejectSameBunchPileup", true, "reject collisions in case of pileup with another collision in the same foundBC"}; - Configurable requireIsTriggerTVX{"requireIsTriggerTVX", false, "require coincidence in FT0A and FT0C"}; - Configurable requireIsVertexITSTPC{"requireIsVertexITSTPC", false, "require events with at least one ITS-TPC track"}; - Configurable requireIsGoodZvtxFT0VsPV{"requireIsGoodZvtxFT0VsPV", false, "require events with PV position along z consistent (within 1 cm) between PV reconstructed using tracks and PV using FT0 A-C time difference"}; - Configurable requireIsVertexTOFmatched{"requireIsVertexTOFmatched", false, "require events with at least one of vertex contributors matched to TOF"}; - Configurable requireIsVertexTRDmatched{"requireIsVertexTRDmatched", false, "require events with at least one of vertex contributors matched to TRD"}; - Configurable requireNoCollInTimeRangeStd{"requireNoCollInTimeRangeStd", false, "reject collisions corrupted by the cannibalism, with other collisions within +/- 10 microseconds"}; - Configurable requireNoCollInTimeRangeNarrow{"requireNoCollInTimeRangeNarrow", true, "reject collisions corrupted by the cannibalism, with other collisions within +/- 10 microseconds"}; - Configurable studyUPConly{"studyUPConly", true, "is UPC-only analysis"}; - Configurable useUPCflag{"useUPCflag", false, "select UPC flagged events"}; + struct : ConfigurableGroup { + Configurable rejectITSROFBorder{"rejectITSROFBorder", true, "reject events at ITS ROF border"}; + Configurable rejectTFBorder{"rejectTFBorder", true, "reject events at TF border"}; + Configurable rejectSameBunchPileup{"rejectSameBunchPileup", true, "reject collisions in case of pileup with another collision in the same foundBC"}; + Configurable requireIsTriggerTVX{"requireIsTriggerTVX", false, "require coincidence in FT0A and FT0C"}; + Configurable requireIsVertexITSTPC{"requireIsVertexITSTPC", false, "require events with at least one ITS-TPC track"}; + Configurable requireIsGoodZvtxFT0VsPV{"requireIsGoodZvtxFT0VsPV", false, "require events with PV position along z consistent (within 1 cm) between PV reconstructed using tracks and PV using FT0 A-C time difference"}; + Configurable requireIsVertexTOFmatched{"requireIsVertexTOFmatched", false, "require events with at least one of vertex contributors matched to TOF"}; + Configurable requireIsVertexTRDmatched{"requireIsVertexTRDmatched", false, "require events with at least one of vertex contributors matched to TRD"}; + Configurable requireNoCollInTimeRangeStd{"requireNoCollInTimeRangeStd", false, "reject collisions corrupted by the cannibalism, with other collisions within +/- 10 microseconds"}; + Configurable requireNoCollInTimeRangeNarrow{"requireNoCollInTimeRangeNarrow", true, "reject collisions corrupted by the cannibalism, with other collisions within +/- 10 microseconds"}; + Configurable studyUPConly{"studyUPConly", true, "is UPC-only analysis"}; + Configurable useUPCflag{"useUPCflag", false, "select UPC flagged events"}; + + Configurable requireRCTFlagChecker{"requireRCTFlagChecker", true, "Check event quality in run condition table"}; + Configurable cfgEvtRCTFlagCheckerLabel{"cfgEvtRCTFlagCheckerLabel", "CBT_hadronPID", "Evt sel: RCT flag checker label"}; + Configurable cfgEvtRCTFlagCheckerZDCCheck{"cfgEvtRCTFlagCheckerZDCCheck", true, "Evt sel: RCT flag checker ZDC check"}; + Configurable cfgEvtRCTFlagCheckerLimitAcceptAsBad{"cfgEvtRCTFlagCheckerLimitAcceptAsBad", false, "Evt sel: RCT flag checker treat Limited Acceptance As Bad"}; + } evSels; + + RCTFlagsChecker rctChecker; Configurable verbose{"verbose", false, "additional printouts"}; @@ -115,8 +128,8 @@ struct Derivedupcanalysis { Configurable armPodCut{"armPodCut", 5.0f, "pT * (cut) > |alpha|, AP cut. Negative: no cut"}; Configurable v0TypeSelection{"v0TypeSelection", 1, "select on a certain V0 type (leave negative if no selection desired)"}; } v0cuts; - static constexpr float kLifetimeCutsV0[1][2] = {{30., 20.}}; - Configurable> lifetimecutV0{"lifetimecutV0", {kLifetimeCutsV0[0], 2, {"lifetimecutLambda", "lifetimecutK0S"}}, "lifetimecutV0"}; + static constexpr float kNCtauCutsV0[1][2] = {{6, 6.}}; + Configurable> nCtauCutV0{"nCtauCutV0", {kNCtauCutsV0[0], 2, {"lifetimecutLambda", "lifetimecutK0S"}}, "nCtauCutV0"}; // Standard cascade topological criteria struct : ConfigurableGroup { @@ -185,6 +198,7 @@ struct Derivedupcanalysis { struct : ConfigurableGroup { ConfigurableAxis axisFT0Aampl{"axisFT0Aampl", {100, 0.0f, 2000.0f}, "FT0Aamplitude"}; ConfigurableAxis axisFT0Campl{"axisFT0Campl", {100, 0.0f, 2000.0f}, "FT0Camplitude"}; + ConfigurableAxis axisFT0ampl{"axisFT0ampl", {2002, -1.5f, 2000.5f}, "axisFT0ampl"}; ConfigurableAxis axisFV0Aampl{"axisFV0Aampl", {100, 0.0f, 2000.0f}, "FV0Aamplitude"}; ConfigurableAxis axisFDDAampl{"axisFDDAampl", {100, 0.0f, 2000.0f}, "FDDAamplitude"}; ConfigurableAxis axisFDDCampl{"axisFDDCampl", {100, 0.0f, 2000.0f}, "FDDCamplitude"}; @@ -197,8 +211,10 @@ struct Derivedupcanalysis { Configurable doTreatPiToMuon{"doTreatPiToMuon", false, "Take pi decay into muon into account in MC"}; Configurable calculateFeeddownMatrix{"calculateFeeddownMatrix", true, "fill feeddown matrix if MC"}; ConfigurableAxis axisGeneratorIds{"axisGeneratorIds", {256, -0.5f, 255.5f}, "axis for generatorIds"}; + Configurable checkNeutronsInMC{"checkNeutronsInMC", true, "require no neutrons for single-gap in MC"}; + Configurable neutronEtaCut{"neutronEtaCut", 8.8, "ZN acceptance"}; - // fast check on occupancy + // Occupancy cut Configurable minOccupancy{"minOccupancy", -1, "minimum occupancy from neighbouring collisions"}; Configurable maxOccupancy{"maxOccupancy", 1000, "maximum occupancy from neighbouring collisions"}; @@ -262,13 +278,14 @@ struct Derivedupcanalysis { // Topological variable QA axes ConfigurableAxis axisDCAtoPV{"axisDCAtoPV", {80, -4.0f, 4.0f}, "DCA (cm)"}; - ConfigurableAxis axisDCAdau{"axisDCAdau", {24, 0.0f, 1.2f}, "DCA (cm)"}; + ConfigurableAxis axisDCAdau{"axisDCAdau", {48, 0.0f, 1.2f}, "DCA (cm)"}; ConfigurableAxis axisPointingAngle{"axisPointingAngle", {100, 0.0f, 0.5f}, "pointing angle (rad)"}; - ConfigurableAxis axisV0Radius{"axisV0Radius", {60, 0.0f, 60.0f}, "V0 2D radius (cm)"}; + ConfigurableAxis axisCosPA{"axisCosPA", {300, 0.97f, 1.0f}, "cosPA"}; + ConfigurableAxis axisV0Radius{"axisV0Radius", {100, 0.0f, 10.0f}, "V0 2D radius (cm)"}; ConfigurableAxis axisNsigmaTPC{"axisNsigmaTPC", {200, -10.0f, 10.0f}, "N sigma TPC"}; ConfigurableAxis axisTPCsignal{"axisTPCsignal", {200, 0.0f, 200.0f}, "TPC signal"}; ConfigurableAxis axisTOFdeltaT{"axisTOFdeltaT", {200, -5000.0f, 5000.0f}, "TOF Delta T (ps)"}; - ConfigurableAxis axisNctau{"axisNctau", {100, 0.0f, 10.0f}, "n c x tau"}; + ConfigurableAxis axisCtau{"axisCtau", {200, 0.0f, 20.0f}, "c x tau (cm)"}; static constexpr std::string_view kParticlenames[] = {"K0Short", "Lambda", "AntiLambda", "Xi", "AntiXi", "Omega", "AntiOmega"}; @@ -295,7 +312,7 @@ struct Derivedupcanalysis { histos.add(Form("%s/hDCAV0Daughters", kParticlenames[partID].data()), "hDCAV0Daughters", kTH2F, {axisPtCoarse, axisDCAdau}); histos.add(Form("%s/hDCAV0ToPV", kParticlenames[partID].data()), "hDCAV0ToPV", kTH2F, {axisPtCoarse, {44, 0.0f, 2.2f}}); histos.add(Form("%s/hMassLambdaDau", kParticlenames[partID].data()), "hMassLambdaDau", kTH2F, {axisPtCoarse, axisLambdaMass}); - histos.add(Form("%s/hNctau", kParticlenames[partID].data()), "hNctau", kTH2F, {axisPtCoarse, axisNctau}); + histos.add(Form("%s/hCtau", kParticlenames[partID].data()), "hCtau", kTH2F, {axisPtCoarse, axisCtau}); if (doBachelorBaryonCut) { histos.add(Form("%s/hBachBaryonCosPA", kParticlenames[partID].data()), "hBachBaryonCosPA", kTH2F, {axisPtCoarse, {100, 0.0f, 1.0f}}); histos.add(Form("%s/hBachBaryonDCAxyToPV", kParticlenames[partID].data()), "hBachBaryonDCAxyToPV", kTH2F, {axisPtCoarse, {300, -3.0f, 3.0f}}); @@ -305,9 +322,11 @@ struct Derivedupcanalysis { histos.add(Form("%s/hNegDCAToPV", kParticlenames[partID].data()), "hNegDCAToPV", kTH1F, {axisDCAtoPV}); histos.add(Form("%s/hDCADaughters", kParticlenames[partID].data()), "hDCADaughters", kTH1F, {axisDCAdau}); histos.add(Form("%s/hPointingAngle", kParticlenames[partID].data()), "hPointingAngle", kTH1F, {axisPointingAngle}); + histos.add(Form("%s/hCosPA", kParticlenames[partID].data()), "hCosPA", kTH1F, {axisCosPA}); histos.add(Form("%s/hV0Radius", kParticlenames[partID].data()), "hV0Radius", kTH1F, {axisV0Radius}); histos.add(Form("%s/h2dPositiveITSvsTPCpts", kParticlenames[partID].data()), "h2dPositiveITSvsTPCpts", kTH2F, {axisTPCrows, axisITSclus}); histos.add(Form("%s/h2dNegativeITSvsTPCpts", kParticlenames[partID].data()), "h2dNegativeITSvsTPCpts", kTH2F, {axisTPCrows, axisITSclus}); + histos.add(Form("%s/hCtau", kParticlenames[partID].data()), "hCtau", kTH2F, {axisPtCoarse, axisCtau}); } } @@ -315,30 +334,30 @@ struct Derivedupcanalysis { void addTPCQAHistograms(HistogramRegistry& histos) { const bool isCascade = (partID > 2.5) ? true : false; - histos.add(Form("%s/h3dPosNsigmaTPC", kParticlenames[partID].data()), "h3dPosNsigmaTPC", kTH3F, {axisFT0C, axisPtCoarse, axisNsigmaTPC}); - histos.add(Form("%s/h3dNegNsigmaTPC", kParticlenames[partID].data()), "h3dNegNsigmaTPC", kTH3F, {axisFT0C, axisPtCoarse, axisNsigmaTPC}); - histos.add(Form("%s/h3dPosTPCsignal", kParticlenames[partID].data()), "h3dPosTPCsignal", kTH3F, {axisFT0C, axisPtCoarse, axisTPCsignal}); - histos.add(Form("%s/h3dNegTPCsignal", kParticlenames[partID].data()), "h3dNegTPCsignal", kTH3F, {axisFT0C, axisPtCoarse, axisTPCsignal}); + histos.add(Form("%s/h3dPosNsigmaTPC", kParticlenames[partID].data()), "h3dPosNsigmaTPC", kTH3F, {axisDetectors.axisFT0ampl, axisPtCoarse, axisNsigmaTPC}); + histos.add(Form("%s/h3dNegNsigmaTPC", kParticlenames[partID].data()), "h3dNegNsigmaTPC", kTH3F, {axisDetectors.axisFT0ampl, axisPtCoarse, axisNsigmaTPC}); + histos.add(Form("%s/h3dPosTPCsignal", kParticlenames[partID].data()), "h3dPosTPCsignal", kTH3F, {axisDetectors.axisFT0ampl, axisPtCoarse, axisTPCsignal}); + histos.add(Form("%s/h3dNegTPCsignal", kParticlenames[partID].data()), "h3dNegTPCsignal", kTH3F, {axisDetectors.axisFT0ampl, axisPtCoarse, axisTPCsignal}); - histos.add(Form("%s/h3dPosNsigmaTPCvsTrackPtot", kParticlenames[partID].data()), "h3dPosNsigmaTPCvsTrackPtot", kTH3F, {axisFT0C, axisPtCoarse, axisNsigmaTPC}); - histos.add(Form("%s/h3dNegNsigmaTPCvsTrackPtot", kParticlenames[partID].data()), "h3dNegNsigmaTPCvsTrackPtot", kTH3F, {axisFT0C, axisPtCoarse, axisNsigmaTPC}); + histos.add(Form("%s/h3dPosNsigmaTPCvsTrackPtot", kParticlenames[partID].data()), "h3dPosNsigmaTPCvsTrackPtot", kTH3F, {axisDetectors.axisFT0ampl, axisPtCoarse, axisNsigmaTPC}); + histos.add(Form("%s/h3dNegNsigmaTPCvsTrackPtot", kParticlenames[partID].data()), "h3dNegNsigmaTPCvsTrackPtot", kTH3F, {axisDetectors.axisFT0ampl, axisPtCoarse, axisNsigmaTPC}); - histos.add(Form("%s/h3dPosTPCsignalVsTrackPtot", kParticlenames[partID].data()), "h3dPosTPCsignalVsTrackPtot", kTH3F, {axisFT0C, axisPtCoarse, axisTPCsignal}); - histos.add(Form("%s/h3dNegTPCsignalVsTrackPtot", kParticlenames[partID].data()), "h3dNegTPCsignalVsTrackPtot", kTH3F, {axisFT0C, axisPtCoarse, axisTPCsignal}); + histos.add(Form("%s/h3dPosTPCsignalVsTrackPtot", kParticlenames[partID].data()), "h3dPosTPCsignalVsTrackPtot", kTH3F, {axisDetectors.axisFT0ampl, axisPtCoarse, axisTPCsignal}); + histos.add(Form("%s/h3dNegTPCsignalVsTrackPtot", kParticlenames[partID].data()), "h3dNegTPCsignalVsTrackPtot", kTH3F, {axisDetectors.axisFT0ampl, axisPtCoarse, axisTPCsignal}); - histos.add(Form("%s/h3dPosNsigmaTPCvsTrackPt", kParticlenames[partID].data()), "h3dPosNsigmaTPCvsTrackPt", kTH3F, {axisFT0C, axisPtCoarse, axisNsigmaTPC}); - histos.add(Form("%s/h3dNegNsigmaTPCvsTrackPt", kParticlenames[partID].data()), "h3dNegNsigmaTPCvsTrackPt", kTH3F, {axisFT0C, axisPtCoarse, axisNsigmaTPC}); + histos.add(Form("%s/h3dPosNsigmaTPCvsTrackPt", kParticlenames[partID].data()), "h3dPosNsigmaTPCvsTrackPt", kTH3F, {axisDetectors.axisFT0ampl, axisPtCoarse, axisNsigmaTPC}); + histos.add(Form("%s/h3dNegNsigmaTPCvsTrackPt", kParticlenames[partID].data()), "h3dNegNsigmaTPCvsTrackPt", kTH3F, {axisDetectors.axisFT0ampl, axisPtCoarse, axisNsigmaTPC}); - histos.add(Form("%s/h3dPosTPCsignalVsTrackPt", kParticlenames[partID].data()), "h3dPosTPCsignalVsTrackPt", kTH3F, {axisFT0C, axisPtCoarse, axisTPCsignal}); - histos.add(Form("%s/h3dNegTPCsignalVsTrackPt", kParticlenames[partID].data()), "h3dNegTPCsignalVsTrackPt", kTH3F, {axisFT0C, axisPtCoarse, axisTPCsignal}); + histos.add(Form("%s/h3dPosTPCsignalVsTrackPt", kParticlenames[partID].data()), "h3dPosTPCsignalVsTrackPt", kTH3F, {axisDetectors.axisFT0ampl, axisPtCoarse, axisTPCsignal}); + histos.add(Form("%s/h3dNegTPCsignalVsTrackPt", kParticlenames[partID].data()), "h3dNegTPCsignalVsTrackPt", kTH3F, {axisDetectors.axisFT0ampl, axisPtCoarse, axisTPCsignal}); if (isCascade) { - histos.add(Form("%s/h3dBachTPCsignal", kParticlenames[partID].data()), "h3dBachTPCsignal", kTH3F, {axisFT0C, axisPtCoarse, axisTPCsignal}); - histos.add(Form("%s/h3dBachNsigmaTPC", kParticlenames[partID].data()), "h3dBachNsigmaTPC", kTH3F, {axisFT0C, axisPtCoarse, axisNsigmaTPC}); - histos.add(Form("%s/h3dBachNsigmaTPCvsTrackPtot", kParticlenames[partID].data()), "h3dBachNsigmaTPCvsTrackPtot", kTH3F, {axisFT0C, axisPtCoarse, axisNsigmaTPC}); - histos.add(Form("%s/h3dBachTPCsignalVsTrackPtot", kParticlenames[partID].data()), "h3dBachTPCsignalVsTrackPtot", kTH3F, {axisFT0C, axisPtCoarse, axisTPCsignal}); - histos.add(Form("%s/h3dBachNsigmaTPCvsTrackPt", kParticlenames[partID].data()), "h3dBachNsigmaTPCvsTrackPt", kTH3F, {axisFT0C, axisPtCoarse, axisNsigmaTPC}); - histos.add(Form("%s/h3dBachTPCsignalVsTrackPt", kParticlenames[partID].data()), "h3dBachTPCsignalVsTrackPt", kTH3F, {axisFT0C, axisPtCoarse, axisTPCsignal}); + histos.add(Form("%s/h3dBachTPCsignal", kParticlenames[partID].data()), "h3dBachTPCsignal", kTH3F, {axisDetectors.axisFT0ampl, axisPtCoarse, axisTPCsignal}); + histos.add(Form("%s/h3dBachNsigmaTPC", kParticlenames[partID].data()), "h3dBachNsigmaTPC", kTH3F, {axisDetectors.axisFT0ampl, axisPtCoarse, axisNsigmaTPC}); + histos.add(Form("%s/h3dBachNsigmaTPCvsTrackPtot", kParticlenames[partID].data()), "h3dBachNsigmaTPCvsTrackPtot", kTH3F, {axisDetectors.axisFT0ampl, axisPtCoarse, axisNsigmaTPC}); + histos.add(Form("%s/h3dBachTPCsignalVsTrackPtot", kParticlenames[partID].data()), "h3dBachTPCsignalVsTrackPtot", kTH3F, {axisDetectors.axisFT0ampl, axisPtCoarse, axisTPCsignal}); + histos.add(Form("%s/h3dBachNsigmaTPCvsTrackPt", kParticlenames[partID].data()), "h3dBachNsigmaTPCvsTrackPt", kTH3F, {axisDetectors.axisFT0ampl, axisPtCoarse, axisNsigmaTPC}); + histos.add(Form("%s/h3dBachTPCsignalVsTrackPt", kParticlenames[partID].data()), "h3dBachTPCsignalVsTrackPt", kTH3F, {axisDetectors.axisFT0ampl, axisPtCoarse, axisTPCsignal}); } } @@ -346,16 +365,16 @@ struct Derivedupcanalysis { void addTOFQAHistograms(HistogramRegistry& histos) { const bool isCascade = (partID > 2.5) ? true : false; - histos.add(Form("%s/h3dPosTOFdeltaT", kParticlenames[partID].data()), "h3dPosTOFdeltaT", kTH3F, {axisFT0C, axisPtCoarse, axisTOFdeltaT}); - histos.add(Form("%s/h3dNegTOFdeltaT", kParticlenames[partID].data()), "h3dNegTOFdeltaT", kTH3F, {axisFT0C, axisPtCoarse, axisTOFdeltaT}); - histos.add(Form("%s/h3dPosTOFdeltaTvsTrackPtot", kParticlenames[partID].data()), "h3dPosTOFdeltaTvsTrackPtot", kTH3F, {axisFT0C, axisPtCoarse, axisTOFdeltaT}); - histos.add(Form("%s/h3dNegTOFdeltaTvsTrackPtot", kParticlenames[partID].data()), "h3dNegTOFdeltaTvsTrackPtot", kTH3F, {axisFT0C, axisPtCoarse, axisTOFdeltaT}); - histos.add(Form("%s/h3dPosTOFdeltaTvsTrackPt", kParticlenames[partID].data()), "h3dPosTOFdeltaTvsTrackPt", kTH3F, {axisFT0C, axisPtCoarse, axisTOFdeltaT}); - histos.add(Form("%s/h3dNegTOFdeltaTvsTrackPt", kParticlenames[partID].data()), "h3dNegTOFdeltaTvsTrackPt", kTH3F, {axisFT0C, axisPtCoarse, axisTOFdeltaT}); + histos.add(Form("%s/h3dPosTOFdeltaT", kParticlenames[partID].data()), "h3dPosTOFdeltaT", kTH3F, {axisDetectors.axisFT0ampl, axisPtCoarse, axisTOFdeltaT}); + histos.add(Form("%s/h3dNegTOFdeltaT", kParticlenames[partID].data()), "h3dNegTOFdeltaT", kTH3F, {axisDetectors.axisFT0ampl, axisPtCoarse, axisTOFdeltaT}); + histos.add(Form("%s/h3dPosTOFdeltaTvsTrackPtot", kParticlenames[partID].data()), "h3dPosTOFdeltaTvsTrackPtot", kTH3F, {axisDetectors.axisFT0ampl, axisPtCoarse, axisTOFdeltaT}); + histos.add(Form("%s/h3dNegTOFdeltaTvsTrackPtot", kParticlenames[partID].data()), "h3dNegTOFdeltaTvsTrackPtot", kTH3F, {axisDetectors.axisFT0ampl, axisPtCoarse, axisTOFdeltaT}); + histos.add(Form("%s/h3dPosTOFdeltaTvsTrackPt", kParticlenames[partID].data()), "h3dPosTOFdeltaTvsTrackPt", kTH3F, {axisDetectors.axisFT0ampl, axisPtCoarse, axisTOFdeltaT}); + histos.add(Form("%s/h3dNegTOFdeltaTvsTrackPt", kParticlenames[partID].data()), "h3dNegTOFdeltaTvsTrackPt", kTH3F, {axisDetectors.axisFT0ampl, axisPtCoarse, axisTOFdeltaT}); if (isCascade) { - histos.add(Form("%s/h3dBachTOFdeltaT", kParticlenames[partID].data()), "h3dBachTOFdeltaT", kTH3F, {axisFT0C, axisPtCoarse, axisTOFdeltaT}); - histos.add(Form("%s/h3dBachTOFdeltaTvsTrackPtot", kParticlenames[partID].data()), "h3dBachTOFdeltaTvsTrackPtot", kTH3F, {axisFT0C, axisPtCoarse, axisTOFdeltaT}); - histos.add(Form("%s/h3dBachTOFdeltaTvsTrackPt", kParticlenames[partID].data()), "h3dBachTOFdeltaTvsTrackPt", kTH3F, {axisFT0C, axisPtCoarse, axisTOFdeltaT}); + histos.add(Form("%s/h3dBachTOFdeltaT", kParticlenames[partID].data()), "h3dBachTOFdeltaT", kTH3F, {axisDetectors.axisFT0ampl, axisPtCoarse, axisTOFdeltaT}); + histos.add(Form("%s/h3dBachTOFdeltaTvsTrackPtot", kParticlenames[partID].data()), "h3dBachTOFdeltaTvsTrackPtot", kTH3F, {axisDetectors.axisFT0ampl, axisPtCoarse, axisTOFdeltaT}); + histos.add(Form("%s/h3dBachTOFdeltaTvsTrackPt", kParticlenames[partID].data()), "h3dBachTOFdeltaTvsTrackPt", kTH3F, {axisDetectors.axisFT0ampl, axisPtCoarse, axisTOFdeltaT}); } } @@ -377,30 +396,30 @@ struct Derivedupcanalysis { const bool isCascade = (partID > 2.5) ? true : false; if (doDetectPropQA == 1) { if (isCascade) { - histos.add(Form("%s/h8dDetectPropVsCentrality", kParticlenames[partID].data()), "h8dDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse}); + histos.add(Form("%s/h8dDetectPropVsCentrality", kParticlenames[partID].data()), "h8dDetectPropVsCentrality", kTHnSparseF, {axisDetectors.axisFT0ampl, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse}); } else { - histos.add(Form("%s/h6dDetectPropVsCentrality", kParticlenames[partID].data()), "h6dDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse}); + histos.add(Form("%s/h6dDetectPropVsCentrality", kParticlenames[partID].data()), "h6dDetectPropVsCentrality", kTHnSparseF, {axisDetectors.axisFT0ampl, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse}); } - histos.add(Form("%s/h4dPosDetectPropVsCentrality", kParticlenames[partID].data()), "h4dPosDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMap, axisITScluMap, axisPtCoarse}); - histos.add(Form("%s/h4dNegDetectPropVsCentrality", kParticlenames[partID].data()), "h4dNegDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMap, axisITScluMap, axisPtCoarse}); - histos.add(Form("%s/h4dBachDetectPropVsCentrality", kParticlenames[partID].data()), "h4dBachDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMap, axisITScluMap, axisPtCoarse}); + histos.add(Form("%s/h4dPosDetectPropVsCentrality", kParticlenames[partID].data()), "h4dPosDetectPropVsCentrality", kTHnSparseF, {axisDetectors.axisFT0ampl, axisDetMap, axisITScluMap, axisPtCoarse}); + histos.add(Form("%s/h4dNegDetectPropVsCentrality", kParticlenames[partID].data()), "h4dNegDetectPropVsCentrality", kTHnSparseF, {axisDetectors.axisFT0ampl, axisDetMap, axisITScluMap, axisPtCoarse}); + histos.add(Form("%s/h4dBachDetectPropVsCentrality", kParticlenames[partID].data()), "h4dBachDetectPropVsCentrality", kTHnSparseF, {axisDetectors.axisFT0ampl, axisDetMap, axisITScluMap, axisPtCoarse}); } if (doDetectPropQA == 2) { if (isCascade) { - histos.add(Form("%s/h9dDetectPropVsCentrality", kParticlenames[partID].data()), "h9dDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse, axisInvMass.at(partID)}); + histos.add(Form("%s/h9dDetectPropVsCentrality", kParticlenames[partID].data()), "h9dDetectPropVsCentrality", kTHnSparseF, {axisDetectors.axisFT0ampl, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse, axisInvMass.at(partID)}); } else { - histos.add(Form("%s/h7dDetectPropVsCentrality", kParticlenames[partID].data()), "h7dDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse, axisInvMass.at(partID)}); + histos.add(Form("%s/h7dDetectPropVsCentrality", kParticlenames[partID].data()), "h7dDetectPropVsCentrality", kTHnSparseF, {axisDetectors.axisFT0ampl, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse, axisInvMass.at(partID)}); } - histos.add(Form("%s/h5dPosDetectPropVsCentrality", kParticlenames[partID].data()), "h5dPosDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMap, axisITScluMap, axisPtCoarse, axisInvMass.at(partID)}); - histos.add(Form("%s/h5dNegDetectPropVsCentrality", kParticlenames[partID].data()), "h5dNegDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMap, axisITScluMap, axisPtCoarse, axisInvMass.at(partID)}); - histos.add(Form("%s/h5dBachDetectPropVsCentrality", kParticlenames[partID].data()), "h5dBachDetectPropVsCentrality", kTHnSparseF, {axisFT0C, axisDetMap, axisITScluMap, axisPtCoarse, axisInvMass.at(partID)}); + histos.add(Form("%s/h5dPosDetectPropVsCentrality", kParticlenames[partID].data()), "h5dPosDetectPropVsCentrality", kTHnSparseF, {axisDetectors.axisFT0ampl, axisDetMap, axisITScluMap, axisPtCoarse, axisInvMass.at(partID)}); + histos.add(Form("%s/h5dNegDetectPropVsCentrality", kParticlenames[partID].data()), "h5dNegDetectPropVsCentrality", kTHnSparseF, {axisDetectors.axisFT0ampl, axisDetMap, axisITScluMap, axisPtCoarse, axisInvMass.at(partID)}); + histos.add(Form("%s/h5dBachDetectPropVsCentrality", kParticlenames[partID].data()), "h5dBachDetectPropVsCentrality", kTHnSparseF, {axisDetectors.axisFT0ampl, axisDetMap, axisITScluMap, axisPtCoarse, axisInvMass.at(partID)}); } } template void addHistograms(HistogramRegistry& histos) { - histos.add(Form("%s/h7dMass", kParticlenames[partID].data()), "h7dMass", kTHnSparseF, {axisFT0C, axisPt, axisInvMass.at(partID), axisSelGap, axisNchInvMass, axisRap, axisEta}); + histos.add(Form("%s/h7dMass", kParticlenames[partID].data()), "h7dMass", kTHnSparseF, {axisDetectors.axisFT0ampl, axisPt, axisInvMass.at(partID), axisSelGap, axisNchInvMass, axisRap, axisEta}); histos.add(Form("%s/h2dMass", kParticlenames[partID].data()), "h2dMass", kTH2F, {axisInvMass.at(partID), axisSelGap}); if (doPlainTopoQA) { addTopoHistograms(histos); @@ -421,10 +440,18 @@ struct Derivedupcanalysis { void fillHistogramsV0(TCand cand, TCollision coll, int gap) { float invMass = 0; - float centrality = coll.centFT0C(); + float ft0ampl = -1.f; + if (gap == 0) { + ft0ampl = coll.totalFT0AmplitudeC(); + } else if (gap == 1) { + ft0ampl = coll.totalFT0AmplitudeA(); + } float pT = cand.pt(); float rapidity = 1e6; + // c x tau + float ctau = 0; + float tpcNsigmaPos = 0; float tpcNsigmaNeg = 0; float tofDeltaTPos = 0; @@ -445,6 +472,7 @@ struct Derivedupcanalysis { histos.fill(HIST("generalQA/h2dArmenterosSelected"), cand.alpha(), cand.qtarm()); invMass = cand.mK0Short(); rapidity = cand.yK0Short(); + ctau = cand.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * o2::constants::physics::MassK0Short; if (PIDConfigurations.doTOFQA) { tofDeltaTPos = cand.posTOFDeltaTK0Pi(); tofDeltaTNeg = cand.negTOFDeltaTK0Pi(); @@ -456,6 +484,7 @@ struct Derivedupcanalysis { } else if (partID == 1) { invMass = cand.mLambda(); rapidity = cand.yLambda(); + ctau = cand.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * o2::constants::physics::MassLambda0; if (PIDConfigurations.doTOFQA) { tofDeltaTPos = cand.posTOFDeltaTLaPr(); tofDeltaTNeg = cand.negTOFDeltaTLaPi(); @@ -467,6 +496,7 @@ struct Derivedupcanalysis { } else if (partID == 2) { invMass = cand.mAntiLambda(); rapidity = cand.yLambda(); + ctau = cand.distovertotmom(coll.posX(), coll.posY(), coll.posZ()) * o2::constants::physics::MassLambda0Bar; if (PIDConfigurations.doTOFQA) { tofDeltaTPos = cand.posTOFDeltaTLaPi(); tofDeltaTNeg = cand.negTOFDeltaTLaPr(); @@ -480,7 +510,7 @@ struct Derivedupcanalysis { } histos.fill(HIST(kParticlenames[partID]) + HIST("/h2dMass"), invMass, gap); - histos.fill(HIST(kParticlenames[partID]) + HIST("/h7dMass"), centrality, pT, invMass, gap, coll.multNTracksGlobal(), rapidity, cand.eta()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h7dMass"), ft0ampl, pT, invMass, gap, coll.multNTracksGlobal(), rapidity, cand.eta()); if (doKienmaticQA) { histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosEtaPt"), pT, cand.positiveeta(), gap); histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegEtaPt"), pT, cand.negativeeta(), gap); @@ -491,49 +521,56 @@ struct Derivedupcanalysis { histos.fill(HIST(kParticlenames[partID]) + HIST("/hNegDCAToPV"), cand.dcanegtopv()); histos.fill(HIST(kParticlenames[partID]) + HIST("/hDCADaughters"), cand.dcaV0daughters()); histos.fill(HIST(kParticlenames[partID]) + HIST("/hPointingAngle"), std::acos(cand.v0cosPA())); + histos.fill(HIST(kParticlenames[partID]) + HIST("/hCosPA"), cand.v0cosPA()); histos.fill(HIST(kParticlenames[partID]) + HIST("/hV0Radius"), cand.v0radius()); histos.fill(HIST(kParticlenames[partID]) + HIST("/h2dPositiveITSvsTPCpts"), posTrackExtra.tpcCrossedRows(), posTrackExtra.itsNCls()); histos.fill(HIST(kParticlenames[partID]) + HIST("/h2dNegativeITSvsTPCpts"), negTrackExtra.tpcCrossedRows(), negTrackExtra.itsNCls()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/hCtau"), pT, ctau); } if (doDetectPropQA == 1) { - histos.fill(HIST(kParticlenames[partID]) + HIST("/h6dDetectPropVsCentrality"), centrality, posDetMap, posITSclusMap, negDetMap, negITSclusMap, pT); - histos.fill(HIST(kParticlenames[partID]) + HIST("/h4dPosDetectPropVsCentrality"), centrality, posTrackExtra.detectorMap(), posTrackExtra.itsClusterMap(), pT); - histos.fill(HIST(kParticlenames[partID]) + HIST("/h4dNegDetectPropVsCentrality"), centrality, negTrackExtra.detectorMap(), negTrackExtra.itsClusterMap(), pT); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h6dDetectPropVsCentrality"), ft0ampl, posDetMap, posITSclusMap, negDetMap, negITSclusMap, pT); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h4dPosDetectPropVsCentrality"), ft0ampl, posTrackExtra.detectorMap(), posTrackExtra.itsClusterMap(), pT); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h4dNegDetectPropVsCentrality"), ft0ampl, negTrackExtra.detectorMap(), negTrackExtra.itsClusterMap(), pT); } if (doDetectPropQA == 2) { - histos.fill(HIST(kParticlenames[partID]) + HIST("/h7dPosDetectPropVsCentrality"), centrality, posDetMap, posITSclusMap, negDetMap, negITSclusMap, pT, invMass); - histos.fill(HIST(kParticlenames[partID]) + HIST("/h5dPosDetectPropVsCentrality"), centrality, posTrackExtra.detectorMap(), posTrackExtra.itsClusterMap(), pT, invMass); - histos.fill(HIST(kParticlenames[partID]) + HIST("/h5dNegDetectPropVsCentrality"), centrality, negTrackExtra.detectorMap(), negTrackExtra.itsClusterMap(), pT, invMass); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h7dPosDetectPropVsCentrality"), ft0ampl, posDetMap, posITSclusMap, negDetMap, negITSclusMap, pT, invMass); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h5dPosDetectPropVsCentrality"), ft0ampl, posTrackExtra.detectorMap(), posTrackExtra.itsClusterMap(), pT, invMass); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h5dNegDetectPropVsCentrality"), ft0ampl, negTrackExtra.detectorMap(), negTrackExtra.itsClusterMap(), pT, invMass); } if (PIDConfigurations.doTPCQA) { - histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosTPCsignal"), centrality, pT, posTrackExtra.tpcSignal()); - histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegTPCsignal"), centrality, pT, negTrackExtra.tpcSignal()); - histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosTPCsignalVsTrackPtot"), centrality, cand.positivept() * std::cosh(cand.positiveeta()), posTrackExtra.tpcSignal()); - histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegTPCsignalVsTrackPtot"), centrality, cand.negativept() * std::cosh(cand.negativeeta()), negTrackExtra.tpcSignal()); - histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosTPCsignalVsTrackPt"), centrality, cand.positivept(), posTrackExtra.tpcSignal()); - histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegTPCsignalVsTrackPt"), centrality, cand.negativept(), negTrackExtra.tpcSignal()); - histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosNsigmaTPCvsTrackPt"), centrality, cand.positivept(), posTrackExtra.tpcNSigmaPi()); - histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegNsigmaTPCvsTrackPt"), centrality, cand.negativept(), negTrackExtra.tpcNSigmaPi()); - histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosNsigmaTPCvsTrackPtot"), centrality, cand.positivept() * std::cosh(cand.positiveeta()), tpcNsigmaPos); - histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegNsigmaTPCvsTrackPtot"), centrality, cand.negativept() * std::cosh(cand.negativeeta()), tpcNsigmaNeg); - histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosNsigmaTPC"), centrality, pT, tpcNsigmaPos); - histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegNsigmaTPC"), centrality, pT, tpcNsigmaNeg); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosTPCsignal"), ft0ampl, pT, posTrackExtra.tpcSignal()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegTPCsignal"), ft0ampl, pT, negTrackExtra.tpcSignal()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosTPCsignalVsTrackPtot"), ft0ampl, cand.positivept() * std::cosh(cand.positiveeta()), posTrackExtra.tpcSignal()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegTPCsignalVsTrackPtot"), ft0ampl, cand.negativept() * std::cosh(cand.negativeeta()), negTrackExtra.tpcSignal()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosTPCsignalVsTrackPt"), ft0ampl, cand.positivept(), posTrackExtra.tpcSignal()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegTPCsignalVsTrackPt"), ft0ampl, cand.negativept(), negTrackExtra.tpcSignal()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosNsigmaTPCvsTrackPt"), ft0ampl, cand.positivept(), posTrackExtra.tpcNSigmaPi()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegNsigmaTPCvsTrackPt"), ft0ampl, cand.negativept(), negTrackExtra.tpcNSigmaPi()); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosNsigmaTPCvsTrackPtot"), ft0ampl, cand.positivept() * std::cosh(cand.positiveeta()), tpcNsigmaPos); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegNsigmaTPCvsTrackPtot"), ft0ampl, cand.negativept() * std::cosh(cand.negativeeta()), tpcNsigmaNeg); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosNsigmaTPC"), ft0ampl, pT, tpcNsigmaPos); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegNsigmaTPC"), ft0ampl, pT, tpcNsigmaNeg); } if (PIDConfigurations.doTOFQA) { - histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosTOFdeltaTvsTrackPt"), centrality, cand.positivept(), tofDeltaTPos); - histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegTOFdeltaTvsTrackPt"), centrality, cand.negativept(), tofDeltaTNeg); - histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosTOFdeltaT"), centrality, pT, tofDeltaTPos); - histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegTOFdeltaT"), centrality, pT, tofDeltaTNeg); - histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosTOFdeltaTvsTrackPtot"), centrality, cand.positivept() * std::cosh(cand.positiveeta()), tofDeltaTPos); - histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegTOFdeltaTvsTrackPtot"), centrality, cand.negativept() * std::cosh(cand.negativeeta()), tofDeltaTNeg); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosTOFdeltaTvsTrackPt"), ft0ampl, cand.positivept(), tofDeltaTPos); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegTOFdeltaTvsTrackPt"), ft0ampl, cand.negativept(), tofDeltaTNeg); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosTOFdeltaT"), ft0ampl, pT, tofDeltaTPos); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegTOFdeltaT"), ft0ampl, pT, tofDeltaTNeg); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosTOFdeltaTvsTrackPtot"), ft0ampl, cand.positivept() * std::cosh(cand.positiveeta()), tofDeltaTPos); + histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dNegTOFdeltaTvsTrackPtot"), ft0ampl, cand.negativept() * std::cosh(cand.negativeeta()), tofDeltaTNeg); } } template - void fillHistogramsCasc(TCand cand, TCollision coll, int gap) + void fillHistogramsCasc(TCand cand, TCollision coll, const int gap) { float invMass = 0; - float centrality = coll.centFT0C(); + float centrality = -1.f; + if (gap == 0) { + centrality = coll.totalFT0AmplitudeC(); + } else if (gap == 1) { + centrality = coll.totalFT0AmplitudeA(); + } float pT = cand.pt(); float rapidity = 1e6; @@ -649,7 +686,7 @@ struct Derivedupcanalysis { histos.fill(HIST(kParticlenames[partID]) + HIST("/hDCAV0Daughters"), pT, cand.dcaV0daughters()); histos.fill(HIST(kParticlenames[partID]) + HIST("/hDCAV0ToPV"), pT, std::fabs(cand.dcav0topv(coll.posX(), coll.posY(), coll.posZ()))); histos.fill(HIST(kParticlenames[partID]) + HIST("/hMassLambdaDau"), pT, cand.mLambda()); - histos.fill(HIST(kParticlenames[partID]) + HIST("/hNctau"), pT, ctau); + histos.fill(HIST(kParticlenames[partID]) + HIST("/hCtau"), pT, ctau); } if (PIDConfigurations.doTPCQA) { histos.fill(HIST(kParticlenames[partID]) + HIST("/h3dPosNsigmaTPC"), centrality, pT, tpcNsigmaPos); @@ -706,6 +743,8 @@ struct Derivedupcanalysis { LOG(fatal) << "Cannot analyze both data and MC simultaneously. Please select one of them."; } + rctChecker.init(evSels.cfgEvtRCTFlagCheckerLabel, evSels.cfgEvtRCTFlagCheckerZDCCheck, evSels.cfgEvtRCTFlagCheckerLimitAcceptAsBad); + // initialise bit masks setBits(maskTopologicalV0, {selV0CosPA, selDCANegToPV, selDCAPosToPV, selDCAV0Dau, selV0Radius, selV0RadiusMax}); setBits(maskTopologicalCasc, {selCascCosPA, selDCACascDau, selCascRadius, selCascRadiusMax, selBachToPV, selMesonToPV, selBaryonToPV, @@ -842,7 +881,7 @@ struct Derivedupcanalysis { secondaryMaskSelectionAntiLambda = maskTopologicalV0 | maskKinematicV0 | maskTrackPropertiesV0 | maskAntiLambdaSpecific; // Event Counter - histos.add("eventQA/hEventSelection", "hEventSelection", kTH1F, {{16, -0.5f, +15.5f}}); + histos.add("eventQA/hEventSelection", "hEventSelection", kTH1F, {{17, -0.5f, 16.5f}}); histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(1, "All collisions"); histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(2, "kIsTriggerTVX"); histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(3, "posZ cut"); @@ -857,20 +896,23 @@ struct Derivedupcanalysis { histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(12, "kNoCollInTimeRangeNarrow"); histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(13, "Below min occup."); histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(14, "Above max occup."); - histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(15, "isUPC"); - histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(16, "has UPC flag"); + histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(15, "RCTFlagsChecker"); + histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(16, "isUPC"); + histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(17, "has UPC flag"); // Event QA + histos.add("eventQA/hCentralityVsFT0ampl", "hCentralityVsFT0ampl", kTH3F, {axisFT0Cqa, axisDetectors.axisFT0Aampl, axisSelGap}); histos.add("eventQA/hCentrality", "hCentrality", kTH2F, {axisFT0Cqa, axisSelGap}); + histos.add("eventQA/hFT0ampl", "hFT0ampl", kTH2F, {axisDetectors.axisFT0Aampl, axisSelGap}); histos.add("eventQA/hCentralityVsTracksPVeta1", "hCentralityVsTracksPVeta1", kTH3F, {axisFT0Cqa, axisNTracksPVeta1, axisSelGap}); histos.add("eventQA/hCentralityVsTracksTotalExceptITSonly", "hCentralityVsTracksTotalExceptITSonly", kTH3F, {axisFT0Cqa, axisNTracksTotalExceptITSonly, axisSelGap}); histos.add("eventQA/hOccupancy", "hOccupancy", kTH2F, {axisOccupancy, axisSelGap}); histos.add("eventQA/hCentralityVsOccupancy", "hCentralityVsOccupancy", kTH3F, {axisFT0Cqa, axisOccupancy, axisSelGap}); histos.add("eventQA/hTracksPVeta1VsTracksGlobal", "hTracksPVeta1VsTracksGlobal", kTH3F, {axisNTracksPVeta1, axisNTracksGlobal, axisSelGap}); histos.add("eventQA/hCentralityVsTracksGlobal", "hCentralityVsTracksGlobal", kTH3F, {axisFT0Cqa, axisNTracksGlobal, axisSelGap}); - histos.add("eventQA/hGapSide", "Gap side; Entries", kTH1F, {{5, -0.5, 4.5}}); + histos.add("eventQA/hFT0amplVsTracksGlobal", "hFT0amplVsTracksGlobal", kTH3F, {axisDetectors.axisFT0Aampl, axisNTracksGlobal, axisSelGap}); histos.add("eventQA/hRawGapSide", "Raw Gap side; Entries", kTH1F, {{6, -1.5, 4.5}}); - histos.add("eventQA/hSelGapSide", "Selected gap side; Entries", kTH1F, {axisSelGap}); + histos.add("eventQA/hSelGapSide", "Selected gap side (with n); Entries", kTH1F, {axisSelGap}); histos.add("eventQA/hPosX", "Vertex position in x", kTH2F, {{100, -0.1, 0.1}, axisSelGap}); histos.add("eventQA/hPosY", "Vertex position in y", kTH2F, {{100, -0.1, 0.1}, axisSelGap}); histos.add("eventQA/hPosZ", "Vertex position in z", kTH2F, {{100, -20., 20.}, axisSelGap}); @@ -883,34 +925,36 @@ struct Derivedupcanalysis { histos.get(HIST("eventQA/mc/hEventSelectionMC"))->GetXaxis()->SetBinLabel(1, "All collisions"); histos.get(HIST("eventQA/mc/hEventSelectionMC"))->GetXaxis()->SetBinLabel(2, "posZ cut"); histos.get(HIST("eventQA/mc/hEventSelectionMC"))->GetXaxis()->SetBinLabel(3, "rec. at least once"); - - histos.add("eventQA/mc/hTracksGlobalvsMCNParticlesEta10gen", "hTracksGlobalvsMCNParticlesEta10gen", kTH2F, {axisNTracksGlobal, axisNTracksPVeta1}); + histos.add("eventQA/mc/hTracksGlobalvsMCNParticlesEta08gen", "hTracksGlobalvsMCNParticlesEta08gen", kTH2F, {axisNTracksGlobal, axisNTracksGlobal}); histos.add("eventQA/mc/hTracksGlobalVsNcoll_beforeEvSel", "hTracksGlobalVsNcoll_beforeEvSel", kTH2F, {axisNTracksGlobal, axisNAssocColl}); histos.add("eventQA/mc/hTracksGlobalVsNcoll_afterEvSel", "hTracksGlobalVsNcoll_afterEvSel", kTH2F, {axisNTracksGlobal, axisNAssocColl}); histos.add("eventQA/mc/hTracksGlobalVsPVzMC", "hTracksGlobalVsPVzMC", kTH2F, {axisNTracksGlobal, {100, -20., 20.}}); histos.add("eventQA/mc/hEventPVzMC", "hEventPVzMC", kTH1F, {{100, -20., 20.}}); + histos.add("eventQA/mc/hGenEventFT0ampl", "hGenEventFT0ampl", kTH1F, {axisDetectors.axisFT0Aampl}); histos.add("eventQA/mc/hGenEventCentrality", "hGenEventCentrality", kTH1F, {axisFT0Cqa}); + histos.add("eventQA/mc/hGeneratorsId", "hGeneratorsId", kTH1F, {axisGeneratorIds}); } if (doprocessV0sMC || doprocessCascadesMC) { // Event QA histos.add("eventQA/mc/hFakeEvents", "hFakeEvents", {kTH1F, {{1, -0.5f, 0.5f}}}); - histos.add("eventQA/mc/hNTracksGlobalvsMCNParticlesEta10rec", "hNTracksGlobalvsMCNParticlesEta10rec", kTH2F, {axisNTracksGlobal, axisNTracksPVeta1}); + histos.add("eventQA/mc/hNTracksGlobalvsMCNParticlesEta08rec", "hNTracksGlobalvsMCNParticlesEta08rec", kTH2F, {axisNTracksGlobal, axisNTracksGlobal}); histos.add("eventQA/mc/hNTracksPVeta1vsMCNParticlesEta10rec", "hNTracksPVeta1vsMCNParticlesEta10rec", kTH2F, {axisNTracksPVeta1, axisNTracksPVeta1}); histos.add("eventQA/mc/hNTracksGlobalvstotalMultMCParticles", "hNTracksGlobalvstotalMultMCParticles", kTH2F, {axisNTracksGlobal, axisNchInvMass}); histos.add("eventQA/mc/hNTracksPVeta1vstotalMultMCParticles", "hNTracksPVeta1vstotalMultMCParticles", kTH2F, {axisNTracksPVeta1, axisNchInvMass}); + histos.add("eventQA/hSelGapSideNoNeutrons", "Selected gap side (no n); Entries", kTH1F, {{5, -0.5, 4.5}}); } if (doprocessV0sMC) { if (analyseLambda && calculateFeeddownMatrix) - histos.add(Form("%s/h3dLambdaFeeddown", kParticlenames[1].data()), "h3dLambdaFeeddown", kTH3F, {axisNTracksGlobal, axisPt, axisPtXi}); + histos.add(Form("%s/h3dLambdaFeeddown", kParticlenames[1].data()), "h3dLambdaFeeddown", kTH3F, {axisNTracksGlobal, axisPt, axisPt}); if (analyseAntiLambda && calculateFeeddownMatrix) - histos.add(Form("%s/h3dAntiLambdaFeeddown", kParticlenames[2].data()), "h3dAntiLambdaFeeddown", kTH3F, {axisNTracksGlobal, axisPt, axisPtXi}); + histos.add(Form("%s/h3dAntiLambdaFeeddown", kParticlenames[2].data()), "h3dAntiLambdaFeeddown", kTH3F, {axisNTracksGlobal, axisPt, axisPt}); } if (doprocessGenerated) { for (int partID = 0; partID <= 6; partID++) { - histos.add(Form("%s/mc/h7dGen", kParticlenames[partID].data()), "h7dGen", kTHnSparseF, {axisFT0Cqa, axisNchInvMass, axisNchInvMass, axisPt, axisSelGap, axisRap, axisGeneratorIds}); + histos.add(Form("%s/mc/h7dGen", kParticlenames[partID].data()), "h7dGen", kTHnSparseF, {axisDetectors.axisFT0ampl, axisNchInvMass, axisNchInvMass, axisPt, axisSelGap, axisRap, axisGeneratorIds}); } } @@ -922,6 +966,7 @@ struct Derivedupcanalysis { histos.add("generalQA/hNegDCAToPV", "hNegDCAToPV", kTH1F, {axisDCAtoPV}); histos.add("generalQA/hDCADaughters", "hDCADaughters", kTH1F, {axisDCAdau}); histos.add("generalQA/hPointingAngle", "hPointingAngle", kTH1F, {axisPointingAngle}); + histos.add("generalQA/hCosPA", "hCosPA", kTH1F, {axisCosPA}); histos.add("generalQA/hV0Radius", "hV0Radius", kTH1F, {axisV0Radius}); histos.add("generalQA/h2dPositiveITSvsTPCpts", "h2dPositiveITSvsTPCpts", kTH2F, {axisTPCrows, axisITSclus}); histos.add("generalQA/h2dNegativeITSvsTPCpts", "h2dNegativeITSvsTPCpts", kTH2F, {axisTPCrows, axisITSclus}); @@ -992,16 +1037,9 @@ struct Derivedupcanalysis { } template - int getGapSide(TCollision const& collision, bool fillQA) + int getGapSide(TCollision const& collision) { int selGapSide = sgSelector.trueGap(collision, upcCuts.fv0a, upcCuts.ft0a, upcCuts.ft0c, upcCuts.zdc); - if (fillQA) { - histos.fill(HIST("eventQA/hGapSide"), collision.gapSide()); - histos.fill(HIST("eventQA/hSelGapSide"), selGapSide); - histos.fill(HIST("eventQA/hFT0"), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), selGapSide); - histos.fill(HIST("eventQA/hFDD"), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), selGapSide); - histos.fill(HIST("eventQA/hZN"), collision.energyCommonZNA(), collision.energyCommonZNC(), selGapSide); - } return selGapSide; } @@ -1010,16 +1048,32 @@ struct Derivedupcanalysis { { // QA histograms float centrality = collision.centFT0C(); + float ft0ampl = -1.f; + + if (gap == 0) { + ft0ampl = collision.totalFT0AmplitudeC(); + } else if (gap == 1) { + ft0ampl = collision.totalFT0AmplitudeA(); + } + + histos.fill(HIST("eventQA/hCentralityVsFT0ampl"), centrality, ft0ampl, gap); histos.fill(HIST("eventQA/hCentrality"), centrality, gap); + histos.fill(HIST("eventQA/hFT0ampl"), ft0ampl, gap); histos.fill(HIST("eventQA/hCentralityVsTracksTotalExceptITSonly"), centrality, collision.multAllTracksTPCOnly() + collision.multAllTracksITSTPC(), gap); histos.fill(HIST("eventQA/hCentralityVsTracksPVeta1"), centrality, collision.multNTracksPVeta1(), gap); histos.fill(HIST("eventQA/hOccupancy"), collision.trackOccupancyInTimeRange(), gap); histos.fill(HIST("eventQA/hCentralityVsOccupancy"), centrality, collision.trackOccupancyInTimeRange(), gap); histos.fill(HIST("eventQA/hTracksPVeta1VsTracksGlobal"), collision.multNTracksPVeta1(), collision.multNTracksGlobal(), gap); histos.fill(HIST("eventQA/hCentralityVsTracksGlobal"), centrality, collision.multNTracksGlobal(), gap); + histos.fill(HIST("eventQA/hFT0amplVsTracksGlobal"), ft0ampl, collision.multNTracksGlobal(), gap); histos.fill(HIST("eventQA/hPosX"), collision.posX(), gap); histos.fill(HIST("eventQA/hPosY"), collision.posY(), gap); histos.fill(HIST("eventQA/hPosZ"), collision.posZ(), gap); + + histos.fill(HIST("eventQA/hSelGapSide"), gap); + histos.fill(HIST("eventQA/hFT0"), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), gap); + histos.fill(HIST("eventQA/hFDD"), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), gap); + histos.fill(HIST("eventQA/hZN"), collision.energyCommonZNA(), collision.energyCommonZNC(), gap); } template @@ -1031,44 +1085,45 @@ struct Derivedupcanalysis { float qaBin; }; - const std::array checks = {{ - {true, true, 0.0}, // All collisions - {requireIsTriggerTVX, collision.selection_bit(aod::evsel::kIsTriggerTVX), 1.0}, // Triggered by FT0M - {true, std::fabs(collision.posZ()) < maxZVtxPosition, 2.0}, // Vertex-Z selected - {rejectITSROFBorder, collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder), 3.0}, // Not at ITS ROF border - {rejectTFBorder, collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder), 4.0}, // Not at TF border - {requireIsVertexITSTPC, collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC), 5.0}, // At least one ITS-TPC track - {requireIsGoodZvtxFT0VsPV, collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV), 6.0}, // PV position consistency - {requireIsVertexTOFmatched, collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched), 7.0}, // PV with TOF match - {requireIsVertexTRDmatched, collision.selection_bit(o2::aod::evsel::kIsVertexTRDmatched), 8.0}, // PV with TRD match - {rejectSameBunchPileup, collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup), 9.0}, // No same-bunch pileup - {requireNoCollInTimeRangeStd, collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard), 10.0}, // No collision within +-10 µs - {requireNoCollInTimeRangeNarrow, collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeNarrow), 11.0}, // No collision within +-4 µs - {minOccupancy >= 0, collision.trackOccupancyInTimeRange() >= minOccupancy, 12.0}, // Above min occupancy - {maxOccupancy > 0, collision.trackOccupancyInTimeRange() < maxOccupancy, 13.0}, // Below max occupancy + const std::array selections = {{ + {true, true, 0.0}, // All collisions + {evSels.requireIsTriggerTVX, collision.selection_bit(aod::evsel::kIsTriggerTVX), 1.0}, // Triggered by FT0M + {true, std::fabs(collision.posZ()) < maxZVtxPosition, 2.0}, // Vertex-Z selected + {evSels.rejectITSROFBorder, collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder), 3.0}, // Not at ITS ROF border + {evSels.rejectTFBorder, collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder), 4.0}, // Not at TF border + {evSels.requireIsVertexITSTPC, collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC), 5.0}, // At least one ITS-TPC track + {evSels.requireIsGoodZvtxFT0VsPV, collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV), 6.0}, // PV position consistency + {evSels.requireIsVertexTOFmatched, collision.selection_bit(o2::aod::evsel::kIsVertexTOFmatched), 7.0}, // PV with TOF match + {evSels.requireIsVertexTRDmatched, collision.selection_bit(o2::aod::evsel::kIsVertexTRDmatched), 8.0}, // PV with TRD match + {evSels.rejectSameBunchPileup, collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup), 9.0}, // No same-bunch pileup + {evSels.requireNoCollInTimeRangeStd, collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard), 10.0}, // No collision within +-10 µs + {evSels.requireNoCollInTimeRangeNarrow, collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeNarrow), 11.0}, // No collision within +-4 µs + {minOccupancy >= 0, collision.trackOccupancyInTimeRange() >= minOccupancy, 12.0}, // Above min occupancy + {maxOccupancy > 0, collision.trackOccupancyInTimeRange() < maxOccupancy, 13.0}, // Below max occupancy + {evSels.requireRCTFlagChecker, rctChecker(collision), 14.0}, // Verify collision in RCT }}; - for (const auto& check : checks) { - if (check.selection && !check.condition) { + for (const auto& sel : selections) { + if (sel.selection && !sel.condition) { return false; } - if (fillQA && check.selection) { - histos.fill(HIST("eventQA/hEventSelection"), check.qaBin); + if (fillQA && sel.selection) { + histos.fill(HIST("eventQA/hEventSelection"), sel.qaBin); } } - if (studyUPConly && !collision.isUPC()) { + if (evSels.studyUPConly && !collision.isUPC()) { return false; } else if (collision.isUPC() && fillQA) { - histos.fill(HIST("eventQA/hEventSelection"), 14.0); // is UPC compatible + histos.fill(HIST("eventQA/hEventSelection"), 15.0); // is UPC compatible } // Additional check for UPC collision flag - if (useUPCflag && collision.flags() < 1) { + if (evSels.useUPCflag && collision.flags() < 1) { return false; } if (collision.flags() >= 1 && fillQA) { - histos.fill(HIST("eventQA/hEventSelection"), 15.0); // UPC event + histos.fill(HIST("eventQA/hEventSelection"), 16.0); // UPC event } return true; @@ -1383,6 +1438,10 @@ struct Derivedupcanalysis { if (std::fabs(v0.positiveeta()) < daughterEtaCut) bitMap.set(selPosEta); + // c x tau + float ctauK0short = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short; + float ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0; + auto posTrackExtra = v0.template posTrackExtra_as(); auto negTrackExtra = v0.template negTrackExtra_as(); @@ -1466,9 +1525,9 @@ struct Derivedupcanalysis { bitMap.set(selNegNotTPCOnly); // proper lifetime - if (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0 < lifetimecutV0->get("lifetimecutLambda")) + if (ctauLambda < nCtauCutV0->get("lifetimecutLambda") * ctaulambdaPDG) bitMap.set(selLambdaCTau); - if (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutV0->get("lifetimecutK0S")) + if (ctauK0short < nCtauCutV0->get("lifetimecutK0S") * ctauk0shortPDG) bitMap.set(selK0ShortCTau); // armenteros @@ -1630,6 +1689,7 @@ struct Derivedupcanalysis { histos.fill(HIST("generalQA/hNegDCAToPV"), v0.dcanegtopv()); histos.fill(HIST("generalQA/hDCADaughters"), v0.dcaV0daughters()); histos.fill(HIST("generalQA/hPointingAngle"), std::acos(v0.v0cosPA())); + histos.fill(HIST("generalQA/hCosPA"), v0.v0cosPA()); histos.fill(HIST("generalQA/hV0Radius"), v0.v0radius()); histos.fill(HIST("generalQA/h2dPositiveITSvsTPCpts"), posTrackExtra.tpcCrossedRows(), posTrackExtra.itsNCls()); histos.fill(HIST("generalQA/h2dNegativeITSvsTPCpts"), negTrackExtra.tpcCrossedRows(), negTrackExtra.itsNCls()); @@ -1654,9 +1714,11 @@ struct Derivedupcanalysis { } PresliceUnsorted perMcCollision = aod::v0data::straMCCollisionId; + PresliceUnsorted neutronsPerMcCollision = aod::zdcneutrons::straMCCollisionId; std::vector getListOfRecoCollIds(StraMCCollisionsFull const& mcCollisions, - StraCollisonsFullMC const& collisions) + StraCollisonsFullMC const& collisions, + NeutronsMC const& neutrons) { std::vector listBestCollisionIds(mcCollisions.size(), -1); @@ -1664,7 +1726,10 @@ struct Derivedupcanalysis { if (std::find(generatorIds->begin(), generatorIds->end(), mcCollision.generatorsID()) == generatorIds->end()) { continue; } + + // Group collisions and neutrons by MC collision index auto groupedCollisions = collisions.sliceBy(perMcCollision, mcCollision.globalIndex()); + auto groupedNeutrons = neutrons.sliceBy(neutronsPerMcCollision, mcCollision.globalIndex()); // Find the collision with the biggest nbr of PV contributors // Follows what was done here: https://github.com/AliceO2Group/O2Physics/blob/master/Common/TableProducer/mcCollsExtra.cxx#L93 int biggestNContribs = -1; @@ -1674,8 +1739,33 @@ struct Derivedupcanalysis { continue; } - int selGapSide = collision.isUPC() ? getGapSide(collision, false) : -1; - if (studyUPConly && (selGapSide < -0.5)) + int selGapSide = collision.isUPC() ? getGapSide(collision) : -1; + if (checkNeutronsInMC) { + for (const auto& neutron : groupedNeutrons) { + if (selGapSide < -0.5) + break; + + const float eta = neutron.eta(); + switch (selGapSide) { + case 0: // SGA + if (eta > neutronEtaCut) + selGapSide = -1; + break; + case 1: // SGC + if (eta < -neutronEtaCut) + selGapSide = -1; + break; + case 2: // DG + if (eta > neutronEtaCut) + selGapSide = 1; + else if (eta < -neutronEtaCut) + selGapSide = 0; + break; + } + } + } + + if (evSels.studyUPConly && (selGapSide != static_cast(upcCuts.genGapSide))) continue; if (biggestNContribs < collision.multPVTotalContributors()) { @@ -1689,26 +1779,32 @@ struct Derivedupcanalysis { return listBestCollisionIds; } - void fillGenMCHistogramsQA(StraMCCollisionsFull const& mcCollisions, StraCollisonsFullMC const& collisions) + void fillGenMCHistogramsQA(StraMCCollisionsFull const& mcCollisions, + StraCollisonsFullMC const& collisions, + NeutronsMC const& neutrons) { for (auto const& mcCollision : mcCollisions) { // LOGF(info, "Generator ID is %i", mcCollision.generatorsID()); + histos.fill(HIST("eventQA/mc/hGeneratorsId"), mcCollision.generatorsID()); + if (std::find(generatorIds->begin(), generatorIds->end(), mcCollision.generatorsID()) == generatorIds->end()) { continue; } - histos.fill(HIST("eventQA/mc/hEventSelectionMC"), 0.0, mcCollision.multMCNParticlesEta10(), mcCollision.generatorsID()); + histos.fill(HIST("eventQA/mc/hEventSelectionMC"), 0.0, mcCollision.multMCNParticlesEta08(), mcCollision.generatorsID()); if (std::abs(mcCollision.posZ()) > maxZVtxPosition) continue; - histos.fill(HIST("eventQA/mc/hEventSelectionMC"), 1.0, mcCollision.multMCNParticlesEta10(), mcCollision.generatorsID()); + histos.fill(HIST("eventQA/mc/hEventSelectionMC"), 1.0, mcCollision.multMCNParticlesEta08(), mcCollision.generatorsID()); - // Group collisions by MC collision index + // Group collisions and neutrons by MC collision index auto groupedCollisions = collisions.sliceBy(perMcCollision, mcCollision.globalIndex()); + auto groupedNeutrons = neutrons.sliceBy(neutronsPerMcCollision, mcCollision.globalIndex()); bool atLeastOne = false; float centrality = -1.f; + float ft0ampl = -1.f; int nCollisions = 0; int biggestNContribs = -1; int nTracksGlobal = -1; @@ -1719,8 +1815,33 @@ struct Derivedupcanalysis { continue; } - int selGapSide = collision.isUPC() ? getGapSide(collision, false) : -1; - if (studyUPConly && (selGapSide < -0.5)) + int selGapSide = collision.isUPC() ? getGapSide(collision) : -1; + if (checkNeutronsInMC) { + for (const auto& neutron : groupedNeutrons) { + if (selGapSide < -0.5) + break; + + const float eta = neutron.eta(); + switch (selGapSide) { + case 0: // SGA + if (eta > neutronEtaCut) + selGapSide = -1; + break; + case 1: // SGC + if (eta < -neutronEtaCut) + selGapSide = -1; + break; + case 2: // DG + if (eta > neutronEtaCut) + selGapSide = 1; + else if (eta < -neutronEtaCut) + selGapSide = 0; + break; + } + } + } + + if (evSels.studyUPConly && (selGapSide != static_cast(upcCuts.genGapSide))) continue; ++nCollisions; @@ -1728,7 +1849,13 @@ struct Derivedupcanalysis { if (biggestNContribs < collision.multPVTotalContributors()) { biggestNContribs = collision.multPVTotalContributors(); - centrality = collision.centFT0C(); + if (static_cast(upcCuts.genGapSide) == 0) { + ft0ampl = collision.totalFT0AmplitudeC(); + centrality = collision.centFT0C(); + } else if (static_cast(upcCuts.genGapSide) == 1) { + ft0ampl = collision.totalFT0AmplitudeA(); + centrality = collision.centFT0A(); + } nTracksGlobal = collision.multNTracksGlobal(); } } @@ -1736,13 +1863,14 @@ struct Derivedupcanalysis { // Fill histograms histos.fill(HIST("eventQA/mc/hTracksGlobalVsNcoll_beforeEvSel"), nTracksGlobal, groupedCollisions.size()); histos.fill(HIST("eventQA/mc/hTracksGlobalVsNcoll_afterEvSel"), nTracksGlobal, nCollisions); - histos.fill(HIST("eventQA/mc/hTracksGlobalvsMCNParticlesEta10gen"), nTracksGlobal, mcCollision.multMCNParticlesEta10()); + histos.fill(HIST("eventQA/mc/hTracksGlobalvsMCNParticlesEta08gen"), nTracksGlobal, mcCollision.multMCNParticlesEta08()); histos.fill(HIST("eventQA/mc/hTracksGlobalVsPVzMC"), nTracksGlobal, mcCollision.posZ()); histos.fill(HIST("eventQA/mc/hEventPVzMC"), mcCollision.posZ()); if (atLeastOne) { - histos.fill(HIST("eventQA/mc/hEventSelectionMC"), 2.0, mcCollision.multMCNParticlesEta10(), mcCollision.generatorsID()); + histos.fill(HIST("eventQA/mc/hEventSelectionMC"), 2.0, mcCollision.multMCNParticlesEta08(), mcCollision.generatorsID()); histos.fill(HIST("eventQA/mc/hGenEventCentrality"), centrality); + histos.fill(HIST("eventQA/mc/hGenEventFT0ampl"), ft0ampl); } } } @@ -1754,7 +1882,11 @@ struct Derivedupcanalysis { return; } - auto v0mother = v0.motherMCPart(); + const auto v0mother = v0.template motherMCPart_as(); + if (v0mother.size() < 1) { + return; + } + const float rapidityXi = RecoDecay::y(std::array{v0mother.px(), v0mother.py(), v0mother.pz()}, o2::constants::physics::MassXiMinus); if (std::fabs(rapidityXi) > 0.5f) { return; @@ -1765,13 +1897,13 @@ struct Derivedupcanalysis { const float motherPt = std::hypot(v0mother.px(), v0mother.py()); if (analyseLambda && verifyMask(selMap, secondaryMaskSelectionLambda) && - v0mother.pdgCode() == PDG_t::kXiMinus && v0mother.isPhysicalPrimary()) { - histos.fill(HIST("h3dLambdaFeeddown"), mult, v0pt, motherPt); + (v0mother.pdgCode() == PDG_t::kXiMinus) && v0mother.isPhysicalPrimary()) { + histos.fill(HIST(kParticlenames[1]) + HIST("/h3dLambdaFeeddown"), mult, v0pt, motherPt); } if (analyseAntiLambda && verifyMask(selMap, secondaryMaskSelectionAntiLambda) && - v0mother.pdgCode() == PDG_t::kXiPlusBar && v0mother.isPhysicalPrimary()) { - histos.fill(HIST("h3dAntiLambdaFeeddown"), mult, v0pt, motherPt); + (v0mother.pdgCode() == PDG_t::kXiPlusBar) && v0mother.isPhysicalPrimary()) { + histos.fill(HIST(kParticlenames[2]) + HIST("/h3dAntiLambdaFeeddown"), mult, v0pt, motherPt); } } @@ -1783,8 +1915,8 @@ struct Derivedupcanalysis { histos.fill(HIST("eventQA/hRawGapSide"), collision.gapSide()); - int selGapSide = collision.isUPC() ? getGapSide(collision, true) : -1; - if (studyUPConly && (selGapSide < -0.5)) + int selGapSide = collision.isUPC() ? getGapSide(collision) : -1; + if (evSels.studyUPConly && (selGapSide < -0.5)) return; fillHistogramsQA(collision, selGapSide); @@ -1808,15 +1940,18 @@ struct Derivedupcanalysis { DauTracks const&, aod::MotherMCParts const&, StraMCCollisionsFull const&, - V0MCCoresFull const&) + V0MCCoresFull const&, + NeutronsMC const& neutrons) { if (!collision.has_straMCCollision()) { histos.fill(HIST("eventQA/mc/hFakeEvents"), 0); // no assoc. MC collisions - } else { - const auto& mcCollision = collision.straMCCollision_as(); - if (std::find(generatorIds->begin(), generatorIds->end(), mcCollision.generatorsID()) == generatorIds->end()) { - return; - } + return; + } + + const auto& mcCollision = collision.straMCCollision_as(); // take gen. collision associated to the rec. collision + + if (std::find(generatorIds->begin(), generatorIds->end(), mcCollision.generatorsID()) == generatorIds->end()) { + return; } if (!acceptEvent(collision, true)) { @@ -1825,19 +1960,45 @@ struct Derivedupcanalysis { histos.fill(HIST("eventQA/hRawGapSide"), collision.gapSide()); - int selGapSide = collision.isUPC() ? getGapSide(collision, true) : -1; - if (studyUPConly && (selGapSide < -0.5)) + int selGapSide = collision.isUPC() ? getGapSide(collision) : -1; + int selGapSideNoNeutrons = selGapSide; + + auto groupedNeutrons = neutrons.sliceBy(neutronsPerMcCollision, mcCollision.globalIndex()); + if (checkNeutronsInMC) { + for (const auto& neutron : groupedNeutrons) { + if (selGapSide < -0.5) + break; + + const float eta = neutron.eta(); + switch (selGapSide) { + case 0: // SGA + if (eta > neutronEtaCut) + selGapSide = -1; + break; + case 1: // SGC + if (eta < -neutronEtaCut) + selGapSide = -1; + break; + case 2: // DG + if (eta > neutronEtaCut) + selGapSide = 1; + else if (eta < -neutronEtaCut) + selGapSide = 0; + break; + } + } + } + + if (evSels.studyUPConly && (selGapSide < -0.5)) return; + histos.fill(HIST("eventQA/hSelGapSideNoNeutrons"), selGapSideNoNeutrons); fillHistogramsQA(collision, selGapSide); - if (collision.has_straMCCollision()) { - const auto& mcCollision = collision.straMCCollision_as(); - histos.fill(HIST("eventQA/mc/hNTracksGlobalvsMCNParticlesEta10rec"), collision.multNTracksGlobal(), mcCollision.multMCNParticlesEta10()); - histos.fill(HIST("eventQA/mc/hNTracksPVeta1vsMCNParticlesEta10rec"), collision.multNTracksPVeta1(), mcCollision.multMCNParticlesEta10()); - histos.fill(HIST("eventQA/mc/hNTracksGlobalvstotalMultMCParticles"), collision.multNTracksGlobal(), mcCollision.totalMultMCParticles()); - histos.fill(HIST("eventQA/mc/hNTracksPVeta1vstotalMultMCParticles"), collision.multNTracksPVeta1(), mcCollision.totalMultMCParticles()); - } + histos.fill(HIST("eventQA/mc/hNTracksGlobalvsMCNParticlesEta08rec"), collision.multNTracksGlobal(), mcCollision.multMCNParticlesEta08()); + histos.fill(HIST("eventQA/mc/hNTracksPVeta1vsMCNParticlesEta10rec"), collision.multNTracksPVeta1(), mcCollision.multMCNParticlesEta10()); + histos.fill(HIST("eventQA/mc/hNTracksGlobalvstotalMultMCParticles"), collision.multNTracksGlobal(), mcCollision.totalMultMCParticles()); + histos.fill(HIST("eventQA/mc/hNTracksPVeta1vstotalMultMCParticles"), collision.multNTracksPVeta1(), mcCollision.totalMultMCParticles()); for (const auto& v0 : fullV0s) { if ((v0.v0Type() != v0cuts.v0TypeSelection) && (v0cuts.v0TypeSelection > 0)) @@ -1873,8 +2034,8 @@ struct Derivedupcanalysis { histos.fill(HIST("eventQA/hRawGapSide"), collision.gapSide()); - int selGapSide = collision.isUPC() ? getGapSide(collision, true) : -1; - if (studyUPConly && (selGapSide < -0.5)) + int selGapSide = collision.isUPC() ? getGapSide(collision) : -1; + if (evSels.studyUPConly && (selGapSide < -0.5)) return; fillHistogramsQA(collision, selGapSide); @@ -1894,15 +2055,18 @@ struct Derivedupcanalysis { DauTracks const&, aod::MotherMCParts const&, StraMCCollisionsFull const&, - CascMCCoresFull const&) + CascMCCoresFull const&, + NeutronsMC const& neutrons) { if (!collision.has_straMCCollision()) { histos.fill(HIST("eventQA/mc/hFakeEvents"), 0); // no assoc. MC collisions - } else { - const auto& mcCollision = collision.straMCCollision_as(); - if (std::find(generatorIds->begin(), generatorIds->end(), mcCollision.generatorsID()) == generatorIds->end()) { - return; - } + return; + } + + const auto& mcCollision = collision.straMCCollision_as(); // take gen. collision associated to the rec. collision + + if (std::find(generatorIds->begin(), generatorIds->end(), mcCollision.generatorsID()) == generatorIds->end()) { + return; } if (!acceptEvent(collision, true)) { @@ -1911,19 +2075,45 @@ struct Derivedupcanalysis { histos.fill(HIST("eventQA/hRawGapSide"), collision.gapSide()); - int selGapSide = collision.isUPC() ? getGapSide(collision, true) : -1; - if (studyUPConly && (selGapSide < -0.5)) + int selGapSide = collision.isUPC() ? getGapSide(collision) : -1; + int selGapSideNoNeutrons = selGapSide; + + auto groupedNeutrons = neutrons.sliceBy(neutronsPerMcCollision, mcCollision.globalIndex()); + if (checkNeutronsInMC) { + for (const auto& neutron : groupedNeutrons) { + if (selGapSide < -0.5) + break; + + const float eta = neutron.eta(); + switch (selGapSide) { + case 0: // SGA + if (eta > neutronEtaCut) + selGapSide = -1; + break; + case 1: // SGC + if (eta < -neutronEtaCut) + selGapSide = -1; + break; + case 2: // DG + if (eta > neutronEtaCut) + selGapSide = 1; + else if (eta < -neutronEtaCut) + selGapSide = 0; + break; + } + } + } + + if (evSels.studyUPConly && (selGapSide < -0.5)) return; + histos.fill(HIST("eventQA/hSelGapSideNoNeutrons"), selGapSideNoNeutrons); fillHistogramsQA(collision, selGapSide); - if (collision.has_straMCCollision()) { - const auto& mcCollision = collision.straMCCollision_as(); - histos.fill(HIST("eventQA/mc/hNTracksGlobalvsMCNParticlesEta10rec"), collision.multNTracksGlobal(), mcCollision.multMCNParticlesEta10()); - histos.fill(HIST("eventQA/mc/hNTracksPVeta1vsMCNParticlesEta10rec"), collision.multNTracksPVeta1(), mcCollision.multMCNParticlesEta10()); - histos.fill(HIST("eventQA/mc/hNTracksGlobalvstotalMultMCParticles"), collision.multNTracksGlobal(), mcCollision.totalMultMCParticles()); - histos.fill(HIST("eventQA/mc/hNTracksPVeta1vstotalMultMCParticles"), collision.multNTracksPVeta1(), mcCollision.totalMultMCParticles()); - } + histos.fill(HIST("eventQA/mc/hNTracksGlobalvsMCNParticlesEta08rec"), collision.multNTracksGlobal(), mcCollision.multMCNParticlesEta08()); + histos.fill(HIST("eventQA/mc/hNTracksPVeta1vsMCNParticlesEta10rec"), collision.multNTracksPVeta1(), mcCollision.multMCNParticlesEta10()); + histos.fill(HIST("eventQA/mc/hNTracksGlobalvstotalMultMCParticles"), collision.multNTracksGlobal(), mcCollision.totalMultMCParticles()); + histos.fill(HIST("eventQA/mc/hNTracksPVeta1vstotalMultMCParticles"), collision.multNTracksPVeta1(), mcCollision.totalMultMCParticles()); for (const auto& casc : fullCascades) { std::bitset selMap = computeBitmapCascade(casc, collision); @@ -1946,10 +2136,11 @@ struct Derivedupcanalysis { void processGenerated(StraMCCollisionsFull const& mcCollisions, V0MCCoresFull const& V0MCCores, CascMCCoresFull const& CascMCCores, - StraCollisonsFullMC const& collisions) + StraCollisonsFullMC const& collisions, + NeutronsMC const& neutrons) { - fillGenMCHistogramsQA(mcCollisions, collisions); - std::vector listBestCollisionIds = getListOfRecoCollIds(mcCollisions, collisions); + fillGenMCHistogramsQA(mcCollisions, collisions, neutrons); + std::vector listBestCollisionIds = getListOfRecoCollIds(mcCollisions, collisions, neutrons); // V0 start for (auto const& v0MC : V0MCCores) { // Consider only primaries @@ -1961,12 +2152,12 @@ struct Derivedupcanalysis { float ymc = 1e3; if (v0MC.pdgCode() == PDG_t::kK0Short) ymc = v0MC.rapidityMC(0); - else if (std::abs(v0MC.pdgCode()) == PDG_t::kLambda0) + else if ((v0MC.pdgCode() == PDG_t::kLambda0) || (v0MC.pdgCode() == PDG_t::kLambda0Bar)) ymc = v0MC.rapidityMC(1); if (std::abs(ymc) > rapidityCut) continue; - auto mcCollision = v0MC.straMCCollision_as(); // take gen. collision + const auto& mcCollision = v0MC.straMCCollision_as(); // take gen. collision if (std::abs(mcCollision.posZ()) > maxZVtxPosition) continue; @@ -1976,24 +2167,39 @@ struct Derivedupcanalysis { continue; } - float centrality = -1.f; + // float centrality = -1.f; + float ft0ampl = -1.f; int nTracksGlobal = -1; if (listBestCollisionIds[mcCollision.globalIndex()] > -1) { auto collision = collisions.iteratorAt(listBestCollisionIds[mcCollision.globalIndex()]); - centrality = collision.centFT0C(); + // centrality = collision.centFT0C(); + if (static_cast(upcCuts.genGapSide) == 0) { + ft0ampl = collision.totalFT0AmplitudeC(); + } else if (static_cast(upcCuts.genGapSide) == 1) { + ft0ampl = collision.totalFT0AmplitudeA(); + } nTracksGlobal = collision.multNTracksGlobal(); } + const int pdgPos = v0MC.pdgCodePositive(); + const int pdgNeg = v0MC.pdgCodeNegative(); + const int pdgV0 = v0MC.pdgCode(); + + const bool isPositiveProton = (pdgPos == PDG_t::kProton); + const bool isPositivePion = (pdgPos == PDG_t::kPiPlus) || (doTreatPiToMuon && pdgPos == PDG_t::kMuonPlus); + const bool isNegativeProton = (pdgNeg == kProtonBar); + const bool isNegativePion = (pdgNeg == PDG_t::kPiMinus) || (doTreatPiToMuon && pdgNeg == PDG_t::kMuonMinus); + // Fill histograms - if (v0MC.pdgCode() == PDG_t::kK0Short) { - histos.fill(HIST(kParticlenames[0]) + HIST("/mc/h7dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc, mcCollision.generatorsID()); + if ((pdgV0 == PDG_t::kK0Short) && isPositivePion && isNegativePion) { + histos.fill(HIST(kParticlenames[0]) + HIST("/mc/h7dGen"), ft0ampl, nTracksGlobal, mcCollision.multMCNParticlesEta08(), pTmc, static_cast(upcCuts.genGapSide), ymc, mcCollision.generatorsID()); } - if (v0MC.pdgCode() == PDG_t::kLambda0) { - histos.fill(HIST(kParticlenames[1]) + HIST("/mc/h7dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc, mcCollision.generatorsID()); + if ((pdgV0 == PDG_t::kLambda0) && isPositiveProton && isNegativePion) { + histos.fill(HIST(kParticlenames[1]) + HIST("/mc/h7dGen"), ft0ampl, nTracksGlobal, mcCollision.multMCNParticlesEta08(), pTmc, static_cast(upcCuts.genGapSide), ymc, mcCollision.generatorsID()); } - if (v0MC.pdgCode() == PDG_t::kLambda0Bar) { - histos.fill(HIST(kParticlenames[2]) + HIST("/mc/h7dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc, mcCollision.generatorsID()); + if ((pdgV0 == PDG_t::kLambda0Bar) && isPositivePion && isNegativeProton) { + histos.fill(HIST(kParticlenames[2]) + HIST("/mc/h7dGen"), ft0ampl, nTracksGlobal, mcCollision.multMCNParticlesEta08(), pTmc, static_cast(upcCuts.genGapSide), ymc, mcCollision.generatorsID()); } } // V0 end @@ -2005,38 +2211,62 @@ struct Derivedupcanalysis { // Kinematics (|y| < rapidityCut) float pTmc = cascMC.ptMC(); float ymc = 1e3; - if (std::abs(cascMC.pdgCode()) == PDG_t::kXiMinus) - ymc = RecoDecay::y(std::array{cascMC.pxMC(), cascMC.pyMC(), cascMC.pzMC()}, o2::constants::physics::MassXiMinus); - else if (std::abs(cascMC.pdgCode()) == PDG_t::kOmegaMinus) - ymc = RecoDecay::y(std::array{cascMC.pxMC(), cascMC.pyMC(), cascMC.pzMC()}, o2::constants::physics::MassOmegaMinus); + if ((cascMC.pdgCode() == PDG_t::kXiMinus) || (cascMC.pdgCode() == PDG_t::kXiPlusBar)) { + ymc = cascMC.rapidityMC(0); + } else if ((cascMC.pdgCode() == PDG_t::kOmegaMinus) || (cascMC.pdgCode() == PDG_t::kOmegaPlusBar)) { + ymc = cascMC.rapidityMC(2); + } if (std::abs(ymc) > rapidityCut) continue; - auto mcCollision = cascMC.straMCCollision_as(); // take gen. collision + const auto& mcCollision = cascMC.straMCCollision_as(); // take gen. collision if (std::abs(mcCollision.posZ()) > maxZVtxPosition) continue; - float centrality = -1.f; + // float centrality = -1.f; + float ft0ampl = -1.f; int nTracksGlobal = -1; if (listBestCollisionIds[mcCollision.globalIndex()] > -1) { auto collision = collisions.iteratorAt(listBestCollisionIds[mcCollision.globalIndex()]); - centrality = collision.centFT0C(); - nTracksGlobal = collision.multNTracksGlobal(); + // centrality = collision.centFT0C(); + if (static_cast(upcCuts.genGapSide) == 0) { + ft0ampl = collision.totalFT0AmplitudeC(); + } else if (static_cast(upcCuts.genGapSide) == 1) { + ft0ampl = collision.totalFT0AmplitudeA(); + } } + const int pdgPos = cascMC.pdgCodePositive(); + const int pdgNeg = cascMC.pdgCodeNegative(); + const int pdgBach = cascMC.pdgCodeBachelor(); + const int pdgCasc = cascMC.pdgCode(); + + const bool isPositiveProton = (pdgPos == PDG_t::kProton); + + const bool isPositivePion = (pdgPos == PDG_t::kPiPlus); + const bool isBachelorPositivePion = (pdgBach == PDG_t::kPiPlus); + + const bool isNegativeProton = (pdgNeg == kProtonBar); + + const bool isNegativePion = (pdgNeg == PDG_t::kPiMinus); + const bool isBachelorNegativePion = (pdgBach == PDG_t::kPiMinus); + + const bool isBachelorPositiveKaon = (pdgBach == PDG_t::kKPlus); + const bool isBachelorNegativeKaon = (pdgBach == PDG_t::kKMinus); + // Fill histograms - if (cascMC.pdgCode() == PDG_t::kXiMinus) { - histos.fill(HIST(kParticlenames[3]) + HIST("/mc/h7dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc, mcCollision.generatorsID()); + if ((pdgCasc == PDG_t::kXiMinus) && isPositiveProton && isNegativePion && isBachelorNegativePion) { + histos.fill(HIST(kParticlenames[3]) + HIST("/mc/h7dGen"), ft0ampl, nTracksGlobal, mcCollision.multMCNParticlesEta08(), pTmc, static_cast(upcCuts.genGapSide), ymc, mcCollision.generatorsID()); } - if (cascMC.pdgCode() == PDG_t::kXiPlusBar) { - histos.fill(HIST(kParticlenames[4]) + HIST("/mc/h7dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc, mcCollision.generatorsID()); + if ((pdgCasc == PDG_t::kXiPlusBar) && isNegativeProton && isPositivePion && isBachelorPositivePion) { + histos.fill(HIST(kParticlenames[4]) + HIST("/mc/h7dGen"), ft0ampl, nTracksGlobal, mcCollision.multMCNParticlesEta08(), pTmc, static_cast(upcCuts.genGapSide), ymc, mcCollision.generatorsID()); } - if (cascMC.pdgCode() == PDG_t::kOmegaMinus) { - histos.fill(HIST(kParticlenames[5]) + HIST("/mc/h7dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc, mcCollision.generatorsID()); + if ((pdgCasc == PDG_t::kOmegaMinus) && isPositiveProton && isNegativePion && isBachelorNegativeKaon) { + histos.fill(HIST(kParticlenames[5]) + HIST("/mc/h7dGen"), ft0ampl, nTracksGlobal, mcCollision.multMCNParticlesEta08(), pTmc, static_cast(upcCuts.genGapSide), ymc, mcCollision.generatorsID()); } - if (cascMC.pdgCode() == PDG_t::kOmegaPlusBar) { - histos.fill(HIST(kParticlenames[6]) + HIST("/mc/h7dGen"), centrality, nTracksGlobal, mcCollision.multMCNParticlesEta10(), pTmc, static_cast(upcCuts.genGapSide), ymc, mcCollision.generatorsID()); + if ((pdgCasc == PDG_t::kOmegaPlusBar) && isNegativeProton && isPositivePion && isBachelorPositiveKaon) { + histos.fill(HIST(kParticlenames[6]) + HIST("/mc/h7dGen"), ft0ampl, nTracksGlobal, mcCollision.multMCNParticlesEta08(), pTmc, static_cast(upcCuts.genGapSide), ymc, mcCollision.generatorsID()); } } // Cascade end } diff --git a/PWGLF/Utils/strangenessMasks.h b/PWGLF/Utils/strangenessMasks.h index ef224c8e5fa..dbf84deacd6 100644 --- a/PWGLF/Utils/strangenessMasks.h +++ b/PWGLF/Utils/strangenessMasks.h @@ -119,9 +119,12 @@ enum SelectionsCombined : int { selV0CosPA = 0, static constexpr int kSelNum = static_cast(SelectionsCombined::selCount); -// constants -const float ctauxiPDG = 4.91; // from PDG -const float ctauomegaPDG = 2.461; // from PDG +// constants in cm +const float ctauxiPDG = 4.91; +const float ctauomegaPDG = 2.46; + +const float ctauk0shortPDG = 2.68; +const float ctaulambdaPDG = 7.85; // bit masks std::bitset maskTopologicalV0; From 078938a6cb0d09f9641e450cef797e8bc81a4a46 Mon Sep 17 00:00:00 2001 From: abilandz Date: Fri, 25 Apr 2025 23:39:02 +0200 Subject: [PATCH 1106/1650] =?UTF-8?q?[PWGCF]=20improved=20memory=20menagme?= =?UTF-8?q?nt=20+=20rewritten=20support=20for=20hmo=20cut=20+=20fixes=20fo?= =?UTF-8?q?r=E2=80=A6=20(#10985)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Core/MuPa-Configurables.h | 61 +- .../Core/MuPa-DataMembers.h | 32 +- .../Core/MuPa-Enums.h | 7 + .../Core/MuPa-GlobalConstants.h | 4 + .../Core/MuPa-MemberFunctions.h | 1912 +++++++++++++---- .../Tasks/multiparticle-correlations-ab.cxx | 9 +- 6 files changed, 1531 insertions(+), 494 deletions(-) diff --git a/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h b/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h index 6a91e2f6e4b..551376fad0e 100644 --- a/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h +++ b/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h @@ -9,6 +9,10 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +/// \file MuPa-Configurables.h +/// \brief ... TBI 20250425 +/// \author Ante.Bilandzic@cern.ch + #ifndef PWGCF_MULTIPARTICLECORRELATIONS_CORE_MUPA_CONFIGURABLES_H_ #define PWGCF_MULTIPARTICLECORRELATIONS_CORE_MUPA_CONFIGURABLES_H_ @@ -34,11 +38,14 @@ struct : ConfigurableGroup { Configurable cfUseFisherYates{"cfUseFisherYates", false, "use or not Fisher-Yates algorithm to randomize particle indices"}; Configurable cfFixedNumberOfRandomlySelectedTracks{"cfFixedNumberOfRandomlySelectedTracks", -1, "set to some integer > 0, to apply and use. Set to <=0, to ignore."}; Configurable cfUseStopwatch{"cfUseStopwatch", false, "if true, some basic info on time execution is printed, here and there. Very loosely, this can be used for execution time profiling."}; - Configurable cfFloatingPointPrecision{"cfFloatingPointPrecision", 0.000001, "two floats are the same if TMath::Abs(f1 - f2) < fFloatingPointPrecision"}; + Configurable cfFloatingPointPrecision{"cfFloatingPointPrecision", 0.000001, "two floats are the same if abs(f1 - f2) < fFloatingPointPrecision"}; Configurable cfSequentialBailout{"cfSequentialBailout", 0, "if fSequentialBailout > 0, then each fSequentialBailout events the function BailOut() is called. Can be used for real analysis and for IV"}; Configurable cfUseSpecificCuts{"cfUseSpecificCuts", false, "if true, analysis-specific cuts set via configurable cfWhichSpecificCuts are applied after DefaultCuts(). "}; Configurable cfWhichSpecificCuts{"cfWhichSpecificCuts", "some supported set of analysis-specific cuts (e.g. LHC23zzh, ...)", "determine which set of analysis-specific cuts will be applied after DefaultCuts(). Use in combination with tc.fUseSpecificCuts"}; Configurable cfSkipTheseRuns{"cfSkipTheseRuns", "", "Set here via comma-separated list which runs will be skipped during hl analysis (a.k.a. \"bad runs\"). Leave empty to ignore. Example format and list for LHC23zzh: \"544116,544091\""}; + Configurable cfUseSetBinLabel{"cfUseSetBinLabel", false, "until hist->SetBinLabel(...) large memory consumption is resolved, for each histogram dump all that info in the y-axis title. See also local executable PostprocessLabels.C, where I do the final bin labeling offline"}; + Configurable cfUseClone{"cfUseClone", false, "until hist->Clone(...) large memory consumption is resolved, do not use cloning. See ROOT Forum thread."}; + Configurable cfUseFormula{"cfUseFormula", false, "until TFormula large memory consumption is resolved, do not use this class. See ROOT Forum thread."}; } cf_tc; // *) QA: @@ -116,8 +123,8 @@ struct : ConfigurableGroup { Configurable cfUseNoPileupFromSPD{"cfUseNoPileupFromSPD", false, "TBI 20250318 explanation"}; Configurable cfUseNoSPDOnVsOfPileup{"cfUseNoSPDOnVsOfPileup", false, "TBI 20250318 explanation"}; Configurable cfOccupancyEstimator{"cfOccupancyEstimator", "FT0COccupancyInTimeRange", "set here some supported occupancy estimator (TrackOccupancyInTimeRange, FT0COccupancyInTimeRange, ..."}; - Configurable cfRefMultVsNContrUp{"cfRefMultVsNContrUp", "1200. + 0.20*x", "set here some TF1 formula for the upper boundary cut in RefMult_vs_NContr correlation"}; - Configurable cfRefMultVsNContrLow{"cfRefMultVsNContrLow", "-650. + 0.08*x", "set here some TF1 formula for the lower boundary cut in RefMult_vs_NContr correlation"}; + Configurable cfRefMultVsNContrUp{"cfRefMultVsNContrUp", "1200. + 0.20*x", "set here some formula in the mandatory format \"p0 + p1*x\" for the upper boundary cut in RefMult_vs_NContr correlation"}; + Configurable cfRefMultVsNContrLow{"cfRefMultVsNContrLow", "-650. + 0.08*x", "set here some in the mandatory format \"p0 + p1*x\" for the lower boundary cut in RefMult_vs_NContr correlation"}; Configurable cfCentralityCorrelationsCut{"cfCentralityCorrelationsCut", "CentFT0C_CentFT0M", "Indicate two centrality estimators for the calculation of centrality correlation cut"}; Configurable cfCentralityCorrelationsCutTreshold{"cfCentralityCorrelationsCutTreshold", 10.0, "set the treshold for centrality correlation cut"}; Configurable cfCentralityCorrelationsCutVersion{"cfCentralityCorrelationsCutVersion", "Absolute", "set the version of centrality correlation cut. Supported: \"Relative\" and \"Absolute\""}; @@ -274,32 +281,32 @@ struct : ConfigurableGroup { Configurable cfSaveResultsHistograms{"cfSaveResultsHistograms", false, "save or not results histograms"}; // Fixed-length binning (default): - Configurable> cfFixedLength_mult_bins{"cfFixedLength_mult_bins", {2000, 0., 20000.}, "nMultBins, multMin, multMax (only for results histograms)"}; - Configurable> cfFixedLength_cent_bins{"cfFixedLength_cent_bins", {110, 0., 110.}, "nCentBins, centMin, centMax (only for results histograms)"}; - Configurable> cfFixedLength_pt_bins{"cfFixedLength_pt_bins", {1000, 0., 10.}, "nPtBins, ptMin, ptMax (only for results histograms)"}; - Configurable> cfFixedLength_eta_bins{"cfFixedLength_eta_bins", {80, -2., 2.}, "nEtaBins, etaMin, etaMax (only for results histograms)"}; - Configurable> cfFixedLength_occu_bins{"cfFixedLength_occu_bins", {200, 0., 60000.}, "nOccuBins, occuMin, occuMax (only for results histograms)"}; - Configurable> cfFixedLength_ir_bins{"cfFixedLength_ir_bins", {1000, 0., 100.}, "nirBins, irMin, irMax (only for results histograms)"}; - Configurable> cfFixedLength_crd_bins{"cfFixedLength_crd_bins", {100000, 0., 100000.}, "ncrdBins, crdMin, crdMax (only for results histograms)"}; - Configurable> cfFixedLength_vz_bins{"cfFixedLength_vz_bins", {400, -20., 20.}, "nvzBins, vzMin, vzMax (only for results histograms)"}; + Configurable> cfFixedLengthMultBins{"cfFixedLengthMultBins", {2000, 0., 20000.}, "nMultBins, multMin, multMax (only for results histograms)"}; + Configurable> cfFixedLengthCentBins{"cfFixedLengthCentBins", {110, 0., 110.}, "nCentBins, centMin, centMax (only for results histograms)"}; + Configurable> cfFixedLengthPtBins{"cfFixedLengthPtBins", {1000, 0., 10.}, "nPtBins, ptMin, ptMax (only for results histograms)"}; + Configurable> cfFixedLengthEtaBins{"cfFixedLengthEtaBins", {80, -2., 2.}, "nEtaBins, etaMin, etaMax (only for results histograms)"}; + Configurable> cfFixedLengthOccuBins{"cfFixedLengthOccuBins", {200, 0., 60000.}, "nOccuBins, occuMin, occuMax (only for results histograms)"}; + Configurable> cfFixedLengthIRBins{"cfFixedLengthIRBins", {1000, 0., 100.}, "nirBins, irMin, irMax (only for results histograms)"}; + Configurable> cfFixedLengthCRDBins{"cfFixedLengthCRDBins", {100000, 0., 100000.}, "ncrdBins, crdMin, crdMax (only for results histograms)"}; + Configurable> cfFixedLengthVzBins{"cfFixedLengthVzBins", {400, -20., 20.}, "nvzBins, vzMin, vzMax (only for results histograms)"}; // Variable-length binning (per request): - Configurable cfUseVariableLength_mult_bins{"cfUseVariableLength_mult_bins", false, "use or not variable-length multiplicity bins"}; - Configurable> cfVariableLength_mult_bins{"cfVariableLength_mult_bins", {0., 5., 6., 7., 8., 9., 100., 200., 500., 1000., 10000.}, "variable-length multiplicity bins"}; - Configurable cfUseVariableLength_cent_bins{"cfUseVariableLength_cent_bins", false, "use or not variable-length centrality bins"}; - Configurable> cfVariableLength_cent_bins{"cfVariableLength_cent_bins", {0., 10., 50., 100.}, "variable-length centrality bins"}; - Configurable cfUseVariableLength_pt_bins{"cfUseVariableLength_pt_bins", true, "use or not variable-length pt bins"}; - Configurable> cfVariableLength_pt_bins{"cfVariableLength_pt_bins", {0.20, 0.25, 0.30, 0.35, 0.40, 0.50, 0.60, 0.80, 1.00, 1.25, 1.50, 1.75, 2.00, 2.50, 3.00, 4.00, 5.00}, "variable-length pt bins"}; - Configurable cfUseVariableLength_eta_bins{"cfUseVariableLength_eta_bins", true, "use or not variable-length eta bins"}; - Configurable> cfVariableLength_eta_bins{"cfVariableLength_eta_bins", {-0.8, -0.6, -0.4, -0.3, -0.2, -0.1, 0.0, 0.1, 0.2, 0.3, 0.4, 0.6, 0.8}, "variable-length eta bins"}; - Configurable cfUseVariableLength_occu_bins{"cfUseVariableLength_occu_bins", false, "use or not variable-length occupancy bins"}; - Configurable> cfVariableLength_occu_bins{"cfVariableLength_occu_bins", {0., 5., 6., 7., 8., 9., 100., 200., 500., 1000., 10000.}, "variable-length occupancy bins"}; - Configurable cfUseVariableLength_ir_bins{"cfUseVariableLength_ir_bins", false, "use or not variable-length interaction rate bins"}; - Configurable> cfVariableLength_ir_bins{"cfVariableLength_ir_bins", {0., 5., 10., 50., 100., 200.}, "variable-length ineraction rate bins"}; - Configurable cfUseVariableLength_crd_bins{"cfUseVariableLength_crd_bins", false, "use or not variable-length current run duration bins"}; - Configurable> cfVariableLength_crd_bins{"cfVariableLength_crd_bins", {0., 5., 10., 50., 100., 500.}, "variable-length current run duration bins"}; - Configurable cfUseVariableLength_vz_bins{"cfUseVariableLength_vz_bins", false, "use or not variable-length vertex z bins"}; - Configurable> cfVariableLength_vz_bins{"cfVariableLength_vz_bins", {-10., -8., -6., -4, -2., -1., 0., 1., 2., 4., 6., 8., 10.}, "variable-length vertex z bins"}; + Configurable cfUseVariableLengthMultBins{"cfUseVariableLengthMultBins", false, "use or not variable-length multiplicity bins"}; + Configurable> cfVariableLengthMultBins{"cfVariableLengthMultBins", {0., 5., 6., 7., 8., 9., 100., 200., 500., 1000., 10000.}, "variable-length multiplicity bins"}; + Configurable cfUseVariableLengthCentBins{"cfUseVariableLengthCentBins", false, "use or not variable-length centrality bins"}; + Configurable> cfVariableLengthCentBins{"cfVariableLengthCentBins", {0., 10., 50., 100.}, "variable-length centrality bins"}; + Configurable cfUseVariableLengthPtBins{"cfUseVariableLengthPtBins", true, "use or not variable-length pt bins"}; + Configurable> cfVariableLengthPtBins{"cfVariableLengthPtBins", {0.20, 0.25, 0.30, 0.35, 0.40, 0.50, 0.60, 0.80, 1.00, 1.25, 1.50, 1.75, 2.00, 2.50, 3.00, 4.00, 5.00}, "variable-length pt bins"}; + Configurable cfUseVariableLengthEtaBins{"cfUseVariableLengthEtaBins", true, "use or not variable-length eta bins"}; + Configurable> cfVariableLengthEtaBins{"cfVariableLengthEtaBins", {-0.8, -0.6, -0.4, -0.3, -0.2, -0.1, 0.0, 0.1, 0.2, 0.3, 0.4, 0.6, 0.8}, "variable-length eta bins"}; + Configurable cfUseVariableLengthOccuBins{"cfUseVariableLengthOccuBins", false, "use or not variable-length occupancy bins"}; + Configurable> cfVariableLengthOccuBins{"cfVariableLengthOccuBins", {0., 5., 6., 7., 8., 9., 100., 200., 500., 1000., 10000.}, "variable-length occupancy bins"}; + Configurable cfUseVariableLengthIRBins{"cfUseVariableLengthIRBins", false, "use or not variable-length interaction rate bins"}; + Configurable> cfVariableLengthIRBins{"cfVariableLengthIRBins", {0., 5., 10., 50., 100., 200.}, "variable-length ineraction rate bins"}; + Configurable cfUseVariableLengthCRDBins{"cfUseVariableLengthCRDBins", false, "use or not variable-length current run duration bins"}; + Configurable> cfVariableLengthCRDBins{"cfVariableLengthCRDBins", {0., 5., 10., 50., 100., 500.}, "variable-length current run duration bins"}; + Configurable cfUseVariableLengthVzBins{"cfUseVariableLengthVzBins", false, "use or not variable-length vertex z bins"}; + Configurable> cfVariableLengthVzBins{"cfVariableLengthVzBins", {-10., -8., -6., -4, -2., -1., 0., 1., 2., 4., 6., 8., 10.}, "variable-length vertex z bins"}; } cf_res; diff --git a/PWGCF/MultiparticleCorrelations/Core/MuPa-DataMembers.h b/PWGCF/MultiparticleCorrelations/Core/MuPa-DataMembers.h index 1a083a64471..ac1c22d7dc0 100644 --- a/PWGCF/MultiparticleCorrelations/Core/MuPa-DataMembers.h +++ b/PWGCF/MultiparticleCorrelations/Core/MuPa-DataMembers.h @@ -9,6 +9,10 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +/// \file MuPa-DataMembers.h +/// \brief ... TBI 20250425 +/// \author Ante.Bilandzic@cern.ch + #ifndef PWGCF_MULTIPARTICLECORRELATIONS_CORE_MUPA_DATAMEMBERS_H_ #define PWGCF_MULTIPARTICLECORRELATIONS_CORE_MUPA_DATAMEMBERS_H_ @@ -33,7 +37,8 @@ TString sBaseListName = "Default list name"; // yes, I declare it separately, be OutputObj fBaseList{sBaseListName.Data(), OutputObjHandlingPolicy::AnalysisObject, OutputObjSourceType::OutputObjSource}; -TProfile* fBasePro = NULL; //! 0. Set to <=0 to ignore. bool fUseStopwatch = false; // do some basing profiling with TStopwatch for where the execution time is going TStopwatch* fTimer[eTimer_N] = {NULL}; // stopwatch, global (overal execution time) and local - float fFloatingPointPrecision = 1.e-6; // two floats are the same if TMath::Abs(f1 - f2) < fFloatingPointPrecision (there is configurable for it) + float fFloatingPointPrecision = 1.e-6; // two floats are the same if abs(f1 - f2) < fFloatingPointPrecision (there is configurable for it) int fSequentialBailout = 0; // if fSequentialBailout > 0, then each fSequentialBailout events the function BailOut() is called. Can be used for real analysis and for IV. bool fUseSpecificCuts = false; // apply after DefaultCuts() also hardwired analysis-specific cuts, determined via tc.fWhichSpecificCuts TString fWhichSpecificCuts = ""; // determine which set of analysis-specific cuts will be applied after DefaultCuts(). Use in combination with tc.fUseSpecificCuts TString fSkipTheseRuns = ""; // comma-separated list of runs which will be skipped during analysis in hl (a.k.a. "bad runs") bool fSkipRun = false; // based on the content of fWhichSpecificCuts, skip or not the current run + bool fUseSetBinLabel = false; // until SetBinLabel(...) large memory consumption is resolved, do not use hist->SetBinLabel(...), see ROOT Forum + // See also local executable PostprocessLabels.C + bool fUseClone = false; // until Clone(...) large memory consumption is resolved, do not use hist->Clone(...), see ROOT Forum + bool fUseFormula = false; // until TFormula large memory consumption is resolved, do not use, see ROOT Forum } tc; // "tc" labels an instance of this group of variables. // *) Event-by-event quantities: @@ -179,12 +188,14 @@ struct EventCuts { int fEventCutCounterBinNumber[2] = {1, 1}; // bin counter for set bin labels in fEventCutCounterHist float fdEventCuts[eEventCuts_N][2] = {{0.}}; // event cuts defined via [min,max) TString fsEventCuts[eEventCuts_N] = {""}; // event cuts defined via string - TH1F* fEventCutCounterHist[2][eCutCounter_N] = {{NULL}}; //! 0. - UInt_t fnEventsInternalValidation = 0; // how many on-the-fly events will be sampled for each real event, for internal validation + unsigned int fnEventsInternalValidation = 0; // how many on-the-fly events will be sampled for each real event, for internal validation TString* fHarmonicsOptionInternalValidation = NULL; // "constant", "correlated" or "persistent", see .cxx for full documentation bool fRescaleWithTheoreticalInput = false; // if true, all measured correlators are rescaled with theoretical input, so that in profiles everything is at 1 TArrayD* fInternalValidationVnPsin[2] = {NULL}; // 0 = { v1, v2, ... }, 1 = { Psi1, Psi2, ... } @@ -356,7 +367,6 @@ struct Test0 { TString fFileWithLabels = ""; // path to external ROOT file which specifies all labels of interest bool fUseDefaultLabels = false; // use default labels hardwired in GetDefaultObjArrayWithLabels(), the choice is made with cfWhichDefaultLabels TString fWhichDefaultLabels = ""; // only for testing purposes, select one set of default labels, see GetDefaultObjArrayWithLabels for supported options - TH1I* fTest0LabelsPlaceholder = NULL; // store all Test0 labels in this histogram } t0; // "t0" labels an instance of this group of histograms // *) Eta separations: diff --git a/PWGCF/MultiparticleCorrelations/Core/MuPa-Enums.h b/PWGCF/MultiparticleCorrelations/Core/MuPa-Enums.h index 026974d301c..e808d72551b 100644 --- a/PWGCF/MultiparticleCorrelations/Core/MuPa-Enums.h +++ b/PWGCF/MultiparticleCorrelations/Core/MuPa-Enums.h @@ -9,6 +9,10 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +/// \file MuPa-Enums.h +/// \brief ... TBI 20250425 +/// \author Ante.Bilandzic@cern.ch + #ifndef PWGCF_MULTIPARTICLECORRELATIONS_CORE_MUPA_ENUMS_H_ #define PWGCF_MULTIPARTICLECORRELATIONS_CORE_MUPA_ENUMS_H_ @@ -34,6 +38,9 @@ enum eConfiguration { eUseSpecificCuts, eWhichSpecificCuts, eSkipTheseRuns, + eUseSetBinLabel, // Use or not setter SetBinLabel(...) + eUseClone, // Use or not ->Clone() + eUseFormula, // Use or not class TFormula eConfiguration_N }; diff --git a/PWGCF/MultiparticleCorrelations/Core/MuPa-GlobalConstants.h b/PWGCF/MultiparticleCorrelations/Core/MuPa-GlobalConstants.h index e7a31c445df..adacaf76282 100644 --- a/PWGCF/MultiparticleCorrelations/Core/MuPa-GlobalConstants.h +++ b/PWGCF/MultiparticleCorrelations/Core/MuPa-GlobalConstants.h @@ -9,6 +9,10 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +/// \file MuPa-GlobalConstants.h +/// \brief ... TBI 20250425 +/// \author Ante.Bilandzic@cern.ch + #ifndef PWGCF_MULTIPARTICLECORRELATIONS_CORE_MUPA_GLOBALCONSTANTS_H_ #define PWGCF_MULTIPARTICLECORRELATIONS_CORE_MUPA_GLOBALCONSTANTS_H_ diff --git a/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h b/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h index dc33b8d3d30..c2a12790435 100644 --- a/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h +++ b/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h @@ -9,6 +9,10 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +/// \file MuPa-MemberFunctions.h +/// \brief ... TBI 20250425 +/// \author Ante.Bilandzic@cern.ch + #ifndef PWGCF_MULTIPARTICLECORRELATIONS_CORE_MUPA_MEMBERFUNCTIONS_H_ #define PWGCF_MULTIPARTICLECORRELATIONS_CORE_MUPA_MEMBERFUNCTIONS_H_ @@ -23,7 +27,13 @@ void BookBaseList() // Book base TList and store task configuration. // a) Book base TList; - // b) Store task configuration. + // b) Book base profile fBasePro to hold task configuration; + // c) Define bin labels directly via SetBinLabel(...); + // d) Define bin labels indirectly by storing them in y-axis title + local executable PostprocessLabels.C. + // Algorithm: y-axis title is formatted with respect to 2 IFS, ":" and ";" as follows "1:first-bin-label; 2:second-bin-label; ..." + // Then, I tokenize with respect to ";" to get bin number and corresponding bin label. + // In the final step, I tokenize with respect to ":" to disentangle bin number and its bin label; + // e) Add configured base TProfile to the list. if (tc.fVerbose) { StartFunction(__FUNCTION__); @@ -34,7 +44,7 @@ void BookBaseList() temp->SetOwner(true); fBaseList.setObject(temp); - // b) Store task configuration: + // b) Book base profile to hold task configuration: fBasePro = new TProfile("fBasePro", "flags for the whole analysis", eConfiguration_N - 1, 0.5, static_cast(eConfiguration_N) - 0.5); // yes, eConfiguration_N - 1 and -0.5, because eConfiguration kicks off from 1 fBasePro->SetStats(false); @@ -43,65 +53,170 @@ void BookBaseList() // Remark: If I want to change the ordering of bin labels, simply change the // ordering in enum eConfiguration { ... }, nothing needs to be changed here. - fBasePro->GetXaxis()->SetBinLabel(eTaskIsConfiguredFromJson, Form("fTaskIsConfiguredFromJson = %s", tc.fTaskIsConfiguredFromJson.Data())); - fBasePro->GetXaxis()->SetBinLabel(eTaskName, Form("fTaskName = %s", tc.fTaskName.Data())); + if (tc.fUseSetBinLabel) { + + // c) Define bin labels directly via SetBinLabel(...): + fBasePro->GetXaxis()->SetBinLabel(eTaskIsConfiguredFromJson, TString::Format("fTaskIsConfiguredFromJson = %s", tc.fTaskIsConfiguredFromJson.Data())); + + fBasePro->GetXaxis()->SetBinLabel(eTaskName, Form("fTaskName = %s", tc.fTaskName.Data())); + + fBasePro->GetXaxis()->SetBinLabel(eRunNumber, Form("fRunNumber = %s", "__RUN_NUMBER__")); + // I have to do it this way via placeholder, because run number is available only when i start to process data. + // Then, I replace placeholder with run number in PropagateRunNumber(...) + + fBasePro->GetXaxis()->SetBinLabel(eDryRun, "fDryRun"); + fBasePro->Fill(eDryRun, static_cast(tc.fDryRun)); + + fBasePro->GetXaxis()->SetBinLabel(eVerbose, "fVerbose"); + fBasePro->Fill(eVerbose, static_cast(tc.fVerbose)); + + fBasePro->GetXaxis()->SetBinLabel(eVerboseUtility, "fVerboseUtility"); + fBasePro->Fill(eVerboseUtility, static_cast(tc.fVerboseUtility)); + + fBasePro->GetXaxis()->SetBinLabel(eVerboseForEachParticle, "fVerboseForEachParticle"); + fBasePro->Fill(eVerboseForEachParticle, static_cast(tc.fVerboseForEachParticle)); + + fBasePro->GetXaxis()->SetBinLabel(eVerboseEventCounter, "fVerboseEventCounter"); + fBasePro->Fill(eVerboseEventCounter, static_cast(tc.fVerboseEventCounter)); + + fBasePro->GetXaxis()->SetBinLabel(ePlainPrintout, "fPlainPrintout"); + fBasePro->Fill(ePlainPrintout, static_cast(tc.fPlainPrintout)); + + fBasePro->GetXaxis()->SetBinLabel(eDoAdditionalInsanityChecks, "fDoAdditionalInsanityChecks"); + fBasePro->Fill(eDoAdditionalInsanityChecks, static_cast(tc.fDoAdditionalInsanityChecks)); + + fBasePro->GetXaxis()->SetBinLabel(eInsanityCheckForEachParticle, "fInsanityCheckForEachParticle"); + fBasePro->Fill(eInsanityCheckForEachParticle, static_cast(tc.fInsanityCheckForEachParticle)); + + fBasePro->GetXaxis()->SetBinLabel(eWhichProcess, Form("WhichProcess = %s", tc.fWhichProcess.Data())); + + fBasePro->GetXaxis()->SetBinLabel(eRandomSeed, "fRandomSeed"); + fBasePro->Fill(eRandomSeed, static_cast(tc.fRandomSeed)); + + fBasePro->GetXaxis()->SetBinLabel(eUseFisherYates, "fUseFisherYates"); + fBasePro->Fill(eUseFisherYates, static_cast(tc.fUseFisherYates)); + + fBasePro->GetXaxis()->SetBinLabel(eFixedNumberOfRandomlySelectedTracks, "fFixedNumberOfRandomlySelectedTracks"); + fBasePro->Fill(eFixedNumberOfRandomlySelectedTracks, static_cast(tc.fFixedNumberOfRandomlySelectedTracks)); + + fBasePro->GetXaxis()->SetBinLabel(eUseStopwatch, "fUseStopwatch"); + fBasePro->Fill(eUseStopwatch, static_cast(tc.fUseStopwatch)); + + fBasePro->GetXaxis()->SetBinLabel(eFloatingPointPrecision, "fFloatingPointPrecision"); + fBasePro->Fill(eFloatingPointPrecision, tc.fFloatingPointPrecision); + + fBasePro->GetXaxis()->SetBinLabel(eSequentialBailout, "fSequentialBailout"); + fBasePro->Fill(eSequentialBailout, static_cast(tc.fSequentialBailout)); + + fBasePro->GetXaxis()->SetBinLabel(eUseSpecificCuts, "fUseSpecificCuts"); + fBasePro->Fill(eUseSpecificCuts, static_cast(tc.fUseSpecificCuts)); + + fBasePro->GetXaxis()->SetBinLabel(eWhichSpecificCuts, Form("WhichSpecificCuts = %s", tc.fWhichSpecificCuts.Data())); + + fBasePro->GetXaxis()->SetBinLabel(eSkipTheseRuns, Form("SkipTheseRuns = %s", tc.fSkipTheseRuns.Data())); + + fBasePro->GetXaxis()->SetBinLabel(eUseSetBinLabel, "fUseSetBinLabel"); + fBasePro->Fill(eUseSetBinLabel, static_cast(tc.fUseSetBinLabel)); + + fBasePro->GetXaxis()->SetBinLabel(eUseClone, "fUseClone"); + fBasePro->Fill(eUseClone, static_cast(tc.fUseClone)); + + fBasePro->GetXaxis()->SetBinLabel(eUseFormula, "fUseFormula"); + fBasePro->Fill(eUseFormula, static_cast(tc.fUseFormula)); + + } else { + + // d) Define bin labels indirectly by storing them in y-axis title + local executable PostprocessLabels.C. + // Algorithm is documented in the function preamble above. + + TString yAxisTitle = ""; + yAxisTitle += TString::Format("%d:fTaskIsConfiguredFromJson = %s; ", static_cast(eTaskIsConfiguredFromJson), tc.fTaskIsConfiguredFromJson.Data()); + + yAxisTitle += TString::Format("%d:fTaskName = %s; ", static_cast(eTaskName), tc.fTaskName.Data()); + + yAxisTitle += TString::Format("%d:fRunNumber = %s; ", static_cast(eRunNumber), "__RUN_NUMBER__"); + // I have to do it this way via placeholder, because run number is available only when i start to process data. + // Then, I replace placeholder with run number in PropagateRunNumber(...) + + yAxisTitle += TString::Format("%d:fDryRun; ", static_cast(eDryRun)); + fBasePro->Fill(eDryRun, static_cast(tc.fDryRun)); + + yAxisTitle += TString::Format("%d:fVerbose; ", static_cast(eVerbose)); + fBasePro->Fill(eVerbose, static_cast(tc.fVerbose)); + + yAxisTitle += TString::Format("%d:fVerboseUtility; ", static_cast(eVerboseUtility)); + fBasePro->Fill(eVerboseUtility, static_cast(tc.fVerboseUtility)); + + yAxisTitle += TString::Format("%d:fVerboseForEachParticle; ", static_cast(eVerboseForEachParticle)); + fBasePro->Fill(eVerboseForEachParticle, static_cast(tc.fVerboseForEachParticle)); + + yAxisTitle += TString::Format("%d:fVerboseEventCounter; ", static_cast(eVerboseEventCounter)); + fBasePro->Fill(eVerboseEventCounter, static_cast(tc.fVerboseEventCounter)); - fBasePro->GetXaxis()->SetBinLabel(eRunNumber, Form("fRunNumber = %s", "__RUN_NUMBER__")); - // I have to do it this way via placeholder, because run number is available only when i start to process data. - // Then, I replace placeholder with run number in PropagateRunNumber(...) + yAxisTitle += TString::Format("%d:fPlainPrintout; ", static_cast(ePlainPrintout)); + fBasePro->Fill(ePlainPrintout, static_cast(tc.fPlainPrintout)); - fBasePro->GetXaxis()->SetBinLabel(eDryRun, "fDryRun"); - fBasePro->Fill(eDryRun, static_cast(tc.fDryRun)); + yAxisTitle += TString::Format("%d:fDoAdditionalInsanityChecks; ", static_cast(eDoAdditionalInsanityChecks)); + fBasePro->Fill(eDoAdditionalInsanityChecks, static_cast(tc.fDoAdditionalInsanityChecks)); - fBasePro->GetXaxis()->SetBinLabel(eVerbose, "fVerbose"); - fBasePro->Fill(eVerbose, static_cast(tc.fVerbose)); + yAxisTitle += TString::Format("%d:fInsanityCheckForEachParticle; ", static_cast(eInsanityCheckForEachParticle)); + fBasePro->Fill(eInsanityCheckForEachParticle, static_cast(tc.fInsanityCheckForEachParticle)); - fBasePro->GetXaxis()->SetBinLabel(eVerboseUtility, "fVerboseUtility"); - fBasePro->Fill(eVerboseUtility, static_cast(tc.fVerboseUtility)); + yAxisTitle += TString::Format("%d:fWhichProcess = %s; ", static_cast(eWhichProcess), tc.fWhichProcess.Data()); - fBasePro->GetXaxis()->SetBinLabel(eVerboseForEachParticle, "fVerboseForEachParticle"); - fBasePro->Fill(eVerboseForEachParticle, static_cast(tc.fVerboseForEachParticle)); + yAxisTitle += TString::Format("%d:fRandomSeed; ", static_cast(eRandomSeed)); + fBasePro->Fill(eRandomSeed, static_cast(tc.fRandomSeed)); - fBasePro->GetXaxis()->SetBinLabel(eVerboseEventCounter, "fVerboseEventCounter"); - fBasePro->Fill(eVerboseEventCounter, static_cast(tc.fVerboseEventCounter)); + yAxisTitle += TString::Format("%d:fUseFisherYates; ", static_cast(eUseFisherYates)); + fBasePro->Fill(eUseFisherYates, static_cast(tc.fUseFisherYates)); - fBasePro->GetXaxis()->SetBinLabel(ePlainPrintout, "fPlainPrintout"); - fBasePro->Fill(ePlainPrintout, static_cast(tc.fPlainPrintout)); + yAxisTitle += TString::Format("%d:fFixedNumberOfRandomlySelectedTracks; ", static_cast(eFixedNumberOfRandomlySelectedTracks)); + fBasePro->Fill(eFixedNumberOfRandomlySelectedTracks, static_cast(tc.fFixedNumberOfRandomlySelectedTracks)); - fBasePro->GetXaxis()->SetBinLabel(eDoAdditionalInsanityChecks, "fDoAdditionalInsanityChecks"); - fBasePro->Fill(eDoAdditionalInsanityChecks, static_cast(tc.fDoAdditionalInsanityChecks)); + yAxisTitle += TString::Format("%d:fUseStopwatch; ", static_cast(eUseStopwatch)); + fBasePro->Fill(eUseStopwatch, static_cast(tc.fUseStopwatch)); - fBasePro->GetXaxis()->SetBinLabel(eInsanityCheckForEachParticle, "fInsanityCheckForEachParticle"); - fBasePro->Fill(eInsanityCheckForEachParticle, static_cast(tc.fInsanityCheckForEachParticle)); + yAxisTitle += TString::Format("%d:fFloatingPointPrecision; ", static_cast(eFloatingPointPrecision)); + fBasePro->Fill(eFloatingPointPrecision, static_cast(tc.fFloatingPointPrecision)); - fBasePro->GetXaxis()->SetBinLabel(eWhichProcess, Form("WhichProcess = %s", tc.fWhichProcess.Data())); + yAxisTitle += TString::Format("%d:fSequentialBailout; ", static_cast(eSequentialBailout)); + fBasePro->Fill(eSequentialBailout, static_cast(tc.fSequentialBailout)); - fBasePro->GetXaxis()->SetBinLabel(eRandomSeed, "fRandomSeed"); - fBasePro->Fill(eRandomSeed, static_cast(tc.fRandomSeed)); + yAxisTitle += TString::Format("%d:fUseSpecificCuts; ", static_cast(eUseSpecificCuts)); + fBasePro->Fill(eUseSpecificCuts, static_cast(tc.fUseSpecificCuts)); - fBasePro->GetXaxis()->SetBinLabel(eUseFisherYates, "fUseFisherYates"); - fBasePro->Fill(eUseFisherYates, static_cast(tc.fUseFisherYates)); + yAxisTitle += TString::Format("%d:fWhichSpecificCuts = %s; ", static_cast(eWhichSpecificCuts), tc.fWhichSpecificCuts.Data()); - fBasePro->GetXaxis()->SetBinLabel(eFixedNumberOfRandomlySelectedTracks, "fFixedNumberOfRandomlySelectedTracks"); - fBasePro->Fill(eFixedNumberOfRandomlySelectedTracks, static_cast(tc.fFixedNumberOfRandomlySelectedTracks)); + yAxisTitle += TString::Format("%d:fSkipTheseRuns = %s; ", static_cast(eSkipTheseRuns), tc.fSkipTheseRuns.Data()); - fBasePro->GetXaxis()->SetBinLabel(eUseStopwatch, "fUseStopwatch"); - fBasePro->Fill(eUseStopwatch, static_cast(tc.fUseStopwatch)); + yAxisTitle += TString::Format("%d:fUseSetBinLabel; ", static_cast(eUseSetBinLabel)); + fBasePro->Fill(eUseSetBinLabel, static_cast(tc.fUseSetBinLabel)); - fBasePro->GetXaxis()->SetBinLabel(eFloatingPointPrecision, "fFloatingPointPrecision"); - fBasePro->Fill(eFloatingPointPrecision, tc.fFloatingPointPrecision); + yAxisTitle += TString::Format("%d:fUseClone; ", static_cast(eUseClone)); + fBasePro->Fill(eUseClone, static_cast(tc.fUseClone)); - fBasePro->GetXaxis()->SetBinLabel(eSequentialBailout, "fSequentialBailout"); - fBasePro->Fill(eSequentialBailout, static_cast(tc.fSequentialBailout)); + yAxisTitle += TString::Format("%d:fUseFormula; ", static_cast(eUseFormula)); + fBasePro->Fill(eUseFormula, static_cast(tc.fUseFormula)); - fBasePro->GetXaxis()->SetBinLabel(eUseSpecificCuts, "fUseSpecificCuts"); - fBasePro->Fill(eUseSpecificCuts, static_cast(tc.fUseSpecificCuts)); + // ... - fBasePro->GetXaxis()->SetBinLabel(eWhichSpecificCuts, Form("WhichSpecificCuts = %s", tc.fWhichSpecificCuts.Data())); + // *) Insanity check on the number of fields in this specially crafted y-axis title: + TObjArray* oa = yAxisTitle.Tokenize(";"); + if (!oa) { + LOGF(fatal, "\033[1;31m%s at line %d : oa is NULL\033[0m", __FUNCTION__, __LINE__); + } + if (oa->GetEntries() != static_cast(eConfiguration_N)) { + LOGF(fatal, "\033[1;31m%s at line %d : oa->GetEntries() = %d != eConfiguration_N = %d\033[0m", __FUNCTION__, __LINE__, oa->GetEntries(), static_cast(eConfiguration_N)); + } + delete oa; - fBasePro->GetXaxis()->SetBinLabel(eSkipTheseRuns, Form("SkipTheseRuns = %s", tc.fSkipTheseRuns.Data())); + // *) Okay, set the title: + fBasePro->GetYaxis()->SetTitle(yAxisTitle.Data()); + } // else + + // e) Add configured base TProfile to the list: fBaseList->Add(fBasePro); if (tc.fVerbose) { @@ -146,6 +261,7 @@ void DefaultConfiguration() tc.fTaskName = TString(cf_tc.cfTaskName); tc.fDryRun = cf_tc.cfDryRun; tc.fVerbose = cf_tc.cfVerbose; + if (tc.fVerbose) { StartFunction(__FUNCTION__); // yes, here } @@ -228,6 +344,9 @@ void DefaultConfiguration() tc.fUseSpecificCuts = cf_tc.cfUseSpecificCuts; tc.fWhichSpecificCuts = cf_tc.cfWhichSpecificCuts; tc.fSkipTheseRuns = cf_tc.cfSkipTheseRuns; + tc.fUseSetBinLabel = cf_tc.cfUseSetBinLabel; + tc.fUseClone = cf_tc.cfUseClone; + tc.fUseFormula = cf_tc.cfUseFormula; // *) Event histograms (for QA see below): eh.fEventHistogramsName[eNumberOfEvents] = "NumberOfEvents"; @@ -1424,35 +1543,35 @@ void DefaultBinning() // e) Variable-length binning set via MuPa-Configurables.h: // *) Variable-length binning vs. multiplicity: - if (cf_res.cfUseVariableLength_mult_bins) { + if (cf_res.cfUseVariableLengthMultBins) { this->InitializeVariableLengthBins(AFO_MULTIPLICITY); } // *) Variable-length binning vs. centrality: - if (cf_res.cfUseVariableLength_cent_bins) { + if (cf_res.cfUseVariableLengthCentBins) { this->InitializeVariableLengthBins(AFO_CENTRALITY); } // *) Variable-length binning vs. pt: - if (cf_res.cfUseVariableLength_pt_bins) { + if (cf_res.cfUseVariableLengthPtBins) { this->InitializeVariableLengthBins(AFO_PT); } // *) Variable-length binning vs. eta: - if (cf_res.cfUseVariableLength_eta_bins) { + if (cf_res.cfUseVariableLengthEtaBins) { this->InitializeVariableLengthBins(AFO_ETA); } // *) Variable-length binning vs. occupancy: - if (cf_res.cfUseVariableLength_occu_bins) { + if (cf_res.cfUseVariableLengthOccuBins) { this->InitializeVariableLengthBins(AFO_OCCUPANCY); } // *) Variable-length binning vs. interaction rate: - if (cf_res.cfUseVariableLength_ir_bins) { + if (cf_res.cfUseVariableLengthIRBins) { this->InitializeVariableLengthBins(AFO_INTERACTIONRATE); } // *) Variable-length binning vs. run duration: - if (cf_res.cfUseVariableLength_crd_bins) { + if (cf_res.cfUseVariableLengthCRDBins) { this->InitializeVariableLengthBins(AFO_CURRENTRUNDURATION); } // *) Variable-length binning vs. vertex z position: - if (cf_res.cfUseVariableLength_vz_bins) { + if (cf_res.cfUseVariableLengthVzBins) { this->InitializeVariableLengthBins(AFO_VZ); } @@ -1478,35 +1597,35 @@ void InitializeFixedLengthBins(eAsFunctionOf AFO) switch (AFO) { case AFO_MULTIPLICITY: { - lFixedLength_bins = cf_res.cfFixedLength_mult_bins.value; + lFixedLength_bins = cf_res.cfFixedLengthMultBins.value; break; } case AFO_CENTRALITY: { - lFixedLength_bins = cf_res.cfFixedLength_cent_bins.value; + lFixedLength_bins = cf_res.cfFixedLengthCentBins.value; break; } case AFO_PT: { - lFixedLength_bins = cf_res.cfFixedLength_pt_bins.value; + lFixedLength_bins = cf_res.cfFixedLengthPtBins.value; break; } case AFO_ETA: { - lFixedLength_bins = cf_res.cfFixedLength_eta_bins.value; + lFixedLength_bins = cf_res.cfFixedLengthEtaBins.value; break; } case AFO_OCCUPANCY: { - lFixedLength_bins = cf_res.cfFixedLength_occu_bins.value; + lFixedLength_bins = cf_res.cfFixedLengthOccuBins.value; break; } case AFO_INTERACTIONRATE: { - lFixedLength_bins = cf_res.cfFixedLength_ir_bins.value; + lFixedLength_bins = cf_res.cfFixedLengthIRBins.value; break; } case AFO_CURRENTRUNDURATION: { - lFixedLength_bins = cf_res.cfFixedLength_crd_bins.value; + lFixedLength_bins = cf_res.cfFixedLengthCRDBins.value; break; } case AFO_VZ: { - lFixedLength_bins = cf_res.cfFixedLength_vz_bins.value; + lFixedLength_bins = cf_res.cfFixedLengthVzBins.value; break; } // ... @@ -1550,35 +1669,35 @@ void InitializeVariableLengthBins(eAsFunctionOf AFO) switch (AFO) { case AFO_MULTIPLICITY: { - lVariableLength_bins = cf_res.cfVariableLength_mult_bins.value; + lVariableLength_bins = cf_res.cfVariableLengthMultBins.value; break; } case AFO_CENTRALITY: { - lVariableLength_bins = cf_res.cfVariableLength_cent_bins.value; + lVariableLength_bins = cf_res.cfVariableLengthCentBins.value; break; } case AFO_PT: { - lVariableLength_bins = cf_res.cfVariableLength_pt_bins.value; + lVariableLength_bins = cf_res.cfVariableLengthPtBins.value; break; } case AFO_ETA: { - lVariableLength_bins = cf_res.cfVariableLength_eta_bins.value; + lVariableLength_bins = cf_res.cfVariableLengthEtaBins.value; break; } case AFO_OCCUPANCY: { - lVariableLength_bins = cf_res.cfVariableLength_occu_bins.value; + lVariableLength_bins = cf_res.cfVariableLengthOccuBins.value; break; } case AFO_INTERACTIONRATE: { - lVariableLength_bins = cf_res.cfVariableLength_ir_bins.value; + lVariableLength_bins = cf_res.cfVariableLengthIRBins.value; break; } case AFO_CURRENTRUNDURATION: { - lVariableLength_bins = cf_res.cfVariableLength_crd_bins.value; + lVariableLength_bins = cf_res.cfVariableLengthCRDBins.value; break; } case AFO_VZ: { - lVariableLength_bins = cf_res.cfVariableLength_vz_bins.value; + lVariableLength_bins = cf_res.cfVariableLengthVzBins.value; break; } // ... @@ -2899,13 +3018,10 @@ void InsanityChecksAfterBooking() // a) Insanity checks on booking: // **) Check that the last bin is not empty in fBasePro, and that there is no underflow or overflow bins: - if (TString(fBasePro->GetXaxis()->GetBinLabel(eConfiguration_N - 1)).EqualTo("")) { - LOGF(fatal, "\033[1;31m%s at line %d : The very last bin of \"fBasePro\" doesn't have the title, check the booking of this hostogram. \033[0m", __FUNCTION__, __LINE__); - } - if (TMath::Abs(fBasePro->GetBinContent(0)) > 0.) { + if (std::abs(fBasePro->GetBinContent(0)) > 0.) { LOGF(fatal, "\033[1;31m%s at line %d : In \"fBasePro\" something was filled in the underflow, check the booking of this hostogram. \033[0m", __FUNCTION__, __LINE__); } - if (TMath::Abs(fBasePro->GetBinContent(eConfiguration_N)) > 0.) { + if (std::abs(fBasePro->GetBinContent(eConfiguration_N)) > 0.) { LOGF(fatal, "\033[1;31m%s at line %d : In \"fBasePro\" something was filled in the overflow, check the booking of this hostogram. \033[0m", __FUNCTION__, __LINE__); } @@ -3172,22 +3288,66 @@ void BookQAHistograms() qa.fQAHistogramsPro->SetStats(false); qa.fQAHistogramsPro->SetLineColor(eColor); qa.fQAHistogramsPro->SetFillColor(eFillColor); - qa.fQAHistogramsPro->GetXaxis()->SetBinLabel(1, "fCheckUnderflowAndOverflow"); - qa.fQAHistogramsPro->Fill(0.5, static_cast(qa.fCheckUnderflowAndOverflow)); - qa.fQAHistogramsPro->GetXaxis()->SetBinLabel(2, "fFillQAEventHistograms2D"); - qa.fQAHistogramsPro->Fill(1.5, static_cast(qa.fFillQAEventHistograms2D)); - qa.fQAHistogramsPro->GetXaxis()->SetBinLabel(3, "fFillQAParticleHistograms2D"); - qa.fQAHistogramsPro->Fill(2.5, static_cast(qa.fFillQAParticleHistograms2D)); - qa.fQAHistogramsPro->GetXaxis()->SetBinLabel(4, "fFillQAParticleEventHistograms2D"); - qa.fQAHistogramsPro->Fill(3.5, static_cast(qa.fFillQAParticleEventHistograms2D)); - qa.fQAHistogramsPro->GetXaxis()->SetBinLabel(5, "fFillQACorrelationsVsHistograms2D"); - qa.fQAHistogramsPro->Fill(4.5, static_cast(qa.fFillQACorrelationsVsHistograms2D)); - qa.fQAHistogramsPro->GetXaxis()->SetBinLabel(6, "fFillQACorrelationsVsInteractionRateVsProfiles2D"); - qa.fQAHistogramsPro->Fill(5.5, static_cast(qa.fFillQACorrelationsVsInteractionRateVsProfiles2D)); - qa.fQAHistogramsPro->GetXaxis()->SetBinLabel(7, "fRebin"); - qa.fQAHistogramsPro->Fill(6.5, static_cast(qa.fRebin)); - // ... + if (tc.fUseSetBinLabel) { + qa.fQAHistogramsPro->GetXaxis()->SetBinLabel(1, "fCheckUnderflowAndOverflow"); + qa.fQAHistogramsPro->Fill(0.5, static_cast(qa.fCheckUnderflowAndOverflow)); + qa.fQAHistogramsPro->GetXaxis()->SetBinLabel(2, "fFillQAEventHistograms2D"); + qa.fQAHistogramsPro->Fill(1.5, static_cast(qa.fFillQAEventHistograms2D)); + qa.fQAHistogramsPro->GetXaxis()->SetBinLabel(3, "fFillQAParticleHistograms2D"); + qa.fQAHistogramsPro->Fill(2.5, static_cast(qa.fFillQAParticleHistograms2D)); + qa.fQAHistogramsPro->GetXaxis()->SetBinLabel(4, "fFillQAParticleEventHistograms2D"); + qa.fQAHistogramsPro->Fill(3.5, static_cast(qa.fFillQAParticleEventHistograms2D)); + qa.fQAHistogramsPro->GetXaxis()->SetBinLabel(5, "fFillQACorrelationsVsHistograms2D"); + qa.fQAHistogramsPro->Fill(4.5, static_cast(qa.fFillQACorrelationsVsHistograms2D)); + qa.fQAHistogramsPro->GetXaxis()->SetBinLabel(6, "fFillQACorrelationsVsInteractionRateVsProfiles2D"); + qa.fQAHistogramsPro->Fill(5.5, static_cast(qa.fFillQACorrelationsVsInteractionRateVsProfiles2D)); + qa.fQAHistogramsPro->GetXaxis()->SetBinLabel(7, "fRebin"); + qa.fQAHistogramsPro->Fill(6.5, static_cast(qa.fRebin)); + + // ... + + } else { + // Workaround for SetBinLabel() large memory consumption: + TString yAxisTitle = ""; + + yAxisTitle += TString::Format("%d:fCheckUnderflowAndOverflow; ", 1); + qa.fQAHistogramsPro->Fill(0.5, static_cast(qa.fCheckUnderflowAndOverflow)); + + yAxisTitle += TString::Format("%d:fFillQAEventHistograms2D; ", 2); + qa.fQAHistogramsPro->Fill(1.5, static_cast(qa.fFillQAEventHistograms2D)); + + yAxisTitle += TString::Format("%d:fFillQAParticleHistograms2D; ", 3); + qa.fQAHistogramsPro->Fill(2.5, static_cast(qa.fFillQAParticleHistograms2D)); + + yAxisTitle += TString::Format("%d:fFillQAParticleEventHistograms2D; ", 4); + qa.fQAHistogramsPro->Fill(3.5, static_cast(qa.fFillQAParticleEventHistograms2D)); + + yAxisTitle += TString::Format("%d:fFillQACorrelationsVsHistograms2D; ", 5); + qa.fQAHistogramsPro->Fill(4.5, static_cast(qa.fFillQACorrelationsVsHistograms2D)); + + yAxisTitle += TString::Format("%d:fFillQACorrelationsVsInteractionRateVsProfiles2D; ", 6); + qa.fQAHistogramsPro->Fill(5.5, static_cast(qa.fFillQACorrelationsVsInteractionRateVsProfiles2D)); + + yAxisTitle += TString::Format("%d:fRebin; ", 7); + qa.fQAHistogramsPro->Fill(6.5, static_cast(qa.fRebin)); + + // ... + + // *) Insanity check on the number of fields in this specially crafted y-axis title: + TObjArray* oa = yAxisTitle.Tokenize(";"); + if (!oa) { + LOGF(fatal, "\033[1;31m%s at line %d : oa is NULL\033[0m", __FUNCTION__, __LINE__); + } + if (oa->GetEntries() - 1 != qa.fQAHistogramsPro->GetNbinsX()) { + LOGF(fatal, "\033[1;31m%s at line %d : oa->GetEntries() - 1 = %d != qa.fQAHistogramsPro->GetNbinsX() = %d\033[0m", __FUNCTION__, __LINE__, oa->GetEntries(), qa.fQAHistogramsPro->GetNbinsX()); + } + delete oa; + + // *) Okay, set the title: + qa.fQAHistogramsPro->GetYaxis()->SetTitle(yAxisTitle.Data()); + + } // else qa.fQAList->Add(qa.fQAHistogramsPro); @@ -3846,18 +4006,8 @@ void BookQAHistograms() TString::Format("fParticleEventProEbyE[%s][%s]", gc.srs[rs].Data(), gc.sba[ba].Data()), TString::Format("%s, %s", gc.srs_long[rs].Data(), gc.sba_long[ba].Data()), eQAParticleEventProEbyE_N, 0., eQAParticleEventProEbyE_N); - qa.fQAParticleEventProEbyE[rs][ba]->GetXaxis()->SetBinLabel(eitsNClsEbyE, "#LTitsNCls#GT"); // TBI 20241214 this bin labeling is not really needed, as I never save this TProfile persistently - qa.fQAParticleEventProEbyE[rs][ba]->GetXaxis()->SetBinLabel(eitsNClsNegEtaEbyE, "#LTitsNClsNegEta#GT"); - qa.fQAParticleEventProEbyE[rs][ba]->GetXaxis()->SetBinLabel(eitsNClsPosEtaEbyE, "#LTitsNClsPosEta#GT"); - qa.fQAParticleEventProEbyE[rs][ba]->GetXaxis()->SetBinLabel(eEta0804EbyE, "#LTEta0804EbyE#GT"); - qa.fQAParticleEventProEbyE[rs][ba]->GetXaxis()->SetBinLabel(eEta0400EbyE, "#LTEta0400EbyE#GT"); - qa.fQAParticleEventProEbyE[rs][ba]->GetXaxis()->SetBinLabel(eEta0004EbyE, "#LTEta0004EbyE#GT"); - qa.fQAParticleEventProEbyE[rs][ba]->GetXaxis()->SetBinLabel(eEta0408EbyE, "#LTEta0408EbyE#GT"); - qa.fQAParticleEventProEbyE[rs][ba]->GetXaxis()->SetBinLabel(ePt0005EbyE, "#LTPt0005EbyE#GT"); - qa.fQAParticleEventProEbyE[rs][ba]->GetXaxis()->SetBinLabel(ePt0510EbyE, "#LTPt0510EbyE#GT"); - qa.fQAParticleEventProEbyE[rs][ba]->GetXaxis()->SetBinLabel(ePt1050EbyE, "#LTPt1050EbyE#GT"); - } - } + } // for (int ba = 0; ba < 2; ba++) // before/after cuts + } // for (int rs = 0; rs < 2; rs++) // reco/sim // f) Book specific QA 2D "correlations vs." histograms: @@ -4198,9 +4348,37 @@ void BookEventHistograms() eh.fEventHistogramsPro->SetStats(false); eh.fEventHistogramsPro->SetLineColor(eColor); eh.fEventHistogramsPro->SetFillColor(eFillColor); - eh.fEventHistogramsPro->GetXaxis()->SetBinLabel(1, "fFillEventHistograms"); - eh.fEventHistogramsPro->Fill(0.5, static_cast(eh.fFillEventHistograms)); - // ... + + if (tc.fUseSetBinLabel) { + eh.fEventHistogramsPro->GetXaxis()->SetBinLabel(1, "fFillEventHistograms"); + eh.fEventHistogramsPro->Fill(0.5, static_cast(eh.fFillEventHistograms)); + + // ... + + } else { + // Workaround for SetBinLabel() large memory consumption: + TString yAxisTitle = ""; + + yAxisTitle += TString::Format("%d:fFillEventHistograms; ", 1); // TBI 20250411 hardwired 1 + eh.fEventHistogramsPro->Fill(0.5, static_cast(eh.fFillEventHistograms)); // TBI 20250411 hardwired 0.5 + + // ... + + // *) Insanity check on the number of fields in this specially crafted y-axis title: + TObjArray* oa = yAxisTitle.Tokenize(";"); + if (!oa) { + LOGF(fatal, "\033[1;31m%s at line %d : oa is NULL\033[0m", __FUNCTION__, __LINE__); + } + if (oa->GetEntries() - 1 != eh.fEventHistogramsPro->GetNbinsX()) { + LOGF(fatal, "\033[1;31m%s at line %d : oa->GetEntries() - 1 = %d != eh.fEventHistogramsPro->GetNbinsX() = %d\033[0m", __FUNCTION__, __LINE__, oa->GetEntries(), eh.fEventHistogramsPro->GetNbinsX()); + } + delete oa; + + // *) Okay, set the title: + eh.fEventHistogramsPro->GetYaxis()->SetTitle(yAxisTitle.Data()); + + } // else + eh.fEventHistogramsList->Add(eh.fEventHistogramsPro); // b) Book specific control event histograms 1D: @@ -4271,10 +4449,37 @@ void BookEventCutsHistograms() ec.fEventCutsPro->SetLineColor(eColor); ec.fEventCutsPro->SetFillColor(eFillColor); ec.fEventCutsPro->GetXaxis()->SetLabelSize(0.020); + + TString yAxisTitle = ""; // TBI 20250413 when I fall back on using SetBinLabel(...), this variable is declared but will be unused for (int cut = 0; cut < eEventCuts_N; cut++) { - ec.fEventCutsPro->GetXaxis()->SetBinLabel(1 + cut, ec.fEventCutName[cut].Data()); // Remark: check always if bin labels here correspond to ordering in enum eEventCuts + + if (tc.fUseSetBinLabel) { + ec.fEventCutsPro->GetXaxis()->SetBinLabel(1 + cut, ec.fEventCutName[cut].Data()); // Remark: check always if bin labels here correspond to ordering in enum eEventCuts + } else { + // Workaround for SetBinLabel() large memory consumption: + yAxisTitle += TString::Format("%d:%s; ", 1 + cut, ec.fEventCutName[cut].Data()); + } + ec.fEventCutsPro->Fill(cut, static_cast(ec.fUseEventCuts[cut])); - } + + } // for (int cut = 0; cut < eEventCuts_N; cut++) { + + // *) Insanity check on the number of fields in this specially crafted y-axis title: + if (!tc.fUseSetBinLabel) { + + TObjArray* oa = yAxisTitle.Tokenize(";"); + if (!oa) { + LOGF(fatal, "\033[1;31m%s at line %d : oa is NULL\033[0m", __FUNCTION__, __LINE__); + } + if (oa->GetEntries() - 1 != ec.fEventCutsPro->GetNbinsX()) { + LOGF(fatal, "\033[1;31m%s at line %d : oa->GetEntries() = %d != ec.fEventCutsPro->GetNbinsX() = %d\033[0m", __FUNCTION__, __LINE__, oa->GetEntries(), ec.fEventCutsPro->GetNbinsX()); + } + delete oa; + + // *) Okay, set the title: + ec.fEventCutsPro->GetYaxis()->SetTitle(yAxisTitle.Data()); + } // if(!tc.fUseSetBinLabel) + ec.fEventCutsList->Add(ec.fEventCutsPro); // b) Book event cut counter maps: @@ -4321,21 +4526,47 @@ void BookEventCutsHistograms() // **) eRefMultVsNContrUp: if (ec.fUseEventCuts[eRefMultVsNContrUp]) { - ec.fEventCutsFormulas[eRefMultVsNContrUp_Formula] = new TFormula("RefMultVsNContrUp_Formula", ec.fsEventCuts[eRefMultVsNContrUp].Data()); - // As a quick insanity check, try immediately to evaluate something from this formula: - if (std::isnan(ec.fEventCutsFormulas[eRefMultVsNContrUp_Formula]->Eval(1.44))) { - LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); - } - } + if (tc.fUseFormula) { + ec.fEventCutsFormulas[eRefMultVsNContrUp_Formula] = new TFormula("RefMultVsNContrUp_Formula", ec.fsEventCuts[eRefMultVsNContrUp].Data()); + + LOGF(info, "\033[1;33m%s at line %d: !!!! WARNING !!!! There is a large memory blow-up when using TFormula() !!!! WARNING !!!! \033[0m", __FUNCTION__, __LINE__); + + // As a quick insanity check, try immediately to evaluate something from this formula: + if (std::isnan(ec.fEventCutsFormulas[eRefMultVsNContrUp_Formula]->Eval(1.44))) { + LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); + } + } else { + // This is a workaround to evaluate upper boundary of HMO cut, until large-memory consumption with TFormula is resolved. + + // Algorithm: 1. ec.fsEventCuts[eRefMultVsNContrUp].Data() is linear expression in the mandatory format "p0 + p1*x". + // 2. Then I extract p0 and p1, and store them in float fdEventCutsFormulas[eEventCutsFormulas_N][2] = {{0.}} + // 3. Those values are then used in temporary function float RefMultVsNContr(const float &refMult, ...) + + this->GetP0P1(ec.fsEventCuts[eRefMultVsNContrUp].ReplaceAll(" ", ""), eRefMultVsNContrUp_Formula); + + } // else + + } // if (ec.fUseEventCuts[eRefMultVsNContrUp]) // **) eRefMultVsNContrLow: if (ec.fUseEventCuts[eRefMultVsNContrLow]) { - ec.fEventCutsFormulas[eRefMultVsNContrLow_Formula] = new TFormula("RefMultVsNContrLow_Formula", ec.fsEventCuts[eRefMultVsNContrLow].Data()); - // As a quick insanity check, try immediately to evaluate something from this formula: - if (std::isnan(ec.fEventCutsFormulas[eRefMultVsNContrLow_Formula]->Eval(1.44))) { - LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); + if (tc.fUseFormula) { + ec.fEventCutsFormulas[eRefMultVsNContrLow_Formula] = new TFormula("RefMultVsNContrLow_Formula", ec.fsEventCuts[eRefMultVsNContrLow].Data()); + + LOGF(info, "\033[1;33m%s at line %d: !!!! WARNING !!!! There is a large memory blow-up when using TFormula() !!!! WARNING !!!! \033[0m", __FUNCTION__, __LINE__); + + // As a quick insanity check, try immediately to evaluate something from this formula: + if (std::isnan(ec.fEventCutsFormulas[eRefMultVsNContrLow_Formula]->Eval(1.44))) { + LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); + } + } else { + // This is a workaround to evaluate upper boundary of HMO cut, until large-memory consumption with TFormula is resolved. + + // Algorithm: See above for eRefMultVsNContrUp + this->GetP0P1(ec.fsEventCuts[eRefMultVsNContrLow].ReplaceAll(" ", ""), eRefMultVsNContrLow_Formula); } - } + + } // if (ec.fUseEventCuts[eRefMultVsNContrLow]) if (tc.fVerbose) { ExitFunction(__FUNCTION__); @@ -4345,6 +4576,79 @@ void BookEventCutsHistograms() //============================================================ +void GetP0P1(const char* formula, eEventCutsFormulas whichCutFormula) +{ + // This is a sort of temporary parser, which extracts from linear expression p0 + p1*x coefficients p0 and p1, and stores them into float fdEventCutsFormulas[eEventCutsFormulas_N][2] = {{0.}} + // Remark #0: I need all this gym until large memory consumption with TFormula is resolved; + // Remark #1: Remove all blanks in 'formula' before calling this function; + // Remark #2: If I need to go beyond p1, use recursion instead. + + if (tc.fVerbose) { + StartFunction(__FUNCTION__); + } + + TString signP0 = ""; + TString signP1 = ""; + TString P0 = ""; + TString P1 = ""; + + // P0 signature parser: + int offset = 0; + if (TString(formula[0]).EqualTo("-")) { + signP0 = "-"; + offset = 1; + } + + // P0 parser + P1 signature parser: + int c1 = 0; + for (int c = 0 + offset; c < static_cast(strlen(formula)); c++) { + if (!(TString(formula[c]).EqualTo("-") || TString(formula[c]).EqualTo("+") || TString(formula[c]).EqualTo("*"))) { + P0 += formula[c]; + continue; + } else { + signP1 = formula[c]; + c1 = c; + break; + } + } + // P1 parser: + for (int c = c1 + 1; c < static_cast(strlen(formula)); c++) { + if (TString(formula[c]).EqualTo("-") || TString(formula[c]).EqualTo("+") || TString(formula[c]).EqualTo("*")) { + break; + } + P1 += formula[c]; + } + + // Okay, finally merge signature and value, cast into floats and store: + signP0 += P0; + ec.fdEventCutsFormulas[whichCutFormula][0] = signP0.Atof(); + + signP1 += P1; + ec.fdEventCutsFormulas[whichCutFormula][1] = signP1.Atof(); + + if (tc.fVerbose) { + ExitFunction(__FUNCTION__); + } + +} // void GetP0P1(const char *formula, eEventCutsFormulas whichCutFormula) + +//============================================================ + +float RefMultVsNContr(const float& refMult, eEventCutsFormulas whichCutFormula) +{ + // Temporary workaround for p0 + p1 * x formula until large memory consumption with TFormula is resolved. + + if (tc.fVerbose) { + StartFunction(__FUNCTION__); + } + + // Evaluate p0 + p1 * x: + return ec.fdEventCutsFormulas[whichCutFormula][0] + (ec.fdEventCutsFormulas[whichCutFormula][1]) * refMult; + +} // float RefMultVsNContr(const float &refMult, eEventCutsFormulas whichCutFormula) + +//============================================================ + void BookParticleHistograms() { // Book all particle histograms. @@ -4366,9 +4670,36 @@ void BookParticleHistograms() ph.fParticleHistogramsPro->SetLineColor(eColor); ph.fParticleHistogramsPro->SetFillColor(eFillColor); ph.fParticleHistogramsPro->GetXaxis()->SetLabelSize(0.025); - ph.fParticleHistogramsPro->GetXaxis()->SetBinLabel(1, "fFillParticleHistograms"); - ph.fParticleHistogramsPro->Fill(0.5, static_cast(ph.fFillParticleHistograms)); - // ... + + if (tc.fUseSetBinLabel) { + ph.fParticleHistogramsPro->GetXaxis()->SetBinLabel(1, "fFillParticleHistograms"); + ph.fParticleHistogramsPro->Fill(0.5, static_cast(ph.fFillParticleHistograms)); + + // ... + + } else { + // Workaround for SetBinLabel() large memory consumption: + TString yAxisTitle = ""; + + yAxisTitle += TString::Format("%d:fFillParticleHistograms; ", 1); // TBI 20250411 hardwired 1 + ph.fParticleHistogramsPro->Fill(0.5, static_cast(ph.fFillParticleHistograms)); // TBI 20250411 hardwired 0.5 + + // ... + + // *) Insanity check on the number of fields in this specially crafted y-axis title: + TObjArray* oa = yAxisTitle.Tokenize(";"); + if (!oa) { + LOGF(fatal, "\033[1;31m%s at line %d : oa is NULL\033[0m", __FUNCTION__, __LINE__); + } + if (oa->GetEntries() - 1 != ph.fParticleHistogramsPro->GetNbinsX()) { + LOGF(fatal, "\033[1;31m%s at line %d : oa->GetEntries() - 1 = %d != ph.fParticleHistogramsPro->GetNbinsX() = %d\033[0m", __FUNCTION__, __LINE__, oa->GetEntries(), ph.fParticleHistogramsPro->GetNbinsX()); + } + + // *) Okay, set the title: + ph.fParticleHistogramsPro->GetYaxis()->SetTitle(yAxisTitle.Data()); + + } // else + ph.fParticleHistogramsList->Add(ph.fParticleHistogramsPro); // b) Book specific particle histograms 1D: @@ -4701,10 +5032,36 @@ void BookParticleCutsHistograms() pc.fParticleCutsPro->SetStats(false); pc.fParticleCutsPro->SetLineColor(eColor); pc.fParticleCutsPro->SetFillColor(eFillColor); + + TString yAxisTitle = ""; // TBI 20250413 when I fall back on using SetBinLabel(...), this variable is declared but will be unused for (int cut = 0; cut < eParticleCuts_N; cut++) { - pc.fParticleCutsPro->GetXaxis()->SetBinLabel(1 + cut, pc.fParticleCutName[cut].Data()); // Remark: check always if bin labels here correspond to ordering in enum eParticleCuts + if (tc.fUseSetBinLabel) { + pc.fParticleCutsPro->GetXaxis()->SetBinLabel(1 + cut, pc.fParticleCutName[cut].Data()); // Remark: check always if bin labels here correspond to ordering in enum eParticleCuts + } else { + // Workaround for SetBinLabel() large memory consumption: + yAxisTitle += TString::Format("%d:%s; ", 1 + cut, pc.fParticleCutName[cut].Data()); + } + pc.fParticleCutsPro->Fill(cut, static_cast(pc.fUseParticleCuts[cut])); - } + + } // for (int cut = 0; cut < eParticleCuts_N; cut++)s + + // *) Insanity check on the number of fields in this specially crafted y-axis title: + if (!tc.fUseSetBinLabel) { + + TObjArray* oa = yAxisTitle.Tokenize(";"); + if (!oa) { + LOGF(fatal, "\033[1;31m%s at line %d : oa is NULL\033[0m", __FUNCTION__, __LINE__); + } + if (oa->GetEntries() - 1 != pc.fParticleCutsPro->GetNbinsX()) { + LOGF(fatal, "\033[1;31m%s at line %d : oa->GetEntries() = %d != pc.fParticleCutsPro->GetNbinsX() = %d\033[0m", __FUNCTION__, __LINE__, oa->GetEntries(), pc.fParticleCutsPro->GetNbinsX()); + } + delete oa; + + // *) Okay, set the title: + pc.fParticleCutsPro->GetYaxis()->SetTitle(yAxisTitle.Data()); + } // if(!tc.fUseSetBinLabel) + pc.fParticleCutsList->Add(pc.fParticleCutsPro); // b) Book particle cut counter maps: @@ -4734,7 +5091,7 @@ void BookParticleCutsHistograms() continue; } - pc.fParticleCutCounterHist[rs][cc] = new TH1I(TString::Format("fParticleCutCounterHist[%s][%s]", gc.srs[rs].Data(), gc.scc[cc].Data()), TString::Format("%s, %s, particle cut counter (%s)", "__RUN_NUMBER__", gc.srs_long[rs].Data(), gc.scc_long[cc].Data()), eParticleCuts_N, 0.5, static_cast(eParticleCuts_N) + 0.5); + pc.fParticleCutCounterHist[rs][cc] = new TH1F(TString::Format("fParticleCutCounterHist[%s][%s]", gc.srs[rs].Data(), gc.scc[cc].Data()), TString::Format("%s, %s, particle cut counter (%s)", "__RUN_NUMBER__", gc.srs_long[rs].Data(), gc.scc_long[cc].Data()), eParticleCuts_N, 0.5, static_cast(eParticleCuts_N) + 0.5); // I cast in double the last argument, because that's what this particular TH1I constructor expects // Yes, +0.5, because eParticleCuts kicks off from 0 pc.fParticleCutCounterHist[rs][cc]->SetStats(false); @@ -4751,6 +5108,9 @@ void BookParticleCutsHistograms() // d) Book the formula for pt-dependent DCAxy cut: if (pc.fUseParticleCuts[ePtDependentDCAxyParameterization]) { pc.fPtDependentDCAxyFormula = new TFormula("fPtDependentDCAxyFormula", pc.fsParticleCuts[ePtDependentDCAxyParameterization].Data()); + + LOGF(info, "\033[1;33m%s at line %d: !!!! WARNING !!!! There is a large memory blow-up when using TFormula() !!!! WARNING !!!! \033[0m", __FUNCTION__, __LINE__); + // As a quick insanity check, try immediately to evaluate something from this formula: if (std::isnan(pc.fPtDependentDCAxyFormula->Eval(1.44))) { LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); @@ -4784,12 +5144,47 @@ void BookQvectorHistograms() qv.fQvectorFlagsPro->SetLineColor(eColor); qv.fQvectorFlagsPro->SetFillColor(eFillColor); qv.fQvectorFlagsPro->GetXaxis()->SetLabelSize(0.05); - qv.fQvectorFlagsPro->GetXaxis()->SetBinLabel(1, "fCalculateQvectors"); - qv.fQvectorFlagsPro->Fill(0.5, qv.fCalculateQvectors); - qv.fQvectorFlagsPro->GetXaxis()->SetBinLabel(2, "gMaxHarmonic"); - qv.fQvectorFlagsPro->Fill(1.5, gMaxHarmonic); - qv.fQvectorFlagsPro->GetXaxis()->SetBinLabel(3, "gMaxCorrelator"); - qv.fQvectorFlagsPro->Fill(2.5, gMaxCorrelator); + + if (tc.fUseSetBinLabel) { + + qv.fQvectorFlagsPro->GetXaxis()->SetBinLabel(1, "fCalculateQvectors"); + qv.fQvectorFlagsPro->Fill(0.5, qv.fCalculateQvectors); + qv.fQvectorFlagsPro->GetXaxis()->SetBinLabel(2, "gMaxHarmonic"); + qv.fQvectorFlagsPro->Fill(1.5, gMaxHarmonic); + qv.fQvectorFlagsPro->GetXaxis()->SetBinLabel(3, "gMaxCorrelator"); + qv.fQvectorFlagsPro->Fill(2.5, gMaxCorrelator); + + // ... + + } else { + // Workaround for SetBinLabel() large memory consumption: + TString yAxisTitle = ""; + + yAxisTitle += TString::Format("%d:fCalculateQvectors; ", 1); + qv.fQvectorFlagsPro->Fill(0.5, static_cast(qv.fCalculateQvectors)); + + yAxisTitle += TString::Format("%d:gMaxHarmonic; ", 2); + qv.fQvectorFlagsPro->Fill(1.5, static_cast(gMaxHarmonic)); + + yAxisTitle += TString::Format("%d:gMaxCorrelator; ", 3); + qv.fQvectorFlagsPro->Fill(2.5, static_cast(gMaxCorrelator)); + + // ... + + // *) Insanity check on the number of fields in this specially crafted y-axis title: + TObjArray* oa = yAxisTitle.Tokenize(";"); + if (!oa) { + LOGF(fatal, "\033[1;31m%s at line %d : oa is NULL\033[0m", __FUNCTION__, __LINE__); + } + if (oa->GetEntries() - 1 != qv.fQvectorFlagsPro->GetNbinsX()) { + LOGF(fatal, "\033[1;31m%s at line %d : oa->GetEntries() - 1 = %d != qv.fQvectorFlagsPro->GetNbinsX() = %d\033[0m", __FUNCTION__, __LINE__, oa->GetEntries(), qv.fQvectorFlagsPro->GetNbinsX()); + } + + // *) Okay, set the title: + qv.fQvectorFlagsPro->GetYaxis()->SetTitle(yAxisTitle.Data()); + + } // else + qv.fQvectorList->Add(qv.fQvectorFlagsPro); // b) Book multiplicity distributions in A and B, for each eta separation: @@ -4857,9 +5252,36 @@ void BookCorrelationsHistograms() mupa.fCorrelationsFlagsPro->SetLineColor(eColor); mupa.fCorrelationsFlagsPro->SetFillColor(eFillColor); mupa.fCorrelationsFlagsPro->GetXaxis()->SetLabelSize(0.05); - mupa.fCorrelationsFlagsPro->GetXaxis()->SetBinLabel(1, "fCalculateCorrelations"); - mupa.fCorrelationsFlagsPro->Fill(0.5, mupa.fCalculateCorrelations); - // ... + + if (tc.fUseSetBinLabel) { + mupa.fCorrelationsFlagsPro->GetXaxis()->SetBinLabel(1, "fCalculateCorrelations"); + mupa.fCorrelationsFlagsPro->Fill(0.5, mupa.fCalculateCorrelations); + + // ... + + } else { + // Workaround for SetBinLabel() large memory consumption: + TString yAxisTitle = ""; + + yAxisTitle += TString::Format("%d:fCalculateCorrelations; ", 1); + mupa.fCorrelationsFlagsPro->Fill(0.5, static_cast(mupa.fCalculateCorrelations)); + + // ... + + // *) Insanity check on the number of fields in this specially crafted y-axis title: + TObjArray* oa = yAxisTitle.Tokenize(";"); + if (!oa) { + LOGF(fatal, "\033[1;31m%s at line %d : oa is NULL\033[0m", __FUNCTION__, __LINE__); + } + if (oa->GetEntries() - 1 != mupa.fCorrelationsFlagsPro->GetNbinsX()) { + LOGF(fatal, "\033[1;31m%s at line %d : oa->GetEntries() - 1 = %d != mupa.fCorrelationsFlagsPro->GetNbinsX() = %d\033[0m", __FUNCTION__, __LINE__, oa->GetEntries(), mupa.fCorrelationsFlagsPro->GetNbinsX()); + } + + // *) Okay, set the title: + mupa.fCorrelationsFlagsPro->GetYaxis()->SetTitle(yAxisTitle.Data()); + + } // else + mupa.fCorrelationsList->Add(mupa.fCorrelationsFlagsPro); if (!mupa.fCalculateCorrelations) { @@ -4913,7 +5335,20 @@ void BookCorrelationsHistograms() if (!res.fResultsPro[v]) { LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); } - mupa.fCorrelationsPro[k][n][v] = reinterpret_cast(res.fResultsPro[v]->Clone(Form("fCorrelationsPro[%d][%d][%s]", k, n, res.fResultsProRawName[v].Data()))); // yes + + if (tc.fUseClone) { + mupa.fCorrelationsPro[k][n][v] = reinterpret_cast(res.fResultsPro[v]->Clone(Form("fCorrelationsPro[%d][%d][%s]", k, n, res.fResultsProRawName[v].Data()))); // yes + } else { + // TBI 20250412 this branch is temporary workaround until hist->Clone(...) large memory consumption is resolved + if (res.fUseResultsProVariableLengthBins[v]) { + // per demand, variable-length binning: + mupa.fCorrelationsPro[k][n][v] = new TProfile(Form("fCorrelationsPro[%d][%d][%s]", k, n, res.fResultsProRawName[v].Data()), "", res.fResultsProVariableLengthBins[v]->GetSize() - 1, res.fResultsProVariableLengthBins[v]->GetArray()); + } else { + // the default fixed-length binning: + mupa.fCorrelationsPro[k][n][v] = new TProfile(Form("fCorrelationsPro[%d][%d][%s]", k, n, res.fResultsProRawName[v].Data()), "", static_cast(res.fResultsProFixedLengthBins[v][0]), res.fResultsProFixedLengthBins[v][1], res.fResultsProFixedLengthBins[v][2]); + } // else + } // else + mupa.fCorrelationsPro[k][n][v]->SetStats(false); mupa.fCorrelationsPro[k][n][v]->Sumw2(); mupa.fCorrelationsPro[k][n][v]->GetXaxis()->SetTitle(FancyFormatting(res.fResultsProXaxisTitle[v].Data())); @@ -4958,25 +5393,69 @@ void BookWeightsHistograms() pw.fWeightsFlagsPro->SetLineColor(eColor); pw.fWeightsFlagsPro->SetFillColor(eFillColor); pw.fWeightsFlagsPro->GetXaxis()->SetLabelSize(0.035); - pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(1, "w_{#varphi}"); - pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(2, "w_{p_{t}}"); - pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(3, "w_{#eta}"); - pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(4, "(w_{#varphi})_{| p_{T}}"); // TBI 20241019 not sure if this is the final notation, keep in sync with void SetDiffWeightsHist(...) - pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(5, "(w_{#varphi})_{| #eta}"); // TBI 20241019 not sure if this is the final notation, keep in sync with void SetDiffWeightsHist(...) - // **) differential phi weights using sparse: - pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(6, "(w_{#varphi})_{phi axis (sparse)}"); - pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(7, "(w_{#varphi})_{p_{T} axis (sparse)}"); - pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(8, "(w_{#varphi})_{#eta axis (sparse)}"); - pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(9, "(w_{#varphi})_{charge axis (sparse)}"); - pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(10, "(w_{#varphi})_{centrality axis (sparse)}"); - pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(11, "(w_{#varphi})_{VertexZ axis (sparse)}"); + if (tc.fUseSetBinLabel) { - // **) differential pt weights using sparse: - pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(12, "(w_{p_{T}})_{pt axis (sparse)}"); + pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(1, "w_{#varphi}"); + pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(2, "w_{p_{t}}"); + pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(3, "w_{#eta}"); + pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(4, "(w_{#varphi})_{| p_{T}}"); // TBI 20241019 not sure if this is the final notation, keep in sync with void SetDiffWeightsHist(...) + pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(5, "(w_{#varphi})_{| #eta}"); // TBI 20241019 not sure if this is the final notation, keep in sync with void SetDiffWeightsHist(...) - // **) differential eta weights using sparse: - pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(13, "(w_{#eta})_{eta axis (sparse)}"); + // **) differential phi weights using sparse: + pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(6, "(w_{#varphi})_{phi axis (sparse)}"); + pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(7, "(w_{#varphi})_{p_{T} axis (sparse)}"); + pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(8, "(w_{#varphi})_{#eta axis (sparse)}"); + pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(9, "(w_{#varphi})_{charge axis (sparse)}"); + pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(10, "(w_{#varphi})_{centrality axis (sparse)}"); + pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(11, "(w_{#varphi})_{VertexZ axis (sparse)}"); + + // **) differential pt weights using sparse: + pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(12, "(w_{p_{T}})_{pt axis (sparse)}"); + + // **) differential eta weights using sparse: + pw.fWeightsFlagsPro->GetXaxis()->SetBinLabel(13, "(w_{#eta})_{eta axis (sparse)}"); + + } else { + + // Workaround for SetBinLabel() large memory consumption: + TString yAxisTitle = ""; + + yAxisTitle += TString::Format("%d:w_{#varphi}; ", 1); + yAxisTitle += TString::Format("%d:w_{p_{t}}}; ", 2); + yAxisTitle += TString::Format("%d:w_{#eta}; ", 3); + yAxisTitle += TString::Format("%d:(w_{#varphi})_{| p_{T}}}; ", 4); + yAxisTitle += TString::Format("%d:(w_{#varphi})_{| #eta}; ", 5); + + // **) differential phi weights using sparse: + yAxisTitle += TString::Format("%d:(w_{#varphi})_{phi axis (sparse)}; ", 6); + yAxisTitle += TString::Format("%d:(w_{#varphi})_{p_{T} axis (sparse)}; ", 7); + yAxisTitle += TString::Format("%d:(w_{#varphi})_{#eta axis (sparse)}; ", 8); + yAxisTitle += TString::Format("%d:(w_{#varphi})_{charge axis (sparse)}; ", 9); + yAxisTitle += TString::Format("%d:(w_{#varphi})_{centrality axis (sparse)}; ", 10); + yAxisTitle += TString::Format("%d:(w_{#varphi})_{VertexZ axis (sparse)}; ", 11); + + // **) differential pt weights using sparse: + yAxisTitle += TString::Format("%d:(w_{p_{T}})_{pt axis (sparse)}; ", 12); + + // **) differential eta weights using sparse: + yAxisTitle += TString::Format("%d:(w_{#eta})_{eta axis (sparse)}; ", 13); + + // ... + + // *) Insanity check on the number of fields in this specially crafted y-axis title: + TObjArray* oa = yAxisTitle.Tokenize(";"); + if (!oa) { + LOGF(fatal, "\033[1;31m%s at line %d : oa is NULL\033[0m", __FUNCTION__, __LINE__); + } + if (oa->GetEntries() - 1 != pw.fWeightsFlagsPro->GetNbinsX()) { + LOGF(fatal, "\033[1;31m%s at line %d : oa->GetEntries() - 1 = %d != pw.fWeightsFlagsPro->GetNbinsX() = %d\033[0m", __FUNCTION__, __LINE__, oa->GetEntries(), pw.fWeightsFlagsPro->GetNbinsX()); + } + + // *) Okay, set the title: + pw.fWeightsFlagsPro->GetYaxis()->SetTitle(yAxisTitle.Data()); + + } // else for (int w = 0; w < eWeights_N; w++) // use weights [phi,pt,eta] { @@ -5062,7 +5541,33 @@ void BookCentralityWeightsHistograms() cw.fCentralityWeightsFlagsPro->SetLineColor(eColor); cw.fCentralityWeightsFlagsPro->SetFillColor(eFillColor); cw.fCentralityWeightsFlagsPro->GetXaxis()->SetLabelSize(0.05); - cw.fCentralityWeightsFlagsPro->GetXaxis()->SetBinLabel(1, TString::Format("Use centrality weights for estimator %s", ec.fsEventCuts[eCentralityEstimator].Data())); + + if (tc.fUseSetBinLabel) { + cw.fCentralityWeightsFlagsPro->GetXaxis()->SetBinLabel(1, TString::Format("Use centrality weights for estimator %s", ec.fsEventCuts[eCentralityEstimator].Data())); + + // ... + + } else { + // Workaround for SetBinLabel() large memory consumption: + TString yAxisTitle = ""; + + yAxisTitle += TString::Format("%d:Use centrality weights for estimator %s; ", 1, ec.fsEventCuts[eCentralityEstimator].Data()); + + // ... + + // *) Insanity check on the number of fields in this specially crafted y-axis title: + TObjArray* oa = yAxisTitle.Tokenize(";"); + if (!oa) { + LOGF(fatal, "\033[1;31m%s at line %d : oa is NULL\033[0m", __FUNCTION__, __LINE__); + } + if (oa->GetEntries() - 1 != cw.fCentralityWeightsFlagsPro->GetNbinsX()) { + LOGF(fatal, "\033[1;31m%s at line %d : oa->GetEntries() - 1 = %d != cw.fCentralityWeightsFlagsPro->GetNbinsX() = %d\033[0m", __FUNCTION__, __LINE__, oa->GetEntries(), cw.fCentralityWeightsFlagsPro->GetNbinsX()); + } + + // *) Okay, set the title: + cw.fCentralityWeightsFlagsPro->GetYaxis()->SetTitle(yAxisTitle.Data()); + } + if (cw.fUseCentralityWeights) { cw.fCentralityWeightsFlagsPro->Fill(0.5, 1.); // TBI 20241118 shall I automate this? } @@ -5101,14 +5606,50 @@ void BookNestedLoopsHistograms() nl.fNestedLoopsFlagsPro->SetLineColor(eColor); nl.fNestedLoopsFlagsPro->SetFillColor(eFillColor); nl.fNestedLoopsFlagsPro->GetXaxis()->SetLabelSize(0.03); - nl.fNestedLoopsFlagsPro->GetXaxis()->SetBinLabel(1, "fCalculateNestedLoops"); - nl.fNestedLoopsFlagsPro->Fill(0.5, nl.fCalculateNestedLoops); - nl.fNestedLoopsFlagsPro->GetXaxis()->SetBinLabel(2, "fCalculateCustomNestedLoops"); - nl.fNestedLoopsFlagsPro->Fill(1.5, nl.fCalculateCustomNestedLoops); - nl.fNestedLoopsFlagsPro->GetXaxis()->SetBinLabel(3, "fCalculateKineCustomNestedLoops"); - nl.fNestedLoopsFlagsPro->Fill(2.5, nl.fCalculateKineCustomNestedLoops); - nl.fNestedLoopsFlagsPro->GetXaxis()->SetBinLabel(4, "fMaxNestedLoop"); - nl.fNestedLoopsFlagsPro->Fill(3.5, nl.fMaxNestedLoop); + + if (tc.fUseSetBinLabel) { + nl.fNestedLoopsFlagsPro->GetXaxis()->SetBinLabel(1, "fCalculateNestedLoops"); + nl.fNestedLoopsFlagsPro->Fill(0.5, nl.fCalculateNestedLoops); + nl.fNestedLoopsFlagsPro->GetXaxis()->SetBinLabel(2, "fCalculateCustomNestedLoops"); + nl.fNestedLoopsFlagsPro->Fill(1.5, nl.fCalculateCustomNestedLoops); + nl.fNestedLoopsFlagsPro->GetXaxis()->SetBinLabel(3, "fCalculateKineCustomNestedLoops"); + nl.fNestedLoopsFlagsPro->Fill(2.5, nl.fCalculateKineCustomNestedLoops); + nl.fNestedLoopsFlagsPro->GetXaxis()->SetBinLabel(4, "fMaxNestedLoop"); + nl.fNestedLoopsFlagsPro->Fill(3.5, nl.fMaxNestedLoop); + + // ... + } else { + // Workaround for SetBinLabel() large memory consumption: + TString yAxisTitle = ""; + + yAxisTitle += TString::Format("%d:fCalculateNestedLoops; ", 1); + nl.fNestedLoopsFlagsPro->Fill(0.5, nl.fCalculateNestedLoops); + + yAxisTitle += TString::Format("%d:fCalculateCustomNestedLoops; ", 2); + nl.fNestedLoopsFlagsPro->Fill(1.5, nl.fCalculateCustomNestedLoops); + + yAxisTitle += TString::Format("%d:fCalculateKineCustomNestedLoops; ", 3); + nl.fNestedLoopsFlagsPro->Fill(2.5, nl.fCalculateKineCustomNestedLoops); + + yAxisTitle += TString::Format("%d:fMaxNestedLoop; ", 4); + nl.fNestedLoopsFlagsPro->Fill(3.5, nl.fMaxNestedLoop); + + // ... + + // *) Insanity check on the number of fields in this specially crafted y-axis title: + TObjArray* oa = yAxisTitle.Tokenize(";"); + if (!oa) { + LOGF(fatal, "\033[1;31m%s at line %d : oa is NULL\033[0m", __FUNCTION__, __LINE__); + } + if (oa->GetEntries() - 1 != nl.fNestedLoopsFlagsPro->GetNbinsX()) { + LOGF(fatal, "\033[1;31m%s at line %d : oa->GetEntries() - 1 = %d != nl.fNestedLoopsFlagsPro->GetNbinsX() = %d\033[0m", __FUNCTION__, __LINE__, oa->GetEntries(), nl.fNestedLoopsFlagsPro->GetNbinsX()); + } + + // *) Okay, set the title: + nl.fNestedLoopsFlagsPro->GetYaxis()->SetTitle(yAxisTitle.Data()); + + } // else + nl.fNestedLoopsList->Add(nl.fNestedLoopsFlagsPro); if (!(nl.fCalculateNestedLoops || nl.fCalculateCustomNestedLoops || nl.fCalculateKineCustomNestedLoops)) { @@ -5159,7 +5700,20 @@ void BookNestedLoopsHistograms() if (!res.fResultsPro[v]) { LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); } - nl.fNestedLoopsPro[k][n][v] = reinterpret_cast(res.fResultsPro[v]->Clone(Form("fNestedLoopsPro[%d][%d][%d]", k, n, v))); // yes + + if (tc.fUseClone) { + nl.fNestedLoopsPro[k][n][v] = reinterpret_cast(res.fResultsPro[v]->Clone(Form("fNestedLoopsPro[%d][%d][%d]", k, n, v))); // yes + } else { + // TBI 20250412 this branch is temporary workaround until hist->Clone(...) large memory consumption is resolved + if (res.fUseResultsProVariableLengthBins[v]) { + // per demand, variable-length binning: + nl.fNestedLoopsPro[k][n][v] = new TProfile(Form("fNestedLoopsPro[%d][%d][%s]", k, n, res.fResultsProRawName[v].Data()), "", res.fResultsProVariableLengthBins[v]->GetSize() - 1, res.fResultsProVariableLengthBins[v]->GetArray()); + } else { + // the default fixed-length binning: + nl.fNestedLoopsPro[k][n][v] = new TProfile(Form("fNestedLoopsPro[%d][%d][%s]", k, n, res.fResultsProRawName[v].Data()), "", static_cast(res.fResultsProFixedLengthBins[v][0]), res.fResultsProFixedLengthBins[v][1], res.fResultsProFixedLengthBins[v][2]); + } // else + } // else + nl.fNestedLoopsPro[k][n][v]->SetTitle(Form("#LT#LTcos[%s(%s)]#GT#GT", 1 == n + 1 ? "" : Form("%d", n + 1), oVariable[k].Data())); nl.fNestedLoopsPro[k][n][v]->SetStats(false); nl.fNestedLoopsPro[k][n][v]->Sumw2(); @@ -5217,10 +5771,46 @@ void BookNUAHistograms() nua.fNUAFlagsPro->SetLineColor(eColor); nua.fNUAFlagsPro->SetFillColor(eFillColor); nua.fNUAFlagsPro->GetXaxis()->SetLabelSize(0.03); + // TBI 20240429 the binning below is a bit fragile, but ok... - nua.fNUAFlagsPro->GetXaxis()->SetBinLabel(static_cast(1 + ePhiNUAPDF), "fApplyNUAPDF[phi]"); - nua.fNUAFlagsPro->GetXaxis()->SetBinLabel(static_cast(1 + ePtNUAPDF), "fApplyNUAPDF[pt]"); - nua.fNUAFlagsPro->GetXaxis()->SetBinLabel(static_cast(1 + eEtaNUAPDF), "fApplyNUAPDF[eta]"); + if (tc.fUseSetBinLabel) { + nua.fNUAFlagsPro->GetXaxis()->SetBinLabel(static_cast(1 + ePhiNUAPDF), "fApplyNUAPDF[phi]"); + nua.fNUAFlagsPro->GetXaxis()->SetBinLabel(static_cast(1 + ePtNUAPDF), "fApplyNUAPDF[pt]"); + nua.fNUAFlagsPro->GetXaxis()->SetBinLabel(static_cast(1 + eEtaNUAPDF), "fApplyNUAPDF[eta]"); + nua.fNUAFlagsPro->GetXaxis()->SetBinLabel(static_cast(4 + ePhiNUAPDF), "fUseDefaultNUAPDF[phi]"); + nua.fNUAFlagsPro->GetXaxis()->SetBinLabel(static_cast(4 + ePtNUAPDF), "fUseDefaultNUAPDF[pt]"); + nua.fNUAFlagsPro->GetXaxis()->SetBinLabel(static_cast(4 + eEtaNUAPDF), "fUseDefaultNUAPDF[eta]"); + + // ... + + } else { + + // Workaround for SetBinLabel() large memory consumption: + TString yAxisTitle = ""; + + yAxisTitle += TString::Format("%d:fApplyNUAPDF[phi]; ", static_cast(1 + ePhiNUAPDF)); + yAxisTitle += TString::Format("%d:fApplyNUAPDF[pt]; ", static_cast(1 + ePtNUAPDF)); + yAxisTitle += TString::Format("%d:fApplyNUAPDF[eta]; ", static_cast(1 + eEtaNUAPDF)); + yAxisTitle += TString::Format("%d:fUseDefaultNUAPDF[phi]; ", static_cast(4 + ePhiNUAPDF)); + yAxisTitle += TString::Format("%d:fUseDefaultNUAPDF[pt]; ", static_cast(4 + ePtNUAPDF)); + yAxisTitle += TString::Format("%d:fUseDefaultNUAPDF[eta]; ", static_cast(4 + eEtaNUAPDF)); + + // ... + + // *) Insanity check on the number of fields in this specially crafted y-axis title: + TObjArray* oa = yAxisTitle.Tokenize(";"); + if (!oa) { + LOGF(fatal, "\033[1;31m%s at line %d : oa is NULL\033[0m", __FUNCTION__, __LINE__); + } + if (oa->GetEntries() - 1 != nua.fNUAFlagsPro->GetNbinsX()) { + LOGF(fatal, "\033[1;31m%s at line %d : oa->GetEntries() - 1 = %d != nua.fNUAFlagsPro->GetNbinsX() = %d\033[0m", __FUNCTION__, __LINE__, oa->GetEntries(), nua.fNUAFlagsPro->GetNbinsX()); + } + + // *) Okay, set the title: + nua.fNUAFlagsPro->GetYaxis()->SetTitle(yAxisTitle.Data()); + + } // else + if (nua.fApplyNUAPDF[ePhiNUAPDF]) { nua.fNUAFlagsPro->Fill(static_cast(1 + ePhiNUAPDF), 1.); } @@ -5230,9 +5820,6 @@ void BookNUAHistograms() if (nua.fApplyNUAPDF[eEtaNUAPDF]) { nua.fNUAFlagsPro->Fill(static_cast(1 + eEtaNUAPDF), 1.); } - nua.fNUAFlagsPro->GetXaxis()->SetBinLabel(static_cast(4 + ePhiNUAPDF), "fUseDefaultNUAPDF[phi]"); - nua.fNUAFlagsPro->GetXaxis()->SetBinLabel(static_cast(4 + ePtNUAPDF), "fUseDefaultNUAPDF[pt]"); - nua.fNUAFlagsPro->GetXaxis()->SetBinLabel(static_cast(4 + eEtaNUAPDF), "fUseDefaultNUAPDF[eta]"); if (nua.fUseDefaultNUAPDF[ePhiNUAPDF]) { nua.fNUAFlagsPro->Fill(static_cast(4 + ePhiNUAPDF), 1.); } @@ -5362,14 +5949,45 @@ void BookInternalValidationHistograms() iv.fInternalValidationFlagsPro->GetXaxis()->SetLabelSize(0.04); iv.fInternalValidationList->Add(iv.fInternalValidationFlagsPro); - iv.fInternalValidationFlagsPro->GetXaxis()->SetBinLabel(1, "fUseInternalValidation"); - iv.fInternalValidationFlagsPro->Fill(0.5, iv.fUseInternalValidation); - iv.fInternalValidationFlagsPro->GetXaxis()->SetBinLabel(2, "fnEventsInternalValidation"); - iv.fInternalValidationFlagsPro->Fill(1.5, iv.fnEventsInternalValidation); - iv.fInternalValidationFlagsPro->GetXaxis()->SetBinLabel(3, "fRescaleWithTheoreticalInput"); - iv.fInternalValidationFlagsPro->Fill(2.5, iv.fRescaleWithTheoreticalInput); - iv.fInternalValidationFlagsPro->GetXaxis()->SetBinLabel(4, TString::Format("option = %s", iv.fHarmonicsOptionInternalValidation->Data())); - iv.fInternalValidationFlagsPro->Fill(3.5, 1); // redundant, because here I only care about bin label, but preserves symmetry in this code snippet... + if (tc.fUseSetBinLabel) { + iv.fInternalValidationFlagsPro->GetXaxis()->SetBinLabel(1, "fUseInternalValidation"); + iv.fInternalValidationFlagsPro->Fill(0.5, iv.fUseInternalValidation); + iv.fInternalValidationFlagsPro->GetXaxis()->SetBinLabel(2, "fnEventsInternalValidation"); + iv.fInternalValidationFlagsPro->Fill(1.5, iv.fnEventsInternalValidation); + iv.fInternalValidationFlagsPro->GetXaxis()->SetBinLabel(3, "fRescaleWithTheoreticalInput"); + iv.fInternalValidationFlagsPro->Fill(2.5, iv.fRescaleWithTheoreticalInput); + iv.fInternalValidationFlagsPro->GetXaxis()->SetBinLabel(4, TString::Format("option = %s", iv.fHarmonicsOptionInternalValidation->Data())); + + } else { + // Workaround for SetBinLabel() large memory consumption: + TString yAxisTitle = ""; + + yAxisTitle += TString::Format("%d:fUseInternalValidation; ", 1); + iv.fInternalValidationFlagsPro->Fill(0.5, static_cast(iv.fUseInternalValidation)); + + yAxisTitle += TString::Format("%d:fnEventsInternalValidation; ", 2); + iv.fInternalValidationFlagsPro->Fill(1.5, static_cast(iv.fnEventsInternalValidation)); + + yAxisTitle += TString::Format("%d:fRescaleWithTheoreticalInput; ", 3); + iv.fInternalValidationFlagsPro->Fill(2.5, static_cast(iv.fRescaleWithTheoreticalInput)); + + yAxisTitle += TString::Format("%d:option = %s; ", 4, iv.fHarmonicsOptionInternalValidation->Data()); + + // ... + + // *) Insanity check on the number of fields in this specially crafted y-axis title: + TObjArray* oa = yAxisTitle.Tokenize(";"); + if (!oa) { + LOGF(fatal, "\033[1;31m%s at line %d : oa is NULL\033[0m", __FUNCTION__, __LINE__); + } + if (oa->GetEntries() - 1 != iv.fInternalValidationFlagsPro->GetNbinsX()) { + LOGF(fatal, "\033[1;31m%s at line %d : oa->GetEntries() - 1 = %d != iv.fInternalValidationFlagsPro->GetNbinsX() = %d\033[0m", __FUNCTION__, __LINE__, oa->GetEntries(), iv.fInternalValidationFlagsPro->GetNbinsX()); + } + + // *) Okay, set the title: + iv.fInternalValidationFlagsPro->GetYaxis()->SetTitle(yAxisTitle.Data()); + + } // else // *) Book object beyond this line only if internal validation was requested: if (!iv.fUseInternalValidation) { @@ -5452,7 +6070,7 @@ TComplex TheoreticalValue(TArrayI* harmonics, TArrayD* amplitudes, TArrayD* plan TComplex value = TComplex(1., 0., true); // yes, polar representation for (int h = 0; h < harmonics->GetSize(); h++) { // Using polar form of TComplex (double re, double im=0, bool polar=false): - value *= TComplex(amplitudes->GetAt(TMath::Abs(harmonics->GetAt(h)) - 1), 1. * harmonics->GetAt(h) * planes->GetAt(TMath::Abs(harmonics->GetAt(h)) - 1), true); + value *= TComplex(amplitudes->GetAt(std::abs(harmonics->GetAt(h)) - 1), 1. * harmonics->GetAt(h) * planes->GetAt(std::abs(harmonics->GetAt(h)) - 1), true); } // for(int h=0;hGetSize();h++) // c) Return value: @@ -5519,7 +6137,7 @@ void InternalValidation() // For this option, vn's and psin's are constant for all simulated events, therefore I can configure fPhiPDF outside of loop over events. // Remark: The last parameter [18] is a random reaction plane, keep in sync with fPhiPDF->SetParameter(18,fReactionPlane); below // Keep also in sync with const int gMaxHarmonic = 9; in *GlobalConstants.h - fPhiPDF = new TF1("fPhiPDF", "1 + 2.*[0]*TMath::Cos(x-[1]-[18]) + 2.*[2]*TMath::Cos(2.*(x-[3]-[18])) + 2.*[4]*TMath::Cos(3.*(x-[5]-[18])) + 2.*[6]*TMath::Cos(4.*(x-[7]-[18])) + 2.*[8]*TMath::Cos(5.*(x-[9]-[18])) + 2.*[10]*TMath::Cos(6.*(x-[11]-[18])) + 2.*[12]*TMath::Cos(7.*(x-[13]-[18])) + 2.*[14]*TMath::Cos(8.*(x-[15]-[18])) + 2.*[16]*TMath::Cos(9.*(x-[17]-[18]))", 0., o2::constants::math::TwoPI); + fPhiPDF = new TF1("fPhiPDF", "1 + 2.*[0]*cos(x-[1]-[18]) + 2.*[2]*cos(2.*(x-[3]-[18])) + 2.*[4]*cos(3.*(x-[5]-[18])) + 2.*[6]*cos(4.*(x-[7]-[18])) + 2.*[8]*cos(5.*(x-[9]-[18])) + 2.*[10]*cos(6.*(x-[11]-[18])) + 2.*[12]*cos(7.*(x-[13]-[18])) + 2.*[14]*cos(8.*(x-[15]-[18])) + 2.*[16]*cos(9.*(x-[17]-[18]))", 0., o2::constants::math::TwoPI); for (int h = 0; h < gMaxHarmonic; h++) { fPhiPDF->SetParName(2 * h, TString::Format("v_{%d}", h + 1)); // set name v_n fPhiPDF->SetParName(2 * h + 1, TString::Format("Psi_{%d}", h + 1)); // set name psi_n @@ -5552,7 +6170,7 @@ void InternalValidation() // Keep also in sync with const int gMaxHarmonic = 9; in *GlobalConstants.h // Azimuthal angles are sampled from this pdf: - fPhiPDF = new TF1("fPhiPDF", "1 + 2.*[0]*TMath::Cos(x-[3]) + 2.*[1]*TMath::Cos(2.*(x-[3])) + 2.*[2]*TMath::Cos(3.*(x-[3]))", 0., o2::constants::math::TwoPI); + fPhiPDF = new TF1("fPhiPDF", "1 + 2.*[0]*cos(x-[3]) + 2.*[1]*cos(2.*(x-[3])) + 2.*[2]*cos(3.*(x-[3]))", 0., o2::constants::math::TwoPI); // With this parameterization, I have: // [0] => v1 // [1] => v2 @@ -5577,7 +6195,7 @@ void InternalValidation() // Keep also in sync with const int gMaxHarmonic = 9; in *GlobalConstants.h // Azimuthal angles are sampled from this pdf: - fPhiPDF = new TF1("fPhiPDF", "1 + 2.*[0]*TMath::Cos(x-[3]) + 2.*[1]*TMath::Cos(2.*(x-[4])) + 2.*[2]*TMath::Cos(3.*(x-[5]))", 0., o2::constants::math::TwoPI); + fPhiPDF = new TF1("fPhiPDF", "1 + 2.*[0]*cos(x-[3]) + 2.*[1]*cos(2.*(x-[4])) + 2.*[2]*cos(3.*(x-[5]))", 0., o2::constants::math::TwoPI); // With this parameterization, I have: // [0] => v1 // [1] => v2 @@ -5882,9 +6500,8 @@ void BookTest0Histograms() // a) Book the profile holding flags; // b) Book placeholder and make sure all labels are stored in the placeholder; - // c) Retrieve labels from placeholder; - // d) Book what needs to be booked; - // e) Few quick insanity checks on booking. + // c) Book what needs to be booked; + // d) Few quick insanity checks on booking. if (tc.fVerbose) { StartFunction(__FUNCTION__); @@ -5894,7 +6511,37 @@ void BookTest0Histograms() t0.fTest0FlagsPro = new TProfile("fTest0FlagsPro", "flags for Test0", 1, 0., 1.); t0.fTest0FlagsPro->SetStats(false); t0.fTest0FlagsPro->GetXaxis()->SetLabelSize(0.04); - t0.fTest0FlagsPro->GetXaxis()->SetBinLabel(1, "fCalculateTest0"); + + if (tc.fUseSetBinLabel) { + t0.fTest0FlagsPro->GetXaxis()->SetBinLabel(1, "fCalculateTest0"); + + // ... + + } else { + // Workaround for SetBinLabel() large memory consumption: + TString yAxisTitle = ""; + + yAxisTitle += TString::Format("%d:fCalculateTest0; ", 1); + t0.fTest0FlagsPro->Fill(0.5, static_cast(t0.fCalculateTest0)); + + // ... + + // *) Insanity check on the number of fields in this specially crafted y-axis title: + TObjArray* oa = yAxisTitle.Tokenize(";"); + if (!oa) { + LOGF(fatal, "\033[1;31m%s at line %d : oa is NULL\033[0m", __FUNCTION__, __LINE__); + } + if (oa->GetEntries() - 1 != t0.fTest0FlagsPro->GetNbinsX()) { + LOGF(fatal, "\033[1;31m%s at line %d : oa->GetEntries() - 1 = %d != t0.fTest0FlagsPro->GetNbinsX() = %d\033[0m", __FUNCTION__, __LINE__, oa->GetEntries(), t0.fTest0FlagsPro->GetNbinsX()); + } + + // *) Okay, set the title: + t0.fTest0FlagsPro->GetYaxis()->SetTitle(yAxisTitle.Data()); + + // ... + + } // else + t0.fTest0FlagsPro->Fill(0.5, t0.fCalculateTest0); t0.fTest0List->Add(t0.fTest0FlagsPro); @@ -5904,16 +6551,8 @@ void BookTest0Histograms() // b) Book placeholder and make sure all labels are stored in the placeholder: this->StoreLabelsInPlaceholder(); - if (t0.fTest0LabelsPlaceholder) { - t0.fTest0List->Add(t0.fTest0LabelsPlaceholder); - } - - // c) Retrieve labels from placeholder: - if (!(this->RetrieveCorrelationsLabels())) { - LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); - } - // d) Book what needs to be booked: + // c) Book what needs to be booked: for (int mo = 0; mo < gMaxCorrelator; mo++) { for (int mi = 0; mi < gMaxIndex; mi++) { if (!t0.fTest0Labels[mo][mi]) { @@ -5954,18 +6593,25 @@ void BookTest0Histograms() LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); } - t0.fTest0Pro[mo][mi][v] = reinterpret_cast(res.fResultsPro[v]->Clone(Form("fTest0Pro[%d][%d][%s]", mo, mi, res.fResultsProRawName[v].Data()))); // yes + if (tc.fUseClone) { + t0.fTest0Pro[mo][mi][v] = reinterpret_cast(res.fResultsPro[v]->Clone(Form("fTest0Pro[%d][%d][%s]", mo, mi, res.fResultsProRawName[v].Data()))); // yes + } else { + // TBI 20250412 this branch is temporary workaround until hist->Clone(...) large memory consumption is resolved + if (res.fUseResultsProVariableLengthBins[v]) { + // per demand, variable-length binning: + t0.fTest0Pro[mo][mi][v] = new TProfile(Form("fTest0Pro[%d][%d][%s]", mo, mi, res.fResultsProRawName[v].Data()), "", res.fResultsProVariableLengthBins[v]->GetSize() - 1, res.fResultsProVariableLengthBins[v]->GetArray()); + } else { + // the default fixed-length binning: + t0.fTest0Pro[mo][mi][v] = new TProfile(Form("fTest0Pro[%d][%d][%s]", mo, mi, res.fResultsProRawName[v].Data()), "", static_cast(res.fResultsProFixedLengthBins[v][0]), res.fResultsProFixedLengthBins[v][1], res.fResultsProFixedLengthBins[v][2]); + } // else + } // else + t0.fTest0Pro[mo][mi][v]->SetStats(false); t0.fTest0Pro[mo][mi][v]->Sumw2(); t0.fTest0Pro[mo][mi][v]->SetTitle(t0.fTest0Labels[mo][mi]->Data()); t0.fTest0Pro[mo][mi][v]->GetXaxis()->SetTitle(FancyFormatting(res.fResultsProXaxisTitle[v].Data())); - /* - if(fUseFixedNumberOfRandomlySelectedParticles && 1==v) // just a warning for the meaning of multiplicity in this special case - { - fTest0Pro[mo][mi][1]->GetXaxis()->SetTitle("WARNING: for each multiplicity, fFixedNumberOfRandomlySelectedParticles is selected randomly in Q-vector"); - } - */ t0.fTest0List->Add(t0.fTest0Pro[mo][mi][v]); // yes, this has to be here + } // for(int v=0;vSetLineColor(eColor); es.fEtaSeparationsFlagsPro->SetFillColor(eFillColor); es.fEtaSeparationsFlagsPro->GetXaxis()->SetLabelSize(0.04); - es.fEtaSeparationsFlagsPro->GetXaxis()->SetBinLabel(1, "fCalculateEtaSeparations"); + + if (tc.fUseSetBinLabel) { + es.fEtaSeparationsFlagsPro->GetXaxis()->SetBinLabel(1, "fCalculateEtaSeparations"); + + // ... + } else { + // Workaround for SetBinLabel() large memory consumption: + TString yAxisTitle = ""; + + yAxisTitle += TString::Format("%d:fCalculateEtaSeparations; ", 1); + es.fEtaSeparationsFlagsPro->Fill(0.5, static_cast(es.fCalculateEtaSeparations)); + + // ... + + // *) Insanity check on the number of fields in this specially crafted y-axis title: + TObjArray* oa = yAxisTitle.Tokenize(";"); + if (!oa) { + LOGF(fatal, "\033[1;31m%s at line %d : oa is NULL\033[0m", __FUNCTION__, __LINE__); + } + if (oa->GetEntries() - 1 != es.fEtaSeparationsFlagsPro->GetNbinsX()) { + LOGF(fatal, "\033[1;31m%s at line %d : oa->GetEntries() - 1 = %d != es.fEtaSeparationsFlagsPro->GetNbinsX() = %d\033[0m", __FUNCTION__, __LINE__, oa->GetEntries(), es.fEtaSeparationsFlagsPro->GetNbinsX()); + } + + // *) Okay, set the title: + es.fEtaSeparationsFlagsPro->GetYaxis()->SetTitle(yAxisTitle.Data()); + + // ... + + } // else + es.fEtaSeparationsFlagsPro->Fill(0.5, es.fCalculateEtaSeparations); es.fEtaSeparationsList->Add(es.fEtaSeparationsFlagsPro); @@ -6053,7 +6728,19 @@ void BookEtaSeparationsHistograms() LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); } - es.fEtaSeparationsPro[h][e][v] = reinterpret_cast(res.fResultsPro[v]->Clone(Form("fEtaSeparationsPro[%d][%d][%s]", h, e, res.fResultsProRawName[v].Data()))); // yes + if (tc.fUseClone) { + es.fEtaSeparationsPro[h][e][v] = reinterpret_cast(res.fResultsPro[v]->Clone(Form("fEtaSeparationsPro[%d][%d][%s]", h, e, res.fResultsProRawName[v].Data()))); // yes + } else { + // TBI 20250412 this branch is temporary workaround until hist->Clone(...) large memory consumption is resolved + if (res.fUseResultsProVariableLengthBins[v]) { + // per demand, variable-length binning: + es.fEtaSeparationsPro[h][e][v] = new TProfile(Form("fEtaSeparationsPro[%d][%d][%s]", h, e, res.fResultsProRawName[v].Data()), "", res.fResultsProVariableLengthBins[v]->GetSize() - 1, res.fResultsProVariableLengthBins[v]->GetArray()); + } else { + // the default fixed-length binning: + es.fEtaSeparationsPro[h][e][v] = new TProfile(Form("fEtaSeparationsPro[%d][%d][%s]", h, e, res.fResultsProRawName[v].Data()), "", static_cast(res.fResultsProFixedLengthBins[v][0]), res.fResultsProFixedLengthBins[v][1], res.fResultsProFixedLengthBins[v][2]); + } // else + } // else + es.fEtaSeparationsPro[h][e][v]->SetStats(false); es.fEtaSeparationsPro[h][e][v]->Sumw2(); es.fEtaSeparationsPro[h][e][v]->SetTitle(Form("%d -%d, |#Delta#eta| > %.2f", h + 1, h + 1, es.fEtaSeparationsValues[e])); @@ -6095,9 +6782,35 @@ void BookResultsHistograms() res.fResultsFlagsPro->SetStats(false); res.fResultsFlagsPro->SetLineColor(eColor); res.fResultsFlagsPro->SetFillColor(eFillColor); - res.fResultsFlagsPro->GetXaxis()->SetBinLabel(1, "fSaveResultsHistograms"); - res.fResultsFlagsPro->Fill(0.5, res.fSaveResultsHistograms); - // ... + + if (tc.fUseSetBinLabel) { + res.fResultsFlagsPro->GetXaxis()->SetBinLabel(1, "fSaveResultsHistograms"); + res.fResultsFlagsPro->Fill(0.5, res.fSaveResultsHistograms); + + // ... + + } else { + // Workaround for SetBinLabel() large memory consumption: + TString yAxisTitle = ""; + + yAxisTitle += TString::Format("%d:fSaveResultsHistograms; ", 1); + res.fResultsFlagsPro->Fill(0.5, static_cast(res.fSaveResultsHistograms)); + + // ... + + // *) Insanity check on the number of fields in this specially crafted y-axis title: + TObjArray* oa = yAxisTitle.Tokenize(";"); + if (!oa) { + LOGF(fatal, "\033[1;31m%s at line %d : oa is NULL\033[0m", __FUNCTION__, __LINE__); + } + if (oa->GetEntries() - 1 != res.fResultsFlagsPro->GetNbinsX()) { + LOGF(fatal, "\033[1;31m%s at line %d : oa->GetEntries() = %d != res.fResultsFlagsPro->GetNbinsX() = %d\033[0m", __FUNCTION__, __LINE__, oa->GetEntries(), res.fResultsFlagsPro->GetNbinsX()); + } + delete oa; + + // *) Okay, set the title: + res.fResultsFlagsPro->GetYaxis()->SetTitle(yAxisTitle.Data()); + } res.fResultsList->Add(res.fResultsFlagsPro); // b) Book results histograms, which in addition act as a sort of "abstract" interface, which defines common binning, etc., for other groups of histograms: @@ -6177,6 +6890,7 @@ void Preprocess(T1 const& collision, T2 const& bcs) DetermineRunNumber(collision, bcs); PropagateRunNumber(); } + if (tc.fDoAdditionalInsanityChecks && tc.fRunNumberIsDetermined) { CheckCurrentRunNumber(collision, bcs); } @@ -6198,6 +6912,7 @@ void Preprocess(T1 const& collision, T2 const& bcs) // integrated weights and differentials weights without sparse histograms (the latter is becoming obsolete): if (pw.fUseWeights[wPHI] || pw.fUseWeights[wPT] || pw.fUseWeights[wETA] || pw.fUseDiffWeights[wPHIPT] || pw.fUseDiffWeights[wPHIETA]) { + GetParticleWeights(); pw.fParticleWeightsAreFetched = true; } @@ -6308,7 +7023,13 @@ void PropagateRunNumber() } // *) base: - fBasePro->GetXaxis()->SetBinLabel(eRunNumber, Form("fRunNumber = %s", tc.fRunNumber.Data())); + if (tc.fUseSetBinLabel) { + fBasePro->GetXaxis()->SetBinLabel(eRunNumber, Form("fRunNumber = %s", tc.fRunNumber.Data())); + } else { + // Workaround for SetBinLabel() large memory consumption: + TString tmp = fBasePro->GetYaxis()->GetTitle(); + fBasePro->GetYaxis()->SetTitle(tmp.ReplaceAll("__RUN_NUMBER__", tc.fRunNumber.Data())); + } // else // *) common title var: TString histTitle = ""; @@ -6556,6 +7277,7 @@ void CheckCurrentRunNumber(T1 const& collision, T2 const&) if constexpr (rs == eRec || rs == eRec_Run2 || rs == eQA) { // **) Check run number: + auto bc = collision.template foundBC_as(); // I have the same code snippet at other places, keep in sync. if (!tc.fRunNumber.EqualTo(Form("%d", bc.runNumber()))) { LOGF(error, "\033[1;33m%s Run number changed within process(). This most likely indicates that a given masterjob is processing 2 or more different runs in one go.\033[0m", __FUNCTION__); @@ -6786,18 +7508,48 @@ void EventCutsCounters(T1 const& collision, T2 const& tracks) if (!ec.fEventCutCounterHist[rec_sim][cc]) { continue; } - for (int bin = 1; bin < ec.fEventCutCounterBinNumber[rec_sim]; bin++) // implemented and used cuts in this analysis - { - ec.fEventCutCounterHist[rec_sim][cc]->GetXaxis()->SetBinLabel(bin, FancyFormatting(ec.fEventCutName[ec.fEventCutCounterMap[rec_sim]->GetValue(bin)].Data())); - } - for (int bin = ec.fEventCutCounterBinNumber[rec_sim]; bin <= eEventCuts_N; bin++) // implemented, but unused cuts in this analysis - { - ec.fEventCutCounterHist[rec_sim][cc]->GetXaxis()->SetBinLabel(bin, Form("binNo = %d (unused cut)", bin)); - // Remark: I have to write here something concrete as a bin label, if I leave "TBI" for all bin labels here for cuts which were not used, - // I get this harmless but annoying warning during merging: - // Warning in : Histogram fEventCutCounterHist[rec][seq] has duplicate labels in the x axis. Bin contents will be merged in a single bin - // TBI 20241130 as a better solution, I shall re-define this histogram with the narower range on x-axis... - } + + if (tc.fUseSetBinLabel) { + for (int bin = 1; bin < ec.fEventCutCounterBinNumber[rec_sim]; bin++) // implemented and used cuts in this analysis + { + ec.fEventCutCounterHist[rec_sim][cc]->GetXaxis()->SetBinLabel(bin, FancyFormatting(ec.fEventCutName[ec.fEventCutCounterMap[rec_sim]->GetValue(bin)].Data())); + } + for (int bin = ec.fEventCutCounterBinNumber[rec_sim]; bin <= eEventCuts_N; bin++) // implemented, but unused cuts in this analysis + { + ec.fEventCutCounterHist[rec_sim][cc]->GetXaxis()->SetBinLabel(bin, TString::Format("binNo = %d (unused cut)", bin)); + // Remark: I have to write here something concrete as a bin label, if I leave "TBI" for all bin labels here for cuts which were not used, + // I get this harmless but annoying warning during merging: + // Warning in : Histogram fEventCutCounterHist[rec][seq] has duplicate labels in the x axis. Bin contents will be merged in a single bin + // TBI 20241130 as a better solution, I shall re-define this histogram with the narower range on x-axis... + } + } else { + + // Workaround for SetBinLabel() large memory consumption: + TString yAxisTitle = ""; + for (int bin = 1; bin < ec.fEventCutCounterBinNumber[rec_sim]; bin++) // implemented and used cuts in this analysis + { + yAxisTitle += TString::Format("%d:%s; ", bin, FancyFormatting(ec.fEventCutName[ec.fEventCutCounterMap[rec_sim]->GetValue(bin)].Data())); + } + for (int bin = ec.fEventCutCounterBinNumber[rec_sim]; bin <= eEventCuts_N; bin++) // implemented, but unused cuts in this analysis + { + yAxisTitle += TString::Format("%d:%s; ", bin, TString::Format("binNo = %d (unused cut)", bin).Data()); + } + + // *) Insanity check on the number of fields in this specially crafted y-axis title: + TObjArray* oa = yAxisTitle.Tokenize(";"); + if (!oa) { + LOGF(fatal, "\033[1;31m%s at line %d : oa is NULL\033[0m", __FUNCTION__, __LINE__); + } + if (oa->GetEntries() - 1 != ec.fEventCutCounterHist[rec_sim][cc]->GetNbinsX()) { + LOGF(fatal, "\033[1;31m%s at line %d : oa->GetEntries() = %d != ec.fEventCutCounterHist[rec_sim][cc]->GetNbinsX() = %d\033[0m", __FUNCTION__, __LINE__, oa->GetEntries(), ec.fEventCutCounterHist[rec_sim][cc]->GetNbinsX()); + } + delete oa; + + // *) Okay, set the title: + ec.fEventCutCounterHist[rec_sim][cc]->GetYaxis()->SetTitle(yAxisTitle.Data()); + + } // else + // All cuts which were implemeted, but not used I simply do not show (i can always UnZoom x-axis in TBrowser, if I want to see 'em): ec.fEventCutCounterHist[rec_sim][cc]->GetXaxis()->SetRangeUser(ec.fEventCutCounterHist[rec_sim][cc]->GetBinLowEdge(1), ec.fEventCutCounterHist[rec_sim][cc]->GetBinLowEdge(ec.fEventCutCounterBinNumber[rec_sim])); } @@ -6845,7 +7597,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) { // Event cuts on reconstructed and simulated data. Supports event cut counters, both absolute and sequential. // There is also a related enum eEventCuts. - // Remark: I have added to all if statemets below which deals with floats, e.g. TMath::Abs(ebye.fCentrality - ec.fdEventCuts[eCentrality][eMax]) < tc.fFloatingPointPrecision , + // Remark: I have added to all if statemets below which deals with floats, e.g. std::abs(ebye.fCentrality - ec.fdEventCuts[eCentrality][eMax]) < tc.fFloatingPointPrecision , // to enforce the ROOT convention: "lower boundary included, upper boundary excluded" // a) Event cuts on reconstructed, and corresponding MC truth simulated (common to Run 3, Run 2 and Run 1); @@ -6908,7 +7660,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) if (ec.fUseEventCuts[eTotalMultiplicity]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eTotalMultiplicity, eCutCounterBinning); - } else if (tracks.size() < ec.fdEventCuts[eTotalMultiplicity][eMin] || tracks.size() > ec.fdEventCuts[eTotalMultiplicity][eMax] || TMath::Abs(tracks.size() - ec.fdEventCuts[eTotalMultiplicity][eMax]) < tc.fFloatingPointPrecision) { + } else if (tracks.size() < ec.fdEventCuts[eTotalMultiplicity][eMin] || tracks.size() > ec.fdEventCuts[eTotalMultiplicity][eMax] || std::abs(tracks.size() - ec.fdEventCuts[eTotalMultiplicity][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eRec, eTotalMultiplicity, cutModus)) { return false; } @@ -6924,7 +7676,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) if (ec.fUseEventCuts[eReferenceMultiplicity]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eReferenceMultiplicity, eCutCounterBinning); - } else if (ebye.fReferenceMultiplicity < ec.fdEventCuts[eReferenceMultiplicity][eMin] || ebye.fReferenceMultiplicity > ec.fdEventCuts[eReferenceMultiplicity][eMax] || TMath::Abs(ebye.fReferenceMultiplicity - ec.fdEventCuts[eReferenceMultiplicity][eMax]) < tc.fFloatingPointPrecision) { + } else if (ebye.fReferenceMultiplicity < ec.fdEventCuts[eReferenceMultiplicity][eMin] || ebye.fReferenceMultiplicity > ec.fdEventCuts[eReferenceMultiplicity][eMax] || std::abs(ebye.fReferenceMultiplicity - ec.fdEventCuts[eReferenceMultiplicity][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eRec, eReferenceMultiplicity, cutModus)) { return false; } @@ -6936,7 +7688,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) if (ec.fUseEventCuts[eCentrality]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eCentrality, eCutCounterBinning); - } else if (ebye.fCentrality < ec.fdEventCuts[eCentrality][eMin] || ebye.fCentrality > ec.fdEventCuts[eCentrality][eMax] || TMath::Abs(ebye.fCentrality - ec.fdEventCuts[eCentrality][eMax]) < tc.fFloatingPointPrecision) { + } else if (ebye.fCentrality < ec.fdEventCuts[eCentrality][eMin] || ebye.fCentrality > ec.fdEventCuts[eCentrality][eMax] || std::abs(ebye.fCentrality - ec.fdEventCuts[eCentrality][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eRec, eCentrality, cutModus)) { return false; } @@ -6947,7 +7699,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) if (ec.fUseEventCuts[eVertexX]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eVertexX, eCutCounterBinning); - } else if (collision.posX() < ec.fdEventCuts[eVertexX][eMin] || collision.posX() > ec.fdEventCuts[eVertexX][eMax] || TMath::Abs(collision.posX() - ec.fdEventCuts[eVertexX][eMax]) < tc.fFloatingPointPrecision) { + } else if (collision.posX() < ec.fdEventCuts[eVertexX][eMin] || collision.posX() > ec.fdEventCuts[eVertexX][eMax] || std::abs(collision.posX() - ec.fdEventCuts[eVertexX][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eRec, eVertexX, cutModus)) { return false; } @@ -6958,7 +7710,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) if (ec.fUseEventCuts[eVertexY]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eVertexY, eCutCounterBinning); - } else if (collision.posY() < ec.fdEventCuts[eVertexY][eMin] || collision.posY() > ec.fdEventCuts[eVertexY][eMax] || TMath::Abs(collision.posY() - ec.fdEventCuts[eVertexY][eMax]) < tc.fFloatingPointPrecision) { + } else if (collision.posY() < ec.fdEventCuts[eVertexY][eMin] || collision.posY() > ec.fdEventCuts[eVertexY][eMax] || std::abs(collision.posY() - ec.fdEventCuts[eVertexY][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eRec, eVertexY, cutModus)) { return false; } @@ -6969,7 +7721,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) if (ec.fUseEventCuts[eVertexZ]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eVertexZ, eCutCounterBinning); - } else if (collision.posZ() < ec.fdEventCuts[eVertexZ][eMin] || collision.posZ() > ec.fdEventCuts[eVertexZ][eMax] || TMath::Abs(collision.posZ() - ec.fdEventCuts[eVertexZ][eMax]) < tc.fFloatingPointPrecision) { + } else if (collision.posZ() < ec.fdEventCuts[eVertexZ][eMin] || collision.posZ() > ec.fdEventCuts[eVertexZ][eMax] || std::abs(collision.posZ() - ec.fdEventCuts[eVertexZ][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eRec, eVertexZ, cutModus)) { return false; } @@ -6991,7 +7743,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) if (ec.fUseEventCuts[eNContributors]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eNContributors, eCutCounterBinning); - } else if (collision.numContrib() < ec.fdEventCuts[eNContributors][eMin] || collision.numContrib() > ec.fdEventCuts[eNContributors][eMax] || TMath::Abs(collision.numContrib() - ec.fdEventCuts[eNContributors][eMax]) < tc.fFloatingPointPrecision) { + } else if (collision.numContrib() < ec.fdEventCuts[eNContributors][eMin] || collision.numContrib() > ec.fdEventCuts[eNContributors][eMax] || std::abs(collision.numContrib() - ec.fdEventCuts[eNContributors][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eRec, eNContributors, cutModus)) { return false; } @@ -7002,7 +7754,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) if (ec.fUseEventCuts[eRefMultVsNContrUp]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eRefMultVsNContrUp, eCutCounterBinning); - } else if (collision.numContrib() > ec.fEventCutsFormulas[eRefMultVsNContrUp_Formula]->Eval(ebye.fReferenceMultiplicity)) { + } else if (collision.numContrib() > (tc.fUseFormula ? ec.fEventCutsFormulas[eRefMultVsNContrUp_Formula]->Eval(ebye.fReferenceMultiplicity) : RefMultVsNContr(ebye.fReferenceMultiplicity, eRefMultVsNContrUp_Formula))) { if (!EventCut(eRec, eRefMultVsNContrUp, cutModus)) { return false; } @@ -7013,7 +7765,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) if (ec.fUseEventCuts[eRefMultVsNContrLow]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eRefMultVsNContrLow, eCutCounterBinning); - } else if (collision.numContrib() < ec.fEventCutsFormulas[eRefMultVsNContrLow_Formula]->Eval(ebye.fReferenceMultiplicity)) { + } else if (collision.numContrib() < (tc.fUseFormula ? ec.fEventCutsFormulas[eRefMultVsNContrLow_Formula]->Eval(ebye.fReferenceMultiplicity) : RefMultVsNContr(ebye.fReferenceMultiplicity, eRefMultVsNContrLow_Formula))) { if (!EventCut(eRec, eRefMultVsNContrLow, cutModus)) { return false; } @@ -7064,7 +7816,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) if (ec.fUseEventCuts[eImpactParameter]) { if (cutModus == eCutCounterBinning) { EventCut(eSim, eImpactParameter, eCutCounterBinning); - } else if (collision.impactParameter() < ec.fdEventCuts[eImpactParameter][eMin] || collision.impactParameter() > ec.fdEventCuts[eImpactParameter][eMax] || TMath::Abs(collision.impactParameter() - ec.fdEventCuts[eImpactParameter][eMax]) < tc.fFloatingPointPrecision) { + } else if (collision.impactParameter() < ec.fdEventCuts[eImpactParameter][eMin] || collision.impactParameter() > ec.fdEventCuts[eImpactParameter][eMax] || std::abs(collision.impactParameter() - ec.fdEventCuts[eImpactParameter][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eSim, eImpactParameter, cutModus)) { return false; } @@ -7075,7 +7827,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) if (ec.fUseEventCuts[eEventPlaneAngle]) { if (cutModus == eCutCounterBinning) { EventCut(eSim, eEventPlaneAngle, eCutCounterBinning); - } else if (collision.eventPlaneAngle() < ec.fdEventCuts[eEventPlaneAngle][eMin] || collision.eventPlaneAngle() > ec.fdEventCuts[eEventPlaneAngle][eMax] || TMath::Abs(collision.eventPlaneAngle() - ec.fdEventCuts[eEventPlaneAngle][eMax]) < tc.fFloatingPointPrecision) { + } else if (collision.eventPlaneAngle() < ec.fdEventCuts[eEventPlaneAngle][eMin] || collision.eventPlaneAngle() > ec.fdEventCuts[eEventPlaneAngle][eMax] || std::abs(collision.eventPlaneAngle() - ec.fdEventCuts[eEventPlaneAngle][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eSim, eEventPlaneAngle, cutModus)) { return false; } @@ -7094,7 +7846,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) if (ec.fUseEventCuts[eVertexX]) { if (cutModus == eCutCounterBinning) { EventCut(eSim, eVertexX, eCutCounterBinning); - } else if (collision.posX() < ec.fdEventCuts[eVertexX][eMin] || collision.posX() > ec.fdEventCuts[eVertexX][eMax] || TMath::Abs(collision.posX() - ec.fdEventCuts[eVertexX][eMax]) < tc.fFloatingPointPrecision) { + } else if (collision.posX() < ec.fdEventCuts[eVertexX][eMin] || collision.posX() > ec.fdEventCuts[eVertexX][eMax] || std::abs(collision.posX() - ec.fdEventCuts[eVertexX][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eSim, eVertexX, cutModus)) { return false; } @@ -7105,7 +7857,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) if (ec.fUseEventCuts[eVertexY]) { if (cutModus == eCutCounterBinning) { EventCut(eSim, eVertexY, eCutCounterBinning); - } else if (collision.posY() < ec.fdEventCuts[eVertexY][eMin] || collision.posY() > ec.fdEventCuts[eVertexY][eMax] || TMath::Abs(collision.posY() - ec.fdEventCuts[eVertexY][eMax]) < tc.fFloatingPointPrecision) { + } else if (collision.posY() < ec.fdEventCuts[eVertexY][eMin] || collision.posY() > ec.fdEventCuts[eVertexY][eMax] || std::abs(collision.posY() - ec.fdEventCuts[eVertexY][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eSim, eVertexY, cutModus)) { return false; } @@ -7116,7 +7868,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) if (ec.fUseEventCuts[eVertexZ]) { if (cutModus == eCutCounterBinning) { EventCut(eSim, eVertexZ, eCutCounterBinning); - } else if (collision.posZ() < ec.fdEventCuts[eVertexZ][eMin] || collision.posZ() > ec.fdEventCuts[eVertexZ][eMax] || TMath::Abs(collision.posZ() - ec.fdEventCuts[eVertexZ][eMax]) < tc.fFloatingPointPrecision) { + } else if (collision.posZ() < ec.fdEventCuts[eVertexZ][eMin] || collision.posZ() > ec.fdEventCuts[eVertexZ][eMax] || std::abs(collision.posZ() - ec.fdEventCuts[eVertexZ][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eSim, eVertexZ, cutModus)) { return false; } @@ -7157,7 +7909,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) if (ec.fUseEventCuts[eOccupancy]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eOccupancy, eCutCounterBinning); - } else if (ebye.fOccupancy < ec.fdEventCuts[eOccupancy][eMin] || ebye.fOccupancy > ec.fdEventCuts[eOccupancy][eMax] || TMath::Abs(ebye.fOccupancy - ec.fdEventCuts[eOccupancy][eMax]) < tc.fFloatingPointPrecision) { + } else if (ebye.fOccupancy < ec.fdEventCuts[eOccupancy][eMin] || ebye.fOccupancy > ec.fdEventCuts[eOccupancy][eMax] || std::abs(ebye.fOccupancy - ec.fdEventCuts[eOccupancy][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eRec, eOccupancy, cutModus)) { return false; } @@ -7168,7 +7920,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) if (ec.fUseEventCuts[eInteractionRate]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eInteractionRate, eCutCounterBinning); - } else if (ebye.fInteractionRate < ec.fdEventCuts[eInteractionRate][eMin] || ebye.fInteractionRate > ec.fdEventCuts[eInteractionRate][eMax] || TMath::Abs(ebye.fInteractionRate - ec.fdEventCuts[eInteractionRate][eMax]) < tc.fFloatingPointPrecision) { + } else if (ebye.fInteractionRate < ec.fdEventCuts[eInteractionRate][eMin] || ebye.fInteractionRate > ec.fdEventCuts[eInteractionRate][eMax] || std::abs(ebye.fInteractionRate - ec.fdEventCuts[eInteractionRate][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eRec, eInteractionRate, cutModus)) { return false; } @@ -7179,7 +7931,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) if (ec.fUseEventCuts[eCurrentRunDuration]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eCurrentRunDuration, eCutCounterBinning); - } else if (ebye.fCurrentRunDuration < ec.fdEventCuts[eCurrentRunDuration][eMin] || ebye.fCurrentRunDuration > ec.fdEventCuts[eCurrentRunDuration][eMax] || TMath::Abs(ebye.fCurrentRunDuration - ec.fdEventCuts[eCurrentRunDuration][eMax]) < tc.fFloatingPointPrecision) { + } else if (ebye.fCurrentRunDuration < ec.fdEventCuts[eCurrentRunDuration][eMin] || ebye.fCurrentRunDuration > ec.fdEventCuts[eCurrentRunDuration][eMax] || std::abs(ebye.fCurrentRunDuration - ec.fdEventCuts[eCurrentRunDuration][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eRec, eCurrentRunDuration, cutModus)) { return false; } @@ -7488,7 +8240,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) if (ec.fUseEventCuts[eTotalMultiplicity]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eTotalMultiplicity, eCutCounterBinning); - } else if (tracks.size() < ec.fdEventCuts[eTotalMultiplicity][eMin] || tracks.size() > ec.fdEventCuts[eTotalMultiplicity][eMax] || TMath::Abs(tracks.size() - ec.fdEventCuts[eTotalMultiplicity][eMax]) < tc.fFloatingPointPrecision) { + } else if (tracks.size() < ec.fdEventCuts[eTotalMultiplicity][eMin] || tracks.size() > ec.fdEventCuts[eTotalMultiplicity][eMax] || std::abs(tracks.size() - ec.fdEventCuts[eTotalMultiplicity][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eRec, eTotalMultiplicity, cutModus)) { return false; } @@ -7499,7 +8251,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) if (ec.fUseEventCuts[eVertexZ]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eVertexZ, eCutCounterBinning); - } else if (collision.posZ() < ec.fdEventCuts[eVertexZ][eMin] || collision.posZ() > ec.fdEventCuts[eVertexZ][eMax] || TMath::Abs(collision.posZ() - ec.fdEventCuts[eVertexZ][eMax]) < tc.fFloatingPointPrecision) { + } else if (collision.posZ() < ec.fdEventCuts[eVertexZ][eMin] || collision.posZ() > ec.fdEventCuts[eVertexZ][eMax] || std::abs(collision.posZ() - ec.fdEventCuts[eVertexZ][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eRec, eVertexZ, cutModus)) { return false; } @@ -7510,7 +8262,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) if (ec.fUseEventCuts[eCentrality]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eCentrality, eCutCounterBinning); - } else if (ebye.fCentrality < ec.fdEventCuts[eCentrality][eMin] || ebye.fCentrality > ec.fdEventCuts[eCentrality][eMax] || TMath::Abs(ebye.fCentrality - ec.fdEventCuts[eCentrality][eMax]) < tc.fFloatingPointPrecision) { + } else if (ebye.fCentrality < ec.fdEventCuts[eCentrality][eMin] || ebye.fCentrality > ec.fdEventCuts[eCentrality][eMax] || std::abs(ebye.fCentrality - ec.fdEventCuts[eCentrality][eMax]) < tc.fFloatingPointPrecision) { if (!EventCut(eRec, eCentrality, cutModus)) { return false; } @@ -7609,7 +8361,7 @@ bool RemainingEventCuts() // *) Multiplicity: (see documentation for ebye.fMultiplicity for its definition) if (ec.fUseEventCuts[eMultiplicity]) { - if (ebye.fMultiplicity < ec.fdEventCuts[eMultiplicity][eMin] || ebye.fMultiplicity > ec.fdEventCuts[eMultiplicity][eMax] || TMath::Abs(ebye.fMultiplicity - ec.fdEventCuts[eMultiplicity][eMax]) < tc.fFloatingPointPrecision) { + if (ebye.fMultiplicity < ec.fdEventCuts[eMultiplicity][eMin] || ebye.fMultiplicity > ec.fdEventCuts[eMultiplicity][eMax] || std::abs(ebye.fMultiplicity - ec.fdEventCuts[eMultiplicity][eMax]) < tc.fFloatingPointPrecision) { // Remark: I have to implement RemainingEventCuts() in a slightly different way as EventCuts() EventCut(rs, eMultiplicity, eCut); // just a printout that this event didn't survive this cut if (ec.fUseEventCutCounterSequential) { // yes, this is important. Otherwise fEventCutCounterHist can be used in EventCut(...), even though it's NULL @@ -8334,15 +9086,26 @@ bool CentralityCorrelationCut() if (tc.fVerbose) { StartFunction(__FUNCTION__); + LOGF(info, "\033[1;33m%s at line %d : ec.fsEventCuts[eCentralityCorrelationsCut] = %s \033[0m", __FUNCTION__, __LINE__, ec.fsEventCuts[eCentralityCorrelationsCut].Data()); } bool alright = true; // this local variable holds the return value for this function // Algorithm: I extract e.g. from "CentFT0C_CentFT0M" that the first estimator is "CentFT0C" and second "CentFT0M", and for each estimator I fetch the corresponding centrality percentile: + if (!ec.fsEventCuts[eCentralityCorrelationsCut].Contains("_")) { + LOGF(fatal, "\033[1;31m%s at line %d : ec.fsEventCuts[eCentralityCorrelationsCut] = %s \033[0m", __FUNCTION__, __LINE__, ec.fsEventCuts[eCentralityCorrelationsCut].Data()); + } + TObjArray* oa = ec.fsEventCuts[eCentralityCorrelationsCut].Tokenize("_"); // TBI 20250331 let's see for how long I can use "_" safely as IFS ... - if (!oa) { + if (!oa || 2 != oa->GetEntries()) { LOGF(fatal, "\033[1;31m%s at line %d : oa is NULL , s = %s. Example format is e.g. \"CentFT0C_CentFT0M\"\033[0m", __FUNCTION__, __LINE__, ec.fsEventCuts[eCentralityCorrelationsCut].Data()); } + + if (tc.fVerbose) { + LOGF(info, "\033[1;33m%s at line %d : oa->At(0)->GetName() = %s \033[0m", __FUNCTION__, __LINE__, oa->At(0)->GetName()); + LOGF(info, "\033[1;33m%s at line %d : oa->At(1)->GetName() = %s \033[0m", __FUNCTION__, __LINE__, oa->At(1)->GetName()); + } + ec.fCentralityValues[0] = GetCentralityPercentile(oa->At(0)->GetName()); ec.fCentralityValues[1] = GetCentralityPercentile(oa->At(1)->GetName()); delete oa; // yes @@ -8353,11 +9116,11 @@ bool CentralityCorrelationCut() // *) ... if (ec.fCentralityValues[0] > 0. && ec.fCentralityValues[1] > 0.) { if (ec.fCentralityCorrelationsCutVersion.EqualTo("Relative")) { - if (TMath::Abs((ec.fCentralityValues[0] - ec.fCentralityValues[1]) / (ec.fCentralityValues[0] + ec.fCentralityValues[1])) > ec.fCentralityCorrelationsCutTreshold) { + if (std::abs((ec.fCentralityValues[0] - ec.fCentralityValues[1]) / (ec.fCentralityValues[0] + ec.fCentralityValues[1])) > ec.fCentralityCorrelationsCutTreshold) { alright = false; } } else if (ec.fCentralityCorrelationsCutVersion.EqualTo("Absolute")) { - if (TMath::Abs((ec.fCentralityValues[0] - ec.fCentralityValues[1])) > ec.fCentralityCorrelationsCutTreshold) { + if (std::abs((ec.fCentralityValues[0] - ec.fCentralityValues[1])) > ec.fCentralityCorrelationsCutTreshold) { alright = false; } } else { @@ -8399,17 +9162,47 @@ void ParticleCutsCounters(T const& track) if (!pc.fParticleCutCounterHist[rec_sim][cc]) { continue; } - for (int bin = 1; bin < pc.fParticleCutCounterBinNumber[rec_sim]; bin++) // implemented and used particle cuts in this analysis - { - pc.fParticleCutCounterHist[rec_sim][cc]->GetXaxis()->SetBinLabel(bin, FancyFormatting(pc.fParticleCutName[pc.fParticleCutCounterMap[rec_sim]->GetValue(bin)].Data())); - } - for (int bin = pc.fParticleCutCounterBinNumber[rec_sim]; bin <= eParticleCuts_N; bin++) // implemented, but unused particle cuts in this analysis - { - pc.fParticleCutCounterHist[rec_sim][cc]->GetXaxis()->SetBinLabel(bin, Form("binNo = %d (unused cut)", bin)); - // Remark: I have to write here something concrete as a bin label, if I leave "TBI" for all bin labels here for cuts which were not used, - // I get this harmless but annoying warning during merging: - // Warning in : Histogram fParticleCutCounterHist[rec][seq] has duplicate labels in the x axis. Bin contents will be merged in a single bin - // TBI 20241130 as a better solution, I shall re-define this histogram with the narower range on x-axis... + + if (tc.fUseSetBinLabel) { + + for (int bin = 1; bin < pc.fParticleCutCounterBinNumber[rec_sim]; bin++) // implemented and used particle cuts in this analysis + { + pc.fParticleCutCounterHist[rec_sim][cc]->GetXaxis()->SetBinLabel(bin, FancyFormatting(pc.fParticleCutName[pc.fParticleCutCounterMap[rec_sim]->GetValue(bin)].Data())); + } + for (int bin = pc.fParticleCutCounterBinNumber[rec_sim]; bin <= eParticleCuts_N; bin++) // implemented, but unused particle cuts in this analysis + { + pc.fParticleCutCounterHist[rec_sim][cc]->GetXaxis()->SetBinLabel(bin, Form("binNo = %d (unused cut)", bin)); + // Remark: I have to write here something concrete as a bin label, if I leave "TBI" for all bin labels here for cuts which were not used, + // I get this harmless but annoying warning during merging: + // Warning in : Histogram fParticleCutCounterHist[rec][seq] has duplicate labels in the x axis. Bin contents will be merged in a single bin + // TBI 20241130 as a better solution, I shall re-define this histogram with the narower range on x-axis... + } + + } else { + + // Workaround for SetBinLabel() large memory consumption: + TString yAxisTitle = ""; + for (int bin = 1; bin < pc.fParticleCutCounterBinNumber[rec_sim]; bin++) // implemented and used cuts in this analysis + { + yAxisTitle += TString::Format("%d:%s; ", bin, FancyFormatting(pc.fParticleCutName[pc.fParticleCutCounterMap[rec_sim]->GetValue(bin)].Data())); + } + for (int bin = pc.fParticleCutCounterBinNumber[rec_sim]; bin <= eParticleCuts_N; bin++) // implemented, but unused cuts in this analysis + { + yAxisTitle += TString::Format("%d:%s; ", bin, TString::Format("binNo = %d (unused cut)", bin).Data()); + } + + // *) Insanity check on the number of fields in this specially crafted y-axis title: + TObjArray* oa = yAxisTitle.Tokenize(";"); + if (!oa) { + LOGF(fatal, "\033[1;31m%s at line %d : oa is NULL\033[0m", __FUNCTION__, __LINE__); + } + if (oa->GetEntries() - 1 != pc.fParticleCutCounterHist[rec_sim][cc]->GetNbinsX()) { + LOGF(fatal, "\033[1;31m%s at line %d : oa->GetEntries() = %d != pc.fParticleCutCounterHist[rec_sim][cc]->GetNbinsX() = %d\033[0m", __FUNCTION__, __LINE__, oa->GetEntries(), pc.fParticleCutCounterHist[rec_sim][cc]->GetNbinsX()); + } + delete oa; + + // *) Okay, set the title: + pc.fParticleCutCounterHist[rec_sim][cc]->GetYaxis()->SetTitle(yAxisTitle.Data()); } // All cuts which were implemeted, but not used I simply do not show (i can always UnZoom x-axis in TBrowser, if I want to see 'em). pc.fParticleCutCounterHist[rec_sim][cc]->GetXaxis()->SetRangeUser(pc.fParticleCutCounterHist[rec_sim][cc]->GetBinLowEdge(1), pc.fParticleCutCounterHist[rec_sim][cc]->GetBinLowEdge(pc.fParticleCutCounterBinNumber[rec_sim])); @@ -8445,7 +9238,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) { // Particle cuts on reconstructed and simulated data. Supports particle cut counters, both absolute and sequential. // There is also a related enum eParticleCuts. - // Remark: I have added to all if statemets below which deals with floats, e.g. TMath::Abs(track.eta() - pc.fdParticleCuts[eEta][eMax]) < tc.fFloatingPointPrecision , + // Remark: I have added to all if statemets below which deals with floats, e.g. std::abs(track.eta() - pc.fdParticleCuts[eEta][eMax]) < tc.fFloatingPointPrecision , // to enforce the ROOT convention: "lower boundary included, upper boundary excluded" // a) Particle cuts on reconstructed, and corresponding MC truth simulated (common to Run 3, Run 2 and Run 1); @@ -8470,7 +9263,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) if (pc.fUseParticleCuts[ePhi]) { if (cutModus == eCutCounterBinning) { ParticleCut(eRec, ePhi, eCutCounterBinning); - } else if (track.phi() < pc.fdParticleCuts[ePhi][eMin] || track.phi() > pc.fdParticleCuts[ePhi][eMax] || TMath::Abs(track.phi() - pc.fdParticleCuts[ePhi][eMax]) < tc.fFloatingPointPrecision) { + } else if (track.phi() < pc.fdParticleCuts[ePhi][eMin] || track.phi() > pc.fdParticleCuts[ePhi][eMax] || std::abs(track.phi() - pc.fdParticleCuts[ePhi][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eRec, ePhi, cutModus)) { return false; } @@ -8481,7 +9274,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) if (pc.fUseParticleCuts[ePt]) { if (cutModus == eCutCounterBinning) { ParticleCut(eRec, ePt, eCutCounterBinning); - } else if (track.pt() < pc.fdParticleCuts[ePt][eMin] || track.pt() > pc.fdParticleCuts[ePt][eMax] || TMath::Abs(track.pt() - pc.fdParticleCuts[ePt][eMax]) < tc.fFloatingPointPrecision) { + } else if (track.pt() < pc.fdParticleCuts[ePt][eMin] || track.pt() > pc.fdParticleCuts[ePt][eMax] || std::abs(track.pt() - pc.fdParticleCuts[ePt][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eRec, ePt, cutModus)) { return false; } @@ -8492,7 +9285,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) if (pc.fUseParticleCuts[eEta]) { if (cutModus == eCutCounterBinning) { ParticleCut(eRec, eEta, eCutCounterBinning); - } else if (track.eta() < pc.fdParticleCuts[eEta][eMin] || track.eta() > pc.fdParticleCuts[eEta][eMax] || TMath::Abs(track.eta() - pc.fdParticleCuts[eEta][eMax]) < tc.fFloatingPointPrecision) { + } else if (track.eta() < pc.fdParticleCuts[eEta][eMin] || track.eta() > pc.fdParticleCuts[eEta][eMax] || std::abs(track.eta() - pc.fdParticleCuts[eEta][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eRec, eEta, cutModus)) { return false; } @@ -8593,7 +9386,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) if (pc.fUseParticleCuts[etpcCrossedRowsOverFindableCls]) { if (cutModus == eCutCounterBinning) { ParticleCut(eRec, etpcCrossedRowsOverFindableCls, eCutCounterBinning); - } else if (track.tpcCrossedRowsOverFindableCls() < pc.fdParticleCuts[etpcCrossedRowsOverFindableCls][eMin] || track.tpcCrossedRowsOverFindableCls() > pc.fdParticleCuts[etpcCrossedRowsOverFindableCls][eMax] || TMath::Abs(track.tpcCrossedRowsOverFindableCls() - pc.fdParticleCuts[etpcCrossedRowsOverFindableCls][eMax]) < tc.fFloatingPointPrecision) { + } else if (track.tpcCrossedRowsOverFindableCls() < pc.fdParticleCuts[etpcCrossedRowsOverFindableCls][eMin] || track.tpcCrossedRowsOverFindableCls() > pc.fdParticleCuts[etpcCrossedRowsOverFindableCls][eMax] || std::abs(track.tpcCrossedRowsOverFindableCls() - pc.fdParticleCuts[etpcCrossedRowsOverFindableCls][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eRec, etpcCrossedRowsOverFindableCls, cutModus)) { return false; } @@ -8604,7 +9397,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) if (pc.fUseParticleCuts[etpcFoundOverFindableCls]) { if (cutModus == eCutCounterBinning) { ParticleCut(eRec, etpcFoundOverFindableCls, eCutCounterBinning); - } else if (track.tpcFoundOverFindableCls() < pc.fdParticleCuts[etpcFoundOverFindableCls][eMin] || track.tpcFoundOverFindableCls() > pc.fdParticleCuts[etpcFoundOverFindableCls][eMax] || TMath::Abs(track.tpcFoundOverFindableCls() - pc.fdParticleCuts[etpcFoundOverFindableCls][eMax]) < tc.fFloatingPointPrecision) { + } else if (track.tpcFoundOverFindableCls() < pc.fdParticleCuts[etpcFoundOverFindableCls][eMin] || track.tpcFoundOverFindableCls() > pc.fdParticleCuts[etpcFoundOverFindableCls][eMax] || std::abs(track.tpcFoundOverFindableCls() - pc.fdParticleCuts[etpcFoundOverFindableCls][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eRec, etpcFoundOverFindableCls, cutModus)) { return false; } @@ -8615,7 +9408,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) if (pc.fUseParticleCuts[etpcFractionSharedCls]) { if (cutModus == eCutCounterBinning) { ParticleCut(eRec, etpcFractionSharedCls, eCutCounterBinning); - } else if (track.tpcFractionSharedCls() < pc.fdParticleCuts[etpcFractionSharedCls][eMin] || track.tpcFractionSharedCls() > pc.fdParticleCuts[etpcFractionSharedCls][eMax] || TMath::Abs(track.tpcFractionSharedCls() - pc.fdParticleCuts[etpcFractionSharedCls][eMax]) < tc.fFloatingPointPrecision) { + } else if (track.tpcFractionSharedCls() < pc.fdParticleCuts[etpcFractionSharedCls][eMin] || track.tpcFractionSharedCls() > pc.fdParticleCuts[etpcFractionSharedCls][eMax] || std::abs(track.tpcFractionSharedCls() - pc.fdParticleCuts[etpcFractionSharedCls][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eRec, etpcFractionSharedCls, cutModus)) { return false; } @@ -8626,7 +9419,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) if (pc.fUseParticleCuts[etpcChi2NCl]) { if (cutModus == eCutCounterBinning) { ParticleCut(eRec, etpcChi2NCl, eCutCounterBinning); - } else if (track.tpcChi2NCl() < pc.fdParticleCuts[etpcChi2NCl][eMin] || track.tpcChi2NCl() > pc.fdParticleCuts[etpcChi2NCl][eMax] || TMath::Abs(track.tpcChi2NCl() - pc.fdParticleCuts[etpcChi2NCl][eMax]) < tc.fFloatingPointPrecision) { + } else if (track.tpcChi2NCl() < pc.fdParticleCuts[etpcChi2NCl][eMin] || track.tpcChi2NCl() > pc.fdParticleCuts[etpcChi2NCl][eMax] || std::abs(track.tpcChi2NCl() - pc.fdParticleCuts[etpcChi2NCl][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eRec, etpcChi2NCl, cutModus)) { return false; } @@ -8637,7 +9430,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) if (pc.fUseParticleCuts[edcaXY]) { if (cutModus == eCutCounterBinning) { ParticleCut(eRec, edcaXY, eCutCounterBinning); - } else if (track.dcaXY() < pc.fdParticleCuts[edcaXY][eMin] || track.dcaXY() > pc.fdParticleCuts[edcaXY][eMax] || TMath::Abs(track.dcaXY() - pc.fdParticleCuts[edcaXY][eMax]) < tc.fFloatingPointPrecision) { + } else if (track.dcaXY() < pc.fdParticleCuts[edcaXY][eMin] || track.dcaXY() > pc.fdParticleCuts[edcaXY][eMax] || std::abs(track.dcaXY() - pc.fdParticleCuts[edcaXY][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eRec, edcaXY, cutModus)) { return false; } @@ -8648,7 +9441,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) if (pc.fUseParticleCuts[edcaZ]) { if (cutModus == eCutCounterBinning) { ParticleCut(eRec, edcaZ, eCutCounterBinning); - } else if (track.dcaZ() < pc.fdParticleCuts[edcaZ][eMin] || track.dcaZ() > pc.fdParticleCuts[edcaZ][eMax] || TMath::Abs(track.dcaZ() - pc.fdParticleCuts[edcaZ][eMax]) < tc.fFloatingPointPrecision) { + } else if (track.dcaZ() < pc.fdParticleCuts[edcaZ][eMin] || track.dcaZ() > pc.fdParticleCuts[edcaZ][eMax] || std::abs(track.dcaZ() - pc.fdParticleCuts[edcaZ][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eRec, edcaZ, cutModus)) { return false; } @@ -8747,7 +9540,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) if (pc.fUseParticleCuts[ePtDependentDCAxyParameterization]) { if (cutModus == eCutCounterBinning) { ParticleCut(eRec, ePtDependentDCAxyParameterization, eCutCounterBinning); - } else if (TMath::Abs(track.dcaXY()) > pc.fPtDependentDCAxyFormula->Eval(track.pt())) { + } else if (std::abs(track.dcaXY()) > pc.fPtDependentDCAxyFormula->Eval(track.pt())) { if (!ParticleCut(eRec, ePtDependentDCAxyParameterization, cutModus)) { return false; } @@ -8814,7 +9607,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) if (pc.fUseParticleCuts[ePhi]) { if (cutModus == eCutCounterBinning) { ParticleCut(eSim, ePhi, eCutCounterBinning); - } else if (track.phi() < pc.fdParticleCuts[ePhi][eMin] || track.phi() > pc.fdParticleCuts[ePhi][eMax] || TMath::Abs(track.phi() - pc.fdParticleCuts[ePhi][eMax]) < tc.fFloatingPointPrecision) { + } else if (track.phi() < pc.fdParticleCuts[ePhi][eMin] || track.phi() > pc.fdParticleCuts[ePhi][eMax] || std::abs(track.phi() - pc.fdParticleCuts[ePhi][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eSim, ePhi, cutModus)) { return false; } @@ -8825,7 +9618,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) if (pc.fUseParticleCuts[ePt]) { if (cutModus == eCutCounterBinning) { ParticleCut(eSim, ePt, eCutCounterBinning); - } else if (track.pt() < pc.fdParticleCuts[ePt][eMin] || track.pt() > pc.fdParticleCuts[ePt][eMax] || TMath::Abs(track.pt() - pc.fdParticleCuts[ePt][eMax]) < tc.fFloatingPointPrecision) { + } else if (track.pt() < pc.fdParticleCuts[ePt][eMin] || track.pt() > pc.fdParticleCuts[ePt][eMax] || std::abs(track.pt() - pc.fdParticleCuts[ePt][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eSim, ePt, cutModus)) { return false; } @@ -8836,7 +9629,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) if (pc.fUseParticleCuts[eEta]) { if (cutModus == eCutCounterBinning) { ParticleCut(eSim, eEta, eCutCounterBinning); - } else if (track.eta() < pc.fdParticleCuts[eEta][eMin] || track.eta() > pc.fdParticleCuts[eEta][eMax] || TMath::Abs(track.eta() - pc.fdParticleCuts[eEta][eMax]) < tc.fFloatingPointPrecision) { + } else if (track.eta() < pc.fdParticleCuts[eEta][eMin] || track.eta() > pc.fdParticleCuts[eEta][eMax] || std::abs(track.eta() - pc.fdParticleCuts[eEta][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eSim, eEta, cutModus)) { return false; } @@ -8945,7 +9738,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) if (pc.fUseParticleCuts[ePhi]) { if (cutModus == eCutCounterBinning) { ParticleCut(eRec, ePhi, eCutCounterBinning); - } else if (track.phi() < pc.fdParticleCuts[ePhi][eMin] || track.phi() > pc.fdParticleCuts[ePhi][eMax] || TMath::Abs(track.phi() - pc.fdParticleCuts[ePhi][eMax]) < tc.fFloatingPointPrecision) { + } else if (track.phi() < pc.fdParticleCuts[ePhi][eMin] || track.phi() > pc.fdParticleCuts[ePhi][eMax] || std::abs(track.phi() - pc.fdParticleCuts[ePhi][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eRec, ePhi, cutModus)) { return false; } @@ -8956,7 +9749,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) if (pc.fUseParticleCuts[ePt]) { if (cutModus == eCutCounterBinning) { ParticleCut(eRec, ePt, eCutCounterBinning); - } else if (track.pt() < pc.fdParticleCuts[ePt][eMin] || track.pt() > pc.fdParticleCuts[ePt][eMax] || TMath::Abs(track.pt() - pc.fdParticleCuts[ePt][eMax]) < tc.fFloatingPointPrecision) { + } else if (track.pt() < pc.fdParticleCuts[ePt][eMin] || track.pt() > pc.fdParticleCuts[ePt][eMax] || std::abs(track.pt() - pc.fdParticleCuts[ePt][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eRec, ePt, cutModus)) { return false; } @@ -8967,7 +9760,7 @@ bool ParticleCuts(T const& track, eCutModus cutModus) if (pc.fUseParticleCuts[eEta]) { if (cutModus == eCutCounterBinning) { ParticleCut(eRec, eEta, eCutCounterBinning); - } else if (track.eta() < pc.fdParticleCuts[eEta][eMin] || track.eta() > pc.fdParticleCuts[eEta][eMax] || TMath::Abs(track.eta() - pc.fdParticleCuts[eEta][eMax]) < tc.fFloatingPointPrecision) { + } else if (track.eta() < pc.fdParticleCuts[eEta][eMin] || track.eta() > pc.fdParticleCuts[eEta][eMax] || std::abs(track.eta() - pc.fdParticleCuts[eEta][eMax]) < tc.fFloatingPointPrecision) { if (!ParticleCut(eRec, eEta, cutModus)) { return false; } @@ -9129,7 +9922,7 @@ void FillParticleHistograms(T const& track, eBeforeAfter ba, int weight = 1) } if (tc.fInsanityCheckForEachParticle) { - if (1 != TMath::Abs(weight)) { + if (1 != std::abs(weight)) { LOGF(fatal, "\033[1;31m%s at line %d : in the current implementation, weight for particle histograms can be only +1 or -1, weight = %d\033[0m", __FUNCTION__, __LINE__, weight); } } @@ -9143,15 +9936,35 @@ void FillParticleHistograms(T const& track, eBeforeAfter ba, int weight = 1) // 1D: if (ph.fFillParticleHistograms) { // From o2::aod::Tracks + + // memStatus ~120 + !ph.fParticleHistograms[ePhi][eRec][ba] ? true : ph.fParticleHistograms[ePhi][eRec][ba]->Fill(track.phi(), weight); + + // memStatus ~125 + !ph.fParticleHistograms[ePt][eRec][ba] ? true : ph.fParticleHistograms[ePt][eRec][ba]->Fill(track.pt(), weight); + + // memStatus ~127 + !ph.fParticleHistograms[eEta][eRec][ba] ? true : ph.fParticleHistograms[eEta][eRec][ba]->Fill(track.eta(), weight); + + // memStatus ~133 + !ph.fParticleHistograms[eCharge][eRec][ba] ? true : ph.fParticleHistograms[eCharge][eRec][ba]->Fill(track.sign(), weight); + // memStatus ~139 + // From o2::aod::TracksExtra_001 !ph.fParticleHistograms[etpcNClsFindable][eRec][ba] ? true : ph.fParticleHistograms[etpcNClsFindable][eRec][ba]->Fill(track.tpcNClsFindable(), weight); !ph.fParticleHistograms[etpcNClsShared][eRec][ba] ? true : ph.fParticleHistograms[etpcNClsShared][eRec][ba]->Fill(track.tpcNClsShared(), weight); + + // memStatus ~140 + !ph.fParticleHistograms[eitsChi2NCl][eRec][ba] ? true : ph.fParticleHistograms[eitsChi2NCl][eRec][ba]->Fill(track.itsChi2NCl(), weight); + + // memStatus ~146 + !ph.fParticleHistograms[etpcNClsFound][eRec][ba] ? true : ph.fParticleHistograms[etpcNClsFound][eRec][ba]->Fill(track.tpcNClsFound(), weight); !ph.fParticleHistograms[etpcNClsCrossedRows][eRec][ba] ? true : ph.fParticleHistograms[etpcNClsCrossedRows][eRec][ba]->Fill(track.tpcNClsCrossedRows(), weight); !ph.fParticleHistograms[eitsNCls][eRec][ba] ? true : ph.fParticleHistograms[eitsNCls][eRec][ba]->Fill(track.itsNCls(), weight); @@ -9502,7 +10315,7 @@ void CalculateCorrelations() harmonics->SetAt(h, 0); harmonics->SetAt(-h, 1); double nestedLoopValue = this->CalculateCustomNestedLoops(harmonics); - if (TMath::Abs(nestedLoopValue) > 0. && TMath::Abs(twoC - nestedLoopValue) > tc.fFloatingPointPrecision) { + if (std::abs(nestedLoopValue) > 0. && std::abs(twoC - nestedLoopValue) > tc.fFloatingPointPrecision) { LOGF(fatal, "\033[1;31m%s at line %d : nestedLoopValue = %f is not the same as twoC = %f\033[0m", __FUNCTION__, __LINE__, nestedLoopValue, twoC); } else { LOGF(info, "\033[1;32m ebye check (integrated) with CustomNestedLoops is OK for isotropic 2-p, harmonic %d\033[0m", h); @@ -9512,7 +10325,7 @@ void CalculateCorrelations() } // if(nl.fCalculateCustomNestedLoops) // for on-the-fly and internal validation, rescale results with theoretical value: - if (iv.fUseInternalValidation && iv.fRescaleWithTheoreticalInput && iv.fInternalValidationVnPsin[eVn] && TMath::Abs(iv.fInternalValidationVnPsin[eVn]->GetAt(h - 1)) > 0.) { + if (iv.fUseInternalValidation && iv.fRescaleWithTheoreticalInput && iv.fInternalValidationVnPsin[eVn] && std::abs(iv.fInternalValidationVnPsin[eVn]->GetAt(h - 1)) > 0.) { twoC /= pow(iv.fInternalValidationVnPsin[eVn]->GetAt(h - 1), 2.); } @@ -9571,7 +10384,7 @@ void CalculateCorrelations() harmonics->SetAt(-h, 2); harmonics->SetAt(-h, 3); double nestedLoopValue = this->CalculateCustomNestedLoops(harmonics); - if (TMath::Abs(nestedLoopValue) > 0. && TMath::Abs(fourC - nestedLoopValue) > tc.fFloatingPointPrecision) { + if (std::abs(nestedLoopValue) > 0. && std::abs(fourC - nestedLoopValue) > tc.fFloatingPointPrecision) { LOGF(fatal, "\033[1;31m%s at line %d : nestedLoopValue = %f is not the same as fourC = %f\033[0m", __FUNCTION__, __LINE__, nestedLoopValue, fourC); } else { LOGF(info, "\033[1;32m ebye check (integrated) with CustomNestedLoops is OK for isotropic 4-p, harmonic %d\033[0m", h); @@ -9581,7 +10394,7 @@ void CalculateCorrelations() } // if(nl.fCalculateCustomNestedLoops) // for on-the-fly and internal validation, rescale results with theoretical value: - if (iv.fUseInternalValidation && iv.fRescaleWithTheoreticalInput && iv.fInternalValidationVnPsin[eVn] && TMath::Abs(iv.fInternalValidationVnPsin[eVn]->GetAt(h - 1)) > 0.) { + if (iv.fUseInternalValidation && iv.fRescaleWithTheoreticalInput && iv.fInternalValidationVnPsin[eVn] && std::abs(iv.fInternalValidationVnPsin[eVn]->GetAt(h - 1)) > 0.) { fourC /= pow(iv.fInternalValidationVnPsin[eVn]->GetAt(h - 1), 4.); } @@ -9642,7 +10455,7 @@ void CalculateCorrelations() harmonics->SetAt(-h, 4); harmonics->SetAt(-h, 5); double nestedLoopValue = this->CalculateCustomNestedLoops(harmonics); - if (TMath::Abs(nestedLoopValue) > 0. && TMath::Abs(sixC - nestedLoopValue) > tc.fFloatingPointPrecision) { + if (std::abs(nestedLoopValue) > 0. && std::abs(sixC - nestedLoopValue) > tc.fFloatingPointPrecision) { LOGF(fatal, "\033[1;31m%s at line %d : nestedLoopValue = %f is not the same as sixC = %f\033[0m", __FUNCTION__, __LINE__, nestedLoopValue, sixC); } else { LOGF(info, "\033[1;32m ebye check (integrated) with CustomNestedLoops is OK for isotropic 6-p, harmonic %d\033[0m", h); @@ -9652,7 +10465,7 @@ void CalculateCorrelations() } // if(nl.fCalculateCustomNestedLoops) // for on-the-fly and internal validation, rescale results with theoretical value: - if (iv.fUseInternalValidation && iv.fRescaleWithTheoreticalInput && iv.fInternalValidationVnPsin[eVn] && TMath::Abs(iv.fInternalValidationVnPsin[eVn]->GetAt(h - 1)) > 0.) { + if (iv.fUseInternalValidation && iv.fRescaleWithTheoreticalInput && iv.fInternalValidationVnPsin[eVn] && std::abs(iv.fInternalValidationVnPsin[eVn]->GetAt(h - 1)) > 0.) { sixC /= pow(iv.fInternalValidationVnPsin[eVn]->GetAt(h - 1), 6.); } @@ -9715,7 +10528,7 @@ void CalculateCorrelations() harmonics->SetAt(-h, 6); harmonics->SetAt(-h, 7); double nestedLoopValue = this->CalculateCustomNestedLoops(harmonics); - if (TMath::Abs(nestedLoopValue) > 0. && TMath::Abs(eightC - nestedLoopValue) > tc.fFloatingPointPrecision) { + if (std::abs(nestedLoopValue) > 0. && std::abs(eightC - nestedLoopValue) > tc.fFloatingPointPrecision) { LOGF(fatal, "\033[1;31m%s at line %d : nestedLoopValue = %f is not the same as eightC = %f\033[0m", __FUNCTION__, __LINE__, nestedLoopValue, eightC); } else { LOGF(info, "\033[1;32m ebye check (integrated) with CustomNestedLoops is OK for isotropic 8-p, harmonic %d\033[0m", h); @@ -9725,7 +10538,7 @@ void CalculateCorrelations() } // if(nl.fCalculateCustomNestedLoops) // for on-the-fly and internal validation, rescale results with theoretical value: - if (iv.fUseInternalValidation && iv.fRescaleWithTheoreticalInput && iv.fInternalValidationVnPsin[eVn] && TMath::Abs(iv.fInternalValidationVnPsin[eVn]->GetAt(h - 1)) > 0.) { + if (iv.fUseInternalValidation && iv.fRescaleWithTheoreticalInput && iv.fInternalValidationVnPsin[eVn] && std::abs(iv.fInternalValidationVnPsin[eVn]->GetAt(h - 1)) > 0.) { eightC /= pow(iv.fInternalValidationVnPsin[eVn]->GetAt(h - 1), 8.); } @@ -9984,9 +10797,9 @@ void CalculateTest0() harmonics->SetAt(n[i], i); } double nestedLoopValue = this->CalculateCustomNestedLoops(harmonics); - if (!(TMath::Abs(nestedLoopValue) > 0.)) { + if (!(std::abs(nestedLoopValue) > 0.)) { LOGF(info, " ebye check (integrated) with CustomNestedLoops was NOT calculated for %d-p Test0 corr. %s", mo + 1, t0.fTest0Labels[mo][mi]->Data()); - } else if (TMath::Abs(nestedLoopValue) > 0. && TMath::Abs(correlation / weight - nestedLoopValue) > tc.fFloatingPointPrecision) { + } else if (std::abs(nestedLoopValue) > 0. && std::abs(correlation / weight - nestedLoopValue) > tc.fFloatingPointPrecision) { LOGF(fatal, "\033[1;31m%s at line %d : nestedLoopValue = %f is not the same as correlation/weight = %f, for correlator %s\033[0m", __FUNCTION__, __LINE__, nestedLoopValue, correlation / weight, t0.fTest0Labels[mo][mi]->Data()); } else { LOGF(info, "\033[1;32m ebye check (integrated) with CustomNestedLoops is OK for %d-p Test0 corr. %s\033[0m", mo + 1, t0.fTest0Labels[mo][mi]->Data()); @@ -10002,7 +10815,7 @@ void CalculateTest0() harmonics->SetAt(n[i], i); } TComplex theoreticalValue = this->TheoreticalValue(harmonics, iv.fInternalValidationVnPsin[eVn], iv.fInternalValidationVnPsin[ePsin]); - if (TMath::Abs(theoreticalValue.Re()) > 0.) { + if (std::abs(theoreticalValue.Re()) > 0.) { correlation /= theoreticalValue.Re(); } // TBI 20240424 for the time being, I do not do anything with imaginary part, but I could eventually... @@ -10092,7 +10905,7 @@ void CalculateKineTest0(eAsFunctionOf AFO_variable) for (int b = 0; b < nBins; b++) { // *) Ensures that in each bin of interest, I have the same cut on number of particles, like in integrated analysis: - if ((qv.fqVectorEntries[qvKine][b] < ec.fdEventCuts[eMultiplicity][eMin]) || (qv.fqVectorEntries[qvKine][b] > ec.fdEventCuts[eMultiplicity][eMax] || TMath::Abs(qv.fqVectorEntries[qvKine][b] - ec.fdEventCuts[eMultiplicity][eMax]) < tc.fFloatingPointPrecision)) { + if ((qv.fqVectorEntries[qvKine][b] < ec.fdEventCuts[eMultiplicity][eMin]) || (qv.fqVectorEntries[qvKine][b] > ec.fdEventCuts[eMultiplicity][eMax] || std::abs(qv.fqVectorEntries[qvKine][b] - ec.fdEventCuts[eMultiplicity][eMax]) < tc.fFloatingPointPrecision)) { if (tc.fVerbose) { LOGF(info, "\033[1;31m%s eMultiplicity cut in bin = %d, for qvKine = %d\033[0m", __FUNCTION__, b, static_cast(qvKine)); } @@ -10206,9 +11019,9 @@ void CalculateKineTest0(eAsFunctionOf AFO_variable) LOGF(fatal, "\033[1;31m%s at line %d : is perhaps order of some requested correlator bigger than the number of particles? Correlator = %s \033[0m", __FUNCTION__, __LINE__, t0.fTest0Labels[mo][mi]->Data()); } double nestedLoopValue = this->CalculateKineCustomNestedLoops(harmonics, AFO_variable, b); - if (!(TMath::Abs(nestedLoopValue) > 0.)) { + if (!(std::abs(nestedLoopValue) > 0.)) { LOGF(info, " e-b-e check with CalculateKineCustomNestedLoops was NOT calculated for %d-p Test0 corr. %s, bin = %d", mo + 1, t0.fTest0Labels[mo][mi]->Data(), b + 1); - } else if (TMath::Abs(nestedLoopValue) > 0. && TMath::Abs(correlation / weight - nestedLoopValue) > tc.fFloatingPointPrecision) { + } else if (std::abs(nestedLoopValue) > 0. && std::abs(correlation / weight - nestedLoopValue) > tc.fFloatingPointPrecision) { LOGF(fatal, "\033[1;31m%s at line %d : correlator: %s \n correlation: %f \n custom loop: %f \033[0m", __FUNCTION__, __LINE__, t0.fTest0Labels[mo][mi]->Data(), correlation / weight, nestedLoopValue); } else { LOGF(info, "\033[1;32m ebye check (differential) with CalculateKineCustomNestedLoops is OK for %d-p Test0 corr. %s, bin = %d\033[0m", mo + 1, t0.fTest0Labels[mo][mi]->Data(), b + 1); @@ -10224,7 +11037,7 @@ void CalculateKineTest0(eAsFunctionOf AFO_variable) harmonics->SetAt(n[i], i); } TComplex theoreticalValue = TheoreticalValue(harmonics, iv.fInternalValidationVnPsin[eVn], iv.fInternalValidationVnPsin[ePsin]); - if (TMath::Abs(theoreticalValue.Re()) > 0.) { + if (std::abs(theoreticalValue.Re()) > 0.) { correlation /= theoreticalValue.Re(); } // TBI 20240424 for the time being, I do not do anything with imaginary part, but I could eventually... @@ -10297,7 +11110,7 @@ void CalculateEtaSeparations() weight = qv.fMab[0][e] * qv.fMab[1][e]; // for on-the-fly and internal validation, rescale results with theoretical value: - if (iv.fUseInternalValidation && iv.fRescaleWithTheoreticalInput && iv.fInternalValidationVnPsin[eVn] && TMath::Abs(iv.fInternalValidationVnPsin[eVn]->GetAt(h)) > 0.) { + if (iv.fUseInternalValidation && iv.fRescaleWithTheoreticalInput && iv.fInternalValidationVnPsin[eVn] && std::abs(iv.fInternalValidationVnPsin[eVn]->GetAt(h)) > 0.) { correlation /= pow(iv.fInternalValidationVnPsin[eVn]->GetAt(h), 2.); } @@ -10386,7 +11199,7 @@ void CalculateKineEtaSeparations(eAsFunctionOf AFO_variable) /* TBI 20241206 Do I need to adapt and apply this cut, also for Qa and Qb? If so, most likely I would need to apply it on sum, i.e. on entries in Qa + Qb // *) Ensures that in each bin of interest, I have the same cut on number of particles, like in integrated analysis: - if ((qv.fqVectorEntries[qvKine][b] < ec.fdEventCuts[eMultiplicity][eMin]) || (qv.fqVectorEntries[qvKine][b] > ec.fdEventCuts[eMultiplicity][eMax] || TMath::Abs(qv.fqVectorEntries[qvKine][b] - ec.fdEventCuts[eMultiplicity][eMax]) < tc.fFloatingPointPrecision)) { + if ((qv.fqVectorEntries[qvKine][b] < ec.fdEventCuts[eMultiplicity][eMin]) || (qv.fqVectorEntries[qvKine][b] > ec.fdEventCuts[eMultiplicity][eMax] || std::abs(qv.fqVectorEntries[qvKine][b] - ec.fdEventCuts[eMultiplicity][eMax]) < tc.fFloatingPointPrecision)) { if (tc.fVerbose) { LOGF(info, "\033[1;31m%s eMultiplicity cut in bin = %d, for qvKine = %d\033[0m", __FUNCTION__, b, static_cast(qvKine)); } @@ -10414,7 +11227,7 @@ void CalculateKineEtaSeparations(eAsFunctionOf AFO_variable) weight = qv.fmab[0][b][e] * qv.fmab[1][b][e]; // for on-the-fly and internal validation, rescale results with theoretical value: - if (iv.fUseInternalValidation && iv.fRescaleWithTheoreticalInput && iv.fInternalValidationVnPsin[eVn] && TMath::Abs(iv.fInternalValidationVnPsin[eVn]->GetAt(h)) > 0.) { + if (iv.fUseInternalValidation && iv.fRescaleWithTheoreticalInput && iv.fInternalValidationVnPsin[eVn] && std::abs(iv.fInternalValidationVnPsin[eVn]->GetAt(h)) > 0.) { correlation /= pow(iv.fInternalValidationVnPsin[eVn]->GetAt(h), 2.); } @@ -10446,7 +11259,7 @@ void FillNestedLoopsContainers(const int& particleIndex, const double& dPhi, con if (particleIndex < 0) { LOGF(fatal, "\033[1;31m%s at line %d : particleIndex = %d\033[0m", __FUNCTION__, __LINE__, particleIndex); } - if (!(TMath::Abs(nl.ftaNestedLoops[0]->GetAt(particleIndex - 1)) > 0.)) { + if (!(std::abs(nl.ftaNestedLoops[0]->GetAt(particleIndex - 1)) > 0.)) { LOGF(fatal, "\033[1;31m%s at line %d : there are empty elements in nl.ftaNestedLoops[0] \033[0m", __FUNCTION__, __LINE__); // I need this protection, to ensure that all array entries are filled. If not, most likely a particle passed all // selection criteria, and it wasn't added to the nested loops containers @@ -10508,8 +11321,8 @@ void CalculateNestedLoops() nParticles = 0; for(int i=0;iGetSize();i++) { - if(TMath::Abs(ftaNestedLoops[0]->GetAt(i)) > 0. && - TMath::Abs(ftaNestedLoops[1]->GetAt(i)) > 0.){nParticles++;} + if(std::abs(ftaNestedLoops[0]->GetAt(i)) > 0. && + std::abs(ftaNestedLoops[1]->GetAt(i)) > 0.){nParticles++;} } } cout<<"nParticles = "<Fill( - 0.5, TMath::Cos((h + 1.) * (dPhi1 - dPhi2)), dW1 * dW2); + 0.5, std::cos((h + 1.) * (dPhi1 - dPhi2)), dW1 * dW2); } // fill cos, 2p, vs. multiplicity: if (nl.fNestedLoopsPro[0][h][AFO_MULTIPLICITY]) { nl.fNestedLoopsPro[0][h][AFO_MULTIPLICITY]->Fill( - ebye.fMultiplicity + 0.5, TMath::Cos((h + 1.) * (dPhi1 - dPhi2)), + ebye.fMultiplicity + 0.5, std::cos((h + 1.) * (dPhi1 - dPhi2)), dW1 * dW2); } // fill cos, 2p, vs. centrality: if (nl.fNestedLoopsPro[0][h][AFO_CENTRALITY]) { nl.fNestedLoopsPro[0][h][AFO_CENTRALITY]->Fill( - ebye.fCentrality, TMath::Cos((h + 1.) * (dPhi1 - dPhi2)), dW1 * dW2); + ebye.fCentrality, std::cos((h + 1.) * (dPhi1 - dPhi2)), dW1 * dW2); } // fill cos, 2p, vs. occupancy: if (nl.fNestedLoopsPro[0][h][AFO_OCCUPANCY]) { nl.fNestedLoopsPro[0][h][AFO_OCCUPANCY]->Fill( - ebye.fOccupancy, TMath::Cos((h + 1.) * (dPhi1 - dPhi2)), dW1 * dW2); + ebye.fOccupancy, std::cos((h + 1.) * (dPhi1 - dPhi2)), dW1 * dW2); } // fill cos, 2p, vs. interaction rate: if (nl.fNestedLoopsPro[0][h][AFO_INTERACTIONRATE]) { nl.fNestedLoopsPro[0][h][AFO_INTERACTIONRATE]->Fill( - ebye.fInteractionRate, TMath::Cos((h + 1.) * (dPhi1 - dPhi2)), dW1 * dW2); + ebye.fInteractionRate, std::cos((h + 1.) * (dPhi1 - dPhi2)), dW1 * dW2); } // fill cos, 2p, vs. current run duration: if (nl.fNestedLoopsPro[0][h][AFO_CURRENTRUNDURATION]) { nl.fNestedLoopsPro[0][h][AFO_CURRENTRUNDURATION]->Fill( - ebye.fCurrentRunDuration, TMath::Cos((h + 1.) * (dPhi1 - dPhi2)), dW1 * dW2); + ebye.fCurrentRunDuration, std::cos((h + 1.) * (dPhi1 - dPhi2)), dW1 * dW2); } // fill cos, 2p, vs. vertex z position: if (nl.fNestedLoopsPro[0][h][AFO_VZ]) { nl.fNestedLoopsPro[0][h][AFO_VZ]->Fill( - ebye.fVz, TMath::Cos((h + 1.) * (dPhi1 - dPhi2)), dW1 * dW2); + ebye.fVz, std::cos((h + 1.) * (dPhi1 - dPhi2)), dW1 * dW2); } } // for(int h=1; h<=6; h++) @@ -10607,31 +11420,31 @@ void CalculateNestedLoops() for (int h = 0; h < gMaxHarmonic; h++) { // fill cos, 4p, integreated: if (nl.fNestedLoopsPro[1][h][AFO_INTEGRATED]) { - nl.fNestedLoopsPro[1][h][AFO_INTEGRATED]->Fill(0.5, TMath::Cos((h + 1.) * (dPhi1 + dPhi2 - dPhi3 - dPhi4)), dW1 * dW2 * dW3 * dW4); + nl.fNestedLoopsPro[1][h][AFO_INTEGRATED]->Fill(0.5, std::cos((h + 1.) * (dPhi1 + dPhi2 - dPhi3 - dPhi4)), dW1 * dW2 * dW3 * dW4); } // fill cos, 4p, all harmonics, vs. M: if (nl.fNestedLoopsPro[1][h][AFO_MULTIPLICITY]) { - nl.fNestedLoopsPro[1][h][AFO_MULTIPLICITY]->Fill(ebye.fMultiplicity + 0.5, TMath::Cos((h + 1.) * (dPhi1 + dPhi2 - dPhi3 - dPhi4)), dW1 * dW2 * dW3 * dW4); + nl.fNestedLoopsPro[1][h][AFO_MULTIPLICITY]->Fill(ebye.fMultiplicity + 0.5, std::cos((h + 1.) * (dPhi1 + dPhi2 - dPhi3 - dPhi4)), dW1 * dW2 * dW3 * dW4); } // fill cos, 4p, all harmonics, vs. centrality: if (nl.fNestedLoopsPro[1][h][AFO_CENTRALITY]) { - nl.fNestedLoopsPro[1][h][AFO_CENTRALITY]->Fill(ebye.fCentrality, TMath::Cos((h + 1.) * (dPhi1 + dPhi2 - dPhi3 - dPhi4)), dW1 * dW2 * dW3 * dW4); + nl.fNestedLoopsPro[1][h][AFO_CENTRALITY]->Fill(ebye.fCentrality, std::cos((h + 1.) * (dPhi1 + dPhi2 - dPhi3 - dPhi4)), dW1 * dW2 * dW3 * dW4); } // fill cos, 4p, all harmonics, vs. occupancy: if (nl.fNestedLoopsPro[1][h][AFO_OCCUPANCY]) { - nl.fNestedLoopsPro[1][h][AFO_OCCUPANCY]->Fill(ebye.fOccupancy, TMath::Cos((h + 1.) * (dPhi1 + dPhi2 - dPhi3 - dPhi4)), dW1 * dW2 * dW3 * dW4); + nl.fNestedLoopsPro[1][h][AFO_OCCUPANCY]->Fill(ebye.fOccupancy, std::cos((h + 1.) * (dPhi1 + dPhi2 - dPhi3 - dPhi4)), dW1 * dW2 * dW3 * dW4); } // fill cos, 4p, all harmonics, vs. interaction rate: if (nl.fNestedLoopsPro[1][h][AFO_INTERACTIONRATE]) { - nl.fNestedLoopsPro[1][h][AFO_INTERACTIONRATE]->Fill(ebye.fInteractionRate, TMath::Cos((h + 1.) * (dPhi1 + dPhi2 - dPhi3 - dPhi4)), dW1 * dW2 * dW3 * dW4); + nl.fNestedLoopsPro[1][h][AFO_INTERACTIONRATE]->Fill(ebye.fInteractionRate, std::cos((h + 1.) * (dPhi1 + dPhi2 - dPhi3 - dPhi4)), dW1 * dW2 * dW3 * dW4); } // fill cos, 4p, all harmonics, vs. current run duratione: if (nl.fNestedLoopsPro[1][h][AFO_CURRENTRUNDURATION]) { - nl.fNestedLoopsPro[1][h][AFO_CURRENTRUNDURATION]->Fill(ebye.fCurrentRunDuration, TMath::Cos((h + 1.) * (dPhi1 + dPhi2 - dPhi3 - dPhi4)), dW1 * dW2 * dW3 * dW4); + nl.fNestedLoopsPro[1][h][AFO_CURRENTRUNDURATION]->Fill(ebye.fCurrentRunDuration, std::cos((h + 1.) * (dPhi1 + dPhi2 - dPhi3 - dPhi4)), dW1 * dW2 * dW3 * dW4); } // fill cos, 4p, all harmonics, vs. vertex z position: if (nl.fNestedLoopsPro[1][h][AFO_VZ]) { - nl.fNestedLoopsPro[1][h][AFO_VZ]->Fill(ebye.fVz, TMath::Cos((h + 1.) * (dPhi1 + dPhi2 - dPhi3 - dPhi4)), dW1 * dW2 * dW3 * dW4); + nl.fNestedLoopsPro[1][h][AFO_VZ]->Fill(ebye.fVz, std::cos((h + 1.) * (dPhi1 + dPhi2 - dPhi3 - dPhi4)), dW1 * dW2 * dW3 * dW4); } } // for(int h=0; hFill(0.5, TMath::Cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 - dPhi4 - dPhi5 - dPhi6)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6); + nl.fNestedLoopsPro[2][h][AFO_INTEGRATED]->Fill(0.5, std::cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 - dPhi4 - dPhi5 - dPhi6)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6); } // fill cos, 6p, all harmonics, vs. M: if (nl.fNestedLoopsPro[2][h][AFO_MULTIPLICITY]) { - nl.fNestedLoopsPro[2][h][AFO_MULTIPLICITY]->Fill(ebye.fMultiplicity + 0.5, TMath::Cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 - dPhi4 - dPhi5 - dPhi6)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6); + nl.fNestedLoopsPro[2][h][AFO_MULTIPLICITY]->Fill(ebye.fMultiplicity + 0.5, std::cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 - dPhi4 - dPhi5 - dPhi6)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6); } // fill cos, 6p, all harmonics, vs. centrality: if (nl.fNestedLoopsPro[2][h][AFO_CENTRALITY]) { - nl.fNestedLoopsPro[2][h][AFO_CENTRALITY]->Fill(ebye.fCentrality, TMath::Cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 - dPhi4 - dPhi5 - dPhi6)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6); + nl.fNestedLoopsPro[2][h][AFO_CENTRALITY]->Fill(ebye.fCentrality, std::cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 - dPhi4 - dPhi5 - dPhi6)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6); } // fill cos, 6p, all harmonics, vs. occupancy: if (nl.fNestedLoopsPro[2][h][AFO_OCCUPANCY]) { - nl.fNestedLoopsPro[2][h][AFO_OCCUPANCY]->Fill(ebye.fOccupancy, TMath::Cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 - dPhi4 - dPhi5 - dPhi6)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6); + nl.fNestedLoopsPro[2][h][AFO_OCCUPANCY]->Fill(ebye.fOccupancy, std::cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 - dPhi4 - dPhi5 - dPhi6)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6); } // fill cos, 6p, all harmonics, vs. interaction rate: if (nl.fNestedLoopsPro[2][h][AFO_INTERACTIONRATE]) { - nl.fNestedLoopsPro[2][h][AFO_INTERACTIONRATE]->Fill(ebye.fInteractionRate, TMath::Cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 - dPhi4 - dPhi5 - dPhi6)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6); + nl.fNestedLoopsPro[2][h][AFO_INTERACTIONRATE]->Fill(ebye.fInteractionRate, std::cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 - dPhi4 - dPhi5 - dPhi6)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6); } // fill cos, 6p, all harmonics, vs. current run duration: if (nl.fNestedLoopsPro[2][h][AFO_CURRENTRUNDURATION]) { - nl.fNestedLoopsPro[2][h][AFO_CURRENTRUNDURATION]->Fill(ebye.fCurrentRunDuration, TMath::Cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 - dPhi4 - dPhi5 - dPhi6)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6); + nl.fNestedLoopsPro[2][h][AFO_CURRENTRUNDURATION]->Fill(ebye.fCurrentRunDuration, std::cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 - dPhi4 - dPhi5 - dPhi6)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6); } // fill cos, 6p, all harmonics, vs. vertex z position: if (nl.fNestedLoopsPro[2][h][AFO_VZ]) { - nl.fNestedLoopsPro[2][h][AFO_VZ]->Fill(ebye.fVz, TMath::Cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 - dPhi4 - dPhi5 - dPhi6)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6); + nl.fNestedLoopsPro[2][h][AFO_VZ]->Fill(ebye.fVz, std::cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 - dPhi4 - dPhi5 - dPhi6)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6); } } // for(int h=0; hFill(0.5, TMath::Cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 + dPhi4 - dPhi5 - dPhi6 - dPhi7 - dPhi8)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6 * dW7 * dW8); + nl.fNestedLoopsPro[3][h][AFO_INTEGRATED]->Fill(0.5, std::cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 + dPhi4 - dPhi5 - dPhi6 - dPhi7 - dPhi8)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6 * dW7 * dW8); } // fill cos, 8p, all harmonics, vs. M: if (nl.fNestedLoopsPro[3][h][AFO_MULTIPLICITY]) { - nl.fNestedLoopsPro[3][h][AFO_MULTIPLICITY]->Fill(ebye.fMultiplicity + 0.5, TMath::Cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 + dPhi4 - dPhi5 - dPhi6 - dPhi7 - dPhi8)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6 * dW7 * dW8); + nl.fNestedLoopsPro[3][h][AFO_MULTIPLICITY]->Fill(ebye.fMultiplicity + 0.5, std::cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 + dPhi4 - dPhi5 - dPhi6 - dPhi7 - dPhi8)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6 * dW7 * dW8); } // fill cos, 8p, all harmonics, vs. centrality: if (nl.fNestedLoopsPro[3][h][AFO_CENTRALITY]) { - nl.fNestedLoopsPro[3][h][AFO_CENTRALITY]->Fill(ebye.fCentrality, TMath::Cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 + dPhi4 - dPhi5 - dPhi6 - dPhi7 - dPhi8)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6 * dW7 * dW8); + nl.fNestedLoopsPro[3][h][AFO_CENTRALITY]->Fill(ebye.fCentrality, std::cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 + dPhi4 - dPhi5 - dPhi6 - dPhi7 - dPhi8)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6 * dW7 * dW8); } // fill cos, 8p, all harmonics, vs. occupancy: if (nl.fNestedLoopsPro[3][h][AFO_OCCUPANCY]) { - nl.fNestedLoopsPro[3][h][AFO_OCCUPANCY]->Fill(ebye.fOccupancy, TMath::Cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 + dPhi4 - dPhi5 - dPhi6 - dPhi7 - dPhi8)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6 * dW7 * dW8); + nl.fNestedLoopsPro[3][h][AFO_OCCUPANCY]->Fill(ebye.fOccupancy, std::cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 + dPhi4 - dPhi5 - dPhi6 - dPhi7 - dPhi8)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6 * dW7 * dW8); } // fill cos, 8p, all harmonics, vs. interaction rate: if (nl.fNestedLoopsPro[3][h][AFO_INTERACTIONRATE]) { - nl.fNestedLoopsPro[3][h][AFO_INTERACTIONRATE]->Fill(ebye.fInteractionRate, TMath::Cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 + dPhi4 - dPhi5 - dPhi6 - dPhi7 - dPhi8)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6 * dW7 * dW8); + nl.fNestedLoopsPro[3][h][AFO_INTERACTIONRATE]->Fill(ebye.fInteractionRate, std::cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 + dPhi4 - dPhi5 - dPhi6 - dPhi7 - dPhi8)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6 * dW7 * dW8); } // fill cos, 8p, all harmonics, vs. current run duration: if (nl.fNestedLoopsPro[3][h][AFO_CURRENTRUNDURATION]) { - nl.fNestedLoopsPro[3][h][AFO_CURRENTRUNDURATION]->Fill(ebye.fCurrentRunDuration, TMath::Cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 + dPhi4 - dPhi5 - dPhi6 - dPhi7 - dPhi8)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6 * dW7 * dW8); + nl.fNestedLoopsPro[3][h][AFO_CURRENTRUNDURATION]->Fill(ebye.fCurrentRunDuration, std::cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 + dPhi4 - dPhi5 - dPhi6 - dPhi7 - dPhi8)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6 * dW7 * dW8); } // fill cos, 8p, all harmonics, vs. vertex z position: if (nl.fNestedLoopsPro[3][h][AFO_VZ]) { - nl.fNestedLoopsPro[3][h][AFO_VZ]->Fill(ebye.fVz, TMath::Cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 + dPhi4 - dPhi5 - dPhi6 - dPhi7 - dPhi8)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6 * dW7 * dW8); + nl.fNestedLoopsPro[3][h][AFO_VZ]->Fill(ebye.fVz, std::cos((h + 1.) * (dPhi1 + dPhi2 + dPhi3 + dPhi4 - dPhi5 - dPhi6 - dPhi7 - dPhi8)), dW1 * dW2 * dW3 * dW4 * dW5 * dW6 * dW7 * dW8); } } // for(int h=0; hGetBinContent(b); } - if (TMath::Abs(valueQV) > 0. && TMath::Abs(valueNL) > 0.) { + if (std::abs(valueQV) > 0. && std::abs(valueNL) > 0.) { LOGF(info, " bin=%d, h=%d, Q-vectors: %f", b, h + 1, valueQV); LOGF(info, " bin=%d, h=%d, Nested loops: %f", b, h + 1, valueNL); - if (TMath::Abs(valueQV - valueNL) > tc.fFloatingPointPrecision) { + if (std::abs(valueQV - valueNL) > tc.fFloatingPointPrecision) { LOGF(info, "\n\033[1;33m[%d][%d][%d] \033[0m\n", o, h, v); LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); } - } // if(TMath::Abs(valueQV)>0. && TMath::Abs(valueNL)>0.) + } // if(std::abs(valueQV)>0. && std::abs(valueNL)>0.) } // for(int b=1;b<=nBinsQV;b++) } // for (int h = 0; h < gMaxHarmonic; h++) { LOGF(info, ""); // new line @@ -11582,11 +12395,11 @@ TH1D* GetHistogramWithWeights(const char* filePath, const char* runNumber, const } // Compare with min and max value stored in external weights.root file using MakeWeights.C: - if (!(TMath::Abs(TString(oa->At(nEntries - 1)->GetName()).Atof() - max) < tc.fFloatingPointPrecision)) { + if (!(std::abs(TString(oa->At(nEntries - 1)->GetName()).Atof() - max) < tc.fFloatingPointPrecision)) { LOGF(info, "\033[1;33m hist->GetTitle() = %s, res.fResultsPro[AFO]->GetName() = %s\033[0m", hist->GetTitle(), res.fResultsPro[AFO]->GetName()); LOGF(fatal, "in function \033[1;31m%s at line %d : mismatch in upper bin boundaries \n from title = %f , local = %f\033[0m", __FUNCTION__, __LINE__, TString(oa->At(nEntries - 1)->GetName()).Atof(), max); } - if (!(TMath::Abs(TString(oa->At(nEntries - 5)->GetName()).Atof() - min) < tc.fFloatingPointPrecision)) { + if (!(std::abs(TString(oa->At(nEntries - 5)->GetName()).Atof() - min) < tc.fFloatingPointPrecision)) { LOGF(info, "\033[1;33m hist->GetTitle() = %s, res.fResultsPro[AFO]->GetName() = %s\033[0m", hist->GetTitle(), res.fResultsPro[AFO]->GetName()); LOGF(fatal, "in function \033[1;31m%s at line %d : mismatch in lower bin boundaries \n from title = %f , local = %f\033[0m", __FUNCTION__, __LINE__, TString(oa->At(nEntries - 5)->GetName()).Atof(), min); } @@ -11863,11 +12676,11 @@ THnSparseF* GetSparseHistogramWithWeights(const char* filePath, const char* runN } // Compare with min and max value stored in external weights.root file using MakeWeights.C: - if (!(TMath::Abs(TString(oa->At(nEntries - 1)->GetName()).Atof() - max) < tc.fFloatingPointPrecision)) { + if (!(std::abs(TString(oa->At(nEntries - 1)->GetName()).Atof() - max) < tc.fFloatingPointPrecision)) { LOGF(info, "\033[1;33m hist->GetTitle() = %s, res.fResultsPro[AFO]->GetName() = %s\033[0m", hist->GetTitle(), res.fResultsPro[AFO]->GetName()); LOGF(fatal, "in function \033[1;31m%s at line %d : mismatch in upper bin boundaries \n from title = %f , local = %f\033[0m", __FUNCTION__, __LINE__, TString(oa->At(nEntries - 1)->GetName()).Atof(), max); } - if (!(TMath::Abs(TString(oa->At(nEntries - 5)->GetName()).Atof() - min) < tc.fFloatingPointPrecision)) { + if (!(std::abs(TString(oa->At(nEntries - 5)->GetName()).Atof() - min) < tc.fFloatingPointPrecision)) { LOGF(info, "\033[1;33m hist->GetTitle() = %s, res.fResultsPro[AFO]->GetName() = %s\033[0m", hist->GetTitle(), res.fResultsPro[AFO]->GetName()); LOGF(fatal, "in function \033[1;31m%s at line %d : mismatch in lower bin boundaries \n from title = %f , local = %f\033[0m", __FUNCTION__, __LINE__, TString(oa->At(nEntries - 5)->GetName()).Atof(), min); } @@ -12180,6 +12993,205 @@ TObjArray* GetDefaultObjArrayWithLabels(const char* whichDefaultLabels) TObjString* objstr = new TObjString(labels[l].Data()); arr->Add(objstr); } + } else if (TString(whichDefaultLabels).EqualTo("Set_0")) { + // From ~/scratch/O2/master/Labels/Set_0/labels_Set_0.root + const int nLabels = 57; // yes, because I do not care about 1-p + TString labels[nLabels] = { + "1 -1 ", + "2 -2 ", + "3 -3 ", + "4 -4 ", + "5 -5 ", + "6 -6 ", + "2 1 -1 -2 ", + "3 1 -1 -3 ", + "3 2 -2 -3 ", + "4 1 -1 -4 ", + "4 2 -2 -4 ", + "4 3 -3 -4 ", + "5 1 -1 -5 ", + "5 2 -2 -5 ", + "5 3 -3 -5 ", + "5 4 -4 -5 ", + "6 1 -1 -6 ", + "6 2 -2 -6 ", + "6 3 -3 -6 ", + "6 4 -4 -6 ", + "6 5 -5 -6 ", + "3 2 1 -1 -2 -3 ", + "4 2 1 -1 -2 -4 ", + "4 3 1 -1 -3 -4 ", + "4 3 2 -2 -3 -4 ", + "5 2 1 -1 -2 -5 ", + "5 3 1 -1 -3 -5 ", + "5 3 2 -2 -3 -5 ", + "5 4 1 -1 -4 -5 ", + "5 4 2 -2 -4 -5 ", + "5 4 3 -3 -4 -5 ", + "6 2 1 -1 -2 -6 ", + "6 3 1 -1 -3 -6 ", + "6 3 2 -2 -3 -6 ", + "6 4 1 -1 -4 -6 ", + "6 4 2 -2 -4 -6 ", + "6 4 3 -3 -4 -6 ", + "6 5 1 -1 -5 -6 ", + "6 5 2 -2 -5 -6 ", + "6 5 3 -3 -5 -6 ", + "6 5 4 -4 -5 -6 ", + "2 2 -2 -2", + "3 3 -3 -3", + "4 4 -4 -4", + "2 2 2 -2 -2 -2", + "3 3 2 -2 -3 -3", + "3 2 2 -2 -2 -3 ", + "3 3 3 -3 -3 -3", + "4 4 2 -2 -4 -4", + "4 2 2 -2 -2 -4", + "4 4 3 -3 -4 -4", + "4 3 3 -3 -3 -4", + "4 4 3 2 -2 -3 -4 -4", + "4 3 3 2 -2 -3 -3 -4", + "4 3 2 2 -2 -2 -3 -4", + "3 3 3 2 -2 -3 -3 -3", + "3 2 2 2 -2 -2 -2 -3"}; + for (int l = 0; l < nLabels; l++) { + TObjString* objstr = new TObjString(labels[l].Data()); + arr->Add(objstr); + } + } else if (TString(whichDefaultLabels).EqualTo("Set_1")) { + // From ~/scratch/O2/master/Labels/Set_1/labels_Set_1.root + const int nLabels = 56; // yes, because I do not care about 1-p + TString labels[nLabels] = { + "1 -1 ", + "2 -2 ", + "3 -3 ", + "4 -4 ", + "5 -5 ", + "6 -6 ", + "2 1 -1 -2 ", + "3 1 -1 -3 ", + "3 2 -2 -3 ", + "4 1 -1 -4 ", + "4 2 -2 -4 ", + "4 3 -3 -4 ", + "5 1 -1 -5 ", + "5 2 -2 -5 ", + "5 3 -3 -5 ", + "5 4 -4 -5 ", + "6 1 -1 -6 ", + "6 2 -2 -6 ", + "6 3 -3 -6 ", + "6 4 -4 -6 ", + "6 5 -5 -6 ", + "3 2 1 -1 -2 -3 ", + "4 2 1 -1 -2 -4 ", + "4 3 1 -1 -3 -4 ", + "4 3 2 -2 -3 -4 ", + "5 2 1 -1 -2 -5 ", + "5 3 1 -1 -3 -5 ", + "5 3 2 -2 -3 -5 ", + "5 4 1 -1 -4 -5 ", + "5 4 2 -2 -4 -5 ", + "5 4 3 -3 -4 -5 ", + "6 2 1 -1 -2 -6 ", + "6 3 1 -1 -3 -6 ", + "6 3 2 -2 -3 -6 ", + "6 4 1 -1 -4 -6 ", + "6 4 2 -2 -4 -6 ", + "6 4 3 -3 -4 -6 ", + "6 5 1 -1 -5 -6 ", + "6 5 2 -2 -5 -6 ", + "6 5 3 -3 -5 -6 ", + "6 5 4 -4 -5 -6 ", + "4 3 2 1 -1 -2 -3 -4 ", + "5 3 2 1 -1 -2 -3 -5 ", + "5 4 2 1 -1 -2 -4 -5 ", + "5 4 3 1 -1 -3 -4 -5 ", + "5 4 3 2 -2 -3 -4 -5 ", + "6 3 2 1 -1 -2 -3 -6 ", + "6 4 2 1 -1 -2 -4 -6 ", + "6 4 3 1 -1 -3 -4 -6 ", + "6 4 3 2 -2 -3 -4 -6 ", + "6 5 2 1 -1 -2 -5 -6 ", + "6 5 3 1 -1 -3 -5 -6 ", + "6 5 3 2 -2 -3 -5 -6 ", + "6 5 4 1 -1 -4 -5 -6 ", + "6 5 4 2 -2 -4 -5 -6 ", + "6 5 4 3 -3 -4 -5 -6 "}; + for (int l = 0; l < nLabels; l++) { + TObjString* objstr = new TObjString(labels[l].Data()); + arr->Add(objstr); + } + } else if (TString(whichDefaultLabels).EqualTo("Set_2")) { + // From ~/scratch/O2/master/Labels/Set_2/labels_Set_2.root + const int nLabels = 62; // yes, because I do not care about 1-p + TString labels[nLabels] = { + "1 -1 ", + "2 -2 ", + "3 -3 ", + "4 -4 ", + "5 -5 ", + "6 -6 ", + "2 1 -1 -2 ", + "3 1 -1 -3 ", + "3 2 -2 -3 ", + "4 1 -1 -4 ", + "4 2 -2 -4 ", + "4 3 -3 -4 ", + "5 1 -1 -5 ", + "5 2 -2 -5 ", + "5 3 -3 -5 ", + "5 4 -4 -5 ", + "6 1 -1 -6 ", + "6 2 -2 -6 ", + "6 3 -3 -6 ", + "6 4 -4 -6 ", + "6 5 -5 -6 ", + "3 2 1 -1 -2 -3 ", + "4 2 1 -1 -2 -4 ", + "4 3 1 -1 -3 -4 ", + "4 3 2 -2 -3 -4 ", + "5 2 1 -1 -2 -5 ", + "5 3 1 -1 -3 -5 ", + "5 3 2 -2 -3 -5 ", + "5 4 1 -1 -4 -5 ", + "5 4 2 -2 -4 -5 ", + "5 4 3 -3 -4 -5 ", + "6 2 1 -1 -2 -6 ", + "6 3 1 -1 -3 -6 ", + "6 3 2 -2 -3 -6 ", + "6 4 1 -1 -4 -6 ", + "6 4 2 -2 -4 -6 ", + "6 4 3 -3 -4 -6 ", + "6 5 1 -1 -5 -6 ", + "6 5 2 -2 -5 -6 ", + "6 5 3 -3 -5 -6 ", + "6 5 4 -4 -5 -6 ", + "4 3 2 1 -1 -2 -3 -4 ", + "5 3 2 1 -1 -2 -3 -5 ", + "5 4 2 1 -1 -2 -4 -5 ", + "5 4 3 1 -1 -3 -4 -5 ", + "5 4 3 2 -2 -3 -4 -5 ", + "6 3 2 1 -1 -2 -3 -6 ", + "6 4 2 1 -1 -2 -4 -6 ", + "6 4 3 1 -1 -3 -4 -6 ", + "6 4 3 2 -2 -3 -4 -6 ", + "6 5 2 1 -1 -2 -5 -6 ", + "6 5 3 1 -1 -3 -5 -6 ", + "6 5 3 2 -2 -3 -5 -6 ", + "6 5 4 1 -1 -4 -5 -6 ", + "6 5 4 2 -2 -4 -5 -6 ", + "6 5 4 3 -3 -4 -5 -6 ", + "5 4 3 2 1 -1 -2 -3 -4 -5 ", + "6 4 3 2 1 -1 -2 -3 -4 -6 ", + "6 5 3 2 1 -1 -2 -3 -5 -6 ", + "6 5 4 2 1 -1 -2 -4 -5 -6 ", + "6 5 4 3 1 -1 -3 -4 -5 -6 ", + "6 5 4 3 2 -2 -3 -4 -5 -6 "}; + for (int l = 0; l < nLabels; l++) { + TObjString* objstr = new TObjString(labels[l].Data()); + arr->Add(objstr); + } } else { LOGF(fatal, "\033[1;31m%s at line %d : whichDefaultLabels = %s is not supported yet \033[0m", __FUNCTION__, __LINE__, whichDefaultLabels); } @@ -12207,7 +13219,8 @@ TObjArray* GetObjArrayWithLabels(const char* filePath) // b) Determine from filePath if the file in on a local machine, or in AliEn; // c) Handle the AliEn case; // d) Handle the CCDB case; - // e) Handle the local case. + // e) Handle the local case; + // f) Clean up. if (tc.fVerbose) { StartFunction(__FUNCTION__); @@ -12280,11 +13293,7 @@ TObjArray* GetObjArrayWithLabels(const char* filePath) // https://indico.cern.ch/event/1267433/timetable/#20230417.detailed ccdb->setURL("http://alice-ccdb.cern.ch"); - oa = reinterpret_cast(ccdb->get( - TString(filePath) - .ReplaceAll("/alice-ccdb.cern.ch/", "") - .Data())); - + oa = reinterpret_cast(ccdb->get(TString(filePath).ReplaceAll("/alice-ccdb.cern.ch/", "").Data())); // TBI 20250414 memory blow-up if (!oa) { LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); } @@ -12327,7 +13336,14 @@ TObjArray* GetObjArrayWithLabels(const char* filePath) ExitFunction(__FUNCTION__); } - return oa; + // f) Clean up: + if (oaFile) { + oaFile->Close(); + delete oaFile; + oaFile = nullptr; + } + + return oa; // "292535" (local) + 294291 (ccdb) } // TObjArray* GetObjArrayWithLabels(const char *filePath) @@ -12483,13 +13499,12 @@ void GetHistogramWithCustomNUA(const char* filePath, eNUAPDF variable) void StoreLabelsInPlaceholder() { - // Storal all Test0 labels in the temporary placeholder. + // Storal all Test0 labels in the placeholder. // a) Initialize all counters; - // b) Fetch TObjArray with labels from an external file; - // c) Book the placeholder fTest0LabelsPlaceholder for all labels; - // d) Finally, store the labels from external source into placeholder; - // e) Insanity check on labels. + // b) Fetch TObjArray with labels from an external file or from local hardwired values; + // c) Insanity check on labels; + // d) Finally, store the labels from external source into the placeholder. if (tc.fVerbose) { StartFunction(__FUNCTION__); @@ -12501,12 +13516,24 @@ void StoreLabelsInPlaceholder() counter[o] = 0; } // now it's safe :-) - // b) Fetch TObjArray with labels from an external file: + // b) Fetch TObjArray with labels from an external file or from local hardwired values: TObjArray* oa = NULL; if (t0.fUseDefaultLabels) { oa = GetDefaultObjArrayWithLabels(t0.fWhichDefaultLabels.Data()); } else { + + LOGF(info, "\033[1;33m%s at line %d: !!!! WARNING !!!! There is a large memory blow-up when calling function GetObjArrayWithLabels(...) !!!! WARNING !!!! \033[0m", __FUNCTION__, __LINE__); + oa = GetObjArrayWithLabels(t0.fFileWithLabels.Data()); + // TBI 20250412 There is a large memory penalty in this call, confirmed for "local" and "ccdb" cases (most likely also for "alien", but I didn't test it yet) + // a) For the "local" case, it's related to the following minimal reproducer: + // TFile *f = new TFile("tmp.root", "read"); // memory blows up by > 50 MB + // f->Close(); delete f; f = nullptr; // memory stays > 50 MB + // b) Not clear why there is a blow-up for "ccdb" case, but it can be reproduced with this line: + // Service ccdb; + // ccdb->get("somePath"); + // c) TBI 20250412 document eventually also the "alien" case here + // ... } if (!oa) { LOGF(info, "\033[1;33m fFileWithLabels = %s \033[0m", @@ -12514,100 +13541,48 @@ void StoreLabelsInPlaceholder() LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); } - // c) Book the placeholder fTest0LabelsPlaceholder for all labels: + // c) Insanity check on labels: int nLabels = oa->GetEntries(); - t0.fTest0LabelsPlaceholder = - new TH1I("fTest0LabelsPlaceholder", - Form("placeholder for all labels, %d in total", nLabels), - nLabels, 0, nLabels); - t0.fTest0LabelsPlaceholder->SetStats(false); - - // d) Finally, store the labels from external source into placeholder: - int bin = 1; // used only for fTest0LabelsPlaceholder - int order = -44; + // c1) Insanity check on number of labels: + if (nLabels <= 0) { + LOGF(fatal, "\033[1;31m%s at line %d : nLabels = %d \033[0m", __FUNCTION__, __LINE__, nLabels); + } + // c2) Here I am merely checking that harmonic larger than gMaxHarmonic was not requested: for (int e = 0; e < nLabels; e++) { TObjArray* temp = TString(oa->At(e)->GetName()).Tokenize(" "); - if (!temp) { - LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); - } - order = temp->GetEntries(); - delete temp; // yes, otherwise it's a memory leak - if (0 == order) { - continue; - } // empty lines, or the label format which is not supported - // 1-p => 0, 2-p => 1, etc.: - t0.fTest0Labels[order - 1][counter[order - 1]] = - new TString(oa->At(e)->GetName()); // okay... - t0.fTest0LabelsPlaceholder->GetXaxis()->SetBinLabel( - bin++, t0.fTest0Labels[order - 1][counter[order - 1]]->Data()); - // cout<<__LINE__<<": - // "<Data()<GetEntries()<GetXaxis()->GetNbins(); b++) { - TObjArray* temp = TString(t0.fTest0LabelsPlaceholder->GetXaxis()->GetBinLabel(b)).Tokenize(" "); for (int h = 0; h < temp->GetEntries(); h++) { - if (TMath::Abs(TString(temp->At(h)->GetName()).Atoi()) > gMaxHarmonic) { - LOGF(info, "\033[1;31m bin = %d, label = %s, gMaxHarmonic = %d\033[0m", b, t0.fTest0LabelsPlaceholder->GetXaxis()->GetBinLabel(b), static_cast(gMaxHarmonic)); + if (std::abs(TString(temp->At(h)->GetName()).Atoi()) > gMaxHarmonic) { + LOGF(info, "\033[1;31m e = %d, label = %s, gMaxHarmonic = %d\033[0m", e, temp->At(h)->GetName(), static_cast(gMaxHarmonic)); LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); } // if(TString(temp->At(h)->GetName()).Atoi() > gMaxHarmonic) { } // for(int h = 0; h < temp->GetEntries(); h++) { delete temp; // yes, otherwise it's a memory leak - } // for(int b = 1; b <= t0.fTest0LabelsPlaceholder->GetXaxis()->GetNbins(); b++) { - - if (tc.fVerbose) { - ExitFunction(__FUNCTION__); - } - -} // void StoreLabelsInPlaceholder() - -//============================================================ - -bool RetrieveCorrelationsLabels() -{ - // Generate the labels of all correlations of interest, i.e. retrieve them - // from TH1I *t0.fTest0LabelsPlaceholder - - if (tc.fVerbose) { - StartFunction(__FUNCTION__); - } - - int counter[gMaxCorrelator] = {0}; // is this safe? - for (int o = 0; o < gMaxCorrelator; o++) { - counter[o] = 0; - } // now it's safe :-) - - int nBins = t0.fTest0LabelsPlaceholder->GetXaxis()->GetNbins(); + } // for (int e = 0; e < nLabels; e++) { + // ... + // d) Finally, store the labels from external source into the placeholder: int order = -44; - for (int b = 1; b <= nBins; b++) { - TObjArray* oa = TString(t0.fTest0LabelsPlaceholder->GetXaxis()->GetBinLabel(b)) - .Tokenize(" "); - if (!oa) { + for (int e = 0; e < nLabels; e++) { + TObjArray* temp = TString(oa->At(e)->GetName()).Tokenize(" "); + if (!temp) { LOGF(fatal, "\033[1;31m%s at line %d\033[0m", __FUNCTION__, __LINE__); } - order = oa->GetEntries(); - delete oa; // yes, otherwise it's a memory leak + order = temp->GetEntries(); + delete temp; // yes, otherwise it's a memory leak if (0 == order) { continue; } // empty lines, or the label format which is not supported // 1-p => 0, 2-p => 1, etc.: - t0.fTest0Labels[order - 1][counter[order - 1]] = new TString(t0.fTest0LabelsPlaceholder->GetXaxis()->GetBinLabel(b)); // okay... + t0.fTest0Labels[order - 1][counter[order - 1]] = new TString(oa->At(e)->GetName()); // okay... counter[order - 1]++; - } // for(int b=1;b<=nBins;b++) + } // for(int e=0; eGetSize();i++) { - if(TMath::Abs(nl.ftaNestedLoops[0]->GetAt(i)) > 0. && TMath::Abs(nl.ftaNestedLoops[1]->GetAt(i)) > 0.){nParticles++;} + if(std::abs(nl.ftaNestedLoops[0]->GetAt(i)) > 0. && std::abs(nl.ftaNestedLoops[1]->GetAt(i)) > 0.){nParticles++;} } } */ @@ -13408,7 +14383,7 @@ double CalculateCustomNestedLoops(TArrayI* harmonics) double dPhi1 = nl.ftaNestedLoops[0]->GetAt(i1); double dW1 = nl.ftaNestedLoops[1]->GetAt(i1); if (1 == order) { - value = TMath::Cos(harmonics->GetAt(0) * dPhi1); + value = std::cos(harmonics->GetAt(0) * dPhi1); weight = dW1; profile->Fill(0.5, value, weight); continue; @@ -13420,7 +14395,7 @@ double CalculateCustomNestedLoops(TArrayI* harmonics) double dPhi2 = nl.ftaNestedLoops[0]->GetAt(i2); double dW2 = nl.ftaNestedLoops[1]->GetAt(i2); if (2 == order) { - value = TMath::Cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2); + value = std::cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2); weight = dW1 * dW2; profile->Fill(0.5, value, weight); continue; @@ -13432,7 +14407,7 @@ double CalculateCustomNestedLoops(TArrayI* harmonics) double dPhi3 = nl.ftaNestedLoops[0]->GetAt(i3); double dW3 = nl.ftaNestedLoops[1]->GetAt(i3); if (3 == order) { - value = TMath::Cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3); + value = std::cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3); weight = dW1 * dW2 * dW3; profile->Fill(0.5, value, weight); continue; @@ -13444,7 +14419,7 @@ double CalculateCustomNestedLoops(TArrayI* harmonics) double dPhi4 = nl.ftaNestedLoops[0]->GetAt(i4); double dW4 = nl.ftaNestedLoops[1]->GetAt(i4); if (4 == order) { - value = TMath::Cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4); + value = std::cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4); weight = dW1 * dW2 * dW3 * dW4; profile->Fill(0.5, value, weight); continue; @@ -13456,7 +14431,7 @@ double CalculateCustomNestedLoops(TArrayI* harmonics) double dPhi5 = nl.ftaNestedLoops[0]->GetAt(i5); double dW5 = nl.ftaNestedLoops[1]->GetAt(i5); if (5 == order) { - value = TMath::Cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5); + value = std::cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5); weight = dW1 * dW2 * dW3 * dW4 * dW5; profile->Fill(0.5, value, weight); continue; @@ -13468,7 +14443,7 @@ double CalculateCustomNestedLoops(TArrayI* harmonics) double dPhi6 = nl.ftaNestedLoops[0]->GetAt(i6); double dW6 = nl.ftaNestedLoops[1]->GetAt(i6); if (6 == order) { - value = TMath::Cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6); + value = std::cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6); weight = dW1 * dW2 * dW3 * dW4 * dW5 * dW6; profile->Fill(0.5, value, weight); continue; @@ -13480,7 +14455,7 @@ double CalculateCustomNestedLoops(TArrayI* harmonics) double dPhi7 = nl.ftaNestedLoops[0]->GetAt(i7); double dW7 = nl.ftaNestedLoops[1]->GetAt(i7); if (7 == order) { - value = TMath::Cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6 + harmonics->GetAt(6) * dPhi7); + value = std::cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6 + harmonics->GetAt(6) * dPhi7); weight = dW1 * dW2 * dW3 * dW4 * dW5 * dW6 * dW7; profile->Fill(0.5, value, weight); continue; @@ -13492,7 +14467,7 @@ double CalculateCustomNestedLoops(TArrayI* harmonics) double dPhi8 = nl.ftaNestedLoops[0]->GetAt(i8); double dW8 = nl.ftaNestedLoops[1]->GetAt(i8); if (8 == order) { - value = TMath::Cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6 + harmonics->GetAt(6) * dPhi7 + harmonics->GetAt(7) * dPhi8); + value = std::cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6 + harmonics->GetAt(6) * dPhi7 + harmonics->GetAt(7) * dPhi8); weight = dW1 * dW2 * dW3 * dW4 * dW5 * dW6 * dW7 * dW8; profile->Fill(0.5, value, weight); continue; @@ -13504,7 +14479,7 @@ double CalculateCustomNestedLoops(TArrayI* harmonics) double dPhi9 = nl.ftaNestedLoops[0]->GetAt(i9); double dW9 = nl.ftaNestedLoops[1]->GetAt(i9); if (9 == order) { - value = TMath::Cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6 + harmonics->GetAt(6) * dPhi7 + harmonics->GetAt(7) * dPhi8 + harmonics->GetAt(8) * dPhi9); + value = std::cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6 + harmonics->GetAt(6) * dPhi7 + harmonics->GetAt(7) * dPhi8 + harmonics->GetAt(8) * dPhi9); weight = dW1 * dW2 * dW3 * dW4 * dW5 * dW6 * dW7 * dW8 * dW9; profile->Fill(0.5, value, weight); continue; @@ -13516,7 +14491,7 @@ double CalculateCustomNestedLoops(TArrayI* harmonics) double dPhi10 = nl.ftaNestedLoops[0]->GetAt(i10); double dW10 = nl.ftaNestedLoops[1]->GetAt(i10); if (10 == order) { - value = TMath::Cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6 + harmonics->GetAt(6) * dPhi7 + harmonics->GetAt(7) * dPhi8 + harmonics->GetAt(8) * dPhi9 + harmonics->GetAt(9) * dPhi10); + value = std::cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6 + harmonics->GetAt(6) * dPhi7 + harmonics->GetAt(7) * dPhi8 + harmonics->GetAt(8) * dPhi9 + harmonics->GetAt(9) * dPhi10); weight = dW1 * dW2 * dW3 * dW4 * dW5 * dW6 * dW7 * dW8 * dW9 * dW10; profile->Fill(0.5, value, weight); continue; @@ -13528,7 +14503,7 @@ double CalculateCustomNestedLoops(TArrayI* harmonics) double dPhi11 = nl.ftaNestedLoops[0]->GetAt(i11); double dW11 = nl.ftaNestedLoops[1]->GetAt(i11); if (11 == order) { - value = TMath::Cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6 + harmonics->GetAt(6) * dPhi7 + harmonics->GetAt(7) * dPhi8 + harmonics->GetAt(8) * dPhi9 + harmonics->GetAt(9) * dPhi10 + harmonics->GetAt(10) * dPhi11); + value = std::cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6 + harmonics->GetAt(6) * dPhi7 + harmonics->GetAt(7) * dPhi8 + harmonics->GetAt(8) * dPhi9 + harmonics->GetAt(9) * dPhi10 + harmonics->GetAt(10) * dPhi11); weight = dW1 * dW2 * dW3 * dW4 * dW5 * dW6 * dW7 * dW8 * dW9 * dW10 * dW11; profile->Fill(0.5, value, weight); continue; @@ -13540,7 +14515,7 @@ double CalculateCustomNestedLoops(TArrayI* harmonics) double dPhi12 = nl.ftaNestedLoops[0]->GetAt(i12); double dW12 = nl.ftaNestedLoops[1]->GetAt(i12); if (12 == order) { - value = TMath::Cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6 + harmonics->GetAt(6) * dPhi7 + harmonics->GetAt(7) * dPhi8 + harmonics->GetAt(8) * dPhi9 + harmonics->GetAt(9) * dPhi10 + harmonics->GetAt(10) * dPhi11 + harmonics->GetAt(11) * dPhi12); + value = std::cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6 + harmonics->GetAt(6) * dPhi7 + harmonics->GetAt(7) * dPhi8 + harmonics->GetAt(8) * dPhi9 + harmonics->GetAt(9) * dPhi10 + harmonics->GetAt(10) * dPhi11 + harmonics->GetAt(11) * dPhi12); weight = dW1 * dW2 * dW3 * dW4 * dW5 * dW6 * dW7 * dW8 * dW9 * dW10 * dW11 * dW12; profile->Fill(0.5, value, weight); continue; @@ -13624,7 +14599,7 @@ double CalculateKineCustomNestedLoops(TArrayI* harmonics, eAsFunctionOf AFO_vari // Get the number of particles in this kine bin: int nParticles = 0; for (int i = 0; i < nl.ftaNestedLoopsKine[qvKine][bin][0]->GetSize(); i++) { - if (TMath::Abs(nl.ftaNestedLoopsKine[qvKine][bin][0]->GetAt(i)) > 0.) { + if (std::abs(nl.ftaNestedLoopsKine[qvKine][bin][0]->GetAt(i)) > 0.) { nParticles++; } } @@ -13659,7 +14634,7 @@ double CalculateKineCustomNestedLoops(TArrayI* harmonics, eAsFunctionOf AFO_vari double dPhi1 = nl.ftaNestedLoopsKine[qvKine][bin][0]->GetAt(i1); double dW1 = nl.ftaNestedLoopsKine[qvKine][bin][1]->GetAt(i1); if (1 == order) { - value = TMath::Cos(harmonics->GetAt(0) * dPhi1); + value = std::cos(harmonics->GetAt(0) * dPhi1); weight = dW1; profile->Fill(0.5, value, weight); continue; @@ -13671,7 +14646,7 @@ double CalculateKineCustomNestedLoops(TArrayI* harmonics, eAsFunctionOf AFO_vari double dPhi2 = nl.ftaNestedLoopsKine[qvKine][bin][0]->GetAt(i2); double dW2 = nl.ftaNestedLoopsKine[qvKine][bin][1]->GetAt(i2); if (2 == order) { - value = TMath::Cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2); + value = std::cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2); weight = dW1 * dW2; profile->Fill(0.5, value, weight); continue; @@ -13683,7 +14658,7 @@ double CalculateKineCustomNestedLoops(TArrayI* harmonics, eAsFunctionOf AFO_vari double dPhi3 = nl.ftaNestedLoopsKine[qvKine][bin][0]->GetAt(i3); double dW3 = nl.ftaNestedLoopsKine[qvKine][bin][1]->GetAt(i3); if (3 == order) { - value = TMath::Cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3); + value = std::cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3); weight = dW1 * dW2 * dW3; profile->Fill(0.5, value, weight); continue; @@ -13695,7 +14670,7 @@ double CalculateKineCustomNestedLoops(TArrayI* harmonics, eAsFunctionOf AFO_vari double dPhi4 = nl.ftaNestedLoopsKine[qvKine][bin][0]->GetAt(i4); double dW4 = nl.ftaNestedLoopsKine[qvKine][bin][1]->GetAt(i4); if (4 == order) { - value = TMath::Cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4); + value = std::cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4); weight = dW1 * dW2 * dW3 * dW4; profile->Fill(0.5, value, weight); continue; @@ -13707,7 +14682,7 @@ double CalculateKineCustomNestedLoops(TArrayI* harmonics, eAsFunctionOf AFO_vari double dPhi5 = nl.ftaNestedLoopsKine[qvKine][bin][0]->GetAt(i5); double dW5 = nl.ftaNestedLoopsKine[qvKine][bin][1]->GetAt(i5); if (5 == order) { - value = TMath::Cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5); + value = std::cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5); weight = dW1 * dW2 * dW3 * dW4 * dW5; profile->Fill(0.5, value, weight); continue; @@ -13719,7 +14694,7 @@ double CalculateKineCustomNestedLoops(TArrayI* harmonics, eAsFunctionOf AFO_vari double dPhi6 = nl.ftaNestedLoopsKine[qvKine][bin][0]->GetAt(i6); double dW6 = nl.ftaNestedLoopsKine[qvKine][bin][1]->GetAt(i6); if (6 == order) { - value = TMath::Cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6); + value = std::cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6); weight = dW1 * dW2 * dW3 * dW4 * dW5 * dW6; profile->Fill(0.5, value, weight); continue; @@ -13731,7 +14706,7 @@ double CalculateKineCustomNestedLoops(TArrayI* harmonics, eAsFunctionOf AFO_vari double dPhi7 = nl.ftaNestedLoopsKine[qvKine][bin][0]->GetAt(i7); double dW7 = nl.ftaNestedLoopsKine[qvKine][bin][1]->GetAt(i7); if (7 == order) { - value = TMath::Cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6 + harmonics->GetAt(6) * dPhi7); + value = std::cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6 + harmonics->GetAt(6) * dPhi7); weight = dW1 * dW2 * dW3 * dW4 * dW5 * dW6 * dW7; profile->Fill(0.5, value, weight); continue; @@ -13743,7 +14718,7 @@ double CalculateKineCustomNestedLoops(TArrayI* harmonics, eAsFunctionOf AFO_vari double dPhi8 = nl.ftaNestedLoopsKine[qvKine][bin][0]->GetAt(i8); double dW8 = nl.ftaNestedLoopsKine[qvKine][bin][1]->GetAt(i8); if (8 == order) { - value = TMath::Cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6 + harmonics->GetAt(6) * dPhi7 + harmonics->GetAt(7) * dPhi8); + value = std::cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6 + harmonics->GetAt(6) * dPhi7 + harmonics->GetAt(7) * dPhi8); weight = dW1 * dW2 * dW3 * dW4 * dW5 * dW6 * dW7 * dW8; profile->Fill(0.5, value, weight); continue; @@ -13755,7 +14730,7 @@ double CalculateKineCustomNestedLoops(TArrayI* harmonics, eAsFunctionOf AFO_vari double dPhi9 = nl.ftaNestedLoopsKine[qvKine][bin][0]->GetAt(i9); double dW9 = nl.ftaNestedLoopsKine[qvKine][bin][1]->GetAt(i9); if (9 == order) { - value = TMath::Cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6 + harmonics->GetAt(6) * dPhi7 + harmonics->GetAt(7) * dPhi8 + harmonics->GetAt(8) * dPhi9); + value = std::cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6 + harmonics->GetAt(6) * dPhi7 + harmonics->GetAt(7) * dPhi8 + harmonics->GetAt(8) * dPhi9); weight = dW1 * dW2 * dW3 * dW4 * dW5 * dW6 * dW7 * dW8 * dW9; profile->Fill(0.5, value, weight); continue; @@ -13767,7 +14742,7 @@ double CalculateKineCustomNestedLoops(TArrayI* harmonics, eAsFunctionOf AFO_vari double dPhi10 = nl.ftaNestedLoopsKine[qvKine][bin][0]->GetAt(i10); double dW10 = nl.ftaNestedLoopsKine[qvKine][bin][1]->GetAt(i10); if (10 == order) { - value = TMath::Cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6 + harmonics->GetAt(6) * dPhi7 + harmonics->GetAt(7) * dPhi8 + harmonics->GetAt(8) * dPhi9 + harmonics->GetAt(9) * dPhi10); + value = std::cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6 + harmonics->GetAt(6) * dPhi7 + harmonics->GetAt(7) * dPhi8 + harmonics->GetAt(8) * dPhi9 + harmonics->GetAt(9) * dPhi10); weight = dW1 * dW2 * dW3 * dW4 * dW5 * dW6 * dW7 * dW8 * dW9 * dW10; profile->Fill(0.5, value, weight); continue; @@ -13779,7 +14754,7 @@ double CalculateKineCustomNestedLoops(TArrayI* harmonics, eAsFunctionOf AFO_vari double dPhi11 = nl.ftaNestedLoopsKine[qvKine][bin][0]->GetAt(i11); double dW11 = nl.ftaNestedLoopsKine[qvKine][bin][1]->GetAt(i11); if (11 == order) { - value = TMath::Cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6 + harmonics->GetAt(6) * dPhi7 + harmonics->GetAt(7) * dPhi8 + harmonics->GetAt(8) * dPhi9 + harmonics->GetAt(9) * dPhi10 + harmonics->GetAt(10) * dPhi11); + value = std::cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6 + harmonics->GetAt(6) * dPhi7 + harmonics->GetAt(7) * dPhi8 + harmonics->GetAt(8) * dPhi9 + harmonics->GetAt(9) * dPhi10 + harmonics->GetAt(10) * dPhi11); weight = dW1 * dW2 * dW3 * dW4 * dW5 * dW6 * dW7 * dW8 * dW9 * dW10 * dW11; profile->Fill(0.5, value, weight); continue; @@ -13791,7 +14766,7 @@ double CalculateKineCustomNestedLoops(TArrayI* harmonics, eAsFunctionOf AFO_vari double dPhi12 = nl.ftaNestedLoopsKine[qvKine][bin][0]->GetAt(i12); double dW12 = nl.ftaNestedLoopsKine[qvKine][bin][1]->GetAt(i12); if (12 == order) { - value = TMath::Cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6 + harmonics->GetAt(6) * dPhi7 + harmonics->GetAt(7) * dPhi8 + harmonics->GetAt(8) * dPhi9 + harmonics->GetAt(9) * dPhi10 + harmonics->GetAt(10) * dPhi11 + harmonics->GetAt(11) * dPhi12); + value = std::cos(harmonics->GetAt(0) * dPhi1 + harmonics->GetAt(1) * dPhi2 + harmonics->GetAt(2) * dPhi3 + harmonics->GetAt(3) * dPhi4 + harmonics->GetAt(4) * dPhi5 + harmonics->GetAt(5) * dPhi6 + harmonics->GetAt(6) * dPhi7 + harmonics->GetAt(7) * dPhi8 + harmonics->GetAt(8) * dPhi9 + harmonics->GetAt(9) * dPhi10 + harmonics->GetAt(10) * dPhi11 + harmonics->GetAt(11) * dPhi12); weight = dW1 * dW2 * dW3 * dW4 * dW5 * dW6 * dW7 * dW8 * dW9 * dW10 * dW11 * dW12; profile->Fill(0.5, value, weight); continue; @@ -14113,20 +15088,27 @@ void DetermineInteractionRateAndCurrentRunDuration(T1 const& collision, T2 const StartFunction(__FUNCTION__); } - // a1) Determine interaction rate only for eRec: if constexpr (rs == eRec || rs == eQA) { // TBI 20250112 check still eRecSim mode here auto bc = collision.template foundBC_as(); // I have the same code snippet at other places, keep in sync. - double hadronicRate = mRateFetcher.fetch(ccdb.service, static_cast(bc.timestamp()), static_cast(bc.runNumber()), "ZNC hadronic") * 1.e-3; - if (hadronicRate > 0.) { - ebye.fInteractionRate = static_cast(hadronicRate); - } else { - LOGF(warning, "\033[1;31m%s at line %d : hadronicRate = %f is meaningless \033[0m", __FUNCTION__, __LINE__, hadronicRate); - // I hit indeed at negative hadronic rate in LHC24ar/559545/apass1 dataset. But I do not really need to bail out here, because that collision in - // any case will not pass a cut in configurable cfInteractionRate . Therefore, I print a warning, and then can grep it from the log, if necessary. - } + + // a1) Determine interaction rate only for eRec: + if (ec.fUseEventCuts[eInteractionRate] || qa.fFillQAEventHistograms2D || qa.fFillQACorrelationsVsInteractionRateVsProfiles2D || mupa.fCalculateCorrelationsAsFunctionOf[AFO_INTERACTIONRATE] || t0.fCalculateTest0AsFunctionOf[AFO_INTERACTIONRATE] || es.fCalculateEtaSeparationsAsFunctionOf[AFO_INTERACTIONRATE]) { + + LOGF(info, "\033[1;33m%s at line %d: !!!! WARNING !!!! There is a large memory blow-up of ~130 MB when calling mRateFetcher.fetch(...) !!!! WARNING !!!! \033[0m", __FUNCTION__, __LINE__); + + double hadronicRate = mRateFetcher.fetch(ccdb.service, static_cast(bc.timestamp()), static_cast(bc.runNumber()), "ZNC hadronic") * 1.e-3; // TBI 20250414 memory blow-up + if (hadronicRate > 0.) { + ebye.fInteractionRate = static_cast(hadronicRate); + } else { + LOGF(warning, "\033[1;31m%s at line %d : hadronicRate = %f is meaningless \033[0m", __FUNCTION__, __LINE__, hadronicRate); + // I hit indeed at negative hadronic rate in LHC24ar/559545/apass1 dataset. But I do not really need to bail out here, because that collision in + // any case will not pass a cut in configurable cfInteractionRate . Therefore, I print a warning, and then can grep it from the log, if necessary. + } + } // if(...) // a2) Determine the current run duration: // TBI 20250107 I could move this to a separate function? + // TBI 20250415 I do not see any memory penalty here, so I keep it ebye.fCurrentRunDuration = std::floor(bc.timestamp() * 0.001) - tc.fRunTime[eStartOfRun]; if (ebye.fCurrentRunDuration > tc.fRunTime[eDurationInSec]) { LOGF(fatal, "\033[1;31m%s at line %d : ebye.fCurrentRunDuration = %d is bigger than tc.fRunTime[eDurationInSec] = %d, which is meaningless \033[0m", __FUNCTION__, __LINE__, static_cast(ebye.fCurrentRunDuration), static_cast(tc.fRunTime[eDurationInSec])); @@ -14586,9 +15568,9 @@ void FillQvector(const double& dPhi, const double& dPt, const double& dEta) for (int wp = 0; wp < gMaxCorrelator + 1; wp++) { // weight power if (pw.fUseWeights[wPHI] || pw.fUseWeights[wPT] || pw.fUseWeights[wETA]) { wToPowerP = pow(wPhi * wPt * wEta, wp); - qv.fQvector[h][wp] += TComplex(wToPowerP * TMath::Cos(h * dPhi), wToPowerP * TMath::Sin(h * dPhi)); // Q-vector with weights + qv.fQvector[h][wp] += TComplex(wToPowerP * std::cos(h * dPhi), wToPowerP * std::sin(h * dPhi)); // Q-vector with weights } else { - qv.fQvector[h][wp] += TComplex(TMath::Cos(h * dPhi), TMath::Sin(h * dPhi)); // bare Q-vector without weights + qv.fQvector[h][wp] += TComplex(std::cos(h * dPhi), std::sin(h * dPhi)); // bare Q-vector without weights } } // for(int wp=0;wp(track, eBefore); } + // memStatus ~163 (with 'continue') + // *) Particle cuts counters (use only during QA, as this is computationally heavy): if (pc.fUseParticleCutCounterAbsolute || pc.fUseParticleCutCounterSequential) { ParticleCutsCounters(track); } + // memStatus ~164 (with 'continue') + // *) Particle cuts: if (!ParticleCuts(track, eCut)) { // Main call for event cuts. continue; // not return!! } + // memStatus ~162 (with 'continue') + // *) Fill particle histograms after particle cuts: if (ph.fFillParticleHistograms || ph.fFillParticleHistograms2D || qa.fFillQAParticleHistograms2D) { FillParticleHistograms(track, eAfter); } + // memStatus ~164 (with 'continue') + // *) Intitialize local kinematic variables: // Remark: for "eRecSim" processing, kinematics is taken from "reconstructed". dPhi = track.phi(); @@ -15214,23 +16206,27 @@ void Steer(T1 const& collision, T2 const& bcs, T3 const& tracks) DetermineOccupancy(collision); // *) Determine collision interaction rate and current run duration: - DetermineInteractionRateAndCurrentRunDuration(collision, bcs); + DetermineInteractionRateAndCurrentRunDuration(collision, bcs); // TBI 20250414 temporary commented out, because of memory blow-up // *) Determine vertex z position: DetermineVertexZ(collision); // *) Determine additional QA thingies: if (qa.fFillQAEventHistograms2D || qa.fFillQAParticleHistograms2D || qa.fFillQAParticleEventHistograms2D || qa.fFillQACorrelationsVsHistograms2D || qa.fFillQACorrelationsVsInteractionRateVsProfiles2D) { - // Remark: I implement ideally here only the getters for which the subsription to additional non-standard tables was needed for QA purposes. + // Remark: I implement ideally here only the getters for which the subscription to additional non-standard tables was needed for QA purposes. DetermineQAThingies(collision, bcs); } + // memStatus: ~116 + // *) Fill event histograms before event cuts: if (eh.fFillEventHistograms || qa.fFillQAEventHistograms2D || qa.fFillQAParticleEventHistograms2D) { // Remark: I do not above the flag fFillQACorrelationsVsHistograms2D, because as a part of QA I calculate <2> only after cuts in any case FillEventHistograms(collision, tracks, eBefore); } + // memStatus: ~117 + // *) Print info on the current event number (total, before cuts): if (tc.fVerboseEventCounter) { PrintEventCounter(eBefore); @@ -15241,14 +16237,20 @@ void Steer(T1 const& collision, T2 const& bcs, T3 const& tracks) EventCutsCounters(collision, tracks); } + // memStatus: ~117 + // *) Event cuts: if (!EventCuts(collision, tracks, eCut)) { // Main call for event cuts return; } + // memStatus: ~117 + // *) Main loop over particles: MainLoopOverParticles(tracks); + // memStatus: ~162 (all particle histograms), ~133 (only phi, pt, eta) + // *) Determine multiplicity of this event, for all "vs. mult" results: DetermineMultiplicity(); @@ -15298,6 +16300,8 @@ void Steer(T1 const& collision, T2 const& bcs, T3 const& tracks) tc.fTimer[eGlobal]->Continue(); // yes } + // memStatus: ~160 +- 5 + if (tc.fVerbose) { ExitFunction(__FUNCTION__); } diff --git a/PWGCF/MultiparticleCorrelations/Tasks/multiparticle-correlations-ab.cxx b/PWGCF/MultiparticleCorrelations/Tasks/multiparticle-correlations-ab.cxx index f88933d8450..0ee4f0cd5eb 100644 --- a/PWGCF/MultiparticleCorrelations/Tasks/multiparticle-correlations-ab.cxx +++ b/PWGCF/MultiparticleCorrelations/Tasks/multiparticle-correlations-ab.cxx @@ -9,6 +9,10 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +/// \file multiparticle-correlations-ab.cxx +/// \brief ... TBI 20250425 +/// \author Ante.Bilandzic@cern.ch + // O2: #include #include "Common/CCDB/ctpRateFetcher.h" @@ -135,6 +139,7 @@ struct MultiparticleCorrelationsAB // this name is used in lower-case format to DefaultCuts(); // here default values for cuts are either hardwired, or defined through default binning to ease bookeeping, // or values for cuts provided via configurables are taken into account // Remark: DefaultCuts() has to be called after DefaultBinning() + // *) Specific cuts: if (tc.fUseSpecificCuts) { SpecificCuts(tc.fWhichSpecificCuts); // after default cuts are applied, on top of them apply analysis-specific cuts. Has to be called after DefaultBinning() and DefaultCuts() @@ -152,7 +157,7 @@ struct MultiparticleCorrelationsAB // this name is used in lower-case format to // *) Book all remaining objects; BookAndNestAllLists(); - BookResultsHistograms(); // yes, this one has to be booked first, because it defines the commong binning for other groups of histograms + BookResultsHistograms(); // yes, this one has to be booked first, because it defines the common binning for other groups of histograms TBI 20250412 this is true only if I can use Clone() BookQAHistograms(); BookEventHistograms(); BookEventCutsHistograms(); @@ -167,7 +172,7 @@ struct MultiparticleCorrelationsAB // this name is used in lower-case format to BookInternalValidationHistograms(); BookTest0Histograms(); BookEtaSeparationsHistograms(); - BookTheRest(); // here I book everything that was not sorted (yet) in the specific functions above + BookTheRest(); // I book everything that was not sorted (yet) in the specific functions above // *) Insanity checks after booking: InsanityChecksAfterBooking(); // pointers of all local histograms, etc., are available, so I can do insanity checks directly on all booked objects From dca33c5fa3470590e681e14bbd2def1a77ee2c99 Mon Sep 17 00:00:00 2001 From: Noor Koster <82090643+cnkoster@users.noreply.github.com> Date: Fri, 25 Apr 2025 23:41:26 +0200 Subject: [PATCH 1107/1650] [PWGCF] Fixed indices of corrections (#10965) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/TableProducer/zdcQVectors.cxx | 86 +++++++--- PWGCF/Flow/Tasks/flowSP.cxx | 204 +++++++++++++---------- 2 files changed, 180 insertions(+), 110 deletions(-) diff --git a/PWGCF/Flow/TableProducer/zdcQVectors.cxx b/PWGCF/Flow/TableProducer/zdcQVectors.cxx index 21fcbdc3c55..f0052000fe6 100644 --- a/PWGCF/Flow/TableProducer/zdcQVectors.cxx +++ b/PWGCF/Flow/TableProducer/zdcQVectors.cxx @@ -81,6 +81,7 @@ double alphaZDC = 0.395; // q-vectors before (q) and after (qRec) recentering. std::vector q(4); // start values of [QxA, QyA, QxC, QyC] +std::vector qNoEq(4); // start values of [QxA, QyA, QxC, QyC] // for energy calibration std::vector eZN(8); // uncalibrated energy for the 2x4 towers (a1, a2, a3, a4, c1, c2, c3, c4) @@ -129,7 +130,7 @@ struct ZdcQVectors { O2_DEFINE_CONFIGURABLE(cfgEnergyCal, std::string, "Users/c/ckoster/ZDC/LHC23_zzh_pass4/Energy", "ccdb path for energy calibration histos") O2_DEFINE_CONFIGURABLE(cfgMeanv, std::string, "Users/c/ckoster/ZDC/LHC23_zzh_pass4/vmean", "ccdb path for mean v histos") O2_DEFINE_CONFIGURABLE(cfgMinEntriesSparseBin, int, 100, "Minimal number of entries allowed in 4D recentering histogram to use for recentering.") - O2_DEFINE_CONFIGURABLE(cfgRec, std::string, "Users/c/ckoster/ZDC/LHC23_PbPb_pass4/", "ccdb path for recentering histos"); + O2_DEFINE_CONFIGURABLE(cfgRec, std::string, "Users/c/ckoster/ZDC/LHC23_PbPb_pass4", "ccdb path for recentering histos"); O2_DEFINE_CONFIGURABLE(cfgFillCommonRegistry, bool, true, "Fill common registry with histograms"); // Additional event selections @@ -249,6 +250,16 @@ struct ZdcQVectors { registry.add("QA/before/ZNC_pm3", "ZNC_pm3", kTProfile, {{1, 0, 1.}}); registry.add("QA/before/ZNC_pm4", "ZNC_pm4", kTProfile, {{1, 0, 1.}}); + registry.add("QA/before/ZNA_Qx", "ZNA_Qx", kTProfile, {{1, 0, 1.}}); + registry.add("QA/before/ZNA_Qy", "ZNA_Qy", kTProfile, {{1, 0, 1.}}); + registry.add("QA/before/ZNC_Qx", "ZNC_Qx", kTProfile, {{1, 0, 1.}}); + registry.add("QA/before/ZNC_Qy", "ZNC_Qy", kTProfile, {{1, 0, 1.}}); + + registry.add("QA/before/ZNA_Qx_noEq", "ZNA_Qx_noEq", kTProfile, {{1, 0, 1.}}); + registry.add("QA/before/ZNA_Qy_noEq", "ZNA_Qy_noEq", kTProfile, {{1, 0, 1.}}); + registry.add("QA/before/ZNC_Qx_noEq", "ZNC_Qx_noEq", kTProfile, {{1, 0, 1.}}); + registry.add("QA/before/ZNC_Qy_noEq", "ZNC_Qy_noEq", kTProfile, {{1, 0, 1.}}); + registry.addClone("QA/before/", "QA/after/"); } @@ -418,6 +429,10 @@ struct ZdcQVectors { cal.calibList[cm] = ccdb->getForTimeStamp(ccdb_dir, timestamp); cal.calibfilesLoaded[cm] = true; LOGF(info, "Loaded calibration histos from %s", ccdb_dir.c_str()); + if (cm == kRec) { + cal.atStep = 5; + cal.atIteration = 5; + } } else { LOGF(info, "No ccdb path given for calibration histos. Do not recenter."); } @@ -437,7 +452,13 @@ struct ZdcQVectors { hist = reinterpret_cast(list->FindObject(Form("%s", objName))); } else if (cm == kRec) { TList* list = reinterpret_cast(cal.calibList[cm]->FindObject(Form("it%i_step%i", iteration, step))); + if (!list) { + LOGF(fatal, "No calibration list for iteration %i and step %i", iteration, step); + } hist = reinterpret_cast(list->FindObject(Form("%s", objName))); + if (!hist) { + LOGF(fatal, "No calibration histo for iteration %i and step %i -> %s", iteration, step, objName); + } cal.atStep = step; cal.atIteration = iteration; } @@ -501,9 +522,9 @@ struct ZdcQVectors { { // for Q-vector calculation // A[0] & C[1] - std::vector sumZN(2, 0.); - std::vector xEnZN(2, 0.); - std::vector yEnZN(2, 0.); + std::vector sumZN(2, 0.), sumZN_noEq(2, 0.); + std::vector xEnZN(2, 0.), xEnZN_noEq(2, 0.); + std::vector yEnZN(2, 0.), yEnZN_noEq(2, 0.); isSelected = true; @@ -678,6 +699,12 @@ struct ZdcQVectors { sumZN[side] += energy; xEnZN[side] += (side == 0) ? -1.0 * pxZDC[sector] * energy : pxZDC[sector] * energy; yEnZN[side] += pyZDC[sector] * energy; + + // Also calculate the Q-vector for the non-equalized energy + double energyNoEq = std::pow(eZN[tower], alphaZDC); + sumZN_noEq[side] += energyNoEq; + xEnZN_noEq[side] += (side == 0) ? -1.0 * pxZDC[sector] * energyNoEq : pxZDC[sector] * energyNoEq; + yEnZN_noEq[side] += pyZDC[sector] * energyNoEq; } // "QXA", "QYA", "QXC", "QYC" @@ -687,6 +714,10 @@ struct ZdcQVectors { q[i * 2] = xEnZN[i] / sumZN[i]; // for QXA[0] and QXC[2] q[i * 2 + 1] = yEnZN[i] / sumZN[i]; // for QYA[1] and QYC[3] } + if (sumZN_noEq[i] > 0) { + qNoEq[i * 2] = xEnZN_noEq[i] / sumZN_noEq[i]; // for QXA[0] and QXC[2] + qNoEq[i * 2 + 1] = yEnZN_noEq[i] / sumZN_noEq[i]; // for QYA[1] and QYC[3] + } } if (cal.calibfilesLoaded[1]) { @@ -701,10 +732,20 @@ struct ZdcQVectors { std::vector qRec(q); + registry.get(HIST("QA/before/ZNA_Qx"))->Fill(Form("%d", runnumber), q[0]); + registry.get(HIST("QA/before/ZNA_Qy"))->Fill(Form("%d", runnumber), q[1]); + registry.get(HIST("QA/before/ZNC_Qx"))->Fill(Form("%d", runnumber), q[2]); + registry.get(HIST("QA/before/ZNC_Qy"))->Fill(Form("%d", runnumber), q[3]); + + registry.get(HIST("QA/before/ZNA_Qx_noEq"))->Fill(Form("%d", runnumber), qNoEq[0]); + registry.get(HIST("QA/before/ZNA_Qy_noEq"))->Fill(Form("%d", runnumber), qNoEq[1]); + registry.get(HIST("QA/before/ZNC_Qx_noEq"))->Fill(Form("%d", runnumber), qNoEq[2]); + registry.get(HIST("QA/before/ZNC_Qy_noEq"))->Fill(Form("%d", runnumber), qNoEq[3]); + if (cal.atIteration == 0) { - if (isSelected) - if (cfgFillCommonRegistry) - fillCommonRegistry(q[0], q[1], q[2], q[3], v, centrality); + if (isSelected && cfgFillCommonRegistry) + fillCommonRegistry(q[0], q[1], q[2], q[3], v, centrality); + spTableZDC(runnumber, centrality, v[0], v[1], v[2], q[0], q[1], q[2], q[3], isSelected, 0, 0); counter++; return; @@ -720,21 +761,21 @@ struct ZdcQVectors { int pb = 0; - int nIterations = 6; + int nIterations = 5; int nSteps = 5; - for (int it = 1; it < nIterations; it++) { - corrQxA.push_back(getCorrection(names[0][0].Data(), it, 0)); - corrQyA.push_back(getCorrection(names[0][1].Data(), it, 0)); - corrQxC.push_back(getCorrection(names[0][2].Data(), it, 0)); - corrQyC.push_back(getCorrection(names[0][3].Data(), it, 0)); + for (int it = 1; it <= nIterations; it++) { + corrQxA.push_back(getCorrection(names[0][0].Data(), it, 1)); + corrQyA.push_back(getCorrection(names[0][1].Data(), it, 1)); + corrQxC.push_back(getCorrection(names[0][2].Data(), it, 1)); + corrQyC.push_back(getCorrection(names[0][3].Data(), it, 1)); pb++; - for (int step = 1; step < nSteps; step++) { - corrQxA.push_back(getCorrection(names[step][0].Data(), it, step)); - corrQyA.push_back(getCorrection(names[step][1].Data(), it, step)); - corrQxC.push_back(getCorrection(names[step][2].Data(), it, step)); - corrQyC.push_back(getCorrection(names[step][3].Data(), it, step)); + for (int step = 2; step <= nSteps; step++) { + corrQxA.push_back(getCorrection(names[step - 1][0].Data(), it, step)); + corrQyA.push_back(getCorrection(names[step - 1][1].Data(), it, step)); + corrQxC.push_back(getCorrection(names[step - 1][2].Data(), it, step)); + corrQyC.push_back(getCorrection(names[step - 1][3].Data(), it, step)); pb++; } } @@ -746,10 +787,13 @@ struct ZdcQVectors { qRec[3] -= corrQyC[cor]; } - if (isSelected) { - if (cfgFillCommonRegistry) - fillCommonRegistry(qRec[0], qRec[1], qRec[2], qRec[3], v, centrality); + if (isSelected && cfgFillCommonRegistry) { + fillCommonRegistry(qRec[0], qRec[1], qRec[2], qRec[3], v, centrality); registry.fill(HIST("QA/centrality_after"), centrality); + registry.get(HIST("QA/after/ZNA_Qx"))->Fill(Form("%d", runnumber), qRec[0]); + registry.get(HIST("QA/after/ZNA_Qy"))->Fill(Form("%d", runnumber), qRec[1]); + registry.get(HIST("QA/after/ZNC_Qx"))->Fill(Form("%d", runnumber), qRec[2]); + registry.get(HIST("QA/after/ZNC_Qy"))->Fill(Form("%d", runnumber), qRec[3]); } spTableZDC(runnumber, centrality, v[0], v[1], v[2], qRec[0], qRec[1], qRec[2], qRec[3], isSelected, cal.atIteration, cal.atStep); diff --git a/PWGCF/Flow/Tasks/flowSP.cxx b/PWGCF/Flow/Tasks/flowSP.cxx index 9be9242c107..0d524aadcdf 100644 --- a/PWGCF/Flow/Tasks/flowSP.cxx +++ b/PWGCF/Flow/Tasks/flowSP.cxx @@ -62,14 +62,14 @@ struct FlowSP { O2_DEFINE_CONFIGURABLE(cfgCentFV0A, bool, false, "Set centrality estimator to cfgCentFV0A"); O2_DEFINE_CONFIGURABLE(cfgCentNGlobal, bool, false, "Set centrality estimator to cfgCentNGlobal"); // Standard selections - O2_DEFINE_CONFIGURABLE(cfgDCAxy, float, 0.2, "Cut on DCA in the transverse direction (cm)"); - O2_DEFINE_CONFIGURABLE(cfgDCAz, float, 2, "Cut on DCA in the longitudinal direction (cm)"); - O2_DEFINE_CONFIGURABLE(cfgNcls, float, 70, "Cut on number of TPC clusters found"); - O2_DEFINE_CONFIGURABLE(cfgFshcls, float, 0.2, "Cut on fraction of shared TPC clusters found"); - O2_DEFINE_CONFIGURABLE(cfgPtmin, float, 0.2, "minimum pt (GeV/c)"); - O2_DEFINE_CONFIGURABLE(cfgPtmax, float, 10, "maximum pt (GeV/c)"); - O2_DEFINE_CONFIGURABLE(cfgEta, float, 0.8, "eta cut"); - O2_DEFINE_CONFIGURABLE(cfgVtxZ, float, 10, "vertex cut (cm)"); + O2_DEFINE_CONFIGURABLE(cfgTrackSelsDCAxy, float, 0.2, "Cut on DCA in the transverse direction (cm)"); + O2_DEFINE_CONFIGURABLE(cfgTrackSelsDCAz, float, 2, "Cut on DCA in the longitudinal direction (cm)"); + O2_DEFINE_CONFIGURABLE(cfgTrackSelsNcls, float, 70, "Cut on number of TPC clusters found"); + O2_DEFINE_CONFIGURABLE(cfgTrackSelsFshcls, float, 0.4, "Cut on fraction of shared TPC clusters found"); + O2_DEFINE_CONFIGURABLE(cfgTrackSelsPtmin, float, 0.2, "minimum pt (GeV/c)"); + O2_DEFINE_CONFIGURABLE(cfgTrackSelsPtmax, float, 10, "maximum pt (GeV/c)"); + O2_DEFINE_CONFIGURABLE(cfgTrackSelsEta, float, 0.8, "eta cut"); + O2_DEFINE_CONFIGURABLE(cfgEvSelsVtxZ, float, 10, "vertex cut (cm)"); O2_DEFINE_CONFIGURABLE(cfgMagField, float, 99999, "Configurable magnetic field;default CCDB will be queried"); O2_DEFINE_CONFIGURABLE(cfgCentMin, float, 0, "Minimum cenrality for selected events"); @@ -78,39 +78,40 @@ struct FlowSP { O2_DEFINE_CONFIGURABLE(cfgFillWeights, bool, true, "Fill NUA weights"); O2_DEFINE_CONFIGURABLE(cfgFillWeightsPOS, bool, false, "Fill NUA weights only for positive charges"); O2_DEFINE_CONFIGURABLE(cfgFillWeightsNEG, bool, false, "Fill NUA weights only for negative charges"); - O2_DEFINE_CONFIGURABLE(cfgNUA, std::string, "", "ccdb dir for NUA corrections"); - O2_DEFINE_CONFIGURABLE(cfgNUE, std::string, "", "ccdb dir for NUE corrections"); // Additional track Selections - O2_DEFINE_CONFIGURABLE(cfgUseAdditionalTrackCut, bool, true, "Bool to enable Additional Track Cut"); - O2_DEFINE_CONFIGURABLE(cfgDoubleTrackFunction, bool, true, "Include track cut at low pt"); - O2_DEFINE_CONFIGURABLE(cfgTrackCutSize, float, 0.06, "Spread of track cut"); + O2_DEFINE_CONFIGURABLE(cfgTrackSelsUseAdditionalTrackCut, bool, true, "Bool to enable Additional Track Cut"); + O2_DEFINE_CONFIGURABLE(cfgTrackSelsDoubleTrackFunction, bool, true, "Include track cut at low pt"); + O2_DEFINE_CONFIGURABLE(cfgTrackSelsTrackCutSize, float, 0.06, "Spread of track cut"); + O2_DEFINE_CONFIGURABLE(cfgTrackSelsDoDCApt, bool, true, "Apply Pt dependent DCAz cut"); + O2_DEFINE_CONFIGURABLE(cfgTrackSelsDCApt1, float, 0.1, "DcaZ < a * b / pt^1.1 -> this sets a"); + O2_DEFINE_CONFIGURABLE(cfgTrackSelsDCApt2, float, 0.035, "DcaZ < a * b / pt^1.1 -> this sets b"); // Additional event selections - O2_DEFINE_CONFIGURABLE(cfgUseAdditionalEventCut, bool, true, "Bool to enable Additional Event Cut"); - O2_DEFINE_CONFIGURABLE(cfgnSigmaMultCuts, int, 1, "Sigma cut on Additional event cut: 1 (default), 2 or 3 sigma available"); - O2_DEFINE_CONFIGURABLE(cfgManualEventParameters, bool, false, "Use manual event parameters for the pile up fits. Needed for Cent estimaters other than FT0C"); - O2_DEFINE_CONFIGURABLE(cfgMultPv, std::vector, {}, "Multiplicity cuts for PV first 5 parameters cutLOW last 5 cutHIGH"); - O2_DEFINE_CONFIGURABLE(cfgMult, std::vector, {}, "Multiplicity cuts for T0C first 5 parameters cutLOW last 5 cutHIGH"); - O2_DEFINE_CONFIGURABLE(cfgMaxOccupancy, int, 10000, "Maximum occupancy of selected events"); - O2_DEFINE_CONFIGURABLE(cfgNoSameBunchPileupCut, bool, true, "kNoSameBunchPileupCut"); - O2_DEFINE_CONFIGURABLE(cfgIsGoodZvtxFT0vsPV, bool, true, "kIsGoodZvtxFT0vsPV"); - O2_DEFINE_CONFIGURABLE(cfgNoCollInTimeRangeStandard, bool, true, "kNoCollInTimeRangeStandard"); - O2_DEFINE_CONFIGURABLE(cfgDoOccupancySel, bool, true, "Bool for event selection on detector occupancy"); - O2_DEFINE_CONFIGURABLE(cfgTVXinTRD, bool, false, "Use kTVXinTRD (reject TRD triggered events)"); - O2_DEFINE_CONFIGURABLE(cfgIsVertexITSTPC, bool, true, "Selects collisions with at least one ITS-TPC track"); - O2_DEFINE_CONFIGURABLE(cfgIsGoodITSLayersAll, bool, true, "Cut time intervals with dead ITS staves"); + O2_DEFINE_CONFIGURABLE(cfgEvSelsUseAdditionalEventCut, bool, true, "Bool to enable Additional Event Cut"); + O2_DEFINE_CONFIGURABLE(cfgEvSelsnSigmaMultCuts, int, 1, "Sigma cut on Additional event cut: 1 (default), 2 or 3 sigma available"); + O2_DEFINE_CONFIGURABLE(cfgEvSelsManualEventParameters, bool, false, "Use manual event parameters for the pile up fits. Needed for Cent estimaters other than FT0C"); + O2_DEFINE_CONFIGURABLE(cfgEvSelsMultPv, std::vector, {}, "Multiplicity cuts for PV first 5 parameters cutLOW last 5 cutHIGH"); + O2_DEFINE_CONFIGURABLE(cfgEvSelsMult, std::vector, {}, "Multiplicity cuts for T0C first 5 parameters cutLOW last 5 cutHIGH"); + O2_DEFINE_CONFIGURABLE(cfgEvSelsMaxOccupancy, int, 10000, "Maximum occupancy of selected events"); + O2_DEFINE_CONFIGURABLE(cfgEvSelsNoSameBunchPileupCut, bool, true, "kNoSameBunchPileupCut"); + O2_DEFINE_CONFIGURABLE(cfgEvSelsIsGoodZvtxFT0vsPV, bool, true, "kIsGoodZvtxFT0vsPV"); + O2_DEFINE_CONFIGURABLE(cfgEvSelsNoCollInTimeRangeStandard, bool, true, "kNoCollInTimeRangeStandard"); + O2_DEFINE_CONFIGURABLE(cfgEvSelsDoOccupancySel, bool, true, "Bool for event selection on detector occupancy"); + O2_DEFINE_CONFIGURABLE(cfgEvSelsTVXinTRD, bool, false, "Use kTVXinTRD (reject TRD triggered events)"); + O2_DEFINE_CONFIGURABLE(cfgEvSelsIsVertexITSTPC, bool, true, "Selects collisions with at least one ITS-TPC track"); + O2_DEFINE_CONFIGURABLE(cfgEvSelsIsGoodITSLayersAll, bool, true, "Cut time intervals with dead ITS staves"); // harmonics for v coefficients O2_DEFINE_CONFIGURABLE(cfgHarm, int, 1, "Flow harmonic n for ux and uy: (Cos(n*phi), Sin(n*phi))"); - O2_DEFINE_CONFIGURABLE(cfgHarmMixed, int, 2, "Flow harmonic n for ux and uy in mixed harmonics (MH): (Cos(n*phi), Sin(n*phi))"); + O2_DEFINE_CONFIGURABLE(cfgHarmMixed1, int, 2, "Flow harmonic n for ux and uy in mixed harmonics (MH): (Cos(n*phi), Sin(n*phi))"); + O2_DEFINE_CONFIGURABLE(cfgHarmMixed2, int, 3, "Flow harmonic n for ux and uy in mixed harmonics (MH): (Cos(n*phi), Sin(n*phi))"); // settings for CCDB data - O2_DEFINE_CONFIGURABLE(cfgLoadAverageQQ, bool, true, "Load average values for QQ (in centrality bins)"); - O2_DEFINE_CONFIGURABLE(cfgCCDBdir, std::string, "Users/c/ckoster/ZDC/LHC23_zzh_pass4_small/meanQQ", "ccdb dir for average QQ values in 1% centrality bins"); - O2_DEFINE_CONFIGURABLE(cfgLoadSPPlaneRes, bool, false, "Load ZDC spectator plane resolution"); - O2_DEFINE_CONFIGURABLE(cfgCCDBdir_SP, std::string, "Users/c/ckoster/ZDC/LHC23_zzh_pass4_small/SPPlaneRes", "ccdb dir for average event plane resolution in 1% centrality bins"); - // axis - - Filter collisionFilter = nabs(aod::collision::posZ) < cfgVtxZ; - Filter trackFilter = nabs(aod::track::eta) < cfgEta && aod::track::pt > cfgPtmin&& aod::track::pt < cfgPtmax && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && nabs(aod::track::dcaXY) < cfgDCAxy&& nabs(aod::track::dcaZ) < cfgDCAz; - Filter trackFilterMC = nabs(aod::mcparticle::eta) < cfgEta && aod::mcparticle::pt > cfgPtmin&& aod::mcparticle::pt < cfgPtmax; + O2_DEFINE_CONFIGURABLE(cfgCCDBdir_QQ, std::string, "", "ccdb dir for average QQ values in 1% centrality bins"); + O2_DEFINE_CONFIGURABLE(cfgCCDBdir_SP, std::string, "", "ccdb dir for average event plane resolution in 1% centrality bins"); + O2_DEFINE_CONFIGURABLE(cfgCCDB_NUA, std::string, "", "ccdb dir for NUA corrections"); + O2_DEFINE_CONFIGURABLE(cfgCCDB_NUE, std::string, "", "ccdb dir for NUE corrections"); + + Filter collisionFilter = nabs(aod::collision::posZ) < cfgEvSelsVtxZ; + Filter trackFilter = nabs(aod::track::eta) < cfgTrackSelsEta && aod::track::pt > cfgTrackSelsPtmin&& aod::track::pt < cfgTrackSelsPtmax && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && nabs(aod::track::dcaXY) < cfgTrackSelsDCAxy&& nabs(aod::track::dcaZ) < cfgTrackSelsDCAz; + Filter trackFilterMC = nabs(aod::mcparticle::eta) < cfgTrackSelsEta && aod::mcparticle::pt > cfgTrackSelsPtmin&& aod::mcparticle::pt < cfgTrackSelsPtmax; using UsedCollisions = soa::Filtered>; using UsedTracks = soa::Filtered>; @@ -293,6 +294,7 @@ struct FlowSP { registry.add("incl/QA/hDCAz_pt", "", kTH2D, {axisPt, axisDCAz}); registry.add("incl/QA/hSharedClusters_pt", "", {HistType::kTH2D, {axisPt, axisShCl}}); registry.add("incl/QA/hCrossedRows_pt", "", {HistType::kTH2D, {axisPt, axisCl}}); + registry.add("incl/QA/hCrossedRows_vs_SharedClusters", "", {HistType::kTH2D, {axisCl, axisShCl}}); } } @@ -455,7 +457,7 @@ struct FlowSP { registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_ZeroCharge + 1, "Only charged"); registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_ParticleWeights + 1, "Apply weights"); - if (cfgUseAdditionalEventCut) { + if (cfgEvSelsUseAdditionalEventCut) { int twoSigma = 2; int threeSigma = 3; @@ -469,13 +471,13 @@ struct FlowSP { double fitParamLowPV4 = -0.00974862; double fitParamLowPV5 = 2.71433e-05; - if (cfgnSigmaMultCuts == twoSigma) { + if (cfgEvSelsnSigmaMultCuts == twoSigma) { fitParamLowPV1 = 2665.68; fitParamLowPV2 = -93.3784; fitParamLowPV3 = 1.27137; fitParamLowPV4 = -0.00818936; fitParamLowPV5 = 2.115e-05; - } else if (cfgnSigmaMultCuts == threeSigma) { + } else if (cfgEvSelsnSigmaMultCuts == threeSigma) { fitParamLowPV1 = 2389.99; fitParamLowPV2 = -83.8483; fitParamLowPV3 = 1.11062; @@ -494,13 +496,13 @@ struct FlowSP { double fitParamHighPV4 = -0.0145343; double fitParamHighPV5 = 4.80688e-05; - if (cfgnSigmaMultCuts == twoSigma) { + if (cfgEvSelsnSigmaMultCuts == twoSigma) { fitParamHighPV1 = 3787.93; fitParamHighPV2 = -135.184; fitParamHighPV3 = 2.07683; fitParamHighPV4 = -0.0165997; fitParamHighPV5 = 5.68725e-05; - } else if (cfgnSigmaMultCuts == threeSigma) { + } else if (cfgEvSelsnSigmaMultCuts == threeSigma) { fitParamHighPV1 = 4067.4; fitParamHighPV2 = -145.485; fitParamHighPV3 = 2.27273; @@ -517,13 +519,13 @@ struct FlowSP { double fitParamLow4 = -0.00235284; double fitParamLow5 = 3.01132e-06; - if (cfgnSigmaMultCuts == twoSigma) { + if (cfgEvSelsnSigmaMultCuts == twoSigma) { fitParamLow1 = 1307.92; fitParamLow2 = -39.9168; fitParamLow3 = 0.412675; fitParamLow4 = -0.00148081; fitParamLow5 = 1.10868e-07; - } else if (cfgnSigmaMultCuts == threeSigma) { + } else if (cfgEvSelsnSigmaMultCuts == threeSigma) { fitParamLow1 = 1048.48; fitParamLow2 = -31.4568; fitParamLow3 = 0.287794; @@ -540,13 +542,13 @@ struct FlowSP { double fitParamHigh4 = -0.00496563; double fitParamHigh5 = 1.34314e-05; - if (cfgnSigmaMultCuts == twoSigma) { + if (cfgEvSelsnSigmaMultCuts == twoSigma) { fitParamHigh1 = 2350.39; fitParamHigh2 = -74.6939; fitParamHigh3 = 0.953287; fitParamHigh4 = -0.006162; fitParamHigh5 = 1.80808e-05; - } else if (cfgnSigmaMultCuts == threeSigma) { + } else if (cfgEvSelsnSigmaMultCuts == threeSigma) { fitParamHigh1 = 2610.98; fitParamHigh2 = -83.3983; fitParamHigh3 = 1.0893; @@ -556,15 +558,15 @@ struct FlowSP { fMultCutHigh->SetParameters(fitParamHigh1, fitParamHigh2, fitParamHigh3, fitParamHigh4, fitParamHigh5); - if (cfgManualEventParameters) { - fMultPVCutLow->SetParameters((cfgMultPv.value)[0], (cfgMultPv.value)[1], (cfgMultPv.value)[2], (cfgMultPv.value)[3], (cfgMultPv.value)[4]); - fMultPVCutHigh->SetParameters((cfgMultPv.value)[5], (cfgMultPv.value)[6], (cfgMultPv.value)[7], (cfgMultPv.value)[8], (cfgMultPv.value)[9]); - fMultCutLow->SetParameters((cfgMult.value)[0], (cfgMult.value)[1], (cfgMult.value)[2], (cfgMult.value)[3], (cfgMult.value)[4]); - fMultCutHigh->SetParameters((cfgMult.value)[5], (cfgMult.value)[6], (cfgMult.value)[7], (cfgMult.value)[8], (cfgMult.value)[9]); + if (cfgEvSelsManualEventParameters) { + fMultPVCutLow->SetParameters((cfgEvSelsMultPv.value)[0], (cfgEvSelsMultPv.value)[1], (cfgEvSelsMultPv.value)[2], (cfgEvSelsMultPv.value)[3], (cfgEvSelsMultPv.value)[4]); + fMultPVCutHigh->SetParameters((cfgEvSelsMultPv.value)[5], (cfgEvSelsMultPv.value)[6], (cfgEvSelsMultPv.value)[7], (cfgEvSelsMultPv.value)[8], (cfgEvSelsMultPv.value)[9]); + fMultCutLow->SetParameters((cfgEvSelsMult.value)[0], (cfgEvSelsMult.value)[1], (cfgEvSelsMult.value)[2], (cfgEvSelsMult.value)[3], (cfgEvSelsMult.value)[4]); + fMultCutHigh->SetParameters((cfgEvSelsMult.value)[5], (cfgEvSelsMult.value)[6], (cfgEvSelsMult.value)[7], (cfgEvSelsMult.value)[8], (cfgEvSelsMult.value)[9]); } } - if (cfgUseAdditionalTrackCut) { + if (cfgTrackSelsUseAdditionalTrackCut) { fPhiCutLow = new TF1("fPhiCutLow", "0.06/x+pi/18.0-0.06", 0, 100); fPhiCutHigh = new TF1("fPhiCutHigh", "0.1/x+pi/18.0+0.06", 0, 100); } @@ -596,31 +598,31 @@ struct FlowSP { int nWeights = 3; - if (cfgNUA.value.empty() == false) { - TList* listCorrections = ccdb->getForTimeStamp(cfgNUA, timestamp); + if (cfgCCDB_NUA.value.empty() == false) { + TList* listCorrections = ccdb->getForTimeStamp(cfgCCDB_NUA, timestamp); cfg.mAcceptance.push_back(reinterpret_cast(listCorrections->FindObject("weights"))); cfg.mAcceptance.push_back(reinterpret_cast(listCorrections->FindObject("weights_positive"))); cfg.mAcceptance.push_back(reinterpret_cast(listCorrections->FindObject("weights_negative"))); int sizeAcc = cfg.mAcceptance.size(); if (sizeAcc < nWeights) - LOGF(warning, "Could not load acceptance weights from %s", cfgNUA.value.c_str()); + LOGF(warning, "Could not load acceptance weights from %s", cfgCCDB_NUA.value.c_str()); else - LOGF(info, "Loaded acceptance weights from %s", cfgNUA.value.c_str()); + LOGF(info, "Loaded acceptance weights from %s", cfgCCDB_NUA.value.c_str()); } else { - LOGF(info, "cfgNUA empty! No corrections loaded"); + LOGF(info, "cfgCCDB_NUA empty! No corrections loaded"); } - if (cfgNUE.value.empty() == false) { - TList* listCorrections = ccdb->getForTimeStamp(cfgNUE, timestamp); + if (cfgCCDB_NUE.value.empty() == false) { + TList* listCorrections = ccdb->getForTimeStamp(cfgCCDB_NUE, timestamp); cfg.mEfficiency.push_back(reinterpret_cast(listCorrections->FindObject("Efficiency"))); cfg.mEfficiency.push_back(reinterpret_cast(listCorrections->FindObject("Efficiency_pos"))); cfg.mEfficiency.push_back(reinterpret_cast(listCorrections->FindObject("Efficiency_neg"))); int sizeEff = cfg.mEfficiency.size(); if (sizeEff < nWeights) - LOGF(fatal, "Could not load efficiency histogram for trigger particles from %s", cfgNUE.value.c_str()); + LOGF(fatal, "Could not load efficiency histogram for trigger particles from %s", cfgCCDB_NUE.value.c_str()); else - LOGF(info, "Loaded efficiency histogram from %s", cfgNUE.value.c_str()); + LOGF(info, "Loaded efficiency histogram from %s", cfgCCDB_NUE.value.c_str()); } else { - LOGF(info, "cfgNUE empty! No corrections loaded"); + LOGF(info, "cfgCCDB_NUE empty! No corrections loaded"); } cfg.correctionsLoaded = true; } @@ -653,15 +655,15 @@ struct FlowSP { registry.fill(HIST("hEventCount"), evSel_sel8); // Occupancy - if (cfgDoOccupancySel) { + if (cfgEvSelsDoOccupancySel) { auto occupancy = collision.trackOccupancyInTimeRange(); - if (occupancy > cfgMaxOccupancy) { + if (occupancy > cfgEvSelsMaxOccupancy) { return 0; } registry.fill(HIST("hEventCount"), evSel_occupancy); } - if (cfgTVXinTRD) { + if (cfgEvSelsTVXinTRD) { if (collision.alias_bit(kTVXinTRD)) { // TRD triggered // "CMTVX-B-NOPF-TRD,minbias_TVX" @@ -670,7 +672,7 @@ struct FlowSP { registry.fill(HIST("hEventCount"), evSel_kTVXinTRD); } - if (cfgNoSameBunchPileupCut) { + if (cfgEvSelsNoSameBunchPileupCut) { if (!collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { // rejects collisions which are associated with the same "found-by-T0" bunch crossing // https://indico.cern.ch/event/1396220/#1-event-selection-with-its-rof @@ -678,7 +680,7 @@ struct FlowSP { } registry.fill(HIST("hEventCount"), evSel_kNoSameBunchPileup); } - if (cfgIsGoodZvtxFT0vsPV) { + if (cfgEvSelsIsGoodZvtxFT0vsPV) { if (!collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { // removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference // use this cut at low multiplicities with caution @@ -686,7 +688,7 @@ struct FlowSP { } registry.fill(HIST("hEventCount"), evSel_kIsGoodZvtxFT0vsPV); } - if (cfgNoCollInTimeRangeStandard) { + if (cfgEvSelsNoCollInTimeRangeStandard) { if (!collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { // Rejection of the collisions which have other events nearby return 0; @@ -694,7 +696,7 @@ struct FlowSP { registry.fill(HIST("hEventCount"), evSel_kNoCollInTimeRangeStandard); } - if (cfgIsVertexITSTPC) { + if (cfgEvSelsIsVertexITSTPC) { if (!collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) { // selects collisions with at least one ITS-TPC track, and thus rejects vertices built from ITS-only tracks return 0; @@ -702,7 +704,7 @@ struct FlowSP { registry.fill(HIST("hEventCount"), evSel_kIsVertexITSTPC); } - if (cfgUseAdditionalEventCut) { + if (cfgEvSelsUseAdditionalEventCut) { float vtxz = -999; if (collision.numContrib() > 1) { vtxz = collision.posZ(); @@ -715,7 +717,7 @@ struct FlowSP { auto multNTracksPV = collision.multNTracksPV(); - if (vtxz > cfgVtxZ || vtxz < -cfgVtxZ) + if (vtxz > cfgEvSelsVtxZ || vtxz < -cfgEvSelsVtxZ) return 0; if (multNTracksPV < fMultPVCutLow->Eval(collision.centFT0C())) return 0; @@ -733,7 +735,7 @@ struct FlowSP { return 0; registry.fill(HIST("hEventCount"), evSel_CentCuts); - if (cfgIsGoodITSLayersAll) { + if (cfgEvSelsIsGoodITSLayersAll) { if (!collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { // New event selection bits to cut time intervals with dead ITS staves // https://indico.cern.ch/event/1493023/ (09-01-2025) @@ -748,32 +750,35 @@ struct FlowSP { template bool trackSelected(TrackObject track, const int& field) { - if (std::fabs(track.eta()) > cfgEta) + if (std::fabs(track.eta()) > cfgTrackSelsEta) return false; registry.fill(HIST("hTrackCount"), trackSel_Eta); - if (track.pt() < cfgPtmin || track.pt() > cfgPtmax) + if (track.pt() < cfgTrackSelsPtmin || track.pt() > cfgTrackSelsPtmax) return false; registry.fill(HIST("hTrackCount"), trackSel_Pt); - if (track.dcaXY() > cfgDCAxy) + if (track.dcaXY() > cfgTrackSelsDCAxy) return false; registry.fill(HIST("hTrackCount"), trackSel_DCAxy); - if (track.dcaZ() > cfgDCAz) + if (track.dcaZ() > cfgTrackSelsDCAz) + return false; + + if (cfgTrackSelsDoDCApt && std::fabs(track.dcaZ()) > (cfgTrackSelsDCApt1 * cfgTrackSelsDCApt2) / (std::pow(track.pt(), 1.1))) return false; registry.fill(HIST("hTrackCount"), trackSel_DCAz); // registry.fill(HIST("hTrackCount"), trackSel_GlobalTracks); - if (track.tpcNClsFound() < cfgNcls) + if (track.tpcNClsFound() < cfgTrackSelsNcls) return false; registry.fill(HIST("hTrackCount"), trackSel_NCls); - if (track.tpcFractionSharedCls() > cfgFshcls) + if (track.tpcFractionSharedCls() > cfgTrackSelsFshcls) return false; registry.fill(HIST("hTrackCount"), trackSel_FshCls); @@ -790,7 +795,7 @@ struct FlowSP { if (cfgFillQAHistos) registry.fill(HIST("QA/before/pt_phi"), track.pt(), phimodn); - if (cfgUseAdditionalTrackCut) { + if (cfgTrackSelsUseAdditionalTrackCut) { if (phimodn < fPhiCutHigh->Eval(track.pt()) && phimodn > fPhiCutLow->Eval(track.pt())) return false; // reject track } @@ -843,7 +848,7 @@ struct FlowSP { } template - inline void fillHistograms(TrackObject track, float wacc, float weff, double ux, double uy, double uxMH, double uyMH, double qxA, double qyA, double qxC, double qyC, double corrQQx, double corrQQy, double corrQQ, double vnA, double vnC, double vnFull, double centrality) + inline void fillHistograms(TrackObject track, float wacc, float weff, double ux, double uy, double uxMH, double uyMH, double uxMH2, double uyMH2, double qxA, double qyA, double qxC, double qyC, double corrQQx, double corrQQy, double corrQQ, double vnA, double vnC, double vnFull, double centrality) { registry.fill(HIST(Charge[ct]) + HIST("vnA_eta"), track.eta(), (uy * qyA + ux * qxA) / std::sqrt(std::fabs(corrQQ)), wacc * weff); registry.fill(HIST(Charge[ct]) + HIST("vnC_eta"), track.eta(), (uy * qyC + ux * qxC) / std::sqrt(std::fabs(corrQQ)), wacc * weff); @@ -866,6 +871,23 @@ struct FlowSP { registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUx_cent_MH"), centrality, (uxMH * qyA * qyC) / corrQQy, wacc * weff); registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUy_cent_MH"), centrality, (uyMH * qxA * qyC) / corrQQx, wacc * weff); registry.fill(HIST(Charge[ct]) + HIST("vnAyCxUy_cent_MH"), centrality, (uyMH * qyA * qxC) / corrQQy, wacc * weff); + + // -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + registry.fill(HIST(Charge[ct]) + HIST("vnAxCxUx_eta_MH"), track.eta(), (uxMH2 * qxA * qxC) / corrQQx, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUx_eta_MH"), track.eta(), (uxMH2 * qyA * qyC) / corrQQy, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUy_eta_MH"), track.eta(), (uyMH2 * qxA * qyC) / corrQQx, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnAyCxUy_eta_MH"), track.eta(), (uyMH2 * qyA * qxC) / corrQQy, wacc * weff); + + registry.fill(HIST(Charge[ct]) + HIST("vnAxCxUx_pt_MH"), track.pt(), (uxMH2 * qxA * qxC) / corrQQx, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUx_pt_MH"), track.pt(), (uxMH2 * qyA * qyC) / corrQQy, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUy_pt_MH"), track.pt(), (uyMH2 * qxA * qyC) / corrQQx, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnAyCxUy_pt_MH"), track.pt(), (uyMH2 * qyA * qxC) / corrQQy, wacc * weff); + + registry.fill(HIST(Charge[ct]) + HIST("vnAxCxUx_cent_MH"), centrality, (uxMH2 * qxA * qxC) / corrQQx, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUx_cent_MH"), centrality, (uxMH2 * qyA * qyC) / corrQQy, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUy_cent_MH"), centrality, (uyMH2 * qxA * qyC) / corrQQx, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("vnAyCxUy_cent_MH"), centrality, (uyMH2 * qyA * qxC) / corrQQy, wacc * weff); } if (cfgFillXandYterms) { @@ -937,6 +959,7 @@ struct FlowSP { registry.fill(HIST(Charge[ct]) + HIST("QA/hDCAz_pt"), track.pt(), track.dcaZ()); registry.fill(HIST(Charge[ct]) + HIST("QA/hSharedClusters_pt"), track.pt(), track.tpcFractionSharedCls()); registry.fill(HIST(Charge[ct]) + HIST("QA/hCrossedRows_pt"), track.pt(), track.tpcNClsFound()); + registry.fill(HIST(Charge[ct]) + HIST("QA/hCrossedRows_vs_SharedClusters"), track.tpcNClsFound(), track.tpcFractionSharedCls()); } template @@ -1047,9 +1070,9 @@ struct FlowSP { // Load correlations and SP resolution needed for Scalar Product and event plane methods. // Only load once! // If not loaded set to 1 - if (cfgLoadAverageQQ) { + if (cfgCCDBdir_QQ.value.empty() == false) { if (!cfg.clQQ) { - TList* hcorrList = ccdb->getForTimeStamp(cfgCCDBdir.value, bc.timestamp()); + TList* hcorrList = ccdb->getForTimeStamp(cfgCCDBdir_QQ.value, bc.timestamp()); cfg.hcorrQQ = reinterpret_cast(hcorrList->FindObject("qAqCXY")); cfg.hcorrQQx = reinterpret_cast(hcorrList->FindObject("qAqCX")); cfg.hcorrQQy = reinterpret_cast(hcorrList->FindObject("qAqCY")); @@ -1061,7 +1084,7 @@ struct FlowSP { } double evPlaneRes = 1.; - if (cfgLoadSPPlaneRes) { + if (cfgCCDBdir_SP.value.empty() == false) { if (!cfg.clEvPlaneRes) { cfg.hEvPlaneRes = ccdb->getForTimeStamp(cfgCCDBdir_SP.value, bc.timestamp()); cfg.clEvPlaneRes = true; @@ -1124,25 +1147,28 @@ struct FlowSP { auto ux = std::cos(cfgHarm * phi); auto uy = std::sin(cfgHarm * phi); - auto uxMH = std::cos(cfgHarmMixed * phi); - auto uyMH = std::sin(cfgHarmMixed * phi); + auto uxMH = std::cos(cfgHarmMixed1 * phi); + auto uyMH = std::sin(cfgHarmMixed1 * phi); + + auto uxMH2 = std::cos(cfgHarmMixed2 * phi); + auto uyMH2 = std::sin(cfgHarmMixed2 * phi); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - double vnA = std::cos(cfgHarm * (phi - psiA)) / evPlaneRes; double vnC = std::cos(cfgHarm * (phi - psiC)) / evPlaneRes; double vnFull = std::cos(cfgHarm * (phi - psiFull)) / evPlaneRes; - fillHistograms(track, wacc, weff, ux, uy, uxMH, uyMH, qxA, qyA, qxC, qyC, corrQQx, corrQQy, corrQQ, vnA, vnC, vnFull, centrality); + fillHistograms(track, wacc, weff, ux, uy, uxMH, uyMH, uxMH2, uyMH2, qxA, qyA, qxC, qyC, corrQQx, corrQQy, corrQQ, vnA, vnC, vnFull, centrality); if (cfgFillQAHistos) fillTrackQA(track, vtxz, wacc, weff); if (cfgFillChargeDependence) { if (pos) { - fillHistograms(track, waccP, weffP, ux, uy, uxMH, uyMH, qxA, qyA, qxC, qyC, corrQQx, corrQQy, corrQQ, vnA, vnC, vnFull, centrality); + fillHistograms(track, wacc, weff, ux, uy, uxMH, uyMH, uxMH2, uyMH2, qxA, qyA, qxC, qyC, corrQQx, corrQQy, corrQQ, vnA, vnC, vnFull, centrality); fillTrackQA(track, vtxz, waccP, weffP); } else { - fillHistograms(track, waccN, weffN, ux, uy, uxMH, uyMH, qxA, qyA, qxC, qyC, corrQQx, corrQQy, corrQQ, vnA, vnC, vnFull, centrality); + fillHistograms(track, wacc, weff, ux, uy, uxMH, uyMH, uxMH2, uyMH2, qxA, qyA, qxC, qyC, corrQQx, corrQQy, corrQQ, vnA, vnC, vnFull, centrality); fillTrackQA(track, vtxz, waccN, weffN); } } @@ -1213,7 +1239,7 @@ struct FlowSP { } PROCESS_SWITCH(FlowSP, processMCReco, "Process analysis for MC reconstructed events", false); - // Filter mcCollFilter = nabs(aod::mccollision::posZ) < cfgVtxZ; + // Filter mcCollFilter = nabs(aod::mccollision::posZ) < cfgEvSelsVtxZ; void processMCGen(aod::McCollisions const& mcCollisions, CCs const& collisions, TCs const& tracks, FilteredTCs const& filteredTracks, MCs const& McParts) { // LOGF(info, "Size of mccollisions: %i", mcCollisions.size()); @@ -1291,7 +1317,7 @@ struct FlowSP { registry.fill(HIST("trackMCGen/before/neg/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); } - if (particle.eta() < -cfgEta || particle.eta() > cfgEta || particle.pt() < cfgPtmin || particle.pt() > cfgPtmax) + if (particle.eta() < -cfgTrackSelsEta || particle.eta() > cfgTrackSelsEta || particle.pt() < cfgTrackSelsPtmin || particle.pt() > cfgTrackSelsPtmax) continue; fillMCPtHistos(particle, pdgCode); From 29c47d412ca05d4938b6968d16f319819405ca63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Sat, 26 Apr 2025 01:08:29 +0200 Subject: [PATCH 1108/1650] O2 linter: Fix position of per file messages (#10996) --- Scripts/o2_linter.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Scripts/o2_linter.py b/Scripts/o2_linter.py index fbc4bacc2cd..f5e8ce8c3e2 100644 --- a/Scripts/o2_linter.py +++ b/Scripts/o2_linter.py @@ -208,7 +208,7 @@ def get_tolerated_tests(path: str) -> "list[str]": if path_tests.is_file(): with path_tests.open() as content: tests = [line.strip() for line in content.readlines() if line.strip()] - print(f"{path}:0: info: Tolerating tests from {path_tests}. {tests}") + print(f"{path}:1: info: Tolerating tests from {path_tests}. {tests}") break return tests @@ -249,7 +249,7 @@ def is_disabled(self, line: str, prefix_comment="//") -> bool: def print_error(self, path: str, line: Union[int, None], message: str): """Format and print error message.""" # return # Use to suppress error messages. - line = line or 0 + line = line or 1 # terminal format print(f"{path}:{line}: {message_levels[self.severity_current]}: {message} [{self.name}]") if github_mode and not self.tolerated: # Annotate only not tolerated issues. From d67f1389150b807d894ce3bd042b252c97176ebb Mon Sep 17 00:00:00 2001 From: Zhengqing Wang Date: Sat, 26 Apr 2025 11:13:40 +0800 Subject: [PATCH 1109/1650] [PWGCF] updates on pidcme code and new PHe3 ese code (#10979) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/CMakeLists.txt | 7 +- PWGCF/Flow/Tasks/flowEsePHe3.cxx | 983 ++++++++++++++++++ .../Flow/Tasks/{pidcme.cxx => flowPidCme.cxx} | 132 ++- 3 files changed, 1074 insertions(+), 48 deletions(-) create mode 100644 PWGCF/Flow/Tasks/flowEsePHe3.cxx rename PWGCF/Flow/Tasks/{pidcme.cxx => flowPidCme.cxx} (97%) diff --git a/PWGCF/Flow/Tasks/CMakeLists.txt b/PWGCF/Flow/Tasks/CMakeLists.txt index c62480f8d79..c59895487cf 100644 --- a/PWGCF/Flow/Tasks/CMakeLists.txt +++ b/PWGCF/Flow/Tasks/CMakeLists.txt @@ -60,7 +60,7 @@ o2physics_add_dpl_workflow(flow-gfw-omega-xi COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(flow-pid-cme - SOURCES pidcme.cxx + SOURCES flowPidCme.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::GFWCore COMPONENT_NAME Analysis) @@ -78,3 +78,8 @@ o2physics_add_dpl_workflow(flow-efficiency-casc SOURCES flowEfficiencyCasc.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::GFWCore COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(flow-ese-p-he3 + SOURCES flowEsePHe3.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::GFWCore + COMPONENT_NAME Analysis) diff --git a/PWGCF/Flow/Tasks/flowEsePHe3.cxx b/PWGCF/Flow/Tasks/flowEsePHe3.cxx new file mode 100644 index 00000000000..61582f233b3 --- /dev/null +++ b/PWGCF/Flow/Tasks/flowEsePHe3.cxx @@ -0,0 +1,983 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \author ZhengqingWang(zhengqing.wang@cern.ch) +/// \file flowEsePHe3.cxx +/// \brief task to calculate the P He3 flow correlation. +// C++/ROOT includes. +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// o2Physics includes. +#include "Framework/ASoA.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/runDataProcessing.h" +#include "Framework/RunningWorkflowInfo.h" +#include "Framework/StaticFor.h" + +#include "Common/DataModel/Qvectors.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/Core/EventPlaneHelper.h" +#include "Common/Core/TrackSelection.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/PIDResponseITS.h" + +#include "CommonConstants/PhysicsConstants.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +namespace o2::aod +{ +namespace flow_ese_p_he3 +{ +DECLARE_SOA_COLUMN(NPidFlag, nPidFlag, int8_t); // unqualified -1, hadron 0, proton 1, he3 2, proton+he3 3 +} // namespace flow_ese_p_he3 +DECLARE_SOA_TABLE(PHe3ESEFlags, "AOD", "PHe3ESEFlags", flow_ese_p_he3::NPidFlag); +} // namespace o2::aod + +namespace pid_flags +{ +// constexpr int8_t kUnqualified = -1; +// constexpr int8_t kUnPOIHadron = 0; +constexpr int8_t kProton = 1; +constexpr int8_t kHe3 = 2; +constexpr int8_t kProtonHe3 = 3; +} // namespace pid_flags + +namespace event_selection +{ +constexpr int kFT0AV0ASigma = 5; +} + +namespace fourier_mode +{ +// constexpr int kMode1 = 1; +constexpr int kMode2 = 2; +// constexpr int kMode3 = 3; +} // namespace fourier_mode + +using TracksPID = soa::Join; +struct FillPIDcolums { + + HistogramRegistry histosQA{"histosQAPID", {}, OutputObjHandlingPolicy::AnalysisObject}; + + Configurable cfgMinPtPID{"cfgMinPtPID", 0.15, "Minimum track #P_{t} for PID"}; + Configurable cfgMaxPtPID{"cfgMaxPtPID", 99.9, "Maximum track #P_{t} for PID"}; + Configurable cfgMaxEtaPID{"cfgMaxEtaPID", 0.8, "Maximum track #eta for PID"}; + Configurable cfgMinTPCChi2NCl{"cfgMinTPCChi2NCl", 0, "Minimum chi2 per cluster TPC for PID if not use costom track cuts"}; + Configurable cfgMinChi2NClITS{"cfgMinChi2NClITS", 0, "Minimum chi2 per cluster ITS for PID if not use costom track cuts"}; + Configurable cfgMaxTPCChi2NCl{"cfgMaxTPCChi2NCl", 4, "Maximum chi2 per cluster TPC for PID if not use costom track cuts"}; + Configurable cfgMaxChi2NClITS{"cfgMaxChi2NClITS", 36, "Maximum chi2 per cluster ITS for PID if not use costom track cuts"}; + Configurable cfgMinTPCCls{"cfgMinTPCCls", 70, "Minimum TPC clusters for PID if not use costom track cuts"}; + Configurable cfgMinITSCls{"cfgMinITSCls", 1, "Minimum ITS clusters for PID if not use costom track cuts"}; + Configurable cfgMaxTPCCls{"cfgMaxTPCCls", 999, "Max TPC clusters for PID if not use costom track cuts"}; + Configurable cfgMaxITSCls{"cfgMaxITSCls", 999, "Max ITS clusters for PID if not use costom track cuts"}; + Configurable cfgMaxDCAxy{"cfgMaxDCAxy", 99, "Maxium DCAxy for standard PID tracking"}; + Configurable cfgMaxDCAz{"cfgMaxDCAz", 2, "Maxium DCAz for standard PID tracking"}; + Configurable cfgPtMaxforTPCOnlyPIDPrton{"cfgPtMaxforTPCOnlyPIDPrton", 0.4, "Maxmium track pt for TPC only PID, at RMS PID mode for proton"}; + Configurable cfgPtMaxforTPCOnlyPIDHe3{"cfgPtMaxforTPCOnlyPIDHe3", 0.5, "Maxmium track pt for TPC only PID, at RMS PID mode for he3"}; + + Configurable cfgProtonPIDMode{"cfgProtonPIDMode", 2, "Proton PID mode: 0 for TPC + RMS(TPC,TOF), 1 for TPC only, 2 for TOF only"}; + Configurable cfgHe3PIDMode{"cfgHe3PIDMode", 1, "He3 PID mode: 0 for TPC + RMS(TPC,TOF), 1 for TPC only, 2 for TOF only"}; + + Configurable cfgOpenpassedITSNCls{"cfgOpenpassedITSNCls", false, "useTrackSelectionTables passedITSNCls for basic track selection"}; + Configurable cfgOpenpassedITSChi2NDF{"cfgOpenpassedITSChi2NDF", false, "useTrackSelectionTables passedITSChi2NDF for basic track selection"}; + Configurable cfgOpenpassedITSHits{"cfgOpenpassedITSHits", false, "useTrackSelectionTables passedITSHits for basic track selection"}; + Configurable cfgOpenpassedTPCChi2NDF{"cfgOpenpassedTPCChi2NDF", false, "useTrackSelectionTables passedTPCChi2NDF for basic track selection"}; + Configurable cfgOpenpassedTPCCrossedRowsOverNCls{"cfgOpenpassedTPCCrossedRowsOverNCls", false, "useTrackSelectionTables passedTPCCrossedRowsOverNCls for basic track selection"}; + Configurable cfgOpenpassedDCAxy{"cfgOpenpassedDCAxy", false, "useTrackSelectionTables passedDCAxy for basic track selection"}; + Configurable cfgOpenpassedDCAz{"cfgOpenpassedDCAz", false, "useTrackSelectionTables passedDCAz for basic track selection"}; + + Configurable cfgQuietMode{"cfgQuietMode", false, "open quiet mode for saving cpu cost and only do some basic QA plots"}; + Configurable cfgOpenPIDITSProton{"cfgOpenPIDITSProton", true, "open ITS assistance cut for proton PID"}; + Configurable cfgOpenPIDITSHe3{"cfgOpenPIDITSHe3", false, "open ITS assistance cut for He3 PID"}; + Configurable cfgOpenPIDByPtProtonMain{"cfgOpenPIDByPtProtonMain", false, "Selection Proton by pt its pt binnings for main selection"}; + Configurable cfgOpenPIDByPtHe3Main{"cfgOpenPIDByPtHe3Main", false, "Selection He3 by pt its pt binnings for main selection"}; + Configurable cfgOpenPIDByPtProtonITS{"cfgOpenPIDByPtProtonITS", false, "Selection Proton by pt its pt binnings for ITS selection"}; + Configurable cfgOpenPIDByPtHe3ITS{"cfgOpenPIDByPtHe3ITS", false, "Selection He3 by pt its pt binnings for ITS selection"}; + Configurable cfgOpenHe3ITSPtCut{"cfgOpenHe3ITSPtCut", true, "Do He3 ITS contamination cut"}; + Configurable cfgOpenAllowCrossTrack{"cfgOpenAllowCrossTrack", false, "Allow one track to be identified as different kind of PID particles"}; + + Configurable cfgOpenPlotnSigmaTOFITSPt{"cfgOpenPlotnSigmaTOFITSPt", true, "plot nSigmaTOF vs nSigmaITS vs Pt"}; + Configurable cfgOpenPlotnSigmaITSTPCPt{"cfgOpenPlotnSigmaITSTPCPt", true, "plot nSigmaITS vs nSigmaTOF vs Pt"}; + Configurable cfgOpenPlotnSigmaTOFTPCPt{"cfgOpenPlotnSigmaTOFTPCPt", true, "plot nSigmaTOF vs nSigmaTPC vs Pt"}; + + Configurable> cfgPtCutProton{"cfgPtCutProton", {0.15, 99.}, "Pt limit for Proton"}; + Configurable> cfgPtCutHe3{"cfgPtCutHe3", {0.15, 99.}, "Pt limit for He3"}; + Configurable> cfgnSigmaCutTPCProton{"cfgnSigmaCutTPCProton", {-3, 3}, "TPC nsigma cut limit for Proton"}; + Configurable> cfgnSigmaCutTPCHe3{"cfgnSigmaCutTPCHe3", {-2, 2}, "TPC nsigma cut limit for He3"}; + Configurable> cfgnSigmaCutTOFProton{"cfgnSigmaCutTOFProton", {-1.5, 1.5}, "TOF nsigma cut limit for Proton"}; + Configurable> cfgnSigmaCutTOFHe3{"cfgnSigmaCutTOFHe3", {-1.5, 1.5}, "TOF nsigma cut limit for He3"}; + Configurable> cfgnSigmaCutITSProton{"cfgnSigmaCutITSProton", {-3, 3}, "ITS nsigma cut limit for Proton"}; + Configurable> cfgnSigmaCutITSHe3{"cfgnSigmaCutITSHe3", {-3, 3}, "ITS nsigma cut limit for He3"}; + Configurable> cfgnSigmaCutRMSProton{"cfgnSigmaCutRMSProton", {-3, 3}, "RMS nsigma cut limit for Proton"}; + Configurable> cfgnSigmaCutRMSHe3{"cfgnSigmaCutRMSHe3", {-3, 3}, "RMS nsigma cut limit for He3"}; + + Configurable> cfgPtBinProtonPID{"cfgPtBinProtonPID", {0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 3.0, 3.5, 4.0, 5.0, 6.0}, "pt bin for pion PIDnsigma"}; + Configurable> cfgPtBinHe3PID{"cfgPtBinHe3PID", {2, 2.2, 2.4, 2.6, 2.8, 3, 3.2, 3.6, 4, 4.4, 4.8, 5.2, 5.6, 6, 6.4, 7.2, 8, 10}, "pt bin for pion PIDnsigma"}; + + Configurable> cfgnSigmaTPCProtonPtUpper{"cfgnSigmaTPCProtonPtUpper", {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, "nSigmaTPC cut upper limit anchored to proton pt bins"}; + Configurable> cfgnSigmaTOFProtonPtUpper{"cfgnSigmaTOFProtonPtUpper", {1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5}, "nSigmaTOF cut upper limit anchored to proton pt bins"}; + Configurable> cfgnSigmaITSProtonPtUpper{"cfgnSigmaITSProtonPtUpper", {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, "nSigmaITS cut upper limit anchored to proton pt bins"}; + Configurable> cfgnSigmaRMSProtonPtUpper{"cfgnSigmaRMSProtonPtUpper", {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, "nSigmaRMS cut upper limit anchored to proton pt bins"}; + Configurable> cfgnSigmaTPCProtonPtLower{"cfgnSigmaTPCProtonPtLower", {-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3}, "nSigmaTPC cut lower limit anchored to proton pt bins"}; + Configurable> cfgnSigmaTOFProtonPtLower{"cfgnSigmaTOFProtonPtLower", {-1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5}, "nSigmaTOF cut lower limit anchored to proton pt bins"}; + Configurable> cfgnSigmaITSProtonPtLower{"cfgnSigmaITSProtonPtLower", {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2}, "nSigmaITS cut lower limit anchored to proton pt bins"}; + Configurable> cfgnSigmaRMSProtonPtLower{"cfgnSigmaRMSProtonPtLower", {-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3}, "nSigmaRMS cut lower limit anchored to proton pt bins"}; + Configurable> cfgnSigmaTPCHe3PtUpper{"cfgnSigmaTPCHe3PtUpper", {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, "nSigmaTPC cut upper limit anchored to He3 pt bins"}; + Configurable> cfgnSigmaTOFHe3PtUpper{"cfgnSigmaTOFHe3PtUpper", {1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5}, "nSigmaTOF cut upper limit anchored to He3 pt bins"}; + Configurable> cfgnSigmaITSHe3PtUpper{"cfgnSigmaITSHe3PtUpper", {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, "nSigmaITS cut upper limit anchored to He3 pt bins"}; + Configurable> cfgnSigmaRMSHe3PtUpper{"cfgnSigmaRMSHe3PtUpper", {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, "nSigmaRMS cut upper limit anchored to He3 pt bins"}; + Configurable> cfgnSigmaTPCHe3PtLower{"cfgnSigmaTPCHe3PtLower", {-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3}, "nSigmaTPC cut lower limit anchored to He3 pt bins"}; + Configurable> cfgnSigmaTOFHe3PtLower{"cfgnSigmaTOFHe3PtLower", {-1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5}, "nSigmaTOF cut lower limit anchored to He3 pt bins"}; + Configurable> cfgnSigmaITSHe3PtLower{"cfgnSigmaITSHe3PtLower", {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2}, "nSigmaITS cut lower limit anchored to He3 pt bins"}; + Configurable> cfgnSigmaRMSHe3PtLower{"cfgnSigmaRMSHe3PtLower", {-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3}, "nSigmaRMS cut lower limit anchored to He3 pt bins"}; + + ConfigurableAxis cfgrigidityBins{"cfgrigidityBins", {200, -10.f, 10.f}, "Binning for rigidity #it{p}^{TPC}/#it{z}"}; + ConfigurableAxis cfgdedxBins{"cfgdedxBins", {1000, 0.f, 1000.f}, "Binning for dE/dx"}; + ConfigurableAxis cfgnSigmaBinsTPC{"cfgnSigmaBinsTPC", {200, -5.f, 5.f}, "Binning for n sigma TPC"}; + ConfigurableAxis cfgnSigmaBinsTOF{"cfgnSigmaBinsTOF", {200, -5.f, 5.f}, "Binning for n sigma TOF"}; + ConfigurableAxis cfgnSigmaBinsITS{"cfgnSigmaBinsITS", {200, -5.f, 5.f}, "Binning for n sigma ITS"}; + ConfigurableAxis cfgnSigmaBinsRMS{"cfgnSigmaBinsRMS", {100, 0.f, 10.f}, "Combination Binning for TPC&TOF nsigma"}; + ConfigurableAxis cfgaxisptPID{"cfgaxisptPID", {120, 0, 12}, "Binning for P_{t} PID"}; + ConfigurableAxis cfgaxispPID{"cfgaxispPID", {50, 0, 5}, "Binning for P PID"}; + ConfigurableAxis cfgaxisetaPID{"cfgaxisetaPID", {90, -0.9, 0.9}, "Binning for Pt QA"}; + ConfigurableAxis cfgaxisDCAz{"cfgaxisDCAz", {200, -1, 1}, "Binning for DCAz"}; + ConfigurableAxis cfgaxisDCAxy{"cfgaxisDCAxy", {100, -0.5, 0.5}, "Binning for DCAxy"}; + ConfigurableAxis cfgaxisChi2Ncls{"cfgaxisChi2Ncls", {100, 0, 100}, "Binning for Chi2Ncls TPC/ITS"}; + + // Function for He3 TPC-ITS mismatching cuts referd to by chiara's slides + TF1* fNSigmaITSPt = nullptr; + + template + bool trackSelBasic(const TrackType track) + { + if ((track.pt() < cfgMinPtPID) || (track.pt() > cfgMaxPtPID)) + return false; + if (std::abs(track.eta()) > cfgMaxEtaPID) + return false; + if (cfgOpenpassedITSNCls) { + if (!track.passedITSNCls()) + return false; + } else { + if (track.itsNCls() < cfgMinITSCls || track.itsNCls() > cfgMaxITSCls) + return false; + } + if (cfgOpenpassedITSChi2NDF) { + if (!track.passedITSChi2NDF()) + return false; + } else { + if (track.itsChi2NCl() < cfgMinChi2NClITS || track.itsChi2NCl() > cfgMaxChi2NClITS) + return false; + } + if (cfgOpenpassedITSHits) { + if (!track.passedITSHits()) + return false; + } + if (cfgOpenpassedTPCChi2NDF) { + if (!track.passedTPCChi2NDF()) + return false; + } else { + if (track.tpcChi2NCl() < cfgMinTPCChi2NCl || track.tpcChi2NCl() > cfgMaxTPCChi2NCl) + return false; + } + if (cfgOpenpassedTPCCrossedRowsOverNCls) { + if (!track.passedTPCCrossedRowsOverNCls()) + return false; + } + if (cfgOpenpassedDCAxy) { + if (!track.passedDCAxy()) + return false; + } else { + if (std::abs(track.dcaXY()) > cfgMaxDCAxy) + return false; + } + if (cfgOpenpassedDCAz) { + if (!track.passedDCAz()) + return false; + } else { + if (std::abs(track.dcaZ()) > cfgMaxDCAz) + return false; + } + if (track.tpcNClsFound() < cfgMinTPCCls || track.tpcNClsFound() > cfgMaxTPCCls) + return false; + return true; + } + + template + bool pidProtonSel(const TrackType track, float nSigmaLower, float nSigmaUpper) + { // proton == 1 , He3 == 2 + if (track.pt() < cfgPtCutProton.value[0] || track.pt() > cfgPtCutProton.value[1]) + return false; + float nSigmaUse = -999; + switch (cfgProtonPIDMode) { + case 0: // RMS + nSigmaUse = (track.pt() > cfgPtMaxforTPCOnlyPIDPrton) ? std::hypot(track.tpcNSigmaPr(), track.tofNSigmaPr()) : track.tpcNSigmaPr(); + break; + case 1: // TPC only + nSigmaUse = track.tpcNSigmaPr(); + break; + case 2: // TOF only + nSigmaUse = track.tofNSigmaPr(); + break; + } + if (nSigmaUse < nSigmaLower || nSigmaUse > nSigmaUpper) { + return false; + } else { + return true; + } + } + + template + bool pidHe3Sel(const TrackType track, float nSigmaLower, float nSigmaUpper) + { // proton == 1 , He3 == 2 + if (track.pt() < cfgPtCutHe3.value[0] || track.pt() > cfgPtCutHe3.value[1]) + return false; + float nSigmaUse = -999; + switch (cfgHe3PIDMode) { + case 0: // RMS + nSigmaUse = (track.pt() > cfgPtMaxforTPCOnlyPIDHe3) ? std::hypot(track.tpcNSigmaHe(), track.tofNSigmaHe()) : track.tpcNSigmaHe(); + break; + case 1: // TPC only + nSigmaUse = track.tpcNSigmaHe(); + break; + case 2: // TOF only + nSigmaUse = track.tofNSigmaHe(); + break; + } + if (nSigmaUse < nSigmaLower || nSigmaUse > nSigmaUpper) { + return false; + } else { + return true; + } + } + + template + int crossTrackID(const TrackType track) + { + if (track.tpcNSigmaPr() < track.tpcNSigmaHe()) { + return 0; + } else { + return 1; + } + } + + void init(InitContext const&) + { + if (cfgOpenHe3ITSPtCut) { + fNSigmaITSPt = new TF1("fNSigmaITSPt", "[0]/pow(x,0.5) - [2]", 0.02, 1000); + fNSigmaITSPt->SetParameters(4.6, 0.5, 4.5); + } + AxisSpec axisITSNcls = {10, -1.5, 8.5, "ITSNcls"}; + AxisSpec axisTPCNcls = {160, 0, 160, "TPCNcls"}; + if (!cfgQuietMode) { + histosQA.add("QA/hist_dEdxTPC_All", ";#it{p}^{TPC}/#it{z} (GeV/c);d#it{E}/d#it{x}", {HistType::kTH2F, {cfgrigidityBins, cfgdedxBins}}); + histosQA.add("QA/Proton/hist_dEdxTPC_Pr", ";#it{p}^{TPC}/#it{z} (GeV/c);d#it{E}/d#it{x}", {HistType::kTH2F, {cfgrigidityBins, cfgdedxBins}}); + histosQA.add("QA/He3/hist_dEdxTPC_He3", ";#it{p}^{TPC}/#it{z} (GeV/c);d#it{E}/d#it{x}", {HistType::kTH2F, {cfgrigidityBins, cfgdedxBins}}); + histosQA.add("QA/hist_pt_All", ";#it{p}_{T};counts", {HistType::kTH1F, {cfgaxisptPID}}); + histosQA.add("QA/Proton/hist_pt_Pr", ";#it{p}_{T};counts", {HistType::kTH1F, {cfgaxisptPID}}); + histosQA.add("QA/He3/hist_pt_He3", ";#it{p}_{T};counts", {HistType::kTH1F, {cfgaxisptPID}}); + histosQA.add("QA/hist_eta_All", ";#it{#eta};counts", {HistType::kTH1F, {cfgaxisetaPID}}); + histosQA.add("QA/Proton/hist_eta_Pr", ";#it{#eta};counts", {HistType::kTH1F, {cfgaxisetaPID}}); + histosQA.add("QA/He3/hist_eta_He3", ";#it{#eta};counts", {HistType::kTH1F, {cfgaxisetaPID}}); + histosQA.add("QA/hist_ITSNcls_All", ";ITSNcls;counts", {HistType::kTH1F, {axisITSNcls}}); + histosQA.add("QA/Proton/hist_ITSNcls_Pr", ";ITSNcls;counts", {HistType::kTH1F, {axisITSNcls}}); + histosQA.add("QA/He3/hist_ITSNcls_He3", ";ITSNcls;counts", {HistType::kTH1F, {axisITSNcls}}); + histosQA.add("QA/hist_TPCNcls_All", ";TPCNcls;counts", {HistType::kTH1F, {axisTPCNcls}}); + histosQA.add("QA/Proton/hist_TPCNcls_Pr", ";TPCNcls;counts", {HistType::kTH1F, {axisTPCNcls}}); + histosQA.add("QA/He3/hist_TPCNcls_He3", ";TPCNcls;counts", {HistType::kTH1F, {axisTPCNcls}}); + histosQA.add("QA/hist_ITSChi2NDF_All", ";ITS#it{#chi^{2}}/NDF;counts", {HistType::kTH1F, {cfgaxisChi2Ncls}}); + histosQA.add("QA/Proton/hist_ITSChi2NDF_Pr", ";ITS#it{#chi^{2}}/NDF;counts", {HistType::kTH1F, {cfgaxisChi2Ncls}}); + histosQA.add("QA/He3/hist_ITSChi2NDF_He3", ";ITS#it{#chi^{2}}/NDF;counts", {HistType::kTH1F, {cfgaxisChi2Ncls}}); + histosQA.add("QA/hist_TPCChi2NDF_All", ";TPC#it{#chi^{2}}/NDF;counts", {HistType::kTH1F, {cfgaxisChi2Ncls}}); + histosQA.add("QA/Proton/hist_TPCChi2NDF_Pr", ";TPC#it{#chi^{2}}/NDF;counts", {HistType::kTH1F, {cfgaxisChi2Ncls}}); + histosQA.add("QA/He3/hist_TPCChi2NDF_He3", ";TPC#it{#chi^{2}}/NDF;counts", {HistType::kTH1F, {cfgaxisChi2Ncls}}); + histosQA.add("QA/hist_DCAxy_All", ";#it{DCA_{xy}};counts", {HistType::kTH1F, {cfgaxisDCAxy}}); + histosQA.add("QA/Proton/hist_DCAxy_Pr", ";#it{DCA_{xy}};counts", {HistType::kTH1F, {cfgaxisDCAxy}}); + histosQA.add("QA/He3/hist_DCAxy_He3", ";#it{DCA_{xy}};counts", {HistType::kTH1F, {cfgaxisDCAxy}}); + histosQA.add("QA/hist_DCAz_All", ";#it{DCA_{xy}};counts", {HistType::kTH1F, {cfgaxisDCAz}}); + histosQA.add("QA/Proton/hist_DCAz_Pr", ";#it{DCA_{xy}};counts", {HistType::kTH1F, {cfgaxisDCAz}}); + histosQA.add("QA/He3/hist_DCAz_He3", ";#it{DCA_{xy}};counts", {HistType::kTH1F, {cfgaxisDCAz}}); + histosQA.add("QA/Proton/hist_nSigmaTPC_Pr", ";n_{#sigma}TPC", {HistType::kTH1F, {cfgnSigmaBinsTPC}}); + histosQA.add("QA/Proton/hist_nSigmaTPCPt_Pr", ";#it{p}_{T};n_{#sigma}TPC", {HistType::kTH2F, {cfgaxisptPID, cfgnSigmaBinsTPC}}); + histosQA.add("QA/Proton/hist_nSigmaTOF_Pr", ";n_{#sigma}TOF", {HistType::kTH1F, {cfgnSigmaBinsTOF}}); + histosQA.add("QA/Proton/hist_nSigmaTOFPt_Pr", ";#it{p}_{T};n_{#sigma}TOF", {HistType::kTH2F, {cfgaxisptPID, cfgnSigmaBinsTOF}}); + histosQA.add("QA/Proton/hist_nSigmaITS_Pr", ";n_{#sigma}ITS", {HistType::kTH1F, {cfgnSigmaBinsITS}}); + histosQA.add("QA/Proton/hist_nSigmaITSPt_Pr", ";#it{p}_{T};n_{#sigma}ITS", {HistType::kTH2F, {cfgaxisptPID, cfgnSigmaBinsITS}}); + histosQA.add("QA/Proton/hist_nSigmaRMS_Pr", ";n_{#sigma}RMS", {HistType::kTH1F, {cfgnSigmaBinsRMS}}); + histosQA.add("QA/Proton/hist_nSigmaRMSPt_Pr", ";#it{p}_{T};n_{#sigma}RMS", {HistType::kTH2F, {cfgaxisptPID, cfgnSigmaBinsRMS}}); + histosQA.add("QA/He3/hist_nSigmaTPC_He3", ";n_{#sigma}TPC", {HistType::kTH1F, {cfgnSigmaBinsTPC}}); + histosQA.add("QA/He3/hist_nSigmaTPCPt_He3", ";#it{p}_{T};n_{#sigma}TPC", {HistType::kTH2F, {cfgaxisptPID, cfgnSigmaBinsTPC}}); + histosQA.add("QA/He3/hist_nSigmaTOF_He3", ";n_{#sigma}TOF", {HistType::kTH1F, {cfgnSigmaBinsTOF}}); + histosQA.add("QA/He3/hist_nSigmaTOFPt_He3", ";#it{p}_{T};n_{#sigma}TOF", {HistType::kTH2F, {cfgaxisptPID, cfgnSigmaBinsTOF}}); + histosQA.add("QA/He3/hist_nSigmaITS_He3", ";n_{#sigma}ITS", {HistType::kTH1F, {cfgnSigmaBinsITS}}); + histosQA.add("QA/He3/hist_nSigmaITSPt_He3", ";#it{p}_{T};n_{#sigma}ITS", {HistType::kTH2F, {cfgaxisptPID, cfgnSigmaBinsITS}}); + histosQA.add("QA/He3/hist_nSigmaRMS_He3", ";n_{#sigma}RMS", {HistType::kTH1F, {cfgnSigmaBinsRMS}}); + histosQA.add("QA/He3/hist_nSigmaRMSPt_He3", ";#it{p}_{T};n_{#sigma}RMS", {HistType::kTH2F, {cfgaxisptPID, cfgnSigmaBinsRMS}}); + if (cfgOpenHe3ITSPtCut) { + histosQA.add("QA/He3/hist_nSigmaITSPt_He3_unCuted", ";#it{p}_{T};n_{#sigma}ITS", {HistType::kTH2F, {cfgaxisptPID, cfgnSigmaBinsITS}}); + } + if (cfgOpenPlotnSigmaTOFITSPt) { + histosQA.add("QA/Proton/hist_nSigmaTOFITSPt_Pr", ";n_{#sigma}TOF;n_{#sigma}ITS;#it{p}_{T}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsITS, cfgaxisptPID}}); + histosQA.add("QA/He3/hist_nSigmaTOFITSPt_He3", ";n_{#sigma}TOF;n_{#sigma}ITS;#it{p}_{T}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsITS, cfgaxisptPID}}); + } + if (cfgOpenPlotnSigmaITSTPCPt) { + histosQA.add("QA/Proton/hist_nSigmaITSTPCPt_Pr", ";n_{#sigma}ITS;n_{#sigma}TPC;#it{p}_{T}", {HistType::kTH3F, {cfgnSigmaBinsITS, cfgnSigmaBinsTPC, cfgaxisptPID}}); + histosQA.add("QA/He3/hist_nSigmaITSTPCPt_He3", ";n_{#sigma}ITS;n_{#sigma}TPC;#it{p}_{T}", {HistType::kTH3F, {cfgnSigmaBinsITS, cfgnSigmaBinsTPC, cfgaxisptPID}}); + } + if (cfgOpenPlotnSigmaTOFTPCPt) { + histosQA.add("QA/Proton/hist_nSigmaTOFTPCPt_Pr", ";n_{#sigma}TOF;n_{#sigma}TPC;#it{p}_{T}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsTPC, cfgaxisptPID}}); + histosQA.add("QA/He3/hist_nSigmaTOFTPCPt_He3", ";n_{#sigma}TOF;n_{#sigma}TPC;#it{p}_{T}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsTPC, cfgaxisptPID}}); + } + } + } + Produces pidEsePHe3Table; + void process(TracksPID const& tracks) + { + auto tracksWithITSPid = soa::Attach(tracks); + int8_t pidFlag; + for (const auto& track : tracksWithITSPid) { + histosQA.fill(HIST("QA/hist_dEdxTPC_All"), track.sign() * track.tpcInnerParam(), track.tpcSignal()); + histosQA.fill(HIST("QA/hist_pt_All"), track.pt()); + histosQA.fill(HIST("QA/hist_eta_All"), track.eta()); + histosQA.fill(HIST("QA/hist_ITSNcls_All"), track.itsNCls()); + histosQA.fill(HIST("QA/hist_TPCNcls_All"), track.tpcNClsFound()); + histosQA.fill(HIST("QA/hist_ITSChi2NDF_All"), track.itsChi2NCl()); + histosQA.fill(HIST("QA/hist_TPCChi2NDF_All"), track.tpcChi2NCl()); + histosQA.fill(HIST("QA/hist_DCAxy_All"), track.dcaXY()); + histosQA.fill(HIST("QA/hist_DCAz_All"), track.dcaZ()); + if (!trackSelBasic(track)) { + pidFlag = -1; + } else { + int currentPtBinPr = -1, currentPtBinHe3 = -1; + if (cfgOpenPIDByPtProtonMain || (cfgOpenPIDByPtProtonITS && cfgOpenPIDITSProton)) { + for (int i = 0; i < static_cast(cfgPtBinProtonPID.value.size()) - 1; ++i) { + if (track.pt() >= cfgPtBinProtonPID.value[i] && track.pt() < cfgPtBinProtonPID.value[i + 1]) { + currentPtBinPr = i; + break; + } + } + } + if (cfgOpenPIDByPtHe3Main || (cfgOpenPIDByPtHe3ITS && cfgOpenPIDITSHe3)) { + for (int i = 0; i < static_cast(cfgPtBinHe3PID.value.size()) - 1; ++i) { + if (track.pt() >= cfgPtBinHe3PID.value[i] && track.pt() < cfgPtBinHe3PID.value[i + 1]) { + currentPtBinHe3 = i; + break; + } + } + } + float nSigmaTPCCutPrPtLower = (currentPtBinPr == -1) ? cfgnSigmaCutTPCProton.value[0] : cfgnSigmaTPCProtonPtLower.value[currentPtBinPr]; + float nSigmaTPCCutPrPtUpper = (currentPtBinPr == -1) ? cfgnSigmaCutTPCProton.value[1] : cfgnSigmaTPCProtonPtUpper.value[currentPtBinPr]; + float nSigmaTOFCutPrPtLower = (currentPtBinPr == -1) ? cfgnSigmaCutTOFProton.value[0] : cfgnSigmaTOFProtonPtLower.value[currentPtBinPr]; + float nSigmaTOFCutPrPtUpper = (currentPtBinPr == -1) ? cfgnSigmaCutTOFProton.value[1] : cfgnSigmaTOFProtonPtUpper.value[currentPtBinPr]; + float nSigmaRMSCutPrPtLower = (currentPtBinPr == -1) ? cfgnSigmaCutRMSProton.value[0] : cfgnSigmaRMSProtonPtLower.value[currentPtBinPr]; + float nSigmaRMSCutPrPtUpper = (currentPtBinPr == -1) ? cfgnSigmaCutRMSProton.value[1] : cfgnSigmaRMSProtonPtUpper.value[currentPtBinPr]; + float nSigmaITSCutPrPtLower = (currentPtBinPr == -1) ? cfgnSigmaCutITSProton.value[0] : cfgnSigmaITSProtonPtLower.value[currentPtBinPr]; + float nSigmaITSCutPrPtUpper = (currentPtBinPr == -1) ? cfgnSigmaCutITSProton.value[1] : cfgnSigmaITSProtonPtUpper.value[currentPtBinPr]; + float nSigmaTPCCutHe3PtLower = (currentPtBinHe3 == -1) ? cfgnSigmaCutTPCHe3.value[0] : cfgnSigmaTPCHe3PtLower.value[currentPtBinHe3]; + float nSigmaTPCCutHe3PtUpper = (currentPtBinHe3 == -1) ? cfgnSigmaCutTPCHe3.value[1] : cfgnSigmaTPCHe3PtUpper.value[currentPtBinHe3]; + float nSigmaTOFCutHe3PtLower = (currentPtBinHe3 == -1) ? cfgnSigmaCutTOFHe3.value[0] : cfgnSigmaTOFHe3PtLower.value[currentPtBinHe3]; + float nSigmaTOFCutHe3PtUpper = (currentPtBinHe3 == -1) ? cfgnSigmaCutTOFHe3.value[1] : cfgnSigmaTOFHe3PtUpper.value[currentPtBinHe3]; + float nSigmaRMSCutHe3PtLower = (currentPtBinHe3 == -1) ? cfgnSigmaCutRMSHe3.value[0] : cfgnSigmaRMSHe3PtLower.value[currentPtBinHe3]; + float nSigmaRMSCutHe3PtUpper = (currentPtBinHe3 == -1) ? cfgnSigmaCutRMSHe3.value[1] : cfgnSigmaRMSHe3PtUpper.value[currentPtBinHe3]; + float nSigmaITSCutHe3PtLower = (currentPtBinHe3 == -1) ? cfgnSigmaCutITSHe3.value[0] : cfgnSigmaITSHe3PtLower.value[currentPtBinHe3]; + float nSigmaITSCutHe3PtUpper = (currentPtBinHe3 == -1) ? cfgnSigmaCutITSHe3.value[1] : cfgnSigmaITSHe3PtUpper.value[currentPtBinHe3]; + float nSigmaMainLowerPr = -999, nSigmaMainUpperPr = -999; + float nSigmaMainLowerHe3 = -999, nSigmaMainUpperHe3 = -999; + switch (cfgProtonPIDMode) { + case 0: + nSigmaMainLowerPr = nSigmaRMSCutPrPtLower; + nSigmaMainUpperPr = nSigmaRMSCutPrPtUpper; + break; + case 1: + nSigmaMainLowerPr = nSigmaTPCCutPrPtLower; + nSigmaMainUpperPr = nSigmaTPCCutPrPtUpper; + break; + case 2: + nSigmaMainLowerPr = nSigmaTOFCutPrPtLower; + nSigmaMainUpperPr = nSigmaTOFCutPrPtUpper; + break; + } + switch (cfgHe3PIDMode) { + case 0: + nSigmaMainLowerHe3 = nSigmaRMSCutHe3PtLower; + nSigmaMainUpperHe3 = nSigmaRMSCutHe3PtUpper; + break; + case 1: + nSigmaMainLowerHe3 = nSigmaTPCCutHe3PtLower; + nSigmaMainUpperHe3 = nSigmaTPCCutHe3PtUpper; + break; + case 2: + nSigmaMainLowerHe3 = nSigmaTOFCutHe3PtLower; + nSigmaMainUpperHe3 = nSigmaTOFCutHe3PtUpper; + break; + } + bool kIsPr = false, kIsHe3 = false; + // Identify Proton + if (pidProtonSel(track, nSigmaMainLowerPr, nSigmaMainUpperPr)) { + kIsPr = true; + if (cfgOpenPIDITSProton) { + if (track.itsNSigmaPr() < nSigmaITSCutPrPtLower || track.itsNSigmaPr() > nSigmaITSCutPrPtUpper) { + kIsPr = false; + } + } + } + // Identify He3 + if (pidHe3Sel(track, nSigmaMainLowerHe3, nSigmaMainUpperHe3)) { + kIsHe3 = true; + if (cfgOpenPIDITSHe3) { + if (track.itsNSigmaHe() < nSigmaITSCutHe3PtLower || track.itsNSigmaHe() > nSigmaITSCutHe3PtUpper) { + kIsHe3 = false; + } + } + } + // Cross track rejection + if (!cfgOpenAllowCrossTrack) { + if (kIsPr && kIsHe3) { + switch (crossTrackID(track)) { + case 0: + kIsPr = true; + kIsHe3 = false; + break; + case 1: + kIsPr = false; + kIsHe3 = true; + break; + } + } + } + // Filter He3 contaimination + if (cfgOpenHe3ITSPtCut && kIsHe3) { + if (!cfgQuietMode) { + histosQA.fill(HIST("QA/He3/hist_nSigmaITSPt_He3_unCuted"), track.pt(), track.itsNSigmaHe()); + } + if (track.itsNSigmaHe() < fNSigmaITSPt->Eval(track.pt())) { + kIsHe3 = false; + } + } + pidFlag = (kIsHe3 << 1) | kIsPr; + // Fill QA histograms + if (!cfgQuietMode) { + if (kIsPr) { + histosQA.fill(HIST("QA/Proton/hist_dEdxTPC_Pr"), track.sign() * track.tpcInnerParam(), track.tpcSignal()); + histosQA.fill(HIST("QA/Proton/hist_pt_Pr"), track.pt()); + histosQA.fill(HIST("QA/Proton/hist_eta_Pr"), track.eta()); + histosQA.fill(HIST("QA/Proton/hist_ITSNcls_Pr"), track.itsNCls()); + histosQA.fill(HIST("QA/Proton/hist_TPCNcls_Pr"), track.tpcNClsFound()); + histosQA.fill(HIST("QA/Proton/hist_ITSChi2NDF_Pr"), track.itsChi2NCl()); + histosQA.fill(HIST("QA/Proton/hist_TPCChi2NDF_Pr"), track.tpcChi2NCl()); + histosQA.fill(HIST("QA/Proton/hist_DCAxy_Pr"), track.dcaXY()); + histosQA.fill(HIST("QA/Proton/hist_DCAz_Pr"), track.dcaZ()); + histosQA.fill(HIST("QA/Proton/hist_nSigmaTPC_Pr"), track.tpcNSigmaPr()); + histosQA.fill(HIST("QA/Proton/hist_nSigmaTPCPt_Pr"), track.pt(), track.tpcNSigmaPr()); + histosQA.fill(HIST("QA/Proton/hist_nSigmaTOF_Pr"), track.tofNSigmaPr()); + histosQA.fill(HIST("QA/Proton/hist_nSigmaTOFPt_Pr"), track.pt(), track.tofNSigmaPr()); + histosQA.fill(HIST("QA/Proton/hist_nSigmaITS_Pr"), track.itsNSigmaPr()); + histosQA.fill(HIST("QA/Proton/hist_nSigmaITSPt_Pr"), track.pt(), track.itsNSigmaPr()); + histosQA.fill(HIST("QA/Proton/hist_nSigmaRMS_Pr"), std::hypot(track.tpcNSigmaPr(), track.tofNSigmaPr())); + histosQA.fill(HIST("QA/Proton/hist_nSigmaRMSPt_Pr"), track.pt(), std::hypot(track.tpcNSigmaPr(), track.tofNSigmaPr())); + if (cfgOpenPlotnSigmaTOFITSPt) { + histosQA.fill(HIST("QA/Proton/hist_nSigmaTOFITSPt_Pr"), track.tofNSigmaPr(), track.itsNSigmaPr(), track.pt()); + } + if (cfgOpenPlotnSigmaITSTPCPt) { + histosQA.fill(HIST("QA/Proton/hist_nSigmaITSTPCPt_Pr"), track.itsNSigmaPr(), track.tpcNSigmaPr(), track.pt()); + } + if (cfgOpenPlotnSigmaTOFTPCPt) { + histosQA.fill(HIST("QA/Proton/hist_nSigmaTOFTPCPt_Pr"), track.tofNSigmaPr(), track.tpcNSigmaPr(), track.pt()); + } + } + if (kIsHe3) { + histosQA.fill(HIST("QA/He3/hist_dEdxTPC_He3"), track.sign() * track.tpcInnerParam(), track.tpcSignal()); + histosQA.fill(HIST("QA/He3/hist_pt_He3"), track.pt()); + histosQA.fill(HIST("QA/He3/hist_eta_He3"), track.eta()); + histosQA.fill(HIST("QA/He3/hist_ITSNcls_He3"), track.itsNCls()); + histosQA.fill(HIST("QA/He3/hist_TPCNcls_He3"), track.tpcNClsFound()); + histosQA.fill(HIST("QA/He3/hist_ITSChi2NDF_He3"), track.itsChi2NCl()); + histosQA.fill(HIST("QA/He3/hist_TPCChi2NDF_He3"), track.tpcChi2NCl()); + histosQA.fill(HIST("QA/He3/hist_DCAxy_He3"), track.dcaXY()); + histosQA.fill(HIST("QA/He3/hist_DCAz_He3"), track.dcaZ()); + histosQA.fill(HIST("QA/He3/hist_nSigmaTPC_He3"), track.tpcNSigmaHe()); + histosQA.fill(HIST("QA/He3/hist_nSigmaTPCPt_He3"), track.pt(), track.tpcNSigmaHe()); + histosQA.fill(HIST("QA/He3/hist_nSigmaTOF_He3"), track.tofNSigmaHe()); + histosQA.fill(HIST("QA/He3/hist_nSigmaTOFPt_He3"), track.pt(), track.tofNSigmaHe()); + histosQA.fill(HIST("QA/He3/hist_nSigmaITS_He3"), track.itsNSigmaHe()); + histosQA.fill(HIST("QA/He3/hist_nSigmaITSPt_He3"), track.pt(), track.itsNSigmaHe()); + histosQA.fill(HIST("QA/He3/hist_nSigmaRMS_He3"), std::hypot(track.tpcNSigmaHe(), track.tofNSigmaHe())); + histosQA.fill(HIST("QA/He3/hist_nSigmaRMSPt_He3"), track.pt(), std::hypot(track.tpcNSigmaHe(), track.tofNSigmaHe())); + if (cfgOpenPlotnSigmaTOFITSPt) { + histosQA.fill(HIST("QA/He3/hist_nSigmaTOFITSPt_He3"), track.tofNSigmaHe(), track.itsNSigmaHe(), track.pt()); + } + if (cfgOpenPlotnSigmaITSTPCPt) { + histosQA.fill(HIST("QA/He3/hist_nSigmaITSTPCPt_He3"), track.itsNSigmaHe(), track.tpcNSigmaHe(), track.pt()); + } + if (cfgOpenPlotnSigmaTOFTPCPt) { + histosQA.fill(HIST("QA/He3/hist_nSigmaTOFTPCPt_He3"), track.tofNSigmaHe(), track.tpcNSigmaHe(), track.pt()); + } + } + } + } + pidEsePHe3Table(pidFlag); + } + } +}; + +struct FlowEsePHe3 { + HistogramRegistry histos{"histosmain", {}, OutputObjHandlingPolicy::AnalysisObject}; + + Configurable> cfgnMods{"cfgnMods", {2}, "Modulation of interest"}; + Configurable cfgDetName{"cfgDetName", "FT0C", "The name of detector to be analyzed"}; + Configurable cfgRefAName{"cfgRefAName", "TPCpos", "The name of detector for reference A"}; + Configurable cfgRefBName{"cfgRefBName", "TPCneg", "The name of detector for reference B"}; + Configurable cfgnTotalSystem{"cfgnTotalSystem", 7, "total qvector number"}; + + Configurable cfgVtzCut{"cfgVtzCut", 10.0f, "Accepted z-vertex range"}; + Configurable cfgCentMin{"cfgCentMin", 0.0f, "Centrality min"}; + Configurable cfgCentMax{"cfgCentMax", 100.0f, "Centrality max"}; + + Configurable cfgCutOccupancyLow{"cfgCutOccupancyLow", 0, "Low boundary cut on TPC occupancy"}; + Configurable cfgCutOccupancyHigh{"cfgCutOccupancyHigh", 3000, "High boundary cut on TPC occupancy"}; + Configurable cfgUseAdditionalEventCut{"cfgUseAdditionalEventCut", true, "Use additional event cut beyond sel8"}; + Configurable cfgOpenEvSelkIsGoodZvtxFT0vsPV{"cfgOpenEvSelkIsGoodZvtxFT0vsPV", true, "removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference, use this cut at low multiplicities with caution"}; + Configurable cfgOpenEvSelkNoSameBunchPileup{"cfgOpenEvSelkNoSameBunchPileup", true, "rejects collisions which are associated with the same found-by-T0 bunch crossing"}; + Configurable cfgOpenEvSelkNoCollInTimeRangeStandard{"cfgOpenEvSelkNoCollInTimeRangeStandard", true, "no collisions in specified time range"}; + Configurable cfgOpenEvSelkIsGoodITSLayersAll{"cfgOpenEvSelkIsGoodITSLayersAll", true, "cut time intervals with dead ITS staves"}; + Configurable cfgOpenEvSelkNoCollInRofStandard{"cfgOpenEvSelkNoCollInRofStandard", true, "no other collisions in this Readout Frame with per-collision multiplicity above threshold"}; + Configurable cfgOpenEvSelkNoHighMultCollInPrevRof{"cfgOpenEvSelkNoHighMultCollInPrevRof", true, "veto an event if FT0C amplitude in previous ITS ROF is above threshold"}; + Configurable cfgOpenEvSelOccupancy{"cfgOpenEvSelOccupancy", true, "Occupancy cut"}; + Configurable cfgOpenEvSelMultCorrelationPVTracks{"cfgOpenEvSelMultCorrelationPVTracks", true, "Multiplicity correlation cut for PVtracks vs centrality(FT0C)"}; + Configurable cfgOpenEvSelMultCorrelationGlobalTracks{"cfgOpenEvSelMultCorrelationGlobalTracks", false, "Multiplicity correlation cut for Globaltracks vs centrality(FT0C)"}; + Configurable cfgOpenEvSelV0AT0ACut{"cfgOpenEvSelV0AT0ACut", true, "V0A T0A 5 sigma cut"}; + Configurable cfgOpenFullEventQA{"cfgOpenFullEventQA", true, "Open full QA plots for event QA"}; + Configurable cfgOpenv2q{"cfgOpenv2q", true, "Open v2(EP)and q calculation for Proton and He3"}; + Configurable cfgOpenESE{"cfgOpenESE", true, "Open ESE process"}; + Configurable cfgOpenESEChargeSeperation{"cfgOpenESEChargeSeperation", true, "Open ESE for postive and negative charge repectivily"}; + Configurable cfgOpenESEProton{"cfgOpenESEProton", true, "Open ESE Proton process"}; + Configurable cfgOpenESEHe3{"cfgOpenESEHe3", true, "Open ESE He3 process"}; + + ConfigurableAxis cfgaxisQvecF{"cfgaxisQvecF", {300, -1, 1}, ""}; + ConfigurableAxis cfgaxisCent{"cfgaxisCent", {90, 0, 90}, ""}; + ConfigurableAxis cfgaxispt{"cfgaxispt", {100, 0, 10}, ""}; + ConfigurableAxis cfgaxisCentForQA{"cfgaxisCentForQA", {100, 0, 100}, "centrality for event QA"}; + ConfigurableAxis cfgaxisNch{"cfgaxisNch", {4000, 0, 4000}, "N_{ch}"}; + ConfigurableAxis cfgaxisT0C{"cfgaxisT0C", {70, 0, 70000}, "N_{ch} (T0C)"}; + ConfigurableAxis cfgaxisT0A{"cfgaxisT0A", {200, 0, 200000}, "N_{ch} (T0A)"}; + ConfigurableAxis cfgaxisNchPV{"cfgaxisNchPV", {4000, 0, 4000}, "N_{ch} (PV)"}; + ConfigurableAxis cfgaxisq2{"cfgaxisq2", {120, 0, 12}, "Binning for P_{t} PID"}; + + EventPlaneHelper helperEP; + SliceCache cache; + + int detId; + int refAId; + int refBId; + // Additional Event selection cuts - Copy from flowGenericFramework.cxx + TF1* fMultPVCutLow = nullptr; + TF1* fMultPVCutHigh = nullptr; + TF1* fMultCutLow = nullptr; + TF1* fMultCutHigh = nullptr; + TF1* fT0AV0AMean = nullptr; + TF1* fT0AV0ASigma = nullptr; + + Filter collisionFilter = (nabs(aod::collision::posZ) < cfgVtzCut) && (aod::cent::centFT0C > cfgCentMin) && (aod::cent::centFT0C < cfgCentMax); + Filter properPIDfilter = aod::flow_ese_p_he3::nPidFlag >= (int8_t)0; // Only POI + + Partition>> protonTrackSet = ((aod::flow_ese_p_he3::nPidFlag == pid_flags::kProton) || (aod::flow_ese_p_he3::nPidFlag == pid_flags::kProtonHe3)); + Partition>> he3TrackSet = ((aod::flow_ese_p_he3::nPidFlag == pid_flags::kHe3) || (aod::flow_ese_p_he3::nPidFlag == pid_flags::kProtonHe3)); + + template + int getDetId(const T& name) + { + if (name.value == "BPos" || name.value == "BNeg" || name.value == "BTot") { + LOGF(warning, "Using deprecated label: %s. Please use TPCpos, TPCneg, TPCall instead.", name.value); + } + if (name.value == "FT0C") { + return 0; + } else if (name.value == "FT0A") { + return 1; + } else if (name.value == "FT0M") { + return 2; + } else if (name.value == "FV0A") { + return 3; + } else if (name.value == "TPCpos" || name.value == "BPos") { + return 4; + } else if (name.value == "TPCneg" || name.value == "BNeg") { + return 5; + } else if (name.value == "TPCall" || name.value == "BTot") { + return 6; + } else { + return 0; + } + } + + template + bool selEvent(const CollType& collision, const int multTrk, const float centrality) + { + histos.fill(HIST("QA/histEventCountDetail"), 0.5); + if (cfgOpenEvSelkIsGoodZvtxFT0vsPV && !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { + return false; + } + if (cfgOpenEvSelkIsGoodZvtxFT0vsPV) { + histos.fill(HIST("QA/histEventCountDetail"), 1.5); + } + if (cfgOpenEvSelkNoSameBunchPileup && !collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { + return false; + } + if (cfgOpenEvSelkNoSameBunchPileup) { + histos.fill(HIST("QA/histEventCountDetail"), 2.5); + } + if (cfgOpenEvSelkNoCollInTimeRangeStandard && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + return false; + } + if (cfgOpenEvSelkNoCollInTimeRangeStandard) { + histos.fill(HIST("QA/histEventCountDetail"), 3.5); + } + if (cfgOpenEvSelkIsGoodITSLayersAll && !collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + return false; + } + if (cfgOpenEvSelkIsGoodITSLayersAll) { + histos.fill(HIST("QA/histEventCountDetail"), 4.5); + } + if (cfgOpenEvSelkNoCollInRofStandard && !collision.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { + return false; + } + if (cfgOpenEvSelkNoCollInRofStandard) { + histos.fill(HIST("QA/histEventCountDetail"), 5.5); + } + if (cfgOpenEvSelkNoHighMultCollInPrevRof && !collision.selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof)) { + return false; + } + if (cfgOpenEvSelkNoHighMultCollInPrevRof) { + histos.fill(HIST("QA/histEventCountDetail"), 6.5); + } + auto multNTracksPV = collision.multNTracksPV(); + auto occupancy = collision.trackOccupancyInTimeRange(); + if (cfgOpenEvSelOccupancy && (occupancy < cfgCutOccupancyLow || occupancy > cfgCutOccupancyHigh)) { + return false; + } + if (cfgOpenEvSelOccupancy) { + histos.fill(HIST("QA/histEventCountDetail"), 7.5); + } + if (cfgOpenEvSelMultCorrelationPVTracks) { + if (multNTracksPV < fMultPVCutLow->Eval(centrality)) + return false; + if (multNTracksPV > fMultPVCutHigh->Eval(centrality)) + return false; + } + if (cfgOpenEvSelMultCorrelationPVTracks) { + histos.fill(HIST("QA/histEventCountDetail"), 8.5); + } + if (cfgOpenEvSelMultCorrelationGlobalTracks) { + if (multTrk < fMultCutLow->Eval(centrality)) + return false; + if (multTrk > fMultCutHigh->Eval(centrality)) + return false; + } + if (cfgOpenEvSelMultCorrelationGlobalTracks) { + histos.fill(HIST("QA/histEventCountDetail"), 9.5); + } + if (cfgOpenEvSelV0AT0ACut && (std::fabs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > event_selection::kFT0AV0ASigma * fT0AV0ASigma->Eval(collision.multFT0A()))) { + return false; + } + if (cfgOpenEvSelV0AT0ACut) { + histos.fill(HIST("QA/histEventCountDetail"), 10.5); + } + return true; + } + + template + void fillHistosQvec(const CollType& collision, int nmode) + { + int detInd = detId * 4 + cfgnTotalSystem * 4 * (nmode - 2); + int refAInd = refAId * 4 + cfgnTotalSystem * 4 * (nmode - 2); + int refBInd = refBId * 4 + cfgnTotalSystem * 4 * (nmode - 2); + if (nmode == fourier_mode::kMode2) { + if (collision.qvecAmp()[detId] > 1e-8) { + histos.fill(HIST("QA/histQvec_CorrL0_V2"), collision.qvecRe()[detInd], collision.qvecIm()[detInd], collision.centFT0C()); + histos.fill(HIST("QA/histQvec_CorrL1_V2"), collision.qvecRe()[detInd + 1], collision.qvecIm()[detInd + 1], collision.centFT0C()); + histos.fill(HIST("QA/histQvec_CorrL2_V2"), collision.qvecRe()[detInd + 2], collision.qvecIm()[detInd + 2], collision.centFT0C()); + histos.fill(HIST("QA/histQvec_CorrL3_V2"), collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], collision.centFT0C()); + histos.fill(HIST("QA/histEvtPl_CorrL0_V2"), helperEP.GetEventPlane(collision.qvecRe()[detInd], collision.qvecIm()[detInd], nmode), collision.centFT0C()); + histos.fill(HIST("QA/histEvtPl_CorrL1_V2"), helperEP.GetEventPlane(collision.qvecRe()[detInd + 1], collision.qvecIm()[detInd + 1], nmode), collision.centFT0C()); + histos.fill(HIST("QA/histEvtPl_CorrL2_V2"), helperEP.GetEventPlane(collision.qvecRe()[detInd + 2], collision.qvecIm()[detInd + 2], nmode), collision.centFT0C()); + histos.fill(HIST("QA/histEvtPl_CorrL3_V2"), helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode), collision.centFT0C()); + } + if (collision.qvecAmp()[detId] > 1e-8 && collision.qvecAmp()[refAId] > 1e-8 && collision.qvecAmp()[refBId] > 1e-8) { + histos.fill(HIST("QA/histQvecRes_SigRefAV2"), collision.centFT0C(), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode), helperEP.GetEventPlane(collision.qvecRe()[refAInd + 3], collision.qvecIm()[refAInd + 3], nmode), nmode)); + histos.fill(HIST("QA/histQvecRes_SigRefBV2"), collision.centFT0C(), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode), helperEP.GetEventPlane(collision.qvecRe()[refBInd + 3], collision.qvecIm()[refBInd + 3], nmode), nmode)); + histos.fill(HIST("QA/histQvecRes_RefARefBV2"), collision.centFT0C(), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[refAInd + 3], collision.qvecIm()[refAInd + 3], nmode), helperEP.GetEventPlane(collision.qvecRe()[refBInd + 3], collision.qvecIm()[refBInd + 3], nmode), nmode)); + } + } + } + + template + float calculateq2(const TrackType tracks, float psi2, float cent, int pidmode) // pidmode 1 for proton , 2 for he3 + { + int multi = tracks.size(); + if (multi > 0) { + float q2x = 0, q2y = 0; + for (const auto& track : tracks) { + q2x += std::cos(2 * track.phi()); + q2y += std::sin(2 * track.phi()); + if (pidmode == pid_flags::kProton) { + if (track.sign() > 0) { + histos.fill(HIST("V2/histCosV2EP_Pr_Pos"), track.pt(), cent, std::cos(2 * (track.phi() - psi2))); + } else { + histos.fill(HIST("V2/histCosV2EP_Pr_Neg"), track.pt(), cent, std::cos(2 * (track.phi() - psi2))); + } + } + if (pidmode == pid_flags::kHe3) { + if (track.sign() > 0) { + histos.fill(HIST("V2/histCosV2EP_He3_Pos"), track.pt(), cent, std::cos(2 * (track.phi() - psi2))); + } else { + histos.fill(HIST("V2/histCosV2EP_He3_Neg"), track.pt(), cent, std::cos(2 * (track.phi() - psi2))); + } + } + } + return std::hypot(q2x, q2y) / std::sqrt(multi); + } else { + return 0; + } + } + + template + void processESE(const TrackType tracks, float psi2, float q2, float cent, int pidmode, bool spcharge) // pidmode 1 for proton , 2 for he3 + { + for (const auto& track : tracks) { + if (pidmode == pid_flags::kProton) { + if (spcharge) { + if (track.sign() > 0) { + histos.fill(HIST("ESE/hist_v2PosPr_Cent_Pt_q2He3"), track.pt(), cent, q2, std::cos(2 * (track.phi() - psi2))); + } else { + histos.fill(HIST("ESE/hist_v2NegPr_Cent_Pt_q2He3"), track.pt(), cent, q2, std::cos(2 * (track.phi() - psi2))); + } + } else { + histos.fill(HIST("ESE/hist_v2Pr_Cent_Pt_q2He3"), track.pt(), cent, q2, std::cos(2 * (track.phi() - psi2))); + } + } + if (pidmode == pid_flags::kHe3) { + if (spcharge) { + if (track.sign() > 0) { + histos.fill(HIST("ESE/hist_v2PosHe3_Cent_Pt_q2Pr"), track.pt(), cent, q2, std::cos(2 * (track.phi() - psi2))); + } else { + histos.fill(HIST("ESE/hist_v2NegHe3_Cent_Pt_q2Pr"), track.pt(), cent, q2, std::cos(2 * (track.phi() - psi2))); + } + } else { + histos.fill(HIST("ESE/hist_v2He3_Cent_Pt_q2Pr"), track.pt(), cent, q2, std::cos(2 * (track.phi() - psi2))); + } + } + } + } + + void init(InitContext const&) + { + detId = getDetId(cfgDetName); + refAId = getDetId(cfgRefAName); + refBId = getDetId(cfgRefBName); + if (detId == refAId || detId == refBId || refAId == refBId) { + LOGF(info, "Wrong detector configuration \n The FT0C will be used to get Q-Vector \n The TPCpos and TPCneg will be used as reference systems"); + detId = 0; + refAId = 4; + refBId = 5; + } + if (cfgUseAdditionalEventCut) { + fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x - 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); + fMultPVCutLow->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); + fMultPVCutHigh = new TF1("fMultPVCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x + 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); + fMultPVCutHigh->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); + + fMultCutLow = new TF1("fMultCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x - 2.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); + fMultCutLow->SetParameters(1654.46, -47.2379, 0.449833, -0.0014125, 150.773, -3.67334, 0.0530503, -0.000614061, 3.15956e-06); + fMultCutHigh = new TF1("fMultCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x + 3.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); + fMultCutHigh->SetParameters(1654.46, -47.2379, 0.449833, -0.0014125, 150.773, -3.67334, 0.0530503, -0.000614061, 3.15956e-06); + + fT0AV0AMean = new TF1("fT0AV0AMean", "[0]+[1]*x", 0, 200000); + fT0AV0AMean->SetParameters(-1601.0581, 9.417652e-01); + fT0AV0ASigma = new TF1("fT0AV0ASigma", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 200000); + fT0AV0ASigma->SetParameters(463.4144, 6.796509e-02, -9.097136e-07, 7.971088e-12, -2.600581e-17); + } + AxisSpec axisEvtPl = {100, -1.0 * constants::math::PI, constants::math::PI}; + AxisSpec axisvertexz = {100, -15., 15., "vrtx_{Z} [cm]"}; + histos.add("QA/histEventCount", "", {HistType::kTH1F, {{3, 0.0, 3.0}}}); + histos.get(HIST("QA/histEventCount"))->GetXaxis()->SetBinLabel(1, "Filtered event"); + histos.get(HIST("QA/histEventCount"))->GetXaxis()->SetBinLabel(2, "after sel8"); + histos.get(HIST("QA/histEventCount"))->GetXaxis()->SetBinLabel(3, "after additional event cut"); + if (cfgUseAdditionalEventCut) { + histos.add("QA/histEventCountDetail", "Number of Event;; Count", {HistType::kTH1F, {{11, 0, 11}}}); + histos.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(1, "after sel8"); + histos.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(2, "kIsGoodZvtxFT0vsPV"); + histos.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(3, "kNoSameBunchPileup"); + histos.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(4, "kNoCollInTimeRangeStandard"); + histos.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(5, "kIsGoodITSLayersAll"); + histos.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(6, "kNoCollInRofStandard"); + histos.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(7, "kNoHighMultCollInPrevRof"); + histos.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(8, "occupancy"); + histos.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(9, "MultCorrelationPVTracks"); + histos.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(10, "MultCorrelationGlobalTracks"); + histos.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(11, "cfgEvSelV0AT0ACut"); + } + if (cfgOpenFullEventQA) { + histos.add("QA/hist_globalTracks_centT0C_before", "before cut;Centrality T0C;mulplicity global tracks", {HistType::kTH2D, {cfgaxisCentForQA, cfgaxisNch}}); + histos.add("QA/hist_PVTracks_centT0C_before", "before cut;Centrality T0C;mulplicity PV tracks", {HistType::kTH2D, {cfgaxisCentForQA, cfgaxisNchPV}}); + histos.add("QA/hist_globalTracks_PVTracks_before", "before cut;mulplicity PV tracks;mulplicity global tracks", {HistType::kTH2D, {cfgaxisNchPV, cfgaxisNch}}); + histos.add("QA/hist_globalTracks_multT0A_before", "before cut;mulplicity T0A;mulplicity global tracks", {HistType::kTH2D, {cfgaxisT0A, cfgaxisNch}}); + histos.add("QA/hist_globalTracks_multV0A_before", "before cut;mulplicity V0A;mulplicity global tracks", {HistType::kTH2D, {cfgaxisT0A, cfgaxisNch}}); + histos.add("QA/hist_multV0A_multT0A_before", "before cut;mulplicity T0A;mulplicity V0A", {HistType::kTH2D, {cfgaxisT0A, cfgaxisT0A}}); + histos.add("QA/hist_multT0C_centT0C_before", "before cut;Centrality T0C;mulplicity T0C", {HistType::kTH2D, {cfgaxisCentForQA, cfgaxisT0C}}); + histos.add("QA/hist_globalTracks_centT0C_after", "after cut;Centrality T0C;mulplicity global tracks", {HistType::kTH2D, {cfgaxisCentForQA, cfgaxisNch}}); + histos.add("QA/hist_PVTracks_centT0C_after", "after cut;Centrality T0C;mulplicity PV tracks", {HistType::kTH2D, {cfgaxisCentForQA, cfgaxisNchPV}}); + histos.add("QA/hist_globalTracks_PVTracks_after", "after cut;mulplicity PV tracks;mulplicity global tracks", {HistType::kTH2D, {cfgaxisNchPV, cfgaxisNch}}); + histos.add("QA/hist_globalTracks_multT0A_after", "after cut;mulplicity T0A;mulplicity global tracks", {HistType::kTH2D, {cfgaxisT0A, cfgaxisNch}}); + histos.add("QA/hist_globalTracks_multV0A_after", "after cut;mulplicity V0A;mulplicity global tracks", {HistType::kTH2D, {cfgaxisT0A, cfgaxisNch}}); + histos.add("QA/hist_multV0A_multT0A_after", "after cut;mulplicity T0A;mulplicity V0A", {HistType::kTH2D, {cfgaxisT0A, cfgaxisT0A}}); + histos.add("QA/hist_multT0C_centT0C_after", "after cut;Centrality T0C;mulplicity T0C", {HistType::kTH2D, {cfgaxisCentForQA, cfgaxisT0C}}); + } + histos.add("QA/histVertexZRec", ";vrtx_{Z} [cm];counts", {HistType::kTH1F, {axisvertexz}}); + histos.add("QA/histCentrality", ";Centrality;counts", {HistType::kTH1F, {cfgaxisCentForQA}}); + histos.add("QA/histProtonNum", "ProtonNum;counts", {HistType::kTH1F, {{100, 0, 100}}}); + histos.add("QA/histHe3Num", "He3Num;counts", {HistType::kTH1F, {{20, 0, 20}}}); + histos.add("QA/histQvec_CorrL0_V2", ";#it{Q_{x}};#it{Q_{y}};Centrality", {HistType::kTH3F, {cfgaxisQvecF, cfgaxisQvecF, cfgaxisCent}}); + histos.add("QA/histQvec_CorrL1_V2", ";#it{Q_{x}};#it{Q_{y}};Centrality", {HistType::kTH3F, {cfgaxisQvecF, cfgaxisQvecF, cfgaxisCent}}); + histos.add("QA/histQvec_CorrL2_V2", ";#it{Q_{x}};#it{Q_{y}};Centrality", {HistType::kTH3F, {cfgaxisQvecF, cfgaxisQvecF, cfgaxisCent}}); + histos.add("QA/histQvec_CorrL3_V2", ";#it{Q_{x}};#it{Q_{y}};Centrality", {HistType::kTH3F, {cfgaxisQvecF, cfgaxisQvecF, cfgaxisCent}}); + histos.add("QA/histEvtPl_CorrL0_V2", ";EventPlane angle;Centrality", {HistType::kTH2F, {axisEvtPl, cfgaxisCent}}); + histos.add("QA/histEvtPl_CorrL1_V2", ";EventPlane angle;Centrality", {HistType::kTH2F, {axisEvtPl, cfgaxisCent}}); + histos.add("QA/histEvtPl_CorrL2_V2", ";EventPlane angle;Centrality", {HistType::kTH2F, {axisEvtPl, cfgaxisCent}}); + histos.add("QA/histEvtPl_CorrL3_V2", ";EventPlane angle;Centrality", {HistType::kTH2F, {axisEvtPl, cfgaxisCent}}); + histos.add("QA/histQvecRes_SigRefAV2", ";Centrality;Cos(Sig-RefA)", {HistType::kTProfile, {cfgaxisCent}}); + histos.add("QA/histQvecRes_SigRefBV2", ";Centrality;Cos(Sig-RefB)", {HistType::kTProfile, {cfgaxisCent}}); + histos.add("QA/histQvecRes_RefARefBV2", ";Centrality;Cos(RefA-RefB)", {HistType::kTProfile, {cfgaxisCent}}); + if (cfgOpenv2q) { + histos.add("V2/histCosV2EP_Pr_Pos", ";#it{p}_{T};Centrality", {HistType::kTProfile2D, {cfgaxispt, cfgaxisCent}}); + histos.add("V2/histCosV2EP_Pr_Neg", ";#it{p}_{T};Centrality", {HistType::kTProfile2D, {cfgaxispt, cfgaxisCent}}); + histos.add("V2/histCosV2EP_He3_Pos", ";#it{p}_{T};Centrality", {HistType::kTProfile2D, {cfgaxispt, cfgaxisCent}}); + histos.add("V2/histCosV2EP_He3_Neg", ";#it{p}_{T};Centrality", {HistType::kTProfile2D, {cfgaxispt, cfgaxisCent}}); + histos.add("q2/hist_q2_Cen_Pr", ";q_{2} (TPC);Centrality", {HistType::kTH2F, {cfgaxisq2, cfgaxisCent}}); + histos.add("q2/hist_q2_Cen_He3", ";q_{2} (TPC);Centrality", {HistType::kTH2F, {cfgaxisq2, cfgaxisCent}}); + histos.add("q2/hist_q2_Pr", ";q_{2} (TPC);counts", {HistType::kTH1F, {cfgaxisq2}}); + histos.add("q2/hist_q2_He3", ";q_{2} (TPC);counts", {HistType::kTH1F, {cfgaxisq2}}); + } + if (cfgOpenESE) { + if (cfgOpenESEChargeSeperation) { + if (cfgOpenESEProton) { + histos.add("ESE/hist_v2PosPr_Cent_Pt_q2He3", ";#it{p}_{T};q_{2}(He3);Centrality", HistType::kTProfile3D, {cfgaxispt, cfgaxisq2, cfgaxisCent}); + histos.add("ESE/hist_v2NegPr_Cent_Pt_q2He3", ";#it{p}_{T};q_{2}(He3);Centrality", HistType::kTProfile3D, {cfgaxispt, cfgaxisq2, cfgaxisCent}); + } + if (cfgOpenESEHe3) { + histos.add("ESE/hist_v2PosHe3_Cent_Pt_q2Pr", ";#it{p}_{T};q_{2}(Proton);Centrality", HistType::kTProfile3D, {cfgaxispt, cfgaxisq2, cfgaxisCent}); + histos.add("ESE/hist_v2NegHe3_Cent_Pt_q2Pr", ";#it{p}_{T};q_{2}(Proton);Centrality", HistType::kTProfile3D, {cfgaxispt, cfgaxisq2, cfgaxisCent}); + } + } else { + if (cfgOpenESEProton) { + histos.add("ESE/hist_v2Pr_Cent_Pt_q2He3", ";#it{p}_{T};q_{2}(He3);Centrality", HistType::kTProfile3D, {cfgaxispt, cfgaxisq2, cfgaxisCent}); + } + if (cfgOpenESEHe3) { + histos.add("ESE/hist_v2He3_Cent_Pt_q2Pr", ";#it{p}_{T};q_{2}(Proton);Centrality", HistType::kTProfile3D, {cfgaxispt, cfgaxisq2, cfgaxisCent}); + } + } + } + } + + void process(soa::Filtered>::iterator const& collision, soa::Filtered> const& tracks) + { + const auto cent = collision.centFT0C(); + histos.fill(HIST("QA/histEventCount"), 0.5); + if (!collision.sel8()) + return; + if (tracks.size() < 1) + return; + histos.fill(HIST("QA/histEventCount"), 1.5); + if (cfgOpenFullEventQA) { + histos.fill(HIST("QA/hist_globalTracks_centT0C_before"), cent, tracks.size()); + histos.fill(HIST("QA/hist_PVTracks_centT0C_before"), cent, collision.multNTracksPV()); + histos.fill(HIST("QA/hist_globalTracks_PVTracks_before"), collision.multNTracksPV(), tracks.size()); + histos.fill(HIST("QA/hist_globalTracks_multT0A_before"), collision.multFT0A(), tracks.size()); + histos.fill(HIST("QA/hist_globalTracks_multV0A_before"), collision.multFV0A(), tracks.size()); + histos.fill(HIST("QA/hist_multV0A_multT0A_before"), collision.multFT0A(), collision.multFV0A()); + histos.fill(HIST("QA/hist_multT0C_centT0C_before"), cent, collision.multFT0C()); + } + if (cfgUseAdditionalEventCut && !selEvent(collision, tracks.size(), cent)) { + return; + } + histos.fill(HIST("QA/histEventCount"), 2.5); + histos.fill(HIST("QA/histCentrality"), cent); + histos.fill(HIST("QA/histVertexZRec"), collision.posZ()); + if (cfgOpenFullEventQA) { + histos.fill(HIST("QA/hist_globalTracks_centT0C_after"), cent, tracks.size()); + histos.fill(HIST("QA/hist_PVTracks_centT0C_after"), cent, collision.multNTracksPV()); + histos.fill(HIST("QA/hist_globalTracks_PVTracks_after"), collision.multNTracksPV(), tracks.size()); + histos.fill(HIST("QA/hist_globalTracks_multT0A_after"), collision.multFT0A(), tracks.size()); + histos.fill(HIST("QA/hist_globalTracks_multV0A_after"), collision.multFV0A(), tracks.size()); + histos.fill(HIST("QA/hist_multV0A_multT0A_after"), collision.multFT0A(), collision.multFV0A()); + histos.fill(HIST("QA/hist_multT0C_centT0C_after"), cent, collision.multFT0C()); + } + auto tracksPr = protonTrackSet->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + auto tracksHe3 = he3TrackSet->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + int multiPr = tracksPr.size(); + int multiHe3 = tracksHe3.size(); + // LOGF(info, Form("Collison ID + 1; Proton Num:%d; He3 Num:%d;\n", multiPr, multiHe3)); + histos.fill(HIST("QA/histProtonNum"), multiPr); + histos.fill(HIST("QA/histHe3Num"), multiHe3); + if (multiPr < 1 && multiHe3 < 1) + return; // Reject Collisions without enough POI + for (auto i = 0; i < static_cast(cfgnMods->size()); i++) { + int detIndGlobal = detId * 4 + cfgnTotalSystem * 4 * (cfgnMods->at(i) - 2); + float psiNGlobal = helperEP.GetEventPlane(collision.qvecRe()[detIndGlobal + 3], collision.qvecIm()[detIndGlobal + 3], cfgnMods->at(i)); + if (cfgnMods->at(i) == fourier_mode::kMode2) { + // LOGF(info, "Process q2\n"); + float q2Proton = calculateq2(tracksPr, psiNGlobal, cent, 1); + float q2He3 = calculateq2(tracksHe3, psiNGlobal, cent, 2); + histos.fill(HIST("q2/hist_q2_Pr"), q2Proton); + histos.fill(HIST("q2/hist_q2_He3"), q2He3); + histos.fill(HIST("q2/hist_q2_Cen_Pr"), q2Proton, cent); + histos.fill(HIST("q2/hist_q2_Cen_He3"), q2He3, cent); + if (cfgOpenESE && multiPr > 0 && multiHe3 > 0) { + // LOGF(info, "Process ESE\n"); + if (cfgOpenESEProton) { + processESE(tracksPr, psiNGlobal, q2Proton, cent, 1, cfgOpenESEChargeSeperation); + } + if (cfgOpenESEHe3) { + processESE(tracksHe3, psiNGlobal, q2He3, cent, 2, cfgOpenESEChargeSeperation); + } + } + // LOGF(info, "Process for this event over\n"); + } + fillHistosQvec(collision, cfgnMods->at(i)); + } + } +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc), + }; +} diff --git a/PWGCF/Flow/Tasks/pidcme.cxx b/PWGCF/Flow/Tasks/flowPidCme.cxx similarity index 97% rename from PWGCF/Flow/Tasks/pidcme.cxx rename to PWGCF/Flow/Tasks/flowPidCme.cxx index 8242b9af48b..bd91bdc4450 100644 --- a/PWGCF/Flow/Tasks/pidcme.cxx +++ b/PWGCF/Flow/Tasks/flowPidCme.cxx @@ -10,10 +10,9 @@ // or submit itself to any jurisdiction. /// \author ZhengqingWang(zhengqing.wang@cern.ch) -/// \file pidcme.cxx +/// \file flowPidCme.cxx /// \brief task to calculate the pikp cme signal and bacground. // C++/ROOT includes. -// o2-linter: disable=name/workflow-file #include #include #include @@ -75,6 +74,38 @@ DECLARE_SOA_TABLE(Flags, "AOD", "Flags", cme_track_pid_columns::NPidFlag); DECLARE_SOA_TABLE(PidInfo, "AOD", "PidInfo", cme_track_pid_columns::AverClusterSizeCosl, cme_track_pid_columns::NSigmaPiITS, cme_track_pid_columns::NSigmaKaITS, cme_track_pid_columns::NSigmaPrITS, cme_track_pid_columns::NSigmaPiTPC, cme_track_pid_columns::NSigmaKaTPC, cme_track_pid_columns::NSigmaPrTPC, cme_track_pid_columns::NSigmaPiTOF, cme_track_pid_columns::NSigmaKaTOF, cme_track_pid_columns::NSigmaPrTOF); } // namespace o2::aod +namespace pid_flags +{ +constexpr int8_t kUnqualified = -1; +constexpr int8_t kUnPOIHadron = 0; +constexpr int8_t kPion = 1; +constexpr int8_t kKaon = 2; +constexpr int8_t kProton = 3; +constexpr int8_t kPionITSleft = 4; +constexpr int8_t kKaonITSleft = 5; +constexpr int8_t kProtonITSleft = 6; +constexpr int8_t kPionKaon = 7; +constexpr int8_t kPionProton = 8; +constexpr int8_t kKaonProton = 9; +constexpr int8_t kPionKaonProton = 10; +constexpr int8_t kPionKaonITSleft = 11; +constexpr int8_t kPionProtonITSleft = 12; +constexpr int8_t kKaonProtonITSleft = 13; +constexpr int8_t kPionKaonProtonITSleft = 14; +} // namespace pid_flags + +namespace event_selection +{ +constexpr int kFT0AV0ASigma = 5; +} + +namespace fourier_mode +{ +// constexpr int kMode1 = 1; +constexpr int kMode2 = 2; +// constexpr int kMode3 = 3; +} // namespace fourier_mode + using TracksPID = soa::Join; using CollisionPID = soa::Join; struct FillPIDcolums { @@ -182,8 +213,9 @@ struct FillPIDcolums { float average = 0; int nclusters = 0; const float cosl = 1. / std::cosh(eta); + const int nlayerITS = 7; - for (int layer = 0; layer < 7; layer++) { + for (int layer = 0; layer < nlayerITS; layer++) { if ((itsClusterSizes >> (layer * 4)) & 0xf) { nclusters++; average += (itsClusterSizes >> (layer * 4)) & 0xf; @@ -284,10 +316,14 @@ struct FillPIDcolums { pidVectorLower = (candidate.pt() > cfgPtMaxforTPCOnlyPID && candidate.hasTOF()) ? cfgnSigmaCutRMSLower.value : cfgnSigmaCutTPCLower.value; } float nsigma = 9999.99; + const int nPOI = 3; + const int piCase = 0; + const int kaCase = 1; + const int prCase = 2; // Fill cross pid QA - for (int i = 0; i < 3; ++i) { + for (int i = 0; i < nPOI; ++i) { if (nSigmaToUse[i] > pidVectorLower[i] && nSigmaToUse[i] < pidVectorUpper[i]) { - if (i == 0) { + if (i == piCase) { kIsPi = true; if (!cfgQuietMode) { if (cfgOpenCrossTrackQAPlots) { @@ -328,7 +364,7 @@ struct FillPIDcolums { } } } - if (i == 1) { + if (i == kaCase) { kIsKa = true; if (!cfgQuietMode) { if (cfgOpenCrossTrackQAPlots) { @@ -369,7 +405,7 @@ struct FillPIDcolums { } } } - if (i == 2) { + if (i == prCase) { kIsPr = true; if (!cfgQuietMode) { if (cfgOpenCrossTrackQAPlots) { @@ -419,7 +455,7 @@ struct FillPIDcolums { return map[index]; } else { // Select particle with the lowest nsigma (If not allow cross track) - for (int i = 0; i < 3; ++i) { + for (int i = 0; i < nPOI; ++i) { if (std::abs(nSigmaToUse[i]) < nsigma && (nSigmaToUse[i] > pidVectorLower[i] && nSigmaToUse[i] < pidVectorUpper[i])) { pid = i; nsigma = std::abs(nSigmaToUse[i]); @@ -984,16 +1020,16 @@ struct FillPIDcolums { } } pidFlag = selectionPidtpctof(track, nSigmaTOFCutPtUpper, nSigmaTOFCutPtLower, nSigmaTPCCutPtUpper, nSigmaTPCCutPtLower); - if (!(pidFlag == 0 || pidFlag == -1)) { + if (!(pidFlag == pid_flags::kUnqualified || pidFlag == pid_flags::kUnPOIHadron)) { // First fill ITS uncut plots - if ((pidFlag == 1) || (pidFlag == 7) || (pidFlag == 8) || (pidFlag == 10)) { + if ((pidFlag == pid_flags::kPion) || (pidFlag == pid_flags::kPionKaon) || (pidFlag == pid_flags::kPionProton) || (pidFlag == pid_flags::kPionKaonProton)) { if (cfgOpenTPCAssistanceTOFOnlyPID && !(track.tpcNSigmaPi() > nSigmaTPCCutPiPtLower && track.tpcNSigmaPi() < nSigmaTPCCutPiPtUpper)) { pidFlag = 0; } if (cfgOpenPIDPtSelection && !(track.pt() > cfgPtCutLower.value[0] && track.pt() < cfgPtCutUpper.value[0])) { pidFlag = 0; } - if (!(cfgQuietMode || pidFlag == 0)) { + if (!(cfgQuietMode || pidFlag == pid_flags::kUnPOIHadron)) { histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_Pi"), track.itsNSigmaPi(), track.tpcNSigmaPi()); histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaITS_Pi"), track.tofNSigmaPi(), track.itsNSigmaPi()); histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaTPC_Pi"), track.tofNSigmaPi(), track.tpcNSigmaPi()); @@ -1048,14 +1084,14 @@ struct FillPIDcolums { } } } - if ((pidFlag == 2) || (pidFlag == 7) || (pidFlag == 9) || (pidFlag == 10)) { + if ((pidFlag == pid_flags::kKaon) || (pidFlag == pid_flags::kPionKaon) || (pidFlag == pid_flags::kKaonProton) || (pidFlag == pid_flags::kPionKaonProton)) { if (cfgOpenTPCAssistanceTOFOnlyPID && !(track.tpcNSigmaKa() > nSigmaTPCCutKaPtLower && track.tpcNSigmaKa() < nSigmaTPCCutKaPtUpper)) { pidFlag = 0; } if (cfgOpenPIDPtSelection && !(track.pt() > cfgPtCutLower.value[1] && track.pt() < cfgPtCutUpper.value[1])) { pidFlag = 0; } - if (!(cfgQuietMode || pidFlag == 0)) { + if (!(cfgQuietMode || pid_flags::kUnPOIHadron)) { histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_Ka"), track.itsNSigmaKa(), track.tpcNSigmaKa()); histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaITS_Ka"), track.tofNSigmaKa(), track.itsNSigmaKa()); histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaTPC_Ka"), track.tofNSigmaKa(), track.tpcNSigmaKa()); @@ -1110,14 +1146,14 @@ struct FillPIDcolums { } } } - if ((pidFlag == 3) || (pidFlag == 8) || (pidFlag == 9) || (pidFlag == 10)) { + if ((pidFlag == pid_flags::kProton) || (pidFlag == pid_flags::kPionProton) || (pidFlag == pid_flags::kKaonProton) || (pidFlag == pid_flags::kPionKaonProton)) { if (cfgOpenTPCAssistanceTOFOnlyPID && !(track.tpcNSigmaPr() > nSigmaTPCCutPrPtLower && track.tpcNSigmaPr() < nSigmaTPCCutPrPtUpper)) { pidFlag = 0; } if (cfgOpenPIDPtSelection && !(track.pt() > cfgPtCutLower.value[2] && track.pt() < cfgPtCutUpper.value[2])) { pidFlag = 0; } - if (!(cfgQuietMode || pidFlag == 0)) { + if (!(cfgQuietMode || pidFlag == pid_flags::kUnPOIHadron)) { histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_Pr"), track.itsNSigmaPr(), track.tpcNSigmaPr()); histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaITS_Pr"), track.tofNSigmaPr(), track.itsNSigmaPr()); histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaTPC_Pr"), track.tofNSigmaPr(), track.tpcNSigmaPr()); @@ -1284,7 +1320,7 @@ struct FillPIDcolums { histosQA.fill(HIST("QA/PID/histTPCChi2Ncls_total_AfterITS"), track.tpcChi2NCl()); histosQA.fill(HIST("QA/PID/histITSChi2Ncls_total_AfterITS"), track.itsChi2NCl()); } - if ((pidFlag == 1) || (pidFlag == 7) || (pidFlag == 8) || (pidFlag == 10)) { + if ((pidFlag == pid_flags::kPion) || (pidFlag == pid_flags::kPionKaon) || (pidFlag == pid_flags::kPionProton) || (pidFlag == pid_flags::kPionKaonProton)) { histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Pi"), track.itsNSigmaPi(), track.tpcNSigmaPi()); histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaITS_AfterITS_Pi"), track.tofNSigmaPi(), track.itsNSigmaPi()); histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaTPC_AfterITS_Pi"), track.tofNSigmaPi(), track.tpcNSigmaPi()); @@ -1333,7 +1369,7 @@ struct FillPIDcolums { } } } - if ((pidFlag == 2) || (pidFlag == 7) || (pidFlag == 9) || (pidFlag == 10)) { + if ((pidFlag == pid_flags::kKaon) || (pidFlag == pid_flags::kPionKaon) || (pidFlag == pid_flags::kKaonProton) || (pidFlag == pid_flags::kPionKaonProton)) { histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Ka"), track.itsNSigmaKa(), track.tpcNSigmaKa()); histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaITS_AfterITS_Ka"), track.tofNSigmaKa(), track.itsNSigmaKa()); histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaTPC_AfterITS_Ka"), track.tofNSigmaKa(), track.tpcNSigmaKa()); @@ -1382,7 +1418,7 @@ struct FillPIDcolums { } } } - if ((pidFlag == 3) || (pidFlag == 8) || (pidFlag == 9) || (pidFlag == 10)) { + if ((pidFlag == pid_flags::kProton) || (pidFlag == pid_flags::kPionProton) || (pidFlag == pid_flags::kKaonProton) || (pidFlag == pid_flags::kPionKaonProton)) { histosQA.fill(HIST("QA/PID/histnSigmaITS_nSigmaTPC_AfterITS_Pr"), track.itsNSigmaPr(), track.tpcNSigmaPr()); histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaITS_AfterITS_Pr"), track.tofNSigmaPr(), track.itsNSigmaPr()); histosQA.fill(HIST("QA/PID/histnSigmaTOF_nSigmaTPC_AfterITS_Pr"), track.tofNSigmaPr(), track.tpcNSigmaPr()); @@ -1712,9 +1748,9 @@ struct QAProcessCent { for (const auto& trk : tracks) { int8_t pidFlag = trk.nPidFlag(); if (cfgOpenPi) { - if ((pidFlag == 1) || (pidFlag == 4) || (pidFlag == 7) || (pidFlag == 8) || (pidFlag == 10) || (pidFlag == 11) || (pidFlag == 12) || (pidFlag == 14)) { + if ((pidFlag == pid_flags::kPion) || (pidFlag == pid_flags::kPionITSleft) || (pidFlag == pid_flags::kPionKaon) || (pidFlag == pid_flags::kPionProton) || (pidFlag == pid_flags::kPionKaonProton) || (pidFlag == pid_flags::kPionKaonITSleft) || (pidFlag == pid_flags::kPionProtonITSleft) || (pidFlag == pid_flags::kPionKaonProtonITSleft)) { if (trk.sign() > 0) { - if (!((pidFlag == 4) || (pidFlag == 11) || (pidFlag == 12) || (pidFlag == 14))) { + if (!((pidFlag == pid_flags::kPionITSleft) || (pidFlag == pid_flags::kPionKaonITSleft) || (pidFlag == pid_flags::kPionProtonITSleft) || (pidFlag == pid_flags::kPionKaonProtonITSleft))) { if (cfgOpenPtEtaPhi) { vhistPhiPtEtaPosPiCen[currentBin]->Fill(trk.phi(), trk.pt(), trk.eta()); } @@ -1746,7 +1782,7 @@ struct QAProcessCent { vhistnSigmaTOFTPCPtPosPiBeforeCen[currentBin]->Fill(trk.nSigmaPiTOF(), trk.nSigmaPiTPC(), trk.pt()); } } else if (trk.sign() < 0) { - if (!((pidFlag == 4) || (pidFlag == 11) || (pidFlag == 12) || (pidFlag == 14))) { + if (!((pidFlag == pid_flags::kPionITSleft) || (pidFlag == pid_flags::kPionKaonITSleft) || (pidFlag == pid_flags::kPionProtonITSleft) || (pidFlag == pid_flags::kPionKaonProtonITSleft))) { if (cfgOpenPtEtaPhi) { vhistPhiPtEtaNegPiCen[currentBin]->Fill(trk.phi(), trk.pt(), trk.eta()); } @@ -1781,9 +1817,9 @@ struct QAProcessCent { } } if (cfgOpenKa) { - if ((pidFlag == 2) || (pidFlag == 5) || (pidFlag == 7) || (pidFlag == 9) || (pidFlag == 10) || (pidFlag == 11) || (pidFlag == 13) || (pidFlag == 14)) { + if ((pidFlag == pid_flags::kKaon) || (pidFlag == pid_flags::kKaonITSleft) || (pidFlag == pid_flags::kPionKaon) || (pidFlag == pid_flags::kKaonProton) || (pidFlag == pid_flags::kPionKaonProton) || (pidFlag == pid_flags::kPionKaonITSleft) || (pidFlag == pid_flags::kKaonProtonITSleft) || (pidFlag == pid_flags::kPionKaonProtonITSleft)) { if (trk.sign() > 0) { - if (!((pidFlag == 5) || (pidFlag == 11) || (pidFlag == 13) || (pidFlag == 14))) { + if (!((pidFlag == pid_flags::kKaonITSleft) || (pidFlag == pid_flags::kPionKaonITSleft) || (pidFlag == pid_flags::kKaonProtonITSleft) || (pidFlag == pid_flags::kPionKaonProtonITSleft))) { if (cfgOpenPtEtaPhi) { vhistPhiPtEtaPosKaCen[currentBin]->Fill(trk.phi(), trk.pt(), trk.eta()); } @@ -1815,7 +1851,7 @@ struct QAProcessCent { vhistnSigmaTOFTPCPtPosKaBeforeCen[currentBin]->Fill(trk.nSigmaKaTOF(), trk.nSigmaKaTPC(), trk.pt()); } } else if (trk.sign() < 0) { - if (!((pidFlag == 5) || (pidFlag == 11) || (pidFlag == 13) || (pidFlag == 14))) { + if (!((pidFlag == pid_flags::kKaonITSleft) || (pidFlag == pid_flags::kPionKaonITSleft) || (pidFlag == pid_flags::kKaonProtonITSleft) || (pidFlag == pid_flags::kPionKaonProtonITSleft))) { if (cfgOpenPtEtaPhi) { vhistPhiPtEtaNegKaCen[currentBin]->Fill(trk.phi(), trk.pt(), trk.eta()); } @@ -1850,9 +1886,9 @@ struct QAProcessCent { } } if (cfgOpenPr) { - if ((pidFlag == 3) || (pidFlag == 6) || (pidFlag == 8) || (pidFlag == 9) || (pidFlag == 10) || (pidFlag == 12) || (pidFlag == 13) || (pidFlag == 14)) { + if ((pidFlag == pid_flags::kProton) || (pidFlag == pid_flags::kProtonITSleft) || (pidFlag == pid_flags::kPionProton) || (pidFlag == pid_flags::kKaonProton) || (pidFlag == pid_flags::kPionKaonProton) || (pidFlag == pid_flags::kPionProtonITSleft) || (pidFlag == pid_flags::kKaonProtonITSleft) || (pidFlag == pid_flags::kPionKaonProtonITSleft)) { if (trk.sign() > 0) { - if (!((pidFlag == 6) || (pidFlag == 12) || (pidFlag == 13) || (pidFlag == 14))) { + if (!((pidFlag == pid_flags::kProtonITSleft) || (pidFlag == pid_flags::kPionProtonITSleft) || (pidFlag == pid_flags::kKaonProtonITSleft) || (pidFlag == pid_flags::kPionKaonProtonITSleft))) { if (cfgOpenPtEtaPhi) { vhistPhiPtEtaPosPrCen[currentBin]->Fill(trk.phi(), trk.pt(), trk.eta()); } @@ -1884,7 +1920,7 @@ struct QAProcessCent { vhistnSigmaTOFTPCPtPosPrBeforeCen[currentBin]->Fill(trk.nSigmaPrTOF(), trk.nSigmaPrTPC(), trk.pt()); } } else if (trk.sign() < 0) { - if (!((pidFlag == 6) || (pidFlag == 12) || (pidFlag == 13) || (pidFlag == 14))) { + if (!((pidFlag == pid_flags::kProtonITSleft) || (pidFlag == pid_flags::kPionProtonITSleft) || (pidFlag == pid_flags::kKaonProtonITSleft) || (pidFlag == pid_flags::kPionKaonProtonITSleft))) { if (cfgOpenPtEtaPhi) { vhistPhiPtEtaNegPrCen[currentBin]->Fill(trk.phi(), trk.pt(), trk.eta()); } @@ -1924,7 +1960,7 @@ struct QAProcessCent { } }; -struct pidcme { // o2-linter: disable=name/struct(keep the saving dir name for offline analysis) +struct FlowPidCme { HistogramRegistry histosQA{"histosmain", {}, OutputObjHandlingPolicy::AnalysisObject}; Configurable> cfgnMods{"cfgnMods", {2}, "Modulation of interest"}; @@ -2055,9 +2091,9 @@ struct pidcme { // o2-linter: disable=name/struct(keep the saving dir name for o Filter etafilter = aod::track::eta < cfgMaxEta; Filter properPIDfilter = aod::cme_track_pid_columns::nPidFlag >= (int8_t)0; - Partition>> tracksSet1 = ((aod::cme_track_pid_columns::nPidFlag == 1) || (aod::cme_track_pid_columns::nPidFlag == 7) || (aod::cme_track_pid_columns::nPidFlag == 8) || (aod::cme_track_pid_columns::nPidFlag == 10)); - Partition>> tracksSet2 = ((aod::cme_track_pid_columns::nPidFlag == 2) || (aod::cme_track_pid_columns::nPidFlag == 7) || (aod::cme_track_pid_columns::nPidFlag == 9) || (aod::cme_track_pid_columns::nPidFlag == 10)); - Partition>> tracksSet3 = ((aod::cme_track_pid_columns::nPidFlag == 3) || (aod::cme_track_pid_columns::nPidFlag == 8) || (aod::cme_track_pid_columns::nPidFlag == 9) || (aod::cme_track_pid_columns::nPidFlag == 10)); + Partition>> tracksSet1 = ((aod::cme_track_pid_columns::nPidFlag == pid_flags::kPion) || (aod::cme_track_pid_columns::nPidFlag == pid_flags::kPionKaon) || (aod::cme_track_pid_columns::nPidFlag == pid_flags::kPionProton) || (aod::cme_track_pid_columns::nPidFlag == pid_flags::kPionKaonProton)); + Partition>> tracksSet2 = ((aod::cme_track_pid_columns::nPidFlag == pid_flags::kKaon) || (aod::cme_track_pid_columns::nPidFlag == pid_flags::kPionKaon) || (aod::cme_track_pid_columns::nPidFlag == pid_flags::kKaonProton) || (aod::cme_track_pid_columns::nPidFlag == pid_flags::kPionKaonProton)); + Partition>> tracksSet3 = ((aod::cme_track_pid_columns::nPidFlag == pid_flags::kProton) || (aod::cme_track_pid_columns::nPidFlag == pid_flags::kPionProton) || (aod::cme_track_pid_columns::nPidFlag == pid_flags::kKaonProton) || (aod::cme_track_pid_columns::nPidFlag == pid_flags::kPionKaonProton)); void init(InitContext const&) { @@ -2561,7 +2597,7 @@ struct pidcme { // o2-linter: disable=name/struct(keep the saving dir name for o if (cfgOpenEvSelMultCorrelationGlobalTracks) { histosQA.fill(HIST("QA/histEventCountDetail"), 9.5); } - if (cfgOpenEvSelV0AT0ACut && (std::fabs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > 5 * fT0AV0ASigma->Eval(collision.multFT0A()))) { + if (cfgOpenEvSelV0AT0ACut && (std::fabs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > event_selection::kFT0AV0ASigma * fT0AV0ASigma->Eval(collision.multFT0A()))) { return 0; } if (cfgOpenEvSelV0AT0ACut) { @@ -2608,7 +2644,7 @@ struct pidcme { // o2-linter: disable=name/struct(keep the saving dir name for o } } if ((cenBin >= 0) && (ptBin >= 0)) { - if ((track.nPidFlag() == 3) || (track.nPidFlag() == 8) || (track.nPidFlag() == 9) || (track.nPidFlag() == 10)) { + if ((track.nPidFlag() == pid_flags::kProton) || (track.nPidFlag() == pid_flags::kPionProton) || (track.nPidFlag() == pid_flags::kKaonProton) || (track.nPidFlag() == pid_flags::kPionKaonProton)) { if (cfgkOpenDebugPIDCME) { LOGF(info, Form("=========cen_bin: %d pt_bin: %d=========", cenBin, ptBin)); } @@ -2646,7 +2682,7 @@ struct pidcme { // o2-linter: disable=name/struct(keep the saving dir name for o int detInd = detId * 4 + cfgnTotalSystem * 4 * (nmode - 2); int refAInd = refAId * 4 + cfgnTotalSystem * 4 * (nmode - 2); int refBInd = refBId * 4 + cfgnTotalSystem * 4 * (nmode - 2); - if (nmode == 2) { + if (nmode == fourier_mode::kMode2) { if (collision.qvecAmp()[detId] > 1e-8) { histosQA.fill(HIST("QA/histQvec_CorrL0_V2"), collision.qvecRe()[detInd], collision.qvecIm()[detInd], collision.centFT0C()); histosQA.fill(HIST("QA/histQvec_CorrL1_V2"), collision.qvecRe()[detInd + 1], collision.qvecIm()[detInd + 1], collision.centFT0C()); @@ -2678,7 +2714,7 @@ struct pidcme { // o2-linter: disable=name/struct(keep the saving dir name for o for (const auto& trk : track1) { if (!selTrack(trk, cent)) continue; - if (nmode == 2) { + if (nmode == fourier_mode::kMode2) { if (trk.sign() > 0) { histosQA.fill(HIST("V2/PID/histCosDetV2_Pi"), cent, trk.pt(), std::cos(static_cast(nmode) * (trk.phi() - psiN))); @@ -2715,7 +2751,7 @@ struct pidcme { // o2-linter: disable=name/struct(keep the saving dir name for o for (const auto& trk : track2) { if (!selTrack(trk, cent)) continue; - if (nmode == 2) { + if (nmode == fourier_mode::kMode2) { if (trk.sign() > 0) { histosQA.fill(HIST("V2/PID/histCosDetV2_Ka"), cent, trk.pt(), std::cos(static_cast(nmode) * (trk.phi() - psiN))); @@ -2752,7 +2788,7 @@ struct pidcme { // o2-linter: disable=name/struct(keep the saving dir name for o for (const auto& trk : track3) { if (!selTrack(trk, cent)) continue; - if (nmode == 2) { + if (nmode == fourier_mode::kMode2) { if (trk.sign() > 0) { histosQA.fill(HIST("V2/PID/histCosDetV2_Pr"), cent, trk.pt(), std::cos(static_cast(nmode) * (trk.phi() - psiN))); @@ -2797,7 +2833,7 @@ struct pidcme { // o2-linter: disable=name/struct(keep the saving dir name for o continue; if (!selTrack(trk2, cent)) continue; - if (nmode == 2) { + if (nmode == fourier_mode::kMode2) { if (trk1.sign() == trk2.sign()) { histosQA.fill(HIST("PIDCME/histgamma_PiPi_ss"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PiPi_ss"), cent, std::cos((trk1.phi() - trk2.phi()))); @@ -2876,7 +2912,7 @@ struct pidcme { // o2-linter: disable=name/struct(keep the saving dir name for o continue; if (!selTrack(trk2, cent)) continue; - if (nmode == 2) { + if (nmode == fourier_mode::kMode2) { if (trk1.sign() == trk2.sign()) { histosQA.fill(HIST("PIDCME/histgamma_KaKa_ss"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_KaKa_ss"), cent, std::cos((trk1.phi() - trk2.phi()))); @@ -2955,7 +2991,7 @@ struct pidcme { // o2-linter: disable=name/struct(keep the saving dir name for o continue; if (!selTrack(trk2, cent)) continue; - if (nmode == 2) { + if (nmode == fourier_mode::kMode2) { if (trk1.sign() == trk2.sign()) { histosQA.fill(HIST("PIDCME/histgamma_PrPr_ss"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PrPr_ss"), cent, std::cos((trk1.phi() - trk2.phi()))); @@ -3034,7 +3070,7 @@ struct pidcme { // o2-linter: disable=name/struct(keep the saving dir name for o continue; if (!selTrack(trk2, cent)) continue; - if (nmode == 2) { + if (nmode == fourier_mode::kMode2) { if (trk1.sign() == trk2.sign()) { histosQA.fill(HIST("PIDCME/histgamma_PiKa_ss"), cent, std::cos((trk1.phi() + trk2.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PiKa_ss"), cent, std::cos((trk1.phi() - trk2.phi()))); @@ -3113,7 +3149,7 @@ struct pidcme { // o2-linter: disable=name/struct(keep the saving dir name for o continue; if (!selTrack(trk3, cent)) continue; - if (nmode == 2) { + if (nmode == fourier_mode::kMode2) { if (trk1.sign() == trk3.sign()) { histosQA.fill(HIST("PIDCME/histgamma_PiPr_ss"), cent, std::cos((trk1.phi() + trk3.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_PiPr_ss"), cent, std::cos((trk1.phi() - trk3.phi()))); @@ -3192,7 +3228,7 @@ struct pidcme { // o2-linter: disable=name/struct(keep the saving dir name for o continue; if (!selTrack(trk3, cent)) continue; - if (nmode == 2) { + if (nmode == fourier_mode::kMode2) { if (trk2.sign() == trk3.sign()) { histosQA.fill(HIST("PIDCME/histgamma_KaPr_ss"), cent, std::cos((trk2.phi() + trk3.phi() - static_cast(nmode) * psiN))); histosQA.fill(HIST("PIDCME/histdelta_KaPr_ss"), cent, std::cos((trk2.phi() - trk3.phi()))); @@ -3317,6 +3353,8 @@ struct pidcme { // o2-linter: disable=name/struct(keep the saving dir name for o mult3 = tracks3.size(); if (mult1 < 1 || mult2 < 1 || mult3 < 1) // Reject Collisions without sufficient particles return; + const float cenPlotMin = 20; + const float cenPlotMax = 30; for (auto i = 0; i < static_cast(cfgnMods->size()); i++) { int detIndGlobal = detId * 4 + cfgnTotalSystem * 4 * (cfgnMods->at(i) - 2); float psiNGlobal = helperEP.GetEventPlane(collision.qvecRe()[detIndGlobal + 3], collision.qvecIm()[detIndGlobal + 3], cfgnMods->at(i)); @@ -3324,8 +3362,8 @@ struct pidcme { // o2-linter: disable=name/struct(keep the saving dir name for o if (!selTrack(trk, cent)) continue; if (cfgkOpenTPCITSPurityCut && cfgkOpenTPCITSPurityCutQA) { - if (cent >= 20 && cent < 30) { - if ((trk.nPidFlag() == 3) || (trk.nPidFlag() == 8) || (trk.nPidFlag() == 9) || (trk.nPidFlag() == 10)) { + if (cent >= cenPlotMin && cent < cenPlotMax) { + if ((trk.nPidFlag() == pid_flags::kProton) || (trk.nPidFlag() == pid_flags::kPionProton) || (trk.nPidFlag() == pid_flags::kKaonProton) || (trk.nPidFlag() == pid_flags::kPionKaonProton)) { if (trk.sign() > 0) { histosQA.fill(HIST("QA/histITSPuritycheck_Pr_Pos_Cen_20_30"), trk.nSigmaPrTPC(), trk.nSigmaPrITS(), trk.pt()); } else { @@ -3341,7 +3379,7 @@ struct pidcme { // o2-linter: disable=name/struct(keep the saving dir name for o std::cos(static_cast(cfgnMods->at(i)) * (trk.phi() - psiNGlobal))); } } - if (cfgkOpenCME && cfgkOpenHaHa && cfgnMods->at(i) == 2) { + if (cfgkOpenCME && cfgkOpenHaHa && cfgnMods->at(i) == fourier_mode::kMode2) { for (const auto& trk1 : tracks) { if (!selTrack(trk1, cent)) continue; @@ -3429,6 +3467,6 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) return WorkflowSpec{ adaptAnalysisTask(cfgc), adaptAnalysisTask(cfgc), - adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc), }; } From 2e9202218aa4394f96d925c53b91ee2b7944f07c Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Sun, 27 Apr 2025 21:16:29 +0900 Subject: [PATCH 1110/1650] [PWGEM/Dilepton] update matchingMFT.cxx (#10997) --- PWGEM/Dilepton/Tasks/matchingMFT.cxx | 123 ++++++++++++++++++++++----- 1 file changed, 102 insertions(+), 21 deletions(-) diff --git a/PWGEM/Dilepton/Tasks/matchingMFT.cxx b/PWGEM/Dilepton/Tasks/matchingMFT.cxx index 895cbad111a..f1746d1a2b0 100644 --- a/PWGEM/Dilepton/Tasks/matchingMFT.cxx +++ b/PWGEM/Dilepton/Tasks/matchingMFT.cxx @@ -13,6 +13,7 @@ /// \brief a task to study matching MFT-[MCH-MID] in MC /// \author daiki.sekihata@cern.ch +#include #include #include #include @@ -67,12 +68,15 @@ struct matchingMFT { Configurable maxPDCAforLargeR{"maxPDCAforLargeR", 324.f, "max. pDCA for large R at absorber end"}; Configurable maxPDCAforSmallR{"maxPDCAforSmallR", 594.f, "max. pDCA for small R at absorber end"}; Configurable maxMatchingChi2MCHMFT{"maxMatchingChi2MCHMFT", 1e+10, "max. chi2 for MCH-MFT matching"}; - Configurable maxChi2SA{"maxChi2SA", 1e+6, "max. chi2 for standalone muon"}; - Configurable maxChi2GL{"maxChi2GL", 1e+6, "max. chi2 for global muon"}; - // Configurable maxChi2MFT{"maxChi2MFT", 1e+6, "max. chi2/ndf for MFT track in global muon"}; + Configurable maxChi2SA{"maxChi2SA", 1e+6f, "max. chi2 for standalone muon"}; + Configurable maxChi2GL{"maxChi2GL", 1e+6f, "max. chi2 for global muon"}; + Configurable maxChi2MFT{"maxChi2MFT", 1e+6f, "max. chi2/ndf for MFT track in global muon"}; Configurable minNclustersMFT{"minNclustersMFT", 5, "min nclusters MFT"}; Configurable refitGlobalMuon{"refitGlobalMuon", true, "flag to refit global muon"}; Configurable requireTrueAssociation{"requireTrueAssociation", false, "flag to require true mc collision association"}; + Configurable maxDEta{"maxDEta", 1e+10f, "max. deta between MFT-MCH-MID and MCH-MID"}; + Configurable maxDPhi{"maxDPhi", 1e+10f, "max. dphi between MFT-MCH-MID and MCH-MID"}; + Configurable> requireMFTDisks{"requireMFTDisks", std::vector{0}, "hit map on MFT disks [0,1,2,3,4]. logical-OR of each double-sided disk"}; Configurable cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"}; Configurable cfgCentMin{"cfgCentMin", -1.f, "min. centrality"}; @@ -147,14 +151,16 @@ struct matchingMFT { fRegistry.add("MFTMCHMID/primary/correct/hPt", "pT;p_{T} (GeV/c)", kTH1F, {{100, 0.0f, 10}}, false); fRegistry.add("MFTMCHMID/primary/correct/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {100, -6.f, -1.f}}, false); fRegistry.add("MFTMCHMID/primary/correct/hEtaPhi_MatchedMCHMID", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {100, -6.f, -1.f}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hDeltaEtaDeltaPhi", "#Delta#eta vs. #Delta#varphi;#Delta#varphi (rad.);#Delta#eta", kTH2F, {{180, -M_PI / 2, M_PI / 2}, {200, -1.f, +1.f}}, false); fRegistry.add("MFTMCHMID/primary/correct/hDiffCollId", "difference in collision index;collisionId_{TTCA} - collisionId_{MP}", kTH1F, {{41, -20.5, +20.5}}, false); fRegistry.add("MFTMCHMID/primary/correct/hSign", "sign;sign", kTH1F, {{3, -1.5, +1.5}}, false); fRegistry.add("MFTMCHMID/primary/correct/hNclusters", "Nclusters;Nclusters", kTH1F, {{21, -0.5f, 20.5}}, false); fRegistry.add("MFTMCHMID/primary/correct/hNclustersMFT", "NclustersMFT;Nclusters MFT", kTH1F, {{11, -0.5f, 10.5}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hMFTClusterMap", "MFT cluster map", kTH1F, {{1024, -0.5, 1023.5}}, false); fRegistry.add("MFTMCHMID/primary/correct/hRatAbsorberEnd", "R at absorber end;R at absorber end (cm)", kTH1F, {{100, 0.0f, 100}}, false); fRegistry.add("MFTMCHMID/primary/correct/hPDCA_Rabs", "pDCA vs. Rabs;R at absorber end (cm);p #times DCA (GeV/c #upoint cm)", kTH2F, {{100, 0, 100}, {100, 0.0f, 1000}}, false); fRegistry.add("MFTMCHMID/primary/correct/hChi2", "chi2;chi2", kTH1F, {{100, 0.0f, 100}}, false); - fRegistry.add("MFTMCHMID/primary/correct/hChi2MFT", "chi2 MFT;chi2 MFT", kTH1F, {{100, 0.0f, 100}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hChi2MFT", "chi2 MFT/ndf;chi2 MFT/ndf", kTH1F, {{100, 0.0f, 10}}, false); fRegistry.add("MFTMCHMID/primary/correct/hChi2MatchMCHMID", "chi2 match MCH-MID;chi2", kTH1F, {{100, 0.0f, 100}}, false); fRegistry.add("MFTMCHMID/primary/correct/hChi2MatchMCHMFT", "chi2 match MCH-MFT;chi2", kTH1F, {{100, 0.0f, 100}}, false); fRegistry.add("MFTMCHMID/primary/correct/hDCAxy2D", "DCA x vs. y;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -0.5, 0.5}, {200, -0.5, +0.5}}, false); @@ -165,11 +171,16 @@ struct matchingMFT { fRegistry.add("MFTMCHMID/primary/correct/hDCAxResolutionvsPt", "DCA_{x} resolution vs. p_{T};p_{T} (GeV/c);DCA_{x} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 500}}, false); fRegistry.add("MFTMCHMID/primary/correct/hDCAyResolutionvsPt", "DCA_{y} resolution vs. p_{T};p_{T} (GeV/c);DCA_{y} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 500}}, false); fRegistry.add("MFTMCHMID/primary/correct/hDCAxyResolutionvsPt", "DCA_{xy} resolution vs. p_{T};p_{T} (GeV/c);DCA_{xy} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 500}}, false); - fRegistry.add("MFTMCHMID/primary/correct/hRelDeltaPt", "pT resolution;p_{T}^{gen} (GeV/c);(p_{T}^{rec} - p_{T}^{gen})/p_{T}^{gen}", kTH2F, {{100, 0, 10}, {400, -1, +1}}, true); - fRegistry.add("MFTMCHMID/primary/correct/hDeltaEta_Pos", "#eta resolution;p_{T}^{gen} (GeV/c);#eta^{rec} - #eta^{gen}", kTH2F, {{100, 0, 10}, {400, -0.2, +0.2}}, true); - fRegistry.add("MFTMCHMID/primary/correct/hDeltaEta_Neg", "#eta resolution;p_{T}^{gen} (GeV/c);#eta^{rec} - #eta^{gen}", kTH2F, {{100, 0, 10}, {400, -0.2, +0.2}}, true); - fRegistry.add("MFTMCHMID/primary/correct/hDeltaPhi_Pos", "#varphi resolution;p_{T}^{gen} (GeV/c);#varphi^{rec} - #varphi^{gen} (rad.)", kTH2F, {{100, 0, 10}, {400, -0.2, +0.2}}, true); - fRegistry.add("MFTMCHMID/primary/correct/hDeltaPhi_Neg", "#varphi resolution;p_{T}^{gen} (GeV/c);#varphi^{rec} - #varphi^{gen} (rad.)", kTH2F, {{100, 0, 10}, {400, -0.2, +0.2}}, true); + fRegistry.add("MFTMCHMID/primary/correct/hDCAxResolutionvsP", "DCA_{x} resolution vs. p;p (GeV/c);DCA_{x} resolution (#mum);", kTH2F, {{100, 0, 100.f}, {500, 0, 500}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hDCAyResolutionvsP", "DCA_{y} resolution vs. p;p (GeV/c);DCA_{y} resolution (#mum);", kTH2F, {{100, 0, 100.f}, {500, 0, 500}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hDCAxyResolutionvsP", "DCA_{xy} resolution vs. p;p (GeV/c);DCA_{xy} resolution (#mum);", kTH2F, {{100, 0, 100.f}, {500, 0, 500}}, false); + + fRegistry.add("MFTMCHMID/primary/correct/hProdVtxZ", "prod. vtx Z of muon;V_{z} (cm)", kTH1F, {{200, -100, 100}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hRelDeltaPt", "pT resolution;p_{T}^{gen} (GeV/c);(p_{T}^{rec} - p_{T}^{gen})/p_{T}^{gen}", kTH2F, {{100, 0, 10}, {400, -1, +1}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hDeltaEta_Pos", "#eta resolution;p_{T}^{gen} (GeV/c);#eta^{rec} - #eta^{gen}", kTH2F, {{100, 0, 10}, {400, -0.2, +0.2}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hDeltaEta_Neg", "#eta resolution;p_{T}^{gen} (GeV/c);#eta^{rec} - #eta^{gen}", kTH2F, {{100, 0, 10}, {400, -0.2, +0.2}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hDeltaPhi_Pos", "#varphi resolution;p_{T}^{gen} (GeV/c);#varphi^{rec} - #varphi^{gen} (rad.)", kTH2F, {{100, 0, 10}, {400, -0.2, +0.2}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hDeltaPhi_Neg", "#varphi resolution;p_{T}^{gen} (GeV/c);#varphi^{rec} - #varphi^{gen} (rad.)", kTH2F, {{100, 0, 10}, {400, -0.2, +0.2}}, false); fRegistry.addClone("MFTMCHMID/primary/correct/", "MFTMCHMID/primary/wrong/"); fRegistry.addClone("MFTMCHMID/primary/", "MFTMCHMID/secondary/"); @@ -212,6 +223,33 @@ struct matchingMFT { return true; } + template + uint16_t mftClusterMap(T const& track) + { + uint64_t mftClusterSizesAndTrackFlags = track.mftClusterSizesAndTrackFlags(); + uint16_t clmap = 0; + for (unsigned int layer = 0; layer < 10; layer++) { + if ((mftClusterSizesAndTrackFlags >> (layer * 6)) & 0x3f) { + clmap |= (1 << layer); + } + } + return clmap; + } + + template + bool hasMFT(T const& track) + { + // logical-OR + uint64_t mftClusterSizesAndTrackFlags = track.mftClusterSizesAndTrackFlags(); + uint16_t clmap = 0; + for (unsigned int layer = begin; layer <= end; layer++) { + if ((mftClusterSizesAndTrackFlags >> (layer * 6)) & 0x3f) { + clmap |= (1 << layer); + } + } + return (clmap > 0); + } + template void fillHistograms(TCollision const& collision, TFwdTrack fwdtrack, TFwdTracks const&, TMFTTracks const&) { @@ -258,6 +296,7 @@ struct matchingMFT { o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon(fwdtrack, collision, propagationPoint::kToVertex); o2::dataformats::GlobalFwdTrack propmuonAtDCA = propagateMuon(fwdtrack, collision, propagationPoint::kToDCA); + float p = propmuonAtPV.getP(); float pt = propmuonAtPV.getPt(); float eta = propmuonAtPV.getEta(); float phi = propmuonAtPV.getPhi(); @@ -272,15 +311,26 @@ struct matchingMFT { float rAtAbsorberEnd = fwdtrack.rAtAbsorberEnd(); // this works only for GlobalMuonTrack float dcaXY = std::sqrt(dcaX * dcaX + dcaY * dcaY); float dcaZ = -dcaXY * std::sinh(eta); + float det = cXXatDCA * cYYatDCA - cXYatDCA * cXYatDCA; // determinanat - float dFdx = dcaX / dcaXY; - float dFdy = dcaY / dcaXY; - float sigma_dcaXY = std::sqrt(cXXatDCA * dFdx * dFdx + cYYatDCA * dFdy * dFdy + 2.f * cXYatDCA * dFdx * dFdy); + float dcaXYinSigma = 999.f; + if (det < 0) { + dcaXYinSigma = 999.f; + } else { + dcaXYinSigma = std::sqrt(std::fabs((dcaX * dcaX * cYYatDCA + dcaY * dcaY * cXXatDCA - 2. * dcaX * dcaY * cXYatDCA) / det / 2.)); // dca xy in sigma + } + float sigma_dcaXY = dcaXY / dcaXYinSigma; o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToVertex); float etaMatchedMCHMID = propmuonAtPV_Matched.getEta(); float phiMatchedMCHMID = propmuonAtPV_Matched.getPhi(); o2::math_utils::bringTo02Pi(phiMatchedMCHMID); + float deta = etaMatchedMCHMID - eta; + float dphi = phiMatchedMCHMID - phi; + o2::math_utils::bringToPMPi(dphi); + if (std::sqrt(std::pow(deta / maxDEta, 2) + std::pow(dphi / maxDPhi, 2)) > 1.f) { + return; + } o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToDCA); float dcaX_Matched = propmuonAtDCA_Matched.getX() - collision.posX(); @@ -288,11 +338,11 @@ struct matchingMFT { float dcaXY_Matched = std::sqrt(dcaX_Matched * dcaX_Matched + dcaY_Matched * dcaY_Matched); float pDCA = mchtrack.p() * dcaXY_Matched; int nClustersMFT = mfttrack.nClusters(); - // float chi2mft = mfttrack.chi2()/(2.f * nClustersMFT - 5.f); - float chi2mft = mfttrack.chi2(); - // if (chi2mft < 0.f || maxChi2MFT < chi2mft) { - // return; - // } + float chi2mft = mfttrack.chi2() / (2.f * nClustersMFT - 5.f); + // float chi2mft = mfttrack.chi2(); + if (chi2mft < 0.f || maxChi2MFT < chi2mft) { + return; + } if (refitGlobalMuon) { eta = mfttrack.eta(); @@ -305,16 +355,25 @@ struct matchingMFT { return; } + std::vector hasMFTs{hasMFT<0, 1>(mfttrack), hasMFT<2, 3>(mfttrack), hasMFT<4, 5>(mfttrack), hasMFT<6, 7>(mfttrack), hasMFT<8, 9>(mfttrack)}; + for (int i = 0; i < static_cast(requireMFTDisks->size()); i++) { + if (!hasMFTs[requireMFTDisks->at(i)]) { + return; + } + } + fRegistry.fill(HIST("hMuonType"), fwdtrack.trackType()); if (isPrimary) { if (isMatched) { fRegistry.fill(HIST("MFTMCHMID/primary/correct/hPt"), pt); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hEtaPhi"), phi, eta); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDeltaEtaDeltaPhi"), dphi, deta); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hSign"), fwdtrack.sign()); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hNclusters"), fwdtrack.nClusters()); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hNclustersMFT"), nClustersMFT); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hMFTClusterMap"), mftClusterMap(mfttrack)); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hPDCA_Rabs"), rAtAbsorberEnd, pDCA); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hRatAbsorberEnd"), rAtAbsorberEnd); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hChi2"), fwdtrack.chi2()); @@ -325,10 +384,14 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAz"), dcaZ); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxy2DinSigma"), dcaX / std::sqrt(cXXatDCA), dcaY / std::sqrt(cYYatDCA)); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxy"), dcaXY); - fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxyinSigma"), dcaXY / sigma_dcaXY); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxyinSigma"), dcaXYinSigma); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxResolutionvsPt"), pt, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAyResolutionvsPt"), pt, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxyResolutionvsPt"), pt, sigma_dcaXY * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxResolutionvsP"), p, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAyResolutionvsP"), p, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxyResolutionvsP"), p, sigma_dcaXY * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hProdVtxZ"), mcParticle_MFTMCHMID.vz()); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hRelDeltaPt"), mcParticle_MFTMCHMID.pt(), (pt - mcParticle_MFTMCHMID.pt()) / mcParticle_MFTMCHMID.pt()); if (mcParticle_MFTMCHMID.pdgCode() > 0) { @@ -342,10 +405,12 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hPt"), pt); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hEtaPhi"), phi, eta); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDeltaEtaDeltaPhi"), dphi, deta); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hSign"), fwdtrack.sign()); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hNclusters"), fwdtrack.nClusters()); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hNclustersMFT"), nClustersMFT); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hMFTClusterMap"), mftClusterMap(mfttrack)); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hPDCA_Rabs"), rAtAbsorberEnd, pDCA); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hRatAbsorberEnd"), rAtAbsorberEnd); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hChi2"), fwdtrack.chi2()); @@ -356,10 +421,14 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAz"), dcaZ); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxy2DinSigma"), dcaX / std::sqrt(cXXatDCA), dcaY / std::sqrt(cYYatDCA)); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxy"), dcaXY); - fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxyinSigma"), dcaXY / sigma_dcaXY); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxyinSigma"), dcaXYinSigma); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxResolutionvsPt"), pt, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAyResolutionvsPt"), pt, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxyResolutionvsPt"), pt, sigma_dcaXY * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxResolutionvsP"), p, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAyResolutionvsP"), p, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxyResolutionvsP"), p, sigma_dcaXY * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hProdVtxZ"), mcParticle_MFTMCHMID.vz()); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hRelDeltaPt"), mcParticle_MFTMCHMID.pt(), (pt - mcParticle_MFTMCHMID.pt()) / mcParticle_MFTMCHMID.pt()); if (mcParticle_MFTMCHMID.pdgCode() > 0) { fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDeltaEta_Neg"), mcParticle_MFTMCHMID.pt(), eta - mcParticle_MFTMCHMID.eta()); @@ -374,10 +443,12 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hPt"), pt); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hEtaPhi"), phi, eta); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDeltaEtaDeltaPhi"), dphi, deta); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hSign"), fwdtrack.sign()); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hNclusters"), fwdtrack.nClusters()); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hNclustersMFT"), nClustersMFT); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hMFTClusterMap"), mftClusterMap(mfttrack)); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hPDCA_Rabs"), rAtAbsorberEnd, pDCA); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hRatAbsorberEnd"), rAtAbsorberEnd); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hChi2"), fwdtrack.chi2()); @@ -388,10 +459,14 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAz"), dcaZ); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxy2DinSigma"), dcaX / std::sqrt(cXXatDCA), dcaY / std::sqrt(cYYatDCA)); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxy"), dcaXY); - fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxyinSigma"), dcaXY / sigma_dcaXY); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxyinSigma"), dcaXYinSigma); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxResolutionvsPt"), pt, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAyResolutionvsPt"), pt, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxyResolutionvsPt"), pt, sigma_dcaXY * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxResolutionvsP"), p, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAyResolutionvsP"), p, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxyResolutionvsP"), p, sigma_dcaXY * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hProdVtxZ"), mcParticle_MFTMCHMID.vz()); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hRelDeltaPt"), mcParticle_MFTMCHMID.pt(), (pt - mcParticle_MFTMCHMID.pt()) / mcParticle_MFTMCHMID.pt()); if (mcParticle_MFTMCHMID.pdgCode() > 0) { fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDeltaEta_Neg"), mcParticle_MFTMCHMID.pt(), eta - mcParticle_MFTMCHMID.eta()); @@ -404,10 +479,12 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hPt"), pt); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hEtaPhi"), phi, eta); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDeltaEtaDeltaPhi"), dphi, deta); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hSign"), fwdtrack.sign()); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hNclusters"), fwdtrack.nClusters()); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hNclustersMFT"), nClustersMFT); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hMFTClusterMap"), mftClusterMap(mfttrack)); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hPDCA_Rabs"), rAtAbsorberEnd, pDCA); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hRatAbsorberEnd"), rAtAbsorberEnd); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hChi2"), fwdtrack.chi2()); @@ -418,10 +495,14 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAz"), dcaZ); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxy2DinSigma"), dcaX / std::sqrt(cXXatDCA), dcaY / std::sqrt(cYYatDCA)); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxy"), dcaXY); - fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxyinSigma"), dcaXY / sigma_dcaXY); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxyinSigma"), dcaXYinSigma); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxResolutionvsPt"), pt, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAyResolutionvsPt"), pt, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxyResolutionvsPt"), pt, sigma_dcaXY * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxResolutionvsP"), p, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAyResolutionvsP"), p, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxyResolutionvsP"), p, sigma_dcaXY * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hProdVtxZ"), mcParticle_MFTMCHMID.vz()); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hRelDeltaPt"), mcParticle_MFTMCHMID.pt(), (pt - mcParticle_MFTMCHMID.pt()) / mcParticle_MFTMCHMID.pt()); if (mcParticle_MFTMCHMID.pdgCode() > 0) { fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDeltaEta_Neg"), mcParticle_MFTMCHMID.pt(), eta - mcParticle_MFTMCHMID.eta()); From 8f8bd011feac2a19c6b71a66f751764826e75db4 Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Sun, 27 Apr 2025 18:19:29 +0200 Subject: [PATCH 1111/1650] [PWGCF,Trigger] Make sure that all events have a decision (#10999) --- EventFiltering/PWGCF/CFFilterAll.cxx | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/EventFiltering/PWGCF/CFFilterAll.cxx b/EventFiltering/PWGCF/CFFilterAll.cxx index 04c52fe92ce..4df821ec669 100644 --- a/EventFiltering/PWGCF/CFFilterAll.cxx +++ b/EventFiltering/PWGCF/CFFilterAll.cxx @@ -1267,11 +1267,27 @@ struct CFFilterAll { auto tracksWithItsPid = soa::Attach(tracks); + // reset all arrays + keepEventTightLimit.fill(false); + keepEventLooseLimit.fill(false); + signalTightLimit.fill(0); + signalLooseLimit.fill(0); + registryTriggerQA.fill(HIST("fProcessedEvents"), 0); registryParticleQA.fill(HIST("EventQA/Before/fMultiplicity"), col.multNTracksPV()); registryParticleQA.fill(HIST("EventQA/Before/fZvtx"), col.posZ()); if (!checkEvent(col)) { + tags(keepEventTightLimit[cf_trigger::kPPP], keepEventLooseLimit[cf_trigger::kPPP], + keepEventTightLimit[cf_trigger::kPPL], keepEventLooseLimit[cf_trigger::kPPL], + keepEventTightLimit[cf_trigger::kPLL], keepEventLooseLimit[cf_trigger::kPLL], + keepEventTightLimit[cf_trigger::kLLL], keepEventLooseLimit[cf_trigger::kLLL], + keepEventTightLimit[cf_trigger::kPPPhi], keepEventLooseLimit[cf_trigger::kPPPhi], + keepEventTightLimit[cf_trigger::kPPRho], keepEventLooseLimit[cf_trigger::kPPRho], + keepEventTightLimit[cf_trigger::kPD], keepEventLooseLimit[cf_trigger::kPD], + keepEventTightLimit[cf_trigger::kLD], keepEventLooseLimit[cf_trigger::kLD], + keepEventTightLimit[cf_trigger::kPhiD], keepEventLooseLimit[cf_trigger::kPhiD], + keepEventTightLimit[cf_trigger::kRhoD], keepEventLooseLimit[cf_trigger::kRhoD]); return; } @@ -1817,12 +1833,6 @@ struct CFFilterAll { } } - // reset all arrays - keepEventTightLimit.fill(false); - keepEventLooseLimit.fill(false); - signalTightLimit.fill(0); - signalLooseLimit.fill(0); - float q3 = 999.f, kstar = 999.f; // PPP From 894343d16d312c92973e924b0c2c2ba9d1f73ad8 Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Sun, 27 Apr 2025 19:00:18 +0200 Subject: [PATCH 1112/1650] [Trigger] Fix description of doublephi filter table (#11000) --- EventFiltering/filterTables.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/EventFiltering/filterTables.h b/EventFiltering/filterTables.h index a5486b60984..52256f47e96 100644 --- a/EventFiltering/filterTables.h +++ b/EventFiltering/filterTables.h @@ -331,7 +331,7 @@ DECLARE_SOA_TABLE(F1ProtonFilters, "AOD", "F1ProtonFilters", //! using F1ProtonFilter = F1ProtonFilters::iterator; // Double Phi -DECLARE_SOA_TABLE(DoublePhiFilters, "AOD", "DoublePhiFilters", //! +DECLARE_SOA_TABLE(DoublePhiFilters, "AOD", "DoublePhiFilter", //! filtering::TriggerEventDoublePhi); using DoublePhiFilter = DoublePhiFilters::iterator; @@ -366,8 +366,8 @@ using BCRange = BCRanges::iterator; /// List of the available filters, the description of their tables and the name of the tasks constexpr int NumberOfFilters{14}; -constexpr std::array AvailableFilters{"NucleiFilters", "DiffractionFilters", "DqFilters", "HfFilters", "CFFilters", "JetFilters", "JetHFFilters", "FullJetFilters", "StrangenessFilters", "MultFilters", "PhotonFilters", "F1ProtonFilters", "DoublePhiFilters", "HeavyNeutralMesonFilters"}; -constexpr std::array FilterDescriptions{"NucleiFilters", "DiffFilters", "DqFilters", "HfFilters", "CFFilters", "JetFilters", "JetHFFilters", "FullJetFilters", "LFStrgFilters", "MultFilters", "PhotonFilters", "F1ProtonFilters", "2PhiFilters", "HNMesonFilters"}; +constexpr std::array AvailableFilters{"NucleiFilters", "DiffractionFilters", "DqFilters", "HfFilters", "CFFilters", "JetFilters", "JetHFFilters", "FullJetFilters", "StrangenessFilters", "MultFilters", "PhotonFilters", "F1ProtonFilters", "DoublePhiFilter", "HeavyNeutralMesonFilters"}; +constexpr std::array FilterDescriptions{"NucleiFilters", "DiffFilters", "DqFilters", "HfFilters", "CFFilters", "JetFilters", "JetHFFilters", "FullJetFilters", "LFStrgFilters", "MultFilters", "PhotonFilters", "F1ProtonFilters", "DoublePhiFilter", "HNMesonFilters"}; constexpr std::array FilteringTaskNames{"o2-analysis-nuclei-filter", "o2-analysis-diffraction-filter", "o2-analysis-dq-filter-pp-with-association", "o2-analysis-hf-filter", "o2-analysis-cf-filter", "o2-analysis-je-filter", "o2-analysis-je-hf-filter", "o2-analysis-fje-filter", "o2-analysis-lf-strangeness-filter", "o2-analysis-mult-filter", "o2-analysis-em-photon-filter", "o2-analysis-lf-f1proton-filter", "o2-analysis-lf-doublephi-filter", "o2-analysis-heavy-meson-filter"}; constexpr o2::framework::pack FiltersPack; static_assert(o2::framework::pack_size(FiltersPack) == NumberOfFilters); From 8d2d526a3ae5cd4a4f6e7106c1d9810f9e173798 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Sun, 27 Apr 2025 23:44:57 +0200 Subject: [PATCH 1113/1650] [ALICE3] A3: event time and event time computation (#11001) --- ALICE3/DataModel/OTFTOF.h | 55 +- ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx | 629 ++++++++++++------- ALICE3/TableProducer/OTF/onTheFlyTracker.cxx | 5 +- ALICE3/Tasks/alice3-dilepton.cxx | 6 +- 4 files changed, 438 insertions(+), 257 deletions(-) diff --git a/ALICE3/DataModel/OTFTOF.h b/ALICE3/DataModel/OTFTOF.h index 57fd5bb8e8c..14fe00943b6 100644 --- a/ALICE3/DataModel/OTFTOF.h +++ b/ALICE3/DataModel/OTFTOF.h @@ -27,42 +27,55 @@ namespace o2::aod { namespace upgrade_tof { -DECLARE_SOA_COLUMN(NSigmaElectronInnerTOF, nSigmaElectronInnerTOF, float); //! NSigma electron InnerTOF -DECLARE_SOA_COLUMN(NSigmaMuonInnerTOF, nSigmaMuonInnerTOF, float); //! NSigma muon InnerTOF -DECLARE_SOA_COLUMN(NSigmaPionInnerTOF, nSigmaPionInnerTOF, float); //! NSigma pion InnerTOF -DECLARE_SOA_COLUMN(NSigmaKaonInnerTOF, nSigmaKaonInnerTOF, float); //! NSigma kaon InnerTOF -DECLARE_SOA_COLUMN(NSigmaProtonInnerTOF, nSigmaProtonInnerTOF, float); //! NSigma proton InnerTOF -DECLARE_SOA_COLUMN(InnerTOFTrackLength, innerTOFTrackLength, float); //! track length for calculation of InnerTOF -DECLARE_SOA_COLUMN(InnerTOFTrackLengthReco, innerTOFTrackLengthReco, float); //! track length for calculation of InnerTOF -DECLARE_SOA_COLUMN(DeltaTrackLengthInnerTOF, deltaTrackLengthInnerTOF, float); //! track length for calculation of InnerTOF -DECLARE_SOA_COLUMN(NSigmaElectronOuterTOF, nSigmaElectronOuterTOF, float); //! NSigma electron OuterTOF -DECLARE_SOA_COLUMN(NSigmaMuonOuterTOF, nSigmaMuonOuterTOF, float); //! NSigma muon OuterTOF -DECLARE_SOA_COLUMN(NSigmaPionOuterTOF, nSigmaPionOuterTOF, float); //! NSigma pion OuterTOF -DECLARE_SOA_COLUMN(NSigmaKaonOuterTOF, nSigmaKaonOuterTOF, float); //! NSigma kaon OuterTOF -DECLARE_SOA_COLUMN(NSigmaProtonOuterTOF, nSigmaProtonOuterTOF, float); //! NSigma proton OuterTOF -DECLARE_SOA_COLUMN(OuterTOFTrackLength, outerTOFTrackLength, float); //! track length for calculation of OuterTOF -DECLARE_SOA_COLUMN(OuterTOFTrackLengthReco, outerTOFTrackLengthReco, float); //! track length for calculation of OuterTOF -DECLARE_SOA_COLUMN(DeltaTrackLengthOuterTOF, deltaTrackLengthOuterTOF, float); //! track length for calculation of InnerTOF +DECLARE_SOA_COLUMN(InnerTOFTrackTime, innerTOFTrackTime, float); //! Track time generated at the InnerTOF +DECLARE_SOA_COLUMN(InnerTOFTrackLength, innerTOFTrackLength, float); //! track length for calculation of InnerTOF (generated) +DECLARE_SOA_COLUMN(OuterTOFTrackTime, outerTOFTrackTime, float); //! Track time generated at the OuterTOF +DECLARE_SOA_COLUMN(OuterTOFTrackLength, outerTOFTrackLength, float); //! track length for calculation of OuterTOF (generated) + +DECLARE_SOA_COLUMN(TOFEventTime, tofEventTime, float); //! Event time reconstructed with the TOF +DECLARE_SOA_COLUMN(TOFEventTimeErr, tofEventTimeErr, float); //! Uncertainty on the event time reconstructed with the TOF +DECLARE_SOA_COLUMN(NSigmaElectronInnerTOF, nSigmaElectronInnerTOF, float); //! NSigma electron InnerTOF +DECLARE_SOA_COLUMN(NSigmaMuonInnerTOF, nSigmaMuonInnerTOF, float); //! NSigma muon InnerTOF +DECLARE_SOA_COLUMN(NSigmaPionInnerTOF, nSigmaPionInnerTOF, float); //! NSigma pion InnerTOF +DECLARE_SOA_COLUMN(NSigmaKaonInnerTOF, nSigmaKaonInnerTOF, float); //! NSigma kaon InnerTOF +DECLARE_SOA_COLUMN(NSigmaProtonInnerTOF, nSigmaProtonInnerTOF, float); //! NSigma proton InnerTOF +DECLARE_SOA_COLUMN(InnerTOFTrackTimeReco, innerTOFTrackTimeReco, float); //! Track time measured at the InnerTOF +DECLARE_SOA_COLUMN(InnerTOFTrackLengthReco, innerTOFTrackLengthReco, float); //! track length for calculation of InnerTOF (reconstructed) +DECLARE_SOA_COLUMN(NSigmaElectronOuterTOF, nSigmaElectronOuterTOF, float); //! NSigma electron OuterTOF +DECLARE_SOA_COLUMN(NSigmaMuonOuterTOF, nSigmaMuonOuterTOF, float); //! NSigma muon OuterTOF +DECLARE_SOA_COLUMN(NSigmaPionOuterTOF, nSigmaPionOuterTOF, float); //! NSigma pion OuterTOF +DECLARE_SOA_COLUMN(NSigmaKaonOuterTOF, nSigmaKaonOuterTOF, float); //! NSigma kaon OuterTOF +DECLARE_SOA_COLUMN(NSigmaProtonOuterTOF, nSigmaProtonOuterTOF, float); //! NSigma proton OuterTOF +DECLARE_SOA_COLUMN(OuterTOFTrackTimeReco, outerTOFTrackTimeReco, float); //! Track time measured at the OuterTOF +DECLARE_SOA_COLUMN(OuterTOFTrackLengthReco, outerTOFTrackLengthReco, float); //! track length for calculation of OuterTOF (reconstructed) } // namespace upgrade_tof + +DECLARE_SOA_TABLE(UpgradeTofMCs, "AOD", "UPGRADETOFMC", + upgrade_tof::InnerTOFTrackTime, + upgrade_tof::InnerTOFTrackLength, + upgrade_tof::OuterTOFTrackTime, + upgrade_tof::OuterTOFTrackLength); + DECLARE_SOA_TABLE(UpgradeTofs, "AOD", "UPGRADETOF", + upgrade_tof::TOFEventTime, + upgrade_tof::TOFEventTimeErr, upgrade_tof::NSigmaElectronInnerTOF, upgrade_tof::NSigmaMuonInnerTOF, upgrade_tof::NSigmaPionInnerTOF, upgrade_tof::NSigmaKaonInnerTOF, upgrade_tof::NSigmaProtonInnerTOF, - upgrade_tof::InnerTOFTrackLength, + upgrade_tof::InnerTOFTrackTimeReco, upgrade_tof::InnerTOFTrackLengthReco, - upgrade_tof::DeltaTrackLengthInnerTOF, upgrade_tof::NSigmaElectronOuterTOF, upgrade_tof::NSigmaMuonOuterTOF, upgrade_tof::NSigmaPionOuterTOF, upgrade_tof::NSigmaKaonOuterTOF, upgrade_tof::NSigmaProtonOuterTOF, - upgrade_tof::OuterTOFTrackLength, - upgrade_tof::OuterTOFTrackLengthReco, - upgrade_tof::DeltaTrackLengthOuterTOF); + upgrade_tof::OuterTOFTrackTimeReco, + upgrade_tof::OuterTOFTrackLengthReco); using UpgradeTof = UpgradeTofs::iterator; +using UpgradeTofMC = UpgradeTofMCs::iterator; } // namespace o2::aod diff --git a/ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx b/ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx index 3a907d47342..fc9179e73dd 100644 --- a/ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx +++ b/ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx @@ -14,6 +14,9 @@ // #include +#include +#include +#include #include @@ -57,7 +60,8 @@ using namespace o2; using namespace o2::framework; -struct OnTheFlyTOFPID { +struct OnTheFlyTofPid { + Produces upgradeTofMC; Produces upgradeTof; // necessary for particle charges @@ -67,38 +71,43 @@ struct OnTheFlyTOFPID { // note that there are two layers foreseen for now: inner and outer TOF // more could be added (especially a disk TOF at a certain z?) // in the evolution of this effort - Configurable dBz{"dBz", 20, "magnetic field (kilogauss)"}; - Configurable innerTOFRadius{"innerTOFRadius", 20, "barrel inner TOF radius (cm)"}; - Configurable outerTOFRadius{"outerTOFRadius", 80, "barrel outer TOF radius (cm)"}; - Configurable innerTOFTimeReso{"innerTOFTimeReso", 20, "barrel inner TOF time error (ps)"}; - Configurable outerTOFTimeReso{"outerTOFTimeReso", 20, "barrel outer TOF time error (ps)"}; - Configurable nStepsLIntegrator{"nStepsLIntegrator", 200, "number of steps in length integrator"}; - Configurable doQAplots{"doQAplots", true, "do basic velocity plot qa"}; - Configurable nBinsBeta{"nBinsBeta", 2200, "number of bins in beta"}; - Configurable nBinsP{"nBinsP", 80, "number of bins in momentum"}; - Configurable nBinsTrackLengthInner{"nBinsTrackLengthInner", 300, "number of bins in track length"}; - Configurable nBinsTrackLengthOuter{"nBinsTrackLengthOuter", 300, "number of bins in track length"}; - Configurable nBinsTrackDeltaLength{"nBinsTrackDeltaLength", 100, "number of bins in delta track length"}; - Configurable nBinsNsigmaCorrectSpecies{"nBinsNsigmaCorrectSpecies", 200, "number of bins in Nsigma plot (correct speies)"}; - Configurable nBinsNsigmaWrongSpecies{"nBinsNsigmaWrongSpecies", 200, "number of bins in Nsigma plot (wrong species)"}; - Configurable minNsigmaRange{"minNsigmaRange", -10, "lower limit for the nsigma axis"}; - Configurable maxNsigmaRange{"maxNsigmaRange", +10, "upper limit for the nsigma axis"}; - Configurable nBinsTimeRes{"nBinsTimeRes", 400, "number of bins plots time resolution"}; - Configurable nBinsRelativeEtaPt{"nBinsRelativeEtaPt", 400, "number of bins plots pt and eta relative errors"}; - Configurable nBinsEta{"nBinsEta", 400, "number of bins plot relative eta error"}; - Configurable flagIncludeTrackTimeRes{"flagIncludeTrackTimeRes", true, "flag to include or exclude track time resolution"}; - Configurable multiplicityEtaRange{"multiplicityEtaRange", 0.800000012, "eta range to compute the multiplicity"}; - Configurable flagTOFLoadDelphesLUTs{"flagTOFLoadDelphesLUTs", false, "flag to load Delphes LUTs for tracking correction (use recoTrack parameters if false)"}; - - Configurable lutEl{"lutEl", "lutCovm.el.dat", "LUT for electrons"}; - Configurable lutMu{"lutMu", "lutCovm.mu.dat", "LUT for muons"}; - Configurable lutPi{"lutPi", "lutCovm.pi.dat", "LUT for pions"}; - Configurable lutKa{"lutKa", "lutCovm.ka.dat", "LUT for kaons"}; - Configurable lutPr{"lutPr", "lutCovm.pr.dat", "LUT for protons"}; + struct : ConfigurableGroup { + Configurable dBz{"dBz", 20, "magnetic field (kilogauss)"}; + Configurable considerEventTime{"considerEventTime", true, "flag to consider event time"}; + Configurable innerTOFRadius{"innerTOFRadius", 20, "barrel inner TOF radius (cm)"}; + Configurable outerTOFRadius{"outerTOFRadius", 80, "barrel outer TOF radius (cm)"}; + Configurable innerTOFTimeReso{"innerTOFTimeReso", 20, "barrel inner TOF time error (ps)"}; + Configurable outerTOFTimeReso{"outerTOFTimeReso", 20, "barrel outer TOF time error (ps)"}; + Configurable nStepsLIntegrator{"nStepsLIntegrator", 200, "number of steps in length integrator"}; + Configurable multiplicityEtaRange{"multiplicityEtaRange", 0.800000012, "eta range to compute the multiplicity"}; + Configurable flagIncludeTrackTimeRes{"flagIncludeTrackTimeRes", true, "flag to include or exclude track time resolution"}; + Configurable flagTOFLoadDelphesLUTs{"flagTOFLoadDelphesLUTs", false, "flag to load Delphes LUTs for tracking correction (use recoTrack parameters if false)"}; + Configurable lutEl{"lutEl", "lutCovm.el.dat", "LUT for electrons"}; + Configurable lutMu{"lutMu", "lutCovm.mu.dat", "LUT for muons"}; + Configurable lutPi{"lutPi", "lutCovm.pi.dat", "LUT for pions"}; + Configurable lutKa{"lutKa", "lutCovm.ka.dat", "LUT for kaons"}; + Configurable lutPr{"lutPr", "lutCovm.pr.dat", "LUT for protons"}; + } simConfig; + + struct : ConfigurableGroup { + Configurable doQAplots{"doQAplots", true, "do basic velocity plot qa"}; + Configurable nBinsBeta{"nBinsBeta", 2200, "number of bins in beta"}; + Configurable nBinsP{"nBinsP", 80, "number of bins in momentum"}; + Configurable nBinsTrackLengthInner{"nBinsTrackLengthInner", 300, "number of bins in track length"}; + Configurable nBinsTrackLengthOuter{"nBinsTrackLengthOuter", 300, "number of bins in track length"}; + Configurable nBinsTrackDeltaLength{"nBinsTrackDeltaLength", 100, "number of bins in delta track length"}; + Configurable nBinsNsigmaCorrectSpecies{"nBinsNsigmaCorrectSpecies", 200, "number of bins in Nsigma plot (correct speies)"}; + Configurable nBinsNsigmaWrongSpecies{"nBinsNsigmaWrongSpecies", 200, "number of bins in Nsigma plot (wrong species)"}; + Configurable minNsigmaRange{"minNsigmaRange", -10, "lower limit for the nsigma axis"}; + Configurable maxNsigmaRange{"maxNsigmaRange", +10, "upper limit for the nsigma axis"}; + Configurable nBinsTimeRes{"nBinsTimeRes", 400, "number of bins plots time resolution"}; + Configurable nBinsRelativeEtaPt{"nBinsRelativeEtaPt", 400, "number of bins plots pt and eta relative errors"}; + Configurable nBinsEta{"nBinsEta", 400, "number of bins plot relative eta error"}; + } plotsConfig; o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; - // Track smearer (here used to get absolute pt and eta uncertainties if flagTOFLoadDelphesLUTs is true) + // Track smearer (here used to get absolute pt and eta uncertainties if simConfig.flagTOFLoadDelphesLUTs is true) o2::delphes::DelphesO2TrackSmearer mSmearer; // needed: random number generator for smearing @@ -112,13 +121,13 @@ struct OnTheFlyTOFPID { pRandomNumberGenerator.SetSeed(0); // fully randomize // Load LUT for pt and eta smearing - if (flagIncludeTrackTimeRes && flagTOFLoadDelphesLUTs) { + if (simConfig.flagIncludeTrackTimeRes && simConfig.flagTOFLoadDelphesLUTs) { std::map mapPdgLut; - const char* lutElChar = lutEl->c_str(); - const char* lutMuChar = lutMu->c_str(); - const char* lutPiChar = lutPi->c_str(); - const char* lutKaChar = lutKa->c_str(); - const char* lutPrChar = lutPr->c_str(); + const char* lutElChar = simConfig.lutEl->c_str(); + const char* lutMuChar = simConfig.lutMu->c_str(); + const char* lutPiChar = simConfig.lutPi->c_str(); + const char* lutKaChar = simConfig.lutKa->c_str(); + const char* lutPrChar = simConfig.lutPr->c_str(); LOGF(info, "Will load electron lut file ..: %s for TOF PID", lutElChar); LOGF(info, "Will load muon lut file ......: %s for TOF PID", lutMuChar); @@ -139,13 +148,18 @@ struct OnTheFlyTOFPID { } } - if (doQAplots) { - const AxisSpec axisMomentum{static_cast(nBinsP), 0.0f, +10.0f, "#it{p} (GeV/#it{c})"}; - const AxisSpec axisMomentumSmall{static_cast(nBinsP), 0.0f, +1.0f, "#it{p} (GeV/#it{c})"}; - const AxisSpec axisVelocity{static_cast(nBinsBeta), 0.0f, +1.1f, "Measured #beta"}; - const AxisSpec axisTrackLengthInner{static_cast(nBinsTrackLengthInner), 0.0f, 60.0f, "Track length (cm)"}; - const AxisSpec axisTrackLengthOuter{static_cast(nBinsTrackLengthOuter), 0.0f, 300.0f, "Track length (cm)"}; - const AxisSpec axisTrackDeltaLength{static_cast(nBinsTrackDeltaLength), 0.0f, 30.0f, "Delta Track length (cm)"}; + if (plotsConfig.doQAplots) { + histos.add("h2dEventTime", "h2dEventTime", kTH2F, {{200, -1000, 1000, "computed"}, {200, -1000, 1000, "generated"}}); + histos.add("h1dEventTimegen", "h1dEventTimegen", kTH1F, {{200, -1000, 1000, "generated"}}); + histos.add("h1dEventTimerec", "h1dEventTimerec", kTH1F, {{200, -1000, 1000, "computed"}}); + histos.add("h1dEventTimeres", "h1dEventTimeres", kTH1F, {{300, 0, 300, "resolution"}}); + + const AxisSpec axisMomentum{static_cast(plotsConfig.nBinsP), 0.0f, +10.0f, "#it{p} (GeV/#it{c})"}; + const AxisSpec axisMomentumSmall{static_cast(plotsConfig.nBinsP), 0.0f, +1.0f, "#it{p} (GeV/#it{c})"}; + const AxisSpec axisVelocity{static_cast(plotsConfig.nBinsBeta), 0.0f, +1.1f, "Measured #beta"}; + const AxisSpec axisTrackLengthInner{static_cast(plotsConfig.nBinsTrackLengthInner), 0.0f, 60.0f, "Track length (cm)"}; + const AxisSpec axisTrackLengthOuter{static_cast(plotsConfig.nBinsTrackLengthOuter), 0.0f, 300.0f, "Track length (cm)"}; + const AxisSpec axisTrackDeltaLength{static_cast(plotsConfig.nBinsTrackDeltaLength), 0.0f, 30.0f, "Delta Track length (cm)"}; histos.add("h2dVelocityVsMomentumInner", "h2dVelocityVsMomentumInner", kTH2F, {axisMomentum, axisVelocity}); histos.add("h2dVelocityVsMomentumOuter", "h2dVelocityVsMomentumOuter", kTH2F, {axisMomentum, axisVelocity}); histos.add("h2dTrackLengthInnerVsPt", "h2dTrackLengthInnerVsPt", kTH2F, {axisMomentumSmall, axisTrackLengthInner}); @@ -157,10 +171,10 @@ struct OnTheFlyTOFPID { histos.add("h2dDeltaTrackLengthInnerVsPt", "h2dDeltaTrackLengthInnerVsPt", kTH2F, {axisMomentumSmall, axisTrackDeltaLength}); histos.add("h2dDeltaTrackLengthOuterVsPt", "h2dDeltaTrackLengthOuterVsPt", kTH2F, {axisMomentumSmall, axisTrackDeltaLength}); - const AxisSpec axisPt{static_cast(nBinsP), 0.0f, +4.0f, "#it{p_{T}} (GeV/#it{c})"}; - const AxisSpec axisEta{static_cast(nBinsEta), -2.0f, +2.0f, "#eta"}; - const AxisSpec axisRelativePt{static_cast(nBinsRelativeEtaPt), 0.0f, +10.0f, "#it{#sigma_{p_{T}}} / #it{p_{T}} (%)"}; - const AxisSpec axisRelativeEta{static_cast(nBinsRelativeEtaPt), 0.0f, +10.0f, "#it{#sigma_{#eta}} / #it{#eta} (%)"}; + const AxisSpec axisPt{static_cast(plotsConfig.nBinsP), 0.0f, +4.0f, "#it{p_{T}} (GeV/#it{c})"}; + const AxisSpec axisEta{static_cast(plotsConfig.nBinsEta), -2.0f, +2.0f, "#eta"}; + const AxisSpec axisRelativePt{static_cast(plotsConfig.nBinsRelativeEtaPt), 0.0f, +10.0f, "#it{#sigma_{p_{T}}} / #it{p_{T}} (%)"}; + const AxisSpec axisRelativeEta{static_cast(plotsConfig.nBinsRelativeEtaPt), 0.0f, +10.0f, "#it{#sigma_{#eta}} / #it{#eta} (%)"}; histos.add("h2dRelativePtResolution", "h2dRelativePtResolution", kTH2F, {axisPt, axisRelativePt}); histos.add("h2dRelativeEtaResolution", "h2dRelativeEtaResolution", kTH2F, {axisEta, axisRelativeEta}); @@ -171,8 +185,8 @@ struct OnTheFlyTOFPID { std::string name_title_inner_total_res = "h2dInnerTimeResTotal" + particle_names2[i_true] + "VsP"; std::string name_title_outer_track_res = "h2dOuterTimeResTrack" + particle_names2[i_true] + "VsP"; std::string name_title_outer_total_res = "h2dOuterTimeResTotal" + particle_names2[i_true] + "VsP"; - const AxisSpec axisTrackTimeRes{static_cast(nBinsTimeRes), 0.0f, +200.0f, "Track time resolution - " + particle_names1[i_true] + " (ps)"}; - const AxisSpec axisTotalTimeRes{static_cast(nBinsTimeRes), 0.0f, +200.0f, "Total time resolution - " + particle_names1[i_true] + " (ps)"}; + const AxisSpec axisTrackTimeRes{static_cast(plotsConfig.nBinsTimeRes), 0.0f, +200.0f, "Track time resolution - " + particle_names1[i_true] + " (ps)"}; + const AxisSpec axisTotalTimeRes{static_cast(plotsConfig.nBinsTimeRes), 0.0f, +200.0f, "Total time resolution - " + particle_names1[i_true] + " (ps)"}; histos.add(name_title_inner_track_res.c_str(), name_title_inner_track_res.c_str(), kTH2F, {axisMomentum, axisTrackTimeRes}); histos.add(name_title_inner_total_res.c_str(), name_title_inner_total_res.c_str(), kTH2F, {axisMomentum, axisTotalTimeRes}); histos.add(name_title_outer_track_res.c_str(), name_title_outer_track_res.c_str(), kTH2F, {axisMomentum, axisTrackTimeRes}); @@ -184,11 +198,11 @@ struct OnTheFlyTOFPID { std::string name_title_inner = "h2dInnerNsigmaTrue" + particle_names2[i_true] + "Vs" + particle_names2[i_hyp] + "Hypothesis"; std::string name_title_outer = "h2dOuterNsigmaTrue" + particle_names2[i_true] + "Vs" + particle_names2[i_hyp] + "Hypothesis"; if (i_true == i_hyp) { - const AxisSpec axisNsigmaCorrect{static_cast(nBinsNsigmaCorrectSpecies), minNsigmaRange, maxNsigmaRange, "N#sigma - True " + particle_names1[i_true] + " vs " + particle_names1[i_hyp] + " hypothesis"}; + const AxisSpec axisNsigmaCorrect{static_cast(plotsConfig.nBinsNsigmaCorrectSpecies), plotsConfig.minNsigmaRange, plotsConfig.maxNsigmaRange, "N#sigma - True " + particle_names1[i_true] + " vs " + particle_names1[i_hyp] + " hypothesis"}; histos.add(name_title_inner.c_str(), name_title_inner.c_str(), kTH2F, {axisMomentum, axisNsigmaCorrect}); histos.add(name_title_outer.c_str(), name_title_outer.c_str(), kTH2F, {axisMomentum, axisNsigmaCorrect}); } else { - const AxisSpec axisNsigmaWrong{static_cast(nBinsNsigmaWrongSpecies), minNsigmaRange, maxNsigmaRange, "N#sigma - True " + particle_names1[i_true] + " vs " + particle_names1[i_hyp] + " hypothesis"}; + const AxisSpec axisNsigmaWrong{static_cast(plotsConfig.nBinsNsigmaWrongSpecies), plotsConfig.minNsigmaRange, plotsConfig.maxNsigmaRange, "N#sigma - True " + particle_names1[i_true] + " vs " + particle_names1[i_hyp] + " hypothesis"}; histos.add(name_title_inner.c_str(), name_title_inner.c_str(), kTH2F, {axisMomentum, axisNsigmaWrong}); histos.add(name_title_outer.c_str(), name_title_outer.c_str(), kTH2F, {axisMomentum, axisNsigmaWrong}); } @@ -242,7 +256,7 @@ struct OnTheFlyTOFPID { float centerDistance = std::hypot(trcCircle.xC, trcCircle.yC); // condition of circles touching - if not satisfied returned length will be -100 - if (centerDistance < trcCircle.rC + radius && centerDistance > fabs(trcCircle.rC - radius)) { + if (centerDistance < trcCircle.rC + radius && centerDistance > std::fabs(trcCircle.rC - radius)) { length = 0.0f; // base radical direction @@ -254,7 +268,7 @@ struct OnTheFlyTOFPID { // calculate coordinate for radical line float radical = (centerDistance * centerDistance - trcCircle.rC * trcCircle.rC + radius * radius) / (2.0f * centerDistance); // calculate absolute displacement from center-to-center axis - float displace = (0.5f / centerDistance) * TMath::Sqrt( + float displace = (0.5f / centerDistance) * std::sqrt( (-centerDistance + trcCircle.rC - radius) * (-centerDistance - trcCircle.rC + radius) * (-centerDistance + trcCircle.rC + radius) * @@ -285,7 +299,7 @@ struct OnTheFlyTOFPID { } cosAngle /= modulus; length = trcCircle.rC * TMath::ACos(cosAngle); - length *= sqrt(1.0f + track.getTgl() * track.getTgl()); + length *= std::sqrt(1.0f + track.getTgl() * track.getTgl()); } return length; } @@ -295,9 +309,83 @@ struct OnTheFlyTOFPID { /// \param mass the mass of the particle float velocity(float momentum, float mass) { - float a = std::pow(momentum / mass, 2); + const float a = momentum / mass; // uses light speed in cm/ps so output is in those units - return (o2::constants::physics::LightSpeedCm2NS / 1e+3) * std::sqrt(a / (1 + a)); + return o2::constants::physics::LightSpeedCm2PS * a / std::sqrt((1.f + a * a)); + } + + struct TracksWithTime { + TracksWithTime(int pdgCode, + std::pair innerTOFTime, + std::pair outerTOFTime, + std::pair trackLengthInnerTOF, + std::pair trackLengthOuterTOF, + std::pair momentum, + std::pair pseudorapidity, + float noSmearingPt) + : mPdgCode(pdgCode), + mInnerTOFTime(innerTOFTime), + mOuterTOFTime(outerTOFTime), + mTrackLengthInnerTOF(trackLengthInnerTOF), + mTrackLengthOuterTOF(trackLengthOuterTOF), + mMomentum(momentum), + mPseudorapidity{pseudorapidity}, + mNoSmearingPt{noSmearingPt} {} + + int mPdgCode; + std::pair mInnerTOFTime; // Measured time and expected resolution at the inner TOF [ps] + std::pair mOuterTOFTime; // Measured time and expected resolution at the outer TOF [ps] + std::pair mTrackLengthInnerTOF; // Measured and generated length at the innerTOF [cm] + std::pair mTrackLengthOuterTOF; // Measured and generated length at the outerTOF [cm] + std::pair mMomentum; // Measured momentum and uncertainty on the momentum [GeV/c] + std::pair mPseudorapidity; // Measured pseudorapidity and uncertainty on the pseudorapidity + float mNoSmearingPt; // No smearing pt + }; + + std::vector tracksWithTime; + bool eventTime(std::vector& tracks, + std::array& tzero) + { + + float sum = 0.; + float sumw = 0.; + + for (auto& track : tracks) { + auto pdgInfo = pdg->GetParticle(track.mPdgCode); + if (pdgInfo == nullptr) { + continue; + } + const float mass = pdgInfo->Mass(); + const float mass2 = mass * mass; + const float tof = track.mInnerTOFTime.first; // [ps] + const float etof = track.mInnerTOFTime.second; // [ps] + const float L = track.mTrackLengthInnerTOF.first; // [cm] + float p = track.mMomentum.first; // [GeV/c] + p *= std::abs(pdgInfo->Charge()) / 3.; // Total momentum + const float ep = track.mMomentum.second; // [GeV/c] + const float p2 = p * p; + const float Lc = L * o2::constants::physics::invLightSpeedCm2PS; + const float texp = Lc / p * std::sqrt(mass2 + p2); + // LOG(info) << "TOF: " << tof << " " << etof << " vs " << texp; + const float etexp = Lc * mass2 / p2 / std::sqrt(mass2 + p2) * ep; + const float sigma = std::sqrt(etexp * etexp + etof * etof); + const float deltat = tof - texp; + + const float w = 1. / (sigma * sigma); + + sum += w * deltat; + sumw += w; + } + + if (sumw <= 0.) { + tzero[0] = 0.; // [ps] + tzero[1] = 200.f; // [ps] + return false; + } + + tzero[0] = sum / sumw; + tzero[1] = std::sqrt(1. / sumw); + return true; } /// returns track time resolution @@ -308,12 +396,18 @@ struct OnTheFlyTOFPID { /// \param mass the mass of the particle /// \param det_radius the radius of the cylindrical layer /// \param magneticField the magnetic field (along Z) - double calculate_track_time_resolution_advanced(float pt, float eta, float track_pt_resolution, float track_eta_resolution, float mass, float det_radius, float magneticField) + double calculate_track_time_resolution_advanced(float pt, + float eta, + float track_pt_resolution, + float track_eta_resolution, + float mass, + float det_radius, + float magneticField) { // Compute tracking contribution to timing using the error propagation formula // Uses light speed in m/ps, magnetic field in T (*0.1 for conversion kGauss -> T) double a0 = mass * mass; - double a1 = 0.299792458 * (0.1 * magneticField) * (0.01 * o2::constants::physics::LightSpeedCm2NS / 1e+3); + double a1 = 0.299792458 * (0.1 * magneticField) * (0.01 * o2::constants::physics::LightSpeedCm2PS); double a2 = (det_radius * 0.01) * (det_radius * 0.01) * (0.299792458) * (0.299792458) * (0.1 * magneticField) * (0.1 * magneticField) / 2.0; double dtof_on_dpt = (std::pow(pt, 4) * std::pow(std::cosh(eta), 2) * std::acos(1.0 - a2 / std::pow(pt, 2)) - 2.0 * a2 * std::pow(pt, 2) * (a0 + std::pow(pt * std::cosh(eta), 2)) / std::sqrt(a2 * (2.0 * std::pow(pt, 2) - a2))) / (a1 * std::pow(pt, 3) * std::sqrt(a0 + std::pow(pt * std::cosh(eta), 2))); double dtof_on_deta = std::pow(pt, 2) * std::sinh(eta) * std::cosh(eta) * std::acos(1.0 - a2 / std::pow(pt, 2)) / (a1 * std::sqrt(a0 + std::pow(pt * std::cosh(eta), 2))); @@ -321,13 +415,18 @@ struct OnTheFlyTOFPID { return track_time_resolution; } - void process(soa::Join::iterator const& collision, soa::Join const& tracks, aod::McParticles const&, aod::McCollisions const&) + void process(soa::Join::iterator const& collision, + soa::Join const& tracks, + aod::McParticles const&, + aod::McCollisions const&) { o2::dataformats::VertexBase pvVtx({collision.posX(), collision.posY(), collision.posZ()}, - {collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()}); + {collision.covXX(), collision.covXY(), collision.covYY(), + collision.covXZ(), collision.covYZ(), collision.covZZ()}); std::array mcPvCov = {0.}; o2::dataformats::VertexBase mcPvVtx({0.0f, 0.0f, 0.0f}, mcPvCov); + const float eventCollisionTimePS = collision.collisionTime() * 1e3; // convert ns to ps if (collision.has_mcCollision()) { auto mcCollision = collision.mcCollision(); mcPvVtx.setX(mcCollision.posX()); @@ -337,12 +436,12 @@ struct OnTheFlyTOFPID { // First we compute the number of charged particles in the event if LUTs are loaded float dNdEta = 0.f; - if (flagTOFLoadDelphesLUTs) { + if (simConfig.flagTOFLoadDelphesLUTs) { for (const auto& track : tracks) { if (!track.has_mcParticle()) continue; auto mcParticle = track.mcParticle(); - if (std::abs(mcParticle.eta()) > multiplicityEtaRange) { + if (std::abs(mcParticle.eta()) > simConfig.multiplicityEtaRange) { continue; } if (mcParticle.has_daughters()) { @@ -360,21 +459,23 @@ struct OnTheFlyTOFPID { } } + tracksWithTime.clear(); // clear the vector of tracks with time to prepare the cache for the next event + tracksWithTime.reserve(tracks.size()); + // First loop to generate the arrival time of the particles to the TOF layers for (const auto& track : tracks) { // first step: find precise arrival time (if any) // --- convert track into perfect track if (!track.has_mcParticle()) // should always be OK but check please continue; - - auto mcParticle = track.mcParticle(); + const auto& mcParticle = track.mcParticle(); o2::track::TrackParCov o2track = convertMCParticleToO2Track(mcParticle); float xPv = -100, trackLengthInnerTOF = -1, trackLengthOuterTOF = -1; - if (o2track.propagateToDCA(mcPvVtx, dBz)) + if (o2track.propagateToDCA(mcPvVtx, simConfig.dBz)) xPv = o2track.getX(); if (xPv > -99.) { - trackLengthInnerTOF = trackLength(o2track, innerTOFRadius, dBz); - trackLengthOuterTOF = trackLength(o2track, outerTOFRadius, dBz); + trackLengthInnerTOF = trackLength(o2track, simConfig.innerTOFRadius, simConfig.dBz); + trackLengthOuterTOF = trackLength(o2track, simConfig.outerTOFRadius, simConfig.dBz); } // get mass to calculate velocity @@ -382,44 +483,90 @@ struct OnTheFlyTOFPID { if (pdgInfo == nullptr) { continue; } - float expectedTimeInnerTOF = trackLengthInnerTOF / velocity(o2track.getP(), pdgInfo->Mass()); - float expectedTimeOuterTOF = trackLengthOuterTOF / velocity(o2track.getP(), pdgInfo->Mass()); + const float v = velocity(o2track.getP(), pdgInfo->Mass()); + const float expectedTimeInnerTOF = trackLengthInnerTOF / v + eventCollisionTimePS; // arrival time to the Inner TOF in ps + const float expectedTimeOuterTOF = trackLengthOuterTOF / v + eventCollisionTimePS; // arrival time to the Outer TOF in ps + upgradeTofMC(expectedTimeInnerTOF, trackLengthInnerTOF, expectedTimeOuterTOF, trackLengthOuterTOF); // Smear with expected resolutions - float measuredTimeInnerTOF = pRandomNumberGenerator.Gaus(expectedTimeInnerTOF, innerTOFTimeReso); - float measuredTimeOuterTOF = pRandomNumberGenerator.Gaus(expectedTimeOuterTOF, outerTOFTimeReso); + const float measuredTimeInnerTOF = pRandomNumberGenerator.Gaus(expectedTimeInnerTOF, simConfig.innerTOFTimeReso); + const float measuredTimeOuterTOF = pRandomNumberGenerator.Gaus(expectedTimeOuterTOF, simConfig.outerTOFTimeReso); // Now we calculate the expected arrival time following certain mass hypotheses // and the (imperfect!) reconstructed track parametrizations float trackLengthRecoInnerTOF = -1, trackLengthRecoOuterTOF = -1; auto recoTrack = getTrackParCov(track); - if (recoTrack.propagateToDCA(pvVtx, dBz)) + if (recoTrack.propagateToDCA(pvVtx, simConfig.dBz)) xPv = recoTrack.getX(); if (xPv > -99.) { - trackLengthRecoInnerTOF = trackLength(recoTrack, innerTOFRadius, dBz); - trackLengthRecoOuterTOF = trackLength(recoTrack, outerTOFRadius, dBz); + trackLengthRecoInnerTOF = trackLength(recoTrack, simConfig.innerTOFRadius, simConfig.dBz); + trackLengthRecoOuterTOF = trackLength(recoTrack, simConfig.outerTOFRadius, simConfig.dBz); } + // cache the track info needed for the event time calculation + // Reuse or emplace a new object in the vector + tracksWithTime.emplace_back(TracksWithTime{mcParticle.pdgCode(), + {measuredTimeInnerTOF, simConfig.innerTOFTimeReso}, + {measuredTimeOuterTOF, simConfig.outerTOFTimeReso}, + {trackLengthRecoInnerTOF, trackLengthInnerTOF}, + {trackLengthRecoOuterTOF, trackLengthOuterTOF}, + {recoTrack.getP(), recoTrack.getSigma1Pt2()}, + {recoTrack.getEta(), recoTrack.getSigmaTgl2()}, + o2track.getPt()}); + } + + // Now we compute the event time for the tracks + + std::array tzero = {0.f, 0.f}; + const bool etStatus = eventTime(tracksWithTime, tzero); + if (!etStatus) { + LOG(warning) << "Event time calculation failed with " << tracksWithTime.size() << " tracks"; + } + + if (plotsConfig.doQAplots) { + histos.fill(HIST("h2dEventTime"), tzero[0], eventCollisionTimePS); + histos.fill(HIST("h1dEventTimegen"), eventCollisionTimePS); + histos.fill(HIST("h1dEventTimerec"), tzero[0]); + histos.fill(HIST("h1dEventTimeres"), tzero[1]); + } + + // Then we do a second loop to compute the measured quantities with the measured event time + int trackWithTimeIndex = 0; + for (const auto& track : tracks) { + if (!track.has_mcParticle()) // should always be OK but check please + continue; + const auto& mcParticle = track.mcParticle(); + + const auto& trkWithTime = tracksWithTime[trackWithTimeIndex++]; + const float trackLengthRecoInnerTOF = trkWithTime.mTrackLengthInnerTOF.first; + const float trackLengthRecoOuterTOF = trkWithTime.mTrackLengthOuterTOF.first; + const float trackLengthInnerTOF = trkWithTime.mTrackLengthInnerTOF.second; + const float trackLengthOuterTOF = trkWithTime.mTrackLengthOuterTOF.second; + const float measuredTimeInnerTOF = trkWithTime.mInnerTOFTime.first - tzero[0]; + const float measuredTimeOuterTOF = trkWithTime.mOuterTOFTime.first - tzero[0]; + const float momentum = trkWithTime.mMomentum.first; + const float pseudorapidity = trkWithTime.mPseudorapidity.first; + const float noSmearingPt = trkWithTime.mNoSmearingPt; + // Straight to Nsigma float deltaTimeInnerTOF[5], nSigmaInnerTOF[5]; float deltaTimeOuterTOF[5], nSigmaOuterTOF[5]; - int lpdg_array[5] = {kElectron, kMuonMinus, kPiPlus, kKPlus, kProton}; + static constexpr int lpdg_array[5] = {kElectron, kMuonMinus, kPiPlus, kKPlus, kProton}; float masses[5]; - if (doQAplots) { - float momentum = recoTrack.getP(); + if (plotsConfig.doQAplots) { // unit conversion: length in cm, time in ps - float innerBeta = 1e+3 * (trackLengthInnerTOF / measuredTimeInnerTOF) / o2::constants::physics::LightSpeedCm2NS; - float outerBeta = 1e+3 * (trackLengthOuterTOF / measuredTimeOuterTOF) / o2::constants::physics::LightSpeedCm2NS; + const float innerBeta = (trackLengthInnerTOF / measuredTimeInnerTOF) / o2::constants::physics::LightSpeedCm2PS; + const float outerBeta = (trackLengthOuterTOF / measuredTimeOuterTOF) / o2::constants::physics::LightSpeedCm2PS; if (trackLengthRecoInnerTOF > 0) { histos.fill(HIST("h2dVelocityVsMomentumInner"), momentum, innerBeta); - histos.fill(HIST("h2dTrackLengthInnerVsPt"), o2track.getPt(), trackLengthInnerTOF); - histos.fill(HIST("h2dTrackLengthInnerRecoVsPt"), o2track.getPt(), trackLengthRecoInnerTOF); + histos.fill(HIST("h2dTrackLengthInnerVsPt"), noSmearingPt, trackLengthInnerTOF); + histos.fill(HIST("h2dTrackLengthInnerRecoVsPt"), noSmearingPt, trackLengthRecoInnerTOF); } if (trackLengthRecoOuterTOF > 0) { histos.fill(HIST("h2dVelocityVsMomentumOuter"), momentum, outerBeta); - histos.fill(HIST("h2dTrackLengthOuterVsPt"), o2track.getPt(), trackLengthOuterTOF); - histos.fill(HIST("h2dTrackLengthOuterRecoVsPt"), o2track.getPt(), trackLengthRecoOuterTOF); + histos.fill(HIST("h2dTrackLengthOuterVsPt"), noSmearingPt, trackLengthOuterTOF); + histos.fill(HIST("h2dTrackLengthOuterRecoVsPt"), noSmearingPt, trackLengthRecoOuterTOF); } } @@ -429,73 +576,81 @@ struct OnTheFlyTOFPID { auto pdgInfoThis = pdg->GetParticle(lpdg_array[ii]); masses[ii] = pdgInfoThis->Mass(); - deltaTimeInnerTOF[ii] = trackLengthRecoInnerTOF / velocity(recoTrack.getP(), masses[ii]) - measuredTimeInnerTOF; - deltaTimeOuterTOF[ii] = trackLengthRecoOuterTOF / velocity(recoTrack.getP(), masses[ii]) - measuredTimeOuterTOF; + deltaTimeInnerTOF[ii] = trackLengthRecoInnerTOF / velocity(momentum, masses[ii]) - measuredTimeInnerTOF; + deltaTimeOuterTOF[ii] = trackLengthRecoOuterTOF / velocity(momentum, masses[ii]) - measuredTimeOuterTOF; // Evaluate total sigma (layer + tracking resolution) - float innerTotalTimeReso = innerTOFTimeReso; - float outerTotalTimeReso = outerTOFTimeReso; - if (flagIncludeTrackTimeRes) { - double pt_resolution = std::pow(recoTrack.getP() / std::cosh(recoTrack.getEta()), 2) * std::sqrt(recoTrack.getSigma1Pt2()); - double eta_resolution = std::fabs(std::sin(2.0 * std::atan(std::exp(-recoTrack.getEta())))) * std::sqrt(recoTrack.getSigmaTgl2()); - if (flagTOFLoadDelphesLUTs) { - pt_resolution = mSmearer.getAbsPtRes(pdgInfoThis->PdgCode(), dNdEta, recoTrack.getEta(), recoTrack.getP() / std::cosh(recoTrack.getEta())); - eta_resolution = mSmearer.getAbsEtaRes(pdgInfoThis->PdgCode(), dNdEta, recoTrack.getEta(), recoTrack.getP() / std::cosh(recoTrack.getEta())); + float innerTotalTimeReso = simConfig.innerTOFTimeReso; + float outerTotalTimeReso = simConfig.outerTOFTimeReso; + if (simConfig.flagIncludeTrackTimeRes) { + double pt_resolution = std::pow(momentum / std::cosh(pseudorapidity), 2) * std::sqrt(trkWithTime.mMomentum.second); + double eta_resolution = std::fabs(std::sin(2.0 * std::atan(std::exp(-pseudorapidity)))) * std::sqrt(trkWithTime.mPseudorapidity.second); + if (simConfig.flagTOFLoadDelphesLUTs) { + pt_resolution = mSmearer.getAbsPtRes(pdgInfoThis->PdgCode(), dNdEta, pseudorapidity, momentum / std::cosh(pseudorapidity)); + eta_resolution = mSmearer.getAbsEtaRes(pdgInfoThis->PdgCode(), dNdEta, pseudorapidity, momentum / std::cosh(pseudorapidity)); } - float innerTrackTimeReso = calculate_track_time_resolution_advanced(recoTrack.getP() / std::cosh(recoTrack.getEta()), recoTrack.getEta(), pt_resolution, eta_resolution, masses[ii], innerTOFRadius, dBz); - float outerTrackTimeReso = calculate_track_time_resolution_advanced(recoTrack.getP() / std::cosh(recoTrack.getEta()), recoTrack.getEta(), pt_resolution, eta_resolution, masses[ii], outerTOFRadius, dBz); - innerTotalTimeReso = std::hypot(innerTOFTimeReso, innerTrackTimeReso); - outerTotalTimeReso = std::hypot(outerTOFTimeReso, outerTrackTimeReso); - - if (doQAplots && trackLengthRecoInnerTOF > 0) { - float momentum = recoTrack.getP(); - if (ii == 0 && std::fabs(mcParticle.pdgCode()) == pdg->GetParticle(lpdg_array[0])->PdgCode()) { - histos.fill(HIST("h2dInnerTimeResTrackElecVsP"), momentum, innerTrackTimeReso); - histos.fill(HIST("h2dInnerTimeResTotalElecVsP"), momentum, innerTotalTimeReso); - } - if (ii == 1 && std::fabs(mcParticle.pdgCode()) == pdg->GetParticle(lpdg_array[1])->PdgCode()) { - histos.fill(HIST("h2dInnerTimeResTrackMuonVsP"), momentum, innerTrackTimeReso); - histos.fill(HIST("h2dInnerTimeResTotalMuonVsP"), momentum, innerTotalTimeReso); - } - if (ii == 2 && std::fabs(mcParticle.pdgCode()) == pdg->GetParticle(lpdg_array[2])->PdgCode()) { - histos.fill(HIST("h2dInnerTimeResTrackPionVsP"), momentum, innerTrackTimeReso); - histos.fill(HIST("h2dInnerTimeResTotalPionVsP"), momentum, innerTotalTimeReso); - } - if (ii == 3 && std::fabs(mcParticle.pdgCode()) == pdg->GetParticle(lpdg_array[3])->PdgCode()) { - histos.fill(HIST("h2dInnerTimeResTrackKaonVsP"), momentum, innerTrackTimeReso); - histos.fill(HIST("h2dInnerTimeResTotalKaonVsP"), momentum, innerTotalTimeReso); - } - if (ii == 4 && std::fabs(mcParticle.pdgCode()) == pdg->GetParticle(lpdg_array[4])->PdgCode()) { - histos.fill(HIST("h2dInnerTimeResTrackProtVsP"), momentum, innerTrackTimeReso); - histos.fill(HIST("h2dInnerTimeResTotalProtVsP"), momentum, innerTotalTimeReso); - } - } - if (doQAplots && trackLengthRecoOuterTOF > 0) { - float momentum = recoTrack.getP(); - float pseudorapidity = recoTrack.getEta(); - float transverse_momentum = momentum / std::cosh(pseudorapidity); - if (ii == 0 && std::fabs(mcParticle.pdgCode()) == pdg->GetParticle(lpdg_array[0])->PdgCode()) { - histos.fill(HIST("h2dOuterTimeResTrackElecVsP"), momentum, outerTrackTimeReso); - histos.fill(HIST("h2dOuterTimeResTotalElecVsP"), momentum, outerTotalTimeReso); - } - if (ii == 1 && std::fabs(mcParticle.pdgCode()) == pdg->GetParticle(lpdg_array[1])->PdgCode()) { - histos.fill(HIST("h2dOuterTimeResTrackMuonVsP"), momentum, outerTrackTimeReso); - histos.fill(HIST("h2dOuterTimeResTotalMuonVsP"), momentum, outerTotalTimeReso); - } - if (ii == 2 && std::fabs(mcParticle.pdgCode()) == pdg->GetParticle(lpdg_array[2])->PdgCode()) { - histos.fill(HIST("h2dOuterTimeResTrackPionVsP"), momentum, outerTrackTimeReso); - histos.fill(HIST("h2dOuterTimeResTotalPionVsP"), momentum, outerTotalTimeReso); - - histos.fill(HIST("h2dRelativePtResolution"), transverse_momentum, 100.0 * pt_resolution / transverse_momentum); - histos.fill(HIST("h2dRelativeEtaResolution"), pseudorapidity, 100.0 * eta_resolution / (std::fabs(pseudorapidity) + 1e-6)); - } - if (ii == 3 && std::fabs(mcParticle.pdgCode()) == pdg->GetParticle(lpdg_array[3])->PdgCode()) { - histos.fill(HIST("h2dOuterTimeResTrackKaonVsP"), momentum, outerTrackTimeReso); - histos.fill(HIST("h2dOuterTimeResTotalKaonVsP"), momentum, outerTotalTimeReso); - } - if (ii == 4 && std::fabs(mcParticle.pdgCode()) == pdg->GetParticle(lpdg_array[4])->PdgCode()) { - histos.fill(HIST("h2dOuterTimeResTrackProtVsP"), momentum, outerTrackTimeReso); - histos.fill(HIST("h2dOuterTimeResTotalProtVsP"), momentum, outerTotalTimeReso); + float innerTrackTimeReso = calculate_track_time_resolution_advanced(momentum / std::cosh(pseudorapidity), pseudorapidity, pt_resolution, eta_resolution, masses[ii], simConfig.innerTOFRadius, simConfig.dBz); + float outerTrackTimeReso = calculate_track_time_resolution_advanced(momentum / std::cosh(pseudorapidity), pseudorapidity, pt_resolution, eta_resolution, masses[ii], simConfig.outerTOFRadius, simConfig.dBz); + innerTotalTimeReso = std::hypot(simConfig.innerTOFTimeReso, innerTrackTimeReso); + outerTotalTimeReso = std::hypot(simConfig.outerTOFTimeReso, outerTrackTimeReso); + + if (plotsConfig.doQAplots) { + if (std::fabs(mcParticle.pdgCode()) == pdg->GetParticle(lpdg_array[ii])->PdgCode()) { + if (trackLengthRecoInnerTOF > 0) { + switch (ii) { + case 0: + histos.fill(HIST("h2dInnerTimeResTrackElecVsP"), momentum, innerTrackTimeReso); + histos.fill(HIST("h2dInnerTimeResTotalElecVsP"), momentum, innerTotalTimeReso); + break; + case 1: + histos.fill(HIST("h2dInnerTimeResTrackMuonVsP"), momentum, innerTrackTimeReso); + histos.fill(HIST("h2dInnerTimeResTotalMuonVsP"), momentum, innerTotalTimeReso); + break; + case 2: + histos.fill(HIST("h2dInnerTimeResTrackPionVsP"), momentum, innerTrackTimeReso); + histos.fill(HIST("h2dInnerTimeResTotalPionVsP"), momentum, innerTotalTimeReso); + break; + case 3: + histos.fill(HIST("h2dInnerTimeResTrackKaonVsP"), momentum, innerTrackTimeReso); + histos.fill(HIST("h2dInnerTimeResTotalKaonVsP"), momentum, innerTotalTimeReso); + break; + case 4: + histos.fill(HIST("h2dInnerTimeResTrackProtVsP"), momentum, innerTrackTimeReso); + histos.fill(HIST("h2dInnerTimeResTotalProtVsP"), momentum, innerTotalTimeReso); + break; + default: + break; + } + } + if (trackLengthRecoOuterTOF > 0) { + float transverse_momentum = momentum / std::cosh(pseudorapidity); + switch (ii) { + case 0: + histos.fill(HIST("h2dOuterTimeResTrackElecVsP"), momentum, outerTrackTimeReso); + histos.fill(HIST("h2dOuterTimeResTotalElecVsP"), momentum, outerTotalTimeReso); + break; + case 1: + histos.fill(HIST("h2dOuterTimeResTrackMuonVsP"), momentum, outerTrackTimeReso); + histos.fill(HIST("h2dOuterTimeResTotalMuonVsP"), momentum, outerTotalTimeReso); + break; + case 2: + histos.fill(HIST("h2dOuterTimeResTrackPionVsP"), momentum, outerTrackTimeReso); + histos.fill(HIST("h2dOuterTimeResTotalPionVsP"), momentum, outerTotalTimeReso); + histos.fill(HIST("h2dRelativePtResolution"), transverse_momentum, 100.0 * pt_resolution / transverse_momentum); + histos.fill(HIST("h2dRelativeEtaResolution"), pseudorapidity, 100.0 * eta_resolution / (std::fabs(pseudorapidity) + 1e-6)); + break; + case 3: + histos.fill(HIST("h2dOuterTimeResTrackKaonVsP"), momentum, outerTrackTimeReso); + histos.fill(HIST("h2dOuterTimeResTotalKaonVsP"), momentum, outerTotalTimeReso); + break; + case 4: + histos.fill(HIST("h2dOuterTimeResTrackProtVsP"), momentum, outerTrackTimeReso); + histos.fill(HIST("h2dOuterTimeResTotalProtVsP"), momentum, outerTotalTimeReso); + break; + default: + break; + } + } } } } @@ -504,106 +659,118 @@ struct OnTheFlyTOFPID { // and not the tracking itself. It's *probably* a fair assumption // but it should be tested further! --> FIXED IN THIS VERSION if (trackLengthInnerTOF > 0 && trackLengthRecoInnerTOF > 0) - nSigmaInnerTOF[ii] = deltaTimeInnerTOF[ii] / innerTotalTimeReso; + nSigmaInnerTOF[ii] = deltaTimeInnerTOF[ii] / std::sqrt(innerTotalTimeReso * innerTotalTimeReso + tzero[1] * tzero[1]); if (trackLengthOuterTOF > 0 && trackLengthRecoOuterTOF > 0) - nSigmaOuterTOF[ii] = deltaTimeOuterTOF[ii] / outerTotalTimeReso; + nSigmaOuterTOF[ii] = deltaTimeOuterTOF[ii] / std::sqrt(outerTotalTimeReso * outerTotalTimeReso + tzero[1] * tzero[1]); } - if (doQAplots) { - float momentum = recoTrack.getP(); - if (trackLengthRecoInnerTOF > 0) { - if (std::fabs(mcParticle.pdgCode()) == pdg->GetParticle(lpdg_array[0])->PdgCode()) { - histos.fill(HIST("h2dInnerNsigmaTrueElecVsElecHypothesis"), momentum, nSigmaInnerTOF[0]); - histos.fill(HIST("h2dInnerNsigmaTrueElecVsMuonHypothesis"), momentum, nSigmaInnerTOF[1]); - histos.fill(HIST("h2dInnerNsigmaTrueElecVsPionHypothesis"), momentum, nSigmaInnerTOF[2]); - histos.fill(HIST("h2dInnerNsigmaTrueElecVsKaonHypothesis"), momentum, nSigmaInnerTOF[3]); - histos.fill(HIST("h2dInnerNsigmaTrueElecVsProtHypothesis"), momentum, nSigmaInnerTOF[4]); + if (plotsConfig.doQAplots) { + for (int ii = 0; ii < 5; ii++) { + if (std::fabs(mcParticle.pdgCode()) != pdg->GetParticle(lpdg_array[ii])->PdgCode()) { + continue; } - if (std::fabs(mcParticle.pdgCode()) == pdg->GetParticle(lpdg_array[1])->PdgCode()) { - histos.fill(HIST("h2dInnerNsigmaTrueMuonVsElecHypothesis"), momentum, nSigmaInnerTOF[0]); - histos.fill(HIST("h2dInnerNsigmaTrueMuonVsMuonHypothesis"), momentum, nSigmaInnerTOF[1]); - histos.fill(HIST("h2dInnerNsigmaTrueMuonVsPionHypothesis"), momentum, nSigmaInnerTOF[2]); - histos.fill(HIST("h2dInnerNsigmaTrueMuonVsKaonHypothesis"), momentum, nSigmaInnerTOF[3]); - histos.fill(HIST("h2dInnerNsigmaTrueMuonVsProtHypothesis"), momentum, nSigmaInnerTOF[4]); - } - if (std::fabs(mcParticle.pdgCode()) == pdg->GetParticle(lpdg_array[2])->PdgCode()) { - histos.fill(HIST("h2dInnerNsigmaTruePionVsElecHypothesis"), momentum, nSigmaInnerTOF[0]); - histos.fill(HIST("h2dInnerNsigmaTruePionVsMuonHypothesis"), momentum, nSigmaInnerTOF[1]); - histos.fill(HIST("h2dInnerNsigmaTruePionVsPionHypothesis"), momentum, nSigmaInnerTOF[2]); - histos.fill(HIST("h2dInnerNsigmaTruePionVsKaonHypothesis"), momentum, nSigmaInnerTOF[3]); - histos.fill(HIST("h2dInnerNsigmaTruePionVsProtHypothesis"), momentum, nSigmaInnerTOF[4]); - } - if (std::fabs(mcParticle.pdgCode()) == pdg->GetParticle(lpdg_array[3])->PdgCode()) { - histos.fill(HIST("h2dInnerNsigmaTrueKaonVsElecHypothesis"), momentum, nSigmaInnerTOF[0]); - histos.fill(HIST("h2dInnerNsigmaTrueKaonVsMuonHypothesis"), momentum, nSigmaInnerTOF[1]); - histos.fill(HIST("h2dInnerNsigmaTrueKaonVsPionHypothesis"), momentum, nSigmaInnerTOF[2]); - histos.fill(HIST("h2dInnerNsigmaTrueKaonVsKaonHypothesis"), momentum, nSigmaInnerTOF[3]); - histos.fill(HIST("h2dInnerNsigmaTrueKaonVsProtHypothesis"), momentum, nSigmaInnerTOF[4]); - } - if (std::fabs(mcParticle.pdgCode()) == pdg->GetParticle(lpdg_array[4])->PdgCode()) { - histos.fill(HIST("h2dInnerNsigmaTrueProtVsElecHypothesis"), momentum, nSigmaInnerTOF[0]); - histos.fill(HIST("h2dInnerNsigmaTrueProtVsMuonHypothesis"), momentum, nSigmaInnerTOF[1]); - histos.fill(HIST("h2dInnerNsigmaTrueProtVsPionHypothesis"), momentum, nSigmaInnerTOF[2]); - histos.fill(HIST("h2dInnerNsigmaTrueProtVsKaonHypothesis"), momentum, nSigmaInnerTOF[3]); - histos.fill(HIST("h2dInnerNsigmaTrueProtVsProtHypothesis"), momentum, nSigmaInnerTOF[4]); - } - } - if (trackLengthRecoOuterTOF > 0) { - if (std::fabs(mcParticle.pdgCode()) == pdg->GetParticle(lpdg_array[0])->PdgCode()) { - histos.fill(HIST("h2dOuterNsigmaTrueElecVsElecHypothesis"), momentum, nSigmaOuterTOF[0]); - histos.fill(HIST("h2dOuterNsigmaTrueElecVsMuonHypothesis"), momentum, nSigmaOuterTOF[1]); - histos.fill(HIST("h2dOuterNsigmaTrueElecVsPionHypothesis"), momentum, nSigmaOuterTOF[2]); - histos.fill(HIST("h2dOuterNsigmaTrueElecVsKaonHypothesis"), momentum, nSigmaOuterTOF[3]); - histos.fill(HIST("h2dOuterNsigmaTrueElecVsProtHypothesis"), momentum, nSigmaOuterTOF[4]); - } - if (std::fabs(mcParticle.pdgCode()) == pdg->GetParticle(lpdg_array[1])->PdgCode()) { - histos.fill(HIST("h2dOuterNsigmaTrueMuonVsElecHypothesis"), momentum, nSigmaOuterTOF[0]); - histos.fill(HIST("h2dOuterNsigmaTrueMuonVsMuonHypothesis"), momentum, nSigmaOuterTOF[1]); - histos.fill(HIST("h2dOuterNsigmaTrueMuonVsPionHypothesis"), momentum, nSigmaOuterTOF[2]); - histos.fill(HIST("h2dOuterNsigmaTrueMuonVsKaonHypothesis"), momentum, nSigmaOuterTOF[3]); - histos.fill(HIST("h2dOuterNsigmaTrueMuonVsProtHypothesis"), momentum, nSigmaOuterTOF[4]); - } - if (std::fabs(mcParticle.pdgCode()) == pdg->GetParticle(lpdg_array[2])->PdgCode()) { - histos.fill(HIST("h2dOuterNsigmaTruePionVsElecHypothesis"), momentum, nSigmaOuterTOF[0]); - histos.fill(HIST("h2dOuterNsigmaTruePionVsMuonHypothesis"), momentum, nSigmaOuterTOF[1]); - histos.fill(HIST("h2dOuterNsigmaTruePionVsPionHypothesis"), momentum, nSigmaOuterTOF[2]); - histos.fill(HIST("h2dOuterNsigmaTruePionVsKaonHypothesis"), momentum, nSigmaOuterTOF[3]); - histos.fill(HIST("h2dOuterNsigmaTruePionVsProtHypothesis"), momentum, nSigmaOuterTOF[4]); - } - if (std::fabs(mcParticle.pdgCode()) == pdg->GetParticle(lpdg_array[3])->PdgCode()) { - histos.fill(HIST("h2dOuterNsigmaTrueKaonVsElecHypothesis"), momentum, nSigmaOuterTOF[0]); - histos.fill(HIST("h2dOuterNsigmaTrueKaonVsMuonHypothesis"), momentum, nSigmaOuterTOF[1]); - histos.fill(HIST("h2dOuterNsigmaTrueKaonVsPionHypothesis"), momentum, nSigmaOuterTOF[2]); - histos.fill(HIST("h2dOuterNsigmaTrueKaonVsKaonHypothesis"), momentum, nSigmaOuterTOF[3]); - histos.fill(HIST("h2dOuterNsigmaTrueKaonVsProtHypothesis"), momentum, nSigmaOuterTOF[4]); + if (trackLengthRecoInnerTOF > 0) { + switch (ii) { + case 0: + histos.fill(HIST("h2dInnerNsigmaTrueElecVsElecHypothesis"), momentum, nSigmaInnerTOF[0]); + histos.fill(HIST("h2dInnerNsigmaTrueElecVsMuonHypothesis"), momentum, nSigmaInnerTOF[1]); + histos.fill(HIST("h2dInnerNsigmaTrueElecVsPionHypothesis"), momentum, nSigmaInnerTOF[2]); + histos.fill(HIST("h2dInnerNsigmaTrueElecVsKaonHypothesis"), momentum, nSigmaInnerTOF[3]); + histos.fill(HIST("h2dInnerNsigmaTrueElecVsProtHypothesis"), momentum, nSigmaInnerTOF[4]); + break; + case 1: + histos.fill(HIST("h2dInnerNsigmaTrueMuonVsElecHypothesis"), momentum, nSigmaInnerTOF[0]); + histos.fill(HIST("h2dInnerNsigmaTrueMuonVsMuonHypothesis"), momentum, nSigmaInnerTOF[1]); + histos.fill(HIST("h2dInnerNsigmaTrueMuonVsPionHypothesis"), momentum, nSigmaInnerTOF[2]); + histos.fill(HIST("h2dInnerNsigmaTrueMuonVsKaonHypothesis"), momentum, nSigmaInnerTOF[3]); + histos.fill(HIST("h2dInnerNsigmaTrueMuonVsProtHypothesis"), momentum, nSigmaInnerTOF[4]); + break; + case 2: + histos.fill(HIST("h2dInnerNsigmaTruePionVsElecHypothesis"), momentum, nSigmaInnerTOF[0]); + histos.fill(HIST("h2dInnerNsigmaTruePionVsMuonHypothesis"), momentum, nSigmaInnerTOF[1]); + histos.fill(HIST("h2dInnerNsigmaTruePionVsPionHypothesis"), momentum, nSigmaInnerTOF[2]); + histos.fill(HIST("h2dInnerNsigmaTruePionVsKaonHypothesis"), momentum, nSigmaInnerTOF[3]); + histos.fill(HIST("h2dInnerNsigmaTruePionVsProtHypothesis"), momentum, nSigmaInnerTOF[4]); + break; + case 3: + histos.fill(HIST("h2dInnerNsigmaTrueKaonVsElecHypothesis"), momentum, nSigmaInnerTOF[0]); + histos.fill(HIST("h2dInnerNsigmaTrueKaonVsMuonHypothesis"), momentum, nSigmaInnerTOF[1]); + histos.fill(HIST("h2dInnerNsigmaTrueKaonVsPionHypothesis"), momentum, nSigmaInnerTOF[2]); + histos.fill(HIST("h2dInnerNsigmaTrueKaonVsKaonHypothesis"), momentum, nSigmaInnerTOF[3]); + histos.fill(HIST("h2dInnerNsigmaTrueKaonVsProtHypothesis"), momentum, nSigmaInnerTOF[4]); + break; + case 4: + histos.fill(HIST("h2dInnerNsigmaTrueProtVsElecHypothesis"), momentum, nSigmaInnerTOF[0]); + histos.fill(HIST("h2dInnerNsigmaTrueProtVsMuonHypothesis"), momentum, nSigmaInnerTOF[1]); + histos.fill(HIST("h2dInnerNsigmaTrueProtVsPionHypothesis"), momentum, nSigmaInnerTOF[2]); + histos.fill(HIST("h2dInnerNsigmaTrueProtVsKaonHypothesis"), momentum, nSigmaInnerTOF[3]); + histos.fill(HIST("h2dInnerNsigmaTrueProtVsProtHypothesis"), momentum, nSigmaInnerTOF[4]); + break; + default: + break; + } } - if (std::fabs(mcParticle.pdgCode()) == pdg->GetParticle(lpdg_array[4])->PdgCode()) { - histos.fill(HIST("h2dOuterNsigmaTrueProtVsElecHypothesis"), momentum, nSigmaOuterTOF[0]); - histos.fill(HIST("h2dOuterNsigmaTrueProtVsMuonHypothesis"), momentum, nSigmaOuterTOF[1]); - histos.fill(HIST("h2dOuterNsigmaTrueProtVsPionHypothesis"), momentum, nSigmaOuterTOF[2]); - histos.fill(HIST("h2dOuterNsigmaTrueProtVsKaonHypothesis"), momentum, nSigmaOuterTOF[3]); - histos.fill(HIST("h2dOuterNsigmaTrueProtVsProtHypothesis"), momentum, nSigmaOuterTOF[4]); + if (trackLengthRecoOuterTOF > 0) { + switch (ii) { + case 0: + histos.fill(HIST("h2dOuterNsigmaTrueElecVsElecHypothesis"), momentum, nSigmaOuterTOF[0]); + histos.fill(HIST("h2dOuterNsigmaTrueElecVsMuonHypothesis"), momentum, nSigmaOuterTOF[1]); + histos.fill(HIST("h2dOuterNsigmaTrueElecVsPionHypothesis"), momentum, nSigmaOuterTOF[2]); + histos.fill(HIST("h2dOuterNsigmaTrueElecVsKaonHypothesis"), momentum, nSigmaOuterTOF[3]); + histos.fill(HIST("h2dOuterNsigmaTrueElecVsProtHypothesis"), momentum, nSigmaOuterTOF[4]); + break; + case 1: + histos.fill(HIST("h2dOuterNsigmaTrueMuonVsElecHypothesis"), momentum, nSigmaOuterTOF[0]); + histos.fill(HIST("h2dOuterNsigmaTrueMuonVsMuonHypothesis"), momentum, nSigmaOuterTOF[1]); + histos.fill(HIST("h2dOuterNsigmaTrueMuonVsPionHypothesis"), momentum, nSigmaOuterTOF[2]); + histos.fill(HIST("h2dOuterNsigmaTrueMuonVsKaonHypothesis"), momentum, nSigmaOuterTOF[3]); + histos.fill(HIST("h2dOuterNsigmaTrueMuonVsProtHypothesis"), momentum, nSigmaOuterTOF[4]); + break; + case 2: + histos.fill(HIST("h2dOuterNsigmaTruePionVsElecHypothesis"), momentum, nSigmaOuterTOF[0]); + histos.fill(HIST("h2dOuterNsigmaTruePionVsMuonHypothesis"), momentum, nSigmaOuterTOF[1]); + histos.fill(HIST("h2dOuterNsigmaTruePionVsPionHypothesis"), momentum, nSigmaOuterTOF[2]); + histos.fill(HIST("h2dOuterNsigmaTruePionVsKaonHypothesis"), momentum, nSigmaOuterTOF[3]); + histos.fill(HIST("h2dOuterNsigmaTruePionVsProtHypothesis"), momentum, nSigmaOuterTOF[4]); + break; + case 3: + histos.fill(HIST("h2dOuterNsigmaTrueKaonVsElecHypothesis"), momentum, nSigmaOuterTOF[0]); + histos.fill(HIST("h2dOuterNsigmaTrueKaonVsMuonHypothesis"), momentum, nSigmaOuterTOF[1]); + histos.fill(HIST("h2dOuterNsigmaTrueKaonVsPionHypothesis"), momentum, nSigmaOuterTOF[2]); + histos.fill(HIST("h2dOuterNsigmaTrueKaonVsKaonHypothesis"), momentum, nSigmaOuterTOF[3]); + histos.fill(HIST("h2dOuterNsigmaTrueKaonVsProtHypothesis"), momentum, nSigmaOuterTOF[4]); + break; + case 4: + histos.fill(HIST("h2dOuterNsigmaTrueProtVsElecHypothesis"), momentum, nSigmaOuterTOF[0]); + histos.fill(HIST("h2dOuterNsigmaTrueProtVsMuonHypothesis"), momentum, nSigmaOuterTOF[1]); + histos.fill(HIST("h2dOuterNsigmaTrueProtVsPionHypothesis"), momentum, nSigmaOuterTOF[2]); + histos.fill(HIST("h2dOuterNsigmaTrueProtVsKaonHypothesis"), momentum, nSigmaOuterTOF[3]); + histos.fill(HIST("h2dOuterNsigmaTrueProtVsProtHypothesis"), momentum, nSigmaOuterTOF[4]); + break; + default: + break; + } } } } - float deltaTrackLengthInnerTOF = abs(trackLengthInnerTOF - trackLengthRecoInnerTOF); + float deltaTrackLengthInnerTOF = std::abs(trackLengthInnerTOF - trackLengthRecoInnerTOF); if (trackLengthInnerTOF > 0 && trackLengthRecoInnerTOF > 0) { - histos.fill(HIST("h2dDeltaTrackLengthInnerVsPt"), o2track.getPt(), deltaTrackLengthInnerTOF); + histos.fill(HIST("h2dDeltaTrackLengthInnerVsPt"), noSmearingPt, deltaTrackLengthInnerTOF); } - float deltaTrackLengthOuterTOF = abs(trackLengthOuterTOF - trackLengthRecoOuterTOF); + float deltaTrackLengthOuterTOF = std::abs(trackLengthOuterTOF - trackLengthRecoOuterTOF); if (trackLengthOuterTOF > 0 && trackLengthRecoOuterTOF > 0) { - histos.fill(HIST("h2dDeltaTrackLengthOuterVsPt"), o2track.getPt(), deltaTrackLengthInnerTOF); + histos.fill(HIST("h2dDeltaTrackLengthOuterVsPt"), noSmearingPt, deltaTrackLengthOuterTOF); } // Sigmas have been fully calculated. Please populate the NSigma helper table (once per track) - upgradeTof(nSigmaInnerTOF[0], nSigmaInnerTOF[1], nSigmaInnerTOF[2], nSigmaInnerTOF[3], nSigmaInnerTOF[4], trackLengthInnerTOF, trackLengthRecoInnerTOF, deltaTrackLengthInnerTOF, - nSigmaOuterTOF[0], nSigmaOuterTOF[1], nSigmaOuterTOF[2], nSigmaOuterTOF[3], nSigmaOuterTOF[4], trackLengthOuterTOF, trackLengthRecoOuterTOF, deltaTrackLengthOuterTOF); + upgradeTof(tzero[0], tzero[1], + nSigmaInnerTOF[0], nSigmaInnerTOF[1], nSigmaInnerTOF[2], nSigmaInnerTOF[3], nSigmaInnerTOF[4], + measuredTimeInnerTOF, trackLengthRecoInnerTOF, + nSigmaOuterTOF[0], nSigmaOuterTOF[1], nSigmaOuterTOF[2], nSigmaOuterTOF[3], nSigmaOuterTOF[4], + measuredTimeOuterTOF, trackLengthRecoOuterTOF); } } }; -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - return WorkflowSpec{adaptAnalysisTask(cfgc)}; -} +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc)}; } diff --git a/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx b/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx index 9fa7920d2ac..6806bbca9db 100644 --- a/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx +++ b/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx @@ -561,6 +561,7 @@ struct OnTheFlyTracker { // generate collision time auto ir = irSampler.generateCollisionTime(); + const float eventCollisionTime = ir.timeInBCNS; // First we compute the number of charged particles in the event dNdEta = 0.f; @@ -659,7 +660,7 @@ struct OnTheFlyTracker { isDecayDaughter = true; multiplicityCounter++; - const float t = (ir.timeInBCNS + gRandom->Gaus(0., 100.)) * 1e-3; + const float t = (eventCollisionTime + gRandom->Gaus(0., 100.)) * 1e-3; std::vector xiDaughterTrackParCovsPerfect(3); std::vector xiDaughterTrackParCovsTracked(3); std::vector isReco(3); @@ -1023,7 +1024,7 @@ struct OnTheFlyTracker { primaryVertex.getSigmaX2(), primaryVertex.getSigmaXY(), primaryVertex.getSigmaY2(), primaryVertex.getSigmaXZ(), primaryVertex.getSigmaYZ(), primaryVertex.getSigmaZ2(), 0, primaryVertex.getChi2(), primaryVertex.getNContributors(), - 0, 0); + eventCollisionTime, 0.f); // For the moment the event collision time is taken as the "GEANT" time, the computation of the event time is done a posteriori from the tracks in the OTF TOF PID task collLabels(mcCollision.globalIndex(), 0); collisionsAlice3(dNdEta); // *+~+*+~+*+~+*+~+*+~+*+~+*+~+*+~+*+~+*+~+*+~+*+~+*+~+*+~+* diff --git a/ALICE3/Tasks/alice3-dilepton.cxx b/ALICE3/Tasks/alice3-dilepton.cxx index ef8d1ff4b53..e3632fc5a02 100644 --- a/ALICE3/Tasks/alice3-dilepton.cxx +++ b/ALICE3/Tasks/alice3-dilepton.cxx @@ -531,9 +531,9 @@ struct Alice3Dilepton { FillPairGen(neg_mcParticles_coll, neg_mcParticles_coll, mcParticles); } // end of mc collision loop - } // end of processGen + } // end of processGen - using MyTracksMC = soa::Join; + using MyTracksMC = soa::Join; // Filter trackFilter = etaMin < o2::aod::track::eta && // o2::aod::track::eta < etaMax && // ptMin < o2::aod::track::pt && @@ -616,7 +616,7 @@ struct Alice3Dilepton { FillPairRec(negTracks_coll, negTracks_coll, mcParticles); } // end of collision loop - } // end of processRec + } // end of processRec PROCESS_SWITCH(Alice3Dilepton, processGen, "Run for generated particle", true); PROCESS_SWITCH(Alice3Dilepton, processRec, "Run for reconstructed track", false); From dce2ff2e75df5fd63f8be51e14510c6cd587c727 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Mon, 28 Apr 2025 18:22:23 +0900 Subject: [PATCH 1114/1650] [PWGEM/Dilepton] update matchingMFT.cxx (#11004) --- PWGEM/Dilepton/Tasks/matchingMFT.cxx | 92 ++++++++++++---------------- 1 file changed, 40 insertions(+), 52 deletions(-) diff --git a/PWGEM/Dilepton/Tasks/matchingMFT.cxx b/PWGEM/Dilepton/Tasks/matchingMFT.cxx index f1746d1a2b0..138a6325e1e 100644 --- a/PWGEM/Dilepton/Tasks/matchingMFT.cxx +++ b/PWGEM/Dilepton/Tasks/matchingMFT.cxx @@ -76,7 +76,8 @@ struct matchingMFT { Configurable requireTrueAssociation{"requireTrueAssociation", false, "flag to require true mc collision association"}; Configurable maxDEta{"maxDEta", 1e+10f, "max. deta between MFT-MCH-MID and MCH-MID"}; Configurable maxDPhi{"maxDPhi", 1e+10f, "max. dphi between MFT-MCH-MID and MCH-MID"}; - Configurable> requireMFTDisks{"requireMFTDisks", std::vector{0}, "hit map on MFT disks [0,1,2,3,4]. logical-OR of each double-sided disk"}; + Configurable requireMFTHitMap{"requireMFTHitMap", false, "flag to require MFT hit map"}; + Configurable> requiredMFTDisks{"requiredMFTDisks", std::vector{0}, "hit map on MFT disks [0,1,2,3,4]. logical-OR of each double-sided disk"}; Configurable cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"}; Configurable cfgCentMin{"cfgCentMin", -1.f, "min. centrality"}; @@ -148,10 +149,12 @@ struct matchingMFT { hMuonType->GetXaxis()->SetBinLabel(4, "MCH-MID"); hMuonType->GetXaxis()->SetBinLabel(5, "MCH standalone"); + const AxisSpec axis_pt{{0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "p_{T}^{gl} (GeV/c)"}; + fRegistry.add("MFTMCHMID/primary/correct/hPt", "pT;p_{T} (GeV/c)", kTH1F, {{100, 0.0f, 10}}, false); - fRegistry.add("MFTMCHMID/primary/correct/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {100, -6.f, -1.f}}, false); - fRegistry.add("MFTMCHMID/primary/correct/hEtaPhi_MatchedMCHMID", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {100, -6.f, -1.f}}, false); - fRegistry.add("MFTMCHMID/primary/correct/hDeltaEtaDeltaPhi", "#Delta#eta vs. #Delta#varphi;#Delta#varphi (rad.);#Delta#eta", kTH2F, {{180, -M_PI / 2, M_PI / 2}, {200, -1.f, +1.f}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {80, -5.f, -1.f}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hEtaPhi_MatchedMCHMID", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {80, -5.f, -1.f}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hsDelta", "diff. between GL and associated SA;p_{T}^{gl} (GeV/c);#Delta#eta;#Delta#varphi (rad.);", kTHnSparseF, {axis_pt, {100, -0.5, +0.5}, {90, -M_PI / 4, M_PI / 4}}, false); fRegistry.add("MFTMCHMID/primary/correct/hDiffCollId", "difference in collision index;collisionId_{TTCA} - collisionId_{MP}", kTH1F, {{41, -20.5, +20.5}}, false); fRegistry.add("MFTMCHMID/primary/correct/hSign", "sign;sign", kTH1F, {{3, -1.5, +1.5}}, false); fRegistry.add("MFTMCHMID/primary/correct/hNclusters", "Nclusters;Nclusters", kTH1F, {{21, -0.5f, 20.5}}, false); @@ -171,9 +174,6 @@ struct matchingMFT { fRegistry.add("MFTMCHMID/primary/correct/hDCAxResolutionvsPt", "DCA_{x} resolution vs. p_{T};p_{T} (GeV/c);DCA_{x} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 500}}, false); fRegistry.add("MFTMCHMID/primary/correct/hDCAyResolutionvsPt", "DCA_{y} resolution vs. p_{T};p_{T} (GeV/c);DCA_{y} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 500}}, false); fRegistry.add("MFTMCHMID/primary/correct/hDCAxyResolutionvsPt", "DCA_{xy} resolution vs. p_{T};p_{T} (GeV/c);DCA_{xy} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 500}}, false); - fRegistry.add("MFTMCHMID/primary/correct/hDCAxResolutionvsP", "DCA_{x} resolution vs. p;p (GeV/c);DCA_{x} resolution (#mum);", kTH2F, {{100, 0, 100.f}, {500, 0, 500}}, false); - fRegistry.add("MFTMCHMID/primary/correct/hDCAyResolutionvsP", "DCA_{y} resolution vs. p;p (GeV/c);DCA_{y} resolution (#mum);", kTH2F, {{100, 0, 100.f}, {500, 0, 500}}, false); - fRegistry.add("MFTMCHMID/primary/correct/hDCAxyResolutionvsP", "DCA_{xy} resolution vs. p;p (GeV/c);DCA_{xy} resolution (#mum);", kTH2F, {{100, 0, 100.f}, {500, 0, 500}}, false); fRegistry.add("MFTMCHMID/primary/correct/hProdVtxZ", "prod. vtx Z of muon;V_{z} (cm)", kTH1F, {{200, -100, 100}}, false); fRegistry.add("MFTMCHMID/primary/correct/hRelDeltaPt", "pT resolution;p_{T}^{gen} (GeV/c);(p_{T}^{rec} - p_{T}^{gen})/p_{T}^{gen}", kTH2F, {{100, 0, 10}, {400, -1, +1}}, false); @@ -183,8 +183,7 @@ struct matchingMFT { fRegistry.add("MFTMCHMID/primary/correct/hDeltaPhi_Neg", "#varphi resolution;p_{T}^{gen} (GeV/c);#varphi^{rec} - #varphi^{gen} (rad.)", kTH2F, {{100, 0, 10}, {400, -0.2, +0.2}}, false); fRegistry.addClone("MFTMCHMID/primary/correct/", "MFTMCHMID/primary/wrong/"); fRegistry.addClone("MFTMCHMID/primary/", "MFTMCHMID/secondary/"); - - fRegistry.add("Generated/primary/hs", "gen. info;p_{T} (GeV/c);#eta;#varphi (rad.)", kTHnSparseF, {{100, 0.0f, 10}, {60, -5, -2}, {90, 0, 2.f * M_PI}}, false); + // fRegistry.add("Generated/primary/hs", "gen. info;p_{T} (GeV/c);#eta;#varphi (rad.)", kTHnSparseF, {{100, 0.0f, 10}, {60, -5, -2}, {90, 0, 2.f * M_PI}}, false); } bool isSelected(const float pt, const float eta, const float rAtAbsorberEnd, const float pDCA, const float chi2, const uint8_t trackType, const float dcaXY) @@ -296,7 +295,6 @@ struct matchingMFT { o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon(fwdtrack, collision, propagationPoint::kToVertex); o2::dataformats::GlobalFwdTrack propmuonAtDCA = propagateMuon(fwdtrack, collision, propagationPoint::kToDCA); - float p = propmuonAtPV.getP(); float pt = propmuonAtPV.getPt(); float eta = propmuonAtPV.getEta(); float phi = propmuonAtPV.getPhi(); @@ -355,10 +353,12 @@ struct matchingMFT { return; } - std::vector hasMFTs{hasMFT<0, 1>(mfttrack), hasMFT<2, 3>(mfttrack), hasMFT<4, 5>(mfttrack), hasMFT<6, 7>(mfttrack), hasMFT<8, 9>(mfttrack)}; - for (int i = 0; i < static_cast(requireMFTDisks->size()); i++) { - if (!hasMFTs[requireMFTDisks->at(i)]) { - return; + if (requireMFTHitMap) { + std::vector hasMFTs{hasMFT<0, 1>(mfttrack), hasMFT<2, 3>(mfttrack), hasMFT<4, 5>(mfttrack), hasMFT<6, 7>(mfttrack), hasMFT<8, 9>(mfttrack)}; + for (int i = 0; i < static_cast(requiredMFTDisks->size()); i++) { + if (!hasMFTs[requiredMFTDisks->at(i)]) { + return; + } } } @@ -368,7 +368,7 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/primary/correct/hPt"), pt); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hEtaPhi"), phi, eta); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); - fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDeltaEtaDeltaPhi"), dphi, deta); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hsDelta"), pt, deta, dphi); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hSign"), fwdtrack.sign()); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hNclusters"), fwdtrack.nClusters()); @@ -388,9 +388,6 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxResolutionvsPt"), pt, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAyResolutionvsPt"), pt, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxyResolutionvsPt"), pt, sigma_dcaXY * 1e+4); // convert cm to um - fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxResolutionvsP"), p, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um - fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAyResolutionvsP"), p, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um - fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxyResolutionvsP"), p, sigma_dcaXY * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/primary/correct/hProdVtxZ"), mcParticle_MFTMCHMID.vz()); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hRelDeltaPt"), mcParticle_MFTMCHMID.pt(), (pt - mcParticle_MFTMCHMID.pt()) / mcParticle_MFTMCHMID.pt()); @@ -405,7 +402,7 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hPt"), pt); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hEtaPhi"), phi, eta); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); - fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDeltaEtaDeltaPhi"), dphi, deta); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hsDelta"), pt, deta, dphi); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hSign"), fwdtrack.sign()); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hNclusters"), fwdtrack.nClusters()); @@ -425,9 +422,6 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxResolutionvsPt"), pt, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAyResolutionvsPt"), pt, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxyResolutionvsPt"), pt, sigma_dcaXY * 1e+4); // convert cm to um - fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxResolutionvsP"), p, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um - fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAyResolutionvsP"), p, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um - fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxyResolutionvsP"), p, sigma_dcaXY * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hProdVtxZ"), mcParticle_MFTMCHMID.vz()); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hRelDeltaPt"), mcParticle_MFTMCHMID.pt(), (pt - mcParticle_MFTMCHMID.pt()) / mcParticle_MFTMCHMID.pt()); if (mcParticle_MFTMCHMID.pdgCode() > 0) { @@ -443,7 +437,7 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hPt"), pt); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hEtaPhi"), phi, eta); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); - fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDeltaEtaDeltaPhi"), dphi, deta); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hsDelta"), pt, deta, dphi); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hSign"), fwdtrack.sign()); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hNclusters"), fwdtrack.nClusters()); @@ -463,9 +457,6 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxResolutionvsPt"), pt, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAyResolutionvsPt"), pt, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxyResolutionvsPt"), pt, sigma_dcaXY * 1e+4); // convert cm to um - fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxResolutionvsP"), p, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um - fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAyResolutionvsP"), p, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um - fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxyResolutionvsP"), p, sigma_dcaXY * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hProdVtxZ"), mcParticle_MFTMCHMID.vz()); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hRelDeltaPt"), mcParticle_MFTMCHMID.pt(), (pt - mcParticle_MFTMCHMID.pt()) / mcParticle_MFTMCHMID.pt()); if (mcParticle_MFTMCHMID.pdgCode() > 0) { @@ -479,7 +470,7 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hPt"), pt); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hEtaPhi"), phi, eta); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); - fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDeltaEtaDeltaPhi"), dphi, deta); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hsDelta"), pt, deta, dphi); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hSign"), fwdtrack.sign()); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hNclusters"), fwdtrack.nClusters()); @@ -499,9 +490,6 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxResolutionvsPt"), pt, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAyResolutionvsPt"), pt, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxyResolutionvsPt"), pt, sigma_dcaXY * 1e+4); // convert cm to um - fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxResolutionvsP"), p, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um - fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAyResolutionvsP"), p, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um - fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxyResolutionvsP"), p, sigma_dcaXY * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hProdVtxZ"), mcParticle_MFTMCHMID.vz()); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hRelDeltaPt"), mcParticle_MFTMCHMID.pt(), (pt - mcParticle_MFTMCHMID.pt()) / mcParticle_MFTMCHMID.pt()); if (mcParticle_MFTMCHMID.pdgCode() > 0) { @@ -529,24 +517,24 @@ struct matchingMFT { fRegistry.fill(HIST("Event/hMultFT0CvsMultNTracksPV"), collision.multFT0C(), collision.multNTracksPV()); } - template - void runGen(TMCParticles const& mcParticles) - { - for (const auto& mcParticle : mcParticles) { - if (std::abs(mcParticle.pdgCode()) != 13) { // select true muon - continue; - } - if (!(mcParticle.isPhysicalPrimary() || mcParticle.producedByGenerator())) { - continue; - } - if (mcParticle.eta() < minEtaGL || maxEtaGL < mcParticle.eta()) { - continue; - } - - fRegistry.fill(HIST("Generated/primary/hs"), mcParticle.pt(), mcParticle.eta(), mcParticle.phi()); - - } // end of mc particles - } + // template + // void runGen(TMCParticles const& mcParticles) + // { + // for (const auto& mcParticle : mcParticles) { + // if (std::abs(mcParticle.pdgCode()) != 13) { // select true muon + // continue; + // } + // if (!(mcParticle.isPhysicalPrimary() || mcParticle.producedByGenerator())) { + // continue; + // } + // if (mcParticle.eta() < minEtaGL || maxEtaGL < mcParticle.eta()) { + // continue; + // } + + // fRegistry.fill(HIST("Generated/primary/hs"), mcParticle.pt(), mcParticle.eta(), mcParticle.phi()); + + // } // end of mc particles + // } SliceCache cache; PresliceUnsorted perMFTTrack = o2::aod::fwdtrack::matchMFTTrackId; @@ -558,7 +546,7 @@ struct matchingMFT { Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); using FilteredMyCollisions = soa::Filtered; - void processWithoutFTTCA(FilteredMyCollisions const& collisions, MyFwdTracks const& fwdtracks, MyMFTTracks const& mfttracks, aod::BCsWithTimestamps const&, aod::McParticles const& mcParticles) + void processWithoutFTTCA(FilteredMyCollisions const& collisions, MyFwdTracks const& fwdtracks, MyMFTTracks const& mfttracks, aod::BCsWithTimestamps const&, aod::McParticles const&) { for (const auto& collision : collisions) { const auto& bc = collision.template bc_as(); @@ -582,11 +570,11 @@ struct matchingMFT { fillHistograms(collision, fwdtrack, fwdtracks, mfttracks); } // end of fwdtrack loop } // end of collision loop - runGen(mcParticles); + // runGen(mcParticles); } PROCESS_SWITCH(matchingMFT, processWithoutFTTCA, "process without FTTCA", false); - void processWithFTTCA(FilteredMyCollisions const& collisions, MyFwdTracks const& fwdtracks, MyMFTTracks const& mfttracks, aod::BCsWithTimestamps const&, aod::FwdTrackAssoc const& fwdtrackIndices, aod::McParticles const& mcParticles) + void processWithFTTCA(FilteredMyCollisions const& collisions, MyFwdTracks const& fwdtracks, MyMFTTracks const& mfttracks, aod::BCsWithTimestamps const&, aod::FwdTrackAssoc const& fwdtrackIndices, aod::McParticles const&) { for (const auto& collision : collisions) { const auto& bc = collision.template bc_as(); @@ -611,7 +599,7 @@ struct matchingMFT { fillHistograms(collision, fwdtrack, fwdtracks, mfttracks); } // end of fwdtrack loop } // end of collision loop - runGen(mcParticles); + // runGen(mcParticles); } PROCESS_SWITCH(matchingMFT, processWithFTTCA, "process with FTTCA", true); }; From f3d6795cc24f6ef9c783efcf51272413d6936edb Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Mon, 28 Apr 2025 11:57:05 +0200 Subject: [PATCH 1115/1650] [Trigger] Fix 2phi filter table descriptor for real (#11005) --- EventFiltering/filterTables.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/EventFiltering/filterTables.h b/EventFiltering/filterTables.h index 52256f47e96..7200c4f7347 100644 --- a/EventFiltering/filterTables.h +++ b/EventFiltering/filterTables.h @@ -331,7 +331,7 @@ DECLARE_SOA_TABLE(F1ProtonFilters, "AOD", "F1ProtonFilters", //! using F1ProtonFilter = F1ProtonFilters::iterator; // Double Phi -DECLARE_SOA_TABLE(DoublePhiFilters, "AOD", "DoublePhiFilter", //! +DECLARE_SOA_TABLE(DoublePhiFilters, "AOD", "LF2PhiFilters", //! filtering::TriggerEventDoublePhi); using DoublePhiFilter = DoublePhiFilters::iterator; @@ -366,8 +366,8 @@ using BCRange = BCRanges::iterator; /// List of the available filters, the description of their tables and the name of the tasks constexpr int NumberOfFilters{14}; -constexpr std::array AvailableFilters{"NucleiFilters", "DiffractionFilters", "DqFilters", "HfFilters", "CFFilters", "JetFilters", "JetHFFilters", "FullJetFilters", "StrangenessFilters", "MultFilters", "PhotonFilters", "F1ProtonFilters", "DoublePhiFilter", "HeavyNeutralMesonFilters"}; -constexpr std::array FilterDescriptions{"NucleiFilters", "DiffFilters", "DqFilters", "HfFilters", "CFFilters", "JetFilters", "JetHFFilters", "FullJetFilters", "LFStrgFilters", "MultFilters", "PhotonFilters", "F1ProtonFilters", "DoublePhiFilter", "HNMesonFilters"}; +constexpr std::array AvailableFilters{"NucleiFilters", "DiffractionFilters", "DqFilters", "HfFilters", "CFFilters", "JetFilters", "JetHFFilters", "FullJetFilters", "StrangenessFilters", "MultFilters", "PhotonFilters", "F1ProtonFilters", "DoublePhiFilters", "HeavyNeutralMesonFilters"}; +constexpr std::array FilterDescriptions{"NucleiFilters", "DiffFilters", "DqFilters", "HfFilters", "CFFilters", "JetFilters", "JetHFFilters", "FullJetFilters", "LFStrgFilters", "MultFilters", "PhotonFilters", "F1ProtonFilters", "LF2PhiFilters", "HNMesonFilters"}; constexpr std::array FilteringTaskNames{"o2-analysis-nuclei-filter", "o2-analysis-diffraction-filter", "o2-analysis-dq-filter-pp-with-association", "o2-analysis-hf-filter", "o2-analysis-cf-filter", "o2-analysis-je-filter", "o2-analysis-je-hf-filter", "o2-analysis-fje-filter", "o2-analysis-lf-strangeness-filter", "o2-analysis-mult-filter", "o2-analysis-em-photon-filter", "o2-analysis-lf-f1proton-filter", "o2-analysis-lf-doublephi-filter", "o2-analysis-heavy-meson-filter"}; constexpr o2::framework::pack FiltersPack; static_assert(o2::framework::pack_size(FiltersPack) == NumberOfFilters); From 21659119d4f5b4e7eed0a3e16b66dd809d64a3c2 Mon Sep 17 00:00:00 2001 From: Shyam Kumar Date: Mon, 28 Apr 2025 13:33:14 +0200 Subject: [PATCH 1116/1650] [PWGHF] Adding a flag to perform Prompt and Non-prompt D+-hadron correlations (#10830) Co-authored-by: ALICE Action Bot --- PWGHF/HFC/DataModel/CorrelationTables.h | 7 +- .../TableProducer/correlatorDplusHadrons.cxx | 41 ++++---- .../HFC/Tasks/taskCorrelationDplusHadrons.cxx | 97 +++++++++++-------- 3 files changed, 80 insertions(+), 65 deletions(-) diff --git a/PWGHF/HFC/DataModel/CorrelationTables.h b/PWGHF/HFC/DataModel/CorrelationTables.h index 0ffeeea8868..3dad5548b27 100644 --- a/PWGHF/HFC/DataModel/CorrelationTables.h +++ b/PWGHF/HFC/DataModel/CorrelationTables.h @@ -342,6 +342,7 @@ DECLARE_SOA_COLUMN(PtHadron, ptHadron, float); //! T DECLARE_SOA_COLUMN(MD, mD, float); //! Invariant mass of D+ DECLARE_SOA_COLUMN(MlScoreBkg, mlScoreBkg, float); //! ML background score for D+ selection DECLARE_SOA_COLUMN(MlScorePrompt, mlScorePrompt, float); //! ML prompt score for D+ selection +DECLARE_SOA_COLUMN(MlScoreNonPrompt, mlScoreNonPrompt, float); //! ML non-prompt score for D+ selection DECLARE_SOA_COLUMN(SignalStatus, signalStatus, bool); //! Used in MC-Rec, D+ Signal DECLARE_SOA_COLUMN(PoolBin, poolBin, int); //! Pool Bin of event defined using zvtx and multiplicity DECLARE_SOA_COLUMN(TrackDcaXY, trackDcaXY, float); //! DCA xy of the track @@ -372,13 +373,15 @@ DECLARE_SOA_TABLE(DplusHadronGenInfo, "AOD", "DPLUSHGENINFO", //! Ds-Hadrons pai DECLARE_SOA_TABLE(DplusHadronMlInfo, "AOD", "DPLUSHMLINFO", //! D+-Hadrons pairs Machine Learning Information aod::hf_correlation_dplus_hadron::MlScoreBkg, - aod::hf_correlation_dplus_hadron::MlScorePrompt); + aod::hf_correlation_dplus_hadron::MlScorePrompt, + aod::hf_correlation_dplus_hadron::MlScoreNonPrompt); DECLARE_SOA_TABLE(DplusRecoInfo, "AOD", "DPLUSRECOINFO", //! D+ candidates Reconstructed Information aod::hf_correlation_dplus_hadron::MD, aod::hf_correlation_dplus_hadron::PtD, aod::hf_correlation_dplus_hadron::MlScoreBkg, - aod::hf_correlation_dplus_hadron::MlScorePrompt); + aod::hf_correlation_dplus_hadron::MlScorePrompt, + aod::hf_correlation_dplus_hadron::MlScoreNonPrompt); DECLARE_SOA_TABLE(DplusGenInfo, "AOD", "DPLUSGENOINFO", //! D+ candidates Generated Information aod::hf_correlation_dplus_hadron::IsPrompt); diff --git a/PWGHF/HFC/TableProducer/correlatorDplusHadrons.cxx b/PWGHF/HFC/TableProducer/correlatorDplusHadrons.cxx index d9ac67f59ae..d6c50370ed5 100644 --- a/PWGHF/HFC/TableProducer/correlatorDplusHadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDplusHadrons.cxx @@ -10,6 +10,7 @@ // or submit itself to any jurisdiction. /// \file correlatorDplusHadrons.cxx +/// \brief D+-Hadrons correlator task - data-like, MC-reco and MC-Gen analyses /// \author Shyam Kumar #include @@ -161,6 +162,7 @@ struct HfCorrelatorDplusHadrons { Produces entryTrackRecoInfo; Produces entryDplus; Produces entryHadron; + static constexpr std::size_t NDaughters{3u}; Configurable selectionFlagDplus{"selectionFlagDplus", 7, "Selection Flag for Dplus"}; // 7 corresponds to topo+PID cuts Configurable numberEventsMixed{"numberEventsMixed", 5, "Number of events mixed in ME process"}; @@ -182,19 +184,9 @@ struct HfCorrelatorDplusHadrons { Configurable> binsPtHadron{"binsPtHadron", std::vector{0.3, 2., 4., 8., 12., 50.}, "pT bin limits for assoc particle"}; Configurable> binsPtEfficiencyD{"binsPtEfficiencyD", std::vector{o2::analysis::hf_cuts_dplus_to_pi_k_pi::vecBinsPt}, "pT bin limits for efficiency"}; Configurable> efficiencyD{"efficiencyD", {1., 1., 1., 1., 1., 1.}, "efficiency values for D+ meson"}; - ConfigurableAxis binsMultiplicity{"binsMultiplicity", {VARIABLE_WIDTH, 0.0f, 2000.0f, 6000.0f, 100000.0f}, "Mixing bins - multiplicity"}; - ConfigurableAxis binsZVtx{"binsZVtx", {VARIABLE_WIDTH, -10.0f, -2.5f, 2.5f, 10.0f}, "Mixing bins - z-vertex"}; - ConfigurableAxis binsMultiplicityMc{"binsMultiplicityMc", {VARIABLE_WIDTH, 0.0f, 20.0f, 50.0f, 500.0f}, "Mixing bins - MC multiplicity"}; // In MCGen multiplicity is defined by counting tracks - ConfigurableAxis binsBdtScore{"binsBdtScore", {100, 0., 1.}, "Bdt output scores"}; - ConfigurableAxis binsEta{"binsEta", {50, -2., 2.}, "#it{#eta}"}; - ConfigurableAxis binsPhi{"binsPhi", {64, -PIHalf, 3. * PIHalf}, "#it{#varphi}"}; - ConfigurableAxis binsPoolBin{"binsPoolBin", {9, 0., 9.}, "PoolBin"}; - ConfigurableAxis binsMultFT0M{"binsMultFT0M", {600, 0., 6000.}, "Multiplicity as FT0M signal amplitude"}; - ConfigurableAxis binsMassD{"binsMassD", {200, 1.7, 2.10}, "inv. mass (#pi^{+}K^{-}#pi^{+}) (GeV/#it{c}^{2})"}; HfHelper hfHelper; SliceCache cache; - BinningType corrBinning{{binsZVtx, binsMultiplicity}, true}; // Event Mixing for the Data Mode using SelCollisionsWithDplus = soa::Filtered>; @@ -215,9 +207,16 @@ struct HfCorrelatorDplusHadrons { Filter dplusFilter = ((o2::aod::hf_track_index::hfflag & static_cast(1 << aod::hf_cand_3prong::DecayType::DplusToPiKPi)) != static_cast(0)) && aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlagDplus; Filter trackFilter = (nabs(aod::track::eta) < etaTrackMax) && (nabs(aod::track::pt) > ptTrackMin) && (nabs(aod::track::dcaXY) < dcaXYTrackMax) && (nabs(aod::track::dcaZ) < dcaZTrackMax); // Filter particlesFilter = nabs(aod::mcparticle::pdgCode) == 411 || ((aod::mcparticle::flags & (uint8_t)o2::aod::mcparticle::enums::PhysicalPrimary) == (uint8_t)o2::aod::mcparticle::enums::PhysicalPrimary); - - Preslice perCol = aod::hf_cand::collisionId; - + ConfigurableAxis binsMultiplicity{"binsMultiplicity", {VARIABLE_WIDTH, 0.0f, 2000.0f, 6000.0f, 100000.0f}, "Mixing bins - multiplicity"}; + ConfigurableAxis binsZVtx{"binsZVtx", {VARIABLE_WIDTH, -10.0f, -2.5f, 2.5f, 10.0f}, "Mixing bins - z-vertex"}; + ConfigurableAxis binsMultiplicityMc{"binsMultiplicityMc", {VARIABLE_WIDTH, 0.0f, 20.0f, 50.0f, 500.0f}, "Mixing bins - MC multiplicity"}; // In MCGen multiplicity is defined by counting tracks + ConfigurableAxis binsBdtScore{"binsBdtScore", {100, 0., 1.}, "Bdt output scores"}; + ConfigurableAxis binsEta{"binsEta", {50, -2., 2.}, "#it{#eta}"}; + ConfigurableAxis binsPhi{"binsPhi", {64, -PIHalf, 3. * PIHalf}, "#it{#varphi}"}; + ConfigurableAxis binsPoolBin{"binsPoolBin", {9, 0., 9.}, "PoolBin"}; + ConfigurableAxis binsMultFT0M{"binsMultFT0M", {600, 0., 6000.}, "Multiplicity as FT0M signal amplitude"}; + ConfigurableAxis binsMassD{"binsMassD", {200, 1.7, 2.10}, "inv. mass (#pi^{+}K^{-}#pi^{+}) (GeV/#it{c}^{2})"}; + BinningType corrBinning{{binsZVtx, binsMultiplicity}, true}; HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject}; void init(InitContext&) @@ -344,7 +343,7 @@ struct HfCorrelatorDplusHadrons { for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { outputMl[iclass] = candidate.mlProbDplusToPiKPi()[classMl->at(iclass)]; } - entryDplusCandRecoInfo(hfHelper.invMassDplusToPiKPi(candidate), candidate.pt(), outputMl[0], outputMl[1]); // 0: BkgBDTScore, 1:PromptBDTScore + entryDplusCandRecoInfo(hfHelper.invMassDplusToPiKPi(candidate), candidate.pt(), outputMl[0], outputMl[1], outputMl[2]); // 0: BkgBDTScore, 1:PromptBDTScore, 2: FDScore entryDplus(candidate.phi(), candidate.eta(), candidate.pt(), hfHelper.invMassDplusToPiKPi(candidate), poolBin, gCollisionId, timeStamp); // Dplus-Hadron correlation dedicated section @@ -366,7 +365,7 @@ struct HfCorrelatorDplusHadrons { track.pt(), poolBin); entryDplusHadronRecoInfo(hfHelper.invMassDplusToPiKPi(candidate), false); entryDplusHadronGenInfo(false, false, 0); - entryDplusHadronMlInfo(outputMl[0], outputMl[1]); + entryDplusHadronMlInfo(outputMl[0], outputMl[1], outputMl[2]); entryTrackRecoInfo(track.dcaXY(), track.dcaZ(), track.tpcNClsCrossedRows()); if (cntDplus == 0) { entryHadron(track.phi(), track.eta(), track.pt(), poolBin, gCollisionId, timeStamp); @@ -458,7 +457,7 @@ struct HfCorrelatorDplusHadrons { outputMl[iclass] = candidate.mlProbDplusToPiKPi()[classMl->at(iclass)]; } registry.fill(HIST("hMassDplusMcRecSig"), hfHelper.invMassDplusToPiKPi(candidate), candidate.pt(), efficiencyWeightD); - entryDplusCandRecoInfo(hfHelper.invMassDplusToPiKPi(candidate), candidate.pt(), outputMl[0], outputMl[1]); + entryDplusCandRecoInfo(hfHelper.invMassDplusToPiKPi(candidate), candidate.pt(), outputMl[0], outputMl[1], outputMl[2]); entryDplusCandGenInfo(isDplusPrompt); } else { registry.fill(HIST("hPtCandMcRecBkg"), candidate.pt()); @@ -487,7 +486,7 @@ struct HfCorrelatorDplusHadrons { candidate.pt(), track.pt(), poolBin); entryDplusHadronRecoInfo(hfHelper.invMassDplusToPiKPi(candidate), isDplusSignal); - entryDplusHadronMlInfo(outputMl[0], outputMl[1]); + entryDplusHadronMlInfo(outputMl[0], outputMl[1], outputMl[2]); if (track.has_mcParticle()) { auto mcParticle = track.template mcParticle_as(); isPhysicalPrimary = mcParticle.isPhysicalPrimary(); @@ -555,12 +554,12 @@ struct HfCorrelatorDplusHadrons { // prompt and non-prompt division std::vector listDaughters{}; - std::array arrDaughDplusPDG = {+kPiPlus, -kKPlus, kPiPlus}; - std::array prongsId; + std::array arrDaughDplusPDG = {+kPiPlus, -kKPlus, kPiPlus}; + std::array prongsId; listDaughters.clear(); RecoDecay::getDaughters(particle1, &listDaughters, arrDaughDplusPDG, 2); int counterDaughters = 0; - if (listDaughters.size() == 3) { + if (listDaughters.size() == NDaughters) { for (const auto& dauIdx : listDaughters) { auto daughI = mcParticles.rawIteratorAt(dauIdx - mcParticles.offset()); counterDaughters += 1; @@ -695,7 +694,7 @@ struct HfCorrelatorDplusHadrons { for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { outputMl[iclass] = candidate.mlProbDplusToPiKPi()[classMl->at(iclass)]; } - entryDplusHadronMlInfo(outputMl[0], outputMl[1]); + entryDplusHadronMlInfo(outputMl[0], outputMl[1], outputMl[2]); entryTrackRecoInfo(pAssoc.dcaXY(), pAssoc.dcaZ(), pAssoc.tpcNClsCrossedRows()); } } diff --git a/PWGHF/HFC/Tasks/taskCorrelationDplusHadrons.cxx b/PWGHF/HFC/Tasks/taskCorrelationDplusHadrons.cxx index 8ccda0a3b71..73d703ffde1 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationDplusHadrons.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationDplusHadrons.cxx @@ -10,6 +10,7 @@ // or submit itself to any jurisdiction. /// \file taskCorrelationDplusHadrons.cxx +/// \brief D+-Hadrons azimuthal correlations analysis task - data-like, MC-reco and MC-Gen analyses /// \author Shyam Kumar #include // std::shared_ptr #include @@ -48,24 +49,25 @@ const TString stringMCGenDFd = "MC gen, non-prompt D+;"; const int npTBinsCorrelations = 8; const double pTBinsCorrelations[npTBinsCorrelations + 1] = {0., 2., 4., 6., 8., 12., 16., 24., 99.}; -auto pTBinsCorrelations_v = std::vector{pTBinsCorrelations, pTBinsCorrelations + npTBinsCorrelations + 1}; +auto ptBinsCorrelationsVec = std::vector{pTBinsCorrelations, pTBinsCorrelations + npTBinsCorrelations + 1}; const double signalRegionInnerDefault[npTBinsCorrelations] = {1.8490, 1.8490, 1.8490, 1.8490, 1.8490, 1.8490, 1.8490, 1.8490}; const double signalRegionOuterDefault[npTBinsCorrelations] = {1.8890, 1.8890, 1.8890, 1.8890, 1.8890, 1.8890, 1.8890, 1.8890}; const double sidebandLeftOuterDefault[npTBinsCorrelations] = {1.7690, 1.7690, 1.7690, 1.7690, 1.7690, 1.7690, 1.7690, 1.7690}; const double sidebandLeftInnerDefault[npTBinsCorrelations] = {1.8250, 1.8250, 1.8250, 1.8250, 1.8250, 1.8250, 1.8250, 1.8250}; const double sidebandRightInnerDefault[npTBinsCorrelations] = {1.9130, 1.9130, 1.9130, 1.9130, 1.9130, 1.9130, 1.9130, 1.9130}; const double sidebandRightOuterDefault[npTBinsCorrelations] = {1.9690, 1.9690, 1.9690, 1.9690, 1.9690, 1.9690, 1.9690, 1.9690}; -auto signalRegionInner_v = std::vector{signalRegionInnerDefault, signalRegionInnerDefault + npTBinsCorrelations}; -auto signalRegionOuter_v = std::vector{signalRegionOuterDefault, signalRegionOuterDefault + npTBinsCorrelations}; -auto sidebandLeftInner_v = std::vector{sidebandLeftInnerDefault, sidebandLeftInnerDefault + npTBinsCorrelations}; -auto sidebandLeftOuter_v = std::vector{sidebandLeftOuterDefault, sidebandLeftOuterDefault + npTBinsCorrelations}; -auto sidebandRightInner_v = std::vector{sidebandRightInnerDefault, sidebandRightInnerDefault + npTBinsCorrelations}; -auto sidebandRightOuter_v = std::vector{sidebandRightOuterDefault, sidebandRightOuterDefault + npTBinsCorrelations}; +auto signalRegionInnerVec = std::vector{signalRegionInnerDefault, signalRegionInnerDefault + npTBinsCorrelations}; +auto signalRegionOuterVec = std::vector{signalRegionOuterDefault, signalRegionOuterDefault + npTBinsCorrelations}; +auto sidebandLeftInnerVec = std::vector{sidebandLeftInnerDefault, sidebandLeftInnerDefault + npTBinsCorrelations}; +auto sidebandLeftOuterVec = std::vector{sidebandLeftOuterDefault, sidebandLeftOuterDefault + npTBinsCorrelations}; +auto sidebandRightInnerVec = std::vector{sidebandRightInnerDefault, sidebandRightInnerDefault + npTBinsCorrelations}; +auto sidebandRightOuterVec = std::vector{sidebandRightOuterDefault, sidebandRightOuterDefault + npTBinsCorrelations}; const int npTBinsEfficiency = o2::analysis::hf_cuts_dplus_to_pi_k_pi::NBinsPt; std::vector efficiencyDmeson(npTBinsEfficiency + 1); /// Dplus-Hadron correlation pair filling task, from pair tables - for real data and data-like analysis (i.e. reco-level w/o matching request via MC truth) struct HfTaskCorrelationDplusHadrons { + Configurable isPromptAnalysis{"isPromptAnalysis", true, "Flag for prompt D+-hadron correlations"}; Configurable fillHistoData{"fillHistoData", true, "Flag for filling histograms in data processes"}; Configurable fillHistoMcRec{"fillHistoMcRec", true, "Flag for filling histograms in MC Rec processes"}; Configurable fillHistoMcGen{"fillHistoMcGen", true, "Flag for filling histograms in MC Gen processes"}; @@ -75,10 +77,10 @@ struct HfTaskCorrelationDplusHadrons { Configurable selectionFlagDplus{"selectionFlagDplus", 7, "Selection Flag for D+"}; // 7 corresponds to topo+PID cuts Configurable selNoSameBunchPileUpColl{"selNoSameBunchPileUpColl", true, "Flag for rejecting the collisions associated with the same bunch crossing"}; Configurable> classMl{"classMl", {0, 1, 2}, "Indexes of ML scores to be stored. Three indexes max."}; - Configurable> mlOutputPrompt{"mlScorePrompt", {0.5, 0.5, 0.5, 0.5}, "Machine learning scores for prompt"}; - Configurable> mlOutputBkg{"mlScoreBkg", {0.5, 0.5, 0.5, 0.5}, "Machine learning scores for bkg"}; + Configurable> mlScorePromptOrNonPrompt{"mlScorePromptOrNonPrompt", {0.5, 0.5, 0.5, 0.5}, "Machine learning scores for prompt or Feed-down"}; + Configurable> mlScoreBkg{"mlScoreBkg", {0.5, 0.5, 0.5, 0.5}, "Machine learning scores for bkg"}; // pT ranges for correlation plots: the default values are those embedded in hf_cuts_dplus_to_pi_k_pi (i.e. the mass pT bins), but can be redefined via json files - Configurable> binsPtCorrelations{"binsPtCorrelations", std::vector{pTBinsCorrelations_v}, "pT bin limits for correlation plots"}; + Configurable> binsPtCorrelations{"binsPtCorrelations", std::vector{ptBinsCorrelationsVec}, "pT bin limits for correlation plots"}; Configurable> binsPtHadron{"binsPtHadron", std::vector{0.3, 2., 4., 8., 12., 50.}, "pT bin limits for assoc particle efficiency"}; Configurable> binsPtEfficiencyD{"binsPtEfficiencyD", std::vector{o2::analysis::hf_cuts_dplus_to_pi_k_pi::vecBinsPt}, "pT bin limits for efficiency"}; Configurable> binsPtEfficiencyHad{"binsPtEfficiencyHad", std::vector{0.3, 2., 4., 8., 12., 50.}, "pT bin limits for associated particle efficiency"}; @@ -86,12 +88,12 @@ struct HfTaskCorrelationDplusHadrons { Configurable> efficiencyFdD{"efficiencyFdD", {1., 1., 1., 1., 1., 1.}, "efficiency values for beauty feed-down D+ meson"}; Configurable> efficiencyHad{"efficiencyHad", {1., 1., 1., 1., 1., 1.}, "efficiency values for associated particles"}; // signal and sideband region edges, to be defined via json file (initialised to empty) - Configurable> signalRegionInner{"signalRegionInner", std::vector{signalRegionInner_v}, "Inner values of signal region vs pT"}; - Configurable> signalRegionOuter{"signalRegionOuter", std::vector{signalRegionOuter_v}, "Outer values of signal region vs pT"}; - Configurable> sidebandLeftInner{"sidebandLeftInner", std::vector{sidebandLeftInner_v}, "Inner values of left sideband vs pT"}; - Configurable> sidebandLeftOuter{"sidebandLeftOuter", std::vector{sidebandLeftOuter_v}, "Outer values of left sideband vs pT"}; - Configurable> sidebandRightInner{"sidebandRightInner", std::vector{sidebandRightInner_v}, "Inner values of right sideband vs pT"}; - Configurable> sidebandRightOuter{"sidebandRightOuter", std::vector{sidebandRightOuter_v}, "Outer values of right sideband vs pT"}; + Configurable> signalRegionInner{"signalRegionInner", std::vector{signalRegionInnerVec}, "Inner values of signal region vs pT"}; + Configurable> signalRegionOuter{"signalRegionOuter", std::vector{signalRegionOuterVec}, "Outer values of signal region vs pT"}; + Configurable> sidebandLeftInner{"sidebandLeftInner", std::vector{sidebandLeftInnerVec}, "Inner values of left sideband vs pT"}; + Configurable> sidebandLeftOuter{"sidebandLeftOuter", std::vector{sidebandLeftOuterVec}, "Outer values of left sideband vs pT"}; + Configurable> sidebandRightInner{"sidebandRightInner", std::vector{sidebandRightInnerVec}, "Inner values of right sideband vs pT"}; + Configurable> sidebandRightOuter{"sidebandRightOuter", std::vector{sidebandRightOuterVec}, "Outer values of right sideband vs pT"}; Configurable dcaXYTrackMax{"dcaXYTrackMax", 1., "max. DCA_xy of tracks"}; Configurable dcaZTrackMax{"dcaZTrackMax", 1., "max. DCA_z of tracks"}; Configurable etaTrackMax{"etaTrackMax", 0.8, "max. eta of tracks"}; @@ -112,20 +114,14 @@ struct HfTaskCorrelationDplusHadrons { Configurable fdEffCcdbPath{"fdEffCcdbPath", "", "CCDB path for trigger efficiency"}; Configurable timestampCcdb{"timestampCcdb", -1, "timestamp of the efficiency files used to query in CCDB"}; Configurable ccdbNoLaterThan{"ccdbNoLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; - // configurable axis definition - ConfigurableAxis binsMassD{"binsMassD", {200, 1.7, 2.10}, "inv. mass (#pi^{+}K^{-}#pi^{+}) (GeV/#it{c}^{2})"}; - ConfigurableAxis binsBdtScore{"binsBdtScore", {100, 0., 1.}, "Bdt output scores"}; - ConfigurableAxis binsEta{"binsEta", {100, -2., 2.}, "#it{#eta}"}; - ConfigurableAxis binsPhi{"binsPhi", {64, -PIHalf, 3. * PIHalf}, "#it{#varphi}"}; - ConfigurableAxis binsMultFT0M{"binsMultFT0M", {600, 0., 8000.}, "Multiplicity as FT0M signal amplitude"}; - ConfigurableAxis binsPoolBin{"binsPoolBin", {9, 0., 9.}, "PoolBin"}; + HfHelper hfHelper; Service ccdb; std::shared_ptr mEfficiencyPrompt = nullptr; std::shared_ptr mEfficiencyFD = nullptr; std::shared_ptr mEfficiencyAssociated = nullptr; - - HfHelper hfHelper; + std::shared_ptr effD = nullptr; + int idxBdtScore = 1; // Index BDTScore 1 for Prompt and 2 for FD Analysis enum CandidateStep { kCandidateStepMcGenAll = 0, kCandidateStepMcGenDplusToPiKPi, @@ -143,6 +139,13 @@ struct HfTaskCorrelationDplusHadrons { Filter dplusFilter = ((o2::aod::hf_track_index::hfflag & static_cast(1 << aod::hf_cand_3prong::DecayType::DplusToPiKPi)) != static_cast(0)) && aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlagDplus; Filter trackFilter = (nabs(aod::track::eta) < etaTrackMax) && (aod::track::pt > ptTrackMin) && (aod::track::pt < ptTrackMax) && (nabs(aod::track::dcaXY) < dcaXYTrackMax) && (nabs(aod::track::dcaZ) < dcaZTrackMax); + // configurable axis definition + ConfigurableAxis binsMassD{"binsMassD", {200, 1.7, 2.10}, "inv. mass (#pi^{+}K^{-}#pi^{+}) (GeV/#it{c}^{2})"}; + ConfigurableAxis binsBdtScore{"binsBdtScore", {100, 0., 1.}, "Bdt output scores"}; + ConfigurableAxis binsEta{"binsEta", {100, -2., 2.}, "#it{#eta}"}; + ConfigurableAxis binsPhi{"binsPhi", {64, -PIHalf, 3. * PIHalf}, "#it{#varphi}"}; + ConfigurableAxis binsMultFT0M{"binsMultFT0M", {600, 0., 8000.}, "Multiplicity as FT0M signal amplitude"}; + ConfigurableAxis binsPoolBin{"binsPoolBin", {9, 0., 9.}, "PoolBin"}; HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -271,6 +274,8 @@ struct HfTaskCorrelationDplusHadrons { } LOGF(info, "Loaded associated efficiency histogram from %s", associatedEffCcdbPath.value.c_str()); } + auto effD = isPromptAnalysis ? mEfficiencyPrompt : mEfficiencyFD; + idxBdtScore = isPromptAnalysis ? 1 : 2; if (activateQA) { const int regionLimits = 6; @@ -297,22 +302,24 @@ struct HfTaskCorrelationDplusHadrons { float massD = candidate.mD(); float ptD = candidate.ptD(); float bdtScorePrompt = candidate.mlScorePrompt(); + float bdtScoreNonPrompt = candidate.mlScoreNonPrompt(); float bdtScoreBkg = candidate.mlScoreBkg(); int effBinD = o2::analysis::findBin(binsPtEfficiencyD, ptD); + float bdtScorePromptOrNonPrompt = isPromptAnalysis ? bdtScorePrompt : bdtScoreNonPrompt; // reject entries outside pT ranges of interest if (ptD < binsPtEfficiencyD->front() || ptD > binsPtEfficiencyD->back()) { continue; } - if (bdtScorePrompt < mlOutputPrompt->at(effBinD) || bdtScoreBkg > mlOutputBkg->at(effBinD)) { + if (bdtScorePromptOrNonPrompt < mlScorePromptOrNonPrompt->at(effBinD) || bdtScoreBkg > mlScoreBkg->at(effBinD)) { continue; } double efficiencyWeightD = 1.; if (applyEfficiency) { efficiencyWeightD = 1. / efficiencyD->at(o2::analysis::findBin(binsPtEfficiencyD, ptD)); if (loadAccXEffFromCCDB) { - efficiencyWeightD = 1. / mEfficiencyPrompt->GetBinContent(mEfficiencyPrompt->FindBin(ptD)); + efficiencyWeightD = 1. / effD->GetBinContent(effD->FindBin(ptD)); } } registry.fill(HIST("hMassDplusVsPt"), massD, ptD, efficiencyWeightD); @@ -328,6 +335,7 @@ struct HfTaskCorrelationDplusHadrons { float ptD = pairEntry.ptD(); float ptHadron = pairEntry.ptHadron(); float bdtScorePrompt = pairEntry.mlScorePrompt(); + float bdtScoreNonPrompt = pairEntry.mlScoreNonPrompt(); float bdtScoreBkg = pairEntry.mlScoreBkg(); float trackDcaXY = pairEntry.trackDcaXY(); float trackDcaZ = pairEntry.trackDcaZ(); @@ -336,13 +344,14 @@ struct HfTaskCorrelationDplusHadrons { double massD = pairEntry.mD(); int effBinD = o2::analysis::findBin(binsPtEfficiencyD, ptD); int pTBinD = o2::analysis::findBin(binsPtCorrelations, ptD); + float bdtScorePromptOrNonPrompt = isPromptAnalysis ? bdtScorePrompt : bdtScoreNonPrompt; // reject entries outside pT ranges of interest if (ptD < binsPtEfficiencyD->front() || ptD > binsPtEfficiencyD->back()) { continue; } - if (bdtScorePrompt < mlOutputPrompt->at(effBinD) || bdtScoreBkg > mlOutputBkg->at(effBinD)) { + if (bdtScorePromptOrNonPrompt < mlScorePromptOrNonPrompt->at(effBinD) || bdtScoreBkg > mlScoreBkg->at(effBinD)) { continue; } if (trackDcaXY > dcaXYTrackMax || trackDcaZ > dcaZTrackMax || trackTpcCrossedRows < nTpcCrossedRaws) { @@ -352,7 +361,7 @@ struct HfTaskCorrelationDplusHadrons { if (applyEfficiency) { efficiencyWeight = 1. / (efficiencyD->at(effBinD) * efficiencyHad->at(o2::analysis::findBin(binsPtEfficiencyHad, ptHadron))); if (loadAccXEffFromCCDB) { - efficiencyWeight = 1. / (mEfficiencyPrompt->GetBinContent(mEfficiencyPrompt->FindBin(ptD)) * mEfficiencyAssociated->GetBinContent(mEfficiencyAssociated->FindBin(ptHadron))); + efficiencyWeight = 1. / (effD->GetBinContent(effD->FindBin(ptD)) * mEfficiencyAssociated->GetBinContent(mEfficiencyAssociated->FindBin(ptHadron))); } } // check if correlation entry belongs to signal region, sidebands or is outside both, and fill correlation plots @@ -395,15 +404,17 @@ struct HfTaskCorrelationDplusHadrons { float massD = candidate.mD(); float ptD = candidate.ptD(); float bdtScorePrompt = candidate.mlScorePrompt(); + float bdtScoreNonPrompt = candidate.mlScoreNonPrompt(); float bdtScoreBkg = candidate.mlScoreBkg(); int effBinD = o2::analysis::findBin(binsPtEfficiencyD, ptD); bool isDplusPrompt = candidate.isPrompt(); + float bdtScorePromptOrNonPrompt = isPromptAnalysis ? bdtScorePrompt : bdtScoreNonPrompt; // reject entries outside pT ranges of interest if (ptD < binsPtEfficiencyD->front() || ptD > binsPtEfficiencyD->back()) continue; - if (bdtScorePrompt < mlOutputPrompt->at(effBinD) || bdtScoreBkg > mlOutputBkg->at(effBinD)) { + if (bdtScorePromptOrNonPrompt < mlScorePromptOrNonPrompt->at(effBinD) || bdtScoreBkg > mlScoreBkg->at(effBinD)) { continue; } double efficiencyWeightD = 1.; @@ -440,22 +451,24 @@ struct HfTaskCorrelationDplusHadrons { float ptHadron = pairEntry.ptHadron(); float massD = pairEntry.mD(); float bdtScorePrompt = pairEntry.mlScorePrompt(); + float bdtScoreNonPrompt = pairEntry.mlScoreNonPrompt(); float bdtScoreBkg = pairEntry.mlScoreBkg(); bool isPhysicalPrimary = pairEntry.isPhysicalPrimary(); float trackDcaXY = pairEntry.trackDcaXY(); float trackDcaZ = pairEntry.trackDcaZ(); int trackTpcCrossedRows = pairEntry.trackTPCNClsCrossedRows(); - int statusDplusPrompt = static_cast(pairEntry.isPrompt()); - int statusPromptHadron = pairEntry.trackOrigin(); + bool isDplusPrompt = pairEntry.isPrompt(); + int originHadron = pairEntry.trackOrigin(); int poolBin = pairEntry.poolBin(); int effBinD = o2::analysis::findBin(binsPtEfficiencyD, ptD); int pTBinD = o2::analysis::findBin(binsPtCorrelations, ptD); + float bdtScorePromptOrNonPrompt = isPromptAnalysis ? bdtScorePrompt : bdtScoreNonPrompt; // reject entries outside pT ranges of interest if (ptD < binsPtEfficiencyD->front() || ptD > binsPtEfficiencyD->back()) continue; - if (bdtScorePrompt < mlOutputPrompt->at(effBinD) || bdtScoreBkg > mlOutputBkg->at(effBinD)) { + if (bdtScorePromptOrNonPrompt < mlScorePromptOrNonPrompt->at(effBinD) || bdtScoreBkg > mlScoreBkg->at(effBinD)) { continue; } if (trackDcaXY > dcaXYTrackMax || trackDcaZ > dcaZTrackMax || trackTpcCrossedRows < nTpcCrossedRaws) { @@ -464,7 +477,7 @@ struct HfTaskCorrelationDplusHadrons { double efficiencyWeight = 1.; if (applyEfficiency) { - if (statusDplusPrompt) { + if (isDplusPrompt) { efficiencyWeight = 1. / (efficiencyD->at(effBinD) * efficiencyHad->at(o2::analysis::findBin(binsPtEfficiencyHad, ptHadron))); if (loadAccXEffFromCCDB) { efficiencyWeight = 1. / (mEfficiencyPrompt->GetBinContent(mEfficiencyPrompt->FindBin(ptD)) * mEfficiencyAssociated->GetBinContent(mEfficiencyAssociated->FindBin(ptHadron))); @@ -488,15 +501,15 @@ struct HfTaskCorrelationDplusHadrons { // check if correlation entry belongs to signal region, sidebands or is outside both, and fill correlation plots if (massD > signalRegionInner->at(pTBinD) && massD < signalRegionOuter->at(pTBinD)) { // in signal region - registry.fill(HIST("hCorrel2DVsPtSignalRegionMcRec"), deltaPhi, deltaEta, ptD, ptHadron, statusDplusPrompt, poolBin, efficiencyWeight); + registry.fill(HIST("hCorrel2DVsPtSignalRegionMcRec"), deltaPhi, deltaEta, ptD, ptHadron, static_cast(isDplusPrompt), poolBin, efficiencyWeight); registry.fill(HIST("hCorrel2DPtIntSignalRegionMcRec"), deltaPhi, deltaEta, efficiencyWeight); registry.fill(HIST("hDeltaEtaPtIntSignalRegionMcRec"), deltaEta, efficiencyWeight); registry.fill(HIST("hDeltaPhiPtIntSignalRegionMcRec"), deltaPhi, efficiencyWeight); if (isPhysicalPrimary) { - registry.fill(HIST("hCorrel2DVsPtPhysicalPrimaryMcRec"), deltaPhi, deltaEta, ptD, ptHadron, statusDplusPrompt, poolBin, efficiencyWeight); - if (statusDplusPrompt == 1 && statusPromptHadron == 1) { + registry.fill(HIST("hCorrel2DVsPtPhysicalPrimaryMcRec"), deltaPhi, deltaEta, ptD, ptHadron, static_cast(isDplusPrompt), poolBin, efficiencyWeight); + if (isDplusPrompt && originHadron == RecoDecay::OriginType::Prompt) { registry.fill(HIST("hCorrel2DVsPtSignalRegionPromptDplusPromptHadronMcRec"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); - } else if (statusDplusPrompt == 0 && statusPromptHadron == 2) { + } else if (!isDplusPrompt && originHadron == RecoDecay::OriginType::NonPrompt) { registry.fill(HIST("hCorrel2DVsPtSignalRegionNonPromptDplusNonPromptHadronMcRec"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); } } @@ -535,7 +548,7 @@ struct HfTaskCorrelationDplusHadrons { float ptD = pairEntry.ptD(); float ptHadron = pairEntry.ptHadron(); int poolBin = pairEntry.poolBin(); - int statusPromptHadron = pairEntry.trackOrigin(); + int originHadron = pairEntry.trackOrigin(); bool isDplusPrompt = pairEntry.isPrompt(); registry.fill(HIST("hCorrel2DVsPtMcGen"), deltaPhi, deltaEta, ptD, ptHadron, poolBin); @@ -543,12 +556,12 @@ struct HfTaskCorrelationDplusHadrons { registry.fill(HIST("hDeltaPhiPtIntMcGen"), deltaPhi); if (isDplusPrompt) { registry.fill(HIST("hCorrel2DVsPtMcGenPrompt"), deltaPhi, deltaEta, ptD, ptHadron, poolBin); - if (statusPromptHadron == 1) { + if (originHadron == RecoDecay::OriginType::Prompt) { registry.fill(HIST("hCorrel2DVsPtMcGenPromptDPromptHadron"), deltaPhi, deltaEta, ptD, ptHadron, poolBin); } } else { registry.fill(HIST("hCorrel2DVsPtMcGenNonPrompt"), deltaPhi, deltaEta, ptD, ptHadron, poolBin); - if (statusPromptHadron == 2) { + if (originHadron == RecoDecay::OriginType::NonPrompt) { registry.fill(HIST("hCorrel2DVsPtMcGenNonPromptDNonPromptHadron"), deltaPhi, deltaEta, ptD, ptHadron, poolBin); } } @@ -612,7 +625,7 @@ struct HfTaskCorrelationDplusHadrons { for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { outputMl[iclass] = candidate.mlProbDplusToPiKPi()[classMl->at(iclass)]; } - if (outputMl[0] > mlOutputBkg->at(o2::analysis::findBin(binsPtEfficiencyD, candidate.pt())) || outputMl[1] < mlOutputPrompt->at(o2::analysis::findBin(binsPtEfficiencyD, candidate.pt()))) { + if (outputMl[0] > mlScoreBkg->at(o2::analysis::findBin(binsPtEfficiencyD, candidate.pt())) || outputMl[idxBdtScore] < mlScorePromptOrNonPrompt->at(o2::analysis::findBin(binsPtEfficiencyD, candidate.pt()))) { continue; } auto collision = candidate.template collision_as>(); From db66fa956677f76685aa4226e79848a5585a830d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Mon, 28 Apr 2025 13:58:20 +0200 Subject: [PATCH 1117/1650] [ALICE3] A3: add expected times (#11006) --- ALICE3/DataModel/OTFTOF.h | 28 ++++++++++++++++++++- ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx | 21 +++++++++++----- 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/ALICE3/DataModel/OTFTOF.h b/ALICE3/DataModel/OTFTOF.h index 14fe00943b6..10f3de38b19 100644 --- a/ALICE3/DataModel/OTFTOF.h +++ b/ALICE3/DataModel/OTFTOF.h @@ -41,6 +41,13 @@ DECLARE_SOA_COLUMN(NSigmaKaonInnerTOF, nSigmaKaonInnerTOF, float); //! DECLARE_SOA_COLUMN(NSigmaProtonInnerTOF, nSigmaProtonInnerTOF, float); //! NSigma proton InnerTOF DECLARE_SOA_COLUMN(InnerTOFTrackTimeReco, innerTOFTrackTimeReco, float); //! Track time measured at the InnerTOF DECLARE_SOA_COLUMN(InnerTOFTrackLengthReco, innerTOFTrackLengthReco, float); //! track length for calculation of InnerTOF (reconstructed) + +DECLARE_SOA_COLUMN(InnerTOFExpectedTimeEl, innerTOFExpectedTimeEl, float); //! Reconstructed expected time at the InnerTOF for the Electron mass hypotheses +DECLARE_SOA_COLUMN(InnerTOFExpectedTimeMu, innerTOFExpectedTimeMu, float); //! Reconstructed expected time at the InnerTOF for the Muon mass hypotheses +DECLARE_SOA_COLUMN(InnerTOFExpectedTimePi, innerTOFExpectedTimePi, float); //! Reconstructed expected time at the InnerTOF for the Pion mass hypotheses +DECLARE_SOA_COLUMN(InnerTOFExpectedTimeKa, innerTOFExpectedTimeKa, float); //! Reconstructed expected time at the InnerTOF for the Kaon mass hypotheses +DECLARE_SOA_COLUMN(InnerTOFExpectedTimePr, innerTOFExpectedTimePr, float); //! Reconstructed expected time at the InnerTOF for the Proton mass hypotheses + DECLARE_SOA_COLUMN(NSigmaElectronOuterTOF, nSigmaElectronOuterTOF, float); //! NSigma electron OuterTOF DECLARE_SOA_COLUMN(NSigmaMuonOuterTOF, nSigmaMuonOuterTOF, float); //! NSigma muon OuterTOF DECLARE_SOA_COLUMN(NSigmaPionOuterTOF, nSigmaPionOuterTOF, float); //! NSigma pion OuterTOF @@ -48,6 +55,12 @@ DECLARE_SOA_COLUMN(NSigmaKaonOuterTOF, nSigmaKaonOuterTOF, float); //! DECLARE_SOA_COLUMN(NSigmaProtonOuterTOF, nSigmaProtonOuterTOF, float); //! NSigma proton OuterTOF DECLARE_SOA_COLUMN(OuterTOFTrackTimeReco, outerTOFTrackTimeReco, float); //! Track time measured at the OuterTOF DECLARE_SOA_COLUMN(OuterTOFTrackLengthReco, outerTOFTrackLengthReco, float); //! track length for calculation of OuterTOF (reconstructed) + +DECLARE_SOA_COLUMN(OuterTOFExpectedTimeEl, outerTOFExpectedTimeEl, float); //! Reconstructed expected time at the OuterTOF for the Electron mass hypotheses +DECLARE_SOA_COLUMN(OuterTOFExpectedTimeMu, outerTOFExpectedTimeMu, float); //! Reconstructed expected time at the OuterTOF for the Muon mass hypotheses +DECLARE_SOA_COLUMN(OuterTOFExpectedTimePi, outerTOFExpectedTimePi, float); //! Reconstructed expected time at the OuterTOF for the Pion mass hypotheses +DECLARE_SOA_COLUMN(OuterTOFExpectedTimeKa, outerTOFExpectedTimeKa, float); //! Reconstructed expected time at the OuterTOF for the Kaon mass hypotheses +DECLARE_SOA_COLUMN(OuterTOFExpectedTimePr, outerTOFExpectedTimePr, float); //! Reconstructed expected time at the OuterTOF for the Proton mass hypotheses } // namespace upgrade_tof DECLARE_SOA_TABLE(UpgradeTofMCs, "AOD", "UPGRADETOFMC", @@ -74,8 +87,21 @@ DECLARE_SOA_TABLE(UpgradeTofs, "AOD", "UPGRADETOF", upgrade_tof::OuterTOFTrackTimeReco, upgrade_tof::OuterTOFTrackLengthReco); -using UpgradeTof = UpgradeTofs::iterator; +DECLARE_SOA_TABLE(UpgradeTofExpectedTimes, "AOD", "UPGRADETOFEXPT", + upgrade_tof::InnerTOFExpectedTimeEl, + upgrade_tof::InnerTOFExpectedTimeMu, + upgrade_tof::InnerTOFExpectedTimePi, + upgrade_tof::InnerTOFExpectedTimeKa, + upgrade_tof::InnerTOFExpectedTimePr, + upgrade_tof::OuterTOFExpectedTimeEl, + upgrade_tof::OuterTOFExpectedTimeMu, + upgrade_tof::OuterTOFExpectedTimePi, + upgrade_tof::OuterTOFExpectedTimeKa, + upgrade_tof::OuterTOFExpectedTimePr); + using UpgradeTofMC = UpgradeTofMCs::iterator; +using UpgradeTof = UpgradeTofs::iterator; +using UpgradeTofExpectedTime = UpgradeTofExpectedTimes::iterator; } // namespace o2::aod diff --git a/ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx b/ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx index fc9179e73dd..6ace72fda1a 100644 --- a/ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx +++ b/ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx @@ -63,6 +63,7 @@ using namespace o2::framework; struct OnTheFlyTofPid { Produces upgradeTofMC; Produces upgradeTof; + Produces upgradeTofExpectedTime; // necessary for particle charges Service pdg; @@ -141,7 +142,7 @@ struct OnTheFlyTofPid { mapPdgLut.insert(std::make_pair(321, lutKaChar)); mapPdgLut.insert(std::make_pair(2212, lutPrChar)); - for (auto e : mapPdgLut) { + for (const auto& e : mapPdgLut) { if (!mSmearer.loadTable(e.first, e.second)) { LOG(fatal) << "Having issue with loading the LUT " << e.first << " " << e.second; } @@ -350,7 +351,7 @@ struct OnTheFlyTofPid { float sum = 0.; float sumw = 0.; - for (auto& track : tracks) { + for (const auto& track : tracks) { auto pdgInfo = pdg->GetParticle(track.mPdgCode); if (pdgInfo == nullptr) { continue; @@ -549,8 +550,9 @@ struct OnTheFlyTofPid { const float noSmearingPt = trkWithTime.mNoSmearingPt; // Straight to Nsigma - float deltaTimeInnerTOF[5], nSigmaInnerTOF[5]; - float deltaTimeOuterTOF[5], nSigmaOuterTOF[5]; + static std::array expectedTimeInnerTOF, expectedTimeOuterTOF; + static std::array deltaTimeInnerTOF, deltaTimeOuterTOF; + static std::array nSigmaInnerTOF, nSigmaOuterTOF; static constexpr int lpdg_array[5] = {kElectron, kMuonMinus, kPiPlus, kKPlus, kProton}; float masses[5]; @@ -576,8 +578,13 @@ struct OnTheFlyTofPid { auto pdgInfoThis = pdg->GetParticle(lpdg_array[ii]); masses[ii] = pdgInfoThis->Mass(); - deltaTimeInnerTOF[ii] = trackLengthRecoInnerTOF / velocity(momentum, masses[ii]) - measuredTimeInnerTOF; - deltaTimeOuterTOF[ii] = trackLengthRecoOuterTOF / velocity(momentum, masses[ii]) - measuredTimeOuterTOF; + const float v = velocity(momentum, masses[ii]); + + expectedTimeInnerTOF[ii] = trackLengthInnerTOF / v; + expectedTimeOuterTOF[ii] = trackLengthOuterTOF / v; + + deltaTimeInnerTOF[ii] = measuredTimeInnerTOF - expectedTimeInnerTOF[ii]; + deltaTimeOuterTOF[ii] = measuredTimeOuterTOF - expectedTimeInnerTOF[ii]; // Evaluate total sigma (layer + tracking resolution) float innerTotalTimeReso = simConfig.innerTOFTimeReso; @@ -769,6 +776,8 @@ struct OnTheFlyTofPid { measuredTimeInnerTOF, trackLengthRecoInnerTOF, nSigmaOuterTOF[0], nSigmaOuterTOF[1], nSigmaOuterTOF[2], nSigmaOuterTOF[3], nSigmaOuterTOF[4], measuredTimeOuterTOF, trackLengthRecoOuterTOF); + upgradeTofExpectedTime(expectedTimeInnerTOF[0], expectedTimeInnerTOF[1], expectedTimeInnerTOF[2], expectedTimeInnerTOF[3], expectedTimeInnerTOF[4], + expectedTimeOuterTOF[0], expectedTimeOuterTOF[1], expectedTimeOuterTOF[2], expectedTimeOuterTOF[3], expectedTimeOuterTOF[4]); } } }; From 59ed5d12b1a8fecf7c80d68e56b4b0962a7beec1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Mon, 28 Apr 2025 14:46:38 +0200 Subject: [PATCH 1118/1650] [ALICE3] A3: Add option for ev time (#11007) - add comments - fix some linter errors --- ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx | 50 ++++++++++++--------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx b/ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx index 6ace72fda1a..5ec54c6daed 100644 --- a/ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx +++ b/ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx @@ -8,10 +8,18 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. - -// -// Task to add a table of track parameters propagated to the primary vertex -// +/// \file onTheFlyTOFPID.cxx +/// +/// \brief This task goes straight from a combination of track table and mcParticles +/// and a custom TOF configuration to a table of TOF NSigmas for the particles +/// being analysed. It currently contemplates 5 particle types: +/// electrons, pions, kaons, protons and muons +/// +/// More particles could be added but would have to be added to the LUT +/// being used in the onTheFly tracker task. +/// +/// \author David Dobrigkeit Chinellato, UNICAMP +/// \author Nicola Nicassio, University and INFN Bari #include #include @@ -45,18 +53,6 @@ #include "TableHelper.h" #include "ALICE3/Core/DelphesO2TrackSmearer.h" -/// \file onTheFlyTOFPID.cxx -/// -/// \brief This task goes straight from a combination of track table and mcParticles -/// and a custom TOF configuration to a table of TOF NSigmas for the particles -/// being analysed. It currently contemplates 5 particle types: -/// electrons, pions, kaons, protons and muons -/// -/// More particles could be added but would have to be added to the LUT -/// being used in the onTheFly tracker task. -/// -/// \author David Dobrigkeit Chinellato, UNICAMP, Nicola Nicassio, University and INFN Bari - using namespace o2; using namespace o2::framework; @@ -150,10 +146,13 @@ struct OnTheFlyTofPid { } if (plotsConfig.doQAplots) { + const AxisSpec axisdNdeta{200, 0.0f, 1000.0f, Form("dN/d#eta in |#eta| < %f", simConfig.multiplicityEtaRange.value)}; + + histos.add("h1dNdeta", "h2dNdeta", kTH1F, {axisdNdeta}); histos.add("h2dEventTime", "h2dEventTime", kTH2F, {{200, -1000, 1000, "computed"}, {200, -1000, 1000, "generated"}}); histos.add("h1dEventTimegen", "h1dEventTimegen", kTH1F, {{200, -1000, 1000, "generated"}}); histos.add("h1dEventTimerec", "h1dEventTimerec", kTH1F, {{200, -1000, 1000, "computed"}}); - histos.add("h1dEventTimeres", "h1dEventTimeres", kTH1F, {{300, 0, 300, "resolution"}}); + histos.add("h2dEventTimeres", "h2dEventTimeres", kTH2F, {axisdNdeta, {300, 0, 300, "resolution"}}); const AxisSpec axisMomentum{static_cast(plotsConfig.nBinsP), 0.0f, +10.0f, "#it{p} (GeV/#it{c})"}; const AxisSpec axisMomentumSmall{static_cast(plotsConfig.nBinsP), 0.0f, +1.0f, "#it{p} (GeV/#it{c})"}; @@ -351,6 +350,7 @@ struct OnTheFlyTofPid { float sum = 0.; float sumw = 0.; + // Todo: check the different mass hypothesis iteratively for (const auto& track : tracks) { auto pdgInfo = pdg->GetParticle(track.mPdgCode); if (pdgInfo == nullptr) { @@ -427,7 +427,7 @@ struct OnTheFlyTofPid { std::array mcPvCov = {0.}; o2::dataformats::VertexBase mcPvVtx({0.0f, 0.0f, 0.0f}, mcPvCov); - const float eventCollisionTimePS = collision.collisionTime() * 1e3; // convert ns to ps + const float eventCollisionTimePS = (simConfig.considerEventTime.value ? collision.collisionTime() * 1e3 : 0.f); // convert ns to ps if (collision.has_mcCollision()) { auto mcCollision = collision.mcCollision(); mcPvVtx.setX(mcCollision.posX()); @@ -459,6 +459,9 @@ struct OnTheFlyTofPid { dNdEta += 1.f; } } + if (plotsConfig.doQAplots) { + histos.fill(HIST("h1dNdeta"), dNdEta); + } tracksWithTime.clear(); // clear the vector of tracks with time to prepare the cache for the next event tracksWithTime.reserve(tracks.size()); @@ -519,16 +522,18 @@ struct OnTheFlyTofPid { // Now we compute the event time for the tracks std::array tzero = {0.f, 0.f}; - const bool etStatus = eventTime(tracksWithTime, tzero); - if (!etStatus) { - LOG(warning) << "Event time calculation failed with " << tracksWithTime.size() << " tracks"; + if (simConfig.considerEventTime.value) { + const bool etStatus = eventTime(tracksWithTime, tzero); + if (!etStatus) { + LOG(warning) << "Event time calculation failed with " << tracksWithTime.size() << " tracks"; + } } if (plotsConfig.doQAplots) { histos.fill(HIST("h2dEventTime"), tzero[0], eventCollisionTimePS); histos.fill(HIST("h1dEventTimegen"), eventCollisionTimePS); histos.fill(HIST("h1dEventTimerec"), tzero[0]); - histos.fill(HIST("h1dEventTimeres"), tzero[1]); + histos.fill(HIST("h2dEventTimeres"), dNdEta, tzero[1]); } // Then we do a second loop to compute the measured quantities with the measured event time @@ -543,6 +548,7 @@ struct OnTheFlyTofPid { const float trackLengthRecoOuterTOF = trkWithTime.mTrackLengthOuterTOF.first; const float trackLengthInnerTOF = trkWithTime.mTrackLengthInnerTOF.second; const float trackLengthOuterTOF = trkWithTime.mTrackLengthOuterTOF.second; + // Todo: remove the bias of the track used in the event time calculation for low multiplicity events const float measuredTimeInnerTOF = trkWithTime.mInnerTOFTime.first - tzero[0]; const float measuredTimeOuterTOF = trkWithTime.mOuterTOFTime.first - tzero[0]; const float momentum = trkWithTime.mMomentum.first; From 2c388167da7400cd5e2272dd0872fd3b27640397 Mon Sep 17 00:00:00 2001 From: hyungjun <109190387+hyungjun-lee@users.noreply.github.com> Date: Mon, 28 Apr 2025 23:36:38 +0900 Subject: [PATCH 1119/1650] [PWGJE] modification of IP tagging method (#11003) --- PWGJE/TableProducer/jetTaggerHF.cxx | 157 ++++++++++++++++++++++++---- PWGJE/Tasks/jetTaggerHFQA.cxx | 102 +++++++++++------- 2 files changed, 202 insertions(+), 57 deletions(-) diff --git a/PWGJE/TableProducer/jetTaggerHF.cxx b/PWGJE/TableProducer/jetTaggerHF.cxx index 785118fa180..0ab545fe414 100644 --- a/PWGJE/TableProducer/jetTaggerHF.cxx +++ b/PWGJE/TableProducer/jetTaggerHF.cxx @@ -64,7 +64,11 @@ struct JetTaggerHFTask { Configurable trackProbQA{"trackProbQA", false, "fill track probability histograms separately for geometric positive and negative tracks for QA"}; Configurable numCount{"numCount", 3, "number of track counting"}; Configurable resoFuncMatching{"resoFuncMatching", 0, "matching parameters of resolution function as MC samble (0: custom, 1: custom & inc, 2: MB, 3: MB & inc, 4: JJ, 5: JJ & inc)"}; - Configurable> pathsCCDBforIPparamer{"pathsCCDBforIPparamer", std::vector{"Users/l/leehy/LHC24g4/f_inclusive_0"}, "Paths for fitting parameters of resolution functions for IP method on CCDB"}; + Configurable> pathsCCDBforIPDataparameter{"pathsCCDBforIPDataparameter", std::vector{"Users/l/leehy/LHC24g4/f_inclusive_0"}, "Paths for fitting parameters of resolution functions of data for IP method on CCDB"}; + Configurable> pathsCCDBforIPIncparameter{"pathsCCDBforIPIncparameter", std::vector{"Users/l/leehy/LHC24g4/f_inclusive_0"}, "Paths for fitting parameters of resolution functions of inclusive for IP method on CCDB"}; + Configurable> pathsCCDBforIPBeautyparameter{"pathsCCDBforIPBeautyparameter", std::vector{"Users/l/leehy/LHC24g4/f_inclusive_0"}, "Paths for fitting parameters of resolution functions of beauty for IP method on CCDB"}; + Configurable> pathsCCDBforIPCharmparameter{"pathsCCDBforIPCharmparameter", std::vector{"Users/l/leehy/LHC24g4/f_inclusive_0"}, "Paths for fitting parameters of resolution functions of charm for IP method on CCDB"}; + Configurable> pathsCCDBforIPLfparameter{"pathsCCDBforIPLfparameter", std::vector{"Users/l/leehy/LHC24g4/f_inclusive_0"}, "Paths for fitting parameters of resolution functions of light flavour for IP method on CCDB"}; Configurable usepTcategorize{"usepTcategorize", false, "p_T categorize TF1 function with Inclusive jet"}; Configurable> paramsResoFuncData{"paramsResoFuncData", std::vector{-1.0}, "parameters of gaus(0)+expo(3)+expo(5)+expo(7))"}; Configurable> paramsResoFuncIncJetMC{"paramsResoFuncIncJetMC", std::vector{-1.0}, "parameters of gaus(0)+expo(3)+expo(5)+expo(7)))"}; @@ -135,8 +139,17 @@ struct JetTaggerHFTask { std::unique_ptr fSignImpXYSigBeautyJetMC = nullptr; std::unique_ptr fSignImpXYSigLfJetMC = nullptr; + std::vector> vecParamsDataJetCCDB; std::vector> vecParamsIncJetMcCCDB; + std::vector> vecParamsBeautyJetMcCCDB; + std::vector> vecParamsCharmJetMcCCDB; + std::vector> vecParamsLfJetMcCCDB; + + std::vector> vecfSignImpXYSigDataJetCCDB; std::vector> vecfSignImpXYSigIncJetMcCCDB; + std::vector> vecfSignImpXYSigCharmJetMcCCDB; + std::vector> vecfSignImpXYSigBeautyJetMcCCDB; + std::vector> vecfSignImpXYSigLfJetMcCCDB; std::vector decisionNonML; std::vector scoreML; @@ -148,7 +161,11 @@ struct JetTaggerHFTask { { float jetProb = -1.0; if (!isMC) { - jetProb = jettaggingutilities::getJetProbability(fSignImpXYSigData, jet, tracks, trackDcaXYMax, trackDcaZMax, minSignImpXYSig); + if (usepTcategorize) { + jetProb = jettaggingutilities::getJetProbability(vecfSignImpXYSigDataJetCCDB, jet, tracks, trackDcaXYMax, trackDcaZMax, minSignImpXYSig); + } else { + jetProb = jettaggingutilities::getJetProbability(fSignImpXYSigData, jet, tracks, trackDcaXYMax, trackDcaZMax, minSignImpXYSig); + } } else { if (useResoFuncFromIncJet) { if (usepTcategorize) { @@ -158,11 +175,23 @@ struct JetTaggerHFTask { } } else { if (origin == JetTaggingSpecies::charm) { - jetProb = jettaggingutilities::getJetProbability(fSignImpXYSigCharmJetMC, jet, tracks, trackDcaXYMax, trackDcaZMax, minSignImpXYSig); + if (usepTcategorize) { + jetProb = jettaggingutilities::getJetProbability(vecfSignImpXYSigCharmJetMcCCDB, jet, tracks, trackDcaXYMax, trackDcaZMax, minSignImpXYSig); + } else { + jetProb = jettaggingutilities::getJetProbability(fSignImpXYSigCharmJetMC, jet, tracks, trackDcaXYMax, trackDcaZMax, minSignImpXYSig); + } } else if (origin == JetTaggingSpecies::beauty) { - jetProb = jettaggingutilities::getJetProbability(fSignImpXYSigBeautyJetMC, jet, tracks, trackDcaXYMax, trackDcaZMax, minSignImpXYSig); + if (usepTcategorize) { + jetProb = jettaggingutilities::getJetProbability(vecfSignImpXYSigBeautyJetMcCCDB, jet, tracks, trackDcaXYMax, trackDcaZMax, minSignImpXYSig); + } else { + jetProb = jettaggingutilities::getJetProbability(fSignImpXYSigBeautyJetMC, jet, tracks, trackDcaXYMax, trackDcaZMax, minSignImpXYSig); + } } else { - jetProb = jettaggingutilities::getJetProbability(fSignImpXYSigLfJetMC, jet, tracks, trackDcaXYMax, trackDcaZMax, minSignImpXYSig); + if (usepTcategorize) { + jetProb = jettaggingutilities::getJetProbability(vecfSignImpXYSigLfJetMcCCDB, jet, tracks, trackDcaXYMax, trackDcaZMax, minSignImpXYSig); + } else { + jetProb = jettaggingutilities::getJetProbability(fSignImpXYSigLfJetMC, jet, tracks, trackDcaXYMax, trackDcaZMax, minSignImpXYSig); + } } } } @@ -215,12 +244,12 @@ struct JetTaggerHFTask { } if (useJetProb) { if constexpr (isMC) { - jetProb = calculateJetProbability(origin, jet, tracks); + jetProb = calculateJetProbability(origin, jet, tracks, isMC); if (trackProbQA) { evaluateTrackProbQA(origin, jet, tracks, isMC); } } else { - jetProb = calculateJetProbability(0, jet, tracks); + jetProb = calculateJetProbability(0, jet, tracks, isMC); if (trackProbQA) { evaluateTrackProbQA(0, jet, tracks, isMC); } @@ -256,21 +285,59 @@ struct JetTaggerHFTask { std::vector vecParamsCharmJetMC; std::vector vecParamsBeautyJetMC; std::vector vecParamsLfJetMC; - std::vector resoFuncCCDB; + + std::vector resoFuncDataCCDB; + std::vector resoFuncIncCCDB; + std::vector resoFuncBeautyCCDB; + std::vector resoFuncCharmCCDB; + std::vector resoFuncLfCCDB; ccdbApi.init(ccdbUrl); + + std::map metadata; + resoFuncMatch = resoFuncMatching; + + const int IPmethodResolutionFunctionSize = 7; + + auto loadCCDBforIP = [&](const std::vector& paths, std::vector& targetVec, const std::string& name) { + if (paths.size() != IPmethodResolutionFunctionSize) { + usepTcategorize.value = false; + LOG(info) << name << " does not have 7 entries. Disabling pT categorization (usepTcategorize = false)."; + resoFuncMatch = 0; + return; + } + for (int i = 0; i < IPmethodResolutionFunctionSize; i++) { + targetVec.push_back(ccdbApi.retrieveFromTFileAny(paths[i], metadata, -1)); + } + }; + if (usepTcategorize) { - std::map metadata; // dummy meta data (will be updated) - // fill the timestamp directly of each TF1 according to p_T track range (0, 0.5, 1, 2, 4, 6, 9) - for (int i = 0; i < 7; i++) { - resoFuncCCDB.push_back(ccdbApi.retrieveFromTFileAny(pathsCCDBforIPparamer->at(i), metadata, -1)); + switch (resoFuncMatch) { + case 6: + loadCCDBforIP(pathsCCDBforIPIncparameter, resoFuncIncCCDB, "pathsCCDBforIPIncparameter"); + break; + + case 7: + loadCCDBforIP(pathsCCDBforIPBeautyparameter, resoFuncBeautyCCDB, "pathsCCDBforIPBeautyparameter"); + loadCCDBforIP(pathsCCDBforIPCharmparameter, resoFuncCharmCCDB, "pathsCCDBforIPCharmparameter"); + loadCCDBforIP(pathsCCDBforIPLfparameter, resoFuncLfCCDB, "pathsCCDBforIPLfparameter"); + break; + + case 8: + loadCCDBforIP(pathsCCDBforIPDataparameter, resoFuncDataCCDB, "pathsCCDBforIPDataparameter"); + break; + + default: + LOG(info) << "resoFuncMatching is neither 6 nor 7, although usepTcategorize is set to true. Resetting resoFuncMatching to 0."; + resoFuncMatch = 0; + break; } } maxOrder = numCount + 1; // 0: untagged, >1 : N ordering + const int IPmethodNumOfParameters = 9; // Set up the resolution function - resoFuncMatch = resoFuncMatching; switch (resoFuncMatch) { case 0: vecParamsData = (std::vector)paramsResoFuncData; @@ -313,12 +380,11 @@ struct JetTaggerHFTask { break; case 6: // TODO vecParamsData = (std::vector)paramsResoFuncData; - vecParamsIncJetMC = (std::vector)paramsResoFuncData; - for (size_t j = 0; j < resoFuncCCDB.size(); j++) { + for (size_t j = 0; j < resoFuncIncCCDB.size(); j++) { std::vector params; - if (resoFuncCCDB[j]) { - for (int i = 0; i < 9; i++) { - params.emplace_back(resoFuncCCDB[j]->GetParameter(i)); + if (resoFuncIncCCDB[j]) { + for (int i = 0; i < IPmethodNumOfParameters; i++) { + params.emplace_back(resoFuncIncCCDB[j]->GetParameter(i)); } } vecParamsIncJetMcCCDB.emplace_back(params); @@ -326,6 +392,49 @@ struct JetTaggerHFTask { LOG(info) << "defined parameters of resolution function from CCDB"; useResoFuncFromIncJet = true; break; + case 7: // TODO + vecParamsData = (std::vector)paramsResoFuncData; + for (size_t j = 0; j < resoFuncBeautyCCDB.size(); j++) { + std::vector params; + if (resoFuncBeautyCCDB[j]) { + for (int i = 0; i < IPmethodNumOfParameters; i++) { + params.emplace_back(resoFuncBeautyCCDB[j]->GetParameter(i)); + } + } + vecParamsBeautyJetMcCCDB.emplace_back(params); + } + for (size_t j = 0; j < resoFuncCharmCCDB.size(); j++) { + std::vector params; + if (resoFuncCharmCCDB[j]) { + for (int i = 0; i < IPmethodNumOfParameters; i++) { + params.emplace_back(resoFuncCharmCCDB[j]->GetParameter(i)); + } + } + vecParamsCharmJetMcCCDB.emplace_back(params); + } + for (size_t j = 0; j < resoFuncLfCCDB.size(); j++) { + std::vector params; + if (resoFuncLfCCDB[j]) { + for (int i = 0; i < IPmethodNumOfParameters; i++) { + params.emplace_back(resoFuncLfCCDB[j]->GetParameter(i)); + } + } + vecParamsLfJetMcCCDB.emplace_back(params); + } + LOG(info) << "defined parameters of resolution function from CCDB for each flavour"; + break; + case 8: + for (size_t j = 0; j < resoFuncDataCCDB.size(); j++) { + std::vector params; + if (resoFuncDataCCDB[j]) { + for (int i = 0; i < IPmethodNumOfParameters; i++) { + params.emplace_back(resoFuncDataCCDB[j]->GetParameter(i)); + } + } + vecParamsDataJetCCDB.emplace_back(params); + } + LOG(info) << "defined parameters of resolution function from CCDB for data"; + break; default: LOG(fatal) << "undefined parameters of resolution function. Fix it!"; break; @@ -337,9 +446,21 @@ struct JetTaggerHFTask { fSignImpXYSigBeautyJetMC = jettaggingutilities::setResolutionFunction(vecParamsBeautyJetMC); fSignImpXYSigLfJetMC = jettaggingutilities::setResolutionFunction(vecParamsLfJetMC); + for (const auto& params : vecParamsDataJetCCDB) { + vecfSignImpXYSigDataJetCCDB.emplace_back(jettaggingutilities::setResolutionFunction(params)); + } for (const auto& params : vecParamsIncJetMcCCDB) { vecfSignImpXYSigIncJetMcCCDB.emplace_back(jettaggingutilities::setResolutionFunction(params)); } + for (const auto& params : vecParamsBeautyJetMcCCDB) { + vecfSignImpXYSigBeautyJetMcCCDB.emplace_back(jettaggingutilities::setResolutionFunction(params)); + } + for (const auto& params : vecParamsCharmJetMcCCDB) { + vecfSignImpXYSigCharmJetMcCCDB.emplace_back(jettaggingutilities::setResolutionFunction(params)); + } + for (const auto& params : vecParamsLfJetMcCCDB) { + vecfSignImpXYSigLfJetMcCCDB.emplace_back(jettaggingutilities::setResolutionFunction(params)); + } // Use QA for effectivness of track probability if (trackProbQA) { diff --git a/PWGJE/Tasks/jetTaggerHFQA.cxx b/PWGJE/Tasks/jetTaggerHFQA.cxx index 2f51f5e787f..7e2efeceaa3 100644 --- a/PWGJE/Tasks/jetTaggerHFQA.cxx +++ b/PWGJE/Tasks/jetTaggerHFQA.cxx @@ -149,12 +149,18 @@ struct JetTaggerHFQA { AxisSpec axisSigmaLxyz = {binSigmaLxyz, "#sigma_{L_{XYZ}} [cm]"}; if (doprocessTracksDca) { - registry.add("h_impact_parameter_xy", "", {HistType::kTH1F, {{axisImpactParameterXY}}}); - registry.add("h_impact_parameter_xy_significance", "", {HistType::kTH1F, {{axisImpactParameterXYSignificance}}}); - registry.add("h_impact_parameter_z", "", {HistType::kTH1F, {{axisImpactParameterZ}}}); - registry.add("h_impact_parameter_z_significance", "", {HistType::kTH1F, {{axisImpactParameterZSignificance}}}); - registry.add("h_impact_parameter_xyz", "", {HistType::kTH1F, {{axisImpactParameterXYZ}}}); - registry.add("h_impact_parameter_xyz_significance", "", {HistType::kTH1F, {{axisImpactParameterXYZSignificance}}}); + if (fillIPxy) { + registry.add("h_impact_parameter_xy", "", {HistType::kTH1F, {{axisImpactParameterXY}}}); + registry.add("h_impact_parameter_xy_significance", "", {HistType::kTH1F, {{axisImpactParameterXYSignificance}}}); + } + if (fillIPz) { + registry.add("h_impact_parameter_z", "", {HistType::kTH1F, {{axisImpactParameterZ}}}); + registry.add("h_impact_parameter_z_significance", "", {HistType::kTH1F, {{axisImpactParameterZSignificance}}}); + } + if (fillIPxyz) { + registry.add("h_impact_parameter_xyz", "", {HistType::kTH1F, {{axisImpactParameterXYZ}}}); + registry.add("h_impact_parameter_xyz_significance", "", {HistType::kTH1F, {{axisImpactParameterXYZSignificance}}}); + } } if (doprocessValFlavourDefMCD) { registry.add("h2_flavour_dist_quark_flavour_dist_hadron", "", {HistType::kTH2F, {{axisJetFlavour}, {axisJetFlavour}}}); @@ -193,21 +199,27 @@ struct JetTaggerHFQA { registry.add("h3_jet_pt_track_pt_sign_impact_parameter_xyz_significance", "", {HistType::kTH3F, {{axisJetPt}, {axisTrackPt}, {axisImpactParameterXYZSignificance}}}); } if (fillTrackCounting) { - registry.add("h2_jet_pt_sign_impact_parameter_xy_significance_N1", "", {HistType::kTH2F, {{axisJetPt}, {axisImpactParameterXYSignificance}}}); - registry.add("h2_jet_pt_sign_impact_parameter_xy_significance_N2", "", {HistType::kTH2F, {{axisJetPt}, {axisImpactParameterXYSignificance}}}); - registry.add("h2_jet_pt_sign_impact_parameter_xy_significance_N3", "", {HistType::kTH2F, {{axisJetPt}, {axisImpactParameterXYSignificance}}}); - registry.add("h2_jet_pt_sign_impact_parameter_z_significance_N1", "", {HistType::kTH2F, {{axisJetPt}, {axisImpactParameterXYSignificance}}}); - registry.add("h2_jet_pt_sign_impact_parameter_z_significance_N2", "", {HistType::kTH2F, {{axisJetPt}, {axisImpactParameterXYSignificance}}}); - registry.add("h2_jet_pt_sign_impact_parameter_z_significance_N3", "", {HistType::kTH2F, {{axisJetPt}, {axisImpactParameterXYSignificance}}}); - registry.add("h2_jet_pt_sign_impact_parameter_xyz_significance_N1", "", {HistType::kTH2F, {{axisJetPt}, {axisImpactParameterXYSignificance}}}); - registry.add("h2_jet_pt_sign_impact_parameter_xyz_significance_N2", "", {HistType::kTH2F, {{axisJetPt}, {axisImpactParameterXYSignificance}}}); - registry.add("h2_jet_pt_sign_impact_parameter_xyz_significance_N3", "", {HistType::kTH2F, {{axisJetPt}, {axisImpactParameterXYSignificance}}}); - registry.add("h3_jet_pt_sign_impact_parameter_xy_significance_tc", "", {HistType::kTH3F, {{axisJetPt}, {axisImpactParameterXYSignificance}, {axisNumOrder}}}); - registry.add("h3_jet_pt_sign_impact_parameter_z_significance_tc", "", {HistType::kTH3F, {{axisJetPt}, {axisImpactParameterZSignificance}, {axisNumOrder}}}); - registry.add("h3_jet_pt_sign_impact_parameter_xyz_significance_tc", "", {HistType::kTH3F, {{axisJetPt}, {axisImpactParameterXYZSignificance}, {axisNumOrder}}}); - registry.add("h3_track_pt_sign_impact_parameter_xy_significance_tc", "", {HistType::kTH3F, {{axisTrackPt}, {axisImpactParameterXYSignificance}, {axisNumOrder}}}); - registry.add("h3_track_pt_sign_impact_parameter_z_significance_tc", "", {HistType::kTH3F, {{axisTrackPt}, {axisImpactParameterZSignificance}, {axisNumOrder}}}); - registry.add("h3_track_pt_sign_impact_parameter_xyz_significance_tc", "", {HistType::kTH3F, {{axisTrackPt}, {axisImpactParameterXYZSignificance}, {axisNumOrder}}}); + if (fillIPxy) { + registry.add("h2_jet_pt_sign_impact_parameter_xy_significance_N1", "", {HistType::kTH2F, {{axisJetPt}, {axisImpactParameterXYSignificance}}}); + registry.add("h2_jet_pt_sign_impact_parameter_xy_significance_N2", "", {HistType::kTH2F, {{axisJetPt}, {axisImpactParameterXYSignificance}}}); + registry.add("h2_jet_pt_sign_impact_parameter_xy_significance_N3", "", {HistType::kTH2F, {{axisJetPt}, {axisImpactParameterXYSignificance}}}); + registry.add("h3_jet_pt_sign_impact_parameter_xy_significance_tc", "", {HistType::kTH3F, {{axisJetPt}, {axisImpactParameterXYSignificance}, {axisNumOrder}}}); + registry.add("h3_track_pt_sign_impact_parameter_xy_significance_tc", "", {HistType::kTH3F, {{axisTrackPt}, {axisImpactParameterXYSignificance}, {axisNumOrder}}}); + } + if (fillIPz) { + registry.add("h2_jet_pt_sign_impact_parameter_z_significance_N1", "", {HistType::kTH2F, {{axisJetPt}, {axisImpactParameterXYSignificance}}}); + registry.add("h2_jet_pt_sign_impact_parameter_z_significance_N2", "", {HistType::kTH2F, {{axisJetPt}, {axisImpactParameterXYSignificance}}}); + registry.add("h2_jet_pt_sign_impact_parameter_z_significance_N3", "", {HistType::kTH2F, {{axisJetPt}, {axisImpactParameterXYSignificance}}}); + registry.add("h3_jet_pt_sign_impact_parameter_z_significance_tc", "", {HistType::kTH3F, {{axisJetPt}, {axisImpactParameterZSignificance}, {axisNumOrder}}}); + registry.add("h3_track_pt_sign_impact_parameter_z_significance_tc", "", {HistType::kTH3F, {{axisTrackPt}, {axisImpactParameterZSignificance}, {axisNumOrder}}}); + } + if (fillIPxyz) { + registry.add("h2_jet_pt_sign_impact_parameter_xyz_significance_N1", "", {HistType::kTH2F, {{axisJetPt}, {axisImpactParameterXYSignificance}}}); + registry.add("h2_jet_pt_sign_impact_parameter_xyz_significance_N2", "", {HistType::kTH2F, {{axisJetPt}, {axisImpactParameterXYSignificance}}}); + registry.add("h2_jet_pt_sign_impact_parameter_xyz_significance_N3", "", {HistType::kTH2F, {{axisJetPt}, {axisImpactParameterXYSignificance}}}); + registry.add("h3_jet_pt_sign_impact_parameter_xyz_significance_tc", "", {HistType::kTH3F, {{axisJetPt}, {axisImpactParameterXYZSignificance}, {axisNumOrder}}}); + registry.add("h3_track_pt_sign_impact_parameter_xyz_significance_tc", "", {HistType::kTH3F, {{axisTrackPt}, {axisImpactParameterXYZSignificance}, {axisNumOrder}}}); + } } } if (doprocessIPsMCD || doprocessIPsMCDWeighted || doprocessIPsMCPMCDMatched || doprocessIPsMCPMCDMatchedWeighted) { @@ -249,18 +261,24 @@ struct JetTaggerHFQA { registry.add("h3_track_pt_sign_impact_parameter_xyz_significance_flavour", "", {HistType::kTH3F, {{axisTrackPt}, {axisImpactParameterXYZSignificance}, {axisJetFlavour}}}); } if (fillTrackCounting) { - registry.add("h3_jet_pt_sign_impact_parameter_xy_significance_flavour_N1", "", {HistType::kTH3F, {{axisJetPt}, {axisImpactParameterXYSignificance}, {axisJetFlavour}}}); - registry.add("h3_jet_pt_sign_impact_parameter_xy_significance_flavour_N2", "", {HistType::kTH3F, {{axisJetPt}, {axisImpactParameterXYSignificance}, {axisJetFlavour}}}); - registry.add("h3_jet_pt_sign_impact_parameter_xy_significance_flavour_N3", "", {HistType::kTH3F, {{axisJetPt}, {axisImpactParameterXYSignificance}, {axisJetFlavour}}}); - registry.add("h3_jet_pt_sign_impact_parameter_z_significance_flavour_N1", "", {HistType::kTH3F, {{axisJetPt}, {axisImpactParameterZSignificance}, {axisJetFlavour}}}); - registry.add("h3_jet_pt_sign_impact_parameter_z_significance_flavour_N2", "", {HistType::kTH3F, {{axisJetPt}, {axisImpactParameterZSignificance}, {axisJetFlavour}}}); - registry.add("h3_jet_pt_sign_impact_parameter_z_significance_flavour_N3", "", {HistType::kTH3F, {{axisJetPt}, {axisImpactParameterZSignificance}, {axisJetFlavour}}}); - registry.add("h3_jet_pt_sign_impact_parameter_xyz_significance_flavour_N1", "", {HistType::kTH3F, {{axisJetPt}, {axisImpactParameterXYZSignificance}, {axisJetFlavour}}}); - registry.add("h3_jet_pt_sign_impact_parameter_xyz_significance_flavour_N2", "", {HistType::kTH3F, {{axisJetPt}, {axisImpactParameterXYZSignificance}, {axisJetFlavour}}}); - registry.add("h3_jet_pt_sign_impact_parameter_xyz_significance_flavour_N3", "", {HistType::kTH3F, {{axisJetPt}, {axisImpactParameterXYZSignificance}, {axisJetFlavour}}}); - registry.add("h3_sign_impact_parameter_xy_significance_tc_flavour", "", {HistType::kTH3F, {{axisImpactParameterXYSignificance}, {axisNumOrder}, {axisJetFlavour}}}); - registry.add("h3_sign_impact_parameter_z_significance_tc_flavour", "", {HistType::kTH3F, {{axisImpactParameterZSignificance}, {axisNumOrder}, {axisJetFlavour}}}); - registry.add("h3_sign_impact_parameter_xyz_significance_tc_flavour", "", {HistType::kTH3F, {{axisImpactParameterXYZSignificance}, {axisNumOrder}, {axisJetFlavour}}}); + if (fillIPxy) { + registry.add("h3_jet_pt_sign_impact_parameter_xy_significance_flavour_N1", "", {HistType::kTH3F, {{axisJetPt}, {axisImpactParameterXYSignificance}, {axisJetFlavour}}}); + registry.add("h3_jet_pt_sign_impact_parameter_xy_significance_flavour_N2", "", {HistType::kTH3F, {{axisJetPt}, {axisImpactParameterXYSignificance}, {axisJetFlavour}}}); + registry.add("h3_jet_pt_sign_impact_parameter_xy_significance_flavour_N3", "", {HistType::kTH3F, {{axisJetPt}, {axisImpactParameterXYSignificance}, {axisJetFlavour}}}); + registry.add("h3_sign_impact_parameter_xy_significance_tc_flavour", "", {HistType::kTH3F, {{axisImpactParameterXYSignificance}, {axisNumOrder}, {axisJetFlavour}}}); + } + if (fillIPz) { + registry.add("h3_jet_pt_sign_impact_parameter_z_significance_flavour_N1", "", {HistType::kTH3F, {{axisJetPt}, {axisImpactParameterZSignificance}, {axisJetFlavour}}}); + registry.add("h3_jet_pt_sign_impact_parameter_z_significance_flavour_N2", "", {HistType::kTH3F, {{axisJetPt}, {axisImpactParameterZSignificance}, {axisJetFlavour}}}); + registry.add("h3_jet_pt_sign_impact_parameter_z_significance_flavour_N3", "", {HistType::kTH3F, {{axisJetPt}, {axisImpactParameterZSignificance}, {axisJetFlavour}}}); + registry.add("h3_sign_impact_parameter_z_significance_tc_flavour", "", {HistType::kTH3F, {{axisImpactParameterZSignificance}, {axisNumOrder}, {axisJetFlavour}}}); + } + if (fillIPxyz) { + registry.add("h3_jet_pt_sign_impact_parameter_xyz_significance_flavour_N1", "", {HistType::kTH3F, {{axisJetPt}, {axisImpactParameterXYZSignificance}, {axisJetFlavour}}}); + registry.add("h3_jet_pt_sign_impact_parameter_xyz_significance_flavour_N2", "", {HistType::kTH3F, {{axisJetPt}, {axisImpactParameterXYZSignificance}, {axisJetFlavour}}}); + registry.add("h3_jet_pt_sign_impact_parameter_xyz_significance_flavour_N3", "", {HistType::kTH3F, {{axisJetPt}, {axisImpactParameterXYZSignificance}, {axisJetFlavour}}}); + registry.add("h3_sign_impact_parameter_xyz_significance_tc_flavour", "", {HistType::kTH3F, {{axisImpactParameterXYZSignificance}, {axisNumOrder}, {axisJetFlavour}}}); + } } } if (doprocessIPsMCP || doprocessIPsMCPWeighted) { @@ -1057,12 +1075,18 @@ struct JetTaggerHFQA { varImpXYZ = dcaXYZ * jettaggingutilities::cmTomum; varImpXYZSig = dcaXYZ / sigmadcaXYZ; - registry.fill(HIST("h_impact_parameter_xy"), varImpXY); - registry.fill(HIST("h_impact_parameter_xy_significance"), varImpXYSig); - registry.fill(HIST("h_impact_parameter_z"), varImpZ); - registry.fill(HIST("h_impact_parameter_z_significance"), varImpZSig); - registry.fill(HIST("h_impact_parameter_xyz"), varImpXYZ); - registry.fill(HIST("h_impact_parameter_xyz_significance"), varImpXYZSig); + if (fillIPxy) { + registry.fill(HIST("h_impact_parameter_xy"), varImpXY); + registry.fill(HIST("h_impact_parameter_xy_significance"), varImpXYSig); + } + if (fillIPz) { + registry.fill(HIST("h_impact_parameter_z"), varImpZ); + registry.fill(HIST("h_impact_parameter_z_significance"), varImpZSig); + } + if (fillIPxyz) { + registry.fill(HIST("h_impact_parameter_xyz"), varImpXYZ); + registry.fill(HIST("h_impact_parameter_xyz_significance"), varImpXYZSig); + } } } PROCESS_SWITCH(JetTaggerHFQA, processTracksDca, "Fill inclusive tracks' imformation for data", false); From 77b11c225be967209359224f5c311f5d28c5fa35 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Mon, 28 Apr 2025 19:08:53 +0200 Subject: [PATCH 1120/1650] [PWGLF,Trigger] Fix the bug related to BC index (#11008) --- EventFiltering/PWGLF/filterf1proton.cxx | 57 +++---------------------- 1 file changed, 6 insertions(+), 51 deletions(-) diff --git a/EventFiltering/PWGLF/filterf1proton.cxx b/EventFiltering/PWGLF/filterf1proton.cxx index ed193004ad1..abdfe9c272a 100644 --- a/EventFiltering/PWGLF/filterf1proton.cxx +++ b/EventFiltering/PWGLF/filterf1proton.cxx @@ -24,6 +24,7 @@ #include #include #include + #include "DataFormatsParameters/GRPMagField.h" #include "DataFormatsParameters/GRPObject.h" #include "ReconstructionDataFormats/Track.h" @@ -477,10 +478,11 @@ struct filterf1proton { // using EventCandidates = soa::Join; using EventCandidates = aod::Collisions; using ResoV0s = aod::V0Datas; - using PrimaryTrackCandidates = soa::Filtered>; + using PrimaryTrackCandidatesIU = soa::Filtered>; void processF1Proton(EventCandidates::iterator const& collision, aod::BCsWithTimestamps const&, PrimaryTrackCandidates const& tracks, ResoV0s const& V0s) { @@ -699,31 +701,12 @@ struct filterf1proton { } PROCESS_SWITCH(filterf1proton, processF1Proton, "Process for trigger", false); TLorentzVector v0Dummy; - void processF1ProtonHelper(EventCandidates::iterator const& collision, aod::BCsWithTimestamps const&, PrimaryTrackCandidates const& tracks, aod::V0s const& V0s) + void processF1ProtonHelper(EventCandidates::iterator const& collision, aod::BCs const&, PrimaryTrackCandidatesIU const& tracks, aod::V0s const& V0s) { initCCDB(collision.bc().runNumber()); bool keepEventF1Proton = false; int numberF1 = 0; if (isSelectedEvent(collision)) { - if (ConfUseManualPIDproton || ConfUseManualPIDkaon || ConfUseManualPIDpion) { - currentRunNumber = collision.bc_as().runNumber(); - if (currentRunNumber != lastRunNumber) { - auto bc = collision.bc_as(); - if (ConfUseManualPIDproton) { - BBProton = setValuesBB(ccdbApi, bc, ConfPIDBBProton); - BBAntiproton = setValuesBB(ccdbApi, bc, ConfPIDBBAntiProton); - } - if (ConfUseManualPIDpion) { - BBPion = setValuesBB(ccdbApi, bc, ConfPIDBBPion); - BBAntipion = setValuesBB(ccdbApi, bc, ConfPIDBBAntiPion); - } - if (ConfUseManualPIDkaon) { - BBKaon = setValuesBB(ccdbApi, bc, ConfPIDBBKaon); - BBAntikaon = setValuesBB(ccdbApi, bc, ConfPIDBBAntiKaon); - } - lastRunNumber = currentRunNumber; - } - } // keep track of indices std::vector PionIndex = {}; @@ -749,27 +732,6 @@ struct filterf1proton { qaRegistry.fill(HIST("hPhi"), track.phi()); double nTPCSigmaP[3]{track.tpcNSigmaPi(), track.tpcNSigmaKa(), track.tpcNSigmaPr()}; double nTPCSigmaN[3]{track.tpcNSigmaPi(), track.tpcNSigmaKa(), track.tpcNSigmaPr()}; - if (ConfUseManualPIDproton) { - auto bgScalingProton = 1 / massPr; // momentum scaling? - if (BBProton.size() == 6) - nTPCSigmaP[2] = updatePID(track, bgScalingProton, BBProton); - if (BBAntiproton.size() == 6) - nTPCSigmaN[2] = updatePID(track, bgScalingProton, BBAntiproton); - } - if (ConfUseManualPIDkaon) { - auto bgScalingKaon = 1 / massKa; // momentum scaling? - if (BBKaon.size() == 6) - nTPCSigmaP[1] = updatePID(track, bgScalingKaon, BBKaon); - if (BBAntikaon.size() == 6) - nTPCSigmaN[1] = updatePID(track, bgScalingKaon, BBAntikaon); - } - if (ConfUseManualPIDpion) { - auto bgScalingPion = 1 / massPi; // momentum scaling? - if (BBPion.size() == 6) - nTPCSigmaP[0] = updatePID(track, bgScalingPion, BBPion); - if (BBAntipion.size() == 6) - nTPCSigmaN[0] = updatePID(track, bgScalingPion, BBAntipion); - } if ((track.sign() > 0 && SelectionPID(track, strategyPIDPion, 0, nTPCSigmaP[0])) || (track.sign() < 0 && SelectionPID(track, strategyPIDPion, 0, nTPCSigmaN[0]))) { ROOT::Math::PtEtaPhiMVector temp(track.pt(), track.eta(), track.phi(), massPi); @@ -829,8 +791,8 @@ struct filterf1proton { for (auto& v0 : V0s) { - auto postrack = v0.template posTrack_as(); - auto negtrack = v0.template negTrack_as(); + auto postrack = v0.template posTrack_as(); + auto negtrack = v0.template negTrack_as(); auto trackparpos = getTrackParCov(postrack); auto trackparneg = getTrackParCov(negtrack); if (!mStraHelper.buildV0Candidate(v0.collisionId(), collision.posX(), collision.posY(), collision.posZ(), postrack, negtrack, trackparpos, trackparneg)) { @@ -864,13 +826,6 @@ struct filterf1proton { } double nTPCSigmaPos[1]{postrack.tpcNSigmaPi()}; double nTPCSigmaNeg[1]{negtrack.tpcNSigmaPi()}; - if (ConfUseManualPIDdaughterPion) { - auto bgScalingPion = 1 / massPi; // momentum scaling? - if (BBPion.size() == 6) - nTPCSigmaPos[0] = updatePID(postrack, bgScalingPion, BBPion); - if (BBAntipion.size() == 6) - nTPCSigmaNeg[0] = updatePID(negtrack, bgScalingPion, BBAntipion); - } if (!isSelectedV0Daughter(postrack, 1, nTPCSigmaPos[0])) { continue; } From 2070fb62bf600ca91a0cc2670dc00f93d0fc25bc Mon Sep 17 00:00:00 2001 From: Nicolas Strangmann <77485327+nstrangm@users.noreply.github.com> Date: Mon, 28 Apr 2025 20:35:27 +0200 Subject: [PATCH 1121/1650] [PWGEM/PhotonMeson] Add MC functionality to BC wise pi0 task (#11012) Co-authored-by: Nicolas Strangmann --- PWGEM/PhotonMeson/DataModel/bcWiseTables.h | 42 ++--- .../TableProducer/bcWiseClusterSkimmer.cxx | 55 +++--- PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx | 172 ++++++++++++++---- 3 files changed, 189 insertions(+), 80 deletions(-) diff --git a/PWGEM/PhotonMeson/DataModel/bcWiseTables.h b/PWGEM/PhotonMeson/DataModel/bcWiseTables.h index 8799a664eee..11c302e1fc7 100644 --- a/PWGEM/PhotonMeson/DataModel/bcWiseTables.h +++ b/PWGEM/PhotonMeson/DataModel/bcWiseTables.h @@ -37,7 +37,6 @@ enum Observables { kFT0MCent, kZVtx, kFT0Amp, - kCellAmpSum, kpT, nObservables }; @@ -53,25 +52,24 @@ const float downscalingFactors[nObservables]{ 1E2, // Cluster time 2E0, // FT0M centrality 1E3, // Z-vertex position - 1E0, // FT0M amplitude - 1E0, // Cell energy + 1E-1, // FT0M amplitude 1E3}; // MC pi0 pt } // namespace emdownscaling namespace bcwisebc { -DECLARE_SOA_COLUMN(HasFT0, hasFT0, bool); //! has_foundFT0() -DECLARE_SOA_COLUMN(HasTVX, hasTVX, bool); //! has the TVX trigger flag -DECLARE_SOA_COLUMN(HaskTVXinEMC, haskTVXinEMC, bool); //! kTVXinEMC -DECLARE_SOA_COLUMN(HasEMCCell, hasEMCCell, bool); //! at least one EMCal cell in the BC -DECLARE_SOA_COLUMN(HasNoTFROFBorder, hasNoTFROFBorder, bool); //! not in the TF border or ITS ROF border region -DECLARE_SOA_COLUMN(StoredFT0MAmplitude, storedFT0MAmplitude, unsigned int); //! ft0a+c amplitude -DECLARE_SOA_COLUMN(StoredEMCalnCells, storedEMCalnCells, unsigned int); //! number of emcal cells -DECLARE_SOA_COLUMN(StoredEMCalCellEnergy, storedEMCalCellEnergy, float); //! sum of energy in emcal cells +DECLARE_SOA_COLUMN(HasFT0, hasFT0, bool); //! has_foundFT0() +DECLARE_SOA_COLUMN(HasTVX, hasTVX, bool); //! has the TVX trigger flag +DECLARE_SOA_COLUMN(HaskTVXinEMC, haskTVXinEMC, bool); //! kTVXinEMC +DECLARE_SOA_COLUMN(HasEMCCell, hasEMCCell, bool); //! at least one EMCal cell in the BC +DECLARE_SOA_COLUMN(HasNoTFROFBorder, hasNoTFROFBorder, bool); //! not in the TF border or ITS ROF border region +DECLARE_SOA_COLUMN(StoredFT0MAmplitude, storedFT0MAmplitude, uint16_t); //! ft0a+c amplitude + +DECLARE_SOA_DYNAMIC_COLUMN(FT0MAmplitude, ft0Amplitude, [](uint16_t storedFT0MAmplitude) -> float { return storedFT0MAmplitude / emdownscaling::downscalingFactors[emdownscaling::kFT0Amp]; }); //! FT0M amplitude } // namespace bcwisebc DECLARE_SOA_TABLE(BCWiseBCs, "AOD", "BCWISEBC", //! table of bc wise centrality estimation and event selection input o2::soa::Index<>, bcwisebc::HasFT0, bcwisebc::HasTVX, bcwisebc::HaskTVXinEMC, bcwisebc::HasEMCCell, bcwisebc::HasNoTFROFBorder, - bcwisebc::StoredFT0MAmplitude, bcwisebc::StoredEMCalnCells, bcwisebc::StoredEMCalCellEnergy); + bcwisebc::StoredFT0MAmplitude, bcwisebc::FT0MAmplitude); DECLARE_SOA_INDEX_COLUMN(BCWiseBC, bcWiseBC); //! bunch crossing ID used as index @@ -117,29 +115,29 @@ DECLARE_SOA_TABLE(BCWiseClusters, "AOD", "BCWISECLUSTER", //! table of skimmed E namespace bcwisemcpi0s { -DECLARE_SOA_COLUMN(ParticleIdPi0, particleIdPi0, int); //! ID of the pi0 in the MC stack -DECLARE_SOA_COLUMN(StoredPt, storedPt, uint16_t); //! Transverse momentum of generated pi0 (10 MeV) -DECLARE_SOA_COLUMN(IsAccepted, isAccepted, bool); //! Both decay photons are within the EMCal acceptance -DECLARE_SOA_COLUMN(IsPrimary, isPrimary, bool); //! mcParticle.isPhysicalPrimary() || mcParticle.producedByGenerator() -DECLARE_SOA_COLUMN(IsFromWD, isFromWD, bool); //! Pi0 from a weak decay according to pwgem::photonmeson::utils::mcutil::IsFromWD +DECLARE_SOA_COLUMN(StoredPt, storedPt, uint16_t); //! Transverse momentum of generated pi0 (1 MeV -> Maximum pi0 pT of ~65 GeV) +DECLARE_SOA_COLUMN(IsAccepted, isAccepted, bool); //! Both decay photons are within the EMCal acceptance +DECLARE_SOA_COLUMN(IsPrimary, isPrimary, bool); //! mcParticle.isPhysicalPrimary() || mcParticle.producedByGenerator() +DECLARE_SOA_COLUMN(IsFromWD, isFromWD, bool); //! Pi0 from a weak decay according to pwgem::photonmeson::utils::mcutil::IsFromWD DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, [](uint16_t storedpt) -> float { return storedpt / emdownscaling::downscalingFactors[emdownscaling::kpT]; }); //! pT of pi0 (GeV) } // namespace bcwisemcpi0s DECLARE_SOA_TABLE(BCWiseMCPi0s, "AOD", "BCWISEMCPI0", //! table of pi0s on MC level - o2::soa::Index<>, BCWiseBCId, bcwisemcpi0s::ParticleIdPi0, bcwisemcpi0s::StoredPt, bcwisemcpi0s::IsAccepted, bcwisemcpi0s::IsPrimary, bcwisemcpi0s::IsFromWD, + o2::soa::Index<>, BCWiseBCId, bcwisemcpi0s::StoredPt, bcwisemcpi0s::IsAccepted, bcwisemcpi0s::IsPrimary, bcwisemcpi0s::IsFromWD, bcwisemcpi0s::Pt); namespace bcwisemccluster { -DECLARE_SOA_COLUMN(StoredE, storedE, uint16_t); //! energy of cluster inducing particle (1 MeV precision) +DECLARE_SOA_COLUMN(Pi0ID, pi0ID, int32_t); //! Index of the mother pi0 (-1 if not from pi0) +DECLARE_SOA_COLUMN(StoredTrueE, storedTrueE, uint16_t); //! energy of cluster inducing particle (1 MeV -> Maximum cluster energy of ~65 GeV) -DECLARE_SOA_DYNAMIC_COLUMN(E, e, [](uint16_t storedE) -> float { return storedE / emdownscaling::downscalingFactors[emdownscaling::kEnergy]; }); //! energy of cluster inducing particle (GeV) +DECLARE_SOA_DYNAMIC_COLUMN(TrueE, trueE, [](uint16_t storedTrueE) -> float { return storedTrueE / emdownscaling::downscalingFactors[emdownscaling::kEnergy]; }); //! energy of cluster inducing particle (GeV) } // namespace bcwisemccluster DECLARE_SOA_TABLE(BCWiseMCClusters, "AOD", "BCWISEMCCLS", //! table of MC information for clusters -> To be joined with the cluster table - o2::soa::Index<>, BCWiseBCId, bcwisemccluster::StoredE, bcwisemcpi0s::ParticleIdPi0, - bcwisemccluster::E); + o2::soa::Index<>, BCWiseBCId, bcwisemccluster::Pi0ID, bcwisemccluster::StoredTrueE, + bcwisemccluster::TrueE); } // namespace o2::aod diff --git a/PWGEM/PhotonMeson/TableProducer/bcWiseClusterSkimmer.cxx b/PWGEM/PhotonMeson/TableProducer/bcWiseClusterSkimmer.cxx index 2cdaf79f2f0..acfbc66053a 100644 --- a/PWGEM/PhotonMeson/TableProducer/bcWiseClusterSkimmer.cxx +++ b/PWGEM/PhotonMeson/TableProducer/bcWiseClusterSkimmer.cxx @@ -18,6 +18,7 @@ #include #include +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -63,6 +64,12 @@ struct bcWiseClusterSkimmer { Configurable cfgMinTime{"cfgMinTime", -25, "Minimum time of selected clusters (ns)"}; Configurable cfgMaxTime{"cfgMaxTime", 25, "Maximum time of selected clusters (ns)"}; Configurable cfgRapidityCut{"cfgRapidityCut", 0.8f, "Maximum absolute rapidity of counted generated particles"}; + // Configurable cfgMinPtGenPi0{"cfgMinPtGenPi0", 0., "Minimum pT for stored generated pi0s (reduce disk space of derived data)"}; + + Configurable cfgRequirekTVXinEMC{"cfgRequirekTVXinEMC", false, "Only store kTVXinEMC triggered BCs"}; + Configurable cfgRequireGoodRCTQuality{"cfgRequireGoodRCTQuality", false, "Only store BCs with good quality of T0 and EMC in RCT"}; + + aod::rctsel::RCTFlagsChecker isFT0EMCGoodRCTChecker{aod::rctsel::kFT0Bad, aod::rctsel::kEMCBad}; expressions::Filter energyFilter = aod::emcalcluster::energy > cfgMinClusterEnergy; expressions::Filter m02Filter = (aod::emcalcluster::nCells == 1 || (aod::emcalcluster::m02 > cfgMinM02 && aod::emcalcluster::m02 < cfgMaxM02)); @@ -71,6 +78,8 @@ struct bcWiseClusterSkimmer { HistogramRegistry mHistManager{"output", {}, OutputObjHandlingPolicy::AnalysisObject, false, false}; + std::map fMapPi0Index; // Map to connect the MC index of the pi0 to the one saved in the derived table + void init(framework::InitContext&) { const int nEventBins = 6; @@ -79,15 +88,13 @@ struct bcWiseClusterSkimmer { for (int iBin = 0; iBin < nEventBins; iBin++) mHistManager.get(HIST("nBCs"))->GetXaxis()->SetBinLabel(iBin + 1, binLabels[iBin]); - mHistManager.add("hAmplitudeVsCentrality", "FT0M AmplitudeVsCentrality;FT0M Centrality;FT0M Amplitude", HistType::kTH2F, {{105, 0, 105}, {400, 0, 200000}}); - mHistManager.add("sumAmp", "Sum Amplitude", HistType::kTH1F, {{1000, 0., 10.}}); - mHistManager.add("nCells", "Number of EMCal cells", HistType::kTH1F, {{5000, -0.5, 5000.5}}); - LOG(info) << "| Timing cut: " << cfgMinTime << " < t < " << cfgMaxTime; LOG(info) << "| M02 cut: " << cfgMinM02 << " < M02 < " << cfgMaxM02; LOG(info) << "| E cut: E > " << cfgMinClusterEnergy; o2::emcal::Geometry::GetInstanceFromRunNumber(300000); + if (cfgRequireGoodRCTQuality) + isFT0EMCGoodRCTChecker.init({aod::rctsel::kFT0Bad, aod::rctsel::kEMCBad}); } /// \brief Process EMCAL clusters (either ambigous or unique) @@ -129,28 +136,32 @@ struct bcWiseClusterSkimmer { { for (const auto& cluster : clusters) { float clusterInducerEnergy = 0.; - int pi0MCIndex = -1; + int32_t pi0MCIndex = -1; if (cluster.amplitudeA().size() > 0) { int clusterInducerId = cluster.mcParticleIds()[0]; auto clusterInducer = mcParticles.iteratorAt(clusterInducerId); clusterInducerEnergy = clusterInducer.e(); int daughterId = aod::pwgem::photonmeson::utils::mcutil::FindMotherInChain(clusterInducer, mcParticles, std::vector{111}); - if (daughterId > 0) { + if (daughterId > 0) pi0MCIndex = mcParticles.iteratorAt(daughterId).mothersIds()[0]; - } } - mcclusterTable(bcID, convertForStorage(clusterInducerEnergy, kEnergy), pi0MCIndex); + if (pi0MCIndex > 0) + pi0MCIndex = fMapPi0Index[pi0MCIndex]; + mcclusterTable(bcID, pi0MCIndex, convertForStorage(clusterInducerEnergy, kEnergy)); } } - void processEventProperties(const auto& bc, const auto& collisionsInBC, const auto& cellsInBC) + bool isBCSelected(const auto& bc) { - float sumAmp = 0.; - for (const auto& cell : cellsInBC) - sumAmp += cell.amplitude(); - mHistManager.fill(HIST("sumAmp"), sumAmp); - mHistManager.fill(HIST("nCells"), cellsInBC.size()); + if (cfgRequirekTVXinEMC && !bc.selection_bit(aod::evsel::kIsTriggerTVX)) + return false; + if (cfgRequireGoodRCTQuality && !isFT0EMCGoodRCTChecker(bc)) + return false; + return true; + } + void processEventProperties(const auto& bc, const auto& collisionsInBC, const auto& cellsInBC) + { bool hasFT0 = bc.has_foundFT0(); bool hasTVX = bc.selection_bit(aod::evsel::kIsTriggerTVX); bool haskTVXinEMC = bc.alias_bit(kTVXinEMC); @@ -170,15 +181,11 @@ struct bcWiseClusterSkimmer { float ft0Amp = hasFT0 ? bc.foundFT0().sumAmpA() + bc.foundFT0().sumAmpC() : 0.; - bcTable(hasFT0, hasTVX, haskTVXinEMC, hasEMCCell, hasNoTFROFBorder, convertForStorage(ft0Amp, kFT0Amp), convertForStorage(cellsInBC.size(), kNCells), convertForStorage(sumAmp, kCellAmpSum)); + bcTable(hasFT0, hasTVX, haskTVXinEMC, hasEMCCell, hasNoTFROFBorder, convertForStorage(ft0Amp, kFT0Amp)); for (const auto& collision : collisionsInBC) { collisionTable(bcTable.lastIndex(), convertForStorage(collision.centFT0M(), kFT0MCent), convertForStorage(collision.posZ(), kZVtx)); - mHistManager.fill(HIST("hAmplitudeVsCentrality"), collision.centFT0M(), ft0Amp); } - - if (collisionsInBC.size() == 0) - mHistManager.fill(HIST("hAmplitudeVsCentrality"), 103, ft0Amp); } template @@ -218,6 +225,8 @@ struct bcWiseClusterSkimmer { void processData(MyBCs const& bcs, MyCollisions const& collisions, aod::FT0s const&, SelectedCells const& cells, SelectedUniqueClusters const& uClusters, SelectedAmbiguousClusters const& aClusters) { for (const auto& bc : bcs) { + if (!isBCSelected(bc)) + continue; auto collisionsInBC = collisions.sliceBy(perFoundBC, bc.globalIndex()); auto cellsInBC = cells.sliceBy(cellsPerBC, bc.globalIndex()); @@ -240,6 +249,8 @@ struct bcWiseClusterSkimmer { void processMC(MyBCs const& bcs, MyMCCollisions const& collisions, aod::McCollisions const& mcCollisions, aod::FT0s const&, SelectedCells const& cells, SelectedUniqueMCClusters const& uClusters, SelectedAmbiguousMCClusters const& aClusters, aod::McParticles const& mcParticles) { for (const auto& bc : bcs) { + if (!isBCSelected(bc)) + continue; auto collisionsInBC = collisions.sliceBy(perFoundBC, bc.globalIndex()); auto cellsInBC = cells.sliceBy(cellsPerBC, bc.globalIndex()); @@ -249,11 +260,12 @@ struct bcWiseClusterSkimmer { for (const auto& mcCollision : mcCollisionsBC) { auto mcParticlesInColl = mcParticles.sliceBy(perMcCollision, mcCollision.globalIndex()); for (const auto& mcParticle : mcParticlesInColl) { - if (mcParticle.pdgCode() != 111 || fabs(mcParticle.y()) > cfgRapidityCut || !isGammaGammaDecay(mcParticle, mcParticles)) + if (mcParticle.pdgCode() != 111 || std::abs(mcParticle.y()) > cfgRapidityCut || !isGammaGammaDecay(mcParticle, mcParticles)) continue; bool isPrimary = mcParticle.isPhysicalPrimary() || mcParticle.producedByGenerator(); bool isFromWD = (aod::pwgem::photonmeson::utils::mcutil::IsFromWD(mcCollision, mcParticle, mcParticles)) > 0; - mcpi0Table(bc.globalIndex(), mcParticle.globalIndex(), convertForStorage(mcParticle.pt(), kpT), isAccepted(mcParticle, mcParticles), isPrimary, isFromWD); + mcpi0Table(bc.globalIndex(), convertForStorage(mcParticle.pt(), kpT), isAccepted(mcParticle, mcParticles), isPrimary, isFromWD); + fMapPi0Index[mcParticle.globalIndex()] = static_cast(mcpi0Table.lastIndex()); } } @@ -266,6 +278,7 @@ struct bcWiseClusterSkimmer { processClusters(clustersInBC, bcTable.lastIndex()); processClusterMCInfo(clustersInBC, bc.globalIndex(), mcParticles); } + fMapPi0Index.clear(); } } PROCESS_SWITCH(bcWiseClusterSkimmer, processMC, "Run skimming for MC", false); diff --git a/PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx b/PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx index d8b1599d596..8c2b92e4900 100644 --- a/PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx +++ b/PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx @@ -36,9 +36,15 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; +using SelectedClusters = soa::Filtered; +using SelectedMCClusters = soa::Filtered>; + struct EmcalBcWisePi0 { HistogramRegistry mHistManager{"EmcalGammaGammaBcWiseHistograms"}; + Configurable cfgRequirekTVXinEMC{"cfgRequirekTVXinEMC", true, "Reconstruct pi0s only in kTVXinEMC triggered BCs"}; + Configurable cfgSelectOnlyUniqueAmbiguous{"cfgSelectOnlyUniqueAmbiguous", 0, "0: all clusters, 1: only unique clusters, 2: only ambiguous clusters"}; + Configurable cfgClusterDefinition{"cfgClusterDefinition", 10, "Clusterizer to be selected, e.g. 13 for kV3MostSplitLowSeed"}; Configurable cfgMinClusterEnergy{"cfgMinClusterEnergy", 0.7, "Minimum energy of selected clusters (GeV)"}; Configurable cfgMinM02{"cfgMinM02", 0.1, "Minimum M02 of selected clusters"}; @@ -53,6 +59,8 @@ struct EmcalBcWisePi0 { static constexpr float DefaultCentralityWindow[2] = {-1., 101.}; Configurable> cfgCentralityWindow{"cfgCentralityWindow", {DefaultCentralityWindow, 2, {"Min_Centrality", "Max_Centrality"}}, "Select centrality window (also requires unique collision)"}; + Configurable cfgIsMC{"cfgIsMC", false, "Flag to indicate if the task is running on MC data and should fill MC histograms"}; + Filter clusterDefinitionFilter = aod::bcwisecluster::storedDefinition == static_cast(cfgClusterDefinition); Filter energyFilter = aod::bcwisecluster::storedE > static_cast(cfgMinClusterEnergy* aod::emdownscaling::downscalingFactors[aod::emdownscaling::kEnergy]); Filter m02Filter = (aod::bcwisecluster::storedNCells == static_cast(1) || (aod::bcwisecluster::storedM02 > static_cast(cfgMinM02 * aod::emdownscaling::downscalingFactors[aod::emdownscaling::kM02]) && aod::bcwisecluster::storedM02 < static_cast(cfgMaxM02 * aod::emdownscaling::downscalingFactors[aod::emdownscaling::kM02]))); @@ -64,22 +72,39 @@ struct EmcalBcWisePi0 { { emcalGeom = emcal::Geometry::GetInstanceFromRunNumber(300000); const int nEventBins = 8; - mHistManager.add("nBCs", "Number of BCs;;#bf{#it{N}_{BC}}", HistType::kTH1F, {{nEventBins, -0.5, 7.5}}); + mHistManager.add("Event/nBCs", "Number of BCs;;#bf{#it{N}_{BC}}", HistType::kTH1F, {{nEventBins, -0.5, 7.5}}); const TString binLabels[nEventBins] = {"All", "FT0", "TVX", "kTVXinEMC", "Cell", "Cluster", "NoBorder", "Collision"}; for (int iBin = 0; iBin < nEventBins; iBin++) - mHistManager.get(HIST("nBCs"))->GetXaxis()->SetBinLabel(iBin + 1, binLabels[iBin]); - - mHistManager.add("Centrality", "FT0M centrality;FT0M centrality (%);#bf{#it{N}_{BC} (only BCs containing exactly 1 collision)}", HistType::kTH1F, {{100, 0., 100.}}); - - mHistManager.add("clusterE", "Energy of cluster;#bf{#it{E} (GeV)};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{200, 0, 20}}); - mHistManager.add("clusterM02", "Shape of cluster;#bf{#it{M}_{02}};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{200, 0, 2}}); - mHistManager.add("clusterTime", "Time of cluster;#bf{#it{t} (ns)};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{200, -100, 100}}); - mHistManager.add("clusterNCells", "Number of cells per cluster;#bf{#it{N}_{cells}};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{51, 0., 50.5}}); - mHistManager.add("clusterExotic", "Is cluster exotic?;#bf{Exotic?};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{2, -0.5, 1.5}}); - mHistManager.add("clusterEtaPhi", "Eta/Phi distribution of clusters;#eta;#phi", HistType::kTH2F, {{400, -0.8, 0.8}, {400, 0, constants::math::TwoPI}}); - - mHistManager.add("invMassVsPt", "Invariant mass and pT of meson candidates", HistType::kTH2F, {{400, 0., 0.8}, {200, 0., 20.}}); - mHistManager.add("invMassVsPtBackground", "Invariant mass and pT of background meson candidates", HistType::kTH2F, {{400, 0., 0.8}, {200, 0., 20.}}); + mHistManager.get(HIST("Event/nBCs"))->GetXaxis()->SetBinLabel(iBin + 1, binLabels[iBin]); + + mHistManager.add("Event/nCollPerBC", "Number of collisions per BC;#bf{#it{N}_{coll}};#bf{#it{N}_{BC}}", HistType::kTH1F, {{5, -0.5, 4.5}}); + mHistManager.add("Event/Z1VsZ2", "Z vertex positions for BCs with two collisions;#bf{#it{z}_{vtx}^{1} (cm)};#bf{#it{z}_{vtx}^{2} (cm)}", HistType::kTH2F, {{150, -15, 15}, {150, -15, 15}}); + mHistManager.add("Event/dZ", "Distance between vertices for BCs with two collisions;#bf{#Delta #it{z}_{vtx} (cm)};#bf{#it{N}_{BC}}", HistType::kTH1F, {{600, -30, 30}}); + + mHistManager.add("Event/Centrality", "FT0M centrality;FT0M centrality (%);#bf{#it{N}_{BC} (only BCs containing exactly 1 collision)}", HistType::kTH1F, {{100, 0., 100.}}); + mHistManager.add("Event/CentralityVsAmplitude", "FT0M AmplitudeVsCentrality;FT0M Centrality;FT0M Amplitude", HistType::kTH2F, {{105, 0, 105}, {600, 0, 300000}}); + + mHistManager.add("Cluster/E", "Energy of cluster;#bf{#it{E} (GeV)};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{200, 0, 20}}); + mHistManager.add("Cluster/M02", "Shape of cluster;#bf{#it{M}_{02}};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{200, 0, 2}}); + mHistManager.add("Cluster/Time", "Time of cluster;#bf{#it{t} (ns)};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{200, -100, 100}}); + mHistManager.add("Cluster/NCells", "Number of cells per cluster;#bf{#it{N}_{cells}};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{51, 0., 50.5}}); + mHistManager.add("Cluster/Exotic", "Is cluster exotic?;#bf{Exotic?};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{2, -0.5, 1.5}}); + mHistManager.add("Cluster/EtaPhi", "Eta/Phi distribution of clusters;#eta;#phi", HistType::kTH2F, {{400, -0.8, 0.8}, {400, 0, constants::math::TwoPI}}); + + mHistManager.add("invMassVsPt", "Invariant mass and pT of meson candidates", HistType::kTH2F, {{200, 0., 0.4}, {200, 0., 20.}}); + mHistManager.add("invMassVsPtBackground", "Invariant mass and pT of background meson candidates", HistType::kTH2F, {{200, 0., 0.4}, {200, 0., 20.}}); + + if (cfgIsMC) { + mHistManager.add("True/clusterERecVsETrue", "True vs reconstructed energy of cluster inducing particle;#bf{#it{E}_{rec} (GeV)};#bf{#it{E}_{true}^{cls inducing part} (GeV)}", HistType::kTH2F, {{200, 0, 20}, {200, 0, 20}}); + mHistManager.add("True/PtRecVsPtTrue", "True vs reconstructed pT of true pi0s;#bf{#it{p}_{T}^{rec} (GeV/#it{c})};#bf{#it{p}_{T}^{true} (GeV/#it{c})}", HistType::kTH2F, {{200, 0., 20.}, {200, 0., 20.}}); + mHistManager.add("True/invMassVsPt_Primary", "Invariant mass and pT of meson candidates", HistType::kTH2F, {{200, 0., 0.4}, {200, 0., 20.}}); + mHistManager.add("True/invMassVsPt_Secondary", "Invariant mass and pT of meson candidates", HistType::kTH2F, {{200, 0., 0.4}, {200, 0., 20.}}); + mHistManager.add("True/invMassVsPt_HadronicShower", "Invariant mass and pT of meson candidates", HistType::kTH2F, {{200, 0., 0.4}, {200, 0., 20.}}); + + mHistManager.add("Generated/pi0_AllBCs", "pT spectrum of generated pi0s in all BCs;#bf{#it{p}_{T} (GeV/#it{c})};#bf{#it{N}_{#pi^{0}}^{gen}}", HistType::kTH1F, {{200, 0, 20}}); + mHistManager.add("Generated/pi0_TVX", "pT spectrum of generated pi0s in TVX triggered BCs;#bf{#it{p}_{T} (GeV/#it{c})};#bf{#it{N}_{#pi^{0}}^{gen}}", HistType::kTH1F, {{200, 0, 20}}); + mHistManager.add("Generated/pi0_kTVXinEMC", "pT spectrum of generated pi0s in kTVXinEMC triggered BCs;#bf{#it{p}_{T} (GeV/#it{c})};#bf{#it{N}_{#pi^{0}}^{gen}}", HistType::kTH1F, {{200, 0, 20}}); + } } /// \brief returns if cluster is too close to edge of EMCal @@ -100,37 +125,45 @@ struct EmcalBcWisePi0 { void fillEventHists(const auto& bc, const auto& collisions, const auto& clusters) { - mHistManager.fill(HIST("nBCs"), 0); + mHistManager.fill(HIST("Event/nBCs"), 0); if (bc.hasFT0()) - mHistManager.fill(HIST("nBCs"), 1); + mHistManager.fill(HIST("Event/nBCs"), 1); if (bc.hasTVX()) - mHistManager.fill(HIST("nBCs"), 2); + mHistManager.fill(HIST("Event/nBCs"), 2); if (bc.haskTVXinEMC()) - mHistManager.fill(HIST("nBCs"), 3); + mHistManager.fill(HIST("Event/nBCs"), 3); if (bc.hasEMCCell()) - mHistManager.fill(HIST("nBCs"), 4); + mHistManager.fill(HIST("Event/nBCs"), 4); if (clusters.size() > 0) - mHistManager.fill(HIST("nBCs"), 5); + mHistManager.fill(HIST("Event/nBCs"), 5); if (bc.hasNoTFROFBorder()) - mHistManager.fill(HIST("nBCs"), 6); + mHistManager.fill(HIST("Event/nBCs"), 6); if (collisions.size() > 0) - mHistManager.fill(HIST("nBCs"), 7); + mHistManager.fill(HIST("Event/nBCs"), 7); if (collisions.size() == 1) { - for (const auto& collision : collisions) - mHistManager.fill(HIST("Centrality"), collision.centrality()); + mHistManager.fill(HIST("Event/Centrality"), collisions.iteratorAt(0).centrality()); + mHistManager.fill(HIST("Event/CentralityVsAmplitude"), collisions.iteratorAt(0).centrality(), bc.ft0Amplitude()); + } else { + mHistManager.fill(HIST("Event/CentralityVsAmplitude"), 103, bc.ft0Amplitude()); + } + + mHistManager.fill(HIST("Event/nCollPerBC"), collisions.size()); + if (collisions.size() == 2) { + mHistManager.fill(HIST("Event/Z1VsZ2"), collisions.iteratorAt(0).zVtx(), collisions.iteratorAt(1).zVtx()); + mHistManager.fill(HIST("Event/dZ"), std::abs(collisions.iteratorAt(0).zVtx() - collisions.iteratorAt(1).zVtx())); } } void fillClusterHists(const auto& clusters) { for (const auto& cluster : clusters) { - mHistManager.fill(HIST("clusterE"), cluster.e()); - mHistManager.fill(HIST("clusterM02"), cluster.m02()); - mHistManager.fill(HIST("clusterTime"), cluster.time()); - mHistManager.fill(HIST("clusterNCells"), cluster.nCells()); - mHistManager.fill(HIST("clusterEtaPhi"), cluster.eta(), cluster.phi()); - mHistManager.fill(HIST("clusterExotic"), cluster.isExotic()); + mHistManager.fill(HIST("Cluster/E"), cluster.e()); + mHistManager.fill(HIST("Cluster/M02"), cluster.m02()); + mHistManager.fill(HIST("Cluster/Time"), cluster.time()); + mHistManager.fill(HIST("Cluster/NCells"), cluster.nCells()); + mHistManager.fill(HIST("Cluster/EtaPhi"), cluster.eta(), cluster.phi()); + mHistManager.fill(HIST("Cluster/Exotic"), cluster.isExotic()); } } @@ -188,23 +221,70 @@ struct EmcalBcWisePi0 { } } } + void reconstructTrueMesons(const auto& clusters, const auto& mcPi0s) + { + for (const auto& [g1, g2] : soa::combinations(soa::CombinationsStrictlyUpperIndexPolicy(clusters, clusters))) { + if (g1.pi0ID() == -1 || g1.pi0ID() != g2.pi0ID()) + continue; + + ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.); + ROOT::Math::PtEtaPhiMVector v2(g2.pt(), g2.eta(), g2.phi(), 0.); + ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; + if (std::fabs(v12.Rapidity()) > cfgRapidityCut) + continue; + + float openingAngle12 = std::acos(v1.Vect().Dot(v2.Vect()) / (v1.P() * v2.P())); + if (openingAngle12 < cfgMinOpenAngle) + continue; + + int g1Pi0ID = g1.pi0ID() - mcPi0s.iteratorAt(0).globalIndex(); + const auto& mcPi0 = mcPi0s.iteratorAt(g1Pi0ID); + + mHistManager.fill(HIST("True/PtRecVsPtTrue"), v12.Pt(), mcPi0.pt()); + + if (mcPi0.isPrimary()) + mHistManager.fill(HIST("True/invMassVsPt_Primary"), v12.M(), v12.Pt()); + else if (mcPi0.isFromWD()) + mHistManager.fill(HIST("True/invMassVsPt_Secondary"), v12.M(), v12.Pt()); + else + mHistManager.fill(HIST("True/invMassVsPt_HadronicShower"), v12.M(), v12.Pt()); + } + } - bool isCentralitySelected(const auto& collisions) + bool isBCSelected(const auto& bc, const auto& collisions) { + if (cfgRequirekTVXinEMC && !bc.haskTVXinEMC()) + return false; + if (cfgCentralityWindow->get("Min_Centrality") > -0.5 || cfgCentralityWindow->get("Max_Centrality") < 100.5) { // Centrality window is set if (collisions.size() != 1) return false; - for (const auto& collision : collisions) { - if (collision.centrality() < cfgCentralityWindow->get("Min_Centrality") || collision.centrality() > cfgCentralityWindow->get("Max_Centrality")) - return false; - } + if (collisions.iteratorAt(0).centrality() < cfgCentralityWindow->get("Min_Centrality") || collisions.iteratorAt(0).centrality() > cfgCentralityWindow->get("Max_Centrality")) + return false; } + + if (cfgSelectOnlyUniqueAmbiguous == 1 && collisions.size() != 1) + return false; + if (cfgSelectOnlyUniqueAmbiguous == 2 && collisions.size() == 1) + return false; + return true; } - void process(aod::BCWiseBCs::iterator const& bc, aod::BCWiseCollisions const& collisions, soa::Filtered const& clusters) + void fillGeneratedPi0Hists(const auto& mcPi0s, const auto& bc) + { + for (const auto& mcPi0 : mcPi0s) { + mHistManager.fill(HIST("Generated/pi0_AllBCs"), mcPi0.pt()); + if (bc.hasTVX()) + mHistManager.fill(HIST("Generated/pi0_TVX"), mcPi0.pt()); + if (bc.haskTVXinEMC()) + mHistManager.fill(HIST("Generated/pi0_kTVXinEMC"), mcPi0.pt()); + } + } + + void process(aod::BCWiseBCs::iterator const& bc, aod::BCWiseCollisions const& collisions, SelectedClusters const& clusters) { - if (!isCentralitySelected(collisions)) + if (!isBCSelected(bc, collisions)) return; fillEventHists(bc, collisions, clusters); @@ -213,6 +293,24 @@ struct EmcalBcWisePi0 { reconstructMesons(clusters, bc.globalIndex()); } + + void processMCInfo(aod::BCWiseBCs::iterator const& bc, aod::BCWiseCollisions const& collisions, SelectedMCClusters const& clusters, aod::BCWiseMCPi0s const& mcPi0s) + { + if (!cfgIsMC) { + LOG(fatal) << "MC processing is not enabled, but the task is running on MC data. Please set cfgIsMC to true."; + return; + } + if (!isBCSelected(bc, collisions)) + return; + + for (const auto& cluster : clusters) + mHistManager.fill(HIST("True/clusterERecVsETrue"), cluster.e(), cluster.trueE()); + + reconstructTrueMesons(clusters, mcPi0s); + + fillGeneratedPi0Hists(mcPi0s, bc); + } + PROCESS_SWITCH(EmcalBcWisePi0, processMCInfo, "Run true and gen", false); }; WorkflowSpec defineDataProcessing(o2::framework::ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From 9605fffbca5ebbdfae713bf4a83df3c6e22bfe39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Mon, 28 Apr 2025 23:00:48 +0200 Subject: [PATCH 1122/1650] [ALICE3] A3: streamline h-filling, add delta histograms (#11013) --- ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx | 195 ++++++-------------- 1 file changed, 53 insertions(+), 142 deletions(-) diff --git a/ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx b/ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx index 5ec54c6daed..d8faa9e0eb7 100644 --- a/ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx +++ b/ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx @@ -56,6 +56,15 @@ using namespace o2; using namespace o2::framework; +std::array, 5> h2dInnerTimeResTrack; +std::array, 5> h2dInnerTimeResTotal; +std::array, 5> h2dOuterTimeResTrack; +std::array, 5> h2dOuterTimeResTotal; +std::array, 5>, 5> h2dInnerNsigmaTrue; +std::array, 5>, 5> h2dOuterNsigmaTrue; +std::array, 5>, 5> h2dInnerDeltaTrue; +std::array, 5>, 5> h2dOuterDeltaTrue; + struct OnTheFlyTofPid { Produces upgradeTofMC; Produces upgradeTof; @@ -97,6 +106,10 @@ struct OnTheFlyTofPid { Configurable nBinsNsigmaWrongSpecies{"nBinsNsigmaWrongSpecies", 200, "number of bins in Nsigma plot (wrong species)"}; Configurable minNsigmaRange{"minNsigmaRange", -10, "lower limit for the nsigma axis"}; Configurable maxNsigmaRange{"maxNsigmaRange", +10, "upper limit for the nsigma axis"}; + Configurable nBinsDeltaCorrectSpecies{"nBinsDeltaCorrectSpecies", 200, "number of bins in Delta plot (correct speies)"}; + Configurable nBinsDeltaWrongSpecies{"nBinsDeltaWrongSpecies", 200, "number of bins in Delta plot (wrong species)"}; + Configurable minDeltaRange{"minDeltaRange", -100, "lower limit for the nsigma axis"}; + Configurable maxDeltaRange{"maxDeltaRange", +100, "upper limit for the nsigma axis"}; Configurable nBinsTimeRes{"nBinsTimeRes", 400, "number of bins plots time resolution"}; Configurable nBinsRelativeEtaPt{"nBinsRelativeEtaPt", 400, "number of bins plots pt and eta relative errors"}; Configurable nBinsEta{"nBinsEta", 400, "number of bins plot relative eta error"}; @@ -187,24 +200,34 @@ struct OnTheFlyTofPid { std::string name_title_outer_total_res = "h2dOuterTimeResTotal" + particle_names2[i_true] + "VsP"; const AxisSpec axisTrackTimeRes{static_cast(plotsConfig.nBinsTimeRes), 0.0f, +200.0f, "Track time resolution - " + particle_names1[i_true] + " (ps)"}; const AxisSpec axisTotalTimeRes{static_cast(plotsConfig.nBinsTimeRes), 0.0f, +200.0f, "Total time resolution - " + particle_names1[i_true] + " (ps)"}; - histos.add(name_title_inner_track_res.c_str(), name_title_inner_track_res.c_str(), kTH2F, {axisMomentum, axisTrackTimeRes}); - histos.add(name_title_inner_total_res.c_str(), name_title_inner_total_res.c_str(), kTH2F, {axisMomentum, axisTotalTimeRes}); - histos.add(name_title_outer_track_res.c_str(), name_title_outer_track_res.c_str(), kTH2F, {axisMomentum, axisTrackTimeRes}); - histos.add(name_title_outer_total_res.c_str(), name_title_outer_total_res.c_str(), kTH2F, {axisMomentum, axisTotalTimeRes}); + h2dInnerTimeResTrack[i_true] = histos.add(name_title_inner_track_res.c_str(), name_title_inner_track_res.c_str(), kTH2F, {axisMomentum, axisTrackTimeRes}); + h2dInnerTimeResTotal[i_true] = histos.add(name_title_inner_total_res.c_str(), name_title_inner_total_res.c_str(), kTH2F, {axisMomentum, axisTotalTimeRes}); + h2dOuterTimeResTrack[i_true] = histos.add(name_title_outer_track_res.c_str(), name_title_outer_track_res.c_str(), kTH2F, {axisMomentum, axisTrackTimeRes}); + h2dOuterTimeResTotal[i_true] = histos.add(name_title_outer_total_res.c_str(), name_title_outer_total_res.c_str(), kTH2F, {axisMomentum, axisTotalTimeRes}); } for (int i_true = 0; i_true < 5; i_true++) { for (int i_hyp = 0; i_hyp < 5; i_hyp++) { std::string name_title_inner = "h2dInnerNsigmaTrue" + particle_names2[i_true] + "Vs" + particle_names2[i_hyp] + "Hypothesis"; std::string name_title_outer = "h2dOuterNsigmaTrue" + particle_names2[i_true] + "Vs" + particle_names2[i_hyp] + "Hypothesis"; + std::string name_title_inner_delta = "h2dInnerDeltaTrue" + particle_names2[i_true] + "Vs" + particle_names2[i_hyp] + "Hypothesis"; + std::string name_title_outer_delta = "h2dOuterDeltaTrue" + particle_names2[i_true] + "Vs" + particle_names2[i_hyp] + "Hypothesis"; if (i_true == i_hyp) { const AxisSpec axisNsigmaCorrect{static_cast(plotsConfig.nBinsNsigmaCorrectSpecies), plotsConfig.minNsigmaRange, plotsConfig.maxNsigmaRange, "N#sigma - True " + particle_names1[i_true] + " vs " + particle_names1[i_hyp] + " hypothesis"}; - histos.add(name_title_inner.c_str(), name_title_inner.c_str(), kTH2F, {axisMomentum, axisNsigmaCorrect}); - histos.add(name_title_outer.c_str(), name_title_outer.c_str(), kTH2F, {axisMomentum, axisNsigmaCorrect}); + h2dInnerNsigmaTrue[i_true][i_hyp] = histos.add(name_title_inner.c_str(), name_title_inner.c_str(), kTH2F, {axisMomentum, axisNsigmaCorrect}); + h2dOuterNsigmaTrue[i_true][i_hyp] = histos.add(name_title_outer.c_str(), name_title_outer.c_str(), kTH2F, {axisMomentum, axisNsigmaCorrect}); + + const AxisSpec axisDeltaCorrect{static_cast(plotsConfig.nBinsDeltaCorrectSpecies), plotsConfig.minDeltaRange, plotsConfig.maxDeltaRange, "#Delta - True " + particle_names1[i_true] + " vs " + particle_names1[i_hyp] + " hypothesis"}; + h2dInnerDeltaTrue[i_true][i_hyp] = histos.add(name_title_inner_delta.c_str(), name_title_inner_delta.c_str(), kTH2F, {axisMomentum, axisDeltaCorrect}); + h2dOuterDeltaTrue[i_true][i_hyp] = histos.add(name_title_outer_delta.c_str(), name_title_outer_delta.c_str(), kTH2F, {axisMomentum, axisDeltaCorrect}); } else { const AxisSpec axisNsigmaWrong{static_cast(plotsConfig.nBinsNsigmaWrongSpecies), plotsConfig.minNsigmaRange, plotsConfig.maxNsigmaRange, "N#sigma - True " + particle_names1[i_true] + " vs " + particle_names1[i_hyp] + " hypothesis"}; - histos.add(name_title_inner.c_str(), name_title_inner.c_str(), kTH2F, {axisMomentum, axisNsigmaWrong}); - histos.add(name_title_outer.c_str(), name_title_outer.c_str(), kTH2F, {axisMomentum, axisNsigmaWrong}); + h2dInnerNsigmaTrue[i_true][i_hyp] = histos.add(name_title_inner.c_str(), name_title_inner.c_str(), kTH2F, {axisMomentum, axisNsigmaWrong}); + h2dOuterNsigmaTrue[i_true][i_hyp] = histos.add(name_title_outer.c_str(), name_title_outer.c_str(), kTH2F, {axisMomentum, axisNsigmaWrong}); + + const AxisSpec axisDeltaWrong{static_cast(plotsConfig.nBinsDeltaWrongSpecies), plotsConfig.minDeltaRange, plotsConfig.maxDeltaRange, "#Delta - True " + particle_names1[i_true] + " vs " + particle_names1[i_hyp] + " hypothesis"}; + h2dInnerDeltaTrue[i_true][i_hyp] = histos.add(name_title_inner_delta.c_str(), name_title_inner_delta.c_str(), kTH2F, {axisMomentum, axisDeltaWrong}); + h2dOuterDeltaTrue[i_true][i_hyp] = histos.add(name_title_outer_delta.c_str(), name_title_outer_delta.c_str(), kTH2F, {axisMomentum, axisDeltaWrong}); } } } @@ -298,7 +321,7 @@ struct OnTheFlyTofPid { cosAngle = (point2[0] - trcCircle.xC) * (startPoint[0] - trcCircle.xC) + (point2[1] - trcCircle.yC) * (startPoint[1] - trcCircle.yC); } cosAngle /= modulus; - length = trcCircle.rC * TMath::ACos(cosAngle); + length = trcCircle.rC * std::acos(cosAngle); length *= std::sqrt(1.0f + track.getTgl() * track.getTgl()); } return length; @@ -307,7 +330,7 @@ struct OnTheFlyTofPid { /// returns velocity in centimeters per picoseconds /// \param momentum the momentum of the tarck /// \param mass the mass of the particle - float velocity(float momentum, float mass) + float particleVelocity(float momentum, float mass) { const float a = momentum / mass; // uses light speed in cm/ps so output is in those units @@ -408,7 +431,7 @@ struct OnTheFlyTofPid { // Compute tracking contribution to timing using the error propagation formula // Uses light speed in m/ps, magnetic field in T (*0.1 for conversion kGauss -> T) double a0 = mass * mass; - double a1 = 0.299792458 * (0.1 * magneticField) * (0.01 * o2::constants::physics::LightSpeedCm2PS); + double a1 = 0.299792458 * (0.1 * magneticField) * (0.01 * o2::constants::physics::LightSpeedCm2NS / 1e+3); double a2 = (det_radius * 0.01) * (det_radius * 0.01) * (0.299792458) * (0.299792458) * (0.1 * magneticField) * (0.1 * magneticField) / 2.0; double dtof_on_dpt = (std::pow(pt, 4) * std::pow(std::cosh(eta), 2) * std::acos(1.0 - a2 / std::pow(pt, 2)) - 2.0 * a2 * std::pow(pt, 2) * (a0 + std::pow(pt * std::cosh(eta), 2)) / std::sqrt(a2 * (2.0 * std::pow(pt, 2) - a2))) / (a1 * std::pow(pt, 3) * std::sqrt(a0 + std::pow(pt * std::cosh(eta), 2))); double dtof_on_deta = std::pow(pt, 2) * std::sinh(eta) * std::cosh(eta) * std::acos(1.0 - a2 / std::pow(pt, 2)) / (a1 * std::sqrt(a0 + std::pow(pt * std::cosh(eta), 2))); @@ -487,7 +510,7 @@ struct OnTheFlyTofPid { if (pdgInfo == nullptr) { continue; } - const float v = velocity(o2track.getP(), pdgInfo->Mass()); + const float v = particleVelocity(o2track.getP(), pdgInfo->Mass()); const float expectedTimeInnerTOF = trackLengthInnerTOF / v + eventCollisionTimePS; // arrival time to the Inner TOF in ps const float expectedTimeOuterTOF = trackLengthOuterTOF / v + eventCollisionTimePS; // arrival time to the Outer TOF in ps upgradeTofMC(expectedTimeInnerTOF, trackLengthInnerTOF, expectedTimeOuterTOF, trackLengthOuterTOF); @@ -559,7 +582,7 @@ struct OnTheFlyTofPid { static std::array expectedTimeInnerTOF, expectedTimeOuterTOF; static std::array deltaTimeInnerTOF, deltaTimeOuterTOF; static std::array nSigmaInnerTOF, nSigmaOuterTOF; - static constexpr int lpdg_array[5] = {kElectron, kMuonMinus, kPiPlus, kKPlus, kProton}; + static constexpr int pdgArray[5] = {kElectron, kMuonMinus, kPiPlus, kKPlus, kProton}; float masses[5]; if (plotsConfig.doQAplots) { @@ -582,9 +605,9 @@ struct OnTheFlyTofPid { nSigmaInnerTOF[ii] = -100; nSigmaOuterTOF[ii] = -100; - auto pdgInfoThis = pdg->GetParticle(lpdg_array[ii]); + auto pdgInfoThis = pdg->GetParticle(pdgArray[ii]); masses[ii] = pdgInfoThis->Mass(); - const float v = velocity(momentum, masses[ii]); + const float v = particleVelocity(momentum, masses[ii]); expectedTimeInnerTOF[ii] = trackLengthInnerTOF / v; expectedTimeOuterTOF[ii] = trackLengthOuterTOF / v; @@ -608,60 +631,18 @@ struct OnTheFlyTofPid { outerTotalTimeReso = std::hypot(simConfig.outerTOFTimeReso, outerTrackTimeReso); if (plotsConfig.doQAplots) { - if (std::fabs(mcParticle.pdgCode()) == pdg->GetParticle(lpdg_array[ii])->PdgCode()) { + if (std::fabs(mcParticle.pdgCode()) == pdg->GetParticle(pdgArray[ii])->PdgCode()) { if (trackLengthRecoInnerTOF > 0) { - switch (ii) { - case 0: - histos.fill(HIST("h2dInnerTimeResTrackElecVsP"), momentum, innerTrackTimeReso); - histos.fill(HIST("h2dInnerTimeResTotalElecVsP"), momentum, innerTotalTimeReso); - break; - case 1: - histos.fill(HIST("h2dInnerTimeResTrackMuonVsP"), momentum, innerTrackTimeReso); - histos.fill(HIST("h2dInnerTimeResTotalMuonVsP"), momentum, innerTotalTimeReso); - break; - case 2: - histos.fill(HIST("h2dInnerTimeResTrackPionVsP"), momentum, innerTrackTimeReso); - histos.fill(HIST("h2dInnerTimeResTotalPionVsP"), momentum, innerTotalTimeReso); - break; - case 3: - histos.fill(HIST("h2dInnerTimeResTrackKaonVsP"), momentum, innerTrackTimeReso); - histos.fill(HIST("h2dInnerTimeResTotalKaonVsP"), momentum, innerTotalTimeReso); - break; - case 4: - histos.fill(HIST("h2dInnerTimeResTrackProtVsP"), momentum, innerTrackTimeReso); - histos.fill(HIST("h2dInnerTimeResTotalProtVsP"), momentum, innerTotalTimeReso); - break; - default: - break; - } + h2dInnerTimeResTrack[ii]->Fill(momentum, innerTrackTimeReso); + h2dInnerTimeResTotal[ii]->Fill(momentum, innerTotalTimeReso); } if (trackLengthRecoOuterTOF > 0) { float transverse_momentum = momentum / std::cosh(pseudorapidity); - switch (ii) { - case 0: - histos.fill(HIST("h2dOuterTimeResTrackElecVsP"), momentum, outerTrackTimeReso); - histos.fill(HIST("h2dOuterTimeResTotalElecVsP"), momentum, outerTotalTimeReso); - break; - case 1: - histos.fill(HIST("h2dOuterTimeResTrackMuonVsP"), momentum, outerTrackTimeReso); - histos.fill(HIST("h2dOuterTimeResTotalMuonVsP"), momentum, outerTotalTimeReso); - break; - case 2: - histos.fill(HIST("h2dOuterTimeResTrackPionVsP"), momentum, outerTrackTimeReso); - histos.fill(HIST("h2dOuterTimeResTotalPionVsP"), momentum, outerTotalTimeReso); - histos.fill(HIST("h2dRelativePtResolution"), transverse_momentum, 100.0 * pt_resolution / transverse_momentum); - histos.fill(HIST("h2dRelativeEtaResolution"), pseudorapidity, 100.0 * eta_resolution / (std::fabs(pseudorapidity) + 1e-6)); - break; - case 3: - histos.fill(HIST("h2dOuterTimeResTrackKaonVsP"), momentum, outerTrackTimeReso); - histos.fill(HIST("h2dOuterTimeResTotalKaonVsP"), momentum, outerTotalTimeReso); - break; - case 4: - histos.fill(HIST("h2dOuterTimeResTrackProtVsP"), momentum, outerTrackTimeReso); - histos.fill(HIST("h2dOuterTimeResTotalProtVsP"), momentum, outerTotalTimeReso); - break; - default: - break; + h2dOuterTimeResTrack[ii]->Fill(momentum, outerTrackTimeReso); + h2dOuterTimeResTotal[ii]->Fill(momentum, outerTotalTimeReso); + if (ii == 2) { + histos.fill(HIST("h2dRelativePtResolution"), transverse_momentum, 100.0 * pt_resolution / transverse_momentum); + histos.fill(HIST("h2dRelativeEtaResolution"), pseudorapidity, 100.0 * eta_resolution / (std::fabs(pseudorapidity) + 1e-6)); } } } @@ -679,89 +660,19 @@ struct OnTheFlyTofPid { if (plotsConfig.doQAplots) { for (int ii = 0; ii < 5; ii++) { - if (std::fabs(mcParticle.pdgCode()) != pdg->GetParticle(lpdg_array[ii])->PdgCode()) { + if (std::fabs(mcParticle.pdgCode()) != pdg->GetParticle(pdgArray[ii])->PdgCode()) { continue; } if (trackLengthRecoInnerTOF > 0) { - switch (ii) { - case 0: - histos.fill(HIST("h2dInnerNsigmaTrueElecVsElecHypothesis"), momentum, nSigmaInnerTOF[0]); - histos.fill(HIST("h2dInnerNsigmaTrueElecVsMuonHypothesis"), momentum, nSigmaInnerTOF[1]); - histos.fill(HIST("h2dInnerNsigmaTrueElecVsPionHypothesis"), momentum, nSigmaInnerTOF[2]); - histos.fill(HIST("h2dInnerNsigmaTrueElecVsKaonHypothesis"), momentum, nSigmaInnerTOF[3]); - histos.fill(HIST("h2dInnerNsigmaTrueElecVsProtHypothesis"), momentum, nSigmaInnerTOF[4]); - break; - case 1: - histos.fill(HIST("h2dInnerNsigmaTrueMuonVsElecHypothesis"), momentum, nSigmaInnerTOF[0]); - histos.fill(HIST("h2dInnerNsigmaTrueMuonVsMuonHypothesis"), momentum, nSigmaInnerTOF[1]); - histos.fill(HIST("h2dInnerNsigmaTrueMuonVsPionHypothesis"), momentum, nSigmaInnerTOF[2]); - histos.fill(HIST("h2dInnerNsigmaTrueMuonVsKaonHypothesis"), momentum, nSigmaInnerTOF[3]); - histos.fill(HIST("h2dInnerNsigmaTrueMuonVsProtHypothesis"), momentum, nSigmaInnerTOF[4]); - break; - case 2: - histos.fill(HIST("h2dInnerNsigmaTruePionVsElecHypothesis"), momentum, nSigmaInnerTOF[0]); - histos.fill(HIST("h2dInnerNsigmaTruePionVsMuonHypothesis"), momentum, nSigmaInnerTOF[1]); - histos.fill(HIST("h2dInnerNsigmaTruePionVsPionHypothesis"), momentum, nSigmaInnerTOF[2]); - histos.fill(HIST("h2dInnerNsigmaTruePionVsKaonHypothesis"), momentum, nSigmaInnerTOF[3]); - histos.fill(HIST("h2dInnerNsigmaTruePionVsProtHypothesis"), momentum, nSigmaInnerTOF[4]); - break; - case 3: - histos.fill(HIST("h2dInnerNsigmaTrueKaonVsElecHypothesis"), momentum, nSigmaInnerTOF[0]); - histos.fill(HIST("h2dInnerNsigmaTrueKaonVsMuonHypothesis"), momentum, nSigmaInnerTOF[1]); - histos.fill(HIST("h2dInnerNsigmaTrueKaonVsPionHypothesis"), momentum, nSigmaInnerTOF[2]); - histos.fill(HIST("h2dInnerNsigmaTrueKaonVsKaonHypothesis"), momentum, nSigmaInnerTOF[3]); - histos.fill(HIST("h2dInnerNsigmaTrueKaonVsProtHypothesis"), momentum, nSigmaInnerTOF[4]); - break; - case 4: - histos.fill(HIST("h2dInnerNsigmaTrueProtVsElecHypothesis"), momentum, nSigmaInnerTOF[0]); - histos.fill(HIST("h2dInnerNsigmaTrueProtVsMuonHypothesis"), momentum, nSigmaInnerTOF[1]); - histos.fill(HIST("h2dInnerNsigmaTrueProtVsPionHypothesis"), momentum, nSigmaInnerTOF[2]); - histos.fill(HIST("h2dInnerNsigmaTrueProtVsKaonHypothesis"), momentum, nSigmaInnerTOF[3]); - histos.fill(HIST("h2dInnerNsigmaTrueProtVsProtHypothesis"), momentum, nSigmaInnerTOF[4]); - break; - default: - break; + for (int iii = 0; iii < 5; iii++) { + h2dInnerNsigmaTrue[ii][iii]->Fill(momentum, nSigmaInnerTOF[iii]); + h2dInnerDeltaTrue[ii][iii]->Fill(momentum, deltaTimeInnerTOF[iii]); } } if (trackLengthRecoOuterTOF > 0) { - switch (ii) { - case 0: - histos.fill(HIST("h2dOuterNsigmaTrueElecVsElecHypothesis"), momentum, nSigmaOuterTOF[0]); - histos.fill(HIST("h2dOuterNsigmaTrueElecVsMuonHypothesis"), momentum, nSigmaOuterTOF[1]); - histos.fill(HIST("h2dOuterNsigmaTrueElecVsPionHypothesis"), momentum, nSigmaOuterTOF[2]); - histos.fill(HIST("h2dOuterNsigmaTrueElecVsKaonHypothesis"), momentum, nSigmaOuterTOF[3]); - histos.fill(HIST("h2dOuterNsigmaTrueElecVsProtHypothesis"), momentum, nSigmaOuterTOF[4]); - break; - case 1: - histos.fill(HIST("h2dOuterNsigmaTrueMuonVsElecHypothesis"), momentum, nSigmaOuterTOF[0]); - histos.fill(HIST("h2dOuterNsigmaTrueMuonVsMuonHypothesis"), momentum, nSigmaOuterTOF[1]); - histos.fill(HIST("h2dOuterNsigmaTrueMuonVsPionHypothesis"), momentum, nSigmaOuterTOF[2]); - histos.fill(HIST("h2dOuterNsigmaTrueMuonVsKaonHypothesis"), momentum, nSigmaOuterTOF[3]); - histos.fill(HIST("h2dOuterNsigmaTrueMuonVsProtHypothesis"), momentum, nSigmaOuterTOF[4]); - break; - case 2: - histos.fill(HIST("h2dOuterNsigmaTruePionVsElecHypothesis"), momentum, nSigmaOuterTOF[0]); - histos.fill(HIST("h2dOuterNsigmaTruePionVsMuonHypothesis"), momentum, nSigmaOuterTOF[1]); - histos.fill(HIST("h2dOuterNsigmaTruePionVsPionHypothesis"), momentum, nSigmaOuterTOF[2]); - histos.fill(HIST("h2dOuterNsigmaTruePionVsKaonHypothesis"), momentum, nSigmaOuterTOF[3]); - histos.fill(HIST("h2dOuterNsigmaTruePionVsProtHypothesis"), momentum, nSigmaOuterTOF[4]); - break; - case 3: - histos.fill(HIST("h2dOuterNsigmaTrueKaonVsElecHypothesis"), momentum, nSigmaOuterTOF[0]); - histos.fill(HIST("h2dOuterNsigmaTrueKaonVsMuonHypothesis"), momentum, nSigmaOuterTOF[1]); - histos.fill(HIST("h2dOuterNsigmaTrueKaonVsPionHypothesis"), momentum, nSigmaOuterTOF[2]); - histos.fill(HIST("h2dOuterNsigmaTrueKaonVsKaonHypothesis"), momentum, nSigmaOuterTOF[3]); - histos.fill(HIST("h2dOuterNsigmaTrueKaonVsProtHypothesis"), momentum, nSigmaOuterTOF[4]); - break; - case 4: - histos.fill(HIST("h2dOuterNsigmaTrueProtVsElecHypothesis"), momentum, nSigmaOuterTOF[0]); - histos.fill(HIST("h2dOuterNsigmaTrueProtVsMuonHypothesis"), momentum, nSigmaOuterTOF[1]); - histos.fill(HIST("h2dOuterNsigmaTrueProtVsPionHypothesis"), momentum, nSigmaOuterTOF[2]); - histos.fill(HIST("h2dOuterNsigmaTrueProtVsKaonHypothesis"), momentum, nSigmaOuterTOF[3]); - histos.fill(HIST("h2dOuterNsigmaTrueProtVsProtHypothesis"), momentum, nSigmaOuterTOF[4]); - break; - default: - break; + for (int iii = 0; iii < 5; iii++) { + h2dOuterNsigmaTrue[ii][iii]->Fill(momentum, nSigmaOuterTOF[iii]); + h2dOuterDeltaTrue[ii][iii]->Fill(momentum, deltaTimeOuterTOF[iii]); } } } From 1d5516e457381f1a44fc6f4b45b062e9d66d73a9 Mon Sep 17 00:00:00 2001 From: czhang Date: Tue, 29 Apr 2025 09:50:34 +0200 Subject: [PATCH 1123/1650] [PWGDQ] Process using realigned muon track in table-maker-with-assoc (#10964) --- PWGDQ/TableProducer/tableMaker_withAssoc.cxx | 129 ++++++++++++++----- 1 file changed, 99 insertions(+), 30 deletions(-) diff --git a/PWGDQ/TableProducer/tableMaker_withAssoc.cxx b/PWGDQ/TableProducer/tableMaker_withAssoc.cxx index ce6dbeb11ec..690152893b3 100644 --- a/PWGDQ/TableProducer/tableMaker_withAssoc.cxx +++ b/PWGDQ/TableProducer/tableMaker_withAssoc.cxx @@ -36,6 +36,7 @@ #include "Common/DataModel/PIDResponse.h" #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/MftmchMatchingML.h" +#include "Common/DataModel/FwdTrackReAlignTables.h" #include "Common/Core/TableHelper.h" #include "PWGDQ/DataModel/ReducedInfoTables.h" #include "PWGDQ/Core/VarManager.h" @@ -105,6 +106,7 @@ using MyEventsWithCentAndMults = soa::Join; using MyMuons = soa::Join; using MyMuonsWithCov = soa::Join; +using MyMuonsRealignWithCov = soa::Join; using MyMuonsColl = soa::Join; using MyMuonsCollWithCov = soa::Join; using MyBCs = soa::Join; @@ -130,6 +132,7 @@ constexpr static uint32_t gkTrackFillMapWithV0BitsNoTOF = VarManager::ObjTypes:: // constexpr static uint32_t gkTrackFillMapWithDalitzBits = gkTrackFillMap | VarManager::ObjTypes::DalitzBits; // constexpr static uint32_t gkMuonFillMap = VarManager::ObjTypes::Muon; constexpr static uint32_t gkMuonFillMapWithCov = VarManager::ObjTypes::Muon | VarManager::ObjTypes::MuonCov; +constexpr static uint32_t gkMuonRealignFillMapWithCov = VarManager::ObjTypes::MuonRealign | VarManager::ObjTypes::MuonCovRealign; // constexpr static uint32_t gkMuonFillMapWithAmbi = VarManager::ObjTypes::Muon | VarManager::ObjTypes::AmbiMuon; // constexpr static uint32_t gkMuonFillMapWithCovAmbi = VarManager::ObjTypes::Muon | VarManager::ObjTypes::MuonCov | VarManager::ObjTypes::AmbiMuon; // constexpr static uint32_t gkTrackFillMapWithAmbi = VarManager::ObjTypes::Track | VarManager::ObjTypes::AmbiTrack; @@ -287,6 +290,8 @@ struct TableMaker { Preslice trackIndicesPerCollision = aod::track_association::collisionId; Preslice fwdtrackIndicesPerCollision = aod::track_association::collisionId; Preslice mfttrackIndicesPerCollision = aod::track_association::collisionId; + PresliceUnsorted perCollisionMuonsRealign = aod::fwdtrackrealign::collisionId; + PresliceUnsorted fwdtrackRealignPerMuon = aod::fwdtrackrealign::fwdtrackId; Preslice preslice = aod::track::collisionId; Partition tracksPos = (((aod::track::flags & static_cast(o2::aod::track::PVContributor)) == static_cast(o2::aod::track::PVContributor)) && (aod::track::tgl > static_cast(0.05))); @@ -360,8 +365,8 @@ struct TableMaker { context.mOptions.get("processPbPb") || context.mOptions.get("processPbPbBarrelOnly") || context.mOptions.get("processPbPbBarrelOnlyWithV0Bits") || context.mOptions.get("processPbPbBarrelOnlyWithV0BitsNoTOF")) || context.mOptions.get("processPbPbWithFilterBarrelOnly") || context.mOptions.get("processPPBarrelOnlyWithV0s"); - bool enableMuonHistos = (context.mOptions.get("processPPWithFilter") || context.mOptions.get("processPPWithFilterMuonOnly") || context.mOptions.get("processPPWithFilterMuonMFT") || context.mOptions.get("processPPMuonOnly") || context.mOptions.get("processPPMuonMFT") || context.mOptions.get("processPPMuonMFTWithMultsExtra") || - context.mOptions.get("processPbPb") || context.mOptions.get("processPbPbMuonOnly") || context.mOptions.get("processPbPbMuonMFT")); + bool enableMuonHistos = (context.mOptions.get("processPPWithFilter") || context.mOptions.get("processPPWithFilterMuonOnly") || context.mOptions.get("processPPWithFilterMuonMFT") || context.mOptions.get("processPPMuonOnly") || context.mOptions.get("processPPRealignedMuonOnly") || context.mOptions.get("processPPMuonMFT") || context.mOptions.get("processPPMuonMFTWithMultsExtra") || + context.mOptions.get("processPbPb") || context.mOptions.get("processPbPbMuonOnly") || context.mOptions.get("processPbPbRealignedMuonOnly") || context.mOptions.get("processPbPbMuonMFT")); if (enableBarrelHistos) { // Barrel track histograms, before selections @@ -1110,8 +1115,8 @@ struct TableMaker { } } - template - void skimMuons(TEvent const& collision, TBCs const& /*bcs*/, TMuons const& muons, FwdTrackAssoc const& muonAssocs, TMFTTracks const& /*mftTracks*/) + template + void skimMuons(TEvent const& collision, TBCs const& /*bcs*/, TMuons const& muons, TMuonsRealign const& muonsRealign, FwdTrackAssoc const& muonAssocs, TMFTTracks const& /*mftTracks*/) { // Skim the fwd-tracks (muons) // Loop over the collision-track associations, recompute track properties depending on the collision assigned, and apply track cuts for selection @@ -1151,7 +1156,28 @@ struct TableMaker { auto mfttrack = muon.template matchMFTTrack_as(); VarManager::FillGlobalMuonRefit(muontrack, mfttrack, collision); } else { - VarManager::FillTrackCollision(muon, collision); + if constexpr ((static_cast(TMuonRealignFillMap))) { + if (static_cast(muon.trackType()) > 2) { + // refill kinematic info and recalculate propagation in case of using realigned muons + auto muonRealignSelected = muonsRealign.sliceBy(fwdtrackRealignPerMuon, assoc.fwdtrackId()); + if (muonRealignSelected.size() == 1) { + for (const auto& muonRealign : muonRealignSelected) { + // refill muon information with realigned tracks + VarManager::FillTrack(muonRealign); + + if (fConfigVariousOptions.fPropMuon) { + VarManager::FillPropagateMuon(muonRealign, collision); + } + + VarManager::FillTrackCollision(muonRealign, collision); + } + } else { + LOGF(fatal, "Inconsistent size of realigned muon track candidates."); + } + } + } else { + VarManager::FillTrackCollision(muon, collision); + } } if (fDoDetailedQA) { @@ -1228,17 +1254,38 @@ struct TableMaker { VarManager::FillTrackCollision(muontrack, collision); VarManager::FillGlobalMuonRefit(muontrack, mfttrack, collision); } else { - VarManager::FillTrackCollision(muon, collision); + if constexpr ((static_cast(TMuonRealignFillMap))) { + if (static_cast(muon.trackType()) > 2) { + // refill kinematic info and recalculate propagation in case of using realigned muons + auto muonRealignSelected = muonsRealign.sliceBy(fwdtrackRealignPerMuon, muon.globalIndex()); + if (muonRealignSelected.size() == 1) { + for (const auto& muonRealign : muonRealignSelected) { + // refill muon information with realigned tracks + VarManager::FillTrack(muonRealign); + + if (fConfigVariousOptions.fPropMuon) { + VarManager::FillPropagateMuon(muonRealign, collision); + } + + VarManager::FillTrackCollision(muonRealign, collision); + } + } else { + LOGF(fatal, "Inconsistent size of realigned muon track candidates."); + } + } + } else { + VarManager::FillTrackCollision(muon, collision); + } } muonBasic(reducedEventIdx, mchIdx, mftIdx, fFwdTrackFilterMap[muon.globalIndex()], VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kEta], VarManager::fgValues[VarManager::kPhi], muon.sign(), 0); muonExtra(muon.nClusters(), VarManager::fgValues[VarManager::kMuonPDca], VarManager::fgValues[VarManager::kMuonRAtAbsorberEnd], - muon.chi2(), muon.chi2MatchMCHMID(), muon.chi2MatchMCHMFT(), + VarManager::fgValues[VarManager::kMuonChi2], muon.chi2MatchMCHMID(), muon.chi2MatchMCHMFT(), muon.matchScoreMCHMFT(), muon.mchBitMap(), muon.midBitMap(), muon.midBoards(), muon.trackType(), VarManager::fgValues[VarManager::kMuonDCAx], VarManager::fgValues[VarManager::kMuonDCAy], muon.trackTime(), muon.trackTimeRes()); muonInfo(muon.collisionId(), collision.posX(), collision.posY(), collision.posZ()); - if constexpr (static_cast(TMuonFillMap & VarManager::ObjTypes::MuonCov)) { + if constexpr (static_cast(TMuonFillMap & VarManager::ObjTypes::MuonCov) || static_cast(TMuonRealignFillMap & VarManager::ObjTypes::MuonCovRealign)) { muonCov(VarManager::fgValues[VarManager::kX], VarManager::fgValues[VarManager::kY], VarManager::fgValues[VarManager::kZ], VarManager::fgValues[VarManager::kPhi], VarManager::fgValues[VarManager::kTgl], muon.sign() / VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kMuonCXX], VarManager::fgValues[VarManager::kMuonCXY], VarManager::fgValues[VarManager::kMuonCYY], VarManager::fgValues[VarManager::kMuonCPhiX], VarManager::fgValues[VarManager::kMuonCPhiY], VarManager::fgValues[VarManager::kMuonCPhiPhi], VarManager::fgValues[VarManager::kMuonCTglX], VarManager::fgValues[VarManager::kMuonCTglY], VarManager::fgValues[VarManager::kMuonCTglPhi], VarManager::fgValues[VarManager::kMuonCTglTgl], VarManager::fgValues[VarManager::kMuonC1Pt2X], VarManager::fgValues[VarManager::kMuonC1Pt2Y], @@ -1248,11 +1295,11 @@ struct TableMaker { } // end skimMuons // Produce standard barrel + muon tables with event filter (typically for pp and p-Pb) ------------------------------------------------------ - template void fullSkimming(TEvents const& collisions, TBCs const& bcs, TZdcs const& zdcs, - TTracks const& tracksBarrel, TMuons const& muons, TMFTTracks const& mftTracks, + TTracks const& tracksBarrel, TMuons const& muons, TMuonsRealign const& muonsRealign, TMFTTracks const& mftTracks, TTrackAssoc const& trackAssocs, TFwdTrackAssoc const& fwdTrackAssocs, TMFTTrackAssoc const& mftAssocs) { @@ -1347,10 +1394,16 @@ struct TableMaker { if constexpr (static_cast(TMuonFillMap)) { if constexpr (static_cast(TMFTFillMap)) { auto groupedMuonIndices = fwdTrackAssocs.sliceBy(fwdtrackIndicesPerCollision, origIdx); - skimMuons(collision, bcs, muons, groupedMuonIndices, mftTracks); + skimMuons(collision, bcs, muons, nullptr, groupedMuonIndices, mftTracks); } else { - auto groupedMuonIndices = fwdTrackAssocs.sliceBy(fwdtrackIndicesPerCollision, origIdx); - skimMuons(collision, bcs, muons, groupedMuonIndices, nullptr); + if constexpr (static_cast(TMuonRealignFillMap)) { + auto groupedMuonIndices = fwdTrackAssocs.sliceBy(fwdtrackIndicesPerCollision, origIdx); + auto muonsRealignThisCollision = muonsRealign.sliceBy(perCollisionMuonsRealign, origIdx); + skimMuons(collision, bcs, muons, muonsRealignThisCollision, groupedMuonIndices, nullptr); + } else { + auto groupedMuonIndices = fwdTrackAssocs.sliceBy(fwdtrackIndicesPerCollision, origIdx); + skimMuons(collision, bcs, muons, nullptr, groupedMuonIndices, nullptr); + } } } } // end loop over skimmed collisions @@ -1367,7 +1420,7 @@ struct TableMaker { TrackAssoc const& trackAssocs, FwdTrackAssoc const& fwdTrackAssocs, MFTTrackAssoc const& mftAssocs) { - fullSkimming(collisions, bcs, nullptr, tracksBarrel, muons, mftTracks, trackAssocs, fwdTrackAssocs, mftAssocs); + fullSkimming(collisions, bcs, nullptr, tracksBarrel, muons, nullptr, mftTracks, trackAssocs, fwdTrackAssocs, mftAssocs); } // produce the barrel-only DQ skimmed data model typically for pp/p-Pb or UPC Pb-Pb (no centrality), subscribe to the DQ event filter (filter-pp or filter-PbPb) @@ -1375,14 +1428,14 @@ struct TableMaker { MyBarrelTracksWithCov const& tracksBarrel, TrackAssoc const& trackAssocs) { - fullSkimming(collisions, bcs, zdcs, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr); + fullSkimming(collisions, bcs, zdcs, tracksBarrel, nullptr, nullptr, nullptr, trackAssocs, nullptr, nullptr); } // produce the muon-only DQ skimmed data model typically for pp/p-Pb or UPC Pb-Pb (no centrality), subscribe to the DQ event filter (filter-pp or filter-PbPb) void processPPWithFilterMuonOnly(MyEventsWithMultsAndFilter const& collisions, BCsWithTimestamps const& bcs, MyMuonsWithCov const& muons, FwdTrackAssoc const& fwdTrackAssocs) { - fullSkimming(collisions, bcs, nullptr, nullptr, muons, nullptr, nullptr, fwdTrackAssocs, nullptr); + fullSkimming(collisions, bcs, nullptr, nullptr, muons, nullptr, nullptr, nullptr, fwdTrackAssocs, nullptr); } // produce the muon+mft DQ skimmed data model typically for pp/p-Pb or UPC Pb-Pb (no centrality), subscribe to the DQ event filter (filter-pp or filter-PbPb) @@ -1390,7 +1443,7 @@ struct TableMaker { MyMuonsWithCov const& muons, MFTTracks const& mftTracks, FwdTrackAssoc const& fwdTrackAssocs, MFTTrackAssoc const& mftAssocs) { - fullSkimming(collisions, bcs, nullptr, nullptr, muons, mftTracks, nullptr, fwdTrackAssocs, mftAssocs); + fullSkimming(collisions, bcs, nullptr, nullptr, muons, nullptr, mftTracks, nullptr, fwdTrackAssocs, mftAssocs); } // produce the barrel-only DQ skimmed data model typically for pp/p-Pb or UPC Pb-Pb (no centrality), meant to run on skimmed data @@ -1398,7 +1451,7 @@ struct TableMaker { MyBarrelTracksWithCov const& tracksBarrel, TrackAssoc const& trackAssocs) { - fullSkimming(collisions, bcs, zdcs, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr); + fullSkimming(collisions, bcs, zdcs, tracksBarrel, nullptr, nullptr, nullptr, trackAssocs, nullptr, nullptr); } // produce the barrel-only DQ skimmed barrel data model, with V0 tagged tracks @@ -1406,14 +1459,21 @@ struct TableMaker { MyBarrelTracksWithV0BitsNoTOF const& tracksBarrel, TrackAssoc const& trackAssocs) { - fullSkimming(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr); + fullSkimming(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, nullptr, trackAssocs, nullptr, nullptr); } // produce the muon-only DQ skimmed data model typically for pp/p-Pb or UPC Pb-Pb (no centrality), meant to run on skimmed data void processPPMuonOnly(MyEventsWithMults const& collisions, BCsWithTimestamps const& bcs, MyMuonsWithCov const& muons, FwdTrackAssoc const& fwdTrackAssocs) { - fullSkimming(collisions, bcs, nullptr, nullptr, muons, nullptr, nullptr, fwdTrackAssocs, nullptr); + fullSkimming(collisions, bcs, nullptr, nullptr, muons, nullptr, nullptr, nullptr, fwdTrackAssocs, nullptr); + } + + // produce the realigned muon-only DQ skimmed data model typically for pp/p-Pb or UPC Pb-Pb (no centrality), meant to run on skimmed data + void processPPRealignedMuonOnly(MyEventsWithMults const& collisions, BCsWithTimestamps const& bcs, + MyMuonsWithCov const& muons, MyMuonsRealignWithCov const& muonsRealign, FwdTrackAssoc const& fwdTrackAssocs) + { + fullSkimming(collisions, bcs, nullptr, nullptr, muons, muonsRealign, nullptr, nullptr, fwdTrackAssocs, nullptr); } // produce the muon+mft DQ skimmed data model typically for pp/p-Pb or UPC Pb-Pb (no centrality), meant to run on skimmed data @@ -1421,7 +1481,7 @@ struct TableMaker { MyMuonsWithCov const& muons, MFTTracks const& mftTracks, FwdTrackAssoc const& fwdTrackAssocs, MFTTrackAssoc const& mftAssocs) { - fullSkimming(collisions, bcs, nullptr, nullptr, muons, mftTracks, nullptr, fwdTrackAssocs, mftAssocs); + fullSkimming(collisions, bcs, nullptr, nullptr, muons, nullptr, mftTracks, nullptr, fwdTrackAssocs, mftAssocs); } // Central barrel multiplicity estimation @@ -1429,7 +1489,7 @@ struct TableMaker { MyMuonsWithCov const& muons, MFTTracks const& mftTracks, FwdTrackAssoc const& fwdTrackAssocs, MFTTrackAssoc const& mftAssocs) { - fullSkimming(collisions, bcs, nullptr, nullptr, muons, mftTracks, nullptr, fwdTrackAssocs, mftAssocs); + fullSkimming(collisions, bcs, nullptr, nullptr, muons, nullptr, mftTracks, nullptr, fwdTrackAssocs, mftAssocs); } // produce the full DQ skimmed data model typically for Pb-Pb (with centrality), no subscribtion to the DQ event filter @@ -1439,7 +1499,7 @@ struct TableMaker { TrackAssoc const& trackAssocs, FwdTrackAssoc const& fwdTrackAssocs, MFTTrackAssoc const& mftAssocs) { - fullSkimming(collisions, bcs, nullptr, tracksBarrel, muons, mftTracks, trackAssocs, fwdTrackAssocs, mftAssocs); + fullSkimming(collisions, bcs, nullptr, tracksBarrel, muons, nullptr, mftTracks, trackAssocs, fwdTrackAssocs, mftAssocs); } // produce the barrel only DQ skimmed data model typically for Pb-Pb (with centrality), no subscribtion to the DQ event filter @@ -1447,7 +1507,7 @@ struct TableMaker { MyBarrelTracksWithCov const& tracksBarrel, TrackAssoc const& trackAssocs) { - fullSkimming(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr); + fullSkimming(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, nullptr, trackAssocs, nullptr, nullptr); } // produce the barrel-only DQ skimmed data model typically for UPC Pb-Pb (no centrality), subscribe to the DQ rapidity gap event filter (filter-PbPb) @@ -1455,7 +1515,7 @@ struct TableMaker { MyBarrelTracksWithCov const& tracksBarrel, TrackAssoc const& trackAssocs) { - fullSkimming(collisions, bcs, zdcs, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr); + fullSkimming(collisions, bcs, zdcs, tracksBarrel, nullptr, nullptr, nullptr, trackAssocs, nullptr, nullptr); } // produce the barrel only DQ skimmed data model typically for Pb-Pb (with centrality), no subscribtion to the DQ event filter @@ -1464,7 +1524,7 @@ struct TableMaker { TrackAssoc const& trackAssocs) { computeOccupancyEstimators(collisions, tracksPos, tracksNeg, preslice, bcs); - fullSkimming(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr); + fullSkimming(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, nullptr, trackAssocs, nullptr, nullptr); } // produce the barrel only DQ skimmed data model typically for Pb-Pb (with centrality), no subscribtion to the DQ event filter @@ -1473,14 +1533,21 @@ struct TableMaker { TrackAssoc const& trackAssocs) { computeOccupancyEstimators(collisions, tracksPosNoTOF, tracksNegNoTOF, presliceNoTOF, bcs); - fullSkimming(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr); + fullSkimming(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, nullptr, trackAssocs, nullptr, nullptr); } // produce the muon only DQ skimmed data model typically for Pb-Pb (with centrality), no subscribtion to the DQ event filter void processPbPbMuonOnly(MyEventsWithCentAndMults const& collisions, BCsWithTimestamps const& bcs, MyMuonsWithCov const& muons, FwdTrackAssoc const& fwdTrackAssocs) { - fullSkimming(collisions, bcs, nullptr, nullptr, muons, nullptr, nullptr, fwdTrackAssocs, nullptr); + fullSkimming(collisions, bcs, nullptr, nullptr, muons, nullptr, nullptr, nullptr, fwdTrackAssocs, nullptr); + } + + // produce the realigned muon only DQ skimmed data model typically for Pb-Pb (with centrality), no subscribtion to the DQ event filter + void processPbPbRealignedMuonOnly(MyEventsWithCentAndMults const& collisions, BCsWithTimestamps const& bcs, + MyMuonsWithCov const& muons, MyMuonsRealignWithCov const& muonsRealign, FwdTrackAssoc const& fwdTrackAssocs) + { + fullSkimming(collisions, bcs, nullptr, nullptr, muons, muonsRealign, nullptr, nullptr, fwdTrackAssocs, nullptr); } // produce the muon+mft DQ skimmed data model typically for Pb-Pb (with centrality), no subscribtion to the DQ event filter @@ -1488,7 +1555,7 @@ struct TableMaker { MyMuonsWithCov const& muons, MFTTracks const& mftTracks, FwdTrackAssoc const& fwdTrackAssocs, MFTTrackAssoc const& mftAssocs) { - fullSkimming(collisions, bcs, nullptr, nullptr, muons, mftTracks, nullptr, fwdTrackAssocs, mftAssocs); + fullSkimming(collisions, bcs, nullptr, nullptr, muons, nullptr, mftTracks, nullptr, fwdTrackAssocs, mftAssocs); } // Process the BCs and store stats for luminosity retrieval ----------------------------------------------------------------------------------- @@ -1509,6 +1576,7 @@ struct TableMaker { PROCESS_SWITCH(TableMaker, processPPBarrelOnly, "Build barrel only DQ skimmed data model typically for pp/p-Pb and UPC Pb-Pb", false); PROCESS_SWITCH(TableMaker, processPPBarrelOnlyWithV0s, "Build barrel only DQ skimmed data model, pp like, with V0 tagged tracks", false); PROCESS_SWITCH(TableMaker, processPPMuonOnly, "Build muon only DQ skimmed data model typically for pp/p-Pb and UPC Pb-Pb", false); + PROCESS_SWITCH(TableMaker, processPPRealignedMuonOnly, "Build realigned muon only DQ skimmed data model typically for pp/p-Pb and UPC Pb-Pb", false); PROCESS_SWITCH(TableMaker, processPPMuonMFT, "Build muon + mft DQ skimmed data model typically for pp/p-Pb and UPC Pb-Pb", false); PROCESS_SWITCH(TableMaker, processPPMuonMFTWithMultsExtra, "Build muon + mft DQ skimmed data model typically for pp/p-Pb and UPC Pb-Pb", false); PROCESS_SWITCH(TableMaker, processPbPb, "Build full DQ skimmed data model typically for Pb-Pb, w/o event filtering", false); @@ -1517,6 +1585,7 @@ struct TableMaker { PROCESS_SWITCH(TableMaker, processPbPbBarrelOnlyWithV0Bits, "Build barrel only DQ skimmed data model typically for Pb-Pb, w/ V0 bits, w/o event filtering", false); PROCESS_SWITCH(TableMaker, processPbPbBarrelOnlyWithV0BitsNoTOF, "Build barrel only DQ skimmed data model typically for Pb-Pb, w/ V0 bits, no TOF, w/o event filtering", false); PROCESS_SWITCH(TableMaker, processPbPbMuonOnly, "Build muon only DQ skimmed data model typically for Pb-Pb, w/o event filtering", false); + PROCESS_SWITCH(TableMaker, processPbPbRealignedMuonOnly, "Build realigned muon only DQ skimmed data model typically for Pb-Pb, w/o event filtering", false); PROCESS_SWITCH(TableMaker, processPbPbMuonMFT, "Build muon + mft DQ skimmed data model typically for Pb-Pb, w/o event filtering", false); PROCESS_SWITCH(TableMaker, processOnlyBCs, "Analyze the BCs to store sampled lumi", false); }; From dcba91e8cd14788b41c800d4f2f83cffc3d9ecdf Mon Sep 17 00:00:00 2001 From: sjzhu0v0 <87005502+sjzhu0v0@users.noreply.github.com> Date: Tue, 29 Apr 2025 15:15:53 +0200 Subject: [PATCH 1124/1650] [PWGDQ] Update HistogramsLibrary.cxx (#11015) --- PWGDQ/Core/HistogramsLibrary.cxx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 8efe158abde..1fc7e65442c 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -1654,6 +1654,8 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "MassD0region_Rapidity_AveragePt", "", true, 140, 1.5, 2.2, VarManager::kMass, 10, -0.8, 0.8, VarManager::kRap, 150, 0.0, 30.0, VarManager::kPt); hm->AddHistogram(histClass, "MassD0region_Pt_ITStrackOccupancy", "Pair mass vs pair Pt vs event ITS occupancy", false, 70, 1.5, 2.2, VarManager::kMass, 160, 0., 20., VarManager::kPt, 200, 0., 20000., VarManager::kTrackOccupancyInTimeRange); hm->AddHistogram(histClass, "MassD0region_TPCnSigKa_pIN", "Pair mass vs kaon cand. pIN vs kaon cand. TPC n-#sigma(K)", false, 140, 1.5, 2.2, VarManager::kMass, 100, 0.0, 10.0, VarManager::kPin_leg1, 20, -5.0, 5.0, VarManager::kTPCnSigmaKa_leg1); + hm->AddHistogram(histClass, "Mass_Pt_Ft0cOccupancy", "", false, 150, 0.0, 5.0, VarManager::kMass, 10, 0., 10., VarManager::kPt, 20, 0., 20000., VarManager::kFT0COccupancyInTimeRange); + hm->AddHistogram(histClass, "Mass_Pt_ITStrackOccupancy", "", false, 150, 0.0, 5.0, VarManager::kMass, 10, 0., 10., VarManager::kPt, 20, 0., 20000., VarManager::kTrackOccupancyInTimeRange); } if (subGroupStr.Contains("lambdac")) { hm->AddHistogram(histClass, "MassLambdacRegion", "", false, 50, 2.15, 2.4, VarManager::kMass); From b6631250ac9beda470f57d404fe3ce99e0814aa0 Mon Sep 17 00:00:00 2001 From: prottayCMT <61418725+prottayCMT@users.noreply.github.com> Date: Tue, 29 Apr 2025 15:23:32 +0200 Subject: [PATCH 1125/1650] [PWGLF] commented out a histogram while filling SA (#10994) Co-authored-by: Prottay Das --- PWGLF/Tasks/Resonances/kstarpbpb.cxx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/PWGLF/Tasks/Resonances/kstarpbpb.cxx b/PWGLF/Tasks/Resonances/kstarpbpb.cxx index b6a0cfb453b..cd2ddf8d0c0 100644 --- a/PWGLF/Tasks/Resonances/kstarpbpb.cxx +++ b/PWGLF/Tasks/Resonances/kstarpbpb.cxx @@ -651,7 +651,9 @@ struct kstarpbpb { auto angleend = confMaxRot; auto anglestep = (angleend - anglestart) / (1.0 * (nBkgRotations - 1)); auto rotangle = anglestart + nrotbkg * anglestep; - histos.fill(HIST("hRotation"), rotangle); + if (!fillSA) { + histos.fill(HIST("hRotation"), rotangle); + } auto rotkaonPx = track1.px() * std::cos(rotangle) - track1.py() * std::sin(rotangle); auto rotkaonPy = track1.px() * std::sin(rotangle) + track1.py() * std::cos(rotangle); kaonrot = ROOT::Math::PxPyPzMVector(rotkaonPx, rotkaonPy, track1.pz(), massKa); @@ -667,9 +669,9 @@ struct kstarpbpb { if (!useSP) { v2Rot = TMath::Cos(2.0 * phiminuspsiRot); } - if (!fillSA) + if (!fillSA) { histos.fill(HIST("hSparseV2SASameEventRotational_V2"), kstarrot.M(), kstarrot.Pt(), v2Rot, centrality); - + } if (fillSA) { if (track1Sign * track2Sign < 0) { ROOT::Math::Boost boost{kstarrot.BoostToCM()}; From d2c29b9aafbe7a8bf2be1603c4ce1dd790bf0609 Mon Sep 17 00:00:00 2001 From: Adrian Sevcenco Date: Tue, 29 Apr 2025 16:30:48 +0300 Subject: [PATCH 1126/1650] [Common] Common/CCDB add RCTSelectionFlags.h to headers list (#11019) --- Common/CCDB/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Common/CCDB/CMakeLists.txt b/Common/CCDB/CMakeLists.txt index 63584528a38..52f4ec8ffde 100644 --- a/Common/CCDB/CMakeLists.txt +++ b/Common/CCDB/CMakeLists.txt @@ -19,4 +19,5 @@ o2physics_target_root_dictionary(AnalysisCCDB HEADERS EventSelectionParams.h HEADERS TriggerAliases.h HEADERS ctpRateFetcher.h + HEADERS RCTSelectionFlags.h LINKDEF AnalysisCCDBLinkDef.h) From 8ca4c2126e213d6723339b7acdb0b6ea6a0b821e Mon Sep 17 00:00:00 2001 From: rbailhac Date: Tue, 29 Apr 2025 16:13:24 +0200 Subject: [PATCH 1127/1650] [PWGEM] Fix for normalization of beauty cocktail. (#11021) --- PWGEM/Dilepton/Tasks/lmeeHFCocktail.cxx | 38 +++++++++++++++++++++++++ PWGEM/Dilepton/Utils/MCUtilities.h | 10 ++++--- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/PWGEM/Dilepton/Tasks/lmeeHFCocktail.cxx b/PWGEM/Dilepton/Tasks/lmeeHFCocktail.cxx index d26c22c409a..31e66671809 100644 --- a/PWGEM/Dilepton/Tasks/lmeeHFCocktail.cxx +++ b/PWGEM/Dilepton/Tasks/lmeeHFCocktail.cxx @@ -160,11 +160,49 @@ struct MyConfigs : ConfigurableGroup { struct lmeehfcocktailprefilter { + HistogramRegistry registry{"registry", {}}; + std::vector> hRapQuark; Produces hfTable; + ConfigurableAxis fConfigRapBins{"cfgRapBins", {200, -10.f, 10.f}, "Quark rapidity binning"}; + + void init(o2::framework::InitContext&) + { + const int Nchannels = 2; + const char* typeNamesSingle[Nchannels] = {"b", "c"}; + const char* typeTitlesSingle[Nchannels] = {"b", "c"}; + + AxisSpec rap_axis = {fConfigRapBins, "y_{b}"}; + + // quark histograms + for (int i = 0; i < Nchannels; i++) { + hRapQuark.push_back(registry.add(Form("Quark_Rap_%s", typeNamesSingle[i]), Form("Rap Quark %s", typeTitlesSingle[i]), HistType::kTH1F, {rap_axis}, true)); + } + } + void process(aod::McParticles const& mcParticles) { for (auto const& p : mcParticles) { + // Look at quarks which fragment + if (abs(p.pdgCode()) == 5 || abs(p.pdgCode()) == 4) { + bool foundhadrons = kFALSE; + if (p.has_daughters()) { + const auto& daughtersSlice = p.daughters_as(); + for (auto& d : daughtersSlice) { + int pdgfragment = d.pdgCode(); + if (static_cast(abs(pdgfragment) / 100.) == abs(p.pdgCode()) || static_cast(abs(pdgfragment) / 1000.) == abs(p.pdgCode())) { + foundhadrons = kTRUE; + } + } + } + if (foundhadrons) { + if (abs(p.pdgCode()) == 4) + hRapQuark[1]->Fill(p.y()); + else if (abs(p.pdgCode()) == 5) + hRapQuark[0]->Fill(p.y()); + } + } + // Look at electrons if (abs(p.pdgCode()) != 11 || o2::mcgenstatus::getHepMCStatusCode(p.statusCode()) != 1 || !p.has_mothers()) { hfTable(EFromHFType::kNoE, -1, -1, -1, -1, -1, -1, -999., -999.); continue; diff --git a/PWGEM/Dilepton/Utils/MCUtilities.h b/PWGEM/Dilepton/Utils/MCUtilities.h index 58484f6fe66..c6c1aacfe04 100644 --- a/PWGEM/Dilepton/Utils/MCUtilities.h +++ b/PWGEM/Dilepton/Utils/MCUtilities.h @@ -481,14 +481,16 @@ int searchMothers(T& p, U& mcParticles, int pdg, bool equal) for (int i : allmothersids) { auto mother = mcParticles.iteratorAt(i); int mpdg = mother.pdgCode(); - if (abs(mpdg) == pdg && mpdg * p.pdgCode() > 0) { // check for quark - if (quark_id > -1 || next_mother_id > -1) { // we already found a possible candidate in the list of mothers, so now we have (at least) two + // if (abs(mpdg) == pdg && mpdg * p.pdgCode() > 0) { // check for quark + if (abs(mpdg) == pdg) { // check for quark to allow for beauty and charm + oscillation + if (quark_id > -1 || next_mother_id > -1) { // we already found a possible candidate in the list of mothers, so now we have (at least) two // LOG(warning) << "Flavour tracking is ambiguous. Stopping here."; return -1; } quark_id = i; - } else if ((static_cast(abs(mpdg) / 100) == pdg || static_cast(abs(mpdg) / 1000) == pdg) && mpdg * p.pdgCode() > 0) { // check for other mothers with flavour content - if (quark_id > -1 || next_mother_id > -1) { // we already found a possible candidate in the list of mothers, so now we have (at least) two + //} else if ((static_cast(abs(mpdg) / 100) == pdg || static_cast(abs(mpdg) / 1000) == pdg) && mpdg * p.pdgCode() > 0) { // check for other mothers with flavour content + } else if ((static_cast(abs(mpdg) / 100) == pdg || static_cast(abs(mpdg) / 1000) == pdg)) { // check for other mothers with flavour content to allow for beauty and charm + if (quark_id > -1 || next_mother_id > -1) { // we already found a possible candidate in the list of mothers, so now we have (at least) two // LOG(warning) << "Flavour tracking is ambiguous. Stopping here."; return -1; } From 4ca8b2013c625fa324db4c3a9e9914500997b38b Mon Sep 17 00:00:00 2001 From: alcaliva <32872606+alcaliva@users.noreply.github.com> Date: Tue, 29 Apr 2025 17:07:30 +0200 Subject: [PATCH 1128/1650] [PWGLF] renamed file and fixed cluster size calculation (#11018) --- PWGLF/Tasks/QC/CMakeLists.txt | 2 +- ...rties.cxx => trackedCascadeProperties.cxx} | 86 +++++++++++-------- 2 files changed, 49 insertions(+), 39 deletions(-) rename PWGLF/Tasks/QC/{tracked_cascade_properties.cxx => trackedCascadeProperties.cxx} (81%) diff --git a/PWGLF/Tasks/QC/CMakeLists.txt b/PWGLF/Tasks/QC/CMakeLists.txt index dd0c14d1c91..f8c8e35cafa 100644 --- a/PWGLF/Tasks/QC/CMakeLists.txt +++ b/PWGLF/Tasks/QC/CMakeLists.txt @@ -111,7 +111,7 @@ o2physics_add_dpl_workflow(mcinelgt0 COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(tracked-cascade-properties - SOURCES tracked_cascade_properties.cxx + SOURCES trackedCascadeProperties.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) diff --git a/PWGLF/Tasks/QC/tracked_cascade_properties.cxx b/PWGLF/Tasks/QC/trackedCascadeProperties.cxx similarity index 81% rename from PWGLF/Tasks/QC/tracked_cascade_properties.cxx rename to PWGLF/Tasks/QC/trackedCascadeProperties.cxx index e2f93dbe481..04c7250208c 100644 --- a/PWGLF/Tasks/QC/tracked_cascade_properties.cxx +++ b/PWGLF/Tasks/QC/trackedCascadeProperties.cxx @@ -8,12 +8,14 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +// +/// \file trackedCascadeProperties.cxx +/// +/// \brief task to study the average cluster size of tracked cascades /// /// \author Alberto Caliva (alberto.caliva@cern.ch), Francesca Ercolessi (francesca.ercolessi@cern.ch) /// \since May 31, 2024 -#include -#include #include #include #include @@ -21,6 +23,7 @@ #include #include #include +#include #include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" @@ -37,8 +40,6 @@ #include "PWGLF/DataModel/LFStrangenessTables.h" #include "ReconstructionDataFormats/Track.h" #include "ReconstructionDataFormats/DCA.h" -#define mXi 1.32171 -#define mOmega 1.67245 using namespace std; using namespace o2; @@ -51,7 +52,7 @@ using SelectedCollisions = soa::Join; using FullTracks = soa::Join; -struct tracked_cascade_properties { +struct TrackedCascadeProperties { // QC Histograms HistogramRegistry registryQC{ @@ -72,15 +73,11 @@ struct tracked_cascade_properties { // Global Parameters Configurable zVtx{"zVtx", 10.0f, "z vertex cut"}; - // Cascade Parameters - Configurable minimumCascRadius{"minimumCascRadius", 5.0f, "Minimum Cascade Radius"}; - Configurable maximumCascRadius{"maximumCascRadius", 18.0f, "Maximum Cascade Radius"}; - // Mass Cuts - Configurable mMin_xi{"mMin_xi", 1.315f, "mMin Xi"}; - Configurable mMax_xi{"mMax_xi", 1.328f, "mMax Xi"}; - Configurable mMin_omega{"mMin_omega", 1.665f, "mMin Omega"}; - Configurable mMax_omega{"mMax_omega", 1.680f, "mMax Omega"}; + Configurable massMinXi{"massMinXi", 1.315f, "mMin Xi"}; + Configurable massMaxXi{"massMaxXi", 1.328f, "mMax Xi"}; + Configurable massMinOmega{"massMinOmega", 1.665f, "mMin Omega"}; + Configurable massMaxOmega{"massMaxOmega", 1.680f, "mMax Omega"}; void init(InitContext const&) { @@ -118,17 +115,27 @@ struct tracked_cascade_properties { registryData.add("omega_mass_neg", "omega_mass_neg", HistType::kTH2F, {{100, 0.0, 10.0, "#it{p} (GeV/#it{c})"}, {200, 1.63, 1.71, "m_{p#piK} (GeV/#it{c}^{2})"}}); } - double track_inclination(double eta) + double trackInclination(double eta) { double lambda(0); - double theta = 2.0 * atan(exp(-eta)); - if (theta <= TMath::Pi() / 2.0) - lambda = 0.5 * TMath::Pi() - theta; - if (theta > TMath::Pi() / 2.0) - lambda = theta - 0.5 * TMath::Pi(); + double theta = 2.0 * std::atan(std::exp(-eta)); + if (theta <= o2::constants::math::PIHalf) + lambda = o2::constants::math::PIHalf - theta; + if (theta > o2::constants::math::PIHalf) + lambda = theta - o2::constants::math::PIHalf; return lambda; } + int findBin(const std::vector& edges, double value) + { + auto it = std::upper_bound(edges.begin(), edges.end(), value); + int index = static_cast(it - edges.begin()) - 1; + if (index < 0 || index >= static_cast(edges.size()) - 1) { + return -1; // value is out of bounds + } + return index; + } + void processData(SelectedCollisions::iterator const& collision, aod::AssignedTrackedCascades const& trackedCascades, aod::Cascades const&, FullTracks const&) { @@ -137,11 +144,13 @@ struct tracked_cascade_properties { return; registryData.fill(HIST("number_of_events_data"), 1.5); - if (abs(collision.posZ()) > zVtx) + if (std::abs(collision.posZ()) > zVtx) return; registryData.fill(HIST("number_of_events_data"), 2.5); + std::vector edgesItsLayers = {0.0, 2.2, 2.8, 3.6, 20.0, 22.0, 37.0, 39.0, 100.0}; + for (const auto& trackedCascade : trackedCascades) { const auto track = trackedCascade.track_as(); @@ -151,7 +160,9 @@ struct tracked_cascade_properties { registryQC.fill(HIST("deltaP"), track.p() - trackITS.p()); registryQC.fill(HIST("deltaEta"), track.eta() - trackITS.eta()); registryQC.fill(HIST("deltaNclsITS"), track.itsNCls() - trackITS.itsNCls()); - for (int i = 0; i < 7; i++) { + + const int nItsLayers = 7; + for (int i = 0; i < nItsLayers; i++) { registryQC.fill(HIST("deltaClsSize"), track.itsClsSizeInLayer(i) - trackITS.itsClsSizeInLayer(i)); } @@ -159,9 +170,8 @@ struct tracked_cascade_properties { const auto& btrack = casc.bachelor_as(); double dx = trackedCascade.decayX(); double dy = trackedCascade.decayY(); - double r = sqrt(dx * dx + dy * dy); - if (r < minimumCascRadius || r > maximumCascRadius) - continue; + double r = std::sqrt(dx * dx + dy * dy); + int nClsCascade = findBin(edgesItsLayers, r); registryQC.fill(HIST("matchingChi2"), trackedCascade.matchingChi2()); registryQC.fill(HIST("topologyChi2"), trackedCascade.topologyChi2()); @@ -170,7 +180,7 @@ struct tracked_cascade_properties { // Calculate (Average) Cluster Size double averageClusterSize(0); int nCls(0); - for (int i = 0; i < 7; i++) { + for (int i = 0; i < nClsCascade; i++) { int clusterSize = trackITS.itsClsSizeInLayer(i); averageClusterSize += static_cast(clusterSize); if (clusterSize > 0) @@ -190,20 +200,20 @@ struct tracked_cascade_properties { } // Track Inclination - double lambda = track_inclination(track.eta()); + double lambda = trackInclination(track.eta()); // Xi - if (trackedCascade.xiMass() > mMin_xi && trackedCascade.xiMass() < mMax_xi) { + if (trackedCascade.xiMass() > massMinXi && trackedCascade.xiMass() < massMaxXi) { registryQC.fill(HIST("nITScls_vs_p_xi"), track.p(), trackITS.itsNCls()); if (btrack.sign() > 0) { registryData.fill(HIST("xi_pos_avgclustersize"), track.p(), averageClusterSize, track.eta()); - registryData.fill(HIST("xi_pos_avgclustersize_cosL"), track.p(), averageClusterSize * cos(lambda)); - registryData.fill(HIST("xi_pos_avgclustersize_cosL_vs_betagamma"), track.p() / mXi, averageClusterSize * cos(lambda)); + registryData.fill(HIST("xi_pos_avgclustersize_cosL"), track.p(), averageClusterSize * std::cos(lambda)); + registryData.fill(HIST("xi_pos_avgclustersize_cosL_vs_betagamma"), track.p() / o2::constants::physics::MassXiPlusBar, averageClusterSize * std::cos(lambda)); } if (btrack.sign() < 0) { registryData.fill(HIST("xi_neg_avgclustersize"), track.p(), averageClusterSize, track.eta()); - registryData.fill(HIST("xi_neg_avgclustersize_cosL"), track.p(), averageClusterSize * cos(lambda)); - registryData.fill(HIST("xi_neg_avgclustersize_cosL_vs_betagamma"), track.p() / mXi, averageClusterSize * cos(lambda)); + registryData.fill(HIST("xi_neg_avgclustersize_cosL"), track.p(), averageClusterSize * std::cos(lambda)); + registryData.fill(HIST("xi_neg_avgclustersize_cosL_vs_betagamma"), track.p() / o2::constants::physics::MassXiMinus, averageClusterSize * std::cos(lambda)); } continue; } @@ -217,25 +227,25 @@ struct tracked_cascade_properties { } // Omega - if (trackedCascade.omegaMass() > mMin_omega && trackedCascade.omegaMass() < mMax_omega) { + if (trackedCascade.omegaMass() > massMinOmega && trackedCascade.omegaMass() < massMaxOmega) { registryQC.fill(HIST("nITScls_vs_p_omega"), track.p(), trackITS.itsNCls()); if (btrack.sign() > 0) { registryData.fill(HIST("omega_pos_avgclustersize"), track.p(), averageClusterSize, track.eta()); - registryData.fill(HIST("omega_pos_avgclustersize_cosL"), track.p(), averageClusterSize * cos(lambda)); - registryData.fill(HIST("omega_pos_avgclustersize_cosL_vs_betagamma"), track.p() / mOmega, averageClusterSize * cos(lambda)); + registryData.fill(HIST("omega_pos_avgclustersize_cosL"), track.p(), averageClusterSize * std::cos(lambda)); + registryData.fill(HIST("omega_pos_avgclustersize_cosL_vs_betagamma"), track.p() / o2::constants::physics::MassOmegaPlusBar, averageClusterSize * std::cos(lambda)); } if (btrack.sign() < 0) { registryData.fill(HIST("omega_neg_avgclustersize"), track.p(), averageClusterSize, track.eta()); - registryData.fill(HIST("omega_neg_avgclustersize_cosL"), track.p(), averageClusterSize * cos(lambda)); - registryData.fill(HIST("omega_neg_avgclustersize_cosL_vs_betagamma"), track.p() / mOmega, averageClusterSize * cos(lambda)); + registryData.fill(HIST("omega_neg_avgclustersize_cosL"), track.p(), averageClusterSize * std::cos(lambda)); + registryData.fill(HIST("omega_neg_avgclustersize_cosL_vs_betagamma"), track.p() / o2::constants::physics::MassOmegaMinus, averageClusterSize * std::cos(lambda)); } } } } - PROCESS_SWITCH(tracked_cascade_properties, processData, "Process data", true); + PROCESS_SWITCH(TrackedCascadeProperties, processData, "Process data", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{adaptAnalysisTask(cfgc)}; + return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From 7eef39e63ba9cae3deb23e59f5283a444306b5ea Mon Sep 17 00:00:00 2001 From: lucamicheletti93 <38209984+lucamicheletti93@users.noreply.github.com> Date: Tue, 29 Apr 2025 19:29:11 +0200 Subject: [PATCH 1129/1650] [PWGDQ] Updating dqEfficiencyWithAssociation (#11028) Co-authored-by: Lucamicheletti93 --- PWGDQ/Tasks/dqEfficiency_withAssoc.cxx | 88 ++++++++++++++++++++++---- 1 file changed, 74 insertions(+), 14 deletions(-) diff --git a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx index f747556ac49..3f2e22ba591 100644 --- a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx +++ b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx @@ -1252,7 +1252,7 @@ struct AnalysisSameEventPairing { Configurable recSignals{"cfgBarrelMCRecSignals", "", "Comma separated list of MC signals (reconstructed)"}; Configurable recSignalsJSON{"cfgMCRecSignalsJSON", "", "Comma separated list of MC signals (reconstructed) via JSON"}; Configurable skimSignalOnly{"cfgSkimSignalOnly", false, "Configurable to select only matched candidates"}; - Configurable runMCGenPair{"cfgRunMCGenPair", false, "Do pairing of true MC particles"}; + // Configurable runMCGenPair{"cfgRunMCGenPair", false, "Do pairing of true MC particles"}; } fConfigMC; struct : ConfigurableGroup { @@ -1267,6 +1267,7 @@ struct AnalysisSameEventPairing { Service fCCDB; // Filter filterEventSelected = aod::dqanalysisflags::isEventSelected & uint32_t(1); + Filter eventFilter = aod::dqanalysisflags::isEventSelected > static_cast(0); HistogramManager* fHistMan; @@ -1298,6 +1299,7 @@ struct AnalysisSameEventPairing { if (context.mOptions.get("processDummy")) { return; } + bool isMCGen = context.mOptions.get("processMCGen") || context.mOptions.get("processMCGenWithEventSelection"); VarManager::SetDefaultVarNames(); fEnableBarrelHistos = context.mOptions.get("processAllSkimmed") || context.mOptions.get("processBarrelOnlySkimmed") || context.mOptions.get("processBarrelOnlyWithCollSkimmed"); @@ -1555,12 +1557,16 @@ struct AnalysisSameEventPairing { } } - for (auto& sig : fGenMCSignals) { - if (sig->GetNProngs() == 1) { - histNames += Form("MCTruthGen_%s;", sig->GetName()); // TODO: Add these names to a std::vector to avoid using Form in the process function - } else if (sig->GetNProngs() == 2) { - histNames += Form("MCTruthGenPair_%s;", sig->GetName()); - fHasTwoProngGenMCsignals = true; + if (isMCGen) { + for (auto& sig : fGenMCSignals) { + if (sig->GetNProngs() == 1) { + histNames += Form("MCTruthGen_%s;", sig->GetName()); // TODO: Add these names to a std::vector to avoid using Form in the process function + histNames += Form("MCTruthGenSel_%s;", sig->GetName()); + } else if (sig->GetNProngs() == 2) { + histNames += Form("MCTruthGenPair_%s;", sig->GetName()); + histNames += Form("MCTruthGenPairSel_%s;", sig->GetName()); + fHasTwoProngGenMCsignals = true; + } } } @@ -2044,9 +2050,10 @@ struct AnalysisSameEventPairing { { runSameEventPairing(events, trackAssocsPerCollision, barrelAssocs, barrelTracks, mcEvents, mcTracks); runSameEventPairing(events, muonAssocsPerCollision, muonAssocs, muons, mcEvents, mcTracks); - if (fConfigMC.runMCGenPair) { + // Feature replaced by processMCGen and processMCGenWithEventSelection + /*if (fConfigMC.runMCGenPair) { runMCGen(mcEvents, mcTracks); - } + }*/ // runSameEventPairing(event, tracks, muons); } @@ -2055,9 +2062,10 @@ struct AnalysisSameEventPairing { MyBarrelTracksWithCovWithAmbiguities const& barrelTracks, ReducedMCEvents const& mcEvents, ReducedMCTracks const& mcTracks) { runSameEventPairing(events, trackAssocsPerCollision, barrelAssocs, barrelTracks, mcEvents, mcTracks); - if (fConfigMC.runMCGenPair) { + // Feature replaced by processMCGen and processMCGenWithEventSelection + /*if (fConfigMC.runMCGenPair) { runMCGen(mcEvents, mcTracks); - } + }*/ } void processBarrelOnlyWithCollSkimmed(MyEventsVtxCovSelected const& events, @@ -2065,20 +2073,70 @@ struct AnalysisSameEventPairing { MyBarrelTracksWithCovWithAmbiguitiesWithColl const& barrelTracks, ReducedMCEvents const& mcEvents, ReducedMCTracks const& mcTracks) { runSameEventPairing(events, trackAssocsPerCollision, barrelAssocs, barrelTracks, mcEvents, mcTracks); - if (fConfigMC.runMCGenPair) { + // Feature replaced by processMCGen and processMCGenWithEventSelection + /*if (fConfigMC.runMCGenPair) { runMCGen(mcEvents, mcTracks); - } + }*/ } void processMuonOnlySkimmed(MyEventsVtxCovSelected const& events, soa::Join const& muonAssocs, MyMuonTracksWithCovWithAmbiguities const& muons, ReducedMCEvents const& mcEvents, ReducedMCTracks const& mcTracks) { runSameEventPairing(events, muonAssocsPerCollision, muonAssocs, muons, mcEvents, mcTracks); - if (fConfigMC.runMCGenPair) { + // Feature replaced by processMCGen and processMCGenWithEventSelection + /*if (fConfigMC.runMCGenPair) { runMCGen(mcEvents, mcTracks); + }*/ + } + + void processMCGen(ReducedMCTracks const& mcTracks) + { + // loop over mc stack and fill histograms for pure MC truth signals + // group all the MC tracks which belong to the MC event corresponding to the current reconstructed event + // auto groupedMCTracks = tracksMC.sliceBy(aod::reducedtrackMC::reducedMCeventId, event.reducedMCevent().globalIndex()); + for (auto& mctrack : mcTracks) { + + VarManager::FillTrackMC(mcTracks, mctrack); + // NOTE: Signals are checked here mostly based on the skimmed MC stack, so depending on the requested signal, the stack could be incomplete. + // NOTE: However, the working model is that the decisions on MC signals are precomputed during skimming and are stored in the mcReducedFlags member. + // TODO: Use the mcReducedFlags to select signals + for (auto& sig : fGenMCSignals) { + if (sig->CheckSignal(true, mctrack)) { + fHistMan->FillHistClass(Form("MCTruthGen_%s", sig->GetName()), VarManager::fgValues); + } + } } } + PresliceUnsorted perReducedMcGenEvent = aod::reducedtrackMC::reducedMCeventId; + + void processMCGenWithEventSelection(soa::Filtered const& events, + ReducedMCEvents const& /*mcEvents*/, ReducedMCTracks const& mcTracks) + { + for (auto& event : events) { + if (!event.isEventSelected_bit(0)) { + continue; + } + if (!event.has_reducedMCevent()) { + continue; + } + + auto groupedMCTracks = mcTracks.sliceBy(perReducedMcGenEvent, event.reducedMCeventId()); + groupedMCTracks.bindInternalIndicesTo(&mcTracks); + for (auto& track : groupedMCTracks) { + + VarManager::FillTrackMC(mcTracks, track); + + auto track_raw = groupedMCTracks.rawIteratorAt(track.globalIndex()); + for (auto& sig : fGenMCSignals) { + if (sig->CheckSignal(true, track_raw)) { + fHistMan->FillHistClass(Form("MCTruthGenSel_%s", sig->GetName()), VarManager::fgValues); + } + } + } + } // end loop over reconstructed events + } + void processDummy(MyEvents&) { // do nothing @@ -2088,6 +2146,8 @@ struct AnalysisSameEventPairing { PROCESS_SWITCH(AnalysisSameEventPairing, processBarrelOnlySkimmed, "Run barrel only pairing, with skimmed tracks", false); PROCESS_SWITCH(AnalysisSameEventPairing, processBarrelOnlyWithCollSkimmed, "Run barrel only pairing, with skimmed tracks and with collision information", false); PROCESS_SWITCH(AnalysisSameEventPairing, processMuonOnlySkimmed, "Run muon only pairing, with skimmed tracks", false); + PROCESS_SWITCH(AnalysisSameEventPairing, processMCGen, "Loop over MC particle stack and fill generator level histograms", false); + PROCESS_SWITCH(AnalysisSameEventPairing, processMCGenWithEventSelection, "Loop over MC particle stack and fill generator level histograms with event selection", false); PROCESS_SWITCH(AnalysisSameEventPairing, processDummy, "Dummy function, enabled only if none of the others are enabled", false); }; From 9938613f7a1851163c72fc5cd3c7182187d85b5c Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Tue, 29 Apr 2025 20:14:26 +0200 Subject: [PATCH 1130/1650] [PWGLF] Add new process function to have optimize selection of phi meson pair (#11029) --- PWGLF/Tasks/Resonances/doublephimeson.cxx | 167 ++++++++++++++++++++++ 1 file changed, 167 insertions(+) diff --git a/PWGLF/Tasks/Resonances/doublephimeson.cxx b/PWGLF/Tasks/Resonances/doublephimeson.cxx index 78aee4aaf9b..584c6ec5be2 100644 --- a/PWGLF/Tasks/Resonances/doublephimeson.cxx +++ b/PWGLF/Tasks/Resonances/doublephimeson.cxx @@ -115,6 +115,20 @@ struct doublephimeson { return 0.5 * trackRelK.P(); } + float deepangle2(const ROOT::Math::PtEtaPhiMVector candidate1, + const ROOT::Math::PtEtaPhiMVector candidate2) + { + double pt1, pt2, pz1, pz2, p1, p2, angle; + pt1 = candidate1.Pt(); + pt2 = candidate2.Pt(); + pz1 = candidate1.Pz(); + pz2 = candidate2.Pz(); + p1 = candidate1.P(); + p2 = candidate2.P(); + angle = TMath::ACos((pt1 * pt2 + pz1 * pz2) / (p1 * p2)); + return angle; + } + float deepangle(const TLorentzVector candidate1, const TLorentzVector candidate2) { @@ -367,6 +381,159 @@ struct doublephimeson { } } + void processopti(aod::RedPhiEvents::iterator const& collision, aod::PhiTracks const& phitracks) + { + std::vector exoticresonance, phiresonanced1, phiresonanced2; + std::vector d1trackid = {}; + std::vector d2trackid = {}; + std::vector d3trackid = {}; + std::vector d4trackid = {}; + if (additionalEvsel && (collision.numPos() < 2 || collision.numNeg() < 2)) { + return; + } + int phimult = 0; + + for (auto phitrackd1 : phitracks) { + if (phitrackd1.phiMass() < minPhiMass || phitrackd1.phiMass() > maxPhiMass) { + continue; + } + auto kaonplusd1pt = TMath::Sqrt(phitrackd1.phid1Px() * phitrackd1.phid1Px() + phitrackd1.phid1Py() * phitrackd1.phid1Py()); + auto kaonminusd1pt = TMath::Sqrt(phitrackd1.phid2Px() * phitrackd1.phid2Px() + phitrackd1.phid2Py() * phitrackd1.phid2Py()); + if (kaonplusd1pt > maxKaonPt) { + continue; + } + if (kaonminusd1pt > maxKaonPt) { + continue; + } + if (!selectionPID(phitrackd1.phid1TPC(), phitrackd1.phid1TOF(), phitrackd1.phid1TOFHit(), strategyPID1, kaonplusd1pt)) { + continue; + } + if (!selectionPID(phitrackd1.phid2TPC(), phitrackd1.phid2TOF(), phitrackd1.phid2TOFHit(), strategyPID1, kaonminusd1pt)) { + continue; + } + phimult = phimult + 1; + } + for (auto phitrackd1 : phitracks) { + if (phitrackd1.phiMass() < minPhiMass || phitrackd1.phiMass() > maxPhiMass) { + continue; + } + auto kaonplusd1pt = TMath::Sqrt(phitrackd1.phid1Px() * phitrackd1.phid1Px() + phitrackd1.phid1Py() * phitrackd1.phid1Py()); + auto kaonminusd1pt = TMath::Sqrt(phitrackd1.phid2Px() * phitrackd1.phid2Px() + phitrackd1.phid2Py() * phitrackd1.phid2Py()); + if (kaonplusd1pt > maxKaonPt) { + continue; + } + if (kaonminusd1pt > maxKaonPt) { + continue; + } + if (!selectionPID(phitrackd1.phid1TPC(), phitrackd1.phid1TOF(), phitrackd1.phid1TOFHit(), strategyPID1, kaonplusd1pt)) { + continue; + } + histos.fill(HIST("hnsigmaTPCTOFKaon"), phitrackd1.phid1TPC(), phitrackd1.phid1TOF(), kaonplusd1pt); + histos.fill(HIST("hnsigmaTPCKaonPlus"), phitrackd1.phid1TPC(), kaonplusd1pt); + if (!selectionPID(phitrackd1.phid2TPC(), phitrackd1.phid2TOF(), phitrackd1.phid2TOFHit(), strategyPID1, kaonminusd1pt)) { + continue; + } + histos.fill(HIST("hnsigmaTPCKaonMinus"), phitrackd1.phid2TPC(), kaonminusd1pt); + histos.fill(HIST("hPhiMass"), Phid1.M(), Phid1.Pt()); + auto phid1id = phitrackd1.index(); + Phid1.SetXYZM(phitrackd1.phiPx(), phitrackd1.phiPy(), phitrackd1.phiPz(), phitrackd1.phiMass()); + for (auto phitrackd2 : phitracks) { + auto phid2id = phitrackd2.index(); + if (phid2id <= phid1id) { + continue; + } + if (phitrackd2.phiMass() < minPhiMass || phitrackd2.phiMass() > maxPhiMass) { + continue; + } + auto kaonplusd2pt = TMath::Sqrt(phitrackd2.phid1Px() * phitrackd2.phid1Px() + phitrackd2.phid1Py() * phitrackd2.phid1Py()); + auto kaonminusd2pt = TMath::Sqrt(phitrackd2.phid2Px() * phitrackd2.phid2Px() + phitrackd2.phid2Py() * phitrackd2.phid2Py()); + if (kaonplusd2pt > maxKaonPt) { + continue; + } + if (kaonminusd2pt > maxKaonPt) { + continue; + } + if (!selectionPID(phitrackd2.phid1TPC(), phitrackd2.phid1TOF(), phitrackd2.phid1TOFHit(), strategyPID2, kaonplusd2pt)) { + continue; + } + if (!selectionPID(phitrackd2.phid2TPC(), phitrackd2.phid2TOF(), phitrackd2.phid2TOFHit(), strategyPID2, kaonminusd2pt)) { + continue; + } + if ((phitrackd1.phid1Index() == phitrackd2.phid1Index()) || (phitrackd1.phid2Index() == phitrackd2.phid2Index())) { + continue; + } + + Phid2.SetXYZM(phitrackd2.phiPx(), phitrackd2.phiPy(), phitrackd2.phiPz(), phitrackd2.phiMass()); + exotic = Phid1 + Phid2; + + if (exotic.M() < minExoticMass || exotic.M() > maxExoticMass) { + continue; + } + + ROOT::Math::PtEtaPhiMVector temp1(exotic.Pt(), exotic.Eta(), exotic.Phi(), exotic.M()); + ROOT::Math::PtEtaPhiMVector temp2(Phid1.Pt(), Phid1.Eta(), Phid1.Phi(), Phid1.M()); + ROOT::Math::PtEtaPhiMVector temp3(Phid2.Pt(), Phid2.Eta(), Phid2.Phi(), Phid2.M()); + exoticresonance.push_back(temp1); + phiresonanced1.push_back(temp2); + phiresonanced2.push_back(temp3); + d1trackid.push_back(phitrackd1.phid1Index()); + d2trackid.push_back(phitrackd2.phid1Index()); + d3trackid.push_back(phitrackd1.phid2Index()); + d4trackid.push_back(phitrackd2.phid2Index()); + } + } + if (exoticresonance.size() == 0) { + return; + } + // LOGF(info, "Total number of exotic: %d", exoticresonance.size()); + if (exoticresonance.size() == 2) { + for (auto if1 = exoticresonance.begin(); if1 != exoticresonance.end(); ++if1) { + auto i5 = std::distance(exoticresonance.begin(), if1); + auto exotic1phi1 = phiresonanced1.at(i5); + auto exotic1phi2 = phiresonanced2.at(i5); + auto exotic1 = exoticresonance.at(i5); + auto deltam1 = TMath::Sqrt(TMath::Power(exotic1phi1.M() - 1.0192, 2.0) + TMath::Power(exotic1phi2.M() - 1.0192, 2.0)); + auto deltaR1 = TMath::Sqrt(TMath::Power(exotic1phi1.Phi() - exotic1phi2.Phi(), 2.0) + TMath::Power(exotic1phi1.Eta() - exotic1phi2.Eta(), 2.0)); + for (auto if2 = if1 + 1; if2 != exoticresonance.end(); ++if2) { + auto i6 = std::distance(exoticresonance.begin(), if2); + auto exotic2phi1 = phiresonanced1.at(i6); + auto exotic2phi2 = phiresonanced2.at(i6); + auto exotic2 = exoticresonance.at(i6); + auto deltam2 = TMath::Sqrt(TMath::Power(exotic2phi1.M() - 1.0192, 2.0) + TMath::Power(exotic2phi2.M() - 1.0192, 2.0)); + auto deltaR2 = TMath::Sqrt(TMath::Power(exotic2phi1.Phi() - exotic2phi2.Phi(), 2.0) + TMath::Power(exotic2phi1.Eta() - exotic2phi2.Eta(), 2.0)); + // LOGF(info, "exotic 1 kaon ids %d , %d, %d, %d", d1trackid.at(i5), d2trackid.at(i5), d3trackid.at(i5), d4trackid.at(i5)); + // LOGF(info, "exotic 2 kaon ids %d , %d, %d, %d", d1trackid.at(i6), d2trackid.at(i6), d3trackid.at(i6), d4trackid.at(i6)); + if ((d1trackid.at(i5) == d1trackid.at(i6) || d1trackid.at(i5) == d2trackid.at(i6)) && + (d2trackid.at(i5) == d1trackid.at(i6) || d2trackid.at(i5) == d2trackid.at(i6)) && + (d3trackid.at(i5) == d3trackid.at(i6) || d3trackid.at(i5) == d4trackid.at(i6)) && + (d4trackid.at(i5) == d3trackid.at(i6) || d4trackid.at(i5) == d4trackid.at(i6))) { + // LOGF(info, "Find Pair %f %f", deltam2, deltam1); + if (deltam2 < deltam1) { + histos.fill(HIST("SEMassUnlike"), exotic2.M(), exotic2.Pt(), deltaR2, deepangle2(exotic2phi1, exotic2phi2), deltam2, exoticresonance.size()); + // LOGF(info, "Fill exotic Id %d which is pair of Id %d", i6, i5); + } else { + histos.fill(HIST("SEMassUnlike"), exotic1.M(), exotic1.Pt(), deltaR1, deepangle2(exotic1phi1, exotic1phi2), deltam1, exoticresonance.size()); + // LOGF(info, "Fill exotic Id %d which is pair of Id %d", i6, i5); + } + } else { + histos.fill(HIST("SEMassUnlike"), exotic1.M(), exotic1.Pt(), deltaR1, deepangle2(exotic1phi1, exotic1phi2), deltam1, exoticresonance.size()); + } + } + } + } else { + for (auto if1 = exoticresonance.begin(); if1 != exoticresonance.end(); ++if1) { + auto i5 = std::distance(exoticresonance.begin(), if1); + auto exotic1phi1 = phiresonanced1.at(i5); + auto exotic1phi2 = phiresonanced2.at(i5); + auto exotic1 = exoticresonance.at(i5); + auto deltam1 = TMath::Sqrt(TMath::Power(exotic1phi1.M() - 1.0192, 2.0) + TMath::Power(exotic1phi2.M() - 1.0192, 2.0)); + auto deltaR1 = TMath::Sqrt(TMath::Power(exotic1phi1.Phi() - exotic1phi2.Phi(), 2.0) + TMath::Power(exotic1phi1.Eta() - exotic1phi2.Eta(), 2.0)); + histos.fill(HIST("SEMassUnlike"), exotic1.M(), exotic1.Pt(), deltaR1, deepangle2(exotic1phi1, exotic1phi2), deltam1, exoticresonance.size()); + } + } + } + PROCESS_SWITCH(doublephimeson, processopti, "Process Optimized same event", false); + SliceCache cache; using BinningTypeVertexContributor = ColumnBinningPolicy; void processMixedEvent(aod::RedPhiEvents& collisions, aod::PhiTracks& phitracks) From c451137293c36c4cf0c73994913417938c7d9489 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Tue, 29 Apr 2025 21:04:19 +0200 Subject: [PATCH 1131/1650] [PWGHF] Implement the additional BDT model application on top of the trigger BDT used in the Lc selector (#11020) --- PWGHF/HFC/TableProducer/CMakeLists.txt | 2 +- .../HFC/TableProducer/femtoDreamProducer.cxx | 122 +++++++++++++----- 2 files changed, 89 insertions(+), 35 deletions(-) diff --git a/PWGHF/HFC/TableProducer/CMakeLists.txt b/PWGHF/HFC/TableProducer/CMakeLists.txt index 5d9a5d8d9a7..56b01bcd412 100644 --- a/PWGHF/HFC/TableProducer/CMakeLists.txt +++ b/PWGHF/HFC/TableProducer/CMakeLists.txt @@ -66,5 +66,5 @@ o2physics_add_dpl_workflow(correlator-lc-hadrons o2physics_add_dpl_workflow(femto-dream-producer SOURCES femtoDreamProducer.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::EventFilteringUtils + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::EventFilteringUtils O2Physics::MLCore COMPONENT_NAME Analysis) diff --git a/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx b/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx index 026d7d80992..4c2696b41d7 100644 --- a/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx +++ b/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx @@ -37,14 +37,17 @@ #include "PWGCF/FemtoDream/Core/femtoDreamUtils.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/HfMlResponseLcToPKPi.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/Utils/utilsBfieldCCDB.h" #include "PWGHF/Utils/utilsEvSelHf.h" #include "PWGHF/Core/CentralityEstimation.h" +#include "PWGHF/Core/SelectorCuts.h" using namespace o2; using namespace o2::framework; +using namespace o2::analysis; using namespace o2::framework::expressions; using namespace o2::analysis::femtoDream; using namespace o2::hf_evsel; @@ -60,6 +63,13 @@ enum Event : uint8_t { kPairSelected }; +// ml modes +enum MlMode : uint8_t { + kNoMl = 0, + kFillMlFromSelector, + kFillMlFromNewBDT +}; + struct HfFemtoDreamProducer { Produces outputCollision; @@ -82,6 +92,11 @@ struct HfFemtoDreamProducer { Configurable ccdbPathGrp{"ccdbPathGrp", "GLO/GRP/GRP", "Path of the grp file (Run 2)"}; Configurable ccdbPathGrpMag{"ccdbPathGrpMag", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object (Run 3)"}; + Configurable> modelPathsCCDB{"modelPathsCCDB", std::vector{"EventFiltering/PWGHF/BDTLc"}, "Paths of models on CCDB"}; + Configurable> onnxFileNames{"onnxFileNames", std::vector{"ModelHandler_onnx_LcToPKPi.onnx"}, "ONNX file names for each pT bin (if not from CCDB full path)"}; + Configurable timestampCCDB{"timestampCCDB", -1, "timestamp of the ONNX file for ML model used to query in CCDB"}; + Configurable loadModelsFromCCDB{"loadModelsFromCCDB", false, "Flag to enable or disable the loading of models from CCDB"}; + // Configurable isForceGRP{"isForceGRP", false, "Set true if the magnetic field configuration is not available in the usual CCDB directory (e.g. for Run 2 converted data or unanchorad Monte Carlo)"}; Configurable isDebug{"isDebug", true, "Enable Debug tables"}; @@ -108,7 +123,28 @@ struct HfFemtoDreamProducer { Configurable> trkTPCsCls{FemtoDreamTrackSelection::getSelectionName(femtoDreamTrackSelection::kTPCsClsMax, "trk"), std::vector{0.1f, 160.f}, FemtoDreamTrackSelection::getSelectionHelper(femtoDreamTrackSelection::kTPCsClsMax, "Track selection: ")}; Configurable> trkITSnclsIbMin{FemtoDreamTrackSelection::getSelectionName(femtoDreamTrackSelection::kITSnClsIbMin, "trk"), std::vector{-1.f, 1.f}, FemtoDreamTrackSelection::getSelectionHelper(femtoDreamTrackSelection::kITSnClsIbMin, "Track selection: ")}; Configurable> trkITSnclsMin{FemtoDreamTrackSelection::getSelectionName(femtoDreamTrackSelection::kITSnClsMin, "trk"), std::vector{-1.f, 2.f, 4.f}, FemtoDreamTrackSelection::getSelectionHelper(femtoDreamTrackSelection::kITSnClsMin, "Track selection: ")}; + // ML inference + Configurable applyMlMode{"applyMlMode", 1, "Occupancy estimation (None: 0, BDT model from Lc selector: 1, New BDT model on Top of Lc selector: 2)"}; + Configurable> binsPtMl{"binsPtMl", std::vector{hf_cuts_ml::vecBinsPt}, "pT bin limits for ML application"}; + Configurable> cutDirMl{"cutDirMl", std::vector{hf_cuts_ml::vecCutDir}, "Whether to reject score values greater or smaller than the threshold"}; + Configurable> cutsMl{"cutsMl", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; + Configurable nClassesMl{"nClassesMl", static_cast(hf_cuts_ml::NCutScores), "Number of classes in ML model"}; + Configurable> namesInputFeatures{"namesInputFeatures", std::vector{"feature1", "feature2"}, "Names of ML model input features"}; + + FemtoDreamTrackSelection trackCuts; + + HfHelper hfHelper; + o2::analysis::HfMlResponseLcToPKPi hfMlResponse; + std::vector outputMlPKPi = {}; + std::vector outputMlPiKP = {}; + o2::ccdb::CcdbApi ccdbApi; + o2::hf_evsel::HfEventSelection hfEvSel; + Service ccdb; /// Accessing the CCDB + o2::base::MatLayerCylSet* lut; + // if (doPvRefit){ lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get(ccdbPathLut));} //! may be it useful, will check later + float magField; + int runNumber; using CandidateLc = soa::Join; using CandidateLcMc = soa::Join; @@ -116,39 +152,27 @@ struct HfFemtoDreamProducer { using FemtoFullCollisionMc = soa::Join::iterator; using FemtoFullMcgenCollisions = soa::Join; using FemtoFullMcgenCollision = FemtoFullMcgenCollisions::iterator; - using FemtoHFTracks = soa::Join; + using FemtoHFTracks = soa::Join; using FemtoHFTrack = FemtoHFTracks::iterator; using FemtoHFMcTracks = soa::Join; using FemtoHFMcTrack = FemtoHFMcTracks::iterator; using GeneratedMc = soa::Filtered>; - FemtoDreamTrackSelection trackCuts; - Filter filterSelectCandidateLc = (aod::hf_sel_candidate_lc::isSelLcToPKPi >= selectionFlagLc || aod::hf_sel_candidate_lc::isSelLcToPiKP >= selectionFlagLc); HistogramRegistry qaRegistry{"QAHistos", {}, OutputObjHandlingPolicy::AnalysisObject}; - HistogramRegistry TrackRegistry{"Tracks", {}, OutputObjHandlingPolicy::AnalysisObject}; - - HfHelper hfHelper; - o2::hf_evsel::HfEventSelection hfEvSel; - - float magField; - int runNumber; - - Service ccdb; /// Accessing the CCDB - o2::base::MatLayerCylSet* lut; - // if (doPvRefit){ lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get(ccdbPathLut));} //! may be it useful, will check later + HistogramRegistry trackRegistry{"Tracks", {}, OutputObjHandlingPolicy::AnalysisObject}; void init(InitContext&) { - std::array processes = {doprocessDataCharmHad, doprocessMcCharmHad, doprocessDataCharmHadWithML, doprocessMcCharmHadWithML, doprocessMcCharmHadGen}; + std::array processes = {doprocessDataCharmHad, doprocessMcCharmHad, doprocessMcCharmHadGen}; if (std::accumulate(processes.begin(), processes.end(), 0) != 1) { LOGP(fatal, "One and only one process function must be enabled at a time."); } - int CutBits = 8 * sizeof(o2::aod::femtodreamparticle::cutContainerType); - TrackRegistry.add("AnalysisQA/CutCounter", "; Bit; Counter", kTH1F, {{CutBits + 1, -0.5, CutBits + 0.5}}); + int cutBits = 8 * sizeof(o2::aod::femtodreamparticle::cutContainerType); + trackRegistry.add("AnalysisQA/CutCounter", "; Bit; Counter", kTH1F, {{cutBits + 1, -0.5, cutBits + 0.5}}); // event QA histograms constexpr int kEventTypes = kPairSelected + 1; @@ -181,7 +205,7 @@ struct HfFemtoDreamProducer { trackCuts.setSelection(trkPIDnSigmaMax, femtoDreamTrackSelection::kPIDnSigmaMax, femtoDreamSelection::kAbsUpperLimit); trackCuts.setPIDSpecies(trkPIDspecies); trackCuts.setnSigmaPIDOffset(trkPIDnSigmaOffsetTPC, trkPIDnSigmaOffsetTOF); - trackCuts.init(&qaRegistry, &TrackRegistry); + trackCuts.init(&qaRegistry, &trackRegistry); runNumber = 0; magField = 0.0; @@ -194,6 +218,18 @@ struct HfFemtoDreamProducer { int64_t now = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); ccdb->setCreatedNotAfter(now); + + if (applyMlMode) { + hfMlResponse.configure(binsPtMl, cutsMl, cutDirMl, nClassesMl); + if (loadModelsFromCCDB) { + ccdbApi.init(ccdbUrl); + hfMlResponse.setModelPathsCCDB(onnxFileNames, ccdbApi, modelPathsCCDB, timestampCCDB); + } else { + hfMlResponse.setModelPathsLocal(onnxFileNames); + } + hfMlResponse.cacheInputFeaturesIndices(namesInputFeatures); + hfMlResponse.init(); + } } /// Function to retrieve the nominal magnetic field in kG (0.1T) and convert it directly to T @@ -314,7 +350,7 @@ struct HfFemtoDreamProducer { // std::vector tmpIDtrack; // this vector keeps track of the matching of the primary track table row <-> aod::track table global index bool fIsTrackFilled = false; - for (auto& track : tracks) { + for (const auto& track : tracks) { /// if the most open selection criteria are not fulfilled there is no /// point looking further at the track if (!trackCuts.isSelectedMinimal(track)) { @@ -395,27 +431,45 @@ struct HfFemtoDreamProducer { // Filling candidate properties rowCandCharmHad.reserve(sizeCand); bool isTrackFilled = false; + bool isSelectedMlLcToPKPi = true; + bool isSelectedMlLcToPiKP = true; for (const auto& candidate : candidates) { - std::array outputMlPKPi{-1., -1., -1.}; - std::array outputMlPiKP{-1., -1., -1.}; + + auto trackPos1 = candidate.template prong0_as(); // positive daughter (negative for the antiparticles) + auto trackNeg = candidate.template prong1_as(); // negative daughter (positive for the antiparticles) + auto trackPos2 = candidate.template prong2_as(); // positive daughter (negative for the antiparticles) + if constexpr (useCharmMl) { /// fill with ML information /// BDT index 0: bkg score; BDT index 1: prompt score; BDT index 2: non-prompt score - if (candidate.mlProbLcToPKPi().size() > 0) { - outputMlPKPi.at(0) = candidate.mlProbLcToPKPi()[0]; /// bkg score - outputMlPKPi.at(1) = candidate.mlProbLcToPKPi()[1]; /// prompt score - outputMlPKPi.at(2) = candidate.mlProbLcToPKPi()[2]; /// non-prompt score - } - if (candidate.mlProbLcToPiKP().size() > 0) { - outputMlPiKP.at(0) = candidate.mlProbLcToPiKP()[0]; /// bkg score - outputMlPiKP.at(1) = candidate.mlProbLcToPiKP()[1]; /// prompt score - outputMlPiKP.at(2) = candidate.mlProbLcToPiKP()[2]; /// non-prompt score + if (applyMlMode == kFillMlFromSelector) { + if (candidate.mlProbLcToPKPi().size() > 0) { + outputMlPKPi.at(0) = candidate.mlProbLcToPKPi()[0]; /// bkg score + outputMlPKPi.at(1) = candidate.mlProbLcToPKPi()[1]; /// prompt score + outputMlPKPi.at(2) = candidate.mlProbLcToPKPi()[2]; /// non-prompt score + } + if (candidate.mlProbLcToPiKP().size() > 0) { + outputMlPiKP.at(0) = candidate.mlProbLcToPiKP()[0]; /// bkg score + outputMlPiKP.at(1) = candidate.mlProbLcToPiKP()[1]; /// prompt score + outputMlPiKP.at(2) = candidate.mlProbLcToPiKP()[2]; /// non-prompt score + } + } else if (applyMlMode == kFillMlFromNewBDT) { + isSelectedMlLcToPKPi = false; + isSelectedMlLcToPiKP = false; + if (candidate.mlProbLcToPKPi().size() > 0) { + std::vector inputFeaturesLcToPKPi = hfMlResponse.getInputFeatures(candidate, trackPos1, trackNeg, trackPos2, true); + isSelectedMlLcToPKPi = hfMlResponse.isSelectedMl(inputFeaturesLcToPKPi, candidate.pt(), outputMlPKPi); + } + if (candidate.mlProbLcToPiKP().size() > 0) { + std::vector inputFeaturesLcToPiKP = hfMlResponse.getInputFeatures(candidate, trackPos1, trackNeg, trackPos2, false); + isSelectedMlLcToPiKP = hfMlResponse.isSelectedMl(inputFeaturesLcToPiKP, candidate.pt(), outputMlPKPi); + } + if (!isSelectedMlLcToPKPi && !isSelectedMlLcToPiKP) + continue; + } else { + LOGF(fatal, "Please check your Ml configuration!!"); } } - auto trackPos1 = candidate.template prong0_as(); // positive daughter (negative for the antiparticles) - auto trackNeg = candidate.template prong1_as(); // negative daughter (positive for the antiparticles) - auto trackPos2 = candidate.template prong2_as(); // positive daughter (negative for the antiparticles) - auto fillTable = [&](int CandFlag, int FunctionSelection, float BDTScoreBkg, From 79818788bee65c05c80838d0dfa0a410ffe826ea Mon Sep 17 00:00:00 2001 From: Nicolas Strangmann <77485327+nstrangm@users.noreply.github.com> Date: Tue, 29 Apr 2025 21:12:13 +0200 Subject: [PATCH 1132/1650] [PWGEM/PhotonMeson] Bug fixes for BC wise pi0 task (#11030) Co-authored-by: Nicolas Strangmann --- PWGEM/PhotonMeson/DataModel/bcWiseTables.h | 28 ++++++------ .../TableProducer/bcWiseClusterSkimmer.cxx | 43 ++++++++++++------- PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx | 38 ++++++++-------- 3 files changed, 61 insertions(+), 48 deletions(-) diff --git a/PWGEM/PhotonMeson/DataModel/bcWiseTables.h b/PWGEM/PhotonMeson/DataModel/bcWiseTables.h index 11c302e1fc7..903dfefa23d 100644 --- a/PWGEM/PhotonMeson/DataModel/bcWiseTables.h +++ b/PWGEM/PhotonMeson/DataModel/bcWiseTables.h @@ -79,7 +79,7 @@ DECLARE_SOA_COLUMN(StoredCentrality, storedCentrality, uint8_t); //! FT0M centra DECLARE_SOA_COLUMN(StoredZVtx, storedZVtx, int16_t); //! Z-vertex position (x1000) DECLARE_SOA_DYNAMIC_COLUMN(Centrality, centrality, [](uint8_t storedcentrality) -> float { return storedcentrality / emdownscaling::downscalingFactors[emdownscaling::kFT0MCent]; }); //! Centrality (0-100) -DECLARE_SOA_DYNAMIC_COLUMN(ZVtx, zVtx, [](uint8_t storedzvtx) -> float { return storedzvtx / emdownscaling::downscalingFactors[emdownscaling::kZVtx]; }); //! Centrality (0-100) +DECLARE_SOA_DYNAMIC_COLUMN(ZVtx, zVtx, [](int16_t storedzvtx) -> float { return storedzvtx / emdownscaling::downscalingFactors[emdownscaling::kZVtx]; }); //! Centrality (0-100) } // namespace bcwisecollision DECLARE_SOA_TABLE(BCWiseCollisions, "AOD", "BCWISECOLL", //! table of skimmed EMCal clusters o2::soa::Index<>, BCWiseBCId, bcwisecollision::StoredCentrality, bcwisecollision::StoredZVtx, @@ -87,21 +87,21 @@ DECLARE_SOA_TABLE(BCWiseCollisions, "AOD", "BCWISECOLL", //! table of skimmed EM namespace bcwisecluster { -DECLARE_SOA_COLUMN(StoredDefinition, storedDefinition, uint8_t); //! cluster definition, see EMCALClusterDefinition.h -DECLARE_SOA_COLUMN(StoredE, storedE, uint16_t); //! cluster energy (1 MeV -> Maximum cluster energy of ~65 GeV) -DECLARE_SOA_COLUMN(StoredEta, storedEta, int16_t); //! cluster pseudorapidity (x10,000) -DECLARE_SOA_COLUMN(StoredPhi, storedPhi, uint16_t); //! cluster azimuthal angle (x10 000) from 0 to 2pi -DECLARE_SOA_COLUMN(StoredNCells, storedNCells, uint8_t); //! number of cells in cluster -DECLARE_SOA_COLUMN(StoredM02, storedM02, uint16_t); //! shower shape long axis (x10 000) -DECLARE_SOA_COLUMN(StoredTime, storedTime, int16_t); //! cluster time (10 ps resolution) -DECLARE_SOA_COLUMN(StoredIsExotic, storedIsExotic, bool); //! flag to mark cluster as exotic - -DECLARE_SOA_DYNAMIC_COLUMN(Definition, definition, [](uint8_t storedDefinition) -> uint8_t { return storedDefinition; }); //! cluster definition, see EMCALClusterDefinition.h -DECLARE_SOA_DYNAMIC_COLUMN(E, e, [](uint16_t storedE) -> float { return storedE / emdownscaling::downscalingFactors[emdownscaling::kEnergy]; }); //! cluster energy (GeV) +DECLARE_SOA_COLUMN(StoredDefinition, storedDefinition, int8_t); //! cluster definition, see EMCALClusterDefinition.h +DECLARE_SOA_COLUMN(StoredE, storedE, int16_t); //! cluster energy (1 MeV -> Maximum cluster energy of ~32 GeV) +DECLARE_SOA_COLUMN(StoredEta, storedEta, int16_t); //! cluster pseudorapidity (x10,000) +DECLARE_SOA_COLUMN(StoredPhi, storedPhi, uint16_t); //! cluster azimuthal angle (x10 000) from 0 to 2pi +DECLARE_SOA_COLUMN(StoredNCells, storedNCells, int8_t); //! number of cells in cluster +DECLARE_SOA_COLUMN(StoredM02, storedM02, int16_t); //! shower shape long axis (x10 000) +DECLARE_SOA_COLUMN(StoredTime, storedTime, int16_t); //! cluster time (10 ps resolution) +DECLARE_SOA_COLUMN(StoredIsExotic, storedIsExotic, bool); //! flag to mark cluster as exotic + +DECLARE_SOA_DYNAMIC_COLUMN(Definition, definition, [](int8_t storedDefinition) -> int8_t { return storedDefinition; }); //! cluster definition, see EMCALClusterDefinition.h +DECLARE_SOA_DYNAMIC_COLUMN(E, e, [](int16_t storedE) -> float { return storedE / emdownscaling::downscalingFactors[emdownscaling::kEnergy]; }); //! cluster energy (GeV) DECLARE_SOA_DYNAMIC_COLUMN(Eta, eta, [](int16_t storedEta) -> float { return storedEta / emdownscaling::downscalingFactors[emdownscaling::kEta]; }); //! cluster pseudorapidity DECLARE_SOA_DYNAMIC_COLUMN(Phi, phi, [](uint16_t storedPhi) -> float { return storedPhi / emdownscaling::downscalingFactors[emdownscaling::kPhi]; }); //! cluster azimuthal angle (0 to 2pi) -DECLARE_SOA_DYNAMIC_COLUMN(NCells, nCells, [](uint16_t storedNCells) -> uint16_t { return storedNCells; }); //! number of cells in cluster -DECLARE_SOA_DYNAMIC_COLUMN(M02, m02, [](uint16_t storedM02) -> float { return storedM02 / emdownscaling::downscalingFactors[emdownscaling::kM02]; }); //! shower shape long axis +DECLARE_SOA_DYNAMIC_COLUMN(NCells, nCells, [](int16_t storedNCells) -> int16_t { return storedNCells; }); //! number of cells in cluster +DECLARE_SOA_DYNAMIC_COLUMN(M02, m02, [](int16_t storedM02) -> float { return storedM02 / emdownscaling::downscalingFactors[emdownscaling::kM02]; }); //! shower shape long axis DECLARE_SOA_DYNAMIC_COLUMN(Time, time, [](int16_t storedTime) -> float { return storedTime / emdownscaling::downscalingFactors[emdownscaling::kTime]; }); //! cluster time (ns) DECLARE_SOA_DYNAMIC_COLUMN(IsExotic, isExotic, [](bool storedIsExotic) -> bool { return storedIsExotic; }); //! flag to mark cluster as exotic diff --git a/PWGEM/PhotonMeson/TableProducer/bcWiseClusterSkimmer.cxx b/PWGEM/PhotonMeson/TableProducer/bcWiseClusterSkimmer.cxx index acfbc66053a..da9ee8543dc 100644 --- a/PWGEM/PhotonMeson/TableProducer/bcWiseClusterSkimmer.cxx +++ b/PWGEM/PhotonMeson/TableProducer/bcWiseClusterSkimmer.cxx @@ -35,6 +35,7 @@ using namespace o2; using namespace o2::aod::emdownscaling; using namespace o2::framework; +using namespace o2::framework::expressions; using MyCollisions = soa::Join; using MyMCCollisions = soa::Join; @@ -59,22 +60,23 @@ struct bcWiseClusterSkimmer { Preslice cellsPerBC = aod::calo::bcId; Configurable cfgMinClusterEnergy{"cfgMinClusterEnergy", 0.5, "Minimum energy of selected clusters (GeV)"}; + Configurable cfgMaxClusterEnergy{"cfgMaxClusterEnergy", 30., "Maximum energy of selected clusters (GeV)"}; Configurable cfgMinM02{"cfgMinM02", -1., "Minimum M02 of selected clusters"}; Configurable cfgMaxM02{"cfgMaxM02", 5., "Maximum M02 of selected clusters"}; Configurable cfgMinTime{"cfgMinTime", -25, "Minimum time of selected clusters (ns)"}; Configurable cfgMaxTime{"cfgMaxTime", 25, "Maximum time of selected clusters (ns)"}; Configurable cfgRapidityCut{"cfgRapidityCut", 0.8f, "Maximum absolute rapidity of counted generated particles"}; - // Configurable cfgMinPtGenPi0{"cfgMinPtGenPi0", 0., "Minimum pT for stored generated pi0s (reduce disk space of derived data)"}; + Configurable cfgMinPtGenPi0{"cfgMinPtGenPi0", 0., "Minimum pT for stored generated pi0s (reduce disk space of derived data)"}; Configurable cfgRequirekTVXinEMC{"cfgRequirekTVXinEMC", false, "Only store kTVXinEMC triggered BCs"}; Configurable cfgRequireGoodRCTQuality{"cfgRequireGoodRCTQuality", false, "Only store BCs with good quality of T0 and EMC in RCT"}; aod::rctsel::RCTFlagsChecker isFT0EMCGoodRCTChecker{aod::rctsel::kFT0Bad, aod::rctsel::kEMCBad}; - expressions::Filter energyFilter = aod::emcalcluster::energy > cfgMinClusterEnergy; - expressions::Filter m02Filter = (aod::emcalcluster::nCells == 1 || (aod::emcalcluster::m02 > cfgMinM02 && aod::emcalcluster::m02 < cfgMaxM02)); - expressions::Filter timeFilter = (aod::emcalcluster::time > cfgMinTime && aod::emcalcluster::time < cfgMaxTime); - expressions::Filter emccellfilter = aod::calo::caloType == 1; + Filter energyFilter = (aod::emcalcluster::energy > cfgMinClusterEnergy && aod::emcalcluster::energy < cfgMaxClusterEnergy); + Filter m02Filter = (aod::emcalcluster::nCells == 1 || (aod::emcalcluster::m02 > cfgMinM02 && aod::emcalcluster::m02 < cfgMaxM02)); + Filter timeFilter = (aod::emcalcluster::time > cfgMinTime && aod::emcalcluster::time < cfgMaxTime); + Filter emccellFilter = aod::calo::caloType == 1; HistogramRegistry mHistManager{"output", {}, OutputObjHandlingPolicy::AnalysisObject, false, false}; @@ -88,9 +90,13 @@ struct bcWiseClusterSkimmer { for (int iBin = 0; iBin < nEventBins; iBin++) mHistManager.get(HIST("nBCs"))->GetXaxis()->SetBinLabel(iBin + 1, binLabels[iBin]); + LOG(info) << "BC wise cluster skimmer cuts:"; + LOG(info) << "------------------------------------"; LOG(info) << "| Timing cut: " << cfgMinTime << " < t < " << cfgMaxTime; - LOG(info) << "| M02 cut: " << cfgMinM02 << " < M02 < " << cfgMaxM02; - LOG(info) << "| E cut: E > " << cfgMinClusterEnergy; + LOG(info) << "| Shape cut: " << cfgMinM02 << " < M02 < " << cfgMaxM02; + LOG(info) << "| Energy cut: " << cfgMinClusterEnergy << " < E < " << cfgMaxClusterEnergy; + LOG(info) << "| Rapidity cut: |y| < " << cfgRapidityCut; + LOG(info) << "| Min gen pi0 pt: pT > " << cfgMinPtGenPi0; o2::emcal::Geometry::GetInstanceFromRunNumber(300000); if (cfgRequireGoodRCTQuality) @@ -120,12 +126,12 @@ struct bcWiseClusterSkimmer { { for (const auto& cluster : clusters) { clusterTable(bcID, - convertForStorage(cluster.definition(), kDefinition), - convertForStorage(cluster.energy(), kEnergy), + convertForStorage(cluster.definition(), kDefinition), + convertForStorage(cluster.energy(), kEnergy), convertForStorage(cluster.eta(), kEta), convertForStorage(cluster.phi(), kPhi), - convertForStorage(cluster.nCells(), kNCells), - convertForStorage(cluster.m02(), kM02), + convertForStorage(cluster.nCells(), kNCells), + convertForStorage(cluster.m02(), kM02), convertForStorage(cluster.time(), kTime), cluster.isExotic()); } @@ -142,11 +148,18 @@ struct bcWiseClusterSkimmer { auto clusterInducer = mcParticles.iteratorAt(clusterInducerId); clusterInducerEnergy = clusterInducer.e(); int daughterId = aod::pwgem::photonmeson::utils::mcutil::FindMotherInChain(clusterInducer, mcParticles, std::vector{111}); - if (daughterId > 0) + if (daughterId > 0) { pi0MCIndex = mcParticles.iteratorAt(daughterId).mothersIds()[0]; + if (mcParticles.iteratorAt(pi0MCIndex).pt() < cfgMinPtGenPi0) + pi0MCIndex = -1; + } + } + if (pi0MCIndex >= 0) { + if (fMapPi0Index.find(pi0MCIndex) != fMapPi0Index.end()) // Some pi0s might not be found (not gg decay or too large y) + pi0MCIndex = fMapPi0Index[pi0MCIndex]; // If pi0 was stored in table, change index from the MC index to the pi0 index from this task + else // If pi0 was not stored, treat photon as if not from pi0 + pi0MCIndex = -1; } - if (pi0MCIndex > 0) - pi0MCIndex = fMapPi0Index[pi0MCIndex]; mcclusterTable(bcID, pi0MCIndex, convertForStorage(clusterInducerEnergy, kEnergy)); } } @@ -260,7 +273,7 @@ struct bcWiseClusterSkimmer { for (const auto& mcCollision : mcCollisionsBC) { auto mcParticlesInColl = mcParticles.sliceBy(perMcCollision, mcCollision.globalIndex()); for (const auto& mcParticle : mcParticlesInColl) { - if (mcParticle.pdgCode() != 111 || std::abs(mcParticle.y()) > cfgRapidityCut || !isGammaGammaDecay(mcParticle, mcParticles)) + if (mcParticle.pdgCode() != 111 || std::abs(mcParticle.y()) > cfgRapidityCut || !isGammaGammaDecay(mcParticle, mcParticles) || mcParticle.pt() < cfgMinPtGenPi0) continue; bool isPrimary = mcParticle.isPhysicalPrimary() || mcParticle.producedByGenerator(); bool isFromWD = (aod::pwgem::photonmeson::utils::mcutil::IsFromWD(mcCollision, mcParticle, mcParticles)) > 0; diff --git a/PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx b/PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx index 8c2b92e4900..2aa8bd44889 100644 --- a/PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx +++ b/PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx @@ -45,12 +45,12 @@ struct EmcalBcWisePi0 { Configurable cfgRequirekTVXinEMC{"cfgRequirekTVXinEMC", true, "Reconstruct pi0s only in kTVXinEMC triggered BCs"}; Configurable cfgSelectOnlyUniqueAmbiguous{"cfgSelectOnlyUniqueAmbiguous", 0, "0: all clusters, 1: only unique clusters, 2: only ambiguous clusters"}; - Configurable cfgClusterDefinition{"cfgClusterDefinition", 10, "Clusterizer to be selected, e.g. 13 for kV3MostSplitLowSeed"}; - Configurable cfgMinClusterEnergy{"cfgMinClusterEnergy", 0.7, "Minimum energy of selected clusters (GeV)"}; - Configurable cfgMinM02{"cfgMinM02", 0.1, "Minimum M02 of selected clusters"}; - Configurable cfgMaxM02{"cfgMaxM02", 0.7, "Maximum M02 of selected clusters"}; - Configurable cfgMinTime{"cfgMinTime", -15, "Minimum time of selected clusters (ns)"}; - Configurable cfgMaxTime{"cfgMaxTime", 15, "Maximum time of selected clusters (ns)"}; + Configurable cfgClusterDefinition{"cfgClusterDefinition", 13, "Clusterizer to be selected, e.g. 13 for kV3MostSplitLowSeed"}; + Configurable cfgMinClusterEnergy{"cfgMinClusterEnergy", 700, "Minimum energy of selected clusters (MeV)"}; + Configurable cfgMinM02{"cfgMinM02", 1000, "Minimum M02 of selected clusters (x1000)"}; + Configurable cfgMaxM02{"cfgMaxM02", 7000, "Maximum M02 of selected clusters (x1000)"}; + Configurable cfgMinTime{"cfgMinTime", -1500, "Minimum time of selected clusters (10 ps)"}; + Configurable cfgMaxTime{"cfgMaxTime", 1500, "Maximum time of selected clusters (10 ps)"}; Configurable cfgRapidityCut{"cfgRapidityCut", 0.8f, "Maximum absolute rapidity of counted particles"}; Configurable cfgMinOpenAngle{"cfgMinOpenAngle", 0.0202, "Minimum opening angle between photons"}; Configurable cfgDistanceToEdge{"cfgDistanceToEdge", 1, "Distance to edge in cells required for rotated cluster to be accepted"}; @@ -61,10 +61,10 @@ struct EmcalBcWisePi0 { Configurable cfgIsMC{"cfgIsMC", false, "Flag to indicate if the task is running on MC data and should fill MC histograms"}; - Filter clusterDefinitionFilter = aod::bcwisecluster::storedDefinition == static_cast(cfgClusterDefinition); - Filter energyFilter = aod::bcwisecluster::storedE > static_cast(cfgMinClusterEnergy* aod::emdownscaling::downscalingFactors[aod::emdownscaling::kEnergy]); - Filter m02Filter = (aod::bcwisecluster::storedNCells == static_cast(1) || (aod::bcwisecluster::storedM02 > static_cast(cfgMinM02 * aod::emdownscaling::downscalingFactors[aod::emdownscaling::kM02]) && aod::bcwisecluster::storedM02 < static_cast(cfgMaxM02 * aod::emdownscaling::downscalingFactors[aod::emdownscaling::kM02]))); - Filter timeFilter = (aod::bcwisecluster::storedTime > static_cast(cfgMinTime * aod::emdownscaling::downscalingFactors[aod::emdownscaling::kTime]) && aod::bcwisecluster::storedTime < static_cast(cfgMaxTime * aod::emdownscaling::downscalingFactors[aod::emdownscaling::kTime])); + Filter clusterDefinitionFilter = aod::bcwisecluster::storedDefinition == cfgClusterDefinition; + Filter energyFilter = aod::bcwisecluster::storedE > cfgMinClusterEnergy; + Filter m02Filter = (aod::bcwisecluster::storedNCells == 1 || (aod::bcwisecluster::storedM02 > cfgMinM02 && aod::bcwisecluster::storedM02 < cfgMaxM02)); + Filter timeFilter = (aod::bcwisecluster::storedTime > cfgMinTime && aod::bcwisecluster::storedTime < cfgMaxTime); emcal::Geometry* emcalGeom; @@ -91,8 +91,8 @@ struct EmcalBcWisePi0 { mHistManager.add("Cluster/Exotic", "Is cluster exotic?;#bf{Exotic?};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{2, -0.5, 1.5}}); mHistManager.add("Cluster/EtaPhi", "Eta/Phi distribution of clusters;#eta;#phi", HistType::kTH2F, {{400, -0.8, 0.8}, {400, 0, constants::math::TwoPI}}); - mHistManager.add("invMassVsPt", "Invariant mass and pT of meson candidates", HistType::kTH2F, {{200, 0., 0.4}, {200, 0., 20.}}); - mHistManager.add("invMassVsPtBackground", "Invariant mass and pT of background meson candidates", HistType::kTH2F, {{200, 0., 0.4}, {200, 0., 20.}}); + mHistManager.add("GG/invMassVsPt", "Invariant mass and pT of meson candidates;#bf{#it{M}^{#gamma#gamma} (GeV/#it{c}^{2})};#bf{#it{p}_{T}^{#gamma#gamma} (GeV/#it{c})}", HistType::kTH2F, {{200, 0., 0.4}, {200, 0., 20.}}); + mHistManager.add("GG/invMassVsPtBackground", "Invariant mass and pT of background meson candidates;#bf{#it{M}^{#gamma#gamma} (GeV/#it{c}^{2})};#bf{#it{p}_{T}^{#gamma#gamma} (GeV/#it{c})}", HistType::kTH2F, {{200, 0., 0.4}, {200, 0., 20.}}); if (cfgIsMC) { mHistManager.add("True/clusterERecVsETrue", "True vs reconstructed energy of cluster inducing particle;#bf{#it{E}_{rec} (GeV)};#bf{#it{E}_{true}^{cls inducing part} (GeV)}", HistType::kTH2F, {{200, 0, 20}, {200, 0, 20}}); @@ -151,7 +151,7 @@ struct EmcalBcWisePi0 { mHistManager.fill(HIST("Event/nCollPerBC"), collisions.size()); if (collisions.size() == 2) { mHistManager.fill(HIST("Event/Z1VsZ2"), collisions.iteratorAt(0).zVtx(), collisions.iteratorAt(1).zVtx()); - mHistManager.fill(HIST("Event/dZ"), std::abs(collisions.iteratorAt(0).zVtx() - collisions.iteratorAt(1).zVtx())); + mHistManager.fill(HIST("Event/dZ"), collisions.iteratorAt(0).zVtx() - collisions.iteratorAt(1).zVtx()); } } @@ -180,7 +180,7 @@ struct EmcalBcWisePi0 { if (openingAngle12 < cfgMinOpenAngle) continue; - mHistManager.fill(HIST("invMassVsPt"), v12.M(), v12.Pt()); + mHistManager.fill(HIST("GG/invMassVsPt"), v12.M(), v12.Pt()); if (clusters.size() < 3) continue; @@ -216,7 +216,7 @@ struct EmcalBcWisePi0 { ROOT::Math::PtEtaPhiMVector vBG = v3 + vi; - mHistManager.fill(HIST("invMassVsPtBackground"), vBG.M(), vBG.Pt()); + mHistManager.fill(HIST("GG/invMassVsPtBackground"), vBG.M(), vBG.Pt()); } } } @@ -237,8 +237,7 @@ struct EmcalBcWisePi0 { if (openingAngle12 < cfgMinOpenAngle) continue; - int g1Pi0ID = g1.pi0ID() - mcPi0s.iteratorAt(0).globalIndex(); - const auto& mcPi0 = mcPi0s.iteratorAt(g1Pi0ID); + const auto& mcPi0 = mcPi0s.iteratorAt(g1.pi0ID() - mcPi0s.offset()); mHistManager.fill(HIST("True/PtRecVsPtTrue"), v12.Pt(), mcPi0.pt()); @@ -300,6 +299,9 @@ struct EmcalBcWisePi0 { LOG(fatal) << "MC processing is not enabled, but the task is running on MC data. Please set cfgIsMC to true."; return; } + + fillGeneratedPi0Hists(mcPi0s, bc); // Fill before BC selection to also store pi0s in BCs that were not triggered + if (!isBCSelected(bc, collisions)) return; @@ -307,8 +309,6 @@ struct EmcalBcWisePi0 { mHistManager.fill(HIST("True/clusterERecVsETrue"), cluster.e(), cluster.trueE()); reconstructTrueMesons(clusters, mcPi0s); - - fillGeneratedPi0Hists(mcPi0s, bc); } PROCESS_SWITCH(EmcalBcWisePi0, processMCInfo, "Run true and gen", false); }; From bf3fa5660e0869277a632ded1dd44f0c6906aea3 Mon Sep 17 00:00:00 2001 From: JimunLee Date: Wed, 30 Apr 2025 08:21:09 +0900 Subject: [PATCH 1133/1650] [PWGJE] [PWGJE]:Added switch options (#11014) Co-authored-by: jimun_lee --- PWGJE/Tasks/phiInJets.cxx | 201 +++++++++++++++++++++----------------- 1 file changed, 114 insertions(+), 87 deletions(-) diff --git a/PWGJE/Tasks/phiInJets.cxx b/PWGJE/Tasks/phiInJets.cxx index be99a57a576..e405af191c8 100644 --- a/PWGJE/Tasks/phiInJets.cxx +++ b/PWGJE/Tasks/phiInJets.cxx @@ -84,6 +84,10 @@ struct phiInJets { Configurable cfgMCRecMBHists{"cfgMCRecMBHists", false, "Enables MCRec MB Hists"}; Configurable cfgMCRecInsideHists{"cfgMCRecInsideHists", false, "Enables MCRec Inside Hists"}; Configurable cfgMCRecRotationalHists{"cfgMCRecRotationalHists", false, "Enables MCRotational Hists"}; + Configurable cfgPIDQAHists{"cfgPIDQAHists", false, "Enables PIDQA Hists"}; + Configurable cfgDaughterQAHists{"cfgDaughterQAHists", false, "Enables DaughterQA Hists"}; + Configurable cfgJetQAHists{"cfgJetQAHists", false, "Enables JetQA Hists"}; + Configurable cfgMCGenHists{"cfgMCGenHists", false, "Enables MCGenHists"}; Configurable cfgMCGenMATCHEDHists{"cfgMCGenMATCHEDHists", false, "Enables MCGenMATCHEDHists"}; Configurable cfgMCRecMATCHEDHists{"cfgMCRecMATCHEDHists", false, "Enables MCRecMATCHEDHists"}; @@ -152,25 +156,27 @@ struct phiInJets { if (cfgMCRecHists) { JEhistos.add("nEvents_MCRec", "nEvents_MCRec", kTH1F, {{4, 0.0, 4.0}}); + if (cfgJetQAHists) { + JEhistos.add("h_jet_pt", "jet pT;#it{p}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {{4000, 0., 200.}}}); + JEhistos.add("h_jet_eta", "jet #eta;#eta_{jet};entries", {HistType::kTH1F, {{100, -1.0, 1.0}}}); + JEhistos.add("h_jet_phi", "jet #phi;#phi_{jet};entries", {HistType::kTH1F, {{80, -1.0, 7.}}}); + } + if (cfgPIDQAHists) { + JEhistos.add("ptJEHistogramPion", "ptJEHistogramPion", kTH1F, {PtAxis}); + JEhistos.add("ptJEHistogramKaon", "ptJEHistogramKaon", kTH1F, {PtAxis}); + JEhistos.add("ptJEHistogramProton", "ptJEHistogramProton", kTH1F, {PtAxis}); + JEhistos.add("ptJEHistogramPhi", "ptJEHistogramPhi", kTH1F, {PtAxis}); + JEhistos.add("ptJEHistogramPhi_JetTrigger", "ptJEHistogramPhi_JetTrigger", kTH1F, {PtAxis}); + } - JEhistos.add("h_jet_pt", "jet pT;#it{p}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {{4000, 0., 200.}}}); - JEhistos.add("h_jet_eta", "jet #eta;#eta_{jet};entries", {HistType::kTH1F, {{100, -1.0, 1.0}}}); - JEhistos.add("h_jet_phi", "jet #phi;#phi_{jet};entries", {HistType::kTH1F, {{80, -1.0, 7.}}}); - - JEhistos.add("ptJEHistogramPion", "ptJEHistogramPion", kTH1F, {PtAxis}); - JEhistos.add("ptJEHistogramKaon", "ptJEHistogramKaon", kTH1F, {PtAxis}); - JEhistos.add("ptJEHistogramProton", "ptJEHistogramProton", kTH1F, {PtAxis}); - JEhistos.add("ptJEHistogramPhi", "ptJEHistogramPhi", kTH1F, {PtAxis}); - JEhistos.add("ptJEHistogramPhi_JetTrigger", "ptJEHistogramPhi_JetTrigger", kTH1F, {PtAxis}); - JEhistos.add("minvJEHistogramPhi", "minvJEHistogramPhi", kTH1F, {MinvAxis}); - JEhistos.add("hNRealPhiVPhiCand", "hNRealPhiVPhiCand", kTH2F, {{10, 0, 10}, {10, 0, 10}}); - JEhistos.add("hNRealPhiWithJetVPhiCand", "hNRealPhiWithJetVPhiCand", kTH2F, {{10, 0, 10}, {10, 0, 10}}); - JEhistos.add("hNRealPhiInJetVPhiCand", "hNRealPhiInJetVPhiCand", kTH2F, {{10, 0, 10}, {10, 0, 10}}); - - JEhistos.add("hMCRec_nonmatch_hUSS_KtoKangle_v_pt", "hMCRec_nonmatch_hUSS_KtoKangle_v_pt", kTH2F, {axisEta, PtAxis}); - JEhistos.add("hMCRec_nonmatch_hUSS_Kangle_v_pt", "hMCRec_nonmatch_hUSS_Kangle_v_pt", kTH2F, {axisEta, PtAxis}); - JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE_pt_v_eta", "hMCRec_nonmatch_hUSS_INSIDE_pt_v_eta", kTH2F, {PtAxis, axisEta}); - JEhistos.add("JetVsPhi_REC", "JetVsPhi_REC", kTH2F, {{4000, 0., 200.}, {200, 0, 20.0}}); + if (cfgDaughterQAHists) { + JEhistos.add("hNRealPhiVPhiCand", "hNRealPhiVPhiCand", kTH2F, {{10, 0, 10}, {10, 0, 10}}); + JEhistos.add("hNRealPhiWithJetVPhiCand", "hNRealPhiWithJetVPhiCand", kTH2F, {{10, 0, 10}, {10, 0, 10}}); + JEhistos.add("hNRealPhiInJetVPhiCand", "hNRealPhiInJetVPhiCand", kTH2F, {{10, 0, 10}, {10, 0, 10}}); + JEhistos.add("hMCRec_nonmatch_hUSS_KtoKangle_v_pt", "hMCRec_nonmatch_hUSS_KtoKangle_v_pt", kTH2F, {axisEta, PtAxis}); + JEhistos.add("hMCRec_nonmatch_hUSS_Kangle_v_pt", "hMCRec_nonmatch_hUSS_Kangle_v_pt", kTH2F, {axisEta, PtAxis}); + JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE_pt_v_eta", "hMCRec_nonmatch_hUSS_INSIDE_pt_v_eta", kTH2F, {PtAxis, axisEta}); + } // used for Minv closure tests // MB @@ -178,30 +184,30 @@ struct phiInJets { JEhistos.add("hMCRec_hUSS", "hMCRec_hUSS", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); JEhistos.add("hMCRec_hLSS", "hMCRec_hLSS", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); JEhistos.add("hMCRecTrue_hUSS", "hMCRecTrue_hUSS", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); - JEhistos.add("hMCRecTrue_hLSS", "hMCRecTrue_hLSS", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); JEhistos.add("hMCRec_R_distribution", "hMCRec_R_distribution", kTH1F, {{100, 0.0, 2 * TMath::Pi()}}); JEhistos.add("hMCRec_dPhi_distribution", "hMCRec_dPhi_distribution", kTH1F, {{80, -5.0, 7.0}}); JEhistos.add("hMCRec_dEta_distribution", "hMCRec_dEta_distribution", kTH1F, {{100, -2.0, 2.0}}); + + if (cfgMCRecRotationalHists) { + JEhistos.add("hMCRec_hUSS_Rotational", "hMCRec_hUSS_Rotational", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRec_R_Rotation_distribution", "hMCRec_R_Rotation_distribution", HistType::kTH1F, {{100, 0.0, 2 * TMath::Pi()}}); + JEhistos.add("hMCRec_dPhi_rot_distribution", "hMCRec_dPhi_rot_distribution", kTH1F, {{80, -5.0, 7.0}}); + JEhistos.add("hMCRec_dEta_rot_distribution", "hMCRec_dEta_rot_distribution", kTH1F, {{100, -2.0, 2.0}}); + JEhistos.add("hMCRec_dEta_qa_rot_distribution", "hMCRec_dEta_qa_rot_distribution", kTH1F, {{100, -4.0, 2.0}}); + } } - if (cfgMCRecRotationalHists) { - JEhistos.add("hMCRec_hUSS_Rotational", "hMCRec_hUSS_Rotational", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); - JEhistos.add("hMCRec_R_Rotation_distribution", "hMCRec_R_Rotation_distribution", HistType::kTH1F, {{100, 0.0, 2 * TMath::Pi()}}); - JEhistos.add("hMCRec_dPhi_rot_distribution", "hMCRec_dPhi_rot_distribution", kTH1F, {{80, -5.0, 7.0}}); - JEhistos.add("hMCRec_dEta_rot_distribution", "hMCRec_dEta_rot_distribution", kTH1F, {{100, -2.0, 2.0}}); - JEhistos.add("hMCRec_dEta_qa_rot_distribution", "hMCRec_dEta_qa_rot_distribution", kTH1F, {{100, -4.0, 2.0}}); + // INSIDE + if (cfgMCRecInsideHists) { + JEhistos.add("hMCRec_hUSS_INSIDE", "hMCRec_hUSS_INSIDE", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRec_hLSS_INSIDE", "hMCRec_hLSS_INSIDE", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRecTrue_hUSS_INSIDE", "hMCRecTrue_hUSS_INSIDE", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE", "hMCRec_nonmatch_hUSS_INSIDE", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE_1D", "hMCRec_nonmatch_hUSS_INSIDE_1D", kTH1F, {MinvAxis}); + JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE_1D_2_3", "hMCRec_nonmatch_hUSS_INSIDE_1D_2_3", kTH1F, {MinvAxis}); + JEhistos.add("JetVsPhi_REC", "JetVsPhi_REC", kTH2F, {{4000, 0., 200.}, {200, 0, 20.0}}); + JEhistos.add("minvJEHistogramPhi", "minvJEHistogramPhi", kTH1F, {MinvAxis}); } } - // INSIDE - if (cfgMCRecInsideHists) { - JEhistos.add("hMCRec_hUSS_INSIDE", "hMCRec_hUSS_INSIDE", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); - JEhistos.add("hMCRec_hLSS_INSIDE", "hMCRec_hLSS_INSIDE", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); - JEhistos.add("hMCRecTrue_hUSS_INSIDE", "hMCRecTrue_hUSS_INSIDE", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); - JEhistos.add("hMCRecTrue_hLSS_INSIDE", "hMCRecTrue_hLSS_INSIDE", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); - JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE", "hMCRec_nonmatch_hUSS_INSIDE", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); - JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE_1D", "hMCRec_nonmatch_hUSS_INSIDE_1D", kTH1F, {MinvAxis}); - JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE_1D_2_3", "hMCRec_nonmatch_hUSS_INSIDE_1D_2_3", kTH1F, {MinvAxis}); - } - if (cfgMCGenHists) { JEhistos.add("nEvents_MCGen", "nEvents_MCGen", kTH1F, {{4, 0.0, 4.0}}); @@ -667,9 +673,11 @@ struct phiInJets { mcd_pt.push_back(mcdjet.pt()); mcd_eta.push_back(mcdjet.eta()); mcd_phi.push_back(mcdjet.phi()); - JEhistos.fill(HIST("h_jet_pt"), mcdjet.pt()); - JEhistos.fill(HIST("h_jet_eta"), mcdjet.eta()); - JEhistos.fill(HIST("h_jet_phi"), mcdjet.phi()); + if (cfgJetQAHists) { + JEhistos.fill(HIST("h_jet_pt"), mcdjet.pt()); + JEhistos.fill(HIST("h_jet_eta"), mcdjet.eta()); + JEhistos.fill(HIST("h_jet_phi"), mcdjet.phi()); + } } if (hasJets) JEhistos.fill(HIST("nEvents_MCRec"), 2.5); @@ -690,14 +698,15 @@ struct phiInJets { if (track.has_mcParticle()) { auto mcParticle = track.mcParticle(); - - if (mcParticle.isPhysicalPrimary() && fabs(mcParticle.eta()) <= cfgtrkMaxEta) { - if (abs(mcParticle.pdgCode()) == 211) - JEhistos.fill(HIST("ptJEHistogramPion"), mcParticle.pt()); - if (abs(mcParticle.pdgCode()) == 321) - JEhistos.fill(HIST("ptJEHistogramKaon"), mcParticle.pt()); - if (abs(mcParticle.pdgCode()) == 2212) - JEhistos.fill(HIST("ptJEHistogramProton"), mcParticle.pt()); + if (cfgPIDQAHists) { + if (mcParticle.isPhysicalPrimary() && fabs(mcParticle.eta()) <= cfgtrkMaxEta) { + if (abs(mcParticle.pdgCode()) == 211) + JEhistos.fill(HIST("ptJEHistogramPion"), mcParticle.pt()); + if (abs(mcParticle.pdgCode()) == 321) + JEhistos.fill(HIST("ptJEHistogramKaon"), mcParticle.pt()); + if (abs(mcParticle.pdgCode()) == 2212) + JEhistos.fill(HIST("ptJEHistogramProton"), mcParticle.pt()); + } } } for (const auto& track2 : tracks) { @@ -719,9 +728,10 @@ struct phiInJets { double dPhi = TVector2::Phi_mpi_pi(originalTrack.phi() - originalTrack2.phi()); double dEta = originalTrack.eta() - originalTrack2.eta(); - JEhistos.fill(HIST("hMCRec_dPhi_distribution"), dPhi); - JEhistos.fill(HIST("hMCRec_dEta_distribution"), dEta); - + if (cfgMCRecMBHists) { + JEhistos.fill(HIST("hMCRec_dPhi_distribution"), dPhi); + JEhistos.fill(HIST("hMCRec_dEta_distribution"), dEta); + } double dR = TMath::Sqrt(dPhi * dPhi + dEta * dEta); double dR_rot = 0; TLorentzVector lDecayDaughter1, lDecayDaughter2, lResonance, lRotationalTrack, lRotationalResonance; @@ -760,11 +770,13 @@ struct phiInJets { double dEta_rot_qa = TMath::Abs(lDecayDaughter2.Eta()) - TMath::Abs(lRotationalTrack.Eta()); dR_rot = TMath::Sqrt(dPhi_rot * dPhi_rot + dEta_rot * dEta_rot); - - JEhistos.fill(HIST("hMCRec_dPhi_rot_distribution"), dPhi_rot); - JEhistos.fill(HIST("hMCRec_dEta_rot_distribution"), dEta_rot); - JEhistos.fill(HIST("hMCRec_dEta_qa_rot_distribution"), dEta_rot_qa); + if (cfgMCRecRotationalHists) { + JEhistos.fill(HIST("hMCRec_dPhi_rot_distribution"), dPhi_rot); + JEhistos.fill(HIST("hMCRec_dEta_rot_distribution"), dEta_rot); + JEhistos.fill(HIST("hMCRec_dEta_qa_rot_distribution"), dEta_rot_qa); + } } + //----------------------------------------------------------------------- lResonance = lDecayDaughter1 + lDecayDaughter2; if (cfgIsKstar) @@ -772,9 +784,10 @@ struct phiInJets { if (fabs(lResonance.Eta()) > cfgtrkMaxEta) continue; - if (lResonance.M() > 1.005 && lResonance.M() < 1.035) - PhiCand++; - + if (cfgDaughterQAHists) { + if (lResonance.M() > 1.005 && lResonance.M() < 1.035) + PhiCand++; + } //================== // 1.MB REC Closure //================== @@ -802,9 +815,11 @@ struct phiInJets { double jetpt = 0; for (std::size_t i = 0; i < mcd_pt.size(); i++) { - if (i == 0) { - if (lResonance.M() > 1.005 && lResonance.M() < 1.035) { - RealPhiCandWithJet++; + if (cfgDaughterQAHists) { + if (i == 0) { + if (lResonance.M() > 1.005 && lResonance.M() < 1.035) { + RealPhiCandWithJet++; + } } } double phidiff = TVector2::Phi_mpi_pi(mcd_phi[i] - lResonance.Phi()); @@ -818,7 +833,7 @@ struct phiInJets { double phidiff_K2 = TVector2::Phi_mpi_pi(mcd_phi[i] - lDecayDaughter2.Phi()); double etadiff_K2 = mcd_eta[i] - lDecayDaughter2.Eta(); double R_K2 = TMath::Sqrt((etadiff_K2 * etadiff_K2) + (phidiff_K2 * phidiff_K2)); - if (R < cfgjetR) { + if (cfgDaughterQAHists && R < cfgjetR) { JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_Kangle_v_pt"), R_K1, lResonance.Pt()); JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_Kangle_v_pt"), R_K2, lResonance.Pt()); } @@ -888,20 +903,22 @@ struct phiInJets { if (mothers1[0] != mothers2[0]) continue; // Kaons not from the same phi - double phidiff_Kaons = TVector2::Phi_mpi_pi(lDecayDaughter2.Phi() - lDecayDaughter1.Phi()); - double etadiff_Kaons = lDecayDaughter2.Eta() - lDecayDaughter1.Eta(); - double R_Kaons = TMath::Sqrt((etadiff_Kaons * etadiff_Kaons) + (phidiff_Kaons * phidiff_Kaons)); - JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_KtoKangle_v_pt"), R_Kaons, lResonance.Pt()); - JEhistos.fill(HIST("ptJEHistogramPhi"), lResonance.Pt()); + if (cfgDaughterQAHists) { + double phidiff_Kaons = TVector2::Phi_mpi_pi(lDecayDaughter2.Phi() - lDecayDaughter1.Phi()); + double etadiff_Kaons = lDecayDaughter2.Eta() - lDecayDaughter1.Eta(); + double R_Kaons = TMath::Sqrt((etadiff_Kaons * etadiff_Kaons) + (phidiff_Kaons * phidiff_Kaons)); + JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_KtoKangle_v_pt"), R_Kaons, lResonance.Pt()); + } + if (cfgPIDQAHists) { + JEhistos.fill(HIST("ptJEHistogramPhi"), lResonance.Pt()); + } //===================== // 4.MB True Closure //===================== if (cfgMCRecMBHists) { if (originalTrack.sign() * originalTrack2.sign() < 0) { JEhistos.fill(HIST("hMCRecTrue_hUSS"), 1.0, lResonance.Pt(), lResonance.M()); - } else if (originalTrack.sign() * originalTrack2.sign() > 0) { - JEhistos.fill(HIST("hMCRecTrue_hLSS"), 1.0, lResonance.Pt(), lResonance.M()); } } //=========================== @@ -911,14 +928,13 @@ struct phiInJets { if (jetFlag) { if (originalTrack.sign() * originalTrack2.sign() < 0) { JEhistos.fill(HIST("hMCRecTrue_hUSS_INSIDE"), 1.0, lResonance.Pt(), lResonance.M()); - } else if (originalTrack.sign() * originalTrack2.sign() > 0) { - JEhistos.fill(HIST("hMCRecTrue_hLSS_INSIDE"), 1.0, lResonance.Pt(), lResonance.M()); } } } - if (lResonance.M() > 1.005 && lResonance.M() < 1.035) - RealPhiCand++; - + if (cfgDaughterQAHists) { + if (lResonance.M() > 1.005 && lResonance.M() < 1.035) + RealPhiCand++; + } // Now we do jets if (cfgMCRecInsideHists) { if (cfgSingleJet) @@ -926,30 +942,41 @@ struct phiInJets { jetpt = DistinguishJetsMC(mcd_pt, mcd_phi, mcd_eta, lResonance); if (jetFlag) { - if (lResonance.M() > 1.005 && lResonance.M() < 1.035) - RealPhiCandInJet++; - JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_INSIDE_pt_v_eta"), lResonance.Pt(), lResonance.Eta()); - JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_INSIDE_1D"), lResonance.M()); - if (lResonance.Pt() > 2.0 && lResonance.Pt() < 3) - JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_INSIDE_1D_2_3"), lResonance.M()); - JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_INSIDE"), jetpt, lResonance.Pt(), lResonance.M()); + if (cfgDaughterQAHists) { + if (lResonance.M() > 1.005 && lResonance.M() < 1.035) + RealPhiCandInJet++; + } + if (cfgDaughterQAHists) { + JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_INSIDE_pt_v_eta"), lResonance.Pt(), lResonance.Eta()); + JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_INSIDE_1D"), lResonance.M()); + if (lResonance.Pt() > 2.0 && lResonance.Pt() < 3) + JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_INSIDE_1D_2_3"), lResonance.M()); + JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_INSIDE"), jetpt, lResonance.Pt(), lResonance.M()); + } } if (hasJets) { - JEhistos.fill(HIST("ptJEHistogramPhi_JetTrigger"), lResonance.Pt()); + if (cfgPIDQAHists) + JEhistos.fill(HIST("ptJEHistogramPhi_JetTrigger"), lResonance.Pt()); + auto triggerjet = std::min_element(mcd_pt.begin(), mcd_pt.end()); double triggerjet_pt = *triggerjet; - JEhistos.fill(HIST("JetVsPhi_REC"), triggerjet_pt, lResonance.Pt()); + if (!cfgIsKstar) { + JEhistos.fill(HIST("JetVsPhi_REC"), triggerjet_pt, lResonance.Pt()); + } + } + if (cfgDaughterQAHists) { + JEhistos.fill(HIST("minvJEHistogramPhi"), lResonance.M()); } - JEhistos.fill(HIST("minvJEHistogramPhi"), lResonance.M()); } } // mcpart check } // tracks2 } // tracks1 - JEhistos.fill(HIST("hNRealPhiVPhiCand"), PhiCand, RealPhiCand); - JEhistos.fill(HIST("hNRealPhiWithJetVPhiCand"), PhiCand, RealPhiCandWithJet); - JEhistos.fill(HIST("hNRealPhiInJetVPhiCand"), PhiCand, RealPhiCandInJet); - + if (cfgDaughterQAHists) { + JEhistos.fill(HIST("hNRealPhiVPhiCand"), PhiCand, RealPhiCand); + JEhistos.fill(HIST("hNRealPhiWithJetVPhiCand"), PhiCand, RealPhiCandWithJet); + JEhistos.fill(HIST("hNRealPhiInJetVPhiCand"), PhiCand, RealPhiCandInJet); + } // Jet Eff } PROCESS_SWITCH(phiInJets, processRec, "pikp detector level MC JE", true); From 615a81ee0837c5964e48b53fae240b0e6c271019 Mon Sep 17 00:00:00 2001 From: Marek Mytkowski <101755133+mytkom@users.noreply.github.com> Date: Wed, 30 Apr 2025 09:46:36 +0200 Subject: [PATCH 1134/1650] [PIDML] use dynamic columns instead of hardcoding (#10282) Co-authored-by: ALICE Builder --- Tools/PIDML/CMakeLists.txt | 14 +- Tools/PIDML/KaonPidTask.cxx | 138 ---------- Tools/PIDML/{pidML.h => pidMl.h} | 66 ++--- ...er.cxx => pidMlBatchEffAndPurProducer.cxx} | 97 +++---- ...roducer.cxx => pidMlEffAndPurProducer.cxx} | 65 +++-- .../{pidMLProducer.cxx => pidMlProducer.cxx} | 101 ++++---- Tools/PIDML/pidOnnxInterface.h | 39 ++- Tools/PIDML/pidOnnxModel.h | 120 ++++----- Tools/PIDML/qaPid.cxx | 238 +++++++++--------- Tools/PIDML/{qaPidML.cxx => qaPidMl.cxx} | 169 +++++++------ Tools/PIDML/simpleApplyPidOnnxInterface.cxx | 55 ++-- Tools/PIDML/simpleApplyPidOnnxModel.cxx | 48 ++-- 12 files changed, 514 insertions(+), 636 deletions(-) delete mode 100644 Tools/PIDML/KaonPidTask.cxx rename Tools/PIDML/{pidML.h => pidMl.h} (82%) rename Tools/PIDML/{pidMLBatchEffAndPurProducer.cxx => pidMlBatchEffAndPurProducer.cxx} (61%) rename Tools/PIDML/{pidMLEffAndPurProducer.cxx => pidMlEffAndPurProducer.cxx} (69%) rename Tools/PIDML/{pidMLProducer.cxx => pidMlProducer.cxx} (82%) rename Tools/PIDML/{qaPidML.cxx => qaPidMl.cxx} (77%) diff --git a/Tools/PIDML/CMakeLists.txt b/Tools/PIDML/CMakeLists.txt index 8ac36a5c0df..d7be3345443 100644 --- a/Tools/PIDML/CMakeLists.txt +++ b/Tools/PIDML/CMakeLists.txt @@ -10,19 +10,19 @@ # or submit itself to any jurisdiction. o2physics_add_dpl_workflow(pid-ml-producer - SOURCES pidMLProducer.cxx + SOURCES pidMlProducer.cxx JOB_POOL analysis PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(pid-ml-batch-eff-and-pur-producer - SOURCES pidMLBatchEffAndPurProducer.cxx + SOURCES pidMlBatchEffAndPurProducer.cxx JOB_POOL analysis PUBLIC_LINK_LIBRARIES O2::Framework ONNXRuntime::ONNXRuntime O2::CCDB O2Physics::DataModel COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(pid-ml-eff-and-pur-producer - SOURCES pidMLEffAndPurProducer.cxx + SOURCES pidMlEffAndPurProducer.cxx JOB_POOL analysis PUBLIC_LINK_LIBRARIES O2::Framework ONNXRuntime::ONNXRuntime O2::CCDB O2Physics::DataModel COMPONENT_NAME Analysis) @@ -45,12 +45,6 @@ o2physics_add_dpl_workflow(qa-pid COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(qa-pid-ml - SOURCES qaPidML.cxx + SOURCES qaPidMl.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore ONNXRuntime::ONNXRuntime COMPONENT_NAME Analysis) - -o2physics_add_dpl_workflow(kaon-pid-ml - SOURCES KaonPidTask.cxx - JOB_POOL analysis - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore ONNXRuntime::ONNXRuntime O2::CCDB O2Physics::DataModel - COMPONENT_NAME Analysis) diff --git a/Tools/PIDML/KaonPidTask.cxx b/Tools/PIDML/KaonPidTask.cxx deleted file mode 100644 index acc29e47bee..00000000000 --- a/Tools/PIDML/KaonPidTask.cxx +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. - -/// This task produces invariant mass vs. momentum and dEdX in TPC vs. momentum -/// for Kaons using ML PID from the PID ML ONNX Model. - -#include -#include -#include "Framework/AnalysisTask.h" -#include "Framework/runDataProcessing.h" -#include "Common/DataModel/EventSelection.h" -#include "Common/DataModel/Multiplicity.h" -#include "TLorentzVector.h" -#include "TDatabasePDG.h" -#include "Framework/AnalysisDataModel.h" -#include "Tools/PIDML/pidOnnxModel.h" -#include "Common/DataModel/TrackSelectionTables.h" -#include "Common/DataModel/PIDResponse.h" -#include "CommonConstants/PhysicsConstants.h" -#include "TMath.h" - -using namespace o2; -using namespace o2::framework; -using namespace o2::framework::expressions; - -namespace o2::aod -{ -using MyCollisions = soa::Join; -using MyTracks = soa::Join; -using MyCollision = MyCollisions::iterator; -using MyTrack = MyTracks::iterator; -} // namespace o2::aod - -struct KaonPidTask { - SliceCache cache; - Preslice perCol = aod::track::collisionId; - - std::shared_ptr pidModel; // creates a shared pointer to a new instance 'pidmodel'. - HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; - - Configurable cfgZvtxCut{"cfgZvtxCut", 10, "Z vtx cut"}; - Configurable cfgEtaCut{"cfgEtaCut", 0.8, "Pseudorapidity cut"}; - Configurable cfgMaxPtCut{"cfgMaxPtCut", 3.0, "Max Pt cut"}; - Configurable cfgMinPtCut{"cfgMinPtCut", 0.5, "Min Pt cut"}; - Configurable cfgMinNSigmaTPCCut{"cfgMinNSigmaTPCCut", 3., "N-sigma TPC cut"}; - Configurable cfgChargeCut{"cfgChargeCut", 0., "N-sigma TPC cut"}; - Configurable cfgPathLocal{"local-path", ".", "base path to the local directory with ONNX models"}; - Configurable cfgPathCCDB{"ccdb-path", "Users/m/mkabus/PIDML", "base path to the CCDB directory with ONNX models"}; - Configurable cfgCCDBURL{"ccdb-url", "http://alice-ccdb.cern.ch", "URL of the CCDB repository"}; - Configurable cfgPid{"pid", 321, "PID to predict"}; - Configurable cfgCertainty{"certainty", 0.5, "Minimum certainty above which the model accepts a particular type of particle"}; - Configurable cfgTimestamp{"timestamp", 0, "Fixed timestamp"}; - Configurable cfgUseCCDB{"useCCDB", false, "Whether to autofetch ML model from CCDB. If false, local file will be used."}; - - o2::ccdb::CcdbApi ccdbApi; - - Filter collisionFilter = (nabs(aod::collision::posZ) < cfgZvtxCut); - Filter trackFilter = (nabs(aod::track::eta) < cfgEtaCut) && (aod::track::pt > cfgMinPtCut) && (aod::track::pt < cfgMaxPtCut); - - // Applying filters - using MyFilteredCollisions = soa::Filtered; - using MyFilteredCollision = MyFilteredCollisions::iterator; - - Partition positive = (nabs(aod::track::eta) < cfgEtaCut) && (aod::track::pt > cfgMinPtCut) && (aod::track::pt < cfgMaxPtCut) && (aod::track::signed1Pt > cfgChargeCut); - Partition negative = (nabs(aod::track::eta) < cfgEtaCut) && (aod::track::pt > cfgMinPtCut) && (aod::track::pt < cfgMaxPtCut) && (aod::track::signed1Pt < cfgChargeCut); - - void init(o2::framework::InitContext&) - { - AxisSpec vtxZAxis = {100, -20, 20}; - std::vector ptBinning = {0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.8, 2.0, 2.2, 2.4, 2.8, 3.2, 3.6, 4.}; - AxisSpec ptAxis = {ptBinning, "#it{p}_{T} (GeV/#it{c})"}; - - if (cfgUseCCDB) { - ccdbApi.init(cfgCCDBURL); // Initializes ccdbApi when cfgUseCCDB is set to 'true' - } - pidModel = std::make_shared(cfgPathLocal.value, cfgPathCCDB.value, cfgUseCCDB.value, ccdbApi, cfgTimestamp.value, cfgPid.value, cfgCertainty.value); - - histos.add("hChargePos", ";z;", kTH1F, {{3, -1.5, 1.5}}); - histos.add("hChargeNeg", ";z;", kTH1F, {{3, -1.5, 1.5}}); - histos.add("hInvariantMass", ";M_{k^{+}k^{-}} (GeV/#it{c}^{2});", kTH1F, {{100, 0., 2.}}); - histos.add("hdEdXvsMomentum", ";P_{K^{+}K^{-}}; dE/dx in TPC (keV/cm)", kTH2F, {{100, 0., 4.}, {200, 20., 400.}}); - } - - void process(MyFilteredCollision const& coll, o2::aod::MyTracks const& /*tracks*/) - { - auto groupPositive = positive->sliceByCached(aod::track::collisionId, coll.globalIndex(), cache); - auto groupNegative = negative->sliceByCached(aod::track::collisionId, coll.globalIndex(), cache); - for (auto track : groupPositive) { - histos.fill(HIST("hChargePos"), track.sign()); - if (pidModel.get()->applyModelBoolean(track)) { - histos.fill(HIST("hdEdXvsMomentum"), track.p(), track.tpcSignal()); - } - } - - for (auto track : groupNegative) { - histos.fill(HIST("hChargeNeg"), track.sign()); - if (pidModel.get()->applyModelBoolean(track)) { - histos.fill(HIST("hdEdXvsMomentum"), track.p(), track.tpcSignal()); - } - } - - for (auto& [pos, neg] : combinations(soa::CombinationsFullIndexPolicy(groupPositive, groupNegative))) { - if (!(pidModel.get()->applyModelBoolean(pos)) || !(pidModel.get()->applyModelBoolean(neg))) { - continue; - } - - TLorentzVector part1Vec; - TLorentzVector part2Vec; - float mMassOne = TDatabasePDG::Instance()->GetParticle(cfgPid.value)->Mass(); - float mMassTwo = TDatabasePDG::Instance()->GetParticle(cfgPid.value)->Mass(); - - part1Vec.SetPtEtaPhiM(pos.pt(), pos.eta(), pos.phi(), mMassOne); - part2Vec.SetPtEtaPhiM(neg.pt(), neg.eta(), neg.phi(), mMassTwo); - - TLorentzVector sumVec(part1Vec); - sumVec += part2Vec; - - histos.fill(HIST("hInvariantMass"), sumVec.M()); - } - } -}; - -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - WorkflowSpec workflow{adaptAnalysisTask(cfgc)}; - return workflow; -} diff --git a/Tools/PIDML/pidML.h b/Tools/PIDML/pidMl.h similarity index 82% rename from Tools/PIDML/pidML.h rename to Tools/PIDML/pidMl.h index 821da7efc42..935440e26f7 100644 --- a/Tools/PIDML/pidML.h +++ b/Tools/PIDML/pidMl.h @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file pidML.h +/// \file pidMl.h /// \brief Data model for PID ML training. /// /// \author Maja Kabus @@ -19,6 +19,8 @@ #include "Framework/AnalysisDataModel.h" #include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/Multiplicity.h" namespace o2::aod { @@ -32,16 +34,16 @@ DECLARE_SOA_COLUMN(Py, py, float); //! Non-dynam DECLARE_SOA_COLUMN(Pz, pz, float); //! Non-dynamic column with track z-momentum DECLARE_SOA_COLUMN(Sign, sign, float); //! Non-dynamic column with track sign DECLARE_SOA_COLUMN(IsPhysicalPrimary, isPhysicalPrimary, uint8_t); //! -DECLARE_SOA_COLUMN(TOFExpSignalDiffEl, tofExpSignalDiffEl, float); //! Difference between signal and expected for electron -DECLARE_SOA_COLUMN(TPCExpSignalDiffEl, tpcExpSignalDiffEl, float); //! Difference between signal and expected for electron -DECLARE_SOA_COLUMN(TOFExpSignalDiffMu, tofExpSignalDiffMu, float); //! Difference between signal and expected for muon -DECLARE_SOA_COLUMN(TPCExpSignalDiffMu, tpcExpSignalDiffMu, float); //! Difference between signal and expected for muon -DECLARE_SOA_COLUMN(TOFExpSignalDiffPi, tofExpSignalDiffPi, float); //! Difference between signal and expected for pion -DECLARE_SOA_COLUMN(TPCExpSignalDiffPi, tpcExpSignalDiffPi, float); //! Difference between signal and expected for pion -DECLARE_SOA_COLUMN(TOFExpSignalDiffKa, tofExpSignalDiffKa, float); //! Difference between signal and expected for kaon -DECLARE_SOA_COLUMN(TPCExpSignalDiffKa, tpcExpSignalDiffKa, float); //! Difference between signal and expected for kaon -DECLARE_SOA_COLUMN(TOFExpSignalDiffPr, tofExpSignalDiffPr, float); //! Difference between signal and expected for proton -DECLARE_SOA_COLUMN(TPCExpSignalDiffPr, tpcExpSignalDiffPr, float); //! Difference between signal and expected for proton +DECLARE_SOA_COLUMN(TofExpSignalDiffEl, tofExpSignalDiffEl, float); //! Difference between signal and expected for electron +DECLARE_SOA_COLUMN(TpcExpSignalDiffEl, tpcExpSignalDiffEl, float); //! Difference between signal and expected for electron +DECLARE_SOA_COLUMN(TofExpSignalDiffMu, tofExpSignalDiffMu, float); //! Difference between signal and expected for muon +DECLARE_SOA_COLUMN(TpcExpSignalDiffMu, tpcExpSignalDiffMu, float); //! Difference between signal and expected for muon +DECLARE_SOA_COLUMN(TofExpSignalDiffPi, tofExpSignalDiffPi, float); //! Difference between signal and expected for pion +DECLARE_SOA_COLUMN(TpcExpSignalDiffPi, tpcExpSignalDiffPi, float); //! Difference between signal and expected for pion +DECLARE_SOA_COLUMN(TofExpSignalDiffKa, tofExpSignalDiffKa, float); //! Difference between signal and expected for kaon +DECLARE_SOA_COLUMN(TpcExpSignalDiffKa, tpcExpSignalDiffKa, float); //! Difference between signal and expected for kaon +DECLARE_SOA_COLUMN(TofExpSignalDiffPr, tofExpSignalDiffPr, float); //! Difference between signal and expected for proton +DECLARE_SOA_COLUMN(TpcExpSignalDiffPr, tpcExpSignalDiffPr, float); //! Difference between signal and expected for proton } // namespace pidtracks DECLARE_SOA_TABLE(PidTracksDataMl, "AOD", "PIDTRACKSDATAML", //! Data tracks for prediction and domain adaptation aod::track::TPCSignal, @@ -63,7 +65,6 @@ DECLARE_SOA_TABLE(PidTracksDataMl, "AOD", "PIDTRACKSDATAML", //! Data tracks for aod::track::DcaXY, aod::track::DcaZ); DECLARE_SOA_TABLE(PidTracksData, "AOD", "PIDTRACKSDATA", //! Data tracks for comparative analysis - aod::cent::CentRun2V0M, aod::mult::MultFV0A, aod::mult::MultFV0C, pidtracks::MultFV0M, aod::mult::MultFT0A, aod::mult::MultFT0C, pidtracks::MultFT0M, aod::mult::MultZNA, aod::mult::MultZNC, @@ -90,34 +91,34 @@ DECLARE_SOA_TABLE(PidTracksData, "AOD", "PIDTRACKSDATA", //! Data tracks for com aod::track::DcaZ, pidtpc::TPCNSigmaEl, pidtpc::TPCExpSigmaEl, - pidtracks::TPCExpSignalDiffEl, + pidtracks::TpcExpSignalDiffEl, pidtof::TOFNSigmaEl, pidtof::TOFExpSigmaEl, - pidtracks::TOFExpSignalDiffEl, + pidtracks::TofExpSignalDiffEl, pidtpc::TPCNSigmaMu, pidtpc::TPCExpSigmaMu, - pidtracks::TPCExpSignalDiffMu, + pidtracks::TpcExpSignalDiffMu, pidtof::TOFNSigmaMu, pidtof::TOFExpSigmaMu, - pidtracks::TOFExpSignalDiffMu, + pidtracks::TofExpSignalDiffMu, pidtpc::TPCNSigmaPi, pidtpc::TPCExpSigmaPi, - pidtracks::TPCExpSignalDiffPi, + pidtracks::TpcExpSignalDiffPi, pidtof::TOFNSigmaPi, pidtof::TOFExpSigmaPi, - pidtracks::TOFExpSignalDiffPi, + pidtracks::TofExpSignalDiffPi, pidtpc::TPCNSigmaKa, pidtpc::TPCExpSigmaKa, - pidtracks::TPCExpSignalDiffKa, + pidtracks::TpcExpSignalDiffKa, pidtof::TOFNSigmaKa, pidtof::TOFExpSigmaKa, - pidtracks::TOFExpSignalDiffKa, + pidtracks::TofExpSignalDiffKa, pidtpc::TPCNSigmaPr, pidtpc::TPCExpSigmaPr, - pidtracks::TPCExpSignalDiffPr, + pidtracks::TpcExpSignalDiffPr, pidtof::TOFNSigmaPr, pidtof::TOFExpSigmaPr, - pidtracks::TOFExpSignalDiffPr); + pidtracks::TofExpSignalDiffPr); DECLARE_SOA_TABLE(PidTracksMcMl, "AOD", "PIDTRACKSMCML", //! MC tracks for training aod::track::TPCSignal, aod::track::TRDSignal, aod::track::TRDPattern, @@ -140,7 +141,6 @@ DECLARE_SOA_TABLE(PidTracksMcMl, "AOD", "PIDTRACKSMCML", //! MC tracks for train aod::mcparticle::PdgCode, pidtracks::IsPhysicalPrimary); DECLARE_SOA_TABLE(PidTracksMc, "AOD", "PIDTRACKSMC", //! MC tracks for comparative analysis - aod::cent::CentRun2V0M, aod::mult::MultFV0A, aod::mult::MultFV0C, pidtracks::MultFV0M, aod::mult::MultFT0A, aod::mult::MultFT0C, pidtracks::MultFT0M, aod::mult::MultZNA, aod::mult::MultZNC, @@ -167,34 +167,34 @@ DECLARE_SOA_TABLE(PidTracksMc, "AOD", "PIDTRACKSMC", //! MC tracks for comparati aod::track::DcaZ, pidtpc::TPCNSigmaEl, pidtpc::TPCExpSigmaEl, - pidtracks::TPCExpSignalDiffEl, + pidtracks::TpcExpSignalDiffEl, pidtof::TOFNSigmaEl, pidtof::TOFExpSigmaEl, - pidtracks::TOFExpSignalDiffEl, + pidtracks::TofExpSignalDiffEl, pidtpc::TPCNSigmaMu, pidtpc::TPCExpSigmaMu, - pidtracks::TPCExpSignalDiffMu, + pidtracks::TpcExpSignalDiffMu, pidtof::TOFNSigmaMu, pidtof::TOFExpSigmaMu, - pidtracks::TOFExpSignalDiffMu, + pidtracks::TofExpSignalDiffMu, pidtpc::TPCNSigmaPi, pidtpc::TPCExpSigmaPi, - pidtracks::TPCExpSignalDiffPi, + pidtracks::TpcExpSignalDiffPi, pidtof::TOFNSigmaPi, pidtof::TOFExpSigmaPi, - pidtracks::TOFExpSignalDiffPi, + pidtracks::TofExpSignalDiffPi, pidtpc::TPCNSigmaKa, pidtpc::TPCExpSigmaKa, - pidtracks::TPCExpSignalDiffKa, + pidtracks::TpcExpSignalDiffKa, pidtof::TOFNSigmaKa, pidtof::TOFExpSigmaKa, - pidtracks::TOFExpSignalDiffKa, + pidtracks::TofExpSignalDiffKa, pidtpc::TPCNSigmaPr, pidtpc::TPCExpSigmaPr, - pidtracks::TPCExpSignalDiffPr, + pidtracks::TpcExpSignalDiffPr, pidtof::TOFNSigmaPr, pidtof::TOFExpSigmaPr, - pidtracks::TOFExpSignalDiffPr, + pidtracks::TofExpSignalDiffPr, aod::mcparticle::PdgCode, pidtracks::IsPhysicalPrimary); } // namespace o2::aod diff --git a/Tools/PIDML/pidMLBatchEffAndPurProducer.cxx b/Tools/PIDML/pidMlBatchEffAndPurProducer.cxx similarity index 61% rename from Tools/PIDML/pidMLBatchEffAndPurProducer.cxx rename to Tools/PIDML/pidMlBatchEffAndPurProducer.cxx index 9a611ded269..86adb2cf238 100644 --- a/Tools/PIDML/pidMLBatchEffAndPurProducer.cxx +++ b/Tools/PIDML/pidMlBatchEffAndPurProducer.cxx @@ -9,9 +9,9 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file pidMLBatchEffAndPurProducer +/// \file pidMlBatchEffAndPurProducer.cxx /// \brief Batch PID execution task. It produces derived data needed for ROOT script, which -/// generates efficiency (recall) and purity (precision) analysis of ML Model PID +/// generate PIDML neural network performance benchmark plots. /// /// \author Michał Olędzki /// \author Marek Mytkowski @@ -19,6 +19,9 @@ #include #include #include +#include +#include +#include #include "Framework/AnalysisDataModel.h" #include "Framework/runDataProcessing.h" @@ -44,9 +47,9 @@ DECLARE_SOA_COLUMN(Pid, pid, int32_t); //! PDG particle ID to be t DECLARE_SOA_COLUMN(Pt, pt, float); //! particle's pt DECLARE_SOA_COLUMN(MlCertainty, mlCertainty, float); //! Machine learning model certainty value for track and pid DECLARE_SOA_COLUMN(NSigma, nSigma, float); //! nSigma value for track and pid -DECLARE_SOA_COLUMN(IsPidMC, isPidMc, bool); //! Is track's mcParticle recognized as "Pid" -DECLARE_SOA_COLUMN(HasTOF, hasTof, bool); //! Does track have TOF detector signal -DECLARE_SOA_COLUMN(HasTRD, hasTrd, bool); //! Does track have TRD detector signal +DECLARE_SOA_COLUMN(IsPidMC, isPidMC, bool); //! Is track's mcParticle recognized as "Pid" +DECLARE_SOA_COLUMN(HasTOF, hasTOF, bool); //! Does track have TOF detector signal +DECLARE_SOA_COLUMN(HasTRD, hasTRD, bool); //! Does track have TRD detector signal } // namespace effandpurpidresult DECLARE_SOA_TABLE(EffAndPurPidResult, "AOD", "PIDEFFANDPURRES", o2::soa::Index<>, @@ -58,49 +61,49 @@ struct PidMlBatchEffAndPurProducer { Produces effAndPurPIDResult; HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; - static constexpr int32_t currentRunNumber = -1; - static constexpr uint32_t kNPids = 6; - static constexpr int32_t kPids[kNPids] = {2212, 321, 211, -211, -321, -2212}; - static constexpr std::string_view kParticleLabels[kNPids] = {"2212", "321", "211", "0211", "0321", "02212"}; - static constexpr std::string_view kParticleNames[kNPids] = {"proton", "kaon", "pion", "antipion", "antikaon", "antiproton"}; + static constexpr int32_t CurrentRunNumber = -1; + static constexpr uint32_t KNPids = 6; + static constexpr int32_t KPids[KNPids] = {2212, 321, 211, -211, -321, -2212}; + static constexpr std::string_view KParticleLabels[KNPids] = {"2212", "321", "211", "0211", "0321", "02212"}; + static constexpr std::string_view KPatricleNames[KNPids] = {"proton", "kaon", "pion", "antipion", "antikaon", "antiproton"}; - std::array, kNPids> hTracked; - std::array, kNPids> hMCPositive; + std::array, KNPids> hTracked; + std::array, KNPids> hMCPositive; o2::ccdb::CcdbApi ccdbApi; - std::vector models; - Configurable> cfgPids{"pids", std::vector(kPids, kPids + kNPids), "PIDs to predict"}; - Configurable> cfgDetectorsPLimits{"detectors-p-limits", std::array(pidml_pt_cuts::defaultModelPLimits), "\"use {detector} when p >= y_{detector}\": array of 3 doubles [y_TPC, y_TOF, y_TRD]"}; - Configurable cfgPathCCDB{"ccdb-path", "Users/m/mkabus/PIDML", "base path to the CCDB directory with ONNX models"}; - Configurable cfgCCDBURL{"ccdb-url", "http://alice-ccdb.cern.ch", "URL of the CCDB repository"}; - Configurable cfgUseCCDB{"use-ccdb", true, "Whether to autofetch ML model from CCDB. If false, local file will be used."}; - Configurable cfgPathLocal{"local-path", "/home/mkabus/PIDML/", "base path to the local directory with ONNX models"}; - Configurable cfgUseFixedTimestamp{"use-fixed-timestamp", false, "Whether to use fixed timestamp from configurable instead of timestamp calculated from the data"}; - Configurable cfgTimestamp{"timestamp", 1524176895000, "Hardcoded timestamp for tests"}; + Configurable> pdgPids{"pdgPids", std::vector(KPids, KPids + KNPids), "list of PDG ids of particles to predict. Every subset of {2212, 321, 211, -211, -321, -2212} is correct value."}; + Configurable detectorMomentumLimits{"detectorMomentumLimits", MomentumLimitsMatrix(pidml_pt_cuts::defaultModelPLimits), "\"use {detector} when p >= y_{detector}\": array of 3 doubles [y_TPC, y_TOF, y_TRD]"}; + Configurable ccdbPath{"ccdbPath", "Users/m/mkabus/PIDML", "Base path to the CCDB directory with ONNX models"}; + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "URL of the CCDB repository"}; + Configurable useCcdb{"useCcdb", true, "Whether to autofetch ML model from CCDB. If false, local file will be used."}; + Configurable localPath{"localPath", "/home/mkabus/PIDML/", "Base path to the local directory with ONNX models"}; + Configurable useFixedTimestamp{"useFixedTimestamp", false, "Whether to use fixed timestamp from configurable instead of timestamp calculated from the data"}; + Configurable fixedTimestamp{"fixedTimestamp", 1524176895000, "Hardcoded timestamp for tests"}; Filter trackFilter = requireGlobalTrackInFilter(); using BigTracks = soa::Filtered>; + std::vector> models; void initHistos() { static const AxisSpec axisPt{50, 0, 3.1, "pt"}; - static_for<0, kNPids - 1>([&](auto i) { - if (std::find(cfgPids.value.begin(), cfgPids.value.end(), kPids[i]) != cfgPids.value.end()) { - hTracked[i] = histos.add(Form("%s/hPtMCTracked", kParticleLabels[i].data()), Form("Tracked %ss vs pT", kParticleNames[i].data()), kTH1F, {axisPt}); - hMCPositive[i] = histos.add(Form("%s/hPtMCPositive", kParticleLabels[i].data()), Form("MC Positive %ss vs pT", kParticleNames[i].data()), kTH1F, {axisPt}); + static_for<0, KNPids - 1>([&](auto i) { + if (std::find(pdgPids.value.begin(), pdgPids.value.end(), KPids[i]) != pdgPids.value.end()) { + hTracked[i] = histos.add(Form("%s/hPtMCTracked", KParticleLabels[i].data()), Form("Tracked %ss vs pT", KPatricleNames[i].data()), kTH1F, {axisPt}); + hMCPositive[i] = histos.add(Form("%s/hPtMCPositive", KParticleLabels[i].data()), Form("MC Positive %ss vs pT", KPatricleNames[i].data()), kTH1F, {axisPt}); } }); } void init(InitContext const&) { - if (cfgUseCCDB) { - ccdbApi.init(cfgCCDBURL); + if (useCcdb) { + ccdbApi.init(ccdbUrl); } initHistos(); @@ -110,7 +113,7 @@ struct PidMlBatchEffAndPurProducer { { std::optional index; - if (std::find(cfgPids.value.begin(), cfgPids.value.end(), pdgCode) != cfgPids.value.end()) { + if (std::find(pdgPids.value.begin(), pdgPids.value.end(), pdgCode) != pdgPids.value.end()) { switch (pdgCode) { case 2212: index = 0; @@ -160,7 +163,7 @@ struct PidMlBatchEffAndPurProducer { { nSigma_t nSigma; - switch (TMath::Abs(cfgPid)) { + switch (std::abs(cfgPid)) { case 11: // electron nSigma.tof = track.tofNSigmaEl(); nSigma.tpc = track.tpcNSigmaEl(); @@ -183,10 +186,10 @@ struct PidMlBatchEffAndPurProducer { break; } - if (!inPLimit(track, cfgDetectorsPLimits.value[kTPCTOF]) || tofMissing(track)) { - nSigma.composed = TMath::Abs(nSigma.tpc); + if (!inPLimit(track, detectorMomentumLimits.value[kTPCTOF]) || tofMissing(track)) { + nSigma.composed = std::abs(nSigma.tpc); } else { - nSigma.composed = TMath::Hypot(nSigma.tof, nSigma.tpc); + nSigma.composed = std::hypot(nSigma.tof, nSigma.tpc); } int32_t sign = cfgPid > 0 ? 1 : -1; @@ -202,36 +205,36 @@ struct PidMlBatchEffAndPurProducer { effAndPurPIDResult.reserve(mcParticles.size()); auto bc = collisions.iteratorAt(0).bc_as(); - if (cfgUseCCDB && bc.runNumber() != currentRunNumber) { - uint64_t timestamp = cfgUseFixedTimestamp ? cfgTimestamp.value : bc.timestamp(); - for (const int32_t& pid : cfgPids.value) - models.emplace_back(PidONNXModel(cfgPathLocal.value, cfgPathCCDB.value, cfgUseCCDB.value, - ccdbApi, timestamp, pid, 1.1, &cfgDetectorsPLimits.value[0])); + if (useCcdb && bc.runNumber() != CurrentRunNumber) { + uint64_t timestamp = useFixedTimestamp ? fixedTimestamp.value : bc.timestamp(); + for (const int32_t& pid : pdgPids.value) + models.emplace_back(PidONNXModel(localPath.value, ccdbPath.value, useCcdb.value, + ccdbApi, timestamp, pid, 1.1, &detectorMomentumLimits.value[0])); } else { - for (int32_t& pid : cfgPids.value) - models.emplace_back(PidONNXModel(cfgPathLocal.value, cfgPathCCDB.value, cfgUseCCDB.value, - ccdbApi, -1, pid, 1.1, &cfgDetectorsPLimits.value[0])); + for (const int32_t& pid : pdgPids.value) + models.emplace_back(PidONNXModel(localPath.value, ccdbPath.value, useCcdb.value, + ccdbApi, -1, pid, 1.1, &detectorMomentumLimits.value[0])); } - for (auto& mcPart : mcParticles) { + for (const auto& mcPart : mcParticles) { // eta cut is done in requireGlobalTrackInFilter() so we cut it only here - if (mcPart.isPhysicalPrimary() && TMath::Abs(mcPart.eta()) < kGlobalEtaCut) { + if (mcPart.isPhysicalPrimary() && std::abs(mcPart.eta()) < kGlobalEtaCut) { fillMCPositiveHist(mcPart.pdgCode(), mcPart.pt()); } } - for (auto& track : tracks) { + for (const auto& track : tracks) { if (track.has_mcParticle()) { auto mcPart = track.mcParticle(); if (mcPart.isPhysicalPrimary()) { fillTrackedHist(mcPart.pdgCode(), track.pt()); - for (size_t i = 0; i < cfgPids.value.size(); ++i) { + for (size_t i = 0; i < pdgPids.value.size(); ++i) { float mlCertainty = models[i].applyModel(track); - nSigma_t nSigma = getNSigma(track, cfgPids.value[i]); - bool isMCPid = mcPart.pdgCode() == cfgPids.value[i]; + nSigma_t nSigma = getNSigma(track, pdgPids.value[i]); + bool isMCPid = mcPart.pdgCode() == pdgPids.value[i]; - effAndPurPIDResult(track.index(), cfgPids.value[i], track.pt(), mlCertainty, nSigma.composed, isMCPid, track.hasTOF(), track.hasTRD()); + effAndPurPIDResult(track.index(), pdgPids.value[i], track.pt(), mlCertainty, nSigma.composed, isMCPid, track.hasTOF(), track.hasTRD()); } } } diff --git a/Tools/PIDML/pidMLEffAndPurProducer.cxx b/Tools/PIDML/pidMlEffAndPurProducer.cxx similarity index 69% rename from Tools/PIDML/pidMLEffAndPurProducer.cxx rename to Tools/PIDML/pidMlEffAndPurProducer.cxx index 7e626a8d631..e3c57763dbf 100644 --- a/Tools/PIDML/pidMLEffAndPurProducer.cxx +++ b/Tools/PIDML/pidMlEffAndPurProducer.cxx @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file pidMLEffAndPurProducer.cxx +/// \file pidMlEffAndPurProducer.cxx /// \brief Produce pt histograms for tracks accepted by ML network and for MC mcParticles. /// /// \author Michał Olędzki @@ -24,7 +24,6 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/PIDResponse.h" #include "Tools/PIDML/pidOnnxModel.h" -#include "pidOnnxModel.h" #include "Tools/PIDML/pidUtils.h" using namespace o2; @@ -35,19 +34,18 @@ using namespace pidml::pidutils; struct PidMlEffAndPurProducer { HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; - PidONNXModel pidModel; - Configurable cfgPid{"pid", 211, "PID to predict"}; - Configurable cfgNSigmaCut{"n-sigma-cut", 3.0f, "TPC and TOF PID nSigma cut"}; - Configurable> cfgDetectorsPLimits{"detectors-p-limits", std::array(pidml_pt_cuts::defaultModelPLimits), "\"use {detector} when p >= y_{detector}\": array of 3 doubles [y_TPC, y_TOF, y_TRD]"}; - Configurable cfgCertainty{"certainty", 0.5, "Min certainty of the model to accept given mcPart to be of given kind"}; + Configurable pdgPid{"pdgPid", 211, "PID to predict"}; + Configurable nSigmaCut{"nSigmaCut", 3.0f, "TPC and TOF PID nSigma cut"}; + Configurable detectorMomentumLimits{"detectorMomentumLimits", MomentumLimitsMatrix(pidml_pt_cuts::defaultModelPLimits), "use {detector} when p >= y_{detector}: array of 3 doubles [y_TPC, y_TOF, y_TRD]"}; + Configurable mlIdentCertaintyThreshold{"mlIdentCertaintyThreshold", 0.5, "Min certainty of the model to accept given mcPart to be of given kind"}; - Configurable cfgPathCCDB{"ccdb-path", "Users/m/mkabus/PIDML", "base path to the CCDB directory with ONNX models"}; - Configurable cfgCCDBURL{"ccdb-url", "http://alice-ccdb.cern.ch", "URL of the CCDB repository"}; - Configurable cfgUseCCDB{"use-ccdb", true, "Whether to autofetch ML model from CCDB. If false, local file will be used."}; - Configurable cfgPathLocal{"local-path", "/home/mkabus/PIDML", "base path to the local directory with ONNX models"}; + Configurable ccdbPath{"ccdbPath", "Users/m/mkabus/PIDML", "base path to the CCDB directory with ONNX models"}; + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "URL of the CCDB repository"}; + Configurable useCcdb{"useCcdb", true, "Whether to autofetch ML model from CCDB. If false, local file will be used."}; + Configurable localPath{"localPath", "/home/mkabus/PIDML", "base path to the local directory with ONNX models"}; - Configurable cfgUseFixedTimestamp{"use-fixed-timestamp", false, "Whether to use fixed timestamp from configurable instead of timestamp calculated from the data"}; - Configurable cfgTimestamp{"timestamp", 1524176895000, "Hardcoded timestamp for tests"}; + Configurable useFixedTimestamp{"useFixedTimestamp", false, "Whether to use fixed timestamp from configurable instead of timestamp calculated from the data"}; + Configurable fixedTimestamp{"fixedTimestamp", 1524176895000, "Hardcoded timestamp for tests"}; o2::ccdb::CcdbApi ccdbApi; int currentRunNumber = -1; @@ -57,16 +55,17 @@ struct PidMlEffAndPurProducer { using BigTracks = soa::Filtered>; + PidONNXModel pidModel; typedef struct nSigma_t { double tpc, tof; } nSigma_t; - nSigma_t GetNSigma(const BigTracks::iterator& track) + nSigma_t getNSigma(const BigTracks::iterator& track) { nSigma_t nSigma; - switch (TMath::Abs(cfgPid)) { + switch (std::abs(pdgPid)) { case 11: // electron nSigma.tof = track.tofNSigmaEl(); nSigma.tpc = track.tpcNSigmaEl(); @@ -92,19 +91,19 @@ struct PidMlEffAndPurProducer { return nSigma; } - bool IsNSigmaAccept(const BigTracks::iterator& track, nSigma_t& nSigma) + bool isNSigmaAccept(const BigTracks::iterator& track, nSigma_t& nSigma) { // FIXME: for current particles it works, but there are some particles, // which can have different sign and pdgSign - int sign = cfgPid > 0 ? 1 : -1; + int sign = pdgPid > 0 ? 1 : -1; if (track.sign() != sign) return false; - if (!inPLimit(track, cfgDetectorsPLimits.value[kTPCTOF]) || tofMissing(track)) { - if (TMath::Abs(nSigma.tpc) >= cfgNSigmaCut) + if (!inPLimit(track, detectorMomentumLimits.value[kTPCTOF]) || tofMissing(track)) { + if (std::abs(nSigma.tpc) >= nSigmaCut) return false; } else { - if (TMath::Hypot(nSigma.tof, nSigma.tpc) >= cfgNSigmaCut) + if (std::hypot(nSigma.tof, nSigma.tpc) >= nSigmaCut) return false; } @@ -113,11 +112,11 @@ struct PidMlEffAndPurProducer { void init(InitContext const&) { - if (cfgUseCCDB) { - ccdbApi.init(cfgCCDBURL); + if (useCcdb) { + ccdbApi.init(ccdbUrl); } else { - pidModel = PidONNXModel(cfgPathLocal.value, cfgPathCCDB.value, cfgUseCCDB.value, ccdbApi, -1, - cfgPid.value, cfgCertainty.value, &cfgDetectorsPLimits.value[0]); + pidModel = PidONNXModel(localPath.value, ccdbPath.value, useCcdb.value, ccdbApi, -1, + pdgPid.value, mlIdentCertaintyThreshold.value, &detectorMomentumLimits.value[0]); } const AxisSpec axisPt{100, 0, 5.0, "pt"}; @@ -151,26 +150,26 @@ struct PidMlEffAndPurProducer { void process(aod::Collisions const& collisions, BigTracks const& tracks, aod::BCsWithTimestamps const&, aod::McParticles const& mcParticles) { auto bc = collisions.iteratorAt(0).bc_as(); - if (cfgUseCCDB && bc.runNumber() != currentRunNumber) { - uint64_t timestamp = cfgUseFixedTimestamp ? cfgTimestamp.value : bc.timestamp(); - pidModel = PidONNXModel(cfgPathLocal.value, cfgPathCCDB.value, cfgUseCCDB.value, ccdbApi, timestamp, - cfgPid.value, cfgCertainty.value, &cfgDetectorsPLimits.value[0]); + if (useCcdb && bc.runNumber() != currentRunNumber) { + uint64_t timestamp = useFixedTimestamp ? fixedTimestamp.value : bc.timestamp(); + pidModel = PidONNXModel(localPath.value, ccdbPath.value, useCcdb.value, ccdbApi, timestamp, + pdgPid.value, mlIdentCertaintyThreshold.value, &detectorMomentumLimits.value[0]); } - for (auto& mcPart : mcParticles) { + for (const auto& mcPart : mcParticles) { // eta cut is included in requireGlobalTrackInFilter() so we cut it only here - if (mcPart.isPhysicalPrimary() && TMath::Abs(mcPart.eta()) < kGlobalEtaCut && mcPart.pdgCode() == pidModel.mPid) { + if (mcPart.isPhysicalPrimary() && std::abs(mcPart.eta()) < kGlobalEtaCut && mcPart.pdgCode() == pidModel.mPid) { histos.fill(HIST("hPtMCPositive"), mcPart.pt()); } } - for (auto& track : tracks) { + for (const auto& track : tracks) { if (track.has_mcParticle()) { auto mcPart = track.mcParticle(); if (mcPart.isPhysicalPrimary()) { bool mlAccepted = pidModel.applyModelBoolean(track); - nSigma_t nSigma = GetNSigma(track); - bool nSigmaAccepted = IsNSigmaAccept(track, nSigma); + nSigma_t nSigma = getNSigma(track); + bool nSigmaAccepted = isNSigmaAccept(track, nSigma); LOGF(debug, "collision id: %d track id: %d mlAccepted: %d nSigmaAccepted: %d p: %.3f; x: %.3f, y: %.3f, z: %.3f", track.collisionId(), track.index(), mlAccepted, nSigmaAccepted, track.p(), track.x(), track.y(), track.z()); diff --git a/Tools/PIDML/pidMLProducer.cxx b/Tools/PIDML/pidMlProducer.cxx similarity index 82% rename from Tools/PIDML/pidMLProducer.cxx rename to Tools/PIDML/pidMlProducer.cxx index 67cf4308a5e..de1d65622d0 100644 --- a/Tools/PIDML/pidMLProducer.cxx +++ b/Tools/PIDML/pidMlProducer.cxx @@ -9,13 +9,14 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file pidMLProducer.cxx +/// \file pidMlProducer.cxx /// \brief Produce PID ML skimmed data from MC or data files. /// /// \author Maja Kabus /// \author Marek Mytkowski #include +#include #include "Framework/AnalysisTask.h" #include "Framework/StaticFor.h" #include "Framework/AnalysisDataModel.h" @@ -24,7 +25,7 @@ #include "Common/DataModel/Centrality.h" #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/TrackSelectionTables.h" -#include "Tools/PIDML/pidML.h" +#include "Tools/PIDML/pidMl.h" #include "Tools/PIDML/pidUtils.h" using namespace o2; @@ -53,36 +54,36 @@ struct PidMlProducer { using BigTracksMC = soa::Filtered>; using MyCollisionML = aod::Collisions::iterator; - using MyCollision = soa::Join::iterator; + using MyCollision = soa::Join::iterator; - static constexpr uint32_t nCharges = 2; + static constexpr uint32_t NCharges = 2; - static constexpr std::string_view histPrefixes[nCharges] = {"minus", "plus"}; + static constexpr std::string_view HistPrefixes[NCharges] = {"minus", "plus"}; // 2D - std::array, nCharges> hTPCSigvsP; - std::array, nCharges> hTOFBetavsP; - std::array, nCharges> hTOFSigvsP; - std::array, nCharges> hFilteredTOFSigvsP; - std::array, nCharges> hTRDPattvsP; - std::array, nCharges> hTRDSigvsP; + std::array, NCharges> hTPCSigvsP; + std::array, NCharges> hTOFBetavsP; + std::array, NCharges> hTOFSigvsP; + std::array, NCharges> hFilteredTOFSigvsP; + std::array, NCharges> hTRDPattvsP; + std::array, NCharges> hTRDSigvsP; // 1D - std::array, nCharges> hP; - std::array, nCharges> hPt; - std::array, nCharges> hPx; - std::array, nCharges> hPy; - std::array, nCharges> hPz; - std::array, nCharges> hX; - std::array, nCharges> hY; - std::array, nCharges> hZ; - std::array, nCharges> hAlpha; - std::array, nCharges> hTrackType; - std::array, nCharges> hTPCNClsShared; - std::array, nCharges> hDcaXY; - std::array, nCharges> hDcaZ; - std::array, nCharges> hPdgCode; - std::array, nCharges> hIsPrimary; + std::array, NCharges> hP; + std::array, NCharges> hPt; + std::array, NCharges> hPx; + std::array, NCharges> hPy; + std::array, NCharges> hPz; + std::array, NCharges> hX; + std::array, NCharges> hY; + std::array, NCharges> hZ; + std::array, NCharges> hAlpha; + std::array, NCharges> hTrackType; + std::array, NCharges> hTPCNClsShared; + std::array, NCharges> hDcaXY; + std::array, NCharges> hDcaZ; + std::array, NCharges> hPdgCode; + std::array, NCharges> hIsPrimary; HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -94,33 +95,33 @@ struct PidMlProducer { template void initHistSign() { - hTPCSigvsP[prefixInd] = registry.add(Form("%s/hTPCSigvsP", histPrefixes[prefixInd].data()), genTagvsP("TPC Signal"), HistType::kTH2F, {{500, 0., 10.}, {1000, 0., 600.}}); - hTOFBetavsP[prefixInd] = registry.add(Form("%s/hTOFBetavsP", histPrefixes[prefixInd].data()), genTagvsP("TOF beta"), HistType::kTH2F, {{500, 0., 10.}, {6000, -3., 3.}}); - hTOFSigvsP[prefixInd] = registry.add(Form("%s/hTOFSigvsP", histPrefixes[prefixInd].data()), genTagvsP("TOF signal"), HistType::kTH2F, {{500, 0., 10.}, {10000, -5000., 80000.}}); - hFilteredTOFSigvsP[prefixInd] = registry.add(Form("%s/filtered/hTOFSigvsP", histPrefixes[prefixInd].data()), genTagvsP("TOF signal (filtered)"), HistType::kTH2F, {{500, 0., 10.}, {10000, -5000., 80000.}}); - hTRDPattvsP[prefixInd] = registry.add(Form("%s/hTRDPattvsP", histPrefixes[prefixInd].data()), genTagvsP("TRD pattern"), HistType::kTH2F, {{500, 0., 10.}, {110, -10., 100.}}); - hTRDSigvsP[prefixInd] = registry.add(Form("%s/hTRDSigvsP", histPrefixes[prefixInd].data()), genTagvsP("TRD signal"), HistType::kTH2F, {{500, 0., 10.}, {2500, -2., 100.}}); - hP[prefixInd] = registry.add(Form("%s/hP", histPrefixes[prefixInd].data()), "#it{p};#it{p} (GeV/#it{c})", HistType::kTH1F, {{500, 0., 6.}}); - hPt[prefixInd] = registry.add(Form("%s/hPt", histPrefixes[prefixInd].data()), "#it{p}_{t};#it{p}_{t} (GeV/#it{c})", HistType::kTH1F, {{500, 0., 6.}}); - hPx[prefixInd] = registry.add(Form("%s/hPx", histPrefixes[prefixInd].data()), "#it{p}_{x};#it{p}_{x} (GeV/#it{c})", HistType::kTH1F, {{1000, -6., 6.}}); - hPy[prefixInd] = registry.add(Form("%s/hPy", histPrefixes[prefixInd].data()), "#it{p}_{y};#it{p}_{y} (GeV/#it{c})", HistType::kTH1F, {{1000, -6., 6.}}); - hPz[prefixInd] = registry.add(Form("%s/hPz", histPrefixes[prefixInd].data()), "#it{p}_{z};#it{p}_{z} (GeV/#it{c})", HistType::kTH1F, {{1000, -6., 6.}}); - hX[prefixInd] = registry.add(Form("%s/hX", histPrefixes[prefixInd].data()), "#it{x};#it{x}", HistType::kTH1F, {{1000, -2., 2.}}); - hY[prefixInd] = registry.add(Form("%s/hY", histPrefixes[prefixInd].data()), "#it{y};#it{y}", HistType::kTH1F, {{1000, -2., 2.}}); - hZ[prefixInd] = registry.add(Form("%s/hZ", histPrefixes[prefixInd].data()), "#it{z};#it{z}", HistType::kTH1F, {{1000, -10., 10.}}); - hAlpha[prefixInd] = registry.add(Form("%s/hAlpha", histPrefixes[prefixInd].data()), "alpha;alpha", HistType::kTH1F, {{1000, -5., 5.}}); - hTrackType[prefixInd] = registry.add(Form("%s/hTrackType", histPrefixes[prefixInd].data()), "Track Type;Track Type", HistType::kTH1F, {{300, 0., 300.}}); - hTPCNClsShared[prefixInd] = registry.add(Form("%s/hTPCNClsShared", histPrefixes[prefixInd].data()), "hTPCNClsShared;hTPCNClsShared", HistType::kTH1F, {{100, 0., 100.}}); - hDcaXY[prefixInd] = registry.add(Form("%s/hDcaXY", histPrefixes[prefixInd].data()), "#it{DcaXY};#it{DcaXY}", HistType::kTH1F, {{1000, -1., 1.}}); - hDcaZ[prefixInd] = registry.add(Form("%s/hDcaZ", histPrefixes[prefixInd].data()), "#it{DcaZ};#it{DcaZ}", HistType::kTH1F, {{1000, -1., 1.}}); + hTPCSigvsP[prefixInd] = registry.add(Form("%s/hTPCSigvsP", HistPrefixes[prefixInd].data()), genTagvsP("TPC Signal"), HistType::kTH2F, {{500, 0., 10.}, {1000, 0., 600.}}); + hTOFBetavsP[prefixInd] = registry.add(Form("%s/hTOFBetavsP", HistPrefixes[prefixInd].data()), genTagvsP("TOF beta"), HistType::kTH2F, {{500, 0., 10.}, {6000, -3., 3.}}); + hTOFSigvsP[prefixInd] = registry.add(Form("%s/hTOFSigvsP", HistPrefixes[prefixInd].data()), genTagvsP("TOF signal"), HistType::kTH2F, {{500, 0., 10.}, {10000, -5000., 80000.}}); + hFilteredTOFSigvsP[prefixInd] = registry.add(Form("%s/filtered/hTOFSigvsP", HistPrefixes[prefixInd].data()), genTagvsP("TOF signal (filtered)"), HistType::kTH2F, {{500, 0., 10.}, {10000, -5000., 80000.}}); + hTRDPattvsP[prefixInd] = registry.add(Form("%s/hTRDPattvsP", HistPrefixes[prefixInd].data()), genTagvsP("TRD pattern"), HistType::kTH2F, {{500, 0., 10.}, {110, -10., 100.}}); + hTRDSigvsP[prefixInd] = registry.add(Form("%s/hTRDSigvsP", HistPrefixes[prefixInd].data()), genTagvsP("TRD signal"), HistType::kTH2F, {{500, 0., 10.}, {2500, -2., 100.}}); + hP[prefixInd] = registry.add(Form("%s/hP", HistPrefixes[prefixInd].data()), "#it{p};#it{p} (GeV/#it{c})", HistType::kTH1F, {{500, 0., 6.}}); + hPt[prefixInd] = registry.add(Form("%s/hPt", HistPrefixes[prefixInd].data()), "#it{p}_{t};#it{p}_{t} (GeV/#it{c})", HistType::kTH1F, {{500, 0., 6.}}); + hPx[prefixInd] = registry.add(Form("%s/hPx", HistPrefixes[prefixInd].data()), "#it{p}_{x};#it{p}_{x} (GeV/#it{c})", HistType::kTH1F, {{1000, -6., 6.}}); + hPy[prefixInd] = registry.add(Form("%s/hPy", HistPrefixes[prefixInd].data()), "#it{p}_{y};#it{p}_{y} (GeV/#it{c})", HistType::kTH1F, {{1000, -6., 6.}}); + hPz[prefixInd] = registry.add(Form("%s/hPz", HistPrefixes[prefixInd].data()), "#it{p}_{z};#it{p}_{z} (GeV/#it{c})", HistType::kTH1F, {{1000, -6., 6.}}); + hX[prefixInd] = registry.add(Form("%s/hX", HistPrefixes[prefixInd].data()), "#it{x};#it{x}", HistType::kTH1F, {{1000, -2., 2.}}); + hY[prefixInd] = registry.add(Form("%s/hY", HistPrefixes[prefixInd].data()), "#it{y};#it{y}", HistType::kTH1F, {{1000, -2., 2.}}); + hZ[prefixInd] = registry.add(Form("%s/hZ", HistPrefixes[prefixInd].data()), "#it{z};#it{z}", HistType::kTH1F, {{1000, -10., 10.}}); + hAlpha[prefixInd] = registry.add(Form("%s/hAlpha", HistPrefixes[prefixInd].data()), "alpha;alpha", HistType::kTH1F, {{1000, -5., 5.}}); + hTrackType[prefixInd] = registry.add(Form("%s/hTrackType", HistPrefixes[prefixInd].data()), "Track Type;Track Type", HistType::kTH1F, {{300, 0., 300.}}); + hTPCNClsShared[prefixInd] = registry.add(Form("%s/hTPCNClsShared", HistPrefixes[prefixInd].data()), "hTPCNClsShared;hTPCNClsShared", HistType::kTH1F, {{100, 0., 100.}}); + hDcaXY[prefixInd] = registry.add(Form("%s/hDcaXY", HistPrefixes[prefixInd].data()), "#it{DcaXY};#it{DcaXY}", HistType::kTH1F, {{1000, -1., 1.}}); + hDcaZ[prefixInd] = registry.add(Form("%s/hDcaZ", HistPrefixes[prefixInd].data()), "#it{DcaZ};#it{DcaZ}", HistType::kTH1F, {{1000, -1., 1.}}); } template void initHistSignMC() { initHistSign(); - hPdgCode[prefixInd] = registry.add(Form("%s/hPdgCode", histPrefixes[prefixInd].data()), "#it{PdgCode};#it{PdgCode}", HistType::kTH1F, {{2500, 0., 2500.}}); - hIsPrimary[prefixInd] = registry.add(Form("%s/hIsPrimary", histPrefixes[prefixInd].data()), "#it{IsPrimary};#it{IsPrimary}", HistType::kTH1F, {{4, -0.5, 1.5}}); + hPdgCode[prefixInd] = registry.add(Form("%s/hPdgCode", HistPrefixes[prefixInd].data()), "#it{PdgCode};#it{PdgCode}", HistType::kTH1F, {{2500, 0., 2500.}}); + hIsPrimary[prefixInd] = registry.add(Form("%s/hIsPrimary", HistPrefixes[prefixInd].data()), "#it{IsPrimary};#it{IsPrimary}", HistType::kTH1F, {{4, -0.5, 1.5}}); } template @@ -235,8 +236,7 @@ struct PidMlProducer { void processDataAll(MyCollision const& collision, BigTracksData const& tracks) { for (const auto& track : tracks) { - pidTracksTableData(collision.centRun2V0M(), - collision.multFV0A(), collision.multFV0C(), collision.multFV0M(), + pidTracksTableData(collision.multFV0A(), collision.multFV0C(), collision.multFV0M(), collision.multFT0A(), collision.multFT0C(), collision.multFT0M(), collision.multZNA(), collision.multZNC(), collision.multTracklets(), collision.multTPC(), @@ -301,8 +301,7 @@ struct PidMlProducer { const auto mcParticle = track.mcParticle_as(); uint8_t isPrimary = static_cast(mcParticle.isPhysicalPrimary()); uint32_t pdgCode = mcParticle.pdgCode(); - pidTracksTableMC(collision.centRun2V0M(), - collision.multFV0A(), collision.multFV0C(), collision.multFV0M(), + pidTracksTableMC(collision.multFV0A(), collision.multFV0C(), collision.multFV0M(), collision.multFT0A(), collision.multFT0C(), collision.multFT0M(), collision.multZNA(), collision.multZNC(), collision.multTracklets(), collision.multTPC(), diff --git a/Tools/PIDML/pidOnnxInterface.h b/Tools/PIDML/pidOnnxInterface.h index 03e7bc19146..e97635468ee 100644 --- a/Tools/PIDML/pidOnnxInterface.h +++ b/Tools/PIDML/pidOnnxInterface.h @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file pidONNXInterface.h +/// \file pidOnnxInterface.h /// \brief A class that wraps PID ML ONNX model. See README.md for more detailed instructions. /// /// \author Maja Kabus @@ -27,15 +27,15 @@ namespace pidml_pt_cuts { -static constexpr int nPids = 6; -static constexpr int nCutVars = kNDetectors; -constexpr int pids[nPids] = {211, 321, 2212, -211, -321, -2212}; -auto pids_v = std::vector{pids, pids + nPids}; -constexpr double certainties[nPids] = {0.5, 0.5, 0.5, 0.5, 0.5, 0.5}; -auto certainties_v = std::vector{certainties, certainties + nPids}; +static constexpr int NPids = 6; +static constexpr int NCutVars = kNDetectors; +constexpr int Pids[NPids] = {211, 321, 2212, -211, -321, -2212}; +auto pidsV = std::vector{Pids, Pids + NPids}; +constexpr double Certainties[NPids] = {0.5, 0.5, 0.5, 0.5, 0.5, 0.5}; +auto certaintiesV = std::vector{Certainties, Certainties + NPids}; // default values for the cuts -constexpr double cuts[nPids][nCutVars] = {{0.0, 0.5, 0.8}, {0.0, 0.5, 0.8}, {0.0, 0.5, 0.8}, {0.0, 0.5, 0.8}, {0.0, 0.5, 0.8}, {0.0, 0.5, 0.8}}; +constexpr double Cuts[NPids][NCutVars] = {{0.0, 0.5, 0.8}, {0.0, 0.5, 0.8}, {0.0, 0.5, 0.8}, {0.0, 0.5, 0.8}, {0.0, 0.5, 0.8}, {0.0, 0.5, 0.8}}; // row labels static const std::vector pidLabels = { "211", "321", "2212", "0211", "0321", "02212"}; @@ -45,16 +45,17 @@ static const std::vector cutVarLabels = { } // namespace pidml_pt_cuts +template struct PidONNXInterface { - PidONNXInterface(std::string& localPath, std::string& ccdbPath, bool useCCDB, o2::ccdb::CcdbApi& ccdbApi, uint64_t timestamp, std::vector const& pids, o2::framework::LabeledArray const& pLimits, std::vector const& minCertainties, bool autoMode) : mNPids{pids.size()}, mPLimits{pLimits} + PidONNXInterface(std::string& localPath, std::string& ccdbPath, bool useCCDB, o2::ccdb::CcdbApi& ccdbApi, uint64_t timestamp, std::vector const& Pids, o2::framework::LabeledArray const& pLimits, std::vector const& minCertainties, bool autoMode) : mNPids{Pids.size()}, mPLimits{pLimits} { - if (pids.size() == 0) { + if (Pids.size() == 0) { LOG(fatal) << "PID ML Interface needs at least 1 output pid to predict"; } std::set tmp; - for (auto& pid : pids) { + for (const auto& pid : Pids) { if (!tmp.insert(pid).second) { - LOG(fatal) << "PID ML Interface: output pids cannot repeat!"; + LOG(fatal) << "PID ML Interface: output Pids cannot repeat!"; } } @@ -63,12 +64,12 @@ struct PidONNXInterface { fillDefaultConfiguration(minCertaintiesFilled); } else { if (minCertainties.size() != mNPids) { - LOG(fatal) << "PID ML Interface: min certainties vector must be of the same size as the output pids vector"; + LOG(fatal) << "PID ML Interface: min Certainties vector must be of the same size as the output Pids vector"; } minCertaintiesFilled = minCertainties; } for (std::size_t i = 0; i < mNPids; i++) { - mModels.emplace_back(localPath, ccdbPath, useCCDB, ccdbApi, timestamp, pids[i], minCertaintiesFilled[i], mPLimits[i]); + mModels.emplace_back(localPath, ccdbPath, useCCDB, ccdbApi, timestamp, Pids[i], minCertaintiesFilled[i], mPLimits[i]); } } PidONNXInterface() = default; @@ -78,8 +79,7 @@ struct PidONNXInterface { PidONNXInterface& operator=(const PidONNXInterface&) = delete; ~PidONNXInterface() = default; - template - float applyModel(const T& track, int pid) + float applyModel(const T::iterator& track, int pid) { for (std::size_t i = 0; i < mNPids; i++) { if (mModels[i].mPid == pid) { @@ -90,8 +90,7 @@ struct PidONNXInterface { return -1.0f; } - template - bool applyModelBoolean(const T& track, int pid) + bool applyModelBoolean(const T::iterator& track, int pid) { for (std::size_t i = 0; i < mNPids; i++) { if (mModels[i].mPid == pid) { @@ -106,11 +105,11 @@ struct PidONNXInterface { void fillDefaultConfiguration(std::vector& minCertainties) { // FIXME: A more sophisticated strategy should be based on pid values as well - mPLimits = o2::framework::LabeledArray{pidml_pt_cuts::cuts[0], pidml_pt_cuts::nPids, pidml_pt_cuts::nCutVars, pidml_pt_cuts::pidLabels, pidml_pt_cuts::cutVarLabels}; + mPLimits = o2::framework::LabeledArray{pidml_pt_cuts::Cuts[0], pidml_pt_cuts::NPids, pidml_pt_cuts::NCutVars, pidml_pt_cuts::pidLabels, pidml_pt_cuts::cutVarLabels}; minCertainties = std::vector(mNPids, 0.5); } - std::vector mModels; + std::vector> mModels; std::size_t mNPids; o2::framework::LabeledArray mPLimits; }; diff --git a/Tools/PIDML/pidOnnxModel.h b/Tools/PIDML/pidOnnxModel.h index 207bc18cd8e..1c48a84f2b8 100644 --- a/Tools/PIDML/pidOnnxModel.h +++ b/Tools/PIDML/pidOnnxModel.h @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file pidONNXModel.h +/// \file pidOnnxModel.h /// \brief A class that wraps PID ML ONNX model. See README.md for more detailed instructions. /// /// \author Maja Kabus @@ -17,12 +17,17 @@ #ifndef TOOLS_PIDML_PIDONNXMODEL_H_ #define TOOLS_PIDML_PIDONNXMODEL_H_ +#include #include +#include #include +#include +#include #include +#include #include -#include #include +#include #include #include #include @@ -37,8 +42,6 @@ #include "CCDB/CcdbApi.h" #include "Tools/PIDML/pidUtils.h" -using namespace pidml::pidutils; - enum PidMLDetector { kTPCOnly = 0, kTPCTOF, @@ -46,11 +49,13 @@ enum PidMLDetector { kNDetectors ///< number of available detectors configurations }; +using MomentumLimitsMatrix = std::array; + namespace pidml_pt_cuts { // TODO: for now first limit wouldn't be used, // network needs TPC, so we can either do not cut it by p or return 0.0f as prediction -constexpr std::array defaultModelPLimits({0.0, 0.5, 0.8}); +constexpr MomentumLimitsMatrix defaultModelPLimits({0.0, 0.5, 0.8}); } // namespace pidml_pt_cuts // TODO: Copied from cefpTask, shall we put it in some common utils code? @@ -73,6 +78,7 @@ bool readJsonFile(const std::string& config, rapidjson::Document& d) } } // namespace +template struct PidONNXModel { public: PidONNXModel(std::string& localPath, std::string& ccdbPath, bool useCCDB, o2::ccdb::CcdbApi& ccdbApi, uint64_t timestamp, @@ -135,14 +141,12 @@ struct PidONNXModel { PidONNXModel& operator=(const PidONNXModel&) = delete; ~PidONNXModel() = default; - template - float applyModel(const T& track) + float applyModel(const typename T::iterator& track) { return getModelOutput(track); } - template - bool applyModelBoolean(const T& track) + bool applyModelBoolean(const typename T::iterator& track) { return getModelOutput(track) >= mMinCertainty; } @@ -202,85 +206,84 @@ struct PidONNXModel { LOG(info) << "Using configuration files: " << localTrainColumnsPath << ", " << localScalingParamsPath; if (readJsonFile(localTrainColumnsPath, trainColumnsDoc)) { - for (auto& param : trainColumnsDoc["columns_for_training"].GetArray()) { - mTrainColumns.emplace_back(param.GetString()); + for (const auto& param : trainColumnsDoc["columns_for_training"].GetArray()) { + auto columnLabel = param.GetString(); + mTrainColumns.emplace_back(columnLabel); + mGetters.emplace_back(o2::soa::row_helpers::getColumnGetterByLabel(columnLabel)); } } if (readJsonFile(localScalingParamsPath, scalingParamsDoc)) { - for (auto& param : scalingParamsDoc["data"].GetArray()) { + for (const auto& param : scalingParamsDoc["data"].GetArray()) { mScalingParams[param[0].GetString()] = std::make_pair(param[1].GetFloat(), param[2].GetFloat()); } } } - template - std::vector createInputsSingle(const T& track) + static float scale(float value, const std::pair& scalingParams) { - // TODO: Hardcoded for now. Planning to implement RowView extension to get runtime access to selected columns - // sign is short, trackType and tpcNClsShared uint8_t + return (value - scalingParams.first) / scalingParams.second; + } - float scaledTPCSignal = (track.tpcSignal() - mScalingParams.at("fTPCSignal").first) / mScalingParams.at("fTPCSignal").second; + std::vector getValues(const typename T::iterator& track) + { + std::vector output; + output.reserve(mTrainColumns.size()); - std::vector inputValues{scaledTPCSignal}; + bool useTOF = !pidml::pidutils::tofMissing(track) && pidml::pidutils::inPLimit(track, mPLimits[kTPCTOF]); + bool useTRD = !pidml::pidutils::trdMissing(track) && pidml::pidutils::inPLimit(track, mPLimits[kTPCTOFTRD]); - // When TRD Signal shouldn't be used we pass quiet_NaNs to the network - if (!inPLimit(track, mPLimits[kTPCTOFTRD]) || trdMissing(track)) { - inputValues.push_back(std::numeric_limits::quiet_NaN()); - inputValues.push_back(std::numeric_limits::quiet_NaN()); - } else { - float scaledTRDSignal = (track.trdSignal() - mScalingParams.at("fTRDSignal").first) / mScalingParams.at("fTRDSignal").second; - inputValues.push_back(scaledTRDSignal); - inputValues.push_back(track.trdPattern()); - } + for (uint32_t i = 0; i < mTrainColumns.size(); ++i) { + auto& columnLabel = mTrainColumns[i]; - // When TOF Signal shouldn't be used we pass quiet_NaNs to the network - if (!inPLimit(track, mPLimits[kTPCTOF]) || tofMissing(track)) { - inputValues.push_back(std::numeric_limits::quiet_NaN()); - inputValues.push_back(std::numeric_limits::quiet_NaN()); - } else { - float scaledTOFSignal = (track.tofSignal() - mScalingParams.at("fTOFSignal").first) / mScalingParams.at("fTOFSignal").second; - float scaledBeta = (track.beta() - mScalingParams.at("fBeta").first) / mScalingParams.at("fBeta").second; - inputValues.push_back(scaledTOFSignal); - inputValues.push_back(scaledBeta); - } + if ( + ((columnLabel == "fTRDSignal" || columnLabel == "fTRDPattern") && !useTRD) || + ((columnLabel == "fTOFSignal" || columnLabel == "fBeta") && !useTOF)) { + output.push_back(std::numeric_limits::quiet_NaN()); + continue; + } + + std::optional> scalingParams = std::nullopt; + + auto scalingParamsEntry = mScalingParams.find(columnLabel); + if (scalingParamsEntry != mScalingParams.end()) { + scalingParams = scalingParamsEntry->second; + } + + float value = mGetters[i](track); - float scaledX = (track.x() - mScalingParams.at("fX").first) / mScalingParams.at("fX").second; - float scaledY = (track.y() - mScalingParams.at("fY").first) / mScalingParams.at("fY").second; - float scaledZ = (track.z() - mScalingParams.at("fZ").first) / mScalingParams.at("fZ").second; - float scaledAlpha = (track.alpha() - mScalingParams.at("fAlpha").first) / mScalingParams.at("fAlpha").second; - float scaledTPCNClsShared = (static_cast(track.tpcNClsShared()) - mScalingParams.at("fTPCNClsShared").first) / mScalingParams.at("fTPCNClsShared").second; - float scaledDcaXY = (track.dcaXY() - mScalingParams.at("fDcaXY").first) / mScalingParams.at("fDcaXY").second; - float scaledDcaZ = (track.dcaZ() - mScalingParams.at("fDcaZ").first) / mScalingParams.at("fDcaZ").second; + if (scalingParams) { + value = scale(value, scalingParams.value()); + } - inputValues.insert(inputValues.end(), {track.p(), track.pt(), track.px(), track.py(), track.pz(), static_cast(track.sign()), scaledX, scaledY, scaledZ, scaledAlpha, static_cast(track.trackType()), scaledTPCNClsShared, scaledDcaXY, scaledDcaZ}); + output.push_back(value); + } - return inputValues; + return output; } - template - float getModelOutput(const T& track) + float getModelOutput(const typename T::iterator& track) { // First rank of the expected model input is -1 which means that it is dynamic axis. // Axis is exported as dynamic to make it possible to run model inference with the batch of // tracks at once in the future (batch would need to have the same amount of quiet_NaNs in each row). // For now we hardcode 1. - static constexpr int64_t batch_size = 1; - auto input_shape = mInputShapes[0]; - input_shape[0] = batch_size; + static constexpr int64_t BatchSize = 1; + auto inputShape = mInputShapes[0]; + inputShape[0] = BatchSize; - std::vector inputTensorValues = createInputsSingle(track); + std::vector inputTensorValues = getValues(track); std::vector inputTensors; #if __has_include() - inputTensors.emplace_back(Ort::Experimental::Value::CreateTensor(inputTensorValues.data(), inputTensorValues.size(), input_shape)); + inputTensors.emplace_back(Ort::Experimental::Value::CreateTensor(inputTensorValues.data(), inputTensorValues.size(), inputShape)); #else - Ort::MemoryInfo mem_info = Ort::MemoryInfo::CreateCpu(OrtAllocatorType::OrtArenaAllocator, OrtMemType::OrtMemTypeDefault); - inputTensors.emplace_back(Ort::Value::CreateTensor(mem_info, inputTensorValues.data(), inputTensorValues.size(), input_shape.data(), input_shape.size())); + Ort::MemoryInfo memInfo = Ort::MemoryInfo::CreateCpu(OrtAllocatorType::OrtArenaAllocator, OrtMemType::OrtMemTypeDefault); + inputTensors.emplace_back(Ort::Value::CreateTensor(memInfo, inputTensorValues.data(), inputTensorValues.size(), inputShape.data(), inputShape.size())); #endif // Double-check the dimensions of the input tensor assert(inputTensors[0].IsTensor() && - inputTensors[0].GetTensorTypeAndShapeInfo().GetShape() == input_shape); + inputTensors[0].GetTensorTypeAndShapeInfo().GetShape() == inputShape); LOG(debug) << "input tensor shape: " << printShape(inputTensors[0].GetTensorTypeAndShapeInfo().GetShape()); try { @@ -303,8 +306,8 @@ struct PidONNXModel { assert(outputTensors.size() == mOutputNames.size() && outputTensors[0].IsTensor()); LOG(debug) << "output tensor shape: " << printShape(outputTensors[0].GetTensorTypeAndShapeInfo().GetShape()); - const float* output_value = outputTensors[0].GetTensorData(); - float certainty = *output_value; + const float* outputValue = outputTensors[0].GetTensorData(); + float certainty = *outputValue; return certainty; } catch (const Ort::Exception& exception) { LOG(error) << "Error running model inference: " << exception.what(); @@ -323,6 +326,7 @@ struct PidONNXModel { } std::vector mTrainColumns; + std::vector mGetters; std::map> mScalingParams; std::shared_ptr mEnv = nullptr; diff --git a/Tools/PIDML/qaPid.cxx b/Tools/PIDML/qaPid.cxx index 4efbbbc077a..3480ad7c366 100644 --- a/Tools/PIDML/qaPid.cxx +++ b/Tools/PIDML/qaPid.cxx @@ -9,6 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. /// +/// \file qaPid.cxx /// \brief Task to check PID efficiency /// \author Łukasz Sawicki /// \since @@ -20,15 +21,16 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/PIDResponse.h" #include +#include using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; -struct EvaluatePid { +struct QaPid { double combinedSignal(float val1, float val2) { - return sqrt(pow(val1, 2) + pow(val2, 2)); + return std::sqrt(std::pow(val1, 2) + std::pow(val2, 2)); } int indexOfSmallestElement(const float array[], int size) @@ -41,113 +43,119 @@ struct EvaluatePid { return index; } + enum ContaminationIn { + kPion, + kProton, + kKaon + }; + void fillContaminationRegistry(int i, int pdgCode, double pt) { - if (i == 0) { - if (pdgCode == 211) { + if (i == ContaminationIn::kPion) { + if (pdgCode == PDG_t::kPiPlus) { histReg.fill(HIST("contamination/211in211"), pt); } - if (pdgCode == -211) { + if (pdgCode == PDG_t::kPiMinus) { histReg.fill(HIST("contamination/0211in211"), pt); } - if (pdgCode == 2212) { + if (pdgCode == PDG_t::kProton) { histReg.fill(HIST("contamination/2212in211"), pt); } - if (pdgCode == -2212) { + if (pdgCode == PDG_t::kProtonBar) { histReg.fill(HIST("contamination/02212in211"), pt); } - if (pdgCode == 321) { + if (pdgCode == PDG_t::kKPlus) { histReg.fill(HIST("contamination/321in211"), pt); } - if (pdgCode == -321) { + if (pdgCode == PDG_t::kKMinus) { histReg.fill(HIST("contamination/0321in211"), pt); } - if (pdgCode == 11) { + if (pdgCode == PDG_t::kElectron) { histReg.fill(HIST("contamination/11in211"), pt); } - if (pdgCode == -11) { + if (pdgCode == PDG_t::kPositron) { histReg.fill(HIST("contamination/011in211"), pt); } - if (pdgCode == 13) { + if (pdgCode == PDG_t::kMuonMinus) { histReg.fill(HIST("contamination/13in211"), pt); } - if (pdgCode == -13) { + if (pdgCode == PDG_t::kMuonPlus) { histReg.fill(HIST("contamination/013in211"), pt); } - } else if (i == 1) { - if (pdgCode == 211) { + } else if (i == ContaminationIn::kProton) { + if (pdgCode == PDG_t::kPiPlus) { histReg.fill(HIST("contamination/211in2212"), pt); } - if (pdgCode == -211) { + if (pdgCode == PDG_t::kPiMinus) { histReg.fill(HIST("contamination/0211in2212"), pt); } - if (pdgCode == 2212) { + if (pdgCode == PDG_t::kProton) { histReg.fill(HIST("contamination/2212in2212"), pt); } - if (pdgCode == -2212) { + if (pdgCode == PDG_t::kProtonBar) { histReg.fill(HIST("contamination/02212in2212"), pt); } - if (pdgCode == 321) { + if (pdgCode == PDG_t::kKPlus) { histReg.fill(HIST("contamination/321in2212"), pt); } - if (pdgCode == -321) { + if (pdgCode == PDG_t::kKMinus) { histReg.fill(HIST("contamination/0321in2212"), pt); } - if (pdgCode == 11) { + if (pdgCode == PDG_t::kElectron) { histReg.fill(HIST("contamination/11in2212"), pt); } - if (pdgCode == -11) { + if (pdgCode == PDG_t::kPositron) { histReg.fill(HIST("contamination/011in2212"), pt); } - if (pdgCode == 13) { + if (pdgCode == PDG_t::kMuonMinus) { histReg.fill(HIST("contamination/13in2212"), pt); } - if (pdgCode == -13) { + if (pdgCode == PDG_t::kMuonPlus) { histReg.fill(HIST("contamination/013in2212"), pt); } - } else if (i == 2) { - if (pdgCode == 211) { + } else if (i == ContaminationIn::kKaon) { + if (pdgCode == PDG_t::kPiPlus) { histReg.fill(HIST("contamination/211in321"), pt); } - if (pdgCode == -211) { + if (pdgCode == PDG_t::kPiMinus) { histReg.fill(HIST("contamination/0211in321"), pt); } - if (pdgCode == 2212) { + if (pdgCode == PDG_t::kProton) { histReg.fill(HIST("contamination/2212in321"), pt); } - if (pdgCode == -2212) { + if (pdgCode == PDG_t::kProtonBar) { histReg.fill(HIST("contamination/02212in321"), pt); } - if (pdgCode == 321) { + if (pdgCode == PDG_t::kKPlus) { histReg.fill(HIST("contamination/321in321"), pt); } - if (pdgCode == -321) { + if (pdgCode == PDG_t::kKMinus) { histReg.fill(HIST("contamination/0321in321"), pt); } - if (pdgCode == 11) { + if (pdgCode == PDG_t::kElectron) { histReg.fill(HIST("contamination/11in321"), pt); } - if (pdgCode == -11) { + if (pdgCode == PDG_t::kPositron) { histReg.fill(HIST("contamination/011in321"), pt); } - if (pdgCode == 13) { + if (pdgCode == PDG_t::kMuonMinus) { histReg.fill(HIST("contamination/13in321"), pt); } - if (pdgCode == -13) { + if (pdgCode == PDG_t::kMuonPlus) { histReg.fill(HIST("contamination/013in321"), pt); } } @@ -157,13 +165,13 @@ struct EvaluatePid { void fillPidHistos(const T& track, const int pdgCode, bool isPidTrue) { if (isPidTrue) { - histReg.fill(HIST(pidTrueRegistryNames[i]), track.pt()); + histReg.fill(HIST(PidTrueRegistryNames[i]), track.pt()); histReg.fill(HIST(TPCPidTrueRegistryNames[i]), track.p(), track.tpcSignal()); histReg.fill(HIST("TPCSignalPidTrue"), track.p(), track.tpcSignal()); histReg.fill(HIST("TOFSignalPidTrue"), track.p(), track.beta()); histReg.fill(HIST(TOFPidTrueRegistryNames[i]), track.p(), track.beta()); } else { - histReg.fill(HIST(pidFalseRegistryNames[i]), track.pt()); + histReg.fill(HIST(PidFalseRegistryNames[i]), track.pt()); histReg.fill(HIST(TPCPidFalseRegistryNames[i]), track.p(), track.tpcSignal()); histReg.fill(HIST("TPCSignalPidFalse"), track.p(), track.tpcSignal()); histReg.fill(HIST("TOFSignalPidFalse"), track.p(), track.beta()); @@ -177,8 +185,8 @@ struct EvaluatePid { // nb of particles (5 particles - Pi, Pr, Ka, e, mu, and 5 antiparticles) static const int numParticles = 10; - static constexpr std::string_view pidTrueRegistryNames[numParticles] = {"pidTrue/211", "pidTrue/2212", "pidTrue/321", "pidTrue/11", "pidTrue/13", "pidTrue/0211", "pidTrue/02212", "pidTrue/0321", "pidTrue/011", "pidTrue/013"}; - static constexpr std::string_view pidFalseRegistryNames[numParticles] = {"pidFalse/211", "pidFalse/2212", "pidFalse/321", "pidFalse/11", "pidFalse/13", "pidFalse/0211", "pidFalse/02212", "pidFalse/0321", "pidFalse/011", "pidFalse/013"}; + static constexpr std::string_view PidTrueRegistryNames[numParticles] = {"pidTrue/211", "pidTrue/2212", "pidTrue/321", "pidTrue/11", "pidTrue/13", "pidTrue/0211", "pidTrue/02212", "pidTrue/0321", "pidTrue/011", "pidTrue/013"}; + static constexpr std::string_view PidFalseRegistryNames[numParticles] = {"pidFalse/211", "pidFalse/2212", "pidFalse/321", "pidFalse/11", "pidFalse/13", "pidFalse/0211", "pidFalse/02212", "pidFalse/0321", "pidFalse/011", "pidFalse/013"}; static constexpr std::string_view TPCPidTrueRegistryNames[numParticles] = {"TPCPidTrue/211", "TPCPidTrue/2212", "TPCPidTrue/321", "TPCPidTrue/11", "TPCPidTrue/13", "TPCPidTrue/0211", "TPCPidTrue/02212", "TPCPidTrue/0321", "TPCPidTrue/011", "TPCPidTrue/013"}; static constexpr std::string_view TPCPidFalseRegistryNames[numParticles] = {"TPCPidFalse/211", "TPCPidFalse/2212", "TPCPidFalse/321", "TPCPidFalse/11", "TPCPidFalse/13", "TPCPidFalse/0211", "TPCPidFalse/02212", "TPCPidFalse/0321", "TPCPidFalse/011", "TPCPidFalse/013"}; @@ -186,13 +194,13 @@ struct EvaluatePid { static constexpr std::string_view TOFPidTrueRegistryNames[numParticles] = {"TOFPidTrue/211", "TOFPidTrue/2212", "TOFPidTrue/321", "TOFPidTrue/11", "TOFPidTrue/13", "TOFPidTrue/0211", "TOFPidTrue/02212", "TOFPidTrue/0321", "TOFPidTrue/011", "TOFPidTrue/013"}; static constexpr std::string_view TOFPidFalseRegistryNames[numParticles] = {"TOFPidFalse/211", "TOFPidFalse/2212", "TOFPidFalse/321", "TOFPidFalse/11", "TOFPidFalse/13", "TOFPidFalse/0211", "TOFPidFalse/02212", "TOFPidFalse/0321", "TOFPidFalse/011", "TOFPidFalse/013"}; - static constexpr int pdgCodes[numParticles] = {211, 2212, 321, 11, 13, -211, -2212, -321, -11, -13}; - static constexpr int pidToPdg[numParticles] = {11, 13, 211, 321, 2212, -11, -13, -211, -321, -2212}; - // charge with index i corresponds to i-th particle from pdgCodes array - static constexpr int particleCharge[numParticles] = {1, 1, 1, -1, -1, -1, -1, -1, 1, 1}; + static constexpr int PdgCodes[numParticles] = {211, 2212, 321, 11, 13, -211, -2212, -321, -11, -13}; + static constexpr int PidToPdg[numParticles] = {11, 13, 211, 321, 2212, -11, -13, -211, -321, -2212}; + // charge with index i corresponds to i-th particle from PdgCodes array + static constexpr int ParticleCharge[numParticles] = {1, 1, 1, -1, -1, -1, -1, -1, 1, 1}; // momentum value when to switch from pid based only on TPC (below the value) to combination of TPC and TOF (above the value) // i-th momentum corresponds to the i-th particle - static constexpr float pSwitch[numParticles] = {0.5, 0.8, 0.5, 0.5, 0.5, 0.5, 0.8, 0.5, 0.5, 0.5}; + static constexpr float PSwitch[numParticles] = {0.5, 0.8, 0.5, 0.5, 0.5, 0.5, 0.8, 0.5, 0.5, 0.5}; static const int maxP = 5; // nb of bins for TH1 hists @@ -323,26 +331,26 @@ struct EvaluatePid { {"TOFPidFalse/011", "PID false e^{+};p (GeV/c); TOF #beta", {HistType::kTH2F, {{binsNb2D, 0.2, 10}, {110, 0, 1.1}}}}}}; template - void pidSimple(const T& track, const int pdgCode, const float tpcNSigmas[], const float tofNSigmas[], int /*arrLen*/) + void pidSimple(const T& track, const int pdgCode, const float tpcNSigmas[], const float tofNSigmas[]) { /* Simplest possible PID, accept particle when: TPCSignal < X if p < Value or - sqrt(TPCSignal^2 + TOFSignal^2) < X if p > Value + std::sqrt(TPCSignal^2 + TOFSignal^2) < X if p > Value */ const float p = track.p(); - if ((p < pSwitch[i]) & (track.sign() == particleCharge[i])) { - if (abs(tpcNSigmas[i]) < nsigmacut.value) { - if (pdgCode == pdgCodes[i]) { + if ((p < PSwitch[i]) & (track.sign() == ParticleCharge[i])) { + if (std::abs(tpcNSigmas[i]) < nsigmacut.value) { + if (pdgCode == PdgCodes[i]) { fillPidHistos(track, pdgCode, true); } else { fillPidHistos(track, pdgCode, false); } } - } else if ((p >= pSwitch[i]) & (track.sign() == particleCharge[i])) { - if (sqrt(pow(tpcNSigmas[i], 2) + pow(tofNSigmas[i], 2)) < nsigmacut.value) { - if (pdgCode == pdgCodes[i]) { + } else if ((p >= PSwitch[i]) & (track.sign() == ParticleCharge[i])) { + if (std::sqrt(std::pow(tpcNSigmas[i], 2) + std::pow(tofNSigmas[i], 2)) < nsigmacut.value) { + if (pdgCode == PdgCodes[i]) { fillPidHistos(track, pdgCode, true); } else { fillPidHistos(track, pdgCode, false); @@ -351,36 +359,36 @@ struct EvaluatePid { } } - template - void pidMinStrategy(const T& track, const int pdgCode, const float tpcNSigmas[], const float tofNSigmas[], int arrLen) + template + void pidMinStrategy(const T& track, const int pdgCode, const float tpcNSigmas[], const float tofNSigmas[]) { const float p = track.p(); // list of Nsigmas for particles - float particleNSigma[arrLen]; + float particleNSigma[kArrLen]; // calculate Nsigmas for every particle - for (int j = 0; j < arrLen; ++j) { - if (p < pSwitch[j]) { - particleNSigma[j] = abs(tpcNSigmas[j]); - } else if (p >= pSwitch[j]) { + for (int j = 0; j < kArrLen; ++j) { + if (p < PSwitch[j]) { + particleNSigma[j] = std::abs(tpcNSigmas[j]); + } else if (p >= PSwitch[j]) { particleNSigma[j] = combinedSignal(tpcNSigmas[j], tofNSigmas[j]); } } - if ((p < pSwitch[i]) & (track.sign() == particleCharge[i])) { - float tmp_NSigma = abs(tpcNSigmas[i]); - if ((tmp_NSigma < nsigmacut.value) & (indexOfSmallestElement(particleNSigma, arrLen) == i)) { - if (pdgCode == pdgCodes[i]) { + if ((p < PSwitch[i]) & (track.sign() == ParticleCharge[i])) { + float tmpNSigma = std::abs(tpcNSigmas[i]); + if ((tmpNSigma < nsigmacut.value) & (indexOfSmallestElement(particleNSigma, kArrLen) == i)) { + if (pdgCode == PdgCodes[i]) { fillPidHistos(track, pdgCode, true); } else { fillPidHistos(track, pdgCode, false); } } - } else if ((p >= pSwitch[i]) & (track.sign() == particleCharge[i])) { - float tmp_NSigma = combinedSignal(tpcNSigmas[i], tofNSigmas[i]); - if ((tmp_NSigma < nsigmacut.value) & (indexOfSmallestElement(particleNSigma, arrLen) == i)) { - if (pdgCode == pdgCodes[i]) { + } else if ((p >= PSwitch[i]) & (track.sign() == ParticleCharge[i])) { + float tmpNSigma = combinedSignal(tpcNSigmas[i], tofNSigmas[i]); + if ((tmpNSigma < nsigmacut.value) & (indexOfSmallestElement(particleNSigma, kArrLen) == i)) { + if (pdgCode == PdgCodes[i]) { fillPidHistos(track, pdgCode, true); } else { fillPidHistos(track, pdgCode, false); @@ -389,45 +397,45 @@ struct EvaluatePid { } } - template - void pidExclusiveStrategy(const T& track, const int pdgCode, const float tpcNSigmas[], const float tofNSigmas[], int arrLen) + template + void pidExclusiveStrategy(const T& track, const int pdgCode, const float tpcNSigmas[], const float tofNSigmas[]) { const float p = track.p(); // list of Nsigmas for particles - float particleNSigma[arrLen]; + float particleNSigma[kArrLen]; // calculate Nsigmas for every particle - for (int j = 0; j < arrLen; ++j) { - if (p < pSwitch[j]) { - particleNSigma[j] = abs(tpcNSigmas[j]); - } else if (p >= pSwitch[j]) { + for (int j = 0; j < kArrLen; ++j) { + if (p < PSwitch[j]) { + particleNSigma[j] = std::abs(tpcNSigmas[j]); + } else if (p >= PSwitch[j]) { particleNSigma[j] = combinedSignal(tpcNSigmas[j], tofNSigmas[j]); } } // check how many particles satisfy the condition int counts = 0; - for (int j = 0; j < arrLen; ++j) { + for (int j = 0; j < kArrLen; ++j) { if (particleNSigma[j] < nsigmacut.value) { counts++; } } if (counts == 1) { - if ((p < pSwitch[i]) & (track.sign() == particleCharge[i])) { - float tmp_NSigma = abs(tpcNSigmas[i]); - if ((tmp_NSigma < nsigmacut.value) & (indexOfSmallestElement(particleNSigma, arrLen) == i)) { - if (pdgCode == pdgCodes[i]) { + if ((p < PSwitch[i]) & (track.sign() == ParticleCharge[i])) { + float tmpNSigma = std::abs(tpcNSigmas[i]); + if ((tmpNSigma < nsigmacut.value) & (indexOfSmallestElement(particleNSigma, kArrLen) == i)) { + if (pdgCode == PdgCodes[i]) { fillPidHistos(track, pdgCode, true); } else { fillPidHistos(track, pdgCode, false); } } - } else if ((p >= pSwitch[i]) & (track.sign() == particleCharge[i])) { - float tmp_NSigma = combinedSignal(tpcNSigmas[i], tofNSigmas[i]); - if ((tmp_NSigma < nsigmacut.value) & (indexOfSmallestElement(particleNSigma, arrLen) == i)) { - if (pdgCode == pdgCodes[i]) { + } else if ((p >= PSwitch[i]) & (track.sign() == ParticleCharge[i])) { + float tmpNSigma = combinedSignal(tpcNSigmas[i], tofNSigmas[i]); + if ((tmpNSigma < nsigmacut.value) & (indexOfSmallestElement(particleNSigma, kArrLen) == i)) { + if (pdgCode == PdgCodes[i]) { fillPidHistos(track, pdgCode, true); } else { fillPidHistos(track, pdgCode, false); @@ -442,8 +450,8 @@ struct EvaluatePid { { // Convert PID to PDG code // We don't identify particles with PID bigger than Proton, putting dummy code so they will be skipped. - int bayesPdg = track.bayesID() > o2::track::PID::Proton ? 999 : pidToPdg[track.bayesID()]; - if (track.bayesID() <= o2::track::PID::Proton && track.sign() == -1 * particleCharge[track.bayesID()]) { // Check if antiparticle + int bayesPdg = track.bayesID() > o2::track::PID::Proton ? 999 : PidToPdg[track.bayesID()]; + if (track.bayesID() <= o2::track::PID::Proton && track.sign() == -1 * ParticleCharge[track.bayesID()]) { // Check if antiparticle bayesPdg += numParticles / 2; } return bayesPdg; @@ -453,7 +461,7 @@ struct EvaluatePid { void pidBayes(const T& track, const int pdgCode, const int bayesPdg) { if (bayesPdg == pdgCode) { - if (pdgCode == pdgCodes[i]) { + if (pdgCode == PdgCodes[i]) { fillPidHistos(track, pdgCode, true); } else { fillPidHistos(track, pdgCode, false); @@ -465,34 +473,25 @@ struct EvaluatePid { void fillMcHistos(const T& track, const int pdgCode) { // pions - if (pdgCode == 211) { + if (pdgCode == PDG_t::kPiPlus) { histReg.fill(HIST("MC/211"), track.pt()); - } else if (pdgCode == -211) { + } else if (pdgCode == PDG_t::kPiMinus) { histReg.fill(HIST("MC/0211"), track.pt()); - } - // protons - else if (pdgCode == 2212) { + } /* protons */ else if (pdgCode == PDG_t::kProton) { histReg.fill(HIST("MC/2212"), track.pt()); - } else if (pdgCode == -2212) { + } else if (pdgCode == PDG_t::kProtonBar) { histReg.fill(HIST("MC/02212"), track.pt()); - } - // kaons - else if (pdgCode == 321) { + } /* kaons */ else if (pdgCode == PDG_t::kKPlus) { histReg.fill(HIST("MC/321"), track.pt()); - } else if (pdgCode == -321) { + } else if (pdgCode == PDG_t::kKMinus) { histReg.fill(HIST("MC/0321"), track.pt()); - } - // electrons - else if (pdgCode == 11) { + } /* electrons */ else if (pdgCode == PDG_t::kElectron) { histReg.fill(HIST("MC/11"), track.pt()); - ; - } else if (pdgCode == -11) { + } else if (pdgCode == PDG_t::kPositron) { histReg.fill(HIST("MC/011"), track.pt()); - } - // muons - else if (pdgCode == 13) { + } /* muons */ else if (pdgCode == PDG_t::kMuonMinus) { histReg.fill(HIST("MC/13"), track.pt()); - } else if (pdgCode == -13) { + } else if (pdgCode == PDG_t::kMuonPlus) { histReg.fill(HIST("MC/013"), track.pt()); } else { histReg.fill(HIST("MC/else"), track.pt()); @@ -503,11 +502,18 @@ struct EvaluatePid { Configurable strategy{"strategy", 1, "1-PID with Nsigma method, 2-PID with NSigma and condition for minimal Nsigma value for particle, 3-Exclusive condition for NSigma, 4-Bayesian PID"}; Filter trackFilter = requireGlobalTrackInFilter(); - using pidTracks = soa::Filtered>; + using PidTracks = soa::Filtered>; + + enum PIDStrategy { + kSimple = 1, + kMin = 2, + kExclusive = 3, + kBayes = 4 + }; - void process(pidTracks const& tracks, aod::McParticles const& /*mcParticles*/) + void process(PidTracks const& tracks, aod::McParticles const& /*mcParticles*/) { - for (auto& track : tracks) { + for (const auto& track : tracks) { auto particle = track.mcParticle_as(); int pdgCode = particle.pdgCode(); @@ -518,22 +524,22 @@ struct EvaluatePid { const float tpcNSigmas[numParticles] = {track.tpcNSigmaPi(), track.tpcNSigmaPr(), track.tpcNSigmaKa(), track.tpcNSigmaEl(), track.tpcNSigmaMu()}; const float tofNSigmas[numParticles] = {track.tofNSigmaPi(), track.tofNSigmaPr(), track.tofNSigmaKa(), track.tofNSigmaEl(), track.tofNSigmaMu()}; - if (strategy.value == 1) { + if (strategy.value == PIDStrategy::kSimple) { // Simplest strategy. PID with Nsigma method only static_for<0, 9>([&](auto i) { - pidSimple(track, pdgCode, tpcNSigmas, tofNSigmas, 5); + pidSimple(track, pdgCode, tpcNSigmas, tofNSigmas); }); - } else if (strategy.value == 2) { + } else if (strategy.value == PIDStrategy::kMin) { // PID with Nsigma method and additional condition. Selected particle's Nsigma value must be the lowest in order to count particle static_for<0, 9>([&](auto i) { - pidMinStrategy(track, pdgCode, tpcNSigmas, tofNSigmas, 5); + pidMinStrategy(track, pdgCode, tpcNSigmas, tofNSigmas); }); - } else if (strategy.value == 3) { + } else if (strategy.value == PIDStrategy::kExclusive) { // Particle is counted only if one can satisfy the PID NSigma condition static_for<0, 9>([&](auto i) { - pidExclusiveStrategy(track, pdgCode, tpcNSigmas, tofNSigmas, 5); + pidExclusiveStrategy(track, pdgCode, tpcNSigmas, tofNSigmas); }); - } else if (strategy.value == 4) { + } else if (strategy.value == PIDStrategy::kBayes) { int bayesPdg = getPdgFromPid(track); static_for<0, 9>([&](auto i) { pidBayes(track, pdgCode, bayesPdg); @@ -546,6 +552,6 @@ struct EvaluatePid { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc), }; } diff --git a/Tools/PIDML/qaPidML.cxx b/Tools/PIDML/qaPidMl.cxx similarity index 77% rename from Tools/PIDML/qaPidML.cxx rename to Tools/PIDML/qaPidMl.cxx index 54cafc437ab..1fee5330de4 100644 --- a/Tools/PIDML/qaPidML.cxx +++ b/Tools/PIDML/qaPidMl.cxx @@ -9,6 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. /// +/// \file qaPidMl.cxx /// \brief Task to check ML PID efficiency. Based on Maja's simpleApplyPidOnnxModel.cxx code /// \author Łukasz Sawicki /// \since @@ -22,13 +23,14 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/PIDResponse.h" #include +#include #include "Tools/PIDML/pidOnnxModel.h" using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; -struct QaPidML { +struct QaPidMl { static const int maxP = 5; // nb of bins for TH1 hists static const int binsNb = 100; @@ -36,8 +38,8 @@ struct QaPidML { static const int binsNb2D = 1000; static const int numParticles = 3; - static constexpr std::string_view pidTrueRegistryNames[numParticles] = {"pidTrue/211", "pidTrue/2212", "pidTrue/321"}; - static constexpr std::string_view pidFalseRegistryNames[numParticles] = {"pidFalse/211", "pidFalse/2212", "pidFalse/321"}; + static constexpr std::string_view PidTrueRegistryNames[numParticles] = {"pidTrue/211", "pidTrue/2212", "pidTrue/321"}; + static constexpr std::string_view PidFalseRegistryNames[numParticles] = {"pidFalse/211", "pidFalse/2212", "pidFalse/321"}; static constexpr std::string_view TPCPidTrueRegistryNames[numParticles] = {"TPCPidTrue/211", "TPCPidTrue/2212", "TPCPidTrue/321"}; static constexpr std::string_view TPCPidFalseRegistryNames[numParticles] = {"TPCPidFalse/211", "TPCPidFalse/2212", "TPCPidFalse/321"}; @@ -46,11 +48,11 @@ struct QaPidML { static constexpr std::string_view TOFPidFalseRegistryNames[numParticles] = {"TOFPidFalse/211", "TOFPidFalse/2212", "TOFPidFalse/321"}; // available particles: 211, 2212, 321 - static constexpr int particlesPdgCode[numParticles] = {211, 2212, 321}; + static constexpr int ParticlesPdgCode[numParticles] = {211, 2212, 321}; // values of track momentum when to switch from only TPC signal to combined TPC and TOF signal and to TPC+TOF+TRD // i-th momentum corresponds to the i-th particle - static constexpr double pSwitchValue[numParticles][kNDetectors] = {{0.0, 0.5, 0.8}, {0.0, 0.8, 0.8}, {0.0, 0.5, 0.8}}; + static constexpr double PSwitchValue[numParticles][kNDetectors] = {{0.0, 0.5, 0.8}, {0.0, 0.8, 0.8}, {0.0, 0.5, 0.8}}; HistogramRegistry histReg{ "allHistograms", @@ -130,113 +132,119 @@ struct QaPidML { {"TOFPidFalse/2212", "PID false p;p (GeV/c); TOF #beta", {HistType::kTH2F, {{binsNb2D, 0.2, 10}, {110, 0, 1.1}}}}, {"TOFPidFalse/321", "PID false K^{+};p (GeV/c); TOF #beta", {HistType::kTH2F, {{binsNb2D, 0.2, 10}, {110, 0, 1.1}}}}}}; + enum ContaminationIn { + kPion, + kProton, + kKaon + }; + void fillContaminationRegistry(int i, int pdgCode, double pt) { - if (i == 0) { - if (pdgCode == 211) { + if (i == ContaminationIn::kPion) { + if (pdgCode == PDG_t::kPiPlus) { histReg.fill(HIST("contamination/211in211"), pt); } - if (pdgCode == -211) { + if (pdgCode == PDG_t::kPiMinus) { histReg.fill(HIST("contamination/0211in211"), pt); } - if (pdgCode == 2212) { + if (pdgCode == PDG_t::kProton) { histReg.fill(HIST("contamination/2212in211"), pt); } - if (pdgCode == -2212) { + if (pdgCode == PDG_t::kProtonBar) { histReg.fill(HIST("contamination/02212in211"), pt); } - if (pdgCode == 321) { + if (pdgCode == PDG_t::kKPlus) { histReg.fill(HIST("contamination/321in211"), pt); } - if (pdgCode == -321) { + if (pdgCode == PDG_t::kKMinus) { histReg.fill(HIST("contamination/0321in211"), pt); } - if (pdgCode == 11) { + if (pdgCode == PDG_t::kElectron) { histReg.fill(HIST("contamination/11in211"), pt); } - if (pdgCode == -11) { + if (pdgCode == PDG_t::kPositron) { histReg.fill(HIST("contamination/011in211"), pt); } - if (pdgCode == 13) { + if (pdgCode == PDG_t::kMuonMinus) { histReg.fill(HIST("contamination/13in211"), pt); } - if (pdgCode == -13) { + if (pdgCode == PDG_t::kMuonPlus) { histReg.fill(HIST("contamination/013in211"), pt); } - } else if (i == 1) { - if (pdgCode == 211) { + } else if (i == ContaminationIn::kProton) { + if (pdgCode == PDG_t::kPiPlus) { histReg.fill(HIST("contamination/211in2212"), pt); } - if (pdgCode == -211) { + if (pdgCode == PDG_t::kPiMinus) { histReg.fill(HIST("contamination/0211in2212"), pt); } - if (pdgCode == 2212) { + if (pdgCode == PDG_t::kProton) { histReg.fill(HIST("contamination/2212in2212"), pt); } - if (pdgCode == -2212) { + if (pdgCode == PDG_t::kProtonBar) { histReg.fill(HIST("contamination/02212in2212"), pt); } - if (pdgCode == 321) { + if (pdgCode == PDG_t::kKPlus) { histReg.fill(HIST("contamination/321in2212"), pt); } - if (pdgCode == -321) { + if (pdgCode == PDG_t::kKMinus) { histReg.fill(HIST("contamination/0321in2212"), pt); } - if (pdgCode == 11) { + if (pdgCode == PDG_t::kElectron) { histReg.fill(HIST("contamination/11in2212"), pt); } - if (pdgCode == -11) { + if (pdgCode == PDG_t::kPositron) { histReg.fill(HIST("contamination/011in2212"), pt); } - if (pdgCode == 13) { + if (pdgCode == PDG_t::kMuonMinus) { histReg.fill(HIST("contamination/13in2212"), pt); } - if (pdgCode == -13) { + if (pdgCode == PDG_t::kMuonPlus) { histReg.fill(HIST("contamination/013in2212"), pt); } - } else if (i == 2) { - if (pdgCode == 211) { + } else if (i == ContaminationIn::kKaon) { + if (pdgCode == PDG_t::kPiPlus) { histReg.fill(HIST("contamination/211in321"), pt); } - if (pdgCode == -211) { + if (pdgCode == PDG_t::kPiMinus) { histReg.fill(HIST("contamination/0211in321"), pt); } - if (pdgCode == 2212) { + if (pdgCode == PDG_t::kProton) { histReg.fill(HIST("contamination/2212in321"), pt); } - if (pdgCode == -2212) { + if (pdgCode == PDG_t::kProtonBar) { histReg.fill(HIST("contamination/02212in321"), pt); } - if (pdgCode == 321) { + if (pdgCode == PDG_t::kKPlus) { histReg.fill(HIST("contamination/321in321"), pt); } - if (pdgCode == -321) { + if (pdgCode == PDG_t::kKMinus) { histReg.fill(HIST("contamination/0321in321"), pt); } - if (pdgCode == 11) { + if (pdgCode == PDG_t::kElectron) { histReg.fill(HIST("contamination/11in321"), pt); } - if (pdgCode == -11) { + if (pdgCode == PDG_t::kPositron) { histReg.fill(HIST("contamination/011in321"), pt); } - if (pdgCode == 13) { + if (pdgCode == PDG_t::kMuonMinus) { histReg.fill(HIST("contamination/13in321"), pt); } - if (pdgCode == -13) { + if (pdgCode == PDG_t::kMuonPlus) { histReg.fill(HIST("contamination/013in321"), pt); } } @@ -245,34 +253,34 @@ struct QaPidML { template void fillMcHistos(const T& track, const int pdgCode) { - if (pdgCode == 211) { + if (pdgCode == PDG_t::kPiPlus) { // pions histReg.fill(HIST("MC/211"), track.pt()); - } else if (pdgCode == -211) { + } else if (pdgCode == PDG_t::kPiMinus) { // antipions histReg.fill(HIST("MC/0211"), track.pt()); - } else if (pdgCode == 2212) { + } else if (pdgCode == PDG_t::kProton) { // protons histReg.fill(HIST("MC/2212"), track.pt()); - } else if (pdgCode == -2212) { + } else if (pdgCode == PDG_t::kProtonBar) { // antiprotons histReg.fill(HIST("MC/02212"), track.pt()); - } else if (pdgCode == 321) { + } else if (pdgCode == PDG_t::kKPlus) { // kaons histReg.fill(HIST("MC/321"), track.pt()); - } else if (pdgCode == -321) { + } else if (pdgCode == PDG_t::kKMinus) { // antikaons histReg.fill(HIST("MC/0321"), track.pt()); - } else if (pdgCode == 11) { + } else if (pdgCode == PDG_t::kElectron) { // electrons histReg.fill(HIST("MC/11"), track.pt()); - } else if (pdgCode == -11) { + } else if (pdgCode == PDG_t::kPositron) { // positrons histReg.fill(HIST("MC/011"), track.pt()); - } else if (pdgCode == 13) { + } else if (pdgCode == PDG_t::kMuonMinus) { // muons histReg.fill(HIST("MC/13"), track.pt()); - } else if (pdgCode == -13) { + } else if (pdgCode == PDG_t::kMuonPlus) { // antimuons histReg.fill(HIST("MC/013"), track.pt()); } else { @@ -284,13 +292,13 @@ struct QaPidML { void fillPidHistos(const T& track, const int pdgCode, bool isPidTrue) { if (isPidTrue) { - histReg.fill(HIST(pidTrueRegistryNames[i]), track.pt()); + histReg.fill(HIST(PidTrueRegistryNames[i]), track.pt()); histReg.fill(HIST(TPCPidTrueRegistryNames[i]), track.p(), track.tpcSignal()); histReg.fill(HIST("TPCSignalPidTrue"), track.p(), track.tpcSignal()); histReg.fill(HIST("TOFSignalPidTrue"), track.p(), track.beta()); histReg.fill(HIST(TOFPidTrueRegistryNames[i]), track.p(), track.beta()); } else { - histReg.fill(HIST(pidFalseRegistryNames[i]), track.pt()); + histReg.fill(HIST(PidFalseRegistryNames[i]), track.pt()); histReg.fill(HIST(TPCPidFalseRegistryNames[i]), track.p(), track.tpcSignal()); histReg.fill(HIST("TPCSignalPidFalse"), track.p(), track.tpcSignal()); histReg.fill(HIST("TOFSignalPidFalse"), track.p(), track.beta()); @@ -301,26 +309,28 @@ struct QaPidML { } } + static constexpr float kCertaintyThreshold = 0.5f; + int getParticlePdg(float pidCertainties[]) { // index of the biggest value in an array int index = 0; // index of the second biggest value in an array - int smaller_index = 0; + int smallerIndex = 0; for (int j = 1; j < numParticles; j++) { if (pidCertainties[j] > pidCertainties[index]) { // assign new indexes - smaller_index = index; + smallerIndex = index; index = j; } } // return 0 if certainty with index 'index' is below 0.5 or two indexes have the same value, else map index to particle pdgCode - if ((pidCertainties[index] < 0.5f) | ((pidCertainties[index] == pidCertainties[smaller_index]) & (smaller_index != 0))) { + if ((pidCertainties[index] < kCertaintyThreshold) | ((pidCertainties[index] == pidCertainties[smallerIndex]) & (smallerIndex != 0))) { return 0; } else { - return particlesPdgCode[index]; + return ParticlesPdgCode[index]; } } @@ -333,8 +343,8 @@ struct QaPidML { pidCertainties[2] = model321.applyModel(track); int pid = getParticlePdg(pidCertainties); // condition for sign: we want to work only with pi, p and K, without antiparticles - if (pid == particlesPdgCode[i] && track.sign() == 1) { - if (pdgCodeMC == particlesPdgCode[i]) { + if (pid == ParticlesPdgCode[i] && track.sign() == 1) { + if (pdgCodeMC == ParticlesPdgCode[i]) { fillPidHistos(track, pdgCodeMC, true); } else { fillPidHistos(track, pdgCodeMC, false); @@ -342,42 +352,43 @@ struct QaPidML { } } - // one model for one particle - PidONNXModel model211; - PidONNXModel model2212; - PidONNXModel model321; - - Configurable cfgPathCCDB{"ccdb-path", "Users/m/mkabus/PIDML", "base path to the CCDB directory with ONNX models"}; - Configurable cfgCCDBURL{"ccdb-url", "http://alice-ccdb.cern.ch", "URL of the CCDB repository"}; - Configurable cfgUseCCDB{"useCCDB", true, "Whether to autofetch ML model from CCDB. If false, local file will be used."}; - Configurable cfgPathLocal{"local-path", "/home/mkabus/PIDML/", "base path to the local directory with ONNX models"}; + Configurable ccdbPath{"ccdbPath", "Users/m/mkabus/PIDML", "base path to the CCDB directory with ONNX models"}; + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "URL of the CCDB repository"}; + Configurable useCcdb{"useCcdb", true, "Whether to autofetch ML model from CCDB. If false, local file will be used."}; + Configurable localPath{"localPath", "/home/mkabus/PIDML/", "base path to the local directory with ONNX models"}; o2::ccdb::CcdbApi ccdbApi; int currentRunNumber = -1; + Filter trackFilter = requireGlobalTrackInFilter(); + using PidTracks = soa::Filtered>; + + // one model for one particle + PidONNXModel model211; + PidONNXModel model2212; + PidONNXModel model321; + void init(InitContext const&) { - if (cfgUseCCDB) { - ccdbApi.init(cfgCCDBURL); + if (useCcdb) { + ccdbApi.init(ccdbUrl); } else { - model211 = PidONNXModel(cfgPathLocal.value, cfgPathCCDB.value, cfgUseCCDB.value, ccdbApi, -1, 211, 0.5f, pSwitchValue[0]); - model2212 = PidONNXModel(cfgPathLocal.value, cfgPathCCDB.value, cfgUseCCDB.value, ccdbApi, -1, 2211, 0.5f, pSwitchValue[1]); - model321 = PidONNXModel(cfgPathLocal.value, cfgPathCCDB.value, cfgUseCCDB.value, ccdbApi, -1, 321, 0.5f, pSwitchValue[2]); + model211 = PidONNXModel(localPath.value, ccdbPath.value, useCcdb.value, ccdbApi, -1, PDG_t::kPiPlus, 0.5f, PSwitchValue[0]); + model2212 = PidONNXModel(localPath.value, ccdbPath.value, useCcdb.value, ccdbApi, -1, PDG_t::kProton, 0.5f, PSwitchValue[1]); + model321 = PidONNXModel(localPath.value, ccdbPath.value, useCcdb.value, ccdbApi, -1, PDG_t::kKPlus, 0.5f, PSwitchValue[2]); } } - Filter trackFilter = requireGlobalTrackInFilter(); - using pidTracks = soa::Filtered>; - void process(aod::Collisions const& collisions, pidTracks const& tracks, aod::McParticles const& /*mcParticles*/, aod::BCsWithTimestamps const&) + void process(aod::Collisions const& collisions, PidTracks const& tracks, aod::McParticles const& /*mcParticles*/, aod::BCsWithTimestamps const&) { auto bc = collisions.iteratorAt(0).bc_as(); - if (cfgUseCCDB && bc.runNumber() != currentRunNumber) { - model211 = PidONNXModel(cfgPathLocal.value, cfgPathCCDB.value, cfgUseCCDB.value, ccdbApi, bc.timestamp(), 211, 0.5f, pSwitchValue[0]); - model2212 = PidONNXModel(cfgPathLocal.value, cfgPathCCDB.value, cfgUseCCDB.value, ccdbApi, bc.timestamp(), 2211, 0.5f, pSwitchValue[1]); - model321 = PidONNXModel(cfgPathLocal.value, cfgPathCCDB.value, cfgUseCCDB.value, ccdbApi, bc.timestamp(), 321, 0.5f, pSwitchValue[2]); + if (useCcdb && bc.runNumber() != currentRunNumber) { + model211 = PidONNXModel(localPath.value, ccdbPath.value, useCcdb.value, ccdbApi, bc.timestamp(), PDG_t::kPiPlus, 0.5f, PSwitchValue[0]); + model2212 = PidONNXModel(localPath.value, ccdbPath.value, useCcdb.value, ccdbApi, bc.timestamp(), PDG_t::kProton, 0.5f, PSwitchValue[1]); + model321 = PidONNXModel(localPath.value, ccdbPath.value, useCcdb.value, ccdbApi, bc.timestamp(), PDG_t::kKPlus, 0.5f, PSwitchValue[2]); } - for (auto& track : tracks) { + for (const auto& track : tracks) { auto particle = track.mcParticle_as(); int pdgCodeMC = particle.pdgCode(); @@ -394,6 +405,6 @@ struct QaPidML { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc), }; } diff --git a/Tools/PIDML/simpleApplyPidOnnxInterface.cxx b/Tools/PIDML/simpleApplyPidOnnxInterface.cxx index 82f644103ed..bcfb83cf354 100644 --- a/Tools/PIDML/simpleApplyPidOnnxInterface.cxx +++ b/Tools/PIDML/simpleApplyPidOnnxInterface.cxx @@ -9,12 +9,13 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file simpleApplyPidInterface +/// \file simpleApplyPidOnnxInterface.cxx /// \brief A simple example for using PID obtained from the PID ML ONNX Interface. See README.md for more detailed instructions. /// /// \author Maja Kabus #include +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -38,21 +39,19 @@ DECLARE_SOA_COLUMN(Accepted, accepted, bool); //! Whether the model accepted par DECLARE_SOA_TABLE(MlPidResults, "AOD", "MLPIDRESULTS", o2::soa::Index<>, mlpidresult::TrackId, mlpidresult::Pid, mlpidresult::Accepted); } // namespace o2::aod -struct SimpleApplyOnnxInterface { - PidONNXInterface pidInterface; // One instance to manage all needed ONNX models +struct SimpleApplyPidOnnxInterface { + Configurable> ptCuts{"ptCuts", {pidml_pt_cuts::Cuts[0], pidml_pt_cuts::NPids, pidml_pt_cuts::NCutVars, pidml_pt_cuts::pidLabels, pidml_pt_cuts::cutVarLabels}, "pT cuts for each output pid and each detector configuration"}; + Configurable> pdgPids{"pdgPids", std::vector{pidml_pt_cuts::pidsV}, "PIDs to predict"}; + Configurable> mlIdentCertaintyThresholds{"mlIdentCertaintyThresholds", std::vector{pidml_pt_cuts::certaintiesV}, "Min certainties of the models to accept given particle to be of given kind"}; + Configurable autoMode{"autoMode", true, "Use automatic model matching: default pT cuts and min certainties"}; - Configurable> cfgPTCuts{"pT_cuts", {pidml_pt_cuts::cuts[0], pidml_pt_cuts::nPids, pidml_pt_cuts::nCutVars, pidml_pt_cuts::pidLabels, pidml_pt_cuts::cutVarLabels}, "pT cuts for each output pid and each detector configuration"}; - Configurable> cfgPids{"pids", std::vector{pidml_pt_cuts::pids_v}, "PIDs to predict"}; - Configurable> cfgCertainties{"certainties", std::vector{pidml_pt_cuts::certainties_v}, "Min certainties of the models to accept given particle to be of given kind"}; - Configurable cfgAutoMode{"autoMode", true, "Use automatic model matching: default pT cuts and min certainties"}; + Configurable ccdbPath{"ccdbPath", "Users/m/mkabus/PIDML", "base path to the CCDB directory with ONNX models"}; + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "URL of the CCDB repository"}; + Configurable useCcdb{"useCcdb", true, "Whether to autofetch ML model from CCDB. If false, local file will be used."}; + Configurable localPath{"localPath", "/home/mkabus/PIDML/", "base path to the local directory with ONNX models"}; - Configurable cfgPathCCDB{"ccdb-path", "Users/m/mkabus/PIDML", "base path to the CCDB directory with ONNX models"}; - Configurable cfgCCDBURL{"ccdb-url", "http://alice-ccdb.cern.ch", "URL of the CCDB repository"}; - Configurable cfgUseCCDB{"useCCDB", true, "Whether to autofetch ML model from CCDB. If false, local file will be used."}; - Configurable cfgPathLocal{"local-path", "/home/mkabus/PIDML/", "base path to the local directory with ONNX models"}; - - Configurable cfgUseFixedTimestamp{"use-fixed-timestamp", false, "Whether to use fixed timestamp from configurable instead of timestamp calculated from the data"}; - Configurable cfgTimestamp{"timestamp", 1524176895000, "Hardcoded timestamp for tests"}; + Configurable useFixedTimestamp{"useFixedTimestamp", false, "Whether to use fixed timestamp from configurable instead of timestamp calculated from the data"}; + Configurable fixedTimestamp{"fixedTimestamp", 1524176895000, "Hardcoded timestamp for tests"}; o2::ccdb::CcdbApi ccdbApi; int currentRunNumber = -1; @@ -65,25 +64,27 @@ struct SimpleApplyOnnxInterface { // Filter on isGlobalTrack (TracksSelection) using BigTracks = soa::Filtered>; + PidONNXInterface pidInterface; // One instance to manage all needed ONNX models + void init(InitContext const&) { - if (cfgUseCCDB) { - ccdbApi.init(cfgCCDBURL); + if (useCcdb) { + ccdbApi.init(ccdbUrl); } else { - pidInterface = PidONNXInterface(cfgPathLocal.value, cfgPathCCDB.value, cfgUseCCDB.value, ccdbApi, -1, cfgPids.value, cfgPTCuts.value, cfgCertainties.value, cfgAutoMode.value); + pidInterface = PidONNXInterface(localPath.value, ccdbPath.value, useCcdb.value, ccdbApi, -1, pdgPids.value, ptCuts.value, mlIdentCertaintyThresholds.value, autoMode.value); } } void processCollisions(aod::Collisions const& collisions, BigTracks const& tracks, aod::BCsWithTimestamps const&) { auto bc = collisions.iteratorAt(0).bc_as(); - if (cfgUseCCDB && bc.runNumber() != currentRunNumber) { - uint64_t timestamp = cfgUseFixedTimestamp ? cfgTimestamp.value : bc.timestamp(); - pidInterface = PidONNXInterface(cfgPathLocal.value, cfgPathCCDB.value, cfgUseCCDB.value, ccdbApi, timestamp, cfgPids.value, cfgPTCuts.value, cfgCertainties.value, cfgAutoMode.value); + if (useCcdb && bc.runNumber() != currentRunNumber) { + uint64_t timestamp = useFixedTimestamp ? fixedTimestamp.value : bc.timestamp(); + pidInterface = PidONNXInterface(localPath.value, ccdbPath.value, useCcdb.value, ccdbApi, timestamp, pdgPids.value, ptCuts.value, mlIdentCertaintyThresholds.value, autoMode.value); } - for (auto& track : tracks) { - for (int pid : cfgPids.value) { + for (const auto& track : tracks) { + for (const int& pid : pdgPids.value) { bool accepted = pidInterface.applyModelBoolean(track, pid); LOGF(info, "collision id: %d track id: %d pid: %d accepted: %d p: %.3f; x: %.3f, y: %.3f, z: %.3f", track.collisionId(), track.index(), pid, accepted, track.p(), track.x(), track.y(), track.z()); @@ -91,12 +92,12 @@ struct SimpleApplyOnnxInterface { } } } - PROCESS_SWITCH(SimpleApplyOnnxInterface, processCollisions, "Process with collisions and bcs for CCDB", true); + PROCESS_SWITCH(SimpleApplyPidOnnxInterface, processCollisions, "Process with collisions and bcs for CCDB", true); void processTracksOnly(BigTracks const& tracks) { - for (auto& track : tracks) { - for (int pid : cfgPids.value) { + for (const auto& track : tracks) { + for (const int& pid : pdgPids.value) { bool accepted = pidInterface.applyModelBoolean(track, pid); LOGF(info, "collision id: %d track id: %d pid: %d accepted: %d p: %.3f; x: %.3f, y: %.3f, z: %.3f", track.collisionId(), track.index(), pid, accepted, track.p(), track.x(), track.y(), track.z()); @@ -104,11 +105,11 @@ struct SimpleApplyOnnxInterface { } } } - PROCESS_SWITCH(SimpleApplyOnnxInterface, processTracksOnly, "Process with tracks only -- faster but no CCDB", false); + PROCESS_SWITCH(SimpleApplyPidOnnxInterface, processTracksOnly, "Process with tracks only -- faster but no CCDB", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc)}; + adaptAnalysisTask(cfgc)}; } diff --git a/Tools/PIDML/simpleApplyPidOnnxModel.cxx b/Tools/PIDML/simpleApplyPidOnnxModel.cxx index e261c1e10bc..aab1a48fc28 100644 --- a/Tools/PIDML/simpleApplyPidOnnxModel.cxx +++ b/Tools/PIDML/simpleApplyPidOnnxModel.cxx @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file simpleApplyPidModel +/// \file simpleApplyPidOnnxModel.cxx /// \brief A simple example for using PID obtained from the PID ML ONNX Model. See README.md for more detailed instructions. /// /// \author Maja Kabus @@ -38,18 +38,17 @@ DECLARE_SOA_COLUMN(Accepted, accepted, bool); //! Whether the model accepted par DECLARE_SOA_TABLE(MlPidResults, "AOD", "MLPIDRESULTS", o2::soa::Index<>, mlpidresult::TrackId, mlpidresult::Pid, mlpidresult::Accepted); } // namespace o2::aod -struct SimpleApplyOnnxModel { - PidONNXModel pidModel; // One instance per model, e.g., one per each pid to predict - Configurable cfgPid{"pid", 211, "PID to predict"}; - Configurable cfgCertainty{"certainty", 0.5, "Min certainty of the model to accept given particle to be of given kind"}; +struct SimpleApplyPidOnnxModel { + Configurable pdgPid{"pdgPid", 211, "PID to predict"}; + Configurable certainty{"certainty", 0.5, "Min certainty of the model to accept given particle to be of given kind"}; - Configurable cfgPathCCDB{"ccdb-path", "Users/m/mkabus/PIDML", "base path to the CCDB directory with ONNX models"}; - Configurable cfgCCDBURL{"ccdb-url", "http://alice-ccdb.cern.ch", "URL of the CCDB repository"}; - Configurable cfgUseCCDB{"useCCDB", true, "Whether to autofetch ML model from CCDB. If false, local file will be used."}; - Configurable cfgPathLocal{"local-path", "/home/mkabus/PIDML", "base path to the local directory with ONNX models"}; + Configurable ccdbPath{"ccdbPath", "Users/m/mkabus/PIDML", "base path to the CCDB directory with ONNX models"}; + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "URL of the CCDB repository"}; + Configurable useCcdb{"useCcdb", true, "Whether to autofetch ML model from CCDB. If false, local file will be used."}; + Configurable localPath{"localPath", "/home/mkabus/PIDML", "base path to the local directory with ONNX models"}; - Configurable cfgUseFixedTimestamp{"use-fixed-timestamp", false, "Whether to use fixed timestamp from configurable instead of timestamp calculated from the data"}; - Configurable cfgTimestamp{"timestamp", 1524176895000, "Hardcoded timestamp for tests"}; + Configurable useFixedTimestamp{"useFixedTimestamp", false, "Whether to use fixed timestamp from configurable instead of timestamp calculated from the data"}; + Configurable fixedTimestamp{"fixedTimestamp", 1524176895000, "Hardcoded timestamp for tests"}; o2::ccdb::CcdbApi ccdbApi; int currentRunNumber = -1; @@ -61,47 +60,48 @@ struct SimpleApplyOnnxModel { // TPC signal (FullTracks), TOF signal (TOFSignal), TOF beta (pidTOFbeta), dcaXY and dcaZ (TracksDCA) // Filter on isGlobalTrack (TracksSelection) using BigTracks = soa::Filtered>; + PidONNXModel pidModel; // One instance per model, e.g., one per each pid to predict void init(InitContext const&) { - if (cfgUseCCDB) { - ccdbApi.init(cfgCCDBURL); + if (useCcdb) { + ccdbApi.init(ccdbUrl); } else { - pidModel = PidONNXModel(cfgPathLocal.value, cfgPathCCDB.value, cfgUseCCDB.value, ccdbApi, -1, cfgPid.value, cfgCertainty.value); + pidModel = PidONNXModel(localPath.value, ccdbPath.value, useCcdb.value, ccdbApi, -1, pdgPid.value, certainty.value); } } void processCollisions(aod::Collisions const& collisions, BigTracks const& tracks, aod::BCsWithTimestamps const&) { auto bc = collisions.iteratorAt(0).bc_as(); - if (cfgUseCCDB && bc.runNumber() != currentRunNumber) { - uint64_t timestamp = cfgUseFixedTimestamp ? cfgTimestamp.value : bc.timestamp(); - pidModel = PidONNXModel(cfgPathLocal.value, cfgPathCCDB.value, cfgUseCCDB.value, ccdbApi, timestamp, cfgPid.value, cfgCertainty.value); + if (useCcdb && bc.runNumber() != currentRunNumber) { + uint64_t timestamp = useFixedTimestamp ? fixedTimestamp.value : bc.timestamp(); + pidModel = PidONNXModel(localPath.value, ccdbPath.value, useCcdb.value, ccdbApi, timestamp, pdgPid.value, certainty.value); } - for (auto& track : tracks) { + for (const auto& track : tracks) { bool accepted = pidModel.applyModelBoolean(track); LOGF(info, "collision id: %d track id: %d accepted: %d p: %.3f; x: %.3f, y: %.3f, z: %.3f", track.collisionId(), track.index(), accepted, track.p(), track.x(), track.y(), track.z()); - pidMLResults(track.index(), cfgPid.value, accepted); + pidMLResults(track.index(), pdgPid.value, accepted); } } - PROCESS_SWITCH(SimpleApplyOnnxModel, processCollisions, "Process with collisions and bcs for CCDB", true); + PROCESS_SWITCH(SimpleApplyPidOnnxModel, processCollisions, "Process with collisions and bcs for CCDB", true); void processTracksOnly(BigTracks const& tracks) { - for (auto& track : tracks) { + for (const auto& track : tracks) { bool accepted = pidModel.applyModelBoolean(track); LOGF(info, "collision id: %d track id: %d accepted: %d p: %.3f; x: %.3f, y: %.3f, z: %.3f", track.collisionId(), track.index(), accepted, track.p(), track.x(), track.y(), track.z()); - pidMLResults(track.index(), cfgPid.value, accepted); + pidMLResults(track.index(), pdgPid.value, accepted); } } - PROCESS_SWITCH(SimpleApplyOnnxModel, processTracksOnly, "Process with tracks only -- faster but no CCDB", false); + PROCESS_SWITCH(SimpleApplyPidOnnxModel, processTracksOnly, "Process with tracks only -- faster but no CCDB", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc)}; + adaptAnalysisTask(cfgc)}; } From 092a91bffdaf1818df0433fa89e9d7d4eac907a6 Mon Sep 17 00:00:00 2001 From: abmodak <67369858+abmodak@users.noreply.github.com> Date: Wed, 30 Apr 2025 11:59:31 +0200 Subject: [PATCH 1135/1650] [PWGLF] Fix collisions table for pp (#11023) --- .../heavyionMultiplicity.cxx | 70 +++++++++---------- 1 file changed, 32 insertions(+), 38 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/heavyionMultiplicity.cxx b/PWGLF/Tasks/GlobalEventProperties/heavyionMultiplicity.cxx index 435fc106062..35e3c99b958 100644 --- a/PWGLF/Tasks/GlobalEventProperties/heavyionMultiplicity.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/heavyionMultiplicity.cxx @@ -49,11 +49,13 @@ using namespace o2::aod::track; using namespace o2::aod::evsel; using CollisionDataTable = soa::Join; +using ColDataTablepp = soa::Join; using TrackDataTable = soa::Join; using FilTrackDataTable = soa::Filtered; using CollisionMCTrueTable = aod::McCollisions; using TrackMCTrueTable = aod::McParticles; using CollisionMCRecTable = soa::SmallGroups>; +using ColMCRecTablepp = soa::SmallGroups>; using TrackMCRecTable = soa::Join; using FilTrackMCRecTable = soa::Filtered; using V0TrackCandidates = soa::Join; @@ -113,8 +115,6 @@ AxisSpec axisMassLambda = {200, 1.07, 1.17, "Lambda/AntiLamda Mass", "Lambda/Ant AxisSpec axisTracks{9, 0.5, 9.5, "#tracks", "TrackAxis"}; auto static constexpr kMinCharge = 3.f; auto static constexpr kMinpTcut = 0.1f; -auto static constexpr kMinCent = 0.0f; -auto static constexpr kMaxCent = 100.0f; auto static constexpr kEtaInelgt0 = 1.0f; auto static constexpr kNItslayers = 7; @@ -184,11 +184,10 @@ struct HeavyionMultiplicity { x->SetBinLabel(2, "sel8"); x->SetBinLabel(3, "kNoSameBunchPileup"); // reject collisions in case of pileup with another collision in the same foundBC x->SetBinLabel(4, "kIsGoodZvtxFT0vsPV"); // small difference between z-vertex from PV and from FT0 - x->SetBinLabel(5, "Centrality"); - x->SetBinLabel(6, "ApplyExtraCorrCut"); - x->SetBinLabel(7, "ApplyNoCollInTimeRangeStandard"); - x->SetBinLabel(8, "ApplyNoCollInRofStandard"); - x->SetBinLabel(9, "ApplyNoHighMultCollInPrevRof"); + x->SetBinLabel(5, "ApplyExtraCorrCut"); + x->SetBinLabel(6, "ApplyNoCollInTimeRangeStandard"); + x->SetBinLabel(7, "ApplyNoCollInRofStandard"); + x->SetBinLabel(8, "ApplyNoHighMultCollInPrevRof"); if (doprocessData) { histos.add("CentPercentileHist", "CentPercentileHist", kTH1D, {axisCent}, false); @@ -275,30 +274,25 @@ struct HeavyionMultiplicity { } histos.fill(HIST("EventHist"), 4); - if (selColCent(col) < kMinCent || selColCent(col) > kMaxCent) { - return false; - } - histos.fill(HIST("EventHist"), 5); - if (isApplyExtraCorrCut && col.multNTracksPV() > npvTracksCut && col.multFT0C() < (10 * col.multNTracksPV() - ft0cCut)) { return false; } - histos.fill(HIST("EventHist"), 6); + histos.fill(HIST("EventHist"), 5); if (isApplyNoCollInTimeRangeStandard && !col.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { return false; } - histos.fill(HIST("EventHist"), 7); + histos.fill(HIST("EventHist"), 6); if (isApplyNoCollInRofStandard && !col.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { return false; } - histos.fill(HIST("EventHist"), 8); + histos.fill(HIST("EventHist"), 7); if (isApplyNoHighMultCollInPrevRof && !col.selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof)) { return false; } - histos.fill(HIST("EventHist"), 9); + histos.fill(HIST("EventHist"), 8); return true; } @@ -649,7 +643,7 @@ struct HeavyionMultiplicity { } PROCESS_SWITCH(HeavyionMultiplicity, processStrangeYield, "Strange particle yield", false); - void processppData(CollisionDataTable::iterator const& cols, FilTrackDataTable const& tracks) + void processppData(ColDataTablepp::iterator const& cols, FilTrackDataTable const& tracks) { if (!isEventSelected(cols)) { return; @@ -667,28 +661,28 @@ struct HeavyionMultiplicity { } // track loop if (nTrks > 0) { - histos.fill(HIST("EventHist"), 10); + histos.fill(HIST("EventHist"), 9); histos.fill(HIST("VtxZHist"), cols.posZ()); - histos.fill(HIST("MultPercentileHist"), selColCent(cols)); - histos.fill(HIST("hdatazvtxmultpp"), cols.posZ(), selColCent(cols)); + histos.fill(HIST("MultPercentileHist"), cols.centFT0M()); + histos.fill(HIST("hdatazvtxmultpp"), cols.posZ(), cols.centFT0M()); for (const auto& track : tracks) { if (!isTrackSelected(track)) { continue; } histos.fill(HIST("PhiVsEtaHistpp"), track.phi(), track.eta()); - histos.fill(HIST("hdatadndetapp"), cols.posZ(), selColCent(cols), track.eta(), track.phi(), kGlobalplusITS); + histos.fill(HIST("hdatadndetapp"), cols.posZ(), cols.centFT0M(), track.eta(), track.phi(), kGlobalplusITS); if (track.hasTPC()) { - histos.fill(HIST("hdatadndetapp"), cols.posZ(), selColCent(cols), track.eta(), track.phi(), kGlobalonly); + histos.fill(HIST("hdatadndetapp"), cols.posZ(), cols.centFT0M(), track.eta(), track.phi(), kGlobalonly); } else { - histos.fill(HIST("hdatadndetapp"), cols.posZ(), selColCent(cols), track.eta(), track.phi(), kITSonly); + histos.fill(HIST("hdatadndetapp"), cols.posZ(), cols.centFT0M(), track.eta(), track.phi(), kITSonly); } } // track loop } // nTrks>0 } PROCESS_SWITCH(HeavyionMultiplicity, processppData, "process pp data", false); - void processppMonteCarlo(CollisionMCTrueTable::iterator const&, CollisionMCRecTable const& RecCols, TrackMCTrueTable const& GenParticles, FilTrackMCRecTable const& RecTracks) + void processppMonteCarlo(CollisionMCTrueTable::iterator const&, ColMCRecTablepp const& RecCols, TrackMCTrueTable const& GenParticles, FilTrackMCRecTable const& RecTracks) { for (const auto& RecCol : RecCols) { if (!isEventSelected(RecCol)) { @@ -709,21 +703,21 @@ struct HeavyionMultiplicity { } if (nTrks > 0) { - histos.fill(HIST("EventHist"), 10); + histos.fill(HIST("EventHist"), 9); histos.fill(HIST("VtxZHist"), RecCol.posZ()); - histos.fill(HIST("MultPercentileMCRecHist"), selColCent(RecCol)); - histos.fill(HIST("hmczvtxmultpp"), RecCol.posZ(), selColCent(RecCol)); + histos.fill(HIST("MultPercentileMCRecHist"), RecCol.centFT0M()); + histos.fill(HIST("hmczvtxmultpp"), RecCol.posZ(), RecCol.centFT0M()); for (const auto& Rectrack : recTracksPart) { if (!isTrackSelected(Rectrack)) { continue; } histos.fill(HIST("MCrecPhiVsEtaHistpp"), Rectrack.phi(), Rectrack.eta()); - histos.fill(HIST("hmcrecdndetapp"), RecCol.posZ(), selColCent(RecCol), Rectrack.eta(), Rectrack.phi(), static_cast(kSpAll), kGlobalplusITS); + histos.fill(HIST("hmcrecdndetapp"), RecCol.posZ(), RecCol.centFT0M(), Rectrack.eta(), Rectrack.phi(), static_cast(kSpAll), kGlobalplusITS); if (Rectrack.hasTPC()) { - histos.fill(HIST("hmcrecdndetapp"), RecCol.posZ(), selColCent(RecCol), Rectrack.eta(), Rectrack.phi(), static_cast(kSpAll), kGlobalonly); + histos.fill(HIST("hmcrecdndetapp"), RecCol.posZ(), RecCol.centFT0M(), Rectrack.eta(), Rectrack.phi(), static_cast(kSpAll), kGlobalonly); } else { - histos.fill(HIST("hmcrecdndetapp"), RecCol.posZ(), selColCent(RecCol), Rectrack.eta(), Rectrack.phi(), static_cast(kSpAll), kITSonly); + histos.fill(HIST("hmcrecdndetapp"), RecCol.posZ(), RecCol.centFT0M(), Rectrack.eta(), Rectrack.phi(), static_cast(kSpAll), kITSonly); } if (Rectrack.has_mcParticle()) { @@ -757,9 +751,9 @@ struct HeavyionMultiplicity { pid = kBkg; } mclabels.push_back(Rectrack.mcParticleId()); - histos.fill(HIST("hmcrecdndetapp"), RecCol.posZ(), selColCent(RecCol), Rectrack.eta(), Rectrack.phi(), static_cast(pid), kGlobalplusITS); + histos.fill(HIST("hmcrecdndetapp"), RecCol.posZ(), RecCol.centFT0M(), Rectrack.eta(), Rectrack.phi(), static_cast(pid), kGlobalplusITS); } else { - histos.fill(HIST("hmcrecdndetapp"), RecCol.posZ(), selColCent(RecCol), Rectrack.eta(), Rectrack.phi(), static_cast(kBkg), kGlobalplusITS); + histos.fill(HIST("hmcrecdndetapp"), RecCol.posZ(), RecCol.centFT0M(), Rectrack.eta(), Rectrack.phi(), static_cast(kBkg), kGlobalplusITS); } } // track (mcrec) loop } // nTrks>0 @@ -780,13 +774,13 @@ struct HeavyionMultiplicity { if (!isGenTrackSelected(particle)) { continue; } - histos.fill(HIST("hmcgendndetapp"), RecCol.posZ(), selColCent(RecCol), particle.eta(), particle.phi(), static_cast(kSpAll), kNoGenpTVar); + histos.fill(HIST("hmcgendndetapp"), RecCol.posZ(), RecCol.centFT0M(), particle.eta(), particle.phi(), static_cast(kSpAll), kNoGenpTVar); if (particle.pt() < kMinpTcut) { - histos.fill(HIST("hmcgendndetapp"), RecCol.posZ(), selColCent(RecCol), particle.eta(), particle.phi(), static_cast(kSpAll), kGenpTup, -10.0 * particle.pt() + 2); - histos.fill(HIST("hmcgendndetapp"), RecCol.posZ(), selColCent(RecCol), particle.eta(), particle.phi(), static_cast(kSpAll), kGenpTdown, 5.0 * particle.pt() + 0.5); + histos.fill(HIST("hmcgendndetapp"), RecCol.posZ(), RecCol.centFT0M(), particle.eta(), particle.phi(), static_cast(kSpAll), kGenpTup, -10.0 * particle.pt() + 2); + histos.fill(HIST("hmcgendndetapp"), RecCol.posZ(), RecCol.centFT0M(), particle.eta(), particle.phi(), static_cast(kSpAll), kGenpTdown, 5.0 * particle.pt() + 0.5); } else { - histos.fill(HIST("hmcgendndetapp"), RecCol.posZ(), selColCent(RecCol), particle.eta(), particle.phi(), static_cast(kSpAll), kGenpTup); - histos.fill(HIST("hmcgendndetapp"), RecCol.posZ(), selColCent(RecCol), particle.eta(), particle.phi(), static_cast(kSpAll), kGenpTdown); + histos.fill(HIST("hmcgendndetapp"), RecCol.posZ(), RecCol.centFT0M(), particle.eta(), particle.phi(), static_cast(kSpAll), kGenpTup); + histos.fill(HIST("hmcgendndetapp"), RecCol.posZ(), RecCol.centFT0M(), particle.eta(), particle.phi(), static_cast(kSpAll), kGenpTdown); } int pid = 0; @@ -804,7 +798,7 @@ struct HeavyionMultiplicity { pid = kSpOther; break; } - histos.fill(HIST("hmcgendndetapp"), RecCol.posZ(), selColCent(RecCol), particle.eta(), particle.phi(), static_cast(pid), kNoGenpTVar); + histos.fill(HIST("hmcgendndetapp"), RecCol.posZ(), RecCol.centFT0M(), particle.eta(), particle.phi(), static_cast(pid), kNoGenpTVar); } // track (mcgen) loop } // npart>0 } // collision loop From 4d2bc58c3d5516c60d954ef8198e49f672020006 Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Wed, 30 Apr 2025 14:17:16 +0200 Subject: [PATCH 1136/1650] [PWGLF] Fix bug in to-build cascade list mapping (#11031) --- PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx index 71f0fca40ce..32a9f027b18 100644 --- a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx @@ -29,7 +29,7 @@ // task will adapt algorithm to spare / spend CPU accordingly // -- mc_findableMode ....: 0: only found (default), 1: add findable to found, 2: all findable // When using findables, refer to FoundTag bools for checking if found -// -- v0builderopts ......: V0-specific building options (topological, etc) +// -- v0builderopts ......: V0-specific building options (topological, deduplication, etc) // -- cascadebuilderopts .: cascade-specific building options (topological, etc) #include @@ -1016,9 +1016,6 @@ struct StrangenessBuilder { // simple passthrough: copy existing cascades to build list for (const auto& cascade : cascades) { auto const& v0 = cascade.v0(); - if (v0.v0Type() > 1) { - continue; // skip any unexpected stuff (FIXME: follow-up) - } currentCascadeEntry.globalId = cascade.globalIndex(); currentCascadeEntry.collisionId = cascade.collisionId(); currentCascadeEntry.v0Id = ao2dV0toV0List[v0.globalIndex()]; From 7d7cd7941923b630886efe9e9e1df6fb0b4d8440 Mon Sep 17 00:00:00 2001 From: Rrantu <156880782+Rrantu@users.noreply.github.com> Date: Wed, 30 Apr 2025 20:39:32 +0800 Subject: [PATCH 1137/1650] [PWGHF] Add KFParticle Quality Assurance in XicToXiPi candidate creator (#10972) --- .../DataModel/CandidateReconstructionTables.h | 65 +++ .../candidateCreatorXic0Omegac0.cxx | 395 +++++++++++++++++- 2 files changed, 457 insertions(+), 3 deletions(-) diff --git a/PWGHF/DataModel/CandidateReconstructionTables.h b/PWGHF/DataModel/CandidateReconstructionTables.h index 754de37ec45..1f464bbb592 100644 --- a/PWGHF/DataModel/CandidateReconstructionTables.h +++ b/PWGHF/DataModel/CandidateReconstructionTables.h @@ -1368,6 +1368,58 @@ DECLARE_SOA_COLUMN(MassV0Chi2OverNdf, massV0Chi2OverNdf, float); DECLARE_SOA_COLUMN(MassCascChi2OverNdf, massCascChi2OverNdf, float); DECLARE_SOA_COLUMN(CascRejectInvmass, cascRejectInvmass, float); +// Kf QA results: +DECLARE_SOA_COLUMN(InvMassV0Err, invMassV0Err, float); +DECLARE_SOA_COLUMN(InvMassXiErr, invMassXiErr, float); +DECLARE_SOA_COLUMN(InvMassXic0Err, invMassXic0Err, float); +DECLARE_SOA_COLUMN(V0DauPosX, v0DauPosX, float); +DECLARE_SOA_COLUMN(V0DauPosY, v0DauPosY, float); +DECLARE_SOA_COLUMN(V0DauPosZ, v0DauPosZ, float); +DECLARE_SOA_COLUMN(V0DauPosXError, v0DauPosXError, float); +DECLARE_SOA_COLUMN(V0DauPosYError, v0DauPosYError, float); +DECLARE_SOA_COLUMN(V0DauPosZError, v0DauPosZError, float); +DECLARE_SOA_COLUMN(V0DauPosPt, v0DauPosPt, float); +DECLARE_SOA_COLUMN(V0DauNegX, v0DauNegX, float); +DECLARE_SOA_COLUMN(V0DauNegY, v0DauNegY, float); +DECLARE_SOA_COLUMN(V0DauNegZ, v0DauNegZ, float); +DECLARE_SOA_COLUMN(V0DauNegXError, v0DauNegXError, float); +DECLARE_SOA_COLUMN(V0DauNegYError, v0DauNegYError, float); +DECLARE_SOA_COLUMN(V0DauNegZError, v0DauNegZError, float); +DECLARE_SOA_COLUMN(V0DauNegPt, v0DauNegPt, float); + +DECLARE_SOA_COLUMN(V0VtxX, v0VtxX, float); +DECLARE_SOA_COLUMN(V0VtxY, v0VtxY, float); +DECLARE_SOA_COLUMN(V0VtxZ, v0VtxZ, float); +DECLARE_SOA_COLUMN(V0XError, v0XError, float); +DECLARE_SOA_COLUMN(V0YError, v0YError, float); +DECLARE_SOA_COLUMN(V0ZError, v0ZError, float); +DECLARE_SOA_COLUMN(V0Pt, v0Pt, float); +DECLARE_SOA_COLUMN(XiBachelorX, xiBachelorX, float); +DECLARE_SOA_COLUMN(XiBachelorY, xiBachelorY, float); +DECLARE_SOA_COLUMN(XiBachelorZ, xiBachelorZ, float); +DECLARE_SOA_COLUMN(XiBachelorPt, xiBachelorPt, float); +DECLARE_SOA_COLUMN(XiBachelorXError, xiBachelorXError, float); +DECLARE_SOA_COLUMN(XiBachelorYError, xiBachelorYError, float); +DECLARE_SOA_COLUMN(XiBachelorZError, xiBachelorZError, float); +DECLARE_SOA_COLUMN(XiX, xiX, float); +DECLARE_SOA_COLUMN(XiY, xiY, float); +DECLARE_SOA_COLUMN(XiZ, xiZ, float); +DECLARE_SOA_COLUMN(XiXError, xiXError, float); +DECLARE_SOA_COLUMN(XiYError, xiYError, float); +DECLARE_SOA_COLUMN(XiZError, xiZError, float); +DECLARE_SOA_COLUMN(XiPt, xiPt, float); +DECLARE_SOA_COLUMN(Xic0BachelorX, xic0BachelorX, float); +DECLARE_SOA_COLUMN(Xic0BachelorY, xic0BachelorY, float); +DECLARE_SOA_COLUMN(Xic0BachelorZ, xic0BachelorZ, float); +DECLARE_SOA_COLUMN(Xic0BachelorPt, xic0BachelorPt, float); +DECLARE_SOA_COLUMN(Xic0BachelorXError, xic0BachelorXError, float); +DECLARE_SOA_COLUMN(Xic0BachelorYError, xic0BachelorYError, float); +DECLARE_SOA_COLUMN(Xic0BachelorZError, xic0BachelorZError, float); +DECLARE_SOA_COLUMN(Xic0Pt, xic0Pt, float); +DECLARE_SOA_COLUMN(Xic0XError, xic0XError, float); +DECLARE_SOA_COLUMN(Xic0YError, xic0YError, float); +DECLARE_SOA_COLUMN(Xic0ZError, xic0ZError, float); + // MC matching result: DECLARE_SOA_COLUMN(FlagMcMatchRec, flagMcMatchRec, int8_t); // reconstruction level DECLARE_SOA_COLUMN(DebugMcRec, debugMcRec, int8_t); // debug flag for mis-association reconstruction level @@ -1557,6 +1609,19 @@ DECLARE_SOA_TABLE(HfCandToXiPiKf, "AOD", "HFCANDTOXIPIKF", //! hf_cand_xic0_omegac0::V0Chi2OverNdf, hf_cand_xic0_omegac0::CascChi2OverNdf, hf_cand_xic0_omegac0::XicChi2OverNdf, hf_cand_xic0_omegac0::MassV0Chi2OverNdf, hf_cand_xic0_omegac0::MassCascChi2OverNdf); +DECLARE_SOA_TABLE(HfCandToXiPiKfQa, "AOD", "HFCANDTOXIPIKFQA", + o2::soa::Index<>, + hf_cand_xic0_omegac0::InvMassLambda, hf_cand_xic0_omegac0::InvMassCascade, hf_cand_xic0_omegac0::InvMassCharmBaryon, hf_cand_xic0_omegac0::InvMassV0Err, hf_cand_xic0_omegac0::InvMassXiErr, hf_cand_xic0_omegac0::InvMassXic0Err, + hf_cand_xic0_omegac0::CollisionId, hf_track_index::V0Id, v0data::PosTrackId, v0data::NegTrackId, hf_cand_xic0_omegac0::CascadeId, hf_cand_xic0_omegac0::BachelorFromCharmBaryonId, cascdata::BachelorId, + hf_cand_xic0_omegac0::V0DauPosX, hf_cand_xic0_omegac0::V0DauPosY, hf_cand_xic0_omegac0::V0DauPosZ, hf_cand_xic0_omegac0::V0DauPosXError, hf_cand_xic0_omegac0::V0DauPosYError, hf_cand_xic0_omegac0::V0DauPosZError, hf_cand_xic0_omegac0::V0DauPosPt, + hf_cand_xic0_omegac0::V0DauNegX, hf_cand_xic0_omegac0::V0DauNegY, hf_cand_xic0_omegac0::V0DauNegZ, hf_cand_xic0_omegac0::V0DauNegXError, hf_cand_xic0_omegac0::V0DauNegYError, hf_cand_xic0_omegac0::V0DauNegZError, hf_cand_xic0_omegac0::V0DauNegPt, + hf_cand_xic0_omegac0::V0VtxX, hf_cand_xic0_omegac0::V0VtxY, hf_cand_xic0_omegac0::V0VtxZ, hf_cand_xic0_omegac0::V0XError, hf_cand_xic0_omegac0::V0YError, hf_cand_xic0_omegac0::V0ZError, hf_cand_xic0_omegac0::V0Pt, + hf_cand_xic0_omegac0::XiBachelorX, hf_cand_xic0_omegac0::XiBachelorY, hf_cand_xic0_omegac0::XiBachelorZ, hf_cand_xic0_omegac0::XiBachelorXError, hf_cand_xic0_omegac0::XiBachelorYError, hf_cand_xic0_omegac0::XiBachelorZError, hf_cand_xic0_omegac0::XiBachelorPt, + hf_cand_xic0_omegac0::XiX, hf_cand_xic0_omegac0::XiY, hf_cand_xic0_omegac0::XiZ, hf_cand_xic0_omegac0::XiXError, hf_cand_xic0_omegac0::XiYError, hf_cand_xic0_omegac0::XiZError, hf_cand_xic0_omegac0::XiPt, + hf_cand_xic0_omegac0::Xic0BachelorX, hf_cand_xic0_omegac0::Xic0BachelorY, hf_cand_xic0_omegac0::Xic0BachelorZ, hf_cand_xic0_omegac0::Xic0BachelorXError, hf_cand_xic0_omegac0::Xic0BachelorYError, hf_cand_xic0_omegac0::Xic0BachelorZError, hf_cand_xic0_omegac0::Xic0BachelorPt, + hf_cand_xic0_omegac0::XDecayVtxCharmBaryon, hf_cand_xic0_omegac0::YDecayVtxCharmBaryon, hf_cand_xic0_omegac0::ZDecayVtxCharmBaryon, hf_cand_xic0_omegac0::Xic0XError, hf_cand_xic0_omegac0::Xic0YError, hf_cand_xic0_omegac0::Xic0ZError, hf_cand_xic0_omegac0::Xic0Pt, + hf_cand_casc::V0X, hf_cand_casc::V0Y, hf_cand_casc::V0Z, hf_cand_xic0_omegac0::XDecayVtxCascade, hf_cand_xic0_omegac0::YDecayVtxCascade, hf_cand_xic0_omegac0::ZDecayVtxCascade); + // table with results of reconstruction level MC matching DECLARE_SOA_TABLE(HfXicToXiPiMCRec, "AOD", "HFXICXIPIMCREC", //! hf_cand_xic0_omegac0::FlagMcMatchRec, diff --git a/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx b/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx index f8dc5597cfc..277fc56227e 100644 --- a/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx +++ b/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx @@ -88,6 +88,7 @@ struct HfCandidateCreatorXic0Omegac0 { Produces rowCandToOmegaK; Produces kfCandidateData; Produces kfCandidateXicData; + Produces rowKfXic0Qa; Configurable propagateToPCA{"propagateToPCA", false, "create tracks version propagated to PCA"}; Configurable useAbsDCA{"useAbsDCA", true, "Minimise abs. distance rather than chi2"}; @@ -118,6 +119,7 @@ struct HfCandidateCreatorXic0Omegac0 { Configurable kfConstructMethod{"kfConstructMethod", 2, "KF Construct Method"}; Configurable kfUseV0MassConstraint{"kfUseV0MassConstraint", false, "KF: use Lambda mass constraint"}; Configurable kfUseCascadeMassConstraint{"kfUseCascadeMassConstraint", false, "KF: use Cascade mass constraint"}; + Configurable kfResolutionQA{"kfResolutionQA", false, "KF: KFParticle Quality Assurance"}; HfEventSelection hfEvSel; // event selection and monitoring o2::vertexing::DCAFitterN<2> df; // 2-prong vertex fitter to build the omegac/xic vertex @@ -236,6 +238,7 @@ struct HfCandidateCreatorXic0Omegac0 { float chi2MassCasc; float etaXic; } kfXic0Candidate; + void init(InitContext const&) { std::array allProcesses = {doprocessNoCentToXiPi, doprocessNoCentToXiPiTraCasc, doprocessCentFT0CToXiPi, doprocessCentFT0MToXiPi, doprocessNoCentToOmegaPi, doprocessOmegacToOmegaPiWithKFParticle, doprocessCentFT0CToOmegaPi, doprocessCentFT0MToOmegaPi, doprocessNoCentToOmegaK, doprocessCentFT0CToOmegaK, doprocessCentFT0MToOmegaK, doprocessXicToXiPiWithKFParticle}; @@ -1295,7 +1298,7 @@ struct HfCandidateCreatorXic0Omegac0 { KFParticle kfV0MassConstrained = kfV0; kfV0MassConstrained.SetNonlinearMassConstraint(o2::constants::physics::MassLambda); // set mass constrain to Lambda if (kfUseV0MassConstraint) { - KFParticle kfV0 = kfV0MassConstrained; + kfV0 = kfV0MassConstrained; } kfV0.TransportToDecayVertex(); @@ -1364,6 +1367,8 @@ struct HfCandidateCreatorXic0Omegac0 { KFPVertex kfVertex = createKFPVertexFromCollision(collision); KFParticle kfPV(kfVertex); + KFParticle kfPosOrigin = kfPos; + KFParticle kfNegOrigin = kfNeg; // set production vertex; kfNeg.SetProductionVertex(kfV0); kfPos.SetProductionVertex(kfV0); @@ -1618,7 +1623,19 @@ struct HfCandidateCreatorXic0Omegac0 { kfXic0Candidate.cosThetaStarPiFromXic, v0NDF, cascNDF, charmbaryonNDF, v0Ndfm, cascNdfm, v0Chi2OverNdf, cascChi2OverNdf, charmbaryonChi2OverNdf, v0Chi2OverNdfm, cascChi2OverNdfm); - + // fill QA table + if (kfResolutionQA) { + rowKfXic0Qa(massLam, massCasc, massXiC0, sigLam, sigCasc, sigXiC0, + collision.globalIndex(), v0index, casc.posTrackId(), casc.negTrackId(), casc.cascadeId(), trackCharmBachelor.globalIndex(), casc.bachelorId(), + kfPos.GetX(), kfPos.GetY(), kfPos.GetZ(), kfPos.GetErrX(), kfPos.GetErrY(), kfPos.GetErrZ(), kfPos.GetPt(), + kfNeg.GetX(), kfNeg.GetY(), kfNeg.GetZ(), kfNeg.GetErrX(), kfNeg.GetErrY(), kfNeg.GetErrZ(), kfNeg.GetPt(), + kfV0.GetX(), kfV0.GetY(), kfV0.GetZ(), kfV0.GetErrX(), kfV0.GetErrY(), kfV0.GetErrZ(), kfV0.GetPt(), + kfBachPionToXi.GetX(), kfBachPionToXi.GetY(), kfBachPionToXi.GetZ(), kfBachPionToXi.GetErrX(), kfBachPionToXi.GetErrY(), kfBachPionToXi.GetErrZ(), kfBachPionToXi.GetPt(), + kfXi.GetX(), kfXi.GetY(), kfXi.GetZ(), kfXi.GetErrX(), kfXi.GetErrY(), kfXi.GetErrZ(), kfXi.GetPt(), + kfCharmBachPionToXiC.GetX(), kfCharmBachPionToXiC.GetY(), kfCharmBachPionToXiC.GetZ(), kfCharmBachPionToXiC.GetErrX(), kfCharmBachPionToXiC.GetErrY(), kfCharmBachPionToXiC.GetErrZ(), kfCharmBachPionToXiC.GetPt(), + kfXiC0.GetX(), kfXiC0.GetY(), kfXiC0.GetZ(), kfXiC0.GetErrX(), kfXiC0.GetErrY(), kfXiC0.GetErrZ(), kfXiC0.GetPt(), + casc.xlambda(), casc.ylambda(), casc.zlambda(), casc.x(), casc.y(), casc.z()); + } } // loop over LF Cascade-bachelor candidates } /// @brief process function w/o centrality selections @@ -1861,7 +1878,7 @@ struct HfCandidateCreatorXic0Omegac0Mc { // inspect for which zPvPosMax cut was set for reconstructed void init(InitContext& initContext) { - std::array procCollisionsXicToXiPi{doprocessMcXicToXiPi, doprocessMcXicToXiPiFT0m, doprocessMcXicToXiPiFT0c, doprocessMcXicToXiPiKf}; + std::array procCollisionsXicToXiPi{doprocessMcXicToXiPi, doprocessMcXicToXiPiFT0m, doprocessMcXicToXiPiFT0c, doprocessMcXicToXiPiKf, doprocessMcXicToXiPiKfQa}; if (std::accumulate(procCollisionsXicToXiPi.begin(), procCollisionsXicToXiPi.end(), 0) > 1) { LOGP(fatal, "At most one process function for XicToXiPi collision study can be enabled at a time."); } @@ -1898,6 +1915,139 @@ struct HfCandidateCreatorXic0Omegac0Mc { hGenCharmBaryonPtRapidityTightOmegacToOmegaK = registry.add("hGenCharmBaryonPtRapidityTightOmegacToOmegaK", "Generated charm baryon #it{p}_{T};#it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1D, {{20, 0.0, 20.0}}}); hGenCharmBaryonPtRapidityLooseOmegacToOmegaK = registry.add("hGenCharmBaryonPtRapidityLooseOmegacToOmegaK", "Generated charm baryon #it{p}_{T};#it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1D, {{20, 0.0, 20.0}}}); + + // QA + if (doprocessMcXicToXiPiKfQa) { + AxisSpec axisPt{20, 0., 20.}; + AxisSpec axisPull{2000, -10., 10.}; + // mass over pt + registry.add("hV0MassPullVsPt", "m_{PULL}(V0) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hXiMassPullVsPt", "m_{PULL}(#Xi^{-}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hXic0MassPullVsPt", "m_{PULL}(#Xic0) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + // delta + registry.add("hV0DauPosXDelta", "x^{p} - x^{MC}", kTH1D, {axisPull}); + registry.add("hV0DauPosYDelta", "y^{p} - y^{MC}", kTH1D, {axisPull}); + registry.add("hV0DauPosZDelta", "z^{p} - z^{MC}", kTH1D, {axisPull}); + registry.add("hV0DauNegXDelta", "x^{#pi^{-}} - x^{MC}", kTH1D, {axisPull}); + registry.add("hV0DauNegYDelta", "y^{#pi^{-}} - y^{MC}", kTH1D, {axisPull}); + registry.add("hV0DauNegZDelta", "z^{#pi^{-}} - z^{MC}", kTH1D, {axisPull}); + registry.add("hV0XDelta", "x^{#Lambda} - x^{MC}", kTH1D, {axisPull}); + registry.add("hV0YDelta", "y^{#Lambda} - y^{MC}", kTH1D, {axisPull}); + registry.add("hV0ZDelta", "z^{#Lambda} - z^{MC}", kTH1D, {axisPull}); + + registry.add("hXiBachelorXDelta", "x^{#pi^{-} from #Xi^{-}} - x^{MC}", kTH1D, {axisPull}); + registry.add("hXiBachelorYDelta", "y^{#pi^{-} from #Xi^{-}} - y^{MC}", kTH1D, {axisPull}); + registry.add("hXiBachelorZDelta", "z^{#pi^{-} from #Xi^{-}} - z^{MC}", kTH1D, {axisPull}); + + registry.add("hXiXDelta", "x^{#Xi^{-}} - x^{MC}", kTH1D, {axisPull}); + registry.add("hXiYDelta", "y^{#Xi^{-}} - y^{MC}", kTH1D, {axisPull}); + registry.add("hXiZDelta", "z^{#Xi^{-}} - z^{MC}", kTH1D, {axisPull}); + + registry.add("hXic0BachelorXDelta", "x^{#pi^{+} from #Xi_{c}^{0}} - x^{MC}", kTH1D, {axisPull}); + registry.add("hXic0BachelorYDelta", "y^{#pi^{+} from #Xi_{c}^{0}} - y^{MC}", kTH1D, {axisPull}); + registry.add("hXic0BachelorZDelta", "z^{#pi^{+} from #Xi_{c}^{0}} - z^{MC}", kTH1D, {axisPull}); + + registry.add("hXic0XDelta", "x^{#Xi_(c)^(0)} - x^{MC}", kTH1D, {axisPull}); + registry.add("hXic0YDelta", "y^{#Xi_(c)^(0)} - y^{MC}", kTH1D, {axisPull}); + registry.add("hXic0ZDelta", "z^{#Xi_(c)^(0)} - z^{MC}", kTH1D, {axisPull}); + // delta over pt + registry.add("hV0DauPosXDeltaVsPt", "#Delta_{x}(p) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hV0DauPosYDeltaVsPt", "#Delta_{y}(p) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hV0DauPosZDeltaVsPt", "#Delta_{z}(p) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hV0DauNegXDeltaVsPt", "#Delta_{x}(#pi) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hV0DauNegYDeltaVsPt", "#Delta_{y}(#pi) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hV0DauNegZDeltaVsPt", "#Delta_{z}(#pi) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hV0XDeltaVsPt", "#Delta_{x}(#Lambda) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hV0YDeltaVsPt", "#Delta_{y}(#Lambda) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hV0ZDeltaVsPt", "#Delta_{z}(#Lambda) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + + registry.add("hXiBachelorXDeltaVsPt", "#Delta_{x}(#pi^{-} from #Xi^{-}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hXiBachelorYDeltaVsPt", "#Delta_{y}(#pi^{-} from #Xi^{-}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hXiBachelorZDeltaVsPt", "#Delta_{z}(#pi^{-} from #Xi^{-}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + + registry.add("hXiXDeltaVsPt", "#Delta_{x}(#Xi^{-}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hXiYDeltaVsPt", "#Delta_{y}(#Xi^{-}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hXiZDeltaVsPt", "#Delta_{z}(#Xi^{-}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + + registry.add("hXic0BachelorXDeltaVsPt", "#Delta_{x}(#pi^{+} from #Xi_{c}^{0}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hXic0BachelorYDeltaVsPt", "#Delta_{y}(#pi^{+} from #Xi_{c}^{0}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hXic0BachelorZDeltaVsPt", "#Delta_{z}(#pi^{+} from #Xi_{c}^{0}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + + registry.add("hXic0XDeltaVsPt", "#Delta_{x}(#Xi_{c}^{0}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hXic0YDeltaVsPt", "#Delta_{y}(#Xi_{c}^{0}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hXic0ZDeltaVsPt", "#Delta_{z}(#Xi_{c}^{0}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + + // pull + registry.add("hV0DauPosXPull", "x^{PULL}", kTH1D, {axisPull}); + registry.add("hV0DauPosYPull", "y^{PULL}", kTH1D, {axisPull}); + registry.add("hV0DauPosZPull", "z^{PULL}", kTH1D, {axisPull}); + registry.add("hV0DauNegXPull", "x^{PULL}", kTH1D, {axisPull}); + registry.add("hV0DauNegYPull", "y^{PULL}", kTH1D, {axisPull}); + registry.add("hV0DauNegZPull", "z^{PULL}", kTH1D, {axisPull}); + registry.add("hV0XPull", "x^{PULL}(#Lambda)", kTH1D, {axisPull}); + registry.add("hV0YPull", "y^{PULL}(#Lambda)", kTH1D, {axisPull}); + registry.add("hV0ZPull", "z^{PULL}(#Lambda)", kTH1D, {axisPull}); + + registry.add("hXiBachelorXPull", "x^{PULL}", kTH1D, {axisPull}); + registry.add("hXiBachelorYPull", "y^{PULL}", kTH1D, {axisPull}); + registry.add("hXiBachelorZPull", "z^{PULL}", kTH1D, {axisPull}); + + registry.add("hXiXPull", "x^{PULL}(#Xi^{-})", kTH1D, {axisPull}); + registry.add("hXiYPull", "y^{PULL}(#Xi^{-})", kTH1D, {axisPull}); + registry.add("hXiZPull", "z^{PULL}(#Xi^{-})", kTH1D, {axisPull}); + + registry.add("hXic0BachelorXPull", "x^{PULL}", kTH1D, {axisPull}); + registry.add("hXic0BachelorYPull", "y^{PULL}", kTH1D, {axisPull}); + registry.add("hXic0BachelorZPull", "z^{PULL}", kTH1D, {axisPull}); + + registry.add("hXic0XPull", "x^{PULL}(#Xi_{c}^{0})", kTH1D, {axisPull}); + registry.add("hXic0YPull", "y^{PULL}(#Xi_{c}^{0})", kTH1D, {axisPull}); + registry.add("hXic0ZPull", "z^{PULL}(#Xi_{c}^{0})", kTH1D, {axisPull}); + // pull over pt + registry.add("hV0DauPosXPullVsPt", "x_{PULL} vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hV0DauPosYPullVsPt", "y_{PULL} vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hV0DauPosZPullVsPt", "z_{PULL} vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hV0DauNegXPullVsPt", "x_{PULL} vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hV0DauNegYPullVsPt", "y_{PULL} vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hV0DauNegZPullVsPt", "z_{PULL} vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hV0XPullVsPt", "x_{PULL}(#Lambda) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hV0YPullVsPt", "y_{PULL}(#Lambda) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hV0ZPullVsPt", "z_{PULL}(#Lambda) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + + registry.add("hXiBachelorXPullVsPt", "x_{PULL} vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hXiBachelorYPullVsPt", "y_{PULL} vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hXiBachelorZPullVsPt", "z_{PULL} vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + + registry.add("hXiXPullVsPt", "x_{PULL}(#Xi^{-}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hXiYPullVsPt", "y_{PULL}(#Xi^{-}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hXiZPullVsPt", "z_{PULL}(#Xi^{-}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + + registry.add("hXic0BachelorXPullVsPt", "x_{PULL} vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hXic0BachelorYPullVsPt", "y_{PULL} vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hXic0BachelorZPullVsPt", "z_{PULL} vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + + registry.add("hXic0XPullVsPt", "x_{PULL}(#Xi_{c}^{0}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hXic0YPullVsPt", "y_{PULL}(#Xi_{c}^{0}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hXic0ZPullVsPt", "z_{PULL}(#Xi_{c}^{0}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + + // Defaut delta + registry.add("hLambdaXDelta", "x^{#Lambda} - x^{MC}(Default)", kTH1D, {axisPull}); + registry.add("hLambdaYDelta", "y^{#Lambda} - y^{MC}(Default)", kTH1D, {axisPull}); + registry.add("hLambdaZDelta", "z^{#Lambda} - z^{MC}(Default)", kTH1D, {axisPull}); + + registry.add("hCascXDelta", "x^{#Xi^{-}} - x^{MC}(Default)", kTH1D, {axisPull}); + registry.add("hCascYDelta", "y^{#Xi^{-}} - y^{MC}(Default)", kTH1D, {axisPull}); + registry.add("hCascZDelta", "z^{#Xi^{-}} - z^{MC}(Default)", kTH1D, {axisPull}); + + // Pt Resolution + registry.add("hV0DauPosPtRes", "Pt Resolution (p)", kTH1D, {axisPull}); + registry.add("hV0DauNegPtRes", "Pt Resolution (#pi^{-} from #Lambda)", kTH1D, {axisPull}); + registry.add("hV0PtRes", "Pt Resolution (V0)", kTH1D, {axisPull}); + registry.add("hXiBachelorPtRes", "Pt Resolution (#pi^{-} from #Xi^{-})", kTH1D, {axisPull}); + registry.add("hXiPtRes", "Pt Resolution (#Xi^{-})", kTH1D, {axisPull}); + registry.add("hXic0BachelorPtRes", "Pt Resolution (#pi^{+} from #Xi_{c}^{0})", kTH1D, {axisPull}); + registry.add("hXic0PtRes", "Pt Resolution (#Xi_{c}^{0})", kTH1D, {axisPull}); + } } template @@ -2388,6 +2538,236 @@ struct HfCandidateCreatorXic0Omegac0Mc { } // close loop on MCCollisions } // close process + template + void runXic0Omegac0McQa(TMyRecoCand const& candidates, + MyTracksWMc const&, + aod::McParticles const& mcParticles, + BCsInfo const&) + { + int indexRec = -1; + int8_t sign = -9; + int8_t signCasc = -9; + int8_t signV0 = -9; + + for (const auto& candidate : candidates) { + + auto arrayDaughters = std::array{candidate.template bachelorFromCharmBaryon_as(), // bachelor <- charm baryon + candidate.template bachelor_as(), // bachelor <- cascade + candidate.template posTrack_as(), // p <- lambda + candidate.template negTrack_as()}; // pi <- lambda + auto arrayDaughtersCasc = std::array{candidate.template bachelor_as(), + candidate.template posTrack_as(), + candidate.template negTrack_as()}; + auto arrayDaughtersV0 = std::array{candidate.template posTrack_as(), + candidate.template negTrack_as()}; + + auto mcV0DauPos = arrayDaughtersV0[0].mcParticle(); + auto mcV0DauNeg = arrayDaughtersV0[1].mcParticle(); + auto mcXiBachelor = arrayDaughtersCasc[0].mcParticle(); + auto mcXic0Bachelor = arrayDaughters[0].mcParticle(); + + // Xic0 -> xi pi matching + if constexpr (decayChannel == aod::hf_cand_xic0_omegac0::DecayType::XiczeroToXiPi) { + // Lambda → p pi + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersV0, +kLambda0, std::array{+kProton, +kPiMinus}, true, &signV0, 1); + if (indexRec > -1 && signV0 == 1) { + auto mcV0 = mcParticles.rawIteratorAt(indexRec - mcParticles.offset()); + + float v0MassPull = (candidate.invMassLambda() - MassLambda0) / candidate.invMassV0Err(); + registry.fill(HIST("hV0MassPullVsPt"), candidate.v0Pt(), v0MassPull); + + float v0DauPosXDelta = candidate.v0DauPosX() - mcV0DauPos.vx(); + float v0DauPosYDelta = candidate.v0DauPosY() - mcV0DauPos.vy(); + float v0DauPosZDelta = candidate.v0DauPosZ() - mcV0DauPos.vz(); + float v0DauPosPt = mcV0DauPos.pt(); + float v0DauPosXPull = v0DauPosXDelta / candidate.v0DauPosXError(); + float v0DauPosYPull = v0DauPosYDelta / candidate.v0DauPosYError(); + float v0DauPosZPull = v0DauPosZDelta / candidate.v0DauPosZError(); + + float v0DauNegXDelta = candidate.v0DauNegX() - mcV0DauNeg.vx(); + float v0DauNegYDelta = candidate.v0DauNegY() - mcV0DauNeg.vy(); + float v0DauNegZDelta = candidate.v0DauNegZ() - mcV0DauNeg.vz(); + float v0DauNegPt = mcV0DauNeg.pt(); + float v0DauNegXPull = v0DauNegXDelta / candidate.v0DauNegXError(); + float v0DauNegYPull = v0DauNegYDelta / candidate.v0DauNegYError(); + float v0DauNegZPull = v0DauNegZDelta / candidate.v0DauNegZError(); + + float v0XDelta = candidate.v0VtxX() - mcV0DauNeg.vx(); + float v0YDelta = candidate.v0VtxY() - mcV0DauNeg.vy(); + float v0ZDelta = candidate.v0VtxZ() - mcV0DauNeg.vz(); + float v0Pt = mcV0.pt(); + float v0XPull = v0XDelta / candidate.v0XError(); + float v0YPull = v0YDelta / candidate.v0YError(); + float v0ZPull = v0ZDelta / candidate.v0ZError(); + + float lambdaXDelta = candidate.v0X() - mcV0DauNeg.vx(); + float lambdaYDelta = candidate.v0Y() - mcV0DauNeg.vy(); + float lambdaZDelta = candidate.v0Z() - mcV0DauNeg.vz(); + registry.fill(HIST("hV0DauPosXDelta"), v0DauPosXDelta); + registry.fill(HIST("hV0DauPosYDelta"), v0DauPosYDelta); + registry.fill(HIST("hV0DauPosZDelta"), v0DauPosZDelta); + registry.fill(HIST("hV0DauPosXDeltaVsPt"), v0DauPosPt, v0DauPosXDelta); + registry.fill(HIST("hV0DauPosYDeltaVsPt"), v0DauPosPt, v0DauPosYDelta); + registry.fill(HIST("hV0DauPosZDeltaVsPt"), v0DauPosPt, v0DauPosZDelta); + registry.fill(HIST("hV0DauPosXPull"), v0DauPosXPull); + registry.fill(HIST("hV0DauPosYPull"), v0DauPosYPull); + registry.fill(HIST("hV0DauPosZPull"), v0DauPosZPull); + registry.fill(HIST("hV0DauPosXPullVsPt"), v0DauPosPt, v0DauPosXPull); + registry.fill(HIST("hV0DauPosYPullVsPt"), v0DauPosPt, v0DauPosYPull); + registry.fill(HIST("hV0DauPosZPullVsPt"), v0DauPosPt, v0DauPosZPull); + + registry.fill(HIST("hV0DauNegXDelta"), v0DauNegXDelta); + registry.fill(HIST("hV0DauNegYDelta"), v0DauNegYDelta); + registry.fill(HIST("hV0DauNegZDelta"), v0DauNegZDelta); + registry.fill(HIST("hV0DauNegXDeltaVsPt"), v0DauNegPt, v0DauNegXDelta); + registry.fill(HIST("hV0DauNegYDeltaVsPt"), v0DauNegPt, v0DauNegYDelta); + registry.fill(HIST("hV0DauNegZDeltaVsPt"), v0DauNegPt, v0DauNegZDelta); + registry.fill(HIST("hV0DauNegXPull"), v0DauNegXPull); + registry.fill(HIST("hV0DauNegYPull"), v0DauNegYPull); + registry.fill(HIST("hV0DauNegZPull"), v0DauNegZPull); + registry.fill(HIST("hV0DauNegXPullVsPt"), v0DauNegPt, v0DauNegXPull); + registry.fill(HIST("hV0DauNegYPullVsPt"), v0DauNegPt, v0DauNegYPull); + registry.fill(HIST("hV0DauNegZPullVsPt"), v0DauNegPt, v0DauNegZPull); + + registry.fill(HIST("hV0XDelta"), v0XDelta); + registry.fill(HIST("hV0YDelta"), v0YDelta); + registry.fill(HIST("hV0ZDelta"), v0ZDelta); + registry.fill(HIST("hV0XDeltaVsPt"), v0Pt, v0XDelta); + registry.fill(HIST("hV0YDeltaVsPt"), v0Pt, v0YDelta); + registry.fill(HIST("hV0ZDeltaVsPt"), v0Pt, v0ZDelta); + registry.fill(HIST("hV0XPull"), v0XPull); + registry.fill(HIST("hV0YPull"), v0YPull); + registry.fill(HIST("hV0ZPull"), v0ZPull); + registry.fill(HIST("hV0XPullVsPt"), v0Pt, v0XPull); + registry.fill(HIST("hV0YPullVsPt"), v0Pt, v0YPull); + registry.fill(HIST("hV0ZPullVsPt"), v0Pt, v0ZPull); + + registry.fill(HIST("hLambdaXDelta"), lambdaXDelta); + registry.fill(HIST("hLambdaYDelta"), lambdaYDelta); + registry.fill(HIST("hLambdaZDelta"), lambdaZDelta); + + registry.fill(HIST("hV0DauPosPtRes"), (candidate.v0DauPosPt() - mcV0DauPos.pt()) / candidate.v0DauPosPt()); + registry.fill(HIST("hV0DauNegPtRes"), (candidate.v0DauNegPt() - mcV0DauNeg.pt()) / candidate.v0DauNegPt()); + registry.fill(HIST("hV0PtRes"), (candidate.v0Pt() - mcV0.pt()) / candidate.v0Pt()); + // Xi- → pi pi p + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersCasc, +kXiMinus, std::array{+kPiMinus, +kProton, +kPiMinus}, true, &signCasc, 2); + if (indexRec > -1 && signCasc == 1) { + // QA + float xiMassPull = (candidate.invMassCascade() - MassXiMinus) / candidate.invMassXiErr(); + registry.fill(HIST("hXiMassPullVsPt"), candidate.xiPt(), xiMassPull); + + float xiBachelorXDelta = candidate.xiBachelorX() - mcXiBachelor.vx(); + float xiBachelorYDelta = candidate.xiBachelorY() - mcXiBachelor.vy(); + float xiBachelorZDelta = candidate.xiBachelorZ() - mcXiBachelor.vz(); + float xiBachelorPt = mcXiBachelor.pt(); + float xiBachelorXPull = xiBachelorXDelta / candidate.xiBachelorXError(); + float xiBachelorYPull = xiBachelorYDelta / candidate.xiBachelorYError(); + float xiBachelorZPull = xiBachelorZDelta / candidate.xiBachelorZError(); + + auto mcXi = mcParticles.rawIteratorAt(indexRec - mcParticles.offset()); + + float xiXDelta = candidate.xiX() - mcXiBachelor.vx(); + float xiYDelta = candidate.xiY() - mcXiBachelor.vy(); + float xiZDelta = candidate.xiZ() - mcXiBachelor.vz(); + float xiPt = mcXi.pt(); + float xiXPull = xiXDelta / candidate.xiXError(); + float xiYPull = xiYDelta / candidate.xiYError(); + float xiZPull = xiZDelta / candidate.xiZError(); + + float cascXDelta = candidate.xDecayVtxCascade() - mcXiBachelor.vx(); + float cascYDelta = candidate.yDecayVtxCascade() - mcXiBachelor.vy(); + float cascZDelta = candidate.zDecayVtxCascade() - mcXiBachelor.vz(); + + registry.fill(HIST("hXiBachelorXDelta"), xiBachelorXDelta); + registry.fill(HIST("hXiBachelorYDelta"), xiBachelorYDelta); + registry.fill(HIST("hXiBachelorZDelta"), xiBachelorZDelta); + registry.fill(HIST("hXiBachelorXDeltaVsPt"), xiBachelorPt, xiBachelorXDelta); + registry.fill(HIST("hXiBachelorYDeltaVsPt"), xiBachelorPt, xiBachelorYDelta); + registry.fill(HIST("hXiBachelorZDeltaVsPt"), xiBachelorPt, xiBachelorZDelta); + registry.fill(HIST("hXiBachelorXPull"), xiBachelorXPull); + registry.fill(HIST("hXiBachelorYPull"), xiBachelorYPull); + registry.fill(HIST("hXiBachelorZPull"), xiBachelorZPull); + registry.fill(HIST("hXiBachelorXPullVsPt"), xiBachelorPt, xiBachelorXPull); + registry.fill(HIST("hXiBachelorYPullVsPt"), xiBachelorPt, xiBachelorYPull); + registry.fill(HIST("hXiBachelorZPullVsPt"), xiBachelorPt, xiBachelorZPull); + + registry.fill(HIST("hXiXDelta"), xiXDelta); + registry.fill(HIST("hXiYDelta"), xiYDelta); + registry.fill(HIST("hXiZDelta"), xiZDelta); + registry.fill(HIST("hXiXDeltaVsPt"), xiPt, xiXDelta); + registry.fill(HIST("hXiYDeltaVsPt"), xiPt, xiYDelta); + registry.fill(HIST("hXiZDeltaVsPt"), xiPt, xiZDelta); + registry.fill(HIST("hXiXPull"), xiXPull); + registry.fill(HIST("hXiYPull"), xiYPull); + registry.fill(HIST("hXiZPull"), xiZPull); + registry.fill(HIST("hXiXPullVsPt"), xiPt, xiXPull); + registry.fill(HIST("hXiYPullVsPt"), xiPt, xiYPull); + registry.fill(HIST("hXiZPullVsPt"), xiPt, xiZPull); + + registry.fill(HIST("hCascXDelta"), cascXDelta); + registry.fill(HIST("hCascYDelta"), cascYDelta); + registry.fill(HIST("hCascZDelta"), cascZDelta); + + registry.fill(HIST("hXiBachelorPtRes"), (candidate.xiBachelorPt() - mcXiBachelor.pt()) / candidate.xiBachelorPt()); + registry.fill(HIST("hXiPtRes"), (candidate.xiPt() - mcXi.pt()) / candidate.xiPt()); + + // Xic → pi pi pi p + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, +kXiC0, std::array{+kPiPlus, +kPiMinus, +kProton, +kPiMinus}, true, &sign, 3); + if (indexRec > -1 && sign == 1) { + auto mcXic0 = mcParticles.rawIteratorAt(indexRec - mcParticles.offset()); + float xic0MassPull = (candidate.invMassCharmBaryon() - MassXiC0) / candidate.invMassXic0Err(); + registry.fill(HIST("hXic0MassPullVsPt"), candidate.xic0Pt(), xic0MassPull); + + float xic0BachelorXDelta = candidate.xic0BachelorX() - mcXic0Bachelor.vx(); + float xic0BachelorYDelta = candidate.xic0BachelorY() - mcXic0Bachelor.vy(); + float xic0BachelorZDelta = candidate.xic0BachelorZ() - mcXic0Bachelor.vz(); + float xic0BachelorPt = mcXic0Bachelor.pt(); + float xic0BachelorXPull = xic0BachelorXDelta / candidate.xic0BachelorXError(); + float xic0BachelorYPull = xic0BachelorYDelta / candidate.xic0BachelorYError(); + float xic0BachelorZPull = xic0BachelorZDelta / candidate.xic0BachelorZError(); + + float xic0XDelta = candidate.xDecayVtxCharmBaryon() - mcXic0Bachelor.vx(); + float xic0YDelta = candidate.yDecayVtxCharmBaryon() - mcXic0Bachelor.vy(); + float xic0ZDelta = candidate.zDecayVtxCharmBaryon() - mcXic0Bachelor.vz(); + float xic0Pt = mcXic0.pt(); + float xic0XPull = xic0XDelta / candidate.xic0XError(); + float xic0YPull = xic0YDelta / candidate.xic0YError(); + float xic0ZPull = xic0ZDelta / candidate.xic0ZError(); + registry.fill(HIST("hXic0BachelorXDelta"), xic0BachelorXDelta); + registry.fill(HIST("hXic0BachelorYDelta"), xic0BachelorYDelta); + registry.fill(HIST("hXic0BachelorZDelta"), xic0BachelorZDelta); + registry.fill(HIST("hXic0BachelorXDeltaVsPt"), xic0BachelorPt, xic0BachelorXDelta); + registry.fill(HIST("hXic0BachelorYDeltaVsPt"), xic0BachelorPt, xic0BachelorYDelta); + registry.fill(HIST("hXic0BachelorZDeltaVsPt"), xic0BachelorPt, xic0BachelorZDelta); + registry.fill(HIST("hXic0BachelorXPull"), xic0BachelorXPull); + registry.fill(HIST("hXic0BachelorYPull"), xic0BachelorYPull); + registry.fill(HIST("hXic0BachelorZPull"), xic0BachelorZPull); + registry.fill(HIST("hXic0BachelorXPullVsPt"), xic0BachelorPt, xic0BachelorXPull); + registry.fill(HIST("hXic0BachelorYPullVsPt"), xic0BachelorPt, xic0BachelorYPull); + registry.fill(HIST("hXic0BachelorZPullVsPt"), xic0BachelorPt, xic0BachelorZPull); + + registry.fill(HIST("hXic0XDelta"), xic0XDelta); + registry.fill(HIST("hXic0YDelta"), xic0YDelta); + registry.fill(HIST("hXic0ZDelta"), xic0ZDelta); + registry.fill(HIST("hXic0XDeltaVsPt"), xic0Pt, xic0XDelta); + registry.fill(HIST("hXic0YDeltaVsPt"), xic0Pt, xic0YDelta); + registry.fill(HIST("hXic0ZDeltaVsPt"), xic0Pt, xic0ZDelta); + registry.fill(HIST("hXic0XPull"), xic0XPull); + registry.fill(HIST("hXic0YPull"), xic0YPull); + registry.fill(HIST("hXic0ZPull"), xic0ZPull); + registry.fill(HIST("hXic0XPullVsPt"), xic0Pt, xic0XPull); + registry.fill(HIST("hXic0YPullVsPt"), xic0Pt, xic0YPull); + registry.fill(HIST("hXic0ZPullVsPt"), xic0Pt, xic0ZPull); + + registry.fill(HIST("hXic0BachelorPtRes"), (candidate.xic0BachelorPt() - mcXic0Bachelor.pt()) / candidate.xic0BachelorPt()); + registry.fill(HIST("hXic0PtRes"), (candidate.xic0Pt() - mcXic0.pt()) / candidate.xic0Pt()); + } + } + } + } + } + } + void processDoNoMc(aod::Collisions::iterator const&) { // dummy process function - should not be required in the future @@ -2416,6 +2796,15 @@ struct HfCandidateCreatorXic0Omegac0Mc { } PROCESS_SWITCH(HfCandidateCreatorXic0Omegac0Mc, processMcXicToXiPiKf, "Run Xic0 to xi pi MC process function - no centrality", false); + void processMcXicToXiPiKfQa(aod::HfCandToXiPiKfQa const& candidates, + MyTracksWMc const& tracks, + aod::McParticles const& mcParticles, + BCsInfo const& bcs) + { + runXic0Omegac0McQa(candidates, tracks, mcParticles, bcs); + } + PROCESS_SWITCH(HfCandidateCreatorXic0Omegac0Mc, processMcXicToXiPiKfQa, "Run Xic0 to xi pi MC QA process function - no centrality", false); + void processMcXicToXiPiFT0m(aod::HfCandToXiPi const& candidates, MyTracksWMc const& tracks, aod::McParticles const& mcParticles, From 127d55b7c39f7d8aa9a7e9f95037639005f8ee9e Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Wed, 30 Apr 2025 14:49:59 +0200 Subject: [PATCH 1138/1650] [PWGLF] Add wrong sign background (#11035) --- PWGLF/Tasks/Resonances/doublephimeson.cxx | 79 ++++++++++++++++------- 1 file changed, 56 insertions(+), 23 deletions(-) diff --git a/PWGLF/Tasks/Resonances/doublephimeson.cxx b/PWGLF/Tasks/Resonances/doublephimeson.cxx index 584c6ec5be2..ef37f5983a5 100644 --- a/PWGLF/Tasks/Resonances/doublephimeson.cxx +++ b/PWGLF/Tasks/Resonances/doublephimeson.cxx @@ -89,6 +89,7 @@ struct doublephimeson { const AxisSpec thnAxisNumPhi{configThnAxisNumPhi, "Number of phi meson"}; histos.add("SEMassUnlike", "SEMassUnlike", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisDeltaR, thnAxisCosTheta, thnAxisInvMassDeltaPhi, thnAxisNumPhi}); + histos.add("SEMassLike", "SEMassLike", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisDeltaR, thnAxisCosTheta, thnAxisInvMassDeltaPhi, thnAxisNumPhi}); histos.add("MEMassUnlike", "MEMassUnlike", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisDeltaR, thnAxisCosTheta, thnAxisInvMassDeltaPhi}); } @@ -274,9 +275,10 @@ struct doublephimeson { } TLorentzVector exotic, Phid1, Phid2; + TLorentzVector exoticlike, Phi1kaonplus, Phi1kaonminus, Phi2kaonplus, Phi2kaonminus, Phid1like, Phid2like; // TLorentzVector exoticRot, Phid1Rot; - void process(aod::RedPhiEvents::iterator const& collision, aod::PhiTracks const& phitracks) + void processSE(aod::RedPhiEvents::iterator const& collision, aod::PhiTracks const& phitracks) { if (additionalEvsel && (collision.numPos() < 2 || collision.numNeg() < 2)) { return; @@ -303,9 +305,6 @@ struct doublephimeson { phimult = phimult + 1; } for (auto phitrackd1 : phitracks) { - if (phitrackd1.phiMass() < minPhiMass || phitrackd1.phiMass() > maxPhiMass) { - continue; - } auto kaonplusd1pt = TMath::Sqrt(phitrackd1.phid1Px() * phitrackd1.phid1Px() + phitrackd1.phid1Py() * phitrackd1.phid1Py()); auto kaonminusd1pt = TMath::Sqrt(phitrackd1.phid2Px() * phitrackd1.phid2Px() + phitrackd1.phid2Py() * phitrackd1.phid2Py()); if (kaonplusd1pt > maxKaonPt) { @@ -326,14 +325,13 @@ struct doublephimeson { histos.fill(HIST("hPhiMass"), Phid1.M(), Phid1.Pt()); auto phid1id = phitrackd1.index(); Phid1.SetXYZM(phitrackd1.phiPx(), phitrackd1.phiPy(), phitrackd1.phiPz(), phitrackd1.phiMass()); + Phi1kaonplus.SetXYZM(phitrackd1.phid1Px(), phitrackd1.phid1Py(), phitrackd1.phid1Pz(), 0.493); + Phi1kaonminus.SetXYZM(phitrackd1.phid2Px(), phitrackd1.phid2Py(), phitrackd1.phid2Pz(), 0.493); for (auto phitrackd2 : phitracks) { auto phid2id = phitrackd2.index(); if (phid2id <= phid1id) { continue; } - if (phitrackd2.phiMass() < minPhiMass || phitrackd2.phiMass() > maxPhiMass) { - continue; - } auto kaonplusd2pt = TMath::Sqrt(phitrackd2.phid1Px() * phitrackd2.phid1Px() + phitrackd2.phid1Py() * phitrackd2.phid1Py()); auto kaonminusd2pt = TMath::Sqrt(phitrackd2.phid2Px() * phitrackd2.phid2Px() + phitrackd2.phid2Py() * phitrackd2.phid2Py()); if (kaonplusd2pt > maxKaonPt) { @@ -348,12 +346,6 @@ struct doublephimeson { if (!selectionPID(phitrackd2.phid2TPC(), phitrackd2.phid2TOF(), phitrackd2.phid2TOFHit(), strategyPID2, kaonminusd2pt)) { continue; } - // if (phitrackd1.phid1Index() == phitrackd2.phid1Index()) { - // continue; - // } - // if (phitrackd1.phid2Index() == phitrackd2.phid2Index()) { - // continue; - // } if (phitrackd1.phid1Index() == phitrackd2.phid1Index()) { continue; } @@ -361,6 +353,30 @@ struct doublephimeson { continue; } Phid2.SetXYZM(phitrackd2.phiPx(), phitrackd2.phiPy(), phitrackd2.phiPz(), phitrackd2.phiMass()); + Phi2kaonplus.SetXYZM(phitrackd2.phid1Px(), phitrackd2.phid1Py(), phitrackd2.phid1Pz(), 0.493); + Phi2kaonminus.SetXYZM(phitrackd2.phid2Px(), phitrackd2.phid2Py(), phitrackd2.phid2Pz(), 0.493); + + // Like + Phid1like = Phi1kaonplus + Phi2kaonplus; + Phid2like = Phi1kaonminus + Phi2kaonminus; + exoticlike = Phid1like + Phid2like; + auto deltaRlike = TMath::Sqrt(TMath::Power(Phid1like.Phi() - Phid2like.Phi(), 2.0) + TMath::Power(Phid1like.Eta() - Phid2like.Eta(), 2.0)); + auto costhetalike = (Phid1like.Px() * Phid2like.Px() + Phid1like.Py() * Phid2like.Py() + Phid1like.Pz() * Phid2like.Pz()) / (Phid1like.P() * Phid2like.P()); + auto deltamlike = TMath::Sqrt(TMath::Power(Phid1like.M() - 1.0192, 2.0) + TMath::Power(Phid2like.M() - 1.0192, 2.0)); + if (!isDeep) { + histos.fill(HIST("SEMassLike"), exoticlike.M(), exoticlike.Pt(), deltaRlike, costhetalike, deltamlike, phimult); + } + if (isDeep) { + histos.fill(HIST("SEMassLike"), exoticlike.M(), exoticlike.Pt(), deltaRlike, deepangle(Phid1like, Phid2like), deltamlike, phimult); + } + + // Unlike + if (phitrackd2.phiMass() < minPhiMass || phitrackd2.phiMass() > maxPhiMass) { + continue; + } + if (phitrackd1.phiMass() < minPhiMass || phitrackd1.phiMass() > maxPhiMass) { + continue; + } exotic = Phid1 + Phid2; if (exotic.M() < minExoticMass || exotic.M() > maxExoticMass) { continue; @@ -380,7 +396,7 @@ struct doublephimeson { } } } - + PROCESS_SWITCH(doublephimeson, processSE, "Process Same Event", false); void processopti(aod::RedPhiEvents::iterator const& collision, aod::PhiTracks const& phitracks) { std::vector exoticresonance, phiresonanced1, phiresonanced2; @@ -414,9 +430,6 @@ struct doublephimeson { phimult = phimult + 1; } for (auto phitrackd1 : phitracks) { - if (phitrackd1.phiMass() < minPhiMass || phitrackd1.phiMass() > maxPhiMass) { - continue; - } auto kaonplusd1pt = TMath::Sqrt(phitrackd1.phid1Px() * phitrackd1.phid1Px() + phitrackd1.phid1Py() * phitrackd1.phid1Py()); auto kaonminusd1pt = TMath::Sqrt(phitrackd1.phid2Px() * phitrackd1.phid2Px() + phitrackd1.phid2Py() * phitrackd1.phid2Py()); if (kaonplusd1pt > maxKaonPt) { @@ -437,14 +450,13 @@ struct doublephimeson { histos.fill(HIST("hPhiMass"), Phid1.M(), Phid1.Pt()); auto phid1id = phitrackd1.index(); Phid1.SetXYZM(phitrackd1.phiPx(), phitrackd1.phiPy(), phitrackd1.phiPz(), phitrackd1.phiMass()); + Phi1kaonplus.SetXYZM(phitrackd1.phid1Px(), phitrackd1.phid1Py(), phitrackd1.phid1Pz(), 0.493); + Phi1kaonminus.SetXYZM(phitrackd1.phid2Px(), phitrackd1.phid2Py(), phitrackd1.phid2Pz(), 0.493); for (auto phitrackd2 : phitracks) { auto phid2id = phitrackd2.index(); if (phid2id <= phid1id) { continue; } - if (phitrackd2.phiMass() < minPhiMass || phitrackd2.phiMass() > maxPhiMass) { - continue; - } auto kaonplusd2pt = TMath::Sqrt(phitrackd2.phid1Px() * phitrackd2.phid1Px() + phitrackd2.phid1Py() * phitrackd2.phid1Py()); auto kaonminusd2pt = TMath::Sqrt(phitrackd2.phid2Px() * phitrackd2.phid2Px() + phitrackd2.phid2Py() * phitrackd2.phid2Py()); if (kaonplusd2pt > maxKaonPt) { @@ -462,14 +474,35 @@ struct doublephimeson { if ((phitrackd1.phid1Index() == phitrackd2.phid1Index()) || (phitrackd1.phid2Index() == phitrackd2.phid2Index())) { continue; } - Phid2.SetXYZM(phitrackd2.phiPx(), phitrackd2.phiPy(), phitrackd2.phiPz(), phitrackd2.phiMass()); - exotic = Phid1 + Phid2; + Phi2kaonplus.SetXYZM(phitrackd2.phid1Px(), phitrackd2.phid1Py(), phitrackd2.phid1Pz(), 0.493); + Phi2kaonminus.SetXYZM(phitrackd2.phid2Px(), phitrackd2.phid2Py(), phitrackd2.phid2Pz(), 0.493); + + // Like + Phid1like = Phi1kaonplus + Phi2kaonplus; + Phid2like = Phi1kaonminus + Phi2kaonminus; + exoticlike = Phid1like + Phid2like; + auto deltaRlike = TMath::Sqrt(TMath::Power(Phid1like.Phi() - Phid2like.Phi(), 2.0) + TMath::Power(Phid1like.Eta() - Phid2like.Eta(), 2.0)); + auto costhetalike = (Phid1like.Px() * Phid2like.Px() + Phid1like.Py() * Phid2like.Py() + Phid1like.Pz() * Phid2like.Pz()) / (Phid1like.P() * Phid2like.P()); + auto deltamlike = TMath::Sqrt(TMath::Power(Phid1like.M() - 1.0192, 2.0) + TMath::Power(Phid2like.M() - 1.0192, 2.0)); + if (!isDeep) { + histos.fill(HIST("SEMassLike"), exoticlike.M(), exoticlike.Pt(), deltaRlike, costhetalike, deltamlike, phimult); + } + if (isDeep) { + histos.fill(HIST("SEMassLike"), exoticlike.M(), exoticlike.Pt(), deltaRlike, deepangle(Phid1like, Phid2like), deltamlike, phimult); + } + // unlike + if (phitrackd1.phiMass() < minPhiMass || phitrackd1.phiMass() > maxPhiMass) { + continue; + } + if (phitrackd2.phiMass() < minPhiMass || phitrackd2.phiMass() > maxPhiMass) { + continue; + } + exotic = Phid1 + Phid2; if (exotic.M() < minExoticMass || exotic.M() > maxExoticMass) { continue; } - ROOT::Math::PtEtaPhiMVector temp1(exotic.Pt(), exotic.Eta(), exotic.Phi(), exotic.M()); ROOT::Math::PtEtaPhiMVector temp2(Phid1.Pt(), Phid1.Eta(), Phid1.Phi(), Phid1.M()); ROOT::Math::PtEtaPhiMVector temp3(Phid2.Pt(), Phid2.Eta(), Phid2.Phi(), Phid2.M()); From 7e8d8e8178b997d5e2f4c24a448edd6dd96aef29 Mon Sep 17 00:00:00 2001 From: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> Date: Wed, 30 Apr 2025 14:58:04 +0200 Subject: [PATCH 1139/1650] [Infrastructure] Updating codeowner rights for PAG Strangeness and GEP (#11027) --- CODEOWNERS | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index ecd3c4c9aa7..b8f27eef641 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -41,14 +41,14 @@ /PWGHF @alibuild @vkucera @fcolamar @fgrosa @fcatalan92 @mfaggin @mmazzilli @deepathoms @NicoleBastid @hahassan7 @jpxrk @apalasciano @zhangbiao-phy # PWG-LF /PWGLF @alibuild @njacazio @skundu692 -/PWGLF/Tasks/GlobalEventProperties @alibuild @njacazio @skundu692 @gbencedi @omvazque -/PWGLF/TableProducer/GlobalEventProperties @alibuild @njacazio @skundu692 @gbencedi @omvazque +/PWGLF/Tasks/GlobalEventProperties @alibuild @njacazio @skundu692 @gbencedi @abmodak +/PWGLF/TableProducer/GlobalEventProperties @alibuild @njacazio @skundu692 @gbencedi @abmodak /PWGLF/Tasks/Nuspex @alibuild @njacazio @skundu692 @fmazzasc @chiarapinto @maciacco /PWGLF/TableProducer/Nuspex @alibuild @njacazio @skundu692 @fmazzasc @chiarapinto @maciacco /PWGLF/Tasks/Resonances @alibuild @njacazio @skundu692 @dmallick2 @smaff92 /PWGLF/TableProducer/Resonances @alibuild @njacazio @skundu692 @dmallick2 @smaff92 -/PWGLF/Tasks/Strangeness @alibuild @njacazio @skundu692 @ercolessi @ChiaraDeMartin95 -/PWGLF/TableProducer/Strangeness @alibuild @njacazio @skundu692 @ercolessi @ChiaraDeMartin95 +/PWGLF/Tasks/Strangeness @alibuild @njacazio @skundu692 @ercolessi @romainschotter +/PWGLF/TableProducer/Strangeness @alibuild @njacazio @skundu692 @ercolessi @romainschotter # PWG-MM /PWGMM @alibuild @njacazio @skundu692 @aalkin @@ -65,6 +65,6 @@ /Tutorials/PWGEM @alibuild @mikesas @rbailhac @dsekihat @ivorobye @feisenhu /Tutorials/PWGHF @alibuild @vkucera @fcolamar @fgrosa /Tutorials/PWGJE @alibuild @lhavener @maoyx @nzardosh @mfasDa @fjonasALICE -/Tutorials/PWGLF @alibuild @alcaliva @lbariogl @chiarapinto @BongHwi @lbarnby @mbombara @iravasen @njacazio @ChiaraDeMartin95 @skundu692 +/Tutorials/PWGLF @alibuild @alcaliva @lbariogl @chiarapinto @BongHwi @lbarnby @ercolessi @iravasen @njacazio @romainschotter @skundu692 /Tutorials/PWGMM @alibuild @aalkin @ddobrigk /Tutorials/PWGUD @alibuild @pbuehler From 401eb4ca54d9be47cc542409ca1ef4fb33d44ba0 Mon Sep 17 00:00:00 2001 From: Jesper Gumprecht <113693781+jesgum@users.noreply.github.com> Date: Wed, 30 Apr 2025 16:41:37 +0200 Subject: [PATCH 1140/1650] [ALICE3] Add additional selections with corresponding QA histograms (#11038) --- ALICE3/TableProducer/alice3-multicharm.cxx | 110 +++++++++++++++++---- 1 file changed, 89 insertions(+), 21 deletions(-) diff --git a/ALICE3/TableProducer/alice3-multicharm.cxx b/ALICE3/TableProducer/alice3-multicharm.cxx index d2ac55f8f11..a6f3933ac20 100644 --- a/ALICE3/TableProducer/alice3-multicharm.cxx +++ b/ALICE3/TableProducer/alice3-multicharm.cxx @@ -69,7 +69,7 @@ using FullTracksExt = soa::Join; using labeledTracks = soa::Join; using tofTracks = soa::Join; using richTracks = soa::Join; -using alice3tracks = soa::Join; +using alice3tracks = soa::Join; struct alice3multicharm { SliceCache cache; @@ -89,6 +89,8 @@ struct alice3multicharm { Configurable piFromXiC_dcaZconstant{"piFromXiC_dcaZconstant", 0.001f, "[0] in |DCAxy| > [0]+[1]/pT"}; Configurable piFromXiC_dcaXYpTdep{"piFromXiC_dcaXYpTdep", 0.0, "[1] in |DCAxy| > [0]+[1]/pT"}; Configurable piFromXiC_dcaZpTdep{"piFromXiC_dcaZpTdep", 0.0, "[1] in |DCAxy| > [0]+[1]/pT"}; + Configurable piFromXiC_tofDiffInner{"piFromXiC_tofDiffInner", 50, "|signal - expected| (ps)"}; + Configurable piFromXiCC_tofDiffInner{"piFromXiCC_tofDiffInner", 50, "|signal - expected| (ps)"}; Configurable piFromXiCC_dcaXYconstant{"piFromXiCC_dcaXYconstant", 0.001f, "[0] in |DCAxy| > [0]+[1]/pT"}; Configurable piFromXiCC_dcaZconstant{"piFromXiCC_dcaZconstant", 0.001f, "[0] in |DCAxy| > [0]+[1]/pT"}; Configurable piFromXiCC_dcaXYpTdep{"piFromXiCC_dcaXYpTdep", 0.0, "[1] in |DCAxy| > [0]+[1]/pT"}; @@ -107,21 +109,27 @@ struct alice3multicharm { Configurable minPiCCPt{"minPiCCPt", 0.3, "Minimum pT for XiCC pions"}; Configurable minNTracks{"minNTracks", -1, "Minimum number of tracks"}; + Configurable minXiRadius{"minXiRadius", 0.5, "Minimum R2D for XiC decay (cm)"}; Configurable minXiCRadius{"minXiCRadius", 0.001, "Minimum R2D for XiC decay (cm)"}; Configurable minXiCCRadius{"minXiCCRadius", 0.005, "Minimum R2D for XiCC decay (cm)"}; + Configurable xicMinDecayDistanceFromPV{"xicMinDecayDistanceFromPV", 0.002, "Minimum distance for XiC decay from PV (cm)"}; Configurable xicMinProperLength{"xicMinProperLength", 0.002, "Minimum proper length for XiC decay (cm)"}; Configurable xicMaxProperLength{"xicMaxProperLength", 0.06, "Minimum proper length for XiC decay (cm)"}; Configurable xiccMinProperLength{"xiccMinProperLength", 0.004, "Minimum proper length for XiCC decay (cm)"}; Configurable xiccMaxProperLength{"xiccMaxProperLength", 999, "Minimum proper length for XiCC decay (cm)"}; - Configurable massWindowXi{"massWindowXi", 0.015, "Mass window around Xi peak"}; - Configurable massWindowXiC{"massWindowXiC", 0.015, "Mass window around XiC peak"}; + Configurable xiccMaxEta{"xiccMaxEta", 1.5, "Max eta"}; + Configurable massWindowXi{"massWindowXi", 0.015, "Mass window around Xi peak (GeV/c)"}; + Configurable massWindowXiC{"massWindowXiC", 0.015, "Mass window around XiC peak (GeV/c)"}; ConfigurableAxis axisEta{"axisEta", {80, -4.0f, +4.0f}, "#eta"}; ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.2f, 2.4f, 2.6f, 2.8f, 3.0f, 3.2f, 3.4f, 3.6f, 3.8f, 4.0f, 4.4f, 4.8f, 5.2f, 5.6f, 6.0f, 6.5f, 7.0f, 7.5f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 17.0f, 19.0f, 21.0f, 23.0f, 25.0f, 30.0f, 35.0f, 40.0f, 50.0f}, "pt axis for QA histograms"}; - ConfigurableAxis axisDCA2d{"axisDCA2d", {400, -200, 200}, "DCA2d (#mum)"}; - ConfigurableAxis axisDCA{"axisDCA", {200, 0, 200}, "DCA (#mum)"}; - ConfigurableAxis axisRadius{"axisRadius", {1000, 0, 1000}, "Decay radius (#mum)"}; + ConfigurableAxis axisDCA2D{"axisDCA2D", {400, -200, 200}, "DCA2d (#mum)"}; + ConfigurableAxis axisDCA{"axisDCA", {400, 0, 400}, "DCA (#mum)"}; + ConfigurableAxis axisRadius{"axisRadius", {10000, 0, 10000}, "Decay radius (#mum)"}; + ConfigurableAxis axisRadius2D{"axisRadius2D", {1000, 0, 100000}, "Decay radius (#mum)"}; + ConfigurableAxis axisRadius2DXi{"axisRadius2DXi", {1000, 0, 20}, "Decay radius (cm)"}; ConfigurableAxis axisDecayLength{"axisDecayLength", {2000, 0, 2000}, "Decay lenght (#mum)"}; + ConfigurableAxis axisTOFTrack{"axisTOFTrack", {1000, 0, 5000}, "TOF track time"}; ConfigurableAxis axisXiMass{"axisXiMass", {200, 1.221f, 1.421f}, "Xi Inv Mass (GeV/c^{2})"}; ConfigurableAxis axisXiCMass{"axisXiCMass", {200, 2.368f, 2.568f}, "XiC Inv Mass (GeV/c^{2})"}; @@ -421,12 +429,21 @@ struct alice3multicharm { histos.add("hPi2cPt", "hPi2cPt", kTH1D, {axisPt}); histos.add("hPiccPt", "hPiccPt", kTH1D, {axisPt}); + histos.add("hMinXiDecayRadius", "hMinXiDecayRadius", kTH1D, {axisRadius2DXi}); histos.add("hMinXiCDecayRadius", "hMinXiCDecayRadius", kTH1D, {axisRadius}); histos.add("hMinXiCCDecayRadius", "hMinXiCCDecayRadius", kTH1D, {axisRadius}); + histos.add("hMinxicDecayDistanceFromPV", "hMinxicDecayDistanceFromPV", kTH1D, {axisDecayLength}); histos.add("hProperLengthXiC", "hProperLengthXiC", kTH1D, {axisDecayLength}); histos.add("hProperLengthXiCC", "hProperLengthXiCC", kTH1D, {axisDecayLength}); + histos.add("hInnerTOFTrackTimeRecoPi1c", "hInnerTOFTrackTimeRecoPi1c", kTH1D, {axisTOFTrack}); + histos.add("hInnerTOFTrackTimeRecoPi2c", "hInnerTOFTrackTimeRecoPi2c", kTH1D, {axisTOFTrack}); + histos.add("hInnerTOFTrackTimeRecoPicc", "hInnerTOFTrackTimeRecoPicc", kTH1D, {axisTOFTrack}); + + histos.add("hXiRadiusVsXicRadius", "hXiRadiusVsXicRadius", kTH2D, {axisRadius2D, axisRadius2D}); + histos.add("hXicRadiusVsXiccRadius", "hXicRadiusVsXiccRadius", kTH2D, {axisRadius2D, axisRadius2D}); + // These histograms bookkeep the exact number of combinations attempted // CombinationsXiC: triplets Xi-pi-pi considered per Xi // CombinationsXiCC: doublets XiC-pi considered per XiC @@ -436,9 +453,9 @@ struct alice3multicharm { histos.add("hNTracks", "hNTracks", kTH1D, {{20000, 0, 20000}}); if (doDCAplots) { - histos.add("h2dDCAxyVsPtXiFromXiC", "h2dDCAxyVsPtXiFromXiC", kTH2D, {axisPt, axisDCA2d}); - histos.add("h2dDCAxyVsPtPiFromXiC", "h2dDCAxyVsPtPiFromXiC", kTH2D, {axisPt, axisDCA2d}); - histos.add("h2dDCAxyVsPtPiFromXiCC", "h2dDCAxyVsPtPiFromXiCC", kTH2D, {axisPt, axisDCA2d}); + histos.add("h2dDCAxyVsPtXiFromXiC", "h2dDCAxyVsPtXiFromXiC", kTH2D, {axisPt, axisDCA2D}); + histos.add("h2dDCAxyVsPtPiFromXiC", "h2dDCAxyVsPtPiFromXiC", kTH2D, {axisPt, axisDCA2D}); + histos.add("h2dDCAxyVsPtPiFromXiCC", "h2dDCAxyVsPtPiFromXiCC", kTH2D, {axisPt, axisDCA2D}); } } @@ -503,6 +520,9 @@ struct alice3multicharm { continue; if (std::fabs(xi.dcaXY()) < xiFromXiC_dcaXYconstant || std::fabs(xi.dcaZ()) < xiFromXiC_dcaZconstant) + continue; // likely a primary xi + + if (xiCand.cascRadius() < minXiRadius) continue; for (auto const& pi1c : tracksPiFromXiCgrouped) { @@ -511,19 +531,29 @@ struct alice3multicharm { if (xiCand.posTrackId() == pi1c.globalIndex() || xiCand.negTrackId() == pi1c.globalIndex() || xiCand.bachTrackId() == pi1c.globalIndex()) continue; // avoid using any track that was already used if (pi1c.pt() < minPiCPt) - continue; + continue; // too low momentum + + double pi1cTOFDiffInner = std::fabs(pi1c.innerTOFTrackTimeReco() - pi1c.innerTOFExpectedTimePi()); + if (pi1cTOFDiffInner > piFromXiC_tofDiffInner) + continue; // did not arrive at expected time // second pion from XiC decay for starts here for (auto const& pi2c : tracksPiFromXiCgrouped) { - if (mcSameMotherCheck && !checkSameMother(xi, pi2c)) continue; // keep only if same mother + if (pi1c.globalIndex() >= pi2c.globalIndex()) continue; // avoid same-mother, avoid double-counting + if (xiCand.posTrackId() == pi2c.globalIndex() || xiCand.negTrackId() == pi2c.globalIndex() || xiCand.bachTrackId() == pi2c.globalIndex()) continue; // avoid using any track that was already used + if (pi2c.pt() < minPiCPt) - continue; + continue; // too low momentum + + double pi2cTOFDiffInner = std::fabs(pi2c.innerTOFTrackTimeReco() - pi2c.innerTOFExpectedTimePi()); + if (pi2cTOFDiffInner > piFromXiC_tofDiffInner) + continue; // did not arrive at expected time // if I am here, it means this is a triplet to be considered for XiC vertexing. // will now attempt to build a three-body decay candidate with these three track rows. @@ -535,6 +565,7 @@ struct alice3multicharm { if (std::fabs(thisXiCcandidate.mass - o2::constants::physics::MassXiCPlus) > massWindowXiC) continue; // out of mass region + histos.fill(HIST("hCharmBuilding"), 1.0f); const std::array momentumC = { @@ -547,9 +578,12 @@ struct alice3multicharm { if (xicDecayRadius2D < minXiCRadius) continue; // do not take if radius too small, likely a primary combination + histos.fill(HIST("hXiRadiusVsXicRadius"), xiCand.cascRadius() * 1e+4, xicDecayRadius2D * 1e+4); + if (xicDecayRadius2D > xiCand.cascRadius()) + continue; + o2::dataformats::DCA dcaInfo; float xicdcaXY = 1e+10, xicdcaZ = 1e+10; - ; o2::track::TrackParCov xicTrackCopy(xicTrack); // paranoia o2::vertexing::PVertex primaryVertex; primaryVertex.setXYZ(collision.posX(), collision.posY(), collision.posZ()); @@ -560,7 +594,7 @@ struct alice3multicharm { } if (std::fabs(xicdcaXY) < xiCFromXiCC_dcaXY || std::fabs(xicdcaZ) < xiCFromXiCC_dcaZ) - continue; + continue; // likely a primary xic histos.fill(HIST("hMassXiC"), thisXiCcandidate.mass); @@ -569,10 +603,16 @@ struct alice3multicharm { for (auto const& picc : tracksPiFromXiCCgrouped) { if (mcSameMotherCheck && !checkSameMotherExtra(xi, picc)) continue; + if (xiCand.posTrackId() == picc.globalIndex() || xiCand.negTrackId() == picc.globalIndex() || xiCand.bachTrackId() == picc.globalIndex()) continue; // avoid using any track that was already used + if (picc.pt() < minPiCCPt) - continue; + continue; // too low momentum + + double piccTOFDiffInner = std::fabs(picc.innerTOFTrackTimeReco() - picc.innerTOFExpectedTimePi()); + if (piccTOFDiffInner > piFromXiCC_tofDiffInner) + continue; // did not arrive at expected time o2::track::TrackParCov piccTrack = getTrackParCov(picc); nCombinationsCC++; @@ -591,14 +631,34 @@ struct alice3multicharm { continue; // do not take if radius too small, likely a primary combination double totalMomentumC = std::hypot(momentumC[0], momentumC[1], momentumC[2]); - double xicProperLength = std::fabs(std::hypot(thisXiCcandidate.xyz[0], thisXiCcandidate.xyz[1], thisXiCcandidate.xyz[2]) - std::hypot(thisXiCCcandidate.xyz[0], thisXiCCcandidate.xyz[1], thisXiCCcandidate.xyz[2]) * totalMomentumC) / (std::fabs(totalMomentumC) * thisXiCcandidate.mass); + double decayLengthXiC = std::hypot( + thisXiCcandidate.xyz[0] - thisXiCCcandidate.xyz[0], + thisXiCcandidate.xyz[1] - thisXiCCcandidate.xyz[1], + thisXiCcandidate.xyz[2] - thisXiCCcandidate.xyz[2]); + double xicProperLength = decayLengthXiC * thisXiCcandidate.mass / totalMomentumC; if (xicProperLength < xicMinProperLength || xicProperLength > xicMaxProperLength) - continue; + continue; // likely background + + double xicDistanceFromPV = std::hypot( + thisXiCcandidate.xyz[0] - collision.posX(), + thisXiCcandidate.xyz[1] - collision.posY(), + thisXiCcandidate.xyz[2] - collision.posZ()); + double xicDecayDistanceFromPV = xicDistanceFromPV * thisXiCcandidate.mass / totalMomentumC; + if (xicDecayDistanceFromPV < xicMinDecayDistanceFromPV) + continue; // too close to PV double totalMomentumCC = std::hypot(momentumCC[0], momentumCC[1], momentumCC[2]); - double xiccProperLength = std::fabs(std::hypot(collision.posX(), collision.posY(), collision.posZ()) - std::hypot(thisXiCCcandidate.xyz[0], thisXiCCcandidate.xyz[1], thisXiCCcandidate.xyz[2]) * totalMomentumCC) / (std::fabs(totalMomentumCC) * thisXiCCcandidate.mass); + double decayLengthXiCC = std::hypot( + thisXiCCcandidate.xyz[0] - collision.posX(), + thisXiCCcandidate.xyz[1] - collision.posY(), + thisXiCCcandidate.xyz[2] - collision.posZ()); + double xiccProperLength = decayLengthXiCC * thisXiCCcandidate.mass / totalMomentumCC; if (xiccProperLength < xiccMinProperLength || xiccProperLength > xicMaxProperLength) - continue; + continue; // likely background + + histos.fill(HIST("hXicRadiusVsXiccRadius"), xicDecayRadius2D * 1e+4, xiccDecayRadius2D * 1e+4); + if (xiccDecayRadius2D > xicDecayRadius2D) + continue; // XiCC should decay before XiC float xiccdcaXY = 1e+10, xiccdcaZ = 1e+10; if (xiccTrack.propagateToDCA(primaryVertex, magneticField, &dcaInfo)) { @@ -607,16 +667,24 @@ struct alice3multicharm { } if (std::fabs(xiccdcaXY) > xiCC_dcaXY || std::fabs(xiccdcaZ) > xiCC_dcaZ) - continue; + continue; // not pointing to PV + if (std::fabs(thisXiCcandidate.eta) > xiccMaxEta) + continue; // not in central barrel + + histos.fill(HIST("hMinxicDecayDistanceFromPV"), xicDecayDistanceFromPV * 1e+4); + histos.fill(HIST("hInnerTOFTrackTimeRecoPi1c"), pi1cTOFDiffInner); + histos.fill(HIST("hInnerTOFTrackTimeRecoPi2c"), pi2cTOFDiffInner); + histos.fill(HIST("hInnerTOFTrackTimeRecoPicc"), piccTOFDiffInner); histos.fill(HIST("hDCAXiCDaughters"), thisXiCcandidate.dca * 1e+4); histos.fill(HIST("hDCAXiCCDaughters"), thisXiCCcandidate.dca * 1e+4); histos.fill(HIST("hProperLengthXiCC"), xiccProperLength * 1e+4); histos.fill(HIST("hProperLengthXiC"), xicProperLength * 1e+4); histos.fill(HIST("hMinXiCCDecayRadius"), xiccDecayRadius2D * 1e+4); histos.fill(HIST("hMinXiCDecayRadius"), xicDecayRadius2D * 1e+4); - histos.fill(HIST("hPi2cPt"), pi2c.pt()); + histos.fill(HIST("hMinXiDecayRadius"), xiCand.cascRadius()); histos.fill(HIST("hPi1cPt"), pi1c.pt()); + histos.fill(HIST("hPi2cPt"), pi2c.pt()); histos.fill(HIST("hPiccPt"), picc.pt()); histos.fill(HIST("hDCAxyXi"), std::fabs(xi.dcaXY() * 1e+4)); histos.fill(HIST("hDCAzXi"), std::fabs(xi.dcaZ() * 1e+4)); From fcf3ba0a0285e957b5940a086779bce6190e7dc8 Mon Sep 17 00:00:00 2001 From: prottayCMT <61418725+prottayCMT@users.noreply.github.com> Date: Wed, 30 Apr 2025 20:06:24 +0200 Subject: [PATCH 1141/1650] [PWGLF] removed same index daughters of both V0s (#11040) --- PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx index 091593281e9..1873ddeed13 100644 --- a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx +++ b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx @@ -328,6 +328,9 @@ struct LfTaskLambdaSpinCorr { int taga = lambdaTag; int tagb = aLambdaTag; + auto postrack1 = v0.template posTrack_as(); + auto negtrack1 = v0.template negTrack_as(); + // 2nd loop for combination of lambda lambda for (const auto& v02 : V0s) { @@ -356,6 +359,13 @@ struct LfTaskLambdaSpinCorr { int taga2 = lambdaTag2; int tagb2 = aLambdaTag2; + auto postrack2 = v02.template posTrack_as(); + auto negtrack2 = v02.template negTrack_as(); + + if (postrack1.globalIndex() == postrack2.globalIndex() || negtrack1.globalIndex() == negtrack2.globalIndex()) { + continue; // no shared decay products + } + if (lambdaTag && lambdaTag2) { lambdaLambdapair = lambdadummy + lambdadummy2; tagb = 0; From ab04eb1a49070afb7047e5a26cad4bf0a4991a5d Mon Sep 17 00:00:00 2001 From: lucamicheletti93 <38209984+lucamicheletti93@users.noreply.github.com> Date: Wed, 30 Apr 2025 23:49:47 +0200 Subject: [PATCH 1142/1650] [PWGDQ] Fixing issue for dqEfficiency_withAssoc (#11037) Co-authored-by: Lucamicheletti93 --- PWGDQ/Tasks/dqEfficiency_withAssoc.cxx | 29 +++++++++----------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx index 3f2e22ba591..3e1a05fd34e 100644 --- a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx +++ b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx @@ -1299,7 +1299,7 @@ struct AnalysisSameEventPairing { if (context.mOptions.get("processDummy")) { return; } - bool isMCGen = context.mOptions.get("processMCGen") || context.mOptions.get("processMCGenWithEventSelection"); + bool isMCGen = context.mOptions.get("processMCGen"); VarManager::SetDefaultVarNames(); fEnableBarrelHistos = context.mOptions.get("processAllSkimmed") || context.mOptions.get("processBarrelOnlySkimmed") || context.mOptions.get("processBarrelOnlyWithCollSkimmed"); @@ -2050,7 +2050,7 @@ struct AnalysisSameEventPairing { { runSameEventPairing(events, trackAssocsPerCollision, barrelAssocs, barrelTracks, mcEvents, mcTracks); runSameEventPairing(events, muonAssocsPerCollision, muonAssocs, muons, mcEvents, mcTracks); - // Feature replaced by processMCGen and processMCGenWithEventSelection + // Feature replaced by processMCGen /*if (fConfigMC.runMCGenPair) { runMCGen(mcEvents, mcTracks); }*/ @@ -2062,7 +2062,7 @@ struct AnalysisSameEventPairing { MyBarrelTracksWithCovWithAmbiguities const& barrelTracks, ReducedMCEvents const& mcEvents, ReducedMCTracks const& mcTracks) { runSameEventPairing(events, trackAssocsPerCollision, barrelAssocs, barrelTracks, mcEvents, mcTracks); - // Feature replaced by processMCGen and processMCGenWithEventSelection + // Feature replaced by processMCGen /*if (fConfigMC.runMCGenPair) { runMCGen(mcEvents, mcTracks); }*/ @@ -2073,7 +2073,7 @@ struct AnalysisSameEventPairing { MyBarrelTracksWithCovWithAmbiguitiesWithColl const& barrelTracks, ReducedMCEvents const& mcEvents, ReducedMCTracks const& mcTracks) { runSameEventPairing(events, trackAssocsPerCollision, barrelAssocs, barrelTracks, mcEvents, mcTracks); - // Feature replaced by processMCGen and processMCGenWithEventSelection + // Feature replaced by processMCGen /*if (fConfigMC.runMCGenPair) { runMCGen(mcEvents, mcTracks); }*/ @@ -2083,19 +2083,18 @@ struct AnalysisSameEventPairing { soa::Join const& muonAssocs, MyMuonTracksWithCovWithAmbiguities const& muons, ReducedMCEvents const& mcEvents, ReducedMCTracks const& mcTracks) { runSameEventPairing(events, muonAssocsPerCollision, muonAssocs, muons, mcEvents, mcTracks); - // Feature replaced by processMCGen and processMCGenWithEventSelection + // Feature replaced by processMCGen /*if (fConfigMC.runMCGenPair) { runMCGen(mcEvents, mcTracks); }*/ } - void processMCGen(ReducedMCTracks const& mcTracks) + PresliceUnsorted perReducedMcGenEvent = aod::reducedtrackMC::reducedMCeventId; + + void processMCGen(soa::Filtered const& events, ReducedMCEvents const& /*mcEvents*/, ReducedMCTracks const& mcTracks) { - // loop over mc stack and fill histograms for pure MC truth signals - // group all the MC tracks which belong to the MC event corresponding to the current reconstructed event - // auto groupedMCTracks = tracksMC.sliceBy(aod::reducedtrackMC::reducedMCeventId, event.reducedMCevent().globalIndex()); + // Fill Generated histograms taking into account all generated tracks for (auto& mctrack : mcTracks) { - VarManager::FillTrackMC(mcTracks, mctrack); // NOTE: Signals are checked here mostly based on the skimmed MC stack, so depending on the requested signal, the stack could be incomplete. // NOTE: However, the working model is that the decisions on MC signals are precomputed during skimming and are stored in the mcReducedFlags member. @@ -2106,13 +2105,8 @@ struct AnalysisSameEventPairing { } } } - } - - PresliceUnsorted perReducedMcGenEvent = aod::reducedtrackMC::reducedMCeventId; - void processMCGenWithEventSelection(soa::Filtered const& events, - ReducedMCEvents const& /*mcEvents*/, ReducedMCTracks const& mcTracks) - { + // Fill Generated histograms taking into account selected collisions for (auto& event : events) { if (!event.isEventSelected_bit(0)) { continue; @@ -2124,9 +2118,7 @@ struct AnalysisSameEventPairing { auto groupedMCTracks = mcTracks.sliceBy(perReducedMcGenEvent, event.reducedMCeventId()); groupedMCTracks.bindInternalIndicesTo(&mcTracks); for (auto& track : groupedMCTracks) { - VarManager::FillTrackMC(mcTracks, track); - auto track_raw = groupedMCTracks.rawIteratorAt(track.globalIndex()); for (auto& sig : fGenMCSignals) { if (sig->CheckSignal(true, track_raw)) { @@ -2147,7 +2139,6 @@ struct AnalysisSameEventPairing { PROCESS_SWITCH(AnalysisSameEventPairing, processBarrelOnlyWithCollSkimmed, "Run barrel only pairing, with skimmed tracks and with collision information", false); PROCESS_SWITCH(AnalysisSameEventPairing, processMuonOnlySkimmed, "Run muon only pairing, with skimmed tracks", false); PROCESS_SWITCH(AnalysisSameEventPairing, processMCGen, "Loop over MC particle stack and fill generator level histograms", false); - PROCESS_SWITCH(AnalysisSameEventPairing, processMCGenWithEventSelection, "Loop over MC particle stack and fill generator level histograms with event selection", false); PROCESS_SWITCH(AnalysisSameEventPairing, processDummy, "Dummy function, enabled only if none of the others are enabled", false); }; From c207fd8246584b14f3ad94152af128552be25874 Mon Sep 17 00:00:00 2001 From: arvindkhuntia <31609955+arvindkhuntia@users.noreply.github.com> Date: Thu, 1 May 2025 00:14:26 +0200 Subject: [PATCH 1143/1650] [PWGJE] Added abs value for nSigmaTPC (#11022) Co-authored-by: Arvind Khuntia --- PWGJE/Tasks/nucleiInJets.cxx | 86 ++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 44 deletions(-) diff --git a/PWGJE/Tasks/nucleiInJets.cxx b/PWGJE/Tasks/nucleiInJets.cxx index 150824d438b..0d620b1986f 100644 --- a/PWGJE/Tasks/nucleiInJets.cxx +++ b/PWGJE/Tasks/nucleiInJets.cxx @@ -41,7 +41,6 @@ #include "EventFiltering/ZorroSummary.h" #include "ReconstructionDataFormats/Track.h" - #include "PWGLF/DataModel/LFParticleIdentification.h" #include "PWGJE/Core/FastJetUtilities.h" @@ -698,13 +697,13 @@ struct nucleiInJets { } if (useTOFNsigmaPreSel && trk.hasTOF()) { - if (std::fabs(trk.tofNSigmaPr()) < cfgnTPCPIDPrTOF) + if (std::abs(trk.tofNSigmaPr()) < cfgnTPCPIDPrTOF) jetHist.fill(HIST("tracks/proton/h3PtVsProtonNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaPr(), jetPt); - if (std::fabs(trk.tofNSigmaDe()) < cfgnTPCPIDDeTOF) + if (std::abs(trk.tofNSigmaDe()) < cfgnTPCPIDDeTOF) jetHist.fill(HIST("tracks/deuteron/h3PtVsDeuteronNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaDe(), jetPt); - if (std::fabs(trk.tofNSigmaHe()) < cfgnTPCPIDHeTOF) + if (std::abs(trk.tofNSigmaHe()) < cfgnTPCPIDHeTOF) jetHist.fill(HIST("tracks/helium/h3PtVsHeliumNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaHe(), jetPt); - if (std::fabs(trk.tofNSigmaTr()) < cfgnTPCPIDTrTOF) + if (std::abs(trk.tofNSigmaTr()) < cfgnTPCPIDTrTOF) jetHist.fill(HIST("tracks/triton/h3PtVsTritonNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaTr(), jetPt); } else if (!useTOFNsigmaPreSel) { jetHist.fill(HIST("tracks/proton/h3PtVsProtonNSigmaTPCVsPtJet_jet"), trk.pt(), trk.tpcNSigmaPr(), jetPt); @@ -720,7 +719,7 @@ struct nucleiInJets { jetHist.fill(HIST("tracks/deuteron/dca/after/hDCAxyVsPtDeuteron_jet"), trk.dcaXY(), trk.pt()); jetHist.fill(HIST("tracks/deuteron/dca/after/hDCAzVsPtDeuteron_jet"), trk.dcaZ(), trk.pt()); } - if (cEnableTritonQA && std::abs(trk.tpcNSigmaHe()) < cfgnTPCPIDTr) { + if (cEnableTritonQA && std::abs(trk.tpcNSigmaTr()) < cfgnTPCPIDTr) { jetHist.fill(HIST("tracks/triton/dca/after/hDCAxyVsPtTriton_jet"), trk.dcaXY(), trk.pt()); jetHist.fill(HIST("tracks/triton/dca/after/hDCAzVsPtTriton_jet"), trk.dcaZ(), trk.pt()); } @@ -746,24 +745,24 @@ struct nucleiInJets { jetHist.fill(HIST("tracks/proton/h3TpcNsigmaTofNsigmaProtonVsPt_jet"), trk.tpcNSigmaPr(), trk.tofNSigmaPr(), trk.pt()); jetHist.fill(HIST("tracks/deuteron/h3TpcNsigmaTofNsigmaDeuteronVsPt_jet"), trk.tpcNSigmaDe(), trk.tofNSigmaDe(), trk.pt()); } else { - if (trk.tpcNSigmaPr() < useTPCpreSel) { + if (std::abs(trk.tpcNSigmaPr()) < cfgnTPCPIDPr) { jetHist.fill(HIST("tracks/proton/h2TOFmassProtonVsPt_jet"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/proton/h2TOFmass2ProtonVsPt_jet"), massTOF * massTOF - gMassProton * gMassProton, trk.pt()); jetHist.fill(HIST("tracks/proton/h2TofNsigmaProtonVsPt_jet"), trk.tofNSigmaPr(), trk.pt()); jetHist.fill(HIST("tracks/proton/h3TpcNsigmaTofNsigmaProtonVsPt_jet"), trk.tpcNSigmaPr(), trk.tofNSigmaPr(), trk.pt()); } - if (trk.tpcNSigmaDe() < useTPCpreSel) { + if (std::abs(trk.tpcNSigmaDe()) < cfgnTPCPIDDe) { jetHist.fill(HIST("tracks/deuteron/h2TOFmassDeuteronVsPt_jet"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/deuteron/h2TOFmass2DeuteronVsPt_jet"), massTOF * massTOF - gMassDeuteron * gMassDeuteron, trk.pt()); jetHist.fill(HIST("tracks/deuteron/h2TofNsigmaDeuteronVsPt_jet"), trk.tofNSigmaDe(), trk.pt()); jetHist.fill(HIST("tracks/deuteron/h3TpcNsigmaTofNsigmaDeuteronVsPt_jet"), trk.tpcNSigmaDe(), trk.tofNSigmaDe(), trk.pt()); } - if (trk.tpcNSigmaTr() < useTPCpreSel) { + if (std::abs(trk.tpcNSigmaTr()) < cfgnTPCPIDTr) { jetHist.fill(HIST("tracks/triton/h2TOFmassTritonVsPt_jet"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/triton/h2TOFmass2TritonVsPt_jet"), massTOF * massTOF - gMassTriton * gMassTriton, trk.pt()); jetHist.fill(HIST("tracks/triton/h2TofNsigmaTritonVsPt_jet"), trk.tofNSigmaTr(), trk.pt()); } - if (trk.tpcNSigmaHe() < useTPCpreSel) { + if (std::abs(trk.tpcNSigmaHe()) < cfgnTPCPIDHe) { jetHist.fill(HIST("tracks/helium/h2TOFmassHeliumVsPt_jet"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/helium/h2TOFmass2HeliumVsPt_jet"), massTOF * massTOF - gMassHelium * gMassHelium, trk.pt()); jetHist.fill(HIST("tracks/helium/h2TofNsigmaHeliumVsPt_jet"), trk.tofNSigmaHe(), trk.pt()); @@ -807,7 +806,7 @@ struct nucleiInJets { jetHist.fill(HIST("tracks/antiDeuteron/dca/after/hDCAxyVsPtantiDeuteron_jet"), trk.dcaXY(), trk.pt()); jetHist.fill(HIST("tracks/antiDeuteron/dca/after/hDCAzVsPtantiDeuteron_jet"), trk.dcaZ(), trk.pt()); } - if (cEnableHeliumQA && std::abs(trk.tpcNSigmaHe()) < cfgnTPCPIDHe) { + if (cEnableHeliumQA && std::abs(trk.tpcNSigmaTr()) < cfgnTPCPIDTr) { jetHist.fill(HIST("tracks/antiTriton/dca/after/hDCAxyVsPtantiTriton_jet"), trk.dcaXY(), trk.pt()); jetHist.fill(HIST("tracks/antiTriton/dca/after/hDCAzVsPtantiTriton_jet"), trk.dcaZ(), trk.pt()); } @@ -836,24 +835,24 @@ struct nucleiInJets { jetHist.fill(HIST("tracks/antiHelium/h2TOFmass2antiHeliumVsPt_jet"), massTOF * massTOF - gMassHelium * gMassHelium, trk.pt()); jetHist.fill(HIST("tracks/antiHelium/h2TofNsigmaantiHeliumVsPt_jet"), trk.tofNSigmaHe(), trk.pt()); } else { - if (trk.tpcNSigmaPr() < useTPCpreSel) { + if (std::abs(trk.tpcNSigmaPr()) < cfgnTPCPIDPr) { jetHist.fill(HIST("tracks/antiProton/h2TOFmassantiProtonVsPt_jet"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/antiProton/h2TOFmass2antiProtonVsPt_jet"), massTOF * massTOF - gMassProton * gMassProton, trk.pt()); jetHist.fill(HIST("tracks/antiProton/h2TofNsigmaantiProtonVsPt_jet"), trk.tofNSigmaPr(), trk.pt()); jetHist.fill(HIST("tracks/antiProton/h3TpcNsigmaTofNsigmaantiProtonVsPt_jet"), trk.tpcNSigmaPr(), trk.tofNSigmaPr(), trk.pt()); } - if (trk.tpcNSigmaDe() < useTPCpreSel) { + if (std::abs(trk.tpcNSigmaDe()) < cfgnTPCPIDDe) { jetHist.fill(HIST("tracks/antiDeuteron/h2TOFmassantiDeuteronVsPt_jet"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/antiDeuteron/h2TOFmass2antiDeuteronVsPt_jet"), massTOF * massTOF - gMassDeuteron * gMassDeuteron, trk.pt()); jetHist.fill(HIST("tracks/antiDeuteron/h2TofNsigmaantiDeuteronVsPt_jet"), trk.tofNSigmaDe(), trk.pt()); jetHist.fill(HIST("tracks/antiDeuteron/h3TpcNsigmaTofNsigmaantiDeuteronVsPt_jet"), trk.tpcNSigmaDe(), trk.tofNSigmaDe(), trk.pt()); } - if (trk.tpcNSigmaTr() < useTPCpreSel) { + if (std::abs(trk.tpcNSigmaTr()) < cfgnTPCPIDTr) { jetHist.fill(HIST("tracks/antiTriton/h2TOFmassantiTritonVsPt_jet"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/antiTriton/h2TOFmass2antiTritonVsPt_jet"), massTOF * massTOF - gMassTriton * gMassTriton, trk.pt()); jetHist.fill(HIST("tracks/antiTriton/h2TofNsigmaantiTritonVsPt_jet"), trk.tofNSigmaTr(), trk.pt()); } - if (trk.tpcNSigmaHe() < useTPCpreSel) { + if (std::abs(trk.tpcNSigmaHe()) < cfgnTPCPIDHe) { jetHist.fill(HIST("tracks/antiHelium/h2TOFmassantiHeliumVsPt_jet"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/antiHelium/h2TOFmass2antiHeliumVsPt_jet"), massTOF * massTOF - gMassHelium * gMassHelium, trk.pt()); jetHist.fill(HIST("tracks/antiHelium/h2TofNsigmaantiHeliumVsPt_jet"), trk.tofNSigmaHe(), trk.pt()); @@ -864,10 +863,10 @@ struct nucleiInJets { jetHist.fill(HIST("tracks/antiPion/h2TofNsigmaantiPionVsPt_jet"), trk.tofNSigmaPi(), trk.pt()); jetHist.fill(HIST("tracks/antiKaon/h2TofNsigmaantiKaonVsPt_jet"), trk.tofNSigmaKa(), trk.pt()); } else { - if (trk.tpcNSigmaPi() < useTPCpreSel) { + if (std::abs(trk.tpcNSigmaPi()) < useTPCpreSel) { jetHist.fill(HIST("tracks/antiPion/h2TofNsigmaantiPionVsPt_jet"), trk.tofNSigmaPi(), trk.pt()); } - if (trk.tpcNSigmaKa() < useTPCpreSel) { + if (std::abs(trk.tpcNSigmaKa()) < useTPCpreSel) { jetHist.fill(HIST("tracks/antiKaon/h2TofNsigmaantiKaonVsPt_jet"), trk.tofNSigmaKa(), trk.pt()); } } @@ -917,7 +916,7 @@ struct nucleiInJets { jetHist.fill(HIST("tracks/deuteron/dca/after/hDCAxyVsPtDeuteron"), trk.dcaXY(), trk.pt()); jetHist.fill(HIST("tracks/deuteron/dca/after/hDCAzVsPtDeuteron"), trk.dcaZ(), trk.pt()); } - if (cEnableTritonQA && std::abs(trk.tpcNSigmaHe()) < cfgnTPCPIDTr) { + if (cEnableTritonQA && std::abs(trk.tpcNSigmaTr()) < cfgnTPCPIDTr) { jetHist.fill(HIST("tracks/triton/dca/after/hDCAxyVsPtTriton"), trk.dcaXY(), trk.pt()); jetHist.fill(HIST("tracks/triton/dca/after/hDCAzVsPtTriton"), trk.dcaZ(), trk.pt()); } @@ -943,28 +942,28 @@ struct nucleiInJets { jetHist.fill(HIST("tracks/helium/h2TOFmass2HeliumVsPt"), massTOF * massTOF - gMassHelium * gMassHelium, trk.pt()); jetHist.fill(HIST("tracks/triton/h2TofNsigmaTritonVsPt"), trk.tofNSigmaTr(), trk.pt()); } else { - if (trk.tpcNSigmaPr() < useTPCpreSel) { + if (std::abs(trk.tpcNSigmaPr()) < cfgnTPCPIDPr) { jetHist.fill(HIST("tracks/proton/h2TOFmassProtonVsPt"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/proton/h2TOFmass2ProtonVsPt"), massTOF * massTOF - gMassProton * gMassProton, trk.pt()); jetHist.fill(HIST("tracks/proton/h2TofNsigmaProtonVsPt"), trk.tofNSigmaPr(), trk.pt()); if (jetFlagPerpCone && isWithLeadingJet) jetHist.fill(HIST("tracks/perpCone/proton/h2TofNsigmaProtonVsPt"), trk.tofNSigmaPr(), trk.pt()); } - if (trk.tpcNSigmaDe() < useTPCpreSel) { + if (std::abs(trk.tpcNSigmaDe()) < cfgnTPCPIDDe) { jetHist.fill(HIST("tracks/deuteron/h2TOFmassDeuteronVsPt"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/deuteron/h2TOFmass2DeuteronVsPt"), massTOF * massTOF - gMassDeuteron * gMassDeuteron, trk.pt()); jetHist.fill(HIST("tracks/deuteron/h2TofNsigmaDeuteronVsPt"), trk.tofNSigmaDe(), trk.pt()); if (jetFlagPerpCone && isWithLeadingJet) jetHist.fill(HIST("tracks/perpCone/deuteron/h2TofNsigmaDeuteronVsPt"), trk.tofNSigmaDe(), trk.pt()); } - if (trk.tpcNSigmaTr() < useTPCpreSel) { + if (std::abs(trk.tpcNSigmaTr()) < cfgnTPCPIDTr) { jetHist.fill(HIST("tracks/triton/h2TOFmassTritonVsPt"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/triton/h2TOFmass2TritonVsPt"), massTOF * massTOF - gMassTriton * gMassTriton, trk.pt()); jetHist.fill(HIST("tracks/triton/h2TofNsigmaTritonVsPt"), trk.tofNSigmaTr(), trk.pt()); if (jetFlagPerpCone && isWithLeadingJet) jetHist.fill(HIST("tracks/perpCone/triton/h2TofNsigmaTritonVsPt"), trk.tofNSigmaTr(), trk.pt()); } - if (trk.tpcNSigmaHe() < useTPCpreSel) { + if (std::abs(trk.tpcNSigmaHe()) < cfgnTPCPIDHe) { jetHist.fill(HIST("tracks/helium/h2TOFmassHeliumVsPt"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/helium/h2TOFmass2HeliumVsPt"), massTOF * massTOF - gMassHelium * gMassHelium, trk.pt()); jetHist.fill(HIST("tracks/helium/h2TofNsigmaHeliumVsPt"), trk.tofNSigmaHe(), trk.pt()); @@ -978,7 +977,6 @@ struct nucleiInJets { jetHist.fill(HIST("tracks/antiDeuteron/h3PtVsantiDeuteronNSigmaTPC"), trk.pt(), trk.tpcNSigmaDe()); // De jetHist.fill(HIST("tracks/antiHelium/h3PtVsantiHeliumNSigmaTPC"), trk.pt(), trk.tpcNSigmaHe()); // He jetHist.fill(HIST("tracks/antiTriton/h3PtVsantiTritonNSigmaTPC"), trk.pt(), trk.tpcNSigmaTr()); // Tr - // perpCone if (jetFlagPerpCone && isWithLeadingJet) { // antiparticle info @@ -1033,28 +1031,28 @@ struct nucleiInJets { jetHist.fill(HIST("tracks/antiHelium/h2TOFmass2antiHeliumVsPt"), massTOF * massTOF - gMassHelium * gMassHelium, trk.pt()); jetHist.fill(HIST("tracks/antiTriton/h2TofNsigmaantiTritonVsPt"), trk.tofNSigmaTr(), trk.pt()); } else { - if (trk.tpcNSigmaPr() < useTPCpreSel) { + if (std::abs(trk.tpcNSigmaPr()) < cfgnTPCPIDPr) { jetHist.fill(HIST("tracks/antiProton/h2TOFmassantiProtonVsPt"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/antiProton/h2TOFmass2antiProtonVsPt"), massTOF * massTOF - gMassProton * gMassProton, trk.pt()); jetHist.fill(HIST("tracks/antiProton/h2TofNsigmaantiProtonVsPt"), trk.tofNSigmaPr(), trk.pt()); if (jetFlagPerpCone && isWithLeadingJet) jetHist.fill(HIST("tracks/perpCone/antiProton/h2TofNsigmaantiProtonVsPt"), trk.tofNSigmaPr(), trk.pt()); } - if (trk.tpcNSigmaDe() < useTPCpreSel) { + if (std::abs(trk.tpcNSigmaDe()) < cfgnTPCPIDDe) { jetHist.fill(HIST("tracks/antiDeuteron/h2TOFmassantiDeuteronVsPt"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/antiDeuteron/h2TOFmass2antiDeuteronVsPt"), massTOF * massTOF - gMassDeuteron * gMassDeuteron, trk.pt()); jetHist.fill(HIST("tracks/antiDeuteron/h2TofNsigmaantiDeuteronVsPt"), trk.tofNSigmaDe(), trk.pt()); if (jetFlagPerpCone && isWithLeadingJet) jetHist.fill(HIST("tracks/perpCone/antiDeuteron/h2TofNsigmaantiDeuteronVsPt"), trk.tofNSigmaDe(), trk.pt()); } - if (trk.tpcNSigmaTr() < useTPCpreSel) { + if (std::abs(trk.tpcNSigmaTr()) < cfgnTPCPIDTr) { jetHist.fill(HIST("tracks/antiTriton/h2TOFmassantiTritonVsPt"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/antiTriton/h2TOFmass2antiTritonVsPt"), massTOF * massTOF - gMassTriton * gMassTriton, trk.pt()); jetHist.fill(HIST("tracks/antiTriton/h2TofNsigmaantiTritonVsPt"), trk.tofNSigmaTr(), trk.pt()); if (jetFlagPerpCone && isWithLeadingJet) jetHist.fill(HIST("tracks/perpCone/antiTriton/h2TofNsigmaantiTritonVsPt"), trk.tofNSigmaTr(), trk.pt()); } - if (trk.tpcNSigmaHe() < useTPCpreSel) { + if (std::abs(trk.tpcNSigmaHe()) < cfgnTPCPIDHe) { jetHist.fill(HIST("tracks/antiHelium/h2TOFmassantiHeliumVsPt"), massTOF, trk.pt()); jetHist.fill(HIST("tracks/antiHelium/h2TOFmass2antiHeliumVsPt"), massTOF * massTOF - gMassHelium * gMassHelium, trk.pt()); jetHist.fill(HIST("tracks/antiHelium/h2TofNsigmaantiHeliumVsPt"), trk.tofNSigmaHe(), trk.pt()); @@ -1082,7 +1080,7 @@ struct nucleiInJets { } jetHist.fill(HIST("hNEvents"), 1.5); } - if (fabs(collision.posZ()) > 10) + if (std::abs(collision.posZ()) > 10) return; jetHist.fill(HIST("hNEvents"), 2.5); if (!jetderiveddatautilities::selectCollision(collision, jetderiveddatautilities::initialiseEventSelectionBits("sel8"))) @@ -1133,7 +1131,7 @@ struct nucleiInJets { } jetHist.fill(HIST("hNEvents"), 1.5); } - if (fabs(collision.posZ()) > 10) + if (std::abs(collision.posZ()) > 10) return; jetHist.fill(HIST("hNEvents"), 2.5); if (!jetderiveddatautilities::selectCollision(collision, jetderiveddatautilities::initialiseEventSelectionBits("sel8"))) @@ -1175,7 +1173,7 @@ struct nucleiInJets { jetHist.fill(HIST("mcpJet/eventStat"), 0.5); jetHist.fill(HIST("mcpJet/eventStat"), 1.5); - if (fabs(collision.posZ()) > 10) // bad vertex + if (std::abs(collision.posZ()) > 10) // bad vertex return; jetHist.fill(HIST("mcpJet/eventStat"), 2.5); @@ -1184,7 +1182,7 @@ struct nucleiInJets { bool INELgt0 = false; for (const auto& mcParticle : mcParticles) { - if (fabs(mcParticle.eta()) < cfgtrkMaxEta) { + if (std::fabs(mcParticle.eta()) < cfgtrkMaxEta) { INELgt0 = true; break; } @@ -1205,9 +1203,9 @@ struct nucleiInJets { for (const auto& mcParticle : mcParticles) { if (!mcParticle.isPhysicalPrimary()) continue; - if (fabs(mcParticle.eta()) > cfgtrkMaxEta) + if (std::fabs(mcParticle.eta()) > cfgtrkMaxEta) continue; - if (fabs(mcParticle.y()) > cfgtrkMaxRap) + if (std::fabs(mcParticle.y()) > cfgtrkMaxRap) continue; bool jetFlag = false; @@ -1236,13 +1234,13 @@ struct nucleiInJets { // bool jetFlag = kFALSE; jetHist.fill(HIST("mcdJet/eventStat"), 1.5); - if (fabs(collisionJet.posZ()) > 10) + if (std::abs(collisionJet.posZ()) > 10) return; jetHist.fill(HIST("mcdJet/eventStat"), 2.5); bool INELgt0 = false; for (const auto& track : tracks) { - if (fabs(track.eta()) < cfgtrkMaxEta) { + if (std::fabs(track.eta()) < cfgtrkMaxEta) { INELgt0 = true; break; } @@ -1275,7 +1273,7 @@ struct nucleiInJets { if (!track.has_mcParticle()) continue; auto mcTrack = track.mcParticle_as(); - if (fabs(mcTrack.eta()) > cfgtrkMaxEta) + if (std::fabs(mcTrack.eta()) > cfgtrkMaxEta) continue; if (!mcTrack.isPhysicalPrimary()) continue; @@ -1319,7 +1317,7 @@ struct nucleiInJets { soa::Join const& tracks, JetMCPartTable const&, TrackCandidatesMC const&, aod::JetParticles const& particleTracks, aod::JMcCollisions const&) { - if (fabs(collision.posZ()) > 10) + if (std::abs(collision.posZ()) > 10) return; if (!jetderiveddatautilities::selectCollision(collision, jetderiveddatautilities::initialiseEventSelectionBits("sel8"))) return; @@ -1327,7 +1325,7 @@ struct nucleiInJets { jetHist.fill(HIST("recmatched/vertexZ"), collision.posZ()); bool INELgt0 = false; for (const auto& track : tracks) { - if (fabs(track.eta()) < cfgtrkMaxEta) { + if (std::fabs(track.eta()) < cfgtrkMaxEta) { INELgt0 = true; break; } @@ -1403,7 +1401,7 @@ struct nucleiInJets { for (const auto& track : tracks) { auto completeTrack = track.track_as(); - if (fabs(completeTrack.eta()) > cfgtrkMaxEta) + if (std::fabs(completeTrack.eta()) > cfgtrkMaxEta) continue; if (!isTrackSelected(completeTrack)) continue; @@ -1412,7 +1410,7 @@ struct nucleiInJets { auto mcTrack = track.mcParticle_as(); if (!mcTrack.isPhysicalPrimary()) continue; - if (fabs(mcTrack.y()) > cfgtrkMaxRap) + if (std::fabs(mcTrack.y()) > cfgtrkMaxRap) continue; bool isTpcPassed(true); @@ -1487,9 +1485,9 @@ struct nucleiInJets { for (const auto& mcParticle : mcParticles_per_coll) { if (!mcParticle.isPhysicalPrimary()) continue; - if (fabs(mcParticle.eta()) > cfgtrkMaxEta) + if (std::fabs(mcParticle.eta()) > cfgtrkMaxEta) continue; - if (fabs(mcParticle.y()) > cfgtrkMaxRap) + if (std::fabs(mcParticle.y()) > cfgtrkMaxRap) continue; bool jetFlagMC = false; bool jetFlagPerpConeMC = false; @@ -1546,7 +1544,7 @@ struct nucleiInJets { if (!jetderiveddatautilities::selectCollision(recocoll, jetderiveddatautilities::initialiseEventSelectionBits("sel8"))) return; } - if (fabs(collision.posZ()) > 10) + if (std::abs(collision.posZ()) > 10) return; jetHist.fill(HIST("genmatched/vertexZ"), collision.posZ()); std::vector mcdJetPt{}; @@ -1612,7 +1610,7 @@ struct nucleiInJets { } // leading jet only for (const auto& mcParticle : mcParticles) { - if (fabs(mcParticle.eta()) > cfgtrkMaxEta) + if (std::fabs(mcParticle.eta()) > cfgtrkMaxEta) continue; // add pid later From f4a721b21838003232efa1bf1a733c9d6a61692b Mon Sep 17 00:00:00 2001 From: Florian Jonas Date: Thu, 1 May 2025 08:30:46 +0200 Subject: [PATCH 1144/1650] [PWGJE] fullJetTriggerQA light memory mode (#11039) --- PWGJE/Tasks/fullJetTriggerQATask.cxx | 663 +++++++++++++++------------ 1 file changed, 360 insertions(+), 303 deletions(-) diff --git a/PWGJE/Tasks/fullJetTriggerQATask.cxx b/PWGJE/Tasks/fullJetTriggerQATask.cxx index c9a9152381d..bbab8a61f0d 100644 --- a/PWGJE/Tasks/fullJetTriggerQATask.cxx +++ b/PWGJE/Tasks/fullJetTriggerQATask.cxx @@ -88,6 +88,7 @@ struct JetTriggerQA { Configurable b_DoFiducialCut{"b_DoFiducialCut", false, "do a fiducial cut on jets to check if they are in the emcal"}; Configurable b_RejectExoticClusters{"b_RejectExoticClusters", true, "Reject exotic clusters"}; Configurable f_GammaObservable{"f_gammaObservable", 0, "Observable for gamma trigger (0 - energy, 1 - pt)"}; + Configurable b_doLightOutput{"b_doLightOutput", true, "do light output (disables most histograms not needed for QA)"}; Configurable cfgVertexCut{"cfgVertexCut", 10.0f, "Accepted z-vertex range"}; Configurable mClusterDefinition{"clusterDefinition", "kV3Default", "cluster definition to be selected, e.g. V3Default"}; @@ -103,18 +104,18 @@ struct JetTriggerQA { jetReclusterer.algorithm = fastjet::JetAlgorithm::cambridge_algorithm; jetReclusterer.jetR = f_jetR * 2.5; // Use larger R for CA reclustering to prevent losing particles - Int_t nPtBins = 200; - Float_t kMinPt = 0.; - Float_t kMaxPt = 201.; - Int_t nPhiBins = 18 * 8; - Float_t kMinPhi = 0.; - Float_t kMaxPhi = 2. * TMath::Pi(); - Int_t nEtaBins = 100; - Float_t kMinEta = -1.; - Float_t kMaxEta = 1.; - Int_t nRBins = 6; - Float_t kMinR = 0.05; - Float_t kMaxR = 0.65; + int nPtBins = 200; + float kMinPt = 0.; + float kMaxPt = 201.; + int nPhiBins = 18 * 8; + float kMinPhi = 0.; + float kMaxPhi = o2::constants::math::TwoPI; + int nEtaBins = 100; + float kMinEta = -1.; + float kMaxEta = 1.; + int nRBins = 6; + float kMinR = 0.05; + float kMaxR = 0.65; // EMCAL gamma observables (for histogram and axis title) std::string observableName = (f_GammaObservable == 0) ? "Energy" : "#it{p}_{T}", @@ -137,9 +138,11 @@ struct JetTriggerQA { HistogramConfigSpec hJetRMaxPtEtaPhiNoFiducial({HistType::kTHnF, {rAxis, jetPtAxis, etaAxis, phiAxis}}); registry.add("jetRPtEtaPhi", "JetRPtEtaPhi", hJetRPtEtaPhi); - registry.add("jetRMaxPtEtaPhi", "JetRMaxPtEtaPhi", hJetRMaxPtEtaPhi); + if (!b_doLightOutput) + registry.add("jetRMaxPtEtaPhi", "JetRMaxPtEtaPhi", hJetRMaxPtEtaPhi); registry.add("jetRPtEtaPhiNoFiducial", "JetRPtEtaPhiNoFiducial", hJetRPtEtaPhiNoFiducial); - registry.add("jetRMaxPtEtaPhiNoFiducial", "JetRMaxPtEtaPhiNoFiducial", hJetRMaxPtEtaPhiNoFiducial); + if (!b_doLightOutput) + registry.add("jetRMaxPtEtaPhiNoFiducial", "JetRMaxPtEtaPhiNoFiducial", hJetRMaxPtEtaPhiNoFiducial); registry.add("hProcessedEvents", "Processed events", HistType::kTH1D, {{15, -0.5, 14.5, "Trigger type"}}); auto histProcessed = registry.get(HIST("hProcessedEvents")); @@ -170,156 +173,192 @@ struct JetTriggerQA { // Histograms for events where the EMCAL is live registry.add("hJetRPtEta", "Jets #it{p}_{T} and #eta", HistType::kTH3F, {rAxis, jetPtAxis, etaAxis}); registry.add("hJetRPtPhi", "Jets #it{p}_{T} and #phi", HistType::kTH3F, {rAxis, jetPtAxis, phiAxis}); - registry.add("hJetRMaxPtEta", "Leading jets #it{p}_{T} and #eta", HistType::kTH3F, {rAxis, jetPtAxis, etaAxis}); - registry.add("hJetRMaxPtPhi", "Leading jets #it{p}_{T} and #phi", HistType::kTH3F, {rAxis, jetPtAxis, phiAxis}); - registry.add("hJetRMaxPtEtaMinBias", "Leading jets #it{p}_{T} and #eta (min. bias)", HistType::kTH3F, {rAxis, jetPtAxis, etaAxis}); - registry.add("hJetRMaxPtPhiMinBias", "Leading jets #it{p}_{T} and #phi (min. bias)", HistType::kTH3F, {rAxis, jetPtAxis, phiAxis}); - registry.add("hJetRMaxPtEtaLevel0", "Leading jets #it{p}_{T} and #eta (level0)", HistType::kTH3F, {rAxis, jetPtAxis, etaAxis}); - registry.add("hJetRMaxPtPhiLevel0", "Leading jets #it{p}_{T} and #phi (level0)", HistType::kTH3F, {rAxis, jetPtAxis, phiAxis}); + if (!b_doLightOutput) { + registry.add("hJetRMaxPtEta", "Leading jets #it{p}_{T} and #eta", HistType::kTH3F, {rAxis, jetPtAxis, etaAxis}); + registry.add("hJetRMaxPtPhi", "Leading jets #it{p}_{T} and #phi", HistType::kTH3F, {rAxis, jetPtAxis, phiAxis}); + registry.add("hJetRMaxPtEtaMinBias", "Leading jets #it{p}_{T} and #eta (min. bias)", HistType::kTH3F, {rAxis, jetPtAxis, etaAxis}); + registry.add("hJetRMaxPtPhiMinBias", "Leading jets #it{p}_{T} and #phi (min. bias)", HistType::kTH3F, {rAxis, jetPtAxis, phiAxis}); + registry.add("hJetRMaxPtEtaLevel0", "Leading jets #it{p}_{T} and #eta (level0)", HistType::kTH3F, {rAxis, jetPtAxis, etaAxis}); + registry.add("hJetRMaxPtPhiLevel0", "Leading jets #it{p}_{T} and #phi (level0)", HistType::kTH3F, {rAxis, jetPtAxis, phiAxis}); + } registry.add("hClusterPtEtaPhi", Form("Cluster %s, #eta and #phi", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); registry.add("hClusterPtEtaPhiMinBias", Form("Cluster %s (Min. bias trigger), #eta and #phi", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); registry.add("hClusterPtEtaPhiLevel0", Form("Cluster %s (Level-0 trigger), #eta and #phi", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); - registry.add("hClusterEMCALMaxPtEtaPhi", Form("Leading cluster %s, #eta and #phi (EMCAL)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); - registry.add("hClusterEMCALMaxPtEtaPhiMinBias", Form("Leading cluster %s, #eta and #phi (EMCAL, min. bias trigger)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); - registry.add("hClusterEMCALMaxPtEtaPhiLevel0", Form("Leading cluster %s, #eta and #phi (EMCAL, Level-0 trigger)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); - registry.add("hClusterDCALMaxPtEtaPhi", Form("Leading cluster %s, #eta and #phi (DCAL)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); - registry.add("hClusterDCALMaxPtEtaPhiMinBias", Form("Leading cluster %s, #eta and #phi (DCAL, min, bias trigger)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); - registry.add("hClusterDCALMaxPtEtaPhiLevel0", Form("Leading cluster %s, #eta and #phi (DCAL, Level-0 trigger)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); - registry.add("hEventsNoMaxClusterEMCAL", "Events with no max. cluster in EMCAL", HistType::kTH1D, {{1, 0.5, 1.5}}); - registry.add("hEventsNoMaxClusterEMCALMinBias", "Events with no max. cluster in EMCAL (min. bias trigger)", HistType::kTH1D, {{1, 0.5, 1.5}}); - registry.add("hEventsNoMaxClusterEMCALLevel0", "Events with no max. cluster in EMCAL (level0 trigger)", HistType::kTH1D, {{1, 0.5, 1.5}}); - registry.add("hEventsNoMaxClusterDCAL", ("Events with no max. cluster in DCAL"), HistType::kTH1D, {{1, 0.5, 1.5}}); - registry.add("hEventsNoMaxClusterDCALMinBias", "Events with no max. cluster in DCAL (min. bias trigger)", HistType::kTH1D, {{1, 0.5, 1.5}}); - registry.add("hEventsNoMaxClusterDCALLevel0", "Events with no max. cluster in DCAL (level0 trigger)", HistType::kTH1D, {{1, 0.5, 1.5}}); - registry.add("hEventsNoMaxJet", "Events with no max. jet", HistType::kTH1D, {{rAxis}}); - registry.add("hEventsNoMaxJetMinBias", "Events with no max. jet (min. bias trigger)", HistType::kTH1D, {{rAxis}}); - registry.add("hEventsNoMaxJetLevel0", "Events with no max. jet (level0 trigger)", HistType::kTH1D, {{rAxis}}); - registry.add("hJetRPtTrackPt", "Jets", HistType::kTH3F, {rAxis, jetPtAxis, ptAxisTrackInJet}); - registry.add("hJetRPtClusterPt", "Jets", HistType::kTH3F, {rAxis, jetPtAxis, ptAxisClusterInJet}); - registry.add("hJetRPtPtd", "Jets", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "p_{t,D}"}}); - registry.add("hJetRPtChargeFrag", "Jets", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "z"}}); - registry.add("hJetRPtNEF", "Jets", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "NEF"}}); - registry.add("hJetRPtZTheta", "Jets", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "z#theta"}}); - registry.add("hJetRPtZSqTheta", "Jets", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "z^{2} #theta"}}); - registry.add("hJetRPtZThetaSq", "Jets", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "z #theta^{2}"}}); - registry.add("hJetRMaxPtClusterMaxPt", "Leading jets and clusters", HistType::kTH3F, {rAxis, jetPtAxis, observableAxisCluster}); + + if (!b_doLightOutput) { + registry.add("hClusterEMCALMaxPtEtaPhi", Form("Leading cluster %s, #eta and #phi (EMCAL)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); + registry.add("hClusterEMCALMaxPtEtaPhiMinBias", Form("Leading cluster %s, #eta and #phi (EMCAL, min. bias trigger)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); + registry.add("hClusterEMCALMaxPtEtaPhiLevel0", Form("Leading cluster %s, #eta and #phi (EMCAL, Level-0 trigger)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); + registry.add("hClusterDCALMaxPtEtaPhi", Form("Leading cluster %s, #eta and #phi (DCAL)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); + registry.add("hClusterDCALMaxPtEtaPhiMinBias", Form("Leading cluster %s, #eta and #phi (DCAL, min, bias trigger)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); + registry.add("hClusterDCALMaxPtEtaPhiLevel0", Form("Leading cluster %s, #eta and #phi (DCAL, Level-0 trigger)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); + registry.add("hEventsNoMaxClusterEMCAL", "Events with no max. cluster in EMCAL", HistType::kTH1D, {{1, 0.5, 1.5}}); + registry.add("hEventsNoMaxClusterEMCALMinBias", "Events with no max. cluster in EMCAL (min. bias trigger)", HistType::kTH1D, {{1, 0.5, 1.5}}); + registry.add("hEventsNoMaxClusterEMCALLevel0", "Events with no max. cluster in EMCAL (level0 trigger)", HistType::kTH1D, {{1, 0.5, 1.5}}); + registry.add("hEventsNoMaxClusterDCAL", ("Events with no max. cluster in DCAL"), HistType::kTH1D, {{1, 0.5, 1.5}}); + registry.add("hEventsNoMaxClusterDCALMinBias", "Events with no max. cluster in DCAL (min. bias trigger)", HistType::kTH1D, {{1, 0.5, 1.5}}); + registry.add("hEventsNoMaxClusterDCALLevel0", "Events with no max. cluster in DCAL (level0 trigger)", HistType::kTH1D, {{1, 0.5, 1.5}}); + registry.add("hEventsNoMaxJet", "Events with no max. jet", HistType::kTH1D, {{rAxis}}); + registry.add("hEventsNoMaxJetMinBias", "Events with no max. jet (min. bias trigger)", HistType::kTH1D, {{rAxis}}); + registry.add("hEventsNoMaxJetLevel0", "Events with no max. jet (level0 trigger)", HistType::kTH1D, {{rAxis}}); + + registry.add("hJetRPtTrackPt", "Jets", HistType::kTH3F, {rAxis, jetPtAxis, ptAxisTrackInJet}); + registry.add("hJetRPtClusterPt", "Jets", HistType::kTH3F, {rAxis, jetPtAxis, ptAxisClusterInJet}); + registry.add("hJetRPtPtd", "Jets", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "p_{t,D}"}}); + registry.add("hJetRPtChargeFrag", "Jets", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "z"}}); + registry.add("hJetRPtNEF", "Jets", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "NEF"}}); + registry.add("hJetRPtZTheta", "Jets", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "z#theta"}}); + registry.add("hJetRPtZSqTheta", "Jets", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "z^{2} #theta"}}); + registry.add("hJetRPtZThetaSq", "Jets", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "z #theta^{2}"}}); + + registry.add("hJetRMaxPtClusterMaxPt", "Leading jets and clusters", HistType::kTH3F, {rAxis, jetPtAxis, observableAxisCluster}); + } // Histograms for triggered events registry.add("hSelectedClusterPtEtaPhi", Form("Selected cluster %s, #eta and #phi", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); - registry.add("hSelectedClusterMaxPtEtaPhi", Form("Leading Selected cluster %s, #eta and #phi", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); + + if (!b_doLightOutput) { + registry.add("hSelectedClusterMaxPtEtaPhi", Form("Leading Selected cluster %s, #eta and #phi", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); + } // Jet high trigger - registry.add("hSelectedJetRMaxPtEta", "Leading selected jets #it{p}_{T} and #eta", HistType::kTH3F, {rAxis, jetPtAxis, etaAxis}); - registry.add("hSelectedJetRMaxPtPhi", "Leading selected jets #it{p}_{T} and #phi", HistType::kTH3F, {rAxis, jetPtAxis, phiAxis}); + if (!b_doLightOutput) { + registry.add("hSelectedJetRMaxPtEta", "Leading selected jets #it{p}_{T} and #eta", HistType::kTH3F, {rAxis, jetPtAxis, etaAxis}); + registry.add("hSelectedJetRMaxPtPhi", "Leading selected jets #it{p}_{T} and #phi", HistType::kTH3F, {rAxis, jetPtAxis, phiAxis}); + } registry.add("hSelectedJetRPtEta", "Selected jets #it{p}_{T} and #eta", HistType::kTH3F, {rAxis, jetPtAxis, etaAxis}); registry.add("hSelectedJetRPtPhi", "Selected jets #it{p}_{T} and #phi", HistType::kTH3F, {rAxis, jetPtAxis, phiAxis}); - registry.add("hSelectedJetRPtTrackPt", "Selected jets", HistType::kTH3F, {rAxis, jetPtAxis, ptAxisTrackInJet}); - registry.add("hSelectedJetRPtClusterPt", "Selected jets", HistType::kTH3F, {rAxis, jetPtAxis, ptAxisClusterInJet}); - registry.add("hSelectedJetRPtPtd", "Selected jets", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "p_{t,D}"}}); - registry.add("hSelectedJetRPtChargeFrag", "Selected jets", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "z"}}); - registry.add("hSelectedJetRPtNEF", "Selected jets", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "NEF"}}); - registry.add("hSelectedJetRPtZTheta", "Selected jets", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "z#theta"}}); - registry.add("hSelectedJetRPtZSqTheta", "Selected jets", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "z^{2} #theta"}}); - registry.add("hSelectedJetRPtZThetaSq", "Selected jets", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "z #theta^{2}"}}); + if (!b_doLightOutput) { + registry.add("hSelectedJetRPtTrackPt", "Selected jets", HistType::kTH3F, {rAxis, jetPtAxis, ptAxisTrackInJet}); + registry.add("hSelectedJetRPtClusterPt", "Selected jets", HistType::kTH3F, {rAxis, jetPtAxis, ptAxisClusterInJet}); + registry.add("hSelectedJetRPtPtd", "Selected jets", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "p_{t,D}"}}); + registry.add("hSelectedJetRPtChargeFrag", "Selected jets", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "z"}}); + registry.add("hSelectedJetRPtNEF", "Selected jets", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "NEF"}}); + registry.add("hSelectedJetRPtZTheta", "Selected jets", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "z#theta"}}); + registry.add("hSelectedJetRPtZSqTheta", "Selected jets", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "z^{2} #theta"}}); + registry.add("hSelectedJetRPtZThetaSq", "Selected jets", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "z #theta^{2}"}}); + } // Jet low trigger - registry.add("hSelectedJetLowRMaxPtEta", "Leading selected jets (low threshold) #it{p}_{T} and #eta", HistType::kTH3F, {rAxis, jetPtAxis, etaAxis}); - registry.add("hSelectedJetLowRMaxPtPhi", "Leading selected jets (low threshold) #it{p}_{T} and #phi", HistType::kTH3F, {rAxis, jetPtAxis, phiAxis}); + if (!b_doLightOutput) { + registry.add("hSelectedJetLowRMaxPtEta", "Leading selected jets (low threshold) #it{p}_{T} and #eta", HistType::kTH3F, {rAxis, jetPtAxis, etaAxis}); + registry.add("hSelectedJetLowRMaxPtPhi", "Leading selected jets (low threshold) #it{p}_{T} and #phi", HistType::kTH3F, {rAxis, jetPtAxis, phiAxis}); + } registry.add("hSelectedJetLowRPtEta", "Selected jets (low threshold) #it{p}_{T} and #eta", HistType::kTH3F, {rAxis, jetPtAxis, etaAxis}); registry.add("hSelectedJetLowRPtPhi", "Selected jets (low threshold) #it{p}_{T} and #phi", HistType::kTH3F, {rAxis, jetPtAxis, phiAxis}); - registry.add("hSelectedJetLowRPtTrackPt", "Selected jets (low threshold)", HistType::kTH3F, {rAxis, jetPtAxis, ptAxisTrackInJet}); - registry.add("hSelectedJetLowRPtClusterPt", "Selected jets (low threshold)", HistType::kTH3F, {rAxis, jetPtAxis, ptAxisClusterInJet}); - registry.add("hSelectedJetLowRPtPtd", "Selected jets (low threshold)", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "p_{t,D}"}}); - registry.add("hSelectedJetLowRPtChargeFrag", "Selected jets (low threshold)", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "z"}}); - registry.add("hSelectedJetLowRPtNEF", "Selected jets (low threshold)", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "NEF"}}); - registry.add("hSelectedJetLowRPtZTheta", "Selected jets (low threshold)", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "z#theta"}}); - registry.add("hSelectedJetLowRPtZSqTheta", "Selected jets (low threshold)", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "z^{2} #theta"}}); - registry.add("hSelectedJetLowRPtZThetaSq", "Selected jets (low threshold)", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "z #theta^{2}"}}); + + if (!b_doLightOutput) { + registry.add("hSelectedJetLowRPtTrackPt", "Selected jets (low threshold)", HistType::kTH3F, {rAxis, jetPtAxis, ptAxisTrackInJet}); + registry.add("hSelectedJetLowRPtClusterPt", "Selected jets (low threshold)", HistType::kTH3F, {rAxis, jetPtAxis, ptAxisClusterInJet}); + registry.add("hSelectedJetLowRPtPtd", "Selected jets (low threshold)", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "p_{t,D}"}}); + registry.add("hSelectedJetLowRPtChargeFrag", "Selected jets (low threshold)", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "z"}}); + registry.add("hSelectedJetLowRPtNEF", "Selected jets (low threshold)", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "NEF"}}); + registry.add("hSelectedJetLowRPtZTheta", "Selected jets (low threshold)", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "z#theta"}}); + registry.add("hSelectedJetLowRPtZSqTheta", "Selected jets (low threshold)", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "z^{2} #theta"}}); + registry.add("hSelectedJetLowRPtZThetaSq", "Selected jets (low threshold)", HistType::kTH3F, {rAxis, jetPtAxis, {nPtBins / 2, 0., 1., "z #theta^{2}"}}); + } // EMCAL gamma very-high trigger registry.add("hSelectedGammaEMCALPtEtaPhiVeryHigh", Form("Selected Gamma %s, #eta and #phi (EMCAL, very high threshold)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); - registry.add("hSelectedGammaEMCALMaxPtEtaPhiVeryHigh", Form("Leading selected gamma %s, #eta and #phi (EMCAL, very high treshold)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); + if (!b_doLightOutput) + registry.add("hSelectedGammaEMCALMaxPtEtaPhiVeryHigh", Form("Leading selected gamma %s, #eta and #phi (EMCAL, very high treshold)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); // DCAL gamma very-high trigger registry.add("hSelectedGammaDCALPtEtaPhiVeryHigh", Form("Selected gamma %s, #eta and #phi (DCAL, very high treshold)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); - registry.add("hSelectedGammaDCALMaxPtEtaPhiVeryHigh", Form("Leading selected gamma %s, #eta and #phi (DCAL, very high treshold)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); + if (!b_doLightOutput) + registry.add("hSelectedGammaDCALMaxPtEtaPhiVeryHigh", Form("Leading selected gamma %s, #eta and #phi (DCAL, very high treshold)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); // EG1 trigger registry.add("hSelectedGammaEMCALPtEtaPhi", Form("Selected Gamma %s, #eta and #phi (EMCAL, high threshold)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); - registry.add("hSelectedGammaEMCALMaxPtEtaPhi", Form("Leading selected gamma %s, #eta and #phi (EMCAL, high treshold)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); + if (!b_doLightOutput) + registry.add("hSelectedGammaEMCALMaxPtEtaPhi", Form("Leading selected gamma %s, #eta and #phi (EMCAL, high treshold)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); // DG1 trigger registry.add("hSelectedGammaDCALPtEtaPhi", Form("Selected gamma %s, #eta and #phi (DCAL, high treshold)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); - registry.add("hSelectedGammaDCALMaxPtEtaPhi", Form("Leading selected gamma %s, #eta and #phi (DCAL, high treshold)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); + if (!b_doLightOutput) + registry.add("hSelectedGammaDCALMaxPtEtaPhi", Form("Leading selected gamma %s, #eta and #phi (DCAL, high treshold)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); // EG2 trigger registry.add("hSelectedGammaEMCALPtEtaPhiLow", Form("Selected gamma %s, #eta and #phi (EMCAL, low threshold)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); - registry.add("hSelectedGammaEMCALMaxPtEtaPhiLow", Form("Leading selected gamma %s, #eta and #phi (EMCAL, low threshold)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); + if (!b_doLightOutput) + registry.add("hSelectedGammaEMCALMaxPtEtaPhiLow", Form("Leading selected gamma %s, #eta and #phi (EMCAL, low threshold)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); // DG2 trigger registry.add("hSelectedGammaDCALPtEtaPhiLow", Form("Selected gamma %s, #eta and #phi (DCAL, low threshold)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); - registry.add("hSelectedGammaDCALMaxPtEtaPhiLow", Form("Leading selected gamma %s, #eta and #phi (DCAL, low threshold)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); + if (!b_doLightOutput) + registry.add("hSelectedGammaDCALMaxPtEtaPhiLow", Form("Leading selected gamma %s, #eta and #phi (DCAL, low threshold)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); // EMCAL gamma very-low trigger registry.add("hSelectedGammaEMCALPtEtaPhiVeryLow", Form("Selected gamma %s, #eta and #phi (EMCAL, very low threshold)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); - registry.add("hSelectedGammaEMCALMaxPtEtaPhiVeryLow", Form("Leading selected gamma %s, #eta and #phi (EMCAL, very low threshold)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); + if (!b_doLightOutput) + registry.add("hSelectedGammaEMCALMaxPtEtaPhiVeryLow", Form("Leading selected gamma %s, #eta and #phi (EMCAL, very low threshold)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); // DCAL gamma very-low trigger registry.add("hSelectedGammaDCALPtEtaPhiVeryLow", Form("Selected gamma %s, #eta and #phi (DCAL, low threshold)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); - registry.add("hSelectedGammaDCALMaxPtEtaPhiVeryLow", Form("Leading selected gamma %s, #eta and #phi (DCAL, low threshold)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); - - registry.add("hSelectedJetRMaxPtClusterMaxPt", "Leading selected jets and clusters", HistType::kTH3F, {rAxis, jetPtAxis, observableAxisCluster}); - registry.add("hJetRMaxPtJetPt", "Leading jet #it{p}_{T} vs jet #it{p}_{T}", HistType::kTH3F, {rAxis, jetMaxPtAxis, jetPtAxis}); - registry.add("hJetRMaxPtJetPtNoFiducial", "Leading jet #it{p}_{T} vs jet #it{p}_{T} (no fiducial cut)", HistType::kTH3F, {rAxis, jetMaxPtAxis, jetPtAxis}); - registry.add("hClusterEMCALMaxPtClusterEMCALPt", Form("Leading clusterEMCAL %s vs clusterEMCAL %s", observableName.data(), observableName.data()), HistType::kTH2F, {observableAxisMaxCluster, observableAxisCluster}); - registry.add("hClusterDCALMaxPtClusterDCALPt", Form("Leading clusterDCAL %s vs clusterDCAL %s", observableName.data(), observableName.data()), HistType::kTH2F, {observableAxisMaxCluster, observableAxisCluster}); + if (!b_doLightOutput) + registry.add("hSelectedGammaDCALMaxPtEtaPhiVeryLow", Form("Leading selected gamma %s, #eta and #phi (DCAL, low threshold)", observableName.data()), HistType::kTH3F, {observableAxisCluster, etaAxis, phiAxis}); + + if (!b_doLightOutput) { + registry.add("hSelectedJetRMaxPtClusterMaxPt", "Leading selected jets and clusters", HistType::kTH3F, {rAxis, jetPtAxis, observableAxisCluster}); + registry.add("hJetRMaxPtJetPt", "Leading jet #it{p}_{T} vs jet #it{p}_{T}", HistType::kTH3F, {rAxis, jetMaxPtAxis, jetPtAxis}); + registry.add("hJetRMaxPtJetPtNoFiducial", "Leading jet #it{p}_{T} vs jet #it{p}_{T} (no fiducial cut)", HistType::kTH3F, {rAxis, jetMaxPtAxis, jetPtAxis}); + registry.add("hClusterEMCALMaxPtClusterEMCALPt", Form("Leading clusterEMCAL %s vs clusterEMCAL %s", observableName.data(), observableName.data()), HistType::kTH2F, {observableAxisMaxCluster, observableAxisCluster}); + registry.add("hClusterDCALMaxPtClusterDCALPt", Form("Leading clusterDCAL %s vs clusterDCAL %s", observableName.data(), observableName.data()), HistType::kTH2F, {observableAxisMaxCluster, observableAxisCluster}); + } if (b_JetsInEmcalOnly) { registry.get(HIST("hJetRPtEta"))->SetTitle("Jets (in emcal only) #it{p}_{T} and #eta"); registry.get(HIST("hJetRPtPhi"))->SetTitle("Jets (in emcal only) #it{p}_{T} and #phi"); - registry.get(HIST("hJetRPtTrackPt"))->SetTitle("Jets (in emcal only)"); - registry.get(HIST("hJetRPtClusterPt"))->SetTitle("Jets (in emcal only)"); - registry.get(HIST("hJetRPtPtd"))->SetTitle("Jets (in emcal only)"); - registry.get(HIST("hJetRPtChargeFrag"))->SetTitle("Jets (in emcal only)"); - registry.get(HIST("hJetRPtNEF"))->SetTitle("Jets (in emcal only)"); - registry.get(HIST("hJetRPtZTheta"))->SetTitle("Jets (in emcal only)"); - registry.get(HIST("hJetRPtZSqTheta"))->SetTitle("Jets (in emcal only)"); - registry.get(HIST("hJetRPtZThetaSq"))->SetTitle("Jets (in emcal only)"); - registry.get(HIST("hJetRMaxPtEta"))->SetTitle("Leading jets (in emcal only) #it{p}_{T} and #eta"); - registry.get(HIST("hJetRMaxPtPhi"))->SetTitle("Leading jets (in emcal only) #it{p}_{T} and #phi"); - registry.get(HIST("hJetRMaxPtEtaMinBias"))->SetTitle("Leading jets (in emcal only, min. bias) #it{p}_{T} and #eta"); - registry.get(HIST("hJetRMaxPtPhiMinBias"))->SetTitle("Leading jets (in emcal only, min. bias) #it{p}_{T} and #phi"); - registry.get(HIST("hJetRMaxPtEtaLevel0"))->SetTitle("Leading jets (in emcal only, level-0) #it{p}_{T} and #eta"); - registry.get(HIST("hJetRMaxPtPhiLevel0"))->SetTitle("Leading jets (in emcal only, level-0) #it{p}_{T} and #phi"); - registry.get(HIST("hJetRMaxPtClusterMaxPt"))->SetTitle("Leading jets (in emcal only) and clusters"); + if (!b_doLightOutput) { + registry.get(HIST("hJetRPtTrackPt"))->SetTitle("Jets (in emcal only)"); + registry.get(HIST("hJetRPtClusterPt"))->SetTitle("Jets (in emcal only)"); + registry.get(HIST("hJetRPtPtd"))->SetTitle("Jets (in emcal only)"); + registry.get(HIST("hJetRPtChargeFrag"))->SetTitle("Jets (in emcal only)"); + registry.get(HIST("hJetRPtNEF"))->SetTitle("Jets (in emcal only)"); + registry.get(HIST("hJetRPtZTheta"))->SetTitle("Jets (in emcal only)"); + registry.get(HIST("hJetRPtZSqTheta"))->SetTitle("Jets (in emcal only)"); + registry.get(HIST("hJetRPtZThetaSq"))->SetTitle("Jets (in emcal only)"); + + registry.get(HIST("hJetRMaxPtEta"))->SetTitle("Leading jets (in emcal only) #it{p}_{T} and #eta"); + registry.get(HIST("hJetRMaxPtPhi"))->SetTitle("Leading jets (in emcal only) #it{p}_{T} and #phi"); + registry.get(HIST("hJetRMaxPtEtaMinBias"))->SetTitle("Leading jets (in emcal only, min. bias) #it{p}_{T} and #eta"); + registry.get(HIST("hJetRMaxPtPhiMinBias"))->SetTitle("Leading jets (in emcal only, min. bias) #it{p}_{T} and #phi"); + registry.get(HIST("hJetRMaxPtEtaLevel0"))->SetTitle("Leading jets (in emcal only, level-0) #it{p}_{T} and #eta"); + registry.get(HIST("hJetRMaxPtPhiLevel0"))->SetTitle("Leading jets (in emcal only, level-0) #it{p}_{T} and #phi"); + registry.get(HIST("hJetRMaxPtClusterMaxPt"))->SetTitle("Leading jets (in emcal only) and clusters"); + } registry.get(HIST("hSelectedJetRPtEta"))->SetTitle("Selected jets (in emcal only) #it{p}_{T} and #eta"); registry.get(HIST("hSelectedJetRPtPhi"))->SetTitle("Selected jets (in emcal only) #it{p}_{T} and #phi"); - registry.get(HIST("hSelectedJetRPtTrackPt"))->SetTitle("Selected jets (in emcal only)"); - registry.get(HIST("hSelectedJetRPtClusterPt"))->SetTitle("Selected jets (in emcal only)"); - registry.get(HIST("hSelectedJetRPtPtd"))->SetTitle("Selected jets (in emcal only)"); - registry.get(HIST("hSelectedJetRPtChargeFrag"))->SetTitle("Selected jets (in emcal only)"); - registry.get(HIST("hSelectedJetRPtNEF"))->SetTitle("Selected jets (in emcal only)"); - registry.get(HIST("hSelectedJetRPtZTheta"))->SetTitle("Selected jets (in emcal only)"); - registry.get(HIST("hSelectedJetRPtZSqTheta"))->SetTitle("Selected jets (in emcal only)"); - registry.get(HIST("hSelectedJetRPtZThetaSq"))->SetTitle("Selected jets (in emcal only)"); + if (!b_doLightOutput) { + registry.get(HIST("hSelectedJetRPtTrackPt"))->SetTitle("Selected jets (in emcal only)"); + registry.get(HIST("hSelectedJetRPtClusterPt"))->SetTitle("Selected jets (in emcal only)"); + registry.get(HIST("hSelectedJetRPtPtd"))->SetTitle("Selected jets (in emcal only)"); + registry.get(HIST("hSelectedJetRPtChargeFrag"))->SetTitle("Selected jets (in emcal only)"); + registry.get(HIST("hSelectedJetRPtNEF"))->SetTitle("Selected jets (in emcal only)"); + registry.get(HIST("hSelectedJetRPtZTheta"))->SetTitle("Selected jets (in emcal only)"); + registry.get(HIST("hSelectedJetRPtZSqTheta"))->SetTitle("Selected jets (in emcal only)"); + registry.get(HIST("hSelectedJetRPtZThetaSq"))->SetTitle("Selected jets (in emcal only)"); + } registry.get(HIST("hSelectedJetLowRPtEta"))->SetTitle("Selected jets (low threshold, in emcal only) #it{p}_{T} and #eta"); registry.get(HIST("hSelectedJetLowRPtPhi"))->SetTitle("Selected jets (low threshold, in emcal only) #it{p}_{T} and #phi"); - registry.get(HIST("hSelectedJetLowRPtTrackPt"))->SetTitle("Selected jets (low threshold, in emcal only)"); - registry.get(HIST("hSelectedJetLowRPtClusterPt"))->SetTitle("Selected jets (low threshold, in emcal only)"); - registry.get(HIST("hSelectedJetLowRPtPtd"))->SetTitle("Selected jets (low threshold, in emcal only)"); - registry.get(HIST("hSelectedJetLowRPtChargeFrag"))->SetTitle("Selected jets (low threshold, in emcal only)"); - registry.get(HIST("hSelectedJetLowRPtNEF"))->SetTitle("Selected jets (low threshold, in emcal only)"); - registry.get(HIST("hSelectedJetLowRPtZTheta"))->SetTitle("Selected jets (low threshold, in emcal only)"); - registry.get(HIST("hSelectedJetLowRPtZSqTheta"))->SetTitle("Selected jets (low threshold, in emcal only)"); - registry.get(HIST("hSelectedJetLowRPtZThetaSq"))->SetTitle("Selected jets (low threshold, in emcal only)"); - - registry.get(HIST("hSelectedJetRMaxPtEta"))->SetTitle("Leading selected jets (in emcal only) #it{p}_{T} and #eta"); - registry.get(HIST("hSelectedJetRMaxPtPhi"))->SetTitle("Leading selected jets (in emcal only) #it{p}_{T} and #phi"); - registry.get(HIST("hSelectedJetRMaxPtClusterMaxPt"))->SetTitle("Leading selected jets (in emcal only) and clusters"); - - registry.get(HIST("hJetRMaxPtJetPt"))->SetTitle("Leading jet #it{p}_{T} vs jet #it{p}_{T} (in emcal only)"); + if (!b_doLightOutput) { + registry.get(HIST("hSelectedJetLowRPtTrackPt"))->SetTitle("Selected jets (low threshold, in emcal only)"); + registry.get(HIST("hSelectedJetLowRPtClusterPt"))->SetTitle("Selected jets (low threshold, in emcal only)"); + registry.get(HIST("hSelectedJetLowRPtPtd"))->SetTitle("Selected jets (low threshold, in emcal only)"); + registry.get(HIST("hSelectedJetLowRPtChargeFrag"))->SetTitle("Selected jets (low threshold, in emcal only)"); + registry.get(HIST("hSelectedJetLowRPtNEF"))->SetTitle("Selected jets (low threshold, in emcal only)"); + registry.get(HIST("hSelectedJetLowRPtZTheta"))->SetTitle("Selected jets (low threshold, in emcal only)"); + registry.get(HIST("hSelectedJetLowRPtZSqTheta"))->SetTitle("Selected jets (low threshold, in emcal only)"); + registry.get(HIST("hSelectedJetLowRPtZThetaSq"))->SetTitle("Selected jets (low threshold, in emcal only)"); + + registry.get(HIST("hSelectedJetRMaxPtEta"))->SetTitle("Leading selected jets (in emcal only) #it{p}_{T} and #eta"); + registry.get(HIST("hSelectedJetRMaxPtPhi"))->SetTitle("Leading selected jets (in emcal only) #it{p}_{T} and #phi"); + registry.get(HIST("hSelectedJetRMaxPtClusterMaxPt"))->SetTitle("Leading selected jets (in emcal only) and clusters"); + + registry.get(HIST("hJetRMaxPtJetPt"))->SetTitle("Leading jet #it{p}_{T} vs jet #it{p}_{T} (in emcal only)"); + } } } // init @@ -328,16 +367,16 @@ struct JetTriggerQA { double check_dphi(double dphi) const { - if (dphi > TMath::Pi()) { - dphi -= TMath::Pi(); - } else if (dphi <= -1 * TMath::Pi()) { - dphi += TMath::Pi(); + if (dphi > o2::constants::math::PI) { + dphi -= o2::constants::math::PI; + } else if (dphi <= -1 * o2::constants::math::PI) { + dphi += o2::constants::math::PI; } return dphi; } template - Bool_t isJetInEmcal(T const& jet) + bool isJetInEmcal(T const& jet) { double emcalEtaMin = -0.7, emcalEtaMax = 0.7, emcalPhiMin = 1.40, emcalPhiMax = 3.26; // Phi: 80 - 187 deg double R = jet.r() * 1e-2; // Jet R is saved as round(100*R) @@ -351,7 +390,7 @@ struct JetTriggerQA { { std::array selectAliases = {{triggerAliases::kTVXinEMC, triggerAliases::kEMC7, triggerAliases::kDMC7, triggerAliases::kEG1, triggerAliases::kEG2, triggerAliases::kDG1, triggerAliases::kDG2, triggerAliases::kEJ1, triggerAliases::kEJ2, triggerAliases::kDJ1, triggerAliases::kDJ2}}; bool found = false; - for (auto alias : selectAliases) { + for (const auto& alias : selectAliases) { if (collision.alias_bit(alias)) { found = true; break; @@ -360,7 +399,7 @@ struct JetTriggerQA { return found; } - Bool_t isClusterInEmcal(selectedClusters::iterator const& cluster) + bool isClusterInEmcal(selectedClusters::iterator const& cluster) { if (cluster.phi() < f_PhiEmcalOrDcal) { return true; @@ -466,78 +505,79 @@ struct JetTriggerQA { registry.fill(HIST("hSelectedGammaDCALPtEtaPhiVeryLow"), clusterObservable, cluster.eta(), cluster.phi()); } } // for clusters - - if (maxClusterObservableEMCAL > 0) { - registry.fill(HIST("hClusterEMCALMaxPtEtaPhi"), maxClusterObservableEMCAL, maxClusterEMCAL.eta(), maxClusterEMCAL.phi()); - if (hwtrg.test(EMCALHardwareTrigger::TRG_MB)) { - registry.fill(HIST("hClusterEMCALMaxPtEtaPhiMinBias"), maxClusterObservableEMCAL, maxClusterEMCAL.eta(), maxClusterEMCAL.phi()); - } - if (hwtrg.test(EMCALHardwareTrigger::TRG_EMC7)) { - registry.fill(HIST("hClusterEMCALMaxPtEtaPhiLevel0"), maxClusterObservableEMCAL, maxClusterEMCAL.eta(), maxClusterEMCAL.phi()); - } - for (const auto& cluster : analysedClusters) { - if (cluster.mEMCALcluster) { - registry.fill(HIST("hClusterEMCALMaxPtClusterEMCALPt"), maxClusterObservableEMCAL, cluster.mTriggerObservable); + if (!b_doLightOutput) { + if (maxClusterObservableEMCAL > 0) { + registry.fill(HIST("hClusterEMCALMaxPtEtaPhi"), maxClusterObservableEMCAL, maxClusterEMCAL.eta(), maxClusterEMCAL.phi()); + if (hwtrg.test(EMCALHardwareTrigger::TRG_MB)) { + registry.fill(HIST("hClusterEMCALMaxPtEtaPhiMinBias"), maxClusterObservableEMCAL, maxClusterEMCAL.eta(), maxClusterEMCAL.phi()); } - } - if (isTrigger(TriggerType_t::kEmcalJetFull) || isTrigger(TriggerType_t::kEmcalJetNeutral)) { - registry.fill(HIST("hSelectedClusterMaxPtEtaPhi"), maxClusterObservableEMCAL, maxClusterEMCAL.eta(), maxClusterEMCAL.phi()); - } - if (isTrigger(TriggerType_t::kEmcalGammaVeryHigh)) { - registry.fill(HIST("hSelectedGammaEMCALMaxPtEtaPhiVeryHigh"), maxClusterObservableEMCAL, maxClusterEMCAL.eta(), maxClusterEMCAL.phi()); - } - if (isTrigger(TriggerType_t::kEmcalGammaHigh)) { - registry.fill(HIST("hSelectedGammaEMCALMaxPtEtaPhi"), maxClusterObservableEMCAL, maxClusterEMCAL.eta(), maxClusterEMCAL.phi()); - } - if (isTrigger(TriggerType_t::kEmcalGammaLow)) { - registry.fill(HIST("hSelectedGammaEMCALMaxPtEtaPhiLow"), maxClusterObservableEMCAL, maxClusterEMCAL.eta(), maxClusterEMCAL.phi()); - } - if (isTrigger(TriggerType_t::kEmcalGammaVeryLow)) { - registry.fill(HIST("hSelectedGammaEMCALMaxPtEtaPhiVeryLow"), maxClusterObservableEMCAL, maxClusterEMCAL.eta(), maxClusterEMCAL.phi()); - } - } else { - // count events where max. cluster has not been found - registry.fill(HIST("hEventsNoMaxClusterEMCAL"), 1.); - if (hwtrg.test(EMCALHardwareTrigger::TRG_MB)) { - registry.fill(HIST("hEventsNoMaxClusterEMCALMinBias"), 1.); - } - if (hwtrg.test(EMCALHardwareTrigger::TRG_EMC7)) { - registry.fill(HIST("hEventsNoMaxClusterEMCALLevel0"), 1.); - } - } - if (maxClusterObservableDCAL > 0) { - registry.fill(HIST("hClusterDCALMaxPtEtaPhi"), maxClusterObservableDCAL, maxClusterDCAL.eta(), maxClusterDCAL.phi()); - if (hwtrg.test(EMCALHardwareTrigger::TRG_MB)) { - registry.fill(HIST("hClusterDCALMaxPtEtaPhiMinBias"), maxClusterObservableDCAL, maxClusterDCAL.eta(), maxClusterDCAL.phi()); - } - if (hwtrg.test(EMCALHardwareTrigger::TRG_DMC7)) { - registry.fill(HIST("hClusterDCALMaxPtEtaPhiLevel0"), maxClusterObservableDCAL, maxClusterDCAL.eta(), maxClusterDCAL.phi()); - } - for (const auto& cluster : analysedClusters) { - if (!cluster.mEMCALcluster) { - registry.fill(HIST("hClusterDCALMaxPtClusterDCALPt"), maxClusterObservableDCAL, cluster.mTriggerObservable); + if (hwtrg.test(EMCALHardwareTrigger::TRG_EMC7)) { + registry.fill(HIST("hClusterEMCALMaxPtEtaPhiLevel0"), maxClusterObservableEMCAL, maxClusterEMCAL.eta(), maxClusterEMCAL.phi()); + } + for (const auto& cluster : analysedClusters) { + if (cluster.mEMCALcluster) { + registry.fill(HIST("hClusterEMCALMaxPtClusterEMCALPt"), maxClusterObservableEMCAL, cluster.mTriggerObservable); + } + } + if (isTrigger(TriggerType_t::kEmcalJetFull) || isTrigger(TriggerType_t::kEmcalJetNeutral)) { + registry.fill(HIST("hSelectedClusterMaxPtEtaPhi"), maxClusterObservableEMCAL, maxClusterEMCAL.eta(), maxClusterEMCAL.phi()); + } + if (isTrigger(TriggerType_t::kEmcalGammaVeryHigh)) { + registry.fill(HIST("hSelectedGammaEMCALMaxPtEtaPhiVeryHigh"), maxClusterObservableEMCAL, maxClusterEMCAL.eta(), maxClusterEMCAL.phi()); + } + if (isTrigger(TriggerType_t::kEmcalGammaHigh)) { + registry.fill(HIST("hSelectedGammaEMCALMaxPtEtaPhi"), maxClusterObservableEMCAL, maxClusterEMCAL.eta(), maxClusterEMCAL.phi()); + } + if (isTrigger(TriggerType_t::kEmcalGammaLow)) { + registry.fill(HIST("hSelectedGammaEMCALMaxPtEtaPhiLow"), maxClusterObservableEMCAL, maxClusterEMCAL.eta(), maxClusterEMCAL.phi()); + } + if (isTrigger(TriggerType_t::kEmcalGammaVeryLow)) { + registry.fill(HIST("hSelectedGammaEMCALMaxPtEtaPhiVeryLow"), maxClusterObservableEMCAL, maxClusterEMCAL.eta(), maxClusterEMCAL.phi()); + } + } else { + // count events where max. cluster has not been found + registry.fill(HIST("hEventsNoMaxClusterEMCAL"), 1.); + if (hwtrg.test(EMCALHardwareTrigger::TRG_MB)) { + registry.fill(HIST("hEventsNoMaxClusterEMCALMinBias"), 1.); + } + if (hwtrg.test(EMCALHardwareTrigger::TRG_EMC7)) { + registry.fill(HIST("hEventsNoMaxClusterEMCALLevel0"), 1.); } } - if (isTrigger(TriggerType_t::kDcalGammaVeryHigh)) { - registry.fill(HIST("hSelectedGammaDCALMaxPtEtaPhiVeryHigh"), maxClusterObservableDCAL, maxClusterDCAL.eta(), maxClusterDCAL.phi()); - } - if (isTrigger(TriggerType_t::kDcalGammaHigh)) { - registry.fill(HIST("hSelectedGammaDCALMaxPtEtaPhi"), maxClusterObservableDCAL, maxClusterDCAL.eta(), maxClusterDCAL.phi()); - } - if (isTrigger(TriggerType_t::kDcalGammaLow)) { - registry.fill(HIST("hSelectedGammaDCALMaxPtEtaPhiLow"), maxClusterObservableDCAL, maxClusterDCAL.eta(), maxClusterDCAL.phi()); - } - if (isTrigger(TriggerType_t::kDcalGammaVeryLow)) { - registry.fill(HIST("hSelectedGammaDCALMaxPtEtaPhiVeryLow"), maxClusterObservableDCAL, maxClusterDCAL.eta(), maxClusterDCAL.phi()); - } - } else { - registry.fill(HIST("hEventsNoMaxClusterDCAL"), 1.); - // count events where max. cluster has not been found - if (hwtrg.test(EMCALHardwareTrigger::TRG_MB)) { - registry.fill(HIST("hEventsNoMaxClusterDCALMinBias"), 1.); - } - if (hwtrg.test(EMCALHardwareTrigger::TRG_DMC7)) { - registry.fill(HIST("hEventsNoMaxClusterDCALLevel0"), 1.); + if (maxClusterObservableDCAL > 0) { + registry.fill(HIST("hClusterDCALMaxPtEtaPhi"), maxClusterObservableDCAL, maxClusterDCAL.eta(), maxClusterDCAL.phi()); + if (hwtrg.test(EMCALHardwareTrigger::TRG_MB)) { + registry.fill(HIST("hClusterDCALMaxPtEtaPhiMinBias"), maxClusterObservableDCAL, maxClusterDCAL.eta(), maxClusterDCAL.phi()); + } + if (hwtrg.test(EMCALHardwareTrigger::TRG_DMC7)) { + registry.fill(HIST("hClusterDCALMaxPtEtaPhiLevel0"), maxClusterObservableDCAL, maxClusterDCAL.eta(), maxClusterDCAL.phi()); + } + for (const auto& cluster : analysedClusters) { + if (!cluster.mEMCALcluster) { + registry.fill(HIST("hClusterDCALMaxPtClusterDCALPt"), maxClusterObservableDCAL, cluster.mTriggerObservable); + } + } + if (isTrigger(TriggerType_t::kDcalGammaVeryHigh)) { + registry.fill(HIST("hSelectedGammaDCALMaxPtEtaPhiVeryHigh"), maxClusterObservableDCAL, maxClusterDCAL.eta(), maxClusterDCAL.phi()); + } + if (isTrigger(TriggerType_t::kDcalGammaHigh)) { + registry.fill(HIST("hSelectedGammaDCALMaxPtEtaPhi"), maxClusterObservableDCAL, maxClusterDCAL.eta(), maxClusterDCAL.phi()); + } + if (isTrigger(TriggerType_t::kDcalGammaLow)) { + registry.fill(HIST("hSelectedGammaDCALMaxPtEtaPhiLow"), maxClusterObservableDCAL, maxClusterDCAL.eta(), maxClusterDCAL.phi()); + } + if (isTrigger(TriggerType_t::kDcalGammaVeryLow)) { + registry.fill(HIST("hSelectedGammaDCALMaxPtEtaPhiVeryLow"), maxClusterObservableDCAL, maxClusterDCAL.eta(), maxClusterDCAL.phi()); + } + } else { + registry.fill(HIST("hEventsNoMaxClusterDCAL"), 1.); + // count events where max. cluster has not been found + if (hwtrg.test(EMCALHardwareTrigger::TRG_MB)) { + registry.fill(HIST("hEventsNoMaxClusterDCALMinBias"), 1.); + } + if (hwtrg.test(EMCALHardwareTrigger::TRG_DMC7)) { + registry.fill(HIST("hEventsNoMaxClusterDCALLevel0"), 1.); + } } } return std::make_pair(maxClusterObservableEMCAL, maxClusterObservableDCAL); @@ -568,80 +608,90 @@ struct JetTriggerQA { // This gives us access to all jet substructure information // auto tracksInJet = jetTrackConstituents.sliceBy(perJetTrackConstituents, jet.globalIndex()); // for (const auto& trackList : tracksInJet) { - for (auto& track : jet.template tracks_as()) { - auto trackPt = track.pt(); - auto chargeFrag = track.px() * jet.px() + track.py() * jet.py() + track.pz() * jet.pz(); - chargeFrag /= (jet.p() * jet.p()); - auto z = trackPt / jetPt; - auto dphi = jet.phi() - track.phi(); - dphi = check_dphi(dphi); - auto dR = TMath::Sqrt(dphi * dphi + TMath::Power(jet.eta() - track.eta(), 2)); - zTheta += z * dR / jetR; - zSqTheta += z * z * dR / jetR; - zThetaSq += z * dR * dR / (jetR * jetR); - ptD += z * z; - registry.fill(HIST("hJetRPtTrackPt"), jetR, jetPt, trackPt); - registry.fill(HIST("hJetRPtChargeFrag"), jetR, jetPt, chargeFrag); - if (isTrigger(TriggerType_t::kEmcalJetFull) || isTrigger(TriggerType_t::kEmcalJetNeutral)) { - registry.fill(HIST("hSelectedJetRPtTrackPt"), jetR, jetPt, trackPt); - registry.fill(HIST("hSelectedJetRPtChargeFrag"), jetR, jetPt, chargeFrag); - } - if (isTrigger(TriggerType_t::kEmcalJetFullLow) || isTrigger(TriggerType_t::kEmcalJetNeutralLow)) { - registry.fill(HIST("hSelectedJetLowRPtTrackPt"), jetR, jetPt, trackPt); - registry.fill(HIST("hSelectedJetLowRPtChargeFrag"), jetR, jetPt, chargeFrag); - } - } // for tracks in jet + if (!b_doLightOutput) { + for (const auto& track : jet.template tracks_as()) { + auto trackPt = track.pt(); + auto chargeFrag = track.px() * jet.px() + track.py() * jet.py() + track.pz() * jet.pz(); + chargeFrag /= (jet.p() * jet.p()); + auto z = trackPt / jetPt; + auto dphi = jet.phi() - track.phi(); + dphi = check_dphi(dphi); + auto dR = std::sqrt(dphi * dphi + std::pow(jet.eta() - track.eta(), 2)); + zTheta += z * dR / jetR; + zSqTheta += z * z * dR / jetR; + zThetaSq += z * dR * dR / (jetR * jetR); + ptD += z * z; + registry.fill(HIST("hJetRPtTrackPt"), jetR, jetPt, trackPt); + registry.fill(HIST("hJetRPtChargeFrag"), jetR, jetPt, chargeFrag); + if (isTrigger(TriggerType_t::kEmcalJetFull) || isTrigger(TriggerType_t::kEmcalJetNeutral)) { + registry.fill(HIST("hSelectedJetRPtTrackPt"), jetR, jetPt, trackPt); + registry.fill(HIST("hSelectedJetRPtChargeFrag"), jetR, jetPt, chargeFrag); + } + if (isTrigger(TriggerType_t::kEmcalJetFullLow) || isTrigger(TriggerType_t::kEmcalJetNeutralLow)) { + registry.fill(HIST("hSelectedJetLowRPtTrackPt"), jetR, jetPt, trackPt); + registry.fill(HIST("hSelectedJetLowRPtChargeFrag"), jetR, jetPt, chargeFrag); + } + } // for tracks in jet + } // auto clustersInJet = jetClusterConstituents.sliceBy(perJetClusterConstituents, jet.globalIndex()); // for (const auto& clusterList : clustersInJet) { - for (auto& cluster : jet.template clusters_as()) { - auto clusterPt = cluster.energy() / std::cosh(cluster.eta()); - neutralEnergyFraction += cluster.energy(); - auto z = clusterPt / jetPt; - auto dphi = jet.phi() - cluster.phi(); - dphi = check_dphi(dphi); - auto dR = TMath::Sqrt(dphi * dphi + TMath::Power(jet.eta() - cluster.eta(), 2)); - zTheta += z * dR / jetR; - zSqTheta += z * z * dR / jetR; - zThetaSq += z * dR * dR / (jetR * jetR); - ptD += z * z; - registry.fill(HIST("hJetRPtClusterPt"), jetR, jetPt, clusterPt); - if (isTrigger(TriggerType_t::kEmcalJetFull) || isTrigger(TriggerType_t::kEmcalJetNeutral)) { - registry.fill(HIST("hSelectedJetRPtClusterPt"), jetR, jetPt, clusterPt); - } - if (isTrigger(TriggerType_t::kEmcalJetFullLow) || isTrigger(TriggerType_t::kEmcalJetNeutralLow)) { - registry.fill(HIST("hSelectedJetLowRPtClusterPt"), jetR, jetPt, clusterPt); - } - } // for clusters in jet + if (!b_doLightOutput) { + for (const auto& cluster : jet.template clusters_as()) { + auto clusterPt = cluster.energy() / std::cosh(cluster.eta()); + neutralEnergyFraction += cluster.energy(); + auto z = clusterPt / jetPt; + auto dphi = jet.phi() - cluster.phi(); + dphi = check_dphi(dphi); + auto dR = std::sqrt(dphi * dphi + std::pow(jet.eta() - cluster.eta(), 2)); + zTheta += z * dR / jetR; + zSqTheta += z * z * dR / jetR; + zThetaSq += z * dR * dR / (jetR * jetR); + ptD += z * z; + registry.fill(HIST("hJetRPtClusterPt"), jetR, jetPt, clusterPt); + if (isTrigger(TriggerType_t::kEmcalJetFull) || isTrigger(TriggerType_t::kEmcalJetNeutral)) { + registry.fill(HIST("hSelectedJetRPtClusterPt"), jetR, jetPt, clusterPt); + } + if (isTrigger(TriggerType_t::kEmcalJetFullLow) || isTrigger(TriggerType_t::kEmcalJetNeutralLow)) { + registry.fill(HIST("hSelectedJetLowRPtClusterPt"), jetR, jetPt, clusterPt); + } + } // for clusters in jet + } neutralEnergyFraction /= jet.energy(); - ptD = TMath::Sqrt(ptD); + ptD = std::sqrt(ptD); // Fillng histograms registry.fill(HIST("hJetRPtEta"), jetR, jetPt, jet.eta()); registry.fill(HIST("hJetRPtPhi"), jetR, jetPt, jet.phi()); - registry.fill(HIST("hJetRPtPtd"), jetR, jetPt, ptD); - registry.fill(HIST("hJetRPtNEF"), jetR, jetPt, neutralEnergyFraction); - registry.fill(HIST("hJetRPtZTheta"), jetR, jetPt, zTheta); - registry.fill(HIST("hJetRPtZSqTheta"), jetR, jetPt, zSqTheta); - registry.fill(HIST("hJetRPtZThetaSq"), jetR, jetPt, zThetaSq); + if (!b_doLightOutput) { + registry.fill(HIST("hJetRPtPtd"), jetR, jetPt, ptD); + registry.fill(HIST("hJetRPtNEF"), jetR, jetPt, neutralEnergyFraction); + registry.fill(HIST("hJetRPtZTheta"), jetR, jetPt, zTheta); + registry.fill(HIST("hJetRPtZSqTheta"), jetR, jetPt, zSqTheta); + registry.fill(HIST("hJetRPtZThetaSq"), jetR, jetPt, zThetaSq); + } registry.get(HIST("jetRPtEtaPhi"))->Fill(jetR, jetPt, jet.eta(), jet.phi()); if (isTrigger(TriggerType_t::kEmcalJetFull) || isTrigger(TriggerType_t::kEmcalJetNeutral)) { registry.fill(HIST("hSelectedJetRPtEta"), jetR, jetPt, jet.eta()); registry.fill(HIST("hSelectedJetRPtPhi"), jetR, jetPt, jet.phi()); - registry.fill(HIST("hSelectedJetRPtPtd"), jetR, jetPt, ptD); - registry.fill(HIST("hSelectedJetRPtNEF"), jetR, jetPt, neutralEnergyFraction); - registry.fill(HIST("hSelectedJetRPtZTheta"), jetR, jetPt, zTheta); - registry.fill(HIST("hSelectedJetRPtZSqTheta"), jetR, jetPt, zSqTheta); - registry.fill(HIST("hSelectedJetRPtZThetaSq"), jetR, jetPt, zThetaSq); + if (!b_doLightOutput) { + registry.fill(HIST("hSelectedJetRPtPtd"), jetR, jetPt, ptD); + registry.fill(HIST("hSelectedJetRPtNEF"), jetR, jetPt, neutralEnergyFraction); + registry.fill(HIST("hSelectedJetRPtZTheta"), jetR, jetPt, zTheta); + registry.fill(HIST("hSelectedJetRPtZSqTheta"), jetR, jetPt, zSqTheta); + registry.fill(HIST("hSelectedJetRPtZThetaSq"), jetR, jetPt, zThetaSq); + } } if (isTrigger(TriggerType_t::kEmcalJetFullLow) || isTrigger(TriggerType_t::kEmcalJetNeutralLow)) { registry.fill(HIST("hSelectedJetLowRPtEta"), jetR, jetPt, jet.eta()); registry.fill(HIST("hSelectedJetLowRPtPhi"), jetR, jetPt, jet.phi()); - registry.fill(HIST("hSelectedJetLowRPtPtd"), jetR, jetPt, ptD); - registry.fill(HIST("hSelectedJetLowRPtNEF"), jetR, jetPt, neutralEnergyFraction); - registry.fill(HIST("hSelectedJetLowRPtZTheta"), jetR, jetPt, zTheta); - registry.fill(HIST("hSelectedJetLowRPtZSqTheta"), jetR, jetPt, zSqTheta); - registry.fill(HIST("hSelectedJetLowRPtZThetaSq"), jetR, jetPt, zThetaSq); + if (!b_doLightOutput) { + registry.fill(HIST("hSelectedJetLowRPtPtd"), jetR, jetPt, ptD); + registry.fill(HIST("hSelectedJetLowRPtNEF"), jetR, jetPt, neutralEnergyFraction); + registry.fill(HIST("hSelectedJetLowRPtZTheta"), jetR, jetPt, zTheta); + registry.fill(HIST("hSelectedJetLowRPtZSqTheta"), jetR, jetPt, zSqTheta); + registry.fill(HIST("hSelectedJetLowRPtZThetaSq"), jetR, jetPt, zThetaSq); + } } } // for jets return std::make_pair(vecMaxJet, vecMaxJetNoFiducial); @@ -761,67 +811,74 @@ struct JetTriggerQA { std::array foundMaxJet; std::fill(foundMaxJet.begin(), foundMaxJet.end(), false); - for (auto maxJet : vecMaxJet) { - double jetR = maxJet.r() * 1e-2, jetPt = maxJet.pt(), jetEta = maxJet.eta(), jetPhi = maxJet.phi(); - foundMaxJet[static_cast(maxJet.r() * 1e-1) - 2] = true; - registry.fill(HIST("hJetRMaxPtEta"), jetR, jetPt, jetEta); - registry.fill(HIST("hJetRMaxPtPhi"), jetR, jetPt, jetPhi); - if (hardwaretriggers.test(EMCALHardwareTrigger::TRG_MB)) { - registry.fill(HIST("hJetRMaxPtEtaMinBias"), jetR, jetPt, jetEta); - registry.fill(HIST("hJetRMaxPtPhiMinBias"), jetR, jetPt, jetPhi); - } - if (hardwaretriggers.test(EMCALHardwareTrigger::TRG_EMC7)) { - registry.fill(HIST("hJetRMaxPtEtaLevel0"), jetR, jetPt, jetEta); - registry.fill(HIST("hJetRMaxPtPhiLevel0"), jetR, jetPt, jetPhi); - } - // hJetRMaxPtEtaPhi->Fill(jetR, jetPt, jetEta, jetPhi); - registry.get(HIST("jetRMaxPtEtaPhi"))->Fill(jetR, jetPt, jetEta, jetPhi); - if (isTrigger(TriggerType_t::kEmcalJetFull) || isTrigger(TriggerType_t::kEmcalJetNeutral)) { - registry.fill(HIST("hSelectedJetRMaxPtEta"), jetR, jetPt, jetEta); - registry.fill(HIST("hSelectedJetRMaxPtPhi"), jetR, jetPt, jetPhi); - } - if (isTrigger(TriggerType_t::kEmcalJetFullLow) || isTrigger(TriggerType_t::kEmcalJetNeutralLow)) { - registry.fill(HIST("hSelectedJetLowRMaxPtEta"), jetR, jetPt, jetEta); - registry.fill(HIST("hSelectedJetLowRMaxPtPhi"), jetR, jetPt, jetPhi); - } - if (maxClusterObservableEMCAL > 0) { - registry.fill(HIST("hJetRMaxPtClusterMaxPt"), jetR, jetPt, maxClusterObservableEMCAL); + if (!b_doLightOutput) { + for (const auto& maxJet : vecMaxJet) { + double jetR = maxJet.r() * 1e-2, jetPt = maxJet.pt(), jetEta = maxJet.eta(), jetPhi = maxJet.phi(); + foundMaxJet[static_cast(maxJet.r() * 1e-1) - 2] = true; + registry.fill(HIST("hJetRMaxPtEta"), jetR, jetPt, jetEta); + registry.fill(HIST("hJetRMaxPtPhi"), jetR, jetPt, jetPhi); + if (hardwaretriggers.test(EMCALHardwareTrigger::TRG_MB)) { + registry.fill(HIST("hJetRMaxPtEtaMinBias"), jetR, jetPt, jetEta); + registry.fill(HIST("hJetRMaxPtPhiMinBias"), jetR, jetPt, jetPhi); + } + if (hardwaretriggers.test(EMCALHardwareTrigger::TRG_EMC7)) { + registry.fill(HIST("hJetRMaxPtEtaLevel0"), jetR, jetPt, jetEta); + registry.fill(HIST("hJetRMaxPtPhiLevel0"), jetR, jetPt, jetPhi); + } + // hJetRMaxPtEtaPhi->Fill(jetR, jetPt, jetEta, jetPhi); + registry.get(HIST("jetRMaxPtEtaPhi"))->Fill(jetR, jetPt, jetEta, jetPhi); if (isTrigger(TriggerType_t::kEmcalJetFull) || isTrigger(TriggerType_t::kEmcalJetNeutral)) { - registry.fill(HIST("hSelectedJetRMaxPtClusterMaxPt"), jetR, jetPt, maxClusterObservableEMCAL); + registry.fill(HIST("hSelectedJetRMaxPtEta"), jetR, jetPt, jetEta); + registry.fill(HIST("hSelectedJetRMaxPtPhi"), jetR, jetPt, jetPhi); } - } // if maxClusterPt - if (maxJet.r() == std::round(f_jetR * 100)) { - for (const auto& jet : jets) { - if (isJetInEmcal(jet)) { - registry.fill(HIST("hJetRMaxPtJetPt"), jet.r() * 1e-2, jetPt, jet.pt()); + if (isTrigger(TriggerType_t::kEmcalJetFullLow) || isTrigger(TriggerType_t::kEmcalJetNeutralLow)) { + registry.fill(HIST("hSelectedJetLowRMaxPtEta"), jetR, jetPt, jetEta); + registry.fill(HIST("hSelectedJetLowRMaxPtPhi"), jetR, jetPt, jetPhi); + } + if (maxClusterObservableEMCAL > 0) { + registry.fill(HIST("hJetRMaxPtClusterMaxPt"), jetR, jetPt, maxClusterObservableEMCAL); + if (isTrigger(TriggerType_t::kEmcalJetFull) || isTrigger(TriggerType_t::kEmcalJetNeutral)) { + registry.fill(HIST("hSelectedJetRMaxPtClusterMaxPt"), jetR, jetPt, maxClusterObservableEMCAL); } - } // for jets - } // if maxJet.r() == std::round(f_jetR * 100) - } // for maxJet + } // if maxClusterPt + if (maxJet.r() == std::round(f_jetR * 100)) { + for (const auto& jet : jets) { + if (isJetInEmcal(jet)) { + registry.fill(HIST("hJetRMaxPtJetPt"), jet.r() * 1e-2, jetPt, jet.pt()); + } + } // for jets + } // if maxJet.r() == std::round(f_jetR * 100) + } // for maxJet + } // Fill counters for events without max jets - for (std::size_t ir = 0; ir < foundMaxJet.size(); ir++) { - if (!foundMaxJet[ir]) { - double rval = static_cast(ir) / 10.; - registry.fill(HIST("hEventsNoMaxJet"), rval); - if (hardwaretriggers.test(EMCALHardwareTrigger::TRG_MB)) { - registry.fill(HIST("hEventsNoMaxJetMinBias"), rval); - } - if (hardwaretriggers.test(EMCALHardwareTrigger::TRG_EMC7)) { - registry.fill(HIST("hEventsNoMaxJetLevel0"), rval); + if (!b_doLightOutput) { + for (std::size_t ir = 0; ir < foundMaxJet.size(); ir++) { + if (!foundMaxJet[ir]) { + double rval = static_cast(ir) / 10.; + registry.fill(HIST("hEventsNoMaxJet"), rval); + if (hardwaretriggers.test(EMCALHardwareTrigger::TRG_MB)) { + registry.fill(HIST("hEventsNoMaxJetMinBias"), rval); + } + if (hardwaretriggers.test(EMCALHardwareTrigger::TRG_EMC7)) { + registry.fill(HIST("hEventsNoMaxJetLevel0"), rval); + } } } } - for (auto maxJet : vecMaxJetNoFiducial) { - double jetR = maxJet.r() * 1e-2, jetPt = maxJet.pt(), jetEta = maxJet.eta(), jetPhi = maxJet.phi(); - // hJetRMaxPtEtaPhiNoFiducial->Fill(jetR, jetPt, jetEta, jetPhi); - registry.get(HIST("jetRMaxPtEtaPhiNoFiducial"))->Fill(jetR, jetPt, jetEta, jetPhi); - if (maxJet.r() == std::round(f_jetR * 100)) { - for (const auto& jet : jets) { - registry.fill(HIST("hJetRMaxPtJetPtNoFiducial"), jet.r() * 1e-2, jetPt, jet.pt()); - } // for jets - } // if maxJet.r() == std::round(f_jetR * 100) - } // for maxjet no fiducial + if (!b_doLightOutput) { + for (const auto& maxJet : vecMaxJetNoFiducial) { + double jetR = maxJet.r() * 1e-2, jetPt = maxJet.pt(), jetEta = maxJet.eta(), jetPhi = maxJet.phi(); + // hJetRMaxPtEtaPhiNoFiducial->Fill(jetR, jetPt, jetEta, jetPhi); + registry.get(HIST("jetRMaxPtEtaPhiNoFiducial"))->Fill(jetR, jetPt, jetEta, jetPhi); + if (maxJet.r() == std::round(f_jetR * 100)) { + for (const auto& jet : jets) { + if (!b_doLightOutput) + registry.fill(HIST("hJetRMaxPtJetPtNoFiducial"), jet.r() * 1e-2, jetPt, jet.pt()); + } // for jets + } // if maxJet.r() == std::round(f_jetR * 100) + } // for maxjet no fiducial + } } // process void processFullJets(collisionWithTrigger const& collision, From 69693104de6945c08d77f220385a119ec565dbbf Mon Sep 17 00:00:00 2001 From: EmilGorm <50658075+EmilGorm@users.noreply.github.com> Date: Thu, 1 May 2025 22:28:29 +0200 Subject: [PATCH 1145/1650] [PWGCF] Add class members back into ROOT streamer (#10973) Co-authored-by: ALICE Action Bot --- PWGCF/GenericFramework/Core/FlowPtContainer.h | 6 +- .../Tasks/flowGenericFramework.cxx | 177 ++++++++++++++++-- 2 files changed, 168 insertions(+), 15 deletions(-) diff --git a/PWGCF/GenericFramework/Core/FlowPtContainer.h b/PWGCF/GenericFramework/Core/FlowPtContainer.h index 91442985cc0..551bcf011c8 100644 --- a/PWGCF/GenericFramework/Core/FlowPtContainer.h +++ b/PWGCF/GenericFramework/Core/FlowPtContainer.h @@ -115,11 +115,11 @@ class FlowPtContainer : public TNamed TList* fCumulantList; TList* fCentralMomentList; - int mpar; //! + int mpar; int fillCounter; //! unsigned int fEventWeight; //! - bool fUseCentralMoments; //! - bool fUseGap; //! + bool fUseCentralMoments; + bool fUseGap; void mergeBSLists(TList* source, TList* target); TH1* raiseHistToPower(TH1* inh, double p); std::vector sumP; //! diff --git a/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx b/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx index 03f4a82a3fd..271f3b16493 100644 --- a/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx +++ b/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx @@ -86,6 +86,7 @@ struct FlowGenericFramework { O2_DEFINE_CONFIGURABLE(cfgNbootstrap, int, 10, "Number of subsamples") O2_DEFINE_CONFIGURABLE(cfgMpar, int, 8, "Highest order of pt-pt correlations") + O2_DEFINE_CONFIGURABLE(cfgCentEstimator, int, 0, "0:FT0C; 1:FT0CVariant1; 2:FT0M; 3:FT0A") O2_DEFINE_CONFIGURABLE(cfgUseNch, bool, false, "Do correlations as function of Nch") O2_DEFINE_CONFIGURABLE(cfgFillWeights, bool, false, "Fill NUA weights") O2_DEFINE_CONFIGURABLE(cfgRunByRun, bool, false, "Fill histograms on a run-by-run basis") @@ -115,6 +116,9 @@ struct FlowGenericFramework { O2_DEFINE_CONFIGURABLE(cfgIsVertexITSTPC, bool, true, "Selects collisions with at least one ITS-TPC track"); O2_DEFINE_CONFIGURABLE(cfgMagField, float, 99999, "Configurable magnetic field; default CCDB will be queried"); O2_DEFINE_CONFIGURABLE(cfgTofPtCut, float, 0.5, "pt cut on TOF for PID"); + O2_DEFINE_CONFIGURABLE(cfgUseDensityDependentCorrection, bool, false, "Use density dependent efficiency correction based on Run 2 measurements"); + Configurable> cfgTrackDensityP0{"cfgTrackDensityP0", std::vector{0.7217476707, 0.7384792571, 0.7542625668, 0.7640680200, 0.7701951667, 0.7755299053, 0.7805901710, 0.7849446786, 0.7957356586, 0.8113039262, 0.8211968966, 0.8280558878, 0.8329342135}, "parameter 0 for track density efficiency correction"}; + Configurable> cfgTrackDensityP1{"cfgTrackDensityP1", std::vector{-2.169488e-05, -2.191913e-05, -2.295484e-05, -2.556538e-05, -2.754463e-05, -2.816832e-05, -2.846502e-05, -2.843857e-05, -2.705974e-05, -2.477018e-05, -2.321730e-05, -2.203315e-05, -2.109474e-05}, "parameter 1 for track density efficiency correction"}; Configurable cfgGFWBinning{"cfgGFWBinning", {40, 16, 72, 300, 0, 3000, 0.2, 10.0, 0.2, 3.0, {0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.2, 2.4, 2.6, 2.8, 3, 3.5, 4, 5, 6, 8, 10}, {0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90}}, "Configuration for binning"}; Configurable cfgRegions{"cfgRegions", {{"refN", "refP", "refFull"}, {-0.8, 0.4, -0.8}, {-0.4, 0.8, 0.8}, {0, 0, 0}, {1, 1, 1}}, "Configurations for GFW regions"}; @@ -137,6 +141,7 @@ struct FlowGenericFramework { OutputObj fFCgen{FlowContainer("FlowContainer_gen")}; HistogramRegistry registry{"registry"}; + // QA outputs std::map>> th1sList; std::map>> th3sList; enum OutputTH1Names { @@ -148,6 +153,7 @@ struct FlowGenericFramework { hEventSel, kCount_TH1Names }; + // NUA outputs enum OutputTH3Names { hNUAref = 0, hNUAch, @@ -156,14 +162,40 @@ struct FlowGenericFramework { hNUApr, kCount_TH3Names }; + enum CentEstimators { + kCentFT0C = 0, + kCentFT0CVariant1, + kCentFT0M, + kCentFV0A + }; - // define global variables + // Define global variables + // Generic Framework GFW* fGFW = new GFW(); std::vector corrconfigs; + TRandom3* fRndm = new TRandom3(0); TAxis* fPtAxis; int lastRun = -1; std::vector runNumbers; + + // Density dependent eff correction + std::vector funcEff; + TH1D* hFindPtBin; + TF1* funcV2; + TF1* funcV3; + TF1* funcV4; + struct DensityCorr { + double psi2Est; + double psi3Est; + double psi4Est; + double v2; + double v3; + double v4; + int density; + DensityCorr() : psi2Est(0.), psi3Est(0.), psi4Est(0.), v2(0.), v3(0.), v4(0.), density(0) {} + }; + // Event selection cuts - Alex TF1* fPhiCutLow = nullptr; TF1* fPhiCutHigh = nullptr; @@ -209,7 +241,25 @@ struct FlowGenericFramework { AxisSpec etaAxis = {etabins, -cfgEta, cfgEta, "#eta"}; AxisSpec vtxAxis = {vtxZbins, -cfgVtxZ, cfgVtxZ, "Vtx_{z} (cm)"}; AxisSpec ptAxis = {ptbinning, "#it{p}_{T} GeV/#it{c}"}; - AxisSpec centAxis = {centbinning, "Centrality (%)"}; + std::string sCentralityEstimator; + switch (cfgCentEstimator) { + case kCentFT0C: + sCentralityEstimator = "FT0C"; + break; + case kCentFT0CVariant1: + sCentralityEstimator = "FT0C variant 1"; + break; + case kCentFT0M: + sCentralityEstimator = "FT0M"; + break; + case kCentFV0A: + sCentralityEstimator = "FV0A"; + break; + default: + sCentralityEstimator = "FT0C"; + } + sCentralityEstimator += " centrality (%)"; + AxisSpec centAxis = {centbinning, sCentralityEstimator.c_str()}; std::vector nchbinning; int nchskip = (nchup - nchlow) / nchbins; for (int i = 0; i <= nchbins; ++i) { @@ -240,10 +290,18 @@ struct FlowGenericFramework { if (doprocessMCReco || doprocessData || doprocessRun2) { registry.add("trackQA/before/phi_eta_vtxZ", "", {HistType::kTH3D, {phiAxis, etaAxis, vtxAxis}}); registry.add("trackQA/before/pt_dcaXY_dcaZ", "", {HistType::kTH3D, {ptAxis, dcaXYAXis, dcaZAXis}}); + registry.add("trackQA/before/chi2prTPCcls", "#chi^{2}/cluster for the TPC track segment", {HistType::kTH1D, {{100, 0., 5.}}}); + registry.add("trackQA/before/chi2prITScls", "#chi^{2}/cluster for the ITS track", {HistType::kTH1D, {{100, 0., 50.}}}); + registry.add("trackQA/before/nTPCClusters", "Number of found TPC clusters", {HistType::kTH1D, {{100, 40, 180}}}); + registry.add("trackQA/before/nITSClusters", "Number of found ITS clusters", {HistType::kTH1D, {{100, 0, 20}}}); + registry.add("trackQA/before/nTPCCrossedRows", "Number of crossed TPC Rows", {HistType::kTH1D, {{100, 40, 180}}}); + registry.addClone("trackQA/before/", "trackQA/after/"); registry.add("trackQA/after/pt_ref", "", {HistType::kTH1D, {{100, ptreflow, ptrefup}}}); registry.add("trackQA/after/pt_poi", "", {HistType::kTH1D, {{100, ptpoilow, ptpoiup}}}); + registry.add("eventQA/before/centrality", "", {HistType::kTH1D, {centAxis}}); + registry.add("eventQA/before/multiplicity", "", {HistType::kTH1D, {nchAxis}}); registry.add("eventQA/before/globalTracks_centT0C", "", {HistType::kTH2D, {centAxis, nchAxis}}); registry.add("eventQA/before/PVTracks_centT0C", "", {HistType::kTH2D, {centAxis, multpvAxis}}); registry.add("eventQA/before/globalTracks_PVTracks", "", {HistType::kTH2D, {multpvAxis, nchAxis}}); @@ -317,6 +375,24 @@ struct FlowGenericFramework { fMultCutHigh = new TF1("fMultCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x + 3.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); fMultCutHigh->SetParameters(1654.46, -47.2379, 0.449833, -0.0014125, 150.773, -3.67334, 0.0530503, -0.000614061, 3.15956e-06); } + if (cfgUseDensityDependentCorrection) { + std::vector pTEffBins = {0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.4, 1.8, 2.2, 2.6, 3.0}; + hFindPtBin = new TH1D("hFindPtBin", "hFindPtBin", pTEffBins.size() - 1, &pTEffBins[0]); + funcEff.resize(pTEffBins.size() - 1); + // LHC24g3 Eff + std::vector f1p0 = cfgTrackDensityP0; + std::vector f1p1 = cfgTrackDensityP1; + for (uint ifunc = 0; ifunc < pTEffBins.size() - 1; ifunc++) { + funcEff[ifunc] = new TF1(Form("funcEff%i", ifunc), "[0]+[1]*x", 0, 3000); + funcEff[ifunc]->SetParameters(f1p0[ifunc], f1p1[ifunc]); + } + funcV2 = new TF1("funcV2", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); + funcV2->SetParameters(0.0186111, 0.00351907, -4.38264e-05, 1.35383e-07, -3.96266e-10); + funcV3 = new TF1("funcV3", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); + funcV3->SetParameters(0.0174056, 0.000703329, -1.45044e-05, 1.91991e-07, -1.62137e-09); + funcV4 = new TF1("funcV4", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 100); + funcV4->SetParameters(0.008845, 0.000259668, -3.24435e-06, 4.54837e-08, -6.01825e-10); + } } static constexpr std::string_view FillTimeName[] = {"before/", "after/"}; @@ -576,12 +652,14 @@ struct FlowGenericFramework { AxisSpec phiAxis = {phibins, philow, phiup, "#phi"}; AxisSpec etaAxis = {etabins, -cfgEta, cfgEta, "#eta"}; AxisSpec vtxAxis = {vtxZbins, -cfgVtxZ, cfgVtxZ, "Vtx_{z} (cm)"}; + AxisSpec nchAxis = {nchbins, nchlow, nchup, "N_{ch}"}; + AxisSpec centAxis = {centbinning, "Centrality (%)"}; std::vector> histos(kCount_TH1Names); histos[hPhi] = registry.add(Form("%d/phi", run), "", {HistType::kTH1D, {phiAxis}}); histos[hEta] = registry.add(Form("%d/eta", run), "", {HistType::kTH1D, {etaAxis}}); histos[hVtxZ] = registry.add(Form("%d/vtxz", run), "", {HistType::kTH1D, {vtxAxis}}); - histos[hMult] = registry.add(Form("%d/mult", run), "", {HistType::kTH1D, {{3000, 0.5, 3000.5}}}); - histos[hCent] = registry.add(Form("%d/cent", run), "", {HistType::kTH1D, {{90, 0, 90}}}); + histos[hMult] = registry.add(Form("%d/mult", run), "", {HistType::kTH1D, {nchAxis}}); + histos[hCent] = registry.add(Form("%d/cent", run), "", {HistType::kTH1D, {centAxis}}); histos[hEventSel] = registry.add(Form("%d/eventSel", run), "Number of Events;; Counts", {HistType::kTH1D, {{11, 0, 11}}}); histos[hEventSel]->GetXaxis()->SetBinLabel(1, "Filtered event"); histos[hEventSel]->GetXaxis()->SetBinLabel(2, "sel8"); @@ -661,15 +739,51 @@ struct FlowGenericFramework { fGFW->Clear(); fFCpt->clearVector(); float lRandom = fRndm->Rndm(); + + // be cautious, this only works for Pb-Pb + // esimate the Event plane and vn for this event + DensityCorr densitycorrections; + if (cfgUseDensityDependentCorrection) { + double psi2Est = 0, psi3Est = 0, psi4Est = 0; + double v2 = 0, v3 = 0, v4 = 0; + double q2x = 0, q2y = 0; + double q3x = 0, q3y = 0; + double q4x = 0, q4y = 0; + for (const auto& track : tracks) { + bool withinPtRef = (ptreflow < track.pt()) && (track.pt() < ptrefup); // within RF pT rang + if (withinPtRef) { + q2x += std::cos(2 * track.phi()); + q2y += std::sin(2 * track.phi()); + q3x += std::cos(3 * track.phi()); + q3y += std::sin(3 * track.phi()); + q4x += std::cos(4 * track.phi()); + q4y += std::sin(4 * track.phi()); + } + } + psi2Est = std::atan2(q2y, q2x) / 2.; + psi3Est = std::atan2(q3y, q3x) / 3.; + psi4Est = std::atan2(q4y, q4x) / 4.; + v2 = funcV2->Eval(centrality); + v3 = funcV3->Eval(centrality); + v4 = funcV4->Eval(centrality); + densitycorrections.psi2Est = psi2Est; + densitycorrections.psi3Est = psi3Est; + densitycorrections.psi4Est = psi4Est; + densitycorrections.v2 = v2; + densitycorrections.v3 = v3; + densitycorrections.v4 = v4; + densitycorrections.density = tracks.size(); + } + for (const auto& track : tracks) { - processTrack(track, vtxz, run); + processTrack(track, vtxz, run, densitycorrections); } if (!cfgFillWeights) fillOutputContainers
((cfgUseNch) ? tracks.size() : centrality, lRandom); } template - inline void processTrack(TTrack const& track, const float& vtxz, const int& run) + inline void processTrack(TTrack const& track, const float& vtxz, const int& run, DensityCorr densitycorrections) { if constexpr (framework::has_type_v) { if (track.mcParticleId() < 0 || !(track.has_mcParticle())) @@ -698,7 +812,7 @@ struct FlowGenericFramework { fillWeights(mcParticle, vtxz, 0, run); } else { fillPtSums(track, vtxz); - fillGFW(mcParticle, vtxz, pidIndex); + fillGFW(mcParticle, vtxz, pidIndex, densitycorrections); } if (cfgFillQA) { @@ -729,7 +843,7 @@ struct FlowGenericFramework { } fillPtSums(track, vtxz); - fillGFW(track, vtxz, pidIndex); + fillGFW(track, vtxz, pidIndex, densitycorrections); if (cfgFillQA) fillTrackQA(track, vtxz); @@ -748,7 +862,7 @@ struct FlowGenericFramework { fillWeights(track, vtxz, pidIndex, run); } else { fillPtSums(track, vtxz); - fillGFW(track, vtxz, pidIndex); + fillGFW(track, vtxz, pidIndex, densitycorrections); } if (cfgFillQA) { fillTrackQA(track, vtxz); @@ -779,7 +893,7 @@ struct FlowGenericFramework { } template - inline void fillGFW(TTrack track, const double& vtxz, int pid_index) + inline void fillGFW(TTrack track, const double& vtxz, int pid_index, DensityCorr densitycorrections) { if (cfgUsePID) { // Analysing POI flow with id'ed particles double ptmins[] = {ptpoilow, ptpoilow, 0.3, 0.5}; @@ -812,6 +926,18 @@ struct FlowGenericFramework { double weff = (dt == kGen) ? 1. : getEfficiency(track); if (weff < 0) return; + if (cfgUseDensityDependentCorrection && withinPtRef && dt != kGen) { + double fphi = densitycorrections.v2 * std::cos(2 * (track.phi() - densitycorrections.psi2Est)) + densitycorrections.v3 * std::cos(3 * (track.phi() - densitycorrections.psi3Est)) + densitycorrections.v4 * std::cos(4 * (track.phi() - densitycorrections.psi4Est)); + fphi = (1 + 2 * fphi); + int pTBinForEff = hFindPtBin->FindBin(track.pt()); + if (pTBinForEff >= 1 && pTBinForEff <= hFindPtBin->GetNbinsX()) { + float wEPeff = funcEff[pTBinForEff - 1]->Eval(fphi * densitycorrections.density); + if (wEPeff > 0.) { + wEPeff = 1. / wEPeff; + weff *= wEPeff; + } + } + } double wacc = (dt == kGen) ? 1. : getAcceptance(track, vtxz, 0); if (withinPtRef) fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), weff * wacc, 1); @@ -833,6 +959,13 @@ struct FlowGenericFramework { double wacc = getAcceptance(track, vtxz, 0); registry.fill(HIST("trackQA/") + HIST(FillTimeName[ft]) + HIST("phi_eta_vtxZ"), track.phi(), track.eta(), vtxz, (ft == kAfter) ? wacc : 1.0); registry.fill(HIST("trackQA/") + HIST(FillTimeName[ft]) + HIST("pt_dcaXY_dcaZ"), track.pt(), track.dcaXY(), track.dcaZ()); + + registry.fill(HIST("trackQA/") + HIST(FillTimeName[ft]) + HIST("chi2prTPCcls"), track.tpcChi2NCl()); + registry.fill(HIST("trackQA/") + HIST(FillTimeName[ft]) + HIST("chi2prITScls"), track.itsChi2NCl()); + registry.fill(HIST("trackQA/") + HIST(FillTimeName[ft]) + HIST("nTPCClusters"), track.tpcNClsFound()); + registry.fill(HIST("trackQA/") + HIST(FillTimeName[ft]) + HIST("nITSClusters"), track.itsNCls()); + registry.fill(HIST("trackQA/") + HIST(FillTimeName[ft]) + HIST("nTPCCrossedRows"), track.tpcNClsCrossedRows()); + if (ft == kAfter) { registry.fill(HIST("trackQA/") + HIST(FillTimeName[ft]) + HIST("pt_ref"), track.pt()); registry.fill(HIST("trackQA/") + HIST(FillTimeName[ft]) + HIST("pt_poi"), track.pt()); @@ -857,7 +990,7 @@ struct FlowGenericFramework { Filter trackFilter = nabs(aod::track::eta) < cfgEta && aod::track::pt > cfgPtmin&& aod::track::pt < cfgPtmax && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && nabs(aod::track::dcaXY) < cfgDCAxy&& nabs(aod::track::dcaZ) < cfgDCAz; using GFWTracks = soa::Filtered>; - void processData(soa::Filtered>::iterator const& collision, aod::BCsWithTimestamps const&, GFWTracks const& tracks) + void processData(soa::Filtered>::iterator const& collision, aod::BCsWithTimestamps const&, GFWTracks const& tracks) { auto bc = collision.bc_as(); int run = bc.runNumber(); @@ -894,13 +1027,33 @@ struct FlowGenericFramework { registry.fill(HIST("eventQA/eventSel"), 2.5); if (cfgRunByRun) th1sList[run][hEventSel]->Fill(2.5); - const auto centrality = collision.centFT0C(); + float centrality; + switch (cfgCentEstimator) { + case kCentFT0C: + centrality = collision.centFT0C(); + break; + case kCentFT0CVariant1: + centrality = collision.centFT0CVariant1(); + break; + case kCentFT0M: + centrality = collision.centFT0M(); + break; + case kCentFV0A: + centrality = collision.centFV0A(); + break; + default: + centrality = collision.centFT0C(); + } if (cfgFillQA) fillEventQA(collision, tracks); + registry.fill(HIST("eventQA/before/centrality"), centrality); + registry.fill(HIST("eventQA/before/multiplicity"), tracks.size()); if (cfgUseAdditionalEventCut && !eventSelected(collision, tracks.size(), centrality, run)) return; if (cfgFillQA) fillEventQA(collision, tracks); + registry.fill(HIST("eventQA/after/centrality"), centrality); + registry.fill(HIST("eventQA/after/multiplicity"), tracks.size()); processCollision(collision, tracks, centrality, run); } PROCESS_SWITCH(FlowGenericFramework, processData, "Process analysis for non-derived data", true); From e2c4677aed8f0b3b5a1001a75c6aa16a2eeb5fa6 Mon Sep 17 00:00:00 2001 From: omassen <55696099+omassen@users.noreply.github.com> Date: Thu, 1 May 2025 22:30:53 +0200 Subject: [PATCH 1146/1650] [PWGCF] Implementing additional event selection criteria (#11017) Co-authored-by: ALICE Action Bot --- .../Tasks/neutronProtonCorrZdc.cxx | 162 ++++++++++++++---- 1 file changed, 129 insertions(+), 33 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/neutronProtonCorrZdc.cxx b/PWGCF/TwoParticleCorrelations/Tasks/neutronProtonCorrZdc.cxx index b23be4f956c..1870c66da80 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/neutronProtonCorrZdc.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/neutronProtonCorrZdc.cxx @@ -28,14 +28,29 @@ using namespace o2::framework; using namespace o2::framework::expressions; enum EventCounter { kNoSelection = 0, - kQualitySelection = 1, - kMaxCentralitySelection = 2, - kZDCSelection = 3 }; + kSel8 = 1, + kNoSameBunchPileUp = 2, + kIsGoodZvtxFT0vsPV = 3, + kNoCollInTimeRangeStandard = 4, + kMaxCentralitySelection = 5, + kZDCSelection = 6, + kTimeDifferenceZDC = 7 }; struct NeutronProtonCorrZdc { // Histogram registry: an object to hold your histograms HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + Configurable cfgZVertexCut{"cfgZVertexCut", 10., "Cut on Z vertex position"}; + Configurable cfgNoSameBunchPileupCut{"cfgNoSameBunchPileupCut", true, "kNoSameBunchPileUp Cut"}; + Configurable cfgIsGoodZvtxFT0vsPV{"cfgIsGoodZvtxFT0vsPV", true, "kIsGoodZvtxFT0vsPV Cut"}; + Configurable cfgNoCollInTimeRangeStandard{"cfgNoCollInTimeRangeStandard", true, "kNoCollInTimeRangeStandard Cut"}; + Configurable cfgMaxCentrality{"cfgMaxCentrality", 80, "Maximum collision centrality"}; + Configurable cfgZDCTimingInformationCut{"cfgZDCTimingInformationCut", true, "Use timing information in ZDC event selection"}; + Configurable cfgTimingBins{"cfgTimingBins", 200, "N bins for timing histograms"}; + Configurable cfgTDCZNmincut{"cfgTDCZNmincut", -3.0, "Min ZN TDC cut"}; + Configurable cfgTDCZNmaxcut{"cfgTDCZNmaxcut", 3.0, "Max ZN TDC cut"}; + Configurable cfgTDCZPmincut{"cfgTDCZPmincut", -3.0, "Min ZP TDC cut"}; + Configurable cfgTDCZPmaxcut{"cfgTDCZPmaxcut", 3.0, "Max ZP TDC cut"}; Configurable cfgNBinsZN{"cfgNBinsZN", 100, "N bins for ZNA and ZNC"}; Configurable cfgNBinsZP{"cfgNBinsZP", 100, "N bins for ZPA and ZPC"}; Configurable cfgZNmin{"cfgZNmin", -10, "Minimum value for ZN signal"}; @@ -47,13 +62,13 @@ struct NeutronProtonCorrZdc { Configurable cfgNBinsAlpha{"cfgNBinsAlpha", 100, "Number of bins for ZDC asymmetry"}; Configurable cfgAlphaZmin{"cfgAlphaZmin", -1, "Minimum value for ZDC asymmetry"}; Configurable cfgAlphaZmax{"cfgAlphaZmax", 1, "Maximum value for ZDC asymmetry"}; - Configurable cfgMaxCentrality{"cfgMaxCentrality", 80, "Maximum collision centrality"}; Configurable cfgCentralityEstimator{"cfgCentralityEstimator", 0, "Choice of centrality estimator"}; - Configurable cfgNBinsMultiplicity{"cfgNBinsMultiplicity", 1000, "N bins for multiplicity histograms"}; + Configurable cfgFillMultiplicityQAHistograms{"cfgFillMultiplicityQAHistograms", true, "Fill multiplicity QA plots"}; + Configurable cfgNBinsMultiplicity{"cfgNBinsMultiplicity", 500, "N bins for multiplicity histograms"}; ConfigurableAxis cfgAxisCent{"cfgAxisCent", {VARIABLE_WIDTH, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0, 26.0, 27.0, 28.0, 29.0, 30.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 41.0, 42.0, 43.0, 44.0, 45.0, 46.0, 47.0, 48.0, 49.0, 50.0, 51.0, 52.0, 53.0, 54.0, 55.0, 56.0, 57.0, 58.0, 59.0, 60.0, 61.0, 62.0, 63.0, 64.0, 65.0, 66.0, 67.0, 68.0, 69.0, 70.0, 71.0, 72.0, 73.0, 74.0, 75.0, 76.0, 77.0, 78.0, 79.0, 80.0, 81.0, 82.0, 83.0, 84.0, 85.0, 86.0, 87.0, 88.0, 89.0, 90.0, 91.0, 92.0, 93.0, 94.0, 95.0, 96.0, 97.0, 98.0, 99.0, 100.0}, "Centrality [%]"}; - Filter collisionVtxZ = nabs(aod::collision::posZ) < 10.f; + Filter collisionVtxZ = nabs(aod::collision::posZ) < cfgZVertexCut; using CentralitiesRun3 = soa::Join; using CentralitiesRun2 = aod::CentRun2V0Ms; @@ -62,7 +77,8 @@ struct NeutronProtonCorrZdc { void init(InitContext const&) { // define axes you want to use - const AxisSpec axisCounter{4, -0.5, 3.5, ""}; + const AxisSpec axisCounter{8, -0.5, 7.5, ""}; + const AxisSpec axisZDCTiming{cfgTimingBins, -10, 10}; const AxisSpec axisZNSectorSignal{cfgNBinsZN, cfgZNmin, cfgZNmax / 3.}; const AxisSpec axisZPSectorSignal{cfgNBinsZP, cfgZPmin, cfgZPmax / 3.}; const AxisSpec axisZNASignal{cfgNBinsZN, cfgZNmin, cfgZNmax, "ZNA (a.u.)"}; @@ -80,13 +96,26 @@ struct NeutronProtonCorrZdc { const AxisSpec axisMultiplicityTPC{cfgNBinsMultiplicity, 0, 100000, "TPC"}; const AxisSpec axisMultiplicityMultNGlobal{cfgNBinsMultiplicity, 0, 3500, "MultsNGlobal"}; + HistogramConfigSpec defaultTimingHistogram({HistType::kTH2F, {cfgAxisCent, axisZDCTiming}}); HistogramConfigSpec defaultZNSectorHist({HistType::kTH2F, {cfgAxisCent, axisZNSectorSignal}}); HistogramConfigSpec defaultZPSectorHist({HistType::kTH2F, {cfgAxisCent, axisZPSectorSignal}}); HistogramConfigSpec defaultZDCDiffHist({HistType::kTH2F, {cfgAxisCent, axisZDiffSignal}}); // create histograms histos.add("eventCounter", "eventCounter", kTH1F, {axisCounter}); + histos.get(HIST("eventCounter"))->GetXaxis()->SetBinLabel(EventCounter::kSel8 + 1, "Sel8"); + histos.get(HIST("eventCounter"))->GetXaxis()->SetBinLabel(EventCounter::kNoSameBunchPileUp + 1, "kNoSameBunchPileup"); + histos.get(HIST("eventCounter"))->GetXaxis()->SetBinLabel(EventCounter::kIsGoodZvtxFT0vsPV + 1, "kIsGoodZvtxFT0vsPV"); + histos.get(HIST("eventCounter"))->GetXaxis()->SetBinLabel(EventCounter::kNoCollInTimeRangeStandard + 1, "kNoCollInTimeRangeStandard"); + histos.get(HIST("eventCounter"))->GetXaxis()->SetBinLabel(EventCounter::kMaxCentralitySelection + 1, "Cenrality range"); + histos.get(HIST("eventCounter"))->GetXaxis()->SetBinLabel(EventCounter::kZDCSelection + 1, "isSelectedZDC"); + histos.get(HIST("eventCounter"))->GetXaxis()->SetBinLabel(EventCounter::kTimeDifferenceZDC + 1, "ZDC time difference"); + histos.add("CentralityPercentile", "CentralityPercentile", kTH1F, {cfgAxisCent}); + histos.add("TimingZNAvsCent", "TimingZNAvsCent", defaultTimingHistogram); + histos.add("TimingZNCvsCent", "TimingZNCvsCent", defaultTimingHistogram); + histos.add("TimingZPAvsCent", "TimingZPAvsCent", defaultTimingHistogram); + histos.add("TimingZPCvsCent", "TimingZPCvsCent", defaultTimingHistogram); histos.add("ASide/CentvsZNSector0Signal", "CentvsZNASector0Signal", defaultZNSectorHist); histos.add("ASide/CentvsZNSector1Signal", "CentvsZNASector1Signal", defaultZNSectorHist); @@ -124,18 +153,61 @@ struct NeutronProtonCorrZdc { histos.add("CentvsZNCvsZPC", "CentvsZNCvsZPC", kTH3F, {cfgAxisCent, axisZNCSignal, axisZPCSignal}); histos.add("CentvsZNvsZP", "CentvsZNvsZP", kTH3F, {cfgAxisCent, axisZNSignal, axisZPSignal}); - histos.add("MultiplicityHistograms/FV0A", "FV0A", kTH1F, {axisMultiplicityF0A}); - histos.add("MultiplicityHistograms/FT0A", "FT0A", kTH1F, {axisMultiplicityF0A}); - histos.add("MultiplicityHistograms/FT0C", "FT0C", kTH1F, {axisMultiplicityF0C}); - histos.add("MultiplicityHistograms/FDDA", "FDDA", kTH1F, {axisMultiplicityFDD}); - histos.add("MultiplicityHistograms/FDDC", "FDDC", kTH1F, {axisMultiplicityFDD}); - histos.add("MultiplicityHistograms/TPC", "TPC", kTH1F, {axisMultiplicityTPC}); - histos.add("MultiplicityHistograms/NGlobal", "NGlobal", kTH1F, {axisMultiplicityMultNGlobal}); - histos.add("MultiplicityHistograms/CentvsFT0C", "CentvsFT0C", kTH2F, {cfgAxisCent, axisMultiplicityF0C}); - histos.add("MultiplicityHistograms/CentvsFT0CVar1", "CentvsFT0CVar1", kTH2F, {cfgAxisCent, axisMultiplicityF0C}); - histos.add("MultiplicityHistograms/CentvsFT0M", "CentvsFT0M", kTH2F, {cfgAxisCent, axisMultiplicityF0M}); - histos.add("MultiplicityHistograms/CentvsFV0A", "CentvsFV0A", kTH2F, {cfgAxisCent, axisMultiplicityF0A}); - histos.add("MultiplicityHistograms/CentvsNGlobal", "CentvsNGlobal", kTH2F, {cfgAxisCent, axisMultiplicityMultNGlobal}); + if (cfgFillMultiplicityQAHistograms) { + histos.add("MultiplicityHistograms/FV0A", "FV0A", kTH1F, {axisMultiplicityF0A}); + histos.add("MultiplicityHistograms/FT0A", "FT0A", kTH1F, {axisMultiplicityF0A}); + histos.add("MultiplicityHistograms/FT0C", "FT0C", kTH1F, {axisMultiplicityF0C}); + histos.add("MultiplicityHistograms/FDDA", "FDDA", kTH1F, {axisMultiplicityFDD}); + histos.add("MultiplicityHistograms/FDDC", "FDDC", kTH1F, {axisMultiplicityFDD}); + histos.add("MultiplicityHistograms/TPC", "TPC", kTH1F, {axisMultiplicityTPC}); + histos.add("MultiplicityHistograms/NGlobal", "NGlobal", kTH1F, {axisMultiplicityMultNGlobal}); + histos.add("MultiplicityHistograms/CentvsFT0C", "CentvsFT0C", kTH2F, {cfgAxisCent, axisMultiplicityF0C}); + histos.add("MultiplicityHistograms/CentvsFT0CVar1", "CentvsFT0CVar1", kTH2F, {cfgAxisCent, axisMultiplicityF0C}); + histos.add("MultiplicityHistograms/CentvsFT0M", "CentvsFT0M", kTH2F, {cfgAxisCent, axisMultiplicityF0M}); + histos.add("MultiplicityHistograms/CentvsFV0A", "CentvsFV0A", kTH2F, {cfgAxisCent, axisMultiplicityF0A}); + histos.add("MultiplicityHistograms/CentvsNGlobal", "CentvsNGlobal", kTH2F, {cfgAxisCent, axisMultiplicityMultNGlobal}); + } + } + + template + bool eventSelected(TCollision coll, const float centrality) + { + if (!coll.sel8()) + return 0; + histos.fill(HIST("eventCounter"), kSel8); + + if (cfgNoSameBunchPileupCut) { + if (!coll.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { + // rejects collisions which are associated with the same "found-by-T0" bunch crossing + // https://indico.cern.ch/event/1396220/#1-event-selection-with-its-rof + return 0; + } + histos.fill(HIST("eventCounter"), EventCounter::kNoSameBunchPileUp); + } + + if (cfgIsGoodZvtxFT0vsPV) { + if (!coll.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { + // removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference + // use this cut at low multiplicities with caution + return 0; + } + histos.fill(HIST("eventCounter"), EventCounter::kIsGoodZvtxFT0vsPV); + } + + if (cfgNoCollInTimeRangeStandard) { + if (!coll.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + // Rejection of the collisions which have other events nearby + return 0; + } + histos.fill(HIST("eventCounter"), EventCounter::kNoCollInTimeRangeStandard); + } + + if (centrality > cfgMaxCentrality) { + return 0; + } + histos.fill(HIST("eventCounter"), EventCounter::kMaxCentralitySelection); + + return 1; } template @@ -195,31 +267,55 @@ struct NeutronProtonCorrZdc { void processRun3(soa::Filtered>::iterator const& collision, BCsRun3 const&, aod::Zdcs const&) { histos.fill(HIST("eventCounter"), EventCounter::kNoSelection); - if (!collision.sel8()) { - return; - } - histos.fill(HIST("eventCounter"), EventCounter::kQualitySelection); const float centArray[] = {collision.centFT0C(), collision.centFT0CVariant1(), collision.centFT0M(), collision.centFV0A(), collision.centNGlobal()}; const auto cent = centArray[cfgCentralityEstimator]; - if (cent > cfgMaxCentrality) { + + if (!eventSelected(collision, cent)) return; - } - histos.fill(HIST("eventCounter"), EventCounter::kMaxCentralitySelection); const auto& foundBC = collision.foundBC_as(); if (foundBC.has_zdc()) { const auto& zdcread = foundBC.zdc(); histos.fill(HIST("eventCounter"), EventCounter::kZDCSelection); + + auto tZNA = zdcread.timeZNA(); + auto tZNC = zdcread.timeZNC(); + auto tZPA = zdcread.timeZPA(); + auto tZPC = zdcread.timeZPC(); + + histos.fill(HIST("TimingZNAvsCent"), cent, tZNA); + histos.fill(HIST("TimingZNCvsCent"), cent, tZNC); + histos.fill(HIST("TimingZPAvsCent"), cent, tZPA); + histos.fill(HIST("TimingZPCvsCent"), cent, tZPC); + + // Selection on timing for the ZDC + if (cfgZDCTimingInformationCut) { + if (tZNA <= cfgTDCZNmincut || tZNA >= cfgTDCZNmaxcut) { + return; + } + if (tZNC <= cfgTDCZNmincut || tZNC >= cfgTDCZNmaxcut) { + return; + } + if (tZPA <= cfgTDCZPmincut || tZPA >= cfgTDCZPmaxcut) { + return; + } + if (tZPC <= cfgTDCZPmincut || tZPC >= cfgTDCZPmaxcut) { + return; + } + } + histos.fill(HIST("eventCounter"), EventCounter::kTimeDifferenceZDC); histos.fill(HIST("CentralityPercentile"), cent); - static_for<0, 6>([&](auto i) { - fillMultHistosRun3(collision); // Fill multiplicity histograms - }); + if (cfgFillMultiplicityQAHistograms) { + static_for<0, 6>([&](auto i) { + fillMultHistosRun3(collision); // Fill multiplicity histograms + }); - static_for<0, 4>([&](auto i) { - fillCentHistosRun3(collision); // Fill centrality histograms - }); + static_for<0, 4>([&](auto i) { + fillCentHistosRun3(collision); // Fill centrality vs multiplicity histograms + }); + } static_for<0, 1>([&](auto i) { fillZDCSideCommonHistos(cent, zdcread); // Fill i-side common histograms @@ -264,7 +360,7 @@ struct NeutronProtonCorrZdc { if (!collision.alias_bit(kINT7)) { return; } - histos.fill(HIST("eventCounter"), EventCounter::kQualitySelection); + histos.fill(HIST("eventCounter"), EventCounter::kSel8); if (collision.centRun2V0M() > cfgMaxCentrality) { return; } From 271d7e78e78e6a157edce957ee45197876cf2414 Mon Sep 17 00:00:00 2001 From: Preet-Bhanjan Date: Thu, 1 May 2025 22:38:10 +0200 Subject: [PATCH 1147/1650] [PWGCF] Addition of Pt dependent weights and more correlators (#11032) Co-authored-by: Preet Pati Co-authored-by: Preet Pati --- PWGCF/Flow/Tasks/flowPbpbPikp.cxx | 280 +++++++++++++++++++++--------- 1 file changed, 195 insertions(+), 85 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowPbpbPikp.cxx b/PWGCF/Flow/Tasks/flowPbpbPikp.cxx index f880deaf75b..a70ab3a32c6 100644 --- a/PWGCF/Flow/Tasks/flowPbpbPikp.cxx +++ b/PWGCF/Flow/Tasks/flowPbpbPikp.cxx @@ -91,9 +91,17 @@ struct FlowPbpbPikp { O2_DEFINE_CONFIGURABLE(cfgITScluster, int, 0, "Number of ITS cluster") O2_DEFINE_CONFIGURABLE(cfgTrackDensityCorrUse, bool, true, "Use track density efficiency correction") + O2_DEFINE_CONFIGURABLE(cfgUseWeightPhiEtaVtxz, bool, false, "Use Phi, Eta, VertexZ dependent NUA weights") + O2_DEFINE_CONFIGURABLE(cfgUseWeightPhiPtCent, bool, false, "Use Phi, Pt, Centrality dependent NUA weights") + O2_DEFINE_CONFIGURABLE(cfgUseWeightPhiEtaPt, bool, true, "Use Phi, Eta, Pt dependent NUA weights") + O2_DEFINE_CONFIGURABLE(cfgUseStrictPID, bool, true, "Use strict PID cuts for TPC") + Configurable> cfgTrackDensityP0{"cfgTrackDensityP0", std::vector{0.7217476707, 0.7384792571, 0.7542625668, 0.7640680200, 0.7701951667, 0.7755299053, 0.7805901710, 0.7849446786, 0.7957356586, 0.8113039262, 0.8211968966, 0.8280558878, 0.8329342135}, "parameter 0 for track density efficiency correction"}; Configurable> cfgTrackDensityP1{"cfgTrackDensityP1", std::vector{-2.169488e-05, -2.191913e-05, -2.295484e-05, -2.556538e-05, -2.754463e-05, -2.816832e-05, -2.846502e-05, -2.843857e-05, -2.705974e-05, -2.477018e-05, -2.321730e-05, -2.203315e-05, -2.109474e-05}, "parameter 1 for track density efficiency correction"}; + Configurable> cfgTofNsigmaCut{"cfgTofNsigmaCut", std::vector{1.5, 1.5, 1.5}, "TOF n-sigma cut for pions, kaons, protons"}; + Configurable> cfgItsNsigmaCut{"cfgItsNsigmaCut", std::vector{3, 2.5, 2}, "ITS n-sigma cut for pions, kaons, protons"}; + ConfigurableAxis axisVertex{"axisVertex", {20, -10, 10}, "vertex axis for histograms"}; ConfigurableAxis axisPhi{"axisPhi", {60, 0.0, constants::math::TwoPI}, "phi axis for histograms"}; ConfigurableAxis axisEta{"axisEta", {40, -1., 1.}, "eta axis for histograms"}; @@ -104,6 +112,9 @@ struct FlowPbpbPikp { ConfigurableAxis axisParticles{"axisParticles", {3, 0, 3}, "axis for different hadrons"}; ConfigurableAxis axisTPCsignal{"axisTPCsignal", {10000, 0, 1000}, "axis for TPC signal"}; + std::vector tofNsigmaCut = cfgTofNsigmaCut; + std::vector itsNsigmaCut = cfgItsNsigmaCut; + Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; Filter trackFilter = (nabs(aod::track::dcaXY) < cfgCutDCAxy) && (nabs(aod::track::dcaZ) < cfgCutDCAz) && (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtPOIMin) && (aod::track::pt < cfgCutPtPOIMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls); @@ -152,15 +163,22 @@ struct FlowPbpbPikp { histos.add("hPhiWeighted", "", {HistType::kTH1D, {axisPhi}}); histos.add("hEta", "", {HistType::kTH1D, {axisEta}}); histos.add("hPt", "", {HistType::kTH1D, {axisPt}}); - histos.add("c22_gap08", "", {HistType::kTProfile, {axisMultiplicity}}); - histos.add("c22_gap08_pi", "", {HistType::kTProfile, {axisMultiplicity}}); - histos.add("c22_gap08_ka", "", {HistType::kTProfile, {axisMultiplicity}}); - histos.add("c22_gap08_pr", "", {HistType::kTProfile, {axisMultiplicity}}); - histos.add("c24_full", "", {HistType::kTProfile, {axisMultiplicity}}); - histos.add("c24_gap08", "", {HistType::kTProfile, {axisMultiplicity}}); - histos.add("c24_gap08_pi", "", {HistType::kTProfile, {axisMultiplicity}}); - histos.add("c24_gap08_ka", "", {HistType::kTProfile, {axisMultiplicity}}); - histos.add("c24_gap08_pr", "", {HistType::kTProfile, {axisMultiplicity}}); + histos.add("c22_full_ch", "", {HistType::kTProfile, {axisMultiplicity}}); + histos.add("c22_full_pi", "", {HistType::kTProfile, {axisMultiplicity}}); + histos.add("c22_full_ka", "", {HistType::kTProfile, {axisMultiplicity}}); + histos.add("c22_full_pr", "", {HistType::kTProfile, {axisMultiplicity}}); + histos.add("c22_gap08F_ch", "", {HistType::kTProfile, {axisMultiplicity}}); + histos.add("c22_gap08F_pi", "", {HistType::kTProfile, {axisMultiplicity}}); + histos.add("c22_gap08F_ka", "", {HistType::kTProfile, {axisMultiplicity}}); + histos.add("c22_gap08F_pr", "", {HistType::kTProfile, {axisMultiplicity}}); + histos.add("c22_gap08B_ch", "", {HistType::kTProfile, {axisMultiplicity}}); + histos.add("c22_gap08B_pi", "", {HistType::kTProfile, {axisMultiplicity}}); + histos.add("c22_gap08B_ka", "", {HistType::kTProfile, {axisMultiplicity}}); + histos.add("c22_gap08B_pr", "", {HistType::kTProfile, {axisMultiplicity}}); + histos.add("c24_full_ch", "", {HistType::kTProfile, {axisMultiplicity}}); + histos.add("c24_full_pi", "", {HistType::kTProfile, {axisMultiplicity}}); + histos.add("c24_full_ka", "", {HistType::kTProfile, {axisMultiplicity}}); + histos.add("c24_full_pr", "", {HistType::kTProfile, {axisMultiplicity}}); histos.add("TofTpcNsigma", "", {HistType::kTHnSparseD, {{axisParticles, axisNsigmaTPC, axisNsigmaTOF, axisPt}}}); histos.add("partCount", "", {HistType::kTHnSparseD, {{axisParticles, axisMultiplicity, axisPt}}}); if (cfgOutputNUAWeights && !cfgOutputRunByRun) { @@ -169,6 +187,18 @@ struct FlowPbpbPikp { histos.add("NUA/hPhiEtaVtxz_pi", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); histos.add("NUA/hPhiEtaVtxz_ka", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); histos.add("NUA/hPhiEtaVtxz_pr", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); + + histos.add("NUA/hPhiPtCent_ref", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, axisPt, {20, 0, 100}}}); + histos.add("NUA/hPhiPtCent_ch", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, axisPt, {20, 0, 100}}}); + histos.add("NUA/hPhiPtCent_pi", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, axisPt, {20, 0, 100}}}); + histos.add("NUA/hPhiPtCent_ka", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, axisPt, {20, 0, 100}}}); + histos.add("NUA/hPhiPtCent_pr", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, axisPt, {20, 0, 100}}}); + + histos.add("NUA/hPhiEtaPt_ref", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, axisPt}}); + histos.add("NUA/hPhiEtaPt_ch", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, axisPt}}); + histos.add("NUA/hPhiEtaPt_pi", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, axisPt}}); + histos.add("NUA/hPhiEtaPt_ka", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, axisPt}}); + histos.add("NUA/hPhiEtaPt_pr", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, axisPt}}); } o2::framework::AxisSpec axis = axisPt; @@ -180,40 +210,54 @@ struct FlowPbpbPikp { oba->Add(new TNamed("ChFull22", "ChFull22")); for (int i = 0; i < fPtAxis->GetNbins(); i++) oba->Add(new TNamed(Form("ChFull22_pt_%i", i + 1), "ChFull22_pTDiff")); + oba->Add(new TNamed("PiFull22", "PiFull22")); + for (int i = 0; i < fPtAxis->GetNbins(); i++) + oba->Add(new TNamed(Form("PiFull22_pt_%i", i + 1), "PiFull22_pTDiff")); + oba->Add(new TNamed("KaFull22", "KaFull22")); + for (int i = 0; i < fPtAxis->GetNbins(); i++) + oba->Add(new TNamed(Form("KaFull22_pt_%i", i + 1), "KaFull22_pTDiff")); + oba->Add(new TNamed("PrFull22", "PrFull22")); + for (int i = 0; i < fPtAxis->GetNbins(); i++) + oba->Add(new TNamed(Form("PrFull22_pt_%i", i + 1), "PrFull22_pTDiff")); - oba->Add(new TNamed("Ch08Gap22", "Ch08Gap22")); + oba->Add(new TNamed("Ch08FGap22", "Ch08FGap22")); for (int i = 0; i < fPtAxis->GetNbins(); i++) - oba->Add(new TNamed(Form("Ch08Gap22_pt_%i", i + 1), "Ch08Gap22_pTDiff")); - oba->Add(new TNamed("Pi08Gap22", "Pi08Gap22")); + oba->Add(new TNamed(Form("Ch08FGap22_pt_%i", i + 1), "Ch08FGap22_pTDiff")); + oba->Add(new TNamed("Pi08FGap22", "Pi08FGap22")); for (int i = 0; i < fPtAxis->GetNbins(); i++) - oba->Add(new TNamed(Form("Pi08Gap22_pt_%i", i + 1), "Pi08Gap22_pTDiff")); - oba->Add(new TNamed("Ka08Gap22", "Ka08Gap22")); + oba->Add(new TNamed(Form("Pi08FGap22_pt_%i", i + 1), "Pi08FGap22_pTDiff")); + oba->Add(new TNamed("Ka08FGap22", "Ka08FGap22")); for (int i = 0; i < fPtAxis->GetNbins(); i++) - oba->Add(new TNamed(Form("Ka08Gap22_pt_%i", i + 1), "Ka08Gap22_pTDiff")); - oba->Add(new TNamed("Pr08Gap22", "Pr08Gap22")); + oba->Add(new TNamed(Form("Ka08FGap22_pt_%i", i + 1), "Ka08FGap22_pTDiff")); + oba->Add(new TNamed("Pr08FGap22", "Pr08FGap22")); for (int i = 0; i < fPtAxis->GetNbins(); i++) - oba->Add(new TNamed(Form("Pr08Gap22_pt_%i", i + 1), "Pr08Gap22_pTDiff")); + oba->Add(new TNamed(Form("Pr08FGap22_pt_%i", i + 1), "Pr08FGap22_pTDiff")); oba->Add(new TNamed("ChFull24", "ChFull24")); for (int i = 0; i < fPtAxis->GetNbins(); i++) oba->Add(new TNamed(Form("ChFull24_pt_%i", i + 1), "ChFull24_pTDiff")); - - oba->Add(new TNamed("Ch08Gap24", "Ch08Gap24")); + oba->Add(new TNamed("PiFull24", "PiFull24")); for (int i = 0; i < fPtAxis->GetNbins(); i++) - oba->Add(new TNamed(Form("Ch08Gap24_pt_%i", i + 1), "Ch08Gap24_pTDiff")); - oba->Add(new TNamed("Pi08Gap24", "Pi08Gap24")); + oba->Add(new TNamed(Form("PiFull24_pt_%i", i + 1), "PiFull24_pTDiff")); + oba->Add(new TNamed("KaFull24", "KaFull24")); for (int i = 0; i < fPtAxis->GetNbins(); i++) - oba->Add(new TNamed(Form("Pi08Gap24_pt_%i", i + 1), "Pi08Gap24_pTDiff")); - oba->Add(new TNamed("Ka08Gap24", "Ka08Gap24")); + oba->Add(new TNamed(Form("KaFull24_pt_%i", i + 1), "KaFull24_pTDiff")); + oba->Add(new TNamed("PrFull24", "PrFull24")); for (int i = 0; i < fPtAxis->GetNbins(); i++) - oba->Add(new TNamed(Form("Ka08Gap24_pt_%i", i + 1), "Ka08Gap24_pTDiff")); - oba->Add(new TNamed("Pr08Gap24", "Pr08Gap24")); - for (int i = 0; i < fPtAxis->GetNbins(); i++) - oba->Add(new TNamed(Form("Pr08Gap24_pt_%i", i + 1), "Pr08Gap24_pTDiff")); + oba->Add(new TNamed(Form("PrFull24_pt_%i", i + 1), "PrFull24_pTDiff")); + oba->Add(new TNamed("Ch08BGap22", "Ch08BGap22")); + for (int i = 0; i < fPtAxis->GetNbins(); i++) + oba->Add(new TNamed(Form("Ch08BGap22_pt_%i", i + 1), "Ch08BGap22_pTDiff")); oba->Add(new TNamed("Pi08BGap22", "Pi08BGap22")); for (int i = 0; i < fPtAxis->GetNbins(); i++) oba->Add(new TNamed(Form("Pi08BGap22_pt_%i", i + 1), "Pi08BGap22_pTDiff")); + oba->Add(new TNamed("Ka08BGap22", "Ka08BGap22")); + for (int i = 0; i < fPtAxis->GetNbins(); i++) + oba->Add(new TNamed(Form("Ka08BGap22_pt_%i", i + 1), "Ka08BGap22_pTDiff")); + oba->Add(new TNamed("Pr08BGap22", "Pr08BGap22")); + for (int i = 0; i < fPtAxis->GetNbins(); i++) + oba->Add(new TNamed(Form("Pr08BGap22_pt_%i", i + 1), "Pr08BGap22_pTDiff")); fFC->SetName("FlowContainer"); fFC->SetXAxis(fPtAxis); @@ -223,56 +267,86 @@ struct FlowPbpbPikp { // reference particles fGFW->AddRegion("refN08", -0.8, -0.4, 1, 1); fGFW->AddRegion("refP08", 0.4, 0.8, 1, 1); - fGFW->AddRegion("full", -0.8, 0.8, 1, 512); + fGFW->AddRegion("full", -0.8, 0.8, 1, 1); // pt dependent charged particles - fGFW->AddRegion("poiN", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 128); - fGFW->AddRegion("olN", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 256); - fGFW->AddRegion("poi", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 1024); - fGFW->AddRegion("ol", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 2048); + fGFW->AddRegion("poiN", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 128); // Negative poi eta range + fGFW->AddRegion("olN", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 256); // Negative overlap eta range + + fGFW->AddRegion("poiP", 0.4, 0.8, 1 + fPtAxis->GetNbins(), 128); // Positive poi eta range + fGFW->AddRegion("olP", 0.4, 0.8, 1 + fPtAxis->GetNbins(), 256); // Positive overlap eta range + + fGFW->AddRegion("poi", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 128); // Full poi eta range + fGFW->AddRegion("ol", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 256); // Full overlap eta range // pion - fGFW->AddRegion("poiNpi", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 2); - fGFW->AddRegion("olNpi", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 16); + fGFW->AddRegion("poiNpi", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 2); // Negative poi eta range + fGFW->AddRegion("olNpi", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 16); // Negative overlap eta range - fGFW->AddRegion("poiPpi", 0.4, 0.8, 1 + fPtAxis->GetNbins(), 2); - fGFW->AddRegion("olPpi", 0.4, 0.8, 1 + fPtAxis->GetNbins(), 16); + fGFW->AddRegion("poiPpi", 0.4, 0.8, 1 + fPtAxis->GetNbins(), 2); // Positive poi eta range + fGFW->AddRegion("olPpi", 0.4, 0.8, 1 + fPtAxis->GetNbins(), 16); // Positive overlap eta range + + fGFW->AddRegion("poifullpi", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 2); // Full poi eta range + fGFW->AddRegion("olfullpi", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 16); // Full overlap eta range // kaon - fGFW->AddRegion("poiNk", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 4); - fGFW->AddRegion("olNk", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 32); + fGFW->AddRegion("poiNk", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 4); // Negative poi eta range + fGFW->AddRegion("olNk", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 32); // Negative overlap eta range + + fGFW->AddRegion("poiPk", 0.4, 0.8, 1 + fPtAxis->GetNbins(), 4); // Positive poi eta range + fGFW->AddRegion("olPk", 0.4, 0.8, 1 + fPtAxis->GetNbins(), 32); // Positive overlap eta range + + fGFW->AddRegion("poifullk", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 4); // Full poi eta range + fGFW->AddRegion("olfullk", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 32); // Full overlap eta range // proton - fGFW->AddRegion("poiNpr", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 8); - fGFW->AddRegion("olNpr", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 64); + fGFW->AddRegion("poiNpr", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 8); // Negative poi eta range + fGFW->AddRegion("olNpr", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 64); // Negative overlap eta range + + fGFW->AddRegion("poiPpr", 0.4, 0.8, 1 + fPtAxis->GetNbins(), 8); // Positive poi eta range + fGFW->AddRegion("olPpr", 0.4, 0.8, 1 + fPtAxis->GetNbins(), 64); // Positive overlap eta range + + fGFW->AddRegion("poifullpr", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 8); // Full poi eta range + fGFW->AddRegion("olfullpr", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 64); // Full overlap eta range // reference particles corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {2 -2}", "ChFull22", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Ch08Gap22", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Pi08Gap22", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Ka08Gap22", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Pr08Gap22", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {2 -2}", "PiFull22", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {2 -2}", "KaFull22", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {2 -2}", "PrFull22", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Ch08FGap22", kFALSE)); // Forward correlations + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Pi08FGap22", kFALSE)); // Forward correlations + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Ka08FGap22", kFALSE)); // Forward correlations + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Pr08FGap22", kFALSE)); // Forward correlations + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refP08 {-2} refN08 {2}", "Ch08BGap22", kFALSE)); // Backward correlations + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refP08 {-2} refN08 {2}", "Pi08BGap22", kFALSE)); // Backward correlations + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refP08 {-2} refN08 {2}", "Ka08BGap22", kFALSE)); // Backward correlations + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refP08 {-2} refN08 {2}", "Pr08BGap22", kFALSE)); // Backward correlations corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {2 2 -2 -2}", "ChFull24", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2 2} refP08 {-2 -2}", "Ch08Gap24", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2 2} refP08 {-2 -2}", "Pi08Gap24", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2 2} refP08 {-2 -2}", "Ka08Gap24", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2 2} refP08 {-2 -2}", "Pr08Gap24", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {2 2 -2 -2}", "PiFull24", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {2 2 -2 -2}", "KaFull24", kFALSE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {2 2 -2 -2}", "PrFull24", kFALSE)); // pt differential pois corrconfigs.push_back(fGFW->GetCorrelatorConfig("poi full | ol {2 -2}", "ChFull22", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiN refN08 | olN {2} refP08 {-2}", "Ch08Gap22", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNpi refN08 | olNpi {2} refP08 {-2}", "Pi08Gap22", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNk refN08 | olNk {2} refP08 {-2}", "Ka08Gap22", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNpr refN08 | olNpr {2} refP08 {-2}", "Pr08Gap22", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poi full | ol {2 2 -2 -2}", "ChFull24", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiN refN08 | olN {2 2} refP08 {-2 -2}", "Ch08Gap24", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNpi refN08 | olNpi {2 2} refP08 {-2 -2}", "Pi08Gap24", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNk refN08 | olNk {2 2} refP08 {-2 -2}", "Ka08Gap24", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNpr refN08 | olNpr {2 2} refP08 {-2 -2}", "Pr08Gap24", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poifullpi full | olfullpi {2 -2}", "PiFull22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poifullk full | olfullk {2 -2}", "KaFull22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poifullpr full | olfullpr {2 -2}", "PrFull22", kTRUE)); - // Backward correlations - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Pi08BGap22", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPpi refP08 | olPpi {2} refN08 {-2}", "Pi08BGap22", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiN refN08 | olN {2} refP08 {-2}", "Ch08FGap22", kTRUE)); // Forward correlations + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNpi refN08 | olNpi {2} refP08 {-2}", "Pi08FGap22", kTRUE)); // Forward correlations + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNk refN08 | olNk {2} refP08 {-2}", "Ka08FGap22", kTRUE)); // Forward correlations + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNpr refN08 | olNpr {2} refP08 {-2}", "Pr08FGap22", kTRUE)); // Forward correlations + + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiP refP08 | olP {2} refN08 {-2}", "Ch08BGap22", kTRUE)); // Backward correlations + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPpi refP08 | olPpi {2} refN08 {-2}", "Pi08BGap22", kTRUE)); // Backward correlations + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPk refP08 | olPk {2} refN08 {-2}", "Ka08BGap22", kTRUE)); // Backward correlations + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPpr refP08 | olPpr {2} refN08 {-2}", "Pr08BGap22", kTRUE)); // Backward correlations + + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poi full | ol {2 2 -2 -2}", "ChFull24", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poifullpi full | olfullpi {2 2 -2 -2}", "PiFull24", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poifullk full | olfullk {2 2 -2 -2}", "KaFull24", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poifullpr full | olfullpr {2 2 -2 -2}", "PrFull24", kTRUE)); fGFW->CreateRegions(); @@ -315,7 +389,7 @@ struct FlowPbpbPikp { } template - int getNsigmaPID(TTrack track) + int getNsigmaPIDTpcTof(TTrack track) { // Computing Nsigma arrays for pion, kaon, and protons std::array nSigmaTPC = {track.tpcNSigmaPi(), track.tpcNSigmaKa(), track.tpcNSigmaPr()}; @@ -329,11 +403,17 @@ struct FlowPbpbPikp { return -1; const int numSpecies = 3; + int pidCount = 0; // Select particle with the lowest nsigma for (int i = 0; i < numSpecies; ++i) { if (std::abs(nSigmaToUse[i]) < nsigma) { + if (pidCount > 0 && cfgUseStrictPID) + return -1; // more than one particle with low nsigma + + pidCount++; pid = i; - nsigma = std::abs(nSigmaToUse[i]); + if (!cfgUseStrictPID) + nsigma = std::abs(nSigmaToUse[i]); } } return pid + 1; // shift the pid by 1, 1 = pion, 2 = kaon, 3 = proton @@ -482,26 +562,40 @@ struct FlowPbpbPikp { correctionsLoaded = true; } - template - double getAcceptance(TTrack track, const double& vtxz, int index) - { // 0 ref, 1 ch, 2 pi, 3 ka, 4 pr + template + double getAcceptance(TTrack track, const TCollision collision, int index) + { // 0 = ref, 1 = ch, 2 = pi, 3 = ka, 4 = pr if (index < 0 || index >= kCount_OutputSpecies) { return 1; } double wacc = 1; + double cent = collision.centFT0C(); + double vtxz = collision.posZ(); + + if ((cfgUseWeightPhiEtaVtxz && cfgUseWeightPhiPtCent) || (cfgUseWeightPhiEtaPt && cfgUseWeightPhiPtCent) || (cfgUseWeightPhiEtaVtxz && cfgUseWeightPhiEtaPt)) { + LOGF(fatal, "Only one of the three weight options can be used at a time"); + } + if (!mAcceptance.empty() && correctionsLoaded) { if (!mAcceptance[index]) { LOGF(fatal, "Acceptance weights not loaded for index %d", index); return 1; } - wacc = mAcceptance[index]->getNUA(track.phi(), track.eta(), vtxz); + if (cfgUseWeightPhiEtaVtxz) + wacc = mAcceptance[index]->getNUA(track.phi(), track.eta(), vtxz); + if (cfgUseWeightPhiPtCent) + wacc = mAcceptance[index]->getNUA(track.phi(), track.pt(), cent); + if (cfgUseWeightPhiEtaPt) + wacc = mAcceptance[index]->getNUA(track.phi(), track.eta(), track.pt()); } return wacc; } - template - void fillWeights(const TTrack track, const double vtxz, const int& pid_index, const int& run) + template + void fillWeights(const TTrack track, const TCollision collision, const int& pid_index, const int& run) { + double cent = collision.centFT0C(); + double vtxz = collision.posZ(); double pt = track.pt(); bool withinPtPOI = (cfgCutPtPOIMin < pt) && (pt < cfgCutPtPOIMax); // within POI pT range bool withinPtRef = (cfgCutPtMin < pt) && (pt < cfgCutPtMax); // within RF pT range @@ -512,21 +606,33 @@ struct FlowPbpbPikp { if (withinPtPOI) th3sList[run][hCharge + pid_index]->Fill(track.phi(), track.eta(), vtxz); // charged and id'ed particle weights } else { - if (withinPtRef && !pid_index) + if (withinPtRef && !pid_index) { histos.fill(HIST("NUA/hPhiEtaVtxz_ref"), track.phi(), track.eta(), vtxz); // pt-subset of charged particles for ref flow + histos.fill(HIST("NUA/hPhiPtCent_ref"), track.phi(), track.pt(), cent); + histos.fill(HIST("NUA/hPhiEtaPt_ref"), track.phi(), track.eta(), track.pt()); + } + if (withinPtPOI) { switch (pid_index) { case 0: histos.fill(HIST("NUA/hPhiEtaVtxz_ch"), track.phi(), track.eta(), vtxz); // charged particle weights + histos.fill(HIST("NUA/hPhiPtCent_ch"), track.phi(), track.pt(), cent); + histos.fill(HIST("NUA/hPhiEtaPt_ch"), track.phi(), track.eta(), track.pt()); break; case 1: histos.fill(HIST("NUA/hPhiEtaVtxz_pi"), track.phi(), track.eta(), vtxz); // pion weights + histos.fill(HIST("NUA/hPhiPtCent_pi"), track.phi(), track.pt(), cent); + histos.fill(HIST("NUA/hPhiEtaPt_pi"), track.phi(), track.eta(), track.pt()); break; case 2: histos.fill(HIST("NUA/hPhiEtaVtxz_ka"), track.phi(), track.eta(), vtxz); // kaon weights + histos.fill(HIST("NUA/hPhiPtCent_ka"), track.phi(), track.pt(), cent); + histos.fill(HIST("NUA/hPhiEtaPt_ka"), track.phi(), track.eta(), track.pt()); break; case 3: histos.fill(HIST("NUA/hPhiEtaVtxz_pr"), track.phi(), track.eta(), vtxz); // proton weights + histos.fill(HIST("NUA/hPhiPtCent_pr"), track.phi(), track.pt(), cent); + histos.fill(HIST("NUA/hPhiEtaPt_pr"), track.phi(), track.eta(), track.pt()); break; } } @@ -616,17 +722,17 @@ struct FlowPbpbPikp { bool withinPtRef = (cfgCutPtMin < pt) && (pt < cfgCutPtMax); // within RF pT range // pidIndex = getBayesPIDIndex(track); - pidIndex = getNsigmaPID(track); + pidIndex = getNsigmaPIDTpcTof(track); weff = 1; // Initializing weff for each track // NUA weights if (cfgOutputNUAWeights) - fillWeights(track, vtxz, pidIndex, runNumber); + fillWeights(track, collision, pidIndex, runNumber); if (!withinPtPOI && !withinPtRef) return; - double waccRef = getAcceptance(track, vtxz, 0); - double waccPOI = withinPtPOI ? getAcceptance(track, vtxz, pidIndex + 1) : getAcceptance(track, vtxz, 0); + double waccRef = getAcceptance(track, collision, 0); + double waccPOI = withinPtPOI ? getAcceptance(track, collision, pidIndex + 1) : getAcceptance(track, collision, 0); if (withinPtRef && withinPtPOI && pidIndex) waccRef = waccPOI; // if particle is both (then it's overlap), override ref with POI @@ -647,15 +753,12 @@ struct FlowPbpbPikp { if (withinPtRef) { histos.fill(HIST("hPhiWeighted"), track.phi(), waccRef); fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), waccRef * weff, 1); - fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), waccRef * weff, 512); } if (withinPtPOI) { fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), waccPOI * weff, 128); - fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), waccPOI * weff, 1024); } if (withinPtPOI && withinPtRef) { fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), waccPOI * weff, 256); - fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), waccPOI * weff, 2048); } if (pidIndex) { @@ -668,15 +771,22 @@ struct FlowPbpbPikp { } // track loop ends // Filling cumulants with ROOT TProfile - fillProfile(corrconfigs.at(1), HIST("c22_gap08"), cent); - fillProfile(corrconfigs.at(2), HIST("c22_gap08_pi"), cent); - fillProfile(corrconfigs.at(3), HIST("c22_gap08_ka"), cent); - fillProfile(corrconfigs.at(4), HIST("c22_gap08_pr"), cent); - fillProfile(corrconfigs.at(5), HIST("c24_full"), cent); - fillProfile(corrconfigs.at(6), HIST("c24_gap08"), cent); - fillProfile(corrconfigs.at(7), HIST("c24_gap08_pi"), cent); - fillProfile(corrconfigs.at(8), HIST("c24_gap08_ka"), cent); - fillProfile(corrconfigs.at(9), HIST("c24_gap08_pr"), cent); + fillProfile(corrconfigs.at(0), HIST("c22_full_ch"), cent); + fillProfile(corrconfigs.at(1), HIST("c22_full_pi"), cent); + fillProfile(corrconfigs.at(2), HIST("c22_full_ka"), cent); + fillProfile(corrconfigs.at(3), HIST("c22_full_pr"), cent); + fillProfile(corrconfigs.at(4), HIST("c22_gap08F_ch"), cent); + fillProfile(corrconfigs.at(5), HIST("c22_gap08F_pi"), cent); + fillProfile(corrconfigs.at(6), HIST("c22_gap08F_ka"), cent); + fillProfile(corrconfigs.at(7), HIST("c22_gap08F_pr"), cent); + fillProfile(corrconfigs.at(8), HIST("c22_gap08B_ch"), cent); + fillProfile(corrconfigs.at(9), HIST("c22_gap08B_pi"), cent); + fillProfile(corrconfigs.at(10), HIST("c22_gap08B_ka"), cent); + fillProfile(corrconfigs.at(11), HIST("c22_gap08B_pr"), cent); + fillProfile(corrconfigs.at(12), HIST("c24_full_ch"), cent); + fillProfile(corrconfigs.at(13), HIST("c24_full_pi"), cent); + fillProfile(corrconfigs.at(14), HIST("c24_full_ka"), cent); + fillProfile(corrconfigs.at(15), HIST("c24_full_pr"), cent); for (uint l_ind = 0; l_ind < corrconfigs.size(); l_ind++) { fillFC(corrconfigs.at(l_ind), cent, lRandom); From 3a5bb27d05c90611f73d8f817f89f91b054cff38 Mon Sep 17 00:00:00 2001 From: NNathanson <63293077+NNathanson@users.noreply.github.com> Date: Fri, 2 May 2025 00:44:20 +0200 Subject: [PATCH 1148/1650] [PWGCF] Expanding FlowPtContainer Functionality (#11009) Co-authored-by: ALICE Action Bot --- .../GenericFramework/Core/FlowPtContainer.cxx | 435 +++++++++++++++++- PWGCF/GenericFramework/Core/FlowPtContainer.h | 24 +- 2 files changed, 439 insertions(+), 20 deletions(-) diff --git a/PWGCF/GenericFramework/Core/FlowPtContainer.cxx b/PWGCF/GenericFramework/Core/FlowPtContainer.cxx index d12ee4d3d4d..33f2e303711 100644 --- a/PWGCF/GenericFramework/Core/FlowPtContainer.cxx +++ b/PWGCF/GenericFramework/Core/FlowPtContainer.cxx @@ -140,6 +140,17 @@ void FlowPtContainer::initialise(const o2::framework::AxisSpec axis, const int& fCovList->Add(new BootstrapProfile("ChFull22pt1_Mpt0", "ChFull22pt1_Mpt0", nMultiBins, &multiBins[0])); fCovList->Add(new BootstrapProfile("ChFull22pt1_Mpt1", "ChFull22pt1_Mpt1", nMultiBins, &multiBins[0])); + + fCovList->Add(new BootstrapProfile("ChFull22pt3_Mpt0", "ChFull22pt3_Mpt0", nMultiBins, &multiBins[0])); + fCovList->Add(new BootstrapProfile("ChFull22pt3_Mpt1", "ChFull22pt3_Mpt1", nMultiBins, &multiBins[0])); + fCovList->Add(new BootstrapProfile("ChFull22pt3_Mpt2", "ChFull22pt3_Mpt2", nMultiBins, &multiBins[0])); + fCovList->Add(new BootstrapProfile("ChFull22pt3_Mpt3", "ChFull22pt3_Mpt3", nMultiBins, &multiBins[0])); + + fCovList->Add(new BootstrapProfile("ChFull22pt4_Mpt0", "ChFull22pt4_Mpt0", nMultiBins, &multiBins[0])); + fCovList->Add(new BootstrapProfile("ChFull22pt4_Mpt1", "ChFull22pt4_Mpt1", nMultiBins, &multiBins[0])); + fCovList->Add(new BootstrapProfile("ChFull22pt4_Mpt2", "ChFull22pt4_Mpt2", nMultiBins, &multiBins[0])); + fCovList->Add(new BootstrapProfile("ChFull22pt4_Mpt3", "ChFull22pt4_Mpt3", nMultiBins, &multiBins[0])); + fCovList->Add(new BootstrapProfile("ChFull22pt4_Mpt4", "ChFull22pt4_Mpt4", nMultiBins, &multiBins[0])); } else { fCovList->Add(new BootstrapProfile("ChFull24pt2", "ChFull24pt2", nMultiBins, &multiBins[0])); fCovList->Add(new BootstrapProfile("ChFull24pt1", "ChFull24pt1", nMultiBins, &multiBins[0])); @@ -161,8 +172,8 @@ void FlowPtContainer::initialise(const o2::framework::AxisSpec axis, const int& }; void FlowPtContainer::initialise(int nbinsx, double* xbins, const int& m, const GFWCorrConfigs& configs, const int& nsub) { - arr.resize(3 * 3 * 3 * 3); - warr.resize(3 * 3 * 3 * 3); + arr.resize(3 * 3 * 5 * 5); + warr.resize(3 * 3 * 5 * 5); if (!mpar) mpar = m; if (fCMTermList) @@ -214,6 +225,17 @@ void FlowPtContainer::initialise(int nbinsx, double* xbins, const int& m, const fCovList->Add(new BootstrapProfile("ChFull22pt1_Mpt0", "ChFull22pt1_Mpt0", nbinsx, xbins)); fCovList->Add(new BootstrapProfile("ChFull22pt1_Mpt1", "ChFull22pt1_Mpt1", nbinsx, xbins)); + + fCovList->Add(new BootstrapProfile("ChFull22pt3_Mpt0", "ChFull22pt3_Mpt0", nbinsx, xbins)); + fCovList->Add(new BootstrapProfile("ChFull22pt3_Mpt1", "ChFull22pt3_Mpt1", nbinsx, xbins)); + fCovList->Add(new BootstrapProfile("ChFull22pt3_Mpt2", "ChFull22pt3_Mpt2", nbinsx, xbins)); + fCovList->Add(new BootstrapProfile("ChFull22pt3_Mpt3", "ChFull22pt3_Mpt3", nbinsx, xbins)); + + fCovList->Add(new BootstrapProfile("ChFull22pt4_Mpt0", "ChFull22pt4_Mpt0", nbinsx, xbins)); + fCovList->Add(new BootstrapProfile("ChFull22pt4_Mpt1", "ChFull22pt4_Mpt1", nbinsx, xbins)); + fCovList->Add(new BootstrapProfile("ChFull22pt4_Mpt2", "ChFull22pt4_Mpt2", nbinsx, xbins)); + fCovList->Add(new BootstrapProfile("ChFull22pt4_Mpt3", "ChFull22pt4_Mpt3", nbinsx, xbins)); + fCovList->Add(new BootstrapProfile("ChFull22pt4_Mpt4", "ChFull22pt4_Mpt4", nbinsx, xbins)); } else { fCovList->Add(new BootstrapProfile("ChFull24pt2", "ChFull24pt2", nbinsx, xbins)); fCovList->Add(new BootstrapProfile("ChFull24pt1", "ChFull24pt1", nbinsx, xbins)); @@ -233,8 +255,8 @@ void FlowPtContainer::initialise(int nbinsx, double* xbins, const int& m, const }; void FlowPtContainer::initialise(int nbinsx, double xlow, double xhigh, const int& m, const GFWCorrConfigs& configs, const int& nsub) { - arr.resize(3 * 3 * 3 * 3); - warr.resize(3 * 3 * 3 * 3); + arr.resize(3 * 3 * 5 * 5); + warr.resize(3 * 3 * 5 * 5); if (!mpar) mpar = m; if (fCMTermList) @@ -286,6 +308,17 @@ void FlowPtContainer::initialise(int nbinsx, double xlow, double xhigh, const in fCovList->Add(new BootstrapProfile("ChFull22pt1_Mpt0", "ChFull22pt1_Mpt0", nbinsx, xlow, xhigh)); fCovList->Add(new BootstrapProfile("ChFull22pt1_Mpt1", "ChFull22pt1_Mpt1", nbinsx, xlow, xhigh)); + + fCovList->Add(new BootstrapProfile("ChFull22pt3_Mpt0", "ChFull22pt3_Mpt0", nbinsx, xlow, xhigh)); + fCovList->Add(new BootstrapProfile("ChFull22pt3_Mpt1", "ChFull22pt3_Mpt1", nbinsx, xlow, xhigh)); + fCovList->Add(new BootstrapProfile("ChFull22pt3_Mpt2", "ChFull22pt3_Mpt2", nbinsx, xlow, xhigh)); + fCovList->Add(new BootstrapProfile("ChFull22pt3_Mpt3", "ChFull22pt3_Mpt3", nbinsx, xlow, xhigh)); + + fCovList->Add(new BootstrapProfile("ChFull22pt4_Mpt0", "ChFull22pt4_Mpt0", nbinsx, xlow, xhigh)); + fCovList->Add(new BootstrapProfile("ChFull22pt4_Mpt1", "ChFull22pt4_Mpt1", nbinsx, xlow, xhigh)); + fCovList->Add(new BootstrapProfile("ChFull22pt4_Mpt2", "ChFull22pt4_Mpt2", nbinsx, xlow, xhigh)); + fCovList->Add(new BootstrapProfile("ChFull22pt4_Mpt3", "ChFull22pt4_Mpt3", nbinsx, xlow, xhigh)); + fCovList->Add(new BootstrapProfile("ChFull22pt4_Mpt4", "ChFull22pt4_Mpt4", nbinsx, xlow, xhigh)); } else { fCovList->Add(new BootstrapProfile("ChFull24pt2", "ChFull24pt2", nbinsx, xlow, xhigh)); fCovList->Add(new BootstrapProfile("ChFull24pt1", "ChFull24pt1", nbinsx, xlow, xhigh)); @@ -430,6 +463,33 @@ void FlowPtContainer::fillVnDeltaPtStdProfiles(const double& centmult, const dou double wABD = getStdABD(warr); if (wABD != 0) dynamic_cast(fCovList->At(9))->FillProfile(centmult, getStdABD(arr) / wABD, (fEventWeight == UnityWeight) ? 1.0 : wABD, rn); + double wABCCCC = getStdABCCCC(warr); + if (wABCCCC != 0.) + dynamic_cast(fCovList->At(14))->FillProfile(centmult, getStdABCCCC(arr) / wABCCCC, (fEventWeight == UnityWeight) ? 1. : wABCCCC, rn); + double wABCCCD = getStdABCCCD(warr); + if (wABCCCD != 0.) + dynamic_cast(fCovList->At(15))->FillProfile(centmult, getStdABCCCD(arr) / wABCCCD, (fEventWeight == UnityWeight) ? 1. : wABCCCD, rn); + double wABCCDD = getStdABCCDD(warr); + if (wABCCDD != 0.) + dynamic_cast(fCovList->At(16))->FillProfile(centmult, getStdABCCDD(arr) / wABCCDD, (fEventWeight == UnityWeight) ? 1. : wABCCDD, rn); + double wABCDDD = getStdABCDDD(warr); + if (wABCDDD != 0.) + dynamic_cast(fCovList->At(17))->FillProfile(centmult, getStdABCDDD(arr) / wABCDDD, (fEventWeight == UnityWeight) ? 1. : wABCDDD, rn); + double wABDDDD = getStdABDDDD(warr); + if (wABDDDD != 0.) + dynamic_cast(fCovList->At(18))->FillProfile(centmult, getStdABDDDD(arr) / wABDDDD, (fEventWeight == UnityWeight) ? 1. : wABDDDD, rn); + double wABCCC = getStdABCCC(warr); + if (wABCCC != 0.) + dynamic_cast(fCovList->At(10))->FillProfile(centmult, getStdABCCC(arr) / wABCCC, (fEventWeight == UnityWeight) ? 1. : wABCCC, rn); + double wABCCD = getStdABCCD(warr); + if (wABCCD != 0.) + dynamic_cast(fCovList->At(11))->FillProfile(centmult, getStdABCCD(arr) / wABCCD, (fEventWeight == UnityWeight) ? 1. : wABCCD, rn); + double wABCDD = getStdABCDD(warr); + if (wABCDD != 0.) + dynamic_cast(fCovList->At(12))->FillProfile(centmult, getStdABCDD(arr) / wABCDD, (fEventWeight == UnityWeight) ? 1. : wABCDD, rn); + double wABDDD = getStdABDDD(warr); + if (wABDDD != 0.) + dynamic_cast(fCovList->At(13))->FillProfile(centmult, getStdABDDD(arr) / wABDDD, (fEventWeight == UnityWeight) ? 1. : wABDDD, rn); return; } void FlowPtContainer::fillCMProfiles(const double& centmult, const double& rn) @@ -466,7 +526,7 @@ void FlowPtContainer::fillCMProfiles(const double& centmult, const double& rn) return; cmVal.push_back(1 / cmDen[4] * (sumP[getVectorIndex(1, 1)] * sumP[getVectorIndex(1, 1)] * sumP[getVectorIndex(1, 1)] * sumP[getVectorIndex(1, 1)] - 6 * sumP[getVectorIndex(2, 2)] * sumP[getVectorIndex(1, 1)] * sumP[getVectorIndex(1, 1)] + 3 * sumP[getVectorIndex(2, 2)] * sumP[getVectorIndex(2, 2)] + 8 * sumP[getVectorIndex(3, 3)] * sumP[getVectorIndex(1, 1)] - 6 * sumP[getVectorIndex(4, 4)])); dynamic_cast(fCMTermList->At(6))->FillProfile(centmult, cmVal[7], (fEventWeight == EventWeight::UnityWeight) ? 1.0 : cmDen[4], rn); - cmVal.push_back(-4 * 1 / cmDen[4] * (sumP[getVectorIndex(1, 1)] * sumP[getVectorIndex(1, 1)] * sumP[getVectorIndex(1, 1)] * sumP[getVectorIndex(1, 0)] - 3 * sumP[getVectorIndex(2, 2)] * sumP[getVectorIndex(1, 1)] * sumP[getVectorIndex(1, 0)] - 3 * sumP[getVectorIndex(1, 1)] * sumP[getVectorIndex(1, 1)] * sumP[getVectorIndex(2, 1)] + 3 * sumP[getVectorIndex(2, 2)] * sumP[getVectorIndex(2, 1)] + 6 * sumP[getVectorIndex(1, 1)] * sumP[getVectorIndex(3, 2)] - 6 * sumP[getVectorIndex(4, 3)])); + cmVal.push_back(-4 * 1 / cmDen[4] * (sumP[getVectorIndex(1, 1)] * sumP[getVectorIndex(1, 1)] * sumP[getVectorIndex(1, 1)] * sumP[getVectorIndex(1, 0)] - 3 * sumP[getVectorIndex(2, 2)] * sumP[getVectorIndex(1, 1)] * sumP[getVectorIndex(1, 0)] - 3 * sumP[getVectorIndex(1, 1)] * sumP[getVectorIndex(1, 1)] * sumP[getVectorIndex(2, 1)] + 3 * sumP[getVectorIndex(2, 2)] * sumP[getVectorIndex(2, 1)] + 2 * sumP[getVectorIndex(3, 3)] * sumP[getVectorIndex(1, 0)] + 6 * sumP[getVectorIndex(1, 1)] * sumP[getVectorIndex(3, 2)] - 6 * sumP[getVectorIndex(4, 3)])); dynamic_cast(fCMTermList->At(7))->FillProfile(centmult, cmVal[8], (fEventWeight == EventWeight::UnityWeight) ? 1.0 : cmDen[4], rn); cmVal.push_back(6 * 1 / cmDen[4] * (sumP[getVectorIndex(1, 1)] * sumP[getVectorIndex(1, 1)] * sumP[getVectorIndex(1, 0)] * sumP[getVectorIndex(1, 0)] - sumP[getVectorIndex(2, 2)] * sumP[getVectorIndex(1, 0)] * sumP[getVectorIndex(1, 0)] - sumP[getVectorIndex(2, 0)] * sumP[getVectorIndex(1, 1)] * sumP[getVectorIndex(1, 1)] + sumP[getVectorIndex(2, 0)] * sumP[getVectorIndex(2, 2)] - 4 * sumP[getVectorIndex(2, 1)] * sumP[getVectorIndex(1, 1)] * sumP[getVectorIndex(1, 0)] + 4 * sumP[getVectorIndex(3, 2)] * sumP[getVectorIndex(1, 0)] + 4 * sumP[getVectorIndex(3, 1)] * sumP[getVectorIndex(1, 1)] + 2 * sumP[getVectorIndex(2, 1)] * sumP[getVectorIndex(2, 1)] - 6 * sumP[getVectorIndex(4, 2)])); dynamic_cast(fCMTermList->At(8))->FillProfile(centmult, cmVal[9], (fEventWeight == EventWeight::UnityWeight) ? 1.0 : cmDen[4], rn); @@ -476,11 +536,11 @@ void FlowPtContainer::fillCMProfiles(const double& centmult, const double& rn) } void FlowPtContainer::fillArray(FillType a, FillType b, double c, double d) { - for (int idx = 0; idx < 81; ++idx) { + for (int idx = 0; idx < 225; ++idx) { int i = idx % 3; int j = ((idx - i) / 3) % 3; - int k = ((idx - j * 3 - i) / 9) % 3; - int l = ((idx - k * 9 - j * 3 - i) / 27) % 3; + int k = ((idx - j * 3 - i) / 9) % 5; + int l = ((idx - k * 9 - j * 3 - i) / 45) % 5; if (std::holds_alternative>(a) && std::holds_alternative>(b)) { arr[idx] += std::pow(std::get<0>(a), i) * std::pow(std::get<0>(b), j) * std::pow(c, k) * std::pow(d, l); } else if (std::holds_alternative(a) && std::holds_alternative(b)) { @@ -667,21 +727,21 @@ double FlowPtContainer::getStdAABBD(T& inarr) { std::complex a = inarr[getVectorIndex(1, 0, 0, 0)]; std::complex b = inarr[getVectorIndex(0, 1, 0, 0)]; - std::complex d = inarr[getVectorIndex(0, 0, 1, 0)]; + std::complex d = inarr[getVectorIndex(0, 0, 0, 1)]; std::complex aa = inarr[getVectorIndex(2, 0, 0, 0)]; std::complex ab = inarr[getVectorIndex(1, 1, 0, 0)]; - std::complex ad = inarr[getVectorIndex(1, 0, 1, 0)]; + std::complex ad = inarr[getVectorIndex(1, 0, 0, 1)]; std::complex bb = inarr[getVectorIndex(0, 2, 0, 0)]; - std::complex bd = inarr[getVectorIndex(0, 1, 1, 0)]; + std::complex bd = inarr[getVectorIndex(0, 1, 0, 1)]; std::complex aab = inarr[getVectorIndex(2, 1, 0, 0)]; - std::complex aad = inarr[getVectorIndex(2, 0, 1, 0)]; + std::complex aad = inarr[getVectorIndex(2, 0, 0, 1)]; std::complex abb = inarr[getVectorIndex(1, 2, 0, 0)]; - std::complex abd = inarr[getVectorIndex(1, 1, 1, 0)]; - std::complex bbd = inarr[getVectorIndex(0, 2, 1, 0)]; + std::complex abd = inarr[getVectorIndex(1, 1, 0, 1)]; + std::complex bbd = inarr[getVectorIndex(0, 2, 0, 1)]; std::complex aabb = inarr[getVectorIndex(2, 2, 0, 0)]; - std::complex aabd = inarr[getVectorIndex(2, 1, 1, 0)]; - std::complex abbd = inarr[getVectorIndex(1, 2, 1, 0)]; - std::complex aabbd = inarr[getVectorIndex(2, 2, 1, 0)]; + std::complex aabd = inarr[getVectorIndex(2, 1, 0, 1)]; + std::complex abbd = inarr[getVectorIndex(1, 2, 0, 1)]; + std::complex aabbd = inarr[getVectorIndex(2, 2, 0, 1)]; return (a * a * b * b * d - aa * b * b * d - a * a * bb * d - 4. * ab * a * b * d - 2. * a * ad * b * b - 2. * a * a * bd * b + 2. * ab * ab * d + 4. * ab * ad * b + 4. * ab * bd * a + 8. * abd * a * b + 4. * aab * b * d + 2. * aad * b * b + 4. * abb * a * d + 2. * bbd * a * a + aa * bb * d + 2. * aa * b * bd + 2. * bb * a * ad - 12. * aabd * b - 12. * abbd * a - 6. * aabb * d - 8. * abd * ab - 2. * bbd * aa - 2. * aad * bb - 4. * aab * bd - 4. * abb * ad + 24. * aabbd).real(); } template @@ -763,6 +823,347 @@ double FlowPtContainer::getStdABD(T& inarr) std::complex abd = inarr[getVectorIndex(1, 1, 0, 1)]; return (a * b * d - ab * d - ad * b - a * bd + 2. * abd).real(); } +template +double FlowPtContainer::getStdABCCCC(T& inarr) +{ + std::complex a = inarr[getVectorIndex(1, 0, 0, 0)]; + std::complex b = inarr[getVectorIndex(0, 1, 0, 0)]; + std::complex c = inarr[getVectorIndex(0, 0, 1, 0)]; + std::complex ab = inarr[getVectorIndex(1, 1, 0, 0)]; + std::complex ac = inarr[getVectorIndex(1, 0, 1, 0)]; + std::complex bc = inarr[getVectorIndex(0, 1, 1, 0)]; + std::complex cc = inarr[getVectorIndex(0, 0, 2, 0)]; + std::complex abc = inarr[getVectorIndex(1, 1, 1, 0)]; + std::complex acc = inarr[getVectorIndex(1, 0, 2, 0)]; + std::complex bcc = inarr[getVectorIndex(0, 1, 2, 0)]; + std::complex ccc = inarr[getVectorIndex(0, 0, 3, 0)]; + std::complex abcc = inarr[getVectorIndex(1, 1, 2, 0)]; + std::complex accc = inarr[getVectorIndex(1, 0, 3, 0)]; + std::complex bccc = inarr[getVectorIndex(0, 1, 3, 0)]; + std::complex cccc = inarr[getVectorIndex(0, 0, 4, 0)]; + std::complex abccc = inarr[getVectorIndex(1, 1, 3, 0)]; + std::complex acccc = inarr[getVectorIndex(1, 0, 4, 0)]; + std::complex bcccc = inarr[getVectorIndex(0, 1, 4, 0)]; + std::complex abcccc = inarr[getVectorIndex(1, 1, 4, 0)]; + return (-120. * abcccc + 24. * acccc * b + 24. * accc * bc + 24. * acc * bcc + + 24. * ac * bccc + 24. * a * bcccc + 96. * abccc * c - 24. * accc * b * c - 24. * acc * bc * c - + 24. * ac * bcc * c - 24. * a * bccc * c - 36. * abcc * c * c + 12. * acc * b * c * c + + 12. * ac * bc * c * c + 12. * a * bcc * c * c + 8. * abc * c * c * c - 4. * ac * b * c * c * c - 4. * a * bc * c * c * c - + ab * c * c * c * c + a * b * c * c * c * c + 36. * abcc * cc - 12. * acc * b * cc - 12. * ac * bc * cc - 12. * a * bcc * cc - 24. * abc * c * cc + 12. * ac * b * c * cc + 12. * a * bc * c * cc + 6. * ab * c * c * cc - 6. * a * b * c * c * cc - 3. * ab * cc * cc + 3. * a * b * cc * cc + 16. * abc * ccc - 8. * ac * b * ccc - 8. * a * bc * ccc - 8. * ab * c * ccc + 8. * a * b * c * ccc + 6. * ab * cccc - 6. * a * b * cccc) + .real(); +} +template +double FlowPtContainer::getStdABCCCD(T& inarr) +{ + std::complex a = inarr[getVectorIndex(1, 0, 0, 0)]; + std::complex b = inarr[getVectorIndex(0, 1, 0, 0)]; + std::complex c = inarr[getVectorIndex(0, 0, 1, 0)]; + std::complex d = inarr[getVectorIndex(0, 0, 0, 1)]; + std::complex ab = inarr[getVectorIndex(1, 1, 0, 0)]; + std::complex ac = inarr[getVectorIndex(1, 0, 1, 0)]; + std::complex ad = inarr[getVectorIndex(1, 0, 0, 1)]; + std::complex bc = inarr[getVectorIndex(0, 1, 1, 0)]; + std::complex bd = inarr[getVectorIndex(0, 1, 0, 1)]; + std::complex cc = inarr[getVectorIndex(0, 0, 2, 0)]; + std::complex cd = inarr[getVectorIndex(0, 0, 1, 1)]; + std::complex abc = inarr[getVectorIndex(1, 1, 1, 0)]; + std::complex abd = inarr[getVectorIndex(1, 1, 0, 1)]; + std::complex acc = inarr[getVectorIndex(1, 0, 2, 0)]; + std::complex acd = inarr[getVectorIndex(1, 0, 1, 1)]; + std::complex bcc = inarr[getVectorIndex(0, 1, 2, 0)]; + std::complex bcd = inarr[getVectorIndex(0, 1, 1, 1)]; + std::complex ccc = inarr[getVectorIndex(0, 0, 3, 0)]; + std::complex ccd = inarr[getVectorIndex(0, 0, 2, 1)]; + std::complex abcc = inarr[getVectorIndex(1, 1, 2, 0)]; + std::complex abcd = inarr[getVectorIndex(1, 1, 1, 1)]; + std::complex accc = inarr[getVectorIndex(1, 0, 3, 0)]; + std::complex accd = inarr[getVectorIndex(1, 0, 2, 1)]; + std::complex bccc = inarr[getVectorIndex(0, 1, 3, 0)]; + std::complex bccd = inarr[getVectorIndex(0, 1, 2, 1)]; + std::complex cccd = inarr[getVectorIndex(0, 0, 3, 1)]; + std::complex abccc = inarr[getVectorIndex(1, 1, 3, 0)]; + std::complex abccd = inarr[getVectorIndex(1, 1, 2, 1)]; + std::complex acccd = inarr[getVectorIndex(1, 0, 3, 1)]; + std::complex bcccd = inarr[getVectorIndex(0, 1, 3, 1)]; + std::complex abcccd = inarr[getVectorIndex(1, 1, 3, 1)]; + return (-120. * abcccd + 24. * acccd * b + 18. * accd * bc + 12. * acd * bcc + 6. * ad * bccc + + 24. * a * bcccd + 18. * ac * bccd + 12. * acc * bcd + 6. * accc * bd + 72. * abccd * c - + 18. * accd * b * c - 12. * acd * bc * c - 6. * ad * bcc * c - 18. * a * bccd * c - 12. * ac * bcd * c - + 6. * acc * bd * c - 18. * abcd * c * c + 6. * acd * b * c * c + 3. * ad * bc * c * c + 6. * a * bcd * c * c + + 3. * ac * bd * c * c + 2. * abd * c * c * c - ad * b * c * c * c - a * bd * c * c * c + 18. * abcd * cc - + 6. * acd * b * cc - 3. * ad * bc * cc - 6. * a * bcd * cc - 3. * ac * bd * cc - 6. * abd * c * cc + + 3. * ad * b * c * cc + 3. * a * bd * c * cc + 4. * abd * ccc - 2. * ad * b * ccc - 2. * a * bd * ccc + + 6. * ab * cccd - 6. * a * b * cccd + 12. * abc * ccd - 6. * ac * b * ccd - 6. * a * bc * ccd - + 6. * ab * c * ccd + 6. * a * b * c * ccd + 18. * abcc * cd - 6. * acc * b * cd - 6. * ac * bc * cd - + 6. * a * bcc * cd - 12. * abc * c * cd + 6. * ac * b * c * cd + 6. * a * bc * c * cd + 3. * ab * c * c * cd - + 3. * a * b * c * c * cd - 3. * ab * cc * cd + 3. * a * b * cc * cd + 24. * abccc * d - 6. * accc * b * d - + 6. * acc * bc * d - 6. * ac * bcc * d - 6. * a * bccc * d - 18. * abcc * c * d + 6. * acc * b * c * d + + 6. * ac * bc * c * d + 6. * a * bcc * c * d + 6. * abc * c * c * d - 3. * ac * b * c * c * d - + 3. * a * bc * c * c * d - ab * c * c * c * d + a * b * c * c * c * d - 6. * abc * cc * d + 3. * ac * b * cc * d + + 3. * a * bc * cc * d + 3. * ab * c * cc * d - 3. * a * b * c * cc * d - 2. * ab * ccc * d + 2. * a * b * ccc * d) + .real(); +} +template +double FlowPtContainer::getStdABCCDD(T& inarr) +{ + std::complex a = inarr[getVectorIndex(1, 0, 0, 0)]; + std::complex b = inarr[getVectorIndex(0, 1, 0, 0)]; + std::complex c = inarr[getVectorIndex(0, 0, 1, 0)]; + std::complex d = inarr[getVectorIndex(0, 0, 0, 1)]; + std::complex ab = inarr[getVectorIndex(1, 1, 0, 0)]; + std::complex ac = inarr[getVectorIndex(1, 0, 1, 0)]; + std::complex ad = inarr[getVectorIndex(1, 0, 0, 1)]; + std::complex bc = inarr[getVectorIndex(0, 1, 1, 0)]; + std::complex bd = inarr[getVectorIndex(0, 1, 0, 1)]; + std::complex cc = inarr[getVectorIndex(0, 0, 2, 0)]; + std::complex cd = inarr[getVectorIndex(0, 0, 1, 1)]; + std::complex dd = inarr[getVectorIndex(0, 0, 0, 2)]; + std::complex abc = inarr[getVectorIndex(1, 1, 1, 0)]; + std::complex abd = inarr[getVectorIndex(1, 1, 0, 1)]; + std::complex acc = inarr[getVectorIndex(1, 0, 2, 0)]; + std::complex acd = inarr[getVectorIndex(1, 0, 1, 1)]; + std::complex add = inarr[getVectorIndex(1, 0, 0, 2)]; + std::complex bcc = inarr[getVectorIndex(0, 1, 2, 0)]; + std::complex bcd = inarr[getVectorIndex(0, 1, 1, 1)]; + std::complex bdd = inarr[getVectorIndex(0, 1, 0, 2)]; + std::complex ccd = inarr[getVectorIndex(0, 0, 2, 1)]; + std::complex cdd = inarr[getVectorIndex(0, 0, 1, 2)]; + std::complex abcc = inarr[getVectorIndex(1, 1, 2, 0)]; + std::complex abcd = inarr[getVectorIndex(1, 1, 1, 1)]; + std::complex abdd = inarr[getVectorIndex(1, 1, 0, 2)]; + std::complex accd = inarr[getVectorIndex(1, 0, 2, 1)]; + std::complex acdd = inarr[getVectorIndex(1, 0, 1, 2)]; + std::complex bccd = inarr[getVectorIndex(0, 1, 2, 1)]; + std::complex bcdd = inarr[getVectorIndex(0, 1, 1, 2)]; + std::complex ccdd = inarr[getVectorIndex(0, 0, 2, 2)]; + std::complex abccd = inarr[getVectorIndex(1, 1, 2, 1)]; + std::complex abcdd = inarr[getVectorIndex(1, 1, 1, 2)]; + std::complex accdd = inarr[getVectorIndex(1, 0, 2, 2)]; + std::complex bccdd = inarr[getVectorIndex(0, 1, 2, 2)]; + std::complex abccdd = inarr[getVectorIndex(1, 1, 2, 2)]; + return (-120. * abccdd + 24. * accdd * b + 12. * acdd * bc + 4. * add * bcc + 12. * ad * bccd + + 24. * a * bccdd + 16. * acd * bcd + 12. * ac * bcdd + 12. * accd * bd + 4. * acc * bdd + + 48. * abcdd * c - 12. * acdd * b * c - 4. * add * bc * c - 8. * ad * bcd * c - 12. * a * bcdd * c - + 8. * acd * bd * c - 4. * ac * bdd * c - 6. * abdd * c * c + 2. * add * b * c * c + 2. * ad * bd * c * c + + 2. * a * bdd * c * c + 6. * abdd * cc - 2. * add * b * cc - 2. * ad * bd * cc - 2. * a * bdd * cc + + 8. * abd * ccd - 4. * ad * b * ccd - 4. * a * bd * ccd + 6. * ab * ccdd - 6. * a * b * ccdd + + 24. * abcd * cd - 8. * acd * b * cd - 4. * ad * bc * cd - 8. * a * bcd * cd - 4. * ac * bd * cd - + 8. * abd * c * cd + 4. * ad * b * c * cd + 4. * a * bd * c * cd - 2. * ab * cd * d + 2. * a * b * cd * d + + 8. * abc * cdd - 4. * ac * b * cdd - 4. * a * bc * cdd - 4. * ab * c * cdd + 4. * a * b * c * cdd + + 48. * abccd * d - 12. * accd * b * d - 8. * acd * bc * d - 4. * ad * bcc * d - 12. * a * bccd * d - + 8. * ac * bcd * d - 4. * acc * bd * d - 24. * abcd * c * d + 8. * acd * b * c * d + 4. * ad * bc * c * d + + 8. * a * bcd * c * d + 4. * ac * bd * c * d + 4. * abd * c * c * d - 2. * ad * b * c * c * d - + 2. * a * bd * c * c * d - 4. * abd * cc * d + 2. * ad * b * cc * d + 2. * a * bd * cc * d - 4. * ab * ccd * d + + 4. * a * b * ccd * d - 8. * abc * cd * d + 4. * ac * b * cd * d + 4. * a * bc * cd * d + 4. * ab * c * cd * d - + 4. * a * b * c * cd * d - 6. * abcc * d * d + 2. * acc * b * d * d + 2. * ac * bc * d * d + + 2. * a * bcc * d * d + 4. * abc * c * d * d - 2. * ac * b * c * d * d - 2. * a * bc * c * d * d - + ab * c * c * d * d + a * b * c * c * d * d + ab * cc * d * d - a * b * cc * d * d + 6. * abcc * dd - + 2. * acc * b * dd - 2. * ac * bc * dd - 2. * a * bcc * dd - 4. * abc * c * dd + 2. * ac * b * c * dd + + 2. * a * bc * c * dd + ab * c * c * dd - a * b * c * c * dd - ab * cc * dd + a * b * cc * dd) + .real(); +} +template +double FlowPtContainer::getStdABCDDD(T& inarr) +{ + std::complex a = inarr[getVectorIndex(1, 0, 0, 0)]; + std::complex b = inarr[getVectorIndex(0, 1, 0, 0)]; + std::complex c = inarr[getVectorIndex(0, 0, 1, 0)]; + std::complex d = inarr[getVectorIndex(0, 0, 0, 1)]; + std::complex ab = inarr[getVectorIndex(1, 1, 0, 0)]; + std::complex ac = inarr[getVectorIndex(1, 0, 1, 0)]; + std::complex ad = inarr[getVectorIndex(1, 0, 0, 1)]; + std::complex bc = inarr[getVectorIndex(0, 1, 1, 0)]; + std::complex bd = inarr[getVectorIndex(0, 1, 0, 1)]; + std::complex cd = inarr[getVectorIndex(0, 0, 1, 1)]; + std::complex dd = inarr[getVectorIndex(0, 0, 0, 2)]; + std::complex abc = inarr[getVectorIndex(1, 1, 1, 0)]; + std::complex abd = inarr[getVectorIndex(1, 1, 0, 1)]; + std::complex acd = inarr[getVectorIndex(1, 0, 1, 1)]; + std::complex add = inarr[getVectorIndex(1, 0, 0, 2)]; + std::complex bcd = inarr[getVectorIndex(0, 1, 1, 1)]; + std::complex bdd = inarr[getVectorIndex(0, 1, 0, 2)]; + std::complex cdd = inarr[getVectorIndex(0, 0, 1, 2)]; + std::complex ddd = inarr[getVectorIndex(0, 0, 0, 3)]; + std::complex abcd = inarr[getVectorIndex(1, 1, 1, 1)]; + std::complex abdd = inarr[getVectorIndex(1, 1, 0, 2)]; + std::complex acdd = inarr[getVectorIndex(1, 0, 1, 2)]; + std::complex addd = inarr[getVectorIndex(1, 0, 0, 3)]; + std::complex bcdd = inarr[getVectorIndex(0, 1, 1, 2)]; + std::complex bddd = inarr[getVectorIndex(0, 1, 0, 3)]; + std::complex cddd = inarr[getVectorIndex(0, 0, 1, 3)]; + std::complex abcdd = inarr[getVectorIndex(1, 1, 1, 2)]; + std::complex abddd = inarr[getVectorIndex(1, 1, 0, 3)]; + std::complex acddd = inarr[getVectorIndex(1, 0, 1, 3)]; + std::complex bcddd = inarr[getVectorIndex(0, 1, 1, 3)]; + std::complex abcddd = inarr[getVectorIndex(1, 1, 1, 3)]; + return (-120. * abcddd + 24. * acddd * b + 6. * addd * bc + 12. * add * bcd + 18. * ad * bcdd + + 24. * a * bcddd + 18. * acdd * bd + 12. * acd * bdd + 6. * ac * bddd + 24. * abddd * c - + 6. * addd * b * c - 6. * add * bd * c - 6. * ad * bdd * c - 6. * a * bddd * c + 18. * abdd * cd - + 6. * add * b * cd - 6. * ad * bd * cd - 6. * a * bdd * cd + 12. * abd * cdd - 6. * ad * b * cdd - + 6. * a * bd * cdd + 6. * ab * cddd - 6. * a * b * cddd + 72. * abcdd * d - 18. * acdd * b * d - + 6. * add * bc * d - 12. * ad * bcd * d - 18. * a * bcdd * d - 12. * acd * bd * d - 6. * ac * bdd * d - + 18. * abdd * c * d + 6. * add * b * c * d + 6. * ad * bd * c * d + 6. * a * bdd * c * d - + 12. * abd * cd * d + 6. * ad * b * cd * d + 6. * a * bd * cd * d - 6. * ab * cdd * d + 6. * a * b * cdd * d - + 18. * abcd * d * d + 6. * acd * b * d * d + 3. * ad * bc * d * d + 6. * a * bcd * d * d + + 3. * ac * bd * d * d + 6. * abd * c * d * d - 3. * ad * b * c * d * d - 3. * a * bd * c * d * d + + 3. * ab * cd * d * d - 3. * a * b * cd * d * d + 2. * abc * d * d * d - ac * b * d * d * d - a * bc * d * d * d - + ab * c * d * d * d + a * b * c * d * d * d + 18. * abcd * dd - 6. * acd * b * dd - 3. * ad * bc * dd - + 6. * a * bcd * dd - 3. * ac * bd * dd - 6. * abd * c * dd + 3. * ad * b * c * dd + 3. * a * bd * c * dd - + 3. * ab * cd * dd + 3. * a * b * cd * dd - 6. * abc * d * dd + 3. * ac * b * d * dd + 3. * a * bc * d * dd + + 3. * ab * c * d * dd - 3. * a * b * c * d * dd + 4. * abc * ddd - 2. * ac * b * ddd - 2. * a * bc * ddd - + 2. * ab * c * ddd + 2. * a * b * c * ddd) + .real(); +} +template +double FlowPtContainer::getStdABDDDD(T& inarr) +{ + std::complex a = inarr[getVectorIndex(1, 0, 0, 0)]; + std::complex b = inarr[getVectorIndex(0, 1, 0, 0)]; + std::complex d = inarr[getVectorIndex(0, 0, 0, 1)]; + std::complex ab = inarr[getVectorIndex(1, 1, 0, 0)]; + std::complex ad = inarr[getVectorIndex(1, 0, 0, 1)]; + std::complex bd = inarr[getVectorIndex(0, 1, 0, 1)]; + std::complex dd = inarr[getVectorIndex(0, 0, 0, 2)]; + std::complex abd = inarr[getVectorIndex(1, 1, 0, 1)]; + std::complex add = inarr[getVectorIndex(1, 0, 0, 2)]; + std::complex bdd = inarr[getVectorIndex(0, 1, 0, 2)]; + std::complex ddd = inarr[getVectorIndex(0, 0, 0, 3)]; + std::complex abdd = inarr[getVectorIndex(1, 1, 0, 2)]; + std::complex addd = inarr[getVectorIndex(1, 0, 0, 3)]; + std::complex bddd = inarr[getVectorIndex(0, 1, 0, 3)]; + std::complex dddd = inarr[getVectorIndex(0, 0, 0, 4)]; + std::complex abddd = inarr[getVectorIndex(1, 1, 0, 3)]; + std::complex adddd = inarr[getVectorIndex(1, 0, 0, 4)]; + std::complex bdddd = inarr[getVectorIndex(0, 1, 0, 4)]; + std::complex abdddd = inarr[getVectorIndex(1, 1, 0, 4)]; + return (-120. * abdddd + 24. * adddd * b + 24. * addd * bd + 24. * add * bdd + 24. * ad * bddd + + 24. * a * bdddd + 96. * abddd * d - 24. * addd * b * d - 24. * add * bd * d - 24. * ad * bdd * d - + 24. * a * bddd * d - 36. * abdd * d * d + 12. * add * b * d * d + 12. * ad * bd * d * d + + 12. * a * bdd * d * d + 8. * abd * d * d * d - 4. * ad * b * d * d * d - 4. * a * bd * d * d * d - ab * d * d * d * d + + a * b * d * d * d * d + 36. * abdd * dd - 12. * add * b * dd - 12. * ad * bd * dd - 12. * a * bdd * dd - + 24. * abd * d * dd + 12. * ad * b * d * dd + 12. * a * bd * d * dd + 6. * ab * d * d * dd - + 6. * a * b * d * d * dd - 3. * ab * dd * d + 3. * a * b * dd * d + 16. * abd * ddd - 8. * ad * b * ddd - + 8. * a * bd * ddd - 8. * ab * d * ddd + 8. * a * b * d * ddd + 6. * ab * dddd - 6. * a * b * dddd) + .real(); +} +template +double FlowPtContainer::getStdABCCC(T& inarr) +{ + std::complex a = inarr[getVectorIndex(1, 0, 0, 0)]; + std::complex b = inarr[getVectorIndex(0, 1, 0, 0)]; + std::complex c = inarr[getVectorIndex(0, 0, 1, 0)]; + std::complex ab = inarr[getVectorIndex(1, 1, 0, 0)]; + std::complex ac = inarr[getVectorIndex(1, 0, 1, 0)]; + std::complex bc = inarr[getVectorIndex(0, 1, 1, 0)]; + std::complex cc = inarr[getVectorIndex(0, 0, 2, 0)]; + std::complex abc = inarr[getVectorIndex(1, 1, 1, 0)]; + std::complex acc = inarr[getVectorIndex(1, 0, 2, 0)]; + std::complex bcc = inarr[getVectorIndex(0, 1, 2, 0)]; + std::complex ccc = inarr[getVectorIndex(0, 0, 3, 0)]; + std::complex abcc = inarr[getVectorIndex(1, 1, 2, 0)]; + std::complex accc = inarr[getVectorIndex(1, 0, 3, 0)]; + std::complex bccc = inarr[getVectorIndex(0, 1, 3, 0)]; + std::complex abccc = inarr[getVectorIndex(1, 1, 3, 0)]; + return (24. * abccc - 6. * accc * b - 6. * acc * bc - 6. * ac * bcc - 6. * a * bccc - 18. * abcc * c + + 6. * acc * b * c + 6. * ac * bc * c + 6. * a * bcc * c + 6. * abc * c * c - 3. * ac * b * c * c - + 3. * a * bc * c * c - ab * c * c * c + a * b * c * c * c - 6. * abc * cc + 3. * ac * b * cc + 3. * a * bc * cc + + 3. * ab * c * cc - 3. * a * b * c * cc - 2. * ab * ccc + 2. * a * b * ccc) + .real(); +} +template +double FlowPtContainer::getStdABCCD(T& inarr) +{ + std::complex a = inarr[getVectorIndex(1, 0, 0, 0)]; + std::complex b = inarr[getVectorIndex(0, 1, 0, 0)]; + std::complex c = inarr[getVectorIndex(0, 0, 1, 0)]; + std::complex d = inarr[getVectorIndex(0, 0, 0, 1)]; + std::complex ab = inarr[getVectorIndex(1, 1, 0, 0)]; + std::complex ac = inarr[getVectorIndex(1, 0, 1, 0)]; + std::complex ad = inarr[getVectorIndex(1, 0, 0, 1)]; + std::complex bc = inarr[getVectorIndex(0, 1, 1, 0)]; + std::complex bd = inarr[getVectorIndex(0, 1, 0, 1)]; + std::complex cc = inarr[getVectorIndex(0, 0, 2, 0)]; + std::complex cd = inarr[getVectorIndex(0, 0, 1, 1)]; + std::complex abc = inarr[getVectorIndex(1, 1, 1, 0)]; + std::complex abd = inarr[getVectorIndex(1, 1, 0, 1)]; + std::complex acc = inarr[getVectorIndex(1, 0, 2, 0)]; + std::complex bcc = inarr[getVectorIndex(0, 1, 2, 0)]; + std::complex ccd = inarr[getVectorIndex(0, 0, 2, 1)]; + std::complex acd = inarr[getVectorIndex(1, 0, 1, 1)]; + std::complex bcd = inarr[getVectorIndex(0, 1, 1, 1)]; + std::complex abcc = inarr[getVectorIndex(1, 1, 2, 0)]; + std::complex abcd = inarr[getVectorIndex(1, 1, 1, 1)]; + std::complex accd = inarr[getVectorIndex(1, 0, 2, 1)]; + std::complex bccd = inarr[getVectorIndex(0, 1, 2, 1)]; + std::complex abccd = inarr[getVectorIndex(1, 1, 2, 1)]; + return (24. * abccd - 6. * accd * b - 4. * acd * bc - 2. * ad * bcc - 6. * a * bccd - 4. * ac * bcd - + 2. * acc * bd - 12. * abcd * c + 4. * acd * b * c + 2. * ad * bc * c + 4. * a * bcd * c + + 2. * ac * bd * c + 2. * abd * c * c - ad * b * c * c - a * bd * c * c - 2. * abd * cc + ad * b * cc + + a * bd * cc - 2. * ab * ccd + 2. * a * b * ccd - 4. * abc * cd + 2. * ac * b * cd + 2. * a * bc * cd + + 2. * ab * c * cd - 2. * a * b * c * cd - 6. * abcc * d + 2. * acc * b * d + 2. * ac * bc * d + + 2. * a * bcc * d + 4. * abc * c * d - 2. * ac * b * c * d - 2. * a * bc * c * d - ab * c * c * d + + a * b * c * c * d + ab * cc * d - a * b * cc * d) + .real(); +} +template +double FlowPtContainer::getStdABCDD(T& inarr) +{ + std::complex a = inarr[getVectorIndex(1, 0, 0, 0)]; + std::complex b = inarr[getVectorIndex(0, 1, 0, 0)]; + std::complex c = inarr[getVectorIndex(0, 0, 1, 0)]; + std::complex d = inarr[getVectorIndex(0, 0, 0, 1)]; + std::complex ab = inarr[getVectorIndex(1, 1, 0, 0)]; + std::complex ac = inarr[getVectorIndex(1, 0, 1, 0)]; + std::complex ad = inarr[getVectorIndex(1, 0, 0, 1)]; + std::complex bc = inarr[getVectorIndex(0, 1, 1, 0)]; + std::complex bd = inarr[getVectorIndex(0, 1, 0, 1)]; + std::complex cd = inarr[getVectorIndex(0, 0, 1, 1)]; + std::complex dd = inarr[getVectorIndex(0, 0, 0, 2)]; + std::complex abc = inarr[getVectorIndex(1, 1, 1, 0)]; + std::complex abd = inarr[getVectorIndex(1, 1, 0, 1)]; + std::complex add = inarr[getVectorIndex(1, 0, 0, 2)]; + std::complex bdd = inarr[getVectorIndex(0, 1, 0, 2)]; + std::complex cdd = inarr[getVectorIndex(0, 0, 1, 2)]; + std::complex acd = inarr[getVectorIndex(1, 0, 1, 1)]; + std::complex bcd = inarr[getVectorIndex(0, 1, 1, 1)]; + std::complex abdd = inarr[getVectorIndex(1, 1, 0, 2)]; + std::complex abcd = inarr[getVectorIndex(1, 1, 1, 1)]; + std::complex acdd = inarr[getVectorIndex(1, 0, 1, 2)]; + std::complex bcdd = inarr[getVectorIndex(0, 1, 1, 2)]; + std::complex abcdd = inarr[getVectorIndex(1, 1, 1, 2)]; + return (24. * abcdd - 6. * acdd * b - 2. * add * bc - 4. * ad * bcd - 6. * a * bcdd - 4. * acd * bd - + 2. * ac * bdd - 6. * abdd * c + 2. * add * b * c + 2. * ad * bd * c + 2. * a * bdd * c - 4. * abd * cd + + 2. * ad * b * cd + 2. * a * bd * cd - 2. * ab * cdd + 2. * a * b * cdd - 12. * abcd * d + + 4. * acd * b * d + 2. * ad * bc * d + 4. * a * bcd * d + 2. * ac * bd * d + 4. * abd * c * d - + 2. * ad * b * c * d - 2. * a * bd * c * d + 2. * ab * cd * d - 2. * a * b * cd * d + 2. * abc * d * d - + ac * b * d * d - a * bc * d * d - ab * c * d * d + a * b * c * d * d - 2. * abc * dd + ac * b * dd + + a * bc * dd + ab * c * dd - a * b * c * dd) + .real(); +} +template +double FlowPtContainer::getStdABDDD(T& inarr) +{ + std::complex a = inarr[getVectorIndex(1, 0, 0, 0)]; + std::complex b = inarr[getVectorIndex(0, 1, 0, 0)]; + std::complex d = inarr[getVectorIndex(0, 0, 0, 1)]; + std::complex ab = inarr[getVectorIndex(1, 1, 0, 0)]; + std::complex ad = inarr[getVectorIndex(1, 0, 0, 1)]; + std::complex bd = inarr[getVectorIndex(0, 1, 0, 1)]; + std::complex dd = inarr[getVectorIndex(0, 0, 0, 2)]; + std::complex abd = inarr[getVectorIndex(1, 1, 0, 1)]; + std::complex add = inarr[getVectorIndex(1, 0, 0, 2)]; + std::complex bdd = inarr[getVectorIndex(0, 1, 0, 2)]; + std::complex ddd = inarr[getVectorIndex(0, 0, 0, 3)]; + std::complex abdd = inarr[getVectorIndex(1, 1, 0, 2)]; + std::complex addd = inarr[getVectorIndex(1, 0, 0, 3)]; + std::complex bddd = inarr[getVectorIndex(0, 1, 0, 3)]; + std::complex abddd = inarr[getVectorIndex(1, 1, 0, 3)]; + return (24. * abddd - 6. * addd * b - 6. * add * bd - 6. * ad * bdd - 6. * a * bddd - 18. * abdd * d + + 6. * add * b * d + 6. * ad * bd * d + 6. * a * bdd * d + 6. * abd * d * d - 3. * ad * b * d * d - + 3. * a * bd * d * d - ab * d * d * d + a * b * d * d * d - 6. * abd * dd + 3. * ad * b * dd + 3. * a * bd * dd + + 3. * ab * d * dd - 3. * a * b * d * dd - 2. * ab * ddd + 2. * a * b * ddd) + .real(); +} double FlowPtContainer::orderedAddition(std::vector vec) { double sum = 0; diff --git a/PWGCF/GenericFramework/Core/FlowPtContainer.h b/PWGCF/GenericFramework/Core/FlowPtContainer.h index 551bcf011c8..207e1a36fe7 100644 --- a/PWGCF/GenericFramework/Core/FlowPtContainer.h +++ b/PWGCF/GenericFramework/Core/FlowPtContainer.h @@ -53,7 +53,7 @@ class FlowPtContainer : public TNamed void fill(const double& w, const double& pt); void fillArray(FillType a, FillType b, double c, double d); int getVectorIndex(const int i, const int j) { return j * (mpar + 1) + i; } // index for 2d array for storing pt correlations - int getVectorIndex(const int i, const int j, const int k, const int l) { return i + j * 3 + k * 3 * 3 + l * 3 * 3 * 3; } // index for 4d array for std vnpt correlation - size 3x3x3x3 + int getVectorIndex(const int i, const int j, const int k, const int l) { return i + j * 3 + k * 3 * 3 + l * 3 * 3 * 5; } // index for 4d array for std vnpt correlation - size 3x3x3x3 void calculateCorrelations(); void calculateCMTerms(); void fillPtProfiles(const double& lMult, const double& rn); @@ -104,9 +104,9 @@ class FlowPtContainer : public TNamed cmDen.clear(); fillCounter = 0; arr.clear(); - arr.resize(3 * 3 * 3 * 3, {0.0, 0.0}); + arr.resize(3 * 3 * 5 * 5, {0.0, 0.0}); warr.clear(); - warr.resize(3 * 3 * 3 * 3, 0.0); + warr.resize(3 * 3 * 5 * 5, 0.0); }; TList* fCMTermList; @@ -149,6 +149,24 @@ class FlowPtContainer : public TNamed double getStdABC(T& inarr); template double getStdABD(T& inarr); + template + double getStdABCCCC(T& inarr); + template + double getStdABCCCD(T& inarr); + template + double getStdABCCDD(T& inarr); + template + double getStdABCDDD(T& inarr); + template + double getStdABDDDD(T& inarr); + template + double getStdABCCC(T& inarr); + template + double getStdABCCD(T& inarr); + template + double getStdABCDD(T& inarr); + template + double getStdABDDD(T& inarr); private: static constexpr float FactorialArray[9] = {1., 1., 2., 6., 24., 120., 720., 5040., 40320.}; From 1f5ffe9ca8dec704af9d9ca3173c4090f854f031 Mon Sep 17 00:00:00 2001 From: NNicassio99 <140729099+NNicassio99@users.noreply.github.com> Date: Fri, 2 May 2025 08:44:07 +0200 Subject: [PATCH 1149/1650] [ALICE3] Update OTF RICH PID (#11041) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Parameter updates should be done correctly according to .json input. - Added a new function for analytic calculation of ring angular resolution sector-by-sector. - Included the possibility to have different aerogel refractive index for the different modules. Co-authored-by: Nicola Nicassio Co-authored-by: Nicolò Jacazio --- ALICE3/TableProducer/OTF/onTheFlyRICHPID.cxx | 416 ++++++++++++++++--- 1 file changed, 358 insertions(+), 58 deletions(-) diff --git a/ALICE3/TableProducer/OTF/onTheFlyRICHPID.cxx b/ALICE3/TableProducer/OTF/onTheFlyRICHPID.cxx index af6024f3afd..42a0fbbc277 100644 --- a/ALICE3/TableProducer/OTF/onTheFlyRICHPID.cxx +++ b/ALICE3/TableProducer/OTF/onTheFlyRICHPID.cxx @@ -60,11 +60,13 @@ /// Since angular resolution depends on the specific geometric details, it is better to /// calculate it from full simulation and add new input. Alternatively, an analytical /// expression can be provided as a function of the main parameters. +/// Latest version: analytical parametrization of angular resolution !!! /// /// \author David Dobrigkeit Chinellato, UNICAMP, Nicola Nicassio, University and INFN Bari using namespace o2; using namespace o2::framework; +using namespace o2::constants::math; struct OnTheFlyRichPid { Produces upgradeRich; @@ -96,6 +98,50 @@ struct OnTheFlyRichPid { Configurable flagIncludeTrackAngularRes{"flagIncludeTrackAngularRes", true, "flag to include or exclude track time resolution"}; Configurable multiplicityEtaRange{"multiplicityEtaRange", 0.800000012, "eta range to compute the multiplicity"}; Configurable flagRICHLoadDelphesLUTs{"flagRICHLoadDelphesLUTs", false, "flag to load Delphes LUTs for tracking correction (use recoTrack parameters if false)"}; + /*Configurable bRichRefractiveIndexSector0AndNMinus1{"bRichRefractiveIndexSector0AndMinus1", 1.03, "barrel RICH refractive index sector 0 and N-1"}; + Configurable bRichRefractiveIndexSector1AndNMinus2{"bRichRefractiveIndexSector1AndMinus2", 1.03, "barrel RICH refractive index sector 1 and N-2"}; + Configurable bRichRefractiveIndexSector2AndNMinus3{"bRichRefractiveIndexSector2AndMinus3", 1.03, "barrel RICH refractive index sector 2 and N-3"}; + Configurable bRichRefractiveIndexSector3AndNMinus4{"bRichRefractiveIndexSector3AndMinus4", 1.03, "barrel RICH refractive index sector 3 and N-4"}; + Configurable bRichRefractiveIndexSector4AndNMinus5{"bRichRefractiveIndexSector4AndMinus5", 1.03, "barrel RICH refractive index sector 4 and N-5"}; + Configurable bRichRefractiveIndexSector5AndNMinus6{"bRichRefractiveIndexSector5AndMinus6", 1.03, "barrel RICH refractive index sector 5 and N-6"}; + Configurable bRichRefractiveIndexSector6AndNMinus7{"bRichRefractiveIndexSector6AndMinus7", 1.03, "barrel RICH refractive index sector 6 and N-7"}; + Configurable bRichRefractiveIndexSector7AndNMinus8{"bRichRefractiveIndexSector7AndMinus8", 1.03, "barrel RICH refractive index sector 7 and N-8"}; + Configurable bRichRefractiveIndexSector8AndNMinus9{"bRichRefractiveIndexSector8AndMinus9", 1.03, "barrel RICH refractive index sector 8 and N-9"}; + Configurable bRichRefractiveIndexSector9AndNMinus10{"bRichRefractiveIndexSector9AndMinus10", 1.03, "barrel RICH refractive index sector 9 and N-10"}; + Configurable bRichRefractiveIndexSector10AndNMinus11{"bRichRefractiveIndexSector10AndMinus11", 1.03, "barrel RICH refractive index sector 10 and N-11"}; + Configurable bRichRefractiveIndexSector11AndNMinus12{"bRichRefractiveIndexSector11AndMinus12", 1.03, "barrel RICH refractive index sector 11 and N-12"}; + Configurable bRichRefractiveIndexSector12AndNMinus13{"bRichRefractiveIndexSector12AndMinus13", 1.03, "barrel RICH refractive index sector 12 and N-13"}; + Configurable bRichRefractiveIndexSector13AndNMinus14{"bRichRefractiveIndexSector13AndMinus14", 1.03, "barrel RICH refractive index sector 13 and N-14"}; + Configurable bRichRefractiveIndexSector14AndNMinus15{"bRichRefractiveIndexSector14AndMinus15", 1.03, "barrel RICH refractive index sector 14 and N-15"}; + Configurable bRichRefractiveIndexSector15AndNMinus16{"bRichRefractiveIndexSector15AndMinus16", 1.03, "barrel RICH refractive index sector 15 and N-16"}; + Configurable bRichRefractiveIndexSector16AndNMinus17{"bRichRefractiveIndexSector16AndMinus17", 1.03, "barrel RICH refractive index sector 16 and N-17"}; + Configurable bRichRefractiveIndexSector17AndNMinus18{"bRichRefractiveIndexSector17AndMinus18", 1.03, "barrel RICH refractive index sector 17 and N-18"}; + Configurable bRichRefractiveIndexSector18AndNMinus19{"bRichRefractiveIndexSector18AndMinus19", 1.03, "barrel RICH refractive index sector 18 and N-19"}; + Configurable bRichRefractiveIndexSector19AndNMinus20{"bRichRefractiveIndexSector19AndMinus20", 1.03, "barrel RICH refractive index sector 19 and N-20"}; + Configurable bRichRefractiveIndexSector20AndNMinus21{"bRichRefractiveIndexSector20AndMinus21", 1.03, "barrel RICH refractive index sector 20 and N-21"};*/ + Configurable bRichRefractiveIndexSector0{"bRichRefractiveIndexSector0", 1.03, "barrel RICH refractive index central(s)"}; // central(s) + Configurable bRichRefractiveIndexSector1{"bRichRefractiveIndexSector1", 1.03, "barrel RICH refractive index central(s)-1 and central(s)+1"}; // central(s)-1 and central(s)+1 + Configurable bRichRefractiveIndexSector2{"bRichRefractiveIndexSector2", 1.03, "barrel RICH refractive index central(s)-2 and central(s)+2"}; // central(s)-2 and central(s)+2 + Configurable bRichRefractiveIndexSector3{"bRichRefractiveIndexSector3", 1.03, "barrel RICH refractive index central(s)-3 and central(s)+3"}; // central(s)-3 and central(s)+3 + Configurable bRichRefractiveIndexSector4{"bRichRefractiveIndexSector4", 1.03, "barrel RICH refractive index central(s)-4 and central(s)+4"}; // central(s)-4 and central(s)+4 + Configurable bRichRefractiveIndexSector5{"bRichRefractiveIndexSector5", 1.03, "barrel RICH refractive index central(s)-5 and central(s)+5"}; // central(s)-5 and central(s)+5 + Configurable bRichRefractiveIndexSector6{"bRichRefractiveIndexSector6", 1.03, "barrel RICH refractive index central(s)-6 and central(s)+6"}; // central(s)-6 and central(s)+6 + Configurable bRichRefractiveIndexSector7{"bRichRefractiveIndexSector7", 1.03, "barrel RICH refractive index central(s)-7 and central(s)+7"}; // central(s)-7 and central(s)+7 + Configurable bRichRefractiveIndexSector8{"bRichRefractiveIndexSector8", 1.03, "barrel RICH refractive index central(s)-8 and central(s)+8"}; // central(s)-8 and central(s)+8 + Configurable bRichRefractiveIndexSector9{"bRichRefractiveIndexSector9", 1.03, "barrel RICH refractive index central(s)-9 and central(s)+9"}; // central(s)-9 and central(s)+9 + Configurable bRichRefractiveIndexSector10{"bRichRefractiveIndexSector10", 1.03, "barrel RICH refractive index central(s)-10 and central(s)+10"}; // central(s)-10 and central(s)+10 + Configurable bRichRefractiveIndexSector11{"bRichRefractiveIndexSector11", 1.03, "barrel RICH refractive index central(s)-11 and central(s)+11"}; // central(s)-11 and central(s)+11 + Configurable bRichRefractiveIndexSector12{"bRichRefractiveIndexSector12", 1.03, "barrel RICH refractive index central(s)-12 and central(s)+12"}; // central(s)-12 and central(s)+12 + Configurable bRichRefractiveIndexSector13{"bRichRefractiveIndexSector13", 1.03, "barrel RICH refractive index central(s)-13 and central(s)+13"}; // central(s)-13 and central(s)+13 + Configurable bRichRefractiveIndexSector14{"bRichRefractiveIndexSector14", 1.03, "barrel RICH refractive index central(s)-14 and central(s)+14"}; // central(s)-14 and central(s)+14 + Configurable bRichRefractiveIndexSector15{"bRichRefractiveIndexSector15", 1.03, "barrel RICH refractive index central(s)-15 and central(s)+15"}; // central(s)-15 and central(s)+15 + Configurable bRichRefractiveIndexSector16{"bRichRefractiveIndexSector16", 1.03, "barrel RICH refractive index central(s)-16 and central(s)+16"}; // central(s)-16 and central(s)+16 + Configurable bRichRefractiveIndexSector17{"bRichRefractiveIndexSector17", 1.03, "barrel RICH refractive index central(s)-17 and central(s)+17"}; // central(s)-17 and central(s)+17 + Configurable bRichRefractiveIndexSector18{"bRichRefractiveIndexSector18", 1.03, "barrel RICH refractive index central(s)-18 and central(s)+18"}; // central(s)-18 and central(s)+18 + Configurable bRichRefractiveIndexSector19{"bRichRefractiveIndexSector19", 1.03, "barrel RICH refractive index central(s)-19 and central(s)+19"}; // central(s)-19 and central(s)+19 + Configurable bRichRefractiveIndexSector20{"bRichRefractiveIndexSector20", 1.03, "barrel RICH refractive index central(s)-20 and central(s)+20"}; // central(s)-20 and central(s)+20 + Configurable bRICHPixelSize{"bRICHPixelSize", 0.1, "barrel RICH pixel size (cm)"}; + Configurable bRichGapRefractiveIndex{"bRichGapRefractiveIndex", 1.000283, "barrel RICH gap refractive index"}; Configurable lutEl{"lutEl", "lutCovm.el.dat", "LUT for electrons"}; Configurable lutMu{"lutMu", "lutCovm.mu.dat", "LUT for muons"}; @@ -114,7 +160,7 @@ struct OnTheFlyRichPid { // for handling basic QA histograms if requested HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; - /// Flag unphysical and unavailable values + /// Flag unphysical and unavailable values (must be negative) float error_value = -1000; // Variables projective/hybrid layout @@ -129,16 +175,29 @@ struct OnTheFlyRichPid { std::vector angle_centers; std::vector theta_min; std::vector theta_max; + std::vector bRichRefractiveIndexSector; + std::vector aerogel_rindex; + std::vector photodetrctor_length; + std::vector gap_thickness; // Update projective geometry void updateProjectiveParameters() { + mNumberSectors = bRichNumberOfSectors; + mTileLength = bRichPhotodetectorOtherModuleLength; + mTileLengthCentral = bRichPhotodetectorCentralModuleHalfLength; + mProjectiveLengthInner = mTileLengthCentral; + mRadiusProjIn = bRichRadiatorInnerRadius; + mRadiusProjOut = bRichPhotodetectorOuterRadius; const int number_of_sectors_in_z = mNumberSectors; det_centers.resize(number_of_sectors_in_z); rad_centers.resize(number_of_sectors_in_z); angle_centers.resize(number_of_sectors_in_z); theta_min.resize(number_of_sectors_in_z); theta_max.resize(number_of_sectors_in_z); + aerogel_rindex.resize(number_of_sectors_in_z); + photodetrctor_length.resize(number_of_sectors_in_z); + gap_thickness.resize(number_of_sectors_in_z); float square_size_barrel_cylinder = 2.0 * mTileLengthCentral; float square_size_z = mTileLength; float R_min = mRadiusProjIn; @@ -156,43 +215,83 @@ struct OnTheFlyRichPid { l_aerogel_z.resize(number_of_sectors_in_z); l_detector_z.resize(number_of_sectors_in_z); - // Central sector - int i_central_mirror = static_cast((number_of_sectors_in_z) / 2.0); - float m_val = std::tan(0.0); - theta_bi[i_central_mirror] = std::atan(m_val); - R0_tilt[i_central_mirror] = R_max; - z0_tilt[i_central_mirror] = R0_tilt[i_central_mirror] * std::tan(theta_bi[i_central_mirror]); - l_detector_z[i_central_mirror] = square_size_barrel_cylinder; - l_aerogel_z[i_central_mirror] = std::sqrt(1.0 + m_val * m_val) * R_min * square_size_barrel_cylinder / (std::sqrt(1.0 + m_val * m_val) * R_max - m_val * square_size_barrel_cylinder); - T_r_plus_g[i_central_mirror] = R_max - R_min; - float t = std::tan(atan(m_val) + std::atan(square_size_barrel_cylinder / (2.0 * R_max * std::sqrt(1.0 + m_val * m_val) - square_size_barrel_cylinder * m_val))); - theta_max[i_central_mirror] = M_PI / 2.0 - std::atan(t); - theta_min[i_central_mirror] = M_PI / 2.0 + std::atan(t); - mProjectiveLengthInner = R_min * t; - for (int i = static_cast((number_of_sectors_in_z) / 2.0) + 1; i < number_of_sectors_in_z; i++) { - float par_a = t; - float par_b = 2.0 * R_max / square_size_z; - m_val = (std::sqrt(par_a * par_a * par_b * par_b + par_b * par_b - 1.0) + par_a * par_b * par_b) / (par_b * par_b - 1.0); - theta_min[i] = M_PI / 2.0 - std::atan(t); - theta_max[2 * i_central_mirror - i] = M_PI / 2.0 + std::atan(t); - t = std::tan(std::atan(m_val) + std::atan(square_size_z / (2.0 * R_max * std::sqrt(1.0 + m_val * m_val) - square_size_z * m_val))); - theta_max[i] = M_PI / 2.0 - std::atan(t); - theta_min[2 * i_central_mirror - i] = M_PI / 2.0 + std::atan(t); - // Forward sectors - theta_bi[i] = std::atan(m_val); - R0_tilt[i] = R_max - square_size_z / 2.0 * std::sin(std::atan(m_val)); - z0_tilt[i] = R0_tilt[i] * std::tan(theta_bi[i]); - l_detector_z[i] = square_size_z; - l_aerogel_z[i] = std::sqrt(1.0 + m_val * m_val) * R_min * square_size_z / (std::sqrt(1.0 + m_val * m_val) * R_max - m_val * square_size_z); - T_r_plus_g[i] = std::sqrt(1.0 + m_val * m_val) * (R_max - R_min) - m_val / 2.0 * (square_size_z + l_aerogel_z[i]); - // Backword sectors - theta_bi[2 * i_central_mirror - i] = -std::atan(m_val); - R0_tilt[2 * i_central_mirror - i] = R_max - square_size_z / 2.0 * std::sin(std::atan(m_val)); - z0_tilt[2 * i_central_mirror - i] = -R0_tilt[i] * std::tan(theta_bi[i]); - l_detector_z[2 * i_central_mirror - i] = square_size_z; - l_aerogel_z[2 * i_central_mirror - i] = std::sqrt(1.0 + m_val * m_val) * R_min * square_size_z / (std::sqrt(1.0 + m_val * m_val) * R_max - m_val * square_size_z); - T_r_plus_g[2 * i_central_mirror - i] = std::sqrt(1.0 + m_val * m_val) * (R_max - R_min) - m_val / 2.0 * (square_size_z + l_aerogel_z[i]); - mProjectiveLengthInner = R_min * t; // <-- At the end of the loop this will be the maximum Z + // Odd number of sectors + if (number_of_sectors_in_z % 2 != 0) { + int i_central_mirror = static_cast((number_of_sectors_in_z) / 2.0); + float m_val = std::tan(0.0); + theta_bi[i_central_mirror] = std::atan(m_val); + R0_tilt[i_central_mirror] = R_max; + z0_tilt[i_central_mirror] = R0_tilt[i_central_mirror] * std::tan(theta_bi[i_central_mirror]); + l_detector_z[i_central_mirror] = square_size_barrel_cylinder; + l_aerogel_z[i_central_mirror] = std::sqrt(1.0 + m_val * m_val) * R_min * square_size_barrel_cylinder / (std::sqrt(1.0 + m_val * m_val) * R_max - m_val * square_size_barrel_cylinder); + T_r_plus_g[i_central_mirror] = R_max - R_min; + float t = std::tan(std::atan(m_val) + std::atan(square_size_barrel_cylinder / (2.0 * R_max * std::sqrt(1.0 + m_val * m_val) - square_size_barrel_cylinder * m_val))); + theta_max[i_central_mirror] = M_PI / 2.0 - std::atan(t); + theta_min[i_central_mirror] = M_PI / 2.0 + std::atan(t); + mProjectiveLengthInner = R_min * t; + aerogel_rindex[i_central_mirror] = bRichRefractiveIndexSector[0]; + for (int i = i_central_mirror + 1; i < number_of_sectors_in_z; i++) { + float par_a = t; + float par_b = 2.0 * R_max / square_size_z; + m_val = (std::sqrt(par_a * par_a * par_b * par_b + par_b * par_b - 1.0) + par_a * par_b * par_b) / (par_b * par_b - 1.0); + theta_min[i] = M_PI / 2.0 - std::atan(t); + theta_max[2 * i_central_mirror - i] = M_PI / 2.0 + std::atan(t); + t = std::tan(std::atan(m_val) + std::atan(square_size_z / (2.0 * R_max * std::sqrt(1.0 + m_val * m_val) - square_size_z * m_val))); + theta_max[i] = M_PI / 2.0 - std::atan(t); + theta_min[2 * i_central_mirror - i] = M_PI / 2.0 + std::atan(t); + // Forward sectors + theta_bi[i] = std::atan(m_val); + R0_tilt[i] = R_max - square_size_z / 2.0 * std::sin(std::atan(m_val)); + z0_tilt[i] = R0_tilt[i] * std::tan(theta_bi[i]); + l_detector_z[i] = square_size_z; + l_aerogel_z[i] = std::sqrt(1.0 + m_val * m_val) * R_min * square_size_z / (std::sqrt(1.0 + m_val * m_val) * R_max - m_val * square_size_z); + T_r_plus_g[i] = std::sqrt(1.0 + m_val * m_val) * (R_max - R_min) - m_val / 2.0 * (square_size_z + l_aerogel_z[i]); + aerogel_rindex[i] = bRichRefractiveIndexSector[i - i_central_mirror]; + // Backword sectors + theta_bi[2 * i_central_mirror - i] = -std::atan(m_val); + R0_tilt[2 * i_central_mirror - i] = R_max - square_size_z / 2.0 * std::sin(std::atan(m_val)); + z0_tilt[2 * i_central_mirror - i] = -R0_tilt[i] * std::tan(theta_bi[i]); + l_detector_z[2 * i_central_mirror - i] = square_size_z; + l_aerogel_z[2 * i_central_mirror - i] = std::sqrt(1.0 + m_val * m_val) * R_min * square_size_z / (std::sqrt(1.0 + m_val * m_val) * R_max - m_val * square_size_z); + T_r_plus_g[2 * i_central_mirror - i] = std::sqrt(1.0 + m_val * m_val) * (R_max - R_min) - m_val / 2.0 * (square_size_z + l_aerogel_z[i]); + aerogel_rindex[2 * i_central_mirror - i] = bRichRefractiveIndexSector[i - i_central_mirror]; + mProjectiveLengthInner = R_min * t; // <-- At the end of the loop this will be the maximum Z + } + } + // Even number of sectors + else { + float two_half_gap = 1.0; + int i_central_mirror = static_cast((number_of_sectors_in_z) / 2.0); + float m_val = std::tan(0.0); + float t = std::tan(std::atan(m_val) + std::atan(two_half_gap / (2.0 * R_max * std::sqrt(1.0 + m_val * m_val) - two_half_gap * m_val))); + mProjectiveLengthInner = R_min * t; + for (int i = i_central_mirror; i < number_of_sectors_in_z; i++) { + float par_a = t; + float par_b = 2.0 * R_max / square_size_z; + m_val = (std::sqrt(par_a * par_a * par_b * par_b + par_b * par_b - 1.0) + par_a * par_b * par_b) / (par_b * par_b - 1.0); + theta_min[i] = M_PI / 2.0 - std::atan(t); + theta_max[2 * i_central_mirror - i - 1] = M_PI / 2.0 + std::atan(t); + t = std::tan(std::atan(m_val) + std::atan(square_size_z / (2.0 * R_max * std::sqrt(1.0 + m_val * m_val) - square_size_z * m_val))); + theta_max[i] = M_PI / 2.0 - std::atan(t); + theta_min[2 * i_central_mirror - i - 1] = M_PI / 2.0 + std::atan(t); + // Forward sectors + theta_bi[i] = std::atan(m_val); + R0_tilt[i] = R_max - square_size_z / 2.0 * std::sin(std::atan(m_val)); + z0_tilt[i] = R0_tilt[i] * std::tan(theta_bi[i]); + l_detector_z[i] = square_size_z; + l_aerogel_z[i] = std::sqrt(1.0 + m_val * m_val) * R_min * square_size_z / (std::sqrt(1.0 + m_val * m_val) * R_max - m_val * square_size_z); + T_r_plus_g[i] = std::sqrt(1.0 + m_val * m_val) * (R_max - R_min) - m_val / 2.0 * (square_size_z + l_aerogel_z[i]); + aerogel_rindex[i] = bRichRefractiveIndexSector[i - i_central_mirror]; + // Backword sectors + theta_bi[2 * i_central_mirror - i - 1] = -std::atan(m_val); + R0_tilt[2 * i_central_mirror - i - 1] = R_max - square_size_z / 2.0 * std::sin(std::atan(m_val)); + z0_tilt[2 * i_central_mirror - i - 1] = -R0_tilt[i] * std::tan(theta_bi[i]); + l_detector_z[2 * i_central_mirror - i - 1] = square_size_z; + l_aerogel_z[2 * i_central_mirror - i - 1] = std::sqrt(1.0 + m_val * m_val) * R_min * square_size_z / (std::sqrt(1.0 + m_val * m_val) * R_max - m_val * square_size_z); + T_r_plus_g[2 * i_central_mirror - i - 1] = std::sqrt(1.0 + m_val * m_val) * (R_max - R_min) - m_val / 2.0 * (square_size_z + l_aerogel_z[i]); + aerogel_rindex[2 * i_central_mirror - i - 1] = bRichRefractiveIndexSector[i - i_central_mirror]; + mProjectiveLengthInner = R_min * t; // <-- At the end of the loop this will be the maximum Z + } } // Coordinate radiali layer considerati std::vector R0_detector; @@ -200,15 +299,23 @@ struct OnTheFlyRichPid { R0_detector.resize(number_of_sectors_in_z); R0_aerogel.resize(number_of_sectors_in_z); for (int i = 0; i < number_of_sectors_in_z; i++) { - R0_detector[i] = R0_tilt[i]; + R0_detector[i] = R0_tilt[i]; // + (detector_thickness / 2.0) * std::cos(theta_bi[i]) NEGLIGIBLE det_centers[i].SetXYZ(R0_detector[i], 0, R0_detector[i] * std::tan(theta_bi[i])); - R0_aerogel[i] = R0_tilt[i] - (T_r_plus_g[i]) * std::cos(theta_bi[i]); + R0_aerogel[i] = R0_tilt[i] - (T_r_plus_g[i] - bRichRadiatorThickness / 2.0) * std::cos(theta_bi[i]); rad_centers[i].SetXYZ(R0_aerogel[i], 0, R0_aerogel[i] * std::tan(theta_bi[i])); angle_centers[i] = theta_bi[i]; + photodetrctor_length[i] = l_detector_z[i]; + gap_thickness[i] = (det_centers[i] - rad_centers[i]).Mag() - bRichRadiatorThickness / 2.0; } + // DEBUG + // std::cout << std::endl << std::endl; + // for (int i = 0; i < number_of_sectors_in_z; i++) { + // std::cout << "Sector " << i << ": Gap = " << gap_thickness[i] << " cm, Index aerogel = " << aerogel_rindex[i] << ", Gap thickness = " << gap_thickness[i] << " cm" << std::endl; + // } + // std::cout << std::endl << std::endl; } - void init(o2::framework::InitContext&) + void init(o2::framework::InitContext& /*initContext*/) { pRandomNumberGenerator.SetSeed(0); // fully randomize @@ -243,7 +350,14 @@ struct OnTheFlyRichPid { if (doQAplots) { const AxisSpec axisMomentum{static_cast(nBinsP), 0.0f, +20.0f, "#it{p} (GeV/#it{c})"}; const AxisSpec axisAngle{static_cast(nBinsThetaRing), 0.0f, +0.30f, "Measured Cherenkov angle (rad)"}; + const AxisSpec axisEta{static_cast(nBinsEta), -2.0f, +2.0f, "#eta"}; + const AxisSpec axisSector{static_cast(bRichNumberOfSectors), -0.5f, static_cast(bRichNumberOfSectors) - 0.5f, "Sector ID number"}; + const AxisSpec axisRingAngularResolution{static_cast(nBinsAngularRes), 0.0f, +5.0f, "Ring angular resolution - rec. only (mrad)"}; histos.add("h2dAngleVsMomentumBarrelRICH", "h2dAngleVsMomentumBarrelRICH", kTH2F, {axisMomentum, axisAngle}); + histos.add("h2dAngleVsEtaBarrelRICH", "h2dAngleVsEtaBarrelRICH", kTH2F, {axisEta, axisAngle}); + histos.add("h2dAngularResolutionVsMomentumBarrelRICH", "h2dAngularResolutionVsMomentumBarrelRICH", kTH2F, {axisMomentum, axisRingAngularResolution}); + histos.add("h2dAngularResolutionVsEtaBarrelRICH", "h2dAngularResolutionVsEtaBarrelRICH", kTH2F, {axisEta, axisRingAngularResolution}); + histos.add("hSectorID", "hSectorID", kTH1F, {axisSector}); std::string particle_names1[5] = {"#it{e}", "#it{#mu}", "#it{#pi}", "#it{K}", "#it{p}"}; std::string particle_names2[5] = {"Elec", "Muon", "Pion", "Kaon", "Prot"}; @@ -268,6 +382,49 @@ struct OnTheFlyRichPid { } } } + // Load all sector refractive indices + /*bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector0AndNMinus1); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector1AndNMinus2); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector2AndNMinus3); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector3AndNMinus4); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector4AndNMinus5); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector5AndNMinus6); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector6AndNMinus7); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector7AndNMinus8); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector8AndNMinus9); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector9AndNMinus10); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector10AndNMinus11); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector11AndNMinus12); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector12AndNMinus13); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector13AndNMinus14); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector14AndNMinus15); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector15AndNMinus16); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector16AndNMinus17); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector17AndNMinus18); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector18AndNMinus19); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector19AndNMinus20); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector20AndNMinus21);*/ + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector0); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector1); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector2); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector3); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector4); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector5); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector6); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector7); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector8); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector9); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector10); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector11); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector12); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector13); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector14); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector15); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector16); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector17); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector18); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector19); + bRichRefractiveIndexSector.push_back(bRichRefractiveIndexSector20); // Update projective parameters updateProjectiveParameters(); @@ -322,20 +479,26 @@ struct OnTheFlyRichPid { } } - /// returns radiator radius in cm at considered eta (accounting for sector inclination) + /// returns sector hit by the track (if any), -1 otherwise /// \param eta the pseudorapidity of the tarck (assuming primary vertex at origin) - float radiusRipple(float eta) + int findSector(float eta) { float polar = 2.0 * std::atan(std::exp(-eta)); - float i_sector = 0; - bool flag_sector = false; for (int j_sec = 0; j_sec < mNumberSectors; j_sec++) { if (polar > theta_max[j_sec] && polar < theta_min[j_sec]) { - flag_sector = true; - i_sector = j_sec; + return j_sec; } } - if (flag_sector) { + return -1; + } + + /// returns radiator radius in cm at considered eta (accounting for sector inclination) + /// \param eta the pseudorapidity of the tarck (assuming primary vertex at origin) + /// \param i_sector the index of the track RICH sector + float radiusRipple(float eta, int i_sector) + { + float polar = 2.0 * std::atan(std::exp(-eta)); + if (i_sector > 0) { float R_sec_rich = rad_centers[i_sector].X(); float z_sec_rich = rad_centers[i_sector].Z(); return (std::pow(R_sec_rich, 2) + std::pow(z_sec_rich, 2)) / (R_sec_rich + z_sec_rich / std::tan(polar)); @@ -347,12 +510,13 @@ struct OnTheFlyRichPid { /// returns Cherenkov angle in rad (above threshold) or bad flag (below threshold) /// \param momentum the momentum of the tarck /// \param mass the mass of the particle - float CherenkovAngle(float momentum, float mass) + /// \param n the refractive index of the considered sector + float CherenkovAngle(float momentum, float mass, float n) { // Check if particle is above the threshold - if (momentum > mass / std::sqrt(bRichRefractiveIndex * bRichRefractiveIndex - 1.0)) { + if (momentum > mass / std::sqrt(n * n - 1.0)) { // Calculate angle - float angle = std::acos(std::sqrt(momentum * momentum + mass * mass) / (momentum * bRichRefractiveIndex)); + float angle = std::acos(std::sqrt(momentum * momentum + mass * mass) / (momentum * n)); // Mean number of detected photons (SiPM PDE is accountd in multiplicative factor!!!) float meanNumberofDetectedPhotons = 230. * std::sin(angle) * std::sin(angle) * bRichRadiatorThickness; @@ -409,6 +573,127 @@ struct OnTheFlyRichPid { } } + /// To account border effects in bRICH + /// Approximation for analytic calculation: track along projective sector normal (reasonable) + /// \param eta the pseudorapidity of the tarck (assuming primary vertex at origin) + /// \param tile_z_length the Z-length of the photodetector plane of the considered sector + /// \param radius the nominal radius of the Cherenkov ring + float fractionPhotonsProjectiveRICH(float eta, float tile_z_length, float radius) + { + float polar = 2.0 * std::atan(std::exp(-eta)); + int i_sector = 0; + bool flag_sector = false; + for (int j_sec = 0; j_sec < mNumberSectors; j_sec++) { + if (polar > theta_max[j_sec] && polar < theta_min[j_sec]) { + flag_sector = true; + i_sector = j_sec; + } + } + if (flag_sector == false) { + return error_value; // <-- Returning negative value + } + float R_sec_rich = rad_centers[i_sector].X(); + float z_sec_rich = rad_centers[i_sector].Z(); + // float R_sec_tof = det_centers[i_sector].X(); + // float z_sec_tof = det_centers[i_sector].Z(); + float radius_ripple = (std::pow(R_sec_rich, 2) + std::pow(z_sec_rich, 2)) / (R_sec_rich + z_sec_rich / std::tan(polar)); + float z_ripple = radius_ripple / std::tan(polar); + float absZ = std::hypot(radius_ripple - R_sec_rich, z_ripple - z_sec_rich); + float fraction = 1.; + if (tile_z_length / 2. - absZ < radius) { + fraction = fraction - (1. / M_PI) * std::acos((tile_z_length / 2. - absZ) / radius); + if (tile_z_length / 2. + absZ < radius) { + fraction = fraction - (1. / M_PI) * std::acos((tile_z_length / 2. + absZ) / radius); + } + } + return fraction; + } + + /// returns refined ring angular resolution + /// \param eta the pseudorapidity of the tarck (assuming primary vertex at origin) + /// \param n the refractive index of the considered sector + /// \param n_g the refractive index of the gas filling the RICH proximity gap + /// \param T_r the radiator thickness in cm + /// \param T_g the proximity gap thickness of the considered sector in cm + /// \param pixel_size the SiPM pixel size in cm + /// \param theta_c the Cherenkov angle for the considered track + /// \param tile_z_length the Z-length of the photodetector plane of the considered sector + float extract_ring_angular_resolution(float eta, float n, float n_g, float T_r, float T_g, float pixel_size, float theta_c, float tile_z_length) + { + // Check if input angle is error value + if (theta_c <= error_value + 1) + return error_value; + // Parametrization variables (notation from https://doi.org/10.1016/0168-9002(94)90532-0) + float phi_c = 0.; + float theta_p = 0.; + float sin_theta_c = std::sin(theta_c); + float cos_theta_c = std::cos(theta_c); + float x_p = std::sin(theta_p); + float z_p = std::cos(theta_p); + float sin_phi = std::sin(phi_c); + float cos_phi = std::cos(phi_c); + // float ze = T_r / (2. * z_p); + float az = z_p * cos_theta_c - x_p * sin_theta_c * cos_phi; + float e3z = std::sqrt(az * az + (n_g / n) * (n_g / n) - 1.); + float Z = T_g; + float alpha = e3z / az; + float etac = e3z * n * n; + float k = T_r / (2. * Z); + float m = 1. / (n * n); + float lambda = (1. + k * alpha * alpha * alpha) / (1. + k * alpha); + // Derivative d(theta_c)/dx + float temp1 = etac / Z; + float temp2 = alpha * e3z * cos_phi; + float temp3 = x_p * sin_theta_c * sin_phi * sin_phi; + float d_theta_x = temp1 * (temp2 - temp3); + // Derivative d(theta_c)/dy + float temp4 = etac * sin_phi / Z; + float temp5 = cos_theta_c - z_p * (1 - m) / az; + float d_theta_y = temp4 * temp5; + // Derivative d(theta_c)/dze + float temp8 = etac * sin_theta_c; + float temp9 = Z * (1.0 + k * alpha * alpha * alpha * n * n); + float temp10 = alpha * alpha * (1.0 - x_p * x_p * sin_phi * sin_phi) + lambda * x_p * x_p * sin_phi * sin_phi; + float d_theta_ze = temp8 * temp10 / temp9; + // Derivative d(theta_c)/dn + float d_theta_n = z_p / (n * az * sin_theta_c); + // RMS wavelength (using Sellmeier formula with measured aerogel parameters) + float a0 = 0.0616; + float w0 = 56.5; + float n0 = 1.0307; + float w_mean = 436.0; // 450.0;//484.9;//426.0; //450;//485;//450; // nm //450 426 493.5 // 426.0 + float scaling = n / n0; + float temp11 = a0 * w0 * w0 * w_mean; + float temp12 = std::pow(w_mean * w_mean - w0 * w0, 1.5); + float temp13 = std::sqrt(w_mean * w_mean * (1.0 + a0) - w0 * w0); + float d_n_w = temp11 / (temp12 * temp13) * scaling; + float sigma_w = 115.0; + // RMS x y + float sigma_theta_x = pixel_size / std::sqrt(12.0); + float sigma_theta_y = pixel_size / std::sqrt(12.0); + // RMS emission point + float sigma_theta_ze = T_r / (z_p * std::sqrt(12.0)); + // Single photon angular resolution + float res_x = d_theta_x * sigma_theta_x; + float res_y = d_theta_y * sigma_theta_y; + float res_ze = d_theta_ze * sigma_theta_ze; + float res_n = d_theta_n * d_n_w * sigma_w; + float single_photon_angular_resolution = std::sqrt(std::pow(res_x, 2) + std::pow(res_y, 2) + std::pow(res_ze, 2) + std::pow(res_n, 2)); + // Fraction of photons in rings (to account loss close to sector boundary in projective geometry) + float radius = (T_r / 2.0) * std::tan(theta_c) + T_g * std::tan(std::asin((n / n_g) * std::sin(theta_c))); + float N0 = 24. * T_r / 2.; // photons for N = 1.03 at saturation ( 24/2 factor per radiator cm ) + float multiplicity_spectrum_factor = std::pow(std::sin(theta_c), 2.) / std::pow(std::sin(std::acos(1. / 1.03)), 2.); // scale multiplicity w.r.t. N = 1.03 at saturation + // Considering average resolution (integrated over the sector) + // float n_photons = (tile_z_length / 2.0 > radius) ? N0 * multiplicity_spectrum_factor * (1.-(2.0*radius)/(M_PI*tile_z_length)) : N0 * multiplicity_spectrum_factor * (1.-(2.0*radius)/(M_PI*tile_z_length) - (2.0/(tile_z_length*M_PI))*(-(tile_z_length/(2.0))*std::acos(tile_z_length/(2.0*radius)) + radius*std::sqrt(1.-std::pow(tile_z_length/(2.0*radius),2.0)))); + // Considering "exact" resolution (eta by eta) + float n_photons = N0 * multiplicity_spectrum_factor * fractionPhotonsProjectiveRICH(eta, tile_z_length, radius); + if (n_photons <= error_value + 1) + return error_value; + // Ring angular resolution + float ring_angular_resolution = single_photon_angular_resolution / std::sqrt(n_photons); + return ring_angular_resolution; + } + /// returns track angular resolution /// \param pt the transverse momentum of the tarck /// \param eta the pseudorapidity of the tarck @@ -416,7 +701,7 @@ struct OnTheFlyRichPid { /// \param track_pt_resolution the absolute resolution on eta /// \param mass the mass of the particle /// \param refractive_index the refractive index of the radiator - double calculate_track_time_resolution_advanced(float pt, float eta, float track_pt_resolution, float track_eta_resolution, float mass, float refractive_index) + double calculate_track_angular_resolution_advanced(float pt, float eta, float track_pt_resolution, float track_eta_resolution, float mass, float refractive_index) { // Compute tracking contribution to timing using the error propagation formula // Uses light speed in m/ps, magnetic field in T (*0.1 for conversion kGauss -> T) @@ -430,6 +715,8 @@ struct OnTheFlyRichPid { void process(soa::Join::iterator const& collision, soa::Join const& tracks, aod::McParticles const&, aod::McCollisions const&) { + // for (int i = 0; i < 1000; i++) + // std::cout << "Prova" << std::endl; o2::dataformats::VertexBase pvVtx({collision.posX(), collision.posY(), collision.posZ()}, {collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()}); @@ -487,9 +774,17 @@ struct OnTheFlyRichPid { if (pdgInfo == nullptr) { continue; } - float expectedAngleBarrelRich = CherenkovAngle(o2track.getP(), pdgInfo->Mass()); - float barrelRICHAngularResolution = AngularResolution(o2track.getEta()); - float projectiveRadiatorRadius = radiusRipple(o2track.getEta()); + + // find track bRICH sector + int i_sector = findSector(o2track.getEta()); + if (i_sector < 0) { + continue; + } + + float expectedAngleBarrelRich = CherenkovAngle(o2track.getP(), pdgInfo->Mass(), aerogel_rindex[i_sector]); + // float barrelRICHAngularResolution = AngularResolution(o2track.getEta()); + float barrelRICHAngularResolution = extract_ring_angular_resolution(o2track.getEta(), aerogel_rindex[i_sector], bRichGapRefractiveIndex, bRichRadiatorThickness, gap_thickness[i_sector], bRICHPixelSize, expectedAngleBarrelRich, photodetrctor_length[i_sector]); + float projectiveRadiatorRadius = radiusRipple(o2track.getEta(), i_sector); bool flagReachesRadiator = false; if (projectiveRadiatorRadius > error_value + 1.) { flagReachesRadiator = checkMagfieldLimit(o2track, projectiveRadiatorRadius, dBz); @@ -502,7 +797,7 @@ struct OnTheFlyRichPid { // Smear with expected resolutions float measuredAngleBarrelRich = pRandomNumberGenerator.Gaus(expectedAngleBarrelRich, barrelRICHAngularResolution); - // Now we calculate the expected arrival time following certain mass hypotheses + // Now we calculate the expected Cherenkov angle following certain mass hypotheses // and the (imperfect!) reconstructed track parametrizations auto recoTrack = getTrackParCov(track); if (recoTrack.propagateToDCA(pvVtx, dBz)) { @@ -519,7 +814,7 @@ struct OnTheFlyRichPid { auto pdgInfoThis = pdg->GetParticle(lpdg_array[ii]); masses[ii] = pdgInfoThis->Mass(); - float hypothesisAngleBarrelRich = CherenkovAngle(recoTrack.getP(), masses[ii]); + float hypothesisAngleBarrelRich = CherenkovAngle(recoTrack.getP(), masses[ii], aerogel_rindex[i_sector]); // Evaluate total sigma (layer + tracking resolution) float barrelTotalAngularReso = barrelRICHAngularResolution; @@ -531,7 +826,7 @@ struct OnTheFlyRichPid { eta_resolution = mSmearer.getAbsEtaRes(pdgInfoThis->PdgCode(), dNdEta, recoTrack.getEta(), recoTrack.getP() / std::cosh(recoTrack.getEta())); } // cout << endl << "Pt resolution: " << pt_resolution << ", Eta resolution: " << eta_resolution << endl << endl; - float barrelTrackAngularReso = calculate_track_time_resolution_advanced(recoTrack.getP() / std::cosh(recoTrack.getEta()), recoTrack.getEta(), pt_resolution, eta_resolution, masses[ii], bRichRefractiveIndex); + float barrelTrackAngularReso = calculate_track_angular_resolution_advanced(recoTrack.getP() / std::cosh(recoTrack.getEta()), recoTrack.getEta(), pt_resolution, eta_resolution, masses[ii], aerogel_rindex[i_sector]); barrelTotalAngularReso = std::hypot(barrelRICHAngularResolution, barrelTrackAngularReso); if (doQAplots && hypothesisAngleBarrelRich > error_value + 1. && measuredAngleBarrelRich > error_value + 1. && barrelRICHAngularResolution > error_value + 1. && flagReachesRadiator) { float momentum = recoTrack.getP(); @@ -572,10 +867,15 @@ struct OnTheFlyRichPid { // Fill histograms if (doQAplots) { float momentum = recoTrack.getP(); + float pseudorapidity = recoTrack.getEta(); float barrelRichTheta = measuredAngleBarrelRich; if (barrelRichTheta > error_value + 1. && barrelRICHAngularResolution > error_value + 1. && flagReachesRadiator) { histos.fill(HIST("h2dAngleVsMomentumBarrelRICH"), momentum, barrelRichTheta); + histos.fill(HIST("h2dAngleVsEtaBarrelRICH"), pseudorapidity, barrelRichTheta); + histos.fill(HIST("h2dAngularResolutionVsMomentumBarrelRICH"), momentum, 1000 * barrelRICHAngularResolution); + histos.fill(HIST("h2dAngularResolutionVsEtaBarrelRICH"), pseudorapidity, 1000 * barrelRICHAngularResolution); + histos.fill(HIST("hSectorID"), i_sector); if (std::fabs(mcParticle.pdgCode()) == pdg->GetParticle(lpdg_array[0])->PdgCode()) { histos.fill(HIST("h2dBarrelNsigmaTrueElecVsElecHypothesis"), momentum, nSigmaBarrelRich[0]); From f49dfe174054b2e970a40efc0676d1092a46b853 Mon Sep 17 00:00:00 2001 From: Emilie-Barreau <131861224+Emilie-Barreau@users.noreply.github.com> Date: Fri, 2 May 2025 09:03:04 +0200 Subject: [PATCH 1150/1650] [PWGDQ] Adding global clusters to MuonExtra table (#11033) Co-authored-by: Emilie Martine Barreau --- PWGDQ/TableProducer/tableMaker_withAssoc.cxx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/PWGDQ/TableProducer/tableMaker_withAssoc.cxx b/PWGDQ/TableProducer/tableMaker_withAssoc.cxx index 690152893b3..a6d72986bef 100644 --- a/PWGDQ/TableProducer/tableMaker_withAssoc.cxx +++ b/PWGDQ/TableProducer/tableMaker_withAssoc.cxx @@ -1248,9 +1248,11 @@ struct TableMaker { VarManager::FillPropagateMuon(muon, collision); } // recalculte pDca and global muon kinematics + int globalClusters = muon.nClusters(); if (static_cast(muon.trackType()) < 2 && fConfigVariousOptions.fRefitGlobalMuon) { auto muontrack = muon.template matchMCHTrack_as(); auto mfttrack = muon.template matchMFTTrack_as(); + globalClusters += mfttrack.nClusters(); VarManager::FillTrackCollision(muontrack, collision); VarManager::FillGlobalMuonRefit(muontrack, mfttrack, collision); } else { @@ -1278,7 +1280,7 @@ struct TableMaker { } } muonBasic(reducedEventIdx, mchIdx, mftIdx, fFwdTrackFilterMap[muon.globalIndex()], VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kEta], VarManager::fgValues[VarManager::kPhi], muon.sign(), 0); - muonExtra(muon.nClusters(), VarManager::fgValues[VarManager::kMuonPDca], VarManager::fgValues[VarManager::kMuonRAtAbsorberEnd], + muonExtra(globalClusters, VarManager::fgValues[VarManager::kMuonPDca], VarManager::fgValues[VarManager::kMuonRAtAbsorberEnd], VarManager::fgValues[VarManager::kMuonChi2], muon.chi2MatchMCHMID(), muon.chi2MatchMCHMFT(), muon.matchScoreMCHMFT(), muon.mchBitMap(), muon.midBitMap(), From c736805bbab1ec80994bad8d790b3a52a09f877c Mon Sep 17 00:00:00 2001 From: Rik Spijkers <78484875+rspijkers@users.noreply.github.com> Date: Fri, 2 May 2025 11:27:21 +0200 Subject: [PATCH 1151/1650] [PWGLF] Remove obsolete tables from cascadeanalysisMC (#11034) --- PWGLF/Tasks/Strangeness/cascadeanalysisMC.cxx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/cascadeanalysisMC.cxx b/PWGLF/Tasks/Strangeness/cascadeanalysisMC.cxx index 896d366a1fa..b9f32b8600c 100644 --- a/PWGLF/Tasks/Strangeness/cascadeanalysisMC.cxx +++ b/PWGLF/Tasks/Strangeness/cascadeanalysisMC.cxx @@ -31,6 +31,11 @@ // david.dobrigkeit.chinellato@cern.ch // +#include +#include +#include +#include + #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" @@ -49,13 +54,8 @@ #include #include #include -#include #include #include -#include -#include -#include -#include "Framework/ASoAHelpers.h" using namespace o2; using namespace o2::framework; @@ -469,7 +469,7 @@ struct cascadeAnalysisMC { } PROCESS_SWITCH(cascadeAnalysisMC, processRun2VsMultiplicity, "Process Run 2 data vs multiplicity", false); - void processRun3WithPID(soa::Join::iterator const& collision, soa::Filtered const& Cascades, aod::V0sLinked const&, FullTracksExtIUWithPID const&, aod::McParticles const&) + void processRun3WithPID(soa::Join::iterator const& collision, soa::Filtered const& Cascades, FullTracksExtIUWithPID const&, aod::McParticles const&) // process function subscribing to Run 3-like analysis objects { // Run 3 event selection criteria @@ -484,7 +484,7 @@ struct cascadeAnalysisMC { } PROCESS_SWITCH(cascadeAnalysisMC, processRun3WithPID, "Process Run 3 data with PID", false); - void processRun2WithPID(soa::Join::iterator const& collision, soa::Filtered const& Cascades, aod::V0sLinked const&, FullTracksExtWithPID const&, aod::McParticles const&) + void processRun2WithPID(soa::Join::iterator const& collision, soa::Filtered const& Cascades, FullTracksExtWithPID const&, aod::McParticles const&) // process function subscribing to Run 3-like analysis objects { // Run 2 event selection criteria From 7b5582a6662697b5ba2ee57ba55e90accaba9be1 Mon Sep 17 00:00:00 2001 From: Rik Spijkers <78484875+rspijkers@users.noreply.github.com> Date: Fri, 2 May 2025 11:57:02 +0200 Subject: [PATCH 1152/1650] [PWGLF] cascadecorrelations: add eta cut and 2D efficiency (#11049) --- .../Tasks/Strangeness/cascadecorrelations.cxx | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx b/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx index ebeed8a76a0..7c988dbb4ca 100644 --- a/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx +++ b/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx @@ -104,6 +104,7 @@ struct CascadeSelector { Configurable minTPCCrossedRows{"minTPCCrossedRows", 80, "min N TPC crossed rows"}; // TODO: finetune! 80 > 159/2, so no split tracks? Configurable minITSClusters{"minITSClusters", 4, "minimum number of ITS clusters"}; Configurable etaTracks{"etaTracks", 1.0, "min/max of eta for tracks"}; + Configurable etaCascades{"etaCascades", 0.8, "min/max of eta for cascades"}; // Selection criteria - compatible with core wagon autodetect - copied from cascadeanalysis.cxx //*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+* @@ -181,8 +182,9 @@ struct CascadeSelector { h->GetXaxis()->SetBinLabel(3, "nITS OK"); h->GetXaxis()->SetBinLabel(4, "Topo OK"); h->GetXaxis()->SetBinLabel(5, "Track eta OK"); - h->GetXaxis()->SetBinLabel(6, "V0 PID OK"); - h->GetXaxis()->SetBinLabel(7, "Bach PID OK"); + h->GetXaxis()->SetBinLabel(6, "Cascade eta OK"); + h->GetXaxis()->SetBinLabel(7, "V0 PID OK"); + h->GetXaxis()->SetBinLabel(8, "Bach PID OK"); auto hEventSel = registry.add("hEventSel", "hEventSel", HistType::kTH1I, {{10, 0, 10, "selection criteria"}}); hEventSel->GetXaxis()->SetBinLabel(1, "All"); @@ -300,6 +302,12 @@ struct CascadeSelector { } registry.fill(HIST("hSelectionStatus"), 4); // passes track eta + if (TMath::Abs(casc.eta()) > etaCascades) { + cascflags(0); + continue; + } + registry.fill(HIST("hSelectionStatus"), 5); // passes candidate eta + // TODO: TOF (for pT > 2 GeV per track?) //// TPC PID //// @@ -327,7 +335,7 @@ struct CascadeSelector { continue; } } - registry.fill(HIST("hSelectionStatus"), 5); // passes V0 daughters PID + registry.fill(HIST("hSelectionStatus"), 6); // passes V0 daughters PID // registry.fill(HIST("hMassXi4"), casc.mXi(), casc.pt()); // Bachelor check @@ -335,7 +343,7 @@ struct CascadeSelector { if (TMath::Abs(bachTrack.tpcNSigmaKa()) < tpcNsigmaBachelor) { // consistent with both! cascflags(2); - registry.fill(HIST("hSelectionStatus"), 6); // passes bach PID + registry.fill(HIST("hSelectionStatus"), 7); // passes bach PID // registry.fill(HIST("hMassXi5"), casc.mXi(), casc.pt()); if (casc.sign() < 0) { registry.fill(HIST("hMassXiMinus"), casc.mXi(), casc.pt(), casc.yXi()); @@ -347,7 +355,7 @@ struct CascadeSelector { continue; } cascflags(1); - registry.fill(HIST("hSelectionStatus"), 6); // passes bach PID + registry.fill(HIST("hSelectionStatus"), 7); // passes bach PID // registry.fill(HIST("hMassXi5"), casc.mXi(), casc.pt()); if (casc.sign() < 0) { registry.fill(HIST("hMassXiMinus"), casc.mXi(), casc.pt(), casc.yXi()); @@ -357,7 +365,7 @@ struct CascadeSelector { continue; } else if (TMath::Abs(bachTrack.tpcNSigmaKa()) < tpcNsigmaBachelor) { cascflags(3); - registry.fill(HIST("hSelectionStatus"), 6); // passes bach PID + registry.fill(HIST("hSelectionStatus"), 7); // passes bach PID if (casc.sign() < 0) { registry.fill(HIST("hMassOmegaMinus"), casc.mOmega(), casc.pt(), casc.yOmega()); } else { @@ -427,10 +435,10 @@ struct CascadeCorrelations { mCounter.mSelectPrimaries = true; } - double getEfficiency(TH1D* h, double pT) - { // TODO: make 2D (rapidity) + double getEfficiency(TH1* h, double pT, double y = 0) + { // This function returns the value of histogram h corresponding to the x-coordinate pT - return h->GetBinContent(h->GetXaxis()->FindFixBin(pT)); + return h->GetBinContent(h->FindFixBin(pT, y)); } HistogramRegistry registry{ From e8ab650801787e41a2ec7fde3c4b359ed914e501 Mon Sep 17 00:00:00 2001 From: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> Date: Fri, 2 May 2025 11:57:31 +0200 Subject: [PATCH 1153/1650] [PWGLF] Fix V0/Casc MC mother table filling (#11026) --- .../Strangeness/strangederivedbuilder.cxx | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx index 6a67077dff3..f6ffacc7733 100644 --- a/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx @@ -842,12 +842,14 @@ struct strangederivedbuilder { //__________________________________________________ // mark mcParticles for referencing - for (auto const& v0 : V0s) + for (auto const& v0 : V0s) { if (v0.has_mcMotherParticle()) motherReference[v0.mcMotherParticleId()] = 0; - for (auto const& ca : Cascades) + } + for (auto const& ca : Cascades) { if (ca.has_mcMotherParticle()) motherReference[ca.mcMotherParticleId()] = 0; + } //__________________________________________________ // Figure out the numbering of the new mcMother table // assume filling per order @@ -859,10 +861,20 @@ struct strangederivedbuilder { } //__________________________________________________ // populate track references - for (auto const& v0 : V0s) - v0mothers(motherReference[v0.mcMotherParticleId()]); // joinable with V0Datas - for (auto const& ca : Cascades) - cascmothers(motherReference[ca.mcMotherParticleId()]); // joinable with CascDatas + for (auto const& v0 : V0s) { + if (v0.mcMotherParticleId() > -1) { + v0mothers(motherReference[v0.mcMotherParticleId()]); // joinable with V0Datas + } else { + v0mothers(-1); // joinable with V0Datas + } + } + for (auto const& ca : Cascades) { + if (ca.mcMotherParticleId() > -1) { + cascmothers(motherReference[ca.mcMotherParticleId()]); // joinable with CascDatas + } else { + cascmothers(-1); // joinable with CascDatas + } + } //__________________________________________________ // populate motherMCParticles for (auto const& tr : mcParticles) { From 8fa468025c01a14c3fe21b69ebed940cd6ee5851 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Fri, 2 May 2025 16:45:44 +0200 Subject: [PATCH 1154/1650] [ALICE3] A3TOF: compute multiplicity in any case, add possibility to switch between p and pt (#11051) --- ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx | 58 ++++++++++----------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx b/ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx index d8faa9e0eb7..2116462ea3c 100644 --- a/ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx +++ b/ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx @@ -97,8 +97,9 @@ struct OnTheFlyTofPid { struct : ConfigurableGroup { Configurable doQAplots{"doQAplots", true, "do basic velocity plot qa"}; + Configurable doSeparationVsPt{"doSeparationVsPt", true, "Produce plots vs pt or p"}; Configurable nBinsBeta{"nBinsBeta", 2200, "number of bins in beta"}; - Configurable nBinsP{"nBinsP", 80, "number of bins in momentum"}; + Configurable nBinsP{"nBinsP", 80, "number of bins in momentum/pT depending on doSeparationVsPt"}; Configurable nBinsTrackLengthInner{"nBinsTrackLengthInner", 300, "number of bins in track length"}; Configurable nBinsTrackLengthOuter{"nBinsTrackLengthOuter", 300, "number of bins in track length"}; Configurable nBinsTrackDeltaLength{"nBinsTrackDeltaLength", 100, "number of bins in delta track length"}; @@ -212,22 +213,23 @@ struct OnTheFlyTofPid { std::string name_title_outer = "h2dOuterNsigmaTrue" + particle_names2[i_true] + "Vs" + particle_names2[i_hyp] + "Hypothesis"; std::string name_title_inner_delta = "h2dInnerDeltaTrue" + particle_names2[i_true] + "Vs" + particle_names2[i_hyp] + "Hypothesis"; std::string name_title_outer_delta = "h2dOuterDeltaTrue" + particle_names2[i_true] + "Vs" + particle_names2[i_hyp] + "Hypothesis"; + const AxisSpec axisX{plotsConfig.doSeparationVsPt.value ? axisPt : axisMomentum}; if (i_true == i_hyp) { const AxisSpec axisNsigmaCorrect{static_cast(plotsConfig.nBinsNsigmaCorrectSpecies), plotsConfig.minNsigmaRange, plotsConfig.maxNsigmaRange, "N#sigma - True " + particle_names1[i_true] + " vs " + particle_names1[i_hyp] + " hypothesis"}; - h2dInnerNsigmaTrue[i_true][i_hyp] = histos.add(name_title_inner.c_str(), name_title_inner.c_str(), kTH2F, {axisMomentum, axisNsigmaCorrect}); - h2dOuterNsigmaTrue[i_true][i_hyp] = histos.add(name_title_outer.c_str(), name_title_outer.c_str(), kTH2F, {axisMomentum, axisNsigmaCorrect}); + h2dInnerNsigmaTrue[i_true][i_hyp] = histos.add(name_title_inner.c_str(), name_title_inner.c_str(), kTH2F, {axisX, axisNsigmaCorrect}); + h2dOuterNsigmaTrue[i_true][i_hyp] = histos.add(name_title_outer.c_str(), name_title_outer.c_str(), kTH2F, {axisX, axisNsigmaCorrect}); const AxisSpec axisDeltaCorrect{static_cast(plotsConfig.nBinsDeltaCorrectSpecies), plotsConfig.minDeltaRange, plotsConfig.maxDeltaRange, "#Delta - True " + particle_names1[i_true] + " vs " + particle_names1[i_hyp] + " hypothesis"}; - h2dInnerDeltaTrue[i_true][i_hyp] = histos.add(name_title_inner_delta.c_str(), name_title_inner_delta.c_str(), kTH2F, {axisMomentum, axisDeltaCorrect}); - h2dOuterDeltaTrue[i_true][i_hyp] = histos.add(name_title_outer_delta.c_str(), name_title_outer_delta.c_str(), kTH2F, {axisMomentum, axisDeltaCorrect}); + h2dInnerDeltaTrue[i_true][i_hyp] = histos.add(name_title_inner_delta.c_str(), name_title_inner_delta.c_str(), kTH2F, {axisX, axisDeltaCorrect}); + h2dOuterDeltaTrue[i_true][i_hyp] = histos.add(name_title_outer_delta.c_str(), name_title_outer_delta.c_str(), kTH2F, {axisX, axisDeltaCorrect}); } else { const AxisSpec axisNsigmaWrong{static_cast(plotsConfig.nBinsNsigmaWrongSpecies), plotsConfig.minNsigmaRange, plotsConfig.maxNsigmaRange, "N#sigma - True " + particle_names1[i_true] + " vs " + particle_names1[i_hyp] + " hypothesis"}; - h2dInnerNsigmaTrue[i_true][i_hyp] = histos.add(name_title_inner.c_str(), name_title_inner.c_str(), kTH2F, {axisMomentum, axisNsigmaWrong}); - h2dOuterNsigmaTrue[i_true][i_hyp] = histos.add(name_title_outer.c_str(), name_title_outer.c_str(), kTH2F, {axisMomentum, axisNsigmaWrong}); + h2dInnerNsigmaTrue[i_true][i_hyp] = histos.add(name_title_inner.c_str(), name_title_inner.c_str(), kTH2F, {axisX, axisNsigmaWrong}); + h2dOuterNsigmaTrue[i_true][i_hyp] = histos.add(name_title_outer.c_str(), name_title_outer.c_str(), kTH2F, {axisX, axisNsigmaWrong}); const AxisSpec axisDeltaWrong{static_cast(plotsConfig.nBinsDeltaWrongSpecies), plotsConfig.minDeltaRange, plotsConfig.maxDeltaRange, "#Delta - True " + particle_names1[i_true] + " vs " + particle_names1[i_hyp] + " hypothesis"}; - h2dInnerDeltaTrue[i_true][i_hyp] = histos.add(name_title_inner_delta.c_str(), name_title_inner_delta.c_str(), kTH2F, {axisMomentum, axisDeltaWrong}); - h2dOuterDeltaTrue[i_true][i_hyp] = histos.add(name_title_outer_delta.c_str(), name_title_outer_delta.c_str(), kTH2F, {axisMomentum, axisDeltaWrong}); + h2dInnerDeltaTrue[i_true][i_hyp] = histos.add(name_title_inner_delta.c_str(), name_title_inner_delta.c_str(), kTH2F, {axisX, axisDeltaWrong}); + h2dOuterDeltaTrue[i_true][i_hyp] = histos.add(name_title_outer_delta.c_str(), name_title_outer_delta.c_str(), kTH2F, {axisX, axisDeltaWrong}); } } } @@ -460,27 +462,25 @@ struct OnTheFlyTofPid { // First we compute the number of charged particles in the event if LUTs are loaded float dNdEta = 0.f; - if (simConfig.flagTOFLoadDelphesLUTs) { - for (const auto& track : tracks) { - if (!track.has_mcParticle()) - continue; - auto mcParticle = track.mcParticle(); - if (std::abs(mcParticle.eta()) > simConfig.multiplicityEtaRange) { - continue; - } - if (mcParticle.has_daughters()) { - continue; - } - const auto& pdgInfo = pdg->GetParticle(mcParticle.pdgCode()); - if (!pdgInfo) { - // LOG(warning) << "PDG code " << mcParticle.pdgCode() << " not found in the database"; - continue; - } - if (pdgInfo->Charge() == 0) { - continue; - } - dNdEta += 1.f; + for (const auto& track : tracks) { + if (!track.has_mcParticle()) + continue; + auto mcParticle = track.mcParticle(); + if (std::abs(mcParticle.eta()) > simConfig.multiplicityEtaRange) { + continue; + } + if (mcParticle.has_daughters()) { + continue; + } + const auto& pdgInfo = pdg->GetParticle(mcParticle.pdgCode()); + if (!pdgInfo) { + // LOG(warning) << "PDG code " << mcParticle.pdgCode() << " not found in the database"; + continue; + } + if (pdgInfo->Charge() == 0) { + continue; } + dNdEta += 1.f; } if (plotsConfig.doQAplots) { histos.fill(HIST("h1dNdeta"), dNdEta); From 46a573c27955b5083a6f6a97c45738e48de76948 Mon Sep 17 00:00:00 2001 From: Phil Stahlhut <138057549+pstahlhu@users.noreply.github.com> Date: Fri, 2 May 2025 17:30:45 +0200 Subject: [PATCH 1155/1650] [PWGHF] Add HF event selection and centrality process functions to Xic to Xi Pi Pi (#11011) --- PWGHF/TableProducer/CMakeLists.txt | 2 +- .../candidateCreatorXicToXiPiPi.cxx | 451 ++++++++++++++---- 2 files changed, 357 insertions(+), 96 deletions(-) diff --git a/PWGHF/TableProducer/CMakeLists.txt b/PWGHF/TableProducer/CMakeLists.txt index 22895a583ce..a2a0b107e74 100644 --- a/PWGHF/TableProducer/CMakeLists.txt +++ b/PWGHF/TableProducer/CMakeLists.txt @@ -92,7 +92,7 @@ o2physics_add_dpl_workflow(candidate-creator-xic0-omegac0 o2physics_add_dpl_workflow(candidate-creator-xic-to-xi-pi-pi SOURCES candidateCreatorXicToXiPiPi.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DCAFitter KFParticle::KFParticle + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DCAFitter KFParticle::KFParticle O2Physics::EventFilteringUtils COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(candidate-creator-xicc diff --git a/PWGHF/TableProducer/candidateCreatorXicToXiPiPi.cxx b/PWGHF/TableProducer/candidateCreatorXicToXiPiPi.cxx index 22b43f88061..52d8686efdd 100644 --- a/PWGHF/TableProducer/candidateCreatorXicToXiPiPi.cxx +++ b/PWGHF/TableProducer/candidateCreatorXicToXiPiPi.cxx @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -39,6 +40,7 @@ #include "Framework/HistogramRegistry.h" #include "Framework/runDataProcessing.h" #include "ReconstructionDataFormats/DCA.h" +#include "Framework/RunningWorkflowInfo.h" #include "Common/Core/trackUtilities.h" #include "Common/DataModel/CollisionAssociationTables.h" @@ -48,12 +50,16 @@ #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/Utils/utilsBfieldCCDB.h" +#include "PWGHF/Utils/utilsEvSelHf.h" using namespace o2; using namespace o2::analysis; -using namespace o2::aod::hf_cand_xic_to_xi_pi_pi; using namespace o2::constants::physics; using namespace o2::framework; +using namespace o2::hf_evsel; +using namespace o2::hf_centrality; +using namespace o2::hf_occupancy; +using namespace o2::aod::hf_cand_xic_to_xi_pi_pi; /// Reconstruction of heavy-flavour 3-prong decay candidates struct HfCandidateCreatorXicToXiPiPi { @@ -92,12 +98,15 @@ struct HfCandidateCreatorXicToXiPiPi { o2::vertexing::DCAFitterN<3> df; + HfEventSelection hfEvSel; + int runNumber{0}; float massXiPiPi{0.}; float massXiPi0{0.}; float massXiPi1{0.}; double bz{0.}; - enum XicCandCounter { AllIdTriplets = 0, + enum XicCandCounter { TotalSkimmedTriplets = 0, + SelEvent, CascPreSel, VertexFit }; @@ -112,16 +121,17 @@ struct HfCandidateCreatorXicToXiPiPi { void init(InitContext const&) { - if ((doprocessXicplusWithDcaFitter + doprocessXicplusWithKFParticle) != 1) { - LOGP(fatal, "Only one process function can be enabled at a time."); + if ((doprocessNoCentXicplusWithDcaFitter + doprocessCentFT0CXicplusWithDcaFitter + doprocessCentFT0MXicplusWithDcaFitter + doprocessNoCentXicplusWithKFParticle + doprocessCentFT0CXicplusWithKFParticle + doprocessCentFT0MXicplusWithKFParticle) != 1) { + LOGP(fatal, "Only one process function for the Xic reconstruction can be enabled at a time."); } // add histograms to registry if (fillHistograms) { // counter registry.add("hVertexerType", "Use KF or DCAFitterN;Vertexer type;entries", {HistType::kTH1F, {{2, -0.5, 1.5}}}); // See o2::aod::hf_cand::VertexerType - registry.add("hCandCounter", "hCandCounter", {HistType::kTH1F, {{3, 0.5, 3.5}}}); - registry.get(HIST("hCandCounter"))->GetXaxis()->SetBinLabel(1 + AllIdTriplets, "total"); + registry.add("hCandCounter", "hCandCounter", {HistType::kTH1F, {{4, -0.5, 3.5}}}); + registry.get(HIST("hCandCounter"))->GetXaxis()->SetBinLabel(1 + TotalSkimmedTriplets, "total"); + registry.get(HIST("hCandCounter"))->GetXaxis()->SetBinLabel(1 + SelEvent, "Event selected"); registry.get(HIST("hCandCounter"))->GetXaxis()->SetBinLabel(1 + CascPreSel, "Cascade preselection"); registry.get(HIST("hCandCounter"))->GetXaxis()->SetBinLabel(1 + VertexFit, "Successful vertex fit"); // physical variables @@ -139,10 +149,10 @@ struct HfCandidateCreatorXicToXiPiPi { } // fill hVertexerType histogram - if (doprocessXicplusWithDcaFitter && fillHistograms) { + if ((doprocessNoCentXicplusWithDcaFitter || doprocessCentFT0CXicplusWithDcaFitter || doprocessCentFT0MXicplusWithDcaFitter) && fillHistograms) { registry.fill(HIST("hVertexerType"), aod::hf_cand::VertexerType::DCAFitter); } - if (doprocessXicplusWithKFParticle && fillHistograms) { + if ((doprocessNoCentXicplusWithKFParticle || doprocessCentFT0CXicplusWithKFParticle || doprocessCentFT0MXicplusWithKFParticle) && fillHistograms) { registry.fill(HIST("hVertexerType"), aod::hf_cand::VertexerType::KfParticle); } @@ -153,6 +163,9 @@ struct HfCandidateCreatorXicToXiPiPi { lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get(ccdbPathLut)); runNumber = 0; + // initialize HF event selection helper + hfEvSel.init(registry); + // initialize 3-prong vertex fitter df.setPropagateToPCA(propagateToPCA); df.setMaxR(maxR); @@ -163,15 +176,33 @@ struct HfCandidateCreatorXicToXiPiPi { df.setWeightedFinalPCA(useWeightedFinalPCA); } - void processXicplusWithDcaFitter(aod::Collisions const&, - aod::HfCascLf3Prongs const& rowsTrackIndexXicPlus, - CascadesLinked const&, - CascFull const&, - TracksWCovDcaPidPrPi const&, - aod::BCsWithTimestamps const&) + template + void runXicplusCreatorWithDcaFitter(Collision const&, + aod::HfCascLf3Prongs const& rowsTrackIndexXicPlus, + CascadesLinked const&, + CascFull const&, + TracksWCovDcaPidPrPi const&, + aod::BCsWithTimestamps const&) { // loop over triplets of track indices for (const auto& rowTrackIndexXicPlus : rowsTrackIndexXicPlus) { + if (fillHistograms) { + registry.fill(HIST("hCandCounter"), TotalSkimmedTriplets); + } + + // check if the event is selected + auto collision = rowTrackIndexXicPlus.collision_as(); + float centrality{-1.f}; + const auto rejectionMask = hfEvSel.getHfCollisionRejectionMask(collision, centrality, ccdb, registry); + if (rejectionMask != 0) { + /// at least one event selection not satisfied --> reject the candidate + continue; + } + if (fillHistograms) { + registry.fill(HIST("hCandCounter"), SelEvent); + } + + // Retrieve skimmed cascade and pion tracks auto cascAodElement = rowTrackIndexXicPlus.cascade_as(); if (!cascAodElement.has_cascData()) { continue; @@ -179,10 +210,6 @@ struct HfCandidateCreatorXicToXiPiPi { auto casc = cascAodElement.cascData_as(); auto trackCharmBachelor0 = rowTrackIndexXicPlus.prong0_as(); auto trackCharmBachelor1 = rowTrackIndexXicPlus.prong1_as(); - auto collision = rowTrackIndexXicPlus.collision(); - if (fillHistograms) { - registry.fill(HIST("hCandCounter"), 1 + AllIdTriplets); - } // preselect cascade candidates if (doCascadePreselection) { @@ -194,13 +221,13 @@ struct HfCandidateCreatorXicToXiPiPi { } } if (fillHistograms) { - registry.fill(HIST("hCandCounter"), 1 + CascPreSel); + registry.fill(HIST("hCandCounter"), CascPreSel); } //----------------------Set the magnetic field from ccdb--------------------------------------- /// The static instance of the propagator was already modified in the HFTrackIndexSkimCreator, /// but this is not true when running on Run2 data/MC already converted into AO2Ds. - auto bc = collision.bc_as(); + auto bc = collision.template bc_as(); if (runNumber != bc.runNumber()) { LOG(info) << ">>>>>>>>>>>> Current run number: " << runNumber; initCCDB(bc, runNumber, ccdb, isRun2 ? ccdbPathGrp : ccdbPathGrpMag, lut, isRun2); @@ -217,10 +244,11 @@ struct HfCandidateCreatorXicToXiPiPi { std::array covCasc = {0.}; //----------------create cascade track------------------------------------------------------------ - constexpr int MomInd[6] = {9, 13, 14, 18, 19, 20}; // cov matrix elements for momentum component - for (int i = 0; i < 6; i++) { - covCasc[MomInd[i]] = casc.momentumCovMat()[i]; + constexpr std::size_t NElementsCovMatrix{6u}; + constexpr std::array MomInd = {9, 13, 14, 18, 19, 20}; // cov matrix elements for momentum component + for (auto i = 0u; i < NElementsCovMatrix; i++) { covCasc[i] = casc.positionCovMat()[i]; + covCasc[MomInd[i]] = casc.momentumCovMat()[i]; } // create cascade track o2::track::TrackParCov trackCasc; @@ -248,7 +276,7 @@ struct HfCandidateCreatorXicToXiPiPi { continue; } if (fillHistograms) { - registry.fill(HIST("hCandCounter"), 1 + VertexFit); + registry.fill(HIST("hCandCounter"), VertexFit); } //----------------------------calculate physical properties----------------------- @@ -388,17 +416,34 @@ struct HfCandidateCreatorXicToXiPiPi { nSigTofPiFromXicPlus0, nSigTofPiFromXicPlus1, nSigTofBachelorPi, nSigTofPiFromLambda, nSigTofPrFromLambda); } // loop over track triplets } - PROCESS_SWITCH(HfCandidateCreatorXicToXiPiPi, processXicplusWithDcaFitter, "Run candidate creator with DCAFitter.", true); - - void processXicplusWithKFParticle(aod::Collisions const&, - aod::HfCascLf3Prongs const& rowsTrackIndexXicPlus, - KFCascadesLinked const&, - KFCascFull const&, - TracksWCovExtraPidPrPi const&, - aod::BCsWithTimestamps const&) + + template + void runXicplusCreatorWithKFParticle(Collision const&, + aod::HfCascLf3Prongs const& rowsTrackIndexXicPlus, + KFCascadesLinked const&, + KFCascFull const&, + TracksWCovExtraPidPrPi const&, + aod::BCsWithTimestamps const&) { // loop over triplets of track indices for (const auto& rowTrackIndexXicPlus : rowsTrackIndexXicPlus) { + if (fillHistograms) { + registry.fill(HIST("hCandCounter"), TotalSkimmedTriplets); + } + + // check if the event is selected + auto collision = rowTrackIndexXicPlus.collision_as(); + float centrality{-1.f}; + const auto rejectionMask = hfEvSel.getHfCollisionRejectionMask(collision, centrality, ccdb, registry); + if (rejectionMask != 0) { + /// at least one event selection not satisfied --> reject the candidate + continue; + } + if (fillHistograms) { + registry.fill(HIST("hCandCounter"), SelEvent); + } + + // Retrieve skimmed cascade and pion tracks auto cascAodElement = rowTrackIndexXicPlus.cascade_as(); if (!cascAodElement.has_kfCascData()) { continue; @@ -406,10 +451,6 @@ struct HfCandidateCreatorXicToXiPiPi { auto casc = cascAodElement.kfCascData_as(); auto trackCharmBachelor0 = rowTrackIndexXicPlus.prong0_as(); auto trackCharmBachelor1 = rowTrackIndexXicPlus.prong1_as(); - auto collision = rowTrackIndexXicPlus.collision(); - if (fillHistograms) { - registry.fill(HIST("hCandCounter"), 1 + AllIdTriplets); - } //-------------------preselect cascade candidates-------------------------------------- if (doCascadePreselection) { @@ -421,13 +462,13 @@ struct HfCandidateCreatorXicToXiPiPi { } } if (fillHistograms) { - registry.fill(HIST("hCandCounter"), 1 + CascPreSel); + registry.fill(HIST("hCandCounter"), CascPreSel); } //----------------------Set the magnetic field from ccdb----------------------------- /// The static instance of the propagator was already modified in the HFTrackIndexSkimCreator, /// but this is not true when running on Run2 data/MC already converted into AO2Ds. - auto bc = collision.bc_as(); + auto bc = collision.template bc_as(); if (runNumber != bc.runNumber()) { LOG(info) << ">>>>>>>>>>>> Current run number: " << runNumber; initCCDB(bc, runNumber, ccdb, isRun2 ? ccdbPathGrp : ccdbPathGrpMag, lut, isRun2); @@ -457,11 +498,10 @@ struct HfCandidateCreatorXicToXiPiPi { // create Xi as KFParticle object // read {X,Y,Z,Px,Py,Pz} and corresponding covariance matrix from KF cascade Tables - std::array xyzpxpypz = {casc.x(), casc.y(), casc.z(), casc.px(), casc.py(), casc.pz()}; - float parPosMom[6]; - for (int i{0}; i < 6; ++i) { - parPosMom[i] = xyzpxpypz[i]; - } + constexpr std::size_t NElementsStateVector{6}; + std::array xyzpxpypz = {casc.x(), casc.y(), casc.z(), casc.px(), casc.py(), casc.pz()}; + float parPosMom[NElementsStateVector]; + std::copy(xyzpxpypz.begin(), xyzpxpypz.end(), parPosMom); // create KFParticle KFParticle kfXi; float massXi = casc.mXi(); @@ -481,7 +521,7 @@ struct HfCandidateCreatorXicToXiPiPi { continue; } if (fillHistograms) { - registry.fill(HIST("hCandCounter"), 1 + VertexFit); + registry.fill(HIST("hCandCounter"), VertexFit); } // get geometrical chi2 of XicPlus @@ -675,7 +715,141 @@ struct HfCandidateCreatorXicToXiPiPi { dcaPi0Pi1, dcaPi0Xi, dcaPi1Xi); } // loop over track triplets } - PROCESS_SWITCH(HfCandidateCreatorXicToXiPiPi, processXicplusWithKFParticle, "Run candidate creator with KFParticle using derived data from HfTrackIndexSkimCreatorLfCascades.", false); + + /////////////////////////////////////////////////////////// + /// /// + /// Process functions with DCAFitter /// + /// /// + /////////////////////////////////////////////////////////// + + void processNoCentXicplusWithDcaFitter(soa::Join const& collisions, + aod::HfCascLf3Prongs const& rowsTrackIndexXicPlus, + CascadesLinked const& cascadesLinked, + CascFull const& cascadesFull, + TracksWCovDcaPidPrPi const& tracks, + aod::BCsWithTimestamps const& bcs) + { + runXicplusCreatorWithDcaFitter(collisions, rowsTrackIndexXicPlus, cascadesLinked, cascadesFull, tracks, bcs); + } + PROCESS_SWITCH(HfCandidateCreatorXicToXiPiPi, processNoCentXicplusWithDcaFitter, "Run candidate creator with DCAFitter without centrality selection.", true); + + void processCentFT0CXicplusWithDcaFitter(soa::Join const& collisions, + aod::HfCascLf3Prongs const& rowsTrackIndexXicPlus, + CascadesLinked const& cascadesLinked, + CascFull const& cascadesFull, + TracksWCovDcaPidPrPi const& tracks, + aod::BCsWithTimestamps const& bcs) + { + runXicplusCreatorWithDcaFitter(collisions, rowsTrackIndexXicPlus, cascadesLinked, cascadesFull, tracks, bcs); + } + PROCESS_SWITCH(HfCandidateCreatorXicToXiPiPi, processCentFT0CXicplusWithDcaFitter, "Run candidate creator with DCAFitter with centrality selection on FT0C.", false); + + void processCentFT0MXicplusWithDcaFitter(soa::Join const& collisions, + aod::HfCascLf3Prongs const& rowsTrackIndexXicPlus, + CascadesLinked const& cascadesLinked, + CascFull const& cascadesFull, + TracksWCovDcaPidPrPi const& tracks, + aod::BCsWithTimestamps const& bcs) + { + runXicplusCreatorWithDcaFitter(collisions, rowsTrackIndexXicPlus, cascadesLinked, cascadesFull, tracks, bcs); + } + PROCESS_SWITCH(HfCandidateCreatorXicToXiPiPi, processCentFT0MXicplusWithDcaFitter, "Run candidate creator with DCAFitter with centrality selection on FT0M.", false); + + /////////////////////////////////////////////////////////// + /// /// + /// Process functions with KFParticle /// + /// /// + /////////////////////////////////////////////////////////// + + void processNoCentXicplusWithKFParticle(soa::Join const& collisions, + aod::HfCascLf3Prongs const& rowsTrackIndexXicPlus, + KFCascadesLinked const& kfCascadesLinked, + KFCascFull const& kfCascadesFull, + TracksWCovExtraPidPrPi const& tracks, + aod::BCsWithTimestamps const& bcs) + { + runXicplusCreatorWithKFParticle(collisions, rowsTrackIndexXicPlus, kfCascadesLinked, kfCascadesFull, tracks, bcs); + } + PROCESS_SWITCH(HfCandidateCreatorXicToXiPiPi, processNoCentXicplusWithKFParticle, "Run candidate creator with KFParticle without centrality selection.", false); + + void processCentFT0CXicplusWithKFParticle(soa::Join const& collisions, + aod::HfCascLf3Prongs const& rowsTrackIndexXicPlus, + KFCascadesLinked const& kfCascadesLinked, + KFCascFull const& kfCascadesFull, + TracksWCovExtraPidPrPi const& tracks, + aod::BCsWithTimestamps const& bcs) + { + runXicplusCreatorWithKFParticle(collisions, rowsTrackIndexXicPlus, kfCascadesLinked, kfCascadesFull, tracks, bcs); + } + PROCESS_SWITCH(HfCandidateCreatorXicToXiPiPi, processCentFT0CXicplusWithKFParticle, "Run candidate creator with KFParticle with centrality selection on FT0C.", false); + + void processCentFT0MXicplusWithKFParticle(soa::Join const& collisions, + aod::HfCascLf3Prongs const& rowsTrackIndexXicPlus, + KFCascadesLinked const& kfCascadesLinked, + KFCascFull const& kfCascadesFull, + TracksWCovExtraPidPrPi const& tracks, + aod::BCsWithTimestamps const& bcs) + { + runXicplusCreatorWithKFParticle(collisions, rowsTrackIndexXicPlus, kfCascadesLinked, kfCascadesFull, tracks, bcs); + } + PROCESS_SWITCH(HfCandidateCreatorXicToXiPiPi, processCentFT0MXicplusWithKFParticle, "Run candidate creator with KFParticle with centrality selection on FT0M.", false); + + /////////////////////////////////////////////////////////// + /// /// + /// Process functions only for collision monitoring /// + /// /// + /////////////////////////////////////////////////////////// + + void processCollisions(soa::Join const& collisions, aod::BCsWithTimestamps const&) + { + /// loop over collisions + for (const auto& collision : collisions) { + + /// bitmask with event. selection info + float centrality{-1.f}; + float occupancy = getOccupancyColl(collision, OccupancyEstimator::Its); + const auto rejectionMask = hfEvSel.getHfCollisionRejectionMask(collision, centrality, ccdb, registry); + + /// monitor the satisfied event selections + hfEvSel.fillHistograms(collision, rejectionMask, centrality, occupancy); + + } /// end loop over collisions + } + PROCESS_SWITCH(HfCandidateCreatorXicToXiPiPi, processCollisions, "Collision monitoring - no centrality", false); + + void processCollisionsCentFT0C(soa::Join const& collisions, aod::BCsWithTimestamps const&) + { + /// loop over collisions + for (const auto& collision : collisions) { + + /// bitmask with event. selection info + float centrality{-1.f}; + float occupancy = getOccupancyColl(collision, OccupancyEstimator::Its); + const auto rejectionMask = hfEvSel.getHfCollisionRejectionMask(collision, centrality, ccdb, registry); + + /// monitor the satisfied event selections + hfEvSel.fillHistograms(collision, rejectionMask, centrality, occupancy); + + } /// end loop over collisions + } + PROCESS_SWITCH(HfCandidateCreatorXicToXiPiPi, processCollisionsCentFT0C, "Collision monitoring - FT0C centrality", false); + + void processCollisionsCentFT0M(soa::Join const& collisions, aod::BCsWithTimestamps const&) + { + /// loop over collisions + for (const auto& collision : collisions) { + + /// bitmask with event. selection info + float centrality{-1.f}; + float occupancy = getOccupancyColl(collision, OccupancyEstimator::Its); + const auto rejectionMask = hfEvSel.getHfCollisionRejectionMask(collision, centrality, ccdb, registry); + + /// monitor the satisfied event selections + hfEvSel.fillHistograms(collision, rejectionMask, centrality, occupancy); + + } /// end loop over collisions + } + PROCESS_SWITCH(HfCandidateCreatorXicToXiPiPi, processCollisionsCentFT0M, "Collision monitoring - FT0M centrality", false); }; // struct /// Performs MC matching. @@ -684,10 +858,39 @@ struct HfCandidateCreatorXicToXiPiPiExpressions { Produces rowMcMatchRec; Produces rowMcMatchGen; - void init(InitContext const&) {} + using McCollisionsNoCents = soa::Join; + using McCollisionsFT0Cs = soa::Join; + using McCollisionsFT0Ms = soa::Join; + using McCollisionsCentFT0Ms = soa::Join; + using BCsInfo = soa::Join; - void processMc(aod::TracksWMc const& tracks, - aod::McParticles const& mcParticles) + Preslice mcParticlesPerMcCollision = aod::mcparticle::mcCollisionId; + PresliceUnsorted colPerMcCollision = aod::mccollisionlabel::mcCollisionId; + PresliceUnsorted colPerMcCollisionFT0C = aod::mccollisionlabel::mcCollisionId; + PresliceUnsorted colPerMcCollisionFT0M = aod::mccollisionlabel::mcCollisionId; + + HistogramRegistry registry{"registry"}; + + HfEventSelectionMc hfEvSelMc; + + void init(InitContext& initContext) + { + const auto& workflows = initContext.services().get(); + for (const DeviceSpec& device : workflows.devices) { + if (device.name.compare("hf-candidate-creator-xic-to-xi-pi-pi") == 0) { + // init HF event selection helper + hfEvSelMc.init(device, registry); + break; + } + } + } + + template + void runMcMatching(aod::TracksWMc const& tracks, + aod::McParticles const& mcParticles, + McCollisions const& mcCollisions, + CollInfos const& collInfos, + BCsInfo const&) { rowCandidateXic->bindExternalIndices(&tracks); @@ -699,8 +902,9 @@ struct HfCandidateCreatorXicToXiPiPiExpressions { int8_t debug = 0; // for resonance matching: std::vector arrDaughIndex; - std::array arrPDGDaugh; - std::array arrXiResonance = {3324, kPiPlus}; // 3324: Ξ(1530) + constexpr std::size_t NDaughtersResonant{2u}; + std::array arrPDGDaugh; + std::array arrXiResonance = {3324, kPiPlus}; // 3324: Ξ(1530) // Match reconstructed candidates. for (const auto& candidate : *rowCandidateXic) { @@ -741,8 +945,8 @@ struct HfCandidateCreatorXicToXiPiPiExpressions { } if (indexRec > -1) { RecoDecay::getDaughters(mcParticles.rawIteratorAt(indexRecXicPlus), &arrDaughIndex, std::array{0}, 1); - if (arrDaughIndex.size() == 2) { - for (auto iProng = 0u; iProng < arrDaughIndex.size(); ++iProng) { + if (arrDaughIndex.size() == NDaughtersResonant) { + for (auto iProng = 0u; iProng < NDaughtersResonant; ++iProng) { auto daughI = mcParticles.rawIteratorAt(arrDaughIndex[iProng]); arrPDGDaugh[iProng] = std::abs(daughI.pdgCode()); } @@ -768,58 +972,115 @@ struct HfCandidateCreatorXicToXiPiPiExpressions { } // close loop over candidates // Match generated particles. - for (const auto& particle : mcParticles) { - flag = 0; - sign = 0; - debug = 0; - origin = RecoDecay::OriginType::None; - arrDaughIndex.clear(); + for (const auto& mcCollision : mcCollisions) { + // Slice the particles table to get the particles for the current MC collision + const auto mcParticlesPerMcColl = mcParticles.sliceBy(mcParticlesPerMcCollision, mcCollision.globalIndex()); + // Slice the collisions table to get the collision info for the current MC collision + float centrality{-1.f}; + uint16_t rejectionMask{0}; + int nSplitColl = 0; + if constexpr (centEstimator == o2::hf_centrality::CentralityEstimator::FT0C) { + const auto collSlice = collInfos.sliceBy(colPerMcCollisionFT0C, mcCollision.globalIndex()); + rejectionMask = hfEvSelMc.getHfMcCollisionRejectionMask(mcCollision, collSlice, centrality); + } else if constexpr (centEstimator == o2::hf_centrality::CentralityEstimator::FT0M) { + const auto collSlice = collInfos.sliceBy(colPerMcCollisionFT0M, mcCollision.globalIndex()); + nSplitColl = collSlice.size(); + rejectionMask = hfEvSelMc.getHfMcCollisionRejectionMask(mcCollision, collSlice, centrality); + } else if constexpr (centEstimator == o2::hf_centrality::CentralityEstimator::None) { + const auto collSlice = collInfos.sliceBy(colPerMcCollision, mcCollision.globalIndex()); + rejectionMask = hfEvSelMc.getHfMcCollisionRejectionMask(mcCollision, collSlice, centrality); + } + hfEvSelMc.fillHistograms(mcCollision, rejectionMask, nSplitColl); + if (rejectionMask != 0) { + // at least one event selection not satisfied --> reject all particles from this collision + for (unsigned int i = 0; i < mcParticlesPerMcColl.size(); ++i) { + rowMcMatchGen(0, 0, -1); + } + continue; + } - // Xic → Xi pi pi - if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kXiCPlus, std::array{+kXiMinus, +kPiPlus, +kPiPlus}, true, &sign, 2)) { - debug = 1; - // Xi- -> Lambda pi - auto cascMC = mcParticles.rawIteratorAt(particle.daughtersIds().front()); - // Find Xi- from Xi(1530) -> Xi pi in case of resonant decay - RecoDecay::getDaughters(particle, &arrDaughIndex, std::array{0}, 1); - if (arrDaughIndex.size() == 2) { - auto cascStarMC = mcParticles.rawIteratorAt(particle.daughtersIds().front()); - if (RecoDecay::isMatchedMCGen(mcParticles, cascStarMC, +3324, std::array{+kXiMinus, +kPiPlus}, true)) { - cascMC = mcParticles.rawIteratorAt(cascStarMC.daughtersIds().front()); + for (const auto& particle : mcParticlesPerMcColl) { + flag = 0; + sign = 0; + debug = 0; + origin = RecoDecay::OriginType::None; + arrDaughIndex.clear(); + + // Xic → Xi pi pi + if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kXiCPlus, std::array{+kXiMinus, +kPiPlus, +kPiPlus}, true, &sign, 2)) { + debug = 1; + // Xi- -> Lambda pi + auto cascMC = mcParticles.rawIteratorAt(particle.daughtersIds().front()); + // Find Xi- from Xi(1530) -> Xi pi in case of resonant decay + RecoDecay::getDaughters(particle, &arrDaughIndex, std::array{0}, 1); + if (arrDaughIndex.size() == NDaughtersResonant) { + auto cascStarMC = mcParticles.rawIteratorAt(particle.daughtersIds().front()); + if (RecoDecay::isMatchedMCGen(mcParticles, cascStarMC, +3324, std::array{+kXiMinus, +kPiPlus}, true)) { + cascMC = mcParticles.rawIteratorAt(cascStarMC.daughtersIds().front()); + } } - } - if (RecoDecay::isMatchedMCGen(mcParticles, cascMC, +kXiMinus, std::array{+kLambda0, +kPiMinus}, true)) { - debug = 2; - // Lambda -> p pi - auto v0MC = mcParticles.rawIteratorAt(cascMC.daughtersIds().front()); - if (RecoDecay::isMatchedMCGen(mcParticles, v0MC, +kLambda0, std::array{+kProton, +kPiMinus}, true)) { - debug = 3; - if (arrDaughIndex.size() == 2) { - for (auto iProng = 0u; iProng < arrDaughIndex.size(); ++iProng) { - auto daughI = mcParticles.rawIteratorAt(arrDaughIndex[iProng]); - arrPDGDaugh[iProng] = std::abs(daughI.pdgCode()); - } - if ((arrPDGDaugh[0] == arrXiResonance[0] && arrPDGDaugh[1] == arrXiResonance[1]) || (arrPDGDaugh[0] == arrXiResonance[1] && arrPDGDaugh[1] == arrXiResonance[0])) { - flag = sign * (1 << aod::hf_cand_xic_to_xi_pi_pi::DecayType::XicToXiResPiToXiPiPi); + if (RecoDecay::isMatchedMCGen(mcParticles, cascMC, +kXiMinus, std::array{+kLambda0, +kPiMinus}, true)) { + debug = 2; + // Lambda -> p pi + auto v0MC = mcParticles.rawIteratorAt(cascMC.daughtersIds().front()); + if (RecoDecay::isMatchedMCGen(mcParticles, v0MC, +kLambda0, std::array{+kProton, +kPiMinus}, true)) { + debug = 3; + if (arrDaughIndex.size() == NDaughtersResonant) { + for (auto iProng = 0u; iProng < NDaughtersResonant; ++iProng) { + auto daughI = mcParticles.rawIteratorAt(arrDaughIndex[iProng]); + arrPDGDaugh[iProng] = std::abs(daughI.pdgCode()); + } + if ((arrPDGDaugh[0] == arrXiResonance[0] && arrPDGDaugh[1] == arrXiResonance[1]) || (arrPDGDaugh[0] == arrXiResonance[1] && arrPDGDaugh[1] == arrXiResonance[0])) { + flag = sign * (1 << aod::hf_cand_xic_to_xi_pi_pi::DecayType::XicToXiResPiToXiPiPi); + } else { + debug = 4; + } } else { - debug = 4; + flag = sign * (1 << aod::hf_cand_xic_to_xi_pi_pi::DecayType::XicToXiPiPi); } - } else { - flag = sign * (1 << aod::hf_cand_xic_to_xi_pi_pi::DecayType::XicToXiPiPi); } } } - } - // Check whether the charm baryon is non-prompt (from a b quark). - if (flag != 0) { - origin = RecoDecay::getCharmHadronOrigin(mcParticles, particle, false); - } + // Check whether the charm baryon is non-prompt (from a b quark). + if (flag != 0) { + origin = RecoDecay::getCharmHadronOrigin(mcParticles, particle, false); + } + + rowMcMatchGen(flag, debug, origin); + } // close loop over generated particles + } // close loop over McCollisions + } // close template function - rowMcMatchGen(flag, debug, origin); - } // close loop over generated particles - } // close process - PROCESS_SWITCH(HfCandidateCreatorXicToXiPiPiExpressions, processMc, "Process MC", false); + void processMc(aod::TracksWMc const& tracks, + aod::McParticles const& mcParticles, + aod::McCollisions const& mcCollisions, + McCollisionsNoCents const& mcCollisionsNoCents, + BCsInfo const& bcs) + { + runMcMatching(tracks, mcParticles, mcCollisions, mcCollisionsNoCents, bcs); + } + PROCESS_SWITCH(HfCandidateCreatorXicToXiPiPiExpressions, processMc, "Perform MC matching with no centrality selection.", true); + + void processMcCentFT0C(aod::TracksWMc const& tracks, + aod::McParticles const& mcParticles, + aod::McCollisions const& mcCollisions, + McCollisionsFT0Cs const& mcCollisionsFT0Cs, + BCsInfo const& bcs) + { + runMcMatching(tracks, mcParticles, mcCollisions, mcCollisionsFT0Cs, bcs); + } + PROCESS_SWITCH(HfCandidateCreatorXicToXiPiPiExpressions, processMcCentFT0C, "Perform MC matching with centrality selection on FT0C.", false); + + void processMcCentFT0M(aod::TracksWMc const& tracks, + aod::McParticles const& mcParticles, + McCollisionsCentFT0Ms const& mcCollisionsCentFT0Ms, + McCollisionsFT0Ms const& mcCollisionsFT0Ms, + BCsInfo const& bcs) + { + runMcMatching(tracks, mcParticles, mcCollisionsCentFT0Ms, mcCollisionsFT0Ms, bcs); + } + PROCESS_SWITCH(HfCandidateCreatorXicToXiPiPiExpressions, processMcCentFT0M, "Perform MC matching with centrality selection on FT0M.", false); }; // close struct WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From cf6baed66c52afb2c26c43bb0ab4789206cea6d3 Mon Sep 17 00:00:00 2001 From: prottayCMT <61418725+prottayCMT@users.noreply.github.com> Date: Fri, 2 May 2025 18:10:01 +0200 Subject: [PATCH 1156/1650] [PWGLF] moved to similar frame as STAR and added MC information along with change of axes of histograms (#11046) Co-authored-by: Prottay Das --- .../Tasks/Strangeness/taskLambdaSpinCorr.cxx | 357 ++++++++++++++++-- 1 file changed, 332 insertions(+), 25 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx index 1873ddeed13..73a9771b0a6 100644 --- a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx +++ b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx @@ -38,6 +38,7 @@ #include "PWGLF/DataModel/LFStrangenessTables.h" #include "PWGLF/DataModel/LFStrangenessPIDTables.h" #include "Common/DataModel/FT0Corrected.h" +#include "PWGMM/Mult/DataModel/Index.h" // for Particles2Tracks table using namespace o2; using namespace o2::framework; @@ -51,12 +52,16 @@ struct LfTaskLambdaSpinCorr { // fill output Configurable additionalEvSel{"additionalEvSel", false, "additionalEvSel"}; Configurable additionalEvSel3{"additionalEvSel3", false, "additionalEvSel3"}; + Configurable fillGEN{"fillGEN", true, "filling generated histograms"}; // events Configurable cfgCutVertex{"cfgCutVertex", 10.0f, "Accepted z-vertex range"}; Configurable cfgCutCentralityMax{"cfgCutCentralityMax", 50.0f, "Accepted maximum Centrality"}; Configurable cfgCutCentralityMin{"cfgCutCentralityMin", 30.0f, "Accepted minimum Centrality"}; + // Configs for track + Configurable cfgCutPt{"cfgCutPt", 0.2, "Pt cut on daughter track"}; + Configurable cfgCutEta{"cfgCutEta", 0.8, "Eta cut on daughter track"}; // Configs for V0 Configurable confV0PtMin{"confV0PtMin", 0.f, "Minimum transverse momentum of V0"}; Configurable confV0Rap{"confV0Rap", 0.8f, "Rapidity range of V0"}; @@ -80,6 +85,9 @@ struct LfTaskLambdaSpinCorr { Configurable iMNbins{"iMNbins", 100, "Number of bins in invariant mass"}; Configurable lbinIM{"lbinIM", 1.0, "lower bin value in IM histograms"}; Configurable hbinIM{"hbinIM", 1.2, "higher bin value in IM histograms"}; + Configurable iMNbinspair{"iMNbinspair", 100, "Number of bins in invariant mass pair"}; + Configurable lbinIMpair{"lbinIMpair", 1.0, "lower bin value in IMpair histograms"}; + Configurable hbinIMpair{"hbinIMpair", 1.2, "higher bin value in IMpair histograms"}; ConfigurableAxis configcentAxis{"configcentAxis", {VARIABLE_WIDTH, 0.0, 10.0, 40.0, 80.0}, "Cent V0M"}; ConfigurableAxis configthnAxisPt{"configthnAxisPt", {VARIABLE_WIDTH, 0.2, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 6.5, 8.0, 10.0, 100.0}, "#it{p}_{T} (GeV/#it{c})"}; @@ -91,12 +99,18 @@ struct LfTaskLambdaSpinCorr { void init(o2::framework::InitContext&) { AxisSpec thnAxisInvMass{iMNbins, lbinIM, hbinIM, "#it{M} (GeV/#it{c}^{2})"}; + AxisSpec thnAxisInvMasspair{iMNbinspair, lbinIMpair, hbinIMpair, "#it{M} (GeV/#it{c}^{2})"}; histos.add("hCentrality", "Centrality distribution", kTH1F, {{configcentAxis}}); - histos.add("hSparseLambdaLambda", "hSparseLambdaLambda", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, configthnAxisPt, configthnAxisPt}, true); - histos.add("hSparseLambdaAntiLambda", "hSparseLambdaAntiLambda", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, configthnAxisPt, configthnAxisPt}, true); - histos.add("hSparseAntiLambdaAntiLambda", "hSparseAntiLambdaAntiLambda", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, configthnAxisPt, configthnAxisPt}, true); + histos.add("hSparseLambdaLambda", "hSparseLambdaLambda", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + histos.add("hSparseLambdaAntiLambda", "hSparseLambdaAntiLambda", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + histos.add("hSparseAntiLambdaAntiLambda", "hSparseAntiLambdaAntiLambda", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + if (fillGEN) { + histos.add("hSparseLambdaLambdaMC", "hSparseLambdaLambdaMC", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + histos.add("hSparseLambdaAntiLambdaMC", "hSparseLambdaAntiLambdaMC", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + histos.add("hSparseAntiLambdaAntiLambdaMC", "hSparseAntiLambdaAntiLambdaMC", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + } } template @@ -135,6 +149,7 @@ struct LfTaskLambdaSpinCorr { } return true; } + template bool isSelectedV0Daughter(V0 const& candidate, T const& track, int pid) { @@ -192,7 +207,7 @@ struct LfTaskLambdaSpinCorr { void fillHistograms(bool tag1, bool tag2, bool tag3, bool tag4, const ROOT::Math::PxPyPzMVector& particlepair, const ROOT::Math::PxPyPzMVector& particle1, const ROOT::Math::PxPyPzMVector& particle2, const ROOT::Math::PxPyPzMVector& daughpart1, const ROOT::Math::PxPyPzMVector& daughpart2, - double centrality) + double centrality, bool datatype) { ROOT::Math::Boost boostPairToCM{particlepair.BoostToCM()}; // boosting vector for pair CM @@ -213,26 +228,38 @@ struct LfTaskLambdaSpinCorr { auto proton2LambdaRF = boostLambda2ToCM(proton2pairCM); // Method2 + /* ROOT::Math::XYZVector quantizationAxis = lambda1CM.Vect().Unit(); // Unit vector along Lambda1's direction in pair rest frame double cosTheta1 = proton1LambdaRF.Vect().Unit().Dot(quantizationAxis); double cosTheta2 = proton2LambdaRF.Vect().Unit().Dot(-quantizationAxis); // Opposite for Lambda2 double theta1 = std::acos(cosTheta1); // angle in radians double theta2 = std::acos(cosTheta2); // angle in radians - // Step 2: Compute sin(theta1) and sin(theta2) - // double sinTheta1 = std::sqrt(1 - cosTheta1 * cosTheta1); - // double sinTheta2 = std::sqrt(1 - cosTheta2 * cosTheta2); - - // Step 3: Calculate cos(theta1 - theta2) using the trigonometric identity - // double cosThetaDiff = cosTheta1 * cosTheta2 + sinTheta1 * sinTheta2; double cosThetaDiff = std::cos(theta1 - theta2); - - if (tag1 && tag3) - histos.fill(HIST("hSparseLambdaLambda"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particle1.Pt(), particle2.Pt()); - if (tag1 && tag4) - histos.fill(HIST("hSparseLambdaAntiLambda"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particle1.Pt(), particle2.Pt()); - if (tag2 && tag4) - histos.fill(HIST("hSparseAntiLambdaAntiLambda"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particle1.Pt(), particle2.Pt()); + */ + // STAR method + double cosThetaDiff = proton1LambdaRF.Vect().Unit().Dot(proton2LambdaRF.Vect().Unit()); + + auto lowptcut = 0.5; + auto highptcut = 10.0; + + if (datatype == 1) { + if (tag1 && tag3) + histos.fill(HIST("hSparseLambdaLambdaMC"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); + if (tag1 && tag4) + histos.fill(HIST("hSparseLambdaAntiLambdaMC"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); + if (tag2 && tag4) + histos.fill(HIST("hSparseAntiLambdaAntiLambdaMC"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); + } else { + if (particle1.Pt() > lowptcut && particle1.Pt() < highptcut && particle2.Pt() > lowptcut && particle2.Pt() < highptcut) { + if (tag1 && tag3) + histos.fill(HIST("hSparseLambdaLambda"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); + if (tag1 && tag4) + histos.fill(HIST("hSparseLambdaAntiLambda"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); + if (tag2 && tag4) + histos.fill(HIST("hSparseAntiLambdaAntiLambda"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); + } + } } std::tuple getLambdaTags(const auto& v0, const auto& collision) @@ -273,13 +300,56 @@ struct LfTaskLambdaSpinCorr { return {lambdaTag, aLambdaTag, true}; // Valid candidate } + std::tuple getLambdaTagsMC(const auto& v0, const auto& collision) + { + auto postrack = v0.template posTrack_as(); + auto negtrack = v0.template negTrack_as(); + + int lambdaTag = 0; + int aLambdaTag = 0; + + const auto signpos = postrack.sign(); + const auto signneg = negtrack.sign(); + + if (signpos < 0 || signneg > 0) { + return {0, 0, false}; // Invalid candidate + } + + if (isSelectedV0Daughter(v0, postrack, 0) && isSelectedV0Daughter(v0, negtrack, 1)) { + lambdaTag = 1; + } + if (isSelectedV0Daughter(v0, negtrack, 0) && isSelectedV0Daughter(v0, postrack, 1)) { + aLambdaTag = 1; + } + + if (!lambdaTag && !aLambdaTag) { + return {0, 0, false}; // No valid tags + } + + if (!selectionV0(collision, v0)) { + return {0, 0, false}; // Fails selection + } + + const auto netav = 0.8; + if (std::abs(v0.eta()) > netav) { + return {0, 0, false}; // Fails selection + } + + return {lambdaTag, aLambdaTag, true}; // Valid candidate + } + ROOT::Math::PxPyPzMVector lambda, antiLambda, lambdadummy, antiLambdadummy, proton, pion, antiProton, antiPion, fourVecDauCM; ROOT::Math::PxPyPzMVector lambda2, antiLambda2, lambdadummy2, antiLambdadummy2, proton2, pion2, antiProton2, antiPion2; ROOT::Math::PxPyPzMVector lambdaLambdapair, lambdaAntiLambdapair, antiLambdaAntiLambdapair; + ROOT::Math::PxPyPzMVector lambdamc, antiLambdamc, lambdadummymc, antiLambdadummymc, protonmc, pionmc, antiProtonmc, antiPionmc; + ROOT::Math::PxPyPzMVector lambda2mcmc, antiLambda2mc, lambdadummy2mc, antiLambdadummy2mc, proton2mc, pion2mc, antiProton2mc, antiPion2mc; + ROOT::Math::PxPyPzMVector lambdaLambdapairmc, lambdaAntiLambdapairmc, antiLambdaAntiLambdapairmc; + ROOT::Math::XYZVector threeVecDauCM, threeVecDauCMXY; Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; Filter centralityFilter = (nabs(aod::cent::centFT0C) < cfgCutCentralityMax && nabs(aod::cent::centFT0C) > cfgCutCentralityMin); + // Filter acceptanceFilter = (nabs(aod::track::eta) < cfgCutEta && nabs(aod::track::pt) > cfgCutPt); // using EventCandidates = soa::Filtered>; using EventCandidates = soa::Filtered>; @@ -293,6 +363,9 @@ struct LfTaskLambdaSpinCorr { return; } auto centrality = collision.centFT0C(); + /*if (!collision.triggereventsp()) { + return; + }*/ if (additionalEvSel && (!collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { return; @@ -370,8 +443,7 @@ struct LfTaskLambdaSpinCorr { lambdaLambdapair = lambdadummy + lambdadummy2; tagb = 0; tagb2 = 0; - // fillHistograms(taga, tagb, taga2, tagb2, LambdaLambdapair, Lambdadummy, Lambdadummy2, Proton, Proton2, centrality, LambdaLambdapair.M(), LambdaLambdapair.Pt()); - fillHistograms(taga, tagb, taga2, tagb2, lambdaLambdapair, lambdadummy, lambdadummy2, proton, proton2, centrality); + fillHistograms(taga, tagb, taga2, tagb2, lambdaLambdapair, lambdadummy, lambdadummy2, proton, proton2, centrality, 0); } tagb2 = aLambdaTag2; @@ -380,8 +452,7 @@ struct LfTaskLambdaSpinCorr { lambdaAntiLambdapair = lambdadummy + antiLambdadummy2; tagb = 0; taga2 = 0; - // fillHistograms(taga, tagb, taga2, tagb2, LambdaAntiLambdapair, Lambdadummy, AntiLambdadummy2, Proton, AntiProton2, centrality, LambdaAntiLambdapair.M(), LambdaAntiLambdapair.Pt()); - fillHistograms(taga, tagb, taga2, tagb2, lambdaAntiLambdapair, lambdadummy, antiLambdadummy2, proton, antiProton2, centrality); + fillHistograms(taga, tagb, taga2, tagb2, lambdaAntiLambdapair, lambdadummy, antiLambdadummy2, proton, antiProton2, centrality, 0); } tagb = aLambdaTag; @@ -391,17 +462,253 @@ struct LfTaskLambdaSpinCorr { antiLambdaAntiLambdapair = antiLambdadummy + antiLambdadummy2; taga = 0; taga2 = 0; - // fillHistograms(taga, tagb, taga2, tagb2, AntiLambdaAntiLambdapair, AntiLambdadummy, AntiLambdadummy2, AntiProton, AntiProton2, centrality, AntiLambdaAntiLambdapair.M(), AntiLambdaAntiLambdapair.Pt()); - fillHistograms(taga, tagb, taga2, tagb2, antiLambdaAntiLambdapair, antiLambdadummy, antiLambdadummy2, antiProton, antiProton2, centrality); + fillHistograms(taga, tagb, taga2, tagb2, antiLambdaAntiLambdapair, antiLambdadummy, antiLambdadummy2, antiProton, antiProton2, centrality, 0); } } } } PROCESS_SWITCH(LfTaskLambdaSpinCorr, processData, "Process data", true); + + using CollisionMCTrueTable = aod::McCollisions; + using TrackMCTrueTable = aod::McParticles; + + using CollisionMCRecTableCentFT0C = soa::SmallGroups>; + using TrackMCRecTable = soa::Join; + // using FilTrackMCRecTable = soa::Filtered; + using FilTrackMCRecTable = TrackMCRecTable; + Preslice perCollision = aod::track::collisionId; + using V0TrackCandidatesMC = soa::Join; + + void processMC(CollisionMCTrueTable::iterator const& /*TrueCollision*/, CollisionMCRecTableCentFT0C const& RecCollisions, TrackMCTrueTable const& GenParticles, FilTrackMCRecTable const& /*RecTracks*/, V0TrackCandidatesMC const& V0s) + { + + for (const auto& RecCollision : RecCollisions) { + if (!RecCollision.sel8()) { + continue; + } + + if (!RecCollision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !RecCollision.selection_bit(aod::evsel::kNoITSROFrameBorder)) { + continue; + } + + if (std::abs(RecCollision.posZ()) > cfgCutVertex) { + continue; + } + + auto centrality = RecCollision.centFT0C(); + histos.fill(HIST("hCentrality"), centrality); + + for (const auto& v0 : V0s) { + + auto [lambdaTag, aLambdaTag, isValid] = getLambdaTagsMC(v0, RecCollision); + if (!isValid) + continue; + + if (lambdaTag) { + proton = ROOT::Math::PxPyPzMVector(v0.pxpos(), v0.pypos(), v0.pzpos(), o2::constants::physics::MassProton); + antiPion = ROOT::Math::PxPyPzMVector(v0.pxneg(), v0.pyneg(), v0.pzneg(), o2::constants::physics::MassPionCharged); + lambdadummy = proton + antiPion; + } + if (aLambdaTag) { + antiProton = ROOT::Math::PxPyPzMVector(v0.pxneg(), v0.pyneg(), v0.pzneg(), o2::constants::physics::MassProton); + pion = ROOT::Math::PxPyPzMVector(v0.pxpos(), v0.pypos(), v0.pzpos(), o2::constants::physics::MassPionCharged); + antiLambdadummy = antiProton + pion; + } + + if (shouldReject(lambdaTag, aLambdaTag, lambdadummy, antiLambdadummy)) { + continue; + } + + int taga = lambdaTag; + int tagb = aLambdaTag; + + auto postrack1 = v0.template posTrack_as(); + auto negtrack1 = v0.template negTrack_as(); + + // 2nd loop for combination of lambda lambda + for (const auto& v02 : V0s) { + + if (v0.v0Id() >= v02.v0Id()) + continue; + + auto [lambdaTag2, aLambdaTag2, isValid2] = getLambdaTagsMC(v02, RecCollision); + if (!isValid2) + continue; + + if (lambdaTag2) { + proton2 = ROOT::Math::PxPyPzMVector(v02.pxpos(), v02.pypos(), v02.pzpos(), o2::constants::physics::MassProton); + antiPion2 = ROOT::Math::PxPyPzMVector(v02.pxneg(), v02.pyneg(), v02.pzneg(), o2::constants::physics::MassPionCharged); + lambdadummy2 = proton2 + antiPion2; + } + if (aLambdaTag2) { + antiProton2 = ROOT::Math::PxPyPzMVector(v02.pxneg(), v02.pyneg(), v02.pzneg(), o2::constants::physics::MassProton); + pion2 = ROOT::Math::PxPyPzMVector(v02.pxpos(), v02.pypos(), v02.pzpos(), o2::constants::physics::MassPionCharged); + antiLambdadummy2 = antiProton2 + pion2; + } + + if (shouldReject(lambdaTag2, aLambdaTag2, lambdadummy2, antiLambdadummy2)) { + continue; + } + + int taga2 = lambdaTag2; + int tagb2 = aLambdaTag2; + + auto postrack2 = v02.template posTrack_as(); + auto negtrack2 = v02.template negTrack_as(); + + if (postrack1.globalIndex() == postrack2.globalIndex() || negtrack1.globalIndex() == negtrack2.globalIndex()) { + continue; // no shared decay products + } + + if (lambdaTag && lambdaTag2) { + lambdaLambdapair = lambdadummy + lambdadummy2; + tagb = 0; + tagb2 = 0; + fillHistograms(taga, tagb, taga2, tagb2, lambdaLambdapair, lambdadummy, lambdadummy2, proton, proton2, centrality, 0); + } + + tagb2 = aLambdaTag2; + + if (lambdaTag && aLambdaTag2) { + lambdaAntiLambdapair = lambdadummy + antiLambdadummy2; + tagb = 0; + taga2 = 0; + fillHistograms(taga, tagb, taga2, tagb2, lambdaAntiLambdapair, lambdadummy, antiLambdadummy2, proton, antiProton2, centrality, 0); + } + + tagb = aLambdaTag; + taga2 = lambdaTag2; + + if (aLambdaTag && aLambdaTag2) { + antiLambdaAntiLambdapair = antiLambdadummy + antiLambdadummy2; + taga = 0; + taga2 = 0; + fillHistograms(taga, tagb, taga2, tagb2, antiLambdaAntiLambdapair, antiLambdadummy, antiLambdadummy2, antiProton, antiProton2, centrality, 0); + } + } + } + + //*******generated**************** + for (const auto& mcParticle : GenParticles) { + if (std::abs(mcParticle.y()) > confV0Rap) { + continue; + } + if (std::abs(mcParticle.pdgCode()) != PDG_t::kLambda0) { + continue; + } + + int tagamc = 0; + int tagbmc = 0; + int taga2mc = 0; + int tagb2mc = 0; + + auto pdg1 = mcParticle.pdgCode(); + auto kDaughters = mcParticle.daughters_as(); + int daughsize = 2; + if (kDaughters.size() != daughsize) { + continue; + } + + for (const auto& kCurrentDaughter : kDaughters) { + + if (std::abs(kCurrentDaughter.pdgCode()) != PDG_t::kProton && std::abs(kCurrentDaughter.pdgCode()) != PDG_t::kPiPlus) { + continue; + } + + if (kCurrentDaughter.pdgCode() == PDG_t::kProton) { + protonmc = ROOT::Math::PxPyPzMVector(kCurrentDaughter.px(), kCurrentDaughter.py(), kCurrentDaughter.pz(), o2::constants::physics::MassProton); + } + if (kCurrentDaughter.pdgCode() == PDG_t::kPiMinus) { + antiPionmc = ROOT::Math::PxPyPzMVector(kCurrentDaughter.px(), kCurrentDaughter.py(), kCurrentDaughter.pz(), o2::constants::physics::MassPionCharged); + } + + if (kCurrentDaughter.pdgCode() == PDG_t::kProtonBar) { + antiProtonmc = ROOT::Math::PxPyPzMVector(kCurrentDaughter.px(), kCurrentDaughter.py(), kCurrentDaughter.pz(), o2::constants::physics::MassProton); + } + if (kCurrentDaughter.pdgCode() == PDG_t::kPiPlus) { + pionmc = ROOT::Math::PxPyPzMVector(kCurrentDaughter.px(), kCurrentDaughter.py(), kCurrentDaughter.pz(), o2::constants::physics::MassPionCharged); + } + } + if (pdg1 == PDG_t::kLambda0) { + tagamc = 1; + lambdadummymc = protonmc + antiPionmc; + } + + if (pdg1 == PDG_t::kLambda0Bar) { + tagbmc = 1; + antiLambdadummymc = antiProtonmc + pionmc; + } + + for (const auto& mcParticle2 : GenParticles) { + if (std::abs(mcParticle2.y()) > confV0Rap) { + continue; + } + if (std::abs(mcParticle2.pdgCode()) != PDG_t::kLambda0) { + continue; + } + if (mcParticle.globalIndex() >= mcParticle2.globalIndex()) { + continue; + } + + auto pdg2 = mcParticle2.pdgCode(); + auto kDaughters2 = mcParticle2.daughters_as(); + + if (kDaughters2.size() != daughsize) { + continue; + } + + for (const auto& kCurrentDaughter2 : kDaughters2) { + if (std::abs(kCurrentDaughter2.pdgCode()) != PDG_t::kProton && std::abs(kCurrentDaughter2.pdgCode()) != PDG_t::kPiPlus) { + continue; + } + + if (kCurrentDaughter2.pdgCode() == PDG_t::kProton) { + proton2mc = ROOT::Math::PxPyPzMVector(kCurrentDaughter2.px(), kCurrentDaughter2.py(), kCurrentDaughter2.pz(), o2::constants::physics::MassProton); + } + if (kCurrentDaughter2.pdgCode() == PDG_t::kPiMinus) { + antiPion2mc = ROOT::Math::PxPyPzMVector(kCurrentDaughter2.px(), kCurrentDaughter2.py(), kCurrentDaughter2.pz(), o2::constants::physics::MassPionCharged); + } + + if (kCurrentDaughter2.pdgCode() == PDG_t::kProtonBar) { + antiProton2mc = ROOT::Math::PxPyPzMVector(kCurrentDaughter2.px(), kCurrentDaughter2.py(), kCurrentDaughter2.pz(), o2::constants::physics::MassProton); + } + if (kCurrentDaughter2.pdgCode() == PDG_t::kPiPlus) { + pion2mc = ROOT::Math::PxPyPzMVector(kCurrentDaughter2.px(), kCurrentDaughter2.py(), kCurrentDaughter2.pz(), o2::constants::physics::MassPionCharged); + } + } + + if (pdg2 == PDG_t::kLambda0) { + taga2mc = 1; + lambdadummy2mc = proton2mc + antiPion2mc; + } + + if (pdg2 == PDG_t::kLambda0Bar) { + tagb2mc = 1; + antiLambdadummy2mc = antiProton2mc + pion2mc; + } + + if (tagamc && taga2mc) { + lambdaLambdapairmc = lambdadummymc + lambdadummy2mc; + fillHistograms(tagamc, tagbmc, taga2mc, tagb2mc, lambdaLambdapairmc, lambdadummymc, lambdadummy2mc, protonmc, proton2mc, centrality, 1); + } + + if (tagamc && tagb2mc) { + lambdaAntiLambdapairmc = lambdadummymc + antiLambdadummy2mc; + fillHistograms(tagamc, tagbmc, taga2mc, tagb2mc, lambdaAntiLambdapairmc, lambdadummymc, antiLambdadummy2mc, protonmc, antiProton2mc, centrality, 1); + } + + if (tagbmc && tagb2mc) { + antiLambdaAntiLambdapairmc = antiLambdadummymc + antiLambdadummy2mc; + fillHistograms(tagamc, tagbmc, taga2mc, tagb2mc, antiLambdaAntiLambdapairmc, antiLambdadummymc, antiLambdadummy2mc, antiProtonmc, antiProton2mc, centrality, 1); + } + } + } + } + } + + PROCESS_SWITCH(LfTaskLambdaSpinCorr, processMC, "Process montecarlo", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - // return WorkflowSpec{ - // adaptAnalysisTask(cfgc, TaskName{"LambdaSpinCorrelation"})}; return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From 153350b747fb089a0e5dff60fd7a3d6648045136 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Fri, 2 May 2025 18:27:38 +0200 Subject: [PATCH 1157/1650] [PWGLF,Trigger] Optimize Kaon PID to improve Phi meson Purity (#11053) --- EventFiltering/PWGLF/filterdoublephi.cxx | 11 +- PWGLF/Tasks/Resonances/doublephimeson.cxx | 199 ++++++++++++---------- 2 files changed, 114 insertions(+), 96 deletions(-) diff --git a/EventFiltering/PWGLF/filterdoublephi.cxx b/EventFiltering/PWGLF/filterdoublephi.cxx index dbaec8fc474..0ee9f34b535 100644 --- a/EventFiltering/PWGLF/filterdoublephi.cxx +++ b/EventFiltering/PWGLF/filterdoublephi.cxx @@ -131,10 +131,10 @@ struct filterdoublephi { return true; } if (candidate.pt() >= 0.5) { - if (!candidate.hasTOF() && candidate.tpcNSigmaKa() > nsigmaCutTPC && candidate.tpcNSigmaKa() < 3.0) { + if (!candidate.hasTOF() && candidate.tpcNSigmaKa() > nsigmaCutTPC && candidate.tpcNSigmaKa() < 2.0) { return true; } - if (candidate.hasTOF() && candidate.beta() > cfgCutTOFBeta && candidate.tpcNSigmaKa() > nsigmaCutTPC && candidate.tpcNSigmaKa() < 3.0 && TMath::Abs(candidate.tofNSigmaKa()) < nsigmaCutTOF) { + if (candidate.hasTOF() && candidate.beta() > cfgCutTOFBeta && TMath::Sqrt(candidate.tpcNSigmaKa() * candidate.tpcNSigmaKa() + candidate.tofNSigmaKa() * candidate.tofNSigmaKa()) < nsigmaCutTOF) { return true; } } @@ -146,11 +146,14 @@ struct filterdoublephi { if (candidate.pt() < 0.5 && candidate.tpcNSigmaKa() > nsigmaCutTPC && candidate.tpcNSigmaKa() < 3.0) { return true; } - if (candidate.pt() >= 0.5) { - if (candidate.hasTOF() && candidate.beta() > cfgCutTOFBeta && candidate.tpcNSigmaKa() > nsigmaCutTPC && candidate.tpcNSigmaKa() < 3.0 && TMath::Abs(candidate.tofNSigmaKa()) < nsigmaCutTOF) { + if (candidate.pt() >= 0.5 && candidate.pt() < 5.0) { + if (candidate.hasTOF() && candidate.beta() > cfgCutTOFBeta && TMath::Sqrt(candidate.tpcNSigmaKa() * candidate.tpcNSigmaKa() + candidate.tofNSigmaKa() * candidate.tofNSigmaKa()) < nsigmaCutTOF) { return true; } } + if (candidate.pt() >= 5.0 && candidate.tpcNSigmaKa() > nsigmaCutTPC && candidate.tpcNSigmaKa() < 2.0) { + return true; + } return false; } // deep angle cut on pair to remove photon conversion diff --git a/PWGLF/Tasks/Resonances/doublephimeson.cxx b/PWGLF/Tasks/Resonances/doublephimeson.cxx index ef37f5983a5..607b65b9fbd 100644 --- a/PWGLF/Tasks/Resonances/doublephimeson.cxx +++ b/PWGLF/Tasks/Resonances/doublephimeson.cxx @@ -53,7 +53,7 @@ struct doublephimeson { Configurable cutNsigmaTPC{"cutNsigmaTPC", 3.0, "nsigma cut TPC"}; Configurable cutNsigmaTOF{"cutNsigmaTOF", 3.0, "nsigma cut TOF"}; Configurable momTOFCut{"momTOFCut", 1.8, "minimum pT cut for madnatory TOF"}; - Configurable maxKaonPt{"maxKaonPt", 4.0, "maximum kaon pt cut"}; + Configurable maxKaonPt{"maxKaonPt", 100.0, "maximum kaon pt cut"}; // Event Mixing Configurable nEvtMixing{"nEvtMixing", 1, "Number of events to mix"}; ConfigurableAxis CfgVtxBins{"CfgVtxBins", {10, -10, 10}, "Mixing bins - z-vertex"}; @@ -88,9 +88,9 @@ struct doublephimeson { const AxisSpec thnAxisCosTheta{configThnAxisCosTheta, "cos #theta"}; const AxisSpec thnAxisNumPhi{configThnAxisNumPhi, "Number of phi meson"}; - histos.add("SEMassUnlike", "SEMassUnlike", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisDeltaR, thnAxisCosTheta, thnAxisInvMassDeltaPhi, thnAxisNumPhi}); - histos.add("SEMassLike", "SEMassLike", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisDeltaR, thnAxisCosTheta, thnAxisInvMassDeltaPhi, thnAxisNumPhi}); - histos.add("MEMassUnlike", "MEMassUnlike", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisDeltaR, thnAxisCosTheta, thnAxisInvMassDeltaPhi}); + histos.add("SEMassUnlike", "SEMassUnlike", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisDeltaR, thnAxisInvMassPhi, thnAxisInvMassPhi, thnAxisNumPhi}); + // histos.add("SEMassLike", "SEMassLike", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisDeltaR, thnAxisInvMassPhi, thnAxisInvMassPhi, thnAxisNumPhi}); + histos.add("MEMassUnlike", "MEMassUnlike", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisDeltaR, thnAxisInvMassPhi, thnAxisInvMassPhi}); } // get kstar @@ -164,57 +164,71 @@ struct doublephimeson { bool selectionPID(float nsigmaTPC, float nsigmaTOF, int TOFHit, int PIDStrategy, float ptcand) { + // optimized TPC TOF if (PIDStrategy == 0) { - if (ptcand < 0.5) { - if (nsigmaTPC > cutMinNsigmaTPC && nsigmaTPC < cutNsigmaTPC) { + if (ptcand < 0.4) { + if (nsigmaTPC > -3.0 && nsigmaTPC < 3.0) { return true; } - } - if (ptcand >= 0.5) { - if (TOFHit != 1) { - if (ptcand >= 0.5 && ptcand < 0.6 && nsigmaTPC > -1.5 && nsigmaTPC < cutNsigmaTPC) { - return true; - } - if (ptcand >= 0.6 && ptcand < 0.7 && nsigmaTPC > -1.0 && nsigmaTPC < cutNsigmaTPC) { - return true; - } - if (ptcand >= 0.7 && ptcand < 0.8 && nsigmaTPC > -0.4 && nsigmaTPC < cutNsigmaTPC) { - return true; - } - if (ptcand >= 0.8 && ptcand < 1.0 && nsigmaTPC > -0.0 && nsigmaTPC < cutNsigmaTPC) { - return true; - } - if (ptcand >= 1.0 && ptcand < 1.8 && nsigmaTPC > -2.0 && nsigmaTPC < 2.0) { - return true; - } - if (ptcand >= 1.8 && ptcand < 2.0 && nsigmaTPC > -2.0 && nsigmaTPC < 1.5) { - return true; - } - if (ptcand >= 2.0 && nsigmaTPC > -2.0 && nsigmaTPC < 1.0) { - return true; - } + } else if (ptcand >= 0.4 && ptcand < 0.5) { + if (nsigmaTPC > -2.0 && nsigmaTPC < 3.0) { + return true; } - if (TOFHit == 1) { - if (TMath::Sqrt((nsigmaTPC * nsigmaTPC + nsigmaTOF * nsigmaTOF) / 2.0) < cutNsigmaTOF) { - return true; - } + } else if (ptcand >= 0.5 && ptcand < 5.0 && TOFHit == 1) { + if (ptcand < 2.0 && TMath::Sqrt(nsigmaTOF * nsigmaTOF + nsigmaTPC * nsigmaTPC) < 2.5) { + return true; + } + if (ptcand >= 2.0 && TMath::Sqrt(nsigmaTOF * nsigmaTOF + nsigmaTPC * nsigmaTPC) < 2.0) { + return true; + } + } else if (ptcand >= 0.5 && ptcand < 5.0 && TOFHit != 1) { + if (ptcand >= 0.5 && ptcand < 0.6 && nsigmaTPC > -1.5 && nsigmaTPC < 2.0) { + return true; } + if (ptcand >= 0.6 && ptcand < 0.7 && nsigmaTPC > -1.0 && nsigmaTPC < 2.0) { + return true; + } + if (ptcand >= 0.7 && ptcand < 0.8 && nsigmaTPC > -0.4 && nsigmaTPC < 2.0) { + return true; + } + if (ptcand >= 0.8 && ptcand < 1.0 && nsigmaTPC > -0.0 && nsigmaTPC < 2.0) { + return true; + } + if (ptcand >= 1.0 && ptcand < 1.8 && nsigmaTPC > -2.0 && nsigmaTPC < 2.0) { + return true; + } + if (ptcand >= 1.8 && ptcand < 2.0 && nsigmaTPC > -2.0 && nsigmaTPC < 1.5) { + return true; + } + if (ptcand >= 2.0 && nsigmaTPC > -2.0 && nsigmaTPC < 1.0) { + return true; + } + } else if (ptcand >= 5.0 && nsigmaTPC > -2.0 && nsigmaTPC < 2.0) { + return true; } } + // optimized TPC TOF combined if (PIDStrategy == 1) { - if (ptcand < 0.5) { + if (ptcand < 0.4) { if (nsigmaTPC > cutMinNsigmaTPC && nsigmaTPC < cutNsigmaTPC) { return true; } - } - if (ptcand >= 0.5) { - if (TOFHit == 1) { - if (nsigmaTPC > cutMinNsigmaTPC && nsigmaTPC < cutNsigmaTPC && TMath::Abs(nsigmaTOF) < cutNsigmaTOF) { - return true; - } + } else if (ptcand >= 0.4 && ptcand < 0.5) { + if (nsigmaTPC > -2.0 && nsigmaTPC < cutNsigmaTPC) { + return true; + } + } else if (ptcand >= 0.5 && ptcand < 5.0 && TOFHit == 1) { + if (ptcand < 2.0 && TMath::Sqrt(nsigmaTOF * nsigmaTOF + nsigmaTPC * nsigmaTPC) < 2.5) { + return true; + } + if (ptcand >= 2.0 && TMath::Sqrt(nsigmaTOF * nsigmaTOF + nsigmaTPC * nsigmaTPC) < 2.0) { + return true; } + } else if (ptcand >= 5.0 && nsigmaTPC > -2.0 && nsigmaTPC < 2.0) { + return true; } } + if (PIDStrategy == 2) { if (ptcand < 0.5) { if (nsigmaTPC > cutMinNsigmaTPC && nsigmaTPC < cutNsigmaTPC) { @@ -275,7 +289,7 @@ struct doublephimeson { } TLorentzVector exotic, Phid1, Phid2; - TLorentzVector exoticlike, Phi1kaonplus, Phi1kaonminus, Phi2kaonplus, Phi2kaonminus, Phid1like, Phid2like; + // TLorentzVector exoticlike, Phi1kaonplus, Phi1kaonminus, Phi2kaonplus, Phi2kaonminus, Phid1like, Phid2like; // TLorentzVector exoticRot, Phid1Rot; void processSE(aod::RedPhiEvents::iterator const& collision, aod::PhiTracks const& phitracks) @@ -325,8 +339,8 @@ struct doublephimeson { histos.fill(HIST("hPhiMass"), Phid1.M(), Phid1.Pt()); auto phid1id = phitrackd1.index(); Phid1.SetXYZM(phitrackd1.phiPx(), phitrackd1.phiPy(), phitrackd1.phiPz(), phitrackd1.phiMass()); - Phi1kaonplus.SetXYZM(phitrackd1.phid1Px(), phitrackd1.phid1Py(), phitrackd1.phid1Pz(), 0.493); - Phi1kaonminus.SetXYZM(phitrackd1.phid2Px(), phitrackd1.phid2Py(), phitrackd1.phid2Pz(), 0.493); + // Phi1kaonplus.SetXYZM(phitrackd1.phid1Px(), phitrackd1.phid1Py(), phitrackd1.phid1Pz(), 0.493); + // Phi1kaonminus.SetXYZM(phitrackd1.phid2Px(), phitrackd1.phid2Py(), phitrackd1.phid2Pz(), 0.493); for (auto phitrackd2 : phitracks) { auto phid2id = phitrackd2.index(); if (phid2id <= phid1id) { @@ -353,23 +367,24 @@ struct doublephimeson { continue; } Phid2.SetXYZM(phitrackd2.phiPx(), phitrackd2.phiPy(), phitrackd2.phiPz(), phitrackd2.phiMass()); - Phi2kaonplus.SetXYZM(phitrackd2.phid1Px(), phitrackd2.phid1Py(), phitrackd2.phid1Pz(), 0.493); - Phi2kaonminus.SetXYZM(phitrackd2.phid2Px(), phitrackd2.phid2Py(), phitrackd2.phid2Pz(), 0.493); - - // Like - Phid1like = Phi1kaonplus + Phi2kaonplus; - Phid2like = Phi1kaonminus + Phi2kaonminus; - exoticlike = Phid1like + Phid2like; - auto deltaRlike = TMath::Sqrt(TMath::Power(Phid1like.Phi() - Phid2like.Phi(), 2.0) + TMath::Power(Phid1like.Eta() - Phid2like.Eta(), 2.0)); - auto costhetalike = (Phid1like.Px() * Phid2like.Px() + Phid1like.Py() * Phid2like.Py() + Phid1like.Pz() * Phid2like.Pz()) / (Phid1like.P() * Phid2like.P()); - auto deltamlike = TMath::Sqrt(TMath::Power(Phid1like.M() - 1.0192, 2.0) + TMath::Power(Phid2like.M() - 1.0192, 2.0)); - if (!isDeep) { - histos.fill(HIST("SEMassLike"), exoticlike.M(), exoticlike.Pt(), deltaRlike, costhetalike, deltamlike, phimult); - } - if (isDeep) { - histos.fill(HIST("SEMassLike"), exoticlike.M(), exoticlike.Pt(), deltaRlike, deepangle(Phid1like, Phid2like), deltamlike, phimult); - } + // Phi2kaonplus.SetXYZM(phitrackd2.phid1Px(), phitrackd2.phid1Py(), phitrackd2.phid1Pz(), 0.493); + // Phi2kaonminus.SetXYZM(phitrackd2.phid2Px(), phitrackd2.phid2Py(), phitrackd2.phid2Pz(), 0.493); + /* + // Like + Phid1like = Phi1kaonplus + Phi2kaonplus; + Phid2like = Phi1kaonminus + Phi2kaonminus; + exoticlike = Phid1like + Phid2like; + auto deltaRlike = TMath::Sqrt(TMath::Power(Phid1like.Phi() - Phid2like.Phi(), 2.0) + TMath::Power(Phid1like.Eta() - Phid2like.Eta(), 2.0)); + auto costhetalike = (Phid1like.Px() * Phid2like.Px() + Phid1like.Py() * Phid2like.Py() + Phid1like.Pz() * Phid2like.Pz()) / (Phid1like.P() * Phid2like.P()); + auto deltamlike = TMath::Sqrt(TMath::Power(Phid1like.M() - 1.0192, 2.0) + TMath::Power(Phid2like.M() - 1.0192, 2.0)); + if (!isDeep) { + histos.fill(HIST("SEMassLike"), exoticlike.M(), exoticlike.Pt(), deltaRlike, costhetalike, deltamlike, phimult); + } + if (isDeep) { + histos.fill(HIST("SEMassLike"), exoticlike.M(), exoticlike.Pt(), deltaRlike, deepangle(Phid1like, Phid2like), deltamlike, phimult); + } + */ // Unlike if (phitrackd2.phiMass() < minPhiMass || phitrackd2.phiMass() > maxPhiMass) { continue; @@ -384,14 +399,14 @@ struct doublephimeson { // auto cosThetaStar = getCosTheta(exotic, Phid1); // auto kstar = getkstar(Phid1, Phid2); auto deltaR = TMath::Sqrt(TMath::Power(Phid1.Phi() - Phid2.Phi(), 2.0) + TMath::Power(Phid1.Eta() - Phid2.Eta(), 2.0)); - auto costheta = (Phid1.Px() * Phid2.Px() + Phid1.Py() * Phid2.Py() + Phid1.Pz() * Phid2.Pz()) / (Phid1.P() * Phid2.P()); - auto deltam = TMath::Sqrt(TMath::Power(Phid1.M() - 1.0192, 2.0) + TMath::Power(Phid2.M() - 1.0192, 2.0)); + // auto costheta = (Phid1.Px() * Phid2.Px() + Phid1.Py() * Phid2.Py() + Phid1.Pz() * Phid2.Pz()) / (Phid1.P() * Phid2.P()); + // auto deltam = TMath::Sqrt(TMath::Power(Phid1.M() - 1.0192, 2.0) + TMath::Power(Phid2.M() - 1.0192, 2.0)); histos.fill(HIST("hPhiMass2"), Phid1.M(), Phid2.M()); if (!isDeep) { - histos.fill(HIST("SEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, costheta, deltam, phimult); + histos.fill(HIST("SEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, Phid1.M(), Phid2.M(), phimult); } if (isDeep) { - histos.fill(HIST("SEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, deepangle(Phid1, Phid2), deltam, phimult); + histos.fill(HIST("SEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, Phid1.M(), Phid2.M(), phimult); } } } @@ -450,8 +465,8 @@ struct doublephimeson { histos.fill(HIST("hPhiMass"), Phid1.M(), Phid1.Pt()); auto phid1id = phitrackd1.index(); Phid1.SetXYZM(phitrackd1.phiPx(), phitrackd1.phiPy(), phitrackd1.phiPz(), phitrackd1.phiMass()); - Phi1kaonplus.SetXYZM(phitrackd1.phid1Px(), phitrackd1.phid1Py(), phitrackd1.phid1Pz(), 0.493); - Phi1kaonminus.SetXYZM(phitrackd1.phid2Px(), phitrackd1.phid2Py(), phitrackd1.phid2Pz(), 0.493); + // Phi1kaonplus.SetXYZM(phitrackd1.phid1Px(), phitrackd1.phid1Py(), phitrackd1.phid1Pz(), 0.493); + // Phi1kaonminus.SetXYZM(phitrackd1.phid2Px(), phitrackd1.phid2Py(), phitrackd1.phid2Pz(), 0.493); for (auto phitrackd2 : phitracks) { auto phid2id = phitrackd2.index(); if (phid2id <= phid1id) { @@ -475,23 +490,23 @@ struct doublephimeson { continue; } Phid2.SetXYZM(phitrackd2.phiPx(), phitrackd2.phiPy(), phitrackd2.phiPz(), phitrackd2.phiMass()); - Phi2kaonplus.SetXYZM(phitrackd2.phid1Px(), phitrackd2.phid1Py(), phitrackd2.phid1Pz(), 0.493); - Phi2kaonminus.SetXYZM(phitrackd2.phid2Px(), phitrackd2.phid2Py(), phitrackd2.phid2Pz(), 0.493); - - // Like - Phid1like = Phi1kaonplus + Phi2kaonplus; - Phid2like = Phi1kaonminus + Phi2kaonminus; - exoticlike = Phid1like + Phid2like; - auto deltaRlike = TMath::Sqrt(TMath::Power(Phid1like.Phi() - Phid2like.Phi(), 2.0) + TMath::Power(Phid1like.Eta() - Phid2like.Eta(), 2.0)); - auto costhetalike = (Phid1like.Px() * Phid2like.Px() + Phid1like.Py() * Phid2like.Py() + Phid1like.Pz() * Phid2like.Pz()) / (Phid1like.P() * Phid2like.P()); - auto deltamlike = TMath::Sqrt(TMath::Power(Phid1like.M() - 1.0192, 2.0) + TMath::Power(Phid2like.M() - 1.0192, 2.0)); - if (!isDeep) { - histos.fill(HIST("SEMassLike"), exoticlike.M(), exoticlike.Pt(), deltaRlike, costhetalike, deltamlike, phimult); - } - if (isDeep) { - histos.fill(HIST("SEMassLike"), exoticlike.M(), exoticlike.Pt(), deltaRlike, deepangle(Phid1like, Phid2like), deltamlike, phimult); - } - + // Phi2kaonplus.SetXYZM(phitrackd2.phid1Px(), phitrackd2.phid1Py(), phitrackd2.phid1Pz(), 0.493); + // Phi2kaonminus.SetXYZM(phitrackd2.phid2Px(), phitrackd2.phid2Py(), phitrackd2.phid2Pz(), 0.493); + /* + // Like + Phid1like = Phi1kaonplus + Phi2kaonplus; + Phid2like = Phi1kaonminus + Phi2kaonminus; + exoticlike = Phid1like + Phid2like; + auto deltaRlike = TMath::Sqrt(TMath::Power(Phid1like.Phi() - Phid2like.Phi(), 2.0) + TMath::Power(Phid1like.Eta() - Phid2like.Eta(), 2.0)); + auto costhetalike = (Phid1like.Px() * Phid2like.Px() + Phid1like.Py() * Phid2like.Py() + Phid1like.Pz() * Phid2like.Pz()) / (Phid1like.P() * Phid2like.P()); + auto deltamlike = TMath::Sqrt(TMath::Power(Phid1like.M() - 1.0192, 2.0) + TMath::Power(Phid2like.M() - 1.0192, 2.0)); + if (!isDeep) { + histos.fill(HIST("SEMassLike"), exoticlike.M(), exoticlike.Pt(), deltaRlike, costhetalike, deltamlike, phimult); + } + if (isDeep) { + histos.fill(HIST("SEMassLike"), exoticlike.M(), exoticlike.Pt(), deltaRlike, deepangle(Phid1like, Phid2like), deltamlike, phimult); + } + */ // unlike if (phitrackd1.phiMass() < minPhiMass || phitrackd1.phiMass() > maxPhiMass) { continue; @@ -542,14 +557,14 @@ struct doublephimeson { (d4trackid.at(i5) == d3trackid.at(i6) || d4trackid.at(i5) == d4trackid.at(i6))) { // LOGF(info, "Find Pair %f %f", deltam2, deltam1); if (deltam2 < deltam1) { - histos.fill(HIST("SEMassUnlike"), exotic2.M(), exotic2.Pt(), deltaR2, deepangle2(exotic2phi1, exotic2phi2), deltam2, exoticresonance.size()); + histos.fill(HIST("SEMassUnlike"), exotic2.M(), exotic2.Pt(), deltaR2, exotic2phi1.M(), exotic2phi2.M(), phimult); // LOGF(info, "Fill exotic Id %d which is pair of Id %d", i6, i5); } else { - histos.fill(HIST("SEMassUnlike"), exotic1.M(), exotic1.Pt(), deltaR1, deepangle2(exotic1phi1, exotic1phi2), deltam1, exoticresonance.size()); + histos.fill(HIST("SEMassUnlike"), exotic1.M(), exotic1.Pt(), deltaR1, exotic1phi1.M(), exotic1phi2.M(), phimult); // LOGF(info, "Fill exotic Id %d which is pair of Id %d", i6, i5); } } else { - histos.fill(HIST("SEMassUnlike"), exotic1.M(), exotic1.Pt(), deltaR1, deepangle2(exotic1phi1, exotic1phi2), deltam1, exoticresonance.size()); + histos.fill(HIST("SEMassUnlike"), exotic1.M(), exotic1.Pt(), deltaR1, exotic1phi1.M(), exotic1phi2.M(), phimult); } } } @@ -559,9 +574,9 @@ struct doublephimeson { auto exotic1phi1 = phiresonanced1.at(i5); auto exotic1phi2 = phiresonanced2.at(i5); auto exotic1 = exoticresonance.at(i5); - auto deltam1 = TMath::Sqrt(TMath::Power(exotic1phi1.M() - 1.0192, 2.0) + TMath::Power(exotic1phi2.M() - 1.0192, 2.0)); + // auto deltam1 = TMath::Sqrt(TMath::Power(exotic1phi1.M() - 1.0192, 2.0) + TMath::Power(exotic1phi2.M() - 1.0192, 2.0)); auto deltaR1 = TMath::Sqrt(TMath::Power(exotic1phi1.Phi() - exotic1phi2.Phi(), 2.0) + TMath::Power(exotic1phi1.Eta() - exotic1phi2.Eta(), 2.0)); - histos.fill(HIST("SEMassUnlike"), exotic1.M(), exotic1.Pt(), deltaR1, deepangle2(exotic1phi1, exotic1phi2), deltam1, exoticresonance.size()); + histos.fill(HIST("SEMassUnlike"), exotic1.M(), exotic1.Pt(), deltaR1, exotic1phi1.M(), exotic1phi2.M(), phimult); } } } @@ -618,13 +633,13 @@ struct doublephimeson { Phid2.SetXYZM(phitrackd2.phiPx(), phitrackd2.phiPy(), phitrackd2.phiPz(), phitrackd2.phiMass()); exotic = Phid1 + Phid2; auto deltaR = TMath::Sqrt(TMath::Power(Phid1.Phi() - Phid2.Phi(), 2.0) + TMath::Power(Phid1.Eta() - Phid2.Eta(), 2.0)); - auto costheta = (Phid1.Px() * Phid2.Px() + Phid1.Py() * Phid2.Py() + Phid1.Pz() * Phid2.Pz()) / (Phid1.P() * Phid2.P()); - auto deltam = TMath::Sqrt(TMath::Power(Phid1.M() - 1.0192, 2.0) + TMath::Power(Phid2.M() - 1.0192, 2.0)); + // auto costheta = (Phid1.Px() * Phid2.Px() + Phid1.Py() * Phid2.Py() + Phid1.Pz() * Phid2.Pz()) / (Phid1.P() * Phid2.P()); + // auto deltam = TMath::Sqrt(TMath::Power(Phid1.M() - 1.0192, 2.0) + TMath::Power(Phid2.M() - 1.0192, 2.0)); if (!isDeep) { - histos.fill(HIST("MEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, costheta, deltam); + histos.fill(HIST("MEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, Phid1.M(), Phid2.M()); } if (isDeep) { - histos.fill(HIST("MEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, deepangle(Phid1, Phid2), deltam); + histos.fill(HIST("MEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, Phid1.M(), Phid2.M()); } } } From cd4884c0c6cf913c71558135775df2a0b275cf1d Mon Sep 17 00:00:00 2001 From: Mattia Faggin Date: Fri, 2 May 2025 20:13:03 +0200 Subject: [PATCH 1158/1650] [PWGHF] store PID info in 3-prong candidate table and propagate it to analyses. (#10984) Co-authored-by: Mattia Faggin Co-authored-by: ALICE Action Bot --- PWGHF/Core/HfMlResponseDplusToPiKPi.h | 47 ++-- PWGHF/Core/HfMlResponseDsToKKPi.h | 67 +++--- PWGHF/Core/HfMlResponseDstarToD0Pi.h | 50 +++-- PWGHF/Core/HfMlResponseLcToPKPi.h | 119 +++++----- PWGHF/Core/HfMlResponseXicToPKPi.h | 108 +++++---- .../dataCreatorCharmHadPiReduced.cxx | 14 +- PWGHF/D2H/Tasks/taskXic.cxx | 52 ++--- .../DataModel/CandidateReconstructionTables.h | 3 + .../HFC/TableProducer/femtoDreamProducer.cxx | 8 +- .../TableProducer/candidateCreator3Prong.cxx | 74 ++++-- PWGHF/TableProducer/candidateCreatorDstar.cxx | 24 +- .../candidateSelectorDplusToPiKPi.cxx | 16 +- .../candidateSelectorDsToKKPi.cxx | 26 +-- .../candidateSelectorDstarToD0Pi.cxx | 26 +-- PWGHF/TableProducer/candidateSelectorLc.cxx | 32 +-- .../candidateSelectorLcPidMl.cxx | 12 +- .../candidateSelectorXicToPKPi.cxx | 26 +-- .../derivedDataCreatorDplusToPiKPi.cxx | 35 ++- .../derivedDataCreatorLcToPKPi.cxx | 49 ++-- .../TableProducer/treeCreatorDplusToPiKPi.cxx | 84 ++++--- PWGHF/TableProducer/treeCreatorDsToKKPi.cxx | 76 +++---- .../TableProducer/treeCreatorDstarToD0Pi.cxx | 77 ++++--- PWGHF/TableProducer/treeCreatorLbToLcPi.cxx | 28 +-- PWGHF/TableProducer/treeCreatorLcToPKPi.cxx | 210 +++++++++--------- PWGHF/TableProducer/treeCreatorXicToPKPi.cxx | 75 +++---- 25 files changed, 707 insertions(+), 631 deletions(-) diff --git a/PWGHF/Core/HfMlResponseDplusToPiKPi.h b/PWGHF/Core/HfMlResponseDplusToPiKPi.h index 292ddcccb95..42dde77eda7 100644 --- a/PWGHF/Core/HfMlResponseDplusToPiKPi.h +++ b/PWGHF/Core/HfMlResponseDplusToPiKPi.h @@ -25,9 +25,9 @@ // Fill the map of available input features // the key is the feature's name (std::string) // the value is the corresponding value in EnumInputFeatures -#define FILL_MAP_DPLUS(FEATURE) \ - { \ -#FEATURE, static_cast < uint8_t>(InputFeaturesDplusToPiKPi::FEATURE) \ +#define FILL_MAP_DPLUS(FEATURE) \ + { \ + #FEATURE, static_cast(InputFeaturesDplusToPiKPi::FEATURE) \ } // Check if the index of mCachedIndices (index associated to a FEATURE) @@ -104,9 +104,8 @@ class HfMlResponseDplusToPiKPi : public HfMlResponse /// \param prong1 is the candidate's prong1 /// \param prong2 is the candidate's prong2 /// \return inputFeatures vector - template - std::vector getInputFeatures(T1 const& candidate, - T2 const& prong0, T2 const& prong1, T2 const& prong2) + template + std::vector getInputFeatures(T1 const& candidate) { std::vector inputFeatures; @@ -130,26 +129,26 @@ class HfMlResponseDplusToPiKPi : public HfMlResponse CHECK_AND_FILL_VEC_DPLUS(maxNormalisedDeltaIP); CHECK_AND_FILL_VEC_DPLUS(chi2PCA); // TPC PID variables - CHECK_AND_FILL_VEC_DPLUS_FULL(prong0, tpcNSigmaPi0, tpcNSigmaPi); - CHECK_AND_FILL_VEC_DPLUS_FULL(prong0, tpcNSigmaKa0, tpcNSigmaKa); - CHECK_AND_FILL_VEC_DPLUS_FULL(prong1, tpcNSigmaPi1, tpcNSigmaPi); - CHECK_AND_FILL_VEC_DPLUS_FULL(prong1, tpcNSigmaKa1, tpcNSigmaKa); - CHECK_AND_FILL_VEC_DPLUS_FULL(prong2, tpcNSigmaPi2, tpcNSigmaPi); - CHECK_AND_FILL_VEC_DPLUS_FULL(prong2, tpcNSigmaKa2, tpcNSigmaKa); + CHECK_AND_FILL_VEC_DPLUS_FULL(candidate, tpcNSigmaPi0, nSigTpcPi0); + CHECK_AND_FILL_VEC_DPLUS_FULL(candidate, tpcNSigmaKa0, nSigTpcKa0); + CHECK_AND_FILL_VEC_DPLUS_FULL(candidate, tpcNSigmaPi1, nSigTpcPi1); + CHECK_AND_FILL_VEC_DPLUS_FULL(candidate, tpcNSigmaKa1, nSigTpcKa1); + CHECK_AND_FILL_VEC_DPLUS_FULL(candidate, tpcNSigmaPi2, nSigTpcPi2); + CHECK_AND_FILL_VEC_DPLUS_FULL(candidate, tpcNSigmaKa2, nSigTpcKa2); // TOF PID variables - CHECK_AND_FILL_VEC_DPLUS_FULL(prong0, tofNSigmaPi0, tofNSigmaPi); - CHECK_AND_FILL_VEC_DPLUS_FULL(prong0, tofNSigmaKa0, tofNSigmaKa); - CHECK_AND_FILL_VEC_DPLUS_FULL(prong1, tofNSigmaPi1, tofNSigmaPi); - CHECK_AND_FILL_VEC_DPLUS_FULL(prong1, tofNSigmaKa1, tofNSigmaKa); - CHECK_AND_FILL_VEC_DPLUS_FULL(prong2, tofNSigmaPi2, tofNSigmaPi); - CHECK_AND_FILL_VEC_DPLUS_FULL(prong2, tofNSigmaKa2, tofNSigmaKa); + CHECK_AND_FILL_VEC_DPLUS_FULL(candidate, tofNSigmaPi0, nSigTofPi0); + CHECK_AND_FILL_VEC_DPLUS_FULL(candidate, tofNSigmaKa0, nSigTofKa0); + CHECK_AND_FILL_VEC_DPLUS_FULL(candidate, tofNSigmaPi1, nSigTofPi1); + CHECK_AND_FILL_VEC_DPLUS_FULL(candidate, tofNSigmaKa1, nSigTofKa1); + CHECK_AND_FILL_VEC_DPLUS_FULL(candidate, tofNSigmaPi2, nSigTofPi2); + CHECK_AND_FILL_VEC_DPLUS_FULL(candidate, tofNSigmaKa2, nSigTofKa2); // Combined PID variables - CHECK_AND_FILL_VEC_DPLUS_FULL(prong0, tpcTofNSigmaPi0, tpcTofNSigmaPi); - CHECK_AND_FILL_VEC_DPLUS_FULL(prong1, tpcTofNSigmaPi1, tpcTofNSigmaPi); - CHECK_AND_FILL_VEC_DPLUS_FULL(prong2, tpcTofNSigmaPi2, tpcTofNSigmaPi); - CHECK_AND_FILL_VEC_DPLUS_FULL(prong0, tpcTofNSigmaKa0, tpcTofNSigmaKa); - CHECK_AND_FILL_VEC_DPLUS_FULL(prong1, tpcTofNSigmaKa1, tpcTofNSigmaKa); - CHECK_AND_FILL_VEC_DPLUS_FULL(prong2, tpcTofNSigmaKa2, tpcTofNSigmaKa); + CHECK_AND_FILL_VEC_DPLUS_FULL(candidate, tpcTofNSigmaPi0, tpcTofNSigmaPi0); + CHECK_AND_FILL_VEC_DPLUS_FULL(candidate, tpcTofNSigmaPi1, tpcTofNSigmaPi1); + CHECK_AND_FILL_VEC_DPLUS_FULL(candidate, tpcTofNSigmaPi2, tpcTofNSigmaPi2); + CHECK_AND_FILL_VEC_DPLUS_FULL(candidate, tpcTofNSigmaKa0, tpcTofNSigmaKa0); + CHECK_AND_FILL_VEC_DPLUS_FULL(candidate, tpcTofNSigmaKa1, tpcTofNSigmaKa1); + CHECK_AND_FILL_VEC_DPLUS_FULL(candidate, tpcTofNSigmaKa2, tpcTofNSigmaKa2); } } diff --git a/PWGHF/Core/HfMlResponseDsToKKPi.h b/PWGHF/Core/HfMlResponseDsToKKPi.h index 1b27d52adde..ccb6a99e371 100644 --- a/PWGHF/Core/HfMlResponseDsToKKPi.h +++ b/PWGHF/Core/HfMlResponseDsToKKPi.h @@ -81,6 +81,18 @@ break; \ } +// Variation of CHECK_AND_FILL_VEC_DS_OBJECT_SIGNED(OBJECT, FEATURE, GETTER1, GETTER2) +// where GETTER1 and GETTER2 are methods of the OBJECT +#define CHECK_AND_FILL_VEC_DS_SIGNED(OBJECT, FEATURE, GETTER1, GETTER2) \ + case static_cast(InputFeaturesDsToKKPi::FEATURE): { \ + if (caseDsToKKPi) { \ + inputFeatures.emplace_back(OBJECT.GETTER1()); \ + } else { \ + inputFeatures.emplace_back(OBJECT.GETTER2()); \ + } \ + break; \ + } + namespace o2::analysis { enum class InputFeaturesDsToKKPi : uint8_t { @@ -148,9 +160,8 @@ class HfMlResponseDsToKKPi : public HfMlResponse /// \param prong2 is the candidate's prong2 /// \param caseDsToKKPi used to divide the case DsToKKPi from DsToPiKK /// \return inputFeatures vector - template - std::vector getInputFeatures(T1 const& candidate, - T2 const& prong0, T2 const& prong1, T2 const& prong2, bool const& caseDsToKKPi) + template + std::vector getInputFeatures(T1 const& candidate, bool const caseDsToKKPi) { std::vector inputFeatures; @@ -174,33 +185,33 @@ class HfMlResponseDsToKKPi : public HfMlResponse CHECK_AND_FILL_VEC_DS(impactParameterZ0); CHECK_AND_FILL_VEC_DS(impactParameterZ1); CHECK_AND_FILL_VEC_DS(impactParameterZ2); - // TPC PID variables - CHECK_AND_FILL_VEC_DS_FULL(prong0, nSigTpcPi0, tpcNSigmaPi); - CHECK_AND_FILL_VEC_DS_FULL(prong1, nSigTpcPi1, tpcNSigmaPi); - CHECK_AND_FILL_VEC_DS_FULL(prong2, nSigTpcPi2, tpcNSigmaPi); - CHECK_AND_FILL_VEC_DS_FULL(prong0, nSigTpcKa0, tpcNSigmaKa); - CHECK_AND_FILL_VEC_DS_FULL(prong1, nSigTpcKa1, tpcNSigmaKa); - CHECK_AND_FILL_VEC_DS_FULL(prong2, nSigTpcKa2, tpcNSigmaKa); - CHECK_AND_FILL_VEC_DS_FULL(prong0, nSigTofPi0, tofNSigmaPi); - CHECK_AND_FILL_VEC_DS_FULL(prong1, nSigTofPi1, tofNSigmaPi); - CHECK_AND_FILL_VEC_DS_FULL(prong2, nSigTofPi2, tofNSigmaPi); - CHECK_AND_FILL_VEC_DS_FULL(prong0, nSigTofKa0, tofNSigmaKa); - CHECK_AND_FILL_VEC_DS_FULL(prong1, nSigTofKa1, tofNSigmaKa); - CHECK_AND_FILL_VEC_DS_FULL(prong2, nSigTofKa2, tofNSigmaKa); - CHECK_AND_FILL_VEC_DS_OBJECT_SIGNED(prong0, prong2, nSigTpcKaExpKa0, tpcNSigmaKa); - CHECK_AND_FILL_VEC_DS_OBJECT_SIGNED(prong2, prong0, nSigTpcPiExpPi2, tpcNSigmaPi); - CHECK_AND_FILL_VEC_DS_OBJECT_SIGNED(prong0, prong2, nSigTofKaExpKa0, tofNSigmaKa); - CHECK_AND_FILL_VEC_DS_OBJECT_SIGNED(prong2, prong0, nSigTofPiExpPi2, tofNSigmaPi); + // TPC and TOF PID variables + CHECK_AND_FILL_VEC_DS_FULL(candidate, nSigTpcPi0, nSigTpcPi0); + CHECK_AND_FILL_VEC_DS_FULL(candidate, nSigTpcPi1, nSigTpcPi1); + CHECK_AND_FILL_VEC_DS_FULL(candidate, nSigTpcPi2, nSigTpcPi2); + CHECK_AND_FILL_VEC_DS_FULL(candidate, nSigTpcKa0, nSigTpcKa0); + CHECK_AND_FILL_VEC_DS_FULL(candidate, nSigTpcKa1, nSigTpcKa1); + CHECK_AND_FILL_VEC_DS_FULL(candidate, nSigTpcKa2, nSigTpcKa2); + CHECK_AND_FILL_VEC_DS_FULL(candidate, nSigTofPi0, nSigTofPi0); + CHECK_AND_FILL_VEC_DS_FULL(candidate, nSigTofPi1, nSigTofPi1); + CHECK_AND_FILL_VEC_DS_FULL(candidate, nSigTofPi2, nSigTofPi2); + CHECK_AND_FILL_VEC_DS_FULL(candidate, nSigTofKa0, nSigTofKa0); + CHECK_AND_FILL_VEC_DS_FULL(candidate, nSigTofKa1, nSigTofKa1); + CHECK_AND_FILL_VEC_DS_FULL(candidate, nSigTofKa2, nSigTofKa2); + CHECK_AND_FILL_VEC_DS_SIGNED(candidate, nSigTpcKaExpKa0, nSigTpcKa0, nSigTpcKa2); + CHECK_AND_FILL_VEC_DS_SIGNED(candidate, nSigTpcPiExpPi2, nSigTpcPi2, nSigTpcPi0); + CHECK_AND_FILL_VEC_DS_SIGNED(candidate, nSigTofKaExpKa0, nSigTofKa0, nSigTofKa2); + CHECK_AND_FILL_VEC_DS_SIGNED(candidate, nSigTofPiExpPi2, nSigTofPi2, nSigTofPi0); // Combined PID variables - CHECK_AND_FILL_VEC_DS_FULL(prong0, nSigTpcTofPi0, tpcTofNSigmaPi); - CHECK_AND_FILL_VEC_DS_FULL(prong1, nSigTpcTofPi1, tpcTofNSigmaPi); - CHECK_AND_FILL_VEC_DS_FULL(prong2, nSigTpcTofPi2, tpcTofNSigmaPi); - CHECK_AND_FILL_VEC_DS_FULL(prong0, nSigTpcTofKa0, tpcTofNSigmaKa); - CHECK_AND_FILL_VEC_DS_FULL(prong1, nSigTpcTofKa1, tpcTofNSigmaKa); - CHECK_AND_FILL_VEC_DS_FULL(prong2, nSigTpcTofKa2, tpcTofNSigmaKa); - CHECK_AND_FILL_VEC_DS_OBJECT_SIGNED(prong0, prong2, nSigTpcTofKaExpKa0, tpcTofNSigmaKa); - CHECK_AND_FILL_VEC_DS_OBJECT_SIGNED(prong2, prong0, nSigTpcTofPiExpPi2, tpcTofNSigmaPi); + CHECK_AND_FILL_VEC_DS_FULL(candidate, nSigTpcTofPi0, tpcTofNSigmaPi0); + CHECK_AND_FILL_VEC_DS_FULL(candidate, nSigTpcTofPi1, tpcTofNSigmaPi1); + CHECK_AND_FILL_VEC_DS_FULL(candidate, nSigTpcTofPi2, tpcTofNSigmaPi2); + CHECK_AND_FILL_VEC_DS_FULL(candidate, nSigTpcTofKa0, tpcTofNSigmaKa0); + CHECK_AND_FILL_VEC_DS_FULL(candidate, nSigTpcTofKa1, tpcTofNSigmaKa1); + CHECK_AND_FILL_VEC_DS_FULL(candidate, nSigTpcTofKa2, tpcTofNSigmaKa2); + CHECK_AND_FILL_VEC_DS_SIGNED(candidate, nSigTpcTofKaExpKa0, tpcTofNSigmaKa0, tpcTofNSigmaKa2); + CHECK_AND_FILL_VEC_DS_SIGNED(candidate, nSigTpcTofPiExpPi2, tpcTofNSigmaPi2, tpcTofNSigmaPi0); // Ds specific variables CHECK_AND_FILL_VEC_DS_HFHELPER_SIGNED(candidate, absCos3PiK, absCos3PiKDsToKKPi, absCos3PiKDsToPiKK); diff --git a/PWGHF/Core/HfMlResponseDstarToD0Pi.h b/PWGHF/Core/HfMlResponseDstarToD0Pi.h index 66fc3a712d4..be309743893 100644 --- a/PWGHF/Core/HfMlResponseDstarToD0Pi.h +++ b/PWGHF/Core/HfMlResponseDstarToD0Pi.h @@ -49,6 +49,14 @@ break; \ } +// Specific case of CHECK_AND_FILL_VEC_DSTAR_FULL(OBJECT, FEATURE, GETTER) +// where OBJECT is named candidate and FEATURE != GETTER +#define CHECK_AND_FILL_VEC_DSTAR_GETTER(FEATURE, GETTER) \ + case static_cast(InputFeaturesDstarToD0Pi::FEATURE): { \ + inputFeatures.emplace_back(candidate.GETTER()); \ + break; \ + } + // Very specific case of CHECK_AND_FILL_VEC_DSTAR_FULL(OBJECT, FEATURE, GETTER) // Use for push back different value for D*+ or D*- candidate #define CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE(POSGETTER, NEGGETTER, FEATURENAME) \ @@ -151,9 +159,8 @@ class HfMlResponseDstarToD0Pi : public HfMlResponse /// \param prong1 is the candidate's prong1 /// \param prongSoftPi is the candidate's prongSoftPi /// \return inputFeatures vector - template - std::vector getInputFeatures(T1 const& candidate, - T2 const& prong0, T2 const& prong1, T2 const& prongSoftPi) + template + std::vector getInputFeatures(T1 const& candidate) { std::vector inputFeatures; @@ -186,24 +193,24 @@ class HfMlResponseDstarToD0Pi : public HfMlResponse CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE(cosThetaStarD0, cosThetaStarD0Bar, cosThetaStarD0); CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE(invMassD0, invMassD0Bar, massD0); CHECK_AND_FILL_VEC_DSTAR_DELTA_MASS_D0(deltaMassD0); - CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE_FROMOBJECT(prong0, prong1, nSigmaTPCPiPr0, tpcNSigmaPi); - CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE_FROMOBJECT(prong0, prong1, nSigmaTPCKaPr0, tpcNSigmaKa); - CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE_FROMOBJECT(prong0, prong1, nSigmaTOFPiPr0, tofNSigmaPi); - CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE_FROMOBJECT(prong0, prong1, nSigmaTOFKaPr0, tofNSigmaKa); - CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE_FROMOBJECT(prong0, prong1, nSigmaTPCTOFPiPr0, tpcTofNSigmaPi); - CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE_FROMOBJECT(prong0, prong1, nSigmaTPCTOFKaPr0, tpcTofNSigmaKa); - CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE_FROMOBJECT(prong1, prong0, nSigmaTPCPiPr1, tpcNSigmaPi); - CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE_FROMOBJECT(prong1, prong0, nSigmaTPCKaPr1, tpcNSigmaKa); - CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE_FROMOBJECT(prong1, prong0, nSigmaTOFPiPr1, tofNSigmaPi); - CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE_FROMOBJECT(prong1, prong0, nSigmaTOFKaPr1, tofNSigmaKa); - CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE_FROMOBJECT(prong1, prong0, nSigmaTPCTOFPiPr1, tpcTofNSigmaPi); - CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE_FROMOBJECT(prong1, prong0, nSigmaTPCTOFKaPr1, tpcTofNSigmaKa); - CHECK_AND_FILL_VEC_DSTAR_FULL(prongSoftPi, nSigmaTPCPiPrSoftPi, tpcNSigmaPi); - CHECK_AND_FILL_VEC_DSTAR_FULL(prongSoftPi, nSigmaTPCKaPrSoftPi, tpcNSigmaKa); - CHECK_AND_FILL_VEC_DSTAR_FULL(prongSoftPi, nSigmaTOFPiPrSoftPi, tofNSigmaPi); - CHECK_AND_FILL_VEC_DSTAR_FULL(prongSoftPi, nSigmaTOFKaPrSoftPi, tofNSigmaKa); - CHECK_AND_FILL_VEC_DSTAR_FULL(prongSoftPi, nSigmaTPCTOFPiPrSoftPi, tpcTofNSigmaPi); - CHECK_AND_FILL_VEC_DSTAR_FULL(prongSoftPi, nSigmaTPCTOFKaPrSoftPi, tpcTofNSigmaKa); + CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE(nSigTpcPi0, nSigTpcPi1, nSigmaTPCPiPr0); + CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE(nSigTpcKa0, nSigTpcKa1, nSigmaTPCKaPr0); + CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE(nSigTofPi0, nSigTofPi1, nSigmaTOFPiPr0); + CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE(nSigTofKa0, nSigTofKa1, nSigmaTOFKaPr0); + CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE(tpcTofNSigmaPi0, tpcTofNSigmaPi1, nSigmaTPCTOFPiPr0); + CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE(tpcTofNSigmaKa0, tpcTofNSigmaKa1, nSigmaTPCTOFKaPr0); + CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE(nSigTpcPi1, nSigTpcPi0, nSigmaTPCPiPr1); + CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE(nSigTpcKa1, nSigTpcKa0, nSigmaTPCKaPr1); + CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE(nSigTofPi1, nSigTofPi0, nSigmaTOFPiPr1); + CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE(nSigTofKa1, nSigTofKa0, nSigmaTOFKaPr1); + CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE(tpcTofNSigmaPi1, tpcTofNSigmaPi0, nSigmaTPCTOFPiPr1); + CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE(tpcTofNSigmaKa1, tpcTofNSigmaKa0, nSigmaTPCTOFKaPr1); + CHECK_AND_FILL_VEC_DSTAR_GETTER(nSigmaTPCPiPrSoftPi, nSigTpcPi2); + CHECK_AND_FILL_VEC_DSTAR_GETTER(nSigmaTPCKaPrSoftPi, nSigTpcKa2); + CHECK_AND_FILL_VEC_DSTAR_GETTER(nSigmaTOFPiPrSoftPi, nSigTofPi2); + CHECK_AND_FILL_VEC_DSTAR_GETTER(nSigmaTOFKaPrSoftPi, nSigTofKa2); + CHECK_AND_FILL_VEC_DSTAR_GETTER(nSigmaTPCTOFPiPrSoftPi, tpcTofNSigmaPi2); + CHECK_AND_FILL_VEC_DSTAR_GETTER(nSigmaTPCTOFKaPrSoftPi, tpcTofNSigmaKa2); } } @@ -270,5 +277,6 @@ class HfMlResponseDstarToD0Pi : public HfMlResponse #undef CHECK_AND_FILL_VEC_DSTAR #undef CHECK_AND_FILL_VEC_DSTAR_CHARGEBASE #undef CHECK_AND_FILL_VEC_DSTAR_DELTA_MASS_D0 +#undef CHECK_AND_FILL_VEC_DSTAR_GETTER #endif // PWGHF_CORE_HFMLRESPONSEDSTARTOD0PI_H_ diff --git a/PWGHF/Core/HfMlResponseLcToPKPi.h b/PWGHF/Core/HfMlResponseLcToPKPi.h index ea4767b85c6..405e16cfc42 100644 --- a/PWGHF/Core/HfMlResponseLcToPKPi.h +++ b/PWGHF/Core/HfMlResponseLcToPKPi.h @@ -23,9 +23,9 @@ // Fill the map of available input features // the key is the feature's name (std::string) // the value is the corresponding value in EnumInputFeatures -#define FILL_MAP_LCTOPKPI(FEATURE) \ - { \ -#FEATURE, static_cast < uint8_t>(InputFeaturesLcToPKPi::FEATURE) \ +#define FILL_MAP_LCTOPKPI(FEATURE) \ + { \ + #FEATURE, static_cast(InputFeaturesLcToPKPi::FEATURE) \ } // Check if the index of mCachedIndices (index associated to a FEATURE) @@ -67,6 +67,18 @@ break; \ } +// Variation of CHECK_AND_FILL_VEC_LCTOPKPI_HFHELPER_SIGNED(OBJECT, FEATURE, GETTER1, GETTER2) +// where GETTER1 and GETTER2 are methods of the OBJECT +#define CHECK_AND_FILL_VEC_LCTOPKPI_SIGNED(OBJECT, FEATURE, GETTER1, GETTER2) \ + case static_cast(InputFeaturesLcToPKPi::FEATURE): { \ + if (caseLcToPKPi) { \ + inputFeatures.emplace_back(OBJECT.GETTER1()); \ + } else { \ + inputFeatures.emplace_back(OBJECT.GETTER2()); \ + } \ + break; \ + } + namespace o2::analysis { enum class InputFeaturesLcToPKPi : uint8_t { @@ -85,22 +97,22 @@ enum class InputFeaturesLcToPKPi : uint8_t { cpa, cpaXY, chi2PCA, - tpcNSigmaP0, // 0 + tpcNSigmaPr0, // 0 tpcNSigmaKa0, // 0 tpcNSigmaPi0, // 0 - tpcNSigmaP1, // 1 + tpcNSigmaPr1, // 1 tpcNSigmaKa1, // 1 tpcNSigmaPi1, // 1 - tpcNSigmaP2, // 2 + tpcNSigmaPr2, // 2 tpcNSigmaKa2, // 2 tpcNSigmaPi2, // 2 - tofNSigmaP0, // + tofNSigmaPr0, // tofNSigmaKa0, // tofNSigmaPi0, // - tofNSigmaP1, + tofNSigmaPr1, tofNSigmaKa1, tofNSigmaPi1, - tofNSigmaP2, + tofNSigmaPr2, tofNSigmaKa2, tofNSigmaPi2, tpcTofNSigmaPi0, @@ -135,9 +147,8 @@ class HfMlResponseLcToPKPi : public HfMlResponse /// \param prong1 is the candidate's prong1 /// \param prong2 is the candidate's prong2 /// \return inputFeatures vector - template - std::vector getInputFeatures(T1 const& candidate, - T2 const& prong0, T2 const& prong1, T2 const& prong2, bool const& caseLcToPKPi) + template + std::vector getInputFeatures(T1 const& candidate, bool const caseLcToPKPi) { std::vector inputFeatures; @@ -159,41 +170,47 @@ class HfMlResponseLcToPKPi : public HfMlResponse CHECK_AND_FILL_VEC_LCTOPKPI(cpaXY); CHECK_AND_FILL_VEC_LCTOPKPI(chi2PCA); // TPC PID variables - CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong0, tpcNSigmaP0, tpcNSigmaPr); - CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong0, tpcNSigmaKa0, tpcNSigmaKa); - CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong0, tpcNSigmaPi0, tpcNSigmaPi); - CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong1, tpcNSigmaP1, tpcNSigmaPr); - CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong1, tpcNSigmaKa1, tpcNSigmaKa); - CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong1, tpcNSigmaPi1, tpcNSigmaPi); - CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong2, tpcNSigmaP2, tpcNSigmaPr); - CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong2, tpcNSigmaKa2, tpcNSigmaKa); - CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong2, tpcNSigmaPi2, tpcNSigmaPi); - CHECK_AND_FILL_VEC_LCTOPKPI_OBJECT_SIGNED(prong0, prong2, tpcNSigmaPrExpPr0, tpcNSigmaPr); - CHECK_AND_FILL_VEC_LCTOPKPI_OBJECT_SIGNED(prong2, prong0, tpcNSigmaPiExpPi2, tpcNSigmaPi); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tpcNSigmaPr0, nSigTpcPr0); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tpcNSigmaKa0, nSigTpcKa0); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tpcNSigmaPi0, nSigTpcPi0); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tpcNSigmaPr1, nSigTpcPr1); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tpcNSigmaKa1, nSigTpcKa1); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tpcNSigmaPi1, nSigTpcPi1); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tpcNSigmaPr2, nSigTpcPr2); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tpcNSigmaKa2, nSigTpcKa2); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tpcNSigmaPi2, nSigTpcPi2); + // CHECK_AND_FILL_VEC_LCTOPKPI_OBJECT_SIGNED(prong0, prong2, tpcNSigmaPrExpPr0, tpcNSigmaPr); + // CHECK_AND_FILL_VEC_LCTOPKPI_OBJECT_SIGNED(prong2, prong0, tpcNSigmaPiExpPi2, tpcNSigmaPi); + CHECK_AND_FILL_VEC_LCTOPKPI_SIGNED(candidate, tpcNSigmaPrExpPr0, nSigTpcPr0, nSigTpcPr2); + CHECK_AND_FILL_VEC_LCTOPKPI_SIGNED(candidate, tpcNSigmaPiExpPi2, nSigTpcPi2, nSigTpcPi0); // TOF PID variables - CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong0, tofNSigmaP0, tofNSigmaPr); - CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong0, tofNSigmaKa0, tofNSigmaKa); - CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong0, tofNSigmaPi0, tofNSigmaPi); - CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong1, tofNSigmaP1, tofNSigmaPr); - CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong1, tofNSigmaKa1, tofNSigmaKa); - CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong1, tofNSigmaPi1, tofNSigmaPi); - CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong2, tofNSigmaP2, tofNSigmaPr); - CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong2, tofNSigmaKa2, tofNSigmaKa); - CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong2, tofNSigmaPi2, tofNSigmaPi); - CHECK_AND_FILL_VEC_LCTOPKPI_OBJECT_SIGNED(prong0, prong2, tofNSigmaPrExpPr0, tofNSigmaPr); - CHECK_AND_FILL_VEC_LCTOPKPI_OBJECT_SIGNED(prong2, prong0, tofNSigmaPiExpPi2, tofNSigmaPi); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tofNSigmaPr0, nSigTofPr0); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tofNSigmaKa0, nSigTofKa0); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tofNSigmaPi0, nSigTofPi0); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tofNSigmaPr1, nSigTofPr1); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tofNSigmaKa1, nSigTofKa1); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tofNSigmaPi1, nSigTofPi1); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tofNSigmaPr2, nSigTofPr2); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tofNSigmaKa2, nSigTofKa2); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tofNSigmaPi2, nSigTofPi2); + // CHECK_AND_FILL_VEC_LCTOPKPI_OBJECT_SIGNED(prong0, prong2, tofNSigmaPrExpPr0, tofNSigmaPr); + // CHECK_AND_FILL_VEC_LCTOPKPI_OBJECT_SIGNED(prong2, prong0, tofNSigmaPiExpPi2, tofNSigmaPi); + CHECK_AND_FILL_VEC_LCTOPKPI_SIGNED(candidate, tofNSigmaPrExpPr0, nSigTofPr0, nSigTofPr2); + CHECK_AND_FILL_VEC_LCTOPKPI_SIGNED(candidate, tofNSigmaPiExpPi2, nSigTofPi2, nSigTofPi0); // Combined PID variables - CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong0, tpcTofNSigmaPi0, tpcTofNSigmaPi); - CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong1, tpcTofNSigmaPi1, tpcTofNSigmaPi); - CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong2, tpcTofNSigmaPi2, tpcTofNSigmaPi); - CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong0, tpcTofNSigmaKa0, tpcTofNSigmaKa); - CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong1, tpcTofNSigmaKa1, tpcTofNSigmaKa); - CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong2, tpcTofNSigmaKa2, tpcTofNSigmaKa); - CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong0, tpcTofNSigmaPr0, tpcTofNSigmaPr); - CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong1, tpcTofNSigmaPr1, tpcTofNSigmaPr); - CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong2, tpcTofNSigmaPr2, tpcTofNSigmaPr); - CHECK_AND_FILL_VEC_LCTOPKPI_OBJECT_SIGNED(prong0, prong2, tpcTofNSigmaPrExpPr0, tpcTofNSigmaPr); - CHECK_AND_FILL_VEC_LCTOPKPI_OBJECT_SIGNED(prong2, prong0, tpcTofNSigmaPiExpPi2, tpcTofNSigmaPi); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tpcTofNSigmaPi0, tpcTofNSigmaPi0); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tpcTofNSigmaPi1, tpcTofNSigmaPi1); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tpcTofNSigmaPi2, tpcTofNSigmaPi2); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tpcTofNSigmaKa0, tpcTofNSigmaKa0); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tpcTofNSigmaKa1, tpcTofNSigmaKa1); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tpcTofNSigmaKa2, tpcTofNSigmaKa2); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tpcTofNSigmaPr0, tpcTofNSigmaPr0); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tpcTofNSigmaPr1, tpcTofNSigmaPr1); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tpcTofNSigmaPr2, tpcTofNSigmaPr2); + // CHECK_AND_FILL_VEC_LCTOPKPI_OBJECT_SIGNED(prong0, prong2, tpcTofNSigmaPrExpPr0, tpcTofNSigmaPr); + // CHECK_AND_FILL_VEC_LCTOPKPI_OBJECT_SIGNED(prong2, prong0, tpcTofNSigmaPiExpPi2, tpcTofNSigmaPi); + CHECK_AND_FILL_VEC_LCTOPKPI_SIGNED(candidate, tpcTofNSigmaPrExpPr0, tpcTofNSigmaPr0, tpcTofNSigmaPr2); + CHECK_AND_FILL_VEC_LCTOPKPI_SIGNED(candidate, tpcTofNSigmaPiExpPi2, tpcTofNSigmaPi2, tpcTofNSigmaPi0); } } @@ -221,25 +238,25 @@ class HfMlResponseLcToPKPi : public HfMlResponse FILL_MAP_LCTOPKPI(cpaXY), FILL_MAP_LCTOPKPI(chi2PCA), // TPC PID variables - FILL_MAP_LCTOPKPI(tpcNSigmaP0), + FILL_MAP_LCTOPKPI(tpcNSigmaPr0), FILL_MAP_LCTOPKPI(tpcNSigmaKa0), FILL_MAP_LCTOPKPI(tpcNSigmaPi0), - FILL_MAP_LCTOPKPI(tpcNSigmaP1), + FILL_MAP_LCTOPKPI(tpcNSigmaPr1), FILL_MAP_LCTOPKPI(tpcNSigmaKa1), FILL_MAP_LCTOPKPI(tpcNSigmaPi1), - FILL_MAP_LCTOPKPI(tpcNSigmaP2), + FILL_MAP_LCTOPKPI(tpcNSigmaPr2), FILL_MAP_LCTOPKPI(tpcNSigmaKa2), FILL_MAP_LCTOPKPI(tpcNSigmaPi2), FILL_MAP_LCTOPKPI(tpcNSigmaPrExpPr0), FILL_MAP_LCTOPKPI(tpcNSigmaPiExpPi2), // TOF PID variables - FILL_MAP_LCTOPKPI(tofNSigmaP0), + FILL_MAP_LCTOPKPI(tofNSigmaPr0), FILL_MAP_LCTOPKPI(tofNSigmaKa0), FILL_MAP_LCTOPKPI(tofNSigmaPi0), - FILL_MAP_LCTOPKPI(tofNSigmaP1), + FILL_MAP_LCTOPKPI(tofNSigmaPr1), FILL_MAP_LCTOPKPI(tofNSigmaKa1), FILL_MAP_LCTOPKPI(tofNSigmaPi1), - FILL_MAP_LCTOPKPI(tofNSigmaP2), + FILL_MAP_LCTOPKPI(tofNSigmaPr2), FILL_MAP_LCTOPKPI(tofNSigmaKa2), FILL_MAP_LCTOPKPI(tofNSigmaPi2), FILL_MAP_LCTOPKPI(tofNSigmaPrExpPr0), diff --git a/PWGHF/Core/HfMlResponseXicToPKPi.h b/PWGHF/Core/HfMlResponseXicToPKPi.h index 94542745772..d533c7fb8ab 100644 --- a/PWGHF/Core/HfMlResponseXicToPKPi.h +++ b/PWGHF/Core/HfMlResponseXicToPKPi.h @@ -61,6 +61,19 @@ break; \ } +// Variation of CHECK_AND_FILL_VEC_XIC_OBJECT_SIGNED(OBJECT, FEATURE, GETTER1, GETTER2) +// where GETTER1 and GETTER2 are methods of the OBJECT, and used +// depending on whether the candidate is a XicToPKPi or a XicToPiKP +#define CHECK_AND_FILL_VEC_XIC_SIGNED(OBJECT, FEATURE, GETTER1, GETTER2) \ + case static_cast(InputFeaturesXicToPKPi::FEATURE): { \ + if (caseXicToPKPi) { \ + inputFeatures.emplace_back(OBJECT.GETTER1()); \ + } else { \ + inputFeatures.emplace_back(OBJECT.GETTER2()); \ + } \ + break; \ + } + namespace o2::analysis { enum class InputFeaturesXicToPKPi : uint8_t { @@ -79,22 +92,22 @@ enum class InputFeaturesXicToPKPi : uint8_t { cpa, cpaXY, chi2PCA, - tpcNSigmaP0, // 0 + tpcNSigmaPr0, // 0 tpcNSigmaKa0, // 0 tpcNSigmaPi0, // 0 - tpcNSigmaP1, // 1 + tpcNSigmaPr1, // 1 tpcNSigmaKa1, // 1 tpcNSigmaPi1, // 1 - tpcNSigmaP2, // 2 + tpcNSigmaPr2, // 2 tpcNSigmaKa2, // 2 tpcNSigmaPi2, // 2 - tofNSigmaP0, // + tofNSigmaPr0, // tofNSigmaKa0, // tofNSigmaPi0, // - tofNSigmaP1, + tofNSigmaPr1, tofNSigmaKa1, tofNSigmaPi1, - tofNSigmaP2, + tofNSigmaPr2, tofNSigmaKa2, tofNSigmaPi2, tpcTofNSigmaPi0, @@ -129,9 +142,8 @@ class HfMlResponseXicToPKPi : public HfMlResponse /// \param prong1 is the candidate's prong1 /// \param prong2 is the candidate's prong2 /// \return inputFeatures vector - template - std::vector getInputFeatures(T1 const& candidate, - T2 const& prong0, T2 const& prong1, T2 const& prong2, bool const& caseXicToPKPi) + template + std::vector getInputFeatures(T1 const& candidate, bool const caseXicToPKPi) { std::vector inputFeatures; @@ -153,41 +165,41 @@ class HfMlResponseXicToPKPi : public HfMlResponse CHECK_AND_FILL_VEC_XIC(cpaXY); CHECK_AND_FILL_VEC_XIC(chi2PCA); // TPC PID variables - CHECK_AND_FILL_VEC_XIC_FULL(prong0, tpcNSigmaP0, tpcNSigmaPr); - CHECK_AND_FILL_VEC_XIC_FULL(prong0, tpcNSigmaKa0, tpcNSigmaKa); - CHECK_AND_FILL_VEC_XIC_FULL(prong0, tpcNSigmaPi0, tpcNSigmaPi); - CHECK_AND_FILL_VEC_XIC_FULL(prong1, tpcNSigmaP1, tpcNSigmaPr); - CHECK_AND_FILL_VEC_XIC_FULL(prong1, tpcNSigmaKa1, tpcNSigmaKa); - CHECK_AND_FILL_VEC_XIC_FULL(prong1, tpcNSigmaPi1, tpcNSigmaPi); - CHECK_AND_FILL_VEC_XIC_FULL(prong2, tpcNSigmaP2, tpcNSigmaPr); - CHECK_AND_FILL_VEC_XIC_FULL(prong2, tpcNSigmaKa2, tpcNSigmaKa); - CHECK_AND_FILL_VEC_XIC_FULL(prong2, tpcNSigmaPi2, tpcNSigmaPi); - CHECK_AND_FILL_VEC_XIC_OBJECT_SIGNED(prong0, prong2, tpcNSigmaPrExpPr0, tpcNSigmaPr); - CHECK_AND_FILL_VEC_XIC_OBJECT_SIGNED(prong2, prong0, tpcNSigmaPiExpPi2, tpcNSigmaPi); + CHECK_AND_FILL_VEC_XIC_FULL(candidate, tpcNSigmaPr0, nSigTpcPr0); + CHECK_AND_FILL_VEC_XIC_FULL(candidate, tpcNSigmaKa0, nSigTpcKa0); + CHECK_AND_FILL_VEC_XIC_FULL(candidate, tpcNSigmaPi0, nSigTpcPi0); + CHECK_AND_FILL_VEC_XIC_FULL(candidate, tpcNSigmaPr1, nSigTpcPr1); + CHECK_AND_FILL_VEC_XIC_FULL(candidate, tpcNSigmaKa1, nSigTpcKa1); + CHECK_AND_FILL_VEC_XIC_FULL(candidate, tpcNSigmaPi1, nSigTpcPi1); + CHECK_AND_FILL_VEC_XIC_FULL(candidate, tpcNSigmaPr2, nSigTpcPr2); + CHECK_AND_FILL_VEC_XIC_FULL(candidate, tpcNSigmaKa2, nSigTpcKa2); + CHECK_AND_FILL_VEC_XIC_FULL(candidate, tpcNSigmaPi2, nSigTpcPi2); + CHECK_AND_FILL_VEC_XIC_SIGNED(candidate, tpcNSigmaPrExpPr0, nSigTpcPr0, nSigTpcPr2); + CHECK_AND_FILL_VEC_XIC_SIGNED(candidate, tpcNSigmaPiExpPi2, nSigTpcPi2, nSigTpcPi0); // TOF PID variables - CHECK_AND_FILL_VEC_XIC_FULL(prong0, tofNSigmaP0, tofNSigmaPr); - CHECK_AND_FILL_VEC_XIC_FULL(prong0, tofNSigmaKa0, tofNSigmaKa); - CHECK_AND_FILL_VEC_XIC_FULL(prong0, tofNSigmaPi0, tofNSigmaPi); - CHECK_AND_FILL_VEC_XIC_FULL(prong1, tofNSigmaP1, tofNSigmaPr); - CHECK_AND_FILL_VEC_XIC_FULL(prong1, tofNSigmaKa1, tofNSigmaKa); - CHECK_AND_FILL_VEC_XIC_FULL(prong1, tofNSigmaPi1, tofNSigmaPi); - CHECK_AND_FILL_VEC_XIC_FULL(prong2, tofNSigmaP2, tofNSigmaPr); - CHECK_AND_FILL_VEC_XIC_FULL(prong2, tofNSigmaKa2, tofNSigmaKa); - CHECK_AND_FILL_VEC_XIC_FULL(prong2, tofNSigmaPi2, tofNSigmaPi); - CHECK_AND_FILL_VEC_XIC_OBJECT_SIGNED(prong0, prong2, tofNSigmaPrExpPr0, tofNSigmaPr); - CHECK_AND_FILL_VEC_XIC_OBJECT_SIGNED(prong2, prong0, tofNSigmaPiExpPi2, tofNSigmaPi); + CHECK_AND_FILL_VEC_XIC_FULL(candidate, tofNSigmaPr0, nSigTofPr0); + CHECK_AND_FILL_VEC_XIC_FULL(candidate, tofNSigmaKa0, nSigTofKa0); + CHECK_AND_FILL_VEC_XIC_FULL(candidate, tofNSigmaPi0, nSigTofPi0); + CHECK_AND_FILL_VEC_XIC_FULL(candidate, tofNSigmaPr1, nSigTofPr1); + CHECK_AND_FILL_VEC_XIC_FULL(candidate, tofNSigmaKa1, nSigTofKa1); + CHECK_AND_FILL_VEC_XIC_FULL(candidate, tofNSigmaPi1, nSigTofPi1); + CHECK_AND_FILL_VEC_XIC_FULL(candidate, tofNSigmaPr2, nSigTofPr2); + CHECK_AND_FILL_VEC_XIC_FULL(candidate, tofNSigmaKa2, nSigTofKa2); + CHECK_AND_FILL_VEC_XIC_FULL(candidate, tofNSigmaPi2, nSigTofPi2); + CHECK_AND_FILL_VEC_XIC_SIGNED(candidate, tofNSigmaPrExpPr0, nSigTofPr0, nSigTofPr2); + CHECK_AND_FILL_VEC_XIC_SIGNED(candidate, tofNSigmaPiExpPi2, nSigTofPi2, nSigTofPi0); // Combined PID variables - CHECK_AND_FILL_VEC_XIC_FULL(prong0, tpcTofNSigmaPi0, tpcTofNSigmaPi); - CHECK_AND_FILL_VEC_XIC_FULL(prong1, tpcTofNSigmaPi1, tpcTofNSigmaPi); - CHECK_AND_FILL_VEC_XIC_FULL(prong2, tpcTofNSigmaPi2, tpcTofNSigmaPi); - CHECK_AND_FILL_VEC_XIC_FULL(prong0, tpcTofNSigmaKa0, tpcTofNSigmaKa); - CHECK_AND_FILL_VEC_XIC_FULL(prong1, tpcTofNSigmaKa1, tpcTofNSigmaKa); - CHECK_AND_FILL_VEC_XIC_FULL(prong2, tpcTofNSigmaKa2, tpcTofNSigmaKa); - CHECK_AND_FILL_VEC_XIC_FULL(prong0, tpcTofNSigmaPr0, tpcTofNSigmaPr); - CHECK_AND_FILL_VEC_XIC_FULL(prong1, tpcTofNSigmaPr1, tpcTofNSigmaPr); - CHECK_AND_FILL_VEC_XIC_FULL(prong2, tpcTofNSigmaPr2, tpcTofNSigmaPr); - CHECK_AND_FILL_VEC_XIC_OBJECT_SIGNED(prong0, prong2, tpcTofNSigmaPrExpPr0, tpcTofNSigmaPr); - CHECK_AND_FILL_VEC_XIC_OBJECT_SIGNED(prong2, prong0, tpcTofNSigmaPiExpPi2, tpcTofNSigmaPi); + CHECK_AND_FILL_VEC_XIC_FULL(candidate, tpcTofNSigmaPi0, tpcTofNSigmaPi0); + CHECK_AND_FILL_VEC_XIC_FULL(candidate, tpcTofNSigmaPi1, tpcTofNSigmaPi1); + CHECK_AND_FILL_VEC_XIC_FULL(candidate, tpcTofNSigmaPi2, tpcTofNSigmaPi2); + CHECK_AND_FILL_VEC_XIC_FULL(candidate, tpcTofNSigmaKa0, tpcTofNSigmaKa0); + CHECK_AND_FILL_VEC_XIC_FULL(candidate, tpcTofNSigmaKa1, tpcTofNSigmaKa1); + CHECK_AND_FILL_VEC_XIC_FULL(candidate, tpcTofNSigmaKa2, tpcTofNSigmaKa2); + CHECK_AND_FILL_VEC_XIC_FULL(candidate, tpcTofNSigmaPr0, tpcTofNSigmaPr0); + CHECK_AND_FILL_VEC_XIC_FULL(candidate, tpcTofNSigmaPr1, tpcTofNSigmaPr1); + CHECK_AND_FILL_VEC_XIC_FULL(candidate, tpcTofNSigmaPr2, tpcTofNSigmaPr2); + CHECK_AND_FILL_VEC_XIC_SIGNED(candidate, tpcTofNSigmaPrExpPr0, tpcTofNSigmaPr0, tpcTofNSigmaPr2); + CHECK_AND_FILL_VEC_XIC_SIGNED(candidate, tpcTofNSigmaPiExpPi2, tpcTofNSigmaPi2, tpcTofNSigmaPi0); } } @@ -215,25 +227,25 @@ class HfMlResponseXicToPKPi : public HfMlResponse FILL_MAP_XIC(cpaXY), FILL_MAP_XIC(chi2PCA), // TPC PID variables - FILL_MAP_XIC(tpcNSigmaP0), + FILL_MAP_XIC(tpcNSigmaPr0), FILL_MAP_XIC(tpcNSigmaKa0), FILL_MAP_XIC(tpcNSigmaPi0), - FILL_MAP_XIC(tpcNSigmaP1), + FILL_MAP_XIC(tpcNSigmaPr1), FILL_MAP_XIC(tpcNSigmaKa1), FILL_MAP_XIC(tpcNSigmaPi1), - FILL_MAP_XIC(tpcNSigmaP2), + FILL_MAP_XIC(tpcNSigmaPr2), FILL_MAP_XIC(tpcNSigmaKa2), FILL_MAP_XIC(tpcNSigmaPi2), FILL_MAP_XIC(tpcNSigmaPrExpPr0), FILL_MAP_XIC(tpcNSigmaPiExpPi2), // TOF PID variables - FILL_MAP_XIC(tofNSigmaP0), + FILL_MAP_XIC(tofNSigmaPr0), FILL_MAP_XIC(tofNSigmaKa0), FILL_MAP_XIC(tofNSigmaPi0), - FILL_MAP_XIC(tofNSigmaP1), + FILL_MAP_XIC(tofNSigmaPr1), FILL_MAP_XIC(tofNSigmaKa1), FILL_MAP_XIC(tofNSigmaPi1), - FILL_MAP_XIC(tofNSigmaP2), + FILL_MAP_XIC(tofNSigmaPr2), FILL_MAP_XIC(tofNSigmaKa2), FILL_MAP_XIC(tofNSigmaPi2), FILL_MAP_XIC(tofNSigmaPrExpPr0), diff --git a/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx b/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx index 6856154e1ed..fc6c9487700 100644 --- a/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx +++ b/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx @@ -168,10 +168,10 @@ struct HfDataCreatorCharmHadPiReduced { using TracksPidWithSel = soa::Join; using TracksPidWithSelAndMc = soa::Join; - using CandsDplusFiltered = soa::Filtered>; - using CandsDplusFilteredWithMl = soa::Filtered>; - using CandsDsFiltered = soa::Filtered>; - using CandsDsFilteredWithMl = soa::Filtered>; + using CandsDplusFiltered = soa::Filtered>; + using CandsDplusFilteredWithMl = soa::Filtered>; + using CandsDsFiltered = soa::Filtered>; + using CandsDsFilteredWithMl = soa::Filtered>; using CandsD0Filtered = soa::Filtered>; using CandsD0FilteredWithMl = soa::Filtered>; @@ -984,9 +984,9 @@ struct HfDataCreatorCharmHadPiReduced { trackParCovCharmHad.getSigmaTglSnp(), trackParCovCharmHad.getSigmaTgl2(), trackParCovCharmHad.getSigma1PtY(), trackParCovCharmHad.getSigma1PtZ(), trackParCovCharmHad.getSigma1PtSnp(), trackParCovCharmHad.getSigma1PtTgl(), trackParCovCharmHad.getSigma1Pt2()); - hfCandPidProng0(charmHadDauTracks[0].tpcNSigmaPi(), charmHadDauTracks[0].tofNSigmaPi(), charmHadDauTracks[0].tpcNSigmaKa(), charmHadDauTracks[0].tofNSigmaKa(), charmHadDauTracks[0].hasTOF(), charmHadDauTracks[0].hasTPC()); - hfCandPidProng1(charmHadDauTracks[1].tpcNSigmaPi(), charmHadDauTracks[1].tofNSigmaPi(), charmHadDauTracks[1].tpcNSigmaKa(), charmHadDauTracks[1].tofNSigmaKa(), charmHadDauTracks[1].hasTOF(), charmHadDauTracks[1].hasTPC()); - hfCandPidProng2(charmHadDauTracks[2].tpcNSigmaPi(), charmHadDauTracks[2].tofNSigmaPi(), charmHadDauTracks[2].tpcNSigmaKa(), charmHadDauTracks[2].tofNSigmaKa(), charmHadDauTracks[2].hasTOF(), charmHadDauTracks[2].hasTPC()); + hfCandPidProng0(candC.nSigTpcPi0(), candC.nSigTofPi0(), candC.nSigTpcKa0(), candC.nSigTofKa0(), charmHadDauTracks[0].hasTOF(), charmHadDauTracks[0].hasTPC()); + hfCandPidProng1(candC.nSigTpcPi1(), candC.nSigTofPi1(), candC.nSigTpcKa1(), candC.nSigTofKa1(), charmHadDauTracks[1].hasTOF(), charmHadDauTracks[1].hasTPC()); + hfCandPidProng2(candC.nSigTpcPi2(), candC.nSigTofPi2(), candC.nSigTpcKa2(), candC.nSigTofKa2(), charmHadDauTracks[2].hasTOF(), charmHadDauTracks[2].hasTPC()); if constexpr (withMl) { if constexpr (decChannel == DecayChannel::B0ToDminusPi) { hfCand3ProngMl(candC.mlProbDplusToPiKPi()[0], candC.mlProbDplusToPiKPi()[1], candC.mlProbDplusToPiKPi()[2], -1., -1., -1.); diff --git a/PWGHF/D2H/Tasks/taskXic.cxx b/PWGHF/D2H/Tasks/taskXic.cxx index 6ec5e39a687..24c3e1b3814 100644 --- a/PWGHF/D2H/Tasks/taskXic.cxx +++ b/PWGHF/D2H/Tasks/taskXic.cxx @@ -71,7 +71,7 @@ struct HfTaskXic { Filter filterSelectCandidates = (aod::hf_sel_candidate_xic::isSelXicToPKPi >= selectionFlagXic || aod::hf_sel_candidate_xic::isSelXicToPiKP >= selectionFlagXic); - Partition> selectedMCXicCandidates = (aod::hf_sel_candidate_xic::isSelXicToPKPi >= selectionFlagXic || aod::hf_sel_candidate_xic::isSelXicToPiKP >= selectionFlagXic); + Partition> selectedMCXicCandidates = (aod::hf_sel_candidate_xic::isSelXicToPKPi >= selectionFlagXic || aod::hf_sel_candidate_xic::isSelXicToPiKP >= selectionFlagXic); HistogramRegistry registry{ "registry", // histo not in pt bins @@ -325,30 +325,30 @@ struct HfTaskXic { auto momentumProng2 = trackProng2.p(); // TPC nSigma histograms - registry.fill(HIST("Data/hPVsTPCNSigmaPr_Prong0"), momentumProng0, trackProng0.tpcNSigmaPr()); - registry.fill(HIST("Data/hPVsTPCNSigmaPi_Prong0"), momentumProng0, trackProng0.tpcNSigmaPi()); - registry.fill(HIST("Data/hPVsTPCNSigmaKa_Prong0"), momentumProng0, trackProng0.tpcNSigmaKa()); + registry.fill(HIST("Data/hPVsTPCNSigmaPr_Prong0"), momentumProng0, candidate.nSigTpcPr0()); + registry.fill(HIST("Data/hPVsTPCNSigmaPi_Prong0"), momentumProng0, candidate.nSigTpcPi0()); + registry.fill(HIST("Data/hPVsTPCNSigmaKa_Prong0"), momentumProng0, candidate.nSigTpcKa0()); - registry.fill(HIST("Data/hPVsTPCNSigmaPr_Prong1"), momentumProng1, trackProng1.tpcNSigmaPr()); - registry.fill(HIST("Data/hPVsTPCNSigmaPi_Prong1"), momentumProng1, trackProng1.tpcNSigmaPi()); - registry.fill(HIST("Data/hPVsTPCNSigmaKa_Prong1"), momentumProng1, trackProng1.tpcNSigmaKa()); + registry.fill(HIST("Data/hPVsTPCNSigmaPr_Prong1"), momentumProng1, candidate.nSigTpcPr1()); + registry.fill(HIST("Data/hPVsTPCNSigmaPi_Prong1"), momentumProng1, candidate.nSigTpcPi1()); + registry.fill(HIST("Data/hPVsTPCNSigmaKa_Prong1"), momentumProng1, candidate.nSigTpcKa1()); - registry.fill(HIST("Data/hPVsTPCNSigmaPr_Prong2"), momentumProng2, trackProng2.tpcNSigmaPr()); - registry.fill(HIST("Data/hPVsTPCNSigmaPi_Prong2"), momentumProng2, trackProng2.tpcNSigmaPi()); - registry.fill(HIST("Data/hPVsTPCNSigmaKa_Prong2"), momentumProng2, trackProng2.tpcNSigmaKa()); + registry.fill(HIST("Data/hPVsTPCNSigmaPr_Prong2"), momentumProng2, candidate.nSigTpcPr2()); + registry.fill(HIST("Data/hPVsTPCNSigmaPi_Prong2"), momentumProng2, candidate.nSigTpcPi2()); + registry.fill(HIST("Data/hPVsTPCNSigmaKa_Prong2"), momentumProng2, candidate.nSigTpcKa2()); // TOF nSigma histograms - registry.fill(HIST("Data/hPVsTOFNSigmaPr_Prong0"), momentumProng0, trackProng0.tofNSigmaPr()); - registry.fill(HIST("Data/hPVsTOFNSigmaPi_Prong0"), momentumProng0, trackProng0.tofNSigmaPi()); - registry.fill(HIST("Data/hPVsTOFNSigmaKa_Prong0"), momentumProng0, trackProng0.tofNSigmaKa()); + registry.fill(HIST("Data/hPVsTOFNSigmaPr_Prong0"), momentumProng0, candidate.nSigTofPr0()); + registry.fill(HIST("Data/hPVsTOFNSigmaPi_Prong0"), momentumProng0, candidate.nSigTofPi0()); + registry.fill(HIST("Data/hPVsTOFNSigmaKa_Prong0"), momentumProng0, candidate.nSigTofKa0()); - registry.fill(HIST("Data/hPVsTOFNSigmaPr_Prong1"), momentumProng1, trackProng1.tofNSigmaPr()); - registry.fill(HIST("Data/hPVsTOFNSigmaPi_Prong1"), momentumProng1, trackProng1.tofNSigmaPi()); - registry.fill(HIST("Data/hPVsTOFNSigmaKa_Prong1"), momentumProng1, trackProng1.tofNSigmaKa()); + registry.fill(HIST("Data/hPVsTOFNSigmaPr_Prong1"), momentumProng1, candidate.nSigTofPr1()); + registry.fill(HIST("Data/hPVsTOFNSigmaPi_Prong1"), momentumProng1, candidate.nSigTofPi1()); + registry.fill(HIST("Data/hPVsTOFNSigmaKa_Prong1"), momentumProng1, candidate.nSigTofKa1()); - registry.fill(HIST("Data/hPVsTOFNSigmaPr_Prong2"), momentumProng2, trackProng2.tofNSigmaPr()); - registry.fill(HIST("Data/hPVsTOFNSigmaPi_Prong2"), momentumProng2, trackProng2.tofNSigmaPi()); - registry.fill(HIST("Data/hPVsTOFNSigmaKa_Prong2"), momentumProng2, trackProng2.tofNSigmaKa()); + registry.fill(HIST("Data/hPVsTOFNSigmaPr_Prong2"), momentumProng2, candidate.nSigTofPr2()); + registry.fill(HIST("Data/hPVsTOFNSigmaPi_Prong2"), momentumProng2, candidate.nSigTofPi2()); + registry.fill(HIST("Data/hPVsTOFNSigmaKa_Prong2"), momentumProng2, candidate.nSigTofKa2()); // THnSparse if (enableTHn) { @@ -383,11 +383,11 @@ struct HfTaskXic { } } } // thn for Xic - } // loop candidates - } // end process data + } // loop candidates + } // end process data void processDataStd(aod::Collision const& collision, - soa::Filtered> const& candidates, + soa::Filtered> const& candidates, TracksWPid const& tracks) { analysisData(collision, candidates, tracks); @@ -395,7 +395,7 @@ struct HfTaskXic { PROCESS_SWITCH(HfTaskXic, processDataStd, "Process Data with the standard method", true); void processDataWithMl(aod::Collision const& collision, - soa::Filtered> const& candidatesMl, TracksWPid const& tracks) + soa::Filtered> const& candidatesMl, TracksWPid const& tracks) { analysisData(collision, candidatesMl, tracks); } @@ -567,7 +567,7 @@ struct HfTaskXic { registry.fill(HIST("MC/reconstructed/background/hDecLenErrBg"), candidate.errorDecayLength(), ptCandidate); registry.fill(HIST("MC/reconstructed/background/hChi2PCARecBg"), candidate.chi2PCA(), ptCandidate); } // Xic background - } // candidate loop + } // candidate loop // MC gen. for (const auto& particle : mcParticles) { @@ -600,7 +600,7 @@ struct HfTaskXic { } } } - void processMcStd(soa::Filtered> const& selectedCandidatesMc, + void processMcStd(soa::Filtered> const& selectedCandidatesMc, soa::Join const& mcParticles, aod::TracksWMc const& tracksWithMc) { @@ -608,7 +608,7 @@ struct HfTaskXic { } PROCESS_SWITCH(HfTaskXic, processMcStd, "Process MC with the standard method", false); - void processMcWithMl(soa::Filtered> const& selectedCandidatesMlMc, + void processMcWithMl(soa::Filtered> const& selectedCandidatesMlMc, soa::Join const& mcParticles, aod::TracksWMc const& tracksWithMc) { diff --git a/PWGHF/DataModel/CandidateReconstructionTables.h b/PWGHF/DataModel/CandidateReconstructionTables.h index 1f464bbb592..1210ea896fa 100644 --- a/PWGHF/DataModel/CandidateReconstructionTables.h +++ b/PWGHF/DataModel/CandidateReconstructionTables.h @@ -1042,6 +1042,7 @@ DECLARE_SOA_EXTENDED_TABLE_USER(HfCand3ProngExt, HfCand3ProngBase, "HFCAND3PEXT" hf_cand_3prong::Px, hf_cand_3prong::Py, hf_cand_3prong::Pz); using HfCand3Prong = HfCand3ProngExt; +using HfCand3ProngWPid = soa::Join; DECLARE_SOA_TABLE(HfCand3ProngKF, "AOD", "HFCAND3PKF", hf_cand_3prong::KfXError, hf_cand_3prong::KfYError, hf_cand_3prong::KfZError, @@ -2440,6 +2441,7 @@ DECLARE_SOA_EXTENDED_TABLE_USER(HfD0FromDstarExt, HfD0FromDstarBase, "HFD0FRMDST hf_cand_dstar::PxD0, hf_cand_dstar::PyD0, hf_cand_dstar::PzD0); using HfD0FromDstar = HfD0FromDstarExt; +using HfD0FromDstarWPid = soa::Join; DECLARE_SOA_TABLE(HfCandDstarBase, "AOD", "HFCANDDSTRBASE", o2::soa::Index<>, @@ -2490,6 +2492,7 @@ DECLARE_SOA_EXTENDED_TABLE_USER(HfCandDstarExt, HfCandDstarBase, "HFCANDDSTREXT" using HfCandDstars = HfCandDstarExt; using HfCandDstar = HfCandDstars::iterator; +using HfCandDstarsWPid = soa::Join; // table with results of reconstruction level MC matching DECLARE_SOA_TABLE(HfCandDstarMcRec, "AOD", "HFCANDDSTRMCREC", diff --git a/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx b/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx index 4c2696b41d7..63b0a61b0b5 100644 --- a/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx +++ b/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx @@ -145,8 +145,8 @@ struct HfFemtoDreamProducer { float magField; int runNumber; - using CandidateLc = soa::Join; - using CandidateLcMc = soa::Join; + using CandidateLc = soa::Join; + using CandidateLcMc = soa::Join; using FemtoFullCollision = soa::Join::iterator; using FemtoFullCollisionMc = soa::Join::iterator; @@ -457,11 +457,11 @@ struct HfFemtoDreamProducer { isSelectedMlLcToPKPi = false; isSelectedMlLcToPiKP = false; if (candidate.mlProbLcToPKPi().size() > 0) { - std::vector inputFeaturesLcToPKPi = hfMlResponse.getInputFeatures(candidate, trackPos1, trackNeg, trackPos2, true); + std::vector inputFeaturesLcToPKPi = hfMlResponse.getInputFeatures(candidate, true); isSelectedMlLcToPKPi = hfMlResponse.isSelectedMl(inputFeaturesLcToPKPi, candidate.pt(), outputMlPKPi); } if (candidate.mlProbLcToPiKP().size() > 0) { - std::vector inputFeaturesLcToPiKP = hfMlResponse.getInputFeatures(candidate, trackPos1, trackNeg, trackPos2, false); + std::vector inputFeaturesLcToPiKP = hfMlResponse.getInputFeatures(candidate, false); isSelectedMlLcToPiKP = hfMlResponse.isSelectedMl(inputFeaturesLcToPiKP, candidate.pt(), outputMlPKPi); } if (!isSelectedMlLcToPKPi && !isSelectedMlLcToPiKP) diff --git a/PWGHF/TableProducer/candidateCreator3Prong.cxx b/PWGHF/TableProducer/candidateCreator3Prong.cxx index b8e43e61c75..b5d47d2cacc 100644 --- a/PWGHF/TableProducer/candidateCreator3Prong.cxx +++ b/PWGHF/TableProducer/candidateCreator3Prong.cxx @@ -47,8 +47,9 @@ #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/Utils/utilsBfieldCCDB.h" #include "PWGHF/Utils/utilsEvSelHf.h" -#include "PWGHF/Utils/utilsTrkCandHf.h" #include "PWGHF/Utils/utilsMcGen.h" +#include "PWGHF/Utils/utilsPid.h" +#include "PWGHF/Utils/utilsTrkCandHf.h" using namespace o2; using namespace o2::analysis; @@ -60,11 +61,21 @@ using namespace o2::hf_occupancy; using namespace o2::constants::physics; using namespace o2::framework; using namespace o2::framework::expressions; +using namespace o2::aod::pid_tpc_tof_utils; /// Reconstruction of heavy-flavour 3-prong decay candidates struct HfCandidateCreator3Prong { Produces rowCandidateBase; Produces rowCandidateKF; + Produces rowProng0PidPi; + Produces rowProng0PidKa; + Produces rowProng0PidPr; + Produces rowProng1PidPi; + Produces rowProng1PidKa; + Produces rowProng1PidPr; + Produces rowProng2PidPi; + Produces rowProng2PidKa; + Produces rowProng2PidPr; // vertexing Configurable propagateToPCA{"propagateToPCA", true, "create tracks version propagated to PCA"}; @@ -111,6 +122,7 @@ struct HfCandidateCreator3Prong { using FilteredHf3Prongs = soa::Filtered; using FilteredPvRefitHf3Prongs = soa::Filtered>; + using TracksWCovExtraPidPiKaPr = soa::Join; // filter candidates Filter filterSelected3Prongs = (createDplus && (o2::aod::hf_track_index::hfflag & static_cast(BIT(aod::hf_cand_3prong::DecayType::DplusToPiKPi))) != static_cast(0)) || (createDs && (o2::aod::hf_track_index::hfflag & static_cast(BIT(aod::hf_cand_3prong::DecayType::DsToKKPi))) != static_cast(0)) || (createLc && (o2::aod::hf_track_index::hfflag & static_cast(BIT(aod::hf_cand_3prong::DecayType::LcToPKPi))) != static_cast(0)) || (createXic && (o2::aod::hf_track_index::hfflag & static_cast(BIT(aod::hf_cand_3prong::DecayType::XicToPKPi))) != static_cast(0)); @@ -202,10 +214,24 @@ struct HfCandidateCreator3Prong { setLabelHistoCands(hCandidates); } + template + void fillProngsPid(TRK const& track0, TRK const& track1, TRK const& track2) + { + fillProngPid(track0, rowProng0PidPi); + fillProngPid(track0, rowProng0PidKa); + fillProngPid(track0, rowProng0PidPr); + fillProngPid(track1, rowProng1PidPi); + fillProngPid(track1, rowProng1PidKa); + fillProngPid(track1, rowProng1PidPr); + fillProngPid(track2, rowProng2PidPi); + fillProngPid(track2, rowProng2PidKa); + fillProngPid(track2, rowProng2PidPr); + } + template void runCreator3ProngWithDCAFitterN(Coll const&, Cand const& rowsTrackIndexProng3, - aod::TracksWCovExtra const&, + TracksWCovExtraPidPiKaPr const&, aod::BCsWithTimestamps const& /*bcWithTimeStamps*/) { // loop over triplets of track indices @@ -220,9 +246,9 @@ struct HfCandidateCreator3Prong { continue; } - auto track0 = rowTrackIndexProng3.template prong0_as(); - auto track1 = rowTrackIndexProng3.template prong1_as(); - auto track2 = rowTrackIndexProng3.template prong2_as(); + auto track0 = rowTrackIndexProng3.template prong0_as(); + auto track1 = rowTrackIndexProng3.template prong1_as(); + auto track2 = rowTrackIndexProng3.template prong2_as(); auto trackParVar0 = getTrackParCov(track0); auto trackParVar1 = getTrackParCov(track1); auto trackParVar2 = getTrackParCov(track2); @@ -345,6 +371,9 @@ struct HfCandidateCreator3Prong { rowTrackIndexProng3.prong0Id(), rowTrackIndexProng3.prong1Id(), rowTrackIndexProng3.prong2Id(), nProngsContributorsPV, bitmapProngsContributorsPV, rowTrackIndexProng3.hfflag()); + // fill candidate prong PID rows + fillProngsPid(track0, track1, track2); + // fill histograms if (fillHistograms) { // calculate invariant mass @@ -370,7 +399,7 @@ struct HfCandidateCreator3Prong { template void runCreator3ProngWithKFParticle(Coll const&, Cand const& rowsTrackIndexProng3, - aod::TracksWCovExtra const&, + TracksWCovExtraPidPiKaPr const&, aod::BCsWithTimestamps const& /*bcWithTimeStamps*/) { for (const auto& rowTrackIndexProng3 : rowsTrackIndexProng3) { @@ -383,9 +412,9 @@ struct HfCandidateCreator3Prong { continue; } - auto track0 = rowTrackIndexProng3.template prong0_as(); - auto track1 = rowTrackIndexProng3.template prong1_as(); - auto track2 = rowTrackIndexProng3.template prong2_as(); + auto track0 = rowTrackIndexProng3.template prong0_as(); + auto track1 = rowTrackIndexProng3.template prong1_as(); + auto track2 = rowTrackIndexProng3.template prong2_as(); /// Set the magnetic field from ccdb. /// The static instance of the propagator was already modified in the HFTrackIndexSkimCreator, @@ -589,6 +618,9 @@ struct HfCandidateCreator3Prong { chi2geoSecondThird, chi2geoFirstThird, chi2geoFirstSecond, chi2geo, ldl.first, ldl.second, chi2topo); + // fill candidate prong PID rows + fillProngsPid(track0, track1, track2); + // fill histograms if (fillHistograms) { registry.fill(HIST("hMass3PiKPi"), massPiKPi); @@ -611,7 +643,7 @@ struct HfCandidateCreator3Prong { /// @brief process function using DCA fitter w/ PV refit and w/o centrality selections void processPvRefitWithDCAFitterN(soa::Join const& collisions, FilteredPvRefitHf3Prongs const& rowsTrackIndexProng3, - aod::TracksWCovExtra const& tracks, + TracksWCovExtraPidPiKaPr const& tracks, aod::BCsWithTimestamps const& bcWithTimeStamps) { runCreator3ProngWithDCAFitterN(collisions, rowsTrackIndexProng3, tracks, bcWithTimeStamps); @@ -621,7 +653,7 @@ struct HfCandidateCreator3Prong { /// @brief process function using DCA fitter w/o PV refit and w/o centrality selections void processNoPvRefitWithDCAFitterN(soa::Join const& collisions, FilteredHf3Prongs const& rowsTrackIndexProng3, - aod::TracksWCovExtra const& tracks, + TracksWCovExtraPidPiKaPr const& tracks, aod::BCsWithTimestamps const& bcWithTimeStamps) { runCreator3ProngWithDCAFitterN(collisions, rowsTrackIndexProng3, tracks, bcWithTimeStamps); @@ -631,7 +663,7 @@ struct HfCandidateCreator3Prong { /// @brief process function using KFParticle package w/ PV refit and w/o centrality selections void processPvRefitWithKFParticle(soa::Join const& collisions, FilteredPvRefitHf3Prongs const& rowsTrackIndexProng3, - aod::TracksWCovExtra const& tracks, + TracksWCovExtraPidPiKaPr const& tracks, aod::BCsWithTimestamps const& bcWithTimeStamps) { runCreator3ProngWithKFParticle(collisions, rowsTrackIndexProng3, tracks, bcWithTimeStamps); @@ -641,7 +673,7 @@ struct HfCandidateCreator3Prong { /// @brief process function using KFParticle package w/o PV refit and w/o centrality selections void processNoPvRefitWithKFParticle(soa::Join const& collisions, FilteredHf3Prongs const& rowsTrackIndexProng3, - aod::TracksWCovExtra const& tracks, + TracksWCovExtraPidPiKaPr const& tracks, aod::BCsWithTimestamps const& bcWithTimeStamps) { runCreator3ProngWithKFParticle(collisions, rowsTrackIndexProng3, tracks, bcWithTimeStamps); @@ -657,7 +689,7 @@ struct HfCandidateCreator3Prong { /// @brief process function using DCA fitter w/ PV refit and w/ centrality selection on FT0C void processPvRefitWithDCAFitterNCentFT0C(soa::Join const& collisions, FilteredPvRefitHf3Prongs const& rowsTrackIndexProng3, - aod::TracksWCovExtra const& tracks, + TracksWCovExtraPidPiKaPr const& tracks, aod::BCsWithTimestamps const& bcWithTimeStamps) { runCreator3ProngWithDCAFitterN(collisions, rowsTrackIndexProng3, tracks, bcWithTimeStamps); @@ -667,7 +699,7 @@ struct HfCandidateCreator3Prong { /// @brief process function using DCA fitter w/o PV refit and w/ centrality selection on FT0C void processNoPvRefitWithDCAFitterNCentFT0C(soa::Join const& collisions, FilteredHf3Prongs const& rowsTrackIndexProng3, - aod::TracksWCovExtra const& tracks, + TracksWCovExtraPidPiKaPr const& tracks, aod::BCsWithTimestamps const& bcWithTimeStamps) { runCreator3ProngWithDCAFitterN(collisions, rowsTrackIndexProng3, tracks, bcWithTimeStamps); @@ -677,7 +709,7 @@ struct HfCandidateCreator3Prong { /// @brief process function using KFParticle package w/ PV refit and w/ centrality selection on FT0C void processPvRefitWithKFParticleCentFT0C(soa::Join const& collisions, FilteredPvRefitHf3Prongs const& rowsTrackIndexProng3, - aod::TracksWCovExtra const& tracks, + TracksWCovExtraPidPiKaPr const& tracks, aod::BCsWithTimestamps const& bcWithTimeStamps) { runCreator3ProngWithKFParticle(collisions, rowsTrackIndexProng3, tracks, bcWithTimeStamps); @@ -687,7 +719,7 @@ struct HfCandidateCreator3Prong { /// @brief process function using KFParticle package w/o PV refit and w/ centrality selection on FT0C void processNoPvRefitWithKFParticleCentFT0C(soa::Join const& collisions, FilteredHf3Prongs const& rowsTrackIndexProng3, - aod::TracksWCovExtra const& tracks, + TracksWCovExtraPidPiKaPr const& tracks, aod::BCsWithTimestamps const& bcWithTimeStamps) { runCreator3ProngWithKFParticle(collisions, rowsTrackIndexProng3, tracks, bcWithTimeStamps); @@ -703,7 +735,7 @@ struct HfCandidateCreator3Prong { /// @brief process function using DCA fitter w/ PV refit and w/ centrality selection on FT0M void processPvRefitWithDCAFitterNCentFT0M(soa::Join const& collisions, FilteredPvRefitHf3Prongs const& rowsTrackIndexProng3, - aod::TracksWCovExtra const& tracks, + TracksWCovExtraPidPiKaPr const& tracks, aod::BCsWithTimestamps const& bcWithTimeStamps) { runCreator3ProngWithDCAFitterN(collisions, rowsTrackIndexProng3, tracks, bcWithTimeStamps); @@ -713,7 +745,7 @@ struct HfCandidateCreator3Prong { /// @brief process function using DCA fitter w/o PV refit and w/ centrality selection on FT0M void processNoPvRefitWithDCAFitterNCentFT0M(soa::Join const& collisions, FilteredHf3Prongs const& rowsTrackIndexProng3, - aod::TracksWCovExtra const& tracks, + TracksWCovExtraPidPiKaPr const& tracks, aod::BCsWithTimestamps const& bcWithTimeStamps) { runCreator3ProngWithDCAFitterN(collisions, rowsTrackIndexProng3, tracks, bcWithTimeStamps); @@ -723,7 +755,7 @@ struct HfCandidateCreator3Prong { /// @brief process function using KFParticle package w/ PV refit and w/ centrality selection on FT0M void processPvRefitWithKFParticleCentFT0M(soa::Join const& collisions, FilteredPvRefitHf3Prongs const& rowsTrackIndexProng3, - aod::TracksWCovExtra const& tracks, + TracksWCovExtraPidPiKaPr const& tracks, aod::BCsWithTimestamps const& bcWithTimeStamps) { runCreator3ProngWithKFParticle(collisions, rowsTrackIndexProng3, tracks, bcWithTimeStamps); @@ -733,7 +765,7 @@ struct HfCandidateCreator3Prong { /// @brief process function using KFParticle package w/o PV refit and w/ centrality selection on FT0M void processNoPvRefitWithKFParticleCentFT0M(soa::Join const& collisions, FilteredHf3Prongs const& rowsTrackIndexProng3, - aod::TracksWCovExtra const& tracks, + TracksWCovExtraPidPiKaPr const& tracks, aod::BCsWithTimestamps const& bcWithTimeStamps) { runCreator3ProngWithKFParticle(collisions, rowsTrackIndexProng3, tracks, bcWithTimeStamps); diff --git a/PWGHF/TableProducer/candidateCreatorDstar.cxx b/PWGHF/TableProducer/candidateCreatorDstar.cxx index 5c49e472511..8e2cca50cd5 100644 --- a/PWGHF/TableProducer/candidateCreatorDstar.cxx +++ b/PWGHF/TableProducer/candidateCreatorDstar.cxx @@ -35,6 +35,7 @@ #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/Utils/utilsBfieldCCDB.h" #include "PWGHF/Utils/utilsEvSelHf.h" +#include "PWGHF/Utils/utilsPid.h" #include "PWGHF/Utils/utilsTrkCandHf.h" using namespace o2; @@ -43,6 +44,7 @@ using namespace o2::hf_trkcandsel; using namespace o2::hf_centrality; using namespace o2::constants::physics; using namespace o2::framework; +using namespace o2::aod::pid_tpc_tof_utils; namespace o2::aod { @@ -53,6 +55,12 @@ using HfDstarsWithPvRefitInfo = soa::Join; struct HfCandidateCreatorDstar { Produces rowCandD0Base; Produces rowCandDstarBase; + Produces rowProng0PidPi; + Produces rowProng0PidKa; + Produces rowProng1PidPi; + Produces rowProng1PidKa; + Produces rowProngSoftPiPidPi; + Produces rowProngSoftPiPidKa; Configurable fillHistograms{"fillHistograms", true, "fill histograms"}; @@ -82,6 +90,8 @@ struct HfCandidateCreatorDstar { static constexpr float CmToMicrometers = 10000.; // from cm to µm double massPi, massK, massD0; + using TracksWCovExtraPidPiKa = soa::Join; + AxisSpec ptAxis = {100, 0., 2.0, "#it{p}_{T} (GeV/#it{c}"}; AxisSpec dcaAxis = {200, -500., 500., "#it{d}_{xy,z} (#mum)"}; @@ -193,10 +203,10 @@ struct HfCandidateCreatorDstar { continue; } - auto trackPi = rowTrackIndexDstar.template prong0_as(); + auto trackPi = rowTrackIndexDstar.template prong0_as(); auto prongD0 = rowTrackIndexDstar.template prongD0_as(); - auto trackD0Prong0 = prongD0.template prong0_as(); - auto trackD0Prong1 = prongD0.template prong1_as(); + auto trackD0Prong0 = prongD0.template prong0_as(); + auto trackD0Prong1 = prongD0.template prong1_as(); // Extracts primary vertex position and covariance matrix from a collision auto primaryVertex = getPrimaryVertex(collision); @@ -346,6 +356,14 @@ struct HfCandidateCreatorDstar { std::sqrt(impactParameter0.getSigmaZ2()), std::sqrt(impactParameter1.getSigmaZ2()), prongD0.prong0Id(), prongD0.prong1Id(), prongD0.hfflag()); + // fill candidate D0 prong PID rows + fillProngPid(trackD0Prong0, rowProng0PidPi); + fillProngPid(trackD0Prong0, rowProng0PidKa); + fillProngPid(trackD0Prong1, rowProng1PidPi); + fillProngPid(trackD0Prong1, rowProng1PidKa); + // fill soft-pion PID rows + fillProngPid(trackPi, rowProngSoftPiPidPi); + fillProngPid(trackPi, rowProngSoftPiPidKa); if (fillHistograms) { registry.fill(HIST("QA/hPtD0"), ptD0); diff --git a/PWGHF/TableProducer/candidateSelectorDplusToPiKPi.cxx b/PWGHF/TableProducer/candidateSelectorDplusToPiKPi.cxx index 776596c9df8..890122c8b77 100644 --- a/PWGHF/TableProducer/candidateSelectorDplusToPiKPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorDplusToPiKPi.cxx @@ -217,7 +217,7 @@ struct HfCandidateSelectorDplusToPiKPi { return true; } - void process(aod::HfCand3Prong const& candidates, + void process(aod::HfCand3ProngWPid const& candidates, TracksSel const&) { // looping over 3-prong candidates @@ -266,13 +266,13 @@ struct HfCandidateSelectorDplusToPiKPi { int pidTrackPos2Pion = -1; if (usePidTpcAndTof) { - pidTrackPos1Pion = selectorPion.statusTpcAndTof(trackPos1); - pidTrackNegKaon = selectorKaon.statusTpcAndTof(trackNeg); - pidTrackPos2Pion = selectorPion.statusTpcAndTof(trackPos2); + pidTrackPos1Pion = selectorPion.statusTpcAndTof(trackPos1, candidate.nSigTpcPi0(), candidate.nSigTofPi0()); + pidTrackNegKaon = selectorKaon.statusTpcAndTof(trackNeg, candidate.nSigTpcKa1(), candidate.nSigTofKa1()); + pidTrackPos2Pion = selectorPion.statusTpcAndTof(trackPos2, candidate.nSigTpcPi2(), candidate.nSigTofPi2()); } else { - pidTrackPos1Pion = selectorPion.statusTpcOrTof(trackPos1); - pidTrackNegKaon = selectorKaon.statusTpcOrTof(trackNeg); - pidTrackPos2Pion = selectorPion.statusTpcOrTof(trackPos2); + pidTrackPos1Pion = selectorPion.statusTpcOrTof(trackPos1, candidate.nSigTpcPi0(), candidate.nSigTofPi0()); + pidTrackNegKaon = selectorKaon.statusTpcOrTof(trackNeg, candidate.nSigTpcKa1(), candidate.nSigTofKa1()); + pidTrackPos2Pion = selectorPion.statusTpcOrTof(trackPos2, candidate.nSigTpcPi2(), candidate.nSigTofPi2()); } if (!selectionPID(pidTrackPos1Pion, pidTrackNegKaon, pidTrackPos2Pion)) { // exclude D± @@ -289,7 +289,7 @@ struct HfCandidateSelectorDplusToPiKPi { if (applyMl) { // ML selections - std::vector inputFeatures = hfMlResponse.getInputFeatures(candidate, trackPos1, trackNeg, trackPos2); + std::vector inputFeatures = hfMlResponse.getInputFeatures(candidate); bool isSelectedMl = hfMlResponse.isSelectedMl(inputFeatures, ptCand, outputMl); hfMlDplusToPiKPiCandidate(outputMl); diff --git a/PWGHF/TableProducer/candidateSelectorDsToKKPi.cxx b/PWGHF/TableProducer/candidateSelectorDsToKKPi.cxx index 3fee66bf344..c6e552b7ab3 100644 --- a/PWGHF/TableProducer/candidateSelectorDsToKKPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorDsToKKPi.cxx @@ -251,7 +251,7 @@ struct HfCandidateSelectorDsToKKPi { return true; } - void process(aod::HfCand3Prong const& candidates, + void process(aod::HfCand3ProngWPid const& candidates, TracksSel const&) { // looping over 3-prong candidates @@ -320,17 +320,17 @@ struct HfCandidateSelectorDsToKKPi { int pidTrackNegKaon = -1; if (usePidTpcAndTof) { - pidTrackPos1Pion = selectorPion.statusTpcAndTof(trackPos1); - pidTrackPos1Kaon = selectorKaon.statusTpcAndTof(trackPos1); - pidTrackPos2Pion = selectorPion.statusTpcAndTof(trackPos2); - pidTrackPos2Kaon = selectorKaon.statusTpcAndTof(trackPos2); - pidTrackNegKaon = selectorKaon.statusTpcAndTof(trackNeg); + pidTrackPos1Pion = selectorPion.statusTpcAndTof(trackPos1, candidate.nSigTpcPi0(), candidate.nSigTofPi0()); + pidTrackPos1Kaon = selectorKaon.statusTpcAndTof(trackPos1, candidate.nSigTpcKa0(), candidate.nSigTofKa0()); + pidTrackPos2Pion = selectorPion.statusTpcAndTof(trackPos2, candidate.nSigTpcPi2(), candidate.nSigTofPi2()); + pidTrackPos2Kaon = selectorKaon.statusTpcAndTof(trackPos2, candidate.nSigTpcKa2(), candidate.nSigTofKa2()); + pidTrackNegKaon = selectorKaon.statusTpcAndTof(trackNeg, candidate.nSigTpcKa1(), candidate.nSigTofKa1()); } else { - pidTrackPos1Pion = selectorPion.statusTpcOrTof(trackPos1); - pidTrackPos1Kaon = selectorKaon.statusTpcOrTof(trackPos1); - pidTrackPos2Pion = selectorPion.statusTpcOrTof(trackPos2); - pidTrackPos2Kaon = selectorKaon.statusTpcOrTof(trackPos2); - pidTrackNegKaon = selectorKaon.statusTpcOrTof(trackNeg); + pidTrackPos1Pion = selectorPion.statusTpcOrTof(trackPos1, candidate.nSigTpcPi0(), candidate.nSigTofPi0()); + pidTrackPos1Kaon = selectorKaon.statusTpcOrTof(trackPos1, candidate.nSigTpcKa0(), candidate.nSigTofKa0()); + pidTrackPos2Pion = selectorPion.statusTpcOrTof(trackPos2, candidate.nSigTpcPi2(), candidate.nSigTofPi2()); + pidTrackPos2Kaon = selectorKaon.statusTpcOrTof(trackPos2, candidate.nSigTpcKa2(), candidate.nSigTofKa2()); + pidTrackNegKaon = selectorKaon.statusTpcOrTof(trackNeg, candidate.nSigTpcKa1(), candidate.nSigTofKa1()); } bool pidDsToKKPi = !(pidTrackPos1Kaon == TrackSelectorPID::Rejected || @@ -364,11 +364,11 @@ struct HfCandidateSelectorDsToKKPi { bool isSelectedMlDsToPiKK = false; if (topolDsToKKPi && pidDsToKKPi) { - std::vector inputFeaturesDsToKKPi = hfMlResponse.getInputFeatures(candidate, trackPos1, trackNeg, trackPos2, true); + std::vector inputFeaturesDsToKKPi = hfMlResponse.getInputFeatures(candidate, true); isSelectedMlDsToKKPi = hfMlResponse.isSelectedMl(inputFeaturesDsToKKPi, candidate.pt(), outputMlDsToKKPi); } if (topolDsToPiKK && pidDsToPiKK) { - std::vector inputFeaturesDsToPiKK = hfMlResponse.getInputFeatures(candidate, trackPos1, trackNeg, trackPos2, false); + std::vector inputFeaturesDsToPiKK = hfMlResponse.getInputFeatures(candidate, false); isSelectedMlDsToPiKK = hfMlResponse.isSelectedMl(inputFeaturesDsToPiKK, candidate.pt(), outputMlDsToPiKK); } diff --git a/PWGHF/TableProducer/candidateSelectorDstarToD0Pi.cxx b/PWGHF/TableProducer/candidateSelectorDstarToD0Pi.cxx index a94f510f01c..d8b729dc748 100644 --- a/PWGHF/TableProducer/candidateSelectorDstarToD0Pi.cxx +++ b/PWGHF/TableProducer/candidateSelectorDstarToD0Pi.cxx @@ -108,7 +108,7 @@ struct HfCandidateSelectorDstarToD0Pi { using TracksSel = soa::Join; // using TracksSel = soa::Join; - using HfFullDstarCandidate = soa::Join; + using HfFullDstarCandidate = soa::Join; AxisSpec axisBdtScore{100, 0.f, 1.f}; AxisSpec axisSelStatus{2, -0.5f, 1.5f}; @@ -365,10 +365,6 @@ struct HfCandidateSelectorDstarToD0Pi { outputMlDstarToD0Pi.clear(); auto ptCand = candDstar.pt(); - auto prongPi = candDstar.prongPi_as(); - auto prong0 = candDstar.prong0_as(); - auto prong1 = candDstar.prong1_as(); - if (!TESTBIT(candDstar.hfflag(), aod::hf_cand_2prong::DecayType::D0ToPiK)) { hfSelDstarCandidate(statusDstar, statusD0Flag, statusTopol, statusCand, statusPID); if (applyMl) { @@ -417,16 +413,18 @@ struct HfCandidateSelectorDstarToD0Pi { int pidTrackNegKaon = -1; int pidTrackNegPion = -1; + auto prong0 = candDstar.prong0_as(); + auto prong1 = candDstar.prong1_as(); if (usePidTpcAndTof) { - pidTrackPosKaon = selectorKaon.statusTpcAndTof(candDstar.prong0_as()); - pidTrackPosPion = selectorPion.statusTpcAndTof(candDstar.prong0_as()); - pidTrackNegKaon = selectorKaon.statusTpcAndTof(candDstar.prong1_as()); - pidTrackNegPion = selectorPion.statusTpcAndTof(candDstar.prong1_as()); + pidTrackPosKaon = selectorKaon.statusTpcAndTof(prong0, candDstar.nSigTpcKa0(), candDstar.nSigTofKa0()); + pidTrackPosPion = selectorPion.statusTpcAndTof(prong0, candDstar.nSigTpcPi0(), candDstar.nSigTofPi0()); + pidTrackNegKaon = selectorKaon.statusTpcAndTof(prong1, candDstar.nSigTpcKa1(), candDstar.nSigTofKa1()); + pidTrackNegPion = selectorPion.statusTpcAndTof(prong1, candDstar.nSigTpcPi1(), candDstar.nSigTofPi1()); } else { - pidTrackPosKaon = selectorKaon.statusTpcOrTof(candDstar.prong0_as()); - pidTrackPosPion = selectorPion.statusTpcOrTof(candDstar.prong0_as()); - pidTrackNegKaon = selectorKaon.statusTpcOrTof(candDstar.prong1_as()); - pidTrackNegPion = selectorPion.statusTpcOrTof(candDstar.prong1_as()); + pidTrackPosKaon = selectorKaon.statusTpcOrTof(prong0, candDstar.nSigTpcKa0(), candDstar.nSigTofKa0()); + pidTrackPosPion = selectorPion.statusTpcOrTof(prong0, candDstar.nSigTpcPi0(), candDstar.nSigTofPi0()); + pidTrackNegKaon = selectorKaon.statusTpcOrTof(prong1, candDstar.nSigTpcKa1(), candDstar.nSigTofKa1()); + pidTrackNegPion = selectorPion.statusTpcOrTof(prong1, candDstar.nSigTpcPi1(), candDstar.nSigTofPi1()); } int pidDstar = -1; @@ -465,7 +463,7 @@ struct HfCandidateSelectorDstarToD0Pi { // ML selections bool isSelectedMlDstar = false; - std::vector inputFeatures = hfMlResponse.getInputFeatures(candDstar, prong0, prong1, prongPi); + std::vector inputFeatures = hfMlResponse.getInputFeatures(candDstar); isSelectedMlDstar = hfMlResponse.isSelectedMl(inputFeatures, ptCand, outputMlDstarToD0Pi); hfMlDstarCandidate(outputMlDstarToD0Pi); diff --git a/PWGHF/TableProducer/candidateSelectorLc.cxx b/PWGHF/TableProducer/candidateSelectorLc.cxx index b330b8a59f4..b06db12e2ec 100644 --- a/PWGHF/TableProducer/candidateSelectorLc.cxx +++ b/PWGHF/TableProducer/candidateSelectorLc.cxx @@ -497,17 +497,17 @@ struct HfCandidateSelectorLc { TrackSelectorPID::Status pidTrackPos2Pion = TrackSelectorPID::Accepted; TrackSelectorPID::Status pidTrackNegKaon = TrackSelectorPID::Accepted; if (usePidTpcAndTof) { - pidTrackPos1Proton = selectorProton.statusTpcAndTof(trackPos1); - pidTrackPos2Proton = selectorProton.statusTpcAndTof(trackPos2); - pidTrackPos1Pion = selectorPion.statusTpcAndTof(trackPos1); - pidTrackPos2Pion = selectorPion.statusTpcAndTof(trackPos2); - pidTrackNegKaon = selectorKaon.statusTpcAndTof(trackNeg); + pidTrackPos1Proton = selectorProton.statusTpcAndTof(trackPos1, candidate.nSigTpcPr0(), candidate.nSigTofPr0()); + pidTrackPos2Proton = selectorProton.statusTpcAndTof(trackPos2, candidate.nSigTpcPr2(), candidate.nSigTofPr2()); + pidTrackPos1Pion = selectorPion.statusTpcAndTof(trackPos1, candidate.nSigTpcPi0(), candidate.nSigTofPi0()); + pidTrackPos2Pion = selectorPion.statusTpcAndTof(trackPos2, candidate.nSigTpcPi2(), candidate.nSigTofPi2()); + pidTrackNegKaon = selectorKaon.statusTpcAndTof(trackNeg, candidate.nSigTpcKa1(), candidate.nSigTofKa1()); } else { - pidTrackPos1Proton = selectorProton.statusTpcOrTof(trackPos1); - pidTrackPos2Proton = selectorProton.statusTpcOrTof(trackPos2); - pidTrackPos1Pion = selectorPion.statusTpcOrTof(trackPos1); - pidTrackPos2Pion = selectorPion.statusTpcOrTof(trackPos2); - pidTrackNegKaon = selectorKaon.statusTpcOrTof(trackNeg); + pidTrackPos1Proton = selectorProton.statusTpcOrTof(trackPos1, candidate.nSigTpcPr0(), candidate.nSigTofPr0()); + pidTrackPos2Proton = selectorProton.statusTpcOrTof(trackPos2, candidate.nSigTpcPr2(), candidate.nSigTofPr2()); + pidTrackPos1Pion = selectorPion.statusTpcOrTof(trackPos1, candidate.nSigTpcPi0(), candidate.nSigTofPi0()); + pidTrackPos2Pion = selectorPion.statusTpcOrTof(trackPos2, candidate.nSigTpcPi2(), candidate.nSigTofPi2()); + pidTrackNegKaon = selectorKaon.statusTpcOrTof(trackNeg, candidate.nSigTpcKa1(), candidate.nSigTofKa1()); } if (!isSelectedPID(pidTrackPos1Proton, pidTrackNegKaon, pidTrackPos2Pion)) { @@ -554,11 +554,11 @@ struct HfCandidateSelectorLc { isSelectedMlLcToPiKP = false; if (pidLcToPKPi == 1 && pidBayesLcToPKPi == 1 && topolLcToPKPi) { - std::vector inputFeaturesLcToPKPi = hfMlResponse.getInputFeatures(candidate, trackPos1, trackNeg, trackPos2, true); + std::vector inputFeaturesLcToPKPi = hfMlResponse.getInputFeatures(candidate, true); isSelectedMlLcToPKPi = hfMlResponse.isSelectedMl(inputFeaturesLcToPKPi, candidate.pt(), outputMlLcToPKPi); } if (pidLcToPiKP == 1 && pidBayesLcToPiKP == 1 && topolLcToPiKP) { - std::vector inputFeaturesLcToPiKP = hfMlResponse.getInputFeatures(candidate, trackPos1, trackNeg, trackPos2, false); + std::vector inputFeaturesLcToPiKP = hfMlResponse.getInputFeatures(candidate, false); isSelectedMlLcToPiKP = hfMlResponse.isSelectedMl(inputFeaturesLcToPiKP, candidate.pt(), outputMlLcToPiKP); } @@ -588,7 +588,7 @@ struct HfCandidateSelectorLc { /// \brief process function w/o Bayes PID with DCAFitterN /// \param candidates Lc candidate table /// \param tracks track table - void processNoBayesPidWithDCAFitterN(aod::HfCand3Prong const& candidates, + void processNoBayesPidWithDCAFitterN(aod::HfCand3ProngWPid const& candidates, TracksSel const& tracks) { runSelectLc(candidates, tracks); @@ -598,7 +598,7 @@ struct HfCandidateSelectorLc { /// \brief process function with Bayes PID with DCAFitterN /// \param candidates Lc candidate table /// \param tracks track table with Bayes PID information - void processBayesPidWithDCAFitterN(aod::HfCand3Prong const& candidates, + void processBayesPidWithDCAFitterN(aod::HfCand3ProngWPid const& candidates, TracksSelBayesPid const& tracks) { runSelectLc(candidates, tracks); @@ -608,7 +608,7 @@ struct HfCandidateSelectorLc { /// \brief process function w/o Bayes PID with KFParticle /// \param candidates Lc candidate table /// \param tracks track table - void processNoBayesPidWithKFParticle(soa::Join const& candidates, + void processNoBayesPidWithKFParticle(soa::Join const& candidates, TracksSel const& tracks) { runSelectLc(candidates, tracks); @@ -618,7 +618,7 @@ struct HfCandidateSelectorLc { /// \brief process function with Bayes PID with KFParticle /// \param candidates Lc candidate table /// \param tracks track table with Bayes PID information - void processBayesPidWithKFParticle(soa::Join const& candidates, + void processBayesPidWithKFParticle(soa::Join const& candidates, TracksSelBayesPid const& tracks) { runSelectLc(candidates, tracks); diff --git a/PWGHF/TableProducer/candidateSelectorLcPidMl.cxx b/PWGHF/TableProducer/candidateSelectorLcPidMl.cxx index 2e127ff2829..45e91a39dbb 100644 --- a/PWGHF/TableProducer/candidateSelectorLcPidMl.cxx +++ b/PWGHF/TableProducer/candidateSelectorLcPidMl.cxx @@ -149,7 +149,7 @@ struct HfCandidateSelectorLcPidMl { } } - void process(aod::HfCand3Prong const& candidates, + void process(aod::HfCand3ProngWPid const& candidates, TracksSel const&) { // looping over 3-prong candidates @@ -181,11 +181,11 @@ struct HfCandidateSelectorLcPidMl { pidLcToPiKP = 1; } else { // track-level PID selection - int pidTrackPos1Proton = selectorProton.statusTpcOrTof(trackPos1); - int pidTrackPos2Proton = selectorProton.statusTpcOrTof(trackPos2); - int pidTrackPos1Pion = selectorPion.statusTpcOrTof(trackPos1); - int pidTrackPos2Pion = selectorPion.statusTpcOrTof(trackPos2); - int pidTrackNegKaon = selectorKaon.statusTpcOrTof(trackNeg); + TrackSelectorPID::Status pidTrackPos1Proton = selectorProton.statusTpcOrTof(trackPos1, candidate.nSigTpcPr0(), candidate.nSigTofPr0()); + TrackSelectorPID::Status pidTrackPos2Proton = selectorProton.statusTpcOrTof(trackPos2, candidate.nSigTpcPr2(), candidate.nSigTofPr2()); + TrackSelectorPID::Status pidTrackPos1Pion = selectorPion.statusTpcOrTof(trackPos1, candidate.nSigTpcPi0(), candidate.nSigTofPi0()); + TrackSelectorPID::Status pidTrackPos2Pion = selectorPion.statusTpcOrTof(trackPos2, candidate.nSigTpcPi2(), candidate.nSigTofPi2()); + TrackSelectorPID::Status pidTrackNegKaon = selectorKaon.statusTpcOrTof(trackNeg, candidate.nSigTpcKa1(), candidate.nSigTofKa1()); if (pidTrackPos1Proton == TrackSelectorPID::Accepted && pidTrackNegKaon == TrackSelectorPID::Accepted && diff --git a/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx b/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx index f9bd95d6aa7..4436a0834c2 100644 --- a/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx @@ -222,7 +222,7 @@ struct HfCandidateSelectorXicToPKPi { return true; } - void process(aod::HfCand3Prong const& candidates, + void process(aod::HfCand3ProngWPid const& candidates, TracksSel const&) { // looping over 3-prong candidates @@ -307,17 +307,17 @@ struct HfCandidateSelectorXicToPKPi { TrackSelectorPID::Status pidTrackNegKaon = TrackSelectorPID::Accepted; if (usePidTpcAndTof) { - pidTrackPos1Proton = selectorProton.statusTpcAndTof(trackPos1); - pidTrackPos2Proton = selectorProton.statusTpcAndTof(trackPos2); - pidTrackPos1Pion = selectorPion.statusTpcAndTof(trackPos1); - pidTrackPos2Pion = selectorPion.statusTpcAndTof(trackPos2); - pidTrackNegKaon = selectorKaon.statusTpcAndTof(trackNeg); + pidTrackPos1Proton = selectorProton.statusTpcAndTof(trackPos1, candidate.nSigTpcPr0(), candidate.nSigTofPr0()); + pidTrackPos2Proton = selectorProton.statusTpcAndTof(trackPos2, candidate.nSigTpcPr2(), candidate.nSigTofPr2()); + pidTrackPos1Pion = selectorPion.statusTpcAndTof(trackPos1, candidate.nSigTpcPi0(), candidate.nSigTofPi0()); + pidTrackPos2Pion = selectorPion.statusTpcAndTof(trackPos2, candidate.nSigTpcPi2(), candidate.nSigTofPi2()); + pidTrackNegKaon = selectorKaon.statusTpcAndTof(trackNeg, candidate.nSigTpcKa1(), candidate.nSigTofKa1()); } else { - pidTrackPos1Proton = selectorProton.statusTpcOrTof(trackPos1); - pidTrackPos2Proton = selectorProton.statusTpcOrTof(trackPos2); - pidTrackPos1Pion = selectorPion.statusTpcOrTof(trackPos1); - pidTrackPos2Pion = selectorPion.statusTpcOrTof(trackPos2); - pidTrackNegKaon = selectorKaon.statusTpcOrTof(trackNeg); + pidTrackPos1Proton = selectorProton.statusTpcOrTof(trackPos1, candidate.nSigTpcPr0(), candidate.nSigTofPr0()); + pidTrackPos2Proton = selectorProton.statusTpcOrTof(trackPos2, candidate.nSigTpcPr2(), candidate.nSigTofPr2()); + pidTrackPos1Pion = selectorPion.statusTpcOrTof(trackPos1, candidate.nSigTpcPi0(), candidate.nSigTofPi0()); + pidTrackPos2Pion = selectorPion.statusTpcOrTof(trackPos2, candidate.nSigTpcPi2(), candidate.nSigTofPi2()); + pidTrackNegKaon = selectorKaon.statusTpcOrTof(trackNeg, candidate.nSigTpcKa1(), candidate.nSigTofKa1()); } if (pidTrackPos1Proton == TrackSelectorPID::Accepted && @@ -364,11 +364,11 @@ struct HfCandidateSelectorXicToPKPi { bool isSelectedMlXicToPiKP = false; if (topolXicToPKPi && pidXicToPKPi) { - std::vector inputFeaturesXicToPKPi = hfMlResponse.getInputFeatures(candidate, trackPos1, trackNeg, trackPos2, true); + std::vector inputFeaturesXicToPKPi = hfMlResponse.getInputFeatures(candidate, true); isSelectedMlXicToPKPi = hfMlResponse.isSelectedMl(inputFeaturesXicToPKPi, ptCand, outputMlXicToPKPi); } if (topolXicToPiKP && pidXicToPiKP) { - std::vector inputFeaturesXicToPiKP = hfMlResponse.getInputFeatures(candidate, trackPos1, trackNeg, trackPos2, false); + std::vector inputFeaturesXicToPiKP = hfMlResponse.getInputFeatures(candidate, false); isSelectedMlXicToPiKP = hfMlResponse.isSelectedMl(inputFeaturesXicToPiKP, ptCand, outputMlXicToPiKP); } diff --git a/PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx b/PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx index cf4f828b498..b9a4d357685 100644 --- a/PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx +++ b/PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx @@ -79,10 +79,10 @@ struct HfDerivedDataCreatorDplusToPiKPi { using CollisionsWCentMult = soa::Join; using CollisionsWMcCentMult = soa::Join; using TracksWPid = soa::Join; - using SelectedCandidates = soa::Filtered>; - using SelectedCandidatesMc = soa::Filtered>; - using SelectedCandidatesMl = soa::Filtered>; - using SelectedCandidatesMcMl = soa::Filtered>; + using SelectedCandidates = soa::Filtered>; + using SelectedCandidatesMc = soa::Filtered>; + using SelectedCandidatesMl = soa::Filtered>; + using SelectedCandidatesMcMl = soa::Filtered>; using MatchedGenCandidatesMc = soa::Filtered>; using TypeMcCollisions = soa::Join; @@ -115,8 +115,8 @@ struct HfDerivedDataCreatorDplusToPiKPi { rowsCommon.init(confDerData); } - template - void fillTablesCandidate(const T& candidate, const U& prong0, const U& prong1, const U& prong2, int candFlag, double invMass, + template + void fillTablesCandidate(const T& candidate, int candFlag, double invMass, double ct, double y, int8_t flagMc, int8_t origin, int8_t swapping, int8_t flagDecayChan, const std::vector& mlScores) { rowsCommon.fillTablesCandidate(candidate, invMass, y); @@ -139,15 +139,15 @@ struct HfDerivedDataCreatorDplusToPiKPi { candidate.impactParameterNormalised0(), candidate.impactParameterNormalised1(), candidate.impactParameterNormalised2(), - prong0.tpcNSigmaPi(), - prong0.tofNSigmaPi(), - prong0.tpcTofNSigmaPi(), - prong1.tpcNSigmaKa(), - prong1.tofNSigmaKa(), - prong1.tpcTofNSigmaKa(), - prong2.tpcNSigmaPi(), - prong2.tofNSigmaPi(), - prong2.tpcTofNSigmaPi()); + candidate.nSigTpcPi0(), + candidate.nSigTofPi0(), + candidate.tpcTofNSigmaPi0(), + candidate.nSigTpcKa1(), + candidate.nSigTofKa1(), + candidate.tpcTofNSigmaKa1(), + candidate.nSigTpcPi2(), + candidate.nSigTofPi2(), + candidate.tpcTofNSigmaPi2()); } if (fillCandidateParE) { rowCandidateParE( @@ -269,9 +269,6 @@ struct HfDerivedDataCreatorDplusToPiKPi { } } } - auto prong0 = candidate.template prong0_as(); - auto prong1 = candidate.template prong1_as(); - auto prong2 = candidate.template prong2_as(); double ct = hfHelper.ctDplus(candidate); double y = hfHelper.yDplus(candidate); float massDplusToPiKPi = hfHelper.invMassDplusToPiKPi(candidate); @@ -279,7 +276,7 @@ struct HfDerivedDataCreatorDplusToPiKPi { if constexpr (isMl) { std::copy(candidate.mlProbDplusToPiKPi().begin(), candidate.mlProbDplusToPiKPi().end(), std::back_inserter(mlScoresDplusToPiKPi)); } - fillTablesCandidate(candidate, prong0, prong1, prong2, 0, massDplusToPiKPi, ct, y, flagMcRec, origin, swapping, flagDecayChanRec, mlScoresDplusToPiKPi); + fillTablesCandidate(candidate, 0, massDplusToPiKPi, ct, y, flagMcRec, origin, swapping, flagDecayChanRec, mlScoresDplusToPiKPi); } } } diff --git a/PWGHF/TableProducer/derivedDataCreatorLcToPKPi.cxx b/PWGHF/TableProducer/derivedDataCreatorLcToPKPi.cxx index 61d2398a0d7..28b2b276b48 100644 --- a/PWGHF/TableProducer/derivedDataCreatorLcToPKPi.cxx +++ b/PWGHF/TableProducer/derivedDataCreatorLcToPKPi.cxx @@ -79,10 +79,10 @@ struct HfDerivedDataCreatorLcToPKPi { using CollisionsWCentMult = soa::Join; using CollisionsWMcCentMult = soa::Join; using TracksWPid = soa::Join; - using SelectedCandidates = soa::Filtered>; - using SelectedCandidatesMc = soa::Filtered>; - using SelectedCandidatesMl = soa::Filtered>; - using SelectedCandidatesMcMl = soa::Filtered>; + using SelectedCandidates = soa::Filtered>; + using SelectedCandidatesMc = soa::Filtered>; + using SelectedCandidatesMl = soa::Filtered>; + using SelectedCandidatesMcMl = soa::Filtered>; using MatchedGenCandidatesMc = soa::Filtered>; using TypeMcCollisions = soa::Join; @@ -115,8 +115,8 @@ struct HfDerivedDataCreatorLcToPKPi { rowsCommon.init(confDerData); } - template - void fillTablesCandidate(const T& candidate, const U& prong0, const U& prong1, const U& prong2, int candFlag, double invMass, + template + void fillTablesCandidate(const T& candidate, int candFlag, double invMass, double ct, double y, int8_t flagMc, int8_t origin, int8_t swapping, const std::vector& mlScores) { rowsCommon.fillTablesCandidate(candidate, invMass, y); @@ -139,21 +139,21 @@ struct HfDerivedDataCreatorLcToPKPi { candidate.impactParameterNormalised0(), candidate.impactParameterNormalised1(), candidate.impactParameterNormalised2(), - prong0.tpcNSigmaPi(), - prong0.tpcNSigmaPr(), - prong0.tofNSigmaPi(), - prong0.tofNSigmaPr(), - prong0.tpcTofNSigmaPi(), - prong0.tpcTofNSigmaPr(), - prong1.tpcNSigmaKa(), - prong1.tofNSigmaKa(), - prong1.tpcTofNSigmaKa(), - prong2.tpcNSigmaPi(), - prong2.tpcNSigmaPr(), - prong2.tofNSigmaPi(), - prong2.tofNSigmaPr(), - prong2.tpcTofNSigmaPi(), - prong2.tpcTofNSigmaPr()); + candidate.nSigTpcPi0(), + candidate.nSigTpcPr0(), + candidate.nSigTofPi0(), + candidate.nSigTofPr0(), + candidate.tpcTofNSigmaPi0(), + candidate.tpcTofNSigmaPr0(), + candidate.nSigTpcKa1(), + candidate.nSigTofKa1(), + candidate.tpcTofNSigmaKa1(), + candidate.nSigTpcPi2(), + candidate.nSigTpcPr2(), + candidate.nSigTofPi2(), + candidate.nSigTofPr2(), + candidate.tpcTofNSigmaPi2(), + candidate.tpcTofNSigmaPr2()); } if (fillCandidateParE) { rowCandidateParE( @@ -268,9 +268,6 @@ struct HfDerivedDataCreatorLcToPKPi { } } } - auto prong0 = candidate.template prong0_as(); - auto prong1 = candidate.template prong1_as(); - auto prong2 = candidate.template prong2_as(); double ct = hfHelper.ctLc(candidate); double y = hfHelper.yLc(candidate); float massLcToPKPi = hfHelper.invMassLcToPKPi(candidate); @@ -281,10 +278,10 @@ struct HfDerivedDataCreatorLcToPKPi { std::copy(candidate.mlProbLcToPiKP().begin(), candidate.mlProbLcToPiKP().end(), std::back_inserter(mlScoresLcToPiKP)); } if (candidate.isSelLcToPKPi()) { - fillTablesCandidate(candidate, prong0, prong1, prong2, 0, massLcToPKPi, ct, y, flagMcRec, origin, swapping, mlScoresLcToPKPi); + fillTablesCandidate(candidate, 0, massLcToPKPi, ct, y, flagMcRec, origin, swapping, mlScoresLcToPKPi); } if (candidate.isSelLcToPiKP()) { - fillTablesCandidate(candidate, prong0, prong1, prong2, 1, massLcToPiKP, ct, y, flagMcRec, origin, swapping, mlScoresLcToPiKP); + fillTablesCandidate(candidate, 1, massLcToPiKP, ct, y, flagMcRec, origin, swapping, mlScoresLcToPiKP); } } } diff --git a/PWGHF/TableProducer/treeCreatorDplusToPiKPi.cxx b/PWGHF/TableProducer/treeCreatorDplusToPiKPi.cxx index 495ddc42148..ed3957f8e01 100644 --- a/PWGHF/TableProducer/treeCreatorDplusToPiKPi.cxx +++ b/PWGHF/TableProducer/treeCreatorDplusToPiKPi.cxx @@ -260,9 +260,9 @@ struct HfTreeCreatorDplusToPiKPi { HfHelper hfHelper; - using SelectedCandidatesMc = soa::Filtered>; + using SelectedCandidatesMc = soa::Filtered>; using MatchedGenCandidatesMc = soa::Filtered>; - using SelectedCandidatesMcWithMl = soa::Filtered>; + using SelectedCandidatesMcWithMl = soa::Filtered>; using TracksWPid = soa::Join; using CollisionsCent = soa::Join; @@ -313,10 +313,6 @@ struct HfTreeCreatorDplusToPiKPi { outputMl[1]); } - auto prong0 = candidate.template prong0_as(); - auto prong1 = candidate.template prong1_as(); - auto prong2 = candidate.template prong2_as(); - float cent{-1.}; auto coll = candidate.template collision_as(); if (std::is_same_v && centEstimator != CentralityEstimator::None) { @@ -339,24 +335,24 @@ struct HfTreeCreatorDplusToPiKPi { candidate.impactParameterZ0(), candidate.impactParameterZ1(), candidate.impactParameterZ2(), - prong0.tpcNSigmaPi(), - prong0.tpcNSigmaKa(), - prong0.tofNSigmaPi(), - prong0.tofNSigmaKa(), - prong0.tpcTofNSigmaPi(), - prong0.tpcTofNSigmaKa(), - prong1.tpcNSigmaPi(), - prong1.tpcNSigmaKa(), - prong1.tofNSigmaPi(), - prong1.tofNSigmaKa(), - prong1.tpcTofNSigmaPi(), - prong1.tpcTofNSigmaKa(), - prong2.tpcNSigmaPi(), - prong2.tpcNSigmaKa(), - prong2.tofNSigmaPi(), - prong2.tofNSigmaKa(), - prong2.tpcTofNSigmaPi(), - prong2.tpcTofNSigmaKa(), + candidate.nSigTpcPi0(), + candidate.nSigTpcKa0(), + candidate.nSigTofPi0(), + candidate.nSigTofKa0(), + candidate.tpcTofNSigmaPi0(), + candidate.tpcTofNSigmaKa0(), + candidate.nSigTpcPi1(), + candidate.nSigTpcKa1(), + candidate.nSigTofPi1(), + candidate.nSigTofKa1(), + candidate.tpcTofNSigmaPi1(), + candidate.tpcTofNSigmaKa1(), + candidate.nSigTpcPi2(), + candidate.nSigTpcKa2(), + candidate.nSigTofPi2(), + candidate.nSigTofKa2(), + candidate.tpcTofNSigmaPi2(), + candidate.tpcTofNSigmaKa2(), candidate.isSelDplusToPiKPi(), hfHelper.invMassDplusToPiKPi(candidate), candidate.pt(), @@ -418,24 +414,24 @@ struct HfTreeCreatorDplusToPiKPi { candidate.errorImpactParameterZ0(), candidate.errorImpactParameterZ1(), candidate.errorImpactParameterZ2(), - prong0.tpcNSigmaPi(), - prong0.tpcNSigmaKa(), - prong0.tofNSigmaPi(), - prong0.tofNSigmaKa(), - prong0.tpcTofNSigmaPi(), - prong0.tpcTofNSigmaKa(), - prong1.tpcNSigmaPi(), - prong1.tpcNSigmaKa(), - prong1.tofNSigmaPi(), - prong1.tofNSigmaKa(), - prong1.tpcTofNSigmaPi(), - prong1.tpcTofNSigmaKa(), - prong2.tpcNSigmaPi(), - prong2.tpcNSigmaKa(), - prong2.tofNSigmaPi(), - prong2.tofNSigmaKa(), - prong2.tpcTofNSigmaPi(), - prong2.tpcTofNSigmaKa(), + candidate.nSigTpcPi0(), + candidate.nSigTpcKa0(), + candidate.nSigTofPi0(), + candidate.nSigTofKa0(), + candidate.tpcTofNSigmaPi0(), + candidate.tpcTofNSigmaKa0(), + candidate.nSigTpcPi1(), + candidate.nSigTpcKa1(), + candidate.nSigTofPi1(), + candidate.nSigTofKa1(), + candidate.tpcTofNSigmaPi1(), + candidate.tpcTofNSigmaKa1(), + candidate.nSigTpcPi2(), + candidate.nSigTpcKa2(), + candidate.nSigTofPi2(), + candidate.nSigTofKa2(), + candidate.tpcTofNSigmaPi2(), + candidate.tpcTofNSigmaKa2(), candidate.isSelDplusToPiKPi(), hfHelper.invMassDplusToPiKPi(candidate), candidate.pt(), @@ -456,7 +452,7 @@ struct HfTreeCreatorDplusToPiKPi { } void processData(aod::Collisions const& collisions, - soa::Filtered> const& candidates, + soa::Filtered> const& candidates, TracksWPid const&) { // Filling event properties @@ -485,7 +481,7 @@ struct HfTreeCreatorDplusToPiKPi { PROCESS_SWITCH(HfTreeCreatorDplusToPiKPi, processData, "Process data", true); void processDataWCent(CollisionsCent const& collisions, - soa::Filtered> const& candidates, + soa::Filtered> const& candidates, TracksWPid const&) { // Filling event properties diff --git a/PWGHF/TableProducer/treeCreatorDsToKKPi.cxx b/PWGHF/TableProducer/treeCreatorDsToKKPi.cxx index bb854c441fb..916063dbfd3 100644 --- a/PWGHF/TableProducer/treeCreatorDsToKKPi.cxx +++ b/PWGHF/TableProducer/treeCreatorDsToKKPi.cxx @@ -248,8 +248,8 @@ struct HfTreeCreatorDsToKKPi { HfHelper hfHelper; - using CandDsData = soa::Filtered>; - using CandDsMcReco = soa::Filtered>; + using CandDsData = soa::Filtered>; + using CandDsMcReco = soa::Filtered>; using CandDsMcGen = soa::Filtered>; using TracksWPid = soa::Join; @@ -344,24 +344,24 @@ struct HfTreeCreatorDsToKKPi { candidate.impactParameter0(), candidate.impactParameter1(), candidate.impactParameter2(), - prong0.tpcNSigmaPi(), - prong0.tpcNSigmaKa(), - prong0.tofNSigmaPi(), - prong0.tofNSigmaKa(), - prong0.tpcTofNSigmaPi(), - prong0.tpcTofNSigmaKa(), - prong1.tpcNSigmaPi(), - prong1.tpcNSigmaKa(), - prong1.tofNSigmaPi(), - prong1.tofNSigmaKa(), - prong1.tpcTofNSigmaPi(), - prong1.tpcTofNSigmaKa(), - prong2.tpcNSigmaPi(), - prong2.tpcNSigmaKa(), - prong2.tofNSigmaPi(), - prong2.tofNSigmaKa(), - prong2.tpcTofNSigmaPi(), - prong2.tpcTofNSigmaKa(), + candidate.nSigTpcPi0(), + candidate.nSigTpcKa0(), + candidate.nSigTofPi0(), + candidate.nSigTofKa0(), + candidate.tpcTofNSigmaPi0(), + candidate.tpcTofNSigmaKa0(), + candidate.nSigTpcPi1(), + candidate.nSigTpcKa1(), + candidate.nSigTofPi1(), + candidate.nSigTofKa1(), + candidate.tpcTofNSigmaPi1(), + candidate.tpcTofNSigmaKa1(), + candidate.nSigTpcPi2(), + candidate.nSigTpcKa2(), + candidate.nSigTofPi2(), + candidate.nSigTofKa2(), + candidate.tpcTofNSigmaPi2(), + candidate.tpcTofNSigmaKa2(), massHypo == 0 ? candidate.isSelDsToKKPi() : -1, massHypo == 1 ? candidate.isSelDsToPiKK() : -1, invMassDs, @@ -412,24 +412,24 @@ struct HfTreeCreatorDsToKKPi { candidate.impactParameter0(), candidate.impactParameter1(), candidate.impactParameter2(), - prong0.tpcNSigmaPi(), - prong0.tpcNSigmaKa(), - prong0.tofNSigmaPi(), - prong0.tofNSigmaKa(), - prong0.tpcTofNSigmaPi(), - prong0.tpcTofNSigmaKa(), - prong1.tpcNSigmaPi(), - prong1.tpcNSigmaKa(), - prong1.tofNSigmaPi(), - prong1.tofNSigmaKa(), - prong1.tpcTofNSigmaPi(), - prong1.tpcTofNSigmaKa(), - prong2.tpcNSigmaPi(), - prong2.tpcNSigmaKa(), - prong2.tofNSigmaPi(), - prong2.tofNSigmaKa(), - prong2.tpcTofNSigmaPi(), - prong2.tpcTofNSigmaKa(), + candidate.nSigTpcPi0(), + candidate.nSigTpcKa0(), + candidate.nSigTofPi0(), + candidate.nSigTofKa0(), + candidate.tpcTofNSigmaPi0(), + candidate.tpcTofNSigmaKa0(), + candidate.nSigTpcPi1(), + candidate.nSigTpcKa1(), + candidate.nSigTofPi1(), + candidate.nSigTofKa1(), + candidate.tpcTofNSigmaPi1(), + candidate.tpcTofNSigmaKa1(), + candidate.nSigTpcPi2(), + candidate.nSigTpcKa2(), + candidate.nSigTofPi2(), + candidate.nSigTofKa2(), + candidate.tpcTofNSigmaPi2(), + candidate.tpcTofNSigmaKa2(), massHypo == 0 ? candidate.isSelDsToKKPi() : -1, massHypo == 1 ? candidate.isSelDsToPiKK() : -1, candidate.xSecondaryVertex(), diff --git a/PWGHF/TableProducer/treeCreatorDstarToD0Pi.cxx b/PWGHF/TableProducer/treeCreatorDstarToD0Pi.cxx index fd11fad78b1..00d2bea174f 100644 --- a/PWGHF/TableProducer/treeCreatorDstarToD0Pi.cxx +++ b/PWGHF/TableProducer/treeCreatorDstarToD0Pi.cxx @@ -255,8 +255,8 @@ struct HfTreeCreatorDstarToD0Pi { Configurable downSampleBkgFactor{"downSampleBkgFactor", 1., "Fraction of background candidates to keep for ML trainings"}; Configurable ptMaxForDownSample{"ptMaxForDownSample", 10., "Maximum pt for the application of the downsampling factor"}; - using CandDstarWSelFlag = soa::Filtered>; - using CandDstarWSelFlagMcRec = soa::Filtered>; + using CandDstarWSelFlag = soa::Filtered>; + using CandDstarWSelFlagMcRec = soa::Filtered>; using TracksWPid = soa::Join; using CandDstarMcGen = soa::Filtered>; @@ -295,7 +295,6 @@ struct HfTreeCreatorDstarToD0Pi { TracksWPid::iterator prong0; TracksWPid::iterator prong1; - auto prongSoftPi = candidate.template prongPi_as(); float massD0{-1.f}; float massDStar{-1.f}; @@ -360,24 +359,24 @@ struct HfTreeCreatorDstarToD0Pi { impParameterNormalisedProng0, impParameterNormalisedProng1, candidate.normalisedImpParamSoftPi(), - prong0.tpcNSigmaPi(), - prong0.tpcNSigmaKa(), - prong0.tofNSigmaPi(), - prong0.tofNSigmaKa(), - prong0.tpcTofNSigmaPi(), - prong0.tpcTofNSigmaKa(), - prong1.tpcNSigmaPi(), - prong1.tpcNSigmaKa(), - prong1.tofNSigmaPi(), - prong1.tofNSigmaKa(), - prong1.tpcTofNSigmaPi(), - prong1.tpcTofNSigmaKa(), - prongSoftPi.tpcNSigmaPi(), - prongSoftPi.tpcNSigmaKa(), - prongSoftPi.tofNSigmaPi(), - prongSoftPi.tofNSigmaKa(), - prongSoftPi.tpcTofNSigmaPi(), - prongSoftPi.tpcTofNSigmaKa(), + candidate.nSigTpcPi0(), + candidate.nSigTpcKa0(), + candidate.nSigTofPi0(), + candidate.nSigTofKa0(), + candidate.tpcTofNSigmaPi0(), + candidate.tpcTofNSigmaKa0(), + candidate.nSigTpcPi1(), + candidate.nSigTpcKa1(), + candidate.nSigTofPi1(), + candidate.nSigTofKa1(), + candidate.tpcTofNSigmaPi1(), + candidate.tpcTofNSigmaKa1(), + candidate.nSigTpcPi2(), + candidate.nSigTpcKa2(), + candidate.nSigTofPi2(), + candidate.nSigTofKa2(), + candidate.tpcTofNSigmaPi2(), + candidate.tpcTofNSigmaKa2(), massD0, candidate.ptD0(), candidate.etaD0(), @@ -429,24 +428,24 @@ struct HfTreeCreatorDstarToD0Pi { candidate.errorImpactParameter0(), candidate.errorImpactParameter1(), candidate.errorImpParamSoftPi(), - prong0.tpcNSigmaPi(), - prong0.tpcNSigmaKa(), - prong0.tofNSigmaPi(), - prong0.tofNSigmaKa(), - prong0.tpcTofNSigmaPi(), - prong0.tpcTofNSigmaKa(), - prong1.tpcNSigmaPi(), - prong1.tpcNSigmaKa(), - prong1.tofNSigmaPi(), - prong1.tofNSigmaKa(), - prong1.tpcTofNSigmaPi(), - prong1.tpcTofNSigmaKa(), - prongSoftPi.tpcNSigmaPi(), - prongSoftPi.tpcNSigmaKa(), - prongSoftPi.tofNSigmaPi(), - prongSoftPi.tofNSigmaKa(), - prongSoftPi.tpcTofNSigmaPi(), - prongSoftPi.tpcTofNSigmaKa(), + candidate.nSigTpcPi0(), + candidate.nSigTpcKa0(), + candidate.nSigTofPi0(), + candidate.nSigTofKa0(), + candidate.tpcTofNSigmaPi0(), + candidate.tpcTofNSigmaKa0(), + candidate.nSigTpcPi1(), + candidate.nSigTpcKa1(), + candidate.nSigTofPi1(), + candidate.nSigTofKa1(), + candidate.tpcTofNSigmaPi1(), + candidate.tpcTofNSigmaKa1(), + candidate.nSigTpcPi2(), + candidate.nSigTpcKa2(), + candidate.nSigTofPi2(), + candidate.nSigTofKa2(), + candidate.tpcTofNSigmaPi2(), + candidate.tpcTofNSigmaKa2(), massD0, candidate.ptD0(), candidate.pD0(), diff --git a/PWGHF/TableProducer/treeCreatorLbToLcPi.cxx b/PWGHF/TableProducer/treeCreatorLbToLcPi.cxx index d69de17d4e8..f256125e990 100644 --- a/PWGHF/TableProducer/treeCreatorLbToLcPi.cxx +++ b/PWGHF/TableProducer/treeCreatorLbToLcPi.cxx @@ -192,7 +192,7 @@ struct HfTreeCreatorLbToLcPi { using TracksWPid = soa::Join; void process(soa::Join const& candidates, - soa::Join const&, + soa::Join const&, TracksWPid const&) { // Filling candidate properties @@ -202,7 +202,7 @@ struct HfTreeCreatorLbToLcPi { float FunctionInvMass, float FunctionCt, float FunctionY) { - auto candLc = candidate.prong0_as>(); + auto candLc = candidate.prong0_as>(); auto track0 = candidate.prong1_as(); // daughter pion track auto track1 = candLc.prong0_as(); // granddaughter tracks (lc decay particles) auto track2 = candLc.prong1_as(); @@ -245,18 +245,18 @@ struct HfTreeCreatorLbToLcPi { candidate.impactParameter1(), candidate.errorImpactParameter0(), candidate.errorImpactParameter1(), - track1.tpcNSigmaPi(), - track1.tpcNSigmaKa(), - track1.tpcNSigmaPr(), - track2.tpcNSigmaPi(), - track2.tpcNSigmaKa(), - track2.tpcNSigmaPr(), - track3.tpcNSigmaPi(), - track3.tpcNSigmaKa(), - track3.tpcNSigmaPr(), - track1.tofNSigmaPr(), - track2.tofNSigmaKa(), - track3.tofNSigmaPi(), + candLc.nSigTpcPi0(), + candLc.nSigTpcKa0(), + candLc.nSigTpcPr0(), + candLc.nSigTpcPi1(), + candLc.nSigTpcKa1(), + candLc.nSigTpcPr1(), + candLc.nSigTpcPi2(), + candLc.nSigTpcKa2(), + candLc.nSigTpcPr2(), + candLc.nSigTofPr0(), + candLc.nSigTofKa1(), + candLc.nSigTofPi2(), hfHelper.invMassLcToPKPi(candLc), hfHelper.ctLc(candLc), hfHelper.yLc(candLc), diff --git a/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx b/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx index 2842968ab6c..be5349f8589 100644 --- a/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx +++ b/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx @@ -82,7 +82,7 @@ DECLARE_SOA_COLUMN(FlagMc, flagMc, int8_t); DECLARE_SOA_COLUMN(OriginMcRec, originMcRec, int8_t); DECLARE_SOA_COLUMN(OriginMcGen, originMcGen, int8_t); DECLARE_SOA_COLUMN(IsCandidateSwapped, isCandidateSwapped, int8_t); -DECLARE_SOA_INDEX_COLUMN_FULL(Candidate, candidate, int, HfCand3Prong, "_0"); +DECLARE_SOA_INDEX_COLUMN_FULL(Candidate, candidate, int, HfCand3ProngWPid, "_0"); DECLARE_SOA_INDEX_COLUMN(McParticle, mcParticle); DECLARE_SOA_COLUMN(Channel, channel, int8_t); // direct or resonant // Events @@ -521,12 +521,10 @@ struct HfTreeCreatorLcToPKPi { rowCandidateMC.reserve(candidates.size() * 2); } for (const auto& candidate : candidates) { - auto trackPos1 = candidate.template prong0_as>(); // positive daughter (negative for the antiparticles) - auto trackNeg = candidate.template prong1_as>(); // negative daughter (positive for the antiparticles) - auto trackPos2 = candidate.template prong2_as>(); // positive daughter (negative for the antiparticles) + float ptProng0 = candidate.ptProng0(); auto collision = candidate.template collision_as(); auto fillTable = [&](int candFlag) { - double pseudoRndm = trackPos1.pt() * 1000. - static_cast(trackPos1.pt() * 1000); + double pseudoRndm = ptProng0 * 1000. - static_cast(ptProng0 * 1000); const int functionSelection = candFlag == 0 ? candidate.isSelLcToPKPi() : candidate.isSelLcToPiKP(); const int sigbgstatus = determineSignalBgStatus(candidate, candFlag); const bool isMcCandidateSignal = (sigbgstatus == Prompt) || (sigbgstatus == NonPrompt); @@ -561,21 +559,21 @@ struct HfTreeCreatorLcToPKPi { candidate.impactParameter0(), candidate.impactParameter1(), candidate.impactParameter2(), - trackPos1.tpcNSigmaPi(), - trackPos1.tpcNSigmaPr(), - trackPos1.tofNSigmaPi(), - trackPos1.tofNSigmaPr(), - trackNeg.tpcNSigmaKa(), - trackNeg.tofNSigmaKa(), - trackPos2.tpcNSigmaPi(), - trackPos2.tpcNSigmaPr(), - trackPos2.tofNSigmaPi(), - trackPos2.tofNSigmaPr(), - trackPos1.tpcTofNSigmaPi(), - trackPos1.tpcTofNSigmaPr(), - trackNeg.tpcTofNSigmaKa(), - trackPos2.tpcTofNSigmaPi(), - trackPos2.tpcTofNSigmaPr(), + candidate.nSigTpcPi0(), + candidate.nSigTpcPr0(), + candidate.nSigTofPi0(), + candidate.nSigTofPr0(), + candidate.nSigTpcKa1(), + candidate.nSigTofKa1(), + candidate.nSigTpcPi2(), + candidate.nSigTpcPr2(), + candidate.nSigTofPi2(), + candidate.nSigTofPr2(), + candidate.tpcTofNSigmaPi0(), + candidate.tpcTofNSigmaPr0(), + candidate.tpcTofNSigmaKa1(), + candidate.tpcTofNSigmaPi2(), + candidate.tpcTofNSigmaPr2(), 1 << candFlag, functionInvMass, candidate.pt(), @@ -638,21 +636,21 @@ struct HfTreeCreatorLcToPKPi { candidate.errorImpactParameter0(), candidate.errorImpactParameter1(), candidate.errorImpactParameter2(), - trackPos1.tpcNSigmaPi(), - trackPos1.tpcNSigmaPr(), - trackPos1.tofNSigmaPi(), - trackPos1.tofNSigmaPr(), - trackNeg.tpcNSigmaKa(), - trackNeg.tofNSigmaKa(), - trackPos2.tpcNSigmaPi(), - trackPos2.tpcNSigmaPr(), - trackPos2.tofNSigmaPi(), - trackPos2.tofNSigmaPr(), - trackPos1.tpcTofNSigmaPi(), - trackPos1.tpcTofNSigmaPr(), - trackNeg.tpcTofNSigmaKa(), - trackPos2.tpcTofNSigmaPi(), - trackPos2.tpcTofNSigmaPr(), + candidate.nSigTpcPi0(), + candidate.nSigTpcPr0(), + candidate.nSigTofPi0(), + candidate.nSigTofPr0(), + candidate.nSigTpcKa1(), + candidate.nSigTofKa1(), + candidate.nSigTpcPi2(), + candidate.nSigTpcPr2(), + candidate.nSigTofPi2(), + candidate.nSigTofPr2(), + candidate.tpcTofNSigmaPi0(), + candidate.tpcTofNSigmaPr0(), + candidate.tpcTofNSigmaKa1(), + candidate.tpcTofNSigmaPi2(), + candidate.tpcTofNSigmaPr2(), 1 << candFlag, functionInvMass, candidate.pt(), @@ -681,13 +679,13 @@ struct HfTreeCreatorLcToPKPi { float chi2GeoPionKaon; float mass; float valueTpcNSigmaPr; - const float valueTpcNSigmaKa = trackNeg.tpcNSigmaKa(); + const float valueTpcNSigmaKa = candidate.nSigTpcKa1(); float valueTpcNSigmaPi; float valueTofNSigmaPr; - const float valueTofNSigmaKa = trackNeg.tofNSigmaKa(); + const float valueTofNSigmaKa = candidate.nSigTofKa1(); float valueTofNSigmaPi; float valueTpcTofNSigmaPr; - const float valueTpcTofNSigmaKa = trackNeg.tpcTofNSigmaKa(); + const float valueTpcTofNSigmaKa = candidate.tpcTofNSigmaKa1(); float valueTpcTofNSigmaPi; if (candFlag == 0) { chi2primProton = candidate.kfChi2PrimProng0(); @@ -697,12 +695,12 @@ struct HfTreeCreatorLcToPKPi { chi2GeoProtonKaon = candidate.kfChi2GeoProng0Prong1(); chi2GeoPionKaon = candidate.kfChi2GeoProng1Prong2(); mass = candidate.kfMassPKPi(); - valueTpcNSigmaPr = trackPos1.tpcNSigmaPr(); - valueTpcNSigmaPi = trackPos2.tpcNSigmaPi(); - valueTofNSigmaPr = trackPos1.tofNSigmaPr(); - valueTofNSigmaPi = trackPos2.tofNSigmaPi(); - valueTpcTofNSigmaPr = trackPos1.tpcTofNSigmaPr(); - valueTpcTofNSigmaPi = trackPos2.tpcTofNSigmaPi(); + valueTpcNSigmaPr = candidate.nSigTpcPr0(); + valueTpcNSigmaPi = candidate.nSigTpcPi2(); + valueTofNSigmaPr = candidate.nSigTofPr0(); + valueTofNSigmaPi = candidate.nSigTofPi2(); + valueTpcTofNSigmaPr = candidate.tpcTofNSigmaPr0(); + valueTpcTofNSigmaPi = candidate.tpcTofNSigmaPi2(); } else { chi2primProton = candidate.kfChi2PrimProng2(); chi2primPion = candidate.kfChi2PrimProng0(); @@ -711,12 +709,12 @@ struct HfTreeCreatorLcToPKPi { chi2GeoProtonKaon = candidate.kfChi2GeoProng1Prong2(); chi2GeoPionKaon = candidate.kfChi2GeoProng0Prong1(); mass = candidate.kfMassPiKP(); - valueTpcNSigmaPr = trackPos2.tpcNSigmaPr(); - valueTpcNSigmaPi = trackPos1.tpcNSigmaPi(); - valueTofNSigmaPr = trackPos2.tofNSigmaPr(); - valueTofNSigmaPi = trackPos1.tofNSigmaPi(); - valueTpcTofNSigmaPr = trackPos2.tpcTofNSigmaPr(); - valueTpcTofNSigmaPi = trackPos1.tpcTofNSigmaPi(); + valueTpcNSigmaPr = candidate.nSigTpcPr2(); + valueTpcNSigmaPi = candidate.nSigTpcPi0(); + valueTofNSigmaPr = candidate.nSigTofPr2(); + valueTofNSigmaPi = candidate.nSigTofPi0(); + valueTpcTofNSigmaPr = candidate.tpcTofNSigmaPr2(); + valueTpcTofNSigmaPi = candidate.tpcTofNSigmaPi0(); } const float svX = candidate.xSecondaryVertex(); const float svY = candidate.ySecondaryVertex(); @@ -847,7 +845,7 @@ struct HfTreeCreatorLcToPKPi { /// \param bcs Bunch-crossing table void processMcNoCentralityWithDCAFitterN(soa::Join const& collisions, aod::McCollisions const& mcCollisions, - soa::Join const& candidates, + soa::Join const& candidates, soa::Join const& particles, soa::Join const& tracks, aod::BCs const& bcs) { @@ -863,7 +861,7 @@ struct HfTreeCreatorLcToPKPi { /// \param bcs Bunch-crossing table void processMcWithCentralityWithDCAFitterN(soa::Join const& collisions, aod::McCollisions const& mcCollisions, - soa::Join const& candidates, + soa::Join const& candidates, soa::Join const& particles, soa::Join const& tracks, aod::BCs const& bcs) { @@ -880,7 +878,7 @@ struct HfTreeCreatorLcToPKPi { /// \param bcs Bunch-crossing table void processMcNoCentralityWithKFParticle(soa::Join const& collisions, aod::McCollisions const& mcCollisions, - soa::Join const& candidates, + soa::Join const& candidates, soa::Join const& particles, soa::Join const& tracks, aod::BCs const& bcs) { @@ -896,7 +894,7 @@ struct HfTreeCreatorLcToPKPi { /// \param bcs Bunch-crossing table void processMcWithCentralityWithKFParticle(soa::Join const& collisions, aod::McCollisions const& mcCollisions, - soa::Join const& candidates, + soa::Join const& candidates, soa::Join const& particles, soa::Join const& tracks, aod::BCs const& bcs) { @@ -969,12 +967,10 @@ struct HfTreeCreatorLcToPKPi { rowCollisionId.reserve(candidates.size()); } for (const auto& candidate : candidates) { - auto trackPos1 = candidate.template prong0_as(); // positive daughter (negative for the antiparticles) - auto trackNeg = candidate.template prong1_as(); // negative daughter (positive for the antiparticles) - auto trackPos2 = candidate.template prong2_as(); // positive daughter (negative for the antiparticles) + float ptProng0 = candidate.ptProng0(); auto collision = candidate.template collision_as(); auto fillTable = [&](int candFlag) { - double pseudoRndm = trackPos1.pt() * 1000. - static_cast(trackPos1.pt() * 1000); + double pseudoRndm = ptProng0 * 1000. - static_cast(ptProng0 * 1000); const int functionSelection = candFlag == 0 ? candidate.isSelLcToPKPi() : candidate.isSelLcToPiKP(); if (functionSelection >= selectionFlagLc && (candidate.pt() > downSampleBkgPtMax || (pseudoRndm < downSampleBkgFactor && candidate.pt() < downSampleBkgPtMax))) { float functionInvMass, functionInvMassKPi; @@ -1004,21 +1000,21 @@ struct HfTreeCreatorLcToPKPi { candidate.impactParameter0(), candidate.impactParameter1(), candidate.impactParameter2(), - trackPos1.tpcNSigmaPi(), - trackPos1.tpcNSigmaPr(), - trackPos1.tofNSigmaPi(), - trackPos1.tofNSigmaPr(), - trackNeg.tpcNSigmaKa(), - trackNeg.tofNSigmaKa(), - trackPos2.tpcNSigmaPi(), - trackPos2.tpcNSigmaPr(), - trackPos2.tofNSigmaPi(), - trackPos2.tofNSigmaPr(), - trackPos1.tpcTofNSigmaPi(), - trackPos1.tpcTofNSigmaPr(), - trackNeg.tpcTofNSigmaKa(), - trackPos2.tpcTofNSigmaPi(), - trackPos2.tpcTofNSigmaPr(), + candidate.nSigTpcPi0(), + candidate.nSigTpcPr0(), + candidate.nSigTofPi0(), + candidate.nSigTofPr0(), + candidate.nSigTpcKa1(), + candidate.nSigTofKa1(), + candidate.nSigTpcPi2(), + candidate.nSigTpcPr2(), + candidate.nSigTofPi2(), + candidate.nSigTofPr2(), + candidate.tpcTofNSigmaPi0(), + candidate.tpcTofNSigmaPr0(), + candidate.tpcTofNSigmaKa1(), + candidate.tpcTofNSigmaPi2(), + candidate.tpcTofNSigmaPr2(), 1 << candFlag, functionInvMass, candidate.pt(), @@ -1082,21 +1078,21 @@ struct HfTreeCreatorLcToPKPi { candidate.errorImpactParameter0(), candidate.errorImpactParameter1(), candidate.errorImpactParameter2(), - trackPos1.tpcNSigmaPi(), - trackPos1.tpcNSigmaPr(), - trackPos1.tofNSigmaPi(), - trackPos1.tofNSigmaPr(), - trackNeg.tpcNSigmaKa(), - trackNeg.tofNSigmaKa(), - trackPos2.tpcNSigmaPi(), - trackPos2.tpcNSigmaPr(), - trackPos2.tofNSigmaPi(), - trackPos2.tofNSigmaPr(), - trackPos1.tpcTofNSigmaPi(), - trackPos1.tpcTofNSigmaPr(), - trackNeg.tpcTofNSigmaKa(), - trackPos2.tpcTofNSigmaPi(), - trackPos2.tpcTofNSigmaPr(), + candidate.nSigTpcPi0(), + candidate.nSigTpcPr0(), + candidate.nSigTofPi0(), + candidate.nSigTofPr0(), + candidate.nSigTpcKa1(), + candidate.nSigTofKa1(), + candidate.nSigTpcPi2(), + candidate.nSigTpcPr2(), + candidate.nSigTofPi2(), + candidate.nSigTofPr2(), + candidate.tpcTofNSigmaPi0(), + candidate.tpcTofNSigmaPr0(), + candidate.tpcTofNSigmaKa1(), + candidate.tpcTofNSigmaPi2(), + candidate.tpcTofNSigmaPr2(), 1 << candFlag, functionInvMass, candidate.pt(), @@ -1125,13 +1121,13 @@ struct HfTreeCreatorLcToPKPi { float chi2GeoPionKaon; float mass; float valueTpcNSigmaPr; - const float valueTpcNSigmaKa = trackNeg.tpcNSigmaKa(); + const float valueTpcNSigmaKa = candidate.nSigTpcKa1(); float valueTpcNSigmaPi; float valueTofNSigmaPr; - const float valueTofNSigmaKa = trackNeg.tofNSigmaKa(); + const float valueTofNSigmaKa = candidate.nSigTofKa1(); float valueTofNSigmaPi; float valueTpcTofNSigmaPr; - const float valueTpcTofNSigmaKa = trackNeg.tpcTofNSigmaKa(); + const float valueTpcTofNSigmaKa = candidate.tpcTofNSigmaKa1(); float valueTpcTofNSigmaPi; if (candFlag == 0) { chi2primProton = candidate.kfChi2PrimProng0(); @@ -1141,12 +1137,12 @@ struct HfTreeCreatorLcToPKPi { chi2GeoProtonKaon = candidate.kfChi2GeoProng0Prong1(); chi2GeoPionKaon = candidate.kfChi2GeoProng1Prong2(); mass = candidate.kfMassPKPi(); - valueTpcNSigmaPr = trackPos1.tpcNSigmaPr(); - valueTpcNSigmaPi = trackPos2.tpcNSigmaPi(); - valueTofNSigmaPr = trackPos1.tofNSigmaPr(); - valueTofNSigmaPi = trackPos2.tofNSigmaPi(); - valueTpcTofNSigmaPr = trackPos1.tpcTofNSigmaPr(); - valueTpcTofNSigmaPi = trackPos2.tpcTofNSigmaPi(); + valueTpcNSigmaPr = candidate.nSigTpcPr0(); + valueTpcNSigmaPi = candidate.nSigTpcPi2(); + valueTofNSigmaPr = candidate.nSigTofPr0(); + valueTofNSigmaPi = candidate.nSigTofPi2(); + valueTpcTofNSigmaPr = candidate.tpcTofNSigmaPr0(); + valueTpcTofNSigmaPi = candidate.tpcTofNSigmaPi2(); } else { chi2primProton = candidate.kfChi2PrimProng2(); chi2primPion = candidate.kfChi2PrimProng0(); @@ -1155,12 +1151,12 @@ struct HfTreeCreatorLcToPKPi { chi2GeoProtonKaon = candidate.kfChi2GeoProng1Prong2(); chi2GeoPionKaon = candidate.kfChi2GeoProng0Prong1(); mass = candidate.kfMassPiKP(); - valueTpcNSigmaPr = trackPos2.tpcNSigmaPr(); - valueTpcNSigmaPi = trackPos1.tpcNSigmaPi(); - valueTofNSigmaPr = trackPos2.tofNSigmaPr(); - valueTofNSigmaPi = trackPos1.tofNSigmaPi(); - valueTpcTofNSigmaPr = trackPos2.tpcTofNSigmaPr(); - valueTpcTofNSigmaPi = trackPos1.tpcTofNSigmaPi(); + valueTpcNSigmaPr = candidate.nSigTpcPr2(); + valueTpcNSigmaPi = candidate.nSigTpcPi0(); + valueTofNSigmaPr = candidate.nSigTofPr2(); + valueTofNSigmaPi = candidate.nSigTofPi0(); + valueTpcTofNSigmaPr = candidate.tpcTofNSigmaPr2(); + valueTpcTofNSigmaPi = candidate.tpcTofNSigmaPi0(); } const float x = candidate.xSecondaryVertex(); const float y = candidate.ySecondaryVertex(); @@ -1222,7 +1218,7 @@ struct HfTreeCreatorLcToPKPi { /// \param tracks Track table /// \param bcs Bunch-crossing table void processDataNoCentralityWithDCAFitterN(soa::Join const& collisions, - soa::Join const& candidates, + soa::Join const& candidates, TracksWPid const& tracks, aod::BCs const& bcs) { fillTablesData(collisions, candidates, tracks, bcs); @@ -1235,7 +1231,7 @@ struct HfTreeCreatorLcToPKPi { /// \param tracks Track table /// \param bcs Bunch-crossing table void processDataWithCentralityWithDCAFitterN(soa::Join const& collisions, - soa::Join const& candidates, + soa::Join const& candidates, TracksWPid const& tracks, aod::BCs const& bcs) { fillTablesData(collisions, candidates, tracks, bcs); @@ -1248,7 +1244,7 @@ struct HfTreeCreatorLcToPKPi { /// \param tracks Track table /// \param bcs Bunch-crossing table void processDataNoCentralityWithKFParticle(soa::Join const& collisions, - soa::Join const& candidates, + soa::Join const& candidates, TracksWPid const& tracks, aod::BCs const& bcs) { fillTablesData(collisions, candidates, tracks, bcs); @@ -1261,7 +1257,7 @@ struct HfTreeCreatorLcToPKPi { /// \param tracks Track table /// \param bcs Bunch-crossing table void processDataWithCentralityWithKFParticle(soa::Join const& collisions, - soa::Join const& candidates, + soa::Join const& candidates, TracksWPid const& tracks, aod::BCs const& bcs) { fillTablesData(collisions, candidates, tracks, bcs); diff --git a/PWGHF/TableProducer/treeCreatorXicToPKPi.cxx b/PWGHF/TableProducer/treeCreatorXicToPKPi.cxx index 915cfba1bda..94ad232d565 100644 --- a/PWGHF/TableProducer/treeCreatorXicToPKPi.cxx +++ b/PWGHF/TableProducer/treeCreatorXicToPKPi.cxx @@ -226,10 +226,9 @@ struct HfTreeCreatorXicToPKPi { HfHelper hfHelper; - using CandXicData = soa::Filtered>; - using CandXicMcReco = soa::Filtered>; + using CandXicData = soa::Filtered>; + using CandXicMcReco = soa::Filtered>; using CandXicMcGen = soa::Filtered>; - using TracksWPid = soa::Join; Filter filterSelectCandidates = aod::hf_sel_candidate_xic::isSelXicToPKPi >= selectionFlagXic || aod::hf_sel_candidate_xic::isSelXicToPiKP >= selectionFlagXic; Filter filterMcGenMatching = nabs(o2::aod::hf_cand_3prong::flagMcMatchGen) == static_cast(BIT(aod::hf_cand_3prong::DecayType::XicToPKPi)); @@ -279,10 +278,6 @@ struct HfTreeCreatorXicToPKPi { invMassXic = hfHelper.invMassXicToPiKP(candidate); } - auto trackPos1 = candidate.template prong0_as(); // positive daughter (negative for the antiparticles) - auto trackNeg = candidate.template prong1_as(); // negative daughter (positive for the antiparticles) - auto trackPos2 = candidate.template prong2_as(); // positive daughter (negative for the antiparticles) - if (fillCandidateLiteTable) { rowCandidateLite( candidate.chi2PCA(), @@ -296,21 +291,21 @@ struct HfTreeCreatorXicToPKPi { candidate.impactParameter0(), candidate.impactParameter1(), candidate.impactParameter2(), - trackPos1.tpcNSigmaPi(), - trackPos1.tpcNSigmaPr(), - trackPos1.tofNSigmaPi(), - trackPos1.tofNSigmaPr(), - trackNeg.tpcNSigmaKa(), - trackNeg.tofNSigmaKa(), - trackPos2.tpcNSigmaPi(), - trackPos2.tpcNSigmaPr(), - trackPos2.tofNSigmaPi(), - trackPos2.tofNSigmaPr(), - trackPos1.tpcTofNSigmaPi(), - trackPos1.tpcTofNSigmaPr(), - trackNeg.tpcTofNSigmaKa(), - trackPos2.tpcTofNSigmaPi(), - trackPos2.tpcTofNSigmaPr(), + candidate.nSigTpcPi0(), + candidate.nSigTpcPr0(), + candidate.nSigTofPi0(), + candidate.nSigTofPr0(), + candidate.nSigTpcKa1(), + candidate.nSigTofKa1(), + candidate.nSigTpcPi2(), + candidate.nSigTpcPr2(), + candidate.nSigTofPi2(), + candidate.nSigTofPr2(), + candidate.tpcTofNSigmaPi0(), + candidate.tpcTofNSigmaPr0(), + candidate.tpcTofNSigmaKa1(), + candidate.tpcTofNSigmaPi2(), + candidate.tpcTofNSigmaPr2(), candidate.isSelXicToPKPi(), candidate.isSelXicToPiKP(), invMassXic, @@ -363,21 +358,21 @@ struct HfTreeCreatorXicToPKPi { candidate.errorImpactParameter0(), candidate.errorImpactParameter1(), candidate.errorImpactParameter2(), - trackPos1.tpcNSigmaPi(), - trackPos1.tpcNSigmaPr(), - trackPos1.tofNSigmaPi(), - trackPos1.tofNSigmaPr(), - trackNeg.tpcNSigmaKa(), - trackNeg.tofNSigmaKa(), - trackPos2.tpcNSigmaPi(), - trackPos2.tpcNSigmaPr(), - trackPos2.tofNSigmaPi(), - trackPos2.tofNSigmaPr(), - trackPos1.tpcTofNSigmaPi(), - trackPos1.tpcTofNSigmaPr(), - trackNeg.tpcTofNSigmaKa(), - trackPos2.tpcTofNSigmaPi(), - trackPos2.tpcTofNSigmaPr(), + candidate.nSigTpcPi0(), + candidate.nSigTpcPr0(), + candidate.nSigTofPi0(), + candidate.nSigTofPr0(), + candidate.nSigTpcKa1(), + candidate.nSigTofKa1(), + candidate.nSigTpcPi2(), + candidate.nSigTpcPr2(), + candidate.nSigTofPi2(), + candidate.nSigTofPr2(), + candidate.tpcTofNSigmaPi0(), + candidate.tpcTofNSigmaPr0(), + candidate.tpcTofNSigmaKa1(), + candidate.tpcTofNSigmaPi2(), + candidate.tpcTofNSigmaPr2(), candidate.isSelXicToPKPi(), candidate.isSelXicToPiKP(), invMassXic, @@ -397,8 +392,7 @@ struct HfTreeCreatorXicToPKPi { } void processData(aod::Collisions const& collisions, - CandXicData const&, - TracksWPid const&) + CandXicData const&) { // Filling event properties rowCandidateFullEvents.reserve(collisions.size()); @@ -438,8 +432,7 @@ struct HfTreeCreatorXicToPKPi { void processMc(aod::Collisions const& collisions, aod::McCollisions const&, CandXicMcReco const&, - CandXicMcGen const& mcParticles, - TracksWPid const&) + CandXicMcGen const& mcParticles) { // Filling event properties rowCandidateFullEvents.reserve(collisions.size()); From d91b22f161cc78f1c3bf47b3c8faeff0b5e49353 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Fri, 2 May 2025 22:42:59 +0200 Subject: [PATCH 1159/1650] [ALICE3] A3TOF: fix linter (#11056) --- ALICE3/TableProducer/OTF/CMakeLists.txt | 2 +- ...{onTheFlyTOFPID.cxx => onTheFlyTofPid.cxx} | 183 +++++++++--------- 2 files changed, 95 insertions(+), 90 deletions(-) rename ALICE3/TableProducer/OTF/{onTheFlyTOFPID.cxx => onTheFlyTofPid.cxx} (80%) diff --git a/ALICE3/TableProducer/OTF/CMakeLists.txt b/ALICE3/TableProducer/OTF/CMakeLists.txt index d20b6c6ba5c..b7d40692770 100644 --- a/ALICE3/TableProducer/OTF/CMakeLists.txt +++ b/ALICE3/TableProducer/OTF/CMakeLists.txt @@ -15,7 +15,7 @@ o2physics_add_dpl_workflow(onthefly-tracker COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(onthefly-tofpid - SOURCES onTheFlyTOFPID.cxx + SOURCES onTheFlyTofPid.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2::DetectorsBase O2Physics::AnalysisCore O2::ReconstructionDataFormats O2::DetectorsCommonDataFormats O2Physics::ALICE3Core COMPONENT_NAME Analysis) diff --git a/ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx b/ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx similarity index 80% rename from ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx rename to ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx index 2116462ea3c..a5369844575 100644 --- a/ALICE3/TableProducer/OTF/onTheFlyTOFPID.cxx +++ b/ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx @@ -8,18 +8,21 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file onTheFlyTOFPID.cxx +/// +/// \file onTheFlyTofPid.cxx /// /// \brief This task goes straight from a combination of track table and mcParticles -/// and a custom TOF configuration to a table of TOF NSigmas for the particles -/// being analysed. It currently contemplates 5 particle types: -/// electrons, pions, kaons, protons and muons +/// and a custom TOF configuration to a table of TOF NSigmas for the particles +/// being analysed. It currently contemplates 5 particle types: +/// electrons, pions, kaons, protons and muons /// -/// More particles could be added but would have to be added to the LUT -/// being used in the onTheFly tracker task. +/// More particles could be added but would have to be added to the LUT +/// being used in the onTheFly tracker task. /// /// \author David Dobrigkeit Chinellato, UNICAMP /// \author Nicola Nicassio, University and INFN Bari +/// \since May 22, 2024 +/// #include #include @@ -126,6 +129,7 @@ struct OnTheFlyTofPid { // for handling basic QA histograms if requested HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + static constexpr int kParticles = 5; void init(o2::framework::InitContext&) { @@ -192,44 +196,41 @@ struct OnTheFlyTofPid { histos.add("h2dRelativePtResolution", "h2dRelativePtResolution", kTH2F, {axisPt, axisRelativePt}); histos.add("h2dRelativeEtaResolution", "h2dRelativeEtaResolution", kTH2F, {axisEta, axisRelativeEta}); - std::string particle_names1[5] = {"#it{e}", "#it{#mu}", "#it{#pi}", "#it{K}", "#it{p}"}; - std::string particle_names2[5] = {"Elec", "Muon", "Pion", "Kaon", "Prot"}; - for (int i_true = 0; i_true < 5; i_true++) { - std::string name_title_inner_track_res = "h2dInnerTimeResTrack" + particle_names2[i_true] + "VsP"; - std::string name_title_inner_total_res = "h2dInnerTimeResTotal" + particle_names2[i_true] + "VsP"; - std::string name_title_outer_track_res = "h2dOuterTimeResTrack" + particle_names2[i_true] + "VsP"; - std::string name_title_outer_total_res = "h2dOuterTimeResTotal" + particle_names2[i_true] + "VsP"; - const AxisSpec axisTrackTimeRes{static_cast(plotsConfig.nBinsTimeRes), 0.0f, +200.0f, "Track time resolution - " + particle_names1[i_true] + " (ps)"}; - const AxisSpec axisTotalTimeRes{static_cast(plotsConfig.nBinsTimeRes), 0.0f, +200.0f, "Total time resolution - " + particle_names1[i_true] + " (ps)"}; - h2dInnerTimeResTrack[i_true] = histos.add(name_title_inner_track_res.c_str(), name_title_inner_track_res.c_str(), kTH2F, {axisMomentum, axisTrackTimeRes}); - h2dInnerTimeResTotal[i_true] = histos.add(name_title_inner_total_res.c_str(), name_title_inner_total_res.c_str(), kTH2F, {axisMomentum, axisTotalTimeRes}); - h2dOuterTimeResTrack[i_true] = histos.add(name_title_outer_track_res.c_str(), name_title_outer_track_res.c_str(), kTH2F, {axisMomentum, axisTrackTimeRes}); - h2dOuterTimeResTotal[i_true] = histos.add(name_title_outer_total_res.c_str(), name_title_outer_total_res.c_str(), kTH2F, {axisMomentum, axisTotalTimeRes}); - } - - for (int i_true = 0; i_true < 5; i_true++) { - for (int i_hyp = 0; i_hyp < 5; i_hyp++) { - std::string name_title_inner = "h2dInnerNsigmaTrue" + particle_names2[i_true] + "Vs" + particle_names2[i_hyp] + "Hypothesis"; - std::string name_title_outer = "h2dOuterNsigmaTrue" + particle_names2[i_true] + "Vs" + particle_names2[i_hyp] + "Hypothesis"; - std::string name_title_inner_delta = "h2dInnerDeltaTrue" + particle_names2[i_true] + "Vs" + particle_names2[i_hyp] + "Hypothesis"; - std::string name_title_outer_delta = "h2dOuterDeltaTrue" + particle_names2[i_true] + "Vs" + particle_names2[i_hyp] + "Hypothesis"; + std::string particleNames[kParticles] = {"#it{e}", "#it{#mu}", "#it{#pi}", "#it{K}", "#it{p}"}; + std::string particleNames2[kParticles] = {"Elec", "Muon", "Pion", "Kaon", "Prot"}; + for (int i_true = 0; i_true < kParticles; i_true++) { + std::string nameTitleInnerTrackRes = "h2dInnerTimeResTrack" + particleNames2[i_true] + "VsP"; + std::string nameTitleTotalRes = "h2dInnerTimeResTotal" + particleNames2[i_true] + "VsP"; + std::string nameTitleOuterTrackRes = "h2dOuterTimeResTrack" + particleNames2[i_true] + "VsP"; + std::string nameTitleOuterTotalRes = "h2dOuterTimeResTotal" + particleNames2[i_true] + "VsP"; + const AxisSpec axisTrackTimeRes{static_cast(plotsConfig.nBinsTimeRes), 0.0f, +200.0f, "Track time resolution - " + particleNames[i_true] + " (ps)"}; + const AxisSpec axisTotalTimeRes{static_cast(plotsConfig.nBinsTimeRes), 0.0f, +200.0f, "Total time resolution - " + particleNames[i_true] + " (ps)"}; + h2dInnerTimeResTrack[i_true] = histos.add(nameTitleInnerTrackRes, nameTitleInnerTrackRes.c_str(), kTH2F, {axisMomentum, axisTrackTimeRes}); + h2dInnerTimeResTotal[i_true] = histos.add(nameTitleTotalRes, nameTitleTotalRes.c_str(), kTH2F, {axisMomentum, axisTotalTimeRes}); + h2dOuterTimeResTrack[i_true] = histos.add(nameTitleOuterTrackRes, nameTitleOuterTrackRes.c_str(), kTH2F, {axisMomentum, axisTrackTimeRes}); + h2dOuterTimeResTotal[i_true] = histos.add(nameTitleOuterTotalRes, nameTitleOuterTotalRes.c_str(), kTH2F, {axisMomentum, axisTotalTimeRes}); + for (int i_hyp = 0; i_hyp < kParticles; i_hyp++) { + std::string nameTitleInner = "h2dInnerNsigmaTrue" + particleNames2[i_true] + "Vs" + particleNames2[i_hyp] + "Hypothesis"; + std::string nameTitleOuter = "h2dOuterNsigmaTrue" + particleNames2[i_true] + "Vs" + particleNames2[i_hyp] + "Hypothesis"; + std::string nameTitleInnerDelta = "h2dInnerDeltaTrue" + particleNames2[i_true] + "Vs" + particleNames2[i_hyp] + "Hypothesis"; + std::string nameTitleOuterDelta = "h2dOuterDeltaTrue" + particleNames2[i_true] + "Vs" + particleNames2[i_hyp] + "Hypothesis"; const AxisSpec axisX{plotsConfig.doSeparationVsPt.value ? axisPt : axisMomentum}; if (i_true == i_hyp) { - const AxisSpec axisNsigmaCorrect{static_cast(plotsConfig.nBinsNsigmaCorrectSpecies), plotsConfig.minNsigmaRange, plotsConfig.maxNsigmaRange, "N#sigma - True " + particle_names1[i_true] + " vs " + particle_names1[i_hyp] + " hypothesis"}; - h2dInnerNsigmaTrue[i_true][i_hyp] = histos.add(name_title_inner.c_str(), name_title_inner.c_str(), kTH2F, {axisX, axisNsigmaCorrect}); - h2dOuterNsigmaTrue[i_true][i_hyp] = histos.add(name_title_outer.c_str(), name_title_outer.c_str(), kTH2F, {axisX, axisNsigmaCorrect}); + const AxisSpec axisNsigmaCorrect{static_cast(plotsConfig.nBinsNsigmaCorrectSpecies), plotsConfig.minNsigmaRange, plotsConfig.maxNsigmaRange, "N#sigma - True " + particleNames[i_true] + " vs " + particleNames[i_hyp] + " hypothesis"}; + h2dInnerNsigmaTrue[i_true][i_hyp] = histos.add(nameTitleInner, nameTitleInner.c_str(), kTH2F, {axisX, axisNsigmaCorrect}); + h2dOuterNsigmaTrue[i_true][i_hyp] = histos.add(nameTitleOuter, nameTitleOuter.c_str(), kTH2F, {axisX, axisNsigmaCorrect}); - const AxisSpec axisDeltaCorrect{static_cast(plotsConfig.nBinsDeltaCorrectSpecies), plotsConfig.minDeltaRange, plotsConfig.maxDeltaRange, "#Delta - True " + particle_names1[i_true] + " vs " + particle_names1[i_hyp] + " hypothesis"}; - h2dInnerDeltaTrue[i_true][i_hyp] = histos.add(name_title_inner_delta.c_str(), name_title_inner_delta.c_str(), kTH2F, {axisX, axisDeltaCorrect}); - h2dOuterDeltaTrue[i_true][i_hyp] = histos.add(name_title_outer_delta.c_str(), name_title_outer_delta.c_str(), kTH2F, {axisX, axisDeltaCorrect}); + const AxisSpec axisDeltaCorrect{static_cast(plotsConfig.nBinsDeltaCorrectSpecies), plotsConfig.minDeltaRange, plotsConfig.maxDeltaRange, "#Delta - True " + particleNames[i_true] + " vs " + particleNames[i_hyp] + " hypothesis"}; + h2dInnerDeltaTrue[i_true][i_hyp] = histos.add(nameTitleInnerDelta, nameTitleInnerDelta.c_str(), kTH2F, {axisX, axisDeltaCorrect}); + h2dOuterDeltaTrue[i_true][i_hyp] = histos.add(nameTitleOuterDelta, nameTitleOuterDelta.c_str(), kTH2F, {axisX, axisDeltaCorrect}); } else { - const AxisSpec axisNsigmaWrong{static_cast(plotsConfig.nBinsNsigmaWrongSpecies), plotsConfig.minNsigmaRange, plotsConfig.maxNsigmaRange, "N#sigma - True " + particle_names1[i_true] + " vs " + particle_names1[i_hyp] + " hypothesis"}; - h2dInnerNsigmaTrue[i_true][i_hyp] = histos.add(name_title_inner.c_str(), name_title_inner.c_str(), kTH2F, {axisX, axisNsigmaWrong}); - h2dOuterNsigmaTrue[i_true][i_hyp] = histos.add(name_title_outer.c_str(), name_title_outer.c_str(), kTH2F, {axisX, axisNsigmaWrong}); + const AxisSpec axisNsigmaWrong{static_cast(plotsConfig.nBinsNsigmaWrongSpecies), plotsConfig.minNsigmaRange, plotsConfig.maxNsigmaRange, "N#sigma - True " + particleNames[i_true] + " vs " + particleNames[i_hyp] + " hypothesis"}; + h2dInnerNsigmaTrue[i_true][i_hyp] = histos.add(nameTitleInner, nameTitleInner.c_str(), kTH2F, {axisX, axisNsigmaWrong}); + h2dOuterNsigmaTrue[i_true][i_hyp] = histos.add(nameTitleOuter, nameTitleOuter.c_str(), kTH2F, {axisX, axisNsigmaWrong}); - const AxisSpec axisDeltaWrong{static_cast(plotsConfig.nBinsDeltaWrongSpecies), plotsConfig.minDeltaRange, plotsConfig.maxDeltaRange, "#Delta - True " + particle_names1[i_true] + " vs " + particle_names1[i_hyp] + " hypothesis"}; - h2dInnerDeltaTrue[i_true][i_hyp] = histos.add(name_title_inner_delta.c_str(), name_title_inner_delta.c_str(), kTH2F, {axisX, axisDeltaWrong}); - h2dOuterDeltaTrue[i_true][i_hyp] = histos.add(name_title_outer_delta.c_str(), name_title_outer_delta.c_str(), kTH2F, {axisX, axisDeltaWrong}); + const AxisSpec axisDeltaWrong{static_cast(plotsConfig.nBinsDeltaWrongSpecies), plotsConfig.minDeltaRange, plotsConfig.maxDeltaRange, "#Delta - True " + particleNames[i_true] + " vs " + particleNames[i_hyp] + " hypothesis"}; + h2dInnerDeltaTrue[i_true][i_hyp] = histos.add(nameTitleInnerDelta, nameTitleInnerDelta.c_str(), kTH2F, {axisX, axisDeltaWrong}); + h2dOuterDeltaTrue[i_true][i_hyp] = histos.add(nameTitleOuterDelta, nameTitleOuterDelta.c_str(), kTH2F, {axisX, axisDeltaWrong}); } } } @@ -383,17 +384,17 @@ struct OnTheFlyTofPid { } const float mass = pdgInfo->Mass(); const float mass2 = mass * mass; - const float tof = track.mInnerTOFTime.first; // [ps] - const float etof = track.mInnerTOFTime.second; // [ps] - const float L = track.mTrackLengthInnerTOF.first; // [cm] - float p = track.mMomentum.first; // [GeV/c] - p *= std::abs(pdgInfo->Charge()) / 3.; // Total momentum - const float ep = track.mMomentum.second; // [GeV/c] + const float tof = track.mInnerTOFTime.first; // [ps] + const float etof = track.mInnerTOFTime.second; // [ps] + const float length = track.mTrackLengthInnerTOF.first; // [cm] + float p = track.mMomentum.first; // [GeV/c] + p *= std::abs(pdgInfo->Charge()) / 3.; // Total momentum + const float ep = track.mMomentum.second; // [GeV/c] const float p2 = p * p; - const float Lc = L * o2::constants::physics::invLightSpeedCm2PS; - const float texp = Lc / p * std::sqrt(mass2 + p2); + const float lengthOverC = length * o2::constants::physics::invLightSpeedCm2PS; + const float texp = lengthOverC / p * std::sqrt(mass2 + p2); // LOG(info) << "TOF: " << tof << " " << etof << " vs " << texp; - const float etexp = Lc * mass2 / p2 / std::sqrt(mass2 + p2) * ep; + const float etexp = lengthOverC * mass2 / p2 / std::sqrt(mass2 + p2) * ep; const float sigma = std::sqrt(etexp * etexp + etof * etof); const float deltat = tof - texp; @@ -417,28 +418,28 @@ struct OnTheFlyTofPid { /// returns track time resolution /// \param pt the transverse momentum of the tarck /// \param eta the pseudorapidity of the tarck - /// \param track_pt_resolution the absolute resolution on pt - /// \param track_pt_resolution the absolute resolution on eta + /// \param trackPtResolution the absolute resolution on pt + /// \param trackEtaResolution the absolute resolution on eta /// \param mass the mass of the particle - /// \param det_radius the radius of the cylindrical layer + /// \param detRadius the radius of the cylindrical layer /// \param magneticField the magnetic field (along Z) - double calculate_track_time_resolution_advanced(float pt, - float eta, - float track_pt_resolution, - float track_eta_resolution, - float mass, - float det_radius, - float magneticField) + double calculateTrackTimeResolutionAdvanced(float pt, + float eta, + float trackPtResolution, + float trackEtaResolution, + float mass, + float detRadius, + float magneticField) { // Compute tracking contribution to timing using the error propagation formula // Uses light speed in m/ps, magnetic field in T (*0.1 for conversion kGauss -> T) double a0 = mass * mass; double a1 = 0.299792458 * (0.1 * magneticField) * (0.01 * o2::constants::physics::LightSpeedCm2NS / 1e+3); - double a2 = (det_radius * 0.01) * (det_radius * 0.01) * (0.299792458) * (0.299792458) * (0.1 * magneticField) * (0.1 * magneticField) / 2.0; - double dtof_on_dpt = (std::pow(pt, 4) * std::pow(std::cosh(eta), 2) * std::acos(1.0 - a2 / std::pow(pt, 2)) - 2.0 * a2 * std::pow(pt, 2) * (a0 + std::pow(pt * std::cosh(eta), 2)) / std::sqrt(a2 * (2.0 * std::pow(pt, 2) - a2))) / (a1 * std::pow(pt, 3) * std::sqrt(a0 + std::pow(pt * std::cosh(eta), 2))); - double dtof_on_deta = std::pow(pt, 2) * std::sinh(eta) * std::cosh(eta) * std::acos(1.0 - a2 / std::pow(pt, 2)) / (a1 * std::sqrt(a0 + std::pow(pt * std::cosh(eta), 2))); - double track_time_resolution = std::hypot(std::fabs(dtof_on_dpt) * track_pt_resolution, std::fabs(dtof_on_deta) * track_eta_resolution); - return track_time_resolution; + double a2 = (detRadius * 0.01) * (detRadius * 0.01) * (0.299792458) * (0.299792458) * (0.1 * magneticField) * (0.1 * magneticField) / 2.0; + double dtofOndPt = (std::pow(pt, 4) * std::pow(std::cosh(eta), 2) * std::acos(1.0 - a2 / std::pow(pt, 2)) - 2.0 * a2 * std::pow(pt, 2) * (a0 + std::pow(pt * std::cosh(eta), 2)) / std::sqrt(a2 * (2.0 * std::pow(pt, 2) - a2))) / (a1 * std::pow(pt, 3) * std::sqrt(a0 + std::pow(pt * std::cosh(eta), 2))); + double dtofOndEta = std::pow(pt, 2) * std::sinh(eta) * std::cosh(eta) * std::acos(1.0 - a2 / std::pow(pt, 2)) / (a1 * std::sqrt(a0 + std::pow(pt * std::cosh(eta), 2))); + double trackTimeResolution = std::hypot(std::fabs(dtofOndPt) * trackPtResolution, std::fabs(dtofOndEta) * trackEtaResolution); + return trackTimeResolution; } void process(soa::Join::iterator const& collision, @@ -498,9 +499,11 @@ struct OnTheFlyTofPid { o2::track::TrackParCov o2track = convertMCParticleToO2Track(mcParticle); float xPv = -100, trackLengthInnerTOF = -1, trackLengthOuterTOF = -1; - if (o2track.propagateToDCA(mcPvVtx, simConfig.dBz)) + static constexpr float kTrkXThreshold = -99.f; // Threshold to consider a good propagation of the track + if (o2track.propagateToDCA(mcPvVtx, simConfig.dBz)) { xPv = o2track.getX(); - if (xPv > -99.) { + } + if (xPv > kTrkXThreshold) { trackLengthInnerTOF = trackLength(o2track, simConfig.innerTOFRadius, simConfig.dBz); trackLengthOuterTOF = trackLength(o2track, simConfig.outerTOFRadius, simConfig.dBz); } @@ -523,9 +526,10 @@ struct OnTheFlyTofPid { // and the (imperfect!) reconstructed track parametrizations float trackLengthRecoInnerTOF = -1, trackLengthRecoOuterTOF = -1; auto recoTrack = getTrackParCov(track); - if (recoTrack.propagateToDCA(pvVtx, simConfig.dBz)) + if (recoTrack.propagateToDCA(pvVtx, simConfig.dBz)) { xPv = recoTrack.getX(); - if (xPv > -99.) { + } + if (xPv > kTrkXThreshold) { trackLengthRecoInnerTOF = trackLength(recoTrack, simConfig.innerTOFRadius, simConfig.dBz); trackLengthRecoOuterTOF = trackLength(recoTrack, simConfig.outerTOFRadius, simConfig.dBz); } @@ -579,11 +583,11 @@ struct OnTheFlyTofPid { const float noSmearingPt = trkWithTime.mNoSmearingPt; // Straight to Nsigma - static std::array expectedTimeInnerTOF, expectedTimeOuterTOF; - static std::array deltaTimeInnerTOF, deltaTimeOuterTOF; - static std::array nSigmaInnerTOF, nSigmaOuterTOF; - static constexpr int pdgArray[5] = {kElectron, kMuonMinus, kPiPlus, kKPlus, kProton}; - float masses[5]; + static std::array expectedTimeInnerTOF, expectedTimeOuterTOF; + static std::array deltaTimeInnerTOF, deltaTimeOuterTOF; + static std::array nSigmaInnerTOF, nSigmaOuterTOF; + static constexpr int kParticlePdgs[kParticles] = {kElectron, kMuonMinus, kPiPlus, kKPlus, kProton}; + float masses[kParticles]; if (plotsConfig.doQAplots) { // unit conversion: length in cm, time in ps @@ -601,11 +605,11 @@ struct OnTheFlyTofPid { } } - for (int ii = 0; ii < 5; ii++) { + for (int ii = 0; ii < kParticles; ii++) { nSigmaInnerTOF[ii] = -100; nSigmaOuterTOF[ii] = -100; - auto pdgInfoThis = pdg->GetParticle(pdgArray[ii]); + auto pdgInfoThis = pdg->GetParticle(kParticlePdgs[ii]); masses[ii] = pdgInfoThis->Mass(); const float v = particleVelocity(momentum, masses[ii]); @@ -619,30 +623,31 @@ struct OnTheFlyTofPid { float innerTotalTimeReso = simConfig.innerTOFTimeReso; float outerTotalTimeReso = simConfig.outerTOFTimeReso; if (simConfig.flagIncludeTrackTimeRes) { - double pt_resolution = std::pow(momentum / std::cosh(pseudorapidity), 2) * std::sqrt(trkWithTime.mMomentum.second); - double eta_resolution = std::fabs(std::sin(2.0 * std::atan(std::exp(-pseudorapidity)))) * std::sqrt(trkWithTime.mPseudorapidity.second); + double ptResolution = std::pow(momentum / std::cosh(pseudorapidity), 2) * std::sqrt(trkWithTime.mMomentum.second); + double etaResolution = std::fabs(std::sin(2.0 * std::atan(std::exp(-pseudorapidity)))) * std::sqrt(trkWithTime.mPseudorapidity.second); if (simConfig.flagTOFLoadDelphesLUTs) { - pt_resolution = mSmearer.getAbsPtRes(pdgInfoThis->PdgCode(), dNdEta, pseudorapidity, momentum / std::cosh(pseudorapidity)); - eta_resolution = mSmearer.getAbsEtaRes(pdgInfoThis->PdgCode(), dNdEta, pseudorapidity, momentum / std::cosh(pseudorapidity)); + ptResolution = mSmearer.getAbsPtRes(pdgInfoThis->PdgCode(), dNdEta, pseudorapidity, momentum / std::cosh(pseudorapidity)); + etaResolution = mSmearer.getAbsEtaRes(pdgInfoThis->PdgCode(), dNdEta, pseudorapidity, momentum / std::cosh(pseudorapidity)); } - float innerTrackTimeReso = calculate_track_time_resolution_advanced(momentum / std::cosh(pseudorapidity), pseudorapidity, pt_resolution, eta_resolution, masses[ii], simConfig.innerTOFRadius, simConfig.dBz); - float outerTrackTimeReso = calculate_track_time_resolution_advanced(momentum / std::cosh(pseudorapidity), pseudorapidity, pt_resolution, eta_resolution, masses[ii], simConfig.outerTOFRadius, simConfig.dBz); + float innerTrackTimeReso = calculateTrackTimeResolutionAdvanced(momentum / std::cosh(pseudorapidity), pseudorapidity, ptResolution, etaResolution, masses[ii], simConfig.innerTOFRadius, simConfig.dBz); + float outerTrackTimeReso = calculateTrackTimeResolutionAdvanced(momentum / std::cosh(pseudorapidity), pseudorapidity, ptResolution, etaResolution, masses[ii], simConfig.outerTOFRadius, simConfig.dBz); innerTotalTimeReso = std::hypot(simConfig.innerTOFTimeReso, innerTrackTimeReso); outerTotalTimeReso = std::hypot(simConfig.outerTOFTimeReso, outerTrackTimeReso); if (plotsConfig.doQAplots) { - if (std::fabs(mcParticle.pdgCode()) == pdg->GetParticle(pdgArray[ii])->PdgCode()) { + if (std::fabs(mcParticle.pdgCode()) == pdg->GetParticle(kParticlePdgs[ii])->PdgCode()) { if (trackLengthRecoInnerTOF > 0) { h2dInnerTimeResTrack[ii]->Fill(momentum, innerTrackTimeReso); h2dInnerTimeResTotal[ii]->Fill(momentum, innerTotalTimeReso); } if (trackLengthRecoOuterTOF > 0) { - float transverse_momentum = momentum / std::cosh(pseudorapidity); + const float transverseMomentum = momentum / std::cosh(pseudorapidity); h2dOuterTimeResTrack[ii]->Fill(momentum, outerTrackTimeReso); h2dOuterTimeResTotal[ii]->Fill(momentum, outerTotalTimeReso); - if (ii == 2) { - histos.fill(HIST("h2dRelativePtResolution"), transverse_momentum, 100.0 * pt_resolution / transverse_momentum); - histos.fill(HIST("h2dRelativeEtaResolution"), pseudorapidity, 100.0 * eta_resolution / (std::fabs(pseudorapidity) + 1e-6)); + static constexpr int kIdPion = 2; + if (ii == kIdPion) { + histos.fill(HIST("h2dRelativePtResolution"), transverseMomentum, 100.0 * ptResolution / transverseMomentum); + histos.fill(HIST("h2dRelativeEtaResolution"), pseudorapidity, 100.0 * etaResolution / (std::fabs(pseudorapidity) + 1e-6)); } } } @@ -659,18 +664,18 @@ struct OnTheFlyTofPid { } if (plotsConfig.doQAplots) { - for (int ii = 0; ii < 5; ii++) { - if (std::fabs(mcParticle.pdgCode()) != pdg->GetParticle(pdgArray[ii])->PdgCode()) { + for (int ii = 0; ii < kParticles; ii++) { + if (std::fabs(mcParticle.pdgCode()) != pdg->GetParticle(kParticlePdgs[ii])->PdgCode()) { continue; } if (trackLengthRecoInnerTOF > 0) { - for (int iii = 0; iii < 5; iii++) { + for (int iii = 0; iii < kParticles; iii++) { h2dInnerNsigmaTrue[ii][iii]->Fill(momentum, nSigmaInnerTOF[iii]); h2dInnerDeltaTrue[ii][iii]->Fill(momentum, deltaTimeInnerTOF[iii]); } } if (trackLengthRecoOuterTOF > 0) { - for (int iii = 0; iii < 5; iii++) { + for (int iii = 0; iii < kParticles; iii++) { h2dOuterNsigmaTrue[ii][iii]->Fill(momentum, nSigmaOuterTOF[iii]); h2dOuterDeltaTrue[ii][iii]->Fill(momentum, deltaTimeOuterTOF[iii]); } From 0cdf4363d05aff2e7ebd57e84c30fabd4158618e Mon Sep 17 00:00:00 2001 From: Artem Kotliarov <71133985+KotliarovAr@users.noreply.github.com> Date: Sat, 3 May 2025 01:29:11 +0200 Subject: [PATCH 1160/1650] [PWGJE] Reduce the storage size (#11052) --- PWGJE/Tasks/CMakeLists.txt | 6 +- ...ggerQATask.cxx => jetTriggerChargedQa.cxx} | 249 +++++++++--------- PWGJE/Tasks/recoilJets.cxx | 2 +- 3 files changed, 129 insertions(+), 128 deletions(-) rename PWGJE/Tasks/{ChJetTriggerQATask.cxx => jetTriggerChargedQa.cxx} (54%) diff --git a/PWGJE/Tasks/CMakeLists.txt b/PWGJE/Tasks/CMakeLists.txt index 0b8443531f8..1a0854a2fbf 100644 --- a/PWGJE/Tasks/CMakeLists.txt +++ b/PWGJE/Tasks/CMakeLists.txt @@ -160,8 +160,8 @@ if(FastJet_FOUND) SOURCES triggerCorrelations.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2::EMCALBase O2::EMCALCalib O2Physics::PWGJECore O2Physics::AnalysisCore COMPONENT_NAME Analysis) - o2physics_add_dpl_workflow(jet-charged-trigger-qa - SOURCES ChJetTriggerQATask.cxx + o2physics_add_dpl_workflow(jet-trigger-charged-qa + SOURCES jetTriggerChargedQa.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(jet-full-trigger-qa @@ -269,4 +269,4 @@ if(FastJet_FOUND) SOURCES jetShape.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore COMPONENT_NAME Analysis) -endif() \ No newline at end of file +endif() diff --git a/PWGJE/Tasks/ChJetTriggerQATask.cxx b/PWGJE/Tasks/jetTriggerChargedQa.cxx similarity index 54% rename from PWGJE/Tasks/ChJetTriggerQATask.cxx rename to PWGJE/Tasks/jetTriggerChargedQa.cxx index 6b60b68569d..3cbb9e18070 100644 --- a/PWGJE/Tasks/ChJetTriggerQATask.cxx +++ b/PWGJE/Tasks/jetTriggerChargedQa.cxx @@ -9,15 +9,16 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -// jet Trigger QA Task -// -/// \author Filip Krizek +/// \author Filip Krizek +/// \author Kotliarov Artem +/// \file jetTriggerChargedQa.cxx +/// \brief QA of trigger performance for charged jets + #include #include #include #include #include -#include #include "Framework/ASoA.h" #include "Framework/AnalysisDataModel.h" @@ -26,6 +27,7 @@ #include "EventFiltering/filterTables.h" +#include "CommonConstants/MathConstants.h" #include "Common/Core/TrackSelection.h" #include "Common/Core/TrackSelectionDefaults.h" #include "Common/DataModel/EventSelection.h" @@ -44,14 +46,14 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; -using filteredColl = soa::Filtered>::iterator; -using filteredJTracks = soa::Filtered>; -using filteredJets = soa::Filtered>; -using joinedTracks = soa::Join; +using FilteredColl = soa::Filtered>::iterator; +using FilteredJTracks = soa::Filtered>; +using FilteredJets = soa::Filtered>; +using JoinedTracks = soa::Join; -float DcaXYPtCut(float tracPt) +float dcaXYPtCut(float tracPt) { - return 0.0105f + 0.0350f / pow(tracPt, 1.1f); + return 0.0105f + 0.0350f / std::pow(tracPt, 1.1f); } // What this task should do @@ -64,7 +66,7 @@ float DcaXYPtCut(float tracPt) // b) from events selected by EPN // It would be good to run it for several jet radii e.g. 0.2, 0.4, 0.6 -struct ChJetTriggerQATask { +struct JetTriggerChargedQa { Configurable evSel{"evSel", "sel8", "choose event selection"}; Configurable cfgVertexCut{"cfgVertexCut", 10.0, "Accepted z-vertex range"}; @@ -80,19 +82,21 @@ struct ChJetTriggerQATask { Configurable bHighPtTrigger{"bHighPtTrigger", false, "charged jet high pT trigger selection"}; Configurable bTrackLowPtTrigger{"bTrackLowPtTrigger", false, "track low pT trigger selection"}; Configurable bTrackHighPtTrigger{"bTrackHighPtTrigger", false, "track high pT trigger selection"}; - Configurable bAddSupplementHistosToOutput{"bAddAdditionalHistosToOutput", false, "add supplementary histos to the output"}; + Configurable bAddSupplementHistosToOutput{"bAddSupplementHistosToOutput", false, "add supplementary histos to the output"}; + Configurable bStudyPhiTrack{"bStudyPhiTrack", false, "add histos for detailed study of track phi distribution"}; Configurable phiAngleRestriction{"phiAngleRestriction", 0.3, "angle to restrict track phi for plotting tpc momentum"}; - Configurable dcaXY_multFact{"dcaXY_multFact", 3., "mult factor to relax pT dependent dcaXY cut for quality tracks"}; - Configurable dcaZ_cut{"dcaZ_cut", 3., "cut on dcaZ for quality tracks"}; + Configurable dcaXYMultFact{"dcaXYMultFact", 3., "mult factor to relax pT dependent dcaXY cut for quality tracks"}; + Configurable dcaZCut{"dcaZCut", 3., "cut on dcaZ for quality tracks"}; - ConfigurableAxis dcaXY_Binning{"dcaXY_Binning", {100, -5., 5.}, ""}; - ConfigurableAxis dcaZ_Binning{"dcaZ_Binning", {100, -3., 3.}, ""}; + float twoPi = constants::math::TwoPI; + ConfigurableAxis dcaXYBinning{"dcaXYBinning", {100, -5., 5.}, ""}; + ConfigurableAxis dcaZBinning{"dcaZBinning", {100, -3., 3.}, ""}; - ConfigurableAxis xPhiAxis{"xPhiAxis", {180, 0., TMath::TwoPi()}, ""}; + ConfigurableAxis xPhiAxis{"xPhiAxis", {40, 0., twoPi}, ""}; ConfigurableAxis yQ1pTAxis{"yQ1pTAxis", {200, -0.5, 0.5}, ""}; - float fiducialVolume; // 0.9 - jetR + float fiducialVolume = 0.0; // 0.9 - jetR HistogramRegistry spectra; @@ -106,47 +110,50 @@ struct ChJetTriggerQATask { trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast(trackSelections)); // Basic histos - spectra.add("vertexZ", "z vertex", {HistType::kTH1F, {{400, -20., +20.}}}); - spectra.add("ptphiTrackInclGood", "pT vs phi inclusive good tracks", {HistType::kTH2F, {{100, 0., +100.}, {60, 0, TMath::TwoPi()}}}); - spectra.add("ptetaTrackInclGood", "pT vs eta inclusive good tracks", {HistType::kTH2F, {{100, 0., +100.}, {80, -1., 1.}}}); - spectra.add("ptLeadingTrack", "pT leading track", {HistType::kTH1F, {{100, 0., +100.}}}); - spectra.add("ptJetChInclFidVol", "inclusive charged jet pT in fiducial volume", {HistType::kTH1F, {{200, 0., +200.}}}); - spectra.add("ptphiJetChInclFidVol", "inclusive charged jet pT vs phi in fiducial volume", {HistType::kTH2F, {{100, 0., +100.}, {60, 0, TMath::TwoPi()}}}); - spectra.add("ptphiJetChInclFullVol", "inclusive charged jet pT vs phi in full TPC volume", {HistType::kTH2F, {{100, 0., +100.}, {60, 0, TMath::TwoPi()}}}); - spectra.add("ptetaJetChInclFidVol", "inclusive charged jet pT vs eta in fiducial volume", {HistType::kTH2F, {{100, 0., +100.}, {80, -1., 1.}}}); - spectra.add("ptetaJetChInclFullVol", "inclusive charged jet pT vs eta in full TPC volume", {HistType::kTH2F, {{100, 0., +100.}, {80, -1., 1.}}}); - spectra.add("ptetaLeadingJetFullVol", "pT vs eta leading jet", {HistType::kTH2F, {{100, 0., +100.}, {80, -1., 1.}}}); - spectra.add("ptphiLeadingJetFullVol", "pT vs phi leading jet", {HistType::kTH2F, {{100, 0., +100.}, {60, 0, TMath::TwoPi()}}}); - - spectra.add("globalP_tpcglobalPDiff_withoutcuts", "difference of global and TPC inner momentum vs global momentum without any selection applied", {HistType::kTH2F, {{100, 0., +100.}, {200, -100., +100.}}}); - spectra.add("globalP_tpcglobalPDiff", "difference of global and TPC inner momentum vs global momentum with selection applied", {HistType::kTH2F, {{100, 0., +100.}, {200, -100., +100.}}}); - spectra.add("global1overP_tpcglobalPDiff", "difference of global and TPC inner momentum vs global momentum with selection applied", {HistType::kTH2F, {{100, 0., +100.}, {500, -8., +8.}}}); - - spectra.add("globalP_tpcglobalPDiff_withoutcuts_phirestrict", "difference of global and TPC inner momentum vs global momentum without any selection applied in a restricted phi", {HistType::kTH2F, {{100, 0., +100.}, {200, -100., +100.}}}); - spectra.add("globalP_tpcglobalPDiff_phirestrict", "difference of global and TPC inner momentum vs global momentum with selection applied restricted phi", {HistType::kTH2F, {{100, 0., +100.}, {200, -100., +100.}}}); - spectra.add("global1overP_tpcglobalPDiff_phirestrict", "difference of 1/p global and TPC inner momentum vs global momentum with selection applied restricted phi", {HistType::kTH2F, {{100, 0., +100.}, {500, -8., +8.}}}); - - spectra.add("DCAxy_track_Phi_pT", "track DCAxy vs phi & pT of tracks w. nITSClusters #geq 4", kTH3F, {dcaXY_Binning, {60, 0., TMath::TwoPi()}, {100, 0., 100.}}); - spectra.add("DCAz_track_Phi_pT", "track DCAz vs phi & pT of tracks w. nITSClusters #geq 4", kTH3F, {dcaZ_Binning, {60, 0., TMath::TwoPi()}, {100, 0., 100.}}); - spectra.add("nITSClusters_TrackPt", "Number of ITS hits vs phi & pT of tracks", kTH3F, {{7, 1., 8.}, {60, 0., TMath::TwoPi()}, {100, 0., 100.}}); - spectra.add("ptphiQualityTracks", "pT vs phi of quality tracks", {HistType::kTH2F, {{100, 0., 100.}, {60, 0, TMath::TwoPi()}}}); - spectra.add("ptphiAllTracks", "pT vs phi of all tracks", {HistType::kTH2F, {{100, 0., +100.}, {60, 0, TMath::TwoPi()}}}); - spectra.add("phi_Q1pT", "Track phi vs. q/pT", kTH2F, {xPhiAxis, yQ1pTAxis}); + spectra.add("vertexZ", "z vertex", kTH1F, {{60, -12., 12.}}); + spectra.add("ptphiTrackInclGood", "pT vs phi inclusive good tracks", kTH2F, {{100, 0., 100.}, {40, 0, twoPi}}); + spectra.add("ptetaTrackInclGood", "pT vs eta inclusive good tracks", kTH2F, {{100, 0., 100.}, {40, -1., 1.}}); + spectra.add("ptLeadingTrack", "pT leading track", kTH1F, {{100, 0., 100.}}); + spectra.add("ptJetChInclFidVol", "inclusive charged jet pT in fiducial volume", kTH1F, {{200, 0., 200.}}); + spectra.add("ptphiJetChInclFidVol", "inclusive charged jet pT vs phi in fiducial volume", kTH2F, {{100, 0., 100.}, {40, 0, twoPi}}); + spectra.add("ptphiJetChInclFullVol", "inclusive charged jet pT vs phi in full TPC volume", kTH2F, {{100, 0., 100.}, {40, 0, twoPi}}); + spectra.add("ptetaJetChInclFidVol", "inclusive charged jet pT vs eta in fiducial volume", kTH2F, {{100, 0., 100.}, {40, -1., 1.}}); + spectra.add("ptetaJetChInclFullVol", "inclusive charged jet pT vs eta in full TPC volume", kTH2F, {{100, 0., 100.}, {40, -1., 1.}}); + spectra.add("ptetaLeadingJetFullVol", "pT vs eta leading jet", kTH2F, {{100, 0., 100.}, {40, -1., 1.}}); + spectra.add("ptphiLeadingJetFullVol", "pT vs phi leading jet", kTH2F, {{100, 0., 100.}, {40, 0, twoPi}}); // Supplementary plots if (bAddSupplementHistosToOutput) { - spectra.add("ptJetChInclFullVol", "inclusive charged jet pT in full volume", {HistType::kTH1F, {{200, 0., +200.}}}); - spectra.add("phietaTrackAllInclGood", "phi vs eta all inclusive good tracks", {HistType::kTH2F, {{80, -1., 1.}, {60, 0, TMath::TwoPi()}}}); - spectra.add("phietaTrackHighPtInclGood", "phi vs eta inclusive good tracks with pT > 10 GeV", {HistType::kTH2F, {{80, -1., 1.}, {60, 0, TMath::TwoPi()}}}); - spectra.add("phietaJetChInclFidVol", "inclusive charged jet phi vs eta in fiducial volume", {HistType::kTH2F, {{80, -1., 1.}, {60, 0, TMath::TwoPi()}}}); - spectra.add("phietaJetChInclFullVol", "inclusive charged jet phi vs eta in full TPC volume", {HistType::kTH2F, {{80, -1., 1.}, {60, 0, TMath::TwoPi()}}}); - spectra.add("phietaJetChInclHighPtFidVol", "inclusive charged jet phi vs eta in fiducial volume", {HistType::kTH2F, {{80, -1., 1.}, {60, 0, TMath::TwoPi()}}}); - spectra.add("phietaJetChInclHighPtFullVol", "inclusive charged jet phi vs eta in full TPC volume", {HistType::kTH2F, {{80, -1., 1.}, {60, 0, TMath::TwoPi()}}}); - spectra.add("ptetaLeadingTrack", "pT vs eta leading tracks", {HistType::kTH2F, {{100, 0., +100.}, {80, -1., 1.}}}); - spectra.add("ptphiLeadingTrack", "pT vs phi leading tracks", {HistType::kTH2F, {{100, 0., +100.}, {60, 0, TMath::TwoPi()}}}); - spectra.add("jetAreaFullVol", "area of all jets in full TPC volume", {HistType::kTH2F, {{100, 0., +100.}, {50, 0., 2.}}}); - spectra.add("jetAreaFidVol", "area of all jets in fiducial volume", {HistType::kTH2F, {{100, 0., +100.}, {50, 0., 2.}}}); - spectra.add("fLeadJetChPtVsLeadingTrack", "inclusive charged jet pT in TPC volume", {HistType::kTH2F, {{100, 0., +100.}, {100, 0., +100.}}}); + spectra.add("ptJetChInclFullVol", "inclusive charged jet pT in full volume", kTH1F, {{200, 0., 200.}}); + spectra.add("phietaTrackAllInclGood", "phi vs eta all inclusive good tracks", kTH2F, {{80, -1., 1.}, {40, 0, twoPi}}); + spectra.add("phietaTrackHighPtInclGood", "phi vs eta inclusive good tracks with pT > 10 GeV", kTH2F, {{40, -1., 1.}, {40, 0, twoPi}}); + spectra.add("phietaJetChInclFidVol", "inclusive charged jet phi vs eta in fiducial volume", kTH2F, {{40, -1., 1.}, {40, 0, twoPi}}); + spectra.add("phietaJetChInclFullVol", "inclusive charged jet phi vs eta in full TPC volume", kTH2F, {{40, -1., 1.}, {40, 0, twoPi}}); + spectra.add("phietaJetChInclHighPtFidVol", "inclusive charged jet phi vs eta in fiducial volume", kTH2F, {{40, -1., 1.}, {40, 0, twoPi}}); + spectra.add("phietaJetChInclHighPtFullVol", "inclusive charged jet phi vs eta in full TPC volume", kTH2F, {{40, -1., 1.}, {40, 0, twoPi}}); + spectra.add("ptetaLeadingTrack", "pT vs eta leading tracks", kTH2F, {{100, 0., 100.}, {40, -1., 1.}}); + spectra.add("ptphiLeadingTrack", "pT vs phi leading tracks", kTH2F, {{100, 0., 100.}, {40, 0, twoPi}}); + spectra.add("jetAreaFullVol", "area of all jets in full TPC volume", kTH2F, {{100, 0., 100.}, {50, 0., 2.}}); + spectra.add("jetAreaFidVol", "area of all jets in fiducial volume", kTH2F, {{100, 0., 100.}, {50, 0., 2.}}); + spectra.add("fLeadJetChPtVsLeadingTrack", "inclusive charged jet pT in TPC volume", kTH2F, {{100, 0., 100.}, {100, 0., 100.}}); + } + + // Study of non-uniformity of phi distribution of tracks + if (bStudyPhiTrack) { + spectra.add("globalP_tpcglobalPDiff_withoutcuts", "difference of global and TPC inner momentum vs global momentum without any selection applied", kTH2F, {{100, 0., 100.}, {200, -100., 100.}}); + spectra.add("globalP_tpcglobalPDiff", "difference of global and TPC inner momentum vs global momentum with selection applied", kTH2F, {{100, 0., 100.}, {200, -100., 100.}}); + spectra.add("global1overP_tpcglobalPDiff", "difference of global and TPC inner momentum vs global momentum with selection applied", kTH2F, {{100, 0., 100.}, {125, -8., 8.}}); + + spectra.add("globalP_tpcglobalPDiff_withoutcuts_phirestrict", "difference of global and TPC inner momentum vs global momentum without any selection applied in a restricted phi", kTH2F, {{100, 0., 100.}, {200, -100., 100.}}); + spectra.add("globalP_tpcglobalPDiff_phirestrict", "difference of global and TPC inner momentum vs global momentum with selection applied restricted phi", kTH2F, {{100, 0., 100.}, {200, -100., 100.}}); + spectra.add("global1overP_tpcglobalPDiff_phirestrict", "difference of 1/p global and TPC inner momentum vs global momentum with selection applied restricted phi", kTH2F, {{100, 0., 100.}, {500, -8., 8.}}); + + spectra.add("DCAxy_track_Phi_pT", "track DCAxy vs phi & pT of tracks w. nITSClusters #geq 4", kTH3F, {dcaXYBinning, {40, 0., twoPi}, {100, 0., 100.}}); + spectra.add("DCAz_track_Phi_pT", "track DCAz vs phi & pT of tracks w. nITSClusters #geq 4", kTH3F, {dcaZBinning, {40, 0., twoPi}, {100, 0., 100.}}); + spectra.add("nITSClusters_TrackPt", "Number of ITS hits vs phi & pT of tracks", kTH3F, {{7, 1., 8.}, {40, 0., twoPi}, {100, 0., 100.}}); + spectra.add("ptphiQualityTracks", "pT vs phi of quality tracks", kTH2F, {{100, 0., 100.}, {40, 0, twoPi}}); + spectra.add("ptphiAllTracks", "pT vs phi of all tracks", kTH2F, {{100, 0., 100.}, {40, 0, twoPi}}); + spectra.add("phi_Q1pT", "Track phi vs. q/pT", kTH2F, {xPhiAxis, yQ1pTAxis}); } } @@ -159,7 +166,7 @@ struct ChJetTriggerQATask { // declare filters on jets Filter jetRadiusSelection = (aod::jet::r == nround(cfgJetR.node() * 100.0f)); - void process(filteredColl const& collision, filteredJTracks const& tracks, filteredJets const& jets, joinedTracks const&) + void process(FilteredColl const& collision, FilteredJTracks const& tracks, FilteredJets const& jets, JoinedTracks const&) { if (!collision.selection_bit(aod::evsel::kNoTimeFrameBorder)) { @@ -191,72 +198,70 @@ struct ChJetTriggerQATask { float leadingTrackEta = -2.0; float leadingTrackPhi = -1.0; - spectra.fill(HIST("vertexZ"), - collision.posZ()); // Inclusive Track Cross TPC Rows + spectra.fill(HIST("vertexZ"), collision.posZ()); // Inclusive Track Cross TPC Rows - for (auto const& track : tracks) { // loop over filtered tracks in full TPC volume having pT > 100 MeV + // loop over filtered tracks in full TPC volume having pT > 100 MeV + for (auto const& track : tracks) { - auto const& originalTrack = track.track_as(); + auto const& originalTrack = track.track_as(); - spectra.fill(HIST("globalP_tpcglobalPDiff_withoutcuts"), track.p(), track.p() - originalTrack.tpcInnerParam()); + if (bStudyPhiTrack) { - if (TMath::Abs(track.phi() - TMath::Pi()) < phiAngleRestriction) { - spectra.fill(HIST("globalP_tpcglobalPDiff_withoutcuts_phirestrict"), track.p(), track.p() - originalTrack.tpcInnerParam()); - } + spectra.fill(HIST("globalP_tpcglobalPDiff_withoutcuts"), track.p(), track.p() - originalTrack.tpcInnerParam()); + spectra.fill(HIST("ptphiAllTracks"), track.pt(), track.phi()); - spectra.fill(HIST("ptphiAllTracks"), track.pt(), track.phi()); + if (std::fabs(track.phi() - constants::math::PI) < phiAngleRestriction) { + spectra.fill(HIST("globalP_tpcglobalPDiff_withoutcuts_phirestrict"), track.p(), track.p() - originalTrack.tpcInnerParam()); + } + } - if (!jetderiveddatautilities::selectTrack(track, trackSelection)) { + if (!jetderiveddatautilities::selectTrack(track, trackSelection)) continue; - } - spectra.fill(HIST("phi_Q1pT"), originalTrack.phi(), originalTrack.sign() / originalTrack.pt()); - spectra.fill(HIST("ptphiQualityTracks"), track.pt(), track.phi()); + spectra.fill(HIST("ptphiTrackInclGood"), track.pt(), track.phi()); // Inclusive Track pT vs phi spectrum in TPC volume + spectra.fill(HIST("ptetaTrackInclGood"), track.pt(), track.eta()); // Inclusive Track pT vs eta spectrum in TPC volume - bool bDcaCondition = (fabs(track.dcaZ()) < dcaZ_cut) && (fabs(track.dcaXY()) < dcaXY_multFact * DcaXYPtCut(track.pt())); - if (originalTrack.itsNCls() >= 4 && bDcaCondition) { // correspond to number of track hits in ITS layers - spectra.fill(HIST("DCAxy_track_Phi_pT"), track.dcaXY(), track.phi(), track.pt()); - spectra.fill(HIST("DCAz_track_Phi_pT"), track.dcaZ(), track.phi(), track.pt()); - } + if (bAddSupplementHistosToOutput) { + spectra.fill(HIST("phietaTrackAllInclGood"), track.eta(), track.phi()); // Inclusive Track pT vs eta spectrum in TPC volume - spectra.fill(HIST("nITSClusters_TrackPt"), originalTrack.itsNCls(), track.phi(), track.pt()); + float trackPtCut = 5.0; + if (track.pt() > trackPtCut) { + spectra.fill(HIST("phietaTrackHighPtInclGood"), track.eta(), track.phi()); // Inclusive Track pT vs eta spectrum in TPC volume + } + } - spectra.fill(HIST("globalP_tpcglobalPDiff"), track.p(), track.p() - originalTrack.tpcInnerParam()); - if (track.p() > 0 && originalTrack.tpcInnerParam() > 0) { - spectra.fill(HIST("global1overP_tpcglobalPDiff"), track.p(), 1. / track.p() - 1. / originalTrack.tpcInnerParam()); + if (track.pt() > leadingTrackPt) { // Find leading track pT in full TPC volume + leadingTrackPt = track.pt(); + leadingTrackEta = track.eta(); + leadingTrackPhi = track.phi(); } - if (TMath::Abs(track.phi() - TMath::Pi()) < phiAngleRestriction) { - spectra.fill(HIST("globalP_tpcglobalPDiff_phirestrict"), track.p(), track.p() - originalTrack.tpcInnerParam()); - if (track.p() > 0 && originalTrack.tpcInnerParam() > 0) { - spectra.fill(HIST("global1overP_tpcglobalPDiff_phirestrict"), track.p(), 1. / track.p() - 1. / originalTrack.tpcInnerParam()); + if (bStudyPhiTrack) { + spectra.fill(HIST("phi_Q1pT"), originalTrack.phi(), originalTrack.sign() / originalTrack.pt()); + spectra.fill(HIST("ptphiQualityTracks"), track.pt(), track.phi()); + + bool bDcaCondition = (std::fabs(track.dcaZ()) < dcaZCut) && (std::fabs(track.dcaXY()) < dcaXYMultFact * dcaXYPtCut(track.pt())); + + int nITSClusters = 4; + if (originalTrack.itsNCls() >= nITSClusters && bDcaCondition) { // correspond to number of track hits in ITS layers + spectra.fill(HIST("DCAxy_track_Phi_pT"), track.dcaXY(), track.phi(), track.pt()); + spectra.fill(HIST("DCAz_track_Phi_pT"), track.dcaZ(), track.phi(), track.pt()); } - } - spectra.fill( - HIST("ptphiTrackInclGood"), track.pt(), - track.phi()); // Inclusive Track pT vs phi spectrum in TPC volume - spectra.fill( - HIST("ptetaTrackInclGood"), track.pt(), - track.eta()); // Inclusive Track pT vs eta spectrum in TPC volume + spectra.fill(HIST("nITSClusters_TrackPt"), originalTrack.itsNCls(), track.phi(), track.pt()); - if (bAddSupplementHistosToOutput) { - spectra.fill( - HIST("phietaTrackAllInclGood"), track.eta(), - track.phi()); // Inclusive Track pT vs eta spectrum in TPC volume - - if (track.pt() > 5.0) { - spectra.fill( - HIST("phietaTrackHighPtInclGood"), track.eta(), - track.phi()); // Inclusive Track pT vs eta spectrum in TPC volume + spectra.fill(HIST("globalP_tpcglobalPDiff"), track.p(), track.p() - originalTrack.tpcInnerParam()); + if (track.p() > 0 && originalTrack.tpcInnerParam() > 0) { + spectra.fill(HIST("global1overP_tpcglobalPDiff"), track.p(), 1. / track.p() - 1. / originalTrack.tpcInnerParam()); } - } - if (track.pt() > - leadingTrackPt) { // Find leading track pT in full TPC volume - leadingTrackPt = track.pt(); - leadingTrackEta = track.eta(); - leadingTrackPhi = track.phi(); + if (std::fabs(track.phi() - constants::math::PI) < phiAngleRestriction) { + spectra.fill(HIST("globalP_tpcglobalPDiff_phirestrict"), track.p(), track.p() - originalTrack.tpcInnerParam()); + + if (track.p() > 0 && originalTrack.tpcInnerParam() > 0) { + spectra.fill(HIST("global1overP_tpcglobalPDiff_phirestrict"), track.p(), 1. / track.p() - 1. / originalTrack.tpcInnerParam()); + } + } } } @@ -266,16 +271,14 @@ struct ChJetTriggerQATask { if (bAddSupplementHistosToOutput) { if (leadingTrackPt > -1.) { - spectra.fill(HIST("ptphiLeadingTrack"), leadingTrackPt, - leadingTrackPhi); - spectra.fill(HIST("ptetaLeadingTrack"), leadingTrackPt, - leadingTrackEta); + spectra.fill(HIST("ptphiLeadingTrack"), leadingTrackPt, leadingTrackPhi); + spectra.fill(HIST("ptetaLeadingTrack"), leadingTrackPt, leadingTrackEta); } } // Find leading jet pT in full TPC volume - for (auto& jet : jets) { - if (fabs(jet.eta()) < static_cast(cfgTPCVolume)) { + for (const auto& jet : jets) { + if (std::fabs(jet.eta()) < static_cast(cfgTPCVolume)) { if (jet.pt() > leadingJetPt) { leadingJetPt = jet.pt(); @@ -292,28 +295,29 @@ struct ChJetTriggerQATask { if (bAddSupplementHistosToOutput) { if (leadingJetPt > -1. && leadingTrackPt > -1.) { - spectra.fill(HIST("fLeadJetChPtVsLeadingTrack"), leadingTrackPt, - leadingJetPt); // leading jet pT versus leading track pT + spectra.fill(HIST("fLeadJetChPtVsLeadingTrack"), leadingTrackPt, leadingJetPt); // leading jet pT versus leading track pT } } // Inclusive Jet pT spectrum in Fiducial volume - for (auto& jet : jets) { - if (fabs(jet.eta()) < fiducialVolume) { + for (const auto& jet : jets) { + if (std::fabs(jet.eta()) < fiducialVolume) { spectra.fill(HIST("ptJetChInclFidVol"), jet.pt()); spectra.fill(HIST("ptphiJetChInclFidVol"), jet.pt(), jet.phi()); spectra.fill(HIST("ptetaJetChInclFidVol"), jet.pt(), jet.eta()); if (bAddSupplementHistosToOutput) { spectra.fill(HIST("phietaJetChInclFidVol"), jet.eta(), jet.phi()); - if (jet.pt() > 10.0) { + + float jetPtCut = 10.0; + if (jet.pt() > jetPtCut) { spectra.fill(HIST("phietaJetChInclHighPtFidVol"), jet.eta(), jet.phi()); } spectra.fill(HIST("jetAreaFidVol"), jet.pt(), jet.area()); } } - if (fabs(jet.eta()) < static_cast(cfgTPCVolume)) { + if (std::fabs(jet.eta()) < static_cast(cfgTPCVolume)) { spectra.fill(HIST("ptphiJetChInclFullVol"), jet.pt(), jet.phi()); spectra.fill(HIST("ptetaJetChInclFullVol"), jet.pt(), jet.eta()); @@ -321,7 +325,9 @@ struct ChJetTriggerQATask { spectra.fill(HIST("ptJetChInclFullVol"), jet.pt()); spectra.fill(HIST("phietaJetChInclFullVol"), jet.eta(), jet.phi()); - if (jet.pt() > 10.0) { + + float jetPtCut = 10.0; + if (jet.pt() > jetPtCut) { spectra.fill(HIST("phietaJetChInclHighPtFullVol"), jet.eta(), jet.phi()); } spectra.fill(HIST("jetAreaFullVol"), jet.pt(), jet.area()); @@ -332,9 +338,4 @@ struct ChJetTriggerQATask { } }; -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - - return WorkflowSpec{adaptAnalysisTask( - cfgc, TaskName{"jet-charged-trigger-qa"})}; -} +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc)}; } diff --git a/PWGJE/Tasks/recoilJets.cxx b/PWGJE/Tasks/recoilJets.cxx index ba3dde1e8f2..f39d1c9fe25 100644 --- a/PWGJE/Tasks/recoilJets.cxx +++ b/PWGJE/Tasks/recoilJets.cxx @@ -557,7 +557,7 @@ struct RecoilJets { template bool skipMBGapEvent(const Collision& coll) { - return (skipMBGapEvents && coll.subGeneratorId()) == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap; + return skipMBGapEvents && coll.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap; } template From e5f8852964b9b9e067e6a22890b0b77b8df26cbc Mon Sep 17 00:00:00 2001 From: JimunLee Date: Sat, 3 May 2025 08:33:38 +0900 Subject: [PATCH 1161/1650] [PWGJE] Organized histograms by switch (#11043) Co-authored-by: jimun_lee --- PWGJE/Tasks/phiInJets.cxx | 115 +++++++++++++++----------------------- 1 file changed, 46 insertions(+), 69 deletions(-) diff --git a/PWGJE/Tasks/phiInJets.cxx b/PWGJE/Tasks/phiInJets.cxx index e405af191c8..b4e6f5c1c49 100644 --- a/PWGJE/Tasks/phiInJets.cxx +++ b/PWGJE/Tasks/phiInJets.cxx @@ -92,9 +92,9 @@ struct phiInJets { Configurable cfgMCGenMATCHEDHists{"cfgMCGenMATCHEDHists", false, "Enables MCGenMATCHEDHists"}; Configurable cfgMCRecMATCHEDHists{"cfgMCRecMATCHEDHists", false, "Enables MCRecMATCHEDHists"}; - Configurable cfgMinvNBins{"cfgMinvNBins", 500, "Number of bins for Minv axis"}; - Configurable cfgMinvMin{"cfgMinvMin", 0.75, "Minimum Minv value"}; - Configurable cfgMinvMax{"cfgMinvMax", 1.25, "Maximum Minv value"}; + Configurable cfgMinvNBins{"cfgMinvNBins", 300, "Number of bins for Minv axis"}; + Configurable cfgMinvMin{"cfgMinvMin", 0.60, "Minimum Minv value"}; + Configurable cfgMinvMax{"cfgMinvMax", 1.20, "Maximum Minv value"}; // CONFIG DONE ///////////////////////////////////////// //INIT @@ -168,7 +168,6 @@ struct phiInJets { JEhistos.add("ptJEHistogramPhi", "ptJEHistogramPhi", kTH1F, {PtAxis}); JEhistos.add("ptJEHistogramPhi_JetTrigger", "ptJEHistogramPhi_JetTrigger", kTH1F, {PtAxis}); } - if (cfgDaughterQAHists) { JEhistos.add("hNRealPhiVPhiCand", "hNRealPhiVPhiCand", kTH2F, {{10, 0, 10}, {10, 0, 10}}); JEhistos.add("hNRealPhiWithJetVPhiCand", "hNRealPhiWithJetVPhiCand", kTH2F, {{10, 0, 10}, {10, 0, 10}}); @@ -177,37 +176,36 @@ struct phiInJets { JEhistos.add("hMCRec_nonmatch_hUSS_Kangle_v_pt", "hMCRec_nonmatch_hUSS_Kangle_v_pt", kTH2F, {axisEta, PtAxis}); JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE_pt_v_eta", "hMCRec_nonmatch_hUSS_INSIDE_pt_v_eta", kTH2F, {PtAxis, axisEta}); } - // used for Minv closure tests // MB if (cfgMCRecMBHists) { JEhistos.add("hMCRec_hUSS", "hMCRec_hUSS", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); JEhistos.add("hMCRec_hLSS", "hMCRec_hLSS", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); JEhistos.add("hMCRecTrue_hUSS", "hMCRecTrue_hUSS", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); + } + + if (cfgMCRecRotationalHists) { JEhistos.add("hMCRec_R_distribution", "hMCRec_R_distribution", kTH1F, {{100, 0.0, 2 * TMath::Pi()}}); JEhistos.add("hMCRec_dPhi_distribution", "hMCRec_dPhi_distribution", kTH1F, {{80, -5.0, 7.0}}); JEhistos.add("hMCRec_dEta_distribution", "hMCRec_dEta_distribution", kTH1F, {{100, -2.0, 2.0}}); - - if (cfgMCRecRotationalHists) { - JEhistos.add("hMCRec_hUSS_Rotational", "hMCRec_hUSS_Rotational", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); - JEhistos.add("hMCRec_R_Rotation_distribution", "hMCRec_R_Rotation_distribution", HistType::kTH1F, {{100, 0.0, 2 * TMath::Pi()}}); - JEhistos.add("hMCRec_dPhi_rot_distribution", "hMCRec_dPhi_rot_distribution", kTH1F, {{80, -5.0, 7.0}}); - JEhistos.add("hMCRec_dEta_rot_distribution", "hMCRec_dEta_rot_distribution", kTH1F, {{100, -2.0, 2.0}}); - JEhistos.add("hMCRec_dEta_qa_rot_distribution", "hMCRec_dEta_qa_rot_distribution", kTH1F, {{100, -4.0, 2.0}}); - } + JEhistos.add("hMCRec_hUSS_Rotational", "hMCRec_hUSS_Rotational", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); + JEhistos.add("hMCRec_R_Rotation_distribution", "hMCRec_R_Rotation_distribution", HistType::kTH1F, {{100, 0.0, 2 * TMath::Pi()}}); + JEhistos.add("hMCRec_dPhi_rot_distribution", "hMCRec_dPhi_rot_distribution", kTH1F, {{80, -5.0, 7.0}}); + JEhistos.add("hMCRec_dEta_rot_distribution", "hMCRec_dEta_rot_distribution", kTH1F, {{100, -2.0, 2.0}}); + JEhistos.add("hMCRec_dEta_qa_rot_distribution", "hMCRec_dEta_qa_rot_distribution", kTH1F, {{100, -4.0, 2.0}}); } + // INSIDE if (cfgMCRecInsideHists) { JEhistos.add("hMCRec_hUSS_INSIDE", "hMCRec_hUSS_INSIDE", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); JEhistos.add("hMCRec_hLSS_INSIDE", "hMCRec_hLSS_INSIDE", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); JEhistos.add("hMCRecTrue_hUSS_INSIDE", "hMCRecTrue_hUSS_INSIDE", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE", "hMCRec_nonmatch_hUSS_INSIDE", kTHnSparseF, {dRAxis, PtAxis, MinvAxis}); - JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE_1D", "hMCRec_nonmatch_hUSS_INSIDE_1D", kTH1F, {MinvAxis}); - JEhistos.add("hMCRec_nonmatch_hUSS_INSIDE_1D_2_3", "hMCRec_nonmatch_hUSS_INSIDE_1D_2_3", kTH1F, {MinvAxis}); JEhistos.add("JetVsPhi_REC", "JetVsPhi_REC", kTH2F, {{4000, 0., 200.}, {200, 0, 20.0}}); JEhistos.add("minvJEHistogramPhi", "minvJEHistogramPhi", kTH1F, {MinvAxis}); } } + if (cfgMCGenHists) { JEhistos.add("nEvents_MCGen", "nEvents_MCGen", kTH1F, {{4, 0.0, 4.0}}); @@ -560,7 +558,7 @@ struct phiInJets { } JEhistos.fill(HIST("nEvents"), 0.5); - if (fabs(collision.posZ()) > cfgVtxCut) + if (std::fabs(collision.posZ()) > cfgVtxCut) return; if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) return; @@ -646,14 +644,14 @@ struct phiInJets { // # of Events //================= JEhistos.fill(HIST("nEvents_MCRec"), 0.5); - if (fabs(collision.posZ()) > cfgVtxCut) + if (std::fabs(collision.posZ()) > cfgVtxCut) return; if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) return; bool INELgt0 = false; for (const auto& track : tracks) { - if (fabs(track.eta()) < cfgtrkMaxEta) { + if (std::fabs(track.eta()) < cfgtrkMaxEta) { INELgt0 = true; break; } @@ -699,7 +697,7 @@ struct phiInJets { if (track.has_mcParticle()) { auto mcParticle = track.mcParticle(); if (cfgPIDQAHists) { - if (mcParticle.isPhysicalPrimary() && fabs(mcParticle.eta()) <= cfgtrkMaxEta) { + if (mcParticle.isPhysicalPrimary() && std::fabs(mcParticle.eta()) <= cfgtrkMaxEta) { if (abs(mcParticle.pdgCode()) == 211) JEhistos.fill(HIST("ptJEHistogramPion"), mcParticle.pt()); if (abs(mcParticle.pdgCode()) == 321) @@ -723,12 +721,12 @@ struct phiInJets { if (originalTrack.globalIndex() == originalTrack2.globalIndex()) continue; } - if (fabs(originalTrack.eta()) > cfgtrkMaxEta || fabs(originalTrack2.eta()) > cfgtrkMaxEta) + if (std::fabs(originalTrack.eta()) > cfgtrkMaxEta || std::fabs(originalTrack2.eta()) > cfgtrkMaxEta) continue; double dPhi = TVector2::Phi_mpi_pi(originalTrack.phi() - originalTrack2.phi()); double dEta = originalTrack.eta() - originalTrack2.eta(); - if (cfgMCRecMBHists) { + if (cfgMCRecRotationalHists) { JEhistos.fill(HIST("hMCRec_dPhi_distribution"), dPhi); JEhistos.fill(HIST("hMCRec_dEta_distribution"), dEta); } @@ -737,7 +735,6 @@ struct phiInJets { TLorentzVector lDecayDaughter1, lDecayDaughter2, lResonance, lRotationalTrack, lRotationalResonance; lDecayDaughter1.SetXYZM(originalTrack.px(), originalTrack.py(), originalTrack.pz(), massKa); //----------------------------------------------------------------------- - TRandom* trand = new TRandom(); double shift = trand->Uniform(TMath::Pi() - TMath::Pi() / 10.0, TMath::Pi() + TMath::Pi() / 10.0); // double shift = TMath::Pi(); @@ -747,23 +744,8 @@ struct phiInJets { } else { lDecayDaughter2.SetXYZM(originalTrack2.px(), originalTrack2.py(), originalTrack2.pz(), massPi); - // double pTog = TMath::Sqrt(originalTrack2.px() * originalTrack2.px() + originalTrack2.py() * originalTrack2.py()); - // double Pxrot = pTog*TMath::Cos(originalTrack2.phi() + shift); - // double Pyrot = pTog*TMath::Sin(originalTrack2.phi() + shift); - - // if(gDebug){ - // double Ptrot = TMath::Sqrt(Pxrot*Pxrot + Pyrot*Pyrot); - // if(TMath::Abs(Ptrot-pTog)>0.1) { - // std::cout<<"We are jottettta"< cfgtrkMaxEta) + if (std::fabs(lResonance.Eta()) > cfgtrkMaxEta) continue; if (cfgDaughterQAHists) { @@ -794,13 +775,10 @@ struct phiInJets { if (cfgMCRecMBHists) { if (originalTrack.sign() * originalTrack2.sign() < 0) { JEhistos.fill(HIST("hMCRec_hUSS"), 1.0, lResonance.Pt(), lResonance.M()); - // normal R - JEhistos.fill(HIST("hMCRec_R_distribution"), dR); - // switch because of memory if (cfgMCRecRotationalHists && cfgIsKstar) { + JEhistos.fill(HIST("hMCRec_R_distribution"), dR); JEhistos.fill(HIST("hMCRec_hUSS_Rotational"), 1.0, lRotationalResonance.Pt(), lResonance.M()); - // Rotational R JEhistos.fill(HIST("hMCRec_R_Rotation_distribution"), dR_rot); } } else if (originalTrack.sign() * originalTrack2.sign() > 0) { @@ -860,13 +838,13 @@ struct phiInJets { if (track.has_mcParticle() && track2.has_mcParticle()) { auto part1 = track.mcParticle(); auto part2 = track2.mcParticle(); - if (fabs(part1.pdgCode()) != 321) + if (std::fabs(part1.pdgCode()) != 321) continue; // Not Kaon if (!cfgIsKstar) { - if (fabs(part2.pdgCode()) != 321) + if (std::fabs(part2.pdgCode()) != 321) continue; // Not Kaon } else { - if (fabs(part2.pdgCode()) != 211) + if (std::fabs(part2.pdgCode()) != 211) continue; // Not Kaon } @@ -948,9 +926,8 @@ struct phiInJets { } if (cfgDaughterQAHists) { JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_INSIDE_pt_v_eta"), lResonance.Pt(), lResonance.Eta()); - JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_INSIDE_1D"), lResonance.M()); - if (lResonance.Pt() > 2.0 && lResonance.Pt() < 3) - JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_INSIDE_1D_2_3"), lResonance.M()); + // if (lResonance.Pt() > 2.0 && lResonance.Pt() < 3) + // JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_INSIDE_1D_2_3"), lResonance.M()); JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_INSIDE"), jetpt, lResonance.Pt(), lResonance.M()); } } @@ -1006,11 +983,11 @@ struct phiInJets { return; } - if (fabs(collision.posZ()) > cfgVtxCut) // bad vertex + if (std::fabs(collision.posZ()) > cfgVtxCut) // bad vertex return; bool INELgt0 = false; for (const auto& mcParticle : mcParticles) { - if (fabs(mcParticle.eta()) < cfgtrkMaxEta) { + if (std::fabs(mcParticle.eta()) < cfgtrkMaxEta) { INELgt0 = true; break; } @@ -1040,7 +1017,7 @@ struct phiInJets { // Check pikp and phi for (const auto& mcParticle : mcParticles) { - if (mcParticle.isPhysicalPrimary() && fabs(mcParticle.eta()) <= cfgtrkMaxEta) { // watch out for context!!! + if (mcParticle.isPhysicalPrimary() && std::fabs(mcParticle.eta()) <= cfgtrkMaxEta) { // watch out for context!!! if (abs(mcParticle.pdgCode()) == 211) JEhistos.fill(HIST("ptGeneratedPion"), mcParticle.pt()); if (abs(mcParticle.pdgCode()) == 321) @@ -1048,7 +1025,7 @@ struct phiInJets { if (abs(mcParticle.pdgCode()) == 2212) JEhistos.fill(HIST("ptGeneratedProton"), mcParticle.pt()); } - if (fabs(mcParticle.eta()) <= cfgtrkMaxEta) { // watch out for context!!! + if (std::fabs(mcParticle.eta()) <= cfgtrkMaxEta) { // watch out for context!!! TLorentzVector lResonance; lResonance.SetPxPyPzE(mcParticle.px(), mcParticle.py(), mcParticle.pz(), mcParticle.e()); @@ -1068,12 +1045,12 @@ struct phiInJets { if (!cfgIsKstar) { if (mcParticle.has_daughters()) for (auto& dgth : mcParticle.daughters_as()) - if (fabs(dgth.pdgCode()) != 321) + if (std::fabs(dgth.pdgCode()) != 321) skip = true; } else { if (mcParticle.has_daughters()) for (auto& dgth : mcParticle.daughters_as()) - if (fabs(dgth.pdgCode()) != 321 || fabs(dgth.pdgCode()) != 211) + if (std::fabs(dgth.pdgCode()) != 321 || std::fabs(dgth.pdgCode()) != 211) skip = true; } @@ -1162,7 +1139,7 @@ struct phiInJets { JEhistos.fill(HIST("nEvents_MCGen_MATCHED"), 0.5); - if (fabs(collision.posZ()) > cfgVtxCut) + if (std::fabs(collision.posZ()) > cfgVtxCut) return; if (recocolls.size() <= 0) // not reconstructed @@ -1219,7 +1196,7 @@ struct phiInJets { // First we do GEN part for (const auto& mcParticle : mcParticles) { - if (fabs(mcParticle.eta()) > cfgtrkMaxEta) + if (std::fabs(mcParticle.eta()) > cfgtrkMaxEta) continue; int GenPID = 0; @@ -1229,7 +1206,7 @@ struct phiInJets { else GenPID = 313; - if (fabs(mcParticle.pdgCode()) == GenPID) { + if (std::fabs(mcParticle.pdgCode()) == GenPID) { bool skip = false; double phi_dgth_px[2] = {0}; double phi_dgth_py[2] = {0}; @@ -1245,7 +1222,7 @@ struct phiInJets { if (!cfgIsKstar) { if (mcParticle.has_daughters()) { for (auto& dgth : mcParticle.daughters_as()) { - if (fabs(dgth.pdgCode()) != 321) { + if (std::fabs(dgth.pdgCode()) != 321) { skip = true; break; } @@ -1253,7 +1230,7 @@ struct phiInJets { auto trk = track.track_as(); if (!trackSelection(trk)) continue; - if (fabs(trk.eta()) > cfgtrkMaxEta) + if (std::fabs(trk.eta()) > cfgtrkMaxEta) continue; if (cfgSimPID) { if (!trackPID(trk, true)) @@ -1284,7 +1261,7 @@ struct phiInJets { } else { // check for kstar if (mcParticle.has_daughters()) for (auto& dgth : mcParticle.daughters_as()) - if (fabs(dgth.pdgCode()) != 321 || fabs(dgth.pdgCode()) != 211) + if (std::fabs(dgth.pdgCode()) != 321 || std::fabs(dgth.pdgCode()) != 211) skip = true; } @@ -1375,19 +1352,19 @@ struct phiInJets { if ((nprocessRecJEEvents + 1) % 10000 == 0) { double histmem = JEhistos.getSize(); std::cout << histmem << std::endl; - std::cout << "processMatched Rec Events: " << nprocessRecJEEvents << std::endl; + std::cout << "processMatchedRec: " << nprocessRecEvents << std::endl; } } JEhistos.fill(HIST("nEvents_MCRec_MATCHED"), 0.5); - if (fabs(collision.posZ()) > cfgVtxCut) + if (std::fabs(collision.posZ()) > cfgVtxCut) return; if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) return; bool INELgt0 = false; for (const auto& track : tracks) { - if (fabs(track.eta()) < cfgtrkMaxEta) { + if (std::fabs(track.eta()) < cfgtrkMaxEta) { INELgt0 = true; break; } @@ -1439,7 +1416,7 @@ struct phiInJets { if (trk1.globalIndex() == trk2.globalIndex()) continue; } - if (fabs(trk1.eta()) > cfgtrkMaxEta || fabs(trk2.eta()) > cfgtrkMaxEta) + if (std::fabs(trk1.eta()) > cfgtrkMaxEta || std::fabs(trk2.eta()) > cfgtrkMaxEta) continue; if ((trk1.sign() * trk2.sign()) > 0) continue; // Not K+K- @@ -1453,13 +1430,13 @@ struct phiInJets { if (track1.has_mcParticle() && track2.has_mcParticle()) { auto part1 = track1.mcParticle(); auto part2 = track2.mcParticle(); - if (fabs(part1.pdgCode()) != 321) + if (std::fabs(part1.pdgCode()) != 321) continue; // Not Kaon if (!cfgIsKstar) { - if (fabs(part2.pdgCode()) != 321) + if (std::fabs(part2.pdgCode()) != 321) continue; // Not Kaon } else { - if (fabs(part2.pdgCode()) != 211) + if (std::fabs(part2.pdgCode()) != 211) continue; // Not Kaon } if (!part1.has_mothers()) @@ -1506,7 +1483,7 @@ struct phiInJets { lDecayDaughter2.SetXYZM(trk2.px(), trk2.py(), trk2.pz(), massPi); lResonance = lDecayDaughter1 + lDecayDaughter2; - if (fabs(lResonance.Eta()) > cfgtrkMaxEta) + if (std::fabs(lResonance.Eta()) > cfgtrkMaxEta) continue; bool jetFlag = false; From 035dae8c9b4fca2fcb52ad680f9ccf6d83fdb825 Mon Sep 17 00:00:00 2001 From: yuanzhe <90246048+wang-yuanzhe@users.noreply.github.com> Date: Sat, 3 May 2025 08:43:58 +0200 Subject: [PATCH 1162/1650] [PWGLF] Add QA task for hyperhelium4sigma mc production (#11054) --- PWGLF/Tasks/Nuspex/CMakeLists.txt | 5 + .../Nuspex/hyperhelium4sigmaAnalysis.cxx | 338 ++++++++++++++++++ 2 files changed, 343 insertions(+) create mode 100644 PWGLF/Tasks/Nuspex/hyperhelium4sigmaAnalysis.cxx diff --git a/PWGLF/Tasks/Nuspex/CMakeLists.txt b/PWGLF/Tasks/Nuspex/CMakeLists.txt index cc9e0599e7a..0f16d5e7b58 100644 --- a/PWGLF/Tasks/Nuspex/CMakeLists.txt +++ b/PWGLF/Tasks/Nuspex/CMakeLists.txt @@ -149,6 +149,11 @@ o2physics_add_dpl_workflow(nuclei-from-hypertriton-map PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(hyperhelium4sigma-analysis + SOURCES hyperhelium4sigmaAnalysis.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + if(FastJet_FOUND) o2physics_add_dpl_workflow(angular-correlations-in-jets SOURCES angularCorrelationsInJets.cxx diff --git a/PWGLF/Tasks/Nuspex/hyperhelium4sigmaAnalysis.cxx b/PWGLF/Tasks/Nuspex/hyperhelium4sigmaAnalysis.cxx new file mode 100644 index 00000000000..e60773cfbc8 --- /dev/null +++ b/PWGLF/Tasks/Nuspex/hyperhelium4sigmaAnalysis.cxx @@ -0,0 +1,338 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +// +/// \file hyperhelium4sigmaAnalysis.cxx +/// \brief Simple check for injected hyper-helium4sigma (H4S) in MC productions +/// \author Yuanzhe Wang + +#include + +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/ASoAHelpers.h" +#include "ReconstructionDataFormats/Track.h" +#include "Common/Core/RecoDecay.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/PIDResponse.h" +#include "CommonConstants/PhysicsConstants.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using std::array; +using FullTracksExtIU = soa::Join; +using MCLabeledTracksIU = soa::Join; + +//-------------------------------Check the decay channel of H4S------------------------------- +enum Channel { + k2body = 0, // helium4, pion0 + k3body_p, // triton, proton, pion0 + k3body_n, // triton, neutron, pion+ + kNDecayChannel +}; + +template +Channel getDecayChannelH4S(TMCParticle const& particle) +{ + if (std::abs(particle.pdgCode()) != o2::constants::physics::Pdg::kHyperHelium4Sigma) { + return kNDecayChannel; + } + bool haveAlpha = false, haveTriton = false, haveProton = false, haveNeuteron = false; + bool haveAntiAlpha = false, haveAntiTriton = false, haveAntiProton = false, haveAntiNeuteron = false; + bool havePionPlus = false, havePionMinus = false, havePion0 = false; + auto daughters = particle.template daughters_as(); + for (const auto& mcDaughter : particle.template daughters_as()) { + if (mcDaughter.pdgCode() == o2::constants::physics::Pdg::kAlpha) { + haveAlpha = true; + } + if (mcDaughter.pdgCode() == -o2::constants::physics::Pdg::kAlpha) { + haveAntiAlpha = true; + } + if (mcDaughter.pdgCode() == o2::constants::physics::Pdg::kTriton) { + haveTriton = true; + } + if (mcDaughter.pdgCode() == -o2::constants::physics::Pdg::kTriton) { + haveAntiTriton = true; + } + if (mcDaughter.pdgCode() == PDG_t::kProton) { + haveProton = true; + } + if (mcDaughter.pdgCode() == -PDG_t::kProton) { + haveAntiProton = true; + } + if (mcDaughter.pdgCode() == PDG_t::kNeutron) { + haveNeuteron = true; + } + if (mcDaughter.pdgCode() == -PDG_t::kNeutron) { + haveAntiNeuteron = true; + } + if (mcDaughter.pdgCode() == PDG_t::kPiPlus) { + havePionPlus = true; + } + if (mcDaughter.pdgCode() == -PDG_t::kPiPlus) { + havePionMinus = true; + } + if (mcDaughter.pdgCode() == PDG_t::kPi0) { + havePion0 = true; + } + } + + if ((haveAlpha && havePion0) || (haveAntiAlpha && havePion0)) { + return k2body; + } else if ((haveTriton && haveProton && havePion0) || (haveAntiTriton && haveAntiProton && havePion0)) { + return k3body_p; + } else if ((haveTriton && haveNeuteron && havePionPlus) || (haveAntiTriton && haveAntiNeuteron && havePionMinus)) { + return k3body_n; + } + + return kNDecayChannel; +} +//-------------------------------------------------------------- + +// check the performance of mcparticle +struct Hyperhelium4sigmaAnalysis { + // Basic checks + HistogramRegistry registry{ + "registry", + { + {"hCollCounter", "hCollCounter", {HistType::kTH1F, {{2, 0.0f, 2.0f}}}}, + {"hMcCollCounter", "hMcCollCounter", {HistType::kTH1F, {{2, 0.0f, 2.0f}}}}, + }, + }; + + ConfigurableAxis ptBins{"ptBins", {200, 0.f, 10.f}, "Binning for #it{p}_{T} (GeV/#it{c})"}; + ConfigurableAxis ctBins{"ctBins", {100, 0.f, 25.f}, "Binning for c#it{t} (cm)"}; + ConfigurableAxis rigidityBins{"rigidityBins", {200, -10.f, 10.f}, "Binning for #it{p}_{T} (GeV/#it{c})"}; + ConfigurableAxis nsigmaBins{"nsigmaBins", {120, -6.f, 6.f}, "Binning for n sigma"}; + ConfigurableAxis invMassBins{"invMassBins", {100, 3.85, 4.15f}, "Binning for invariant mass (GeV/#it{c}^{2})"}; + + void init(InitContext&) + { + const AxisSpec ptAxis{ptBins, "#it{p}_{T} (GeV/#it{c})"}; + const AxisSpec ctAxis{ctBins, "c#it{t} (cm)"}; + const AxisSpec rigidityAxis{rigidityBins, "p/z (GeV/#it{c})"}; + const AxisSpec nsigmaAxis{nsigmaBins, "TPC n#sigma"}; + const AxisSpec invMassAxis{invMassBins, "Inv Mass (GeV/#it{c}^{2})"}; + + registry.get(HIST("hCollCounter"))->GetXaxis()->SetBinLabel(1, "Reconstructed Collisions"); + registry.get(HIST("hCollCounter"))->GetXaxis()->SetBinLabel(2, "Selected"); + registry.get(HIST("hMcCollCounter"))->GetXaxis()->SetBinLabel(1, "MC Collisions"); + registry.get(HIST("hMcCollCounter"))->GetXaxis()->SetBinLabel(2, "Reconstructed"); + + auto hGenHyperHelium4SigmaCounter = registry.add("hGenHyperHelium4SigmaCounter", "", HistType::kTH1F, {{10, 0.f, 10.f}}); + registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(1, "H4S All"); + registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(2, "Matter"); + registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(3, "AntiMatter"); + registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(4, "#alpha + #pi^{0}"); + registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(5, "#bar{#alpha} + #pi^{0}"); + registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(6, "t + p + #pi^{0}"); + registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(7, "#bar{t} + #bar{p} + #pi^{0}"); + registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(8, "t + n + #pi^{+}"); + registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(9, "#bar{t} + #bar{n} + #pi^{+}"); + registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(10, "Unexpected"); + + auto hEvtSelectedHyperHelium4SigmaCounter = registry.add("hEvtSelectedHyperHelium4SigmaCounter", "", HistType::kTH1F, {{2, 0.f, 2.f}}); + registry.get(HIST("hEvtSelectedHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(1, "Generated"); + registry.get(HIST("hEvtSelectedHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(2, "Survived"); + + registry.add("hGenHyperHelium4SigmaPt", "", HistType::kTH1F, {ptAxis}); + registry.add("hGenHyperHelium4SigmaCt", "", HistType::kTH1F, {ctAxis}); + registry.add("hMcRecoInvMass", "", HistType::kTH1F, {invMassAxis}); + + registry.add("hDauHelium4TPCNSigma", "", HistType::kTH2F, {rigidityAxis, nsigmaAxis}); + registry.add("hDauTritonTPCNSigma", "", HistType::kTH2F, {rigidityAxis, nsigmaAxis}); + registry.add("hDauProtonTPCNSigma", "", HistType::kTH2F, {rigidityAxis, nsigmaAxis}); + } + + // Configurable eventSel8Cut{"eventSel8Cut", true, "flag to enable event sel8 selection"}; + Configurable mcEventCut{"mcEventCut", true, "flag to enable mc event selection: kIsTriggerTVX and kNoTimeFrameBorder"}; + Configurable eventPosZCut{"eventPosZCut", true, "flag to enable event posZ selection"}; + Configurable maxPosZ{"maxPosZ", 10.f, "max pv posZ for event selection"}; + + Preslice permcCollision = o2::aod::mcparticle::mcCollisionId; + + std::vector mcPartIndices; + template + void setTrackIDForMC(aod::McParticles const& particlesMC, TTrackTable const& tracks) + { + mcPartIndices.clear(); + mcPartIndices.resize(particlesMC.size()); + std::fill(mcPartIndices.begin(), mcPartIndices.end(), -1); + for (const auto& track : tracks) { + if (track.has_mcParticle()) { + auto mcparticle = track.template mcParticle_as(); + if (mcPartIndices[mcparticle.globalIndex()] == -1) { + mcPartIndices[mcparticle.globalIndex()] = track.globalIndex(); + } else { + auto candTrack = tracks.rawIteratorAt(mcPartIndices[mcparticle.globalIndex()]); + // Use the track which has innest information (also best quality? + if (track.x() < candTrack.x()) { + mcPartIndices[mcparticle.globalIndex()] = track.globalIndex(); + } + } + } + } + } + + void process(aod::McCollisions const& mcCollisions, aod::McParticles const& particlesMC, o2::soa::Join const& collisions, MCLabeledTracksIU const& tracks) + { + setTrackIDForMC(particlesMC, tracks); + std::vector selectedEvents(collisions.size()); + int nevts = 0; + for (const auto& collision : collisions) { + registry.fill(HIST("hCollCounter"), 0.5); + if (mcEventCut && (!collision.selection_bit(aod::evsel::kIsTriggerTVX) || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder))) { + continue; + } + if (eventPosZCut && std::abs(collision.posZ()) > maxPosZ) { // 10cm + continue; + } + registry.fill(HIST("hCollCounter"), 1.5); + selectedEvents[nevts++] = collision.mcCollision_as().globalIndex(); + } + selectedEvents.resize(nevts); + + for (const auto& mcCollision : mcCollisions) { + registry.fill(HIST("hMcCollCounter"), 0.5); + const auto evtReconstructedAndSelected = std::find(selectedEvents.begin(), selectedEvents.end(), mcCollision.globalIndex()) != selectedEvents.end(); + if (evtReconstructedAndSelected) { // Check that the event is reconstructed and that the reconstructed events pass the selection + registry.fill(HIST("hMcCollCounter"), 1.5); + } else { + // continue; + } + + const auto& dparticlesMC = particlesMC.sliceBy(permcCollision, mcCollision.globalIndex()); + + for (const auto& mcparticle : dparticlesMC) { + + bool isMatter; + if (mcparticle.pdgCode() == o2::constants::physics::Pdg::kHyperHelium4Sigma) { + registry.fill(HIST("hGenHyperHelium4SigmaCounter"), 1.5); + isMatter = true; + } else if (mcparticle.pdgCode() == -o2::constants::physics::Pdg::kHyperHelium4Sigma) { + registry.fill(HIST("hGenHyperHelium4SigmaCounter"), 2.5); + isMatter = false; + } else { + continue; + } + + registry.fill(HIST("hGenHyperHelium4SigmaCounter"), 0.5); + registry.fill(HIST("hEvtSelectedHyperHelium4SigmaCounter"), 0.5); + if (evtReconstructedAndSelected) { + registry.fill(HIST("hEvtSelectedHyperHelium4SigmaCounter"), 1.5); + } + + double svPos[3] = {-999, -999, -999}; + double dauHelium4Mom[3] = {-999, -999, -999}; + double dauTritonMom[3] = {-999, -999, -999}; + double dauProtonMom[3] = {-999, -999, -999}; + double dauNeuteronMom[3] = {-999, -999, -999}; + double dauChargedPionMom[3] = {-999, -999, -999}; + double dauPion0Mom[3] = {-999, -999, -999}; + auto dChannel = getDecayChannelH4S(mcparticle); + if (dChannel == kNDecayChannel) { + registry.fill(HIST("hGenHyperHelium4SigmaCounter"), 9.5); + continue; + } + for (const auto& mcparticleDaughter : mcparticle.daughters_as()) { + if (std::abs(mcparticleDaughter.pdgCode()) == o2::constants::physics::Pdg::kAlpha) { + dauHelium4Mom[0] = mcparticleDaughter.px(); + dauHelium4Mom[1] = mcparticleDaughter.py(); + dauHelium4Mom[2] = mcparticleDaughter.pz(); + + // get SV position for 2body decay + svPos[0] = mcparticleDaughter.vx(); + svPos[1] = mcparticleDaughter.vy(); + svPos[2] = mcparticleDaughter.vz(); + + if (mcPartIndices[mcparticleDaughter.globalIndex()] != -1) { + auto track = tracks.rawIteratorAt(mcPartIndices[mcparticleDaughter.globalIndex()]); + registry.fill(HIST("hDauHelium4TPCNSigma"), track.p() * track.sign(), track.tpcNSigmaAl()); + } + } else if (std::abs(mcparticleDaughter.pdgCode()) == o2::constants::physics::Pdg::kTriton) { + dauTritonMom[0] = mcparticleDaughter.px(); + dauTritonMom[1] = mcparticleDaughter.py(); + dauTritonMom[2] = mcparticleDaughter.pz(); + + // get SV position for 3body decay + svPos[0] = mcparticleDaughter.vx(); + svPos[1] = mcparticleDaughter.vy(); + svPos[2] = mcparticleDaughter.vz(); + + if (mcPartIndices[mcparticleDaughter.globalIndex()] != -1) { + auto track = tracks.rawIteratorAt(mcPartIndices[mcparticleDaughter.globalIndex()]); + registry.fill(HIST("hDauTritonTPCNSigma"), track.p() * track.sign(), track.tpcNSigmaTr()); + } + } else if (std::abs(mcparticleDaughter.pdgCode()) == PDG_t::kProton) { + dauProtonMom[0] = mcparticleDaughter.px(); + dauProtonMom[1] = mcparticleDaughter.py(); + dauProtonMom[2] = mcparticleDaughter.pz(); + + if (mcPartIndices[mcparticleDaughter.globalIndex()] != -1) { + auto track = tracks.rawIteratorAt(mcPartIndices[mcparticleDaughter.globalIndex()]); + registry.fill(HIST("hDauProtonTPCNSigma"), track.p() * track.sign(), track.tpcNSigmaPr()); + } + } else if (std::abs(mcparticleDaughter.pdgCode()) == PDG_t::kNeutron) { + dauNeuteronMom[0] = mcparticleDaughter.px(); + dauNeuteronMom[1] = mcparticleDaughter.py(); + dauNeuteronMom[2] = mcparticleDaughter.pz(); + } else if (std::abs(mcparticleDaughter.pdgCode()) == PDG_t::kPiPlus) { + dauChargedPionMom[0] = mcparticleDaughter.px(); + dauChargedPionMom[1] = mcparticleDaughter.py(); + dauChargedPionMom[2] = mcparticleDaughter.pz(); + } else if (mcparticleDaughter.pdgCode() == PDG_t::kPi0) { + dauPion0Mom[0] = mcparticleDaughter.px(); + dauPion0Mom[1] = mcparticleDaughter.py(); + dauPion0Mom[2] = mcparticleDaughter.pz(); + } + } + + registry.fill(HIST("hGenHyperHelium4SigmaPt"), mcparticle.pt()); + double ct = RecoDecay::sqrtSumOfSquares(svPos[0] - mcparticle.vx(), svPos[1] - mcparticle.vy(), svPos[2] - mcparticle.vz()) * o2::constants::physics::MassHyperHelium4Sigma / mcparticle.p(); + registry.fill(HIST("hGenHyperHelium4SigmaCt"), ct); + + if (dChannel == k2body) { + if (isMatter) { + registry.fill(HIST("hGenHyperHelium4SigmaCounter"), 3.5); + } else { + registry.fill(HIST("hGenHyperHelium4SigmaCounter"), 4.5); + } + double hyperHelium4SigmaMCMass = RecoDecay::m(std::array{std::array{dauHelium4Mom[0], dauHelium4Mom[1], dauHelium4Mom[2]}, std::array{dauPion0Mom[0], dauPion0Mom[1], dauPion0Mom[2]}}, std::array{o2::constants::physics::MassAlpha, o2::constants::physics::MassPi0}); + registry.fill(HIST("hMcRecoInvMass"), hyperHelium4SigmaMCMass); + } else if (dChannel == k3body_p) { + if (isMatter) { + registry.fill(HIST("hGenHyperHelium4SigmaCounter"), 5.5); + } else { + registry.fill(HIST("hGenHyperHelium4SigmaCounter"), 6.5); + } + double hyperHelium4SigmaMCMass = RecoDecay::m(std::array{std::array{dauTritonMom[0], dauTritonMom[1], dauTritonMom[2]}, std::array{dauProtonMom[0], dauProtonMom[1], dauProtonMom[2]}, std::array{dauPion0Mom[0], dauPion0Mom[1], dauPion0Mom[2]}}, std::array{o2::constants::physics::MassTriton, o2::constants::physics::MassProton, o2::constants::physics::MassPi0}); + registry.fill(HIST("hMcRecoInvMass"), hyperHelium4SigmaMCMass); + } else if (dChannel == k3body_n) { + if (isMatter) { + registry.fill(HIST("hGenHyperHelium4SigmaCounter"), 7.5); + } else { + registry.fill(HIST("hGenHyperHelium4SigmaCounter"), 8.5); + } + double hyperHelium4SigmaMCMass = RecoDecay::m(std::array{std::array{dauTritonMom[0], dauTritonMom[1], dauTritonMom[2]}, std::array{dauNeuteronMom[0], dauNeuteronMom[1], dauNeuteronMom[2]}, std::array{dauChargedPionMom[0], dauChargedPionMom[1], dauChargedPionMom[2]}}, std::array{o2::constants::physics::MassTriton, o2::constants::physics::MassNeutron, o2::constants::physics::MassPionCharged}); + registry.fill(HIST("hMcRecoInvMass"), hyperHelium4SigmaMCMass); + } + } + } + } +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc), + }; +} From f4e36f0788b02026b3817f0b977dcc59f9c8b0b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Sat, 3 May 2025 09:23:40 +0200 Subject: [PATCH 1163/1650] [ALICE3] A3TOF: Inherit LUTs from otf tracker (#11064) --- ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx | 27 ++++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx b/ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx index a5369844575..435b616d927 100644 --- a/ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx +++ b/ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx @@ -91,11 +91,11 @@ struct OnTheFlyTofPid { Configurable multiplicityEtaRange{"multiplicityEtaRange", 0.800000012, "eta range to compute the multiplicity"}; Configurable flagIncludeTrackTimeRes{"flagIncludeTrackTimeRes", true, "flag to include or exclude track time resolution"}; Configurable flagTOFLoadDelphesLUTs{"flagTOFLoadDelphesLUTs", false, "flag to load Delphes LUTs for tracking correction (use recoTrack parameters if false)"}; - Configurable lutEl{"lutEl", "lutCovm.el.dat", "LUT for electrons"}; - Configurable lutMu{"lutMu", "lutCovm.mu.dat", "LUT for muons"}; - Configurable lutPi{"lutPi", "lutCovm.pi.dat", "LUT for pions"}; - Configurable lutKa{"lutKa", "lutCovm.ka.dat", "LUT for kaons"}; - Configurable lutPr{"lutPr", "lutCovm.pr.dat", "LUT for protons"}; + Configurable lutEl{"lutEl", "inherit", "LUT for electrons (if inherit, inherits from otf tracker task)"}; + Configurable lutMu{"lutMu", "inherit", "LUT for muons (if inherit, inherits from otf tracker task)"}; + Configurable lutPi{"lutPi", "inherit", "LUT for pions (if inherit, inherits from otf tracker task)"}; + Configurable lutKa{"lutKa", "inherit", "LUT for kaons (if inherit, inherits from otf tracker task)"}; + Configurable lutPr{"lutPr", "inherit", "LUT for protons (if inherit, inherits from otf tracker task)"}; } simConfig; struct : ConfigurableGroup { @@ -131,10 +131,25 @@ struct OnTheFlyTofPid { HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; static constexpr int kParticles = 5; - void init(o2::framework::InitContext&) + void init(o2::framework::InitContext& initContext) { pRandomNumberGenerator.SetSeed(0); // fully randomize + // Check if inheriting the LUT configuration + auto configLutPath = [&](Configurable& lut) { + if (lut.value != "inherit") { + return; + } + if (!getTaskOptionValue(initContext, "on-the-fly-tracker", lut.name, lut.value, true)) { + LOG(fatal) << "Could not get " << lut.name << " from on-the-fly-tracker task"; + } + }; + configLutPath(simConfig.lutEl); + configLutPath(simConfig.lutMu); + configLutPath(simConfig.lutPi); + configLutPath(simConfig.lutKa); + configLutPath(simConfig.lutPr); + // Load LUT for pt and eta smearing if (simConfig.flagIncludeTrackTimeRes && simConfig.flagTOFLoadDelphesLUTs) { std::map mapPdgLut; From f4ba1316e4edfafee1d2185b53acaec81927ed82 Mon Sep 17 00:00:00 2001 From: MykhailoShamrai <99137234+MykhailoShamrai@users.noreply.github.com> Date: Sat, 3 May 2025 10:51:07 +0200 Subject: [PATCH 1164/1650] [Tutorial] Event Mixing: fixed tutorials for event mixing (#10471) --- Tutorials/src/eventMixing.cxx | 146 +++++++++++++----------- Tutorials/src/eventMixingValidation.cxx | 28 +++-- 2 files changed, 98 insertions(+), 76 deletions(-) diff --git a/Tutorials/src/eventMixing.cxx b/Tutorials/src/eventMixing.cxx index 676d6ba96e3..a1526740886 100644 --- a/Tutorials/src/eventMixing.cxx +++ b/Tutorials/src/eventMixing.cxx @@ -9,10 +9,13 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. /// +/// \file eventMixing.cxx /// \brief Example tasks for event mixing. -/// \author +/// \author Karwowska Maja /// \since +#include +#include "Framework/AnalysisDataModel.h" #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/ASoAHelpers.h" @@ -37,18 +40,18 @@ DECLARE_SOA_TABLE(MixingHashes, "AOD", "HASH", hash::Bin); struct MixedEvents { SliceCache cache; + Preslice perCollision = aod::track::collisionId; std::vector xBins{VARIABLE_WIDTH, -0.064, -0.062, -0.060, 0.066, 0.068, 0.070, 0.072}; std::vector yBins{VARIABLE_WIDTH, -0.320, -0.301, -0.300, 0.330, 0.340, 0.350, 0.360}; using BinningType = ColumnBinningPolicy; - BinningType binningOnPositions{{xBins, yBins}, true}; // true is for 'ignore overflows' (true by default) + BinningType binningOnPositions{{xBins, yBins}, true}; // true is for 'ignore overflows' (true by default) SameKindPair pair{binningOnPositions, 5, -1, &cache}; // indicates that 5 events should be mixed and under/overflow (-1) to be ignored - void process(aod::Collisions const& collisions, aod::Tracks const& tracks) { LOGF(info, "Input data Collisions %d, Tracks %d ", collisions.size(), tracks.size()); int count = 0; - for (auto& [c1, tracks1, c2, tracks2] : pair) { + for (const auto& [c1, tracks1, c2, tracks2] : pair) { // Example of using getBin() to check collisions bin // NOTE that it is a bit different for FlexibleBinning -- check in respective example int bin = binningOnPositions.getBin({c1.posX(), c1.posY()}); @@ -60,7 +63,7 @@ struct MixedEvents { // Example of using tracks from mixed events -- iterate over all track pairs from the two collisions int trackCount = 0; - for (auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) { + for (const auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) { LOGF(info, "Mixed event tracks pair: (%d, %d) from events (%d, %d), track event: (%d, %d)", t1.index(), t2.index(), c1.index(), c2.index(), t1.collision().index(), t2.collision().index()); trackCount++; if (trackCount == 10) @@ -72,12 +75,14 @@ struct MixedEvents { struct MixedEventsInsideProcess { SliceCache cache; + Preslice perCollision = aod::track::collisionId; std::vector xBins{VARIABLE_WIDTH, -0.064, -0.062, -0.060, 0.066, 0.068, 0.070, 0.072}; std::vector yBins{VARIABLE_WIDTH, -0.320, -0.301, -0.300, 0.330, 0.340, 0.350, 0.360}; using BinningType = ColumnBinningPolicy; BinningType binningOnPositions{{xBins, yBins}, true}; // true is for 'ignore overflows' (true by default) - void process(aod::Collisions& collisions, aod::Tracks& tracks) + void process(aod::Collisions const& collisions, aod::Tracks const& tracks) + { LOGF(info, "Input data Collisions %d, Tracks %d ", collisions.size(), tracks.size()); @@ -85,7 +90,7 @@ struct MixedEventsInsideProcess { SameKindPair pair{binningOnPositions, 5, -1, collisions, tracksTuple, &cache}; // indicates that 5 events should be mixed and under/overflow (-1) to be ignored int count = 0; - for (auto& [c1, tracks1, c2, tracks2] : pair) { + for (const auto& [c1, tracks1, c2, tracks2] : pair) { LOGF(info, "Mixed event collisions: (%d, %d)", c1.globalIndex(), c2.globalIndex()); count++; if (count == 10) @@ -93,7 +98,7 @@ struct MixedEventsInsideProcess { // Example of using tracks from mixed events -- iterate over all track pairs from the two collisions int trackCount = 0; - for (auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) { + for (const auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) { LOGF(info, "Mixed event tracks pair: (%d, %d) from events (%d, %d), track event: (%d, %d)", t1.index(), t2.index(), c1.index(), c2.index(), t1.collision().index(), t2.collision().index()); trackCount++; if (trackCount == 10) @@ -105,21 +110,22 @@ struct MixedEventsInsideProcess { struct MixedEventsFilteredTracks { SliceCache cache; + Preslice perCollision = aod::track::collisionId; Filter trackFilter = aod::track::eta < 1.0f; - using myTracks = soa::Filtered; + using MyTracks = soa::Filtered; std::vector xBins{VARIABLE_WIDTH, -0.064, -0.062, -0.060, 0.066, 0.068, 0.070, 0.072}; std::vector yBins{VARIABLE_WIDTH, -0.320, -0.301, -0.300, 0.330, 0.340, 0.350, 0.360}; using BinningType = ColumnBinningPolicy; - BinningType binningOnPositions{{xBins, yBins}, true}; // true is for 'ignore overflows' (true by default) - SameKindPair pair{binningOnPositions, 5, -1, &cache}; // indicates that 5 events should be mixed and under/overflow (-1) to be ignored + BinningType binningOnPositions{{xBins, yBins}, true}; // true is for 'ignore overflows' (true by default) + SameKindPair pair{binningOnPositions, 5, -1, &cache}; // indicates that 5 events should be mixed and under/overflow (-1) to be ignored - void process(aod::Collisions const& collisions, myTracks const& tracks) + void process(aod::Collisions const& collisions, MyTracks const& tracks) { LOGF(info, "Input data Collisions %d, Tracks %d ", collisions.size(), tracks.size()); int count = 0; - for (auto& [c1, tracks1, c2, tracks2] : pair) { + for (const auto& [c1, tracks1, c2, tracks2] : pair) { LOGF(info, "Mixed event collisions: (%d, %d)", c1.globalIndex(), c2.globalIndex()); count++; if (count == 100) @@ -127,7 +133,7 @@ struct MixedEventsFilteredTracks { // Example of using tracks from mixed events -- iterate over all track pairs from the two collisions int trackCount = 0; - for (auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) { + for (const auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) { LOGF(info, "Mixed event tracks pair: (%d, %d) (%.2f, %.2f) < 1.0f from events (%d, %d), track event: (%d, %d)", t1.index(), t2.index(), t1.eta(), t2.eta(), c1.index(), c2.index(), t1.collision().index(), t2.collision().index()); trackCount++; if (trackCount == 10) @@ -139,19 +145,20 @@ struct MixedEventsFilteredTracks { struct MixedEventsJoinedCollisions { SliceCache cache; - using aodCollisions = soa::Join; + Preslice perCollision = aod::track::collisionId; + using AODCollisions = soa::Join; std::vector xBins{VARIABLE_WIDTH, -0.064, -0.062, -0.060, 0.066, 0.068, 0.070, 0.072}; std::vector yBins{VARIABLE_WIDTH, -0.320, -0.301, -0.300, 0.330, 0.340, 0.350, 0.360}; using BinningType = ColumnBinningPolicy; - BinningType binningOnPositions{{xBins, yBins}, true}; // true is for 'ignore overflows' (true by default) - SameKindPair pair{binningOnPositions, 5, -1, &cache}; // indicates that 5 events should be mixed and under/overflow (-1) to be ignored + BinningType binningOnPositions{{xBins, yBins}, true}; // true is for 'ignore overflows' (true by default) + SameKindPair pair{binningOnPositions, 5, -1, &cache}; // indicates that 5 events should be mixed and under/overflow (-1) to be ignored - void process(aodCollisions& collisions, aod::Tracks const& tracks, aod::BCsWithTimestamps const&) + void process(AODCollisions const& collisions, aod::Tracks const& tracks, aod::BCsWithTimestamps const&) { LOGF(info, "Input data Collisions %d, Tracks %d ", collisions.size(), tracks.size()); int count = 0; - for (auto& [c1, tracks1, c2, tracks2] : pair) { + for (const auto& [c1, tracks1, c2, tracks2] : pair) { LOGF(info, "Mixed event collisions: (%d, %d)", c1.globalIndex(), c2.globalIndex()); count++; if (count == 10) @@ -159,8 +166,8 @@ struct MixedEventsJoinedCollisions { // Example of using tracks from mixed events -- iterate over all track pairs from the two collisions int trackCount = 0; - for (auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) { - LOGF(info, "Mixed event tracks pair: (%d, %d) from events (%d, %d), track event: (%d, %d)", t1.index(), t2.index(), c1.index(), c2.index(), t1.collision().index(), t2.collision().index()); + for (const auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) { + LOGF(info, "Mixed event tracks pair: (%d, %d) from events (%d, %d), track event: (%d, %d)", t1.index(), t2.index(), c1.index(), c2.index(), t1.collision_as().index(), t2.collision_as().index()); trackCount++; if (trackCount == 10) break; @@ -171,19 +178,20 @@ struct MixedEventsJoinedCollisions { struct MixedEventsDynamicColumns { SliceCache cache; - using aodCollisions = soa::Join; + Preslice perCollison = aod::track::collisionId; + using AODCollisions = soa::Join; std::vector zBins{7, -7, 7}; std::vector multBins{VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 100.1}; using BinningType = ColumnBinningPolicy>; - BinningType corrBinning{{zBins, multBins}, true}; // true is for 'ignore overflows' (true by default) - SameKindPair pair{corrBinning, 5, -1, &cache}; // indicates that 5 events should be mixed and under/overflow (-1) to be ignored + BinningType corrBinning{{zBins, multBins}, true}; // true is for 'ignore overflows' (true by default) + SameKindPair pair{corrBinning, 5, -1, &cache}; // indicates that 5 events should be mixed and under/overflow (-1) to be ignored - void process(aodCollisions& collisions, aod::Tracks const& tracks) + void process(AODCollisions const& collisions, aod::Tracks const& tracks) { LOGF(info, "Input data Collisions %d, Tracks %d ", collisions.size(), tracks.size()); int count = 0; - for (auto& [c1, tracks1, c2, tracks2] : pair) { + for (const auto& [c1, tracks1, c2, tracks2] : pair) { LOGF(info, "Mixed event collisions: (%d, %d)", c1.globalIndex(), c2.globalIndex()); count++; if (count == 10) @@ -191,8 +199,8 @@ struct MixedEventsDynamicColumns { // Example of using tracks from mixed events -- iterate over all track pairs from the two collisions int trackCount = 0; - for (auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) { - LOGF(info, "Mixed event tracks pair: (%d, %d) from events (%d, %d), track event: (%d, %d)", t1.index(), t2.index(), c1.index(), c2.index(), t1.collision().index(), t2.collision().index()); + for (const auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) { + LOGF(info, "Mixed event tracks pair: (%d, %d) from events (%d, %d), track event: (%d, %d)", t1.index(), t2.index(), c1.index(), c2.index(), t1.collision_as().index(), t2.collision_as().index()); trackCount++; if (trackCount == 10) break; @@ -203,10 +211,12 @@ struct MixedEventsDynamicColumns { struct MixedEventsVariousKinds { SliceCache cache; + Preslice perCollisionTrack = aod::track::collisionId; + Preslice perCollisionV0 = aod::v0::collisionId; std::vector xBins{VARIABLE_WIDTH, -0.064, -0.062, -0.060, 0.066, 0.068, 0.070, 0.072}; std::vector yBins{VARIABLE_WIDTH, -0.320, -0.301, -0.300, 0.330, 0.340, 0.350, 0.360}; using BinningType = ColumnBinningPolicy; - BinningType binningOnPositions{{xBins, yBins}, true}; // true is for 'ignore overflows' (true by default) + BinningType binningOnPositions{{xBins, yBins}, true}; // true is for 'ignore overflows' (true by default) Pair pair{binningOnPositions, 5, -1, &cache}; // indicates that 5 events should be mixed and under/overflow (-1) to be ignored void process(aod::Collisions const& collisions, aod::Tracks const& tracks, aod::V0s const& v0s) @@ -216,7 +226,7 @@ struct MixedEventsVariousKinds { int count = 0; // tracks1 is an aod::Tracks table of tracks belonging to collision c1 (aod::Collision::iterator) // tracks2 is an aod::V0s table of V0s belonging to collision c2 (aod::Collision::iterator) - for (auto& [c1, tracks1, c2, tracks2] : pair) { + for (const auto& [c1, tracks1, c2, tracks2] : pair) { LOGF(info, "Mixed event collisions: (%d, %d)", c1.globalIndex(), c2.globalIndex()); count++; if (count == 100) @@ -224,7 +234,7 @@ struct MixedEventsVariousKinds { // Example of using tracks from mixed events -- iterate over all track pairs from the two collisions int trackCount = 0; - for (auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) { + for (const auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) { LOGF(info, "Mixed event tracks pair: (%d, %d) from events (%d, %d), track event: (%d, %d)", t1.index(), t2.index(), c1.index(), c2.index(), t1.collision().index(), t2.collision().index()); trackCount++; if (trackCount == 10) @@ -236,11 +246,12 @@ struct MixedEventsVariousKinds { struct MixedEventsTriple { SliceCache cache; + Preslice perCollision = aod::track::collisionId; std::vector xBins{VARIABLE_WIDTH, -0.064, -0.062, -0.060, 0.066, 0.068, 0.070, 0.072}; std::vector yBins{VARIABLE_WIDTH, -0.320, -0.301, -0.300, 0.330, 0.340, 0.350, 0.360}; std::vector zBins{7, -7, 7}; using BinningType = ColumnBinningPolicy; - BinningType binningOnPositions{{xBins, yBins, zBins}, true}; // true is for 'ignore overflows' (true by default) + BinningType binningOnPositions{{xBins, yBins, zBins}, true}; // true is for 'ignore overflows' (true by default) SameKindTriple triple{binningOnPositions, 5, -1, &cache}; // indicates that 5 events should be mixed and under/overflow (-1) to be ignored void process(aod::Collisions const& collisions, aod::Tracks const& tracks) @@ -248,7 +259,7 @@ struct MixedEventsTriple { LOGF(info, "Input data Collisions %d, Tracks %d", collisions.size(), tracks.size()); int count = 0; - for (auto& [c1, tracks1, c2, tracks2, c3, tracks3] : triple) { + for (const auto& [c1, tracks1, c2, tracks2, c3, tracks3] : triple) { LOGF(info, "Mixed event collisions: (%d, %d, %d)", c1.globalIndex(), c2.globalIndex(), c3.globalIndex()); count++; if (count == 100) @@ -256,7 +267,7 @@ struct MixedEventsTriple { // Example of using tracks from mixed events -- iterate over all track triplets from the three collisions int trackCount = 0; - for (auto& [t1, t2, t3] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2, tracks3))) { + for (const auto& [t1, t2, t3] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2, tracks3))) { LOGF(info, "Mixed event tracks triple: (%d, %d, %d) from events (%d, %d, %d), track event: (%d, %d, %d)", t1.index(), t2.index(), t3.index(), c1.index(), c2.index(), c3.index(), t1.collision().index(), t2.collision().index(), t3.collision().index()); trackCount++; if (trackCount == 10) @@ -268,11 +279,13 @@ struct MixedEventsTriple { struct MixedEventsTripleVariousKinds { SliceCache cache; + Preslice perCollisionTrack = aod::track::collisionId; + Preslice perCollisionV0 = aod::v0::collisionId; std::vector xBins{VARIABLE_WIDTH, -0.064, -0.062, -0.060, 0.066, 0.068, 0.070, 0.072}; std::vector yBins{VARIABLE_WIDTH, -0.320, -0.301, -0.300, 0.330, 0.340, 0.350, 0.360}; std::vector zBins{7, -7, 7}; using BinningType = ColumnBinningPolicy; - BinningType binningOnPositions{{xBins, yBins, zBins}, true}; // true is for 'ignore overflows' (true by default) + BinningType binningOnPositions{{xBins, yBins, zBins}, true}; // true is for 'ignore overflows' (true by default) Triple triple{binningOnPositions, 5, -1, &cache}; // indicates that 5 events should be mixed and under/overflow (-1) to be ignored void process(aod::Collisions const& collisions, aod::Tracks const& tracks, aod::V0s const& v0s) @@ -283,7 +296,7 @@ struct MixedEventsTripleVariousKinds { // tracks1 is an aod::Tracks table of tracks belonging to collision c1 (aod::Collision::iterator) // tracks2 is an aod::V0s table of V0s belonging to collision c2 (aod::Collision::iterator) // tracks3 is an aod::Tracks table of tracks belonging to collision c3 (aod::Collision::iterator) - for (auto& [c1, tracks1, c2, tracks2, c3, tracks3] : triple) { + for (const auto& [c1, tracks1, c2, tracks2, c3, tracks3] : triple) { LOGF(info, "Mixed event collisions: (%d, %d, %d)", c1.globalIndex(), c2.globalIndex(), c3.globalIndex()); count++; if (count == 100) @@ -291,7 +304,7 @@ struct MixedEventsTripleVariousKinds { // Example of using tracks from mixed events -- iterate over all track triplets from the three collisions int trackCount = 0; - for (auto& [t1, t2, t3] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2, tracks3))) { + for (const auto& [t1, t2, t3] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2, tracks3))) { LOGF(info, "Mixed event tracks triple: (%d, %d, %d) from events (%d, %d, %d), track event: (%d, %d, %d)", t1.index(), t2.index(), t3.index(), c1.index(), c2.index(), c3.index(), t1.collision().index(), t2.collision().index(), t3.collision().index()); trackCount++; if (trackCount == 10) @@ -331,9 +344,9 @@ struct HashTask { void process(aod::Collisions const& collisions) { - for (auto& collision : collisions) { + for (const auto& collision : collisions) { int hash = getHash(xBins, yBins, collision.posX(), collision.posY()); - // LOGF(info, "Collision: %d (%f, %f, %f) hash: %d", collision.index(), collision.posX(), collision.posY(), collision.posZ(), hash); + LOGF(info, "Collision: %d (%f, %f, %f) hash: %d", collision.index(), collision.posX(), collision.posY(), collision.posZ(), hash); hashes(hash); } } @@ -341,16 +354,17 @@ struct HashTask { struct MixedEventsWithHashTask { SliceCache cache; - using myCollisions = soa::Join; + Preslice perCollision = aod::track::collisionId; + using MyCollision = soa::Join; NoBinningPolicy hashBin; - SameKindPair> pair{hashBin, 5, -1, &cache}; // indicates that 5 events should be mixed and under/overflow (-1) to be ignored + SameKindPair> pair{hashBin, 5, -1, &cache}; // indicates that 5 events should be mixed and under/overflow (-1) to be ignored - void process(myCollisions& collisions, aod::Tracks& tracks) + void process(MyCollision const& collisions, aod::Tracks const& tracks) { LOGF(info, "Input data Collisions %d, Tracks %d ", collisions.size(), tracks.size()); int count = 0; - for (auto& [c1, tracks1, c2, tracks2] : pair) { + for (const auto& [c1, tracks1, c2, tracks2] : pair) { LOGF(info, "Mixed event collisions: (%d, %d)", c1.globalIndex(), c2.globalIndex()); count++; if (count == 10) @@ -358,7 +372,7 @@ struct MixedEventsWithHashTask { // Example of using tracks from mixed events -- iterate over all track pairs from the two collisions int trackCount = 0; - for (auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) { + for (const auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) { LOGF(info, "Mixed event tracks pair: (%d, %d) from events (%d, %d)", t1.globalIndex(), t2.globalIndex(), c1.globalIndex(), c2.globalIndex()); trackCount++; if (trackCount == 10) @@ -370,27 +384,28 @@ struct MixedEventsWithHashTask { struct MixedEventsPartitionedTracks { SliceCache cache; + Preslice perCollision = aod::track::collisionId; Filter trackFilter = (aod::track::x > -0.8f) && (aod::track::x < 0.8f) && (aod::track::y > 1.0f); - using myTracks = soa::Filtered; + using MyTracks = soa::Filtered; - Configurable philow{"phiLow", 1.0f, "lowest phi"}; - Configurable phiup{"phiUp", 2.0f, "highest phi"}; + Configurable phiLow{"phiLow", 1.0f, "lowest phi"}; + Configurable phiUp{"phiUp", 2.0f, "highest phi"}; std::vector xBins{VARIABLE_WIDTH, -0.064, -0.062, -0.060, 0.066, 0.068, 0.070, 0.072}; std::vector yBins{VARIABLE_WIDTH, -0.320, -0.301, -0.300, 0.330, 0.340, 0.350, 0.360}; using BinningType = ColumnBinningPolicy; - BinningType binningOnPositions{{xBins, yBins}, true}; // true is for 'ignore overflows' (true by default) - SameKindPair pair{binningOnPositions, 5, -1, &cache}; // indicates that 5 events should be mixed and under/overflow (-1) to be ignored + BinningType binningOnPositions{{xBins, yBins}, true}; // true is for 'ignore overflows' (true by default) + SameKindPair pair{binningOnPositions, 5, -1, &cache}; // indicates that 5 events should be mixed and under/overflow (-1) to be ignored - void process(aod::Collisions const& collisions, myTracks const& tracks) + void process(aod::Collisions const& collisions, MyTracks const& tracks) { LOGF(info, "Input data Collisions %d, Tracks %d ", collisions.size(), tracks.size()); - for (auto& [c1, tracks1, c2, tracks2] : pair) { - Partition leftPhi1 = aod::track::phi < philow; - Partition leftPhi2 = aod::track::phi < philow; - Partition rightPhi1 = aod::track::phi >= phiup; - Partition rightPhi2 = aod::track::phi >= phiup; + for (const auto& [c1, tracks1, c2, tracks2] : pair) { + Partition leftPhi1 = aod::track::phi < phiLow; + Partition leftPhi2 = aod::track::phi < phiLow; + Partition rightPhi1 = aod::track::phi >= phiUp; + Partition rightPhi2 = aod::track::phi >= phiUp; leftPhi1.bindTable(tracks1); leftPhi2.bindTable(tracks2); rightPhi1.bindTable(tracks1); @@ -399,14 +414,14 @@ struct MixedEventsPartitionedTracks { LOGF(info, "Mixed event collisions: (%d, %d), tracks: (%d, %d), left phis: (%d, %d), right phis: (%d, %d)", c1.globalIndex(), c2.globalIndex(), tracks1.size(), tracks2.size(), leftPhi1.size(), leftPhi2.size(), rightPhi1.size(), rightPhi2.size()); // Example of using tracks from mixed events -- iterate over all track pairs from the two partitions from two collisions - for (auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(leftPhi1, leftPhi2))) { - if (t1.phi() >= (float)philow || t2.phi() >= (float)philow) { - LOGF(info, "WRONG Mixed event left tracks pair: (%d, %d) from events (%d, %d), phi: (%.3f. %.3f) < %.3f", t1.index(), t2.index(), c1.index(), c2.index(), t1.phi(), t2.phi(), (float)philow); + for (const auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(leftPhi1, leftPhi2))) { + if (t1.phi() >= static_cast(phiLow) || t2.phi() >= static_cast(phiLow)) { + LOGF(info, "WRONG Mixed event left tracks pair: (%d, %d) from events (%d, %d), phi: (%.3f. %.3f) < %.3f", t1.index(), t2.index(), c1.index(), c2.index(), t1.phi(), t2.phi(), (float)phiLow); } } - for (auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(rightPhi1, rightPhi2))) { - if (t1.phi() < (float)phiup || t2.phi() < (float)phiup) { - LOGF(info, "WRONG Mixed event right tracks pair: (%d, %d) from events (%d, %d), phi: (%.3f. %.3f) >= %.3f", t1.index(), t2.index(), c1.index(), c2.index(), t1.phi(), t2.phi(), (float)phiup); + for (const auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(rightPhi1, rightPhi2))) { + if (t1.phi() < static_cast(phiUp) || t2.phi() < static_cast(phiUp)) { + LOGF(info, "WRONG Mixed event right tracks pair: (%d, %d) from events (%d, %d), phi: (%.3f. %.3f) >= %.3f", t1.index(), t2.index(), c1.index(), c2.index(), t1.phi(), t2.phi(), (float)phiUp); } } } @@ -415,12 +430,12 @@ struct MixedEventsPartitionedTracks { struct MixedEventsLambdaBinning { SliceCache cache; - Preslice perCol = aod::track::collisionId; + Preslice perCollision = aod::track::collisionId; ConfigurableAxis axisVertex{"axisVertex", {14, -7, 7}, "vertex axis for histograms"}; ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0.0, 2.750, 5.250, 7.750, 12.750, 17.750, 22.750, 27.750, 32.750, 37.750, 42.750, 47.750, 52.750, 57.750, 62.750, 67.750, 72.750, 77.750, 82.750, 87.750, 92.750, 97.750, 250.1}, "multiplicity axis for histograms"}; - void process(aod::Collisions& collisions, aod::Tracks& tracks) + void process(aod::Collisions const& collisions, aod::Tracks const& tracks) { LOGF(info, "Input data Collisions %d, Tracks %d ", collisions.size(), tracks.size()); @@ -437,7 +452,7 @@ struct MixedEventsLambdaBinning { SameKindPair pair{binningWithLambda, 5, -1, collisions, tracksTuple, &cache}; // indicates that 5 events should be mixed and under/overflow (-1) to be ignored int count = 0; - for (auto& [c1, tracks1, c2, tracks2] : pair) { + for (const auto& [c1, tracks1, c2, tracks2] : pair) { // NOTE that getBin() with FlexibleBinningPolicy needs explicit tuple construction int bin = binningWithLambda.getBin(std::tuple(getTracksSize(c1), c1.posZ())); @@ -448,7 +463,7 @@ struct MixedEventsLambdaBinning { // Example of using tracks from mixed events -- iterate over all track pairs from the two collisions int trackCount = 0; - for (auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) { + for (const auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) { LOGF(info, "Mixed event tracks pair: (%d, %d) from events (%d, %d), track event: (%d, %d)", t1.index(), t2.index(), c1.index(), c2.index(), t1.collision().index(), t2.collision().index()); trackCount++; if (trackCount == 10) @@ -463,6 +478,7 @@ struct MixedEventsCounters { // https://aliceo2group.github.io/analysis-framework/docs/tutorials/eventMixing.html#mixedeventscounters SliceCache cache; + Preslice perCollision = aod::track::collisionId; std::vector xBins{VARIABLE_WIDTH, -0.064, -0.062, -0.060, 0.066, 0.068, 0.070, 0.072}; std::vector yBins{VARIABLE_WIDTH, -0.320, -0.301, -0.300, 0.330, 0.340, 0.350, 0.360}; diff --git a/Tutorials/src/eventMixingValidation.cxx b/Tutorials/src/eventMixingValidation.cxx index 2db94b1d082..cc1933b0a25 100644 --- a/Tutorials/src/eventMixingValidation.cxx +++ b/Tutorials/src/eventMixingValidation.cxx @@ -9,11 +9,14 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. /// +/// \file eventMixingValidation.cxx /// \brief Validation tasks for event mixing. -/// \author +/// \author Karwowska Maja /// \since -#include +#include +#include "Framework/AnalysisDataModel.h" +#include "Framework/SliceCache.h" #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/ASoAHelpers.h" @@ -28,22 +31,23 @@ using namespace o2::soa; struct MixedEventsEmptyTables { SliceCache cache; + Preslice perCollision = aod::track::collisionId; // Dummy filter to enforce empty tables Filter trackFilter = (aod::track::x > -0.8f) && (aod::track::x < -0.8f); - using myTracks = soa::Filtered; + using MyTracks = soa::Filtered; std::vector xBins{VARIABLE_WIDTH, -0.064, -0.062, -0.060, 0.066, 0.068, 0.070, 0.072}; std::vector yBins{VARIABLE_WIDTH, -0.320, -0.301, -0.300, 0.330, 0.340, 0.350, 0.360}; using BinningType = ColumnBinningPolicy; BinningType binningOnPositions{{xBins, yBins}, true}; // true is for 'ignore overflows' (true by default) - SameKindPair pair{binningOnPositions, 5, -1, &cache}; // indicates that 5 events should be mixed and under/overflow (-1) to be ignored + SameKindPair pair{binningOnPositions, 5, -1, &cache}; // indicates that 5 events should be mixed and under/overflow (-1) to be ignored - void process(aod::Collisions const& collisions, myTracks const& tracks) + void process(aod::Collisions const& collisions, MyTracks const& tracks) { LOGF(info, "Input data Collisions %d, Tracks %d ", collisions.size(), tracks.size()); int count = 0; - for (auto& [c1, tracks1, c2, tracks2] : pair) { + for (const auto& [c1, tracks1, c2, tracks2] : pair) { LOGF(info, "Mixed event collisions: (%d, %d)", c1.globalIndex(), c2.globalIndex()); count++; if (count == 10) @@ -51,7 +55,7 @@ struct MixedEventsEmptyTables { // Example of using tracks from mixed events -- iterate over all track pairs from the two collisions int trackCount = 0; - for (auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) { + for (const auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) { LOGF(info, "Mixed event tracks pair: (%d, %d) from events (%d, %d), track event: (%d, %d)", t1.index(), t2.index(), c1.index(), c2.index(), t1.collision().index(), t2.collision().index()); trackCount++; if (trackCount == 10) @@ -63,6 +67,7 @@ struct MixedEventsEmptyTables { struct MixedEventsJoinedTracks { SliceCache cache; + Preslice perCollision = aod::track::collisionId; std::vector xBins{VARIABLE_WIDTH, -0.064, -0.062, -0.060, 0.066, 0.068, 0.070, 0.072}; std::vector yBins{VARIABLE_WIDTH, -0.320, -0.301, -0.300, 0.330, 0.340, 0.350, 0.360}; using BinningType = ColumnBinningPolicy; @@ -74,7 +79,7 @@ struct MixedEventsJoinedTracks { LOGF(info, "Input data Collisions %d, Tracks %d ", collisions.size(), tracks.size()); int count = 0; - for (auto& [c1, tracks1, c2, tracks2] : pair) { + for (const auto& [c1, tracks1, c2, tracks2] : pair) { LOGF(info, "Mixed event collisions: (%d, %d)", c1.globalIndex(), c2.globalIndex()); count++; if (count == 100) @@ -82,7 +87,7 @@ struct MixedEventsJoinedTracks { // Example of using tracks from mixed events -- iterate over all track pairs from the two collisions int trackCount = 0; - for (auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) { + for (const auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) { LOGF(info, "Mixed event tracks pair: (%d, %d) from events (%d, %d), track event: (%d, %d)", t1.index(), t2.index(), c1.index(), c2.index(), t1.collision().index(), t2.collision().index()); trackCount++; if (trackCount == 10) @@ -94,6 +99,7 @@ struct MixedEventsJoinedTracks { // It should not compile // struct MixedEventsBadSubscription { +// Preslice perCollision = aod::track::collisionId; // std::vector xBins{VARIABLE_WIDTH, -0.064, -0.062, -0.060, 0.066, 0.068, 0.070, 0.072}; // std::vector yBins{VARIABLE_WIDTH, -0.320, -0.301, -0.300, 0.330, 0.340, 0.350, 0.360}; // using BinningType = ColumnBinningPolicy; @@ -103,7 +109,7 @@ struct MixedEventsJoinedTracks { // void process(aod::Collisions const& collisions, aod::Tracks const& tracks) // { // int count = 0; -// for (auto& [c1, tracks1, c2, tracks2] : pair) { +// for (const auto& [c1, tracks1, c2, tracks2] : pair) { // LOGF(info, "Mixed event collisions: (%d, %d)", c1.globalIndex(), c2.globalIndex()); // count++; // if (count == 10) @@ -111,7 +117,7 @@ struct MixedEventsJoinedTracks { // // // Example of using tracks from mixed events -- iterate over all track pairs from the two collisions // int trackCount = 0; -// for (auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) { +// for (const auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) { // LOGF(info, "Mixed event tracks pair: (%d, %d) from events (%d, %d), track event: (%d, %d)", t1.index(), t2.index(), c1.index(), c2.index(), t1.collision().index(), t2.collision().index()); // trackCount++; // if (trackCount == 10) From dd14d214b6fd1af95b97b69320b0b048b13cd385 Mon Sep 17 00:00:00 2001 From: Marcello Di Costanzo <96481191+Marcellocosti@users.noreply.github.com> Date: Sat, 3 May 2025 10:51:42 +0200 Subject: [PATCH 1165/1650] [PWGHF] Add track sel. QA histogram and fix bug in applying track and event sels. (#11044) Co-authored-by: ALICE Action Bot --- PWGHF/Tasks/taskPidStudies.cxx | 153 ++++++++++++++++++++++----------- 1 file changed, 102 insertions(+), 51 deletions(-) diff --git a/PWGHF/Tasks/taskPidStudies.cxx b/PWGHF/Tasks/taskPidStudies.cxx index 55e3bef23ac..6f5056d9a9c 100644 --- a/PWGHF/Tasks/taskPidStudies.cxx +++ b/PWGHF/Tasks/taskPidStudies.cxx @@ -18,6 +18,7 @@ /// \author Luca Aglietta , Università and INFN Torino #include +#include #include "TPDGCode.h" @@ -42,14 +43,25 @@ using namespace o2::framework::expressions; using namespace o2::hf_evsel; using namespace o2::hf_centrality; -namespace o2::aod -{ -namespace pid_studies -{ enum Particle { NotMatched = 0, K0s, Lambda, Omega }; + +enum TrackCuts { All = 0, + HasIts, + HasTpc, + TpcNClsCrossedRows, + Eta, + Pt, + TpcChi2NCls, + ItsChi2NCls, + NCuts }; + +namespace o2::aod +{ +namespace pid_studies +{ // V0s DECLARE_SOA_COLUMN(MassK0, massK0, float); //! Candidate mass DECLARE_SOA_COLUMN(MassLambda, massLambda, float); //! Candidate mass @@ -91,12 +103,6 @@ DECLARE_SOA_COLUMN(OccupancyIts, occupancyIts, float); //! Occupancy from IT DECLARE_SOA_COLUMN(CentralityFT0C, centralityFT0C, float); //! Centrality from FT0C DECLARE_SOA_COLUMN(CentralityFT0M, centralityFT0M, float); //! Centrality from FT0M DECLARE_SOA_COLUMN(CandFlag, candFlag, int); //! Flag for MC matching - -const int minTpcNClsCrossedRows = 70; // Minimum number of crossed rows in TPC -const float maxEta = 0.8; // Maximum pseudorapidity -const float minPt = 0.1; // Minimum transverse momentum -const float maxTpcChi2NCl = 4; // Maximum TPC chi2 per number of TPC clusters -const float maxItsChi2NCl = 36; // Maximum ITS chi2 per number of ITS clusters } // namespace pid_studies DECLARE_SOA_TABLE(PidV0s, "AOD", "PIDV0S", //! Table with PID information @@ -155,6 +161,11 @@ struct HfTaskPidStudies { Configurable applyEvSels{"applyEvSels", true, "Apply event selections"}; Configurable applyTrackSels{"applyTrackSels", true, "Apply track selections"}; + Configurable tpcNClsCrossedRowsTrackMin{"tpcNClsCrossedRowsTrackMin", 70, "Minimum number of crossed rows in TPC"}; + Configurable etaTrackMax{"etaTrackMax", 0.8, "Maximum pseudorapidity"}; + Configurable ptTrackMin{"ptTrackMin", 0.1, "Minimum transverse momentum"}; + Configurable tpcChi2NClTrackMax{"tpcChi2NClTrackMax", 4, "Maximum TPC chi2 per number of TPC clusters"}; + Configurable itsChi2NClTrackMax{"itsChi2NClTrackMax", 36, "Maximum ITS chi2 per number of ITS clusters"}; Configurable massK0Min{"massK0Min", 0.4, "Minimum mass for K0"}; Configurable massK0Max{"massK0Max", 0.6, "Maximum mass for K0"}; Configurable massLambdaMin{"massLambdaMin", 1.0, "Minimum mass for lambda"}; @@ -195,6 +206,18 @@ struct HfTaskPidStudies { ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); hfEvSel.addHistograms(registry); + + std::shared_ptr hTrackSel = registry.add("hTrackSel", "Track selection;;Counts", {HistType::kTH1F, {{TrackCuts::NCuts, 0, TrackCuts::NCuts}}}); + + // Set Labels for hTrackSel + hTrackSel->GetXaxis()->SetBinLabel(TrackCuts::All + 1, "All"); + hTrackSel->GetXaxis()->SetBinLabel(TrackCuts::HasIts + 1, "HasITS"); + hTrackSel->GetXaxis()->SetBinLabel(TrackCuts::HasTpc + 1, "HasTPC"); + hTrackSel->GetXaxis()->SetBinLabel(TrackCuts::TpcNClsCrossedRows + 1, "TPC NCls/CrossedRows"); + hTrackSel->GetXaxis()->SetBinLabel(TrackCuts::Eta + 1, "#eta"); + hTrackSel->GetXaxis()->SetBinLabel(TrackCuts::Pt + 1, "#it{p}_{T}"); + hTrackSel->GetXaxis()->SetBinLabel(TrackCuts::TpcChi2NCls + 1, "TPC #chi^{2}/NCls"); + hTrackSel->GetXaxis()->SetBinLabel(TrackCuts::ItsChi2NCls + 1, "ITS #chi^{2}/NCls"); } template @@ -266,22 +289,22 @@ struct HfTaskPidStudies { { if constexpr (std::is_same::value) { if (!cand.has_v0MCCore()) { - return aod::pid_studies::Particle::NotMatched; + return Particle::NotMatched; } auto v0MC = cand.template v0MCCore_as(); if (v0MC.pdgCode() == kK0Short && v0MC.pdgCodeNegative() == -kPiPlus && v0MC.pdgCodePositive() == kPiPlus) { - return aod::pid_studies::Particle::K0s; + return Particle::K0s; } if (v0MC.pdgCode() == kLambda0 && v0MC.pdgCodeNegative() == -kPiPlus && v0MC.pdgCodePositive() == kProton) { - return aod::pid_studies::Particle::Lambda; + return Particle::Lambda; } if (v0MC.pdgCode() == -kLambda0 && v0MC.pdgCodeNegative() == -kProton && v0MC.pdgCodePositive() == kPiPlus) { - return -aod::pid_studies::Particle::Lambda; + return -Particle::Lambda; } } if constexpr (std::is_same::value) { if (!cand.has_cascMCCore()) { - return aod::pid_studies::Particle::NotMatched; + return Particle::NotMatched; } auto cascMC = cand.template cascMCCore_as(); if (cascMC.pdgCode() == kOmegaMinus && @@ -289,17 +312,17 @@ struct HfTaskPidStudies { cascMC.pdgCodeV0() == kLambda0 && cascMC.pdgCodePositive() == kProton && cascMC.pdgCodeNegative() == -kPiPlus) { - return aod::pid_studies::Particle::Omega; + return Particle::Omega; } if (cascMC.pdgCode() == -kOmegaMinus && cascMC.pdgCodeBachelor() == kKPlus && cascMC.pdgCodeV0() == -kLambda0 && cascMC.pdgCodePositive() == kPiPlus && cascMC.pdgCodeNegative() == -kProton) { - return -aod::pid_studies::Particle::Omega; + return -Particle::Omega; } } - return aod::pid_studies::Particle::NotMatched; + return Particle::NotMatched; } template @@ -317,38 +340,66 @@ struct HfTaskPidStudies { { const auto& posTrack = candidate.template posTrack_as(); const auto& negTrack = candidate.template negTrack_as(); - if (posTrack.tpcNClsCrossedRows() < o2::aod::pid_studies::minTpcNClsCrossedRows || negTrack.tpcNClsCrossedRows() < o2::aod::pid_studies::minTpcNClsCrossedRows) { - return false; - } - if (std::abs(posTrack.eta()) > o2::aod::pid_studies::maxEta || std::abs(negTrack.eta()) > o2::aod::pid_studies::maxEta) { - return false; - } - if (posTrack.pt() < o2::aod::pid_studies::minPt || negTrack.pt() < o2::aod::pid_studies::minPt) { - return false; - } - if (posTrack.tpcChi2NCl() > o2::aod::pid_studies::maxTpcChi2NCl || negTrack.tpcChi2NCl() > o2::aod::pid_studies::maxTpcChi2NCl) { - return false; - } - if (posTrack.itsChi2NCl() > o2::aod::pid_studies::maxItsChi2NCl || negTrack.itsChi2NCl() > o2::aod::pid_studies::maxItsChi2NCl) { - return false; - } - if constexpr (!isV0) { + registry.fill(HIST("hTrackSel"), TrackCuts::All); + if constexpr (isV0) { + if (!posTrack.hasITS() || !negTrack.hasITS()) { + return false; + } + registry.fill(HIST("hTrackSel"), TrackCuts::HasIts); + if (!posTrack.hasTPC() || !negTrack.hasTPC()) { + return false; + } + registry.fill(HIST("hTrackSel"), TrackCuts::HasTpc); + if (posTrack.tpcNClsCrossedRows() < tpcNClsCrossedRowsTrackMin || negTrack.tpcNClsCrossedRows() < tpcNClsCrossedRowsTrackMin) { + return false; + } + registry.fill(HIST("hTrackSel"), TrackCuts::TpcNClsCrossedRows); + if (std::abs(posTrack.eta()) > etaTrackMax || std::abs(negTrack.eta()) > etaTrackMax) { + return false; + } + registry.fill(HIST("hTrackSel"), TrackCuts::Eta); + if (posTrack.pt() < ptTrackMin || negTrack.pt() < ptTrackMin) { + return false; + } + registry.fill(HIST("hTrackSel"), TrackCuts::Pt); + if (posTrack.tpcChi2NCl() > tpcChi2NClTrackMax || negTrack.tpcChi2NCl() > tpcChi2NClTrackMax) { + return false; + } + registry.fill(HIST("hTrackSel"), TrackCuts::TpcChi2NCls); + if (posTrack.itsChi2NCl() > itsChi2NClTrackMax || negTrack.itsChi2NCl() > itsChi2NClTrackMax) { + return false; + } + registry.fill(HIST("hTrackSel"), TrackCuts::ItsChi2NCls); + } else { const auto& bachTrack = candidate.template bachelor_as(); - if (bachTrack.tpcNClsCrossedRows() < o2::aod::pid_studies::minTpcNClsCrossedRows) { + if (!posTrack.hasITS() || !negTrack.hasITS() || !bachTrack.hasITS()) { + return false; + } + registry.fill(HIST("hTrackSel"), TrackCuts::HasIts); + if (!posTrack.hasTPC() || !negTrack.hasTPC() || !bachTrack.hasTPC()) { + return false; + } + registry.fill(HIST("hTrackSel"), TrackCuts::HasTpc); + if (posTrack.tpcNClsCrossedRows() < tpcNClsCrossedRowsTrackMin || negTrack.tpcNClsCrossedRows() < tpcNClsCrossedRowsTrackMin || bachTrack.tpcNClsCrossedRows() < tpcNClsCrossedRowsTrackMin) { return false; } - if (std::abs(bachTrack.eta()) > o2::aod::pid_studies::maxEta) { + registry.fill(HIST("hTrackSel"), TrackCuts::TpcNClsCrossedRows); + if (std::abs(posTrack.eta()) > etaTrackMax || std::abs(negTrack.eta()) > etaTrackMax || std::abs(bachTrack.eta()) > etaTrackMax) { return false; } - if (bachTrack.pt() < o2::aod::pid_studies::minPt) { + registry.fill(HIST("hTrackSel"), TrackCuts::Eta); + if (posTrack.pt() < ptTrackMin || negTrack.pt() < ptTrackMin || bachTrack.pt() < ptTrackMin) { return false; } - if (bachTrack.tpcChi2NCl() > o2::aod::pid_studies::maxTpcChi2NCl) { + registry.fill(HIST("hTrackSel"), TrackCuts::Pt); + if (posTrack.tpcChi2NCl() > tpcChi2NClTrackMax || negTrack.tpcChi2NCl() > tpcChi2NClTrackMax || bachTrack.tpcChi2NCl() > tpcChi2NClTrackMax) { return false; } - if (bachTrack.itsChi2NCl() > o2::aod::pid_studies::maxItsChi2NCl) { + registry.fill(HIST("hTrackSel"), TrackCuts::TpcChi2NCls); + if (posTrack.itsChi2NCl() > itsChi2NClTrackMax || negTrack.itsChi2NCl() > itsChi2NClTrackMax || bachTrack.itsChi2NCl() > itsChi2NClTrackMax) { return false; } + registry.fill(HIST("hTrackSel"), TrackCuts::ItsChi2NCls); } return true; } @@ -439,14 +490,14 @@ struct HfTaskPidStudies { { for (const auto& v0 : V0s) { if (applyEvSels && !isCollSelected(v0.collision_as())) { - return; + continue; } if (applyTrackSels && !isTrackSelected(v0)) { - return; + continue; } if (isSelectedV0AsK0s(v0) || isSelectedV0AsLambda(v0)) { int matched = isMatched(v0); - if (matched != aod::pid_studies::Particle::NotMatched) { + if (matched != Particle::NotMatched) { fillTree(v0, matched); } } @@ -461,13 +512,13 @@ struct HfTaskPidStudies { { for (const auto& v0 : V0s) { if (applyEvSels && !isCollSelected(v0.collision_as())) { - return; + continue; } if (applyTrackSels && !isTrackSelected(v0)) { - return; + continue; } if (isSelectedV0AsK0s(v0) || isSelectedV0AsLambda(v0)) { - fillTree(v0, aod::pid_studies::Particle::NotMatched); + fillTree(v0, Particle::NotMatched); } } } @@ -482,14 +533,14 @@ struct HfTaskPidStudies { { for (const auto& casc : cascades) { if (applyEvSels && !isCollSelected(casc.collision_as())) { - return; + continue; } if (applyTrackSels && !isTrackSelected(casc)) { - return; + continue; } if (isSelectedCascAsOmega(casc)) { int matched = isMatched(casc); - if (matched != aod::pid_studies::Particle::NotMatched) { + if (matched != Particle::NotMatched) { fillTree(casc, matched); } } @@ -504,13 +555,13 @@ struct HfTaskPidStudies { { for (const auto& casc : cascades) { if (applyEvSels && !isCollSelected(casc.collision_as())) { - return; + continue; } if (applyTrackSels && !isTrackSelected(casc)) { - return; + continue; } if (isSelectedCascAsOmega(casc)) { - fillTree(casc, aod::pid_studies::Particle::NotMatched); + fillTree(casc, Particle::NotMatched); } } } From c810ed7bf2f8b29668e24c118682ce1507d4fcd4 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Sat, 3 May 2025 11:00:19 +0200 Subject: [PATCH 1166/1650] [PWGLF] Add new thnsparse to fill frame dependent variable (#11069) --- .../Tasks/Strangeness/taskLambdaSpinCorr.cxx | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx index 73a9771b0a6..737c3a253e1 100644 --- a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx +++ b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx @@ -106,10 +106,19 @@ struct LfTaskLambdaSpinCorr { histos.add("hSparseLambdaLambda", "hSparseLambdaLambda", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); histos.add("hSparseLambdaAntiLambda", "hSparseLambdaAntiLambda", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); histos.add("hSparseAntiLambdaAntiLambda", "hSparseAntiLambdaAntiLambda", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + + ///////// along quantization axes/////////// + histos.add("hSparseLambdaLambdaQA", "hSparseLambdaLambdaQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + histos.add("hSparseLambdaAntiLambdaQA", "hSparseLambdaAntiLambdaQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + histos.add("hSparseAntiLambdaAntiLambdaQA", "hSparseAntiLambdaAntiLambdaQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); if (fillGEN) { histos.add("hSparseLambdaLambdaMC", "hSparseLambdaLambdaMC", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); histos.add("hSparseLambdaAntiLambdaMC", "hSparseLambdaAntiLambdaMC", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); histos.add("hSparseAntiLambdaAntiLambdaMC", "hSparseAntiLambdaAntiLambdaMC", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + + histos.add("hSparseLambdaLambdaMCQA", "hSparseLambdaLambdaMCQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + histos.add("hSparseLambdaAntiLambdaMCQA", "hSparseLambdaAntiLambdaMCQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + histos.add("hSparseAntiLambdaAntiLambdaMCQA", "hSparseAntiLambdaAntiLambdaMCQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); } } @@ -262,6 +271,58 @@ struct LfTaskLambdaSpinCorr { } } + void fillHistograms2(bool tag1, bool tag2, bool tag3, bool tag4, const ROOT::Math::PxPyPzMVector& particlepair, + const ROOT::Math::PxPyPzMVector& particle1, const ROOT::Math::PxPyPzMVector& particle2, + const ROOT::Math::PxPyPzMVector& daughpart1, const ROOT::Math::PxPyPzMVector& daughpart2, + double centrality, bool datatype) + { + + ROOT::Math::Boost boostPairToCM{particlepair.BoostToCM()}; // boosting vector for pair CM + // Boosting both Lambdas to Lambda-Lambda pair rest frame + auto lambda1CM = boostPairToCM(particle1); + auto lambda2CM = boostPairToCM(particle2); + + // Step 2: Boost Each Lambda to its Own Rest Frame + ROOT::Math::Boost boostLambda1ToCM{lambda1CM.BoostToCM()}; + ROOT::Math::Boost boostLambda2ToCM{lambda2CM.BoostToCM()}; + + ROOT::Math::XYZVector quantizationAxis = lambda1CM.Vect().Unit(); // Unit vector along Lambda1's direction in pair rest frame + + // Also boost the daughter protons to the same frame + auto proton1pairCM = boostPairToCM(daughpart1); // proton1 to pair CM + auto proton2pairCM = boostPairToCM(daughpart2); // proton2 to pair CM + + // Boost protons into their respective Lambda rest frames + auto proton1LambdaRF = boostLambda1ToCM(proton1pairCM); + auto proton2LambdaRF = boostLambda2ToCM(proton2pairCM); + + double cosTheta1 = proton1LambdaRF.Vect().Unit().Dot(quantizationAxis); + double cosTheta2 = proton2LambdaRF.Vect().Unit().Dot(quantizationAxis); + + double cosThetaDiff = cosTheta1 * cosTheta2; + + auto lowptcut = 0.5; + auto highptcut = 10.0; + + if (datatype == 1) { + if (tag1 && tag3) + histos.fill(HIST("hSparseLambdaLambdaMCQA"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); + if (tag1 && tag4) + histos.fill(HIST("hSparseLambdaAntiLambdaMCQA"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); + if (tag2 && tag4) + histos.fill(HIST("hSparseAntiLambdaAntiLambdaMCQA"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); + } else { + if (particle1.Pt() > lowptcut && particle1.Pt() < highptcut && particle2.Pt() > lowptcut && particle2.Pt() < highptcut) { + if (tag1 && tag3) + histos.fill(HIST("hSparseLambdaLambdaQA"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); + if (tag1 && tag4) + histos.fill(HIST("hSparseLambdaAntiLambdaQA"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); + if (tag2 && tag4) + histos.fill(HIST("hSparseAntiLambdaAntiLambdaQA"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); + } + } + } + std::tuple getLambdaTags(const auto& v0, const auto& collision) { auto postrack = v0.template posTrack_as(); @@ -444,6 +505,7 @@ struct LfTaskLambdaSpinCorr { tagb = 0; tagb2 = 0; fillHistograms(taga, tagb, taga2, tagb2, lambdaLambdapair, lambdadummy, lambdadummy2, proton, proton2, centrality, 0); + fillHistograms2(taga, tagb, taga2, tagb2, lambdaLambdapair, lambdadummy, lambdadummy2, proton, proton2, centrality, 0); } tagb2 = aLambdaTag2; @@ -453,6 +515,7 @@ struct LfTaskLambdaSpinCorr { tagb = 0; taga2 = 0; fillHistograms(taga, tagb, taga2, tagb2, lambdaAntiLambdapair, lambdadummy, antiLambdadummy2, proton, antiProton2, centrality, 0); + fillHistograms2(taga, tagb, taga2, tagb2, lambdaAntiLambdapair, lambdadummy, antiLambdadummy2, proton, antiProton2, centrality, 0); } tagb = aLambdaTag; @@ -463,6 +526,7 @@ struct LfTaskLambdaSpinCorr { taga = 0; taga2 = 0; fillHistograms(taga, tagb, taga2, tagb2, antiLambdaAntiLambdapair, antiLambdadummy, antiLambdadummy2, antiProton, antiProton2, centrality, 0); + fillHistograms2(taga, tagb, taga2, tagb2, antiLambdaAntiLambdapair, antiLambdadummy, antiLambdadummy2, antiProton, antiProton2, centrality, 0); } } } @@ -565,6 +629,7 @@ struct LfTaskLambdaSpinCorr { tagb = 0; tagb2 = 0; fillHistograms(taga, tagb, taga2, tagb2, lambdaLambdapair, lambdadummy, lambdadummy2, proton, proton2, centrality, 0); + fillHistograms2(taga, tagb, taga2, tagb2, lambdaLambdapair, lambdadummy, lambdadummy2, proton, proton2, centrality, 0); } tagb2 = aLambdaTag2; @@ -574,6 +639,7 @@ struct LfTaskLambdaSpinCorr { tagb = 0; taga2 = 0; fillHistograms(taga, tagb, taga2, tagb2, lambdaAntiLambdapair, lambdadummy, antiLambdadummy2, proton, antiProton2, centrality, 0); + fillHistograms2(taga, tagb, taga2, tagb2, lambdaAntiLambdapair, lambdadummy, antiLambdadummy2, proton, antiProton2, centrality, 0); } tagb = aLambdaTag; @@ -584,6 +650,7 @@ struct LfTaskLambdaSpinCorr { taga = 0; taga2 = 0; fillHistograms(taga, tagb, taga2, tagb2, antiLambdaAntiLambdapair, antiLambdadummy, antiLambdadummy2, antiProton, antiProton2, centrality, 0); + fillHistograms2(taga, tagb, taga2, tagb2, antiLambdaAntiLambdapair, antiLambdadummy, antiLambdadummy2, antiProton, antiProton2, centrality, 0); } } } @@ -690,16 +757,19 @@ struct LfTaskLambdaSpinCorr { if (tagamc && taga2mc) { lambdaLambdapairmc = lambdadummymc + lambdadummy2mc; fillHistograms(tagamc, tagbmc, taga2mc, tagb2mc, lambdaLambdapairmc, lambdadummymc, lambdadummy2mc, protonmc, proton2mc, centrality, 1); + fillHistograms2(tagamc, tagbmc, taga2mc, tagb2mc, lambdaLambdapairmc, lambdadummymc, lambdadummy2mc, protonmc, proton2mc, centrality, 1); } if (tagamc && tagb2mc) { lambdaAntiLambdapairmc = lambdadummymc + antiLambdadummy2mc; fillHistograms(tagamc, tagbmc, taga2mc, tagb2mc, lambdaAntiLambdapairmc, lambdadummymc, antiLambdadummy2mc, protonmc, antiProton2mc, centrality, 1); + fillHistograms2(tagamc, tagbmc, taga2mc, tagb2mc, lambdaAntiLambdapairmc, lambdadummymc, antiLambdadummy2mc, protonmc, antiProton2mc, centrality, 1); } if (tagbmc && tagb2mc) { antiLambdaAntiLambdapairmc = antiLambdadummymc + antiLambdadummy2mc; fillHistograms(tagamc, tagbmc, taga2mc, tagb2mc, antiLambdaAntiLambdapairmc, antiLambdadummymc, antiLambdadummy2mc, antiProtonmc, antiProton2mc, centrality, 1); + fillHistograms2(tagamc, tagbmc, taga2mc, tagb2mc, antiLambdaAntiLambdapairmc, antiLambdadummymc, antiLambdadummy2mc, antiProtonmc, antiProton2mc, centrality, 1); } } } From 4e802c10df54ffea8919e925667b038620dd7340 Mon Sep 17 00:00:00 2001 From: omvazque Date: Sat, 3 May 2025 07:37:49 -0500 Subject: [PATCH 1167/1650] [PWGLF] Applied track selection to MC closure (#11063) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 43 ++++++++++++++++---- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index 8fa4b2be38a..f93284b0a16 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -156,7 +156,8 @@ struct UccZdc { Service ccdb; Configurable paTH{"paTH", "Users/o/omvazque/TrackingEfficiency", "base path to the ccdb object"}; Configurable uRl{"uRl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; - Configurable noLaterThan{"noLaterThan", 1740173636328, "latest acceptable timestamp of creation for the object"}; + // Configurable noLaterThan{"noLaterThan", 1740173636328, "latest acceptable timestamp of creation for the object"}; + Configurable noLaterThan{"noLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; // the efficiency has been previously stored in the CCDB as TH1F histogram TH1F* efficiency = nullptr; @@ -199,11 +200,11 @@ struct UccZdc { if (doprocessZdcCollAss) { registry.add("T0Ccent", ";;Entries", kTH1F, {axisCent}); registry.add("ZposVsEta", "", kTProfile, {axisZpos}); + registry.add("ZN", ";ZNA+ZNC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); registry.add("EtaVsPhi", ";#eta;#varphi", kTH2F, {{{axisEta}, {100, -0.1 * PI, +2.1 * PI}}}); registry.add("sigma1Pt", ";;#sigma(p_{T})/p_{T};", kTProfile, {axisPt}); registry.add("dcaXYvspT", ";DCA_{xy} (cm);;", kTH2F, {{{50, -1., 1.}, {axisPt}}}); - registry.add("NchRaw", ";#it{N}_{ch} (|#eta| < 0.8);", kTH1F, {{nBinsNch, minNch, maxNch}}); registry.add("Nch", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);", kTH1F, {{nBinsNch, minNch, maxNch}}); registry.add("NchVsPt", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);;", kTH2F, {{{nBinsNch, minNch, maxNch}, {axisPt}}}); registry.add("NchVsOneParCorr", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);#LT[#it{p}_{T}^{(1)}]#GT (GeV/#it{c})", kTProfile, {{nBinsNch, minNch, maxNch}}); @@ -315,10 +316,10 @@ struct UccZdc { // This avoids that users can replace objects **while** a train is running ccdb->setCreatedNotAfter(noLaterThan.value); LOGF(info, "Getting object %s", paTH.value.data()); - efficiency = ccdb->getForTimeStamp(paTH.value, noLaterThan); - if (!efficiency) { - LOGF(fatal, "Efficiency object not found!"); - } + // efficiency = ccdb->getForTimeStamp(paTH.value, noLaterThan); + // if (!efficiency) { + // LOGF(fatal, "Efficiency object not found!"); + // } } template @@ -562,6 +563,14 @@ struct UccZdc { } const auto& foundBC = collision.foundBC_as(); + // LOGF(info, "Getting object %s for run number %i from timestamp=%llu", paTH.value.data(), foundBC.runNumber(), foundBC.timestamp()); + + // auto efficiency = ccdb->getForTimeStamp(paTH.value, foundBC.timestamp()); + auto efficiency = ccdb->getForRun(paTH.value, foundBC.runNumber()); + if (!efficiency) { + LOGF(fatal, "Efficiency object not found!"); + } + // has ZDC? if (!foundBC.has_zdc()) { return; @@ -669,7 +678,7 @@ struct UccZdc { } registry.fill(HIST("Nch"), w1); - registry.fill(HIST("NchRaw"), nch); + registry.fill(HIST("ZN"), sumZNs); registry.fill(HIST("NchVsOneParCorr"), w1, oneParCorr, w1); registry.fill(HIST("NchVsOneParCorrVsZN"), w1, sumZNs, oneParCorr, w1); registry.fill(HIST("NchVsTwoParCorrVsZN"), w1, sumZNs, twoParCorr, denTwoParCorr); @@ -681,8 +690,9 @@ struct UccZdc { // Preslice perMCCollision = aod::mcparticle::mcCollisionId; Preslice perCollision = aod::track::collisionId; TRandom* randPointer = new TRandom(); - void processMCclosure(aod::McCollisions::iterator const& mccollision, soa::SmallGroups const& collisions, aod::McParticles const& mcParticles, TheFilteredSimTracks const& simTracks) + void processMCclosure(aod::McCollisions::iterator const& mccollision, soa::SmallGroups const& collisions, o2::aod::BCsRun3 const& /*bcs*/, aod::McParticles const& mcParticles, TheFilteredSimTracks const& simTracks) { + float rndNum = randPointer->Uniform(0.0, 1.0); registry.fill(HIST("RandomNumber"), rndNum); @@ -691,6 +701,15 @@ struct UccZdc { registry.fill(HIST("EvtsDivided"), 0); //----- MC reconstructed -----// for (const auto& collision : collisions) { + + // To use run-by-run efficiency + const auto& foundBC = collision.foundBC_as(); + // auto efficiency = ccdb->getForTimeStamp(paTH.value, foundBC.timestamp()); + auto efficiency = ccdb->getForRun(paTH.value, foundBC.runNumber()); + if (!efficiency) { + LOGF(fatal, "Efficiency object not found!"); + } + // Event selection if (!isEventSelected(collision)) { continue; @@ -804,7 +823,7 @@ struct UccZdc { registry.fill(HIST("NchvsThreeParCorrGen"), nchMC, threeParCorrMC, denThreeParCorrMC); registry.fill(HIST("NchvsFourParCorrGen"), nchMC, fourParCorrMC, denFourParCorrMC); } - } else { + } else { // Correction with the remaining half of the sample registry.fill(HIST("EvtsDivided"), 1); //----- MC reconstructed -----// for (const auto& collision : collisions) { @@ -825,6 +844,12 @@ struct UccZdc { const auto& groupedTracks{simTracks.sliceBy(perCollision, collision.globalIndex())}; for (const auto& track : groupedTracks) { + // Track Selection + if (!track.isGlobalTrack()) { + continue; + } + + // Has MC particle? if (!track.has_mcParticle()) { continue; } From 751afd292097decb47e72de1cb5ba9689e54e8db Mon Sep 17 00:00:00 2001 From: Jaideep Tanwar <141036812+jtanwar2212@users.noreply.github.com> Date: Sat, 3 May 2025 20:33:20 +0530 Subject: [PATCH 1168/1650] [PWGLF] Update the nuclei task (#11073) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Nuspex/NucleitpcPbPb.cxx | 450 +++++++++++---------------- 1 file changed, 190 insertions(+), 260 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/NucleitpcPbPb.cxx b/PWGLF/Tasks/Nuspex/NucleitpcPbPb.cxx index b3e72ed23a5..100072becbb 100644 --- a/PWGLF/Tasks/Nuspex/NucleitpcPbPb.cxx +++ b/PWGLF/Tasks/Nuspex/NucleitpcPbPb.cxx @@ -8,99 +8,86 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \author jaideep tanwar +/// \file NucleitpcPbPb.cxx +/// \brief Analysis task for light nuclei spectra in Pb–Pb collisions using TPC +/// \author Jaideep Tanwar, +/// \since Jan 2025 /// #include -#include #include -#include -#include -#include -#include -#include +#include +#include +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "Framework/ASoAHelpers.h" -#include "ReconstructionDataFormats/Track.h" #include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" +#include "Common/Core/PID/TPCPIDResponse.h" #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Centrality.h" -#include "DetectorsBase/Propagator.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/CollisionAssociationTables.h" +#include "ReconstructionDataFormats/Track.h" +#include "DataFormatsTPC/BetheBlochAleph.h" #include "DataFormatsParameters/GRPObject.h" #include "DataFormatsParameters/GRPMagField.h" +#include "DetectorsBase/GeometryManager.h" +#include "DetectorsBase/Propagator.h" #include "CCDB/BasicCCDBManager.h" -#include "CommonConstants/PhysicsConstants.h" -#include "Common/Core/PID/TPCPIDResponse.h" -#include "DataFormatsTPC/BetheBlochAleph.h" -#include "Common/DataModel/PIDResponse.h" -#include "TRandom3.h" -#include "Common/DataModel/CollisionAssociationTables.h" - +#include "DCAFitter/DCAFitterN.h" using namespace o2; -using namespace o2::track; using namespace o2::framework; using namespace o2::framework::expressions; - using CollisionsFull = soa::Join; -/* -using CollisionsFullMC = soa::Join; -*/ -using TracksFull = soa::Join; +using TracksFull = soa::Join; +//--------------------------------------------------------------------------------------------------------------------------------- namespace { -static const int number_of_particles = 6; -static const std::vector particleNames{"pion", "proton", "deuteron", "triton", "helium3", "alpha"}; -static const std::vector antiparticleNames{"anti-pion", "anti-proton", "anti-deuteron", "anti-triton", "anti-helium3", "anti-alpha"}; +static const int nParticles = 6; +static const std::vector particleNames{"pion", "proton", "deuteron", "triton", "helion", "alpha"}; static const std::vector particlePdgCodes{211, 2212, o2::constants::physics::kDeuteron, o2::constants::physics::kTriton, o2::constants::physics::kHelium3, o2::constants::physics::kAlpha}; static const std::vector particleMasses{o2::constants::physics::MassPionCharged, o2::constants::physics::MassProton, o2::constants::physics::MassDeuteron, o2::constants::physics::MassTriton, o2::constants::physics::MassHelium3, o2::constants::physics::MassAlpha}; static const std::vector particleCharge{1, 1, 1, 1, 2, 2}; -const int no_BBparam = 6; +const int nBetheParams = 6; static const std::vector betheBlochParNames{"p0", "p1", "p2", "p3", "p4", "resolution"}; -// default bethbloch parameters -constexpr double betheBlochDefault[number_of_particles][no_BBparam]{ +constexpr double betheBlochDefault[nParticles][nBetheParams]{ {13.611469, 3.598765, -0.021138, 2.039562, 0.651040, 0.09}, // pion {5.393020, 7.859534, 0.004048, 2.323197, 1.609307, 0.09}, // proton {5.393020, 7.859534, 0.004048, 2.323197, 1.609307, 0.09}, // deuteron {5.393020, 7.859534, 0.004048, 2.323197, 1.609307, 0.09}, // triton - {-126.557359, -0.858569, 1.111643, 1.210323, 2.656374, 0.09}, // helium3 + {-126.557359, -0.858569, 1.111643, 1.210323, 2.656374, 0.09}, // helion {-126.557359, -0.858569, 1.111643, 1.210323, 2.656374, 0.09}}; // alpha -const int no_trackcuts = 15; -static const std::vector trackPIDsettingsNames{"useBBparams", "minITSnCls", "minTPCnCls", "maxTPCchi2", "maxITSchi2", "minRigidity", "maxRigidity", "maxTPCnSigma", "TOFrequiredabove", "minTOFmass", "maxTOFmass", "minDcaToPvXY", "minDcaToPvZ", "minITSclsSize", "maxITSclsSize"}; -constexpr double trackPIDsettings[number_of_particles][no_trackcuts]{ - {0, 0, 60, 3.0, 100, 0.15, 1.2, 3.0, 1, 0, 100, 0., 0., 0., 1000}, - {1, 0, 60, 3.0, 100, 0.20, 4.0, 3.0, 1, 0, 100, 0., 0., 0., 1000}, - {1, 0, 60, 3.0, 100, 0.50, 5.0, 3.0, 1, 0, 100, 0., 0., 0., 1000}, - {1, 0, 60, 3.0, 100, 0.50, 5.0, 3.0, 1, 0, 100, 0., 0., 0., 1000}, - {1, 0, 60, 3.0, 100, 0.50, 5.0, 3.0, 1, 0, 100, 0., 0., 0., 1000}, - {1, 0, 60, 3.0, 100, 0.50, 5.0, 3.0, 1, 0, 100, 0., 0., 0., 1000}}; -struct Particle { +const int nTrkSettings = 15; +static const std::vector trackPIDsettingsNames{"useBBparams", "minITSnCls", "minTPCnCls", "maxTPCchi2", "maxITSchi2", "minRigidity", "maxRigidity", "maxTPCnSigma", "TOFrequiredabove", "minTOFmass", "maxTOFmass", "maxDcaXY", "maxDcaZ", "minITSclsSize", "maxITSclsSize"}; +constexpr double trackPIDsettings[nParticles][nTrkSettings]{ + {0, 0, 60, 3.0, 100, 0.15, 1.2, 2.5, -1, 0, 100, 2., 2., 0., 1000}, + {1, 0, 70, 2.5, 100, 0.20, 4.0, 3.0, -1, 0, 100, 2., 2., 0., 1000}, + {1, 0, 70, 5.0, 100, 0.50, 5.0, 3.0, -1, 0, 100, 2., 2., 0., 1000}, + {1, 0, 70, 5.0, 100, 0.50, 5.0, 3.0, -1, 0, 100, 2., 2., 0., 1000}, + {1, 0, 75, 1.5, 100, 0.50, 5.0, 3.0, -1, 0, 100, 2., 2., 0., 1000}, + {1, 0, 70, 1.5, 100, 0.50, 5.0, 3.0, -1, 0, 100, 2., 2., 0., 1000}}; +struct PrimParticles { TString name; int pdgCode, charge; double mass, resolution; std::vector betheParams; bool active; - Particle(std::string name_, int pdgCode_, double mass_, int charge_, LabeledArray bethe) : name(name_), pdgCode(pdgCode_), charge(charge_), mass(mass_), active(false) + PrimParticles(std::string name_, int pdgCode_, double mass_, int charge_, LabeledArray bethe) : name(name_), pdgCode(pdgCode_), charge(charge_), mass(mass_), active(false) { resolution = bethe.get(name, "resolution"); betheParams.clear(); - for (unsigned int i = 0; i < 5; i++) + constexpr unsigned int kNSpecies = 5; + for (unsigned int i = 0; i < kNSpecies; i++) betheParams.push_back(bethe.get(name, i)); } -}; // struct Particle +}; // struct PrimParticles //---------------------------------------------------------------------------------------------------------------- std::vector> hDeDx; -std::vector> hDeDxanti; -std::vector> hnsigma_pt; -std::vector> hnsigma_ptanti; -std::vector> hdcaXY_pt; -std::vector> hdcaXY_ptanti; -std::vector> hrapidity; -std::vector> hmass_pt; -std::vector> hmass_ptanti; -std::vector> hdelta_mass; +std::vector> hNsigmaPt; +std::vector> hmass; } // namespace //---------------------------------------------------------------------------------------------------------------- struct NucleitpcPbPb { @@ -108,12 +95,20 @@ struct NucleitpcPbPb { HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; Configurable cfgDebug{"cfgDebug", 1, "debug level"}; Configurable cfgRigidityCorrection{"cfgRigidityCorrection", false, "apply rigidity correction"}; - Configurable cfgCutEta{"cfgCutEta", 0.8f, "Eta range for tracks"}; - Configurable centcut{"centcut", 80.0f, "centrality cut"}; + Configurable cfgCutEta{"cfgCutEta", 0.9f, "Eta range for tracks"}; Configurable cfgUsePVcontributors{"cfgUsePVcontributors", true, "use tracks that are PV contibutors"}; - Configurable> cfgBetheBlochParams{"cfgBetheBlochParams", {betheBlochDefault[0], number_of_particles, no_BBparam, particleNames, betheBlochParNames}, "TPC Bethe-Bloch parameterisation for light nuclei"}; - Configurable> cfgTrackPIDsettings{"cfgTrackPIDsettings", {trackPIDsettings[0], number_of_particles, no_trackcuts, particleNames, trackPIDsettingsNames}, "track selection and PID criteria"}; - Configurable maxDcaXYFactor{"maxDcaXYFactor", 2.0f, "DCA xy factor"}; + Configurable> cfgBetheBlochParams{"cfgBetheBlochParams", {betheBlochDefault[0], nParticles, nBetheParams, particleNames, betheBlochParNames}, "TPC Bethe-Bloch parameterisation for light nuclei"}; + Configurable> cfgTrackPIDsettings{"cfgTrackPIDsettings", {trackPIDsettings[0], nParticles, nTrkSettings, particleNames, trackPIDsettingsNames}, "track selection and PID criteria"}; + Configurable cfgFillDeDxWithoutCut{"cfgFillDeDxWithoutCut", false, "Fill without cut beth bloch"}; + Configurable cfgFillDeDxWithCut{"cfgFillDeDxWithCut", false, "Fill with cut beth bloch"}; + Configurable cfgFillnsigma{"cfgFillnsigma", false, "Fill n-sigma histograms"}; + Configurable cfgFillmass{"cfgFillmass", true, "Fill mass histograms"}; + Configurable centcut{"centcut", 80.0f, "centrality cut"}; + Configurable cfgCutRapidity{"cfgCutRapidity", 0.5f, "Rapidity range"}; + Configurable cfgZvertex{"cfgZvertex", 10, "Min Z Vertex"}; + Configurable cfgtpcNClsFound{"cfgtpcNClsFound", 100.0f, "min. no. of tpcNClsFound"}; + Configurable cfgitsNCls{"cfgitsNCls", 2.0f, "min. no. of itsNCls"}; + // CCDB Service ccdb; Configurable bField{"bField", -999, "bz field, -999 is automatic"}; @@ -123,15 +118,12 @@ struct NucleitpcPbPb { Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; Configurable pidPath{"pidPath", "", "Path to the PID response object"}; - //-------------------------------------------------------------------------------------------------------------------- - std::vector primaryParticles; + std::vector primaryParticles; std::vector primVtx, cents; bool collHasCandidate, collPassedEvSel; int mRunNumber, occupancy; - float dBz; + float dBz, momn; TRandom3 rand; - double momn; - //---------------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------- void init(InitContext const&) { @@ -142,93 +134,82 @@ struct NucleitpcPbPb { ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); ccdb->setFatalWhenNull(false); - for (int i = 0; i < number_of_particles; i++) { // create primaryparticles - primaryParticles.push_back(Particle(particleNames.at(i), particlePdgCodes.at(i), particleMasses.at(i), particleCharge.at(i), cfgBetheBlochParams)); + for (int i = 0; i < nParticles; i++) { // create primaryParticles + primaryParticles.push_back(PrimParticles(particleNames.at(i), particlePdgCodes.at(i), particleMasses.at(i), particleCharge.at(i), cfgBetheBlochParams)); } - std::vector ptBinning = {0.1, 0.5, 1.0, 1.5, 2.0, 2.4, 3.2, 4., 5., 6., 8., 10., 12., 14.}; - std::vector etaBinning = {-1.0, -0.9, -0.8, -0.7, -0.6, -0.5, -0.4, -0.3, -0.2, -0.1, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0}; // define histogram axes const AxisSpec axisMagField{10, -10., 10., "magnetic field"}; - const AxisSpec axisNev{3, 0., 5., "Number of events"}; + const AxisSpec axisNev{3, 0., 3., "Number of events"}; const AxisSpec axisRigidity{4000, -10., 10., "#it{p}^{TPC}/#it{z}"}; - const AxisSpec axisdEdx{30000, 0, 3000, "d#it{E}/d#it{x}"}; + const AxisSpec axisdEdx{2000, 0, 2000, "d#it{E}/d#it{x}"}; const AxisSpec axisCent{100, 0, 100, "centrality"}; const AxisSpec axisVtxZ{100, -20, 20, "z"}; - const AxisSpec axisDCAZ{100, -10, 10, "z"}; - // const AxisSpec axiseta{100, -1, 1, "eta"}; + const AxisSpec ptAxis{100, 0, 20, "#it{p}_{T} (GeV/#it{c})"}; + const AxisSpec axiseta{100, -1, 1, "eta"}; const AxisSpec axisrapidity{100, -2, 2, "rapidity"}; - AxisSpec axiseta = {etaBinning, "#eta"}; - AxisSpec axismass = {100, -0.5, 15, "mass^{2}"}; - AxisSpec axisdelta_mass = {100, -6, 6, "#delta mass^{2}"}; - AxisSpec ptAxis = {ptBinning, "#it{p}_{T} (GeV/#it{c})"}; - AxisSpec dcaXY = {100, -2, 2, "dcaXY"}; + const AxisSpec axismass{100, 0, 20, "mass^{2}"}; AxisSpec nsigmaAxis = {160, -20, 20, "n#sigma_{#pi^{+}}"}; // create histograms - histos.add("histMagField", "histMagField", kTH1F, {axisMagField}); - histos.add("histNev", "histNev", kTH1F, {axisNev}); - histos.add("histVtxZ", "histVtxZ", kTH1F, {axisVtxZ}); - histos.add("histCentFT0A", "histCentFT0A", kTH1F, {axisCent}); - histos.add("histCentFT0C", "histCentFT0C", kTH1F, {axisCent}); - histos.add("histCentFTOC_cut", "histCentFTOC_cut", kTH1F, {axisCent}); - histos.add("histCentFT0M", "histCentFT0M", kTH1F, {axisCent}); histos.add("histeta", "histeta", kTH1F, {axiseta}); + histos.add("histCentFTOC_cut", "histCentFTOC_cut", kTH1F, {axisCent}); histos.add("Tof_signal", "Tof_signal", kTH2F, {axisRigidity, {4000, 0.2, 1.2, "#beta"}}); histos.add("histDcaZVsPtData_particle", "dcaZ vs Pt (particle)", HistType::kTH2F, {{1000, 0, 20}, {1000, -2.5, 2.5, "dca"}}); histos.add("histDcaXYVsPtData_particle", "dcaXY vs Pt (particle)", HistType::kTH2F, {{1000, 0, 20}, {1000, -2.0, 2.0, "dca"}}); histos.add("histDcaZVsPtData_antiparticle", "dcaZ vs Pt (antiparticle)", HistType::kTH2F, {{1000, 0, 20}, {1000, -2.5, 2.5, "dca"}}); histos.add("histDcaXYVsPtData_antiparticle", "dcaXY vs Pt (antiparticle)", HistType::kTH2F, {{1000, 0, 20}, {1000, -2.0, 2.0, "dca"}}); - hDeDx.resize(2 * number_of_particles + 2); - hDeDxanti.resize(2 * number_of_particles + 2); - hnsigma_pt.resize(2 * number_of_particles + 2); - hnsigma_ptanti.resize(2 * number_of_particles + 2); - hdcaXY_pt.resize(2 * number_of_particles + 2); - hdcaXY_ptanti.resize(2 * number_of_particles + 2); - hrapidity.resize(2 * number_of_particles + 2); - hmass_pt.resize(2 * number_of_particles + 2); - hmass_ptanti.resize(2 * number_of_particles + 2); - hdelta_mass.resize(2 * number_of_particles + 2); - for (int i = 0; i <= number_of_particles; i++) { - TString histName = i < number_of_particles ? primaryParticles[i].name : "all"; - hDeDx[2 * i] = histos.add(Form("full/histdEdx_%s", histName.Data()), ";p_{TPC}/z (GeV/#it{c}); d#it{E}/d#it{x}", HistType::kTH2F, {axisRigidity, axisdEdx}); - hDeDx[2 * i + 1] = histos.add(Form("cuts/histdEdx_%s_Cuts", histName.Data()), ";p_{TPC}/z (GeV/#it{c}); d#it{E}/d#it{x}", HistType::kTH2F, {axisRigidity, axisdEdx}); - hDeDxanti[2 * i] = histos.add(Form("antifull/histdEdx_%s", histName.Data()), ";p_{TPC}/z (GeV/#it{c}); d#it{E}/d#it{x}", HistType::kTH2F, {axisRigidity, axisdEdx}); - hDeDxanti[2 * i + 1] = histos.add(Form("anticuts/histdEdx_%s_Cuts", histName.Data()), ";p_{TPC}/z (GeV/#it{c}); d#it{E}/d#it{x}", HistType::kTH2F, {axisRigidity, axisdEdx}); + histos.add("histMagField", "histMagField", kTH1F, {axisMagField}); + histos.add("histNev", "histNev", kTH1F, {axisNev}); + histos.add("histVtxZ", "histVtxZ", kTH1F, {axisVtxZ}); + histos.add("histCentFT0C", "histCentFT0C", kTH1F, {axisCent}); + histos.add("histCentFT0M", "histCentFT0M", kTH1F, {axisCent}); + hDeDx.resize(2 * nParticles + 2); + hNsigmaPt.resize(2 * nParticles + 2); + hmass.resize(2 * nParticles + 2); + for (int i = 0; i < nParticles + 1; i++) { + TString histName = i < nParticles ? primaryParticles[i].name : "all"; + if (cfgFillDeDxWithoutCut) { + hDeDx[2 * i] = histos.add(Form("dedx/histdEdx_%s", histName.Data()), ";p_{TPC}/z (GeV/#it{c}); d#it{E}/d#it{x}", HistType::kTH2F, {axisRigidity, axisdEdx}); + } + if (cfgFillDeDxWithCut) { + hDeDx[2 * i + 1] = histos.add(Form("dedx/histdEdx_%s_Cuts", histName.Data()), ";p_{TPC}/z (GeV/#it{c}); d#it{E}/d#it{x}", HistType::kTH2F, {axisRigidity, axisdEdx}); + } } - for (int i = 0; i < number_of_particles; i++) { + for (int i = 0; i < nParticles; i++) { TString histName = primaryParticles[i].name; - hnsigma_pt[2 * i] = histos.add(Form("histnsigma_pt/histnsigmaTPC_%s", histName.Data()), ";p_T{TPC} (GeV/#it{c}); TPCnsigma", HistType::kTH2F, {ptAxis, nsigmaAxis}); - hnsigma_ptanti[2 * i] = histos.add(Form("histnsigma_ptanti/histnsigmaTPC_%s", histName.Data()), ";p_T{TPC} (GeV/#it{c}); TPCnsigma", HistType::kTH2F, {ptAxis, nsigmaAxis}); - hdcaXY_pt[2 * i] = histos.add(Form("histdcaXY_pt/histdcaXY_%s", histName.Data()), ";p_T{TPC} (GeV/#it{c}); dcaXY", HistType::kTH2F, {ptAxis, dcaXY}); - hdcaXY_ptanti[2 * i] = histos.add(Form("histdcaXY_ptanti/histdcaXY_%s", histName.Data()), ";p_T{TPC} (GeV/#it{c}); dcaXY", HistType::kTH2F, {ptAxis, dcaXY}); - hmass_pt[2 * i] = histos.add(Form("histmass_pt/histmass_%s", histName.Data()), ";p_T{TPC} (GeV/#it{c}); mass^{2}", HistType::kTH2F, {ptAxis, axismass}); - hmass_ptanti[2 * i] = histos.add(Form("histmass_ptanti/histmass_%s", histName.Data()), ";p_T{TPC} (GeV/#it{c}); mass^{2}", HistType::kTH2F, {ptAxis, axismass}); - hrapidity[2 * i] = histos.add(Form("rapidity/histrapidity_%s", histName.Data()), "; rapidity", HistType::kTH1F, {axisrapidity}); - hdelta_mass[2 * i] = histos.add(Form("histdelta/histmass_%s", histName.Data()), ";p_T{TPC} (GeV/#it{c}); #Delta mass", HistType::kTH2F, {ptAxis, axisdelta_mass}); + if (cfgFillnsigma) { + hNsigmaPt[2 * i] = histos.add(Form("histnsigmaTPC_%s", histName.Data()), ";p_T{TPC} (GeV/#it{c}); TPCnsigma", HistType::kTH2F, {ptAxis, nsigmaAxis}); + hNsigmaPt[2 * i + 1] = histos.add(Form("histnsigmaTPC_anti_%s", histName.Data()), ";p_T{TPC} (GeV/#it{c}); TPCnsigma", HistType::kTH2F, {ptAxis, nsigmaAxis}); + } + if (cfgFillmass) { + hmass[2 * i] = histos.add(Form("histmass_pt/histmass_%s", histName.Data()), ";p_T{TPC} (GeV/#it{c}); mass^{2}", HistType::kTH2F, {ptAxis, axismass}); + hmass[2 * i + 1] = histos.add(Form("histmass_ptanti/histmass_%s", histName.Data()), ";p_T{TPC} (GeV/#it{c}); mass^{2}", HistType::kTH2F, {ptAxis, axismass}); + } } - } // completed void init bracket + } //---------------------------------------------------------------------------------------------------------------- void findprimaryParticles(aod::TrackAssoc const& tracksByColl, TracksFull const& tracks) { - // track loop, store primary candidates in std::vector + // track loop, store daughter candidates in std::vector for (const auto& trackId : tracksByColl) { const auto& track = tracks.rawIteratorAt(trackId.trackId()); - /* - if (!track.isPVContributor()) - continue; - */ - filldedx(track, number_of_particles); - if (track.sign() > 0) { - histos.fill(HIST("histDcaZVsPtData_particle"), track.pt(), track.dcaZ()); - histos.fill(HIST("histDcaXYVsPtData_particle"), track.pt(), track.dcaXY()); - } - if (track.sign() < 0) { - histos.fill(HIST("histDcaZVsPtData_antiparticle"), track.pt(), track.dcaZ()); - histos.fill(HIST("histDcaXYVsPtData_antiparticle"), track.pt(), track.dcaXY()); - } + filldedx(track, nParticles); if (std::abs(track.eta()) > cfgCutEta) continue; histos.fill(HIST("histeta"), track.eta()); for (size_t i = 0; i < primaryParticles.size(); i++) { + if (std::abs(getRapidity(track, i)) > cfgCutRapidity) + continue; + bool insideDCAxy = (std::abs(track.dcaXY()) <= (cfgTrackPIDsettings->get(i, "maxDcaXY") * (0.0105f + 0.0350f / std::pow(track.pt(), 1.1f)))); + if (!(insideDCAxy) || std::abs(track.dcaZ()) > cfgTrackPIDsettings->get(i, "maxDcaZ")) + continue; + if (track.sign() > 0) { + histos.fill(HIST("histDcaZVsPtData_particle"), track.pt(), track.dcaZ()); + histos.fill(HIST("histDcaXYVsPtData_particle"), track.pt(), track.dcaXY()); + } + if (track.sign() < 0) { + histos.fill(HIST("histDcaZVsPtData_antiparticle"), track.pt(), track.dcaZ()); + histos.fill(HIST("histDcaXYVsPtData_antiparticle"), track.pt(), track.dcaXY()); + } if (track.tpcNClsFound() < cfgTrackPIDsettings->get(i, "minTPCnCls")) continue; if (track.tpcChi2NCl() > cfgTrackPIDsettings->get(i, "maxTPCchi2")) @@ -237,37 +218,24 @@ struct NucleitpcPbPb { continue; if (track.itsChi2NCl() > cfgTrackPIDsettings->get(i, "maxITSchi2")) continue; - if (getMeanItsClsSize(track) < cfgTrackPIDsettings->get(i, "minITSclsSize")) - continue; - if (getMeanItsClsSize(track) > cfgTrackPIDsettings->get(i, "maxITSclsSize")) - continue; - if (i == 4 || i == 5) { - momn = 2 * track.pt(); - } else { - momn = track.pt(); - } - bool insideDCAxy = (std::abs(track.dcaXY()) <= (maxDcaXYFactor.value * (0.0105f + 0.0350f / pow(track.pt(), 1.1f)))); - if (!(insideDCAxy) || TMath::Abs(track.dcaZ()) > 2) - continue; - if (TMath::Abs(getRapidity(track, i)) > 0.5) - continue; - fillhsigma(track, i); + fillnsigma(track, i); if (std::abs(getTPCnSigma(track, primaryParticles.at(i))) > cfgTrackPIDsettings->get(i, "maxTPCnSigma")) continue; filldedx(track, i); - fillhdcaXY(track, i); fillhmass(track, i); - fillhrapidity(track, i); - fillhdelta_mass(track, i); + if (getMeanItsClsSize(track) < cfgTrackPIDsettings->get(i, "minITSclsSize")) + continue; + if (getMeanItsClsSize(track) > cfgTrackPIDsettings->get(i, "maxITSclsSize")) + continue; if (getRigidity(track) < cfgTrackPIDsettings->get(i, "minRigidity") || getRigidity(track) > cfgTrackPIDsettings->get(i, "maxRigidity")) continue; if (cfgTrackPIDsettings->get(i, "TOFrequiredabove") >= 0 && getRigidity(track) > cfgTrackPIDsettings->get(i, "TOFrequiredabove") && (track.mass() < cfgTrackPIDsettings->get(i, "minTOFmass") || track.mass() > cfgTrackPIDsettings->get(i, "maxTOFmass"))) continue; - histos.fill(HIST("Tof_signal"), track.sign() * momn, track.beta()); } } // track loop } //---------------------------------------------------------------------------------------------------------------- + //---------------------------------------------------------------------------------------------------------------- void processData(CollisionsFull const& collisions, TracksFull const& tracks, aod::BCsWithTimestamps const&, aod::TrackAssoc const& tracksColl) { for (const auto& collision : collisions) { @@ -276,13 +244,14 @@ struct NucleitpcPbPb { initCollision(collision); if (!collPassedEvSel) continue; + if (collision.centFT0C() > centcut) + continue; + histos.fill(HIST("histCentFTOC_cut"), collision.centFT0C()); const uint64_t collIdx = collision.globalIndex(); auto tracksByColl = tracksColl.sliceBy(perCollision, collIdx); findprimaryParticles(tracksByColl, tracks); if (!collHasCandidate) continue; - if (collision.centFT0C() > centcut) - continue; } } PROCESS_SWITCH(NucleitpcPbPb, processData, "data analysis", true); @@ -292,13 +261,14 @@ struct NucleitpcPbPb { if (mRunNumber == bc.runNumber()) { return; } + constexpr float kInvalidBField = -990.f; auto run3grpTimestamp = bc.timestamp(); dBz = 0; o2::parameters::GRPObject* grpo = ccdb->getForTimeStamp(grpPath, run3grpTimestamp); o2::parameters::GRPMagField* grpmag = 0x0; if (grpo) { o2::base::Propagator::initFieldFromGRP(grpo); - if (bField < -990) { + if (bField < kInvalidBField) { // Fetch magnetic field from ccdb for current collision dBz = grpo->getNominalL3Field(); LOG(info) << "Retrieved GRP for timestamp " << run3grpTimestamp << " with magnetic field of " << dBz << " kZG"; @@ -311,7 +281,7 @@ struct NucleitpcPbPb { LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for timestamp " << run3grpTimestamp; } o2::base::Propagator::initFieldFromGRP(grpmag); - if (bField < -990) { + if (bField < kInvalidBField) { // Fetch magnetic field from ccdb for current collision dBz = std::lround(5.f * grpmag->getL3Current() / 30000.f); LOG(info) << "Retrieved GRP for timestamp " << run3grpTimestamp << " with magnetic field of " << dBz << " kZG"; @@ -328,23 +298,16 @@ struct NucleitpcPbPb { collHasCandidate = false; histos.fill(HIST("histMagField"), dBz); histos.fill(HIST("histNev"), 0.5); - collPassedEvSel = collision.sel8() && std::abs(collision.posZ()) < 10; - if (collision.sel8()) { - histos.fill(HIST("histNev"), 1.5); - if (std::abs(collision.posZ()) < 10.0000000000000000) { - histos.fill(HIST("histNev"), 2.5); - } - } + collPassedEvSel = collision.sel8() && std::abs(collision.posZ()) < cfgZvertex; + occupancy = collision.trackOccupancyInTimeRange(); if (collPassedEvSel) { + histos.fill(HIST("histNev"), 1.5); histos.fill(HIST("histVtxZ"), collision.posZ()); - histos.fill(HIST("histCentFT0A"), collision.centFT0A()); + // histos.fill(HIST("histCentFT0A"), collision.centFT0A()); histos.fill(HIST("histCentFT0C"), collision.centFT0C()); histos.fill(HIST("histCentFT0M"), collision.centFT0M()); - if (collision.centFT0C() < centcut) { - histos.fill(HIST("histCentFTOC_cut"), collision.centFT0C()); - } + // histos.fill(HIST("histEvents"), collision.centFT0C(), occupancy); } - occupancy = collision.trackOccupancyInTimeRange(); primVtx.assign({collision.posX(), collision.posY(), collision.posZ()}); cents.assign({collision.centFT0A(), collision.centFT0C(), collision.centFT0M()}); } @@ -353,126 +316,89 @@ struct NucleitpcPbPb { void filldedx(T const& track, int species) { const float rigidity = getRigidity(track); - int idx = 2 * species; - if (species != 6) { - auto& hist = (track.sign() > 0) ? hDeDx[idx] : hDeDxanti[idx]; - hist->Fill(track.sign() * rigidity, track.tpcSignal()); - } else { - hDeDx[idx]->Fill(track.sign() * rigidity, track.tpcSignal()); - hDeDxanti[idx]->Fill(track.sign() * rigidity, track.tpcSignal()); + if (cfgFillDeDxWithoutCut) { + hDeDx[2 * species]->Fill(track.sign() * rigidity, track.tpcSignal()); } - if (track.tpcNClsFound() < 100 || track.itsNCls() < 2) - return; - - auto& hist2 = (track.sign() > 0) ? hDeDx[idx + 1] : hDeDxanti[idx + 1]; - hist2->Fill(track.sign() * rigidity, track.tpcSignal()); - } - template - void fillhsigma(T const& track, int species) - { - if (track.tpcNClsFound() < 100 || track.itsNCls() < 2) + if (track.tpcNClsFound() < cfgtpcNClsFound || track.itsNCls() < cfgitsNCls) return; - int i = species; - const float tpcNsigma = getTPCnSigma(track, primaryParticles.at(i)); - double momn; - if (species == 4 || species == 5) { - momn = 2 * track.pt(); - } else { - momn = track.pt(); - } - if (track.sign() > 0) { - hnsigma_pt[2 * species]->Fill(momn, tpcNsigma); - } - if (track.sign() < 0) { - hnsigma_ptanti[2 * species]->Fill(momn, tpcNsigma); + if (cfgFillDeDxWithCut) { + hDeDx[2 * species + 1]->Fill(track.sign() * rigidity, track.tpcSignal()); } } + //---------------------------------------------------------------------------------------------------------------- template - void fillhdcaXY(T const& track, int species) + void fillnsigma(T const& track, int species) { - if (track.tpcNClsFound() < 100 || track.itsNCls() < 2) + if (track.tpcNClsFound() < cfgtpcNClsFound || track.itsNCls() < cfgitsNCls) return; - double momn; - if (species == 4 || species == 5) { - momn = 2 * track.pt(); - } else { - momn = track.pt(); - } - const float dcaXY = track.dcaXY(); - if (track.sign() > 0) { - hdcaXY_pt[2 * species]->Fill(momn, dcaXY); - } - if (track.sign() < 0) { - hdcaXY_ptanti[2 * species]->Fill(momn, dcaXY); + if (cfgFillnsigma) { + int i = species; + const float tpcNsigma = getTPCnSigma(track, primaryParticles.at(i)); + double momn; + int speciesHe3 = 4; + int speciesHe4 = 5; + if (species == speciesHe3 || species == speciesHe4) { + momn = 2 * track.pt(); + } else { + momn = track.pt(); + } + if (track.sign() > 0) { + hNsigmaPt[2 * species]->Fill(momn, tpcNsigma); + } + if (track.sign() < 0) { + hNsigmaPt[2 * species + 1]->Fill(momn, tpcNsigma); + } } } + //---------------------------------------------------------------------------------------------------------------- template void fillhmass(T const& track, int species) { - if (track.tpcNClsFound() < 100 || track.itsNCls() < 2) + if (track.tpcNClsFound() < cfgtpcNClsFound || track.itsNCls() < cfgitsNCls) return; - double mass; - if (species == 4 || species == 5) { - mass = 2 * track.mass(); - } else { - mass = track.mass(); - } - double momn; - if (species == 4 || species == 5) { - momn = 2 * track.pt(); - } else { - momn = track.pt(); - } - if (track.sign() > 0) { - hmass_pt[2 * species]->Fill(momn, mass * mass); - } - if (track.sign() < 0) { - hmass_ptanti[2 * species]->Fill(momn, mass * mass); - } - } - template - void fillhdelta_mass(T const& track, int species) - { - if (track.tpcNClsFound() < 100 || track.itsNCls() < 2) - return; - double mass; - if (species == 4 || species == 5) { - mass = 2 * track.mass(); - } else { - mass = track.mass(); + if (cfgFillmass) { + double mass; + int speciesHe3 = 4; + int speciesHe4 = 5; + if (species == speciesHe3 || species == speciesHe4) { + mass = 2 * track.mass(); + } else { + mass = track.mass(); + } + double momn; + if (species == speciesHe3 || species == speciesHe4) { + momn = 2 * track.pt(); + } else { + momn = track.pt(); + } + if (track.sign() > 0) { + hmass[2 * species]->Fill(momn, mass * mass); + } + if (track.sign() < 0) { + hmass[2 * species + 1]->Fill(momn, mass * mass); + } } - - double delta_mass = (mass - particleMasses[species]); - - hdelta_mass[2 * species]->Fill(track.pt() * particleCharge[species], delta_mass); - } - template - void fillhrapidity(T const& track, int species) - { - if (track.tpcNClsFound() < 100 || track.itsNCls() < 2) - return; - double rap = getRapidity(track, species); - hrapidity[2 * species]->Fill(rap); } //---------------------------------------------------------------------------------------------------------------- template - float getTPCnSigma(T const& track, Particle const& particle) + float getTPCnSigma(T const& track, PrimParticles const& particle) { const float rigidity = getRigidity(track); if (!track.hasTPC()) return -999; - if (particle.name == "pion" && cfgTrackPIDsettings->get("pion", "useBBparams") == 0) - return track.tpcNSigmaPi(); - if (particle.name == "proton" && cfgTrackPIDsettings->get("proton", "useBBparams") == 0) - return track.tpcNSigmaPr(); - if (particle.name == "deuteron" && cfgTrackPIDsettings->get("deuteron", "useBBparams") == 0) - return track.tpcNSigmaDe(); - if (particle.name == "triton" && cfgTrackPIDsettings->get("triton", "useBBparams") == 0) - return track.tpcNSigmaTr(); - if (particle.name == "helium3" && cfgTrackPIDsettings->get("helium3", "useBBparams") == 0) - return track.tpcNSigmaHe(); - if (particle.name == "alpha" && cfgTrackPIDsettings->get("alpha", "useBBparams") == 0) - return track.tpcNSigmaAl(); + if (particle.name == "pion" && cfgTrackPIDsettings->get("pion", "useBBparams") < 1) + return cfgTrackPIDsettings->get("pion", "useBBparams") == 0 ? track.tpcNSigmaPi() : 0; + if (particle.name == "proton" && cfgTrackPIDsettings->get("proton", "useBBparams") < 1) + return cfgTrackPIDsettings->get("proton", "useBBparams") == 0 ? track.tpcNSigmaPr() : 0; + if (particle.name == "deuteron" && cfgTrackPIDsettings->get("deuteron", "useBBparams") < 1) + return cfgTrackPIDsettings->get("deuteron", "useBBparams") == 0 ? track.tpcNSigmaDe() : 0; + if (particle.name == "triton" && cfgTrackPIDsettings->get("triton", "useBBparams") < 1) + return cfgTrackPIDsettings->get("triton", "useBBparams") == 0 ? track.tpcNSigmaTr() : 0; + if (particle.name == "helion" && cfgTrackPIDsettings->get("helion", "useBBparams") < 1) + return cfgTrackPIDsettings->get("helion", "useBBparams") == 0 ? track.tpcNSigmaHe() : 0; + if (particle.name == "alpha" && cfgTrackPIDsettings->get("alpha", "useBBparams") < 1) + return cfgTrackPIDsettings->get("alpha", "useBBparams") == 0 ? track.tpcNSigmaAl() : 0; + double expBethe{tpc::BetheBlochAleph(static_cast(particle.charge * rigidity / particle.mass), particle.betheParams[0], particle.betheParams[1], particle.betheParams[2], particle.betheParams[3], particle.betheParams[4])}; double expSigma{expBethe * particle.resolution}; float sigmaTPC = static_cast((track.tpcSignal() - expBethe) / expSigma); @@ -483,7 +409,8 @@ struct NucleitpcPbPb { float getMeanItsClsSize(T const& track) { int sum = 0, n = 0; - for (int i = 0; i < 8; i++) { + constexpr int kNITSLayers = 8; + for (int i = 0; i < kNITSLayers; i++) { sum += (track.itsClusterSizes() >> (4 * i) & 15); if (track.itsClusterSizes() >> (4 * i) & 15) n++; @@ -499,18 +426,21 @@ struct NucleitpcPbPb { bool hePID = track.pidForTracking() == o2::track::PID::Helium3 || track.pidForTracking() == o2::track::PID::Alpha; return hePID ? track.tpcInnerParam() / 2 : track.tpcInnerParam(); } + //---------------------------------------------------------------------------------------------------------------- template float getRapidity(T const& track, int species) { + using PtEtaPhiMVector = ROOT::Math::LorentzVector>; double momn; - TLorentzVector lorentzVector_particle; - if (species == 4 || species == 5) { + int speciesHe3 = 4; + int speciesHe4 = 5; + if (species == speciesHe3 || species == speciesHe4) { momn = 2 * track.pt(); } else { momn = track.pt(); } - lorentzVector_particle.SetPtEtaPhiM(momn, track.eta(), track.phi(), particleMasses[species]); - return lorentzVector_particle.Rapidity(); + PtEtaPhiMVector lorentzVectorParticle(momn, track.eta(), track.phi(), particleMasses[species]); + return lorentzVectorParticle.Rapidity(); } }; // end of the task here //---------------------------------------------------------------------------------------------------------------- From e493b98c7b1b569da17138b2fab282226130241f Mon Sep 17 00:00:00 2001 From: blacwovie Date: Sun, 4 May 2025 19:23:14 +0800 Subject: [PATCH 1169/1650] [PWGLF] remove DCAfitter and fixed O2linter error (#11048) Co-authored-by: blacw Co-authored-by: ALICE Action Bot --- PWGLF/TableProducer/Nuspex/he3HadronFemto.cxx | 636 +++++++++--------- 1 file changed, 317 insertions(+), 319 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/he3HadronFemto.cxx b/PWGLF/TableProducer/Nuspex/he3HadronFemto.cxx index f8aa89a0d35..a2e4413854a 100644 --- a/PWGLF/TableProducer/Nuspex/he3HadronFemto.cxx +++ b/PWGLF/TableProducer/Nuspex/he3HadronFemto.cxx @@ -10,15 +10,18 @@ // or submit itself to any jurisdiction. // Analysis task for he3-hadron femto analysis +/// \file he3HadronFemto.cxx +/// \brief Femto analysis task for He3-hadron correlation +/// \author Your Name (your.email@cern.ch) +/// \since April 2025 + #include #include #include -#include #include #include #include #include -#include #include #include @@ -86,9 +89,10 @@ static const std::vector betheBlochParNames{"p0", "p1", "p2", "p3", // constexpr float he3Mass = o2::constants::physics::MassHelium3; // constexpr float protonMass = o2::constants::physics::MassProton; // constexpr float pionchargedMass = o2::constants::physics::MassPiPlus; -constexpr int li4PDG = 1000030040; -constexpr int prPDG = 2212; -constexpr int hePDG = 1000020030; +constexpr int Li4PDG = 1000030040; +constexpr int ProtonPDG = PDG_t::kProton; +constexpr int He3PDG = o2::constants::physics::Pdg::kHelium3; +constexpr float CommonInite = 0.0f; // constexpr int pichargedPDG = 211; enum Selections { @@ -100,7 +104,7 @@ enum Selections { } // namespace -struct he3HadCandidate { +struct He3HadCandidate { float recoPtHe3() const { return signHe3 * std::hypot(momHe3[0], momHe3[1]); } float recoPhiHe3() const { return std::atan2(momHe3[1], momHe3[0]); } @@ -115,10 +119,10 @@ struct he3HadCandidate { float signHe3 = 1.f; float signHad = 1.f; float invMass = -10.f; - float DCAxyHe3 = -10.f; - float DCAzHe3 = -10.f; - float DCAxyHad = -10.f; - float DCAzHad = -10.f; + float dcaxyHe3 = -10.f; + float dcazHe3 = -10.f; + float dcaxyHad = -10.f; + float dcazHad = -10.f; uint16_t tpcSignalHe3 = 0u; uint16_t tpcSignalHad = 0u; @@ -131,17 +135,17 @@ struct he3HadCandidate { float chi2TPCHad = -10.f; float nSigmaHe3 = -10.f; float nSigmaHad = -10.f; - uint32_t PIDtrkHe3 = 0xFFFFF; // PID in tracking - uint32_t PIDtrkHad = 0xFFFFF; + uint32_t pidtrkHe3 = 0xFFFFF; // PID in tracking + uint32_t pidtrkHad = 0xFFFFF; float massTOFHe3 = -10; float massTOFHad = -10; uint32_t itsClSizeHe3 = 0u; uint32_t itsClSizeHad = 0u; - uint8_t NClsITSHe3 = 0u; - uint8_t NClsITSHad = 0u; - float Chi2NClITSHe3 = -10.f; - float Chi2NClITSHad = -10.f; + uint8_t nclsITSHe3 = 0u; + uint8_t nclsITSHad = 0u; + float chi2nclITSHe3 = -10.f; + float chi2nclITSHad = -10.f; bool isBkgUS = false; // unlike sign bool isBkgEM = false; // event mixing @@ -162,58 +166,58 @@ struct he3HadCandidate { int32_t collisionID = 0; }; -struct he3hadronfemto { +struct he3HadronFemto { - Produces m_outputDataTable; - Produces m_outputMCTable; - Produces m_outputMultiplicityTable; + Produces outputDataTable; + Produces outputMcTable; + Produces outputMultiplicityTable; // Selections - Configurable setting_HadPDGCode{"setting_HadPDGCode", 211, "Hadron - PDG code"}; - Configurable setting_cutVertex{"setting_cutVertex", 10.0f, "Accepted z-vertex range"}; - Configurable setting_cutRigidityMinHe3{"setting_cutRigidityMinHe3", 0.8f, "Minimum rigidity for He3"}; - Configurable setting_cutEta{"setting_cutEta", 0.9f, "Eta cut on daughter track"}; - Configurable setting_cutDCAxy{"setting_cutDCAxy", 2.0f, "DCAxy range for tracks"}; - Configurable setting_cutDCAz{"setting_cutDCAz", 2.0f, "DCAz range for tracks"}; - Configurable setting_cutChi2tpcLow{"setting_cutChi2tpcLow", 0.5f, "Low cut on TPC chi2"}; - Configurable setting_cutInvMass{"setting_cutInvMass", 0.0f, "Invariant mass upper limit"}; - Configurable setting_cutPtMinhe3Had{"setting_cutPtMinhe3Had", 0.0f, "Minimum PT cut on he3Had4"}; - Configurable setting_cutClSizeItsHe3{"setting_cutClSizeItsHe3", 4.0f, "Minimum ITS cluster size for He3"}; - Configurable setting_cutNCls{"setting_cutNCls", 5.0f, "Minimum ITS Ncluster for tracks"}; - Configurable setting_cutChi2NClITS{"setting_cutChi2NClITS", 36.f, "Maximum ITS Chi2 for tracks"}; - Configurable setting_cutNsigmaTPC{"setting_cutNsigmaTPC", 3.0f, "Value of the TPC Nsigma cut"}; - Configurable setting_cutNsigmaITS{"setting_cutNsigmaITS", -1.5f, "Value of the TPC Nsigma cut"}; - Configurable setting_cutPtMinTOFHad{"setting_cutPtMinTOFHad", 0.4f, "Minimum pT to apply the TOF cut on hadrons"}; - Configurable setting_cutNsigmaTOF{"setting_cutNsigmaTOF", 3.0f, "Value of the TOF Nsigma cut"}; - Configurable setting_noMixedEvents{"setting_noMixedEvents", 5, "Number of mixed events per event"}; - Configurable setting_enableBkgUS{"setting_enableBkgUS", false, "Enable US background"}; - Configurable setting_enableDCAfitter{"setting_enableDCAfitter", false, "Enable DCA fitter"}; - Configurable setting_saveUSandLS{"setting_saveUSandLS", true, "Save All Pairs"}; - Configurable setting_isMC{"setting_isMC", false, "Run MC"}; - Configurable setting_fillMultiplicity{"setting_fillMultiplicity", false, "Fill multiplicity table"}; + Configurable settingHadPDGCode{"settingHadPDGCode", 211, "Hadron - PDG code"}; + Configurable settingCutVertex{"settingCutVertex", 10.0f, "Accepted z-vertex range"}; + Configurable settingCutRigidityMinHe3{"settingCutRigidityMinHe3", 0.8f, "Minimum rigidity for He3"}; + Configurable settingCutEta{"settingCutEta", 0.9f, "Eta cut on daughter track"}; + Configurable settingCutDCAxy{"settingCutDCAxy", 2.0f, "DCAxy range for tracks"}; + Configurable settingCutDCAz{"settingCutDCAz", 2.0f, "DCAz range for tracks"}; + Configurable settingCutChi2tpcLow{"settingCutChi2tpcLow", 0.5f, "Low cut on TPC chi2"}; + Configurable settingCutInvMass{"settingCutInvMass", 0.0f, "Invariant mass upper limit"}; + Configurable settingCutPtMinhe3Had{"settingCutPtMinhe3Had", 0.0f, "Minimum PT cut on he3Had4"}; + Configurable settingCutClSizeItsHe3{"settingCutClSizeItsHe3", 4.0f, "Minimum ITS cluster size for He3"}; + Configurable settingCutNCls{"settingCutNCls", 5.0f, "Minimum ITS Ncluster for tracks"}; + Configurable settingCutChi2NClITS{"settingCutChi2NClITS", 36.f, "Maximum ITS Chi2 for tracks"}; + Configurable settingCutNsigmaTPC{"settingCutNsigmaTPC", 3.0f, "Value of the TPC Nsigma cut"}; + Configurable settingCutNsigmaITS{"settingCutNsigmaITS", -1.5f, "Value of the TPC Nsigma cut"}; + Configurable settingCutPtMinTOFHad{"settingCutPtMinTOFHad", 0.4f, "Minimum pT to apply the TOF cut on hadrons"}; + Configurable settingCutNsigmaTOF{"settingCutNsigmaTOF", 3.0f, "Value of the TOF Nsigma cut"}; + Configurable settingNoMixedEvents{"settingNoMixedEvents", 5, "Number of mixed events per event"}; + Configurable settingEnableBkgUS{"settingEnableBkgUS", false, "Enable US background"}; + Configurable settingEnableDCAfitter{"settingEnableDCAfitter", false, "Enable DCA fitter"}; + Configurable settingSaveUSandLS{"settingSaveUSandLS", true, "Save All Pairs"}; + Configurable settingIsMC{"settingIsMC", false, "Run MC"}; + Configurable settingFillMultiplicity{"settingFillMultiplicity", false, "Fill multiplicity table"}; // Zorro - Configurable setting_skimmedProcessing{"setting_skimmedProcessing", false, "Skimmed dataset processing"}; + Configurable settingSkimmedProcessing{"settingSkimmedProcessing", false, "Skimmed dataset processing"}; // svPool - Configurable setting_skipAmbiTracks{"setting_skipAmbiTracks", false, "Skip ambiguous tracks"}; - Configurable setting_customVertexerTimeMargin{"setting_customVertexerTimeMargin", 800, "Time margin for custom vertexer (ns)"}; + Configurable settingSkipAmbiTracks{"settingSkipAmbiTracks", false, "Skip ambiguous tracks"}; + Configurable settingCustomVertexerTimeMargin{"settingCustomVertexerTimeMargin", 800, "Time margin for custom vertexer (ns)"}; // CCDB options - Configurable setting_d_bz_input{"setting_d_bz", -999, "bz field, -999 is automatic"}; - Configurable setting_ccdburl{"setting_ccdburl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; - Configurable setting_grpPath{"setting_grpPath", "GLO/GRP/GRP", "Path of the grp file"}; - Configurable setting_grpmagPath{"setting_grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; - Configurable setting_lutPath{"setting_lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; - Configurable setting_geoPath{"setting_geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; - Configurable setting_pidPath{"setting_pidPath", "", "Path to the PID response object"}; + Configurable settingDbz{"settingDbz", -999, "bz field, -999 is automatic"}; + Configurable settingCcdburl{"settingCcdburl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable settingGrpPath{"settingGrpPath", "GLO/GRP/GRP", "Path of the grp file"}; + Configurable settingGrpmagPath{"settingGrpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + Configurable settingLutPath{"settingLutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; + Configurable settingGeoPath{"settingGeoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; + Configurable settingPidPath{"settingPidPath", "", "Path to the PID response object"}; - Configurable> setting_BetheBlochParams{"setting_BetheBlochParams", {betheBlochDefault[0], 1, 6, {"He3"}, betheBlochParNames}, "TPC Bethe-Bloch parameterisation for He3"}; - Configurable setting_compensatePIDinTracking{"setting_compensatePIDinTracking", false, "If true, divide tpcInnerParam by the electric charge"}; - Configurable setting_materialCorrection{"setting_materialCorrection", static_cast(o2::base::Propagator::MatCorrType::USEMatCorrNONE), "Material correction type"}; + Configurable> settingBetheBlochParams{"settingBetheBlochParams", {betheBlochDefault[0], 1, 6, {"He3"}, betheBlochParNames}, "TPC Bethe-Bloch parameterisation for He3"}; + Configurable settingCompensatePIDinTracking{"settingCompensatePIDinTracking", false, "If true, divide tpcInnerParam by the electric charge"}; + Configurable settingMaterialCorrection{"settingMaterialCorrection", static_cast(o2::base::Propagator::MatCorrType::USEMatCorrNONE), "Material correction type"}; - Preslice m_perCol = aod::track::collisionId; - Preslice m_perColMC = aod::track::collisionId; + Preslice mPerCol = aod::track::collisionId; + Preslice mPerColMC = aod::track::collisionId; // binning for EM background ConfigurableAxis axisVertex{"axisVertex", {30, -10, 10}, "Binning for multiplicity"}; @@ -221,23 +225,22 @@ struct he3hadronfemto { using BinningType = ColumnBinningPolicy; BinningType binningPolicy{{axisVertex, axisCentrality}, true}; SliceCache cache; - SameKindPair m_pair{binningPolicy, setting_noMixedEvents, -1, &cache}; - - std::array m_BBparamsHe; - - std::vector m_recoCollisionIDs; - std::vector m_goodCollisions; - std::vector m_trackPairs; - o2::vertexing::DCAFitterN<2> m_fitter; - svPoolCreator m_svPoolCreator{hePDG, prPDG}; - - int m_runNumber; - float m_d_bz; - Service m_ccdb; - Zorro m_zorro; - OutputObj m_zorroSummary{"zorroSummary"}; - - HistogramRegistry m_qaRegistry{ + SameKindPair mPair{binningPolicy, settingNoMixedEvents, -1, &cache}; + + std::array mBBparamsHe; + + std::vector mRecoCollisionIDs; + std::vector mGoodCollisions; + std::vector mTrackPairs; + o2::vertexing::DCAFitterN<2> mFitter; + svPoolCreator mSvPoolCreator{He3PDG, ProtonPDG}; + int mRunNumber; + float mDbz; + Service mCcdb; + Zorro mZorro; + OutputObj mZorroSummary{"zorroSummary"}; + + HistogramRegistry mQaRegistry{ "QA", { {"hVtxZ", "Vertex distribution in Z;Z (cm)", {HistType::kTH1F, {{400, -20.0, 20.0}}}}, @@ -270,83 +273,83 @@ struct he3hadronfemto { void init(o2::framework::InitContext&) { - m_zorroSummary.setObject(m_zorro.getZorroSummary()); - m_runNumber = 0; - - m_ccdb->setURL(setting_ccdburl); - m_ccdb->setCaching(true); - m_ccdb->setLocalObjectValidityChecking(); - m_ccdb->setFatalWhenNull(false); - - m_fitter.setPropagateToPCA(true); - m_fitter.setMaxR(200.); - m_fitter.setMinParamChange(1e-3); - m_fitter.setMinRelChi2Change(0.9); - m_fitter.setMaxDZIni(1e9); - m_fitter.setMaxChi2(1e9); - m_fitter.setUseAbsDCA(true); - int mat{static_cast(setting_materialCorrection)}; - m_fitter.setMatCorrType(static_cast(mat)); - - m_svPoolCreator.setTimeMargin(setting_customVertexerTimeMargin); - if (setting_skipAmbiTracks) { - m_svPoolCreator.setSkipAmbiTracks(); + mZorroSummary.setObject(mZorro.getZorroSummary()); + mRunNumber = 0; + + mCcdb->setURL(settingCcdburl); + mCcdb->setCaching(true); + mCcdb->setLocalObjectValidityChecking(); + mCcdb->setFatalWhenNull(false); + + mFitter.setPropagateToPCA(true); + mFitter.setMaxR(200.); + mFitter.setMinParamChange(1e-3); + mFitter.setMinRelChi2Change(0.9); + mFitter.setMaxDZIni(1e9); + mFitter.setMaxChi2(1e9); + mFitter.setUseAbsDCA(true); + int mat{static_cast(settingMaterialCorrection)}; + mFitter.setMatCorrType(static_cast(mat)); + + mSvPoolCreator.setTimeMargin(settingCustomVertexerTimeMargin); + if (settingSkipAmbiTracks) { + mSvPoolCreator.setSkipAmbiTracks(); } - - for (int i = 0; i < 5; i++) { - m_BBparamsHe[i] = setting_BetheBlochParams->get("He3", Form("p%i", i)); + const int numberParticle = 5; + for (int i = 0; i < numberParticle; i++) { + mBBparamsHe[i] = settingBetheBlochParams->get("He3", Form("p%i", i)); } - m_BBparamsHe[5] = setting_BetheBlochParams->get("He3", "resolution"); + mBBparamsHe[5] = settingBetheBlochParams->get("He3", "resolution"); - std::vector selection_labels = {"All", "Track selection", "PID"}; + std::vector selectionLabels = {"All", "Track selection", "PID"}; for (int i = 0; i < Selections::kAll; i++) { - m_qaRegistry.get(HIST("hTrackSel"))->GetXaxis()->SetBinLabel(i + 1, selection_labels[i].c_str()); + mQaRegistry.get(HIST("hTrackSel"))->GetXaxis()->SetBinLabel(i + 1, selectionLabels[i].c_str()); } - std::vector events_labels = {"All", "Selected", "Zorro He events"}; + std::vector eventsLabels = {"All", "Selected", "Zorro He events"}; for (int i = 0; i < Selections::kAll; i++) { - m_qaRegistry.get(HIST("hEvents"))->GetXaxis()->SetBinLabel(i + 1, events_labels[i].c_str()); + mQaRegistry.get(HIST("hEvents"))->GetXaxis()->SetBinLabel(i + 1, eventsLabels[i].c_str()); } - m_qaRegistry.get(HIST("hEmptyPool"))->GetXaxis()->SetBinLabel(1, "False"); - m_qaRegistry.get(HIST("hEmptyPool"))->GetXaxis()->SetBinLabel(2, "True"); + mQaRegistry.get(HIST("hEmptyPool"))->GetXaxis()->SetBinLabel(1, "False"); + mQaRegistry.get(HIST("hEmptyPool"))->GetXaxis()->SetBinLabel(2, "True"); } void initCCDB(const aod::BCsWithTimestamps::iterator& bc) { - if (m_runNumber == bc.runNumber()) { + if (mRunNumber == bc.runNumber()) { return; } - if (setting_skimmedProcessing) { - m_zorro.initCCDB(m_ccdb.service, bc.runNumber(), bc.timestamp(), "fHe"); - m_zorro.populateHistRegistry(m_qaRegistry, bc.runNumber()); + if (settingSkimmedProcessing) { + mZorro.initCCDB(mCcdb.service, bc.runNumber(), bc.timestamp(), "fHe"); + mZorro.populateHistRegistry(mQaRegistry, bc.runNumber()); } - m_runNumber = bc.runNumber(); - - auto run3grp_timestamp = bc.timestamp(); - o2::parameters::GRPObject* grpo = m_ccdb->getForTimeStamp(setting_grpPath, run3grp_timestamp); + mRunNumber = bc.runNumber(); + const float defaultBzValue = -999.0f; + auto run3GrpTimestamp = bc.timestamp(); + o2::parameters::GRPObject* grpo = mCcdb->getForTimeStamp(settingGrpPath, run3GrpTimestamp); o2::parameters::GRPMagField* grpmag = 0x0; if (grpo) { o2::base::Propagator::initFieldFromGRP(grpo); - if (setting_d_bz_input < -990) { + if (settingDbz < defaultBzValue) { // Fetch magnetic field from ccdb for current collision - m_d_bz = grpo->getNominalL3Field(); - LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << m_d_bz << " kZG"; + mDbz = grpo->getNominalL3Field(); + LOG(info) << "Retrieved GRP for timestamp " << run3GrpTimestamp << " with magnetic field of " << mDbz << " kZG"; } else { - m_d_bz = setting_d_bz_input; + mDbz = settingDbz; } } else { - grpmag = m_ccdb->getForTimeStamp(setting_grpmagPath, run3grp_timestamp); + grpmag = mCcdb->getForTimeStamp(settingGrpmagPath, run3GrpTimestamp); if (!grpmag) { - LOG(fatal) << "Got nullptr from CCDB for path " << setting_grpmagPath << " of object GRPMagField and " << setting_grpPath << " of object GRPObject for timestamp " << run3grp_timestamp; + LOG(fatal) << "Got nullptr from CCDB for path " << settingGrpmagPath << " of object GRPMagField and " << settingGrpPath << " of object GRPObject for timestamp " << run3GrpTimestamp; } o2::base::Propagator::initFieldFromGRP(grpmag); - if (setting_d_bz_input < -990) { + if (settingDbz < defaultBzValue) { // Fetch magnetic field from ccdb for current collision - m_d_bz = std::lround(5.f * grpmag->getL3Current() / 30000.f); - LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << m_d_bz << " kZG"; + mDbz = std::lround(5.f * grpmag->getL3Current() / 30000.f); + LOG(info) << "Retrieved GRP for timestamp " << run3GrpTimestamp << " with magnetic field of " << mDbz << " kZG"; } else { - m_d_bz = setting_d_bz_input; + mDbz = settingDbz; } } } @@ -356,46 +359,50 @@ struct he3hadronfemto { template bool selectCollision(const Tcollision& collision, const aod::BCsWithTimestamps&) { - m_qaRegistry.fill(HIST("hEvents"), 0); + mQaRegistry.fill(HIST("hEvents"), 0); if constexpr (isMC) { - if (/*!collision.sel8() ||*/ std::abs(collision.posZ()) > setting_cutVertex) { + if (/*!collision.sel8() ||*/ std::abs(collision.posZ()) > settingCutVertex) { return false; } } else { auto bc = collision.template bc_as(); initCCDB(bc); - if (!collision.sel8() || std::abs(collision.posZ()) > setting_cutVertex) { + if (!collision.sel8() || std::abs(collision.posZ()) > settingCutVertex) { return false; } - if (setting_skimmedProcessing) { - bool zorroSelected = m_zorro.isSelected(collision.template bc_as().globalBC()); + if (settingSkimmedProcessing) { + bool zorroSelected = mZorro.isSelected(collision.template bc_as().globalBC()); if (zorroSelected) { - m_qaRegistry.fill(HIST("hEvents"), 2); + mQaRegistry.fill(HIST("hEvents"), 2); } } } - m_qaRegistry.fill(HIST("hEvents"), 1); - m_qaRegistry.fill(HIST("hNcontributor"), collision.numContrib()); - m_qaRegistry.fill(HIST("hVtxZ"), collision.posZ()); + mQaRegistry.fill(HIST("hEvents"), 1); + mQaRegistry.fill(HIST("hNcontributor"), collision.numContrib()); + mQaRegistry.fill(HIST("hVtxZ"), collision.posZ()); return true; } template bool selectTrack(const Ttrack& candidate) { - if (std::abs(candidate.eta()) > setting_cutEta) { + if (std::abs(candidate.eta()) > settingCutEta) { return false; } - if (candidate.itsNCls() < setting_cutNCls || - candidate.tpcNClsFound() < 90 || - candidate.tpcNClsCrossedRows() < 70 || - candidate.tpcNClsCrossedRows() < 0.8 * candidate.tpcNClsFindable() || - candidate.tpcChi2NCl() > 4.f || - candidate.tpcChi2NCl() < setting_cutChi2tpcLow || - candidate.itsChi2NCl() > setting_cutChi2NClITS) { + const int minTPCNClsFound = 90; + const int minTPCNClsCrossedRows = 70; + const float crossedRowsToFindableRatio = 0.8f; + const float maxChi2NCl = 4.f; + if (candidate.itsNCls() < settingCutNCls || + candidate.tpcNClsFound() < minTPCNClsFound || + candidate.tpcNClsCrossedRows() < minTPCNClsCrossedRows || + candidate.tpcNClsCrossedRows() < crossedRowsToFindableRatio * candidate.tpcNClsFindable() || + candidate.tpcChi2NCl() > maxChi2NCl || + candidate.tpcChi2NCl() < settingCutChi2tpcLow || + candidate.itsChi2NCl() > settingCutChi2NClITS) { return false; } @@ -405,10 +412,10 @@ struct he3hadronfemto { template float computeTPCNSigmaHadron(const Ttrack& candidate) { - float tpcNSigmaHad = 0; - if (setting_HadPDGCode == 211) { + float tpcNSigmaHad = CommonInite; + if (settingHadPDGCode == PDG_t::kPiPlus) { tpcNSigmaHad = candidate.tpcNSigmaPi(); - } else if (setting_HadPDGCode == 2212) { + } else if (settingHadPDGCode == PDG_t::kProton) { tpcNSigmaHad = candidate.tpcNSigmaPr(); } else { LOG(info) << "invalid PDG code for TPC"; @@ -419,10 +426,10 @@ struct he3hadronfemto { template float computeTOFNSigmaHadron(const Ttrack& candidate) { - float tofNSigmaHad = 0; - if (setting_HadPDGCode == 211) { + float tofNSigmaHad = CommonInite; + if (settingHadPDGCode == PDG_t::kPiPlus) { tofNSigmaHad = candidate.tofNSigmaPi(); - } else if (setting_HadPDGCode == 2212) { + } else if (settingHadPDGCode == PDG_t::kProton) { tofNSigmaHad = candidate.tofNSigmaPr(); } else { LOG(info) << "invalid PDG code for TOF"; @@ -434,22 +441,22 @@ struct he3hadronfemto { bool selectionPIDHadron(const Ttrack& candidate) { auto tpcNSigmaHad = computeTPCNSigmaHadron(candidate); - m_qaRegistry.fill(HIST("h2NsigmaHadronTPC_preselection"), candidate.tpcInnerParam(), tpcNSigmaHad); - if (candidate.hasTOF() && candidate.pt() > setting_cutPtMinTOFHad) { + mQaRegistry.fill(HIST("h2NsigmaHadronTPC_preselection"), candidate.tpcInnerParam(), tpcNSigmaHad); + if (candidate.hasTOF() && candidate.pt() > settingCutPtMinTOFHad) { auto tofNSigmaHad = computeTOFNSigmaHadron(candidate); - if (std::abs(tpcNSigmaHad) > setting_cutNsigmaTPC) { + if (std::abs(tpcNSigmaHad) > settingCutNsigmaTPC) { return false; } - m_qaRegistry.fill(HIST("h2NsigmaHadronTOF_preselection"), candidate.pt(), tofNSigmaHad); - if (std::abs(tofNSigmaHad) > setting_cutNsigmaTOF) { + mQaRegistry.fill(HIST("h2NsigmaHadronTOF_preselection"), candidate.pt(), tofNSigmaHad); + if (std::abs(tofNSigmaHad) > settingCutNsigmaTOF) { return false; } - m_qaRegistry.fill(HIST("h2NsigmaHadronTPC"), candidate.pt(), tpcNSigmaHad); - m_qaRegistry.fill(HIST("h2NsigmaHadronTOF"), candidate.pt(), tofNSigmaHad); + mQaRegistry.fill(HIST("h2NsigmaHadronTPC"), candidate.pt(), tpcNSigmaHad); + mQaRegistry.fill(HIST("h2NsigmaHadronTOF"), candidate.pt(), tofNSigmaHad); return true; - } else if (std::abs(tpcNSigmaHad) < setting_cutNsigmaTPC) { - m_qaRegistry.fill(HIST("h2NsigmaHadronTPC"), candidate.pt(), tpcNSigmaHad); + } else if (std::abs(tpcNSigmaHad) < settingCutNsigmaTPC) { + mQaRegistry.fill(HIST("h2NsigmaHadronTPC"), candidate.pt(), tpcNSigmaHad); return true; } return false; @@ -459,10 +466,10 @@ struct he3hadronfemto { float computeNSigmaHe3(const Ttrack& candidate) { bool heliumPID = candidate.pidForTracking() == o2::track::PID::Helium3 || candidate.pidForTracking() == o2::track::PID::Alpha; - float correctedTPCinnerParam = (heliumPID && setting_compensatePIDinTracking) ? candidate.tpcInnerParam() / 2.f : candidate.tpcInnerParam(); - float expTPCSignal = o2::tpc::BetheBlochAleph(static_cast(correctedTPCinnerParam * 2.f / constants::physics::MassHelium3), m_BBparamsHe[0], m_BBparamsHe[1], m_BBparamsHe[2], m_BBparamsHe[3], m_BBparamsHe[4]); + float correctedTPCinnerParam = (heliumPID && settingCompensatePIDinTracking) ? candidate.tpcInnerParam() / 2.f : candidate.tpcInnerParam(); + float expTPCSignal = o2::tpc::BetheBlochAleph(static_cast(correctedTPCinnerParam * 2.f / constants::physics::MassHelium3), mBBparamsHe[0], mBBparamsHe[1], mBBparamsHe[2], mBBparamsHe[3], mBBparamsHe[4]); - double resoTPC{expTPCSignal * m_BBparamsHe[5]}; + double resoTPC{expTPCSignal * mBBparamsHe[5]}; return static_cast((candidate.tpcSignal() - expTPCSignal) / resoTPC); } @@ -470,43 +477,44 @@ struct he3hadronfemto { bool selectionPIDHe3(const Ttrack& candidate) { bool heliumPID = candidate.pidForTracking() == o2::track::PID::Helium3 || candidate.pidForTracking() == o2::track::PID::Alpha; - float correctedTPCinnerParam = (heliumPID && setting_compensatePIDinTracking) ? candidate.tpcInnerParam() / 2.f : candidate.tpcInnerParam(); + float correctedTPCinnerParam = (heliumPID && settingCompensatePIDinTracking) ? candidate.tpcInnerParam() / 2.f : candidate.tpcInnerParam(); - if (correctedTPCinnerParam < setting_cutRigidityMinHe3) { + if (correctedTPCinnerParam < settingCutRigidityMinHe3) { return false; } auto nSigmaHe3 = computeNSigmaHe3(candidate); - m_qaRegistry.fill(HIST("h2NsigmaHe3TPC_preselection"), candidate.sign() * 2 * candidate.pt(), nSigmaHe3); - if (std::abs(nSigmaHe3) > setting_cutNsigmaTPC) { + mQaRegistry.fill(HIST("h2NsigmaHe3TPC_preselection"), candidate.sign() * 2 * candidate.pt(), nSigmaHe3); + if (std::abs(nSigmaHe3) > settingCutNsigmaTPC) { return false; } // - o2::aod::ITSResponse m_responseITS; - auto ITSnSigmaHe3 = m_responseITS.nSigmaITS(candidate.itsClusterSizes(), 2 * candidate.p(), candidate.eta()); + o2::aod::ITSResponse mResponseITS; + auto itsNsigmaHe3 = mResponseITS.nSigmaITS(candidate.itsClusterSizes(), 2 * candidate.p(), candidate.eta()); // - m_qaRegistry.fill(HIST("h2NSigmaHe3ITS_preselection"), candidate.sign() * 2 * candidate.pt(), ITSnSigmaHe3); - if (ITSnSigmaHe3 < setting_cutNsigmaITS) { + mQaRegistry.fill(HIST("h2NSigmaHe3ITS_preselection"), candidate.sign() * 2 * candidate.pt(), itsNsigmaHe3); + if (itsNsigmaHe3 < settingCutNsigmaITS) { return false; } - m_qaRegistry.fill(HIST("h2dEdxHe3candidates"), candidate.sign() * correctedTPCinnerParam, candidate.tpcSignal()); - m_qaRegistry.fill(HIST("h2NsigmaHe3TPC"), candidate.sign() * 2 * candidate.pt(), nSigmaHe3); - m_qaRegistry.fill(HIST("h2NSigmaHe3ITS"), candidate.sign() * 2 * candidate.pt(), ITSnSigmaHe3); + mQaRegistry.fill(HIST("h2dEdxHe3candidates"), candidate.sign() * correctedTPCinnerParam, candidate.tpcSignal()); + mQaRegistry.fill(HIST("h2NsigmaHe3TPC"), candidate.sign() * 2 * candidate.pt(), nSigmaHe3); + mQaRegistry.fill(HIST("h2NSigmaHe3ITS"), candidate.sign() * 2 * candidate.pt(), itsNsigmaHe3); return true; } // ================================================================================================================== template - bool fillCandidateInfo(const Ttrack& trackHe3, const Ttrack& trackHad, const CollBracket& collBracket, const Tcollisions& collisions, he3HadCandidate& he3Hadcand, const Ttracks& /*trackTable*/, bool isMixedEvent) + bool fillCandidateInfo(const Ttrack& trackHe3, const Ttrack& trackHad, const CollBracket& collBracket, const Tcollisions& collisions, He3HadCandidate& he3Hadcand, const Ttracks& /*trackTable*/, bool isMixedEvent) { + const int numCoordinates = 3; if (!isMixedEvent) { auto trackCovHe3 = getTrackParCov(trackHe3); auto trackCovHad = getTrackParCov(trackHad); - int nCand = 0; + int nCand = CommonInite; try { - nCand = m_fitter.process(trackCovHe3, trackCovHad); + nCand = mFitter.process(trackCovHe3, trackCovHad); } catch (...) { LOG(error) << "Exception caught in DCA fitter process call!"; return false; @@ -518,14 +526,14 @@ struct he3hadronfemto { // associate collision id as the one that minimises the distance between the vertex and the PCAs of the daughters double distanceMin = -1; unsigned int collIdxMin = 0; - + const float defaultTodistance = 0.0f; for (int collIdx = collBracket.getMin(); collIdx <= collBracket.getMax(); collIdx++) { auto collision = collisions.rawIteratorAt(collIdx); std::array collVtx = {collision.posX(), collision.posY(), collision.posZ()}; - const auto& PCA = m_fitter.getPCACandidate(); - float distance = 0; - for (int i = 0; i < 3; i++) { - distance += (PCA[i] - collVtx[i]) * (PCA[i] - collVtx[i]); + const auto& pca = mFitter.getPCACandidate(); + float distance = defaultTodistance; + for (int i = 0; i < numCoordinates; i++) { + distance += (pca[i] - collVtx[i]) * (pca[i] - collVtx[i]); } if (distanceMin < 0 || distance < distanceMin) { distanceMin = distance; @@ -533,7 +541,7 @@ struct he3hadronfemto { } } - if (!m_goodCollisions[collIdxMin]) { + if (!mGoodCollisions[collIdxMin]) { return false; } he3Hadcand.collisionID = collIdxMin; @@ -543,47 +551,37 @@ struct he3hadronfemto { } he3Hadcand.momHe3 = std::array{trackHe3.px(), trackHe3.py(), trackHe3.pz()}; - for (int i = 0; i < 3; i++) + for (int i = 0; i < numCoordinates; i++) he3Hadcand.momHe3[i] = he3Hadcand.momHe3[i] * 2; he3Hadcand.momHad = std::array{trackHad.px(), trackHad.py(), trackHad.pz()}; - float invMass = 0; - if (setting_HadPDGCode == 211) { + float invMass = CommonInite; + if (settingHadPDGCode == PDG_t::kPiPlus) { invMass = RecoDecay::m(std::array{he3Hadcand.momHe3, he3Hadcand.momHad}, std::array{o2::constants::physics::MassHelium3, o2::constants::physics::MassPiPlus}); - } else if (setting_HadPDGCode == 2212) { + } else if (settingHadPDGCode == PDG_t::kProton) { invMass = RecoDecay::m(std::array{he3Hadcand.momHe3, he3Hadcand.momHad}, std::array{o2::constants::physics::MassHelium3, o2::constants::physics::MassProton}); } else { LOG(info) << "invalid PDG code for invMass"; } // float invMass = RecoDecay::m(std::array{he3Hadcand.momHe3, he3Hadcand.momHad}, std::array{o2::constants::physics::MassHelium3, o2::constants::physics::MassPiPlus}); - if (setting_cutInvMass > 0 && invMass > setting_cutInvMass) { + if (settingCutInvMass > 0 && invMass > settingCutInvMass) { return false; } float pthe3Had = std::hypot(he3Hadcand.momHe3[0] + he3Hadcand.momHad[0], he3Hadcand.momHe3[1] + he3Hadcand.momHad[1]); - if (pthe3Had < setting_cutPtMinhe3Had) { + if (pthe3Had < settingCutPtMinhe3Had) { return false; } he3Hadcand.signHe3 = trackHe3.sign(); he3Hadcand.signHad = trackHad.sign(); - gpu::gpustd::array dcaInfo; - if (setting_enableDCAfitter) { - auto trackCovHe3 = getTrackParCov(trackHe3); - auto trackCovHad = getTrackParCov(trackHad); - auto collision = collisions.rawIteratorAt(he3Hadcand.collisionID); - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackCovHe3, 2.f, m_fitter.getMatCorrType(), &dcaInfo); - he3Hadcand.DCAxyHe3 = dcaInfo[0]; - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackCovHad, 2.f, m_fitter.getMatCorrType(), &dcaInfo); - he3Hadcand.DCAxyHad = dcaInfo[0]; - } else { - he3Hadcand.DCAxyHe3 = trackHe3.dcaXY(); - he3Hadcand.DCAxyHad = trackHad.dcaXY(); - } - he3Hadcand.DCAzHe3 = trackHe3.dcaZ(); - he3Hadcand.DCAzHad = trackHad.dcaZ(); + he3Hadcand.dcaxyHe3 = trackHe3.dcaXY(); + he3Hadcand.dcaxyHad = trackHad.dcaXY(); + he3Hadcand.dcazHe3 = trackHe3.dcaZ(); + he3Hadcand.dcazHad = trackHad.dcaZ(); + he3Hadcand.tpcSignalHe3 = trackHe3.tpcSignal(); bool heliumPID = trackHe3.pidForTracking() == o2::track::PID::Helium3 || trackHe3.pidForTracking() == o2::track::PID::Alpha; - float correctedTPCinnerParamHe3 = (heliumPID && setting_compensatePIDinTracking) ? trackHe3.tpcInnerParam() / 2.f : trackHe3.tpcInnerParam(); + float correctedTPCinnerParamHe3 = (heliumPID && settingCompensatePIDinTracking) ? trackHe3.tpcInnerParam() / 2.f : trackHe3.tpcInnerParam(); he3Hadcand.momHe3TPC = correctedTPCinnerParamHe3; he3Hadcand.tpcSignalHad = trackHad.tpcSignal(); he3Hadcand.momHadTPC = trackHad.tpcInnerParam(); @@ -595,16 +593,16 @@ struct he3hadronfemto { he3Hadcand.chi2TPCHe3 = trackHe3.tpcChi2NCl(); he3Hadcand.chi2TPCHad = trackHad.tpcChi2NCl(); - he3Hadcand.PIDtrkHe3 = trackHe3.pidForTracking(); - he3Hadcand.PIDtrkHad = trackHad.pidForTracking(); + he3Hadcand.pidtrkHe3 = trackHe3.pidForTracking(); + he3Hadcand.pidtrkHad = trackHad.pidForTracking(); he3Hadcand.itsClSizeHe3 = trackHe3.itsClusterSizes(); he3Hadcand.itsClSizeHad = trackHad.itsClusterSizes(); - he3Hadcand.NClsITSHe3 = trackHe3.itsNCls(); - he3Hadcand.NClsITSHad = trackHad.itsNCls(); - he3Hadcand.Chi2NClITSHe3 = trackHe3.itsChi2NCl(); - he3Hadcand.Chi2NClITSHad = trackHad.itsChi2NCl(); + he3Hadcand.nclsITSHe3 = trackHe3.itsNCls(); + he3Hadcand.nclsITSHad = trackHad.itsNCls(); + he3Hadcand.chi2nclITSHe3 = trackHe3.itsChi2NCl(); + he3Hadcand.chi2nclITSHad = trackHad.itsChi2NCl(); he3Hadcand.sharedClustersHe3 = trackHe3.tpcNClsShared(); he3Hadcand.sharedClustersHad = trackHad.tpcNClsShared(); @@ -621,7 +619,7 @@ struct he3hadronfemto { float beta = o2::pid::tof::Beta::GetBeta(trackHe3); beta = std::min(1.f - 1.e-6f, std::max(1.e-4f, beta)); /// sometimes beta > 1 or < 0, to be checked bool heliumPID = trackHe3.pidForTracking() == o2::track::PID::Helium3 || trackHe3.pidForTracking() == o2::track::PID::Alpha; - float correctedTPCinnerParamHe3 = (heliumPID && setting_compensatePIDinTracking) ? trackHe3.tpcInnerParam() / 2.f : trackHe3.tpcInnerParam(); + float correctedTPCinnerParamHe3 = (heliumPID && settingCompensatePIDinTracking) ? trackHe3.tpcInnerParam() / 2.f : trackHe3.tpcInnerParam(); he3Hadcand.massTOFHe3 = correctedTPCinnerParamHe3 * 2.f * std::sqrt(1.f / (beta * beta) - 1.f); } if (trackHad.hasTOF()) { @@ -634,7 +632,7 @@ struct he3hadronfemto { } template - void fillCandidateInfoMC(const Mc& mctrackHe3, const Mc& mctrackHad, const Mc& mctrackMother, he3HadCandidate& he3Hadcand) + void fillCandidateInfoMC(const Mc& mctrackHe3, const Mc& mctrackHad, const Mc& mctrackMother, He3HadCandidate& he3Hadcand) { he3Hadcand.momHe3MC = mctrackHe3.pt() * (mctrackHe3.pdgCode() > 0 ? 1 : -1); he3Hadcand.etaHe3MC = mctrackHe3.eta(); @@ -650,31 +648,31 @@ struct he3hadronfemto { template void pairTracksSameEvent(const Ttrack& tracks) { - for (auto track0 : tracks) { + for (const auto& track0 : tracks) { - m_qaRegistry.fill(HIST("hTrackSel"), Selections::kNoCuts); + mQaRegistry.fill(HIST("hTrackSel"), Selections::kNoCuts); if (!selectTrack(track0)) { continue; } - m_qaRegistry.fill(HIST("hTrackSel"), Selections::kTrackCuts); + mQaRegistry.fill(HIST("hTrackSel"), Selections::kTrackCuts); if (!selectionPIDHe3(track0)) { continue; } - m_qaRegistry.fill(HIST("hTrackSel"), Selections::kPID); + mQaRegistry.fill(HIST("hTrackSel"), Selections::kPID); - for (auto track1 : tracks) { + for (const auto& track1 : tracks) { if (track0 == track1) { continue; } - if (!setting_saveUSandLS) { - if (!setting_enableBkgUS && (track0.sign() * track1.sign() < 0)) { + if (!settingSaveUSandLS) { + if (!settingEnableBkgUS && (track0.sign() * track1.sign() < 0)) { continue; } - if (setting_enableBkgUS && (track0.sign() * track1.sign() > 0)) { + if (settingEnableBkgUS && (track0.sign() * track1.sign() > 0)) { continue; } } @@ -689,7 +687,7 @@ struct he3hadronfemto { const int collIdx = track0.collisionId(); CollBracket collBracket{collIdx, collIdx}; trackPair.collBracket = collBracket; - m_trackPairs.push_back(trackPair); + mTrackPairs.push_back(trackPair); } } } @@ -697,11 +695,11 @@ struct he3hadronfemto { template void pairTracksEventMixing(T& he3Cands, T& hadronCands) { - for (auto& he3Cand : he3Cands) { + for (const auto& he3Cand : he3Cands) { if (!selectTrack(he3Cand) || !selectionPIDHe3(he3Cand)) { continue; } - for (auto& hadronCand : hadronCands) { + for (const auto& hadronCand : hadronCands) { if (!selectTrack(hadronCand) || !selectionPIDHadron(hadronCand)) { continue; } @@ -712,25 +710,25 @@ struct he3hadronfemto { const int collIdx = he3Cand.collisionId(); CollBracket collBracket{collIdx, collIdx}; trackPair.collBracket = collBracket; - m_trackPairs.push_back(trackPair); + mTrackPairs.push_back(trackPair); } } } template - void fillTable(const he3HadCandidate& he3Hadcand, const Tcoll& collision, bool isMC = false) + void fillTable(const He3HadCandidate& he3Hadcand, const Tcoll& collision, bool isMC = false) { - m_outputDataTable( + outputDataTable( he3Hadcand.recoPtHe3(), he3Hadcand.recoEtaHe3(), he3Hadcand.recoPhiHe3(), he3Hadcand.recoPtHad(), he3Hadcand.recoEtaHad(), he3Hadcand.recoPhiHad(), - he3Hadcand.DCAxyHe3, - he3Hadcand.DCAzHe3, - he3Hadcand.DCAxyHad, - he3Hadcand.DCAzHad, + he3Hadcand.dcaxyHe3, + he3Hadcand.dcazHe3, + he3Hadcand.dcaxyHad, + he3Hadcand.dcazHad, he3Hadcand.tpcSignalHe3, he3Hadcand.momHe3TPC, he3Hadcand.tpcSignalHad, @@ -742,8 +740,8 @@ struct he3hadronfemto { he3Hadcand.chi2TPCHad, he3Hadcand.massTOFHe3, he3Hadcand.massTOFHad, - he3Hadcand.PIDtrkHe3, - he3Hadcand.PIDtrkHad, + he3Hadcand.pidtrkHe3, + he3Hadcand.pidtrkHad, he3Hadcand.itsClSizeHe3, he3Hadcand.itsClSizeHad, he3Hadcand.sharedClustersHe3, @@ -751,7 +749,7 @@ struct he3hadronfemto { he3Hadcand.isBkgUS, he3Hadcand.isBkgEM); if (isMC) { - m_outputMCTable( + outputMcTable( he3Hadcand.momHe3MC, he3Hadcand.etaHe3MC, he3Hadcand.phiHe3MC, @@ -761,8 +759,8 @@ struct he3hadronfemto { he3Hadcand.l4PtMC, he3Hadcand.l4MassMC); } - if (setting_fillMultiplicity) { - m_outputMultiplicityTable( + if (settingFillMultiplicity) { + outputMultiplicityTable( collision.globalIndex(), collision.posZ(), collision.numContrib(), @@ -771,17 +769,17 @@ struct he3hadronfemto { } } - void fillHistograms(const he3HadCandidate& he3Hadcand) + void fillHistograms(const He3HadCandidate& he3Hadcand) { - m_qaRegistry.fill(HIST("hHe3Pt"), he3Hadcand.recoPtHe3()); - m_qaRegistry.fill(HIST("hHadronPt"), he3Hadcand.recoPtHad()); - m_qaRegistry.fill(HIST("hhe3HadtInvMass"), he3Hadcand.invMass); - m_qaRegistry.fill(HIST("hDCAxyHe3"), he3Hadcand.DCAxyHe3); - m_qaRegistry.fill(HIST("hDCAzHe3"), he3Hadcand.DCAzHe3); - m_qaRegistry.fill(HIST("hNClsHe3ITS"), he3Hadcand.NClsITSHe3); - m_qaRegistry.fill(HIST("hNClsHadITS"), he3Hadcand.NClsITSHad); - m_qaRegistry.fill(HIST("hChi2NClHe3ITS"), he3Hadcand.Chi2NClITSHe3); - m_qaRegistry.fill(HIST("hChi2NClHadITS"), he3Hadcand.Chi2NClITSHad); + mQaRegistry.fill(HIST("hHe3Pt"), he3Hadcand.recoPtHe3()); + mQaRegistry.fill(HIST("hHadronPt"), he3Hadcand.recoPtHad()); + mQaRegistry.fill(HIST("hhe3HadtInvMass"), he3Hadcand.invMass); + mQaRegistry.fill(HIST("hDCAxyHe3"), he3Hadcand.dcaxyHe3); + mQaRegistry.fill(HIST("hDCAzHe3"), he3Hadcand.dcazHe3); + mQaRegistry.fill(HIST("hNClsHe3ITS"), he3Hadcand.nclsITSHe3); + mQaRegistry.fill(HIST("hNClsHadITS"), he3Hadcand.nclsITSHad); + mQaRegistry.fill(HIST("hChi2NClHe3ITS"), he3Hadcand.chi2nclITSHe3); + mQaRegistry.fill(HIST("hChi2NClHadITS"), he3Hadcand.chi2nclITSHad); } // ================================================================================================================== @@ -789,13 +787,13 @@ struct he3hadronfemto { template void fillPairs(const Tcollisions& collisions, const Ttracks& tracks, const bool isMixedEvent) { - for (auto& trackPair : m_trackPairs) { + for (const auto& trackPair : mTrackPairs) { auto heTrack = tracks.rawIteratorAt(trackPair.tr0Idx); auto hadTrack = tracks.rawIteratorAt(trackPair.tr1Idx); auto collBracket = trackPair.collBracket; - he3HadCandidate he3Hadcand; + He3HadCandidate he3Hadcand; if (!fillCandidateInfo(heTrack, hadTrack, collBracket, collisions, he3Hadcand, tracks, isMixedEvent)) { continue; } @@ -808,9 +806,9 @@ struct he3hadronfemto { template void fillMcParticles(const Tcollisions& collisions, const TmcParticles& mcParticles, std::vector& filledMothers) { - for (auto& mcParticle : mcParticles) { + for (const auto& mcParticle : mcParticles) { - if (std::abs(mcParticle.pdgCode()) != li4PDG || std::abs(mcParticle.y()) > 1 || mcParticle.isPhysicalPrimary() == false) { + if (std::abs(mcParticle.pdgCode()) != Li4PDG || std::abs(mcParticle.y()) > 1 || mcParticle.isPhysicalPrimary() == false) { continue; } @@ -821,17 +819,17 @@ struct he3hadronfemto { auto kDaughters = mcParticle.template daughters_as(); bool daughtHe3(false), daughtHad(false); McIter mcHe3, mcHad; - for (auto kCurrentDaughter : kDaughters) { - if (std::abs(kCurrentDaughter.pdgCode()) == hePDG) { + for (const auto& kCurrentDaughter : kDaughters) { + if (std::abs(kCurrentDaughter.pdgCode()) == He3PDG) { daughtHe3 = true; mcHe3 = kCurrentDaughter; - } else if (std::abs(kCurrentDaughter.pdgCode()) == prPDG) { + } else if (std::abs(kCurrentDaughter.pdgCode()) == ProtonPDG) { daughtHad = true; mcHad = kCurrentDaughter; } } if (daughtHe3 && daughtHad) { - he3HadCandidate he3Hadcand; + He3HadCandidate he3Hadcand; fillCandidateInfoMC(mcHe3, mcHad, mcParticle, he3Hadcand); auto collision = collisions.rawIteratorAt(he3Hadcand.collisionID); fillTable(he3Hadcand, collision, /*isMC*/ true); @@ -843,45 +841,45 @@ struct he3hadronfemto { void processSameEvent(const CollisionsFull& collisions, const TrackCandidates& tracks, const aod::BCsWithTimestamps& bcs) { - m_goodCollisions.clear(); - m_goodCollisions.resize(collisions.size(), false); + mGoodCollisions.clear(); + mGoodCollisions.resize(collisions.size(), false); - for (auto& collision : collisions) { + for (const auto& collision : collisions) { - m_trackPairs.clear(); + mTrackPairs.clear(); if (!selectCollision(collision, bcs)) { continue; } - m_goodCollisions[collision.globalIndex()] = true; + mGoodCollisions[collision.globalIndex()] = true; const uint64_t collIdx = collision.globalIndex(); - auto TrackTable_thisCollision = tracks.sliceBy(m_perCol, collIdx); - TrackTable_thisCollision.bindExternalIndices(&tracks); + auto trackTableThisCollision = tracks.sliceBy(mPerCol, collIdx); + trackTableThisCollision.bindExternalIndices(&tracks); - pairTracksSameEvent(TrackTable_thisCollision); + pairTracksSameEvent(trackTableThisCollision); - if (m_trackPairs.size() == 0) { + if (mTrackPairs.size() == 0) { continue; } fillPairs(collisions, tracks, /*isMixedEvent*/ false); } } - PROCESS_SWITCH(he3hadronfemto, processSameEvent, "Process Same event", false); + PROCESS_SWITCH(he3HadronFemto, processSameEvent, "Process Same event", false); void processMixedEvent(const CollisionsFull& collisions, const TrackCandidates& tracks) { LOG(debug) << "Processing mixed event"; - m_trackPairs.clear(); + mTrackPairs.clear(); - for (auto& [c1, tracks1, c2, tracks2] : m_pair) { + for (const auto& [c1, tracks1, c2, tracks2] : mPair) { if (!c1.sel8() || !c2.sel8()) { continue; } - m_qaRegistry.fill(HIST("hNcontributor"), c1.numContrib()); - m_qaRegistry.fill(HIST("hVtxZ"), c1.posZ()); + mQaRegistry.fill(HIST("hNcontributor"), c1.numContrib()); + mQaRegistry.fill(HIST("hVtxZ"), c1.posZ()); pairTracksEventMixing(tracks1, tracks2); pairTracksEventMixing(tracks2, tracks1); @@ -889,31 +887,31 @@ struct he3hadronfemto { fillPairs(collisions, tracks, /*isMixedEvent*/ true); } - PROCESS_SWITCH(he3hadronfemto, processMixedEvent, "Process Mixed event", false); + PROCESS_SWITCH(he3HadronFemto, processMixedEvent, "Process Mixed event", false); void processMC(const CollisionsFullMC& collisions, const aod::BCsWithTimestamps& bcs, const TrackCandidatesMC& tracks, const aod::McParticles& mcParticles) { std::vector filledMothers; - m_goodCollisions.clear(); - m_goodCollisions.resize(collisions.size(), false); + mGoodCollisions.clear(); + mGoodCollisions.resize(collisions.size(), false); - for (auto& collision : collisions) { + for (const auto& collision : collisions) { - m_trackPairs.clear(); + mTrackPairs.clear(); if (!selectCollision(collision, bcs)) { continue; } const uint64_t collIdx = collision.globalIndex(); - m_goodCollisions[collIdx] = true; - auto TrackTable_thisCollision = tracks.sliceBy(m_perColMC, collIdx); - TrackTable_thisCollision.bindExternalIndices(&tracks); + mGoodCollisions[collIdx] = true; + auto trackTableThisCollision = tracks.sliceBy(mPerColMC, collIdx); + trackTableThisCollision.bindExternalIndices(&tracks); - pairTracksSameEvent(TrackTable_thisCollision); + pairTracksSameEvent(trackTableThisCollision); - for (auto& trackPair : m_trackPairs) { + for (const auto& trackPair : mTrackPairs) { auto heTrack = tracks.rawIteratorAt(trackPair.tr0Idx); auto prTrack = tracks.rawIteratorAt(trackPair.tr1Idx); @@ -926,18 +924,18 @@ struct he3hadronfemto { auto mctrackHe3 = heTrack.mcParticle(); auto mctrackHad = prTrack.mcParticle(); - if (std::abs(mctrackHe3.pdgCode()) != hePDG || std::abs(mctrackHad.pdgCode()) != prPDG) { + if (std::abs(mctrackHe3.pdgCode()) != He3PDG || std::abs(mctrackHad.pdgCode()) != ProtonPDG) { continue; } - for (auto& mothertrack : mctrackHe3.mothers_as()) { - for (auto& mothertrackHad : mctrackHad.mothers_as()) { + for (const auto& mothertrack : mctrackHe3.mothers_as()) { + for (const auto& mothertrackHad : mctrackHad.mothers_as()) { - if (mothertrack != mothertrackHad || std::abs(mothertrack.pdgCode()) != li4PDG || std::abs(mothertrack.y()) > 1) { + if (mothertrack != mothertrackHad || std::abs(mothertrack.pdgCode()) != Li4PDG || std::abs(mothertrack.y()) > 1) { continue; } - he3HadCandidate he3Hadcand; + He3HadCandidate he3Hadcand; if (!fillCandidateInfo(heTrack, prTrack, collBracket, collisions, he3Hadcand, tracks, /*mix*/ false)) { continue; } @@ -953,94 +951,94 @@ struct he3hadronfemto { fillMcParticles(collisions, mcParticles, filledMothers); } - PROCESS_SWITCH(he3hadronfemto, processMC, "Process MC", false); + PROCESS_SWITCH(he3HadronFemto, processMC, "Process MC", false); void processSameEventPools(const CollisionsFull& collisions, const TrackCandidates& tracks, const aod::AmbiguousTracks& ambiguousTracks, const aod::BCsWithTimestamps& bcs) { - m_goodCollisions.clear(); - m_goodCollisions.resize(collisions.size(), false); + mGoodCollisions.clear(); + mGoodCollisions.resize(collisions.size(), false); - for (auto& collision : collisions) { + for (const auto& collision : collisions) { if (selectCollision(collision, bcs)) { - m_goodCollisions[collision.globalIndex()] = true; + mGoodCollisions[collision.globalIndex()] = true; } } - m_svPoolCreator.clearPools(); - m_svPoolCreator.fillBC2Coll(collisions, bcs); + mSvPoolCreator.clearPools(); + mSvPoolCreator.fillBC2Coll(collisions, bcs); - for (auto& track : tracks) { + for (const auto& track : tracks) { - m_qaRegistry.fill(HIST("hTrackSel"), Selections::kNoCuts); + mQaRegistry.fill(HIST("hTrackSel"), Selections::kNoCuts); if (!selectTrack(track)) continue; - m_qaRegistry.fill(HIST("hTrackSel"), Selections::kTrackCuts); + mQaRegistry.fill(HIST("hTrackSel"), Selections::kTrackCuts); bool selHad = selectionPIDHadron(track); bool selHe = selectionPIDHe3(track); if ((!selHad && !selHe) || (selHad && selHe)) { continue; } - m_qaRegistry.fill(HIST("hTrackSel"), Selections::kPID); + mQaRegistry.fill(HIST("hTrackSel"), Selections::kPID); - int pdgHypo = selHe ? hePDG : prPDG; + int pdgHypo = selHe ? He3PDG : ProtonPDG; - m_svPoolCreator.appendTrackCand(track, collisions, pdgHypo, ambiguousTracks, bcs); + mSvPoolCreator.appendTrackCand(track, collisions, pdgHypo, ambiguousTracks, bcs); } - m_trackPairs = m_svPoolCreator.getSVCandPool(collisions, true); - if (m_trackPairs.size() == 0) { - m_qaRegistry.fill(HIST("hEmptyPool"), 1); + mTrackPairs = mSvPoolCreator.getSVCandPool(collisions, true); + if (mTrackPairs.size() == 0) { + mQaRegistry.fill(HIST("hEmptyPool"), 1); return; } - m_qaRegistry.fill(HIST("hEmptyPool"), 0); + mQaRegistry.fill(HIST("hEmptyPool"), 0); fillPairs(collisions, tracks, /*isMixedEvent*/ false); } - PROCESS_SWITCH(he3hadronfemto, processSameEventPools, "Process Same event pools", false); + PROCESS_SWITCH(he3HadronFemto, processSameEventPools, "Process Same event pools", false); void processMcPools(const CollisionsFullMC& collisions, const TrackCandidatesMC& tracks, const aod::AmbiguousTracks& ambiguousTracks, const aod::BCsWithTimestamps& bcs, const aod::McParticles& mcParticles, const aod::McTrackLabels& mcTrackLabels) { std::vector filledMothers; - m_goodCollisions.clear(); - m_goodCollisions.resize(collisions.size(), false); + mGoodCollisions.clear(); + mGoodCollisions.resize(collisions.size(), false); - for (auto& collision : collisions) { + for (const auto& collision : collisions) { if (selectCollision(collision, bcs)) { - m_goodCollisions[collision.globalIndex()] = true; + mGoodCollisions[collision.globalIndex()] = true; } } - m_svPoolCreator.clearPools(); - m_svPoolCreator.fillBC2Coll(collisions, bcs); + mSvPoolCreator.clearPools(); + mSvPoolCreator.fillBC2Coll(collisions, bcs); - for (auto& track : tracks) { + for (const auto& track : tracks) { - m_qaRegistry.fill(HIST("hTrackSel"), Selections::kNoCuts); + mQaRegistry.fill(HIST("hTrackSel"), Selections::kNoCuts); if (!selectTrack(track)) continue; - m_qaRegistry.fill(HIST("hTrackSel"), Selections::kTrackCuts); + mQaRegistry.fill(HIST("hTrackSel"), Selections::kTrackCuts); bool selHad = selectionPIDHadron(track); bool selHe = selectionPIDHe3(track); if ((!selHad && !selHe) || (selHad && selHe)) continue; - m_qaRegistry.fill(HIST("hTrackSel"), Selections::kPID); + mQaRegistry.fill(HIST("hTrackSel"), Selections::kPID); - int pdgHypo = selHe ? hePDG : prPDG; + int pdgHypo = selHe ? He3PDG : ProtonPDG; - m_svPoolCreator.appendTrackCand(track, collisions, pdgHypo, ambiguousTracks, bcs); + mSvPoolCreator.appendTrackCand(track, collisions, pdgHypo, ambiguousTracks, bcs); } - auto& svPool = m_svPoolCreator.getSVCandPool(collisions, true); + auto& svPool = mSvPoolCreator.getSVCandPool(collisions, true); if (svPool.size() == 0) { - m_qaRegistry.fill(HIST("hEmptyPool"), 1); + mQaRegistry.fill(HIST("hEmptyPool"), 1); return; } - m_qaRegistry.fill(HIST("hEmptyPool"), 0); + mQaRegistry.fill(HIST("hEmptyPool"), 0); - for (auto& svCand : svPool) { + for (const auto& svCand : svPool) { auto heTrack = tracks.rawIteratorAt(svCand.tr0Idx); auto prTrack = tracks.rawIteratorAt(svCand.tr1Idx); auto heTrackLabel = mcTrackLabels.rawIteratorAt(svCand.tr0Idx); @@ -1054,18 +1052,18 @@ struct he3hadronfemto { auto mctrackHe3 = heTrackLabel.mcParticle_as(); auto mctrackHad = prTrackLabel.mcParticle_as(); - if (std::abs(mctrackHe3.pdgCode()) != hePDG || std::abs(mctrackHad.pdgCode()) != prPDG || !mctrackHe3.has_mothers() || !mctrackHad.has_mothers()) { + if (std::abs(mctrackHe3.pdgCode()) != He3PDG || std::abs(mctrackHad.pdgCode()) != ProtonPDG || !mctrackHe3.has_mothers() || !mctrackHad.has_mothers()) { continue; } - for (auto& mothertrackHe : mctrackHe3.mothers_as()) { - for (auto& mothertrackHad : mctrackHad.mothers_as()) { + for (const auto& mothertrackHe : mctrackHe3.mothers_as()) { + for (const auto& mothertrackHad : mctrackHad.mothers_as()) { - if (mothertrackHe.globalIndex() != mothertrackHad.globalIndex() || std::abs(mothertrackHe.pdgCode()) != li4PDG || std::abs(mothertrackHe.y()) > 1) { + if (mothertrackHe.globalIndex() != mothertrackHad.globalIndex() || std::abs(mothertrackHe.pdgCode()) != Li4PDG || std::abs(mothertrackHe.y()) > 1) { continue; } - he3HadCandidate he3Hadcand; + He3HadCandidate he3Hadcand; if (!fillCandidateInfo(heTrack, prTrack, collBracket, collisions, he3Hadcand, tracks, /*mix*/ false)) { continue; } @@ -1080,11 +1078,11 @@ struct he3hadronfemto { fillMcParticles(collisions, mcParticles, filledMothers); } - PROCESS_SWITCH(he3hadronfemto, processMcPools, "Process MC pools", false); + PROCESS_SWITCH(he3HadronFemto, processMcPools, "Process MC pools", false); }; WorkflowSpec defineDataProcessing(const ConfigContext& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"he3hadronfemto"})}; + adaptAnalysisTask(cfgc)}; } From 9f5562024742d07e14ba541da9f8ae91403f951e Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Sun, 4 May 2025 22:00:22 +0900 Subject: [PATCH 1170/1650] [PWGEM/Dilepton] add a task to study tagging HFE in MC (#11075) --- PWGEM/Dilepton/Tasks/CMakeLists.txt | 5 + PWGEM/Dilepton/Tasks/taggingHFE.cxx | 1136 +++++++++++++++++++++++++++ 2 files changed, 1141 insertions(+) create mode 100644 PWGEM/Dilepton/Tasks/taggingHFE.cxx diff --git a/PWGEM/Dilepton/Tasks/CMakeLists.txt b/PWGEM/Dilepton/Tasks/CMakeLists.txt index ad7efb3c065..2eed697101d 100644 --- a/PWGEM/Dilepton/Tasks/CMakeLists.txt +++ b/PWGEM/Dilepton/Tasks/CMakeLists.txt @@ -141,3 +141,8 @@ o2physics_add_dpl_workflow(matching-mft PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::GlobalTracking COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(tagging-hfe + SOURCES taggingHFE.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2::DCAFitter O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + diff --git a/PWGEM/Dilepton/Tasks/taggingHFE.cxx b/PWGEM/Dilepton/Tasks/taggingHFE.cxx new file mode 100644 index 00000000000..ec24ce8ca63 --- /dev/null +++ b/PWGEM/Dilepton/Tasks/taggingHFE.cxx @@ -0,0 +1,1136 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file taggingHFE.cxx +/// \brief a task to study tagging e from charm hadron decays in MC +/// \author daiki.sekihata@cern.ch + +#include +#include +#include + +#include "Math/Vector4D.h" +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "DetectorsBase/Propagator.h" +#include "DetectorsBase/GeometryManager.h" +#include "DataFormatsParameters/GRPObject.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "DataFormatsCalibration/MeanVertexObject.h" +#include "CCDB/BasicCCDBManager.h" +#include "Common/Core/trackUtilities.h" +#include "CommonConstants/PhysicsConstants.h" +#include "Common/Core/TableHelper.h" +#include "Common/Core/RecoDecay.h" +#include "DCAFitter/DCAFitterN.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" + +#include "Common/DataModel/CollisionAssociationTables.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/PIDResponse.h" +#include "PWGEM/Dilepton/Utils/MCUtilities.h" + +using namespace o2; +using namespace o2::soa; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::constants::physics; + +struct taggingHFE { + using MyCollisions = soa::Join; + + using MyTracks = soa::Join; + + using MyV0s = soa::Join; + + // Configurables + Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; + Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; + Configurable mVtxPath{"mVtxPath", "GLO/Calib/MeanVertex", "Path of the mean vertex file"}; + Configurable skipGRPOquery{"skipGRPOquery", true, "skip grpo query"}; + Configurable d_bz_input{"d_bz_input", -999, "bz field in kG, -999 is automatic"}; + Configurable d_UseAbsDCA{"d_UseAbsDCA", true, "Use Abs DCAs"}; + Configurable d_UseWeightedPCA{"d_UseWeightedPCA", false, "Vertices use cov matrices"}; + + struct : ConfigurableGroup { + std::string prefix = "trackcut_group"; + Configurable cfg_min_pt_track{"cfg_min_pt_track", 0.05, "min pT for single track"}; + Configurable cfg_max_pt_track{"cfg_max_pt_track", 1e+10, "max pT for single track"}; + Configurable cfg_min_eta_track{"cfg_min_eta_track", -0.9, "min eta for single track"}; + Configurable cfg_max_eta_track{"cfg_max_eta_track", +0.9, "max eta for single track"}; + Configurable cfg_min_eta_track_wide{"cfg_min_eta_track_wide", -1.2, "min eta for single track (tagger)"}; + Configurable cfg_max_eta_track_wide{"cfg_max_eta_track_wide", +1.2, "max eta for single track (tagger)"}; + Configurable cfg_min_cr2findable_ratio_tpc{"cfg_min_cr2findable_ratio_tpc", 0.8, "min. TPC Ncr/Nf ratio"}; + Configurable cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 0.7, "max fraction of shared clusters in TPC"}; + Configurable cfg_min_ncrossedrows_tpc{"cfg_min_ncrossedrows_tpc", 70, "min ncrossed rows"}; + Configurable cfg_min_ncluster_tpc{"cfg_min_ncluster_tpc", 0, "min ncluster tpc"}; + Configurable cfg_min_ncluster_its{"cfg_min_ncluster_its", 5, "min ncluster its"}; + Configurable cfg_min_ncluster_itsib{"cfg_min_ncluster_itsib", 1, "min ncluster itsib"}; + Configurable cfg_max_chi2tpc{"cfg_max_chi2tpc", 4.0, "max chi2/NclsTPC"}; + Configurable cfg_max_chi2its{"cfg_max_chi2its", 5.0, "max chi2/NclsITS"}; + Configurable cfg_max_chi2tof{"cfg_max_chi2tof", 1e+10, "max chi2/NclsTOF"}; + Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 0.3, "max dca XY for single track in cm"}; + Configurable cfg_max_dcaz{"cfg_max_dcaz", 0.3, "max dca Z for single track in cm"}; + + Configurable cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -3, "min n sigma e in TPC"}; + Configurable cfg_max_TPCNsigmaEl{"cfg_max_TPCNsigmaEl", +3, "max n sigma e in TPC"}; + Configurable cfg_min_TPCNsigmaPi{"cfg_min_TPCNsigmaPi", -3, "min n sigma pi in TPC"}; + Configurable cfg_max_TPCNsigmaPi{"cfg_max_TPCNsigmaPi", +3, "max n sigma pi in TPC"}; + Configurable cfg_min_TPCNsigmaKa{"cfg_min_TPCNsigmaKa", -3, "min n sigma ka in TPC"}; + Configurable cfg_max_TPCNsigmaKa{"cfg_max_TPCNsigmaKa", +3, "max n sigma ka in TPC"}; + Configurable cfg_min_TPCNsigmaPr{"cfg_min_TPCNsigmaPr", -3, "min n sigma pr in TPC"}; + Configurable cfg_max_TPCNsigmaPr{"cfg_max_TPCNsigmaPr", +3, "max n sigma pr in TPC"}; + + Configurable cfg_min_TOFNsigmaEl{"cfg_min_TOFNsigmaEl", -3, "min n sigma el in TOF"}; + Configurable cfg_max_TOFNsigmaEl{"cfg_max_TOFNsigmaEl", +3, "max n sigma el in TOF"}; + Configurable cfg_min_TOFNsigmaPi{"cfg_min_TOFNsigmaPi", -3, "min n sigma pi in TOF"}; + Configurable cfg_max_TOFNsigmaPi{"cfg_max_TOFNsigmaPi", +3, "max n sigma pi in TOF"}; + Configurable cfg_min_TOFNsigmaKa{"cfg_min_TOFNsigmaKa", -3, "min n sigma ka in TOF"}; + Configurable cfg_max_TOFNsigmaKa{"cfg_max_TOFNsigmaKa", +3, "max n sigma ka in TOF"}; + Configurable cfg_min_TOFNsigmaPr{"cfg_min_TOFNsigmaPr", -3, "min n sigma pr in TOF"}; + Configurable cfg_max_TOFNsigmaPr{"cfg_max_TOFNsigmaPr", +3, "max n sigma pr in TOF"}; + } trackcuts; + + struct : ConfigurableGroup { + std::string prefix = "svcut_group"; + Configurable cfg_min_cospa{"cfg_min_cospa", 0.8, "min cospa"}; + Configurable cfg_min_cospaXY{"cfg_min_cospaXY", 0.0, "min cospaXY"}; + Configurable cfg_max_dca2legs{"cfg_max_dca2legs", 1.0, "max distance between 2 legs"}; + Configurable cfg_min_lxy{"cfg_min_lxy", -1, "min lxy for charm hadron candidate"}; + Configurable cfg_max_mass_eK{"cfg_max_mass_eK", 2.0, "max mass for eK pair"}; + Configurable cfg_max_mass_eL{"cfg_max_mass_eL", 2.3, "max mass for eL pair"}; + } svcuts; + + struct : ConfigurableGroup { + std::string prefix = "v0cut_group"; + Configurable cfg_min_mass_k0s{"cfg_min_mass_k0s", 0.49, "min mass for K0S"}; + Configurable cfg_max_mass_k0s{"cfg_max_mass_k0s", 0.51, "max mass for K0S"}; + Configurable cfg_min_mass_lambda{"cfg_min_mass_lambda", 1.11, "min mass for Lambda rejection"}; + Configurable cfg_max_mass_lambda{"cfg_max_mass_lambda", 1.12, "max mass for Lambda rejection"}; + Configurable cfg_min_cospa_v0hadron{"cfg_min_cospa_v0hadron", 0.95, "min cospa for v0hadron"}; + Configurable cfg_max_pca_v0hadron{"cfg_max_pca_v0hadron", 0.5, "max distance between 2 legs for v0hadron"}; + // Configurable cfg_min_radius_v0hadron{"cfg_min_radius_v0hadron", 0.1, "min rxy for v0hadron"}; + Configurable cfg_min_cr2findable_ratio_tpc{"cfg_min_cr2findable_ratio_tpc", 0.8, "min. TPC Ncr/Nf ratio"}; + Configurable cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 999.f, "max fraction of shared clusters in TPC"}; + Configurable cfg_min_ncrossedrows_tpc{"cfg_min_ncrossedrows_tpc", 40, "min ncrossed rows"}; + Configurable cfg_min_ncluster_tpc{"cfg_min_ncluster_tpc", 0, "min ncluster tpc"}; + Configurable cfg_max_chi2tpc{"cfg_max_chi2tpc", 4.0, "max chi2/NclsTPC"}; + Configurable cfg_max_chi2its{"cfg_max_chi2its", 5.0, "max chi2/NclsITS"}; + Configurable cfg_min_ncluster_its{"cfg_min_ncluster_its", 4, "min ncluster its"}; + Configurable cfg_min_ncluster_itsib{"cfg_min_ncluster_itsib", 1, "min ncluster itsib"}; + Configurable cfg_max_chi2tof{"cfg_max_chi2tof", 1e+10, "max chi2 for TOF"}; + Configurable cfg_min_dcaxy{"cfg_min_dcaxy", -1, "min dca XY for v0 legs in cm"}; + Configurable cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -3, "min n sigma e in TPC"}; + Configurable cfg_max_TPCNsigmaEl{"cfg_max_TPCNsigmaEl", +3, "max n sigma e in TPC"}; + Configurable cfg_min_TPCNsigmaPi{"cfg_min_TPCNsigmaPi", -3, "min n sigma pi in TPC"}; + Configurable cfg_max_TPCNsigmaPi{"cfg_max_TPCNsigmaPi", +3, "max n sigma pi in TPC"}; + Configurable cfg_min_TPCNsigmaKa{"cfg_min_TPCNsigmaKa", -3, "min n sigma ka in TPC"}; + Configurable cfg_max_TPCNsigmaKa{"cfg_max_TPCNsigmaKa", +3, "max n sigma ka in TPC"}; + Configurable cfg_min_TPCNsigmaPr{"cfg_min_TPCNsigmaPr", -3, "min n sigma pr in TPC"}; + Configurable cfg_max_TPCNsigmaPr{"cfg_max_TPCNsigmaPr", +3, "max n sigma pr in TPC"}; + + Configurable cfg_min_TOFNsigmaEl{"cfg_min_TOFNsigmaEl", -3, "min n sigma el in TOF"}; + Configurable cfg_max_TOFNsigmaEl{"cfg_max_TOFNsigmaEl", +3, "max n sigma el in TOF"}; + Configurable cfg_min_TOFNsigmaPi{"cfg_min_TOFNsigmaPi", -3, "min n sigma pi in TOF"}; + Configurable cfg_max_TOFNsigmaPi{"cfg_max_TOFNsigmaPi", +3, "max n sigma pi in TOF"}; + Configurable cfg_min_TOFNsigmaKa{"cfg_min_TOFNsigmaKa", -3, "min n sigma ka in TOF"}; + Configurable cfg_max_TOFNsigmaKa{"cfg_max_TOFNsigmaKa", +3, "max n sigma ka in TOF"}; + Configurable cfg_min_TOFNsigmaPr{"cfg_min_TOFNsigmaPr", -3, "min n sigma pr in TOF"}; + Configurable cfg_max_TOFNsigmaPr{"cfg_max_TOFNsigmaPr", +3, "max n sigma pr in TOF"}; + } v0cuts; + + Configurable cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"}; + Configurable cfgCentMin{"cfgCentMin", -1.f, "min. centrality"}; + Configurable cfgCentMax{"cfgCentMax", 999.f, "max. centrality"}; + Configurable cfgZvtxMin{"cfgZvtxMin", -10.f, "min. Zvtx"}; + Configurable cfgZvtxMax{"cfgZvtxMax", 10.f, "max. Zvtx"}; + + Configurable cfgEventGeneratorType{"cfgEventGeneratorType", -1, "if positive, select event generator type. i.e. gap or signal"}; + + HistogramRegistry fRegistry{"fRegistry"}; + static constexpr std::string_view hadron_names[7] = {"LF/", "promptJpsi/", "nonpromptJpsi/", "D0/", "Dpm/", "Ds/", "Lc/"}; + static constexpr std::string_view pair_names[3] = {"e_Kpm/", "e_K0S/", "e_Lambda/"}; + static constexpr std::string_view hTypes[4] = {"findable/", "correct/", "fake/", "miss/"}; + + void init(o2::framework::InitContext&) + { + if (doprocessSA && doprocessTTCA) { + LOGF(fatal, "Cannot enable doprocessWithoutFTTCA and doprocessWithFTTCA at the same time. Please choose one."); + } + + ccdb->setURL(ccdburl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setFatalWhenNull(false); + + fitter.setPropagateToPCA(true); + fitter.setMaxR(10.f); + fitter.setMinParamChange(1e-3); + fitter.setMinRelChi2Change(0.9); + fitter.setMaxDZIni(1e9); + fitter.setMaxChi2(1e9); + fitter.setUseAbsDCA(d_UseAbsDCA); + fitter.setWeightedFinalPCA(d_UseWeightedPCA); + fitter.setMatCorrType(matCorr); + + addHistograms(); + } + + int mRunNumber; + float d_bz; + Service ccdb; + // o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; + o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT; + o2::dataformats::VertexBase mVtx; + const o2::dataformats::MeanVertexObject* mMeanVtx = nullptr; + o2::base::MatLayerCylSet* lut = nullptr; + o2::vertexing::DCAFitterN<2> fitter; + + void initCCDB(aod::BCsWithTimestamps::iterator const& bc) + { + if (mRunNumber == bc.runNumber()) { + return; + } + + // load matLUT for this timestamp + if (!lut) { + LOG(info) << "Loading material look-up table for timestamp: " << bc.timestamp(); + lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->getForTimeStamp(lutPath, bc.timestamp())); + } else { + LOG(info) << "Material look-up table already in place. Not reloading."; + } + + // In case override, don't proceed, please - no CCDB access required + if (d_bz_input > -990) { + d_bz = d_bz_input; + o2::parameters::GRPMagField grpmag; + if (std::fabs(d_bz) > 1e-5) { + grpmag.setL3Current(30000.f / (d_bz / 5.0f)); + } + o2::base::Propagator::initFieldFromGRP(&grpmag); + o2::base::Propagator::Instance()->setMatLUT(lut); + mMeanVtx = ccdb->getForTimeStamp(mVtxPath, bc.timestamp()); + mRunNumber = bc.runNumber(); + return; + } + + auto run3grp_timestamp = bc.timestamp(); + o2::parameters::GRPObject* grpo = 0x0; + o2::parameters::GRPMagField* grpmag = 0x0; + if (!skipGRPOquery) { + grpo = ccdb->getForTimeStamp(grpPath, run3grp_timestamp); + } + if (grpo) { + o2::base::Propagator::initFieldFromGRP(grpo); + o2::base::Propagator::Instance()->setMatLUT(lut); + mMeanVtx = ccdb->getForTimeStamp(mVtxPath, bc.timestamp()); + // Fetch magnetic field from ccdb for current collision + d_bz = grpo->getNominalL3Field(); + LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; + } else { + grpmag = ccdb->getForTimeStamp(grpmagPath, run3grp_timestamp); + if (!grpmag) { + LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for timestamp " << run3grp_timestamp; + } + o2::base::Propagator::initFieldFromGRP(grpmag); + o2::base::Propagator::Instance()->setMatLUT(lut); + mMeanVtx = ccdb->getForTimeStamp(mVtxPath, bc.timestamp()); + + // Fetch magnetic field from ccdb for current collision + d_bz = std::lround(5.f * grpmag->getL3Current() / 30000.f); + LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; + } + mRunNumber = bc.runNumber(); + fitter.setBz(d_bz); + } + + void addHistograms() + { + auto hCollisionCounter = fRegistry.add("Event/hCollisionCounter", "collision counter", kTH1D, {{5, -0.5f, 4.5f}}, false); + hCollisionCounter->GetXaxis()->SetBinLabel(1, "all"); + hCollisionCounter->GetXaxis()->SetBinLabel(2, "accepted"); + + fRegistry.add("Event/hZvtx", "vertex z; Z_{vtx} (cm)", kTH1F, {{100, -50, +50}}, false); + fRegistry.add("Event/hMultNTracksPV", "hMultNTracksPV; N_{track} to PV", kTH1F, {{6001, -0.5, 6000.5}}, false); + fRegistry.add("Event/hMultNTracksPVeta1", "hMultNTracksPVeta1; N_{track} to PV", kTH1F, {{6001, -0.5, 6000.5}}, false); + fRegistry.add("Event/hMultFT0", "hMultFT0;mult. FT0A;mult. FT0C", kTH2F, {{200, 0, 200000}, {60, 0, 60000}}, false); + fRegistry.add("Event/hCentFT0A", "hCentFT0A;centrality FT0A (%)", kTH1F, {{110, 0, 110}}, false); + fRegistry.add("Event/hCentFT0C", "hCentFT0C;centrality FT0C (%)", kTH1F, {{110, 0, 110}}, false); + fRegistry.add("Event/hCentFT0M", "hCentFT0M;centrality FT0M (%)", kTH1F, {{110, 0, 110}}, false); + fRegistry.add("Event/hCentFT0CvsMultNTracksPV", "hCentFT0CvsMultNTracksPV;centrality FT0C (%);N_{track} to PV", kTH2F, {{110, 0, 110}, {600, 0, 6000}}, false); + fRegistry.add("Event/hMultFT0CvsMultNTracksPV", "hMultFT0CvsMultNTracksPV;mult. FT0C;N_{track} to PV", kTH2F, {{60, 0, 60000}, {600, 0, 6000}}, false); + + // for charm hadrons + fRegistry.add("e_Kpm/all/hLxy", "decay length XY from PV;L_{xy} (cm)", kTH1F, {{100, 0, 1}}, false); + fRegistry.add("e_Kpm/all/hLz", "decay length Z from PV;L_{z} (cm)", kTH1F, {{100, 0, 1}}, false); + fRegistry.add("e_Kpm/all/hCosPA", "cosPA;cosine of pointing angle", kTH1F, {{100, 0, 1}}, false); + fRegistry.add("e_Kpm/all/hCosPAXY", "cosPA in XY;cosine of pointing angle in XY", kTH1F, {{100, 0, 1}}, false); + fRegistry.add("e_Kpm/all/hDCA2Legs", "distance between 2 legs;distance between 2 legs (cm)", kTH1F, {{100, 0, 1}}, false); + fRegistry.add("e_Kpm/all/hMass", "mass;mass (GeV/c^{2});p_{T} (GeV/c)", kTH2F, {{40, 0.5, 2.5}, {100, 0, 10}}, false); + + fRegistry.addClone("e_Kpm/all/", "e_Kpm/D0/"); + fRegistry.addClone("e_Kpm/all/", "e_Kpm/Dpm/"); + fRegistry.addClone("e_Kpm/all/", "e_Kpm/Ds/"); + fRegistry.addClone("e_Kpm/all/", "e_Kpm/fake/"); + + fRegistry.addClone("e_Kpm/all/", "e_K0S/all/"); + fRegistry.addClone("e_Kpm/all/", "e_K0S/D0/"); + fRegistry.addClone("e_Kpm/all/", "e_K0S/Dpm/"); + fRegistry.addClone("e_Kpm/all/", "e_K0S/Ds/"); + fRegistry.addClone("e_Kpm/all/", "e_K0S/fake/"); + + fRegistry.addClone("e_Kpm/all/", "e_Lambda/all/"); + fRegistry.addClone("e_Kpm/all/", "e_Lambda/Lc/"); + fRegistry.addClone("e_Kpm/all/", "e_Lambda/fake/"); + + // for V0s + fRegistry.add("V0/K0S/hPt", "pT of V0;p_{T} (GeV/c)", kTH1F, {{100, 0, 10}}, false); + fRegistry.add("V0/K0S/hYPhi", "Y vs. #varphi of V0;#varphi (rad.);rapidity", kTH2F, {{36, 0, 2 * M_PI}, {80, -2, +2}}, false); + fRegistry.add("V0/K0S/hAP", "Ap plot;#alpha;q_{T} (GeV/c)", kTH2F, {{200, -1, 1}, {250, 0, 0.25}}, false); + fRegistry.add("V0/K0S/hLxy", "decay length from PV;L_{xy} (cm)", kTH1F, {{200, 0, 2}}, false); + fRegistry.add("V0/K0S/hCosPA", "cosPA;cosine of pointing angle", kTH1F, {{100, 0.9, 1}}, false); + fRegistry.add("V0/K0S/hDCA2Legs", "distance between 2 legs;distance between 2 legs (cm)", kTH1F, {{100, 0, 1}}, false); + fRegistry.addClone("V0/K0S/", "V0/Lambda/"); + fRegistry.addClone("V0/K0S/", "V0/AntiLambda/"); + fRegistry.add("V0/K0S/hMassK0S", "K0S mass;m_{#pi#pi} (GeV/c^{2})", kTH1F, {{200, 0.4, 0.6}}, false); + fRegistry.add("V0/Lambda/hMassLambda", "Lambda mass;m_{p#pi} (GeV/c^{2})", kTH1F, {{100, 1.08, 1.18}}, false); + fRegistry.add("V0/AntiLambda/hMassAntiLambda", "Anti-Lambda mass;m_{p#pi} (GeV/c^{2})", kTH1F, {{100, 1.08, 1.18}}, false); + + const AxisSpec axis_pt{{0, 0.05, 0.1, 0.15, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 6, 7, 8, 9, 10}, "p_{T,e} (GeV/c)"}; + const AxisSpec axis_dca_sigma{{0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10}, "DCA_{e}^{3D} (#sigma)"}; + + // for tracks + fRegistry.add("LF/electron/findable/hs", "electron;p_{T,e} (GeV/c);#eta_{e};#varphi_{e} (rad.);DCA_{e}^{3D} (#sigma)", kTHnSparseF, {{axis_pt}, {80, -2, +2}, {36, 0, 2 * M_PI}, {axis_dca_sigma}}, false); + fRegistry.add("LF/electron/findable/hTPCdEdx", "TPC dE/dx;p_{in} (GeV/c);TPC dE/dx (a.u.)", kTH2F, {{1000, 0, 10}, {200, 0, 200}}, false); + fRegistry.add("LF/electron/findable/hTOFbeta", "TOF #beta;p_{pv} (GeV/c);#beta", kTH2F, {{1000, 0, 10}, {240, 0, 1.2}}, false); + + fRegistry.addClone("LF/electron/findable/", "LF/electron/correct/"); + fRegistry.addClone("LF/electron/findable/", "LF/electron/fake/"); + fRegistry.addClone("LF/electron/", "promptJpsi/electron/"); + fRegistry.addClone("LF/electron/", "nonpromptJpsi/electron/"); + + fRegistry.addClone("LF/electron/", "D0/electron/"); // D0 -> K- e+ nu, Br = 0.03549 | D0 -> K- e+ pi0 nu, Br = 0.016 | D0 -> K*(892)- e+ nu, Br = 0.0215 // D0 -> anti-K0S e+ pi- nu, Br = 0.0144 + fRegistry.addClone("LF/electron/", "Dpm/electron/"); // D+ -> K- pi+ e+ nu, Br = 0.0402 | D+ -> anti-K*(892)0 e+ nu, Br = 0.0540 // D+ -> anti-K0S e+ nu, Br = 0.0872 + fRegistry.addClone("LF/electron/", "Ds/electron/"); // Ds+ -> K0S e+ nu, Br = 0.0034 // Ds+ -> phi e+ nu, Br = 0.0239 + fRegistry.addClone("LF/electron/", "Lc/electron/"); // Lc+ -> L e+ nu, Br = 0.0356 + } + + template + bool isKaon(TTrack const& track) + { + // TOFif + bool is_ka_included_TPC = trackcuts.cfg_min_TPCNsigmaKa < track.tpcNSigmaKa() && track.tpcNSigmaKa() < trackcuts.cfg_max_TPCNsigmaKa; + bool is_ka_included_TOF = track.hasTOF() ? (trackcuts.cfg_min_TOFNsigmaKa < track.tofNSigmaKa() && track.tofNSigmaKa() < trackcuts.cfg_max_TOFNsigmaKa && track.tofChi2() < trackcuts.cfg_max_chi2tof) : true; + return is_ka_included_TPC && is_ka_included_TOF; + } + + template + bool isPion(TTrack const& track) + { + // TOFif + bool is_pi_included_TPC = v0cuts.cfg_min_TPCNsigmaPi < track.tpcNSigmaPi() && track.tpcNSigmaPi() < v0cuts.cfg_max_TPCNsigmaPi; + bool is_pi_included_TOF = track.hasTOF() ? (v0cuts.cfg_min_TOFNsigmaPi < track.tofNSigmaPi() && track.tofNSigmaPi() < v0cuts.cfg_max_TOFNsigmaPi && track.tofChi2() < v0cuts.cfg_max_chi2tof) : true; + return is_pi_included_TPC && is_pi_included_TOF; + } + + template + bool isProton(TTrack const& track) + { + // TOFif + bool is_pr_included_TPC = v0cuts.cfg_min_TPCNsigmaPr < track.tpcNSigmaPr() && track.tpcNSigmaPr() < v0cuts.cfg_max_TPCNsigmaPr; + bool is_pr_included_TOF = track.hasTOF() ? (v0cuts.cfg_min_TOFNsigmaPr < track.tofNSigmaPr() && track.tofNSigmaPr() < v0cuts.cfg_max_TOFNsigmaPr && track.tofChi2() < v0cuts.cfg_max_chi2tof) : true; + return is_pr_included_TPC && is_pr_included_TOF; + } + + template + bool isSelectedTrack(TTrack const& track, TTrackParCov const& trackParCov, const float dcaXY, const float dcaZ) + { + if (!track.hasITS() || !track.hasTPC()) { + return false; + } + + if (trackParCov.getPt() < trackcuts.cfg_min_pt_track || trackcuts.cfg_max_pt_track < trackParCov.getPt()) { + return false; + } + + if (std::fabs(dcaXY) > trackcuts.cfg_max_dcaxy) { + return false; + } + + if (std::fabs(dcaZ) > trackcuts.cfg_max_dcaz) { + return false; + } + + if (track.itsChi2NCl() > trackcuts.cfg_max_chi2its) { + return false; + } + + if (track.itsNCls() < trackcuts.cfg_min_ncluster_its) { + return false; + } + + if (track.itsNClsInnerBarrel() < trackcuts.cfg_min_ncluster_itsib) { + return false; + } + + if (track.tpcChi2NCl() > trackcuts.cfg_max_chi2tpc) { + return false; + } + + if (track.tpcNClsFound() < trackcuts.cfg_min_ncluster_tpc) { + return false; + } + + if (track.tpcNClsCrossedRows() < trackcuts.cfg_min_ncrossedrows_tpc) { + return false; + } + + if (track.tpcCrossedRowsOverFindableCls() < trackcuts.cfg_min_cr2findable_ratio_tpc) { + return false; + } + + if (track.tpcFractionSharedCls() > trackcuts.cfg_max_frac_shared_clusters_tpc) { + return false; + } + + return true; + } + + template + bool isSelectedV0Leg(TTrack const& track, const float dcaXY) + { + if (!track.hasITS() || !track.hasTPC()) { + return false; + } + + if (std::fabs(dcaXY) < v0cuts.cfg_min_dcaxy) { + return false; + } + + if (track.itsChi2NCl() > v0cuts.cfg_max_chi2its) { + return false; + } + + if (track.itsNCls() < v0cuts.cfg_min_ncluster_its) { + return false; + } + + if (track.itsNClsInnerBarrel() < v0cuts.cfg_min_ncluster_itsib) { + return false; + } + + if (track.tpcChi2NCl() > v0cuts.cfg_max_chi2tpc) { + return false; + } + + if (track.tpcNClsFound() < v0cuts.cfg_min_ncluster_tpc) { + return false; + } + + if (track.tpcNClsCrossedRows() < v0cuts.cfg_min_ncrossedrows_tpc) { + return false; + } + + if (track.tpcCrossedRowsOverFindableCls() < v0cuts.cfg_min_cr2findable_ratio_tpc) { + return false; + } + + if (track.tpcFractionSharedCls() > v0cuts.cfg_max_frac_shared_clusters_tpc) { + return false; + } + + return true; + } + + template + void fillEventHistograms(TCollision const& collision) + { + fRegistry.fill(HIST("Event/hZvtx"), collision.posZ()); + fRegistry.fill(HIST("Event/hMultNTracksPV"), collision.multNTracksPV()); + fRegistry.fill(HIST("Event/hMultNTracksPVeta1"), collision.multNTracksPVeta1()); + fRegistry.fill(HIST("Event/hMultFT0"), collision.multFT0A(), collision.multFT0C()); + fRegistry.fill(HIST("Event/hCentFT0A"), collision.centFT0A()); + fRegistry.fill(HIST("Event/hCentFT0C"), collision.centFT0C()); + fRegistry.fill(HIST("Event/hCentFT0M"), collision.centFT0M()); + fRegistry.fill(HIST("Event/hCentFT0CvsMultNTracksPV"), collision.centFT0C(), collision.multNTracksPV()); + fRegistry.fill(HIST("Event/hMultFT0CvsMultNTracksPV"), collision.multFT0C(), collision.multNTracksPV()); + } + + template + void fillElectronHistograms(TTrack const& track, TTrackParCov const& trackParCov, const float dcaXY, const float dcaZ) + { + float dca3DinSigma = dca3DinSigmaOTF(dcaXY, dcaZ, trackParCov.getSigmaY2(), trackParCov.getSigmaZ2(), trackParCov.getSigmaZY()); + fRegistry.fill(HIST(hadron_names[charmHadronId]) + HIST("electron/") + HIST(hTypes[findId]) + HIST("hs"), trackParCov.getPt(), trackParCov.getEta(), trackParCov.getPhi(), dca3DinSigma); + fRegistry.fill(HIST(hadron_names[charmHadronId]) + HIST("electron/") + HIST(hTypes[findId]) + HIST("hTPCdEdx"), track.tpcInnerParam(), track.tpcSignal()); + fRegistry.fill(HIST(hadron_names[charmHadronId]) + HIST("electron/") + HIST(hTypes[findId]) + HIST("hTOFbeta"), trackParCov.getP(), track.beta()); + } + + float dca3DinSigmaOTF(const float dcaXY, const float dcaZ, const float cYY, const float cZZ, const float cZY) + { + float det = cYY * cZZ - cZY * cZY; // determinant + if (det < 0) { + return 999.f; + } else { + return std::sqrt(std::fabs((dcaXY * dcaXY * cZZ + dcaZ * dcaZ * cYY - 2. * dcaXY * dcaZ * cZY) / det / 2.)); // dca 3d in sigma + } + } + + template + void runPairEandTrack(TCollision const& collision, TElectron const& ele, TTrackIds const& trackIds, TTracks const& tracks, TMCParticles const& mcParticles, TMCCollisions const&) + { + std::array pVtx = {collision.posX(), collision.posY(), collision.posZ()}; + const auto& mcele = ele.template mcParticle_as(); + const auto& mcCollision1 = mcele.template mcCollision_as(); + + if (cfgEventGeneratorType >= 0 && mcCollision1.getSubGeneratorId() != cfgEventGeneratorType) { + return; + } + + o2::dataformats::DCA mDcaInfoCov; + mDcaInfoCov.set(999, 999, 999, 999, 999); + auto eleParCov = getTrackParCov(ele); + eleParCov.setPID(o2::track::PID::Electron); + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, eleParCov, 2.f, matCorr, &mDcaInfoCov); + float dcaXY = mDcaInfoCov.getY(); + float dcaZ = mDcaInfoCov.getZ(); + + for (const auto& trackId : trackIds) { + const auto& track = tracks.rawIteratorAt(trackId); + const auto& mctrack = track.template mcParticle_as(); + const auto& mcCollision2 = mctrack.template mcCollision_as(); + + if (cfgEventGeneratorType >= 0 && mcCollision2.getSubGeneratorId() != cfgEventGeneratorType) { + continue; + } + if (mcCollision1.globalIndex() != mcCollision2.globalIndex()) { + continue; + } + + auto trackParCov = getTrackParCov(track); + std::array svpos = {0.}; // secondary vertex position + std::array pvec0 = {0.}; + std::array pvec1 = {0.}; + + int nCand = 0; + try { + nCand = fitter.process(eleParCov, trackParCov); + } catch (...) { + LOG(error) << "Exception caught in DCA fitter process call!"; + continue; + } + if (nCand == 0) { + continue; + } + + fitter.propagateTracksToVertex(); // propagate e and K to D vertex + const auto& vtx = fitter.getPCACandidate(); + for (int i = 0; i < 3; i++) { + svpos[i] = vtx[i]; + } + fitter.getTrack(0).getPxPyPzGlo(pvec0); // electron + fitter.getTrack(1).getPxPyPzGlo(pvec1); // strange hadron + std::array pvecSum = {pvec0[0] + pvec1[0], pvec0[1] + pvec1[1], pvec0[2] + pvec1[2]}; + + float dca2legs = std::sqrt(fitter.getChi2AtPCACandidate()); + float lxy = std::sqrt(std::pow(svpos[0] - collision.posX(), 2) + std::pow(svpos[1] - collision.posY(), 2)); + float lz = std::fabs(svpos[2] - collision.posZ()); + float mEK = RecoDecay::m(std::array{pvec0, pvec1}, std::array{o2::constants::physics::MassElectron, o2::constants::physics::MassKaonCharged}); + float cpa = RecoDecay::cpa(pVtx, svpos, pvecSum); + float cpaXY = RecoDecay::cpaXY(pVtx, svpos, pvecSum); + float ptEK = RecoDecay::sqrtSumOfSquares(pvec0[0] + pvec1[0], pvec0[1] + pvec1[1]); + + if (cpa < svcuts.cfg_min_cospa || cpaXY < svcuts.cfg_min_cospaXY || svcuts.cfg_max_mass_eK < mEK || lxy < svcuts.cfg_min_lxy || svcuts.cfg_max_dca2legs < dca2legs) { + continue; + } + + fRegistry.fill(HIST("e_Kpm/all/hDCA2Legs"), dca2legs); + fRegistry.fill(HIST("e_Kpm/all/hLxy"), lxy); + fRegistry.fill(HIST("e_Kpm/all/hLz"), lz); + fRegistry.fill(HIST("e_Kpm/all/hCosPAXY"), cpaXY); + fRegistry.fill(HIST("e_Kpm/all/hCosPA"), cpa); + fRegistry.fill(HIST("e_Kpm/all/hMass"), mEK, ptEK); + + int commonMotherId = o2::aod::pwgem::dilepton::utils::mcutil::FindCommonMotherFrom2ProngsWithoutPDG(mcele, mctrack); // e and K+/- + if (commonMotherId < 0 && mctrack.has_mothers()) { + const auto& mctrack_mother = mctrack.template mothers_first_as(); // mother particle of Kaon. For example K*(892)+ -> K+ pi0 or K*(892)0 -> K+ pi- and CC, or phi->K+K- + if (std::abs(mctrack_mother.pdgCode()) == 313 || std::abs(mctrack_mother.pdgCode()) == 323 || std::abs(mctrack_mother.pdgCode()) == 333) { + commonMotherId = o2::aod::pwgem::dilepton::utils::mcutil::FindCommonMotherFrom2ProngsWithoutPDG(mcele, mctrack_mother); // e and K*(892)0 or K*(892)+/- or phi(1019) + } + } + if (commonMotherId >= 0) { // common mother is correctly found by DCAFitterN. + const auto& cmp = mcParticles.rawIteratorAt(commonMotherId); + if (std::abs(cmp.pdgCode()) == 421) { // D0 + fillElectronHistograms<3, 1>(ele, eleParCov, dcaXY, dcaZ); + fRegistry.fill(HIST("e_Kpm/D0/hDCA2Legs"), dca2legs); + fRegistry.fill(HIST("e_Kpm/D0/hLxy"), lxy); + fRegistry.fill(HIST("e_Kpm/D0/hLz"), lz); + fRegistry.fill(HIST("e_Kpm/D0/hCosPAXY"), cpaXY); + fRegistry.fill(HIST("e_Kpm/D0/hCosPA"), cpa); + fRegistry.fill(HIST("e_Kpm/D0/hMass"), mEK, ptEK); + } else if (std::abs(cmp.pdgCode()) == 411) { // Dpm + fillElectronHistograms<4, 1>(ele, eleParCov, dcaXY, dcaZ); + fRegistry.fill(HIST("e_Kpm/Dpm/hDCA2Legs"), dca2legs); + fRegistry.fill(HIST("e_Kpm/Dpm/hLxy"), lxy); + fRegistry.fill(HIST("e_Kpm/Dpm/hLz"), lz); + fRegistry.fill(HIST("e_Kpm/Dpm/hCosPAXY"), cpaXY); + fRegistry.fill(HIST("e_Kpm/Dpm/hCosPA"), cpa); + fRegistry.fill(HIST("e_Kpm/Dpm/hMass"), mEK, ptEK); + } else if (std::abs(cmp.pdgCode()) == 431) { // Ds + fillElectronHistograms<5, 1>(ele, eleParCov, dcaXY, dcaZ); + fRegistry.fill(HIST("e_Kpm/Ds/hDCA2Legs"), dca2legs); + fRegistry.fill(HIST("e_Kpm/Ds/hLxy"), lxy); + fRegistry.fill(HIST("e_Kpm/Ds/hLz"), lz); + fRegistry.fill(HIST("e_Kpm/Ds/hCosPAXY"), cpaXY); + fRegistry.fill(HIST("e_Kpm/Ds/hCosPA"), cpa); + fRegistry.fill(HIST("e_Kpm/Ds/hMass"), mEK, ptEK); + } + } else { // common mother does not exist, but DCAFitterN found something. i.e. fake + const auto& mp = mcele.template mothers_first_as(); + if (std::abs(mp.pdgCode()) == 111 || std::abs(mp.pdgCode()) == 221 || std::abs(mp.pdgCode()) == 331 || std::abs(mp.pdgCode()) == 113 || std::abs(mp.pdgCode()) == 223 || std::abs(mp.pdgCode()) == 333) { // LF + fillElectronHistograms<0, 2>(ele, eleParCov, dcaXY, dcaZ); + } + fRegistry.fill(HIST("e_Kpm/fake/hDCA2Legs"), dca2legs); + fRegistry.fill(HIST("e_Kpm/fake/hLxy"), lxy); + fRegistry.fill(HIST("e_Kpm/fake/hLz"), lz); + fRegistry.fill(HIST("e_Kpm/fake/hCosPAXY"), cpaXY); + fRegistry.fill(HIST("e_Kpm/fake/hCosPA"), cpa); + fRegistry.fill(HIST("e_Kpm/fake/hMass"), mEK, ptEK); + } + } // end of kaon loop + } + + template + void runPairEandV0(TCollision const& collision, TElectron const& ele, TV0Ids const& v0Ids, TV0s const& v0s, TMCParticles const& mcParticles, TMCCollisions const&) + { + std::array pVtx = {collision.posX(), collision.posY(), collision.posZ()}; + const auto& mcele = ele.template mcParticle_as(); + const auto& mcCollision1 = mcele.template mcCollision_as(); + if (cfgEventGeneratorType >= 0 && mcCollision1.getSubGeneratorId() != cfgEventGeneratorType) { + return; + } + + o2::dataformats::DCA mDcaInfoCov; + mDcaInfoCov.set(999, 999, 999, 999, 999); + auto eleParCov = getTrackParCov(ele); + eleParCov.setPID(o2::track::PID::Electron); + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, eleParCov, 2.f, matCorr, &mDcaInfoCov); + float dcaXY = mDcaInfoCov.getY(); + float dcaZ = mDcaInfoCov.getZ(); + + for (const auto& v0Id : v0Ids) { + const auto& v0 = v0s.rawIteratorAt(v0Id); + auto pos = v0.template posTrack_as(); + // auto neg = v0.template negTrack_as(); + + const auto& mcpos = pos.template mcParticle_as(); + // const auto& mcneg = neg.template mcParticle_as(); + const auto& mcv0 = mcpos.template mothers_first_as(); // check mother of K0S. namely, K0 [311 or -311]. + const auto& mcCollision2 = mcv0.template mcCollision_as(); + + if (cfgEventGeneratorType >= 0 && mcCollision2.getSubGeneratorId() != cfgEventGeneratorType) { + continue; + } + if (mcCollision1.globalIndex() != mcCollision2.globalIndex()) { + continue; + } + + const auto& mcv0_mother = mcv0.template mothers_first_as(); // mother particle of K0S. + + const std::array vertex = {v0.x(), v0.y(), v0.z()}; + const std::array momentum = {v0.px(), v0.py(), v0.pz()}; + std::array covV0 = {0.f}; + + constexpr int MomInd[6] = {9, 13, 14, 18, 19, 20}; // cov matrix elements for momentum component + for (int i = 0; i < 6; i++) { + covV0[MomInd[i]] = v0.momentumCovMat()[i]; + covV0[i] = v0.positionCovMat()[i]; + } + + auto tV0 = o2::track::TrackParCov(vertex, momentum, covV0, 0, true); + tV0.setAbsCharge(0); + tV0.setPID(o2::track::PID::K0); + + std::array svpos = {0.}; // secondary vertex position + std::array pvec0 = {0.}; + std::array pvec1 = {0.}; + + int nCand = 0; + try { + nCand = fitter.process(eleParCov, tV0); + } catch (...) { + LOG(error) << "Exception caught in DCA fitter process call!"; + continue; + } + if (nCand == 0) { + continue; + } + + fitter.propagateTracksToVertex(); // propagate e and K to D vertex + const auto& vtx = fitter.getPCACandidate(); + for (int i = 0; i < 3; i++) { + svpos[i] = vtx[i]; + } + fitter.getTrack(0).getPxPyPzGlo(pvec0); // electron + fitter.getTrack(1).getPxPyPzGlo(pvec1); // v0 + std::array pvecSum = {pvec0[0] + pvec1[0], pvec0[1] + pvec1[1], pvec0[2] + pvec1[2]}; + + float dca2legs = std::sqrt(fitter.getChi2AtPCACandidate()); + float lxy = std::sqrt(std::pow(svpos[0] - collision.posX(), 2) + std::pow(svpos[1] - collision.posY(), 2)); + float lz = std::fabs(svpos[2] - collision.posZ()); + float mEK = 0; + float ptEK = RecoDecay::sqrtSumOfSquares(pvec0[0] + pvec1[0], pvec0[1] + pvec1[1]); + if constexpr (pairId == 1) { + mEK = RecoDecay::m(std::array{pvec0, pvec1}, std::array{o2::constants::physics::MassElectron, o2::constants::physics::MassK0Short}); + if (svcuts.cfg_max_mass_eK < mEK) { + continue; + } + } else if constexpr (pairId == 2) { + mEK = RecoDecay::m(std::array{pvec0, pvec1}, std::array{o2::constants::physics::MassElectron, o2::constants::physics::MassLambda}); + if (svcuts.cfg_max_mass_eL < mEK) { + continue; + } + } + float cpa = RecoDecay::cpa(pVtx, svpos, pvecSum); + float cpaXY = RecoDecay::cpaXY(pVtx, svpos, pvecSum); + + if (cpa < svcuts.cfg_min_cospa || cpaXY < svcuts.cfg_min_cospaXY || lxy < svcuts.cfg_min_lxy || svcuts.cfg_max_dca2legs < dca2legs) { + continue; + } + + int commonMotherId = -1; + if constexpr (pairId == 1) { + commonMotherId = o2::aod::pwgem::dilepton::utils::mcutil::FindCommonMotherFrom2ProngsWithoutPDG(mcele, mcv0_mother); // K0, not K0S + } else if constexpr (pairId == 2) { + commonMotherId = o2::aod::pwgem::dilepton::utils::mcutil::FindCommonMotherFrom2ProngsWithoutPDG(mcele, mcv0); // lambda + } + + fRegistry.fill(HIST(pair_names[pairId]) + HIST("all/hDCA2Legs"), dca2legs); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("all/hLxy"), lxy); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("all/hLz"), lz); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("all/hCosPAXY"), cpaXY); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("all/hCosPA"), cpa); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("all/hMass"), mEK, ptEK); + + if (commonMotherId >= 0) { // common mother is correctly found by DCAFitterN. + const auto& cmp = mcParticles.rawIteratorAt(commonMotherId); + if constexpr (pairId == 1) { + if (std::abs(cmp.pdgCode()) == 421) { // D0 + fillElectronHistograms<3, 1>(ele, eleParCov, dcaXY, dcaZ); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("D0/hDCA2Legs"), dca2legs); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("D0/hLxy"), lxy); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("D0/hLz"), lz); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("D0/hCosPAXY"), cpaXY); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("D0/hCosPA"), cpa); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("D0/hMass"), mEK, ptEK); + } else if (std::abs(cmp.pdgCode()) == 411) { // Dpm + fillElectronHistograms<4, 1>(ele, eleParCov, dcaXY, dcaZ); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Dpm/hDCA2Legs"), dca2legs); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Dpm/hLxy"), lxy); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Dpm/hLz"), lz); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Dpm/hCosPAXY"), cpaXY); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Dpm/hCosPA"), cpa); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Dpm/hMass"), mEK, ptEK); + } else if (std::abs(cmp.pdgCode()) == 431) { // Ds + fillElectronHistograms<5, 1>(ele, eleParCov, dcaXY, dcaZ); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Ds/hDCA2Legs"), dca2legs); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Ds/hLxy"), lxy); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Ds/hLz"), lz); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Ds/hCosPAXY"), cpaXY); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Ds/hCosPA"), cpa); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Ds/hMass"), mEK, ptEK); + } + } else if constexpr (pairId == 2) { + if (std::abs(cmp.pdgCode()) == 4122) { // Lc + fillElectronHistograms<6, 1>(ele, eleParCov, dcaXY, dcaZ); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Lc/hDCA2Legs"), dca2legs); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Lc/hLxy"), lxy); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Lc/hLz"), lz); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Lc/hCosPAXY"), cpaXY); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Lc/hCosPA"), cpa); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Lc/hMass"), mEK, ptEK); + } + } + } else { // common mother does not exist, but DCAFitterN found something. i.e. fake + const auto& mp = mcele.template mothers_first_as(); + if (std::abs(mp.pdgCode()) == 111 || std::abs(mp.pdgCode()) == 221 || std::abs(mp.pdgCode()) == 331 || std::abs(mp.pdgCode()) == 113 || std::abs(mp.pdgCode()) == 223 || std::abs(mp.pdgCode()) == 333) { // LF + fillElectronHistograms<0, 2>(ele, eleParCov, dcaXY, dcaZ); + } + fRegistry.fill(HIST(pair_names[pairId]) + HIST("fake/hDCA2Legs"), dca2legs); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("fake/hLxy"), lxy); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("fake/hLz"), lz); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("fake/hCosPAXY"), cpaXY); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("fake/hCosPA"), cpa); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("fake/hMass"), mEK, ptEK); + } + + } // end of v0 loop + } + + SliceCache cache; + Preslice perCol = o2::aod::track::collisionId; + Preslice perCol_v0 = o2::aod::v0data::collisionId; + + Filter collisionFilter_evsel = o2::aod::evsel::sel8 == true && (cfgZvtxMin < o2::aod::collision::posZ && o2::aod::collision::posZ < cfgZvtxMax); + Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax); + using FilteredMyCollisions = soa::Filtered; + + Preslice trackIndicesPerCollision = aod::track_association::collisionId; + std::vector> stored_trackIds; + Filter trackFilter = ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::ITS) == true && ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::TPC) == true; + using MyFilteredTracks = soa::Filtered; + + Partition posTracks = o2::aod::track::signed1Pt > 0.f; + Partition negTracks = o2::aod::track::signed1Pt < 0.f; + + //! type of V0. 0: built solely for cascades (does not pass standard V0 cuts), 1: standard 2, 3: photon-like with TPC-only use. Regular analysis should always use type 1. + Filter v0Filter = o2::aod::v0data::v0Type == uint8_t(1) && o2::aod::v0data::v0cosPA > v0cuts.cfg_min_cospa_v0hadron.value&& o2::aod::v0data::dcaV0daughters < v0cuts.cfg_max_pca_v0hadron.value; + using filteredV0s = soa::Filtered; + + std::vector electronIds; + std::vector positronIds; + std::vector negKaonIds; + std::vector posKaonIds; + + std::vector k0sIds; + std::vector antik0sIds; + std::vector lambdaIds; + std::vector antilambdaIds; + + void processSA(FilteredMyCollisions const&, aod::BCsWithTimestamps const&, MyTracks const&, filteredV0s const&, aod::McParticles const&, aod::McCollisions const&) {} + PROCESS_SWITCH(taggingHFE, processSA, "process without TTCA", false); + + void processTTCA(FilteredMyCollisions const& collisions, aod::BCsWithTimestamps const&, MyTracks const& tracks, aod::TrackAssoc const& trackIndices, filteredV0s const& v0s, aod::McParticles const& mcParticles, aod::McCollisions const& mcCollisions) + { + for (const auto& collision : collisions) { + const auto& bc = collision.template foundBC_as(); + initCCDB(bc); + fRegistry.fill(HIST("Event/hCollisionCounter"), 0); + if (!collision.has_mcCollision()) { + continue; + } + const float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; + if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { + continue; + } + fRegistry.fill(HIST("Event/hCollisionCounter"), 1); + const auto& mcCollision = collision.template mcCollision_as(); + if (cfgEventGeneratorType < 0 || mcCollision.getSubGeneratorId() == cfgEventGeneratorType) { + fillEventHistograms(collision); + } + const auto& trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, collision.globalIndex()); + electronIds.reserve(trackIdsThisCollision.size()); + positronIds.reserve(trackIdsThisCollision.size()); + negKaonIds.reserve(trackIdsThisCollision.size()); + posKaonIds.reserve(trackIdsThisCollision.size()); + + for (const auto& trackId : trackIdsThisCollision) { + const auto& track = trackId.template track_as(); + if (!track.hasITS() || !track.hasTPC()) { + continue; + } + if (!track.has_mcParticle()) { + continue; + } + const auto& mctrack = track.template mcParticle_as(); + const auto& mp = mctrack.template mothers_first_as(); // mother particle of electron + if (!mctrack.has_mothers() || !(mctrack.isPhysicalPrimary() || mctrack.producedByGenerator())) { + continue; + } + if (std::abs(mctrack.pdgCode()) != 11 && std::abs(mctrack.pdgCode()) != 321) { + continue; + } + + const auto& mcCollision1 = mctrack.template mcCollision_as(); + if (cfgEventGeneratorType >= 0 && mcCollision1.getSubGeneratorId() != cfgEventGeneratorType) { + continue; + } + + o2::dataformats::DCA mDcaInfoCov; + mDcaInfoCov.set(999, 999, 999, 999, 999); + auto track_par_cov_recalc = getTrackParCov(track); + track_par_cov_recalc.setPID(o2::track::PID::Electron); + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc, 2.f, matCorr, &mDcaInfoCov); + float dcaXY = mDcaInfoCov.getY(); + float dcaZ = mDcaInfoCov.getZ(); + + if (!isSelectedTrack(track, track_par_cov_recalc, dcaXY, dcaZ)) { + continue; + } + + if (std::abs(mctrack.pdgCode()) == 11) { + if (track_par_cov_recalc.getEta() < trackcuts.cfg_min_eta_track || trackcuts.cfg_max_eta_track < track_par_cov_recalc.getEta()) { + continue; + } + if (std::abs(mp.pdgCode()) == 111 || std::abs(mp.pdgCode()) == 221 || std::abs(mp.pdgCode()) == 331 || std::abs(mp.pdgCode()) == 113 || std::abs(mp.pdgCode()) == 223 || std::abs(mp.pdgCode()) == 333) { // LF + fillElectronHistograms<0, 0>(track, track_par_cov_recalc, dcaXY, dcaZ); + } else if (std::abs(mp.pdgCode()) == 443) { // Jpsi + if (o2::aod::pwgem::dilepton::utils::mcutil::IsFromBeauty(mp, mcParticles) < 0) { + fillElectronHistograms<1, 0>(track, track_par_cov_recalc, dcaXY, dcaZ); // prompt Jpsi + } else { + fillElectronHistograms<2, 0>(track, track_par_cov_recalc, dcaXY, dcaZ); // nonprompt Jpsi + } + } else if (std::abs(mp.pdgCode()) == 421) { // D0 + fillElectronHistograms<3, 0>(track, track_par_cov_recalc, dcaXY, dcaZ); + } else if (std::abs(mp.pdgCode()) == 411) { // Dpm + fillElectronHistograms<4, 0>(track, track_par_cov_recalc, dcaXY, dcaZ); + } else if (std::abs(mp.pdgCode()) == 431) { // Ds + fillElectronHistograms<5, 0>(track, track_par_cov_recalc, dcaXY, dcaZ); + } else if (std::abs(mp.pdgCode()) == 4122) { // Lc + fillElectronHistograms<6, 0>(track, track_par_cov_recalc, dcaXY, dcaZ); + } + + if (track.sign() > 0) { // positron + positronIds.emplace_back(trackId.trackId()); + } else { // electron + electronIds.emplace_back(trackId.trackId()); + } + } else if (std::abs(mctrack.pdgCode()) == 321 && isKaon(track)) { + if (track_par_cov_recalc.getEta() < trackcuts.cfg_min_eta_track_wide || trackcuts.cfg_max_eta_track_wide < track_par_cov_recalc.getEta()) { + continue; + } + if (track.sign() > 0) { // positive kaon + posKaonIds.emplace_back(trackId.trackId()); + } else { // negative kaon + negKaonIds.emplace_back(trackId.trackId()); + } + } + } // end of track loop for electron and kaon selection + + const auto& v0s_per_coll = v0s.sliceBy(perCol_v0, collision.globalIndex()); + k0sIds.reserve(v0s_per_coll.size()); + antik0sIds.reserve(v0s_per_coll.size()); + lambdaIds.reserve(v0s_per_coll.size()); + antilambdaIds.reserve(v0s_per_coll.size()); + + for (const auto& v0 : v0s_per_coll) { + if (v0cuts.cfg_min_mass_k0s < v0.mK0Short() && v0.mK0Short() < v0cuts.cfg_max_mass_k0s) { + auto pos = v0.template posTrack_as(); + auto neg = v0.template negTrack_as(); + + const auto& mcpos = pos.template mcParticle_as(); + const auto& mcneg = neg.template mcParticle_as(); + if (!mcpos.has_mothers() || !mcneg.has_mothers()) { + continue; + } + + if (o2::aod::pwgem::dilepton::utils::mcutil::FindCommonMotherFrom2Prongs(mcpos, mcneg, 211, -211, 310, mcParticles) < 0) { + continue; + } + + const auto& mcK0S = mcpos.template mothers_first_as(); // mother particle of pion + if (!mcK0S.has_mothers()) { + continue; + } + const auto& mcK0 = mcK0S.template mothers_first_as(); // mother particle of K0S + const auto& mcCollision1 = mcK0S.template mcCollision_as(); + if (cfgEventGeneratorType >= 0 && mcCollision1.getSubGeneratorId() != cfgEventGeneratorType) { + continue; + } + + if (!isPion(pos) || !isPion(neg)) { + continue; + } + + float dcaXY = 999.f; + o2::dataformats::DCA mDcaInfoCov; + mDcaInfoCov.set(999, 999, 999, 999, 999); + auto track_par_cov_recalc_pos = getTrackParCov(pos); + track_par_cov_recalc_pos.setPID(o2::track::PID::Pion); + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc_pos, 2.f, matCorr, &mDcaInfoCov); + dcaXY = mDcaInfoCov.getY(); + if (!isSelectedV0Leg(pos, dcaXY)) { + continue; + } + + mDcaInfoCov.set(999, 999, 999, 999, 999); + auto track_par_cov_recalc_neg = getTrackParCov(neg); + track_par_cov_recalc_neg.setPID(o2::track::PID::Pion); + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc_neg, 2.f, matCorr, &mDcaInfoCov); + dcaXY = mDcaInfoCov.getY(); + if (!isSelectedV0Leg(neg, dcaXY)) { + continue; + } + + fRegistry.fill(HIST("V0/K0S/hPt"), v0.pt()); + fRegistry.fill(HIST("V0/K0S/hYPhi"), v0.phi(), v0.yK0Short()); + fRegistry.fill(HIST("V0/K0S/hCosPA"), v0.v0cosPA()); + fRegistry.fill(HIST("V0/K0S/hLxy"), v0.v0radius()); + fRegistry.fill(HIST("V0/K0S/hDCA2Legs"), v0.dcaV0daughters()); + fRegistry.fill(HIST("V0/K0S/hAP"), v0.alpha(), v0.qtarm()); + fRegistry.fill(HIST("V0/K0S/hMassK0S"), v0.mK0Short()); + if (mcK0.pdgCode() == 311) { + k0sIds.emplace_back(v0.globalIndex()); + } else if (mcK0.pdgCode() == -311) { + antik0sIds.emplace_back(v0.globalIndex()); + } + } else if (v0cuts.cfg_min_mass_lambda < v0.mLambda() && v0.mLambda() < v0cuts.cfg_max_mass_lambda) { + auto pos = v0.template posTrack_as(); + auto neg = v0.template negTrack_as(); + + const auto& mcpos = pos.template mcParticle_as(); + const auto& mcneg = neg.template mcParticle_as(); + if (!mcpos.has_mothers() || !mcneg.has_mothers()) { + continue; + } + if (o2::aod::pwgem::dilepton::utils::mcutil::FindCommonMotherFrom2Prongs(mcpos, mcneg, 2212, -211, 3122, mcParticles) < 0) { + continue; + } + + if (!isProton(pos) || !isPion(neg)) { + continue; + } + + float dcaXY = 999.f; + o2::dataformats::DCA mDcaInfoCov; + mDcaInfoCov.set(999, 999, 999, 999, 999); + auto track_par_cov_recalc_pos = getTrackParCov(pos); + track_par_cov_recalc_pos.setPID(o2::track::PID::Proton); + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc_pos, 2.f, matCorr, &mDcaInfoCov); + dcaXY = mDcaInfoCov.getY(); + if (!isSelectedV0Leg(pos, dcaXY)) { + continue; + } + + mDcaInfoCov.set(999, 999, 999, 999, 999); + auto track_par_cov_recalc_neg = getTrackParCov(neg); + track_par_cov_recalc_neg.setPID(o2::track::PID::Pion); + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc_neg, 2.f, matCorr, &mDcaInfoCov); + dcaXY = mDcaInfoCov.getY(); + if (!isSelectedV0Leg(neg, dcaXY)) { + continue; + } + + fRegistry.fill(HIST("V0/Lambda/hPt"), v0.pt()); + fRegistry.fill(HIST("V0/Lambda/hYPhi"), v0.phi(), v0.yLambda()); + fRegistry.fill(HIST("V0/Lambda/hCosPA"), v0.v0cosPA()); + fRegistry.fill(HIST("V0/Lambda/hLxy"), v0.v0radius()); + fRegistry.fill(HIST("V0/Lambda/hDCA2Legs"), v0.dcaV0daughters()); + fRegistry.fill(HIST("V0/Lambda/hAP"), v0.alpha(), v0.qtarm()); + fRegistry.fill(HIST("V0/Lambda/hMassLambda"), v0.mLambda()); + lambdaIds.emplace_back(v0.globalIndex()); + } else if (v0cuts.cfg_min_mass_lambda < v0.mAntiLambda() && v0.mAntiLambda() < v0cuts.cfg_max_mass_lambda) { + auto pos = v0.template posTrack_as(); + auto neg = v0.template negTrack_as(); + + const auto& mcpos = pos.template mcParticle_as(); + const auto& mcneg = neg.template mcParticle_as(); + if (!mcpos.has_mothers() || !mcneg.has_mothers()) { + continue; + } + if (o2::aod::pwgem::dilepton::utils::mcutil::FindCommonMotherFrom2Prongs(mcpos, mcneg, 211, -2212, -3122, mcParticles) < 0) { + continue; + } + + if (!isPion(pos) || !isProton(neg)) { + continue; + } + float dcaXY = 999.f; + o2::dataformats::DCA mDcaInfoCov; + mDcaInfoCov.set(999, 999, 999, 999, 999); + auto track_par_cov_recalc_pos = getTrackParCov(pos); + track_par_cov_recalc_pos.setPID(o2::track::PID::Pion); + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc_pos, 2.f, matCorr, &mDcaInfoCov); + dcaXY = mDcaInfoCov.getY(); + if (!isSelectedV0Leg(pos, dcaXY)) { + continue; + } + + mDcaInfoCov.set(999, 999, 999, 999, 999); + auto track_par_cov_recalc_neg = getTrackParCov(neg); + track_par_cov_recalc_neg.setPID(o2::track::PID::Proton); + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc_neg, 2.f, matCorr, &mDcaInfoCov); + dcaXY = mDcaInfoCov.getY(); + if (!isSelectedV0Leg(neg, dcaXY)) { + continue; + } + fRegistry.fill(HIST("V0/AntiLambda/hPt"), v0.pt()); + fRegistry.fill(HIST("V0/AntiLambda/hYPhi"), v0.phi(), v0.yLambda()); + fRegistry.fill(HIST("V0/AntiLambda/hCosPA"), v0.v0cosPA()); + fRegistry.fill(HIST("V0/AntiLambda/hLxy"), v0.v0radius()); + fRegistry.fill(HIST("V0/AntiLambda/hDCA2Legs"), v0.dcaV0daughters()); + fRegistry.fill(HIST("V0/AntiLambda/hAP"), v0.alpha(), v0.qtarm()); + fRegistry.fill(HIST("V0/AntiLambda/hMassAntiLambda"), v0.mAntiLambda()); + antilambdaIds.emplace_back(v0.globalIndex()); + } + + } // end of v0 loop + + for (const auto& trackId : electronIds) { + const auto& ele = tracks.rawIteratorAt(trackId); + runPairEandTrack<0>(collision, ele, posKaonIds, tracks, mcParticles, mcCollisions); + runPairEandTrack<0>(collision, ele, negKaonIds, tracks, mcParticles, mcCollisions); // only for Ds + runPairEandV0<1>(collision, ele, k0sIds, v0s, mcParticles, mcCollisions); + runPairEandV0<1>(collision, ele, antik0sIds, v0s, mcParticles, mcCollisions); // only for Ds + runPairEandV0<2>(collision, ele, antilambdaIds, v0s, mcParticles, mcCollisions); + } // end of electron loop + + for (const auto& trackId : positronIds) { + const auto& pos = tracks.rawIteratorAt(trackId); + runPairEandTrack<0>(collision, pos, negKaonIds, tracks, mcParticles, mcCollisions); + runPairEandTrack<0>(collision, pos, posKaonIds, tracks, mcParticles, mcCollisions); // only for Ds + runPairEandV0<1>(collision, pos, antik0sIds, v0s, mcParticles, mcCollisions); + runPairEandV0<1>(collision, pos, k0sIds, v0s, mcParticles, mcCollisions); // only for Ds + runPairEandV0<2>(collision, pos, lambdaIds, v0s, mcParticles, mcCollisions); + } // end of positron loop + + electronIds.clear(); + electronIds.shrink_to_fit(); + positronIds.clear(); + positronIds.shrink_to_fit(); + negKaonIds.clear(); + negKaonIds.shrink_to_fit(); + posKaonIds.clear(); + posKaonIds.shrink_to_fit(); + + k0sIds.clear(); + k0sIds.shrink_to_fit(); + antik0sIds.clear(); + antik0sIds.shrink_to_fit(); + lambdaIds.clear(); + lambdaIds.shrink_to_fit(); + antilambdaIds.clear(); + antilambdaIds.shrink_to_fit(); + + } // end of collision loop + } + PROCESS_SWITCH(taggingHFE, processTTCA, "process with TTCA", true); +}; +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc, TaskName{"tagging-hfe"})}; +} From 45b422cd91f1f139e2ff678b831ef4f476d0ab52 Mon Sep 17 00:00:00 2001 From: Yash Patley <52608802+yashpatley@users.noreply.github.com> Date: Mon, 5 May 2025 02:26:50 +0530 Subject: [PATCH 1171/1650] [PWGCF] Update lambdaR2Correlation.cxx (#11055) --- .../Tasks/lambdaR2Correlation.cxx | 64 ++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx index 19bc4f66d37..8963e526e16 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx @@ -257,6 +257,9 @@ struct LambdaTableProducer { Configurable cMaxV0Pt{"cMaxV0Pt", 4.2, "Minimum V0 pT"}; Configurable cMaxV0Rap{"cMaxV0Rap", 0.5, "|rap| cut"}; Configurable cDoEtaAnalysis{"cDoEtaAnalysis", false, "Do Eta Analysis"}; + Configurable cV0TypeSelFlag{"cV0TypeSelFlag", false, "V0 Type Selection Flag"}; + Configurable cV0TypeSelection{"cV0TypeSelection", 1, "V0 Type Selection"}; + Configurable cGenProcessFlag{"cGenProcessFlag", true, "Generater Level Table Selection"}; // V0s MC Configurable cHasMcFlag{"cHasMcFlag", true, "Has Mc Tag"}; @@ -390,7 +393,7 @@ struct LambdaTableProducer { histos.addClone("McRec/Lambda/", "McRec/AntiLambda/"); // MC Generated Histograms - if (doprocessMCRun3 || doprocessMCRun2) { + if (doprocessMCRun3 || doprocessMCRun2 || doprocessRecoGen) { // McReco Histos histos.add("Tracks/h2f_tracks_pid_before_sel", "PIDs", kTH2F, {axisPID, axisV0Pt}); histos.add("Tracks/h2f_tracks_pid_after_sel", "PIDs", kTH2F, {axisPID, axisV0Pt}); @@ -982,6 +985,11 @@ struct LambdaTableProducer { continue; } + // Select V0 Type Selection + if (cV0TypeSelFlag && v0.v0Type() != cV0TypeSelection) { + continue; + } + histos.fill(HIST("Tracks/h1f_tracks_info"), kAllSelPassed); // we have v0 as lambda @@ -1213,6 +1221,60 @@ struct LambdaTableProducer { } PROCESS_SWITCH(LambdaTableProducer, processMCRun2, "Process for Run2 MC RecoGen", false); + + void processRecoGen(soa::Join::iterator const& collision, + soa::Join const&, + McV0Tracks const& V0s, TracksMC const& tracks, + aod::McParticles const& mcParticles) + { + // Select Collision + if (!selCollision(collision) || !collision.has_mcCollision()) { + return; + } + + // Fill Reco Table + fillLambdaRecoTables(collision, V0s, tracks); + + // Get Generator Level Collision and Particles + auto mcCollision = collision.template mcCollision_as>(); + auto mcGenParticles = mcParticles.sliceByCached(aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); + + if (cGenProcessFlag) { + fillLambdaMcGenTables(mcCollision, mcGenParticles); + return; + } + + // Fill Gen Table + lambdaMCGenCollisionTable(mcCollision.centFT0M(), mcCollision.posX(), mcCollision.posY(), mcCollision.posZ()); + + // initialize track objects + ParticleType v0Type = kLambda; + for (auto const& mcpart : mcGenParticles) { + if (!mcpart.isPhysicalPrimary()) { + continue; + } + + if (std::abs(mcpart.y()) > cMaxV0Rap) { + continue; + } + + // check for Lambda first + if (mcpart.pdgCode() == kLambda0) { + v0Type = kLambda; + } else if (mcpart.pdgCode() == kLambda0Bar) { + v0Type = kAntiLambda; + } else { + continue; + } + + // Fill Lambda McGen Table + lambdaMCGenTrackTable(lambdaMCGenCollisionTable.lastIndex(), mcpart.px(), mcpart.py(), mcpart.pz(), + mcpart.pt(), mcpart.eta(), mcpart.phi(), mcpart.y(), RecoDecay::m(mcpart.p(), mcpart.e()), + 99., -97., (int8_t)v0Type, -999., -999., 1.); + } + } + + PROCESS_SWITCH(LambdaTableProducer, processRecoGen, "Process for MC RecoGen", false); }; struct LambdaTracksExtProducer { From a2f8fd46d4582b3842197ab4e09041ec9d612d24 Mon Sep 17 00:00:00 2001 From: hernasab Date: Sun, 4 May 2025 16:01:41 -0500 Subject: [PATCH 1172/1650] [PWGCF] added new process function (#11060) Co-authored-by: Sabrina Hernandez --- PWGCF/Flow/Tasks/flowZdcTask.cxx | 435 ++++++++++++++++++++++--------- 1 file changed, 311 insertions(+), 124 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowZdcTask.cxx b/PWGCF/Flow/Tasks/flowZdcTask.cxx index 7c368aa1818..8cd9c24e0f3 100644 --- a/PWGCF/Flow/Tasks/flowZdcTask.cxx +++ b/PWGCF/Flow/Tasks/flowZdcTask.cxx @@ -76,29 +76,40 @@ struct FlowZdcTask { Configurable acceptanceZpc{"acceptanceZpc", 0.50, "ZPC acceptance factor"}; Configurable vtxRange{"vtxRange", 10.0f, "Vertex Z range to consider"}; Configurable etaRange{"etaRange", 1.0f, "Eta range to consider"}; - Configurable maxNch{"maxNch", 2500, "Max Nch (|eta|<0.8)"}; Configurable npvTracksCut{"npvTracksCut", 1.0f, "Apply extra NPVtracks cut"}; + // configs for process QA + Configurable nBinsNch{"nBinsNch", 2501, "N bins Nch (|eta|<0.8)"}; + Configurable nBinsAmpFT0{"nBinsAmpFT0", 100, "N bins FT0 amp"}; + Configurable maxAmpFT0{"maxAmpFT0", 2500, "Max FT0 amp"}; + Configurable nBinsAmpFV0{"nBinsAmpFV0", 100, "N bins FV0 amp"}; + Configurable maxAmpFV0{"maxAmpFV0", 2000, "Max FV0 amp"}; + Configurable nBinsZDC{"nBinsZDC", 400, "nBinsZDC"}; + Configurable nBinsZEM{"nBinsZEM", 100, "nBinsZEM"}; + Configurable minNch{"minNch", 0, "Min Nch (|eta|<0.8)"}; + Configurable maxNch{"maxNch", 2500, "Max Nch (|eta|<0.8)"}; Configurable nBinsTDC{"nBinsTDC", 150, "nbinsTDC"}; Configurable minTdc{"minTdc", -15.0, "minimum TDC"}; Configurable maxTdc{"maxTdc", 15.0, "maximum TDC"}; - Configurable nBinsNch{"nBinsNch", 2501, "N bins Nch (|eta|<0.8)"}; // event selection - Configurable isApplySameBunchPileup{"isApplySameBunchPileup", true, "Enable SameBunchPileup cut"}; - Configurable isApplyGoodZvtxFT0vsPV{"isApplyGoodZvtxFT0vsPV", true, "Enable GoodZvtxFT0vsPV cut"}; - Configurable isApplyVertexITSTPC{"isApplyVertexITSTPC", false, "Enable VertexITSTPC cut"}; - Configurable isApplyVertexTOFmatched{"isApplyVertexTOFmatched", false, "Enable VertexTOFmatched cut"}; - Configurable isApplyVertexTRDmatched{"isApplyVertexTRDmatched", false, "Enable VertexTRDmatched cut"}; - Configurable isApplyExtraCorrCut{"isApplyExtraCorrCut", false, "Enable extra NPVtracks vs FTOC correlation cut"}; - Configurable isApplyFT0CbasedOccupancy{"isApplyFT0CbasedOccupancy", false, "Enable FT0CbasedOccupancy cut"}; - Configurable isGoodITSLayersAll{"isGoodITSLayersAll", false, "Centrality based on no other collisions in this Readout Frame with per-collision multiplicity above threshold tracks"}; + Configurable isNoCollInTimeRangeStrict{"isNoCollInTimeRangeStrict", true, "isNoCollInTimeRangeStrict?"}; + Configurable isNoCollInTimeRangeStandard{"isNoCollInTimeRangeStandard", false, "isNoCollInTimeRangeStandard?"}; + Configurable isNoCollInRofStrict{"isNoCollInRofStrict", true, "isNoCollInRofStrict?"}; + Configurable isNoCollInRofStandard{"isNoCollInRofStandard", false, "isNoCollInRofStandard?"}; + Configurable isNoHighMultCollInPrevRof{"isNoHighMultCollInPrevRof", true, "isNoHighMultCollInPrevRof?"}; + Configurable isNoCollInTimeRangeNarrow{"isNoCollInTimeRangeNarrow", false, "isNoCollInTimeRangeNarrow?"}; Configurable isOccupancyCut{"isOccupancyCut", true, "Occupancy cut?"}; + Configurable isApplyFT0CbasedOccupancy{"isApplyFT0CbasedOccupancy", false, "T0C Occu cut?"}; + Configurable isTDCcut{"isTDCcut", false, "Use TDC cut?"}; Configurable isZEMcut{"isZEMcut", true, "Use ZEM cut?"}; - Configurable ft0cCut{"ft0cCut", 1.0f, "Apply extra FT0C cut"}; + + Configurable minNchSel{"minNchSel", 5., "min Nch Selection"}; + Configurable znBasedCut{"znBasedCut", 100, "ZN-based cut"}; + Configurable zemCut{"zemCut", 1000., "ZEM cut"}; + Configurable tdcCut{"tdcCut", 1., "TDC cut"}; Configurable minOccCut{"minOccCut", 0, "min Occu cut"}; Configurable maxOccCut{"maxOccCut", 500, "max Occu cut"}; - Configurable posZcut{"posZcut", +10.0, "z-vertex position cut"}; - Configurable zemCut{"zemCut", 1000., "ZEM cut"}; - + Configurable minITSnCls{"minITSnCls", 5, "min ITSnCls"}; + // axis configs ConfigurableAxis axisVertex{"axisVertex", {20, -10, 10}, "vertex axis for histograms"}; ConfigurableAxis axisPhi{"axisPhi", {60, 0.0, constants::math::TwoPI}, "phi axis for histograms"}; ConfigurableAxis axisEta{"axisEta", {40, -1., 1.}, "eta axis for histograms"}; @@ -114,13 +125,17 @@ struct FlowZdcTask { ConfigurableAxis ft0cMultHistBin{"ft0cMultHistBin", {501, -0.5, 500.5}, ""}; ConfigurableAxis multHistBin{"multHistBin", {501, -0.5, 500.5}, ""}; ConfigurableAxis axisCent{"axisCent", {10, 0, 100}, "axisCent"}; + Configurable posZcut{"posZcut", +10.0, "z-vertex position cut"}; + Configurable minT0CcentCut{"minT0CcentCut", 0.0, "Min T0C Cent. cut"}; + Configurable maxT0CcentCut{"maxT0CcentCut", 90.0, "Max T0C Cent. cut"}; Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls) && (nabs(aod::track::dcaZ) < cfgCutDCAz) && (nabs(aod::track::dcaXY) < cfgCutDCAxy); - using ColEvSels = soa::Join; + using ColEvSels = soa::Join; using AodCollisions = soa::Filtered>; using AodTracks = soa::Filtered>; Partition tracksIUWithTPC = (aod::track::tpcNClsFindable > (uint8_t)0); + using TracksSel = soa::Join; using BCsRun3 = soa::Join; using AodZDCs = soa::Join; using CollisionDataTable = soa::Join; @@ -130,6 +145,25 @@ struct FlowZdcTask { std::complex qZNA{0, 0}; // init qZNA std::complex qZNC{0, 0}; // init qZNC + enum EvCutLabel { + All = 1, + SelEigth, + NoSameBunchPileup, + IsGoodZvtxFT0vsPV, + NoCollInTimeRangeStrict, + NoCollInTimeRangeStandard, + NoCollInRofStrict, + NoCollInRofStandard, + NoHighMultCollInPrevRof, + NoCollInTimeRangeNarrow, + OccuCut, + Centrality, + VtxZ, + Zdc, + TZero, + Tdc, + Zem + }; // Begin Histogram Registry HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -140,9 +174,6 @@ struct FlowZdcTask { OutputObj pZNratiovscent{TProfile("pZNratiovscent", "Ratio ZNC/ZNA vs FT0C Centrality", 100, 0, 100, 0, 5)}; OutputObj pZPratiovscent{TProfile("pZPratiovscent", "Ratio ZPC/ZPA vs FT0C Centrality", 100, 0, 100, 0, 5)}; - double sumCosPsiDiff = 0.0; // Sum of cos(psiZNC) - cos(psiZNA) - int countEvents = 0; // Count of processed events - void init(InitContext const&) { // define axes @@ -151,13 +182,16 @@ struct FlowZdcTask { const AxisSpec axisQZNA{100, -1, 1, "Q"}; const AxisSpec axisREQ{100, -1, 1, "real Q"}; const AxisSpec axisIMQ{100, -1, 1, "imag Q"}; + const AxisSpec axisEvent{18, 0.5, 18.5, ""}; + const AxisSpec axisZpos{48, -12., 12., "Vtx_{z} (cm)"}; AxisSpec axisVtxZ{40, -20, 20, "Vertex Z", "VzAxis"}; - AxisSpec axisEvent{12, 0.5, 12.5, "#Event", "EventAxis"}; AxisSpec axisMult = {multHistBin, "Mult", "MultAxis"}; AxisSpec axisFT0CMult = {ft0cMultHistBin, "ft0c", "FT0CMultAxis"}; // create histograms + histos.add("hEventCounter", "Event counter", kTH1F, {axisEvent}); + histos.add("zPos", ";;Entries;", kTH1F, {axisZpos}); histos.add("etaHistogram", "etaHistogram", kTH1F, {axisEta}); histos.add("ptHistogram", "ptHistogram", kTH1F, {axisPt}); @@ -200,17 +234,22 @@ struct FlowZdcTask { auto hstat = histos.get(HIST("eventSelectionSteps")); auto* xAxis = hstat->GetXaxis(); xAxis->SetBinLabel(1, "All events"); - xAxis->SetBinLabel(2, "sel8"); - xAxis->SetBinLabel(3, "kNoSameBunchPileup"); // reject collisions in case of pileup with another collision in the same foundBC - xAxis->SetBinLabel(4, "kIsGoodZvtxFT0vsPV"); // small difference between z-vertex from PV and from FT0 - xAxis->SetBinLabel(5, "kIsVertexITSTPC"); // at least one ITS-TPC track (reject vertices built from ITS-only tracks) - xAxis->SetBinLabel(6, "kIsApplyVertexTOFmatched"); //"Centrality based on no other collisions in this Readout Frame with per-collision multiplicity above threshold tracks" - xAxis->SetBinLabel(7, "Occupancy Cuts"); - xAxis->SetBinLabel(8, "kITSLayersAll"); - xAxis->SetBinLabel(9, "kTRDVertexMatched"); - xAxis->SetBinLabel(10, "Centrality cut"); - xAxis->SetBinLabel(11, "Vertex Z cut"); - xAxis->SetBinLabel(12, "Extra Correlation Cut"); + xAxis->SetBinLabel(2, "SelEigth"); + xAxis->SetBinLabel(3, "NoSameBunchPileup"); // reject collisions in case of pileup with another collision in the same foundBC + xAxis->SetBinLabel(4, "GoodZvtxFT0vsPV"); // small difference between z-vertex from PV and from FT0 + xAxis->SetBinLabel(5, "NoCollInTimeRangeStrict"); + xAxis->SetBinLabel(6, "NoCollInTimeRangeStandard"); + xAxis->SetBinLabel(7, "NoCollInRofStrict"); + xAxis->SetBinLabel(8, "NoCollInRofStandard"); + xAxis->SetBinLabel(9, "NoHighMultCollInPrevRof"); + xAxis->SetBinLabel(10, "NoCollInTimeRangeNarrow"); + xAxis->SetBinLabel(11, "Occupancy Cut"); + xAxis->SetBinLabel(12, "Cent. Sel."); + xAxis->SetBinLabel(13, "VtxZ cut"); + xAxis->SetBinLabel(14, "has ZDC?"); + xAxis->SetBinLabel(15, "has T0?"); + xAxis->SetBinLabel(16, "Within TDC cut?"); + xAxis->SetBinLabel(17, "Within ZEM cut?"); histos.add("GlobalMult_vs_FT0C", "GlobalMult_vs_FT0C", kTH2F, {axisMult, axisFT0CMult}); histos.add("VtxZHist", "VtxZHist", kTH1D, {axisVtxZ}); @@ -253,69 +292,274 @@ struct FlowZdcTask { histos.add("hZPvsMult", "ZP Energy vs Multiplicity", kTH2F, {axisMultiplicity, axisZP}); histos.add("debunch", ";t_{ZDC}-t_{ZDA};t_{ZDC}+t_{ZDA}", kTH2F, {{{nBinsTDC, minTdc, maxTdc}, {nBinsTDC, minTdc, maxTdc}}}); } + + if (doprocessQA) { + histos.add("T0Ccent", ";;Entries", kTH1F, {axisCent}); + + histos.add("ZNVsFT0A", ";T0A (#times 1/100);ZNA+ZNC;", kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsZDC, -0.5, maxZn}}}); + histos.add("ZNVsFT0C", ";T0C (#times 1/100);ZNA+ZNC;", kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsZDC, -0.5, maxZn}}}); + histos.add("ZNVsFT0M", ";T0A+T0C (#times 1/100);ZNA+ZNC;", kTH2F, {{{nBinsAmpFT0, 0., 3000.}, {nBinsZDC, -0.5, maxZn}}}); + + histos.add("ZN", ";ZNA+ZNC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZn}}); + histos.add("ZNA", ";ZNA;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZn}}); + histos.add("ZPA", ";ZPA;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZp}}); + histos.add("ZNC", ";ZNC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZn}}); + histos.add("ZPC", ";ZPC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZp}}); + histos.add("ZNAVsZNC", ";ZNC;ZNA", kTH2F, {{{30, -0.5, maxZn}, {30, -0.5, maxZn}}}); + histos.add("ZPAVsZPC", ";ZPC;ZPA;", kTH2F, {{{100, -0.5, maxZp}, {100, -0.5, maxZp}}}); + histos.add("ZNAVsZPA", ";ZPA;ZNA;", kTH2F, {{{20, -0.5, maxZp}, {30, -0.5, maxZn}}}); + histos.add("ZNCVsZPC", ";ZPC;ZNC;", kTH2F, {{{20, -0.5, maxZp}, {30, -0.5, maxZn}}}); + histos.add("ZNCcvsZNCsum", ";ZNC common;ZNC sum towers;", kTH2F, {{{30, -0.5, maxZn}, {30, -0.5, maxZn}}}); + histos.add("ZNAcvsZNAsum", ";ZNA common;ZNA sum towers;", kTH2F, {{{30, -0.5, maxZn}, {30, -0.5, maxZn}}}); + histos.add("ZPCcvsZPCsum", ";ZPC common;ZPC sum towers;", kTH2F, {{{30, -0.5, maxZp}, {30, -0.5, maxZp}}}); + histos.add("ZPAcvsZPAsum", ";ZPA common;ZPA sum towers;", kTH2F, {{{30, -0.5, maxZp}, {30, -0.5, maxZp}}}); + histos.add("ZNVsZEM", ";ZEM;ZNA+ZNC;", kTH2F, {{{60, -0.5, maxZem}, {60, -0.5, maxZn}}}); + histos.add("ZNCVstdc", ";t_{ZNC};ZNC;", kTH2F, {{{30, -15., 15.}, {nBinsZDC, -0.5, maxZn}}}); + histos.add("ZNAVstdc", ";t_{ZNA};ZNA;", kTH2F, {{{30, -15., 15.}, {30, -0.5, maxZn}}}); + histos.add("ZPCVstdc", ";t_{ZPC};ZPC;", kTH2F, {{{30, -15., 15}, {20, -0.5, maxZp}}}); + histos.add("ZPAVstdc", ";t_{ZPA};ZPA;", kTH2F, {{{30, -15., 15.}, {20, -0.5, maxZp}}}); + histos.add("ZEM1Vstdc", ";t_{ZEM1};ZEM1;", kTH2F, {{{30, -15., 15.}, {30, -0.5, 2000.5}}}); + histos.add("ZEM2Vstdc", ";t_{ZEM2};ZEM2;", kTH2F, {{{30, -15., 15.}, {30, -0.5, 2000.5}}}); + histos.add("debunch", ";t_{ZDC}-t_{ZDA};t_{ZDC}+t_{ZDA}", kTH2F, {{{nBinsTDC, minTdc, maxTdc}, {nBinsTDC, minTdc, maxTdc}}}); + + histos.add("NchVsFT0C", ";T0C (#times 1/100, -3.3 < #eta < -2.1);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFT0, 0., 950.}, {nBinsNch, minNch, maxNch}}}); + histos.add("NchVsFT0M", ";T0A+T0C (#times 1/100, -3.3 < #eta < -2.1 and 3.5 < #eta < 4.9);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFT0, 0., 3000.}, {nBinsNch, minNch, maxNch}}}); + histos.add("NchVsFT0A", ";T0A (#times 1/100, 3.5 < #eta < 4.9);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsNch, minNch, maxNch}}}); + histos.add("NchVsFV0A", ";V0A (#times 1/100, 2.2 < #eta < 5);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFV0, 0., maxAmpFV0}, {nBinsNch, minNch, maxNch}}}); + + histos.add("NchVsEt", ";#it{E}_{T} (|#eta|<0.8);#LTITS+TPC tracks#GT (|#eta|<0.8);", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsNch, minNch, maxNch}}}); + histos.add("NchVsMeanPt", ";#it{N}_{ch} (|#eta|<0.8);#LT[#it{p}_{T}]#GT (|#eta|<0.8);", kTProfile, {{nBinsNch, minNch, maxNch}}); + histos.add("NchVsNPV", ";#it{N}_{PV} (|#eta|<1);ITS+TPC tracks (|#eta|<0.8);", kTH2F, {{{300, -0.5, 5999.5}, {nBinsNch, minNch, maxNch}}}); + histos.add("NchVsITStracks", ";ITS tracks nCls >= 5;TITS+TPC tracks (|#eta|<0.8);", kTH2F, {{{300, -0.5, 5999.5}, {nBinsNch, minNch, maxNch}}}); + histos.add("ZNCVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNC;", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, minNch, maxZn}}}); + histos.add("ZNAVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA;", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, minNch, maxZn}}}); + histos.add("ZNVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA+ZNC;", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, minNch, maxZn}}}); + histos.add("ZNDifVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA-ZNC;", kTH2F, {{{nBinsNch, minNch, maxNch}, {100, -50., 50.}}}); + } } template bool isEventSelected(EventCuts const& col) { - histos.fill(HIST("eventSelectionSteps"), 1); - + histos.fill(HIST("hEventCounter"), EvCutLabel::All); if (!col.sel8()) { return false; } - histos.fill(HIST("eventSelectionSteps"), 2); + histos.fill(HIST("hEventCounter"), EvCutLabel::SelEigth); - if (isApplySameBunchPileup && !col.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { + if (!col.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { return false; } - histos.fill(HIST("eventSelectionSteps"), 3); + histos.fill(HIST("hEventCounter"), EvCutLabel::NoSameBunchPileup); - if (isApplyGoodZvtxFT0vsPV && !col.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { + if (!col.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { return false; } - histos.fill(HIST("eventSelectionSteps"), 4); + histos.fill(HIST("hEventCounter"), EvCutLabel::IsGoodZvtxFT0vsPV); - if (isApplyVertexITSTPC && !col.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) { - return false; + if (isNoCollInTimeRangeStrict) { + if (!col.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStrict)) { + return false; + } + histos.fill(HIST("hEventCounter"), EvCutLabel::NoCollInTimeRangeStrict); } - histos.fill(HIST("eventSelectionSteps"), 5); - if (isApplyVertexTOFmatched && !col.selection_bit(o2::aod::evsel::kIsVertexTOFmatched)) { - return false; + if (isNoCollInTimeRangeStandard) { + if (!col.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + return false; + } + histos.fill(HIST("hEventCounter"), EvCutLabel::NoCollInTimeRangeStandard); } - histos.fill(HIST("eventSelectionSteps"), 6); - if (isOccupancyCut) { - auto occuValue{isApplyFT0CbasedOccupancy - ? col.ft0cOccupancyInTimeRange() - : col.trackOccupancyInTimeRange()}; + if (isNoCollInRofStrict) { + if (!col.selection_bit(o2::aod::evsel::kNoCollInRofStrict)) { + return false; + } + histos.fill(HIST("hEventCounter"), EvCutLabel::NoCollInRofStrict); + } - if (occuValue < minOccCut || occuValue > maxOccCut) + if (isNoCollInRofStandard) { + if (!col.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { return false; + } + histos.fill(HIST("hEventCounter"), EvCutLabel::NoCollInRofStandard); } - histos.fill(HIST("eventSelectionSteps"), 7); - if (isGoodITSLayersAll && !col.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { - return false; + + if (isNoHighMultCollInPrevRof) { + if (!col.selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof)) { + return false; + } + histos.fill(HIST("hEventCounter"), EvCutLabel::NoHighMultCollInPrevRof); } - histos.fill(HIST("eventSelectionSteps"), 8); - if (isApplyVertexTRDmatched && !col.selection_bit(o2::aod::evsel::kIsVertexTRDmatched)) { - return false; + + // To be used in combination with FT0C-based occupancy + if (isNoCollInTimeRangeNarrow) { + if (!col.selection_bit(o2::aod::evsel::kNoCollInTimeRangeNarrow)) { + return false; + } + histos.fill(HIST("hEventCounter"), EvCutLabel::NoCollInTimeRangeNarrow); } - histos.fill(HIST("eventSelectionSteps"), 9); - if (col.centFT0C() < 0. || col.centFT0C() > 100.) { - return false; + + if (isOccupancyCut) { + auto occuValue{isApplyFT0CbasedOccupancy ? col.ft0cOccupancyInTimeRange() : col.trackOccupancyInTimeRange()}; + if (occuValue < minOccCut || occuValue > maxOccCut) { + return false; + } } - histos.fill(HIST("eventSelectionSteps"), 10); - if (std::fabs(col.posZ()) > posZcut) { + histos.fill(HIST("hEventCounter"), EvCutLabel::OccuCut); + + if (col.centFT0C() < minT0CcentCut || col.centFT0C() > maxT0CcentCut) { return false; } - histos.fill(HIST("eventSelectionSteps"), 11); - if (isApplyExtraCorrCut && col.multNTracksPV() > npvTracksCut && col.multFT0C() < (10 * col.multNTracksPV() - ft0cCut)) { + histos.fill(HIST("hEventCounter"), EvCutLabel::Centrality); + + // Z-vertex position cut + if (std::fabs(col.posZ()) > posZcut) { return false; } - histos.fill(HIST("eventSelectionSteps"), 12); + histos.fill(HIST("hEventCounter"), EvCutLabel::VtxZ); + return true; } + void processQA(ColEvSels::iterator const& collision, BCsRun3 const& /*bcs*/, aod::Zdcs const& /*zdcsData*/, aod::FV0As const& /*fv0as*/, aod::FT0s const& /*ft0s*/, AodTracks const& tracks) + { + const auto& foundBC = collision.foundBC_as(); + if (!isEventSelected(collision)) { + return; + } + if (!foundBC.has_zdc()) { + return; + } + histos.fill(HIST("hEventCounter"), EvCutLabel::Zdc); + auto zdc = foundBC.zdc(); + + float aT0A = 0., aT0C = 0., aV0A = 0.; + if (foundBC.has_ft0()) { + for (const auto& amplitude : foundBC.ft0().amplitudeA()) { + aT0A += amplitude; + } + for (const auto& amplitude : foundBC.ft0().amplitudeC()) { + aT0C += amplitude; + } + } else { + return; + } + histos.fill(HIST("hEventCounter"), EvCutLabel::TZero); + if (foundBC.has_fv0a()) { + for (const auto& amplitude : foundBC.fv0a().amplitude()) { + aV0A += amplitude; + } + } else { + aV0A = -999.; + } + float tZNA{zdc.timeZNA()}; + float tZNC{zdc.timeZNC()}; + float tZPA{zdc.timeZPA()}; + float tZPC{zdc.timeZPC()}; + float tZDCdif{tZNC + tZPC - tZNA - tZPA}; + float tZDCsum{tZNC + tZPC + tZNA + tZPA}; + + // TDC cut + if (isTDCcut) { + if (std::sqrt(std::pow(tZDCdif, 2.) + std::pow(tZDCsum, 2.)) > tdcCut) { + return; + } + histos.fill(HIST("hEventCounter"), EvCutLabel::Tdc); + } + + float aZEM1{zdc.amplitudeZEM1()}; + float aZEM2{zdc.amplitudeZEM2()}; + float sumZEMs{aZEM1 + aZEM2}; + + // ZEM cut + if (isZEMcut) { + if (sumZEMs < zemCut) { + return; + } + histos.fill(HIST("hEventCounter"), EvCutLabel::Zem); + } + + float znA{zdc.amplitudeZNA()}; + float znC{zdc.amplitudeZNC()}; + float zpA{zdc.amplitudeZPA()}; + float zpC{zdc.amplitudeZPC()}; + znA /= 2.81; + znC /= 2.81; + zpA /= 2.81; + zpC /= 2.81; + + float tZEM1{zdc.timeZEM1()}; + float tZEM2{zdc.timeZEM2()}; + float sumZNs{znA + znC}; + + float sumZNC = (zdc.energySectorZNC())[0] + (zdc.energySectorZNC())[1] + (zdc.energySectorZNC())[2] + (zdc.energySectorZNC())[3]; + float sumZNA = (zdc.energySectorZNA())[0] + (zdc.energySectorZNA())[1] + (zdc.energySectorZNA())[2] + (zdc.energySectorZNA())[3]; + float sumZPC = (zdc.energySectorZPC())[0] + (zdc.energySectorZPC())[1] + (zdc.energySectorZPC())[2] + (zdc.energySectorZPC())[3]; + float sumZPA = (zdc.energySectorZPA())[0] + (zdc.energySectorZPA())[1] + (zdc.energySectorZPA())[2] + (zdc.energySectorZPA())[3]; + + int itsTracks = 0, glbTracks = 0; + float et = 0., meanpt = 0.; + for (const auto& track : tracks) { + if (track.hasITS() && track.itsNCls() >= minITSnCls) { + itsTracks++; + } + // Track Selection + if (track.isGlobalTrack()) { + glbTracks++; + meanpt += track.pt(); + et += std::sqrt(std::pow(track.pt(), 2.) + std::pow(o2::constants::physics::MassPionCharged, 2.)); + } + } + + histos.fill(HIST("zPos"), collision.posZ()); + histos.fill(HIST("T0Ccent"), collision.centFT0C()); + + histos.fill(HIST("ZNCcvsZNCsum"), sumZNC / 2.81, zdc.energyCommonZNC() / 2.81); + histos.fill(HIST("ZNAcvsZNAsum"), sumZNA / 2.81, zdc.energyCommonZNA() / 2.81); + histos.fill(HIST("ZPCcvsZPCsum"), sumZPC / 2.81, zdc.energyCommonZPC() / 2.81); + histos.fill(HIST("ZPAcvsZPAsum"), sumZPA / 2.81, zdc.energyCommonZPA() / 2.81); + + histos.fill(HIST("ZNA"), znA); + histos.fill(HIST("ZNC"), znC); + histos.fill(HIST("ZPA"), zpA); + histos.fill(HIST("ZPC"), zpC); + histos.fill(HIST("ZN"), znA + znC); + histos.fill(HIST("ZNAVsZNC"), znC, znA); + histos.fill(HIST("ZNAVsZPA"), zpA, znA); + histos.fill(HIST("ZNCVsZPC"), zpC, znC); + histos.fill(HIST("ZPAVsZPC"), zpC, zpA); + histos.fill(HIST("ZNVsZEM"), sumZEMs, sumZNs); + histos.fill(HIST("ZNCVstdc"), tZNC, znC); + histos.fill(HIST("ZNAVstdc"), tZNA, znA); + histos.fill(HIST("ZPCVstdc"), tZPC, zpC); + histos.fill(HIST("ZPAVstdc"), tZPA, zpA); + histos.fill(HIST("ZEM1Vstdc"), tZEM1, aZEM1); + histos.fill(HIST("ZEM2Vstdc"), tZEM2, aZEM2); + histos.fill(HIST("debunch"), tZDCdif, tZDCsum); + + histos.fill(HIST("ZNVsFT0A"), aT0A / 100., sumZNs); + histos.fill(HIST("ZNVsFT0C"), aT0C / 100., sumZNs); + histos.fill(HIST("ZNVsFT0M"), (aT0A + aT0C) / 100., sumZNs); + + if (sumZNs > znBasedCut) { + return; + } + histos.fill(HIST("NchVsFV0A"), aV0A / 100., glbTracks); + histos.fill(HIST("NchVsFT0A"), aT0A / 100., glbTracks); + histos.fill(HIST("NchVsFT0C"), aT0C / 100., glbTracks); + histos.fill(HIST("NchVsFT0M"), (aT0A + aT0C) / 100., glbTracks); + + histos.fill(HIST("NchVsEt"), et, glbTracks); + histos.fill(HIST("NchVsITStracks"), itsTracks, glbTracks); + histos.fill(HIST("ZNAVsNch"), glbTracks, znA); + histos.fill(HIST("ZNCVsNch"), glbTracks, znC); + histos.fill(HIST("ZNVsNch"), glbTracks, sumZNs); + histos.fill(HIST("ZNDifVsNch"), glbTracks, znA - znC); + if (glbTracks >= minNchSel) { + histos.fill(HIST("NchVsMeanPt"), glbTracks, meanpt / glbTracks); + } + } + void processQVector(AodCollisions::iterator const& collision, aod::BCsWithTimestamps const&, AodTracks const& tracks, BCsRun3 const& /*bcs*/, aod::Zdcs const& /*zdcsData*/, aod::ZDCMults const& /*zdcMults*/) { if (!isEventSelected(collision)) { @@ -376,9 +620,6 @@ struct FlowZdcTask { return; } int nTot = tracks.size(); - double sumCosPsiDiff = 0.0; // initialize Sum of cosPsiDiff for averaging - double sumSinPsiDiff = 0.0; // initialize Sum of cosPsiDiff for averaging - int countEvents = 0; // initialize Counter for the number of events processed double ft0aAmp = 0; double ft0cAmp = 0; float tZNA{0.0}; @@ -433,10 +674,10 @@ struct FlowZdcTask { } } // common energies - float commonSumZnc = (zdcread.energyCommonZNC()) / acceptanceZnc; - float commonSumZna = (zdcread.energyCommonZNA()) / acceptanceZna; - float commonSumZpc = (zdcread.energyCommonZPC()) / acceptanceZpc; - float commonSumZpa = (zdcread.energyCommonZPA()) / acceptanceZpa; + float commonSumZnc = (zdcread.energyCommonZNC()); + float commonSumZna = (zdcread.energyCommonZNA()); + float commonSumZpc = (zdcread.energyCommonZPC()); + float commonSumZpa = (zdcread.energyCommonZPA()); float sumZN = (sumZNC) + (sumZNA); float sumZP = (sumZPC) + (sumZPA); @@ -463,61 +704,6 @@ struct FlowZdcTask { pZPvsFT0Ccent->Fill(cent, sumZP); histos.get(HIST("ZDC_energy_vs_ZEM"))->Fill(sumZEM, sumZDC); - - // Spectator plane angle calculations and histograms - const auto nTotZna = zdcread.amplitudeZNA(); - const auto nTotZnc = zdcread.amplitudeZNC(); - double qZnaReal = 0.0; - double qZnaIm = 0.0; - double qZncReal = 0.0; - double qZncIm = 0.0; - const double phiRadians[4] = {45 * o2::constants::math::PI / 180, 135 * o2::constants::math::PI / 180, 225 * o2::constants::math::PI / 180, 315 * o2::constants::math::PI / 180}; - std::complex qZNA = std::complex(0.0, 0.0); - std::complex qZNC = std::complex(0.0, 0.0); - - for (int sector = 0; sector < 4; ++sector) { - float energyZNA = zdcread.energySectorZNA()[sector]; - float energyZNC = zdcread.energySectorZNC()[sector]; - - qZNA += std::complex(std::cos(2 * phiRadians[sector]) * energyZNA / sumZNA, std::sin(2 * phiRadians[sector]) * energyZNA / sumZNA); - qZNC += std::complex(std::cos(2 * phiRadians[sector]) * energyZNC / sumZNC, std::sin(2 * phiRadians[sector]) * energyZNC / sumZNC); - } - - qZnaReal = qZNA.real() / nTotZna; - qZnaIm = qZNA.imag() / nTotZna; - qZncReal = qZNC.real() / nTotZnc; - qZncIm = qZNC.imag() / nTotZnc; - - histos.fill(HIST("Acorrelations"), qZNA.real(), qZNA.imag()); - histos.fill(HIST("RealQHistogramZNA"), qZnaReal); - histos.fill(HIST("ImagQHistogramZNA"), qZnaIm); - histos.fill(HIST("RealQHistogramZNC"), qZncReal); - histos.fill(HIST("ImagQHistogramZNC"), qZncIm); - - // Calculate the spectator plane angles for ZNA and ZNC - double psiZNA = std::atan2(qZNA.imag(), qZNA.real()) / 2.0; - double psiZNC = std::atan2(qZNC.imag(), qZNC.real()) / 2.0; - - // Fill the histograms with the calculated angles - histos.fill(HIST("SPAngleZNA"), psiZNA); - histos.fill(HIST("SPAngleZNC"), psiZNC); - - double cosPsiDiff = std::cos(psiZNA) - std::cos(psiZNC); - double sinPsiDiff = std::sin(psiZNA) - std::sin(psiZNC); - - sumCosPsiDiff += cosPsiDiff; - sumSinPsiDiff += sinPsiDiff; - ++countEvents; - - if (countEvents > 0) { - double runningAverageCosPsiDiff = sumCosPsiDiff / countEvents; - double runningAverageSinPsiDiff = sumSinPsiDiff / countEvents; - histos.fill(HIST("RunningAverageCosPsiDiff"), runningAverageCosPsiDiff); - pCosPsiDifferences->Fill(cent, runningAverageCosPsiDiff); - pSinPsiDifferences->Fill(cent, runningAverageSinPsiDiff); - } - histos.fill(HIST("CosPsiDifferences"), cosPsiDiff); - histos.fill(HIST("hSinDifferences"), sinPsiDiff); } } @@ -541,6 +727,7 @@ struct FlowZdcTask { } PROCESS_SWITCH(FlowZdcTask, processZdcCollAssoc, "Processing ZDC w. collision association", true); + PROCESS_SWITCH(FlowZdcTask, processQA, "Process QA", true); PROCESS_SWITCH(FlowZdcTask, processQVector, "Process before recentering", true); PROCESS_SWITCH(FlowZdcTask, processCorrelation, "Process correlations", true); From 81ebf8025e2f66f0f2c85023b54b6c3fd3bdc10c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Mon, 5 May 2025 00:08:45 +0200 Subject: [PATCH 1173/1650] [PWGHF] fix a typo for the process function counts of Lcp femto producer (#11077) --- PWGHF/HFC/TableProducer/femtoDreamProducer.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx b/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx index 63b0a61b0b5..ef08bdfced7 100644 --- a/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx +++ b/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx @@ -166,7 +166,7 @@ struct HfFemtoDreamProducer { void init(InitContext&) { - std::array processes = {doprocessDataCharmHad, doprocessMcCharmHad, doprocessMcCharmHadGen}; + std::array processes = {doprocessDataCharmHad, doprocessMcCharmHad, doprocessDataCharmHadWithML, doprocessMcCharmHadWithML, doprocessMcCharmHadGen}; if (std::accumulate(processes.begin(), processes.end(), 0) != 1) { LOGP(fatal, "One and only one process function must be enabled at a time."); } From f685a70ddcc1babaeedb28329b44434b49126b6c Mon Sep 17 00:00:00 2001 From: Francesco Mazzaschi <43742195+fmazzasc@users.noreply.github.com> Date: Mon, 5 May 2025 08:46:07 +0200 Subject: [PATCH 1174/1650] [Common] ITS PID: set MC parametrisations and fix resolution term for Z=2 (#11050) Co-authored-by: Francesco Mazzaschi --- Common/DataModel/PIDResponseITS.h | 14 +++++++++++--- Common/TableProducer/PID/pidITS.cxx | 6 +++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/Common/DataModel/PIDResponseITS.h b/Common/DataModel/PIDResponseITS.h index 4d582e54511..6a6afdc8827 100644 --- a/Common/DataModel/PIDResponseITS.h +++ b/Common/DataModel/PIDResponseITS.h @@ -73,9 +73,9 @@ struct ITSResponse { // static constexpr float charge = static_cast(o2::track::pid_constants::sCharges[id]); const float bg = momentum * inverseMass; if (id == o2::track::PID::Helium3 || id == o2::track::PID::Alpha) { - return mResolutionParamsZ2[0] * std::erf((bg - mResolutionParamsZ2[1]) / mResolutionParamsZ2[2]); + return mResolutionParamsZ2[1] > -999.0 ? mResolutionParamsZ2[0] * std::erf((bg - mResolutionParamsZ2[1]) / mResolutionParamsZ2[2]) : mResolutionParamsZ2[0]; } - return mResolutionParams[0] * std::erf((bg - mResolutionParams[1]) / mResolutionParams[2]); + return mResolutionParams[1] > -999.0 ? mResolutionParams[0] * std::erf((bg - mResolutionParams[1]) / mResolutionParams[2]) : mResolutionParams[0]; } template @@ -117,6 +117,14 @@ struct ITSResponse { mResolutionParamsZ2[2] = p2_res_Z2; } + static void setMCDefaultParameters() + { + setParameters(1.63806, 1.58847, 2.52275, + 2.66505, 1.48405, 6.90453, + 1.40487e-01, -4.31078e-01, 1.50052, + 0.09, -999., -999.); + } + private: static std::array mITSRespParams; static std::array mITSRespParamsZ2; @@ -129,7 +137,7 @@ std::array ITSResponse::mITSRespParams = {1.18941, 1.53792, 1.69961}; std::array ITSResponse::mITSRespParamsZ2 = {2.35117, 1.80347, 5.14355}; // relative resolution is modelled with an erf function: [0]*TMath::Erf((x-[1])/[2]) std::array ITSResponse::mResolutionParams = {1.94669e-01, -2.08616e-01, 1.30753}; -std::array ITSResponse::mResolutionParamsZ2 = {8.74371e-02, -1.82804, 5.06449e-01}; +std::array ITSResponse::mResolutionParamsZ2 = {0.09, -999., -999.}; bool ITSResponse::mIsInitialized = false; namespace pidits diff --git a/Common/TableProducer/PID/pidITS.cxx b/Common/TableProducer/PID/pidITS.cxx index c3f437e6c8d..fbcc801c357 100644 --- a/Common/TableProducer/PID/pidITS.cxx +++ b/Common/TableProducer/PID/pidITS.cxx @@ -51,12 +51,12 @@ static const std::vector parameterNames{"RespITSPar1", "RespITSPar2 "ResolutionPar1_Z2", "ResolutionPar2_Z2", "ResolutionPar3_Z2"}; static constexpr float defaultParameters[nCases][nParameters] = { - {1.18941, 1.53792, 1.69961, 2.35117, 1.80347, 5.14355, 1.94669e-01, -2.08616e-01, 1.30753, 8.74371e-02, -1.82804, 5.06449e-01}, - {1.18941, 1.53792, 1.69961, 2.35117, 1.80347, 5.14355, 1.94669e-01, -2.08616e-01, 1.30753, 8.74371e-02, -1.82804, 5.06449e-01}}; + {1.18941, 1.53792, 1.69961, 2.35117, 1.80347, 5.14355, 1.94669e-01, -2.08616e-01, 1.30753, 0.09, -999., -999.}, + {1.63806, 1.58847, 2.52275, 2.66505, 1.48405, 6.90453, 1.40487e-01, -4.31078e-01, 1.50052, 0.09, -999., -999.}}; /// Task to produce the ITS PID information for each particle species /// The parametrization is: [p0/(bg)**p1 + p2] being bg = p/m. Different parametrizations are used for He3 and Alpha particles. -/// The resolution depends on the bg and is modelled with an erf function: p0*TMath::Erf((bg-p1)/p2) +/// The resolution depends on the bg and is modelled with an erf function: p0*TMath::Erf((bg-p1)/p2). If p1/p2 is -999, the resolution is set to p0. struct itsPid { Configurable> itsParams{"itsParams", From 523e6bf68fa094a3f463dc24b4a58e0a3152fea0 Mon Sep 17 00:00:00 2001 From: shahor02 Date: Mon, 5 May 2025 09:26:35 +0200 Subject: [PATCH 1175/1650] [Common] Add TrackQAConverter003 (#10760) --- .../TableProducer/Converters/CMakeLists.txt | 5 + .../Converters/trackQA003Converter.cxx | 133 ++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 Common/TableProducer/Converters/trackQA003Converter.cxx diff --git a/Common/TableProducer/Converters/CMakeLists.txt b/Common/TableProducer/Converters/CMakeLists.txt index 13b1fbb38be..34ddc8efb3e 100644 --- a/Common/TableProducer/Converters/CMakeLists.txt +++ b/Common/TableProducer/Converters/CMakeLists.txt @@ -94,6 +94,11 @@ o2physics_add_dpl_workflow(trackqa-converter-002 PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(trackqa-converter-003 + SOURCES trackQA003Converter.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(run2bcinfos-converter SOURCES run2bcinfosConverter.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore diff --git a/Common/TableProducer/Converters/trackQA003Converter.cxx b/Common/TableProducer/Converters/trackQA003Converter.cxx new file mode 100644 index 00000000000..56a6d3551e9 --- /dev/null +++ b/Common/TableProducer/Converters/trackQA003Converter.cxx @@ -0,0 +1,133 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +#include + +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" + +using namespace o2; +using namespace o2::framework; + +struct TrackQAConverter003 { + Produces tracksQA_003; + + void process000(aod::TracksQA_000 const& tracksQA_000) + { + for (const auto& trackQA : tracksQA_000) { + tracksQA_003( + trackQA.trackId(), + trackQA.tpcTime0(), + 0.f, // dummy, not available in _000 + trackQA.tpcdcaR(), + trackQA.tpcdcaZ(), + trackQA.tpcClusterByteMask(), + trackQA.tpcdEdxMax0R(), + trackQA.tpcdEdxMax1R(), + trackQA.tpcdEdxMax2R(), + trackQA.tpcdEdxMax3R(), + trackQA.tpcdEdxTot0R(), + trackQA.tpcdEdxTot1R(), + trackQA.tpcdEdxTot2R(), + trackQA.tpcdEdxTot3R(), + // dummy values, not available in _000 + std::numeric_limits::min(), // deltaRefContParamY + std::numeric_limits::min(), // deltaRefContParamZ + std::numeric_limits::min(), // deltaRefContParamSnp + std::numeric_limits::min(), // deltaRefContParamTgl + std::numeric_limits::min(), // deltaRefContParamQ2Pt + std::numeric_limits::min(), // deltaRefGloParamY + std::numeric_limits::min(), // deltaRefGloParamZ + std::numeric_limits::min(), // deltaRefGloParamSnp + std::numeric_limits::min(), // deltaRefGloParamTgl + std::numeric_limits::min(), // deltaRefGloParamQ2Pt + std::numeric_limits::min(), // dTofdX + std::numeric_limits::min()); // dTofdY + } + } + PROCESS_SWITCH(TrackQAConverter003, process000, "process v000-to-v003 conversion", false); + + void process001(aod::TracksQA_001 const& tracksQA_001) + { + for (const auto& trackQA : tracksQA_001) { + tracksQA_003( + trackQA.trackId(), + trackQA.tpcTime0(), + 0.f, // dummy, not available in _001 + trackQA.tpcdcaR(), + trackQA.tpcdcaZ(), + trackQA.tpcClusterByteMask(), + trackQA.tpcdEdxMax0R(), + trackQA.tpcdEdxMax1R(), + trackQA.tpcdEdxMax2R(), + trackQA.tpcdEdxMax3R(), + trackQA.tpcdEdxTot0R(), + trackQA.tpcdEdxTot1R(), + trackQA.tpcdEdxTot2R(), + trackQA.tpcdEdxTot3R(), + trackQA.deltaRefContParamY(), + trackQA.deltaRefITSParamZ(), + trackQA.deltaRefContParamSnp(), + trackQA.deltaRefContParamTgl(), + trackQA.deltaRefContParamQ2Pt(), + trackQA.deltaRefGloParamY(), + trackQA.deltaRefGloParamZ(), + trackQA.deltaRefGloParamSnp(), + trackQA.deltaRefGloParamTgl(), + trackQA.deltaRefGloParamQ2Pt(), + // dummy values, not available in _001 + std::numeric_limits::min(), // dTofdX + std::numeric_limits::min()); // dTofdY + } + } + PROCESS_SWITCH(TrackQAConverter003, process001, "process v001-to-v003 conversion", false); + + void process002(aod::TracksQA_002 const& tracksQA_002) + { + for (const auto& trackQA : tracksQA_002) { + tracksQA_003( + trackQA.trackId(), + trackQA.tpcTime0(), + 0.f, // dummy, not available in _002 + trackQA.tpcdcaR(), + trackQA.tpcdcaZ(), + trackQA.tpcClusterByteMask(), + trackQA.tpcdEdxMax0R(), + trackQA.tpcdEdxMax1R(), + trackQA.tpcdEdxMax2R(), + trackQA.tpcdEdxMax3R(), + trackQA.tpcdEdxTot0R(), + trackQA.tpcdEdxTot1R(), + trackQA.tpcdEdxTot2R(), + trackQA.tpcdEdxTot3R(), + trackQA.deltaRefContParamY(), + trackQA.deltaRefITSParamZ(), + trackQA.deltaRefContParamSnp(), + trackQA.deltaRefContParamTgl(), + trackQA.deltaRefContParamQ2Pt(), + trackQA.deltaRefGloParamY(), + trackQA.deltaRefGloParamZ(), + trackQA.deltaRefGloParamSnp(), + trackQA.deltaRefGloParamTgl(), + trackQA.deltaRefGloParamQ2Pt(), + trackQA.deltaTOFdX(), + trackQA.deltaTOFdZ()); + } + } + PROCESS_SWITCH(TrackQAConverter003, process002, "process v002-to-v003 conversion", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc), + }; +} From 1c64306f2b3bb4b8adce04fbb59f980b01d39e65 Mon Sep 17 00:00:00 2001 From: Mingrui Zhao Date: Mon, 5 May 2025 19:05:08 +0800 Subject: [PATCH 1176/1650] [PWGUD] Add some cuts (#11076) Co-authored-by: rabbit --- PWGUD/Tasks/flowCorrelationsUpc.cxx | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/PWGUD/Tasks/flowCorrelationsUpc.cxx b/PWGUD/Tasks/flowCorrelationsUpc.cxx index 7b00062f453..59aae4d6c86 100644 --- a/PWGUD/Tasks/flowCorrelationsUpc.cxx +++ b/PWGUD/Tasks/flowCorrelationsUpc.cxx @@ -225,8 +225,17 @@ struct FlowCorrelationsUpc { void processSame(UDCollisionsFull::iterator const& collision, UdTracksFull const& tracks) { + if (std::abs(collision.posZ()) > cfgZVtxCut) { + return; + } + if (tracks.size() < cfgMinMult || tracks.size() > cfgMaxMult) { + return; + } + int gapSide = collision.gapSide(); - if (gapSide < 0 || gapSide > 2) { + const int minGapSide = 0; + const int maxGapSide = 2; + if (gapSide < minGapSide || gapSide > maxGapSide) { return; } From 60d3b9c55dc9d840c2e7d04630496ffa4043d59d Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Mon, 5 May 2025 21:14:19 +0900 Subject: [PATCH 1177/1650] [PWGEM/Dilepton] update taggingHFE.cxx (#11084) --- PWGEM/Dilepton/Tasks/eventQC.cxx | 2 +- PWGEM/Dilepton/Tasks/taggingHFE.cxx | 695 +++++++++++++++++----------- 2 files changed, 437 insertions(+), 260 deletions(-) diff --git a/PWGEM/Dilepton/Tasks/eventQC.cxx b/PWGEM/Dilepton/Tasks/eventQC.cxx index 4a3ac116cd5..afd65dbbe7e 100644 --- a/PWGEM/Dilepton/Tasks/eventQC.cxx +++ b/PWGEM/Dilepton/Tasks/eventQC.cxx @@ -1048,7 +1048,7 @@ struct eventQC { PROCESS_SWITCH(eventQC, processEventQC_Cent_Qvec, "event QC + q vector", false); //! type of V0. 0: built solely for cascades (does not pass standard V0 cuts), 1: standard 2, 3: photon-like with TPC-only use. Regular analysis should always use type 1. - Filter v0Filter = o2::aod::v0data::v0Type == uint8_t(1) && o2::aod::v0data::v0cosPA > v0cuts.cfg_min_cospa_v0hadron.value&& o2::aod::v0data::dcaV0daughters < v0cuts.cfg_max_pca_v0hadron.value; + Filter v0Filter = o2::aod::v0data::v0Type == uint8_t(1) && o2::aod::v0data::v0cosPA > v0cuts.cfg_min_cospa_v0hadron&& o2::aod::v0data::dcaV0daughters < v0cuts.cfg_max_pca_v0hadron; using filteredV0s = soa::Filtered; void processEventQC_V0_PID(FilteredMyCollisions const& collisions, FilteredMyTracks const& tracks, aod::V0PhotonsKF const& v0photons, aod::V0Legs const& v0legs, filteredV0s const& v0strhadrons) diff --git a/PWGEM/Dilepton/Tasks/taggingHFE.cxx b/PWGEM/Dilepton/Tasks/taggingHFE.cxx index ec24ce8ca63..6dd3a30d5b1 100644 --- a/PWGEM/Dilepton/Tasks/taggingHFE.cxx +++ b/PWGEM/Dilepton/Tasks/taggingHFE.cxx @@ -16,6 +16,7 @@ #include #include #include +#include #include "Math/Vector4D.h" #include "Framework/runDataProcessing.h" @@ -70,13 +71,11 @@ struct taggingHFE { Configurable d_UseWeightedPCA{"d_UseWeightedPCA", false, "Vertices use cov matrices"}; struct : ConfigurableGroup { - std::string prefix = "trackcut_group"; + std::string prefix = "electroncut_group"; Configurable cfg_min_pt_track{"cfg_min_pt_track", 0.05, "min pT for single track"}; Configurable cfg_max_pt_track{"cfg_max_pt_track", 1e+10, "max pT for single track"}; Configurable cfg_min_eta_track{"cfg_min_eta_track", -0.9, "min eta for single track"}; Configurable cfg_max_eta_track{"cfg_max_eta_track", +0.9, "max eta for single track"}; - Configurable cfg_min_eta_track_wide{"cfg_min_eta_track_wide", -1.2, "min eta for single track (tagger)"}; - Configurable cfg_max_eta_track_wide{"cfg_max_eta_track_wide", +1.2, "max eta for single track (tagger)"}; Configurable cfg_min_cr2findable_ratio_tpc{"cfg_min_cr2findable_ratio_tpc", 0.8, "min. TPC Ncr/Nf ratio"}; Configurable cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 0.7, "max fraction of shared clusters in TPC"}; Configurable cfg_min_ncrossedrows_tpc{"cfg_min_ncrossedrows_tpc", 70, "min ncrossed rows"}; @@ -88,30 +87,35 @@ struct taggingHFE { Configurable cfg_max_chi2tof{"cfg_max_chi2tof", 1e+10, "max chi2/NclsTOF"}; Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 0.3, "max dca XY for single track in cm"}; Configurable cfg_max_dcaz{"cfg_max_dcaz", 0.3, "max dca Z for single track in cm"}; + } electroncuts; - Configurable cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -3, "min n sigma e in TPC"}; - Configurable cfg_max_TPCNsigmaEl{"cfg_max_TPCNsigmaEl", +3, "max n sigma e in TPC"}; - Configurable cfg_min_TPCNsigmaPi{"cfg_min_TPCNsigmaPi", -3, "min n sigma pi in TPC"}; - Configurable cfg_max_TPCNsigmaPi{"cfg_max_TPCNsigmaPi", +3, "max n sigma pi in TPC"}; + struct : ConfigurableGroup { + std::string prefix = "kaoncut_group"; + Configurable cfg_min_pt_track{"cfg_min_pt_track", 0.05, "min pT for single track"}; + Configurable cfg_max_pt_track{"cfg_max_pt_track", 1e+10, "max pT for single track"}; + Configurable cfg_min_eta_track{"cfg_min_eta_track", -1.2, "min eta for single track"}; + Configurable cfg_max_eta_track{"cfg_max_eta_track", +1.2, "max eta for single track"}; + Configurable cfg_min_cr2findable_ratio_tpc{"cfg_min_cr2findable_ratio_tpc", 0.8, "min. TPC Ncr/Nf ratio"}; + Configurable cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 0.7, "max fraction of shared clusters in TPC"}; + Configurable cfg_min_ncrossedrows_tpc{"cfg_min_ncrossedrows_tpc", 40, "min ncrossed rows"}; + Configurable cfg_min_ncluster_tpc{"cfg_min_ncluster_tpc", 0, "min ncluster tpc"}; + Configurable cfg_min_ncluster_its{"cfg_min_ncluster_its", 4, "min ncluster its"}; + Configurable cfg_min_ncluster_itsib{"cfg_min_ncluster_itsib", 1, "min ncluster itsib"}; + Configurable cfg_max_chi2tpc{"cfg_max_chi2tpc", 4.0, "max chi2/NclsTPC"}; + Configurable cfg_max_chi2its{"cfg_max_chi2its", 36.0, "max chi2/NclsITS"}; + Configurable cfg_max_chi2tof{"cfg_max_chi2tof", 1e+10, "max chi2/NclsTOF"}; + Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 0.5, "max dca XY for single track in cm"}; + Configurable cfg_max_dcaz{"cfg_max_dcaz", 0.5, "max dca Z for single track in cm"}; Configurable cfg_min_TPCNsigmaKa{"cfg_min_TPCNsigmaKa", -3, "min n sigma ka in TPC"}; Configurable cfg_max_TPCNsigmaKa{"cfg_max_TPCNsigmaKa", +3, "max n sigma ka in TPC"}; - Configurable cfg_min_TPCNsigmaPr{"cfg_min_TPCNsigmaPr", -3, "min n sigma pr in TPC"}; - Configurable cfg_max_TPCNsigmaPr{"cfg_max_TPCNsigmaPr", +3, "max n sigma pr in TPC"}; - - Configurable cfg_min_TOFNsigmaEl{"cfg_min_TOFNsigmaEl", -3, "min n sigma el in TOF"}; - Configurable cfg_max_TOFNsigmaEl{"cfg_max_TOFNsigmaEl", +3, "max n sigma el in TOF"}; - Configurable cfg_min_TOFNsigmaPi{"cfg_min_TOFNsigmaPi", -3, "min n sigma pi in TOF"}; - Configurable cfg_max_TOFNsigmaPi{"cfg_max_TOFNsigmaPi", +3, "max n sigma pi in TOF"}; Configurable cfg_min_TOFNsigmaKa{"cfg_min_TOFNsigmaKa", -3, "min n sigma ka in TOF"}; Configurable cfg_max_TOFNsigmaKa{"cfg_max_TOFNsigmaKa", +3, "max n sigma ka in TOF"}; - Configurable cfg_min_TOFNsigmaPr{"cfg_min_TOFNsigmaPr", -3, "min n sigma pr in TOF"}; - Configurable cfg_max_TOFNsigmaPr{"cfg_max_TOFNsigmaPr", +3, "max n sigma pr in TOF"}; - } trackcuts; + } kaoncuts; struct : ConfigurableGroup { std::string prefix = "svcut_group"; Configurable cfg_min_cospa{"cfg_min_cospa", 0.8, "min cospa"}; - Configurable cfg_min_cospaXY{"cfg_min_cospaXY", 0.0, "min cospaXY"}; + Configurable cfg_min_cospaXY{"cfg_min_cospaXY", 0.8, "min cospaXY"}; Configurable cfg_max_dca2legs{"cfg_max_dca2legs", 1.0, "max distance between 2 legs"}; Configurable cfg_min_lxy{"cfg_min_lxy", -1, "min lxy for charm hadron candidate"}; Configurable cfg_max_mass_eK{"cfg_max_mass_eK", 2.0, "max mass for eK pair"}; @@ -120,38 +124,30 @@ struct taggingHFE { struct : ConfigurableGroup { std::string prefix = "v0cut_group"; - Configurable cfg_min_mass_k0s{"cfg_min_mass_k0s", 0.49, "min mass for K0S"}; - Configurable cfg_max_mass_k0s{"cfg_max_mass_k0s", 0.51, "max mass for K0S"}; + Configurable cfg_min_mass_k0s{"cfg_min_mass_k0s", 0.485, "min mass for K0S"}; + Configurable cfg_max_mass_k0s{"cfg_max_mass_k0s", 0.510, "max mass for K0S"}; Configurable cfg_min_mass_lambda{"cfg_min_mass_lambda", 1.11, "min mass for Lambda rejection"}; Configurable cfg_max_mass_lambda{"cfg_max_mass_lambda", 1.12, "max mass for Lambda rejection"}; Configurable cfg_min_cospa_v0hadron{"cfg_min_cospa_v0hadron", 0.95, "min cospa for v0hadron"}; - Configurable cfg_max_pca_v0hadron{"cfg_max_pca_v0hadron", 0.5, "max distance between 2 legs for v0hadron"}; + Configurable cfg_max_pca_v0hadron{"cfg_max_pca_v0hadron", 0.2, "max distance between 2 legs for v0hadron"}; // Configurable cfg_min_radius_v0hadron{"cfg_min_radius_v0hadron", 0.1, "min rxy for v0hadron"}; Configurable cfg_min_cr2findable_ratio_tpc{"cfg_min_cr2findable_ratio_tpc", 0.8, "min. TPC Ncr/Nf ratio"}; Configurable cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 999.f, "max fraction of shared clusters in TPC"}; Configurable cfg_min_ncrossedrows_tpc{"cfg_min_ncrossedrows_tpc", 40, "min ncrossed rows"}; Configurable cfg_min_ncluster_tpc{"cfg_min_ncluster_tpc", 0, "min ncluster tpc"}; Configurable cfg_max_chi2tpc{"cfg_max_chi2tpc", 4.0, "max chi2/NclsTPC"}; - Configurable cfg_max_chi2its{"cfg_max_chi2its", 5.0, "max chi2/NclsITS"}; - Configurable cfg_min_ncluster_its{"cfg_min_ncluster_its", 4, "min ncluster its"}; - Configurable cfg_min_ncluster_itsib{"cfg_min_ncluster_itsib", 1, "min ncluster itsib"}; + Configurable cfg_max_chi2its{"cfg_max_chi2its", 36.0, "max chi2/NclsITS"}; + Configurable cfg_min_ncluster_its{"cfg_min_ncluster_its", 2, "min ncluster its"}; + Configurable cfg_min_ncluster_itsib{"cfg_min_ncluster_itsib", 0, "min ncluster itsib"}; Configurable cfg_max_chi2tof{"cfg_max_chi2tof", 1e+10, "max chi2 for TOF"}; - Configurable cfg_min_dcaxy{"cfg_min_dcaxy", -1, "min dca XY for v0 legs in cm"}; - Configurable cfg_min_TPCNsigmaEl{"cfg_min_TPCNsigmaEl", -3, "min n sigma e in TPC"}; - Configurable cfg_max_TPCNsigmaEl{"cfg_max_TPCNsigmaEl", +3, "max n sigma e in TPC"}; + Configurable cfg_min_dcaxy{"cfg_min_dcaxy", 0.1, "min dca XY for v0 legs in cm"}; + Configurable cfg_min_TPCNsigmaPi{"cfg_min_TPCNsigmaPi", -3, "min n sigma pi in TPC"}; Configurable cfg_max_TPCNsigmaPi{"cfg_max_TPCNsigmaPi", +3, "max n sigma pi in TPC"}; - Configurable cfg_min_TPCNsigmaKa{"cfg_min_TPCNsigmaKa", -3, "min n sigma ka in TPC"}; - Configurable cfg_max_TPCNsigmaKa{"cfg_max_TPCNsigmaKa", +3, "max n sigma ka in TPC"}; Configurable cfg_min_TPCNsigmaPr{"cfg_min_TPCNsigmaPr", -3, "min n sigma pr in TPC"}; Configurable cfg_max_TPCNsigmaPr{"cfg_max_TPCNsigmaPr", +3, "max n sigma pr in TPC"}; - - Configurable cfg_min_TOFNsigmaEl{"cfg_min_TOFNsigmaEl", -3, "min n sigma el in TOF"}; - Configurable cfg_max_TOFNsigmaEl{"cfg_max_TOFNsigmaEl", +3, "max n sigma el in TOF"}; Configurable cfg_min_TOFNsigmaPi{"cfg_min_TOFNsigmaPi", -3, "min n sigma pi in TOF"}; Configurable cfg_max_TOFNsigmaPi{"cfg_max_TOFNsigmaPi", +3, "max n sigma pi in TOF"}; - Configurable cfg_min_TOFNsigmaKa{"cfg_min_TOFNsigmaKa", -3, "min n sigma ka in TOF"}; - Configurable cfg_max_TOFNsigmaKa{"cfg_max_TOFNsigmaKa", +3, "max n sigma ka in TOF"}; Configurable cfg_min_TOFNsigmaPr{"cfg_min_TOFNsigmaPr", -3, "min n sigma pr in TOF"}; Configurable cfg_max_TOFNsigmaPr{"cfg_max_TOFNsigmaPr", +3, "max n sigma pr in TOF"}; } v0cuts; @@ -165,9 +161,10 @@ struct taggingHFE { Configurable cfgEventGeneratorType{"cfgEventGeneratorType", -1, "if positive, select event generator type. i.e. gap or signal"}; HistogramRegistry fRegistry{"fRegistry"}; - static constexpr std::string_view hadron_names[7] = {"LF/", "promptJpsi/", "nonpromptJpsi/", "D0/", "Dpm/", "Ds/", "Lc/"}; + static constexpr std::string_view hadron_names[6] = {"LF/", "Jpsi/", "D0/", "Dpm/", "Ds/", "Lc/"}; static constexpr std::string_view pair_names[3] = {"e_Kpm/", "e_K0S/", "e_Lambda/"}; static constexpr std::string_view hTypes[4] = {"findable/", "correct/", "fake/", "miss/"}; + static constexpr std::string_view promptTypes[2] = {"prompt/", "nonprompt/"}; void init(o2::framework::InitContext&) { @@ -198,10 +195,11 @@ struct taggingHFE { Service ccdb; // o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT; - o2::dataformats::VertexBase mVtx; const o2::dataformats::MeanVertexObject* mMeanVtx = nullptr; o2::base::MatLayerCylSet* lut = nullptr; o2::vertexing::DCAFitterN<2> fitter; + o2::dataformats::DCA mDcaInfoCov; + o2::dataformats::VertexBase mVtx; void initCCDB(aod::BCsWithTimestamps::iterator const& bc) { @@ -284,6 +282,9 @@ struct taggingHFE { fRegistry.add("e_Kpm/all/hCosPAXY", "cosPA in XY;cosine of pointing angle in XY", kTH1F, {{100, 0, 1}}, false); fRegistry.add("e_Kpm/all/hDCA2Legs", "distance between 2 legs;distance between 2 legs (cm)", kTH1F, {{100, 0, 1}}, false); fRegistry.add("e_Kpm/all/hMass", "mass;mass (GeV/c^{2});p_{T} (GeV/c)", kTH2F, {{40, 0.5, 2.5}, {100, 0, 10}}, false); + fRegistry.add("e_Kpm/all/hDeltaEtaDeltaPhi", "#Delta#varphi vs. #Delta#eta;#Delta#varphi = #varphi_{h} - #varphi_{e} (rad.);#Delta#eta = #eta_{h} - #eta_{e}", kTH2F, {{180, -M_PI, M_PI}, {200, -2, +2}}, false); + fRegistry.add("e_Kpm/all/hRelDeltaPt", "rel delta pT;(p_{T,h} - p_{T,e})/p_{T,e}", kTH1F, {{80, -2, +2}}, false); + fRegistry.add("e_Kpm/all/hProdDCAxy", "product of DCAxy;d_{xy}^{e} #times d_{xy}^{h} (cm)^{2}", kTH1F, {{100, -0.05, +0.05}}, false); fRegistry.addClone("e_Kpm/all/", "e_Kpm/D0/"); fRegistry.addClone("e_Kpm/all/", "e_Kpm/Dpm/"); @@ -304,12 +305,12 @@ struct taggingHFE { fRegistry.add("V0/K0S/hPt", "pT of V0;p_{T} (GeV/c)", kTH1F, {{100, 0, 10}}, false); fRegistry.add("V0/K0S/hYPhi", "Y vs. #varphi of V0;#varphi (rad.);rapidity", kTH2F, {{36, 0, 2 * M_PI}, {80, -2, +2}}, false); fRegistry.add("V0/K0S/hAP", "Ap plot;#alpha;q_{T} (GeV/c)", kTH2F, {{200, -1, 1}, {250, 0, 0.25}}, false); - fRegistry.add("V0/K0S/hLxy", "decay length from PV;L_{xy} (cm)", kTH1F, {{200, 0, 2}}, false); + fRegistry.add("V0/K0S/hLxy", "decay length from PV;L_{xy} (cm)", kTH1F, {{100, 0, 10}}, false); fRegistry.add("V0/K0S/hCosPA", "cosPA;cosine of pointing angle", kTH1F, {{100, 0.9, 1}}, false); fRegistry.add("V0/K0S/hDCA2Legs", "distance between 2 legs;distance between 2 legs (cm)", kTH1F, {{100, 0, 1}}, false); fRegistry.addClone("V0/K0S/", "V0/Lambda/"); fRegistry.addClone("V0/K0S/", "V0/AntiLambda/"); - fRegistry.add("V0/K0S/hMassK0S", "K0S mass;m_{#pi#pi} (GeV/c^{2})", kTH1F, {{200, 0.4, 0.6}}, false); + fRegistry.add("V0/K0S/hMassK0S", "K0S mass;m_{#pi#pi} (GeV/c^{2})", kTH1F, {{100, 0.45, 0.55}}, false); fRegistry.add("V0/Lambda/hMassLambda", "Lambda mass;m_{p#pi} (GeV/c^{2})", kTH1F, {{100, 1.08, 1.18}}, false); fRegistry.add("V0/AntiLambda/hMassAntiLambda", "Anti-Lambda mass;m_{p#pi} (GeV/c^{2})", kTH1F, {{100, 1.08, 1.18}}, false); @@ -317,27 +318,31 @@ struct taggingHFE { const AxisSpec axis_dca_sigma{{0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10}, "DCA_{e}^{3D} (#sigma)"}; // for tracks - fRegistry.add("LF/electron/findable/hs", "electron;p_{T,e} (GeV/c);#eta_{e};#varphi_{e} (rad.);DCA_{e}^{3D} (#sigma)", kTHnSparseF, {{axis_pt}, {80, -2, +2}, {36, 0, 2 * M_PI}, {axis_dca_sigma}}, false); - fRegistry.add("LF/electron/findable/hTPCdEdx", "TPC dE/dx;p_{in} (GeV/c);TPC dE/dx (a.u.)", kTH2F, {{1000, 0, 10}, {200, 0, 200}}, false); - fRegistry.add("LF/electron/findable/hTOFbeta", "TOF #beta;p_{pv} (GeV/c);#beta", kTH2F, {{1000, 0, 10}, {240, 0, 1.2}}, false); + fRegistry.add("LF/electron/prompt/findable/hs", "electron;p_{T,e} (GeV/c);#eta_{e};#varphi_{e} (rad.);DCA_{e}^{3D} (#sigma)", kTHnSparseF, {{axis_pt}, {80, -2, +2}, {36, 0, 2 * M_PI}, {axis_dca_sigma}}, false); + fRegistry.add("LF/electron/prompt/findable/hTPCdEdx", "TPC dE/dx;p_{in} (GeV/c);TPC dE/dx (a.u.)", kTH2F, {{1000, 0, 10}, {200, 0, 200}}, false); + fRegistry.add("LF/electron/prompt/findable/hTOFbeta", "TOF #beta;p_{pv} (GeV/c);#beta", kTH2F, {{1000, 0, 10}, {240, 0, 1.2}}, false); - fRegistry.addClone("LF/electron/findable/", "LF/electron/correct/"); - fRegistry.addClone("LF/electron/findable/", "LF/electron/fake/"); - fRegistry.addClone("LF/electron/", "promptJpsi/electron/"); - fRegistry.addClone("LF/electron/", "nonpromptJpsi/electron/"); + fRegistry.addClone("LF/electron/prompt/findable/", "LF/electron/prompt/correct/"); + fRegistry.addClone("LF/electron/prompt/findable/", "LF/electron/prompt/fake/"); + fRegistry.addClone("LF/electron/prompt/", "LF/electron/nonprompt/"); + fRegistry.addClone("LF/electron/", "Jpsi/electron/"); fRegistry.addClone("LF/electron/", "D0/electron/"); // D0 -> K- e+ nu, Br = 0.03549 | D0 -> K- e+ pi0 nu, Br = 0.016 | D0 -> K*(892)- e+ nu, Br = 0.0215 // D0 -> anti-K0S e+ pi- nu, Br = 0.0144 fRegistry.addClone("LF/electron/", "Dpm/electron/"); // D+ -> K- pi+ e+ nu, Br = 0.0402 | D+ -> anti-K*(892)0 e+ nu, Br = 0.0540 // D+ -> anti-K0S e+ nu, Br = 0.0872 fRegistry.addClone("LF/electron/", "Ds/electron/"); // Ds+ -> K0S e+ nu, Br = 0.0034 // Ds+ -> phi e+ nu, Br = 0.0239 fRegistry.addClone("LF/electron/", "Lc/electron/"); // Lc+ -> L e+ nu, Br = 0.0356 + + fRegistry.addClone("D0/electron/", "D0/kaon/"); // D0 -> K- e+ nu, Br = 0.03549 | D0 -> K- e+ pi0 nu, Br = 0.016 | D0 -> K*(892)- e+ nu, Br = 0.0215 // D0 -> anti-K0S e+ pi- nu, Br = 0.0144 + fRegistry.addClone("Dpm/electron/", "Dpm/kaon/"); // D+ -> K- pi+ e+ nu, Br = 0.0402 | D+ -> anti-K*(892)0 e+ nu, Br = 0.0540 // D+ -> anti-K0S e+ nu, Br = 0.0872 + fRegistry.addClone("Ds/electron/", "Ds/kaon/"); // Ds+ -> K0S e+ nu, Br = 0.0034 // Ds+ -> phi e+ nu, Br = 0.0239 } template bool isKaon(TTrack const& track) { // TOFif - bool is_ka_included_TPC = trackcuts.cfg_min_TPCNsigmaKa < track.tpcNSigmaKa() && track.tpcNSigmaKa() < trackcuts.cfg_max_TPCNsigmaKa; - bool is_ka_included_TOF = track.hasTOF() ? (trackcuts.cfg_min_TOFNsigmaKa < track.tofNSigmaKa() && track.tofNSigmaKa() < trackcuts.cfg_max_TOFNsigmaKa && track.tofChi2() < trackcuts.cfg_max_chi2tof) : true; + bool is_ka_included_TPC = kaoncuts.cfg_min_TPCNsigmaKa < track.tpcNSigmaKa() && track.tpcNSigmaKa() < kaoncuts.cfg_max_TPCNsigmaKa; + bool is_ka_included_TOF = track.hasTOF() ? (kaoncuts.cfg_min_TOFNsigmaKa < track.tofNSigmaKa() && track.tofNSigmaKa() < kaoncuts.cfg_max_TOFNsigmaKa && track.tofChi2() < kaoncuts.cfg_max_chi2tof) : true; return is_ka_included_TPC && is_ka_included_TOF; } @@ -360,53 +365,115 @@ struct taggingHFE { } template - bool isSelectedTrack(TTrack const& track, TTrackParCov const& trackParCov, const float dcaXY, const float dcaZ) + bool isSelectedTrackForElectron(TTrack const& track, TTrackParCov const& trackParCov, const float dcaXY, const float dcaZ) + { + if (!track.hasITS() || !track.hasTPC()) { + return false; + } + + if (trackParCov.getPt() < electroncuts.cfg_min_pt_track || electroncuts.cfg_max_pt_track < trackParCov.getPt()) { + return false; + } + + if (trackParCov.getEta() < electroncuts.cfg_min_eta_track || electroncuts.cfg_max_eta_track < trackParCov.getEta()) { + return false; + } + + if (std::fabs(dcaXY) > electroncuts.cfg_max_dcaxy) { + return false; + } + + if (std::fabs(dcaZ) > electroncuts.cfg_max_dcaz) { + return false; + } + + if (track.itsChi2NCl() > electroncuts.cfg_max_chi2its) { + return false; + } + + if (track.itsNCls() < electroncuts.cfg_min_ncluster_its) { + return false; + } + + if (track.itsNClsInnerBarrel() < electroncuts.cfg_min_ncluster_itsib) { + return false; + } + + if (track.tpcChi2NCl() > electroncuts.cfg_max_chi2tpc) { + return false; + } + + if (track.tpcNClsFound() < electroncuts.cfg_min_ncluster_tpc) { + return false; + } + + if (track.tpcNClsCrossedRows() < electroncuts.cfg_min_ncrossedrows_tpc) { + return false; + } + + if (track.tpcCrossedRowsOverFindableCls() < electroncuts.cfg_min_cr2findable_ratio_tpc) { + return false; + } + + if (track.tpcFractionSharedCls() > electroncuts.cfg_max_frac_shared_clusters_tpc) { + return false; + } + + return true; + } + + template + bool isSelectedTrackForKaon(TTrack const& track, TTrackParCov const& trackParCov, const float dcaXY, const float dcaZ) { if (!track.hasITS() || !track.hasTPC()) { return false; } - if (trackParCov.getPt() < trackcuts.cfg_min_pt_track || trackcuts.cfg_max_pt_track < trackParCov.getPt()) { + if (trackParCov.getPt() < kaoncuts.cfg_min_pt_track || kaoncuts.cfg_max_pt_track < trackParCov.getPt()) { + return false; + } + + if (trackParCov.getEta() < kaoncuts.cfg_min_eta_track || kaoncuts.cfg_max_eta_track < trackParCov.getEta()) { return false; } - if (std::fabs(dcaXY) > trackcuts.cfg_max_dcaxy) { + if (std::fabs(dcaXY) > kaoncuts.cfg_max_dcaxy) { return false; } - if (std::fabs(dcaZ) > trackcuts.cfg_max_dcaz) { + if (std::fabs(dcaZ) > kaoncuts.cfg_max_dcaz) { return false; } - if (track.itsChi2NCl() > trackcuts.cfg_max_chi2its) { + if (track.itsChi2NCl() > kaoncuts.cfg_max_chi2its) { return false; } - if (track.itsNCls() < trackcuts.cfg_min_ncluster_its) { + if (track.itsNCls() < kaoncuts.cfg_min_ncluster_its) { return false; } - if (track.itsNClsInnerBarrel() < trackcuts.cfg_min_ncluster_itsib) { + if (track.itsNClsInnerBarrel() < kaoncuts.cfg_min_ncluster_itsib) { return false; } - if (track.tpcChi2NCl() > trackcuts.cfg_max_chi2tpc) { + if (track.tpcChi2NCl() > kaoncuts.cfg_max_chi2tpc) { return false; } - if (track.tpcNClsFound() < trackcuts.cfg_min_ncluster_tpc) { + if (track.tpcNClsFound() < kaoncuts.cfg_min_ncluster_tpc) { return false; } - if (track.tpcNClsCrossedRows() < trackcuts.cfg_min_ncrossedrows_tpc) { + if (track.tpcNClsCrossedRows() < kaoncuts.cfg_min_ncrossedrows_tpc) { return false; } - if (track.tpcCrossedRowsOverFindableCls() < trackcuts.cfg_min_cr2findable_ratio_tpc) { + if (track.tpcCrossedRowsOverFindableCls() < kaoncuts.cfg_min_cr2findable_ratio_tpc) { return false; } - if (track.tpcFractionSharedCls() > trackcuts.cfg_max_frac_shared_clusters_tpc) { + if (track.tpcFractionSharedCls() > kaoncuts.cfg_max_frac_shared_clusters_tpc) { return false; } @@ -473,13 +540,25 @@ struct taggingHFE { fRegistry.fill(HIST("Event/hMultFT0CvsMultNTracksPV"), collision.multFT0C(), collision.multNTracksPV()); } - template + template void fillElectronHistograms(TTrack const& track, TTrackParCov const& trackParCov, const float dcaXY, const float dcaZ) + { + if (std::find(used_electronIds.begin(), used_electronIds.end(), std::make_pair(findId, track.globalIndex())) == used_electronIds.end()) { + float dca3DinSigma = dca3DinSigmaOTF(dcaXY, dcaZ, trackParCov.getSigmaY2(), trackParCov.getSigmaZ2(), trackParCov.getSigmaZY()); + fRegistry.fill(HIST(hadron_names[charmHadronId]) + HIST("electron/") + HIST(promptTypes[promptId]) + HIST(hTypes[findId]) + HIST("hs"), trackParCov.getPt(), trackParCov.getEta(), trackParCov.getPhi(), dca3DinSigma); + fRegistry.fill(HIST(hadron_names[charmHadronId]) + HIST("electron/") + HIST(promptTypes[promptId]) + HIST(hTypes[findId]) + HIST("hTPCdEdx"), track.tpcInnerParam(), track.tpcSignal()); + fRegistry.fill(HIST(hadron_names[charmHadronId]) + HIST("electron/") + HIST(promptTypes[promptId]) + HIST(hTypes[findId]) + HIST("hTOFbeta"), trackParCov.getP(), track.beta()); + used_electronIds.emplace_back(std::make_pair(findId, track.globalIndex())); + } + } + + template + void fillKaonHistograms(TTrack const& track, TTrackParCov const& trackParCov, const float dcaXY, const float dcaZ) { float dca3DinSigma = dca3DinSigmaOTF(dcaXY, dcaZ, trackParCov.getSigmaY2(), trackParCov.getSigmaZ2(), trackParCov.getSigmaZY()); - fRegistry.fill(HIST(hadron_names[charmHadronId]) + HIST("electron/") + HIST(hTypes[findId]) + HIST("hs"), trackParCov.getPt(), trackParCov.getEta(), trackParCov.getPhi(), dca3DinSigma); - fRegistry.fill(HIST(hadron_names[charmHadronId]) + HIST("electron/") + HIST(hTypes[findId]) + HIST("hTPCdEdx"), track.tpcInnerParam(), track.tpcSignal()); - fRegistry.fill(HIST(hadron_names[charmHadronId]) + HIST("electron/") + HIST(hTypes[findId]) + HIST("hTOFbeta"), trackParCov.getP(), track.beta()); + fRegistry.fill(HIST(hadron_names[charmHadronId]) + HIST("kaon/") + HIST(promptTypes[promptId]) + HIST(hTypes[findId]) + HIST("hs"), trackParCov.getPt(), trackParCov.getEta(), trackParCov.getPhi(), dca3DinSigma); + fRegistry.fill(HIST(hadron_names[charmHadronId]) + HIST("kaon/") + HIST(promptTypes[promptId]) + HIST(hTypes[findId]) + HIST("hTPCdEdx"), track.tpcInnerParam(), track.tpcSignal()); + fRegistry.fill(HIST(hadron_names[charmHadronId]) + HIST("kaon/") + HIST(promptTypes[promptId]) + HIST(hTypes[findId]) + HIST("hTOFbeta"), trackParCov.getP(), track.beta()); } float dca3DinSigmaOTF(const float dcaXY, const float dcaZ, const float cYY, const float cZZ, const float cZY) @@ -503,12 +582,12 @@ struct taggingHFE { return; } - o2::dataformats::DCA mDcaInfoCov; + // o2::dataformats::DCA mDcaInfoCov; mDcaInfoCov.set(999, 999, 999, 999, 999); auto eleParCov = getTrackParCov(ele); eleParCov.setPID(o2::track::PID::Electron); - mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); - mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + // mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + // mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, eleParCov, 2.f, matCorr, &mDcaInfoCov); float dcaXY = mDcaInfoCov.getY(); float dcaZ = mDcaInfoCov.getZ(); @@ -518,14 +597,10 @@ struct taggingHFE { const auto& mctrack = track.template mcParticle_as(); const auto& mcCollision2 = mctrack.template mcCollision_as(); - if (cfgEventGeneratorType >= 0 && mcCollision2.getSubGeneratorId() != cfgEventGeneratorType) { - continue; - } - if (mcCollision1.globalIndex() != mcCollision2.globalIndex()) { - continue; - } - auto trackParCov = getTrackParCov(track); + trackParCov.setPID(o2::track::PID::Kaon); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, trackParCov, 2.f, matCorr, &mDcaInfoCov); + float dcaXY_h = mDcaInfoCov.getY(); std::array svpos = {0.}; // secondary vertex position std::array pvec0 = {0.}; std::array pvec1 = {0.}; @@ -558,6 +633,11 @@ struct taggingHFE { float cpaXY = RecoDecay::cpaXY(pVtx, svpos, pvecSum); float ptEK = RecoDecay::sqrtSumOfSquares(pvec0[0] + pvec1[0], pvec0[1] + pvec1[1]); + float deta = RecoDecay::eta(pvec1) - RecoDecay::eta(pvec0); + float dphi = RecoDecay::phi(pvec1[0], pvec1[1]) - RecoDecay::phi(pvec0[0], pvec0[1]); + o2::math_utils::bringToPMPi(dphi); + float reldpt = (RecoDecay::sqrtSumOfSquares(pvec1[0], pvec1[1]) - RecoDecay::sqrtSumOfSquares(pvec0[0], pvec0[1])) / RecoDecay::sqrtSumOfSquares(pvec0[0], pvec0[1]); + if (cpa < svcuts.cfg_min_cospa || cpaXY < svcuts.cfg_min_cospaXY || svcuts.cfg_max_mass_eK < mEK || lxy < svcuts.cfg_min_lxy || svcuts.cfg_max_dca2legs < dca2legs) { continue; } @@ -568,6 +648,9 @@ struct taggingHFE { fRegistry.fill(HIST("e_Kpm/all/hCosPAXY"), cpaXY); fRegistry.fill(HIST("e_Kpm/all/hCosPA"), cpa); fRegistry.fill(HIST("e_Kpm/all/hMass"), mEK, ptEK); + fRegistry.fill(HIST("e_Kpm/all/hDeltaEtaDeltaPhi"), dphi, deta); + fRegistry.fill(HIST("e_Kpm/all/hRelDeltaPt"), reldpt); + fRegistry.fill(HIST("e_Kpm/all/hProdDCAxy"), dcaXY * dcaXY_h); int commonMotherId = o2::aod::pwgem::dilepton::utils::mcutil::FindCommonMotherFrom2ProngsWithoutPDG(mcele, mctrack); // e and K+/- if (commonMotherId < 0 && mctrack.has_mothers()) { @@ -576,37 +659,65 @@ struct taggingHFE { commonMotherId = o2::aod::pwgem::dilepton::utils::mcutil::FindCommonMotherFrom2ProngsWithoutPDG(mcele, mctrack_mother); // e and K*(892)0 or K*(892)+/- or phi(1019) } } - if (commonMotherId >= 0) { // common mother is correctly found by DCAFitterN. - const auto& cmp = mcParticles.rawIteratorAt(commonMotherId); - if (std::abs(cmp.pdgCode()) == 421) { // D0 - fillElectronHistograms<3, 1>(ele, eleParCov, dcaXY, dcaZ); - fRegistry.fill(HIST("e_Kpm/D0/hDCA2Legs"), dca2legs); - fRegistry.fill(HIST("e_Kpm/D0/hLxy"), lxy); - fRegistry.fill(HIST("e_Kpm/D0/hLz"), lz); - fRegistry.fill(HIST("e_Kpm/D0/hCosPAXY"), cpaXY); - fRegistry.fill(HIST("e_Kpm/D0/hCosPA"), cpa); - fRegistry.fill(HIST("e_Kpm/D0/hMass"), mEK, ptEK); - } else if (std::abs(cmp.pdgCode()) == 411) { // Dpm - fillElectronHistograms<4, 1>(ele, eleParCov, dcaXY, dcaZ); - fRegistry.fill(HIST("e_Kpm/Dpm/hDCA2Legs"), dca2legs); - fRegistry.fill(HIST("e_Kpm/Dpm/hLxy"), lxy); - fRegistry.fill(HIST("e_Kpm/Dpm/hLz"), lz); - fRegistry.fill(HIST("e_Kpm/Dpm/hCosPAXY"), cpaXY); - fRegistry.fill(HIST("e_Kpm/Dpm/hCosPA"), cpa); - fRegistry.fill(HIST("e_Kpm/Dpm/hMass"), mEK, ptEK); - } else if (std::abs(cmp.pdgCode()) == 431) { // Ds - fillElectronHistograms<5, 1>(ele, eleParCov, dcaXY, dcaZ); - fRegistry.fill(HIST("e_Kpm/Ds/hDCA2Legs"), dca2legs); - fRegistry.fill(HIST("e_Kpm/Ds/hLxy"), lxy); - fRegistry.fill(HIST("e_Kpm/Ds/hLz"), lz); - fRegistry.fill(HIST("e_Kpm/Ds/hCosPAXY"), cpaXY); - fRegistry.fill(HIST("e_Kpm/Ds/hCosPA"), cpa); - fRegistry.fill(HIST("e_Kpm/Ds/hMass"), mEK, ptEK); + if (commonMotherId >= 0) { // common mother is correctly found by DCAFitterN. + if (std::abs(mctrack.pdgCode()) == 321 && mcCollision1.globalIndex() == mcCollision2.globalIndex()) { // common mother is correctly found by DCAFitterN. + const auto& cmp = mcParticles.rawIteratorAt(commonMotherId); + if (std::abs(cmp.pdgCode()) == 421) { // D0 + if (o2::aod::pwgem::dilepton::utils::mcutil::IsFromBeauty(cmp, mcParticles) < 0) { + fillElectronHistograms<2, 1, 0>(ele, eleParCov, dcaXY, dcaZ); // nprompt charm + } else { + fillElectronHistograms<2, 1, 1>(ele, eleParCov, dcaXY, dcaZ); // nonprompt charm + } + + fRegistry.fill(HIST("e_Kpm/D0/hDCA2Legs"), dca2legs); + fRegistry.fill(HIST("e_Kpm/D0/hLxy"), lxy); + fRegistry.fill(HIST("e_Kpm/D0/hLz"), lz); + fRegistry.fill(HIST("e_Kpm/D0/hCosPAXY"), cpaXY); + fRegistry.fill(HIST("e_Kpm/D0/hCosPA"), cpa); + fRegistry.fill(HIST("e_Kpm/D0/hMass"), mEK, ptEK); + fRegistry.fill(HIST("e_Kpm/D0/hDeltaEtaDeltaPhi"), dphi, deta); + fRegistry.fill(HIST("e_Kpm/D0/hRelDeltaPt"), reldpt); + fRegistry.fill(HIST("e_Kpm/D0/hProdDCAxy"), dcaXY * dcaXY_h); + } else if (std::abs(cmp.pdgCode()) == 411) { // Dpm + if (o2::aod::pwgem::dilepton::utils::mcutil::IsFromBeauty(cmp, mcParticles) < 0) { + fillElectronHistograms<3, 1, 0>(ele, eleParCov, dcaXY, dcaZ); // prompt charm + } else { + fillElectronHistograms<3, 1, 1>(ele, eleParCov, dcaXY, dcaZ); // nonprompt charm + } + fRegistry.fill(HIST("e_Kpm/Dpm/hDCA2Legs"), dca2legs); + fRegistry.fill(HIST("e_Kpm/Dpm/hLxy"), lxy); + fRegistry.fill(HIST("e_Kpm/Dpm/hLz"), lz); + fRegistry.fill(HIST("e_Kpm/Dpm/hCosPAXY"), cpaXY); + fRegistry.fill(HIST("e_Kpm/Dpm/hCosPA"), cpa); + fRegistry.fill(HIST("e_Kpm/Dpm/hMass"), mEK, ptEK); + fRegistry.fill(HIST("e_Kpm/Dpm/hDeltaEtaDeltaPhi"), dphi, deta); + fRegistry.fill(HIST("e_Kpm/Dpm/hRelDeltaPt"), reldpt); + fRegistry.fill(HIST("e_Kpm/Dpm/hProdDCAxy"), dcaXY * dcaXY_h); + } else if (std::abs(cmp.pdgCode()) == 431) { // Ds + if (o2::aod::pwgem::dilepton::utils::mcutil::IsFromBeauty(cmp, mcParticles) < 0) { + fillElectronHistograms<4, 1, 0>(ele, eleParCov, dcaXY, dcaZ); // prompt charm + } else { + fillElectronHistograms<4, 1, 1>(ele, eleParCov, dcaXY, dcaZ); // nonprompt charm + } + fRegistry.fill(HIST("e_Kpm/Ds/hDCA2Legs"), dca2legs); + fRegistry.fill(HIST("e_Kpm/Ds/hLxy"), lxy); + fRegistry.fill(HIST("e_Kpm/Ds/hLz"), lz); + fRegistry.fill(HIST("e_Kpm/Ds/hCosPAXY"), cpaXY); + fRegistry.fill(HIST("e_Kpm/Ds/hCosPA"), cpa); + fRegistry.fill(HIST("e_Kpm/Ds/hMass"), mEK, ptEK); + fRegistry.fill(HIST("e_Kpm/Ds/hDeltaEtaDeltaPhi"), dphi, deta); + fRegistry.fill(HIST("e_Kpm/Ds/hRelDeltaPt"), reldpt); + fRegistry.fill(HIST("e_Kpm/Ds/hProdDCAxy"), dcaXY * dcaXY_h); + } } } else { // common mother does not exist, but DCAFitterN found something. i.e. fake const auto& mp = mcele.template mothers_first_as(); - if (std::abs(mp.pdgCode()) == 111 || std::abs(mp.pdgCode()) == 221 || std::abs(mp.pdgCode()) == 331 || std::abs(mp.pdgCode()) == 113 || std::abs(mp.pdgCode()) == 223 || std::abs(mp.pdgCode()) == 333) { // LF - fillElectronHistograms<0, 2>(ele, eleParCov, dcaXY, dcaZ); + if ((mcele.isPhysicalPrimary() || mcele.producedByGenerator()) && (std::abs(mp.pdgCode()) == 111 || std::abs(mp.pdgCode()) == 221 || std::abs(mp.pdgCode()) == 331 || std::abs(mp.pdgCode()) == 113 || std::abs(mp.pdgCode()) == 223 || std::abs(mp.pdgCode()) == 333)) { // LF + if (o2::aod::pwgem::dilepton::utils::mcutil::IsFromCharm(mcele, mcParticles) < 0 && o2::aod::pwgem::dilepton::utils::mcutil::IsFromBeauty(mcele, mcParticles) < 0) { + fillElectronHistograms<0, 2, 0>(ele, eleParCov, dcaXY, dcaZ); + } else { + fillElectronHistograms<0, 2, 1>(ele, eleParCov, dcaXY, dcaZ); + } } fRegistry.fill(HIST("e_Kpm/fake/hDCA2Legs"), dca2legs); fRegistry.fill(HIST("e_Kpm/fake/hLxy"), lxy); @@ -614,6 +725,9 @@ struct taggingHFE { fRegistry.fill(HIST("e_Kpm/fake/hCosPAXY"), cpaXY); fRegistry.fill(HIST("e_Kpm/fake/hCosPA"), cpa); fRegistry.fill(HIST("e_Kpm/fake/hMass"), mEK, ptEK); + fRegistry.fill(HIST("e_Kpm/fake/hDeltaEtaDeltaPhi"), dphi, deta); + fRegistry.fill(HIST("e_Kpm/fake/hRelDeltaPt"), reldpt); + fRegistry.fill(HIST("e_Kpm/fake/hProdDCAxy"), dcaXY * dcaXY_h); } } // end of kaon loop } @@ -628,12 +742,12 @@ struct taggingHFE { return; } - o2::dataformats::DCA mDcaInfoCov; + // o2::dataformats::DCA mDcaInfoCov; mDcaInfoCov.set(999, 999, 999, 999, 999); auto eleParCov = getTrackParCov(ele); eleParCov.setPID(o2::track::PID::Electron); - mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); - mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + // mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + // mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, eleParCov, 2.f, matCorr, &mDcaInfoCov); float dcaXY = mDcaInfoCov.getY(); float dcaZ = mDcaInfoCov.getZ(); @@ -648,15 +762,6 @@ struct taggingHFE { const auto& mcv0 = mcpos.template mothers_first_as(); // check mother of K0S. namely, K0 [311 or -311]. const auto& mcCollision2 = mcv0.template mcCollision_as(); - if (cfgEventGeneratorType >= 0 && mcCollision2.getSubGeneratorId() != cfgEventGeneratorType) { - continue; - } - if (mcCollision1.globalIndex() != mcCollision2.globalIndex()) { - continue; - } - - const auto& mcv0_mother = mcv0.template mothers_first_as(); // mother particle of K0S. - const std::array vertex = {v0.x(), v0.y(), v0.z()}; const std::array momentum = {v0.px(), v0.py(), v0.pz()}; std::array covV0 = {0.f}; @@ -698,8 +803,14 @@ struct taggingHFE { float dca2legs = std::sqrt(fitter.getChi2AtPCACandidate()); float lxy = std::sqrt(std::pow(svpos[0] - collision.posX(), 2) + std::pow(svpos[1] - collision.posY(), 2)); float lz = std::fabs(svpos[2] - collision.posZ()); - float mEK = 0; float ptEK = RecoDecay::sqrtSumOfSquares(pvec0[0] + pvec1[0], pvec0[1] + pvec1[1]); + + float deta = RecoDecay::eta(pvec1) - RecoDecay::eta(pvec0); + float dphi = RecoDecay::phi(pvec1[0], pvec1[1]) - RecoDecay::phi(pvec0[0], pvec0[1]); + o2::math_utils::bringToPMPi(dphi); + float reldpt = (RecoDecay::sqrtSumOfSquares(pvec1[0], pvec1[1]) - RecoDecay::sqrtSumOfSquares(pvec0[0], pvec0[1])) / RecoDecay::sqrtSumOfSquares(pvec0[0], pvec0[1]); + + float mEK = 0; if constexpr (pairId == 1) { mEK = RecoDecay::m(std::array{pvec0, pvec1}, std::array{o2::constants::physics::MassElectron, o2::constants::physics::MassK0Short}); if (svcuts.cfg_max_mass_eK < mEK) { @@ -718,63 +829,98 @@ struct taggingHFE { continue; } - int commonMotherId = -1; - if constexpr (pairId == 1) { - commonMotherId = o2::aod::pwgem::dilepton::utils::mcutil::FindCommonMotherFrom2ProngsWithoutPDG(mcele, mcv0_mother); // K0, not K0S - } else if constexpr (pairId == 2) { - commonMotherId = o2::aod::pwgem::dilepton::utils::mcutil::FindCommonMotherFrom2ProngsWithoutPDG(mcele, mcv0); // lambda - } - fRegistry.fill(HIST(pair_names[pairId]) + HIST("all/hDCA2Legs"), dca2legs); fRegistry.fill(HIST(pair_names[pairId]) + HIST("all/hLxy"), lxy); fRegistry.fill(HIST(pair_names[pairId]) + HIST("all/hLz"), lz); fRegistry.fill(HIST(pair_names[pairId]) + HIST("all/hCosPAXY"), cpaXY); fRegistry.fill(HIST(pair_names[pairId]) + HIST("all/hCosPA"), cpa); fRegistry.fill(HIST(pair_names[pairId]) + HIST("all/hMass"), mEK, ptEK); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("all/hDeltaEtaDeltaPhi"), dphi, deta); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("all/hRelDeltaPt"), reldpt); + + int commonMotherId = -1; + if constexpr (pairId == 1) { + const auto& mcv0_mother = mcv0.template mothers_first_as(); // mother particle of K0S. + commonMotherId = o2::aod::pwgem::dilepton::utils::mcutil::FindCommonMotherFrom2ProngsWithoutPDG(mcele, mcv0_mother); // K0, not K0S + } else if constexpr (pairId == 2) { + commonMotherId = o2::aod::pwgem::dilepton::utils::mcutil::FindCommonMotherFrom2ProngsWithoutPDG(mcele, mcv0); // lambda + } if (commonMotherId >= 0) { // common mother is correctly found by DCAFitterN. const auto& cmp = mcParticles.rawIteratorAt(commonMotherId); if constexpr (pairId == 1) { - if (std::abs(cmp.pdgCode()) == 421) { // D0 - fillElectronHistograms<3, 1>(ele, eleParCov, dcaXY, dcaZ); - fRegistry.fill(HIST(pair_names[pairId]) + HIST("D0/hDCA2Legs"), dca2legs); - fRegistry.fill(HIST(pair_names[pairId]) + HIST("D0/hLxy"), lxy); - fRegistry.fill(HIST(pair_names[pairId]) + HIST("D0/hLz"), lz); - fRegistry.fill(HIST(pair_names[pairId]) + HIST("D0/hCosPAXY"), cpaXY); - fRegistry.fill(HIST(pair_names[pairId]) + HIST("D0/hCosPA"), cpa); - fRegistry.fill(HIST(pair_names[pairId]) + HIST("D0/hMass"), mEK, ptEK); - } else if (std::abs(cmp.pdgCode()) == 411) { // Dpm - fillElectronHistograms<4, 1>(ele, eleParCov, dcaXY, dcaZ); - fRegistry.fill(HIST(pair_names[pairId]) + HIST("Dpm/hDCA2Legs"), dca2legs); - fRegistry.fill(HIST(pair_names[pairId]) + HIST("Dpm/hLxy"), lxy); - fRegistry.fill(HIST(pair_names[pairId]) + HIST("Dpm/hLz"), lz); - fRegistry.fill(HIST(pair_names[pairId]) + HIST("Dpm/hCosPAXY"), cpaXY); - fRegistry.fill(HIST(pair_names[pairId]) + HIST("Dpm/hCosPA"), cpa); - fRegistry.fill(HIST(pair_names[pairId]) + HIST("Dpm/hMass"), mEK, ptEK); - } else if (std::abs(cmp.pdgCode()) == 431) { // Ds - fillElectronHistograms<5, 1>(ele, eleParCov, dcaXY, dcaZ); - fRegistry.fill(HIST(pair_names[pairId]) + HIST("Ds/hDCA2Legs"), dca2legs); - fRegistry.fill(HIST(pair_names[pairId]) + HIST("Ds/hLxy"), lxy); - fRegistry.fill(HIST(pair_names[pairId]) + HIST("Ds/hLz"), lz); - fRegistry.fill(HIST(pair_names[pairId]) + HIST("Ds/hCosPAXY"), cpaXY); - fRegistry.fill(HIST(pair_names[pairId]) + HIST("Ds/hCosPA"), cpa); - fRegistry.fill(HIST(pair_names[pairId]) + HIST("Ds/hMass"), mEK, ptEK); + if (std::abs(mcv0.pdgCode()) == 310 && mcCollision1.globalIndex() == mcCollision2.globalIndex()) { + if (std::abs(cmp.pdgCode()) == 421) { // D0 + if (o2::aod::pwgem::dilepton::utils::mcutil::IsFromBeauty(cmp, mcParticles) < 0) { + fillElectronHistograms<2, 1, 0>(ele, eleParCov, dcaXY, dcaZ); // prompt charm + } else { + fillElectronHistograms<2, 1, 1>(ele, eleParCov, dcaXY, dcaZ); // nonprompt charm + } + fRegistry.fill(HIST(pair_names[pairId]) + HIST("D0/hDCA2Legs"), dca2legs); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("D0/hLxy"), lxy); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("D0/hLz"), lz); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("D0/hCosPAXY"), cpaXY); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("D0/hCosPA"), cpa); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("D0/hMass"), mEK, ptEK); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("D0/hDeltaEtaDeltaPhi"), dphi, deta); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("D0/hRelDeltaPt"), reldpt); + } else if (std::abs(cmp.pdgCode()) == 411) { // Dpm + if (o2::aod::pwgem::dilepton::utils::mcutil::IsFromBeauty(cmp, mcParticles) < 0) { + fillElectronHistograms<3, 1, 0>(ele, eleParCov, dcaXY, dcaZ); // prompt charm + } else { + fillElectronHistograms<3, 1, 1>(ele, eleParCov, dcaXY, dcaZ); // nonprompt charm + } + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Dpm/hDCA2Legs"), dca2legs); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Dpm/hLxy"), lxy); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Dpm/hLz"), lz); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Dpm/hCosPAXY"), cpaXY); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Dpm/hCosPA"), cpa); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Dpm/hMass"), mEK, ptEK); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Dpm/hDeltaEtaDeltaPhi"), dphi, deta); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Dpm/hRelDeltaPt"), reldpt); + } else if (std::abs(cmp.pdgCode()) == 431) { // Ds + if (o2::aod::pwgem::dilepton::utils::mcutil::IsFromBeauty(cmp, mcParticles) < 0) { + fillElectronHistograms<4, 1, 0>(ele, eleParCov, dcaXY, dcaZ); // prompt charm + } else { + fillElectronHistograms<4, 1, 1>(ele, eleParCov, dcaXY, dcaZ); // nonprompt charm + } + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Ds/hDCA2Legs"), dca2legs); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Ds/hLxy"), lxy); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Ds/hLz"), lz); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Ds/hCosPAXY"), cpaXY); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Ds/hCosPA"), cpa); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Ds/hMass"), mEK, ptEK); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Ds/hDeltaEtaDeltaPhi"), dphi, deta); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Ds/hRelDeltaPt"), reldpt); + } } } else if constexpr (pairId == 2) { - if (std::abs(cmp.pdgCode()) == 4122) { // Lc - fillElectronHistograms<6, 1>(ele, eleParCov, dcaXY, dcaZ); - fRegistry.fill(HIST(pair_names[pairId]) + HIST("Lc/hDCA2Legs"), dca2legs); - fRegistry.fill(HIST(pair_names[pairId]) + HIST("Lc/hLxy"), lxy); - fRegistry.fill(HIST(pair_names[pairId]) + HIST("Lc/hLz"), lz); - fRegistry.fill(HIST(pair_names[pairId]) + HIST("Lc/hCosPAXY"), cpaXY); - fRegistry.fill(HIST(pair_names[pairId]) + HIST("Lc/hCosPA"), cpa); - fRegistry.fill(HIST(pair_names[pairId]) + HIST("Lc/hMass"), mEK, ptEK); + if (std::abs(mcv0.pdgCode()) == 3122 && mcCollision1.globalIndex() == mcCollision2.globalIndex()) { + if (std::abs(cmp.pdgCode()) == 4122) { // Lc + if (o2::aod::pwgem::dilepton::utils::mcutil::IsFromBeauty(cmp, mcParticles) < 0) { + fillElectronHistograms<5, 1, 0>(ele, eleParCov, dcaXY, dcaZ); // prompt charm + } else { + fillElectronHistograms<5, 1, 1>(ele, eleParCov, dcaXY, dcaZ); // nonprompt charm + } + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Lc/hDCA2Legs"), dca2legs); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Lc/hLxy"), lxy); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Lc/hLz"), lz); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Lc/hCosPAXY"), cpaXY); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Lc/hCosPA"), cpa); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Lc/hMass"), mEK, ptEK); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Lc/hDeltaEtaDeltaPhi"), dphi, deta); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("Lc/hRelDeltaPt"), reldpt); + } } } } else { // common mother does not exist, but DCAFitterN found something. i.e. fake const auto& mp = mcele.template mothers_first_as(); - if (std::abs(mp.pdgCode()) == 111 || std::abs(mp.pdgCode()) == 221 || std::abs(mp.pdgCode()) == 331 || std::abs(mp.pdgCode()) == 113 || std::abs(mp.pdgCode()) == 223 || std::abs(mp.pdgCode()) == 333) { // LF - fillElectronHistograms<0, 2>(ele, eleParCov, dcaXY, dcaZ); + if ((mcele.isPhysicalPrimary() || mcele.producedByGenerator()) && (std::abs(mp.pdgCode()) == 111 || std::abs(mp.pdgCode()) == 221 || std::abs(mp.pdgCode()) == 331 || std::abs(mp.pdgCode()) == 113 || std::abs(mp.pdgCode()) == 223 || std::abs(mp.pdgCode()) == 333)) { // LF + if (o2::aod::pwgem::dilepton::utils::mcutil::IsFromCharm(mcele, mcParticles) < 0 && o2::aod::pwgem::dilepton::utils::mcutil::IsFromBeauty(mcele, mcParticles) < 0) { + fillElectronHistograms<0, 2, 0>(ele, eleParCov, dcaXY, dcaZ); + } else { + fillElectronHistograms<0, 2, 1>(ele, eleParCov, dcaXY, dcaZ); + } } fRegistry.fill(HIST(pair_names[pairId]) + HIST("fake/hDCA2Legs"), dca2legs); fRegistry.fill(HIST(pair_names[pairId]) + HIST("fake/hLxy"), lxy); @@ -782,6 +928,8 @@ struct taggingHFE { fRegistry.fill(HIST(pair_names[pairId]) + HIST("fake/hCosPAXY"), cpaXY); fRegistry.fill(HIST(pair_names[pairId]) + HIST("fake/hCosPA"), cpa); fRegistry.fill(HIST(pair_names[pairId]) + HIST("fake/hMass"), mEK, ptEK); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("fake/hDeltaEtaDeltaPhi"), dphi, deta); + fRegistry.fill(HIST(pair_names[pairId]) + HIST("fake/hRelDeltaPt"), reldpt); } } // end of v0 loop @@ -804,7 +952,7 @@ struct taggingHFE { Partition negTracks = o2::aod::track::signed1Pt < 0.f; //! type of V0. 0: built solely for cascades (does not pass standard V0 cuts), 1: standard 2, 3: photon-like with TPC-only use. Regular analysis should always use type 1. - Filter v0Filter = o2::aod::v0data::v0Type == uint8_t(1) && o2::aod::v0data::v0cosPA > v0cuts.cfg_min_cospa_v0hadron.value&& o2::aod::v0data::dcaV0daughters < v0cuts.cfg_max_pca_v0hadron.value; + Filter v0Filter = o2::aod::v0data::v0Type == uint8_t(1) && o2::aod::v0data::v0cosPA > v0cuts.cfg_min_cospa_v0hadron&& o2::aod::v0data::dcaV0daughters < v0cuts.cfg_max_pca_v0hadron; using filteredV0s = soa::Filtered; std::vector electronIds; @@ -813,15 +961,18 @@ struct taggingHFE { std::vector posKaonIds; std::vector k0sIds; - std::vector antik0sIds; std::vector lambdaIds; std::vector antilambdaIds; + std::vector> used_electronIds; // pair of hTypeId and electronId + void processSA(FilteredMyCollisions const&, aod::BCsWithTimestamps const&, MyTracks const&, filteredV0s const&, aod::McParticles const&, aod::McCollisions const&) {} PROCESS_SWITCH(taggingHFE, processSA, "process without TTCA", false); void processTTCA(FilteredMyCollisions const& collisions, aod::BCsWithTimestamps const&, MyTracks const& tracks, aod::TrackAssoc const& trackIndices, filteredV0s const& v0s, aod::McParticles const& mcParticles, aod::McCollisions const& mcCollisions) { + used_electronIds.reserve(tracks.size()); + for (const auto& collision : collisions) { const auto& bc = collision.template foundBC_as(); initCCDB(bc); @@ -843,6 +994,8 @@ struct taggingHFE { positronIds.reserve(trackIdsThisCollision.size()); negKaonIds.reserve(trackIdsThisCollision.size()); posKaonIds.reserve(trackIdsThisCollision.size()); + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); for (const auto& trackId : trackIdsThisCollision) { const auto& track = trackId.template track_as(); @@ -853,75 +1006,142 @@ struct taggingHFE { continue; } const auto& mctrack = track.template mcParticle_as(); - const auto& mp = mctrack.template mothers_first_as(); // mother particle of electron - if (!mctrack.has_mothers() || !(mctrack.isPhysicalPrimary() || mctrack.producedByGenerator())) { + if (std::abs(mctrack.pdgCode()) != 11) { continue; } - if (std::abs(mctrack.pdgCode()) != 11 && std::abs(mctrack.pdgCode()) != 321) { - continue; - } - const auto& mcCollision1 = mctrack.template mcCollision_as(); if (cfgEventGeneratorType >= 0 && mcCollision1.getSubGeneratorId() != cfgEventGeneratorType) { continue; } + if (!mctrack.has_mothers() || !(mctrack.isPhysicalPrimary() || mctrack.producedByGenerator())) { + continue; + } + const auto& mp = mctrack.template mothers_first_as(); // mother particle of electron - o2::dataformats::DCA mDcaInfoCov; + // o2::dataformats::DCA mDcaInfoCov; mDcaInfoCov.set(999, 999, 999, 999, 999); auto track_par_cov_recalc = getTrackParCov(track); track_par_cov_recalc.setPID(o2::track::PID::Electron); - mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); - mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + // mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + // mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc, 2.f, matCorr, &mDcaInfoCov); float dcaXY = mDcaInfoCov.getY(); float dcaZ = mDcaInfoCov.getZ(); - if (!isSelectedTrack(track, track_par_cov_recalc, dcaXY, dcaZ)) { + if (!isSelectedTrackForElectron(track, track_par_cov_recalc, dcaXY, dcaZ)) { continue; } - if (std::abs(mctrack.pdgCode()) == 11) { - if (track_par_cov_recalc.getEta() < trackcuts.cfg_min_eta_track || trackcuts.cfg_max_eta_track < track_par_cov_recalc.getEta()) { - continue; + if (std::abs(mp.pdgCode()) == 111 || std::abs(mp.pdgCode()) == 221 || std::abs(mp.pdgCode()) == 331 || std::abs(mp.pdgCode()) == 113 || std::abs(mp.pdgCode()) == 223 || std::abs(mp.pdgCode()) == 333) { // LF + if (o2::aod::pwgem::dilepton::utils::mcutil::IsFromCharm(mp, mcParticles) < 0 && o2::aod::pwgem::dilepton::utils::mcutil::IsFromBeauty(mp, mcParticles) < 0) { + fillElectronHistograms<0, 0, 0>(track, track_par_cov_recalc, dcaXY, dcaZ); // prompt LF + } else { + fillElectronHistograms<0, 0, 1>(track, track_par_cov_recalc, dcaXY, dcaZ); // nonprompt LF } - if (std::abs(mp.pdgCode()) == 111 || std::abs(mp.pdgCode()) == 221 || std::abs(mp.pdgCode()) == 331 || std::abs(mp.pdgCode()) == 113 || std::abs(mp.pdgCode()) == 223 || std::abs(mp.pdgCode()) == 333) { // LF - fillElectronHistograms<0, 0>(track, track_par_cov_recalc, dcaXY, dcaZ); - } else if (std::abs(mp.pdgCode()) == 443) { // Jpsi - if (o2::aod::pwgem::dilepton::utils::mcutil::IsFromBeauty(mp, mcParticles) < 0) { - fillElectronHistograms<1, 0>(track, track_par_cov_recalc, dcaXY, dcaZ); // prompt Jpsi - } else { - fillElectronHistograms<2, 0>(track, track_par_cov_recalc, dcaXY, dcaZ); // nonprompt Jpsi - } - } else if (std::abs(mp.pdgCode()) == 421) { // D0 - fillElectronHistograms<3, 0>(track, track_par_cov_recalc, dcaXY, dcaZ); - } else if (std::abs(mp.pdgCode()) == 411) { // Dpm - fillElectronHistograms<4, 0>(track, track_par_cov_recalc, dcaXY, dcaZ); - } else if (std::abs(mp.pdgCode()) == 431) { // Ds - fillElectronHistograms<5, 0>(track, track_par_cov_recalc, dcaXY, dcaZ); - } else if (std::abs(mp.pdgCode()) == 4122) { // Lc - fillElectronHistograms<6, 0>(track, track_par_cov_recalc, dcaXY, dcaZ); + } else if (std::abs(mp.pdgCode()) == 443) { // Jpsi + if (o2::aod::pwgem::dilepton::utils::mcutil::IsFromBeauty(mp, mcParticles) < 0) { + fillElectronHistograms<1, 0, 0>(track, track_par_cov_recalc, dcaXY, dcaZ); // prompt Jpsi + } else { + fillElectronHistograms<1, 0, 1>(track, track_par_cov_recalc, dcaXY, dcaZ); // nonprompt Jpsi + } + } else if (std::abs(mp.pdgCode()) == 421) { // D0 + if (o2::aod::pwgem::dilepton::utils::mcutil::IsFromBeauty(mp, mcParticles) < 0) { + fillElectronHistograms<2, 0, 0>(track, track_par_cov_recalc, dcaXY, dcaZ); + } else { + fillElectronHistograms<2, 0, 1>(track, track_par_cov_recalc, dcaXY, dcaZ); } - if (track.sign() > 0) { // positron - positronIds.emplace_back(trackId.trackId()); - } else { // electron - electronIds.emplace_back(trackId.trackId()); + } else if (std::abs(mp.pdgCode()) == 411) { // Dpm + if (o2::aod::pwgem::dilepton::utils::mcutil::IsFromBeauty(mp, mcParticles) < 0) { + fillElectronHistograms<3, 0, 0>(track, track_par_cov_recalc, dcaXY, dcaZ); + } else { + fillElectronHistograms<3, 0, 1>(track, track_par_cov_recalc, dcaXY, dcaZ); } - } else if (std::abs(mctrack.pdgCode()) == 321 && isKaon(track)) { - if (track_par_cov_recalc.getEta() < trackcuts.cfg_min_eta_track_wide || trackcuts.cfg_max_eta_track_wide < track_par_cov_recalc.getEta()) { - continue; + } else if (std::abs(mp.pdgCode()) == 431) { // Ds + if (o2::aod::pwgem::dilepton::utils::mcutil::IsFromBeauty(mp, mcParticles) < 0) { + fillElectronHistograms<4, 0, 0>(track, track_par_cov_recalc, dcaXY, dcaZ); + } else { + fillElectronHistograms<4, 0, 1>(track, track_par_cov_recalc, dcaXY, dcaZ); } + } else if (std::abs(mp.pdgCode()) == 4122) { // Lc + if (o2::aod::pwgem::dilepton::utils::mcutil::IsFromBeauty(mp, mcParticles) < 0) { + fillElectronHistograms<5, 0, 0>(track, track_par_cov_recalc, dcaXY, dcaZ); + } else { + fillElectronHistograms<5, 0, 1>(track, track_par_cov_recalc, dcaXY, dcaZ); + } + } + + if (track.sign() > 0) { // positron + positronIds.emplace_back(trackId.trackId()); + } else { // electron + electronIds.emplace_back(trackId.trackId()); + } + } // end of track loop for electron selection + + for (const auto& trackId : trackIdsThisCollision) { + const auto& track = trackId.template track_as(); + if (!track.hasITS() || !track.hasTPC()) { + continue; + } + if (!track.has_mcParticle()) { + continue; + } + + const auto& mctrack = track.template mcParticle_as(); + const auto& mcCollision1 = mctrack.template mcCollision_as(); + + // o2::dataformats::DCA mDcaInfoCov; + mDcaInfoCov.set(999, 999, 999, 999, 999); + auto track_par_cov_recalc = getTrackParCov(track); + track_par_cov_recalc.setPID(o2::track::PID::Kaon); + // mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + // mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc, 2.f, matCorr, &mDcaInfoCov); + float dcaXY = mDcaInfoCov.getY(); + float dcaZ = mDcaInfoCov.getZ(); + + if (!isSelectedTrackForKaon(track, track_par_cov_recalc, dcaXY, dcaZ)) { + continue; + } + + if (isKaon(track)) { if (track.sign() > 0) { // positive kaon posKaonIds.emplace_back(trackId.trackId()); } else { // negative kaon negKaonIds.emplace_back(trackId.trackId()); } + if (std::abs(mctrack.pdgCode()) == 321) { + if (!mctrack.has_mothers() || !(mctrack.isPhysicalPrimary() || mctrack.producedByGenerator())) { + continue; + } + const auto& mp = mctrack.template mothers_first_as(); // mother particle of electron + if (cfgEventGeneratorType < 0 || mcCollision1.getSubGeneratorId() == cfgEventGeneratorType) { + if (std::abs(mp.pdgCode()) == 421) { // D0 + if (o2::aod::pwgem::dilepton::utils::mcutil::IsFromBeauty(mp, mcParticles) < 0) { + fillKaonHistograms<2, 0, 0>(track, track_par_cov_recalc, dcaXY, dcaZ); + } else { + fillKaonHistograms<2, 0, 1>(track, track_par_cov_recalc, dcaXY, dcaZ); + } + } else if (std::abs(mp.pdgCode()) == 411) { // Dpm + if (o2::aod::pwgem::dilepton::utils::mcutil::IsFromBeauty(mp, mcParticles) < 0) { + fillKaonHistograms<3, 0, 0>(track, track_par_cov_recalc, dcaXY, dcaZ); + } else { + fillKaonHistograms<3, 0, 1>(track, track_par_cov_recalc, dcaXY, dcaZ); + } + } else if (std::abs(mp.pdgCode()) == 431) { // Ds + if (o2::aod::pwgem::dilepton::utils::mcutil::IsFromBeauty(mp, mcParticles) < 0) { + fillKaonHistograms<4, 0, 0>(track, track_par_cov_recalc, dcaXY, dcaZ); + } else { + fillKaonHistograms<4, 0, 1>(track, track_par_cov_recalc, dcaXY, dcaZ); + } + } + } + } } - } // end of track loop for electron and kaon selection + } // end of track loop for kaon selection const auto& v0s_per_coll = v0s.sliceBy(perCol_v0, collision.globalIndex()); k0sIds.reserve(v0s_per_coll.size()); - antik0sIds.reserve(v0s_per_coll.size()); lambdaIds.reserve(v0s_per_coll.size()); antilambdaIds.reserve(v0s_per_coll.size()); @@ -930,37 +1150,17 @@ struct taggingHFE { auto pos = v0.template posTrack_as(); auto neg = v0.template negTrack_as(); - const auto& mcpos = pos.template mcParticle_as(); - const auto& mcneg = neg.template mcParticle_as(); - if (!mcpos.has_mothers() || !mcneg.has_mothers()) { - continue; - } - - if (o2::aod::pwgem::dilepton::utils::mcutil::FindCommonMotherFrom2Prongs(mcpos, mcneg, 211, -211, 310, mcParticles) < 0) { - continue; - } - - const auto& mcK0S = mcpos.template mothers_first_as(); // mother particle of pion - if (!mcK0S.has_mothers()) { - continue; - } - const auto& mcK0 = mcK0S.template mothers_first_as(); // mother particle of K0S - const auto& mcCollision1 = mcK0S.template mcCollision_as(); - if (cfgEventGeneratorType >= 0 && mcCollision1.getSubGeneratorId() != cfgEventGeneratorType) { - continue; - } - if (!isPion(pos) || !isPion(neg)) { continue; } float dcaXY = 999.f; - o2::dataformats::DCA mDcaInfoCov; + // o2::dataformats::DCA mDcaInfoCov; mDcaInfoCov.set(999, 999, 999, 999, 999); auto track_par_cov_recalc_pos = getTrackParCov(pos); track_par_cov_recalc_pos.setPID(o2::track::PID::Pion); - mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); - mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + // mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + // mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc_pos, 2.f, matCorr, &mDcaInfoCov); dcaXY = mDcaInfoCov.getY(); if (!isSelectedV0Leg(pos, dcaXY)) { @@ -970,8 +1170,8 @@ struct taggingHFE { mDcaInfoCov.set(999, 999, 999, 999, 999); auto track_par_cov_recalc_neg = getTrackParCov(neg); track_par_cov_recalc_neg.setPID(o2::track::PID::Pion); - mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); - mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + // mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + // mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc_neg, 2.f, matCorr, &mDcaInfoCov); dcaXY = mDcaInfoCov.getY(); if (!isSelectedV0Leg(neg, dcaXY)) { @@ -985,35 +1185,23 @@ struct taggingHFE { fRegistry.fill(HIST("V0/K0S/hDCA2Legs"), v0.dcaV0daughters()); fRegistry.fill(HIST("V0/K0S/hAP"), v0.alpha(), v0.qtarm()); fRegistry.fill(HIST("V0/K0S/hMassK0S"), v0.mK0Short()); - if (mcK0.pdgCode() == 311) { - k0sIds.emplace_back(v0.globalIndex()); - } else if (mcK0.pdgCode() == -311) { - antik0sIds.emplace_back(v0.globalIndex()); - } + k0sIds.emplace_back(v0.globalIndex()); + } else if (v0cuts.cfg_min_mass_lambda < v0.mLambda() && v0.mLambda() < v0cuts.cfg_max_mass_lambda) { auto pos = v0.template posTrack_as(); auto neg = v0.template negTrack_as(); - const auto& mcpos = pos.template mcParticle_as(); - const auto& mcneg = neg.template mcParticle_as(); - if (!mcpos.has_mothers() || !mcneg.has_mothers()) { - continue; - } - if (o2::aod::pwgem::dilepton::utils::mcutil::FindCommonMotherFrom2Prongs(mcpos, mcneg, 2212, -211, 3122, mcParticles) < 0) { - continue; - } - if (!isProton(pos) || !isPion(neg)) { continue; } float dcaXY = 999.f; - o2::dataformats::DCA mDcaInfoCov; + // o2::dataformats::DCA mDcaInfoCov; mDcaInfoCov.set(999, 999, 999, 999, 999); auto track_par_cov_recalc_pos = getTrackParCov(pos); track_par_cov_recalc_pos.setPID(o2::track::PID::Proton); - mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); - mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + // mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + // mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc_pos, 2.f, matCorr, &mDcaInfoCov); dcaXY = mDcaInfoCov.getY(); if (!isSelectedV0Leg(pos, dcaXY)) { @@ -1023,8 +1211,8 @@ struct taggingHFE { mDcaInfoCov.set(999, 999, 999, 999, 999); auto track_par_cov_recalc_neg = getTrackParCov(neg); track_par_cov_recalc_neg.setPID(o2::track::PID::Pion); - mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); - mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + // mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + // mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc_neg, 2.f, matCorr, &mDcaInfoCov); dcaXY = mDcaInfoCov.getY(); if (!isSelectedV0Leg(neg, dcaXY)) { @@ -1043,25 +1231,16 @@ struct taggingHFE { auto pos = v0.template posTrack_as(); auto neg = v0.template negTrack_as(); - const auto& mcpos = pos.template mcParticle_as(); - const auto& mcneg = neg.template mcParticle_as(); - if (!mcpos.has_mothers() || !mcneg.has_mothers()) { - continue; - } - if (o2::aod::pwgem::dilepton::utils::mcutil::FindCommonMotherFrom2Prongs(mcpos, mcneg, 211, -2212, -3122, mcParticles) < 0) { - continue; - } - if (!isPion(pos) || !isProton(neg)) { continue; } float dcaXY = 999.f; - o2::dataformats::DCA mDcaInfoCov; + // o2::dataformats::DCA mDcaInfoCov; mDcaInfoCov.set(999, 999, 999, 999, 999); auto track_par_cov_recalc_pos = getTrackParCov(pos); track_par_cov_recalc_pos.setPID(o2::track::PID::Pion); - mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); - mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + // mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + // mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc_pos, 2.f, matCorr, &mDcaInfoCov); dcaXY = mDcaInfoCov.getY(); if (!isSelectedV0Leg(pos, dcaXY)) { @@ -1071,8 +1250,8 @@ struct taggingHFE { mDcaInfoCov.set(999, 999, 999, 999, 999); auto track_par_cov_recalc_neg = getTrackParCov(neg); track_par_cov_recalc_neg.setPID(o2::track::PID::Proton); - mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); - mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + // mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + // mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc_neg, 2.f, matCorr, &mDcaInfoCov); dcaXY = mDcaInfoCov.getY(); if (!isSelectedV0Leg(neg, dcaXY)) { @@ -1095,7 +1274,6 @@ struct taggingHFE { runPairEandTrack<0>(collision, ele, posKaonIds, tracks, mcParticles, mcCollisions); runPairEandTrack<0>(collision, ele, negKaonIds, tracks, mcParticles, mcCollisions); // only for Ds runPairEandV0<1>(collision, ele, k0sIds, v0s, mcParticles, mcCollisions); - runPairEandV0<1>(collision, ele, antik0sIds, v0s, mcParticles, mcCollisions); // only for Ds runPairEandV0<2>(collision, ele, antilambdaIds, v0s, mcParticles, mcCollisions); } // end of electron loop @@ -1103,8 +1281,7 @@ struct taggingHFE { const auto& pos = tracks.rawIteratorAt(trackId); runPairEandTrack<0>(collision, pos, negKaonIds, tracks, mcParticles, mcCollisions); runPairEandTrack<0>(collision, pos, posKaonIds, tracks, mcParticles, mcCollisions); // only for Ds - runPairEandV0<1>(collision, pos, antik0sIds, v0s, mcParticles, mcCollisions); - runPairEandV0<1>(collision, pos, k0sIds, v0s, mcParticles, mcCollisions); // only for Ds + runPairEandV0<1>(collision, pos, k0sIds, v0s, mcParticles, mcCollisions); // only for Ds runPairEandV0<2>(collision, pos, lambdaIds, v0s, mcParticles, mcCollisions); } // end of positron loop @@ -1119,14 +1296,14 @@ struct taggingHFE { k0sIds.clear(); k0sIds.shrink_to_fit(); - antik0sIds.clear(); - antik0sIds.shrink_to_fit(); lambdaIds.clear(); lambdaIds.shrink_to_fit(); antilambdaIds.clear(); antilambdaIds.shrink_to_fit(); - } // end of collision loop + + used_electronIds.clear(); + used_electronIds.shrink_to_fit(); } PROCESS_SWITCH(taggingHFE, processTTCA, "process with TTCA", true); }; From 99e82413d375f5f60495b923ef830d1294765a1c Mon Sep 17 00:00:00 2001 From: altsybee Date: Mon, 5 May 2025 15:43:41 +0200 Subject: [PATCH 1178/1650] [DPG] add vZ cut for occupancy histos (#11086) --- DPG/Tasks/AOTEvent/eventSelectionQa.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DPG/Tasks/AOTEvent/eventSelectionQa.cxx b/DPG/Tasks/AOTEvent/eventSelectionQa.cxx index 854314837e8..80819b894aa 100644 --- a/DPG/Tasks/AOTEvent/eventSelectionQa.cxx +++ b/DPG/Tasks/AOTEvent/eventSelectionQa.cxx @@ -1145,7 +1145,7 @@ struct EventSelectionQaTask { histos.fill(HIST("hNcontribAfterCutsVsBcInTF"), bcInTF, nContributorsAfterEtaTPCCuts); - if (!isLowFlux && col.sel8()) { + if (!isLowFlux && col.sel8() && fabs(col.posZ()) < 10) { int occupancyByTracks = col.trackOccupancyInTimeRange(); histos.fill(HIST("occupancyQA/hOccupancyByTracks"), occupancyByTracks); float occupancyByFT0C = col.ft0cOccupancyInTimeRange(); From 0adfcd19294d6d7e66cbb49d61a7f1c81f8b018c Mon Sep 17 00:00:00 2001 From: JimunLee Date: Mon, 5 May 2025 23:10:28 +0900 Subject: [PATCH 1179/1650] [PWGJE] Reduced the process of calculation corresponding to the configuration in phiInJets.cxx (#11080) Co-authored-by: jimun_lee --- PWGJE/Tasks/phiInJets.cxx | 77 ++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 34 deletions(-) diff --git a/PWGJE/Tasks/phiInJets.cxx b/PWGJE/Tasks/phiInJets.cxx index b4e6f5c1c49..88a09016b44 100644 --- a/PWGJE/Tasks/phiInJets.cxx +++ b/PWGJE/Tasks/phiInJets.cxx @@ -724,26 +724,27 @@ struct phiInJets { if (std::fabs(originalTrack.eta()) > cfgtrkMaxEta || std::fabs(originalTrack2.eta()) > cfgtrkMaxEta) continue; - double dPhi = TVector2::Phi_mpi_pi(originalTrack.phi() - originalTrack2.phi()); - double dEta = originalTrack.eta() - originalTrack2.eta(); - if (cfgMCRecRotationalHists) { - JEhistos.fill(HIST("hMCRec_dPhi_distribution"), dPhi); - JEhistos.fill(HIST("hMCRec_dEta_distribution"), dEta); - } - double dR = TMath::Sqrt(dPhi * dPhi + dEta * dEta); - double dR_rot = 0; TLorentzVector lDecayDaughter1, lDecayDaughter2, lResonance, lRotationalTrack, lRotationalResonance; lDecayDaughter1.SetXYZM(originalTrack.px(), originalTrack.py(), originalTrack.pz(), massKa); - //----------------------------------------------------------------------- - TRandom* trand = new TRandom(); - double shift = trand->Uniform(TMath::Pi() - TMath::Pi() / 10.0, TMath::Pi() + TMath::Pi() / 10.0); - // double shift = TMath::Pi(); - if (!cfgIsKstar) { - lDecayDaughter2.SetXYZM(originalTrack2.px(), originalTrack2.py(), originalTrack2.pz(), massKa); - } else { - lDecayDaughter2.SetXYZM(originalTrack2.px(), originalTrack2.py(), originalTrack2.pz(), massPi); + if (cfgMCRecRotationalHists) { + double dPhi = TVector2::Phi_mpi_pi(originalTrack.phi() - originalTrack2.phi()); + double dEta = originalTrack.eta() - originalTrack2.eta(); + + JEhistos.fill(HIST("hMCRec_dPhi_distribution"), dPhi); + JEhistos.fill(HIST("hMCRec_dEta_distribution"), dEta); + double dR = TMath::Sqrt(dPhi * dPhi + dEta * dEta); + double dR_rot = 0; + //----------------------------------------------------------------------- + TRandom* trand = new TRandom(); + double shift = trand->Uniform(TMath::Pi() - TMath::Pi() / 10.0, TMath::Pi() + TMath::Pi() / 10.0); + // double shift = TMath::Pi(); + if (!cfgIsKstar) { + lDecayDaughter2.SetXYZM(originalTrack2.px(), originalTrack2.py(), originalTrack2.pz(), massKa); + } else { + lDecayDaughter2.SetXYZM(originalTrack2.px(), originalTrack2.py(), originalTrack2.pz(), massPi); + } lRotationalTrack = lDecayDaughter2; lRotationalTrack.RotateZ(shift); @@ -752,16 +753,28 @@ struct phiInJets { double dEta_rot_qa = TMath::Abs(lDecayDaughter2.Eta()) - TMath::Abs(lRotationalTrack.Eta()); dR_rot = TMath::Sqrt(dPhi_rot * dPhi_rot + dEta_rot * dEta_rot); - if (cfgMCRecRotationalHists) { - JEhistos.fill(HIST("hMCRec_dPhi_rot_distribution"), dPhi_rot); - JEhistos.fill(HIST("hMCRec_dEta_rot_distribution"), dEta_rot); - JEhistos.fill(HIST("hMCRec_dEta_qa_rot_distribution"), dEta_rot_qa); + JEhistos.fill(HIST("hMCRec_dPhi_rot_distribution"), dPhi_rot); + JEhistos.fill(HIST("hMCRec_dEta_rot_distribution"), dEta_rot); + JEhistos.fill(HIST("hMCRec_dEta_qa_rot_distribution"), dEta_rot_qa); + + lResonance = lDecayDaughter1 + lDecayDaughter2; + if (cfgIsKstar) + lRotationalResonance = lDecayDaughter1 + lRotationalTrack; + + if (cfgIsKstar) { + JEhistos.fill(HIST("hMCRec_R_distribution"), dR); + JEhistos.fill(HIST("hMCRec_hUSS_Rotational"), 1.0, lRotationalResonance.Pt(), lResonance.M()); + JEhistos.fill(HIST("hMCRec_R_Rotation_distribution"), dR_rot); } } //----------------------------------------------------------------------- + if (!cfgIsKstar) { + lDecayDaughter2.SetXYZM(originalTrack2.px(), originalTrack2.py(), originalTrack2.pz(), massKa); + } else { + lDecayDaughter2.SetXYZM(originalTrack2.px(), originalTrack2.py(), originalTrack2.pz(), massPi); + } lResonance = lDecayDaughter1 + lDecayDaughter2; - if (cfgIsKstar) - lRotationalResonance = lDecayDaughter1 + lRotationalTrack; + if (std::fabs(lResonance.Eta()) > cfgtrkMaxEta) continue; @@ -776,11 +789,6 @@ struct phiInJets { if (originalTrack.sign() * originalTrack2.sign() < 0) { JEhistos.fill(HIST("hMCRec_hUSS"), 1.0, lResonance.Pt(), lResonance.M()); - if (cfgMCRecRotationalHists && cfgIsKstar) { - JEhistos.fill(HIST("hMCRec_R_distribution"), dR); - JEhistos.fill(HIST("hMCRec_hUSS_Rotational"), 1.0, lRotationalResonance.Pt(), lResonance.M()); - JEhistos.fill(HIST("hMCRec_R_Rotation_distribution"), dR_rot); - } } else if (originalTrack.sign() * originalTrack2.sign() > 0) { JEhistos.fill(HIST("hMCRec_hLSS"), 1.0, lResonance.Pt(), lResonance.M()); } @@ -804,14 +812,15 @@ struct phiInJets { double etadiff = mcd_eta[i] - lResonance.Eta(); double R = TMath::Sqrt((etadiff * etadiff) + (phidiff * phidiff)); - double phidiff_K1 = TVector2::Phi_mpi_pi(mcd_phi[i] - lDecayDaughter1.Phi()); - double etadiff_K1 = mcd_eta[i] - lDecayDaughter1.Eta(); - double R_K1 = TMath::Sqrt((etadiff_K1 * etadiff_K1) + (phidiff_K1 * phidiff_K1)); - - double phidiff_K2 = TVector2::Phi_mpi_pi(mcd_phi[i] - lDecayDaughter2.Phi()); - double etadiff_K2 = mcd_eta[i] - lDecayDaughter2.Eta(); - double R_K2 = TMath::Sqrt((etadiff_K2 * etadiff_K2) + (phidiff_K2 * phidiff_K2)); if (cfgDaughterQAHists && R < cfgjetR) { + double phidiff_K1 = TVector2::Phi_mpi_pi(mcd_phi[i] - lDecayDaughter1.Phi()); + double etadiff_K1 = mcd_eta[i] - lDecayDaughter1.Eta(); + double R_K1 = TMath::Sqrt((etadiff_K1 * etadiff_K1) + (phidiff_K1 * phidiff_K1)); + + double phidiff_K2 = TVector2::Phi_mpi_pi(mcd_phi[i] - lDecayDaughter2.Phi()); + double etadiff_K2 = mcd_eta[i] - lDecayDaughter2.Eta(); + double R_K2 = TMath::Sqrt((etadiff_K2 * etadiff_K2) + (phidiff_K2 * phidiff_K2)); + JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_Kangle_v_pt"), R_K1, lResonance.Pt()); JEhistos.fill(HIST("hMCRec_nonmatch_hUSS_Kangle_v_pt"), R_K2, lResonance.Pt()); } From ef7dc6ca0ba32834888cac2b671b025798002788 Mon Sep 17 00:00:00 2001 From: YubiaoWang Date: Mon, 5 May 2025 22:10:34 +0800 Subject: [PATCH 1180/1650] [PWGJE] Fix an error when remove leading jet eta band at delta pt code (#11025) --- PWGJE/Tasks/jetChargedV2.cxx | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/PWGJE/Tasks/jetChargedV2.cxx b/PWGJE/Tasks/jetChargedV2.cxx index cb98a8bef7b..6133cc19a27 100644 --- a/PWGJE/Tasks/jetChargedV2.cxx +++ b/PWGJE/Tasks/jetChargedV2.cxx @@ -96,6 +96,7 @@ struct JetChargedV2 { Configurable jetEtaMin{"jetEtaMin", -0.9, "minimum eta acceptance for jets"}; Configurable jetEtaMax{"jetEtaMax", 0.9, "maximum eta acceptance for jets"}; Configurable jetRadius{"jetRadius", 0.2, "jet resolution parameters"}; + Configurable randomConeLeadJetDeltaR{"randomConeLeadJetDeltaR", -99.0, "min distance between leading jet axis and random cone (RC) axis; if negative, min distance is set to automatic value of R_leadJet+R_RC "}; Configurable localRhoFitPtMin{"localRhoFitPtMin", 0.2, "Minimum track pT used for local rho fluctuation fit"}; Configurable localRhoFitPtMax{"localRhoFitPtMax", 5, "Maximum track pT used for local rho fluctuation fit"}; @@ -789,28 +790,21 @@ struct JetChargedV2 { // removing the leading jet from the random cone if (jets.size() > 0) { // if there are no jets in the acceptance (from the jetfinder cuts) then there can be no leading jet - float leadingJetEta = jets.iteratorAt(0).eta(); - float leadingJetPhi = jets.iteratorAt(0).phi(); - float etaBandWidth = 2 * randomConeR; + float dPhiLeadingJet = RecoDecay::constrainAngle(jets.iteratorAt(0).phi() - randomConePhi, static_cast(-o2::constants::math::PI)); + float dEtaLeadingJet = jets.iteratorAt(0).eta() - randomConeEta; bool jetWasInCone = false; - do { + while ((randomConeLeadJetDeltaR <= 0 && (std::sqrt(dEtaLeadingJet * dEtaLeadingJet + dPhiLeadingJet * dPhiLeadingJet) < jets.iteratorAt(0).r() / 100.0 + randomConeR)) || (randomConeLeadJetDeltaR > 0 && (std::sqrt(dEtaLeadingJet * dEtaLeadingJet + dPhiLeadingJet * dPhiLeadingJet) < randomConeLeadJetDeltaR))) { + jetWasInCone = true; randomConeEta = randomNumber.Uniform(trackEtaMin + randomConeR, trackEtaMax - randomConeR); randomConePhi = randomNumber.Uniform(0.0, o2::constants::math::TwoPI); - - float dEta = randomConeEta - leadingJetEta; - float dPhi = RecoDecay::constrainAngle(randomConePhi - leadingJetPhi, static_cast(-o2::constants::math::PI)); - - if (std::abs(dEta) > etaBandWidth && std::sqrt(dEta * dEta + dPhi * dPhi) > randomConeR + jets.iteratorAt(0).r() / 100.0) { - break; - } - jetWasInCone = true; - } while (true); - + dPhiLeadingJet = RecoDecay::constrainAngle(jets.iteratorAt(0).phi() - randomConePhi, static_cast(-o2::constants::math::PI)); + dEtaLeadingJet = jets.iteratorAt(0).eta() - randomConeEta; + } if (jetWasInCone) { randomConePt = 0.0; for (auto const& track : tracks) { - if (jetderiveddatautilities::selectTrack(track, trackSelection)) { // if track selection is uniformTrack, dcaXY and dcaZ cuts need to be added as they aren't in the selection so that they can be studied here + if (jetderiveddatautilities::selectTrack(track, trackSelection) && (std::fabs(track.eta() - leadingJetEta) > randomConeR)) { // if track selection is uniformTrack, dcaXY and dcaZ cuts need to be added as they aren't in the selection so that they can be studied here float dPhi = RecoDecay::constrainAngle(track.phi() - randomConePhi, static_cast(-o2::constants::math::PI)); float dEta = track.eta() - randomConeEta; if (std::sqrt(dEta * dEta + dPhi * dPhi) < randomConeR) { From 13d4d8f0a83519d8f75584bcfbcc832c91d0cddb Mon Sep 17 00:00:00 2001 From: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> Date: Mon, 5 May 2025 16:29:04 +0200 Subject: [PATCH 1181/1650] [PWGLF] Add QC histogram for checking the filling and reading of boolean standard columns (#11087) --- PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx | 10 ++++++++++ PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx | 7 +++++++ 2 files changed, 17 insertions(+) diff --git a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx index 32a9f027b18..5c9b77ff6d6 100644 --- a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx @@ -480,6 +480,10 @@ struct StrangenessBuilder { hFindable->GetXaxis()->SetBinLabel(6, "Cascades with collId -1"); } + auto hPrimaryV0s = histos.add("hPrimaryV0s", "hPrimaryV0s", kTH1D, {{2, -0.5f, 1.5f}}); + hPrimaryV0s->GetXaxis()->SetBinLabel(1, "All V0s"); + hPrimaryV0s->GetXaxis()->SetBinLabel(2, "Primary V0s"); + mRunNumber = 0; mEnabledTables.resize(nTables, 0); @@ -1462,6 +1466,9 @@ struct StrangenessBuilder { thisInfo.negP[0], thisInfo.negP[1], thisInfo.negP[2], thisInfo.momentum[0], thisInfo.momentum[1], thisInfo.momentum[2]); histos.fill(HIST("hTableBuildingStatistics"), kV0MCCores); + histos.fill(HIST("hPrimaryV0s"), 0); + if (thisInfo.isPhysicalPrimary) + histos.fill(HIST("hPrimaryV0s"), 1); } if (mEnabledTables[kV0MCCollRefs]) { products.v0mccollref(thisInfo.mcCollision); @@ -1593,6 +1600,9 @@ struct StrangenessBuilder { info.negP[0], info.negP[1], info.negP[2], info.momentum[0], info.momentum[1], info.momentum[2]); histos.fill(HIST("hTableBuildingStatistics"), kV0MCCores); + histos.fill(HIST("hPrimaryV0s"), 0); + if (thisInfo.isPhysicalPrimary) + histos.fill(HIST("hPrimaryV0s"), 1); } if (mEnabledTables[kV0MCCollRefs]) { products.v0mccollref(info.mcCollision); diff --git a/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx b/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx index 55e618ac11a..d8c3405c32f 100644 --- a/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx @@ -635,6 +635,10 @@ struct derivedlambdakzeroanalysis { hRawCentrality->SetBinContent(ii, value); } + auto hPrimaryV0s = histos.add("hPrimaryV0s", "hPrimaryV0s", kTH1D, {{2, -0.5f, 1.5f}}); + hPrimaryV0s->GetXaxis()->SetBinLabel(1, "All V0s"); + hPrimaryV0s->GetXaxis()->SetBinLabel(2, "Primary V0s"); + // histograms versus mass if (analyseK0Short) { histos.add("h2dNbrOfK0ShortVsCentrality", "h2dNbrOfK0ShortVsCentrality", kTH2F, {axisCentrality, {10, -0.5f, 9.5f}}); @@ -2299,9 +2303,12 @@ struct derivedlambdakzeroanalysis { if (!v0MC.has_straMCCollision()) continue; + histos.fill(HIST("hPrimaryV0s"), 0); if (!v0MC.isPhysicalPrimary()) continue; + histos.fill(HIST("hPrimaryV0s"), 1); + float ptmc = v0MC.ptMC(); float ymc = 1e3; if (v0MC.pdgCode() == 310) From b1827e28bd54c3a9495ed6823dd5012039ef86cd Mon Sep 17 00:00:00 2001 From: Francesco Mazzaschi <43742195+fmazzasc@users.noreply.github.com> Date: Mon, 5 May 2025 16:44:35 +0200 Subject: [PATCH 1182/1650] [PWGLF] Fix table filling in the nonPromptCascade task (#11082) Co-authored-by: Francesco Mazzaschi --- PWGLF/DataModel/LFNonPromptCascadeTables.h | 27 ++++++--- PWGLF/Tasks/Strangeness/nonPromptCascade.cxx | 63 +++++++++++++++----- 2 files changed, 68 insertions(+), 22 deletions(-) diff --git a/PWGLF/DataModel/LFNonPromptCascadeTables.h b/PWGLF/DataModel/LFNonPromptCascadeTables.h index bcdc5d6f08d..d8e8a67d40b 100644 --- a/PWGLF/DataModel/LFNonPromptCascadeTables.h +++ b/PWGLF/DataModel/LFNonPromptCascadeTables.h @@ -26,6 +26,7 @@ namespace NPCascadeTable { DECLARE_SOA_COLUMN(MatchingChi2, matchingChi2, float); DECLARE_SOA_COLUMN(DeltaPtITSCascade, deltaPtITSCascade, float); +DECLARE_SOA_COLUMN(DeltaPtCascade, deltaPtCascade, float); DECLARE_SOA_COLUMN(ITSClusSize, itsClusSize, float); DECLARE_SOA_COLUMN(HasReassociatedCluster, hasReassociatedCluster, bool); DECLARE_SOA_COLUMN(IsGoodMatch, isGoodMatch, bool); @@ -38,6 +39,7 @@ DECLARE_SOA_COLUMN(IsFromCharm, isFromCharm, bool); DECLARE_SOA_COLUMN(PvX, pvX, float); DECLARE_SOA_COLUMN(PvY, pvY, float); DECLARE_SOA_COLUMN(PvZ, pvZ, float); + DECLARE_SOA_COLUMN(CascPVContribs, cascPVContribs, uint8_t); DECLARE_SOA_COLUMN(CascPt, cascPt, float); @@ -104,6 +106,8 @@ DECLARE_SOA_COLUMN(DCAxMC, dcaXmc, float); DECLARE_SOA_COLUMN(DCAyMC, dcaYmc, float); DECLARE_SOA_COLUMN(DCAzMC, dcaZmc, float); DECLARE_SOA_COLUMN(MCcollisionMatch, mcCollisionMatch, bool); +DECLARE_SOA_COLUMN(HasFakeReassociation, hasFakeReassociation, bool); +DECLARE_SOA_COLUMN(MotherDecayDaughters, motherDecayDaughters, int8_t); DECLARE_SOA_COLUMN(Sel8, sel8, bool); DECLARE_SOA_COLUMN(MultFT0C, multFT0C, float); @@ -113,6 +117,7 @@ DECLARE_SOA_COLUMN(MultFT0A, multFT0A, float); DECLARE_SOA_TABLE(NPCascTable, "AOD", "NPCASCTABLE", NPCascadeTable::MatchingChi2, NPCascadeTable::DeltaPtITSCascade, + NPCascadeTable::DeltaPtCascade, NPCascadeTable::ITSClusSize, NPCascadeTable::HasReassociatedCluster, aod::collision::NumContrib, @@ -172,6 +177,7 @@ DECLARE_SOA_TABLE(NPCascTable, "AOD", "NPCASCTABLE", DECLARE_SOA_TABLE(NPCascTableNT, "AOD", "NPCASCTABLENT", NPCascadeTable::MatchingChi2, NPCascadeTable::DeltaPtITSCascade, + NPCascadeTable::DeltaPtCascade, NPCascadeTable::ITSClusSize, NPCascadeTable::HasReassociatedCluster, aod::collision::NumContrib, @@ -231,6 +237,7 @@ DECLARE_SOA_TABLE(NPCascTableNT, "AOD", "NPCASCTABLENT", DECLARE_SOA_TABLE(NPCascTableMC, "AOD", "NPCASCTABLEMC", NPCascadeTable::MatchingChi2, NPCascadeTable::DeltaPtITSCascade, + NPCascadeTable::DeltaPtCascade, NPCascadeTable::ITSClusSize, NPCascadeTable::HasReassociatedCluster, NPCascadeTable::IsGoodMatch, @@ -289,6 +296,9 @@ DECLARE_SOA_TABLE(NPCascTableMC, "AOD", "NPCASCTABLEMC", NPCascadeTable::PionTOFNSigma, NPCascadeTable::BachKaonTOFNSigma, NPCascadeTable::BachPionTOFNSigma, + NPCascadeTable::Sel8, + NPCascadeTable::MultFT0C, + NPCascadeTable::MultFT0A, NPCascadeTable::gPt, NPCascadeTable::gEta, NPCascadeTable::gPhi, @@ -297,13 +307,13 @@ DECLARE_SOA_TABLE(NPCascTableMC, "AOD", "NPCASCTABLEMC", NPCascadeTable::DCAyMC, NPCascadeTable::DCAzMC, NPCascadeTable::MCcollisionMatch, - NPCascadeTable::Sel8, - NPCascadeTable::MultFT0C, - NPCascadeTable::MultFT0A) + NPCascadeTable::HasFakeReassociation, + NPCascadeTable::MotherDecayDaughters) DECLARE_SOA_TABLE(NPCascTableMCNT, "AOD", "NPCASCTABLEMCNT", NPCascadeTable::MatchingChi2, NPCascadeTable::DeltaPtITSCascade, + NPCascadeTable::DeltaPtCascade, NPCascadeTable::ITSClusSize, NPCascadeTable::HasReassociatedCluster, NPCascadeTable::IsGoodMatch, @@ -362,6 +372,9 @@ DECLARE_SOA_TABLE(NPCascTableMCNT, "AOD", "NPCASCTABLEMCNT", NPCascadeTable::PionTOFNSigma, NPCascadeTable::BachKaonTOFNSigma, NPCascadeTable::BachPionTOFNSigma, + NPCascadeTable::Sel8, + NPCascadeTable::MultFT0C, + NPCascadeTable::MultFT0A, NPCascadeTable::gPt, NPCascadeTable::gEta, NPCascadeTable::gPhi, @@ -370,9 +383,8 @@ DECLARE_SOA_TABLE(NPCascTableMCNT, "AOD", "NPCASCTABLEMCNT", NPCascadeTable::DCAyMC, NPCascadeTable::DCAzMC, NPCascadeTable::MCcollisionMatch, - NPCascadeTable::Sel8, - NPCascadeTable::MultFT0C, - NPCascadeTable::MultFT0A) + NPCascadeTable::HasFakeReassociation, + NPCascadeTable::MotherDecayDaughters) DECLARE_SOA_TABLE(NPCascTableGen, "AOD", "NPCASCTABLEGen", NPCascadeTable::gPt, @@ -384,7 +396,8 @@ DECLARE_SOA_TABLE(NPCascTableGen, "AOD", "NPCASCTABLEGen", NPCascadeTable::DCAyMC, NPCascadeTable::DCAzMC, NPCascadeTable::IsFromBeauty, - NPCascadeTable::IsFromCharm) + NPCascadeTable::IsFromCharm, + NPCascadeTable::MotherDecayDaughters) } // namespace o2::aod diff --git a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx index b658981c5c4..0bc1c53bdb4 100644 --- a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx +++ b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx @@ -55,9 +55,11 @@ struct NPCascCandidate { int64_t trackITSID; int64_t collisionID; float matchingChi2; + float deltaPtITS; float deltaPt; float itsClusSize; bool hasReassociatedCluster; + bool hasFakeReassociation; bool isGoodMatch; bool isGoodCascade; int pdgCodeMom; @@ -346,13 +348,15 @@ struct NonPromptCascadeTask { o2::math_utils::SVector cascadePos, v0Pos; float cascCpa = -1, v0Cpa = -1; + o2::track::TrackParCov ntCascadeTrack; if (mDCAFitter.process(pionTrkParCov, protonTrkParCov)) { auto trackParCovV0 = mDCAFitter.createParentTrackParCov(0); // V0 track retrieved from p and pi daughters v0Pos = mDCAFitter.getPCACandidate(); if (mDCAFitter.process(trackParCovV0, bachTrkParCov)) { mDCAFitter.getTrackParamAtPCA(0).getPxPyPzGlo(momenta[0]); mDCAFitter.getTrackParamAtPCA(1).getPxPyPzGlo(momenta[1]); - mDCAFitter.createParentTrackParCov().getPxPyPzGlo(cascadeMomentum); + ntCascadeTrack = mDCAFitter.createParentTrackParCov(); + ntCascadeTrack.getPxPyPzGlo(cascadeMomentum); std::array pvPos = {primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ()}; cascadePos = mDCAFitter.getPCACandidate(); cascCpa = RecoDecay::cpa(pvPos, mDCAFitter.getPCACandidate(), cascadeMomentum); @@ -400,6 +404,7 @@ struct NonPromptCascadeTask { if (v0part.mothersIds()[0] == bachelor.mcParticle().mothersIds()[0]) { if (std::abs(motherV0.pdgCode()) == 3312 || std::abs(motherV0.pdgCode()) == 3334) { isGoodCascade = true; + isOmega = (std::abs(motherV0.pdgCode()) == 3334); fromHF = isFromHF(motherV0); mcParticleID = v0part.mothersIds()[0]; @@ -424,18 +429,19 @@ struct NonPromptCascadeTask { o2::base::Propagator::Instance()->propagateToDCA(primaryVertex, pionTrkParCov, mBz, 2.f, matCorr, &pionDCA); o2::base::Propagator::Instance()->propagateToDCA(primaryVertex, bachTrkParCov, mBz, 2.f, matCorr, &bachDCA); - float deltaPtITSCascade{-1.e10f}, cascITSclsSize{-1.e10f}, matchingChi2{-1.e10f}; - bool hasReassociatedClusters{false}; + float deltaPtITSCascade{-1.e10f}, deltaPtCascade{-1.e10f}, cascITSclsSize{-1.e10f}, matchingChi2{-1.e10f}; + bool hasReassociatedClusters{false}, hasFakeReassociation{false}; int trackedCascGlobalIndex{-1}, itsTrackGlobalIndex{-1}, cascITSclusters{-1}; if constexpr (requires { candidate.track(); }) { const auto& track = candidate.template track_as(); - cascPVContribs |= track.isPVContributor() << 0; const auto& ITStrack = candidate.template itsTrack_as(); + cascPVContribs |= ITStrack.isPVContributor() << 0; auto trackTrkParCov = getTrackParCov(track); o2::base::Propagator::Instance()->propagateToDCA(primaryVertex, trackTrkParCov, mBz, 2.f, matCorr, &motherDCA); hasReassociatedClusters = (track.itsNCls() != ITStrack.itsNCls()); cascadeLvector.SetCoordinates(track.pt(), track.eta(), track.phi(), 0); deltaPtITSCascade = std::hypot(cascadeMomentum[0], cascadeMomentum[1]) - ITStrack.pt(); + deltaPtCascade = std::hypot(cascadeMomentum[0], cascadeMomentum[1]) - track.pt(); trackedCascGlobalIndex = track.globalIndex(); itsTrackGlobalIndex = ITStrack.globalIndex(); cascITSclusters = track.itsNCls(); @@ -447,14 +453,14 @@ struct NonPromptCascadeTask { if (isGoodMatch) { pdgCodeMom = track.mcParticle().has_mothers() ? track.mcParticle().template mothers_as()[0].pdgCode() : 0; + hasFakeReassociation = track.mcMask() & (1 << 15); } itsTrackPDG = ITStrack.has_mcParticle() ? ITStrack.mcParticle().pdgCode() : 0; } + } else { + o2::base::Propagator::Instance()->propagateToDCA(primaryVertex, ntCascadeTrack, mBz, 2.f, matCorr, &motherDCA); } - // bool mysel8 = collision.sel8(); - float mc = collision.multFT0C(); - float ma = collision.multFT0A(); - candidates.emplace_back(NPCascCandidate{mcParticleID, trackedCascGlobalIndex, itsTrackGlobalIndex, candidate.collisionId(), matchingChi2, deltaPtITSCascade, cascITSclsSize, hasReassociatedClusters, isGoodMatch, isGoodCascade, pdgCodeMom, itsTrackPDG, fromHF[0], fromHF[1], + candidates.emplace_back(NPCascCandidate{mcParticleID, trackedCascGlobalIndex, itsTrackGlobalIndex, candidate.collisionId(), matchingChi2, deltaPtITSCascade, deltaPtCascade, cascITSclsSize, hasReassociatedClusters, hasFakeReassociation, isGoodMatch, isGoodCascade, pdgCodeMom, itsTrackPDG, fromHF[0], fromHF[1], collision.numContrib(), cascPVContribs, collision.collisionTimeRes(), primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ(), cascadeLvector.pt(), cascadeLvector.eta(), cascadeLvector.phi(), protonTrack.pt(), protonTrack.eta(), pionTrack.pt(), pionTrack.eta(), bachelor.pt(), bachelor.eta(), @@ -464,7 +470,7 @@ struct NonPromptCascadeTask { cascITSclusters, protonTrack.itsNCls(), pionTrack.itsNCls(), bachelor.itsNCls(), protonTrack.tpcNClsFound(), pionTrack.tpcNClsFound(), bachelor.tpcNClsFound(), protonTrack.tpcNSigmaPr(), pionTrack.tpcNSigmaPi(), bachelor.tpcNSigmaKa(), bachelor.tpcNSigmaPi(), protonTrack.hasTOF(), pionTrack.hasTOF(), bachelor.hasTOF(), - protonTrack.tofNSigmaPr(), pionTrack.tofNSigmaPi(), bachelor.tofNSigmaKa(), bachelor.tofNSigmaPi(), collision.sel8(), mc, ma}); + protonTrack.tofNSigmaPr(), pionTrack.tofNSigmaPi(), bachelor.tofNSigmaKa(), bachelor.tofNSigmaPi(), collision.sel8(), collision.multFT0C(), collision.multFT0A()}); } } @@ -472,7 +478,7 @@ struct NonPromptCascadeTask { void fillDataTable(auto const& candidates) { for (const auto& c : candidates) { - getDataTable()(c.matchingChi2, c.deltaPt, c.itsClusSize, c.hasReassociatedCluster, + getDataTable()(c.matchingChi2, c.deltaPtITS, c.deltaPt, c.itsClusSize, c.hasReassociatedCluster, c.pvContributors, c.cascPVContribs, c.pvTimeResolution, c.pvX, c.pvY, c.pvZ, c.cascPt, c.cascEta, c.cascPhi, c.protonPt, c.protonEta, c.pionPt, c.pionEta, c.bachPt, c.bachEta, @@ -483,7 +489,8 @@ struct NonPromptCascadeTask { c.cascNClusITS, c.protonNClusITS, c.pionNClusITS, c.bachNClusITS, c.protonNClusTPC, c.pionNClusTPC, c.bachNClusTPC, c.protonTPCNSigma, c.pionTPCNSigma, c.bachKaonTPCNSigma, c.bachPionTPCNSigma, c.protonHasTOF, c.pionHasTOF, c.bachHasTOF, - c.protonTOFNSigma, c.pionTOFNSigma, c.bachKaonTOFNSigma, c.bachPionTOFNSigma, c.sel8, c.multFT0C, c.multFT0A); + c.protonTOFNSigma, c.pionTOFNSigma, c.bachKaonTOFNSigma, c.bachPionTOFNSigma, + c.sel8, c.multFT0C, c.multFT0A); } } @@ -496,19 +503,32 @@ struct NonPromptCascadeTask { continue; } auto particle = mcParticles.iteratorAt(c.mcParticleId); + int motherDecayDaughters{0}; + if (c.isFromBeauty || c.isFromCharm) { + auto mom = particle.template mothers_as()[0]; + auto daughters = mom.template daughters_as(); + motherDecayDaughters = daughters.size(); + for (const auto& d : daughters) { + if (std::abs(d.pdgCode()) == 11 || std::abs(d.pdgCode()) == 13) { + motherDecayDaughters *= -1; + break; + } + } + } auto mcCollision = particle.template mcCollision_as(); auto recCollision = collisions.iteratorAt(c.collisionID); - getMCtable()(c.matchingChi2, c.deltaPt, c.itsClusSize, c.hasReassociatedCluster, c.isGoodMatch, c.isGoodCascade, c.pdgCodeMom, c.pdgCodeITStrack, c.isFromBeauty, c.isFromCharm, + getMCtable()(c.matchingChi2, c.deltaPtITS, c.deltaPt, c.itsClusSize, c.hasReassociatedCluster, c.isGoodMatch, c.isGoodCascade, c.pdgCodeMom, c.pdgCodeITStrack, c.isFromBeauty, c.isFromCharm, c.pvContributors, c.cascPVContribs, c.pvTimeResolution, c.pvX, c.pvY, c.pvZ, c.cascPt, c.cascEta, c.cascPhi, c.protonPt, c.protonEta, c.pionPt, c.pionEta, c.bachPt, c.bachEta, c.cascDCAxy, c.cascDCAz, c.protonDCAxy, c.protonDCAz, c.pionDCAxy, c.pionDCAz, c.bachDCAxy, c.bachDCAz, c.casccosPA, c.v0cosPA, c.massXi, c.massOmega, c.massV0, c.cascRadius, c.v0radius, c.cascLength, c.v0length, c.cascNClusITS, c.protonNClusITS, c.pionNClusITS, c.bachNClusITS, c.protonNClusTPC, c.pionNClusTPC, c.bachNClusTPC, c.protonTPCNSigma, c.pionTPCNSigma, c.bachKaonTPCNSigma, c.bachPionTPCNSigma, c.protonHasTOF, c.pionHasTOF, c.bachHasTOF, - c.protonTOFNSigma, c.pionTOFNSigma, c.bachKaonTOFNSigma, c.bachPionTOFNSigma, c.sel8, c.multFT0C, c.multFT0A, + c.protonTOFNSigma, c.pionTOFNSigma, c.bachKaonTOFNSigma, c.bachPionTOFNSigma, + c.sel8, c.multFT0C, c.multFT0A, particle.pt(), particle.eta(), particle.phi(), particle.pdgCode(), mcCollision.posX() - particle.vx(), mcCollision.posY() - particle.vy(), - mcCollision.posZ() - particle.vz(), mcCollision.globalIndex() == recCollision.mcCollisionId()); + mcCollision.posZ() - particle.vz(), mcCollision.globalIndex() == recCollision.mcCollisionId(), c.hasFakeReassociation, motherDecayDaughters); } } @@ -562,7 +582,20 @@ struct NonPromptCascadeTask { int pdgCodeMom = p.has_mothers() ? p.template mothers_as()[0].pdgCode() : 0; auto mcCollision = p.template mcCollision_as(); - NPCTableGen(p.pt(), p.eta(), p.phi(), p.pdgCode(), pdgCodeMom, mcCollision.posX() - p.vx(), mcCollision.posY() - p.vy(), mcCollision.posZ() - p.vz(), fromHF[0], fromHF[1]); + int motherDecayDaughters{0}; + if (fromHF[0] || fromHF[1]) { + auto mom = p.template mothers_as()[0]; + auto daughters = mom.template daughters_as(); + motherDecayDaughters = daughters.size(); + for (const auto& d : daughters) { + if (std::abs(d.pdgCode()) == 11 || std::abs(d.pdgCode()) == 13) { + motherDecayDaughters *= -1; + break; + } + } + } + + NPCTableGen(p.pt(), p.eta(), p.phi(), p.pdgCode(), pdgCodeMom, mcCollision.posX() - p.vx(), mcCollision.posY() - p.vy(), mcCollision.posZ() - p.vz(), fromHF[0], fromHF[1], motherDecayDaughters); } } PROCESS_SWITCH(NonPromptCascadeTask, processGenParticles, "process gen cascades: MC analysis", false); From cb4d1564f00554eeecf080afb97a4628a62ac271 Mon Sep 17 00:00:00 2001 From: Mattia Faggin Date: Mon, 5 May 2025 16:48:32 +0200 Subject: [PATCH 1183/1650] [PWGHF] Add particle/antiparticle info for SigmaC. (#11081) Co-authored-by: Mattia Faggin --- PWGHF/D2H/Tasks/taskSigmac.cxx | 35 ++++++++----- .../DataModel/CandidateReconstructionTables.h | 18 ++++--- .../candidateCreatorSigmac0plusplus.cxx | 50 ++++++++++++++++--- 3 files changed, 78 insertions(+), 25 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskSigmac.cxx b/PWGHF/D2H/Tasks/taskSigmac.cxx index e7083d7283e..39011a4a44d 100644 --- a/PWGHF/D2H/Tasks/taskSigmac.cxx +++ b/PWGHF/D2H/Tasks/taskSigmac.cxx @@ -78,6 +78,7 @@ struct HfTaskSigmac { const AxisSpec thnAxisGenPtLambdaCBMother{thnConfigAxisGenPtB, "#it{p}_{T}^{gen}(#Lambda_{c}^{+} B mother) (GeV/#it{c})"}; const AxisSpec thnAxisGenPtSigmaCBMother{thnConfigAxisGenPtB, "#it{p}_{T}^{gen}(#Sigma_{c}^{0,++} B mother) (GeV/#it{c})"}; const AxisSpec thnAxisGenSigmaCSpecies = {o2::aod::hf_cand_sigmac::Species::NSpecies, -0.5f, +o2::aod::hf_cand_sigmac::Species::NSpecies - 0.5f, "bin 1: #Sigma_{c}(2455), bin 2: #Sigma_{c}(2520)"}; + const AxisSpec thnAxisSigmaCParticleAntiparticle = {o2::aod::hf_cand_sigmac::Conjugated::NConjugated, -0.5f, +o2::aod::hf_cand_sigmac::Conjugated::NConjugated - 0.5f, "bin 1: particle, bin 2: antiparticle"}; /// analysis histograms HistogramRegistry registry{ @@ -271,17 +272,19 @@ struct HfTaskSigmac { std::vector axesSigmaCWoMl = {thnAxisPtLambdaC, axisDeltaMassSigmaC, thnAxisDecLength, thnAxisDecLengthXY, thnAxisCPA, thnAxisCPAXY, thnAxisOriginMc, thnAxisChannel, thnAxisPtSigmaC, thnAxisChargeSigmaC}; if (isMc) { registry.add("MC/generated/hnLambdaCGen", "THn for Lambdac gen", HistType::kTHnSparseF, {thnAxisGenPtLambdaC, thnAxisGenPtLambdaCBMother, thnAxisOriginMc, thnAxisChannel}); - registry.add("MC/generated/hnSigmaCGen", "THn for Sigmac gen", HistType::kTHnSparseF, {thnAxisGenPtSigmaC, thnAxisGenPtSigmaCBMother, thnAxisOriginMc, thnAxisChannel, thnAxisGenPtLambdaC, thnAxisChargeSigmaC, thnAxisGenSigmaCSpecies}); + registry.add("MC/generated/hnSigmaCGen", "THn for Sigmac gen", HistType::kTHnSparseF, {thnAxisGenPtSigmaC, thnAxisGenPtSigmaCBMother, thnAxisOriginMc, thnAxisChannel, thnAxisGenPtLambdaC, thnAxisChargeSigmaC, thnAxisGenSigmaCSpecies, thnAxisSigmaCParticleAntiparticle}); if (doprocessMcWithMl) { axesLambdaCWithMl.push_back(thnAxisGenPtLambdaCBMother); axesSigmaCWithMl.push_back(thnAxisGenPtSigmaCBMother); axesSigmaCWithMl.push_back(thnAxisGenSigmaCSpecies); + axesSigmaCWithMl.push_back(thnAxisSigmaCParticleAntiparticle); registry.add("hnLambdaC", "THn for Lambdac", HistType::kTHnSparseF, axesLambdaCWithMl); registry.add("hnSigmaC", "THn for Sigmac", HistType::kTHnSparseF, axesSigmaCWithMl); } else { axesLambdaCWoMl.push_back(thnAxisGenPtLambdaCBMother); axesSigmaCWoMl.push_back(thnAxisGenPtSigmaCBMother); axesSigmaCWoMl.push_back(thnAxisGenSigmaCSpecies); + axesSigmaCWoMl.push_back(thnAxisSigmaCParticleAntiparticle); registry.add("hnLambdaC", "THn for Lambdac", HistType::kTHnSparseF, axesLambdaCWoMl); registry.add("hnSigmaC", "THn for Sigmac", HistType::kTHnSparseF, axesSigmaCWoMl); } @@ -669,11 +672,12 @@ struct HfTaskSigmac { registry.fill(HIST("MC/generated/hPtGenLcFromSc0PlusPlusSig"), ptGenLc, origin, channel); registry.fill(HIST("MC/generated/hEtaGenLcFromSc0PlusPlusSig"), etaGenLc, origin, channel); registry.fill(HIST("MC/generated/hPhiGenLcFromSc0PlusPlusSig"), phiGenLc, origin, channel); /// Generated Λc+ ← Σc0,++ signal + int8_t particleAntiparticle = particle.particleAntiparticle(); if (origin == RecoDecay::OriginType::Prompt) { - registry.fill(HIST("MC/generated/hnSigmaCGen"), ptGenSc, ptGenScBMother, origin, channel, ptGenLc, 0, sigmacSpecies); + registry.fill(HIST("MC/generated/hnSigmaCGen"), ptGenSc, ptGenScBMother, origin, channel, ptGenLc, 0, sigmacSpecies, particleAntiparticle); } else { ptGenScBMother = mcParticlesSc.rawIteratorAt(particle.idxBhadMotherPart()).pt(); - registry.fill(HIST("MC/generated/hnSigmaCGen"), ptGenSc, ptGenScBMother, origin, channel, ptGenLc, 0, sigmacSpecies); + registry.fill(HIST("MC/generated/hnSigmaCGen"), ptGenSc, ptGenScBMother, origin, channel, ptGenLc, 0, sigmacSpecies, particleAntiparticle); } // debug -- uncomment if needed @@ -703,11 +707,12 @@ struct HfTaskSigmac { registry.fill(HIST("MC/generated/hPtGenLcFromSc0PlusPlusSig"), ptGenLc, origin, channel); registry.fill(HIST("MC/generated/hEtaGenLcFromSc0PlusPlusSig"), etaGenLc, origin, channel); registry.fill(HIST("MC/generated/hPhiGenLcFromSc0PlusPlusSig"), phiGenLc, origin, channel); /// Generated Λc+ ← Σc0,++ signal + int8_t particleAntiparticle = particle.particleAntiparticle(); if (origin == RecoDecay::OriginType::Prompt) { - registry.fill(HIST("MC/generated/hnSigmaCGen"), ptGenSc, ptGenScBMother, origin, channel, ptGenLc, 2, sigmacSpecies); + registry.fill(HIST("MC/generated/hnSigmaCGen"), ptGenSc, ptGenScBMother, origin, channel, ptGenLc, 2, sigmacSpecies, particleAntiparticle); } else { ptGenScBMother = mcParticlesSc.rawIteratorAt(particle.idxBhadMotherPart()).pt(); - registry.fill(HIST("MC/generated/hnSigmaCGen"), ptGenSc, ptGenScBMother, origin, channel, ptGenLc, 2, sigmacSpecies); + registry.fill(HIST("MC/generated/hnSigmaCGen"), ptGenSc, ptGenScBMother, origin, channel, ptGenLc, 2, sigmacSpecies, particleAntiparticle); } // debug -- uncomment if needed @@ -860,6 +865,7 @@ struct HfTaskSigmac { /// THn for candidate Σc0,++ cut variation if (enableTHn) { + int8_t particleAntiparticle = candSc.particleAntiparticle(); if constexpr (useMl) { /// fill with ML information /// BDT index 0: bkg score; BDT index 2: non-prompt score @@ -868,10 +874,10 @@ struct HfTaskSigmac { outputMl.at(0) = candidateLc.mlProbLcToPKPi()[0]; /// bkg score outputMl.at(1) = candidateLc.mlProbLcToPKPi()[2]; /// non-prompt score } - registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, outputMl.at(0), outputMl.at(1), origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart(), sigmacSpecies); + registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, outputMl.at(0), outputMl.at(1), origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart(), sigmacSpecies, particleAntiparticle); } else { /// fill w/o BDT information - registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart(), sigmacSpecies); + registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart(), sigmacSpecies, particleAntiparticle); } } @@ -934,6 +940,7 @@ struct HfTaskSigmac { /// THn for candidate Σc0,++ cut variation if (enableTHn) { + int8_t particleAntiparticle = candSc.particleAntiparticle(); if constexpr (useMl) { /// fill with ML information /// BDT index 0: bkg score; BDT index 2: non-prompt score @@ -942,10 +949,10 @@ struct HfTaskSigmac { outputMl.at(0) = candidateLc.mlProbLcToPiKP()[0]; /// bkg score outputMl.at(1) = candidateLc.mlProbLcToPiKP()[2]; /// non-prompt score } - registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, outputMl.at(0), outputMl.at(1), origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart(), sigmacSpecies); + registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, outputMl.at(0), outputMl.at(1), origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart(), sigmacSpecies, particleAntiparticle); } else { /// fill w/o BDT information - registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart(), sigmacSpecies); + registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart(), sigmacSpecies, particleAntiparticle); } } @@ -1044,6 +1051,7 @@ struct HfTaskSigmac { /// THn for candidate Σc0,++ cut variation if (enableTHn) { + int8_t particleAntiparticle = candSc.particleAntiparticle(); if constexpr (useMl) { /// fill with ML information /// BDT index 0: bkg score; BDT index 2: non-prompt score @@ -1052,10 +1060,10 @@ struct HfTaskSigmac { outputMl.at(0) = candidateLc.mlProbLcToPKPi()[0]; /// bkg score outputMl.at(1) = candidateLc.mlProbLcToPKPi()[2]; /// non-prompt score } - registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, outputMl.at(0), outputMl.at(1), origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart(), sigmacSpecies); + registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, outputMl.at(0), outputMl.at(1), origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart(), sigmacSpecies, particleAntiparticle); } else { /// fill w/o BDT information - registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart(), sigmacSpecies); + registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart(), sigmacSpecies, particleAntiparticle); } } @@ -1116,6 +1124,7 @@ struct HfTaskSigmac { /// THn for candidate Σc0,++ cut variation if (enableTHn) { + int8_t particleAntiparticle = candSc.particleAntiparticle(); if constexpr (useMl) { /// fill with ML information /// BDT index 0: bkg score; BDT index 2: non-prompt score @@ -1124,10 +1133,10 @@ struct HfTaskSigmac { outputMl.at(0) = candidateLc.mlProbLcToPiKP()[0]; /// bkg score outputMl.at(1) = candidateLc.mlProbLcToPiKP()[2]; /// non-prompt score } - registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, outputMl.at(0), outputMl.at(1), origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart(), sigmacSpecies); + registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, outputMl.at(0), outputMl.at(1), origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart(), sigmacSpecies, particleAntiparticle); } else { /// fill w/o BDT information - registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart(), sigmacSpecies); + registry.get(HIST("hnSigmaC"))->Fill(ptLc, deltaMass, decLengthLc, decLengthXYLc, cpaLc, cpaXYLc, origin, channel, ptSc, std::abs(chargeSc), candSc.ptBhadMotherPart(), sigmacSpecies, particleAntiparticle); } } diff --git a/PWGHF/DataModel/CandidateReconstructionTables.h b/PWGHF/DataModel/CandidateReconstructionTables.h index 1210ea896fa..6e76ea8b0ff 100644 --- a/PWGHF/DataModel/CandidateReconstructionTables.h +++ b/PWGHF/DataModel/CandidateReconstructionTables.h @@ -2123,10 +2123,11 @@ DECLARE_SOA_COLUMN(StatusSpreadLcMinvPKPiFromPDG, statusSpreadLcMinvPKPiFromPDG, DECLARE_SOA_COLUMN(StatusSpreadLcMinvPiKPFromPDG, statusSpreadLcMinvPiKPFromPDG, int); //! // Λc Minv(piKp) spread from PDG Λc mass DECLARE_SOA_INDEX_COLUMN_FULL(Prong0, prong0, int, HfCand3Prong, "_0"); //! Λc index // MC matching result: -DECLARE_SOA_COLUMN(FlagMcMatchRec, flagMcMatchRec, int8_t); //! reconstruction level -DECLARE_SOA_COLUMN(FlagMcMatchGen, flagMcMatchGen, int8_t); //! generator level -DECLARE_SOA_COLUMN(OriginMcRec, originMcRec, int8_t); //! particle origin, reconstruction level -DECLARE_SOA_COLUMN(OriginMcGen, originMcGen, int8_t); //! particle origin, generator level +DECLARE_SOA_COLUMN(FlagMcMatchRec, flagMcMatchRec, int8_t); //! reconstruction level +DECLARE_SOA_COLUMN(FlagMcMatchGen, flagMcMatchGen, int8_t); //! generator level +DECLARE_SOA_COLUMN(OriginMcRec, originMcRec, int8_t); //! particle origin, reconstruction level +DECLARE_SOA_COLUMN(OriginMcGen, originMcGen, int8_t); //! particle origin, generator level +DECLARE_SOA_COLUMN(ParticleAntiparticle, particleAntiparticle, int8_t); //! particle or antiparticle // mapping of decay types enum DecayType { Sc0ToPKPiPi = 0, @@ -2139,6 +2140,9 @@ enum Species : int { Sc2455 = 0, enum Decays : int { PKPi = 0, PiKP, NDecays }; +enum Conjugated : int { Particle = 0, + Antiparticle, + NConjugated }; constexpr int ChargeNull = 0; constexpr int ChargePlusPlus = 2; } // namespace hf_cand_sigmac @@ -2195,13 +2199,15 @@ DECLARE_SOA_TABLE(HfCandScMcRec, "AOD", "HFCANDSCMCREC", //! hf_cand_sigmac::FlagMcMatchRec, hf_cand_sigmac::OriginMcRec, hf_cand::PtBhadMotherPart, - hf_cand::PdgBhadMotherPart); + hf_cand::PdgBhadMotherPart, + hf_cand_sigmac::ParticleAntiparticle); // table with results of generation level MC matching DECLARE_SOA_TABLE(HfCandScMcGen, "AOD", "HFCANDSCMCGEN", //! hf_cand_sigmac::FlagMcMatchGen, hf_cand_sigmac::OriginMcGen, - hf_cand::IdxBhadMotherPart); + hf_cand::IdxBhadMotherPart, + hf_cand_sigmac::ParticleAntiparticle); // specific Σc0,++ candidate properties in cascade channel namespace hf_cand_sigmac_to_cascade diff --git a/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx b/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx index 1e6c7d982a4..4df8dabd859 100644 --- a/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx +++ b/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx @@ -415,6 +415,26 @@ struct HfCandidateSigmac0plusplusMc { } } + // @brief function to check whether a matched Sigmac is particle or antiparticle + // @tparam particle the MC particle under study, matched with some Sigmac + // @param pdgSigmac the pdgcode to look for (either of Sigmac(2455), or of Sigmac(2520)) + template + int8_t isParticleAntiparticle(PART const& particle, int pdgSigmac) + { + + int pdgCode = particle.pdgCode(); + if (pdgCode == pdgSigmac) { + // particle + return aod::hf_cand_sigmac::Particle; + } else if (pdgCode == -pdgSigmac) { + // antiparticle + return aod::hf_cand_sigmac::Antiparticle; + } + + // the current particle is not a Sigmac of this species + return -1; + } + /// @brief dummy process function, to be run on data /// @param void process(aod::Tracks const&) {} @@ -447,11 +467,12 @@ struct HfCandidateSigmac0plusplusMc { flag = 0; origin = 0; std::vector idxBhadMothers{}; + int8_t particleAntiparticle = -1; /// skip immediately the candidate Σc0,++ w/o a Λc+ matched to MC auto candLc = candSigmac.prongLc_as(); if (!(std::abs(candLc.flagMcMatchRec()) == BIT(aod::hf_cand_3prong::DecayType::LcToPKPi))) { /// (*) - rowMCMatchScRec(flag, origin, -1.f, 0); + rowMCMatchScRec(flag, origin, -1.f, 0, -1); continue; } @@ -473,6 +494,8 @@ struct HfCandidateSigmac0plusplusMc { if (indexRec > -1) { /// due to (*) no need to check anything for LambdaC flag = sign * BIT(aod::hf_cand_sigmac::DecayType::Sc0ToPKPiPi); } + auto particle = mcParticles.rawIteratorAt(indexRec); + particleAntiparticle = isParticleAntiparticle(particle, Pdg::kSigmaC0); /// look for Σc0(2520) if (flag == 0) { @@ -480,6 +503,10 @@ struct HfCandidateSigmac0plusplusMc { if (indexRec > -1) { /// due to (*) no need to check anything for LambdaC flag = sign * BIT(aod::hf_cand_sigmac::DecayType::ScStar0ToPKPiPi); } + if (particleAntiparticle < 0) { + auto particle = mcParticles.rawIteratorAt(indexRec); + particleAntiparticle = isParticleAntiparticle(particle, Pdg::kSigmaCStar0); + } } } else if (std::abs(chargeSigmac) == o2::aod::hf_cand_sigmac::ChargePlusPlus) { @@ -494,6 +521,8 @@ struct HfCandidateSigmac0plusplusMc { if (indexRec > -1) { /// due to (*) no need to check anything for LambdaC flag = sign * BIT(aod::hf_cand_sigmac::DecayType::ScplusplusToPKPiPi); } + auto particle = mcParticles.rawIteratorAt(indexRec); + particleAntiparticle = isParticleAntiparticle(particle, Pdg::kSigmaCPlusPlus); /// look for Σc++(2520) if (flag == 0) { @@ -501,6 +530,10 @@ struct HfCandidateSigmac0plusplusMc { if (indexRec > -1) { /// due to (*) no need to check anything for LambdaC flag = sign * BIT(aod::hf_cand_sigmac::DecayType::ScStarPlusPlusToPKPiPi); } + if (particleAntiparticle < 0) { + auto particle = mcParticles.rawIteratorAt(indexRec); + particleAntiparticle = isParticleAntiparticle(particle, Pdg::kSigmaCStarPlusPlus); + } } } @@ -512,9 +545,9 @@ struct HfCandidateSigmac0plusplusMc { /// fill the table with results of reconstruction level MC matching if (origin == RecoDecay::OriginType::NonPrompt) { auto bHadMother = mcParticles.rawIteratorAt(idxBhadMothers[0]); - rowMCMatchScRec(flag, origin, bHadMother.pt(), bHadMother.pdgCode()); + rowMCMatchScRec(flag, origin, bHadMother.pt(), bHadMother.pdgCode(), particleAntiparticle); } else { - rowMCMatchScRec(flag, origin, -1.f, 0); + rowMCMatchScRec(flag, origin, -1.f, 0, particleAntiparticle); } } /// end loop over reconstructed Σc0,++ candidates @@ -523,6 +556,7 @@ struct HfCandidateSigmac0plusplusMc { flag = 0; origin = 0; std::vector idxBhadMothers{}; + int8_t particleAntiparticle = -1; /// MC ev. selection done w/o centrality estimator /// In case of need, readapt the code templetizing the function @@ -534,7 +568,7 @@ struct HfCandidateSigmac0plusplusMc { hfEvSelMc.fillHistograms(mcCollision, rejectionMask, 0); if (rejectionMask != 0) { // at least one event selection not satisfied --> reject gen particles from this collision - rowMCMatchScGen(flag, origin, -1); + rowMCMatchScGen(flag, origin, -1, -1); continue; } @@ -554,6 +588,7 @@ struct HfCandidateSigmac0plusplusMc { if (RecoDecay::isMatchedMCGen(mcParticles, daughter, Pdg::kLambdaCPlus, std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2)) { /// Λc+ daughter decaying in pK-π+ found! flag = sign * BIT(aod::hf_cand_sigmac::DecayType::Sc0ToPKPiPi); + particleAntiparticle = isParticleAntiparticle(particle, Pdg::kSigmaC0); break; } } @@ -566,6 +601,7 @@ struct HfCandidateSigmac0plusplusMc { if (RecoDecay::isMatchedMCGen(mcParticles, daughter, Pdg::kLambdaCPlus, std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2)) { /// Λc+ daughter decaying in pK-π+ found! flag = sign * BIT(aod::hf_cand_sigmac::DecayType::ScplusplusToPKPiPi); + particleAntiparticle = isParticleAntiparticle(particle, Pdg::kSigmaCPlusPlus); break; } } @@ -582,6 +618,7 @@ struct HfCandidateSigmac0plusplusMc { if (RecoDecay::isMatchedMCGen(mcParticles, daughter, Pdg::kLambdaCPlus, std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2)) { /// Λc+ daughter decaying in pK-π+ found! flag = sign * BIT(aod::hf_cand_sigmac::DecayType::ScStar0ToPKPiPi); + particleAntiparticle = isParticleAntiparticle(particle, Pdg::kSigmaCStar0); break; } } @@ -594,6 +631,7 @@ struct HfCandidateSigmac0plusplusMc { if (RecoDecay::isMatchedMCGen(mcParticles, daughter, Pdg::kLambdaCPlus, std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2)) { /// Λc+ daughter decaying in pK-π+ found! flag = sign * BIT(aod::hf_cand_sigmac::DecayType::ScStarPlusPlusToPKPiPi); + particleAntiparticle = isParticleAntiparticle(particle, Pdg::kSigmaCStarPlusPlus); break; } } @@ -606,9 +644,9 @@ struct HfCandidateSigmac0plusplusMc { } /// fill the table with results of generation level MC matching if (origin == RecoDecay::OriginType::NonPrompt) { - rowMCMatchScGen(flag, origin, idxBhadMothers[0]); + rowMCMatchScGen(flag, origin, idxBhadMothers[0], particleAntiparticle); } else { - rowMCMatchScGen(flag, origin, -1); + rowMCMatchScGen(flag, origin, -1, particleAntiparticle); } // debug From 592555b657a1142d9c48ae3e0ba605bb6800998a Mon Sep 17 00:00:00 2001 From: Hadi Hassan Date: Mon, 5 May 2025 18:13:09 +0300 Subject: [PATCH 1184/1650] [PWGJE] Adding the IPz as a feature for ML (#11088) --- PWGJE/Core/JetTaggingUtilities.h | 6 ++++-- PWGJE/Core/MlResponseHfTagging.h | 29 +++++++++++++++++++++++++++++ PWGJE/Tasks/bjetTreeCreator.cxx | 10 ++++++---- 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/PWGJE/Core/JetTaggingUtilities.h b/PWGJE/Core/JetTaggingUtilities.h index 885db9ff3c3..424bcceaa63 100644 --- a/PWGJE/Core/JetTaggingUtilities.h +++ b/PWGJE/Core/JetTaggingUtilities.h @@ -79,6 +79,8 @@ struct BJetTrackParams { double deltaRJetTrack = 0.0; double signedIP2D = 0.0; double signedIP2DSign = 0.0; + double signedIPz = 0.0; + double signedIPzSign = 0.0; double signedIP3D = 0.0; double signedIP3DSign = 0.0; double momFraction = 0.0; @@ -1011,7 +1013,7 @@ void analyzeJetTrackInfo4ML(AnalysisJet const& analysisJet, AnyTracks const& /*a } } - tracksParams.emplace_back(BJetTrackParams{constituent.pt(), constituent.eta(), dotProduct, dotProduct / analysisJet.p(), deltaRJetTrack, std::abs(constituent.dcaXY()) * sign, constituent.sigmadcaXY(), std::abs(constituent.dcaXYZ()) * sign, constituent.sigmadcaXYZ(), constituent.p() / analysisJet.p(), rClosestSV}); + tracksParams.emplace_back(BJetTrackParams{constituent.pt(), constituent.eta(), dotProduct, dotProduct / analysisJet.p(), deltaRJetTrack, std::abs(constituent.dcaXY()) * sign, constituent.sigmadcaXY(), std::abs(constituent.dcaZ()) * sign, constituent.sigmadcaZ(), std::abs(constituent.dcaXYZ()) * sign, constituent.sigmadcaXYZ(), constituent.p() / analysisJet.p(), rClosestSV}); } auto compare = [](BJetTrackParams& tr1, BJetTrackParams& tr2) { @@ -1036,7 +1038,7 @@ void analyzeJetTrackInfo4MLnoSV(AnalysisJet const& analysisJet, AnyTracks const& double dotProduct = RecoDecay::dotProd(std::array{analysisJet.px(), analysisJet.py(), analysisJet.pz()}, std::array{constituent.px(), constituent.py(), constituent.pz()}); int sign = getGeoSign(analysisJet, constituent); - tracksParams.emplace_back(BJetTrackParams{constituent.pt(), constituent.eta(), dotProduct, dotProduct / analysisJet.p(), deltaRJetTrack, std::abs(constituent.dcaXY()) * sign, constituent.sigmadcaXY(), std::abs(constituent.dcaXYZ()) * sign, constituent.sigmadcaXYZ(), constituent.p() / analysisJet.p(), 0.0}); + tracksParams.emplace_back(BJetTrackParams{constituent.pt(), constituent.eta(), dotProduct, dotProduct / analysisJet.p(), deltaRJetTrack, std::abs(constituent.dcaXY()) * sign, constituent.sigmadcaXY(), std::abs(constituent.dcaZ()) * sign, constituent.sigmadcaZ(), std::abs(constituent.dcaXYZ()) * sign, constituent.sigmadcaXYZ(), constituent.p() / analysisJet.p(), 0.0}); } auto compare = [](BJetTrackParams& tr1, BJetTrackParams& tr2) { diff --git a/PWGJE/Core/MlResponseHfTagging.h b/PWGJE/Core/MlResponseHfTagging.h index 8db76fe8d38..462cb661505 100644 --- a/PWGJE/Core/MlResponseHfTagging.h +++ b/PWGJE/Core/MlResponseHfTagging.h @@ -71,6 +71,8 @@ enum class InputFeaturesBTag : uint8_t { deltaRJetTrack, signedIP2D, signedIP2DSign, + signedIPz, + signedIPzSign, signedIP3D, signedIP3DSign, momFraction, @@ -148,6 +150,8 @@ class MlResponseHfTagging : public MlResponse CHECK_AND_FILL_VEC_BTAG(trackInput, track, deltaRJetTrack) CHECK_AND_FILL_VEC_BTAG(trackInput, track, signedIP2D) CHECK_AND_FILL_VEC_BTAG(trackInput, track, signedIP2DSign) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, signedIPz) + CHECK_AND_FILL_VEC_BTAG(trackInput, track, signedIPzSign) CHECK_AND_FILL_VEC_BTAG(trackInput, track, signedIP3D) CHECK_AND_FILL_VEC_BTAG(trackInput, track, signedIP3DSign) CHECK_AND_FILL_VEC_BTAG(trackInput, track, momFraction) @@ -192,6 +196,23 @@ class MlResponseHfTagging : public MlResponse } } + /// @brief Method to replace NaN and infinity values in a vector with a specified value + /// @param vec is the vector to be processed + /// @param value is the value to replace NaN values with + /// @return the number of NaN values replaced + template + static int replaceNaN(std::vector& vec, T value) + { + int numNaN = 0; + for (auto& el : vec) { + if (std::isnan(el) || std::isinf(el)) { + el = value; + ++numNaN; + } + } + return numNaN; + } + /// Method to get the input features vector needed for ML inference in a 2D vector /// \param jet is the b-jet candidate /// \param tracks is the vector of tracks associated to the jet @@ -209,6 +230,10 @@ class MlResponseHfTagging : public MlResponse std::vector> inputFeatures; + replaceNaN(jetInput, 0.f); + replaceNaN(trackInput, 0.f); + replaceNaN(svInput, 0.f); + inputFeatures.push_back(jetInput); inputFeatures.push_back(trackInput); inputFeatures.push_back(svInput); @@ -237,6 +262,8 @@ class MlResponseHfTagging : public MlResponse inputFeatures.insert(inputFeatures.end(), trackInput.begin(), trackInput.end()); inputFeatures.insert(inputFeatures.end(), svInput.begin(), svInput.end()); + replaceNaN(inputFeatures, 0.f); + return inputFeatures; } @@ -261,6 +288,8 @@ class MlResponseHfTagging : public MlResponse FILL_MAP_BJET(deltaRJetTrack), FILL_MAP_BJET(signedIP2D), FILL_MAP_BJET(signedIP2DSign), + FILL_MAP_BJET(signedIPz), + FILL_MAP_BJET(signedIPzSign), FILL_MAP_BJET(signedIP3D), FILL_MAP_BJET(signedIP3DSign), FILL_MAP_BJET(momFraction), diff --git a/PWGJE/Tasks/bjetTreeCreator.cxx b/PWGJE/Tasks/bjetTreeCreator.cxx index b99d6f41bd8..4508600962c 100644 --- a/PWGJE/Tasks/bjetTreeCreator.cxx +++ b/PWGJE/Tasks/bjetTreeCreator.cxx @@ -82,7 +82,8 @@ DECLARE_SOA_COLUMN(DotProdTrackJetOverJet, trackdotjetoverjet, float); //! The d DECLARE_SOA_COLUMN(DeltaRJetTrack, rjettrack, float); //! The DR jet-track DECLARE_SOA_COLUMN(SignedIP2D, ip2d, float); //! The track signed 2D IP DECLARE_SOA_COLUMN(SignedIP2DSign, ip2dsigma, float); //! The track signed 2D IP significance -DECLARE_SOA_COLUMN(SignedIP3D, ip3d, float); //! The track signed 3D IP +DECLARE_SOA_COLUMN(SignedIPz, ipz, float); //! The track signed z IP +DECLARE_SOA_COLUMN(SignedIPzSign, ipzsigma, float); //! The track signed z IP significance DECLARE_SOA_COLUMN(SignedIP3DSign, ip3dsigma, float); //! The track signed 3D IP significance DECLARE_SOA_COLUMN(MomFraction, momfraction, float); //! The track momentum fraction of the jets DECLARE_SOA_COLUMN(DeltaRTrackVertex, rtrackvertex, float); //! DR between the track and the closest SV, to be decided whether to add to or not @@ -108,7 +109,8 @@ DECLARE_SOA_TABLE(bjetTracksParams, "AOD", "BJETTRACKSPARAM", trackInfo::DeltaRJetTrack, trackInfo::SignedIP2D, trackInfo::SignedIP2DSign, - trackInfo::SignedIP3D, + trackInfo::SignedIPz, + trackInfo::SignedIPzSign, trackInfo::SignedIP3DSign, trackInfo::MomFraction, trackInfo::DeltaRTrackVertex); @@ -460,7 +462,7 @@ struct BJetTreeCreator { } if (produceTree) { - bjetTracksParamsTable(bjetParamsTable.lastIndex() + 1, constituent.pt(), constituent.eta(), dotProduct, dotProduct / analysisJet.p(), deltaRJetTrack, std::abs(constituent.dcaXY()) * sign, constituent.sigmadcaXY(), std::abs(constituent.dcaXYZ()) * sign, constituent.sigmadcaXYZ(), constituent.p() / analysisJet.p(), RClosestSV); + bjetTracksParamsTable(bjetParamsTable.lastIndex() + 1, constituent.pt(), constituent.eta(), dotProduct, dotProduct / analysisJet.p(), deltaRJetTrack, std::abs(constituent.dcaXY()) * sign, constituent.sigmadcaXY(), std::abs(constituent.dcaZ()) * sign, constituent.sigmadcaZ(), constituent.sigmadcaXYZ(), constituent.p() / analysisJet.p(), RClosestSV); } trackIndices.push_back(bjetTracksParamsTable.lastIndex()); } @@ -531,7 +533,7 @@ struct BJetTreeCreator { } if (produceTree) { - bjetTracksParamsTable(bjetParamsTable.lastIndex() + 1, constituent.pt(), constituent.eta(), dotProduct, dotProduct / analysisJet.p(), deltaRJetTrack, std::abs(constituent.dcaXY()) * sign, constituent.sigmadcaXY(), std::abs(constituent.dcaXYZ()) * sign, constituent.sigmadcaXYZ(), constituent.p() / analysisJet.p(), 0.); + bjetTracksParamsTable(bjetParamsTable.lastIndex() + 1, constituent.pt(), constituent.eta(), dotProduct, dotProduct / analysisJet.p(), deltaRJetTrack, std::abs(constituent.dcaXY()) * sign, constituent.sigmadcaXY(), std::abs(constituent.dcaZ()) * sign, constituent.sigmadcaZ(), constituent.sigmadcaXYZ(), constituent.p() / analysisJet.p(), 0.); } trackIndices.push_back(bjetTracksParamsTable.lastIndex()); } From bce8e56c6c288b797ebe71440b8092ded14e7752 Mon Sep 17 00:00:00 2001 From: nzardosh Date: Mon, 5 May 2025 17:59:00 +0200 Subject: [PATCH 1185/1650] [PWGJE] removing circular depenency for background subtraction (#11090) --- PWGJE/TableProducer/rhoEstimator.cxx | 14 +------------- PWGJE/Tasks/jetSubstructureHFOutput.cxx | 3 +-- PWGJE/Tasks/jetSubstructureOutput.cxx | 4 ++-- 3 files changed, 4 insertions(+), 17 deletions(-) diff --git a/PWGJE/TableProducer/rhoEstimator.cxx b/PWGJE/TableProducer/rhoEstimator.cxx index 6e96a6e7825..b050abe1e83 100644 --- a/PWGJE/TableProducer/rhoEstimator.cxx +++ b/PWGJE/TableProducer/rhoEstimator.cxx @@ -70,9 +70,6 @@ struct RhoEstimatorTask { Configurable bkgPhiMax{"bkgPhiMax", 99., "maximum phi for determining background density"}; Configurable doSparse{"doSparse", false, "perfom sparse estimation"}; - Configurable thresholdChargedJetPtMin{"thresholdChargedJetPtMin", 0.0, "Minimum charged jet pt to accept event"}; - Configurable thresholdNeutralJetPtMin{"thresholdNeutralJetPtMin", 0.0, "Minimum neutral jet pt to accept event"}; - Configurable thresholdFullJetPtMin{"thresholdFullJetPtMin", 0.0, "Minimum full jet pt to accept event"}; Configurable thresholdTriggerTrackPtMin{"thresholdTriggerTrackPtMin", 0.0, "Minimum trigger track pt to accept event"}; Configurable thresholdClusterEnergyMin{"thresholdClusterEnergyMin", 0.0, "Minimum cluster energy to accept event"}; Configurable performTriggerTrackSelection{"performTriggerTrackSelection", false, "only accept trigger tracks that pass one of the track selections"}; @@ -141,13 +138,7 @@ struct RhoEstimatorTask { void processSelectionObjects(T& selectionObjects) { float selectionObjectPtMin = 0.0; - if constexpr (std::is_same_v, aod::ChargedJets>) { - selectionObjectPtMin = config.thresholdChargedJetPtMin; - } else if constexpr (std::is_same_v, aod::NeutralJets>) { - selectionObjectPtMin = config.thresholdNeutralJetPtMin; - } else if constexpr (std::is_same_v, aod::FullJets>) { - selectionObjectPtMin = config.thresholdFullJetPtMin; - } else if constexpr (std::is_same_v, aod::JTracks>) { + if constexpr (std::is_same_v, aod::JTracks>) { selectionObjectPtMin = config.thresholdTriggerTrackPtMin; } else if constexpr (std::is_same_v, aod::JClusters>) { selectionObjectPtMin = config.thresholdClusterEnergyMin; @@ -182,9 +173,6 @@ struct RhoEstimatorTask { } PROCESS_SWITCH(RhoEstimatorTask, processSetupCollisionSelection, "setup the writing for data based on collisions", false); PROCESS_SWITCH(RhoEstimatorTask, processSetupEventTriggering, "process software triggers", false); - PROCESS_SWITCH_FULL(RhoEstimatorTask, processSelectionObjects, processSelectingChargedJets, "process charged jets", false); - PROCESS_SWITCH_FULL(RhoEstimatorTask, processSelectionObjects, processSelectingNeutralJets, "process neutral jets", false); - PROCESS_SWITCH_FULL(RhoEstimatorTask, processSelectionObjects, processSelectingFullJets, "process full jets", false); PROCESS_SWITCH_FULL(RhoEstimatorTask, processSelectionObjects, processSelectingClusters, "process EMCal clusters", false); PROCESS_SWITCH_FULL(RhoEstimatorTask, processSelectionObjects, processSelectingTracks, "process high pt tracks", false); diff --git a/PWGJE/Tasks/jetSubstructureHFOutput.cxx b/PWGJE/Tasks/jetSubstructureHFOutput.cxx index ffa526f1a11..8a781d84bfb 100644 --- a/PWGJE/Tasks/jetSubstructureHFOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureHFOutput.cxx @@ -695,11 +695,10 @@ struct JetSubstructureHFOutputTask { PROCESS_SWITCH(JetSubstructureHFOutputTask, processOutputSubstructureMatchingMC, "jet substructure matching output MC", false); void processOutputJetsMCD(aod::JetCollisionMCD const& collision, - aod::JetMcCollisions const&, JetTableMCD const& jets, soa::Join const& candidates) { - analyseCharged(collision, jets, candidates, products.collisionOutputTableMCD, products.jetOutputTableMCD, products.jetSubstructureOutputTableMCD, splittingMatchesGeoVecVecMCD, splittingMatchesPtVecVecMCD, splittingMatchesHFVecVecMCD, pairMatchesVecVecMCD, jetMappingMCD, candidateMapping, configs.jetPtMinMCD, collision.mcCollision().weight()); + analyseCharged(collision, jets, candidates, products.collisionOutputTableMCD, products.jetOutputTableMCD, products.jetSubstructureOutputTableMCD, splittingMatchesGeoVecVecMCD, splittingMatchesPtVecVecMCD, splittingMatchesHFVecVecMCD, pairMatchesVecVecMCD, jetMappingMCD, candidateMapping, configs.jetPtMinMCD, collision.weight()); } PROCESS_SWITCH(JetSubstructureHFOutputTask, processOutputJetsMCD, "hf jet substructure output MCD", false); diff --git a/PWGJE/Tasks/jetSubstructureOutput.cxx b/PWGJE/Tasks/jetSubstructureOutput.cxx index fab2581ad2a..9d2df7c032a 100644 --- a/PWGJE/Tasks/jetSubstructureOutput.cxx +++ b/PWGJE/Tasks/jetSubstructureOutput.cxx @@ -381,10 +381,10 @@ struct JetSubstructureOutputTask { } PROCESS_SWITCH(JetSubstructureOutputTask, processOutputSubstructureMatchingMC, "substructure matching output MC", false); - void processOutputMCD(soa::Join::iterator const& collision, aod::JetMcCollisions const&, + void processOutputMCD(soa::Join::iterator const& collision, soa::Join const& jets) { - analyseCharged(collision, jets, collisionOutputTableMCD, jetOutputTableMCD, jetSubstructureOutputTableMCD, splittingMatchesGeoVecVecMCD, splittingMatchesPtVecVecMCD, splittingMatchesHFVecVecMCD, pairMatchesVecVecMCD, jetMappingMCD, jetPtMinMCD, collision.mcCollision().weight()); + analyseCharged(collision, jets, collisionOutputTableMCD, jetOutputTableMCD, jetSubstructureOutputTableMCD, splittingMatchesGeoVecVecMCD, splittingMatchesPtVecVecMCD, splittingMatchesHFVecVecMCD, pairMatchesVecVecMCD, jetMappingMCD, jetPtMinMCD, collision.weight()); } PROCESS_SWITCH(JetSubstructureOutputTask, processOutputMCD, "jet substructure output MCD", false); From 1ad44c097a0413e71f7df563dedba4bd08b6fa46 Mon Sep 17 00:00:00 2001 From: Nicolas Strangmann <77485327+nstrangm@users.noreply.github.com> Date: Mon, 5 May 2025 18:31:57 +0200 Subject: [PATCH 1186/1650] [PWGEM/PhotonMeson] Changes to BC wise pi0 task (#11091) Co-authored-by: Nicolas Strangmann --- PWGEM/PhotonMeson/DataModel/bcWiseTables.h | 22 ++++++++++--------- .../TableProducer/bcWiseClusterSkimmer.cxx | 2 +- PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx | 15 ++++++++----- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/PWGEM/PhotonMeson/DataModel/bcWiseTables.h b/PWGEM/PhotonMeson/DataModel/bcWiseTables.h index 903dfefa23d..0a7e457d583 100644 --- a/PWGEM/PhotonMeson/DataModel/bcWiseTables.h +++ b/PWGEM/PhotonMeson/DataModel/bcWiseTables.h @@ -19,6 +19,8 @@ #ifndef PWGEM_PHOTONMESON_DATAMODEL_BCWISETABLES_H_ #define PWGEM_PHOTONMESON_DATAMODEL_BCWISETABLES_H_ +#include + #include "Framework/AnalysisDataModel.h" namespace o2::aod @@ -96,14 +98,14 @@ DECLARE_SOA_COLUMN(StoredM02, storedM02, int16_t); //! shower shape DECLARE_SOA_COLUMN(StoredTime, storedTime, int16_t); //! cluster time (10 ps resolution) DECLARE_SOA_COLUMN(StoredIsExotic, storedIsExotic, bool); //! flag to mark cluster as exotic -DECLARE_SOA_DYNAMIC_COLUMN(Definition, definition, [](int8_t storedDefinition) -> int8_t { return storedDefinition; }); //! cluster definition, see EMCALClusterDefinition.h -DECLARE_SOA_DYNAMIC_COLUMN(E, e, [](int16_t storedE) -> float { return storedE / emdownscaling::downscalingFactors[emdownscaling::kEnergy]; }); //! cluster energy (GeV) -DECLARE_SOA_DYNAMIC_COLUMN(Eta, eta, [](int16_t storedEta) -> float { return storedEta / emdownscaling::downscalingFactors[emdownscaling::kEta]; }); //! cluster pseudorapidity -DECLARE_SOA_DYNAMIC_COLUMN(Phi, phi, [](uint16_t storedPhi) -> float { return storedPhi / emdownscaling::downscalingFactors[emdownscaling::kPhi]; }); //! cluster azimuthal angle (0 to 2pi) -DECLARE_SOA_DYNAMIC_COLUMN(NCells, nCells, [](int16_t storedNCells) -> int16_t { return storedNCells; }); //! number of cells in cluster -DECLARE_SOA_DYNAMIC_COLUMN(M02, m02, [](int16_t storedM02) -> float { return storedM02 / emdownscaling::downscalingFactors[emdownscaling::kM02]; }); //! shower shape long axis -DECLARE_SOA_DYNAMIC_COLUMN(Time, time, [](int16_t storedTime) -> float { return storedTime / emdownscaling::downscalingFactors[emdownscaling::kTime]; }); //! cluster time (ns) -DECLARE_SOA_DYNAMIC_COLUMN(IsExotic, isExotic, [](bool storedIsExotic) -> bool { return storedIsExotic; }); //! flag to mark cluster as exotic +DECLARE_SOA_DYNAMIC_COLUMN(Definition, definition, [](int8_t storedDefinition) -> int8_t { return storedDefinition; }); //! cluster definition, see EMCALClusterDefinition.h +DECLARE_SOA_DYNAMIC_COLUMN(E, e, [](int16_t storedE) -> float { return storedE / emdownscaling::downscalingFactors[emdownscaling::kEnergy] + std::numeric_limits::epsilon(); }); //! cluster energy (GeV) +DECLARE_SOA_DYNAMIC_COLUMN(Eta, eta, [](int16_t storedEta) -> float { return storedEta / emdownscaling::downscalingFactors[emdownscaling::kEta] + std::numeric_limits::epsilon(); }); //! cluster pseudorapidity +DECLARE_SOA_DYNAMIC_COLUMN(Phi, phi, [](uint16_t storedPhi) -> float { return storedPhi / emdownscaling::downscalingFactors[emdownscaling::kPhi] + std::numeric_limits::epsilon(); }); //! cluster azimuthal angle (0 to 2pi) +DECLARE_SOA_DYNAMIC_COLUMN(NCells, nCells, [](int16_t storedNCells) -> int16_t { return storedNCells; }); //! number of cells in cluster +DECLARE_SOA_DYNAMIC_COLUMN(M02, m02, [](int16_t storedM02) -> float { return storedM02 / emdownscaling::downscalingFactors[emdownscaling::kM02] + std::numeric_limits::epsilon(); }); //! shower shape long axis +DECLARE_SOA_DYNAMIC_COLUMN(Time, time, [](int16_t storedTime) -> float { return storedTime / emdownscaling::downscalingFactors[emdownscaling::kTime] + std::numeric_limits::epsilon(); }); //! cluster time (ns) +DECLARE_SOA_DYNAMIC_COLUMN(IsExotic, isExotic, [](bool storedIsExotic) -> bool { return storedIsExotic; }); //! flag to mark cluster as exotic DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, [](float storedE, float storedEta) -> float { return storedE / emdownscaling::downscalingFactors[emdownscaling::kEnergy] / std::cosh(storedEta / emdownscaling::downscalingFactors[emdownscaling::kEta]); }); //! cluster pt, assuming m=0 (photons) } // namespace bcwisecluster @@ -120,7 +122,7 @@ DECLARE_SOA_COLUMN(IsAccepted, isAccepted, bool); //! Both decay photons are wit DECLARE_SOA_COLUMN(IsPrimary, isPrimary, bool); //! mcParticle.isPhysicalPrimary() || mcParticle.producedByGenerator() DECLARE_SOA_COLUMN(IsFromWD, isFromWD, bool); //! Pi0 from a weak decay according to pwgem::photonmeson::utils::mcutil::IsFromWD -DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, [](uint16_t storedpt) -> float { return storedpt / emdownscaling::downscalingFactors[emdownscaling::kpT]; }); //! pT of pi0 (GeV) +DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, [](uint16_t storedpt) -> float { return storedpt / emdownscaling::downscalingFactors[emdownscaling::kpT] + std::numeric_limits::epsilon(); }); //! pT of pi0 (GeV) } // namespace bcwisemcpi0s DECLARE_SOA_TABLE(BCWiseMCPi0s, "AOD", "BCWISEMCPI0", //! table of pi0s on MC level @@ -132,7 +134,7 @@ namespace bcwisemccluster DECLARE_SOA_COLUMN(Pi0ID, pi0ID, int32_t); //! Index of the mother pi0 (-1 if not from pi0) DECLARE_SOA_COLUMN(StoredTrueE, storedTrueE, uint16_t); //! energy of cluster inducing particle (1 MeV -> Maximum cluster energy of ~65 GeV) -DECLARE_SOA_DYNAMIC_COLUMN(TrueE, trueE, [](uint16_t storedTrueE) -> float { return storedTrueE / emdownscaling::downscalingFactors[emdownscaling::kEnergy]; }); //! energy of cluster inducing particle (GeV) +DECLARE_SOA_DYNAMIC_COLUMN(TrueE, trueE, [](uint16_t storedTrueE) -> float { return storedTrueE / emdownscaling::downscalingFactors[emdownscaling::kEnergy] + std::numeric_limits::epsilon(); }); //! energy of cluster inducing particle (GeV) } // namespace bcwisemccluster DECLARE_SOA_TABLE(BCWiseMCClusters, "AOD", "BCWISEMCCLS", //! table of MC information for clusters -> To be joined with the cluster table diff --git a/PWGEM/PhotonMeson/TableProducer/bcWiseClusterSkimmer.cxx b/PWGEM/PhotonMeson/TableProducer/bcWiseClusterSkimmer.cxx index da9ee8543dc..cc9cfaed1fb 100644 --- a/PWGEM/PhotonMeson/TableProducer/bcWiseClusterSkimmer.cxx +++ b/PWGEM/PhotonMeson/TableProducer/bcWiseClusterSkimmer.cxx @@ -107,7 +107,7 @@ struct bcWiseClusterSkimmer { template OutputType convertForStorage(InputType const& valueIn, Observables observable) { - double valueToBeChecked = valueIn * downscalingFactors[observable]; + double valueToBeChecked = std::round(valueIn * downscalingFactors[observable]); if (valueToBeChecked < std::numeric_limits::lowest()) { LOG(warning) << "Value " << valueToBeChecked << " of observable " << observable << " below lowest possible value of " << typeid(OutputType).name() << ": " << static_cast(std::numeric_limits::lowest()); valueToBeChecked = static_cast(std::numeric_limits::lowest()); diff --git a/PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx b/PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx index 2aa8bd44889..6b83440a51c 100644 --- a/PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx +++ b/PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx @@ -104,6 +104,7 @@ struct EmcalBcWisePi0 { mHistManager.add("Generated/pi0_AllBCs", "pT spectrum of generated pi0s in all BCs;#bf{#it{p}_{T} (GeV/#it{c})};#bf{#it{N}_{#pi^{0}}^{gen}}", HistType::kTH1F, {{200, 0, 20}}); mHistManager.add("Generated/pi0_TVX", "pT spectrum of generated pi0s in TVX triggered BCs;#bf{#it{p}_{T} (GeV/#it{c})};#bf{#it{N}_{#pi^{0}}^{gen}}", HistType::kTH1F, {{200, 0, 20}}); mHistManager.add("Generated/pi0_kTVXinEMC", "pT spectrum of generated pi0s in kTVXinEMC triggered BCs;#bf{#it{p}_{T} (GeV/#it{c})};#bf{#it{N}_{#pi^{0}}^{gen}}", HistType::kTH1F, {{200, 0, 20}}); + mHistManager.add("Accepted/pi0_kTVXinEMC", "pT spectrum of accepted pi0s in kTVXinEMC triggered BCs;#bf{#it{p}_{T} (GeV/#it{c})};#bf{#it{N}_{#pi^{0}}^{acc}}", HistType::kTH1F, {{200, 0, 20}}); } } @@ -273,11 +274,15 @@ struct EmcalBcWisePi0 { void fillGeneratedPi0Hists(const auto& mcPi0s, const auto& bc) { for (const auto& mcPi0 : mcPi0s) { - mHistManager.fill(HIST("Generated/pi0_AllBCs"), mcPi0.pt()); - if (bc.hasTVX()) - mHistManager.fill(HIST("Generated/pi0_TVX"), mcPi0.pt()); - if (bc.haskTVXinEMC()) - mHistManager.fill(HIST("Generated/pi0_kTVXinEMC"), mcPi0.pt()); + if (mcPi0.isPrimary()) { + mHistManager.fill(HIST("Generated/pi0_AllBCs"), mcPi0.pt()); + if (bc.hasTVX()) + mHistManager.fill(HIST("Generated/pi0_TVX"), mcPi0.pt()); + if (bc.haskTVXinEMC()) + mHistManager.fill(HIST("Generated/pi0_kTVXinEMC"), mcPi0.pt()); + if (mcPi0.isAccepted() && bc.haskTVXinEMC()) + mHistManager.fill(HIST("Accepted/pi0_kTVXinEMC"), mcPi0.pt()); + } } } From 5894ae012cdb9035a5fd75de925156f0af664342 Mon Sep 17 00:00:00 2001 From: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> Date: Mon, 5 May 2025 19:57:43 +0200 Subject: [PATCH 1187/1650] [PWGLF] Fix typo in mcV0info structure name (#11093) --- PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx index 5c9b77ff6d6..3a6796c490f 100644 --- a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx @@ -1601,7 +1601,7 @@ struct StrangenessBuilder { info.momentum[0], info.momentum[1], info.momentum[2]); histos.fill(HIST("hTableBuildingStatistics"), kV0MCCores); histos.fill(HIST("hPrimaryV0s"), 0); - if (thisInfo.isPhysicalPrimary) + if (info.isPhysicalPrimary) histos.fill(HIST("hPrimaryV0s"), 1); } if (mEnabledTables[kV0MCCollRefs]) { From 4ff22f2cdc55a80006edf9d00a2d1da10a9de53e Mon Sep 17 00:00:00 2001 From: Yash Patley <52608802+yashpatley@users.noreply.github.com> Date: Mon, 5 May 2025 23:40:58 +0530 Subject: [PATCH 1188/1650] [PWGCF] Update lambdaR2Correlation.cxx (#11092) --- .../Tasks/lambdaR2Correlation.cxx | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx index 8963e526e16..4006d8ed1fc 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx @@ -248,7 +248,7 @@ struct LambdaTableProducer { Configurable cMinV0CosPA{"cMinV0CosPA", 0.995, "Minimum V0 CosPA to PV"}; Configurable cKshortRejMassWindow{"cKshortRejMassWindow", 0.01, "Reject K0Short Candidates"}; Configurable cKshortRejFlag{"cKshortRejFlag", true, "K0short Mass Rej Flag"}; - Configurable cLambdaMassWindow{"cLambdaMassWindow", 0.005, "Lambda Mass Window"}; + // Configurable cLambdaMassWindow{"cLambdaMassWindow", 0.005, "Lambda Mass Window"}; // V0s kinmatic acceptance Configurable cMinV0Mass{"cMinV0Mass", 1.10, "V0 Mass Min"}; @@ -259,7 +259,6 @@ struct LambdaTableProducer { Configurable cDoEtaAnalysis{"cDoEtaAnalysis", false, "Do Eta Analysis"}; Configurable cV0TypeSelFlag{"cV0TypeSelFlag", false, "V0 Type Selection Flag"}; Configurable cV0TypeSelection{"cV0TypeSelection", 1, "V0 Type Selection"}; - Configurable cGenProcessFlag{"cGenProcessFlag", true, "Generater Level Table Selection"}; // V0s MC Configurable cHasMcFlag{"cHasMcFlag", true, "Has Mc Tag"}; @@ -972,7 +971,7 @@ struct LambdaTableProducer { // check for corresponding MCGen Particle if constexpr (dmc == kMC) { histos.fill(HIST("Tracks/h1f_tracks_info"), kTracksBeforeHasMcParticle); - if (!v0.has_mcParticle() || !v0.template posTrack_as().has_mcParticle() || !v0.template negTrack_as().has_mcParticle()) { + if (!v0.has_mcParticle()) { continue; } } @@ -1239,11 +1238,6 @@ struct LambdaTableProducer { auto mcCollision = collision.template mcCollision_as>(); auto mcGenParticles = mcParticles.sliceByCached(aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); - if (cGenProcessFlag) { - fillLambdaMcGenTables(mcCollision, mcGenParticles); - return; - } - // Fill Gen Table lambdaMCGenCollisionTable(mcCollision.centFT0M(), mcCollision.posX(), mcCollision.posY(), mcCollision.posZ()); @@ -1478,7 +1472,8 @@ struct LambdaR2Correlation { const AxisSpec axisPosZ(220, -11, 11, "V_{z} (cm)"); const AxisSpec axisCent(105, 0, 105, "FT0M (%)"); const AxisSpec axisMult(10, 0, 10, "N_{#Lambda}"); - const AxisSpec axisMass(100, 1.06, 1.16, "Inv Mass (GeV/#it{c}^{2})"); + const AxisSpec axisMass(100, 1.06, 1.16, "M_{#Lambda} (GeV/#it{c}^{2})"); + const AxisSpec axisMassCorr(60, -0.03, 0.03, "M_{#Lambda} - #frac{M_{pair}}{2} (GeV/#it{c}^{2})"); const AxisSpec axisPt(cNPtBins, cMinPt, cMaxPt, "p_{T} (GeV/#it{c})"); const AxisSpec axisEta(cNRapBins, cMinRap, cMaxRap, "#eta"); const AxisSpec axisRap(cNRapBins, cMinRap, cMaxRap, "y"); @@ -1542,6 +1537,14 @@ struct LambdaR2Correlation { histos.add("Reco/h2d_n2_phiphi_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisPhi, axisPhi}); histos.add("Reco/h2d_n2_phiphi_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisPhi, axisPhi}); + // rho2 for numerator of R2 as a function of M_{#Lambda} (To remove background from sidebands) {TESTING PHASE !!!!} + histos.add("Reco/h3d_n2_raprapmass_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH3D, {axisRap, axisRap, axisMassCorr}); + histos.add("Reco/h3d_n2_raprapmass_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH3D, {axisRap, axisRap, axisMassCorr}); + histos.add("Reco/h3d_n2_raprapmass_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH3D, {axisRap, axisRap, axisMassCorr}); + histos.add("Reco/h3d_n2_phiphimass_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH3D, {axisPhi, axisPhi, axisMassCorr}); + histos.add("Reco/h3d_n2_phiphimass_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH3D, {axisPhi, axisPhi, axisMassCorr}); + histos.add("Reco/h3d_n2_phiphimass_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH3D, {axisPhi, axisPhi, axisMassCorr}); + // rho2 for R2 Rap1Phi1Rap2Phi2 histos.add("Reco/h2d_n2_rapphi_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisRapPhi, axisRapPhi}); histos.add("Reco/h2d_n2_rapphi_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisRapPhi, axisRapPhi}); @@ -1576,12 +1579,18 @@ struct LambdaR2Correlation { float corfac = p1.corrFact() * p2.corrFact(); + float massParam = MassLambda0 - 0.5 * (p1.mass() + p2.mass()); + // fill rho2 histograms histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n2_ptpt_") + HIST(SubDirHist[part_pair]), p1.pt(), p2.pt(), corfac); histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n2_etaeta_") + HIST(SubDirHist[part_pair]), p1.eta(), p2.eta(), corfac); histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n2_raprap_") + HIST(SubDirHist[part_pair]), p1.rap(), p2.rap(), corfac); histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n2_phiphi_") + HIST(SubDirHist[part_pair]), p1.phi(), p2.phi(), corfac); + // fill rho2 3D-histograms with mass + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h3d_n2_raprapmass_") + HIST(SubDirHist[part_pair]), p1.rap(), p2.rap(), massParam, corfac); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h3d_n2_phiphimass_") + HIST(SubDirHist[part_pair]), p1.phi(), p2.phi(), massParam, corfac); + if (rapbin1 >= 0 && rapbin2 >= 0 && phibin1 >= 0 && phibin2 >= 0 && rapbin1 < nrapbins && rapbin2 < nrapbins && phibin1 < nphibins && phibin2 < nphibins) { int rapphix = rapbin1 * nphibins + phibin1; From bce3e4be227432d91c3aad93766ff35ce15bf2d1 Mon Sep 17 00:00:00 2001 From: hernasab Date: Mon, 5 May 2025 16:45:27 -0500 Subject: [PATCH 1189/1650] [PWGCF] remove obsolete histogram (#11094) Co-authored-by: Sabrina Hernandez --- PWGCF/Flow/Tasks/flowZdcTask.cxx | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowZdcTask.cxx b/PWGCF/Flow/Tasks/flowZdcTask.cxx index 8cd9c24e0f3..24d839b048d 100644 --- a/PWGCF/Flow/Tasks/flowZdcTask.cxx +++ b/PWGCF/Flow/Tasks/flowZdcTask.cxx @@ -290,7 +290,6 @@ struct FlowZdcTask { histos.add("hZPvsFT0CAmp", "ZP Energy vs FT0C Amplitude", kTH2F, {axisFT0CAmp, axisZP}); histos.add("hZNvsMult", "ZN Energy vs Multiplicity", kTH2F, {axisMultiplicity, axisZN}); histos.add("hZPvsMult", "ZP Energy vs Multiplicity", kTH2F, {axisMultiplicity, axisZP}); - histos.add("debunch", ";t_{ZDC}-t_{ZDA};t_{ZDC}+t_{ZDA}", kTH2F, {{{nBinsTDC, minTdc, maxTdc}, {nBinsTDC, minTdc, maxTdc}}}); } if (doprocessQA) { @@ -622,12 +621,6 @@ struct FlowZdcTask { int nTot = tracks.size(); double ft0aAmp = 0; double ft0cAmp = 0; - float tZNA{0.0}; - float tZNC{0.0}; - float tZPA{0.0}; - float tZPC{0.0}; - float tZDCdif{0.0}; - float tZDCsum{0.0}; const auto& foundBC = collision.foundBC_as(); if (collision.has_foundFT0()) { auto ft0 = collision.foundFT0(); @@ -654,12 +647,6 @@ struct FlowZdcTask { histos.get(HIST("ZEM1coll"))->Fill(zdcread.amplitudeZEM1()); histos.get(HIST("ZEM2coll"))->Fill(zdcread.amplitudeZEM2()); - tZNA = foundBC.zdc().timeZNA(); - tZNC = foundBC.zdc().timeZNC(); - tZPA = foundBC.zdc().timeZPA(); - tZPC = foundBC.zdc().timeZPC(); - tZDCdif = tZNC + tZPC - tZNA - tZPA; - tZDCsum = tZNC + tZPC + tZNA + tZPA; float sumZNC = (zdcread.energySectorZNC())[0] + (zdcread.energySectorZNC())[1] + (zdcread.energySectorZNC())[2] + (zdcread.energySectorZNC())[3]; float sumZNA = (zdcread.energySectorZNA())[0] + (zdcread.energySectorZNA())[1] + (zdcread.energySectorZNA())[2] + (zdcread.energySectorZNA())[3]; @@ -693,7 +680,6 @@ struct FlowZdcTask { histos.fill(HIST("hZPvsFT0CAmp"), ft0cAmp, sumZP); histos.fill(HIST("hZNvsMult"), nTot, sumZN); histos.fill(HIST("hZPvsMult"), nTot, sumZP); - histos.fill(HIST("debunch"), tZDCdif, tZDCsum); histos.fill(HIST("hNchvsNPV"), collision.multNTracksPVeta1(), nTot); float ratioZN = sumZNC / sumZNA; From 3c9f54aa5827b8041f2f4a48cda937f99d055801 Mon Sep 17 00:00:00 2001 From: omvazque Date: Mon, 5 May 2025 17:34:56 -0500 Subject: [PATCH 1190/1650] [PWGLF] Update on CCDB access (#11095) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 22 ++++++++------------ 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index f93284b0a16..d8d0b75ae09 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -155,9 +155,8 @@ struct UccZdc { Service ccdb; Configurable paTH{"paTH", "Users/o/omvazque/TrackingEfficiency", "base path to the ccdb object"}; - Configurable uRl{"uRl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; // Configurable noLaterThan{"noLaterThan", 1740173636328, "latest acceptable timestamp of creation for the object"}; - Configurable noLaterThan{"noLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; + // Configurable noLaterThan{"noLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; // the efficiency has been previously stored in the CCDB as TH1F histogram TH1F* efficiency = nullptr; @@ -308,18 +307,15 @@ struct UccZdc { registry.add("ZNDifVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA-ZNC;", kTH2F, {{{nBinsNch, minNch, maxNch}, {100, -50., 50.}}}); } - ccdb->setURL(uRl.value); + ccdb->setURL("http://alice-ccdb.cern.ch"); // Enabling object caching, otherwise each call goes to the CCDB server ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); // Not later than now, will be replaced by the value of the train creation // This avoids that users can replace objects **while** a train is running - ccdb->setCreatedNotAfter(noLaterThan.value); - LOGF(info, "Getting object %s", paTH.value.data()); - // efficiency = ccdb->getForTimeStamp(paTH.value, noLaterThan); - // if (!efficiency) { - // LOGF(fatal, "Efficiency object not found!"); - // } + int64_t now = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); + ccdb->setCreatedNotAfter(now); + // ccdb->setCreatedNotAfter(noLaterThan.value); } template @@ -565,8 +561,8 @@ struct UccZdc { const auto& foundBC = collision.foundBC_as(); // LOGF(info, "Getting object %s for run number %i from timestamp=%llu", paTH.value.data(), foundBC.runNumber(), foundBC.timestamp()); - // auto efficiency = ccdb->getForTimeStamp(paTH.value, foundBC.timestamp()); - auto efficiency = ccdb->getForRun(paTH.value, foundBC.runNumber()); + auto efficiency = ccdb->getForTimeStamp(paTH.value, foundBC.timestamp()); + // auto efficiency = ccdb->getForRun(paTH.value, foundBC.runNumber()); if (!efficiency) { LOGF(fatal, "Efficiency object not found!"); } @@ -704,8 +700,8 @@ struct UccZdc { // To use run-by-run efficiency const auto& foundBC = collision.foundBC_as(); - // auto efficiency = ccdb->getForTimeStamp(paTH.value, foundBC.timestamp()); - auto efficiency = ccdb->getForRun(paTH.value, foundBC.runNumber()); + auto efficiency = ccdb->getForTimeStamp(paTH.value, foundBC.timestamp()); + // auto efficiency = ccdb->getForRun(paTH.value, foundBC.runNumber()); if (!efficiency) { LOGF(fatal, "Efficiency object not found!"); } From a41e1507b8426e63c7464afaf81c8ae4122faf6a Mon Sep 17 00:00:00 2001 From: Francesco Mazzaschi <43742195+fmazzasc@users.noreply.github.com> Date: Tue, 6 May 2025 05:04:57 +0200 Subject: [PATCH 1191/1650] [Infrastructure] Update LF codeowners (#11083) Co-authored-by: Francesco Mazzaschi --- CODEOWNERS | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index b8f27eef641..82da305e2ea 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -40,19 +40,19 @@ /PWGEM/PhotonMeson @alibuild @mikesas @rbailhac @m-c-danisch @novitzky @mhemmer-cern @dsekihat /PWGHF @alibuild @vkucera @fcolamar @fgrosa @fcatalan92 @mfaggin @mmazzilli @deepathoms @NicoleBastid @hahassan7 @jpxrk @apalasciano @zhangbiao-phy # PWG-LF -/PWGLF @alibuild @njacazio @skundu692 -/PWGLF/Tasks/GlobalEventProperties @alibuild @njacazio @skundu692 @gbencedi @abmodak -/PWGLF/TableProducer/GlobalEventProperties @alibuild @njacazio @skundu692 @gbencedi @abmodak -/PWGLF/Tasks/Nuspex @alibuild @njacazio @skundu692 @fmazzasc @chiarapinto @maciacco -/PWGLF/TableProducer/Nuspex @alibuild @njacazio @skundu692 @fmazzasc @chiarapinto @maciacco -/PWGLF/Tasks/Resonances @alibuild @njacazio @skundu692 @dmallick2 @smaff92 -/PWGLF/TableProducer/Resonances @alibuild @njacazio @skundu692 @dmallick2 @smaff92 -/PWGLF/Tasks/Strangeness @alibuild @njacazio @skundu692 @ercolessi @romainschotter -/PWGLF/TableProducer/Strangeness @alibuild @njacazio @skundu692 @ercolessi @romainschotter +/PWGLF @alibuild @sustripathy @skundu692 +/PWGLF/Tasks/GlobalEventProperties @alibuild @sustripathy @skundu692 @gbencedi @abmodak +/PWGLF/TableProducer/GlobalEventProperties @alibuild @sustripathy @skundu692 @gbencedi @abmodak +/PWGLF/Tasks/Nuspex @alibuild @sustripathy @skundu692 @fmazzasc @chiarapinto @maciacco +/PWGLF/TableProducer/Nuspex @alibuild @sustripathy @skundu692 @fmazzasc @chiarapinto @maciacco +/PWGLF/Tasks/Resonances @alibuild @sustripathy @skundu692 @dmallick2 @smaff92 +/PWGLF/TableProducer/Resonances @alibuild @sustripathy @skundu692 @dmallick2 @smaff92 +/PWGLF/Tasks/Strangeness @alibuild @sustripathy @skundu692 @ercolessi @romainschotter +/PWGLF/TableProducer/Strangeness @alibuild @sustripathy @skundu692 @ercolessi @romainschotter # PWG-MM -/PWGMM @alibuild @njacazio @skundu692 @aalkin -/PWGMM/Mult @alibuild @njacazio @skundu692 @aalkin @aortizve @ddobrigk @gbencedi +/PWGMM @alibuild @sustripathy @skundu692 @aalkin +/PWGMM/Mult @alibuild @sustripathy @skundu692 @aalkin @aortizve @ddobrigk @gbencedi /PWGMM/Lumi @alibuild @aalkin /PWGMM/UE @alibuild @aalkin @aortizve From 8a8eae4cbfbabeb07eb6382904eec2fd2d5924b8 Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Tue, 6 May 2025 14:18:59 +0800 Subject: [PATCH 1192/1650] [PWGCF] TwoParticleCorrelations - Add dihadron correlations (#11074) --- .../Tasks/CMakeLists.txt | 5 + .../Tasks/diHadronCor.cxx | 385 ++++++++++++++++++ 2 files changed, 390 insertions(+) create mode 100644 PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx diff --git a/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt b/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt index 653d6173930..de8948f260d 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt +++ b/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt @@ -58,6 +58,11 @@ o2physics_add_dpl_workflow(neutron-proton-corr-zdc PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(di-hadron-cor + SOURCES diHadronCor.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore + COMPONENT_NAME Analysis) + diff --git a/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx b/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx new file mode 100644 index 00000000000..186ae77640a --- /dev/null +++ b/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx @@ -0,0 +1,385 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file diHadronCor.cxx +/// \brief di-hadron correlation for O-O, Pb-Pb collisions +/// \author Zhiyong Lu (zhiyong.lu@cern.ch) +/// \since May/03/2025 + +#include +#include "TRandom3.h" +#include +#include + +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/StepTHn.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/RunningWorkflowInfo.h" +#include "CommonConstants/MathConstants.h" +#include "Common/Core/RecoDecay.h" + +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/Centrality.h" +#include "PWGCF/DataModel/CorrelationsDerived.h" +#include "Common/DataModel/CollisionAssociationTables.h" +#include "PWGCF/Core/CorrelationContainer.h" +#include "PWGCF/Core/PairCuts.h" +#include "DataFormatsParameters/GRPObject.h" +#include "DataFormatsParameters/GRPMagField.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +namespace o2::aod +{ +namespace di_hadron_cor +{ +DECLARE_SOA_COLUMN(Multiplicity, multiplicity, int); +} +DECLARE_SOA_TABLE(Multiplicity, "AOD", "MULTIPLICITY", + di_hadron_cor::Multiplicity); + +} // namespace o2::aod + +// define the filtered collisions and tracks +#define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable NAME{#NAME, DEFAULT, HELP}; + +struct DiHadronCor { + Service ccdb; + + O2_DEFINE_CONFIGURABLE(cfgCutVtxZ, float, 10.0f, "Accepted z-vertex range") + O2_DEFINE_CONFIGURABLE(cfgCutPtMin, float, 0.2f, "minimum accepted track pT") + O2_DEFINE_CONFIGURABLE(cfgCutPtMax, float, 10.0f, "maximum accepted track pT") + O2_DEFINE_CONFIGURABLE(cfgCutEta, float, 0.8f, "Eta cut") + O2_DEFINE_CONFIGURABLE(cfgCutMerging, float, 0.0, "Merging cut on track merge") + O2_DEFINE_CONFIGURABLE(cfgSelCollByNch, bool, true, "Select collisions by Nch or centrality") + O2_DEFINE_CONFIGURABLE(cfgCutMultMin, int, 0, "Minimum multiplicity for collision") + O2_DEFINE_CONFIGURABLE(cfgCutMultMax, int, 10, "Maximum multiplicity for collision") + O2_DEFINE_CONFIGURABLE(cfgCutCentMin, float, 60.0f, "Minimum centrality for collision") + O2_DEFINE_CONFIGURABLE(cfgCutCentMax, float, 80.0f, "Maximum centrality for collision") + O2_DEFINE_CONFIGURABLE(cfgMixEventNumMin, int, 5, "Minimum number of events to mix") + O2_DEFINE_CONFIGURABLE(cfgRadiusLow, float, 0.8, "Low radius for merging cut") + O2_DEFINE_CONFIGURABLE(cfgRadiusHigh, float, 2.5, "High radius for merging cut") + O2_DEFINE_CONFIGURABLE(cfgSampleSize, double, 10, "Sample size for mixed event") + O2_DEFINE_CONFIGURABLE(cfgCentEstimator, int, 0, "0:FT0C; 1:FT0CVariant1; 2:FT0M; 3:FT0A") + O2_DEFINE_CONFIGURABLE(cfgCentFT0CMin, float, 0.0f, "Minimum centrality (FT0C) to cut events in filter") + O2_DEFINE_CONFIGURABLE(cfgCentFT0CMax, float, 100.0f, "Maximum centrality (FT0C) to cut events in filter") + + SliceCache cache; + SliceCache cacheNch; + + ConfigurableAxis axisVertex{"axisVertex", {10, -10, 10}, "vertex axis for histograms"}; + ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100}, "multiplicity axis for histograms"}; + ConfigurableAxis axisCentrality{"axisCentrality", {VARIABLE_WIDTH, 0, 10, 20, 30, 40, 50, 60, 70, 80, 90}, "centrality axis for histograms"}; + ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt axis for histograms"}; + ConfigurableAxis axisDeltaPhi{"axisDeltaPhi", {72, -PIHalf, PIHalf * 3}, "delta phi axis for histograms"}; + ConfigurableAxis axisDeltaEta{"axisDeltaEta", {48, -2.4, 2.4}, "delta eta axis for histograms"}; + ConfigurableAxis axisPtTrigger{"axisPtTrigger", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt trigger axis for histograms"}; + ConfigurableAxis axisPtAssoc{"axisPtAssoc", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt associated axis for histograms"}; + ConfigurableAxis axisVtxMix{"axisVtxMix", {VARIABLE_WIDTH, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "vertex axis for mixed event histograms"}; + ConfigurableAxis axisMultMix{"axisMultMix", {VARIABLE_WIDTH, 0, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100}, "multiplicity / centrality axis for mixed event histograms"}; + ConfigurableAxis axisSample{"axisSample", {cfgSampleSize, 0, cfgSampleSize}, "sample axis for histograms"}; + + ConfigurableAxis axisVertexEfficiency{"axisVertexEfficiency", {10, -10, 10}, "vertex axis for efficiency histograms"}; + ConfigurableAxis axisEtaEfficiency{"axisEtaEfficiency", {20, -1.0, 1.0}, "eta axis for efficiency histograms"}; + ConfigurableAxis axisPtEfficiency{"axisPtEfficiency", {VARIABLE_WIDTH, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0}, "pt axis for efficiency histograms"}; + + // make the filters and cuts. + Filter collisionFilter = (nabs(aod::collision::posZ) < cfgCutVtxZ) && (aod::evsel::sel8) == true && (aod::cent::centFT0C > cfgCentFT0CMin) && (aod::cent::centFT0C < cfgCentFT0CMax); + Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)); + + // Define the outputs + OutputObj same{"sameEvent"}; + OutputObj mixed{"mixedEvent"}; + HistogramRegistry registry{"registry"}; + + // define global variables + TRandom3* gRandom = new TRandom3(); + enum CentEstimators { + kCentFT0C = 0, + kCentFT0CVariant1, + kCentFT0M, + kCentFV0A, + // Count the total number of enum + kCount_CentEstimators + }; + enum EventType { + SameEvent = 1, + MixedEvent = 3 + }; + + using AodCollisions = soa::Filtered>; // aod::CentFT0Cs + using AodTracks = soa::Filtered>; + + void init(InitContext&) + { + const AxisSpec axisPhi{72, 0.0, constants::math::TwoPI, "#varphi"}; + const AxisSpec axisEta{40, -1., 1., "#eta"}; + + ccdb->setURL("http://alice-ccdb.cern.ch"); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + + auto now = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); + ccdb->setCreatedNotAfter(now); + + LOGF(info, "Starting init"); + + // Make histograms to check the distributions after cuts + registry.add("deltaEta_deltaPhi_same", "", {HistType::kTH2D, {axisDeltaPhi, axisDeltaEta}}); // check to see the delta eta and delta phi distribution + registry.add("deltaEta_deltaPhi_mixed", "", {HistType::kTH2D, {axisDeltaPhi, axisDeltaEta}}); + registry.add("Phi", "Phi", {HistType::kTH1D, {axisPhi}}); + registry.add("Eta", "Eta", {HistType::kTH1D, {axisEta}}); + registry.add("pT", "pT", {HistType::kTH1D, {axisPtTrigger}}); + registry.add("Nch", "N_{ch}", {HistType::kTH1D, {axisMultiplicity}}); + registry.add("Nch_used", "N_{ch}", {HistType::kTH1D, {axisMultiplicity}}); // histogram to see how many events are in the same and mixed event + std::string hCentTitle = "Centrality distribution, Estimator " + std::to_string(cfgCentEstimator); + registry.add("Centrality", hCentTitle.c_str(), {HistType::kTH1D, {axisCentrality}}); + registry.add("Centrality_used", hCentTitle.c_str(), {HistType::kTH1D, {axisCentrality}}); // histogram to see how many events are in the same and mixed event + registry.add("zVtx", "zVtx", {HistType::kTH1D, {axisVertex}}); + + registry.add("Trig_hist", "", {HistType::kTHnSparseF, {{axisSample, axisVertex, axisPtTrigger}}}); + + registry.add("eventcount", "bin", {HistType::kTH1F, {{4, 0, 4, "bin"}}}); // histogram to see how many events are in the same and mixed event + + std::vector corrAxis = {{axisSample, "Sample"}, + {axisVertex, "z-vtx (cm)"}, + {axisPtTrigger, "p_{T} (GeV/c)"}, + {axisPtAssoc, "p_{T} (GeV/c)"}, + {axisDeltaPhi, "#Delta#varphi (rad)"}, + {axisDeltaEta, "#Delta#eta"}}; + std::vector effAxis = { + {axisVertexEfficiency, "z-vtx (cm)"}, + {axisPtEfficiency, "p_{T} (GeV/c)"}, + {axisEtaEfficiency, "#eta"}, + }; + std::vector userAxis; + + same.setObject(new CorrelationContainer("sameEvent", "sameEvent", corrAxis, effAxis, userAxis)); + mixed.setObject(new CorrelationContainer("mixedEvent", "mixedEvent", corrAxis, effAxis, userAxis)); + } + + int getMagneticField(uint64_t timestamp) + { + // Get the magnetic field + static o2::parameters::GRPMagField* grpo = nullptr; + if (grpo == nullptr) { + grpo = ccdb->getForTimeStamp("/GLO/Config/GRPMagField", timestamp); + if (grpo == nullptr) { + LOGF(fatal, "GRP object not found for timestamp %llu", timestamp); + return 0; + } + LOGF(info, "Retrieved GRP for timestamp %llu with magnetic field of %d kG", timestamp, grpo->getNominalL3Field()); + } + return grpo->getNominalL3Field(); + } + + template + float getCentrality(TCollision const& collision) + { + float cent; + switch (cfgCentEstimator) { + case kCentFT0C: + cent = collision.centFT0C(); + break; + case kCentFT0CVariant1: + cent = collision.centFT0CVariant1(); + break; + case kCentFT0M: + cent = collision.centFT0M(); + break; + case kCentFV0A: + cent = collision.centFV0A(); + break; + default: + cent = collision.centFT0C(); + } + return cent; + } + + // fill multiple histograms + template + void fillYield(TCollision collision, TTracks tracks) // function to fill the yield and etaphi histograms. + { + float cent = getCentrality(collision); + registry.fill(HIST("Centrality"), cent); + + registry.fill(HIST("Nch"), tracks.size()); + registry.fill(HIST("zVtx"), collision.posZ()); + + for (auto const& track1 : tracks) { + registry.fill(HIST("Phi"), RecoDecay::constrainAngle(track1.phi(), 0.0)); + registry.fill(HIST("Eta"), track1.eta()); + registry.fill(HIST("pT"), track1.pt()); + } + } + + template + float getDPhiStar(TTrack const& track1, TTrackAssoc const& track2, float radius, int magField) + { + float charge1 = track1.sign(); + float charge2 = track2.sign(); + + float phi1 = track1.phi(); + float phi2 = track2.phi(); + + float pt1 = track1.pt(); + float pt2 = track2.pt(); + + int fbSign = (magField > 0) ? 1 : -1; + + float dPhiStar = phi1 - phi2 - charge1 * fbSign * std::asin(0.075 * radius / pt1) + charge2 * fbSign * std::asin(0.075 * radius / pt2); + + if (dPhiStar > constants::math::PI) + dPhiStar = constants::math::TwoPI - dPhiStar; + if (dPhiStar < -constants::math::PI) + dPhiStar = -constants::math::TwoPI - dPhiStar; + + return dPhiStar; + } + + // + template + void fillCorrelations(TTracks tracks1, TTracksAssoc tracks2, float posZ, int system, int magneticField, float cent) // function to fill the Output functions (sparse) and the delta eta and delta phi histograms + { + + if (system == SameEvent) { + registry.fill(HIST("Centrality_used"), cent); + registry.fill(HIST("Nch_used"), tracks1.size()); + } + + int fSampleIndex = gRandom->Uniform(0, cfgSampleSize); + + // loop over all tracks + for (auto const& track1 : tracks1) { + + if (system == SameEvent) { + registry.fill(HIST("Trig_hist"), fSampleIndex, posZ, track1.pt()); + } + + for (auto const& track2 : tracks2) { + + if (track1.pt() <= track2.pt()) + continue; // skip if the trigger pt is less than the associate pt + + float deltaPhi = RecoDecay::constrainAngle(track1.phi() - track2.phi(), -PIHalf); + float deltaEta = track1.eta() - track2.eta(); + + if (std::abs(deltaEta) < cfgCutMerging) { + + double dPhiStarHigh = getDPhiStar(track1, track2, cfgRadiusHigh, magneticField); + double dPhiStarLow = getDPhiStar(track1, track2, cfgRadiusLow, magneticField); + + const double kLimit = 3.0 * cfgCutMerging; + + bool bIsBelow = false; + + if (std::abs(dPhiStarLow) < kLimit || std::abs(dPhiStarHigh) < kLimit || dPhiStarLow * dPhiStarHigh < 0) { + for (double rad(cfgRadiusLow); rad < cfgRadiusHigh; rad += 0.01) { + double dPhiStar = getDPhiStar(track1, track2, rad, magneticField); + if (std::abs(dPhiStar) < kLimit) { + bIsBelow = true; + break; + } + } + if (bIsBelow) + continue; + } + } + + // fill the right sparse and histograms + if (system == SameEvent) { + + same->getPairHist()->Fill(step, fSampleIndex, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta); + registry.fill(HIST("deltaEta_deltaPhi_same"), deltaPhi, deltaEta); + } else if (system == MixedEvent) { + + mixed->getPairHist()->Fill(step, fSampleIndex, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta); + registry.fill(HIST("deltaEta_deltaPhi_mixed"), deltaPhi, deltaEta); + } + } + } + } + + void processSame(AodCollisions::iterator const& collision, AodTracks const& tracks, aod::BCsWithTimestamps const&) + { + + auto bc = collision.bc_as(); + + registry.fill(HIST("eventcount"), SameEvent); // because its same event i put it in the 1 bin + + fillYield(collision, tracks); + float cent = getCentrality(collision); + + if (cfgSelCollByNch && (tracks.size() < cfgCutMultMin || tracks.size() >= cfgCutMultMax)) { + return; + } + if (!cfgSelCollByNch && (cent < cfgCutCentMin || cent >= cfgCutCentMax)) { + return; + } + + fillCorrelations(tracks, tracks, collision.posZ(), SameEvent, getMagneticField(bc.timestamp()), cent); + } + PROCESS_SWITCH(DiHadronCor, processSame, "Process same event", true); + + // the process for filling the mixed events + void processMixed(AodCollisions const& collisions, AodTracks const& tracks, aod::BCsWithTimestamps const&) + { + + auto getTracksSize = [&tracks, this](AodCollisions::iterator const& collision) { + auto associatedTracks = tracks.sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), this->cache); + auto mult = associatedTracks.size(); + return mult; + }; + + using MixedBinning = FlexibleBinningPolicy, aod::collision::PosZ, decltype(getTracksSize)>; + + MixedBinning binningOnVtxAndMult{{getTracksSize}, {axisVtxMix, axisMultMix}, true}; + + auto tracksTuple = std::make_tuple(tracks, tracks); + Pair pair{binningOnVtxAndMult, cfgMixEventNumMin, -1, collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip + for (auto const& [collision1, tracks1, collision2, tracks2] : pair) { + registry.fill(HIST("eventcount"), MixedEvent); // fill the mixed event in the 3 bin + auto bc = collision1.bc_as(); + + if (cfgSelCollByNch && (tracks1.size() < cfgCutMultMin || tracks1.size() >= cfgCutMultMax)) + continue; + + if (cfgSelCollByNch && (tracks2.size() < cfgCutMultMin || tracks2.size() >= cfgCutMultMax)) + continue; + + float cent1 = getCentrality(collision1); + float cent2 = getCentrality(collision2); + + if (!cfgSelCollByNch && (cent1 < cfgCutCentMin || cent1 >= cfgCutCentMax)) + continue; + + if (!cfgSelCollByNch && (cent2 < cfgCutCentMin || cent2 >= cfgCutCentMax)) + continue; + + fillCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent, getMagneticField(bc.timestamp()), cent1); + } + } + + PROCESS_SWITCH(DiHadronCor, processMixed, "Process mixed events", true); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc), + }; +} From c0eec405de6388941933f775fe668edb2b075da2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Tue, 6 May 2025 08:38:08 +0200 Subject: [PATCH 1193/1650] [Common] Remove PWGDQCore dependence in Common (#11066) Co-authored-by: ALICE Builder --- Common/TableProducer/CMakeLists.txt | 4 +- .../TableProducer/match-mft-mch-data-mc.cxx | 39 +++---------------- Common/TableProducer/match-mft-mch-data.cxx | 38 +++--------------- 3 files changed, 12 insertions(+), 69 deletions(-) diff --git a/Common/TableProducer/CMakeLists.txt b/Common/TableProducer/CMakeLists.txt index 27a5c14ceca..942b892bd56 100644 --- a/Common/TableProducer/CMakeLists.txt +++ b/Common/TableProducer/CMakeLists.txt @@ -132,7 +132,7 @@ o2physics_add_dpl_workflow(ese-table-producer o2physics_add_dpl_workflow(mftmch-matching-data SOURCES match-mft-mch-data.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase O2Physics::AnalysisCCDB O2Physics::PWGDQCore O2Physics::EventFilteringUtils + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::GlobalTracking COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(occ-table-producer @@ -142,7 +142,7 @@ o2physics_add_dpl_workflow(occ-table-producer o2physics_add_dpl_workflow(mftmch-matching-data-mc SOURCES match-mft-mch-data-mc.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase O2Physics::AnalysisCCDB O2Physics::PWGDQCore O2Physics::EventFilteringUtils + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::GlobalTracking COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(muon-realignment diff --git a/Common/TableProducer/match-mft-mch-data-mc.cxx b/Common/TableProducer/match-mft-mch-data-mc.cxx index 4a03582489d..11d59611772 100644 --- a/Common/TableProducer/match-mft-mch-data-mc.cxx +++ b/Common/TableProducer/match-mft-mch-data-mc.cxx @@ -15,50 +15,21 @@ #include #include "CCDB/BasicCCDBManager.h" -#include "Common/DataModel/Multiplicity.h" -#include "Common/DataModel/EventSelection.h" -#include "Common/DataModel/Centrality.h" -#include "Common/CCDB/TriggerAliases.h" -#include "Common/DataModel/PIDResponse.h" -#include "Common/DataModel/TrackSelectionTables.h" -#include "Common/DataModel/MftmchMatchingML.h" +#include "Common/DataModel/MatchMFTFT0.h" #include "Common/DataModel/MatchMFTMuonData.h" -#include "Common/Core/trackUtilities.h" -#include "PWGDQ/DataModel/ReducedInfoTables.h" -#include "PWGDQ/Core/VarManager.h" -#include "PWGDQ/Core/HistogramManager.h" -#include "PWGDQ/Core/AnalysisCut.h" -#include "PWGDQ/Core/AnalysisCompositeCut.h" -#include "PWGDQ/Core/HistogramsLibrary.h" -#include "PWGDQ/Core/CutsLibrary.h" -#include "DataFormatsGlobalTracking/RecoContainerCreateTracksVariadic.h" -#include "DetectorsVertexing/VertexTrackMatcher.h" -#include "ReconstructionDataFormats/PrimaryVertex.h" -#include "ReconstructionDataFormats/VtxTrackIndex.h" -#include "ReconstructionDataFormats/VtxTrackRef.h" -#include "DataFormatsITSMFT/ROFRecord.h" -#include "CommonDataFormat/InteractionRecord.h" -#include "DetectorsVertexing/PVertexerParams.h" -#include "MathUtils/Primitive2D.h" #include "DataFormatsGlobalTracking/RecoContainer.h" #include "Common/DataModel/CollisionAssociationTables.h" -#include "Common/DataModel/MatchMFTFT0.h" #include "DataFormatsParameters/GRPMagField.h" -#include "DataFormatsParameters/GRPObject.h" #include "Field/MagneticField.h" #include "TGeoGlobalMagField.h" #include "DetectorsBase/Propagator.h" #include "DetectorsBase/GeometryManager.h" -#include "EventFiltering/Zorro.h" -#include "ReconstructionDataFormats/TrackFwd.h" -#include "Math/MatrixFunctions.h" -#include "Math/SMatrix.h" -#include "MFTTracking/Tracker.h" -#include "MCHTracking/TrackParam.h" #include "MCHTracking/TrackExtrap.h" #include "GlobalTracking/MatchGlobalFwd.h" -#include -#include +#include "Math/SMatrix.h" +#include "Math/SVector.h" +#include "TLorentzVector.h" +#include "TVector2.h" #include "TDatabasePDG.h" using namespace std; diff --git a/Common/TableProducer/match-mft-mch-data.cxx b/Common/TableProducer/match-mft-mch-data.cxx index 01139da21ba..96471ddefab 100644 --- a/Common/TableProducer/match-mft-mch-data.cxx +++ b/Common/TableProducer/match-mft-mch-data.cxx @@ -15,49 +15,21 @@ #include #include "CCDB/BasicCCDBManager.h" -#include "Common/DataModel/Multiplicity.h" -#include "Common/DataModel/EventSelection.h" -#include "Common/DataModel/Centrality.h" -#include "Common/CCDB/TriggerAliases.h" -#include "Common/DataModel/TrackSelectionTables.h" -#include "Common/DataModel/MftmchMatchingML.h" +#include "Common/DataModel/MatchMFTFT0.h" #include "Common/DataModel/MatchMFTMuonData.h" -#include "Common/Core/trackUtilities.h" -#include "PWGDQ/DataModel/ReducedInfoTables.h" -#include "PWGDQ/Core/VarManager.h" -#include "PWGDQ/Core/HistogramManager.h" -#include "PWGDQ/Core/AnalysisCut.h" -#include "PWGDQ/Core/AnalysisCompositeCut.h" -#include "PWGDQ/Core/HistogramsLibrary.h" -#include "PWGDQ/Core/CutsLibrary.h" -#include "DataFormatsGlobalTracking/RecoContainerCreateTracksVariadic.h" -#include "DetectorsVertexing/VertexTrackMatcher.h" -#include "ReconstructionDataFormats/PrimaryVertex.h" -#include "ReconstructionDataFormats/VtxTrackIndex.h" -#include "ReconstructionDataFormats/VtxTrackRef.h" -#include "DataFormatsITSMFT/ROFRecord.h" -#include "CommonDataFormat/InteractionRecord.h" -#include "DetectorsVertexing/PVertexerParams.h" -#include "MathUtils/Primitive2D.h" #include "DataFormatsGlobalTracking/RecoContainer.h" #include "Common/DataModel/CollisionAssociationTables.h" -#include "Common/DataModel/MatchMFTFT0.h" #include "DataFormatsParameters/GRPMagField.h" -#include "DataFormatsParameters/GRPObject.h" #include "Field/MagneticField.h" #include "TGeoGlobalMagField.h" #include "DetectorsBase/Propagator.h" #include "DetectorsBase/GeometryManager.h" -#include "EventFiltering/Zorro.h" -#include "ReconstructionDataFormats/TrackFwd.h" -#include "Math/MatrixFunctions.h" -#include "Math/SMatrix.h" -#include "MFTTracking/Tracker.h" -#include "MCHTracking/TrackParam.h" #include "MCHTracking/TrackExtrap.h" #include "GlobalTracking/MatchGlobalFwd.h" -#include -#include +#include "Math/SMatrix.h" +#include "Math/SVector.h" +#include "TLorentzVector.h" +#include "TVector2.h" #include "TDatabasePDG.h" using namespace std; From db20478b8c5c55f6f45d5db9d686afa2adc8dd33 Mon Sep 17 00:00:00 2001 From: Mattia Faggin Date: Tue, 6 May 2025 08:44:51 +0200 Subject: [PATCH 1194/1650] [DPG] Add downsampling and call getters only once for kinematic variables. (#11085) Co-authored-by: Mattia Faggin --- DPG/Tasks/AOTTrack/qaImpPar.cxx | 147 +++++++++++++++++--------------- 1 file changed, 80 insertions(+), 67 deletions(-) diff --git a/DPG/Tasks/AOTTrack/qaImpPar.cxx b/DPG/Tasks/AOTTrack/qaImpPar.cxx index 8e93081727a..787ac03d8c2 100644 --- a/DPG/Tasks/AOTTrack/qaImpPar.cxx +++ b/DPG/Tasks/AOTTrack/qaImpPar.cxx @@ -9,11 +9,8 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. /// \author Mattia Faggin , Padova University and INFN -/// -/// Event selection: o2-analysis-timestamp --aod-file AO2D.root -b | o2-analysis-event-selection -b | ---> not working with Run2 converted data/MC -/// Track selection: o2-analysis-trackextension | o2-analysis-trackselection | ---> add --isRun3 1 with Run 3 data/MC (then global track selection works) -/// PID: o2-analysis-pid-tpc-full | o2-analysis-pid-tof-full -/// Working configuration (2021 Oct 20th): o2-analysis-trackextension -b --aod-file ./AO2D.root | o2-analysis-trackselection -b --isRun3 1 | o2-analysis-pid-tpc-full -b | o2-analysis-pid-tof-full -b | o2-analysis-pp-qa-impact-parameter -b + +#include #include "Framework/AnalysisTask.h" #include "Framework/HistogramRegistry.h" @@ -62,7 +59,7 @@ struct QaImpactPar { ConfigurableAxis binningPulls{"binningPulls", {200, -10.f, 10.f}, "Pulls binning"}; ConfigurableAxis binningPt{"binningPt", {100, 0.f, 10.f}, "Pt binning"}; ConfigurableAxis binningEta{"binningEta", {40, -2.f, 2.f}, "Eta binning"}; - ConfigurableAxis binningPhi{"binningPhi", {24, 0.f, TMath::TwoPi()}, "Phi binning"}; + ConfigurableAxis binningPhi{"binningPhi", {24, 0.f, o2::constants::math::TwoPI}, "Phi binning"}; ConfigurableAxis binningPDG{"binningPDG", {5, -1.5f, 3.5f}, "PDG species binning (-1: not matched, 0: unknown, 1: pi, 2: K, 3: p)"}; ConfigurableAxis binningCharge{"binningCharge", {2, -2.f, 2.f}, "charge binning (-1: negative; +1: positive)"}; ConfigurableAxis binningIuPosX{"binningIuPosX", {100, -10.f, 10.f}, "Track IU x position"}; @@ -94,28 +91,29 @@ struct QaImpactPar { Configurable nSigmaTOFProtonMax{"nSigmaTOFProtonMax", 99999.f, "Maximum nSigma value in TOF, proton hypothesis"}; // PV refit Configurable ccdburl{"ccdburl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; - Configurable ccdbpath_lut{"ccdbpath_lut", "GLO/Param/MatLUT", "Path for LUT parametrization"}; + Configurable ccdbPathLut{"ccdbpath_lut", "GLO/Param/MatLUT", "Path for LUT parametrization"}; // Configurable ccdbpath_geo{"ccdbpath_geo", "GLO/Config/GeometryAligned", "Path of the geometry file"}; - Configurable ccdbpath_grp{"ccdbpath_grp", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + Configurable ccdbPathGrp{"ccdbpath_grp", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; Configurable doPVrefit{"doPVrefit", true, "Do PV refit"}; - Configurable nBins_DeltaX_PVrefit{"nBins_DeltaX_PVrefit", 1000, "Number of bins of DeltaX for PV refit"}; - Configurable nBins_DeltaY_PVrefit{"nBins_DeltaY_PVrefit", 1000, "Number of bins of DeltaY for PV refit"}; - Configurable nBins_DeltaZ_PVrefit{"nBins_DeltaZ_PVrefit", 1000, "Number of bins of DeltaZ for PV refit"}; - Configurable minDeltaX_PVrefit{"minDeltaX_PVrefit", -0.5, "Min. DeltaX value for PV refit (cm)"}; - Configurable maxDeltaX_PVrefit{"maxDeltaX_PVrefit", 0.5, "Max. DeltaX value for PV refit (cm)"}; - Configurable minDeltaY_PVrefit{"minDeltaY_PVrefit", -0.5, "Min. DeltaY value for PV refit (cm)"}; - Configurable maxDeltaY_PVrefit{"maxDeltaY_PVrefit", 0.5, "Max. DeltaY value for PV refit (cm)"}; - Configurable minDeltaZ_PVrefit{"minDeltaZ_PVrefit", -0.5, "Min. DeltaZ value for PV refit (cm)"}; - Configurable maxDeltaZ_PVrefit{"maxDeltaZ_PVrefit", 0.5, "Max. DeltaZ value for PV refit (cm)"}; + Configurable nBinsDeltaXPVrefit{"nBins_DeltaX_PVrefit", 1000, "Number of bins of DeltaX for PV refit"}; + Configurable nBinsDeltaYPVrefit{"nBins_DeltaY_PVrefit", 1000, "Number of bins of DeltaY for PV refit"}; + Configurable nBinsDeltaZPVrefit{"nBins_DeltaZ_PVrefit", 1000, "Number of bins of DeltaZ for PV refit"}; + Configurable minDeltaXPVrefit{"minDeltaX_PVrefit", -0.5, "Min. DeltaX value for PV refit (cm)"}; + Configurable maxDeltaXPVrefit{"maxDeltaX_PVrefit", 0.5, "Max. DeltaX value for PV refit (cm)"}; + Configurable minDeltaYPVrefit{"minDeltaY_PVrefit", -0.5, "Min. DeltaY value for PV refit (cm)"}; + Configurable maxDeltaYPVrefit{"maxDeltaY_PVrefit", 0.5, "Max. DeltaY value for PV refit (cm)"}; + Configurable minDeltaZPVrefit{"minDeltaZ_PVrefit", -0.5, "Min. DeltaZ value for PV refit (cm)"}; + Configurable maxDeltaZPVrefit{"maxDeltaZ_PVrefit", 0.5, "Max. DeltaZ value for PV refit (cm)"}; Configurable minPVcontrib{"minPVcontrib", 0, "Minimum number of PV contributors"}; Configurable maxPVcontrib{"maxPVcontrib", 10000, "Maximum number of PV contributors"}; Configurable removeDiamondConstraint{"removeDiamondConstraint", true, "Remove the diamond constraint for the PV refit"}; Configurable keepAllTracksPVrefit{"keepAllTracksPVrefit", false, "Keep all tracks for PV refit (for debug)"}; - Configurable use_customITSHitMap{"use_customITSHitMap", false, "Use custom ITS hitmap selection"}; + Configurable useCustomITSHitMap{"use_customITSHitMap", false, "Use custom ITS hitmap selection"}; Configurable customITShitmap{"customITShitmap", 0, "Custom ITS hitmap (consider the binary representation)"}; Configurable customITShitmap_exclude{"customITShitmap_exclude", 0, "Custom ITS hitmap of layers to be excluded (consider the binary representation)"}; - Configurable n_customMinITShits{"n_customMinITShits", 0, "Minimum number of layers crossed by a track among those in \"customITShitmap\""}; - Configurable custom_forceITSTPCmatching{"custom_forceITSTPCmatching", false, "Consider or not only ITS-TPC macthed tracks when using custom ITS hitmap"}; + Configurable nCustomMinITShits{"n_customMinITShits", 0, "Minimum number of layers crossed by a track among those in \"customITShitmap\""}; + Configurable customForceITSTPCmatching{"custom_forceITSTPCmatching", false, "Consider or not only ITS-TPC macthed tracks when using custom ITS hitmap"}; + Configurable downsamplingFraction{"downsamplingFraction", 1.1, "Fraction of tracks to be used to fill the output objects"}; /// Custom cut selection objects TrackSelection selector_ITShitmap; @@ -153,16 +151,16 @@ struct QaImpactPar { ///////////////////////////////////////////////////////////// /// Data - using collisionRecoTable = o2::soa::Join; - using trackTable = o2::soa::Join; - using trackFullTable = o2::soa::Join; + using TrackTable = o2::soa::Join; + using TrackFullTable = o2::soa::Join; - using trackTableIU = o2::soa::Join; - void processData(o2::soa::Filtered::iterator& collision, - const trackTable& tracksUnfiltered, - const o2::soa::Filtered& tracks, - const trackTableIU& tracksIU, + using TrackTableIU = o2::soa::Join; + void processData(o2::soa::Filtered::iterator const& collision, + const TrackTable& tracksUnfiltered, + const o2::soa::Filtered& tracks, + const TrackTableIU& tracksIU, o2::aod::BCsWithTimestamps const&) { /// here call the template processReco function @@ -172,12 +170,12 @@ struct QaImpactPar { PROCESS_SWITCH(QaImpactPar, processData, "process data", true); /// MC - using collisionMCRecoTable = o2::soa::Join; - using trackMCFullTable = o2::soa::Join; - void processMC(o2::soa::Filtered::iterator& collision, - trackTable const& tracksUnfiltered, - o2::soa::Filtered const& tracks, - const trackTableIU& tracksIU, + using CollisionMCRecoTable = o2::soa::Join; + using TrackMCFullTable = o2::soa::Join; + void processMC(o2::soa::Filtered::iterator const& collision, + TrackTable const& tracksUnfiltered, + o2::soa::Filtered const& tracks, + const TrackTableIU& tracksIU, const o2::aod::McParticles& mcParticles, const o2::aod::McCollisions&, o2::aod::BCsWithTimestamps const&) @@ -190,7 +188,7 @@ struct QaImpactPar { /// core template process function /// template - /// void processReco(const C& collision, const trackTable& unfilteredTracks, const T& tracks, + /// void processReco(const C& collision, const TrackTable& unfilteredTracks, const T& tracks, /// const T_MC& mcParticles, /// o2::aod::BCsWithTimestamps const& bcs); @@ -207,9 +205,9 @@ struct QaImpactPar { const AxisSpec collisionYOrigAxis{1000, -20.f, 20.f, "Y original PV (cm)"}; const AxisSpec collisionZOrigAxis{1000, -20.f, 20.f, "Z original PV (cm)"}; const AxisSpec collisionNumberContributorAxis{1000, 0, 1000, "Number of contributors"}; - const AxisSpec collisionDeltaX_PVrefit{nBins_DeltaX_PVrefit, minDeltaX_PVrefit, maxDeltaX_PVrefit, "#Delta x_{PV} (cm)"}; - const AxisSpec collisionDeltaY_PVrefit{nBins_DeltaY_PVrefit, minDeltaY_PVrefit, maxDeltaY_PVrefit, "#Delta y_{PV} (cm)"}; - const AxisSpec collisionDeltaZ_PVrefit{nBins_DeltaZ_PVrefit, minDeltaZ_PVrefit, maxDeltaZ_PVrefit, "#Delta z_{PV} (cm)"}; + const AxisSpec collisionDeltaX_PVrefit{nBinsDeltaXPVrefit, minDeltaXPVrefit, maxDeltaXPVrefit, "#Delta x_{PV} (cm)"}; + const AxisSpec collisionDeltaY_PVrefit{nBinsDeltaYPVrefit, minDeltaYPVrefit, maxDeltaYPVrefit, "#Delta y_{PV} (cm)"}; + const AxisSpec collisionDeltaZ_PVrefit{nBinsDeltaZPVrefit, minDeltaZPVrefit, maxDeltaZPVrefit, "#Delta z_{PV} (cm)"}; histograms.add("Reco/vertices", "", kTH1D, {{2, 0.5f, 2.5f, ""}}); histograms.get(HIST("Reco/vertices"))->GetXaxis()->SetBinLabel(1, "All PV"); @@ -236,7 +234,7 @@ struct QaImpactPar { ccdb->setURL(ccdburl); ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); - lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get(ccdbpath_lut)); + lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get(ccdbPathLut)); // if (!o2::base::GeometryManager::isGeometryLoaded()) { // ccdb->get(ccdbpath_geo); // } @@ -244,14 +242,15 @@ struct QaImpactPar { /// Custom cut selection objects - ITS layers that must be present std::set set_customITShitmap; // = {}; - if (use_customITSHitMap) { - for (int index_ITSlayer = 0; index_ITSlayer < 7; index_ITSlayer++) { - if ((customITShitmap & (1 << index_ITSlayer)) > 0) { - set_customITShitmap.insert(static_cast(index_ITSlayer)); + constexpr std::size_t NLayersIts = 7; + if (useCustomITSHitMap) { + for (std::size_t indexItsLayer = 0; indexItsLayer < NLayersIts; indexItsLayer++) { + if ((customITShitmap & (1 << indexItsLayer)) > 0) { + set_customITShitmap.insert(static_cast(indexItsLayer)); } } LOG(info) << "### customITShitmap: " << customITShitmap; - LOG(info) << "### n_customMinITShits: " << n_customMinITShits; + LOG(info) << "### nCustomMinITShits: " << nCustomMinITShits; LOG(info) << "### set_customITShitmap.size(): " << set_customITShitmap.size(); LOG(info) << "### Custom ITS hitmap checked: "; for (std::set::iterator it = set_customITShitmap.begin(); it != set_customITShitmap.end(); it++) { @@ -259,14 +258,14 @@ struct QaImpactPar { } LOG(info) << "############"; - selector_ITShitmap.SetRequireHitsInITSLayers(n_customMinITShits, set_customITShitmap); + selector_ITShitmap.SetRequireHitsInITSLayers(nCustomMinITShits, set_customITShitmap); } /// Custom cut selection objects - ITS layers that must be absent std::set set_customITShitmap_exclude; // = {}; - if (use_customITSHitMap) { - for (int index_ITSlayer = 0; index_ITSlayer < 7; index_ITSlayer++) { - if ((customITShitmap_exclude & (1 << index_ITSlayer)) > 0) { - set_customITShitmap_exclude.insert(static_cast(index_ITSlayer)); + if (useCustomITSHitMap) { + for (std::size_t indexItsLayer = 0; indexItsLayer < NLayersIts; indexItsLayer++) { + if ((customITShitmap_exclude & (1 << indexItsLayer)) > 0) { + set_customITShitmap_exclude.insert(static_cast(indexItsLayer)); } } LOG(info) << "### customITShitmap_exclude: " << customITShitmap_exclude; @@ -369,8 +368,8 @@ struct QaImpactPar { /// core template process function template - void processReco(const C& collision, const trackTable& unfilteredTracks, const T& tracks, - const trackTableIU& tracksIU, const T_MC& /*mcParticles*/, + void processReco(const C& collision, const TrackTable& unfilteredTracks, const T& tracks, + const TrackTableIU& tracksIU, const T_MC& /*mcParticles*/, o2::aod::BCsWithTimestamps::iterator const& bc) { constexpr float toMicrometers = 10000.f; // Conversion from [cm] to [mum] @@ -451,7 +450,7 @@ struct QaImpactPar { o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT; // auto bc = collision.bc_as(); if (mRunNumber != bc.runNumber()) { - o2::parameters::GRPMagField* grpo = ccdb->getForTimeStamp(ccdbpath_grp, bc.timestamp()); + o2::parameters::GRPMagField* grpo = ccdb->getForTimeStamp(ccdbPathGrp, bc.timestamp()); if (grpo != nullptr) { o2::base::Propagator::initFieldFromGRP(grpo); o2::base::Propagator::Instance()->setMatLUT(lut); @@ -492,6 +491,11 @@ struct QaImpactPar { /// loop over tracks float pt = -999.f; float p = -999.f; + float eta = -999.f; + float phi = -999.f; + int8_t sign = -1; + bool isPvContributor = false; + int nContributors = -1; float impParRPhi = -999.f; float impParZ = -999.f; float impParRPhiSigma = 999.f; @@ -511,7 +515,8 @@ struct QaImpactPar { int cnt = 0; for (const auto& track : tracks) { - if (keepOnlyPvContrib && !track.isPVContributor()) { + isPvContributor = track.isPVContributor(); + if (keepOnlyPvContrib && !isPvContributor) { /// let's skip all tracks that were not PV contributors originally /// this let us ignore tracks flagged as ambiguous continue; @@ -547,12 +552,12 @@ struct QaImpactPar { ///} /// apply custom ITS hitmap selections, if asked - if (use_customITSHitMap && !selector_ITShitmap.IsSelected(track, TrackSelection::TrackCuts::kITSHits)) { + if (useCustomITSHitMap && !selector_ITShitmap.IsSelected(track, TrackSelection::TrackCuts::kITSHits)) { /// skip this track and go on, because it does not satisfy the ITS hit requirements continue; } - if (use_customITSHitMap && custom_forceITSTPCmatching && (!track.hasITS() || !track.hasTPC())) { - // if (use_customITSHitMap && custom_forceITSTPCmatching && track.hasITS()) { ///ATTEMPT: REMOVE TRACKS WITH ITS + if (useCustomITSHitMap && customForceITSTPCmatching && (!track.hasITS() || !track.hasTPC())) { + // if (useCustomITSHitMap && customForceITSTPCmatching && track.hasITS()) { ///ATTEMPT: REMOVE TRACKS WITH ITS /// skip this track because it is not global (no matching ITS-TPC) continue; } @@ -710,16 +715,24 @@ struct QaImpactPar { } /// all tracks - histograms.fill(HIST("Reco/h4ImpPar"), pt, impParRPhi, track.eta(), track.phi(), pdgIndex, track.sign(), collision.numContrib(), track.isPVContributor()); - histograms.fill(HIST("Reco/h4ImpParZ"), pt, impParZ, track.eta(), track.phi(), pdgIndex, track.sign(), collision.numContrib(), track.isPVContributor()); + if ((pt * 1000 - static_cast(pt * 1000)) > downsamplingFraction) { + // downsampling - do not consider the current track + continue; + } + eta = track.eta(); + phi = track.phi(); + sign = track.sign(); + nContributors = collision.numContrib(); + histograms.fill(HIST("Reco/h4ImpPar"), pt, impParRPhi, eta, phi, pdgIndex, sign, nContributors, isPvContributor); + histograms.fill(HIST("Reco/h4ImpParZ"), pt, impParZ, eta, phi, pdgIndex, sign, nContributors, isPvContributor); if (addTrackIUinfo) { histograms.fill(HIST("Reco/h4ClusterSizeIU"), p, impParRPhi, trackIuPosX, trackIuPosY, trackIuPosZ, clusterSizeInLayer0); // histograms.fill(HIST("Reco/h4ImpParIU"), p, impParRPhi, trackIuPosX, trackIuPosY, trackIuPosZ); histograms.fill(HIST("Reco/h4ImpParZIU"), p, impParZ, trackIuPosX, trackIuPosY, trackIuPosZ); } if (fEnablePulls) { - histograms.fill(HIST("Reco/h4ImpParPulls"), pt, impParRPhi / impParRPhiSigma, track.eta(), track.phi(), pdgIndex, track.sign(), collision.numContrib(), track.isPVContributor()); - histograms.fill(HIST("Reco/h4ImpParZPulls"), pt, impParZ / impParZSigma, track.eta(), track.phi(), pdgIndex, track.sign(), collision.numContrib(), track.isPVContributor()); + histograms.fill(HIST("Reco/h4ImpParPulls"), pt, impParRPhi / impParRPhiSigma, eta, phi, pdgIndex, sign, nContributors, isPvContributor); + histograms.fill(HIST("Reco/h4ImpParZPulls"), pt, impParZ / impParZSigma, eta, phi, pdgIndex, sign, nContributors, isPvContributor); } if (isPIDPionApplied && nSigmaTPCPionMin < tpcNSigmaPion && tpcNSigmaPion < nSigmaTPCPionMax && nSigmaTOFPionMin < tofNSigmaPion && tofNSigmaPion < nSigmaTOFPionMax) { @@ -727,8 +740,8 @@ struct QaImpactPar { if (addTrackIUinfo) { histograms.fill(HIST("Reco/h4ClusterSizeIU_Pion"), p, impParRPhi, trackIuPosX, trackIuPosY, trackIuPosZ, clusterSizeInLayer0); } - histograms.fill(HIST("Reco/h4ImpPar_Pion"), pt, impParRPhi, track.eta(), track.phi(), pdgIndex, track.sign(), collision.numContrib(), track.isPVContributor()); - histograms.fill(HIST("Reco/h4ImpParZ_Pion"), pt, impParZ, track.eta(), track.phi(), pdgIndex, track.sign(), collision.numContrib(), track.isPVContributor()); + histograms.fill(HIST("Reco/h4ImpPar_Pion"), pt, impParRPhi, eta, phi, pdgIndex, sign, nContributors, isPvContributor); + histograms.fill(HIST("Reco/h4ImpParZ_Pion"), pt, impParZ, eta, phi, pdgIndex, sign, nContributors, isPvContributor); histograms.fill(HIST("Reco/hNSigmaTPCPion_afterPID"), pt, tpcNSigmaPion); histograms.fill(HIST("Reco/hNSigmaTOFPion_afterPID"), pt, tofNSigmaPion); } @@ -737,8 +750,8 @@ struct QaImpactPar { if (addTrackIUinfo) { histograms.fill(HIST("Reco/h4ClusterSizeIU_Kaon"), p, impParRPhi, trackIuPosX, trackIuPosY, trackIuPosZ, clusterSizeInLayer0); } - histograms.fill(HIST("Reco/h4ImpPar_Kaon"), pt, impParRPhi, track.eta(), track.phi(), pdgIndex, track.sign(), collision.numContrib(), track.isPVContributor()); - histograms.fill(HIST("Reco/h4ImpParZ_Kaon"), pt, impParZ, track.eta(), track.phi(), pdgIndex, track.sign(), collision.numContrib(), track.isPVContributor()); + histograms.fill(HIST("Reco/h4ImpPar_Kaon"), pt, impParRPhi, eta, phi, pdgIndex, sign, nContributors, isPvContributor); + histograms.fill(HIST("Reco/h4ImpParZ_Kaon"), pt, impParZ, eta, phi, pdgIndex, sign, nContributors, isPvContributor); histograms.fill(HIST("Reco/hNSigmaTPCKaon_afterPID"), pt, tpcNSigmaKaon); histograms.fill(HIST("Reco/hNSigmaTOFKaon_afterPID"), pt, tofNSigmaKaon); } @@ -747,8 +760,8 @@ struct QaImpactPar { if (addTrackIUinfo) { histograms.fill(HIST("Reco/h4ClusterSizeIU_Proton"), p, impParRPhi, trackIuPosX, trackIuPosY, trackIuPosZ, clusterSizeInLayer0); } - histograms.fill(HIST("Reco/h4ImpPar_Proton"), pt, impParRPhi, track.eta(), track.phi(), pdgIndex, track.sign(), collision.numContrib(), track.isPVContributor()); - histograms.fill(HIST("Reco/h4ImpParZ_Proton"), pt, impParZ, track.eta(), track.phi(), pdgIndex, track.sign(), collision.numContrib(), track.isPVContributor()); + histograms.fill(HIST("Reco/h4ImpPar_Proton"), pt, impParRPhi, eta, phi, pdgIndex, sign, nContributors, isPvContributor); + histograms.fill(HIST("Reco/h4ImpParZ_Proton"), pt, impParZ, eta, phi, pdgIndex, sign, nContributors, isPvContributor); histograms.fill(HIST("Reco/hNSigmaTPCProton_afterPID"), pt, tpcNSigmaProton); histograms.fill(HIST("Reco/hNSigmaTOFProton_afterPID"), pt, tofNSigmaProton); } @@ -759,6 +772,6 @@ struct QaImpactPar { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { WorkflowSpec w{ - adaptAnalysisTask(cfgc, TaskName{"qa-impact-par"})}; + adaptAnalysisTask(cfgc)}; return w; } From d0689d01eb320239fb948dcd837592f10cd631cb Mon Sep 17 00:00:00 2001 From: Oleksii Lubynets Date: Tue, 6 May 2025 09:24:59 +0200 Subject: [PATCH 1195/1650] [PWGHF] Reduce code duplication in the treeCreatorLcToPKPi (#11016) --- PWGHF/TableProducer/treeCreatorLcToPKPi.cxx | 887 ++++++++------------ 1 file changed, 364 insertions(+), 523 deletions(-) diff --git a/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx b/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx index be5349f8589..0ffd1aeac91 100644 --- a/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx +++ b/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx @@ -17,6 +17,8 @@ /// \author Nicolo' Jacazio , CERN /// \author Luigi Dello Stritto , CERN +#include + #include "CommonConstants/PhysicsConstants.h" #include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" @@ -447,19 +449,11 @@ struct HfTreeCreatorLcToPKPi { } } - /// \brief core function to fill tables in MC + /// \brief function to fill event properties /// \param collisions Collision table - /// \param mcCollisions MC collision table - /// \param candidates Lc->pKpi candidate table - /// \param particles Generated particle table - template - void fillTablesMc(Colls const& collisions, - aod::McCollisions const&, - CandType const& candidates, - soa::Join const& particles, - soa::Join const&, aod::BCs const&) + template + void fillEventProperties(Colls const& collisions) { - // Filling event properties rowCandidateFullEvents.reserve(collisions.size()); for (const auto& collision : collisions) { @@ -477,11 +471,24 @@ struct HfTreeCreatorLcToPKPi { centFDDM = collision.centFDDM(); } - auto mcCollision = collision.template mcCollision_as(); + float mcPosX{UndefValueFloat}; + float mcPosY{UndefValueFloat}; + float mcPosZ{UndefValueFloat}; + int mcCollId{-1}; + + if constexpr (isMc) { + auto mcCollision = collision.template mcCollision_as(); + + mcPosX = mcCollision.posX(); + mcPosY = mcCollision.posY(); + mcPosZ = mcCollision.posZ(); + + mcCollId = collision.mcCollisionId(); + } rowCandidateFullEvents( collision.globalIndex(), - collision.mcCollisionId(), + mcCollId, collision.numContrib(), collision.posX(), collision.posY(), @@ -489,9 +496,9 @@ struct HfTreeCreatorLcToPKPi { std::sqrt(collision.covXX()), std::sqrt(collision.covYY()), std::sqrt(collision.covZZ()), - mcCollision.posX(), - mcCollision.posY(), - mcCollision.posZ(), + mcPosX, + mcPosY, + mcPosZ, 0, collision.bc().runNumber(), centFT0A, @@ -502,24 +509,347 @@ struct HfTreeCreatorLcToPKPi { collision.multZeqNTracksPV(), collision.multNTracksPV()); } + } - // Filling candidate properties + /// \brief function to reserve tables size + /// \param candidatesSize size of the candidates table + /// \param isMc boolean flag whether MC or data is processed + template + void reserveTables(size_t candidatesSize, bool isMc) + { if constexpr (reconstructionType == aod::hf_cand::VertexerType::DCAFitter) { if (fillCandidateLiteTable) { - rowCandidateLite.reserve(candidates.size() * 2); + rowCandidateLite.reserve(candidatesSize * 2); } else { - rowCandidateFull.reserve(candidates.size() * 2); + rowCandidateFull.reserve(candidatesSize * 2); } } else { - rowCandidateKF.reserve(candidates.size() * 2); + rowCandidateKF.reserve(candidatesSize * 2); } if (fillCollIdTable) { /// save also candidate collision indices - rowCollisionId.reserve(candidates.size()); + rowCollisionId.reserve(candidatesSize); } - if (fillCandidateMcTable) { - rowCandidateMC.reserve(candidates.size() * 2); + if (isMc && fillCandidateMcTable) { + rowCandidateMC.reserve(candidatesSize * 2); } + } + + /// \brief function to evaluate invariant mass of the Lc candidate and KPi pair + /// \param candidate candidate instance + /// \param candFlag flag indicating if PKPi (0) or PiKP (1) hypothesis is used + template + std::pair evaluateInvariantMasses(CandType const& candidate, int candFlag) + { + float invMass, invMassKPi; + if constexpr (reconstructionType == aod::hf_cand::VertexerType::DCAFitter) { + invMass = candFlag == 0 ? hfHelper.invMassLcToPKPi(candidate) : hfHelper.invMassLcToPiKP(candidate); + invMassKPi = candFlag == 0 ? hfHelper.invMassKPiPairLcToPKPi(candidate) : hfHelper.invMassKPiPairLcToPiKP(candidate); + } else { + invMass = candFlag == 0 ? candidate.kfMassPKPi() : candidate.kfMassPiKP(); + invMassKPi = candFlag == 0 ? candidate.kfMassKPi() : candidate.kfMassPiK(); + } + + return std::make_pair(invMass, invMassKPi); + } + + /// \brief function to fill lite table + /// \param candidate candidate instance + /// \param candFlag flag indicating if PKPi (0) or PiKP (1) hypothesis is used + template + void fillLiteTable(CandType const& candidate, int candFlag) + { + auto [functionInvMass, functionInvMassKPi] = evaluateInvariantMasses(candidate, candFlag); + const float functionCt = hfHelper.ctLc(candidate); + const float functionY = hfHelper.yLc(candidate); + + int8_t functionFlagMcMatchRec{0}; + int8_t functionOriginMcRec{0}; + int8_t functionIsCandidateSwapped{0}; + int8_t functionFlagMcDecayChanRec{-1}; + + if constexpr (isMc) { + functionFlagMcMatchRec = candidate.flagMcMatchRec(); + functionOriginMcRec = candidate.originMcRec(); + functionIsCandidateSwapped = candidate.isCandidateSwapped(); + functionFlagMcDecayChanRec = candidate.flagMcDecayChanRec(); + } + + rowCandidateLite( + candidate.posX(), + candidate.posY(), + candidate.posZ(), + candidate.nProngsContributorsPV(), + candidate.bitmapProngsContributorsPV(), + candidate.chi2PCA(), + candidate.decayLength(), + candidate.decayLengthXY(), + candidate.ptProng0(), + candidate.ptProng1(), + candidate.ptProng2(), + candidate.impactParameter0(), + candidate.impactParameter1(), + candidate.impactParameter2(), + candidate.nSigTpcPi0(), + candidate.nSigTpcPr0(), + candidate.nSigTofPi0(), + candidate.nSigTofPr0(), + candidate.nSigTpcKa1(), + candidate.nSigTofKa1(), + candidate.nSigTpcPi2(), + candidate.nSigTpcPr2(), + candidate.nSigTofPi2(), + candidate.nSigTofPr2(), + candidate.tpcTofNSigmaPi0(), + candidate.tpcTofNSigmaPr0(), + candidate.tpcTofNSigmaKa1(), + candidate.tpcTofNSigmaPi2(), + candidate.tpcTofNSigmaPr2(), + 1 << candFlag, + functionInvMass, + candidate.pt(), + candidate.cpa(), + candidate.cpaXY(), + functionCt, + candidate.eta(), + candidate.phi(), + functionY, + functionFlagMcMatchRec, + functionOriginMcRec, + functionIsCandidateSwapped, + functionFlagMcDecayChanRec, + functionInvMassKPi); + + if (fillCollIdTable) { + /// save also candidate collision indices + rowCollisionId(candidate.collisionId()); + } + } + + /// \brief function to fill lite table + /// \param candidate candidate instance + /// \param candFlag flag indicating if PKPi (0) or PiKP (1) hypothesis is used + template + void fillFullTable(CandType const& candidate, int candFlag) + { + auto [functionInvMass, functionInvMassKPi] = evaluateInvariantMasses(candidate, candFlag); + const float functionCt = hfHelper.ctLc(candidate); + const float functionY = hfHelper.yLc(candidate); + const float functionE = hfHelper.eLc(candidate); + + int8_t functionFlagMcMatchRec{0}; + int8_t functionOriginMcRec{0}; + int8_t functionIsCandidateSwapped{0}; + int8_t functionFlagMcDecayChanRec{-1}; + + if constexpr (isMc) { + functionFlagMcMatchRec = candidate.flagMcMatchRec(); + functionOriginMcRec = candidate.originMcRec(); + functionIsCandidateSwapped = candidate.isCandidateSwapped(); + functionFlagMcDecayChanRec = candidate.flagMcDecayChanRec(); + } + + rowCandidateFull( + candidate.collisionId(), + candidate.posX(), + candidate.posY(), + candidate.posZ(), + candidate.nProngsContributorsPV(), + candidate.bitmapProngsContributorsPV(), + candidate.xSecondaryVertex(), + candidate.ySecondaryVertex(), + candidate.zSecondaryVertex(), + candidate.errorDecayLength(), + candidate.errorDecayLengthXY(), + candidate.chi2PCA(), + candidate.rSecondaryVertex(), + candidate.decayLength(), + candidate.decayLengthXY(), + candidate.decayLengthNormalised(), + candidate.decayLengthXYNormalised(), + candidate.impactParameterNormalised0(), + candidate.ptProng0(), + RecoDecay::p(candidate.pxProng0(), candidate.pyProng0(), candidate.pzProng0()), + candidate.impactParameterNormalised1(), + candidate.ptProng1(), + RecoDecay::p(candidate.pxProng1(), candidate.pyProng1(), candidate.pzProng1()), + candidate.impactParameterNormalised2(), + candidate.ptProng2(), + RecoDecay::p(candidate.pxProng2(), candidate.pyProng2(), candidate.pzProng2()), + candidate.pxProng0(), + candidate.pyProng0(), + candidate.pzProng0(), + candidate.pxProng1(), + candidate.pyProng1(), + candidate.pzProng1(), + candidate.pxProng2(), + candidate.pyProng2(), + candidate.pzProng2(), + candidate.impactParameter0(), + candidate.impactParameter1(), + candidate.impactParameter2(), + candidate.errorImpactParameter0(), + candidate.errorImpactParameter1(), + candidate.errorImpactParameter2(), + candidate.nSigTpcPi0(), + candidate.nSigTpcPr0(), + candidate.nSigTofPi0(), + candidate.nSigTofPr0(), + candidate.nSigTpcKa1(), + candidate.nSigTofKa1(), + candidate.nSigTpcPi2(), + candidate.nSigTpcPr2(), + candidate.nSigTofPi2(), + candidate.nSigTofPr2(), + candidate.tpcTofNSigmaPi0(), + candidate.tpcTofNSigmaPr0(), + candidate.tpcTofNSigmaKa1(), + candidate.tpcTofNSigmaPi2(), + candidate.tpcTofNSigmaPr2(), + 1 << candFlag, + functionInvMass, + candidate.pt(), + candidate.p(), + candidate.cpa(), + candidate.cpaXY(), + functionCt, + candidate.eta(), + candidate.phi(), + functionY, + functionE, + functionFlagMcMatchRec, + functionOriginMcRec, + functionIsCandidateSwapped, + candidate.globalIndex(), + functionFlagMcDecayChanRec, + functionInvMassKPi); + } + + /// \brief function to fill lite table + /// \param candidate candidate instance + /// \param collision collision, to which the candidate belongs + /// \param candFlag flag indicating if PKPi (0) or PiKP (1) hypothesis is used + /// \param functionSelection flag indicating if candidate was selected by candidateSelectorLc task + /// \param sigbgstatus for MC: number indicating if candidate is prompt, non-prompt or background; for data: UndefValueInt + template + void fillKFTable(CandType const& candidate, + CollType const& collision, + int candFlag, + int functionSelection, + int sigbgstatus) + { + float chi2primProton; + float chi2primPion; + float dcaProtonKaon; + float dcaPionKaon; + float chi2GeoProtonKaon; + float chi2GeoPionKaon; + float mass; + float valueTpcNSigmaPr; + const float valueTpcNSigmaKa = candidate.nSigTpcKa1(); + float valueTpcNSigmaPi; + float valueTofNSigmaPr; + const float valueTofNSigmaKa = candidate.nSigTofKa1(); + float valueTofNSigmaPi; + float valueTpcTofNSigmaPr; + const float valueTpcTofNSigmaKa = candidate.tpcTofNSigmaKa1(); + float valueTpcTofNSigmaPi; + if (candFlag == 0) { + chi2primProton = candidate.kfChi2PrimProng0(); + chi2primPion = candidate.kfChi2PrimProng2(); + dcaProtonKaon = candidate.kfDcaProng0Prong1(); + dcaPionKaon = candidate.kfDcaProng1Prong2(); + chi2GeoProtonKaon = candidate.kfChi2GeoProng0Prong1(); + chi2GeoPionKaon = candidate.kfChi2GeoProng1Prong2(); + mass = candidate.kfMassPKPi(); + valueTpcNSigmaPr = candidate.nSigTpcPr0(); + valueTpcNSigmaPi = candidate.nSigTpcPi2(); + valueTofNSigmaPr = candidate.nSigTofPr0(); + valueTofNSigmaPi = candidate.nSigTofPi2(); + valueTpcTofNSigmaPr = candidate.tpcTofNSigmaPr0(); + valueTpcTofNSigmaPi = candidate.tpcTofNSigmaPi2(); + } else { + chi2primProton = candidate.kfChi2PrimProng2(); + chi2primPion = candidate.kfChi2PrimProng0(); + dcaProtonKaon = candidate.kfDcaProng1Prong2(); + dcaPionKaon = candidate.kfDcaProng0Prong1(); + chi2GeoProtonKaon = candidate.kfChi2GeoProng1Prong2(); + chi2GeoPionKaon = candidate.kfChi2GeoProng0Prong1(); + mass = candidate.kfMassPiKP(); + valueTpcNSigmaPr = candidate.nSigTpcPr2(); + valueTpcNSigmaPi = candidate.nSigTpcPi0(); + valueTofNSigmaPr = candidate.nSigTofPr2(); + valueTofNSigmaPi = candidate.nSigTofPi0(); + valueTpcTofNSigmaPr = candidate.tpcTofNSigmaPr2(); + valueTpcTofNSigmaPi = candidate.tpcTofNSigmaPi0(); + } + const float svX = candidate.xSecondaryVertex(); + const float svY = candidate.ySecondaryVertex(); + const float svZ = candidate.zSecondaryVertex(); + const float svErrX = candidate.kfXError(); + const float svErrY = candidate.kfYError(); + const float svErrZ = candidate.kfZError(); + const float pvErrX = candidate.kfXPVError(); + const float pvErrY = candidate.kfYPVError(); + const float pvErrZ = candidate.kfZPVError(); + const float chi2primKaon = candidate.kfChi2PrimProng1(); + const float dcaProtonPion = candidate.kfDcaProng0Prong2(); + const float chi2GeoProtonPion = candidate.kfChi2GeoProng0Prong2(); + const float chi2Geo = candidate.kfChi2Geo(); + const float chi2Topo = candidate.kfChi2Topo(); + const float decayLength = candidate.kfDecayLength(); + const float dl = candidate.kfDecayLengthError(); + const float pt = std::sqrt(candidate.kfPx() * candidate.kfPx() + candidate.kfPy() * candidate.kfPy()); + const float deltaPt = std::sqrt(candidate.kfPx() * candidate.kfPx() * candidate.kfErrorPx() * candidate.kfErrorPx() + + candidate.kfPy() * candidate.kfPy() * candidate.kfErrorPy() * candidate.kfErrorPy()) / + pt; + const float p = std::sqrt(pt * pt + candidate.kfPz() * candidate.kfPz()); + const float deltaP = std::sqrt(pt * pt * deltaPt * deltaPt + + candidate.kfPz() * candidate.kfPz() * candidate.kfErrorPz() * candidate.kfErrorPz()) / + p; + const float lifetime = decayLength * MassLambdaCPlus / LightSpeedCm2PS / p; + const float deltaT = dl * MassLambdaCPlus / LightSpeedCm2PS / p; + rowCandidateKF( + svX, svY, svZ, svErrX, svErrY, svErrZ, + pvErrX, pvErrY, pvErrZ, + chi2primProton, chi2primKaon, chi2primPion, + dcaProtonKaon, dcaProtonPion, dcaPionKaon, + chi2GeoProtonKaon, chi2GeoProtonPion, chi2GeoPionKaon, + chi2Geo, chi2Topo, decayLength, dl, decayLength / dl, lifetime, deltaT, + mass, p, pt, deltaP, deltaPt, + functionSelection, sigbgstatus, + collision.multNTracksPV(), + valueTpcNSigmaPr, + valueTpcNSigmaKa, + valueTpcNSigmaPi, + valueTofNSigmaPr, + valueTofNSigmaKa, + valueTofNSigmaPi, + valueTpcTofNSigmaPr, + valueTpcTofNSigmaKa, + valueTpcTofNSigmaPi); + } + + /// \brief core function to fill tables in MC + /// \param collisions Collision table + /// \param mcCollisions MC collision table + /// \param candidates Lc->pKpi candidate table + /// \param particles Generated particle table + template + void fillTablesMc(Colls const& collisions, + aod::McCollisions const&, + CandType const& candidates, + soa::Join const& particles, + soa::Join const&, aod::BCs const&) + { + + constexpr bool IsMc = true; + + fillEventProperties(collisions); + + const size_t candidatesSize = candidates.size(); + reserveTables(candidatesSize, IsMc); + for (const auto& candidate : candidates) { float ptProng0 = candidate.ptProng0(); auto collision = candidate.template collision_as(); @@ -532,235 +862,14 @@ struct HfTreeCreatorLcToPKPi { const bool keepAll = !keepOnlySignalMc && !keepOnlyBkg; const bool notSkippedBkg = isMcCandidateSignal || candidate.pt() > downSampleBkgPtMax || pseudoRndm < downSampleBkgFactor; if (passSelection && notSkippedBkg && (keepAll || (keepOnlySignalMc && isMcCandidateSignal) || (keepOnlyBkg && !isMcCandidateSignal))) { - float functionInvMass, functionInvMassKPi; - if constexpr (reconstructionType == aod::hf_cand::VertexerType::DCAFitter) { - functionInvMass = candFlag == 0 ? hfHelper.invMassLcToPKPi(candidate) : hfHelper.invMassLcToPiKP(candidate); - functionInvMassKPi = candFlag == 0 ? hfHelper.invMassKPiPairLcToPKPi(candidate) : hfHelper.invMassKPiPairLcToPiKP(candidate); - } else { - functionInvMass = candFlag == 0 ? candidate.kfMassPKPi() : candidate.kfMassPiKP(); - functionInvMassKPi = candFlag == 0 ? candidate.kfMassKPi() : candidate.kfMassPiK(); - } - const float functionCt = hfHelper.ctLc(candidate); - const float functionY = hfHelper.yLc(candidate); - const float functionE = hfHelper.eLc(candidate); if (fillCandidateLiteTable) { - rowCandidateLite( - candidate.posX(), - candidate.posY(), - candidate.posZ(), - candidate.nProngsContributorsPV(), - candidate.bitmapProngsContributorsPV(), - candidate.chi2PCA(), - candidate.decayLength(), - candidate.decayLengthXY(), - candidate.ptProng0(), - candidate.ptProng1(), - candidate.ptProng2(), - candidate.impactParameter0(), - candidate.impactParameter1(), - candidate.impactParameter2(), - candidate.nSigTpcPi0(), - candidate.nSigTpcPr0(), - candidate.nSigTofPi0(), - candidate.nSigTofPr0(), - candidate.nSigTpcKa1(), - candidate.nSigTofKa1(), - candidate.nSigTpcPi2(), - candidate.nSigTpcPr2(), - candidate.nSigTofPi2(), - candidate.nSigTofPr2(), - candidate.tpcTofNSigmaPi0(), - candidate.tpcTofNSigmaPr0(), - candidate.tpcTofNSigmaKa1(), - candidate.tpcTofNSigmaPi2(), - candidate.tpcTofNSigmaPr2(), - 1 << candFlag, - functionInvMass, - candidate.pt(), - candidate.cpa(), - candidate.cpaXY(), - functionCt, - candidate.eta(), - candidate.phi(), - functionY, - candidate.flagMcMatchRec(), - candidate.originMcRec(), - candidate.isCandidateSwapped(), - candidate.flagMcDecayChanRec(), - functionInvMassKPi); - - if (fillCollIdTable) { - /// save also candidate collision indices - rowCollisionId(candidate.collisionId()); - } + fillLiteTable(candidate, candFlag); } else { - rowCandidateFull( - candidate.collisionId(), - candidate.posX(), - candidate.posY(), - candidate.posZ(), - candidate.nProngsContributorsPV(), - candidate.bitmapProngsContributorsPV(), - candidate.xSecondaryVertex(), - candidate.ySecondaryVertex(), - candidate.zSecondaryVertex(), - candidate.errorDecayLength(), - candidate.errorDecayLengthXY(), - candidate.chi2PCA(), - candidate.rSecondaryVertex(), - candidate.decayLength(), - candidate.decayLengthXY(), - candidate.decayLengthNormalised(), - candidate.decayLengthXYNormalised(), - candidate.impactParameterNormalised0(), - candidate.ptProng0(), - RecoDecay::p(candidate.pxProng0(), candidate.pyProng0(), candidate.pzProng0()), - candidate.impactParameterNormalised1(), - candidate.ptProng1(), - RecoDecay::p(candidate.pxProng1(), candidate.pyProng1(), candidate.pzProng1()), - candidate.impactParameterNormalised2(), - candidate.ptProng2(), - RecoDecay::p(candidate.pxProng2(), candidate.pyProng2(), candidate.pzProng2()), - candidate.pxProng0(), - candidate.pyProng0(), - candidate.pzProng0(), - candidate.pxProng1(), - candidate.pyProng1(), - candidate.pzProng1(), - candidate.pxProng2(), - candidate.pyProng2(), - candidate.pzProng2(), - candidate.impactParameter0(), - candidate.impactParameter1(), - candidate.impactParameter2(), - candidate.errorImpactParameter0(), - candidate.errorImpactParameter1(), - candidate.errorImpactParameter2(), - candidate.nSigTpcPi0(), - candidate.nSigTpcPr0(), - candidate.nSigTofPi0(), - candidate.nSigTofPr0(), - candidate.nSigTpcKa1(), - candidate.nSigTofKa1(), - candidate.nSigTpcPi2(), - candidate.nSigTpcPr2(), - candidate.nSigTofPi2(), - candidate.nSigTofPr2(), - candidate.tpcTofNSigmaPi0(), - candidate.tpcTofNSigmaPr0(), - candidate.tpcTofNSigmaKa1(), - candidate.tpcTofNSigmaPi2(), - candidate.tpcTofNSigmaPr2(), - 1 << candFlag, - functionInvMass, - candidate.pt(), - candidate.p(), - candidate.cpa(), - candidate.cpaXY(), - functionCt, - candidate.eta(), - candidate.phi(), - functionY, - functionE, - candidate.flagMcMatchRec(), - candidate.originMcRec(), - candidate.isCandidateSwapped(), - candidate.globalIndex(), - candidate.flagMcDecayChanRec(), - functionInvMassKPi); + fillFullTable(candidate, candFlag); } if constexpr (reconstructionType == aod::hf_cand::VertexerType::KfParticle) { - float chi2primProton; - float chi2primPion; - float dcaProtonKaon; - float dcaPionKaon; - float chi2GeoProtonKaon; - float chi2GeoPionKaon; - float mass; - float valueTpcNSigmaPr; - const float valueTpcNSigmaKa = candidate.nSigTpcKa1(); - float valueTpcNSigmaPi; - float valueTofNSigmaPr; - const float valueTofNSigmaKa = candidate.nSigTofKa1(); - float valueTofNSigmaPi; - float valueTpcTofNSigmaPr; - const float valueTpcTofNSigmaKa = candidate.tpcTofNSigmaKa1(); - float valueTpcTofNSigmaPi; - if (candFlag == 0) { - chi2primProton = candidate.kfChi2PrimProng0(); - chi2primPion = candidate.kfChi2PrimProng2(); - dcaProtonKaon = candidate.kfDcaProng0Prong1(); - dcaPionKaon = candidate.kfDcaProng1Prong2(); - chi2GeoProtonKaon = candidate.kfChi2GeoProng0Prong1(); - chi2GeoPionKaon = candidate.kfChi2GeoProng1Prong2(); - mass = candidate.kfMassPKPi(); - valueTpcNSigmaPr = candidate.nSigTpcPr0(); - valueTpcNSigmaPi = candidate.nSigTpcPi2(); - valueTofNSigmaPr = candidate.nSigTofPr0(); - valueTofNSigmaPi = candidate.nSigTofPi2(); - valueTpcTofNSigmaPr = candidate.tpcTofNSigmaPr0(); - valueTpcTofNSigmaPi = candidate.tpcTofNSigmaPi2(); - } else { - chi2primProton = candidate.kfChi2PrimProng2(); - chi2primPion = candidate.kfChi2PrimProng0(); - dcaProtonKaon = candidate.kfDcaProng1Prong2(); - dcaPionKaon = candidate.kfDcaProng0Prong1(); - chi2GeoProtonKaon = candidate.kfChi2GeoProng1Prong2(); - chi2GeoPionKaon = candidate.kfChi2GeoProng0Prong1(); - mass = candidate.kfMassPiKP(); - valueTpcNSigmaPr = candidate.nSigTpcPr2(); - valueTpcNSigmaPi = candidate.nSigTpcPi0(); - valueTofNSigmaPr = candidate.nSigTofPr2(); - valueTofNSigmaPi = candidate.nSigTofPi0(); - valueTpcTofNSigmaPr = candidate.tpcTofNSigmaPr2(); - valueTpcTofNSigmaPi = candidate.tpcTofNSigmaPi0(); - } - const float svX = candidate.xSecondaryVertex(); - const float svY = candidate.ySecondaryVertex(); - const float svZ = candidate.zSecondaryVertex(); - const float svErrX = candidate.kfXError(); - const float svErrY = candidate.kfYError(); - const float svErrZ = candidate.kfZError(); - const float pvErrX = candidate.kfXPVError(); - const float pvErrY = candidate.kfYPVError(); - const float pvErrZ = candidate.kfZPVError(); - const float chi2primKaon = candidate.kfChi2PrimProng1(); - const float dcaProtonPion = candidate.kfDcaProng0Prong2(); - const float chi2GeoProtonPion = candidate.kfChi2GeoProng0Prong2(); - const float chi2Geo = candidate.kfChi2Geo(); - const float chi2Topo = candidate.kfChi2Topo(); - const float decayLength = candidate.kfDecayLength(); - const float dl = candidate.kfDecayLengthError(); - const float pt = std::sqrt(candidate.kfPx() * candidate.kfPx() + candidate.kfPy() * candidate.kfPy()); - const float deltaPt = std::sqrt(candidate.kfPx() * candidate.kfPx() * candidate.kfErrorPx() * candidate.kfErrorPx() + - candidate.kfPy() * candidate.kfPy() * candidate.kfErrorPy() * candidate.kfErrorPy()) / - pt; - const float p = std::sqrt(pt * pt + candidate.kfPz() * candidate.kfPz()); - const float deltaP = std::sqrt(pt * pt * deltaPt * deltaPt + - candidate.kfPz() * candidate.kfPz() * candidate.kfErrorPz() * candidate.kfErrorPz()) / - p; - const float lifetime = decayLength * MassLambdaCPlus / LightSpeedCm2PS / p; - const float deltaT = dl * MassLambdaCPlus / LightSpeedCm2PS / p; - rowCandidateKF( - svX, svY, svZ, svErrX, svErrY, svErrZ, - pvErrX, pvErrY, pvErrZ, - chi2primProton, chi2primKaon, chi2primPion, - dcaProtonKaon, dcaProtonPion, dcaPionKaon, - chi2GeoProtonKaon, chi2GeoProtonPion, chi2GeoPionKaon, - chi2Geo, chi2Topo, decayLength, dl, decayLength / dl, lifetime, deltaT, - mass, p, pt, deltaP, deltaPt, - functionSelection, sigbgstatus, - collision.multNTracksPV(), - valueTpcNSigmaPr, - valueTpcNSigmaKa, - valueTpcNSigmaPi, - valueTofNSigmaPr, - valueTofNSigmaKa, - valueTofNSigmaPi, - valueTpcTofNSigmaPr, - valueTpcTofNSigmaKa, - valueTpcTofNSigmaPi); + fillKFTable(candidate, collision, candFlag, functionSelection, sigbgstatus); } if (fillCandidateMcTable) { float p, pt, svX, svY, svZ, pvX, pvY, pvZ, decayLength, lifetime; @@ -911,61 +1020,15 @@ struct HfTreeCreatorLcToPKPi { TracksWPid const&, aod::BCs const&) { - // Filling event properties - rowCandidateFullEvents.reserve(collisions.size()); - for (const auto& collision : collisions) { + constexpr bool IsMc = false; - float centFT0A = -1.f; - float centFT0C = -1.f; - float centFT0M = -1.f; - float centFV0A = -1.f; - float centFDDM = -1.f; - if constexpr (useCentrality) { - centFT0A = collision.centFT0A(); - centFT0C = collision.centFT0C(); - centFT0M = collision.centFT0M(); - centFV0A = collision.centFV0A(); - centFDDM = collision.centFDDM(); - } + fillEventProperties(collisions); - rowCandidateFullEvents( - collision.globalIndex(), - -1, - collision.numContrib(), - collision.posX(), - collision.posY(), - collision.posZ(), - std::sqrt(collision.covXX()), - std::sqrt(collision.covYY()), - std::sqrt(collision.covZZ()), - UndefValueFloat, - UndefValueFloat, - UndefValueFloat, - 0, - collision.bc().runNumber(), - centFT0A, - centFT0C, - centFT0M, - centFV0A, - centFDDM, - collision.multZeqNTracksPV(), - collision.multNTracksPV()); - } + const size_t candidatesSize = candidates.size(); + reserveTables(candidatesSize, IsMc); // Filling candidate properties - if constexpr (reconstructionType == aod::hf_cand::VertexerType::DCAFitter) { - if (fillCandidateLiteTable) { - rowCandidateLite.reserve(candidates.size() * 2); - } else { - rowCandidateFull.reserve(candidates.size() * 2); - } - } else { - rowCandidateKF.reserve(candidates.size() * 2); - } - if (fillCollIdTable) { - /// save also candidate collision indices - rowCollisionId.reserve(candidates.size()); - } + for (const auto& candidate : candidates) { float ptProng0 = candidate.ptProng0(); auto collision = candidate.template collision_as(); @@ -973,236 +1036,14 @@ struct HfTreeCreatorLcToPKPi { double pseudoRndm = ptProng0 * 1000. - static_cast(ptProng0 * 1000); const int functionSelection = candFlag == 0 ? candidate.isSelLcToPKPi() : candidate.isSelLcToPiKP(); if (functionSelection >= selectionFlagLc && (candidate.pt() > downSampleBkgPtMax || (pseudoRndm < downSampleBkgFactor && candidate.pt() < downSampleBkgPtMax))) { - float functionInvMass, functionInvMassKPi; - if constexpr (reconstructionType == aod::hf_cand::VertexerType::DCAFitter) { - functionInvMass = candFlag == 0 ? hfHelper.invMassLcToPKPi(candidate) : hfHelper.invMassLcToPiKP(candidate); - functionInvMassKPi = candFlag == 0 ? hfHelper.invMassKPiPairLcToPKPi(candidate) : hfHelper.invMassKPiPairLcToPiKP(candidate); - } else { - functionInvMass = candFlag == 0 ? candidate.kfMassPKPi() : candidate.kfMassPiKP(); - functionInvMassKPi = candFlag == 0 ? candidate.kfMassKPi() : candidate.kfMassPiK(); - } - const float functionCt = hfHelper.ctLc(candidate); - const float functionY = hfHelper.yLc(candidate); - const float functionE = hfHelper.eLc(candidate); if (fillCandidateLiteTable) { - rowCandidateLite( - candidate.posX(), - candidate.posY(), - candidate.posZ(), - candidate.nProngsContributorsPV(), - candidate.bitmapProngsContributorsPV(), - candidate.chi2PCA(), - candidate.decayLength(), - candidate.decayLengthXY(), - candidate.ptProng0(), - candidate.ptProng1(), - candidate.ptProng2(), - candidate.impactParameter0(), - candidate.impactParameter1(), - candidate.impactParameter2(), - candidate.nSigTpcPi0(), - candidate.nSigTpcPr0(), - candidate.nSigTofPi0(), - candidate.nSigTofPr0(), - candidate.nSigTpcKa1(), - candidate.nSigTofKa1(), - candidate.nSigTpcPi2(), - candidate.nSigTpcPr2(), - candidate.nSigTofPi2(), - candidate.nSigTofPr2(), - candidate.tpcTofNSigmaPi0(), - candidate.tpcTofNSigmaPr0(), - candidate.tpcTofNSigmaKa1(), - candidate.tpcTofNSigmaPi2(), - candidate.tpcTofNSigmaPr2(), - 1 << candFlag, - functionInvMass, - candidate.pt(), - candidate.cpa(), - candidate.cpaXY(), - functionCt, - candidate.eta(), - candidate.phi(), - functionY, - 0., - 0., - 0., - -1, - functionInvMassKPi); - - if (fillCollIdTable) { - /// save also candidate collision indices - rowCollisionId(candidate.collisionId()); - } - + fillLiteTable(candidate, candFlag); } else { - rowCandidateFull( - candidate.collisionId(), - candidate.posX(), - candidate.posY(), - candidate.posZ(), - candidate.nProngsContributorsPV(), - candidate.bitmapProngsContributorsPV(), - candidate.xSecondaryVertex(), - candidate.ySecondaryVertex(), - candidate.zSecondaryVertex(), - candidate.errorDecayLength(), - candidate.errorDecayLengthXY(), - candidate.chi2PCA(), - candidate.rSecondaryVertex(), - candidate.decayLength(), - candidate.decayLengthXY(), - candidate.decayLengthNormalised(), - candidate.decayLengthXYNormalised(), - candidate.impactParameterNormalised0(), - candidate.ptProng0(), - RecoDecay::p(candidate.pxProng0(), candidate.pyProng0(), candidate.pzProng0()), - candidate.impactParameterNormalised1(), - candidate.ptProng1(), - RecoDecay::p(candidate.pxProng1(), candidate.pyProng1(), candidate.pzProng1()), - candidate.impactParameterNormalised2(), - candidate.ptProng2(), - RecoDecay::p(candidate.pxProng2(), candidate.pyProng2(), candidate.pzProng2()), - candidate.pxProng0(), - candidate.pyProng0(), - candidate.pzProng0(), - candidate.pxProng1(), - candidate.pyProng1(), - candidate.pzProng1(), - candidate.pxProng2(), - candidate.pyProng2(), - candidate.pzProng2(), - candidate.impactParameter0(), - candidate.impactParameter1(), - candidate.impactParameter2(), - candidate.errorImpactParameter0(), - candidate.errorImpactParameter1(), - candidate.errorImpactParameter2(), - candidate.nSigTpcPi0(), - candidate.nSigTpcPr0(), - candidate.nSigTofPi0(), - candidate.nSigTofPr0(), - candidate.nSigTpcKa1(), - candidate.nSigTofKa1(), - candidate.nSigTpcPi2(), - candidate.nSigTpcPr2(), - candidate.nSigTofPi2(), - candidate.nSigTofPr2(), - candidate.tpcTofNSigmaPi0(), - candidate.tpcTofNSigmaPr0(), - candidate.tpcTofNSigmaKa1(), - candidate.tpcTofNSigmaPi2(), - candidate.tpcTofNSigmaPr2(), - 1 << candFlag, - functionInvMass, - candidate.pt(), - candidate.p(), - candidate.cpa(), - candidate.cpaXY(), - functionCt, - candidate.eta(), - candidate.phi(), - functionY, - functionE, - 0., - 0., - 0., - candidate.globalIndex(), - -1, - functionInvMassKPi); + fillFullTable(candidate, candFlag); } if constexpr (reconstructionType == aod::hf_cand::VertexerType::KfParticle) { - float chi2primProton; - float chi2primPion; - float dcaProtonKaon; - float dcaPionKaon; - float chi2GeoProtonKaon; - float chi2GeoPionKaon; - float mass; - float valueTpcNSigmaPr; - const float valueTpcNSigmaKa = candidate.nSigTpcKa1(); - float valueTpcNSigmaPi; - float valueTofNSigmaPr; - const float valueTofNSigmaKa = candidate.nSigTofKa1(); - float valueTofNSigmaPi; - float valueTpcTofNSigmaPr; - const float valueTpcTofNSigmaKa = candidate.tpcTofNSigmaKa1(); - float valueTpcTofNSigmaPi; - if (candFlag == 0) { - chi2primProton = candidate.kfChi2PrimProng0(); - chi2primPion = candidate.kfChi2PrimProng2(); - dcaProtonKaon = candidate.kfDcaProng0Prong1(); - dcaPionKaon = candidate.kfDcaProng1Prong2(); - chi2GeoProtonKaon = candidate.kfChi2GeoProng0Prong1(); - chi2GeoPionKaon = candidate.kfChi2GeoProng1Prong2(); - mass = candidate.kfMassPKPi(); - valueTpcNSigmaPr = candidate.nSigTpcPr0(); - valueTpcNSigmaPi = candidate.nSigTpcPi2(); - valueTofNSigmaPr = candidate.nSigTofPr0(); - valueTofNSigmaPi = candidate.nSigTofPi2(); - valueTpcTofNSigmaPr = candidate.tpcTofNSigmaPr0(); - valueTpcTofNSigmaPi = candidate.tpcTofNSigmaPi2(); - } else { - chi2primProton = candidate.kfChi2PrimProng2(); - chi2primPion = candidate.kfChi2PrimProng0(); - dcaProtonKaon = candidate.kfDcaProng1Prong2(); - dcaPionKaon = candidate.kfDcaProng0Prong1(); - chi2GeoProtonKaon = candidate.kfChi2GeoProng1Prong2(); - chi2GeoPionKaon = candidate.kfChi2GeoProng0Prong1(); - mass = candidate.kfMassPiKP(); - valueTpcNSigmaPr = candidate.nSigTpcPr2(); - valueTpcNSigmaPi = candidate.nSigTpcPi0(); - valueTofNSigmaPr = candidate.nSigTofPr2(); - valueTofNSigmaPi = candidate.nSigTofPi0(); - valueTpcTofNSigmaPr = candidate.tpcTofNSigmaPr2(); - valueTpcTofNSigmaPi = candidate.tpcTofNSigmaPi0(); - } - const float x = candidate.xSecondaryVertex(); - const float y = candidate.ySecondaryVertex(); - const float z = candidate.zSecondaryVertex(); - const float errX = candidate.kfXError(); - const float errY = candidate.kfYError(); - const float errZ = candidate.kfZError(); - const float errPVX = candidate.kfXPVError(); - const float errPVY = candidate.kfYPVError(); - const float errPVZ = candidate.kfZPVError(); - const float chi2primKaon = candidate.kfChi2PrimProng1(); - const float dcaProtonPion = candidate.kfDcaProng0Prong2(); - const float chi2GeoProtonPion = candidate.kfChi2GeoProng0Prong2(); - const float chi2Geo = candidate.kfChi2Geo(); - const float chi2Topo = candidate.kfChi2Topo(); - const float l = candidate.kfDecayLength(); - const float dl = candidate.kfDecayLengthError(); - const float pt = std::sqrt(candidate.kfPx() * candidate.kfPx() + candidate.kfPy() * candidate.kfPy()); - const float deltaPt = std::sqrt(candidate.kfPx() * candidate.kfPx() * candidate.kfErrorPx() * candidate.kfErrorPx() + - candidate.kfPy() * candidate.kfPy() * candidate.kfErrorPy() * candidate.kfErrorPy()) / - pt; - const float p = std::sqrt(pt * pt + candidate.kfPz() * candidate.kfPz()); - const float deltaP = std::sqrt(pt * pt * deltaPt * deltaPt + - candidate.kfPz() * candidate.kfPz() * candidate.kfErrorPz() * candidate.kfErrorPz()) / - p; - const float t = l * MassLambdaCPlus / LightSpeedCm2PS / p; - const float deltaT = dl * MassLambdaCPlus / LightSpeedCm2PS / p; - rowCandidateKF( - x, y, z, errX, errY, errZ, - errPVX, errPVY, errPVZ, - chi2primProton, chi2primKaon, chi2primPion, - dcaProtonKaon, dcaProtonPion, dcaPionKaon, - chi2GeoProtonKaon, chi2GeoProtonPion, chi2GeoPionKaon, - chi2Geo, chi2Topo, l, dl, l / dl, t, deltaT, - mass, p, pt, deltaP, deltaPt, - functionSelection, UndefValueInt, - collision.multNTracksPV(), - valueTpcNSigmaPr, - valueTpcNSigmaKa, - valueTpcNSigmaPi, - valueTofNSigmaPr, - valueTofNSigmaKa, - valueTofNSigmaPi, - valueTpcTofNSigmaPr, - valueTpcTofNSigmaKa, - valueTpcTofNSigmaPi); + fillKFTable(candidate, collision, candFlag, functionSelection, UndefValueInt); } } }; From 4d2980b3e17423bc7f489de59c43bbf6a01704f5 Mon Sep 17 00:00:00 2001 From: Fabrizio Date: Tue, 6 May 2025 11:14:22 +0200 Subject: [PATCH 1196/1650] [Infrastructure] Add Grazia Luparello in HF codeowners (new convener) (#10933) --- CODEOWNERS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index 82da305e2ea..ddfcd4eda46 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -38,7 +38,7 @@ /PWGEM @alibuild @feisenhu @dsekihat @ivorobye /PWGEM/Dilepton @alibuild @mikesas @rbailhac @dsekihat @ivorobye @feisenhu /PWGEM/PhotonMeson @alibuild @mikesas @rbailhac @m-c-danisch @novitzky @mhemmer-cern @dsekihat -/PWGHF @alibuild @vkucera @fcolamar @fgrosa @fcatalan92 @mfaggin @mmazzilli @deepathoms @NicoleBastid @hahassan7 @jpxrk @apalasciano @zhangbiao-phy +/PWGHF @alibuild @vkucera @fcolamar @fgrosa @fcatalan92 @mfaggin @mmazzilli @deepathoms @NicoleBastid @hahassan7 @jpxrk @apalasciano @zhangbiao-phy @gluparel # PWG-LF /PWGLF @alibuild @sustripathy @skundu692 /PWGLF/Tasks/GlobalEventProperties @alibuild @sustripathy @skundu692 @gbencedi @abmodak @@ -63,7 +63,7 @@ /Tutorials/PWGCF @alibuild @jgrosseo @saganatt @victor-gonzalez @zchochul /Tutorials/PWGDQ @alibuild @iarsene @dsekihat @feisenhu @lucamicheletti93 /Tutorials/PWGEM @alibuild @mikesas @rbailhac @dsekihat @ivorobye @feisenhu -/Tutorials/PWGHF @alibuild @vkucera @fcolamar @fgrosa +/Tutorials/PWGHF @alibuild @vkucera @fcolamar @fgrosa @gluparel /Tutorials/PWGJE @alibuild @lhavener @maoyx @nzardosh @mfasDa @fjonasALICE /Tutorials/PWGLF @alibuild @alcaliva @lbariogl @chiarapinto @BongHwi @lbarnby @ercolessi @iravasen @njacazio @romainschotter @skundu692 /Tutorials/PWGMM @alibuild @aalkin @ddobrigk From 156c66ba9d4d30e54a6806b54d0cf592e8d376c9 Mon Sep 17 00:00:00 2001 From: Katarzyna <116073883+kgwizdzi@users.noreply.github.com> Date: Tue, 6 May 2025 15:38:57 +0200 Subject: [PATCH 1197/1650] [PWGCF] FemtoUniverse: D0 task update (#11098) --- .../Core/FemtoUniverseAngularContainer.h | 2 +- .../Tasks/femtoUniversePairTaskTrackD0.cxx | 12 +++--------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseAngularContainer.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseAngularContainer.h index a6b80611649..4d1f65c59fe 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseAngularContainer.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseAngularContainer.h @@ -206,7 +206,7 @@ class FemtoUniverseAngularContainer const float mT = FemtoUniverseMath::getmT(part1, mMassOne, part2, mMassTwo); if (mHistogramRegistry) { - setPairBase(femtoObs, mT, part1, part2, mult, use3dplots); + setPairBase(femtoObs, mT, part1, part2, mult, use3dplots, weight); if constexpr (isMC) { if (part1.has_fdMCParticle() && part2.has_fdMCParticle()) { diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx index 80fc4f54218..909b0ec06bc 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx @@ -141,13 +141,7 @@ struct FemtoUniversePairTaskTrackD0 { Configurable confChooseD0trackCorr{"confChooseD0trackCorr", 0, "If 0 correlations with D0s, if 1 with D0bars"}; // Efficiency - struct : o2::framework::ConfigurableGroup { - Configurable confEfficiencyTrackPath{"confEfficiencyTrackPath", "", "Local path to hadron efficiency TH2F file"}; - Configurable confEfficiencyD0Path{"confEfficiencyD0Path", "", "Local path to D0 efficiency TH2F file"}; - Configurable confEfficiencyTrackTimestamp{"confEfficiencyTrackTimestamp", 0, "(int64_t) Timestamp for hadron"}; - Configurable confEfficiencyD0Timestamp{"confEfficiencyD0Timestamp", 0, "(int64_t) Timestamp for D0"}; - Configurable doEfficiencyCorr{"doEfficiencyCorr", false, "Apply efficiency corrections"}; - } ConfEff; + Configurable doEfficiencyCorr{"doEfficiencyCorr", false, "Apply efficiency corrections"}; /// Partitions for particle 1 Partition partsTrack = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kTrack)) && (aod::femtouniverseparticle::sign == int8_t(ConfTrack.confTrackSign)) && (aod::femtouniverseparticle::pt > ConfTrack.confTrackLowPtCut) && (aod::femtouniverseparticle::pt < ConfTrack.confTrackHighPtCut); @@ -850,7 +844,7 @@ struct FemtoUniversePairTaskTrackD0 { } // Efficiency weight = 1.0f; - if (ConfEff.doEfficiencyCorr) { + if (doEfficiencyCorr) { weight = efficiencyCalculator.getWeight(ParticleNo::ONE, track.pt()) * efficiencyCalculator.getWeight(ParticleNo::TWO, d0candidate.pt()); } sameEventAngularCont.setPair(track, d0candidate, multCol, ConfBothTracks.confUse3D, weight); @@ -979,7 +973,7 @@ struct FemtoUniversePairTaskTrackD0 { } // Efficiency weight = 1.0f; - if (ConfEff.doEfficiencyCorr) { + if (doEfficiencyCorr) { weight = efficiencyCalculator.getWeight(ParticleNo::ONE, track.pt()) * efficiencyCalculator.getWeight(ParticleNo::TWO, d0candidate.pt()); } From 3e0b5a1ed8d86f2a5520049166531fa3b03ea412 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Tue, 6 May 2025 17:47:32 +0200 Subject: [PATCH 1198/1650] [ALICE3] A3RICH: inherit LUTs from OTF tracker (#11096) --- ALICE3/TableProducer/OTF/CMakeLists.txt | 2 +- ...nTheFlyRICHPID.cxx => onTheFlyRichPid.cxx} | 92 +++++++++++-------- 2 files changed, 55 insertions(+), 39 deletions(-) rename ALICE3/TableProducer/OTF/{onTheFlyRICHPID.cxx => onTheFlyRichPid.cxx} (95%) diff --git a/ALICE3/TableProducer/OTF/CMakeLists.txt b/ALICE3/TableProducer/OTF/CMakeLists.txt index b7d40692770..10f68429680 100644 --- a/ALICE3/TableProducer/OTF/CMakeLists.txt +++ b/ALICE3/TableProducer/OTF/CMakeLists.txt @@ -20,6 +20,6 @@ o2physics_add_dpl_workflow(onthefly-tofpid COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(onthefly-richpid - SOURCES onTheFlyRICHPID.cxx + SOURCES onTheFlyRichPid.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2::DetectorsBase O2Physics::AnalysisCore O2::ReconstructionDataFormats O2::DetectorsCommonDataFormats O2Physics::ALICE3Core COMPONENT_NAME Analysis) diff --git a/ALICE3/TableProducer/OTF/onTheFlyRICHPID.cxx b/ALICE3/TableProducer/OTF/onTheFlyRichPid.cxx similarity index 95% rename from ALICE3/TableProducer/OTF/onTheFlyRICHPID.cxx rename to ALICE3/TableProducer/OTF/onTheFlyRichPid.cxx index 42a0fbbc277..f7cd2e62451 100644 --- a/ALICE3/TableProducer/OTF/onTheFlyRICHPID.cxx +++ b/ALICE3/TableProducer/OTF/onTheFlyRichPid.cxx @@ -8,13 +8,33 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. - -// -// Task to add a table of track parameters propagated to the primary vertex -// +/// +/// \file onTheFlyRichPid.cxx +/// +/// \brief This task goes straight from a combination of track table and mcParticles +/// and a projective bRICH configuration to a table of TOF NSigmas for the particles +/// being analysed. It currently contemplates 5 particle types: +/// electrons, pions, kaons, protons and muons +/// +/// More particles could be added but would have to be added to the LUT +/// being used in the onTheFly tracker task. +/// +/// \warning Geometry parameters are configurable, but resolution values should be adapted. +/// Since angular resolution depends on the specific geometric details, it is better to +/// calculate it from full simulation and add new input. Alternatively, an analytical +/// expression can be provided as a function of the main parameters. +/// Latest version: analytical parametrization of angular resolution !!! +/// +/// \author David Dobrigkeit Chinellato, UNICAMP +/// \author Nicola Nicassio, University and INFN Bari +/// \since May 22, 2024 +/// #include #include +#include +#include +#include #include @@ -42,28 +62,9 @@ #include "TString.h" #include "ALICE3/DataModel/OTFRICH.h" #include "DetectorsVertexing/HelixHelper.h" - #include "TableHelper.h" #include "ALICE3/Core/DelphesO2TrackSmearer.h" -/// \file onTheFlyRichPid.cxx -/// -/// \brief This task goes straight from a combination of track table and mcParticles -/// and a projective bRICH configuration to a table of TOF NSigmas for the particles -/// being analysed. It currently contemplates 5 particle types: -/// electrons, pions, kaons, protons and muons. -/// -/// More particles could be added but would have to be added to the LUT -/// being used in the onTheFly tracker task. -/// -/// \warning Geometry parameters are configurable, but resolution values should be adapted. -/// Since angular resolution depends on the specific geometric details, it is better to -/// calculate it from full simulation and add new input. Alternatively, an analytical -/// expression can be provided as a function of the main parameters. -/// Latest version: analytical parametrization of angular resolution !!! -/// -/// \author David Dobrigkeit Chinellato, UNICAMP, Nicola Nicassio, University and INFN Bari - using namespace o2; using namespace o2::framework; using namespace o2::constants::math; @@ -143,11 +144,13 @@ struct OnTheFlyRichPid { Configurable bRICHPixelSize{"bRICHPixelSize", 0.1, "barrel RICH pixel size (cm)"}; Configurable bRichGapRefractiveIndex{"bRichGapRefractiveIndex", 1.000283, "barrel RICH gap refractive index"}; - Configurable lutEl{"lutEl", "lutCovm.el.dat", "LUT for electrons"}; - Configurable lutMu{"lutMu", "lutCovm.mu.dat", "LUT for muons"}; - Configurable lutPi{"lutPi", "lutCovm.pi.dat", "LUT for pions"}; - Configurable lutKa{"lutKa", "lutCovm.ka.dat", "LUT for kaons"}; - Configurable lutPr{"lutPr", "lutCovm.pr.dat", "LUT for protons"}; + struct : ConfigurableGroup { + Configurable lutEl{"lutEl", "inherit", "LUT for electrons (if inherit, inherits from otf tracker task)"}; + Configurable lutMu{"lutMu", "inherit", "LUT for muons (if inherit, inherits from otf tracker task)"}; + Configurable lutPi{"lutPi", "inherit", "LUT for pions (if inherit, inherits from otf tracker task)"}; + Configurable lutKa{"lutKa", "inherit", "LUT for kaons (if inherit, inherits from otf tracker task)"}; + Configurable lutPr{"lutPr", "inherit", "LUT for protons (if inherit, inherits from otf tracker task)"}; + } simConfig; o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; @@ -257,9 +260,7 @@ struct OnTheFlyRichPid { aerogel_rindex[2 * i_central_mirror - i] = bRichRefractiveIndexSector[i - i_central_mirror]; mProjectiveLengthInner = R_min * t; // <-- At the end of the loop this will be the maximum Z } - } - // Even number of sectors - else { + } else { // Even number of sectors float two_half_gap = 1.0; int i_central_mirror = static_cast((number_of_sectors_in_z) / 2.0); float m_val = std::tan(0.0); @@ -315,18 +316,33 @@ struct OnTheFlyRichPid { // std::cout << std::endl << std::endl; } - void init(o2::framework::InitContext& /*initContext*/) + void init(o2::framework::InitContext& initContext) { pRandomNumberGenerator.SetSeed(0); // fully randomize + // Check if inheriting the LUT configuration + auto configLutPath = [&](Configurable& lut) { + if (lut.value != "inherit") { + return; + } + if (!getTaskOptionValue(initContext, "on-the-fly-tracker", lut.name, lut.value, true)) { + LOG(fatal) << "Could not get " << lut.name << " from on-the-fly-tracker task"; + } + }; + configLutPath(simConfig.lutEl); + configLutPath(simConfig.lutMu); + configLutPath(simConfig.lutPi); + configLutPath(simConfig.lutKa); + configLutPath(simConfig.lutPr); + // Load LUT for pt and eta smearing if (flagIncludeTrackAngularRes && flagRICHLoadDelphesLUTs) { std::map mapPdgLut; - const char* lutElChar = lutEl->c_str(); - const char* lutMuChar = lutMu->c_str(); - const char* lutPiChar = lutPi->c_str(); - const char* lutKaChar = lutKa->c_str(); - const char* lutPrChar = lutPr->c_str(); + const char* lutElChar = simConfig.lutEl->c_str(); + const char* lutMuChar = simConfig.lutMu->c_str(); + const char* lutPiChar = simConfig.lutPi->c_str(); + const char* lutKaChar = simConfig.lutKa->c_str(); + const char* lutPrChar = simConfig.lutPr->c_str(); LOGF(info, "Will load electron lut file ..: %s for RICH PID", lutElChar); LOGF(info, "Will load muon lut file ......: %s for RICH PID", lutMuChar); @@ -340,7 +356,7 @@ struct OnTheFlyRichPid { mapPdgLut.insert(std::make_pair(321, lutKaChar)); mapPdgLut.insert(std::make_pair(2212, lutPrChar)); - for (auto e : mapPdgLut) { + for (const auto& e : mapPdgLut) { if (!mSmearer.loadTable(e.first, e.second)) { LOG(fatal) << "Having issue with loading the LUT " << e.first << " " << e.second; } From f64cfb47d0c728d7caf5251a843a4e28d9f5cf31 Mon Sep 17 00:00:00 2001 From: altsybee Date: Tue, 6 May 2025 19:23:57 +0200 Subject: [PATCH 1199/1650] [DPG] add nTPConlyTracks vs occupancy histograms (#11103) --- DPG/Tasks/AOTEvent/eventSelectionQa.cxx | 27 ++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/DPG/Tasks/AOTEvent/eventSelectionQa.cxx b/DPG/Tasks/AOTEvent/eventSelectionQa.cxx index 80819b894aa..9d9dc544b58 100644 --- a/DPG/Tasks/AOTEvent/eventSelectionQa.cxx +++ b/DPG/Tasks/AOTEvent/eventSelectionQa.cxx @@ -346,12 +346,15 @@ struct EventSelectionQaTask { histos.add("occupancyQA/hOccupancyByFT0CvsByTracks", "", kTH2D, {{150, 0, 15000}, {150, 0, 150000}}); // 3D histograms: nGlobalTracks with cls567 as y-axis, V0A as x-axis: - const AxisSpec axisNtracks{160, -0.5, 4000 - 0.5, "n tracks"}; - const AxisSpec axisNtracksGlobal{120, -0.5, 3000 - 0.5, "n tracks"}; + const AxisSpec axisNtracksPV{160, -0.5, 4000 - 0.5, "n ITS PV tracks"}; + const AxisSpec axisNtracksPVTPC{120, -0.5, 3000 - 0.5, "n ITS-TPC PV tracks"}; + const AxisSpec axisNtracksTPConly{120, -0.5, 6000 - 0.5, "n TPC-only tracks"}; const AxisSpec axisMultV0AForOccup{20, 0., static_cast(200000), "mult V0A"}; const AxisSpec axisOccupancyTracks{150, 0., 15000, "occupancy (n ITS tracks weighted)"}; - histos.add("occupancyQA/hNumTracksPV_vs_V0A_vs_occupancy", "", kTH3F, {axisMultV0AForOccup, axisNtracks, axisOccupancyTracks}); - histos.add("occupancyQA/hNumTracksPVTPC_vs_V0A_vs_occupancy", "", kTH3F, {axisMultV0AForOccup, axisNtracksGlobal, axisOccupancyTracks}); + histos.add("occupancyQA/hNumTracksPV_vs_V0A_vs_occupancy", "", kTH3F, {axisMultV0AForOccup, axisNtracksPV, axisOccupancyTracks}); + histos.add("occupancyQA/hNumTracksPVTPC_vs_V0A_vs_occupancy", "", kTH3F, {axisMultV0AForOccup, axisNtracksPVTPC, axisOccupancyTracks}); + histos.add("occupancyQA/hNumTracksTPConly_vs_V0A_vs_occupancy", "", kTH3F, {axisMultV0AForOccup, axisNtracksTPConly, axisOccupancyTracks}); + histos.add("occupancyQA/hNumTracksTPConlyNoITS_vs_V0A_vs_occupancy", "", kTH3F, {axisMultV0AForOccup, axisNtracksTPConly, axisOccupancyTracks}); histos.add("occupancyQA/hITSTracks_ev1_vs_ev2_2coll_in_ROF", ";nITStracks event #1;nITStracks event #2", kTH2D, {{200, 0., 6000}, {200, 0., 6000}}); histos.add("occupancyQA/hITSTracks_ev1_vs_ev2_2coll_in_ROF_UPC", ";nITStracks event #1;nITStracks event #2", kTH2D, {{41, -0.5, 40.5}, {41, -0.5, 40.5}}); @@ -1108,10 +1111,22 @@ struct EventSelectionQaTask { // count tracks of different types auto tracksGrouped = tracks.sliceBy(perCollision, colIndex); int nPV = 0; + int nTPConly = 0; + // int nTPConlyWithDeDxCut = 0; + int nTPConlyNoITS = 0; int nContributorsAfterEtaTPCCuts = 0; bool isTVX = col.selection_bit(kIsTriggerTVX); for (const auto& track : tracksGrouped) { int trackBcDiff = bcDiff + track.trackTime() / o2::constants::lhc::LHCBunchSpacingNS; + + if (track.hasTPC() && std::fabs(track.eta()) < 0.8 && track.pt() > 0.2 && track.tpcNClsFound() > 50 && track.tpcNClsCrossedRows() > 50 && track.tpcChi2NCl() < 4) { + nTPConly++; + // if (track.tpcSignal() > 20) + // nTPConlyWithDeDxCut++; + if (!track.hasITS()) + nTPConlyNoITS++; + } + if (!track.isPVContributor()) continue; @@ -1119,7 +1134,7 @@ struct EventSelectionQaTask { vTracksITS567perColl[colIndex]++; // high-quality contributors for ROF border QA and occupancy study - if (isTVX && std::fabs(track.eta()) < 0.8 && track.pt() > 0.2 && track.itsNCls() >= 5) { + if (std::fabs(track.eta()) < 0.8 && track.pt() > 0.2 && track.itsNCls() >= 5) { nPV++; if (track.tpcNClsFound() > 70 && track.tpcNClsCrossedRows() > 80 && track.itsChi2NCl() < 36 && track.tpcChi2NCl() < 4) { nContributorsAfterEtaTPCCuts++; @@ -1154,6 +1169,8 @@ struct EventSelectionQaTask { histos.fill(HIST("occupancyQA/hOccupancyByFT0CvsByTracks"), occupancyByTracks, occupancyByFT0C); histos.fill(HIST("occupancyQA/hNumTracksPV_vs_V0A_vs_occupancy"), multV0A, nPV, occupancyByTracks); histos.fill(HIST("occupancyQA/hNumTracksPVTPC_vs_V0A_vs_occupancy"), multV0A, nContributorsAfterEtaTPCCuts, occupancyByTracks); + histos.fill(HIST("occupancyQA/hNumTracksTPConly_vs_V0A_vs_occupancy"), multV0A, nTPConly, occupancyByTracks); + histos.fill(HIST("occupancyQA/hNumTracksTPConlyNoITS_vs_V0A_vs_occupancy"), multV0A, nTPConlyNoITS, occupancyByTracks); // dE/dx QA for a narrow pT bin for (const auto& track : tracksGrouped) { From bf651dc870da999603f2ff10e1697ceed624804f Mon Sep 17 00:00:00 2001 From: nepeivodaRS <94179174+nepeivodaRS@users.noreply.github.com> Date: Tue, 6 May 2025 20:11:19 +0200 Subject: [PATCH 1200/1650] [PWGLF] switch TH1F to TH1D for high-count histograms (#11104) --- .../Strangeness/cascqaanalysis.cxx | 78 ++++++++++--------- .../Tasks/Strangeness/derivedupcanalysis.cxx | 70 ++++++++--------- 2 files changed, 75 insertions(+), 73 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/cascqaanalysis.cxx b/PWGLF/TableProducer/Strangeness/cascqaanalysis.cxx index a46f977c93a..6a3310d316f 100644 --- a/PWGLF/TableProducer/Strangeness/cascqaanalysis.cxx +++ b/PWGLF/TableProducer/Strangeness/cascqaanalysis.cxx @@ -48,6 +48,25 @@ struct Cascqaanalysis { HistogramRegistry registry{"registry"}; + // Axes + ConfigurableAxis ptAxis{"ptAxis", {200, 0.0f, 10.0f}, "#it{p}_{T} (GeV/#it{c})"}; + ConfigurableAxis rapidityAxis{"rapidityAxis", {200, -2.0f, 2.0f}, "y"}; + ConfigurableAxis centFT0MAxis{"centFT0MAxis", + {VARIABLE_WIDTH, 0., 0.01, 0.05, 0.1, 0.5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 105.5}, + "FT0M (%)"}; + ConfigurableAxis centFV0AAxis{"centFV0AAxis", + {VARIABLE_WIDTH, 0., 0.01, 0.05, 0.1, 0.5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 105.5}, + "FV0A (%)"}; + ConfigurableAxis eventTypeAxis{"eventTypeAxis", {3, -0.5f, 2.5f}, "Event Type"}; + + ConfigurableAxis nAssocCollAxis{"nAssocCollAxis", {5, -0.5f, 4.5f}, "N_{assoc.}"}; + ConfigurableAxis nChargedFT0MGenAxis{"nChargedFT0MGenAxis", {300, 0, 300}, "N_{FT0M, gen.}"}; + ConfigurableAxis nChargedFV0AGenAxis{"nChargedFV0AGenAxis", {300, 0, 300}, "N_{FV0A, gen.}"}; + ConfigurableAxis multNTracksAxis{"multNTracksAxis", {500, 0, 500}, "N_{tracks}"}; + ConfigurableAxis signalFT0MAxis{"signalFT0MAxis", {10000, 0, 40000}, "FT0M amplitude"}; + ConfigurableAxis signalFV0AAxis{"signalFV0AAxis", {10000, 0, 40000}, "FV0A amplitude"}; + ConfigurableAxis nCandidates{"nCandidates", {30, -0.5, 29.5}, "N_{cand.}"}; + // Event selection criteria Configurable cutzvertex{"cutzvertex", 10.0f, "Accepted z-vertex range (cm)"}; Configurable isVertexITSTPC{"isVertexITSTPC", 0, "Select collisions with at least one ITS-TPC track"}; @@ -98,74 +117,57 @@ struct Cascqaanalysis { void init(InitContext const&) { - AxisSpec ptAxis = {200, 0.0f, 10.0f, "#it{p}_{T} (GeV/#it{c})"}; - AxisSpec rapidityAxis = {200, -2.0f, 2.0f, "y"}; - ConfigurableAxis centFT0MAxis{"centFT0MAxis", - {VARIABLE_WIDTH, 0., 0.01, 0.05, 0.1, 0.5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 105.5}, - "FT0M (%)"}; - ConfigurableAxis centFV0AAxis{"centFV0AAxis", - {VARIABLE_WIDTH, 0., 0.01, 0.05, 0.1, 0.5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 105.5}, - "FV0A (%)"}; - AxisSpec eventTypeAxis = {3, -0.5f, 2.5f, "Event Type"}; - AxisSpec nAssocCollAxis = {5, -0.5f, 4.5f, "N_{assoc.}"}; - AxisSpec nChargedFT0MGenAxis = {500, 0, 500, "N_{FT0M, gen.}"}; - AxisSpec nChargedFV0AGenAxis = {500, 0, 500, "N_{FV0A, gen.}"}; - AxisSpec multNTracksAxis = {500, 0, 500, "N_{tracks}"}; - AxisSpec signalFT0MAxis = {10000, 0, 40000, "FT0M amplitude"}; - AxisSpec signalFV0AAxis = {10000, 0, 40000, "FV0A amplitude"}; - AxisSpec nCandidates = {30, -0.5, 29.5, "N_{cand.}"}; - TString hCandidateCounterLabels[4] = {"All candidates", "passed topo cuts", "has associated MC particle", "associated with Xi(Omega)"}; TString hNEventsMCLabels[6] = {"All", "z vrtx", "INEL", "INEL>0", "INEL>1", "Associated with rec. collision"}; TString hNEventsLabels[13] = {"All", "kIsTriggerTVX", "kNoTimeFrameBorder", "kNoITSROFrameBorder", "kIsVertexITSTPC", "kNoSameBunchPileup", "kIsGoodZvtxFT0vsPV", "isVertexTOFmatched", "kNoCollInTimeRangeNarrow", "z vrtx", "INEL", "INEL>0", "INEL>1"}; - registry.add("hNEvents", "hNEvents", {HistType::kTH1F, {{13, 0.f, 13.f}}}); + registry.add("hNEvents", "hNEvents", {HistType::kTH1D, {{13, 0.f, 13.f}}}); for (int n = 1; n <= registry.get(HIST("hNEvents"))->GetNbinsX(); n++) { registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(n, hNEventsLabels[n - 1]); } - registry.add("hZCollision", "hZCollision", {HistType::kTH1F, {{200, -20.f, 20.f}}}); + registry.add("hZCollision", "hZCollision", {HistType::kTH1D, {{200, -20.f, 20.f}}}); - registry.add("hCandidateCounter", "hCandidateCounter", {HistType::kTH1F, {{4, 0.0f, 4.0f}}}); + registry.add("hCandidateCounter", "hCandidateCounter", {HistType::kTH1D, {{4, 0.0f, 4.0f}}}); for (int n = 1; n <= registry.get(HIST("hCandidateCounter"))->GetNbinsX(); n++) { registry.get(HIST("hCandidateCounter"))->GetXaxis()->SetBinLabel(n, hCandidateCounterLabels[n - 1]); } if (isMC) { // Rec. lvl registry.add("fakeEvents", "fakeEvents", {HistType::kTH1F, {{1, -0.5f, 0.5f}}}); - registry.add("hNchFT0MPVContr", "hNchFT0MPVContr", {HistType::kTH3F, {nChargedFT0MGenAxis, multNTracksAxis, eventTypeAxis}}); - registry.add("hNchFV0APVContr", "hNchFV0APVContr", {HistType::kTH3F, {nChargedFV0AGenAxis, multNTracksAxis, eventTypeAxis}}); // Gen. lvl - registry.add("hNEventsMC", "hNEventsMC", {HistType::kTH1F, {{6, 0.0f, 6.0f}}}); + registry.add("hNEventsMC", "hNEventsMC", {HistType::kTH1D, {{6, 0.0f, 6.0f}}}); for (int n = 1; n <= registry.get(HIST("hNEventsMC"))->GetNbinsX(); n++) { registry.get(HIST("hNEventsMC"))->GetXaxis()->SetBinLabel(n, hNEventsMCLabels[n - 1]); } - registry.add("hZCollisionGen", "hZCollisionGen", {HistType::kTH1F, {{200, -20.f, 20.f}}}); - registry.add("hNchFT0MNAssocMCCollisions", "hNchFT0MNAssocMCCollisions", {HistType::kTH3F, {nChargedFT0MGenAxis, nAssocCollAxis, eventTypeAxis}}); - registry.add("hNchFT0MNAssocMCCollisionsSameType", "hNchFT0MNAssocMCCollisionsSameType", {HistType::kTH3F, {nChargedFT0MGenAxis, nAssocCollAxis, eventTypeAxis}}); + registry.add("hZCollisionGen", "hZCollisionGen", {HistType::kTH1D, {{200, -20.f, 20.f}}}); + registry.add("hNchFT0MNAssocMCCollisions", "hNchFT0MNAssocMCCollisions", {HistType::kTH3D, {nChargedFT0MGenAxis, nAssocCollAxis, eventTypeAxis}}); + registry.add("hNchFT0MNAssocMCCollisionsSameType", "hNchFT0MNAssocMCCollisionsSameType", {HistType::kTH3D, {nChargedFT0MGenAxis, nAssocCollAxis, eventTypeAxis}}); registry.add("hNContributorsCorrelation", "hNContributorsCorrelation", {HistType::kTH2F, {{250, -0.5f, 249.5f, "Secondary Contributor"}, {250, -0.5f, 249.5f, "Main Contributor"}}}); - registry.add("hNchFT0MGenEvType", "hNchFT0MGenEvType", {HistType::kTH2F, {nChargedFT0MGenAxis, eventTypeAxis}}); - registry.add("hNchFV0AGenEvType", "hNchFV0AGenEvType", {HistType::kTH2F, {nChargedFV0AGenAxis, eventTypeAxis}}); - registry.add("hCentFT0M_genMC", "hCentFT0M_genMC", {HistType::kTH2F, {centFT0MAxis, eventTypeAxis}}); + registry.add("hNchFT0MGenEvType", "hNchFT0MGenEvType", {HistType::kTH2D, {nChargedFT0MGenAxis, eventTypeAxis}}); + registry.add("hNchFV0AGenEvType", "hNchFV0AGenEvType", {HistType::kTH2D, {nChargedFV0AGenAxis, eventTypeAxis}}); + registry.add("hCentFT0M_genMC", "hCentFT0M_genMC", {HistType::kTH2D, {centFT0MAxis, eventTypeAxis}}); } - registry.add("hCentFT0M_rec", "hCentFT0M_rec", {HistType::kTH2F, {centFT0MAxis, eventTypeAxis}}); + registry.add("hCentFT0M_rec", "hCentFT0M_rec", {HistType::kTH2D, {centFT0MAxis, eventTypeAxis}}); if (candidateQA) { - registry.add("hNcandidates", "hNcandidates", {HistType::kTH3F, {nCandidates, centFT0MAxis, {2, -0.5f, 1.5f}}}); + registry.add("hNcandidates", "hNcandidates", {HistType::kTH3D, {nCandidates, centFT0MAxis, {2, -0.5f, 1.5f}}}); } if (multQA) { if (isMC) { // Rec. lvl - registry.add("hNchFT0Mglobal", "hNchFT0Mglobal", {HistType::kTH3F, {nChargedFT0MGenAxis, multNTracksAxis, eventTypeAxis}}); + registry.add("hNchFT0Mglobal", "hNchFT0Mglobal", {HistType::kTH3D, {nChargedFT0MGenAxis, multNTracksAxis, eventTypeAxis}}); + registry.add("hNchFT0MPVContr", "hNchFT0MPVContr", {HistType::kTH3D, {nChargedFT0MGenAxis, multNTracksAxis, eventTypeAxis}}); + registry.add("hNchFV0APVContr", "hNchFV0APVContr", {HistType::kTH3D, {nChargedFV0AGenAxis, multNTracksAxis, eventTypeAxis}}); } - registry.add("hFT0MpvContr", "hFT0MpvContr", {HistType::kTH3F, {centFT0MAxis, multNTracksAxis, eventTypeAxis}}); - registry.add("hFV0ApvContr", "hFV0ApvContr", {HistType::kTH3F, {centFV0AAxis, multNTracksAxis, eventTypeAxis}}); - registry.add("hFT0Mglobal", "hFT0Mglobal", {HistType::kTH3F, {centFT0MAxis, multNTracksAxis, eventTypeAxis}}); - registry.add("hFV0AFT0M", "hFV0AFT0M", {HistType::kTH3F, {centFV0AAxis, centFT0MAxis, eventTypeAxis}}); - registry.add("hFT0MFV0Asignal", "hFT0MFV0Asignal", {HistType::kTH2F, {signalFT0MAxis, signalFV0AAxis}}); - registry.add("hFT0MsignalPVContr", "hFT0MsignalPVContr", {HistType::kTH3F, {signalFT0MAxis, multNTracksAxis, eventTypeAxis}}); + registry.add("hFT0MpvContr", "hFT0MpvContr", {HistType::kTH3D, {centFT0MAxis, multNTracksAxis, eventTypeAxis}}); + registry.add("hFV0ApvContr", "hFV0ApvContr", {HistType::kTH3D, {centFV0AAxis, multNTracksAxis, eventTypeAxis}}); + registry.add("hFT0Mglobal", "hFT0Mglobal", {HistType::kTH3D, {centFT0MAxis, multNTracksAxis, eventTypeAxis}}); + registry.add("hFV0AFT0M", "hFV0AFT0M", {HistType::kTH3D, {centFV0AAxis, centFT0MAxis, eventTypeAxis}}); + registry.add("hFT0MFV0Asignal", "hFT0MFV0Asignal", {HistType::kTH2D, {signalFT0MAxis, signalFV0AAxis}}); + registry.add("hFT0MsignalPVContr", "hFT0MsignalPVContr", {HistType::kTH3D, {signalFT0MAxis, multNTracksAxis, eventTypeAxis}}); } } diff --git a/PWGLF/Tasks/Strangeness/derivedupcanalysis.cxx b/PWGLF/Tasks/Strangeness/derivedupcanalysis.cxx index 3704d58ab57..b3021033d32 100644 --- a/PWGLF/Tasks/Strangeness/derivedupcanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/derivedupcanalysis.cxx @@ -249,7 +249,7 @@ struct Derivedupcanalysis { ConfigurableAxis axisNchInvMass{"axisNchInvMass", {201, -1.5f, 199.5f}, "Number of charged particles for kTHnSparseF"}; ConfigurableAxis axisFT0Cqa{"axisFT0Cqa", - {VARIABLE_WIDTH, -1.5, -0.5, 0., 0.01, 0.05, 0.1, 0.5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 105.5}, + {VARIABLE_WIDTH, -1.5, -0.5, 0., 1., 5, 10, 20, 30, 40, 50, 60, 70, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 105.5}, "FT0C (%)"}; ConfigurableAxis axisFT0C{"axisFT0C", @@ -881,7 +881,7 @@ struct Derivedupcanalysis { secondaryMaskSelectionAntiLambda = maskTopologicalV0 | maskKinematicV0 | maskTrackPropertiesV0 | maskAntiLambdaSpecific; // Event Counter - histos.add("eventQA/hEventSelection", "hEventSelection", kTH1F, {{17, -0.5f, 16.5f}}); + histos.add("eventQA/hEventSelection", "hEventSelection", kTH1D, {{17, -0.5f, 16.5f}}); histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(1, "All collisions"); histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(2, "kIsTriggerTVX"); histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(3, "posZ cut"); @@ -901,48 +901,48 @@ struct Derivedupcanalysis { histos.get(HIST("eventQA/hEventSelection"))->GetXaxis()->SetBinLabel(17, "has UPC flag"); // Event QA - histos.add("eventQA/hCentralityVsFT0ampl", "hCentralityVsFT0ampl", kTH3F, {axisFT0Cqa, axisDetectors.axisFT0Aampl, axisSelGap}); - histos.add("eventQA/hCentrality", "hCentrality", kTH2F, {axisFT0Cqa, axisSelGap}); - histos.add("eventQA/hFT0ampl", "hFT0ampl", kTH2F, {axisDetectors.axisFT0Aampl, axisSelGap}); - histos.add("eventQA/hCentralityVsTracksPVeta1", "hCentralityVsTracksPVeta1", kTH3F, {axisFT0Cqa, axisNTracksPVeta1, axisSelGap}); - histos.add("eventQA/hCentralityVsTracksTotalExceptITSonly", "hCentralityVsTracksTotalExceptITSonly", kTH3F, {axisFT0Cqa, axisNTracksTotalExceptITSonly, axisSelGap}); - histos.add("eventQA/hOccupancy", "hOccupancy", kTH2F, {axisOccupancy, axisSelGap}); - histos.add("eventQA/hCentralityVsOccupancy", "hCentralityVsOccupancy", kTH3F, {axisFT0Cqa, axisOccupancy, axisSelGap}); - histos.add("eventQA/hTracksPVeta1VsTracksGlobal", "hTracksPVeta1VsTracksGlobal", kTH3F, {axisNTracksPVeta1, axisNTracksGlobal, axisSelGap}); - histos.add("eventQA/hCentralityVsTracksGlobal", "hCentralityVsTracksGlobal", kTH3F, {axisFT0Cqa, axisNTracksGlobal, axisSelGap}); - histos.add("eventQA/hFT0amplVsTracksGlobal", "hFT0amplVsTracksGlobal", kTH3F, {axisDetectors.axisFT0Aampl, axisNTracksGlobal, axisSelGap}); - histos.add("eventQA/hRawGapSide", "Raw Gap side; Entries", kTH1F, {{6, -1.5, 4.5}}); - histos.add("eventQA/hSelGapSide", "Selected gap side (with n); Entries", kTH1F, {axisSelGap}); - histos.add("eventQA/hPosX", "Vertex position in x", kTH2F, {{100, -0.1, 0.1}, axisSelGap}); - histos.add("eventQA/hPosY", "Vertex position in y", kTH2F, {{100, -0.1, 0.1}, axisSelGap}); - histos.add("eventQA/hPosZ", "Vertex position in z", kTH2F, {{100, -20., 20.}, axisSelGap}); - histos.add("eventQA/hFT0", "hFT0", kTH3F, {axisDetectors.axisFT0Aampl, axisDetectors.axisFT0Campl, axisSelGap}); - histos.add("eventQA/hFDD", "hFDD", kTH3F, {axisDetectors.axisFDDAampl, axisDetectors.axisFDDCampl, axisSelGap}); - histos.add("eventQA/hZN", "hZN", kTH3F, {axisDetectors.axisZNAampl, axisDetectors.axisZNCampl, axisSelGap}); + histos.add("eventQA/hCentralityVsFT0ampl", "hCentralityVsFT0ampl", kTH3D, {axisFT0Cqa, axisDetectors.axisFT0Aampl, axisSelGap}); + histos.add("eventQA/hCentrality", "hCentrality", kTH2D, {axisFT0Cqa, axisSelGap}); + histos.add("eventQA/hFT0ampl", "hFT0ampl", kTH2D, {axisDetectors.axisFT0Aampl, axisSelGap}); + histos.add("eventQA/hCentralityVsTracksPVeta1", "hCentralityVsTracksPVeta1", kTH3D, {axisFT0Cqa, axisNTracksPVeta1, axisSelGap}); + histos.add("eventQA/hCentralityVsTracksTotalExceptITSonly", "hCentralityVsTracksTotalExceptITSonly", kTH3D, {axisFT0Cqa, axisNTracksTotalExceptITSonly, axisSelGap}); + histos.add("eventQA/hOccupancy", "hOccupancy", kTH2D, {axisOccupancy, axisSelGap}); + histos.add("eventQA/hCentralityVsOccupancy", "hCentralityVsOccupancy", kTH3D, {axisFT0Cqa, axisOccupancy, axisSelGap}); + histos.add("eventQA/hTracksPVeta1VsTracksGlobal", "hTracksPVeta1VsTracksGlobal", kTH3D, {axisNTracksPVeta1, axisNTracksGlobal, axisSelGap}); + histos.add("eventQA/hCentralityVsTracksGlobal", "hCentralityVsTracksGlobal", kTH3D, {axisFT0Cqa, axisNTracksGlobal, axisSelGap}); + histos.add("eventQA/hFT0amplVsTracksGlobal", "hFT0amplVsTracksGlobal", kTH3D, {axisDetectors.axisFT0Aampl, axisNTracksGlobal, axisSelGap}); + histos.add("eventQA/hRawGapSide", "Raw Gap side; Entries", kTH1D, {{6, -1.5, 4.5}}); + histos.add("eventQA/hSelGapSide", "Selected gap side (with n); Entries", kTH1D, {axisSelGap}); + histos.add("eventQA/hPosX", "Vertex position in x", kTH2D, {{100, -0.1, 0.1}, axisSelGap}); + histos.add("eventQA/hPosY", "Vertex position in y", kTH2D, {{100, -0.1, 0.1}, axisSelGap}); + histos.add("eventQA/hPosZ", "Vertex position in z", kTH2D, {{100, -20., 20.}, axisSelGap}); + histos.add("eventQA/hFT0", "hFT0", kTH3D, {axisDetectors.axisFT0Aampl, axisDetectors.axisFT0Campl, axisSelGap}); + histos.add("eventQA/hFDD", "hFDD", kTH3D, {axisDetectors.axisFDDAampl, axisDetectors.axisFDDCampl, axisSelGap}); + histos.add("eventQA/hZN", "hZN", kTH3D, {axisDetectors.axisZNAampl, axisDetectors.axisZNCampl, axisSelGap}); if (doprocessGenerated) { - histos.add("eventQA/mc/hEventSelectionMC", "hEventSelectionMC", kTH3F, {{3, -0.5, 2.5}, axisNTracksPVeta1, axisGeneratorIds}); + histos.add("eventQA/mc/hEventSelectionMC", "hEventSelectionMC", kTH3D, {{3, -0.5, 2.5}, axisNTracksPVeta1, axisGeneratorIds}); histos.get(HIST("eventQA/mc/hEventSelectionMC"))->GetXaxis()->SetBinLabel(1, "All collisions"); histos.get(HIST("eventQA/mc/hEventSelectionMC"))->GetXaxis()->SetBinLabel(2, "posZ cut"); histos.get(HIST("eventQA/mc/hEventSelectionMC"))->GetXaxis()->SetBinLabel(3, "rec. at least once"); - histos.add("eventQA/mc/hTracksGlobalvsMCNParticlesEta08gen", "hTracksGlobalvsMCNParticlesEta08gen", kTH2F, {axisNTracksGlobal, axisNTracksGlobal}); - histos.add("eventQA/mc/hTracksGlobalVsNcoll_beforeEvSel", "hTracksGlobalVsNcoll_beforeEvSel", kTH2F, {axisNTracksGlobal, axisNAssocColl}); - histos.add("eventQA/mc/hTracksGlobalVsNcoll_afterEvSel", "hTracksGlobalVsNcoll_afterEvSel", kTH2F, {axisNTracksGlobal, axisNAssocColl}); - histos.add("eventQA/mc/hTracksGlobalVsPVzMC", "hTracksGlobalVsPVzMC", kTH2F, {axisNTracksGlobal, {100, -20., 20.}}); - histos.add("eventQA/mc/hEventPVzMC", "hEventPVzMC", kTH1F, {{100, -20., 20.}}); - histos.add("eventQA/mc/hGenEventFT0ampl", "hGenEventFT0ampl", kTH1F, {axisDetectors.axisFT0Aampl}); - histos.add("eventQA/mc/hGenEventCentrality", "hGenEventCentrality", kTH1F, {axisFT0Cqa}); - histos.add("eventQA/mc/hGeneratorsId", "hGeneratorsId", kTH1F, {axisGeneratorIds}); + histos.add("eventQA/mc/hTracksGlobalvsMCNParticlesEta08gen", "hTracksGlobalvsMCNParticlesEta08gen", kTH2D, {axisNTracksGlobal, axisNTracksGlobal}); + histos.add("eventQA/mc/hTracksGlobalVsNcoll_beforeEvSel", "hTracksGlobalVsNcoll_beforeEvSel", kTH2D, {axisNTracksGlobal, axisNAssocColl}); + histos.add("eventQA/mc/hTracksGlobalVsNcoll_afterEvSel", "hTracksGlobalVsNcoll_afterEvSel", kTH2D, {axisNTracksGlobal, axisNAssocColl}); + histos.add("eventQA/mc/hTracksGlobalVsPVzMC", "hTracksGlobalVsPVzMC", kTH2D, {axisNTracksGlobal, {100, -20., 20.}}); + histos.add("eventQA/mc/hEventPVzMC", "hEventPVzMC", kTH1D, {{100, -20., 20.}}); + histos.add("eventQA/mc/hGenEventFT0ampl", "hGenEventFT0ampl", kTH1D, {axisDetectors.axisFT0Aampl}); + histos.add("eventQA/mc/hGenEventCentrality", "hGenEventCentrality", kTH1D, {axisFT0Cqa}); + histos.add("eventQA/mc/hGeneratorsId", "hGeneratorsId", kTH1D, {axisGeneratorIds}); } if (doprocessV0sMC || doprocessCascadesMC) { // Event QA - histos.add("eventQA/mc/hFakeEvents", "hFakeEvents", {kTH1F, {{1, -0.5f, 0.5f}}}); - histos.add("eventQA/mc/hNTracksGlobalvsMCNParticlesEta08rec", "hNTracksGlobalvsMCNParticlesEta08rec", kTH2F, {axisNTracksGlobal, axisNTracksGlobal}); - histos.add("eventQA/mc/hNTracksPVeta1vsMCNParticlesEta10rec", "hNTracksPVeta1vsMCNParticlesEta10rec", kTH2F, {axisNTracksPVeta1, axisNTracksPVeta1}); - histos.add("eventQA/mc/hNTracksGlobalvstotalMultMCParticles", "hNTracksGlobalvstotalMultMCParticles", kTH2F, {axisNTracksGlobal, axisNchInvMass}); - histos.add("eventQA/mc/hNTracksPVeta1vstotalMultMCParticles", "hNTracksPVeta1vstotalMultMCParticles", kTH2F, {axisNTracksPVeta1, axisNchInvMass}); - histos.add("eventQA/hSelGapSideNoNeutrons", "Selected gap side (no n); Entries", kTH1F, {{5, -0.5, 4.5}}); + histos.add("eventQA/mc/hFakeEvents", "hFakeEvents", {kTH1D, {{1, -0.5f, 0.5f}}}); + histos.add("eventQA/mc/hNTracksGlobalvsMCNParticlesEta08rec", "hNTracksGlobalvsMCNParticlesEta08rec", kTH2D, {axisNTracksGlobal, axisNTracksGlobal}); + histos.add("eventQA/mc/hNTracksPVeta1vsMCNParticlesEta10rec", "hNTracksPVeta1vsMCNParticlesEta10rec", kTH2D, {axisNTracksPVeta1, axisNTracksPVeta1}); + histos.add("eventQA/mc/hNTracksGlobalvstotalMultMCParticles", "hNTracksGlobalvstotalMultMCParticles", kTH2D, {axisNTracksGlobal, axisNchInvMass}); + histos.add("eventQA/mc/hNTracksPVeta1vstotalMultMCParticles", "hNTracksPVeta1vstotalMultMCParticles", kTH2D, {axisNTracksPVeta1, axisNchInvMass}); + histos.add("eventQA/hSelGapSideNoNeutrons", "Selected gap side (no n); Entries", kTH1D, {{5, -0.5, 4.5}}); } if (doprocessV0sMC) { From 507643b5f6f754cd0cc178075c75450716133d71 Mon Sep 17 00:00:00 2001 From: omvazque Date: Tue, 6 May 2025 13:55:45 -0500 Subject: [PATCH 1201/1650] [PWGLF] Extended the track selection settings (#11105) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 217 +++++++++++-------- 1 file changed, 124 insertions(+), 93 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index d8d0b75ae09..43add45613a 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -34,6 +34,7 @@ #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/TrackSelectionTables.h" +#include "Common/Core/TrackSelectionDefaults.h" #include "CommonConstants/MathConstants.h" #include "CommonConstants/ZDCConstants.h" #include "Framework/ASoAHelpers.h" // required for Filter op. @@ -113,6 +114,18 @@ struct UccZdc { Configurable maxOccCut{"maxOccCut", 500, "max Occu cut"}; Configurable minITSnCls{"minITSnCls", 5, "min ITSnCls"}; + Configurable itsRequirement{"itsRequirement", TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSall7Layers, "0: Global Tracks, 2: Hits in the 7 ITS layers"}; + Configurable requireITS{"requireITS", true, "Additional cut on the ITS requirement"}; + Configurable requireTPC{"requireTPC", true, "Additional cut on the TPC requirement"}; + Configurable requireGoldenChi2{"requireGoldenChi2", false, "Additional cut on the GoldenChi2"}; + Configurable minNCrossedRowsTPC{"minNCrossedRowsTPC", 70.f, "Additional cut on the minimum number of crossed rows in the TPC"}; + Configurable minNCrossedRowsOverFindableClustersTPC{"minNCrossedRowsOverFindableClustersTPC", 0.8f, "Additional cut on the minimum value of the ratio between crossed rows and findable clusters in the TPC"}; + Configurable maxChi2PerClusterTPC{"maxChi2PerClusterTPC", 4.f, "Additional cut on the maximum value of the chi2 per cluster in the TPC"}; + // Configurable minChi2PerClusterTPC{"minChi2PerClusterTPC", 0.5f, "Additional cut on the minimum value of the chi2 per cluster in the TPC"}; + Configurable maxChi2PerClusterITS{"maxChi2PerClusterITS", 36.f, "Additional cut on the maximum value of the chi2 per cluster in the ITS"}; + Configurable maxDcaZ{"maxDcaZ", 2.f, "Additional cut on the maximum value of the DCA z"}; + // Configurable minTPCNClsFound{"minTPCNClsFound", 100.f, "Additional cut on the minimum value of the number of found clusters in the TPC"}; + enum EvCutLabel { All = 1, SelEigth, @@ -137,26 +150,19 @@ struct UccZdc { static constexpr float oneHalf{0.5}; // Filters - // Filter trackFilter = ((aod::track::eta > minEta) && (aod::track::eta < maxEta) && (aod::track::pt > minPt) && (aod::track::pt < maxPt) && requireGlobalTrackInFilter()); - // Remove the GlobalTrack filter to count also ITS tracks Filter trackFilter = ((aod::track::eta > minEta) && (aod::track::eta < maxEta) && (aod::track::pt > minPt) && (aod::track::pt < maxPt)); - // Apply Filters - // using TheFilteredCollisions = soa::Filtered; - // using TheFilteredCollision = TheFilteredCollisions::iterator; using TheFilteredTracks = soa::Filtered; - // using TheFilteredTrack = TheFilteredTracks::iterator; - - // using TheFilteredSimCollisions = soa::Filtered; using TheFilteredSimTracks = soa::Filtered; + // Additional filters for tracks + TrackSelection myTrackSel; + // Histograms: Data HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; Service ccdb; Configurable paTH{"paTH", "Users/o/omvazque/TrackingEfficiency", "base path to the ccdb object"}; - // Configurable noLaterThan{"noLaterThan", 1740173636328, "latest acceptable timestamp of creation for the object"}; - // Configurable noLaterThan{"noLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; // the efficiency has been previously stored in the CCDB as TH1F histogram TH1F* efficiency = nullptr; @@ -195,6 +201,34 @@ struct UccZdc { x->SetBinLabel(16, "Within TDC cut?"); x->SetBinLabel(17, "Within ZEM cut?"); + LOG(info) << "\titsRequirement=" << itsRequirement.value; + LOG(info) << "\trequireITS=" << requireITS.value; + LOG(info) << "\trequireTPC=" << requireTPC.value; + LOG(info) << "\trequireGoldenChi2=" << requireGoldenChi2.value; + LOG(info) << "\tmaxChi2PerClusterTPC=" << maxChi2PerClusterTPC.value; + LOG(info) << "\tminNCrossedRowsTPC=" << minNCrossedRowsTPC.value; + LOG(info) << "\tminNCrossedRowsOverFindableClustersTPC=" << minNCrossedRowsOverFindableClustersTPC.value; + LOG(info) << "\tmaxChi2PerClusterITS=" << maxChi2PerClusterITS.value; + LOG(info) << "\tminPt=" << minPt.value; + LOG(info) << "\tmaxPt=" << maxPt.value; + LOG(info) << "\tminEta=" << minEta.value; + LOG(info) << "\tmaxEta=" << maxEta.value; + + myTrackSel = getGlobalTrackSelectionRun3ITSMatch(itsRequirement, TrackSelection::GlobalTrackRun3DCAxyCut::Default); + myTrackSel.SetMinNCrossedRowsTPC(minNCrossedRowsTPC.value); + myTrackSel.SetMinNCrossedRowsOverFindableClustersTPC(minNCrossedRowsOverFindableClustersTPC.value); + myTrackSel.SetMaxChi2PerClusterTPC(maxChi2PerClusterTPC.value); + myTrackSel.SetMaxChi2PerClusterITS(maxChi2PerClusterITS.value); + myTrackSel.SetRequireITSRefit(requireITS.value); + myTrackSel.SetRequireTPCRefit(requireTPC.value); + myTrackSel.SetMaxDcaZ(maxDcaZ.value); + myTrackSel.SetRequireGoldenChi2(requireGoldenChi2.value); + myTrackSel.SetMaxDcaXYPtDep([](float /*pt*/) { return 10000.f; }); // No DCAxy cut will be used, this is done via the member function of the task + myTrackSel.SetPtRange(minPt, maxPt); + myTrackSel.SetEtaRange(minEta, maxEta); + LOGF(info, "----- Custom Track selection -----"); + myTrackSel.print(); + // Histograms: paritcle-level info if (doprocessZdcCollAss) { registry.add("T0Ccent", ";;Entries", kTH1F, {axisCent}); @@ -265,6 +299,11 @@ struct UccZdc { if (doprocessQA) { registry.add("T0Ccent", ";;Entries", kTH1F, {axisCent}); + registry.add("EtaVsPhi", ";#eta;#varphi", kTH2F, {{{axisEta}, {100, -0.1 * PI, +2.1 * PI}}}); + registry.add("dcaXYvspTOpen", ";DCA_{xy} (cm);;", kTH2F, {{{150, -3., 3.}, {axisPt}}}); + registry.add("dcaXYvspT", ";DCA_{xy} (cm);;", kTH2F, {{{150, -3., 3.}, {axisPt}}}); + registry.add("nClustersITS", ";;;", kTProfile, {{axisPt}}); + registry.add("nClustersTPC", ";;;", kTProfile, {{axisPt}}); registry.add("ZNVsFT0A", ";T0A (#times 1/100);ZNA+ZNC;", kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsZDC, -0.5, maxZN}}}); registry.add("ZNVsFT0C", ";T0C (#times 1/100);ZNA+ZNC;", kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsZDC, -0.5, maxZN}}}); @@ -297,6 +336,7 @@ struct UccZdc { registry.add("NchVsFT0A", ";T0A (#times 1/100, 3.5 < #eta < 4.9);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsNch, minNch, maxNch}}}); registry.add("NchVsFV0A", ";V0A (#times 1/100, 2.2 < #eta < 5);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFV0, 0., maxAmpFV0}, {nBinsNch, minNch, maxNch}}}); + registry.add("Nch", ";#it{N}_{ch} (|#eta|<0.8);", kTH1F, {{nBinsNch, minNch, maxNch}}); registry.add("NchVsEt", ";#it{E}_{T} (|#eta|<0.8);#LTITS+TPC tracks#GT (|#eta|<0.8);", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsNch, minNch, maxNch}}}); registry.add("NchVsMeanPt", ";#it{N}_{ch} (|#eta|<0.8);#LT[#it{p}_{T}]#GT (|#eta|<0.8);", kTProfile, {{nBinsNch, minNch, maxNch}}); registry.add("NchVsNPV", ";#it{N}_{PV} (|#eta|<1);ITS+TPC tracks (|#eta|<0.8);", kTH2F, {{{300, -0.5, 5999.5}, {nBinsNch, minNch, maxNch}}}); @@ -315,7 +355,6 @@ struct UccZdc { // This avoids that users can replace objects **while** a train is running int64_t now = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); ccdb->setCreatedNotAfter(now); - // ccdb->setCreatedNotAfter(noLaterThan.value); } template @@ -492,10 +531,18 @@ struct UccZdc { itsTracks++; } // Track Selection - if (track.isGlobalTrack()) { - glbTracks++; - meanpt += track.pt(); - et += std::sqrt(std::pow(track.pt(), 2.) + std::pow(o2::constants::physics::MassPionCharged, 2.)); + if (myTrackSel.IsSelected(track)) { + if (passesDCAxyCut(track)) { + glbTracks++; + meanpt += track.pt(); + et += std::sqrt(std::pow(track.pt(), 2.) + std::pow(o2::constants::physics::MassPionCharged, 2.)); + registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); + registry.fill(HIST("dcaXYvspT"), track.dcaXY(), track.pt()); + registry.fill(HIST("nClustersITS"), track.pt(), track.itsNCls()); + registry.fill(HIST("nClustersTPC"), track.pt(), track.tpcNClsFound()); + } else { + registry.fill(HIST("dcaXYvspTOpen"), track.dcaXY(), track.pt()); + } } } @@ -538,6 +585,7 @@ struct UccZdc { registry.fill(HIST("NchVsFT0C"), aT0C / 100., glbTracks); registry.fill(HIST("NchVsFT0M"), (aT0A + aT0C) / 100., glbTracks); + registry.fill(HIST("Nch"), glbTracks); registry.fill(HIST("NchVsEt"), et, glbTracks); registry.fill(HIST("NchVsNPV"), collision.multNTracksPVeta1(), glbTracks); registry.fill(HIST("NchVsITStracks"), itsTracks, glbTracks); @@ -617,20 +665,20 @@ struct UccZdc { // Calculates the event weight, W_k for (const auto& track : tracks) { // Track Selection - if (!track.isGlobalTrack()) { - continue; - } - - registry.fill(HIST("ZposVsEta"), collision.posZ(), track.eta()); - registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); - registry.fill(HIST("sigma1Pt"), track.pt(), track.sigma1Pt()); - registry.fill(HIST("dcaXYvspT"), track.dcaXY(), track.pt()); + if (myTrackSel.IsSelected(track)) { + if (passesDCAxyCut(track)) { + registry.fill(HIST("ZposVsEta"), collision.posZ(), track.eta()); + registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); + registry.fill(HIST("sigma1Pt"), track.pt(), track.sigma1Pt()); + registry.fill(HIST("dcaXYvspT"), track.dcaXY(), track.pt()); - float pt{track.pt()}; - double weight{efficiency->GetBinContent(efficiency->FindBin(pt))}; - if (weight > 0.) { - pTs.emplace_back(pt); - wIs.emplace_back(weight); + float pt{track.pt()}; + double weight{efficiency->GetBinContent(efficiency->FindBin(pt))}; + if (weight > 0.) { + pTs.emplace_back(pt); + wIs.emplace_back(weight); + } + } } } @@ -645,10 +693,11 @@ struct UccZdc { // To calculate event-averaged for (const auto& track : tracks) { // Track Selection - if (!track.isGlobalTrack()) { - continue; + if (myTrackSel.IsSelected(track)) { + if (passesDCAxyCut(track)) { + registry.fill(HIST("NchVsPt"), w1, track.pt()); + } } - registry.fill(HIST("NchVsPt"), w1, track.pt()); } // EbE one-particle pT correlation @@ -725,15 +774,15 @@ struct UccZdc { // Calculates the event weight, W_k for (const auto& track : groupedTracks) { // Track Selection - if (!track.isGlobalTrack()) { - continue; - } - - float pt{track.pt()}; - double weight{efficiency->GetBinContent(efficiency->FindBin(pt))}; - if (weight > 0.) { - pTs.emplace_back(pt); - wIs.emplace_back(weight); + if (myTrackSel.IsSelected(track)) { + if (passesDCAxyCut(track)) { + float pt{track.pt()}; + double weight{efficiency->GetBinContent(efficiency->FindBin(pt))}; + if (weight > 0.) { + pTs.emplace_back(pt); + wIs.emplace_back(weight); + } + } } } @@ -840,37 +889,36 @@ struct UccZdc { const auto& groupedTracks{simTracks.sliceBy(perCollision, collision.globalIndex())}; for (const auto& track : groupedTracks) { - // Track Selection - if (!track.isGlobalTrack()) { - continue; - } - // Has MC particle? if (!track.has_mcParticle()) { continue; } - - const auto& particle{track.mcParticle()}; - registry.fill(HIST("Pt_all_ch"), cent, track.pt()); - registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); - - if (!particle.isPhysicalPrimary()) { - continue; - } - - registry.fill(HIST("Pt_ch"), cent, track.pt()); - if (particle.pdgCode() == PDG_t::kPiPlus || particle.pdgCode() == PDG_t::kPiMinus) { - registry.fill(HIST("Pt_pi"), cent, track.pt()); - } else if (particle.pdgCode() == PDG_t::kKPlus || particle.pdgCode() == PDG_t::kKMinus) { - registry.fill(HIST("Pt_ka"), cent, track.pt()); - } else if (particle.pdgCode() == PDG_t::kProton || particle.pdgCode() == PDG_t::kProtonBar) { - registry.fill(HIST("Pt_pr"), cent, track.pt()); - } else if (particle.pdgCode() == PDG_t::kSigmaPlus || particle.pdgCode() == PDG_t::kSigmaBarMinus) { - registry.fill(HIST("Pt_sigpos"), cent, track.pt()); - } else if (particle.pdgCode() == PDG_t::kSigmaMinus || particle.pdgCode() == PDG_t::kSigmaBarPlus) { - registry.fill(HIST("Pt_signeg"), cent, track.pt()); - } else { - registry.fill(HIST("Pt_re"), cent, track.pt()); + // Track selection + if (myTrackSel.IsSelected(track)) { + if (passesDCAxyCut(track)) { + registry.fill(HIST("Pt_all_ch"), cent, track.pt()); + registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); + + const auto& particle{track.mcParticle()}; + if (!particle.isPhysicalPrimary()) { + continue; + } + + registry.fill(HIST("Pt_ch"), cent, track.pt()); + if (particle.pdgCode() == PDG_t::kPiPlus || particle.pdgCode() == PDG_t::kPiMinus) { + registry.fill(HIST("Pt_pi"), cent, track.pt()); + } else if (particle.pdgCode() == PDG_t::kKPlus || particle.pdgCode() == PDG_t::kKMinus) { + registry.fill(HIST("Pt_ka"), cent, track.pt()); + } else if (particle.pdgCode() == PDG_t::kProton || particle.pdgCode() == PDG_t::kProtonBar) { + registry.fill(HIST("Pt_pr"), cent, track.pt()); + } else if (particle.pdgCode() == PDG_t::kSigmaPlus || particle.pdgCode() == PDG_t::kSigmaBarMinus) { + registry.fill(HIST("Pt_sigpos"), cent, track.pt()); + } else if (particle.pdgCode() == PDG_t::kSigmaMinus || particle.pdgCode() == PDG_t::kSigmaBarPlus) { + registry.fill(HIST("Pt_signeg"), cent, track.pt()); + } else { + registry.fill(HIST("Pt_re"), cent, track.pt()); + } + } } } @@ -931,32 +979,15 @@ struct UccZdc { } } - // Single-Track Selection - // template - // bool passedTrackSelection(const T2& track) { - // if (track.eta() < minEta || track.eta() > maxEta) return false; - // if (track.pt() < minPt) return false; - // - // if (!track.hasITS()) return false; - // if (track.itsNCls() < minItsNclusters) return false; - // if (!track.hasTPC()) return false; - // if (track.tpcNClsFound() < minTpcNclusters) return false; - // if (track.tpcNClsCrossedRows() < minTpcNcrossedRows) return false; - // if (track.tpcChi2NCl() > maxChiSquareTpc) return false; - // if (track.itsChi2NCl() > maxChiSquareIts) return false; - // // pt-dependent selection - // if (setDCAselectionPtDep) { - // if (std::fabs(track.dcaXY()) > (par0 + par1 / track.pt())) return - // false; if (std::fabs(track.dcaZ()) > (par0 + par1 / track.pt())) - // return false; - // } - // // standard selection - // if (!setDCAselectionPtDep) { - // if (std::fabs(track.dcaXY()) > maxDcaxy) return false; - // if (std::fabs(track.dcaZ()) > maxDcaz) return false; - // } - // return true; - // } + template + bool passesDCAxyCut(TrackType const& track) const + { + if (std::fabs(track.dcaXY()) <= (0.0105f + 0.0350f / std::pow(track.pt(), 1.1f))) { + return true; + } else { + return false; + } + } }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 144b085a9f1baa0a7888834a3de7e22c4ac68cf7 Mon Sep 17 00:00:00 2001 From: Thorkj <154221526+Thorkj@users.noreply.github.com> Date: Tue, 6 May 2025 23:02:50 +0200 Subject: [PATCH 1202/1650] [PWGCF] code improvements (#11101) --- .../TwoParticleCorrelations/Tasks/corrSparse.cxx | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx b/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx index b80b3e2692b..09e74854914 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx @@ -65,11 +65,12 @@ struct CorrSparse { O2_DEFINE_CONFIGURABLE(cfgMinMixEventNum, int, 5, "Minimum number of events to mix") O2_DEFINE_CONFIGURABLE(cfgMinMult, int, 0, "Minimum multiplicity for collision") O2_DEFINE_CONFIGURABLE(cfgMaxMult, int, 10, "Maximum multiplicity for collision") - O2_DEFINE_CONFIGURABLE(cfgMergingCut, float, 0.0, "Merging cut on track merge") + O2_DEFINE_CONFIGURABLE(cfgMergingCut, float, 0.02, "Merging cut on track merge") + O2_DEFINE_CONFIGURABLE(cfgApplyTwoTrackEfficiency, bool, true, "Apply two track efficiency for tpc tpc") O2_DEFINE_CONFIGURABLE(cfgRadiusLow, float, 0.8, "Low radius for merging cut") O2_DEFINE_CONFIGURABLE(cfgRadiusHigh, float, 2.5, "High radius for merging cut") - O2_DEFINE_CONFIGURABLE(etaMftTrackMin, float, 3.6, "Minimum eta for MFT track") - O2_DEFINE_CONFIGURABLE(etaMftTrackMax, float, 2.5, "Maximum eta for MFT track") + O2_DEFINE_CONFIGURABLE(etaMftTrackMin, float, -3.6, "Minimum eta for MFT track") + O2_DEFINE_CONFIGURABLE(etaMftTrackMax, float, -2.5, "Maximum eta for MFT track") O2_DEFINE_CONFIGURABLE(nClustersMftTrack, int, 5, "Minimum number of clusters for MFT track") O2_DEFINE_CONFIGURABLE(cfgSampleSize, double, 10, "Sample size for mixed event") @@ -97,7 +98,7 @@ struct CorrSparse { // make the filters and cuts. Filter collisionFilter = (nabs(aod::collision::posZ) < cfgZVtxCut) && (aod::evsel::sel8) == true; - Filter trackFilter = (nabs(aod::track::eta) < cfgEtaCut) && (aod::track::pt > cfgPtCutMin) && (aod::track::pt < cfgPtCutMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)); + Filter trackFilter = (nabs(aod::track::eta) < cfgEtaCut) && (cfgPtCutMin < aod::track::pt) && (cfgPtCutMax > aod::track::pt) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)); // Define the outputs OutputObj same{Form("sameEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult))}; @@ -160,7 +161,7 @@ struct CorrSparse { bool isAcceptedMftTrack(TTrackAssoc const& mftTrack) { // cut on the eta of MFT tracks - if (mftTrack.eta() > etaMftTrackMax || mftTrack.eta() < etaMftTrackMin) { + if (mftTrack.eta() < etaMftTrackMin || mftTrack.eta() > etaMftTrackMax) { return false; } @@ -266,7 +267,7 @@ struct CorrSparse { float deltaPhi = RecoDecay::constrainAngle(track1.phi() - track2.phi(), -PIHalf); float deltaEta = track1.eta() - track2.eta(); - if (std::abs(deltaEta) < cfgMergingCut) { + if (cfgApplyTwoTrackEfficiency && std::abs(deltaEta) < cfgMergingCut) { double dPhiStarHigh = getDPhiStar(track1, track2, cfgRadiusHigh, magneticField); double dPhiStarLow = getDPhiStar(track1, track2, cfgRadiusLow, magneticField); @@ -355,9 +356,6 @@ struct CorrSparse { if ((tracks1.size() < cfgMinMult || tracks1.size() >= cfgMaxMult)) continue; - if ((tracks2.size() < cfgMinMult || tracks2.size() >= cfgMaxMult)) - continue; - fillCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent, getMagneticField(bc.timestamp())); } } else { From ddda6758b76b37b8b90455e78870ca6406efd4ea Mon Sep 17 00:00:00 2001 From: Bhagyarathi Sahoo Date: Wed, 7 May 2025 10:05:25 +0530 Subject: [PATCH 1203/1650] [PWGDQ] Modification in dqEfficiency_withAsso task (#10957) Co-authored-by: ALICE Action Bot --- PWGDQ/Core/HistogramsLibrary.cxx | 9 +++++ PWGDQ/Core/VarManager.cxx | 18 ++++++++++ PWGDQ/Core/VarManager.h | 41 ++++++++++++++++++++++ PWGDQ/Tasks/dqEfficiency_withAssoc.cxx | 47 +++++++++++++------------- 4 files changed, 91 insertions(+), 24 deletions(-) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 1fc7e65442c..cc2a5c5ed38 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -889,6 +889,15 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "Mass", "", false, 500, 0.0, 5.0, VarManager::kMass); hm->AddHistogram(histClass, "Eta_Pt", "", false, 40, -2.0, 2.0, VarManager::kEta, 200, 0.0, 20.0, VarManager::kPt); hm->AddHistogram(histClass, "Phi_Eta", "#phi vs #eta distribution", false, 200, -5.0, 5.0, VarManager::kEta, 200, -2. * o2::constants::math::PI, 2. * o2::constants::math::PI, VarManager::kPhi); + int varspTHE[3] = {VarManager::kMCPt, VarManager::kMCCosThetaHE, VarManager::kMCPhiHE}; + int varspTCS[3] = {VarManager::kMCPt, VarManager::kMCCosThetaCS, VarManager::kMCPhiCS}; + int varspTPP[3] = {VarManager::kMCPt, VarManager::kMCCosThetaPP, VarManager::kMCPhiPP}; + int binspT[3] = {20, 20, 20}; + double xminpT[3] = {0., -1., -3.14}; + double xmaxpT[3] = {20., 1., +3.14}; + hm->AddHistogram(histClass, "Pt_cosThetaHE_phiHE", "", 3, varspTHE, binspT, xminpT, xmaxpT, 0, -1, kFALSE); + hm->AddHistogram(histClass, "Pt_cosThetaCS_phiCS", "", 3, varspTCS, binspT, xminpT, xmaxpT, 0, -1, kFALSE); + hm->AddHistogram(histClass, "Pt_cosThetaPP_phiPP", "", 3, varspTPP, binspT, xminpT, xmaxpT, 0, -1, kFALSE); } if (!groupStr.CompareTo("mctruth_quad")) { hm->AddHistogram(histClass, "hMass_defaultDileptonMass", "", false, 1000, 3.0, 5.0, VarManager::kQuadDefaultDileptonMass); diff --git a/PWGDQ/Core/VarManager.cxx b/PWGDQ/Core/VarManager.cxx index c329641916a..0c3d58c18cb 100644 --- a/PWGDQ/Core/VarManager.cxx +++ b/PWGDQ/Core/VarManager.cxx @@ -542,6 +542,18 @@ void VarManager::SetDefaultVarNames() fgVariableUnits[kMCVy] = "cm"; // TODO: check the unit fgVariableNames[kMCVz] = "MC vz"; fgVariableUnits[kMCVz] = "cm"; // TODO: check the unit + fgVariableNames[kMCCosThetaHE] = "cos#it{#theta}^{MC}_{HE}"; + fgVariableUnits[kMCCosThetaHE] = ""; + fgVariableNames[kMCPhiHE] = "#varphi^{MC}_{HE}"; + fgVariableUnits[kMCPhiHE] = "rad."; + fgVariableNames[kMCCosThetaCS] = "cos#it{#theta}^{MC}_{CS}"; + fgVariableUnits[kMCCosThetaCS] = ""; + fgVariableNames[kMCPhiCS] = "#varphi^{MC}_{CS}"; + fgVariableUnits[kMCPhiCS] = "rad."; + fgVariableNames[kMCCosThetaPP] = "cos#it{#theta}^{MC}_{PP}"; + fgVariableUnits[kMCCosThetaPP] = ""; + fgVariableNames[kMCPhiPP] = "#varphi^{MC}_{PP}"; + fgVariableUnits[kMCPhiPP] = "rad."; fgVariableNames[kCandidateId] = ""; fgVariableUnits[kCandidateId] = ""; fgVariableNames[kPairType] = "Pair type"; @@ -1441,6 +1453,12 @@ void VarManager::SetDefaultVarNames() fgVarNamesMap["kMCPhi"] = kMCPhi; fgVarNamesMap["kMCEta"] = kMCEta; fgVarNamesMap["kMCY"] = kMCY; + fgVarNamesMap["kMCCosThetaHE"] = kMCCosThetaHE; + fgVarNamesMap["kMCCosThetaCS"] = kMCCosThetaCS; + fgVarNamesMap["kMCCosThetaPP"] = kMCCosThetaPP; + fgVarNamesMap["kMCPhiHE"] = kMCPhiHE; + fgVarNamesMap["kMCPhiCS"] = kMCPhiCS; + fgVarNamesMap["kMCPhiPP"] = kMCPhiPP; fgVarNamesMap["kMCParticleGeneratorId"] = kMCParticleGeneratorId; fgVarNamesMap["kNMCParticleVariables"] = kNMCParticleVariables; fgVarNamesMap["kMCMotherPdgCode"] = kMCMotherPdgCode; diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 0f27dd6f260..3bf0ed01056 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -618,6 +618,14 @@ class VarManager : public TObject // MC mother particle variables kMCMotherPdgCode, + // MC pair variables + kMCCosThetaHE, + kMCCosThetaCS, + kMCCosThetaPP, + kMCPhiHE, + kMCPhiCS, + kMCPhiPP, + // Pair variables kCandidateId, kPairType, @@ -3242,6 +3250,39 @@ void VarManager::FillPairMC(T1 const& t1, T2 const& t2, float* values) values[kMCEta] = v12.Eta(); values[kMCPhi] = v12.Phi(); values[kMCY] = -v12.Rapidity(); + double BeamMomentum = TMath::Sqrt(fgCenterOfMassEnergy * fgCenterOfMassEnergy / 4 - fgMassofCollidingParticle * fgMassofCollidingParticle); // GeV + ROOT::Math::PxPyPzEVector Beam1(0., 0., -BeamMomentum, fgCenterOfMassEnergy / 2); + ROOT::Math::PxPyPzEVector Beam2(0., 0., BeamMomentum, fgCenterOfMassEnergy / 2); + + // Boost to center of mass frame + ROOT::Math::Boost boostv12{v12.BoostToCM()}; + ROOT::Math::XYZVectorF v1_CM{(boostv12(v1).Vect()).Unit()}; + ROOT::Math::XYZVectorF v2_CM{(boostv12(v2).Vect()).Unit()}; + ROOT::Math::XYZVectorF Beam1_CM{(boostv12(Beam1).Vect()).Unit()}; + ROOT::Math::XYZVectorF Beam2_CM{(boostv12(Beam2).Vect()).Unit()}; + + if (fgUsedVars[kMCCosThetaHE] || fgUsedVars[kMCPhiHE]) { + ROOT::Math::XYZVectorF zaxis_HE{(v12.Vect()).Unit()}; + ROOT::Math::XYZVectorF yaxis_HE{(Beam1_CM.Cross(Beam2_CM)).Unit()}; + ROOT::Math::XYZVectorF xaxis_HE{(yaxis_HE.Cross(zaxis_HE)).Unit()}; + values[kMCCosThetaHE] = (t1.pdgCode() < 0 ? zaxis_HE.Dot(v1_CM) : zaxis_HE.Dot(v2_CM)); + values[kMCPhiHE] = (t1.pdgCode() < 0 ? TMath::ATan2(yaxis_HE.Dot(v1_CM), xaxis_HE.Dot(v1_CM)) : TMath::ATan2(yaxis_HE.Dot(v2_CM), xaxis_HE.Dot(v2_CM))); + } + + if (fgUsedVars[kMCCosThetaCS] || fgUsedVars[kMCPhiCS]) { + ROOT::Math::XYZVectorF zaxis_CS{((Beam1_CM.Unit() - Beam2_CM.Unit()).Unit())}; + ROOT::Math::XYZVectorF yaxis_CS{(Beam1_CM.Cross(Beam2_CM)).Unit()}; + ROOT::Math::XYZVectorF xaxis_CS{(yaxis_CS.Cross(zaxis_CS)).Unit()}; + values[kMCCosThetaCS] = (t1.pdgCode() < 0 ? zaxis_CS.Dot(v1_CM) : zaxis_CS.Dot(v2_CM)); + values[kMCPhiCS] = (t1.pdgCode() < 0 ? TMath::ATan2(yaxis_CS.Dot(v1_CM), xaxis_CS.Dot(v1_CM)) : TMath::ATan2(yaxis_CS.Dot(v2_CM), xaxis_CS.Dot(v2_CM))); + } + + if (fgUsedVars[kMCCosThetaPP] || fgUsedVars[kMCPhiPP]) { + ROOT::Math::XYZVectorF zaxis_HE{(v12.Vect()).Unit()}; + ROOT::Math::XYZVector normalVec = ROOT::Math::XYZVector(v12.Py(), -v12.Px(), 0.f); + values[kMCCosThetaPP] = (t1.pdgCode() < 0 ? normalVec.Dot(v1_CM) : normalVec.Dot(v2_CM)); + values[kMCPhiPP] = (t1.pdgCode() < 0 ? TMath::ATan2((normalVec.Dot(v1_CM)), zaxis_HE.Dot(v1_CM)) : TMath::ATan2((normalVec.Dot(v2_CM)), zaxis_HE.Dot(v2_CM))); + } } template diff --git a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx index 3e1a05fd34e..c7093db2c8c 100644 --- a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx +++ b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx @@ -1252,7 +1252,7 @@ struct AnalysisSameEventPairing { Configurable recSignals{"cfgBarrelMCRecSignals", "", "Comma separated list of MC signals (reconstructed)"}; Configurable recSignalsJSON{"cfgMCRecSignalsJSON", "", "Comma separated list of MC signals (reconstructed) via JSON"}; Configurable skimSignalOnly{"cfgSkimSignalOnly", false, "Configurable to select only matched candidates"}; - // Configurable runMCGenPair{"cfgRunMCGenPair", false, "Do pairing of true MC particles"}; + Configurable runMCGenPair{"cfgRunMCGenPair", false, "Do pairing of true MC particles"}; } fConfigMC; struct : ConfigurableGroup { @@ -1981,6 +1981,7 @@ struct AnalysisSameEventPairing { // Preslice perReducedMcEvent = aod::reducedtrackMC::reducedMCeventId; PresliceUnsorted perReducedMcEvent = aod::reducedtrackMC::reducedMCeventId; + template void runMCGen(ReducedMCEvents const& mcEvents, ReducedMCTracks const& mcTracks) { // loop over mc stack and fill histograms for pure MC truth signals @@ -2017,29 +2018,27 @@ struct AnalysisSameEventPairing { } if (fHasTwoProngGenMCsignals) { - for (auto& event : mcEvents) { - auto groupedMCTracks = mcTracks.sliceBy(perReducedMcEvent, event.globalIndex()); - groupedMCTracks.bindInternalIndicesTo(&mcTracks); - for (auto& [t1, t2] : combinations(groupedMCTracks, groupedMCTracks)) { - auto t1_raw = groupedMCTracks.rawIteratorAt(t1.globalIndex()); - auto t2_raw = groupedMCTracks.rawIteratorAt(t2.globalIndex()); + for (auto& [t1, t2] : combinations(mcTracks, mcTracks)) { + auto t1_raw = mcTracks.rawIteratorAt(t1.globalIndex()); + auto t2_raw = mcTracks.rawIteratorAt(t2.globalIndex()); + if (t1_raw.reducedMCeventId() == t2_raw.reducedMCeventId()) { for (auto& sig : fGenMCSignals) { if (sig->GetNProngs() != 2) { // NOTE: 2-prong signals required here continue; } if (sig->CheckSignal(true, t1_raw, t2_raw)) { mcDecision |= (static_cast(1) << isig); - VarManager::FillPairMC(t1, t2); + VarManager::FillPairMC(t1, t2); fHistMan->FillHistClass(Form("MCTruthGenPair_%s", sig->GetName()), VarManager::fgValues); if (useMiniTree.fConfigMiniTree) { // WARNING! To be checked - dileptonMiniTreeGen(mcDecision, event.impactParameter(), t1.pt(), t1.eta(), t1.phi(), t2.pt(), t2.eta(), t2.phi()); + dileptonMiniTreeGen(mcDecision, -999, t1.pt(), t1.eta(), t1.phi(), t2.pt(), t2.eta(), t2.phi()); } } isig++; - } // end loop over MC signals - } // end loop over pairs - } // end loop over events + } + } + } } } // end runMCGen @@ -2051,9 +2050,9 @@ struct AnalysisSameEventPairing { runSameEventPairing(events, trackAssocsPerCollision, barrelAssocs, barrelTracks, mcEvents, mcTracks); runSameEventPairing(events, muonAssocsPerCollision, muonAssocs, muons, mcEvents, mcTracks); // Feature replaced by processMCGen - /*if (fConfigMC.runMCGenPair) { - runMCGen(mcEvents, mcTracks); - }*/ + if (fConfigMC.runMCGenPair) { + runMCGen(mcEvents, mcTracks); + } // runSameEventPairing(event, tracks, muons); } @@ -2063,9 +2062,9 @@ struct AnalysisSameEventPairing { { runSameEventPairing(events, trackAssocsPerCollision, barrelAssocs, barrelTracks, mcEvents, mcTracks); // Feature replaced by processMCGen - /*if (fConfigMC.runMCGenPair) { - runMCGen(mcEvents, mcTracks); - }*/ + if (fConfigMC.runMCGenPair) { + runMCGen(mcEvents, mcTracks); + } } void processBarrelOnlyWithCollSkimmed(MyEventsVtxCovSelected const& events, @@ -2074,9 +2073,9 @@ struct AnalysisSameEventPairing { { runSameEventPairing(events, trackAssocsPerCollision, barrelAssocs, barrelTracks, mcEvents, mcTracks); // Feature replaced by processMCGen - /*if (fConfigMC.runMCGenPair) { - runMCGen(mcEvents, mcTracks); - }*/ + if (fConfigMC.runMCGenPair) { + runMCGen(mcEvents, mcTracks); + } } void processMuonOnlySkimmed(MyEventsVtxCovSelected const& events, @@ -2084,9 +2083,9 @@ struct AnalysisSameEventPairing { { runSameEventPairing(events, muonAssocsPerCollision, muonAssocs, muons, mcEvents, mcTracks); // Feature replaced by processMCGen - /*if (fConfigMC.runMCGenPair) { - runMCGen(mcEvents, mcTracks); - }*/ + if (fConfigMC.runMCGenPair) { + runMCGen(mcEvents, mcTracks); + } } PresliceUnsorted perReducedMcGenEvent = aod::reducedtrackMC::reducedMCeventId; From ced47c35bbb925d2c6b9d4e3889743dcfd891e41 Mon Sep 17 00:00:00 2001 From: Jaideep Tanwar <141036812+jtanwar2212@users.noreply.github.com> Date: Wed, 7 May 2025 12:35:16 +0530 Subject: [PATCH 1204/1650] [PWGLF] updated cuts to refine the analysis (#11107) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Nuspex/CMakeLists.txt | 2 +- .../{NucleitpcPbPb.cxx => NucleiTPCPbPb.cxx} | 59 ++++++++++++------- 2 files changed, 40 insertions(+), 21 deletions(-) rename PWGLF/Tasks/Nuspex/{NucleitpcPbPb.cxx => NucleiTPCPbPb.cxx} (94%) diff --git a/PWGLF/Tasks/Nuspex/CMakeLists.txt b/PWGLF/Tasks/Nuspex/CMakeLists.txt index 0f16d5e7b58..5041673105f 100644 --- a/PWGLF/Tasks/Nuspex/CMakeLists.txt +++ b/PWGLF/Tasks/Nuspex/CMakeLists.txt @@ -85,7 +85,7 @@ o2physics_add_dpl_workflow(spectra-tpc-tiny COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(nuclei-tpcspectra - SOURCES NucleitpcPbPb.cxx + SOURCES NucleiTPCPbPb.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) diff --git a/PWGLF/Tasks/Nuspex/NucleitpcPbPb.cxx b/PWGLF/Tasks/Nuspex/NucleiTPCPbPb.cxx similarity index 94% rename from PWGLF/Tasks/Nuspex/NucleitpcPbPb.cxx rename to PWGLF/Tasks/Nuspex/NucleiTPCPbPb.cxx index 100072becbb..f0bc8ee1851 100644 --- a/PWGLF/Tasks/Nuspex/NucleitpcPbPb.cxx +++ b/PWGLF/Tasks/Nuspex/NucleiTPCPbPb.cxx @@ -8,15 +8,20 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file NucleitpcPbPb.cxx -/// \brief Analysis task for light nuclei spectra in Pb–Pb collisions using TPC -/// \author Jaideep Tanwar, -/// \since Jan 2025 /// +/// \file NucleiTPCPbPb.cxx +/// +/// \brief This task use global tracks and used for primary selection analysis using TPC detector. +/// It currently contemplates 6 particle types: +/// pion, Proton, Deuteron, Triton, Helium3, Alpha +/// +/// \author Jaideep Tanwar +/// \since Jan. 20, 2025 +/// +#include #include #include #include -#include #include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -42,7 +47,7 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; using CollisionsFull = soa::Join; -using TracksFull = soa::Join; +using TracksFull = soa::Join; //--------------------------------------------------------------------------------------------------------------------------------- namespace { @@ -97,12 +102,16 @@ struct NucleitpcPbPb { Configurable cfgRigidityCorrection{"cfgRigidityCorrection", false, "apply rigidity correction"}; Configurable cfgCutEta{"cfgCutEta", 0.9f, "Eta range for tracks"}; Configurable cfgUsePVcontributors{"cfgUsePVcontributors", true, "use tracks that are PV contibutors"}; + Configurable cfgITSrequire{"cfgITSrequire", true, "Additional cut on ITS require"}; + Configurable cfgTPCrequire{"cfgTPCrequire", true, "Additional cut on TPC require"}; + Configurable cfgPassedITSRefit{"cfgPassedITSRefit", true, "Require ITS refit"}; + Configurable cfgPassedTPCRefit{"cfgPassedTPCRefit", true, "Require TPC refit"}; Configurable> cfgBetheBlochParams{"cfgBetheBlochParams", {betheBlochDefault[0], nParticles, nBetheParams, particleNames, betheBlochParNames}, "TPC Bethe-Bloch parameterisation for light nuclei"}; Configurable> cfgTrackPIDsettings{"cfgTrackPIDsettings", {trackPIDsettings[0], nParticles, nTrkSettings, particleNames, trackPIDsettingsNames}, "track selection and PID criteria"}; Configurable cfgFillDeDxWithoutCut{"cfgFillDeDxWithoutCut", false, "Fill without cut beth bloch"}; Configurable cfgFillDeDxWithCut{"cfgFillDeDxWithCut", false, "Fill with cut beth bloch"}; - Configurable cfgFillnsigma{"cfgFillnsigma", false, "Fill n-sigma histograms"}; - Configurable cfgFillmass{"cfgFillmass", true, "Fill mass histograms"}; + Configurable cfgFillnsigma{"cfgFillnsigma", true, "Fill n-sigma histograms"}; + Configurable cfgFillmass{"cfgFillmass", false, "Fill mass histograms"}; Configurable centcut{"centcut", 80.0f, "centrality cut"}; Configurable cfgCutRapidity{"cfgCutRapidity", 0.5f, "Rapidity range"}; Configurable cfgZvertex{"cfgZvertex", 10, "Min Z Vertex"}; @@ -193,23 +202,21 @@ struct NucleitpcPbPb { for (const auto& trackId : tracksByColl) { const auto& track = tracks.rawIteratorAt(trackId.trackId()); filldedx(track, nParticles); + if (!track.isPVContributor() && cfgUsePVcontributors) + continue; + if (!track.hasITS() && cfgITSrequire) + continue; + if (!track.hasTPC() && cfgTPCrequire) + continue; + if (!track.passedITSRefit() && cfgPassedITSRefit) + continue; + if (!track.passedTPCRefit() && cfgPassedTPCRefit) + continue; if (std::abs(track.eta()) > cfgCutEta) continue; - histos.fill(HIST("histeta"), track.eta()); for (size_t i = 0; i < primaryParticles.size(); i++) { if (std::abs(getRapidity(track, i)) > cfgCutRapidity) continue; - bool insideDCAxy = (std::abs(track.dcaXY()) <= (cfgTrackPIDsettings->get(i, "maxDcaXY") * (0.0105f + 0.0350f / std::pow(track.pt(), 1.1f)))); - if (!(insideDCAxy) || std::abs(track.dcaZ()) > cfgTrackPIDsettings->get(i, "maxDcaZ")) - continue; - if (track.sign() > 0) { - histos.fill(HIST("histDcaZVsPtData_particle"), track.pt(), track.dcaZ()); - histos.fill(HIST("histDcaXYVsPtData_particle"), track.pt(), track.dcaXY()); - } - if (track.sign() < 0) { - histos.fill(HIST("histDcaZVsPtData_antiparticle"), track.pt(), track.dcaZ()); - histos.fill(HIST("histDcaXYVsPtData_antiparticle"), track.pt(), track.dcaXY()); - } if (track.tpcNClsFound() < cfgTrackPIDsettings->get(i, "minTPCnCls")) continue; if (track.tpcChi2NCl() > cfgTrackPIDsettings->get(i, "maxTPCchi2")) @@ -231,7 +238,19 @@ struct NucleitpcPbPb { continue; if (cfgTrackPIDsettings->get(i, "TOFrequiredabove") >= 0 && getRigidity(track) > cfgTrackPIDsettings->get(i, "TOFrequiredabove") && (track.mass() < cfgTrackPIDsettings->get(i, "minTOFmass") || track.mass() > cfgTrackPIDsettings->get(i, "maxTOFmass"))) continue; + bool insideDCAxy = (std::abs(track.dcaXY()) <= (cfgTrackPIDsettings->get(i, "maxDcaXY") * (0.0105f + 0.0350f / std::pow(track.pt(), 1.1f)))); + if (!(insideDCAxy) || std::abs(track.dcaZ()) > cfgTrackPIDsettings->get(i, "maxDcaZ")) + continue; + if (track.sign() > 0) { + histos.fill(HIST("histDcaZVsPtData_particle"), track.pt(), track.dcaZ()); + histos.fill(HIST("histDcaXYVsPtData_particle"), track.pt(), track.dcaXY()); + } + if (track.sign() < 0) { + histos.fill(HIST("histDcaZVsPtData_antiparticle"), track.pt(), track.dcaZ()); + histos.fill(HIST("histDcaXYVsPtData_antiparticle"), track.pt(), track.dcaXY()); + } } + histos.fill(HIST("histeta"), track.eta()); } // track loop } //---------------------------------------------------------------------------------------------------------------- From 592778f9807f9e5f37afd3046440c334c44a013f Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Wed, 7 May 2025 18:13:37 +0900 Subject: [PATCH 1205/1650] [Common] add setBcWindow in fwdtrackToCollisionAssociator.cxx (#10998) --- Common/TableProducer/fwdtrackToCollisionAssociator.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/Common/TableProducer/fwdtrackToCollisionAssociator.cxx b/Common/TableProducer/fwdtrackToCollisionAssociator.cxx index 0478b69b12d..20d6e4c6a60 100644 --- a/Common/TableProducer/fwdtrackToCollisionAssociator.cxx +++ b/Common/TableProducer/fwdtrackToCollisionAssociator.cxx @@ -64,6 +64,7 @@ struct FwdTrackToCollisionAssociation { collisionAssociator.setUsePvAssociation(false); collisionAssociator.setIncludeUnassigned(includeUnassigned); collisionAssociator.setFillTableOfCollIdsPerTrack(fillTableOfCollIdsPerTrack); + collisionAssociator.setBcWindow(bcWindowForOneSigma); } void processFwdAssocWithTime(Collisions const& collisions, From 076189db124cefee022d1943b4659cfdcd037429 Mon Sep 17 00:00:00 2001 From: ldellost <47105254+DelloStritto@users.noreply.github.com> Date: Wed, 7 May 2025 11:23:06 +0200 Subject: [PATCH 1206/1650] [PWGHF] Add Lc inv mass cut in the LcpK0s selector (#11109) Co-authored-by: Luigi Dello Stritto --- PWGHF/Core/SelectorCuts.h | 22 +++++++++---------- .../candidateSelectorLcToK0sP.cxx | 4 ++++ 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/PWGHF/Core/SelectorCuts.h b/PWGHF/Core/SelectorCuts.h index b064642fe90..61e17b16ff1 100644 --- a/PWGHF/Core/SelectorCuts.h +++ b/PWGHF/Core/SelectorCuts.h @@ -528,7 +528,7 @@ static const std::vector labelsCutKfVar = {"kfChi2PrimPr", "kfChi2P namespace hf_cuts_lc_to_k0s_p { static constexpr int NBinsPt = 8; -static constexpr int NCutVars = 8; +static constexpr int NCutVars = 9; // default values for the pT bin edges (can be used to configure histogram axis) // offset by 1 from the bin numbers in cuts array constexpr double BinsPt[NBinsPt + 1] = { @@ -544,15 +544,15 @@ constexpr double BinsPt[NBinsPt + 1] = { auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; // default values for the cuts -// mK0s(GeV) mLambdas(GeV) mGammas(GeV) ptp ptK0sdau ptK0s d0p d0K0 -constexpr double Cuts[NBinsPt][NCutVars] = {{0.008, 0.005, 0.1, 0.5, 0.3, 0.6, 0.05, 999999.}, // 1 < pt < 2 - {0.008, 0.005, 0.1, 0.5, 0.4, 1.3, 0.05, 999999.}, // 2 < pt < 3 - {0.009, 0.005, 0.1, 0.6, 0.4, 1.3, 0.05, 999999.}, // 3 < pt < 4 - {0.011, 0.005, 0.1, 0.6, 0.4, 1.4, 0.05, 999999.}, // 4 < pt < 5 - {0.013, 0.005, 0.1, 0.6, 0.4, 1.4, 0.06, 999999.}, // 5 < pt < 6 - {0.013, 0.005, 0.1, 0.9, 0.4, 1.6, 0.09, 999999.}, // 6 < pt < 8 - {0.016, 0.005, 0.1, 0.9, 0.4, 1.7, 0.10, 999999.}, // 8 < pt < 12 - {0.019, 0.005, 0.1, 1.0, 0.4, 1.9, 0.20, 999999.}}; // 12 < pt < 24 +// mLc(GeV) mK0s(GeV) mLambdas(GeV) mGammas(GeV) ptp ptK0sdau ptK0s d0p d0K0 +constexpr double Cuts[NBinsPt][NCutVars] = {{0.4, 0.008, 0.005, 0.1, 0.5, 0.3, 0.6, 0.05, 999999.}, // 1 < pt < 2 + {0.4, 0.008, 0.005, 0.1, 0.5, 0.4, 1.3, 0.05, 999999.}, // 2 < pt < 3 + {0.4, 0.009, 0.005, 0.1, 0.6, 0.4, 1.3, 0.05, 999999.}, // 3 < pt < 4 + {0.4, 0.011, 0.005, 0.1, 0.6, 0.4, 1.4, 0.05, 999999.}, // 4 < pt < 5 + {0.4, 0.013, 0.005, 0.1, 0.6, 0.4, 1.4, 0.06, 999999.}, // 5 < pt < 6 + {0.4, 0.013, 0.005, 0.1, 0.9, 0.4, 1.6, 0.09, 999999.}, // 6 < pt < 8 + {0.4, 0.016, 0.005, 0.1, 0.9, 0.4, 1.7, 0.10, 999999.}, // 8 < pt < 12 + {0.4, 0.019, 0.005, 0.1, 1.0, 0.4, 1.9, 0.20, 999999.}}; // 12 < pt < 24 // row labels static const std::vector labelsPt = { @@ -566,7 +566,7 @@ static const std::vector labelsPt = { "pT bin 7"}; // column labels -static const std::vector labelsCutVar = {"mK0s", "mLambda", "mGamma", "ptBach", "ptV0Dau", "ptV0", "d0Bach", "d0V0"}; +static const std::vector labelsCutVar = {"mLc", "mK0s", "mLambda", "mGamma", "ptBach", "ptV0Dau", "ptV0", "d0Bach", "d0V0"}; } // namespace hf_cuts_lc_to_k0s_p namespace hf_cuts_dplus_to_pi_k_pi diff --git a/PWGHF/TableProducer/candidateSelectorLcToK0sP.cxx b/PWGHF/TableProducer/candidateSelectorLcToK0sP.cxx index f1e52a18a94..7095fc2b8a1 100644 --- a/PWGHF/TableProducer/candidateSelectorLcToK0sP.cxx +++ b/PWGHF/TableProducer/candidateSelectorLcToK0sP.cxx @@ -148,6 +148,10 @@ struct HfCandidateSelectorLcToK0sP { return false; // check that the candidate pT is within the analysis range } + if (std::abs(hfHelper.invMassLcToK0sP(hfCandCascade) - o2::constants::physics::MassLambdaCPlus) > cuts->get(ptBin, "mLc")) { + return false; // mass of the Lambda c + } + if (std::abs(hfCandCascade.mK0Short() - o2::constants::physics::MassK0Short) > cuts->get(ptBin, "mK0s")) { return false; // mass of the K0s } From e2f7c4ec25b25d01f671fe23e380902fc257f9fe Mon Sep 17 00:00:00 2001 From: Lucia Anna Tarasovicova Date: Wed, 7 May 2025 11:37:59 +0200 Subject: [PATCH 1207/1650] [PWGLF] change in PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx (#11108) Co-authored-by: Lucia Anna Tarasovicova --- .../Strangeness/hStrangeCorrelationFilter.cxx | 2 +- .../Tasks/Strangeness/hStrangeCorrelation.cxx | 103 ++++++++++-------- 2 files changed, 61 insertions(+), 44 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx b/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx index 082d04f6bb5..5d35e12e798 100644 --- a/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx +++ b/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx @@ -461,7 +461,7 @@ struct HStrangeCorrelationFilter { continue; } } - void processAssocHadronsMC(soa::Join::iterator const& collision, soa::Filtered const& tracks, aod::BCsWithTimestamps const&) + void processAssocHadronsMC(soa::Join::iterator const& collision, soa::Filtered const& tracks, aod::McParticles const&, aod::BCsWithTimestamps const&) { // Perform basic event selection if (!collision.sel8()) { diff --git a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx index a58b485f114..c36fba2aa79 100644 --- a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx +++ b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx @@ -86,6 +86,8 @@ struct HStrangeCorrelation { Configurable triggerBinToSelect{"triggerBinToSelect", 0, "trigger bin to select on if processSelectEventWithTrigger enabled"}; Configurable triggerParticleCharge{"triggerParticleCharge", 0, "For checks, if 0 all charged tracks, if -1 only neg., if 1 only positive"}; + Configurable etaSel{"etaSel", 0.8, "Selection in eta for trigger and associated particles"}; + Configurable ySel{"ySel", 0.5, "Selection in rapidity for consistency checks"}; // Axes - configurable for smaller sizes ConfigurableAxis axisMult{"axisMult", {VARIABLE_WIDTH, 0.0f, 0.01f, 1.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 70.0f, 100.0f}, "Mixing bins - multiplicity"}; @@ -153,6 +155,9 @@ struct HStrangeCorrelation { // dE/dx for associated daughters Configurable dEdxCompatibility{"dEdxCompatibility", 1, "0: loose, 1: normal, 2: tight. Defined in HStrangeCorrelationFilter"}; + // on the fly correction instead of mixingParameter + Configurable doOnTheFlyFlattening{"doOnTheFlyFlattening", 0, "enable an on-the-fly correction instead of using mixing"}; + // (N.B.: sources that can be investigated in post are not listed!) } systCuts; @@ -562,6 +567,12 @@ struct HStrangeCorrelation { float ptassoc = assoc.pt(); float pttrigger = trigg.pt(); + float etaWeight = 1.; + if (systCuts.doOnTheFlyFlattening) { + float preWeight = 1 - std::abs(deltaeta) / 1.6; + etaWeight = preWeight != 0 ? 1.0f / preWeight : 0.0f; + } + // skip if basic ranges not met if (deltaphi < axisRanges[0][0] || deltaphi > axisRanges[0][1]) continue; @@ -588,9 +599,9 @@ struct HStrangeCorrelation { if (!mixing) { if constexpr (requires { assocTrack.nSigmaTPCPi(); }) { - histos.fill(HIST("sameEvent/Signal/Pion"), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); + histos.fill(HIST("sameEvent/Signal/Pion"), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight * etaWeight); } else { - histos.fill(HIST("sameEvent/Signal/Hadron"), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); + histos.fill(HIST("sameEvent/Signal/Hadron"), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight * etaWeight); } } else { if constexpr (requires { assocTrack.nSigmaTPCPi(); }) { @@ -873,7 +884,7 @@ struct HStrangeCorrelation { // MC generated plots if (doprocessMCGenerated) { histos.add("Generated/hTrigger", "", kTH2F, {axisPtQA, axisEta}); - for (int i = 0; i < 8; i++) { + for (int i = 0; i < 9; i++) { histos.add(fmt::format("Generated/h{}", kParticlenames[i]).c_str(), "", kTH2F, {axisPtQA, axisEta}); } histos.addClone("Generated/", "GeneratedWithPV/"); @@ -885,7 +896,7 @@ struct HStrangeCorrelation { } } if (doprocessClosureTest) { - for (int i = 0; i < 8; i++) { + for (int i = 0; i < 9; i++) { if (TESTBIT(doCorrelation, i)) histos.add(fmt::format("ClosureTest/sameEvent/{}", kParticlenames[i]).c_str(), "", kTHnF, {axisDeltaPhiNDim, axisDeltaEtaNDim, axisPtAssocNDim, axisPtTriggerNDim, axisVtxZNDim, axisMultNDim}); if (TESTBIT(doCorrelation, i)) @@ -1121,7 +1132,7 @@ struct HStrangeCorrelation { if (v0.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || v0.mcTrue(Index)) && (!doAssocPhysicalPrimary || v0.mcPhysicalPrimary()) && (!applyEfficiencyCorrection || efficiency != 0)) { if (TESTBIT(doCorrelation, Index)) { histos.fill(HIST("h3d") + HIST(kV0names[Index]) + HIST("Spectrum"), v0Data.pt(), collision.centFT0M(), v0.invMassNSigma(Index), weight); - if (std::abs(v0Data.rapidity(Index)) < 0.5) { + if (std::abs(v0Data.rapidity(Index)) < ySel) { histos.fill(HIST("h3d") + HIST(kV0names[Index]) + HIST("SpectrumY"), v0Data.pt(), collision.centFT0M(), v0.invMassNSigma(Index), weight); } if ((-massWindowConfigurations.maxBgNSigma < v0.invMassNSigma(Index) && v0.invMassNSigma(Index) < -massWindowConfigurations.minBgNSigma) || (+massWindowConfigurations.minBgNSigma < v0.invMassNSigma(Index) && v0.invMassNSigma(Index) < +massWindowConfigurations.maxBgNSigma)) { @@ -1219,7 +1230,7 @@ struct HStrangeCorrelation { if (casc.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || casc.mcTrue(Index)) && (!doAssocPhysicalPrimary || casc.mcPhysicalPrimary()) && (!applyEfficiencyCorrection || efficiency != 0)) { if (TESTBIT(doCorrelation, Index + 3)) { histos.fill(HIST("h3d") + HIST(kCascadenames[Index]) + HIST("Spectrum"), cascData.pt(), collision.centFT0M(), casc.invMassNSigma(Index), weight); - if (std::abs(cascData.rapidity(Index)) < 0.5) { + if (std::abs(cascData.rapidity(Index)) < ySel) { histos.fill(HIST("h3d") + HIST(kCascadenames[Index]) + HIST("SpectrumY"), cascData.pt(), collision.centFT0M(), casc.invMassNSigma(Index), weight); } if (-massWindowConfigurations.maxPeakNSigma < casc.invMassNSigma(Index) && casc.invMassNSigma(Index) < +massWindowConfigurations.maxPeakNSigma) { @@ -1473,18 +1484,18 @@ struct HStrangeCorrelation { for (auto const& mcParticle : mcParticles) { double geta = mcParticle.eta(); - if (std::abs(geta) > 0.8f) { + if (std::abs(geta) > etaSel) { continue; } double gpt = mcParticle.pt(); - if (std::abs(mcParticle.pdgCode()) == 211 || std::abs(mcParticle.pdgCode()) == 321 || std::abs(mcParticle.pdgCode()) == 2212 || std::abs(mcParticle.pdgCode()) == 11 || std::abs(mcParticle.pdgCode()) == 13) { + if (std::abs(mcParticle.pdgCode()) == PDG_t::kPiPlus || std::abs(mcParticle.pdgCode()) == PDG_t::kKPlus || std::abs(mcParticle.pdgCode()) == PDG_t::kProton || std::abs(mcParticle.pdgCode()) == PDG_t::kElectron || std::abs(mcParticle.pdgCode()) == PDG_t::kMuonMinus) { if (!doTriggPhysicalPrimary || mcParticle.isPhysicalPrimary()) { histos.fill(HIST("hGeneratedQAPtTrigger"), gpt, 0.0f); // step 1: before all selections } } if (!doAssocPhysicalPrimary || mcParticle.isPhysicalPrimary()) { - if (mcParticle.pdgCode() == 310 && doCorrelationK0Short) { + if (mcParticle.pdgCode() == PDG_t::kK0Short && doCorrelationK0Short) { histos.fill(HIST("hGeneratedQAPtAssociatedK0"), gpt, 0.0f); // step 1: before all selections } } @@ -1531,7 +1542,7 @@ struct HStrangeCorrelation { for (auto const& mcParticle : mcParticles) { if (!mcParticle.isPhysicalPrimary()) continue; - if (std::abs(mcParticle.y()) > 0.5) + if (std::abs(mcParticle.y()) > ySel) continue; static_for<0, 7>([&](auto i) { constexpr int Index = i.value; @@ -1566,18 +1577,18 @@ struct HStrangeCorrelation { for (auto const& mcParticle : mcParticles) { double geta = mcParticle.eta(); - if (std::abs(geta) > 0.8f) { + if (std::abs(geta) > etaSel) { continue; } double gpt = mcParticle.pt(); - if (std::abs(mcParticle.pdgCode()) == 211 || std::abs(mcParticle.pdgCode()) == 321 || std::abs(mcParticle.pdgCode()) == 2212 || std::abs(mcParticle.pdgCode()) == 11 || std::abs(mcParticle.pdgCode()) == 13) { + if (std::abs(mcParticle.pdgCode()) == PDG_t::kPiPlus || std::abs(mcParticle.pdgCode()) == PDG_t::kKPlus || std::abs(mcParticle.pdgCode()) == PDG_t::kProton || std::abs(mcParticle.pdgCode()) == PDG_t::kElectron || std::abs(mcParticle.pdgCode()) == PDG_t::kMuonMinus) { if (!doTriggPhysicalPrimary || mcParticle.isPhysicalPrimary()) { histos.fill(HIST("hGeneratedQAPtTrigger"), gpt, 1.0f); // step 2: after event selection } } if (!doAssocPhysicalPrimary || mcParticle.isPhysicalPrimary()) { - if (mcParticle.pdgCode() == 310 && doCorrelationK0Short) { + if (mcParticle.pdgCode() == PDG_t::kK0Short && doCorrelationK0Short) { histos.fill(HIST("hGeneratedQAPtAssociatedK0"), gpt, 1.0f); // step 2: before all selections } } @@ -1589,21 +1600,21 @@ struct HStrangeCorrelation { } double geta = mcParticle.eta(); double gpt = mcParticle.pt(); - if (std::abs(mcParticle.pdgCode()) == 211 || std::abs(mcParticle.pdgCode()) == 321 || std::abs(mcParticle.pdgCode()) == 2212 || std::abs(mcParticle.pdgCode()) == 11 || std::abs(mcParticle.pdgCode()) == 13) + if (std::abs(mcParticle.pdgCode()) == PDG_t::kPiPlus || std::abs(mcParticle.pdgCode()) == PDG_t::kKPlus || std::abs(mcParticle.pdgCode()) == PDG_t::kProton || std::abs(mcParticle.pdgCode()) == PDG_t::kElectron || std::abs(mcParticle.pdgCode()) == PDG_t::kMuonMinus) histos.fill(HIST("GeneratedWithPV/hTrigger"), gpt, geta); static_for<0, 7>([&](auto i) { constexpr int Index = i.value; if (i == 0 || i == 7) { if (std::abs(mcParticle.pdgCode()) == kPdgCodes[i]) { histos.fill(HIST("GeneratedWithPV/h") + HIST(kParticlenames[Index]), gpt, geta); - if (std::abs(mcParticle.y()) < 0.5) + if (std::abs(mcParticle.y()) < ySel) histos.fill(HIST("GeneratedWithPV/h") + HIST(kParticlenames[Index]) + HIST("_MidYVsMult"), gpt, bestCollisionFT0Mpercentile); } } else { if (mcParticle.pdgCode() == kPdgCodes[i]) { histos.fill(HIST("GeneratedWithPV/h") + HIST(kParticlenames[Index]), gpt, geta); - if (std::abs(mcParticle.y()) < 0.5) + if (std::abs(mcParticle.y()) < ySel) histos.fill(HIST("GeneratedWithPV/h") + HIST(kParticlenames[Index]) + HIST("_MidYVsMult"), gpt, bestCollisionFT0Mpercentile); } } @@ -1615,6 +1626,7 @@ struct HStrangeCorrelation { std::vector triggerIndices; std::vector> associatedIndices; + std::vector assocHadronIndices; std::vector piIndices; std::vector k0ShortIndices; std::vector lambdaIndices; @@ -1626,18 +1638,18 @@ struct HStrangeCorrelation { for (auto const& mcParticle : mcParticles) { double geta = mcParticle.eta(); - if (std::abs(geta) > 0.8f) { + if (std::abs(geta) > etaSel) { continue; } double gpt = mcParticle.pt(); - if (std::abs(mcParticle.pdgCode()) == 211 || std::abs(mcParticle.pdgCode()) == 321 || std::abs(mcParticle.pdgCode()) == 2212 || std::abs(mcParticle.pdgCode()) == 11 || std::abs(mcParticle.pdgCode()) == 13) { + if (std::abs(mcParticle.pdgCode()) == PDG_t::kPiPlus || std::abs(mcParticle.pdgCode()) == PDG_t::kKPlus || std::abs(mcParticle.pdgCode()) == PDG_t::kProton || std::abs(mcParticle.pdgCode()) == PDG_t::kElectron || std::abs(mcParticle.pdgCode()) == PDG_t::kMuonMinus) { if (!doTriggPhysicalPrimary || mcParticle.isPhysicalPrimary()) { histos.fill(HIST("hClosureQAPtTrigger"), gpt, 0.0f); // step 1: no event selection whatsoever } } if (!doAssocPhysicalPrimary || mcParticle.isPhysicalPrimary()) { - if (mcParticle.pdgCode() == 310 && doCorrelationK0Short) { + if (mcParticle.pdgCode() == PDG_t::kK0Short && doCorrelationK0Short) { histos.fill(HIST("hClosureQAPtAssociatedK0"), gpt, 0.0f); // step 1: no event selection whatsoever } } @@ -1685,18 +1697,18 @@ struct HStrangeCorrelation { for (auto const& mcParticle : mcParticles) { double geta = mcParticle.eta(); - if (std::abs(geta) > 0.8f) { + if (std::abs(geta) > etaSel) { continue; } double gpt = mcParticle.pt(); - if (std::abs(mcParticle.pdgCode()) == 211 || std::abs(mcParticle.pdgCode()) == 321 || std::abs(mcParticle.pdgCode()) == 2212 || std::abs(mcParticle.pdgCode()) == 11 || std::abs(mcParticle.pdgCode()) == 13) { + if (std::abs(mcParticle.pdgCode()) == PDG_t::kPiPlus || std::abs(mcParticle.pdgCode()) == PDG_t::kKPlus || std::abs(mcParticle.pdgCode()) == PDG_t::kProton || std::abs(mcParticle.pdgCode()) == PDG_t::kElectron || std::abs(mcParticle.pdgCode()) == PDG_t::kMuonMinus) { if (!doTriggPhysicalPrimary || mcParticle.isPhysicalPrimary()) { histos.fill(HIST("hClosureQAPtTrigger"), gpt, 1.0f); // step 2: after event selection } } if (!doAssocPhysicalPrimary || mcParticle.isPhysicalPrimary()) { - if (mcParticle.pdgCode() == 310 && doCorrelationK0Short) { + if (mcParticle.pdgCode() == PDG_t::kK0Short && doCorrelationK0Short) { histos.fill(HIST("hClosureQAPtAssociatedK0"), gpt, 1.0f); // step 2: after event selection } } @@ -1708,45 +1720,49 @@ struct HStrangeCorrelation { double geta = mcParticle.eta(); double gpt = mcParticle.pt(); double gphi = mcParticle.phi(); - if (std::abs(geta) > 0.8f) { + if (std::abs(geta) > etaSel) { continue; } - if (std::abs(mcParticle.pdgCode()) == 211 || std::abs(mcParticle.pdgCode()) == 321 || std::abs(mcParticle.pdgCode()) == 2212 || std::abs(mcParticle.pdgCode()) == 11 || std::abs(mcParticle.pdgCode()) == 13) { + if (std::abs(mcParticle.pdgCode()) == PDG_t::kPiPlus || std::abs(mcParticle.pdgCode()) == PDG_t::kKPlus || std::abs(mcParticle.pdgCode()) == PDG_t::kProton || std::abs(mcParticle.pdgCode()) == PDG_t::kElectron || std::abs(mcParticle.pdgCode()) == PDG_t::kMuonMinus) { if (!doTriggPhysicalPrimary || mcParticle.isPhysicalPrimary()) { triggerIndices.emplace_back(iteratorNum); histos.fill(HIST("ClosureTest/hTrigger"), gpt, geta, bestCollisionFT0Mpercentile); + if (doCorrelationHadron) { + assocHadronIndices.emplace_back(iteratorNum); + histos.fill(HIST("ClosureTest/hHadron"), gpt, geta, bestCollisionFT0Mpercentile); + } } } if (!doAssocPhysicalPrimary || mcParticle.isPhysicalPrimary()) { - if (std::abs(mcParticle.pdgCode()) == 211 && doCorrelationPion) { + if (std::abs(mcParticle.pdgCode()) == PDG_t::kPiPlus && doCorrelationPion) { piIndices.emplace_back(iteratorNum); histos.fill(HIST("ClosureTest/hPion"), gpt, geta, gphi); } - if (mcParticle.pdgCode() == 310 && doCorrelationK0Short) { + if (mcParticle.pdgCode() == PDG_t::kK0Short && doCorrelationK0Short) { k0ShortIndices.emplace_back(iteratorNum); histos.fill(HIST("ClosureTest/hK0Short"), gpt, geta, gphi); } - if (mcParticle.pdgCode() == 3122 && doCorrelationLambda) { + if (mcParticle.pdgCode() == PDG_t::kLambda0 && doCorrelationLambda) { lambdaIndices.emplace_back(iteratorNum); histos.fill(HIST("ClosureTest/hLambda"), gpt, geta, gphi); } - if (mcParticle.pdgCode() == -3122 && doCorrelationAntiLambda) { + if (mcParticle.pdgCode() == PDG_t::kLambda0Bar && doCorrelationAntiLambda) { antiLambdaIndices.emplace_back(iteratorNum); histos.fill(HIST("ClosureTest/hAntiLambda"), gpt, geta, gphi); } - if (mcParticle.pdgCode() == 3312 && doCorrelationXiMinus) { + if (mcParticle.pdgCode() == PDG_t::kXiMinus && doCorrelationXiMinus) { xiMinusIndices.emplace_back(iteratorNum); histos.fill(HIST("ClosureTest/hXiMinus"), gpt, geta, gphi); } - if (mcParticle.pdgCode() == -3312 && doCorrelationXiPlus) { + if (mcParticle.pdgCode() == PDG_t::kXiPlusBar && doCorrelationXiPlus) { xiPlusIndices.emplace_back(iteratorNum); histos.fill(HIST("ClosureTest/hXiPlus"), gpt, geta, gphi); } - if (mcParticle.pdgCode() == 3334 && doCorrelationOmegaMinus) { + if (mcParticle.pdgCode() == PDG_t::kOmegaMinus && doCorrelationOmegaMinus) { omegaMinusIndices.emplace_back(iteratorNum); histos.fill(HIST("ClosureTest/hOmegaMinus"), gpt, geta, gphi); } - if (mcParticle.pdgCode() == -3334 && doCorrelationOmegaPlus) { + if (mcParticle.pdgCode() == PDG_t::kOmegaPlusBar && doCorrelationOmegaPlus) { omegaPlusIndices.emplace_back(iteratorNum); histos.fill(HIST("ClosureTest/hOmegaPlus"), gpt, geta, gphi); } @@ -1761,6 +1777,7 @@ struct HStrangeCorrelation { associatedIndices.emplace_back(omegaMinusIndices); associatedIndices.emplace_back(omegaPlusIndices); associatedIndices.emplace_back(piIndices); + associatedIndices.emplace_back(assocHadronIndices); for (std::size_t iTrigger = 0; iTrigger < triggerIndices.size(); iTrigger++) { auto triggerParticle = mcParticles.iteratorAt(triggerIndices[iTrigger]); @@ -1773,7 +1790,7 @@ struct HStrangeCorrelation { double pttrigger = triggerParticle.pt(); auto const& mother = triggerParticle.mothers_first_as(); auto globalIndex = mother.globalIndex(); - static_for<0, 7>([&](auto i) { // associated loop + static_for<0, 8>([&](auto i) { // associated loop constexpr int Index = i.value; for (std::size_t iassoc = 0; iassoc < associatedIndices[Index].size(); iassoc++) { auto assocParticle = mcParticles.iteratorAt(associatedIndices[Index][iassoc]); @@ -1826,37 +1843,37 @@ struct HStrangeCorrelation { if (v0Data.has_mcParticle()) { auto v0mcParticle = v0Data.mcParticle_as(); int mcParticlePdg = v0mcParticle.pdgCode(); - if (mcParticlePdg == 3122 && !v0mcParticle.isPhysicalPrimary()) { + if (mcParticlePdg == PDG_t::kLambda0 && !v0mcParticle.isPhysicalPrimary()) { auto v0mothers = v0mcParticle.mothers_as(); if (!v0mothers.empty()) { - auto& v0mcParticleMother = v0mothers.front(); // First mother - if (v0mcParticleMother.pdgCode() == 3312) // Xi Minus Mother Matched + auto& v0mcParticleMother = v0mothers.front(); // First mother + if (v0mcParticleMother.pdgCode() == PDG_t::kXiMinus) // Xi Minus Mother Matched { histos.fill(HIST("hLambdaXiMinusFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); } - if (v0mcParticleMother.pdgCode() == 3322) // Xi Zero Mother Matched + if (v0mcParticleMother.pdgCode() == o2::constants::physics::Pdg::kXi0) // Xi Zero Mother Matched { histos.fill(HIST("hLambdaXiZeroFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); } - if (v0mcParticleMother.pdgCode() == 3334) // Omega Mother Matched + if (v0mcParticleMother.pdgCode() == PDG_t::kOmegaMinus) // Omega Mother Matched { histos.fill(HIST("hLambdaOmegaFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); } } } - if (mcParticlePdg == -3122 && !v0mcParticle.isPhysicalPrimary()) { + if (mcParticlePdg == PDG_t::kLambda0Bar && !v0mcParticle.isPhysicalPrimary()) { auto v0mothers = v0mcParticle.mothers_as(); if (!v0mothers.empty()) { - auto& v0mcParticleMother = v0mothers.front(); // First mother - if (v0mcParticleMother.pdgCode() == -3312) // Xi Plus Mother Matched + auto& v0mcParticleMother = v0mothers.front(); // First mother + if (v0mcParticleMother.pdgCode() == PDG_t::kXiPlusBar) // Xi Plus Mother Matched { histos.fill(HIST("hAntiLambdaXiPlusFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); } - if (v0mcParticleMother.pdgCode() == -3322) // Anti Xi Zero Mother Matched + if (v0mcParticleMother.pdgCode() == -o2::constants::physics::Pdg::kXi0) // Anti Xi Zero Mother Matched { histos.fill(HIST("hAntiLambdaXiZeroFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); } - if (v0mcParticleMother.pdgCode() == -3334) // Omega Mother Matched + if (v0mcParticleMother.pdgCode() == PDG_t::kOmegaPlusBar) // Omega Mother Matched { histos.fill(HIST("hAntiLambdaOmegaFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); } From 6c83dff456da8f4eb5a709f48f5881944c421462 Mon Sep 17 00:00:00 2001 From: feisenhu <53603353+feisenhu@users.noreply.github.com> Date: Wed, 7 May 2025 15:28:00 +0200 Subject: [PATCH 1208/1650] [PWGEM] increase range of DCA QA histograms for singleTrackQCtask (#11110) --- PWGEM/Dilepton/Core/SingleTrackQC.h | 4 ++-- PWGEM/Dilepton/Core/SingleTrackQCMC.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/PWGEM/Dilepton/Core/SingleTrackQC.h b/PWGEM/Dilepton/Core/SingleTrackQC.h index f1ffcbb0963..046f9c81131 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQC.h @@ -231,8 +231,8 @@ struct SingleTrackQC { // track info fRegistry.add("Track/positive/hs", "rec. single electron", kTHnSparseD, {axis_pt, axis_eta, axis_phi, axis_dca}, true); fRegistry.add("Track/positive/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{400, -20, 20}}, false); - fRegistry.add("Track/positive/hDCAxyz", "DCA xy vs. z;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -1.0f, 1.0f}, {200, -1.0f, 1.0f}}, false); - fRegistry.add("Track/positive/hDCAxyzSigma", "DCA xy vs. z;DCA_{xy} (#sigma);DCA_{z} (#sigma)", kTH2F, {{200, -10.0f, 10.0f}, {200, -10.0f, 10.0f}}, false); + fRegistry.add("Track/positive/hDCAxyz", "DCA xy vs. z;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -1.0f, 1.0f}, {700, -3.5f, 3.5f}}, false); + fRegistry.add("Track/positive/hDCAxyzSigma", "DCA xy vs. z;DCA_{xy} (#sigma);DCA_{z} (#sigma)", kTH2F, {{400, -20.0f, 20.0f}, {400, -20.0f, 20.0f}}, false); fRegistry.add("Track/positive/hDCAxyRes_Pt", "DCA_{xy} resolution vs. pT;p_{T} (GeV/c);DCA_{xy} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0., 500}}, false); fRegistry.add("Track/positive/hDCAzRes_Pt", "DCA_{z} resolution vs. pT;p_{T} (GeV/c);DCA_{z} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0., 400}}, false); fRegistry.add("Track/positive/hDCA3dRes_Pt", "DCA_{3D} resolution vs. pT;p_{T} (GeV/c);DCA_{3D} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0., 500}}, false); diff --git a/PWGEM/Dilepton/Core/SingleTrackQCMC.h b/PWGEM/Dilepton/Core/SingleTrackQCMC.h index d0239c20298..886278a6457 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQCMC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQCMC.h @@ -262,8 +262,8 @@ struct SingleTrackQCMC { fRegistry.add("Track/lf/positive/hs", "rec. single electron", kTHnSparseD, {axis_pt, axis_eta, axis_phi, axis_dca, axis_charge_gen}, true); if (cfgFillQA) { fRegistry.add("Track/lf/positive/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{400, -20, 20}}, false); - fRegistry.add("Track/lf/positive/hDCAxyz", "DCA xy vs. z;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -1.0f, 1.0f}, {200, -1.0f, 1.0f}}, false); - fRegistry.add("Track/lf/positive/hDCAxyzSigma", "DCA xy vs. z;DCA_{xy} (#sigma);DCA_{z} (#sigma)", kTH2F, {{200, -10.0f, 10.0f}, {200, -10.0f, 10.0f}}, false); + fRegistry.add("Track/lf/positive/hDCAxyz", "DCA xy vs. z;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -1.0f, 1.0f}, {700, -3.5f, 3.5f}}, false); + fRegistry.add("Track/lf/positive/hDCAxyzSigma", "DCA xy vs. z;DCA_{xy} (#sigma);DCA_{z} (#sigma)", kTH2F, {{400, -20.0f, 20.0f}, {400, -20.0f, 20.0f}}, false); fRegistry.add("Track/lf/positive/hDCAxyRes_Pt", "DCA_{xy} resolution vs. pT;p_{T} (GeV/c);DCA_{xy} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0., 500}}, false); fRegistry.add("Track/lf/positive/hDCAzRes_Pt", "DCA_{z} resolution vs. pT;p_{T} (GeV/c);DCA_{z} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0., 500}}, false); fRegistry.add("Track/lf/positive/hDCA3dRes_Pt", "DCA_{3D} resolution vs. pT;p_{T} (GeV/c);DCA_{3D} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0., 500}}, false); From 05793e9979a1902ce2af1fef2354a06b0a292278 Mon Sep 17 00:00:00 2001 From: Ravindra Singh <56298081+singhra1994@users.noreply.github.com> Date: Wed, 7 May 2025 16:54:46 +0200 Subject: [PATCH 1209/1650] [PWGCF,PWGHF] added table for sys studies (#11102) Co-authored-by: ALICE Action Bot --- PWGCF/DataModel/FemtoDerived.h | 7 +++++++ PWGHF/HFC/TableProducer/femtoDreamProducer.cxx | 3 ++- PWGHF/HFC/Tasks/taskCharmHadronsFemtoDream.cxx | 14 ++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/PWGCF/DataModel/FemtoDerived.h b/PWGCF/DataModel/FemtoDerived.h index f7083c100a5..705b134525e 100644 --- a/PWGCF/DataModel/FemtoDerived.h +++ b/PWGCF/DataModel/FemtoDerived.h @@ -323,6 +323,13 @@ DECLARE_SOA_TABLE(FDResultsHF, "AOD", "FDRESULTSHF", //! table to store results fdhf::FlagMc, fdhf::OriginMcRec); +DECLARE_SOA_TABLE(FDResultsHFTrkInfo, "AOD", "FDRESULTSHFTRKINFO", //! table to store results for HF femtoscopy + femtodreamparticle::TPCNClsFound, + track::TPCNClsFindable, + femtodreamparticle::TPCNClsCrossedRows, + femtodreamparticle::TPCNSigmaPr, + femtodreamparticle::TOFNSigmaPr); + DECLARE_SOA_TABLE(FDHfCandMC, "AOD", "FDHFCANDMC", //! Table for reconstructed MC charm hadron candidates o2::soa::Index<>, fdhf::FlagMc, diff --git a/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx b/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx index ef08bdfced7..8e2d79162ed 100644 --- a/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx +++ b/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx @@ -434,7 +434,8 @@ struct HfFemtoDreamProducer { bool isSelectedMlLcToPKPi = true; bool isSelectedMlLcToPiKP = true; for (const auto& candidate : candidates) { - + outputMlPKPi = {-1.0f, -1.0f, -1.0f}; + outputMlPiKP = {-1.0f, -1.0f, -1.0f}; auto trackPos1 = candidate.template prong0_as(); // positive daughter (negative for the antiparticles) auto trackNeg = candidate.template prong1_as(); // negative daughter (positive for the antiparticles) auto trackPos2 = candidate.template prong2_as(); // positive daughter (negative for the antiparticles) diff --git a/PWGHF/HFC/Tasks/taskCharmHadronsFemtoDream.cxx b/PWGHF/HFC/Tasks/taskCharmHadronsFemtoDream.cxx index 5030a9f50a0..1f474a175c7 100644 --- a/PWGHF/HFC/Tasks/taskCharmHadronsFemtoDream.cxx +++ b/PWGHF/HFC/Tasks/taskCharmHadronsFemtoDream.cxx @@ -196,6 +196,7 @@ struct HfTaskCharmHadronsFemtoDream { SliceCache cache; Preslice perCol = aod::femtodreamparticle::fdCollisionId; Produces fillFemtoResult; + Produces fillFemtoResultTrkInfo; void init(InitContext& /*context*/) { @@ -242,6 +243,17 @@ struct HfTaskCharmHadronsFemtoDream { registryMixQa.fill(HIST("MixingQA/hSECollisionPool"), col.posZ(), col.multNtr()); } + template + void fillTableTrkInfo(Part1 const& p1) + { + fillFemtoResultTrkInfo( + p1.tpcNClsFound(), + p1.tpcNClsFindable(), + p1.tpcNClsCrossedRows(), + p1.tpcNSigmaPr(), + p1.tofNSigmaPr()); + } + /// This function processes the same event and takes care of all the histogramming template void doSameEvent(PartitionType& sliceTrk1, CandType& sliceCharmHad, TableTracks const& parts, Collision const& col) @@ -331,6 +343,7 @@ struct HfTaskCharmHadronsFemtoDream { processType, charmHadMc, originType); + fillTableTrkInfo(p1); sameEventCont.setPair(p1, p2, col.multNtr(), col.multV0M(), use4D, extendedPlots, smearingByOrigin); } @@ -427,6 +440,7 @@ struct HfTaskCharmHadronsFemtoDream { processType, charmHadMc, originType); + fillTableTrkInfo(p1); // if constexpr (!isMc) mixedEventCont.setPair(p1, p2, collision1.multNtr(), collision1.multV0M(), use4D, extendedPlots, smearingByOrigin); mixedEventCont.setPair(p1, p2, collision1.multNtr(), collision1.multV0M(), use4D, extendedPlots, smearingByOrigin); From 7806de00fe273994d12605305db9f1c813d280a9 Mon Sep 17 00:00:00 2001 From: Jesper Gumprecht <113693781+jesgum@users.noreply.github.com> Date: Wed, 7 May 2025 17:35:13 +0200 Subject: [PATCH 1210/1650] [ALICE3] Fix to tracks table being filled with corrupted cascade tracks in otf tracker (#11118) --- ALICE3/TableProducer/OTF/onTheFlyTracker.cxx | 3 + ALICE3/TableProducer/alice3-multicharm.cxx | 58 ++++++++++++-------- 2 files changed, 39 insertions(+), 22 deletions(-) diff --git a/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx b/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx index 6806bbca9db..17d22988b71 100644 --- a/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx +++ b/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx @@ -870,6 +870,9 @@ struct OnTheFlyTracker { posClusterCandidate[2] = gRandom->Gaus(posClusterCandidate[2], currentTrackingLayer.resZ); } + if (std::isnan(phi)) + continue; // Catch when getXatLabR misses layer[i] + // towards adding cluster: move to track alpha double alpha = cascadeTrack.getAlpha(); double xyz1[3]{ diff --git a/ALICE3/TableProducer/alice3-multicharm.cxx b/ALICE3/TableProducer/alice3-multicharm.cxx index a6f3933ac20..e0e83458d0e 100644 --- a/ALICE3/TableProducer/alice3-multicharm.cxx +++ b/ALICE3/TableProducer/alice3-multicharm.cxx @@ -522,21 +522,28 @@ struct alice3multicharm { if (std::fabs(xi.dcaXY()) < xiFromXiC_dcaXYconstant || std::fabs(xi.dcaZ()) < xiFromXiC_dcaZconstant) continue; // likely a primary xi + histos.fill(HIST("hDCAxyXi"), std::fabs(xi.dcaXY() * 1e+4)); + histos.fill(HIST("hDCAzXi"), std::fabs(xi.dcaZ() * 1e+4)); + if (xiCand.cascRadius() < minXiRadius) continue; + histos.fill(HIST("hMinXiDecayRadius"), xiCand.cascRadius()); for (auto const& pi1c : tracksPiFromXiCgrouped) { if (mcSameMotherCheck && !checkSameMother(xi, pi1c)) continue; if (xiCand.posTrackId() == pi1c.globalIndex() || xiCand.negTrackId() == pi1c.globalIndex() || xiCand.bachTrackId() == pi1c.globalIndex()) continue; // avoid using any track that was already used + if (pi1c.pt() < minPiCPt) continue; // too low momentum + histos.fill(HIST("hPi1cPt"), pi1c.pt()); double pi1cTOFDiffInner = std::fabs(pi1c.innerTOFTrackTimeReco() - pi1c.innerTOFExpectedTimePi()); if (pi1cTOFDiffInner > piFromXiC_tofDiffInner) continue; // did not arrive at expected time + histos.fill(HIST("hInnerTOFTrackTimeRecoPi1c"), pi1cTOFDiffInner); // second pion from XiC decay for starts here for (auto const& pi2c : tracksPiFromXiCgrouped) { if (mcSameMotherCheck && !checkSameMother(xi, pi2c)) @@ -551,10 +558,12 @@ struct alice3multicharm { if (pi2c.pt() < minPiCPt) continue; // too low momentum + histos.fill(HIST("hPi2cPt"), pi2c.pt()); double pi2cTOFDiffInner = std::fabs(pi2c.innerTOFTrackTimeReco() - pi2c.innerTOFExpectedTimePi()); if (pi2cTOFDiffInner > piFromXiC_tofDiffInner) continue; // did not arrive at expected time + histos.fill(HIST("hInnerTOFTrackTimeRecoPi2c"), pi2cTOFDiffInner); // if I am here, it means this is a triplet to be considered for XiC vertexing. // will now attempt to build a three-body decay candidate with these three track rows. @@ -563,6 +572,8 @@ struct alice3multicharm { if (!buildDecayCandidateThreeBody(xi, pi1c, pi2c, o2::constants::physics::MassXiMinus, o2::constants::physics::MassPionCharged, o2::constants::physics::MassPionCharged)) continue; // failed at building candidate + histos.fill(HIST("hDCAXiCDaughters"), thisXiCcandidate.dca * 1e+4); + if (std::fabs(thisXiCcandidate.mass - o2::constants::physics::MassXiCPlus) > massWindowXiC) continue; // out of mass region @@ -578,10 +589,13 @@ struct alice3multicharm { if (xicDecayRadius2D < minXiCRadius) continue; // do not take if radius too small, likely a primary combination - histos.fill(HIST("hXiRadiusVsXicRadius"), xiCand.cascRadius() * 1e+4, xicDecayRadius2D * 1e+4); + histos.fill(HIST("hMinXiCDecayRadius"), xicDecayRadius2D * 1e+4); + if (xicDecayRadius2D > xiCand.cascRadius()) continue; + histos.fill(HIST("hXiRadiusVsXicRadius"), xiCand.cascRadius() * 1e+4, xicDecayRadius2D * 1e+4); + o2::dataformats::DCA dcaInfo; float xicdcaXY = 1e+10, xicdcaZ = 1e+10; o2::track::TrackParCov xicTrackCopy(xicTrack); // paranoia @@ -596,6 +610,8 @@ struct alice3multicharm { if (std::fabs(xicdcaXY) < xiCFromXiCC_dcaXY || std::fabs(xicdcaZ) < xiCFromXiCC_dcaZ) continue; // likely a primary xic + histos.fill(HIST("hDCAxyXiC"), std::fabs(xicdcaXY * 1e+4)); + histos.fill(HIST("hDCAzXiC"), std::fabs(xicdcaZ * 1e+4)); histos.fill(HIST("hMassXiC"), thisXiCcandidate.mass); // attempt XiCC finding @@ -610,16 +626,22 @@ struct alice3multicharm { if (picc.pt() < minPiCCPt) continue; // too low momentum + histos.fill(HIST("hPiccPt"), picc.pt()); + double piccTOFDiffInner = std::fabs(picc.innerTOFTrackTimeReco() - picc.innerTOFExpectedTimePi()); if (piccTOFDiffInner > piFromXiCC_tofDiffInner) continue; // did not arrive at expected time + histos.fill(HIST("hInnerTOFTrackTimeRecoPicc"), piccTOFDiffInner); + o2::track::TrackParCov piccTrack = getTrackParCov(picc); nCombinationsCC++; histos.fill(HIST("hCharmBuilding"), 2.0f); if (!buildDecayCandidateTwoBody(xicTrack, piccTrack, o2::constants::physics::MassXiCPlus, o2::constants::physics::MassPionCharged)) continue; // failed at building candidate + histos.fill(HIST("hDCAXiCCDaughters"), thisXiCCcandidate.dca * 1e+4); + const std::array momentumCC = { thisXiCCcandidate.prong0mom[0] + thisXiCCcandidate.prong1mom[0], thisXiCCcandidate.prong0mom[1] + thisXiCCcandidate.prong1mom[1], @@ -630,15 +652,20 @@ struct alice3multicharm { if (xiccDecayRadius2D < minXiCCRadius) continue; // do not take if radius too small, likely a primary combination + histos.fill(HIST("hMinXiCCDecayRadius"), xiccDecayRadius2D * 1e+4); + double totalMomentumC = std::hypot(momentumC[0], momentumC[1], momentumC[2]); double decayLengthXiC = std::hypot( thisXiCcandidate.xyz[0] - thisXiCCcandidate.xyz[0], thisXiCcandidate.xyz[1] - thisXiCCcandidate.xyz[1], thisXiCcandidate.xyz[2] - thisXiCCcandidate.xyz[2]); double xicProperLength = decayLengthXiC * thisXiCcandidate.mass / totalMomentumC; + if (xicProperLength < xicMinProperLength || xicProperLength > xicMaxProperLength) continue; // likely background + histos.fill(HIST("hProperLengthXiC"), xicProperLength * 1e+4); + double xicDistanceFromPV = std::hypot( thisXiCcandidate.xyz[0] - collision.posX(), thisXiCcandidate.xyz[1] - collision.posY(), @@ -647,6 +674,8 @@ struct alice3multicharm { if (xicDecayDistanceFromPV < xicMinDecayDistanceFromPV) continue; // too close to PV + histos.fill(HIST("hMinxicDecayDistanceFromPV"), xicDecayDistanceFromPV * 1e+4); + double totalMomentumCC = std::hypot(momentumCC[0], momentumCC[1], momentumCC[2]); double decayLengthXiCC = std::hypot( thisXiCCcandidate.xyz[0] - collision.posX(), @@ -656,10 +685,12 @@ struct alice3multicharm { if (xiccProperLength < xiccMinProperLength || xiccProperLength > xicMaxProperLength) continue; // likely background - histos.fill(HIST("hXicRadiusVsXiccRadius"), xicDecayRadius2D * 1e+4, xiccDecayRadius2D * 1e+4); + histos.fill(HIST("hProperLengthXiCC"), xiccProperLength * 1e+4); if (xiccDecayRadius2D > xicDecayRadius2D) continue; // XiCC should decay before XiC + histos.fill(HIST("hXicRadiusVsXiccRadius"), xicDecayRadius2D * 1e+4, xiccDecayRadius2D * 1e+4); + float xiccdcaXY = 1e+10, xiccdcaZ = 1e+10; if (xiccTrack.propagateToDCA(primaryVertex, magneticField, &dcaInfo)) { xiccdcaXY = dcaInfo.getY(); @@ -669,29 +700,12 @@ struct alice3multicharm { if (std::fabs(xiccdcaXY) > xiCC_dcaXY || std::fabs(xiccdcaZ) > xiCC_dcaZ) continue; // not pointing to PV + histos.fill(HIST("hDCAxyXiCC"), std::fabs(xiccdcaXY * 1e+4)); + histos.fill(HIST("hDCAzXiCC"), std::fabs(xiccdcaZ * 1e+4)); + if (std::fabs(thisXiCcandidate.eta) > xiccMaxEta) continue; // not in central barrel - histos.fill(HIST("hMinxicDecayDistanceFromPV"), xicDecayDistanceFromPV * 1e+4); - histos.fill(HIST("hInnerTOFTrackTimeRecoPi1c"), pi1cTOFDiffInner); - histos.fill(HIST("hInnerTOFTrackTimeRecoPi2c"), pi2cTOFDiffInner); - histos.fill(HIST("hInnerTOFTrackTimeRecoPicc"), piccTOFDiffInner); - histos.fill(HIST("hDCAXiCDaughters"), thisXiCcandidate.dca * 1e+4); - histos.fill(HIST("hDCAXiCCDaughters"), thisXiCCcandidate.dca * 1e+4); - histos.fill(HIST("hProperLengthXiCC"), xiccProperLength * 1e+4); - histos.fill(HIST("hProperLengthXiC"), xicProperLength * 1e+4); - histos.fill(HIST("hMinXiCCDecayRadius"), xiccDecayRadius2D * 1e+4); - histos.fill(HIST("hMinXiCDecayRadius"), xicDecayRadius2D * 1e+4); - histos.fill(HIST("hMinXiDecayRadius"), xiCand.cascRadius()); - histos.fill(HIST("hPi1cPt"), pi1c.pt()); - histos.fill(HIST("hPi2cPt"), pi2c.pt()); - histos.fill(HIST("hPiccPt"), picc.pt()); - histos.fill(HIST("hDCAxyXi"), std::fabs(xi.dcaXY() * 1e+4)); - histos.fill(HIST("hDCAzXi"), std::fabs(xi.dcaZ() * 1e+4)); - histos.fill(HIST("hDCAxyXiC"), std::fabs(xicdcaXY * 1e+4)); - histos.fill(HIST("hDCAzXiC"), std::fabs(xicdcaZ * 1e+4)); - histos.fill(HIST("hDCAxyXiCC"), std::fabs(xiccdcaXY * 1e+4)); - histos.fill(HIST("hDCAzXiCC"), std::fabs(xiccdcaZ * 1e+4)); histos.fill(HIST("hCharmBuilding"), 3.0f); histos.fill(HIST("hMassXiCC"), thisXiCCcandidate.mass); histos.fill(HIST("hPtXiCC"), thisXiCCcandidate.pt); From 4e649cb80a36527cdbb757e9b8f92e10c1d43c7b Mon Sep 17 00:00:00 2001 From: abmodak <67369858+abmodak@users.noreply.github.com> Date: Wed, 7 May 2025 19:01:59 +0200 Subject: [PATCH 1211/1650] [PWGLF] Fix INEL>0 condition (#11119) Co-authored-by: ALICE Action Bot --- .../heavyionMultiplicity.cxx | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/heavyionMultiplicity.cxx b/PWGLF/Tasks/GlobalEventProperties/heavyionMultiplicity.cxx index 35e3c99b958..120c6b760ef 100644 --- a/PWGLF/Tasks/GlobalEventProperties/heavyionMultiplicity.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/heavyionMultiplicity.cxx @@ -756,20 +756,7 @@ struct HeavyionMultiplicity { histos.fill(HIST("hmcrecdndetapp"), RecCol.posZ(), RecCol.centFT0M(), Rectrack.eta(), Rectrack.phi(), static_cast(kBkg), kGlobalplusITS); } } // track (mcrec) loop - } // nTrks>0 - // INEL>0 sample - auto npart = 0; - for (const auto& particle : GenParticles) { - if (!isGenTrackSelected(particle)) { - continue; - } - if (particle.eta() < kEtaInelgt0) { - npart++; - } - } // particle loop - - if (npart > 0) { for (const auto& particle : GenParticles) { if (!isGenTrackSelected(particle)) { continue; @@ -800,7 +787,7 @@ struct HeavyionMultiplicity { } histos.fill(HIST("hmcgendndetapp"), RecCol.posZ(), RecCol.centFT0M(), particle.eta(), particle.phi(), static_cast(pid), kNoGenpTVar); } // track (mcgen) loop - } // npart>0 + } // nTrks>0 } // collision loop } PROCESS_SWITCH(HeavyionMultiplicity, processppMonteCarlo, "process pp MC", false); From 564a515d0596e28bfb999660fb2a879fe8cd53b7 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Thu, 8 May 2025 02:44:59 +0900 Subject: [PATCH 1212/1650] [PWGEM/Dilepton] update PID scheme for low B data (#11121) --- PWGEM/Dilepton/Core/DielectronCut.cxx | 5 +- PWGEM/Dilepton/Core/DielectronCut.h | 39 ++++++--- PWGEM/Dilepton/Core/Dilepton.h | 3 +- PWGEM/Dilepton/Core/DileptonMC.h | 3 +- PWGEM/Dilepton/Core/PhotonHBT.h | 3 +- PWGEM/Dilepton/Core/SingleTrackQC.h | 3 +- PWGEM/Dilepton/Core/SingleTrackQCMC.h | 3 +- PWGEM/Dilepton/Tasks/taggingHFE.cxx | 120 ++++++++++++++++++++++---- PWGEM/Dilepton/Tasks/vpPairQC.cxx | 3 +- PWGEM/Dilepton/Tasks/vpPairQCMC.cxx | 3 +- 10 files changed, 149 insertions(+), 36 deletions(-) diff --git a/PWGEM/Dilepton/Core/DielectronCut.cxx b/PWGEM/Dilepton/Core/DielectronCut.cxx index 784e09707bd..cd0ae3f5078 100644 --- a/PWGEM/Dilepton/Core/DielectronCut.cxx +++ b/PWGEM/Dilepton/Core/DielectronCut.cxx @@ -325,10 +325,11 @@ void DielectronCut::SetMaxPinMuonTPConly(float max) mMaxPinMuonTPConly = max; LOG(info) << "Dielectron Cut, set max pin for Muon ID with TPC only: " << mMaxPinMuonTPConly; } -void DielectronCut::SetMaxPinForPionRejectionTPC(float max) +void DielectronCut::SetPinRangeForPionRejectionTPC(float min, float max) { + mMinPinForPionRejectionTPC = min; mMaxPinForPionRejectionTPC = max; - LOG(info) << "Dielectron Cut, set max pin for pion rejection in TPC: " << mMaxPinForPionRejectionTPC; + LOG(info) << "Dielectron Cut, set pin range for pion rejection in TPC: " << mMinPinForPionRejectionTPC << " - " << mMaxPinForPionRejectionTPC; } void DielectronCut::RequireITSibAny(bool flag) { diff --git a/PWGEM/Dilepton/Core/DielectronCut.h b/PWGEM/Dilepton/Core/DielectronCut.h index d1c305d3d72..8e403bfbf41 100644 --- a/PWGEM/Dilepton/Core/DielectronCut.h +++ b/PWGEM/Dilepton/Core/DielectronCut.h @@ -77,7 +77,8 @@ class DielectronCut : public TNamed kTPConly = 3, kTOFif = 4, kPIDML = 5, - kTPChadrejORTOFreq_woTOFif = 6 + kTPChadrejORTOFreq_woTOFif = 6, + kTPChadrejORTOFreqLowB = 7, }; template @@ -261,6 +262,9 @@ class DielectronCut : public TNamed case static_cast(PIDSchemes::kTPChadrejORTOFreq): return PassTPChadrej(track) || PassTOFreq(track); + case static_cast(PIDSchemes::kTPChadrejORTOFreqLowB): + return PassTPChadrej(track) || PassTOFreqLowB(track); + case static_cast(PIDSchemes::kTPConly): return PassTPConly(track); @@ -281,6 +285,17 @@ class DielectronCut : public TNamed } } + template + bool PassTOFreqLowB(T const& track) const + { + bool is_el_included_TPC = mMinTPCNsigmaEl < track.tpcNSigmaEl() && track.tpcNSigmaEl() < mMaxTPCNsigmaEl; + bool is_pi_excluded_TPC = (track.tpcInnerParam() < mMinPinForPionRejectionTPC && track.tpcInnerParam() < mMaxPinForPionRejectionTPC) ? (track.tpcNSigmaPi() < mMinTPCNsigmaPi || mMaxTPCNsigmaPi < track.tpcNSigmaPi()) : true; + bool is_el_included_TOF = (mMinTOFNsigmaEl < track.tofNSigmaEl() && track.tofNSigmaEl() < mMaxTOFNsigmaEl) && (track.hasTOF() && track.tofChi2() < mMaxChi2TOF); + bool is_ka_excluded_ITS = (mMinP_ITSNsigmaKa < track.p() && track.p() < mMaxP_ITSNsigmaKa) ? (track.itsNSigmaKa() < mMinITSNsigmaKa || mMaxITSNsigmaKa < track.itsNSigmaKa()) : true; + bool is_pr_excluded_ITS = (mMinP_ITSNsigmaPr < track.p() && track.p() < mMaxP_ITSNsigmaPr) ? (track.itsNSigmaPr() < mMinITSNsigmaPr || mMaxITSNsigmaPr < track.itsNSigmaPr()) : true; + return is_el_included_TPC && is_pi_excluded_TPC && is_el_included_TOF && is_ka_excluded_ITS && is_pr_excluded_ITS; + } + template bool PassTOFreq(T const& track) const { @@ -445,7 +460,7 @@ class DielectronCut : public TNamed void SetPRangeForITSNsigmaPr(float min, float max); void SetMaxPinMuonTPConly(float max); - void SetMaxPinForPionRejectionTPC(float max); + void SetPinRangeForPionRejectionTPC(float min, float max); void RequireITSibAny(bool flag); void RequireITSib1st(bool flag); @@ -487,16 +502,16 @@ class DielectronCut : public TNamed float mMinTrackPhi{0.f}, mMaxTrackPhi{2.f * M_PI}; // range in phi // track quality cuts - int mMinNClustersTPC{0}; // min number of TPC clusters - int mMinNCrossedRowsTPC{0}; // min number of crossed rows in TPC - float mMinChi2PerClusterTPC{-1e10f}, mMaxChi2PerClusterTPC{1e10f}; // max tpc fit chi2 per TPC cluster - float mMinNCrossedRowsOverFindableClustersTPC{0.f}; // min ratio crossed rows / findable clusters - float mMaxFracSharedClustersTPC{999.f}; // max ratio shared clusters / clusters in TPC - float mMinRelDiffPin{-1e10f}, mMaxRelDiffPin{1e10f}; // max relative difference between p at TPC inner wall and p at PV - int mMinNClustersITS{0}, mMaxNClustersITS{7}; // range in number of ITS clusters - float mMinChi2PerClusterITS{-1e10f}, mMaxChi2PerClusterITS{1e10f}; // max its fit chi2 per ITS cluster - float mMaxPinMuonTPConly{0.2f}; // max pin cut for muon ID with TPConly - float mMaxPinForPionRejectionTPC{1e10f}; // max pin for pion rejection in TPC + int mMinNClustersTPC{0}; // min number of TPC clusters + int mMinNCrossedRowsTPC{0}; // min number of crossed rows in TPC + float mMinChi2PerClusterTPC{-1e10f}, mMaxChi2PerClusterTPC{1e10f}; // max tpc fit chi2 per TPC cluster + float mMinNCrossedRowsOverFindableClustersTPC{0.f}; // min ratio crossed rows / findable clusters + float mMaxFracSharedClustersTPC{999.f}; // max ratio shared clusters / clusters in TPC + float mMinRelDiffPin{-1e10f}, mMaxRelDiffPin{1e10f}; // max relative difference between p at TPC inner wall and p at PV + int mMinNClustersITS{0}, mMaxNClustersITS{7}; // range in number of ITS clusters + float mMinChi2PerClusterITS{-1e10f}, mMaxChi2PerClusterITS{1e10f}; // max its fit chi2 per ITS cluster + float mMaxPinMuonTPConly{0.2f}; // max pin cut for muon ID with TPConly + float mMinPinForPionRejectionTPC{0.f}, mMaxPinForPionRejectionTPC{1e10f}; // pin range for pion rejection in TPC bool mRequireITSibAny{true}; bool mRequireITSib1st{false}; float mMinChi2TOF{-1e10f}, mMaxChi2TOF{1e10f}; // max tof chi2 per diff --git a/PWGEM/Dilepton/Core/Dilepton.h b/PWGEM/Dilepton/Core/Dilepton.h index e9da89a3503..ebe9e26ad50 100644 --- a/PWGEM/Dilepton/Core/Dilepton.h +++ b/PWGEM/Dilepton/Core/Dilepton.h @@ -226,6 +226,7 @@ struct Dilepton { Configurable cfg_max_TPCNsigmaPr{"cfg_max_TPCNsigmaPr", +3.0, "max. TPC n sigma for proton exclusion"}; Configurable cfg_min_TOFNsigmaEl{"cfg_min_TOFNsigmaEl", -3.0, "min. TOF n sigma for electron inclusion"}; Configurable cfg_max_TOFNsigmaEl{"cfg_max_TOFNsigmaEl", +3.0, "max. TOF n sigma for electron inclusion"}; + Configurable cfg_min_pin_pirejTPC{"cfg_min_pin_pirejTPC", 0.f, "min. pin for pion rejection in TPC"}; Configurable cfg_max_pin_pirejTPC{"cfg_max_pin_pirejTPC", 1e+10, "max. pin for pion rejection in TPC"}; Configurable cfg_min_ITSNsigmaKa{"cfg_min_ITSNsigmaKa", -1.0, "min. ITS n sigma for kaon exclusion"}; Configurable cfg_max_ITSNsigmaKa{"cfg_max_ITSNsigmaKa", 1e+10, "max. ITS n sigma for kaon exclusion"}; @@ -690,7 +691,7 @@ struct Dilepton { fDielectronCut.SetTPCNsigmaKaRange(dielectroncuts.cfg_min_TPCNsigmaKa, dielectroncuts.cfg_max_TPCNsigmaKa); fDielectronCut.SetTPCNsigmaPrRange(dielectroncuts.cfg_min_TPCNsigmaPr, dielectroncuts.cfg_max_TPCNsigmaPr); fDielectronCut.SetTOFNsigmaElRange(dielectroncuts.cfg_min_TOFNsigmaEl, dielectroncuts.cfg_max_TOFNsigmaEl); - fDielectronCut.SetMaxPinForPionRejectionTPC(dielectroncuts.cfg_max_pin_pirejTPC); + fDielectronCut.SetPinRangeForPionRejectionTPC(dielectroncuts.cfg_min_pin_pirejTPC, dielectroncuts.cfg_max_pin_pirejTPC); fDielectronCut.SetITSNsigmaKaRange(dielectroncuts.cfg_min_ITSNsigmaKa, dielectroncuts.cfg_max_ITSNsigmaKa); fDielectronCut.SetITSNsigmaPrRange(dielectroncuts.cfg_min_ITSNsigmaPr, dielectroncuts.cfg_max_ITSNsigmaPr); fDielectronCut.SetPRangeForITSNsigmaKa(dielectroncuts.cfg_min_p_ITSNsigmaKa, dielectroncuts.cfg_max_p_ITSNsigmaKa); diff --git a/PWGEM/Dilepton/Core/DileptonMC.h b/PWGEM/Dilepton/Core/DileptonMC.h index 952edff0aa3..769c6b72ec3 100644 --- a/PWGEM/Dilepton/Core/DileptonMC.h +++ b/PWGEM/Dilepton/Core/DileptonMC.h @@ -218,6 +218,7 @@ struct DileptonMC { Configurable cfg_max_TPCNsigmaPr{"cfg_max_TPCNsigmaPr", +3.0, "max. TPC n sigma for proton exclusion"}; Configurable cfg_min_TOFNsigmaEl{"cfg_min_TOFNsigmaEl", -3.0, "min. TOF n sigma for electron inclusion"}; Configurable cfg_max_TOFNsigmaEl{"cfg_max_TOFNsigmaEl", +3.0, "max. TOF n sigma for electron inclusion"}; + Configurable cfg_min_pin_pirejTPC{"cfg_min_pin_pirejTPC", 0.f, "min. pin for pion rejection in TPC"}; Configurable cfg_max_pin_pirejTPC{"cfg_max_pin_pirejTPC", 1e+10, "max. pin for pion rejection in TPC"}; Configurable cfg_min_ITSNsigmaKa{"cfg_min_ITSNsigmaKa", -1.0, "min. ITS n sigma for kaon exclusion"}; Configurable cfg_max_ITSNsigmaKa{"cfg_max_ITSNsigmaKa", 1e+10, "max. ITS n sigma for kaon exclusion"}; @@ -656,7 +657,7 @@ struct DileptonMC { fDielectronCut.SetTPCNsigmaKaRange(dielectroncuts.cfg_min_TPCNsigmaKa, dielectroncuts.cfg_max_TPCNsigmaKa); fDielectronCut.SetTPCNsigmaPrRange(dielectroncuts.cfg_min_TPCNsigmaPr, dielectroncuts.cfg_max_TPCNsigmaPr); fDielectronCut.SetTOFNsigmaElRange(dielectroncuts.cfg_min_TOFNsigmaEl, dielectroncuts.cfg_max_TOFNsigmaEl); - fDielectronCut.SetMaxPinForPionRejectionTPC(dielectroncuts.cfg_max_pin_pirejTPC); + fDielectronCut.SetPinRangeForPionRejectionTPC(dielectroncuts.cfg_min_pin_pirejTPC, dielectroncuts.cfg_max_pin_pirejTPC); fDielectronCut.SetITSNsigmaKaRange(dielectroncuts.cfg_min_ITSNsigmaKa, dielectroncuts.cfg_max_ITSNsigmaKa); fDielectronCut.SetITSNsigmaPrRange(dielectroncuts.cfg_min_ITSNsigmaPr, dielectroncuts.cfg_max_ITSNsigmaPr); fDielectronCut.SetPRangeForITSNsigmaKa(dielectroncuts.cfg_min_p_ITSNsigmaKa, dielectroncuts.cfg_max_p_ITSNsigmaKa); diff --git a/PWGEM/Dilepton/Core/PhotonHBT.h b/PWGEM/Dilepton/Core/PhotonHBT.h index b24f22cd5d8..cc8251fb0cd 100644 --- a/PWGEM/Dilepton/Core/PhotonHBT.h +++ b/PWGEM/Dilepton/Core/PhotonHBT.h @@ -228,6 +228,7 @@ struct PhotonHBT { Configurable cfg_max_TPCNsigmaPr{"cfg_max_TPCNsigmaPr", +3.0, "max. TPC n sigma for proton exclusion"}; Configurable cfg_min_TOFNsigmaEl{"cfg_min_TOFNsigmaEl", -3.0, "min. TOF n sigma for electron inclusion"}; Configurable cfg_max_TOFNsigmaEl{"cfg_max_TOFNsigmaEl", +3.0, "max. TOF n sigma for electron inclusion"}; + Configurable cfg_min_pin_pirejTPC{"cfg_min_pin_pirejTPC", 0.f, "min. pin for pion rejection in TPC"}; Configurable cfg_max_pin_pirejTPC{"cfg_max_pin_pirejTPC", 0.5, "max. pin for pion rejection in TPC"}; Configurable cfg_min_ITSNsigmaKa{"cfg_min_ITSNsigmaKa", -1.0, "min. ITS n sigma for kaon exclusion"}; Configurable cfg_max_ITSNsigmaKa{"cfg_max_ITSNsigmaKa", 1e+10, "max. ITS n sigma for kaon exclusion"}; @@ -580,7 +581,7 @@ struct PhotonHBT { fDielectronCut.SetTPCNsigmaKaRange(dielectroncuts.cfg_min_TPCNsigmaKa, dielectroncuts.cfg_max_TPCNsigmaKa); fDielectronCut.SetTPCNsigmaPrRange(dielectroncuts.cfg_min_TPCNsigmaPr, dielectroncuts.cfg_max_TPCNsigmaPr); fDielectronCut.SetTOFNsigmaElRange(dielectroncuts.cfg_min_TOFNsigmaEl, dielectroncuts.cfg_max_TOFNsigmaEl); - fDielectronCut.SetMaxPinForPionRejectionTPC(dielectroncuts.cfg_max_pin_pirejTPC); + fDielectronCut.SetPinRangeForPionRejectionTPC(dielectroncuts.cfg_min_pin_pirejTPC, dielectroncuts.cfg_max_pin_pirejTPC); fDielectronCut.SetITSNsigmaKaRange(dielectroncuts.cfg_min_ITSNsigmaKa, dielectroncuts.cfg_max_ITSNsigmaKa); fDielectronCut.SetITSNsigmaPrRange(dielectroncuts.cfg_min_ITSNsigmaPr, dielectroncuts.cfg_max_ITSNsigmaPr); fDielectronCut.SetPRangeForITSNsigmaKa(dielectroncuts.cfg_min_p_ITSNsigmaKa, dielectroncuts.cfg_max_p_ITSNsigmaKa); diff --git a/PWGEM/Dilepton/Core/SingleTrackQC.h b/PWGEM/Dilepton/Core/SingleTrackQC.h index 046f9c81131..7ed467c2814 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQC.h @@ -157,6 +157,7 @@ struct SingleTrackQC { Configurable cfg_max_TPCNsigmaPr{"cfg_max_TPCNsigmaPr", +3.0, "max. TPC n sigma for proton exclusion"}; Configurable cfg_min_TOFNsigmaEl{"cfg_min_TOFNsigmaEl", -3.0, "min. TOF n sigma for electron inclusion"}; Configurable cfg_max_TOFNsigmaEl{"cfg_max_TOFNsigmaEl", +3.0, "max. TOF n sigma for electron inclusion"}; + Configurable cfg_min_pin_pirejTPC{"cfg_min_pin_pirejTPC", 0.f, "min. pin for pion rejection in TPC"}; Configurable cfg_max_pin_pirejTPC{"cfg_max_pin_pirejTPC", 1e+10, "max. pin for pion rejection in TPC"}; Configurable cfg_min_ITSNsigmaKa{"cfg_min_ITSNsigmaKa", -1.0, "min. ITS n sigma for kaon exclusion"}; Configurable cfg_max_ITSNsigmaKa{"cfg_max_ITSNsigmaKa", 1e+10, "max. ITS n sigma for kaon exclusion"}; @@ -400,7 +401,7 @@ struct SingleTrackQC { fDielectronCut.SetTPCNsigmaKaRange(dielectroncuts.cfg_min_TPCNsigmaKa, dielectroncuts.cfg_max_TPCNsigmaKa); fDielectronCut.SetTPCNsigmaPrRange(dielectroncuts.cfg_min_TPCNsigmaPr, dielectroncuts.cfg_max_TPCNsigmaPr); fDielectronCut.SetTOFNsigmaElRange(dielectroncuts.cfg_min_TOFNsigmaEl, dielectroncuts.cfg_max_TOFNsigmaEl); - fDielectronCut.SetMaxPinForPionRejectionTPC(dielectroncuts.cfg_max_pin_pirejTPC); + fDielectronCut.SetPinRangeForPionRejectionTPC(dielectroncuts.cfg_min_pin_pirejTPC, dielectroncuts.cfg_max_pin_pirejTPC); fDielectronCut.SetITSNsigmaKaRange(dielectroncuts.cfg_min_ITSNsigmaKa, dielectroncuts.cfg_max_ITSNsigmaKa); fDielectronCut.SetITSNsigmaPrRange(dielectroncuts.cfg_min_ITSNsigmaPr, dielectroncuts.cfg_max_ITSNsigmaPr); fDielectronCut.SetPRangeForITSNsigmaKa(dielectroncuts.cfg_min_p_ITSNsigmaKa, dielectroncuts.cfg_max_p_ITSNsigmaKa); diff --git a/PWGEM/Dilepton/Core/SingleTrackQCMC.h b/PWGEM/Dilepton/Core/SingleTrackQCMC.h index 886278a6457..f400b617f1f 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQCMC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQCMC.h @@ -164,6 +164,7 @@ struct SingleTrackQCMC { Configurable cfg_max_TPCNsigmaPr{"cfg_max_TPCNsigmaPr", +3.0, "max. TPC n sigma for proton exclusion"}; Configurable cfg_min_TOFNsigmaEl{"cfg_min_TOFNsigmaEl", -3.0, "min. TOF n sigma for electron inclusion"}; Configurable cfg_max_TOFNsigmaEl{"cfg_max_TOFNsigmaEl", +3.0, "max. TOF n sigma for electron inclusion"}; + Configurable cfg_min_pin_pirejTPC{"cfg_min_pin_pirejTPC", 0.f, "min. pin for pion rejection in TPC"}; Configurable cfg_max_pin_pirejTPC{"cfg_max_pin_pirejTPC", 1e+10, "max. pin for pion rejection in TPC"}; Configurable cfg_min_ITSNsigmaKa{"cfg_min_ITSNsigmaKa", -1.0, "min. ITS n sigma for kaon exclusion"}; Configurable cfg_max_ITSNsigmaKa{"cfg_max_ITSNsigmaKa", 1e+10, "max. ITS n sigma for kaon exclusion"}; @@ -459,7 +460,7 @@ struct SingleTrackQCMC { fDielectronCut.SetTPCNsigmaKaRange(dielectroncuts.cfg_min_TPCNsigmaKa, dielectroncuts.cfg_max_TPCNsigmaKa); fDielectronCut.SetTPCNsigmaPrRange(dielectroncuts.cfg_min_TPCNsigmaPr, dielectroncuts.cfg_max_TPCNsigmaPr); fDielectronCut.SetTOFNsigmaElRange(dielectroncuts.cfg_min_TOFNsigmaEl, dielectroncuts.cfg_max_TOFNsigmaEl); - fDielectronCut.SetMaxPinForPionRejectionTPC(dielectroncuts.cfg_max_pin_pirejTPC); + fDielectronCut.SetPinRangeForPionRejectionTPC(dielectroncuts.cfg_min_pin_pirejTPC, dielectroncuts.cfg_max_pin_pirejTPC); fDielectronCut.SetITSNsigmaKaRange(dielectroncuts.cfg_min_ITSNsigmaKa, dielectroncuts.cfg_max_ITSNsigmaKa); fDielectronCut.SetITSNsigmaPrRange(dielectroncuts.cfg_min_ITSNsigmaPr, dielectroncuts.cfg_max_ITSNsigmaPr); fDielectronCut.SetPRangeForITSNsigmaKa(dielectroncuts.cfg_min_p_ITSNsigmaKa, dielectroncuts.cfg_max_p_ITSNsigmaKa); diff --git a/PWGEM/Dilepton/Tasks/taggingHFE.cxx b/PWGEM/Dilepton/Tasks/taggingHFE.cxx index 6dd3a30d5b1..0b5cbf5e491 100644 --- a/PWGEM/Dilepton/Tasks/taggingHFE.cxx +++ b/PWGEM/Dilepton/Tasks/taggingHFE.cxx @@ -17,6 +17,7 @@ #include #include #include +#include #include "Math/Vector4D.h" #include "Framework/runDataProcessing.h" @@ -128,9 +129,9 @@ struct taggingHFE { Configurable cfg_max_mass_k0s{"cfg_max_mass_k0s", 0.510, "max mass for K0S"}; Configurable cfg_min_mass_lambda{"cfg_min_mass_lambda", 1.11, "min mass for Lambda rejection"}; Configurable cfg_max_mass_lambda{"cfg_max_mass_lambda", 1.12, "max mass for Lambda rejection"}; - Configurable cfg_min_cospa_v0hadron{"cfg_min_cospa_v0hadron", 0.95, "min cospa for v0hadron"}; - Configurable cfg_max_pca_v0hadron{"cfg_max_pca_v0hadron", 0.2, "max distance between 2 legs for v0hadron"}; - // Configurable cfg_min_radius_v0hadron{"cfg_min_radius_v0hadron", 0.1, "min rxy for v0hadron"}; + Configurable cfg_min_cospa{"cfg_min_cospa", 0.95, "min cospa for v0hadron"}; + Configurable cfg_max_dca2legs{"cfg_max_dca2legs", 0.2, "max distance between 2 legs for v0hadron"}; + // Configurable cfg_min_radius{"cfg_min_radius", 0.1, "min rxy for v0hadron"}; Configurable cfg_min_cr2findable_ratio_tpc{"cfg_min_cr2findable_ratio_tpc", 0.8, "min. TPC Ncr/Nf ratio"}; Configurable cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 999.f, "max fraction of shared clusters in TPC"}; Configurable cfg_min_ncrossedrows_tpc{"cfg_min_ncrossedrows_tpc", 40, "min ncrossed rows"}; @@ -276,15 +277,17 @@ struct taggingHFE { fRegistry.add("Event/hMultFT0CvsMultNTracksPV", "hMultFT0CvsMultNTracksPV;mult. FT0C;N_{track} to PV", kTH2F, {{60, 0, 60000}, {600, 0, 6000}}, false); // for charm hadrons - fRegistry.add("e_Kpm/all/hLxy", "decay length XY from PV;L_{xy} (cm)", kTH1F, {{100, 0, 1}}, false); - fRegistry.add("e_Kpm/all/hLz", "decay length Z from PV;L_{z} (cm)", kTH1F, {{100, 0, 1}}, false); - fRegistry.add("e_Kpm/all/hCosPA", "cosPA;cosine of pointing angle", kTH1F, {{100, 0, 1}}, false); - fRegistry.add("e_Kpm/all/hCosPAXY", "cosPA in XY;cosine of pointing angle in XY", kTH1F, {{100, 0, 1}}, false); - fRegistry.add("e_Kpm/all/hDCA2Legs", "distance between 2 legs;distance between 2 legs (cm)", kTH1F, {{100, 0, 1}}, false); + fRegistry.add("e_Kpm/all/hLxy", "decay length XY from PV;L_{xy} (cm)", kTH1F, {{500, 0, 0.5}}, false); + fRegistry.add("e_Kpm/all/hLz", "decay length Z from PV;L_{z} (cm)", kTH1F, {{500, 0, 0.5}}, false); + fRegistry.add("e_Kpm/all/hCosPA", "cosPA;cosine of pointing angle", kTH1F, {{200, 0.8, 1}}, false); + fRegistry.add("e_Kpm/all/hCosPAXY", "cosPA in XY;cosine of pointing angle in XY", kTH1F, {{200, 0.8, 1}}, false); + fRegistry.add("e_Kpm/all/hDCA2Legs", "distance between 2 legs;distance between 2 legs (cm)", kTH1F, {{500, 0, 0.5}}, false); fRegistry.add("e_Kpm/all/hMass", "mass;mass (GeV/c^{2});p_{T} (GeV/c)", kTH2F, {{40, 0.5, 2.5}, {100, 0, 10}}, false); fRegistry.add("e_Kpm/all/hDeltaEtaDeltaPhi", "#Delta#varphi vs. #Delta#eta;#Delta#varphi = #varphi_{h} - #varphi_{e} (rad.);#Delta#eta = #eta_{h} - #eta_{e}", kTH2F, {{180, -M_PI, M_PI}, {200, -2, +2}}, false); fRegistry.add("e_Kpm/all/hRelDeltaPt", "rel delta pT;(p_{T,h} - p_{T,e})/p_{T,e}", kTH1F, {{80, -2, +2}}, false); - fRegistry.add("e_Kpm/all/hProdDCAxy", "product of DCAxy;d_{xy}^{e} #times d_{xy}^{h} (cm)^{2}", kTH1F, {{100, -0.05, +0.05}}, false); + fRegistry.add("e_Kpm/all/hProdDCAxy", "product of DCAxy;d_{xy}^{e} #times d_{xy}^{h} (#sigma)^{2}", kTH1F, {{200, -100, +100}}, false); + fRegistry.add("e_Kpm/all/hCorrelationDCAxy", "correlation of DCAxy;DCA^{xy}_{e} (#sigma);DCA^{xy}_{h} (#sigma)", kTH2F, {{200, -10, +10}, {200, -10, +10}}, false); + fRegistry.add("e_Kpm/all/hCorrelationDCAz", "correlation of DCAz;DCA^{z}_{e} (#sigma);DCA^{z}_{h} (#sigma)", kTH2F, {{200, -10, +10}, {200, -10, +10}}, false); fRegistry.addClone("e_Kpm/all/", "e_Kpm/D0/"); fRegistry.addClone("e_Kpm/all/", "e_Kpm/Dpm/"); @@ -335,6 +338,9 @@ struct taggingHFE { fRegistry.addClone("D0/electron/", "D0/kaon/"); // D0 -> K- e+ nu, Br = 0.03549 | D0 -> K- e+ pi0 nu, Br = 0.016 | D0 -> K*(892)- e+ nu, Br = 0.0215 // D0 -> anti-K0S e+ pi- nu, Br = 0.0144 fRegistry.addClone("Dpm/electron/", "Dpm/kaon/"); // D+ -> K- pi+ e+ nu, Br = 0.0402 | D+ -> anti-K*(892)0 e+ nu, Br = 0.0540 // D+ -> anti-K0S e+ nu, Br = 0.0872 fRegistry.addClone("Ds/electron/", "Ds/kaon/"); // Ds+ -> K0S e+ nu, Br = 0.0034 // Ds+ -> phi e+ nu, Br = 0.0239 + + fRegistry.add("Generated/D0/prompt/hs", "#eta correlation from charm hadron;p_{T,e} (GeV/c);p_{T,K} (GeV/c);#eta_{e};#eta_{K};", kTHnSparseF, {{100, 0, 10}, {100, 0, 10}, {100, -5, +5}, {100, -5, 5}}, false); + fRegistry.addClone("Generated/D0/prompt/", "Generated/D0/nonprompt/"); } template @@ -593,6 +599,10 @@ struct taggingHFE { float dcaZ = mDcaInfoCov.getZ(); for (const auto& trackId : trackIds) { + if (trackId == ele.globalIndex()) { + continue; + } + const auto& track = tracks.rawIteratorAt(trackId); const auto& mctrack = track.template mcParticle_as(); const auto& mcCollision2 = mctrack.template mcCollision_as(); @@ -601,6 +611,7 @@ struct taggingHFE { trackParCov.setPID(o2::track::PID::Kaon); o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, trackParCov, 2.f, matCorr, &mDcaInfoCov); float dcaXY_h = mDcaInfoCov.getY(); + float dcaZ_h = mDcaInfoCov.getZ(); std::array svpos = {0.}; // secondary vertex position std::array pvec0 = {0.}; std::array pvec1 = {0.}; @@ -650,7 +661,9 @@ struct taggingHFE { fRegistry.fill(HIST("e_Kpm/all/hMass"), mEK, ptEK); fRegistry.fill(HIST("e_Kpm/all/hDeltaEtaDeltaPhi"), dphi, deta); fRegistry.fill(HIST("e_Kpm/all/hRelDeltaPt"), reldpt); - fRegistry.fill(HIST("e_Kpm/all/hProdDCAxy"), dcaXY * dcaXY_h); + fRegistry.fill(HIST("e_Kpm/all/hProdDCAxy"), dcaXY / std::sqrt(eleParCov.getSigmaY2()) * dcaXY_h / std::sqrt(trackParCov.getSigmaY2())); + fRegistry.fill(HIST("e_Kpm/all/hCorrelationDCAxy"), dcaXY / std::sqrt(eleParCov.getSigmaY2()), dcaXY_h / std::sqrt(trackParCov.getSigmaY2())); + fRegistry.fill(HIST("e_Kpm/all/hCorrelationDCAz"), dcaZ / std::sqrt(eleParCov.getSigmaZ2()), dcaZ_h / std::sqrt(trackParCov.getSigmaZ2())); int commonMotherId = o2::aod::pwgem::dilepton::utils::mcutil::FindCommonMotherFrom2ProngsWithoutPDG(mcele, mctrack); // e and K+/- if (commonMotherId < 0 && mctrack.has_mothers()) { @@ -677,7 +690,9 @@ struct taggingHFE { fRegistry.fill(HIST("e_Kpm/D0/hMass"), mEK, ptEK); fRegistry.fill(HIST("e_Kpm/D0/hDeltaEtaDeltaPhi"), dphi, deta); fRegistry.fill(HIST("e_Kpm/D0/hRelDeltaPt"), reldpt); - fRegistry.fill(HIST("e_Kpm/D0/hProdDCAxy"), dcaXY * dcaXY_h); + fRegistry.fill(HIST("e_Kpm/D0/hProdDCAxy"), dcaXY / std::sqrt(eleParCov.getSigmaY2()) * dcaXY_h / std::sqrt(trackParCov.getSigmaY2())); + fRegistry.fill(HIST("e_Kpm/D0/hCorrelationDCAxy"), dcaXY / std::sqrt(eleParCov.getSigmaY2()), dcaXY_h / std::sqrt(trackParCov.getSigmaY2())); + fRegistry.fill(HIST("e_Kpm/D0/hCorrelationDCAz"), dcaZ / std::sqrt(eleParCov.getSigmaZ2()), dcaZ_h / std::sqrt(trackParCov.getSigmaZ2())); } else if (std::abs(cmp.pdgCode()) == 411) { // Dpm if (o2::aod::pwgem::dilepton::utils::mcutil::IsFromBeauty(cmp, mcParticles) < 0) { fillElectronHistograms<3, 1, 0>(ele, eleParCov, dcaXY, dcaZ); // prompt charm @@ -692,7 +707,9 @@ struct taggingHFE { fRegistry.fill(HIST("e_Kpm/Dpm/hMass"), mEK, ptEK); fRegistry.fill(HIST("e_Kpm/Dpm/hDeltaEtaDeltaPhi"), dphi, deta); fRegistry.fill(HIST("e_Kpm/Dpm/hRelDeltaPt"), reldpt); - fRegistry.fill(HIST("e_Kpm/Dpm/hProdDCAxy"), dcaXY * dcaXY_h); + fRegistry.fill(HIST("e_Kpm/Dpm/hProdDCAxy"), dcaXY / std::sqrt(eleParCov.getSigmaY2()) * dcaXY_h / std::sqrt(trackParCov.getSigmaY2())); + fRegistry.fill(HIST("e_Kpm/Dpm/hCorrelationDCAxy"), dcaXY / std::sqrt(eleParCov.getSigmaY2()), dcaXY_h / std::sqrt(trackParCov.getSigmaY2())); + fRegistry.fill(HIST("e_Kpm/Dpm/hCorrelationDCAz"), dcaZ / std::sqrt(eleParCov.getSigmaZ2()), dcaZ_h / std::sqrt(trackParCov.getSigmaZ2())); } else if (std::abs(cmp.pdgCode()) == 431) { // Ds if (o2::aod::pwgem::dilepton::utils::mcutil::IsFromBeauty(cmp, mcParticles) < 0) { fillElectronHistograms<4, 1, 0>(ele, eleParCov, dcaXY, dcaZ); // prompt charm @@ -707,7 +724,9 @@ struct taggingHFE { fRegistry.fill(HIST("e_Kpm/Ds/hMass"), mEK, ptEK); fRegistry.fill(HIST("e_Kpm/Ds/hDeltaEtaDeltaPhi"), dphi, deta); fRegistry.fill(HIST("e_Kpm/Ds/hRelDeltaPt"), reldpt); - fRegistry.fill(HIST("e_Kpm/Ds/hProdDCAxy"), dcaXY * dcaXY_h); + fRegistry.fill(HIST("e_Kpm/Ds/hProdDCAxy"), dcaXY / std::sqrt(eleParCov.getSigmaY2()) * dcaXY_h / std::sqrt(trackParCov.getSigmaY2())); + fRegistry.fill(HIST("e_Kpm/Ds/hCorrelationDCAxy"), dcaXY / std::sqrt(eleParCov.getSigmaY2()), dcaXY_h / std::sqrt(trackParCov.getSigmaY2())); + fRegistry.fill(HIST("e_Kpm/Ds/hCorrelationDCAz"), dcaZ / std::sqrt(eleParCov.getSigmaZ2()), dcaZ_h / std::sqrt(trackParCov.getSigmaZ2())); } } } else { // common mother does not exist, but DCAFitterN found something. i.e. fake @@ -727,7 +746,9 @@ struct taggingHFE { fRegistry.fill(HIST("e_Kpm/fake/hMass"), mEK, ptEK); fRegistry.fill(HIST("e_Kpm/fake/hDeltaEtaDeltaPhi"), dphi, deta); fRegistry.fill(HIST("e_Kpm/fake/hRelDeltaPt"), reldpt); - fRegistry.fill(HIST("e_Kpm/fake/hProdDCAxy"), dcaXY * dcaXY_h); + fRegistry.fill(HIST("e_Kpm/fake/hProdDCAxy"), dcaXY / std::sqrt(eleParCov.getSigmaY2()) * dcaXY_h / std::sqrt(trackParCov.getSigmaY2())); + fRegistry.fill(HIST("e_Kpm/fake/hCorrelationDCAxy"), dcaXY / std::sqrt(eleParCov.getSigmaY2()), dcaXY_h / std::sqrt(trackParCov.getSigmaY2())); + fRegistry.fill(HIST("e_Kpm/fake/hCorrelationDCAz"), dcaZ / std::sqrt(eleParCov.getSigmaZ2()), dcaZ_h / std::sqrt(trackParCov.getSigmaZ2())); } } // end of kaon loop } @@ -952,7 +973,7 @@ struct taggingHFE { Partition negTracks = o2::aod::track::signed1Pt < 0.f; //! type of V0. 0: built solely for cascades (does not pass standard V0 cuts), 1: standard 2, 3: photon-like with TPC-only use. Regular analysis should always use type 1. - Filter v0Filter = o2::aod::v0data::v0Type == uint8_t(1) && o2::aod::v0data::v0cosPA > v0cuts.cfg_min_cospa_v0hadron&& o2::aod::v0data::dcaV0daughters < v0cuts.cfg_max_pca_v0hadron; + Filter v0Filter = o2::aod::v0data::v0Type == uint8_t(1) && o2::aod::v0data::v0cosPA > v0cuts.cfg_min_cospa&& o2::aod::v0data::dcaV0daughters < v0cuts.cfg_max_dca2legs; using filteredV0s = soa::Filtered; std::vector electronIds; @@ -1306,6 +1327,75 @@ struct taggingHFE { used_electronIds.shrink_to_fit(); } PROCESS_SWITCH(taggingHFE, processTTCA, "process with TTCA", true); + + template + bool isSemiLeptonic(TMCParticle const& mcParticle, TMCParticles const& mcParticles) + { + if (!mcParticle.has_daughters()) { + return false; + } + bool is_lepton_involved = false; + bool is_neutrino_involved = false; + for (int d = mcParticle.daughtersIds()[0]; d <= mcParticle.daughtersIds()[1]; ++d) { + if (d < mcParticles.size()) { // protect against bad daughter indices + const auto& daughter = mcParticles.rawIteratorAt(d); + if (daughter.pdgCode() == pdgLepton) { + is_lepton_involved = true; + } else if (daughter.pdgCode() == pdgNeutrino) { + is_neutrino_involved = true; + } + } else { + std::cout << "Daughter label (" << d << ") exceeds the McParticles size (" << mcParticles.size() << ")" << std::endl; + std::cout << " Check the MC generator" << std::endl; + return false; + } + } + + if (is_lepton_involved && is_neutrino_involved) { + return true; + } else { + return false; + } + } + + Partition genDpms = nabs(o2::aod::mcparticle::pdgCode) == 411; + Partition genD0s = nabs(o2::aod::mcparticle::pdgCode) == 421; + Partition genDss = nabs(o2::aod::mcparticle::pdgCode) == 431; + Partition genLcs = nabs(o2::aod::mcparticle::pdgCode) == 4122; + + void processGen(aod::McCollisions const&, aod::McParticles const& mcParticles) + { + for (const auto& genD0 : genD0s) { + const auto& mcCollision = genD0.template mcCollision_as(); + if (cfgEventGeneratorType >= 0 && mcCollision.getSubGeneratorId() != cfgEventGeneratorType) { + continue; + } + if (!(genD0.isPhysicalPrimary() || genD0.producedByGenerator())) { + continue; + } + if ((isSemiLeptonic<11, -12>(genD0, mcParticles) || isSemiLeptonic<-11, 12>(genD0, mcParticles))) { + float ptE = 999.f, ptK = 999.f; + float etaE = 999.f, etaK = 999.f; + for (int d = genD0.daughtersIds()[0]; d <= genD0.daughtersIds()[1]; ++d) { + const auto& daughter = mcParticles.rawIteratorAt(d); + if (std::abs(daughter.pdgCode()) == 11) { + ptE = daughter.pt(); + etaE = daughter.eta(); + } else if (std::abs(daughter.pdgCode()) == 321) { + ptK = daughter.pt(); + etaK = daughter.eta(); + } + } + if (o2::aod::pwgem::dilepton::utils::mcutil::IsFromBeauty(genD0, mcParticles) < 0) { + fRegistry.fill(HIST("Generated/D0/prompt/hs"), ptE, ptK, etaE, etaK); + } else { + fRegistry.fill(HIST("Generated/D0/nonprompt/hs"), ptE, ptK, etaE, etaK); + } + } + + } // end of gen. D0 loop + } + PROCESS_SWITCH(taggingHFE, processGen, "process gen. info", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGEM/Dilepton/Tasks/vpPairQC.cxx b/PWGEM/Dilepton/Tasks/vpPairQC.cxx index c3a2aaa06e3..b9fe093e9f5 100644 --- a/PWGEM/Dilepton/Tasks/vpPairQC.cxx +++ b/PWGEM/Dilepton/Tasks/vpPairQC.cxx @@ -140,6 +140,7 @@ struct vpPairQC { Configurable cfg_max_TPCNsigmaPr{"cfg_max_TPCNsigmaPr", +0.0, "max. TPC n sigma for proton exclusion"}; Configurable cfg_min_TOFNsigmaEl{"cfg_min_TOFNsigmaEl", -3.0, "min. TOF n sigma for electron inclusion"}; Configurable cfg_max_TOFNsigmaEl{"cfg_max_TOFNsigmaEl", +3.0, "max. TOF n sigma for electron inclusion"}; + Configurable cfg_min_pin_pirejTPC{"cfg_min_pin_pirejTPC", 0.5, "min. pin for pion rejection in TPC"}; Configurable cfg_max_pin_pirejTPC{"cfg_max_pin_pirejTPC", 0.5, "max. pin for pion rejection in TPC"}; Configurable enableTTCA{"enableTTCA", true, "Flag to enable or disable TTCA"}; @@ -336,7 +337,7 @@ struct vpPairQC { fDielectronCut.SetTPCNsigmaKaRange(dielectroncuts.cfg_min_TPCNsigmaKa, dielectroncuts.cfg_max_TPCNsigmaKa); fDielectronCut.SetTPCNsigmaPrRange(dielectroncuts.cfg_min_TPCNsigmaPr, dielectroncuts.cfg_max_TPCNsigmaPr); fDielectronCut.SetTOFNsigmaElRange(dielectroncuts.cfg_min_TOFNsigmaEl, dielectroncuts.cfg_max_TOFNsigmaEl); - fDielectronCut.SetMaxPinForPionRejectionTPC(dielectroncuts.cfg_max_pin_pirejTPC); + fDielectronCut.SetPinRangeForPionRejectionTPC(dielectroncuts.cfg_min_pin_pirejTPC, dielectroncuts.cfg_max_pin_pirejTPC); if (dielectroncuts.cfg_pid_scheme == static_cast(DielectronCut::PIDSchemes::kPIDML)) { // please call this at the end of DefineDileptonCut static constexpr int nClassesMl = 2; diff --git a/PWGEM/Dilepton/Tasks/vpPairQCMC.cxx b/PWGEM/Dilepton/Tasks/vpPairQCMC.cxx index 13bda4c1d87..58e47abad1d 100644 --- a/PWGEM/Dilepton/Tasks/vpPairQCMC.cxx +++ b/PWGEM/Dilepton/Tasks/vpPairQCMC.cxx @@ -140,6 +140,7 @@ struct vpPairQCMC { Configurable cfg_max_TPCNsigmaPr{"cfg_max_TPCNsigmaPr", +0.0, "max. TPC n sigma for proton exclusion"}; Configurable cfg_min_TOFNsigmaEl{"cfg_min_TOFNsigmaEl", -0.0, "min. TOF n sigma for electron inclusion"}; Configurable cfg_max_TOFNsigmaEl{"cfg_max_TOFNsigmaEl", +0.0, "max. TOF n sigma for electron inclusion"}; + Configurable cfg_min_pin_pirejTPC{"cfg_min_pin_pirejTPC", 0.5, "min. pin for pion rejection in TPC"}; Configurable cfg_max_pin_pirejTPC{"cfg_max_pin_pirejTPC", 0.5, "max. pin for pion rejection in TPC"}; Configurable enableTTCA{"enableTTCA", true, "Flag to enable or disable TTCA"}; @@ -342,7 +343,7 @@ struct vpPairQCMC { fDielectronCut.SetTPCNsigmaKaRange(dielectroncuts.cfg_min_TPCNsigmaKa, dielectroncuts.cfg_max_TPCNsigmaKa); fDielectronCut.SetTPCNsigmaPrRange(dielectroncuts.cfg_min_TPCNsigmaPr, dielectroncuts.cfg_max_TPCNsigmaPr); fDielectronCut.SetTOFNsigmaElRange(dielectroncuts.cfg_min_TOFNsigmaEl, dielectroncuts.cfg_max_TOFNsigmaEl); - fDielectronCut.SetMaxPinForPionRejectionTPC(dielectroncuts.cfg_max_pin_pirejTPC); + fDielectronCut.SetPinRangeForPionRejectionTPC(dielectroncuts.cfg_min_pin_pirejTPC, dielectroncuts.cfg_max_pin_pirejTPC); if (dielectroncuts.cfg_pid_scheme == static_cast(DielectronCut::PIDSchemes::kPIDML)) { // please call this at the end of DefineDileptonCut static constexpr int nClassesMl = 2; From f9205c72600a67eed01819385450b41c0f2373ff Mon Sep 17 00:00:00 2001 From: Francesco Mazzaschi <43742195+fmazzasc@users.noreply.github.com> Date: Wed, 7 May 2025 22:30:56 +0200 Subject: [PATCH 1213/1650] [PWGLF,Trigger] Nuclei trigger: fix wrong nested loop and V0 CosPA calculation (#11120) Co-authored-by: Francesco Mazzaschi --- EventFiltering/PWGLF/nucleiFilter.cxx | 129 ++++++++++++++------------ 1 file changed, 71 insertions(+), 58 deletions(-) diff --git a/EventFiltering/PWGLF/nucleiFilter.cxx b/EventFiltering/PWGLF/nucleiFilter.cxx index 4b22c95c3b1..0030dac0476 100644 --- a/EventFiltering/PWGLF/nucleiFilter.cxx +++ b/EventFiltering/PWGLF/nucleiFilter.cxx @@ -431,73 +431,86 @@ struct nucleiFilter { h2TPCsignal[iN]->Fill(track.sign() * track.tpcInnerParam() * fixTPCrigidity, track.tpcSignal()); } } + // + // fill QA histograms + // + qaHists.fill(HIST("fTPCsignal"), track.sign() * track.tpcInnerParam() * fixTPCrigidity, track.tpcSignal()); - for (const auto& track : tracks) { - if (track.itsNCls() < cfgCutNclusITS || - track.tpcNClsFound() < cfgCutNclusTPC || - std::abs(track.dcaXY()) > cfgCutDCAxy || - std::abs(track.dcaZ()) > cfgCutDCAz || - std::abs(track.eta()) > cfgCutEta) { + } // end loop over tracks + + for (const auto& track : tracks) { + if (track.itsNCls() < cfgCutNclusITS || + track.tpcNClsFound() < cfgCutNclusTPC || + std::abs(track.dcaXY()) > cfgCutDCAxy || + std::abs(track.dcaZ()) > cfgCutDCAz || + std::abs(track.eta()) > cfgCutEta) { + continue; + } + const ROOT::Math::PtEtaPhiMVector trackVector(track.pt(), track.eta(), track.phi(), constants::physics::MassPiMinus); + for (size_t iH3{0}; iH3 < h3vectors.size(); ++iH3) { + if (h3indices[iH3] == track.globalIndex()) { continue; } - const ROOT::Math::PtEtaPhiMVector trackVector(track.pt(), track.eta(), track.phi(), constants::physics::MassPiMinus); - for (size_t iH3{0}; iH3 < h3vectors.size(); ++iH3) { - if (h3indices[iH3] == track.globalIndex()) { - continue; - } - const auto& h3vector = h3vectors[iH3]; - auto pivector = trackVector; - auto cm = h3vector + trackVector; - const ROOT::Math::Boost boost(cm.BoostToCM()); - boost(pivector); - if (pivector.P() < cfgCutKstar) { - keepEvent[kTritonFemto] = true; - break; - } + const auto& h3vector = h3vectors[iH3]; + auto pivector = trackVector; + auto cm = h3vector + trackVector; + const ROOT::Math::Boost boost(cm.BoostToCM()); + boost(pivector); + if (pivector.P() < cfgCutKstar) { + keepEvent[kTritonFemto] = true; + break; } } + } - for (const auto& v0 : v0s) { - const auto& posTrack = v0.posTrack_as(); - const auto& negTrack = v0.negTrack_as(); - if ((posTrack.itsNCls() < cfgCutNclusITS || posTrack.tpcNClsFound() < cfgCutNclusTPC) && - (negTrack.itsNCls() < cfgCutNclusITS || negTrack.tpcNClsFound() < cfgCutNclusTPC)) { - continue; - } - float nSigmas[2]{ - cfgBetheBlochParams->get(2, 5u) > 0.f ? getNsigma(posTrack, 2, 0) : posTrack.tpcNSigmaHe(), - cfgBetheBlochParams->get(2, 5u) > 0.f ? getNsigma(negTrack, 2, 1) : negTrack.tpcNSigmaHe()}; - if ((nSigmas[0] < cfgCutsPID->get(2, 0u) || nSigmas[0] > cfgCutsPID->get(2, 1u)) && - (nSigmas[1] < cfgCutsPID->get(2, 0u) || nSigmas[1] > cfgCutsPID->get(2, 1u))) { - continue; - } - int n2bodyVtx = fitter2body.process(getTrackParCov(posTrack), getTrackParCov(negTrack)); - if (n2bodyVtx == 0) { - continue; - } - auto vtxXYZ = fitter2body.getPCACandidate(); - o2::gpu::gpustd::array mom = {0.}; - vtxXYZ[0] -= collision.posX(); - vtxXYZ[1] -= collision.posY(); - vtxXYZ[2] -= collision.posZ(); - auto momTrackParCov = fitter2body.createParentTrackPar(); - momTrackParCov.getPxPyPzGlo(mom); - double cosPA = (vtxXYZ[0] * mom[0] + vtxXYZ[1] * mom[1] + vtxXYZ[2] * mom[2]) / - std::sqrt((vtxXYZ[0] * vtxXYZ[0] + vtxXYZ[1] * vtxXYZ[1] + vtxXYZ[2] * vtxXYZ[2]) * - (mom[0] * mom[0] + mom[1] * mom[1] + mom[2] * mom[2])); - if (cosPA < cfgCutCosPAheV0) { - continue; - } - keepEvent[kHeV0] = true; - break; + for (const auto& v0 : v0s) { + const auto& posTrack = v0.posTrack_as(); + const auto& negTrack = v0.negTrack_as(); + if ((posTrack.itsNCls() < cfgCutNclusITS || posTrack.tpcNClsFound() < cfgCutNclusTPC) && + (negTrack.itsNCls() < cfgCutNclusITS || negTrack.tpcNClsFound() < cfgCutNclusTPC)) { + continue; } + float nSigmas[2]{ + cfgBetheBlochParams->get(2, 5u) > 0.f ? getNsigma(posTrack, 2, 0) : posTrack.tpcNSigmaHe(), + cfgBetheBlochParams->get(2, 5u) > 0.f ? getNsigma(negTrack, 2, 1) : negTrack.tpcNSigmaHe()}; - // - // fill QA histograms - // - qaHists.fill(HIST("fTPCsignal"), track.sign() * track.tpcInnerParam() * fixTPCrigidity, track.tpcSignal()); + bool isHe3 = nSigmas[0] > cfgCutsPID->get(2, 0u) && nSigmas[0] < cfgCutsPID->get(2, 1u); + bool isAntiHe3 = nSigmas[1] > cfgCutsPID->get(2, 0u) && nSigmas[1] < cfgCutsPID->get(2, 1u); + if (!isHe3 && !isAntiHe3) { + continue; + } + auto& he3Track = isHe3 ? posTrack : negTrack; + auto& piTrack = isHe3 ? negTrack : posTrack; - } // end loop over tracks + int n2bodyVtx = fitter2body.process(getTrackParCov(he3Track), getTrackParCov(piTrack)); + if (n2bodyVtx == 0) { + continue; + } + auto vtxXYZ = fitter2body.getPCACandidate(); + vtxXYZ[0] -= collision.posX(); + vtxXYZ[1] -= collision.posY(); + vtxXYZ[2] -= collision.posZ(); + + o2::gpu::gpustd::array momHe3 = {0.}; + o2::gpu::gpustd::array momPi = {0.}; + o2::gpu::gpustd::array momTot = {0.}; + auto& hePropTrack = fitter2body.getTrack(0); + auto& piPropTrack = fitter2body.getTrack(1); + hePropTrack.getPxPyPzGlo(momHe3); + piPropTrack.getPxPyPzGlo(momPi); + for (int i = 0; i < 3; ++i) { + momHe3[i] *= 2; + momTot[i] = momHe3[i] + momPi[i]; + } + double cosPA = (vtxXYZ[0] * momTot[0] + vtxXYZ[1] * momTot[1] + vtxXYZ[2] * momTot[2]) / + std::sqrt((vtxXYZ[0] * vtxXYZ[0] + vtxXYZ[1] * vtxXYZ[1] + vtxXYZ[2] * vtxXYZ[2]) * + (momTot[0] * momTot[0] + momTot[1] * momTot[1] + momTot[2] * momTot[2])); + if (cosPA < cfgCutCosPAheV0) { + continue; + } + keepEvent[kHeV0] = true; + break; + } // fH3L3Body trigger auto bc = collision.bc_as(); From 754d624e44ff080b5098b7dae0fb2cd923e16147 Mon Sep 17 00:00:00 2001 From: Yash Patley <52608802+yashpatley@users.noreply.github.com> Date: Thu, 8 May 2025 02:40:09 +0530 Subject: [PATCH 1214/1650] [PWGCF] Update lambdaR2Correlation.cxx (#11111) --- .../Tasks/lambdaR2Correlation.cxx | 35 ++++++++----------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx index 4006d8ed1fc..bf76e6973fa 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx @@ -248,7 +248,6 @@ struct LambdaTableProducer { Configurable cMinV0CosPA{"cMinV0CosPA", 0.995, "Minimum V0 CosPA to PV"}; Configurable cKshortRejMassWindow{"cKshortRejMassWindow", 0.01, "Reject K0Short Candidates"}; Configurable cKshortRejFlag{"cKshortRejFlag", true, "K0short Mass Rej Flag"}; - // Configurable cLambdaMassWindow{"cLambdaMassWindow", 0.005, "Lambda Mass Window"}; // V0s kinmatic acceptance Configurable cMinV0Mass{"cMinV0Mass", 1.10, "V0 Mass Min"}; @@ -1294,12 +1293,17 @@ struct LambdaTracksExtProducer { const AxisSpec axisMass(100, 1.06, 1.16, "Inv Mass (GeV/#it{c}^{2})"); const AxisSpec axisCPA(100, 0.995, 1.0, "cos(#theta_{PA})"); const AxisSpec axisDcaDau(75, 0., 1.5, "Daug DCA (#sigma)"); + const AxisSpec axisDEta(320, -1.6, 1.6, "#Delta#eta"); + const AxisSpec axisDPhi(640, -PIHalf, 3. * PIHalf, "#Delta#varphi"); // Histograms Booking histos.add("h1i_totlambda_mult", "Multiplicity", kTH1I, {axisMult}); histos.add("h1i_totantilambda_mult", "Multiplicity", kTH1I, {axisMult}); histos.add("h1i_lambda_mult", "Multiplicity", kTH1I, {axisMult}); histos.add("h1i_antilambda_mult", "Multiplicity", kTH1I, {axisMult}); + histos.add("h2d_n2_etaphi_LaP_LaM", "#rho_{2}^{SharePair}", kTH2D, {axisDEta, axisDPhi}); + histos.add("h2d_n2_etaphi_LaP_LaP", "#rho_{2}^{SharePair}", kTH2D, {axisDEta, axisDPhi}); + histos.add("h2d_n2_etaphi_LaM_LaM", "#rho_{2}^{SharePair}", kTH2D, {axisDEta, axisDPhi}); // InvMass, DcaDau and CosPA histos.add("Reco/h1f_lambda_invmass", "M_{p#pi}", kTH1F, {axisMass}); @@ -1353,16 +1357,20 @@ struct LambdaTracksExtProducer { continue; } - // check only lambda-lambda || antilambda-antilambda - if (lambda.v0Type() != track.v0Type()) { - continue; - } - // check if lambda shares daughters with any other track if (lambda.posTrackId() == track.posTrackId() || lambda.negTrackId() == track.negTrackId()) { vSharedDauLambdaIndex.push_back(track.index()); lambdaSharingDauFlag = true; + // Fill DEta-DPhi Histogram + if ((lambda.v0Type() == kLambda && track.v0Type() == kAntiLambda) || (lambda.v0Type() == kAntiLambda && track.v0Type() == kLambda)) { + histos.fill(HIST("h2d_n2_etaphi_LaP_LaM"), lambda.eta() - track.eta(), RecoDecay::constrainAngle((lambda.phi() - track.phi()), -PIHalf)); + } else if (lambda.v0Type() == kLambda && track.v0Type() == kLambda) { + histos.fill(HIST("h2d_n2_etaphi_LaP_LaP"), lambda.eta() - track.eta(), RecoDecay::constrainAngle((lambda.phi() - track.phi()), -PIHalf)); + } else if (lambda.v0Type() == kAntiLambda && track.v0Type() == kAntiLambda) { + histos.fill(HIST("h2d_n2_etaphi_LaM_LaM"), lambda.eta() - track.eta(), RecoDecay::constrainAngle((lambda.phi() - track.phi()), -PIHalf)); + } + // decision based on mass closest to PdgMass of Lambda if (std::abs(lambda.mass() - MassLambda0) > std::abs(track.mass() - MassLambda0)) { lambdaMinDeltaMassFlag = false; @@ -1473,7 +1481,6 @@ struct LambdaR2Correlation { const AxisSpec axisCent(105, 0, 105, "FT0M (%)"); const AxisSpec axisMult(10, 0, 10, "N_{#Lambda}"); const AxisSpec axisMass(100, 1.06, 1.16, "M_{#Lambda} (GeV/#it{c}^{2})"); - const AxisSpec axisMassCorr(60, -0.03, 0.03, "M_{#Lambda} - #frac{M_{pair}}{2} (GeV/#it{c}^{2})"); const AxisSpec axisPt(cNPtBins, cMinPt, cMaxPt, "p_{T} (GeV/#it{c})"); const AxisSpec axisEta(cNRapBins, cMinRap, cMaxRap, "#eta"); const AxisSpec axisRap(cNRapBins, cMinRap, cMaxRap, "y"); @@ -1537,14 +1544,6 @@ struct LambdaR2Correlation { histos.add("Reco/h2d_n2_phiphi_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisPhi, axisPhi}); histos.add("Reco/h2d_n2_phiphi_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisPhi, axisPhi}); - // rho2 for numerator of R2 as a function of M_{#Lambda} (To remove background from sidebands) {TESTING PHASE !!!!} - histos.add("Reco/h3d_n2_raprapmass_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH3D, {axisRap, axisRap, axisMassCorr}); - histos.add("Reco/h3d_n2_raprapmass_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH3D, {axisRap, axisRap, axisMassCorr}); - histos.add("Reco/h3d_n2_raprapmass_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH3D, {axisRap, axisRap, axisMassCorr}); - histos.add("Reco/h3d_n2_phiphimass_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH3D, {axisPhi, axisPhi, axisMassCorr}); - histos.add("Reco/h3d_n2_phiphimass_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH3D, {axisPhi, axisPhi, axisMassCorr}); - histos.add("Reco/h3d_n2_phiphimass_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH3D, {axisPhi, axisPhi, axisMassCorr}); - // rho2 for R2 Rap1Phi1Rap2Phi2 histos.add("Reco/h2d_n2_rapphi_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisRapPhi, axisRapPhi}); histos.add("Reco/h2d_n2_rapphi_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisRapPhi, axisRapPhi}); @@ -1579,18 +1578,12 @@ struct LambdaR2Correlation { float corfac = p1.corrFact() * p2.corrFact(); - float massParam = MassLambda0 - 0.5 * (p1.mass() + p2.mass()); - // fill rho2 histograms histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n2_ptpt_") + HIST(SubDirHist[part_pair]), p1.pt(), p2.pt(), corfac); histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n2_etaeta_") + HIST(SubDirHist[part_pair]), p1.eta(), p2.eta(), corfac); histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n2_raprap_") + HIST(SubDirHist[part_pair]), p1.rap(), p2.rap(), corfac); histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n2_phiphi_") + HIST(SubDirHist[part_pair]), p1.phi(), p2.phi(), corfac); - // fill rho2 3D-histograms with mass - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h3d_n2_raprapmass_") + HIST(SubDirHist[part_pair]), p1.rap(), p2.rap(), massParam, corfac); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h3d_n2_phiphimass_") + HIST(SubDirHist[part_pair]), p1.phi(), p2.phi(), massParam, corfac); - if (rapbin1 >= 0 && rapbin2 >= 0 && phibin1 >= 0 && phibin2 >= 0 && rapbin1 < nrapbins && rapbin2 < nrapbins && phibin1 < nphibins && phibin2 < nphibins) { int rapphix = rapbin1 * nphibins + phibin1; From b3ee6ee14ab26a977f5fe7a11d04682fde9fe8f3 Mon Sep 17 00:00:00 2001 From: omvazque Date: Thu, 8 May 2025 01:30:55 -0500 Subject: [PATCH 1215/1650] [PWGLF] Fix collisions loop in MC closure (#11124) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 166 ++++++++----------- 1 file changed, 69 insertions(+), 97 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index 43add45613a..5778f4d0634 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -738,50 +738,56 @@ struct UccZdc { void processMCclosure(aod::McCollisions::iterator const& mccollision, soa::SmallGroups const& collisions, o2::aod::BCsRun3 const& /*bcs*/, aod::McParticles const& mcParticles, TheFilteredSimTracks const& simTracks) { - float rndNum = randPointer->Uniform(0.0, 1.0); - registry.fill(HIST("RandomNumber"), rndNum); - - // Half of the statistics for MC closure - if (rndNum >= zEro && rndNum < oneHalf) { - registry.fill(HIST("EvtsDivided"), 0); - //----- MC reconstructed -----// - for (const auto& collision : collisions) { - - // To use run-by-run efficiency - const auto& foundBC = collision.foundBC_as(); - auto efficiency = ccdb->getForTimeStamp(paTH.value, foundBC.timestamp()); - // auto efficiency = ccdb->getForRun(paTH.value, foundBC.runNumber()); - if (!efficiency) { - LOGF(fatal, "Efficiency object not found!"); - } + for (const auto& collision : collisions) { + + // To use run-by-run efficiency + const auto& foundBC = collision.foundBC_as(); + auto efficiency = ccdb->getForTimeStamp(paTH.value, foundBC.timestamp()); + if (!efficiency) { + LOGF(fatal, "Efficiency object not found!"); + continue; + } - // Event selection - if (!isEventSelected(collision)) { - continue; - } - // MC collision? - if (!collision.has_mcCollision()) { - continue; - } + registry.fill(HIST("hEventCounterMC"), EvCutLabel::All); + + // Event selection + if (!isEventSelected(collision)) { + continue; + } + // MC collision? + if (!collision.has_mcCollision()) { + continue; + } + + if (std::fabs(mccollision.posZ()) > posZcut) { + continue; + } + registry.fill(HIST("hEventCounterMC"), EvCutLabel::VtxZ); + registry.fill(HIST("zPosMC"), mccollision.posZ()); - registry.fill(HIST("T0Ccent"), collision.centFT0C()); - registry.fill(HIST("zPos"), collision.posZ()); + const auto& cent{collision.centFT0C()}; + registry.fill(HIST("nRecColvsCent"), collisions.size(), cent); + registry.fill(HIST("T0Ccent"), cent); + registry.fill(HIST("zPos"), collision.posZ()); - const auto& groupedTracks{simTracks.sliceBy(perCollision, collision.globalIndex())}; + float rndNum = randPointer->Uniform(0.0, 1.0); + registry.fill(HIST("RandomNumber"), rndNum); + const auto& groupedTracks{simTracks.sliceBy(perCollision, collision.globalIndex())}; + if (rndNum >= zEro && rndNum < oneHalf) { // Half of the statistics for MC closure + + registry.fill(HIST("EvtsDivided"), 0); std::vector pTs; std::vector wIs; // Calculates the event weight, W_k for (const auto& track : groupedTracks) { // Track Selection - if (myTrackSel.IsSelected(track)) { - if (passesDCAxyCut(track)) { - float pt{track.pt()}; - double weight{efficiency->GetBinContent(efficiency->FindBin(pt))}; - if (weight > 0.) { - pTs.emplace_back(pt); - wIs.emplace_back(weight); - } + if (myTrackSel.IsSelected(track) && passesDCAxyCut(track)) { + float pt{track.pt()}; + double weight{efficiency->GetBinContent(efficiency->FindBin(pt))}; + if (weight > 0.) { + pTs.emplace_back(pt); + wIs.emplace_back(weight); } } } @@ -815,13 +821,6 @@ struct UccZdc { registry.fill(HIST("NchVsFourParCorr"), w1, fourParCorr, denFourParCorr); //--------------------------- Generated MC --------------------------- - registry.fill(HIST("hEventCounterMC"), EvCutLabel::All); - if (std::fabs(mccollision.posZ()) > posZcut) { - continue; - } - registry.fill(HIST("zPosMC"), mccollision.posZ()); - registry.fill(HIST("hEventCounterMC"), EvCutLabel::VtxZ); - std::vector pTsMC; std::vector wIsMC; // Calculates the event weight, W_k @@ -867,69 +866,42 @@ struct UccZdc { registry.fill(HIST("NchvsTwoParCorrGen"), nchMC, twoParCorrMC, denTwoParCorrMC); registry.fill(HIST("NchvsThreeParCorrGen"), nchMC, threeParCorrMC, denThreeParCorrMC); registry.fill(HIST("NchvsFourParCorrGen"), nchMC, fourParCorrMC, denFourParCorrMC); - } - } else { // Correction with the remaining half of the sample - registry.fill(HIST("EvtsDivided"), 1); - //----- MC reconstructed -----// - for (const auto& collision : collisions) { - // Event selection - if (!isEventSelected(collision)) { - continue; - } - // MC collision? - if (!collision.has_mcCollision()) { - continue; - } - - registry.fill(HIST("zPos"), collision.posZ()); - registry.fill(HIST("nRecColvsCent"), collisions.size(), collision.centFT0C()); - - const auto& cent{collision.centFT0C()}; - registry.fill(HIST("T0Ccent"), cent); - - const auto& groupedTracks{simTracks.sliceBy(perCollision, collision.globalIndex())}; + } else { // Correction with the remaining half of the sample + registry.fill(HIST("EvtsDivided"), 1); + //----- MC reconstructed -----// for (const auto& track : groupedTracks) { // Has MC particle? if (!track.has_mcParticle()) { continue; } // Track selection - if (myTrackSel.IsSelected(track)) { - if (passesDCAxyCut(track)) { - registry.fill(HIST("Pt_all_ch"), cent, track.pt()); - registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); - - const auto& particle{track.mcParticle()}; - if (!particle.isPhysicalPrimary()) { - continue; - } - - registry.fill(HIST("Pt_ch"), cent, track.pt()); - if (particle.pdgCode() == PDG_t::kPiPlus || particle.pdgCode() == PDG_t::kPiMinus) { - registry.fill(HIST("Pt_pi"), cent, track.pt()); - } else if (particle.pdgCode() == PDG_t::kKPlus || particle.pdgCode() == PDG_t::kKMinus) { - registry.fill(HIST("Pt_ka"), cent, track.pt()); - } else if (particle.pdgCode() == PDG_t::kProton || particle.pdgCode() == PDG_t::kProtonBar) { - registry.fill(HIST("Pt_pr"), cent, track.pt()); - } else if (particle.pdgCode() == PDG_t::kSigmaPlus || particle.pdgCode() == PDG_t::kSigmaBarMinus) { - registry.fill(HIST("Pt_sigpos"), cent, track.pt()); - } else if (particle.pdgCode() == PDG_t::kSigmaMinus || particle.pdgCode() == PDG_t::kSigmaBarPlus) { - registry.fill(HIST("Pt_signeg"), cent, track.pt()); - } else { - registry.fill(HIST("Pt_re"), cent, track.pt()); - } + if (myTrackSel.IsSelected(track) && passesDCAxyCut(track)) { + registry.fill(HIST("Pt_all_ch"), cent, track.pt()); + registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); + + const auto& particle{track.mcParticle()}; + if (!particle.isPhysicalPrimary()) { + continue; } - } - } - // Generated MC - registry.fill(HIST("hEventCounterMC"), EvCutLabel::All); - if (std::fabs(mccollision.posZ()) > posZcut) { - continue; + registry.fill(HIST("Pt_ch"), cent, track.pt()); + if (particle.pdgCode() == PDG_t::kPiPlus || particle.pdgCode() == PDG_t::kPiMinus) { + registry.fill(HIST("Pt_pi"), cent, track.pt()); + } else if (particle.pdgCode() == PDG_t::kKPlus || particle.pdgCode() == PDG_t::kKMinus) { + registry.fill(HIST("Pt_ka"), cent, track.pt()); + } else if (particle.pdgCode() == PDG_t::kProton || particle.pdgCode() == PDG_t::kProtonBar) { + registry.fill(HIST("Pt_pr"), cent, track.pt()); + } else if (particle.pdgCode() == PDG_t::kSigmaPlus || particle.pdgCode() == PDG_t::kSigmaBarMinus) { + registry.fill(HIST("Pt_sigpos"), cent, track.pt()); + } else if (particle.pdgCode() == PDG_t::kSigmaMinus || particle.pdgCode() == PDG_t::kSigmaBarPlus) { + registry.fill(HIST("Pt_signeg"), cent, track.pt()); + } else { + registry.fill(HIST("Pt_re"), cent, track.pt()); + } + } } - registry.fill(HIST("zPosMC"), mccollision.posZ()); - registry.fill(HIST("hEventCounterMC"), EvCutLabel::VtxZ); + //----- MC generated -----// for (const auto& particle : mcParticles) { if (particle.eta() < minEta || particle.eta() > maxEta) { continue; @@ -956,8 +928,8 @@ struct UccZdc { registry.fill(HIST("PtMC_re"), cent, particle.pt()); } } - } - } // Half of statistics for corrections + } // Half of statistics for corrections + } // Collisions loop } PROCESS_SWITCH(UccZdc, processMCclosure, "Process MC closure", false); From 48e101058b0eb871f1f120464d7e57caa0d09e33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Thu, 8 May 2025 09:59:28 +0200 Subject: [PATCH 1216/1650] [Common] TOF: add dynamic columns for TOFBeta and TOFMass (#11071) --- Common/DataModel/PIDResponseTOF.h | 134 +++--- DPG/Tasks/AOTTrack/PID/TOF/CMakeLists.txt | 5 + .../AOTTrack/PID/TOF/qaPIDTOFBetaImp.cxx | 426 ++++++++++++++++++ 3 files changed, 506 insertions(+), 59 deletions(-) create mode 100644 DPG/Tasks/AOTTrack/PID/TOF/qaPIDTOFBetaImp.cxx diff --git a/Common/DataModel/PIDResponseTOF.h b/Common/DataModel/PIDResponseTOF.h index aa3d768c8d2..5edfe931ad8 100644 --- a/Common/DataModel/PIDResponseTOF.h +++ b/Common/DataModel/PIDResponseTOF.h @@ -27,6 +27,7 @@ #include "Framework/AnalysisDataModel.h" #include "ReconstructionDataFormats/PID.h" #include "Framework/Logger.h" +#include "Common/Core/PID/PIDTOF.h" namespace o2::aod { @@ -209,6 +210,65 @@ perSpeciesWrapper(tofExpSignalDiff); } // namespace pidutils +// Extra tables +namespace pidflags +{ + +namespace enums +{ +enum PIDFlags : uint8_t { + EvTimeUndef = 0x0, // Event collision not set, corresponding to the LHC Fill event time + EvTimeTOF = 0x1, // Event collision time from TOF + EvTimeT0AC = 0x2, // Event collision time from the FT0AC + EvTimeTOFT0AC = 0x4 // Event collision time from the TOF and FT0AC +}; +} + +DECLARE_SOA_COLUMN(GoodTOFMatch, goodTOFMatch, bool); //! Bool for the TOF PID information on the single track information +DECLARE_SOA_COLUMN(TOFFlags, tofFlags, uint8_t); //! Flag for the complementary TOF PID information for the event time +DECLARE_SOA_DYNAMIC_COLUMN(IsEvTimeDefined, isEvTimeDefined, //! True if the Event Time was computed with any method i.e. there is a usable event time + [](uint8_t flags) -> bool { return (flags > 0); }); +DECLARE_SOA_DYNAMIC_COLUMN(IsEvTimeTOF, isEvTimeTOF, //! True if the Event Time was computed with the TOF + [](uint8_t flags) -> bool { return (flags & enums::PIDFlags::EvTimeTOF) == enums::PIDFlags::EvTimeTOF; }); +DECLARE_SOA_DYNAMIC_COLUMN(IsEvTimeT0AC, isEvTimeT0AC, //! True if the Event Time was computed with the T0AC + [](uint8_t flags) -> bool { return (flags & enums::PIDFlags::EvTimeT0AC) == enums::PIDFlags::EvTimeT0AC; }); +DECLARE_SOA_DYNAMIC_COLUMN(IsEvTimeTOFT0AC, isEvTimeTOFT0AC, //! True if the Event Time was computed with the TOF and T0AC + [](uint8_t flags) -> bool { return (flags & enums::PIDFlags::EvTimeTOFT0AC) == enums::PIDFlags::EvTimeTOFT0AC; }); + +} // namespace pidflags + +DECLARE_SOA_TABLE(pidTOFFlags, "AOD", "pidTOFFlags", //! Table of the flags for TOF signal quality on the track level + pidflags::GoodTOFMatch); + +DECLARE_SOA_TABLE(pidEvTimeFlags, "AOD", "pidEvTimeFlags", //! Table of the PID flags for the event time tables + pidflags::TOFFlags, + pidflags::IsEvTimeDefined, + pidflags::IsEvTimeTOF, + pidflags::IsEvTimeT0AC, + pidflags::IsEvTimeTOFT0AC); + +namespace pidtofsignal +{ +DECLARE_SOA_COLUMN(TOFSignal, tofSignal, float); //! TOF signal from track time +DECLARE_SOA_DYNAMIC_COLUMN(EventCollisionTime, eventCollisionTime, //! Event collision time used for the track. Needs the TOF + [](float signal, float tMinusTexp, float texp) -> float { return texp + tMinusTexp - signal; }); + +} // namespace pidtofsignal + +DECLARE_SOA_TABLE(TOFSignal, "AOD", "TOFSignal", //! Table of the TOF signal + pidtofsignal::TOFSignal, + pidtofsignal::EventCollisionTime); + +namespace pidtofevtime +{ +DECLARE_SOA_COLUMN(TOFEvTime, tofEvTime, float); //! event time for TOF signal. Can be obtained via a combination of detectors e.g. TOF, FT0A, FT0C +DECLARE_SOA_COLUMN(TOFEvTimeErr, tofEvTimeErr, float); //! event time error for TOF. Can be obtained via a combination of detectors e.g. TOF, FT0A, FT0C +} // namespace pidtofevtime + +DECLARE_SOA_TABLE(TOFEvTime, "AOD", "TOFEvTime", //! Table of the TOF event time. One entry per track. + pidtofevtime::TOFEvTime, + pidtofevtime::TOFEvTimeErr); + namespace pidtof { // Expected signals @@ -397,69 +457,15 @@ DECLARE_SOA_TABLE(pidTOFHe, "AOD", "pidTOFHe", //! Table of the TOF response wit DECLARE_SOA_TABLE(pidTOFAl, "AOD", "pidTOFAl", //! Table of the TOF response with binned Nsigma for alpha pidtof_tiny::TOFNSigmaStoreAl, pidtof_tiny::TOFNSigmaAl); -// Extra tables -namespace pidflags -{ - -namespace enums -{ -enum PIDFlags : uint8_t { - EvTimeUndef = 0x0, // Event collision not set, corresponding to the LHC Fill event time - EvTimeTOF = 0x1, // Event collision time from TOF - EvTimeT0AC = 0x2, // Event collision time from the FT0AC - EvTimeTOFT0AC = 0x4 // Event collision time from the TOF and FT0AC -}; -} - -DECLARE_SOA_COLUMN(GoodTOFMatch, goodTOFMatch, bool); //! Bool for the TOF PID information on the single track information -DECLARE_SOA_COLUMN(TOFFlags, tofFlags, uint8_t); //! Flag for the complementary TOF PID information for the event time -DECLARE_SOA_DYNAMIC_COLUMN(IsEvTimeDefined, isEvTimeDefined, //! True if the Event Time was computed with any method i.e. there is a usable event time - [](uint8_t flags) -> bool { return (flags > 0); }); -DECLARE_SOA_DYNAMIC_COLUMN(IsEvTimeTOF, isEvTimeTOF, //! True if the Event Time was computed with the TOF - [](uint8_t flags) -> bool { return (flags & enums::PIDFlags::EvTimeTOF) == enums::PIDFlags::EvTimeTOF; }); -DECLARE_SOA_DYNAMIC_COLUMN(IsEvTimeT0AC, isEvTimeT0AC, //! True if the Event Time was computed with the T0AC - [](uint8_t flags) -> bool { return (flags & enums::PIDFlags::EvTimeT0AC) == enums::PIDFlags::EvTimeT0AC; }); -DECLARE_SOA_DYNAMIC_COLUMN(IsEvTimeTOFT0AC, isEvTimeTOFT0AC, //! True if the Event Time was computed with the TOF and T0AC - [](uint8_t flags) -> bool { return (flags & enums::PIDFlags::EvTimeTOFT0AC) == enums::PIDFlags::EvTimeTOFT0AC; }); - -} // namespace pidflags - -DECLARE_SOA_TABLE(pidTOFFlags, "AOD", "pidTOFFlags", //! Table of the flags for TOF signal quality on the track level - pidflags::GoodTOFMatch); - -DECLARE_SOA_TABLE(pidEvTimeFlags, "AOD", "pidEvTimeFlags", //! Table of the PID flags for the event time tables - pidflags::TOFFlags, - pidflags::IsEvTimeDefined, - pidflags::IsEvTimeTOF, - pidflags::IsEvTimeT0AC, - pidflags::IsEvTimeTOFT0AC); - -namespace pidtofsignal -{ -DECLARE_SOA_COLUMN(TOFSignal, tofSignal, float); //! TOF signal from track time -DECLARE_SOA_DYNAMIC_COLUMN(EventCollisionTime, eventCollisionTime, //! Event collision time used for the track. Needs the TOF - [](float signal, float tMinusTexp, float texp) -> float { return texp + tMinusTexp - signal; }); - -} // namespace pidtofsignal - -DECLARE_SOA_TABLE(TOFSignal, "AOD", "TOFSignal", //! Table of the TOF signal - pidtofsignal::TOFSignal, - pidtofsignal::EventCollisionTime); - -namespace pidtofevtime -{ -DECLARE_SOA_COLUMN(TOFEvTime, tofEvTime, float); //! event time for TOF signal. Can be obtained via a combination of detectors e.g. TOF, FT0A, FT0C -DECLARE_SOA_COLUMN(TOFEvTimeErr, tofEvTimeErr, float); //! event time error for TOF. Can be obtained via a combination of detectors e.g. TOF, FT0A, FT0C -} // namespace pidtofevtime - -DECLARE_SOA_TABLE(TOFEvTime, "AOD", "TOFEvTime", //! Table of the TOF event time. One entry per track. - pidtofevtime::TOFEvTime, - pidtofevtime::TOFEvTimeErr); - namespace pidtofbeta { DECLARE_SOA_COLUMN(Beta, beta, float); //! TOF beta DECLARE_SOA_COLUMN(BetaError, betaerror, float); //! Uncertainty on the TOF beta +// Dynamic column, i.e. the future +DECLARE_SOA_DYNAMIC_COLUMN(TOFBetaImp, tofBeta, //! TOF Beta value + [](const float length, const float tofSignal, const float collisionTime) -> float { + return o2::pid::tof::Beta::GetBeta(length, tofSignal, collisionTime); + }); // DECLARE_SOA_COLUMN(ExpBetaEl, expbetael, float); //! Expected beta of electron DECLARE_SOA_COLUMN(ExpBetaElError, expbetaelerror, float); //! Expected uncertainty on the beta of electron @@ -469,14 +475,24 @@ DECLARE_SOA_DYNAMIC_COLUMN(DiffBetaEl, diffbetael, //! Difference be [](float beta, float expbetael) -> float { return beta - expbetael; }); } // namespace pidtofbeta +using TOFBeta = pidtofbeta::TOFBetaImp; + DECLARE_SOA_TABLE(pidTOFbeta, "AOD", "pidTOFbeta", //! Table of the TOF beta pidtofbeta::Beta, pidtofbeta::BetaError); namespace pidtofmass { DECLARE_SOA_COLUMN(TOFMass, mass, float); //! TOF mass +// Dynamic column, i.e. the future +DECLARE_SOA_DYNAMIC_COLUMN(TOFMassImp, tofMass, //! TOF Mass value + [](const float length, const float tofSignal, const float collisionTime, const float momentum) -> float { + const float beta = o2::pid::tof::Beta::GetBeta(length, tofSignal, collisionTime); + return o2::pid::tof::TOFMass::GetTOFMass(momentum, beta); + }); } // namespace pidtofmass +using TOFMass = pidtofmass::TOFMassImp; + DECLARE_SOA_TABLE(pidTOFmass, "AOD", "pidTOFmass", //! Table of the TOF mass pidtofmass::TOFMass); diff --git a/DPG/Tasks/AOTTrack/PID/TOF/CMakeLists.txt b/DPG/Tasks/AOTTrack/PID/TOF/CMakeLists.txt index f4f799d4f5b..87af80a68dd 100644 --- a/DPG/Tasks/AOTTrack/PID/TOF/CMakeLists.txt +++ b/DPG/Tasks/AOTTrack/PID/TOF/CMakeLists.txt @@ -20,6 +20,11 @@ o2physics_add_dpl_workflow(pid-tof-qa-beta PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(pid-tof-qa-beta-imp + SOURCES qaPIDTOFBetaImp.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(pid-tof-qa-mc SOURCES qaPIDTOFMC.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore diff --git a/DPG/Tasks/AOTTrack/PID/TOF/qaPIDTOFBetaImp.cxx b/DPG/Tasks/AOTTrack/PID/TOF/qaPIDTOFBetaImp.cxx new file mode 100644 index 00000000000..f503ab1d92d --- /dev/null +++ b/DPG/Tasks/AOTTrack/PID/TOF/qaPIDTOFBetaImp.cxx @@ -0,0 +1,426 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// +/// \file qaPIDTOFBetaImp.cxx +/// \author Nicolò Jacazio nicolo.jacazio@cern.ch +/// \brief Task to produce the TOF QA plots for Beta. Version using dynamic columns. Interim solution for test and benchmarking +/// + +#include "Framework/AnalysisTask.h" +#include "Framework/runDataProcessing.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/StaticFor.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/FT0Corrected.h" +#include "Common/TableProducer/PID/pidTOFBase.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +/// Task to produce the TOF Beta QA plots +struct tofPidBetaQaImp { + HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + + Configurable logAxis{"logAxis", 0, "Flag to use a log momentum axis"}; + Configurable nBinsP{"nBinsP", 400, "Number of bins for the momentum"}; + Configurable minP{"minP", 0.1f, "Minimum momentum in range"}; + Configurable maxP{"maxP", 5.f, "Maximum momentum in range"}; + Configurable applyEvSel{"applyEvSel", 2, "Flag to apply event selection cut: 0 -> no event selection, 1 -> Run 2 event selection, 2 -> Run 3 event selection"}; + Configurable trackSelection{"trackSelection", 1, "Track selection: 0 -> No Cut, 1 -> kGlobalTrack, 2 -> kGlobalTrackWoPtEta, 3 -> kGlobalTrackWoDCA, 4 -> kQualityTracks, 5 -> kInAcceptanceTracks"}; + Configurable splitTrdTracks{"splitTrdTracks", false, "Flag to fill histograms for tracks with TRD match"}; + Configurable splitSignalPerCharge{"splitSignalPerCharge", true, "Split the signal per charge (reduces memory footprint if off)"}; + Configurable splitSignalPerEvTime{"splitSignalPerEvTime", true, "Split the signal per event time (reduces memory footprint if off)"}; + Configurable lastTrdLayerForTrdMatch{"lastTrdLayerForTrdMatch", 5, "Last TRD layer to consider for TRD match"}; + + ConfigurableAxis tofMassBins{"tofMassBins", {1000, 0, 3.f}, "Binning in the TOF mass plot"}; + ConfigurableAxis tofBetaBins{"tofBetaBins", {4000, 0, 2.f}, "Binning in the TOF beta plot"}; + ConfigurableAxis trackLengthBins{"trackLengthBins", {100, 0, 1000.f}, "Binning in track length plot"}; + Configurable requireGoodMatchTracks{"requireGoodMatchTracks", false, "Require good match tracks"}; + Configurable mMaxTOFChi2{"maxTOFChi2", 3.f, "Maximum TOF Chi2"}; + Configurable mEtaWindow{"etaWindow", 0.8f, "Window in eta for tracks"}; + + void init(o2::framework::InitContext&) + { + const AxisSpec vtxZAxis{100, -20, 20, "Vtx_{z} (cm)"}; + const AxisSpec tofAxis{10000, 0, 2e6, "TOF Signal"}; + const AxisSpec betaAxis{tofBetaBins, "TOF #beta"}; + const AxisSpec massAxis{tofMassBins, "TOF mass (GeV/#it{c}^{2})"}; + const AxisSpec trdAxis{10, -0.5, 9.5, "Last TRD cluster"}; + const AxisSpec etaAxis{100, -2, 2, "#it{#eta}"}; + const AxisSpec colTimeAxis{100, -2000, 2000, "Collision time (ps)"}; + const AxisSpec lAxis{trackLengthBins, "Track length (cm)"}; + const AxisSpec tofChi2Axis{1000, 0, 20, "TOF residual (cm)"}; + const AxisSpec ptResoAxis{100, 0, 0.1, "#sigma_{#it{p}_{T}}"}; + const AxisSpec pAxisPosNeg{2 * nBinsP, -maxP, maxP, "signed #it{p} (GeV/#it{c})"}; + AxisSpec ptAxis{nBinsP, minP, maxP, "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec pAxis{nBinsP, minP, maxP, "#it{p} (GeV/#it{c})"}; + if (logAxis) { + ptAxis.makeLogarithmic(); + pAxis.makeLogarithmic(); + } + + // Event properties + histos.add("event/tofsignal", "", HistType::kTH2F, {pAxis, tofAxis}); + const AxisSpec chargeAxis{2, -2.f, 2.f, "Charge"}; + + // TOF mass + if (splitSignalPerCharge) { + histos.add("tofmass/inclusive", "", HistType::kTH3F, {pAxis, massAxis, chargeAxis}); + if (splitSignalPerEvTime) { + histos.add("tofmass/EvTimeTOF", "Ev. Time TOF", HistType::kTH3F, {pAxis, massAxis, chargeAxis}); + histos.add("tofmass/EvTimeTOFOnly", "Ev. Time TOF Only", HistType::kTH3F, {pAxis, massAxis, chargeAxis}); + histos.add("tofmass/EvTimeT0AC", "Ev. Time T0AC", HistType::kTH3F, {pAxis, massAxis, chargeAxis}); + histos.add("tofmass/EvTimeT0ACOnly", "Ev. Time T0AC Only", HistType::kTH3F, {pAxis, massAxis, chargeAxis}); + } + if (splitTrdTracks) { + histos.add("tofmass/trd/inclusive", "(hasTRD)", HistType::kTH3F, {pAxis, massAxis, chargeAxis}); + if (splitSignalPerEvTime) { + histos.add("tofmass/trd/EvTimeTOF", "Ev. Time TOF (hasTRD)", HistType::kTH3F, {pAxis, massAxis, chargeAxis}); + histos.add("tofmass/trd/EvTimeTOFOnly", "Ev. Time TOF Only (hasTRD)", HistType::kTH3F, {pAxis, massAxis, chargeAxis}); + histos.add("tofmass/trd/EvTimeT0AC", "Ev. Time T0AC (hasTRD)", HistType::kTH3F, {pAxis, massAxis, chargeAxis}); + histos.add("tofmass/trd/EvTimeT0ACOnly", "Ev. Time T0AC Only (hasTRD)", HistType::kTH3F, {pAxis, massAxis, chargeAxis}); + } + histos.add("tofmass/notrd/inclusive", "(hasTRD)", HistType::kTH3F, {pAxis, massAxis, chargeAxis}); + if (splitSignalPerEvTime) { + histos.add("tofmass/notrd/EvTimeTOF", "Ev. Time TOF (hasTRD)", HistType::kTH3F, {pAxis, massAxis, chargeAxis}); + histos.add("tofmass/notrd/EvTimeTOFOnly", "Ev. Time TOF Only (hasTRD)", HistType::kTH3F, {pAxis, massAxis, chargeAxis}); + histos.add("tofmass/notrd/EvTimeT0AC", "Ev. Time T0AC (hasTRD)", HistType::kTH3F, {pAxis, massAxis, chargeAxis}); + histos.add("tofmass/notrd/EvTimeT0ACOnly", "Ev. Time T0AC Only (hasTRD)", HistType::kTH3F, {pAxis, massAxis, chargeAxis}); + } + } + } else { + histos.add("tofmass/inclusive", "", HistType::kTH2F, {pAxis, massAxis}); + if (splitSignalPerEvTime) { + histos.add("tofmass/EvTimeTOF", "Ev. Time TOF", HistType::kTH2F, {pAxis, massAxis}); + histos.add("tofmass/EvTimeTOFOnly", "Ev. Time TOF Only", HistType::kTH2F, {pAxis, massAxis}); + histos.add("tofmass/EvTimeT0AC", "Ev. Time T0AC", HistType::kTH2F, {pAxis, massAxis}); + histos.add("tofmass/EvTimeT0ACOnly", "Ev. Time T0AC Only", HistType::kTH2F, {pAxis, massAxis}); + } + if (splitTrdTracks) { + histos.add("tofmass/trd/inclusive", "(hasTRD)", HistType::kTH2F, {pAxis, massAxis}); + if (splitSignalPerEvTime) { + histos.add("tofmass/trd/EvTimeTOF", "Ev. Time TOF (hasTRD)", HistType::kTH2F, {pAxis, massAxis}); + histos.add("tofmass/trd/EvTimeTOFOnly", "Ev. Time TOF Only (hasTRD)", HistType::kTH2F, {pAxis, massAxis}); + histos.add("tofmass/trd/EvTimeT0AC", "Ev. Time T0AC (hasTRD)", HistType::kTH2F, {pAxis, massAxis}); + histos.add("tofmass/trd/EvTimeT0ACOnly", "Ev. Time T0AC Only (hasTRD)", HistType::kTH2F, {pAxis, massAxis}); + } + histos.add("tofmass/notrd/inclusive", "(hasTRD)", HistType::kTH2F, {pAxis, massAxis}); + if (splitSignalPerEvTime) { + histos.add("tofmass/notrd/EvTimeTOF", "Ev. Time TOF (hasTRD)", HistType::kTH2F, {pAxis, massAxis}); + histos.add("tofmass/notrd/EvTimeTOFOnly", "Ev. Time TOF Only (hasTRD)", HistType::kTH2F, {pAxis, massAxis}); + histos.add("tofmass/notrd/EvTimeT0AC", "Ev. Time T0AC (hasTRD)", HistType::kTH2F, {pAxis, massAxis}); + histos.add("tofmass/notrd/EvTimeT0ACOnly", "Ev. Time T0AC Only (hasTRD)", HistType::kTH2F, {pAxis, massAxis}); + } + } + } + + // TOF beta + if (splitSignalPerCharge) { + histos.add("tofbeta/inclusive", "", HistType::kTH3F, {pAxis, betaAxis, chargeAxis}); + if (splitSignalPerEvTime) { + histos.add("tofbeta/EvTimeTOF", "Ev. Time TOF", HistType::kTH3F, {pAxis, betaAxis, chargeAxis}); + histos.add("tofbeta/EvTimeTOFOnly", "Ev. Time TOF Only", HistType::kTH3F, {pAxis, betaAxis, chargeAxis}); + histos.add("tofbeta/EvTimeT0AC", "Ev. Time T0AC", HistType::kTH3F, {pAxis, betaAxis, chargeAxis}); + histos.add("tofbeta/EvTimeT0ACOnly", "Ev. Time T0AC Only", HistType::kTH3F, {pAxis, betaAxis, chargeAxis}); + } + if (splitTrdTracks) { + histos.add("tofbeta/trd/inclusive", "(hasTRD)", HistType::kTH3F, {pAxis, betaAxis, chargeAxis}); + if (splitSignalPerEvTime) { + histos.add("tofbeta/trd/EvTimeTOF", "Ev. Time TOF (hasTRD)", HistType::kTH3F, {pAxis, betaAxis, chargeAxis}); + histos.add("tofbeta/trd/EvTimeTOFOnly", "Ev. Time TOF Only (hasTRD)", HistType::kTH3F, {pAxis, betaAxis, chargeAxis}); + histos.add("tofbeta/trd/EvTimeT0AC", "Ev. Time T0AC (hasTRD)", HistType::kTH3F, {pAxis, betaAxis, chargeAxis}); + histos.add("tofbeta/trd/EvTimeT0ACOnly", "Ev. Time T0AC Only (hasTRD)", HistType::kTH3F, {pAxis, betaAxis, chargeAxis}); + } + histos.add("tofbeta/notrd/inclusive", "(hasTRD)", HistType::kTH3F, {pAxis, betaAxis, chargeAxis}); + if (splitSignalPerEvTime) { + histos.add("tofbeta/notrd/EvTimeTOF", "Ev. Time TOF (hasTRD)", HistType::kTH3F, {pAxis, betaAxis, chargeAxis}); + histos.add("tofbeta/notrd/EvTimeTOFOnly", "Ev. Time TOF Only (hasTRD)", HistType::kTH3F, {pAxis, betaAxis, chargeAxis}); + histos.add("tofbeta/notrd/EvTimeT0AC", "Ev. Time T0AC (hasTRD)", HistType::kTH3F, {pAxis, betaAxis, chargeAxis}); + histos.add("tofbeta/notrd/EvTimeT0ACOnly", "Ev. Time T0AC Only (hasTRD)", HistType::kTH3F, {pAxis, betaAxis, chargeAxis}); + } + } + } else { + histos.add("tofbeta/inclusive", "", HistType::kTH2F, {pAxisPosNeg, betaAxis}); + if (splitSignalPerEvTime) { + histos.add("tofbeta/EvTimeTOF", "Ev. Time TOF", HistType::kTH2F, {pAxisPosNeg, betaAxis}); + histos.add("tofbeta/EvTimeTOFOnly", "Ev. Time TOF Only", HistType::kTH2F, {pAxisPosNeg, betaAxis}); + histos.add("tofbeta/EvTimeT0AC", "Ev. Time T0AC", HistType::kTH2F, {pAxisPosNeg, betaAxis}); + histos.add("tofbeta/EvTimeT0ACOnly", "Ev. Time T0AC Only", HistType::kTH2F, {pAxisPosNeg, betaAxis}); + } + if (splitTrdTracks) { + histos.add("tofbeta/trd/inclusive", "(hasTRD)", HistType::kTH2F, {pAxisPosNeg, betaAxis}); + if (splitSignalPerEvTime) { + histos.add("tofbeta/trd/EvTimeTOF", "Ev. Time TOF (hasTRD)", HistType::kTH2F, {pAxisPosNeg, betaAxis}); + histos.add("tofbeta/trd/EvTimeTOFOnly", "Ev. Time TOF Only (hasTRD)", HistType::kTH2F, {pAxisPosNeg, betaAxis}); + histos.add("tofbeta/trd/EvTimeT0AC", "Ev. Time T0AC (hasTRD)", HistType::kTH2F, {pAxisPosNeg, betaAxis}); + histos.add("tofbeta/trd/EvTimeT0ACOnly", "Ev. Time T0AC Only (hasTRD)", HistType::kTH2F, {pAxisPosNeg, betaAxis}); + } + histos.add("tofbeta/notrd/inclusive", "(hasTRD)", HistType::kTH2F, {pAxisPosNeg, betaAxis}); + if (splitSignalPerEvTime) { + histos.add("tofbeta/notrd/EvTimeTOF", "Ev. Time TOF (hasTRD)", HistType::kTH2F, {pAxisPosNeg, betaAxis}); + histos.add("tofbeta/notrd/EvTimeTOFOnly", "Ev. Time TOF Only (hasTRD)", HistType::kTH2F, {pAxisPosNeg, betaAxis}); + histos.add("tofbeta/notrd/EvTimeT0AC", "Ev. Time T0AC (hasTRD)", HistType::kTH2F, {pAxisPosNeg, betaAxis}); + histos.add("tofbeta/notrd/EvTimeT0ACOnly", "Ev. Time T0AC Only (hasTRD)", HistType::kTH2F, {pAxisPosNeg, betaAxis}); + } + } + } + + histos.add("event/tofchi2", "", HistType::kTH1F, {tofChi2Axis}); + histos.add("event/eta", "", HistType::kTH1F, {etaAxis}); + histos.add("event/length", "", HistType::kTH1F, {lAxis}); + if (splitTrdTracks) { + histos.add("event/trd/length", "", HistType::kTH2F, {lAxis, trdAxis}); + histos.add("event/notrd/length", "", HistType::kTH1F, {lAxis}); + } + histos.add("event/pt", "", HistType::kTH1F, {ptAxis}); + histos.add("event/p", "", HistType::kTH1F, {pAxis}); + auto h = histos.add("event/evsel", "", kTH1F, {{10, 0.5, 10.5, "Ev. Sel."}}); + h->GetXaxis()->SetBinLabel(1, "Events read"); + h->GetXaxis()->SetBinLabel(2, "Passed ev. sel."); + h->GetXaxis()->SetBinLabel(3, "Passed vtx Z"); + + h = histos.add("event/trackselection", "", kTH1F, {{10, 0.5, 10.5, "Selection passed"}}); + h->GetXaxis()->SetBinLabel(1, "Tracks read"); + h->GetXaxis()->SetBinLabel(2, "hasTOF"); + h->GetXaxis()->SetBinLabel(3, "isGlobalTrack"); + h->GetXaxis()->SetBinLabel(4, TString::Format("TOF chi2 < %.2f", mMaxTOFChi2.value)); + } + + Filter eventFilter = (applyEvSel.node() == 0) || + ((applyEvSel.node() == 1) && (o2::aod::evsel::sel7 == true)) || + ((applyEvSel.node() == 2) && (o2::aod::evsel::sel8 == true)); + Filter trackFilter = (trackSelection.node() == 0) || + ((trackSelection.node() == 1) && requireGlobalTrackInFilter()) || + ((trackSelection.node() == 2) && requireGlobalTrackWoPtEtaInFilter()) || + ((trackSelection.node() == 3) && requireGlobalTrackWoDCAInFilter()) || + ((trackSelection.node() == 4) && requireQualityTracksInFilter()) || + ((trackSelection.node() == 5) && requireInAcceptanceTracksInFilter()); + Filter etaFilter = (nabs(o2::aod::track::eta) < mEtaWindow); + + using CollisionCandidate = soa::Filtered>::iterator; + using TrackCandidates = soa::Join; + void process(CollisionCandidate const& collision, + soa::Filtered const& tracks) + { + + auto tracksWithPid = soa::Attach, aod::TOFMass, aod::TOFBeta>(tracks); + histos.fill(HIST("event/evsel"), 1); + if (applyEvSel == 1) { + if (!collision.sel7()) { + return; + } + } else if (applyEvSel == 2) { + if (!collision.sel8()) { + return; + } + } + + histos.fill(HIST("event/evsel"), 2); + + if (std::abs(collision.posZ()) > 10.f) { + return; + } + + histos.fill(HIST("event/evsel"), 3); + for (auto const& t : tracks) { + auto track = tracksWithPid.iteratorAt(t.globalIndex() - tracksWithPid.iteratorAt(0).globalIndex()); + // Check consistency + if (track.hasTOF() != t.hasTOF()) { + LOG(fatal) << "Mismatch in TOF availability!"; + } + if (track.pt() != t.pt()) { + LOG(fatal) << "Mismatch in pt!"; + } + histos.fill(HIST("event/trackselection"), 1.f); + if (!track.hasTOF()) { // Skipping tracks without TOF + continue; + } + histos.fill(HIST("event/trackselection"), 2.f); + if (!track.isGlobalTrack()) { + continue; + } + histos.fill(HIST("event/trackselection"), 3.f); + if (track.tofChi2() > mMaxTOFChi2) { // Skipping tracks with large Chi2 + continue; + } + histos.fill(HIST("event/trackselection"), 4.f); + const float tofMass = track.tofMass(); + const float tofBeta = track.tofBeta(); + if (splitSignalPerCharge) { + histos.fill(HIST("tofmass/inclusive"), track.p(), tofMass, track.sign()); + histos.fill(HIST("tofbeta/inclusive"), track.p(), tofBeta, track.sign()); + if (splitSignalPerEvTime) { + if (track.isEvTimeTOF()) { + histos.fill(HIST("tofmass/EvTimeTOF"), track.p(), tofMass, track.sign()); + histos.fill(HIST("tofbeta/EvTimeTOF"), track.p(), tofBeta, track.sign()); + } + if (track.isEvTimeTOF() && !track.isEvTimeT0AC()) { + histos.fill(HIST("tofmass/EvTimeTOFOnly"), track.p(), tofMass, track.sign()); + histos.fill(HIST("tofbeta/EvTimeTOFOnly"), track.p(), tofBeta, track.sign()); + } + if (track.isEvTimeT0AC()) { + histos.fill(HIST("tofmass/EvTimeT0AC"), track.p(), tofMass, track.sign()); + histos.fill(HIST("tofbeta/EvTimeT0AC"), track.p(), tofBeta, track.sign()); + } + if (track.isEvTimeT0AC() && !track.isEvTimeTOF()) { + histos.fill(HIST("tofmass/EvTimeT0ACOnly"), track.p(), tofMass, track.sign()); + histos.fill(HIST("tofbeta/EvTimeT0ACOnly"), track.p(), tofBeta, track.sign()); + } + } + } else { + histos.fill(HIST("tofmass/inclusive"), track.p(), tofMass); + histos.fill(HIST("tofbeta/inclusive"), track.p(), tofBeta); + if (splitSignalPerEvTime) { + if (track.isEvTimeTOF()) { + histos.fill(HIST("tofmass/EvTimeTOF"), track.p(), tofMass); + histos.fill(HIST("tofbeta/EvTimeTOF"), track.p(), tofBeta); + } + if (track.isEvTimeTOF() && !track.isEvTimeT0AC()) { + histos.fill(HIST("tofmass/EvTimeTOFOnly"), track.p(), tofMass); + histos.fill(HIST("tofbeta/EvTimeTOFOnly"), track.p(), tofBeta); + } + if (track.isEvTimeT0AC()) { + histos.fill(HIST("tofmass/EvTimeT0AC"), track.p(), tofMass); + histos.fill(HIST("tofbeta/EvTimeT0AC"), track.p(), tofBeta); + } + if (track.isEvTimeT0AC() && !track.isEvTimeTOF()) { + histos.fill(HIST("tofmass/EvTimeT0ACOnly"), track.p(), tofMass); + histos.fill(HIST("tofbeta/EvTimeT0ACOnly"), track.p(), tofBeta); + } + } + } + histos.fill(HIST("event/length"), track.length()); + histos.fill(HIST("event/tofchi2"), track.tofChi2()); + histos.fill(HIST("event/eta"), track.eta()); + histos.fill(HIST("event/tofsignal"), track.p(), track.tofSignal()); + histos.fill(HIST("event/pt"), track.pt()); + histos.fill(HIST("event/p"), track.p()); + + if (!splitTrdTracks) { // If splitting of TRD tracks is not enabled, skip + continue; + } + + if (!track.hasTRD()) { + histos.fill(HIST("event/notrd/length"), track.length()); + if (splitSignalPerCharge) { + histos.fill(HIST("tofmass/notrd/inclusive"), track.p(), tofMass, track.sign()); + histos.fill(HIST("tofbeta/notrd/inclusive"), track.p(), tofBeta, track.sign()); + if (splitSignalPerEvTime) { + if (track.isEvTimeTOF()) { + histos.fill(HIST("tofmass/notrd/EvTimeTOF"), track.p(), tofMass, track.sign()); + histos.fill(HIST("tofbeta/notrd/EvTimeTOF"), track.p(), tofBeta, track.sign()); + } + if (track.isEvTimeTOF() && !track.isEvTimeT0AC()) { + histos.fill(HIST("tofmass/notrd/EvTimeTOFOnly"), track.p(), tofMass, track.sign()); + histos.fill(HIST("tofbeta/notrd/EvTimeTOFOnly"), track.p(), tofBeta, track.sign()); + } + if (track.isEvTimeT0AC()) { + histos.fill(HIST("tofmass/notrd/EvTimeT0AC"), track.p(), tofMass, track.sign()); + histos.fill(HIST("tofbeta/notrd/EvTimeT0AC"), track.p(), tofBeta, track.sign()); + } + if (track.isEvTimeT0AC() && !track.isEvTimeTOF()) { + histos.fill(HIST("tofmass/notrd/EvTimeT0ACOnly"), track.p(), tofMass, track.sign()); + histos.fill(HIST("tofbeta/notrd/EvTimeT0ACOnly"), track.p(), tofBeta, track.sign()); + } + } + } else { + const float signedp = track.p() * track.sign(); + histos.fill(HIST("tofmass/notrd/inclusive"), signedp, tofMass); + histos.fill(HIST("tofbeta/notrd/inclusive"), signedp, tofBeta); + if (splitSignalPerEvTime) { + if (track.isEvTimeTOF()) { + histos.fill(HIST("tofmass/notrd/EvTimeTOF"), signedp, tofMass); + histos.fill(HIST("tofbeta/notrd/EvTimeTOF"), signedp, tofBeta); + } + if (track.isEvTimeTOF() && !track.isEvTimeT0AC()) { + histos.fill(HIST("tofmass/notrd/EvTimeTOFOnly"), signedp, tofMass); + histos.fill(HIST("tofbeta/notrd/EvTimeTOFOnly"), signedp, tofBeta); + } + if (track.isEvTimeT0AC()) { + histos.fill(HIST("tofmass/notrd/EvTimeT0AC"), signedp, tofMass); + histos.fill(HIST("tofbeta/notrd/EvTimeT0AC"), signedp, tofBeta); + } + if (track.isEvTimeT0AC() && !track.isEvTimeTOF()) { + histos.fill(HIST("tofmass/notrd/EvTimeT0ACOnly"), signedp, tofMass); + histos.fill(HIST("tofbeta/notrd/EvTimeT0ACOnly"), signedp, tofBeta); + } + } + } + } else { + + int lastLayer = 0; + for (int l = 7; l >= 0; l--) { + if (track.trdPattern() & (1 << l)) { + lastLayer = l; + break; + } + } + + histos.fill(HIST("event/trd/length"), track.length(), lastLayer); + if (lastLayer < lastTrdLayerForTrdMatch) { + continue; + } + if (splitSignalPerCharge) { + histos.fill(HIST("tofmass/trd/inclusive"), track.p(), tofMass, track.sign()); + histos.fill(HIST("tofbeta/trd/inclusive"), track.p(), tofBeta, track.sign()); + if (splitSignalPerEvTime) { + if (track.isEvTimeTOF()) { + histos.fill(HIST("tofmass/trd/EvTimeTOF"), track.p(), tofMass, track.sign()); + histos.fill(HIST("tofbeta/trd/EvTimeTOF"), track.p(), tofBeta, track.sign()); + } + if (track.isEvTimeTOF() && !track.isEvTimeT0AC()) { + histos.fill(HIST("tofmass/trd/EvTimeTOFOnly"), track.p(), tofMass, track.sign()); + histos.fill(HIST("tofbeta/trd/EvTimeTOFOnly"), track.p(), tofBeta, track.sign()); + } + if (track.isEvTimeT0AC()) { + histos.fill(HIST("tofmass/trd/EvTimeT0AC"), track.p(), tofMass, track.sign()); + histos.fill(HIST("tofbeta/trd/EvTimeT0AC"), track.p(), tofBeta, track.sign()); + } + if (track.isEvTimeT0AC() && !track.isEvTimeTOF()) { + histos.fill(HIST("tofmass/trd/EvTimeT0ACOnly"), track.p(), tofMass, track.sign()); + histos.fill(HIST("tofbeta/trd/EvTimeT0ACOnly"), track.p(), tofBeta, track.sign()); + } + } + } else { + const float signedp = track.p() * track.sign(); + histos.fill(HIST("tofmass/trd/inclusive"), signedp, tofMass); + histos.fill(HIST("tofbeta/trd/inclusive"), signedp, tofBeta); + if (splitSignalPerEvTime) { + if (track.isEvTimeTOF()) { + histos.fill(HIST("tofmass/trd/EvTimeTOF"), signedp, tofMass); + histos.fill(HIST("tofbeta/trd/EvTimeTOF"), signedp, tofBeta); + } + if (track.isEvTimeTOF() && !track.isEvTimeT0AC()) { + histos.fill(HIST("tofmass/trd/EvTimeTOFOnly"), signedp, tofMass); + histos.fill(HIST("tofbeta/trd/EvTimeTOFOnly"), signedp, tofBeta); + } + if (track.isEvTimeT0AC()) { + histos.fill(HIST("tofmass/trd/EvTimeT0AC"), signedp, tofMass); + histos.fill(HIST("tofbeta/trd/EvTimeT0AC"), signedp, tofBeta); + } + if (track.isEvTimeT0AC() && !track.isEvTimeTOF()) { + histos.fill(HIST("tofmass/trd/EvTimeT0ACOnly"), signedp, tofMass); + histos.fill(HIST("tofbeta/trd/EvTimeT0ACOnly"), signedp, tofBeta); + } + } + } + } + } + } +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From 3ef91c4620c26ac50f774171dec848d0821bbf5e Mon Sep 17 00:00:00 2001 From: Francesco Mazzaschi <43742195+fmazzasc@users.noreply.github.com> Date: Thu, 8 May 2025 11:23:13 +0200 Subject: [PATCH 1217/1650] [PWGLF] Add MC PV information (#11126) Co-authored-by: Francesco Mazzaschi --- PWGLF/DataModel/LFNonPromptCascadeTables.h | 9 +++++++++ PWGLF/Tasks/Strangeness/nonPromptCascade.cxx | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/PWGLF/DataModel/LFNonPromptCascadeTables.h b/PWGLF/DataModel/LFNonPromptCascadeTables.h index d8e8a67d40b..687d698a529 100644 --- a/PWGLF/DataModel/LFNonPromptCascadeTables.h +++ b/PWGLF/DataModel/LFNonPromptCascadeTables.h @@ -101,6 +101,9 @@ DECLARE_SOA_COLUMN(BachPionTOFNSigma, bachPionTOFNSigma, float); DECLARE_SOA_COLUMN(gPt, genPt, float); DECLARE_SOA_COLUMN(gEta, genEta, float); DECLARE_SOA_COLUMN(gPhi, genPhi, float); +DECLARE_SOA_COLUMN(gVx, genVx, float); +DECLARE_SOA_COLUMN(gVy, genVy, float); +DECLARE_SOA_COLUMN(gVz, genVz, float); DECLARE_SOA_COLUMN(PDGcode, pdgCode, int); DECLARE_SOA_COLUMN(DCAxMC, dcaXmc, float); DECLARE_SOA_COLUMN(DCAyMC, dcaYmc, float); @@ -302,6 +305,9 @@ DECLARE_SOA_TABLE(NPCascTableMC, "AOD", "NPCASCTABLEMC", NPCascadeTable::gPt, NPCascadeTable::gEta, NPCascadeTable::gPhi, + NPCascadeTable::gVx, + NPCascadeTable::gVy, + NPCascadeTable::gVz, NPCascadeTable::PDGcode, NPCascadeTable::DCAxMC, NPCascadeTable::DCAyMC, @@ -378,6 +384,9 @@ DECLARE_SOA_TABLE(NPCascTableMCNT, "AOD", "NPCASCTABLEMCNT", NPCascadeTable::gPt, NPCascadeTable::gEta, NPCascadeTable::gPhi, + NPCascadeTable::gVx, + NPCascadeTable::gVy, + NPCascadeTable::gVz, NPCascadeTable::PDGcode, NPCascadeTable::DCAxMC, NPCascadeTable::DCAyMC, diff --git a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx index 0bc1c53bdb4..6c1ea1f39f6 100644 --- a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx +++ b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx @@ -527,7 +527,8 @@ struct NonPromptCascadeTask { c.pionTPCNSigma, c.bachKaonTPCNSigma, c.bachPionTPCNSigma, c.protonHasTOF, c.pionHasTOF, c.bachHasTOF, c.protonTOFNSigma, c.pionTOFNSigma, c.bachKaonTOFNSigma, c.bachPionTOFNSigma, c.sel8, c.multFT0C, c.multFT0A, - particle.pt(), particle.eta(), particle.phi(), particle.pdgCode(), mcCollision.posX() - particle.vx(), mcCollision.posY() - particle.vy(), + particle.pt(), particle.eta(), particle.phi(), mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), + particle.pdgCode(), mcCollision.posX() - particle.vx(), mcCollision.posY() - particle.vy(), mcCollision.posZ() - particle.vz(), mcCollision.globalIndex() == recCollision.mcCollisionId(), c.hasFakeReassociation, motherDecayDaughters); } } From 0fe51b08d558b5d9eec7790329ab1c3b52cb38ec Mon Sep 17 00:00:00 2001 From: YazhenLin Date: Thu, 8 May 2025 18:25:30 +0800 Subject: [PATCH 1218/1650] [PWGLF] add Pb-Pb collisions in PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx (#11113) --- .../Strangeness/hStrangeCorrelationFilter.cxx | 591 ++++++++++++++---- .../Tasks/Strangeness/hStrangeCorrelation.cxx | 451 +++++++++++-- 2 files changed, 851 insertions(+), 191 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx b/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx index 5d35e12e798..ea9de06b89f 100644 --- a/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx +++ b/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx @@ -31,6 +31,7 @@ #include "CCDB/BasicCCDBManager.h" #include "TF1.h" #include "string" +#include #include "EventFiltering/Zorro.h" #include "EventFiltering/ZorroSummary.h" @@ -44,16 +45,25 @@ using namespace o2::framework::expressions; #define BIT_CHECK(var, nbit) ((var) & (1 << (nbit))) struct HStrangeCorrelationFilter { + const float ctauxiPDG = 4.91; // from PDG + const float ctauomegaPDG = 2.461; // from PDG + Service ccdb; HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + // master analysis switches + Configurable doPPAnalysis{"doPPAnalysis", true, "if in pp, set to true"}; // Operational Configurable fillTableOnlyWithCompatible{"fillTableOnlyWithCompatible", true, "pre-apply dE/dx, broad mass window in table filling"}; Configurable strangedEdxNSigmaLoose{"strangedEdxNSigmaLoose", 5, "Nsigmas for strange decay daughters"}; Configurable strangedEdxNSigma{"strangedEdxNSigma", 4, "Nsigmas for strange decay daughters"}; Configurable strangedEdxNSigmaTight{"strangedEdxNSigmaTight", 3, "Nsigmas for strange decay daughters"}; + // used for event selections in Pb-Pb + Configurable cfgCutOccupancyHigh{"cfgCutOccupancyHigh", 3000, "High cut on TPC occupancy"}; + Configurable cfgCutOccupancyLow{"cfgCutOccupancyLow", 0, "Low cut on TPC occupancy"}; + // event filtering Configurable zorroMask{"zorroMask", "", "zorro trigger class to select on (empty: none)"}; @@ -88,6 +98,17 @@ struct HStrangeCorrelationFilter { Configurable dcaPostopv{"dcaPostopv", 0.06, "DCA Pos To PV"}; Configurable v0RadiusMin{"v0RadiusMin", 0.5, "v0radius"}; Configurable v0RadiusMax{"v0RadiusMax", 200, "v0radius"}; + // more V0 selections in PbPb + Configurable lifetimecutK0S{"lifetimecutK0S", 20, "lifetimecutK0S"}; + Configurable lifetimecutLambda{"lifetimecutLambda", 30, "lifetimecutLambda"}; + Configurable dcanegtopvK0S{"dcanegtopvK0S", 0.1, "DCA Neg To PV"}; + Configurable dcapostopvK0S{"dcapostopvK0S", 0.1, "DCA Pos To PV"}; + Configurable dcanegtopvLambda{"dcanegtopvLambda", 0.05, "DCA Neg To PV"}; + Configurable dcapostopvLambda{"dcapostopvLambda", 0.2, "DCA Pos To PV"}; + Configurable dcanegtopvAntiLambda{"dcanegtopvAntiLambda", 0.2, "DCA Neg To PV"}; + Configurable dcapostopvAntiLambda{"dcapostopvAntiLambda", 0.05, "DCA Pos To PV"}; + // original equation: lArmPt*2>TMath::Abs(lArmAlpha) only for K0S + Configurable armPodCut{"armPodCut", 5.0f, "pT * (cut) > |alpha|, AP cut. Negative: no cut"}; // specific selections Configurable lambdaCospa{"lambdaCospa", 0.995, "CosPA for lambda"}; // allows for tighter selection for Lambda @@ -104,7 +125,31 @@ struct HStrangeCorrelationFilter { Configurable cascadeSettingCascradius{"cascadeSettingCascradius", 0.5, "cascadeSettingCascradius"}; Configurable cascadeSettingV0masswindow{"cascadeSettingV0masswindow", 0.01, "cascadeSettingV0masswindow"}; Configurable cascadeSettingMindcav0topv{"cascadeSettingMindcav0topv", 0.01, "cascadeSettingMindcav0topv"}; - + struct : ConfigurableGroup { + // cascade selections in PbPb + Configurable cascCospa{"cascCospa", 0.95, "cascCospa"}; + Configurable cascDcacascdau{"cascDcacascdau", 1.0, "cascDcacascdau"}; + Configurable cascDcabachtopv{"cascDcabachtopv", 0.1, "cascDcabachtopv"}; + Configurable cascRadius{"cascRadius", 0.5, "cascRadius"}; + Configurable cascV0masswindow{"cascV0masswindow", 0.01, "cascV0masswindow"}; + Configurable cascMindcav0topv{"cascMindcav0topv", 0.01, "cascMindcav0topv"}; + Configurable bachBaryonCosPA{"bachBaryonCosPA", 0.9999, "Bachelor baryon CosPA"}; + Configurable bachBaryonDCAxyToPV{"bachBaryonDCAxyToPV", 0.08, "DCA bachelor baryon to PV"}; + Configurable dcaBaryonToPV{"dcaBaryonToPV", 0.05, "DCA of baryon doughter track To PV"}; + Configurable dcaMesonToPV{"dcaMesonToPV", 0.1, "DCA of meson doughter track To PV"}; + Configurable dcaBachToPV{"dcaBachToPV", 0.07, "DCA Bach To PV"}; + Configurable cascdcaV0dau{"cascdcaV0dau", 0.5, "DCA V0 Daughters"}; + Configurable dcaCacsDauPar0{"dcaCacsDauPar0", 0.8, " par for pt dep DCA cascade daughter cut, p_T < 1 GeV/c"}; + Configurable dcaCacsDauPar1{"dcaCacsDauPar1", 0.5, " par for pt dep DCA cascade daughter cut, 1< p_T < 4 GeV/c"}; + Configurable dcaCacsDauPar2{"dcaCacsDauPar2", 0.2, " par for pt dep DCA cascade daughter cut, p_T > 4 GeV/c"}; + Configurable cascdcaV0ToPV{"cascdcaV0ToPV", 0.06, "DCA V0 To PV"}; + Configurable cascv0cospa{"cascv0cospa", 0.98, "V0 CosPA"}; + Configurable cascv0RadiusMin{"cascv0RadiusMin", 2.5, "v0radius"}; + Configurable proplifetime{"proplifetime", 3, "ctau/"}; + Configurable lambdaMassWin{"lambdaMassWin", 0.005, "V0 Mass window limit"}; + Configurable rejcomp{"rejcomp", 0.008, "Competing Cascade rejection"}; + Configurable rapCut{"rapCut", 0.8, "Rapidity acceptance"}; + } MorePbPbsystCuts; // invariant mass parametrizations Configurable> massParsK0Mean{"massParsK0Mean", {0.495, 0.000250, 0.0, 0.0}, "pars in [0]+[1]*x+[2]*std::exp(-[3]*x)"}; Configurable> massParsK0Width{"massParsK0Width", {0.00354, 0.000609, 0.0, 0.0}, "pars in [0]+[1]*x+[2]*std::exp(-[3]*x)"}; @@ -206,6 +251,28 @@ struct HStrangeCorrelationFilter { mRunNumber = bc.runNumber(); } + // more event selections in Pb-Pb + template + bool isCollisionSelectedPbPb(TCollision collision) + { + if (!collision.selection_bit(aod::evsel::kIsTriggerTVX)) /* FT0 vertex (acceptable FT0C-FT0A time difference) collisions */ + return false; + if (!collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) // cut time intervals with dead ITS staves + return false; + if (!collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) // removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference + return false; + auto occupancy = collision.trackOccupancyInTimeRange(); + if (occupancy < cfgCutOccupancyLow || occupancy > cfgCutOccupancyHigh) /* Below min occupancy and Above max occupancy*/ + return false; + if (!collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) // reject collisions close to Time Frame borders + return false; + if (!collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) // reject events affected by the ITS ROF border + return false; + if (!collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) // rejects collisions which are associated with the same "found-by-T0" bunch crossing + return false; + return true; + } + // reco-level trigger quality checks (N.B.: DCA is filtered, not selected) template bool isValidTrigger(TTrack track) @@ -306,6 +373,48 @@ struct HStrangeCorrelationFilter { return true; } + // cascadeselection in PbPb + template + bool CascadeSelectedPbPb(TCascade casc, float pvx, float pvy, float pvz) + { + // bachBaryonCosPA + if (casc.bachBaryonCosPA() < MorePbPbsystCuts.bachBaryonCosPA) + return false; + // bachBaryonDCAxyToPV + if (std::abs(casc.bachBaryonDCAxyToPV()) > MorePbPbsystCuts.bachBaryonDCAxyToPV) + return false; + // casccosPA + if (casc.casccosPA(pvx, pvy, pvz) < MorePbPbsystCuts.cascCospa) + return false; + // dcacascdaughters + float ptDepCut = MorePbPbsystCuts.dcaCacsDauPar0; + if (casc.pt() > 1 && casc.pt() < 4) + ptDepCut = MorePbPbsystCuts.dcaCacsDauPar1; + else if (casc.pt() > 4) + ptDepCut = MorePbPbsystCuts.dcaCacsDauPar2; + if (casc.dcacascdaughters() > ptDepCut) + return false; + // dcaV0daughters + if (casc.dcaV0daughters() > dcaV0dau) + return false; + // dcav0topv + if (std::abs(casc.dcav0topv(pvx, pvy, pvz)) < MorePbPbsystCuts.cascdcaV0ToPV) + return false; + // cascradius + if (casc.cascradius() < MorePbPbsystCuts.cascRadius) + return false; + // v0radius + if (casc.v0radius() < MorePbPbsystCuts.cascv0RadiusMin) + return false; + // v0cosPA + if (casc.v0cosPA(casc.x(), casc.y(), casc.z()) < MorePbPbsystCuts.cascv0cospa) + return false; + // lambdaMassWin + if (std::abs(casc.mLambda() - o2::constants::physics::MassLambda0) > MorePbPbsystCuts.lambdaMassWin) + return false; + return true; + } + // for real data processing void processTriggers(soa::Join::iterator const& collision, soa::Filtered const& tracks, aod::BCsWithTimestamps const&) { @@ -488,8 +597,9 @@ struct HStrangeCorrelationFilter { } } - void processV0s(soa::Join::iterator const& collision, DauTracks const&, soa::Filtered const& V0s, aod::BCsWithTimestamps const&) + void processV0s(soa::Join::iterator const& collision, DauTracks const&, soa::Filtered const& V0s, aod::BCsWithTimestamps const&) { + double cent = doPPAnalysis ? collision.centFT0M() : collision.centFT0C(); // Perform basic event selection if (!collision.sel8()) { return; @@ -506,6 +616,8 @@ struct HStrangeCorrelationFilter { return; } } + if (!doPPAnalysis || !isCollisionSelectedPbPb(collision)) + return; /// _________________________________________________ /// Populate table with associated V0s @@ -529,32 +641,75 @@ struct HStrangeCorrelationFilter { if (posdau.tpcNClsCrossedRows() < minTPCNCrossedRows) continue; - if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose) - BIT_SET(compatibleK0Short, 0); - if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigma) - BIT_SET(compatibleK0Short, 1); - if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaTight) - BIT_SET(compatibleK0Short, 2); - - if (std::abs(posdau.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose) - if (v0.v0cosPA() > lambdaCospa) - BIT_SET(compatibleLambda, 0); - if (std::abs(posdau.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigma) - if (v0.v0cosPA() > lambdaCospa) - BIT_SET(compatibleLambda, 1); - if (std::abs(posdau.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaTight) - if (v0.v0cosPA() > lambdaCospa) - BIT_SET(compatibleLambda, 2); - - if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(negdau.tpcNSigmaPr()) < strangedEdxNSigmaLoose) - if (v0.v0cosPA() > lambdaCospa) - BIT_SET(compatibleAntiLambda, 0); - if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(negdau.tpcNSigmaPr()) < strangedEdxNSigma) - if (v0.v0cosPA() > lambdaCospa) - BIT_SET(compatibleAntiLambda, 1); - if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(negdau.tpcNSigmaPr()) < strangedEdxNSigmaTight) - if (v0.v0cosPA() > lambdaCospa) - BIT_SET(compatibleAntiLambda, 2); + if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose) { + if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutK0S && + std::abs(v0.dcapostopv()) > dcapostopvK0S && std::abs(v0.dcanegtopv()) > dcanegtopvK0S && + v0.qtarm() * armPodCut > std::abs(v0.alpha()))) { + BIT_SET(compatibleK0Short, 0); + } + } + if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigma) { + if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutK0S && + std::abs(v0.dcapostopv()) > dcapostopvK0S && std::abs(v0.dcanegtopv()) > dcanegtopvK0S && + v0.qtarm() * armPodCut > std::abs(v0.alpha()))) { + BIT_SET(compatibleK0Short, 1); + } + } + if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaTight) { + if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutK0S && + std::abs(v0.dcapostopv()) > dcapostopvK0S && std::abs(v0.dcanegtopv()) > dcanegtopvK0S && + v0.qtarm() * armPodCut > std::abs(v0.alpha()))) { + BIT_SET(compatibleK0Short, 2); + } + } + if (std::abs(posdau.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose) { + if (doPPAnalysis && (v0.v0cosPA() > lambdaCospa)) { + if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutLambda && + std::abs(v0.dcapostopv()) > dcapostopvLambda && std::abs(v0.dcanegtopv()) > dcanegtopvLambda)) { + BIT_SET(compatibleLambda, 0); + } + } + } + if (std::abs(posdau.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigma) { + if (doPPAnalysis && (v0.v0cosPA() > lambdaCospa)) { + if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutLambda && + std::abs(v0.dcapostopv()) > dcapostopvLambda && std::abs(v0.dcanegtopv()) > dcanegtopvLambda)) { + BIT_SET(compatibleLambda, 1); + } + } + } + if (std::abs(posdau.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaTight) { + if (doPPAnalysis && (v0.v0cosPA() > lambdaCospa)) { + if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutLambda && + std::abs(v0.dcapostopv()) > dcapostopvLambda && std::abs(v0.dcanegtopv()) > dcanegtopvLambda)) { + BIT_SET(compatibleLambda, 2); + } + } + } + if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(negdau.tpcNSigmaPr()) < strangedEdxNSigmaLoose) { + if (doPPAnalysis && (v0.v0cosPA() > lambdaCospa)) { + if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutLambda && + std::abs(v0.dcapostopv()) > dcapostopvAntiLambda && std::abs(v0.dcanegtopv()) > dcanegtopvAntiLambda)) { + BIT_SET(compatibleAntiLambda, 0); + } + } + } + if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(negdau.tpcNSigmaPr()) < strangedEdxNSigma) { + if (doPPAnalysis && (v0.v0cosPA() > lambdaCospa)) { + if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutLambda && + std::abs(v0.dcapostopv()) > dcapostopvAntiLambda && std::abs(v0.dcanegtopv()) > dcanegtopvAntiLambda)) { + BIT_SET(compatibleAntiLambda, 1); + } + } + } + if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(negdau.tpcNSigmaPr()) < strangedEdxNSigmaTight) { + if (doPPAnalysis && (v0.v0cosPA() > lambdaCospa)) { + if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutLambda && + std::abs(v0.dcapostopv()) > dcapostopvAntiLambda && std::abs(v0.dcanegtopv()) > dcanegtopvAntiLambda)) { + BIT_SET(compatibleAntiLambda, 2); + } + } + } // simplified handling: calculate NSigma in mass here float massNSigmaK0Short = (v0.mK0Short() - fK0Mean->Eval(v0.pt())) / (fK0Width->Eval(v0.pt()) + 1e-6); @@ -562,11 +717,11 @@ struct HStrangeCorrelationFilter { float massNSigmaAntiLambda = (v0.mAntiLambda() - fLambdaMean->Eval(v0.pt())) / (fLambdaWidth->Eval(v0.pt()) + 1e-6); if (compatibleK0Short) - histos.fill(HIST("h3dMassK0Short"), v0.pt(), v0.mK0Short(), collision.centFT0M()); + histos.fill(HIST("h3dMassK0Short"), v0.pt(), v0.mK0Short(), cent); if (compatibleLambda) - histos.fill(HIST("h3dMassLambda"), v0.pt(), v0.mLambda(), collision.centFT0M()); + histos.fill(HIST("h3dMassLambda"), v0.pt(), v0.mLambda(), cent); if (compatibleAntiLambda) - histos.fill(HIST("h3dMassAntiLambda"), v0.pt(), v0.mAntiLambda(), collision.centFT0M()); + histos.fill(HIST("h3dMassAntiLambda"), v0.pt(), v0.mAntiLambda(), cent); if (!fillTableOnlyWithCompatible || ( // start major condition check @@ -582,8 +737,9 @@ struct HStrangeCorrelationFilter { } } - void processV0sMC(soa::Join::iterator const& collision, DauTracksMC const&, soa::Filtered const& V0s, aod::McParticles const&, aod::BCsWithTimestamps const&) + void processV0sMC(soa::Join::iterator const& collision, DauTracksMC const&, soa::Filtered const& V0s, aod::McParticles const&, aod::BCsWithTimestamps const&) { + double cent = doPPAnalysis ? collision.centFT0M() : collision.centFT0C(); // Perform basic event selection if (!collision.sel8()) { return; @@ -600,7 +756,8 @@ struct HStrangeCorrelationFilter { return; } } - + if (!doPPAnalysis || !isCollisionSelectedPbPb(collision)) + return; /// _________________________________________________ /// Populate table with associated V0s for (auto const& v0 : V0s) { @@ -623,32 +780,75 @@ struct HStrangeCorrelationFilter { if (posdau.tpcNClsCrossedRows() < minTPCNCrossedRows) continue; - if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose) - BIT_SET(compatibleK0Short, 0); - if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigma) - BIT_SET(compatibleK0Short, 1); - if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaTight) - BIT_SET(compatibleK0Short, 2); - - if (std::abs(posdau.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose) - if (v0.v0cosPA() > lambdaCospa) - BIT_SET(compatibleLambda, 0); - if (std::abs(posdau.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigma) - if (v0.v0cosPA() > lambdaCospa) - BIT_SET(compatibleLambda, 1); - if (std::abs(posdau.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaTight) - if (v0.v0cosPA() > lambdaCospa) - BIT_SET(compatibleLambda, 2); - - if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(negdau.tpcNSigmaPr()) < strangedEdxNSigmaLoose) - if (v0.v0cosPA() > lambdaCospa) - BIT_SET(compatibleAntiLambda, 0); - if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(negdau.tpcNSigmaPr()) < strangedEdxNSigma) - if (v0.v0cosPA() > lambdaCospa) - BIT_SET(compatibleAntiLambda, 1); - if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(negdau.tpcNSigmaPr()) < strangedEdxNSigmaTight) - if (v0.v0cosPA() > lambdaCospa) - BIT_SET(compatibleAntiLambda, 2); + if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose) { + if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutK0S && + std::abs(v0.dcapostopv()) > dcapostopvK0S && std::abs(v0.dcanegtopv()) > dcanegtopvK0S && + v0.qtarm() * armPodCut > std::abs(v0.alpha()))) { + BIT_SET(compatibleK0Short, 0); + } + } + if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigma) { + if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutK0S && + std::abs(v0.dcapostopv()) > dcapostopvK0S && std::abs(v0.dcanegtopv()) > dcanegtopvK0S && + v0.qtarm() * armPodCut > std::abs(v0.alpha()))) { + BIT_SET(compatibleK0Short, 1); + } + } + if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaTight) { + if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutK0S && + std::abs(v0.dcapostopv()) > dcapostopvK0S && std::abs(v0.dcanegtopv()) > dcanegtopvK0S && + v0.qtarm() * armPodCut > std::abs(v0.alpha()))) { + BIT_SET(compatibleK0Short, 2); + } + } + if (std::abs(posdau.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose) { + if (doPPAnalysis && (v0.v0cosPA() > lambdaCospa)) { + if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutLambda && + std::abs(v0.dcapostopv()) > dcapostopvLambda && std::abs(v0.dcanegtopv()) > dcanegtopvLambda)) { + BIT_SET(compatibleLambda, 0); + } + } + } + if (std::abs(posdau.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigma) { + if (doPPAnalysis && (v0.v0cosPA() > lambdaCospa)) { + if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutLambda && + std::abs(v0.dcapostopv()) > dcapostopvLambda && std::abs(v0.dcanegtopv()) > dcanegtopvLambda)) { + BIT_SET(compatibleLambda, 1); + } + } + } + if (std::abs(posdau.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaTight) { + if (doPPAnalysis && (v0.v0cosPA() > lambdaCospa)) { + if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutLambda && + std::abs(v0.dcapostopv()) > dcapostopvLambda && std::abs(v0.dcanegtopv()) > dcanegtopvLambda)) { + BIT_SET(compatibleLambda, 2); + } + } + } + if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(negdau.tpcNSigmaPr()) < strangedEdxNSigmaLoose) { + if (doPPAnalysis && (v0.v0cosPA() > lambdaCospa)) { + if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutLambda && + std::abs(v0.dcapostopv()) > dcapostopvAntiLambda && std::abs(v0.dcanegtopv()) > dcanegtopvAntiLambda)) { + BIT_SET(compatibleAntiLambda, 0); + } + } + } + if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(negdau.tpcNSigmaPr()) < strangedEdxNSigma) { + if (doPPAnalysis && (v0.v0cosPA() > lambdaCospa)) { + if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutLambda && + std::abs(v0.dcapostopv()) > dcapostopvAntiLambda && std::abs(v0.dcanegtopv()) > dcanegtopvAntiLambda)) { + BIT_SET(compatibleAntiLambda, 1); + } + } + } + if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(negdau.tpcNSigmaPr()) < strangedEdxNSigmaTight) { + if (doPPAnalysis && (v0.v0cosPA() > lambdaCospa)) { + if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutLambda && + std::abs(v0.dcapostopv()) > dcapostopvAntiLambda && std::abs(v0.dcanegtopv()) > dcanegtopvAntiLambda)) { + BIT_SET(compatibleAntiLambda, 2); + } + } + } // simplified handling: calculate NSigma in mass here float massNSigmaK0Short = (v0.mK0Short() - fK0Mean->Eval(v0.pt())) / (fK0Width->Eval(v0.pt()) + 1e-6); @@ -666,11 +866,11 @@ struct HStrangeCorrelationFilter { if (v0.pdgCode() == -3122) trueAntiLambda = true; if (compatibleK0Short && (!doTrueSelectionInMass || (trueK0Short && v0PhysicalPrimary))) - histos.fill(HIST("h3dMassK0Short"), v0.pt(), v0.mK0Short(), collision.centFT0M()); + histos.fill(HIST("h3dMassK0Short"), v0.pt(), v0.mK0Short(), cent); if (compatibleLambda && (!doTrueSelectionInMass || (trueLambda && v0PhysicalPrimary))) - histos.fill(HIST("h3dMassLambda"), v0.pt(), v0.mLambda(), collision.centFT0M()); + histos.fill(HIST("h3dMassLambda"), v0.pt(), v0.mLambda(), cent); if (compatibleAntiLambda && (!doTrueSelectionInMass || (trueAntiLambda && v0PhysicalPrimary))) - histos.fill(HIST("h3dMassAntiLambda"), v0.pt(), v0.mAntiLambda(), collision.centFT0M()); + histos.fill(HIST("h3dMassAntiLambda"), v0.pt(), v0.mAntiLambda(), cent); if (!fillTableOnlyWithCompatible || ( // start major condition check @@ -686,8 +886,9 @@ struct HStrangeCorrelationFilter { } } - void processCascades(soa::Join::iterator const& collision, DauTracks const&, soa::Filtered const& /*V0s*/, soa::Filtered const& Cascades, aod::BCsWithTimestamps const&) + void processCascades(soa::Join::iterator const& collision, DauTracks const&, soa::Filtered const& /*V0s*/, soa::Filtered const& Cascades, aod::BCsWithTimestamps const&) { + double cent = doPPAnalysis ? collision.centFT0M() : collision.centFT0C(); // Perform basic event selection if (!collision.sel8()) { return; @@ -704,6 +905,8 @@ struct HStrangeCorrelationFilter { return; } } + if (!doPPAnalysis || !isCollisionSelectedPbPb(collision)) + return; /// _________________________________________________ /// Step 3: Populate table with associated Cascades for (auto const& casc : Cascades) { @@ -724,52 +927,117 @@ struct HStrangeCorrelationFilter { continue; if (negTrackCast.tpcNClsCrossedRows() < minTPCNCrossedRows) continue; - + if (!doPPAnalysis || !CascadeSelectedPbPb(casc, collision.posX(), collision.posY(), collision.posZ())) + continue; // check dE/dx compatibility int compatibleXiMinus = 0; int compatibleXiPlus = 0; int compatibleOmegaMinus = 0; int compatibleOmegaPlus = 0; + float cascpos = std::hypot(casc.x() - collision.posX(), casc.y() - collision.posY(), casc.z() - collision.posZ()); + float cascptotmom = std::hypot(casc.px(), casc.py(), casc.pz()); + float ctauXi = o2::constants::physics::MassXiMinus * cascpos / ((cascptotmom + 1e-13) * ctauxiPDG); + float ctauOmega = o2::constants::physics::MassOmegaMinus * cascpos / ((cascptotmom + 1e-13) * ctauomegaPDG); + + if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && casc.sign() < 0) { + if (doPPAnalysis || (std::abs(casc.dcabachtopv()) > MorePbPbsystCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > MorePbPbsystCuts.dcaBaryonToPV && + std::abs(casc.dcanegtopv()) > MorePbPbsystCuts.dcaMesonToPV && std::abs(casc.mOmega() - o2::constants::physics::MassOmegaMinus) > MorePbPbsystCuts.rejcomp && + ctauXi < MorePbPbsystCuts.proplifetime && std::abs(casc.yXi()) < MorePbPbsystCuts.rapCut)) { + BIT_SET(compatibleXiMinus, 0); + } + } + if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && casc.sign() < 0) { + if (doPPAnalysis || (std::abs(casc.dcabachtopv()) > MorePbPbsystCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > MorePbPbsystCuts.dcaBaryonToPV && + std::abs(casc.dcanegtopv()) > MorePbPbsystCuts.dcaMesonToPV && std::abs(casc.mOmega() - o2::constants::physics::MassOmegaMinus) > MorePbPbsystCuts.rejcomp && + ctauXi < MorePbPbsystCuts.proplifetime && std::abs(casc.yXi()) < MorePbPbsystCuts.rapCut)) { + BIT_SET(compatibleXiMinus, 1); + } + } + if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && casc.sign() < 0) { + if (doPPAnalysis || (std::abs(casc.dcabachtopv()) > MorePbPbsystCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > MorePbPbsystCuts.dcaBaryonToPV && + std::abs(casc.dcanegtopv()) > MorePbPbsystCuts.dcaMesonToPV && std::abs(casc.mOmega() - o2::constants::physics::MassOmegaMinus) > MorePbPbsystCuts.rejcomp && + ctauXi < MorePbPbsystCuts.proplifetime && std::abs(casc.yXi()) < MorePbPbsystCuts.rapCut)) { + BIT_SET(compatibleXiMinus, 2); + } + } + + if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && casc.sign() > 0) { + if (doPPAnalysis || (std::abs(casc.dcabachtopv()) > MorePbPbsystCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > MorePbPbsystCuts.dcaBaryonToPV && + std::abs(casc.dcanegtopv()) > MorePbPbsystCuts.dcaMesonToPV && std::abs(casc.mOmega() - o2::constants::physics::MassOmegaMinus) > MorePbPbsystCuts.rejcomp && + ctauXi < MorePbPbsystCuts.proplifetime && std::abs(casc.yXi()) < MorePbPbsystCuts.rapCut)) { + BIT_SET(compatibleXiPlus, 0); + } + } + if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && casc.sign() > 0) { + if (doPPAnalysis || (std::abs(casc.dcabachtopv()) > MorePbPbsystCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > MorePbPbsystCuts.dcaBaryonToPV && + std::abs(casc.dcanegtopv()) > MorePbPbsystCuts.dcaMesonToPV && std::abs(casc.mOmega() - o2::constants::physics::MassOmegaMinus) > MorePbPbsystCuts.rejcomp && + ctauXi < MorePbPbsystCuts.proplifetime && std::abs(casc.yXi()) < MorePbPbsystCuts.rapCut)) { + BIT_SET(compatibleXiPlus, 1); + } + } + if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && casc.sign() > 0) { + if (doPPAnalysis || (std::abs(casc.dcabachtopv()) > MorePbPbsystCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > MorePbPbsystCuts.dcaBaryonToPV && + std::abs(casc.dcanegtopv()) > MorePbPbsystCuts.dcaMesonToPV && std::abs(casc.mOmega() - o2::constants::physics::MassOmegaMinus) > MorePbPbsystCuts.rejcomp && + ctauXi < MorePbPbsystCuts.proplifetime && std::abs(casc.yXi()) < MorePbPbsystCuts.rapCut)) { + BIT_SET(compatibleXiPlus, 2); + } + } - if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && casc.sign() < 0) - BIT_SET(compatibleXiMinus, 0); - if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && casc.sign() < 0) - BIT_SET(compatibleXiMinus, 1); - if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && casc.sign() < 0) - BIT_SET(compatibleXiMinus, 2); - - if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && casc.sign() > 0) - BIT_SET(compatibleXiPlus, 0); - if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && casc.sign() > 0) - BIT_SET(compatibleXiPlus, 1); - if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && casc.sign() > 0) - BIT_SET(compatibleXiPlus, 2); - - if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaLoose && casc.sign() < 0) - BIT_SET(compatibleOmegaMinus, 0); - if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigma && casc.sign() < 0) - BIT_SET(compatibleOmegaMinus, 1); - if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaTight && casc.sign() < 0) - BIT_SET(compatibleOmegaMinus, 2); - - if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaLoose && casc.sign() > 0) - BIT_SET(compatibleOmegaPlus, 0); - if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigma && casc.sign() > 0) - BIT_SET(compatibleOmegaPlus, 1); - if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaTight && casc.sign() > 0) - BIT_SET(compatibleOmegaPlus, 2); + if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaLoose && casc.sign() < 0) { + if (doPPAnalysis || (std::abs(casc.dcabachtopv()) > MorePbPbsystCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > MorePbPbsystCuts.dcaBaryonToPV && + std::abs(casc.dcanegtopv()) > MorePbPbsystCuts.dcaMesonToPV && std::abs(casc.mXi() - o2::constants::physics::MassXiMinus) > MorePbPbsystCuts.rejcomp && + ctauOmega < MorePbPbsystCuts.proplifetime && std::abs(casc.yOmega()) < MorePbPbsystCuts.rapCut)) { + BIT_SET(compatibleOmegaMinus, 0); + } + } + if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigma && casc.sign() < 0) { + if (doPPAnalysis || (std::abs(casc.dcabachtopv()) > MorePbPbsystCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > MorePbPbsystCuts.dcaBaryonToPV && + std::abs(casc.dcanegtopv()) > MorePbPbsystCuts.dcaMesonToPV && std::abs(casc.mXi() - o2::constants::physics::MassXiMinus) > MorePbPbsystCuts.rejcomp && + ctauOmega < MorePbPbsystCuts.proplifetime && std::abs(casc.yOmega()) < MorePbPbsystCuts.rapCut)) { + BIT_SET(compatibleOmegaMinus, 1); + } + } + if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaTight && casc.sign() < 0) { + if (doPPAnalysis || (std::abs(casc.dcabachtopv()) > MorePbPbsystCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > MorePbPbsystCuts.dcaBaryonToPV && + std::abs(casc.dcanegtopv()) > MorePbPbsystCuts.dcaMesonToPV && std::abs(casc.mXi() - o2::constants::physics::MassXiMinus) > MorePbPbsystCuts.rejcomp && + ctauOmega < MorePbPbsystCuts.proplifetime && std::abs(casc.yOmega()) < MorePbPbsystCuts.rapCut)) { + BIT_SET(compatibleOmegaMinus, 2); + } + } + + if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaLoose && casc.sign() > 0) { + if (doPPAnalysis || (std::abs(casc.dcabachtopv()) > MorePbPbsystCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > MorePbPbsystCuts.dcaMesonToPV && + std::abs(casc.dcanegtopv()) > MorePbPbsystCuts.dcaBaryonToPV && std::abs(casc.mXi() - o2::constants::physics::MassXiMinus) > MorePbPbsystCuts.rejcomp && + ctauOmega < MorePbPbsystCuts.proplifetime && std::abs(casc.yOmega()) < MorePbPbsystCuts.rapCut)) { + BIT_SET(compatibleOmegaPlus, 0); + } + } + if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigma && casc.sign() > 0) { + if (doPPAnalysis || (std::abs(casc.dcabachtopv()) > MorePbPbsystCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > MorePbPbsystCuts.dcaMesonToPV && + std::abs(casc.dcanegtopv()) > MorePbPbsystCuts.dcaBaryonToPV && std::abs(casc.mXi() - o2::constants::physics::MassXiMinus) > MorePbPbsystCuts.rejcomp && + ctauOmega < MorePbPbsystCuts.proplifetime && std::abs(casc.yOmega()) < MorePbPbsystCuts.rapCut)) { + BIT_SET(compatibleOmegaPlus, 1); + } + } + if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaTight && casc.sign() > 0) { + if (doPPAnalysis || (std::abs(casc.dcabachtopv()) > MorePbPbsystCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > MorePbPbsystCuts.dcaMesonToPV && + std::abs(casc.dcanegtopv()) > MorePbPbsystCuts.dcaBaryonToPV && std::abs(casc.mXi() - o2::constants::physics::MassXiMinus) > MorePbPbsystCuts.rejcomp && + ctauOmega < MorePbPbsystCuts.proplifetime && std::abs(casc.yOmega()) < MorePbPbsystCuts.rapCut)) { + BIT_SET(compatibleOmegaPlus, 2); + } + } float massNSigmaXi = (casc.mXi() - fXiMean->Eval(casc.pt())) / (fXiWidth->Eval(casc.pt()) + 1e-6); float massNSigmaOmega = (casc.mOmega() - fOmegaMean->Eval(casc.pt())) / (fOmegaWidth->Eval(casc.pt()) + 1e-6); if (compatibleXiMinus) - histos.fill(HIST("h3dMassXiMinus"), casc.pt(), casc.mXi(), collision.centFT0M()); + histos.fill(HIST("h3dMassXiMinus"), casc.pt(), casc.mXi(), cent); if (compatibleXiPlus) - histos.fill(HIST("h3dMassXiPlus"), casc.pt(), casc.mXi(), collision.centFT0M()); + histos.fill(HIST("h3dMassXiPlus"), casc.pt(), casc.mXi(), cent); if (compatibleOmegaMinus) - histos.fill(HIST("h3dMassOmegaMinus"), casc.pt(), casc.mOmega(), collision.centFT0M()); + histos.fill(HIST("h3dMassOmegaMinus"), casc.pt(), casc.mOmega(), cent); if (compatibleOmegaPlus) - histos.fill(HIST("h3dMassOmegaPlus"), casc.pt(), casc.mOmega(), collision.centFT0M()); + histos.fill(HIST("h3dMassOmegaPlus"), casc.pt(), casc.mOmega(), cent); if (!fillTableOnlyWithCompatible || ( // start major condition check @@ -784,8 +1052,9 @@ struct HStrangeCorrelationFilter { } } - void processCascadesMC(soa::Join::iterator const& collision, DauTracks const&, soa::Filtered const& /*V0s*/, soa::Filtered const& Cascades, aod::McParticles const&, aod::BCsWithTimestamps const&) + void processCascadesMC(soa::Join::iterator const& collision, DauTracks const&, soa::Filtered const& /*V0s*/, soa::Filtered const& Cascades, aod::McParticles const&, aod::BCsWithTimestamps const&) { + double cent = doPPAnalysis ? collision.centFT0M() : collision.centFT0C(); // Perform basic event selection if (!collision.sel8()) { return; @@ -802,6 +1071,8 @@ struct HStrangeCorrelationFilter { return; } } + if (!doPPAnalysis || !isCollisionSelectedPbPb(collision)) + return; /// _________________________________________________ /// Step 3: Populate table with associated Cascades for (auto const& casc : Cascades) { @@ -822,40 +1093,106 @@ struct HStrangeCorrelationFilter { continue; if (negTrackCast.tpcNClsCrossedRows() < minTPCNCrossedRows) continue; + if (!doPPAnalysis || !CascadeSelectedPbPb(casc, collision.posX(), collision.posY(), collision.posZ())) + continue; // check dE/dx compatibility int compatibleXiMinus = 0; int compatibleXiPlus = 0; int compatibleOmegaMinus = 0; int compatibleOmegaPlus = 0; + float cascpos = std::hypot(casc.x() - collision.posX(), casc.y() - collision.posY(), casc.z() - collision.posZ()); + float cascptotmom = std::hypot(casc.px(), casc.py(), casc.pz()); + float ctauXi = o2::constants::physics::MassXiMinus * cascpos / ((cascptotmom + 1e-13) * ctauxiPDG); + float ctauOmega = o2::constants::physics::MassOmegaMinus * cascpos / ((cascptotmom + 1e-13) * ctauomegaPDG); + + if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && casc.sign() < 0) { + if (doPPAnalysis || (std::abs(casc.dcabachtopv()) > MorePbPbsystCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > MorePbPbsystCuts.dcaBaryonToPV && + std::abs(casc.dcanegtopv()) > MorePbPbsystCuts.dcaMesonToPV && std::abs(casc.mOmega() - o2::constants::physics::MassOmegaMinus) > MorePbPbsystCuts.rejcomp && + ctauXi < MorePbPbsystCuts.proplifetime && std::abs(casc.yXi()) < MorePbPbsystCuts.rapCut)) { + BIT_SET(compatibleXiMinus, 0); + } + } + if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && casc.sign() < 0) { + if (doPPAnalysis || (std::abs(casc.dcabachtopv()) > MorePbPbsystCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > MorePbPbsystCuts.dcaBaryonToPV && + std::abs(casc.dcanegtopv()) > MorePbPbsystCuts.dcaMesonToPV && std::abs(casc.mOmega() - o2::constants::physics::MassOmegaMinus) > MorePbPbsystCuts.rejcomp && + ctauXi < MorePbPbsystCuts.proplifetime && std::abs(casc.yXi()) < MorePbPbsystCuts.rapCut)) { + BIT_SET(compatibleXiMinus, 1); + } + } + if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && casc.sign() < 0) { + if (doPPAnalysis || (std::abs(casc.dcabachtopv()) > MorePbPbsystCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > MorePbPbsystCuts.dcaBaryonToPV && + std::abs(casc.dcanegtopv()) > MorePbPbsystCuts.dcaMesonToPV && std::abs(casc.mOmega() - o2::constants::physics::MassOmegaMinus) > MorePbPbsystCuts.rejcomp && + ctauXi < MorePbPbsystCuts.proplifetime && std::abs(casc.yXi()) < MorePbPbsystCuts.rapCut)) { + BIT_SET(compatibleXiMinus, 2); + } + } + + if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && casc.sign() > 0) { + if (doPPAnalysis || (std::abs(casc.dcabachtopv()) > MorePbPbsystCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > MorePbPbsystCuts.dcaBaryonToPV && + std::abs(casc.dcanegtopv()) > MorePbPbsystCuts.dcaMesonToPV && std::abs(casc.mOmega() - o2::constants::physics::MassOmegaMinus) > MorePbPbsystCuts.rejcomp && + ctauXi < MorePbPbsystCuts.proplifetime && std::abs(casc.yXi()) < MorePbPbsystCuts.rapCut)) { + BIT_SET(compatibleXiPlus, 0); + } + } + if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && casc.sign() > 0) { + if (doPPAnalysis || (std::abs(casc.dcabachtopv()) > MorePbPbsystCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > MorePbPbsystCuts.dcaBaryonToPV && + std::abs(casc.dcanegtopv()) > MorePbPbsystCuts.dcaMesonToPV && std::abs(casc.mOmega() - o2::constants::physics::MassOmegaMinus) > MorePbPbsystCuts.rejcomp && + ctauXi < MorePbPbsystCuts.proplifetime && std::abs(casc.yXi()) < MorePbPbsystCuts.rapCut)) { + BIT_SET(compatibleXiPlus, 1); + } + } + if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && casc.sign() > 0) { + if (doPPAnalysis || (std::abs(casc.dcabachtopv()) > MorePbPbsystCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > MorePbPbsystCuts.dcaBaryonToPV && + std::abs(casc.dcanegtopv()) > MorePbPbsystCuts.dcaMesonToPV && std::abs(casc.mOmega() - o2::constants::physics::MassOmegaMinus) > MorePbPbsystCuts.rejcomp && + ctauXi < MorePbPbsystCuts.proplifetime && std::abs(casc.yXi()) < MorePbPbsystCuts.rapCut)) { + BIT_SET(compatibleXiPlus, 2); + } + } + + if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaLoose && casc.sign() < 0) { + if (doPPAnalysis || (std::abs(casc.dcabachtopv()) > MorePbPbsystCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > MorePbPbsystCuts.dcaBaryonToPV && + std::abs(casc.dcanegtopv()) > MorePbPbsystCuts.dcaMesonToPV && std::abs(casc.mXi() - o2::constants::physics::MassXiMinus) > MorePbPbsystCuts.rejcomp && + ctauOmega < MorePbPbsystCuts.proplifetime && std::abs(casc.yOmega()) < MorePbPbsystCuts.rapCut)) { + BIT_SET(compatibleOmegaMinus, 0); + } + } + if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigma && casc.sign() < 0) { + if (doPPAnalysis || (std::abs(casc.dcabachtopv()) > MorePbPbsystCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > MorePbPbsystCuts.dcaBaryonToPV && + std::abs(casc.dcanegtopv()) > MorePbPbsystCuts.dcaMesonToPV && std::abs(casc.mXi() - o2::constants::physics::MassXiMinus) > MorePbPbsystCuts.rejcomp && + ctauOmega < MorePbPbsystCuts.proplifetime && std::abs(casc.yOmega()) < MorePbPbsystCuts.rapCut)) { + BIT_SET(compatibleOmegaMinus, 1); + } + } + if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaTight && casc.sign() < 0) { + if (doPPAnalysis || (std::abs(casc.dcabachtopv()) > MorePbPbsystCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > MorePbPbsystCuts.dcaBaryonToPV && + std::abs(casc.dcanegtopv()) > MorePbPbsystCuts.dcaMesonToPV && std::abs(casc.mXi() - o2::constants::physics::MassXiMinus) > MorePbPbsystCuts.rejcomp && + ctauOmega < MorePbPbsystCuts.proplifetime && std::abs(casc.yOmega()) < MorePbPbsystCuts.rapCut)) { + BIT_SET(compatibleOmegaMinus, 2); + } + } - if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && casc.sign() < 0) - BIT_SET(compatibleXiMinus, 0); - if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && casc.sign() < 0) - BIT_SET(compatibleXiMinus, 1); - if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && casc.sign() < 0) - BIT_SET(compatibleXiMinus, 2); - - if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && casc.sign() > 0) - BIT_SET(compatibleXiPlus, 0); - if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && casc.sign() > 0) - BIT_SET(compatibleXiPlus, 1); - if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(bachTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && casc.sign() > 0) - BIT_SET(compatibleXiPlus, 2); - - if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaLoose && casc.sign() < 0) - BIT_SET(compatibleOmegaMinus, 0); - if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigma && casc.sign() < 0) - BIT_SET(compatibleOmegaMinus, 1); - if (std::abs(posTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(negTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaTight && casc.sign() < 0) - BIT_SET(compatibleOmegaMinus, 2); - - if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaLoose && casc.sign() > 0) - BIT_SET(compatibleOmegaPlus, 0); - if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigma && casc.sign() > 0) - BIT_SET(compatibleOmegaPlus, 1); - if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaTight && casc.sign() > 0) - BIT_SET(compatibleOmegaPlus, 2); + if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaLoose && casc.sign() > 0) { + if (doPPAnalysis || (std::abs(casc.dcabachtopv()) > MorePbPbsystCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > MorePbPbsystCuts.dcaMesonToPV && + std::abs(casc.dcanegtopv()) > MorePbPbsystCuts.dcaBaryonToPV && std::abs(casc.mXi() - o2::constants::physics::MassXiMinus) > MorePbPbsystCuts.rejcomp && + ctauOmega < MorePbPbsystCuts.proplifetime && std::abs(casc.yOmega()) < MorePbPbsystCuts.rapCut)) { + BIT_SET(compatibleOmegaPlus, 0); + } + } + if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigma && casc.sign() > 0) { + if (doPPAnalysis || (std::abs(casc.dcabachtopv()) > MorePbPbsystCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > MorePbPbsystCuts.dcaMesonToPV && + std::abs(casc.dcanegtopv()) > MorePbPbsystCuts.dcaBaryonToPV && std::abs(casc.mXi() - o2::constants::physics::MassXiMinus) > MorePbPbsystCuts.rejcomp && + ctauOmega < MorePbPbsystCuts.proplifetime && std::abs(casc.yOmega()) < MorePbPbsystCuts.rapCut)) { + BIT_SET(compatibleOmegaPlus, 1); + } + } + if (std::abs(posTrackCast.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(negTrackCast.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(bachTrackCast.tpcNSigmaKa()) < strangedEdxNSigmaTight && casc.sign() > 0) { + if (doPPAnalysis || (std::abs(casc.dcabachtopv()) > MorePbPbsystCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > MorePbPbsystCuts.dcaMesonToPV && + std::abs(casc.dcanegtopv()) > MorePbPbsystCuts.dcaBaryonToPV && std::abs(casc.mXi() - o2::constants::physics::MassXiMinus) > MorePbPbsystCuts.rejcomp && + ctauOmega < MorePbPbsystCuts.proplifetime && std::abs(casc.yOmega()) < MorePbPbsystCuts.rapCut)) { + BIT_SET(compatibleOmegaPlus, 2); + } + } float massNSigmaXi = (casc.mXi() - fXiMean->Eval(casc.pt())) / (fXiWidth->Eval(casc.pt()) + 1e-6); float massNSigmaOmega = (casc.mOmega() - fOmegaMean->Eval(casc.pt())) / (fOmegaWidth->Eval(casc.pt()) + 1e-6); @@ -874,13 +1211,13 @@ struct HStrangeCorrelationFilter { if (casc.pdgCode() == -3334) trueOmegaPlus = true; if (compatibleXiMinus && (!doTrueSelectionInMass || (trueXiMinus && cascPhysicalPrimary))) - histos.fill(HIST("h3dMassXiMinus"), casc.pt(), casc.mXi(), collision.centFT0M()); + histos.fill(HIST("h3dMassXiMinus"), casc.pt(), casc.mXi(), cent); if (compatibleXiPlus && (!doTrueSelectionInMass || (trueXiPlus && cascPhysicalPrimary))) - histos.fill(HIST("h3dMassXiPlus"), casc.pt(), casc.mXi(), collision.centFT0M()); + histos.fill(HIST("h3dMassXiPlus"), casc.pt(), casc.mXi(), cent); if (compatibleOmegaMinus && (!doTrueSelectionInMass || (trueOmegaMinus && cascPhysicalPrimary))) - histos.fill(HIST("h3dMassOmegaMinus"), casc.pt(), casc.mOmega(), collision.centFT0M()); + histos.fill(HIST("h3dMassOmegaMinus"), casc.pt(), casc.mOmega(), cent); if (compatibleOmegaPlus && (!doTrueSelectionInMass || (trueOmegaPlus && cascPhysicalPrimary))) - histos.fill(HIST("h3dMassOmegaPlus"), casc.pt(), casc.mOmega(), collision.centFT0M()); + histos.fill(HIST("h3dMassOmegaPlus"), casc.pt(), casc.mOmega(), cent); if (!fillTableOnlyWithCompatible || ( // start major condition check diff --git a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx index c36fba2aa79..52b4310ed14 100644 --- a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx +++ b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx @@ -36,6 +36,7 @@ #include "Common/DataModel/Centrality.h" #include "Framework/StaticFor.h" #include "CCDB/BasicCCDBManager.h" +#include #include "EventFiltering/Zorro.h" #include "EventFiltering/ZorroSummary.h" @@ -63,6 +64,8 @@ struct HStrangeCorrelation { Zorro zorro; OutputObj zorroSummary{"zorroSummary"}; + // master analysis switches + Configurable doPPAnalysis{"doPPAnalysis", true, "if in pp, set to true"}; Configurable doCorrelationHadron{"doCorrelationHadron", false, "do Hadron correlation"}; Configurable doCorrelationK0Short{"doCorrelationK0Short", true, "do K0Short correlation"}; Configurable doCorrelationLambda{"doCorrelationLambda", false, "do Lambda correlation"}; @@ -89,6 +92,10 @@ struct HStrangeCorrelation { Configurable etaSel{"etaSel", 0.8, "Selection in eta for trigger and associated particles"}; Configurable ySel{"ySel", 0.5, "Selection in rapidity for consistency checks"}; + // used for event selections in Pb-Pb + Configurable cfgCutOccupancyHigh{"cfgCutOccupancyHigh", 3000, "High cut on TPC occupancy"}; + Configurable cfgCutOccupancyLow{"cfgCutOccupancyLow", 0, "Low cut on TPC occupancy"}; + // Axes - configurable for smaller sizes ConfigurableAxis axisMult{"axisMult", {VARIABLE_WIDTH, 0.0f, 0.01f, 1.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 70.0f, 100.0f}, "Mixing bins - multiplicity"}; ConfigurableAxis axisVtxZ{"axisVtxZ", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; @@ -128,6 +135,8 @@ struct HStrangeCorrelation { Configurable assocMaxTPCSharedClusters{"assocMaxTPCSharedClusters", 200, "maximum number of shared TPC clusters (inclusive) for assoc primary tracks"}; Configurable triggerRequireL0{"triggerRequireL0", false, "require ITS L0 cluster for trigger"}; Configurable assocRequireL0{"assocRequireL0", true, "require ITS L0 cluster for assoc primary track"}; + // Track quality in PbPb + Configurable tpcPidNsigmaCut{"tpcPidNsigmaCut", 5, "tpcPidNsigmaCut"}; // --- Trigger: DCA variation from basic formula: |DCAxy| < 0.004f + (0.013f / pt) Configurable dcaXYconstant{"dcaXYconstant", 0.004, "[0] in |DCAxy| < [0]+[1]/pT"}; @@ -143,6 +152,17 @@ struct HStrangeCorrelation { Configurable dcapostopv{"dcapostopv", 0.06, "DCA Pos To PV"}; Configurable v0RadiusMin{"v0RadiusMin", 0.5, "v0radius"}; Configurable v0RadiusMax{"v0RadiusMax", 200, "v0radius"}; + // more V0 selections in PbPb + Configurable lifetimecutK0S{"lifetimecutK0S", 20, "lifetimecutK0S"}; + Configurable lifetimecutLambda{"lifetimecutLambda", 30, "lifetimecutLambda"}; + Configurable dcanegtopvK0S{"dcanegtopvK0S", 0.1, "DCA Neg To PV"}; + Configurable dcapostopvK0S{"dcapostopvK0S", 0.1, "DCA Pos To PV"}; + Configurable dcanegtopvLambda{"dcanegtopvLambda", 0.05, "DCA Neg To PV"}; + Configurable dcapostopvLambda{"dcapostopvLambda", 0.2, "DCA Pos To PV"}; + Configurable dcanegtopvAntiLambda{"dcanegtopvAntiLambda", 0.2, "DCA Neg To PV"}; + Configurable dcapostopvAntiLambda{"dcapostopvAntiLambda", 0.05, "DCA Pos To PV"}; + // original equation: lArmPt*2>TMath::Abs(lArmAlpha) only for K0S + Configurable armPodCut{"armPodCut", 5.0f, "pT * (cut) > |alpha|, AP cut. Negative: no cut"}; // cascade selections Configurable cascCospa{"cascCospa", 0.95, "cascCospa"}; @@ -151,6 +171,23 @@ struct HStrangeCorrelation { Configurable cascRadius{"cascRadius", 0.5, "cascRadius"}; Configurable cascV0masswindow{"cascV0masswindow", 0.01, "cascV0masswindow"}; Configurable cascMindcav0topv{"cascMindcav0topv", 0.01, "cascMindcav0topv"}; + // more cascade selections in PbPb + Configurable bachBaryonCosPA{"bachBaryonCosPA", 0.9999, "Bachelor baryon CosPA"}; + Configurable bachBaryonDCAxyToPV{"bachBaryonDCAxyToPV", 0.08, "DCA bachelor baryon to PV"}; + Configurable dcaBaryonToPV{"dcaBaryonToPV", 0.05, "DCA of baryon doughter track To PV"}; + Configurable dcaMesonToPV{"dcaMesonToPV", 0.1, "DCA of meson doughter track To PV"}; + Configurable dcaBachToPV{"dcaBachToPV", 0.07, "DCA Bach To PV"}; + Configurable cascdcaV0dau{"cascdcaV0dau", 0.5, "DCA V0 Daughters"}; + Configurable dcaCacsDauPar0{"dcaCacsDauPar0", 0.8, " par for pt dep DCA cascade daughter cut, p_T < 1 GeV/c"}; + Configurable dcaCacsDauPar1{"dcaCacsDauPar1", 0.5, " par for pt dep DCA cascade daughter cut, 1< p_T < 4 GeV/c"}; + Configurable dcaCacsDauPar2{"dcaCacsDauPar2", 0.2, " par for pt dep DCA cascade daughter cut, p_T > 4 GeV/c"}; + Configurable cascdcaV0ToPV{"cascdcaV0ToPV", 0.06, "DCA V0 To PV"}; + Configurable cascv0cospa{"cascv0cospa", 0.98, "V0 CosPA"}; + Configurable cascv0RadiusMin{"cascv0RadiusMin", 2.5, "v0radius"}; + Configurable proplifetime{"proplifetime", 3, "ctau/"}; + Configurable lambdaMassWin{"lambdaMassWin", 0.005, "V0 Mass window limit"}; + Configurable rejcomp{"rejcomp", 0.008, "Competing Cascade rejection"}; + Configurable rapCut{"rapCut", 0.8, "Rapidity acceptance"}; // dE/dx for associated daughters Configurable dEdxCompatibility{"dEdxCompatibility", 1, "0: loose, 1: normal, 2: tight. Defined in HStrangeCorrelationFilter"}; @@ -174,6 +211,8 @@ struct HStrangeCorrelation { TH2F* hEfficiencyHadron; using BinningType = ColumnBinningPolicy; + using BinningTypePbPb = ColumnBinningPolicy; + // std::variant colBinning; BinningType colBinning{{axisVtxZ, axisMult}, true}; // true is for 'ignore overflows' (true by default). Underflows and overflows will have bin -1. // collision slicing for mixed events @@ -195,6 +234,9 @@ struct HStrangeCorrelation { std::vector> axisRanges; + const float ctauxiPDG = 4.91; // from PDG + const float ctauomegaPDG = 2.461; // from PDG + /// Function to aid in calculating delta-phi /// \param phi1 first phi value /// \param phi2 second phi value @@ -248,6 +290,111 @@ struct HStrangeCorrelation { hEfficiencyPion = static_cast(listEfficiencies->FindObject("hEfficiencyPion")); LOG(info) << "Efficiencies now loaded for " << mRunNumber; } + + template + uint64_t V0selectionBitmap(TV0 v0, float pvx, float pvy, float pvz) + // precalculate this information so that a check is one mask operation, not many + { + uint64_t bitMap = 0; + // proper lifetime , DCA daughter to prim.vtx + if (doCorrelationK0Short) { + // proper lifetime + if (v0.distovertotmom(pvx, pvy, pvz) * o2::constants::physics::MassK0Short < systCuts.lifetimecutK0S) + SETBIT(bitMap, 0); + // DCA daughter to prim.vtx and armenteros + if (std::abs(v0.dcapostopv()) > systCuts.dcapostopvK0S && std::abs(v0.dcanegtopv()) > systCuts.dcanegtopvK0S && v0.qtarm() * systCuts.armPodCut > std::abs(v0.alpha())) + SETBIT(bitMap, 3); + } + if (doCorrelationLambda) { + // proper lifetime + if (v0.distovertotmom(pvx, pvy, pvz) * o2::constants::physics::MassLambda0 < systCuts.lifetimecutLambda) + SETBIT(bitMap, 1); + // DCA daughter to prim.vtx + if (std::abs(v0.dcapostopv()) > systCuts.dcapostopvLambda && std::abs(v0.dcanegtopv()) > systCuts.dcanegtopvLambda) + SETBIT(bitMap, 4); + } + if (doCorrelationAntiLambda) { + // proper lifetime + if (v0.distovertotmom(pvx, pvy, pvz) * o2::constants::physics::MassLambda0 < systCuts.lifetimecutLambda) + SETBIT(bitMap, 2); + // DCA daughter to prim.vtx + if (std::abs(v0.dcapostopv()) > systCuts.dcapostopvAntiLambda && std::abs(v0.dcanegtopv()) > systCuts.dcanegtopvAntiLambda) + SETBIT(bitMap, 5); + } + return bitMap; + } + + template + uint64_t CascadeselectionBitmap(TCascade casc, float pvx, float pvy, float pvz) + { + uint64_t bitMap = 0; + float cascpos = std::hypot(casc.x() - pvx, casc.y() - pvy, casc.z() - pvz); + float cascptotmom = std::hypot(casc.px(), casc.py(), casc.pz()); + float ctauXi = o2::constants::physics::MassXiMinus * cascpos / ((cascptotmom + 1e-13) * ctauxiPDG); + float ctauOmega = o2::constants::physics::MassOmegaMinus * cascpos / ((cascptotmom + 1e-13) * ctauomegaPDG); + // TPC PID and DCA daughter to prim.vtx and comopeting casc.rej and life time + if (doCorrelationXiMinus) { + // DCA daughter to prim.vtx + if (std::abs(casc.dcabachtopv()) > systCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > systCuts.dcaBaryonToPV && + std::abs(casc.dcanegtopv()) > systCuts.dcaMesonToPV) + SETBIT(bitMap, 0); + // comopeting casc.rej + if (std::abs(casc.mOmega() - o2::constants::physics::MassOmegaMinus) > systCuts.rejcomp) + SETBIT(bitMap, 4); + if (ctauXi < systCuts.proplifetime) + SETBIT(bitMap, 8); + // y cut + if (std::abs(casc.yXi()) < systCuts.rapCut) + SETBIT(bitMap, 12); + } + if (doCorrelationXiPlus) { + // DCA daughter to prim.vtx + if (std::abs(casc.dcabachtopv()) > systCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > systCuts.dcaMesonToPV && + std::abs(casc.dcanegtopv()) > systCuts.dcaBaryonToPV) + SETBIT(bitMap, 1); + // comopeting casc.rej + if (std::abs(casc.mOmega() - o2::constants::physics::MassOmegaMinus) > systCuts.rejcomp) + SETBIT(bitMap, 5); + // life time + if (ctauXi < systCuts.proplifetime) + SETBIT(bitMap, 9); + // y cut + if (std::abs(casc.yXi()) > systCuts.rapCut) + SETBIT(bitMap, 13); + } + if (doCorrelationOmegaMinus) { + // DCA daughter to prim.vtx + if (std::abs(casc.dcabachtopv()) > systCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > systCuts.dcaBaryonToPV && + std::abs(casc.dcanegtopv()) > systCuts.dcaMesonToPV) + SETBIT(bitMap, 2); + // comopeting casc.rej + if (std::abs(casc.mXi() - o2::constants::physics::MassXiMinus) > systCuts.rejcomp) + SETBIT(bitMap, 6); + // life time + if (ctauOmega < systCuts.proplifetime) + SETBIT(bitMap, 10); + // y cut + if (std::abs(casc.yOmega()) < systCuts.rapCut) + SETBIT(bitMap, 14); + } + if (doCorrelationOmegaPlus) { + // DCA daughter to prim.vtx + if (std::abs(casc.dcabachtopv()) > systCuts.dcaBachToPV && std::abs(casc.dcapostopv()) > systCuts.dcaMesonToPV && + std::abs(casc.dcanegtopv()) > systCuts.dcaBaryonToPV) + SETBIT(bitMap, 3); + // comopeting casc.rej + if (std::abs(casc.mXi() - o2::constants::physics::MassXiMinus) > systCuts.rejcomp) + SETBIT(bitMap, 7); + // life time + if (ctauOmega < systCuts.proplifetime) + SETBIT(bitMap, 11); + // y cut + if (std::abs(casc.yOmega()) > systCuts.rapCut) + SETBIT(bitMap, 15); + } + return bitMap; + } + template bool isValidTrigger(TTrack track) { @@ -302,7 +449,66 @@ struct HStrangeCorrelation { } return true; } - void fillCorrelationsV0(aod::TriggerTracks const& triggers, aod::AssocV0s const& assocs, bool mixing, float pvz, float mult) + // V0selection in PbPb + template + bool V0SelectedPbPb(TV0 v0) + { + // v0radius + if (v0.v0radius() < systCuts.v0RadiusMin) + return false; + if (v0.v0radius() > systCuts.v0RadiusMax) + return false; + // v0cosPA + if (v0.v0cosPA() < systCuts.v0cospa) + return false; + // dcaV0daughters + if (v0.dcaV0daughters() > systCuts.dcaV0dau) + return false; + return true; + } + + // cascadeselection in PbPb + template + bool CascadeSelectedPbPb(TCascade casc, float pvx, float pvy, float pvz) + { + // bachBaryonCosPA + if (casc.bachBaryonCosPA() < systCuts.bachBaryonCosPA) + return false; + // bachBaryonDCAxyToPV + if (std::abs(casc.bachBaryonDCAxyToPV()) > systCuts.bachBaryonDCAxyToPV) + return false; + // casccosPA + if (casc.casccosPA(pvx, pvy, pvz) < systCuts.cascCospa) + return false; + // dcacascdaughters + float ptDepCut = systCuts.dcaCacsDauPar0; + if (casc.pt() > 1 && casc.pt() < 4) + ptDepCut = systCuts.dcaCacsDauPar1; + else if (casc.pt() > 4) + ptDepCut = systCuts.dcaCacsDauPar2; + if (casc.dcacascdaughters() > ptDepCut) + return false; + // dcaV0daughters + if (casc.dcaV0daughters() > systCuts.dcaV0dau) + return false; + // dcav0topv + if (std::abs(casc.dcav0topv(pvx, pvy, pvz)) < systCuts.cascdcaV0ToPV) + return false; + // cascradius + if (casc.cascradius() < systCuts.cascRadius) + return false; + // v0radius + if (casc.v0radius() < systCuts.cascv0RadiusMin) + return false; + // v0cosPA + if (casc.v0cosPA(casc.x(), casc.y(), casc.z()) < systCuts.cascv0cospa) + return false; + // lambdaMassWin + if (std::abs(casc.mLambda() - o2::constants::physics::MassLambda0) > systCuts.lambdaMassWin) + return false; + return true; + } + void fillCorrelationsV0(aod::TriggerTracks const& triggers, aod::AssocV0s const& assocs, float pvx, float pvy, float pvz, bool mixing, float mult) { for (auto const& triggerTrack : triggers) { if (doTriggPhysicalPrimary && !triggerTrack.mcPhysicalPrimary()) @@ -327,11 +533,16 @@ struct HStrangeCorrelation { auto assoc = assocCandidate.v0Core_as(); //---] syst cuts [--- - if (assoc.v0radius() < systCuts.v0RadiusMin || assoc.v0radius() > systCuts.v0RadiusMax || - std::abs(assoc.dcapostopv()) < systCuts.dcapostopv || std::abs(assoc.dcanegtopv()) < systCuts.dcanegtopv || - assoc.v0cosPA() < systCuts.v0cospa || assoc.dcaV0daughters() > systCuts.dcaV0dau) + if ((doPPAnalysis && (assoc.v0radius() < systCuts.v0RadiusMin || assoc.v0radius() > systCuts.v0RadiusMax || + std::abs(assoc.dcapostopv()) < systCuts.dcapostopv || std::abs(assoc.dcanegtopv()) < systCuts.dcanegtopv || + assoc.v0cosPA() < systCuts.v0cospa || assoc.dcaV0daughters() > systCuts.dcaV0dau))) + continue; + + if (!doPPAnalysis && !V0SelectedPbPb(assoc)) continue; + uint64_t selMap = V0selectionBitmap(assoc, pvx, pvy, pvz); + //---] removing autocorrelations [--- auto postrack = assoc.posTrack_as(); auto negtrack = assoc.negTrack_as(); @@ -381,7 +592,7 @@ struct HStrangeCorrelation { } float weight = (applyEfficiencyCorrection || applyEfficiencyForTrigger) ? 1. / efficiency : 1.0f; - if (TESTBIT(doCorrelation, Index) && (!applyEfficiencyCorrection || efficiency != 0)) { + if (TESTBIT(doCorrelation, Index) && (!applyEfficiencyCorrection || efficiency != 0) && (doPPAnalysis || (TESTBIT(selMap, Index) && TESTBIT(selMap, Index + 3)))) { if (assocCandidate.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(Index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && !mixing && -massWindowConfigurations.maxBgNSigma < assocCandidate.invMassNSigma(Index) && assocCandidate.invMassNSigma(Index) < -massWindowConfigurations.minBgNSigma) histos.fill(HIST("sameEvent/LeftBg/") + HIST(kV0names[Index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); if (assocCandidate.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(Index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && !mixing && -massWindowConfigurations.maxPeakNSigma < assocCandidate.invMassNSigma(Index) && assocCandidate.invMassNSigma(Index) < +massWindowConfigurations.maxPeakNSigma) { @@ -433,18 +644,20 @@ struct HStrangeCorrelation { auto assoc = assocCandidate.cascData(); //---] syst cuts [--- - if (std::abs(assoc.dcapostopv()) < systCuts.dcapostopv || - std::abs(assoc.dcanegtopv()) < systCuts.dcanegtopv || - assoc.dcabachtopv() < systCuts.cascDcabachtopv || - assoc.dcaV0daughters() > systCuts.dcaV0dau || - assoc.dcacascdaughters() > systCuts.cascDcacascdau || - assoc.v0cosPA(pvx, pvy, pvz) < systCuts.v0cospa || - assoc.casccosPA(pvx, pvy, pvz) < systCuts.cascCospa || - assoc.cascradius() < systCuts.cascRadius || - std::abs(assoc.dcav0topv(pvx, pvy, pvz)) < systCuts.cascMindcav0topv || - std::abs(assoc.mLambda() - o2::constants::physics::MassLambda0) > systCuts.cascV0masswindow) + if (doPPAnalysis && (std::abs(assoc.dcapostopv()) < systCuts.dcapostopv || + std::abs(assoc.dcanegtopv()) < systCuts.dcanegtopv || + assoc.dcabachtopv() < systCuts.cascDcabachtopv || + assoc.dcaV0daughters() > systCuts.dcaV0dau || + assoc.dcacascdaughters() > systCuts.cascDcacascdau || + assoc.v0cosPA(pvx, pvy, pvz) < systCuts.v0cospa || + assoc.casccosPA(pvx, pvy, pvz) < systCuts.cascCospa || + assoc.cascradius() < systCuts.cascRadius || + std::abs(assoc.dcav0topv(pvx, pvy, pvz)) < systCuts.cascMindcav0topv || + std::abs(assoc.mLambda() - o2::constants::physics::MassLambda0) > systCuts.cascV0masswindow)) continue; - + if (!doPPAnalysis && !CascadeSelectedPbPb(assoc, pvx, pvy, pvz)) + continue; + uint64_t CascselMap = CascadeselectionBitmap(assoc, pvx, pvy, pvz); //---] removing autocorrelations [--- auto postrack = assoc.posTrack_as(); auto negtrack = assoc.negTrack_as(); @@ -500,7 +713,7 @@ struct HStrangeCorrelation { efficiency = 1; } float weight = (applyEfficiencyCorrection || applyEfficiencyForTrigger) ? 1. / efficiency : 1.0f; - if (TESTBIT(doCorrelation, Index + 3) && (!applyEfficiencyCorrection || efficiency != 0)) { + if (TESTBIT(doCorrelation, Index + 3) && (!applyEfficiencyCorrection || efficiency != 0) && (doPPAnalysis || (TESTBIT(CascselMap, Index) && TESTBIT(CascselMap, Index + 4) && TESTBIT(CascselMap, Index + 8) && TESTBIT(CascselMap, Index + 12)))) { if (assocCandidate.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(Index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && !mixing && -massWindowConfigurations.maxBgNSigma < assocCandidate.invMassNSigma(Index) && assocCandidate.invMassNSigma(Index) < -massWindowConfigurations.minBgNSigma) histos.fill(HIST("sameEvent/LeftBg/") + HIST(kCascadenames[Index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); if (assocCandidate.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(Index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && !mixing && -massWindowConfigurations.maxPeakNSigma < assocCandidate.invMassNSigma(Index) && assocCandidate.invMassNSigma(Index) < +massWindowConfigurations.maxPeakNSigma) @@ -803,6 +1016,13 @@ struct HStrangeCorrelation { const AxisSpec axisVtxZNDim{edgesVtxZ, "vertex Z (cm)"}; const AxisSpec axisMultNDim{edgesMult, "mult percentile"}; + // event selections in Pb-Pb + histos.add("hEventSelection", "hEventSelection", kTH1F, {{10, 0, 10}}); + TString eventSelLabel[] = {"all", "sel8", "kIsTriggerTVX", "PV_{z}", "kIsGoodITSLayersAll", "kIsGoodZvtxFT0vsPV", "OccupCut", "kNoITSROFrameBorder", "kNoSameBunchPileup ", " kNoCollInTimeRangeStandard"}; + for (int i = 1; i <= histos.get(HIST("hEventSelection"))->GetNbinsX(); i++) { + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(i, eventSelLabel[i - 1]); + } + // Some QA plots histos.add("hGeneratedQAPtTrigger", "hGeneratedQAPtTrigger", kTH2F, {axisPtQA, {5, -0.5f, 4.5f}}); histos.add("hGeneratedQAPtAssociatedK0", "hGeneratedQAPtAssociatedK0", kTH2F, {axisPtQA, {5, -0.5f, 4.5f}}); @@ -958,6 +1178,86 @@ struct HStrangeCorrelation { return true; } + // event selections in Pb-Pb + template + bool isCollisionSelectedPbPb(TCollision collision, bool fillHists) + { + if (fillHists) + histos.fill(HIST("hEventSelection"), 0.5 /* all collisions */); + + // Perform basic event selection + if (!collision.sel8()) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 1.5 /* collisions after sel8*/); + + if (!collision.selection_bit(aod::evsel::kIsTriggerTVX)) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 2.5 /* FT0 vertex (acceptable FT0C-FT0A time difference) collisions */); + + if (std::abs(collision.posZ()) > zVertexCut) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 3.5 /* collisions after sel pvz sel*/); + + if (!collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + // cut time intervals with dead ITS staves + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 4.5 /* collisions after cut time intervals with dead ITS staves*/); + + if (!collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { + // removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference + // use this cut at low multiplicities with caution + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 5.5 /* removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference*/); + + auto occupancy = collision.trackOccupancyInTimeRange(); + if (occupancy < cfgCutOccupancyLow || occupancy > cfgCutOccupancyHigh) + return false; + if (fillHists) + histos.fill(HIST("hEventSelection"), 6.5 /* Below min occupancy and Above max occupancy*/); + + /* + if (collision.alias_bit(kTVXinTRD)) { + // TRD triggered + return false; + } + */ + + if (!collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { + // reject collisions close to Time Frame borders + // O2-4623 + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 7.5 /* reject collisions close to Time Frame borders*/); + + if (!collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { + // reject events affected by the ITS ROF border + // O2-4309 + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 8.5 /* reject events affected by the ITS ROF border*/); + + if (!collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { + // rejects collisions which are associated with the same "found-by-T0" bunch crossing + // https://indico.cern.ch/event/1396220/#1-event-selection-with-its-rof + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 9.5 /* rejects collisions which are associated with the same "found-by-T0" bunch crossing*/); + return true; + } + // if this process function is enabled, it will be such that only events with trigger particles within a given // trigger pt bin are taken for the entire processing. This allows for the calculation of e.g. efficiencies // within an event class that has a trigger (which may differ with respect to other cases, to be checked) @@ -1071,10 +1371,14 @@ struct HStrangeCorrelation { fillCorrelationsHadron(triggerTracks, assocHadrons, false, collision.posZ(), collision.centFT0M()); } - void processSameEventHV0s(soa::Join::iterator const& collision, + void processSameEventHV0s(soa::Join::iterator const& collision, aod::AssocV0s const& associatedV0s, aod::TriggerTracks const& triggerTracks, V0DatasWithoutTrackX const&, TracksComplete const&, aod::BCsWithTimestamps const&) { + if (!doPPAnalysis) { + BinningTypePbPb colBinning{{axisVtxZ, axisMult}, true}; + } + double cent = doPPAnalysis ? collision.centFT0M() : collision.centFT0C(); // ________________________________________________ // skip if desired trigger not found if (triggerPresenceMap.size() > 0 && !TESTBIT(triggerPresenceMap[collision.globalIndex()], triggerBinToSelect)) { @@ -1083,15 +1387,15 @@ struct HStrangeCorrelation { // ________________________________________________ // Perform basic event selection - if (!isCollisionSelected(collision)) { + if (((doPPAnalysis && !isCollisionSelected(collision))) || (!doPPAnalysis && !isCollisionSelectedPbPb(collision, true))) { return; } // ________________________________________________ if (!doprocessSameEventHCascades) { - histos.fill(HIST("MixingQA/hSECollisionBins"), colBinning.getBin({collision.posZ(), collision.centFT0M()})); - histos.fill(HIST("EventQA/hMult"), collision.centFT0M()); + histos.fill(HIST("MixingQA/hSECollisionBins"), colBinning.getBin({collision.posZ(), cent})); + histos.fill(HIST("EventQA/hMult"), cent); histos.fill(HIST("EventQA/hPvz"), collision.posZ()); - histos.fill(HIST("EventQA/hMultFT0vsTPC"), collision.centFT0M(), collision.multNTracksPVeta1()); + histos.fill(HIST("EventQA/hMultFT0vsTPC"), cent, collision.multNTracksPVeta1()); } // Do basic QA @@ -1114,10 +1418,13 @@ struct HStrangeCorrelation { continue; //---] syst cuts [--- - if (v0Data.v0radius() < systCuts.v0RadiusMin || v0Data.v0radius() > systCuts.v0RadiusMax || - std::abs(v0Data.dcapostopv()) < systCuts.dcapostopv || std::abs(v0Data.dcanegtopv()) < systCuts.dcanegtopv || - v0Data.v0cosPA() < systCuts.v0cospa || v0Data.dcaV0daughters() > systCuts.dcaV0dau) + if (doPPAnalysis && (v0Data.v0radius() < systCuts.v0RadiusMin || v0Data.v0radius() > systCuts.v0RadiusMax || + std::abs(v0Data.dcapostopv()) < systCuts.dcapostopv || std::abs(v0Data.dcanegtopv()) < systCuts.dcanegtopv || + v0Data.v0cosPA() < systCuts.v0cospa || v0Data.dcaV0daughters() > systCuts.dcaV0dau)) + continue; + if (!doPPAnalysis && !V0SelectedPbPb(v0Data)) continue; + uint64_t selMap = V0selectionBitmap(v0Data, collision.posX(), collision.posY(), collision.posZ()); static_for<0, 2>([&](auto i) { constexpr int Index = i.value; @@ -1130,10 +1437,10 @@ struct HStrangeCorrelation { } float weight = applyEfficiencyCorrection ? 1. / efficiency : 1.0f; if (v0.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || v0.mcTrue(Index)) && (!doAssocPhysicalPrimary || v0.mcPhysicalPrimary()) && (!applyEfficiencyCorrection || efficiency != 0)) { - if (TESTBIT(doCorrelation, Index)) { - histos.fill(HIST("h3d") + HIST(kV0names[Index]) + HIST("Spectrum"), v0Data.pt(), collision.centFT0M(), v0.invMassNSigma(Index), weight); + if ((TESTBIT(doCorrelation, Index)) && (doPPAnalysis || (TESTBIT(selMap, Index) && TESTBIT(selMap, Index + 3)))) { + histos.fill(HIST("h3d") + HIST(kV0names[Index]) + HIST("Spectrum"), v0Data.pt(), cent, v0.invMassNSigma(Index), weight); if (std::abs(v0Data.rapidity(Index)) < ySel) { - histos.fill(HIST("h3d") + HIST(kV0names[Index]) + HIST("SpectrumY"), v0Data.pt(), collision.centFT0M(), v0.invMassNSigma(Index), weight); + histos.fill(HIST("h3d") + HIST(kV0names[Index]) + HIST("SpectrumY"), v0Data.pt(), cent, v0.invMassNSigma(Index), weight); } if ((-massWindowConfigurations.maxBgNSigma < v0.invMassNSigma(Index) && v0.invMassNSigma(Index) < -massWindowConfigurations.minBgNSigma) || (+massWindowConfigurations.minBgNSigma < v0.invMassNSigma(Index) && v0.invMassNSigma(Index) < +massWindowConfigurations.maxBgNSigma)) { histos.fill(HIST("h") + HIST(kV0names[Index]) + HIST("EtaVsPtVsPhiBg"), v0Data.pt(), v0Data.eta(), v0Data.phi(), weight); @@ -1150,24 +1457,28 @@ struct HStrangeCorrelation { auto track = triggerTrack.track_as(); if (!isValidTrigger(track)) continue; - histos.fill(HIST("hTriggerAllSelectedEtaVsPt"), track.pt(), track.eta(), collision.centFT0M()); + histos.fill(HIST("hTriggerAllSelectedEtaVsPt"), track.pt(), track.eta(), cent); histos.fill(HIST("hTriggerPtResolution"), track.pt(), triggerTrack.mcOriginalPt()); if (doTriggPhysicalPrimary && !triggerTrack.mcPhysicalPrimary()) continue; - histos.fill(HIST("hTriggerPrimaryEtaVsPt"), track.pt(), track.eta(), collision.centFT0M()); + histos.fill(HIST("hTriggerPrimaryEtaVsPt"), track.pt(), track.eta(), cent); histos.fill(HIST("hTrackEtaVsPtVsPhi"), track.pt(), track.eta(), track.phi()); } } // ________________________________________________ // Do hadron - V0 correlations - fillCorrelationsV0(triggerTracks, associatedV0s, false, collision.posZ(), collision.centFT0M()); + fillCorrelationsV0(triggerTracks, associatedV0s, false, collision.posX(), collision.posY(), collision.posZ(), cent); } - void processSameEventHCascades(soa::Join::iterator const& collision, + void processSameEventHCascades(soa::Join::iterator const& collision, aod::AssocV0s const&, aod::AssocCascades const& associatedCascades, aod::TriggerTracks const& triggerTracks, V0DatasWithoutTrackX const&, aod::CascDatas const&, TracksComplete const&, aod::BCsWithTimestamps const&) { + if (!doPPAnalysis) { + BinningTypePbPb colBinning{{axisVtxZ, axisMult}, true}; + } + double cent = doPPAnalysis ? collision.centFT0M() : collision.centFT0C(); // ________________________________________________ // skip if desired trigger not found if (triggerPresenceMap.size() > 0 && !TESTBIT(triggerPresenceMap[collision.globalIndex()], triggerBinToSelect)) { @@ -1176,12 +1487,12 @@ struct HStrangeCorrelation { // ________________________________________________ // Perform basic event selection - if (!isCollisionSelected(collision)) { + if (((doPPAnalysis && !isCollisionSelected(collision))) || (!doPPAnalysis && !isCollisionSelectedPbPb(collision, true))) { return; } // ________________________________________________ - histos.fill(HIST("MixingQA/hSECollisionBins"), colBinning.getBin({collision.posZ(), collision.centFT0M()})); - histos.fill(HIST("EventQA/hMult"), collision.centFT0M()); + histos.fill(HIST("MixingQA/hSECollisionBins"), colBinning.getBin({collision.posZ(), cent})); + histos.fill(HIST("EventQA/hMult"), cent); histos.fill(HIST("EventQA/hPvz"), collision.posZ()); // Do basic QA if (applyEfficiencyCorrection) { @@ -1198,18 +1509,20 @@ struct HStrangeCorrelation { auto cascData = casc.cascData(); //---] syst cuts [--- - if (std::abs(cascData.dcapostopv()) < systCuts.dcapostopv || - std::abs(cascData.dcanegtopv()) < systCuts.dcanegtopv || - cascData.dcabachtopv() < systCuts.cascDcabachtopv || - cascData.dcaV0daughters() > systCuts.dcaV0dau || - cascData.dcacascdaughters() > systCuts.cascDcacascdau || - cascData.v0cosPA(collision.posX(), collision.posY(), collision.posZ()) < systCuts.v0cospa || - cascData.casccosPA(collision.posX(), collision.posY(), collision.posZ()) < systCuts.cascCospa || - cascData.cascradius() < systCuts.cascRadius || - std::abs(cascData.dcav0topv(collision.posX(), collision.posY(), collision.posZ())) < systCuts.cascMindcav0topv || - std::abs(cascData.mLambda() - o2::constants::physics::MassLambda0) > systCuts.cascV0masswindow) + if (doPPAnalysis && (std::abs(cascData.dcapostopv()) < systCuts.dcapostopv || + std::abs(cascData.dcanegtopv()) < systCuts.dcanegtopv || + cascData.dcabachtopv() < systCuts.cascDcabachtopv || + cascData.dcaV0daughters() > systCuts.dcaV0dau || + cascData.dcacascdaughters() > systCuts.cascDcacascdau || + cascData.v0cosPA(collision.posX(), collision.posY(), collision.posZ()) < systCuts.v0cospa || + cascData.casccosPA(collision.posX(), collision.posY(), collision.posZ()) < systCuts.cascCospa || + cascData.cascradius() < systCuts.cascRadius || + std::abs(cascData.dcav0topv(collision.posX(), collision.posY(), collision.posZ())) < systCuts.cascMindcav0topv || + std::abs(cascData.mLambda() - o2::constants::physics::MassLambda0) > systCuts.cascV0masswindow)) continue; - + if (!doPPAnalysis && !CascadeSelectedPbPb(cascData, collision.posX(), collision.posY(), collision.posZ())) + continue; + uint64_t CascselMap = CascadeselectionBitmap(cascData, collision.posX(), collision.posY(), collision.posZ()); //---] track quality check [--- auto postrack = cascData.posTrack_as(); auto negtrack = cascData.negTrack_as(); @@ -1228,10 +1541,10 @@ struct HStrangeCorrelation { } float weight = applyEfficiencyCorrection ? 1. / efficiency : 1.0f; if (casc.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || casc.mcTrue(Index)) && (!doAssocPhysicalPrimary || casc.mcPhysicalPrimary()) && (!applyEfficiencyCorrection || efficiency != 0)) { - if (TESTBIT(doCorrelation, Index + 3)) { - histos.fill(HIST("h3d") + HIST(kCascadenames[Index]) + HIST("Spectrum"), cascData.pt(), collision.centFT0M(), casc.invMassNSigma(Index), weight); + if (TESTBIT(doCorrelation, Index + 3) && (doPPAnalysis || (TESTBIT(CascselMap, Index) && TESTBIT(CascselMap, Index + 4) && TESTBIT(CascselMap, Index + 8) && TESTBIT(CascselMap, Index + 12)))) { + histos.fill(HIST("h3d") + HIST(kCascadenames[Index]) + HIST("Spectrum"), cascData.pt(), cent, casc.invMassNSigma(Index), weight); if (std::abs(cascData.rapidity(Index)) < ySel) { - histos.fill(HIST("h3d") + HIST(kCascadenames[Index]) + HIST("SpectrumY"), cascData.pt(), collision.centFT0M(), casc.invMassNSigma(Index), weight); + histos.fill(HIST("h3d") + HIST(kCascadenames[Index]) + HIST("SpectrumY"), cascData.pt(), cent, casc.invMassNSigma(Index), weight); } if (-massWindowConfigurations.maxPeakNSigma < casc.invMassNSigma(Index) && casc.invMassNSigma(Index) < +massWindowConfigurations.maxPeakNSigma) { histos.fill(HIST("h") + HIST(kCascadenames[Index]) + HIST("EtaVsPtVsPhi"), cascData.pt(), cascData.eta(), cascData.phi(), weight); @@ -1247,17 +1560,17 @@ struct HStrangeCorrelation { auto track = triggerTrack.track_as(); if (!isValidTrigger(track)) continue; - histos.fill(HIST("hTriggerAllSelectedEtaVsPt"), track.pt(), track.eta(), collision.centFT0M()); + histos.fill(HIST("hTriggerAllSelectedEtaVsPt"), track.pt(), track.eta(), cent); histos.fill(HIST("hTriggerPtResolution"), track.pt(), triggerTrack.mcOriginalPt()); if (doTriggPhysicalPrimary && !triggerTrack.mcPhysicalPrimary()) continue; - histos.fill(HIST("hTriggerPrimaryEtaVsPt"), track.pt(), track.eta(), collision.centFT0M()); + histos.fill(HIST("hTriggerPrimaryEtaVsPt"), track.pt(), track.eta(), cent); histos.fill(HIST("hTrackEtaVsPtVsPhi"), track.pt(), track.eta(), track.phi()); } // ________________________________________________ // Do hadron - cascade correlations - fillCorrelationsCascade(triggerTracks, associatedCascades, false, collision.posX(), collision.posY(), collision.posZ(), collision.centFT0M()); + fillCorrelationsCascade(triggerTracks, associatedCascades, false, collision.posX(), collision.posY(), collision.posZ(), cent); } void processSameEventHPions(soa::Join::iterator const& collision, soa::Join const& associatedPions, soa::Join const& triggerTracks, @@ -1352,11 +1665,16 @@ struct HStrangeCorrelation { } } - void processMixedEventHV0s(soa::Join const& collisions, + void processMixedEventHV0s(soa::Join const& collisions, aod::AssocV0s const& associatedV0s, aod::TriggerTracks const& triggerTracks, V0DatasWithoutTrackX const&, TracksComplete const&, aod::BCsWithTimestamps const&) { + if (!doPPAnalysis) { + BinningTypePbPb colBinning{{axisVtxZ, axisMult}, true}; + } for (auto const& [collision1, collision2] : soa::selfCombinations(colBinning, mixingParameter, -1, collisions, collisions)) { + double cent1 = doPPAnalysis ? collision1.centFT0M() : collision1.centFT0C(); + double cent2 = doPPAnalysis ? collision2.centFT0M() : collision2.centFT0C(); // ________________________________________________ if (applyEfficiencyCorrection) { auto bc = collision1.bc_as(); @@ -1369,12 +1687,12 @@ struct HStrangeCorrelation { } // Perform basic event selection on both collisions - if (!isCollisionSelected(collision1) || !isCollisionSelected(collision2)) { + if ((doPPAnalysis && (!isCollisionSelected(collision1) || !isCollisionSelected(collision2))) || (!doPPAnalysis && (!isCollisionSelectedPbPb(collision1, true) || (!isCollisionSelectedPbPb(collision2, true))))) { continue; } - if (collision1.centFT0M() > axisRanges[5][1] || collision1.centFT0M() < axisRanges[5][0]) + if (cent1 > axisRanges[5][1] || cent1 < axisRanges[5][0]) continue; - if (collision2.centFT0M() > axisRanges[5][1] || collision2.centFT0M() < axisRanges[5][0]) + if (cent2 > axisRanges[5][1] || cent2 < axisRanges[5][0]) continue; if (!doprocessMixedEventHCascades) { @@ -1383,7 +1701,7 @@ struct HStrangeCorrelation { } histos.fill(HIST("MixingQA/hMEpvz1"), collision1.posZ()); histos.fill(HIST("MixingQA/hMEpvz2"), collision2.posZ()); - histos.fill(HIST("MixingQA/hMECollisionBins"), colBinning.getBin({collision1.posZ(), collision1.centFT0M()})); + histos.fill(HIST("MixingQA/hMECollisionBins"), colBinning.getBin({collision1.posZ(), cent1})); } // ________________________________________________ // Do slicing @@ -1391,14 +1709,19 @@ struct HStrangeCorrelation { auto slicedAssocV0s = associatedV0s.sliceBy(collisionSliceV0s, collision2.globalIndex()); // ________________________________________________ // Do hadron - V0 correlations - fillCorrelationsV0(slicedTriggerTracks, slicedAssocV0s, true, collision1.posZ(), collision1.centFT0M()); + fillCorrelationsV0(slicedTriggerTracks, slicedAssocV0s, true, collision1.posX(), collision1.posY(), collision1.posZ(), cent1); } } - void processMixedEventHCascades(soa::Join const& collisions, + void processMixedEventHCascades(soa::Join const& collisions, aod::AssocV0s const&, aod::AssocCascades const& associatedCascades, aod::TriggerTracks const& triggerTracks, V0DatasWithoutTrackX const&, aod::CascDatas const&, TracksComplete const&, aod::BCsWithTimestamps const&) { + if (!doPPAnalysis) { + BinningTypePbPb colBinning{{axisVtxZ, axisMult}, true}; + } for (auto const& [collision1, collision2] : soa::selfCombinations(colBinning, mixingParameter, -1, collisions, collisions)) { + double cent1 = doPPAnalysis ? collision1.centFT0M() : collision1.centFT0C(); + double cent2 = doPPAnalysis ? collision2.centFT0M() : collision2.centFT0C(); // ________________________________________________ if (applyEfficiencyCorrection) { auto bc = collision1.bc_as(); @@ -1411,12 +1734,12 @@ struct HStrangeCorrelation { } // Perform basic event selection on both collisions - if (!isCollisionSelected(collision1) || !isCollisionSelected(collision2)) { + if ((doPPAnalysis && (!isCollisionSelected(collision1) || !isCollisionSelected(collision2))) || (!doPPAnalysis && (!isCollisionSelectedPbPb(collision1, true) || (!isCollisionSelectedPbPb(collision2, true))))) { continue; } - if (collision1.centFT0M() > axisRanges[5][1] || collision1.centFT0M() < axisRanges[5][0]) + if (cent1 > axisRanges[5][1] || cent1 < axisRanges[5][0]) continue; - if (collision2.centFT0M() > axisRanges[5][1] || collision2.centFT0M() < axisRanges[5][0]) + if (cent2 > axisRanges[5][1] || cent2 < axisRanges[5][0]) continue; if (collision1.globalIndex() == collision2.globalIndex()) { @@ -1425,14 +1748,14 @@ struct HStrangeCorrelation { histos.fill(HIST("MixingQA/hMEpvz1"), collision1.posZ()); histos.fill(HIST("MixingQA/hMEpvz2"), collision2.posZ()); - histos.fill(HIST("MixingQA/hMECollisionBins"), colBinning.getBin({collision1.posZ(), collision1.centFT0M()})); + histos.fill(HIST("MixingQA/hMECollisionBins"), colBinning.getBin({collision1.posZ(), cent1})); // ________________________________________________ // Do slicing auto slicedTriggerTracks = triggerTracks.sliceBy(collisionSliceTracks, collision1.globalIndex()); auto slicedAssocCascades = associatedCascades.sliceBy(collisionSliceCascades, collision2.globalIndex()); // ________________________________________________ // Do hadron - cascade correlations - fillCorrelationsCascade(slicedTriggerTracks, slicedAssocCascades, true, collision1.posX(), collision1.posY(), collision1.posZ(), collision1.centFT0M()); + fillCorrelationsCascade(slicedTriggerTracks, slicedAssocCascades, true, collision1.posX(), collision1.posY(), collision1.posZ(), cent1); } } void processMixedEventHPions(soa::Join const& collisions, From 9347f8783e9e045a013cfb9c92fac580ca63120b Mon Sep 17 00:00:00 2001 From: Shirajum Monira <38348689+Eloviyo@users.noreply.github.com> Date: Thu, 8 May 2025 12:55:34 +0200 Subject: [PATCH 1219/1650] [PWGCF] PWGCF: FemtoUniverse cascade task -- implemented changes to produce both Xi and Omega simultaneously (#11122) Co-authored-by: Shirajum Monira --- .../Core/FemtoUniverseCascadeSelection.h | 52 +++++++++++-------- .../femtoUniverseProducerTask.cxx | 25 ++++----- 2 files changed, 42 insertions(+), 35 deletions(-) diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseCascadeSelection.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseCascadeSelection.h index 566323d078e..c0dd3ad308d 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseCascadeSelection.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseCascadeSelection.h @@ -81,13 +81,13 @@ class FemtoUniverseCascadeSelection public: FemtoUniverseCascadeSelection() - : nPtCascadeMinSel(0), nPtCascadeMaxSel(0), nEtaCascadeMaxSel(0), nDCAV0DaughMax(0), nCPAV0Min(0), nTranRadV0Min(0), nTranRadV0Max(0), nV0DecVtxMax(0), nDCACascadeDaughMax(0), nCPACascadeMin(0), nTranRadCascadeMin(0), nTranRadCascadeMax(0), nDecVtxMax(0), nDCAPosToPV(0), nDCANegToPV(0), nDCABachToPV(0), nDCAV0ToPV(0), pTCascadeMin(9999999.), pTCascadeMax(-9999999.), etaCascadeMax(-9999999.), fDCAV0DaughMax(-9999999.), fCPAV0Min(9999999.), fTranRadV0Min(9999999.), fTranRadV0Max(-9999999.), fV0DecVtxMax(-9999999.), fDCACascadeDaughMax(-9999999.), fCPACascadeMin(9999999.), fTranRadCascadeMin(9999999.), fTranRadCascadeMax(-9999999.), fDecVtxMax(-9999999.), fDCAPosToPV(9999999.), fDCANegToPV(9999999.), fDCABachToPV(9999999.), fDCAV0ToPV(9999999.), fV0InvMassLowLimit(1.05), fV0InvMassUpLimit(1.3), fInvMassLowLimit(1.25), fInvMassUpLimit(1.4), fRejectCompetingMass(false), fInvMassCompetingLowLimit(1.5), fInvMassCompetingUpLimit(2.0), isCascOmega(false) /*, nSigmaPIDOffsetTPC(0.)*/ + : nPtCascadeMinSel(0), nPtCascadeMaxSel(0), nEtaCascadeMaxSel(0), nDCAV0DaughMax(0), nCPAV0Min(0), nTranRadV0Min(0), nTranRadV0Max(0), nV0DecVtxMax(0), nDCACascadeDaughMax(0), nCPACascadeMin(0), nTranRadCascadeMin(0), nTranRadCascadeMax(0), nDecVtxMax(0), nDCAPosToPV(0), nDCANegToPV(0), nDCABachToPV(0), nDCAV0ToPV(0), pTCascadeMin(9999999.), pTCascadeMax(-9999999.), etaCascadeMax(-9999999.), fDCAV0DaughMax(-9999999.), fCPAV0Min(9999999.), fTranRadV0Min(9999999.), fTranRadV0Max(-9999999.), fV0DecVtxMax(-9999999.), fDCACascadeDaughMax(-9999999.), fCPACascadeMin(9999999.), fTranRadCascadeMin(9999999.), fTranRadCascadeMax(-9999999.), fDecVtxMax(-9999999.), fDCAPosToPV(9999999.), fDCANegToPV(9999999.), fDCABachToPV(9999999.), fDCAV0ToPV(9999999.), fV0InvMassLowLimit(1.05), fV0InvMassUpLimit(1.3), fInvMassLowLimitXi(1.25), fInvMassUpLimitXi(1.4), fInvMassLowLimitOmega(1.6), fInvMassUpLimitOmega(1.8) /*, fRejectCompetingMass(false), fInvMassCompetingLowLimit(1.5), fInvMassCompetingUpLimit(2.0), nSigmaPIDOffsetTPC(0.)*/ { } /// Initializes histograms for the task template - void init(HistogramRegistry* registry, bool isSelectCascOmega = false); + void init(HistogramRegistry* registry /*, bool isSelectCascOmega = false*/); template bool isSelectedMinimal(Col const& col, Casc const& cascade, Track const& posTrack, Track const& negTrack, Track const& bachTrack); @@ -153,21 +153,23 @@ class FemtoUniverseCascadeSelection /// Set limit for the selection on the invariant mass /// \param lowLimit Lower limit for the invariant mass distribution /// \param upLimit Upper limit for the invariant mass distribution - void setInvMassLimits(float lowLimit, float upLimit) + void setInvMassLimits(float lowLimitXi, float lowLimitOmega, float upLimitXi, float upLimitOmega) { - fInvMassLowLimit = lowLimit; - fInvMassUpLimit = upLimit; + fInvMassLowLimitXi = lowLimitXi; + fInvMassUpLimitXi = upLimitXi; + fInvMassLowLimitOmega = lowLimitOmega; + fInvMassUpLimitOmega = upLimitOmega; } /// Set limit for the omega rejection on the invariant mass /// \param lowLimit Lower limit for the invariant mass distribution /// \param upLimit Upper limit for the invariant mass distribution - void setCompetingInvMassLimits(float lowLimit, float upLimit) + /*void setCompetingInvMassLimits(float lowLimit, float upLimit) { fRejectCompetingMass = true; fInvMassCompetingLowLimit = lowLimit; fInvMassCompetingUpLimit = upLimit; - } + }*/ private: int nPtCascadeMinSel; @@ -208,14 +210,15 @@ class FemtoUniverseCascadeSelection float fV0InvMassLowLimit; float fV0InvMassUpLimit; - float fInvMassLowLimit; - float fInvMassUpLimit; + float fInvMassLowLimitXi; + float fInvMassUpLimitXi; - float fRejectCompetingMass; - float fInvMassCompetingLowLimit; - float fInvMassCompetingUpLimit; + float fInvMassLowLimitOmega; + float fInvMassUpLimitOmega; - bool isCascOmega; + /*float fRejectCompetingMass; + float fInvMassCompetingLowLimit; + float fInvMassCompetingUpLimit;*/ // float nSigmaPIDOffsetTPC; @@ -284,7 +287,7 @@ class FemtoUniverseCascadeSelection }; // namespace femto_universe template -void FemtoUniverseCascadeSelection::init(HistogramRegistry* registry, bool isSelectCascOmega) +void FemtoUniverseCascadeSelection::init(HistogramRegistry* registry) { if (registry) { @@ -334,7 +337,8 @@ void FemtoUniverseCascadeSelection::init(HistogramRegistry* registry, bool isSel // Cascade (Xi, Omega) // mHistogramRegistry->add("CascadeQA/hInvMassCascadeNoCuts", "No cuts", kTH1F, {massAxisCascade}); - mHistogramRegistry->add("CascadeQA/hInvMassCascadeCut", "Invariant mass with cut", kTH1F, {massAxisCascade}); + mHistogramRegistry->add("CascadeQA/hInvMassXiCut", "Invariant mass with cut", kTH1F, {massAxisCascade}); + mHistogramRegistry->add("CascadeQA/hInvMassOmegaCut", "Invariant mass with cut", kTH1F, {massAxisCascade}); mHistogramRegistry->add("CascadeQA/hCascadePt", "pT distribution", kTH1F, {ptAxis}); mHistogramRegistry->add("CascadeQA/hCascadeEta", "Eta distribution", kTH1F, {etaAxis}); mHistogramRegistry->add("CascadeQA/hCascadePhi", "Phi distribution", kTH1F, {phiAxis}); @@ -406,8 +410,6 @@ void FemtoUniverseCascadeSelection::init(HistogramRegistry* registry, bool isSel femto_universe_selection::kLowerLimit); fV0InvMassUpLimit = getMinimalSelection(femto_universe_cascade_selection::kCascadeV0MassMax, femto_universe_selection::kUpperLimit); - - isCascOmega = isSelectCascOmega; } template @@ -427,21 +429,23 @@ bool FemtoUniverseCascadeSelection::isSelectedMinimal(Col const& col, Casc const const float cpaCasc = cascade.casccosPA(col.posX(), col.posY(), col.posZ()); const float dcav0topv = cascade.dcav0topv(col.posX(), col.posY(), col.posZ()); const float invMassLambda = cascade.mLambda(); - const float invMass = isCascOmega ? cascade.mOmega() : cascade.mXi(); + const float invMassXi = cascade.mXi(); + const float invMassOmega = cascade.mOmega(); if (invMassLambda < fV0InvMassLowLimit || invMassLambda > fV0InvMassUpLimit) { return false; } - if (invMass < fInvMassLowLimit || invMass > fInvMassUpLimit) { + // Accepts the cascade candidates as either Xi or Omega but not both + if ((invMassXi < fInvMassLowLimitXi || invMassXi > fInvMassUpLimitXi) == (invMassOmega < fInvMassLowLimitOmega || invMassOmega > fInvMassUpLimitOmega)) { return false; } - if (fRejectCompetingMass) { + /*if (fRejectCompetingMass) { const float invMassCompeting = isCascOmega ? cascade.mXi() : cascade.mOmega(); if (invMassCompeting > fInvMassCompetingLowLimit && invMassCompeting < fInvMassCompetingUpLimit) { return false; } - } + }*/ if (nPtCascadeMinSel > 0 && cascade.pt() < pTCascadeMin) { return false; } @@ -537,10 +541,12 @@ void FemtoUniverseCascadeSelection::fillCascadeQA(Col const& col, Casc const& ca const float dcav0topv = cascade.dcav0topv(col.posX(), col.posY(), col.posZ()); const float invMassLambda = cascade.mLambda(); - const float invMass = isCascOmega ? cascade.mOmega() : cascade.mXi(); + const float invMassXi = cascade.mXi(); + const float invMassOmega = cascade.mOmega(); mHistogramRegistry->fill(HIST("CascadeQA/hInvMassV0Cut"), invMassLambda); - mHistogramRegistry->fill(HIST("CascadeQA/hInvMassCascadeCut"), invMass); + mHistogramRegistry->fill(HIST("CascadeQA/hInvMassXiCut"), invMassXi); + mHistogramRegistry->fill(HIST("CascadeQA/hInvMassOmegaCut"), invMassOmega); mHistogramRegistry->fill(HIST("CascadeQA/hCascadePt"), cascade.pt()); mHistogramRegistry->fill(HIST("CascadeQA/hCascadeEta"), cascade.eta()); mHistogramRegistry->fill(HIST("CascadeQA/hCascadePhi"), cascade.phi()); diff --git a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx index f80b8090971..93889d7d1ff 100644 --- a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx +++ b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx @@ -143,7 +143,6 @@ struct FemtoUniverseProducerTask { Configurable confIsActivateV0{"confIsActivateV0", false, "Activate filling of V0 into femtouniverse tables"}; Configurable confActivateSecondaries{"confActivateSecondaries", false, "Fill secondary MC gen particles that were reconstructed"}; Configurable confIsActivateCascade{"confIsActivateCascade", false, "Activate filling of Cascade into femtouniverse tables"}; - Configurable confIsSelectCascOmega{"confIsSelectCascOmega", false, "Select Omegas for cascade analysis"}; Configurable confIsActivatePhi{"confIsActivatePhi", false, "Activate filling of Phi into femtouniverse tables"}; Configurable confIsActiveD0{"confIsActiveD0", false, "Activate filling FU tables for D0/D0bar mesons"}; Configurable confMCTruthAnalysisWithPID{"confMCTruthAnalysisWithPID", true, "1: take only particles with specified PDG, 0: all particles (for MC Truth)"}; @@ -276,12 +275,14 @@ struct FemtoUniverseProducerTask { Configurable> confCascChildPIDnSigmaMax{"confCascChildPIDnSigmaMax", std::vector{3.f, 4.f}, "Cascade Child sel: Max. PID nSigma TPC"}; Configurable> confCascChildPIDspecies{"confCascChildPIDspecies", std::vector{o2::track::PID::Pion, o2::track::PID::Proton}, "Cascade Child sel: particle species for PID"}; - Configurable confCascInvMassLowLimit{"confCascInvMassLowLimit", 1.25, "Lower limit of the cascade invariant mass"}; - Configurable confCascInvMassUpLimit{"confCascInvMassUpLimit", 1.40, "Upper limit of the cascade invariant mass"}; + Configurable confXiInvMassLowLimit{"confXiInvMassLowLimit", 1.25, "Lower limit of the Xi invariant mass"}; + Configurable confXiInvMassUpLimit{"confXiInvMassUpLimit", 1.40, "Upper limit of the Xi invariant mass"}; + Configurable confOmegaInvMassLowLimit{"confOmegaInvMassLowLimit", 1.60, "Lower limit of the Omega invariant mass"}; + Configurable confOmegaInvMassUpLimit{"confOmegaInvMassUpLimit", 1.80, "Upper limit of the Omega invariant mass"}; - Configurable confCascRejectCompetingMass{"confCascRejectCompetingMass", false, "Switch on to reject Omegas (for Xi) or Xis (for Omegas)"}; - Configurable confCascInvCompetingMassLowLimit{"confCascInvCompetingMassLowLimit", 1.66, "Lower limit of the cascade invariant mass for competing mass rejection"}; - Configurable confCascInvCompetingMassUpLimit{"confCascInvCompetingMassUpLimit", 1.68, "Upper limit of the cascade invariant mass for competing mass rejection"}; + // Configurable confCascRejectCompetingMass{"confCascRejectCompetingMass", false, "Switch on to reject Omegas (for Xi) or Xis (for Omegas)"}; + // Configurable confCascInvCompetingMassLowLimit{"confCascInvCompetingMassLowLimit", 1.66, "Lower limit of the cascade invariant mass for competing mass rejection"}; + // Configurable confCascInvCompetingMassUpLimit{"confCascInvCompetingMassUpLimit", 1.68, "Upper limit of the cascade invariant mass for competing mass rejection"}; } ConfCascadeSelection; // PHI @@ -544,13 +545,13 @@ struct FemtoUniverseProducerTask { cascadeCuts.setChildPIDSpecies(femto_universe_cascade_selection::kBachTrack, ConfCascadeSelection.confCascChildPIDspecies); // check if works correctly for bachelor track - cascadeCuts.init(&cascadeQaRegistry, confIsSelectCascOmega); + cascadeCuts.init(&cascadeQaRegistry); // invmass cuts - cascadeCuts.setInvMassLimits(ConfCascadeSelection.confCascInvMassLowLimit, ConfCascadeSelection.confCascInvMassUpLimit); + cascadeCuts.setInvMassLimits(ConfCascadeSelection.confXiInvMassLowLimit, ConfCascadeSelection.confOmegaInvMassLowLimit, ConfCascadeSelection.confXiInvMassUpLimit, ConfCascadeSelection.confOmegaInvMassUpLimit); - if (ConfCascadeSelection.confCascRejectCompetingMass) { + /*if (ConfCascadeSelection.confCascRejectCompetingMass) { cascadeCuts.setCompetingInvMassLimits(ConfCascadeSelection.confCascInvCompetingMassLowLimit, ConfCascadeSelection.confCascInvCompetingMassUpLimit); - } + }*/ } if (confIsActivatePhi) { @@ -1259,8 +1260,8 @@ struct FemtoUniverseProducerTask { 0, 0, indexCascChildID, - confIsSelectCascOmega ? casc.mOmega() : casc.mXi(), - confIsSelectCascOmega ? casc.mOmega() : casc.mXi(), + casc.mXi(), + casc.mOmega(), casc.dcaV0daughters(), casc.v0cosPA(col.posX(), col.posY(), col.posZ()), casc.v0radius(), From fa2aff19cd1e487742f3b4ee8e0bbfe8a56f3904 Mon Sep 17 00:00:00 2001 From: Adrian Sevcenco Date: Thu, 8 May 2025 14:08:44 +0300 Subject: [PATCH 1220/1650] [Common] [Common]::CCDB:: add RCTSelectionFlags.h as header only library (#11127) --- Common/CCDB/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Common/CCDB/CMakeLists.txt b/Common/CCDB/CMakeLists.txt index 52f4ec8ffde..21a2c31877e 100644 --- a/Common/CCDB/CMakeLists.txt +++ b/Common/CCDB/CMakeLists.txt @@ -21,3 +21,6 @@ o2physics_target_root_dictionary(AnalysisCCDB HEADERS ctpRateFetcher.h HEADERS RCTSelectionFlags.h LINKDEF AnalysisCCDBLinkDef.h) + +o2physics_add_header_only_library(RCTSelectionFlags + HEADERS RCTSelectionFlags.h) From 0c6e526094c09a704156474ab9b13be412839d13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Thu, 8 May 2025 15:20:10 +0200 Subject: [PATCH 1221/1650] [ALICE3] A3TOF: Add TOF ev time effinciency (#11129) --- ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx b/ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx index 435b616d927..7b515edd08a 100644 --- a/ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx +++ b/ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx @@ -55,6 +55,8 @@ #include "DetectorsVertexing/HelixHelper.h" #include "TableHelper.h" #include "ALICE3/Core/DelphesO2TrackSmearer.h" +#include "TEfficiency.h" +#include "THashList.h" using namespace o2; using namespace o2::framework; @@ -117,6 +119,8 @@ struct OnTheFlyTofPid { Configurable nBinsTimeRes{"nBinsTimeRes", 400, "number of bins plots time resolution"}; Configurable nBinsRelativeEtaPt{"nBinsRelativeEtaPt", 400, "number of bins plots pt and eta relative errors"}; Configurable nBinsEta{"nBinsEta", 400, "number of bins plot relative eta error"}; + Configurable nBinsMult{"nBinsMult", 200, "number of bins in multiplicity"}; + Configurable maxMultRange{"maxMultRange", 1000.f, "upper limit in multiplicity plots"}; } plotsConfig; o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; @@ -129,6 +133,7 @@ struct OnTheFlyTofPid { // for handling basic QA histograms if requested HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + OutputObj listEfficiency{"efficiency"}; static constexpr int kParticles = 5; void init(o2::framework::InitContext& initContext) @@ -179,13 +184,16 @@ struct OnTheFlyTofPid { } if (plotsConfig.doQAplots) { - const AxisSpec axisdNdeta{200, 0.0f, 1000.0f, Form("dN/d#eta in |#eta| < %f", simConfig.multiplicityEtaRange.value)}; + const AxisSpec axisdNdeta{plotsConfig.nBinsMult, 0.0f, plotsConfig.maxMultRange, Form("dN/d#eta in |#eta| < %f", simConfig.multiplicityEtaRange.value)}; histos.add("h1dNdeta", "h2dNdeta", kTH1F, {axisdNdeta}); histos.add("h2dEventTime", "h2dEventTime", kTH2F, {{200, -1000, 1000, "computed"}, {200, -1000, 1000, "generated"}}); histos.add("h1dEventTimegen", "h1dEventTimegen", kTH1F, {{200, -1000, 1000, "generated"}}); histos.add("h1dEventTimerec", "h1dEventTimerec", kTH1F, {{200, -1000, 1000, "computed"}}); + histos.add("h1dEventTimedelta", "h1dEventTimedelta", kTH1F, {{200, -1000, 1000, "generated - computed"}}); histos.add("h2dEventTimeres", "h2dEventTimeres", kTH2F, {axisdNdeta, {300, 0, 300, "resolution"}}); + listEfficiency.setObject(new THashList); + listEfficiency->Add(new TEfficiency("effEventTime", "effEventTime", plotsConfig.nBinsMult, 0.0f, plotsConfig.maxMultRange)); const AxisSpec axisMomentum{static_cast(plotsConfig.nBinsP), 0.0f, +10.0f, "#it{p} (GeV/#it{c})"}; const AxisSpec axisMomentumSmall{static_cast(plotsConfig.nBinsP), 0.0f, +1.0f, "#it{p} (GeV/#it{c})"}; @@ -564,8 +572,9 @@ struct OnTheFlyTofPid { // Now we compute the event time for the tracks std::array tzero = {0.f, 0.f}; + bool etStatus = false; if (simConfig.considerEventTime.value) { - const bool etStatus = eventTime(tracksWithTime, tzero); + etStatus = eventTime(tracksWithTime, tzero); if (!etStatus) { LOG(warning) << "Event time calculation failed with " << tracksWithTime.size() << " tracks"; } @@ -576,6 +585,10 @@ struct OnTheFlyTofPid { histos.fill(HIST("h1dEventTimegen"), eventCollisionTimePS); histos.fill(HIST("h1dEventTimerec"), tzero[0]); histos.fill(HIST("h2dEventTimeres"), dNdEta, tzero[1]); + if (etStatus) { + histos.fill(HIST("h1dEventTimedelta"), eventCollisionTimePS - tzero[0]); + } + static_cast(listEfficiency->At(0))->Fill(etStatus, dNdEta); } // Then we do a second loop to compute the measured quantities with the measured event time From 7d6e8832dd03d62efde13dba26bfcffd61d73f80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Thu, 8 May 2025 17:21:28 +0200 Subject: [PATCH 1222/1650] [PWGHF] Add Lb reduced workflow into the framework (#10978) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ALICE Action Bot Co-authored-by: Fabrizio Co-authored-by: Vít Kučera --- PWGHF/Core/HfHelper.h | 81 ++ PWGHF/Core/HfMlResponseLbToLcPi.h | 197 +++++ PWGHF/D2H/DataModel/ReducedDataModel.h | 169 +++- PWGHF/D2H/TableProducer/CMakeLists.txt | 17 +- .../candidateCreatorLbReduced.cxx | 346 ++++++++ .../candidateSelectorLbToLcPiReduced.cxx | 252 ++++++ .../converterReducedHadronDausPid.cxx | 53 ++ .../dataCreatorCharmHadPiReduced.cxx | 527 ++++++++--- PWGHF/D2H/Tasks/CMakeLists.txt | 5 + PWGHF/D2H/Tasks/taskLbReduced.cxx | 824 ++++++++++++++++++ .../DataModel/CandidateReconstructionTables.h | 18 +- PWGHF/DataModel/CandidateSelectionTables.h | 6 +- 12 files changed, 2384 insertions(+), 111 deletions(-) create mode 100644 PWGHF/Core/HfMlResponseLbToLcPi.h create mode 100644 PWGHF/D2H/TableProducer/candidateCreatorLbReduced.cxx create mode 100644 PWGHF/D2H/TableProducer/candidateSelectorLbToLcPiReduced.cxx create mode 100644 PWGHF/D2H/TableProducer/converterReducedHadronDausPid.cxx create mode 100644 PWGHF/D2H/Tasks/taskLbReduced.cxx diff --git a/PWGHF/Core/HfHelper.h b/PWGHF/Core/HfHelper.h index 7b723769d85..929fd2ba256 100644 --- a/PWGHF/Core/HfHelper.h +++ b/PWGHF/Core/HfHelper.h @@ -958,6 +958,87 @@ class HfHelper return true; } + /// Apply topological cuts as defined in SelectorCuts.h + /// \param candLb Lb candidate + /// \param cuts Lb candidate selection per pT bin" + /// \param binsPt pT bin limits + /// \return true if candidate passes all selections + template + bool selectionLbToLcPiTopol(const T1& candLb, const T2& cuts, const T3& binsPt) + { + auto ptCandLb = candLb.pt(); + auto ptLc = candLb.ptProng0(); + auto ptPi = candLb.ptProng1(); + + int pTBin = o2::analysis::findBin(binsPt, ptCandLb); + if (pTBin == -1) { + return false; + } + + // Lb mass cut + if (std::abs(invMassLbToLcPi(candLb) - o2::constants::physics::MassLambdaB0) > cuts->get(pTBin, "m")) { + return false; + } + + // pion pt + if (ptPi < cuts->get(pTBin, "pT Pi")) { + return false; + } + + // Lc pt + if (ptLc < cuts->get(pTBin, "pT Lc")) { + return false; + } + + // Lb Decay length + if (candLb.decayLength() < cuts->get(pTBin, "Lb decLen")) { + return false; + } + + // Lb Decay length XY + if (candLb.decayLengthXY() < cuts->get(pTBin, "Lb decLenXY")) { + return false; + } + + // Lb chi2PCA cut + if (candLb.chi2PCA() > cuts->get(pTBin, "Chi2PCA")) { + return false; + } + + // Lb CPA cut + if (candLb.cpa() < cuts->get(pTBin, "CPA")) { + return false; + } + + // d0 of pi + if (std::abs(candLb.impactParameter1()) < cuts->get(pTBin, "d0 Pi")) { + return false; + } + + // d0 of Lc + if (std::abs(candLb.impactParameter0()) < cuts->get(pTBin, "d0 Lc")) { + return false; + } + + return true; + } + + /// \param pidTrackPi PID status of trackPi (prong1 of Lb candidate) + /// \param acceptPIDNotApplicable switch to accept Status::NotApplicable + /// \return true if prong1 of Lb candidate passes all selections + template + bool selectionLbToLcPiPid(const T1& pidTrackPi, const T2& acceptPIDNotApplicable) + { + if (!acceptPIDNotApplicable && pidTrackPi != TrackSelectorPID::Accepted) { + return false; + } + if (acceptPIDNotApplicable && pidTrackPi == TrackSelectorPID::Rejected) { + return false; + } + + return true; + } + /// Apply selection on ML scores for charm-hadron daughter in b-hadron decays (common for all the beauty channels) /// \param cuts ML score selection per bin of charm-hadron pT /// \param binsPtC pT bin limits of charm hadron diff --git a/PWGHF/Core/HfMlResponseLbToLcPi.h b/PWGHF/Core/HfMlResponseLbToLcPi.h new file mode 100644 index 00000000000..a421f9019d4 --- /dev/null +++ b/PWGHF/Core/HfMlResponseLbToLcPi.h @@ -0,0 +1,197 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file HfMlResponseLbToLcPi.h +/// \brief Class to compute the ML response for Lb → Lc∓ π± analysis selections +/// \author Biao Zhang , Heidelberg University + +#ifndef PWGHF_CORE_HFMLRESPONSELBTOLCPI_H_ +#define PWGHF_CORE_HFMLRESPONSELBTOLCPI_H_ + +#include +#include +#include + +#include "PWGHF/Core/HfMlResponse.h" +#include "PWGHF/D2H/Utils/utilsRedDataFormat.h" + +// Fill the map of available input features +// the key is the feature's name (std::string) +// the value is the corresponding value in EnumInputFeatures +#define FILL_MAP_LB(FEATURE) \ + { \ + #FEATURE, static_cast(InputFeaturesLbToLcPi::FEATURE) \ + } + +// Check if the index of mCachedIndices (index associated to a FEATURE) +// matches the entry in EnumInputFeatures associated to this FEATURE +// if so, the inputFeatures vector is filled with the FEATURE's value +// by calling the corresponding GETTER from OBJECT +#define CHECK_AND_FILL_VEC_LB_FULL(OBJECT, FEATURE, GETTER) \ + case static_cast(InputFeaturesLbToLcPi::FEATURE): { \ + inputFeatures.emplace_back(OBJECT.GETTER()); \ + break; \ + } + +// Check if the index of mCachedIndices (index associated to a FEATURE) +// matches the entry in EnumInputFeatures associated to this FEATURE +// if so, the inputFeatures vector is filled with the FEATURE's value +// by calling the GETTER function taking OBJECT in argument +#define CHECK_AND_FILL_VEC_LB_FUNC(OBJECT, FEATURE, GETTER) \ + case static_cast(InputFeaturesLbToLcPi::FEATURE): { \ + inputFeatures.emplace_back(GETTER(OBJECT)); \ + break; \ + } + +// Specific case of (OBJECT, FEATURE, GETTER) +// where OBJECT is named candidate and FEATURE = GETTER +#define CHECK_AND_FILL_VEC_LB(GETTER) \ + case static_cast(InputFeaturesLbToLcPi::GETTER): { \ + inputFeatures.emplace_back(candidate.GETTER()); \ + break; \ + } + +namespace o2::analysis +{ + +enum class InputFeaturesLbToLcPi : uint8_t { + ptProng0 = 0, + ptProng1, + impactParameter0, + impactParameter1, + impactParameterProduct, + chi2PCA, + decayLength, + decayLengthXY, + decayLengthNormalised, + decayLengthXYNormalised, + cpa, + cpaXY, + maxNormalisedDeltaIP, + prong0MlScoreBkg, + prong0MlScorePrompt, + prong0MlScoreNonprompt, + tpcNSigmaPi1, + tofNSigmaPi1, + tpcTofNSigmaPi1 +}; + +template +class HfMlResponseLbToLcPi : public HfMlResponse +{ + public: + /// Default constructor + HfMlResponseLbToLcPi() = default; + /// Default destructor + virtual ~HfMlResponseLbToLcPi() = default; + + /// Method to get the input features vector needed for ML inference + /// \param candidate is the Lb candidate + /// \param prong1 is the candidate's prong1 + /// \return inputFeatures vector + template + std::vector getInputFeatures(T1 const& candidate, + T2 const& prong1) + { + std::vector inputFeatures; + + for (const auto& idx : MlResponse::mCachedIndices) { + if constexpr (withDmesMl) { + switch (idx) { + CHECK_AND_FILL_VEC_LB(ptProng0); + CHECK_AND_FILL_VEC_LB(ptProng1); + CHECK_AND_FILL_VEC_LB(impactParameter0); + CHECK_AND_FILL_VEC_LB(impactParameter1); + CHECK_AND_FILL_VEC_LB(impactParameterProduct); + CHECK_AND_FILL_VEC_LB(chi2PCA); + CHECK_AND_FILL_VEC_LB(decayLength); + CHECK_AND_FILL_VEC_LB(decayLengthXY); + CHECK_AND_FILL_VEC_LB(decayLengthNormalised); + CHECK_AND_FILL_VEC_LB(decayLengthXYNormalised); + CHECK_AND_FILL_VEC_LB(cpa); + CHECK_AND_FILL_VEC_LB(cpaXY); + CHECK_AND_FILL_VEC_LB(maxNormalisedDeltaIP); + CHECK_AND_FILL_VEC_LB(prong0MlScoreBkg); + CHECK_AND_FILL_VEC_LB(prong0MlScorePrompt); + CHECK_AND_FILL_VEC_LB(prong0MlScoreNonprompt); + // TPC PID variable + CHECK_AND_FILL_VEC_LB_FULL(prong1, tpcNSigmaPi1, tpcNSigmaPi); + // TOF PID variable + CHECK_AND_FILL_VEC_LB_FULL(prong1, tofNSigmaPi1, tofNSigmaPi); + // Combined PID variables + CHECK_AND_FILL_VEC_LB_FUNC(prong1, tpcTofNSigmaPi1, o2::pid_tpc_tof_utils::getTpcTofNSigmaPi1); + } + } else { + switch (idx) { + CHECK_AND_FILL_VEC_LB(ptProng0); + CHECK_AND_FILL_VEC_LB(ptProng1); + CHECK_AND_FILL_VEC_LB(impactParameter0); + CHECK_AND_FILL_VEC_LB(impactParameter1); + CHECK_AND_FILL_VEC_LB(impactParameterProduct); + CHECK_AND_FILL_VEC_LB(chi2PCA); + CHECK_AND_FILL_VEC_LB(decayLength); + CHECK_AND_FILL_VEC_LB(decayLengthXY); + CHECK_AND_FILL_VEC_LB(decayLengthNormalised); + CHECK_AND_FILL_VEC_LB(decayLengthXYNormalised); + CHECK_AND_FILL_VEC_LB(cpa); + CHECK_AND_FILL_VEC_LB(cpaXY); + CHECK_AND_FILL_VEC_LB(maxNormalisedDeltaIP); + // TPC PID variable + CHECK_AND_FILL_VEC_LB_FULL(prong1, tpcNSigmaPi1, tpcNSigmaPi); + // TOF PID variable + CHECK_AND_FILL_VEC_LB_FULL(prong1, tofNSigmaPi1, tofNSigmaPi); + // Combined PID variables + CHECK_AND_FILL_VEC_LB_FUNC(prong1, tpcTofNSigmaPi1, o2::pid_tpc_tof_utils::getTpcTofNSigmaPi1); + } + } + } + + return inputFeatures; + } + + protected: + /// Method to fill the map of available input features + void setAvailableInputFeatures() + { + MlResponse::mAvailableInputFeatures = { + FILL_MAP_LB(ptProng0), + FILL_MAP_LB(ptProng1), + FILL_MAP_LB(impactParameter0), + FILL_MAP_LB(impactParameter1), + FILL_MAP_LB(impactParameterProduct), + FILL_MAP_LB(chi2PCA), + FILL_MAP_LB(decayLength), + FILL_MAP_LB(decayLengthXY), + FILL_MAP_LB(decayLengthNormalised), + FILL_MAP_LB(decayLengthXYNormalised), + FILL_MAP_LB(cpa), + FILL_MAP_LB(cpaXY), + FILL_MAP_LB(maxNormalisedDeltaIP), + FILL_MAP_LB(prong0MlScoreBkg), + FILL_MAP_LB(prong0MlScorePrompt), + FILL_MAP_LB(prong0MlScoreNonprompt), + // TPC PID variable + FILL_MAP_LB(tpcNSigmaPi1), + // TOF PID variable + FILL_MAP_LB(tofNSigmaPi1), + // Combined PID variable + FILL_MAP_LB(tpcTofNSigmaPi1)}; + } +}; + +} // namespace o2::analysis + +#undef FILL_MAP_LB +#undef CHECK_AND_FILL_VEC_LB_FULL +#undef CHECK_AND_FILL_VEC_LB_FUNC +#undef CHECK_AND_FILL_VEC_LB + +#endif // PWGHF_CORE_HFMLRESPONSELBTOLCPI_H_ diff --git a/PWGHF/D2H/DataModel/ReducedDataModel.h b/PWGHF/D2H/DataModel/ReducedDataModel.h index e902d1de8e3..c53be707ca6 100644 --- a/PWGHF/D2H/DataModel/ReducedDataModel.h +++ b/PWGHF/D2H/DataModel/ReducedDataModel.h @@ -18,6 +18,7 @@ /// \author Fabio Catalano , CERN /// \author Fabrizio Grosa , CERN /// \author Luca Aglietta , Università degli Studi di Torino (UniTO) +/// \author Biao Zhang , Heidelberg University #ifndef PWGHF_D2H_DATAMODEL_REDUCEDDATAMODEL_H_ #define PWGHF_D2H_DATAMODEL_REDUCEDDATAMODEL_H_ @@ -213,12 +214,18 @@ DECLARE_SOA_COLUMN(TPCNSigmaPiProng2, tpcNSigmaPiProng2, float); //! NsigmaTPCPi DECLARE_SOA_COLUMN(TPCNSigmaKaProng0, tpcNSigmaKaProng0, float); //! NsigmaTPCKa for prong0, o2-linter: disable=name/o2-column (written to disk) DECLARE_SOA_COLUMN(TPCNSigmaKaProng1, tpcNSigmaKaProng1, float); //! NsigmaTPCKa for prong1, o2-linter: disable=name/o2-column (written to disk) DECLARE_SOA_COLUMN(TPCNSigmaKaProng2, tpcNSigmaKaProng2, float); //! NsigmaTPCKa for prong2, o2-linter: disable=name/o2-column (written to disk) +DECLARE_SOA_COLUMN(TPCNSigmaPrProng0, tpcNSigmaPrProng0, float); //! NsigmaTPCPr for prong0, o2-linter: disable=name/o2-column (written to disk) +DECLARE_SOA_COLUMN(TPCNSigmaPrProng1, tpcNSigmaPrProng1, float); //! NsigmaTPCPr for prong1, o2-linter: disable=name/o2-column (written to disk) +DECLARE_SOA_COLUMN(TPCNSigmaPrProng2, tpcNSigmaPrProng2, float); //! NsigmaTPCPr for prong2, o2-linter: disable=name/o2-column (written to disk) DECLARE_SOA_COLUMN(TOFNSigmaPiProng0, tofNSigmaPiProng0, float); //! NsigmaTOFPi for prong0, o2-linter: disable=name/o2-column (written to disk) DECLARE_SOA_COLUMN(TOFNSigmaPiProng1, tofNSigmaPiProng1, float); //! NsigmaTOFPi for prong1, o2-linter: disable=name/o2-column (written to disk) DECLARE_SOA_COLUMN(TOFNSigmaPiProng2, tofNSigmaPiProng2, float); //! NsigmaTOFPi for prong2, o2-linter: disable=name/o2-column (written to disk) DECLARE_SOA_COLUMN(TOFNSigmaKaProng0, tofNSigmaKaProng0, float); //! NsigmaTOFKa for prong0, o2-linter: disable=name/o2-column (written to disk) DECLARE_SOA_COLUMN(TOFNSigmaKaProng1, tofNSigmaKaProng1, float); //! NsigmaTOFKa for prong1, o2-linter: disable=name/o2-column (written to disk) DECLARE_SOA_COLUMN(TOFNSigmaKaProng2, tofNSigmaKaProng2, float); //! NsigmaTOFKa for prong2, o2-linter: disable=name/o2-column (written to disk) +DECLARE_SOA_COLUMN(TOFNSigmaPrProng0, tofNSigmaPrProng0, float); //! NsigmaTOFPr for prong0, o2-linter: disable=name/o2-column (written to disk) +DECLARE_SOA_COLUMN(TOFNSigmaPrProng1, tofNSigmaPrProng1, float); //! NsigmaTOFPr for prong1, o2-linter: disable=name/o2-column (written to disk) +DECLARE_SOA_COLUMN(TOFNSigmaPrProng2, tofNSigmaPrProng2, float); //! NsigmaTOFPr for prong2, o2-linter: disable=name/o2-column (written to disk) // dynamic columns DECLARE_SOA_DYNAMIC_COLUMN(TPCTOFNSigmaPi, tpcTofNSigmaPi, //! Combination of NsigmaTPC and NsigmaTOF, o2-linter: disable=name/o2-column (written to disk) [](float tpcNSigmaPi, float tofNSigmaPi) -> float { return pid_tpc_tof_utils::combineNSigma(tpcNSigmaPi, tofNSigmaPi); }); @@ -238,6 +245,12 @@ DECLARE_SOA_DYNAMIC_COLUMN(TPCTOFNSigmaKaProng1, tpcTofNSigmaKaProng1, //! Combi [](float tpcNSigmaKa, float tofNSigmaKa) -> float { return pid_tpc_tof_utils::combineNSigma(tpcNSigmaKa, tofNSigmaKa); }); DECLARE_SOA_DYNAMIC_COLUMN(TPCTOFNSigmaKaProng2, tpcTofNSigmaKaProng2, //! Combination of NsigmaTPC and NsigmaTOF, o2-linter: disable=name/o2-column (written to disk) [](float tpcNSigmaKa, float tofNSigmaKa) -> float { return pid_tpc_tof_utils::combineNSigma(tpcNSigmaKa, tofNSigmaKa); }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCTOFNSigmaPrProng0, tpcTofNSigmaPrProng0, //! Combination of NsigmaTPC and NsigmaTOF, o2-linter: disable=name/o2-column (written to disk) + [](float tpcNSigmaPr, float tofNSigmaPr) -> float { return pid_tpc_tof_utils::combineNSigma(tpcNSigmaPr, tofNSigmaPr); }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCTOFNSigmaPrProng1, tpcTofNSigmaPrProng1, //! Combination of NsigmaTPC and NsigmaTOF, o2-linter: disable=name/o2-column (written to disk) + [](float tpcNSigmaPr, float tofNSigmaPr) -> float { return pid_tpc_tof_utils::combineNSigma(tpcNSigmaPr, tofNSigmaPr); }); +DECLARE_SOA_DYNAMIC_COLUMN(TPCTOFNSigmaPrProng2, tpcTofNSigmaPrProng2, //! Combination of NsigmaTPC and NsigmaTOF, o2-linter: disable=name/o2-column (written to disk) + [](float tpcNSigmaPr, float tofNSigmaPr) -> float { return pid_tpc_tof_utils::combineNSigma(tpcNSigmaPr, tofNSigmaPr); }); } // namespace hf_track_pid_reduced // CAREFUL: need to follow convention [Name = Description + 's'] in DECLARE_SOA_TABLE(Name, "AOD", Description) @@ -351,7 +364,7 @@ DECLARE_SOA_TABLE_VERSIONED(HfRed3ProngsMl_001, "AOD", "HFRED3PRONGML", 1, //! T using HfRed3ProngsMl = HfRed3ProngsMl_001; -DECLARE_SOA_TABLE(HfRedPidDau0s, "AOD", "HFREDPIDDAU0", //! +DECLARE_SOA_TABLE(HfRedPidDau0s_000, "AOD", "HFREDPIDDAU0", //! hf_track_pid_reduced::TPCNSigmaPiProng0, hf_track_pid_reduced::TOFNSigmaPiProng0, hf_track_pid_reduced::TPCNSigmaKaProng0, @@ -361,7 +374,7 @@ DECLARE_SOA_TABLE(HfRedPidDau0s, "AOD", "HFREDPIDDAU0", //! hf_track_pid_reduced::TPCTOFNSigmaPiProng0, hf_track_pid_reduced::TPCTOFNSigmaKaProng0); -DECLARE_SOA_TABLE(HfRedPidDau1s, "AOD", "HFREDPIDDAU1", //! +DECLARE_SOA_TABLE(HfRedPidDau1s_000, "AOD", "HFREDPIDDAU1", //! hf_track_pid_reduced::TPCNSigmaPiProng1, hf_track_pid_reduced::TOFNSigmaPiProng1, hf_track_pid_reduced::TPCNSigmaKaProng1, @@ -371,7 +384,7 @@ DECLARE_SOA_TABLE(HfRedPidDau1s, "AOD", "HFREDPIDDAU1", //! hf_track_pid_reduced::TPCTOFNSigmaPiProng1, hf_track_pid_reduced::TPCTOFNSigmaKaProng1); -DECLARE_SOA_TABLE(HfRedPidDau2s, "AOD", "HFREDPIDDAU2", //! +DECLARE_SOA_TABLE(HfRedPidDau2s_000, "AOD", "HFREDPIDDAU2", //! hf_track_pid_reduced::TPCNSigmaPiProng2, hf_track_pid_reduced::TOFNSigmaPiProng2, hf_track_pid_reduced::TPCNSigmaKaProng2, @@ -381,6 +394,55 @@ DECLARE_SOA_TABLE(HfRedPidDau2s, "AOD", "HFREDPIDDAU2", //! hf_track_pid_reduced::TPCTOFNSigmaPiProng2, hf_track_pid_reduced::TPCTOFNSigmaKaProng2); +DECLARE_SOA_TABLE_VERSIONED(HfRedPidDau0s_001, "AOD", "HFREDPIDDAU0", 1, //! + hf_track_pid_reduced::TPCNSigmaPiProng0, + hf_track_pid_reduced::TOFNSigmaPiProng0, + hf_track_pid_reduced::TPCNSigmaKaProng0, + hf_track_pid_reduced::TOFNSigmaKaProng0, + hf_track_pid_reduced::TPCNSigmaPrProng0, + hf_track_pid_reduced::TOFNSigmaPrProng0, + hf_track_vars_reduced::HasTOFProng0, + hf_track_vars_reduced::HasTPCProng0, + hf_track_pid_reduced::TPCTOFNSigmaPiProng0, + hf_track_pid_reduced::TPCTOFNSigmaKaProng0, + hf_track_pid_reduced::TPCTOFNSigmaPrProng0, + o2::soa::Marker<1>); + +DECLARE_SOA_TABLE_VERSIONED(HfRedPidDau1s_001, "AOD", "HFREDPIDDAU1", 1, //! + hf_track_pid_reduced::TPCNSigmaPiProng1, + hf_track_pid_reduced::TOFNSigmaPiProng1, + hf_track_pid_reduced::TPCNSigmaKaProng1, + hf_track_pid_reduced::TOFNSigmaKaProng1, + hf_track_pid_reduced::TPCNSigmaPrProng1, + hf_track_pid_reduced::TOFNSigmaPrProng1, + hf_track_vars_reduced::HasTOFProng1, + hf_track_vars_reduced::HasTPCProng1, + hf_track_pid_reduced::TPCTOFNSigmaPiProng1, + hf_track_pid_reduced::TPCTOFNSigmaKaProng1, + hf_track_pid_reduced::TPCTOFNSigmaPrProng1, + o2::soa::Marker<1>); + +DECLARE_SOA_TABLE_VERSIONED(HfRedPidDau2s_001, "AOD", "HFREDPIDDAU2", 1, //! + hf_track_pid_reduced::TPCNSigmaPiProng2, + hf_track_pid_reduced::TOFNSigmaPiProng2, + hf_track_pid_reduced::TPCNSigmaKaProng2, + hf_track_pid_reduced::TOFNSigmaKaProng2, + hf_track_pid_reduced::TPCNSigmaPrProng2, + hf_track_pid_reduced::TOFNSigmaPrProng2, + hf_track_vars_reduced::HasTOFProng2, + hf_track_vars_reduced::HasTPCProng2, + hf_track_pid_reduced::TPCTOFNSigmaPiProng2, + hf_track_pid_reduced::TPCTOFNSigmaKaProng2, + hf_track_pid_reduced::TPCTOFNSigmaPrProng2, + o2::soa::Marker<1>); + +using HfRedPidDau0s = HfRedPidDau0s_001; +using HfRedPidDau1s = HfRedPidDau1s_001; +using HfRedPidDau2s = HfRedPidDau2s_001; + +using HfRedPidDau0 = HfRedPidDau0s::iterator; +using HfRedPidDau1 = HfRedPidDau1s::iterator; +using HfRedPidDau2 = HfRedPidDau2s::iterator; // Beauty candidates prongs namespace hf_cand_b0_reduced { @@ -442,6 +504,26 @@ DECLARE_SOA_TABLE(HfRedBsDsMls, "AOD", "HFREDBSDSML", //! Table with ML scores f using HfRedCandBs = soa::Join; +namespace hf_cand_lb_reduced +{ +DECLARE_SOA_INDEX_COLUMN_FULL(Prong0Lc, prong0Lc, int, HfRed3Prongs, "_0"); //! Prong0 index +DECLARE_SOA_INDEX_COLUMN_FULL(Prong1Track, prong1Track, int, HfRedTrackBases, "_1"); //! Prong1 index +DECLARE_SOA_COLUMN(Prong0MlScoreBkg, prong0MlScoreBkg, float); //! Bkg ML score of the Lc daughter +DECLARE_SOA_COLUMN(Prong0MlScorePrompt, prong0MlScorePrompt, float); //! Prompt ML score of the Lc daughter +DECLARE_SOA_COLUMN(Prong0MlScoreNonprompt, prong0MlScoreNonprompt, float); //! Nonprompt ML score of the Lc daughter +} // namespace hf_cand_lb_reduced + +DECLARE_SOA_TABLE(HfRedLbProngs, "AOD", "HFREDLBPRONG", //! Table with Lb daughter indices + hf_cand_lb_reduced::Prong0LcId, hf_cand_lb_reduced::Prong1TrackId); + +DECLARE_SOA_TABLE(HfRedLbLcMls, "AOD", "HFREDLBLCML", //! Table with ML scores for the Lc daughter + hf_cand_lb_reduced::Prong0MlScoreBkg, + hf_cand_lb_reduced::Prong0MlScorePrompt, + hf_cand_lb_reduced::Prong0MlScoreNonprompt, + o2::soa::Marker<1>); + +using HfRedCandLb = soa::Join; + namespace hf_b0_mc { // MC Rec @@ -689,6 +771,87 @@ DECLARE_SOA_TABLE(HfCandBsConfigs, "AOD", "HFCANDBSCONFIG", //! Table with confi hf_cand_bs_config::MySelectionFlagD, hf_cand_bs_config::MyInvMassWindowDPi); +namespace hf_lb_mc +{ +// MC Rec +DECLARE_SOA_COLUMN(PtMother, ptMother, float); //! Transverse momentum of the mother in GeV/c +// MC Gen +DECLARE_SOA_COLUMN(PtTrack, ptTrack, float); //! Transverse momentum of the track in GeV/c +DECLARE_SOA_COLUMN(YTrack, yTrack, float); //! Rapidity of the track +DECLARE_SOA_COLUMN(EtaTrack, etaTrack, float); //! Pseudorapidity of the track +DECLARE_SOA_COLUMN(PtProng0, ptProng0, float); //! Transverse momentum of the track's prong0 in GeV/c +DECLARE_SOA_COLUMN(YProng0, yProng0, float); //! Rapidity of the track's prong0 +DECLARE_SOA_COLUMN(EtaProng0, etaProng0, float); //! Pseudorapidity of the track's prong0 +DECLARE_SOA_COLUMN(PtProng1, ptProng1, float); //! Transverse momentum of the track's prong1 in GeV/c +DECLARE_SOA_COLUMN(YProng1, yProng1, float); //! Rapidity of the track's prong1 +DECLARE_SOA_COLUMN(EtaProng1, etaProng1, float); //! Pseudorapidity of the track's prong1 + +DECLARE_SOA_COLUMN(PdgCodeBeautyMother, pdgCodeBeautyMother, int); //! Pdg code of beauty mother +DECLARE_SOA_COLUMN(PdgCodeCharmMother, pdgCodeCharmMother, int); //! Pdg code of charm mother +DECLARE_SOA_COLUMN(PdgCodeProng0, pdgCodeProng0, int); //! Pdg code of prong0 +DECLARE_SOA_COLUMN(PdgCodeProng1, pdgCodeProng1, int); //! Pdg code of prong1 +DECLARE_SOA_COLUMN(PdgCodeProng2, pdgCodeProng2, int); //! Pdg code of prong2 +DECLARE_SOA_COLUMN(PdgCodeProng3, pdgCodeProng3, int); //! Pdg code of prong3 +} // namespace hf_lb_mc + +// table with results of reconstruction level MC matching +DECLARE_SOA_TABLE(HfMcRecRedLcPis, "AOD", "HFMCRECREDLCPI", //! Table with reconstructed MC information on LcPi(<-Lb) pairs for reduced workflow + hf_cand_lb_reduced::Prong0LcId, + hf_cand_lb_reduced::Prong1TrackId, + hf_cand_lb::FlagMcMatchRec, + hf_cand_lb::FlagWrongCollision, + hf_cand_lb::DebugMcRec, + hf_lb_mc::PtMother); + +DECLARE_SOA_TABLE(HfMcCheckLcPis, "AOD", "HFMCCHECKLCPI", //! Table with reconstructed MC information on LcPi(<-Lb) pairs for MC checks in reduced workflow + hf_lb_mc::PdgCodeBeautyMother, + hf_lb_mc::PdgCodeCharmMother, + hf_lb_mc::PdgCodeProng0, + hf_lb_mc::PdgCodeProng1, + hf_lb_mc::PdgCodeProng2, + hf_lb_mc::PdgCodeProng3, + o2::soa::Marker<1>); + +// Table with same size as HFCANDLc +DECLARE_SOA_TABLE(HfMcRecRedLbs, "AOD", "HFMCRECREDLB", //! Reconstruction-level MC information on Lb candidates for reduced workflow + hf_cand_lb::FlagMcMatchRec, + hf_cand_lb::FlagWrongCollision, + hf_cand_lb::DebugMcRec, + hf_lb_mc::PtMother); + +DECLARE_SOA_TABLE(HfMcCheckLbs, "AOD", "HFMCCHECKLB", //! Table with reconstructed MC information on Lb candidates for MC checks in reduced workflow + hf_lb_mc::PdgCodeBeautyMother, + hf_lb_mc::PdgCodeCharmMother, + hf_lb_mc::PdgCodeProng0, + hf_lb_mc::PdgCodeProng1, + hf_lb_mc::PdgCodeProng2, + hf_lb_mc::PdgCodeProng3, + o2::soa::Marker<2>); + +DECLARE_SOA_TABLE(HfMcGenRedLbs, "AOD", "HFMCGENREDLB", //! Generation-level MC information on Lb candidates for reduced workflow + hf_cand_lb::FlagMcMatchGen, + hf_lb_mc::PtTrack, + hf_lb_mc::YTrack, + hf_lb_mc::EtaTrack, + hf_lb_mc::PtProng0, + hf_lb_mc::YProng0, + hf_lb_mc::EtaProng0, + hf_lb_mc::PtProng1, + hf_lb_mc::YProng1, + hf_lb_mc::EtaProng1); + +// store all configurables values used in the first part of the workflow +// so we can use them in the B0 part +namespace hf_cand_lb_config +{ +DECLARE_SOA_COLUMN(MySelectionFlagLc, mySelectionFlagLc, int8_t); //! Flag to filter selected Lc baryons +DECLARE_SOA_COLUMN(MyInvMassWindowLcPi, myInvMassWindowLcPi, float); //! Half-width of the Lb invariant-mass window in GeV/c2 +} // namespace hf_cand_lb_config + +DECLARE_SOA_TABLE(HfCandLbConfigs, "AOD", "HFCANDLBCONFIG", //! Table with configurables information for reduced workflow + hf_cand_lb_config::MySelectionFlagLc, + hf_cand_lb_config::MyInvMassWindowLcPi); + // Charm resonances analysis namespace hf_reso_3_prong { diff --git a/PWGHF/D2H/TableProducer/CMakeLists.txt b/PWGHF/D2H/TableProducer/CMakeLists.txt index 92eeda51051..928359768a9 100644 --- a/PWGHF/D2H/TableProducer/CMakeLists.txt +++ b/PWGHF/D2H/TableProducer/CMakeLists.txt @@ -31,6 +31,11 @@ o2physics_add_dpl_workflow(candidate-creator-charm-reso-reduced PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(candidate-creator-lb-reduced + SOURCES candidateCreatorLbReduced.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DCAFitter + COMPONENT_NAME Analysis) + # Candidate selectors o2physics_add_dpl_workflow(candidate-selector-b0-to-d-pi-reduced @@ -48,6 +53,11 @@ o2physics_add_dpl_workflow(candidate-selector-bs-to-ds-pi-reduced PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::MLCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(candidate-selector-lb-to-lc-pi-reduced + SOURCES candidateSelectorLbToLcPiReduced.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::MLCore + COMPONENT_NAME Analysis) + # Data creators o2physics_add_dpl_workflow(data-creator-charm-had-pi-reduced @@ -65,4 +75,9 @@ o2physics_add_dpl_workflow(data-creator-charm-reso-reduced o2physics_add_dpl_workflow(converter-reduced-3-prongs-ml SOURCES converterReduced3ProngsMl.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore - COMPONENT_NAME Analysis) \ No newline at end of file + COMPONENT_NAME Analysis) + + o2physics_add_dpl_workflow(converter-reduced-hadron-daus-pid + SOURCES converterReducedHadronDausPid.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) diff --git a/PWGHF/D2H/TableProducer/candidateCreatorLbReduced.cxx b/PWGHF/D2H/TableProducer/candidateCreatorLbReduced.cxx new file mode 100644 index 00000000000..2c4917c1c94 --- /dev/null +++ b/PWGHF/D2H/TableProducer/candidateCreatorLbReduced.cxx @@ -0,0 +1,346 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file candidateCreatorLbReduced.cxx +/// \brief Reconstruction of Lb candidates +/// +/// \author Biao Zhang , Heidelberg University + +#include +#include + +#include "CommonConstants/PhysicsConstants.h" +#include "DCAFitter/DCAFitterN.h" +#include "Framework/AnalysisTask.h" +#include "Framework/runDataProcessing.h" +#include "ReconstructionDataFormats/DCA.h" + +#include "Common/Core/trackUtilities.h" +#include "Common/DataModel/CollisionAssociationTables.h" + +#include "PWGHF/DataModel/CandidateReconstructionTables.h" +#include "PWGHF/DataModel/CandidateSelectionTables.h" +#include "PWGHF/D2H/DataModel/ReducedDataModel.h" +#include "PWGHF/Utils/utilsTrkCandHf.h" + +using namespace o2; +using namespace o2::aod; +using namespace o2::constants::physics; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::hf_trkcandsel; + +/// Reconstruction of Lb candidates +struct HfCandidateCreatorLbReduced { + Produces rowCandidateBase; // table defined in CandidateReconstructionTables.h + Produces rowCandidateProngs; // table defined in ReducedDataModel.h + Produces rowCandidateLcMlScores; // table defined in ReducedDataModel.h + + // vertexing + Configurable propagateToPCA{"propagateToPCA", true, "create tracks version propagated to PCA"}; + Configurable useAbsDCA{"useAbsDCA", true, "Minimise abs. distance rather than chi2"}; + Configurable useWeightedFinalPCA{"useWeightedFinalPCA", false, "Recalculate vertex position using track covariances, effective only if useAbsDCA is true"}; + Configurable maxR{"maxR", 200., "reject PCA's above this radius"}; + Configurable maxDZIni{"maxDZIni", 4., "reject (if>0) PCA candidate if tracks DZ exceeds threshold"}; + Configurable minParamChange{"minParamChange", 1.e-3, "stop iterations if largest change of any Lb is smaller than this"}; + Configurable minRelChi2Change{"minRelChi2Change", 0.9, "stop iterations is chi2/chi2old > this"}; + // selection + Configurable invMassWindowLcPiTolerance{"invMassWindowLcPiTolerance", 0.01, "invariant-mass window tolerance for LcPi pair preselections (GeV/c2)"}; + + float myInvMassWindowLcPi{1.}; // variable that will store the value of invMassWindowLcPi + float bz{0.}; + + o2::vertexing::DCAFitterN<2> df2; // fitter for B vertex (2-prong vertex fitter) + + using HfRedCollisionsWithExtras = soa::Join; + + Preslice> candsLcPerCollision = hf_track_index_reduced::hfRedCollisionId; + Preslice> candsDWithMlPerCollision = hf_track_index_reduced::hfRedCollisionId; + Preslice> tracksPionPerCollision = hf_track_index_reduced::hfRedCollisionId; + + std::shared_ptr hCandidates; + HistogramRegistry registry{"registry"}; + + void init(InitContext const&) + { + std::array doprocess{doprocessData, doprocessDataWithLcMl}; + if ((std::accumulate(doprocess.begin(), doprocess.end(), 0)) != 1) { + LOGP(fatal, "Only one process function for data should be enabled at a time."); + } + + // Initialize fitter + df2.setPropagateToPCA(propagateToPCA); + df2.setMaxR(maxR); + df2.setMaxDZIni(maxDZIni); + df2.setMinParamChange(minParamChange); + df2.setMinRelChi2Change(minRelChi2Change); + df2.setUseAbsDCA(useAbsDCA); + df2.setWeightedFinalPCA(useWeightedFinalPCA); + + // histograms + registry.add("hMassLambdaLbToLcPi", "2-prong candidates;inv. mass (#Lambda_{b}^{0} #rightarrow #Lambda_{c}^{#plus}#pi^{#minus} #rightarrow pK^{#minus}#pi^{#plus}#pi^{#minus}) (GeV/#it{c}^{2});entries", {HistType::kTH1F, {{500, 3., 8.}}}); + registry.add("hCovPVXX", "2-prong candidates;XX element of cov. matrix of prim. vtx. position (cm^{2});entries", {HistType::kTH1F, {{100, 0., 1.e-4}}}); + registry.add("hCovSVXX", "2-prong candidates;XX element of cov. matrix of sec. vtx. position (cm^{2});entries", {HistType::kTH1F, {{100, 0., 0.2}}}); + registry.add("hEvents", "Events;;entries", HistType::kTH1F, {{1, 0.5, 1.5}}); + + /// candidate monitoring + hCandidates = registry.add("hCandidates", "candidates counter", {HistType::kTH1D, {axisCands}}); + setLabelHistoCands(hCandidates); + } + + template + inline std::pair computeInvMass2LcPiWindow(Config const& configs, + float invMassWindowLcPiTolerance) + { + + myInvMassWindowLcPi = 0.0f; + for (const auto& config : configs) { + myInvMassWindowLcPi = config.myInvMassWindowLcPi(); + } + + float deltaMin = MassLambdaB0 - myInvMassWindowLcPi + invMassWindowLcPiTolerance; + float deltaMax = MassLambdaB0 + myInvMassWindowLcPi - invMassWindowLcPiTolerance; + + float invMass2LcPiMin = deltaMin * deltaMin; + float invMass2LcPiMax = deltaMax * deltaMax; + + return {invMass2LcPiMin, invMass2LcPiMax}; + } + + /// Main function to perform Lb candidate creation + /// \param withLcMl is the flag to use the table with ML scores for the Lc daughter (only possible if present in the derived data) + /// \param collision the collision + /// \param candsLcThisColl Lc candidates in this collision + /// \param tracksPionThisCollision pion tracks in this collision + /// \param invMass2LcPiMin minimum Lb invariant-mass + /// \param invMass2LcPiMax maximum Lb invariant-mass + template + void runCandidateCreation(Coll const& collision, + Cands const& candsLcThisColl, + Pions const& tracksPionThisCollision, + float invMass2LcPiMin, + float invMass2LcPiMax) + { + auto primaryVertex = getPrimaryVertex(collision); + auto covMatrixPV = primaryVertex.getCov(); + + // Set the magnetic field from ccdb + bz = collision.bz(); + df2.setBz(bz); + + for (const auto& candLc : candsLcThisColl) { + auto trackParCovD = getTrackParCov(candLc); + std::array pVecLc = candLc.pVector(); + + for (const auto& trackPion : tracksPionThisCollision) { + // this track is among daughters + if (trackPion.trackId() == candLc.prong0Id() || trackPion.trackId() == candLc.prong1Id() || trackPion.trackId() == candLc.prong2Id()) { + continue; + } + + auto trackParCovPi = getTrackParCov(trackPion); + std::array pVecPion = trackPion.pVector(); + + // compute invariant mass square and apply selection + auto invMass2LcPi = RecoDecay::m2(std::array{pVecLc, pVecPion}, std::array{MassLambdaCPlus, MassPiPlus}); + if ((invMass2LcPi < invMass2LcPiMin) || (invMass2LcPi > invMass2LcPiMax)) { + continue; + } + // --------------------------------- + // reconstruct the 2-prong Lb vertex + hCandidates->Fill(SVFitting::BeforeFit); + try { + if (df2.process(trackParCovD, trackParCovPi) == 0) { + continue; + } + } catch (const std::runtime_error& error) { + LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN cannot work, skipping the candidate."; + hCandidates->Fill(SVFitting::Fail); + continue; + } + hCandidates->Fill(SVFitting::FitOk); + + // LcPi passed Lb reconstruction + + // calculate relevant properties + const auto& secondaryVertexLb = df2.getPCACandidate(); + auto chi2PCA = df2.getChi2AtPCACandidate(); + auto covMatrixPCA = df2.calcPCACovMatrixFlat(); + registry.fill(HIST("hCovSVXX"), covMatrixPCA[0]); + registry.fill(HIST("hCovPVXX"), covMatrixPV[0]); + + // propagate Lc and Pi to the Lb vertex + df2.propagateTracksToVertex(); + // track.getPxPyPzGlo(pVec) modifies pVec of track + df2.getTrack(0).getPxPyPzGlo(pVecLc); // momentum of Lc at the Lb vertex + df2.getTrack(1).getPxPyPzGlo(pVecPion); // momentum of Pi at the Lb vertex + + registry.fill(HIST("hMassLambdaB0ToLcPi"), std::sqrt(invMass2LcPi)); + + // compute impact parameters of D and Pi + o2::dataformats::DCA dcaLc; + o2::dataformats::DCA dcaPion; + trackParCovD.propagateToDCA(primaryVertex, bz, &dcaLc); + trackParCovPi.propagateToDCA(primaryVertex, bz, &dcaPion); + + // get uncertainty of the decay length + float phi, theta; + // getPointDirection modifies phi and theta + getPointDirection(std::array{collision.posX(), collision.posY(), collision.posZ()}, secondaryVertexLb, phi, theta); + auto errorDecayLength = std::sqrt(getRotatedCovMatrixXX(covMatrixPV, phi, theta) + getRotatedCovMatrixXX(covMatrixPCA, phi, theta)); + auto errorDecayLengthXY = std::sqrt(getRotatedCovMatrixXX(covMatrixPV, phi, 0.) + getRotatedCovMatrixXX(covMatrixPCA, phi, 0.)); + + // fill the candidate table for the Lb here: + rowCandidateBase(collision.globalIndex(), + collision.posX(), collision.posY(), collision.posZ(), + secondaryVertexLb[0], secondaryVertexLb[1], secondaryVertexLb[2], + errorDecayLength, errorDecayLengthXY, + chi2PCA, + pVecLc[0], pVecLc[1], pVecLc[2], + pVecPion[0], pVecPion[1], pVecPion[2], + dcaLc.getY(), dcaPion.getY(), + std::sqrt(dcaLc.getSigmaY2()), std::sqrt(dcaPion.getSigmaY2()), candLc.globalIndex(), trackPion.globalIndex(), -999.); + + rowCandidateProngs(candLc.globalIndex(), trackPion.globalIndex()); + + if constexpr (withLcMl) { + if (candLc.invMassHypo0() > 0) { + rowCandidateLcMlScores(candLc.mlScoreBkgMassHypo0(), candLc.mlScorePromptMassHypo0(), candLc.mlScoreNonpromptMassHypo0()); + } else { + rowCandidateLcMlScores(candLc.mlScoreBkgMassHypo1(), candLc.mlScorePromptMassHypo1(), candLc.mlScoreNonpromptMassHypo1()); + } + } // pi loop + } // Lc loop + } + } + + void processData(HfRedCollisionsWithExtras const& collisions, + soa::Join const& candsLc, + soa::Join const& tracksPion, + aod::HfOrigColCounts const& collisionsCounter, + aod::HfCandLbConfigs const& configs) + { + // LcPi invariant-mass window cut + // invMassWindowLcPiTolerance is used to apply a slightly tighter cut than in LcPi pair preselection + // to avoid accepting LcPi pairs that were not formed in LcPi pair creator + auto [invMass2LcPiMin, invMass2LcPiMax] = computeInvMass2LcPiWindow(configs, invMassWindowLcPiTolerance); + + for (const auto& collisionCounter : collisionsCounter) { + registry.fill(HIST("hEvents"), 1, collisionCounter.originalCollisionCount()); + } + + static int ncol = 0; + static constexpr int PrintFrequency = 10000; + for (const auto& collision : collisions) { + auto thisCollId = collision.globalIndex(); + auto candsLcThisColl = candsLc.sliceBy(candsLcPerCollision, thisCollId); + auto tracksPionThisCollision = tracksPion.sliceBy(tracksPionPerCollision, thisCollId); + runCandidateCreation(collision, candsLcThisColl, tracksPionThisCollision, invMass2LcPiMin, invMass2LcPiMax); + if (ncol % PrintFrequency == 0) { + LOGP(debug, "collisions parsed {}", ncol); + } + ncol++; + } + } // processData + + PROCESS_SWITCH(HfCandidateCreatorLbReduced, processData, "Process data without any ML score", true); + + void processDataWithLcMl(HfRedCollisionsWithExtras const& collisions, + soa::Join const& candsLc, + soa::Join const& tracksPion, + aod::HfOrigColCounts const& collisionsCounter, + aod::HfCandLbConfigs const& configs) + { + // LcPi invariant-mass window cut + // invMassWindowLcPiTolerance is used to apply a slightly tighter cut than in LcPi pair preselection + // to avoid accepting LcPi pairs that were not formed in LcPi pair creator + auto [invMass2LcPiMin, invMass2LcPiMax] = computeInvMass2LcPiWindow(configs, invMassWindowLcPiTolerance); + + for (const auto& collisionCounter : collisionsCounter) { + registry.fill(HIST("hEvents"), 1, collisionCounter.originalCollisionCount()); + } + + static int ncol = 0; + static constexpr int PrintFrequency = 10000; + for (const auto& collision : collisions) { + auto thisCollId = collision.globalIndex(); + auto candsLcThisColl = candsLc.sliceBy(candsLcPerCollision, thisCollId); + auto tracksPionThisCollision = tracksPion.sliceBy(tracksPionPerCollision, thisCollId); + runCandidateCreation(collision, candsLcThisColl, tracksPionThisCollision, invMass2LcPiMin, invMass2LcPiMax); + if (ncol % PrintFrequency == 0) { + LOGP(debug, "collisions parsed {}", ncol); + } + ncol++; + } + } // processDataWithLcMl + + PROCESS_SWITCH(HfCandidateCreatorLbReduced, processDataWithLcMl, "Process data with ML scores of Lc", false); +}; // struct + +/// Extends the table base with expression columns and performs MC matching. +struct HfCandidateCreatorLbReducedExpressions { + Spawns rowCandidateLb; + Spawns rowTracksExt; + Produces rowLbMcRec; + Produces rowLbMcCheck; + + /// Fill candidate information at MC reconstruction level + /// \param checkDecayTypeMc + /// \param rowsLcPiMcRec MC reco information on LcPi pairs + /// \param candsLb prong global indices of Lb candidates + template + void fillLbMcRec(McRec const& rowsLcPiMcRec, HfRedLbProngs const& candsLb) + { + for (const auto& candLb : candsLb) { + bool filledMcInfo{false}; + for (const auto& rowLcPiMcRec : rowsLcPiMcRec) { + if ((rowLcPiMcRec.prong0LcId() != candLb.prong0LcId()) || (rowLcPiMcRec.prong1TrackId() != candLb.prong1TrackId())) { + continue; + } + rowLbMcRec(rowLcPiMcRec.flagMcMatchRec(), rowLcPiMcRec.flagWrongCollision(), rowLcPiMcRec.debugMcRec(), rowLcPiMcRec.ptMother()); + filledMcInfo = true; + if constexpr (checkDecayTypeMc) { + rowLbMcCheck(rowLcPiMcRec.pdgCodeBeautyMother(), + rowLcPiMcRec.pdgCodeCharmMother(), + rowLcPiMcRec.pdgCodeProng0(), + rowLcPiMcRec.pdgCodeProng1(), + rowLcPiMcRec.pdgCodeProng2(), + rowLcPiMcRec.pdgCodeProng3()); + } + break; + } + if (!filledMcInfo) { // protection to get same size tables in case something went wrong: we created a candidate that was not preselected in the LcPi creator + rowLbMcRec(0, -1, -1, -1.f); + if constexpr (checkDecayTypeMc) { + rowLbMcCheck(-1, -1, -1, -1, -1, -1); + } + } + } + } + + void processMc(HfMcRecRedLcPis const& rowsLcPiMcRec, HfRedLbProngs const& candsLb) + { + fillLbMcRec(rowsLcPiMcRec, candsLb); + } + PROCESS_SWITCH(HfCandidateCreatorLbReducedExpressions, processMc, "Process MC", false); + + void processMcWithDecayTypeCheck(soa::Join const& rowsLcPiMcRec, HfRedLbProngs const& candsLb) + { + fillLbMcRec(rowsLcPiMcRec, candsLb); + } + PROCESS_SWITCH(HfCandidateCreatorLbReducedExpressions, processMcWithDecayTypeCheck, "Process MC with decay type checks", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc)}; +} diff --git a/PWGHF/D2H/TableProducer/candidateSelectorLbToLcPiReduced.cxx b/PWGHF/D2H/TableProducer/candidateSelectorLbToLcPiReduced.cxx new file mode 100644 index 00000000000..40e3cb4c8c6 --- /dev/null +++ b/PWGHF/D2H/TableProducer/candidateSelectorLbToLcPiReduced.cxx @@ -0,0 +1,252 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file candidateSelectorLbToLcPiReduced.cxx +/// \brief Lb → Lc+ π- candidate selector +/// +/// \author Biao Zhang , Heidelberg University + +#include +#include + +#include "Framework/AnalysisTask.h" +#include "Framework/runDataProcessing.h" + +#include "Common/Core/TrackSelectorPID.h" + +#include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/HfMlResponseLbToLcPi.h" +#include "PWGHF/Core/SelectorCuts.h" +#include "PWGHF/DataModel/CandidateReconstructionTables.h" +#include "PWGHF/DataModel/CandidateSelectionTables.h" +#include "PWGHF/D2H/DataModel/ReducedDataModel.h" + +using namespace o2; +using namespace o2::aod; +using namespace o2::framework; +using namespace o2::analysis; + +enum PidMethod { + NoPid = 0, // none + TpcOrTof, // TPC or TOF + TpcAndTof // TPC and TOF +}; + +struct HfCandidateSelectorLbToLcPiReduced { + Produces hfSelLbToLcPiCandidate; // table defined in CandidateSelectionTables.h + Produces hfMlLbToLcPiCandidate; // table defined in CandidateSelectionTables.h + + Configurable ptCandMin{"ptCandMin", 0., "Lower bound of candidate pT"}; + Configurable ptCandMax{"ptCandMax", 50., "Upper bound of candidate pT"}; + // Enable PID + Configurable pidMethod{"pidMethod", 1, "PID selection method for the bachelor pion (PidMethod::NoPid: none, PidMethod::TpcOrTof: TPC or TOF, PidMethod::TpcAndTof: TPC and TOF)"}; + Configurable acceptPIDNotApplicable{"acceptPIDNotApplicable", true, "Switch to accept Status::NotApplicable [(NotApplicable for one detector) and (NotApplicable or Conditional for the other)] in PID selection"}; + // TPC PID + Configurable ptPidTpcMin{"ptPidTpcMin", 0.15, "Lower bound of track pT for TPC PID"}; + Configurable ptPidTpcMax{"ptPidTpcMax", 20., "Upper bound of track pT for TPC PID"}; + Configurable nSigmaTpcMax{"nSigmaTpcMax", 5., "Nsigma cut on TPC only"}; + Configurable nSigmaTpcCombinedMax{"nSigmaTpcCombinedMax", 5., "Nsigma cut on TPC combined with TOF"}; + // TOF PID + Configurable ptPidTofMin{"ptPidTofMin", 0.15, "Lower bound of track pT for TOF PID"}; + Configurable ptPidTofMax{"ptPidTofMax", 20., "Upper bound of track pT for TOF PID"}; + Configurable nSigmaTofMax{"nSigmaTofMax", 5., "Nsigma cut on TOF only"}; + Configurable nSigmaTofCombinedMax{"nSigmaTofCombinedMax", 5., "Nsigma cut on TOF combined with TPC"}; + // topological cuts + Configurable> binsPt{"binsPt", std::vector{hf_cuts_lb_to_lc_pi::vecBinsPt}, "pT bin limits"}; + Configurable> cuts{"cuts", {hf_cuts_lb_to_lc_pi::Cuts[0], hf_cuts_lb_to_lc_pi::NBinsPt, hf_cuts_lb_to_lc_pi::NCutVars, hf_cuts_lb_to_lc_pi::labelsPt, hf_cuts_lb_to_lc_pi::labelsCutVar}, "Lb candidate selection per pT bin"}; + // Lc ML cuts + Configurable> binsPtLcMl{"binsPtLcMl", std::vector{hf_cuts_ml::vecBinsPt}, "Lc pT bin limits for ML cuts"}; + Configurable> cutsLcMl{"cutsLcMl", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsDmesCutScore}, "Lc ML cuts per pT bin"}; + // QA switch + Configurable activateQA{"activateQA", false, "Flag to enable QA histogram"}; + // Lb ML inference + Configurable applyLbMl{"applyLbMl", false, "Flag to apply ML selections"}; + Configurable> binsPtLbMl{"binsPtLbMl", std::vector{hf_cuts_ml::vecBinsPt}, "pT bin limits for ML application"}; + Configurable> cutDirLbMl{"cutDirLbMl", std::vector{hf_cuts_ml::vecCutDir}, "Whether to reject score values greater or smaller than the threshold"}; + Configurable> cutsLbMl{"cutsLbMl", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; + Configurable nClassesLbMl{"nClassesLbMl", static_cast(hf_cuts_ml::NCutScores), "Number of classes in ML model"}; + Configurable> namesInputFeatures{"namesInputFeatures", std::vector{"feature1", "feature2"}, "Names of ML model input features"}; + // CCDB configuration + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable> modelPathsCCDB{"modelPathsCCDB", std::vector{"path_ccdb/BDT_Lb/"}, "Paths of models on CCDB"}; + Configurable> onnxFileNames{"onnxFileNames", std::vector{"ModelHandler_onnx_LbToLcPi.onnx"}, "ONNX file names for each pT bin (if not from CCDB full path)"}; + Configurable timestampCCDB{"timestampCCDB", -1, "timestamp of the ONNX file for ML model used to query in CCDB"}; + Configurable loadModelsFromCCDB{"loadModelsFromCCDB", false, "Flag to enable or disable the loading of models from CCDB"}; + + o2::analysis::HfMlResponseLbToLcPi hfMlResponse; + float outputMlNotPreselected = -1.; + std::vector outputMl = {}; + o2::ccdb::CcdbApi ccdbApi; + + TrackSelectorPi selectorPion; + HfHelper hfHelper; + + using TracksPion = soa::Join; + + HistogramRegistry registry{"registry"}; + + void init(InitContext const&) + { + std::array doprocess{doprocessSelection, doprocessSelectionWithLcMl}; + if ((std::accumulate(doprocess.begin(), doprocess.end(), 0)) != 1) { + LOGP(fatal, "Only one process function for data should be enabled at a time."); + } + + if (pidMethod < PidMethod::NoPid || pidMethod > PidMethod::TpcAndTof) { + LOGP(fatal, "Invalid PID option in configurable, please set 0 (no PID), 1 (TPC or TOF), or 2 (TPC and TOF)"); + } + + if (pidMethod == PidMethod::TpcOrTof || pidMethod == PidMethod::TpcAndTof) { + selectorPion.setRangePtTpc(ptPidTpcMin, ptPidTpcMax); + selectorPion.setRangeNSigmaTpc(-nSigmaTpcMax, nSigmaTpcMax); + selectorPion.setRangeNSigmaTpcCondTof(-nSigmaTpcCombinedMax, nSigmaTpcCombinedMax); + selectorPion.setRangePtTof(ptPidTofMin, ptPidTofMax); + selectorPion.setRangeNSigmaTof(-nSigmaTofMax, nSigmaTofMax); + selectorPion.setRangeNSigmaTofCondTpc(-nSigmaTofCombinedMax, nSigmaTofCombinedMax); + } + + if (activateQA) { + constexpr int kNBinsSelections = 1 + SelectionStep::NSelectionSteps; + std::string labels[kNBinsSelections]; + labels[0] = "No selection"; + labels[1 + SelectionStep::RecoSkims] = "Skims selection"; + labels[1 + SelectionStep::RecoTopol] = "Skims & Topological selections"; + labels[1 + SelectionStep::RecoPID] = "Skims & Topological & PID selections"; + labels[1 + aod::SelectionStep::RecoMl] = "ML selection"; + static const AxisSpec axisSelections = {kNBinsSelections, 0.5, kNBinsSelections + 0.5, ""}; + registry.add("hSelections", "Selections;;#it{p}_{T} (GeV/#it{c})", {HistType::kTH2F, {axisSelections, {(std::vector)binsPt, "#it{p}_{T} (GeV/#it{c})"}}}); + for (int iBin = 0; iBin < kNBinsSelections; ++iBin) { + registry.get(HIST("hSelections"))->GetXaxis()->SetBinLabel(iBin + 1, labels[iBin].data()); + } + } + + if (applyLbMl) { + hfMlResponse.configure(binsPtLbMl, cutsLbMl, cutDirLbMl, nClassesLbMl); + if (loadModelsFromCCDB) { + ccdbApi.init(ccdbUrl); + hfMlResponse.setModelPathsCCDB(onnxFileNames, ccdbApi, modelPathsCCDB, timestampCCDB); + } else { + hfMlResponse.setModelPathsLocal(onnxFileNames); + } + hfMlResponse.cacheInputFeaturesIndices(namesInputFeatures); + hfMlResponse.init(); + } + } + + /// Main function to perform Lb candidate selection + /// \param withLcMl is the flag to use the table with ML scores for the Ds- daughter (only possible if present in the derived data) + /// \param hfCandsLb Lb candidates + /// \param pionTracks pion tracks + /// \param configs config inherited from the charm-hadron data creator + template + void runSelection(Cands const& hfCandsLb, + TracksPion const&, + HfCandLbConfigs const&) + { + for (const auto& hfCandLb : hfCandsLb) { + int statusLbToLcPi = 0; + outputMl.clear(); + auto ptCandLb = hfCandLb.pt(); + + SETBIT(statusLbToLcPi, SelectionStep::RecoSkims); // RecoSkims = 0 --> statusLbToLcPi = 1 + if (activateQA) { + registry.fill(HIST("hSelections"), 2 + SelectionStep::RecoSkims, ptCandLb); + } + + // topological cuts + if (!hfHelper.selectionLbToLcPiTopol(hfCandLb, cuts, binsPt)) { + hfSelLbToLcPiCandidate(statusLbToLcPi); + if (applyLbMl) { + hfMlLbToLcPiCandidate(outputMlNotPreselected); + } + continue; + } + + if constexpr (withLcMl) { // we include it in the topological selections + if (!hfHelper.selectionDmesMlScoresForBReduced(hfCandLb, cutsLcMl, binsPtLcMl)) { + hfSelLbToLcPiCandidate(statusLbToLcPi); + if (applyLbMl) { + hfMlLbToLcPiCandidate(outputMlNotPreselected); + } + continue; + } + } + + SETBIT(statusLbToLcPi, SelectionStep::RecoTopol); // RecoTopol = 1 --> statusLbToLcPi = 3 + if (activateQA) { + registry.fill(HIST("hSelections"), 2 + SelectionStep::RecoTopol, ptCandLb); + } + + // track-level PID selection + auto trackPi = hfCandLb.template prong1Track_as(); + if (pidMethod == PidMethod::TpcOrTof || pidMethod == PidMethod::TpcAndTof) { + int pidTrackPi{TrackSelectorPID::Status::NotApplicable}; + if (pidMethod == PidMethod::TpcOrTof) { + pidTrackPi = selectorPion.statusTpcOrTof(trackPi); + } else { + pidTrackPi = selectorPion.statusTpcAndTof(trackPi); + } + if (!hfHelper.selectionLbToLcPiPid(pidTrackPi, acceptPIDNotApplicable.value)) { + hfSelLbToLcPiCandidate(statusLbToLcPi); + if (applyLbMl) { + hfMlLbToLcPiCandidate(outputMlNotPreselected); + } + continue; + } + SETBIT(statusLbToLcPi, SelectionStep::RecoPID); // RecoPID = 2 --> statusLbToLcPi = 7 + if (activateQA) { + registry.fill(HIST("hSelections"), 2 + SelectionStep::RecoPID, ptCandLb); + } + } + + if (applyLbMl) { + // Lb ML selections + std::vector inputFeatures = hfMlResponse.getInputFeatures(hfCandLb, trackPi); + bool isSelectedMl = hfMlResponse.isSelectedMl(inputFeatures, ptCandLb, outputMl); + hfMlLbToLcPiCandidate(outputMl[1]); + + if (!isSelectedMl) { + hfSelLbToLcPiCandidate(statusLbToLcPi); + continue; + } + SETBIT(statusLbToLcPi, SelectionStep::RecoMl); // RecoML = 3 --> statusLbToLcPi = 15 if PidMethod, 11 otherwise + if (activateQA) { + registry.fill(HIST("hSelections"), 2 + SelectionStep::RecoMl, ptCandLb); + } + } + + hfSelLbToLcPiCandidate(statusLbToLcPi); + } + } + + void processSelection(HfRedCandLb const& hfCandsLb, + TracksPion const& pionTracks, + HfCandLbConfigs const& configs) + { + runSelection(hfCandsLb, pionTracks, configs); + } // processSelection + + PROCESS_SWITCH(HfCandidateSelectorLbToLcPiReduced, processSelection, "Process selection without ML scores of Lc", true); + + void processSelectionWithLcMl(soa::Join const& hfCandsLb, + TracksPion const& pionTracks, + HfCandLbConfigs const& configs) + { + runSelection(hfCandsLb, pionTracks, configs); + } // processSelectionwithLcMl + + PROCESS_SWITCH(HfCandidateSelectorLbToLcPiReduced, processSelectionWithLcMl, "Process selection with ML scores of Lc", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} diff --git a/PWGHF/D2H/TableProducer/converterReducedHadronDausPid.cxx b/PWGHF/D2H/TableProducer/converterReducedHadronDausPid.cxx new file mode 100644 index 00000000000..219c9a5d6e9 --- /dev/null +++ b/PWGHF/D2H/TableProducer/converterReducedHadronDausPid.cxx @@ -0,0 +1,53 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file converterReducedHadronDausPid.cxx +/// \brief Task for conversion of daughters pid to version 001 +/// +/// \author Biao Zhang , Heidelberg University + +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" + +#include "PWGHF/D2H/DataModel/ReducedDataModel.h" +#include "PWGHF/DataModel/CandidateSelectionTables.h" + +using namespace o2; +using namespace o2::framework; + +struct HfConverterReducedHadronDausPid { + Produces hfRedPidDau0s; + Produces hfRedPidDau1s; + Produces hfRedPidDau2s; + + using HfRedPidDaus2Prong = soa::Join; + using HfRedPidDaus3Prong = soa::Join; + + void process2Prongs(HfRedPidDaus2Prong::iterator const& hfCandPidProngs) + { + hfRedPidDau0s(hfCandPidProngs.nSigTpcPi0(), hfCandPidProngs.nSigTofPi0(), hfCandPidProngs.nSigTpcKa0(), hfCandPidProngs.nSigTofKa0(), -999.f, -999.f, hfCandPidProngs.hasTOFProng0(), hfCandPidProngs.hasTPCProng0()); + hfRedPidDau1s(hfCandPidProngs.nSigTpcPi1(), hfCandPidProngs.nSigTofPi1(), hfCandPidProngs.nSigTpcKa1(), hfCandPidProngs.nSigTofKa1(), -999.f, -999.f, hfCandPidProngs.hasTOFProng1(), hfCandPidProngs.hasTPCProng1()); + } + PROCESS_SWITCH(HfConverterReducedHadronDausPid, process2Prongs, "Produce PID tables for 2-prong candidates", true); + + void process3Prongs(HfRedPidDaus3Prong::iterator const& hfCandPidProngs) + { + hfRedPidDau0s(hfCandPidProngs.nSigTpcPi0(), hfCandPidProngs.nSigTofPi0(), hfCandPidProngs.nSigTpcKa0(), hfCandPidProngs.nSigTofKa0(), -999.f, -999.f, hfCandPidProngs.hasTOFProng0(), hfCandPidProngs.hasTPCProng0()); + hfRedPidDau1s(hfCandPidProngs.nSigTpcPi1(), hfCandPidProngs.nSigTofPi1(), hfCandPidProngs.nSigTpcKa1(), hfCandPidProngs.nSigTofKa1(), -999.f, -999.f, hfCandPidProngs.hasTOFProng1(), hfCandPidProngs.hasTPCProng1()); + hfRedPidDau2s(hfCandPidProngs.nSigTpcPi2(), hfCandPidProngs.nSigTofPi2(), hfCandPidProngs.nSigTpcKa2(), hfCandPidProngs.nSigTofKa2(), -999.f, -999.f, hfCandPidProngs.hasTOFProng2(), hfCandPidProngs.hasTPCProng2()); + } + PROCESS_SWITCH(HfConverterReducedHadronDausPid, process3Prongs, "Produce PID tables for 3-prong candidates", true); +}; +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} diff --git a/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx b/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx index fc6c9487700..2b8fe679e1d 100644 --- a/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx +++ b/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx @@ -16,6 +16,7 @@ /// \author Antonio Palasciano , Università degli Studi di Bari /// \author Fabrizio Grosa , CERN /// \author Fabio Catalano , CERN +/// \author Biao Zhang , Heidelberg University #include #include @@ -62,7 +63,8 @@ enum Event : uint8_t { enum DecayChannel : uint8_t { B0ToDminusPi = 0, BplusToD0barPi, - BsToDsminusPi + BsToDsminusPi, + LbToLcplusPi }; enum WrongCollisionType : uint8_t { @@ -112,27 +114,39 @@ struct HfDataCreatorCharmHadPiReduced { Produces rowHfDsPiMcCheckReduced; Produces rowHfBsMcGenReduced; + Produces rowCandidateConfigLb; + Produces rowHfLcPiMcRecReduced; + Produces rowHfLcPiMcCheckReduced; + Produces rowHfLbMcGenReduced; + // vertexing - // Configurable bz{"bz", 5., "magnetic field"}; - Configurable propagateToPCA{"propagateToPCA", true, "create tracks version propagated to PCA"}; - Configurable useAbsDCA{"useAbsDCA", false, "Minimise abs. distance rather than chi2"}; - Configurable useWeightedFinalPCA{"useWeightedFinalPCA", false, "Recalculate vertex position using track covariances, effective only if useAbsDCA is true"}; - Configurable maxR{"maxR", 200., "reject PCA's above this radius"}; - Configurable maxDZIni{"maxDZIni", 4., "reject (if>0) PCA candidate if tracks DZ exceeds threshold"}; - Configurable minParamChange{"minParamChange", 1.e-3, "stop iterations if largest change of any B0 is smaller than this"}; - Configurable minRelChi2Change{"minRelChi2Change", 0.9, "stop iterations is chi2/chi2old > this"}; + struct : o2::framework::ConfigurableGroup { + // Configurable bz{"bz", 5., "magnetic field"}; + Configurable propagateToPCA{"propagateToPCA", true, "create tracks version propagated to PCA"}; + Configurable useAbsDCA{"useAbsDCA", false, "Minimise abs. distance rather than chi2"}; + Configurable useWeightedFinalPCA{"useWeightedFinalPCA", false, "Recalculate vertex position using track covariances, effective only if useAbsDCA is true"}; + Configurable maxR{"maxR", 200., "reject PCA's above this radius"}; + Configurable maxDZIni{"maxDZIni", 4., "reject (if>0) PCA candidate if tracks DZ exceeds threshold"}; + Configurable minParamChange{"minParamChange", 1.e-3, "stop iterations if largest change of any B0 is smaller than this"}; + Configurable minRelChi2Change{"minRelChi2Change", 0.9, "stop iterations is chi2/chi2old > this"}; + } vertexConfigurations; // selection - Configurable usePionIsGlobalTrackWoDCA{"usePionIsGlobalTrackWoDCA", true, "check isGlobalTrackWoDCA status for pions, for Run3 studies"}; - Configurable ptPionMin{"ptPionMin", 0.5, "minimum pion pT threshold (GeV/c)"}; - Configurable absEtaPionMax{"etaPionMax", 0.8, "maximum pion absolute eta threshold"}; - Configurable> binsPtPion{"binsPtPion", std::vector{hf_cuts_single_track::vecBinsPtTrack}, "track pT bin limits for pion DCA XY pT-dependent cut"}; - Configurable> cutsTrackPionDCA{"cutsTrackPionDCA", {hf_cuts_single_track::CutsTrack[0], hf_cuts_single_track::NBinsPtTrack, hf_cuts_single_track::NCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for pions"}; + struct : o2::framework::ConfigurableGroup { + Configurable usePionIsGlobalTrackWoDCA{"usePionIsGlobalTrackWoDCA", true, "check isGlobalTrackWoDCA status for pions, for Run3 studies"}; + Configurable ptPionMin{"ptPionMin", 0.5, "minimum pion pT threshold (GeV/c)"}; + Configurable etaPionMax{"etaPionMax", 0.8, "maximum pion absolute eta threshold"}; + Configurable> binsPtPion{"binsPtPion", std::vector{hf_cuts_single_track::vecBinsPtTrack}, "track pT bin limits for pion DCA XY pT-dependent cut"}; + Configurable> cutsTrackPionDCA{"cutsTrackPionDCA", {hf_cuts_single_track::CutsTrack[0], hf_cuts_single_track::NBinsPtTrack, hf_cuts_single_track::NCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for pions"}; + } trackPionConfigurations; Configurable invMassWindowCharmHadPi{"invMassWindowCharmHadPi", 0.3, "invariant-mass window for CharmHad-Pi pair preselections (GeV/c2)"}; - Configurable selectionFlagDplus{"selectionFlagDplus", 7, "Selection Flag for D+"}; - Configurable selectionFlagDs{"selectionFlagDs", 7, "Selection Flag for Ds"}; - Configurable selectionFlagD0{"selectionFlagD0", 1, "Selection Flag for D0"}; - Configurable selectionFlagD0bar{"selectionFlagD0bar", 1, "Selection Flag for D0bar"}; + struct : o2::framework::ConfigurableGroup { + Configurable selectionFlagDplus{"selectionFlagDplus", 7, "Selection Flag for D+"}; + Configurable selectionFlagDs{"selectionFlagDs", 7, "Selection Flag for Ds"}; + Configurable selectionFlagD0{"selectionFlagD0", 1, "Selection Flag for D0"}; + Configurable selectionFlagD0bar{"selectionFlagD0bar", 1, "Selection Flag for D0bar"}; + Configurable selectionFlagLc{"selectionFlagLc", 1, "Selection Flag for Lc"}; + } hfflagConfigurations; // magnetic field setting from CCDB Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Configurable ccdbPathGrpMag{"ccdbPathGrpMag", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object (Run 3)"}; @@ -157,14 +171,14 @@ struct HfDataCreatorCharmHadPiReduced { double invMass2ChHadPiMin{0.}; double invMass2ChHadPiMax{0.}; double bz{0.}; - + static constexpr std::size_t NDaughtersDs{2u}; bool isHfCandBhadConfigFilled = false; // Fitter to redo D-vertex to get extrapolated daughter tracks (2/3-prong vertex filter) o2::vertexing::DCAFitterN<3> df3; o2::vertexing::DCAFitterN<2> df2; - using TracksPid = soa::Join; // TODO: revert to pion only once the Nsigma variables for the charm-hadron candidate daughters are in the candidate table for 3 prongs too + using TracksPid = soa::Join; // TODO: revert to pion only once the Nsigma variables for the charm-hadron candidate daughters are in the candidate table for 3 prongs too using TracksPidWithSel = soa::Join; using TracksPidWithSelAndMc = soa::Join; @@ -174,14 +188,17 @@ struct HfDataCreatorCharmHadPiReduced { using CandsDsFilteredWithMl = soa::Filtered>; using CandsD0Filtered = soa::Filtered>; using CandsD0FilteredWithMl = soa::Filtered>; + using CandsLcFiltered = soa::Filtered>; + using CandsLcFilteredWithMl = soa::Filtered>; using CollisionsWCent = soa::Join; using CollisionsWCentAndMcLabels = soa::Join; using CollisionsWCentAndQvectors = soa::Join; - Filter filterSelectDplusCandidates = (aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlagDplus); - Filter filterSelectDsCandidates = (aod::hf_sel_candidate_ds::isSelDsToKKPi >= selectionFlagDs || aod::hf_sel_candidate_ds::isSelDsToPiKK >= selectionFlagDs); - Filter filterSelectDzeroCandidates = (aod::hf_sel_candidate_d0::isSelD0 >= selectionFlagD0 || aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlagD0bar); + Filter filterSelectDplusCandidates = (aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= hfflagConfigurations.selectionFlagDplus); + Filter filterSelectDsCandidates = (aod::hf_sel_candidate_ds::isSelDsToKKPi >= hfflagConfigurations.selectionFlagDs || aod::hf_sel_candidate_ds::isSelDsToPiKK >= hfflagConfigurations.selectionFlagDs); + Filter filterSelectDzeroCandidates = (aod::hf_sel_candidate_d0::isSelD0 >= hfflagConfigurations.selectionFlagD0 || aod::hf_sel_candidate_d0::isSelD0bar >= hfflagConfigurations.selectionFlagD0bar); + Filter filterSelectLcCandidates = (aod::hf_sel_candidate_lc::isSelLcToPKPi >= hfflagConfigurations.selectionFlagLc || aod::hf_sel_candidate_lc::isSelLcToPiKP >= hfflagConfigurations.selectionFlagLc); Preslice candsDplusPerCollision = aod::track_association::collisionId; Preslice candsDplusPerCollisionWithMl = aod::track_association::collisionId; @@ -189,10 +206,12 @@ struct HfDataCreatorCharmHadPiReduced { Preslice candsDsPerCollisionWithMl = aod::track_association::collisionId; Preslice candsD0PerCollision = aod::track_association::collisionId; Preslice candsD0PerCollisionWithMl = aod::track_association::collisionId; + Preslice candsLcPerCollision = aod::track_association::collisionId; + Preslice candsLcPerCollisionWithMl = aod::track_association::collisionId; Preslice trackIndicesPerCollision = aod::track_association::collisionId; PresliceUnsorted colPerMcCollision = aod::mccollisionlabel::mcCollisionId; - std::shared_ptr hCandidatesD0, hCandidatesDPlus, hCandidatesDs; + std::shared_ptr hCandidatesD0, hCandidatesDPlus, hCandidatesDs, hCandidatesLc; HistogramRegistry registry{"registry"}; std::array arrPDGResonantDsPhiPi = {kPhi, kPiPlus}; // Ds± → Phi π± @@ -200,9 +219,10 @@ struct HfDataCreatorCharmHadPiReduced { void init(InitContext const&) { - std::array doProcess = {doprocessDplusPiData, doprocessDplusPiDataWithMl, doprocessDplusPiMc, doprocessDplusPiMcWithMl, + std::array doProcess = {doprocessDplusPiData, doprocessDplusPiDataWithMl, doprocessDplusPiMc, doprocessDplusPiMcWithMl, doprocessDsPiData, doprocessDsPiDataWithMl, doprocessDsPiMc, doprocessDsPiMcWithMl, - doprocessD0PiData, doprocessD0PiDataWithMl, doprocessD0PiMc, doprocessD0PiMcWithMl}; + doprocessD0PiData, doprocessD0PiDataWithMl, doprocessD0PiMc, doprocessD0PiMcWithMl, + doprocessLcPiData, doprocessLcPiDataWithMl, doprocessLcPiMc, doprocessLcPiMcWithMl}; if (std::accumulate(doProcess.begin(), doProcess.end(), 0) != 1) { LOGP(fatal, "One and only one process function can be enabled at a time, please fix your configuration!"); } @@ -218,29 +238,32 @@ struct HfDataCreatorCharmHadPiReduced { } else if (doprocessD0PiData || doprocessD0PiDataWithMl || doprocessD0PiMc || doprocessD0PiMcWithMl) { massC = MassD0; massB = MassBPlus; + } else if (doprocessLcPiData || doprocessLcPiDataWithMl || doprocessLcPiMc || doprocessLcPiMcWithMl) { + massC = MassLambdaCPlus; + massB = MassLambdaB0; } invMass2ChHadPiMin = (massB - invMassWindowCharmHadPi) * (massB - invMassWindowCharmHadPi); invMass2ChHadPiMax = (massB + invMassWindowCharmHadPi) * (massB + invMassWindowCharmHadPi); // Initialize fitter if (doprocessDplusPiData || doprocessDplusPiDataWithMl || doprocessDplusPiMc || doprocessDplusPiMcWithMl || - doprocessDsPiData || doprocessDsPiDataWithMl || doprocessDsPiMc || doprocessDsPiMcWithMl) { - df3.setPropagateToPCA(propagateToPCA); - df3.setMaxR(maxR); - df3.setMaxDZIni(maxDZIni); - df3.setMinParamChange(minParamChange); - df3.setMinRelChi2Change(minRelChi2Change); - df3.setUseAbsDCA(useAbsDCA); - df3.setWeightedFinalPCA(useWeightedFinalPCA); + doprocessDsPiData || doprocessDsPiDataWithMl || doprocessDsPiMc || doprocessDsPiMcWithMl || doprocessLcPiData || doprocessLcPiDataWithMl || doprocessLcPiMc || doprocessLcPiMcWithMl) { + df3.setPropagateToPCA(vertexConfigurations.propagateToPCA); + df3.setMaxR(vertexConfigurations.maxR); + df3.setMaxDZIni(vertexConfigurations.maxDZIni); + df3.setMinParamChange(vertexConfigurations.minParamChange); + df3.setMinRelChi2Change(vertexConfigurations.minRelChi2Change); + df3.setUseAbsDCA(vertexConfigurations.useAbsDCA); + df3.setWeightedFinalPCA(vertexConfigurations.useWeightedFinalPCA); df3.setMatCorrType(noMatCorr); } else if (doprocessD0PiData || doprocessD0PiDataWithMl || doprocessD0PiMc || doprocessD0PiMcWithMl) { - df2.setPropagateToPCA(propagateToPCA); - df2.setMaxR(maxR); - df2.setMaxDZIni(maxDZIni); - df2.setMinParamChange(minParamChange); - df2.setMinRelChi2Change(minRelChi2Change); - df2.setUseAbsDCA(useAbsDCA); - df2.setWeightedFinalPCA(useWeightedFinalPCA); + df2.setPropagateToPCA(vertexConfigurations.propagateToPCA); + df2.setMaxR(vertexConfigurations.maxR); + df2.setMaxDZIni(vertexConfigurations.maxDZIni); + df2.setMinParamChange(vertexConfigurations.minParamChange); + df2.setMinRelChi2Change(vertexConfigurations.minRelChi2Change); + df2.setUseAbsDCA(vertexConfigurations.useAbsDCA); + df2.setWeightedFinalPCA(vertexConfigurations.useWeightedFinalPCA); df2.setMatCorrType(noMatCorr); } @@ -267,30 +290,37 @@ struct HfDataCreatorCharmHadPiReduced { if (doprocessDplusPiData || doprocessDplusPiDataWithMl || doprocessDplusPiMc || doprocessDplusPiMcWithMl) { charmHadTitle = "D^{#plus}"; histMassTitle = "Dplus"; - registry.add("hMassDplus", "D^{#plus} candidates; #it{M}(K#pi#pi) (GeV/#it{c}^{2});entries", {HistType::kTH1F, {{500, 0., 5.}}}); + registry.add("hMassDplus", "D^{#plus} candidates; #it{M}(K#pi#pi) (GeV/#it{c}^{2});entries", {HistType::kTH1D, {{500, 0., 5.}}}); } else if (doprocessDsPiData || doprocessDsPiDataWithMl || doprocessDsPiMc || doprocessDsPiMcWithMl) { charmHadTitle = "D_{s}^{#plus}"; histMassTitle = "Ds"; - registry.add("hMassDsToKKPi", "D_{s}^{#plus} to KKpi candidates; #it{M}(KK#pi) (GeV/#it{c}^{2});entries", {HistType::kTH1F, {{500, 0., 5.}}}); - registry.add("hMassDsToPiKK", "D_{s}^{#plus} to piKK candidates; #it{M}(KK#pi) (GeV/#it{c}^{2});entries", {HistType::kTH1F, {{500, 0., 5.}}}); + registry.add("hMassDsToKKPi", "D_{s}^{#plus} to KKpi candidates; #it{M}(KK#pi) (GeV/#it{c}^{2});entries", {HistType::kTH1D, {{500, 0., 5.}}}); + registry.add("hMassDsToPiKK", "D_{s}^{#plus} to piKK candidates; #it{M}(KK#pi) (GeV/#it{c}^{2});entries", {HistType::kTH1D, {{500, 0., 5.}}}); } else if (doprocessD0PiData || doprocessD0PiDataWithMl || doprocessD0PiMc || doprocessD0PiMcWithMl) { charmHadTitle = "D^{0}"; histMassTitle = "D0"; - registry.add("hMassD0", "D^{0} candidates; #it{M}(K#pi) (GeV/#it{c}^{2});entries", {HistType::kTH1F, {{500, 0., 5.}}}); - registry.add("hMassD0bar", "#overline{D}^{0} candidates; #it{M}(K#pi) (GeV/#it{c}^{2});entries", {HistType::kTH1F, {{500, 0., 5.}}}); + registry.add("hMassD0", "D^{0} candidates; #it{M}(K#pi) (GeV/#it{c}^{2});entries", {HistType::kTH1D, {{500, 0., 5.}}}); + registry.add("hMassD0bar", "#overline{D}^{0} candidates; #it{M}(K#pi) (GeV/#it{c}^{2});entries", {HistType::kTH1D, {{500, 0., 5.}}}); + } else if (doprocessLcPiData || doprocessLcPiDataWithMl || doprocessLcPiMc || doprocessLcPiMcWithMl) { + charmHadTitle = "#Lambda_{c}^{+}"; + histMassTitle = "Lc"; + registry.add("hMassLc", "#Lambda_{c}^{+} candidates; #it{M}(pK#pi) (GeV/#it{c}^{2});entries", {HistType::kTH1D, {{500, 0., 5.}}}); } - registry.add(Form("hPt%s", histMassTitle.data()), Form("%s candidates candidates;%s candidate #it{p}_{T} (GeV/#it{c});entries", charmHadTitle.data(), charmHadTitle.data()), {HistType::kTH1F, {{100, 0., 10.}}}); - registry.add("hPtPion", "#pi^{#plus} candidates;#pi^{#plus} candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{100, 0., 10.}}}); - registry.add(Form("hCpa%s", histMassTitle.data()), Form("%s candidates;%s cosine of pointing angle;entries", charmHadTitle.data(), charmHadTitle.data()), {HistType::kTH1F, {{110, -1.1, 1.1}}}); + registry.add(Form("hPt%s", histMassTitle.data()), Form("%s candidates candidates;%s candidate #it{p}_{T} (GeV/#it{c});entries", charmHadTitle.data(), charmHadTitle.data()), {HistType::kTH1D, {{100, 0., 10.}}}); + registry.add("hPtPion", "#pi^{#plus} candidates;#pi^{#plus} candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1D, {{100, 0., 10.}}}); + registry.add(Form("hCpa%s", histMassTitle.data()), Form("%s candidates;%s cosine of pointing angle;entries", charmHadTitle.data(), charmHadTitle.data()), {HistType::kTH1D, {{110, -1.1, 1.1}}}); /// candidate monitoring hCandidatesD0 = registry.add("hCandidatesD0", "D0 candidate counter", {HistType::kTH1D, {axisCands}}); hCandidatesDPlus = registry.add("hCandidatesDPlus", "Dplus candidate counter", {HistType::kTH1D, {axisCands}}); hCandidatesDs = registry.add("hCandidatesDs", "Ds candidate counter", {HistType::kTH1D, {axisCands}}); + hCandidatesLc = registry.add("hCandidatesLc", "Lc candidate counter", {HistType::kTH1D, {axisCands}}); + setLabelHistoCands(hCandidatesD0); setLabelHistoCands(hCandidatesDPlus); setLabelHistoCands(hCandidatesDs); + setLabelHistoCands(hCandidatesLc); // init HF event selection helper hfEvSel.init(registry); @@ -306,11 +336,11 @@ struct HfDataCreatorCharmHadPiReduced { bool isPionSelected(const T1& trackPion, const T2& trackParCovPion, const T3& dcaPion, const std::vector& charmDautracks) { // check isGlobalTrackWoDCA status for pions if wanted - if (usePionIsGlobalTrackWoDCA && !trackPion.isGlobalTrackWoDCA()) { + if (trackPionConfigurations.usePionIsGlobalTrackWoDCA && !trackPion.isGlobalTrackWoDCA()) { return false; } // minimum pT and eta selection - if (trackParCovPion.getPt() < ptPionMin || std::abs(trackParCovPion.getEta()) > absEtaPionMax || !isSelectedTrackDCA(trackParCovPion, dcaPion)) { + if (trackParCovPion.getPt() < trackPionConfigurations.ptPionMin || std::abs(trackParCovPion.getEta()) > trackPionConfigurations.etaPionMax || !isSelectedTrackDCA(trackParCovPion, dcaPion)) { return false; } // reject pions that are charm-hadron daughters @@ -330,15 +360,15 @@ struct HfDataCreatorCharmHadPiReduced { template bool isSelectedTrackDCA(const T1& trackPar, const T2& dca) { - auto pTBinTrack = findBin(binsPtPion, trackPar.getPt()); + auto pTBinTrack = findBin(trackPionConfigurations.binsPtPion, trackPar.getPt()); if (pTBinTrack == -1) { return false; } - if (std::abs(dca[0]) < cutsTrackPionDCA->get(pTBinTrack, "min_dcaxytoprimary")) { + if (std::abs(dca[0]) < trackPionConfigurations.cutsTrackPionDCA->get(pTBinTrack, "min_dcaxytoprimary")) { return false; // minimum DCAxy } - if (std::abs(dca[0]) > cutsTrackPionDCA->get(pTBinTrack, "max_dcaxytoprimary")) { + if (std::abs(dca[0]) > trackPionConfigurations.cutsTrackPionDCA->get(pTBinTrack, "max_dcaxytoprimary")) { return false; // maximum DCAxy } return true; @@ -522,7 +552,7 @@ struct HfDataCreatorCharmHadPiReduced { std::vector arrDaughDsIndex; std::array arrPDGDaughDs; RecoDecay::getDaughters(particlesMc.rawIteratorAt(indexRec), &arrDaughDsIndex, std::array{0}, 1); - if (arrDaughDsIndex.size() == 2) { + if (arrDaughDsIndex.size() == NDaughtersDs) { for (auto iProng = 0u; iProng < arrDaughDsIndex.size(); ++iProng) { auto daughI = particlesMc.rawIteratorAt(arrDaughDsIndex[iProng]); arrPDGDaughDs[iProng] = std::abs(daughI.pdgCode()); @@ -559,7 +589,7 @@ struct HfDataCreatorCharmHadPiReduced { std::vector arrDaughDsIndex; std::array arrPDGDaughDs; RecoDecay::getDaughters(particlesMc.rawIteratorAt(indexRec), &arrDaughDsIndex, std::array{0}, 1); - if (arrDaughDsIndex.size() == 2) { + if (arrDaughDsIndex.size() == NDaughtersDs) { for (auto iProng = 0u; iProng < arrDaughDsIndex.size(); ++iProng) { auto daughI = particlesMc.rawIteratorAt(arrDaughDsIndex[iProng]); arrPDGDaughDs[iProng] = std::abs(daughI.pdgCode()); @@ -682,7 +712,7 @@ struct HfDataCreatorCharmHadPiReduced { // look for common c-hadron mother among prongs 0, 1 and 2 for (const auto& cHadronMotherHypo : cHadronMotherHypos) { int8_t depthMax = 2; - if (cHadronMotherHypo == Pdg::kDStar || cHadronMotherHypo == 423 || cHadronMotherHypo == Pdg::kDSStar) { // to include D* -> D π0/γ, D* -> D0 π, and Ds* -> Ds π0/γ + if (cHadronMotherHypo == Pdg::kDStar || cHadronMotherHypo == Pdg::kDStar0 || cHadronMotherHypo == Pdg::kDSStar) { // to include D* -> D π0/γ, D* -> D0 π, and Ds* -> Ds π0/γ depthMax += 1; } int index0CharmMother = RecoDecay::getMother(particlesMc, particleProng0, cHadronMotherHypo, true, &sign, depthMax); @@ -708,6 +738,110 @@ struct HfDataCreatorCharmHadPiReduced { rowHfD0PiMcCheckReduced(pdgCodeBeautyMother, pdgCodeCharmMother, pdgCodeProng0, pdgCodeProng1, pdgCodeProng2); } rowHfD0PiMcRecReduced(indexHfCandCharm, selectedTracksPion[vecDaughtersB.back().globalIndex()], flag, flagWrongCollision, debug, motherPt); + } else if constexpr (decChannel == DecayChannel::LbToLcplusPi) { + // Lb → Lc+ π- → (p K- π+) π- + auto indexRec = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersB[0], vecDaughtersB[1], vecDaughtersB[2], vecDaughtersB[3]}, Pdg::kLambdaB0, std::array{+kProton, -kKPlus, +kPiPlus, -kPiPlus}, true, &sign, 3); + if (indexRec > -1) { + // Lc+ → p K- π+ + // Printf("Checking Lc+ → p K- π+"); + indexRec = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersB[0], vecDaughtersB[1], vecDaughtersB[2]}, Pdg::kLambdaCPlus, std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2); + if (indexRec > -1) { + flag = sign * BIT(hf_cand_lb::DecayTypeMc::LbToLcPiToPKPiPi); + } else { + debug = 1; + LOGF(debug, "Lb decays in the expected final state but the condition on the intermediate state is not fulfilled"); + } + + auto indexMother = RecoDecay::getMother(particlesMc, vecDaughtersB.back().template mcParticle_as(), Pdg::kLambdaB0, true); + if (indexMother >= 0) { + auto particleMother = particlesMc.rawIteratorAt(indexMother); + motherPt = particleMother.pt(); + checkWrongCollision(particleMother, collision, indexCollisionMaxNumContrib, flagWrongCollision); + } + } + + // additional checks for correlated backgrounds + if (checkDecayTypeMc) { + // Lb → Lc+ K- → (p K- π+) K- + if (!flag) { + indexRec = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersB[0], vecDaughtersB[1], vecDaughtersB[2], vecDaughtersB[3]}, Pdg::kLambdaB0, std::array{+kProton, -kKPlus, +kPiPlus, -kKPlus}, true, &sign, 3); + if (indexRec > -1) { + // Lc+ → p K- π+ + indexRec = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersB[0], vecDaughtersB[1], vecDaughtersB[2]}, Pdg::kLambdaCPlus, std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2); + if (indexRec > -1) { + flag = sign * BIT(hf_cand_lb::DecayTypeMc::LbToLcPiToPKPiK); + } + } + } + // B0 → D- π+ → (π- K+ π-) π+ + if (!flag) { + indexRec = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersB[0], vecDaughtersB[1], vecDaughtersB[2], vecDaughtersB[3]}, Pdg::kB0, std::array{-kPiPlus, +kKPlus, -kPiPlus, +kPiPlus}, true, &sign, 3); + if (indexRec > -1) { + // D- → (π- K+ π- + indexRec = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersB[0], vecDaughtersB[1], vecDaughtersB[2]}, -Pdg::kDMinus, std::array{-kPiPlus, +kKPlus, -kPiPlus}, true, &sign, 2); + if (indexRec > -1) { + flag = sign * BIT(hf_cand_lb::DecayTypeMc::B0ToDplusPiToPiKPiPi); + } + } + } + + // Partly reconstructed decays, i.e. the 4 prongs have a common b-hadron ancestor + // convention: final state particles are prong0,1,2,3 + if (!flag) { + auto particleProng0 = vecDaughtersB[0].mcParticle(); + auto particleProng1 = vecDaughtersB[1].mcParticle(); + auto particleProng2 = vecDaughtersB[2].mcParticle(); + auto particleProng3 = vecDaughtersB[3].mcParticle(); + // b-hadron hypothesis + std::array bHadronMotherHypos = {Pdg::kB0, Pdg::kBS, Pdg::kLambdaB0}; + // c-hadron hypothesis + std::array cHadronMotherHypos = {Pdg::kDPlus, Pdg::kDS, Pdg::kDStar, Pdg::kLambdaCPlus}; + + for (const auto& bHadronMotherHypo : bHadronMotherHypos) { + int index0Mother = RecoDecay::getMother(particlesMc, particleProng0, bHadronMotherHypo, true); + int index1Mother = RecoDecay::getMother(particlesMc, particleProng1, bHadronMotherHypo, true); + int index2Mother = RecoDecay::getMother(particlesMc, particleProng2, bHadronMotherHypo, true); + int index3Mother = RecoDecay::getMother(particlesMc, particleProng3, bHadronMotherHypo, true); + + // look for common b-hadron ancestor + if (index0Mother > -1 && index1Mother > -1 && index2Mother > -1 && index3Mother > -1) { + if (index0Mother == index1Mother && index1Mother == index2Mother && index2Mother == index3Mother) { + flag = BIT(hf_cand_b0::DecayTypeMc::PartlyRecoDecay); + pdgCodeBeautyMother = particlesMc.rawIteratorAt(index0Mother).pdgCode(); + pdgCodeCharmMother = 0; + pdgCodeProng0 = particleProng0.pdgCode(); + pdgCodeProng1 = particleProng1.pdgCode(); + pdgCodeProng2 = particleProng2.pdgCode(); + pdgCodeProng3 = particleProng3.pdgCode(); + // look for common c-hadron mother among prongs 0, 1 and 2 + for (const auto& cHadronMotherHypo : cHadronMotherHypos) { + int8_t depthMax = 2; + if (cHadronMotherHypo == Pdg::kDStar) { // to include D* -> D π0/γ and D* -> D0 π + depthMax += 1; + } + int index0CharmMother = RecoDecay::getMother(particlesMc, particleProng0, cHadronMotherHypo, true, &sign, depthMax); + int index1CharmMother = RecoDecay::getMother(particlesMc, particleProng1, cHadronMotherHypo, true, &sign, depthMax); + int index2CharmMother = RecoDecay::getMother(particlesMc, particleProng2, cHadronMotherHypo, true, &sign, depthMax); + if (index0CharmMother > -1 && index1CharmMother > -1 && index2CharmMother > -1) { + if (index0CharmMother == index1CharmMother && index1CharmMother == index2CharmMother) { + // pdgCodeCharmMother = + // Pdg::kDPlus (if D+ is the mother and does not come from D*+) + // Pdg::kDPlus + Pdg::kDStar (if D+ is the mother and D*+ -> D+ π0/γ) + // Pdg::kDStar (if D*+ is the mother and D*+ -> D0 π+) + // Pdg::kDS (if Ds is the mother) + // Pdg::kLambdaCPlus (if Λc+ is the mother) + pdgCodeCharmMother += std::abs(particlesMc.rawIteratorAt(index0CharmMother).pdgCode()); + } + } + } + break; // Early exit: found a valid decay chain with common b-hadron mother + } + } + } + } + rowHfLcPiMcCheckReduced(pdgCodeBeautyMother, pdgCodeCharmMother, pdgCodeProng0, pdgCodeProng1, pdgCodeProng2, pdgCodeProng3); + } + rowHfLcPiMcRecReduced(indexHfCandCharm, selectedTracksPion[vecDaughtersB.back().globalIndex()], flag, flagWrongCollision, debug, motherPt); } } @@ -758,11 +892,11 @@ struct HfDataCreatorCharmHadPiReduced { registry.fill(HIST("hCpaDplus"), candC.cpa()); } else if constexpr (decChannel == DecayChannel::BsToDsminusPi) { indexHfCandCharm = hfCand3Prong.lastIndex() + 1; - if (candC.isSelDsToKKPi() >= selectionFlagDs) { + if (candC.isSelDsToKKPi() >= hfflagConfigurations.selectionFlagDs) { invMassC0 = hfHelper.invMassDsToKKPi(candC); registry.fill(HIST("hMassDsToKKPi"), invMassC0); } - if (candC.isSelDsToPiKK() >= selectionFlagDs) { + if (candC.isSelDsToPiKK() >= hfflagConfigurations.selectionFlagDs) { invMassC1 = hfHelper.invMassDsToPiKK(candC); registry.fill(HIST("hMassDsToPiKK"), invMassC1); } @@ -770,16 +904,28 @@ struct HfDataCreatorCharmHadPiReduced { registry.fill(HIST("hCpaDs"), candC.cpa()); } else if constexpr (decChannel == DecayChannel::BplusToD0barPi) { indexHfCandCharm = hfCand2Prong.lastIndex() + 1; - if (candC.isSelD0() >= selectionFlagD0) { + if (candC.isSelD0() >= hfflagConfigurations.selectionFlagD0) { invMassC0 = hfHelper.invMassD0ToPiK(candC); registry.fill(HIST("hMassD0"), invMassC0); } - if (candC.isSelD0bar() >= selectionFlagD0bar) { + if (candC.isSelD0bar() >= hfflagConfigurations.selectionFlagD0bar) { invMassC1 = hfHelper.invMassD0barToKPi(candC); registry.fill(HIST("hMassD0bar"), invMassC1); } registry.fill(HIST("hPtD0"), candC.pt()); registry.fill(HIST("hCpaD0"), candC.cpa()); + } else if constexpr (decChannel == DecayChannel::LbToLcplusPi) { + indexHfCandCharm = hfCand3Prong.lastIndex() + 1; + if (candC.isSelLcToPKPi() >= hfflagConfigurations.selectionFlagLc) { + invMassC0 = hfHelper.invMassLcToPKPi(candC); + registry.fill(HIST("hMassLcToPKPi"), invMassC0); + } + if (candC.isSelLcToPiKP() >= hfflagConfigurations.selectionFlagLc) { + invMassC1 = hfHelper.invMassLcToPiKP(candC); + registry.fill(HIST("hMassLcToPiKP"), invMassC1); + } + registry.fill(HIST("hPtLc"), candC.pt()); + registry.fill(HIST("hCpaLc"), candC.cpa()); } bool fillHfCandCharm = false; @@ -806,7 +952,7 @@ struct HfDataCreatorCharmHadPiReduced { } // third track, if it's a 3-prong - if constexpr (decChannel == DecayChannel::B0ToDminusPi || decChannel == DecayChannel::BsToDsminusPi) { + if constexpr (decChannel == DecayChannel::B0ToDminusPi || decChannel == DecayChannel::BsToDsminusPi || decChannel == DecayChannel::LbToLcplusPi) { charmHadDauTracks.push_back(candC.template prong2_as()); trackParCov2 = getTrackParCov(charmHadDauTracks[2]); pVec2 = charmHadDauTracks[2].pVector(); @@ -821,12 +967,14 @@ struct HfDataCreatorCharmHadPiReduced { // reconstruct charm candidate secondary vertex o2::track::TrackParCov trackParCovCharmHad{}; std::array pVecCharm{}; - if constexpr (decChannel == DecayChannel::B0ToDminusPi || decChannel == DecayChannel::BsToDsminusPi) { // D∓ → π∓ K± π∓ and Ds∓ → K∓ K± π∓ + if constexpr (decChannel == DecayChannel::B0ToDminusPi || decChannel == DecayChannel::BsToDsminusPi || decChannel == DecayChannel::LbToLcplusPi) { // D∓ → π∓ K± π∓ and Ds∓ → K∓ K± π∓ and Lc∓ → p∓ K± π∓ if constexpr (decChannel == DecayChannel::B0ToDminusPi) { hCandidatesDPlus->Fill(SVFitting::BeforeFit); - } else { + } else if constexpr (decChannel == DecayChannel::BsToDsminusPi) { hCandidatesDs->Fill(SVFitting::BeforeFit); + } else if constexpr (decChannel == DecayChannel::LbToLcplusPi) { + hCandidatesLc->Fill(SVFitting::BeforeFit); } try { @@ -837,15 +985,19 @@ struct HfDataCreatorCharmHadPiReduced { LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN cannot work, skipping the candidate."; if constexpr (decChannel == DecayChannel::B0ToDminusPi) { hCandidatesDPlus->Fill(SVFitting::Fail); - } else { + } else if constexpr (decChannel == DecayChannel::BsToDsminusPi) { hCandidatesDs->Fill(SVFitting::Fail); + } else if constexpr (decChannel == DecayChannel::LbToLcplusPi) { + hCandidatesLc->Fill(SVFitting::Fail); } continue; } if constexpr (decChannel == DecayChannel::B0ToDminusPi) { hCandidatesDPlus->Fill(SVFitting::FitOk); - } else { + } else if constexpr (decChannel == DecayChannel::BsToDsminusPi) { hCandidatesDs->Fill(SVFitting::FitOk); + } else if constexpr (decChannel == DecayChannel::LbToLcplusPi) { + hCandidatesLc->Fill(SVFitting::FitOk); } auto secondaryVertexCharm = df3.getPCACandidate(); @@ -915,12 +1067,12 @@ struct HfDataCreatorCharmHadPiReduced { } // reject pi D with same sign as D - if constexpr (decChannel == DecayChannel::B0ToDminusPi || decChannel == DecayChannel::BsToDsminusPi) { // D∓ → π∓ K± π∓ and Ds∓ → K∓ K± π∓ + if constexpr (decChannel == DecayChannel::B0ToDminusPi || decChannel == DecayChannel::BsToDsminusPi || decChannel == DecayChannel::LbToLcplusPi) { // D∓ → π∓ K± π∓ and Ds∓ → K∓ K± π∓ and Lc∓ → p∓ K± π∓ if (trackPion.sign() * charmHadDauTracks[0].sign() > 0) { continue; } } else if constexpr (decChannel == DecayChannel::BplusToD0barPi) { // D0(bar) → K± π∓ - if (!((candC.isSelD0() >= selectionFlagD0 && trackPion.sign() < 0) || (candC.isSelD0bar() >= selectionFlagD0bar && trackPion.sign() > 0))) { + if (!((candC.isSelD0() >= hfflagConfigurations.selectionFlagD0 && trackPion.sign() < 0) || (candC.isSelD0bar() >= hfflagConfigurations.selectionFlagD0bar && trackPion.sign() > 0))) { continue; } } @@ -969,8 +1121,9 @@ struct HfDataCreatorCharmHadPiReduced { } fillHfCandCharm = true; } // pion loop - if (fillHfCandCharm) { // fill candCplus table only once per D candidate - if constexpr (decChannel == DecayChannel::B0ToDminusPi || decChannel == DecayChannel::BsToDsminusPi) { // D∓ → π∓ K± π∓ and Ds∓ → K∓ K± π∓ + if (fillHfCandCharm) { // fill candCplus table only once per D candidate + constexpr std::size_t NSizeMLScore{3u}; + if constexpr (decChannel == DecayChannel::B0ToDminusPi || decChannel == DecayChannel::BsToDsminusPi || decChannel == DecayChannel::LbToLcplusPi) { // D∓ → π∓ K± π∓ and Ds∓ → K∓ K± π∓ and Lc∓ → p∓ K± π∓ hfCand3Prong(charmHadDauTracks[0].globalIndex(), charmHadDauTracks[1].globalIndex(), charmHadDauTracks[2].globalIndex(), indexHfReducedCollision, trackParCovCharmHad.getX(), trackParCovCharmHad.getAlpha(), @@ -984,21 +1137,29 @@ struct HfDataCreatorCharmHadPiReduced { trackParCovCharmHad.getSigmaTglSnp(), trackParCovCharmHad.getSigmaTgl2(), trackParCovCharmHad.getSigma1PtY(), trackParCovCharmHad.getSigma1PtZ(), trackParCovCharmHad.getSigma1PtSnp(), trackParCovCharmHad.getSigma1PtTgl(), trackParCovCharmHad.getSigma1Pt2()); - hfCandPidProng0(candC.nSigTpcPi0(), candC.nSigTofPi0(), candC.nSigTpcKa0(), candC.nSigTofKa0(), charmHadDauTracks[0].hasTOF(), charmHadDauTracks[0].hasTPC()); - hfCandPidProng1(candC.nSigTpcPi1(), candC.nSigTofPi1(), candC.nSigTpcKa1(), candC.nSigTofKa1(), charmHadDauTracks[1].hasTOF(), charmHadDauTracks[1].hasTPC()); - hfCandPidProng2(candC.nSigTpcPi2(), candC.nSigTofPi2(), candC.nSigTpcKa2(), candC.nSigTofKa2(), charmHadDauTracks[2].hasTOF(), charmHadDauTracks[2].hasTPC()); + hfCandPidProng0(candC.nSigTpcPi0(), candC.nSigTofPi0(), candC.nSigTpcKa0(), candC.nSigTofKa0(), candC.nSigTpcPr0(), candC.nSigTofPr0(), charmHadDauTracks[0].hasTOF(), charmHadDauTracks[0].hasTPC()); + hfCandPidProng1(candC.nSigTpcPi1(), candC.nSigTofPi1(), candC.nSigTpcKa1(), candC.nSigTofKa1(), candC.nSigTpcPr1(), candC.nSigTofPr1(), charmHadDauTracks[1].hasTOF(), charmHadDauTracks[1].hasTPC()); + hfCandPidProng2(candC.nSigTpcPi2(), candC.nSigTofPi2(), candC.nSigTpcKa2(), candC.nSigTofKa2(), candC.nSigTpcPr2(), candC.nSigTofPr2(), charmHadDauTracks[2].hasTOF(), charmHadDauTracks[2].hasTPC()); if constexpr (withMl) { + std::array mlScores = {-1.f, -1.f, -1.f, -1.f, -1.f, -1.f}; if constexpr (decChannel == DecayChannel::B0ToDminusPi) { hfCand3ProngMl(candC.mlProbDplusToPiKPi()[0], candC.mlProbDplusToPiKPi()[1], candC.mlProbDplusToPiKPi()[2], -1., -1., -1.); - } else { - std::array mlScores = {-1.f, -1.f, -1.f, -1.f, -1.f, -1.f}; - if (candC.mlProbDsToKKPi().size() == 3) { + } else if constexpr (decChannel == DecayChannel::BsToDsminusPi) { + if (candC.mlProbDsToKKPi().size() == NSizeMLScore) { std::copy(candC.mlProbDsToKKPi().begin(), candC.mlProbDsToKKPi().end(), mlScores.begin()); } - if (candC.mlProbDsToPiKK().size() == 3) { + if (candC.mlProbDsToPiKK().size() == NSizeMLScore) { std::copy(candC.mlProbDsToPiKK().begin(), candC.mlProbDsToPiKK().end(), mlScores.begin() + 3); } hfCand3ProngMl(mlScores[0], mlScores[1], mlScores[2], mlScores[3], mlScores[4], mlScores[5]); + } else if constexpr (decChannel == DecayChannel::LbToLcplusPi) { + if (candC.mlProbLcToPKPi().size() == NSizeMLScore) { + std::copy(candC.mlProbLcToPKPi().begin(), candC.mlProbLcToPKPi().end(), mlScores.begin()); + } + if (candC.mlProbLcToPiKP().size() == NSizeMLScore) { + std::copy(candC.mlProbLcToPiKP().begin(), candC.mlProbLcToPiKP().end(), mlScores.begin() + 3); + } + hfCand3ProngMl(mlScores[0], mlScores[1], mlScores[2], mlScores[3], mlScores[4], mlScores[5]); } } } else if constexpr (decChannel == DecayChannel::BplusToD0barPi) { // D0(bar) → K± π∓ @@ -1015,14 +1176,14 @@ struct HfDataCreatorCharmHadPiReduced { trackParCovCharmHad.getSigmaTglSnp(), trackParCovCharmHad.getSigmaTgl2(), trackParCovCharmHad.getSigma1PtY(), trackParCovCharmHad.getSigma1PtZ(), trackParCovCharmHad.getSigma1PtSnp(), trackParCovCharmHad.getSigma1PtTgl(), trackParCovCharmHad.getSigma1Pt2()); - hfCandPidProng0(candC.nSigTpcPi0(), candC.nSigTofPi0(), candC.nSigTpcKa0(), candC.nSigTofKa0(), charmHadDauTracks[0].hasTOF(), charmHadDauTracks[0].hasTPC()); - hfCandPidProng1(candC.nSigTpcPi1(), candC.nSigTofPi1(), candC.nSigTpcKa1(), candC.nSigTofKa1(), charmHadDauTracks[1].hasTOF(), charmHadDauTracks[1].hasTPC()); + hfCandPidProng0(candC.nSigTpcPi0(), candC.nSigTofPi0(), candC.nSigTpcKa0(), candC.nSigTofKa0(), 0., 0., charmHadDauTracks[0].hasTOF(), charmHadDauTracks[0].hasTPC()); + hfCandPidProng1(candC.nSigTpcPi1(), candC.nSigTofPi1(), candC.nSigTpcKa1(), candC.nSigTofKa1(), 0., 0., charmHadDauTracks[1].hasTOF(), charmHadDauTracks[1].hasTPC()); if constexpr (withMl) { std::array mlScores = {-1.f, -1.f, -1.f, -1.f, -1.f, -1.f}; - if (candC.mlProbD0().size() == 3) { + if (candC.mlProbD0().size() == NSizeMLScore) { std::copy(candC.mlProbD0().begin(), candC.mlProbD0().end(), mlScores.begin()); } - if (candC.mlProbD0bar().size() == 3) { + if (candC.mlProbD0bar().size() == NSizeMLScore) { std::copy(candC.mlProbD0bar().begin(), candC.mlProbD0bar().end(), mlScores.begin() + 3); } hfCand2ProngMl(mlScores[0], mlScores[1], mlScores[2], mlScores[3], mlScores[4], mlScores[5]); @@ -1104,7 +1265,7 @@ struct HfDataCreatorCharmHadPiReduced { std::vector arrDaughDsIndex; std::array arrPDGDaughDs; RecoDecay::getDaughters(candCMC, &arrDaughDsIndex, std::array{0}, 1); - if (arrDaughDsIndex.size() == 2) { + if (arrDaughDsIndex.size() == NDaughtersDs) { for (auto jProng = 0u; jProng < arrDaughDsIndex.size(); ++jProng) { auto daughJ = particlesMc.rawIteratorAt(arrDaughDsIndex[jProng]); arrPDGDaughDs[jProng] = std::abs(daughJ.pdgCode()); @@ -1130,7 +1291,7 @@ struct HfDataCreatorCharmHadPiReduced { std::vector arrDaughDsIndex; std::array arrPDGDaughDs; RecoDecay::getDaughters(candCMC, &arrDaughDsIndex, std::array{0}, 1); - if (arrDaughDsIndex.size() == 2) { + if (arrDaughDsIndex.size() == NDaughtersDs) { for (auto jProng = 0u; jProng < arrDaughDsIndex.size(); ++jProng) { auto daughJ = particlesMc.rawIteratorAt(arrDaughDsIndex[jProng]); arrPDGDaughDs[jProng] = std::abs(daughJ.pdgCode()); @@ -1203,6 +1364,39 @@ struct HfDataCreatorCharmHadPiReduced { rowHfBpMcGenReduced(flag, ptParticle, yParticle, etaParticle, ptProngs[0], yProngs[0], etaProngs[0], ptProngs[1], yProngs[1], etaProngs[1]); + } else if constexpr (decayChannel == DecayChannel::LbToLcplusPi) { + // Lb → Lc+ π- + if (RecoDecay::isMatchedMCGen(particlesMc, particle, Pdg::kLambdaB0, std::array{static_cast(Pdg::kLambdaCPlus), -kPiPlus}, true)) { + // Match Lc+ → p K- π+ + auto candCMC = particlesMc.rawIteratorAt(particle.daughtersIds().front()); + // Printf("Checking Lc+ → p K- π+"); + if (RecoDecay::isMatchedMCGen(particlesMc, candCMC, static_cast(Pdg::kLambdaCPlus), std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2)) { + flag = sign * BIT(hf_cand_lb::DecayType::LbToLcPi); + } + } + + // save information for Lc task + if (!TESTBIT(std::abs(flag), hf_cand_lb::DecayType::LbToLcPi)) { + continue; + } + + auto ptParticle = particle.pt(); + auto yParticle = RecoDecay::y(particle.pVector(), massB); + auto etaParticle = particle.eta(); + + std::array ptProngs; + std::array yProngs; + std::array etaProngs; + int counter = 0; + for (const auto& daught : particle.daughters_as()) { + ptProngs[counter] = daught.pt(); + etaProngs[counter] = daught.eta(); + yProngs[counter] = RecoDecay::y(daught.pVector(), pdg->Mass(daught.pdgCode())); + counter++; + } + rowHfLbMcGenReduced(flag, ptParticle, yParticle, etaParticle, + ptProngs[0], yProngs[0], etaProngs[0], + ptProngs[1], yProngs[1], etaProngs[1]); } } // gen } @@ -1218,7 +1412,7 @@ struct HfDataCreatorCharmHadPiReduced { { // store configurables needed for B0 workflow if (!isHfCandBhadConfigFilled) { - rowCandidateConfigB0(selectionFlagDplus.value, invMassWindowCharmHadPi.value); + rowCandidateConfigB0(hfflagConfigurations.selectionFlagDplus.value, invMassWindowCharmHadPi.value); isHfCandBhadConfigFilled = true; } @@ -1248,7 +1442,7 @@ struct HfDataCreatorCharmHadPiReduced { { // store configurables needed for B0 workflow if (!isHfCandBhadConfigFilled) { - rowCandidateConfigB0(selectionFlagDplus.value, invMassWindowCharmHadPi.value); + rowCandidateConfigB0(hfflagConfigurations.selectionFlagDplus.value, invMassWindowCharmHadPi.value); isHfCandBhadConfigFilled = true; } @@ -1278,7 +1472,7 @@ struct HfDataCreatorCharmHadPiReduced { { // store configurables needed for B0 workflow if (!isHfCandBhadConfigFilled) { - rowCandidateConfigB0(selectionFlagDplus.value, invMassWindowCharmHadPi.value); + rowCandidateConfigB0(hfflagConfigurations.selectionFlagDplus.value, invMassWindowCharmHadPi.value); isHfCandBhadConfigFilled = true; } @@ -1308,7 +1502,7 @@ struct HfDataCreatorCharmHadPiReduced { { // store configurables needed for B0 workflow if (!isHfCandBhadConfigFilled) { - rowCandidateConfigB0(selectionFlagDplus.value, invMassWindowCharmHadPi.value); + rowCandidateConfigB0(hfflagConfigurations.selectionFlagDplus.value, invMassWindowCharmHadPi.value); isHfCandBhadConfigFilled = true; } @@ -1338,7 +1532,7 @@ struct HfDataCreatorCharmHadPiReduced { { // store configurables needed for Bs workflow if (!isHfCandBhadConfigFilled) { - rowCandidateConfigBs(selectionFlagDs.value, invMassWindowCharmHadPi.value); + rowCandidateConfigBs(hfflagConfigurations.selectionFlagDs.value, invMassWindowCharmHadPi.value); isHfCandBhadConfigFilled = true; } @@ -1368,7 +1562,7 @@ struct HfDataCreatorCharmHadPiReduced { { // store configurables needed for Bs workflow if (!isHfCandBhadConfigFilled) { - rowCandidateConfigBs(selectionFlagDs.value, invMassWindowCharmHadPi.value); + rowCandidateConfigBs(hfflagConfigurations.selectionFlagDs.value, invMassWindowCharmHadPi.value); isHfCandBhadConfigFilled = true; } @@ -1398,7 +1592,7 @@ struct HfDataCreatorCharmHadPiReduced { { // store configurables needed for Bs workflow if (!isHfCandBhadConfigFilled) { - rowCandidateConfigBs(selectionFlagDs.value, invMassWindowCharmHadPi.value); + rowCandidateConfigBs(hfflagConfigurations.selectionFlagDs.value, invMassWindowCharmHadPi.value); isHfCandBhadConfigFilled = true; } @@ -1428,7 +1622,7 @@ struct HfDataCreatorCharmHadPiReduced { { // store configurables needed for Bs workflow if (!isHfCandBhadConfigFilled) { - rowCandidateConfigBs(selectionFlagDs.value, invMassWindowCharmHadPi.value); + rowCandidateConfigBs(hfflagConfigurations.selectionFlagDs.value, invMassWindowCharmHadPi.value); isHfCandBhadConfigFilled = true; } @@ -1458,7 +1652,7 @@ struct HfDataCreatorCharmHadPiReduced { { // store configurables needed for B+ workflow if (!isHfCandBhadConfigFilled) { - rowCandidateConfigBplus(selectionFlagD0.value, selectionFlagD0bar.value, invMassWindowCharmHadPi.value); + rowCandidateConfigBplus(hfflagConfigurations.selectionFlagD0.value, hfflagConfigurations.selectionFlagD0bar.value, invMassWindowCharmHadPi.value); isHfCandBhadConfigFilled = true; } @@ -1488,7 +1682,7 @@ struct HfDataCreatorCharmHadPiReduced { { // store configurables needed for B+ workflow if (!isHfCandBhadConfigFilled) { - rowCandidateConfigBplus(selectionFlagD0.value, selectionFlagD0bar.value, invMassWindowCharmHadPi.value); + rowCandidateConfigBplus(hfflagConfigurations.selectionFlagD0.value, hfflagConfigurations.selectionFlagD0bar.value, invMassWindowCharmHadPi.value); isHfCandBhadConfigFilled = true; } @@ -1518,7 +1712,7 @@ struct HfDataCreatorCharmHadPiReduced { { // store configurables needed for B+ workflow if (!isHfCandBhadConfigFilled) { - rowCandidateConfigBplus(selectionFlagD0.value, selectionFlagD0bar.value, invMassWindowCharmHadPi.value); + rowCandidateConfigBplus(hfflagConfigurations.selectionFlagD0.value, hfflagConfigurations.selectionFlagD0bar.value, invMassWindowCharmHadPi.value); isHfCandBhadConfigFilled = true; } @@ -1548,7 +1742,7 @@ struct HfDataCreatorCharmHadPiReduced { { // store configurables needed for B+ workflow if (!isHfCandBhadConfigFilled) { - rowCandidateConfigBplus(selectionFlagD0.value, selectionFlagD0bar.value, invMassWindowCharmHadPi.value); + rowCandidateConfigBplus(hfflagConfigurations.selectionFlagD0.value, hfflagConfigurations.selectionFlagD0bar.value, invMassWindowCharmHadPi.value); isHfCandBhadConfigFilled = true; } @@ -1570,6 +1764,66 @@ struct HfDataCreatorCharmHadPiReduced { } PROCESS_SWITCH(HfDataCreatorCharmHadPiReduced, processD0PiDataWithMlAndQvec, "Process D0Pi without MC info, with ML info, and with Q-vectors", false); + void processLcPiData(CollisionsWCent const& collisions, + CandsLcFiltered const& candsC, + aod::TrackAssoc const& trackIndices, + TracksPidWithSel const& tracks, + aod::BCsWithTimestamps const& bcs) + { + // store configurables needed for Lb workflow + if (!isHfCandBhadConfigFilled) { + rowCandidateConfigLb(hfflagConfigurations.selectionFlagLc.value, invMassWindowCharmHadPi.value); + isHfCandBhadConfigFilled = true; + } + + int zvtxColl{0}; + int sel8Coll{0}; + int zvtxAndSel8Coll{0}; + int zvtxAndSel8CollAndSoftTrig{0}; + int allSelColl{0}; + for (const auto& collision : collisions) { + o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + + auto thisCollId = collision.globalIndex(); + auto candsCThisColl = candsC.sliceBy(candsLcPerCollision, thisCollId); + auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); + runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, tracks, -1, bcs); + } + // handle normalization by the right number of collisions + hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); + } + PROCESS_SWITCH(HfDataCreatorCharmHadPiReduced, processLcPiData, "Process LcPi without MC info and without ML info", true); + + void processLcPiDataWithMl(CollisionsWCent const& collisions, + CandsLcFilteredWithMl const& candsC, + aod::TrackAssoc const& trackIndices, + TracksPidWithSel const& tracks, + aod::BCsWithTimestamps const& bcs) + { + // store configurables needed for Lb workflow + if (!isHfCandBhadConfigFilled) { + rowCandidateConfigLb(hfflagConfigurations.selectionFlagLc.value, invMassWindowCharmHadPi.value); + isHfCandBhadConfigFilled = true; + } + + int zvtxColl{0}; + int sel8Coll{0}; + int zvtxAndSel8Coll{0}; + int zvtxAndSel8CollAndSoftTrig{0}; + int allSelColl{0}; + for (const auto& collision : collisions) { + o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + + auto thisCollId = collision.globalIndex(); + auto candsCThisColl = candsC.sliceBy(candsLcPerCollisionWithMl, thisCollId); + auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); + runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, tracks, -1, bcs); + } + // handle normalization by the right number of collisions + hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); + } + PROCESS_SWITCH(HfDataCreatorCharmHadPiReduced, processLcPiDataWithMl, "Process LcPi without MC info and with ML info", false); + //////////////////////////////////////////////////////////////////////////////////////////////////// // PROCESS FUNCTIONS FOR MC @@ -1583,7 +1837,7 @@ struct HfDataCreatorCharmHadPiReduced { { // store configurables needed for B0 workflow if (!isHfCandBhadConfigFilled) { - rowCandidateConfigB0(selectionFlagDplus.value, invMassWindowCharmHadPi.value); + rowCandidateConfigB0(hfflagConfigurations.selectionFlagDplus.value, invMassWindowCharmHadPi.value); isHfCandBhadConfigFilled = true; } @@ -1618,7 +1872,7 @@ struct HfDataCreatorCharmHadPiReduced { { // store configurables needed for B0 workflow if (!isHfCandBhadConfigFilled) { - rowCandidateConfigB0(selectionFlagDplus.value, invMassWindowCharmHadPi.value); + rowCandidateConfigB0(hfflagConfigurations.selectionFlagDplus.value, invMassWindowCharmHadPi.value); isHfCandBhadConfigFilled = true; } @@ -1653,7 +1907,7 @@ struct HfDataCreatorCharmHadPiReduced { { // store configurables needed for Bs workflow if (!isHfCandBhadConfigFilled) { - rowCandidateConfigBs(selectionFlagDs.value, invMassWindowCharmHadPi.value); + rowCandidateConfigBs(hfflagConfigurations.selectionFlagDs.value, invMassWindowCharmHadPi.value); isHfCandBhadConfigFilled = true; } @@ -1688,7 +1942,7 @@ struct HfDataCreatorCharmHadPiReduced { { // store configurables needed for Bs workflow if (!isHfCandBhadConfigFilled) { - rowCandidateConfigBs(selectionFlagDs.value, invMassWindowCharmHadPi.value); + rowCandidateConfigBs(hfflagConfigurations.selectionFlagDs.value, invMassWindowCharmHadPi.value); isHfCandBhadConfigFilled = true; } @@ -1723,7 +1977,7 @@ struct HfDataCreatorCharmHadPiReduced { { // store configurables needed for B+ workflow if (!isHfCandBhadConfigFilled) { - rowCandidateConfigBplus(selectionFlagD0.value, selectionFlagD0bar.value, invMassWindowCharmHadPi.value); + rowCandidateConfigBplus(hfflagConfigurations.selectionFlagD0.value, hfflagConfigurations.selectionFlagD0bar.value, invMassWindowCharmHadPi.value); isHfCandBhadConfigFilled = true; } @@ -1758,7 +2012,7 @@ struct HfDataCreatorCharmHadPiReduced { { // store configurables needed for B+ workflow if (!isHfCandBhadConfigFilled) { - rowCandidateConfigBplus(selectionFlagD0.value, selectionFlagD0bar.value, invMassWindowCharmHadPi.value); + rowCandidateConfigBplus(hfflagConfigurations.selectionFlagD0.value, hfflagConfigurations.selectionFlagD0bar.value, invMassWindowCharmHadPi.value); isHfCandBhadConfigFilled = true; } @@ -1782,6 +2036,77 @@ struct HfDataCreatorCharmHadPiReduced { runMcGen(particlesMc); } PROCESS_SWITCH(HfDataCreatorCharmHadPiReduced, processD0PiMcWithMl, "Process D0Pi with MC info and with ML info", false); + + void processLcPiMc(CollisionsWCentAndMcLabels const& collisions, + CandsLcFiltered const& candsC, + aod::TrackAssoc const& trackIndices, + TracksPidWithSelAndMc const& tracks, + aod::McParticles const& particlesMc, + aod::BCsWithTimestamps const& bcs, + McCollisions const&) + { + // store configurables needed for Lb workflow + if (!isHfCandBhadConfigFilled) { + rowCandidateConfigLb(hfflagConfigurations.selectionFlagDplus.value, invMassWindowCharmHadPi.value); + isHfCandBhadConfigFilled = true; + } + + int zvtxColl{0}; + int sel8Coll{0}; + int zvtxAndSel8Coll{0}; + int zvtxAndSel8CollAndSoftTrig{0}; + int allSelColl{0}; + for (const auto& collision : collisions) { + o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + + auto thisCollId = collision.globalIndex(); + auto candsCThisColl = candsC.sliceBy(candsLcPerCollision, thisCollId); + auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); + auto collsSameMcCollision = collisions.sliceBy(colPerMcCollision, collision.mcCollisionId()); + int64_t indexCollisionMaxNumContrib = getIndexCollisionMaxNumContrib(collsSameMcCollision); + runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, particlesMc, indexCollisionMaxNumContrib, bcs); + } + // handle normalization by the right number of collisions + hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); + runMcGen(particlesMc); + } + PROCESS_SWITCH(HfDataCreatorCharmHadPiReduced, processLcPiMc, "Process LcPi with MC info and without ML info", false); + + void processLcPiMcWithMl(CollisionsWCentAndMcLabels const& collisions, + CandsLcFilteredWithMl const& candsC, + aod::TrackAssoc const& trackIndices, + TracksPidWithSelAndMc const& tracks, + aod::McParticles const& particlesMc, + aod::BCsWithTimestamps const& bcs, + McCollisions const&) + { + // store configurables needed for Lb workflow + if (!isHfCandBhadConfigFilled) { + rowCandidateConfigLb(hfflagConfigurations.selectionFlagLc.value, invMassWindowCharmHadPi.value); + isHfCandBhadConfigFilled = true; + } + + int zvtxColl{0}; + int sel8Coll{0}; + int zvtxAndSel8Coll{0}; + int zvtxAndSel8CollAndSoftTrig{0}; + int allSelColl{0}; + for (const auto& collision : collisions) { + o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + + auto thisCollId = collision.globalIndex(); + auto candsCThisColl = candsC.sliceBy(candsLcPerCollisionWithMl, thisCollId); + auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); + auto collsSameMcCollision = collisions.sliceBy(colPerMcCollision, collision.mcCollisionId()); + int64_t indexCollisionMaxNumContrib = getIndexCollisionMaxNumContrib(collsSameMcCollision); + runDataCreation(collision, candsCThisColl, trackIdsThisCollision, tracks, particlesMc, indexCollisionMaxNumContrib, bcs); + } + // handle normalization by the right number of collisions + hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); + runMcGen(particlesMc); + } + PROCESS_SWITCH(HfDataCreatorCharmHadPiReduced, processLcPiMcWithMl, "Process LcPi with MC info and with ML info", false); + }; // struct WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) diff --git a/PWGHF/D2H/Tasks/CMakeLists.txt b/PWGHF/D2H/Tasks/CMakeLists.txt index 89f660b85ba..52019c9227e 100644 --- a/PWGHF/D2H/Tasks/CMakeLists.txt +++ b/PWGHF/D2H/Tasks/CMakeLists.txt @@ -84,6 +84,11 @@ o2physics_add_dpl_workflow(task-lb PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(task-lb-reduced + SOURCES taskLbReduced.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(task-lc SOURCES taskLc.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore diff --git a/PWGHF/D2H/Tasks/taskLbReduced.cxx b/PWGHF/D2H/Tasks/taskLbReduced.cxx new file mode 100644 index 00000000000..fb6cf1432d8 --- /dev/null +++ b/PWGHF/D2H/Tasks/taskLbReduced.cxx @@ -0,0 +1,824 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file taskLbReduced.cxx +/// \brief Lb → Lc+ π- → (pK- π+) π- analysis task +/// +/// \author Biao Zhang , Heidelberg University + +#include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/runDataProcessing.h" +#include "Common/Core/RecoDecay.h" + +#include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" +#include "PWGHF/DataModel/CandidateReconstructionTables.h" +#include "PWGHF/DataModel/CandidateSelectionTables.h" +#include "PWGHF/D2H/DataModel/ReducedDataModel.h" + +using namespace o2; +using namespace o2::aod; +using namespace o2::analysis; +using namespace o2::framework; +using namespace o2::framework::expressions; + +namespace o2::aod +{ +namespace hf_cand_lb_lite +{ +DECLARE_SOA_COLUMN(PtLc, ptLc, float); //! Transverse momentum of Lc-baryon daughter candidate (GeV/c) +DECLARE_SOA_COLUMN(PtBach, ptBach, float); //! Transverse momentum of bachelor pion (GeV/c) +DECLARE_SOA_COLUMN(AbsEtaBach, absEtaBach, float); //! Absolute pseudorapidity of bachelor pion +DECLARE_SOA_COLUMN(ItsNClsBach, itsNClsBach, int); //! Number of ITS clusters of bachelor pion +DECLARE_SOA_COLUMN(TpcNClsCrossedRowsBach, tpcNClsCrossedRowsBach, int); //! Number of TPC crossed rows of prongs of bachelor pion +DECLARE_SOA_COLUMN(TpcChi2NClBach, tpcChi2NClBach, float); //! Maximum TPC chi2 of prongs of Lc-baryon daughter candidate +DECLARE_SOA_COLUMN(PtLcProngMin, ptLcProngMin, float); //! Minimum pT of prongs of Lc-baryon daughter candidate (GeV/c) +DECLARE_SOA_COLUMN(EtaLcProngMin, etaLcProngMin, float); //! Minimum absolute pseudorapidity of prongs of Lc-baryon daughter candidate +DECLARE_SOA_COLUMN(ItsNClsLcProngMin, itsNClsLcProngMin, int); //! Minimum number of ITS clusters of prongs of Lc-baryon daughter candidate +DECLARE_SOA_COLUMN(TpcNClsCrossedRowsLcProngMin, tpcNClsCrossedRowsLcProngMin, int); //! Minimum number of TPC crossed rows of prongs of Lc-baryon daughter candidate +DECLARE_SOA_COLUMN(TpcChi2NClLcProngMax, tpcChi2NClLcProngMax, float); //! Maximum TPC chi2 of prongs of Lc-baryon daughter candidate +DECLARE_SOA_COLUMN(MLc, mLc, float); //! Invariant mass of Lc-baryon daughter candidates (GeV/c) +DECLARE_SOA_COLUMN(M, m, float); //! Invariant mass of candidate (GeV/c2) +DECLARE_SOA_COLUMN(Pt, pt, float); //! Transverse momentum of candidate (GeV/c) +DECLARE_SOA_COLUMN(PtGen, ptGen, float); //! Transverse momentum of candidate (GeV/c) +DECLARE_SOA_COLUMN(P, p, float); //! Momentum of candidate (GeV/c) +DECLARE_SOA_COLUMN(Y, y, float); //! Rapidity of candidate +DECLARE_SOA_COLUMN(Eta, eta, float); //! Pseudorapidity of candidate +DECLARE_SOA_COLUMN(Phi, phi, float); //! Azimuth angle of candidate +DECLARE_SOA_COLUMN(E, e, float); //! Energy of candidate (GeV) +DECLARE_SOA_COLUMN(NSigTpcPiBachelor, nSigTpcPiBachelor, float); //! TPC Nsigma separation for bachelor with pion mass hypothesis +DECLARE_SOA_COLUMN(NSigTofPiBachelor, nSigTofPiBachelor, float); //! TOF Nsigma separation for bachelor with pion mass hypothesis +DECLARE_SOA_COLUMN(NSigTpcTofPiBachelor, nSigTpcTofPiBachelor, float); //! Combined TPC and TOF Nsigma separation for bachelor with pion mass hypothesis +DECLARE_SOA_COLUMN(NSigTpcPrLcProng0, nSigTpcPrLcProng0, float); //! TPC Nsigma separation for Lc-baryon prong0 with proton mass hypothesis +DECLARE_SOA_COLUMN(NSigTofPrLcProng0, nSigTofPrLcProng0, float); //! TOF Nsigma separation for Lc-baryon prong0 with proton mass hypothesis +DECLARE_SOA_COLUMN(NSigTpcTofPrLcProng0, nSigTpcTofPrLcProng0, float); //! Combined TPC and TOF Nsigma separation for Lc-baryon prong0 with proton mass hypothesis +DECLARE_SOA_COLUMN(NSigTpcKaLcProng1, nSigTpcKaLcProng1, float); //! TPC Nsigma separation for Lc-baryon prong1 with kaon mass hypothesis +DECLARE_SOA_COLUMN(NSigTofKaLcProng1, nSigTofKaLcProng1, float); //! TOF Nsigma separation for Lc-baryon prong1 with kaon mass hypothesis +DECLARE_SOA_COLUMN(NSigTpcTofKaLcProng1, nSigTpcTofKaLcProng1, float); //! Combined TPC and TOF Nsigma separation for Lc-baryon prong1 with kaon mass hypothesis +DECLARE_SOA_COLUMN(NSigTpcPiLcProng2, nSigTpcPiLcProng2, float); //! TPC Nsigma separation for Lc-baryon prong2 with pion mass hypothesis +DECLARE_SOA_COLUMN(NSigTofPiLcProng2, nSigTofPiLcProng2, float); //! TOF Nsigma separation for Lc-baryon prong2 with pion mass hypothesis +DECLARE_SOA_COLUMN(NSigTpcTofPiLcProng2, nSigTpcTofPiLcProng2, float); //! Combined TPC and TOF Nsigma separation for Lc-baryon prong0 with pion mass hypothesis +DECLARE_SOA_COLUMN(DecayLength, decayLength, float); //! Decay length of candidate (cm) +DECLARE_SOA_COLUMN(DecayLengthXY, decayLengthXY, float); //! Transverse decay length of candidate (cm) +DECLARE_SOA_COLUMN(DecayLengthNormalised, decayLengthNormalised, float); //! Normalised decay length of candidate +DECLARE_SOA_COLUMN(DecayLengthXYNormalised, decayLengthXYNormalised, float); //! Normalised transverse decay length of candidate +DECLARE_SOA_COLUMN(DecayLengthLc, decayLengthLc, float); //! Decay length of Lc-baryon daughter candidate (cm) +DECLARE_SOA_COLUMN(DecayLengthXYLc, decayLengthXYLc, float); //! Transverse decay length of Lc-baryon daughter candidate (cm) +DECLARE_SOA_COLUMN(ImpactParameterLc, impactParameterLc, float); //! Impact parameter product of Lc-baryon daughter candidate +DECLARE_SOA_COLUMN(ImpactParameterBach, impactParameterBach, float); //! Impact parameter product of bachelor pion +DECLARE_SOA_COLUMN(ImpactParameterProduct, impactParameterProduct, float); //! Impact parameter product of daughters +DECLARE_SOA_COLUMN(Cpa, cpa, float); //! Cosine pointing angle of candidate +DECLARE_SOA_COLUMN(CpaXY, cpaXY, float); //! Cosine pointing angle of candidate in transverse plane +DECLARE_SOA_COLUMN(MaxNormalisedDeltaIP, maxNormalisedDeltaIP, float); //! Maximum normalized difference between measured and expected impact parameter of candidate prongs +DECLARE_SOA_COLUMN(MlScoreSig, mlScoreSig, float); //! ML score for signal class +DECLARE_SOA_COLUMN(FlagWrongCollision, flagWrongCollision, int8_t); //! Flag for association with wrong collision +} // namespace hf_cand_lb_lite + +DECLARE_SOA_TABLE(HfRedCandLbLites, "AOD", "HFREDCANDLBLITE", //! Table with some Lb properties + // B meson features hf_cand_lb_lite::M, + hf_cand_lb_lite::M, + hf_cand_lb_lite::Pt, + hf_cand_lb_lite::Eta, + hf_cand_lb_lite::Phi, + hf_cand_lb_lite::Y, + hf_cand_lb_lite::Cpa, + hf_cand_lb_lite::CpaXY, + hf_cand::Chi2PCA, + hf_cand_lb_lite::DecayLength, + hf_cand_lb_lite::DecayLengthXY, + hf_cand_lb_lite::DecayLengthNormalised, + hf_cand_lb_lite::DecayLengthXYNormalised, + hf_cand_lb_lite::ImpactParameterProduct, + hf_cand_lb_lite::MaxNormalisedDeltaIP, + hf_cand_lb_lite::MlScoreSig, + hf_sel_candidate_lb::IsSelLbToLcPi, + // Lc baryon features + hf_cand_lb_lite::MLc, + hf_cand_lb_lite::PtLc, + hf_cand_lb_lite::DecayLengthLc, + hf_cand_lb_lite::DecayLengthXYLc, + hf_cand_lb_lite::ImpactParameterLc, + hf_cand_lb_lite::PtLcProngMin, + hf_cand_lb_lite::EtaLcProngMin, + hf_cand_lb_lite::ItsNClsLcProngMin, + hf_cand_lb_lite::TpcNClsCrossedRowsLcProngMin, + hf_cand_lb_lite::TpcChi2NClLcProngMax, + hf_cand_lb_lite::NSigTpcPrLcProng0, + hf_cand_lb_lite::NSigTofPrLcProng0, + hf_cand_lb_lite::NSigTpcTofPrLcProng0, + hf_cand_lb_lite::NSigTpcKaLcProng1, + hf_cand_lb_lite::NSigTofKaLcProng1, + hf_cand_lb_lite::NSigTpcTofKaLcProng1, + hf_cand_lb_lite::NSigTpcPiLcProng2, + hf_cand_lb_lite::NSigTofPiLcProng2, + hf_cand_lb_lite::NSigTpcTofPiLcProng2, + hf_cand_lb_reduced::Prong0MlScoreBkg, + hf_cand_lb_reduced::Prong0MlScorePrompt, + hf_cand_lb_reduced::Prong0MlScoreNonprompt, + // pion features + hf_cand_lb_lite::PtBach, + hf_cand_lb_lite::AbsEtaBach, + hf_cand_lb_lite::ItsNClsBach, + hf_cand_lb_lite::TpcNClsCrossedRowsBach, + hf_cand_lb_lite::TpcChi2NClBach, + hf_cand_lb_lite::ImpactParameterBach, + hf_cand_lb_lite::NSigTpcPiBachelor, + hf_cand_lb_lite::NSigTofPiBachelor, + hf_cand_lb_lite::NSigTpcTofPiBachelor, + // MC truth + hf_cand_3prong::FlagMcMatchRec, + hf_cand_3prong::OriginMcRec, + hf_cand_lb_lite::FlagWrongCollision, + hf_cand_lb_lite::PtGen); + +DECLARE_SOA_TABLE(HfRedLbMcCheck, "AOD", "HFREDLBMCCHECK", //! Table with MC decay type check + hf_cand_3prong::FlagMcMatchRec, + hf_cand_lb_lite::FlagWrongCollision, + hf_cand_lb_lite::MLc, + hf_cand_lb_lite::PtLc, + hf_cand_lb_lite::M, + hf_cand_lb_lite::Pt, + hf_cand_lb_lite::MlScoreSig, + hf_lb_mc::PdgCodeBeautyMother, + hf_lb_mc::PdgCodeCharmMother, + hf_lb_mc::PdgCodeProng0, + hf_lb_mc::PdgCodeProng1, + hf_lb_mc::PdgCodeProng2, + hf_lb_mc::PdgCodeProng3); +} // namespace o2::aod + +/// Lb analysis task +struct HfTaskLbReduced { + Produces hfRedCandLbLite; + Produces hfRedLbMcCheck; + + Configurable selectionFlagLb{"selectionFlagLb", 1, "Selection Flag for Lb"}; + Configurable yCandGenMax{"yCandGenMax", 0.5, "max. gen particle rapidity"}; + Configurable yCandRecoMax{"yCandRecoMax", 0.8, "max. cand. rapidity"}; + Configurable etaTrackMax{"etaTrackMax", 0.8, "max. track pseudo-rapidity for acceptance calculation"}; + Configurable ptTrackMin{"ptTrackMin", 0.1, "min. track transverse momentum for acceptance calculation"}; + Configurable fillHistograms{"fillHistograms", true, "Flag to enable histogram filling"}; + Configurable fillSparses{"fillSparses", false, "Flag to enable sparse filling"}; + Configurable fillTree{"fillTree", false, "Flag to enable tree filling"}; + Configurable fillBackground{"fillBackground", false, "Flag to enable filling of background histograms/sparses/tree (only MC)"}; + Configurable downSampleBkgFactor{"downSampleBkgFactor", 1., "Fraction of background candidates to keep for ML trainings"}; + Configurable ptMaxForDownSample{"ptMaxForDownSample", 10., "Maximum pt for the application of the downsampling factor"}; + + HfHelper hfHelper; + + using TracksPion = soa::Join; + using CandsLc = soa::Join; + Filter filterSelectCandidates = (aod::hf_sel_candidate_lb::isSelLbToLcPi >= selectionFlagLb); + HistogramRegistry registry{"registry"}; + + void init(InitContext&) + { + std::array processFuncData{doprocessData, doprocessDataWithLcMl, doprocessDataWithLbMl}; + if ((std::accumulate(processFuncData.begin(), processFuncData.end(), 0)) > 1) { + LOGP(fatal, "Only one process function for data can be enabled at a time."); + } + std::array processFuncMc{doprocessMc, doprocessMcWithDecayTypeCheck, doprocessMcWithLcMl, doprocessMcWithLcMlAndDecayTypeCheck, doprocessMcWithLbMl, doprocessMcWithLbMlAndDecayTypeCheck}; + if ((std::accumulate(processFuncMc.begin(), processFuncMc.end(), 0)) > 1) { + LOGP(fatal, "Only one process function for MC can be enabled at a time."); + } + + const AxisSpec axisMlScore{100, 0.f, 1.f}; + const AxisSpec axisMassLb{300, 4.5f, 6.0f}; + const AxisSpec axisMassLc{300, 2.15f, 2.45f}; + const AxisSpec axisDecayLength{200, 0.f, 0.4f}; + const AxisSpec axisNormDecayLength{100, 0.f, 50.f}; + const AxisSpec axisDca{100, -0.05f, 0.05f}; + const AxisSpec axisCosp{110, 0.f, 1.1f}; + const AxisSpec axisEta{30, -1.5f, 1.5f}; + const AxisSpec axisError{100, 0.f, 1.f}; + const AxisSpec axisImpParProd{100, -1.e-3, 1.e-3}; + const AxisSpec axisPtLb{100, 0.f, 50.f}; + const AxisSpec axisPtLc{100, 0.f, 50.f}; + const AxisSpec axisPtPi{100, 0.f, 10.f}; + + if (doprocessData || doprocessDataWithLcMl || doprocessDataWithLbMl) { + if (fillHistograms) { + registry.add("hMass", "#Lambda_{b}^{0} candidates;#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#it{M} (D#pi) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPtLb, axisMassLb}}); + registry.add("hDecLength", "#Lambda_{b}^{0} candidates;#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#Lambda_{b}^{0} candidate decay length (cm);entries", {HistType::kTH2F, {axisPtLb, axisDecayLength}}); + registry.add("hDecLengthXy", "#Lambda_{b}^{0} candidates;#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});decay length XY (cm);entries", {HistType::kTH2F, {axisPtLb, axisDecayLength}}); + registry.add("hNormDecLengthXy", "#Lambda_{b}^{0} candidates;#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#Lambda_{b}^{0} candidate norm. decay length XY (cm);entries", {HistType::kTH2F, {axisPtLb, axisNormDecayLength}}); + registry.add("hDcaProng0", "#Lambda_{b}^{0} candidates;#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});prong 0 (#Lambda_{c}^{+}) DCAxy to prim. vertex (cm);entries", {HistType::kTH2F, {axisPtLb, axisDca}}); + registry.add("hDcaProng1", "#Lambda_{b}^{0} candidates;#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});prong 1 (#pi^{#plus}) DCAxy to prim. vertex (cm);entries", {HistType::kTH2F, {axisPtLb, axisDca}}); + registry.add("hPtProng0", "#Lambda_{b}^{0} candidates;#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});entries", {HistType::kTH2F, {axisPtLb, axisPtLc}}); + registry.add("hPtProng1", "#Lambda_{b}^{0} candidates;#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#it{p}_{T}(#pi^{#plus}) (GeV/#it{c});entries", {HistType::kTH2F, {axisPtLb, axisPtPi}}); + registry.add("hCosp", "#Lambda_{b}^{0} candidates;#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#Lambda_{b}^{0} candidate cos(#vartheta_{P});entries", {HistType::kTH2F, {axisPtLb, axisCosp}}); + registry.add("hCospXy", "#Lambda_{b}^{0} candidates;#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#Lambda_{b}^{0} candidate cos(#vartheta_{P}^{XY});entries", {HistType::kTH2F, {axisPtLb, axisCosp}}); + registry.add("hEta", "#Lambda_{b}^{0} candidates;#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#Lambda_{b}^{0} candidate #it{#eta};entries", {HistType::kTH2F, {axisPtLb, axisEta}}); + registry.add("hRapidity", "#Lambda_{b}^{0} candidates;#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#Lambda_{b}^{0} candidate #it{y};entries", {HistType::kTH2F, {axisPtLb, axisEta}}); + registry.add("hImpParProd", "#Lambda_{b}^{0} candidates;#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#Lambda_{b}^{0} candidate impact parameter product;entries", {HistType::kTH2F, {axisPtLb, axisImpParProd}}); + registry.add("hinvMassLc", "#Lambda_{b}^{0} candidates;#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});prong0, #it{M}(pK#pi) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPtLc, axisMassLc}}); + registry.add("hDecLengthLc", "#Lambda_{b}^{0} candidates;#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});#Lambda_{c}^{+} candidate decay length (cm);entries", {HistType::kTH2F, {axisPtLc, axisDecayLength}}); + registry.add("hDecLengthXyLc", "#Lambda_{b}^{0} candidates;#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});decay length XY (cm);entries", {HistType::kTH2F, {axisPtLc, axisDecayLength}}); + registry.add("hCospLc", "#Lambda_{b}^{0} candidates;#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});#Lambda_{c}^{+} candidate cos(#vartheta_{P});entries", {HistType::kTH2F, {axisPtLc, axisCosp}}); + registry.add("hCospXyLc", "#Lambda_{b}^{0} candidates;#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});#Lambda_{c}^{+} candidate cos(#vartheta_{P}^{XY});entries", {HistType::kTH2F, {axisPtLc, axisCosp}}); + + // ML scores of Lc daughter + if (doprocessDataWithLcMl) { + registry.add("hMlScoreBkgLc", "#Lambda_{b}^{0} candidates;#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});prong0, #Lambda_{c}^{+} ML background score;entries", {HistType::kTH2F, {axisPtLc, axisMlScore}}); + registry.add("hMlScorePromptLc", "#Lambda_{b}^{0} candidates;#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});prong0, #Lambda_{c}^{+} ML prompt score;entries", {HistType::kTH2F, {axisPtLc, axisMlScore}}); + registry.add("hMlScoreNonPromptLc", "#Lambda_{b}^{0} candidates;#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});prong0, #Lambda_{c}^{+} ML nonprompt score;entries", {HistType::kTH2F, {axisPtLc, axisMlScore}}); + } + + // ML scores of Lb candidate + if (doprocessDataWithLbMl) { + registry.add("hMlScoreSigLb", "#Lambda_{b}^{0} candidates;#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});prong0, #Lambda_{b}^{0} ML signal score;entries", {HistType::kTH2F, {axisPtLb, axisMlScore}}); + } + } + if (fillSparses) { + if (!(doprocessDataWithLcMl || doprocessDataWithLbMl)) { + registry.add("hMassPtCutVars", "#Lambda_{b}^{0} candidates;#it{M} (D#pi) (GeV/#it{c}^{2});#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#Lambda_{b}^{0} candidate decay length (cm);#Lambda_{b}^{0} candidate norm. decay length XY (cm);#Lambda_{b}^{0} candidate impact parameter product (cm);#Lambda_{b}^{0} candidate cos(#vartheta_{P});#it{M} (pK#pi) (GeV/#it{c}^{2});#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});#Lambda_{c}^{+} candidate decay length (cm);#Lambda_{c}^{+} candidate cos(#vartheta_{P})", {HistType::kTHnSparseF, {axisMassLb, axisPtLb, axisDecayLength, axisNormDecayLength, axisImpParProd, axisCosp, axisMassLc, axisPtLc, axisDecayLength, axisCosp}}); + } else { + registry.add("hMassPtCutVars", "#Lambda_{b}^{0} candidates;#it{M} (D#pi) (GeV/#it{c}^{2});#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#Lambda_{b}^{0} candidate decay length (cm);#Lambda_{b}^{0} candidate norm. decay length XY (cm);#Lambda_{b}^{0} candidate impact parameter product (cm);#Lambda_{b}^{0} candidate cos(#vartheta_{P});#it{M} (pK#pi) (GeV/#it{c}^{2});#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});#Lambda_{c}^{+} candidate ML score bkg;#Lambda_{c}^{+} candidate ML score nonprompt", {HistType::kTHnSparseF, {axisMassLb, axisPtLb, axisDecayLength, axisNormDecayLength, axisImpParProd, axisCosp, axisMassLc, axisPtLc, axisMlScore, axisMlScore}}); + } + } + } + + if (doprocessMc || doprocessMcWithDecayTypeCheck || doprocessMcWithLcMl || doprocessMcWithLcMlAndDecayTypeCheck || doprocessMcWithLbMl || doprocessMcWithLbMlAndDecayTypeCheck) { + if (fillHistograms) { + // gen histos + registry.add("hEtaGen", "#Lambda_{b}^{0} particles (generated);#it{p}_{T}^{gen}(#Lambda_{b}^{0}) (GeV/#it{c});#it{#eta}^{gen}(#Lambda_{b}^{0});entries", {HistType::kTH2F, {axisPtLb, axisEta}}); + registry.add("hYGen", "#Lambda_{b}^{0} particles (generated);#it{p}_{T}^{gen}(#Lambda_{b}^{0}) (GeV/#it{c});#it{y}^{gen}(#Lambda_{b}^{0});entries", {HistType::kTH2F, {axisPtLb, axisEta}}); + registry.add("hYGenWithProngsInAcceptance", "MC particles (generated-daughters in acceptance);#it{p}_{T}^{gen}(#Lambda_{b}^{0}) (GeV/#it{c});#it{y}^{gen}(#Lambda_{b}^{0});entries", {HistType::kTH2F, {axisPtLb, axisEta}}); + registry.add("hPtProng0Gen", "#Lambda_{b}^{0} particles (generated);#it{p}_{T}^{gen}(#Lambda_{b}^{0}) (GeV/#it{c});#it{p}_{T}^{gen}(#Lambda_{c}^{+}) (GeV/#it{c});entries", {HistType::kTH2F, {axisPtLb, axisPtLc}}); + registry.add("hPtProng1Gen", "#Lambda_{b}^{0} particles (generated);#it{p}_{T}^{gen}(#Lambda_{b}^{0}) (GeV/#it{c});#it{p}_{T}^{gen}(#pi^{#plus}) (GeV/#it{c});entries", {HistType::kTH2F, {axisPtLb, axisPtPi}}); + registry.add("hYProng0Gen", "#Lambda_{b}^{0} particles (generated);#it{p}_{T}^{gen}(#Lambda_{b}^{0}) (GeV/#it{c});#it{y}^{gen}(#Lambda_{c}^{+});entries", {HistType::kTH2F, {axisPtLb, axisEta}}); + registry.add("hYProng1Gen", "#Lambda_{b}^{0} particles (generated);#it{p}_{T}^{gen}(#Lambda_{b}^{0}) (GeV/#it{c});#it{y}^{gen}(#pi^{#plus});entries", {HistType::kTH2F, {axisPtLb, axisEta}}); + registry.add("hEtaProng0Gen", "#Lambda_{b}^{0} particles (generated);#it{p}_{T}^{gen}(#Lambda_{b}^{0}) (GeV/#it{c});#it{#eta}^{gen}(#Lambda_{c}^{+});entries", {HistType::kTH2F, {axisPtLb, axisEta}}); + registry.add("hEtaProng1Gen", "#Lambda_{b}^{0} particles (generated);#it{p}_{T}^{gen}(#Lambda_{b}^{0}) (GeV/#it{c});#it{#eta}^{gen}(#pi^{#plus});entries", {HistType::kTH2F, {axisPtLb, axisEta}}); + + // reco histos + // signal + registry.add("hMassRecSig", "#Lambda_{b}^{0} candidates (matched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#it{M} (D#pi) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPtLb, axisMassLb}}); + registry.add("hDecLengthRecSig", "#Lambda_{b}^{0} candidates (matched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#Lambda_{b}^{0} candidate decay length (cm);entries", {HistType::kTH2F, {axisPtLb, axisDecayLength}}); + registry.add("hDecLengthXyRecSig", "#Lambda_{b}^{0} candidates (matched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});decay length XY (cm);entries", {HistType::kTH2F, {axisPtLb, axisDecayLength}}); + registry.add("hNormDecLengthXyRecSig", "#Lambda_{b}^{0} candidates (matched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#Lambda_{b}^{0} candidate norm. decay length XY (cm);entries", {HistType::kTH2F, {axisPtLb, axisNormDecayLength}}); + registry.add("hDcaProng0RecSig", "#Lambda_{b}^{0} candidates (matched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});prong 0 (#Lambda_{c}^{+}) DCAxy to prim. vertex (cm);entries", {HistType::kTH2F, {axisPtLb, axisDca}}); + registry.add("hDcaProng1RecSig", "#Lambda_{b}^{0} candidates (matched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});prong 1 (#pi^{#plus}) DCAxy to prim. vertex (cm);entries", {HistType::kTH2F, {axisPtLb, axisDca}}); + registry.add("hPtProng0RecSig", "#Lambda_{b}^{0} candidates (matched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});entries", {HistType::kTH2F, {axisPtLb, axisPtLc}}); + registry.add("hPtProng1RecSig", "#Lambda_{b}^{0} candidates (matched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#it{p}_{T}(#pi^{#plus}) (GeV/#it{c});entries", {HistType::kTH2F, {axisPtLb, axisPtPi}}); + registry.add("hCospRecSig", "#Lambda_{b}^{0} candidates (matched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#Lambda_{b}^{0} candidate cos(#vartheta_{P});entries", {HistType::kTH2F, {axisPtLb, axisCosp}}); + registry.add("hCospXyRecSig", "#Lambda_{b}^{0} candidates (matched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#Lambda_{b}^{0} candidate cos(#vartheta_{P}^{XY});entries", {HistType::kTH2F, {axisPtLb, axisCosp}}); + registry.add("hEtaRecSig", "#Lambda_{b}^{0} candidates (matched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#Lambda_{b}^{0} candidate #it{#eta};entries", {HistType::kTH2F, {axisPtLb, axisEta}}); + registry.add("hRapidityRecSig", "#Lambda_{b}^{0} candidates (matched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#Lambda_{b}^{0} candidate #it{y};entries", {HistType::kTH2F, {axisPtLb, axisEta}}); + registry.add("hImpParProdRecSig", "#Lambda_{b}^{0} candidates (matched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#Lambda_{b}^{0} candidate impact parameter product;entries", {HistType::kTH2F, {axisPtLb, axisImpParProd}}); + registry.add("hinvMassLcRecSig", "#Lambda_{b}^{0} candidates (matched);#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});prong0, #it{M}(pK#pi) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPtLc, axisMassLc}}); + registry.add("hDecLengthLcRecSig", "#Lambda_{b}^{0} candidates (matched);#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});#Lambda_{c}^{+} candidate decay length (cm);entries", {HistType::kTH2F, {axisPtLc, axisDecayLength}}); + registry.add("hDecLengthXyLcRecSig", "#Lambda_{b}^{0} candidates (matched);#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});decay length XY (cm);entries", {HistType::kTH2F, {axisPtLc, axisDecayLength}}); + registry.add("hCospLcRecSig", "#Lambda_{b}^{0} candidates (matched);#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});#Lambda_{c}^{+} candidate cos(#vartheta_{P});entries", {HistType::kTH2F, {axisPtLc, axisCosp}}); + registry.add("hCospXyLcRecSig", "#Lambda_{b}^{0} candidates (matched);#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});#Lambda_{c}^{+} candidate cos(#vartheta_{P}^{XY});entries", {HistType::kTH2F, {axisPtLc, axisCosp}}); + // background + if (fillBackground) { + registry.add("hMassRecBg", "#Lambda_{b}^{0} candidates (unmatched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#it{M} (D#pi) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPtLb, axisMassLb}}); + registry.add("hDecLengthRecBg", "#Lambda_{b}^{0} candidates (unmatched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#Lambda_{b}^{0} candidate decay length (cm);entries", {HistType::kTH2F, {axisPtLb, axisDecayLength}}); + registry.add("hDecLengthXyRecBg", "#Lambda_{b}^{0} candidates (unmatched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});decay length XY (cm);entries", {HistType::kTH2F, {axisPtLb, axisDecayLength}}); + registry.add("hNormDecLengthXyRecBg", "#Lambda_{b}^{0} candidates (unmatched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#Lambda_{b}^{0} candidate norm. decay length XY (cm);entries", {HistType::kTH2F, {axisPtLb, axisNormDecayLength}}); + registry.add("hDcaProng0RecBg", "#Lambda_{b}^{0} candidates (unmatched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});prong 0 (#Lambda_{c}^{+}) DCAxy to prim. vertex (cm);entries", {HistType::kTH2F, {axisPtLb, axisDca}}); + registry.add("hDcaProng1RecBg", "#Lambda_{b}^{0} candidates (unmatched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});prong 1 (#pi^{#plus}) DCAxy to prim. vertex (cm);entries", {HistType::kTH2F, {axisPtLb, axisDca}}); + registry.add("hPtProng0RecBg", "#Lambda_{b}^{0} candidates (unmatched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});entries", {HistType::kTH2F, {axisPtLb, axisPtLc}}); + registry.add("hPtProng1RecBg", "#Lambda_{b}^{0} candidates (unmatched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#it{p}_{T}(#pi^{#plus}) (GeV/#it{c});entries", {HistType::kTH2F, {axisPtLb, axisPtPi}}); + registry.add("hCospRecBg", "#Lambda_{b}^{0} candidates (unmatched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#Lambda_{b}^{0} candidate cos(#vartheta_{P});entries", {HistType::kTH2F, {axisPtLb, axisCosp}}); + registry.add("hCospXyRecBg", "#Lambda_{b}^{0} candidates (unmatched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#Lambda_{b}^{0} candidate cos(#vartheta_{P}^{XY});entries", {HistType::kTH2F, {axisPtLb, axisCosp}}); + registry.add("hEtaRecBg", "#Lambda_{b}^{0} candidates (unmatched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#Lambda_{b}^{0} candidate #it{#eta};entries", {HistType::kTH2F, {axisPtLb, axisEta}}); + registry.add("hRapidityRecBg", "#Lambda_{b}^{0} candidates (unmatched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#Lambda_{b}^{0} candidate #it{y};entries", {HistType::kTH2F, {axisPtLb, axisEta}}); + registry.add("hImpParProdRecBg", "#Lambda_{b}^{0} candidates (unmatched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#Lambda_{b}^{0} candidate impact parameter product;entries", {HistType::kTH2F, {axisPtLb, axisImpParProd}}); + registry.add("hinvMassLcRecBg", "#Lambda_{b}^{0} candidates (unmatched);#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});prong0, #it{M}(pK#pi) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPtLc, axisMassLc}}); + registry.add("hDecLengthLcRecBg", "#Lambda_{b}^{0} candidates (unmatched);#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});#Lambda_{c}^{+} candidate decay length (cm);entries", {HistType::kTH2F, {axisPtLc, axisDecayLength}}); + registry.add("hDecLengthXyLcRecBg", "#Lambda_{b}^{0} candidates (unmatched);#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});decay length XY (cm);entries", {HistType::kTH2F, {axisPtLc, axisDecayLength}}); + registry.add("hCospLcRecBg", "#Lambda_{b}^{0} candidates (unmatched);#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});#Lambda_{c}^{+} candidate cos(#vartheta_{P});entries", {HistType::kTH2F, {axisPtLc, axisCosp}}); + registry.add("hCospXyLcRecBg", "#Lambda_{b}^{0} candidates (unmatched);#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});#Lambda_{c}^{+} candidate cos(#vartheta_{P}^{XY});entries", {HistType::kTH2F, {axisPtLc, axisCosp}}); + } + // MC checks + if (doprocessMcWithDecayTypeCheck || doprocessMcWithLbMlAndDecayTypeCheck || doprocessMcWithLcMlAndDecayTypeCheck) { + constexpr uint8_t kNBinsDecayTypeMc = hf_cand_lb::DecayTypeMc::NDecayTypeMc; + TString labels[kNBinsDecayTypeMc]; + labels[hf_cand_lb::DecayTypeMc::LbToLcPiToPKPiPi] = "#Lambda_{b}^{0} #rightarrow (#Lambda_{c}^{#plus} #rightarrow p K^{#minus} #pi^{#plus}) #pi^{#minus}"; + labels[hf_cand_lb::DecayTypeMc::LbToLcPiToPKPiK] = "#Lambda_{b}^{0} #rightarrow (#Lambda_{c}^{#plus} #rightarrow p K^{#minus} #pi^{#plus}) K^{#minus}"; + labels[hf_cand_lb::DecayTypeMc::PartlyRecoDecay] = "Partly reconstructed decay channel"; + labels[hf_cand_lb::DecayTypeMc::OtherDecay] = "Other decays"; + static const AxisSpec axisDecayType = {kNBinsDecayTypeMc, 0.5, kNBinsDecayTypeMc + 0.5, ""}; + registry.add("hDecayTypeMc", "DecayType", {HistType::kTH3F, {axisDecayType, axisMassLb, axisPtLb}}); + for (uint8_t iBin = 0; iBin < kNBinsDecayTypeMc; ++iBin) { + registry.get(HIST("hDecayTypeMc"))->GetXaxis()->SetBinLabel(iBin + 1, labels[iBin]); + } + } + // ML scores of Lc daughter + if (doprocessMcWithLcMl || doprocessMcWithLcMlAndDecayTypeCheck) { + // signal + registry.add("hMlScoreBkgLcRecSig", "#Lambda_{b}^{0} candidates (matched);#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});prong0, #Lambda_{c}^{+} ML background score;entries", {HistType::kTH2F, {axisPtLc, axisMlScore}}); + registry.add("hMlScorePromptLcRecSig", "#Lambda_{b}^{0} candidates (matched);#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});prong0, #Lambda_{c}^{+} ML prompt score;entries", {HistType::kTH2F, {axisPtLc, axisMlScore}}); + registry.add("hMlScoreNonPromptLcRecSig", "#Lambda_{b}^{0} candidates (matched);#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});prong0, #Lambda_{c}^{+} ML nonprompt score;entries", {HistType::kTH2F, {axisPtLc, axisMlScore}}); + // background + registry.add("hMlScoreBkgLcRecBg", "#Lambda_{b}^{0} candidates (unmatched);#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});prong0, #Lambda_{c}^{+} ML background score;entries", {HistType::kTH2F, {axisPtLc, axisMlScore}}); + registry.add("hMlScorePromptLcRecBg", "#Lambda_{b}^{0} candidates (unmatched);#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});prong0, #Lambda_{c}^{+} ML prompt score;entries", {HistType::kTH2F, {axisPtLc, axisMlScore}}); + registry.add("hMlScoreNonPromptLcRecBg", "#Lambda_{b}^{0} candidates (unmatched);#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});prong0, #Lambda_{c}^{+} ML nonprompt score;entries", {HistType::kTH2F, {axisPtLc, axisMlScore}}); + } + // ML scores of Lb candidate + if (doprocessMcWithLbMl || doprocessMcWithLbMlAndDecayTypeCheck) { + // signal + registry.add("hMlScoreSigLbRecSig", "#Lambda_{b}^{0} candidates (matched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});prong0, #Lambda_{b}^{0} ML signal score;entries", {HistType::kTH2F, {axisPtLb, axisMlScore}}); + // background + registry.add("hMlScoreSigLbRecBg", "#Lambda_{b}^{0} candidates (unmatched);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});prong0, #Lambda_{b}^{0} ML signal score;entries", {HistType::kTH2F, {axisPtLb, axisMlScore}}); + } + } + if (fillSparses) { + // gen sparses + registry.add("hPtYGenSig", "#Lambda_{b}^{0} particles (generated);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#it{y}(#Lambda_{b}^{0})", {HistType::kTHnSparseF, {axisPtLb, axisEta}}); + registry.add("hPtYWithProngsInAccepanceGenSig", "#Lambda_{b}^{0} particles (generated-daughters in acceptance);#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#it{y}(#Lambda_{b}^{0})", {HistType::kTHnSparseF, {axisPtLb, axisEta}}); + + // reco sparses + if (!(doprocessDataWithLcMl || doprocessDataWithLbMl)) { + registry.add("hMassPtCutVarsRecSig", "#Lambda_{b}^{0} candidates (matched);#it{M} (D#pi) (GeV/#it{c}^{2});#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#Lambda_{b}^{0} candidate decay length (cm);#Lambda_{b}^{0} candidate norm. decay length XY (cm);#Lambda_{b}^{0} candidate impact parameter product (cm);#Lambda_{b}^{0} candidate cos(#vartheta_{P});#it{M} (pK#pi) (GeV/#it{c}^{2});#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});#Lambda_{c}^{+} candidate decay length (cm);#Lambda_{c}^{+} candidate cos(#vartheta_{P})", {HistType::kTHnSparseF, {axisMassLb, axisPtLb, axisDecayLength, axisNormDecayLength, axisImpParProd, axisCosp, axisMassLc, axisPtLc, axisDecayLength, axisCosp}}); + if (fillBackground) { + registry.add("hMassPtCutVarsRecBg", "#Lambda_{b}^{0} candidates (unmatched);#it{M} (D#pi) (GeV/#it{c}^{2});#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#Lambda_{b}^{0} candidate decay length (cm);#Lambda_{b}^{0} candidate norm. decay length XY (cm);#Lambda_{b}^{0} candidate impact parameter product (cm);#Lambda_{b}^{0} candidate cos(#vartheta_{P});#it{M} (pK#pi) (GeV/#it{c}^{2});#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});#Lambda_{c}^{+} candidate decay length (cm);#Lambda_{c}^{+} candidate cos(#vartheta_{P})", {HistType::kTHnSparseF, {axisMassLb, axisPtLb, axisDecayLength, axisNormDecayLength, axisImpParProd, axisCosp, axisMassLc, axisPtLc, axisDecayLength, axisCosp}}); + } + } else { + registry.add("hMassPtCutVarsRecSig", "#Lambda_{b}^{0} candidates (matched);#it{M} (D#pi) (GeV/#it{c}^{2});#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#Lambda_{b}^{0} candidate decay length (cm);#Lambda_{b}^{0} candidate norm. decay length XY (cm);#Lambda_{b}^{0} candidate impact parameter product (cm);#Lambda_{b}^{0} candidate cos(#vartheta_{P});#it{M} (pK#pi) (GeV/#it{c}^{2});#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});#Lambda_{c}^{+} candidate ML score bkg;#Lambda_{c}^{+} candidate ML score nonprompt", {HistType::kTHnSparseF, {axisMassLb, axisPtLb, axisDecayLength, axisNormDecayLength, axisImpParProd, axisCosp, axisMassLc, axisPtLc, axisMlScore, axisMlScore}}); + if (fillBackground) { + registry.add("hMassPtCutVarsRecBg", "#Lambda_{b}^{0} candidates (unmatched);#it{M} (D#pi) (GeV/#it{c}^{2});#it{p}_{T}(#Lambda_{b}^{0}) (GeV/#it{c});#Lambda_{b}^{0} candidate decay length (cm);#Lambda_{b}^{0} candidate norm. decay length XY (cm);#Lambda_{b}^{0} candidate impact parameter product (cm);#Lambda_{b}^{0} candidate cos(#vartheta_{P});#it{M} (pK#pi) (GeV/#it{c}^{2});#it{p}_{T}(#Lambda_{c}^{#plus}) (GeV/#it{c});#Lambda_{c}^{+} candidate ML score bkg;#Lambda_{c}^{+} candidate ML score nonprompt", {HistType::kTHnSparseF, {axisMassLb, axisPtLb, axisDecayLength, axisNormDecayLength, axisImpParProd, axisCosp, axisMassLc, axisPtLc, axisMlScore, axisMlScore}}); + } + } + } + } + } + + /// Selection of Lb daughter in geometrical acceptance + /// \param etaProng is the pseudorapidity of Lb prong + /// \param ptProng is the pT of Lb prong + /// \return true if prong is in geometrical acceptance + template + bool isProngInAcceptance(const T& etaProng, const T& ptProng) + { + return std::abs(etaProng) <= etaTrackMax && ptProng >= ptTrackMin; + } + + /// Fill candidate information at reconstruction level + /// \param doMc is the flag to enable the filling with MC information + /// \param withDecayTypeCheck is the flag to enable MC with decay type check + /// \param withLcMl is the flag to enable the filling with ML scores for the Lc daughter + /// \param withLbMl is the flag to enable the filling with ML scores for the Lb candidate + /// \param candidate is the Lb candidate + /// \param candidatesLc is the table with Lc candidates + template + void fillCand(Cand const& candidate, + CandsLc const&) + { + auto ptCandLb = candidate.pt(); + auto invMassLb = hfHelper.invMassLbToLcPi(candidate); + auto candLc = candidate.template prong0Lc_as(); + auto ptLc = candidate.ptProng0(); + auto invMassLc = candLc.invMassHypo0() > 0 ? candLc.invMassHypo0() : candLc.invMassHypo1(); + // TODO: here we are assuming that only one of the two hypotheses is filled, to be checked + std::array posPv{candidate.posX(), candidate.posY(), candidate.posZ()}; + std::array posSvLc{candLc.xSecondaryVertex(), candLc.ySecondaryVertex(), candLc.zSecondaryVertex()}; + std::array momLc{candLc.pVector()}; + auto cospLc = RecoDecay::cpa(posPv, posSvLc, momLc); + auto cospXyLc = RecoDecay::cpaXY(posPv, posSvLc, momLc); + auto decLenLc = RecoDecay::distance(posPv, posSvLc); + auto decLenXyLc = RecoDecay::distanceXY(posPv, posSvLc); + + int8_t flagMcMatchRec = 0; + int8_t flagWrongCollision = 0; + bool isSignal = false; + if constexpr (doMc) { + flagMcMatchRec = candidate.flagMcMatchRec(); + flagWrongCollision = candidate.flagWrongCollision(); + isSignal = TESTBIT(std::abs(flagMcMatchRec), hf_cand_lb::DecayTypeMc::LbToLcPiToPKPiPi); + } + + if (fillHistograms) { + if constexpr (doMc) { + if (isSignal) { + registry.fill(HIST("hMassRecSig"), ptCandLb, hfHelper.invMassLbToLcPi(candidate)); + registry.fill(HIST("hPtProng0RecSig"), ptCandLb, candidate.ptProng0()); + registry.fill(HIST("hPtProng1RecSig"), ptCandLb, candidate.ptProng1()); + registry.fill(HIST("hImpParProdRecSig"), ptCandLb, candidate.impactParameterProduct()); + registry.fill(HIST("hDecLengthRecSig"), ptCandLb, candidate.decayLength()); + registry.fill(HIST("hDecLengthXyRecSig"), ptCandLb, candidate.decayLengthXY()); + registry.fill(HIST("hNormDecLengthXyRecSig"), ptCandLb, candidate.decayLengthXY() / candidate.errorDecayLengthXY()); + registry.fill(HIST("hDcaProng0RecSig"), ptCandLb, candidate.impactParameter0()); + registry.fill(HIST("hDcaProng1RecSig"), ptCandLb, candidate.impactParameter1()); + registry.fill(HIST("hCospRecSig"), ptCandLb, candidate.cpa()); + registry.fill(HIST("hCospXyRecSig"), ptCandLb, candidate.cpaXY()); + registry.fill(HIST("hEtaRecSig"), ptCandLb, candidate.eta()); + registry.fill(HIST("hRapidityRecSig"), ptCandLb, hfHelper.yLb(candidate)); + registry.fill(HIST("hinvMassLcRecSig"), ptLc, invMassLc); + registry.fill(HIST("hDecLengthLcRecSig"), ptLc, decLenLc); + registry.fill(HIST("hDecLengthXyLcRecSig"), ptLc, decLenXyLc); + registry.fill(HIST("hCospLcRecSig"), ptLc, cospLc); + registry.fill(HIST("hCospXyLcRecSig"), ptLc, cospXyLc); + if constexpr (withDecayTypeCheck) { + registry.fill(HIST("hDecayTypeMc"), 1 + hf_cand_lb::DecayTypeMc::LbToLcPiToPKPiPi, invMassLb, ptCandLb); + } + if constexpr (withLcMl) { + registry.fill(HIST("hMlScoreBkgLcRecSig"), ptLc, candidate.prong0MlScoreBkg()); + registry.fill(HIST("hMlScorePromptLcRecSig"), ptLc, candidate.prong0MlScorePrompt()); + registry.fill(HIST("hMlScoreNonPromptLcRecSig"), ptLc, candidate.prong0MlScoreNonprompt()); + } + if constexpr (withLbMl) { + registry.fill(HIST("hMlScoreSigLbRecSig"), ptCandLb, candidate.mlProbLbToLcPi()); + } + } else if (fillBackground) { + registry.fill(HIST("hMassRecBg"), ptCandLb, hfHelper.invMassLbToLcPi(candidate)); + registry.fill(HIST("hPtProng0RecBg"), ptCandLb, candidate.ptProng0()); + registry.fill(HIST("hPtProng1RecBg"), ptCandLb, candidate.ptProng1()); + registry.fill(HIST("hImpParProdRecBg"), ptCandLb, candidate.impactParameterProduct()); + registry.fill(HIST("hDecLengthRecBg"), ptCandLb, candidate.decayLength()); + registry.fill(HIST("hDecLengthXyRecBg"), ptCandLb, candidate.decayLengthXY()); + registry.fill(HIST("hNormDecLengthXyRecBg"), ptCandLb, candidate.decayLengthXY() / candidate.errorDecayLengthXY()); + registry.fill(HIST("hDcaProng0RecBg"), ptCandLb, candidate.impactParameter0()); + registry.fill(HIST("hDcaProng1RecBg"), ptCandLb, candidate.impactParameter1()); + registry.fill(HIST("hCospRecBg"), ptCandLb, candidate.cpa()); + registry.fill(HIST("hCospXyRecBg"), ptCandLb, candidate.cpaXY()); + registry.fill(HIST("hEtaRecBg"), ptCandLb, candidate.eta()); + registry.fill(HIST("hRapidityRecBg"), ptCandLb, hfHelper.yLb(candidate)); + registry.fill(HIST("hinvMassLcRecBg"), ptLc, invMassLc); + registry.fill(HIST("hDecLengthLcRecBg"), ptLc, decLenLc); + registry.fill(HIST("hDecLengthXyLcRecBg"), ptLc, decLenXyLc); + registry.fill(HIST("hCospLcRecBg"), ptLc, cospLc); + registry.fill(HIST("hCospXyLcRecBg"), ptLc, cospXyLc); + if constexpr (withLcMl) { + registry.fill(HIST("hMlScoreBkgLcRecBg"), ptLc, candidate.prong0MlScoreBkg()); + registry.fill(HIST("hMlScorePromptLcRecBg"), ptLc, candidate.prong0MlScorePrompt()); + registry.fill(HIST("hMlScoreNonPromptLcRecBg"), ptLc, candidate.prong0MlScoreNonprompt()); + } + if constexpr (withLbMl) { + registry.fill(HIST("hMlScoreSigLbRecBg"), ptCandLb, candidate.mlProbLbToLcPi()); + } + } else if constexpr (withDecayTypeCheck) { + if (TESTBIT(flagMcMatchRec, hf_cand_lb::DecayTypeMc::LbToLcPiToPKPiPi)) { // Lb → Lc+ π- → (pK-π+) π- + registry.fill(HIST("hDecayTypeMc"), 1 + hf_cand_lb::DecayTypeMc::LbToLcPiToPKPiK, invMassLb, ptCandLb); + } else if (TESTBIT(flagMcMatchRec, hf_cand_lb::DecayTypeMc::PartlyRecoDecay)) { // Partly reconstructed decay channel + registry.fill(HIST("hDecayTypeMc"), 1 + hf_cand_lb::DecayTypeMc::PartlyRecoDecay, invMassLb, ptCandLb); + } else { + registry.fill(HIST("hDecayTypeMc"), 1 + hf_cand_lb::DecayTypeMc::OtherDecay, invMassLb, ptCandLb); + } + } + } else { + registry.fill(HIST("hMass"), ptCandLb, invMassLb); + registry.fill(HIST("hPtProng0"), ptCandLb, candidate.ptProng0()); + registry.fill(HIST("hPtProng1"), ptCandLb, candidate.ptProng1()); + registry.fill(HIST("hImpParProd"), ptCandLb, candidate.impactParameterProduct()); + registry.fill(HIST("hDecLength"), ptCandLb, candidate.decayLength()); + registry.fill(HIST("hDecLengthXy"), ptCandLb, candidate.decayLengthXY()); + registry.fill(HIST("hNormDecLengthXy"), ptCandLb, candidate.decayLengthXY() / candidate.errorDecayLengthXY()); + registry.fill(HIST("hDcaProng0"), ptCandLb, candidate.impactParameter0()); + registry.fill(HIST("hDcaProng1"), ptCandLb, candidate.impactParameter1()); + registry.fill(HIST("hCosp"), ptCandLb, candidate.cpa()); + registry.fill(HIST("hCospXy"), ptCandLb, candidate.cpaXY()); + registry.fill(HIST("hEta"), ptCandLb, candidate.eta()); + registry.fill(HIST("hRapidity"), ptCandLb, hfHelper.yLb(candidate)); + registry.fill(HIST("hinvMassLc"), ptLc, invMassLc); + registry.fill(HIST("hDecLengthLc"), ptLc, decLenLc); + registry.fill(HIST("hDecLengthXyLc"), ptLc, decLenXyLc); + registry.fill(HIST("hCospLc"), ptLc, cospLc); + registry.fill(HIST("hCospXyLc"), ptLc, cospXyLc); + + if constexpr (withLcMl) { + registry.fill(HIST("hMlScoreBkgLc"), ptLc, candidate.prong0MlScoreBkg()); + registry.fill(HIST("hMlScorePromptLc"), ptLc, candidate.prong0MlScorePrompt()); + registry.fill(HIST("hMlScoreNonPromptLc"), ptLc, candidate.prong0MlScoreNonprompt()); + } + if constexpr (withLbMl) { + registry.fill(HIST("hMlScoreSigLb"), ptCandLb, candidate.mlProbLbToLcPi()); + } + } + } + if (fillSparses) { + if constexpr (withLcMl) { + if (isSignal) { + if constexpr (withLcMl) { + registry.fill(HIST("hMassPtCutVarsRecSig"), invMassLb, ptCandLb, candidate.decayLength(), candidate.decayLengthXY() / candidate.errorDecayLengthXY(), candidate.impactParameterProduct(), candidate.cpa(), invMassLc, ptLc, candidate.prong0MlScoreBkg(), candidate.prong0MlScoreNonprompt()); + } else { + registry.fill(HIST("hMassPtCutVarsRecSig"), invMassLb, ptCandLb, candidate.decayLength(), candidate.decayLengthXY() / candidate.errorDecayLengthXY(), candidate.impactParameterProduct(), candidate.cpa(), invMassLc, ptLc, decLenLc, cospLc); + } + } else if (fillBackground) { + if constexpr (withLcMl) { + registry.fill(HIST("hMassPtCutVarsRecBg"), invMassLb, ptCandLb, candidate.decayLength(), candidate.decayLengthXY() / candidate.errorDecayLengthXY(), candidate.impactParameterProduct(), candidate.cpa(), invMassLc, ptLc, candidate.prong0MlScoreBkg(), candidate.prong0MlScoreNonprompt()); + } else { + registry.fill(HIST("hMassPtCutVarsRecBg"), invMassLb, ptCandLb, candidate.decayLength(), candidate.decayLengthXY() / candidate.errorDecayLengthXY(), candidate.impactParameterProduct(), candidate.cpa(), invMassLc, ptLc, decLenLc, cospLc); + } + } + } else { + if constexpr (withLcMl) { + registry.fill(HIST("hMassPtCutVars"), invMassLb, ptCandLb, candidate.decayLength(), candidate.decayLengthXY() / candidate.errorDecayLengthXY(), candidate.impactParameterProduct(), candidate.cpa(), invMassLc, ptLc, candidate.prong0MlScoreBkg(), candidate.prong0MlScoreNonprompt()); + } else { + registry.fill(HIST("hMassPtCutVars"), invMassLb, ptCandLb, candidate.decayLength(), candidate.decayLengthXY() / candidate.errorDecayLengthXY(), candidate.impactParameterProduct(), candidate.cpa(), invMassLc, ptLc, decLenLc, cospLc); + } + } + } + if (fillTree) { + float pseudoRndm = ptLc * 1000. - static_cast(ptLc * 1000); + if (flagMcMatchRec != 0 || (((doMc && fillBackground) || !doMc) && (ptCandLb >= ptMaxForDownSample || pseudoRndm < downSampleBkgFactor))) { + float prong0MlScoreBkg = -1.; + float prong0MlScorePrompt = -1.; + float prong0MlScoreNonprompt = -1.; + float candidateMlScoreSig = -1; + if constexpr (withLcMl) { + prong0MlScoreBkg = candidate.prong0MlScoreBkg(); + prong0MlScorePrompt = candidate.prong0MlScorePrompt(); + prong0MlScoreNonprompt = candidate.prong0MlScoreNonprompt(); + } + if constexpr (withLbMl) { + candidateMlScoreSig = candidate.mlProbLbToLcPi(); + } + auto prong1 = candidate.template prong1Track_as(); + + float ptMother = -1.; + if constexpr (doMc) { + ptMother = candidate.ptMother(); + } + + hfRedCandLbLite( + // Lb features + invMassLb, + ptCandLb, + candidate.eta(), + candidate.phi(), + hfHelper.yLb(candidate), + candidate.cpa(), + candidate.cpaXY(), + candidate.chi2PCA(), + candidate.decayLength(), + candidate.decayLengthXY(), + candidate.decayLengthNormalised(), + candidate.decayLengthXYNormalised(), + candidate.impactParameterProduct(), + candidate.maxNormalisedDeltaIP(), + candidateMlScoreSig, + candidate.isSelLbToLcPi(), + // Lc-baryon features + invMassLc, + ptLc, + decLenLc, + decLenXyLc, + candidate.impactParameter0(), + candLc.ptProngMin(), + candLc.absEtaProngMin(), + candLc.itsNClsProngMin(), + candLc.tpcNClsCrossedRowsProngMin(), + candLc.tpcChi2NClProngMax(), + candLc.tpcNSigmaPrProng0(), + candLc.tofNSigmaPrProng0(), + candLc.tpcTofNSigmaPrProng0(), + candLc.tpcNSigmaKaProng1(), + candLc.tofNSigmaKaProng1(), + candLc.tpcTofNSigmaKaProng1(), + candLc.tpcNSigmaPiProng2(), + candLc.tofNSigmaPiProng2(), + candLc.tpcTofNSigmaPiProng2(), + prong0MlScoreBkg, + prong0MlScorePrompt, + prong0MlScoreNonprompt, + // pion features + candidate.ptProng1(), + std::abs(RecoDecay::eta(prong1.pVector())), + prong1.itsNCls(), + prong1.tpcNClsCrossedRows(), + prong1.tpcChi2NCl(), + candidate.impactParameter1(), + prong1.tpcNSigmaPi(), + prong1.tofNSigmaPi(), + prong1.tpcTofNSigmaPi(), + // MC truth + flagMcMatchRec, + isSignal, + flagWrongCollision, + ptMother); + + if constexpr (withDecayTypeCheck) { + hfRedLbMcCheck( + flagMcMatchRec, + flagWrongCollision, + invMassLc, + ptLc, + invMassLb, + ptCandLb, + candidateMlScoreSig, + candidate.pdgCodeBeautyMother(), + candidate.pdgCodeCharmMother(), + candidate.pdgCodeProng0(), + candidate.pdgCodeProng1(), + candidate.pdgCodeProng2(), + candidate.pdgCodeProng3()); + } + } + } + } + + /// Fill particle histograms (gen MC truth) + void fillCandMcGen(aod::HfMcGenRedLbs::iterator const& particle) + { + auto ptParticle = particle.ptTrack(); + auto yParticle = particle.yTrack(); + auto etaParticle = particle.etaTrack(); + if (yCandGenMax >= 0. && std::abs(yParticle) > yCandGenMax) { + return; + } + std::array ptProngs = {particle.ptProng0(), particle.ptProng1()}; + std::array yProngs = {particle.yProng0(), particle.yProng1()}; + std::array etaProngs = {particle.etaProng0(), particle.etaProng1()}; + bool prongsInAcc = isProngInAcceptance(etaProngs[0], ptProngs[0]) && isProngInAcceptance(etaProngs[1], ptProngs[1]); + + if (fillHistograms) { + registry.fill(HIST("hPtProng0Gen"), ptParticle, ptProngs[0]); + registry.fill(HIST("hPtProng1Gen"), ptParticle, ptProngs[1]); + registry.fill(HIST("hYProng0Gen"), ptParticle, yProngs[0]); + registry.fill(HIST("hYProng1Gen"), ptParticle, yProngs[1]); + registry.fill(HIST("hEtaProng0Gen"), ptParticle, etaProngs[0]); + registry.fill(HIST("hEtaProng1Gen"), ptParticle, etaProngs[1]); + + registry.fill(HIST("hYGen"), ptParticle, yParticle); + registry.fill(HIST("hEtaGen"), ptParticle, etaParticle); + + // generated Lb with daughters in geometrical acceptance + if (prongsInAcc) { + registry.fill(HIST("hYGenWithProngsInAcceptance"), ptParticle, yParticle); + } + } + if (fillSparses) { + registry.fill(HIST("hPtYGenSig"), ptParticle, yParticle); + if (prongsInAcc) { + registry.fill(HIST("hPtYWithProngsInAccepanceGenSig"), ptParticle, yParticle); + } + } + } + + // Process functions + void processData(soa::Filtered> const& candidates, + CandsLc const& candidatesLc, + TracksPion const&) + { + for (const auto& candidate : candidates) { + if (yCandRecoMax >= 0. && std::abs(hfHelper.yLb(candidate)) > yCandRecoMax) { + continue; + } + fillCand(candidate, candidatesLc); + } // candidate loop + } // processData + PROCESS_SWITCH(HfTaskLbReduced, processData, "Process data without ML scores for Lb and Lc daughter", true); + + void processDataWithLcMl(soa::Filtered> const& candidates, + CandsLc const& candidatesLc, + TracksPion const&) + { + for (const auto& candidate : candidates) { + if (yCandRecoMax >= 0. && std::abs(hfHelper.yLb(candidate)) > yCandRecoMax) { + continue; + } + fillCand(candidate, candidatesLc); + } // candidate loop + } // processDataWithLcMl + PROCESS_SWITCH(HfTaskLbReduced, processDataWithLcMl, "Process data with(out) ML scores for Lc daughter (Lb)", false); + + void processDataWithLbMl(soa::Filtered> const& candidates, + CandsLc const& candidatesLc, + TracksPion const&) + { + for (const auto& candidate : candidates) { + if (yCandRecoMax >= 0. && std::abs(hfHelper.yLb(candidate)) > yCandRecoMax) { + continue; + } + fillCand(candidate, candidatesLc); + } // candidate loop + } // processDataWithLbMl + PROCESS_SWITCH(HfTaskLbReduced, processDataWithLbMl, "Process data with(out) ML scores for Lb (Lc daughter)", false); + + void processMc(soa::Filtered> const& candidates, + aod::HfMcGenRedLbs const& mcParticles, + CandsLc const& candidatesLc, + TracksPion const&) + { + // MC rec + for (const auto& candidate : candidates) { + if (yCandRecoMax >= 0. && std::abs(hfHelper.yLb(candidate)) > yCandRecoMax) { + continue; + } + fillCand(candidate, candidatesLc); + } // rec + + // MC gen. level + for (const auto& particle : mcParticles) { + fillCandMcGen(particle); + } // gen + } // processMc + PROCESS_SWITCH(HfTaskLbReduced, processMc, "Process MC without ML scores for Lb and Lc daughter", false); + + void processMcWithDecayTypeCheck(soa::Filtered> const& candidates, + aod::HfMcGenRedLbs const& mcParticles, + CandsLc const& candidatesLc, + TracksPion const&) + { + // MC rec + for (const auto& candidate : candidates) { + if (yCandRecoMax >= 0. && std::abs(hfHelper.yLb(candidate)) > yCandRecoMax) { + continue; + } + fillCand(candidate, candidatesLc); + } // rec + + // MC gen. level + for (const auto& particle : mcParticles) { + fillCandMcGen(particle); + } // gen + } // processMc + PROCESS_SWITCH(HfTaskLbReduced, processMcWithDecayTypeCheck, "Process MC with decay type check and without ML scores for Lb and D daughter", false); + + void processMcWithLcMl(soa::Filtered> const& candidates, + aod::HfMcGenRedLbs const& mcParticles, + CandsLc const& candidatesLc, + TracksPion const&) + { + // MC rec + for (const auto& candidate : candidates) { + if (yCandRecoMax >= 0. && std::abs(hfHelper.yLb(candidate)) > yCandRecoMax) { + continue; + } + fillCand(candidate, candidatesLc); + } // rec + + // MC gen. level + for (const auto& particle : mcParticles) { + fillCandMcGen(particle); + } // gen + } // processMcWithLcMl + PROCESS_SWITCH(HfTaskLbReduced, processMcWithLcMl, "Process MC with(out) ML scores for Lc daughter (Lb)", false); + + void processMcWithLcMlAndDecayTypeCheck(soa::Filtered> const& candidates, + aod::HfMcGenRedLbs const& mcParticles, + CandsLc const& candidatesLc, + TracksPion const&) + { + // MC rec + for (const auto& candidate : candidates) { + if (yCandRecoMax >= 0. && std::abs(hfHelper.yLb(candidate)) > yCandRecoMax) { + continue; + } + fillCand(candidate, candidatesLc); + } // rec + + // MC gen. level + for (const auto& particle : mcParticles) { + fillCandMcGen(particle); + } // gen + } // processMc + PROCESS_SWITCH(HfTaskLbReduced, processMcWithLcMlAndDecayTypeCheck, "Process MC with decay type check and with(out) ML scores for Lb (Lc daughter)", false); + + void processMcWithLbMl(soa::Filtered> const& candidates, + aod::HfMcGenRedLbs const& mcParticles, + CandsLc const& candidatesLc, + TracksPion const&) + { + // MC rec + for (const auto& candidate : candidates) { + if (yCandRecoMax >= 0. && std::abs(hfHelper.yLb(candidate)) > yCandRecoMax) { + continue; + } + fillCand(candidate, candidatesLc); + } // rec + + // MC gen. level + for (const auto& particle : mcParticles) { + fillCandMcGen(particle); + } // gen + } // processMcWithLbMl + PROCESS_SWITCH(HfTaskLbReduced, processMcWithLbMl, "Process MC with(out) ML scores for Lb (Lc daughter)", false); + + void processMcWithLbMlAndDecayTypeCheck(soa::Filtered> const& candidates, + aod::HfMcGenRedLbs const& mcParticles, + CandsLc const& candidatesLc, + TracksPion const&) + { + // MC rec + for (const auto& candidate : candidates) { + if (yCandRecoMax >= 0. && std::abs(hfHelper.yLb(candidate)) > yCandRecoMax) { + continue; + } + fillCand(candidate, candidatesLc); + } // rec + + // MC gen. level + for (const auto& particle : mcParticles) { + fillCandMcGen(particle); + } // gen + } // processMc + PROCESS_SWITCH(HfTaskLbReduced, processMcWithLbMlAndDecayTypeCheck, "Process MC with decay type check and with(out) ML scores for Lb (Lc daughter)", false); +}; // struct + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} diff --git a/PWGHF/DataModel/CandidateReconstructionTables.h b/PWGHF/DataModel/CandidateReconstructionTables.h index 6e76ea8b0ff..a7050fed604 100644 --- a/PWGHF/DataModel/CandidateReconstructionTables.h +++ b/PWGHF/DataModel/CandidateReconstructionTables.h @@ -1906,13 +1906,21 @@ namespace hf_cand_lb { DECLARE_SOA_INDEX_COLUMN_FULL(Prong0, prong0, int, HfCand3Prong, "_0"); // Lb index // MC matching result: -DECLARE_SOA_COLUMN(FlagMcMatchRec, flagMcMatchRec, int8_t); // reconstruction level -DECLARE_SOA_COLUMN(FlagMcMatchGen, flagMcMatchGen, int8_t); // generator level -DECLARE_SOA_COLUMN(OriginMcRec, originMcRec, int8_t); // particle origin, reconstruction level -DECLARE_SOA_COLUMN(OriginMcGen, originMcGen, int8_t); // particle origin, generator level -DECLARE_SOA_COLUMN(DebugMcRec, debugMcRec, int8_t); // debug flag for mis-association reconstruction level +DECLARE_SOA_COLUMN(FlagMcMatchRec, flagMcMatchRec, int8_t); // reconstruction level +DECLARE_SOA_COLUMN(FlagWrongCollision, flagWrongCollision, int8_t); // reconstruction level +DECLARE_SOA_COLUMN(FlagMcMatchGen, flagMcMatchGen, int8_t); // generator level +DECLARE_SOA_COLUMN(OriginMcRec, originMcRec, int8_t); // particle origin, reconstruction level +DECLARE_SOA_COLUMN(OriginMcGen, originMcGen, int8_t); // particle origin, generator level +DECLARE_SOA_COLUMN(DebugMcRec, debugMcRec, int8_t); // debug flag for mis-association reconstruction level // mapping of decay types enum DecayType { LbToLcPi }; // move this to a dedicated cascade namespace in the future? + +enum DecayTypeMc : uint8_t { LbToLcPiToPKPiPi = 0, + LbToLcPiToPKPiK, + B0ToDplusPiToPiKPiPi, + PartlyRecoDecay, + OtherDecay, + NDecayTypeMc }; } // namespace hf_cand_lb // declare dedicated Lb candidate table diff --git a/PWGHF/DataModel/CandidateSelectionTables.h b/PWGHF/DataModel/CandidateSelectionTables.h index 06dd445f98e..44719b1e5d9 100644 --- a/PWGHF/DataModel/CandidateSelectionTables.h +++ b/PWGHF/DataModel/CandidateSelectionTables.h @@ -277,11 +277,15 @@ DECLARE_SOA_TABLE(HfMlBplusToD0Pi, "AOD", "HFMLBPLUS", //! namespace hf_sel_candidate_lb { -DECLARE_SOA_COLUMN(IsSelLbToLcPi, isSelLbToLcPi, int); //! +DECLARE_SOA_COLUMN(IsSelLbToLcPi, isSelLbToLcPi, int); //! selection flag on Lb candidate +DECLARE_SOA_COLUMN(MlProbLbToLcPi, mlProbLbToLcPi, float); //! ML score of Lb candidate for signal class + } // namespace hf_sel_candidate_lb DECLARE_SOA_TABLE(HfSelLbToLcPi, "AOD", "HFSELLB", //! hf_sel_candidate_lb::IsSelLbToLcPi); +DECLARE_SOA_TABLE(HfMlLbToLcPi, "AOD", "HFMLLB", //! + hf_sel_candidate_lb::MlProbLbToLcPi); namespace hf_sel_candidate_x { From 1e14d46fc2338425b7f05670e8a3f10f8214a8ed Mon Sep 17 00:00:00 2001 From: Nicolas Strangmann <77485327+nstrangm@users.noreply.github.com> Date: Thu, 8 May 2025 18:00:07 +0200 Subject: [PATCH 1223/1650] [PWGEM/PhotonMeson] Add pile-up and centrality dependence to pi0 task (#11130) Co-authored-by: Nicolas Strangmann --- PWGEM/PhotonMeson/DataModel/bcWiseTables.h | 40 +++-- .../PhotonMeson/TableProducer/CMakeLists.txt | 2 +- .../TableProducer/bcWiseClusterSkimmer.cxx | 52 +++++- PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx | 170 +++++++++--------- 4 files changed, 153 insertions(+), 111 deletions(-) diff --git a/PWGEM/PhotonMeson/DataModel/bcWiseTables.h b/PWGEM/PhotonMeson/DataModel/bcWiseTables.h index 0a7e457d583..f44769f1d94 100644 --- a/PWGEM/PhotonMeson/DataModel/bcWiseTables.h +++ b/PWGEM/PhotonMeson/DataModel/bcWiseTables.h @@ -28,7 +28,7 @@ namespace o2::aod namespace emdownscaling { -enum Observables { +enum Observable { kDefinition, kEnergy, kEta, @@ -40,6 +40,7 @@ enum Observables { kZVtx, kFT0Amp, kpT, + kMu, nObservables }; @@ -55,7 +56,8 @@ const float downscalingFactors[nObservables]{ 2E0, // FT0M centrality 1E3, // Z-vertex position 1E-1, // FT0M amplitude - 1E3}; // MC pi0 pt + 1E3, // MC pi0 pt + 1E5}; // Mu } // namespace emdownscaling namespace bcwisebc @@ -65,13 +67,17 @@ DECLARE_SOA_COLUMN(HasTVX, hasTVX, bool); //! has DECLARE_SOA_COLUMN(HaskTVXinEMC, haskTVXinEMC, bool); //! kTVXinEMC DECLARE_SOA_COLUMN(HasEMCCell, hasEMCCell, bool); //! at least one EMCal cell in the BC DECLARE_SOA_COLUMN(HasNoTFROFBorder, hasNoTFROFBorder, bool); //! not in the TF border or ITS ROF border region +DECLARE_SOA_COLUMN(StoredCentrality, storedCentrality, uint8_t); //! FT0M centrality (0-100) (x2) DECLARE_SOA_COLUMN(StoredFT0MAmplitude, storedFT0MAmplitude, uint16_t); //! ft0a+c amplitude +DECLARE_SOA_COLUMN(StoredMu, storedMu, uint16_t); //! probability of TVX collision per BC (x1000) -DECLARE_SOA_DYNAMIC_COLUMN(FT0MAmplitude, ft0Amplitude, [](uint16_t storedFT0MAmplitude) -> float { return storedFT0MAmplitude / emdownscaling::downscalingFactors[emdownscaling::kFT0Amp]; }); //! FT0M amplitude +DECLARE_SOA_DYNAMIC_COLUMN(Centrality, centrality, [](uint8_t storedcentrality) -> float { return std::nextafter(storedcentrality / emdownscaling::downscalingFactors[emdownscaling::kFT0MCent], std::numeric_limits::infinity()); }); //! Centrality (0-100) +DECLARE_SOA_DYNAMIC_COLUMN(FT0MAmplitude, ft0Amplitude, [](uint16_t storedFT0MAmplitude) -> float { return std::nextafter(storedFT0MAmplitude / emdownscaling::downscalingFactors[emdownscaling::kFT0Amp], std::numeric_limits::infinity()); }); //! FT0M amplitude +DECLARE_SOA_DYNAMIC_COLUMN(Mu, mu, [](uint16_t storedMu) -> float { return std::nextafter(storedMu / emdownscaling::downscalingFactors[emdownscaling::kMu], std::numeric_limits::infinity()); }); //! probability of TVX collision per BC } // namespace bcwisebc DECLARE_SOA_TABLE(BCWiseBCs, "AOD", "BCWISEBC", //! table of bc wise centrality estimation and event selection input - o2::soa::Index<>, bcwisebc::HasFT0, bcwisebc::HasTVX, bcwisebc::HaskTVXinEMC, bcwisebc::HasEMCCell, bcwisebc::HasNoTFROFBorder, - bcwisebc::StoredFT0MAmplitude, bcwisebc::FT0MAmplitude); + o2::soa::Index<>, bcwisebc::HasFT0, bcwisebc::HasTVX, bcwisebc::HaskTVXinEMC, bcwisebc::HasEMCCell, bcwisebc::HasNoTFROFBorder, bcwisebc::StoredCentrality, + bcwisebc::StoredFT0MAmplitude, bcwisebc::StoredMu, bcwisebc::Centrality, bcwisebc::FT0MAmplitude, bcwisebc::Mu); DECLARE_SOA_INDEX_COLUMN(BCWiseBC, bcWiseBC); //! bunch crossing ID used as index @@ -80,8 +86,8 @@ namespace bcwisecollision DECLARE_SOA_COLUMN(StoredCentrality, storedCentrality, uint8_t); //! FT0M centrality (0-100) (x2) DECLARE_SOA_COLUMN(StoredZVtx, storedZVtx, int16_t); //! Z-vertex position (x1000) -DECLARE_SOA_DYNAMIC_COLUMN(Centrality, centrality, [](uint8_t storedcentrality) -> float { return storedcentrality / emdownscaling::downscalingFactors[emdownscaling::kFT0MCent]; }); //! Centrality (0-100) -DECLARE_SOA_DYNAMIC_COLUMN(ZVtx, zVtx, [](int16_t storedzvtx) -> float { return storedzvtx / emdownscaling::downscalingFactors[emdownscaling::kZVtx]; }); //! Centrality (0-100) +DECLARE_SOA_DYNAMIC_COLUMN(Centrality, centrality, [](uint8_t storedcentrality) -> float { return std::nextafter(storedcentrality / emdownscaling::downscalingFactors[emdownscaling::kFT0MCent], std::numeric_limits::infinity()); }); //! Centrality (0-100) +DECLARE_SOA_DYNAMIC_COLUMN(ZVtx, zVtx, [](int16_t storedzvtx) -> float { return storedzvtx / emdownscaling::downscalingFactors[emdownscaling::kZVtx]; }); //! Centrality (0-100) } // namespace bcwisecollision DECLARE_SOA_TABLE(BCWiseCollisions, "AOD", "BCWISECOLL", //! table of skimmed EMCal clusters o2::soa::Index<>, BCWiseBCId, bcwisecollision::StoredCentrality, bcwisecollision::StoredZVtx, @@ -98,14 +104,14 @@ DECLARE_SOA_COLUMN(StoredM02, storedM02, int16_t); //! shower shape DECLARE_SOA_COLUMN(StoredTime, storedTime, int16_t); //! cluster time (10 ps resolution) DECLARE_SOA_COLUMN(StoredIsExotic, storedIsExotic, bool); //! flag to mark cluster as exotic -DECLARE_SOA_DYNAMIC_COLUMN(Definition, definition, [](int8_t storedDefinition) -> int8_t { return storedDefinition; }); //! cluster definition, see EMCALClusterDefinition.h -DECLARE_SOA_DYNAMIC_COLUMN(E, e, [](int16_t storedE) -> float { return storedE / emdownscaling::downscalingFactors[emdownscaling::kEnergy] + std::numeric_limits::epsilon(); }); //! cluster energy (GeV) -DECLARE_SOA_DYNAMIC_COLUMN(Eta, eta, [](int16_t storedEta) -> float { return storedEta / emdownscaling::downscalingFactors[emdownscaling::kEta] + std::numeric_limits::epsilon(); }); //! cluster pseudorapidity -DECLARE_SOA_DYNAMIC_COLUMN(Phi, phi, [](uint16_t storedPhi) -> float { return storedPhi / emdownscaling::downscalingFactors[emdownscaling::kPhi] + std::numeric_limits::epsilon(); }); //! cluster azimuthal angle (0 to 2pi) -DECLARE_SOA_DYNAMIC_COLUMN(NCells, nCells, [](int16_t storedNCells) -> int16_t { return storedNCells; }); //! number of cells in cluster -DECLARE_SOA_DYNAMIC_COLUMN(M02, m02, [](int16_t storedM02) -> float { return storedM02 / emdownscaling::downscalingFactors[emdownscaling::kM02] + std::numeric_limits::epsilon(); }); //! shower shape long axis -DECLARE_SOA_DYNAMIC_COLUMN(Time, time, [](int16_t storedTime) -> float { return storedTime / emdownscaling::downscalingFactors[emdownscaling::kTime] + std::numeric_limits::epsilon(); }); //! cluster time (ns) -DECLARE_SOA_DYNAMIC_COLUMN(IsExotic, isExotic, [](bool storedIsExotic) -> bool { return storedIsExotic; }); //! flag to mark cluster as exotic +DECLARE_SOA_DYNAMIC_COLUMN(Definition, definition, [](int8_t storedDefinition) -> int8_t { return storedDefinition; }); //! cluster definition, see EMCALClusterDefinition.h +DECLARE_SOA_DYNAMIC_COLUMN(E, e, [](int16_t storedE) -> float { return std::nextafter(storedE / emdownscaling::downscalingFactors[emdownscaling::kEnergy], std::numeric_limits::infinity()); }); //! cluster energy (GeV) +DECLARE_SOA_DYNAMIC_COLUMN(Eta, eta, [](int16_t storedEta) -> float { return std::nextafter(storedEta / emdownscaling::downscalingFactors[emdownscaling::kEta], std::numeric_limits::infinity()); }); //! cluster pseudorapidity +DECLARE_SOA_DYNAMIC_COLUMN(Phi, phi, [](uint16_t storedPhi) -> float { return std::nextafter(storedPhi / emdownscaling::downscalingFactors[emdownscaling::kPhi], std::numeric_limits::infinity()); }); //! cluster azimuthal angle (0 to 2pi) +DECLARE_SOA_DYNAMIC_COLUMN(NCells, nCells, [](int16_t storedNCells) -> int16_t { return storedNCells; }); //! number of cells in cluster +DECLARE_SOA_DYNAMIC_COLUMN(M02, m02, [](int16_t storedM02) -> float { return std::nextafter(storedM02 / emdownscaling::downscalingFactors[emdownscaling::kM02], std::numeric_limits::infinity()); }); //! shower shape long axis +DECLARE_SOA_DYNAMIC_COLUMN(Time, time, [](int16_t storedTime) -> float { return std::nextafter(storedTime / emdownscaling::downscalingFactors[emdownscaling::kTime], std::numeric_limits::infinity()); }); //! cluster time (ns) +DECLARE_SOA_DYNAMIC_COLUMN(IsExotic, isExotic, [](bool storedIsExotic) -> bool { return storedIsExotic; }); //! flag to mark cluster as exotic DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, [](float storedE, float storedEta) -> float { return storedE / emdownscaling::downscalingFactors[emdownscaling::kEnergy] / std::cosh(storedEta / emdownscaling::downscalingFactors[emdownscaling::kEta]); }); //! cluster pt, assuming m=0 (photons) } // namespace bcwisecluster @@ -122,7 +128,7 @@ DECLARE_SOA_COLUMN(IsAccepted, isAccepted, bool); //! Both decay photons are wit DECLARE_SOA_COLUMN(IsPrimary, isPrimary, bool); //! mcParticle.isPhysicalPrimary() || mcParticle.producedByGenerator() DECLARE_SOA_COLUMN(IsFromWD, isFromWD, bool); //! Pi0 from a weak decay according to pwgem::photonmeson::utils::mcutil::IsFromWD -DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, [](uint16_t storedpt) -> float { return storedpt / emdownscaling::downscalingFactors[emdownscaling::kpT] + std::numeric_limits::epsilon(); }); //! pT of pi0 (GeV) +DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, [](uint16_t storedpt) -> float { return std::nextafter(storedpt / emdownscaling::downscalingFactors[emdownscaling::kpT], std::numeric_limits::infinity()); }); //! pT of pi0 (GeV) } // namespace bcwisemcpi0s DECLARE_SOA_TABLE(BCWiseMCPi0s, "AOD", "BCWISEMCPI0", //! table of pi0s on MC level @@ -134,7 +140,7 @@ namespace bcwisemccluster DECLARE_SOA_COLUMN(Pi0ID, pi0ID, int32_t); //! Index of the mother pi0 (-1 if not from pi0) DECLARE_SOA_COLUMN(StoredTrueE, storedTrueE, uint16_t); //! energy of cluster inducing particle (1 MeV -> Maximum cluster energy of ~65 GeV) -DECLARE_SOA_DYNAMIC_COLUMN(TrueE, trueE, [](uint16_t storedTrueE) -> float { return storedTrueE / emdownscaling::downscalingFactors[emdownscaling::kEnergy] + std::numeric_limits::epsilon(); }); //! energy of cluster inducing particle (GeV) +DECLARE_SOA_DYNAMIC_COLUMN(TrueE, trueE, [](uint16_t storedTrueE) -> float { return std::nextafter(storedTrueE / emdownscaling::downscalingFactors[emdownscaling::kEnergy], std::numeric_limits::infinity()); }); //! energy of cluster inducing particle (GeV) } // namespace bcwisemccluster DECLARE_SOA_TABLE(BCWiseMCClusters, "AOD", "BCWISEMCCLS", //! table of MC information for clusters -> To be joined with the cluster table diff --git a/PWGEM/PhotonMeson/TableProducer/CMakeLists.txt b/PWGEM/PhotonMeson/TableProducer/CMakeLists.txt index 10266dcb8c2..511fb699611 100644 --- a/PWGEM/PhotonMeson/TableProducer/CMakeLists.txt +++ b/PWGEM/PhotonMeson/TableProducer/CMakeLists.txt @@ -46,7 +46,7 @@ o2physics_add_dpl_workflow(skimmer-gamma-calo o2physics_add_dpl_workflow(bc-wise-cluster-skimmer SOURCES bcWiseClusterSkimmer.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2::EMCALBase O2Physics::AnalysisCore + PUBLIC_LINK_LIBRARIES O2::Framework O2::EMCALBase O2Physics::AnalysisCCDB O2Physics::AnalysisCore COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(skimmer-phos diff --git a/PWGEM/PhotonMeson/TableProducer/bcWiseClusterSkimmer.cxx b/PWGEM/PhotonMeson/TableProducer/bcWiseClusterSkimmer.cxx index cc9cfaed1fb..699c48fb8a7 100644 --- a/PWGEM/PhotonMeson/TableProducer/bcWiseClusterSkimmer.cxx +++ b/PWGEM/PhotonMeson/TableProducer/bcWiseClusterSkimmer.cxx @@ -19,6 +19,7 @@ #include #include #include +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -28,6 +29,9 @@ #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Centrality.h" +#include "Common/CCDB/ctpRateFetcher.h" +#include "CCDB/BasicCCDBManager.h" +#include "DataFormatsParameters/GRPLHCIFData.h" #include "PWGJE/DataModel/EMCALClusters.h" #include "PWGEM/PhotonMeson/Utils/MCUtilities.h" #include "PWGEM/PhotonMeson/DataModel/bcWiseTables.h" @@ -39,7 +43,7 @@ using namespace o2::framework::expressions; using MyCollisions = soa::Join; using MyMCCollisions = soa::Join; -using MyBCs = soa::Join; +using MyBCs = soa::Join; using SelectedUniqueClusters = soa::Filtered; // Clusters from collisions with only one collision in the BC using SelectedUniqueMCClusters = soa::Filtered>; // Clusters from collisions with only one collision in the BC @@ -70,8 +74,12 @@ struct bcWiseClusterSkimmer { Configurable cfgRequirekTVXinEMC{"cfgRequirekTVXinEMC", false, "Only store kTVXinEMC triggered BCs"}; Configurable cfgRequireGoodRCTQuality{"cfgRequireGoodRCTQuality", false, "Only store BCs with good quality of T0 and EMC in RCT"}; + Configurable cfgStoreMu{"cfgStoreMu", false, "Calculate and store mu (probablity of a TVX collision in the BC) per BC. Otherwise fill with 0"}; aod::rctsel::RCTFlagsChecker isFT0EMCGoodRCTChecker{aod::rctsel::kFT0Bad, aod::rctsel::kEMCBad}; + parameters::GRPLHCIFData* mLHCIFdata = nullptr; + int mRunNumber = -1; + ctpRateFetcher mRateFetcher; Filter energyFilter = (aod::emcalcluster::energy > cfgMinClusterEnergy && aod::emcalcluster::energy < cfgMaxClusterEnergy); Filter m02Filter = (aod::emcalcluster::nCells == 1 || (aod::emcalcluster::m02 > cfgMinM02 && aod::emcalcluster::m02 < cfgMaxM02)); @@ -82,7 +90,7 @@ struct bcWiseClusterSkimmer { std::map fMapPi0Index; // Map to connect the MC index of the pi0 to the one saved in the derived table - void init(framework::InitContext&) + void init(o2::framework::InitContext&) { const int nEventBins = 6; mHistManager.add("nBCs", "Number of BCs;;#bf{#it{N}_{BCs}}", HistType::kTH1F, {{nEventBins, -0.5, 5.5}}); @@ -105,9 +113,9 @@ struct bcWiseClusterSkimmer { /// \brief Process EMCAL clusters (either ambigous or unique) template - OutputType convertForStorage(InputType const& valueIn, Observables observable) + OutputType convertForStorage(InputType const& valueIn, Observable observable) { - double valueToBeChecked = std::round(valueIn * downscalingFactors[observable]); + double valueToBeChecked = valueIn * downscalingFactors[observable]; if (valueToBeChecked < std::numeric_limits::lowest()) { LOG(warning) << "Value " << valueToBeChecked << " of observable " << observable << " below lowest possible value of " << typeid(OutputType).name() << ": " << static_cast(std::numeric_limits::lowest()); valueToBeChecked = static_cast(std::numeric_limits::lowest()); @@ -173,6 +181,33 @@ struct bcWiseClusterSkimmer { return true; } + double calculateMu(const auto& bc) + { + auto& ccdbMgr = o2::ccdb::BasicCCDBManager::instance(); + uint64_t timeStamp = bc.timestamp(); + + if (mRunNumber != bc.runNumber()) { + std::map metadata; + mLHCIFdata = ccdbMgr.getSpecific("GLO/Config/GRPLHCIF", timeStamp, metadata); + if (mLHCIFdata == nullptr) + LOG(fatal) << "GRPLHCIFData not in database, timestamp:" << timeStamp; + mRunNumber = bc.runNumber(); + LOG(info) << "LHCIF data fetched for run " << mRunNumber << " and timestamp " << timeStamp; + } + + auto bfilling = mLHCIFdata->getBunchFilling(); + double nbc = bfilling.getFilledBCs().size(); + + double tvxRate = mRateFetcher.fetch(&ccdbMgr, timeStamp, bc.runNumber(), "T0VTX"); + + double nTriggersPerFilledBC = tvxRate / nbc / o2::constants::lhc::LHCRevFreq; + double mu = -std::log(1 - nTriggersPerFilledBC); + + // LOG(info) << "Time stamp: " << timeStamp << " Run number: " << bc.runNumber() << " Number of filled BCs: " << nbc << " Trigger rate: " << tvxRate << " Mu: " << mu; + + return mu; + } + void processEventProperties(const auto& bc, const auto& collisionsInBC, const auto& cellsInBC) { bool hasFT0 = bc.has_foundFT0(); @@ -192,13 +227,16 @@ struct bcWiseClusterSkimmer { if (hasNoTFROFBorder) mHistManager.fill(HIST("nBCs"), 5); + double mu = cfgStoreMu ? calculateMu(bc) : 0.; float ft0Amp = hasFT0 ? bc.foundFT0().sumAmpA() + bc.foundFT0().sumAmpC() : 0.; + double centrality = 101.5; + if (collisionsInBC.size() > 0) + centrality = collisionsInBC.iteratorAt(0).centFT0M(); - bcTable(hasFT0, hasTVX, haskTVXinEMC, hasEMCCell, hasNoTFROFBorder, convertForStorage(ft0Amp, kFT0Amp)); + bcTable(hasFT0, hasTVX, haskTVXinEMC, hasEMCCell, hasNoTFROFBorder, convertForStorage(centrality, kFT0MCent), convertForStorage(ft0Amp, kFT0Amp), convertForStorage(mu, kMu)); - for (const auto& collision : collisionsInBC) { + for (const auto& collision : collisionsInBC) collisionTable(bcTable.lastIndex(), convertForStorage(collision.centFT0M(), kFT0MCent), convertForStorage(collision.posZ(), kZVtx)); - } } template diff --git a/PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx b/PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx index 6b83440a51c..b5bbd127f1d 100644 --- a/PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx +++ b/PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx @@ -56,8 +56,7 @@ struct EmcalBcWisePi0 { Configurable cfgDistanceToEdge{"cfgDistanceToEdge", 1, "Distance to edge in cells required for rotated cluster to be accepted"}; Configurable cfgBGEventDownsampling{"cfgBGEventDownsampling", 1, "Only calculate background for every n-th event (performance reasons in PbPb)"}; - static constexpr float DefaultCentralityWindow[2] = {-1., 101.}; - Configurable> cfgCentralityWindow{"cfgCentralityWindow", {DefaultCentralityWindow, 2, {"Min_Centrality", "Max_Centrality"}}, "Select centrality window (also requires unique collision)"}; + ConfigurableAxis cfgCentralityBinning{"cfgCentralityBinning", {VARIABLE_WIDTH, 0.f, 5.f, 10.f, 20.f, 30.f, 40.f, 50.f, 60.f, 70.f, 80.f, 90.f, 100.f, 101.f, 102.f}, "FT0M centrality (%)"}; Configurable cfgIsMC{"cfgIsMC", false, "Flag to indicate if the task is running on MC data and should fill MC histograms"}; @@ -71,40 +70,44 @@ struct EmcalBcWisePi0 { void init(InitContext const&) { emcalGeom = emcal::Geometry::GetInstanceFromRunNumber(300000); - const int nEventBins = 8; - mHistManager.add("Event/nBCs", "Number of BCs;;#bf{#it{N}_{BC}}", HistType::kTH1F, {{nEventBins, -0.5, 7.5}}); - const TString binLabels[nEventBins] = {"All", "FT0", "TVX", "kTVXinEMC", "Cell", "Cluster", "NoBorder", "Collision"}; - for (int iBin = 0; iBin < nEventBins; iBin++) - mHistManager.get(HIST("Event/nBCs"))->GetXaxis()->SetBinLabel(iBin + 1, binLabels[iBin]); + const int nEventBins = 6; + mHistManager.add("Event/nBCs", "Number of BCs;;#bf{FT0M centrality (%)};#bf{#it{N}_{BC}}", HistType::kTH2F, {{nEventBins, -0.5, 5.5}, cfgCentralityBinning}); + mHistManager.add("Event/nCollisions", "Number of Collisions (BCs x P(mu));;#bf{FT0M centrality (%)};#bf{#it{N}_{coll}}", HistType::kTH2F, {{nEventBins, -0.5, 5.5}, cfgCentralityBinning}); + const TString binLabels[nEventBins] = {"All", "FT0", "TVX", "kTVXinEMC", "Cell", "Cluster"}; + for (int iBin = 0; iBin < nEventBins; iBin++) { + mHistManager.get(HIST("Event/nBCs"))->GetXaxis()->SetBinLabel(iBin + 1, binLabels[iBin]); + mHistManager.get(HIST("Event/nCollisions"))->GetXaxis()->SetBinLabel(iBin + 1, binLabels[iBin]); + } - mHistManager.add("Event/nCollPerBC", "Number of collisions per BC;#bf{#it{N}_{coll}};#bf{#it{N}_{BC}}", HistType::kTH1F, {{5, -0.5, 4.5}}); + mHistManager.add("Event/nCollPerBC", "Number of collisions per BC;#bf{#it{N}_{coll}};#bf{FT0M centrality (%)};#bf{#it{N}_{BC}}", HistType::kTH2F, {{5, -0.5, 4.5}, cfgCentralityBinning}); mHistManager.add("Event/Z1VsZ2", "Z vertex positions for BCs with two collisions;#bf{#it{z}_{vtx}^{1} (cm)};#bf{#it{z}_{vtx}^{2} (cm)}", HistType::kTH2F, {{150, -15, 15}, {150, -15, 15}}); mHistManager.add("Event/dZ", "Distance between vertices for BCs with two collisions;#bf{#Delta #it{z}_{vtx} (cm)};#bf{#it{N}_{BC}}", HistType::kTH1F, {{600, -30, 30}}); + mHistManager.add("Event/Mu", "Probablity of a collision in the BC;#bf{#mu};#bf{#it{N}_{BC}}", HistType::kTH1F, {{1000, 0., 0.1}}); - mHistManager.add("Event/Centrality", "FT0M centrality;FT0M centrality (%);#bf{#it{N}_{BC} (only BCs containing exactly 1 collision)}", HistType::kTH1F, {{100, 0., 100.}}); - mHistManager.add("Event/CentralityVsAmplitude", "FT0M AmplitudeVsCentrality;FT0M Centrality;FT0M Amplitude", HistType::kTH2F, {{105, 0, 105}, {600, 0, 300000}}); + mHistManager.add("Event/Centrality", "FT0M centrality;FT0M centrality (%);#bf{#it{N}_{BC}}", HistType::kTH1F, {cfgCentralityBinning}); + mHistManager.add("Event/CentralityVsAmplitude", "FT0M AmplitudeVsCentrality;FT0M Centrality;FT0M Amplitude", HistType::kTH2F, {cfgCentralityBinning, {600, 0, 300000}}); - mHistManager.add("Cluster/E", "Energy of cluster;#bf{#it{E} (GeV)};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{200, 0, 20}}); - mHistManager.add("Cluster/M02", "Shape of cluster;#bf{#it{M}_{02}};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{200, 0, 2}}); - mHistManager.add("Cluster/Time", "Time of cluster;#bf{#it{t} (ns)};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{200, -100, 100}}); - mHistManager.add("Cluster/NCells", "Number of cells per cluster;#bf{#it{N}_{cells}};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{51, 0., 50.5}}); - mHistManager.add("Cluster/Exotic", "Is cluster exotic?;#bf{Exotic?};#bf{#it{N}_{clusters}}", HistType::kTH1F, {{2, -0.5, 1.5}}); - mHistManager.add("Cluster/EtaPhi", "Eta/Phi distribution of clusters;#eta;#phi", HistType::kTH2F, {{400, -0.8, 0.8}, {400, 0, constants::math::TwoPI}}); + mHistManager.add("Cluster/E", "Energy of cluster;#bf{#it{E} (GeV)};#bf{FT0M centrality (%)};#bf{#it{N}_{clusters}}", HistType::kTH2F, {{200, 0, 20}, cfgCentralityBinning}); + mHistManager.add("Cluster/M02", "Shape of cluster;#bf{#it{M}_{02}};#bf{FT0M centrality (%)};#bf{#it{N}_{clusters}}", HistType::kTH2F, {{200, 0, 2}, cfgCentralityBinning}); + mHistManager.add("Cluster/Time", "Time of cluster;#bf{#it{t} (ns)};#bf{FT0M centrality (%)};#bf{#it{N}_{clusters}}", HistType::kTH2F, {{200, -100, 100}, cfgCentralityBinning}); + mHistManager.add("Cluster/NCells", "Number of cells per cluster;#bf{#it{N}_{cells}};#bf{FT0M centrality (%)};#bf{#it{N}_{clusters}}", HistType::kTH2F, {{51, 0., 50.5}, cfgCentralityBinning}); + mHistManager.add("Cluster/Exotic", "Is cluster exotic?;#bf{Exotic?};#bf{FT0M centrality (%)};#bf{#it{N}_{clusters}}", HistType::kTH2F, {{2, -0.5, 1.5}, cfgCentralityBinning}); + mHistManager.add("Cluster/EtaPhi", "Eta/Phi distribution of clusters;#eta;#phi;#bf{FT0M centrality (%)};#bf{#it{N}_{clusters}}", HistType::kTH3F, {{400, -0.8, 0.8}, {400, 0, constants::math::TwoPI}, cfgCentralityBinning}); - mHistManager.add("GG/invMassVsPt", "Invariant mass and pT of meson candidates;#bf{#it{M}^{#gamma#gamma} (GeV/#it{c}^{2})};#bf{#it{p}_{T}^{#gamma#gamma} (GeV/#it{c})}", HistType::kTH2F, {{200, 0., 0.4}, {200, 0., 20.}}); - mHistManager.add("GG/invMassVsPtBackground", "Invariant mass and pT of background meson candidates;#bf{#it{M}^{#gamma#gamma} (GeV/#it{c}^{2})};#bf{#it{p}_{T}^{#gamma#gamma} (GeV/#it{c})}", HistType::kTH2F, {{200, 0., 0.4}, {200, 0., 20.}}); + mHistManager.add("GG/invMassVsPt", "Invariant mass and pT of meson candidates;#bf{#it{M}^{#gamma#gamma} (GeV/#it{c}^{2})};#bf{#it{p}_{T}^{#gamma#gamma} (GeV/#it{c})};#bf{FT0M centrality (%)}", HistType::kTH3F, {{200, 0., 0.4}, {200, 0., 20.}, cfgCentralityBinning}); + mHistManager.add("GG/invMassVsPtBackground", "Invariant mass and pT of background meson candidates;#bf{#it{M}^{#gamma#gamma} (GeV/#it{c}^{2})};#bf{#it{p}_{T}^{#gamma#gamma} (GeV/#it{c})};#bf{FT0M centrality (%)}", HistType::kTH3F, {{200, 0., 0.4}, {200, 0., 20.}, cfgCentralityBinning}); if (cfgIsMC) { - mHistManager.add("True/clusterERecVsETrue", "True vs reconstructed energy of cluster inducing particle;#bf{#it{E}_{rec} (GeV)};#bf{#it{E}_{true}^{cls inducing part} (GeV)}", HistType::kTH2F, {{200, 0, 20}, {200, 0, 20}}); - mHistManager.add("True/PtRecVsPtTrue", "True vs reconstructed pT of true pi0s;#bf{#it{p}_{T}^{rec} (GeV/#it{c})};#bf{#it{p}_{T}^{true} (GeV/#it{c})}", HistType::kTH2F, {{200, 0., 20.}, {200, 0., 20.}}); - mHistManager.add("True/invMassVsPt_Primary", "Invariant mass and pT of meson candidates", HistType::kTH2F, {{200, 0., 0.4}, {200, 0., 20.}}); - mHistManager.add("True/invMassVsPt_Secondary", "Invariant mass and pT of meson candidates", HistType::kTH2F, {{200, 0., 0.4}, {200, 0., 20.}}); - mHistManager.add("True/invMassVsPt_HadronicShower", "Invariant mass and pT of meson candidates", HistType::kTH2F, {{200, 0., 0.4}, {200, 0., 20.}}); - - mHistManager.add("Generated/pi0_AllBCs", "pT spectrum of generated pi0s in all BCs;#bf{#it{p}_{T} (GeV/#it{c})};#bf{#it{N}_{#pi^{0}}^{gen}}", HistType::kTH1F, {{200, 0, 20}}); - mHistManager.add("Generated/pi0_TVX", "pT spectrum of generated pi0s in TVX triggered BCs;#bf{#it{p}_{T} (GeV/#it{c})};#bf{#it{N}_{#pi^{0}}^{gen}}", HistType::kTH1F, {{200, 0, 20}}); - mHistManager.add("Generated/pi0_kTVXinEMC", "pT spectrum of generated pi0s in kTVXinEMC triggered BCs;#bf{#it{p}_{T} (GeV/#it{c})};#bf{#it{N}_{#pi^{0}}^{gen}}", HistType::kTH1F, {{200, 0, 20}}); - mHistManager.add("Accepted/pi0_kTVXinEMC", "pT spectrum of accepted pi0s in kTVXinEMC triggered BCs;#bf{#it{p}_{T} (GeV/#it{c})};#bf{#it{N}_{#pi^{0}}^{acc}}", HistType::kTH1F, {{200, 0, 20}}); + mHistManager.add("True/clusterERecVsETrue", "True vs reconstructed energy of cluster inducing particle;#bf{#it{E}_{rec} (GeV)};#bf{#it{E}_{true}^{cls inducing part} (GeV)};#bf{FT0M centrality (%)}", HistType::kTH3F, {{200, 0, 20}, {200, 0, 20}, cfgCentralityBinning}); + mHistManager.add("True/PtRecVsPtTrue", "True vs reconstructed pT of true pi0s;#bf{#it{p}_{T}^{rec} (GeV/#it{c})};#bf{#it{p}_{T}^{true} (GeV/#it{c})};#bf{FT0M centrality (%)}", HistType::kTH3F, {{200, 0., 20.}, {200, 0., 20.}, cfgCentralityBinning}); + mHistManager.add("True/invMassVsPt_Primary", "Reconstructed validated primary pi0;#bf{#it{M}^{#gamma#gamma} (GeV/#it{c}^{2})};#bf{#it{p}_{T}^{#gamma#gamma} (GeV/#it{c})};#bf{FT0M centrality (%)}", HistType::kTH3F, {{200, 0., 0.4}, {200, 0., 20.}, cfgCentralityBinning}); + mHistManager.add("True/invMassVsPt_Secondary", "Reconstructed validated pi0 from secondary decay;#bf{#it{M}^{#gamma#gamma} (GeV/#it{c}^{2})};#bf{#it{p}_{T}^{#gamma#gamma} (GeV/#it{c})};#bf{FT0M centrality (%)}", HistType::kTH3F, {{200, 0., 0.4}, {200, 0., 20.}, cfgCentralityBinning}); + mHistManager.add("True/invMassVsPt_HadronicShower", "Reconstructed validated pi0 from hadronic shower;#bf{#it{M}^{#gamma#gamma} (GeV/#it{c}^{2})};#bf{#it{p}_{T}^{#gamma#gamma} (GeV/#it{c})};#bf{FT0M centrality (%)}", HistType::kTH3F, {{200, 0., 0.4}, {200, 0., 20.}, cfgCentralityBinning}); + + mHistManager.add("Generated/pi0_AllBCs", "pT spectrum of generated pi0s in all BCs;#bf{#it{p}_{T} (GeV/#it{c})};#bf{FT0M centrality (%)};#bf{#it{N}_{#pi^{0}}^{gen}}", HistType::kTH2F, {{200, 0, 20}, cfgCentralityBinning}); + mHistManager.add("Generated/pi0_TVX", "pT spectrum of generated pi0s in TVX triggered BCs;#bf{#it{p}_{T} (GeV/#it{c})};#bf{FT0M centrality (%)};#bf{#it{N}_{#pi^{0}}^{gen}}", HistType::kTH2F, {{200, 0, 20}, cfgCentralityBinning}); + mHistManager.add("Generated/pi0_kTVXinEMC", "pT spectrum of generated pi0s in kTVXinEMC triggered BCs;#bf{#it{p}_{T} (GeV/#it{c})};#bf{FT0M centrality (%)};#bf{#it{N}_{#pi^{0}}^{gen}}", HistType::kTH2F, {{200, 0, 20}, cfgCentralityBinning}); + mHistManager.add("Accepted/pi0_kTVXinEMC", "pT spectrum of accepted pi0s in kTVXinEMC triggered BCs;#bf{#it{p}_{T} (GeV/#it{c})};#bf{FT0M centrality (%)};#bf{#it{N}_{#pi^{0}}^{acc}}", HistType::kTH2F, {{200, 0, 20}, cfgCentralityBinning}); } } @@ -126,49 +129,55 @@ struct EmcalBcWisePi0 { void fillEventHists(const auto& bc, const auto& collisions, const auto& clusters) { - mHistManager.fill(HIST("Event/nBCs"), 0); - if (bc.hasFT0()) - mHistManager.fill(HIST("Event/nBCs"), 1); - if (bc.hasTVX()) - mHistManager.fill(HIST("Event/nBCs"), 2); - if (bc.haskTVXinEMC()) - mHistManager.fill(HIST("Event/nBCs"), 3); - if (bc.hasEMCCell()) - mHistManager.fill(HIST("Event/nBCs"), 4); - if (clusters.size() > 0) - mHistManager.fill(HIST("Event/nBCs"), 5); - if (bc.hasNoTFROFBorder()) - mHistManager.fill(HIST("Event/nBCs"), 6); - if (collisions.size() > 0) - mHistManager.fill(HIST("Event/nBCs"), 7); - - if (collisions.size() == 1) { - mHistManager.fill(HIST("Event/Centrality"), collisions.iteratorAt(0).centrality()); - mHistManager.fill(HIST("Event/CentralityVsAmplitude"), collisions.iteratorAt(0).centrality(), bc.ft0Amplitude()); - } else { - mHistManager.fill(HIST("Event/CentralityVsAmplitude"), 103, bc.ft0Amplitude()); + mHistManager.fill(HIST("Event/nBCs"), 0, bc.centrality()); + float mu = bc.mu(); + mHistManager.fill(HIST("Event/Mu"), mu); + double p = mu > 0.001 ? mu / (1 - std::exp(-mu)) : 1.; // No pile-up for small mu (protection against division by zero) + mHistManager.fill(HIST("Event/nCollisions"), 0, bc.centrality(), p); + if (bc.hasFT0()) { + mHistManager.fill(HIST("Event/nBCs"), 1, bc.centrality()); + mHistManager.fill(HIST("Event/nCollisions"), 1, bc.centrality(), p); + } + if (bc.hasTVX()) { + mHistManager.fill(HIST("Event/nBCs"), 2, bc.centrality()); + mHistManager.fill(HIST("Event/nCollisions"), 2, bc.centrality(), p); + } + if (bc.haskTVXinEMC()) { + mHistManager.fill(HIST("Event/nBCs"), 3, bc.centrality()); + mHistManager.fill(HIST("Event/nCollisions"), 3, bc.centrality(), p); } + if (bc.hasEMCCell()) { + mHistManager.fill(HIST("Event/nBCs"), 4, bc.centrality()); + mHistManager.fill(HIST("Event/nCollisions"), 4, bc.centrality(), p); + } + if (clusters.size() > 0) { + mHistManager.fill(HIST("Event/nBCs"), 5, bc.centrality()); + mHistManager.fill(HIST("Event/nCollisions"), 5, bc.centrality(), p); + } + + mHistManager.fill(HIST("Event/Centrality"), bc.centrality()); + mHistManager.fill(HIST("Event/CentralityVsAmplitude"), bc.centrality(), bc.ft0Amplitude()); - mHistManager.fill(HIST("Event/nCollPerBC"), collisions.size()); + mHistManager.fill(HIST("Event/nCollPerBC"), collisions.size(), bc.centrality()); if (collisions.size() == 2) { mHistManager.fill(HIST("Event/Z1VsZ2"), collisions.iteratorAt(0).zVtx(), collisions.iteratorAt(1).zVtx()); mHistManager.fill(HIST("Event/dZ"), collisions.iteratorAt(0).zVtx() - collisions.iteratorAt(1).zVtx()); } } - void fillClusterHists(const auto& clusters) + void fillClusterHists(const auto& clusters, float centrality) { for (const auto& cluster : clusters) { - mHistManager.fill(HIST("Cluster/E"), cluster.e()); - mHistManager.fill(HIST("Cluster/M02"), cluster.m02()); - mHistManager.fill(HIST("Cluster/Time"), cluster.time()); - mHistManager.fill(HIST("Cluster/NCells"), cluster.nCells()); - mHistManager.fill(HIST("Cluster/EtaPhi"), cluster.eta(), cluster.phi()); - mHistManager.fill(HIST("Cluster/Exotic"), cluster.isExotic()); + mHistManager.fill(HIST("Cluster/E"), cluster.e(), centrality); + mHistManager.fill(HIST("Cluster/M02"), cluster.m02(), centrality); + mHistManager.fill(HIST("Cluster/Time"), cluster.time(), centrality); + mHistManager.fill(HIST("Cluster/NCells"), cluster.nCells(), centrality); + mHistManager.fill(HIST("Cluster/EtaPhi"), cluster.eta(), cluster.phi(), centrality); + mHistManager.fill(HIST("Cluster/Exotic"), cluster.isExotic(), centrality); } } - void reconstructMesons(const auto& clusters, int bcId) + void reconstructMesons(const auto& clusters, const auto& bc) { for (const auto& [g1, g2] : soa::combinations(soa::CombinationsStrictlyUpperIndexPolicy(clusters, clusters))) { ROOT::Math::PtEtaPhiMVector v1(g1.pt(), g1.eta(), g1.phi(), 0.); @@ -181,12 +190,12 @@ struct EmcalBcWisePi0 { if (openingAngle12 < cfgMinOpenAngle) continue; - mHistManager.fill(HIST("GG/invMassVsPt"), v12.M(), v12.Pt()); + mHistManager.fill(HIST("GG/invMassVsPt"), v12.M(), v12.Pt(), bc.centrality()); if (clusters.size() < 3) continue; - if (bcId % cfgBGEventDownsampling != 0) + if (bc.globalIndex() % cfgBGEventDownsampling != 0) continue; // "else: Calculate background" @@ -217,12 +226,12 @@ struct EmcalBcWisePi0 { ROOT::Math::PtEtaPhiMVector vBG = v3 + vi; - mHistManager.fill(HIST("GG/invMassVsPtBackground"), vBG.M(), vBG.Pt()); + mHistManager.fill(HIST("GG/invMassVsPtBackground"), vBG.M(), vBG.Pt(), bc.centrality()); } } } } - void reconstructTrueMesons(const auto& clusters, const auto& mcPi0s) + void reconstructTrueMesons(const auto& clusters, const auto& mcPi0s, const auto& bc) { for (const auto& [g1, g2] : soa::combinations(soa::CombinationsStrictlyUpperIndexPolicy(clusters, clusters))) { if (g1.pi0ID() == -1 || g1.pi0ID() != g2.pi0ID()) @@ -240,14 +249,14 @@ struct EmcalBcWisePi0 { const auto& mcPi0 = mcPi0s.iteratorAt(g1.pi0ID() - mcPi0s.offset()); - mHistManager.fill(HIST("True/PtRecVsPtTrue"), v12.Pt(), mcPi0.pt()); + mHistManager.fill(HIST("True/PtRecVsPtTrue"), v12.Pt(), mcPi0.pt(), bc.centrality()); if (mcPi0.isPrimary()) - mHistManager.fill(HIST("True/invMassVsPt_Primary"), v12.M(), v12.Pt()); + mHistManager.fill(HIST("True/invMassVsPt_Primary"), v12.M(), v12.Pt(), bc.centrality()); else if (mcPi0.isFromWD()) - mHistManager.fill(HIST("True/invMassVsPt_Secondary"), v12.M(), v12.Pt()); + mHistManager.fill(HIST("True/invMassVsPt_Secondary"), v12.M(), v12.Pt(), bc.centrality()); else - mHistManager.fill(HIST("True/invMassVsPt_HadronicShower"), v12.M(), v12.Pt()); + mHistManager.fill(HIST("True/invMassVsPt_HadronicShower"), v12.M(), v12.Pt(), bc.centrality()); } } @@ -255,19 +264,10 @@ struct EmcalBcWisePi0 { { if (cfgRequirekTVXinEMC && !bc.haskTVXinEMC()) return false; - - if (cfgCentralityWindow->get("Min_Centrality") > -0.5 || cfgCentralityWindow->get("Max_Centrality") < 100.5) { // Centrality window is set - if (collisions.size() != 1) - return false; - if (collisions.iteratorAt(0).centrality() < cfgCentralityWindow->get("Min_Centrality") || collisions.iteratorAt(0).centrality() > cfgCentralityWindow->get("Max_Centrality")) - return false; - } - if (cfgSelectOnlyUniqueAmbiguous == 1 && collisions.size() != 1) return false; if (cfgSelectOnlyUniqueAmbiguous == 2 && collisions.size() == 1) return false; - return true; } @@ -275,13 +275,13 @@ struct EmcalBcWisePi0 { { for (const auto& mcPi0 : mcPi0s) { if (mcPi0.isPrimary()) { - mHistManager.fill(HIST("Generated/pi0_AllBCs"), mcPi0.pt()); + mHistManager.fill(HIST("Generated/pi0_AllBCs"), mcPi0.pt(), bc.centrality()); if (bc.hasTVX()) - mHistManager.fill(HIST("Generated/pi0_TVX"), mcPi0.pt()); + mHistManager.fill(HIST("Generated/pi0_TVX"), mcPi0.pt(), bc.centrality()); if (bc.haskTVXinEMC()) - mHistManager.fill(HIST("Generated/pi0_kTVXinEMC"), mcPi0.pt()); + mHistManager.fill(HIST("Generated/pi0_kTVXinEMC"), mcPi0.pt(), bc.centrality()); if (mcPi0.isAccepted() && bc.haskTVXinEMC()) - mHistManager.fill(HIST("Accepted/pi0_kTVXinEMC"), mcPi0.pt()); + mHistManager.fill(HIST("Accepted/pi0_kTVXinEMC"), mcPi0.pt(), bc.centrality()); } } } @@ -293,17 +293,15 @@ struct EmcalBcWisePi0 { fillEventHists(bc, collisions, clusters); - fillClusterHists(clusters); + fillClusterHists(clusters, bc.centrality()); - reconstructMesons(clusters, bc.globalIndex()); + reconstructMesons(clusters, bc); } void processMCInfo(aod::BCWiseBCs::iterator const& bc, aod::BCWiseCollisions const& collisions, SelectedMCClusters const& clusters, aod::BCWiseMCPi0s const& mcPi0s) { - if (!cfgIsMC) { + if (!cfgIsMC) LOG(fatal) << "MC processing is not enabled, but the task is running on MC data. Please set cfgIsMC to true."; - return; - } fillGeneratedPi0Hists(mcPi0s, bc); // Fill before BC selection to also store pi0s in BCs that were not triggered @@ -311,9 +309,9 @@ struct EmcalBcWisePi0 { return; for (const auto& cluster : clusters) - mHistManager.fill(HIST("True/clusterERecVsETrue"), cluster.e(), cluster.trueE()); + mHistManager.fill(HIST("True/clusterERecVsETrue"), cluster.e(), cluster.trueE(), bc.centrality()); - reconstructTrueMesons(clusters, mcPi0s); + reconstructTrueMesons(clusters, mcPi0s, bc); } PROCESS_SWITCH(EmcalBcWisePi0, processMCInfo, "Run true and gen", false); }; From 577da720a9b14d79d7641f4ce260bf7a5fe4df0f Mon Sep 17 00:00:00 2001 From: Rohaan Deb <67634136+RD0407@users.noreply.github.com> Date: Thu, 8 May 2025 18:43:35 +0200 Subject: [PATCH 1224/1650] [PWGLF] PWGLF/Tasks/Nuspex/spectraTOF.cxx (#11132) --- PWGLF/Tasks/Nuspex/spectraTOF.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Nuspex/spectraTOF.cxx b/PWGLF/Tasks/Nuspex/spectraTOF.cxx index 813a3da63c5..e1607610ac6 100644 --- a/PWGLF/Tasks/Nuspex/spectraTOF.cxx +++ b/PWGLF/Tasks/Nuspex/spectraTOF.cxx @@ -1889,7 +1889,7 @@ struct tofSpectra { } const auto& mcCollision = collision.mcCollision_as(); - const float multiplicity = getMultiplicityMC(mcCollision); + const float multiplicity = getMultiplicity(collision); const int occupancy = collision.trackOccupancyInTimeRange(); //************************************RD************************************************** const float impParam = mcCollision.impactParameter(); From 010f975d4056453f03393cf981adad1f3a7117c6 Mon Sep 17 00:00:00 2001 From: omvazque Date: Thu, 8 May 2025 15:42:35 -0500 Subject: [PATCH 1225/1650] [PWGLF] adds flag to apply particle weights (#11134) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index 5778f4d0634..a9b8a49737e 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -95,6 +95,7 @@ struct UccZdc { ConfigurableAxis binsCent{"binsCent", {VARIABLE_WIDTH, 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.}, "T0C binning"}; // Configurables Event Selection + Configurable applyWeights{"applyWeights", false, "apply particle weights?"}; Configurable isNoCollInTimeRangeStrict{"isNoCollInTimeRangeStrict", true, "isNoCollInTimeRangeStrict?"}; Configurable isNoCollInTimeRangeStandard{"isNoCollInTimeRangeStandard", false, "isNoCollInTimeRangeStandard?"}; Configurable isNoCollInRofStrict{"isNoCollInRofStrict", true, "isNoCollInRofStrict?"}; @@ -676,7 +677,11 @@ struct UccZdc { double weight{efficiency->GetBinContent(efficiency->FindBin(pt))}; if (weight > 0.) { pTs.emplace_back(pt); - wIs.emplace_back(weight); + if (applyWeights) { + wIs.emplace_back(weight); + } else { + wIs.emplace_back(1.); + } } } } @@ -787,7 +792,11 @@ struct UccZdc { double weight{efficiency->GetBinContent(efficiency->FindBin(pt))}; if (weight > 0.) { pTs.emplace_back(pt); - wIs.emplace_back(weight); + if (applyWeights) { + wIs.emplace_back(weight); + } else { + wIs.emplace_back(1.); + } } } } From d70d7e8dde8dc43644142488ff68c50b3f94a04b Mon Sep 17 00:00:00 2001 From: omvazque Date: Fri, 9 May 2025 01:18:37 -0500 Subject: [PATCH 1226/1650] [PWGLF] Introduced selection on Nch (#11138) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 41 ++++++++++++++++---- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index a9b8a49737e..3b00d47cd8b 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -46,6 +46,7 @@ #include "ReconstructionDataFormats/GlobalTrackID.h" #include "ReconstructionDataFormats/Track.h" #include "TPDGCode.h" +#include "TF1.h" using namespace std; using namespace o2; @@ -107,6 +108,7 @@ struct UccZdc { Configurable isTDCcut{"isTDCcut", false, "Use TDC cut?"}; Configurable isZEMcut{"isZEMcut", true, "Use ZEM cut?"}; + Configurable nSigmaNchCut{"nSigmaNchCut", 1., "nSigma Nch selection"}; Configurable minNchSel{"minNchSel", 5., "min Nch Selection"}; Configurable znBasedCut{"znBasedCut", 100, "ZN-based cut"}; Configurable zemCut{"zemCut", 1000., "ZEM cut"}; @@ -164,9 +166,13 @@ struct UccZdc { Service ccdb; Configurable paTH{"paTH", "Users/o/omvazque/TrackingEfficiency", "base path to the ccdb object"}; + Configurable paTHmeanNch{"paTHmeanNch", "Users/o/omvazque/FitMeanNch", "base path to the ccdb object"}; + Configurable paTHsigmaNch{"paTHsigmaNch", "Users/o/omvazque/FitSigmaNch", "base path to the ccdb object"}; // the efficiency has been previously stored in the CCDB as TH1F histogram TH1F* efficiency = nullptr; + TF1* fitSigmaNch = nullptr; + TF1* fitMeanNch = nullptr; void init(InitContext const&) { @@ -301,14 +307,16 @@ struct UccZdc { if (doprocessQA) { registry.add("T0Ccent", ";;Entries", kTH1F, {axisCent}); registry.add("EtaVsPhi", ";#eta;#varphi", kTH2F, {{{axisEta}, {100, -0.1 * PI, +2.1 * PI}}}); - registry.add("dcaXYvspTOpen", ";DCA_{xy} (cm);;", kTH2F, {{{150, -3., 3.}, {axisPt}}}); - registry.add("dcaXYvspT", ";DCA_{xy} (cm);;", kTH2F, {{{150, -3., 3.}, {axisPt}}}); + registry.add("dcaXYvspTOpen", ";DCA_{xy} (cm);;", kTH2F, {{{150, -1.5, 1.5}, {axisPt}}}); + registry.add("dcaXYvspT", ";DCA_{xy} (cm);;", kTH2F, {{{150, -1.5, 1.5}, {axisPt}}}); registry.add("nClustersITS", ";;;", kTProfile, {{axisPt}}); registry.add("nClustersTPC", ";;;", kTProfile, {{axisPt}}); registry.add("ZNVsFT0A", ";T0A (#times 1/100);ZNA+ZNC;", kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsZDC, -0.5, maxZN}}}); registry.add("ZNVsFT0C", ";T0C (#times 1/100);ZNA+ZNC;", kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsZDC, -0.5, maxZN}}}); registry.add("ZNVsFT0M", ";T0A+T0C (#times 1/100);ZNA+ZNC;", kTH2F, {{{nBinsAmpFT0, 0., 3000.}, {nBinsZDC, -0.5, maxZN}}}); + registry.add("RejectedEvtsVsFT0M", ";T0A+T0C (#times 1/100, -3.3 < #eta < -2.1 and 3.5 < #eta < 4.9);Entries;", kTH1F, {{nBinsAmpFT0, 0., 3000.}}); + registry.add("RejectedEvtsVsNch", ";#it{N}_{ch} (|#eta|<0.8);Entries;", kTH1F, {{nBinsNch, minNch, maxNch}}); registry.add("ZN", ";ZNA+ZNC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); registry.add("ZNA", ";ZNA;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); @@ -452,6 +460,18 @@ struct UccZdc { return; } + auto fitMeanNch = ccdb->getForTimeStamp(paTHmeanNch.value, foundBC.timestamp()); + if (!fitMeanNch) { + LOGF(fatal, "fitMeanNch object not found!"); + return; + } + + auto fitSigmaNch = ccdb->getForTimeStamp(paTHsigmaNch.value, foundBC.timestamp()); + if (!fitSigmaNch) { + LOGF(fatal, "fitSigmaNch object not found!"); + return; + } + // has ZDC? if (!foundBC.has_zdc()) { return; @@ -533,6 +553,7 @@ struct UccZdc { } // Track Selection if (myTrackSel.IsSelected(track)) { + registry.fill(HIST("dcaXYvspTOpen"), track.dcaXY(), track.pt()); if (passesDCAxyCut(track)) { glbTracks++; meanpt += track.pt(); @@ -541,12 +562,20 @@ struct UccZdc { registry.fill(HIST("dcaXYvspT"), track.dcaXY(), track.pt()); registry.fill(HIST("nClustersITS"), track.pt(), track.itsNCls()); registry.fill(HIST("nClustersTPC"), track.pt(), track.tpcNClsFound()); - } else { - registry.fill(HIST("dcaXYvspTOpen"), track.dcaXY(), track.pt()); } } } + const double meanNch{fitMeanNch->Eval((aT0A + aT0C) / 100.)}; + const double sigmaNch{fitSigmaNch->Eval((aT0A + aT0C) / 100.)}; + const double diffMeanNch{std::abs(meanNch - glbTracks)}; + const double nSigmaSelection{nSigmaNchCut * sigmaNch}; + if (!(diffMeanNch < nSigmaSelection)) { + registry.fill(HIST("RejectedEvtsVsFT0M"), (aT0A + aT0C) / 100.); + registry.fill(HIST("RejectedEvtsVsNch"), glbTracks); + return; + } + registry.fill(HIST("zPos"), collision.posZ()); registry.fill(HIST("T0Ccent"), collision.centFT0C()); @@ -577,10 +606,6 @@ struct UccZdc { registry.fill(HIST("ZNVsFT0C"), aT0C / 100., sumZNs); registry.fill(HIST("ZNVsFT0M"), (aT0A + aT0C) / 100., sumZNs); - if (sumZNs > znBasedCut) { - return; - } - registry.fill(HIST("NchVsFV0A"), aV0A / 100., glbTracks); registry.fill(HIST("NchVsFT0A"), aT0A / 100., glbTracks); registry.fill(HIST("NchVsFT0C"), aT0C / 100., glbTracks); From af3805e17e5523832e7f7354d336bc06aa9f483f Mon Sep 17 00:00:00 2001 From: Mattia Faggin Date: Fri, 9 May 2025 12:29:43 +0200 Subject: [PATCH 1227/1650] [PWGHF] Fill proton PID info only if necessary, to save memory. (#11141) Co-authored-by: Mattia Faggin --- PWGHF/TableProducer/candidateCreator3Prong.cxx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/PWGHF/TableProducer/candidateCreator3Prong.cxx b/PWGHF/TableProducer/candidateCreator3Prong.cxx index b5d47d2cacc..426c42c5771 100644 --- a/PWGHF/TableProducer/candidateCreator3Prong.cxx +++ b/PWGHF/TableProducer/candidateCreator3Prong.cxx @@ -219,13 +219,17 @@ struct HfCandidateCreator3Prong { { fillProngPid(track0, rowProng0PidPi); fillProngPid(track0, rowProng0PidKa); - fillProngPid(track0, rowProng0PidPr); fillProngPid(track1, rowProng1PidPi); fillProngPid(track1, rowProng1PidKa); - fillProngPid(track1, rowProng1PidPr); fillProngPid(track2, rowProng2PidPi); fillProngPid(track2, rowProng2PidKa); - fillProngPid(track2, rowProng2PidPr); + + /// fill proton PID information only if necessary + if (createLc || createXic) { + fillProngPid(track0, rowProng0PidPr); + fillProngPid(track1, rowProng1PidPr); + fillProngPid(track2, rowProng2PidPr); + } } template From 3a7f9e0b4c0cc0659aa34721d7a65d840e53b4f1 Mon Sep 17 00:00:00 2001 From: rbailhac Date: Fri, 9 May 2025 13:50:09 +0200 Subject: [PATCH 1228/1650] [PWGEM] Reject all quarkonia in the HF cocktail (#11145) --- PWGEM/Dilepton/Tasks/lmeeHFCocktail.cxx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/PWGEM/Dilepton/Tasks/lmeeHFCocktail.cxx b/PWGEM/Dilepton/Tasks/lmeeHFCocktail.cxx index 31e66671809..d3bb410813f 100644 --- a/PWGEM/Dilepton/Tasks/lmeeHFCocktail.cxx +++ b/PWGEM/Dilepton/Tasks/lmeeHFCocktail.cxx @@ -209,15 +209,14 @@ struct lmeehfcocktailprefilter { } int mother_pdg = mcParticles.iteratorAt(p.mothersIds()[0]).pdgCode(); - bool direct_charm_mother = abs(mother_pdg) < 1e+9 && (std::to_string(mother_pdg)[std::to_string(mother_pdg).length() - 3] == '4' || std::to_string(mother_pdg)[std::to_string(mother_pdg).length() - 4] == '4'); - if (abs(mother_pdg) == 443) { - direct_charm_mother = false; // we don't want JPsi here - } + // Mother is an open-charm hadon (meson or baryon) expected to decay semi-leptonicly + bool direct_charm_mother = ((std::abs(mother_pdg) >= 400) && (std::abs(mother_pdg) <= 439)) || ((std::abs(mother_pdg) >= 4000) && (std::abs(mother_pdg) <= 4399)); int cHadronId = -1; if (direct_charm_mother) { cHadronId = p.mothersIds()[0]; } - bool direct_beauty_mother = abs(mother_pdg) < 1e+9 && (std::to_string(mother_pdg)[std::to_string(mother_pdg).length() - 3] == '5' || std::to_string(mother_pdg)[std::to_string(mother_pdg).length() - 4] == '5'); + // Mother is an open-beuaty hadron (meson or baryon) expected to decay semi-leptonicly + bool direct_beauty_mother = ((std::abs(mother_pdg) >= 500) && (std::abs(mother_pdg) <= 549)) || ((std::abs(mother_pdg) >= 5000) && (std::abs(mother_pdg) <= 5499)); int bHadronId = IsFromBeauty(p, mcParticles); int bQuarkId = -1; From 8d0b3291ab19d7abf641e839ceb09c9380e3b064 Mon Sep 17 00:00:00 2001 From: Shirajum Monira <38348689+Eloviyo@users.noreply.github.com> Date: Fri, 9 May 2025 15:18:14 +0200 Subject: [PATCH 1229/1650] [PWGCF] FemtoUniverse cascade task -- refined cascade pile up check (#11136) Co-authored-by: Shirajum Monira --- ...toUniversePairTaskTrackCascadeExtended.cxx | 144 ++++++++++-------- 1 file changed, 82 insertions(+), 62 deletions(-) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx index 781ff80ef9f..0d14659f715 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx @@ -15,6 +15,7 @@ /// \author Shirajum Monira, WUT Warsaw, shirajum.monira@cern.ch #include +#include #include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" #include "Framework/HistogramRegistry.h" @@ -47,56 +48,56 @@ struct femtoUniversePairTaskTrackCascadeExtended { using FemtoRecoParticles = soa::Join; Preslice perColReco = aod::femtouniverseparticle::fdCollisionId; - ConfigurableAxis confChildTempFitVarpTBins{"ConfChildTempFitVarpTBins", {20, 0.5, 4.05}, "V0 child: pT binning of the pT vs. TempFitVar plot"}; - ConfigurableAxis confChildTempFitVarBins{"ConfChildTempFitVarBins", {300, -0.15, 0.15}, "V0 child: binning of the TempFitVar in the pT vs. TempFitVar plot"}; - Configurable confCascInvMassLowLimit{"ConfCascInvMassLowLimit", 1.315, "Lower limit of the Casc invariant mass"}; - Configurable confCascInvMassUpLimit{"ConfCascInvMassUpLimit", 1.325, "Upper limit of the Casc invariant mass"}; - Configurable confCascTranRad{"ConfCascTranRad", 0.5, "Cascade transverse radius"}; + ConfigurableAxis confChildTempFitVarpTBins{"confChildTempFitVarpTBins", {20, 0.5, 4.05}, "V0 child: pT binning of the pT vs. TempFitVar plot"}; + ConfigurableAxis confChildTempFitVarBins{"confChildTempFitVarBins", {300, -0.15, 0.15}, "V0 child: binning of the TempFitVar in the pT vs. TempFitVar plot"}; + Configurable confCascInvMassLowLimit{"confCascInvMassLowLimit", 1.315, "Lower limit of the Casc invariant mass"}; + Configurable confCascInvMassUpLimit{"confCascInvMassUpLimit", 1.325, "Upper limit of the Casc invariant mass"}; + Configurable confCascTranRad{"confCascTranRad", 0.5, "Cascade transverse radius"}; - Configurable confNSigmaTPCPion{"NSigmaTPCPion", 4, "NSigmaTPCPion"}; - Configurable confNSigmaTPCProton{"NSigmaTPCProton", 4, "NSigmaTPCProton"}; + Configurable confNSigmaTPCPion{"confNSigmaTPCPion", 4, "NSigmaTPCPion"}; + Configurable confNSigmaTPCProton{"confNSigmaTPCProton", 4, "NSigmaTPCProton"}; /// applying narrow cut - Configurable confZVertexCut{"ConfZVertexCut", 10.f, "Event sel: Maximum z-Vertex (cm)"}; - Configurable confEta{"ConfEta", 0.8, "Eta cut for the global track"}; + Configurable confZVertexCut{"confZVertexCut", 10.f, "Event sel: Maximum z-Vertex (cm)"}; + Configurable confEta{"confEta", 0.8, "Eta cut for the global track"}; // configurations for correlation part - Configurable confTrackChoicePartOne{"ConfTrackChoicePartOne", 0, "0:Proton, 1:Pion, 2:Kaon"}; - Configurable confTrkPDGCodePartOne{"ConfTrkPDGCodePartOne", 2212, "Particle 1 (Track) - PDG code"}; - Configurable confCascType1{"ConfCascType1", 0, "select one of the V0s (Omega = 0, Xi = 1, anti-Omega = 2, anti-Xi = 3) for track-cascade combination"}; - Configurable confCascType2{"ConfCascType2", 0, "select one of the V0s (Omega = 0, Xi = 1, anti-Omega = 2, anti-Xi = 3) for cascade-cascade combination"}; - Configurable confIsCPR{"ConfIsCPR", false, "Close Pair Rejection"}; - Configurable confCPRdeltaPhiCutMax{"ConfCPRdeltaPhiCutMax", 0.0, "Delta Phi max cut for Close Pair Rejection"}; - Configurable confCPRdeltaPhiCutMin{"ConfCPRdeltaPhiCutMin", 0.0, "Delta Phi min cut for Close Pair Rejection"}; - Configurable confCPRdeltaEtaCutMax{"ConfCPRdeltaEtaCutMax", 0.0, "Delta Eta max cut for Close Pair Rejection"}; - Configurable confCPRdeltaEtaCutMin{"ConfCPRdeltaEtaCutMin", 0.0, "Delta Eta min cut for Close Pair Rejection"}; - Configurable confCPRPlotPerRadii{"ConfCPRPlotPerRadii", false, "Plot CPR per radii"}; - Configurable confCPRChosenRadii{"ConfCPRChosenRadii", 0.0, "Delta Eta cut for Close Pair Rejection"}; - Configurable confChargePart1{"ConfChargePart1", 1, "sign of particle 1"}; - Configurable confHPtPart1{"ConfHPtPart1", 4.0f, "higher limit for pt of particle 1"}; - Configurable confLPtPart1{"ConfLPtPart1", 0.5f, "lower limit for pt of particle 1"}; - Configurable confHPtPart2{"ConfHPtPart2", 4.0f, "higher limit for pt of particle 2"}; - Configurable confLPtPart2{"ConfLPtPart2", 0.3f, "lower limit for pt of particle 2"}; - Configurable confmom{"Confmom", 0.75, "momentum threshold for particle identification using TOF"}; - Configurable confNsigmaTPCParticle{"ConfNsigmaTPCParticle", 3.0, "TPC Sigma for particle (track) momentum < Confmom"}; - Configurable confNsigmaCombinedParticle{"ConfNsigmaCombinedParticle", 3.0, "TPC and TOF Sigma (combined) for particle (track) momentum > Confmom"}; - Configurable confNsigmaTPCParticleChild{"ConfNsigmaTPCParticleChild", 3.0, "TPC Sigma for particle (daugh & bach) momentum < Confmom"}; - Configurable confNsigmaTOFParticleChild{"ConfNsigmaTOFParticleChild", 3.0, "TOF Sigma for particle (daugh & bach) momentum > Confmom"}; - - ConfigurableAxis confkstarBins{"ConfkstarBins", {1500, 0., 6.}, "binning kstar"}; - ConfigurableAxis confMultBins{"ConfMultBins", {VARIABLE_WIDTH, 0.0f, 20.0f, 40.0f, 60.0f, 80.0f, 100.0f, 200.0f, 99999.f}, "Mixing bins - multiplicity"}; - ConfigurableAxis confkTBins{"ConfkTBins", {150, 0., 9.}, "binning kT"}; - ConfigurableAxis confmTBins{"ConfmTBins", {225, 0., 7.5}, "binning mT"}; - ConfigurableAxis confmultBins3D{"ConfMultBins3D", {VARIABLE_WIDTH, 0.0f, 20.0f, 30.0f, 40.0f, 99999.0f}, "multiplicity Binning for the 3Dimensional plot: k* vs multiplicity vs mT (set <> to true in order to use)"}; - ConfigurableAxis confmTBins3D{"ConfmTBins3D", {VARIABLE_WIDTH, 1.02f, 1.14f, 1.20f, 1.26f, 1.38f, 1.56f, 1.86f, 4.50f}, "mT Binning for the 3Dimensional plot: k* vs multiplicity vs mT (set <> to true in order to use)"}; - Configurable confEtaBins{"ConfEtaBins", 29, "Number of eta bins in deta dphi"}; - Configurable confPhiBins{"ConfPhiBins", 29, "Number of phi bins in deta dphi"}; - Configurable confIsMC{"ConfIsMC", false, "Enable additional Histograms in the case of a MonteCarlo Run"}; - Configurable confUse3D{"ConfUse3D", false, "Enable three dimensional histogramms (to be used only for analysis with high statistics): k* vs mT vs multiplicity"}; + Configurable confTrackChoicePartOne{"confTrackChoicePartOne", 0, "0:Proton, 1:Pion, 2:Kaon"}; + Configurable confTrkPDGCodePartOne{"confTrkPDGCodePartOne", 2212, "Particle 1 (Track) - PDG code"}; + Configurable confCascType1{"confCascType1", 0, "select one of the V0s (Omega = 0, Xi = 1, anti-Omega = 2, anti-Xi = 3) for track-cascade combination"}; + Configurable confCascType2{"confCascType2", 0, "select one of the V0s (Omega = 0, Xi = 1, anti-Omega = 2, anti-Xi = 3) for cascade-cascade combination"}; + Configurable confIsCPR{"confIsCPR", false, "Close Pair Rejection"}; + Configurable confCPRdeltaPhiCutMax{"confCPRdeltaPhiCutMax", 0.0, "Delta Phi max cut for Close Pair Rejection"}; + Configurable confCPRdeltaPhiCutMin{"confCPRdeltaPhiCutMin", 0.0, "Delta Phi min cut for Close Pair Rejection"}; + Configurable confCPRdeltaEtaCutMax{"confCPRdeltaEtaCutMax", 0.0, "Delta Eta max cut for Close Pair Rejection"}; + Configurable confCPRdeltaEtaCutMin{"confCPRdeltaEtaCutMin", 0.0, "Delta Eta min cut for Close Pair Rejection"}; + Configurable confCPRPlotPerRadii{"confCPRPlotPerRadii", false, "Plot CPR per radii"}; + Configurable confCPRChosenRadii{"confCPRChosenRadii", 0.0, "Delta Eta cut for Close Pair Rejection"}; + Configurable confChargePart1{"confChargePart1", 1, "sign of particle 1"}; + Configurable confHPtPart1{"confHPtPart1", 4.0f, "higher limit for pt of particle 1"}; + Configurable confLPtPart1{"confLPtPart1", 0.5f, "lower limit for pt of particle 1"}; + Configurable confHPtPart2{"confHPtPart2", 4.0f, "higher limit for pt of particle 2"}; + Configurable confLPtPart2{"confLPtPart2", 0.3f, "lower limit for pt of particle 2"}; + Configurable confmom{"confmom", 0.75, "momentum threshold for particle identification using TOF"}; + Configurable confNsigmaTPCParticle{"confNsigmaTPCParticle", 3.0, "TPC Sigma for particle (track) momentum < Confmom"}; + Configurable confNsigmaCombinedParticle{"confNsigmaCombinedParticle", 3.0, "TPC and TOF Sigma (combined) for particle (track) momentum > Confmom"}; + Configurable confNsigmaTPCParticleChild{"confNsigmaTPCParticleChild", 3.0, "TPC Sigma for particle (daugh & bach) momentum < Confmom"}; + Configurable confNsigmaTOFParticleChild{"confNsigmaTOFParticleChild", 3.0, "TOF Sigma for particle (daugh & bach) momentum > Confmom"}; + + ConfigurableAxis confkstarBins{"confkstarBins", {1500, 0., 6.}, "binning kstar"}; + ConfigurableAxis confMultBins{"confMultBins", {VARIABLE_WIDTH, 0.0f, 20.0f, 40.0f, 60.0f, 80.0f, 100.0f, 200.0f, 99999.f}, "Mixing bins - multiplicity"}; + ConfigurableAxis confkTBins{"confkTBins", {150, 0., 9.}, "binning kT"}; + ConfigurableAxis confmTBins{"confmTBins", {225, 0., 7.5}, "binning mT"}; + ConfigurableAxis confMultBins3D{"confMultBins3D", {VARIABLE_WIDTH, 0.0f, 20.0f, 30.0f, 40.0f, 99999.0f}, "multiplicity Binning for the 3Dimensional plot: k* vs multiplicity vs mT (set <> to true in order to use)"}; + ConfigurableAxis confmTBins3D{"confmTBins3D", {VARIABLE_WIDTH, 1.02f, 1.14f, 1.20f, 1.26f, 1.38f, 1.56f, 1.86f, 4.50f}, "mT Binning for the 3Dimensional plot: k* vs multiplicity vs mT (set <> to true in order to use)"}; + Configurable confEtaBins{"confEtaBins", 29, "Number of eta bins in deta dphi"}; + Configurable confPhiBins{"confPhiBins", 29, "Number of phi bins in deta dphi"}; + Configurable confIsMC{"confIsMC", false, "Enable additional Histograms in the case of a MonteCarlo Run"}; + Configurable confUse3D{"confUse3D", false, "Enable three dimensional histogramms (to be used only for analysis with high statistics): k* vs mT vs multiplicity"}; Configurable confUseCent{"confUseCent", false, "Use centrality in place of multiplicity"}; - ConfigurableAxis confVtxBins{"ConfVtxBins", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; - ConfigurableAxis confTrkTempFitVarpTBins{"ConfTrkTempFitVarpTBins", {20, 0.5, 4.05}, "pT binning of the pT vs. TempFitVar plot"}; - ConfigurableAxis confTrkTempFitVarBins{"ConfTrkDTempFitVarBins", {300, -0.15, 0.15}, "binning of the TempFitVar in the pT vs. TempFitVar plot"}; + ConfigurableAxis confVtxBins{"confVtxBins", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; + ConfigurableAxis confTrkTempFitVarpTBins{"confTrkTempFitVarpTBins", {20, 0.5, 4.05}, "pT binning of the pT vs. TempFitVar plot"}; + ConfigurableAxis confTrkTempFitVarBins{"confTrkTempFitVarBins", {300, -0.15, 0.15}, "binning of the TempFitVar in the pT vs. TempFitVar plot"}; Filter collisionFilter = (nabs(aod::collision::posZ) < confZVertexCut); using FilteredFDCollisions = soa::Filtered; @@ -140,16 +141,15 @@ struct femtoUniversePairTaskTrackCascadeExtended { HistogramRegistry registryMCgen{"MCgenHistos", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; HistogramRegistry registryMCreco{"MCrecoHistos", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; + std::set cascDuplicates; + // Table to select cascade daughters // Charges: = +--, +--, +-+, +-+ static constexpr unsigned int CascChildTable[][3] = {{0, 1, 2}, {0, 1, 1}, {1, 0, 2}, {1, 0, 1}}; - bool invMCascade(float invMassCascade, float invMassAntiCascade) + bool invMCascade(float invMassXi, float invMassOmega, int cascType) { - if ((invMassCascade < confCascInvMassLowLimit || invMassCascade > confCascInvMassUpLimit) && (invMassAntiCascade < confCascInvMassLowLimit || invMassAntiCascade > confCascInvMassUpLimit)) { - return false; - } - return true; + return (((cascType == 1 || cascType == 3) && (invMassXi > confCascInvMassLowLimit && invMassXi < confCascInvMassUpLimit)) || ((cascType == 0 || cascType == 2) && (invMassOmega > confCascInvMassLowLimit && invMassOmega < confCascInvMassUpLimit))); } bool isNSigmaTPC(float nsigmaTPCParticle) @@ -278,8 +278,8 @@ struct femtoUniversePairTaskTrackCascadeExtended { bachHistos.init(&qaRegistry, confChildTempFitVarpTBins, confChildTempFitVarBins, false, 0, true, "hBachelor"); cascQAHistos.init(&qaRegistry, confChildTempFitVarpTBins, confChildTempFitVarBins, false, 0, true); - sameEventCont.init(&resultRegistry, confkstarBins, confMultBins, confkTBins, confmTBins, confmultBins3D, confmTBins3D, confEtaBins, confPhiBins, confIsMC, confUse3D); - mixedEventCont.init(&resultRegistry, confkstarBins, confMultBins, confkTBins, confmTBins, confmultBins3D, confmTBins3D, confEtaBins, confPhiBins, confIsMC, confUse3D); + sameEventCont.init(&resultRegistry, confkstarBins, confMultBins, confkTBins, confmTBins, confMultBins3D, confmTBins3D, confEtaBins, confPhiBins, confIsMC, confUse3D); + mixedEventCont.init(&resultRegistry, confkstarBins, confMultBins, confkTBins, confmTBins, confMultBins3D, confmTBins3D, confEtaBins, confPhiBins, confIsMC, confUse3D); pairCleaner.init(&qaRegistry); if (confIsCPR.value) { pairCloseRejection.init(&resultRegistry, &qaRegistry, confCPRdeltaPhiCutMin.value, confCPRdeltaPhiCutMax.value, confCPRdeltaEtaCutMin.value, confCPRdeltaEtaCutMax.value, confCPRChosenRadii.value, confCPRPlotPerRadii.value); @@ -359,7 +359,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { const int multCol = confUseCent ? col.multV0M() : col.multNtr(); for (const auto& part : groupPartsTwo) { - if (!invMCascade(part.mLambda(), part.mAntiLambda())) + if (!invMCascade(part.mLambda(), part.mAntiLambda(), confCascType1)) continue; cascQAHistos.fillQA(part); @@ -400,7 +400,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { for (const auto& [p1, p2] : combinations(CombinationsFullIndexPolicy(groupPartsOne, groupPartsTwo))) { // Cascade invariant mass cut - if (!invMCascade(p2.mLambda(), p2.mAntiLambda())) + if (!invMCascade(p2.mLambda(), p2.mAntiLambda(), confCascType1)) continue; // PID if (!isParticleCombined(p1, confTrackChoicePartOne)) @@ -434,7 +434,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { const int multCol = confUseCent ? col.multV0M() : col.multNtr(); for (const auto& part : groupPartsTwo) { - if (!invMCascade(part.mLambda(), part.mAntiLambda())) + if (!invMCascade(part.mLambda(), part.mAntiLambda(), confCascType1)) continue; cascQAHistos.fillQA(part); @@ -454,17 +454,30 @@ struct femtoUniversePairTaskTrackCascadeExtended { }*/ } - auto pairProcessFunc = [&](auto& p1, auto& p2) -> void { + auto pairDuplicateCheckFunc = [&](auto& p1, auto& p2) -> void { // Cascade invariant mass cut for p1 - if (!invMCascade(p1.mLambda(), p1.mAntiLambda())) + if (!invMCascade(p1.mLambda(), p1.mAntiLambda(), confCascType1)) return; // Cascade invariant mass cut for p2 - if (!invMCascade(p2.mLambda(), p2.mAntiLambda())) + if (!invMCascade(p2.mLambda(), p2.mAntiLambda(), confCascType2)) return; - // track cleaning + // track cleaning & checking for duplicate pairs if (!pairCleanerCasc.isCleanPair(p1, p2, parts)) { - return; + // mark for rejection the cascades that share a daughter with other cascades + cascDuplicates.insert(p1.globalIndex()); + cascDuplicates.insert(p2.globalIndex()); } + }; + + auto pairProcessFunc = [&](auto& p1, auto& p2) -> void { + if (cascDuplicates.contains(p1.globalIndex()) || cascDuplicates.contains(p2.globalIndex())) + return; + // Cascade invariant mass cut for p1 + if (!invMCascade(p1.mLambda(), p1.mAntiLambda(), confCascType1)) + return; + // Cascade invariant mass cut for p2 + if (!invMCascade(p2.mLambda(), p2.mAntiLambda(), confCascType2)) + return; if (confIsCPR.value) { if (pairCloseRejection.isClosePair(p1, p2, parts, magFieldTesla, femto_universe_container::EventType::same)) { return; @@ -485,12 +498,19 @@ struct femtoUniversePairTaskTrackCascadeExtended { sameEventCont.setPair(p1, p2, multCol, confUse3D, 1.0f); }; + cascDuplicates.clear(); if (confCascType1 == confCascType2) { + for (const auto& [p1, p2] : combinations(CombinationsStrictlyUpperIndexPolicy(groupPartsTwo, groupPartsTwo))) { + pairDuplicateCheckFunc(p1, p2); + } /// Now build the combinations for identical cascades for (const auto& [p1, p2] : combinations(CombinationsStrictlyUpperIndexPolicy(groupPartsTwo, groupPartsTwo))) { pairProcessFunc(p1, p2); } } else { + for (const auto& [p1, p2] : combinations(CombinationsFullIndexPolicy(groupPartsTwo, groupPartsTwo))) { + pairDuplicateCheckFunc(p1, p2); + } /// Now build the combinations for non-identical cascades for (const auto& [p1, p2] : combinations(CombinationsFullIndexPolicy(groupPartsTwo, groupPartsTwo))) { pairProcessFunc(p1, p2); @@ -517,7 +537,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { } for (const auto& [p1, p2] : combinations(CombinationsFullIndexPolicy(groupPartsOne, groupPartsTwo))) { // Cascade invariant mass cut - if (!invMCascade(p2.mLambda(), p2.mAntiLambda())) + if (!invMCascade(p2.mLambda(), p2.mAntiLambda(), confCascType1)) continue; // PID if (!isParticleCombined(p1, confTrackChoicePartOne)) @@ -561,10 +581,10 @@ struct femtoUniversePairTaskTrackCascadeExtended { } for (const auto& [p1, p2] : combinations(CombinationsFullIndexPolicy(groupPartsOne, groupPartsTwo))) { // Cascade invariant mass cut for p1 - if (!invMCascade(p1.mLambda(), p1.mAntiLambda())) + if (!invMCascade(p1.mLambda(), p1.mAntiLambda(), confCascType1)) continue; // Cascade invariant mass cut for p2 - if (!invMCascade(p2.mLambda(), p2.mAntiLambda())) + if (!invMCascade(p2.mLambda(), p2.mAntiLambda(), confCascType2)) continue; const auto& posChild1 = parts.iteratorAt(p1.index() - 3); From 37826b53fec0c5375df3326a8015ca968a9c8999 Mon Sep 17 00:00:00 2001 From: yuanzhe <90246048+wang-yuanzhe@users.noreply.github.com> Date: Fri, 9 May 2025 15:29:31 +0200 Subject: [PATCH 1230/1650] [PWGLF] Add kink reconstruction of hyperhelium4sigma (#11128) --- PWGLF/TableProducer/Common/kinkBuilder.cxx | 63 ++++++-- .../Nuspex/hyperhelium4sigmaAnalysis.cxx | 139 ++++++++++++------ 2 files changed, 142 insertions(+), 60 deletions(-) diff --git a/PWGLF/TableProducer/Common/kinkBuilder.cxx b/PWGLF/TableProducer/Common/kinkBuilder.cxx index fde62514a60..8d88c70a746 100644 --- a/PWGLF/TableProducer/Common/kinkBuilder.cxx +++ b/PWGLF/TableProducer/Common/kinkBuilder.cxx @@ -56,7 +56,7 @@ std::shared_ptr h2ClsMapPtMoth; std::shared_ptr h2ClsMapPtDaug; std::shared_ptr h2DeDxDaugSel; std::shared_ptr h2KinkAnglePt; -std::shared_ptr h2SigmaMinusMassPt; +std::shared_ptr h2MothMassPt; } // namespace struct kinkCandidate { @@ -89,9 +89,13 @@ struct kinkCandidate { struct kinkBuilder { + enum PartType { kSigmaMinus = 0, + kHyperhelium4sigma }; + Produces outputDataTable; Service ccdb; + Configurable hypoMoth{"hypoMoth", kSigmaMinus, "Mother particle hypothesis"}; // Selection criteria Configurable maxDCAMothToPV{"maxDCAMothToPV", 0.1, "Max DCA of the mother to the PV"}; Configurable minDCADaugToPV{"minDCADaugToPV", 0., "Min DCA of the daughter to the PV"}; @@ -107,7 +111,7 @@ struct kinkBuilder { o2::base::MatLayerCylSet* lut = nullptr; // constants - float radToDeg = 180. / M_PI; + float radToDeg = o2::constants::math::Rad2Deg; svPoolCreator svCreator; // bethe bloch parameters @@ -141,8 +145,25 @@ struct kinkBuilder { float mBz; std::array mBBparamsDaug; + // mother and daughter tracks' properties (absolute charge and mass) + int charge = 1; + float mothMass = o2::constants::physics::MassSigmaMinus; + float chargedDauMass = o2::constants::physics::MassPiMinus; + float neutDauMass = o2::constants::physics::MassNeutron; + void init(InitContext const&) { + if (hypoMoth == kSigmaMinus) { + charge = 1; + mothMass = o2::constants::physics::MassSigmaMinus; + chargedDauMass = o2::constants::physics::MassPiMinus; + neutDauMass = o2::constants::physics::MassNeutron; + } else if (hypoMoth == kHyperhelium4sigma) { + charge = 2; + mothMass = o2::constants::physics::MassHyperHelium4; + chargedDauMass = o2::constants::physics::MassAlpha; + neutDauMass = o2::constants::physics::MassPi0; + } // dummy values, 1 for mother, 0 for daughter svCreator.setPDGs(1, 0); @@ -174,13 +195,19 @@ struct kinkBuilder { const AxisSpec itsClusterMapAxis(128, 0, 127, "ITS cluster map"); const AxisSpec rigidityAxis{rigidityBins, "#it{p}^{TPC}/#it{z}"}; const AxisSpec ptAxis{rigidityBins, "#it{p}_{T} (GeV/#it{c})"}; - const AxisSpec sigmaMassAxis{100, 1.1, 1.4, "m (GeV/#it{c}^{2})"}; const AxisSpec kinkAngleAxis{100, 0, 180, "#theta_{kink} (deg)"}; const AxisSpec dedxAxis{dedxBins, "d#it{E}/d#it{x}"}; + AxisSpec massAxis(100, 1.1, 1.4, "m (GeV/#it{c}^{2})"); + if (hypoMoth == kSigmaMinus) { + massAxis = AxisSpec{100, 1.1, 1.4, "m (GeV/#it{c}^{2})"}; + } else if (hypoMoth == kHyperhelium4sigma) { + massAxis = AxisSpec{100, 3.85, 4.25, "m (GeV/#it{c}^{2})"}; + } + h2DeDxDaugSel = qaRegistry.add("h2DeDxDaugSel", ";p_{TPC}/z (GeV/#it{c}); dE/dx", HistType::kTH2F, {rigidityAxis, dedxAxis}); h2KinkAnglePt = qaRegistry.add("h2KinkAnglePt", "; p_{T} (GeV/#it{c}); #theta_{kink} (deg)", HistType::kTH2F, {ptAxis, kinkAngleAxis}); - h2SigmaMinusMassPt = qaRegistry.add("h2SigmaMinusMassPt", "; p_{T} (GeV/#it{c}); m (GeV/#it{c}^{2})", HistType::kTH2F, {ptAxis, sigmaMassAxis}); + h2MothMassPt = qaRegistry.add("h2MothMassPt", "; p_{T} (GeV/#it{c}); m (GeV/#it{c}^{2})", HistType::kTH2F, {ptAxis, massAxis}); h2ClsMapPtMoth = qaRegistry.add("h2ClsMapPtMoth", "; p_{T} (GeV/#it{c}); ITS cluster map", HistType::kTH2F, {ptAxis, itsClusterMapAxis}); h2ClsMapPtDaug = qaRegistry.add("h2ClsMapPtDaug", "; p_{T} (GeV/#it{c}); ITS cluster map", HistType::kTH2F, {ptAxis, itsClusterMapAxis}); } @@ -225,7 +252,7 @@ struct kinkBuilder { svCreator.clearPools(); svCreator.fillBC2Coll(collisions, bcs); - for (auto& track : tracks) { + for (const auto& track : tracks) { if (std::abs(track.eta()) > etaMax) continue; @@ -240,7 +267,7 @@ struct kinkBuilder { } auto& kinkPool = svCreator.getSVCandPool(collisions, !unlikeSignBkg); - for (auto& svCand : kinkPool) { + for (const auto& svCand : kinkPool) { kinkCandidate kinkCand; auto trackMoth = tracks.rawIteratorAt(svCand.tr0Idx); @@ -338,8 +365,12 @@ struct kinkBuilder { propMothTrack.getPxPyPzGlo(kinkCand.momMoth); propDaugTrack.getPxPyPzGlo(kinkCand.momDaug); - float pMoth = propMothTrack.getP(); - float pDaug = propDaugTrack.getP(); + for (int i = 0; i < 3; i++) { + kinkCand.momMoth[i] *= charge; + kinkCand.momDaug[i] *= charge; + } + float pMoth = propMothTrack.getP() * charge; + float pDaug = propDaugTrack.getP() * charge; float spKink = kinkCand.momMoth[0] * kinkCand.momDaug[0] + kinkCand.momMoth[1] * kinkCand.momDaug[1] + kinkCand.momMoth[2] * kinkCand.momDaug[2]; kinkCand.kinkAngle = std::acos(spKink / (pMoth * pDaug)); @@ -348,15 +379,15 @@ struct kinkBuilder { neutDauMom[i] = kinkCand.momMoth[i] - kinkCand.momDaug[i]; } - float piMinusE = std::sqrt(neutDauMom[0] * neutDauMom[0] + neutDauMom[1] * neutDauMom[1] + neutDauMom[2] * neutDauMom[2] + 0.13957 * 0.13957); - float neutronE = std::sqrt(pDaug * pDaug + 0.93957 * 0.93957); - float invMass = std::sqrt((piMinusE + neutronE) * (piMinusE + neutronE) - (pMoth * pMoth)); + float chargedDauE = std::sqrt(pDaug * pDaug + chargedDauMass * chargedDauMass); + float neutE = std::sqrt(neutDauMom[0] * neutDauMom[0] + neutDauMom[1] * neutDauMom[1] + neutDauMom[2] * neutDauMom[2] + neutDauMass * neutDauMass); + float invMass = std::sqrt((chargedDauE + neutE) * (chargedDauE + neutE) - (pMoth * pMoth)); h2DeDxDaugSel->Fill(trackDaug.tpcInnerParam() * trackDaug.sign(), trackDaug.tpcSignal()); - h2KinkAnglePt->Fill(trackMoth.pt() * trackMoth.sign(), kinkCand.kinkAngle * radToDeg); - h2SigmaMinusMassPt->Fill(trackMoth.pt() * trackMoth.sign(), invMass); - h2ClsMapPtMoth->Fill(trackMoth.pt() * trackMoth.sign(), trackMoth.itsClusterMap()); - h2ClsMapPtDaug->Fill(trackDaug.pt() * trackDaug.sign(), trackDaug.itsClusterMap()); + h2KinkAnglePt->Fill(trackMoth.pt() * charge * trackMoth.sign(), kinkCand.kinkAngle * radToDeg); + h2MothMassPt->Fill(trackMoth.pt() * charge * trackMoth.sign(), invMass); + h2ClsMapPtMoth->Fill(trackMoth.pt() * charge * trackMoth.sign(), trackMoth.itsClusterMap()); + h2ClsMapPtDaug->Fill(trackDaug.pt() * charge * trackDaug.sign(), trackDaug.itsClusterMap()); kinkCand.collisionID = collision.globalIndex(); kinkCand.mothTrackID = trackMoth.globalIndex(); @@ -423,7 +454,7 @@ struct kinkBuilder { // sort kinkCandidates by collisionID to allow joining with collision table std::sort(kinkCandidates.begin(), kinkCandidates.end(), [](const kinkCandidate& a, const kinkCandidate& b) { return a.collisionID < b.collisionID; }); - for (auto& kinkCand : kinkCandidates) { + for (const auto& kinkCand : kinkCandidates) { outputDataTable(kinkCand.collisionID, kinkCand.mothTrackID, kinkCand.daugTrackID, kinkCand.decVtx[0], kinkCand.decVtx[1], kinkCand.decVtx[2], kinkCand.mothSign, kinkCand.momMoth[0], kinkCand.momMoth[1], kinkCand.momMoth[2], diff --git a/PWGLF/Tasks/Nuspex/hyperhelium4sigmaAnalysis.cxx b/PWGLF/Tasks/Nuspex/hyperhelium4sigmaAnalysis.cxx index e60773cfbc8..bdbb7c5911b 100644 --- a/PWGLF/Tasks/Nuspex/hyperhelium4sigmaAnalysis.cxx +++ b/PWGLF/Tasks/Nuspex/hyperhelium4sigmaAnalysis.cxx @@ -24,11 +24,13 @@ #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/PIDResponse.h" #include "CommonConstants/PhysicsConstants.h" +#include "PWGLF/DataModel/LFKinkDecayTables.h" using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; -using std::array; + +using CollisionsFull = soa::Join; using FullTracksExtIU = soa::Join; using MCLabeledTracksIU = soa::Join; @@ -97,17 +99,52 @@ Channel getDecayChannelH4S(TMCParticle const& particle) return kNDecayChannel; } //-------------------------------------------------------------- +struct Hyperhelium4sigmaAnalysis { + // Histograms are defined with HistogramRegistry + HistogramRegistry registry{"registry", {}}; + + // Configurable for event selection + Configurable cutzvertex{"cutzvertex", 10.0f, "Accepted z-vertex range (cm)"}; + Configurable cutNSigmaAl{"cutNSigmaAl", 5, "NSigmaTPCAlpha"}; + + void init(InitContext const&) + { + // Axes + const AxisSpec vertexZAxis{100, -15., 15., "vrtx_{Z} [cm]"}; + const AxisSpec ptAxis{50, -10, 10, "#it{p}_{T} (GeV/#it{c})"}; + const AxisSpec nSigmaAxis{120, -6.f, 6.f, "n#sigma_{#alpha}"}; + const AxisSpec massAxis{100, 3.85, 4.25, "m (GeV/#it{c}^{2})"}; + + registry.add("hVertexZRec", "hVertexZRec", {HistType::kTH1F, {vertexZAxis}}); + registry.add("h2MassHyperhelium4sigmaPt", "h2MassHyperhelium4sigmaPt", {HistType::kTH2F, {ptAxis, massAxis}}); + registry.add("h2NSigmaAlPt", "h2NSigmaAlPt", {HistType::kTH2F, {ptAxis, nSigmaAxis}}); + } + + void process(soa::Join::iterator const& collision, + aod::KinkCands const& KinkCands, FullTracksExtIU const&) + { + if (std::abs(collision.posZ()) > cutzvertex || !collision.sel8()) { + return; + } + registry.fill(HIST("hVertexZRec"), collision.posZ()); + for (const auto& kinkCand : KinkCands) { + auto dauTrack = kinkCand.trackDaug_as(); + if (std::abs(dauTrack.tpcNSigmaAl()) > cutNSigmaAl) { + continue; + } + float invMass = RecoDecay::m(std::array{std::array{kinkCand.pxDaug(), kinkCand.pyDaug(), kinkCand.pzDaug()}, std::array{kinkCand.pxDaugNeut(), kinkCand.pyDaugNeut(), kinkCand.pzDaugNeut()}}, std::array{o2::constants::physics::MassAlpha, o2::constants::physics::MassPi0}); + registry.fill(HIST("h2MassHyperhelium4sigmaPt"), kinkCand.mothSign() * kinkCand.ptMoth(), invMass); + registry.fill(HIST("h2NSigmaAlPt"), kinkCand.mothSign() * kinkCand.ptDaug(), dauTrack.tpcNSigmaAl()); + } + } +}; + +//-------------------------------------------------------------- // check the performance of mcparticle -struct Hyperhelium4sigmaAnalysis { +struct Hyperhelium4sigmaQa { // Basic checks - HistogramRegistry registry{ - "registry", - { - {"hCollCounter", "hCollCounter", {HistType::kTH1F, {{2, 0.0f, 2.0f}}}}, - {"hMcCollCounter", "hMcCollCounter", {HistType::kTH1F, {{2, 0.0f, 2.0f}}}}, - }, - }; + HistogramRegistry registry{"registry", {}}; ConfigurableAxis ptBins{"ptBins", {200, 0.f, 10.f}, "Binning for #it{p}_{T} (GeV/#it{c})"}; ConfigurableAxis ctBins{"ctBins", {100, 0.f, 25.f}, "Binning for c#it{t} (cm)"}; @@ -117,40 +154,45 @@ struct Hyperhelium4sigmaAnalysis { void init(InitContext&) { - const AxisSpec ptAxis{ptBins, "#it{p}_{T} (GeV/#it{c})"}; - const AxisSpec ctAxis{ctBins, "c#it{t} (cm)"}; - const AxisSpec rigidityAxis{rigidityBins, "p/z (GeV/#it{c})"}; - const AxisSpec nsigmaAxis{nsigmaBins, "TPC n#sigma"}; - const AxisSpec invMassAxis{invMassBins, "Inv Mass (GeV/#it{c}^{2})"}; - - registry.get(HIST("hCollCounter"))->GetXaxis()->SetBinLabel(1, "Reconstructed Collisions"); - registry.get(HIST("hCollCounter"))->GetXaxis()->SetBinLabel(2, "Selected"); - registry.get(HIST("hMcCollCounter"))->GetXaxis()->SetBinLabel(1, "MC Collisions"); - registry.get(HIST("hMcCollCounter"))->GetXaxis()->SetBinLabel(2, "Reconstructed"); - - auto hGenHyperHelium4SigmaCounter = registry.add("hGenHyperHelium4SigmaCounter", "", HistType::kTH1F, {{10, 0.f, 10.f}}); - registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(1, "H4S All"); - registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(2, "Matter"); - registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(3, "AntiMatter"); - registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(4, "#alpha + #pi^{0}"); - registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(5, "#bar{#alpha} + #pi^{0}"); - registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(6, "t + p + #pi^{0}"); - registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(7, "#bar{t} + #bar{p} + #pi^{0}"); - registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(8, "t + n + #pi^{+}"); - registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(9, "#bar{t} + #bar{n} + #pi^{+}"); - registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(10, "Unexpected"); - - auto hEvtSelectedHyperHelium4SigmaCounter = registry.add("hEvtSelectedHyperHelium4SigmaCounter", "", HistType::kTH1F, {{2, 0.f, 2.f}}); - registry.get(HIST("hEvtSelectedHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(1, "Generated"); - registry.get(HIST("hEvtSelectedHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(2, "Survived"); - - registry.add("hGenHyperHelium4SigmaPt", "", HistType::kTH1F, {ptAxis}); - registry.add("hGenHyperHelium4SigmaCt", "", HistType::kTH1F, {ctAxis}); - registry.add("hMcRecoInvMass", "", HistType::kTH1F, {invMassAxis}); - - registry.add("hDauHelium4TPCNSigma", "", HistType::kTH2F, {rigidityAxis, nsigmaAxis}); - registry.add("hDauTritonTPCNSigma", "", HistType::kTH2F, {rigidityAxis, nsigmaAxis}); - registry.add("hDauProtonTPCNSigma", "", HistType::kTH2F, {rigidityAxis, nsigmaAxis}); + if (doprocessMC == true) { + const AxisSpec ptAxis{ptBins, "#it{p}_{T} (GeV/#it{c})"}; + const AxisSpec ctAxis{ctBins, "c#it{t} (cm)"}; + const AxisSpec rigidityAxis{rigidityBins, "p/z (GeV/#it{c})"}; + const AxisSpec nsigmaAxis{nsigmaBins, "TPC n#sigma"}; + const AxisSpec invMassAxis{invMassBins, "Inv Mass (GeV/#it{c}^{2})"}; + + auto hCollCounter = registry.add("hCollCounter", "hCollCounter", HistType::kTH1F, {{2, 0.0f, 2.0f}}); + registry.get(HIST("hCollCounter"))->GetXaxis()->SetBinLabel(1, "Reconstructed Collisions"); + registry.get(HIST("hCollCounter"))->GetXaxis()->SetBinLabel(2, "Selected"); + auto hMcCollCounter = registry.add("hMcCollCounter", "hMcCollCounter", HistType::kTH1F, {{2, 0.0f, 2.0f}}); + registry.get(HIST("hMcCollCounter"))->GetXaxis()->SetBinLabel(1, "MC Collisions"); + registry.get(HIST("hMcCollCounter"))->GetXaxis()->SetBinLabel(2, "Reconstructed"); + + auto hGenHyperHelium4SigmaCounter = registry.add("hGenHyperHelium4SigmaCounter", "", HistType::kTH1F, {{10, 0.f, 10.f}}); + registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(1, "H4S All"); + registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(2, "Matter"); + registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(3, "AntiMatter"); + registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(4, "#alpha + #pi^{0}"); + registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(5, "#bar{#alpha} + #pi^{0}"); + registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(6, "t + p + #pi^{0}"); + registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(7, "#bar{t} + #bar{p} + #pi^{0}"); + registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(8, "t + n + #pi^{+}"); + registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(9, "#bar{t} + #bar{n} + #pi^{+}"); + registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(10, "Unexpected"); + + auto hEvtSelectedHyperHelium4SigmaCounter = registry.add("hEvtSelectedHyperHelium4SigmaCounter", "", HistType::kTH1F, {{2, 0.f, 2.f}}); + registry.get(HIST("hEvtSelectedHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(1, "Generated"); + registry.get(HIST("hEvtSelectedHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(2, "Survived"); + + registry.add("hGenHyperHelium4SigmaP", "", HistType::kTH1F, {ptAxis}); + registry.add("hGenHyperHelium4SigmaPt", "", HistType::kTH1F, {ptAxis}); + registry.add("hGenHyperHelium4SigmaCt", "", HistType::kTH1F, {ctAxis}); + registry.add("hMcRecoInvMass", "", HistType::kTH1F, {invMassAxis}); + + registry.add("hDauHelium4TPCNSigma", "", HistType::kTH2F, {rigidityAxis, nsigmaAxis}); + registry.add("hDauTritonTPCNSigma", "", HistType::kTH2F, {rigidityAxis, nsigmaAxis}); + registry.add("hDauProtonTPCNSigma", "", HistType::kTH2F, {rigidityAxis, nsigmaAxis}); + } } // Configurable eventSel8Cut{"eventSel8Cut", true, "flag to enable event sel8 selection"}; @@ -183,7 +225,13 @@ struct Hyperhelium4sigmaAnalysis { } } - void process(aod::McCollisions const& mcCollisions, aod::McParticles const& particlesMC, o2::soa::Join const& collisions, MCLabeledTracksIU const& tracks) + void processData(o2::aod::Collisions const&) + { + // dummy process function; + } + PROCESS_SWITCH(Hyperhelium4sigmaQa, processData, "process data", true); + + void processMC(aod::McCollisions const& mcCollisions, aod::McParticles const& particlesMC, o2::soa::Join const& collisions, MCLabeledTracksIU const& tracks) { setTrackIDForMC(particlesMC, tracks); std::vector selectedEvents(collisions.size()); @@ -296,6 +344,7 @@ struct Hyperhelium4sigmaAnalysis { } } + registry.fill(HIST("hGenHyperHelium4SigmaP"), mcparticle.p()); registry.fill(HIST("hGenHyperHelium4SigmaPt"), mcparticle.pt()); double ct = RecoDecay::sqrtSumOfSquares(svPos[0] - mcparticle.vx(), svPos[1] - mcparticle.vy(), svPos[2] - mcparticle.vz()) * o2::constants::physics::MassHyperHelium4Sigma / mcparticle.p(); registry.fill(HIST("hGenHyperHelium4SigmaCt"), ct); @@ -328,11 +377,13 @@ struct Hyperhelium4sigmaAnalysis { } } } + PROCESS_SWITCH(Hyperhelium4sigmaQa, processMC, "do QA for MC prodcutions", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc), }; } From 9a57161ef2e97c02ec17c1eb8699b4d14be357ca Mon Sep 17 00:00:00 2001 From: yuanzhe <90246048+wang-yuanzhe@users.noreply.github.com> Date: Fri, 9 May 2025 15:31:44 +0200 Subject: [PATCH 1231/1650] [PWGLF,Trigger] Fix selection on daughters' dca in 3body trigger (#11131) --- EventFiltering/PWGLF/nucleiFilter.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/EventFiltering/PWGLF/nucleiFilter.cxx b/EventFiltering/PWGLF/nucleiFilter.cxx index 0030dac0476..1c319a949f5 100644 --- a/EventFiltering/PWGLF/nucleiFilter.cxx +++ b/EventFiltering/PWGLF/nucleiFilter.cxx @@ -125,7 +125,7 @@ struct nucleiFilter { struct : ConfigurableGroup { Configurable bFieldInput{"trgH3L3Body.mBz", -999, "bz field, -999 is automatic"}; Configurable minCosPA3body{"trgH3L3Body.minCosPA3body", 0.9995, "minCosPA3body"}; - Configurable dcavtxdau{"trgH3L3Body.dcavtxdau", 0.02, "meen DCA among Daughters"}; + Configurable dcavtxdau{"trgH3L3Body.dcavtxdau", 0.15, "meen DCA among Daughters"}; Configurable dcapiontopv{"trgH3L3Body.dcapiontopv", 0.05, "DCA Pion To PV"}; Configurable tofPIDNSigmaMin{"trgH3L3Body.tofPIDNSigmaMin", -5, "tofPIDNSigmaMin"}; Configurable tofPIDNSigmaMax{"trgH3L3Body.tofPIDNSigmaMax", 5, "tofPIDNSigmaMax"}; @@ -138,7 +138,7 @@ struct nucleiFilter { Configurable maxPionPt{"trgH3L3Body.maxPionPt", 1.2, "maxPionPt"}; Configurable minDeuteronPt{"trgH3L3Body.minDeuteronPt", 0.6, "minDeuteronPt"}; Configurable maxDeuteronPt{"trgH3L3Body.maxDeuteronPt", 10, "maxDeuteronPt"}; - Configurable minDeuteronPUseTOF{"trgH3L3Body.minDeuteronPUseTOF", 1, "minDeuteronPt Enable TOF PID"}; + Configurable minDeuteronPUseTOF{"trgH3L3Body.minDeuteronPUseTOF", 999, "minDeuteronPt Enable TOF PID"}; Configurable h3LMassLowerlimit{"trgH3L3Body.h3LMassLowerlimit", 2.96, "Hypertriton mass lower limit"}; Configurable h3LMassUpperlimit{"trgH3L3Body.h3LMassUpperlimit", 3.04, "Hypertriton mass upper limit"}; Configurable minP3Body{"trgH3L3Body.minP3Body", 1.5, "min P3Body"}; @@ -618,7 +618,7 @@ struct nucleiFilter { continue; } - float dcaDaughters = fitter3body.getChi2AtPCACandidate(); + float dcaDaughters = std::sqrt(fitter3body.getChi2AtPCACandidate()); if (dcaDaughters > trgH3L3Body.dcavtxdau) { continue; } From a3b093b50411d98cc5a2de2e17ce6f73faf784c0 Mon Sep 17 00:00:00 2001 From: hernasab Date: Fri, 9 May 2025 10:04:29 -0500 Subject: [PATCH 1232/1650] [PWGCF] adjust zdc amp (#11135) Co-authored-by: Sabrina Hernandez --- PWGCF/Flow/Tasks/flowZdcTask.cxx | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowZdcTask.cxx b/PWGCF/Flow/Tasks/flowZdcTask.cxx index 24d839b048d..342208a8dfc 100644 --- a/PWGCF/Flow/Tasks/flowZdcTask.cxx +++ b/PWGCF/Flow/Tasks/flowZdcTask.cxx @@ -70,10 +70,6 @@ struct FlowZdcTask { Configurable nBinsAmp{"nBinsAmp", 1025, "nbinsAmp"}; Configurable nBinsFT0Amp{"nBinsFT0Amp", 250000, "nbinsAmp"}; Configurable maxZn{"maxZn", 4099.5, "Max ZN signal"}; - Configurable acceptanceZna{"acceptanceZna", 0.92, "ZNA acceptance factor"}; - Configurable acceptanceZnc{"acceptanceZnc", 0.90, "ZNC acceptance factor"}; - Configurable acceptanceZpa{"acceptanceZpa", 0.52, "ZPA acceptance factor"}; - Configurable acceptanceZpc{"acceptanceZpc", 0.50, "ZPC acceptance factor"}; Configurable vtxRange{"vtxRange", 10.0f, "Vertex Z range to consider"}; Configurable etaRange{"etaRange", 1.0f, "Eta range to consider"}; Configurable npvTracksCut{"npvTracksCut", 1.0f, "Apply extra NPVtracks cut"}; @@ -478,14 +474,10 @@ struct FlowZdcTask { histos.fill(HIST("hEventCounter"), EvCutLabel::Zem); } - float znA{zdc.amplitudeZNA()}; - float znC{zdc.amplitudeZNC()}; - float zpA{zdc.amplitudeZPA()}; - float zpC{zdc.amplitudeZPC()}; - znA /= 2.81; - znC /= 2.81; - zpA /= 2.81; - zpC /= 2.81; + float znA = zdc.amplitudeZNA() / 2.68; + float znC = zdc.amplitudeZNC() / 2.68; + float zpA = zdc.amplitudeZPA() / 2.68; + float zpC = zdc.amplitudeZPC() / 2.68; float tZEM1{zdc.timeZEM1()}; float tZEM2{zdc.timeZEM2()}; From 0610a962e9f5b11035eac052cfb4c31b7dda417f Mon Sep 17 00:00:00 2001 From: Shirajum Monira <38348689+Eloviyo@users.noreply.github.com> Date: Fri, 9 May 2025 17:10:18 +0200 Subject: [PATCH 1233/1650] [PWGCF] fixed typo and added TOF tables (#11137) Co-authored-by: Shirajum Monira --- PWGCF/TableProducer/filter2Prong.cxx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/PWGCF/TableProducer/filter2Prong.cxx b/PWGCF/TableProducer/filter2Prong.cxx index 4be15f1a295..95a66b83e3e 100644 --- a/PWGCF/TableProducer/filter2Prong.cxx +++ b/PWGCF/TableProducer/filter2Prong.cxx @@ -8,6 +8,9 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. + +/// \author Jasper Parkkila + #include #include #include @@ -39,11 +42,10 @@ using namespace o2::math_utils::detail; struct Filter2Prong { O2_DEFINE_CONFIGURABLE(cfgVerbosity, int, 0, "Verbosity level (0 = major, 1 = per collision)") O2_DEFINE_CONFIGURABLE(cfgYMax, float, -1.0f, "Maximum candidate rapidity") - // O2_DEFINE_CONFIGURABLE(cfgImPart1Mass, float, o2::constants::physics::MassKPlus, "Daughter particle 1 mass in GeV") O2_DEFINE_CONFIGURABLE(cfgImPart2Mass, float, o2::constants::physics::MassKMinus, "Daughter particle 2 mass in GeV") - O2_DEFINE_CONFIGURABLE(cfgImPart1PID, float, o2::track::PID::Kaon, "PID of daughter particle 1 (O2 PID ID)") - O2_DEFINE_CONFIGURABLE(cfgImPart2PID, float, o2::track::PID::Kaon, "PID of daughter particle 1 (O2 PID ID)") + O2_DEFINE_CONFIGURABLE(cfgImPart1PID, int, o2::track::PID::Kaon, "PID of daughter particle 1 (O2 PID ID)") + O2_DEFINE_CONFIGURABLE(cfgImPart2PID, int, o2::track::PID::Kaon, "PID of daughter particle 2 (O2 PID ID)") O2_DEFINE_CONFIGURABLE(cfgImCutPt, float, 0.2f, "Minimal pT for candidates") O2_DEFINE_CONFIGURABLE(cfgImMinInvMass, float, 0.95f, "Minimum invariant mass (GeV)") O2_DEFINE_CONFIGURABLE(cfgImMaxInvMass, float, 1.07f, "Maximum invariant mass (GeV)") @@ -165,7 +167,7 @@ struct Filter2Prong { PROCESS_SWITCH(Filter2Prong, processMC, "Process MC 2-prong daughters", false); // Generic 2-prong invariant mass method candidate finder. Only works for non-identical daughters of opposite charge for now. - using PIDTrack = soa::Join; + using PIDTrack = soa::Join; void processDataInvMass(aod::Collisions::iterator const&, aod::BCsWithTimestamps const&, aod::CFCollRefs const& cfcollisions, aod::CFTrackRefs const& cftracks, PIDTrack const& tracks) { if (cfcollisions.size() <= 0 || cftracks.size() <= 0) From a56a0fb7e0dba3a3d28d4701b31a1c1f74d98233 Mon Sep 17 00:00:00 2001 From: JStaa <39123272+JStaa@users.noreply.github.com> Date: Fri, 9 May 2025 17:14:14 +0200 Subject: [PATCH 1234/1650] [PWGCF] Added a switch for the radialDistanceFilter function (#11144) Co-authored-by: ALICE Action Bot --- .../Tasks/threeParticleCorrelations.cxx | 64 ++++++++++--------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx index a9ae8ac562c..15f37379a33 100644 --- a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx +++ b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx @@ -120,7 +120,8 @@ struct ThreeParticleCorrelations { SameKindPair pairMC{collBinningMC, 5, -1, &cache}; // Process configurables - Configurable confFilterSwitch{"confFilterSwitch", false, "Switch for the fakeV0Filter function"}; + Configurable confFakeV0Switch{"confFakeV0Switch", false, "Switch for the fakeV0Filter function"}; + Configurable confRDSwitch{"confRDSwitch", true, "Switch for the radialDistanceFilter function"}; // Efficiency histograms TH2D** hEffPions = new TH2D*[2]; @@ -770,7 +771,7 @@ struct ThreeParticleCorrelations { bool fakeV0Filter(const V0Cand& v0, const TrackCand& track) { - if (confFilterSwitch) { + if (confFakeV0Switch) { if (trackPID(track)[0] == kaonID) { // Kaons return kTRUE; @@ -814,41 +815,44 @@ struct ThreeParticleCorrelations { bool radialDistanceFilter(const V0Cand& v0, const TrackCand& track, double B, bool Mix) { - auto proton = v0.template posTrack_as(); - if (v0Sign(v0) == -1) { - proton = v0.template negTrack_as(); - } + if (confRDSwitch) { - double dEta = proton.eta() - track.eta(); - if (std::abs(dEta) > dEtaMin) { - return kTRUE; - } + auto proton = v0.template posTrack_as(); + if (v0Sign(v0) == -1) { + proton = v0.template negTrack_as(); + } - double dPhiStar; - double dPhi = proton.phi() - track.phi(); - double phaseProton = (-0.3 * B * proton.sign()) / (2 * proton.pt()); - double phaseTrack = (-0.3 * B * track.sign()) / (2 * track.pt()); + double dEta = proton.eta() - track.eta(); + if (std::abs(dEta) > dEtaMin) { + return kTRUE; + } + + double dPhiStar; + double dPhi = proton.phi() - track.phi(); + double phaseProton = (-0.3 * B * proton.sign()) / (2 * proton.pt()); + double phaseTrack = (-0.3 * B * track.sign()) / (2 * track.pt()); - for (double r = rMin; r <= rMax; r += 0.01) { - dPhiStar = RecoDecay::constrainAngle(dPhi + std::asin(phaseProton * r) - std::asin(phaseTrack * r), -constants::math::PIHalf); + for (double r = rMin; r <= rMax; r += 0.01) { + dPhiStar = RecoDecay::constrainAngle(dPhi + std::asin(phaseProton * r) - std::asin(phaseTrack * r), -constants::math::PIHalf); - if (r == rMin) { - if (!Mix) { - rPhiStarRegistry.fill(HIST("hSEProtonPreCut"), dPhiStar, dEta); - } else { - rPhiStarRegistry.fill(HIST("hMEProtonPreCut"), dPhiStar, dEta); + if (r == rMin) { + if (!Mix) { + rPhiStarRegistry.fill(HIST("hSEProtonPreCut"), dPhiStar, dEta); + } else { + rPhiStarRegistry.fill(HIST("hMEProtonPreCut"), dPhiStar, dEta); + } } - } - if (std::abs(dPhiStar) < dPhiStarMin) { - return kFALSE; - } + if (std::abs(dPhiStar) < dPhiStarMin) { + return kFALSE; + } - if (r == rMin) { - if (!Mix) { - rPhiStarRegistry.fill(HIST("hSEProtonPostCut"), dPhiStar, dEta); - } else { - rPhiStarRegistry.fill(HIST("hMEProtonPostCut"), dPhiStar, dEta); + if (r == rMin) { + if (!Mix) { + rPhiStarRegistry.fill(HIST("hSEProtonPostCut"), dPhiStar, dEta); + } else { + rPhiStarRegistry.fill(HIST("hMEProtonPostCut"), dPhiStar, dEta); + } } } } From 95baa1df266675c817774860bcd16252805bce62 Mon Sep 17 00:00:00 2001 From: suyoupeng <109774812+15071832337@users.noreply.github.com> Date: Fri, 9 May 2025 23:42:03 +0800 Subject: [PATCH 1235/1650] [PWGLF] Lambda local polarization induced by jet in pp collision 13.6 TeV (#11140) --- .../lambdaJetpolarizationbuilder.cxx | 5 +- PWGLF/Tasks/Strangeness/CMakeLists.txt | 2 +- .../Strangeness/lambdaJetpolarization.cxx | 770 +++++++++++++++++- 3 files changed, 770 insertions(+), 7 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/lambdaJetpolarizationbuilder.cxx b/PWGLF/TableProducer/Strangeness/lambdaJetpolarizationbuilder.cxx index 6c8138f65a4..cc21c8def05 100644 --- a/PWGLF/TableProducer/Strangeness/lambdaJetpolarizationbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/lambdaJetpolarizationbuilder.cxx @@ -94,7 +94,8 @@ struct myAnalysis { Configurable nsigmaTOFmax{"nsigmaTOFmax", +5.0f, "Maximum nsigma TOF"}; Configurable yMin{"yMin", -0.5f, "minimum y"}; Configurable yMax{"yMax", +0.5f, "maximum y"}; - Configurable v0rejLambda{"v0rejLambda", 0.01, "V0 rej K0s"}; + Configurable v0rejLambda{"v0rejLambda", 0.01, "V0 rej Lambda"}; + Configurable v0rejK0s{"v0rejK0s", 0.075, "V0 rej K0s"}; Configurable CtauLambda{"ctauLambda", 30, "C tau Lambda (cm)"}; Configurable ifpasslambda{"passedLambdaSelection", 1, "passedLambdaSelection"}; Configurable ifpassantilambda{"passedAntiLambdaSelection", 1, "passedAntiLambdaSelection"}; @@ -405,7 +406,6 @@ struct myAnalysis { if (TMath::Abs(v0.mLambda() - o2::constants::physics::MassLambda0) > 0.075) { return false; } - return true; } // AntiLambda Selections @@ -574,6 +574,7 @@ struct myAnalysis { maxJetpT = chargedjet.pt(); collisionId = chargedjet.collisionId(); lastindex = outputCollisions.lastIndex(); + maxJetPt = maxJetpT; } } if (maxJetpT > 0) { diff --git a/PWGLF/Tasks/Strangeness/CMakeLists.txt b/PWGLF/Tasks/Strangeness/CMakeLists.txt index 60106e5415b..9ae8e095784 100644 --- a/PWGLF/Tasks/Strangeness/CMakeLists.txt +++ b/PWGLF/Tasks/Strangeness/CMakeLists.txt @@ -143,5 +143,5 @@ o2physics_add_dpl_workflow(lambdalambda o2physics_add_dpl_workflow(lambdajetpolarization SOURCES lambdaJetpolarization.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGJECore FastJet::FastJet FastJet::Contrib O2Physics::EventFilteringUtils COMPONENT_NAME Analysis) diff --git a/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx b/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx index 5cf681104ea..93c0b4381dc 100644 --- a/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx +++ b/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx @@ -21,8 +21,6 @@ #include "PWGLF/DataModel/LFStrangenessTables.h" #include "Common/DataModel/PIDResponse.h" #include "Framework/O2DatabasePDGPlugin.h" -#include "PWGJE/Core/JetDerivedDataUtilities.h" -#include "PWGJE/DataModel/Jet.h" #include #include "Framework/ASoA.h" #include "Framework/AnalysisDataModel.h" @@ -30,6 +28,21 @@ #include #include #include "PWGLF/DataModel/lambdaJetpolarization.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include "PWGJE/Core/JetBkgSubUtils.h" +#include "PWGJE/Core/JetDerivedDataUtilities.h" +#include "PWGJE/DataModel/JetReducedData.h" +#include "PWGJE/DataModel/Jet.h" +#include "Common/Core/trackUtilities.h" + using std::cout; using std::endl; using namespace o2; @@ -38,15 +51,86 @@ using namespace o2::framework::expressions; struct LfMyV0s { HistogramRegistry registry{"registry"}; + HistogramRegistry registryData{"registryData", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry registryV0Data{"registryV0Data", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + + Configurable zVtx{"zVtx", 10.0, "Maximum zVertex"}; + Configurable rJet{"rJet", 0.4, "Jet resolution parameter R"}; + Configurable etaMin{"etaMin", -0.9f, "eta min"}; + Configurable etaMax{"etaMax", +0.9f, "eta max"}; + Configurable deltaEtaEdge{"deltaEtaEdge", 0.00, "eta gap from the edge"}; + Configurable minJetPt{"minJetPt", 10.0, "Minimum pt of the jet"}; + // track parameters + Configurable minITSnCls{"minITSnCls", 4.0f, "min number of ITS clusters"}; + Configurable minTPCnClsFound{"minTPCnClsFound", 80.0f, "min number of found TPC clusters"}; + Configurable minNCrossedRowsTPC{"minNCrossedRowsTPC", 80.0f, "min number of TPC crossed rows"}; + Configurable minTpcNcrossedRowsOverFindable{"minTpcNcrossedRowsOverFindable", 0.8, "crossed rows/findable"}; + Configurable maxChi2TPC{"maxChi2TPC", 4.0f, "max chi2 per cluster TPC"}; + Configurable maxChi2ITS{"maxChi2ITS", 36.0f, "max chi2 per cluster ITS"}; + Configurable requireTOF{"requireTOF", false, "require TOF hit"}; + Configurable requireITS{"requireITS", false, "require ITS hit"}; + + Configurable ptMinV0Proton{"ptMinV0Proton", 0.3f, "pt min of proton from V0"}; + Configurable ptMaxV0Proton{"ptMaxV0Proton", 10.0f, "pt max of proton from V0"}; + Configurable ptMinV0Pion{"ptMinV0Pion", 0.1f, "pt min of pion from V0"}; + Configurable ptMaxV0Pion{"ptMaxV0Pion", 1.5f, "pt max of pion from V0"}; + + Configurable nsigmaTPCmin{"nsigmaTPCmin", -5.0f, "Minimum nsigma TPC"}; + Configurable nsigmaTPCmax{"nsigmaTPCmax", +5.0f, "Maximum nsigma TPC"}; + Configurable nsigmaTOFmin{"nsigmaTOFmin", -5.0f, "Minimum nsigma TOF"}; + Configurable nsigmaTOFmax{"nsigmaTOFmax", +5.0f, "Maximum nsigma TOF"}; + Configurable cfgtrkMinPt{"cfgtrkMinPt", 0.10, "set track min pT"}; + + // v0 parameters + Configurable v0cospaMin{"v0cospaMin", 0.995f, "Minimum V0 CosPA"}; + Configurable minimumV0Radius{"minimumV0Radius", 0.2f, "Minimum V0 Radius"}; + Configurable maximumV0Radius{"maximumV0Radius", 40.0f, "Maximum V0 Radius"}; + Configurable dcaV0DaughtersMax{"dcaV0DaughtersMax", 1.0f, "Maximum DCA Daughters"}; + Configurable dcanegtoPVmin{"dcanegtoPVmin", 0.1f, "Minimum DCA Neg To PV"}; + Configurable dcapostoPVmin{"dcapostoPVmin", 0.1f, "Minimum DCA Pos To PV"}; + + // jet selection + Configurable cfgjetPtMin{"cfgjetPtMin", 8.0, "minimum jet pT cut"}; + Configurable ispassdTrackSelectionForJetReconstruction{"ispassdTrackSelectionForJetReconstruction", 1, "do track selection"}; + + // v0Event selection + Configurable sel8{"sel8", 0, "Apply sel8 event selection"}; + Configurable isTriggerTVX{"isTriggerTVX", 1, "TVX trigger"}; + Configurable iscutzvertex{"iscutzvertex", 1, "Accepted z-vertex range (cm)"}; + Configurable isNoTimeFrameBorder{"isNoTimeFrameBorder", 1, "TF border cut"}; + Configurable isNoITSROFrameBorder{"isNoITSROFrameBorder", 1, "ITS ROF border cut"}; + Configurable isVertexTOFmatched{"isVertexTOFmatched", 1, "Is Vertex TOF matched"}; + Configurable isGoodZvtxFT0vsPV{"isGoodZvtxFT0vsPV", 0, "isGoodZvtxFT0vsPV"}; + Configurable cutzvertex{"cutzvertex", 10.0f, "Accepted z-vertex range (cm)"}; + Configurable CtauLambda{"ctauLambda", 30, "C tau Lambda (cm)"}; + Configurable requirepassedSingleTrackSelection{"requirepassedSingleTrackSelection", false, "requirepassedSingleTrackSelection"}; + Configurable V0tracketaMin{"V0tracketaMin", -0.8f, "eta min track"}; + Configurable V0tracketaMax{"V0tracketaMax", +0.8f, "eta max track"}; + Configurable requireTPC{"requireTPC", true, "require TPC hit"}; + Configurable yMin{"V0yMin", -0.5f, "minimum y"}; + Configurable yMax{"V0yMax", +0.5f, "maximum y"}; + Configurable v0rejLambda{"v0rejLambda", 0.01, "V0 rej Lambda"}; + Configurable v0accLambda{"v0accLambda", 0.075, "V0 acc Lambda"}; + Configurable ifinitpasslambda{"ifinitpasslambda", 1, "ifinitpasslambda"}; + Configurable ifpasslambda{"passedLambdaSelection", 0, "passedLambdaSelection"}; + + // Jet background subtraction + JetBkgSubUtils backgroundSub; void init(InitContext const&) { const AxisSpec axisPx{100, -10, 10, "#px (GeV/c)"}; const AxisSpec axisPy{100, -10, 10, "#py (GeV/c)"}; const AxisSpec axisPz{100, -10, 10, "#pz (GeV/c)"}; - const AxisSpec axisPT{200, 0, 50, "#p_{T} (GeV/c)"}; + const AxisSpec axisPT{200, 0, 50, "#it{p}_{T} (GeV/#it{c})"}; const AxisSpec axisPhi{100, -3.14, 3.14, "#Phi"}; const AxisSpec axisMass{100, 0, 2, "Mass(GeV/c^{2})"}; + const AxisSpec JetaxisEta{30, -1.5, +1.5, "#eta"}; + const AxisSpec JetaxisPhi{200, -1, +7, "#phi"}; + const AxisSpec JetaxisPt{200, 0, +200, "#it{p}_{T} (GeV/#it{c})"}; + const AxisSpec ptAxis{100, 0.0f, 10.0f, "#it{p}_{T} (GeV/#it{c})"}; + const AxisSpec invMassLambdaAxis{200, 1.09, 1.14, "m_{p#pi} (GeV/#it{c}^{2})"}; + registry.add("hMassLambda", "hMassLambda", {HistType::kTH1F, {{200, 0.9f, 1.2f}}}); registry.add("V0pTInLab", "V0pTInLab", kTH1F, {axisPT}); registry.add("hMassVsPtLambda", "hMassVsPtLambda", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {200, 1.016f, 1.216f}}}); @@ -100,6 +184,117 @@ struct LfMyV0s { registry.add("V0LambdaprotonPhi", "V0LambdaprotonPhi", {HistType::kTH1F, {{200, -TMath::Pi() / 2, TMath::Pi() / 2}}}); registry.add("V0AntiLambdaprotonPhi", "V0AntiLambdaprotonPhi", {HistType::kTH1F, {{200, -TMath::Pi() / 2, TMath::Pi() / 2}}}); + + registryData.add("number_of_events_data", "number of events in data", HistType::kTH1D, {{20, 0, 20, "Event Cuts"}}); + registryData.add("number_of_events_vsmultiplicity", "number of events in data vs multiplicity", HistType::kTH1D, {{101, 0, 101, "Multiplicity percentile"}}); + registryData.add("h_track_pt", "track pT;#it{p}_{T,track} (GeV/#it{c});entries", kTH1F, {{200, 0., 200.}}); + registryData.add("h_track_eta", "track #eta;#eta_{track};entries", kTH1F, {{100, -1.f, 1.f}}); + registryData.add("h_track_phi", "track #varphi;#varphi_{track};entries", kTH1F, {{80, -1.f, 7.f}}); + registryData.add("h_track_pt_sel", "track pT;#it{p}_{T,track} (GeV/#it{c});entries", kTH1F, {{200, 0., 200.}}); + registryData.add("h_track_eta_sel", "track #eta;#eta_{track};entries", kTH1F, {{100, -1.f, 1.f}}); + registryData.add("h_track_phi_sel", "track #varphi;#varphi_{track};entries", kTH1F, {{80, -1.f, 7.f}}); + + registryData.add("FJetaHistogram", "FJetaHistogram", kTH1F, {JetaxisEta}); + registryData.add("FJphiHistogram", "FJphiHistogram", kTH1F, {JetaxisPhi}); + registryData.add("FJptHistogram", "FJptHistogram", kTH1F, {JetaxisPt}); + registryData.add("nJetsPerEvent", "nJetsPerEvent", kTH1F, {{10, 0.0, 10.0}}); + registryData.add("nJetsPerEventsel", "nJetsPerEventsel", kTH1F, {{10, 0.0, 10.0}}); + registryData.add("nV0sPerEvent", "nV0sPerEvent", kTH1F, {{10, 0.0, 10.0}}); + registryData.add("FJetaHistogramsel", "FJetaHistogramsel", kTH1F, {JetaxisEta}); + registryData.add("FJphiHistogramsel", "FJphiHistogramsel", kTH1F, {JetaxisPhi}); + registryData.add("FJptHistogramsel", "FJptHistogramsel", kTH1F, {JetaxisPt}); + + registryData.add("FLeadingJetaHistogramsel", "FLeadingJetaHistogramsel", kTH1F, {JetaxisEta}); + registryData.add("FLeadingJphiHistogramsel", "FLeadingJphiHistogramsel", kTH1F, {JetaxisPhi}); + registryData.add("FLeadingJptHistogramsel", "FLeadingJptHistogramsel", kTH1F, {JetaxisPt}); + + registryData.add("LambdaPtMass", "LambdaPtMass", HistType::kTH2F, {ptAxis, invMassLambdaAxis}); + registryData.add("AntiLambdaPtMass", "AntiLambdaPtMass", HistType::kTH2F, {ptAxis, invMassLambdaAxis}); + + registryData.add("hMassLambda", "hMassLambda", {HistType::kTH1F, {{200, 0.9f, 1.2f}}}); + registryData.add("V0pTInLab", "V0pTInLab", kTH1F, {axisPT}); + + registryData.add("V0pxInLab", "V0pxInLab", kTH1F, {axisPx}); + registryData.add("V0pyInLab", "V0pyInLab", kTH1F, {axisPy}); + registryData.add("V0pzInLab", "V0pzInLab", kTH1F, {axisPz}); + + registryData.add("V0pxInRest_frame", "V0pxInRest_frame", kTH1F, {axisPx}); + registryData.add("V0pyInRest_frame", "V0pyInRest_frame", kTH1F, {axisPy}); + registryData.add("V0pzInRest_frame", "V0pzInRest_frame", kTH1F, {axisPz}); + + registryData.add("V0protonpxInLab", "V0protonpxInLab", kTH1F, {axisPx}); + registryData.add("V0protonpyInLab", "V0protonpyInLab", kTH1F, {axisPy}); + registryData.add("V0protonpzInLab", "V0protonpzInLab", kTH1F, {axisPz}); + registryData.add("V0protonphiInLab", "V0protonphiInLab", kTH1F, {axisPhi}); + + registryData.add("V0protonpxInRest_frame", "V0protonpxInRest_frame", kTH1F, {axisPx}); + registryData.add("V0protonpyInRest_frame", "V0protonpyInRest_frame", kTH1F, {axisPy}); + registryData.add("V0protonpzInRest_frame", "V0protonpzInRest_frame", kTH1F, {axisPz}); + registryData.add("V0protonMassInRest_frame", "V0protonMassInRest_frame", kTH1F, {axisMass}); + registryData.add("V0protonphiInRest_frame", "V0protonphiInRest_frame", kTH1F, {axisPhi}); + + registryData.add("V0protonpxInJetV0frame", "V0protonpxInJetV0frame", kTH1F, {axisPx}); + registryData.add("V0protonpyInJetV0frame", "V0protonpyInJetV0frame", kTH1F, {axisPy}); + registryData.add("V0protonpzInJetV0frame", "V0protonpzInJetV0frame", kTH1F, {axisPz}); + + registryData.add("V0LambdapxInJetV0frame", "V0LambdapxInJetV0frame", kTH1F, {axisPx}); + registryData.add("V0LambdapyInJetV0frame", "V0LambdapyInJetV0frame", kTH1F, {axisPy}); + registryData.add("V0LambdapzInJetV0frame", "V0LambdapzInJetV0frame", kTH1F, {axisPz}); + registryData.add("hLambdamassandSinPhi", "hLambdamassandSinPhi", kTH2F, {{200, 0.9, 1.2}, {200, -1, 1}}); + registryData.add("profileLambda", "Invariant Mass vs sin(phi)", {HistType::kTProfile, {{200, 0.9, 1.2}}}); + registryData.add("hLambdaPhiandSinPhi", "hLambdaPhiandSinPhi", kTH2F, {{200, -TMath::Pi() / 2, TMath::Pi() / 2}, {200, -1, 1}}); + registryData.add("V0LambdaprotonPhi", "V0LambdaprotonPhi", {HistType::kTH1F, {{200, -TMath::Pi() / 2, TMath::Pi() / 2}}}); + + registryData.add("hNEvents", "hNEvents", {HistType::kTH1I, {{10, 0.f, 10.f}}}); + registryData.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(1, "all"); + registryData.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(2, "sel8"); + registryData.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(3, "TVX"); + registryData.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(4, "zvertex"); + registryData.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(5, "TFBorder"); + registryData.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(6, "ITSROFBorder"); + registryData.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(7, "isTOFVertexMatched"); + registryData.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(8, "isGoodZvtxFT0vsPV"); + registryData.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(9, "Applied selected"); + + registryV0Data.add("hLambdaPt", "hLambdaPt", {HistType::kTH1F, {{100, 0.0f, 10.0f}}}); + registryV0Data.add("hAntiLambdaPt", "hAntiLambdaPt", {HistType::kTH1F, {{100, 0.0f, 10.0f}}}); + + registryV0Data.add("hMassVsPtLambda", "hMassVsPtLambda", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {200, 1.016f, 1.216f}}}); + registryV0Data.add("hMassVsPtAntiLambda", "hMassVsPtAntiLambda", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {200, 1.016f, 1.216f}}}); + registryV0Data.add("hMassLambda", "hMassLambda", {HistType::kTH1F, {{200, 0.9f, 1.2f}}}); + registryV0Data.add("hMassAntiLambda", "hMassAntiLambda", {HistType::kTH1F, {{200, 0.9f, 1.2f}}}); + registryV0Data.add("nV0sPerEvent", "nV0sPerEvent", kTH1F, {{10, 0.0, 10.0}}); + registryV0Data.add("nV0sPerEventsel", "nV0sPerEventsel", kTH1F, {{10, 0.0, 10.0}}); + + registryV0Data.add("hprotoncosthetainLab", "hprotoncosthetainLab", kTH1F, {{200, -1.f, 1.f}}); + registryV0Data.add("hprotonsinthetainLab", "hprotonsinthetainLab", kTH1F, {{200, -1.f, 1.f}}); + registryV0Data.add("hprotonthetainLab", "hprotonthetainLab", kTH1F, {{200, 0.f, TMath::Pi()}}); + + registryV0Data.add("hprotoncosthetainV0", "hprotoncosthetainV0", kTH1F, {{200, -1.f, 1.f}}); + registryV0Data.add("hprotonsinthetainV0", "hprotonsinthetainV0", kTH1F, {{200, -1.f, 1.f}}); + registryV0Data.add("hprotonthetainV0", "hprotonthetainV0", kTH1F, {{200, 0.f, TMath::Pi()}}); + + registryV0Data.add("hprotoncosthetainJetV0", "hprotoncosthetainJetV0", kTH1F, {{200, -1.f, 1.f}}); + registryV0Data.add("hprotonsinthetainJetV0", "hprotonsinthetainJetV0", kTH1F, {{200, -1.f, 1.f}}); + registryV0Data.add("hprotonthetainJetV0", "hprotonthetainJetV0", kTH1F, {{200, 0.f, TMath::Pi()}}); + + registryV0Data.add("hprotoncosSquarethetainLab", "hprotoncosSquarethetainLab", kTH1F, {{200, -1.f, 1.f}}); + registryV0Data.add("hprotoncosSquarethetainV0", "hprotoncosSquarethetainV0", kTH1F, {{200, -1.f, 1.f}}); + registryV0Data.add("hprotoncosSquarethetainJetV0", "hprotoncosSquarethetainJetV0", kTH1F, {{200, -1.f, 1.f}}); + + registryV0Data.add("hLambdamassandSinthetainV0", "hLambdamassandSinthetainV0", kTH2F, {{200, 0.9, 1.2}, {200, -1, 1}}); + registryV0Data.add("hLambdamassandCosthetainV0", "hLambdamassandCosthetainV0", kTH2F, {{200, 0.9, 1.2}, {200, -1, 1}}); + registryV0Data.add("hLambdamassandCosSquarethetainV0", "hLambdamassandCosSquarethetainV0", kTH2F, {{200, 0.9, 1.2}, {200, -1, 1}}); + + registryV0Data.add("hLambdamassandSinthetainJetV0", "hLambdamassandSinthetainJetV0", kTH2F, {{200, 0.9, 1.2}, {200, -1, 1}}); + registryV0Data.add("hLambdamassandCosthetainJetV0", "hLambdamassandCosthetainJetV0", kTH2F, {{200, 0.9, 1.2}, {200, -1, 1}}); + registryV0Data.add("hLambdamassandCosSquarethetainJetV0", "hLambdamassandCosSquarethetainJetV0", kTH2F, {{200, 0.9, 1.2}, {200, -1, 1}}); + + registryV0Data.add("AverageSinthetainV0", "AverageSinthetainV0", {HistType::kTProfile, {{200, 0.9, 1.2}}}); + registryV0Data.add("AverageCosSquarethetainV0", "AverageCosSquarethetainV0", {HistType::kTProfile, {{200, 0.9, 1.2}}}); + + registryV0Data.add("AverageSinthetainJetV0", "AverageSinthetainJetV0", {HistType::kTProfile, {{200, 0.9, 1.2}}}); + registryV0Data.add("AverageCosSquarethetainJetV0", "AverageCosSquarethetainJetV0", {HistType::kTProfile, {{200, 0.9, 1.2}}}); } double massPr = o2::constants::physics::MassProton; double massLambda = o2::constants::physics::MassLambda; @@ -325,11 +520,578 @@ struct LfMyV0s { } } PROCESS_SWITCH(LfMyV0s, processLeadingJetAntiV0Analysis, "processLeadingJetAntiV0Analysis", true); + + // ITS hit + template + bool hasITSHit(const TrackIts& track, int layer) + { + int ibit = layer - 1; + return (track.itsClusterMap() & (1 << ibit)); + } + + // Single-Track Selection for Particles inside Jets + template + bool passedTrackSelectionForJetReconstruction(const JetTrack& track) + { + const int minTpcCr = 70; + const double minCrFindable = 0.8; + const double maxChi2Tpc = 4.0; + const double maxChi2Its = 36.0; + const double maxPseudorapidity = 0.9; + const double minPtTrack = 0.1; + const double dcaxyMaxTrackPar0 = 0.0105; + const double dcaxyMaxTrackPar1 = 0.035; + const double dcaxyMaxTrackPar2 = 1.1; + const double dcazMaxTrack = 2.0; + + if (!track.hasITS()) + return false; + if ((!hasITSHit(track, 1)) && (!hasITSHit(track, 2)) && (!hasITSHit(track, 3))) + return false; + if (!track.hasTPC()) + return false; + if (track.tpcNClsCrossedRows() < minTpcCr) + return false; + if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < minCrFindable) + return false; + if (track.tpcChi2NCl() > maxChi2Tpc) + return false; + if (track.itsChi2NCl() > maxChi2Its) + return false; + if (track.eta() < -maxPseudorapidity || track.eta() > maxPseudorapidity) + return false; + if (track.pt() < minPtTrack) + return false; + if (std::fabs(track.dcaXY()) > (dcaxyMaxTrackPar0 + dcaxyMaxTrackPar1 / std::pow(track.pt(), dcaxyMaxTrackPar2))) + return false; + if (std::fabs(track.dcaZ()) > dcazMaxTrack) + return false; + return true; + } + + // init Selection + template + bool passedInitLambdaSelection(const Lambda& v0, const TrackPos& ptrack, const TrackNeg& ntrack) + { + if (v0.v0radius() < minimumV0Radius || v0.v0cosPA() < v0cospaMin || + TMath::Abs(ptrack.eta()) > V0tracketaMax || + TMath::Abs(ntrack.eta()) > V0tracketaMax) { + return false; + } + if (v0.dcaV0daughters() > dcaV0DaughtersMax) { + return false; + } + if (TMath::Abs(v0.dcanegtopv()) < dcanegtoPVmin) { + return false; + } + if (TMath::Abs(v0.dcapostopv()) < dcapostoPVmin) { + return false; + } + return true; + } + + // Lambda Selections + template + bool passedLambdaSelection(const Lambda& v0, const TrackPos& ptrack, const TrackNeg& ntrack) + { + // Single-Track Selections + if (requirepassedSingleTrackSelection && !passedSingleTrackSelection(ptrack)) + return false; + if (requirepassedSingleTrackSelection && !passedSingleTrackSelection(ntrack)) + return false; + + // Momentum of Lambda Daughters + TVector3 proton(v0.pxpos(), v0.pypos(), v0.pzpos()); + TVector3 pion(v0.pxneg(), v0.pyneg(), v0.pzneg()); + + if (proton.Pt() < ptMinV0Proton) + return false; + if (proton.Pt() > ptMaxV0Proton) + return false; + if (pion.Pt() < ptMinV0Pion) + return false; + if (pion.Pt() > ptMaxV0Pion) + return false; + + // V0 Selections + if (v0.v0cosPA() < v0cospaMin) + return false; + if (v0.v0radius() < minimumV0Radius) + return false; + if (std::fabs(v0.dcaV0daughters()) > dcaV0DaughtersMax) + return false; + if (std::fabs(v0.dcapostopv()) < dcapostoPVmin) + return false; + if (std::fabs(v0.dcanegtopv()) < dcanegtoPVmin) + return false; + + if (TMath::Abs(ptrack.eta()) > V0tracketaMax || TMath::Abs(ntrack.eta()) > V0tracketaMax) { + return false; + } + + // PID Selections (TPC) + if (requireTPC) { + if (ptrack.tpcNSigmaPr() < nsigmaTPCmin || ptrack.tpcNSigmaPr() > nsigmaTPCmax) + return false; + if (ntrack.tpcNSigmaPi() < nsigmaTPCmin || ntrack.tpcNSigmaPi() > nsigmaTPCmax) + return false; + } + // PID Selections (TOF) + if (requireTOF) { + if (ptrack.tofNSigmaPr() < nsigmaTOFmin || ptrack.tofNSigmaPr() > nsigmaTOFmax) + return false; + if (ntrack.tofNSigmaPi() < nsigmaTOFmin || ntrack.tofNSigmaPi() > nsigmaTOFmax) + return false; + } + TLorentzVector lorentzVect; + lorentzVect.SetXYZM(v0.px(), v0.py(), v0.pz(), 1.115683); + if (lorentzVect.Rapidity() < yMin || lorentzVect.Rapidity() > yMax) { + return false; + } + + if (TMath::Abs(v0.mK0Short() - o2::constants::physics::MassK0Short) < v0rejLambda) { + return false; + } + if (TMath::Abs(v0.mLambda() - o2::constants::physics::MassLambda0) > v0accLambda) { + return false; + } + return true; + } + + // AntiLambda Selections + template + bool passedAntiLambdaSelection(const AntiLambda& v0, const TrackPos& ptrack, const TrackNeg& ntrack) + { + // Single-Track Selections + if (requirepassedSingleTrackSelection && !passedSingleTrackSelection(ptrack)) + return false; + if (requirepassedSingleTrackSelection && !passedSingleTrackSelection(ntrack)) + return false; + + // Momentum AntiLambda Daughters + TVector3 pion(v0.pxpos(), v0.pypos(), v0.pzpos()); + TVector3 proton(v0.pxneg(), v0.pyneg(), v0.pzneg()); + + if (proton.Pt() < ptMinV0Proton) + return false; + if (proton.Pt() > ptMaxV0Proton) + return false; + if (pion.Pt() < ptMinV0Pion) + return false; + if (pion.Pt() > ptMaxV0Pion) + return false; + + // V0 Selections + if (v0.v0cosPA() < v0cospaMin) + return false; + if (v0.v0radius() < minimumV0Radius || v0.v0radius() > maximumV0Radius) + return false; + if (std::fabs(v0.dcaV0daughters()) > dcaV0DaughtersMax) + return false; + if (std::fabs(v0.dcapostopv()) < dcapostoPVmin) + return false; + if (std::fabs(v0.dcanegtopv()) < dcanegtoPVmin) + return false; + + if (TMath::Abs(ptrack.eta()) > V0tracketaMax || TMath::Abs(ntrack.eta()) > V0tracketaMax) { + return false; + } + + // PID Selections (TPC) + if (requireTPC) { + if (ptrack.tpcNSigmaPi() < nsigmaTPCmin || ptrack.tpcNSigmaPi() > nsigmaTPCmax) + return false; + if (ntrack.tpcNSigmaPr() < nsigmaTPCmin || ntrack.tpcNSigmaPr() > nsigmaTPCmax) + return false; + } + // PID Selections (TOF) + if (requireTOF) { + if (ptrack.tofNSigmaPi() < nsigmaTOFmin || ptrack.tofNSigmaPi() > nsigmaTOFmax) + return false; + if (ntrack.tofNSigmaPr() < nsigmaTOFmin || ntrack.tofNSigmaPr() > nsigmaTOFmax) + return false; + } + TLorentzVector lorentzVect; + lorentzVect.SetXYZM(v0.px(), v0.py(), v0.pz(), 1.115683); + if (lorentzVect.Rapidity() < yMin || lorentzVect.Rapidity() > yMax) { + return false; + } + + if (TMath::Abs(v0.mK0Short() - o2::constants::physics::MassK0Short) < v0rejLambda) { + return false; + } + if (TMath::Abs(v0.mAntiLambda() - o2::constants::physics::MassLambda0) > v0accLambda) { + return false; + } + return true; + } + + // Single-Track Selection + template + bool passedSingleTrackSelection(const Track& track) + { + if (requireITS && (!track.hasITS())) + return false; + if (requireITS && track.itsNCls() < minITSnCls) + return false; + if (!track.hasTPC()) + return false; + if (track.tpcNClsFound() < minTPCnClsFound) + return false; + if (track.tpcNClsCrossedRows() < minNCrossedRowsTPC) + return false; + if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < minTpcNcrossedRowsOverFindable) + return false; + if (track.tpcChi2NCl() > maxChi2TPC) + return false; + if (track.eta() < etaMin || track.eta() > etaMax) + return false; + if (requireTOF && (!track.hasTOF())) + return false; + return true; + } + + ///////Event selection + template + bool AcceptEvent(TCollision const& collision) + { + if (sel8 && !collision.sel8()) { + return false; + } + registryData.fill(HIST("hNEvents"), 1.5); + + if (isTriggerTVX && !collision.selection_bit(aod::evsel::kIsTriggerTVX)) { + return false; + } + registryData.fill(HIST("hNEvents"), 2.5); + + if (iscutzvertex && TMath::Abs(collision.posZ()) > cutzvertex) { + return false; + } + registryData.fill(HIST("hNEvents"), 3.5); + + if (isNoTimeFrameBorder && !collision.selection_bit(aod::evsel::kNoTimeFrameBorder)) { + return false; + } + + registryData.fill(HIST("hNEvents"), 4.5); + + if (isNoITSROFrameBorder && !collision.selection_bit(aod::evsel::kNoITSROFrameBorder)) { + return false; + } + registryData.fill(HIST("hNEvents"), 5.5); + if (isVertexTOFmatched && !collision.selection_bit(aod::evsel::kIsVertexTOFmatched)) { + return false; + } + registryData.fill(HIST("hNEvents"), 6.5); + if (isGoodZvtxFT0vsPV && !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { + return false; + } + registryData.fill(HIST("hNEvents"), 7.5); + + return true; + } + + using SelCollisions = soa::Join; + using StrHadronDaughterTracks = soa::Join; + void processData(SelCollisions::iterator const& collision, aod::V0Datas const& fullV0s, StrHadronDaughterTracks const& tracks) + { + registryData.fill(HIST("number_of_events_data"), 0.5); + // event selection + if (!collision.sel8() || std::fabs(collision.posZ()) > zVtx) { + return; + } + // event counter: after event selection + registryData.fill(HIST("number_of_events_data"), 1.5); + // loop over reconstructed tracks + std::vector fjParticles; + for (auto const& track : tracks) { + registryData.fill(HIST("h_track_pt"), track.pt()); + registryData.fill(HIST("h_track_eta"), track.eta()); + registryData.fill(HIST("h_track_phi"), track.phi()); + if (ispassdTrackSelectionForJetReconstruction && !passedTrackSelectionForJetReconstruction(track)) { + continue; + } + registryData.fill(HIST("h_track_pt_sel"), track.pt()); + registryData.fill(HIST("h_track_eta_sel"), track.eta()); + registryData.fill(HIST("h_track_phi_sel"), track.phi()); + + // 4-momentum representation of a particle + fastjet::PseudoJet fourMomentum(track.px(), track.py(), track.pz(), track.energy(o2::constants::physics::MassPionCharged)); + fjParticles.emplace_back(fourMomentum); + } + // reject empty events + if (fjParticles.size() < 1) + return; + registryData.fill(HIST("number_of_events_data"), 2.5); + + // cluster particles using the anti-kt algorithm + fastjet::RecombinationScheme recombScheme = fastjet::E_scheme; + fastjet::JetDefinition jetDef(fastjet::antikt_algorithm, rJet, recombScheme); + fastjet::AreaDefinition areaDef(fastjet::active_area, fastjet::GhostedAreaSpec(1.0)); + fastjet::ClusterSequenceArea cs(fjParticles, jetDef, areaDef); + std::vector jets = fastjet::sorted_by_pt(cs.inclusive_jets()); + auto [rhoPerp, rhoMPerp] = backgroundSub.estimateRhoPerpCone(fjParticles, jets); + + // jet selection + bool isAtLeastOneJetSelected = false; + int nJets = 0; + int nJetssel = 0; + // select most large momentum jet + float maxJetpx = 0; + float maxJetpy = 0; + float maxJetpz = 0; + float maxJeteta = 0; + float maxJetphi = 0; + float maxJetpT = 0; + float maxJetPt = -999; + for (auto& jet : jets) { + nJets++; + registryData.fill(HIST("FJetaHistogram"), jet.eta()); + registryData.fill(HIST("FJphiHistogram"), jet.phi()); + registryData.fill(HIST("FJptHistogram"), jet.pt()); + // jet must be fully contained in the acceptance + fastjet::PseudoJet jetMinusBkg = backgroundSub.doRhoAreaSub(jet, rhoPerp, rhoMPerp); + if ((std::fabs(jet.eta()) + rJet) > (etaMax - deltaEtaEdge)) { + continue; + } + + if (jet.pt() < cfgjetPtMin) + continue; + nJetssel++; + registryData.fill(HIST("FJetaHistogramsel"), jet.eta()); + registryData.fill(HIST("FJphiHistogramsel"), jet.phi()); + registryData.fill(HIST("FJptHistogramsel"), jet.pt()); + + if (jet.pt() > maxJetPt) { + maxJetpx = jet.px(); + maxJetpy = jet.py(); + maxJetpz = jet.pz(); + maxJeteta = jet.eta(); + maxJetphi = jet.phi(); + maxJetpT = jet.pt(); + maxJetPt = maxJetpT; + } + } + if (maxJetpT > 0) { + registryData.fill(HIST("FLeadingJetaHistogramsel"), maxJeteta); + registryData.fill(HIST("FLeadingJphiHistogramsel"), maxJetphi); + registryData.fill(HIST("FLeadingJptHistogramsel"), maxJetpT); + } + registryData.fill(HIST("nJetsPerEvent"), nJets); + registryData.fill(HIST("nJetsPerEventsel"), nJetssel); + isAtLeastOneJetSelected = true; + if (!isAtLeastOneJetSelected) { + return; + } + registryData.fill(HIST("number_of_events_data"), 3.5); + // Event multiplicity + const float multiplicity = collision.centFT0M(); + registryData.fill(HIST("number_of_events_vsmultiplicity"), multiplicity); + // v0 loop + int V0Numbers = 0; + for (const auto& v0 : fullV0s) { + const auto& pos = v0.posTrack_as(); + const auto& neg = v0.negTrack_as(); + TVector3 v0dir(v0.px(), v0.py(), v0.pz()); + if (passedLambdaSelection(v0, pos, neg)) { + V0Numbers = V0Numbers + 1; + registryData.fill(HIST("LambdaPtMass"), v0.pt(), v0.mLambda()); + } + if (passedAntiLambdaSelection(v0, pos, neg)) { + registryData.fill(HIST("AntiLambdaPtMass"), v0.pt(), v0.mAntiLambda()); + } + } + registryData.fill(HIST("nV0sPerEvent"), V0Numbers); + + // calculate lambda polarization induced by jet + + if (V0Numbers == 0) { + return; + } + if (maxJetpx == 0) { + return; + } + double protonsinPhiInJetV0frame = 0; + cout << maxJetpx << endl; + for (const auto& candidate : fullV0s) { + const auto& pos = candidate.posTrack_as(); + const auto& neg = candidate.negTrack_as(); + TVector3 v0dir(candidate.px(), candidate.py(), candidate.pz()); + + if (passedLambdaSelection(candidate, pos, neg)) { + registryData.fill(HIST("hMassLambda"), candidate.mLambda()); + registryData.fill(HIST("V0pTInLab"), candidate.pt()); + registryData.fill(HIST("V0pxInLab"), candidate.px()); + registryData.fill(HIST("V0pyInLab"), candidate.py()); + registryData.fill(HIST("V0pzInLab"), candidate.pz()); + registryData.fill(HIST("V0protonpxInLab"), pos.px()); + registryData.fill(HIST("V0protonpyInLab"), pos.py()); + registryData.fill(HIST("V0protonpzInLab"), pos.pz()); + + double PLambda = sqrt(candidate.px() * candidate.px() + candidate.py() * candidate.py() + candidate.pz() * candidate.pz()); + double ELambda = sqrt(candidate.mLambda() * candidate.mLambda() + PLambda * PLambda); + double protonE = sqrt(massPr * massPr + pos.px() * pos.px() + pos.py() * pos.py() + pos.pz() * pos.pz()); + + TMatrixD pLabV0(4, 1); + pLabV0(0, 0) = ELambda; + pLabV0(1, 0) = candidate.px(); + pLabV0(2, 0) = candidate.py(); + pLabV0(3, 0) = candidate.pz(); + + TMatrixD V0InV0(4, 1); + V0InV0 = LorentzTransInV0frame(ELambda, candidate.px(), candidate.py(), candidate.pz()) * pLabV0; + registryData.fill(HIST("V0pxInRest_frame"), V0InV0(1, 0)); + registryData.fill(HIST("V0pyInRest_frame"), V0InV0(2, 0)); + registryData.fill(HIST("V0pzInRest_frame"), V0InV0(3, 0)); + + double protonsinPhiInLab = candidate.py() / sqrt(candidate.px() * candidate.px() + candidate.py() * candidate.py()); + registryData.fill(HIST("V0protonphiInLab"), protonsinPhiInLab); + + TMatrixD lambdaInJet(4, 1); + lambdaInJet = MyTMatrixTranslationToJet(maxJetpx, maxJetpy, maxJetpz, candidate.px(), candidate.py(), candidate.pz()) * pLabV0; + + TMatrixD lambdaInJetV0(4, 1); + lambdaInJetV0 = LorentzTransInV0frame(ELambda, lambdaInJet(1, 0), lambdaInJet(2, 0), lambdaInJet(3, 0)) * MyTMatrixTranslationToJet(maxJetpx, maxJetpy, maxJetpz, candidate.px(), candidate.py(), candidate.pz()) * pLabV0; + registryData.fill(HIST("V0LambdapxInJetV0frame"), lambdaInJetV0(1, 0)); + registryData.fill(HIST("V0LambdapyInJetV0frame"), lambdaInJetV0(2, 0)); + registryData.fill(HIST("V0LambdapzInJetV0frame"), lambdaInJetV0(3, 0)); + + TMatrixD pLabproton(4, 1); + pLabproton(0, 0) = protonE; + pLabproton(1, 0) = pos.px(); + pLabproton(2, 0) = pos.py(); + pLabproton(3, 0) = pos.pz(); + + TMatrixD protonInV0(4, 1); + protonInV0 = LorentzTransInV0frame(ELambda, candidate.px(), candidate.py(), candidate.pz()) * pLabproton; + double protonMassInV0 = sqrt(protonInV0(0, 0) * protonInV0(0, 0) - protonInV0(1, 0) * protonInV0(1, 0) - protonInV0(2, 0) * protonInV0(2, 0) - protonInV0(3, 0) * protonInV0(3, 0)); + registryData.fill(HIST("V0protonMassInRest_frame"), protonMassInV0); + registryData.fill(HIST("V0protonpxInRest_frame"), protonInV0(1, 0)); + registryData.fill(HIST("V0protonpyInRest_frame"), protonInV0(2, 0)); + registryData.fill(HIST("V0protonpzInRest_frame"), protonInV0(3, 0)); + double protonsinPhiInV0frame = protonInV0(2, 0) / sqrt(protonInV0(1, 0) * protonInV0(1, 0) + protonInV0(2, 0) * protonInV0(2, 0)); + registryData.fill(HIST("V0protonphiInRest_frame"), protonsinPhiInV0frame); + + TMatrixD protonInJetV0(4, 1); + protonInJetV0 = LorentzTransInV0frame(ELambda, lambdaInJet(1, 0), lambdaInJet(2, 0), lambdaInJet(3, 0)) * MyTMatrixTranslationToJet(maxJetpx, maxJetpy, maxJetpz, candidate.px(), candidate.py(), candidate.pz()) * pLabproton; + registryData.fill(HIST("V0protonpxInJetV0frame"), protonInJetV0(1, 0)); + registryData.fill(HIST("V0protonpyInJetV0frame"), protonInJetV0(2, 0)); + registryData.fill(HIST("V0protonpzInJetV0frame"), protonInJetV0(3, 0)); + + double protonPinJetV0 = sqrt(protonInJetV0(1, 0) * protonInJetV0(1, 0) + protonInJetV0(2, 0) * protonInJetV0(2, 0) + protonInJetV0(3, 0) * protonInJetV0(3, 0)); + double protonPtinJetV0 = sqrt(protonInJetV0(1, 0) * protonInJetV0(1, 0) + protonInJetV0(2, 0) * protonInJetV0(2, 0)); + + double protonCosThetainJetV0 = protonInV0(3, 0) / protonPinJetV0; + double protonSinThetainJetV0 = protonPtinJetV0 / protonPinJetV0; + double protonthetainJetV0 = TMath::ASin(protonSinThetainJetV0); + registryV0Data.fill(HIST("hprotoncosthetainJetV0"), protonCosThetainJetV0); + registryV0Data.fill(HIST("hprotonsinthetainJetV0"), protonSinThetainJetV0); + registryV0Data.fill(HIST("hprotonthetainJetV0"), protonthetainJetV0); + registryV0Data.fill(HIST("hprotoncosSquarethetainJetV0"), protonCosThetainJetV0 * protonCosThetainJetV0); + + registryV0Data.fill(HIST("hLambdamassandSinthetainJetV0"), candidate.mLambda(), protonSinThetainJetV0); + registryV0Data.fill(HIST("hLambdamassandCosthetainJetV0"), candidate.mLambda(), protonCosThetainJetV0); + registryV0Data.fill(HIST("hLambdamassandCosSquarethetainJetV0"), candidate.mLambda(), protonCosThetainJetV0 * protonCosThetainJetV0); + + registryV0Data.fill(HIST("AverageSinthetainJetV0"), candidate.mLambda(), protonSinThetainJetV0); + registryV0Data.fill(HIST("AverageCosSquarethetainJetV0"), candidate.mLambda(), protonCosThetainJetV0 * protonCosThetainJetV0); + protonsinPhiInJetV0frame = protonsinPhiInJetV0frame + protonInJetV0(2, 0) / sqrt(protonInJetV0(1, 0) * protonInJetV0(1, 0) + protonInJetV0(2, 0) * protonInJetV0(2, 0)); + } + } + + for (const auto& candidate : fullV0s) { + const auto& pos = candidate.posTrack_as(); + const auto& neg = candidate.negTrack_as(); + if (passedLambdaSelection(candidate, pos, neg)) { + registryData.fill(HIST("hLambdamassandSinPhi"), candidate.mLambda(), protonsinPhiInJetV0frame / V0Numbers); + registryData.fill(HIST("hLambdaPhiandSinPhi"), TMath::ASin(protonsinPhiInJetV0frame / V0Numbers), protonsinPhiInJetV0frame / V0Numbers); + registryData.fill(HIST("V0LambdaprotonPhi"), TMath::ASin(protonsinPhiInJetV0frame / V0Numbers)); + registryData.fill(HIST("profileLambda"), candidate.mLambda(), protonsinPhiInJetV0frame / V0Numbers); + } + } + } + PROCESS_SWITCH(LfMyV0s, processData, "processData", true); + + void processDataV0(SelCollisions::iterator const& collision, aod::V0Datas const& fullV0s, StrHadronDaughterTracks const&) + { + registryData.fill(HIST("hNEvents"), 0.5); + if (!AcceptEvent(collision)) { + return; + } + + registryData.fill(HIST("hNEvents"), 8.5); + int V0NumbersPerEvent = 0; + int V0NumbersPerEventsel = 0; + for (const auto& v0 : fullV0s) { + V0NumbersPerEvent++; + float ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0; + float ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0Bar; + const auto& pos = v0.posTrack_as(); + const auto& neg = v0.negTrack_as(); + if (passedLambdaSelection(v0, pos, neg) && ctauLambda < CtauLambda && ifpasslambda) { + V0NumbersPerEventsel++; + registryV0Data.fill(HIST("hLambdaPt"), v0.pt()); + registryV0Data.fill(HIST("hMassVsPtLambda"), v0.pt(), v0.mLambda()); + registryV0Data.fill(HIST("hMassLambda"), v0.mLambda()); + } else if (passedInitLambdaSelection(v0, pos, neg) && ifinitpasslambda) { + registryV0Data.fill(HIST("hLambdaPt"), v0.pt()); + registryV0Data.fill(HIST("hMassVsPtLambda"), v0.pt(), v0.mLambda()); + registryV0Data.fill(HIST("hMassLambda"), v0.mLambda()); + double PLambda = sqrt(v0.px() * v0.px() + v0.py() * v0.py() + v0.pz() * v0.pz()); + double ELambda = sqrt(v0.mLambda() * v0.mLambda() + PLambda * PLambda); + double protonE = sqrt(massPr * massPr + pos.px() * pos.px() + pos.py() * pos.py() + pos.pz() * pos.pz()); + TMatrixD pLabproton(4, 1); + pLabproton(0, 0) = protonE; + pLabproton(1, 0) = pos.px(); + pLabproton(2, 0) = pos.py(); + pLabproton(3, 0) = pos.pz(); + double protonCosThetainLab = pLabproton(3, 0) / pos.p(); + double protonSinThetainLab = pos.pt() / pos.p(); + double protonthetainLab = TMath::ASin(protonSinThetainLab); + registryV0Data.fill(HIST("hprotoncosthetainLab"), protonCosThetainLab); + registryV0Data.fill(HIST("hprotonsinthetainLab"), protonSinThetainLab); + registryV0Data.fill(HIST("hprotonthetainLab"), protonthetainLab); + registryV0Data.fill(HIST("hprotoncosSquarethetainLab"), protonCosThetainLab * protonCosThetainLab); + + TMatrixD protonInV0(4, 1); + protonInV0 = LorentzTransInV0frame(ELambda, v0.px(), v0.py(), v0.pz()) * pLabproton; + double protonPinV0 = sqrt(protonInV0(1, 0) * protonInV0(1, 0) + protonInV0(2, 0) * protonInV0(2, 0) + protonInV0(3, 0) * protonInV0(3, 0)); + double protonPtinV0 = sqrt(protonInV0(1, 0) * protonInV0(1, 0) + protonInV0(2, 0) * protonInV0(2, 0)); + double protonCosThetainV0 = protonInV0(3, 0) / protonPinV0; + double protonSinThetainV0 = protonPtinV0 / protonPinV0; + double protonthetainV0 = TMath::ASin(protonSinThetainV0); + registryV0Data.fill(HIST("hprotoncosthetainV0"), protonCosThetainV0); + registryV0Data.fill(HIST("hprotonsinthetainV0"), protonSinThetainV0); + registryV0Data.fill(HIST("hprotonthetainV0"), protonthetainV0); + registryV0Data.fill(HIST("hprotoncosSquarethetainV0"), protonCosThetainV0 * protonCosThetainV0); + + registryV0Data.fill(HIST("hLambdamassandSinthetainV0"), v0.mLambda(), protonSinThetainV0); + registryV0Data.fill(HIST("hLambdamassandCosthetainV0"), v0.mLambda(), protonCosThetainV0); + registryV0Data.fill(HIST("hLambdamassandCosSquarethetainV0"), v0.mLambda(), protonCosThetainV0 * protonCosThetainV0); + + registryV0Data.fill(HIST("AverageSinthetainV0"), v0.mLambda(), protonSinThetainV0); + registryV0Data.fill(HIST("AverageCosSquarethetainV0"), v0.mLambda(), protonCosThetainV0 * protonCosThetainV0); + } + if (passedAntiLambdaSelection(v0, pos, neg) && ctauAntiLambda < CtauLambda && ifpasslambda) { + registryV0Data.fill(HIST("hAntiLambdaPt"), v0.pt()); + registryV0Data.fill(HIST("hMassVsPtAntiLambda"), v0.pt(), v0.mAntiLambda()); + registryV0Data.fill(HIST("hMassAntiLambda"), v0.mAntiLambda()); + } else if (passedInitLambdaSelection(v0, pos, neg) && ifinitpasslambda) { + registryV0Data.fill(HIST("hAntiLambdaPt"), v0.pt()); + registryV0Data.fill(HIST("hMassVsPtAntiLambda"), v0.pt(), v0.mAntiLambda()); + registryV0Data.fill(HIST("hMassAntiLambda"), v0.mAntiLambda()); + } + } + registryV0Data.fill(HIST("nV0sPerEvent"), V0NumbersPerEvent); + registryV0Data.fill(HIST("nV0sPerEventsel"), V0NumbersPerEventsel); + } + PROCESS_SWITCH(LfMyV0s, processDataV0, "processDataV0", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc, TaskName{"lf-my-v0s"}), }; } From b8845a5af7916eea58d30826eb6222fc3cf7bf56 Mon Sep 17 00:00:00 2001 From: prottayCMT <61418725+prottayCMT@users.noreply.github.com> Date: Fri, 9 May 2025 18:05:33 +0200 Subject: [PATCH 1236/1650] [PWGLF] added RCT flags (#11149) Co-authored-by: Prottay Das --- PWGLF/Tasks/Strangeness/lambdapolsp.cxx | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/PWGLF/Tasks/Strangeness/lambdapolsp.cxx b/PWGLF/Tasks/Strangeness/lambdapolsp.cxx index 3aab9460e44..270415766a0 100644 --- a/PWGLF/Tasks/Strangeness/lambdapolsp.cxx +++ b/PWGLF/Tasks/Strangeness/lambdapolsp.cxx @@ -63,6 +63,7 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; using std::array; +using namespace o2::aod::rctsel; using dauTracks = soa::Join; using v0Candidates = soa::Join; @@ -151,12 +152,23 @@ struct lambdapolsp { ConfigurableAxis configthnAxisPol{"configthnAxisPol", {VARIABLE_WIDTH, -1.0, -0.6, -0.2, 0, 0.2, 0.4, 0.8}, "Pol"}; ConfigurableAxis configbinAxis{"configbinAxis", {VARIABLE_WIDTH, -0.8, -0.4, -0.2, 0, 0.2, 0.4, 0.8}, "BA"}; // ConfigurableAxis configphiAxis{"configphiAxis", {VARIABLE_WIDTH, 0.0, 0.2, 0.4, 0.8, 1.0, 2.0, 2.5, 3.0, 4.0, 5.0, 5.5, 6.28}, "PhiAxis"}; + struct : ConfigurableGroup { + Configurable requireRCTFlagChecker{"requireRCTFlagChecker", true, "Check event quality in run condition table"}; + Configurable cfgEvtRCTFlagCheckerLabel{"cfgEvtRCTFlagCheckerLabel", "CBT_hadronPID", "Evt sel: RCT flag checker label"}; + Configurable cfgEvtRCTFlagCheckerZDCCheck{"cfgEvtRCTFlagCheckerZDCCheck", true, "Evt sel: RCT flag checker ZDC check"}; + Configurable cfgEvtRCTFlagCheckerLimitAcceptAsBad{"cfgEvtRCTFlagCheckerLimitAcceptAsBad", false, "Evt sel: RCT flag checker treat Limited Acceptance As Bad"}; + } rctCut; + + RCTFlagsChecker rctChecker; SliceCache cache; HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; void init(o2::framework::InitContext&) { + + rctChecker.init(rctCut.cfgEvtRCTFlagCheckerLabel, rctCut.cfgEvtRCTFlagCheckerZDCCheck, rctCut.cfgEvtRCTFlagCheckerLimitAcceptAsBad); + AxisSpec thnAxisres{resNbins, lbinres, hbinres, "Reso"}; AxisSpec thnAxisInvMass{IMNbins, lbinIM, hbinIM, "#it{M} (GeV/#it{c}^{2})"}; AxisSpec thnAxisCosThetaStar{SANbins, lbinSA, hbinSA, "SA"}; @@ -677,6 +689,9 @@ struct lambdapolsp { return; } + if (rctCut.requireRCTFlagChecker && !rctChecker(collision)) { + return; + } // currentRunNumber = collision.foundBC_as().runNumber(); auto bc = collision.foundBC_as(); From 171c55d0688361ac24d53e7d92fdc74ea11ee324 Mon Sep 17 00:00:00 2001 From: Preet-Bhanjan Date: Fri, 9 May 2025 19:41:38 +0200 Subject: [PATCH 1237/1650] [PWGCF] Addition of extra event selections (#11148) Co-authored-by: Preet Pati --- PWGCF/Flow/Tasks/flowPbpbPikp.cxx | 338 +++++++++++++++++++++++------- 1 file changed, 257 insertions(+), 81 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowPbpbPikp.cxx b/PWGCF/Flow/Tasks/flowPbpbPikp.cxx index a70ab3a32c6..cdcf3b553c8 100644 --- a/PWGCF/Flow/Tasks/flowPbpbPikp.cxx +++ b/PWGCF/Flow/Tasks/flowPbpbPikp.cxx @@ -74,9 +74,7 @@ struct FlowPbpbPikp { O2_DEFINE_CONFIGURABLE(cfgCutEta, float, 0.8f, "Eta range for tracks") O2_DEFINE_CONFIGURABLE(cfgTpcCluster, int, 70, "Number of TPC clusters") O2_DEFINE_CONFIGURABLE(cfgCutChi2prTPCcls, float, 2.5, "Chi2 per TPC clusters") - O2_DEFINE_CONFIGURABLE(cfgUseNch, bool, false, "Use Nch for flow observables") O2_DEFINE_CONFIGURABLE(cfgNbootstrap, int, 10, "Number of subsamples") - O2_DEFINE_CONFIGURABLE(cfgFillWeights, bool, true, "Fill NUA weights") O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeights, bool, true, "Fill and output NUA weights") O2_DEFINE_CONFIGURABLE(cfgOutputRunByRun, bool, true, "Fill and output NUA weights run by run") O2_DEFINE_CONFIGURABLE(cfgEfficiency, std::string, "", "CCDB path to efficiency object") @@ -86,25 +84,28 @@ struct FlowPbpbPikp { O2_DEFINE_CONFIGURABLE(cfgCutDCAxy, float, 2.0f, "DCAxy range for tracks") O2_DEFINE_CONFIGURABLE(cfgCutDCAz, float, 2.0f, "DCAz range for tracks") - O2_DEFINE_CONFIGURABLE(cfgCutOccupancy, int, 3000, "Occupancy cut") + O2_DEFINE_CONFIGURABLE(cfgCutOccupancyMin, int, 0, "Minimum occupancy cut") + O2_DEFINE_CONFIGURABLE(cfgCutOccupancyMax, int, 2000, "Maximum occupancy cut") O2_DEFINE_CONFIGURABLE(cfgUseGlobalTrack, bool, true, "use Global track") - O2_DEFINE_CONFIGURABLE(cfgITScluster, int, 0, "Number of ITS cluster") + O2_DEFINE_CONFIGURABLE(cfgITScluster, int, 5, "Number of ITS cluster") O2_DEFINE_CONFIGURABLE(cfgTrackDensityCorrUse, bool, true, "Use track density efficiency correction") O2_DEFINE_CONFIGURABLE(cfgUseWeightPhiEtaVtxz, bool, false, "Use Phi, Eta, VertexZ dependent NUA weights") O2_DEFINE_CONFIGURABLE(cfgUseWeightPhiPtCent, bool, false, "Use Phi, Pt, Centrality dependent NUA weights") O2_DEFINE_CONFIGURABLE(cfgUseWeightPhiEtaPt, bool, true, "Use Phi, Eta, Pt dependent NUA weights") O2_DEFINE_CONFIGURABLE(cfgUseStrictPID, bool, true, "Use strict PID cuts for TPC") + O2_DEFINE_CONFIGURABLE(cfgV0AT0Acut, int, 5, "V0AT0A cut") Configurable> cfgTrackDensityP0{"cfgTrackDensityP0", std::vector{0.7217476707, 0.7384792571, 0.7542625668, 0.7640680200, 0.7701951667, 0.7755299053, 0.7805901710, 0.7849446786, 0.7957356586, 0.8113039262, 0.8211968966, 0.8280558878, 0.8329342135}, "parameter 0 for track density efficiency correction"}; Configurable> cfgTrackDensityP1{"cfgTrackDensityP1", std::vector{-2.169488e-05, -2.191913e-05, -2.295484e-05, -2.556538e-05, -2.754463e-05, -2.816832e-05, -2.846502e-05, -2.843857e-05, -2.705974e-05, -2.477018e-05, -2.321730e-05, -2.203315e-05, -2.109474e-05}, "parameter 1 for track density efficiency correction"}; - Configurable> cfgTofNsigmaCut{"cfgTofNsigmaCut", std::vector{1.5, 1.5, 1.5}, "TOF n-sigma cut for pions, kaons, protons"}; Configurable> cfgItsNsigmaCut{"cfgItsNsigmaCut", std::vector{3, 2.5, 2}, "ITS n-sigma cut for pions, kaons, protons"}; + Configurable> cfgUseEventCuts{"cfgUseEventCuts", std::vector{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, "Switch for various event cuts [kNoTimeFrameBorder, kNoITSROFrameBorder, kNoSameBunchPileup, kIsGoodZvtxFT0vsPV, kNoCollInTimeRangeStandard, kIsGoodITSLayersAll, kNoCollInRofStandard, kNoHighMultCollInPrevRof, Occupancy, Multiplicity correlation, T0AV0A 3 sigma cut, kIsVertexITSTPC, kTVXinTRD]"}; + ConfigurableAxis axisVertex{"axisVertex", {20, -10, 10}, "vertex axis for histograms"}; ConfigurableAxis axisPhi{"axisPhi", {60, 0.0, constants::math::TwoPI}, "phi axis for histograms"}; - ConfigurableAxis axisEta{"axisEta", {40, -1., 1.}, "eta axis for histograms"}; + ConfigurableAxis axisEta{"axisEta", {16, -0.8, 0.8}, "eta axis for histograms"}; ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.20, 0.30, 0.40, 0.50, 0.60, 0.70, 0.80, 0.90, 1.00, 1.20, 1.40, 1.60, 1.80, 2.00, 2.20, 2.40, 2.60, 2.80, 3.00, 3.50, 4.00, 5.00, 6.00, 8.00, 10.00}, "pt axis for histograms"}; ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90}, "centrality axis for histograms"}; ConfigurableAxis axisNsigmaTPC{"axisNsigmaTPC", {80, -5, 5}, "nsigmaTPC axis"}; @@ -138,18 +139,46 @@ struct FlowPbpbPikp { hProton, kCount_OutputSpecies }; + + enum EventCutTypes { + useNoTimeFrameBorder = 0, + useNoITSROFrameBorder, + useNoSameBunchPileup, + useGoodZvtxFT0vsPV, + useNoCollInTimeRangeStandard, + useGoodITSLayersAll, + useNoCollInRofStandard, + useNoHighMultCollInPrevRof, + useOccupancy, + useMultCorrCut, + useT0AV0ACut, + useVertexITSTPC, + useTVXinTRD + }; + + std::vector eventCuts = cfgUseEventCuts; + int lastRunNumer = -1; std::vector runNumbers; std::vector mAcceptance; bool correctionsLoaded = false; - // local track density correction + // Local track density correction - Copy from flowTask.cxx std::vector funcEff; TH1D* hFindPtBin; TF1* funcV2; TF1* funcV3; TF1* funcV4; + // Additional Event selection cuts - Copy from flowGenericFramework.cxx + TF1* fMultPVCutLow = nullptr; + TF1* fMultPVCutHigh = nullptr; + TF1* fMultCutLow = nullptr; + TF1* fMultCutHigh = nullptr; + TF1* fMultMultPVCut = nullptr; + TF1* fT0AV0AMean = nullptr; + TF1* fT0AV0ASigma = nullptr; + void init(InitContext const&) { ccdb->setURL(ccdbUrl.value); @@ -179,26 +208,63 @@ struct FlowPbpbPikp { histos.add("c24_full_pi", "", {HistType::kTProfile, {axisMultiplicity}}); histos.add("c24_full_ka", "", {HistType::kTProfile, {axisMultiplicity}}); histos.add("c24_full_pr", "", {HistType::kTProfile, {axisMultiplicity}}); - histos.add("TofTpcNsigma", "", {HistType::kTHnSparseD, {{axisParticles, axisNsigmaTPC, axisNsigmaTOF, axisPt}}}); + histos.add("TofTpcNsigma_before", "", {HistType::kTHnSparseD, {{axisParticles, axisNsigmaTPC, axisNsigmaTOF, axisPt}}}); + histos.add("TofTpcNsigma_after", "", {HistType::kTHnSparseD, {{axisParticles, axisNsigmaTPC, axisNsigmaTOF, axisPt}}}); histos.add("partCount", "", {HistType::kTHnSparseD, {{axisParticles, axisMultiplicity, axisPt}}}); - if (cfgOutputNUAWeights && !cfgOutputRunByRun) { - histos.add("NUA/hPhiEtaVtxz_ref", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); - histos.add("NUA/hPhiEtaVtxz_ch", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); - histos.add("NUA/hPhiEtaVtxz_pi", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); - histos.add("NUA/hPhiEtaVtxz_ka", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); - histos.add("NUA/hPhiEtaVtxz_pr", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); - histos.add("NUA/hPhiPtCent_ref", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, axisPt, {20, 0, 100}}}); - histos.add("NUA/hPhiPtCent_ch", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, axisPt, {20, 0, 100}}}); - histos.add("NUA/hPhiPtCent_pi", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, axisPt, {20, 0, 100}}}); - histos.add("NUA/hPhiPtCent_ka", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, axisPt, {20, 0, 100}}}); - histos.add("NUA/hPhiPtCent_pr", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, axisPt, {20, 0, 100}}}); + histos.add("hEventCount", "Number of Event;; Count", {HistType::kTH1D, {{15, 0, 15}}}); + histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(1, "Filtered event"); + histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(2, "After sel8"); + histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(3, "kNoTimeFrameBorder"); + histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(4, "kNoITSROFrameBorder"); + histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(5, "kNoSameBunchPileup"); + histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(6, "kIsGoodZvtxFT0vsPV"); + histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(7, "kNoCollInTimeRangeStandard"); + histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(8, "kIsGoodITSLayersAll"); + histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(9, "kNoCollInRofStandard"); + histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(10, "kNoHighMultCollInPrevRof"); + histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(11, "Occupancy Cut"); + histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(12, "Multiplicity correlation Cut"); + histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(13, "T0AV0A cut"); + histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(14, "kIsVertexITSTPC"); + histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(15, "kTVXinTRD"); + + if (cfgOutputNUAWeights && !cfgOutputRunByRun) { + histos.add("NUA/hPhiEtaVtxz_ref", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, axisEta, axisVertex}}); + histos.add("NUA/hPhiEtaVtxz_ch", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, axisEta, axisVertex}}); + histos.add("NUA/hPhiEtaVtxz_pi", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, axisEta, axisVertex}}); + histos.add("NUA/hPhiEtaVtxz_ka", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, axisEta, axisVertex}}); + histos.add("NUA/hPhiEtaVtxz_pr", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, axisEta, axisVertex}}); + + histos.add("NUA/hPhiPtCent_ref", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, axisPt, axisMultiplicity}}); + histos.add("NUA/hPhiPtCent_ch", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, axisPt, axisMultiplicity}}); + histos.add("NUA/hPhiPtCent_pi", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, axisPt, axisMultiplicity}}); + histos.add("NUA/hPhiPtCent_ka", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, axisPt, axisMultiplicity}}); + histos.add("NUA/hPhiPtCent_pr", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, axisPt, axisMultiplicity}}); + + histos.add("NUA/hPhiEtaPt_ref", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, axisEta, axisPt}}); + histos.add("NUA/hPhiEtaPt_ch", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, axisEta, axisPt}}); + histos.add("NUA/hPhiEtaPt_pi", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, axisEta, axisPt}}); + histos.add("NUA/hPhiEtaPt_ka", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, axisEta, axisPt}}); + histos.add("NUA/hPhiEtaPt_pr", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, axisEta, axisPt}}); + } - histos.add("NUA/hPhiEtaPt_ref", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, axisPt}}); - histos.add("NUA/hPhiEtaPt_ch", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, axisPt}}); - histos.add("NUA/hPhiEtaPt_pi", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, axisPt}}); - histos.add("NUA/hPhiEtaPt_ka", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, axisPt}}); - histos.add("NUA/hPhiEtaPt_pr", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, axisPt}}); + if (!cfgAcceptance.value.empty()) { + if (cfgUseWeightPhiEtaVtxz) { + histos.add("PhiCorrected/hPhiEtaVtxz_pi_corrd", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, axisEta, axisVertex}}); + histos.add("PhiCorrected/hPhiEtaVtxz_ka_corrd", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, axisEta, axisVertex}}); + histos.add("PhiCorrected/hPhiEtaVtxz_pr_corrd", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, axisEta, axisVertex}}); + } + if (cfgUseWeightPhiPtCent) { + histos.add("PhiCorrected/hPhiPtCent_pi_corrd", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, axisPt, axisMultiplicity}}); + histos.add("PhiCorrected/hPhiPtCent_ka_corrd", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, axisPt, axisMultiplicity}}); + histos.add("PhiCorrected/hPhiPtCent_pr_corrd", ";#varphi;p_{T};Cent", {HistType::kTH3D, {axisPhi, axisPt, axisMultiplicity}}); + } + if (cfgUseWeightPhiEtaPt) { + histos.add("PhiCorrected/hPhiEtaPt_pi_corrd", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, axisEta, axisPt}}); + histos.add("PhiCorrected/hPhiEtaPt_ka_corrd", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, axisEta, axisPt}}); + histos.add("PhiCorrected/hPhiEtaPt_pr_corrd", ";#varphi;#eta;p_{T}", {HistType::kTH3D, {axisPhi, axisEta, axisPt}}); + } } o2::framework::AxisSpec axis = axisPt; @@ -350,6 +416,24 @@ struct FlowPbpbPikp { fGFW->CreateRegions(); + if (eventCuts[useMultCorrCut]) { + fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x - 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); + fMultPVCutLow->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); + fMultPVCutHigh = new TF1("fMultPVCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x + 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); + fMultPVCutHigh->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); + + fMultCutLow = new TF1("fMultCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x - 2.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); + fMultCutLow->SetParameters(1654.46, -47.2379, 0.449833, -0.0014125, 150.773, -3.67334, 0.0530503, -0.000614061, 3.15956e-06); + fMultCutHigh = new TF1("fMultCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x + 3.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); + fMultCutHigh->SetParameters(1654.46, -47.2379, 0.449833, -0.0014125, 150.773, -3.67334, 0.0530503, -0.000614061, 3.15956e-06); + } + if (eventCuts[useT0AV0ACut]) { + fT0AV0AMean = new TF1("fT0AV0AMean", "[0]+[1]*x", 0, 200000); + fT0AV0AMean->SetParameters(-1601.0581, 9.417652e-01); + fT0AV0ASigma = new TF1("fT0AV0ASigma", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 200000); + fT0AV0ASigma->SetParameters(463.4144, 6.796509e-02, -9.097136e-07, 7.971088e-12, -2.600581e-17); + } + if (cfgTrackDensityCorrUse) { std::vector pTEffBins = {0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.4, 1.8, 2.2, 2.6, 3.0}; hFindPtBin = new TH1D("hFindPtBin", "hFindPtBin", pTEffBins.size() - 1, &pTEffBins[0]); @@ -388,6 +472,41 @@ struct FlowPbpbPikp { return true; } + template + void fillQA(const TCollision collision, const TTrack track, int pidIndex, double wacc) + { + histos.fill(HIST("partCount"), pidIndex - 1, collision.centFT0C(), track.pt()); + switch (pidIndex) { + case 1: + histos.fill(HIST("TofTpcNsigma_after"), pidIndex - 1, track.tpcNSigmaPi(), track.tofNSigmaPi(), track.pt()); + if (!cfgAcceptance.value.empty() && cfgUseWeightPhiEtaVtxz) + histos.fill(HIST("PhiCorrected/hPhiEtaVtxz_pi_corrd"), track.phi(), track.eta(), collision.posZ(), wacc); // pion weights + if (!cfgAcceptance.value.empty() && cfgUseWeightPhiPtCent) + histos.fill(HIST("PhiCorrected/hPhiPtCent_pi_corrd"), track.phi(), track.pt(), collision.centFT0C(), wacc); + if (!cfgAcceptance.value.empty() && cfgUseWeightPhiEtaPt) + histos.fill(HIST("PhiCorrected/hPhiEtaPt_pi_corrd"), track.phi(), track.eta(), track.pt(), wacc); + break; + case 2: + histos.fill(HIST("TofTpcNsigma_after"), pidIndex - 1, track.tpcNSigmaKa(), track.tofNSigmaKa(), track.pt()); + if (!cfgAcceptance.value.empty() && cfgUseWeightPhiEtaVtxz) + histos.fill(HIST("PhiCorrected/hPhiEtaVtxz_ka_corrd"), track.phi(), track.eta(), collision.posZ(), wacc); // kaon weights + if (!cfgAcceptance.value.empty() && cfgUseWeightPhiPtCent) + histos.fill(HIST("PhiCorrected/hPhiPtCent_ka_corrd"), track.phi(), track.pt(), collision.centFT0C(), wacc); + if (!cfgAcceptance.value.empty() && cfgUseWeightPhiEtaPt) + histos.fill(HIST("PhiCorrected/hPhiEtaPt_ka_corrd"), track.phi(), track.eta(), track.pt(), wacc); + break; + case 3: + histos.fill(HIST("TofTpcNsigma_after"), pidIndex - 1, track.tpcNSigmaPr(), track.tofNSigmaPr(), track.pt()); + if (!cfgAcceptance.value.empty() && cfgUseWeightPhiEtaVtxz) + histos.fill(HIST("PhiCorrected/hPhiEtaVtxz_pr_corrd"), track.phi(), track.eta(), collision.posZ(), wacc); // proton weights + if (!cfgAcceptance.value.empty() && cfgUseWeightPhiPtCent) + histos.fill(HIST("PhiCorrected/hPhiPtCent_pr_corrd"), track.phi(), track.pt(), collision.centFT0C(), wacc); + if (!cfgAcceptance.value.empty() && cfgUseWeightPhiEtaPt) + histos.fill(HIST("PhiCorrected/hPhiEtaPt_pr_corrd"), track.phi(), track.eta(), track.pt(), wacc); + break; + } // end of switch + } // end of fillQA + template int getNsigmaPIDTpcTof(TTrack track) { @@ -399,7 +518,7 @@ struct FlowPbpbPikp { // Choose which nSigma to use std::array nSigmaToUse = (track.pt() > cfgTofPtCut && track.hasTOF()) ? nSigmaCombined : nSigmaTPC; - if (track.pt() >= cfgTofPtCut && !track.hasTOF()) + if (track.pt() > cfgTofPtCut && !track.hasTOF()) return -1; const int numSpecies = 3; @@ -419,45 +538,6 @@ struct FlowPbpbPikp { return pid + 1; // shift the pid by 1, 1 = pion, 2 = kaon, 3 = proton } - /*template - std::pair getBayesID(TTrack track) - { - std::array bayesprobs = {static_cast(track.bayesPi()), static_cast(track.bayesKa()), static_cast(track.bayesPr())}; - int bayesid = -1; - int prob = 0; - - const int nParts = 3; - const int bayesCut = 80; - for (int i = 0; i < nParts; ++i) { - if (bayesprobs[i] > prob && bayesprobs[i] > bayesCut) { - bayesid = i; - prob = bayesprobs[i]; - } - } - return std::make_pair(bayesid, prob); - } - - template - int getBayesPIDIndex(TTrack track) - { - int maxProb[3] = {80, 80, 80}; - int pidID = -1; - const int nParts = 3; - std::pair idprob = getBayesID(track); - if (idprob.first == PIONS || idprob.first == KAONS || idprob.first == PROTONS) { // 0 = pion, 1 = kaon, 2 = proton - pidID = idprob.first; - float nsigmaTPC[3] = {track.tpcNSigmaPi(), track.tpcNSigmaKa(), track.tpcNSigmaPr()}; - if (idprob.second > maxProb[pidID]) { - if (std::fabs(nsigmaTPC[pidID]) > nParts) - return 0; - return pidID + 1; // shift the pid by 1, 1 = pion, 2 = kaon, 3 = proton - } else { - return 0; - } - } - return 0; - }*/ - template void fillProfile(const GFW::CorrConfig& corrconf, const ConstStr& tarName, const double& cent) { @@ -511,11 +591,11 @@ struct FlowPbpbPikp { { if (cfgOutputNUAWeights) { std::vector> tH3s(kCount_OutputSpecies); - tH3s[hRef] = histos.add(Form("NUA/%d/hPhiEtaVtxz_ref", runNumber), ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); - tH3s[hCharge] = histos.add(Form("NUA/%d/hPhiEtaVtxz_ch", runNumber), ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); - tH3s[hPion] = histos.add(Form("NUA/%d/hPhiEtaVtxz_pi", runNumber), ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); - tH3s[hKaon] = histos.add(Form("NUA/%d/hPhiEtaVtxz_ka", runNumber), ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); - tH3s[hProton] = histos.add(Form("NUA/%d/hPhiEtaVtxz_pr", runNumber), ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, {64, -1.6, 1.6}, {40, -10, 10}}}); + tH3s[hRef] = histos.add(Form("NUA/%d/hPhiEtaVtxz_ref", runNumber), ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, axisEta, axisVertex}}); + tH3s[hCharge] = histos.add(Form("NUA/%d/hPhiEtaVtxz_ch", runNumber), ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, axisEta, axisVertex}}); + tH3s[hPion] = histos.add(Form("NUA/%d/hPhiEtaVtxz_pi", runNumber), ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, axisEta, axisVertex}}); + tH3s[hKaon] = histos.add(Form("NUA/%d/hPhiEtaVtxz_ka", runNumber), ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, axisEta, axisVertex}}); + tH3s[hProton] = histos.add(Form("NUA/%d/hPhiEtaVtxz_pr", runNumber), ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, axisEta, axisVertex}}); th3sList.insert(std::make_pair(runNumber, tH3s)); } } @@ -639,22 +719,118 @@ struct FlowPbpbPikp { } } + template + bool selectionEvent(TCollision collision, const int mult, const float cent) + { + histos.fill(HIST("hEventCount"), 0.5); + if (!collision.sel8()) { + return 0; + } + histos.fill(HIST("hEventCount"), 1.5); + + if (eventCuts[useNoTimeFrameBorder] && !collision.selection_bit(aod::evsel::kNoTimeFrameBorder)) { + return 0; + } + if (eventCuts[useNoTimeFrameBorder]) + histos.fill(HIST("hEventCount"), 2.5); + + if (eventCuts[useNoITSROFrameBorder] && !collision.selection_bit(aod::evsel::kNoITSROFrameBorder)) { + return 0; + } + if (eventCuts[useNoITSROFrameBorder]) + histos.fill(HIST("hEventCount"), 3.5); + + if (eventCuts[useNoSameBunchPileup] && !collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { + return 0; + } + if (eventCuts[useNoSameBunchPileup]) + histos.fill(HIST("hEventCount"), 4.5); + + if (eventCuts[useGoodZvtxFT0vsPV] && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { + return 0; + } + if (eventCuts[useGoodZvtxFT0vsPV]) + histos.fill(HIST("hEventCount"), 5.5); + + if (eventCuts[useNoCollInTimeRangeStandard] && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + return 0; + } + if (eventCuts[useNoCollInTimeRangeStandard]) + histos.fill(HIST("hEventCount"), 6.5); + + if (eventCuts[useGoodITSLayersAll] && !collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + return 0; + } + if (eventCuts[useGoodITSLayersAll]) + histos.fill(HIST("hEventCount"), 7.5); + + if (eventCuts[useNoCollInRofStandard] && !collision.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { + return 0; + } + if (eventCuts[useNoCollInRofStandard]) + histos.fill(HIST("hEventCount"), 8.5); + + if (eventCuts[useNoHighMultCollInPrevRof] && !collision.selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof)) { + return 0; + } + if (eventCuts[useNoHighMultCollInPrevRof]) + histos.fill(HIST("hEventCount"), 9.5); + + auto multNTracksPV = collision.multNTracksPV(); + auto occupancy = collision.trackOccupancyInTimeRange(); + + if (eventCuts[useOccupancy] && (occupancy < cfgCutOccupancyMin || occupancy > cfgCutOccupancyMax)) { + return 0; + } + if (eventCuts[useOccupancy]) + histos.fill(HIST("hEventCount"), 10.5); + + if (eventCuts[useMultCorrCut]) { + if (multNTracksPV < fMultPVCutLow->Eval(cent)) + return 0; + if (multNTracksPV > fMultPVCutHigh->Eval(cent)) + return 0; + if (mult < fMultCutLow->Eval(cent)) + return 0; + if (mult > fMultCutHigh->Eval(cent)) + return 0; + } + if (eventCuts[useMultCorrCut]) + histos.fill(HIST("hEventCount"), 11.5); + + // V0A T0A 5 sigma cut + if (eventCuts[useT0AV0ACut] && (std::fabs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > cfgV0AT0Acut * fT0AV0ASigma->Eval(collision.multFT0A()))) + return 0; + if (eventCuts[useT0AV0ACut]) + histos.fill(HIST("hEventCount"), 12.5); + + if (eventCuts[useVertexITSTPC] && !collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) + return 0; + if (eventCuts[useVertexITSTPC]) + histos.fill(HIST("hEventCount"), 13.5); + + if (eventCuts[useTVXinTRD] && collision.alias_bit(kTVXinTRD)) { + return 0; + } + if (eventCuts[useTVXinTRD]) + histos.fill(HIST("hEventCount"), 14.5); + + return 1; + } + void process(AodCollisions::iterator const& collision, aod::BCsWithTimestamps const&, AodTracksWithoutBayes const& tracks) { int nTot = tracks.size(); if (nTot < 1) return; - if (!collision.sel8() || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(aod::evsel::kNoITSROFrameBorder) || !collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV) || !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) - return; - - int occupancy = collision.trackOccupancyInTimeRange(); - if (occupancy > cfgCutOccupancy) - return; - float lRandom = fRndm->Rndm(); float vtxz = collision.posZ(); const auto cent = collision.centFT0C(); + + if (!selectionEvent(collision, nTot, cent)) + return; + auto bc = collision.bc_as(); int runNumber = bc.runNumber(); if (cfgOutputRunByRun && runNumber != lastRunNumer) { @@ -709,19 +885,19 @@ struct FlowPbpbPikp { for (auto const& track : tracks) { if (!selectionTrack(track)) continue; + double pt = track.pt(); histos.fill(HIST("hPhi"), track.phi()); histos.fill(HIST("hEta"), track.eta()); histos.fill(HIST("hPt"), pt); - histos.fill(HIST("TofTpcNsigma"), PIONS, track.tpcNSigmaPi(), track.tofNSigmaPi(), pt); - histos.fill(HIST("TofTpcNsigma"), KAONS, track.tpcNSigmaKa(), track.tofNSigmaKa(), pt); - histos.fill(HIST("TofTpcNsigma"), PROTONS, track.tpcNSigmaPr(), track.tofNSigmaPr(), pt); + histos.fill(HIST("TofTpcNsigma_before"), PIONS, track.tpcNSigmaPi(), track.tofNSigmaPi(), pt); + histos.fill(HIST("TofTpcNsigma_before"), KAONS, track.tpcNSigmaKa(), track.tofNSigmaKa(), pt); + histos.fill(HIST("TofTpcNsigma_before"), PROTONS, track.tpcNSigmaPr(), track.tofNSigmaPr(), pt); bool withinPtPOI = (cfgCutPtPOIMin < pt) && (pt < cfgCutPtPOIMax); // within POI pT range bool withinPtRef = (cfgCutPtMin < pt) && (pt < cfgCutPtMax); // within RF pT range - // pidIndex = getBayesPIDIndex(track); pidIndex = getNsigmaPIDTpcTof(track); weff = 1; // Initializing weff for each track @@ -762,7 +938,7 @@ struct FlowPbpbPikp { } if (pidIndex) { - histos.fill(HIST("partCount"), pidIndex - 1, cent, pt); + fillQA(collision, track, pidIndex, waccPOI); if (withinPtPOI) fGFW->Fill(track.eta(), fPtAxis->FindBin(pt) - 1, track.phi(), waccPOI * weff, 1 << (pidIndex)); if (withinPtPOI && withinPtRef) From 067e4353622113d88cae69826b4799a60f3369b1 Mon Sep 17 00:00:00 2001 From: tutripat <73981392+tutripat@users.noreply.github.com> Date: Fri, 9 May 2025 20:53:40 +0200 Subject: [PATCH 1238/1650] [PWGLF] New control histograms for normalization in MFT analysis (#11150) Co-authored-by: Tulika Tripathy Co-authored-by: ALICE Action Bot --- .../GlobalEventProperties/dndeta-mft-pp.cxx | 102 +++++++++++++----- 1 file changed, 74 insertions(+), 28 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/dndeta-mft-pp.cxx b/PWGLF/Tasks/GlobalEventProperties/dndeta-mft-pp.cxx index b168c1d2abc..c16b10edadd 100644 --- a/PWGLF/Tasks/GlobalEventProperties/dndeta-mft-pp.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/dndeta-mft-pp.cxx @@ -162,6 +162,18 @@ struct PseudorapidityDensityMFT { registry.add({"EventsNtrkZvtx_gt0", "; N_{trk}; #it{z}_{vtx} (cm); events", {HistType::kTH2F, {MultAxis, ZAxis}}}); + registry.add({"Tracks/2Danalysis/EventsNtrkZvtx_all", + "; N_{trk}; #it{z}_{vtx} (cm); events", + {HistType::kTH2F, {MultAxis, ZAxis}}}); + registry.add({"Tracks/2Danalysis/EventsNtrkZvtx_sel8", + "; N_{trk}; #it{z}_{vtx} (cm); events", + {HistType::kTH2F, {MultAxis, ZAxis}}}); + registry.add({"Tracks/2Danalysis/EventsNtrkZvtx_sel8_inelgt0", + "; N_{trk}; #it{z}_{vtx} (cm); events", + {HistType::kTH2F, {MultAxis, ZAxis}}}); + registry.add({"Tracks/2Danalysis/EventsNtrkZvtx_sel8_inelfwdgt0", + "; N_{trk}; #it{z}_{vtx} (cm); events", + {HistType::kTH2F, {MultAxis, ZAxis}}}); registry.add({"Tracks/Control/DCAXY", " ; DCA_{XY} (cm)", {HistType::kTH1F, {DCAxyAxis}}}); @@ -319,7 +331,18 @@ struct PseudorapidityDensityMFT { registry.add({"Tracks/Control/woOrp/woOrpEtaZvtx_gt0", "; #eta; #it{z}_{vtx} (cm); tracks", {HistType::kTH2F, {EtaAxis, ZAxis}}}); // - + registry.add({"Tracks/2Danalysis/EtaZvtx", + "; #eta; #it{z}_{vtx} (cm); tracks", + {HistType::kTH2F, {EtaAxis, ZAxis}}}); // + registry.add({"Tracks/2Danalysis/EtaZvtx_sel8", + "; #eta; #it{z}_{vtx} (cm); tracks", + {HistType::kTH2F, {EtaAxis, ZAxis}}}); // + registry.add({"Tracks/2Danalysis/EtaZvtx_sel8_inelgt0", + "; #eta; #it{z}_{vtx} (cm); tracks", + {HistType::kTH2F, {EtaAxis, ZAxis}}}); // + registry.add({"Tracks/2Danalysis/EtaZvtx_sel8_inelfwdgt0", + "; #eta; #it{z}_{vtx} (cm); tracks", + {HistType::kTH2F, {EtaAxis, ZAxis}}}); // registry.add({"Tracks/Control/woOrp/woOrpTracksPhiEta", "; #varphi; #eta; tracks", {HistType::kTH2F, {PhiAxis, EtaAxis}}}); // @@ -539,25 +562,34 @@ struct PseudorapidityDensityMFT { FiCentralTracks const& midtracks, aod::Tracks const&) { registry.fill(HIST("EventSelection"), 1.); - if (!useEvSel || (useEvSel && collision.sel8())) { - registry.fill(HIST("EventSelection"), 2.); - auto z = collision.posZ(); - if ((z >= cfgVzCut1) && (z <= cfgVzCut2)) { + auto perCollisionSample = sampleCentral->sliceByCached( + o2::aod::track::collisionId, collision.globalIndex(), cache); + auto Ntrk = perCollisionSample.size(); + auto z = collision.posZ(); + registry.fill(HIST("EventsNtrkZvtx"), Ntrk, z); + if ((z >= cfgVzCut1) && (z <= cfgVzCut2)) { + registry.fill(HIST("Tracks/2Danalysis/EventsNtrkZvtx_all"), Ntrk, z); + for (auto& retrack : retracks) { + auto track = retrack.mfttrack(); + if ((cfgnEta1 < track.eta()) && (track.eta() < cfgnEta2) && track.nClusters() >= cfgnCluster && retrack.ambDegree() > 0) { + registry.fill(HIST("Tracks/2Danalysis/EtaZvtx"), track.eta(), z); + } + } + if (!useEvSel || (useEvSel && collision.sel8())) { + registry.fill(HIST("EventSelection"), 2.); + registry.fill(HIST("Tracks/2Danalysis/EventsNtrkZvtx_sel8"), Ntrk, z); registry.fill(HIST("EventSelection"), 3.); - auto perCollisionSample = sampleCentral->sliceByCached( - o2::aod::track::collisionId, collision.globalIndex(), cache); - auto Ntrk = perCollisionSample.size(); std::unordered_set uniqueEvents; std::unordered_set uniqueEventsAmb; std::unordered_set uniqueCollisions; std::unordered_set uniqueCollisionsAmb; std::unordered_set eventsInelMFT; std::unordered_set eventsInel; - registry.fill(HIST("EventsNtrkZvtx"), Ntrk, z); if (midtracks.size() > 0) { registry.fill(HIST("EventSelection"), 4.); registry.fill(HIST("EventSelection"), 10.); registry.fill(HIST("EventsNtrkZvtx_gt0"), Ntrk, z); + registry.fill(HIST("Tracks/2Danalysis/EventsNtrkZvtx_sel8_inelgt0"), Ntrk, z); eventsInel.insert(collision.globalIndex()); } if (perCollisionSample.size() > 0) { @@ -567,8 +599,20 @@ struct PseudorapidityDensityMFT { registry.fill(HIST("EventSelection"), 12.); } int64_t i = 0.0, j = 0.0, k = 0.0; + for (auto& retrack : retracks) { + auto track = retrack.mfttrack(); + if ((cfgnEta1 < track.eta()) && (track.eta() < cfgnEta2) && track.nClusters() >= cfgnCluster && retrack.ambDegree() > 0) { + registry.fill(HIST("Tracks/2Danalysis/EtaZvtx_sel8"), track.eta(), z); + if (midtracks.size() > 0 && retrack.ambDegree() > 0) { + registry.fill(HIST("Tracks/2Danalysis/EtaZvtx_sel8_inelgt0"), track.eta(), z); + } + } + } if (retracks.size() > 0) { registry.fill(HIST("EventSelection"), 5.); + if (midtracks.size() > 0) { + registry.fill(HIST("Tracks/2Danalysis/EventsNtrkZvtx_sel8_inelfwdgt0"), Ntrk, z); + } for (auto& retrack : retracks) { auto track = retrack.mfttrack(); @@ -576,6 +620,7 @@ struct PseudorapidityDensityMFT { registry.fill(HIST("TracksEtaZvtx"), track.eta(), z); if (midtracks.size() > 0 && retrack.ambDegree() > 0) { registry.fill(HIST("Tracks/EtaZvtx_gt0"), track.eta(), z); + registry.fill(HIST("Tracks/2Danalysis/EtaZvtx_sel8_inelfwdgt0"), track.eta(), z); eventsInelMFT.insert(retrack.bestCollisionId()); } if (retrack.ambDegree() != 0) { @@ -852,29 +897,30 @@ struct PseudorapidityDensityMFT { if (std::abs(charge) < 3.) { continue; } - - registry.fill(HIST("TracksEtaZvtxGen_t"), particle.eta(), - mcCollision.posZ()); - if (perCollisionMCSampleCentral.size() > 0) { - registry.fill(HIST("TracksEtaZvtxGen_gt0t"), particle.eta(), + if (cfgnEta1 < particle.eta() && particle.eta() < cfgnEta2) { + registry.fill(HIST("TracksEtaZvtxGen_t"), particle.eta(), mcCollision.posZ()); - registry.fill(HIST("TracksPhiEtaGen_gt0t"), particle.phi(), particle.eta()); - } - if (atLeastOne) { - registry.fill(HIST("TracksEtaZvtxGen"), particle.eta(), - mcCollision.posZ()); - registry.fill(HIST("TracksPtEtaGen"), particle.pt(), particle.eta()); - if (atLeastOne_gt0) { - registry.fill(HIST("TracksEtaZvtxGen_gt0"), particle.eta(), + if (perCollisionMCSampleCentral.size() > 0) { + registry.fill(HIST("TracksEtaZvtxGen_gt0t"), particle.eta(), mcCollision.posZ()); - registry.fill(HIST("TracksPhiEtaGen_gt0"), particle.phi(), particle.eta()); + registry.fill(HIST("TracksPhiEtaGen_gt0t"), particle.phi(), particle.eta()); + } + if (atLeastOne) { + registry.fill(HIST("TracksEtaZvtxGen"), particle.eta(), + mcCollision.posZ()); + registry.fill(HIST("TracksPtEtaGen"), particle.pt(), particle.eta()); + if (atLeastOne_gt0) { + registry.fill(HIST("TracksEtaZvtxGen_gt0"), particle.eta(), + mcCollision.posZ()); + registry.fill(HIST("TracksPhiEtaGen_gt0"), particle.phi(), particle.eta()); + } } - } - registry.fill(HIST("TracksPhiEtaGen"), particle.phi(), particle.eta()); - registry.fill(HIST("TracksPhiZvtxGen"), particle.phi(), - mcCollision.posZ()); - registry.fill(HIST("TracksPtEtaGen_t"), particle.pt(), particle.eta()); + registry.fill(HIST("TracksPhiEtaGen"), particle.phi(), particle.eta()); + registry.fill(HIST("TracksPhiZvtxGen"), particle.phi(), + mcCollision.posZ()); + registry.fill(HIST("TracksPtEtaGen_t"), particle.pt(), particle.eta()); + } } } } From 01c362f440dba2f3e41a7c25ef3de721e79643c0 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Fri, 9 May 2025 21:23:06 +0200 Subject: [PATCH 1239/1650] [PWGLF] Add mass difference between daughter phi meson and angular distance between same sign kaon daughters (#11152) --- PWGLF/Tasks/Resonances/doublephimeson.cxx | 186 ++++++++++++++-------- 1 file changed, 124 insertions(+), 62 deletions(-) diff --git a/PWGLF/Tasks/Resonances/doublephimeson.cxx b/PWGLF/Tasks/Resonances/doublephimeson.cxx index 607b65b9fbd..0c8f9c2c780 100644 --- a/PWGLF/Tasks/Resonances/doublephimeson.cxx +++ b/PWGLF/Tasks/Resonances/doublephimeson.cxx @@ -43,10 +43,13 @@ struct doublephimeson { HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; Configurable strategyPID1{"strategyPID1", 0, "PID strategy 1"}; Configurable strategyPID2{"strategyPID2", 0, "PID strategy 2"}; - Configurable minPhiMass{"minPhiMass", 1.01, "Minimum phi mass"}; - Configurable maxPhiMass{"maxPhiMass", 1.03, "Maximum phi mass"}; - Configurable minExoticMass{"minExoticMass", 2.4, "Minimum Exotic mass"}; - Configurable maxExoticMass{"maxExoticMass", 3.2, "Maximum Exotic mass"}; + Configurable daughterDeltaR{"daughterDeltaR", 0.0, "delta R of daughter"}; + Configurable minPhiMass1{"minPhiMass1", 1.01, "Minimum phi mass1"}; + Configurable maxPhiMass1{"maxPhiMass1", 1.03, "Maximum phi mass1"}; + Configurable minPhiMass2{"minPhiMass2", 1.01, "Minimum phi mass2"}; + Configurable maxPhiMass2{"maxPhiMass2", 1.03, "Maximum phi mass2"}; + Configurable minExoticMass{"minExoticMass", 2.0, "Minimum Exotic mass"}; + Configurable maxExoticMass{"maxExoticMass", 3.6, "Maximum Exotic mass"}; Configurable additionalEvsel{"additionalEvsel", false, "Additional event selection"}; Configurable isDeep{"isDeep", true, "Store deep angle"}; Configurable cutMinNsigmaTPC{"cutMinNsigmaTPC", -2.5, "nsigma cut TPC"}; @@ -79,6 +82,8 @@ struct doublephimeson { histos.add("hnsigmaTPCTOFKaon", "hnsigmaTPCTOFKaon", kTH3F, {{500, -3.0, 3.0f}, {500, -3.0, 3.0f}, {100, 0.0f, 10.0f}}); histos.add("hPhiMass", "hPhiMass", kTH2F, {{40, 1.0, 1.04f}, {100, 0.0f, 10.0f}}); histos.add("hPhiMass2", "hPhiMass2", kTH2F, {{40, 1.0, 1.04f}, {40, 1.0f, 1.04f}}); + histos.add("hkPlusDeltaetaDeltaPhi", "hkPlusDeltaetaDeltaPhi", kTH2F, {{400, -2.0, 2.0}, {640, -2.0 * TMath::Pi(), 2.0 * TMath::Pi()}}); + histos.add("hkMinusDeltaetaDeltaPhi", "hkMinusDeltaetaDeltaPhi", kTH2F, {{400, -2.0, 2.0}, {640, -2.0 * TMath::Pi(), 2.0 * TMath::Pi()}}); const AxisSpec thnAxisInvMass{configThnAxisInvMass, "#it{M} (GeV/#it{c}^{2})"}; const AxisSpec thnAxisInvMassPhi{configThnAxisInvMassPhi, "#it{M} (GeV/#it{c}^{2})"}; @@ -88,9 +93,9 @@ struct doublephimeson { const AxisSpec thnAxisCosTheta{configThnAxisCosTheta, "cos #theta"}; const AxisSpec thnAxisNumPhi{configThnAxisNumPhi, "Number of phi meson"}; - histos.add("SEMassUnlike", "SEMassUnlike", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisDeltaR, thnAxisInvMassPhi, thnAxisInvMassPhi, thnAxisNumPhi}); + histos.add("SEMassUnlike", "SEMassUnlike", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisDeltaR, thnAxisInvMassDeltaPhi, thnAxisNumPhi}); // histos.add("SEMassLike", "SEMassLike", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisDeltaR, thnAxisInvMassPhi, thnAxisInvMassPhi, thnAxisNumPhi}); - histos.add("MEMassUnlike", "MEMassUnlike", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisDeltaR, thnAxisInvMassPhi, thnAxisInvMassPhi}); + histos.add("MEMassUnlike", "MEMassUnlike", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisPt, thnAxisDeltaR, thnAxisInvMassDeltaPhi}); } // get kstar @@ -289,7 +294,7 @@ struct doublephimeson { } TLorentzVector exotic, Phid1, Phid2; - // TLorentzVector exoticlike, Phi1kaonplus, Phi1kaonminus, Phi2kaonplus, Phi2kaonminus, Phid1like, Phid2like; + TLorentzVector Phi1kaonplus, Phi1kaonminus, Phi2kaonplus, Phi2kaonminus; // TLorentzVector exoticRot, Phid1Rot; void processSE(aod::RedPhiEvents::iterator const& collision, aod::PhiTracks const& phitracks) @@ -299,7 +304,7 @@ struct doublephimeson { } int phimult = 0; for (auto phitrackd1 : phitracks) { - if (phitrackd1.phiMass() < minPhiMass || phitrackd1.phiMass() > maxPhiMass) { + if (phitrackd1.phiMass() < minPhiMass1 || phitrackd1.phiMass() > maxPhiMass1) { continue; } auto kaonplusd1pt = TMath::Sqrt(phitrackd1.phid1Px() * phitrackd1.phid1Px() + phitrackd1.phid1Py() * phitrackd1.phid1Py()); @@ -313,7 +318,7 @@ struct doublephimeson { if (!selectionPID(phitrackd1.phid1TPC(), phitrackd1.phid1TOF(), phitrackd1.phid1TOFHit(), strategyPID1, kaonplusd1pt)) { continue; } - if (!selectionPID(phitrackd1.phid2TPC(), phitrackd1.phid2TOF(), phitrackd1.phid2TOFHit(), strategyPID1, kaonminusd1pt)) { + if (!selectionPID(phitrackd1.phid2TPC(), phitrackd1.phid2TOF(), phitrackd1.phid2TOFHit(), strategyPID2, kaonminusd1pt)) { continue; } phimult = phimult + 1; @@ -330,17 +335,17 @@ struct doublephimeson { if (!selectionPID(phitrackd1.phid1TPC(), phitrackd1.phid1TOF(), phitrackd1.phid1TOFHit(), strategyPID1, kaonplusd1pt)) { continue; } - histos.fill(HIST("hnsigmaTPCTOFKaon"), phitrackd1.phid1TPC(), phitrackd1.phid1TOF(), kaonplusd1pt); - histos.fill(HIST("hnsigmaTPCKaonPlus"), phitrackd1.phid1TPC(), kaonplusd1pt); if (!selectionPID(phitrackd1.phid2TPC(), phitrackd1.phid2TOF(), phitrackd1.phid2TOFHit(), strategyPID1, kaonminusd1pt)) { continue; } + histos.fill(HIST("hnsigmaTPCTOFKaon"), phitrackd1.phid1TPC(), phitrackd1.phid1TOF(), kaonplusd1pt); + histos.fill(HIST("hnsigmaTPCKaonPlus"), phitrackd1.phid1TPC(), kaonplusd1pt); histos.fill(HIST("hnsigmaTPCKaonMinus"), phitrackd1.phid2TPC(), kaonminusd1pt); histos.fill(HIST("hPhiMass"), Phid1.M(), Phid1.Pt()); auto phid1id = phitrackd1.index(); Phid1.SetXYZM(phitrackd1.phiPx(), phitrackd1.phiPy(), phitrackd1.phiPz(), phitrackd1.phiMass()); - // Phi1kaonplus.SetXYZM(phitrackd1.phid1Px(), phitrackd1.phid1Py(), phitrackd1.phid1Pz(), 0.493); - // Phi1kaonminus.SetXYZM(phitrackd1.phid2Px(), phitrackd1.phid2Py(), phitrackd1.phid2Pz(), 0.493); + Phi1kaonplus.SetXYZM(phitrackd1.phid1Px(), phitrackd1.phid1Py(), phitrackd1.phid1Pz(), 0.493); + Phi1kaonminus.SetXYZM(phitrackd1.phid2Px(), phitrackd1.phid2Py(), phitrackd1.phid2Pz(), 0.493); for (auto phitrackd2 : phitracks) { auto phid2id = phitrackd2.index(); if (phid2id <= phid1id) { @@ -367,8 +372,8 @@ struct doublephimeson { continue; } Phid2.SetXYZM(phitrackd2.phiPx(), phitrackd2.phiPy(), phitrackd2.phiPz(), phitrackd2.phiMass()); - // Phi2kaonplus.SetXYZM(phitrackd2.phid1Px(), phitrackd2.phid1Py(), phitrackd2.phid1Pz(), 0.493); - // Phi2kaonminus.SetXYZM(phitrackd2.phid2Px(), phitrackd2.phid2Py(), phitrackd2.phid2Pz(), 0.493); + Phi2kaonplus.SetXYZM(phitrackd2.phid1Px(), phitrackd2.phid1Py(), phitrackd2.phid1Pz(), 0.493); + Phi2kaonminus.SetXYZM(phitrackd2.phid2Px(), phitrackd2.phid2Py(), phitrackd2.phid2Pz(), 0.493); /* // Like @@ -385,28 +390,38 @@ struct doublephimeson { histos.fill(HIST("SEMassLike"), exoticlike.M(), exoticlike.Pt(), deltaRlike, deepangle(Phid1like, Phid2like), deltamlike, phimult); } */ + // Unlike - if (phitrackd2.phiMass() < minPhiMass || phitrackd2.phiMass() > maxPhiMass) { + histos.fill(HIST("hPhiMass2"), Phid1.M(), Phid2.M()); + if (phitrackd2.phiMass() < minPhiMass2 || phitrackd2.phiMass() > maxPhiMass2) { continue; } - if (phitrackd1.phiMass() < minPhiMass || phitrackd1.phiMass() > maxPhiMass) { + if (phitrackd1.phiMass() < minPhiMass1 || phitrackd1.phiMass() > maxPhiMass1) { continue; } exotic = Phid1 + Phid2; if (exotic.M() < minExoticMass || exotic.M() > maxExoticMass) { continue; } + histos.fill(HIST("hkPlusDeltaetaDeltaPhi"), Phi1kaonplus.Eta() - Phi2kaonplus.Eta(), Phi1kaonplus.Phi() - Phi2kaonplus.Phi()); + histos.fill(HIST("hkMinusDeltaetaDeltaPhi"), Phi1kaonminus.Eta() - Phi2kaonminus.Eta(), Phi1kaonminus.Phi() - Phi2kaonminus.Phi()); // auto cosThetaStar = getCosTheta(exotic, Phid1); // auto kstar = getkstar(Phid1, Phid2); auto deltaR = TMath::Sqrt(TMath::Power(Phid1.Phi() - Phid2.Phi(), 2.0) + TMath::Power(Phid1.Eta() - Phid2.Eta(), 2.0)); - // auto costheta = (Phid1.Px() * Phid2.Px() + Phid1.Py() * Phid2.Py() + Phid1.Pz() * Phid2.Pz()) / (Phid1.P() * Phid2.P()); - // auto deltam = TMath::Sqrt(TMath::Power(Phid1.M() - 1.0192, 2.0) + TMath::Power(Phid2.M() - 1.0192, 2.0)); - histos.fill(HIST("hPhiMass2"), Phid1.M(), Phid2.M()); + auto deltaRd1 = TMath::Sqrt(TMath::Power(Phi1kaonplus.Phi() - Phi2kaonplus.Phi(), 2.0) + TMath::Power(Phi1kaonplus.Eta() - Phi2kaonplus.Eta(), 2.0)); + auto deltaRd2 = TMath::Sqrt(TMath::Power(Phi1kaonminus.Phi() - Phi2kaonminus.Phi(), 2.0) + TMath::Power(Phi1kaonminus.Eta() - Phi2kaonminus.Eta(), 2.0)); + auto deltam = TMath::Sqrt(TMath::Power(Phid1.M() - 1.0192, 2.0) + TMath::Power(Phid2.M() - 1.0192, 2.0)); + if (deltaRd1 < daughterDeltaR) { + continue; + } + if (deltaRd2 < daughterDeltaR) { + continue; + } if (!isDeep) { - histos.fill(HIST("SEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, Phid1.M(), Phid2.M(), phimult); + histos.fill(HIST("SEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, deltam, phimult); } if (isDeep) { - histos.fill(HIST("SEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, Phid1.M(), Phid2.M(), phimult); + histos.fill(HIST("SEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, deltam, phimult); } } } @@ -414,7 +429,7 @@ struct doublephimeson { PROCESS_SWITCH(doublephimeson, processSE, "Process Same Event", false); void processopti(aod::RedPhiEvents::iterator const& collision, aod::PhiTracks const& phitracks) { - std::vector exoticresonance, phiresonanced1, phiresonanced2; + std::vector exoticresonance, phiresonanced1, phiresonanced2, kaonplus1, kaonplus2, kaonminus1, kaonminus2; std::vector d1trackid = {}; std::vector d2trackid = {}; std::vector d3trackid = {}; @@ -425,7 +440,7 @@ struct doublephimeson { int phimult = 0; for (auto phitrackd1 : phitracks) { - if (phitrackd1.phiMass() < minPhiMass || phitrackd1.phiMass() > maxPhiMass) { + if (phitrackd1.phiMass() < minPhiMass1 || phitrackd1.phiMass() > maxPhiMass1) { continue; } auto kaonplusd1pt = TMath::Sqrt(phitrackd1.phid1Px() * phitrackd1.phid1Px() + phitrackd1.phid1Py() * phitrackd1.phid1Py()); @@ -456,17 +471,17 @@ struct doublephimeson { if (!selectionPID(phitrackd1.phid1TPC(), phitrackd1.phid1TOF(), phitrackd1.phid1TOFHit(), strategyPID1, kaonplusd1pt)) { continue; } - histos.fill(HIST("hnsigmaTPCTOFKaon"), phitrackd1.phid1TPC(), phitrackd1.phid1TOF(), kaonplusd1pt); - histos.fill(HIST("hnsigmaTPCKaonPlus"), phitrackd1.phid1TPC(), kaonplusd1pt); if (!selectionPID(phitrackd1.phid2TPC(), phitrackd1.phid2TOF(), phitrackd1.phid2TOFHit(), strategyPID1, kaonminusd1pt)) { continue; } + histos.fill(HIST("hnsigmaTPCTOFKaon"), phitrackd1.phid1TPC(), phitrackd1.phid1TOF(), kaonplusd1pt); + histos.fill(HIST("hnsigmaTPCKaonPlus"), phitrackd1.phid1TPC(), kaonplusd1pt); histos.fill(HIST("hnsigmaTPCKaonMinus"), phitrackd1.phid2TPC(), kaonminusd1pt); histos.fill(HIST("hPhiMass"), Phid1.M(), Phid1.Pt()); auto phid1id = phitrackd1.index(); Phid1.SetXYZM(phitrackd1.phiPx(), phitrackd1.phiPy(), phitrackd1.phiPz(), phitrackd1.phiMass()); - // Phi1kaonplus.SetXYZM(phitrackd1.phid1Px(), phitrackd1.phid1Py(), phitrackd1.phid1Pz(), 0.493); - // Phi1kaonminus.SetXYZM(phitrackd1.phid2Px(), phitrackd1.phid2Py(), phitrackd1.phid2Pz(), 0.493); + Phi1kaonplus.SetXYZM(phitrackd1.phid1Px(), phitrackd1.phid1Py(), phitrackd1.phid1Pz(), 0.493); + Phi1kaonminus.SetXYZM(phitrackd1.phid2Px(), phitrackd1.phid2Py(), phitrackd1.phid2Pz(), 0.493); for (auto phitrackd2 : phitracks) { auto phid2id = phitrackd2.index(); if (phid2id <= phid1id) { @@ -490,34 +505,21 @@ struct doublephimeson { continue; } Phid2.SetXYZM(phitrackd2.phiPx(), phitrackd2.phiPy(), phitrackd2.phiPz(), phitrackd2.phiMass()); - // Phi2kaonplus.SetXYZM(phitrackd2.phid1Px(), phitrackd2.phid1Py(), phitrackd2.phid1Pz(), 0.493); - // Phi2kaonminus.SetXYZM(phitrackd2.phid2Px(), phitrackd2.phid2Py(), phitrackd2.phid2Pz(), 0.493); - /* - // Like - Phid1like = Phi1kaonplus + Phi2kaonplus; - Phid2like = Phi1kaonminus + Phi2kaonminus; - exoticlike = Phid1like + Phid2like; - auto deltaRlike = TMath::Sqrt(TMath::Power(Phid1like.Phi() - Phid2like.Phi(), 2.0) + TMath::Power(Phid1like.Eta() - Phid2like.Eta(), 2.0)); - auto costhetalike = (Phid1like.Px() * Phid2like.Px() + Phid1like.Py() * Phid2like.Py() + Phid1like.Pz() * Phid2like.Pz()) / (Phid1like.P() * Phid2like.P()); - auto deltamlike = TMath::Sqrt(TMath::Power(Phid1like.M() - 1.0192, 2.0) + TMath::Power(Phid2like.M() - 1.0192, 2.0)); - if (!isDeep) { - histos.fill(HIST("SEMassLike"), exoticlike.M(), exoticlike.Pt(), deltaRlike, costhetalike, deltamlike, phimult); - } - if (isDeep) { - histos.fill(HIST("SEMassLike"), exoticlike.M(), exoticlike.Pt(), deltaRlike, deepangle(Phid1like, Phid2like), deltamlike, phimult); - } - */ + Phi2kaonplus.SetXYZM(phitrackd2.phid1Px(), phitrackd2.phid1Py(), phitrackd2.phid1Pz(), 0.493); + Phi2kaonminus.SetXYZM(phitrackd2.phid2Px(), phitrackd2.phid2Py(), phitrackd2.phid2Pz(), 0.493); + // unlike - if (phitrackd1.phiMass() < minPhiMass || phitrackd1.phiMass() > maxPhiMass) { + if (phitrackd1.phiMass() < minPhiMass1 || phitrackd1.phiMass() > maxPhiMass1) { continue; } - if (phitrackd2.phiMass() < minPhiMass || phitrackd2.phiMass() > maxPhiMass) { + if (phitrackd2.phiMass() < minPhiMass2 || phitrackd2.phiMass() > maxPhiMass2) { continue; } exotic = Phid1 + Phid2; if (exotic.M() < minExoticMass || exotic.M() > maxExoticMass) { continue; } + ROOT::Math::PtEtaPhiMVector temp1(exotic.Pt(), exotic.Eta(), exotic.Phi(), exotic.M()); ROOT::Math::PtEtaPhiMVector temp2(Phid1.Pt(), Phid1.Eta(), Phid1.Phi(), Phid1.M()); ROOT::Math::PtEtaPhiMVector temp3(Phid2.Pt(), Phid2.Eta(), Phid2.Phi(), Phid2.M()); @@ -528,6 +530,15 @@ struct doublephimeson { d2trackid.push_back(phitrackd2.phid1Index()); d3trackid.push_back(phitrackd1.phid2Index()); d4trackid.push_back(phitrackd2.phid2Index()); + + ROOT::Math::PtEtaPhiMVector temp4(Phi1kaonplus.Pt(), Phi1kaonplus.Eta(), Phi1kaonplus.Phi(), 0.493); + ROOT::Math::PtEtaPhiMVector temp5(Phi1kaonminus.Pt(), Phi1kaonminus.Eta(), Phi1kaonminus.Phi(), 0.493); + ROOT::Math::PtEtaPhiMVector temp6(Phi2kaonplus.Pt(), Phi2kaonplus.Eta(), Phi2kaonplus.Phi(), 0.493); + ROOT::Math::PtEtaPhiMVector temp7(Phi2kaonminus.Pt(), Phi2kaonminus.Eta(), Phi2kaonminus.Phi(), 0.493); + kaonplus1.push_back(temp4); + kaonplus2.push_back(temp6); + kaonminus1.push_back(temp5); + kaonminus2.push_back(temp7); } } if (exoticresonance.size() == 0) { @@ -537,34 +548,57 @@ struct doublephimeson { if (exoticresonance.size() == 2) { for (auto if1 = exoticresonance.begin(); if1 != exoticresonance.end(); ++if1) { auto i5 = std::distance(exoticresonance.begin(), if1); + auto exotic1phi1 = phiresonanced1.at(i5); auto exotic1phi2 = phiresonanced2.at(i5); auto exotic1 = exoticresonance.at(i5); + + auto exotic1kaonplus1 = kaonplus1.at(i5); + auto exotic1kaonminus1 = kaonminus1.at(i5); + auto exotic1kaonplus2 = kaonplus2.at(i5); + auto exotic1kaonminus2 = kaonminus2.at(i5); + auto deltaRkaonplus1 = TMath::Sqrt(TMath::Power(exotic1kaonplus1.Phi() - exotic1kaonplus2.Phi(), 2.0) + TMath::Power(exotic1kaonplus1.Eta() - exotic1kaonplus2.Eta(), 2.0)); + auto deltaRkaonminus1 = TMath::Sqrt(TMath::Power(exotic1kaonminus1.Phi() - exotic1kaonminus2.Phi(), 2.0) + TMath::Power(exotic1kaonminus1.Eta() - exotic1kaonminus2.Eta(), 2.0)); + auto deltam1 = TMath::Sqrt(TMath::Power(exotic1phi1.M() - 1.0192, 2.0) + TMath::Power(exotic1phi2.M() - 1.0192, 2.0)); auto deltaR1 = TMath::Sqrt(TMath::Power(exotic1phi1.Phi() - exotic1phi2.Phi(), 2.0) + TMath::Power(exotic1phi1.Eta() - exotic1phi2.Eta(), 2.0)); + + if (deltaRkaonplus1 < daughterDeltaR) { + continue; + } + if (deltaRkaonminus1 < daughterDeltaR) { + continue; + } + for (auto if2 = if1 + 1; if2 != exoticresonance.end(); ++if2) { auto i6 = std::distance(exoticresonance.begin(), if2); auto exotic2phi1 = phiresonanced1.at(i6); auto exotic2phi2 = phiresonanced2.at(i6); auto exotic2 = exoticresonance.at(i6); + + auto exotic2kaonplus1 = kaonplus1.at(i6); + auto exotic2kaonminus1 = kaonminus1.at(i6); + auto exotic2kaonplus2 = kaonplus2.at(i6); + auto exotic2kaonminus2 = kaonminus2.at(i6); + auto deltaRkaonplus2 = TMath::Sqrt(TMath::Power(exotic2kaonplus1.Phi() - exotic2kaonplus2.Phi(), 2.0) + TMath::Power(exotic2kaonplus1.Eta() - exotic2kaonplus2.Eta(), 2.0)); + auto deltaRkaonminus2 = TMath::Sqrt(TMath::Power(exotic2kaonminus1.Phi() - exotic2kaonminus2.Phi(), 2.0) + TMath::Power(exotic2kaonminus1.Eta() - exotic2kaonminus2.Eta(), 2.0)); + auto deltam2 = TMath::Sqrt(TMath::Power(exotic2phi1.M() - 1.0192, 2.0) + TMath::Power(exotic2phi2.M() - 1.0192, 2.0)); auto deltaR2 = TMath::Sqrt(TMath::Power(exotic2phi1.Phi() - exotic2phi2.Phi(), 2.0) + TMath::Power(exotic2phi1.Eta() - exotic2phi2.Eta(), 2.0)); - // LOGF(info, "exotic 1 kaon ids %d , %d, %d, %d", d1trackid.at(i5), d2trackid.at(i5), d3trackid.at(i5), d4trackid.at(i5)); - // LOGF(info, "exotic 2 kaon ids %d , %d, %d, %d", d1trackid.at(i6), d2trackid.at(i6), d3trackid.at(i6), d4trackid.at(i6)); + if ((d1trackid.at(i5) == d1trackid.at(i6) || d1trackid.at(i5) == d2trackid.at(i6)) && (d2trackid.at(i5) == d1trackid.at(i6) || d2trackid.at(i5) == d2trackid.at(i6)) && (d3trackid.at(i5) == d3trackid.at(i6) || d3trackid.at(i5) == d4trackid.at(i6)) && (d4trackid.at(i5) == d3trackid.at(i6) || d4trackid.at(i5) == d4trackid.at(i6))) { - // LOGF(info, "Find Pair %f %f", deltam2, deltam1); - if (deltam2 < deltam1) { - histos.fill(HIST("SEMassUnlike"), exotic2.M(), exotic2.Pt(), deltaR2, exotic2phi1.M(), exotic2phi2.M(), phimult); + + if (deltam2 < deltam1 && deltaRkaonplus2 > daughterDeltaR && deltaRkaonminus2 > daughterDeltaR) { + histos.fill(HIST("SEMassUnlike"), exotic2.M(), exotic2.Pt(), deltaR2, deltam2, phimult); // LOGF(info, "Fill exotic Id %d which is pair of Id %d", i6, i5); } else { - histos.fill(HIST("SEMassUnlike"), exotic1.M(), exotic1.Pt(), deltaR1, exotic1phi1.M(), exotic1phi2.M(), phimult); - // LOGF(info, "Fill exotic Id %d which is pair of Id %d", i6, i5); + histos.fill(HIST("SEMassUnlike"), exotic1.M(), exotic1.Pt(), deltaR1, deltam1, phimult); } } else { - histos.fill(HIST("SEMassUnlike"), exotic1.M(), exotic1.Pt(), deltaR1, exotic1phi1.M(), exotic1phi2.M(), phimult); + histos.fill(HIST("SEMassUnlike"), exotic1.M(), exotic1.Pt(), deltaR1, deltam1, phimult); } } } @@ -574,9 +608,24 @@ struct doublephimeson { auto exotic1phi1 = phiresonanced1.at(i5); auto exotic1phi2 = phiresonanced2.at(i5); auto exotic1 = exoticresonance.at(i5); - // auto deltam1 = TMath::Sqrt(TMath::Power(exotic1phi1.M() - 1.0192, 2.0) + TMath::Power(exotic1phi2.M() - 1.0192, 2.0)); + + auto exotic1kaonplus1 = kaonplus1.at(i5); + auto exotic1kaonminus1 = kaonminus1.at(i5); + auto exotic1kaonplus2 = kaonplus2.at(i5); + auto exotic1kaonminus2 = kaonminus2.at(i5); + auto deltaRkaonplus1 = TMath::Sqrt(TMath::Power(exotic1kaonplus1.Phi() - exotic1kaonplus2.Phi(), 2.0) + TMath::Power(exotic1kaonplus1.Eta() - exotic1kaonplus2.Eta(), 2.0)); + auto deltaRkaonminus1 = TMath::Sqrt(TMath::Power(exotic1kaonminus1.Phi() - exotic1kaonminus2.Phi(), 2.0) + TMath::Power(exotic1kaonminus1.Eta() - exotic1kaonminus2.Eta(), 2.0)); + auto deltam1 = TMath::Sqrt(TMath::Power(exotic1phi1.M() - 1.0192, 2.0) + TMath::Power(exotic1phi2.M() - 1.0192, 2.0)); auto deltaR1 = TMath::Sqrt(TMath::Power(exotic1phi1.Phi() - exotic1phi2.Phi(), 2.0) + TMath::Power(exotic1phi1.Eta() - exotic1phi2.Eta(), 2.0)); - histos.fill(HIST("SEMassUnlike"), exotic1.M(), exotic1.Pt(), deltaR1, exotic1phi1.M(), exotic1phi2.M(), phimult); + + if (deltaRkaonplus1 < daughterDeltaR) { + continue; + } + if (deltaRkaonminus1 < daughterDeltaR) { + continue; + } + + histos.fill(HIST("SEMassUnlike"), exotic1.M(), exotic1.Pt(), deltaR1, deltam1, phimult); } } } @@ -595,10 +644,10 @@ struct doublephimeson { continue; } for (auto& [phitrackd1, phitrackd2] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { - if (phitrackd1.phiMass() < minPhiMass || phitrackd1.phiMass() > maxPhiMass) { + if (phitrackd1.phiMass() < minPhiMass1 || phitrackd1.phiMass() > maxPhiMass1) { continue; } - if (phitrackd2.phiMass() < minPhiMass || phitrackd2.phiMass() > maxPhiMass) { + if (phitrackd2.phiMass() < minPhiMass2 || phitrackd2.phiMass() > maxPhiMass2) { continue; } auto kaonplusd1pt = TMath::Sqrt(phitrackd1.phid1Px() * phitrackd1.phid1Px() + phitrackd1.phid1Py() * phitrackd1.phid1Py()); @@ -632,14 +681,27 @@ struct doublephimeson { } Phid2.SetXYZM(phitrackd2.phiPx(), phitrackd2.phiPy(), phitrackd2.phiPz(), phitrackd2.phiMass()); exotic = Phid1 + Phid2; + + Phi1kaonplus.SetXYZM(phitrackd1.phid1Px(), phitrackd1.phid1Py(), phitrackd1.phid1Pz(), 0.493); + Phi1kaonminus.SetXYZM(phitrackd1.phid2Px(), phitrackd1.phid2Py(), phitrackd1.phid2Pz(), 0.493); + Phi2kaonplus.SetXYZM(phitrackd2.phid1Px(), phitrackd2.phid1Py(), phitrackd2.phid1Pz(), 0.493); + Phi2kaonminus.SetXYZM(phitrackd2.phid2Px(), phitrackd2.phid2Py(), phitrackd2.phid2Pz(), 0.493); + auto deltaRd1 = TMath::Sqrt(TMath::Power(Phi1kaonplus.Phi() - Phi2kaonplus.Phi(), 2.0) + TMath::Power(Phi1kaonplus.Eta() - Phi2kaonplus.Eta(), 2.0)); + auto deltaRd2 = TMath::Sqrt(TMath::Power(Phi1kaonminus.Phi() - Phi2kaonminus.Phi(), 2.0) + TMath::Power(Phi1kaonminus.Eta() - Phi2kaonminus.Eta(), 2.0)); auto deltaR = TMath::Sqrt(TMath::Power(Phid1.Phi() - Phid2.Phi(), 2.0) + TMath::Power(Phid1.Eta() - Phid2.Eta(), 2.0)); // auto costheta = (Phid1.Px() * Phid2.Px() + Phid1.Py() * Phid2.Py() + Phid1.Pz() * Phid2.Pz()) / (Phid1.P() * Phid2.P()); - // auto deltam = TMath::Sqrt(TMath::Power(Phid1.M() - 1.0192, 2.0) + TMath::Power(Phid2.M() - 1.0192, 2.0)); + auto deltam = TMath::Sqrt(TMath::Power(Phid1.M() - 1.0192, 2.0) + TMath::Power(Phid2.M() - 1.0192, 2.0)); + if (deltaRd1 < daughterDeltaR) { + continue; + } + if (deltaRd2 < daughterDeltaR) { + continue; + } if (!isDeep) { - histos.fill(HIST("MEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, Phid1.M(), Phid2.M()); + histos.fill(HIST("MEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, deltam); } if (isDeep) { - histos.fill(HIST("MEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, Phid1.M(), Phid2.M()); + histos.fill(HIST("MEMassUnlike"), exotic.M(), exotic.Pt(), deltaR, deltam); } } } From d35ebe086e7aaa361580c24021cf11086f46b8ec Mon Sep 17 00:00:00 2001 From: MaolinZH <109225729+MaolinZH@users.noreply.github.com> Date: Sun, 11 May 2025 07:51:13 +0200 Subject: [PATCH 1240/1650] [PWGDQ] Fix the QA histogram filling issue of muons in table-Maker-MC (#11123) --- PWGDQ/Core/HistogramsLibrary.cxx | 5 +++++ PWGDQ/TableProducer/tableMakerMC.cxx | 2 ++ 2 files changed, 7 insertions(+) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index cc2a5c5ed38..dffbf25984e 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -565,6 +565,11 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "TPCnSigKa_Corr_pIN", "TPC n-#sigma(K) Corr. vs pIN", false, 100, 0.0, 10.0, VarManager::kPin, 100, -5.0, 5.0, VarManager::kTPCnSigmaKa_Corr); hm->AddHistogram(histClass, "TPCnSigPr_Corr_pIN", "TPC n-#sigma(p) Corr. vs pIN", false, 100, 0.0, 10.0, VarManager::kPin, 100, -5.0, 5.0, VarManager::kTPCnSigmaPr_Corr); } + if (subGroupStr.Contains("tpcpid_nSigEl")) { + hm->AddHistogram(histClass, "TPCnSigEl_TPCnSigPi", "TPC n-#sigma(e) . vs TPC n-#sigma(#pi)", false, 100, -5.0, 5.0, VarManager::kTPCnSigmaEl, 100, -5.0, 5.0, VarManager::kTPCnSigmaPi); + hm->AddHistogram(histClass, "TPCnSigEl_TPCnSigKa", "TPC n-#sigma(e) . vs TPC n-#sigma(K)", false, 100, -5.0, 5.0, VarManager::kTPCnSigmaEl, 100, -5.0, 5.0, VarManager::kTPCnSigmaKa); + hm->AddHistogram(histClass, "TPCnSigEl_TPCnSigPr", "TPC n-#sigma(e) . vs TPC n-#sigma(p)", false, 100, -5.0, 5.0, VarManager::kTPCnSigmaEl, 100, -5.0, 5.0, VarManager::kTPCnSigmaPr); + } } } if (subGroupStr.Contains("postcalib")) { diff --git a/PWGDQ/TableProducer/tableMakerMC.cxx b/PWGDQ/TableProducer/tableMakerMC.cxx index 20634b53b8a..e8408b3e046 100644 --- a/PWGDQ/TableProducer/tableMakerMC.cxx +++ b/PWGDQ/TableProducer/tableMakerMC.cxx @@ -831,6 +831,7 @@ struct TableMakerMC { if (sig.CheckSignal(true, mctrack)) { mcflags |= (static_cast(1) << i); if (fDoDetailedQA) { + j = 0; for (auto& cut : fMuonCuts) { if (trackTempFilterMap & (uint8_t(1) << j)) { fHistMan->FillHistClass(Form("Muons_%s_%s", cut.GetName(), sig.GetName()), VarManager::fgValues); // fill the reconstructed truth @@ -1387,6 +1388,7 @@ struct TableMakerMC { if (sig.CheckSignal(true, mctrack)) { mcflags |= (static_cast(1) << i); if (fDoDetailedQA) { + j = 0; for (auto& cut : fMuonCuts) { if (trackTempFilterMap & (uint8_t(1) << j)) { fHistMan->FillHistClass(Form("Muons_%s_%s", cut.GetName(), sig.GetName()), VarManager::fgValues); // fill the reconstructed truth From 1bec277eb215ef785e8621d8d05fd5c2e763f10b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Sun, 11 May 2025 16:17:39 +0200 Subject: [PATCH 1241/1650] [Common] Table helper: inherit directly configurables (#11065) --- Common/Core/TableHelper.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Common/Core/TableHelper.h b/Common/Core/TableHelper.h index a5935c558f3..f4faf9dc8c8 100644 --- a/Common/Core/TableHelper.h +++ b/Common/Core/TableHelper.h @@ -20,6 +20,7 @@ #include +#include "Framework/Configurable.h" #include "Framework/InitContext.h" #include "Framework/RunningWorkflowInfo.h" @@ -95,4 +96,15 @@ bool getTaskOptionValue(o2::framework::InitContext& initContext, const std::stri return false; } +/// Function to check for a specific configurable from another task in the current workflow and fetch its value. Useful for tasks that need to know the value of a configurable in another task. +/// @param initContext initContext of the init function +/// @param taskName name of the task to check for +/// @param value Task configurable to inherit from (name and values are used) +/// @param verbose if true, print debug messages +template +bool getTaskOptionValue(o2::framework::InitContext& initContext, const std::string& taskName, ValueType& configurable, const bool verbose = true) +{ + return getTaskOptionValue(initContext, taskName, configurable.name, configurable.value, verbose); +} + #endif // COMMON_CORE_TABLEHELPER_H_ From aef1122420176d26481404d50713237c9a0a0bff Mon Sep 17 00:00:00 2001 From: YazhenLin Date: Sun, 11 May 2025 22:49:03 +0800 Subject: [PATCH 1242/1650] [PWGLF] [PWGLF]fix some errors in hStrangeCorrelation.cxx and hStrangeCorrelationFilter.cxx (#11155) --- .../Strangeness/hStrangeCorrelationFilter.cxx | 36 +++++++++---------- .../Tasks/Strangeness/hStrangeCorrelation.cxx | 2 +- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx b/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx index ea9de06b89f..7d73e7c9f07 100644 --- a/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx +++ b/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx @@ -616,7 +616,7 @@ struct HStrangeCorrelationFilter { return; } } - if (!doPPAnalysis || !isCollisionSelectedPbPb(collision)) + if (!doPPAnalysis && !isCollisionSelectedPbPb(collision)) return; /// _________________________________________________ @@ -663,7 +663,7 @@ struct HStrangeCorrelationFilter { } } if (std::abs(posdau.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose) { - if (doPPAnalysis && (v0.v0cosPA() > lambdaCospa)) { + if (v0.v0cosPA() > lambdaCospa) { if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutLambda && std::abs(v0.dcapostopv()) > dcapostopvLambda && std::abs(v0.dcanegtopv()) > dcanegtopvLambda)) { BIT_SET(compatibleLambda, 0); @@ -671,7 +671,7 @@ struct HStrangeCorrelationFilter { } } if (std::abs(posdau.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigma) { - if (doPPAnalysis && (v0.v0cosPA() > lambdaCospa)) { + if (v0.v0cosPA() > lambdaCospa) { if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutLambda && std::abs(v0.dcapostopv()) > dcapostopvLambda && std::abs(v0.dcanegtopv()) > dcanegtopvLambda)) { BIT_SET(compatibleLambda, 1); @@ -679,7 +679,7 @@ struct HStrangeCorrelationFilter { } } if (std::abs(posdau.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaTight) { - if (doPPAnalysis && (v0.v0cosPA() > lambdaCospa)) { + if (v0.v0cosPA() > lambdaCospa) { if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutLambda && std::abs(v0.dcapostopv()) > dcapostopvLambda && std::abs(v0.dcanegtopv()) > dcanegtopvLambda)) { BIT_SET(compatibleLambda, 2); @@ -687,7 +687,7 @@ struct HStrangeCorrelationFilter { } } if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(negdau.tpcNSigmaPr()) < strangedEdxNSigmaLoose) { - if (doPPAnalysis && (v0.v0cosPA() > lambdaCospa)) { + if (v0.v0cosPA() > lambdaCospa) { if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutLambda && std::abs(v0.dcapostopv()) > dcapostopvAntiLambda && std::abs(v0.dcanegtopv()) > dcanegtopvAntiLambda)) { BIT_SET(compatibleAntiLambda, 0); @@ -695,7 +695,7 @@ struct HStrangeCorrelationFilter { } } if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(negdau.tpcNSigmaPr()) < strangedEdxNSigma) { - if (doPPAnalysis && (v0.v0cosPA() > lambdaCospa)) { + if (v0.v0cosPA() > lambdaCospa) { if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutLambda && std::abs(v0.dcapostopv()) > dcapostopvAntiLambda && std::abs(v0.dcanegtopv()) > dcanegtopvAntiLambda)) { BIT_SET(compatibleAntiLambda, 1); @@ -703,7 +703,7 @@ struct HStrangeCorrelationFilter { } } if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(negdau.tpcNSigmaPr()) < strangedEdxNSigmaTight) { - if (doPPAnalysis && (v0.v0cosPA() > lambdaCospa)) { + if (v0.v0cosPA() > lambdaCospa) { if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutLambda && std::abs(v0.dcapostopv()) > dcapostopvAntiLambda && std::abs(v0.dcanegtopv()) > dcanegtopvAntiLambda)) { BIT_SET(compatibleAntiLambda, 2); @@ -756,7 +756,7 @@ struct HStrangeCorrelationFilter { return; } } - if (!doPPAnalysis || !isCollisionSelectedPbPb(collision)) + if (!doPPAnalysis && !isCollisionSelectedPbPb(collision)) return; /// _________________________________________________ /// Populate table with associated V0s @@ -802,7 +802,7 @@ struct HStrangeCorrelationFilter { } } if (std::abs(posdau.tpcNSigmaPr()) < strangedEdxNSigmaLoose && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose) { - if (doPPAnalysis && (v0.v0cosPA() > lambdaCospa)) { + if (v0.v0cosPA() > lambdaCospa) { if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutLambda && std::abs(v0.dcapostopv()) > dcapostopvLambda && std::abs(v0.dcanegtopv()) > dcanegtopvLambda)) { BIT_SET(compatibleLambda, 0); @@ -810,7 +810,7 @@ struct HStrangeCorrelationFilter { } } if (std::abs(posdau.tpcNSigmaPr()) < strangedEdxNSigma && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigma) { - if (doPPAnalysis && (v0.v0cosPA() > lambdaCospa)) { + if (v0.v0cosPA() > lambdaCospa) { if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutLambda && std::abs(v0.dcapostopv()) > dcapostopvLambda && std::abs(v0.dcanegtopv()) > dcanegtopvLambda)) { BIT_SET(compatibleLambda, 1); @@ -818,7 +818,7 @@ struct HStrangeCorrelationFilter { } } if (std::abs(posdau.tpcNSigmaPr()) < strangedEdxNSigmaTight && std::abs(negdau.tpcNSigmaPi()) < strangedEdxNSigmaTight) { - if (doPPAnalysis && (v0.v0cosPA() > lambdaCospa)) { + if (v0.v0cosPA() > lambdaCospa) { if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutLambda && std::abs(v0.dcapostopv()) > dcapostopvLambda && std::abs(v0.dcanegtopv()) > dcanegtopvLambda)) { BIT_SET(compatibleLambda, 2); @@ -826,7 +826,7 @@ struct HStrangeCorrelationFilter { } } if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaLoose && std::abs(negdau.tpcNSigmaPr()) < strangedEdxNSigmaLoose) { - if (doPPAnalysis && (v0.v0cosPA() > lambdaCospa)) { + if (v0.v0cosPA() > lambdaCospa) { if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutLambda && std::abs(v0.dcapostopv()) > dcapostopvAntiLambda && std::abs(v0.dcanegtopv()) > dcanegtopvAntiLambda)) { BIT_SET(compatibleAntiLambda, 0); @@ -834,7 +834,7 @@ struct HStrangeCorrelationFilter { } } if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigma && std::abs(negdau.tpcNSigmaPr()) < strangedEdxNSigma) { - if (doPPAnalysis && (v0.v0cosPA() > lambdaCospa)) { + if (v0.v0cosPA() > lambdaCospa) { if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutLambda && std::abs(v0.dcapostopv()) > dcapostopvAntiLambda && std::abs(v0.dcanegtopv()) > dcanegtopvAntiLambda)) { BIT_SET(compatibleAntiLambda, 1); @@ -842,7 +842,7 @@ struct HStrangeCorrelationFilter { } } if (std::abs(posdau.tpcNSigmaPi()) < strangedEdxNSigmaTight && std::abs(negdau.tpcNSigmaPr()) < strangedEdxNSigmaTight) { - if (doPPAnalysis && (v0.v0cosPA() > lambdaCospa)) { + if (v0.v0cosPA() > lambdaCospa) { if (doPPAnalysis || (v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassK0Short < lifetimecutLambda && std::abs(v0.dcapostopv()) > dcapostopvAntiLambda && std::abs(v0.dcanegtopv()) > dcanegtopvAntiLambda)) { BIT_SET(compatibleAntiLambda, 2); @@ -905,7 +905,7 @@ struct HStrangeCorrelationFilter { return; } } - if (!doPPAnalysis || !isCollisionSelectedPbPb(collision)) + if (!doPPAnalysis && !isCollisionSelectedPbPb(collision)) return; /// _________________________________________________ /// Step 3: Populate table with associated Cascades @@ -927,7 +927,7 @@ struct HStrangeCorrelationFilter { continue; if (negTrackCast.tpcNClsCrossedRows() < minTPCNCrossedRows) continue; - if (!doPPAnalysis || !CascadeSelectedPbPb(casc, collision.posX(), collision.posY(), collision.posZ())) + if (!doPPAnalysis && !CascadeSelectedPbPb(casc, collision.posX(), collision.posY(), collision.posZ())) continue; // check dE/dx compatibility int compatibleXiMinus = 0; @@ -1071,7 +1071,7 @@ struct HStrangeCorrelationFilter { return; } } - if (!doPPAnalysis || !isCollisionSelectedPbPb(collision)) + if (!doPPAnalysis && !isCollisionSelectedPbPb(collision)) return; /// _________________________________________________ /// Step 3: Populate table with associated Cascades @@ -1093,7 +1093,7 @@ struct HStrangeCorrelationFilter { continue; if (negTrackCast.tpcNClsCrossedRows() < minTPCNCrossedRows) continue; - if (!doPPAnalysis || !CascadeSelectedPbPb(casc, collision.posX(), collision.posY(), collision.posZ())) + if (!doPPAnalysis && !CascadeSelectedPbPb(casc, collision.posX(), collision.posY(), collision.posZ())) continue; // check dE/dx compatibility diff --git a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx index 52b4310ed14..4f37921e841 100644 --- a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx +++ b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx @@ -508,7 +508,7 @@ struct HStrangeCorrelation { return false; return true; } - void fillCorrelationsV0(aod::TriggerTracks const& triggers, aod::AssocV0s const& assocs, float pvx, float pvy, float pvz, bool mixing, float mult) + void fillCorrelationsV0(aod::TriggerTracks const& triggers, aod::AssocV0s const& assocs, bool mixing, float pvx, float pvy, float pvz, float mult) { for (auto const& triggerTrack : triggers) { if (doTriggPhysicalPrimary && !triggerTrack.mcPhysicalPrimary()) From daa4b0c6ba0bf31decd74f5444480ded68e420c0 Mon Sep 17 00:00:00 2001 From: Stefano Cannito <143754257+scannito@users.noreply.github.com> Date: Sun, 11 May 2025 23:04:27 +0200 Subject: [PATCH 1243/1650] [PWGLF] Added process functions to compute dNdeta values in data and MC in events with phi + process functions to study phi-k0s signal without normalisation (#11157) Co-authored-by: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> --- .../Tasks/Strangeness/phik0shortanalysis.cxx | 587 +++++++++++++++++- 1 file changed, 559 insertions(+), 28 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx index bf04c3c0e37..747a9ab1009 100644 --- a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx @@ -91,6 +91,7 @@ struct Phik0shortanalysis { Configurable cfgPVContributor{"cfgPVContributor", true, "PV contributor track selection"}; Configurable cMinKaonPtcut{"cMinKaonPtcut", 0.15f, "Track minimum pt cut"}; Configurable etaMax{"etaMax", 0.8f, "eta max"}; + Configurable pTToUseTOF{"pTToUseTOF", 0.5f, "pT above which use TOF"}; Configurable cMaxDCAzToPVcut{"cMaxDCAzToPVcut", 2.0f, "Track DCAz cut to PV Maximum"}; Configurable cMaxDCArToPV1Phi{"cMaxDCArToPV1Phi", 0.004f, "Track DCAr cut to PV config 1 for Phi"}; Configurable cMaxDCArToPV2Phi{"cMaxDCArToPV2Phi", 0.013f, "Track DCAr cut to PV config 2 for Phi"}; @@ -193,6 +194,9 @@ struct Phik0shortanalysis { // Defining filters on V0s (cannot filter on dynamic columns) Filter preFilterV0 = (nabs(aod::v0data::dcapostopv) > v0Configs.v0SettingDCAPosToPV && nabs(aod::v0data::dcanegtopv) > v0Configs.v0SettingDCANegToPV && aod::v0data::dcaV0daughters < v0Configs.v0SettingDCAV0Dau); + // Defining filters on tracks (cannot filter on dynamic columns) + Filter trackFilter = requireGlobalTrackWoDCAInFilter(); + // Defining the type of the collisions for data and MC using SelCollisions = soa::Join; using SimCollisions = soa::Join; @@ -236,6 +240,7 @@ struct Phik0shortanalysis { AxisSpec massPhiAxis = {200, 0.9f, 1.2f, "#it{M}_{inv} [GeV/#it{c}^{2}]"}; AxisSpec sigmassPhiAxis = {nBinsMPhi, lowMPhi, upMPhi, "#it{M}_{inv} [GeV/#it{c}^{2}]"}; AxisSpec vertexZAxis = {100, -15.f, 15.f, "vrtx_{Z} [cm]"}; + AxisSpec etaAxis = {16, -trackConfigs.etaMax, trackConfigs.etaMax, "#eta"}; AxisSpec yAxis = {nBinsY, -cfgYAcceptanceSmear, cfgYAcceptanceSmear, "#it{y}"}; AxisSpec deltayAxis = {nBinsDeltaY, -1.2f, 1.2f, "#Delta#it{y}"}; AxisSpec multAxis = {120, 0.0f, 120.0f, "centFT0M"}; @@ -261,6 +266,9 @@ struct Phik0shortanalysis { dataEventHist.add("hMultiplicityPercent", "Multiplicity Percentile", kTH1F, {multAxis}); dataEventHist.add("hMultiplicityPercentWithPhi", "Multiplicity Percentile in Events with a Phi Candidate", kTH1F, {multAxis}); + // Eta distribution for dN/deta values estimation in Data + dataEventHist.add("h2EtaDistribution", "Eta vs multiplicity in Data", kTH2F, {binnedmultAxis, etaAxis}); + // Number of MC events per selection for Rec and Gen mcEventHist.add("hRecMCEventSelection", "hRecMCEventSelection", kTH1F, {{9, -0.5f, 8.5f}}); mcEventHist.get(HIST("hRecMCEventSelection"))->GetXaxis()->SetBinLabel(1, "All collisions"); @@ -289,6 +297,11 @@ struct Phik0shortanalysis { mcEventHist.add("hGenMCVertexZ", "hGenMCVertexZ", kTH1F, {vertexZAxis}); mcEventHist.add("hGenMCMultiplicityPercent", "GenMC Multiplicity Percentile", kTH1F, {binnedmultAxis}); + // Eta distribution for dN/deta values estimation in MC + mcEventHist.add("h2RecMCEtaDistribution", "Eta vs multiplicity in MCReco", kTH2F, {binnedmultAxis, etaAxis}); + mcEventHist.add("h2GenMCEtaDistribution", "Eta vs multiplicity in MCGen", kTH2F, {binnedmultAxis, etaAxis}); + mcEventHist.add("h2GenMCEtaDistributionAssocReco", "Eta vs multiplicity in MCGen Assoc Reco", kTH2F, {binnedmultAxis, etaAxis}); + // Phi topological/PID cuts dataPhiHist.add("h2DauTracksPhiDCAxyPreCutData", "Dcaxy distribution vs pt before DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); dataPhiHist.add("h2DauTracksPhiDCAzPreCutData", "Dcaz distribution vs pt before DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{z} (cm)"}}); @@ -691,9 +704,9 @@ struct Phik0shortanalysis { template bool selectionPIDKaonpTdependent(const T& track) { - if (track.pt() < 0.5 && std::abs(track.tpcNSigmaKa()) < trackConfigs.nSigmaCutTPCKa) + if (track.pt() < trackConfigs.pTToUseTOF && std::abs(track.tpcNSigmaKa()) < trackConfigs.nSigmaCutTPCKa) return true; - if (track.pt() >= 0.5 && track.hasTOF() && (std::pow(track.tofNSigmaKa(), 2) + std::pow(track.tpcNSigmaKa(), 2)) < std::pow(trackConfigs.nSigmaCutCombinedKa, 2)) + if (track.pt() >= trackConfigs.pTToUseTOF && track.hasTOF() && (std::pow(track.tofNSigmaKa(), 2) + std::pow(track.tpcNSigmaKa(), 2)) < std::pow(trackConfigs.nSigmaCutCombinedKa, 2)) return true; return false; } @@ -735,7 +748,7 @@ struct Phik0shortanalysis { return false; if constexpr (isTOFChecked) { - if (track.pt() >= 0.5 && !track.hasTOF()) + if (track.pt() >= trackConfigs.pTToUseTOF && !track.hasTOF()) return false; } @@ -769,6 +782,63 @@ struct Phik0shortanalysis { return true; } + template + bool eventHasPhi(const T1& posTracks, const T2& negTracks) + { + int nPhi = 0; + + for (const auto& track1 : posTracks) { + if (!selectionTrackResonance(track1, false) || !selectionPIDKaonpTdependent(track1)) + continue; // topological and PID selection + + auto track1ID = track1.globalIndex(); + + for (const auto& track2 : negTracks) { + if (!selectionTrackResonance(track2, false) || !selectionPIDKaonpTdependent(track2)) + continue; // topological and PID selection + + auto track2ID = track2.globalIndex(); + if (track2ID == track1ID) + continue; // condition to avoid double counting of pair + + ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa); + if (recPhi.Pt() < minPhiPt || recPhi.Pt() > maxPhiPt) + continue; + if (recPhi.M() < lowMPhi || recPhi.M() > upMPhi) + continue; + if (std::abs(recPhi.Rapidity()) > cfgYAcceptance) + continue; + + nPhi++; + } + } + + if (nPhi > 0) + return true; + return false; + } + + template + bool eventHasMCPhi(const T& mcParticles) + { + int nPhi = 0; + + for (const auto& mcParticle : mcParticles) { + if (mcParticle.pdgCode() != o2::constants::physics::Pdg::kPhi) + continue; + if (mcParticle.pt() < minPhiPt || mcParticle.pt() > maxPhiPt) + continue; + if (std::abs(mcParticle.y()) > cfgYAcceptance) + continue; + + nPhi++; + } + + if (nPhi > 0) + return true; + return false; + } + // Get phi-meson purity functions from CCDB void getPhiPurityFunctionsFromCCDB() { @@ -891,7 +961,7 @@ struct Phik0shortanalysis { } } - void processQAPurity(SelCollisions::iterator const& collision, FullTracks const& fullTracks, FullV0s const& V0s, V0DauTracks const&) + void processPhiPurityData(SelCollisions::iterator const& collision, FullTracks const& fullTracks, FullV0s const& V0s, V0DauTracks const&) { // Check if the event selection is passed if (!acceptEventQA(collision, true)) @@ -1017,9 +1087,9 @@ struct Phik0shortanalysis { dataEventHist.fill(HIST("hEventSelection"), 5, weight); // at least a Phi in the event } - PROCESS_SWITCH(Phik0shortanalysis, processQAPurity, "Process for QA and Phi Purities", true); + PROCESS_SWITCH(Phik0shortanalysis, processPhiPurityData, "Process function for Phi Purities in Data", true); - void processSEPhiK0S(soa::Filtered::iterator const& collision, FullTracks const&, FullV0s const& V0s, V0DauTracks const&) + void processPhiK0SData(soa::Filtered::iterator const& collision, FullTracks const&, FullV0s const& V0s, V0DauTracks const&) { if (!collision.isInelGt0()) return; @@ -1108,9 +1178,9 @@ struct Phik0shortanalysis { } } - PROCESS_SWITCH(Phik0shortanalysis, processSEPhiK0S, "Process Same Event for Phi-K0S Analysis", false); + PROCESS_SWITCH(Phik0shortanalysis, processPhiK0SData, "Process function for Phi-K0S Correlations in Data", false); - void processSEPhiPion(soa::Filtered::iterator const& collision, FullTracks const& fullTracks) + void processPhiPionData(soa::Filtered::iterator const& collision, FullTracks const& fullTracks) { if (!collision.isInelGt0()) return; @@ -1195,9 +1265,9 @@ struct Phik0shortanalysis { } } - PROCESS_SWITCH(Phik0shortanalysis, processSEPhiPion, "Process Same Event for Phi-Pion Analysis", false); + PROCESS_SWITCH(Phik0shortanalysis, processPhiPionData, "Process function for Phi-Pion Correlations in Data", false); - void processRecMCPhiQA(SimCollisions::iterator const& collision, FullMCTracks const& fullMCTracks, FullMCV0s const& V0s, V0DauMCTracks const&, MCCollisions const&, aod::McParticles const&) + void processPhiMCReco(SimCollisions::iterator const& collision, FullMCTracks const& fullMCTracks, FullMCV0s const& V0s, V0DauMCTracks const&, MCCollisions const&, aod::McParticles const&) { if (!acceptEventQA(collision, true)) return; @@ -1355,9 +1425,9 @@ struct Phik0shortanalysis { } } - PROCESS_SWITCH(Phik0shortanalysis, processRecMCPhiQA, "Process for ReCMCQA and Phi in RecMC", false); + PROCESS_SWITCH(Phik0shortanalysis, processPhiMCReco, "Process function for Phi in MCReco (to be removed)", false); - void processRecMCPhiK0S(SimCollisions const& collisions, FullMCV0s const& V0s, V0DauMCTracks const&, MCCollisions const&, aod::McParticles const& mcParticles) + void processPhiK0SMCReco(SimCollisions const& collisions, FullMCV0s const& V0s, V0DauMCTracks const&, MCCollisions const&, aod::McParticles const& mcParticles) { for (const auto& collision : collisions) { if (!acceptEventQA(collision, false)) @@ -1425,9 +1495,9 @@ struct Phik0shortanalysis { } } - PROCESS_SWITCH(Phik0shortanalysis, processRecMCPhiK0S, "Process RecMC for Phi-K0S Analysis", false); + PROCESS_SWITCH(Phik0shortanalysis, processPhiK0SMCReco, "Process function for Phi-K0S Correlations Efficiency correction in MCReco", false); - void processRecMCPhiPion(SimCollisions const& collisions, FullMCTracks const& fullMCTracks, MCCollisions const&, aod::McParticles const& mcParticles) + void processPhiPionMCReco(SimCollisions const& collisions, FullMCTracks const& fullMCTracks, MCCollisions const&, aod::McParticles const& mcParticles) { for (const auto& collision : collisions) { if (!acceptEventQA(collision, false)) @@ -1500,7 +1570,7 @@ struct Phik0shortanalysis { mcPhiPionHist.fill(HIST("h4PhiPiTPCMCReco"), i, genmultiplicity, mcTrack.pt(), track.tpcNSigmaPi()); } - if (track.pt() >= 0.5 && !track.hasTOF()) + if (track.pt() >= trackConfigs.pTToUseTOF && !track.hasTOF()) continue; mcPionHist.fill(HIST("h4PiTPCTOFMCReco"), genmultiplicity, mcTrack.pt(), track.tpcNSigmaPi(), track.tofNSigmaPi()); @@ -1531,9 +1601,9 @@ struct Phik0shortanalysis { } } - PROCESS_SWITCH(Phik0shortanalysis, processRecMCPhiPion, "Process RecMC for Phi-Pion Analysis", false); + PROCESS_SWITCH(Phik0shortanalysis, processPhiPionMCReco, "Process function for Phi-Pion Correlations Efficiency correction in MCReco", false); - void processRecMCClosurePhiQA(SimCollisions::iterator const& collision, FullMCTracks const& fullMCTracks, FullMCV0s const& V0s, V0DauMCTracks const&, MCCollisions const&, aod::McParticles const&) + void processPhiPurityMCClosure(SimCollisions::iterator const& collision, FullMCTracks const& fullMCTracks, FullMCV0s const& V0s, V0DauMCTracks const&, MCCollisions const&, aod::McParticles const&) { if (!acceptEventQA(collision, true)) return; @@ -1660,9 +1730,9 @@ struct Phik0shortanalysis { mcEventHist.fill(HIST("hRecMCEventSelection"), 8, weight); // at least a Phi in the event } - PROCESS_SWITCH(Phik0shortanalysis, processRecMCClosurePhiQA, "Process for ReCMCQA and Phi in RecMCClosure", false); + PROCESS_SWITCH(Phik0shortanalysis, processPhiPurityMCClosure, "Process function for Phi Purities in MCClosure", false); - void processRecMCClosurePhiK0S(SimCollisions::iterator const& collision, FullMCTracks const&, FullMCV0s const& V0s, V0DauMCTracks const&, MCCollisions const&, aod::McParticles const&) + void processPhiK0SMCClosure(SimCollisions::iterator const& collision, FullMCTracks const&, FullMCV0s const& V0s, V0DauMCTracks const&, MCCollisions const&, aod::McParticles const&) { if (!acceptEventQA(collision, false)) return; @@ -1786,9 +1856,9 @@ struct Phik0shortanalysis { } } - PROCESS_SWITCH(Phik0shortanalysis, processRecMCClosurePhiK0S, "Process RecMC for MCClosure Phi-K0S Analysis", false); + PROCESS_SWITCH(Phik0shortanalysis, processPhiK0SMCClosure, "Process function for Phi-K0S Correlations in MCClosure", false); - void processRecMCClosurePhiPion(SimCollisions::iterator const& collision, FullMCTracks const& fullMCTracks, MCCollisions const&, aod::McParticles const&) + void processPhiPionMCClosure(SimCollisions::iterator const& collision, FullMCTracks const& fullMCTracks, MCCollisions const&, aod::McParticles const&) { if (!acceptEventQA(collision, false)) return; @@ -1908,9 +1978,9 @@ struct Phik0shortanalysis { } } - PROCESS_SWITCH(Phik0shortanalysis, processRecMCClosurePhiPion, "Process RecMC for MCClosure Phi-Pion Analysis", false); + PROCESS_SWITCH(Phik0shortanalysis, processPhiPionMCClosure, "Process function for Phi-Pion Correlations in MCClosure", false); - void processGenMCPhiQA(MCCollisions::iterator const& mcCollision, soa::SmallGroups const& collisions, aod::McParticles const& mcParticles) + void processPhiMCGen(MCCollisions::iterator const& mcCollision, soa::SmallGroups const& collisions, aod::McParticles const& mcParticles) { mcEventHist.fill(HIST("hGenMCEventSelection"), 0); // all collisions if (std::abs(mcCollision.posZ()) > cutZVertex) @@ -2033,9 +2103,9 @@ struct Phik0shortanalysis { } } - PROCESS_SWITCH(Phik0shortanalysis, processGenMCPhiQA, "Process for ReCMCQA and Phi in RecMC", false); + PROCESS_SWITCH(Phik0shortanalysis, processPhiMCGen, "Process function for Phi in MCGen (to be removed)", false); - void processGenMCPhiK0S(MCCollisions::iterator const& mcCollision, soa::SmallGroups const& collisions, aod::McParticles const& mcParticles) + void processPhiK0SMCGen(MCCollisions::iterator const& mcCollision, soa::SmallGroups const& collisions, aod::McParticles const& mcParticles) { if (std::abs(mcCollision.posZ()) > cutZVertex) return; @@ -2110,9 +2180,9 @@ struct Phik0shortanalysis { } } - PROCESS_SWITCH(Phik0shortanalysis, processGenMCPhiK0S, "Process GenMC for Phi-K0S Analysis", false); + PROCESS_SWITCH(Phik0shortanalysis, processPhiK0SMCGen, "Process function for Phi-K0S Correlations Efficiency correction in MCGen", false); - void processGenMCPhiPion(MCCollisions::iterator const& mcCollision, soa::SmallGroups const& collisions, aod::McParticles const& mcParticles) + void processPhiPionMCGen(MCCollisions::iterator const& mcCollision, soa::SmallGroups const& collisions, aod::McParticles const& mcParticles) { if (std::abs(mcCollision.posZ()) > cutZVertex) return; @@ -2187,7 +2257,468 @@ struct Phik0shortanalysis { } } - PROCESS_SWITCH(Phik0shortanalysis, processGenMCPhiPion, "Process GenMC for Phi-Pion Analysis", false); + PROCESS_SWITCH(Phik0shortanalysis, processPhiPionMCGen, "Process function for Phi-Pion Correlations Efficiency correction in MCGen", false); + + void processdNdetaWPhiData(SelCollisions::iterator const& collision, soa::Filtered const& fullTracks) + { + // Check if the event selection is passed + if (!acceptEventQA(collision, true)) + return; + + auto posThisColl = posTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + auto negThisColl = negTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + + // Check if the event contains a phi candidate + if (!eventHasPhi(posThisColl, negThisColl)) + return; + + float multiplicity = collision.centFT0M(); + + for (const auto& track : fullTracks) + dataEventHist.fill(HIST("h2EtaDistribution"), multiplicity, track.eta()); + } + + PROCESS_SWITCH(Phik0shortanalysis, processdNdetaWPhiData, "Process function for dN/deta values in Data", false); + + void processdNdetaWPhiMCReco(SimCollisions const& collisions, soa::Filtered const& fullMCTracks, MCCollisions const&, aod::McParticles const& mcParticles) + { + for (const auto& collision : collisions) { + if (!acceptEventQA(collision, true)) + continue; + if (!collision.has_mcCollision()) + continue; + const auto& mcCollision = collision.mcCollision_as(); + + auto mcParticlesThisColl = mcParticles.sliceByCached(aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); + + if (!eventHasMCPhi(mcParticlesThisColl)) + continue; + + float genmultiplicity = mcCollision.centFT0M(); + + auto mcTracksThisColl = fullMCTracks.sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + + for (const auto& track : mcTracksThisColl) { + if (!track.has_mcParticle()) + continue; + + auto mcTrack = track.mcParticle_as(); + if (!mcTrack.isPhysicalPrimary() || std::abs(mcTrack.eta()) > trackConfigs.etaMax) + continue; + + mcEventHist.fill(HIST("h2RecMCEtaDistribution"), genmultiplicity, mcTrack.eta()); + } + } + } + + PROCESS_SWITCH(Phik0shortanalysis, processdNdetaWPhiMCReco, "Process function for dN/deta values in MCReco", false); + + void processdNdetaWPhiMCGen(MCCollisions::iterator const& mcCollision, soa::SmallGroups const& collisions, aod::McParticles const& mcParticles) + { + if (std::abs(mcCollision.posZ()) > cutZVertex) + return; + if (!pwglf::isINELgtNmc(mcParticles, 0, pdgDB)) + return; + if (!eventHasMCPhi(mcParticles)) + return; + + bool isAssocColl = false; + for (const auto& collision : collisions) { + if (acceptEventQA(collision, false)) { + isAssocColl = true; + break; + } + } + + float genmultiplicity = mcCollision.centFT0M(); + + for (const auto& mcParticle : mcParticles) { + if (!mcParticle.isPhysicalPrimary() || std::abs(mcParticle.eta()) > trackConfigs.etaMax) + continue; + + auto pdgTrack = pdgDB->GetParticle(mcParticle.pdgCode()); + if (pdgTrack == nullptr) + continue; + if (pdgTrack->Charge() == trackConfigs.cfgCutCharge) + continue; + + mcEventHist.fill(HIST("h2GenMCEtaDistribution"), genmultiplicity, mcParticle.eta()); + if (isAssocColl) + mcEventHist.fill(HIST("h2GenMCEtaDistributionAssocReco"), genmultiplicity, mcParticle.eta()); + } + } + + PROCESS_SWITCH(Phik0shortanalysis, processdNdetaWPhiMCGen, "Process function for dN/deta values in MCGen", false); + + void processPhiK0SPionData2D(SelCollisions::iterator const& collision, FullTracks const& fullTracks, FullV0s const& V0s, V0DauTracks const&) + { + // Check if the event selection is passed + if (!acceptEventQA(collision, true)) + return; + + float multiplicity = collision.centFT0M(); + dataEventHist.fill(HIST("hMultiplicityPercent"), multiplicity); + + // Defining positive and negative tracks for phi reconstruction + auto posThisColl = posTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + auto negThisColl = negTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + + bool isCountedPhi = false; + bool isFilledhV0 = false; + + double weight{1.0}; + + // Loop over all positive tracks + for (const auto& track1 : posThisColl) { + if (!selectionTrackResonance(track1, true) || !selectionPIDKaonpTdependent(track1)) + continue; // topological and PID selection + + dataPhiHist.fill(HIST("hEta"), track1.eta()); + dataPhiHist.fill(HIST("hNsigmaKaonTPC"), track1.tpcInnerParam(), track1.tpcNSigmaKa()); + dataPhiHist.fill(HIST("hNsigmaKaonTOF"), track1.tpcInnerParam(), track1.tofNSigmaKa()); + + auto track1ID = track1.globalIndex(); + + // Loop over all negative tracks + for (const auto& track2 : negThisColl) { + if (!selectionTrackResonance(track2, true) || !selectionPIDKaonpTdependent(track2)) + continue; // topological and PID selection + + auto track2ID = track2.globalIndex(); + if (track2ID == track1ID) + continue; // condition to avoid double counting of pair + + ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa); + if (recPhi.Pt() < minPhiPt || recPhi.Pt() > maxPhiPt) + continue; + if (std::abs(recPhi.Rapidity()) > cfgYAcceptance) + continue; + + if (!isCountedPhi) { + dataEventHist.fill(HIST("hEventSelection"), 4); // at least a Phi candidate in the event + dataEventHist.fill(HIST("hMultiplicityPercentWithPhi"), multiplicity); + isCountedPhi = true; + } + + if (fillMethodSingleWeight) + weight *= (1 - getPhiPurity(multiplicity, recPhi)); + + dataPhiHist.fill(HIST("h3PhipurData"), multiplicity, recPhi.Pt(), recPhi.M()); + + // V0 already reconstructed by the builder + for (const auto& v0 : V0s) { + const auto& posDaughterTrack = v0.posTrack_as(); + const auto& negDaughterTrack = v0.negTrack_as(); + + // Cut on V0 dynamic columns + if (!selectionV0(v0, posDaughterTrack, negDaughterTrack)) + continue; + if (v0Configs.cfgFurtherV0Selection && !furtherSelectionV0(v0, collision)) + continue; + + if (!isFilledhV0) { + dataK0SHist.fill(HIST("hDCAV0Daughters"), v0.dcaV0daughters()); + dataK0SHist.fill(HIST("hV0CosPA"), v0.v0cosPA()); + + // Filling the PID of the V0 daughters in the region of the K0 peak + if (lowMK0S < v0.mK0Short() && v0.mK0Short() < upMK0S) { + dataK0SHist.fill(HIST("hNSigmaPosPionFromK0S"), posDaughterTrack.tpcInnerParam(), posDaughterTrack.tpcNSigmaPi()); + dataK0SHist.fill(HIST("hNSigmaNegPionFromK0S"), negDaughterTrack.tpcInnerParam(), negDaughterTrack.tpcNSigmaPi()); + } + } + + if (std::abs(v0.yK0Short()) > cfgYAcceptance) + continue; + + dataPhiK0SHist.fill(HIST("h5PhiK0SData"), 0, multiplicity, v0.pt(), v0.mK0Short(), recPhi.M()); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + if (std::abs(v0.yK0Short() - recPhi.Rapidity()) > cfgDeltaYAcceptanceBins->at(i)) + continue; + dataPhiK0SHist.fill(HIST("h5PhiK0SData"), i + 1, multiplicity, v0.pt(), v0.mK0Short(), recPhi.M()); + } + } + + isFilledhV0 = true; + + // Loop over all primary pion candidates + for (const auto& track : fullTracks) { + if (!selectionPion(track, false)) + continue; + + if (std::abs(track.rapidity(massPi)) > cfgYAcceptance) + continue; + + float nSigmaTOFPi = (track.hasTOF() ? track.tofNSigmaPi() : -999); + + dataPhiPionHist.fill(HIST("h6PhiPiData"), 0, multiplicity, track.pt(), track.tpcNSigmaPi(), nSigmaTOFPi, recPhi.M()); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + if (std::abs(track.rapidity(massPi) - recPhi.Rapidity()) > cfgDeltaYAcceptanceBins->at(i)) + continue; + dataPhiPionHist.fill(HIST("h6PhiPiData"), i + 1, multiplicity, track.pt(), track.tpcNSigmaPi(), nSigmaTOFPi, recPhi.M()); + } + } + } + } + + weight = 1 - weight; + dataEventHist.fill(HIST("hEventSelection"), 5, weight); // at least a Phi in the event + } + + PROCESS_SWITCH(Phik0shortanalysis, processPhiK0SPionData2D, "Process function for Phi-K0S and Phi-Pion Correlations in Data2D", false); + + void processPhiK0SPionMCClosure2D(SimCollisions::iterator const& collision, FullMCTracks const& fullMCTracks, FullMCV0s const& V0s, V0DauMCTracks const&, MCCollisions const&, aod::McParticles const&) + { + if (!acceptEventQA(collision, true)) + return; + + if (!collision.has_mcCollision()) + return; + mcEventHist.fill(HIST("hRecMCEventSelection"), 6); // with at least a gen collision + + const auto& mcCollision = collision.mcCollision_as(); + float genmultiplicity = mcCollision.centFT0M(); + mcEventHist.fill(HIST("hRecMCGenMultiplicityPercent"), genmultiplicity); + + // Defining positive and negative tracks for phi reconstruction + auto posThisColl = posMCTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + auto negThisColl = negMCTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + + bool isCountedPhi = false; + + double weight{1.0}; + + // Loop over all positive tracks + for (const auto& track1 : posThisColl) { + if (!selectionTrackResonance(track1, true) || !selectionPIDKaonpTdependent(track1)) + continue; // topological and PID selection + + auto track1ID = track1.globalIndex(); + + // Loop over all negative tracks + for (const auto& track2 : negThisColl) { + if (!selectionTrackResonance(track2, true) || !selectionPIDKaonpTdependent(track2)) + continue; // topological and PID selection + + auto track2ID = track2.globalIndex(); + if (track2ID == track1ID) + continue; // condition to avoid double counting of pair + + ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa); + if (recPhi.Pt() < minPhiPt || recPhi.Pt() > maxPhiPt) + continue; + if (std::abs(recPhi.Rapidity()) > cfgYAcceptance) + continue; + + if (!isCountedPhi) { + mcEventHist.fill(HIST("hRecMCEventSelection"), 7); // at least a Phi candidate in the event + mcEventHist.fill(HIST("hRecMCGenMultiplicityPercentWithPhi"), genmultiplicity); + isCountedPhi = true; + } + + if (fillMethodSingleWeight) + weight *= (1 - getPhiPurity(genmultiplicity, recPhi)); + + closureMCPhiHist.fill(HIST("h3PhipurMCClosure"), genmultiplicity, recPhi.Pt(), recPhi.M()); + + // V0 already reconstructed by the builder + for (const auto& v0 : V0s) { + if (cfgisRecMCWPDGForClosure1) { + if (!v0.has_mcParticle()) + continue; + auto v0mcparticle = v0.mcParticle(); + if (v0mcparticle.pdgCode() != PDG_t::kK0Short || !v0mcparticle.isPhysicalPrimary()) + continue; + } + + const auto& posDaughterTrack = v0.posTrack_as(); + const auto& negDaughterTrack = v0.negTrack_as(); + + if (!selectionV0(v0, posDaughterTrack, negDaughterTrack)) + continue; + if (v0Configs.cfgFurtherV0Selection && !furtherSelectionV0(v0, collision)) + continue; + + if (std::abs(v0.yK0Short()) > cfgYAcceptance) + continue; + + closureMCPhiK0SHist.fill(HIST("h5PhiK0SMCClosure"), 0, genmultiplicity, v0.pt(), v0.mK0Short(), recPhi.M()); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + if (std::abs(v0.yK0Short() - recPhi.Rapidity()) > cfgDeltaYAcceptanceBins->at(i)) + continue; + closureMCPhiK0SHist.fill(HIST("h5PhiK0SMCClosure"), i + 1, genmultiplicity, v0.pt(), v0.mK0Short(), recPhi.M()); + } + } + + // Loop over all primary pion candidates + for (const auto& track : fullMCTracks) { + if (cfgisRecMCWPDGForClosure1) { + if (!track.has_mcParticle()) + continue; + auto mcTrack = track.mcParticle_as(); + if (std::abs(mcTrack.pdgCode()) != PDG_t::kPiPlus || !mcTrack.isPhysicalPrimary()) + continue; + } + + if (!selectionPion(track, false)) + continue; + + if (std::abs(track.rapidity(massPi)) > cfgYAcceptance) + continue; + + float nSigmaTOFPi = (track.hasTOF() ? track.tofNSigmaPi() : -999); + + closureMCPhiPionHist.fill(HIST("h6PhiPiMCClosure"), 0, genmultiplicity, track.pt(), track.tpcNSigmaPi(), nSigmaTOFPi, recPhi.M()); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + if (std::abs(track.rapidity(massPi) - recPhi.Rapidity()) > cfgDeltaYAcceptanceBins->at(i)) + continue; + closureMCPhiPionHist.fill(HIST("h6PhiPiMCClosure"), i + 1, genmultiplicity, track.pt(), track.tpcNSigmaPi(), nSigmaTOFPi, recPhi.M()); + } + } + } + } + + weight = 1 - weight; + mcEventHist.fill(HIST("hRecMCEventSelection"), 8, weight); // at least a Phi in the event + } + + PROCESS_SWITCH(Phik0shortanalysis, processPhiK0SPionMCClosure2D, "Process function for Phi-K0S and Phi-Pion Correlations in MCClosure2D", false); + + void processPhiK0SPionMCReco2D(SimCollisions::iterator const& collision, FullMCTracks const& fullMCTracks, FullMCV0s const& V0s, V0DauMCTracks const&, MCCollisions const&, aod::McParticles const&) + { + if (!acceptEventQA(collision, true)) + return; + + float multiplicity = collision.centFT0M(); + mcEventHist.fill(HIST("hRecMCMultiplicityPercent"), multiplicity); + + if (!collision.has_mcCollision()) + return; + mcEventHist.fill(HIST("hRecMCEventSelection"), 6); // with at least a gen collision + + const auto& mcCollision = collision.mcCollision_as(); + float genmultiplicity = mcCollision.centFT0M(); + mcEventHist.fill(HIST("hRecMCGenMultiplicityPercent"), genmultiplicity); + + // Defining positive and negative tracks for phi reconstruction + auto posThisColl = posMCTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + auto negThisColl = negMCTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + + bool isCountedPhi = false; + + // Loop over all positive tracks + for (const auto& track1 : posThisColl) { + if (!selectionTrackResonance(track1, false) || !selectionPIDKaonpTdependent(track1)) + continue; // topological and PID selection + + auto track1ID = track1.globalIndex(); + + if (!track1.has_mcParticle()) + continue; + auto mcTrack1 = track1.mcParticle_as(); + if (mcTrack1.pdgCode() != PDG_t::kKPlus || !mcTrack1.isPhysicalPrimary()) + continue; + + // Loop over all negative tracks + for (const auto& track2 : negThisColl) { + if (!selectionTrackResonance(track2, false) || !selectionPIDKaonpTdependent(track2)) + continue; // topological and PID selection + + auto track2ID = track2.globalIndex(); + if (track2ID == track1ID) + continue; // condition to avoid double counting of pair + + if (!track2.has_mcParticle()) + continue; + auto mcTrack2 = track2.mcParticle_as(); + if (mcTrack2.pdgCode() != PDG_t::kKMinus || !mcTrack2.isPhysicalPrimary()) + continue; + + bool isMCMotherPhi = false; + for (const auto& motherOfMcTrack1 : mcTrack1.mothers_as()) { + for (const auto& motherOfMcTrack2 : mcTrack2.mothers_as()) { + if (motherOfMcTrack1.pdgCode() != motherOfMcTrack2.pdgCode()) + continue; + if (motherOfMcTrack1.globalIndex() != motherOfMcTrack2.globalIndex()) + continue; + if (motherOfMcTrack1.pdgCode() != o2::constants::physics::Pdg::kPhi) + continue; + isMCMotherPhi = true; + } + } + if (!isMCMotherPhi) + continue; + + ROOT::Math::PxPyPzMVector recPhi = recMother(track1, track2, massKa, massKa); + if (recPhi.Pt() < minPhiPt || recPhi.Pt() > maxPhiPt) + continue; + + if (std::abs(recPhi.Rapidity()) > cfgYAcceptance) + continue; + + if (!isCountedPhi) { + mcEventHist.fill(HIST("hRecMCEventSelection"), 7); // at least a Phi in the event + isCountedPhi = true; + } + + // V0 already reconstructed by the builder + for (const auto& v0 : V0s) { + if (!v0.has_mcParticle()) { + continue; + } + + auto v0mcparticle = v0.mcParticle(); + if (v0mcparticle.pdgCode() != PDG_t::kK0Short || !v0mcparticle.isPhysicalPrimary()) + continue; + + const auto& posDaughterTrack = v0.posTrack_as(); + const auto& negDaughterTrack = v0.negTrack_as(); + + // Cut on V0 dynamic columns + if (!selectionV0(v0, posDaughterTrack, negDaughterTrack)) + continue; + if (v0Configs.cfgFurtherV0Selection && !furtherSelectionV0(v0, collision)) + continue; + + if (std::abs(v0.yK0Short()) > cfgYAcceptance) + continue; + + mcPhiK0SHist.fill(HIST("h5PhiK0SMCClosure"), 0, genmultiplicity, v0.pt(), v0.mK0Short(), recPhi.M()); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + if (std::abs(v0.yK0Short() - recPhi.Rapidity()) > cfgDeltaYAcceptanceBins->at(i)) + continue; + mcPhiK0SHist.fill(HIST("h5PhiK0SMCClosure"), i + 1, genmultiplicity, v0.pt(), v0.mK0Short(), recPhi.M()); + } + } + + // Loop over all primary pion candidates + for (const auto& track : fullMCTracks) { + if (!track.has_mcParticle()) + continue; + + auto mcTrack = track.mcParticle_as(); + if (std::abs(mcTrack.pdgCode()) != PDG_t::kPiPlus || !mcTrack.isPhysicalPrimary()) + continue; + + if (!selectionPion(track, false)) + continue; + + if (std::abs(track.rapidity(massPi)) > cfgYAcceptance) + continue; + + float nSigmaTOFPi = (track.hasTOF() ? track.tofNSigmaPi() : -999); + + closureMCPhiPionHist.fill(HIST("h6PhiPiMCClosure"), 0, genmultiplicity, track.pt(), track.tpcNSigmaPi(), nSigmaTOFPi, recPhi.M()); + for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { + if (std::abs(track.rapidity(massPi) - recPhi.Rapidity()) > cfgDeltaYAcceptanceBins->at(i)) + continue; + closureMCPhiPionHist.fill(HIST("h6PhiPiMCClosure"), i + 1, genmultiplicity, track.pt(), track.tpcNSigmaPi(), nSigmaTOFPi, recPhi.M()); + } + } + } + } + } + + PROCESS_SWITCH(Phik0shortanalysis, processPhiK0SPionMCReco2D, "Process function for Phi-K0S and Phi-Pion Correlations Efficiency correction in MCReco2D", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 2d1afb87fc492d42d925fa9039ccd814e8990f0a Mon Sep 17 00:00:00 2001 From: sangwoo <141385263+sangwoo184@users.noreply.github.com> Date: Mon, 12 May 2025 09:47:36 +0900 Subject: [PATCH 1244/1650] [PWGLF] Add a configuration flag and change configuration names (#11115) Co-authored-by: sangwoo --- PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx | 29 ++++++++++---------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx index 4602483e636..51046fcaa16 100644 --- a/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx +++ b/PWGLF/Tasks/Resonances/f0980pbpbanalysis.cxx @@ -22,7 +22,7 @@ // #include #include -#include "TLorentzVector.h" +// #include "TLorentzVector.h" #include "TRandom3.h" #include "TF1.h" #include "TVector2.h" @@ -103,9 +103,9 @@ struct F0980pbpbanalysis { Configurable cfgRapMin{"cfgRapMin", -0.5, "Minimum rapidity for pair"}; Configurable cfgRapMax{"cfgRapMax", 0.5, "Maximum rapidity for pair"}; - Configurable cfgPrimaryTrack{"cfgPrimaryTrack", true, "Primary track selection"}; - Configurable cfgGlobalWoDCATrack{"cfgGlobalWoDCATrack", true, "Global track selection without DCA"}; - Configurable cfgPVContributor{"cfgPVContributor", true, "PV contributor track selection"}; + Configurable cfgIsPrimaryTrack{"cfgIsPrimaryTrack", true, "Primary track selection"}; + Configurable cfgIsGlobalWoDCATrack{"cfgIsGlobalWoDCATrack", true, "Global track selection without DCA"}; + Configurable cfgIsPVContributor{"cfgIsPVContributor", true, "PV contributor track selection"}; Configurable cMaxTOFnSigmaPion{"cMaxTOFnSigmaPion", 3.0, "TOF nSigma cut for Pion"}; // TOF Configurable cMaxTPCnSigmaPion{"cMaxTPCnSigmaPion", 5.0, "TPC nSigma cut for Pion"}; // TPC @@ -125,13 +125,14 @@ struct F0980pbpbanalysis { Configurable cfgRotBkgNum{"cfgRotBkgNum", 10, "the number of rotational backgrounds"}; // for phi test - Configurable cfgTPCFinableClsSel{"cfgTPCFinableClsSel", true, "TPC Crossed Rows to Findable Clusters selection flag"}; + Configurable cfgRatioTPCRowsFinableClsSel{"cfgRatioTPCRowsFinableClsSel", true, "TPC Crossed Rows to Findable Clusters selection flag"}; Configurable cfgITSClsSel{"cfgITSClsSel", false, "ITS cluster selection flag"}; Configurable cfgITScluster{"cfgITScluster", 0, "Number of ITS cluster"}; Configurable cfgTOFBetaSel{"cfgTOFBetaSel", false, "TOF beta cut selection flag"}; Configurable cfgTOFBetaCut{"cfgTOFBetaCut", 0.0, "cut TOF beta"}; Configurable cfgDeepAngleSel{"cfgDeepAngleSel", true, "Deep Angle cut"}; Configurable cfgDeepAngle{"cfgDeepAngle", 0.04, "Deep Angle cut value"}; + Configurable cfgTrackIndexSel{"cfgTrackIndexSel", false, "Index selection flag"}; ConfigurableAxis massAxis{"massAxis", {400, 0.2, 2.2}, "Invariant mass axis"}; ConfigurableAxis ptAxis{"ptAxis", {VARIABLE_WIDTH, 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0, 10.0, 13.0, 20.0}, "Transverse momentum Binning"}; @@ -263,19 +264,19 @@ struct F0980pbpbanalysis { if (std::fabs(track.dcaZ()) > cfgMaxDCAzToPVcut) { return 0; } - if (cfgPVContributor && !track.isPVContributor()) { + if (cfgIsPVContributor && !track.isPVContributor()) { return 0; } - if (cfgPrimaryTrack && !track.isPrimaryTrack()) { + if (cfgIsPrimaryTrack && !track.isPrimaryTrack()) { return 0; } - if (cfgGlobalWoDCATrack && !track.isGlobalTrackWoDCA()) { + if (cfgIsGlobalWoDCATrack && !track.isGlobalTrackWoDCA()) { return 0; } if (track.tpcNClsFound() < cfgTPCcluster) { return 0; } - if (cfgTPCFinableClsSel && track.tpcCrossedRowsOverFindableCls() < cfgRatioTPCRowsOverFindableCls) { + if (cfgRatioTPCRowsFinableClsSel && track.tpcCrossedRowsOverFindableCls() < cfgRatioTPCRowsOverFindableCls) { return 0; } if (cfgITSClsSel && track.itsNCls() < cfgITScluster) { @@ -389,7 +390,7 @@ struct F0980pbpbanalysis { histos.fill(HIST("QA/EPResAC"), centrality, std::cos(static_cast(nmode) * (eventPlaneDet - eventPlaneRefB))); histos.fill(HIST("QA/EPResBC"), centrality, std::cos(static_cast(nmode) * (eventPlaneRefA - eventPlaneRefB))); - TLorentzVector pion1, pion2, pion2Rot, reco, recoRot; + ROOT::Math::PxPyPzMVector pion1, pion2, pion2Rot, reco, recoRot; for (const auto& trk1 : dTracks) { if (!trackSelected(trk1)) { continue; @@ -419,7 +420,7 @@ struct F0980pbpbanalysis { histos.fill(HIST("QA/TPC_TOF_selected"), getTpcNSigma(trk2), getTofNSigma(trk2)); } - if (cfgSelectPID == PIDList::PIDTest && trk2.globalIndex() == trk1.globalIndex()) { + if (cfgTrackIndexSel && cfgSelectPID == PIDList::PIDTest && trk2.globalIndex() <= trk1.globalIndex()) { continue; } @@ -427,8 +428,8 @@ struct F0980pbpbanalysis { continue; } - pion1.SetXYZM(trk1.px(), trk1.py(), trk1.pz(), massPtl); - pion2.SetXYZM(trk2.px(), trk2.py(), trk2.pz(), massPtl); + pion1 = ROOT::Math::PxPyPzMVector(trk1.px(), trk1.py(), trk1.pz(), massPtl); + pion2 = ROOT::Math::PxPyPzMVector(trk2.px(), trk2.py(), trk2.pz(), massPtl); reco = pion1 + pion2; if (reco.Rapidity() > cfgRapMax || reco.Rapidity() < cfgRapMin) { @@ -449,7 +450,7 @@ struct F0980pbpbanalysis { for (int nr = 0; nr < cfgRotBkgNum; nr++) { auto randomPhi = rn->Uniform(o2::constants::math::PI * 5.0 / 6.0, o2::constants::math::PI * 7.0 / 6.0); randomPhi += pion2.Phi(); - pion2Rot.SetXYZM(pion2.Pt() * std::cos(randomPhi), pion2.Pt() * std::sin(randomPhi), trk2.pz(), massPtl); + pion2Rot = ROOT::Math::PxPyPzMVector(pion2.Pt() * std::cos(randomPhi), pion2.Pt() * std::sin(randomPhi), trk2.pz(), massPtl); recoRot = pion1 + pion2Rot; relPhiRot = TVector2::Phi_0_2pi((recoRot.Phi() - eventPlaneDet) * static_cast(nmode)); histos.fill(HIST("hInvMass_f0980_USRot_EPA"), recoRot.M(), recoRot.Pt(), centrality, relPhiRot); From 558dfc3a995536b0d2cb2d328302f6a71d08f094 Mon Sep 17 00:00:00 2001 From: amaringarcia Date: Mon, 12 May 2025 10:13:27 +0200 Subject: [PATCH 1245/1650] =?UTF-8?q?[DPG]=20Creating=20a=20process=20to?= =?UTF-8?q?=20store=20in=20addition=20=20the=20dEdx=20stored=20in=20the?= =?UTF-8?q?=E2=80=A6=20(#11153)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DPG/Tasks/TPC/tpcSkimsTableCreator.cxx | 279 ++++++++++++++++++++++++- DPG/Tasks/TPC/tpcSkimsTableCreator.h | 57 ++++- 2 files changed, 327 insertions(+), 9 deletions(-) diff --git a/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx b/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx index 480e3c9d04b..6c3d1304cfe 100644 --- a/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx +++ b/DPG/Tasks/TPC/tpcSkimsTableCreator.cxx @@ -58,6 +58,7 @@ struct TreeWriterTpcV0 { /// Tables to be produced Produces rowTPCTree; + Produces rowTPCTreeWithdEdxTrkQA; Produces rowTPCTreeWithTrkQA; /// Configurables @@ -139,6 +140,58 @@ struct TreeWriterTpcV0 { } }; + template + void fillSkimmedV0TableWithdEdxTrQA(V0 const& v0, T const& track, TQA const& trackQA, bool existTrkQA, C const& collision, const float nSigmaTPC, const float nSigmaTOF, const float dEdxExp, const o2::track::PID::ID id, int runnumber, double dwnSmplFactor, float hadronicRate) + { + + const double ncl = track.tpcNClsFound(); + const double nclPID = track.tpcNClsFindableMinusPID(); + const double p = track.tpcInnerParam(); + const double mass = o2::track::pid_constants::sMasses[id]; + const double bg = p / mass; + const int multTPC = collision.multTPC(); + auto trackocc = collision.trackOccupancyInTimeRange(); + auto ft0occ = collision.ft0cOccupancyInTimeRange(); + + const float alpha = v0.alpha(); + const float qt = v0.qtarm(); + const float cosPA = v0.v0cosPA(); + const float pT = v0.pt(); + const float v0radius = v0.v0radius(); + const float gammapsipair = v0.psipair(); + + const double pseudoRndm = track.pt() * 1000. - static_cast(track.pt() * 1000); + if (pseudoRndm < dwnSmplFactor) { + rowTPCTreeWithdEdxTrkQA(track.tpcSignal(), + 1. / dEdxExp, + track.tpcInnerParam(), + track.tgl(), + track.signed1Pt(), + track.eta(), + track.phi(), + track.y(), + mass, + bg, + multTPC / 11000., + std::sqrt(nClNorm / ncl), + nclPID, + id, + nSigmaTPC, + nSigmaTOF, + alpha, + qt, + cosPA, + pT, + v0radius, + gammapsipair, + runnumber, + trackocc, + ft0occ, + hadronicRate, + existTrkQA ? trackQA.tpcdEdxNorm() : -999); + } + }; + /// Function to fill skimmed tables template void fillSkimmedV0TableWithTrQA(V0 const& v0, T const& track, TQA const& trackQA, bool existTrkQA, C const& collision, const float nSigmaTPC, const float nSigmaTOF, const float dEdxExp, const o2::track::PID::ID id, int runnumber, double dwnSmplFactor, float hadronicRate, int bcGlobalIndex, int bcTimeFrameId, int bcBcInTimeFrame) @@ -199,7 +252,8 @@ struct TreeWriterTpcV0 { existTrkQA ? trackQA.tpcdEdxTot0R() : -999, existTrkQA ? trackQA.tpcdEdxTot1R() : -999, existTrkQA ? trackQA.tpcdEdxTot2R() : -999, - existTrkQA ? trackQA.tpcdEdxTot3R() : -999); + existTrkQA ? trackQA.tpcdEdxTot3R() : -999, + existTrkQA ? trackQA.tpcdEdxNorm() : -999); } }; @@ -324,7 +378,99 @@ struct TreeWriterTpcV0 { Preslice perCollisionTracks = aod::track::collisionId; Preslice perCollisionV0s = aod::v0data::collisionId; - void processWithTrQA(Colls const& collisions, Trks const& myTracks, V0sWithID const& myV0s, MyBCTable const&, aod::TracksQA_002 const& tracksQA) + void processWithdEdxTrQA(Colls const& collisions, Trks const& myTracks, V0sWithID const& myV0s, aod::BCsWithTimestamps const&, aod::TracksQAVersion const& tracksQA) + { + std::vector labelTrack2TrackQA; + labelTrack2TrackQA.clear(); + labelTrack2TrackQA.resize(myTracks.size(), -1); + for (const auto& trackQA : tracksQA) { + int64_t trackId = trackQA.trackId(); + int64_t trackQAIndex = trackQA.globalIndex(); + labelTrack2TrackQA[trackId] = trackQAIndex; + } + for (const auto& collision : collisions) { + auto tracks = myTracks.sliceBy(perCollisionTracks, collision.globalIndex()); + auto v0s = myV0s.sliceBy(perCollisionV0s, collision.globalIndex()); + /// Check event slection + if (!isEventSelected(collision, tracks)) { + continue; + } + auto bc = collision.bc_as(); + const int runnumber = bc.runNumber(); + float hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), runnumber, irSource) * 1.e-3; + rowTPCTreeWithTrkQA.reserve(tracks.size()); + /// Loop over v0 candidates + for (const auto& v0 : v0s) { + auto posTrack = v0.posTrack_as(); + auto negTrack = v0.negTrack_as(); + if (v0.v0addid() == -1) { + continue; + } + aod::TracksQA posTrackQA; + aod::TracksQA negTrackQA; + bool existPosTrkQA; + bool existNegTrkQA; + if (labelTrack2TrackQA[posTrack.globalIndex()] != -1) { + posTrackQA = tracksQA.iteratorAt(labelTrack2TrackQA[posTrack.globalIndex()]); + existPosTrkQA = true; + } else { + posTrackQA = tracksQA.iteratorAt(0); + existPosTrkQA = false; + } + if (labelTrack2TrackQA[negTrack.globalIndex()] != -1) { + negTrackQA = tracksQA.iteratorAt(labelTrack2TrackQA[negTrack.globalIndex()]); + existNegTrkQA = true; + } else { + negTrackQA = tracksQA.iteratorAt(0); + existNegTrkQA = false; + } + + // gamma + if (static_cast(posTrack.pidbit() & (1 << 0)) && static_cast(negTrack.pidbit() & (1 << 0))) { + if (downsampleTsalisCharged(posTrack.pt(), downsamplingTsalisElectrons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Electron], maxPt4dwnsmplTsalisElectrons)) { + fillSkimmedV0TableWithdEdxTrQA(v0, posTrack, posTrackQA, existPosTrkQA, collision, posTrack.tpcNSigmaEl(), posTrack.tofNSigmaEl(), posTrack.tpcExpSignalEl(posTrack.tpcSignal()), o2::track::PID::Electron, runnumber, dwnSmplFactor_El, hadronicRate); + } + if (downsampleTsalisCharged(negTrack.pt(), downsamplingTsalisElectrons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Electron], maxPt4dwnsmplTsalisElectrons)) { + fillSkimmedV0TableWithdEdxTrQA(v0, negTrack, negTrackQA, existNegTrkQA, collision, negTrack.tpcNSigmaEl(), negTrack.tofNSigmaEl(), negTrack.tpcExpSignalEl(negTrack.tpcSignal()), o2::track::PID::Electron, runnumber, dwnSmplFactor_El, hadronicRate); + } + } + // Ks0 + if (static_cast(posTrack.pidbit() & (1 << 1)) && static_cast(negTrack.pidbit() & (1 << 1))) { + if (downsampleTsalisCharged(posTrack.pt(), downsamplingTsalisPions, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Pion], maxPt4dwnsmplTsalisPions)) { + fillSkimmedV0TableWithdEdxTrQA(v0, posTrack, posTrackQA, existPosTrkQA, collision, posTrack.tpcNSigmaPi(), posTrack.tofNSigmaPi(), posTrack.tpcExpSignalPi(posTrack.tpcSignal()), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate); + } + if (downsampleTsalisCharged(negTrack.pt(), downsamplingTsalisPions, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Pion], maxPt4dwnsmplTsalisPions)) { + fillSkimmedV0TableWithdEdxTrQA(v0, negTrack, negTrackQA, existNegTrkQA, collision, negTrack.tpcNSigmaPi(), negTrack.tofNSigmaPi(), negTrack.tpcExpSignalPi(negTrack.tpcSignal()), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate); + } + } + // Lambda + if (static_cast(posTrack.pidbit() & (1 << 2)) && static_cast(negTrack.pidbit() & (1 << 2))) { + if (downsampleTsalisCharged(posTrack.pt(), downsamplingTsalisProtons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Proton], maxPt4dwnsmplTsalisProtons)) { + if (std::abs(posTrack.tofNSigmaPr()) <= nSigmaTOFdautrack) { + fillSkimmedV0TableWithdEdxTrQA(v0, posTrack, posTrackQA, existPosTrkQA, collision, posTrack.tpcNSigmaPr(), posTrack.tofNSigmaPr(), posTrack.tpcExpSignalPr(posTrack.tpcSignal()), o2::track::PID::Proton, runnumber, dwnSmplFactor_Pr, hadronicRate); + } + } + if (downsampleTsalisCharged(negTrack.pt(), downsamplingTsalisPions, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Pion], maxPt4dwnsmplTsalisPions)) { + fillSkimmedV0TableWithdEdxTrQA(v0, negTrack, negTrackQA, existNegTrkQA, collision, negTrack.tpcNSigmaPi(), negTrack.tofNSigmaPi(), negTrack.tpcExpSignalPi(negTrack.tpcSignal()), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate); + } + } + // Antilambda + if (static_cast(posTrack.pidbit() & (1 << 3)) && static_cast(negTrack.pidbit() & (1 << 3))) { + if (downsampleTsalisCharged(posTrack.pt(), downsamplingTsalisPions, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Pion], maxPt4dwnsmplTsalisPions)) { + fillSkimmedV0TableWithdEdxTrQA(v0, posTrack, posTrackQA, existPosTrkQA, collision, posTrack.tpcNSigmaPi(), posTrack.tofNSigmaPi(), posTrack.tpcExpSignalPi(posTrack.tpcSignal()), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate); + } + if (downsampleTsalisCharged(negTrack.pt(), downsamplingTsalisProtons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Proton], maxPt4dwnsmplTsalisProtons)) { + if (std::abs(negTrack.tofNSigmaPr()) <= nSigmaTOFdautrack) { + fillSkimmedV0TableWithdEdxTrQA(v0, negTrack, negTrackQA, existNegTrkQA, collision, negTrack.tpcNSigmaPr(), negTrack.tofNSigmaPr(), negTrack.tpcExpSignalPr(negTrack.tpcSignal()), o2::track::PID::Proton, runnumber, dwnSmplFactor_Pr, hadronicRate); + } + } + } + } + } + } /// process with dEdx from TrackQA + PROCESS_SWITCH(TreeWriterTpcV0, processWithdEdxTrQA, "Standard V0 Samples with dEdx from Track QA for PID", false); + + void processWithTrQA(Colls const& collisions, Trks const& myTracks, V0sWithID const& myV0s, MyBCTable const&, aod::TracksQAVersion const& tracksQA) { std::vector labelTrack2TrackQA; labelTrack2TrackQA.clear(); @@ -355,8 +501,8 @@ struct TreeWriterTpcV0 { if (v0.v0addid() == -1) { continue; } - aod::TracksQA_002::iterator posTrackQA; - aod::TracksQA_002::iterator negTrackQA; + aod::TracksQA posTrackQA; + aod::TracksQA negTrackQA; bool existPosTrkQA; bool existNegTrkQA; if (labelTrack2TrackQA[posTrack.globalIndex()] != -1) { @@ -418,6 +564,7 @@ struct TreeWriterTpcV0 { } } /// process with TrackQA PROCESS_SWITCH(TreeWriterTpcV0, processWithTrQA, "Standard V0 Samples with Track QA for PID", false); + void processDummy(Colls const&) {} PROCESS_SWITCH(TreeWriterTpcV0, processDummy, "Dummy function", false); @@ -438,6 +585,7 @@ struct TreeWriterTPCTOF { /// Tables to be produced Produces rowTPCTOFTree; + Produces rowTPCTOFTreeWithdEdxTrkQA; Produces rowTPCTOFTreeWithTrkQA; /// Configurables @@ -563,6 +711,45 @@ struct TreeWriterTPCTOF { hadronicRate); } }; + template + void fillSkimmedTPCTOFTableWithdEdxTrkQA(T const& track, TQA const& trackQA, bool existTrkQA, C const& collision, const float nSigmaTPC, const float nSigmaTOF, const float nSigmaITS, const float dEdxExp, const o2::track::PID::ID id, int runnumber, double dwnSmplFactor, double hadronicRate) + { + + const double ncl = track.tpcNClsFound(); + const double nclPID = track.tpcNClsFindableMinusPID(); + const double p = track.tpcInnerParam(); + const double mass = o2::track::pid_constants::sMasses[id]; + const double bg = p / mass; + const int multTPC = collision.multTPC(); + auto trackocc = collision.trackOccupancyInTimeRange(); + auto ft0occ = collision.ft0cOccupancyInTimeRange(); + + const double pseudoRndm = track.pt() * 1000. - static_cast(track.pt() * 1000); + if (pseudoRndm < dwnSmplFactor) { + rowTPCTOFTreeWithdEdxTrkQA(track.tpcSignal(), + 1. / dEdxExp, + track.tpcInnerParam(), + track.tgl(), + track.signed1Pt(), + track.eta(), + track.phi(), + track.y(), + mass, + bg, + multTPC / 11000., + std::sqrt(nClNorm / ncl), + nclPID, + id, + nSigmaTPC, + nSigmaTOF, + nSigmaITS, + runnumber, + trackocc, + ft0occ, + hadronicRate, + existTrkQA ? trackQA.tpcdEdxNorm() : -999); + } + }; /// Function to fill trees template void fillSkimmedTPCTOFTableWithTrkQA(T const& track, TQA const& trackQA, bool existTrkQA, C const& collision, const float nSigmaTPC, const float nSigmaTOF, const float nSigmaITS, const float dEdxExp, const o2::track::PID::ID id, int runnumber, double dwnSmplFactor, double hadronicRate, int bcGlobalIndex, int bcTimeFrameId, int bcBcInTimeFrame) @@ -611,7 +798,8 @@ struct TreeWriterTPCTOF { existTrkQA ? trackQA.tpcdEdxTot0R() : -999, existTrkQA ? trackQA.tpcdEdxTot1R() : -999, existTrkQA ? trackQA.tpcdEdxTot2R() : -999, - existTrkQA ? trackQA.tpcdEdxTot3R() : -999); + existTrkQA ? trackQA.tpcdEdxTot3R() : -999, + existTrkQA ? trackQA.tpcdEdxNorm() : -999); } }; @@ -684,7 +872,84 @@ struct TreeWriterTPCTOF { } /// process PROCESS_SWITCH(TreeWriterTPCTOF, processStandard, "Standard Samples for PID", true); Preslice perCollisionTracks = aod::track::collisionId; - void processWithTrQA(Colls const& collisions, Trks const& myTracks, MyBCTable const&, aod::TracksQA_002 const& tracksQA) + void processWithdEdxTrQA(Colls const& collisions, Trks const& myTracks, aod::BCsWithTimestamps const&, aod::TracksQAVersion const& tracksQA) + { + std::vector labelTrack2TrackQA; + labelTrack2TrackQA.clear(); + labelTrack2TrackQA.resize(myTracks.size(), -1); + for (const auto& trackQA : tracksQA) { + int64_t trackId = trackQA.trackId(); + int64_t trackQAIndex = trackQA.globalIndex(); + labelTrack2TrackQA[trackId] = trackQAIndex; + } + for (const auto& collision : collisions) { + auto tracks = myTracks.sliceBy(perCollisionTracks, collision.globalIndex()); + auto tracksWithITSPid = soa::Attach(tracks); + /// Check event selection + if (!isEventSelected(collision, tracks)) { + continue; + } + auto bc = collision.bc_as(); + const int runnumber = bc.runNumber(); + float hadronicRate = mRateFetcher.fetch(ccdb.service, bc.timestamp(), runnumber, irSource) * 1.e-3; + rowTPCTOFTreeWithTrkQA.reserve(tracks.size()); + for (auto const& trk : tracksWithITSPid) { + if (!((trackSelection == 0) || + ((trackSelection == 1) && trk.isGlobalTrack()) || + ((trackSelection == 2) && trk.isGlobalTrackWoPtEta()) || + ((trackSelection == 3) && trk.isGlobalTrackWoDCA()) || + ((trackSelection == 4) && trk.isQualityTrack()) || + ((trackSelection == 5) && trk.isInAcceptanceTrack()))) { + continue; + } + // get the corresponding trackQA using labelTracks2TracKQA and get variables of interest + aod::TracksQA trackQA; + bool existTrkQA; + if (labelTrack2TrackQA[trk.globalIndex()] != -1) { + trackQA = tracksQA.iteratorAt(labelTrack2TrackQA[trk.globalIndex()]); + existTrkQA = true; + } else { + trackQA = tracksQA.iteratorAt(0); + existTrkQA = false; + } + /// Fill tree for tritons + if (trk.tpcInnerParam() < maxMomHardCutOnlyTr && trk.tpcInnerParam() <= maxMomTPCOnlyTr && std::abs(trk.tpcNSigmaTr()) < nSigmaTPCOnlyTr && downsampleTsalisCharged(trk.pt(), downsamplingTsalisProtons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Triton])) { + fillSkimmedTPCTOFTableWithdEdxTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaTr(), trk.tofNSigmaTr(), trk.itsNSigmaTr(), trk.tpcExpSignalTr(trk.tpcSignal()), o2::track::PID::Triton, runnumber, dwnSmplFactor_Tr, hadronicRate); + } else if (trk.tpcInnerParam() < maxMomHardCutOnlyTr && trk.tpcInnerParam() > maxMomTPCOnlyTr && std::abs(trk.tofNSigmaTr()) < nSigmaTOF_TPCTOF_Tr && std::abs(trk.tpcNSigmaTr()) < nSigmaTPC_TPCTOF_Tr && downsampleTsalisCharged(trk.pt(), downsamplingTsalisProtons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Triton])) { + fillSkimmedTPCTOFTableWithdEdxTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaTr(), trk.tofNSigmaTr(), trk.itsNSigmaTr(), trk.tpcExpSignalTr(trk.tpcSignal()), o2::track::PID::Triton, runnumber, dwnSmplFactor_Tr, hadronicRate); + } + /// Fill tree for deuterons + if (trk.tpcInnerParam() < maxMomHardCutOnlyDe && trk.tpcInnerParam() <= maxMomTPCOnlyDe && std::abs(trk.tpcNSigmaDe()) < nSigmaTPCOnlyDe && downsampleTsalisCharged(trk.pt(), downsamplingTsalisProtons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Deuteron])) { + fillSkimmedTPCTOFTableWithdEdxTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaDe(), trk.tofNSigmaDe(), trk.itsNSigmaDe(), trk.tpcExpSignalDe(trk.tpcSignal()), o2::track::PID::Deuteron, runnumber, dwnSmplFactor_De, hadronicRate); + } else if (trk.tpcInnerParam() < maxMomHardCutOnlyDe && trk.tpcInnerParam() > maxMomTPCOnlyDe && std::abs(trk.tofNSigmaDe()) < nSigmaTOF_TPCTOF_De && std::abs(trk.tpcNSigmaDe()) < nSigmaTPC_TPCTOF_De && downsampleTsalisCharged(trk.pt(), downsamplingTsalisProtons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Deuteron])) { + fillSkimmedTPCTOFTableWithdEdxTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaDe(), trk.tofNSigmaDe(), trk.itsNSigmaDe(), trk.tpcExpSignalDe(trk.tpcSignal()), o2::track::PID::Deuteron, runnumber, dwnSmplFactor_De, hadronicRate); + } + /// Fill tree for protons + if (trk.tpcInnerParam() <= maxMomTPCOnlyPr && std::abs(trk.tpcNSigmaPr()) < nSigmaTPCOnlyPr && downsampleTsalisCharged(trk.pt(), downsamplingTsalisProtons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Proton])) { + fillSkimmedTPCTOFTableWithdEdxTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaPr(), trk.tofNSigmaPr(), trk.itsNSigmaPr(), trk.tpcExpSignalPr(trk.tpcSignal()), o2::track::PID::Proton, runnumber, dwnSmplFactor_Pr, hadronicRate); + } else if (trk.tpcInnerParam() > maxMomTPCOnlyPr && std::abs(trk.tofNSigmaPr()) < nSigmaTOF_TPCTOF_Pr && std::abs(trk.tpcNSigmaPr()) < nSigmaTPC_TPCTOF_Pr && downsampleTsalisCharged(trk.pt(), downsamplingTsalisProtons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Proton])) { + fillSkimmedTPCTOFTableWithdEdxTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaPr(), trk.tofNSigmaPr(), trk.itsNSigmaPr(), trk.tpcExpSignalPr(trk.tpcSignal()), o2::track::PID::Proton, runnumber, dwnSmplFactor_Pr, hadronicRate); + } + /// Fill tree for kaons + if (trk.tpcInnerParam() < maxMomHardCutOnlyKa && trk.tpcInnerParam() <= maxMomTPCOnlyKa && std::abs(trk.tpcNSigmaKa()) < nSigmaTPCOnlyKa && downsampleTsalisCharged(trk.pt(), downsamplingTsalisKaons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Kaon])) { + fillSkimmedTPCTOFTableWithdEdxTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaKa(), trk.tofNSigmaKa(), trk.itsNSigmaKa(), trk.tpcExpSignalKa(trk.tpcSignal()), o2::track::PID::Kaon, runnumber, dwnSmplFactor_Ka, hadronicRate); + } else if (trk.tpcInnerParam() < maxMomHardCutOnlyKa && trk.tpcInnerParam() > maxMomTPCOnlyKa && std::abs(trk.tofNSigmaKa()) < nSigmaTOF_TPCTOF_Ka && std::abs(trk.tpcNSigmaKa()) < nSigmaTPC_TPCTOF_Ka && downsampleTsalisCharged(trk.pt(), downsamplingTsalisKaons, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Kaon])) { + fillSkimmedTPCTOFTableWithdEdxTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaKa(), trk.tofNSigmaKa(), trk.itsNSigmaKa(), trk.tpcExpSignalKa(trk.tpcSignal()), o2::track::PID::Kaon, runnumber, dwnSmplFactor_Ka, hadronicRate); + } + /// Fill tree pions + if (trk.tpcInnerParam() <= maxMomTPCOnlyPi && std::abs(trk.tpcNSigmaPi()) < nSigmaTPCOnlyPi && downsampleTsalisCharged(trk.pt(), downsamplingTsalisPions, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Pion])) { + fillSkimmedTPCTOFTableWithdEdxTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaPi(), trk.tofNSigmaPi(), trk.itsNSigmaPi(), trk.tpcExpSignalPi(trk.tpcSignal()), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate); + } else if (trk.tpcInnerParam() > maxMomTPCOnlyPi && std::abs(trk.tofNSigmaPi()) < nSigmaTOF_TPCTOF_Pi && std::abs(trk.tpcNSigmaPi()) < nSigmaTPC_TPCTOF_Pi && downsampleTsalisCharged(trk.pt(), downsamplingTsalisPions, sqrtSNN, o2::track::pid_constants::sMasses[o2::track::PID::Pion])) { + fillSkimmedTPCTOFTableWithdEdxTrkQA(trk, trackQA, existTrkQA, collision, trk.tpcNSigmaPi(), trk.tofNSigmaPi(), trk.itsNSigmaPi(), trk.tpcExpSignalPi(trk.tpcSignal()), o2::track::PID::Pion, runnumber, dwnSmplFactor_Pi, hadronicRate); + } + } /// Loop tracks + } + } /// process + PROCESS_SWITCH(TreeWriterTPCTOF, processWithdEdxTrQA, "Samples for PID with TrackQA info", false); + void processWithTrQA(Colls const& collisions, Trks const& myTracks, MyBCTable const&, aod::TracksQAVersion const& tracksQA) { std::vector labelTrack2TrackQA; labelTrack2TrackQA.clear(); @@ -721,7 +986,7 @@ struct TreeWriterTPCTOF { continue; } // get the corresponding trackQA using labelTracks2TracKQA and get variables of interest - aod::TracksQA_002::iterator trackQA; + aod::TracksQA trackQA; bool existTrkQA; if (labelTrack2TrackQA[trk.globalIndex()] != -1) { trackQA = tracksQA.iteratorAt(labelTrack2TrackQA[trk.globalIndex()]); diff --git a/DPG/Tasks/TPC/tpcSkimsTableCreator.h b/DPG/Tasks/TPC/tpcSkimsTableCreator.h index 1dcab1abfae..decb3a9de60 100644 --- a/DPG/Tasks/TPC/tpcSkimsTableCreator.h +++ b/DPG/Tasks/TPC/tpcSkimsTableCreator.h @@ -79,6 +79,34 @@ DECLARE_SOA_TABLE(SkimmedTPCV0Tree, "AOD", "TPCSKIMV0TREE", tpcskims::TrackOcc, tpcskims::Ft0Occ, tpcskims::HadronicRate); +DECLARE_SOA_TABLE(SkimmedTPCV0TreeWithdEdxTrkQA, "AOD", "TPCSKIMV0WdE", + o2::aod::track::TPCSignal, + tpcskims::InvDeDxExpTPC, + o2::aod::track::TPCInnerParam, + o2::aod::track::Tgl, + o2::aod::track::Signed1Pt, + o2::aod::track::Eta, + o2::aod::track::Phi, + o2::aod::track::Y, + tpcskims::Mass, + tpcskims::BetaGamma, + tpcskims::NormMultTPC, + tpcskims::NormNClustersTPC, + tpcskims::NormNClustersTPCPID, + tpcskims::PidIndex, + tpcskims::NSigTPC, + tpcskims::NSigTOF, + tpcskims::AlphaV0, + tpcskims::QtV0, + tpcskims::CosPAV0, + tpcskims::PtV0, + tpcskims::RadiusV0, + tpcskims::GammaPsiPair, + tpcskims::RunNumber, + tpcskims::TrackOcc, + tpcskims::Ft0Occ, + tpcskims::HadronicRate, + o2::aod::trackqa::TPCdEdxNorm); DECLARE_SOA_TABLE(SkimmedTPCV0TreeWithTrkQA, "AOD", "TPCSKIMV0WQA", o2::aod::track::TPCSignal, tpcskims::InvDeDxExpTPC, @@ -117,7 +145,8 @@ DECLARE_SOA_TABLE(SkimmedTPCV0TreeWithTrkQA, "AOD", "TPCSKIMV0WQA", o2::aod::trackqa::TPCdEdxTot0R, o2::aod::trackqa::TPCdEdxTot1R, o2::aod::trackqa::TPCdEdxTot2R, - o2::aod::trackqa::TPCdEdxTot3R); + o2::aod::trackqa::TPCdEdxTot3R, + o2::aod::trackqa::TPCdEdxNorm); DECLARE_SOA_TABLE(SkimmedTPCTOFTree, "AOD", "TPCTOFSKIMTREE", o2::aod::track::TPCSignal, @@ -141,6 +170,29 @@ DECLARE_SOA_TABLE(SkimmedTPCTOFTree, "AOD", "TPCTOFSKIMTREE", tpcskims::Ft0Occ, tpcskims::HadronicRate); +DECLARE_SOA_TABLE(SkimmedTPCTOFTreeWithdEdxTrkQA, "AOD", "TPCTOFSKIMWdE", + o2::aod::track::TPCSignal, + tpcskims::InvDeDxExpTPC, + o2::aod::track::TPCInnerParam, + o2::aod::track::Tgl, + o2::aod::track::Signed1Pt, + o2::aod::track::Eta, + o2::aod::track::Phi, + o2::aod::track::Y, + tpcskims::Mass, + tpcskims::BetaGamma, + tpcskims::NormMultTPC, + tpcskims::NormNClustersTPC, + tpcskims::NormNClustersTPCPID, + tpcskims::PidIndex, + tpcskims::NSigTPC, + tpcskims::NSigTOF, + tpcskims::NSigITS, + tpcskims::RunNumber, + tpcskims::TrackOcc, + tpcskims::Ft0Occ, + tpcskims::HadronicRate, + o2::aod::trackqa::TPCdEdxNorm); DECLARE_SOA_TABLE(SkimmedTPCTOFTreeWithTrkQA, "AOD", "TPCTOFSKIMWQA", o2::aod::track::TPCSignal, tpcskims::InvDeDxExpTPC, @@ -174,6 +226,7 @@ DECLARE_SOA_TABLE(SkimmedTPCTOFTreeWithTrkQA, "AOD", "TPCTOFSKIMWQA", o2::aod::trackqa::TPCdEdxTot0R, o2::aod::trackqa::TPCdEdxTot1R, o2::aod::trackqa::TPCdEdxTot2R, - o2::aod::trackqa::TPCdEdxTot3R); + o2::aod::trackqa::TPCdEdxTot3R, + o2::aod::trackqa::TPCdEdxNorm); } // namespace o2::aod #endif // DPG_TASKS_TPC_TPCSKIMSTABLECREATOR_H_ From 49a2a96a743c4a368762ae32e5822e5319af5960 Mon Sep 17 00:00:00 2001 From: Phil Stahlhut <138057549+pstahlhu@users.noreply.github.com> Date: Mon, 12 May 2025 12:16:27 +0200 Subject: [PATCH 1246/1650] [PWGHF] Update MC matching in XicToXiPiPi workflow (#11125) --- .../DataModel/CandidateReconstructionTables.h | 8 +- .../candidateCreatorXicToXiPiPi.cxx | 121 +++++++++++++----- .../TableProducer/treeCreatorXicToXiPiPi.cxx | 80 ++++++------ 3 files changed, 128 insertions(+), 81 deletions(-) diff --git a/PWGHF/DataModel/CandidateReconstructionTables.h b/PWGHF/DataModel/CandidateReconstructionTables.h index a7050fed604..7d6bb82e4c8 100644 --- a/PWGHF/DataModel/CandidateReconstructionTables.h +++ b/PWGHF/DataModel/CandidateReconstructionTables.h @@ -1733,8 +1733,6 @@ DECLARE_SOA_COLUMN(NSigTofPrFromLambda, nSigTofPrFromLambda, float); // MC matching result: DECLARE_SOA_COLUMN(FlagMcMatchRec, flagMcMatchRec, int8_t); // reconstruction level DECLARE_SOA_COLUMN(FlagMcMatchGen, flagMcMatchGen, int8_t); // generator level -DECLARE_SOA_COLUMN(DebugMcRec, debugMcRec, int8_t); // debug flag for mis-association reconstruction level -DECLARE_SOA_COLUMN(DebugMcGen, debugMcGen, int8_t); DECLARE_SOA_COLUMN(OriginRec, originRec, int8_t); DECLARE_SOA_COLUMN(OriginGen, originGen, int8_t); // Dynamic columns @@ -1821,14 +1819,12 @@ DECLARE_SOA_TABLE(HfCandXicKF, "AOD", "HFCANDXICKF", // table with results of reconstruction level MC matching DECLARE_SOA_TABLE(HfCandXicMcRec, "AOD", "HFCANDXICMCREC", //! hf_cand_xic_to_xi_pi_pi::FlagMcMatchRec, - hf_cand_xic_to_xi_pi_pi::DebugMcRec, hf_cand_xic_to_xi_pi_pi::OriginRec); - // table with results of generator level MC matching DECLARE_SOA_TABLE(HfCandXicMcGen, "AOD", "HFCANDXICMCGEN", //! hf_cand_xic_to_xi_pi_pi::FlagMcMatchGen, - hf_cand_xic_to_xi_pi_pi::DebugMcGen, - hf_cand_xic_to_xi_pi_pi::OriginGen); + hf_cand_xic_to_xi_pi_pi::OriginGen, + hf_cand::PdgBhadMotherPart); // specific chic candidate properties namespace hf_cand_chic diff --git a/PWGHF/TableProducer/candidateCreatorXicToXiPiPi.cxx b/PWGHF/TableProducer/candidateCreatorXicToXiPiPi.cxx index 52d8686efdd..b5709e5a778 100644 --- a/PWGHF/TableProducer/candidateCreatorXicToXiPiPi.cxx +++ b/PWGHF/TableProducer/candidateCreatorXicToXiPiPi.cxx @@ -858,6 +858,17 @@ struct HfCandidateCreatorXicToXiPiPiExpressions { Produces rowMcMatchRec; Produces rowMcMatchGen; + Configurable fillMcHistograms{"fillMcHistograms", true, "Fill validation plots"}; + Configurable matchDecayedPions{"matchDecayedPions", true, "Match also candidates with daughter pion tracks that decay with kinked topology"}; + Configurable matchInteractionsWithMaterial{"matchInteractionsWithMaterial", true, "Match also candidates with daughter tracks that interact with material"}; + + HfEventSelectionMc hfEvSelMc; + + enum DebugRec { TotalRec = 0, + XicToFinalState, + XiToPiPPi, + LambdaToPPi }; + using McCollisionsNoCents = soa::Join; using McCollisionsFT0Cs = soa::Join; using McCollisionsFT0Ms = soa::Join; @@ -871,14 +882,23 @@ struct HfCandidateCreatorXicToXiPiPiExpressions { HistogramRegistry registry{"registry"}; - HfEventSelectionMc hfEvSelMc; - void init(InitContext& initContext) { + // add histograms to registry + if (fillMcHistograms) { + registry.add("hDecayedPions", "hDecayedPions", {HistType::kTH1F, {{5, -0.5, 4.5}}}); + registry.add("hInteractionsWithMaterial", "hInteractionsWithMaterial", {HistType::kTH1F, {{21, -0.5, 20.5}}}); + registry.add("hDebugRec", "hDebugRec", {HistType::kTH1F, {{4, -0.5, 3.5}}}); + registry.get(HIST("hDebugRec"))->GetXaxis()->SetBinLabel(1 + TotalRec, "total"); + registry.get(HIST("hDebugRec"))->GetXaxis()->SetBinLabel(1 + XicToFinalState, "#Xi^{+}_{c} #rightarrow #pi^{#plus}) #pi^{#plus} #pi^{#minus} p #pi^{#minus}"); + registry.get(HIST("hDebugRec"))->GetXaxis()->SetBinLabel(1 + XiToPiPPi, "#Xi^{#minus} #rightarrow #pi^{#minus} p #pi^{#minus}"); + registry.get(HIST("hDebugRec"))->GetXaxis()->SetBinLabel(1 + LambdaToPPi, "#Lambda #rightarrow p #pi^{#minus}"); + } + + // initialize HF event selection helper const auto& workflows = initContext.services().get(); for (const DeviceSpec& device : workflows.devices) { if (device.name.compare("hf-candidate-creator-xic-to-xi-pi-pi") == 0) { - // init HF event selection helper hfEvSelMc.init(device, registry); break; } @@ -898,20 +918,24 @@ struct HfCandidateCreatorXicToXiPiPiExpressions { int indexRecXicPlus = -1; int8_t sign = 0; int8_t flag = 0; - int8_t origin = 0; - int8_t debug = 0; - // for resonance matching: + int8_t origin = RecoDecay::OriginType::None; + int8_t nPionsDecayed = 0; + int8_t nInteractionsWithMaterial = 0; + // for resonance matching std::vector arrDaughIndex; constexpr std::size_t NDaughtersResonant{2u}; std::array arrPDGDaugh; std::array arrXiResonance = {3324, kPiPlus}; // 3324: Ξ(1530) + // for non-prompt + std::vector idxBhadMothers; // Match reconstructed candidates. for (const auto& candidate : *rowCandidateXic) { - flag = 0; sign = 0; + flag = 0; origin = RecoDecay::OriginType::None; - debug = 0; + nPionsDecayed = 0; + nInteractionsWithMaterial = 0; arrDaughIndex.clear(); auto arrayDaughters = std::array{candidate.pi0_as(), // pi <- Xic @@ -925,25 +949,53 @@ struct HfCandidateCreatorXicToXiPiPiExpressions { auto arrayDaughtersV0 = std::array{candidate.posTrack_as(), candidate.negTrack_as()}; + if (fillMcHistograms) { + registry.fill(HIST("hDebugRec"), TotalRec); + } + // Xic → pi pi pi pi p - indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, Pdg::kXiCPlus, std::array{+kPiPlus, +kPiPlus, +kPiMinus, +kProton, +kPiMinus}, true, &sign, 4); - indexRecXicPlus = indexRec; - if (indexRec == -1) { - debug = 1; + if (matchDecayedPions && matchInteractionsWithMaterial) { + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, Pdg::kXiCPlus, std::array{+kPiPlus, +kPiPlus, +kPiMinus, +kProton, +kPiMinus}, true, &sign, 4, &nPionsDecayed, nullptr, &nInteractionsWithMaterial); + } else if (matchDecayedPions && !matchInteractionsWithMaterial) { + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, Pdg::kXiCPlus, std::array{+kPiPlus, +kPiPlus, +kPiMinus, +kProton, +kPiMinus}, true, &sign, 4, &nPionsDecayed, nullptr, &nInteractionsWithMaterial); + } else if (!matchDecayedPions && matchInteractionsWithMaterial) { + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, Pdg::kXiCPlus, std::array{+kPiPlus, +kPiPlus, +kPiMinus, +kProton, +kPiMinus}, true, &sign, 4, &nPionsDecayed, nullptr, &nInteractionsWithMaterial); + } else { + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, Pdg::kXiCPlus, std::array{+kPiPlus, +kPiPlus, +kPiMinus, +kProton, +kPiMinus}, true, &sign, 4, &nPionsDecayed, nullptr, &nInteractionsWithMaterial); } + indexRecXicPlus = indexRec; if (indexRec > -1) { + if (fillMcHistograms) { + registry.fill(HIST("hDebugRec"), XicToFinalState); + } // Xi- → pi pi p - indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersCasc, +kXiMinus, std::array{+kPiMinus, +kProton, +kPiMinus}, true, &sign, 2); - if (indexRec == -1) { - debug = 2; + if (matchDecayedPions && matchInteractionsWithMaterial) { + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersCasc, +kXiMinus, std::array{+kPiMinus, +kProton, +kPiMinus}, true, nullptr, 2); + } else if (matchDecayedPions && !matchInteractionsWithMaterial) { + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersCasc, +kXiMinus, std::array{+kPiMinus, +kProton, +kPiMinus}, true, nullptr, 2); + } else if (!matchDecayedPions && matchInteractionsWithMaterial) { + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersCasc, +kXiMinus, std::array{+kPiMinus, +kProton, +kPiMinus}, true, nullptr, 2); + } else { + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersCasc, +kXiMinus, std::array{+kPiMinus, +kProton, +kPiMinus}, true, nullptr, 2); } if (indexRec > -1) { + if (fillMcHistograms) { + registry.fill(HIST("hDebugRec"), XiToPiPPi); + } // Lambda → p pi - indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersV0, +kLambda0, std::array{+kProton, +kPiMinus}, true, &sign, 1); - if (indexRec == -1) { - debug = 3; + if (matchDecayedPions && matchInteractionsWithMaterial) { + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersV0, +kLambda0, std::array{+kProton, +kPiMinus}, true); + } else if (matchDecayedPions && !matchInteractionsWithMaterial) { + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersV0, +kLambda0, std::array{+kProton, +kPiMinus}, true); + } else if (!matchDecayedPions && matchInteractionsWithMaterial) { + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersV0, +kLambda0, std::array{+kProton, +kPiMinus}, true); + } else { + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughtersV0, +kLambda0, std::array{+kProton, +kPiMinus}, true); } if (indexRec > -1) { + if (fillMcHistograms) { + registry.fill(HIST("hDebugRec"), LambdaToPPi); + } RecoDecay::getDaughters(mcParticles.rawIteratorAt(indexRecXicPlus), &arrDaughIndex, std::array{0}, 1); if (arrDaughIndex.size() == NDaughtersResonant) { for (auto iProng = 0u; iProng < NDaughtersResonant; ++iProng) { @@ -952,8 +1004,6 @@ struct HfCandidateCreatorXicToXiPiPiExpressions { } if ((arrPDGDaugh[0] == arrXiResonance[0] && arrPDGDaugh[1] == arrXiResonance[1]) || (arrPDGDaugh[0] == arrXiResonance[1] && arrPDGDaugh[1] == arrXiResonance[0])) { flag = sign * (1 << aod::hf_cand_xic_to_xi_pi_pi::DecayType::XicToXiResPiToXiPiPi); - } else { - debug = 4; } } else { flag = sign * (1 << aod::hf_cand_xic_to_xi_pi_pi::DecayType::XicToXiPiPi); @@ -967,8 +1017,13 @@ struct HfCandidateCreatorXicToXiPiPiExpressions { auto particle = mcParticles.rawIteratorAt(indexRecXicPlus); origin = RecoDecay::getCharmHadronOrigin(mcParticles, particle, false); } - - rowMcMatchRec(flag, debug, origin); + // Fill histograms + if (flag != 0 && fillMcHistograms) { + registry.fill(HIST("hDecayedPions"), nPionsDecayed); + registry.fill(HIST("hInteractionsWithMaterial"), nInteractionsWithMaterial); + } + // Fill table + rowMcMatchRec(flag, origin); } // close loop over candidates // Match generated particles. @@ -994,21 +1049,20 @@ struct HfCandidateCreatorXicToXiPiPiExpressions { if (rejectionMask != 0) { // at least one event selection not satisfied --> reject all particles from this collision for (unsigned int i = 0; i < mcParticlesPerMcColl.size(); ++i) { - rowMcMatchGen(0, 0, -1); + rowMcMatchGen(-99, -99, -99); } continue; } for (const auto& particle : mcParticlesPerMcColl) { - flag = 0; sign = 0; - debug = 0; + flag = 0; origin = RecoDecay::OriginType::None; arrDaughIndex.clear(); + idxBhadMothers.clear(); // Xic → Xi pi pi if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kXiCPlus, std::array{+kXiMinus, +kPiPlus, +kPiPlus}, true, &sign, 2)) { - debug = 1; // Xi- -> Lambda pi auto cascMC = mcParticles.rawIteratorAt(particle.daughtersIds().front()); // Find Xi- from Xi(1530) -> Xi pi in case of resonant decay @@ -1020,11 +1074,9 @@ struct HfCandidateCreatorXicToXiPiPiExpressions { } } if (RecoDecay::isMatchedMCGen(mcParticles, cascMC, +kXiMinus, std::array{+kLambda0, +kPiMinus}, true)) { - debug = 2; // Lambda -> p pi auto v0MC = mcParticles.rawIteratorAt(cascMC.daughtersIds().front()); if (RecoDecay::isMatchedMCGen(mcParticles, v0MC, +kLambda0, std::array{+kProton, +kPiMinus}, true)) { - debug = 3; if (arrDaughIndex.size() == NDaughtersResonant) { for (auto iProng = 0u; iProng < NDaughtersResonant; ++iProng) { auto daughI = mcParticles.rawIteratorAt(arrDaughIndex[iProng]); @@ -1032,8 +1084,6 @@ struct HfCandidateCreatorXicToXiPiPiExpressions { } if ((arrPDGDaugh[0] == arrXiResonance[0] && arrPDGDaugh[1] == arrXiResonance[1]) || (arrPDGDaugh[0] == arrXiResonance[1] && arrPDGDaugh[1] == arrXiResonance[0])) { flag = sign * (1 << aod::hf_cand_xic_to_xi_pi_pi::DecayType::XicToXiResPiToXiPiPi); - } else { - debug = 4; } } else { flag = sign * (1 << aod::hf_cand_xic_to_xi_pi_pi::DecayType::XicToXiPiPi); @@ -1044,10 +1094,15 @@ struct HfCandidateCreatorXicToXiPiPiExpressions { // Check whether the charm baryon is non-prompt (from a b quark). if (flag != 0) { - origin = RecoDecay::getCharmHadronOrigin(mcParticles, particle, false); + origin = RecoDecay::getCharmHadronOrigin(mcParticles, particle, false, &idxBhadMothers); + } + // Fill table + if (origin == RecoDecay::OriginType::NonPrompt) { + auto bHadMother = mcParticles.rawIteratorAt(idxBhadMothers[0]); + rowMcMatchGen(flag, origin, bHadMother.pdgCode()); + } else { + rowMcMatchGen(flag, origin, 0); } - - rowMcMatchGen(flag, debug, origin); } // close loop over generated particles } // close loop over McCollisions } // close template function diff --git a/PWGHF/TableProducer/treeCreatorXicToXiPiPi.cxx b/PWGHF/TableProducer/treeCreatorXicToXiPiPi.cxx index ff17d263413..5e32ff5c1bf 100644 --- a/PWGHF/TableProducer/treeCreatorXicToXiPiPi.cxx +++ b/PWGHF/TableProducer/treeCreatorXicToXiPiPi.cxx @@ -110,7 +110,6 @@ DECLARE_SOA_COLUMN(ZSvPull, zSvPull, float); DECLARE_SOA_TABLE(HfCandXicToXiPiPiLites, "AOD", "HFXICXI2PILITE", hf_cand_xic_to_xi_pi_pi::FlagMcMatchRec, - hf_cand_xic_to_xi_pi_pi::DebugMcRec, hf_cand_xic_to_xi_pi_pi::OriginRec, full::CandidateSelFlag, full::Sign, @@ -149,7 +148,6 @@ DECLARE_SOA_TABLE(HfCandXicToXiPiPiLites, "AOD", "HFXICXI2PILITE", DECLARE_SOA_TABLE(HfCandXicToXiPiPiLiteKfs, "AOD", "HFXICXI2PILITKF", hf_cand_xic_to_xi_pi_pi::FlagMcMatchRec, - hf_cand_xic_to_xi_pi_pi::DebugMcRec, hf_cand_xic_to_xi_pi_pi::OriginRec, full::CandidateSelFlag, full::Sign, @@ -201,7 +199,6 @@ DECLARE_SOA_TABLE(HfCandXicToXiPiPiLiteKfs, "AOD", "HFXICXI2PILITKF", DECLARE_SOA_TABLE(HfCandXicToXiPiPiFulls, "AOD", "HFXICXI2PIFULL", hf_cand_xic_to_xi_pi_pi::FlagMcMatchRec, - hf_cand_xic_to_xi_pi_pi::DebugMcRec, hf_cand_xic_to_xi_pi_pi::OriginRec, full::CandidateSelFlag, full::Sign, @@ -265,7 +262,6 @@ DECLARE_SOA_TABLE(HfCandXicToXiPiPiFulls, "AOD", "HFXICXI2PIFULL", DECLARE_SOA_TABLE(HfCandXicToXiPiPiFullKfs, "AOD", "HFXICXI2PIFULKF", hf_cand_xic_to_xi_pi_pi::FlagMcMatchRec, - hf_cand_xic_to_xi_pi_pi::DebugMcRec, hf_cand_xic_to_xi_pi_pi::OriginRec, full::CandidateSelFlag, full::Sign, @@ -342,8 +338,8 @@ DECLARE_SOA_TABLE(HfCandXicToXiPiPiFullKfs, "AOD", "HFXICXI2PIFULKF", DECLARE_SOA_TABLE(HfCandXicToXiPiPiFullPs, "AOD", "HFXICXI2PIFULLP", hf_cand_xic_to_xi_pi_pi::FlagMcMatchGen, - hf_cand_xic_to_xi_pi_pi::DebugMcGen, hf_cand_xic_to_xi_pi_pi::OriginGen, + hf_cand::PdgBhadMotherPart, full::Pt, full::Eta, full::Phi, @@ -384,13 +380,18 @@ struct HfTreeCreatorXicToXiPiPi { Configurable fillOnlyBackground{"fillOnlyBackground", false, "Flag to fill derived tables with background for ML trainings"}; Configurable downSampleBkgFactor{"downSampleBkgFactor", 1., "Fraction of background candidates to keep for ML trainings"}; Configurable ptMaxForDownSample{"ptMaxForDownSample", 10., "Maximum pt for the application of the downsampling factor"}; + // parameters for MC matching in residual process function + Configurable matchDecayedPions{"matchDecayedPions", true, "Match also candidates with daughter pion tracks that decay with kinked topology"}; + Configurable matchInteractionsWithMaterial{"matchInteractionsWithMaterial", true, "Match also candidates with daughter tracks that interact with material"}; using SelectedCandidates = soa::Filtered>; using SelectedCandidatesKf = soa::Filtered>; using SelectedCandidatesMc = soa::Filtered>; using SelectedCandidatesKfMc = soa::Filtered>; + using MatchedGenXicToXiPiPi = soa::Filtered>; Filter filterSelectCandidates = aod::hf_sel_candidate_xic::isSelXicToXiPiPi >= selectionFlagXic; + Filter filterGenXicToXiPiPi = (nabs(aod::hf_cand_xic_to_xi_pi_pi::flagMcMatchGen) == static_cast(BIT(aod::hf_cand_xic_to_xi_pi_pi::DecayType::XicToXiPiPi)) || nabs(aod::hf_cand_xic_to_xi_pi_pi::flagMcMatchGen) == static_cast(BIT(aod::hf_cand_xic_to_xi_pi_pi::DecayType::XicToXiResPiToXiPiPi))); Partition recSig = nabs(aod::hf_cand_xic_to_xi_pi_pi::flagMcMatchRec) != int8_t(0); Partition recBg = nabs(aod::hf_cand_xic_to_xi_pi_pi::flagMcMatchRec) == int8_t(0); @@ -405,18 +406,15 @@ struct HfTreeCreatorXicToXiPiPi { void fillCandidateTable(const T& candidate) { int8_t flagMc = 0; - int8_t debugMc = 0; int8_t originMc = 0; if constexpr (doMc) { flagMc = candidate.flagMcMatchRec(); - debugMc = candidate.debugMcRec(); originMc = candidate.originRec(); } if constexpr (!doKf) { if (fillCandidateLiteTable) { rowCandidateLite( flagMc, - debugMc, originMc, candidate.isSelXicToXiPiPi(), candidate.sign(), @@ -455,7 +453,6 @@ struct HfTreeCreatorXicToXiPiPi { } else { rowCandidateFull( flagMc, - debugMc, originMc, candidate.isSelXicToXiPiPi(), candidate.sign(), @@ -521,7 +518,6 @@ struct HfTreeCreatorXicToXiPiPi { if (fillCandidateLiteTable) { rowCandidateLiteKf( flagMc, - debugMc, originMc, candidate.isSelXicToXiPiPi(), candidate.sign(), @@ -573,7 +569,6 @@ struct HfTreeCreatorXicToXiPiPi { } else { rowCandidateFullKf( flagMc, - debugMc, originMc, candidate.isSelXicToXiPiPi(), candidate.sign(), @@ -692,7 +687,7 @@ struct HfTreeCreatorXicToXiPiPi { PROCESS_SWITCH(HfTreeCreatorXicToXiPiPi, processDataKf, "Process data with KFParticle reconstruction", false); void processMc(SelectedCandidatesMc const& candidates, - soa::Join const& particles) + MatchedGenXicToXiPiPi const& particles) { // Filling candidate properties if (fillOnlySignal) { @@ -730,25 +725,22 @@ struct HfTreeCreatorXicToXiPiPi { if (fillGenParticleTable) { rowCandidateFullParticles.reserve(particles.size()); - for (const auto& particle : particles) { - if (TESTBIT(std::abs(particle.flagMcMatchGen()), aod::hf_cand_xic_to_xi_pi_pi::DecayType::XicToXiPiPi) || TESTBIT(std::abs(particle.flagMcMatchGen()), aod::hf_cand_xic_to_xi_pi_pi::DecayType::XicToXiResPiToXiPiPi)) { - rowCandidateFullParticles( - particle.flagMcMatchGen(), - particle.debugMcGen(), - particle.originGen(), - particle.pt(), - particle.eta(), - particle.phi(), - RecoDecay::y(particle.pVector(), o2::constants::physics::MassXiCPlus)); - } - } // loop over generated particles + rowCandidateFullParticles( + particle.flagMcMatchGen(), + particle.originGen(), + particle.pdgBhadMotherPart(), + particle.pt(), + particle.eta(), + particle.phi(), + RecoDecay::y(particle.pVector(), o2::constants::physics::MassXiCPlus)); + } } } PROCESS_SWITCH(HfTreeCreatorXicToXiPiPi, processMc, "Process MC with DCAFitter reconstruction", false); void processMcKf(SelectedCandidatesKfMc const& candidates, - soa::Join const& particles) + MatchedGenXicToXiPiPi const& particles) { // Filling candidate properties if (fillOnlySignal) { @@ -787,17 +779,15 @@ struct HfTreeCreatorXicToXiPiPi { if (fillGenParticleTable) { rowCandidateFullParticles.reserve(particles.size()); for (const auto& particle : particles) { - if (TESTBIT(std::abs(particle.flagMcMatchGen()), aod::hf_cand_xic_to_xi_pi_pi::DecayType::XicToXiPiPi) || TESTBIT(std::abs(particle.flagMcMatchGen()), aod::hf_cand_xic_to_xi_pi_pi::DecayType::XicToXiResPiToXiPiPi)) { - rowCandidateFullParticles( - particle.flagMcMatchGen(), - particle.debugMcGen(), - particle.originGen(), - particle.pt(), - particle.eta(), - particle.phi(), - RecoDecay::y(particle.pVector(), o2::constants::physics::MassXiCPlus)); - } - } // loop over generated particles + rowCandidateFullParticles( + particle.flagMcMatchGen(), + particle.originGen(), + particle.pdgBhadMotherPart(), + particle.pt(), + particle.eta(), + particle.phi(), + RecoDecay::y(particle.pVector(), o2::constants::physics::MassXiCPlus)); + } } } PROCESS_SWITCH(HfTreeCreatorXicToXiPiPi, processMcKf, "Process MC with KF Particle reconstruction", false); @@ -813,8 +803,7 @@ struct HfTreeCreatorXicToXiPiPi { std::vector arrDaughIndex; int indexRecXicPlus; - int8_t sign; - int8_t origin; + int origin; std::array pvResiduals; std::array svResiduals; std::array pvPulls; @@ -823,8 +812,7 @@ struct HfTreeCreatorXicToXiPiPi { for (const auto& candidate : recSig) { arrDaughIndex.clear(); indexRecXicPlus = -1; - sign = 0; - origin = 0; + origin = RecoDecay::OriginType::None; pvResiduals = {-9999.9}; svResiduals = {-9999.9}; pvPulls = {-9999.9}; @@ -837,12 +825,20 @@ struct HfTreeCreatorXicToXiPiPi { candidate.negTrack_as()}; // pi <- lambda // get XicPlus as MC particle - indexRecXicPlus = RecoDecay::getMatchedMCRec(particles, arrayDaughters, Pdg::kXiCPlus, std::array{+kPiPlus, +kPiPlus, +kPiMinus, +kProton, +kPiMinus}, true, &sign, 4); + if (matchDecayedPions && matchInteractionsWithMaterial) { + indexRecXicPlus = RecoDecay::getMatchedMCRec(particles, arrayDaughters, Pdg::kXiCPlus, std::array{+kPiPlus, +kPiPlus, +kPiMinus, +kProton, +kPiMinus}, true, nullptr, 4); + } else if (matchDecayedPions && !matchInteractionsWithMaterial) { + indexRecXicPlus = RecoDecay::getMatchedMCRec(particles, arrayDaughters, Pdg::kXiCPlus, std::array{+kPiPlus, +kPiPlus, +kPiMinus, +kProton, +kPiMinus}, true, nullptr, 4); + } else if (!matchDecayedPions && matchInteractionsWithMaterial) { + indexRecXicPlus = RecoDecay::getMatchedMCRec(particles, arrayDaughters, Pdg::kXiCPlus, std::array{+kPiPlus, +kPiPlus, +kPiMinus, +kProton, +kPiMinus}, true, nullptr, 4); + } else { + indexRecXicPlus = RecoDecay::getMatchedMCRec(particles, arrayDaughters, Pdg::kXiCPlus, std::array{+kPiPlus, +kPiPlus, +kPiMinus, +kProton, +kPiMinus}, true, nullptr, 4); + } if (indexRecXicPlus == -1) { continue; } auto particleXicPlusGen = particles.rawIteratorAt(indexRecXicPlus); - origin = RecoDecay::getCharmHadronOrigin(particles, particleXicPlusGen, true); + origin = RecoDecay::getCharmHadronOrigin(particles, particleXicPlusGen, false); // get MC collision auto mcCollision = particleXicPlusGen.mcCollision_as(); From 22ddf8d6bdb58cd472df370a97069051f454e0db Mon Sep 17 00:00:00 2001 From: mherzer <96999709+mherzer28@users.noreply.github.com> Date: Mon, 12 May 2025 16:48:39 +0200 Subject: [PATCH 1247/1650] [PWGLF] rigidity correction (#11159) Co-authored-by: ALICE Action Bot --- PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx b/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx index bc402c3579b..76216fb0d0d 100644 --- a/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx +++ b/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx @@ -166,6 +166,7 @@ struct TrHeAnalysis { std::vector particles; Configurable enableTr{"enableTr", true, "Flag to enable triton analysis."}; Configurable enableHe{"enableHe", true, "Flag to enable helium-3 analysis."}; + Configurable cfgRigidityCorrection{"cfgRigidityCorrection", true, "Enable Rigidity correction"}; ConfigurableAxis binsDeDx{"binsDeDx", {600, 0.f, 3000.f}, ""}; ConfigurableAxis binsBeta{"binsBeta", {120, 0.0, 1.2}, ""}; ConfigurableAxis binsDca{"binsDca", {400, -1.f, 1.f}, ""}; @@ -410,7 +411,7 @@ struct TrHeAnalysis { int tnItsCluster = track.itsNCls(); float tTpcChi2NCl = track.tpcChi2NCl(); float tItsChi2NCl = track.itsChi2NCl(); - float tRigidity = track.tpcInnerParam(); + float tRigidity = getRigidity(track); float tItsClusterSize = getMeanItsClsSize(track) / std::cosh(track.eta()); h3Data(tPt, tEta, tPhi, tCharge, tH3DeDx, tnSigmaTpc, tTofSignalH3, @@ -456,7 +457,7 @@ struct TrHeAnalysis { int tnItsCluster = track.itsNCls(); float tTpcChi2NCl = track.tpcChi2NCl(); float tItsChi2NCl = track.itsChi2NCl(); - float tRigidity = track.tpcInnerParam(); + float tRigidity = getRigidity(track); float tItsClusterSize = getMeanItsClsSize(track) / std::cosh(track.eta()); heData(tPt, tEta, tPhi, tCharge, tHeDeDx, tnSigmaTpc, tTofSignalHe, @@ -563,7 +564,7 @@ struct TrHeAnalysis { int tnItsCluster = track.itsNCls(); float tTpcChi2NCl = track.tpcChi2NCl(); float tItsChi2NCl = track.itsChi2NCl(); - float tRigidity = track.tpcInnerParam(); + float tRigidity = getRigidity(track); float tItsClusterSize = getMeanItsClsSize(track) / std::cosh(track.eta()); h3Data(tPt, tEta, tPhi, tCharge, tH3DeDx, tnSigmaTpc, tTofSignalH3, @@ -608,7 +609,7 @@ struct TrHeAnalysis { int tnItsCluster = track.itsNCls(); float tTpcChi2NCl = track.tpcChi2NCl(); float tItsChi2NCl = track.itsChi2NCl(); - float tRigidity = track.tpcInnerParam(); + float tRigidity = getRigidity(track); float tItsClusterSize = getMeanItsClsSize(track) / std::cosh(track.eta()); heData(tPt, tEta, tPhi, tCharge, tHeDeDx, tnSigmaTpc, tTofSignalHe, @@ -650,6 +651,14 @@ struct TrHeAnalysis { } return n > 0 ? static_cast(sum) / n : 0.f; } + template + float getRigidity(T const& track) + { + if (!cfgRigidityCorrection) + return track.tpcInnerParam(); + bool hePID = track.pidForTracking() == o2::track::PID::Helium3 || track.pidForTracking() == o2::track::PID::Alpha; + return hePID ? track.tpcInnerParam() / 2 : track.tpcInnerParam(); + } }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 0216f5a0a27c9851588f04f536b6b198f3e1372e Mon Sep 17 00:00:00 2001 From: Dongguk Kim <157434406+DonggukKim0@users.noreply.github.com> Date: Tue, 13 May 2025 04:22:44 +0900 Subject: [PATCH 1248/1650] [PWGJE] Add event count histograms (#11139) --- PWGJE/Tasks/dijetFinderQA.cxx | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/PWGJE/Tasks/dijetFinderQA.cxx b/PWGJE/Tasks/dijetFinderQA.cxx index 4dd9292a1ac..0250a405537 100644 --- a/PWGJE/Tasks/dijetFinderQA.cxx +++ b/PWGJE/Tasks/dijetFinderQA.cxx @@ -77,6 +77,7 @@ struct DijetFinderQATask { { eventSelection = jetderiveddatautilities::initialiseEventSelectionBits(static_cast(eventSelections)); trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast(trackSelections)); + // Add histogram for event counts auto dijetMassTemp = 0.0; while (dijetMassTemp <= 2 * jetPtMax) { @@ -85,17 +86,21 @@ struct DijetFinderQATask { } AxisSpec dijetMassAxis = {dijetMassBins, "M_{jj} (GeV/#it{c}^2)"}; + AxisSpec eventCountAxis = {{0.5, 1.5}, "events"}; if (doprocessDijetMCP) { registry.add("h_part_dijet_mass", "Dijet invariant mass;;entries", {HistType::kTH1F, {dijetMassAxis}}); + registry.add("hColCounterFinal_MCP", "Event count;;entries", {HistType::kTH1F, {eventCountAxis}}); } if (doprocessDijetMCD) { registry.add("h_detec_dijet_mass", "Dijet invariant mass;;entries", {HistType::kTH1F, {dijetMassAxis}}); + registry.add("hColCounterFinal_MCD", "Event count;;entries", {HistType::kTH1F, {eventCountAxis}}); } if (doprocessDijetData) { registry.add("h_data_dijet_mass", "Dijet invariant mass;;entries", {HistType::kTH1F, {dijetMassAxis}}); + registry.add("hColCounterFinal_Data", "Event count;;entries", {HistType::kTH1F, {eventCountAxis}}); } if (doprocessDijetMCMatched) { @@ -175,8 +180,18 @@ struct DijetFinderQATask { } PROCESS_SWITCH(DijetFinderQATask, processDummy, "dummy", false); - void processDijetMCP(soa::Filtered::iterator const&, soa::Filtered const& jets) + void processDijetMCP(soa::Filtered::iterator const&, soa::Filtered const& jets, soa::SmallGroups const& collisions) { + if (collisions.size() == 0) { + return; + } + for (auto& collision : collisions) { + if (fabs(collision.posZ()) > vertexZCut || !jetderiveddatautilities::selectCollision(collision, eventSelection)) + return; + } + + registry.fill(HIST("hColCounterFinal_MCP"), 1); + std::vector> jetPtcuts; for (auto& jet : jets) { jetPtcuts.push_back({jet.pt(), jet.eta(), jet.phi()}); @@ -209,6 +224,9 @@ struct DijetFinderQATask { if (!jetderiveddatautilities::selectCollision(collision, eventSelection)) { return; } + + registry.fill(HIST("hColCounterFinal_MCD"), 1); + std::vector> jetPtcuts; for (auto& jet : jets) { jetPtcuts.push_back({jet.pt(), jet.eta(), jet.phi()}); @@ -242,6 +260,9 @@ struct DijetFinderQATask { return; } + // Fill event count histogram + registry.fill(HIST("hColCounterFinal_Data"), 1); + std::vector> jetPtcuts; for (auto& jet : jets) { jetPtcuts.push_back({jet.pt(), jet.eta(), jet.phi()}); From 1d82a69cb40f5affddd5bceb4fdcf1b66eaa3225 Mon Sep 17 00:00:00 2001 From: Zuzanna Chochulska <87480906+zchochul@users.noreply.github.com> Date: Mon, 12 May 2025 21:46:27 +0200 Subject: [PATCH 1249/1650] [PWGCF] FemtoUniverse -- Adding DCA plots (#11160) Co-authored-by: Zuzanna <01150674@pw.edu.pl> --- .../Core/FemtoUniverseParticleHisto.h | 164 ++++++++++++------ PWGCF/FemtoUniverse/DataModel/FemtoDerived.h | 10 +- 2 files changed, 116 insertions(+), 58 deletions(-) diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h index 668fd84714b..ff655e10f38 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h @@ -130,28 +130,53 @@ class FemtoUniverseParticleHisto /// \param tempFitVarpTAxis axis object for the pT axis in the pT vs. tempFitVar plots /// \param tempFitVarAxis axis object for the tempFitVar axis template - void init_MC(std::string folderName, std::string /*tempFitVarAxisTitle*/, T& tempFitVarpTAxis, T& tempFitVarAxis) // o2-linter: disable=name/function-variable + void init_MC(std::string folderName, std::string /*tempFitVarAxisTitle*/, T& tempFitVarpTAxis, T& tempFitVarAxis, bool isDebug) // o2-linter: disable=name/function-variable { /// Particle-type specific histograms std::string folderSuffix = static_cast(o2::aod::femtouniverse_mc_particle::MCTypeName[o2::aod::femtouniverse_mc_particle::MCType::kTruth]).c_str(); mHistogramRegistry->add((folderName + folderSuffix + "/hPt_ReconNoFake").c_str(), "; #it{p}_{T} (GeV/#it{c}); Entries", kTH1F, {tempFitVarpTAxis}); - mHistogramRegistry->add((folderName + folderSuffix + "/hPt_Primary").c_str(), "; #it{p}_{T} (GeV/#it{c}); Entries", kTH1F, {tempFitVarpTAxis}); + mHistogramRegistry->add((folderName + folderSuffix + "/hPDG").c_str(), "; PDG; Entries", kTH1I, {{6001, -3000, 3000}}); + mHistogramRegistry->add((folderName + folderSuffix + "/hOrigin_MC").c_str(), "; Origin; Entries", kTH1I, {{100, 0, 100}}); + mHistogramRegistry->add((folderName + folderSuffix + "/hNoMCtruthCounter").c_str(), "; Counter; Entries", kTH1I, {{1, 0, 1}}); if constexpr (mParticleType == o2::aod::femtouniverseparticle::ParticleType::kTrack || mParticleType == o2::aod::femtouniverseparticle::ParticleType::kV0Child || mParticleType == o2::aod::femtouniverseparticle::ParticleType::kCascadeBachelor || mParticleType == o2::aod::femtouniverseparticle::ParticleType::kMCTruthTrack) { /// Track histograms - mHistogramRegistry->add((folderName + folderSuffix + "/hPDG").c_str(), "; PDG; Entries", kTH1I, {{6001, -3000, 3000}}); - mHistogramRegistry->add((folderName + folderSuffix + "/hOrigin_MC").c_str(), "; Origin; Entries", kTH1I, {{100, 0, 100}}); - mHistogramRegistry->add((folderName + folderSuffix + "/hNoMCtruthCounter").c_str(), "; Counter; Entries", kTH1I, {{1, 0, 1}}); - // DCA plots - mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_Material").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); - mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_Fake").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); - mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_DaughterLambda").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); - mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_DaughterSigmaplus").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); - mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_Primary").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); - mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_Daughter").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); - mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_NoMCTruthOrigin").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); - mHistogramRegistry->add((folderName + folderSuffix + "/hMisidentification").c_str(), "; #it{p}_{T} (GeV/#it{c}); Particle; Particle", kTH3F, {{4, 0, 4}, {4, 0, 4}, tempFitVarpTAxis}); + if (isDebug) { + mHistogramRegistry->add((folderName + folderSuffix + "/Debug/hPDGmother_Primary").c_str(), "; PDG mother; Entries", kTH1I, {{6001, -3000.5, 3000.5}}); + mHistogramRegistry->add((folderName + folderSuffix + "/Debug/hPDGmother_Daughter").c_str(), "; PDG mother; Entries", kTH1I, {{6001, -3000.5, 3000.5}}); + mHistogramRegistry->add((folderName + folderSuffix + "/Debug/hPDGmother_Material").c_str(), "; PDG mother; Entries", kTH1I, {{6001, -3000.5, 3000.5}}); + mHistogramRegistry->add((folderName + folderSuffix + "/Debug/hPDGmother_WrongCollision").c_str(), "; PDG mother; Entries", kTH1I, {{6001, -3000.5, 3000.5}}); + mHistogramRegistry->add((folderName + folderSuffix + "/Debug/hPDGmother_Fake").c_str(), "; PDG mother; Entries", kTH1I, {{6001, -3000.5, 3000.5}}); + mHistogramRegistry->add((folderName + folderSuffix + "/Debug/hPDGmother_Else").c_str(), "; PDG mother; Entries", kTH1I, {{6001, -3000.5, 3000.5}}); + mHistogramRegistry->add((folderName + folderSuffix + "/Debug/hPDGmother_DaughterLambda").c_str(), "; PDG mother; Entries", kTH1I, {{12001, -6000.5, 6000.5}}); + mHistogramRegistry->add((folderName + folderSuffix + "/Debug/hPDGmother_DaughterSigmaplus").c_str(), "; PDG mother; Entries", kTH1I, {{12001, -6000.5, 6000.5}}); + + mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_Primary").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); + mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_Daughter").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); + mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_Material").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); + mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_WrongCollision").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); + mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_Fake").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); + mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_Else").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); + mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_DaughterLambda").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); + mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_DaughterSigmaplus").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); + mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_NoMCTruthOrigin").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); + mHistogramRegistry->add((folderName + folderSuffix + "/hMisidentification").c_str(), "; #it{p}_{T} (GeV/#it{c}); Particle; Particle", kTH3F, {{4, 0, 4}, {4, 0, 4}, tempFitVarpTAxis}); + + } else { + mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_Primary").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); + mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_Daughter").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); + mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_Material").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); + mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_WrongCollision").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); + mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_Fake").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); + mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_Else").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); + mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_NoMCTruthOrigin").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); + mHistogramRegistry->add((folderName + folderSuffix + "/hMisidentification").c_str(), "; #it{p}_{T} (GeV/#it{c}); Particle; Particle", kTH3F, {{4, 0, 4}, {4, 0, 4}, tempFitVarpTAxis}); + + mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_DaughterLambda").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); + mHistogramRegistry->add((folderName + folderSuffix + "/hDCAxy_DaughterSigmaplus").c_str(), "; #it{p}_{T} (GeV/#it{c}); DCA_{xy} (cm)", kTH2F, {tempFitVarpTAxis, tempFitVarAxis}); + } + } else if constexpr (mParticleType == o2::aod::femtouniverseparticle::ParticleType::kV0) { /// V0 histograms /// to be implemented @@ -160,8 +185,6 @@ class FemtoUniverseParticleHisto /// to be implemented } else if constexpr (mParticleType == o2::aod::femtouniverseparticle::ParticleType::kPhi) { // Phi histograms - mHistogramRegistry->add((folderName + folderSuffix + "/hPDG").c_str(), "; PDG; Entries", kTH1I, {{6001, -3000, 3000}}); - mHistogramRegistry->add((folderName + folderSuffix + "/hOrigin_MC").c_str(), "; Origin; Entries", kTH1I, {{7, 0, 7}}); } else if constexpr (mParticleType == o2::aod::femtouniverseparticle::ParticleType::kD0) { // D0/D0bar histograms @@ -221,7 +244,7 @@ class FemtoUniverseParticleHisto } if (isMC) { init_base(folderName, tempFitVarAxisTitle, tempFitVarpTAxis, tempFitVarAxis); - init_MC(folderName, tempFitVarAxisTitle, tempFitVarpTAxis, tempFitVarAxis); + init_MC(folderName, tempFitVarAxisTitle, tempFitVarpTAxis, tempFitVarAxis, isDebug); } } } @@ -307,7 +330,7 @@ class FemtoUniverseParticleHisto /// \param part Particle /// \param mctruthorigin Origin of the associated mc Truth particle /// \param pdgcode PDG of the associated mc Truth particle associated to the reconstructed particle part - template + template void fillQA_MC(T const& part, int mctruthorigin, int pdgcode, H const& histFolder) // o2-linter: disable=name/function-variable { if (mHistogramRegistry) { @@ -319,42 +342,75 @@ class FemtoUniverseParticleHisto } if constexpr (mParticleType == o2::aod::femtouniverseparticle::ParticleType::kTrack || mParticleType == o2::aod::femtouniverseparticle::ParticleType::kV0Child || mParticleType == o2::aod::femtouniverseparticle::ParticleType::kCascadeBachelor || mParticleType == o2::aod::femtouniverseparticle::ParticleType::kMCTruthTrack) { - /// Track histograms - switch (mctruthorigin) { - case (o2::aod::femtouniverse_mc_particle::kPrimary): { - if (pdgcode == mPDG) { - mHistogramRegistry->fill(histFolder + HIST("_MC/hPt_Primary"), part.pt()); - } - mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_Primary"), - part.pt(), part.tempFitVar()); - break; + if constexpr (isDebug) { + switch (mctruthorigin) { + case (o2::aod::femtouniverse_mc_particle::kPrimary): + // mHistogramRegistry->fill(histFolder + HIST("_MC/Debug/hPDGmother_Primary"), part.fdMCParticle().motherPDG()); + mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_Primary"), part.pt(), part.tempFitVar()); + break; + case (o2::aod::femtouniverse_mc_particle::kDaughter): + // mHistogramRegistry->fill(histFolder + HIST("_MC/Debug/hPDGmother_Daughter"), part.fdMCParticle().motherPDG()); + mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_Daughter"), part.pt(), part.tempFitVar()); + break; + case (o2::aod::femtouniverse_mc_particle::kMaterial): + // mHistogramRegistry->fill(histFolder + HIST("_MC/Debug/hPDGmother_Material"), part.fdMCParticle().motherPDG()); + mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_Material"), part.pt(), part.tempFitVar()); + break; + case (o2::aod::femtouniverse_mc_particle::kWrongCollision): + // mHistogramRegistry->fill(histFolder + HIST("_MC/Debug/hPDGmother_WrongCollision"), part.fdMCParticle().motherPDG()); + mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_WrongCollision"), part.pt(), part.tempFitVar()); + break; + case (o2::aod::femtouniverse_mc_particle::kFake): + // mHistogramRegistry->fill(histFolder + HIST("_MC/Debug/hPDGmother_Fake"), part.fdMCParticle().motherPDG()); + mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_Fake"), part.pt(), part.tempFitVar()); + break; + case (o2::aod::femtouniverse_mc_particle::kDaughterLambda): + // mHistogramRegistry->fill(histFolder + HIST("_MC/Debug/hPDGmother_DaughterLambda"), part.fdMCParticle().motherPDG()); + mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_DaughterLambda"), part.pt(), part.tempFitVar()); + break; + case (o2::aod::femtouniverse_mc_particle::kDaughterSigmaplus): + // mHistogramRegistry->fill(histFolder + HIST("_MC/Debug/hPDGmother_DaughterSigmaplus"), part.fdMCParticle().motherPDG()); + mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_DaughterSigmaplus"), part.pt(), part.tempFitVar()); + break; + case (o2::aod::femtouniverse_mc_particle::kElse): + // mHistogramRegistry->fill(histFolder + HIST("_MC/Debug/hPDGmother_Else"), part.fdMCParticle().motherPDG()); + mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_Else"), part.pt(), part.tempFitVar()); + break; + default: + LOGF(info, "femtodreamparticleMC: not known value for ParticleOriginMCTruth --- %d - please check. Quitting!", mctruthorigin); + mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_NoMCTruthOrigin"), part.pt(), part.tempFitVar()); + } + } else { + switch (mctruthorigin) { + case (o2::aod::femtouniverse_mc_particle::kPrimary): + mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_Primary"), part.pt(), part.tempFitVar()); + break; + case (o2::aod::femtouniverse_mc_particle::kDaughter): + mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_Daughter"), part.pt(), part.tempFitVar()); + break; + case (o2::aod::femtouniverse_mc_particle::kMaterial): + mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_Material"), part.pt(), part.tempFitVar()); + break; + case (o2::aod::femtouniverse_mc_particle::kWrongCollision): + mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_WrongCollision"), part.pt(), part.tempFitVar()); + break; + case (o2::aod::femtouniverse_mc_particle::kFake): + mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_Fake"), part.pt(), part.tempFitVar()); + break; + case (o2::aod::femtouniverse_mc_particle::kDaughterLambda): + mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_DaughterLambda"), part.pt(), part.tempFitVar()); + break; + case (o2::aod::femtouniverse_mc_particle::kDaughterSigmaplus): + mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_DaughterSigmaplus"), part.pt(), part.tempFitVar()); + break; + case (o2::aod::femtouniverse_mc_particle::kElse): + mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_Else"), part.pt(), part.tempFitVar()); + break; + + default: + LOGF(info, "femtodreamparticleMC: not known value for ParticleOriginMCTruth --- %d - please check. Quitting!", mctruthorigin); + mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_NoMCTruthOrigin"), part.pt(), part.tempFitVar()); } - case (o2::aod::femtouniverse_mc_particle::kDaughter): - mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_Daughter"), - part.pt(), part.tempFitVar()); - break; - case (o2::aod::femtouniverse_mc_particle::kMaterial): - mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_Material"), - part.pt(), part.tempFitVar()); - break; - case (o2::aod::femtouniverse_mc_particle::kFake): - mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_Fake"), - part.pt(), part.tempFitVar()); - break; - case (o2::aod::femtouniverse_mc_particle::kDaughterLambda): - mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_DaughterLambda"), - part.pt(), part.tempFitVar()); - break; - case (o2::aod::femtouniverse_mc_particle::kDaughterSigmaplus): - mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_DaughterSigmaplus"), - part.pt(), part.tempFitVar()); - break; - case (99): - mHistogramRegistry->fill(histFolder + HIST("_MC/hDCAxy_NoMCTruthOrigin"), - part.pt(), part.tempFitVar()); - break; - default: - LOG(fatal) << "femtouniverseparticleMC: not known value for ParticleOriginMCTruth - please check. Quitting!"; } } else if constexpr (mParticleType == o2::aod::femtouniverseparticle::ParticleType::kV0) { /// V0 histograms @@ -427,7 +483,7 @@ class FemtoUniverseParticleHisto if constexpr (isMC) { if (part.has_fdMCParticle()) { fillQA_base(part.fdMCParticle(), histFolder); - fillQA_MC(part, (part.fdMCParticle()).partOriginMCTruth(), (part.fdMCParticle()).pdgMCTruth(), histFolder); + fillQA_MC(part, (part.fdMCParticle()).partOriginMCTruth(), (part.fdMCParticle()).pdgMCTruth(), histFolder); } else { mHistogramRegistry->fill(histFolder + HIST("_MC/hNoMCtruthCounter"), 0); } diff --git a/PWGCF/FemtoUniverse/DataModel/FemtoDerived.h b/PWGCF/FemtoUniverse/DataModel/FemtoDerived.h index eaebb852b97..05962d8cab9 100644 --- a/PWGCF/FemtoUniverse/DataModel/FemtoDerived.h +++ b/PWGCF/FemtoUniverse/DataModel/FemtoDerived.h @@ -257,12 +257,14 @@ enum ParticleOriginMCTruth { kDaughter, //! Particle from a decay kMaterial, //! Particle from a material kNotPrimary, //! Not primary particles (kept for compatibility reasons with the FullProducer task. will be removed, since we look at "non primaries" more differentially now) - kFake, //! particle, that has NOT the PDG code of the current analysed particle + kFake, //! Particle, that has NOT the PDG code of the current analysed particle kDaughterLambda, //! Daughter from a Lambda decay kDaughterSigmaplus, //! Daughter from a Sigma^plus decay - kPrompt, //! Orgin for D0/D0bar mesons - kNonPrompt, //! Orgin for D0/D0bar mesons - kNOriginMCTruthTypes + kPrompt, //! Origin for D0/D0bar mesons + kNonPrompt, //! Origin for D0/D0bar mesons + kNOriginMCTruthTypes, + kElse, + kWrongCollision //! Origin for the wrong collision }; //! Naming of the different OriginMCTruth types From 1524c12a59419b5e0743fdd084b6391219b922c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Mon, 12 May 2025 22:20:26 +0200 Subject: [PATCH 1250/1650] [PWGHF] fix linter error and only apply ml when it needed in the Lcp femto producer (#11146) Co-authored-by: ALICE Action Bot --- .../HFC/TableProducer/femtoDreamProducer.cxx | 60 ++++++++++--------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx b/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx index 8e2d79162ed..19a408d7803 100644 --- a/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx +++ b/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx @@ -16,6 +16,9 @@ #include #include + +#include "TMCProcess.h" + #include "CCDB/BasicCCDBManager.h" #include "Common/Core/trackUtilities.h" @@ -55,19 +58,19 @@ using namespace o2::hf_centrality; // event types enum Event : uint8_t { - kAll = 0, - kRejEveSel, - kRejNoTracksAndCharm, - kTrackSelected, - kCharmSelected, - kPairSelected + All = 0, + RejEveSel, + RejNoTracksAndCharm, + TrackSelected, + CharmSelected, + PairSelected }; // ml modes enum MlMode : uint8_t { - kNoMl = 0, - kFillMlFromSelector, - kFillMlFromNewBDT + NoMl = 0, + FillMlFromSelector, + FillMlFromNewBDT }; struct HfFemtoDreamProducer { @@ -124,7 +127,7 @@ struct HfFemtoDreamProducer { Configurable> trkITSnclsIbMin{FemtoDreamTrackSelection::getSelectionName(femtoDreamTrackSelection::kITSnClsIbMin, "trk"), std::vector{-1.f, 1.f}, FemtoDreamTrackSelection::getSelectionHelper(femtoDreamTrackSelection::kITSnClsIbMin, "Track selection: ")}; Configurable> trkITSnclsMin{FemtoDreamTrackSelection::getSelectionName(femtoDreamTrackSelection::kITSnClsMin, "trk"), std::vector{-1.f, 2.f, 4.f}, FemtoDreamTrackSelection::getSelectionHelper(femtoDreamTrackSelection::kITSnClsMin, "Track selection: ")}; // ML inference - Configurable applyMlMode{"applyMlMode", 1, "Occupancy estimation (None: 0, BDT model from Lc selector: 1, New BDT model on Top of Lc selector: 2)"}; + Configurable applyMlMode{"applyMlMode", 1, "None: 0, BDT model from Lc selector: 1, New BDT model on Top of Lc selector: 2"}; Configurable> binsPtMl{"binsPtMl", std::vector{hf_cuts_ml::vecBinsPt}, "pT bin limits for ML application"}; Configurable> cutDirMl{"cutDirMl", std::vector{hf_cuts_ml::vecCutDir}, "Whether to reject score values greater or smaller than the threshold"}; Configurable> cutsMl{"cutsMl", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; @@ -175,14 +178,14 @@ struct HfFemtoDreamProducer { trackRegistry.add("AnalysisQA/CutCounter", "; Bit; Counter", kTH1F, {{cutBits + 1, -0.5, cutBits + 0.5}}); // event QA histograms - constexpr int kEventTypes = kPairSelected + 1; + constexpr int kEventTypes = PairSelected + 1; std::string labels[kEventTypes]; - labels[Event::kAll] = "All events"; - labels[Event::kRejEveSel] = "rejected by event selection"; - labels[Event::kRejNoTracksAndCharm] = "rejected by no tracks and charm"; - labels[Event::kTrackSelected] = "with tracks "; - labels[Event::kCharmSelected] = "with charm hadrons "; - labels[Event::kPairSelected] = "with pairs"; + labels[Event::All] = "All events"; + labels[Event::RejEveSel] = "rejected by event selection"; + labels[Event::RejNoTracksAndCharm] = "rejected by no tracks and charm"; + labels[Event::TrackSelected] = "with tracks "; + labels[Event::CharmSelected] = "with charm hadrons "; + labels[Event::PairSelected] = "with pairs"; static const AxisSpec axisEvents = {kEventTypes, 0.5, kEventTypes + 0.5, ""}; qaRegistry.add("hEventQA", "Events;;entries", HistType::kTH1F, {axisEvents}); @@ -219,7 +222,7 @@ struct HfFemtoDreamProducer { int64_t now = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); ccdb->setCreatedNotAfter(now); - if (applyMlMode) { + if (applyMlMode == FillMlFromNewBDT) { hfMlResponse.configure(binsPtMl, cutsMl, cutDirMl, nClassesMl); if (loadModelsFromCCDB) { ccdbApi.init(ccdbUrl); @@ -281,6 +284,7 @@ struct HfFemtoDreamProducer { auto pdgCode = particleMc.pdgCode(); int particleOrigin = 99; int pdgCodeMother = -1; + constexpr int GenFromTransport = -1; // -1 if a particle produced during transport // get list of mothers, but it could be empty (for example in case of injected light nuclei) auto motherparticlesMc = particleMc.template mothers_as(); // check pdg code @@ -297,7 +301,7 @@ struct HfFemtoDreamProducer { // particle is from a decay -> getProcess() == 4 // particle is generated during transport -> getGenStatusCode() == -1 // list of mothers is not empty - } else if (particleMc.getProcess() == 4 && particleMc.getGenStatusCode() == -1 && !motherparticlesMc.empty()) { + } else if (particleMc.getProcess() == TMCProcess::kPDecay && particleMc.getGenStatusCode() == GenFromTransport && !motherparticlesMc.empty()) { // get direct mother auto motherparticleMc = motherparticlesMc.front(); pdgCodeMother = motherparticleMc.pdgCode(); @@ -305,7 +309,7 @@ struct HfFemtoDreamProducer { // check if particle is material // particle is from inelastic hadronic interaction -> getProcess() == 23 // particle is generated during transport -> getGenStatusCode() == -1 - } else if (particleMc.getProcess() == 23 && particleMc.getGenStatusCode() == -1) { + } else if (particleMc.getProcess() == TMCProcess::kPHInhelastic && particleMc.getGenStatusCode() == GenFromTransport) { particleOrigin = aod::femtodreamMCparticle::ParticleOriginMCTruth::kMaterial; // cross check to see if we missed a case } else { @@ -408,18 +412,18 @@ struct HfFemtoDreamProducer { const auto rejectionMask = hfEvSel.getHfCollisionRejectionMask(col, mult, ccdb, qaRegistry); - qaRegistry.fill(HIST("hEventQA"), 1 + Event::kAll); + qaRegistry.fill(HIST("hEventQA"), 1 + Event::All); /// monitor the satisfied event selections hfEvSel.fillHistograms(col, rejectionMask, mult); if (rejectionMask != 0) { /// at least one event selection not satisfied --> reject the candidate - qaRegistry.fill(HIST("hEventQA"), 1 + Event::kRejEveSel); + qaRegistry.fill(HIST("hEventQA"), 1 + Event::RejEveSel); return; } if (isNoSelectedTracks(col, tracks, trackCuts) && sizeCand <= 0) { - qaRegistry.fill(HIST("hEventQA"), 1 + Event::kRejNoTracksAndCharm); + qaRegistry.fill(HIST("hEventQA"), 1 + Event::RejNoTracksAndCharm); return; } @@ -443,7 +447,7 @@ struct HfFemtoDreamProducer { if constexpr (useCharmMl) { /// fill with ML information /// BDT index 0: bkg score; BDT index 1: prompt score; BDT index 2: non-prompt score - if (applyMlMode == kFillMlFromSelector) { + if (applyMlMode == FillMlFromSelector) { if (candidate.mlProbLcToPKPi().size() > 0) { outputMlPKPi.at(0) = candidate.mlProbLcToPKPi()[0]; /// bkg score outputMlPKPi.at(1) = candidate.mlProbLcToPKPi()[1]; /// prompt score @@ -454,7 +458,7 @@ struct HfFemtoDreamProducer { outputMlPiKP.at(1) = candidate.mlProbLcToPiKP()[1]; /// prompt score outputMlPiKP.at(2) = candidate.mlProbLcToPiKP()[2]; /// non-prompt score } - } else if (applyMlMode == kFillMlFromNewBDT) { + } else if (applyMlMode == FillMlFromNewBDT) { isSelectedMlLcToPKPi = false; isSelectedMlLcToPiKP = false; if (candidate.mlProbLcToPKPi().size() > 0) { @@ -516,17 +520,17 @@ struct HfFemtoDreamProducer { aod::femtodreamcollision::BitMaskType bitTrack = 0; if (isTrackFilled) { bitTrack |= 1 << 0; - qaRegistry.fill(HIST("hEventQA"), 1 + Event::kTrackSelected); + qaRegistry.fill(HIST("hEventQA"), 1 + Event::TrackSelected); } aod::femtodreamcollision::BitMaskType bitCand = 0; if (sizeCand > 0) { bitCand |= 1 << 0; - qaRegistry.fill(HIST("hEventQA"), 1 + Event::kCharmSelected); + qaRegistry.fill(HIST("hEventQA"), 1 + Event::CharmSelected); } if (isTrackFilled && (sizeCand > 0)) - qaRegistry.fill(HIST("hEventQA"), 1 + Event::kPairSelected); + qaRegistry.fill(HIST("hEventQA"), 1 + Event::PairSelected); rowMasks(static_cast(bitTrack), static_cast(bitCand), From 7c8b279d44e6565bae3a978b38840dbdfc03c340 Mon Sep 17 00:00:00 2001 From: omvazque Date: Mon, 12 May 2025 17:13:05 -0500 Subject: [PATCH 1251/1650] [PWGLF] Adds selection based on and sigma (#11166) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 60 ++++++++++++++++---- 1 file changed, 48 insertions(+), 12 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index 3b00d47cd8b..acd39942c62 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -244,6 +244,8 @@ struct UccZdc { registry.add("EtaVsPhi", ";#eta;#varphi", kTH2F, {{{axisEta}, {100, -0.1 * PI, +2.1 * PI}}}); registry.add("sigma1Pt", ";;#sigma(p_{T})/p_{T};", kTProfile, {axisPt}); registry.add("dcaXYvspT", ";DCA_{xy} (cm);;", kTH2F, {{{50, -1., 1.}, {axisPt}}}); + registry.add("RejectedEvtsVsFT0M", ";T0A+T0C (#times 1/100, -3.3 < #eta < -2.1 and 3.5 < #eta < 4.9);Entries;", kTH1F, {{nBinsAmpFT0, 0., 3000.}}); + registry.add("RejectedEvtsVsNch", ";#it{N}_{ch} (|#eta|<0.8);Entries;", kTH1F, {{300, 0., 3000.}}); registry.add("Nch", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);", kTH1F, {{nBinsNch, minNch, maxNch}}); registry.add("NchVsPt", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);;", kTH2F, {{{nBinsNch, minNch, maxNch}, {axisPt}}}); @@ -531,10 +533,10 @@ struct UccZdc { float znC{zdc.amplitudeZNC()}; float zpA{zdc.amplitudeZPA()}; float zpC{zdc.amplitudeZPC()}; - znA /= 2.81; - znC /= 2.81; - zpA /= 2.81; - zpC /= 2.81; + znA /= 2.68; + znC /= 2.68; + zpA /= 2.68; + zpC /= 2.68; float tZEM1{zdc.timeZEM1()}; float tZEM2{zdc.timeZEM2()}; @@ -579,10 +581,10 @@ struct UccZdc { registry.fill(HIST("zPos"), collision.posZ()); registry.fill(HIST("T0Ccent"), collision.centFT0C()); - registry.fill(HIST("ZNCcvsZNCsum"), sumZNC / 2.81, zdc.energyCommonZNC() / 2.81); - registry.fill(HIST("ZNAcvsZNAsum"), sumZNA / 2.81, zdc.energyCommonZNA() / 2.81); - registry.fill(HIST("ZPCcvsZPCsum"), sumZPC / 2.81, zdc.energyCommonZPC() / 2.81); - registry.fill(HIST("ZPAcvsZPAsum"), sumZPA / 2.81, zdc.energyCommonZPA() / 2.81); + registry.fill(HIST("ZNCcvsZNCsum"), sumZNC / 2.68, zdc.energyCommonZNC() / 2.68); + registry.fill(HIST("ZNAcvsZNAsum"), sumZNA / 2.68, zdc.energyCommonZNA() / 2.68); + registry.fill(HIST("ZPCcvsZPCsum"), sumZPC / 2.68, zdc.energyCommonZPC() / 2.68); + registry.fill(HIST("ZPAcvsZPAsum"), sumZPA / 2.68, zdc.energyCommonZPA() / 2.68); registry.fill(HIST("ZNA"), znA); registry.fill(HIST("ZNC"), znC); @@ -636,9 +638,21 @@ struct UccZdc { // LOGF(info, "Getting object %s for run number %i from timestamp=%llu", paTH.value.data(), foundBC.runNumber(), foundBC.timestamp()); auto efficiency = ccdb->getForTimeStamp(paTH.value, foundBC.timestamp()); - // auto efficiency = ccdb->getForRun(paTH.value, foundBC.runNumber()); if (!efficiency) { LOGF(fatal, "Efficiency object not found!"); + return; + } + + auto fitMeanNch = ccdb->getForTimeStamp(paTHmeanNch.value, foundBC.timestamp()); + if (!fitMeanNch) { + LOGF(fatal, "fitMeanNch object not found!"); + return; + } + + auto fitSigmaNch = ccdb->getForTimeStamp(paTHsigmaNch.value, foundBC.timestamp()); + if (!fitSigmaNch) { + LOGF(fatal, "fitSigmaNch object not found!"); + return; } // has ZDC? @@ -647,7 +661,16 @@ struct UccZdc { } registry.fill(HIST("hEventCounter"), EvCutLabel::Zdc); - if (!foundBC.has_ft0()) { + // has T0? + float aT0A = 0., aT0C = 0.; + if (foundBC.has_ft0()) { + for (const auto& amplitude : foundBC.ft0().amplitudeA()) { + aT0A += amplitude; + } + for (const auto& amplitude : foundBC.ft0().amplitudeC()) { + aT0C += amplitude; + } + } else { return; } registry.fill(HIST("hEventCounter"), EvCutLabel::TZero); @@ -662,8 +685,8 @@ struct UccZdc { float tZPC{foundBC.zdc().timeZPC()}; float tZDCdif{tZNC + tZPC - tZNA - tZPA}; float tZDCsum{tZNC + tZPC + tZNA + tZPA}; - znA /= 2.81; - znC /= 2.81; + znA /= 2.68; + znC /= 2.68; float sumZNs{znA + znC}; float sumZEMs{aZEM1 + aZEM2}; @@ -686,6 +709,7 @@ struct UccZdc { registry.fill(HIST("zPos"), collision.posZ()); registry.fill(HIST("T0Ccent"), collision.centFT0C()); + int glbTracks{0}; std::vector pTs; std::vector wIs; // Calculates the event weight, W_k @@ -698,6 +722,7 @@ struct UccZdc { registry.fill(HIST("sigma1Pt"), track.pt(), track.sigma1Pt()); registry.fill(HIST("dcaXYvspT"), track.dcaXY(), track.pt()); + glbTracks++; float pt{track.pt()}; double weight{efficiency->GetBinContent(efficiency->FindBin(pt))}; if (weight > 0.) { @@ -712,10 +737,21 @@ struct UccZdc { } } + const double meanNch{fitMeanNch->Eval((aT0A + aT0C) / 100.)}; + const double sigmaNch{fitSigmaNch->Eval((aT0A + aT0C) / 100.)}; + const double diffMeanNch{std::abs(meanNch - glbTracks)}; + const double nSigmaSelection{nSigmaNchCut * sigmaNch}; + if (!(diffMeanNch < nSigmaSelection)) { + registry.fill(HIST("RejectedEvtsVsFT0M"), (aT0A + aT0C) / 100.); + registry.fill(HIST("RejectedEvtsVsNch"), glbTracks); + return; + } + double p1, p2, p3, p4, w1, w2, w3, w4; p1 = p2 = p3 = p4 = w1 = w2 = w3 = w4 = 0.0; getPTpowers(pTs, wIs, p1, w1, p2, w2, p3, w3, p4, w4); const double nch{static_cast(pTs.size())}; + // To avoid calculating with zero particles if (nch < minNchSel) { return; } From 6a0dd1aeaa542ae287260f1601269dfc71168e49 Mon Sep 17 00:00:00 2001 From: Sigurd Nese <32108009+sigurdnese@users.noreply.github.com> Date: Mon, 12 May 2025 22:28:56 -0700 Subject: [PATCH 1252/1650] [PWGDQ] Make histogram setup in dilepton-track compatible with asymmetric pairs (#11170) --- PWGDQ/Core/VarManager.cxx | 9 + PWGDQ/Core/VarManager.h | 13 + PWGDQ/Tasks/dqEfficiency_withAssoc.cxx | 339 ++++++++++++------------- PWGDQ/Tasks/tableReader_withAssoc.cxx | 197 +++++++------- 4 files changed, 279 insertions(+), 279 deletions(-) diff --git a/PWGDQ/Core/VarManager.cxx b/PWGDQ/Core/VarManager.cxx index 0c3d58c18cb..fa9cb8c20ed 100644 --- a/PWGDQ/Core/VarManager.cxx +++ b/PWGDQ/Core/VarManager.cxx @@ -1036,6 +1036,12 @@ void VarManager::SetDefaultVarNames() fgVariableUnits[kWV22ME] = ""; fgVariableNames[kWV24ME] = "W_{2}(4)_{ME}"; fgVariableUnits[kWV24ME] = ""; + fgVariableNames[kS12] = "m_{12}^{2}"; + fgVariableUnits[kS12] = "GeV^{2}/c^{4}"; + fgVariableNames[kS13] = "m_{13}^{2}"; + fgVariableUnits[kS13] = "GeV^{2}/c^{4}"; + fgVariableNames[kS23] = "m_{23}^{2}"; + fgVariableUnits[kS23] = "GeV^{2}/c^{4}"; // Set the variables short names map. This is needed for dynamic configuration via JSON files fgVarNamesMap["kNothing"] = kNothing; @@ -1618,6 +1624,9 @@ void VarManager::SetDefaultVarNames() fgVarNamesMap["kKFJpsiDCAxy"] = kKFJpsiDCAxy; fgVarNamesMap["kKFPairDeviationFromPV"] = kKFPairDeviationFromPV; fgVarNamesMap["kKFPairDeviationxyFromPV"] = kKFPairDeviationxyFromPV; + fgVarNamesMap["kS12"] = kS12, + fgVarNamesMap["kS13"] = kS13, + fgVarNamesMap["kS23"] = kS23, fgVarNamesMap["kNPairVariables"] = kNPairVariables; fgVarNamesMap["kPairMass"] = kPairMass; fgVarNamesMap["kPairMassDau"] = kPairMassDau; diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 3bf0ed01056..1dbe0045754 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -791,6 +791,9 @@ class VarManager : public TObject kKFJpsiDCAxy, kKFPairDeviationFromPV, kKFPairDeviationxyFromPV, + kS12, + kS13, + kS23, kNPairVariables, // Candidate-track correlation variables @@ -3073,6 +3076,9 @@ void VarManager::FillTriple(T1 const& t1, T2 const& t2, T3 const& t3, float* val values[kPhi] = v123.Phi(); values[kRap] = -v123.Rapidity(); values[kCharge] = t1.sign() + t2.sign() + t3.sign(); + values[kS12] = (v1 + v2).M2(); + values[kS13] = (v1 + v3).M2(); + values[kS23] = (v2 + v3).M2(); } if (pairType == kTripleCandidateToPKPi) { @@ -3334,6 +3340,10 @@ void VarManager::FillTripleMC(T1 const& t1, T2 const& t2, T3 const& t3, float* v values[kEta] = v123.Eta(); values[kPhi] = v123.Phi(); values[kRap] = -v123.Rapidity(); + values[kCharge] = t1.sign() + t2.sign() + t3.sign(); + values[kS12] = (v1 + v2).M2(); + values[kS13] = (v1 + v3).M2(); + values[kS23] = (v2 + v3).M2(); } } @@ -4047,6 +4057,9 @@ void VarManager::FillDileptonTrackVertexing(C const& collision, T1 const& lepton values[VarManager::kPairPtDau] = v12.Pt(); } values[VarManager::kPt] = track.pt(); + values[kS12] = (v1 + v2).M2(); + values[kS13] = (v1 + v3).M2(); + values[kS23] = (v2 + v3).M2(); values[VarManager::kVertexingProcCode] = procCode; if (procCode == 0 || procCodeJpsi == 0) { diff --git a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx index c7093db2c8c..4a38eab9952 100644 --- a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx +++ b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx @@ -2189,8 +2189,6 @@ struct AnalysisAsymmetricPairing { HistogramManager* fHistMan; - std::map> fTrackHistNames; - std::map> fBarrelHistNamesMCmatched; std::vector fPairCuts; int fNPairHistPrefixes; @@ -2213,6 +2211,11 @@ struct AnalysisAsymmetricPairing { int fNLegCuts; int fNPairCuts = 0; int fNCommonTrackCuts; + // vectors for cut names and signal names, for easy access when calling FillHistogramList() + std::vector fLegCutNames; + std::vector fPairCutNames; + std::vector fCommonCutNames; + std::vector fRecMCSignalNames; Filter eventFilter = aod::dqanalysisflags::isEventSelected > static_cast(0); @@ -2234,14 +2237,15 @@ struct AnalysisAsymmetricPairing { } VarManager::SetDefaultVarNames(); + fHistMan = new HistogramManager("analysisHistos", "aa", VarManager::kNVars); + fHistMan->SetUseDefaultVariableNames(kTRUE); + fHistMan->SetDefaultVarNames(VarManager::fgVariableNames, VarManager::fgVariableUnits); - TString histNames = ""; - std::vector names; - - // Get the leg cut filter maps + // Get the leg cut filter masks fLegAFilterMask = fConfigLegAFilterMask.value; fLegBFilterMask = fConfigLegBFilterMask.value; fLegCFilterMask = fConfigLegCFilterMask.value; + // Get the pair cuts TString cutNamesStr = fConfigPairCuts.value; if (!cutNamesStr.IsNull()) { @@ -2259,17 +2263,38 @@ struct AnalysisAsymmetricPairing { cutNamesStr += Form(",%s", t->GetName()); } } + std::unique_ptr objArrayPairCuts(cutNamesStr.Tokenize(",")); + fNPairCuts = objArrayPairCuts->GetEntries(); + for (int j = 0; j < fNPairCuts; j++) { + fPairCutNames.push_back(objArrayPairCuts->At(j)->GetName()); + } // Setting the MC rec signal names TString sigNamesStr = fConfigMCRecSignals.value; std::unique_ptr objRecSigArray(sigNamesStr.Tokenize(",")); - for (int isig = 0; isig < objRecSigArray->GetEntries(); ++isig) { MCSignal* sig = o2::aod::dqmcsignals::GetMCSignal(objRecSigArray->At(isig)->GetName()); if (sig) { fRecMCSignals.push_back(sig); } } + // Add the reco MCSignals from the JSON config + TString addMCSignalsStr = fConfigMCRecSignalsJSON.value; + if (addMCSignalsStr != "") { + std::vector addMCSignals = dqmcsignals::GetMCSignalsFromJSON(addMCSignalsStr.Data()); + for (auto& mcIt : addMCSignals) { + if (mcIt->GetNProngs() != 2 && mcIt->GetNProngs() != 3) { + LOG(fatal) << "Signal at reconstructed level requested (" << mcIt->GetName() << ") " << "does not have 2 or 3 prongs! Fix it"; + } + fRecMCSignals.push_back(mcIt); + sigNamesStr += Form(",%s", mcIt->GetName()); + } + } + // Put all the reco MCSignal names in the vector for histogram naming + std::unique_ptr objArrayRecMCSignals(sigNamesStr.Tokenize(",")); + for (int i = 0; i < objArrayRecMCSignals->GetEntries(); i++) { + fRecMCSignalNames.push_back(objArrayRecMCSignals->At(i)->GetName()); + } // Get the barrel track selection cuts string tempCuts; @@ -2296,6 +2321,7 @@ struct AnalysisAsymmetricPairing { if (commonCutIdx >= 0) { fCommonTrackCutMask |= static_cast(1) << objArray->IndexOf(objArrayCommon->At(icut)); fCommonTrackCutFilterMasks[icut] = static_cast(1) << objArray->IndexOf(objArrayCommon->At(icut)); + fCommonCutNames.push_back(objArrayCommon->At(icut)->GetName()); } else { LOGF(fatal, "Common track cut %s was not calculated upstream. Check the config!", objArrayCommon->At(icut)->GetName()); } @@ -2365,22 +2391,19 @@ struct AnalysisAsymmetricPairing { continue; } } + // Leg cut config is fine, store the leg cut name in a vector + fLegCutNames.push_back(legsStr); + + // Define histogram and histogram directory names if (isThreeProng[icut]) { - names = { - Form("TripletsBarrelSE_%s", legsStr.Data())}; - histNames += Form("%s;", names[0].Data()); + DefineHistograms(fHistMan, Form("TripletsBarrelSE_%s", legsStr.Data()), fConfigHistogramSubgroups.value.data()); if (fConfigQA) { - names.push_back(Form("TripletsBarrelSE_ambiguous_%s", legsStr.Data())); - histNames += Form("%s;", names[1].Data()); + DefineHistograms(fHistMan, Form("TripletsBarrelSE_ambiguous_%s", legsStr.Data()), fConfigHistogramSubgroups.value.data()); } - fTrackHistNames[icut] = names; std::unique_ptr objArrayCommon(commonNamesStr.Tokenize(",")); for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { - names = {}; - names.push_back(Form("TripletsBarrelSE_%s_%s", legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName())); - histNames += Form("%s;", names[0].Data()); - fTrackHistNames[fNLegCuts + icut * fNCommonTrackCuts + iCommonCut] = names; + DefineHistograms(fHistMan, Form("TripletsBarrelSE_%s_%s", legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName()), fConfigHistogramSubgroups.value.data()); } TString cutNamesStr = fConfigPairCuts.value; @@ -2388,15 +2411,9 @@ struct AnalysisAsymmetricPairing { std::unique_ptr objArrayPair(cutNamesStr.Tokenize(",")); fNPairCuts = objArrayPair->GetEntries(); for (int iPairCut = 0; iPairCut < fNPairCuts; ++iPairCut) { // loop over pair cuts - names = {}; - names.push_back(Form("TripletsBarrelSE_%s_%s", legsStr.Data(), objArrayPair->At(iPairCut)->GetName())); - histNames += Form("%s;", names[0].Data()); - fTrackHistNames[fNLegCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut] = names; + DefineHistograms(fHistMan, Form("TripletsBarrelSE_%s_%s", legsStr.Data(), objArrayPair->At(iPairCut)->GetName()), fConfigHistogramSubgroups.value.data()); for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { - names = {}; - names.push_back(Form("TripletsBarrelSE_%s_%s_%s", legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), objArrayPair->At(iPairCut)->GetName())); - histNames += Form("%s;", names[0].Data()); - fTrackHistNames[(fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts + 1) + iCommonCut * (1 + fNPairCuts) + iPairCut] = names; + DefineHistograms(fHistMan, Form("TripletsBarrelSE_%s_%s_%s", legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), objArrayPair->At(iPairCut)->GetName()), fConfigHistogramSubgroups.value.data()); } // end loop (common cuts) } // end loop (pair cuts) } // end if (pair cuts) @@ -2405,38 +2422,24 @@ struct AnalysisAsymmetricPairing { if (!sigNamesStr.IsNull()) { for (unsigned int isig = 0; isig < fRecMCSignals.size(); isig++) { auto sig = fRecMCSignals.at(isig); - int offset = fNLegCuts * isig * (1 + fNCommonTrackCuts + fNPairCuts + fNCommonTrackCuts * fNPairCuts); - names = { - Form("TripletsBarrelSE_%s_%s", legsStr.Data(), sig->GetName())}; - histNames += Form("%s;", names[0].Data()); - fBarrelHistNamesMCmatched[offset + icut] = names; + DefineHistograms(fHistMan, Form("TripletsBarrelSE_%s_%s", legsStr.Data(), sig->GetName()), fConfigHistogramSubgroups.value.data()); for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { - names = {}; - names.push_back(Form("TripletsBarrelSE_%s_%s_%s", legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), sig->GetName())); - histNames += Form("%s;", names[0].Data()); - fBarrelHistNamesMCmatched[offset + fNLegCuts + icut * fNCommonTrackCuts + iCommonCut] = names; + DefineHistograms(fHistMan, Form("TripletsBarrelSE_%s_%s_%s", legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), sig->GetName()), fConfigHistogramSubgroups.value.data()); } if (!cutNamesStr.IsNull()) { // if pair cuts std::unique_ptr objArrayPair(cutNamesStr.Tokenize(",")); for (int iPairCut = 0; iPairCut < fNPairCuts; ++iPairCut) { // loop over pair cuts - names = {}; - names.push_back(Form("TripletsBarrelSE_%s_%s_%s", legsStr.Data(), objArrayPair->At(iPairCut)->GetName(), sig->GetName())); - histNames += Form("%s;", names[0].Data()); - fBarrelHistNamesMCmatched[offset + fNLegCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut] = names; + DefineHistograms(fHistMan, Form("TripletsBarrelSE_%s_%s_%s", legsStr.Data(), objArrayPair->At(iPairCut)->GetName(), sig->GetName()), fConfigHistogramSubgroups.value.data()); for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { - names = {}; - names.push_back(Form("TripletsBarrelSE_%s_%s_%s_%s", legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), objArrayPair->At(iPairCut)->GetName(), sig->GetName())); - histNames += Form("%s;", names[0].Data()); - fBarrelHistNamesMCmatched[offset + (fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * (1 + fNPairCuts) + iPairCut] = names; + DefineHistograms(fHistMan, Form("TripletsBarrelSE_%s_%s_%s_%s", legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), objArrayPair->At(iPairCut)->GetName(), sig->GetName()), fConfigHistogramSubgroups.value.data()); } // end loop (common cuts) } // end loop (pair cuts) } // end if (pair cuts) } // end loop over MC signals } // end if (MC signals) } else { - names = {}; std::vector pairHistPrefixes = {"PairsBarrelSEPM"}; if (fConfigSameSignHistograms.value) { pairHistPrefixes.push_back("PairsBarrelSEPP"); @@ -2445,50 +2448,37 @@ struct AnalysisAsymmetricPairing { fNPairHistPrefixes = pairHistPrefixes.size(); for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) { - names.push_back(Form("%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data())); - histNames += Form("%s;", names[iPrefix].Data()); + DefineHistograms(fHistMan, Form("%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data()), fConfigHistogramSubgroups.value.data()); } if (fConfigQA) { for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) { - names.push_back(Form("%s_ambiguous_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data())); - histNames += Form("%s;", names[fNPairHistPrefixes + iPrefix].Data()); + DefineHistograms(fHistMan, Form("%s_ambiguous_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data()), fConfigHistogramSubgroups.value.data()); } } if (fConfigReflectedHistograms.value) { for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) { - names.push_back(Form("%s_reflected_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data())); - histNames += Form("%s;", names[(1 + fConfigQA.value) * fNPairHistPrefixes + iPrefix].Data()); + DefineHistograms(fHistMan, Form("%s_reflected_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data()), fConfigHistogramSubgroups.value.data()); } } - fTrackHistNames[icut] = names; std::unique_ptr objArrayCommon(commonNamesStr.Tokenize(",")); for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { - names = {}; for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) { - names.push_back(Form("%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName())); - histNames += Form("%s;", names[iPrefix].Data()); + DefineHistograms(fHistMan, Form("%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName()), fConfigHistogramSubgroups.value.data()); } - fTrackHistNames[fNLegCuts + icut * fNCommonTrackCuts + iCommonCut] = names; } if (!cutNamesStr.IsNull()) { // if pair cuts std::unique_ptr objArrayPair(cutNamesStr.Tokenize(",")); fNPairCuts = objArrayPair->GetEntries(); for (int iPairCut = 0; iPairCut < fNPairCuts; ++iPairCut) { // loop over pair cuts - names = {}; for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) { - names.push_back(Form("%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), objArrayPair->At(iPairCut)->GetName())); - histNames += Form("%s;", names[iPrefix].Data()); + DefineHistograms(fHistMan, Form("%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), objArrayPair->At(iPairCut)->GetName()), fConfigHistogramSubgroups.value.data()); } - fTrackHistNames[fNLegCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut] = names; for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { - names = {}; for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) { - names.push_back(Form("%s_%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), objArrayPair->At(iPairCut)->GetName())); - histNames += Form("%s;", names[iPrefix].Data()); + DefineHistograms(fHistMan, Form("%s_%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), objArrayPair->At(iPairCut)->GetName()), fConfigHistogramSubgroups.value.data()); } - fTrackHistNames[(fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * fNPairCuts + iPairCut] = names; } // end loop (common cuts) } // end loop (pair cuts) } // end if (pair cuts) @@ -2497,45 +2487,31 @@ struct AnalysisAsymmetricPairing { if (!sigNamesStr.IsNull()) { for (unsigned int isig = 0; isig < fRecMCSignals.size(); isig++) { auto sig = fRecMCSignals.at(isig); - names = {}; - int offset = fNLegCuts * isig * (1 + fNCommonTrackCuts + fNPairCuts + fNCommonTrackCuts * fNPairCuts); for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) { - names.push_back(Form("%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), sig->GetName())); - histNames += Form("%s;", names[iPrefix].Data()); + DefineHistograms(fHistMan, Form("%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), sig->GetName()), fConfigHistogramSubgroups.value.data()); } if (fConfigReflectedHistograms.value) { for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) { - names.push_back(Form("%s_reflected_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), sig->GetName())); - histNames += Form("%s;", names[fNPairHistPrefixes + iPrefix].Data()); + DefineHistograms(fHistMan, Form("%s_reflected_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), sig->GetName()), fConfigHistogramSubgroups.value.data()); } } - fBarrelHistNamesMCmatched[offset + icut] = names; for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { - names = {}; for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) { - names.push_back(Form("%s_%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), sig->GetName())); - histNames += Form("%s;", names[iPrefix].Data()); + DefineHistograms(fHistMan, Form("%s_%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), sig->GetName()), fConfigHistogramSubgroups.value.data()); } - fBarrelHistNamesMCmatched[offset + fNLegCuts + icut * fNCommonTrackCuts + iCommonCut] = names; } if (!cutNamesStr.IsNull()) { // if pair cuts std::unique_ptr objArrayPair(cutNamesStr.Tokenize(",")); for (int iPairCut = 0; iPairCut < fNPairCuts; ++iPairCut) { // loop over pair cuts - names = {}; for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) { - names.push_back(Form("%s_%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), objArrayPair->At(iPairCut)->GetName(), sig->GetName())); - histNames += Form("%s;", names[iPrefix].Data()); + DefineHistograms(fHistMan, Form("%s_%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), objArrayPair->At(iPairCut)->GetName(), sig->GetName()), fConfigHistogramSubgroups.value.data()); } - fBarrelHistNamesMCmatched[offset + fNLegCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut] = names; for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { - names = {}; for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) { - names.push_back(Form("%s_%s_%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), objArrayPair->At(iPairCut)->GetName(), sig->GetName())); - histNames += Form("%s;", names[iPrefix].Data()); + DefineHistograms(fHistMan, Form("%s_%s_%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), objArrayPair->At(iPairCut)->GetName(), sig->GetName()), fConfigHistogramSubgroups.value.data()); } - fBarrelHistNamesMCmatched[offset + (fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * fNPairCuts + iPairCut] = names; } // end loop (common cuts) } // end loop (pair cuts) } // end if (pair cuts) @@ -2544,18 +2520,6 @@ struct AnalysisAsymmetricPairing { } } - // Add the reco MCSignals from the JSON config - TString addMCSignalsStr = fConfigMCRecSignalsJSON.value; - if (addMCSignalsStr != "") { - std::vector addMCSignals = dqmcsignals::GetMCSignalsFromJSON(addMCSignalsStr.Data()); - for (auto& mcIt : addMCSignals) { - if (mcIt->GetNProngs() != 3) { - LOG(fatal) << "Signal at reconstructed level requested (" << mcIt->GetName() << ") " << "does not have 3 prongs! Fix it"; - } - fRecMCSignals.push_back(mcIt); - } - } - // Add histogram classes for each specified MCsignal at the generator level // TODO: create a std::vector of hist classes to be used at Fill time, to avoid using Form in the process function TString sigGenNamesStr = fConfigMCGenSignals.value; @@ -2565,8 +2529,8 @@ struct AnalysisAsymmetricPairing { if (sig) { if (sig->GetNProngs() == 1) { // NOTE: 1-prong signals required fGenMCSignals.push_back(sig); - histNames += Form("MCTruthGen_%s;", sig->GetName()); // TODO: Add these names to a std::vector to avoid using Form in the process function - histNames += Form("MCTruthGenSel_%s;", sig->GetName()); // TODO: Add these names to a std::vector to avoid using Form in the process function + DefineHistograms(fHistMan, Form("MCTruthGen_%s;", sig->GetName()), fConfigHistogramSubgroups.value.data()); // TODO: Add these names to a std::vector to avoid using Form in the process function + DefineHistograms(fHistMan, Form("MCTruthGenSel_%s;", sig->GetName()), fConfigHistogramSubgroups.value.data()); // TODO: Add these names to a std::vector to avoid using Form in the process function } } } @@ -2578,8 +2542,8 @@ struct AnalysisAsymmetricPairing { for (auto& mcIt : addMCSignals) { if (mcIt->GetNProngs() == 1) { fGenMCSignals.push_back(mcIt); - histNames += Form("MCTruthGen_%s;", mcIt->GetName()); // TODO: Add these names to a std::vector to avoid using Form in the process function - histNames += Form("MCTruthGenSel_%s;", mcIt->GetName()); // TODO: Add these names to a std::vector to avoid using Form in the process function + DefineHistograms(fHistMan, Form("MCTruthGen_%s;", mcIt->GetName()), fConfigHistogramSubgroups.value.data()); // TODO: Add these names to a std::vector to avoid using Form in the process function + DefineHistograms(fHistMan, Form("MCTruthGenSel_%s;", mcIt->GetName()), fConfigHistogramSubgroups.value.data()); // TODO: Add these names to a std::vector to avoid using Form in the process function } } } @@ -2609,11 +2573,6 @@ struct AnalysisAsymmetricPairing { fLUT = o2::base::MatLayerCylSet::rectifyPtrFromFile(fCCDB->get(fConfigLutPath)); VarManager::SetupMatLUTFwdDCAFitter(fLUT); - fHistMan = new HistogramManager("analysisHistos", "aa", VarManager::kNVars); - fHistMan->SetUseDefaultVariableNames(kTRUE); - fHistMan->SetDefaultVarNames(VarManager::fgVariableNames, VarManager::fgVariableUnits); - - DefineHistograms(fHistMan, histNames.Data(), fConfigHistogramSubgroups.value.data()); // define all histograms dqhistograms::AddHistogramsFromJSON(fHistMan, fConfigAddJSONHistograms.value.c_str()); // ad-hoc histograms via JSON VarManager::SetUseVars(fHistMan->GetUsedVars()); // provide the list of required variables so that VarManager knows what to fill fOutputList.setObject(fHistMan->GetMainHistogramList()); @@ -2672,9 +2631,6 @@ struct AnalysisAsymmetricPairing { } } - std::map> histNamesMC = fBarrelHistNamesMCmatched; - std::map> histNames = fTrackHistNames; - int sign1 = 0; int sign2 = 0; uint32_t mcDecision = 0; @@ -2779,50 +2735,49 @@ struct AnalysisAsymmetricPairing { if (twoTrackFilter & (static_cast(1) << icut)) { isAmbi = (twoTrackFilter & (static_cast(1) << 30)) || (twoTrackFilter & (static_cast(1) << 31)); if (sign1 * sign2 < 0) { // +- pairs - fHistMan->FillHistClass(histNames[icut][0].Data(), VarManager::fgValues); // reconstructed, unmatched + fHistMan->FillHistClass(Form("PairsBarrelSEPM_%s", fLegCutNames[icut].Data()), VarManager::fgValues); // reconstructed, unmatched if (isAmbi && fConfigQA) { - fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPM_ambiguous_%s", fLegCutNames[icut].Data()), VarManager::fgValues); } if (isReflected && fConfigReflectedHistograms.value) { - fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes * (1 + fConfigQA.value)].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPM_reflected_%s", fLegCutNames[icut].Data()), VarManager::fgValues); } } else if (fConfigSameSignHistograms.value) { if (sign1 > 0) { // ++ pairs - fHistMan->FillHistClass(histNames[icut][1].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPP_%s", fLegCutNames[icut].Data()), VarManager::fgValues); if (isAmbi && fConfigQA) { - fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes + 1].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPP_ambiguous_%s", fLegCutNames[icut].Data()), VarManager::fgValues); } if (isReflected && fConfigReflectedHistograms.value) { - fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes * (1 + fConfigQA.value) + 1].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPP_reflected_%s", fLegCutNames[icut].Data()), VarManager::fgValues); } } else { // -- pairs - fHistMan->FillHistClass(histNames[icut][2].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEMM_%s", fLegCutNames[icut].Data()), VarManager::fgValues); if (isAmbi && fConfigQA) { - fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes + 2].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEMM_ambiguous_%s", fLegCutNames[icut].Data()), VarManager::fgValues); } if (isReflected && fConfigReflectedHistograms) { - fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes * (1 + fConfigQA.value) + 2].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEMM_reflected_%s", fLegCutNames[icut].Data()), VarManager::fgValues); } } } for (unsigned int isig = 0; isig < fRecMCSignals.size(); isig++) { // loop over MC signals - int offset = fNLegCuts * isig * (1 + fNCommonTrackCuts + fNPairCuts + fNCommonTrackCuts * fNPairCuts); if (mcDecision & (static_cast(1) << isig)) { if (sign1 * sign2 < 0) { - fHistMan->FillHistClass(histNamesMC[offset + icut][0].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPM_%s_%s", fLegCutNames[icut].Data(), fRecMCSignalNames[isig].Data()), VarManager::fgValues); if (isReflected && fConfigReflectedHistograms.value) { - fHistMan->FillHistClass(histNamesMC[offset + icut][fNPairHistPrefixes].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPM_reflected_%s_%s", fLegCutNames[icut].Data(), fRecMCSignalNames[isig].Data()), VarManager::fgValues); } } else if (fConfigSameSignHistograms.value) { if (sign1 > 0) { - fHistMan->FillHistClass(histNamesMC[offset + icut][1].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPP_%s_%s", fLegCutNames[icut].Data(), fRecMCSignalNames[isig].Data()), VarManager::fgValues); if (isReflected && fConfigReflectedHistograms.value) { - fHistMan->FillHistClass(histNamesMC[offset + icut][fNPairHistPrefixes + 1].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPP_reflected_%s_%s", fLegCutNames[icut].Data(), fRecMCSignalNames[isig].Data()), VarManager::fgValues); } } else { - fHistMan->FillHistClass(histNamesMC[offset + icut][2].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEMM_%s_%s", fLegCutNames[icut].Data(), fRecMCSignalNames[isig].Data()), VarManager::fgValues); if (isReflected && fConfigReflectedHistograms.value) { - fHistMan->FillHistClass(histNamesMC[offset + icut][fNPairHistPrefixes + 2].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEMM_reflected_%s_%s", fLegCutNames[icut].Data(), fRecMCSignalNames[isig].Data()), VarManager::fgValues); } } } @@ -2831,24 +2786,23 @@ struct AnalysisAsymmetricPairing { for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; iCommonCut++) { if (twoTrackCommonFilter & fCommonTrackCutFilterMasks[iCommonCut]) { if (sign1 * sign2 < 0) { - fHistMan->FillHistClass(histNames[fNLegCuts + icut * fNCommonTrackCuts + iCommonCut][0].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPM_%s_%s", fLegCutNames[icut].Data(), fCommonCutNames[iCommonCut].Data()), VarManager::fgValues); } else if (fConfigSameSignHistograms.value) { if (sign1 > 0) { - fHistMan->FillHistClass(histNames[fNLegCuts + icut * fNCommonTrackCuts + iCommonCut][1].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPP_%s_%s", fLegCutNames[icut].Data(), fCommonCutNames[iCommonCut].Data()), VarManager::fgValues); } else { - fHistMan->FillHistClass(histNames[fNLegCuts + icut * fNCommonTrackCuts + iCommonCut][2].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEMM_%s_%s", fLegCutNames[icut].Data(), fCommonCutNames[iCommonCut].Data()), VarManager::fgValues); } } for (unsigned int isig = 0; isig < fRecMCSignals.size(); isig++) { // loop over MC signals - int offset = fNLegCuts * isig * (1 + fNCommonTrackCuts + fNPairCuts + fNCommonTrackCuts * fNPairCuts); if (mcDecision & (static_cast(1) << isig)) { if (sign1 * sign2 < 0) { - fHistMan->FillHistClass(histNamesMC[offset + fNLegCuts + icut * fNCommonTrackCuts + iCommonCut][0].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPM_%s_%s_%s", fLegCutNames[icut].Data(), fCommonCutNames[iCommonCut].Data(), fRecMCSignalNames[isig].Data()), VarManager::fgValues); } else if (fConfigSameSignHistograms.value) { if (sign1 > 0) { - fHistMan->FillHistClass(histNamesMC[offset + fNLegCuts + icut * fNCommonTrackCuts + iCommonCut][1].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPP_%s_%s_%s", fLegCutNames[icut].Data(), fCommonCutNames[iCommonCut].Data(), fRecMCSignalNames[isig].Data()), VarManager::fgValues); } else { - fHistMan->FillHistClass(histNamesMC[offset + fNLegCuts + icut * fNCommonTrackCuts + iCommonCut][2].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEMM_%s_%s_%s", fLegCutNames[icut].Data(), fCommonCutNames[iCommonCut].Data(), fRecMCSignalNames[isig].Data()), VarManager::fgValues); } } } @@ -2862,24 +2816,23 @@ struct AnalysisAsymmetricPairing { pairFilter |= (static_cast(1) << iPairCut); // Histograms with pair cuts if (sign1 * sign2 < 0) { - fHistMan->FillHistClass(histNames[fNLegCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut][0].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPM_%s_%s", fLegCutNames[icut].Data(), fPairCutNames[iPairCut].Data()), VarManager::fgValues); } else if (fConfigSameSignHistograms.value) { if (sign1 > 0) { - fHistMan->FillHistClass(histNames[fNLegCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut][1].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPP_%s_%s", fLegCutNames[icut].Data(), fPairCutNames[iPairCut].Data()), VarManager::fgValues); } else { - fHistMan->FillHistClass(histNames[fNLegCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut][2].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEMM_%s_%s", fLegCutNames[icut].Data(), fPairCutNames[iPairCut].Data()), VarManager::fgValues); } } for (unsigned int isig = 0; isig < fRecMCSignals.size(); isig++) { // loop over MC signals - int offset = fNLegCuts * isig * (1 + fNCommonTrackCuts + fNPairCuts + fNCommonTrackCuts * fNPairCuts); if (mcDecision & (static_cast(1) << isig)) { if (sign1 * sign2 < 0) { - fHistMan->FillHistClass(histNamesMC[offset + fNLegCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut][0].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPM_%s_%s_%s", fLegCutNames[icut].Data(), fPairCutNames[iPairCut].Data(), fRecMCSignalNames[isig].Data()), VarManager::fgValues); } else if (fConfigSameSignHistograms.value) { if (sign1 > 0) { - fHistMan->FillHistClass(histNamesMC[offset + fNLegCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut][1].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPP_%s_%s_%s", fLegCutNames[icut].Data(), fPairCutNames[iPairCut].Data(), fRecMCSignalNames[isig].Data()), VarManager::fgValues); } else { - fHistMan->FillHistClass(histNamesMC[offset + fNLegCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut][2].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEMM_%s_%s_%s", fLegCutNames[icut].Data(), fPairCutNames[iPairCut].Data(), fRecMCSignalNames[isig].Data()), VarManager::fgValues); } } } @@ -2888,24 +2841,23 @@ struct AnalysisAsymmetricPairing { for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { if (twoTrackCommonFilter & fCommonTrackCutFilterMasks[iCommonCut]) { if (sign1 * sign2 < 0) { - fHistMan->FillHistClass(histNames[(fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * fNPairCuts + iPairCut][0].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPM_%s_%s_%s", fLegCutNames[icut].Data(), fCommonCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data()), VarManager::fgValues); } else if (fConfigSameSignHistograms.value) { if (sign1 > 0) { - fHistMan->FillHistClass(histNames[(fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * fNPairCuts + iPairCut][1].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPP_%s_%s_%s", fLegCutNames[icut].Data(), fCommonCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data()), VarManager::fgValues); } else { - fHistMan->FillHistClass(histNames[(fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * fNPairCuts + iPairCut][2].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEMM_%s_%s_%s", fLegCutNames[icut].Data(), fCommonCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data()), VarManager::fgValues); } } for (unsigned int isig = 0; isig < fRecMCSignals.size(); isig++) { // loop over MC signals - int offset = fNLegCuts * isig * (1 + fNCommonTrackCuts + fNPairCuts + fNCommonTrackCuts * fNPairCuts); if (mcDecision & (static_cast(1) << isig)) { if (sign1 * sign2 < 0) { - fHistMan->FillHistClass(histNamesMC[offset + (fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * fNPairCuts + iPairCut][0].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPM_%s_%s_%s_%s", fLegCutNames[icut].Data(), fCommonCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data(), fRecMCSignalNames[isig].Data()), VarManager::fgValues); } else if (fConfigSameSignHistograms.value) { if (sign1 > 0) { - fHistMan->FillHistClass(histNamesMC[offset + (fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * fNPairCuts + iPairCut][1].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPP_%s_%s_%s_%s", fLegCutNames[icut].Data(), fCommonCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data(), fRecMCSignalNames[isig].Data()), VarManager::fgValues); } else { - fHistMan->FillHistClass(histNamesMC[offset + (fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * fNPairCuts + iPairCut][2].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEMM_%s_%s_%s_%s", fLegCutNames[icut].Data(), fCommonCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data(), fRecMCSignalNames[isig].Data()), VarManager::fgValues); } } } @@ -2936,9 +2888,6 @@ struct AnalysisAsymmetricPairing { } } - std::map> histNames = fTrackHistNames; - std::map> histNamesMC = fBarrelHistNamesMCmatched; - for (auto& event : events) { if (!event.isEventSelected_bit(0)) { continue; @@ -2963,12 +2912,12 @@ struct AnalysisAsymmetricPairing { // Based on triplet type, make suitable combinations of the partitions if (tripletType == VarManager::kTripleCandidateToPKPi) { for (auto& [a1, a2, a3] : combinations(soa::CombinationsFullIndexPolicy(groupedLegAAssocs, groupedLegBAssocs, groupedLegCAssocs))) { - readTriplet(a1, a2, a3, tracks, event, tripletType, histNames, histNamesMC); + readTriplet(a1, a2, a3, tracks, event, tripletType); } } else if (tripletType == VarManager::kTripleCandidateToKPiPi) { for (auto& a1 : groupedLegAAssocs) { for (auto& [a2, a3] : combinations(groupedLegBAssocs, groupedLegCAssocs)) { - readTriplet(a1, a2, a3, tracks, event, tripletType, histNames, histNamesMC); + readTriplet(a1, a2, a3, tracks, event, tripletType); } } } else { @@ -2979,7 +2928,7 @@ struct AnalysisAsymmetricPairing { // Helper function to process triplet template - void readTriplet(TTrackAssoc const& a1, TTrackAssoc const& a2, TTrackAssoc const& a3, TTracks const& /*tracks*/, TEvent const& event, VarManager::PairCandidateType tripletType, std::map> histNames, std::map> histNamesMC) + void readTriplet(TTrackAssoc const& a1, TTrackAssoc const& a2, TTrackAssoc const& a3, TTracks const& /*tracks*/, TEvent const& event, VarManager::PairCandidateType tripletType) { uint32_t mcDecision = 0; @@ -3066,24 +3015,21 @@ struct AnalysisAsymmetricPairing { for (int icut = 0; icut < fNLegCuts; icut++) { isAmbi = (threeTrackFilter & (static_cast(1) << 29)) || (threeTrackFilter & (static_cast(1) << 30)) || (threeTrackFilter & (static_cast(1) << 31)); if (threeTrackFilter & (static_cast(1) << icut)) { - fHistMan->FillHistClass(histNames[icut][0].Data(), VarManager::fgValues); - // TODO: loop over MC signals + fHistMan->FillHistClass(Form("TripletsBarrelSE_%s", fLegCutNames[icut].Data()), VarManager::fgValues); for (unsigned int isig = 0; isig < fRecMCSignals.size(); isig++) { // loop over MC signals - int offset = fNLegCuts * isig * (1 + fNCommonTrackCuts + fNPairCuts + fNCommonTrackCuts * fNPairCuts); if (mcDecision & (static_cast(1) << isig)) { - fHistMan->FillHistClass(histNamesMC[offset + icut][0].Data(), VarManager::fgValues); // matched signal + fHistMan->FillHistClass(Form("TripletsBarrelSE_%s_%s", fLegCutNames[icut].Data(), fRecMCSignalNames[isig].Data()), VarManager::fgValues); // matched signal } } // end loop (MC signals) if (fConfigQA && isAmbi) { - fHistMan->FillHistClass(histNames[icut][1].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("TripletsBarrelSE_ambiguous_%s", fLegCutNames[icut].Data()), VarManager::fgValues); } for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; iCommonCut++) { if (threeTrackCommonFilter & fCommonTrackCutFilterMasks[iCommonCut]) { - fHistMan->FillHistClass(histNames[fNLegCuts + icut * fNCommonTrackCuts + iCommonCut][0].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("TripletsBarrelSE_%s_%s", fLegCutNames[icut].Data(), fCommonCutNames[iCommonCut].Data()), VarManager::fgValues); for (unsigned int isig = 0; isig < fRecMCSignals.size(); isig++) { // loop over MC signals - int offset = fNLegCuts * isig * (1 + fNCommonTrackCuts + fNPairCuts + fNCommonTrackCuts * fNPairCuts); if (mcDecision & (static_cast(1) << isig)) { - fHistMan->FillHistClass(histNamesMC[offset + fNLegCuts + icut * fNCommonTrackCuts + iCommonCut][0].Data(), VarManager::fgValues); // matched signal + fHistMan->FillHistClass(Form("TripletsBarrelSE_%s_%s_%s", fLegCutNames[icut].Data(), fCommonCutNames[iCommonCut].Data(), fRecMCSignalNames[isig].Data()), VarManager::fgValues); // matched signal } } // end loop (MC signals) } @@ -3093,21 +3039,19 @@ struct AnalysisAsymmetricPairing { if (!((*cut)->IsSelected(VarManager::fgValues))) // apply pair cuts continue; // Histograms with pair cuts - fHistMan->FillHistClass(histNames[fNLegCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut][0].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("TripletsBarrelSE_%s_%s", fLegCutNames[icut].Data(), fPairCutNames[iPairCut].Data()), VarManager::fgValues); for (unsigned int isig = 0; isig < fRecMCSignals.size(); isig++) { // loop over MC signals - int offset = fNLegCuts * isig * (1 + fNCommonTrackCuts + fNPairCuts + fNCommonTrackCuts * fNPairCuts); if (mcDecision & (static_cast(1) << isig)) { - fHistMan->FillHistClass(histNamesMC[offset + fNLegCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut][0].Data(), VarManager::fgValues); // matched signal + fHistMan->FillHistClass(Form("TripletsBarrelSE_%s_%s_%s", fLegCutNames[icut].Data(), fPairCutNames[iPairCut].Data(), fRecMCSignalNames[isig].Data()), VarManager::fgValues); // matched signal } } // end loop (MC signals) // Histograms with pair cuts and common track cuts for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { if (threeTrackCommonFilter & fCommonTrackCutFilterMasks[iCommonCut]) { - fHistMan->FillHistClass(histNames[(fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts + 1) + iCommonCut * (1 + fNPairCuts) + iPairCut][0].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("TripletsBarrelSE_%s_%s_%s", fLegCutNames[icut].Data(), fCommonCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data()), VarManager::fgValues); for (unsigned int isig = 0; isig < fRecMCSignals.size(); isig++) { // loop over MC signals - int offset = fNLegCuts * isig * (1 + fNCommonTrackCuts + fNPairCuts + fNCommonTrackCuts * fNPairCuts); if (mcDecision & (static_cast(1) << isig)) { - fHistMan->FillHistClass(histNamesMC[offset + (fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + icut * (fNPairCuts * fNCommonTrackCuts) + iCommonCut * (1 + fNPairCuts) + iPairCut][0].Data(), VarManager::fgValues); // matched signal + fHistMan->FillHistClass(Form("TripletsBarrelSE_%s_%s_%s_%s", fLegCutNames[icut].Data(), fCommonCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data(), fRecMCSignalNames[isig].Data()), VarManager::fgValues); // matched signal } } // end loop (MC signals) } @@ -3237,12 +3181,14 @@ struct AnalysisDileptonTrack { int fCurrentRun; // needed to detect if the run changed and trigger update of calibrations etc. int fNCuts; + int fNLegCuts; int fNPairCuts; int fNCommonTrackCuts; std::map fCommonTrackCutMap; uint32_t fTrackCutBitMap; // track cut bit mask to be used in the selection of tracks associated with dileptons // vector for single-lepton and track cut names for easy access when calling FillHistogramList() std::vector fTrackCutNames; + std::vector fLegCutNames; // vector for pair cut names, used mainly for pairs built via the asymmetric pairing task std::vector fPairCutNames; std::vector fCommonPairCutNames; @@ -3411,6 +3357,7 @@ struct AnalysisDileptonTrack { // but this is only used for histograms, not for the produced dilepton tables string cfgPairing_TrackCuts; string cfgPairing_PairCuts; + string cfgPairing_PairCutsJSON; string cfgPairing_CommonTrackCuts; if (isBarrel) { getTaskOptionValue(context, "analysis-same-event-pairing", "cfgTrackCuts", cfgPairing_TrackCuts, false); @@ -3424,7 +3371,7 @@ struct AnalysisDileptonTrack { getTaskOptionValue(context, "analysis-asymmetric-pairing", "cfgCommonTrackCuts", cfgPairing_CommonTrackCuts, false); } if (cfgPairing_TrackCuts.empty()) { - LOG(fatal) << "There are no dilepton cuts specified in the upstream in the same-event-pairing or assymmetric-pairing"; + LOG(fatal) << "There are no dilepton cuts specified in the upstream in the same-event-pairing or asymmetric-pairing"; } // If asymmetric pair is used, it may have common track cuts @@ -3442,6 +3389,18 @@ struct AnalysisDileptonTrack { } } // end if (common cuts) + // Get also the pair cuts specified via the JSON parameters + if (isBarrelAsymmetric) { + getTaskOptionValue(context, "analysis-asymmetric-pairing", "cfgPairCutsJSON", cfgPairing_PairCutsJSON, false); + TString addPairCutsStr = cfgPairing_PairCutsJSON; + if (addPairCutsStr != "") { + std::vector addPairCuts = dqcuts::GetCutsFromJSON(addPairCutsStr.Data()); + for (auto& t : addPairCuts) { + cfgPairing_PairCuts += Form(",%s", t->GetName()); + } + } + } + std::unique_ptr objArrayPairCuts(TString(cfgPairing_PairCuts).Tokenize(",")); fNPairCuts = objArrayPairCuts->GetEntries(); for (int j = 0; j < fNPairCuts; j++) { @@ -3450,17 +3409,31 @@ struct AnalysisDileptonTrack { // array of single lepton cuts specified in the same-analysis-pairing task std::unique_ptr cfgPairing_objArrayTrackCuts(TString(cfgPairing_TrackCuts).Tokenize(",")); + // If asymmetric pairs are used, the number of cuts should come from the asymmetric-pairing task + if (isBarrelAsymmetric) { + fNLegCuts = cfgPairing_objArrayTrackCuts->GetEntries(); + } else { + fNLegCuts = fNCuts; + } // loop over single lepton cuts if (isBarrel || isBarrelAsymmetric || isMuon) { - for (int icut = 0; icut < fNCuts; ++icut) { + for (int icut = 0; icut < fNLegCuts; ++icut) { + + TString pairLegCutName; // here we check that this cut is one of those used for building the dileptons - if (!cfgPairing_objArrayTrackCuts->FindObject(fTrackCutNames[icut].Data())) { - continue; + if (!isBarrelAsymmetric) { + if (!cfgPairing_objArrayTrackCuts->FindObject(fTrackCutNames[icut].Data())) { + continue; + } + pairLegCutName = fTrackCutNames[icut].Data(); + } else { + // For asymmetric pairs we access the leg cuts instead + pairLegCutName = static_cast(cfgPairing_objArrayTrackCuts->At(icut))->GetString(); } + fLegCutNames.push_back(pairLegCutName); - TString pairLegCutName = fTrackCutNames[icut].Data(); // define dilepton histograms DefineHistograms(fHistMan, Form("DileptonsSelected_%s", pairLegCutName.Data()), "barrel,vertexing"); // loop over track cuts and create dilepton - track histogram directories @@ -3479,31 +3452,31 @@ struct AnalysisDileptonTrack { if (!cfgPairing_strCommonTrackCuts.IsNull()) { std::unique_ptr objArrayCommon(cfgPairing_strCommonTrackCuts.Tokenize(",")); for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { + DefineHistograms(fHistMan, Form("DileptonsSelected_%s_%s", pairLegCutName.Data(), fCommonPairCutNames[iCommonCut].Data()), "barrel,vertexing"); DefineHistograms(fHistMan, Form("DileptonTrack_%s_%s_%s", pairLegCutName.Data(), fCommonPairCutNames[iCommonCut].Data(), fTrackCutNames[iCutTrack].Data()), fConfigHistogramSubgroups.value.data()); for (auto& sig : fRecMCSignals) { DefineHistograms(fHistMan, Form("DileptonTrackMCMatched_%s_%s_%s_%s", pairLegCutName.Data(), fCommonPairCutNames[iCommonCut].Data(), fTrackCutNames[iCutTrack].Data(), sig->GetName()), fConfigHistogramSubgroups.value.data()); } - DefineHistograms(fHistMan, Form("DileptonsSelected_%s_%s", pairLegCutName.Data(), fCommonPairCutNames[iCommonCut].Data()), "barrel,vertexing"); } } if (fNPairCuts != 0) { for (int iPairCut = 0; iPairCut < fNPairCuts; ++iPairCut) { + DefineHistograms(fHistMan, Form("DileptonsSelected_%s_%s", pairLegCutName.Data(), fPairCutNames[iPairCut].Data()), "barrel,vertexing"); DefineHistograms(fHistMan, Form("DileptonTrack_%s_%s_%s", pairLegCutName.Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iCutTrack].Data()), fConfigHistogramSubgroups.value.data()); for (auto& sig : fRecMCSignals) { DefineHistograms(fHistMan, Form("DileptonTrackMCMatched_%s_%s_%s_%s", pairLegCutName.Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iCutTrack].Data(), sig->GetName()), fConfigHistogramSubgroups.value.data()); } - DefineHistograms(fHistMan, Form("DileptonsSelected_%s_%s", pairLegCutName.Data(), fPairCutNames[iPairCut].Data()), "barrel,vertexing"); if (!cfgPairing_strCommonTrackCuts.IsNull()) { std::unique_ptr objArrayCommon(cfgPairing_strCommonTrackCuts.Tokenize(",")); for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { + DefineHistograms(fHistMan, Form("DileptonsSelected_%s_%s_%s", pairLegCutName.Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data()), "barrel,vertexing"); DefineHistograms(fHistMan, Form("DileptonTrack_%s_%s_%s_%s", pairLegCutName.Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iCutTrack].Data()), fConfigHistogramSubgroups.value.data()); for (auto& sig : fRecMCSignals) { DefineHistograms(fHistMan, Form("DileptonTrack_%s_%s_%s_%s_%s", pairLegCutName.Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iCutTrack].Data(), sig->GetName()), fConfigHistogramSubgroups.value.data()); } - DefineHistograms(fHistMan, Form("DileptonsSelected_%s_%s_%s", pairLegCutName.Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data()), "barrel,vertexing"); } } } @@ -3581,28 +3554,28 @@ struct AnalysisDileptonTrack { VarManager::FillTrack(dilepton, fValuesDilepton); // fill selected dilepton histograms for each specified selection - for (int icut = 0; icut < fNCuts; icut++) { + for (int icut = 0; icut < fNLegCuts; icut++) { if (!dilepton.filterMap_bit(icut)) { continue; } // regular dileptons - fHistMan->FillHistClass(Form("DileptonsSelected_%s", fTrackCutNames[icut].Data()), fValuesDilepton); + fHistMan->FillHistClass(Form("DileptonsSelected_%s", fLegCutNames[icut].Data()), fValuesDilepton); // other pairs, e.g.: D0s if constexpr (TCandidateType == VarManager::kDstarToD0KPiPi) { // Dielectrons and Dimuons don't have the PairFilterMap column for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; iCommonCut++) { if (dilepton.commonFilterMap_bit(fCommonTrackCutMap[iCommonCut])) { - fHistMan->FillHistClass(Form("DileptonsSelected_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data()), fValuesDilepton); + fHistMan->FillHistClass(Form("DileptonsSelected_%s_%s", fLegCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data()), fValuesDilepton); } } for (int iPairCut = 0; iPairCut < fNPairCuts; iPairCut++) { if (dilepton.pairFilterMap_bit(iPairCut)) { - fHistMan->FillHistClass(Form("DileptonsSelected_%s_%s", fTrackCutNames[icut].Data(), fPairCutNames[icut].Data()), fValuesDilepton); + fHistMan->FillHistClass(Form("DileptonsSelected_%s_%s", fLegCutNames[icut].Data(), fPairCutNames[icut].Data()), fValuesDilepton); for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; iCommonCut++) { if (dilepton.commonFilterMap_bit(fCommonTrackCutMap[iCommonCut])) { - fHistMan->FillHistClass(Form("DileptonsSelected_%s_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[icut].Data()), fValuesDilepton); + fHistMan->FillHistClass(Form("DileptonsSelected_%s_%s_%s", fLegCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[icut].Data()), fValuesDilepton); } } } @@ -3706,38 +3679,38 @@ struct AnalysisDileptonTrack { continue; } - fHistMan->FillHistClass(Form("DileptonTrack_%s_%s", fTrackCutNames[icut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); + fHistMan->FillHistClass(Form("DileptonTrack_%s_%s", fLegCutNames[icut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); for (uint32_t isig = 0; isig < fRecMCSignals.size(); isig++) { if (mcDecision & (static_cast(1) << isig)) { - fHistMan->FillHistClass(Form("DileptonTrackMCMatched_%s_%s_%s", fTrackCutNames[icut].Data(), fTrackCutNames[iTrackCut].Data(), fRecMCSignals[isig]->GetName()), fValuesHadron); + fHistMan->FillHistClass(Form("DileptonTrackMCMatched_%s_%s_%s", fLegCutNames[icut].Data(), fTrackCutNames[iTrackCut].Data(), fRecMCSignals[isig]->GetName()), fValuesHadron); } } if constexpr (TCandidateType == VarManager::kDstarToD0KPiPi) { // Dielectrons and Dimuons don't have the PairFilterMap column for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; iCommonCut++) { if (dilepton.commonFilterMap_bit(fCommonTrackCutMap[iCommonCut])) { - fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); + fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s", fLegCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); for (uint32_t isig = 0; isig < fRecMCSignals.size(); isig++) { if (mcDecision & (static_cast(1) << isig)) { - fHistMan->FillHistClass(Form("DileptonTrackMCMatched_%s_%s_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fTrackCutNames[iTrackCut].Data(), fRecMCSignals[isig]->GetName()), fValuesHadron); + fHistMan->FillHistClass(Form("DileptonTrackMCMatched_%s_%s_%s_%s", fLegCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fTrackCutNames[iTrackCut].Data(), fRecMCSignals[isig]->GetName()), fValuesHadron); } } } } for (int iPairCut = 0; iPairCut < fNPairCuts; iPairCut++) { if (dilepton.pairFilterMap_bit(iPairCut)) { - fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s", fTrackCutNames[icut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); + fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s", fLegCutNames[icut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); for (uint32_t isig = 0; isig < fRecMCSignals.size(); isig++) { if (mcDecision & (static_cast(1) << isig)) { - fHistMan->FillHistClass(Form("DileptonTrackMCMatched_%s_%s_%s_%s", fTrackCutNames[icut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data(), fRecMCSignals[isig]->GetName()), fValuesHadron); + fHistMan->FillHistClass(Form("DileptonTrackMCMatched_%s_%s_%s_%s", fLegCutNames[icut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data(), fRecMCSignals[isig]->GetName()), fValuesHadron); } } for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; iCommonCut++) { if (dilepton.commonFilterMap_bit(fCommonTrackCutMap[iCommonCut])) { - fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); + fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s_%s", fLegCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); for (uint32_t isig = 0; isig < fRecMCSignals.size(); isig++) { if (mcDecision & (static_cast(1) << isig)) { - fHistMan->FillHistClass(Form("DileptonTrackMCMatched_%s_%s_%s_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data(), fRecMCSignals[isig]->GetName()), fValuesHadron); + fHistMan->FillHistClass(Form("DileptonTrackMCMatched_%s_%s_%s_%s_%s", fLegCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data(), fRecMCSignals[isig]->GetName()), fValuesHadron); } } } diff --git a/PWGDQ/Tasks/tableReader_withAssoc.cxx b/PWGDQ/Tasks/tableReader_withAssoc.cxx index 7d19373fdb1..27138a44222 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.cxx +++ b/PWGDQ/Tasks/tableReader_withAssoc.cxx @@ -2082,7 +2082,6 @@ struct AnalysisAsymmetricPairing { HistogramManager* fHistMan; - std::map> fTrackHistNames; std::vector fPairCuts; int fNPairHistPrefixes; @@ -2102,6 +2101,10 @@ struct AnalysisAsymmetricPairing { int fNLegCuts; int fNPairCuts; int fNCommonTrackCuts; + // vectors for cut names and signal names, for easy access when calling FillHistogramList() + std::vector fLegCutNames; + std::vector fPairCutNames; + std::vector fCommonCutNames; Preslice> trackAssocsPerCollision = aod::reducedtrack_association::reducedeventId; @@ -2118,10 +2121,11 @@ struct AnalysisAsymmetricPairing { if (context.mOptions.get("processDummy")) { return; } - VarManager::SetDefaultVarNames(); - TString histNames = ""; - std::vector names; + VarManager::SetDefaultVarNames(); + fHistMan = new HistogramManager("analysisHistos", "aa", VarManager::kNVars); + fHistMan->SetUseDefaultVariableNames(kTRUE); + fHistMan->SetDefaultVarNames(VarManager::fgVariableNames, VarManager::fgVariableUnits); // Get the leg cut filter maps fLegAFilterMask = fConfigLegAFilterMask.value; @@ -2144,6 +2148,11 @@ struct AnalysisAsymmetricPairing { cutNamesStr += Form(",%s", t->GetName()); } } + std::unique_ptr objArrayPairCuts(cutNamesStr.Tokenize(",")); + fNPairCuts = objArrayPairCuts->GetEntries(); + for (int j = 0; j < fNPairCuts; j++) { + fPairCutNames.push_back(objArrayPairCuts->At(j)->GetName()); + } // Get the barrel track selection cuts string tempCuts; getTaskOptionValue(context, "analysis-track-selection", "cfgTrackCuts", tempCuts, false); @@ -2169,6 +2178,7 @@ struct AnalysisAsymmetricPairing { if (commonCutIdx >= 0) { fCommonTrackCutMask |= static_cast(1) << objArray->IndexOf(objArrayCommon->At(icut)); fCommonTrackCutFilterMasks[icut] = static_cast(1) << objArray->IndexOf(objArrayCommon->At(icut)); + fCommonCutNames.push_back(objArrayCommon->At(icut)->GetName()); } else { LOGF(fatal, "Common track cut %s was not calculated upstream. Check the config!", objArrayCommon->At(icut)->GetName()); } @@ -2238,42 +2248,31 @@ struct AnalysisAsymmetricPairing { continue; } } + // Leg cut config is fine, store the leg cut name in a vector + fLegCutNames.push_back(legsStr); + if (isThreeProng[icut]) { - names = { - Form("TripletsBarrelSE_%s", legsStr.Data())}; - histNames += Form("%s;", names[0].Data()); + DefineHistograms(fHistMan, Form("TripletsBarrelSE_%s", legsStr.Data()), fConfigHistogramSubgroups.value.data()); if (fConfigAmbiguousHistograms.value) { - names.push_back(Form("TripletsBarrelSE_ambiguous_%s", legsStr.Data())); - histNames += Form("%s;", names[1].Data()); + DefineHistograms(fHistMan, Form("TripletsBarrelSE_ambiguous_%s", legsStr.Data()), fConfigHistogramSubgroups.value.data()); } - fTrackHistNames[icut] = names; std::unique_ptr objArrayCommon(commonNamesStr.Tokenize(",")); for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { - names = {}; - names.push_back(Form("TripletsBarrelSE_%s_%s", legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName())); - histNames += Form("%s;", names[0].Data()); - fTrackHistNames[fNLegCuts + icut * fNCommonTrackCuts + iCommonCut] = names; + DefineHistograms(fHistMan, Form("TripletsBarrelSE_%s_%s", legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName()), fConfigHistogramSubgroups.value.data()); } if (!cutNamesStr.IsNull()) { // if pair cuts std::unique_ptr objArrayPair(cutNamesStr.Tokenize(",")); fNPairCuts = objArrayPair->GetEntries(); for (int iPairCut = 0; iPairCut < fNPairCuts; ++iPairCut) { // loop over pair cuts - names = {}; - names.push_back(Form("TripletsBarrelSE_%s_%s", legsStr.Data(), objArrayPair->At(iPairCut)->GetName())); - histNames += Form("%s;", names[0].Data()); - fTrackHistNames[fNLegCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut] = names; + DefineHistograms(fHistMan, Form("TripletsBarrelSE_%s_%s", legsStr.Data(), objArrayPair->At(iPairCut)->GetName()), fConfigHistogramSubgroups.value.data()); for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { - names = {}; - names.push_back(Form("TripletsBarrelSE_%s_%s_%s", legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), objArrayPair->At(iPairCut)->GetName())); - histNames += Form("%s;", names[0].Data()); - fTrackHistNames[(fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + (icut * fNPairCuts * fNCommonTrackCuts) + (iCommonCut * fNPairCuts) + iPairCut] = names; + DefineHistograms(fHistMan, Form("TripletsBarrelSE_%s_%s_%s", legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), objArrayPair->At(iPairCut)->GetName()), fConfigHistogramSubgroups.value.data()); } // end loop (common cuts) } // end loop (pair cuts) } // end if (pair cuts) } else { - names = {}; std::vector pairHistPrefixes = {"PairsBarrelSEPM"}; if (fConfigSameSignHistograms.value) { pairHistPrefixes.push_back("PairsBarrelSEPP"); @@ -2282,50 +2281,37 @@ struct AnalysisAsymmetricPairing { fNPairHistPrefixes = pairHistPrefixes.size(); for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) { - names.push_back(Form("%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data())); - histNames += Form("%s;", names[iPrefix].Data()); + DefineHistograms(fHistMan, Form("%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data()), fConfigHistogramSubgroups.value.data()); } if (fConfigAmbiguousHistograms.value) { for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) { - names.push_back(Form("%s_ambiguous_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data())); - histNames += Form("%s;", names[fNPairHistPrefixes + iPrefix].Data()); + DefineHistograms(fHistMan, Form("%s_ambiguous_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data()), fConfigHistogramSubgroups.value.data()); } } if (fConfigReflectedHistograms.value) { for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) { - names.push_back(Form("%s_reflected_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data())); - histNames += Form("%s;", names[(1 + fConfigAmbiguousHistograms.value) * fNPairHistPrefixes + iPrefix].Data()); + DefineHistograms(fHistMan, Form("%s_reflected_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data()), fConfigHistogramSubgroups.value.data()); } } - fTrackHistNames[icut] = names; std::unique_ptr objArrayCommon(commonNamesStr.Tokenize(",")); for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { - names = {}; for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) { - names.push_back(Form("%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName())); - histNames += Form("%s;", names[iPrefix].Data()); + DefineHistograms(fHistMan, Form("%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName()), fConfigHistogramSubgroups.value.data()); } - fTrackHistNames[fNLegCuts + icut * fNCommonTrackCuts + iCommonCut] = names; } if (!cutNamesStr.IsNull()) { // if pair cuts std::unique_ptr objArrayPair(cutNamesStr.Tokenize(",")); fNPairCuts = objArrayPair->GetEntries(); for (int iPairCut = 0; iPairCut < fNPairCuts; ++iPairCut) { // loop over pair cuts - names = {}; for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) { - names.push_back(Form("%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), objArrayPair->At(iPairCut)->GetName())); - histNames += Form("%s;", names[iPrefix].Data()); + DefineHistograms(fHistMan, Form("%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), objArrayPair->At(iPairCut)->GetName()), fConfigHistogramSubgroups.value.data()); } - fTrackHistNames[fNLegCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut] = names; for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { - names = {}; for (int iPrefix = 0; iPrefix < fNPairHistPrefixes; ++iPrefix) { - names.push_back(Form("%s_%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), objArrayPair->At(iPairCut)->GetName())); - histNames += Form("%s;", names[iPrefix].Data()); + DefineHistograms(fHistMan, Form("%s_%s_%s_%s", pairHistPrefixes[iPrefix].Data(), legsStr.Data(), objArrayCommon->At(iCommonCut)->GetName(), objArrayPair->At(iPairCut)->GetName()), fConfigHistogramSubgroups.value.data()); } - fTrackHistNames[(fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + (icut * fNPairCuts * fNCommonTrackCuts) + (iCommonCut * fNPairCuts) + iPairCut] = names; } // end loop (common cuts) } // end loop (pair cuts) } // end if (pair cuts) @@ -2357,11 +2343,6 @@ struct AnalysisAsymmetricPairing { fLUT = o2::base::MatLayerCylSet::rectifyPtrFromFile(fCCDB->get(fConfigLutPath)); VarManager::SetupMatLUTFwdDCAFitter(fLUT); - fHistMan = new HistogramManager("analysisHistos", "aa", VarManager::kNVars); - fHistMan->SetUseDefaultVariableNames(kTRUE); - fHistMan->SetDefaultVarNames(VarManager::fgVariableNames, VarManager::fgVariableUnits); - - DefineHistograms(fHistMan, histNames.Data(), fConfigHistogramSubgroups.value.data()); // define all histograms dqhistograms::AddHistogramsFromJSON(fHistMan, fConfigAddJSONHistograms.value.c_str()); // ad-hoc histograms via JSON VarManager::SetUseVars(fHistMan->GetUsedVars()); // provide the list of required variables so that VarManager knows what to fill fOutputList.setObject(fHistMan->GetMainHistogramList()); @@ -2420,8 +2401,6 @@ struct AnalysisAsymmetricPairing { } } - std::map> histNames = fTrackHistNames; - int sign1 = 0; int sign2 = 0; ditrackList.reserve(1); @@ -2511,41 +2490,41 @@ struct AnalysisAsymmetricPairing { if (twoTrackFilter & (static_cast(1) << icut)) { isAmbi = (twoTrackFilter & (static_cast(1) << 30)) || (twoTrackFilter & (static_cast(1) << 31)); if (sign1 * sign2 < 0) { - fHistMan->FillHistClass(histNames[icut][0].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPM_%s", fLegCutNames[icut].Data()), VarManager::fgValues); // reconstructed, unmatched if (isAmbi && fConfigAmbiguousHistograms.value) { - fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPM_ambiguous_%s", fLegCutNames[icut].Data()), VarManager::fgValues); } if (isReflected && fConfigReflectedHistograms.value) { - fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes * (1 + fConfigAmbiguousHistograms.value)].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPM_reflected_%s", fLegCutNames[icut].Data()), VarManager::fgValues); } } else if (fConfigSameSignHistograms.value) { if (sign1 > 0) { - fHistMan->FillHistClass(histNames[icut][1].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPP_%s", fLegCutNames[icut].Data()), VarManager::fgValues); if (isAmbi && fConfigAmbiguousHistograms.value) { - fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes + 1].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPP_ambiguous_%s", fLegCutNames[icut].Data()), VarManager::fgValues); } if (isReflected && fConfigReflectedHistograms.value) { - fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes * (1 + fConfigAmbiguousHistograms.value) + 1].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPP_reflected_%s", fLegCutNames[icut].Data()), VarManager::fgValues); } } else { - fHistMan->FillHistClass(histNames[icut][2].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEMM_%s", fLegCutNames[icut].Data()), VarManager::fgValues); if (isAmbi && fConfigAmbiguousHistograms.value) { - fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes + 2].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEMM_ambiguous_%s", fLegCutNames[icut].Data()), VarManager::fgValues); } if (isReflected && fConfigReflectedHistograms) { - fHistMan->FillHistClass(histNames[icut][fNPairHistPrefixes * (1 + fConfigAmbiguousHistograms.value) + 2].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEMM_reflected_%s", fLegCutNames[icut].Data()), VarManager::fgValues); } } } for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; iCommonCut++) { if (twoTrackCommonFilter & fCommonTrackCutFilterMasks[iCommonCut]) { if (sign1 * sign2 < 0) { - fHistMan->FillHistClass(histNames[fNLegCuts + icut * fNCommonTrackCuts + iCommonCut][0].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPM_%s_%s", fLegCutNames[icut].Data(), fCommonCutNames[iCommonCut].Data()), VarManager::fgValues); } else if (fConfigSameSignHistograms.value) { if (sign1 > 0) { - fHistMan->FillHistClass(histNames[fNLegCuts + icut * fNCommonTrackCuts + iCommonCut][1].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPP_%s_%s", fLegCutNames[icut].Data(), fCommonCutNames[iCommonCut].Data()), VarManager::fgValues); } else { - fHistMan->FillHistClass(histNames[fNLegCuts + icut * fNCommonTrackCuts + iCommonCut][2].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEMM_%s_%s", fLegCutNames[icut].Data(), fCommonCutNames[iCommonCut].Data()), VarManager::fgValues); } } } @@ -2557,24 +2536,24 @@ struct AnalysisAsymmetricPairing { pairFilter |= (static_cast(1) << iPairCut); // Histograms with pair cuts if (sign1 * sign2 < 0) { - fHistMan->FillHistClass(histNames[fNLegCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut][0].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPM_%s_%s", fLegCutNames[icut].Data(), fPairCutNames[iPairCut].Data()), VarManager::fgValues); } else if (fConfigSameSignHistograms.value) { if (sign1 > 0) { - fHistMan->FillHistClass(histNames[fNLegCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut][1].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPP_%s_%s", fLegCutNames[icut].Data(), fPairCutNames[iPairCut].Data()), VarManager::fgValues); } else { - fHistMan->FillHistClass(histNames[fNLegCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut][2].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEMM_%s_%s", fLegCutNames[icut].Data(), fPairCutNames[iPairCut].Data()), VarManager::fgValues); } } // Histograms with pair cuts and common track cuts for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { if (twoTrackCommonFilter & fCommonTrackCutFilterMasks[iCommonCut]) { if (sign1 * sign2 < 0) { - fHistMan->FillHistClass(histNames[(fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + (icut * fNPairCuts * fNCommonTrackCuts) + (iCommonCut * fNPairCuts) + iPairCut][0].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPM_%s_%s_%s", fLegCutNames[icut].Data(), fCommonCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data()), VarManager::fgValues); } else if (fConfigSameSignHistograms.value) { if (sign1 > 0) { - fHistMan->FillHistClass(histNames[(fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + (icut * fNPairCuts * fNCommonTrackCuts) + (iCommonCut * fNPairCuts) + iPairCut][1].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEPP_%s_%s_%s", fLegCutNames[icut].Data(), fCommonCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data()), VarManager::fgValues); } else { - fHistMan->FillHistClass(histNames[(fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + (icut * fNPairCuts * fNCommonTrackCuts) + (iCommonCut * fNPairCuts) + iPairCut][2].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("PairsBarrelSEMM_%s_%s_%s", fLegCutNames[icut].Data(), fCommonCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data()), VarManager::fgValues); } } } @@ -2603,8 +2582,6 @@ struct AnalysisAsymmetricPairing { } } - std::map> histNames = fTrackHistNames; - for (auto& event : events) { if (!event.isEventSelected_bit(0)) { continue; @@ -2629,12 +2606,12 @@ struct AnalysisAsymmetricPairing { // Based on triplet type, make suitable combinations of the partitions if (tripletType == VarManager::kTripleCandidateToPKPi) { for (auto& [a1, a2, a3] : combinations(soa::CombinationsFullIndexPolicy(groupedLegAAssocs, groupedLegBAssocs, groupedLegCAssocs))) { - readTriplet(a1, a2, a3, tracks, event, tripletType, histNames); + readTriplet(a1, a2, a3, tracks, event, tripletType); } } else if (tripletType == VarManager::kTripleCandidateToKPiPi) { for (auto& a1 : groupedLegAAssocs) { for (auto& [a2, a3] : combinations(groupedLegBAssocs, groupedLegCAssocs)) { - readTriplet(a1, a2, a3, tracks, event, tripletType, histNames); + readTriplet(a1, a2, a3, tracks, event, tripletType); } } } else { @@ -2645,7 +2622,7 @@ struct AnalysisAsymmetricPairing { // Helper function to process triplet template - void readTriplet(TTrackAssoc const& a1, TTrackAssoc const& a2, TTrackAssoc const& a3, TTracks const& /*tracks*/, TEvent const& event, VarManager::PairCandidateType tripletType, std::map> histNames) + void readTriplet(TTrackAssoc const& a1, TTrackAssoc const& a2, TTrackAssoc const& a3, TTracks const& /*tracks*/, TEvent const& event, VarManager::PairCandidateType tripletType) { uint32_t threeTrackFilter = static_cast(0); uint32_t threeTrackCommonFilter = static_cast(0); @@ -2717,13 +2694,13 @@ struct AnalysisAsymmetricPairing { // Fill histograms for (int icut = 0; icut < fNLegCuts; icut++) { if (threeTrackFilter & (static_cast(1) << icut)) { - fHistMan->FillHistClass(histNames[icut][0].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("TripletsBarrelSE_%s", fLegCutNames[icut].Data()), VarManager::fgValues); if (fConfigAmbiguousHistograms.value && ((threeTrackFilter & (static_cast(1) << 29)) || (threeTrackFilter & (static_cast(1) << 30)) || (threeTrackFilter & (static_cast(1) << 31)))) { - fHistMan->FillHistClass(histNames[icut][1].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("TripletsBarrelSE_ambiguous_%s", fLegCutNames[icut].Data()), VarManager::fgValues); } for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; iCommonCut++) { if (threeTrackCommonFilter & fCommonTrackCutFilterMasks[iCommonCut]) { - fHistMan->FillHistClass(histNames[fNLegCuts + icut * fNCommonTrackCuts + iCommonCut][0].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("TripletsBarrelSE_%s_%s", fLegCutNames[icut].Data(), fCommonCutNames[iCommonCut].Data()), VarManager::fgValues); } } // end loop (common cuts) int iPairCut = 0; @@ -2731,11 +2708,11 @@ struct AnalysisAsymmetricPairing { if (!((*cut)->IsSelected(VarManager::fgValues))) // apply pair cuts continue; // Histograms with pair cuts - fHistMan->FillHistClass(histNames[fNLegCuts * (fNCommonTrackCuts + 1) + icut * fNPairCuts + iPairCut][0].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("TripletsBarrelSE_%s_%s", fLegCutNames[icut].Data(), fPairCutNames[iPairCut].Data()), VarManager::fgValues); // Histograms with pair cuts and common track cuts for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { if (threeTrackCommonFilter & fCommonTrackCutFilterMasks[iCommonCut]) { - fHistMan->FillHistClass(histNames[(fNLegCuts * (fNCommonTrackCuts + 1) + fNLegCuts * fNPairCuts) + (icut * fNPairCuts * fNCommonTrackCuts) + (iCommonCut * fNPairCuts) + iPairCut][0].Data(), VarManager::fgValues); + fHistMan->FillHistClass(Form("TripletsBarrelSE_%s_%s_%s", fLegCutNames[icut].Data(), fCommonCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data()), VarManager::fgValues); } } } // end loop (pair cuts) @@ -2815,12 +2792,14 @@ struct AnalysisDileptonTrack { int fCurrentRun; // needed to detect if the run changed and trigger update of calibrations etc. int fNCuts; // number of dilepton leg cuts + int fNLegCuts; int fNPairCuts; // number of pair cuts int fNCommonTrackCuts; std::map fCommonTrackCutMap; uint32_t fTrackCutBitMap; // track cut bit mask to be used in the selection of tracks associated with dileptons // vector for single-lepton and track cut names for easy access when calling FillHistogramList() std::vector fTrackCutNames; + std::vector fLegCutNames; // vector for pair cut names, used mainly for pairs built via the asymmetric pairing task std::vector fPairCutNames; std::vector fCommonPairCutNames; @@ -2866,7 +2845,6 @@ struct AnalysisDileptonTrack { fHistMan = new HistogramManager("analysisHistos", "aa", VarManager::kNVars); fHistMan->SetUseDefaultVariableNames(true); fHistMan->SetDefaultVarNames(VarManager::fgVariableNames, VarManager::fgVariableUnits); - TString histNames = ""; // For each track/muon selection used to produce dileptons, create a separate histogram directory using the // name of the track/muon cut. @@ -2935,6 +2913,7 @@ struct AnalysisDileptonTrack { // but this is only used for histograms, not for the produced dilepton tables string cfgPairing_TrackCuts; string cfgPairing_PairCuts; + string cfgPairing_PairCutsJSON; string cfgPairing_CommonTrackCuts; if (isBarrel) { getTaskOptionValue(context, "analysis-same-event-pairing", "cfgTrackCuts", cfgPairing_TrackCuts, false); @@ -2949,7 +2928,7 @@ struct AnalysisDileptonTrack { } if (cfgPairing_TrackCuts.empty()) { - LOG(fatal) << "There are no dilepton cuts specified in the upstream in the same-event-pairing or assymmetric-pairing"; + LOG(fatal) << "There are no dilepton cuts specified in the upstream in the same-event-pairing or asymmetric-pairing"; } // If asymmetric pair is used, it may have common track cuts @@ -2967,6 +2946,18 @@ struct AnalysisDileptonTrack { } } // end if (common cuts) + // Get also the pair cuts specified via the JSON parameters + if (isBarrelAsymmetric) { + getTaskOptionValue(context, "analysis-asymmetric-pairing", "cfgPairCutsJSON", cfgPairing_PairCutsJSON, false); + TString addPairCutsStr = cfgPairing_PairCutsJSON; + if (addPairCutsStr != "") { + std::vector addPairCuts = dqcuts::GetCutsFromJSON(addPairCutsStr.Data()); + for (auto& t : addPairCuts) { + cfgPairing_PairCuts += Form(",%s", t->GetName()); + } + } + } + std::unique_ptr objArrayPairCuts(TString(cfgPairing_PairCuts).Tokenize(",")); fNPairCuts = objArrayPairCuts->GetEntries(); for (int j = 0; j < fNPairCuts; j++) { @@ -2975,16 +2966,30 @@ struct AnalysisDileptonTrack { // array of single lepton cuts specified in the same-analysis-pairing task std::unique_ptr cfgPairing_objArrayTrackCuts(TString(cfgPairing_TrackCuts).Tokenize(",")); + // If asymmetric pairs are used, the number of cuts should come from the asymmetric-pairing task + if (isBarrelAsymmetric) { + fNLegCuts = cfgPairing_objArrayTrackCuts->GetEntries(); + } else { + fNLegCuts = fNCuts; + } // loop over single lepton cuts - for (int icut = 0; icut < fNCuts; ++icut) { + for (int icut = 0; icut < fNLegCuts; ++icut) { + + TString pairLegCutName; // here we check that this cut is one of those used for building the dileptons - if (!cfgPairing_objArrayTrackCuts->FindObject(fTrackCutNames[icut].Data())) { - continue; + if (!isBarrelAsymmetric) { + if (!cfgPairing_objArrayTrackCuts->FindObject(fTrackCutNames[icut].Data())) { + continue; + } + pairLegCutName = fTrackCutNames[icut].Data(); + } else { + // For asymmetric pairs we access the leg cuts instead + pairLegCutName = static_cast(cfgPairing_objArrayTrackCuts->At(icut))->GetString(); } + fLegCutNames.push_back(pairLegCutName); - TString pairLegCutName = fTrackCutNames[icut].Data(); // define dilepton histograms DefineHistograms(fHistMan, Form("DileptonsSelected_%s", pairLegCutName.Data()), "barrel,vertexing"); // loop over track cuts and create dilepton - track histogram directories @@ -3000,22 +3005,22 @@ struct AnalysisDileptonTrack { if (!cfgPairing_strCommonTrackCuts.IsNull()) { std::unique_ptr objArrayCommon(cfgPairing_strCommonTrackCuts.Tokenize(",")); for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { - DefineHistograms(fHistMan, Form("DileptonTrack_%s_%s_%s", pairLegCutName.Data(), fCommonPairCutNames[iCommonCut].Data(), fTrackCutNames[iCutTrack].Data()), fConfigHistogramSubgroups.value.data()); DefineHistograms(fHistMan, Form("DileptonsSelected_%s_%s", pairLegCutName.Data(), fCommonPairCutNames[iCommonCut].Data()), "barrel,vertexing"); + DefineHistograms(fHistMan, Form("DileptonTrack_%s_%s_%s", pairLegCutName.Data(), fCommonPairCutNames[iCommonCut].Data(), fTrackCutNames[iCutTrack].Data()), fConfigHistogramSubgroups.value.data()); } } if (fNPairCuts != 0) { for (int iPairCut = 0; iPairCut < fNPairCuts; ++iPairCut) { - DefineHistograms(fHistMan, Form("DileptonTrack_%s_%s_%s", pairLegCutName.Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iCutTrack].Data()), fConfigHistogramSubgroups.value.data()); DefineHistograms(fHistMan, Form("DileptonsSelected_%s_%s", pairLegCutName.Data(), fPairCutNames[iPairCut].Data()), "barrel,vertexing"); + DefineHistograms(fHistMan, Form("DileptonTrack_%s_%s_%s", pairLegCutName.Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iCutTrack].Data()), fConfigHistogramSubgroups.value.data()); if (!cfgPairing_strCommonTrackCuts.IsNull()) { std::unique_ptr objArrayCommon(cfgPairing_strCommonTrackCuts.Tokenize(",")); for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; ++iCommonCut) { - DefineHistograms(fHistMan, Form("DileptonTrack_%s_%s_%s_%s", pairLegCutName.Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iCutTrack].Data()), fConfigHistogramSubgroups.value.data()); DefineHistograms(fHistMan, Form("DileptonsSelected_%s_%s_%s", pairLegCutName.Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data()), "barrel,vertexing"); + DefineHistograms(fHistMan, Form("DileptonTrack_%s_%s_%s_%s", pairLegCutName.Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iCutTrack].Data()), fConfigHistogramSubgroups.value.data()); } } } @@ -3079,28 +3084,28 @@ struct AnalysisDileptonTrack { VarManager::FillTrack(dilepton, fValuesDilepton); // loop over existing dilepton leg cuts (e.g. electron1, electron2, etc) - for (int icut = 0; icut < fNCuts; icut++) { + for (int icut = 0; icut < fNLegCuts; icut++) { if (!dilepton.filterMap_bit(icut)) { continue; } // regular dileptons - fHistMan->FillHistClass(Form("DileptonsSelected_%s", fTrackCutNames[icut].Data()), fValuesDilepton); + fHistMan->FillHistClass(Form("DileptonsSelected_%s", fLegCutNames[icut].Data()), fValuesDilepton); // other pairs, e.g.: D0s if constexpr (TCandidateType == VarManager::kDstarToD0KPiPi) { // Dielectrons and Dimuons don't have the PairFilterMap column for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; iCommonCut++) { if (dilepton.commonFilterMap_bit(fCommonTrackCutMap[iCommonCut])) { - fHistMan->FillHistClass(Form("DileptonsSelected_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data()), fValuesDilepton); + fHistMan->FillHistClass(Form("DileptonsSelected_%s_%s", fLegCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data()), fValuesDilepton); } } for (int iPairCut = 0; iPairCut < fNPairCuts; iPairCut++) { if (dilepton.pairFilterMap_bit(iPairCut)) { - fHistMan->FillHistClass(Form("DileptonsSelected_%s_%s", fTrackCutNames[icut].Data(), fPairCutNames[icut].Data()), fValuesDilepton); + fHistMan->FillHistClass(Form("DileptonsSelected_%s_%s", fLegCutNames[icut].Data(), fPairCutNames[icut].Data()), fValuesDilepton); for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; iCommonCut++) { if (dilepton.commonFilterMap_bit(fCommonTrackCutMap[iCommonCut])) { - fHistMan->FillHistClass(Form("DileptonsSelected_%s_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[icut].Data()), fValuesDilepton); + fHistMan->FillHistClass(Form("DileptonsSelected_%s_%s_%s", fLegCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[icut].Data()), fValuesDilepton); } } } @@ -3161,7 +3166,7 @@ struct AnalysisDileptonTrack { // Fill histograms for the triplets // loop over dilepton / ditrack cuts - for (int icut = 0; icut < fNCuts; icut++) { + for (int icut = 0; icut < fNLegCuts; icut++) { if (!dilepton.filterMap_bit(icut)) { continue; @@ -3173,20 +3178,20 @@ struct AnalysisDileptonTrack { if (!(trackSelection & (static_cast(1) << iTrackCut))) { continue; } - fHistMan->FillHistClass(Form("DileptonTrack_%s_%s", fTrackCutNames[icut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); + fHistMan->FillHistClass(Form("DileptonTrack_%s_%s", fLegCutNames[icut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); if constexpr (TCandidateType == VarManager::kDstarToD0KPiPi) { // Dielectrons and Dimuons don't have the PairFilterMap column for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; iCommonCut++) { if (dilepton.commonFilterMap_bit(fCommonTrackCutMap[iCommonCut])) { - fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); + fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s", fLegCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); } } for (int iPairCut = 0; iPairCut < fNPairCuts; iPairCut++) { if (dilepton.pairFilterMap_bit(iPairCut)) { - fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s", fTrackCutNames[icut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); + fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s", fLegCutNames[icut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); for (int iCommonCut = 0; iCommonCut < fNCommonTrackCuts; iCommonCut++) { if (dilepton.commonFilterMap_bit(fCommonTrackCutMap[iCommonCut])) { - fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s_%s", fTrackCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); + fHistMan->FillHistClass(Form("DileptonTrack_%s_%s_%s_%s", fLegCutNames[icut].Data(), fCommonPairCutNames[iCommonCut].Data(), fPairCutNames[iPairCut].Data(), fTrackCutNames[iTrackCut].Data()), fValuesHadron); } } } From a8e7d8de679f3cdd774a1689cc71db3fabbd9f77 Mon Sep 17 00:00:00 2001 From: Deependra Sharma <38365215+deependra170598@users.noreply.github.com> Date: Tue, 13 May 2025 11:29:13 +0530 Subject: [PATCH 1253/1650] [PWGHF/D2H] Fixing bug due wrong Track table type subscribed in process function (#11171) --- PWGHF/TableProducer/candidateCreatorDstar.cxx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/PWGHF/TableProducer/candidateCreatorDstar.cxx b/PWGHF/TableProducer/candidateCreatorDstar.cxx index 8e2cca50cd5..146c0b94ee7 100644 --- a/PWGHF/TableProducer/candidateCreatorDstar.cxx +++ b/PWGHF/TableProducer/candidateCreatorDstar.cxx @@ -186,7 +186,7 @@ struct HfCandidateCreatorDstar { void runCreatorDstar(Coll const&, CandsDstar const& rowsTrackIndexDstar, aod::Hf2Prongs const&, - aod::TracksWCov const&, + TracksWCovExtraPidPiKa const&, aod::BCsWithTimestamps const& /*bcWithTimeStamps*/) { // LOG(info) << "runCreatorDstar function called"; @@ -386,7 +386,7 @@ struct HfCandidateCreatorDstar { void processPvRefit(soa::Join const& collisions, aod::Hf2Prongs const& rowsTrackIndexD0, aod::HfDstarsWithPvRefitInfo const& rowsTrackIndexDstar, - aod::TracksWCov const& tracks, + TracksWCovExtraPidPiKa const& tracks, aod::BCsWithTimestamps const& bcWithTimeStamps) { runCreatorDstar(collisions, rowsTrackIndexDstar, rowsTrackIndexD0, tracks, bcWithTimeStamps); @@ -397,7 +397,7 @@ struct HfCandidateCreatorDstar { void processNoPvRefit(soa::Join const& collisions, aod::Hf2Prongs const& rowsTrackIndexD0, aod::HfDstars const& rowsTrackIndexDstar, - aod::TracksWCov const& tracks, + TracksWCovExtraPidPiKa const& tracks, aod::BCsWithTimestamps const& bcWithTimeStamps) { runCreatorDstar(collisions, rowsTrackIndexDstar, rowsTrackIndexD0, tracks, bcWithTimeStamps); @@ -414,7 +414,7 @@ struct HfCandidateCreatorDstar { void processPvRefitCentFT0C(soa::Join const& collisions, aod::Hf2Prongs const& rowsTrackIndexD0, aod::HfDstarsWithPvRefitInfo const& rowsTrackIndexDstar, - aod::TracksWCov const& tracks, + TracksWCovExtraPidPiKa const& tracks, aod::BCsWithTimestamps const& bcWithTimeStamps) { runCreatorDstar(collisions, rowsTrackIndexDstar, rowsTrackIndexD0, tracks, bcWithTimeStamps); @@ -425,7 +425,7 @@ struct HfCandidateCreatorDstar { void processNoPvRefitCentFT0C(soa::Join const& collisions, aod::Hf2Prongs const& rowsTrackIndexD0, aod::HfDstars const& rowsTrackIndexDstar, - aod::TracksWCov const& tracks, + TracksWCovExtraPidPiKa const& tracks, aod::BCsWithTimestamps const& bcWithTimeStamps) { runCreatorDstar(collisions, rowsTrackIndexDstar, rowsTrackIndexD0, tracks, bcWithTimeStamps); @@ -442,7 +442,7 @@ struct HfCandidateCreatorDstar { void processPvRefitCentFT0M(soa::Join const& collisions, aod::Hf2Prongs const& rowsTrackIndexD0, aod::HfDstarsWithPvRefitInfo const& rowsTrackIndexDstar, - aod::TracksWCov const& tracks, + TracksWCovExtraPidPiKa const& tracks, aod::BCsWithTimestamps const& bcWithTimeStamps) { runCreatorDstar(collisions, rowsTrackIndexDstar, rowsTrackIndexD0, tracks, bcWithTimeStamps); @@ -453,7 +453,7 @@ struct HfCandidateCreatorDstar { void processNoPvRefitCentFT0M(soa::Join const& collisions, aod::Hf2Prongs const& rowsTrackIndexD0, aod::HfDstars const& rowsTrackIndexDstar, - aod::TracksWCov const& tracks, + TracksWCovExtraPidPiKa const& tracks, aod::BCsWithTimestamps const& bcWithTimeStamps) { runCreatorDstar(collisions, rowsTrackIndexDstar, rowsTrackIndexD0, tracks, bcWithTimeStamps); From 40a320bdce3a494bb3dc8dbbdee51ca47249a8bb Mon Sep 17 00:00:00 2001 From: Victor Gonzalez Date: Tue, 13 May 2025 09:41:27 +0200 Subject: [PATCH 1254/1650] [PWGHF,Tutorial] Evolution with O2Physics (#11165) Co-authored-by: Victor --- Tutorials/PWGHF/dpl-config_skim.json | 5 ++++- Tutorials/PWGHF/dpl-config_task.json | 7 +++++-- Tutorials/PWGHF/run_skim.sh | 2 +- Tutorials/PWGHF/run_task.sh | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Tutorials/PWGHF/dpl-config_skim.json b/Tutorials/PWGHF/dpl-config_skim.json index 3d78778042e..118a3481248 100644 --- a/Tutorials/PWGHF/dpl-config_skim.json +++ b/Tutorials/PWGHF/dpl-config_skim.json @@ -20,7 +20,10 @@ "ccdb-url": "http://alice-ccdb.cern.ch", "isRun2MC": "-1" }, - "tracks-extra-converter": "", + "tracks-extra-v002-converter": { + "processV000ToV002": "true", + "processV001ToV002": "false" + }, "tracks-extra-spawner": "", "track-propagation": { "ccdb-url": "http://alice-ccdb.cern.ch", diff --git a/Tutorials/PWGHF/dpl-config_task.json b/Tutorials/PWGHF/dpl-config_task.json index 4e07d936675..8da330be6d3 100644 --- a/Tutorials/PWGHF/dpl-config_task.json +++ b/Tutorials/PWGHF/dpl-config_task.json @@ -21,7 +21,10 @@ "ccdb-url": "http://alice-ccdb.cern.ch", "isRun2MC": "-1" }, - "tracks-extra-converter": "", + "tracks-extra-v002-converter": { + "processV000ToV002": "true", + "processV001ToV002": "false" + }, "bc-selection-task": { "triggerBcShift": "0", "ITSROFrameStartBorderMargin": "-1", @@ -42,7 +45,7 @@ "minPropagationDistance": "5", "useTrackTuner": "true", "fillTrackTunerTable": "false", - "trackTunerParams": "debugInfo=0|updateTrackDCAs=1|updateTrackCovMat=1|updateCurvature=0|updateCurvatureIU=1|updatePulls=1|isInputFileFromCCDB=1|pathInputFile=Users/m/mfaggin/test/inputsTrackTuner/pp2023/smoothHighPtMC|nameInputFile=trackTuner_DataLHC23fPass1_McLHC23k4b_run535085.root|pathFileQoverPt=Users/h/hsharma/qOverPtGraphs|nameFileQoverPt=D0sigma_Data_removal_itstps_MC_LHC22b1b.root|usePvRefitCorrections=0|qOverPtMC=1|qOverPtData=2", + "trackTunerParams": "debugInfo=0|updateTrackDCAs=1|updateTrackCovMat=1|updateCurvature=0|updateCurvatureIU=1|updatePulls=1|isInputFileFromCCDB=1|pathInputFile=Users/m/mfaggin/test/inputsTrackTuner/pp2023/smoothHighPtMC|nameInputFile=trackTuner_DataLHC23fPass1_McLHC23k4b_run535085.root|pathFileQoverPt=Users/h/hsharma/qOverPtGraphs|nameFileQoverPt=D0sigma_Data_removal_itstps_MC_LHC22b1b.root|usePvRefitCorrections=0|qOverPtMC=1|qOverPtData=2|nPhiBins=0", "axisPtQA": { "values": [ "0", diff --git a/Tutorials/PWGHF/run_skim.sh b/Tutorials/PWGHF/run_skim.sh index 6adefe69b01..3a5b9a6d2e0 100644 --- a/Tutorials/PWGHF/run_skim.sh +++ b/Tutorials/PWGHF/run_skim.sh @@ -44,7 +44,7 @@ o2-analysis-timestamp "${OPTIONS[@]}" | \ o2-analysis-trackselection "${OPTIONS[@]}" | \ o2-analysis-track-propagation "${OPTIONS[@]}" | \ o2-analysis-bc-converter "${OPTIONS[@]}" | \ -o2-analysis-tracks-extra-converter "${OPTIONS[@]}" \ +o2-analysis-tracks-extra-v002-converter "${OPTIONS[@]}" \ > "$LOGFILE" 2>&1 # report status diff --git a/Tutorials/PWGHF/run_task.sh b/Tutorials/PWGHF/run_task.sh index de4096c2b85..1da3b524766 100644 --- a/Tutorials/PWGHF/run_task.sh +++ b/Tutorials/PWGHF/run_task.sh @@ -50,7 +50,7 @@ o2-analysis-pid-tof-base "${OPTIONS[@]}" | \ o2-analysis-pid-tof-full "${OPTIONS[@]}" | \ o2-analysis-ft0-corrected-table "${OPTIONS[@]}" | \ o2-analysis-bc-converter "${OPTIONS[@]}" | \ -o2-analysis-tracks-extra-converter "${OPTIONS[@]}" | \ +o2-analysis-tracks-extra-v002-converter "${OPTIONS[@]}" | \ o2-analysis-zdc-converter "${OPTIONS[@]}" \ > "$LOGFILE" 2>&1 From 1c7899c523b8a5d774ec3684e2b42778db842c04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Tue, 13 May 2025 12:20:19 +0200 Subject: [PATCH 1255/1650] [ALICE3] A3TOF: Fix outer time deltas (#11172) --- ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx b/ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx index 7b515edd08a..dada9758bea 100644 --- a/ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx +++ b/ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx @@ -645,7 +645,7 @@ struct OnTheFlyTofPid { expectedTimeOuterTOF[ii] = trackLengthOuterTOF / v; deltaTimeInnerTOF[ii] = measuredTimeInnerTOF - expectedTimeInnerTOF[ii]; - deltaTimeOuterTOF[ii] = measuredTimeOuterTOF - expectedTimeInnerTOF[ii]; + deltaTimeOuterTOF[ii] = measuredTimeOuterTOF - expectedTimeOuterTOF[ii]; // Evaluate total sigma (layer + tracking resolution) float innerTotalTimeReso = simConfig.innerTOFTimeReso; From b1618a51f2bcbcaf6958efd70da5cc187d7d916e Mon Sep 17 00:00:00 2001 From: Mattia Faggin Date: Tue, 13 May 2025 13:41:35 +0200 Subject: [PATCH 1256/1650] [PWGHF] Fix data type for D+ and Ds tables. (#11162) Co-authored-by: Mattia Faggin --- .../converterReducedHadronDausPid.cxx | 2 +- .../dataCreatorCharmHadPiReduced.cxx | 29 +++++++++++++------ PWGHF/D2H/Tasks/taskXic.cxx | 10 +++---- .../DataModel/CandidateReconstructionTables.h | 3 +- .../HFC/TableProducer/femtoDreamProducer.cxx | 4 +-- .../candidateSelectorDplusToPiKPi.cxx | 2 +- .../candidateSelectorDsToKKPi.cxx | 2 +- PWGHF/TableProducer/candidateSelectorLc.cxx | 8 ++--- .../candidateSelectorLcPidMl.cxx | 2 +- .../candidateSelectorXicToPKPi.cxx | 2 +- .../derivedDataCreatorDplusToPiKPi.cxx | 8 ++--- .../derivedDataCreatorLcToPKPi.cxx | 8 ++--- .../TableProducer/treeCreatorDplusToPiKPi.cxx | 8 ++--- PWGHF/TableProducer/treeCreatorDsToKKPi.cxx | 4 +-- PWGHF/TableProducer/treeCreatorLbToLcPi.cxx | 4 +-- PWGHF/TableProducer/treeCreatorLcToPKPi.cxx | 18 ++++++------ PWGHF/TableProducer/treeCreatorXicToPKPi.cxx | 4 +-- 17 files changed, 65 insertions(+), 53 deletions(-) diff --git a/PWGHF/D2H/TableProducer/converterReducedHadronDausPid.cxx b/PWGHF/D2H/TableProducer/converterReducedHadronDausPid.cxx index 219c9a5d6e9..2d4036247f5 100644 --- a/PWGHF/D2H/TableProducer/converterReducedHadronDausPid.cxx +++ b/PWGHF/D2H/TableProducer/converterReducedHadronDausPid.cxx @@ -30,7 +30,7 @@ struct HfConverterReducedHadronDausPid { Produces hfRedPidDau2s; using HfRedPidDaus2Prong = soa::Join; - using HfRedPidDaus3Prong = soa::Join; + using HfRedPidDaus3Prong = soa::Join; void process2Prongs(HfRedPidDaus2Prong::iterator const& hfCandPidProngs) { diff --git a/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx b/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx index 2b8fe679e1d..6565d6e7a4e 100644 --- a/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx +++ b/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx @@ -182,14 +182,14 @@ struct HfDataCreatorCharmHadPiReduced { using TracksPidWithSel = soa::Join; using TracksPidWithSelAndMc = soa::Join; - using CandsDplusFiltered = soa::Filtered>; - using CandsDplusFilteredWithMl = soa::Filtered>; - using CandsDsFiltered = soa::Filtered>; - using CandsDsFilteredWithMl = soa::Filtered>; + using CandsDplusFiltered = soa::Filtered>; + using CandsDplusFilteredWithMl = soa::Filtered>; + using CandsDsFiltered = soa::Filtered>; + using CandsDsFilteredWithMl = soa::Filtered>; using CandsD0Filtered = soa::Filtered>; using CandsD0FilteredWithMl = soa::Filtered>; - using CandsLcFiltered = soa::Filtered>; - using CandsLcFilteredWithMl = soa::Filtered>; + using CandsLcFiltered = soa::Filtered>; + using CandsLcFilteredWithMl = soa::Filtered>; using CollisionsWCent = soa::Join; using CollisionsWCentAndMcLabels = soa::Join; @@ -1137,9 +1137,20 @@ struct HfDataCreatorCharmHadPiReduced { trackParCovCharmHad.getSigmaTglSnp(), trackParCovCharmHad.getSigmaTgl2(), trackParCovCharmHad.getSigma1PtY(), trackParCovCharmHad.getSigma1PtZ(), trackParCovCharmHad.getSigma1PtSnp(), trackParCovCharmHad.getSigma1PtTgl(), trackParCovCharmHad.getSigma1Pt2()); - hfCandPidProng0(candC.nSigTpcPi0(), candC.nSigTofPi0(), candC.nSigTpcKa0(), candC.nSigTofKa0(), candC.nSigTpcPr0(), candC.nSigTofPr0(), charmHadDauTracks[0].hasTOF(), charmHadDauTracks[0].hasTPC()); - hfCandPidProng1(candC.nSigTpcPi1(), candC.nSigTofPi1(), candC.nSigTpcKa1(), candC.nSigTofKa1(), candC.nSigTpcPr1(), candC.nSigTofPr1(), charmHadDauTracks[1].hasTOF(), charmHadDauTracks[1].hasTPC()); - hfCandPidProng2(candC.nSigTpcPi2(), candC.nSigTofPi2(), candC.nSigTpcKa2(), candC.nSigTofKa2(), candC.nSigTpcPr2(), candC.nSigTofPr2(), charmHadDauTracks[2].hasTOF(), charmHadDauTracks[2].hasTPC()); + float nSigmaTpcPr0{-999.f}, nSigmaTpcPr1{-999.f}, nSigmaTpcPr2{-999.f}; + float nSigmaTofPr0{-999.f}, nSigmaTofPr1{-999.f}, nSigmaTofPr2{-999.f}; + if constexpr (decChannel == DecayChannel::LbToLcplusPi) { + /// assign non-dummy values only for Lb->LcPi analysis + nSigmaTpcPr0 = candC.nSigTpcPr0(); + nSigmaTpcPr1 = candC.nSigTpcPr1(); + nSigmaTpcPr2 = candC.nSigTpcPr2(); + nSigmaTofPr0 = candC.nSigTofPr0(); + nSigmaTofPr1 = candC.nSigTofPr1(); + nSigmaTofPr2 = candC.nSigTofPr2(); + } + hfCandPidProng0(candC.nSigTpcPi0(), candC.nSigTofPi0(), candC.nSigTpcKa0(), candC.nSigTofKa0(), nSigmaTpcPr0, nSigmaTofPr0, charmHadDauTracks[0].hasTOF(), charmHadDauTracks[0].hasTPC()); + hfCandPidProng1(candC.nSigTpcPi1(), candC.nSigTofPi1(), candC.nSigTpcKa1(), candC.nSigTofKa1(), nSigmaTpcPr1, nSigmaTofPr1, charmHadDauTracks[1].hasTOF(), charmHadDauTracks[1].hasTPC()); + hfCandPidProng2(candC.nSigTpcPi2(), candC.nSigTofPi2(), candC.nSigTpcKa2(), candC.nSigTofKa2(), nSigmaTpcPr2, nSigmaTofPr2, charmHadDauTracks[2].hasTOF(), charmHadDauTracks[2].hasTPC()); if constexpr (withMl) { std::array mlScores = {-1.f, -1.f, -1.f, -1.f, -1.f, -1.f}; if constexpr (decChannel == DecayChannel::B0ToDminusPi) { diff --git a/PWGHF/D2H/Tasks/taskXic.cxx b/PWGHF/D2H/Tasks/taskXic.cxx index 24c3e1b3814..00b513cd1a4 100644 --- a/PWGHF/D2H/Tasks/taskXic.cxx +++ b/PWGHF/D2H/Tasks/taskXic.cxx @@ -71,7 +71,7 @@ struct HfTaskXic { Filter filterSelectCandidates = (aod::hf_sel_candidate_xic::isSelXicToPKPi >= selectionFlagXic || aod::hf_sel_candidate_xic::isSelXicToPiKP >= selectionFlagXic); - Partition> selectedMCXicCandidates = (aod::hf_sel_candidate_xic::isSelXicToPKPi >= selectionFlagXic || aod::hf_sel_candidate_xic::isSelXicToPiKP >= selectionFlagXic); + Partition> selectedMCXicCandidates = (aod::hf_sel_candidate_xic::isSelXicToPKPi >= selectionFlagXic || aod::hf_sel_candidate_xic::isSelXicToPiKP >= selectionFlagXic); HistogramRegistry registry{ "registry", // histo not in pt bins @@ -387,7 +387,7 @@ struct HfTaskXic { } // end process data void processDataStd(aod::Collision const& collision, - soa::Filtered> const& candidates, + soa::Filtered> const& candidates, TracksWPid const& tracks) { analysisData(collision, candidates, tracks); @@ -395,7 +395,7 @@ struct HfTaskXic { PROCESS_SWITCH(HfTaskXic, processDataStd, "Process Data with the standard method", true); void processDataWithMl(aod::Collision const& collision, - soa::Filtered> const& candidatesMl, TracksWPid const& tracks) + soa::Filtered> const& candidatesMl, TracksWPid const& tracks) { analysisData(collision, candidatesMl, tracks); } @@ -600,7 +600,7 @@ struct HfTaskXic { } } } - void processMcStd(soa::Filtered> const& selectedCandidatesMc, + void processMcStd(soa::Filtered> const& selectedCandidatesMc, soa::Join const& mcParticles, aod::TracksWMc const& tracksWithMc) { @@ -608,7 +608,7 @@ struct HfTaskXic { } PROCESS_SWITCH(HfTaskXic, processMcStd, "Process MC with the standard method", false); - void processMcWithMl(soa::Filtered> const& selectedCandidatesMlMc, + void processMcWithMl(soa::Filtered> const& selectedCandidatesMlMc, soa::Join const& mcParticles, aod::TracksWMc const& tracksWithMc) { diff --git a/PWGHF/DataModel/CandidateReconstructionTables.h b/PWGHF/DataModel/CandidateReconstructionTables.h index 7d6bb82e4c8..21ea5e23199 100644 --- a/PWGHF/DataModel/CandidateReconstructionTables.h +++ b/PWGHF/DataModel/CandidateReconstructionTables.h @@ -1042,7 +1042,8 @@ DECLARE_SOA_EXTENDED_TABLE_USER(HfCand3ProngExt, HfCand3ProngBase, "HFCAND3PEXT" hf_cand_3prong::Px, hf_cand_3prong::Py, hf_cand_3prong::Pz); using HfCand3Prong = HfCand3ProngExt; -using HfCand3ProngWPid = soa::Join; +using HfCand3ProngWPidPiKaPr = soa::Join; +using HfCand3ProngWPidPiKa = soa::Join; DECLARE_SOA_TABLE(HfCand3ProngKF, "AOD", "HFCAND3PKF", hf_cand_3prong::KfXError, hf_cand_3prong::KfYError, hf_cand_3prong::KfZError, diff --git a/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx b/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx index 19a408d7803..f74e6772159 100644 --- a/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx +++ b/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx @@ -148,8 +148,8 @@ struct HfFemtoDreamProducer { float magField; int runNumber; - using CandidateLc = soa::Join; - using CandidateLcMc = soa::Join; + using CandidateLc = soa::Join; + using CandidateLcMc = soa::Join; using FemtoFullCollision = soa::Join::iterator; using FemtoFullCollisionMc = soa::Join::iterator; diff --git a/PWGHF/TableProducer/candidateSelectorDplusToPiKPi.cxx b/PWGHF/TableProducer/candidateSelectorDplusToPiKPi.cxx index 890122c8b77..3efd7990991 100644 --- a/PWGHF/TableProducer/candidateSelectorDplusToPiKPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorDplusToPiKPi.cxx @@ -217,7 +217,7 @@ struct HfCandidateSelectorDplusToPiKPi { return true; } - void process(aod::HfCand3ProngWPid const& candidates, + void process(aod::HfCand3ProngWPidPiKa const& candidates, TracksSel const&) { // looping over 3-prong candidates diff --git a/PWGHF/TableProducer/candidateSelectorDsToKKPi.cxx b/PWGHF/TableProducer/candidateSelectorDsToKKPi.cxx index c6e552b7ab3..b1aad60b510 100644 --- a/PWGHF/TableProducer/candidateSelectorDsToKKPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorDsToKKPi.cxx @@ -251,7 +251,7 @@ struct HfCandidateSelectorDsToKKPi { return true; } - void process(aod::HfCand3ProngWPid const& candidates, + void process(aod::HfCand3ProngWPidPiKa const& candidates, TracksSel const&) { // looping over 3-prong candidates diff --git a/PWGHF/TableProducer/candidateSelectorLc.cxx b/PWGHF/TableProducer/candidateSelectorLc.cxx index b06db12e2ec..93b84c79522 100644 --- a/PWGHF/TableProducer/candidateSelectorLc.cxx +++ b/PWGHF/TableProducer/candidateSelectorLc.cxx @@ -588,7 +588,7 @@ struct HfCandidateSelectorLc { /// \brief process function w/o Bayes PID with DCAFitterN /// \param candidates Lc candidate table /// \param tracks track table - void processNoBayesPidWithDCAFitterN(aod::HfCand3ProngWPid const& candidates, + void processNoBayesPidWithDCAFitterN(aod::HfCand3ProngWPidPiKaPr const& candidates, TracksSel const& tracks) { runSelectLc(candidates, tracks); @@ -598,7 +598,7 @@ struct HfCandidateSelectorLc { /// \brief process function with Bayes PID with DCAFitterN /// \param candidates Lc candidate table /// \param tracks track table with Bayes PID information - void processBayesPidWithDCAFitterN(aod::HfCand3ProngWPid const& candidates, + void processBayesPidWithDCAFitterN(aod::HfCand3ProngWPidPiKaPr const& candidates, TracksSelBayesPid const& tracks) { runSelectLc(candidates, tracks); @@ -608,7 +608,7 @@ struct HfCandidateSelectorLc { /// \brief process function w/o Bayes PID with KFParticle /// \param candidates Lc candidate table /// \param tracks track table - void processNoBayesPidWithKFParticle(soa::Join const& candidates, + void processNoBayesPidWithKFParticle(soa::Join const& candidates, TracksSel const& tracks) { runSelectLc(candidates, tracks); @@ -618,7 +618,7 @@ struct HfCandidateSelectorLc { /// \brief process function with Bayes PID with KFParticle /// \param candidates Lc candidate table /// \param tracks track table with Bayes PID information - void processBayesPidWithKFParticle(soa::Join const& candidates, + void processBayesPidWithKFParticle(soa::Join const& candidates, TracksSelBayesPid const& tracks) { runSelectLc(candidates, tracks); diff --git a/PWGHF/TableProducer/candidateSelectorLcPidMl.cxx b/PWGHF/TableProducer/candidateSelectorLcPidMl.cxx index 45e91a39dbb..9f74fd9c583 100644 --- a/PWGHF/TableProducer/candidateSelectorLcPidMl.cxx +++ b/PWGHF/TableProducer/candidateSelectorLcPidMl.cxx @@ -149,7 +149,7 @@ struct HfCandidateSelectorLcPidMl { } } - void process(aod::HfCand3ProngWPid const& candidates, + void process(aod::HfCand3ProngWPidPiKaPr const& candidates, TracksSel const&) { // looping over 3-prong candidates diff --git a/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx b/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx index 4436a0834c2..c986f9d1423 100644 --- a/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorXicToPKPi.cxx @@ -222,7 +222,7 @@ struct HfCandidateSelectorXicToPKPi { return true; } - void process(aod::HfCand3ProngWPid const& candidates, + void process(aod::HfCand3ProngWPidPiKaPr const& candidates, TracksSel const&) { // looping over 3-prong candidates diff --git a/PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx b/PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx index b9a4d357685..c5c26270b79 100644 --- a/PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx +++ b/PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx @@ -79,10 +79,10 @@ struct HfDerivedDataCreatorDplusToPiKPi { using CollisionsWCentMult = soa::Join; using CollisionsWMcCentMult = soa::Join; using TracksWPid = soa::Join; - using SelectedCandidates = soa::Filtered>; - using SelectedCandidatesMc = soa::Filtered>; - using SelectedCandidatesMl = soa::Filtered>; - using SelectedCandidatesMcMl = soa::Filtered>; + using SelectedCandidates = soa::Filtered>; + using SelectedCandidatesMc = soa::Filtered>; + using SelectedCandidatesMl = soa::Filtered>; + using SelectedCandidatesMcMl = soa::Filtered>; using MatchedGenCandidatesMc = soa::Filtered>; using TypeMcCollisions = soa::Join; diff --git a/PWGHF/TableProducer/derivedDataCreatorLcToPKPi.cxx b/PWGHF/TableProducer/derivedDataCreatorLcToPKPi.cxx index 28b2b276b48..7078087a222 100644 --- a/PWGHF/TableProducer/derivedDataCreatorLcToPKPi.cxx +++ b/PWGHF/TableProducer/derivedDataCreatorLcToPKPi.cxx @@ -79,10 +79,10 @@ struct HfDerivedDataCreatorLcToPKPi { using CollisionsWCentMult = soa::Join; using CollisionsWMcCentMult = soa::Join; using TracksWPid = soa::Join; - using SelectedCandidates = soa::Filtered>; - using SelectedCandidatesMc = soa::Filtered>; - using SelectedCandidatesMl = soa::Filtered>; - using SelectedCandidatesMcMl = soa::Filtered>; + using SelectedCandidates = soa::Filtered>; + using SelectedCandidatesMc = soa::Filtered>; + using SelectedCandidatesMl = soa::Filtered>; + using SelectedCandidatesMcMl = soa::Filtered>; using MatchedGenCandidatesMc = soa::Filtered>; using TypeMcCollisions = soa::Join; diff --git a/PWGHF/TableProducer/treeCreatorDplusToPiKPi.cxx b/PWGHF/TableProducer/treeCreatorDplusToPiKPi.cxx index ed3957f8e01..7e482985c0d 100644 --- a/PWGHF/TableProducer/treeCreatorDplusToPiKPi.cxx +++ b/PWGHF/TableProducer/treeCreatorDplusToPiKPi.cxx @@ -260,9 +260,9 @@ struct HfTreeCreatorDplusToPiKPi { HfHelper hfHelper; - using SelectedCandidatesMc = soa::Filtered>; + using SelectedCandidatesMc = soa::Filtered>; using MatchedGenCandidatesMc = soa::Filtered>; - using SelectedCandidatesMcWithMl = soa::Filtered>; + using SelectedCandidatesMcWithMl = soa::Filtered>; using TracksWPid = soa::Join; using CollisionsCent = soa::Join; @@ -452,7 +452,7 @@ struct HfTreeCreatorDplusToPiKPi { } void processData(aod::Collisions const& collisions, - soa::Filtered> const& candidates, + soa::Filtered> const& candidates, TracksWPid const&) { // Filling event properties @@ -481,7 +481,7 @@ struct HfTreeCreatorDplusToPiKPi { PROCESS_SWITCH(HfTreeCreatorDplusToPiKPi, processData, "Process data", true); void processDataWCent(CollisionsCent const& collisions, - soa::Filtered> const& candidates, + soa::Filtered> const& candidates, TracksWPid const&) { // Filling event properties diff --git a/PWGHF/TableProducer/treeCreatorDsToKKPi.cxx b/PWGHF/TableProducer/treeCreatorDsToKKPi.cxx index 916063dbfd3..e83bf6f75a0 100644 --- a/PWGHF/TableProducer/treeCreatorDsToKKPi.cxx +++ b/PWGHF/TableProducer/treeCreatorDsToKKPi.cxx @@ -248,8 +248,8 @@ struct HfTreeCreatorDsToKKPi { HfHelper hfHelper; - using CandDsData = soa::Filtered>; - using CandDsMcReco = soa::Filtered>; + using CandDsData = soa::Filtered>; + using CandDsMcReco = soa::Filtered>; using CandDsMcGen = soa::Filtered>; using TracksWPid = soa::Join; diff --git a/PWGHF/TableProducer/treeCreatorLbToLcPi.cxx b/PWGHF/TableProducer/treeCreatorLbToLcPi.cxx index f256125e990..38a68453415 100644 --- a/PWGHF/TableProducer/treeCreatorLbToLcPi.cxx +++ b/PWGHF/TableProducer/treeCreatorLbToLcPi.cxx @@ -192,7 +192,7 @@ struct HfTreeCreatorLbToLcPi { using TracksWPid = soa::Join; void process(soa::Join const& candidates, - soa::Join const&, + soa::Join const&, TracksWPid const&) { // Filling candidate properties @@ -202,7 +202,7 @@ struct HfTreeCreatorLbToLcPi { float FunctionInvMass, float FunctionCt, float FunctionY) { - auto candLc = candidate.prong0_as>(); + auto candLc = candidate.prong0_as>(); auto track0 = candidate.prong1_as(); // daughter pion track auto track1 = candLc.prong0_as(); // granddaughter tracks (lc decay particles) auto track2 = candLc.prong1_as(); diff --git a/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx b/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx index 0ffd1aeac91..398bf3fc57a 100644 --- a/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx +++ b/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx @@ -84,7 +84,7 @@ DECLARE_SOA_COLUMN(FlagMc, flagMc, int8_t); DECLARE_SOA_COLUMN(OriginMcRec, originMcRec, int8_t); DECLARE_SOA_COLUMN(OriginMcGen, originMcGen, int8_t); DECLARE_SOA_COLUMN(IsCandidateSwapped, isCandidateSwapped, int8_t); -DECLARE_SOA_INDEX_COLUMN_FULL(Candidate, candidate, int, HfCand3ProngWPid, "_0"); +DECLARE_SOA_INDEX_COLUMN_FULL(Candidate, candidate, int, HfCand3ProngWPidPiKaPr, "_0"); DECLARE_SOA_INDEX_COLUMN(McParticle, mcParticle); DECLARE_SOA_COLUMN(Channel, channel, int8_t); // direct or resonant // Events @@ -954,7 +954,7 @@ struct HfTreeCreatorLcToPKPi { /// \param bcs Bunch-crossing table void processMcNoCentralityWithDCAFitterN(soa::Join const& collisions, aod::McCollisions const& mcCollisions, - soa::Join const& candidates, + soa::Join const& candidates, soa::Join const& particles, soa::Join const& tracks, aod::BCs const& bcs) { @@ -970,7 +970,7 @@ struct HfTreeCreatorLcToPKPi { /// \param bcs Bunch-crossing table void processMcWithCentralityWithDCAFitterN(soa::Join const& collisions, aod::McCollisions const& mcCollisions, - soa::Join const& candidates, + soa::Join const& candidates, soa::Join const& particles, soa::Join const& tracks, aod::BCs const& bcs) { @@ -987,7 +987,7 @@ struct HfTreeCreatorLcToPKPi { /// \param bcs Bunch-crossing table void processMcNoCentralityWithKFParticle(soa::Join const& collisions, aod::McCollisions const& mcCollisions, - soa::Join const& candidates, + soa::Join const& candidates, soa::Join const& particles, soa::Join const& tracks, aod::BCs const& bcs) { @@ -1003,7 +1003,7 @@ struct HfTreeCreatorLcToPKPi { /// \param bcs Bunch-crossing table void processMcWithCentralityWithKFParticle(soa::Join const& collisions, aod::McCollisions const& mcCollisions, - soa::Join const& candidates, + soa::Join const& candidates, soa::Join const& particles, soa::Join const& tracks, aod::BCs const& bcs) { @@ -1059,7 +1059,7 @@ struct HfTreeCreatorLcToPKPi { /// \param tracks Track table /// \param bcs Bunch-crossing table void processDataNoCentralityWithDCAFitterN(soa::Join const& collisions, - soa::Join const& candidates, + soa::Join const& candidates, TracksWPid const& tracks, aod::BCs const& bcs) { fillTablesData(collisions, candidates, tracks, bcs); @@ -1072,7 +1072,7 @@ struct HfTreeCreatorLcToPKPi { /// \param tracks Track table /// \param bcs Bunch-crossing table void processDataWithCentralityWithDCAFitterN(soa::Join const& collisions, - soa::Join const& candidates, + soa::Join const& candidates, TracksWPid const& tracks, aod::BCs const& bcs) { fillTablesData(collisions, candidates, tracks, bcs); @@ -1085,7 +1085,7 @@ struct HfTreeCreatorLcToPKPi { /// \param tracks Track table /// \param bcs Bunch-crossing table void processDataNoCentralityWithKFParticle(soa::Join const& collisions, - soa::Join const& candidates, + soa::Join const& candidates, TracksWPid const& tracks, aod::BCs const& bcs) { fillTablesData(collisions, candidates, tracks, bcs); @@ -1098,7 +1098,7 @@ struct HfTreeCreatorLcToPKPi { /// \param tracks Track table /// \param bcs Bunch-crossing table void processDataWithCentralityWithKFParticle(soa::Join const& collisions, - soa::Join const& candidates, + soa::Join const& candidates, TracksWPid const& tracks, aod::BCs const& bcs) { fillTablesData(collisions, candidates, tracks, bcs); diff --git a/PWGHF/TableProducer/treeCreatorXicToPKPi.cxx b/PWGHF/TableProducer/treeCreatorXicToPKPi.cxx index 94ad232d565..279dbc797fc 100644 --- a/PWGHF/TableProducer/treeCreatorXicToPKPi.cxx +++ b/PWGHF/TableProducer/treeCreatorXicToPKPi.cxx @@ -226,8 +226,8 @@ struct HfTreeCreatorXicToPKPi { HfHelper hfHelper; - using CandXicData = soa::Filtered>; - using CandXicMcReco = soa::Filtered>; + using CandXicData = soa::Filtered>; + using CandXicMcReco = soa::Filtered>; using CandXicMcGen = soa::Filtered>; Filter filterSelectCandidates = aod::hf_sel_candidate_xic::isSelXicToPKPi >= selectionFlagXic || aod::hf_sel_candidate_xic::isSelXicToPiKP >= selectionFlagXic; From fbf0023347d9e5e10df57d8b1841c79994531a03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Tue, 13 May 2025 15:00:26 +0200 Subject: [PATCH 1257/1650] [PWGHF] Fix names of Omegac0 tree creator files (#11174) --- PWGHF/TableProducer/CMakeLists.txt | 4 ++-- ...torOmegacToOmegaKa.cxx => treeCreatorOmegac0ToOmegaKa.cxx} | 2 +- ...torOmegacToOmegaPi.cxx => treeCreatorOmegac0ToOmegaPi.cxx} | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) rename PWGHF/TableProducer/{treeCreatorOmegacToOmegaKa.cxx => treeCreatorOmegac0ToOmegaKa.cxx} (99%) rename PWGHF/TableProducer/{treeCreatorOmegacToOmegaPi.cxx => treeCreatorOmegac0ToOmegaPi.cxx} (99%) diff --git a/PWGHF/TableProducer/CMakeLists.txt b/PWGHF/TableProducer/CMakeLists.txt index a2a0b107e74..3edd7076106 100644 --- a/PWGHF/TableProducer/CMakeLists.txt +++ b/PWGHF/TableProducer/CMakeLists.txt @@ -250,12 +250,12 @@ o2physics_add_dpl_workflow(tree-creator-omegac-st COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(tree-creator-omegac0-to-omega-ka - SOURCES treeCreatorOmegacToOmegaKa.cxx + SOURCES treeCreatorOmegac0ToOmegaKa.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(tree-creator-omegac0-to-omega-pi - SOURCES treeCreatorOmegacToOmegaPi.cxx + SOURCES treeCreatorOmegac0ToOmegaPi.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) diff --git a/PWGHF/TableProducer/treeCreatorOmegacToOmegaKa.cxx b/PWGHF/TableProducer/treeCreatorOmegac0ToOmegaKa.cxx similarity index 99% rename from PWGHF/TableProducer/treeCreatorOmegacToOmegaKa.cxx rename to PWGHF/TableProducer/treeCreatorOmegac0ToOmegaKa.cxx index 0330cabc861..ce441aa45d5 100644 --- a/PWGHF/TableProducer/treeCreatorOmegacToOmegaKa.cxx +++ b/PWGHF/TableProducer/treeCreatorOmegac0ToOmegaKa.cxx @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file treeCreatorOmegacToOmegaKa.cxx +/// \file treeCreatorOmegac0ToOmegaKa.cxx /// \brief Writer of the omegac0 to Omega Ka candidates in the form of flat tables to be stored in TTrees. /// In this file are defined and filled the output tables /// diff --git a/PWGHF/TableProducer/treeCreatorOmegacToOmegaPi.cxx b/PWGHF/TableProducer/treeCreatorOmegac0ToOmegaPi.cxx similarity index 99% rename from PWGHF/TableProducer/treeCreatorOmegacToOmegaPi.cxx rename to PWGHF/TableProducer/treeCreatorOmegac0ToOmegaPi.cxx index 369b5374f7e..94cb83fa870 100644 --- a/PWGHF/TableProducer/treeCreatorOmegacToOmegaPi.cxx +++ b/PWGHF/TableProducer/treeCreatorOmegac0ToOmegaPi.cxx @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file treeCreatorOmegacToOmegaPi.cxx +/// \file treeCreatorOmegac0ToOmegaPi.cxx /// \brief Writer of the omegac0 to Omega Pi candidates in the form of flat tables to be stored in TTrees. /// In this file are defined and filled the output tables /// @@ -217,7 +217,7 @@ DECLARE_SOA_TABLE(HfKfOmegacLites, "AOD", "HFKFOMEGACLITE", } // namespace o2::aod /// Writes the full information in an output TTree -struct HfTreeCreatorOmegacToOmegaPi { +struct HfTreeCreatorOmegacToOmegaPi { // FIXME: Rename to HfTreeCreatorOmegac0ToOmegaPi Produces rowCandidateLite; Produces rowKfCandidateFull; From e1d1d8d99bd0dcb50dc8b45d25edb775b32a5828 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Tue, 13 May 2025 15:05:18 +0200 Subject: [PATCH 1258/1650] [PWGHF] Add vertex building into the Tcc tree creator (#11169) Co-authored-by: ALICE Action Bot --- .../TableProducer/treeCreatorTccToD0D0Pi.cxx | 237 +++++++++++++++--- 1 file changed, 197 insertions(+), 40 deletions(-) diff --git a/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx b/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx index 75526481a29..78fd5f0098f 100644 --- a/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx +++ b/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx @@ -18,6 +18,8 @@ #include #include #include +#include +#include #include "CommonConstants/PhysicsConstants.h" #include "DCAFitter/DCAFitterN.h" @@ -25,6 +27,7 @@ #include "Framework/O2DatabasePDGPlugin.h" #include "Framework/runDataProcessing.h" #include "ReconstructionDataFormats/DCA.h" +#include "ReconstructionDataFormats/V0.h" #include "Common/Core/trackUtilities.h" #include "Common/Core/TrackSelection.h" @@ -53,9 +56,6 @@ namespace o2::aod namespace full { DECLARE_SOA_INDEX_COLUMN(Collision, collision); -DECLARE_SOA_COLUMN(PtD1, ptD1, float); -DECLARE_SOA_COLUMN(PtD2, ptD2, float); -DECLARE_SOA_COLUMN(PtPi, ptPi, float); DECLARE_SOA_COLUMN(PxProng0D1, pxProng0D1, float); DECLARE_SOA_COLUMN(PxProng1D1, pxProng1D1, float); DECLARE_SOA_COLUMN(PyProng0D1, pyProng0D1, float); @@ -95,10 +95,12 @@ DECLARE_SOA_COLUMN(NSigTpcSoftPi, nSigTpcSoftPi, float); DECLARE_SOA_COLUMN(NSigTofSoftPi, nSigTofSoftPi, float); DECLARE_SOA_COLUMN(MlScoreD1, mlScoreD1, float); DECLARE_SOA_COLUMN(MlScoreD2, mlScoreD2, float); -DECLARE_SOA_COLUMN(DecayLengthD1, decayLengthD1, float); -DECLARE_SOA_COLUMN(DecayLengthD2, decayLengthD2, float); +DECLARE_SOA_COLUMN(ImpactParameterD1, impactParameterD1, float); +DECLARE_SOA_COLUMN(ImpactParameterD2, impactParameterD2, float); +DECLARE_SOA_COLUMN(ImpactParameterSoftPi, impactParameterSoftPi, float); DECLARE_SOA_COLUMN(CpaD1, cpaD1, float); DECLARE_SOA_COLUMN(CpaD2, cpaD2, float); +DECLARE_SOA_COLUMN(Chi2PCA, chi2PCA, float); DECLARE_SOA_COLUMN(SignSoftPi, signSoftPi, float); DECLARE_SOA_COLUMN(DcaXYSoftPi, dcaXYSoftPi, float); DECLARE_SOA_COLUMN(DcaZSoftPi, dcaZSoftPi, float); @@ -112,9 +114,6 @@ DECLARE_SOA_COLUMN(RunNumber, runNumber, int); } // namespace full DECLARE_SOA_TABLE(HfCandTccLites, "AOD", "HFCANDTCCLITE", - full::PtD1, - full::PtD2, - full::PtPi, full::PxProng0D1, full::PxProng1D1, full::PyProng0D1, @@ -154,10 +153,12 @@ DECLARE_SOA_TABLE(HfCandTccLites, "AOD", "HFCANDTCCLITE", full::NSigTofSoftPi, full::MlScoreD1, full::MlScoreD2, - full::DecayLengthD1, - full::DecayLengthD2, + full::ImpactParameterD1, + full::ImpactParameterD2, + full::ImpactParameterSoftPi, full::CpaD1, full::CpaD2, + full::Chi2PCA, full::SignSoftPi, full::DcaXYSoftPi, full::DcaZSoftPi, @@ -184,16 +185,37 @@ struct HfTreeCreatorTccToD0D0Pi { Configurable ptMinSoftPion{"ptMinSoftPion", 0.0, "Min pt for the soft pion"}; Configurable usePionIsGlobalTrackWoDCA{"usePionIsGlobalTrackWoDCA", true, "check isGlobalTrackWoDCA status for pions"}; - // Configurable softPiEtaMax{"softPiEtaMax", 0.9f, "Soft pion max value for pseudorapidity (abs vale)"}; - // Configurable softPiChi2Max{"softPiChi2Max", 36.f, "Soft pion max value for chi2 ITS"}; - // Configurable softPiItsHitMap{"softPiItsHitMap", 127, "Soft pion ITS hitmap"}; - // Configurable softPiItsHitsMin{"softPiItsHitsMin", 1, "Minimum number of ITS layers crossed by the soft pion among those in \"softPiItsHitMap\""}; + // vertexing + Configurable propagateToPCA{"propagateToPCA", true, "create tracks version propagated to PCA"}; + Configurable useAbsDCA{"useAbsDCA", false, "Minimise abs. distance rather than chi2"}; + Configurable useWeightedFinalPCA{"useWeightedFinalPCA", false, "Recalculate vertex position using track covariances, effective only if useAbsDCA is true"}; + Configurable maxR{"maxR", 200., "reject PCA's above this radius"}; + Configurable maxDZIni{"maxDZIni", 4., "reject (if>0) PCA candidate if tracks DZ exceeds threshold"}; + Configurable minParamChange{"minParamChange", 1.e-3, "stop iterations if largest change of any Lb is smaller than this"}; + Configurable minRelChi2Change{"minRelChi2Change", 0.9, "stop iterations is chi2/chi2old > this"}; + Configurable softPiDcaXYMax{"softPiDcaXYMax", 0.065, "Soft pion max dcaXY (cm)"}; Configurable softPiDcaZMax{"softPiDcaZMax", 0.065, "Soft pion max dcaZ (cm)"}; Configurable deltaMassCanMax{"deltaMassCanMax", 2, "delta candidate max mass (DDPi-D0D0) ((GeV/c2)"}; Configurable massCanMax{"massCanMax", 4.0, "candidate max mass (DDPi) ((GeV/c2)"}; + // magnetic field setting from CCDB + Configurable isRun2{"isRun2", false, "enable Run 2 or Run 3 GRP objects for magnetic field"}; + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable ccdbPathLut{"ccdbPathLut", "GLO/Param/MatLUT", "Path for LUT parametrization"}; + Configurable ccdbPathGrp{"ccdbPathGrp", "GLO/GRP/GRP", "Path of the grp file (Run 2)"}; + Configurable ccdbPathGrpMag{"ccdbPathGrpMag", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object (Run 3)"}; + + o2::vertexing::DCAFitterN<3> dfTcc; // Tcc vertex fitter + o2::vertexing::DCAFitterN<2> dfD1; // 2-prong vertex fitter (to rebuild D01 vertex) + o2::vertexing::DCAFitterN<2> dfD2; // 2-prong vertex fitter (to rebuild D02 vertex) + HfHelper hfHelper; + Service ccdb; + o2::base::MatLayerCylSet* lut; + o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT; + int runNumber; + double bz{0.}; using TracksPid = soa::Join; using TracksWPid = soa::Join; @@ -209,7 +231,9 @@ struct HfTreeCreatorTccToD0D0Pi { Preslice candsD0PerCollisionWithMl = aod::track_association::collisionId; Preslice trackIndicesPerCollision = aod::track_association::collisionId; // Partition candidatesMlAll = aod::hf_sel_candidate_d0::isSelD0 >= 0; - + std::shared_ptr hCandidatesD1, hCandidatesD2, hCandidatesTcc; + OutputObj hCovPVXX{TH1F("hCovPVXX", "Tcc candidates;XX element of cov. matrix of prim. vtx. position (cm^{2});entries", 100, 0., 1.e-4)}; + OutputObj hCovSVXX{TH1F("hCovSVXX", "Tcc candidates;XX element of cov. matrix of sec. vtx. position (cm^{2});entries", 100, 0., 0.2)}; void init(InitContext const&) { @@ -217,6 +241,37 @@ struct HfTreeCreatorTccToD0D0Pi { if (std::accumulate(doprocess.begin(), doprocess.end(), 0) != 1) { LOGP(fatal, "Only one process function can be enabled at a time."); } + + dfD1.setPropagateToPCA(propagateToPCA); + dfD1.setMaxR(maxR); + dfD1.setMaxDZIni(maxDZIni); + dfD1.setMinParamChange(minParamChange); + dfD1.setMinRelChi2Change(minRelChi2Change); + dfD1.setUseAbsDCA(useAbsDCA); + dfD1.setWeightedFinalPCA(useWeightedFinalPCA); + + dfD2.setPropagateToPCA(propagateToPCA); + dfD2.setMaxR(maxR); + dfD2.setMaxDZIni(maxDZIni); + dfD2.setMinParamChange(minParamChange); + dfD2.setMinRelChi2Change(minRelChi2Change); + dfD2.setUseAbsDCA(useAbsDCA); + dfD2.setWeightedFinalPCA(useWeightedFinalPCA); + + dfTcc.setPropagateToPCA(propagateToPCA); + dfTcc.setMaxR(maxR); + dfTcc.setMaxDZIni(maxDZIni); + dfTcc.setMinParamChange(minParamChange); + dfTcc.setMinRelChi2Change(minRelChi2Change); + dfTcc.setUseAbsDCA(useAbsDCA); + dfTcc.setWeightedFinalPCA(useWeightedFinalPCA); + + // Configure CCDB access + ccdb->setURL(ccdbUrl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get(ccdbPathLut)); + runNumber = 0; } template @@ -245,10 +300,86 @@ struct HfTreeCreatorTccToD0D0Pi { void runCandCreatorData(CollType const& collision, CandType const& candidates, aod::TrackAssoc const& trackIndices, - TrkType const& track, aod::BCs const&) + TrkType const&, + aod::BCs const&) { + + auto primaryVertex = getPrimaryVertex(collision); + auto bc = collision.template bc_as(); + if (runNumber != bc.runNumber()) { + LOG(info) << ">>>>>>>>>>>> Current run number: " << runNumber; + initCCDB(bc, runNumber, ccdb, isRun2 ? ccdbPathGrp : ccdbPathGrpMag, lut, isRun2); + bz = o2::base::Propagator::Instance()->getNominalBz(); + LOG(info) << ">>>>>>>>>>>> Magnetic field: " << bz; + } + dfTcc.setBz(bz); + dfD1.setBz(bz); + dfD2.setBz(bz); + for (const auto& candidateD1 : candidates) { + + auto trackD1Prong0 = candidateD1.template prong0_as(); + auto trackD1Prong1 = candidateD1.template prong1_as(); + auto trackParVarD1Prong0 = getTrackParCov(trackD1Prong0); + auto trackParVarD1Prong1 = getTrackParCov(trackD1Prong1); + // reconstruct the 2-prong secondary vertex + hCandidatesD1->Fill(SVFitting::BeforeFit); + try { + if (dfD1.process(trackParVarD1Prong0, trackParVarD1Prong1) == 0) { + continue; + } + } catch (const std::runtime_error& error) { + LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN for first D0 cannot work, skipping the candidate."; + hCandidatesD1->Fill(SVFitting::Fail); + continue; + } + hCandidatesD1->Fill(SVFitting::FitOk); + const auto& vertexD1 = dfD1.getPCACandidatePos(); + trackParVarD1Prong0.propagateTo(vertexD1[0], bz); + trackParVarD1Prong1.propagateTo(vertexD1[0], bz); + // Get pVec of tracks of D1 + std::array pVecD1Prong0 = {0}; + std::array pVecD1Prong1 = {0}; + dfD1.getTrack(0).getPxPyPzGlo(pVecD1Prong0); + dfD1.getTrack(1).getPxPyPzGlo(pVecD1Prong1); + // Get D1 momentum + std::array pVecD1 = RecoDecay::pVec(pVecD1Prong0, pVecD1Prong1); + + // build a D1 neutral track + auto trackD1 = o2::dataformats::V0(vertexD1, pVecD1, dfD1.calcPCACovMatrixFlat(), trackParVarD1Prong0, trackParVarD1Prong1); + for (auto candidateD2 = candidateD1 + 1; candidateD2 != candidates.end(); ++candidateD2) { + + auto trackD2Prong0 = candidateD2.template prong0_as(); + auto trackD2Prong1 = candidateD2.template prong1_as(); + auto trackParVarD2Prong0 = getTrackParCov(trackD2Prong0); + auto trackParVarD2Prong1 = getTrackParCov(trackD2Prong1); + // reconstruct the 2-prong secondary vertex + hCandidatesD2->Fill(SVFitting::BeforeFit); + try { + if (dfD2.process(trackParVarD2Prong0, trackParVarD2Prong1) == 0) { + continue; + } + } catch (const std::runtime_error& error) { + LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN for second D0 cannot work, skipping the candidate."; + hCandidatesD2->Fill(SVFitting::Fail); + continue; + } + hCandidatesD2->Fill(SVFitting::FitOk); + const auto& vertexD2 = dfD2.getPCACandidatePos(); + trackParVarD2Prong0.propagateTo(vertexD2[0], bz); + trackParVarD2Prong1.propagateTo(vertexD2[0], bz); + // Get pVec of tracks of D2 + std::array pVecD2Prong0 = {0}; + std::array pVecD2Prong1 = {0}; + dfD2.getTrack(0).getPxPyPzGlo(pVecD2Prong0); + dfD2.getTrack(1).getPxPyPzGlo(pVecD2Prong1); + // Get D2 momentum + std::array pVecD2 = RecoDecay::pVec(pVecD2Prong0, pVecD2Prong1); + + // build a D2 neutral track + auto trackD2 = o2::dataformats::V0(vertexD2, pVecD2, dfD2.calcPCACovMatrixFlat(), trackParVarD2Prong0, trackParVarD2Prong1); + for (const auto& trackId : trackIndices) { auto trackPion = trackId.template track_as(); if (usePionIsGlobalTrackWoDCA && !trackPion.isGlobalTrackWoDCA()) { @@ -273,6 +404,46 @@ struct HfTreeCreatorTccToD0D0Pi { (candidateD2.prong1Id() == trackPion.globalIndex())) { continue; } + + auto trackParCovPi = getTrackParCov(trackPion); + std::array pVecD1New = {0., 0., 0.}; + std::array pVecD2New = {0., 0., 0.}; + std::array pVecSoftPi = {0., 0., 0.}; + + // find the DCA between the D01, D02 and the bachelor track, for Tcc + hCandidatesTcc->Fill(SVFitting::BeforeFit); + try { + if (dfTcc.process(trackD1, trackD2, trackParCovPi) == 0) { + continue; + } + } catch (const std::runtime_error& error) { + LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN for Tcc cannot work, skipping the candidate."; + hCandidatesTcc->Fill(SVFitting::Fail); + continue; + } + hCandidatesTcc->Fill(SVFitting::FitOk); + + dfTcc.propagateTracksToVertex(); // propagate the softpi and D0 pair to the Tcc vertex + trackD1.getPxPyPzGlo(pVecD1New); // momentum of D1 at the Tcc vertex + trackD2.getPxPyPzGlo(pVecD2New); // momentum of D2 at the Tcc vertex + trackParCovPi.getPxPyPzGlo(pVecSoftPi); // momentum of pi at the Tcc vertex + + auto chi2PCA = dfTcc.getChi2AtPCACandidate(); + auto covMatrixPCA = dfTcc.calcPCACovMatrixFlat(); + hCovSVXX->Fill(covMatrixPCA[0]); + + // get track impact parameters + // This modifies track momenta! + auto covMatrixPV = primaryVertex.getCov(); + hCovPVXX->Fill(covMatrixPV[0]); + o2::dataformats::DCA impactParameterD1; + o2::dataformats::DCA impactParameterD2; + o2::dataformats::DCA impactParameterSoftPi; + + trackD1.propagateToDCA(primaryVertex, bz, &impactParameterD1); + trackD2.propagateToDCA(primaryVertex, bz, &impactParameterD2); + trackParCovPi.propagateToDCA(primaryVertex, bz, &impactParameterSoftPi); + // Retrieve properties of the two D0 candidates float yD1 = hfHelper.yD0(candidateD1); float yD2 = hfHelper.yD0(candidateD2); @@ -292,7 +463,7 @@ struct HfTreeCreatorTccToD0D0Pi { std::copy(candidateD1.mlProbD0().begin(), candidateD1.mlProbD0().end(), std::back_inserter(mlScoresD1)); massD01 = hfHelper.invMassD0ToPiK(candidateD1); } - if (candidateD1.isSelD0bar()) { + if (candidateD1.isSelD0bar() && !candidateD1.isSelD0()) { candFlagD1 = 2; std::copy(candidateD1.mlProbD0bar().begin(), candidateD1.mlProbD0bar().end(), std::back_inserter(mlScoresD1)); massD01 = hfHelper.invMassD0barToKPi(candidateD1); @@ -303,7 +474,7 @@ struct HfTreeCreatorTccToD0D0Pi { std::copy(candidateD2.mlProbD0().begin(), candidateD2.mlProbD0().end(), std::back_inserter(mlScoresD2)); massD02 = hfHelper.invMassD0ToPiK(candidateD2); } - if (candidateD2.isSelD0bar()) { + if (candidateD2.isSelD0bar() && !candidateD2.isSelD0()) { candFlagD2 = 2; std::copy(candidateD2.mlProbD0bar().begin(), candidateD2.mlProbD0bar().end(), std::back_inserter(mlScoresD2)); massD02 = hfHelper.invMassD0barToKPi(candidateD2); @@ -311,17 +482,6 @@ struct HfTreeCreatorTccToD0D0Pi { // LOG(info) << " candidateD1.collisionId() " << candidateD1.collisionId()<<" massD01 "< pVecPosD1Dau{trackPosD1Dau.pVector()}; - std::array pVecNegD1Dau{trackNegD1Dau.pVector()}; - std::array pVecPosD2Dau{trackPosD2Dau.pVector()}; - std::array pVecNegD2Dau{trackNegD2Dau.pVector()}; - std::array pVecSoftPion = {trackPion.pVector()}; std::array massD1Daus{MassPiPlus, MassKPlus}; std::array massD2Daus{MassPiPlus, MassKPlus}; @@ -335,27 +495,22 @@ struct HfTreeCreatorTccToD0D0Pi { massD2Daus[1] = MassPiPlus; } - auto massKpipi1 = RecoDecay::m(std::array{pVecPosD1Dau, pVecNegD1Dau, pVecSoftPion}, std::array{massD1Daus[0], massD1Daus[1], MassPiPlus}); - auto massKpipi2 = RecoDecay::m(std::array{pVecPosD2Dau, pVecNegD2Dau, pVecSoftPion}, std::array{massD2Daus[0], massD2Daus[1], MassPiPlus}); + auto massKpipi1 = RecoDecay::m(std::array{pVecD1Prong0, pVecD1Prong1, pVecSoftPi}, std::array{massD1Daus[0], massD1Daus[1], MassPiPlus}); + auto massKpipi2 = RecoDecay::m(std::array{pVecD2Prong0, pVecD2Prong1, pVecSoftPi}, std::array{massD2Daus[0], massD2Daus[1], MassPiPlus}); deltaMassD01 = massKpipi1 - massD01; deltaMassD02 = massKpipi2 - massD02; - std::array pVecD1{candidateD1.px(), candidateD1.py(), candidateD1.pz()}; - std::array pVecD2{candidateD2.px(), candidateD2.py(), candidateD2.pz()}; - auto arrayMomentaDDpi = std::array{pVecD1, pVecD2, pVecSoftPion}; + auto arrayMomentaDDpi = std::array{pVecD1New, pVecD2New, pVecSoftPi}; const auto massD0D0Pi = RecoDecay::m(std::move(arrayMomentaDDpi), std::array{MassD0, MassD0, MassPiPlus}); const auto deltaMassD0D0Pi = massD0D0Pi - (massD01 + massD02); - const auto massD0D0Pair = RecoDecay::m(std::array{pVecD1, pVecD2}, std::array{MassD0, MassD0}); + const auto massD0D0Pair = RecoDecay::m(std::array{pVecD1New, pVecD2New}, std::array{MassD0, MassD0}); if (deltaMassD0D0Pi > deltaMassCanMax || massD0D0Pi > massCanMax) { continue; } rowCandidateLite( - candidateD1.pt(), - candidateD2.pt(), - trackPion.pt(), candidateD1.pxProng0(), candidateD1.pxProng1(), candidateD1.pyProng0(), @@ -395,10 +550,12 @@ struct HfTreeCreatorTccToD0D0Pi { trackPion.tofNSigmaPi(), mlScoresD1[0], mlScoresD2[0], - candidateD1.decayLength(), - candidateD2.decayLength(), + impactParameterD1.getY(), + impactParameterD2.getY(), + impactParameterSoftPi.getY(), candidateD1.cpa(), candidateD2.cpa(), + chi2PCA, trackPion.sign(), trackPion.dcaXY(), trackPion.dcaZ(), From 1477e461fcd9cb913a72fc8ae195111fb609b491 Mon Sep 17 00:00:00 2001 From: Mario Ciacco Date: Tue, 13 May 2025 15:19:59 +0200 Subject: [PATCH 1259/1650] [PWGLF] conditionally store number of tracks in the event (#11168) --- PWGLF/TableProducer/Nuspex/ebyeMaker.cxx | 235 ++++++++++++----------- 1 file changed, 126 insertions(+), 109 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/ebyeMaker.cxx b/PWGLF/TableProducer/Nuspex/ebyeMaker.cxx index 99d2be3dc3c..e69142e2bbd 100644 --- a/PWGLF/TableProducer/Nuspex/ebyeMaker.cxx +++ b/PWGLF/TableProducer/Nuspex/ebyeMaker.cxx @@ -9,6 +9,10 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +/// \file ebyeMaker.cxx +/// \brief table producer for e-by-e analysis in LF +/// \author Mario Ciacco + #include #include #include @@ -44,7 +48,6 @@ #include "PWGLF/DataModel/LFEbyeTables.h" -#include "TDatabasePDG.h" #include "TFormula.h" using namespace o2; @@ -76,7 +79,7 @@ static const std::vector particleName{"p"}; std::array, kNpart> tofMass; void momTotXYZ(std::array& momA, std::array const& momB, std::array const& momC) { - for (int i = 0; i < 3; ++i) { + for (uint64_t i = 0; i < momA.size(); ++i) { momA[i] = momB[i] + momC[i]; } } @@ -117,7 +120,7 @@ float etaFromMom(std::array const& momA, std::array const& m (1.f * momA[2] + 1.f * momB[2]) * (1.f * momA[2] + 1.f * momB[2])) - (1.f * momA[2] + 1.f * momB[2]))); } -float CalculateDCAStraightToPV(float X, float Y, float Z, float Px, float Py, float Pz, float pvX, float pvY, float pvZ) +float calculateDCAStraightToPV(float X, float Y, float Z, float Px, float Py, float Pz, float pvX, float pvY, float pvZ) { return std::sqrt((std::pow((pvY - Y) * Pz - (pvZ - Z) * Py, 2) + std::pow((pvX - X) * Pz - (pvZ - Z) * Px, 2) + std::pow((pvX - X) * Py - (pvY - Y) * Px, 2)) / (Px * Px + Py * Py + Pz * Pz)); } @@ -165,7 +168,7 @@ struct CandidateTrack { int64_t globalIndex = -999; }; -enum selBits { +enum SelBits { kTPCclsTight = BIT(0), kTPCclsMid = BIT(1), kChi2TPCTight = BIT(2), @@ -186,7 +189,7 @@ enum PartTypes { kPhysPrim = BIT(22) }; -struct tagRun2V0MCalibration { +struct TagRun2V0MCalibration { bool mCalibrationStored = false; TH1* mhVtxAmpCorrV0A = nullptr; TH1* mhVtxAmpCorrV0C = nullptr; @@ -195,13 +198,13 @@ struct tagRun2V0MCalibration { TFormula* mMCScale = nullptr; } Run2V0MInfo; -struct tagRun2CL0Calibration { +struct TagRun2CL0Calibration { bool mCalibrationStored = false; TH1* mhVtxAmpCorr = nullptr; TH1* mhMultSelCalib = nullptr; } Run2CL0Info; -struct ebyeMaker { +struct EbyeMaker { Produces collisionEbyeTable; Produces miniCollTable; Produces nucleiEbyeTable; @@ -218,8 +221,9 @@ struct ebyeMaker { std::vector classIds; int mRunNumber; - float d_bz; + float dBz; uint8_t nTrackletsColl; + uint8_t nTracksColl; // o2::base::MatLayerCylSet* lut = nullptr; Configurable cfgMaterialCorrection{"cfgMaterialCorrection", static_cast(o2::base::Propagator::MatCorrType::USEMatCorrNONE), "Type of material correction"}; @@ -227,7 +231,7 @@ struct ebyeMaker { Configurable> cfgBetheBlochParamsITS{"cfgBetheBlochParamsITS", {betheBlochDefaultITS, 1, 6, particleName, betheBlochParNames}, "ITS Bethe-Bloch parameterisation for deuteron"}; ConfigurableAxis centAxis{"centAxis", {106, 0, 106}, "binning for the centrality"}; - ConfigurableAxis zVtxAxis{"zVtxBins", {100, -20.f, 20.f}, "Binning for the vertex z in cm"}; + ConfigurableAxis zVtxAxis{"zVtxAxis", {100, -20.f, 20.f}, "Binning for the vertex z in cm"}; ConfigurableAxis multAxis{"multAxis", {100, 0, 10000}, "Binning for the multiplicity axis"}; ConfigurableAxis multFt0Axis{"multFt0Axis", {100, 0, 100000}, "Binning for the ft0 multiplicity axis"}; @@ -235,7 +239,7 @@ struct ebyeMaker { ConfigurableAxis massLambdaAxis{"massLambdaAxis", {400, o2::constants::physics::MassLambda0 - 0.03f, o2::constants::physics::MassLambda0 + 0.03f}, "binning for the lambda invariant-mass"}; // binning of PID QA histograms - ConfigurableAxis momAxis{"momAxisFine", {5.e2, 0.f, 5.f}, "momentum axis binning"}; + ConfigurableAxis momAxis{"momAxis", {5.e2, 0.f, 5.f}, "momentum axis binning"}; ConfigurableAxis tpcAxis{"tpcAxis", {4.e2, 0.f, 4.e3f}, "tpc signal axis binning"}; ConfigurableAxis tofMassAxis{"tofMassAxis", {1000, 0., 3.f}, "tof mass axis"}; @@ -244,8 +248,8 @@ struct ebyeMaker { Configurable etaMaxV0dau{"etaMaxV0dau", 0.8f, "maximum eta V0 daughters"}; Configurable outerPIDMin{"outerPIDMin", -4.f, "minimum outer PID"}; - Configurable fillOnlySignal{"fillOnlySignal", false, "fill histograms only for true signal candidates (MC)"}; - Configurable genName{"genname", "", "Genearator name: HIJING, PYTHIA8, ... Default: \"\""}; + Configurable storeTracksNum{"storeTracksNum", false, "store the number of tracks instead of tracklets"}; + Configurable genName{"genName", "", "Genearator name: HIJING, PYTHIA8, ... Default: \"\""}; Configurable triggerCut{"triggerCut", 0x0, "trigger cut to select"}; Configurable kINT7Intervals{"kINT7Intervals", false, "toggle kINT7 trigger selection in the 10-30% and 50-90% centrality intervals (2018 Pb-Pb)"}; @@ -264,14 +268,14 @@ struct ebyeMaker { Configurable lambdaPtMax{"lambdaPtMax", 4.f, "maximum (anti)lambda pT (GeV/c)"}; Configurable trackNcrossedRows{"trackNcrossedRows", 70, "Minimum number of crossed TPC rows"}; - Configurable trackNclusItsCut{"trackNclusITScut", 2, "Minimum number of ITS clusters"}; - Configurable trackNclusTpcCut{"trackNclusTPCcut", 60, "Minimum number of TPC clusters"}; + Configurable trackNclusItsCut{"trackNclusItsCut", 2, "Minimum number of ITS clusters"}; + Configurable trackNclusTpcCut{"trackNclusTpcCut", 60, "Minimum number of TPC clusters"}; Configurable trackChi2Cut{"trackChi2Cut", 4.f, "Maximum chi2/ncls in TPC"}; Configurable> cfgDcaSels{"cfgDcaSels", {dcaSels, 1, 3, particleName, dcaSelsNames}, "DCA selections"}; Configurable v0trackNcrossedRows{"v0trackNcrossedRows", 100, "Minimum number of crossed TPC rows for V0 daughter"}; - Configurable v0trackNclusItsCut{"v0trackNclusITScut", 0, "Minimum number of ITS clusters for V0 daughter"}; - Configurable v0trackNclusTpcCut{"v0trackNclusTPCcut", 100, "Minimum number of TPC clusters for V0 daughter"}; + Configurable v0trackNclusItsCut{"v0trackNclusItsCut", 0, "Minimum number of ITS clusters for V0 daughter"}; + Configurable v0trackNclusTpcCut{"v0trackNclusTpcCut", 100, "Minimum number of TPC clusters for V0 daughter"}; Configurable v0trackNsharedClusTpc{"v0trackNsharedClusTpc", 5, "Maximum number of shared TPC clusters for V0 daughter"}; Configurable v0requireITSrefit{"v0requireITSrefit", false, "require ITS refit for V0 daughter"}; Configurable vetoMassK0Short{"vetoMassK0Short", 0.01f, "veto for V0 compatible with K0s mass"}; @@ -279,8 +283,8 @@ struct ebyeMaker { Configurable antidNsigmaTpcCutLow{"antidNsigmaTpcCutLow", -4.f, "TPC PID cut low"}; Configurable antidNsigmaTpcCutUp{"antidNsigmaTpcCutUp", 4.f, "TPC PID cut up"}; - Configurable antidTpcInnerParamMax{"tpcInnerParamMax", 0.f, "(temporary) tpc inner param cut"}; - Configurable antidTofMassMax{"tofMassMax", 0.3f, "(temporary) tof mass cut"}; + Configurable antidTpcInnerParamMax{"antidTpcInnerParamMax", 0.f, "(temporary) tpc inner param cut"}; + Configurable antidTofMassMax{"antidTofMassMax", 0.3f, "(temporary) tof mass cut"}; Configurable antipNsigmaTpcCutLow{"antipNsigmaTpcCutLow", -4.f, "TPC PID cut low"}; Configurable antipNsigmaTpcCutUp{"antipNsigmaTpcCutUp", 4.f, "TPC PID cut up"}; @@ -288,13 +292,13 @@ struct ebyeMaker { Configurable antipTofMassMax{"antipTofMassMax", 0.3f, "(temporary) tof mass cut"}; Configurable tofMassMaxQA{"tofMassMaxQA", 0.6f, "(temporary) tof mass cut (for QA histograms)"}; - Configurable v0setting_dcav0dau{"v0setting_dcav0dau", 0.5f, "DCA V0 Daughters"}; - Configurable v0setting_dcav0pv{"v0setting_dcav0pv", 1.f, "DCA V0 to Pv"}; - Configurable v0setting_dcadaughtopv{"v0setting_dcadaughtopv", 0.1f, "DCA Pos To PV"}; - Configurable v0setting_cospa{"v0setting_cospa", 0.99f, "V0 CosPA"}; - Configurable v0setting_radius{"v0setting_radius", 5.f, "v0radius"}; - Configurable v0setting_lifetime{"v0setting_lifetime", 40.f, "v0 lifetime cut"}; - Configurable v0setting_nsigmatpc{"v0setting_nsigmatpc", 4.f, "nsigmatpc"}; + Configurable v0settingDcaV0Dau{"v0settingDcaV0Dau", 0.5f, "DCA V0 Daughters"}; + Configurable v0settingDcaV0Pv{"v0settingDcaV0Pv", 1.f, "DCA V0 to Pv"}; + Configurable v0settingDcaDaughToPv{"v0settingDcaDaughToPv", 0.1f, "DCA Pos To PV"}; + Configurable v0settingCosPa{"v0settingCosPa", 0.99f, "V0 CosPA"}; + Configurable v0settingRadius{"v0settingRadius", 5.f, "v0radius"}; + Configurable v0settingLifetime{"v0settingLifetime", 40.f, "v0 lifetime cut"}; + Configurable v0settingNSigmaTpc{"v0settingNSigmaTpc", 4.f, "nsigmatpc"}; Configurable lambdaMassCut{"lambdaMassCut", 0.02f, "maximum deviation from PDG mass (for QA histograms)"}; Configurable constDCASel{"constDCASel", true, "use DCA selections independent of pt"}; @@ -323,20 +327,20 @@ struct ebyeMaker { template int getPartTypeMother(P const& mcPart) { - for (auto& mother : mcPart.template mothers_as()) { + for (const auto& mother : mcPart.template mothers_as()) { if (!mother.isPhysicalPrimary()) return -1; int pdgCode = mother.pdgCode(); switch (std::abs(pdgCode)) { case 3122: { int foundPi = 0; - for (auto& mcDaught : mother.template daughters_as()) { - if (std::abs(mcDaught.pdgCode()) == 211) { + for (const auto& mcDaught : mother.template daughters_as()) { + if (std::abs(mcDaught.pdgCode()) == PDG_t::kPiPlus) { foundPi = mcDaught.pdgCode(); break; } } - if (foundPi * mcPart.pdgCode() < -0.5) + if (foundPi * mcPart.pdgCode() < 0) return PartTypes::kLa; return -1; } @@ -354,13 +358,14 @@ struct ebyeMaker { template bool selectV0Daughter(T const& track) { + const float defNClCROverFind = 0.8f; if (std::abs(track.eta()) > etaMaxV0dau) { return false; } if (track.itsNCls() < v0trackNclusItsCut || track.tpcNClsFound() < v0trackNclusTpcCut || track.tpcNClsCrossedRows() < v0trackNclusTpcCut || - track.tpcNClsCrossedRows() < 0.8 * track.tpcNClsFindable() || + track.tpcNClsCrossedRows() < defNClCROverFind * track.tpcNClsFindable() || track.tpcNClsShared() > v0trackNsharedClusTpc) { return false; } @@ -379,6 +384,8 @@ struct ebyeMaker { template bool selectTrack(T const& track) { + const float defItsChi2NClCut = 36.f; + const float defNClCROverFind = 0.8f; if (std::abs(track.eta()) > etaMax) { return false; } @@ -388,9 +395,9 @@ struct ebyeMaker { if (track.itsNCls() < trackNclusItsCut || track.tpcNClsFound() < trackNclusTpcCut || track.tpcNClsCrossedRows() < trackNcrossedRows || - track.tpcNClsCrossedRows() < 0.8 * track.tpcNClsFindable() || + track.tpcNClsCrossedRows() < defNClCROverFind * track.tpcNClsFindable() || track.tpcChi2NCl() > trackChi2Cut || - track.itsChi2NCl() > 36.f) { + track.itsChi2NCl() > defItsChi2NClCut) { return false; } if (doprocessRun2 || doprocessMiniRun2 || doprocessMcRun2 || doprocessMiniMcRun2) { @@ -407,7 +414,8 @@ struct ebyeMaker { float getITSClSize(T const& track) { float sum{0.f}; - for (int iL{0}; iL < 6; ++iL) { + const int nLayers = 7; + for (int iL{0}; iL < nLayers; ++iL) { sum += (track.itsClusterSizes() >> (iL * 4)) & 0xf; } return sum / track.itsNCls(); @@ -452,7 +460,8 @@ struct ebyeMaker { if ((Run2V0MInfo.mhVtxAmpCorrV0A != nullptr) && (Run2V0MInfo.mhVtxAmpCorrV0C != nullptr) && (Run2V0MInfo.mhMultSelCalib != nullptr)) { if (genName->length() != 0) { if (Run2V0MInfo.mMCScale != nullptr) { - for (int ixpar = 0; ixpar < 6; ++ixpar) { + const int nPars = 6; + for (int ixpar = 0; ixpar < nPars; ++ixpar) { Run2V0MInfo.mMCScalePars[ixpar] = Run2V0MInfo.mMCScale->GetParameter(ixpar); } } else { @@ -482,8 +491,8 @@ struct ebyeMaker { o2::base::Propagator::initFieldFromGRP(grpmag); } // Fetch magnetic field from ccdb for current collision - d_bz = o2::base::Propagator::Instance()->getNominalBz(); - LOG(info) << "Retrieved GRP for timestamp " << timestamp << " with magnetic field of " << d_bz << " kG"; + dBz = o2::base::Propagator::Instance()->getNominalBz(); + LOG(info) << "Retrieved GRP for timestamp " << timestamp << " with magnetic field of " << dBz << " kG"; mRunNumber = bc.runNumber(); if (doprocessMiniRun2) { o2::ccdb::CcdbApi ccdbApi; @@ -499,7 +508,7 @@ struct ebyeMaker { classIds.push_back(classId); } } - fitter.setBz(d_bz); + fitter.setBz(dBz); // o2::base::Propagator::Instance()->setMatLUT(lut); } @@ -531,17 +540,17 @@ struct ebyeMaker { auto fv0c = fv0cs.rawIteratorAt(id); float multFV0A = 0; float multFV0C = 0; - for (float amplitude : fv0a.amplitude()) { + for (const float& amplitude : fv0a.amplitude()) { multFV0A += amplitude; } - for (float amplitude : fv0c.amplitude()) { + for (const float& amplitude : fv0c.amplitude()) { multFV0C += amplitude; } float v0m = -1; auto scaleMC = [](float x, float pars[6]) { - return pow(((pars[0] + pars[1] * pow(x, pars[2])) - pars[3]) / pars[4], 1.0f / pars[5]); + return std::pow(((pars[0] + pars[1] * std::pow(x, pars[2])) - pars[3]) / pars[4], 1.0f / pars[5]); }; if (Run2V0MInfo.mMCScale != nullptr) { @@ -590,7 +599,7 @@ struct ebyeMaker { { mRunNumber = 0; - d_bz = 0; + dBz = 0; ccdb->setURL("http://alice-ccdb.cern.ch"); ccdb->setCaching(true); @@ -663,12 +672,14 @@ struct ebyeMaker { gpu::gpustd::array dcaInfo; uint8_t nTracklets[2]{0, 0}; + uint8_t nTracks{0}; + const float tklEtaCuts[]{1.2, 0.6, 0.7}; for (const auto& track : tracks) { - if (track.trackType() == 255 && std::abs(track.eta()) < 1.2) { // tracklet - if (std::abs(track.eta()) < 0.6) + if (track.trackType() == o2::aod::track::TrackTypeEnum::Run2Tracklet && std::abs(track.eta()) < tklEtaCuts[0]) { // tracklet + if (std::abs(track.eta()) < tklEtaCuts[1]) nTracklets[0]++; - else if (std::abs(track.eta()) > 0.7) + else if (std::abs(track.eta()) > tklEtaCuts[2]) nTracklets[1]++; } @@ -692,6 +703,8 @@ struct ebyeMaker { } histos.fill(HIST("QA/tpcSignal"), track.tpcInnerParam(), track.tpcSignal()); + nTracks++; + for (int iP{0}; iP < kNpart; ++iP) { if (trackPt < ptMin[iP] || trackPt > ptMax[iP]) { continue; @@ -711,7 +724,8 @@ struct ebyeMaker { float beta{track.hasTOF() ? track.length() / (track.tofSignal() - track.tofEvTime()) * o2::constants::physics::invLightSpeedCm2PS : -999.f}; beta = std::min(1.f - 1.e-6f, std::max(1.e-4f, beta)); float mass{track.tpcInnerParam() * std::sqrt(1.f / (beta * beta) - 1.f)}; - bool hasTof = track.hasTOF() && track.tofChi2() < 3; + const float maxTofChi2 = 3.f; + bool hasTof = track.hasTOF() && track.tofChi2() < maxTofChi2; if (trackPt <= ptTof[iP] || (trackPt > ptTof[iP] && hasTof && std::abs(mass - partMass[iP]) < tofMassMaxQA)) { // for QA histograms if (nSigmaTPC > nSigmaTpcCutLow[iP] && nSigmaTPC < nSigmaTpcCutUp[iP]) { @@ -752,6 +766,7 @@ struct ebyeMaker { if (doprocessRun2 || doprocessMcRun2 || doprocessMiniRun2 || doprocessMiniMcRun2) { histos.fill(HIST("QA/nTrklCorrelation"), nTracklets[0], nTracklets[1]); nTrackletsColl = nTracklets[1]; + nTracksColl = nTracks; } if (lambdaPtMax > lambdaPtMin) { @@ -823,7 +838,7 @@ struct ebyeMaker { auto nSigmaTPCNeg = static_cast((negTrack.tpcSignal() - expBetheNeg) / expSigmaNeg); float tpcSigPr = matter ? posTrack.tpcSignal() : negTrack.tpcSignal(); - if (std::abs(nSigmaTPCPos) > v0setting_nsigmatpc || std::abs(nSigmaTPCNeg) > v0setting_nsigmatpc) { + if (std::abs(nSigmaTPCPos) > v0settingNSigmaTpc || std::abs(nSigmaTPCNeg) > v0settingNSigmaTpc) { continue; } @@ -833,7 +848,7 @@ struct ebyeMaker { } float dcaV0dau = std::sqrt(fitter.getChi2AtPCACandidate()); - if (dcaV0dau > v0setting_dcav0dau) { + if (dcaV0dau > v0settingDcaV0Dau) { continue; } @@ -841,41 +856,41 @@ struct ebyeMaker { const auto& vtx = fitter.getPCACandidate(); float radiusV0 = std::hypot(vtx[0], vtx[1]); - if (radiusV0 < v0setting_radius || radiusV0 > v0radiusMax) { + if (radiusV0 < v0settingRadius || radiusV0 > v0radiusMax) { continue; } - float dcaV0Pv = CalculateDCAStraightToPV( + float dcaV0Pv = calculateDCAStraightToPV( vtx[0], vtx[1], vtx[2], momPos[0] + momNeg[0], momPos[1] + momNeg[1], momPos[2] + momNeg[2], collision.posX(), collision.posY(), collision.posZ()); - if (std::abs(dcaV0Pv) > v0setting_dcav0pv) { + if (std::abs(dcaV0Pv) > v0settingDcaV0Pv) { continue; } double cosPA = RecoDecay::cpa(primVtx, vtx, momV0); - if (cosPA < v0setting_cospa) { + if (cosPA < v0settingCosPa) { continue; } auto ptotal = RecoDecay::sqrtSumOfSquares(momV0[0], momV0[1], momV0[2]); auto lengthTraveled = RecoDecay::sqrtSumOfSquares(vtx[0] - primVtx[0], vtx[1] - primVtx[1], vtx[2] - primVtx[2]); - float ML2P_Lambda = o2::constants::physics::MassLambda * lengthTraveled / ptotal; - if (ML2P_Lambda > v0setting_lifetime) { + float mL2PLambda = o2::constants::physics::MassLambda * lengthTraveled / ptotal; + if (mL2PLambda > v0settingLifetime) { continue; } o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, posTrackCov, 2.f, fitter.getMatCorrType(), &dcaInfo); auto posDcaToPv = std::hypot(dcaInfo[0], dcaInfo[1]); - if (posDcaToPv < v0setting_dcadaughtopv && std::abs(dcaInfo[0]) < v0setting_dcadaughtopv) { + if (posDcaToPv < v0settingDcaDaughToPv && std::abs(dcaInfo[0]) < v0settingDcaDaughToPv) { continue; } o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, negTrackCov, 2.f, fitter.getMatCorrType(), &dcaInfo); auto negDcaToPv = std::hypot(dcaInfo[0], dcaInfo[1]); - if (negDcaToPv < v0setting_dcadaughtopv && std::abs(dcaInfo[0]) < v0setting_dcadaughtopv) { + if (negDcaToPv < v0settingDcaDaughToPv && std::abs(dcaInfo[0]) < v0settingDcaDaughToPv) { continue; } @@ -910,7 +925,7 @@ struct ebyeMaker { fillRecoEvent(collision, tracks, V0s, centrality); for (int iP{0}; iP < kNpart; ++iP) { - for (auto& candidateTrack : candidateTracks[iP]) { + for (auto& candidateTrack : candidateTracks[iP]) { // o2-linter: disable=const-ref-in-for-loop (not a const ref) candidateTrack.isreco = true; auto mcLab = mcLabels.rawIteratorAt(candidateTrack.globalIndex); @@ -940,7 +955,7 @@ struct ebyeMaker { } } } - for (auto& candidateV0 : candidateV0s) { + for (auto& candidateV0 : candidateV0s) { // o2-linter: disable=const-ref-in-for-loop (not a const ref) candidateV0.isreco = true; auto mcLabPos = mcLabels.rawIteratorAt(candidateV0.globalIndexPos); auto mcLabNeg = mcLabels.rawIteratorAt(candidateV0.globalIndexNeg); @@ -949,13 +964,13 @@ struct ebyeMaker { auto mcTrackPos = mcLabPos.template mcParticle_as(); auto mcTrackNeg = mcLabNeg.template mcParticle_as(); if (mcTrackPos.has_mothers() && mcTrackNeg.has_mothers()) { - for (auto& negMother : mcTrackNeg.template mothers_as()) { - for (auto& posMother : mcTrackPos.template mothers_as()) { + for (const auto& negMother : mcTrackNeg.template mothers_as()) { + for (const auto& posMother : mcTrackPos.template mothers_as()) { if (posMother.globalIndex() != negMother.globalIndex()) continue; - if (!((mcTrackPos.pdgCode() == 2212 && mcTrackNeg.pdgCode() == -211) || (mcTrackPos.pdgCode() == 211 && mcTrackNeg.pdgCode() == -2212))) + if (!((mcTrackPos.pdgCode() == PDG_t::kProton && mcTrackNeg.pdgCode() == PDG_t::kPiMinus) || (mcTrackPos.pdgCode() == PDG_t::kPiPlus && mcTrackNeg.pdgCode() == PDG_t::kProtonBar))) continue; - if (std::abs(posMother.pdgCode()) != 3122) { + if (std::abs(posMother.pdgCode()) != PDG_t::kLambda0) { continue; } if (!posMother.isPhysicalPrimary() && !posMother.has_mothers()) @@ -977,8 +992,8 @@ struct ebyeMaker { void fillMcGen(aod::McParticles const& mcParticles, aod::McTrackLabels const& /*mcLab*/, uint64_t const& collisionId) { - auto mcParticles_thisCollision = mcParticles.sliceBy(perCollisionMcParts, collisionId); - for (auto& mcPart : mcParticles_thisCollision) { + auto mcParticlesThisCollision = mcParticles.sliceBy(perCollisionMcParts, collisionId); + for (const auto& mcPart : mcParticlesThisCollision) { auto genEta = mcPart.eta(); if (std::abs(genEta) > etaMax) { continue; @@ -986,12 +1001,12 @@ struct ebyeMaker { if (((mcPart.flags() & 0x8) && (doprocessMcRun2 || doprocessMiniMcRun2)) || (mcPart.flags() & 0x2) || ((mcPart.flags() & 0x1) && !doprocessMiniMcRun2)) continue; auto pdgCode = mcPart.pdgCode(); - if (std::abs(pdgCode) == 3122) { + if (std::abs(pdgCode) == PDG_t::kLambda0) { if (!mcPart.isPhysicalPrimary() && !mcPart.has_mothers()) continue; bool foundPr = false; - for (auto& mcDaught : mcPart.daughters_as()) { - if (std::abs(mcDaught.pdgCode()) == 2212) { + for (const auto& mcDaught : mcPart.daughters_as()) { + if (std::abs(mcDaught.pdgCode()) == PDG_t::kProton) { foundPr = true; break; } @@ -1056,19 +1071,19 @@ struct ebyeMaker { histos.fill(HIST("QA/zVtx"), collision.posZ()); const uint64_t collIdx = collision.globalIndex(); - auto V0Table_thisCollision = V0s.sliceBy(perCollisionV0, collIdx); - V0Table_thisCollision.bindExternalIndices(&tracks); + auto v0TableThisCollision = V0s.sliceBy(perCollisionV0, collIdx); + v0TableThisCollision.bindExternalIndices(&tracks); auto multiplicity = collision.multFT0C(); auto centrality = collision.centFT0C(); - fillRecoEvent(collision, tracks, V0Table_thisCollision, centrality); + fillRecoEvent(collision, tracks, v0TableThisCollision, centrality); histos.fill(HIST("QA/PvMultVsCent"), centrality, collision.numContrib()); histos.fill(HIST("QA/MultVsCent"), centrality, multiplicity); collisionEbyeTable(centrality, collision.posZ()); - for (auto& candidateV0 : candidateV0s) { + for (const auto& candidateV0 : candidateV0s) { lambdaEbyeTable( collisionEbyeTable.lastIndex(), candidateV0.pt, @@ -1086,7 +1101,7 @@ struct ebyeMaker { } for (int iP{0}; iP < kNpart; ++iP) { - for (auto& candidateTrack : candidateTracks[iP]) { // deuterons + protons + for (const auto& candidateTrack : candidateTracks[iP]) { // deuterons + protons nucleiEbyeTable( collisionEbyeTable.lastIndex(), candidateTrack.pt, @@ -1100,7 +1115,7 @@ struct ebyeMaker { } } } - PROCESS_SWITCH(ebyeMaker, processRun3, "process (Run 3)", false); + PROCESS_SWITCH(EbyeMaker, processRun3, "process (Run 3)", false); void processRun2(soa::Join const& collisions, TracksFull const& tracks, aod::V0s const& V0s, aod::FV0As const& fv0as, aod::FV0Cs const& fv0cs, BCsWithRun2Info const&) { @@ -1121,7 +1136,8 @@ struct ebyeMaker { float cV0M = 105.f; if (Run2V0MInfo.mCalibrationStored) { cV0M = Run2V0MInfo.mhMultSelCalib->GetBinContent(Run2V0MInfo.mhMultSelCalib->FindFixBin(v0m)); - if (!(collision.sel7() && collision.alias_bit(kINT7)) && (!kINT7Intervals || (kINT7Intervals && ((cV0M >= 10 && cV0M < 30) || cV0M > 50)))) + const float centTriggerEdges[]{10.f, 30.f, 50.f}; + if (!(collision.sel7() && collision.alias_bit(kINT7)) && (!kINT7Intervals || (kINT7Intervals && ((cV0M >= centTriggerEdges[0] && cV0M < centTriggerEdges[1]) || cV0M > centTriggerEdges[2])))) continue; } @@ -1142,18 +1158,18 @@ struct ebyeMaker { histos.fill(HIST("QA/zVtx"), collision.posZ()); const uint64_t collIdx = collision.globalIndex(); - auto V0Table_thisCollision = V0s.sliceBy(perCollisionV0, collIdx); - V0Table_thisCollision.bindExternalIndices(&tracks); + auto v0TableThisCollision = V0s.sliceBy(perCollisionV0, collIdx); + v0TableThisCollision.bindExternalIndices(&tracks); auto multTracklets = collision.multTracklets(); - fillRecoEvent(collision, tracks, V0Table_thisCollision, cV0M); + fillRecoEvent(collision, tracks, v0TableThisCollision, cV0M); histos.fill(HIST("QA/V0MvsCL0"), centralityCl0, cV0M); histos.fill(HIST("QA/trackletsVsV0M"), cV0M, multTracklets); collisionEbyeTable(cV0M, collision.posZ()); - for (auto& candidateV0 : candidateV0s) { + for (const auto& candidateV0 : candidateV0s) { lambdaEbyeTable( collisionEbyeTable.lastIndex(), candidateV0.pt, @@ -1171,7 +1187,7 @@ struct ebyeMaker { } for (int iP{0}; iP < kNpart; ++iP) { - for (auto& candidateTrack : candidateTracks[iP]) { // deuterons + protons + for (const auto& candidateTrack : candidateTracks[iP]) { // deuterons + protons nucleiEbyeTable( collisionEbyeTable.lastIndex(), candidateTrack.pt, @@ -1185,7 +1201,7 @@ struct ebyeMaker { } } } - PROCESS_SWITCH(ebyeMaker, processRun2, "process (Run 2)", false); + PROCESS_SWITCH(EbyeMaker, processRun2, "process (Run 2)", false); void processMiniRun2(soa::Join const& collisions, TracksFullPID const& tracks, aod::Run2TrackExtras const& trackExtraRun2, aod::FV0As const& fv0as, aod::FV0Cs const& fv0cs, aod::V0s const& V0s, BCsWithRun2Info const&) { @@ -1207,7 +1223,8 @@ struct ebyeMaker { continue; float v0m = getV0M(bc.globalIndex(), collision.posZ(), fv0as, fv0cs); - float cV0M = 105.f; + float maxV0M = 105.f; + float cV0M = maxV0M; if (Run2V0MInfo.mCalibrationStored) { cV0M = Run2V0MInfo.mhMultSelCalib->GetBinContent(Run2V0MInfo.mhMultSelCalib->FindFixBin(v0m)); } @@ -1215,16 +1232,16 @@ struct ebyeMaker { histos.fill(HIST("QA/zVtx"), collision.posZ()); const uint64_t collIdx = collision.globalIndex(); - auto V0Table_thisCollision = V0s.sliceBy(perCollisionV0, collIdx); - V0Table_thisCollision.bindExternalIndices(&tracks); + auto v0TableThisCollision = V0s.sliceBy(perCollisionV0, collIdx); + v0TableThisCollision.bindExternalIndices(&tracks); - fillRecoEvent(collision, tracks, V0Table_thisCollision, cV0M); + fillRecoEvent(collision, tracks, v0TableThisCollision, cV0M); uint8_t trigger = collision.alias_bit(kINT7) ? 0x1 : 0x0; - for (auto& classId : classIds) { + for (const auto& classId : classIds) { if (bc.triggerMask() & BIT(classId)) { trigger |= 0x2; - cV0M = cV0M < 104.f ? cV0M * 100. : cV0M; + cV0M = cV0M < (maxV0M - 1.f) ? cV0M * 100. : cV0M; break; } } @@ -1234,9 +1251,9 @@ struct ebyeMaker { if (triggerCut != 0x0 && (trigger & triggerCut) != triggerCut) { continue; } - miniCollTable(static_cast(collision.posZ() * 10), trigger, nTrackletsColl, cV0M); + miniCollTable(static_cast(collision.posZ() * 10), trigger, storeTracksNum ? nTracksColl : nTrackletsColl, cV0M); - for (auto& candidateTrack : candidateTracks[0]) { // protons + for (auto& candidateTrack : candidateTracks[0]) { // o2-linter: disable=const-ref-in-for-loop (not a const ref) auto tk = tracks.rawIteratorAt(candidateTrack.globalIndex); float outerPID = getOuterPID(tk); auto [itsSignal, nSigmaITS] = getITSSignal(tk, trackExtraRun2); @@ -1255,11 +1272,11 @@ struct ebyeMaker { } } } - PROCESS_SWITCH(ebyeMaker, processMiniRun2, "process mini tables(Run 2)", false); + PROCESS_SWITCH(EbyeMaker, processMiniRun2, "process mini tables(Run 2)", false); void processMcRun3(soa::Join const& collisions, aod::McCollisions const& /*mcCollisions*/, TracksFullIU const& tracks, aod::V0s const& V0s, aod::McParticles const& mcParticles, aod::McTrackLabels const& mcLab, aod::BCsWithTimestamps const&) { - for (auto& collision : collisions) { + for (const auto& collision : collisions) { auto bc = collision.bc_as(); initCCDB(bc); @@ -1277,15 +1294,15 @@ struct ebyeMaker { histos.fill(HIST("QA/zVtx"), collision.posZ()); const uint64_t collIdx = collision.globalIndex(); - auto V0Table_thisCollision = V0s.sliceBy(perCollisionV0, collIdx); - V0Table_thisCollision.bindExternalIndices(&tracks); + auto v0TableThisCollision = V0s.sliceBy(perCollisionV0, collIdx); + v0TableThisCollision.bindExternalIndices(&tracks); - fillMcEvent(collision, tracks, V0Table_thisCollision, centrality, mcParticles, mcLab); + fillMcEvent(collision, tracks, v0TableThisCollision, centrality, mcParticles, mcLab); fillMcGen(mcParticles, mcLab, collision.mcCollisionId()); collisionEbyeTable(centrality, collision.posZ()); - for (auto& candidateV0 : candidateV0s) { + for (const auto& candidateV0 : candidateV0s) { mcLambdaEbyeTable( collisionEbyeTable.lastIndex(), candidateV0.pt, @@ -1307,7 +1324,7 @@ struct ebyeMaker { } for (int iP{0}; iP < kNpart; ++iP) { - for (auto& candidateTrack : candidateTracks[iP]) { // deuterons + protons + for (const auto& candidateTrack : candidateTracks[iP]) { // deuterons + protons mcNucleiEbyeTable( collisionEbyeTable.lastIndex(), candidateTrack.pt, @@ -1325,11 +1342,11 @@ struct ebyeMaker { } } } - PROCESS_SWITCH(ebyeMaker, processMcRun3, "process MC (Run 3)", false); + PROCESS_SWITCH(EbyeMaker, processMcRun3, "process MC (Run 3)", false); void processMcRun2(soa::Join const& collisions, aod::McCollisions const& /*mcCollisions*/, TracksFull const& tracks, aod::V0s const& V0s, aod::FV0As const& fv0as, aod::FV0Cs const& fv0cs, aod::McParticles const& mcParticles, aod::McTrackLabels const& mcLab, BCsWithRun2Info const&) { - for (auto& collision : collisions) { + for (const auto& collision : collisions) { auto bc = collision.bc_as(); initCCDB(bc); @@ -1348,15 +1365,15 @@ struct ebyeMaker { histos.fill(HIST("QA/zVtx"), collision.posZ()); const uint64_t collIdx = collision.globalIndex(); - auto V0Table_thisCollision = V0s.sliceBy(perCollisionV0, collIdx); - V0Table_thisCollision.bindExternalIndices(&tracks); + auto v0TableThisCollision = V0s.sliceBy(perCollisionV0, collIdx); + v0TableThisCollision.bindExternalIndices(&tracks); - fillMcEvent(collision, tracks, V0Table_thisCollision, cV0M, mcParticles, mcLab); + fillMcEvent(collision, tracks, v0TableThisCollision, cV0M, mcParticles, mcLab); fillMcGen(mcParticles, mcLab, collision.mcCollisionId()); collisionEbyeTable(cV0M, collision.posZ()); - for (auto& candidateV0 : candidateV0s) { + for (const auto& candidateV0 : candidateV0s) { mcLambdaEbyeTable( collisionEbyeTable.lastIndex(), candidateV0.pt, @@ -1378,7 +1395,7 @@ struct ebyeMaker { } for (int iP{0}; iP < kNpart; ++iP) { - for (auto& candidateTrack : candidateTracks[iP]) { // deuterons + protons + for (const auto& candidateTrack : candidateTracks[iP]) { // deuterons + protons mcNucleiEbyeTable( collisionEbyeTable.lastIndex(), candidateTrack.pt, @@ -1396,7 +1413,7 @@ struct ebyeMaker { } } } - PROCESS_SWITCH(ebyeMaker, processMcRun2, "process MC (Run 2)", false); + PROCESS_SWITCH(EbyeMaker, processMcRun2, "process MC (Run 2)", false); void processMiniMcRun2(soa::Join const& collisions, aod::McCollisions const& /*mcCollisions*/, TracksFullPID const& tracks, aod::Run2TrackExtras const& trackExtraRun2, aod::FV0As const& fv0as, aod::FV0Cs const& fv0cs, aod::V0s const& V0s, aod::McParticles const& mcParticles, aod::McTrackLabels const& mcLab, BCsWithRun2Info const&) { @@ -1420,15 +1437,15 @@ struct ebyeMaker { histos.fill(HIST("QA/zVtx"), collision.posZ()); const uint64_t collIdx = collision.globalIndex(); - auto V0Table_thisCollision = V0s.sliceBy(perCollisionV0, collIdx); - V0Table_thisCollision.bindExternalIndices(&tracks); + auto v0TableThisCollision = V0s.sliceBy(perCollisionV0, collIdx); + v0TableThisCollision.bindExternalIndices(&tracks); - fillMcEvent(collision, tracks, V0Table_thisCollision, cV0M, mcParticles, mcLab); + fillMcEvent(collision, tracks, v0TableThisCollision, cV0M, mcParticles, mcLab); fillMcGen(mcParticles, mcLab, collision.mcCollisionId()); - miniCollTable(static_cast(collision.posZ() * 10), 0x0, nTrackletsColl, cV0M); + miniCollTable(static_cast(collision.posZ() * 10), 0x0, storeTracksNum ? nTracksColl : nTrackletsColl, cV0M); - for (auto& candidateTrack : candidateTracks[0]) { // protons + for (auto& candidateTrack : candidateTracks[0]) { // o2-linter: disable=const-ref-in-for-loop (not a const ref) int selMask = -1; if (candidateTrack.isreco) { auto tk = tracks.rawIteratorAt(candidateTrack.globalIndex); @@ -1459,11 +1476,11 @@ struct ebyeMaker { } } } - PROCESS_SWITCH(ebyeMaker, processMiniMcRun2, "process mini tables for mc(Run 2)", false); + PROCESS_SWITCH(EbyeMaker, processMiniMcRun2, "process mini tables for mc(Run 2)", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc)}; + adaptAnalysisTask(cfgc)}; } From 95079aac2673dbd24d79ed46694b0a100d866821 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Tue, 13 May 2025 22:40:51 +0900 Subject: [PATCH 1260/1650] [PWGEM/Dilepton] update matchingMFT.cxx (#11176) --- PWGEM/Dilepton/Tasks/matchingMFT.cxx | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/PWGEM/Dilepton/Tasks/matchingMFT.cxx b/PWGEM/Dilepton/Tasks/matchingMFT.cxx index 138a6325e1e..60431fb3826 100644 --- a/PWGEM/Dilepton/Tasks/matchingMFT.cxx +++ b/PWGEM/Dilepton/Tasks/matchingMFT.cxx @@ -74,6 +74,7 @@ struct matchingMFT { Configurable minNclustersMFT{"minNclustersMFT", 5, "min nclusters MFT"}; Configurable refitGlobalMuon{"refitGlobalMuon", true, "flag to refit global muon"}; Configurable requireTrueAssociation{"requireTrueAssociation", false, "flag to require true mc collision association"}; + Configurable maxRelDPt{"maxRelDPt", 1e+10f, "max. relative dpt between MFT-MCH-MID and MCH-MID"}; Configurable maxDEta{"maxDEta", 1e+10f, "max. deta between MFT-MCH-MID and MCH-MID"}; Configurable maxDPhi{"maxDPhi", 1e+10f, "max. dphi between MFT-MCH-MID and MCH-MID"}; Configurable requireMFTHitMap{"requireMFTHitMap", false, "flag to require MFT hit map"}; @@ -154,7 +155,7 @@ struct matchingMFT { fRegistry.add("MFTMCHMID/primary/correct/hPt", "pT;p_{T} (GeV/c)", kTH1F, {{100, 0.0f, 10}}, false); fRegistry.add("MFTMCHMID/primary/correct/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {80, -5.f, -1.f}}, false); fRegistry.add("MFTMCHMID/primary/correct/hEtaPhi_MatchedMCHMID", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {80, -5.f, -1.f}}, false); - fRegistry.add("MFTMCHMID/primary/correct/hsDelta", "diff. between GL and associated SA;p_{T}^{gl} (GeV/c);#Delta#eta;#Delta#varphi (rad.);", kTHnSparseF, {axis_pt, {100, -0.5, +0.5}, {90, -M_PI / 4, M_PI / 4}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hsDelta", "diff. between GL and associated SA;p_{T}^{gl} (GeV/c);(p_{T}^{sa} - p_{T}^{gl})/p_{T}^{gl};#Delta#eta;#Delta#varphi (rad.);", kTHnSparseF, {axis_pt, {100, -0.5, +0.5}, {100, -0.5, +0.5}, {90, -M_PI / 4, M_PI / 4}}, false); fRegistry.add("MFTMCHMID/primary/correct/hDiffCollId", "difference in collision index;collisionId_{TTCA} - collisionId_{MP}", kTH1F, {{41, -20.5, +20.5}}, false); fRegistry.add("MFTMCHMID/primary/correct/hSign", "sign;sign", kTH1F, {{3, -1.5, +1.5}}, false); fRegistry.add("MFTMCHMID/primary/correct/hNclusters", "Nclusters;Nclusters", kTH1F, {{21, -0.5f, 20.5}}, false); @@ -320,13 +321,15 @@ struct matchingMFT { float sigma_dcaXY = dcaXY / dcaXYinSigma; o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToVertex); + float ptMatchedMCHMID = propmuonAtPV_Matched.getPt(); float etaMatchedMCHMID = propmuonAtPV_Matched.getEta(); float phiMatchedMCHMID = propmuonAtPV_Matched.getPhi(); o2::math_utils::bringTo02Pi(phiMatchedMCHMID); + float dpt = (ptMatchedMCHMID - pt) / pt; float deta = etaMatchedMCHMID - eta; float dphi = phiMatchedMCHMID - phi; o2::math_utils::bringToPMPi(dphi); - if (std::sqrt(std::pow(deta / maxDEta, 2) + std::pow(dphi / maxDPhi, 2)) > 1.f) { + if (std::sqrt(std::pow(deta / maxDEta, 2) + std::pow(dphi / maxDPhi, 2)) > 1.f || std::fabs(dpt) > maxRelDPt) { return; } @@ -368,7 +371,7 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/primary/correct/hPt"), pt); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hEtaPhi"), phi, eta); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); - fRegistry.fill(HIST("MFTMCHMID/primary/correct/hsDelta"), pt, deta, dphi); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hsDelta"), pt, dpt, deta, dphi); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hSign"), fwdtrack.sign()); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hNclusters"), fwdtrack.nClusters()); @@ -402,7 +405,7 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hPt"), pt); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hEtaPhi"), phi, eta); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); - fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hsDelta"), pt, deta, dphi); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hsDelta"), pt, dpt, deta, dphi); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hSign"), fwdtrack.sign()); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hNclusters"), fwdtrack.nClusters()); @@ -437,7 +440,7 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hPt"), pt); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hEtaPhi"), phi, eta); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); - fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hsDelta"), pt, deta, dphi); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hsDelta"), pt, dpt, deta, dphi); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hSign"), fwdtrack.sign()); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hNclusters"), fwdtrack.nClusters()); @@ -470,7 +473,7 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hPt"), pt); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hEtaPhi"), phi, eta); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); - fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hsDelta"), pt, deta, dphi); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hsDelta"), pt, dpt, deta, dphi); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hSign"), fwdtrack.sign()); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hNclusters"), fwdtrack.nClusters()); From 361c24acc67c82a2c77a834720259ab092db2921 Mon Sep 17 00:00:00 2001 From: Mingze Li Date: Tue, 13 May 2025 17:06:38 +0200 Subject: [PATCH 1261/1650] [PWGHF] Add derived-data creator for D* -> D0 pi (#11147) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Vít Kučera --- PWGHF/DataModel/DerivedTables.h | 68 +++- PWGHF/TableProducer/CMakeLists.txt | 4 + .../derivedDataCreatorDstarToD0Pi.cxx | 372 ++++++++++++++++++ 3 files changed, 443 insertions(+), 1 deletion(-) create mode 100644 PWGHF/TableProducer/derivedDataCreatorDstarToD0Pi.cxx diff --git a/PWGHF/DataModel/DerivedTables.h b/PWGHF/DataModel/DerivedTables.h index 6900ef25039..19f8d30ddbe 100644 --- a/PWGHF/DataModel/DerivedTables.h +++ b/PWGHF/DataModel/DerivedTables.h @@ -39,7 +39,7 @@ namespace o2::aod // composite species // B0 → D− π+ (todo) // B+ → D0 π+ -// D*+ → D0 π+ (todo) +// D*+ → D0 π+ // ================ // Collision tables @@ -274,6 +274,7 @@ DECLARE_TABLES_2P(D0, "D0", d0, 2); DECLARE_TABLES_3P(Lc, "LC", lc, 3); DECLARE_TABLES_3P(Dplus, "DP", dplus, 4); DECLARE_TABLES_3P(Bplus, "BP", bplus, 5); +DECLARE_TABLES_3P(Dstar, "DST", dstar, 6); // ================ // Additional species-specific candidate tables @@ -302,6 +303,15 @@ DECLARE_SOA_COLUMN(PtProng0, ptProng0, float); DECLARE_SOA_COLUMN(PtProng1, ptProng1, float); //! transverse momentum of prong 1 DECLARE_SOA_COLUMN(PtProng2, ptProng2, float); //! transverse momentum of prong 2 DECLARE_SOA_COLUMN(RSecondaryVertex, rSecondaryVertex, float); //! distance of the secondary vertex from the z axis +// D*± → D0(bar) π± +DECLARE_SOA_COLUMN(MassD0, massD0, float); //! invariant mass of D0 +DECLARE_SOA_COLUMN(CpaD0, cpaD0, float); //! cosine of pointing angle of D0 +DECLARE_SOA_COLUMN(CpaXYD0, cpaXYD0, float); //! cosine of pointing angle in the transverse plane of D0 +DECLARE_SOA_COLUMN(DecayLengthD0, decayLengthD0, float); //! decay length of D0 +DECLARE_SOA_COLUMN(DecayLengthXYD0, decayLengthXYD0, float); //! decay length in the transverse plane of D0 +DECLARE_SOA_COLUMN(DecayLengthNormalisedD0, decayLengthNormalisedD0, float); //! decay length of D0 divided by its uncertainty +DECLARE_SOA_COLUMN(DecayLengthXYNormalisedD0, decayLengthXYNormalisedD0, float); //! decay length in the transverse plane of D0 divided by its uncertainty +DECLARE_SOA_COLUMN(NormalisedImpParamSoftPi, normalisedImpParamSoftPi, float); //! impact parameter of soft pion divided by its uncertainty // TOF DECLARE_SOA_COLUMN(NSigTofKa0, nSigTofKa0, float); DECLARE_SOA_COLUMN(NSigTofKa1, nSigTofKa1, float); @@ -316,6 +326,7 @@ DECLARE_SOA_COLUMN(NSigTofPiExpKa, nSigTofPiExpKa, float); DECLARE_SOA_COLUMN(NSigTofPr0, nSigTofPr0, float); DECLARE_SOA_COLUMN(NSigTofPr1, nSigTofPr1, float); DECLARE_SOA_COLUMN(NSigTofPr2, nSigTofPr2, float); +DECLARE_SOA_COLUMN(NSigTofPiSoftPi, nSigTofPiSoftPi, float); // TPC DECLARE_SOA_COLUMN(NSigTpcKa0, nSigTpcKa0, float); DECLARE_SOA_COLUMN(NSigTpcKa1, nSigTpcKa1, float); @@ -330,6 +341,7 @@ DECLARE_SOA_COLUMN(NSigTpcPiExpKa, nSigTpcPiExpKa, float); DECLARE_SOA_COLUMN(NSigTpcPr0, nSigTpcPr0, float); DECLARE_SOA_COLUMN(NSigTpcPr1, nSigTpcPr1, float); DECLARE_SOA_COLUMN(NSigTpcPr2, nSigTpcPr2, float); +DECLARE_SOA_COLUMN(NSigTpcPiSoftPi, nSigTpcPiSoftPi, float); // TPC+TOF DECLARE_SOA_COLUMN(NSigTpcTofKa0, nSigTpcTofKa0, float); DECLARE_SOA_COLUMN(NSigTpcTofKa1, nSigTpcTofKa1, float); @@ -344,6 +356,7 @@ DECLARE_SOA_COLUMN(NSigTpcTofPiExpKa, nSigTpcTofPiExpKa, float); DECLARE_SOA_COLUMN(NSigTpcTofPr0, nSigTpcTofPr0, float); DECLARE_SOA_COLUMN(NSigTpcTofPr1, nSigTpcTofPr1, float); DECLARE_SOA_COLUMN(NSigTpcTofPr2, nSigTpcTofPr2, float); +DECLARE_SOA_COLUMN(NSigTpcTofPiSoftPi, nSigTpcTofPiSoftPi, float); } // namespace hf_cand_par // Candidate properties of the charm daughter candidate used for selection of the beauty candidate @@ -731,6 +744,59 @@ DECLARE_SOA_TABLE_STAGED(HfDplusMcs, "HFDPMC", //! Table with MC candidate info hf_cand_mc::FlagMcDecayChanRec, o2::soa::Marker); +// ---------------- +// D*+ +// ---------------- + +DECLARE_SOA_TABLE_STAGED(HfDstarPars, "HFDSTARPAR", //! Table with candidate properties used for selection + hf_cand_dstar::Chi2PCAD0, + hf_cand_par::CpaD0, + hf_cand_par::CpaXYD0, + hf_cand_par::DecayLengthD0, + hf_cand_par::DecayLengthXYD0, + hf_cand_par::DecayLengthNormalisedD0, + hf_cand_par::DecayLengthXYNormalisedD0, + hf_cand::PxProng0, + hf_cand::PyProng0, + hf_cand::PzProng0, + hf_cand::PxProng1, + hf_cand::PyProng1, + hf_cand::PzProng1, + hf_cand_dstar::PxD0, + hf_cand_dstar::PyD0, + hf_cand_dstar::PzD0, + hf_cand_dstar::PxSoftPi, + hf_cand_dstar::PySoftPi, + hf_cand_dstar::PzSoftPi, + hf_cand_dstar::PtSoftPi, + hf_cand_dstar::SignSoftPi, + hf_cand_dstar::PtD0, + hf_cand_par::MassD0, + hf_cand::ImpactParameter0, + hf_cand::ImpactParameter1, + hf_cand_dstar::ImpParamSoftPi, + hf_cand_par::ImpactParameterNormalised0, + hf_cand_par::ImpactParameterNormalised1, + hf_cand_par::NormalisedImpParamSoftPi, + hf_cand_par::NSigTpcPi0, + hf_cand_par::NSigTofPi0, + hf_cand_par::NSigTpcTofPi0, + hf_cand_par::NSigTpcKa1, + hf_cand_par::NSigTofKa1, + hf_cand_par::NSigTpcTofKa1, + hf_cand_par::NSigTpcPiSoftPi, + hf_cand_par::NSigTofPiSoftPi, + hf_cand_par::NSigTpcTofPiSoftPi, + o2::soa::Marker); + +DECLARE_SOA_TABLE_STAGED(HfDstarMls, "HFDSTARML", //! Table with candidate selection ML scores + hf_cand_mc::MlScores, + o2::soa::Marker); + +DECLARE_SOA_TABLE_STAGED(HfDstarMcs, "HFDSTARMC", //! Table with MC candidate info + hf_cand_mc::FlagMcMatchRec, + hf_cand_mc::OriginMcRec, + o2::soa::Marker); } // namespace o2::aod #endif // PWGHF_DATAMODEL_DERIVEDTABLES_H_ diff --git a/PWGHF/TableProducer/CMakeLists.txt b/PWGHF/TableProducer/CMakeLists.txt index 3edd7076106..929e6a4c22b 100644 --- a/PWGHF/TableProducer/CMakeLists.txt +++ b/PWGHF/TableProducer/CMakeLists.txt @@ -315,6 +315,10 @@ o2physics_add_dpl_workflow(derived-data-creator-lc-to-p-k-pi PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(derived-data-creator-dstar-to-d0-pi + SOURCES derivedDataCreatorDstarToD0Pi.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) # Converters o2physics_add_dpl_workflow(converter-dstar-indices diff --git a/PWGHF/TableProducer/derivedDataCreatorDstarToD0Pi.cxx b/PWGHF/TableProducer/derivedDataCreatorDstarToD0Pi.cxx new file mode 100644 index 00000000000..084605c2f3b --- /dev/null +++ b/PWGHF/TableProducer/derivedDataCreatorDstarToD0Pi.cxx @@ -0,0 +1,372 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file derivedDataCreatorDstarToD0Pi.cxx +/// \brief Producer of derived tables of D*+ candidates, collisions and MC particles +/// \note Based on derivedDataCreatorLcToPKPi.cxx +/// +/// \author Mingze Li , CCNU + +#include +#include +#include + +#include "CommonConstants/PhysicsConstants.h" +#include "Framework/AnalysisTask.h" +#include "Framework/runDataProcessing.h" + +#include "Common/Core/RecoDecay.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/Multiplicity.h" + +#include "PWGLF/DataModel/mcCentrality.h" + +#include "PWGHF/DataModel/CandidateReconstructionTables.h" +#include "PWGHF/DataModel/CandidateSelectionTables.h" +#include "PWGHF/DataModel/DerivedTables.h" +#include "PWGHF/Utils/utilsDerivedData.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::analysis::hf_derived; + +/// Writes the full information in an output TTree +struct HfDerivedDataCreatorDstarToD0Pi { + HfProducesDerivedData< + o2::aod::HfDstarBases, + o2::aod::HfDstarCollBases, + o2::aod::HfDstarCollIds, + o2::aod::HfDstarMcCollBases, + o2::aod::HfDstarMcCollIds, + o2::aod::HfDstarMcRCollIds, + o2::aod::HfDstarPBases, + o2::aod::HfDstarPIds> + rowsCommon; + // Candidates + Produces rowCandidatePar; + Produces rowCandidateSel; + Produces rowCandidateMl; + Produces rowCandidateId; + Produces rowCandidateMc; + + // Switches for filling tables + HfConfigurableDerivedData confDerData; + Configurable fillCandidatePar{"fillCandidatePar", true, "Fill candidate parameters"}; + Configurable fillCandidateSel{"fillCandidateSel", true, "Fill candidate selection flags"}; + Configurable fillCandidateMl{"fillCandidateMl", true, "Fill candidate selection ML scores"}; + Configurable fillCandidateId{"fillCandidateId", true, "Fill original indices from the candidate table"}; + Configurable fillCandidateMc{"fillCandidateMc", true, "Fill candidate MC info"}; + // Parameters for production of training samples + Configurable downSampleBkgFactor{"downSampleBkgFactor", 1., "Fraction of background candidates to keep for ML trainings"}; + Configurable ptMaxForDownSample{"ptMaxForDownSample", 10., "Maximum pt for the application of the downsampling factor"}; + + SliceCache cache; + static constexpr double mass{o2::constants::physics::MassDStar}; + + using CollisionsWCentMult = soa::Join; + using CollisionsWMcCentMult = soa::Join; + using TracksWPid = soa::Join; + using SelectedCandidates = soa::Filtered>; + using SelectedCandidatesMc = soa::Filtered>; + using SelectedCandidatesMl = soa::Filtered>; + using SelectedCandidatesMcMl = soa::Filtered>; + using MatchedGenCandidatesMc = soa::Filtered>; + using TypeMcCollisions = soa::Join; + + Filter filterSelectCandidates = aod::hf_sel_candidate_dstar::isSelDstarToD0Pi == true; + Filter filterMcGenMatching = nabs(aod::hf_cand_dstar::flagMcMatchGen) == static_cast(BIT(aod::hf_cand_dstar::DecayType::DstarToD0Pi)); + + Preslice candidatesPerCollision = aod::hf_cand::collisionId; + Preslice candidatesMcPerCollision = aod::hf_cand::collisionId; + Preslice candidatesMlPerCollision = aod::hf_cand::collisionId; + Preslice candidatesMcMlPerCollision = aod::hf_cand::collisionId; + Preslice mcParticlesPerMcCollision = aod::mcparticle::mcCollisionId; + + // trivial partitions for all candidates to allow "->sliceByCached" inside processCandidates + Partition candidatesAll = aod::hf_sel_candidate_dstar::isSelDstarToD0Pi == true; + Partition candidatesMcAll = aod::hf_sel_candidate_dstar::isSelDstarToD0Pi == true; + Partition candidatesMlAll = aod::hf_sel_candidate_dstar::isSelDstarToD0Pi == true; + Partition candidatesMcMlAll = aod::hf_sel_candidate_dstar::isSelDstarToD0Pi == true; + // partitions for signal and background + Partition candidatesMcSig = nabs(aod::hf_cand_dstar::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_dstar::DecayType::DstarToD0Pi)); + Partition candidatesMcBkg = nabs(aod::hf_cand_dstar::flagMcMatchRec) != static_cast(BIT(aod::hf_cand_dstar::DecayType::DstarToD0Pi)); + Partition candidatesMcMlSig = nabs(aod::hf_cand_dstar::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_dstar::DecayType::DstarToD0Pi)); + Partition candidatesMcMlBkg = nabs(aod::hf_cand_dstar::flagMcMatchRec) != static_cast(BIT(aod::hf_cand_dstar::DecayType::DstarToD0Pi)); + + void init(InitContext const&) + { + std::array doprocess{doprocessData, doprocessMcSig, doprocessMcBkg, doprocessMcAll, doprocessDataMl, doprocessMcMlSig, doprocessMcMlBkg, doprocessMcMlAll, doprocessMcGenOnly}; + if (std::accumulate(doprocess.begin(), doprocess.end(), 0) != 1) { + LOGP(fatal, "Only one process function can be enabled at a time."); + } + rowsCommon.init(confDerData); + } + + template + void fillTablesCandidate(const T& candidate, const U& prong0, const U& prong1, const U& prongSoftPi, int candFlag, double invMass, + double y, int8_t flagMc, int8_t origin, const std::vector& mlScores) + { + rowsCommon.fillTablesCandidate(candidate, invMass, y); + if (fillCandidatePar) { + rowCandidatePar( + candidate.chi2PCAD0(), + candidate.cpaD0(), + candidate.cpaXYD0(), + candidate.decayLengthD0(), + candidate.decayLengthXYD0(), + candidate.decayLengthNormalisedD0(), + candidate.decayLengthXYNormalisedD0(), + candidate.pxProng0(), + candidate.pyProng0(), + candidate.pzProng0(), + candidate.pxProng1(), + candidate.pyProng1(), + candidate.pzProng1(), + candidate.pxD0(), + candidate.pyD0(), + candidate.pzD0(), + candidate.pxSoftPi(), + candidate.pySoftPi(), + candidate.pzSoftPi(), + candidate.signSoftPi(), + candidate.invMassD0(), + candidate.impactParameter0(), + candidate.impactParameter1(), + candidate.impParamSoftPi(), + candidate.impactParameterNormalised0(), + candidate.impactParameterNormalised1(), + candidate.normalisedImpParamSoftPi(), + prong0.tpcNSigmaPi(), + prong0.tofNSigmaPi(), + prong0.tpcTofNSigmaPi(), + prong1.tpcNSigmaKa(), + prong1.tofNSigmaKa(), + prong1.tpcTofNSigmaKa(), + prongSoftPi.tpcNSigmaPi(), + prongSoftPi.tofNSigmaPi(), + prongSoftPi.tpcTofNSigmaPi()); + } + if (fillCandidateSel) { + rowCandidateSel( + BIT(candFlag)); + } + if (fillCandidateMl) { + rowCandidateMl( + mlScores); + } + if (fillCandidateId) { + rowCandidateId( + candidate.collisionId(), + candidate.prong0Id(), + candidate.prong1Id(), + candidate.prongPiId()); + } + if (fillCandidateMc) { + rowCandidateMc( + flagMc, + origin); + } + } + + template + void processCandidates(CollType const& collisions, + Partition& candidates, + TracksWPid const&, + aod::BCs const&) + { + // Fill collision properties + if constexpr (isMc) { + if (confDerData.fillMcRCollId) { + rowsCommon.matchedCollisions.clear(); + } + } + auto sizeTableColl = collisions.size(); + rowsCommon.reserveTablesColl(sizeTableColl); + for (const auto& collision : collisions) { + auto thisCollId = collision.globalIndex(); + auto candidatesThisColl = candidates->sliceByCached(aod::hf_cand::collisionId, thisCollId, cache); // FIXME + auto sizeTableCand = candidatesThisColl.size(); + LOGF(debug, "Rec. collision %d has %d candidates", thisCollId, sizeTableCand); + // Skip collisions without HF candidates (and without HF particles in matched MC collisions if saving indices of reconstructed collisions matched to MC collisions) + bool mcCollisionHasMcParticles{false}; + if constexpr (isMc) { + mcCollisionHasMcParticles = confDerData.fillMcRCollId && collision.has_mcCollision() && rowsCommon.hasMcParticles[collision.mcCollisionId()]; + LOGF(debug, "Rec. collision %d has MC collision %d with MC particles? %s", thisCollId, collision.mcCollisionId(), mcCollisionHasMcParticles ? "yes" : "no"); + } + if (sizeTableCand == 0 && (!confDerData.fillMcRCollId || !mcCollisionHasMcParticles)) { + LOGF(debug, "Skipping rec. collision %d", thisCollId); + continue; + } + LOGF(debug, "Filling rec. collision %d at derived index %d", thisCollId, rowsCommon.rowCollBase.lastIndex() + 1); + rowsCommon.fillTablesCollision(collision); + + // Fill candidate properties + rowsCommon.reserveTablesCandidates(sizeTableCand); + reserveTable(rowCandidatePar, fillCandidatePar, sizeTableCand); + reserveTable(rowCandidateSel, fillCandidateSel, sizeTableCand); + reserveTable(rowCandidateMl, fillCandidateMl, sizeTableCand); + reserveTable(rowCandidateId, fillCandidateId, sizeTableCand); + if constexpr (isMc) { + reserveTable(rowCandidateMc, fillCandidateMc, sizeTableCand); + } + int8_t flagMcRec = 0, origin = 0; + for (const auto& candidate : candidatesThisColl) { + if constexpr (isMl) { + if (!TESTBIT(candidate.isSelDstarToD0Pi(), aod::SelectionStep::RecoMl)) { + continue; + } + } + if constexpr (isMc) { + flagMcRec = candidate.flagMcMatchRec(); + origin = candidate.originMcRec(); + if constexpr (onlyBkg) { + if (TESTBIT(std::abs(flagMcRec), aod::hf_cand_dstar::DecayType::DstarToD0Pi)) { + continue; + } + if (downSampleBkgFactor < 1.) { + float pseudoRndm = candidate.ptProng0() * 1000. - static_cast(candidate.ptProng0() * 1000); + if (candidate.pt() < ptMaxForDownSample && pseudoRndm >= downSampleBkgFactor) { + continue; + } + } + } + if constexpr (onlySig) { + if (!TESTBIT(std::abs(flagMcRec), aod::hf_cand_dstar::DecayType::DstarToD0Pi)) { + continue; + } + } + } + auto prong0 = candidate.template prong0_as(); + auto prong1 = candidate.template prong1_as(); + auto prongSoftPi = candidate.template prongPi_as(); + double y = candidate.y(o2::constants::physics::MassDStar); + double massDstar = candidate.invMassDstar(); + std::vector mlScoresDstarToD0Pi; + bool isD0 = prongSoftPi.sign() < 0; + if constexpr (isMl) { + std::copy(candidate.mlProbDstarToD0Pi().begin(), candidate.mlProbDstarToD0Pi().end(), std::back_inserter(mlScoresDstarToD0Pi)); + } + fillTablesCandidate(candidate, prong0, prong1, prongSoftPi, isD0 ? 0 : 1, y, massDstar, flagMcRec, origin, mlScoresDstarToD0Pi); + } + } + } + + void processData(CollisionsWCentMult const& collisions, + SelectedCandidates const&, + TracksWPid const& tracks, + aod::BCs const& bcs) + { + processCandidates(collisions, candidatesAll, tracks, bcs); + } + PROCESS_SWITCH(HfDerivedDataCreatorDstarToD0Pi, processData, "Process data", true); + + void processMcSig(CollisionsWMcCentMult const& collisions, + SelectedCandidatesMc const&, + TypeMcCollisions const& mcCollisions, + MatchedGenCandidatesMc const& mcParticles, + TracksWPid const& tracks, + aod::BCs const& bcs) + { + rowsCommon.preProcessMcCollisions(mcCollisions, mcParticlesPerMcCollision, mcParticles); + processCandidates(collisions, candidatesMcSig, tracks, bcs); + rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, mass); + } + PROCESS_SWITCH(HfDerivedDataCreatorDstarToD0Pi, processMcSig, "Process MC only for signals", false); + + void processMcBkg(CollisionsWMcCentMult const& collisions, + SelectedCandidatesMc const&, + TypeMcCollisions const& mcCollisions, + MatchedGenCandidatesMc const& mcParticles, + TracksWPid const& tracks, + aod::BCs const& bcs) + { + rowsCommon.preProcessMcCollisions(mcCollisions, mcParticlesPerMcCollision, mcParticles); + processCandidates(collisions, candidatesMcBkg, tracks, bcs); + rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, mass); + } + PROCESS_SWITCH(HfDerivedDataCreatorDstarToD0Pi, processMcBkg, "Process MC only for background", false); + + void processMcAll(CollisionsWMcCentMult const& collisions, + SelectedCandidatesMc const&, + TypeMcCollisions const& mcCollisions, + MatchedGenCandidatesMc const& mcParticles, + TracksWPid const& tracks, + aod::BCs const& bcs) + { + rowsCommon.preProcessMcCollisions(mcCollisions, mcParticlesPerMcCollision, mcParticles); + processCandidates(collisions, candidatesMcAll, tracks, bcs); + rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, mass); + } + PROCESS_SWITCH(HfDerivedDataCreatorDstarToD0Pi, processMcAll, "Process MC", false); + + // ML versions + + void processDataMl(CollisionsWCentMult const& collisions, + SelectedCandidatesMl const&, + TracksWPid const& tracks, + aod::BCs const& bcs) + { + processCandidates(collisions, candidatesMlAll, tracks, bcs); + } + PROCESS_SWITCH(HfDerivedDataCreatorDstarToD0Pi, processDataMl, "Process data with ML", false); + + void processMcMlSig(CollisionsWMcCentMult const& collisions, + SelectedCandidatesMcMl const&, + TypeMcCollisions const& mcCollisions, + MatchedGenCandidatesMc const& mcParticles, + TracksWPid const& tracks, + aod::BCs const& bcs) + { + rowsCommon.preProcessMcCollisions(mcCollisions, mcParticlesPerMcCollision, mcParticles); + processCandidates(collisions, candidatesMcMlSig, tracks, bcs); + rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, mass); + } + PROCESS_SWITCH(HfDerivedDataCreatorDstarToD0Pi, processMcMlSig, "Process MC with ML only for signals", false); + + void processMcMlBkg(CollisionsWMcCentMult const& collisions, + SelectedCandidatesMcMl const&, + TypeMcCollisions const& mcCollisions, + MatchedGenCandidatesMc const& mcParticles, + TracksWPid const& tracks, + aod::BCs const& bcs) + { + rowsCommon.preProcessMcCollisions(mcCollisions, mcParticlesPerMcCollision, mcParticles); + processCandidates(collisions, candidatesMcMlBkg, tracks, bcs); + rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, mass); + } + PROCESS_SWITCH(HfDerivedDataCreatorDstarToD0Pi, processMcMlBkg, "Process MC with ML only for background", false); + + void processMcMlAll(CollisionsWMcCentMult const& collisions, + SelectedCandidatesMcMl const&, + TypeMcCollisions const& mcCollisions, + MatchedGenCandidatesMc const& mcParticles, + TracksWPid const& tracks, + aod::BCs const& bcs) + { + rowsCommon.preProcessMcCollisions(mcCollisions, mcParticlesPerMcCollision, mcParticles); + processCandidates(collisions, candidatesMcMlAll, tracks, bcs); + rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, mass); + } + PROCESS_SWITCH(HfDerivedDataCreatorDstarToD0Pi, processMcMlAll, "Process MC with ML", false); + + void processMcGenOnly(TypeMcCollisions const& mcCollisions, + MatchedGenCandidatesMc const& mcParticles) + { + rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, mass); + } + PROCESS_SWITCH(HfDerivedDataCreatorDstarToD0Pi, processMcGenOnly, "Process MC gen. only", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} From 8a6b45dd7b667640d7f9f4493efe8731d3298bd1 Mon Sep 17 00:00:00 2001 From: Jerome Jung Date: Tue, 13 May 2025 17:50:58 +0200 Subject: [PATCH 1262/1650] [PWGEM] LMee: lowB PID fix (#11178) --- PWGEM/Dilepton/Core/DielectronCut.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGEM/Dilepton/Core/DielectronCut.h b/PWGEM/Dilepton/Core/DielectronCut.h index 8e403bfbf41..9ad54af870c 100644 --- a/PWGEM/Dilepton/Core/DielectronCut.h +++ b/PWGEM/Dilepton/Core/DielectronCut.h @@ -289,7 +289,7 @@ class DielectronCut : public TNamed bool PassTOFreqLowB(T const& track) const { bool is_el_included_TPC = mMinTPCNsigmaEl < track.tpcNSigmaEl() && track.tpcNSigmaEl() < mMaxTPCNsigmaEl; - bool is_pi_excluded_TPC = (track.tpcInnerParam() < mMinPinForPionRejectionTPC && track.tpcInnerParam() < mMaxPinForPionRejectionTPC) ? (track.tpcNSigmaPi() < mMinTPCNsigmaPi || mMaxTPCNsigmaPi < track.tpcNSigmaPi()) : true; + bool is_pi_excluded_TPC = (track.tpcInnerParam() > mMinPinForPionRejectionTPC && track.tpcInnerParam() < mMaxPinForPionRejectionTPC) ? (track.tpcNSigmaPi() < mMinTPCNsigmaPi || mMaxTPCNsigmaPi < track.tpcNSigmaPi()) : true; bool is_el_included_TOF = (mMinTOFNsigmaEl < track.tofNSigmaEl() && track.tofNSigmaEl() < mMaxTOFNsigmaEl) && (track.hasTOF() && track.tofChi2() < mMaxChi2TOF); bool is_ka_excluded_ITS = (mMinP_ITSNsigmaKa < track.p() && track.p() < mMaxP_ITSNsigmaKa) ? (track.itsNSigmaKa() < mMinITSNsigmaKa || mMaxITSNsigmaKa < track.itsNSigmaKa()) : true; bool is_pr_excluded_ITS = (mMinP_ITSNsigmaPr < track.p() && track.p() < mMaxP_ITSNsigmaPr) ? (track.itsNSigmaPr() < mMinITSNsigmaPr || mMaxITSNsigmaPr < track.itsNSigmaPr()) : true; From 95013de1395c854afd30737836a20529ac7a28f7 Mon Sep 17 00:00:00 2001 From: abilandz Date: Tue, 13 May 2025 18:31:40 +0200 Subject: [PATCH 1263/1650] [PWGCF] - support for extra MC info from table HepMCHeavyIons - only testing (#11173) --- .../Core/MuPa-Configurables.h | 2 +- .../Core/MuPa-DataMembers.h | 4 +- .../Core/MuPa-Enums.h | 2 + .../Core/MuPa-MemberFunctions.h | 259 +++++++++++++++--- .../Tasks/multiparticle-correlations-ab.cxx | 47 ++++ 5 files changed, 273 insertions(+), 41 deletions(-) diff --git a/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h b/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h index 551376fad0e..95d24fa9a47 100644 --- a/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h +++ b/PWGCF/MultiparticleCorrelations/Core/MuPa-Configurables.h @@ -53,7 +53,7 @@ struct : ConfigurableGroup { Configurable cfCheckUnderflowAndOverflow{"cfCheckUnderflowAndOverflow", false, "check and bail out if in event and particle histograms there are entries which went to underflow or overflow bins (use only locally)"}; Configurable cfRebin{"cfRebin", 10, "number of bins of selected heavy 2D histograms are devided with this number"}; Configurable cfFillQAEventHistograms2D{"cfFillQAEventHistograms2D", false, "if false, all QA 2D event histograms are not filled. if true, only the ones for which fBookQAEventHistograms2D[...] is true, are filled"}; - Configurable> cfBookQAEventHistograms2D{"cfBookQAEventHistograms2D", {"1-Multiplicity_vs_ReferenceMultiplicity", "1-Multiplicity_vs_NContributors", "1-Multiplicity_vs_Centrality", "1-Multiplicity_vs_VertexZ", "1-Multiplicity_vs_Occupancy", "1-Multiplicity_vs_InteractionRate", "1-ReferenceMultiplicity_vs_NContributors", "1-ReferenceMultiplicity_vs_Centrality", "1-ReferenceMultiplicity_vs_VertexZ", "1-ReferenceMultiplicity_vs_Occupancy", "1-ReferenceMultiplicity_vs_InteractionRate", "1-NContributors_vs_Centrality", "1-NContributors_vs_VertexZ", "1-NContributors_vs_Occupancy", "1-NContributors_vs_InteractionRate", "1-Centrality_vs_VertexZ", "1-Centrality_vs_Occupancy", "0-Centrality_vs_ImpactParameter", "1-Centrality_vs_InteractionRate", "1-VertexZ_vs_Occupancy", "1-VertexZ_vs_InteractionRate", "0-MultNTracksPV_vs_MultNTracksGlobal", "1-CentFT0C_vs_CentFT0CVariant1", "1-CentFT0C_vs_CentFT0M", "1-CentFT0C_vs_CentFV0A", "0-CentFT0C_vs_CentNTPV", "0-CentFT0C_vs_CentNGlobal", "0-CentFT0M_vs_CentNTPV", "0-CentRun2V0M_vs_CentRun2SPDTracklets", "1-TrackOccupancyInTimeRange_vs_FT0COccupancyInTimeRange", "1-CurrentRunDuration_vs_InteractionRate", "1-Multiplicity_vs_FT0CAmplitudeOnFoundBC", "1-CentFT0C_vs_FT0CAmplitudeOnFoundBC"}, "book (1) or do not book (0) this QA 2D event histogram"}; + Configurable> cfBookQAEventHistograms2D{"cfBookQAEventHistograms2D", {"1-Multiplicity_vs_ReferenceMultiplicity", "1-Multiplicity_vs_NContributors", "1-Multiplicity_vs_Centrality", "1-Multiplicity_vs_VertexZ", "1-Multiplicity_vs_Occupancy", "1-Multiplicity_vs_InteractionRate", "1-ReferenceMultiplicity_vs_NContributors", "1-ReferenceMultiplicity_vs_Centrality", "1-ReferenceMultiplicity_vs_VertexZ", "1-ReferenceMultiplicity_vs_Occupancy", "1-ReferenceMultiplicity_vs_InteractionRate", "1-NContributors_vs_Centrality", "1-NContributors_vs_VertexZ", "1-NContributors_vs_Occupancy", "1-NContributors_vs_InteractionRate", "1-Centrality_vs_VertexZ", "1-Centrality_vs_Occupancy", "0-Centrality_vs_ImpactParameter", "1-Centrality_vs_InteractionRate", "1-VertexZ_vs_Occupancy", "1-VertexZ_vs_InteractionRate", "0-MultNTracksPV_vs_MultNTracksGlobal", "1-CentFT0C_vs_CentFT0CVariant1", "1-CentFT0C_vs_CentFT0M", "1-CentFT0C_vs_CentFV0A", "0-CentFT0C_vs_CentNTPV", "0-CentFT0C_vs_CentNGlobal", "0-CentFT0M_vs_CentNTPV", "0-CentRun2V0M_vs_CentRun2SPDTracklets", "1-TrackOccupancyInTimeRange_vs_FT0COccupancyInTimeRange", "1-CurrentRunDuration_vs_InteractionRate", "1-Multiplicity_vs_FT0CAmplitudeOnFoundBC", "1-CentFT0C_vs_FT0CAmplitudeOnFoundBC", "1-Centrality_vs_CentralitySim"}, "book (1) or do not book (0) this QA 2D event histogram"}; Configurable cfFillQAParticleHistograms2D{"cfFillQAParticleHistograms2D", false, "if false, all QA 2D particle histograms are not filled. if true, only the ones for which fBookQAParticleHistograms2D[...] is true, are filled"}; Configurable> cfBookQAParticleHistograms2D{"cfBookQAParticleHistograms2D", {"1-Pt_vs_dcaXY"}, "book (1) or do not book (0) this QA 2D particle histogram"}; Configurable cfFillQAParticleEventHistograms2D{"cfFillQAParticleEventHistograms2D", false, "if false, all QA 2D particle event histograms are not filled. if true, only the ones for which fBookQAParticleEventHistograms2D[...] is true, are filled"}; diff --git a/PWGCF/MultiparticleCorrelations/Core/MuPa-DataMembers.h b/PWGCF/MultiparticleCorrelations/Core/MuPa-DataMembers.h index ac1c22d7dc0..a603d614a24 100644 --- a/PWGCF/MultiparticleCorrelations/Core/MuPa-DataMembers.h +++ b/PWGCF/MultiparticleCorrelations/Core/MuPa-DataMembers.h @@ -90,13 +90,15 @@ struct EventByEventQuantities { // Use configurable cfMultiplicityEstimator[eMultiplicityEstimator] to define what is this multiplicity, by default it is "SelectedTracks" float fReferenceMultiplicity = 0.; // reference multiplicity, calculated outside of my code. Can be "MultTPC", "MultFV0M", etc. // Use configurable cfReferenceMultiplicityEstimator[eReferenceMultiplicityEstimator]" to define what is this multiplicity, by default it is "TBI 20241123 I do not know yet which estimator is best for ref. mult." - float fCentrality = 0.; // event-by-event centrality. Value of the default centrality estimator, set via configurable cfCentralityEstimator + float fCentrality = 0.; // event-by-event centrality, in reconstructed data. Value of the default centrality estimator, set via configurable cfCentralityEstimator + float fCentralitySim = 0.; // event-by-event centrality, in simulated data. Calculated directly from IP at the moment, eventually I will access it from o2::aod::hepmcheavyion::Centrality float fOccupancy = 0.; // event-by-event occupancy. Value of the default occupancy estimator, set via configurable cfOccupancyEstimator. // Remebmer that collision with occupanct 0. shall NOT be rejected, therefore in configurable I set -0.0001 for low edge by default. float fInteractionRate = 0.; // event-by-event interaction rate float fCurrentRunDuration = 0.; // how many seconds after start of run this collision was taken, i.e. seconds after start of run (SOR) float fVz = 0.; // vertex z position float fFT0CAmplitudeOnFoundBC = 0.; // TBI20250331 finalize the comment here + float fImpactParameter = 0.; // calculated only for simulated/generated data } ebye; // "ebye" is a common label for objects in this struct // *) QA: diff --git a/PWGCF/MultiparticleCorrelations/Core/MuPa-Enums.h b/PWGCF/MultiparticleCorrelations/Core/MuPa-Enums.h index e808d72551b..7c9e2320785 100644 --- a/PWGCF/MultiparticleCorrelations/Core/MuPa-Enums.h +++ b/PWGCF/MultiparticleCorrelations/Core/MuPa-Enums.h @@ -56,6 +56,7 @@ enum eProcess { eProcessSim_Run1, // Run 1, only simulated eProcessTest, // minimum subscription to the tables, for testing purposes eProcessQA, // maximum subscription to the tables, for QA purposes. Basically: eProcessRec + otherwise unnecessary tables + eProcessHepMChi, // special subscription when I extract info from the table HepMCHeavyIons TBI 20250429 merge this case eventualyl with RecSim cases // Generic flags, calculated and set from individual flags above in DefaultConfiguration(), AFTER process switch was taken into account: eGenericRec, // generic "Rec" case, eTest is treated for the time being as "Rec". eQA is also in this category eGenericRecSim, // generic "RecSim" case @@ -384,6 +385,7 @@ enum eQAEventHistograms2D { // Unsorted category: TBI 20250331 not sure if I will keep these ones permanently: eMultiplicity_vs_FT0CAmplitudeOnFoundBC, eCentFT0C_vs_FT0CAmplitudeOnFoundBC, + eCentrality_vs_CentralitySim, // correlation between centrality determined from reconstructed data, and centrality determined at generated level (from IP). I save it as [eSim], not as [eRec] // ... eQAEventHistograms2D_N }; diff --git a/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h b/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h index c2a12790435..dc244873b37 100644 --- a/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h +++ b/PWGCF/MultiparticleCorrelations/Core/MuPa-MemberFunctions.h @@ -283,6 +283,7 @@ void DefaultConfiguration() tc.fProcess[eProcessSim_Run1] = doprocessSim_Run1; tc.fProcess[eProcessTest] = doprocessTest; tc.fProcess[eProcessQA] = doprocessQA; + tc.fProcess[eProcessHepMChi] = doprocessHepMChi; // Temporarary bailout protection against cases which are not implemented/validated yet: if (tc.fProcess[eProcessSim]) { @@ -333,6 +334,8 @@ void DefaultConfiguration() tc.fWhichProcess = "ProcessTest"; } else if (tc.fProcess[eProcessQA]) { tc.fWhichProcess = "ProcessQA"; + } else if (tc.fProcess[eProcessHepMChi]) { + tc.fWhichProcess = "ProcessHepMChi"; } tc.fRandomSeed = cf_tc.cfRandomSeed; @@ -763,6 +766,7 @@ void DefaultConfiguration() qa.fEventHistogramsName2D[eVertexZ_vs_InteractionRate] = Form("%s_vs_%s", eh.fEventHistogramsName[eVertexZ].Data(), eh.fEventHistogramsName[eInteractionRate].Data()); qa.fEventHistogramsName2D[eMultiplicity_vs_FT0CAmplitudeOnFoundBC] = Form("%s_vs_%s", eh.fEventHistogramsName[eMultiplicity].Data(), "FT0CAmplitudeOnFoundBC"); // TBI 20250331 hardwired string qa.fEventHistogramsName2D[eCentFT0C_vs_FT0CAmplitudeOnFoundBC] = Form("%s_vs_%s", qa.fCentralityEstimatorName[eCentFT0C].Data(), "FT0CAmplitudeOnFoundBC"); // TBI 20250331 hardwired string + qa.fEventHistogramsName2D[eCentrality_vs_CentralitySim] = Form("%s_vs_%s", eh.fEventHistogramsName[eCentrality].Data(), "CentralitySim"); // TBI 20250331 hardwired string qa.fEventHistogramsName2D[eMultNTracksPV_vs_MultNTracksGlobal] = Form("%s_vs_%s", qa.fReferenceMultiplicityEstimatorName[eMultNTracksPV].Data(), qa.fReferenceMultiplicityEstimatorName[eMultNTracksGlobal].Data()); qa.fEventHistogramsName2D[eCentFT0C_vs_CentFT0CVariant1] = Form("%s_vs_%s", qa.fCentralityEstimatorName[eCentFT0C].Data(), qa.fCentralityEstimatorName[eCentFT0CVariant1].Data()); qa.fEventHistogramsName2D[eCentFT0C_vs_CentFT0M] = Form("%s_vs_%s", qa.fCentralityEstimatorName[eCentFT0C].Data(), qa.fCentralityEstimatorName[eCentFT0M].Data()); @@ -1176,6 +1180,7 @@ void DefaultBooking() qa.fBookQAEventHistograms2D[eVertexZ_vs_InteractionRate] = Alright(lBookQAEventHistograms2D[eVertexZ_vs_InteractionRate]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eMultiplicity_vs_FT0CAmplitudeOnFoundBC] = Alright(lBookQAEventHistograms2D[eMultiplicity_vs_FT0CAmplitudeOnFoundBC]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eCentFT0C_vs_FT0CAmplitudeOnFoundBC] = Alright(lBookQAEventHistograms2D[eCentFT0C_vs_FT0CAmplitudeOnFoundBC]) && qa.fFillQAEventHistograms2D; + qa.fBookQAEventHistograms2D[eCentrality_vs_CentralitySim] = Alright(lBookQAEventHistograms2D[eCentrality_vs_CentralitySim]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eMultNTracksPV_vs_MultNTracksGlobal] = Alright(lBookQAEventHistograms2D[eMultNTracksPV_vs_MultNTracksGlobal]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eCentFT0C_vs_CentFT0CVariant1] = Alright(lBookQAEventHistograms2D[eCentFT0C_vs_CentFT0CVariant1]) && qa.fFillQAEventHistograms2D; qa.fBookQAEventHistograms2D[eCentFT0C_vs_CentFT0M] = Alright(lBookQAEventHistograms2D[eCentFT0C_vs_CentFT0M]) && qa.fFillQAEventHistograms2D; @@ -2504,6 +2509,10 @@ void InsanityChecksOnDefinitionsOfConfigurables() LOGF(fatal, "\033[1;31m%s at line %d : configurable cfTaskIsConfiguredFromJson = \"%s\", but it has to be set to \"yes\" in JSON => most likely some other configurable is misconfigured and all remaining settings in JSON are ignored silently\033[0m", __FUNCTION__, __LINE__, TString(cf_tc.cfTaskIsConfiguredFromJson).Data()); } + if (cf_tc.cfUseSpecificCuts) { + LOGF(info, "\033[1;33m%s at line %d: !!!! WARNING !!!! cfUseSpecificCuts = true, all settings in the current config are ignored !!!! WARNING !!!! \033[0m", __FUNCTION__, __LINE__); + } + // b) QA: // ... @@ -3596,6 +3605,16 @@ void BookQAHistograms() max_y_Event[eCentFT0C_vs_FT0CAmplitudeOnFoundBC] = 100000.; // TBI 20250331 hardwired value title_y_Event[eCentFT0C_vs_FT0CAmplitudeOnFoundBC] = "FT0CAmplitudeOnFoundBC"; // TBI 20250331 hardwired string + // *) "Centrality_vs_CentralitySim": + nBins_x_Event[eCentrality_vs_CentralitySim] = eh.fEventHistogramsBins[eCentrality][0]; + min_x_Event[eCentrality_vs_CentralitySim] = eh.fEventHistogramsBins[eCentrality][1]; + max_x_Event[eCentrality_vs_CentralitySim] = eh.fEventHistogramsBins[eCentrality][2]; + title_x_Event[eCentrality_vs_CentralitySim] = FancyFormatting(eh.fEventHistogramsName[eCentrality].Data()); + nBins_y_Event[eCentrality_vs_CentralitySim] = eh.fEventHistogramsBins[eCentrality][0]; + min_y_Event[eCentrality_vs_CentralitySim] = eh.fEventHistogramsBins[eCentrality][1]; + max_y_Event[eCentrality_vs_CentralitySim] = eh.fEventHistogramsBins[eCentrality][2]; + title_y_Event[eCentrality_vs_CentralitySim] = "simulated centrality (calculated from IP)"; // TBI 20250331 hardwired string + // *) "MultNTracksPV_vs_MultNTracksGlobal": nBins_x_Event[eMultNTracksPV_vs_MultNTracksGlobal] = static_cast(eh.fEventHistogramsBins[eMultiplicity][0] / qa.fRebin); min_x_Event[eMultNTracksPV_vs_MultNTracksGlobal] = eh.fEventHistogramsBins[eMultiplicity][1]; @@ -5422,9 +5441,9 @@ void BookWeightsHistograms() TString yAxisTitle = ""; yAxisTitle += TString::Format("%d:w_{#varphi}; ", 1); - yAxisTitle += TString::Format("%d:w_{p_{t}}}; ", 2); + yAxisTitle += TString::Format("%d:w_{p_{t}}; ", 2); yAxisTitle += TString::Format("%d:w_{#eta}; ", 3); - yAxisTitle += TString::Format("%d:(w_{#varphi})_{| p_{T}}}; ", 4); + yAxisTitle += TString::Format("%d:(w_{#varphi})_{| p_{T}}; ", 4); yAxisTitle += TString::Format("%d:(w_{#varphi})_{| #eta}; ", 5); // **) differential phi weights using sparse: @@ -6137,7 +6156,7 @@ void InternalValidation() // For this option, vn's and psin's are constant for all simulated events, therefore I can configure fPhiPDF outside of loop over events. // Remark: The last parameter [18] is a random reaction plane, keep in sync with fPhiPDF->SetParameter(18,fReactionPlane); below // Keep also in sync with const int gMaxHarmonic = 9; in *GlobalConstants.h - fPhiPDF = new TF1("fPhiPDF", "1 + 2.*[0]*cos(x-[1]-[18]) + 2.*[2]*cos(2.*(x-[3]-[18])) + 2.*[4]*cos(3.*(x-[5]-[18])) + 2.*[6]*cos(4.*(x-[7]-[18])) + 2.*[8]*cos(5.*(x-[9]-[18])) + 2.*[10]*cos(6.*(x-[11]-[18])) + 2.*[12]*cos(7.*(x-[13]-[18])) + 2.*[14]*cos(8.*(x-[15]-[18])) + 2.*[16]*cos(9.*(x-[17]-[18]))", 0., o2::constants::math::TwoPI); + fPhiPDF = new TF1("fPhiPDF", "1 + 2.*[0]*std::cos(x-[1]-[18]) + 2.*[2]*std::cos(2.*(x-[3]-[18])) + 2.*[4]*std::cos(3.*(x-[5]-[18])) + 2.*[6]*std::cos(4.*(x-[7]-[18])) + 2.*[8]*std::cos(5.*(x-[9]-[18])) + 2.*[10]*std::cos(6.*(x-[11]-[18])) + 2.*[12]*std::cos(7.*(x-[13]-[18])) + 2.*[14]*std::cos(8.*(x-[15]-[18])) + 2.*[16]*std::cos(9.*(x-[17]-[18]))", 0., o2::constants::math::TwoPI); for (int h = 0; h < gMaxHarmonic; h++) { fPhiPDF->SetParName(2 * h, TString::Format("v_{%d}", h + 1)); // set name v_n fPhiPDF->SetParName(2 * h + 1, TString::Format("Psi_{%d}", h + 1)); // set name psi_n @@ -6170,7 +6189,7 @@ void InternalValidation() // Keep also in sync with const int gMaxHarmonic = 9; in *GlobalConstants.h // Azimuthal angles are sampled from this pdf: - fPhiPDF = new TF1("fPhiPDF", "1 + 2.*[0]*cos(x-[3]) + 2.*[1]*cos(2.*(x-[3])) + 2.*[2]*cos(3.*(x-[3]))", 0., o2::constants::math::TwoPI); + fPhiPDF = new TF1("fPhiPDF", "1 + 2.*[0]*std::cos(x-[3]) + 2.*[1]*std::cos(2.*(x-[3])) + 2.*[2]*std::cos(3.*(x-[3]))", 0., o2::constants::math::TwoPI); // With this parameterization, I have: // [0] => v1 // [1] => v2 @@ -6195,7 +6214,7 @@ void InternalValidation() // Keep also in sync with const int gMaxHarmonic = 9; in *GlobalConstants.h // Azimuthal angles are sampled from this pdf: - fPhiPDF = new TF1("fPhiPDF", "1 + 2.*[0]*cos(x-[3]) + 2.*[1]*cos(2.*(x-[4])) + 2.*[2]*cos(3.*(x-[5]))", 0., o2::constants::math::TwoPI); + fPhiPDF = new TF1("fPhiPDF", "1 + 2.*[0]*std::cos(x-[3]) + 2.*[1]*std::cos(2.*(x-[4])) + 2.*[2]*std::cos(3.*(x-[5]))", 0., o2::constants::math::TwoPI); // With this parameterization, I have: // [0] => v1 // [1] => v2 @@ -6239,6 +6258,7 @@ void InternalValidation() ebye.fCurrentRunDuration = static_cast(gRandom->Uniform(0., 86400.)); // this is perfectly fine for this exercise ebye.fVz = static_cast(gRandom->Uniform(-20., 20.)); // this is perfectly fine for this exercise ebye.fFT0CAmplitudeOnFoundBC = static_cast(gRandom->Uniform(0., 100000.)); // this is perfectly fine for this exercise + ebye.fImpactParameter = static_cast(gRandom->Uniform(0., 20.)); // this is perfectly fine for this exercise // b2) Fill event histograms before cuts: if (eh.fFillEventHistograms) { @@ -6276,7 +6296,8 @@ void InternalValidation() // Persistent symmetry plane correlation: double Psi1 = gRandom->Uniform(0., o2::constants::math::TwoPI); double Psi2 = gRandom->Uniform(0., o2::constants::math::TwoPI); - double Psi3 = (1. / 3.) * ((o2::constants::math::PI / 4.) + 2. * Psi2 + Psi1); // see arXiv:1901.06968, Sec. II D. + double Psi3 = (1. / 3.) * (o2::constants::math::PIQuarter + 2. * Psi2 + Psi1); // see arXiv:1901.06968, Sec. II D. + // o2::constants::math::PIQuarter = 0.25f * PI fPhiPDF->SetParameter(3, Psi1); fPhiPDF->SetParameter(4, Psi2); fPhiPDF->SetParameter(5, Psi3); @@ -7347,11 +7368,14 @@ void ResetEventByEventQuantities() ebye.fMultiplicity = 0.; ebye.fReferenceMultiplicity = 0.; ebye.fCentrality = 0.; + // ebye.fCentralitySim = 0.; // TBI 20250429 special treatment, because I access this one before Steer(...) is called in .cxx . Re-think how to handle this one + // But if I do not access it in .cxx, in any case I skip that collision, so I think it is just fine not to reset it here ebye.fOccupancy = 0.; ebye.fInteractionRate = 0.; ebye.fCurrentRunDuration = 0.; ebye.fVz = 0.; ebye.fFT0CAmplitudeOnFoundBC = 0.; + ebye.fImpactParameter = 0.; // I can reset it here to 0., as long as I am calculating it from collision.mcCollision().impactParameter() . If I calculate it from hep.impactParameter(), i need to re-think // b) Q-vectors: if (qv.fCalculateQvectors) { @@ -7732,7 +7756,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) if (ec.fUseEventCuts[eMinVertexDistanceFromIP]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eMinVertexDistanceFromIP, eCutCounterBinning); - } else if (sqrt(pow(collision.posX(), 2.) + pow(collision.posY(), 2.) + pow(collision.posZ(), 2.)) < ec.fdEventCuts[eMinVertexDistanceFromIP][eMin]) { + } else if (std::sqrt(std::pow(collision.posX(), 2.) + std::pow(collision.posY(), 2.) + std::pow(collision.posZ(), 2.)) < ec.fdEventCuts[eMinVertexDistanceFromIP][eMin]) { if (!EventCut(eRec, eMinVertexDistanceFromIP, cutModus)) { return false; } @@ -7790,7 +7814,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) // See https://aliceo2group.github.io/analysis-framework/docs/datamodel/ao2dTables.html#montecarlo if constexpr (rs == eRecAndSim || rs == eRecAndSim_Run2 || rs == eRecAndSim_Run1) { if (!collision.has_mcCollision()) { - LOGF(warning, "No MC collision for this collision, skip..."); // TBI 20231106 re-think. I shouldn't probably get to this point, if MC truth info doesn't exist for this collision + LOGF(warning, "\033[1;31m%s at line %d : No MC collision for this collision, skip... \033[0m", __FUNCTION__, __LINE__); // TBI 20231106 re-think. I shouldn't probably get to this point, if MC truth info doesn't exist for this collision return false; } @@ -7840,7 +7864,16 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) // *) Multiplicity: // Remark: This cut is implemented directly in Steer(...) TBI 20240508 check how to implement this one with the current re-write - // *) Centrality: this is related to eImpactParameter. TBI 20240509 How do I proceed here? Shall i calculate it in void DetermineCentrality( ... ), from IP, and store it in ebye.fCentrality? + // *) Centrality: this centrality is calculated directly from impact parameter, i.e. this is centrality at simulated level, see DetermineCentrality(...) what I do for thre "eSim*" cases. + if (ec.fUseEventCuts[eCentrality]) { + if (cutModus == eCutCounterBinning) { + EventCut(eSim, eCentrality, eCutCounterBinning); + } else if (ebye.fCentrality < ec.fdEventCuts[eCentrality][eMin] || ebye.fCentrality > ec.fdEventCuts[eCentrality][eMax] || std::abs(ebye.fCentrality - ec.fdEventCuts[eCentrality][eMax]) < tc.fFloatingPointPrecision) { + if (!EventCut(eSim, eCentrality, cutModus)) { + return false; + } + } + } // *) VertexX: if (ec.fUseEventCuts[eVertexX]) { @@ -7879,7 +7912,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) if (ec.fUseEventCuts[eMinVertexDistanceFromIP]) { if (cutModus == eCutCounterBinning) { EventCut(eRec, eMinVertexDistanceFromIP, eCutCounterBinning); - } else if (sqrt(pow(collision.posX(), 2.) + pow(collision.posY(), 2.) + pow(collision.posZ(), 2.)) < ec.fdEventCuts[eMinVertexDistanceFromIP][eMin]) { + } else if (std::sqrt(std::pow(collision.posX(), 2.) + std::pow(collision.posY(), 2.) + std::pow(collision.posZ(), 2.)) < ec.fdEventCuts[eMinVertexDistanceFromIP][eMin]) { if (!EventCut(eRec, eMinVertexDistanceFromIP, cutModus)) { return false; } @@ -8104,7 +8137,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) // See https://aliceo2group.github.io/analysis-framework/docs/datamodel/ao2dTables.html#montecarlo if constexpr (rs == eRecAndSim) { if (!collision.has_mcCollision()) { - LOGF(warning, "No MC collision for this collision, skip..."); // TBI 20231106 re-think. I shouldn't probably get to this point, if MC truth info doesn't exist for this collision + LOGF(warning, "\033[1;31m%s at line %d : No MC collision for this collision, skip... \033[0m", __FUNCTION__, __LINE__); // TBI 20231106 re-think. I shouldn't probably get to this point, if MC truth info doesn't exist for this collision return false; } @@ -8203,7 +8236,7 @@ bool EventCuts(T1 const& collision, T2 const& tracks, eCutModus cutModus) // See https://aliceo2group.github.io/analysis-framework/docs/datamodel/ao2dTables.html#montecarlo if constexpr (rs == eRecAndSim_Run2 || rs == eRecAndSim_Run1) { if (!collision.has_mcCollision()) { - LOGF(warning, "No MC collision for this collision, skip..."); // TBI 20231106 re-think. I shouldn't probably get to this point, if MC truth info doesn't exist for this collision + LOGF(warning, "\033[1;31m%s at line %d : No MC collision for this collision, skip... \033[0m", __FUNCTION__, __LINE__); // TBI 20231106 re-think. I shouldn't probably get to this point, if MC truth info doesn't exist for this collision return false; } @@ -8522,7 +8555,7 @@ void FillEventHistograms(T1 const& collision, T2 const& tracks, eBeforeAfter ba) // ... and corresponding MC truth simulated (common to Run 3, Run 2 and Run 1) ( see https://github.com/AliceO2Group/O2Physics/blob/master/Tutorials/src/mcHistograms.cxx ): if constexpr (rs == eRecAndSim || rs == eRecAndSim_Run2 || rs == eRecAndSim_Run1) { if (!collision.has_mcCollision()) { - LOGF(warning, "No MC collision for this collision, skip..."); + LOGF(warning, "\033[1;31m%s at line %d : No MC collision for this collision, skip... \033[0m", __FUNCTION__, __LINE__); return; } if (eh.fFillEventHistograms) { @@ -8535,12 +8568,13 @@ void FillEventHistograms(T1 const& collision, T2 const& tracks, eBeforeAfter ba) // eh.fEventHistograms[eTotalMultiplicity][eSim][ba]->Fill(tracks.size()); // TBI 20231106 check how to get corresponding MC truth info, and validate further // eh.fEventHistograms[eMultiplicity][eSim][ba]->Fill(ebye.fMultiplicity); // TBI 20241123 re-think if I really need it here. If yes, most likely I will have to // generalize fSelectedTracks to an array, to counter separately selected sim particles - // eh.fEventHistograms[eCentrality][eSim][ba]->Fill(ebye.fCentrality); // TBI 20240120 this case is still not supported in DetermineCentrality() + !eh.fEventHistograms[eCentrality][eSim][ba] ? true : eh.fEventHistograms[eCentrality][eSim][ba]->Fill(ebye.fCentralitySim); } // QA: if (qa.fFillQAEventHistograms2D) { !qa.fQAEventHistograms2D[eCentrality_vs_ImpactParameter][eSim][ba] ? true : qa.fQAEventHistograms2D[eCentrality_vs_ImpactParameter][eSim][ba]->Fill(ebye.fCentrality, collision.mcCollision().impactParameter()); + !qa.fQAEventHistograms2D[eCentrality_vs_CentralitySim][eSim][ba] ? true : qa.fQAEventHistograms2D[eCentrality_vs_CentralitySim][eSim][ba]->Fill(ebye.fCentrality, ebye.fCentralitySim); // ... } } // if constexpr (rs == eRecAndSim) { @@ -8554,7 +8588,7 @@ void FillEventHistograms(T1 const& collision, T2 const& tracks, eBeforeAfter ba) !eh.fEventHistograms[eImpactParameter][eSim][ba] ? true : eh.fEventHistograms[eImpactParameter][eSim][ba]->Fill(collision.impactParameter()); // yes, because in this branch 'collision' is always aod::McCollision !eh.fEventHistograms[eEventPlaneAngle][eSim][ba] ? true : eh.fEventHistograms[eEventPlaneAngle][eSim][ba]->Fill(collision.eventPlaneAngle()); // yes, because in this branch 'collision' is always aod::McCollision !eh.fEventHistograms[eMultiplicity][eSim][ba] ? true : eh.fEventHistograms[eMultiplicity][eSim][ba]->Fill(ebye.fMultiplicity); - // eh.fEventHistograms[eCentrality][eSim][ba]->Fill(ebye.fCentrality); // TBI 20240120 this case is still not supported in DetermineCentrality() + !eh.fEventHistograms[eCentrality][eSim][ba] ? true : eh.fEventHistograms[eCentrality][eSim][ba]->Fill(ebye.fCentrality); // ebye.fCentrality = ebye.fCentralitySim in any case in this branh // eh.fEventHistograms[eReferenceMultiplicity][eSim][ba]->Fill(ebye.fReferenceMultiplicity); // TBI 20241123 this case is still not supported in DetermineReferenceMultiplicity() // eh.fEventHistograms[eTotalMultiplicity][eSim][ba]->Fill(tracks.size()); // TBI 20231030 check further how to use the same thing for 'sim' } @@ -8678,7 +8712,7 @@ void FillEventHistograms(T1 const& collision, T2 const& tracks, eBeforeAfter ba) // See https://github.com/AliceO2Group/O2Physics/blob/master/Tutorials/src/mcHistograms.cxx if constexpr (rs == eRecAndSim) { if (!collision.has_mcCollision()) { - LOGF(warning, "No MC collision for this collision, skip..."); + LOGF(warning, "\033[1;31m%s at line %d : No MC collision for this collision, skip... \033[0m", __FUNCTION__, __LINE__); return; } @@ -8712,7 +8746,7 @@ void FillEventHistograms(T1 const& collision, T2 const& tracks, eBeforeAfter ba) // See https://github.com/AliceO2Group/O2Physics/blob/master/Tutorials/src/mcHistograms.cxx if constexpr (rs == eRecAndSim_Run2 || rs == eRecAndSim_Run1) { if (!collision.has_mcCollision()) { - LOGF(warning, "No MC collision for this collision, skip..."); + LOGF(warning, "\033[1;31m%s at line %d : No MC collision for this collision, skip... \033[0m", __FUNCTION__, __LINE__); return; } // !eh.fEventHistograms[eNumberOfEvents][eSim][ba] ? true : eh.fEventHistograms[eNumberOfEvents][eSim][ba]->Fill(0.5); @@ -9051,7 +9085,7 @@ float GetCentralityPercentile(TString ce) } else if (ce.EqualTo("centNGlobal", TString::kIgnoreCase)) { // centralityPercentile = qa.fCentrality[eCentNGlobal]; // TBI 20250331 enable eventually - // ... ctd here with Run 3 estimators ... + // ... ctd. here with Run 3 estimators ... // Run 1 and Run 2: } else if (ce.EqualTo("centRun2V0M", TString::kIgnoreCase)) { @@ -9059,7 +9093,7 @@ float GetCentralityPercentile(TString ce) } else if (ce.EqualTo("centRun2SPDTracklets", TString::kIgnoreCase)) { centralityPercentile = qa.fCentrality[eCentRun2SPDTracklets]; - // ... ctd here with Run 1 and Run 2 estimators ... + // ... ctd. here with Run 1 and Run 2 estimators ... } else { LOGF(fatal, "\033[1;31m%s at line %d : centrality estimator = %s is not supported yet. \033[0m", __FUNCTION__, __LINE__, ce.Data()); @@ -10326,7 +10360,7 @@ void CalculateCorrelations() // for on-the-fly and internal validation, rescale results with theoretical value: if (iv.fUseInternalValidation && iv.fRescaleWithTheoreticalInput && iv.fInternalValidationVnPsin[eVn] && std::abs(iv.fInternalValidationVnPsin[eVn]->GetAt(h - 1)) > 0.) { - twoC /= pow(iv.fInternalValidationVnPsin[eVn]->GetAt(h - 1), 2.); + twoC /= std::pow(iv.fInternalValidationVnPsin[eVn]->GetAt(h - 1), 2.); } // integrated: @@ -10395,7 +10429,7 @@ void CalculateCorrelations() // for on-the-fly and internal validation, rescale results with theoretical value: if (iv.fUseInternalValidation && iv.fRescaleWithTheoreticalInput && iv.fInternalValidationVnPsin[eVn] && std::abs(iv.fInternalValidationVnPsin[eVn]->GetAt(h - 1)) > 0.) { - fourC /= pow(iv.fInternalValidationVnPsin[eVn]->GetAt(h - 1), 4.); + fourC /= std::pow(iv.fInternalValidationVnPsin[eVn]->GetAt(h - 1), 4.); } // integrated: @@ -10466,7 +10500,7 @@ void CalculateCorrelations() // for on-the-fly and internal validation, rescale results with theoretical value: if (iv.fUseInternalValidation && iv.fRescaleWithTheoreticalInput && iv.fInternalValidationVnPsin[eVn] && std::abs(iv.fInternalValidationVnPsin[eVn]->GetAt(h - 1)) > 0.) { - sixC /= pow(iv.fInternalValidationVnPsin[eVn]->GetAt(h - 1), 6.); + sixC /= std::pow(iv.fInternalValidationVnPsin[eVn]->GetAt(h - 1), 6.); } // integrated: @@ -10539,7 +10573,7 @@ void CalculateCorrelations() // for on-the-fly and internal validation, rescale results with theoretical value: if (iv.fUseInternalValidation && iv.fRescaleWithTheoreticalInput && iv.fInternalValidationVnPsin[eVn] && std::abs(iv.fInternalValidationVnPsin[eVn]->GetAt(h - 1)) > 0.) { - eightC /= pow(iv.fInternalValidationVnPsin[eVn]->GetAt(h - 1), 8.); + eightC /= std::pow(iv.fInternalValidationVnPsin[eVn]->GetAt(h - 1), 8.); } // integrated: @@ -11111,7 +11145,7 @@ void CalculateEtaSeparations() // for on-the-fly and internal validation, rescale results with theoretical value: if (iv.fUseInternalValidation && iv.fRescaleWithTheoreticalInput && iv.fInternalValidationVnPsin[eVn] && std::abs(iv.fInternalValidationVnPsin[eVn]->GetAt(h)) > 0.) { - correlation /= pow(iv.fInternalValidationVnPsin[eVn]->GetAt(h), 2.); + correlation /= std::pow(iv.fInternalValidationVnPsin[eVn]->GetAt(h), 2.); } // integrated: @@ -11228,7 +11262,7 @@ void CalculateKineEtaSeparations(eAsFunctionOf AFO_variable) // for on-the-fly and internal validation, rescale results with theoretical value: if (iv.fUseInternalValidation && iv.fRescaleWithTheoreticalInput && iv.fInternalValidationVnPsin[eVn] && std::abs(iv.fInternalValidationVnPsin[eVn]->GetAt(h)) > 0.) { - correlation /= pow(iv.fInternalValidationVnPsin[eVn]->GetAt(h), 2.); + correlation /= std::pow(iv.fInternalValidationVnPsin[eVn]->GetAt(h), 2.); } // finally, fill: @@ -13692,7 +13726,7 @@ double WeightFromSparse(const double& dPhi, const double& dPt, const double& dEt } // *) Reduce dimensionality is possible, i.e. look up only the dimensions in THnSparse which were requested in this analysis: - Int_t dim = 1; // yes, because dimension 0 is always reserved for each category + int dim = 1; // yes, because dimension 0 is always reserved for each category switch (dwc) { case eDWPhi: { // Remember that ordering here has to resemble ordering in eDiffPhiWeights @@ -13759,6 +13793,11 @@ double WeightFromSparse(const double& dPhi, const double& dPt, const double& dEt // *) okay, let's fetch the weight: int bin = pw.fDiffWeightsSparse[dwc]->GetBin(pw.fFindBinVector[dwc]->GetArray()); // this is the general bin, corresponding to the actual multidimensional bin // TBI 20250224 do I need some insanity check here, e.g. that bin is neither in overflow nor in underflow? + // If I decide to implement this, remember e.g. for 2D case that all bins of type (0,1), (0,2) ... are underflow of first variable, + // and all bins of type (1,0), (2,0), ... are underflow of second variable. Analogously for overflow. + // Each of these cases, however, have different global bin! + // Total number of linearized global bins for N-dimensional sparse = (N_1 + 2) * (N_2 + 2) * ... (N_N + 2), + // where N_1 is number of bins in first dimension, etc. The offset + 2 in each case counts underflow and overflow. double weight = pw.fDiffWeightsSparse[dwc]->GetBinContent(bin); if (tc.fVerbose) { @@ -14917,9 +14956,12 @@ template void DetermineCentrality(T const& collision) { // Determine collision centrality. + // For simulated data, I determine ebye.ImpactParameter here as well. + + // TBI 20250429 there it a bit of code bloat here in this function // a) For real data, determine centrality from default centrality estimator; - // b) For simulated data, determine centrality directly from impact parameter; + // b) For simulated data, determine centrality directly from impact parameter + store impact parameter; // c) Same as a), just for converted Run 2 data; // d) Same as b), just for converted Run 2 data; // e) Same as a), just for converted Run 1 data; @@ -14959,13 +15001,27 @@ void DetermineCentrality(T const& collision) // qa.fCentrality[eCentNGlobal] = collision.centNGlobal(); // TBI 20250128 enable eventually } - // TBI 20240120 I could also here access also corresponding simulated centrality from impact parameter, if available through collision.has_mcCollision() + // ... + + // ... and corresponding MC truth simulated: + if constexpr (rs == eRecAndSim) { + + // *) Impact parameter: + ebye.fImpactParameter = collision.mcCollision().impactParameter(); // has to be called before DetermineSimulatedCentrality(); + + // *) Centrality for simulated data in Run 3: + ebye.fCentralitySim = DetermineSimulatedCentrality(); + + // ... + + } // if constexpr (rs == eRecAndSim) - } // if constexpr (rs == eRec || rs == eRecAndSim) + } // if constexpr (rs == eRec || rs == eRecAndSim || rs == eQA) - // b) For simulated data, determine centrality directly from impact parameter: + // b) For simulated data, determine centrality directly from impact parameter + store impact parameter: if constexpr (rs == eSim) { - ebye.fCentrality = -44.; // TBI 20240120 add support eventualy + ebye.fImpactParameter = collision.mcCollision().impactParameter(); // has to be called before DetermineSimulatedCentrality(); + ebye.fCentrality = DetermineSimulatedCentrality(); // yes, I use here ebye.fCentrality, not ebye.fCentralitySim } // c) Same as a), just for converted Run 2 data: @@ -14983,12 +15039,27 @@ void DetermineCentrality(T const& collision) qa.fCentrality[eCentRun2SPDTracklets] = collision.centRun2SPDTracklets(); } - // TBI 20240120 I could also here access also corresponding simulated centrality from impact parameter, if available through collision.has_mcCollision() + // ... + + // ... and corresponding MC truth simulated: + + if constexpr (rs == eRecAndSim_Run2) { + + // *) Impact parameter: + ebye.fImpactParameter = collision.mcCollision().impactParameter(); // has to be called before DetermineSimulatedCentrality(); + + // *) Centrality for simulated data in Run 3: + ebye.fCentralitySim = DetermineSimulatedCentrality(); + + // ... + + } // if constexpr (rs == eRecAndSim_Run2) } // d) Same as b), just for converted Run 2 data: if constexpr (rs == eSim_Run2) { - ebye.fCentrality = -44.; // TBI 20240120 add support eventualy + ebye.fImpactParameter = collision.mcCollision().impactParameter(); // has to be called before DetermineSimulatedCentrality(); + ebye.fCentrality = DetermineSimulatedCentrality(); // yes, I use here ebye.fCentrality, not ebye.fCentralitySim } // e) Same as a), just for converted Run 1 data: @@ -15000,12 +15071,26 @@ void DetermineCentrality(T const& collision) } else { LOGF(fatal, "\033[1;31m%s at line %d : centrality estimator = %d is not supported yet. \033[0m", __FUNCTION__, __LINE__, ec.fsEventCuts[eCentralityEstimator].Data()); } - // TBI 20240120 I could also here access also corresponding simulated centrality from impact parameter, if available through collision.has_mcCollision() + + // ... and corresponding MC truth simulated: + + if constexpr (rs == eRecAndSim_Run1) { + + // *) Impact parameter: + ebye.fImpactParameter = collision.mcCollision().impactParameter(); // has to be called before DetermineSimulatedCentrality(); + + // *) Centrality for simulated data in Run 3: + ebye.fCentralitySim = DetermineSimulatedCentrality(); + + // ... + + } // if constexpr (rs == eRecAndSim_Run1) } // f) Same as b), just for converted Run 1 data: if constexpr (rs == eSim_Run1) { - ebye.fCentrality = -44.; // TBI 20240515 add support eventualy, or merge with Run 2 branch. It seems that in converted Run 1 there is no centrality. + ebye.fImpactParameter = collision.mcCollision().impactParameter(); // has to be called before DetermineSimulatedCentrality(); + ebye.fCentrality = DetermineSimulatedCentrality(); // yes, I use here ebye.fCentrality, not ebye.fCentralitySim } // g) Test case: @@ -15016,6 +15101,7 @@ void DetermineCentrality(T const& collision) // h) Print centrality for the audience...: if (tc.fVerbose) { LOGF(info, "\033[1;32m ebye.fCentrality = %f\033[0m", ebye.fCentrality); + LOGF(info, "\033[1;32m ebye.fCentralitySim = %f\033[0m", ebye.fCentralitySim); ExitFunction(__FUNCTION__); } @@ -15023,6 +15109,73 @@ void DetermineCentrality(T const& collision) //============================================================ +float DetermineSimulatedCentrality() +{ + // Determine centrality at generated/simulated level, just using impact parameter. + // This is a helper function for DetermineCentrality(), to reduce the code bloat there. I do not anticipate calling this function anywhere alse at the moment. + + // Algorithm: + // 1. Ideally, I simply fetch this centrality from the table HepMCHeavyIons via getter .centrality(); + // 2. If that info is not available, I calculate the simulated centrality here temporarily manually from impact parameter + sigma_inel; + // 3. From process switches I can see whether I am processing Run 3, Run 2 or Run 1 data, for collision system I support at the moment only Pb+Pb. + + if (tc.fVerbose) { + StartFunction(__FUNCTION__); + } + + float lSimulatedCentrality = -1.; + float lSigmaInel = -1.; + + if (tc.fProcess[eProcessHepMChi]) { + // I have extracted already by this point simulated centrality from HepMCHeavyIons and stored it in ebye.fCentralitySim: + + // TBI 20250429 when I merge eProcessHepMChi with other RecSim process switches, I will have to refurbish the code here + + lSimulatedCentrality = ebye.fCentralitySim; + + } else if (tc.fProcess[eGenericRecSim] || tc.fProcess[eGenericSim]) { + + LOGF(warning, "\033[1;33m%s at line %d : Simulated centrality is calculated manually for the time being from impact parameter. Results make sense only for Pb+Pb at Run 3, Run 2 and Run 1 energies, other cases are not supported here (yet)\033[0m\n", __FUNCTION__, __LINE__); + + // Algorithm: Temporarily, I calculate centrality manually for simulated data directly from impact parameter as follows: + + // centrality(b) = Pi * b^2 / sigma_inel , where e.g. I take sigma_inel = 7.67 for Pb+Pb at 5.02 TeV, and analogously for other collision systems and energies + + if (tc.fProcess[eProcessRecSim] || tc.fProcess[eSim]) { + // Pb+Pb in Run 3: + lSigmaInel = 7.71; // interpolation, see Slide 3 in DDC presentation https://indico.cern.ch/event/1326916/ + } else if (tc.fProcess[eProcessRecSim_Run2] || tc.fProcess[eSim_Run2]) { + // Pb+Pb in Run 2: + lSigmaInel = 7.67; // for 5.02 TeV, see Slide 3 in DDC presentation https://indico.cern.ch/event/1326916/ + Run 2 paper https://arxiv.org/abs/2204.10148 + } else if (tc.fProcess[eProcessRecSim_Run1] || tc.fProcess[eSim_Run1]) { + // Pb+Pb in Run 1: + lSigmaInel = 7.55; // see Slide 3 in DDC presentation https://indico.cern.ch/event/1326916/ + Run 1 multiplicity paper https://arxiv.org/abs/1301.4361 + } else { + LOGF(fatal, "\033[1;31m%s at line %d : this branch is not supported/validated yet\033[0m", __FUNCTION__, __LINE__); + } + + // okay, I have SigmaInel for this collision system and energy, calculate centrality: + float b = ebye.fImpactParameter; + if (b < 0.) { + LOGF(warning, "\033[1;31m%s at line %d : b < 0. => did you forget to calculate ebye.fImpactParameter before calling DetermineSimulatedCentrality() ? Or you are processing Monte Carlo dataset where IP was not stored, i.e. it's set to -999 (e.g. in LHC21i6a) ? Setting lSimulatedCentrality = -1. and simply continuing... \033[0m", __FUNCTION__, __LINE__); + lSimulatedCentrality = -1.; + } else { + lSimulatedCentrality = o2::constants::math::PI * std::pow(b, 2.) / lSigmaInel; // finally, calculate true simulated centrality directly from impact parameter + } + } else { + LOGF(fatal, "\033[1;31m%s at line %d : this branch is not supported/validated yet\033[0m", __FUNCTION__, __LINE__); + } + + if (tc.fVerbose) { + ExitFunction(__FUNCTION__); + } + + return lSimulatedCentrality; + +} // float DetermineSimulatedCentrality() + +//============================================================ + template void DetermineOccupancy(T const& collision) { @@ -15092,7 +15245,7 @@ void DetermineInteractionRateAndCurrentRunDuration(T1 const& collision, T2 const auto bc = collision.template foundBC_as(); // I have the same code snippet at other places, keep in sync. // a1) Determine interaction rate only for eRec: - if (ec.fUseEventCuts[eInteractionRate] || qa.fFillQAEventHistograms2D || qa.fFillQACorrelationsVsInteractionRateVsProfiles2D || mupa.fCalculateCorrelationsAsFunctionOf[AFO_INTERACTIONRATE] || t0.fCalculateTest0AsFunctionOf[AFO_INTERACTIONRATE] || es.fCalculateEtaSeparationsAsFunctionOf[AFO_INTERACTIONRATE]) { + if (ec.fUseEventCuts[eInteractionRate] || qa.fFillQAEventHistograms2D || qa.fFillQACorrelationsVsInteractionRateVsProfiles2D || (mupa.fCalculateCorrelations && mupa.fCalculateCorrelationsAsFunctionOf[AFO_INTERACTIONRATE]) || (t0.fCalculateTest0 && t0.fCalculateTest0AsFunctionOf[AFO_INTERACTIONRATE]) || (es.fCalculateEtaSeparations && es.fCalculateEtaSeparationsAsFunctionOf[AFO_INTERACTIONRATE])) { LOGF(info, "\033[1;33m%s at line %d: !!!! WARNING !!!! There is a large memory blow-up of ~130 MB when calling mRateFetcher.fetch(...) !!!! WARNING !!!! \033[0m", __FUNCTION__, __LINE__); @@ -15198,6 +15351,30 @@ void DetermineQAThingies(T1 const& collision, T2 const&) //============================================================ +void ProcessHepMCHeavyIons(aod::HepMCHeavyIon const& hep) +{ + // Process extra MC info from HepMCHeavyIons only in this function. + // See documentation at https://aliceo2group.github.io/analysis-framework/docs/datamodel/ao2dTables.html#montecarlo + + LOGF(info, "\033[1;32m hep.mcCollisionId() = %d\033[0m", hep.mcCollisionId()); + LOGF(info, "\033[1;32m hep.centrality() = %f\033[0m", hep.centrality()); // TBI 20250428 set to -1 in LHC24g3 + LOGF(info, "\033[1;32m hep.eccentricity() = %f\033[0m", hep.eccentricity()); // TBI 20250428 set to 0 in LHC24g3 + LOGF(info, "\033[1;32m hep.sigmaInelNN() = %f\033[0m", hep.sigmaInelNN()); // TBI 20250428 set to 0 in LHC24g3 + LOGF(info, "\033[1;32m hep.eventPlaneAngle() = %f\033[0m", hep.eventPlaneAngle()); // TBI 20250428 set to 0 in LHC24g3, but stored correctly in McCollisions + LOGF(info, "\033[1;32m hep.impactParameter() = %f\033[0m\n", hep.impactParameter()); // stored correctly both in HepMCHeavyIons and McCollisions + + // *) Centrality at generated level: + ebye.fCentralitySim = hep.centrality(); + if (ebye.fCentralitySim < 0. || ebye.fCentralitySim > 100.) { + LOGF(info, "\033[1;33m%s at line %d: !!!! WARNING !!!! ebye.fCentralitySim = %f, this info is still not stored in the table HepMCHeavyIons !!!! WARNING !!!! \033[0m\n", __FUNCTION__, __LINE__, ebye.fCentralitySim); + } + + // ... TBI 20240429 as soon as HepMCHeavyIons data is stored filled in Monte Carlo datasets, ctd. here + +} // void ProcessHepMCHeavyIons(aod::HepMCHeavyIon const& hep) + +//============================================================ + void DetermineEventCounters() { // Determine all event counters. @@ -15567,7 +15744,7 @@ void FillQvector(const double& dPhi, const double& dPt, const double& dEta) for (int h = 0; h < gMaxHarmonic * gMaxCorrelator + 1; h++) { for (int wp = 0; wp < gMaxCorrelator + 1; wp++) { // weight power if (pw.fUseWeights[wPHI] || pw.fUseWeights[wPT] || pw.fUseWeights[wETA]) { - wToPowerP = pow(wPhi * wPt * wEta, wp); + wToPowerP = std::pow(wPhi * wPt * wEta, wp); qv.fQvector[h][wp] += TComplex(wToPowerP * std::cos(h * dPhi), wToPowerP * std::sin(h * dPhi)); // Q-vector with weights } else { qv.fQvector[h][wp] += TComplex(std::cos(h * dPhi), std::sin(h * dPhi)); // bare Q-vector without weights @@ -15699,7 +15876,7 @@ void FillQvectorFromSparse(const double& dPhi, const double& dPt, const double& for (int h = 0; h < gMaxHarmonic * gMaxCorrelator + 1; h++) { for (int wp = 0; wp < gMaxCorrelator + 1; wp++) { // weight power if (pw.fUseDiffPhiWeights[wPhiPhiAxis] || pw.fUseDiffPtWeights[wPtPtAxis] || pw.fUseDiffEtaWeights[wEtaEtaAxis]) { - wToPowerP = pow(wPhi * wPt * wEta, wp); + wToPowerP = std::pow(wPhi * wPt * wEta, wp); qv.fQvector[h][wp] += TComplex(wToPowerP * std::cos(h * dPhi), wToPowerP * std::sin(h * dPhi)); // Q-vector with weights } else { qv.fQvector[h][wp] += TComplex(std::cos(h * dPhi), std::sin(h * dPhi)); // bare Q-vector without weights @@ -15828,7 +16005,7 @@ void Fillqvector(const double& dPhi, const double& kineVarValue, eqvectorKine ki if (pw.fUseWeights[AFO_weight] || pw.fUseDiffWeights[AFO_diffWeight]) { // TBI 20240212 supported at the moment: e.g. q-vector vs pt can be weighted only with diff. phi(pt) and integrated pt weights. // It cannot be weighted in addition with eta weights, since in any case I anticipate I will do always 1-D analysis, by integrating out all other dependencies - wToPowerP = pow(diffPhiWeightsForThisKineVar * kineVarWeight, wp); + wToPowerP = std::pow(diffPhiWeightsForThisKineVar * kineVarWeight, wp); qv.fqvector[kineVarChoice][bin - 1][h][wp] += TComplex(wToPowerP * std::cos(h * dPhi), wToPowerP * std::sin(h * dPhi)); // q-vector with weights } else { qv.fqvector[kineVarChoice][bin - 1][h][wp] += TComplex(std::cos(h * dPhi), std::sin(h * dPhi)); // bare q-vector without weights @@ -16006,6 +16183,9 @@ void MainLoopOverParticles(T const& tracks) // Remark #4: // *) There is also processQA(...), to process data with maximum subscription to the tables (use for Run 3 only). To use it, set field "processQA: "true" in json config + // Remark #5: + // *) Switch ProcessHepMChi(...) amounts at the moment to calling one dedicated function + calling Steer for "RecSim", so no special care is needed here for that switch. + if (tc.fVerbose) { StartFunction(__FUNCTION__); } @@ -16200,6 +16380,7 @@ void Steer(T1 const& collision, T2 const& bcs, T3 const& tracks) DetermineReferenceMultiplicity(collision); // *) Determine collision centrality: + // Remark: I determine also IP here. DetermineCentrality(collision); // *) Determine collision occupancy: diff --git a/PWGCF/MultiparticleCorrelations/Tasks/multiparticle-correlations-ab.cxx b/PWGCF/MultiparticleCorrelations/Tasks/multiparticle-correlations-ab.cxx index 0ee4f0cd5eb..344c45a7330 100644 --- a/PWGCF/MultiparticleCorrelations/Tasks/multiparticle-correlations-ab.cxx +++ b/PWGCF/MultiparticleCorrelations/Tasks/multiparticle-correlations-ab.cxx @@ -310,6 +310,53 @@ struct MultiparticleCorrelationsAB // this name is used in lower-case format to } PROCESS_SWITCH(MultiparticleCorrelationsAB, processQA, "QA processing", false); + // ------------------------------------------- + + // L) Process extra Monte Carlo info the from table HepMCHeavyIons: + // Remark 1: Under testing, merge eventually this process switch with processRecSim, processRecSim_Run2, and processRecSim_Run1 above; + // This switch does everything the same as processRecSim (so it works only for Run 3 at the moment), except extra info is processed from table HepMCHeavyIons with dedicated function call + // ProcessHepMCHeavyIons(hepMChi). I use this dedicated function, in order not to modify call to Steer(...) by adding the fourth argument. + // TBI 20250429 see if I can circumvent this with templates (i can NOT join HepMCHeavyIons and McParticles), in order to keep call to Steer(...) as simple as it is now + // Remark 2: In MC LHC24g3 and LHC24e2c, for HepMCHeavyIons only impact parameter is filled; + // As soon as HepMCHeavyIons is correctly filled in MC productions, merge this switch with processRecSim, processRecSim_Run2, and processRecSim_Run1 above. + // Most notably, I will need hep.centrality() (centrality at generated level), and hep.sigmaInelNN() + void processHepMChi(CollisionRecSim const& collision, aod::BCs const& bcs, TracksRecSim const& tracks, aod::HepMCHeavyIons const& hepMChi, aod::McParticles const&, aod::McCollisions const&) + { + // Comment the weather here... + + // *) Check if this collision has the corresponding MC collision: + if (!collision.has_mcCollision()) { + LOGF(warning, "\033[1;31m%s at line %d : No MC collision for this collision, skip... \033[0m", __FUNCTION__, __LINE__); + return; + } + + // *) For this collision, get the corresponding mcCollision, and then profit from the fact that HepMCHeavyIons have index to mcCollision by default (no need to join with McCollisionLabels): + auto hep = hepMChi.iteratorAt(collision.mcCollision().globalIndex()); + + // *) Quick insanity check that HepMCHeavyIons and McCollisions refer to the same MC collision: + // Since both of them provide getter impactParameter(), i simply check if it gives the same value in both cases: + if (std::abs(hep.impactParameter() - collision.mcCollision().impactParameter()) > tc.fFloatingPointPrecision) { + LOGF(fatal, "\033[1;31m%s at line %d : impactParameter accessed from HepMCHeavyIons and McCollisions is not the same, they do not correspond to the same MC event \033[0m", __FUNCTION__, __LINE__); + } + + // *) Okay, extract all extra info from HepMCHeavyIons: + ProcessHepMCHeavyIons(hep); + + // *) Call the Steer(...) + // TBI 20250429 For the time being, only Run 3 call for Steer(...) is supported. When generalizing to Run 2 and Run 1 process switches, perhaps the better strategy is + // just to inject ProcessHepMCHeavyIons(hep); , and keep call to Steer(...) as it is now? + Steer(collision, bcs, tracks); // TBI 20250429 remember that I have hardwired here eRecAndSim, so this now works only for Run 3 + + } // void processHepMChi( ... ) + + PROCESS_SWITCH(MultiparticleCorrelationsAB, processHepMChi, "HepMCHeavyIons processing", false); + + // ------------------------------------------- + + // ... ctd. here with further process switches ... + + // ------------------------------------------- + }; // struct MultiparticleCorrelationsAB // ------------------------------------------- From 5bf64d523a09d6eb6e919226b093b55b47fd8864 Mon Sep 17 00:00:00 2001 From: czhang Date: Tue, 13 May 2025 23:23:10 +0200 Subject: [PATCH 1264/1650] [PWGDQ] Adding cut for removable realigned muons (#11097) --- PWGDQ/TableProducer/tableMaker.cxx | 11 ++++++++++- PWGDQ/TableProducer/tableMaker_withAssoc.cxx | 18 ++++++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/PWGDQ/TableProducer/tableMaker.cxx b/PWGDQ/TableProducer/tableMaker.cxx index bde53864977..1e7442fa275 100644 --- a/PWGDQ/TableProducer/tableMaker.cxx +++ b/PWGDQ/TableProducer/tableMaker.cxx @@ -1120,6 +1120,7 @@ struct TableMaker { for (const auto& muonId : fwdtrackIndices) { // start loop over tracks auto muon = muonId.template fwdtrack_as(); trackFilteringTag = static_cast(0); + int realignRemoveFlag = 0; if constexpr (static_cast(TMuonRealignFillMap)) { // Update muon information using realigned tracks if (static_cast(muon.trackType()) > 2) { @@ -1128,6 +1129,7 @@ struct TableMaker { if (muonRealignSelected.size() == 1) { for (const auto& muonRealign : muonRealignSelected) { VarManager::FillTrack(muonRealign); + realignRemoveFlag = muonRealign.isRemovable(); } } else { LOGF(fatal, "Inconsistent size of realigned muon track candidates."); @@ -1151,7 +1153,7 @@ struct TableMaker { trackTempFilterMap |= (uint8_t(1) << i); } - if (!trackTempFilterMap) { // does not pass the cuts + if (!trackTempFilterMap || realignRemoveFlag) { // does not pass the cuts nDel++; } else { // it passes the cuts and will be saved in the tables newEntryNb[muon.index()] = muon.index() - nDel; @@ -1174,11 +1176,13 @@ struct TableMaker { if (static_cast(muon.trackType()) > 2) { // Update only MCH or MCH-MID tracks with realigned information auto muonRealignSelected = tracksMuonRealign.sliceBy(fwdtrackRealignPerMuon, muonId.fwdtrackId()); + int realignRemoveFlag = 0; if (muonRealignSelected.size() == 1) { for (const auto& muonRealign : muonRealignSelected) { LOGF(debug, "Muon original - collisionId:%d x:%g y:%g z:%g phi:%g tgl:%g signed1pt:%g pt:%g p:%g eta:%g chi2:%g", muon.collisionId(), muon.x(), muon.y(), muon.z(), muon.phi(), muon.tgl(), muon.signed1Pt(), muon.pt(), muon.p(), muon.eta(), muon.chi2()); LOGF(debug, "Muon realigned - collisionId:%d x:%g y:%g z:%g phi:%g tgl:%g signed1pt:%g pt:%g p:%g eta:%g chi2:%g", muonRealign.collisionId(), muonRealign.x(), muonRealign.y(), muonRealign.z(), muonRealign.phi(), muonRealign.tgl(), muonRealign.signed1Pt(), muonRealign.pt(), muonRealign.p(), muonRealign.eta(), muonRealign.chi2()); VarManager::FillTrack(muonRealign); + realignRemoveFlag = muonRealign.isRemovable(); // recalculte pDca for global muon tracks VarManager::FillTrackCollision(muonRealign, collision); @@ -1187,6 +1191,11 @@ struct TableMaker { VarManager::FillPropagateMuon(muonRealign, collision); } } + + if (realignRemoveFlag) { + continue; + } + } else { LOGF(fatal, "Inconsistent size of realigned muon track candidates."); } diff --git a/PWGDQ/TableProducer/tableMaker_withAssoc.cxx b/PWGDQ/TableProducer/tableMaker_withAssoc.cxx index a6d72986bef..651d157c531 100644 --- a/PWGDQ/TableProducer/tableMaker_withAssoc.cxx +++ b/PWGDQ/TableProducer/tableMaker_withAssoc.cxx @@ -261,7 +261,7 @@ struct TableMaker { o2::parameters::GRPObject* fGrpMagRun2 = nullptr; // for run 2, we access the GRPObject from GLO/GRP/GRP o2::parameters::GRPMagField* fGrpMag = nullptr; // for run 3, we access GRPMagField from GLO/Config/GRPMagField - AnalysisCompositeCut* fEventCut; //! Event selection cut + AnalysisCompositeCut* fEventCut; //! Event selection cut std::vector fTrackCuts; //! Barrel track cuts std::vector fMuonCuts; //! Muon track cuts @@ -400,7 +400,7 @@ struct TableMaker { } } - DefineHistograms(histClasses); // define all histograms + DefineHistograms(histClasses); // define all histograms // Additional histogram via the JSON configurable TString addHistsStr = fConfigHistOutput.fConfigAddJSONHistograms.value; if (fConfigHistOutput.fConfigQA && addHistsStr != "") { @@ -1160,10 +1160,12 @@ struct TableMaker { if (static_cast(muon.trackType()) > 2) { // refill kinematic info and recalculate propagation in case of using realigned muons auto muonRealignSelected = muonsRealign.sliceBy(fwdtrackRealignPerMuon, assoc.fwdtrackId()); + int realignRemoveFlag = 0; if (muonRealignSelected.size() == 1) { for (const auto& muonRealign : muonRealignSelected) { // refill muon information with realigned tracks VarManager::FillTrack(muonRealign); + realignRemoveFlag = muonRealign.isRemovable(); if (fConfigVariousOptions.fPropMuon) { VarManager::FillPropagateMuon(muonRealign, collision); @@ -1171,6 +1173,11 @@ struct TableMaker { VarManager::FillTrackCollision(muonRealign, collision); } + + if (realignRemoveFlag) { + continue; + } + } else { LOGF(fatal, "Inconsistent size of realigned muon track candidates."); } @@ -1260,10 +1267,12 @@ struct TableMaker { if (static_cast(muon.trackType()) > 2) { // refill kinematic info and recalculate propagation in case of using realigned muons auto muonRealignSelected = muonsRealign.sliceBy(fwdtrackRealignPerMuon, muon.globalIndex()); + int realignRemoveFlag = 0; if (muonRealignSelected.size() == 1) { for (const auto& muonRealign : muonRealignSelected) { // refill muon information with realigned tracks VarManager::FillTrack(muonRealign); + realignRemoveFlag = muonRealign.isRemovable(); if (fConfigVariousOptions.fPropMuon) { VarManager::FillPropagateMuon(muonRealign, collision); @@ -1271,6 +1280,11 @@ struct TableMaker { VarManager::FillTrackCollision(muonRealign, collision); } + + if (realignRemoveFlag) { + continue; + } + } else { LOGF(fatal, "Inconsistent size of realigned muon track candidates."); } From 2e719a1e27242bcee60f2ad97c8cc45532a6b117 Mon Sep 17 00:00:00 2001 From: Fabrizio Chinu <91954233+fchinu@users.noreply.github.com> Date: Wed, 14 May 2025 11:46:33 +0200 Subject: [PATCH 1265/1650] [PWGHF] Add B->DK decay channels in analysis workflows (#11179) --- .../dataCreatorCharmHadPiReduced.cxx | 71 ++++++++++++++++++- PWGHF/D2H/Tasks/taskB0Reduced.cxx | 16 +++-- PWGHF/D2H/Tasks/taskBplusReduced.cxx | 5 +- PWGHF/D2H/Tasks/taskBsReduced.cxx | 6 +- PWGHF/D2H/Tasks/taskLbReduced.cxx | 9 ++- .../DataModel/CandidateReconstructionTables.h | 6 +- 6 files changed, 99 insertions(+), 14 deletions(-) diff --git a/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx b/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx index 6565d6e7a4e..496f5b5f55f 100644 --- a/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx +++ b/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx @@ -485,6 +485,17 @@ struct HfDataCreatorCharmHadPiReduced { } } } + // B0 → D- K+ → (π- K+ π-) K+ + if (!flag) { + indexRec = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersB[0], vecDaughtersB[1], vecDaughtersB[2], vecDaughtersB[3]}, Pdg::kB0, std::array{-kPiPlus, +kKPlus, -kPiPlus, +kKPlus}, true, &sign, 3); + if (indexRec > -1) { + // D- → π- K+ π- + indexRec = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersB[0], vecDaughtersB[1], vecDaughtersB[2]}, Pdg::kDMinus, std::array{-kPiPlus, +kKPlus, -kPiPlus}, true, &sign, 2); + if (indexRec > -1) { + flag = sign * BIT(hf_cand_b0::DecayTypeMc::B0ToDplusKToPiKPiK); + } + } + } // Partly reconstructed decays, i.e. the 4 prongs have a common b-hadron ancestor // convention: final state particles are prong0,1,2,3 if (!flag) { @@ -604,6 +615,41 @@ struct HfDataCreatorCharmHadPiReduced { } } } + // Bs → Ds- K+ → (K- K+ π-) K+ + if (!flag) { + indexRec = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersB[0], vecDaughtersB[1], vecDaughtersB[2], vecDaughtersB[3]}, Pdg::kBS, std::array{-kKPlus, +kKPlus, -kPiPlus, +kKPlus}, true, &sign, 3); + if (indexRec > -1) { + // Ds- → K- K+ π- + indexRec = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersB[0], vecDaughtersB[1], vecDaughtersB[2]}, -Pdg::kDS, std::array{-kKPlus, +kKPlus, -kPiPlus}, true, &sign, 2); + if (indexRec > -1) { + std::vector arrDaughDsIndex; + std::array arrPDGDaughDs; + RecoDecay::getDaughters(particlesMc.rawIteratorAt(indexRec), &arrDaughDsIndex, std::array{0}, 1); + if (arrDaughDsIndex.size() == NDaughtersDs) { + for (auto iProng = 0u; iProng < arrDaughDsIndex.size(); ++iProng) { + auto daughI = particlesMc.rawIteratorAt(arrDaughDsIndex[iProng]); + arrPDGDaughDs[iProng] = std::abs(daughI.pdgCode()); + } + // Ds- → Phi π- → K- K+ π- and Ds- → K0* K- → K- K+ π- + if ((arrPDGDaughDs[0] == arrPDGResonantDsPhiPi[0] && arrPDGDaughDs[1] == arrPDGResonantDsPhiPi[1]) || (arrPDGDaughDs[0] == arrPDGResonantDsPhiPi[1] && arrPDGDaughDs[1] == arrPDGResonantDsPhiPi[0])) { + flag = sign * BIT(hf_cand_bs::DecayTypeMc::BsToDsKToPhiPiKToKKPiK); + } else if ((arrPDGDaughDs[0] == arrPDGResonantDKstarK[0] && arrPDGDaughDs[1] == arrPDGResonantDKstarK[1]) || (arrPDGDaughDs[0] == arrPDGResonantDKstarK[1] && arrPDGDaughDs[1] == arrPDGResonantDKstarK[0])) { + flag = sign * BIT(hf_cand_bs::DecayTypeMc::BsToDsKToK0starKKToKKPiK); + } + } + } else { + debug = 1; + LOGF(debug, "Bs decays in the expected final state but the condition on the intermediate state is not fulfilled"); + } + + auto indexMother = RecoDecay::getMother(particlesMc, vecDaughtersB.back().template mcParticle_as(), Pdg::kBS, true); + if (indexMother >= 0) { + auto particleMother = particlesMc.rawIteratorAt(indexMother); + motherPt = particleMother.pt(); + checkWrongCollision(particleMother, collision, indexCollisionMaxNumContrib, flagWrongCollision); + } + } + } // Partly reconstructed decays, i.e. the 4 prongs have a common b-hadron ancestor // convention: final state particles are prong0,1,2,3 if (!flag) { @@ -669,7 +715,7 @@ struct HfDataCreatorCharmHadPiReduced { // D0(bar) → K+ π-; indexRec = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersB[0], vecDaughtersB[1]}, Pdg::kD0, std::array{+kPiPlus, -kKPlus}, true, &sign, 1); if (indexRec > -1) { - flag = sign * BIT(hf_cand_bplus::DecayType::BplusToD0Pi); + flag = sign * BIT(hf_cand_bplus::DecayTypeMc::BplusToD0PiToKPiPi); } else { debug = 1; LOGF(debug, "B+ decays in the expected final state but the condition on the intermediate state is not fulfilled"); @@ -684,6 +730,27 @@ struct HfDataCreatorCharmHadPiReduced { } // additional checks for correlated backgrounds if (checkDecayTypeMc) { + if (!flag) { + // B+ → D0(bar) K+ → (K+ π-) K+ + indexRec = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersB[0], vecDaughtersB[1], vecDaughtersB[2]}, Pdg::kBPlus, std::array{+kKPlus, +kKPlus, -kPiPlus}, true, &sign, 2); + if (indexRec > -1) { + // D0(bar) → K+ π-; + indexRec = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersB[0], vecDaughtersB[1]}, Pdg::kD0, std::array{+kPiPlus, -kKPlus}, true, &sign, 1); + if (indexRec > -1) { + flag = sign * BIT(hf_cand_bplus::DecayTypeMc::BplusToD0KToKPiK); + } else { + debug = 1; + LOGF(debug, "B+ decays in the expected final state but the condition on the intermediate state is not fulfilled"); + } + + auto indexMother = RecoDecay::getMother(particlesMc, vecDaughtersB.back().template mcParticle_as(), Pdg::kBPlus, true); + if (indexMother >= 0) { + auto particleMother = particlesMc.rawIteratorAt(indexMother); + motherPt = particleMother.pt(); + checkWrongCollision(particleMother, collision, indexCollisionMaxNumContrib, flagWrongCollision); + } + } + } // Partly reconstructed decays, i.e. the 3 prongs have a common b-hadron ancestor // convention: final state particles are prong0,1,2 if (!flag) { @@ -769,7 +836,7 @@ struct HfDataCreatorCharmHadPiReduced { // Lc+ → p K- π+ indexRec = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersB[0], vecDaughtersB[1], vecDaughtersB[2]}, Pdg::kLambdaCPlus, std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2); if (indexRec > -1) { - flag = sign * BIT(hf_cand_lb::DecayTypeMc::LbToLcPiToPKPiK); + flag = sign * BIT(hf_cand_lb::DecayTypeMc::LbToLcKToPKPiK); } } } diff --git a/PWGHF/D2H/Tasks/taskB0Reduced.cxx b/PWGHF/D2H/Tasks/taskB0Reduced.cxx index d3f81aac980..87138a813bc 100644 --- a/PWGHF/D2H/Tasks/taskB0Reduced.cxx +++ b/PWGHF/D2H/Tasks/taskB0Reduced.cxx @@ -42,8 +42,8 @@ DECLARE_SOA_COLUMN(AbsEtaBach, absEtaBach, float); DECLARE_SOA_COLUMN(ItsNClsBach, itsNClsBach, int); //! Number of ITS clusters of bachelor pion DECLARE_SOA_COLUMN(TpcNClsCrossedRowsBach, tpcNClsCrossedRowsBach, int); //! Number of TPC crossed rows of prongs of bachelor pion DECLARE_SOA_COLUMN(TpcChi2NClBach, tpcChi2NClBach, float); //! Maximum TPC chi2 of prongs of D-meson daughter candidate -DECLARE_SOA_COLUMN(PtDmesProngMin, ptProngDmesMin, float); //! Minimum pT of prongs of D-meson daughter candidate (GeV/c) -DECLARE_SOA_COLUMN(AbsEtaDmesProngMin, absEtaProngDmesMin, float); //! Minimum absolute pseudorapidity of prongs of D-meson daughter candidate +DECLARE_SOA_COLUMN(PtDmesProngMin, ptDmesProngMin, float); //! Minimum pT of prongs of D-meson daughter candidate (GeV/c) +DECLARE_SOA_COLUMN(AbsEtaDmesProngMin, absEtaDmesProngMin, float); //! Minimum absolute pseudorapidity of prongs of D-meson daughter candidate DECLARE_SOA_COLUMN(ItsNClsDmesProngMin, itsNClsDmesProngMin, int); //! Minimum number of ITS clusters of prongs of D-meson daughter candidate DECLARE_SOA_COLUMN(TpcNClsCrossedRowsDmesProngMin, tpcNClsCrossedRowsDmesProngMin, int); //! Minimum number of TPC crossed rows of prongs of D-meson daughter candidate DECLARE_SOA_COLUMN(TpcChi2NClDmesProngMax, tpcChi2NClDmesProngMax, float); //! Maximum TPC chi2 of prongs of D-meson daughter candidate @@ -176,13 +176,13 @@ struct HfTaskB0Reduced { HfHelper hfHelper; + using TracksPion = soa::Join; + using CandsDplus = soa::Join; + Filter filterSelectCandidates = (aod::hf_sel_candidate_b0::isSelB0ToDPi >= selectionFlagB0); HistogramRegistry registry{"registry"}; - using TracksPion = soa::Join; - using CandsDplus = soa::Join; - void init(InitContext&) { std::array processFuncData{doprocessData, doprocessDataWithDmesMl, doprocessDataWithB0Ml}; @@ -310,6 +310,8 @@ struct HfTaskB0Reduced { TString labels[kNBinsDecayTypeMc]; labels[hf_cand_b0::DecayTypeMc::B0ToDplusPiToPiKPiPi] = "B^{0} #rightarrow (D^{#minus} #rightarrow #pi^{#minus} K^{#plus} #pi^{#minus}) #pi^{#plus}"; labels[hf_cand_b0::DecayTypeMc::B0ToDsPiToKKPiPi] = "B^{0} #rightarrow (D^{#minus}_{s} #rightarrow K^{#minus} K^{#plus} #pi^{#minus}) #pi^{#plus}"; + labels[hf_cand_b0::DecayTypeMc::BsToDsPiToKKPiPi] = "B_{s}^{0} #rightarrow (D^{#minus}_{s} #rightarrow K^{#minus} K^{#plus} #pi^{#minus}) #pi^{#plus}"; + labels[hf_cand_b0::DecayTypeMc::B0ToDplusKToPiKPiK] = "B^{0} #rightarrow (D^{#minus} #rightarrow #pi^{#minus} K^{#plus} #pi^{#minus}) K^{#plus}"; labels[hf_cand_b0::DecayTypeMc::PartlyRecoDecay] = "Partly reconstructed decay channel"; labels[hf_cand_b0::DecayTypeMc::OtherDecay] = "Other decays"; static const AxisSpec axisDecayType = {kNBinsDecayTypeMc, 0.5, kNBinsDecayTypeMc + 0.5, ""}; @@ -463,6 +465,10 @@ struct HfTaskB0Reduced { } else if constexpr (withDecayTypeCheck) { if (TESTBIT(flagMcMatchRec, hf_cand_b0::DecayTypeMc::B0ToDsPiToKKPiPi)) { // B0 → Ds- π+ → (K- K+ π-) π+ registry.fill(HIST("hDecayTypeMc"), 1 + hf_cand_b0::DecayTypeMc::B0ToDsPiToKKPiPi, invMassB0, ptCandB0); + } else if (TESTBIT(flagMcMatchRec, hf_cand_b0::DecayTypeMc::BsToDsPiToKKPiPi)) { // B0s → Ds- π+ → (K- K+ π-) π+ + registry.fill(HIST("hDecayTypeMc"), 1 + hf_cand_b0::DecayTypeMc::BsToDsPiToKKPiPi, invMassB0, ptCandB0); + } else if (TESTBIT(flagMcMatchRec, hf_cand_b0::DecayTypeMc::B0ToDplusKToPiKPiK)) { // B0 → D- K+ → (π- K+ π-) K+ + registry.fill(HIST("hDecayTypeMc"), 1 + hf_cand_b0::DecayTypeMc::B0ToDplusKToPiKPiK, invMassB0, ptCandB0); } else if (TESTBIT(flagMcMatchRec, hf_cand_b0::DecayTypeMc::PartlyRecoDecay)) { // Partly reconstructed decay channel registry.fill(HIST("hDecayTypeMc"), 1 + hf_cand_b0::DecayTypeMc::PartlyRecoDecay, invMassB0, ptCandB0); } else { diff --git a/PWGHF/D2H/Tasks/taskBplusReduced.cxx b/PWGHF/D2H/Tasks/taskBplusReduced.cxx index f296b059503..e319692b0c2 100644 --- a/PWGHF/D2H/Tasks/taskBplusReduced.cxx +++ b/PWGHF/D2H/Tasks/taskBplusReduced.cxx @@ -322,6 +322,7 @@ struct HfTaskBplusReduced { constexpr uint8_t kNBinsDecayTypeMc = hf_cand_bplus::DecayTypeMc::NDecayTypeMc; TString labels[kNBinsDecayTypeMc]; labels[hf_cand_bplus::DecayTypeMc::BplusToD0PiToKPiPi] = "B^{+} #rightarrow (#overline{D^{0}} #rightarrow K^{#plus} #pi^{#minus}) #pi^{#plus}"; + labels[hf_cand_bplus::DecayTypeMc::BplusToD0KToKPiK] = "B^{+} #rightarrow (#overline{D^{0}} #rightarrow K^{#plus} #pi^{#minus}) #K^{#plus}"; labels[hf_cand_bplus::DecayTypeMc::PartlyRecoDecay] = "Partly reconstructed decay channel"; labels[hf_cand_bplus::DecayTypeMc::OtherDecay] = "Other decays"; static const AxisSpec axisDecayType = {kNBinsDecayTypeMc, 0.5, kNBinsDecayTypeMc + 0.5, ""}; @@ -478,7 +479,9 @@ struct HfTaskBplusReduced { registry.fill(HIST("hMlScoreSigBplusRecBg"), ptCandBplus, candidate.mlProbBplusToD0Pi()); } } else if constexpr (withDecayTypeCheck) { - if (TESTBIT(flagMcMatchRec, hf_cand_bplus::DecayTypeMc::PartlyRecoDecay)) { // Partly reconstructed decay channel + if (TESTBIT(flagMcMatchRec, hf_cand_bplus::DecayTypeMc::BplusToD0KToKPiK)) { // Partly reconstructed decay channel + registry.fill(HIST("hDecayTypeMc"), 1 + hf_cand_bplus::DecayTypeMc::BplusToD0KToKPiK, invMassBplus, ptCandBplus); + } else if (TESTBIT(flagMcMatchRec, hf_cand_bplus::DecayTypeMc::PartlyRecoDecay)) { // Partly reconstructed decay channel registry.fill(HIST("hDecayTypeMc"), 1 + hf_cand_bplus::DecayTypeMc::PartlyRecoDecay, invMassBplus, ptCandBplus); } else { registry.fill(HIST("hDecayTypeMc"), 1 + hf_cand_bplus::DecayTypeMc::OtherDecay, invMassBplus, ptCandBplus); diff --git a/PWGHF/D2H/Tasks/taskBsReduced.cxx b/PWGHF/D2H/Tasks/taskBsReduced.cxx index 51dadbf05b5..e892a526831 100644 --- a/PWGHF/D2H/Tasks/taskBsReduced.cxx +++ b/PWGHF/D2H/Tasks/taskBsReduced.cxx @@ -127,12 +127,12 @@ struct HfTaskBsReduced { HfHelper hfHelper; + using TracksPion = soa::Join; + Filter filterSelectCandidates = (aod::hf_sel_candidate_bs::isSelBsToDsPi >= selectionFlagBs); HistogramRegistry registry{"registry"}; - using TracksPion = soa::Join; - void init(InitContext&) { std::array processFuncData{doprocessData, doprocessDataWithDmesMl, doprocessDataWithBsMl}; @@ -262,6 +262,8 @@ struct HfTaskBsReduced { labels[hf_cand_bs::DecayTypeMc::BsToDsPiToK0starKPiToKKPiPi] = "B^{0}_{s} #rightarrow (D_{s} #rightarrow K^{0*}K #rightarrow KK#pi) #pi"; labels[hf_cand_bs::DecayTypeMc::B0ToDsPiToPhiPiPiToKKPiPi] = "B^{0} #rightarrow (D_{s} #rightarrow #Phi#pi #rightarrow KK#pi) #pi"; labels[hf_cand_bs::DecayTypeMc::B0ToDsPiToK0starKPiToKKPiPi] = "B^{0} #rightarrow (D_{s} #rightarrow K^{0*}K #rightarrow KK#pi) #pi"; + labels[hf_cand_bs::DecayTypeMc::BsToDsKToPhiPiKToKKPiK] = "B^{0}_{s} #rightarrow (D_{s} #rightarrow #Phi#pi #rightarrow KK#pi) K"; + labels[hf_cand_bs::DecayTypeMc::BsToDsKToK0starKKToKKPiK] = "B^{0}_{s} #rightarrow (D_{s} #rightarrow K^{0*}K #rightarrow KK#pi) K"; labels[hf_cand_bs::DecayTypeMc::PartlyRecoDecay] = "Partly reconstructed decay channel"; labels[hf_cand_bs::DecayTypeMc::OtherDecay] = "Other decays"; static const AxisSpec axisDecayType = {kNBinsDecayTypeMc, 0.5, kNBinsDecayTypeMc + 0.5, ""}; diff --git a/PWGHF/D2H/Tasks/taskLbReduced.cxx b/PWGHF/D2H/Tasks/taskLbReduced.cxx index fb6cf1432d8..12fec7cbbd8 100644 --- a/PWGHF/D2H/Tasks/taskLbReduced.cxx +++ b/PWGHF/D2H/Tasks/taskLbReduced.cxx @@ -306,7 +306,8 @@ struct HfTaskLbReduced { constexpr uint8_t kNBinsDecayTypeMc = hf_cand_lb::DecayTypeMc::NDecayTypeMc; TString labels[kNBinsDecayTypeMc]; labels[hf_cand_lb::DecayTypeMc::LbToLcPiToPKPiPi] = "#Lambda_{b}^{0} #rightarrow (#Lambda_{c}^{#plus} #rightarrow p K^{#minus} #pi^{#plus}) #pi^{#minus}"; - labels[hf_cand_lb::DecayTypeMc::LbToLcPiToPKPiK] = "#Lambda_{b}^{0} #rightarrow (#Lambda_{c}^{#plus} #rightarrow p K^{#minus} #pi^{#plus}) K^{#minus}"; + labels[hf_cand_lb::DecayTypeMc::B0ToDplusPiToPiKPiPi] = "B^{0} #rightarrow (D^{#minus} #rightarrow #pi^{#minus} K^{#plus} #pi^{#minus}) #pi^{#plus}"; + labels[hf_cand_lb::DecayTypeMc::LbToLcKToPKPiK] = "#Lambda_{b}^{0} #rightarrow (#Lambda_{c}^{#plus} #rightarrow p K^{#minus} #pi^{#plus}) K^{#minus}"; labels[hf_cand_lb::DecayTypeMc::PartlyRecoDecay] = "Partly reconstructed decay channel"; labels[hf_cand_lb::DecayTypeMc::OtherDecay] = "Other decays"; static const AxisSpec axisDecayType = {kNBinsDecayTypeMc, 0.5, kNBinsDecayTypeMc + 0.5, ""}; @@ -459,8 +460,10 @@ struct HfTaskLbReduced { registry.fill(HIST("hMlScoreSigLbRecBg"), ptCandLb, candidate.mlProbLbToLcPi()); } } else if constexpr (withDecayTypeCheck) { - if (TESTBIT(flagMcMatchRec, hf_cand_lb::DecayTypeMc::LbToLcPiToPKPiPi)) { // Lb → Lc+ π- → (pK-π+) π- - registry.fill(HIST("hDecayTypeMc"), 1 + hf_cand_lb::DecayTypeMc::LbToLcPiToPKPiK, invMassLb, ptCandLb); + if (TESTBIT(flagMcMatchRec, hf_cand_lb::DecayTypeMc::LbToLcKToPKPiK)) { // Lb → Lc+ K- → (pK-π+) K- + registry.fill(HIST("hDecayTypeMc"), 1 + hf_cand_lb::DecayTypeMc::LbToLcKToPKPiK, invMassLb, ptCandLb); + } else if (TESTBIT(flagMcMatchRec, hf_cand_lb::DecayTypeMc::B0ToDplusPiToPiKPiPi)) { // // B0 → D- π+ → (π- K+ π-) π+ + registry.fill(HIST("hDecayTypeMc"), 1 + hf_cand_lb::DecayTypeMc::B0ToDplusPiToPiKPiPi, invMassLb, ptCandLb); } else if (TESTBIT(flagMcMatchRec, hf_cand_lb::DecayTypeMc::PartlyRecoDecay)) { // Partly reconstructed decay channel registry.fill(HIST("hDecayTypeMc"), 1 + hf_cand_lb::DecayTypeMc::PartlyRecoDecay, invMassLb, ptCandLb); } else { diff --git a/PWGHF/DataModel/CandidateReconstructionTables.h b/PWGHF/DataModel/CandidateReconstructionTables.h index 21ea5e23199..8c2039afee6 100644 --- a/PWGHF/DataModel/CandidateReconstructionTables.h +++ b/PWGHF/DataModel/CandidateReconstructionTables.h @@ -859,6 +859,7 @@ DECLARE_SOA_COLUMN(DebugMcRec, debugMcRec, int8_t); // debug fla enum DecayType { BplusToD0Pi = 0 }; enum DecayTypeMc : uint8_t { BplusToD0PiToKPiPi = 0, + BplusToD0KToKPiK, PartlyRecoDecay, OtherDecay, NDecayTypeMc }; @@ -1913,7 +1914,7 @@ DECLARE_SOA_COLUMN(DebugMcRec, debugMcRec, int8_t); // debug fla enum DecayType { LbToLcPi }; // move this to a dedicated cascade namespace in the future? enum DecayTypeMc : uint8_t { LbToLcPiToPKPiPi = 0, - LbToLcPiToPKPiK, + LbToLcKToPKPiK, B0ToDplusPiToPiKPiPi, PartlyRecoDecay, OtherDecay, @@ -1987,6 +1988,7 @@ enum DecayType { B0ToDPi }; enum DecayTypeMc : uint8_t { B0ToDplusPiToPiKPiPi = 0, B0ToDsPiToKKPiPi, BsToDsPiToKKPiPi, + B0ToDplusKToPiKPiK, PartlyRecoDecay, OtherDecay, NDecayTypeMc }; @@ -2063,6 +2065,8 @@ enum DecayTypeMc : uint8_t { BsToDsPiToPhiPiPiToKKPiPi = 0, // Bs(bar) → Ds∓ BsToDsPiToK0starKPiToKKPiPi, // Bs(bar) → Ds∓ π± → (K0* K∓) π± → (K- K+ π∓) π± B0ToDsPiToPhiPiPiToKKPiPi, // B0(bar) → Ds± π∓ → (Phi π±) π∓ → (K- K+ π±) π∓ B0ToDsPiToK0starKPiToKKPiPi, // B0(bar) → Ds± π∓ → (K0* K±) π∓ → (K- K+ π±) π∓ + BsToDsKToPhiPiKToKKPiK, // Bs(bar) → Ds± K∓ → (Phi π∓) K∓ → (K- K+ π±) K∓ + BsToDsKToK0starKKToKKPiK, // Bs(bar) → Ds± K∓ → (K0* K±) K∓ → (K- K+ π±) K∓ PartlyRecoDecay, // 4 final state particles have another common b-hadron ancestor OtherDecay, NDecayTypeMc }; // counter of differentiated MC decay types From e0426787276683008c6a32d984c44091a9d82d71 Mon Sep 17 00:00:00 2001 From: Hadi Hassan Date: Wed, 14 May 2025 13:29:56 +0300 Subject: [PATCH 1266/1650] [PWGJE] Adding a cut on IP for TreeCreator and SV reconstruction (#11182) --- PWGJE/Core/JetTaggingUtilities.h | 20 +-- PWGJE/Core/MlResponseHfTagging.h | 5 + PWGJE/TableProducer/jetTaggerHF.cxx | 33 +++-- .../secondaryVertexReconstruction.cxx | 4 +- PWGJE/Tasks/bjetTaggingML.cxx | 91 +++++++----- PWGJE/Tasks/bjetTreeCreator.cxx | 139 +++++++++--------- 6 files changed, 164 insertions(+), 128 deletions(-) diff --git a/PWGJE/Core/JetTaggingUtilities.h b/PWGJE/Core/JetTaggingUtilities.h index 424bcceaa63..2f3d9a67d11 100644 --- a/PWGJE/Core/JetTaggingUtilities.h +++ b/PWGJE/Core/JetTaggingUtilities.h @@ -211,12 +211,12 @@ int jetTrackFromHFShower(T const& jet, U const& /*tracks*/, V const& particles, hasMcParticle = true; auto const& particle = track.template mcParticle_as(); origin = RecoDecay::getParticleOrigin(particles, particle, searchUpToQuark); - if (origin == 1 || origin == 2) { // 1=charm , 2=beauty + if (origin == RecoDecay::OriginType::Prompt || origin == RecoDecay::OriginType::NonPrompt) { // 1=charm , 2=beauty hftrack = track; - if (origin == 1) { + if (origin == RecoDecay::OriginType::Prompt) { return JetTaggingSpecies::charm; } - if (origin == 2) { + if (origin == RecoDecay::OriginType::NonPrompt) { return JetTaggingSpecies::beauty; } } @@ -244,12 +244,12 @@ int jetParticleFromHFShower(T const& jet, U const& particles, typename U::iterat for (const auto& particle : jet.template tracks_as()) { hfparticle = particle; // for init if origin is 1 or 2, the particle is not hfparticle origin = RecoDecay::getParticleOrigin(particles, particle, searchUpToQuark); - if (origin == 1 || origin == 2) { // 1=charm , 2=beauty + if (origin == RecoDecay::OriginType::Prompt || origin == RecoDecay::OriginType::NonPrompt) { // 1=charm , 2=beauty hfparticle = particle; - if (origin == 1) { + if (origin == RecoDecay::OriginType::Prompt) { return JetTaggingSpecies::charm; } - if (origin == 2) { + if (origin == RecoDecay::OriginType::NonPrompt) { return JetTaggingSpecies::beauty; } } @@ -993,11 +993,11 @@ void analyzeJetSVInfo4ML(AnalysisJet const& myJet, AnyTracks const& /*allTracks* // Looping over the track info and putting them in the input vector template -void analyzeJetTrackInfo4ML(AnalysisJet const& analysisJet, AnyTracks const& /*allTracks*/, SecondaryVertices const& /*allSVs*/, std::vector& tracksParams, float trackPtMin = 0.5) +void analyzeJetTrackInfo4ML(AnalysisJet const& analysisJet, AnyTracks const& /*allTracks*/, SecondaryVertices const& /*allSVs*/, std::vector& tracksParams, float trackPtMin = 0.5, float trackDcaXYMax = 10.0, float trackDcaZMax = 10.0) { for (const auto& constituent : analysisJet.template tracks_as()) { - if (constituent.pt() < trackPtMin) { + if (constituent.pt() < trackPtMin || !trackAcceptanceWithDca(constituent, trackDcaXYMax, trackDcaZMax)) { continue; } @@ -1026,11 +1026,11 @@ void analyzeJetTrackInfo4ML(AnalysisJet const& analysisJet, AnyTracks const& /*a // Looping over the track info and putting them in the input vector without using any SV info template -void analyzeJetTrackInfo4MLnoSV(AnalysisJet const& analysisJet, AnyTracks const& /*allTracks*/, std::vector& tracksParams, float trackPtMin = 0.5) +void analyzeJetTrackInfo4MLnoSV(AnalysisJet const& analysisJet, AnyTracks const& /*allTracks*/, std::vector& tracksParams, float trackPtMin = 0.5, float trackDcaXYMax = 10.0, float trackDcaZMax = 10.0) { for (const auto& constituent : analysisJet.template tracks_as()) { - if (constituent.pt() < trackPtMin) { + if (constituent.pt() < trackPtMin || !trackAcceptanceWithDca(constituent, trackDcaXYMax, trackDcaZMax)) { continue; } diff --git a/PWGJE/Core/MlResponseHfTagging.h b/PWGJE/Core/MlResponseHfTagging.h index 462cb661505..2580c5296df 100644 --- a/PWGJE/Core/MlResponseHfTagging.h +++ b/PWGJE/Core/MlResponseHfTagging.h @@ -113,6 +113,11 @@ class MlResponseHfTagging : public MlResponse /// @return A vector of input shapes std::vector> getInputShape() const { return this->mModels[0].getInputShapes(); } + /// @brief Method to get the output shape of a model + /// \param imod is the index of the model + /// @return number of output nodes + int getOutputNodes(int imod = 0) const { return this->mModels[imod].getNumOutputNodes(); } + /// Method to fill the inputs of jet, tracks and secondary vertices /// \param jet is the b-jet candidate /// \param tracks is the vector of tracks associated to the jet diff --git a/PWGJE/TableProducer/jetTaggerHF.cxx b/PWGJE/TableProducer/jetTaggerHF.cxx index 0ab545fe414..2a37871c970 100644 --- a/PWGJE/TableProducer/jetTaggerHF.cxx +++ b/PWGJE/TableProducer/jetTaggerHF.cxx @@ -94,6 +94,7 @@ struct JetTaggerHFTask { Configurable> cutsMl{"cutsMl", {DefaultCutsMl[0], 1, 2, {"pT bin 0"}, {"score for default b-jet tagging", "uncer 1"}}, "ML selections per pT bin"}; Configurable nClassesMl{"nClassesMl", 2, "Number of classes in ML model"}; Configurable> namesInputFeatures{"namesInputFeatures", std::vector{"feature1", "feature2"}, "Names of ML model input features"}; + Configurable useDb{"useDb", false, "Flag to use DB for ML model instead of the score"}; Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Configurable> modelPathsCCDB{"modelPathsCCDB", std::vector{"Users/h/hahassan"}, "Paths of models on CCDB"}; @@ -297,16 +298,16 @@ struct JetTaggerHFTask { std::map metadata; resoFuncMatch = resoFuncMatching; - const int IPmethodResolutionFunctionSize = 7; + const int mIPmethodResolutionFunctionSize = 7; auto loadCCDBforIP = [&](const std::vector& paths, std::vector& targetVec, const std::string& name) { - if (paths.size() != IPmethodResolutionFunctionSize) { + if (paths.size() != mIPmethodResolutionFunctionSize) { usepTcategorize.value = false; LOG(info) << name << " does not have 7 entries. Disabling pT categorization (usepTcategorize = false)."; resoFuncMatch = 0; return; } - for (int i = 0; i < IPmethodResolutionFunctionSize; i++) { + for (int i = 0; i < mIPmethodResolutionFunctionSize; i++) { targetVec.push_back(ccdbApi.retrieveFromTFileAny(paths[i], metadata, -1)); } }; @@ -335,7 +336,7 @@ struct JetTaggerHFTask { } maxOrder = numCount + 1; // 0: untagged, >1 : N ordering - const int IPmethodNumOfParameters = 9; + const int mIPmethodNumOfParameters = 9; // Set up the resolution function switch (resoFuncMatch) { @@ -383,7 +384,7 @@ struct JetTaggerHFTask { for (size_t j = 0; j < resoFuncIncCCDB.size(); j++) { std::vector params; if (resoFuncIncCCDB[j]) { - for (int i = 0; i < IPmethodNumOfParameters; i++) { + for (int i = 0; i < mIPmethodNumOfParameters; i++) { params.emplace_back(resoFuncIncCCDB[j]->GetParameter(i)); } } @@ -397,7 +398,7 @@ struct JetTaggerHFTask { for (size_t j = 0; j < resoFuncBeautyCCDB.size(); j++) { std::vector params; if (resoFuncBeautyCCDB[j]) { - for (int i = 0; i < IPmethodNumOfParameters; i++) { + for (int i = 0; i < mIPmethodNumOfParameters; i++) { params.emplace_back(resoFuncBeautyCCDB[j]->GetParameter(i)); } } @@ -406,7 +407,7 @@ struct JetTaggerHFTask { for (size_t j = 0; j < resoFuncCharmCCDB.size(); j++) { std::vector params; if (resoFuncCharmCCDB[j]) { - for (int i = 0; i < IPmethodNumOfParameters; i++) { + for (int i = 0; i < mIPmethodNumOfParameters; i++) { params.emplace_back(resoFuncCharmCCDB[j]->GetParameter(i)); } } @@ -415,7 +416,7 @@ struct JetTaggerHFTask { for (size_t j = 0; j < resoFuncLfCCDB.size(); j++) { std::vector params; if (resoFuncLfCCDB[j]) { - for (int i = 0; i < IPmethodNumOfParameters; i++) { + for (int i = 0; i < mIPmethodNumOfParameters; i++) { params.emplace_back(resoFuncLfCCDB[j]->GetParameter(i)); } } @@ -427,7 +428,7 @@ struct JetTaggerHFTask { for (size_t j = 0; j < resoFuncDataCCDB.size(); j++) { std::vector params; if (resoFuncDataCCDB[j]) { - for (int i = 0; i < IPmethodNumOfParameters; i++) { + for (int i = 0; i < mIPmethodNumOfParameters; i++) { params.emplace_back(resoFuncDataCCDB[j]->GetParameter(i)); } } @@ -507,7 +508,7 @@ struct JetTaggerHFTask { std::vector svsParams; jettaggingutilities::analyzeJetSVInfo4ML(analysisJet, allTracks, allSVs, svsParams, svPtMin, svReductionFactor); - jettaggingutilities::analyzeJetTrackInfo4ML(analysisJet, allTracks, allSVs, tracksParams, trackPtMin); + jettaggingutilities::analyzeJetTrackInfo4ML(analysisJet, allTracks, allSVs, tracksParams, trackPtMin, trackDcaXYMax, trackDcaZMax); int nSVs = analysisJet.template secondaryVertices_as().size(); @@ -525,7 +526,15 @@ struct JetTaggerHFTask { bMlResponse.isSelectedMl(inputML, analysisJet.pt(), output); } - scoreML[analysisJet.globalIndex()] = output[0]; + if (bMlResponse.getOutputNodes() > 1) { + auto mDb = [](std::vector scores, float fC) { + return std::log(scores[2] / (fC * scores[1] + (1 - fC) * scores[0])); + }; + + scoreML[analysisJet.globalIndex()] = useDb ? mDb(output, fC) : output[2]; // 2 is the b-jet index + } else { + scoreML[analysisJet.globalIndex()] = output[0]; + } } } @@ -537,7 +546,7 @@ struct JetTaggerHFTask { std::vector tracksParams; std::vector svsParams; - jettaggingutilities::analyzeJetTrackInfo4MLnoSV(analysisJet, allTracks, tracksParams, trackPtMin); + jettaggingutilities::analyzeJetTrackInfo4MLnoSV(analysisJet, allTracks, tracksParams, trackPtMin, trackDcaXYMax, trackDcaZMax); jettaggingutilities::BJetParams jetparam = {analysisJet.pt(), analysisJet.eta(), analysisJet.phi(), static_cast(tracksParams.size()), 0, analysisJet.mass()}; tracksParams.resize(nJetConst); // resize to the number of inputs of the ML diff --git a/PWGJE/TableProducer/secondaryVertexReconstruction.cxx b/PWGJE/TableProducer/secondaryVertexReconstruction.cxx index de1b47cb830..c1f7598d176 100644 --- a/PWGJE/TableProducer/secondaryVertexReconstruction.cxx +++ b/PWGJE/TableProducer/secondaryVertexReconstruction.cxx @@ -72,6 +72,8 @@ struct SecondaryVertexReconstruction { Configurable ptMinTrack{"ptMinTrack", -1., "min. track pT"}; Configurable etaMinTrack{"etaMinTrack", -99999., "min. pseudorapidity"}; Configurable etaMaxTrack{"etaMaxTrack", 4., "max. pseudorapidity"}; + Configurable maxIPxy{"maxIPxy", 10, "maximum track DCA in xy plane"}; + Configurable maxIPz{"maxIPz", 10, "maximum track DCA in z direction"}; Configurable fillHistograms{"fillHistograms", true, "do validation plots"}; Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; @@ -288,7 +290,7 @@ struct SecondaryVertexReconstruction { for (size_t iprong = prongIndex; iprong < particles.size(); ++iprong) { const auto& testTrack = particles[iprong].template track_as(); - if (testTrack.pt() < ptMinTrack || testTrack.eta() < etaMinTrack || testTrack.eta() > etaMaxTrack) { + if (testTrack.pt() < ptMinTrack || testTrack.eta() < etaMinTrack || testTrack.eta() > etaMaxTrack || std::abs(testTrack.dcaXY()) > maxIPxy || std::abs(testTrack.dcaZ()) > maxIPz) { continue; } diff --git a/PWGJE/Tasks/bjetTaggingML.cxx b/PWGJE/Tasks/bjetTaggingML.cxx index 7b2638f37a5..afa34a243e6 100644 --- a/PWGJE/Tasks/bjetTaggingML.cxx +++ b/PWGJE/Tasks/bjetTaggingML.cxx @@ -58,6 +58,8 @@ struct BJetTaggingML { Configurable trackPtMax{"trackPtMax", 1000.0, "maximum track pT"}; Configurable trackEtaMin{"trackEtaMin", -0.9, "minimum track eta"}; Configurable trackEtaMax{"trackEtaMax", 0.9, "maximum track eta"}; + Configurable maxIPxy{"maxIPxy", 10, "maximum track DCA in xy plane"}; + Configurable maxIPz{"maxIPz", 10, "maximum track DCA in z direction"}; // track level configurables Configurable svPtMin{"svPtMin", 0.5, "minimum SV pT"}; @@ -68,6 +70,7 @@ struct BJetTaggingML { Configurable jetEtaMin{"jetEtaMin", -99.0, "minimum jet pseudorapidity"}; Configurable jetEtaMax{"jetEtaMax", 99.0, "maximum jet pseudorapidity"}; Configurable nJetConst{"nJetConst", 10, "maximum number of jet consistuents to be used for ML evaluation"}; + Configurable useDb{"useDb", false, "Flag whether to use the Db instead of the score for tagging"}; Configurable doDataDriven{"doDataDriven", false, "Flag whether to use fill THnSpase for data driven methods"}; @@ -86,10 +89,14 @@ struct BJetTaggingML { eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast(eventSelections)); + const AxisSpec axisDb{300, -10., 20., "#it{D}_{b}"}; + const AxisSpec axisScore{120, -0.1, 1.1, "Score"}; + const AxisSpec axisLogScore{120, 0., 30, "-log(1-score)"}; + registry.add("h_vertexZ", "Vertex Z;#it{Z} (cm)", {HistType::kTH1F, {{40, -20.0, 20.0}}}); - registry.add("h2_score_jetpT", "ML scores for inclusive jets;#it{p}_{T,jet} (GeV/#it{c});Score", {HistType::kTH2F, {{200, 0., 200.}, {120, -0.1, 1.1}}}); - registry.add("h2_logscore_jetpT", "ML scores for inclusive jets;#it{p}_{T,jet} (GeV/#it{c});- log(1 - Score)", {HistType::kTH2F, {{200, 0., 200.}, {120, 0, 30}}}); + registry.add("h2_score_jetpT", "ML scores for inclusive jets;#it{p}_{T,jet} (GeV/#it{c});Score", {HistType::kTH2F, {{200, 0., 200.}, useDb ? axisDb : axisScore}}); + registry.add("h2_logscore_jetpT", "ML scores for inclusive jets;#it{p}_{T,jet} (GeV/#it{c});- log(1 - Score)", {HistType::kTH2F, {{200, 0., 200.}, axisLogScore}}); registry.add("h2_nTracks_jetpT", "Number of tracks;#it{p}_{T,jet} (GeV/#it{c});nTracks", {HistType::kTH2F, {{200, 0., 200.}, {100, 0, 100.0}}}); registry.add("h2_nSV_jetpT", "Number of secondary vertices;#it{p}_{T,jet} (GeV/#it{c});nSVs", {HistType::kTH2F, {{200, 0., 200.}, {250, 0, 250.0}}}); @@ -102,18 +109,18 @@ struct BJetTaggingML { registry.add("h2_SVMass_jetpT", "Secondary vertex mass;#it{p}_{T,jet} (GeV/#it{c});#it{m}_{SV} (GeV/#it{c}^{2})", {HistType::kTH2F, {{200, 0., 200.}, {50, 0, 10}}}); if (doDataDriven) { - registry.add("hSparse_Incljets", "Inclusive jets Info;#it{p}_{T,jet} (GeV/#it{c});Score;-log(1-score);#it{m}_{jet} (GeV/#it{c}^{2});-log(JP);#it{m}_{SV} (GeV/#it{c}^{2});SVfE;", {HistType::kTHnSparseF, {{200, 0., 200.}, {120, -0.1, 1.1}, {120, 0, 30}, {50, 0, 50}, {375, 0, 30}, {50, 0, 10}, {50, 0, 1}}}); + registry.add("hSparse_Incljets", "Inclusive jets Info;#it{p}_{T,jet} (GeV/#it{c});Score;-log(1-score);#it{m}_{jet} (GeV/#it{c}^{2});-log(JP);#it{m}_{SV} (GeV/#it{c}^{2});SVfE;", {HistType::kTHnSparseF, {{200, 0., 200.}, useDb ? axisDb : axisScore, axisLogScore, {50, 0, 50}, {375, 0, 30}, {50, 0, 10}, {50, 0, 1}}}); if (doprocessMCJets) { - registry.add("hSparse_bjets", "Tagged b-jets Info;#it{p}_{T,jet} (GeV/#it{c});Score;-log(1-score);#it{m}_{jet} (GeV/#it{c}^{2});-log(JP);#it{m}_{SV} (GeV/#it{c}^{2});SVfE;", {HistType::kTHnSparseF, {{200, 0., 200.}, {120, -0.1, 1.1}, {120, 0, 30}, {50, 0, 50}, {375, 0, 30}, {50, 0, 10}, {50, 0, 1}}}); - registry.add("hSparse_cjets", "Tagged c-jets Info;#it{p}_{T,jet} (GeV/#it{c});Score;-log(1-score);#it{m}_{jet} (GeV/#it{c}^{2});-log(JP);#it{m}_{SV} (GeV/#it{c}^{2});SVfE;", {HistType::kTHnSparseF, {{200, 0., 200.}, {120, -0.1, 1.1}, {120, 0, 30}, {50, 0, 50}, {375, 0, 30}, {50, 0, 10}, {50, 0, 1}}}); - registry.add("hSparse_lfjets", "Tagged lf-jets Info;#it{p}_{T,jet} (GeV/#it{c});Score;-log(1-score);#it{m}_{jet} (GeV/#it{c}^{2});-log(JP);#it{m}_{SV} (GeV/#it{c}^{2});SVfE;", {HistType::kTHnSparseF, {{200, 0., 200.}, {120, -0.1, 1.1}, {120, 0, 30}, {50, 0, 50}, {375, 0, 30}, {50, 0, 10}, {50, 0, 1}}}); + registry.add("hSparse_bjets", "Tagged b-jets Info;#it{p}_{T,jet} (GeV/#it{c});Score;-log(1-score);#it{m}_{jet} (GeV/#it{c}^{2});-log(JP);#it{m}_{SV} (GeV/#it{c}^{2});SVfE;", {HistType::kTHnSparseF, {{200, 0., 200.}, useDb ? axisDb : axisScore, axisLogScore, {50, 0, 50}, {375, 0, 30}, {50, 0, 10}, {50, 0, 1}}}); + registry.add("hSparse_cjets", "Tagged c-jets Info;#it{p}_{T,jet} (GeV/#it{c});Score;-log(1-score);#it{m}_{jet} (GeV/#it{c}^{2});-log(JP);#it{m}_{SV} (GeV/#it{c}^{2});SVfE;", {HistType::kTHnSparseF, {{200, 0., 200.}, useDb ? axisDb : axisScore, axisLogScore, {50, 0, 50}, {375, 0, 30}, {50, 0, 10}, {50, 0, 1}}}); + registry.add("hSparse_lfjets", "Tagged lf-jets Info;#it{p}_{T,jet} (GeV/#it{c});Score;-log(1-score);#it{m}_{jet} (GeV/#it{c}^{2});-log(JP);#it{m}_{SV} (GeV/#it{c}^{2});SVfE;", {HistType::kTHnSparseF, {{200, 0., 200.}, useDb ? axisDb : axisScore, axisLogScore, {50, 0, 50}, {375, 0, 30}, {50, 0, 10}, {50, 0, 1}}}); } } if (doprocessMCJets) { - registry.add("h2_score_jetpT_bjet", "ML scores for b-jets;#it{p}_{T,jet} (GeV/#it{c});Score", {HistType::kTH2F, {{200, 0., 200.}, {120, -0.1, 1.1}}}); - registry.add("h2_logscore_jetpT_bjet", "ML scores for b-jets;#it{p}_{T,jet} (GeV/#it{c});- log(1 - Score)", {HistType::kTH2F, {{200, 0., 200.}, {120, 0, 30}}}); + registry.add("h2_score_jetpT_bjet", "ML scores for b-jets;#it{p}_{T,jet} (GeV/#it{c});Score", {HistType::kTH2F, {{200, 0., 200.}, useDb ? axisDb : axisScore}}); + registry.add("h2_logscore_jetpT_bjet", "ML scores for b-jets;#it{p}_{T,jet} (GeV/#it{c});- log(1 - Score)", {HistType::kTH2F, {{200, 0., 200.}, axisLogScore}}); registry.add("h2_SIPs2D_jetpT_bjet", "2D IP significance b-jets;#it{p}_{T,jet} (GeV/#it{c});IPs", {HistType::kTH2F, {{200, 0., 200.}, {100, -50.0, 50.0}}}); registry.add("h2_SIPs3D_jetpT_bjet", "3D IP significance b-jets;#it{p}_{T,jet} (GeV/#it{c});IPs", {HistType::kTH2F, {{200, 0., 200.}, {100, -50.0, 50.0}}}); registry.add("h2_LxyS_jetpT_bjet", "Decay length in XY b-jets;#it{p}_{T,jet} (GeV/#it{c});S#it{L}_{xy}", {HistType::kTH2F, {{200, 0., 200.}, {100, 0., 100.0}}}); @@ -121,8 +128,8 @@ struct BJetTaggingML { registry.add("h2_jetMass_jetpT_bjet", "Jet mass b-jets;#it{p}_{T,jet} (GeV/#it{c});#it{m}_{jet} (GeV/#it{c}^{2})", {HistType::kTH2F, {{200, 0., 200.}, {50, 0, 50.0}}}); registry.add("h2_SVMass_jetpT_bjet", "Secondary vertex mass b-jets;#it{p}_{T,jet} (GeV/#it{c});#it{m}_{SV} (GeV/#it{c}^{2})", {HistType::kTH2F, {{200, 0., 200.}, {50, 0, 10.0}}}); - registry.add("h2_score_jetpT_cjet", "ML scores for c-jets;#it{p}_{T,jet} (GeV/#it{c});Score", {HistType::kTH2F, {{200, 0., 200.}, {120, -0.1, 1.1}}}); - registry.add("h2_logscore_jetpT_cjet", "ML scores for c-jets;#it{p}_{T,jet} (GeV/#it{c});- log(1 - Score)", {HistType::kTH2F, {{200, 0., 200.}, {120, 0, 30}}}); + registry.add("h2_score_jetpT_cjet", "ML scores for c-jets;#it{p}_{T,jet} (GeV/#it{c});Score", {HistType::kTH2F, {{200, 0., 200.}, useDb ? axisDb : axisScore}}); + registry.add("h2_logscore_jetpT_cjet", "ML scores for c-jets;#it{p}_{T,jet} (GeV/#it{c});- log(1 - Score)", {HistType::kTH2F, {{200, 0., 200.}, axisLogScore}}); registry.add("h2_SIPs2D_jetpT_cjet", "2D IP significance c-jets;#it{p}_{T,jet} (GeV/#it{c});IPs", {HistType::kTH2F, {{200, 0., 200.}, {100, -50.0, 50.0}}}); registry.add("h2_SIPs3D_jetpT_cjet", "3D IP significance c-jets;#it{p}_{T,jet} (GeV/#it{c});IPs", {HistType::kTH2F, {{200, 0., 200.}, {100, -50.0, 50.0}}}); registry.add("h2_LxyS_jetpT_cjet", "Decay length in XY c-jets;#it{p}_{T,jet} (GeV/#it{c});S#it{L}_{xy}", {HistType::kTH2F, {{200, 0., 200.}, {100, 0., 100.0}}}); @@ -130,8 +137,8 @@ struct BJetTaggingML { registry.add("h2_jetMass_jetpT_cjet", "Jet mass c-jets;#it{p}_{T,jet} (GeV/#it{c});#it{m}_{jet} (GeV/#it{c}^{2})", {HistType::kTH2F, {{200, 0., 200.}, {50, 0, 50.0}}}); registry.add("h2_SVMass_jetpT_cjet", "Secondary vertex mass c-jets;#it{p}_{T,jet} (GeV/#it{c});#it{m}_{SV} (GeV/#it{c}^{2})", {HistType::kTH2F, {{200, 0., 200.}, {50, 0, 10.0}}}); - registry.add("h2_score_jetpT_lfjet", "ML scores for lf-jets;#it{p}_{T,jet} (GeV/#it{c});Score", {HistType::kTH2F, {{200, 0., 200.}, {120, -0.1, 1.1}}}); - registry.add("h2_logscore_jetpT_lfjet", "ML scores for lf-jets;#it{p}_{T,jet} (GeV/#it{c});- log(1 - Score)", {HistType::kTH2F, {{200, 0., 200.}, {120, 0, 30}}}); + registry.add("h2_score_jetpT_lfjet", "ML scores for lf-jets;#it{p}_{T,jet} (GeV/#it{c});Score", {HistType::kTH2F, {{200, 0., 200.}, useDb ? axisDb : axisScore}}); + registry.add("h2_logscore_jetpT_lfjet", "ML scores for lf-jets;#it{p}_{T,jet} (GeV/#it{c});- log(1 - Score)", {HistType::kTH2F, {{200, 0., 200.}, axisLogScore}}); registry.add("h2_SIPs2D_jetpT_lfjet", "2D IP significance lf-jet;#it{p}_{T,jet} (GeV/#it{c});IPs", {HistType::kTH2F, {{200, 0., 200.}, {100, -50.0, 50.0}}}); registry.add("h2_SIPs3D_jetpT_lfjet", "3D IP significance lf-jet;#it{p}_{T,jet} (GeV/#it{c});IPs", {HistType::kTH2F, {{200, 0., 200.}, {100, -50.0, 50.0}}}); registry.add("h2_LxyS_jetpT_lfjet", "Decay length in XY lf-jet;#it{p}_{T,jet} (GeV/#it{c});S#it{L}_{xy}", {HistType::kTH2F, {{200, 0., 200.}, {100, 0., 100.0}}}); @@ -205,11 +212,11 @@ struct BJetTaggingML { registry.fill(HIST("h2_SVMass_jetpT"), myJet.pt(), massSV, eventweight); if (doprocessMCJets) { - if (jetFlavor == 2) { + if (jetFlavor == JetTaggingSpecies::beauty) { registry.fill(HIST("h2_LxyS_jetpT_bjet"), myJet.pt(), candSV.decayLengthXY() / candSV.errorDecayLengthXY(), eventweight); registry.fill(HIST("h2_Dispersion_jetpT_bjet"), myJet.pt(), candSV.dispersion(), eventweight); registry.fill(HIST("h2_SVMass_jetpT_bjet"), myJet.pt(), massSV, eventweight); - } else if (jetFlavor == 1) { + } else if (jetFlavor == JetTaggingSpecies::charm) { registry.fill(HIST("h2_LxyS_jetpT_cjet"), myJet.pt(), candSV.decayLengthXY() / candSV.errorDecayLengthXY(), eventweight); registry.fill(HIST("h2_Dispersion_jetpT_cjet"), myJet.pt(), candSV.dispersion(), eventweight); registry.fill(HIST("h2_SVMass_jetpT_cjet"), myJet.pt(), massSV, eventweight); @@ -229,7 +236,7 @@ struct BJetTaggingML { for (const auto& constituent : analysisJet.template tracks_as()) { - if (constituent.pt() < trackPtMin) { + if (constituent.pt() < trackPtMin || !jettaggingutilities::trackAcceptanceWithDca(constituent, maxIPxy, maxIPz)) { continue; } @@ -243,10 +250,10 @@ struct BJetTaggingML { registry.fill(HIST("h2_SIPs3D_jetpT"), analysisJet.pt(), sign * std::abs(constituent.dcaXYZ()) / constituent.sigmadcaXYZ(), eventweight); if (doprocessMCJets) { - if (jetFlavor == 2) { + if (jetFlavor == JetTaggingSpecies::beauty) { registry.fill(HIST("h2_SIPs2D_jetpT_bjet"), analysisJet.pt(), sign * std::abs(constituent.dcaXY()) / constituent.sigmadcaXY(), eventweight); registry.fill(HIST("h2_SIPs3D_jetpT_bjet"), analysisJet.pt(), sign * std::abs(constituent.dcaXYZ()) / constituent.sigmadcaXYZ(), eventweight); - } else if (jetFlavor == 1) { + } else if (jetFlavor == JetTaggingSpecies::charm) { registry.fill(HIST("h2_SIPs2D_jetpT_cjet"), analysisJet.pt(), sign * std::abs(constituent.dcaXY()) / constituent.sigmadcaXY(), eventweight); registry.fill(HIST("h2_SIPs3D_jetpT_cjet"), analysisJet.pt(), sign * std::abs(constituent.dcaXYZ()) / constituent.sigmadcaXYZ(), eventweight); } else { @@ -307,12 +314,14 @@ struct BJetTaggingML { registry.fill(HIST("h2_nSV_jetpT"), analysisJet.pt(), nSVs < 250 ? nSVs : 249); registry.fill(HIST("h2_score_jetpT"), analysisJet.pt(), analysisJet.scoreML()); - registry.fill(HIST("h2_logscore_jetpT"), analysisJet.pt(), -1 * std::log(1 - analysisJet.scoreML())); + if (!useDb) { + registry.fill(HIST("h2_logscore_jetpT"), analysisJet.pt(), -1 * std::log(1 - analysisJet.scoreML())); + } registry.fill(HIST("h2_jetMass_jetpT"), analysisJet.pt(), analysisJet.mass()); if (doDataDriven) { - registry.fill(HIST("hSparse_Incljets"), analysisJet.pt(), analysisJet.scoreML(), -1 * std::log(1 - analysisJet.scoreML()), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].svMass, svsParams[0].svfE); + registry.fill(HIST("hSparse_Incljets"), analysisJet.pt(), analysisJet.scoreML(), useDb ? 0 : -1 * std::log(1 - analysisJet.scoreML()), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].svMass, svsParams[0].svfE); } } } @@ -369,33 +378,41 @@ struct BJetTaggingML { registry.fill(HIST("h2_nSV_jetpT"), analysisJet.pt(), nSVs < 250 ? nSVs : 249); registry.fill(HIST("h2_score_jetpT"), analysisJet.pt(), analysisJet.scoreML(), eventWeight); - registry.fill(HIST("h2_logscore_jetpT"), analysisJet.pt(), -1 * std::log(1 - analysisJet.scoreML()), eventWeight); + if (!useDb) { + registry.fill(HIST("h2_logscore_jetpT"), analysisJet.pt(), -1 * std::log(1 - analysisJet.scoreML()), eventWeight); + } registry.fill(HIST("h2_jetMass_jetpT"), analysisJet.pt(), analysisJet.mass(), eventWeight); if (doDataDriven) { - registry.fill(HIST("hSparse_Incljets"), analysisJet.pt(), analysisJet.scoreML(), -1 * std::log(1 - analysisJet.scoreML()), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].svMass, svsParams[0].svfE, eventWeight); - if (jetFlavor == 2) { - registry.fill(HIST("hSparse_bjets"), analysisJet.pt(), analysisJet.scoreML(), -1 * std::log(1 - analysisJet.scoreML()), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].svMass, svsParams[0].svfE, eventWeight); - } else if (jetFlavor == 1) { - registry.fill(HIST("hSparse_cjets"), analysisJet.pt(), analysisJet.scoreML(), -1 * std::log(1 - analysisJet.scoreML()), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].svMass, svsParams[0].svfE, eventWeight); + registry.fill(HIST("hSparse_Incljets"), analysisJet.pt(), analysisJet.scoreML(), useDb ? 0 : -1 * std::log(1 - analysisJet.scoreML()), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].svMass, svsParams[0].svfE, eventWeight); + if (jetFlavor == JetTaggingSpecies::beauty) { + registry.fill(HIST("hSparse_bjets"), analysisJet.pt(), analysisJet.scoreML(), useDb ? 0 : -1 * std::log(1 - analysisJet.scoreML()), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].svMass, svsParams[0].svfE, eventWeight); + } else if (jetFlavor == JetTaggingSpecies::charm) { + registry.fill(HIST("hSparse_cjets"), analysisJet.pt(), analysisJet.scoreML(), useDb ? 0 : -1 * std::log(1 - analysisJet.scoreML()), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].svMass, svsParams[0].svfE, eventWeight); } else { - registry.fill(HIST("hSparse_lfjets"), analysisJet.pt(), analysisJet.scoreML(), -1 * std::log(1 - analysisJet.scoreML()), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].svMass, svsParams[0].svfE, eventWeight); + registry.fill(HIST("hSparse_lfjets"), analysisJet.pt(), analysisJet.scoreML(), useDb ? 0 : -1 * std::log(1 - analysisJet.scoreML()), analysisJet.mass(), -1 * std::log(analysisJet.jetProb()), svsParams[0].svMass, svsParams[0].svfE, eventWeight); } } - if (jetFlavor == 2) { + if (jetFlavor == JetTaggingSpecies::beauty) { registry.fill(HIST("h2_score_jetpT_bjet"), analysisJet.pt(), analysisJet.scoreML(), eventWeight); - registry.fill(HIST("h2_logscore_jetpT_bjet"), analysisJet.pt(), -1 * std::log(1 - analysisJet.scoreML()), eventWeight); + if (!useDb) { + registry.fill(HIST("h2_logscore_jetpT_bjet"), analysisJet.pt(), -1 * std::log(1 - analysisJet.scoreML()), eventWeight); + } registry.fill(HIST("h2_jetMass_jetpT_bjet"), analysisJet.pt(), analysisJet.mass(), eventWeight); registry.fill(HIST("h_jetpT_detector_bjet"), analysisJet.pt(), eventWeight); - } else if (jetFlavor == 1) { + } else if (jetFlavor == JetTaggingSpecies::charm) { registry.fill(HIST("h2_score_jetpT_cjet"), analysisJet.pt(), analysisJet.scoreML(), eventWeight); - registry.fill(HIST("h2_logscore_jetpT_cjet"), analysisJet.pt(), -1 * std::log(1 - analysisJet.scoreML()), eventWeight); + if (!useDb) { + registry.fill(HIST("h2_logscore_jetpT_cjet"), analysisJet.pt(), -1 * std::log(1 - analysisJet.scoreML()), eventWeight); + } registry.fill(HIST("h2_jetMass_jetpT_cjet"), analysisJet.pt(), analysisJet.mass(), eventWeight); registry.fill(HIST("h_jetpT_detector_cjet"), analysisJet.pt(), eventWeight); } else { registry.fill(HIST("h2_score_jetpT_lfjet"), analysisJet.pt(), analysisJet.scoreML(), eventWeight); - registry.fill(HIST("h2_logscore_jetpT_lfjet"), analysisJet.pt(), -1 * std::log(1 - analysisJet.scoreML()), eventWeight); + if (!useDb) { + registry.fill(HIST("h2_logscore_jetpT_lfjet"), analysisJet.pt(), -1 * std::log(1 - analysisJet.scoreML()), eventWeight); + } registry.fill(HIST("h2_jetMass_jetpT_lfjet"), analysisJet.pt(), analysisJet.mass(), eventWeight); registry.fill(HIST("h_jetpT_detector_lfjet"), analysisJet.pt(), eventWeight); } @@ -405,9 +422,9 @@ struct BJetTaggingML { continue; } - if (jetFlavor == 2) { + if (jetFlavor == JetTaggingSpecies::beauty) { registry.fill(HIST("h2_Response_DetjetpT_PartjetpT_bjet"), analysisJet.pt(), mcpjet.pt(), eventWeight); - } else if (jetFlavor == 1) { + } else if (jetFlavor == JetTaggingSpecies::charm) { registry.fill(HIST("h2_Response_DetjetpT_PartjetpT_cjet"), analysisJet.pt(), mcpjet.pt(), eventWeight); } else { registry.fill(HIST("h2_Response_DetjetpT_PartjetpT_lfjet"), analysisJet.pt(), mcpjet.pt(), eventWeight); @@ -440,9 +457,9 @@ struct BJetTaggingML { registry.fill(HIST("h_jetpT_particle_DetColl"), mcpjet.pt(), eventWeight); - if (jetFlavor == 2) { + if (jetFlavor == JetTaggingSpecies::beauty) { registry.fill(HIST("h_jetpT_particle_DetColl_bjet"), mcpjet.pt(), eventWeight); - } else if (jetFlavor == 1) { + } else if (jetFlavor == JetTaggingSpecies::charm) { registry.fill(HIST("h_jetpT_particle_DetColl_cjet"), mcpjet.pt(), eventWeight); } else { registry.fill(HIST("h_jetpT_particle_DetColl_lfjet"), mcpjet.pt(), eventWeight); @@ -479,9 +496,9 @@ struct BJetTaggingML { int8_t jetFlavor = mcpjet.origin(); - if (jetFlavor == 2) { + if (jetFlavor == JetTaggingSpecies::beauty) { registry.fill(HIST("h_jetpT_particle_bjet"), mcpjet.pt(), eventWeight); - } else if (jetFlavor == 1) { + } else if (jetFlavor == JetTaggingSpecies::charm) { registry.fill(HIST("h_jetpT_particle_cjet"), mcpjet.pt(), eventWeight); } else { registry.fill(HIST("h_jetpT_particle_lfjet"), mcpjet.pt(), eventWeight); diff --git a/PWGJE/Tasks/bjetTreeCreator.cxx b/PWGJE/Tasks/bjetTreeCreator.cxx index 4508600962c..ba7c8e49c6d 100644 --- a/PWGJE/Tasks/bjetTreeCreator.cxx +++ b/PWGJE/Tasks/bjetTreeCreator.cxx @@ -207,6 +207,9 @@ struct BJetTreeCreator { Configurable trackEtaMin{"trackEtaMin", -0.9, "minimum track eta"}; Configurable trackEtaMax{"trackEtaMax", 0.9, "maximum track eta"}; + Configurable maxIPxy{"maxIPxy", 10, "maximum track DCA in xy plane"}; + Configurable maxIPz{"maxIPz", 10, "maximum track DCA in z direction"}; + Configurable useQuarkDef{"useQuarkDef", true, "Flag whether to use quarks or hadrons for determining the jet flavor"}; // track level configurables @@ -297,20 +300,20 @@ struct BJetTreeCreator { //+jet registry.add("h_jet_pt", "jet_pt;#it{p}_{T}^{ch jet} (GeV/#it{c});Entries", {HistType::kTH1F, {{200, 0., 200.}}}); registry.add("h_jet_eta", "jet_eta;#it{#eta}_{ch jet};Entries", {HistType::kTH1F, {{200, -2., 2.}}}); - registry.add("h_jet_phi", "jet_phi;#it{#phi}_{ch jet};Entries", {HistType::kTH1F, {{200, 0., 2. * M_PI}}}); + registry.add("h_jet_phi", "jet_phi;#it{#phi}_{ch jet};Entries", {HistType::kTH1F, {{200, 0., o2::constants::math::TwoPI}}}); registry.add("h_jet_flav", "jet_flav;jet flavor;Entries", {HistType::kTH1F, {{4, 0., 4.}}}); registry.add("h_n_trks", "n_trks;#it{n}_{tracks};Entries", {HistType::kTH1F, {{50, 0., 50.}}}); registry.add("h_jet_mass", "jet_mass;#it{m}_{jet} (GeV/#it{c}^2);Entries", {HistType::kTH1F, {{200, 0., 50.}}}); - auto h_jet_flav = registry.get(HIST("h_jet_flav")); - h_jet_flav->GetXaxis()->SetBinLabel(1, "no mcparticle"); // 0 - h_jet_flav->GetXaxis()->SetBinLabel(2, "c-jet"); // 1 - h_jet_flav->GetXaxis()->SetBinLabel(3, "b-jet"); // 2 - h_jet_flav->GetXaxis()->SetBinLabel(4, "lf-jet"); // 3 + auto hJetFlavor = registry.get(HIST("h_jet_flav")); + hJetFlavor->GetXaxis()->SetBinLabel(1, "no mcparticle"); // 0 + hJetFlavor->GetXaxis()->SetBinLabel(2, "c-jet"); // 1 + hJetFlavor->GetXaxis()->SetBinLabel(3, "b-jet"); // 2 + hJetFlavor->GetXaxis()->SetBinLabel(4, "lf-jet"); // 3 registry.add("h_n_vertices", "n_vertices;#it{n}_{vertex};Entries", {HistType::kTH1F, {{50, 0., 50.}}}); //+trk registry.add("h_trk_pt", "trk_pt;#it{p}_{T} (GeV/#it{c});Entries", {HistType::kTH1F, {{200, 0., 100.}}}); registry.add("h_trk_eta", "trk_eta;#it{#eta};Entries", {HistType::kTH1F, {{200, -2., 2.}}}); - registry.add("h_trk_phi", "trk_phi;#it{#phi};Entries", {HistType::kTH1F, {{200, 0., 2. * M_PI}}}); + registry.add("h_trk_phi", "trk_phi;#it{#phi};Entries", {HistType::kTH1F, {{200, 0., o2::constants::math::TwoPI}}}); registry.add("h_trk_charge", "trk_charge;#it{q};Entries", {HistType::kTH1F, {{3, -1.5, 1.5}}}); registry.add("h_trk_dcaxy", "trk_dcaxy;#it{DCA}_{xy} (cm);Entries", {HistType::kTH1F, {{200, -0.1, 0.1}}}); registry.add("h_trk_dcaxyz", "trk_dcaxyz;#it{DCA}_{xyz} (cm);Entries", {HistType::kTH1F, {{200, -0.1, 0.1}}}); @@ -324,12 +327,12 @@ struct BJetTreeCreator { registry.add("h2_trk_jtrackpt_vs_origtrackpt", "JTracks::pt vs Tracks::pt", {HistType::kTH2F, {{200, 0., 100.}, {200, 0., 100.}}}); registry.add("h_trk_vtx_index", "trk_vtx_index;Vertex index;Entries", {HistType::kTH1F, {{20, 0., 20.}}}); registry.add("h_trk_origin", "trk_origin;Track origin;Entries", {HistType::kTH1F, {{5, 0., 5.}}}); - auto h_trk_origin = registry.get(HIST("h_trk_origin")); - h_trk_origin->GetXaxis()->SetBinLabel(1, "NotPhysPrim"); - h_trk_origin->GetXaxis()->SetBinLabel(2, "Charm"); - h_trk_origin->GetXaxis()->SetBinLabel(3, "Beauty"); - h_trk_origin->GetXaxis()->SetBinLabel(4, "Primary"); - h_trk_origin->GetXaxis()->SetBinLabel(5, "OtherSecondary"); + auto hTrackOrigin = registry.get(HIST("h_trk_origin")); + hTrackOrigin->GetXaxis()->SetBinLabel(1, "NotPhysPrim"); + hTrackOrigin->GetXaxis()->SetBinLabel(2, "Charm"); + hTrackOrigin->GetXaxis()->SetBinLabel(3, "Beauty"); + hTrackOrigin->GetXaxis()->SetBinLabel(4, "Primary"); + hTrackOrigin->GetXaxis()->SetBinLabel(5, "OtherSecondary"); } } @@ -404,11 +407,11 @@ struct BJetTreeCreator { registry.fill(HIST("h2_SVMass_jetpT"), myJet.pt(), massSV, eventweight); if (doprocessMCJets) { - if (jetFlavor == 2) { + if (jetFlavor == JetTaggingSpecies::beauty) { registry.fill(HIST("h2_LxyS_jetpT_bjet"), myJet.pt(), candSV.decayLengthXY() / candSV.errorDecayLengthXY(), eventweight); registry.fill(HIST("h2_Dispersion_jetpT_bjet"), myJet.pt(), candSV.chi2PCA(), eventweight); registry.fill(HIST("h2_SVMass_jetpT_bjet"), myJet.pt(), massSV, eventweight); - } else if (jetFlavor == 1) { + } else if (jetFlavor == JetTaggingSpecies::charm) { registry.fill(HIST("h2_LxyS_jetpT_cjet"), myJet.pt(), candSV.decayLengthXY() / candSV.errorDecayLengthXY(), eventweight); registry.fill(HIST("h2_Dispersion_jetpT_cjet"), myJet.pt(), candSV.chi2PCA(), eventweight); registry.fill(HIST("h2_SVMass_jetpT_cjet"), myJet.pt(), massSV, eventweight); @@ -427,9 +430,9 @@ struct BJetTreeCreator { void analyzeJetTrackInfo(AnyCollision const& /*collision*/, AnalysisJet const& analysisJet, AnyTracks const& /*allTracks*/, SecondaryVertices const& /*allSVs*/, std::vector& trackIndices, int jetFlavor = 0, double eventweight = 1.0) { - for (auto& constituent : analysisJet.template tracks_as()) { + for (const auto& constituent : analysisJet.template tracks_as()) { - if (constituent.pt() < trackPtMin) { + if (constituent.pt() < trackPtMin || !jettaggingutilities::trackAcceptanceWithDca(constituent, maxIPxy, maxIPz)) { continue; } @@ -437,11 +440,11 @@ struct BJetTreeCreator { double dotProduct = RecoDecay::dotProd(std::array{analysisJet.px(), analysisJet.py(), analysisJet.pz()}, std::array{constituent.px(), constituent.py(), constituent.pz()}); int sign = jettaggingutilities::getGeoSign(analysisJet, constituent); - float RClosestSV = 10.; + float dRClosestSV = 10.; for (const auto& candSV : analysisJet.template secondaryVertices_as()) { double deltaRTrackSV = jetutilities::deltaR(constituent, candSV); - if (deltaRTrackSV < RClosestSV) { - RClosestSV = deltaRTrackSV; + if (deltaRTrackSV < dRClosestSV) { + dRClosestSV = deltaRTrackSV; } } @@ -449,10 +452,10 @@ struct BJetTreeCreator { registry.fill(HIST("h2_SIPs3D_jetpT"), analysisJet.pt(), sign * std::abs(constituent.dcaXYZ()) / constituent.sigmadcaXYZ(), eventweight); if (doprocessMCJets) { - if (jetFlavor == 2) { + if (jetFlavor == JetTaggingSpecies::beauty) { registry.fill(HIST("h2_SIPs2D_jetpT_bjet"), analysisJet.pt(), sign * std::abs(constituent.dcaXY()) / constituent.sigmadcaXY(), eventweight); registry.fill(HIST("h2_SIPs3D_jetpT_bjet"), analysisJet.pt(), sign * std::abs(constituent.dcaXYZ()) / constituent.sigmadcaXYZ(), eventweight); - } else if (jetFlavor == 1) { + } else if (jetFlavor == JetTaggingSpecies::charm) { registry.fill(HIST("h2_SIPs2D_jetpT_cjet"), analysisJet.pt(), sign * std::abs(constituent.dcaXY()) / constituent.sigmadcaXY(), eventweight); registry.fill(HIST("h2_SIPs3D_jetpT_cjet"), analysisJet.pt(), sign * std::abs(constituent.dcaXYZ()) / constituent.sigmadcaXYZ(), eventweight); } else { @@ -462,7 +465,7 @@ struct BJetTreeCreator { } if (produceTree) { - bjetTracksParamsTable(bjetParamsTable.lastIndex() + 1, constituent.pt(), constituent.eta(), dotProduct, dotProduct / analysisJet.p(), deltaRJetTrack, std::abs(constituent.dcaXY()) * sign, constituent.sigmadcaXY(), std::abs(constituent.dcaZ()) * sign, constituent.sigmadcaZ(), constituent.sigmadcaXYZ(), constituent.p() / analysisJet.p(), RClosestSV); + bjetTracksParamsTable(bjetParamsTable.lastIndex() + 1, constituent.pt(), constituent.eta(), dotProduct, dotProduct / analysisJet.p(), deltaRJetTrack, std::abs(constituent.dcaXY()) * sign, constituent.sigmadcaXY(), std::abs(constituent.dcaZ()) * sign, constituent.sigmadcaZ(), constituent.sigmadcaXYZ(), constituent.p() / analysisJet.p(), dRClosestSV); } trackIndices.push_back(bjetTracksParamsTable.lastIndex()); } @@ -472,7 +475,7 @@ struct BJetTreeCreator { void analyzeJetTrackInfoForGNN(AnyCollision const& /*collision*/, AnalysisJet const& analysisJet, AnyTracks const& /*allTracks*/, AnyOriginalTracks const&, std::vector& trackIndices, int jetFlavor = 0, double eventweight = 1.0, TrackLabelMap* trkLabels = nullptr) { int trkIdx = -1; - for (auto& constituent : analysisJet.template tracks_as()) { + for (const auto& constituent : analysisJet.template tracks_as()) { trkIdx++; @@ -488,10 +491,10 @@ struct BJetTreeCreator { registry.fill(HIST("h2_SIPs3D_jetpT"), analysisJet.pt(), sign * std::abs(constituent.dcaXYZ()) / constituent.sigmadcaXYZ(), eventweight); if (doprocessMCJetsForGNN) { - if (jetFlavor == 2) { + if (jetFlavor == JetTaggingSpecies::beauty) { registry.fill(HIST("h2_SIPs2D_jetpT_bjet"), analysisJet.pt(), sign * std::abs(constituent.dcaXY()) / constituent.sigmadcaXY(), eventweight); registry.fill(HIST("h2_SIPs3D_jetpT_bjet"), analysisJet.pt(), sign * std::abs(constituent.dcaXYZ()) / constituent.sigmadcaXYZ(), eventweight); - } else if (jetFlavor == 1) { + } else if (jetFlavor == JetTaggingSpecies::charm) { registry.fill(HIST("h2_SIPs2D_jetpT_cjet"), analysisJet.pt(), sign * std::abs(constituent.dcaXY()) / constituent.sigmadcaXY(), eventweight); registry.fill(HIST("h2_SIPs3D_jetpT_cjet"), analysisJet.pt(), sign * std::abs(constituent.dcaXYZ()) / constituent.sigmadcaXYZ(), eventweight); } else { @@ -555,7 +558,7 @@ struct BJetTreeCreator { for (const auto& analysisJet : alljets) { bool jetIncluded = false; - for (auto jetR : jetRadiiValues) { + for (const auto& jetR : jetRadiiValues) { if (analysisJet.r() == static_cast(jetR * 100)) { jetIncluded = true; break; @@ -570,22 +573,22 @@ struct BJetTreeCreator { continue; } - std::vector tracksIndices; - std::vector SVsIndices; + std::vector indicesTracks; + std::vector indicesSVs; - analyzeJetSVInfo(analysisJet, allTracks, allSVs, SVsIndices); - analyzeJetTrackInfo(collision, analysisJet, allTracks, allSVs, tracksIndices); + analyzeJetSVInfo(analysisJet, allTracks, allSVs, indicesSVs); + analyzeJetTrackInfo(collision, analysisJet, allTracks, allSVs, indicesTracks); registry.fill(HIST("h2_jetMass_jetpT"), analysisJet.pt(), analysisJet.mass()); int nSVs = analysisJet.template secondaryVertices_as().size(); - registry.fill(HIST("h2_nTracks_jetpT"), analysisJet.pt(), tracksIndices.size()); + registry.fill(HIST("h2_nTracks_jetpT"), analysisJet.pt(), indicesTracks.size()); registry.fill(HIST("h2_nSV_jetpT"), analysisJet.pt(), nSVs < 250 ? nSVs : 249); if (produceTree) { - bjetConstituentsTable(bjetParamsTable.lastIndex() + 1, tracksIndices, SVsIndices); - bjetParamsTable(analysisJet.pt(), analysisJet.eta(), analysisJet.phi(), tracksIndices.size(), nSVs, analysisJet.mass(), 0, analysisJet.r()); + bjetConstituentsTable(bjetParamsTable.lastIndex() + 1, indicesTracks, indicesSVs); + bjetParamsTable(analysisJet.pt(), analysisJet.eta(), analysisJet.phi(), indicesTracks.size(), nSVs, analysisJet.mass(), 0, analysisJet.r()); } } } @@ -595,8 +598,8 @@ struct BJetTreeCreator { using MCPJetTable = soa::Filtered>; using FilteredCollisionMCD = soa::Filtered>; - Preslice McParticlesPerCollision = aod::jmcparticle::mcCollisionId; - Preslice McPJetsPerCollision = aod::jet::mcCollisionId; + Preslice mcParticlesPerCollision = aod::jmcparticle::mcCollisionId; + Preslice mcpJetsPerCollision = aod::jet::mcCollisionId; void processMCJets(FilteredCollisionMCD::iterator const& collision, MCDJetTable const& MCDjets, MCPJetTable const& MCPjets, JetTracksMCDwID const& allTracks, aod::JetParticles const& MCParticles, aod::MCDSecondaryVertex3Prongs const& allSVs) { @@ -606,13 +609,13 @@ struct BJetTreeCreator { registry.fill(HIST("h_vertexZ"), collision.posZ()); - auto const mcParticlesPerColl = MCParticles.sliceBy(McParticlesPerCollision, collision.mcCollisionId()); - auto const mcPJetsPerColl = MCPjets.sliceBy(McPJetsPerCollision, collision.mcCollisionId()); + auto const mcParticlesPerColl = MCParticles.sliceBy(mcParticlesPerCollision, collision.mcCollisionId()); + auto const mcPJetsPerColl = MCPjets.sliceBy(mcpJetsPerCollision, collision.mcCollisionId()); for (const auto& analysisJet : MCDjets) { bool jetIncluded = false; - for (auto jetR : jetRadiiValues) { + for (const auto& jetR : jetRadiiValues) { if (analysisJet.r() == static_cast(jetR * 100)) { jetIncluded = true; break; @@ -629,8 +632,8 @@ struct BJetTreeCreator { continue; } - std::vector tracksIndices; - std::vector SVsIndices; + std::vector indicesTracks; + std::vector indicesSVs; int16_t jetFlavor = 0; @@ -638,7 +641,7 @@ struct BJetTreeCreator { // jetFlavor = jettaggingutilities::mcdJetFromHFShower(analysisJet, allTracks, mcParticlesPerColl, (float)(analysisJet.r() / 100.)); // jetFlavor = jettaggingutilities::jetTrackFromHFShower(analysisJet, nonFilteredTracks, mcParticlesPerColl, hftrack); - for (auto& mcpjet : analysisJet.template matchedJetGeo_as()) { + for (const auto& mcpjet : analysisJet.template matchedJetGeo_as()) { if (useQuarkDef) { jetFlavor = jettaggingutilities::getJetFlavor(mcpjet, mcParticlesPerColl); } else { @@ -651,20 +654,20 @@ struct BJetTreeCreator { continue; } - analyzeJetSVInfo(analysisJet, allTracks, allSVs, SVsIndices, jetFlavor, eventWeight); - analyzeJetTrackInfo(collision, analysisJet, allTracks, allSVs, tracksIndices, jetFlavor, eventWeight); + analyzeJetSVInfo(analysisJet, allTracks, allSVs, indicesSVs, jetFlavor, eventWeight); + analyzeJetTrackInfo(collision, analysisJet, allTracks, allSVs, indicesTracks, jetFlavor, eventWeight); int nSVs = analysisJet.template secondaryVertices_as().size(); registry.fill(HIST("h2_jetMass_jetpT"), analysisJet.pt(), analysisJet.mass(), eventWeight); - registry.fill(HIST("h2_nTracks_jetpT"), analysisJet.pt(), tracksIndices.size()); + registry.fill(HIST("h2_nTracks_jetpT"), analysisJet.pt(), indicesTracks.size()); registry.fill(HIST("h2_nSV_jetpT"), analysisJet.pt(), nSVs < 250 ? nSVs : 249); - if (jetFlavor == 2) { + if (jetFlavor == JetTaggingSpecies::beauty) { registry.fill(HIST("h2_jetMass_jetpT_bjet"), analysisJet.pt(), analysisJet.mass(), eventWeight); registry.fill(HIST("h_jetpT_detector_bjet"), analysisJet.pt(), eventWeight); - } else if (jetFlavor == 1) { + } else if (jetFlavor == JetTaggingSpecies::charm) { registry.fill(HIST("h2_jetMass_jetpT_cjet"), analysisJet.pt(), analysisJet.mass(), eventWeight); registry.fill(HIST("h_jetpT_detector_cjet"), analysisJet.pt(), eventWeight); } else { @@ -672,15 +675,15 @@ struct BJetTreeCreator { registry.fill(HIST("h_jetpT_detector_lfjet"), analysisJet.pt(), eventWeight); } - for (auto& mcpjet : analysisJet.template matchedJetGeo_as()) { + for (const auto& mcpjet : analysisJet.template matchedJetGeo_as()) { if (mcpjet.pt() > pTHatMaxMCP * pTHat) { continue; } - if (jetFlavor == 2) { + if (jetFlavor == JetTaggingSpecies::beauty) { registry.fill(HIST("h2_Response_DetjetpT_PartjetpT_bjet"), analysisJet.pt(), mcpjet.pt(), eventWeight); - } else if (jetFlavor == 1) { + } else if (jetFlavor == JetTaggingSpecies::charm) { registry.fill(HIST("h2_Response_DetjetpT_PartjetpT_cjet"), analysisJet.pt(), mcpjet.pt(), eventWeight); } else { registry.fill(HIST("h2_Response_DetjetpT_PartjetpT_lfjet"), analysisJet.pt(), mcpjet.pt(), eventWeight); @@ -688,8 +691,8 @@ struct BJetTreeCreator { } if (produceTree) { - bjetConstituentsTable(bjetParamsTable.lastIndex() + 1, tracksIndices, SVsIndices); - bjetParamsTable(analysisJet.pt(), analysisJet.eta(), analysisJet.phi(), tracksIndices.size(), nSVs, analysisJet.mass(), jetFlavor, analysisJet.r()); + bjetConstituentsTable(bjetParamsTable.lastIndex() + 1, indicesTracks, indicesSVs); + bjetParamsTable(analysisJet.pt(), analysisJet.eta(), analysisJet.phi(), indicesTracks.size(), nSVs, analysisJet.mass(), jetFlavor, analysisJet.r()); } } } @@ -706,13 +709,13 @@ struct BJetTreeCreator { registry.fill(HIST("h_vertexZ"), collision.posZ()); - auto const mcParticlesPerColl = MCParticles.sliceBy(McParticlesPerCollision, collision.mcCollisionId()); - auto const mcPJetsPerColl = MCPjets.sliceBy(McPJetsPerCollision, collision.mcCollisionId()); + auto const mcParticlesPerColl = MCParticles.sliceBy(mcParticlesPerCollision, collision.mcCollisionId()); + auto const mcPJetsPerColl = MCPjets.sliceBy(mcpJetsPerCollision, collision.mcCollisionId()); for (const auto& analysisJet : MCDjets) { bool jetIncluded = false; - for (auto jetR : jetRadiiValues) { + for (const auto& jetR : jetRadiiValues) { if (analysisJet.r() == static_cast(jetR * 100)) { jetIncluded = true; break; @@ -723,12 +726,12 @@ struct BJetTreeCreator { continue; } - std::vector tracksIndices; - std::vector SVsIndices; + std::vector indicesTracks; + std::vector indicesSVs; int16_t jetFlavor = 0; - for (auto& mcpjet : analysisJet.template matchedJetGeo_as()) { + for (const auto& mcpjet : analysisJet.template matchedJetGeo_as()) { if (useQuarkDef) { jetFlavor = jettaggingutilities::getJetFlavor(mcpjet, mcParticlesPerColl); } else { @@ -745,24 +748,24 @@ struct BJetTreeCreator { //+ TrackLabelMap trkLabels{{"trkVtxIndex", {}}, {"trkOrigin", {}}}; int nVertices = jettaggingutilities::vertexClustering(collision.template mcCollision_as(), analysisJet, allTracks, MCParticles, origParticles, trkLabels, true, vtxRes, trackPtMin); - analyzeJetTrackInfoForGNN(collision, analysisJet, allTracks, origTracks, tracksIndices, jetFlavor, eventWeight, &trkLabels); + analyzeJetTrackInfoForGNN(collision, analysisJet, allTracks, origTracks, indicesTracks, jetFlavor, eventWeight, &trkLabels); registry.fill(HIST("h2_jetMass_jetpT"), analysisJet.pt(), analysisJet.mass(), eventWeight); - registry.fill(HIST("h2_nTracks_jetpT"), analysisJet.pt(), tracksIndices.size()); + registry.fill(HIST("h2_nTracks_jetpT"), analysisJet.pt(), indicesTracks.size()); //+jet registry.fill(HIST("h_jet_pt"), analysisJet.pt()); registry.fill(HIST("h_jet_eta"), analysisJet.eta()); registry.fill(HIST("h_jet_phi"), analysisJet.phi()); registry.fill(HIST("h_jet_flav"), jetFlavor); - registry.fill(HIST("h_n_trks"), tracksIndices.size()); + registry.fill(HIST("h_n_trks"), indicesTracks.size()); registry.fill(HIST("h_jet_mass"), analysisJet.mass()); registry.fill(HIST("h_n_vertices"), nVertices); - if (jetFlavor == 2) { + if (jetFlavor == JetTaggingSpecies::beauty) { registry.fill(HIST("h2_jetMass_jetpT_bjet"), analysisJet.pt(), analysisJet.mass(), eventWeight); registry.fill(HIST("h_jetpT_detector_bjet"), analysisJet.pt(), eventWeight); - } else if (jetFlavor == 1) { + } else if (jetFlavor == JetTaggingSpecies::charm) { registry.fill(HIST("h2_jetMass_jetpT_cjet"), analysisJet.pt(), analysisJet.mass(), eventWeight); registry.fill(HIST("h_jetpT_detector_cjet"), analysisJet.pt(), eventWeight); } else { @@ -771,8 +774,8 @@ struct BJetTreeCreator { } if (produceTree) { - bjetConstituentsTable(bjetParamsTable.lastIndex() + 1, tracksIndices, SVsIndices); - bjetParamsTable(analysisJet.pt(), analysisJet.eta(), analysisJet.phi(), tracksIndices.size(), nVertices, analysisJet.mass(), jetFlavor, analysisJet.r()); + bjetConstituentsTable(bjetParamsTable.lastIndex() + 1, indicesTracks, indicesSVs); + bjetParamsTable(analysisJet.pt(), analysisJet.eta(), analysisJet.phi(), indicesTracks.size(), nVertices, analysisJet.mass(), jetFlavor, analysisJet.r()); } } } @@ -787,7 +790,7 @@ struct BJetTreeCreator { for (const auto& mcpjet : MCPjets) { bool jetIncluded = false; - for (auto jetR : jetRadiiValues) { + for (const auto& jetR : jetRadiiValues) { if (mcpjet.r() == static_cast(jetR * 100)) { jetIncluded = true; break; @@ -812,9 +815,9 @@ struct BJetTreeCreator { // jetFlavor = jettaggingutilities::mcpJetFromHFShower(mcpjet, MCParticles, (float)(mcpjet.r() / 100.)); } - if (jetFlavor == 2) { + if (jetFlavor == JetTaggingSpecies::beauty) { registry.fill(HIST("h_jetpT_particle_bjet"), mcpjet.pt(), eventWeight); - } else if (jetFlavor == 1) { + } else if (jetFlavor == JetTaggingSpecies::charm) { registry.fill(HIST("h_jetpT_particle_cjet"), mcpjet.pt(), eventWeight); } else { registry.fill(HIST("h_jetpT_particle_lfjet"), mcpjet.pt(), eventWeight); From c0c3607ab5c374dc0c65209d750f77d8ed3d67b5 Mon Sep 17 00:00:00 2001 From: nzardosh Date: Wed, 14 May 2025 12:57:03 +0200 Subject: [PATCH 1267/1650] [PWGJE] removing std::optional (#11188) --- PWGJE/Core/JetFindingUtilities.h | 22 ++++++++----------- PWGJE/JetFinders/jetFinderHF.cxx | 6 ++--- PWGJE/JetFinders/jetFinderV0.cxx | 2 +- .../eventwiseConstituentSubtractor.cxx | 4 ++-- PWGJE/TableProducer/rhoEstimator.cxx | 20 ++++++++--------- 5 files changed, 25 insertions(+), 29 deletions(-) diff --git a/PWGJE/Core/JetFindingUtilities.h b/PWGJE/Core/JetFindingUtilities.h index 6fb2716965c..d99c84ecbbf 100644 --- a/PWGJE/Core/JetFindingUtilities.h +++ b/PWGJE/Core/JetFindingUtilities.h @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include @@ -99,15 +98,14 @@ constexpr bool isEMCALClusterTable() */ template -void analyseTracks(std::vector& inputParticles, T const& tracks, int trackSelection, double trackingEfficinecy, std::optional const& candidate = std::nullopt) +void analyseTracks(std::vector& inputParticles, T const& tracks, int trackSelection, double trackingEfficinecy, const U* candidate = nullptr) { for (auto& track : tracks) { if (!jetderiveddatautilities::selectTrack(track, trackSelection)) { continue; } - if (candidate != std::nullopt) { - auto cand = candidate.value(); - if (jetcandidateutilities::isDaughterTrack(track, cand, tracks)) { + if (candidate != nullptr) { + if (jetcandidateutilities::isDaughterTrack(track, *candidate, tracks)) { continue; } } @@ -337,7 +335,7 @@ void findJets(JetFinder& jetFinder, std::vector& inputPartic * @param candidate optional hf candidiate */ template -void analyseParticles(std::vector& inputParticles, std::string particleSelection, int jetTypeParticleLevel, T const& particles, o2::framework::Service pdgDatabase, std::optional const& candidate = std::nullopt) +void analyseParticles(std::vector& inputParticles, std::string particleSelection, int jetTypeParticleLevel, T const& particles, o2::framework::Service pdgDatabase, const U* candidate = nullptr) { for (auto& particle : particles) { if (particleSelection == "PhysicalPrimary" && !particle.isPhysicalPrimary()) { // CHECK : Does this exclude the HF hadron? @@ -361,13 +359,12 @@ void analyseParticles(std::vector& inputParticles, std::stri continue; } if constexpr (jetcandidateutilities::isMcCandidate() && !jetv0utilities::isV0McCandidate()) { - if (candidate != std::nullopt) { - auto cand = candidate.value(); - if (cand.mcParticleId() == particle.globalIndex()) { + if (candidate != nullptr) { + if ((*candidate).mcParticleId() == particle.globalIndex()) { continue; } if constexpr (checkIsDaughter) { - auto hfParticle = cand.template mcParticle_as(); + auto hfParticle = (*candidate).template mcParticle_as(); if (jetcandidateutilities::isDaughterParticle(hfParticle, particle.globalIndex())) { continue; } @@ -375,9 +372,8 @@ void analyseParticles(std::vector& inputParticles, std::stri } } if constexpr (jetv0utilities::isV0McTable()) { // note that for V0s the candidate table is given to this function, not a single candidate - if (candidate != std::nullopt) { - auto cands = candidate.value(); - for (auto const& cand : cands) { + if (candidate != nullptr) { + for (auto const& cand : (*candidate)) { if (cand.mcParticleId() == particle.globalIndex()) { continue; } diff --git a/PWGJE/JetFinders/jetFinderHF.cxx b/PWGJE/JetFinders/jetFinderHF.cxx index 0b8fc666607..9b435cf93a0 100644 --- a/PWGJE/JetFinders/jetFinderHF.cxx +++ b/PWGJE/JetFinders/jetFinderHF.cxx @@ -194,7 +194,7 @@ struct JetFinderHFTask { if constexpr (isEvtWiseSub) { jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, trackingEfficiency); } else { - jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, trackingEfficiency, std::optional{candidate}); + jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, trackingEfficiency, &candidate); } jetfindingutilities::findJets(jetFinder, inputParticles, minJetPt, maxJetPt, jetRadius, jetAreaFractionMin, collision, jetsTableInput, constituentsTableInput, registry.get(HIST("hJet")), fillTHnSparse, true); } @@ -212,9 +212,9 @@ struct JetFinderHFTask { return; } if constexpr (checkIsDaughter) { - jetfindingutilities::analyseParticles(inputParticles, particleSelection, jetTypeParticleLevel, particles, pdgDatabase, std::optional{candidate}); + jetfindingutilities::analyseParticles(inputParticles, particleSelection, jetTypeParticleLevel, particles, pdgDatabase, &candidate); } else { - jetfindingutilities::analyseParticles(inputParticles, particleSelection, jetTypeParticleLevel, particles, pdgDatabase, std::optional{candidate}); + jetfindingutilities::analyseParticles(inputParticles, particleSelection, jetTypeParticleLevel, particles, pdgDatabase, &candidate); } jetfindingutilities::findJets(jetFinder, inputParticles, minJetPt, maxJetPt, jetRadius, jetAreaFractionMin, collision, jetsTable, constituentsTable, registry.get(HIST("hJetMCP")), fillTHnSparse, true); } diff --git a/PWGJE/JetFinders/jetFinderV0.cxx b/PWGJE/JetFinders/jetFinderV0.cxx index 60c1f63bef4..cdb827783ac 100644 --- a/PWGJE/JetFinders/jetFinderV0.cxx +++ b/PWGJE/JetFinders/jetFinderV0.cxx @@ -182,7 +182,7 @@ struct JetFinderV0Task { if (!jetfindingutilities::analyseV0s(inputParticles, candidates, candPtMin, candPtMax, candYMin, candYMax, candIndex)) { return; } - jetfindingutilities::analyseParticles(inputParticles, particleSelection, jetTypeParticleLevel, particles, pdgDatabase, std::optional{candidates}); + jetfindingutilities::analyseParticles(inputParticles, particleSelection, jetTypeParticleLevel, particles, pdgDatabase, &candidates); jetfindingutilities::findJets(jetFinder, inputParticles, minJetPt, maxJetPt, jetRadius, jetAreaFractionMin, collision, jetsTable, constituentsTable, registry.get(HIST("hJetMCP")), fillTHnSparse, true); } diff --git a/PWGJE/TableProducer/eventwiseConstituentSubtractor.cxx b/PWGJE/TableProducer/eventwiseConstituentSubtractor.cxx index cf545ba8295..476fa4157d7 100644 --- a/PWGJE/TableProducer/eventwiseConstituentSubtractor.cxx +++ b/PWGJE/TableProducer/eventwiseConstituentSubtractor.cxx @@ -90,7 +90,7 @@ struct eventWiseConstituentSubtractorTask { for (auto& candidate : candidates) { inputParticles.clear(); tracksSubtracted.clear(); - jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, trackingEfficiency, std::optional{candidate}); + jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, trackingEfficiency, &candidate); tracksSubtracted = eventWiseConstituentSubtractor.JetBkgSubUtils::doEventConstSub(inputParticles, candidate.rho(), candidate.rhoM()); for (auto const& trackSubtracted : tracksSubtracted) { @@ -105,7 +105,7 @@ struct eventWiseConstituentSubtractorTask { for (auto& candidate : candidates) { inputParticles.clear(); tracksSubtracted.clear(); - jetfindingutilities::analyseParticles(inputParticles, particleSelection, 1, particles, pdgDatabase, std::optional{candidate}); // currently only works for charged analyses + jetfindingutilities::analyseParticles(inputParticles, particleSelection, 1, particles, pdgDatabase, &candidate); // currently only works for charged analyses tracksSubtracted = eventWiseConstituentSubtractor.JetBkgSubUtils::doEventConstSub(inputParticles, candidate.rho(), candidate.rhoM()); for (auto const& trackSubtracted : tracksSubtracted) { diff --git a/PWGJE/TableProducer/rhoEstimator.cxx b/PWGJE/TableProducer/rhoEstimator.cxx index b050abe1e83..a64a2d90e5d 100644 --- a/PWGJE/TableProducer/rhoEstimator.cxx +++ b/PWGJE/TableProducer/rhoEstimator.cxx @@ -218,7 +218,7 @@ struct RhoEstimatorTask { continue; } inputParticles.clear(); - jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, config.trackingEfficiency, std::optional{candidate}); + jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, config.trackingEfficiency, &candidate); auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, config.doSparse); rhoD0Table(rho, rhoM); @@ -230,7 +230,7 @@ struct RhoEstimatorTask { { for (auto& candidate : candidates) { inputParticles.clear(); - jetfindingutilities::analyseParticles(inputParticles, particleSelection, 1, particles, pdgDatabase, std::optional{candidate}); + jetfindingutilities::analyseParticles(inputParticles, particleSelection, 1, particles, pdgDatabase, &candidate); auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, config.doSparse); rhoD0McTable(rho, rhoM); @@ -246,7 +246,7 @@ struct RhoEstimatorTask { continue; } inputParticles.clear(); - jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, config.trackingEfficiency, std::optional{candidate}); + jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, config.trackingEfficiency, &candidate); auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, config.doSparse); rhoDplusTable(rho, rhoM); @@ -258,7 +258,7 @@ struct RhoEstimatorTask { { for (auto& candidate : candidates) { inputParticles.clear(); - jetfindingutilities::analyseParticles(inputParticles, particleSelection, 1, particles, pdgDatabase, std::optional{candidate}); + jetfindingutilities::analyseParticles(inputParticles, particleSelection, 1, particles, pdgDatabase, &candidate); auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, config.doSparse); rhoDplusMcTable(rho, rhoM); @@ -274,7 +274,7 @@ struct RhoEstimatorTask { continue; } inputParticles.clear(); - jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, config.trackingEfficiency, std::optional{candidate}); + jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, config.trackingEfficiency, &candidate); auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, config.doSparse); rhoLcTable(rho, rhoM); @@ -286,7 +286,7 @@ struct RhoEstimatorTask { { for (auto& candidate : candidates) { inputParticles.clear(); - jetfindingutilities::analyseParticles(inputParticles, particleSelection, 1, particles, pdgDatabase, std::optional{candidate}); + jetfindingutilities::analyseParticles(inputParticles, particleSelection, 1, particles, pdgDatabase, &candidate); auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, config.doSparse); rhoLcMcTable(rho, rhoM); @@ -302,7 +302,7 @@ struct RhoEstimatorTask { continue; } inputParticles.clear(); - jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, config.trackingEfficiency, std::optional{candidate}); + jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, config.trackingEfficiency, &candidate); auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, config.doSparse); rhoBplusTable(rho, rhoM); @@ -314,7 +314,7 @@ struct RhoEstimatorTask { { for (auto& candidate : candidates) { inputParticles.clear(); - jetfindingutilities::analyseParticles(inputParticles, particleSelection, 1, particles, pdgDatabase, std::optional{candidate}); + jetfindingutilities::analyseParticles(inputParticles, particleSelection, 1, particles, pdgDatabase, &candidate); auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, config.doSparse); rhoBplusMcTable(rho, rhoM); @@ -330,7 +330,7 @@ struct RhoEstimatorTask { continue; } inputParticles.clear(); - jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, config.trackingEfficiency, std::optional{candidate}); + jetfindingutilities::analyseTracks(inputParticles, tracks, trackSelection, config.trackingEfficiency, &candidate); auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, config.doSparse); rhoDielectronTable(rho, rhoM); @@ -342,7 +342,7 @@ struct RhoEstimatorTask { { for (auto& candidate : candidates) { inputParticles.clear(); - jetfindingutilities::analyseParticles(inputParticles, particleSelection, 1, particles, pdgDatabase, std::optional{candidate}); + jetfindingutilities::analyseParticles(inputParticles, particleSelection, 1, particles, pdgDatabase, &candidate); auto [rho, rhoM] = bkgSub.estimateRhoAreaMedian(inputParticles, config.doSparse); rhoDielectronMcTable(rho, rhoM); From 5a2f36b4a22654b949f0155b75cad6546d9f1dd2 Mon Sep 17 00:00:00 2001 From: blacwovie Date: Wed, 14 May 2025 20:11:53 +0800 Subject: [PATCH 1268/1650] [PWGCF] Add directory Femto and pi-d analysis workflow (#11151) Co-authored-by: blacw Co-authored-by: ALICE Action Bot --- PWGCF/CMakeLists.txt | 1 + PWGCF/Femto/CMakeLists.txt | 14 + PWGCF/Femto/DataModel/PionDeuteronTables.h | 111 +++ PWGCF/Femto/TableProducer/CMakeLists.txt | 15 + PWGCF/Femto/TableProducer/PiDeuteronFemto.cxx | 766 ++++++++++++++++++ 5 files changed, 907 insertions(+) create mode 100644 PWGCF/Femto/CMakeLists.txt create mode 100644 PWGCF/Femto/DataModel/PionDeuteronTables.h create mode 100644 PWGCF/Femto/TableProducer/CMakeLists.txt create mode 100644 PWGCF/Femto/TableProducer/PiDeuteronFemto.cxx diff --git a/PWGCF/CMakeLists.txt b/PWGCF/CMakeLists.txt index 7432d5c21b1..84f1b6c6d41 100644 --- a/PWGCF/CMakeLists.txt +++ b/PWGCF/CMakeLists.txt @@ -24,3 +24,4 @@ add_subdirectory(TwoParticleCorrelations) add_subdirectory(JCorran) add_subdirectory(Femto3D) add_subdirectory(EbyEFluctuations) +add_subdirectory(Femto) diff --git a/PWGCF/Femto/CMakeLists.txt b/PWGCF/Femto/CMakeLists.txt new file mode 100644 index 00000000000..80706fd8f1f --- /dev/null +++ b/PWGCF/Femto/CMakeLists.txt @@ -0,0 +1,14 @@ +# Copyright 2019-2024 CERN and copyright holders of ALICE O2. +# See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +# All rights not expressly granted are reserved. +# +# This software is distributed under the terms of the GNU General Public +# License v3 (GPL Version 3), copied verbatim in the file "COPYING". +# +# In applying this license CERN does not waive the privileges and immunities +# granted to it by virtue of its status as an Intergovernmental Organization +# or submit itself to any jurisdiction. + +#add_subdirectory(DataModel) +add_subdirectory(TableProducer) + diff --git a/PWGCF/Femto/DataModel/PionDeuteronTables.h b/PWGCF/Femto/DataModel/PionDeuteronTables.h new file mode 100644 index 00000000000..89754a8cc97 --- /dev/null +++ b/PWGCF/Femto/DataModel/PionDeuteronTables.h @@ -0,0 +1,111 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// +/// \file PionDeuteronTables.h +/// \brief Slim tables for piDeuteron +/// \author CMY +/// \date 2025-04-10 + +#include "Framework/AnalysisDataModel.h" +#include "Framework/ASoAHelpers.h" + +#ifndef PWGCF_FEMTO_DATAMODEL_PIONDEUTERONTABLES_H_ +#define PWGCF_FEMTO_DATAMODEL_PIONDEUTERONTABLES_H_ + +namespace o2::aod +{ +namespace pion_deuteron_tables +{ + +DECLARE_SOA_COLUMN(PtDe, ptDe, float); +DECLARE_SOA_COLUMN(EtaDe, etaDe, float); +DECLARE_SOA_COLUMN(PhiDe, phiDe, float); +DECLARE_SOA_COLUMN(PtPi, ptPi, float); +DECLARE_SOA_COLUMN(EtaPi, etaPi, float); +DECLARE_SOA_COLUMN(PhiPi, phiPi, float); + +DECLARE_SOA_COLUMN(DcaxyDe, dcaxyDe, float); +DECLARE_SOA_COLUMN(DcazDe, dcazDe, float); +DECLARE_SOA_COLUMN(DcaxyPi, dcaxyPi, float); +DECLARE_SOA_COLUMN(DcazPi, dcazPi, float); + +DECLARE_SOA_COLUMN(SignalTPCDe, signalTPCDe, float); +DECLARE_SOA_COLUMN(InnerParamTPCDe, innerParamTPCDe, float); +DECLARE_SOA_COLUMN(SignalTPCPi, signalTPCPi, float); +DECLARE_SOA_COLUMN(InnerParamTPCPi, innerParamTPCPi, float); +DECLARE_SOA_COLUMN(NClsTPCDe, nClsTPCDe, uint8_t); +DECLARE_SOA_COLUMN(NSigmaTPCDe, nSigmaTPCDe, float); +DECLARE_SOA_COLUMN(NSigmaTPCPi, nSigmaTPCPi, float); +DECLARE_SOA_COLUMN(Chi2TPCDe, chi2TPCDe, float); +DECLARE_SOA_COLUMN(Chi2TPCPi, chi2TPCPi, float); +DECLARE_SOA_COLUMN(MassTOFDe, massTOFDe, float); +DECLARE_SOA_COLUMN(MassTOFPi, massTOFPi, float); +DECLARE_SOA_COLUMN(PidTrkDe, pidTrkDe, uint32_t); +DECLARE_SOA_COLUMN(PidTrkPi, pidTrkPi, uint32_t); + +DECLARE_SOA_COLUMN(ItsClusterSizeDe, itsClusterSizeDe, uint32_t); +DECLARE_SOA_COLUMN(ItsClusterSizePi, itsClusterSizePi, uint32_t); + +DECLARE_SOA_COLUMN(SharedClustersDe, sharedClustersDe, uint8_t); +DECLARE_SOA_COLUMN(SharedClustersPi, sharedClustersPi, uint8_t); + +DECLARE_SOA_COLUMN(IsBkgUS, isBkgUS, bool); +DECLARE_SOA_COLUMN(IsBkgEM, isBkgEM, bool); + +DECLARE_SOA_COLUMN(CollisionId, collisionId, int64_t); +DECLARE_SOA_COLUMN(ZVertex, zVertex, float); +DECLARE_SOA_COLUMN(Multiplicity, multiplicity, uint16_t); +DECLARE_SOA_COLUMN(CentFT0C, centFT0C, float); +DECLARE_SOA_COLUMN(MultiplicityFT0C, multiplicityFT0C, float); + +} // namespace pion_deuteron_tables + +DECLARE_SOA_TABLE(PionDeuteronTable, "AOD", "PIDEUTERONTABLE", + pion_deuteron_tables::PtDe, + pion_deuteron_tables::EtaDe, + pion_deuteron_tables::PhiDe, + pion_deuteron_tables::PtPi, + pion_deuteron_tables::EtaPi, + pion_deuteron_tables::PhiPi, + pion_deuteron_tables::DcaxyDe, + pion_deuteron_tables::DcazDe, + pion_deuteron_tables::DcaxyPi, + pion_deuteron_tables::DcazPi, + pion_deuteron_tables::SignalTPCDe, + pion_deuteron_tables::InnerParamTPCDe, + pion_deuteron_tables::SignalTPCPi, + pion_deuteron_tables::InnerParamTPCPi, + pion_deuteron_tables::NClsTPCDe, + pion_deuteron_tables::NSigmaTPCDe, + pion_deuteron_tables::NSigmaTPCPi, + pion_deuteron_tables::Chi2TPCDe, + pion_deuteron_tables::Chi2TPCPi, + pion_deuteron_tables::MassTOFDe, + pion_deuteron_tables::MassTOFPi, + pion_deuteron_tables::PidTrkDe, + pion_deuteron_tables::PidTrkPi, + pion_deuteron_tables::ItsClusterSizeDe, + pion_deuteron_tables::ItsClusterSizePi, + pion_deuteron_tables::SharedClustersDe, + pion_deuteron_tables::SharedClustersPi, + pion_deuteron_tables::IsBkgUS, + pion_deuteron_tables::IsBkgEM) +DECLARE_SOA_TABLE(PionDeuteronMult, "AOD", "PIDEUTERONMULT", + pion_deuteron_tables::CollisionId, + pion_deuteron_tables::ZVertex, + pion_deuteron_tables::Multiplicity, + pion_deuteron_tables::CentFT0C, + pion_deuteron_tables::MultiplicityFT0C) + +} // namespace o2::aod + +#endif // PWGCF_FEMTO_DATAMODEL_PIONDEUTERONTABLES_H_ diff --git a/PWGCF/Femto/TableProducer/CMakeLists.txt b/PWGCF/Femto/TableProducer/CMakeLists.txt new file mode 100644 index 00000000000..2510c3afd9a --- /dev/null +++ b/PWGCF/Femto/TableProducer/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright 2019-2024 CERN and copyright holders of ALICE O2. +# See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +# All rights not expressly granted are reserved. +# +# This software is distributed under the terms of the GNU General Public +# License v3 (GPL Version 3), copied verbatim in the file "COPYING". +# +# In applying this license CERN does not waive the privileges and immunities +# granted to it by virtue of its status as an Intergovernmental Organization +# or submit itself to any jurisdiction. + +o2physics_add_dpl_workflow(pideuteronfemto + SOURCES PiDeuteronFemto.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::EventFilteringUtils + COMPONENT_NAME Analysis) diff --git a/PWGCF/Femto/TableProducer/PiDeuteronFemto.cxx b/PWGCF/Femto/TableProducer/PiDeuteronFemto.cxx new file mode 100644 index 00000000000..6874bdcc607 --- /dev/null +++ b/PWGCF/Femto/TableProducer/PiDeuteronFemto.cxx @@ -0,0 +1,766 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +// + +/// \file PiDeuteronFemto.cxx +/// \brief Analysis task for Deuteron-Pion femto analysis +/// \author CMY +/// \date 2025-04-10 + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include // std::prev + +#include "Framework/ASoAHelpers.h" +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/StepTHn.h" + +#include "Common/Core/PID/PIDTOF.h" +#include "Common/Core/PID/TPCPIDResponse.h" +#include "Common/Core/RecoDecay.h" +#include "Common/Core/TrackSelection.h" +#include "Common/Core/trackUtilities.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/PIDResponseITS.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/TableProducer/PID/pidTOFBase.h" + +#include "EventFiltering/Zorro.h" +#include "EventFiltering/ZorroSummary.h" + +#include "CCDB/BasicCCDBManager.h" +#include "DetectorsBase/Propagator.h" +#include "DetectorsBase/GeometryManager.h" +#include "DataFormatsTPC/BetheBlochAleph.h" +#include "DataFormatsParameters/GRPObject.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "ReconstructionDataFormats/Track.h" + +#include "PWGLF/DataModel/EPCalibrationTables.h" +#include "PWGCF/Femto/DataModel/PionDeuteronTables.h" +#include "PWGLF/Utils/svPoolCreator.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using std::array; + +using CollBracket = o2::math_utils::Bracket; +using CollisionsFull = soa::Join; +using CollisionsFullMC = soa::Join; +using TrackCandidates = soa::Join; + +namespace +{ +constexpr double betheBlochDefault[1][6]{{-136.71, 0.441, 0.2269, 1.347, 0.8035, 0.09}}; +static const std::vector betheBlochParNames{"p0", "p1", "p2", "p3", "p4", "resolution"}; + +enum Selections { + kNoCuts = 0, + kTrackCuts, + kPID, + kAll +}; + +} // namespace + +struct PiDecandidate { + + float recoPtDe() const { return signDe * std::hypot(momDe[0], momDe[1]); } + float recoPhiDe() const { return std::atan2(momDe[1], momDe[0]); } + float recoEtaDe() const { return std::asinh(momDe[2] / std::abs(recoPtDe())); } + float recoPtPi() const { return signPi * std::hypot(momPi[0], momPi[1]); } + float recoPhiPi() const { return std::atan2(momPi[1], momPi[0]); } + float recoEtaPi() const { return std::asinh(momPi[2] / std::abs(recoPtPi())); } + + std::array momDe = {99.f, 99.f, 99.f}; + std::array momPi = {99.f, 99.f, 99.f}; + + float signDe = 1.f; + float signPi = 1.f; + float invMass = -10.f; + float dcaxyDe = -10.f; + float dcazDe = -10.f; + float dcaxyPi = -10.f; + float dcazPi = -10.f; + + uint16_t tpcSignalDe = 0u; + uint16_t tpcSignalPi = 0u; + float momDeTPC = -99.f; + float momPiTPC = -99.f; + uint8_t nTPCClustersDe = 0u; + uint8_t sharedClustersDe = 0u; + uint8_t sharedClustersPi = 0u; + float chi2TPCDe = -10.f; + float chi2TPCPi = -10.f; + float nSigmaDe = -10.f; + float nSigmaPi = -10.f; + uint32_t pidTrkDe = 0xFFFFF; // PID in tracking + uint32_t pidTrkPi = 0xFFFFF; + float massTOFDe = -10; + float massTOFPi = -10; + uint32_t itsClSizeDe = 0u; + uint32_t itsClSizePi = 0u; + + uint8_t nClsItsDe = 0u; + uint8_t nClsItsPi = 0u; + + bool isBkgUS = false; // unlike sign + bool isBkgEM = false; // event mixing + + int trackIDDe = -1; + int trackIDPi = -1; + + // collision information + int32_t collisionID = 0; +}; + +struct PiDeuteronFemto { + + Produces mOutputDataTable; + Produces mOutputMultiplicityTable; + + // Selections + Configurable settingCutVertex{"settingCutVertex", 10.0f, "Accepted z-vertex range"}; + Configurable settingCutPinMinDe{"settingCutPinMinDe", 0.0f, "Minimum Pin for De"}; + Configurable settingCutEta{"settingCutEta", 0.8f, "Eta cut on daughter track"}; + Configurable settingCutDCAxy{"settingCutDCAxy", 2.0f, "DCAxy range for tracks"}; + Configurable settingCutDCAz{"settingCutDCAz", 2.0f, "DCAz range for tracks"}; + Configurable settingCutChi2tpcLow{"settingCutChi2tpcLow", 0.0f, "Low cut on TPC chi2"}; + Configurable settingCutChi2tpcHigh{"settingCutChi2tpcHigh", 999.f, "High cut on TPC chi2"}; + Configurable settingCutInvMass{"settingCutInvMass", 0.0f, "Invariant mass upper limit"}; + Configurable settingCutPtMinDePi{"settingCutPtMinDePi", 0.0f, "Minimum PT cut on DePi4"}; + Configurable settingCutClSizeItsDe{"settingCutClSizeItsDe", 4.0f, "Minimum ITS cluster size for De"}; + Configurable settingCutNCls{"settingCutNCls", 5.0f, "Minimum ITS Ncluster for tracks"}; + Configurable settingCutChi2NClITS{"settingCutChi2NClITS", 999.f, "Maximum ITS Chi2 for tracks"}; + Configurable settingCutNsigmaTPCPi{"settingCutNsigmaTPCPi", 3.0f, "Value of the TPC Nsigma cut on Pi"}; + Configurable settingCutNsigmaTPCDe{"settingCutNsigmaTPCDe", 2.5f, "Value of the TPC Nsigma cut on De"}; + Configurable settingCutNsigmaITSDe{"settingCutNsigmaITSDe", 2.5f, "Value of the ITD Nsigma cut on De"}; + Configurable settingCutPinMinTOFPi{"settingCutPinMinTOFPi", 0.5f, "Minimum Pin to apply the TOF cut on Pions"}; + Configurable settingCutPinMinTOFITSDe{"settingCutPinMinTOFITSDe", 1.2f, "Minimum pT to apply the TOF ITS cut on De"}; + Configurable settingCutNsigmaTOFTPCDe{"settingCutNsigmaTOFTPCDe", 2.5f, "Value of the De TOF TPC Nsigma cut"}; + Configurable settingCutNsigmaTOFTPCPi{"settingCutNsigmaTOFTPCPi", 3.0f, "Value of the Pion TOF TPC Nsigma cut"}; + Configurable settingNoMixedEvents{"settingNoMixedEvents", 5, "Number of mixed events per event"}; + Configurable settingEnableBkgUS{"settingEnableBkgUS", false, "Enable US background"}; + Configurable settingSaveUSandLS{"settingSaveUSandLS", true, "Save All Pairs"}; + Configurable settingFillMultiplicity{"settingFillMultiplicity", false, "Fill multiplicity table"}; + + // Zorro + Configurable settingSkimmedProcessing{"settingSkimmedProcessing", false, "Skimmed dataset processing"}; + + // CCDB options + Configurable settingDbz{"settingDbz", -999, "bz field, -999 is automatic"}; + Configurable settingCcdburl{"settingCcdburl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable settingGrpPath{"settingGrpPath", "GLO/GRP/GRP", "Path of the grp file"}; + Configurable settingGrpmagPath{"settingGrpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + Configurable settingLutPath{"settingLutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; + Configurable settingGeoPath{"settingGeoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; + Configurable settingPidPath{"settingPidPath", "", "Path to the PID response object"}; + + Configurable> settingBetheBlochParams{"settingBetheBlochParams", {betheBlochDefault[0], 1, 6, {"De"}, betheBlochParNames}, "TPC Bethe-Bloch parameterisation for De"}; + Configurable settingCompensatePIDinTracking{"settingCompensatePIDinTracking", false, "If true, divide tpcInnerParam by the electric charge"}; + Configurable settingMaterialCorrection{"settingMaterialCorrection", static_cast(o2::base::Propagator::MatCorrType::USEMatCorrNONE), "Material correction type"}; + + Preslice mPerCol = aod::track::collisionId; + + // binning for EM background + ConfigurableAxis axisVertex{"axisVertex", {30, -10, 10}, "Binning for multiplicity"}; + ConfigurableAxis axisCentrality{"axisCentrality", {40, 0, 100}, "Binning for centrality"}; + using BinningType = ColumnBinningPolicy; + BinningType binningPolicy{{axisVertex, axisCentrality}, true}; + SliceCache cache; + SameKindPair mPair{binningPolicy, settingNoMixedEvents, -1, &cache}; + + std::array mBBparamsDe; + + std::vector mRecoCollisionIDs; + std::vector mGoodCollisions; + std::vector mTrackPairs; + o2::vertexing::DCAFitterN<2> mFitter; + + int mRunNumber; + float mDbz; + Service mCcdb; + Zorro mZorro; + OutputObj mZorroSummary{"zorroSummary"}; + + HistogramRegistry mQaRegistry{ + "QA", + { + {"hVtxZ", "Vertex distribution in Z;Z (cm)", {HistType::kTH1F, {{400, -20.0, 20.0}}}}, + {"hNcontributor", "Number of primary vertex contributor", {HistType::kTH1F, {{2000, 0.0f, 2000.0f}}}}, + {"hTrackSel", "Accepted tracks", {HistType::kTH1F, {{Selections::kAll, -0.5, static_cast(Selections::kAll) - 0.5}}}}, + {"hEvents", "; Events;", {HistType::kTH1F, {{3, -0.5, 2.5}}}}, + {"hEmptyPool", "svPoolCreator did not find track pairs false/true", {HistType::kTH1F, {{2, -0.5, 1.5}}}}, + {"hdcaxyDe", ";DCA_{xy} (cm)", {HistType::kTH1F, {{200, -1.0f, 1.0f}}}}, + {"hdcazDe", ";DCA_{z} (cm)", {HistType::kTH1F, {{200, -1.0f, 1.0f}}}}, + {"hNClsDeITS", ";N_{ITS} Cluster", {HistType::kTH1F, {{20, -10.0f, 10.0f}}}}, + {"hNClsPiITS", ";N_{ITS} Cluster", {HistType::kTH1F, {{20, -10.0f, 10.0f}}}}, + {"hDePitInvMass", "; M(De + p) (GeV/#it{c}^{2})", {HistType::kTH1F, {{300, 3.74f, 4.34f}}}}, + {"hDePt", "#it{p}_{T} distribution; #it{p}_{T} (GeV/#it{c})", {HistType::kTH1F, {{240, -6.0f, 6.0f}}}}, + {"hPiPt", "Pt distribution; #it{p}_{T} (GeV/#it{c})", {HistType::kTH1F, {{120, -3.0f, 3.0f}}}}, + {"h2dEdxDecandidates", "dEdx distribution; #it{p} (GeV/#it{c}); dE/dx (a.u.)", {HistType::kTH2F, {{200, -5.0f, 5.0f}, {100, 0.0f, 2000.0f}}}}, + {"h2NsigmaDeTPC", "NsigmaDe TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(De)", {HistType::kTH2F, {{20, -5.0f, 5.0f}, {200, -5.0f, 5.0f}}}}, + {"h2NsigmaDeTPC_preselection", "NsigmaDe TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(De)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}}, + {"h2NsigmaDeTPC_preselecComp", "NsigmaDe TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(De)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}}, + {"h2NSigmaDeITS_preselection", "NsigmaDe ITS distribution; signed #it{p}_{T} (GeV/#it{c}); n#sigma_{ITS} De", {HistType::kTH2F, {{50, -5.0f, 5.0f}, {120, -3.0f, 3.0f}}}}, + {"h2NSigmaDeITS", "NsigmaDe ITS distribution; signed #it{p}_{T} (GeV/#it{c}); n#sigma_{ITS} De", {HistType::kTH2F, {{50, -5.0f, 5.0f}, {120, -3.0f, 3.0f}}}}, + {"h2NsigmaPiTPC", "NsigmaPi TPC distribution; #it{p}_{T}(GeV/#it{c}); n#sigma_{TPC}(p)", {HistType::kTH2F, {{20, -5.0f, 5.0f}, {200, -5.0f, 5.0f}}}}, + {"h2NsigmaPiTPC_preselection", "NsigmaDe TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(De)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}}, + {"h2NsigmaPiTOF", "NsigmaPi TOF distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TOF}(p)", {HistType::kTH2F, {{20, -5.0f, 5.0f}, {200, -5.0f, 5.0f}}}}, + {"h2NsigmaPiTOF_preselection", "NsigmaPi TOF distribution; #iit{p}_{T} (GeV/#it{c}); n#sigma_{TOF}(p)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}}, + }, + OutputObjHandlingPolicy::AnalysisObject, + false, + true}; + + void init(o2::framework::InitContext&) + { + mZorroSummary.setObject(mZorro.getZorroSummary()); + mRunNumber = 0; + + mCcdb->setURL(settingCcdburl); + mCcdb->setCaching(true); + mCcdb->setLocalObjectValidityChecking(); + mCcdb->setFatalWhenNull(false); + + mFitter.setPropagateToPCA(true); + mFitter.setMaxR(200.); + mFitter.setMinParamChange(1e-3); + mFitter.setMinRelChi2Change(0.9); + mFitter.setMaxDZIni(1e9); + mFitter.setMaxChi2(1e9); + mFitter.setUseAbsDCA(true); + int mat{static_cast(settingMaterialCorrection)}; + mFitter.setMatCorrType(static_cast(mat)); + + const int numParticles = 5; + for (int i = 0; i < numParticles; i++) { + mBBparamsDe[i] = settingBetheBlochParams->get("De", Form("p%i", i)); + } + mBBparamsDe[5] = settingBetheBlochParams->get("De", "resolution"); // wdf? + + std::vector selectionLabels = {"All", "Track selection", "PID"}; + for (int i = 0; i < Selections::kAll; i++) { + mQaRegistry.get(HIST("hTrackSel"))->GetXaxis()->SetBinLabel(i + 1, selectionLabels[i].c_str()); + } + + std::vector eventsLabels = {"All", "Selected", "Zorro De events"}; + for (int i = 0; i < Selections::kAll; i++) { + mQaRegistry.get(HIST("hEvents"))->GetXaxis()->SetBinLabel(i + 1, eventsLabels[i].c_str()); + } + + mQaRegistry.get(HIST("hEmptyPool"))->GetXaxis()->SetBinLabel(1, "False"); + mQaRegistry.get(HIST("hEmptyPool"))->GetXaxis()->SetBinLabel(2, "True"); + } + + void initCCDB(const aod::BCsWithTimestamps::iterator& bc) + { + if (mRunNumber == bc.runNumber()) { + return; + } + if (settingSkimmedProcessing) { + mZorro.initCCDB(mCcdb.service, bc.runNumber(), bc.timestamp(), "fDe"); + mZorro.populateHistRegistry(mQaRegistry, bc.runNumber()); + } + mRunNumber = bc.runNumber(); + const float defaultBzValue = -999.0f; + auto run3GrpTimestamp = bc.timestamp(); + o2::parameters::GRPObject* grpo = mCcdb->getForTimeStamp(settingGrpPath, run3GrpTimestamp); + o2::parameters::GRPMagField* grpmag = 0x0; + if (grpo) { + o2::base::Propagator::initFieldFromGRP(grpo); + if (settingDbz < defaultBzValue) { + // Fetch magnetic field from ccdb for current collision + mDbz = grpo->getNominalL3Field(); + LOG(info) << "Retrieved GRP for timestamp " << run3GrpTimestamp << " with magnetic field of " << mDbz << " kZG"; + } else { + mDbz = settingDbz; + } + } else { + grpmag = mCcdb->getForTimeStamp(settingGrpmagPath, run3GrpTimestamp); + if (!grpmag) { + LOG(fatal) << "Got nullptr from CCDB for path " << settingGrpmagPath << " of object GRPMagField and " << settingGrpPath << " of object GRPObject for timestamp " << run3GrpTimestamp; + } + o2::base::Propagator::initFieldFromGRP(grpmag); + if (settingDbz < defaultBzValue) { + // Fetch magnetic field from ccdb for current collision + mDbz = std::lround(5.f * grpmag->getL3Current() / 30000.f); + LOG(info) << "Retrieved GRP for timestamp " << run3GrpTimestamp << " with magnetic field of " << mDbz << " kZG"; + } else { + mDbz = settingDbz; + } + } + } + + // ================================================================================================================== + + template + bool selectCollision(const Tcollision& collision, const aod::BCsWithTimestamps&) + { + mQaRegistry.fill(HIST("hEvents"), 0); + + if constexpr (isMC) { + if (/*!collision.sel8() ||*/ std::abs(collision.posZ()) > settingCutVertex) { + return false; + } + } else { + auto bc = collision.template bc_as(); + initCCDB(bc); + + if (!collision.sel8() || std::abs(collision.posZ()) > settingCutVertex) { + return false; + } + if (settingSkimmedProcessing) { + bool zorroSelected = mZorro.isSelected(collision.template bc_as().globalBC()); + if (zorroSelected) { + mQaRegistry.fill(HIST("hEvents"), 2); + } + } + } + + mQaRegistry.fill(HIST("hEvents"), 1); + mQaRegistry.fill(HIST("hNcontributor"), collision.numContrib()); + mQaRegistry.fill(HIST("hVtxZ"), collision.posZ()); + return true; + } + + template + bool selectTrack(const Ttrack& candidate) + { + if (std::abs(candidate.eta()) > settingCutEta) { + return false; + } + const int minTPCNClsFound = 90; + const int minTPCNClsCrossedRows = 100; + const float crossedRowsToFindableRatio = 0.83f; + if (candidate.itsNCls() < settingCutNCls || + candidate.tpcNClsFound() < minTPCNClsFound || + candidate.tpcNClsCrossedRows() < minTPCNClsCrossedRows || + candidate.tpcNClsCrossedRows() < crossedRowsToFindableRatio * candidate.tpcNClsFindable() || + candidate.tpcChi2NCl() > settingCutChi2tpcHigh || + candidate.tpcChi2NCl() < settingCutChi2tpcLow || + candidate.itsChi2NCl() > settingCutChi2NClITS) { + return false; + } + + return true; + } + + template + bool selectionPIDPion(const Ttrack& candidate) + { + auto tpcNSigmaPi = candidate.tpcNSigmaPi(); + mQaRegistry.fill(HIST("h2NsigmaPiTPC_preselection"), candidate.tpcInnerParam(), tpcNSigmaPi); + if (candidate.hasTOF() && candidate.tpcInnerParam() > settingCutPinMinTOFPi) { + auto tofNSigmaPi = candidate.tofNSigmaPi(); + + if (std::abs(tpcNSigmaPi) > settingCutNsigmaTPCPi) { + return false; + } + mQaRegistry.fill(HIST("h2NsigmaPiTOF_preselection"), candidate.pt(), tofNSigmaPi); + if (std::sqrt(tofNSigmaPi * tofNSigmaPi + tpcNSigmaPi * tpcNSigmaPi) > settingCutNsigmaTOFTPCPi) { + return false; + } + mQaRegistry.fill(HIST("h2NsigmaPiTPC"), candidate.pt(), tpcNSigmaPi); + mQaRegistry.fill(HIST("h2NsigmaPiTOF"), candidate.pt(), tofNSigmaPi); + return true; + } else if (std::abs(tpcNSigmaPi) < settingCutNsigmaTPCPi) { + mQaRegistry.fill(HIST("h2NsigmaPiTPC"), candidate.pt(), tpcNSigmaPi); + return true; + } + return false; + } + + template + float computeNSigmaDe(const Ttrack& candidate) + { + float expTPCSignal = o2::tpc::BetheBlochAleph(static_cast(candidate.tpcInnerParam() / constants::physics::MassDeuteron), mBBparamsDe[0], mBBparamsDe[1], mBBparamsDe[2], mBBparamsDe[3], mBBparamsDe[4]); + double resoTPC{expTPCSignal * mBBparamsDe[5]}; + return static_cast((candidate.tpcSignal() - expTPCSignal) / resoTPC); + } + + template + bool selectionPIDDe(const Ttrack& candidate) + { + float tpcInnerParam = candidate.tpcInnerParam(); + + if (tpcInnerParam < settingCutPinMinDe) { + return false; + } + + auto tpcNSigmaDe = computeNSigmaDe(candidate); + mQaRegistry.fill(HIST("h2NsigmaDeTPC_preselection"), candidate.sign() * candidate.pt(), tpcNSigmaDe); + mQaRegistry.fill(HIST("h2NsigmaDeTPC_preselecComp"), candidate.sign() * candidate.pt(), candidate.tpcNSigmaDe()); + if (candidate.hasTOF() && candidate.tpcInnerParam() > settingCutPinMinTOFITSDe) { + auto tofNSigmaDe = candidate.tofNSigmaDe(); + if (std::abs(tpcNSigmaDe) > settingCutNsigmaTPCDe) { + return false; + } + if (std::sqrt(tofNSigmaDe * tofNSigmaDe + tpcNSigmaDe * tpcNSigmaDe) > settingCutNsigmaTOFTPCDe) { + return false; + } + o2::aod::ITSResponse mResponseITS; + auto itsnSigmaDe = mResponseITS.nSigmaITS(candidate.itsClusterSizes(), candidate.p(), candidate.eta()); + + mQaRegistry.fill(HIST("h2NSigmaDeITS_preselection"), candidate.sign() * candidate.pt(), itsnSigmaDe); + if (itsnSigmaDe < settingCutNsigmaITSDe) { + return false; + } + mQaRegistry.fill(HIST("h2dEdxDecandidates"), candidate.sign() * tpcInnerParam, candidate.tpcSignal()); + mQaRegistry.fill(HIST("h2NsigmaDeTPC"), candidate.sign() * candidate.pt(), tpcNSigmaDe); + mQaRegistry.fill(HIST("h2NSigmaDeITS"), candidate.sign() * candidate.pt(), itsnSigmaDe); + return true; + } else if (std::abs(tpcNSigmaDe) < settingCutNsigmaTPCDe) { + mQaRegistry.fill(HIST("h2NsigmaDeTPC"), candidate.sign() * candidate.pt(), tpcNSigmaDe); + return true; + } + return false; + } + + // ================================================================================================================== + + template + bool fillCandidateInfo(const Ttrack& trackDe, const Ttrack& trackPi, const CollBracket& collBracket, const Tcollisions& collisions, PiDecandidate& piDecand, const Ttracks& /*trackTable*/, bool isMixedEvent) + { + const int numCoordinates = 3; + if (!isMixedEvent) { + auto trackCovDe = getTrackParCov(trackDe); + auto trackCovPi = getTrackParCov(trackPi); + int nCand = 0; + try { + nCand = mFitter.process(trackCovDe, trackCovPi); + } catch (...) { + LOG(error) << "Exception caught in DCA fitter process call!"; + return false; + } + if (nCand == 0) { + return false; + } + + // associate collision id as the one that minimises the distance between the vertex and the PCAs of the daughters + double distanceMin = -1; + unsigned int collIdxMin = 0; + + for (int collIdx = collBracket.getMin(); collIdx <= collBracket.getMax(); collIdx++) { + auto collision = collisions.rawIteratorAt(collIdx); + std::array collVtx = {collision.posX(), collision.posY(), collision.posZ()}; + const auto& pca = mFitter.getPCACandidate(); + float distance = 0; + for (int i = 0; i < numCoordinates; i++) { + distance += (pca[i] - collVtx[i]) * (pca[i] - collVtx[i]); + } + if (distanceMin < 0 || distance < distanceMin) { + distanceMin = distance; + collIdxMin = collIdx; + } + } + + if (!mGoodCollisions[collIdxMin]) { + return false; + } + piDecand.collisionID = collIdxMin; + } else { + piDecand.collisionID = collBracket.getMin(); + } + + piDecand.momDe = std::array{trackDe.px(), trackDe.py(), trackDe.pz()}; + for (int i = 0; i < numCoordinates; i++) + piDecand.momPi = std::array{trackPi.px(), trackPi.py(), trackPi.pz()}; + float invMass = 0; + invMass = RecoDecay::m(std::array{piDecand.momDe, piDecand.momPi}, std::array{o2::constants::physics::MassDeuteron, o2::constants::physics::MassPiPlus}); + if (settingCutInvMass > 0 && invMass > settingCutInvMass) { + return false; + } + float ptDePi = std::hypot(piDecand.momDe[0] + piDecand.momPi[0], piDecand.momDe[1] + piDecand.momPi[1]); + if (ptDePi < settingCutPtMinDePi) { + return false; + } + + piDecand.signDe = trackDe.sign(); + piDecand.signPi = trackPi.sign(); + + piDecand.dcaxyDe = trackDe.dcaXY(); + piDecand.dcaxyPi = trackPi.dcaXY(); + + piDecand.dcazDe = trackDe.dcaZ(); + piDecand.dcazPi = trackPi.dcaZ(); + + piDecand.tpcSignalDe = trackDe.tpcSignal(); + piDecand.momDeTPC = trackDe.tpcInnerParam(); + piDecand.tpcSignalPi = trackPi.tpcSignal(); + piDecand.momPiTPC = trackPi.tpcInnerParam(); + + piDecand.nTPCClustersDe = trackDe.tpcNClsFound(); + piDecand.nSigmaDe = computeNSigmaDe(trackDe); + piDecand.nSigmaPi = trackPi.tpcNSigmaPi(); + + piDecand.chi2TPCDe = trackDe.tpcChi2NCl(); + piDecand.chi2TPCPi = trackPi.tpcChi2NCl(); + + piDecand.pidTrkDe = trackDe.pidForTracking(); + piDecand.pidTrkPi = trackPi.pidForTracking(); + + piDecand.itsClSizeDe = trackDe.itsClusterSizes(); + piDecand.itsClSizePi = trackPi.itsClusterSizes(); + + piDecand.nClsItsDe = trackDe.itsNCls(); + piDecand.nClsItsPi = trackPi.itsNCls(); + + piDecand.sharedClustersDe = trackDe.tpcNClsShared(); + piDecand.sharedClustersPi = trackPi.tpcNClsShared(); + + piDecand.isBkgUS = trackDe.sign() * trackPi.sign() < 0; + piDecand.isBkgEM = isMixedEvent; + + piDecand.invMass = invMass; + + piDecand.trackIDDe = trackDe.globalIndex(); + piDecand.trackIDPi = trackPi.globalIndex(); + + if (trackDe.hasTOF()) { + float beta = o2::pid::tof::Beta::GetBeta(trackDe); + beta = std::min(1.f - 1.e-6f, std::max(1.e-4f, beta)); /// sometimes beta > 1 or < 0, to be checked + float tpcInnerParamDe = trackDe.tpcInnerParam(); + piDecand.massTOFDe = tpcInnerParamDe * std::sqrt(1.f / (beta * beta) - 1.f); + } + if (trackPi.hasTOF()) { + float beta = o2::pid::tof::Beta::GetBeta(trackPi); + beta = std::min(1.f - 1.e-6f, std::max(1.e-4f, beta)); /// sometimes beta > 1 or < 0, to be checked + piDecand.massTOFPi = trackPi.tpcInnerParam() * std::sqrt(1.f / (beta * beta) - 1.f); + } + + return true; + } + + template + void pairTracksSameEvent(const Ttrack& tracks) + { + // LOG(info) << "Number of tracks: " << tracks.size(); + for (const auto& track0 : tracks) { + + mQaRegistry.fill(HIST("hTrackSel"), Selections::kNoCuts); + + if (!selectTrack(track0)) { + continue; + } + mQaRegistry.fill(HIST("hTrackSel"), Selections::kTrackCuts); + + if (!selectionPIDDe(track0)) { + continue; + } + mQaRegistry.fill(HIST("hTrackSel"), Selections::kPID); + + for (const auto& track1 : tracks) { + if (track0 == track1) { + continue; + } + + if (!settingSaveUSandLS) { + if (!settingEnableBkgUS && (track0.sign() * track1.sign() < 0)) { + continue; + } + if (settingEnableBkgUS && (track0.sign() * track1.sign() > 0)) { + continue; + } + } + + if (!selectTrack(track1) || !selectionPIDPion(track1)) { + continue; + } + + SVCand trackPair; + trackPair.tr0Idx = track0.globalIndex(); + trackPair.tr1Idx = track1.globalIndex(); + const int collIdx = track0.collisionId(); + CollBracket collBracket{collIdx, collIdx}; + trackPair.collBracket = collBracket; + mTrackPairs.push_back(trackPair); + } + } + } + + template + void pairTracksEventMixing(T& DeCands, T& pionCands) + { + for (const auto& DeCand : DeCands) { + if (!selectTrack(DeCand) || !selectionPIDDe(DeCand)) { + continue; + } + for (const auto& pionCand : pionCands) { + if (!selectTrack(pionCand) || !selectionPIDPion(pionCand)) { + continue; + } + + SVCand trackPair; + trackPair.tr0Idx = DeCand.globalIndex(); + trackPair.tr1Idx = pionCand.globalIndex(); + const int collIdx = DeCand.collisionId(); + CollBracket collBracket{collIdx, collIdx}; + trackPair.collBracket = collBracket; + mTrackPairs.push_back(trackPair); + } + } + } + + template + void fillTable(const PiDecandidate& piDecand, const Tcoll& collision) + { + mOutputDataTable( + piDecand.recoPtDe(), + piDecand.recoEtaDe(), + piDecand.recoPhiDe(), + piDecand.recoPtPi(), + piDecand.recoEtaPi(), + piDecand.recoPhiPi(), + piDecand.dcaxyDe, + piDecand.dcazDe, + piDecand.dcaxyPi, + piDecand.dcazPi, + piDecand.tpcSignalDe, + piDecand.momDeTPC, + piDecand.tpcSignalPi, + piDecand.momPiTPC, + piDecand.nTPCClustersDe, + piDecand.nSigmaDe, + piDecand.nSigmaPi, + piDecand.chi2TPCDe, + piDecand.chi2TPCPi, + piDecand.massTOFDe, + piDecand.massTOFPi, + piDecand.pidTrkDe, + piDecand.pidTrkPi, + piDecand.itsClSizeDe, + piDecand.itsClSizePi, + piDecand.sharedClustersDe, + piDecand.sharedClustersPi, + piDecand.isBkgUS, + piDecand.isBkgEM); + if (settingFillMultiplicity) { + mOutputMultiplicityTable( + collision.globalIndex(), + collision.posZ(), + collision.numContrib(), + collision.centFT0C(), + collision.multFT0C()); + } + } + + void fillHistograms(const PiDecandidate& piDecand) + { + mQaRegistry.fill(HIST("hDePt"), piDecand.recoPtDe()); + mQaRegistry.fill(HIST("hPiPt"), piDecand.recoPtPi()); + mQaRegistry.fill(HIST("hDePitInvMass"), piDecand.invMass); + mQaRegistry.fill(HIST("hdcaxyDe"), piDecand.dcaxyDe); + mQaRegistry.fill(HIST("hdcazDe"), piDecand.dcazDe); + mQaRegistry.fill(HIST("hNClsDeITS"), piDecand.nClsItsDe); + mQaRegistry.fill(HIST("hNClsPiITS"), piDecand.nClsItsPi); + } + + // ================================================================================================================== + + template + void fillPairs(const Tcollisions& collisions, const Ttracks& tracks, const bool isMixedEvent) + { + for (const auto& trackPair : mTrackPairs) { + + auto deTrack = tracks.rawIteratorAt(trackPair.tr0Idx); + auto piTrack = tracks.rawIteratorAt(trackPair.tr1Idx); + auto collBracket = trackPair.collBracket; + + PiDecandidate piDecand; + if (!fillCandidateInfo(deTrack, piTrack, collBracket, collisions, piDecand, tracks, isMixedEvent)) { + continue; + } + fillHistograms(piDecand); + auto collision = collisions.rawIteratorAt(piDecand.collisionID); + fillTable(piDecand, collision); + } + } + + // ================================================================================================================== + + void processSameEvent(const CollisionsFull& collisions, const TrackCandidates& tracks, const aod::BCsWithTimestamps& bcs) + { + mGoodCollisions.clear(); + mGoodCollisions.resize(collisions.size(), false); + + for (const auto& collision : collisions) { + + mTrackPairs.clear(); + + if (!selectCollision(collision, bcs)) { + continue; + } + + mGoodCollisions[collision.globalIndex()] = true; + const uint64_t collIdx = collision.globalIndex(); + auto trackTableThisCollision = tracks.sliceBy(mPerCol, collIdx); + trackTableThisCollision.bindExternalIndices(&tracks); + + pairTracksSameEvent(trackTableThisCollision); + + if (mTrackPairs.size() == 0) { + continue; + } + + fillPairs(collisions, tracks, /*isMixedEvent*/ false); + } + } + PROCESS_SWITCH(PiDeuteronFemto, processSameEvent, "Process Same event", false); + + void processMixedEvent(const CollisionsFull& collisions, const TrackCandidates& tracks) + { + LOG(debug) << "Processing mixed event"; + mTrackPairs.clear(); + + for (const auto& [c1, tracks1, c2, tracks2] : mPair) { + if (!c1.sel8() || !c2.sel8()) { + continue; + } + + mQaRegistry.fill(HIST("hNcontributor"), c1.numContrib()); + mQaRegistry.fill(HIST("hVtxZ"), c1.posZ()); + + pairTracksEventMixing(tracks1, tracks2); + pairTracksEventMixing(tracks2, tracks1); + } + + fillPairs(collisions, tracks, /*isMixedEvent*/ true); + } + PROCESS_SWITCH(PiDeuteronFemto, processMixedEvent, "Process Mixed event", false); +}; + +WorkflowSpec defineDataProcessing(const ConfigContext& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc)}; +} From b2b9119de8b45136f2b8469241b640cf11bd278a Mon Sep 17 00:00:00 2001 From: omvazque Date: Wed, 14 May 2025 08:27:51 -0500 Subject: [PATCH 1269/1650] [PWGLF] Reset to version from 20250507 (#11186) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 340 +++++++++---------- 1 file changed, 167 insertions(+), 173 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index acd39942c62..3b9f1de7664 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -96,7 +96,6 @@ struct UccZdc { ConfigurableAxis binsCent{"binsCent", {VARIABLE_WIDTH, 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.}, "T0C binning"}; // Configurables Event Selection - Configurable applyWeights{"applyWeights", false, "apply particle weights?"}; Configurable isNoCollInTimeRangeStrict{"isNoCollInTimeRangeStrict", true, "isNoCollInTimeRangeStrict?"}; Configurable isNoCollInTimeRangeStandard{"isNoCollInTimeRangeStandard", false, "isNoCollInTimeRangeStandard?"}; Configurable isNoCollInRofStrict{"isNoCollInRofStrict", true, "isNoCollInRofStrict?"}; @@ -110,12 +109,12 @@ struct UccZdc { Configurable nSigmaNchCut{"nSigmaNchCut", 1., "nSigma Nch selection"}; Configurable minNchSel{"minNchSel", 5., "min Nch Selection"}; - Configurable znBasedCut{"znBasedCut", 100, "ZN-based cut"}; + // Configurable znBasedCut{"znBasedCut", 100, "ZN-based cut"}; Configurable zemCut{"zemCut", 1000., "ZEM cut"}; Configurable tdcCut{"tdcCut", 1., "TDC cut"}; Configurable minOccCut{"minOccCut", 0, "min Occu cut"}; Configurable maxOccCut{"maxOccCut", 500, "max Occu cut"}; - Configurable minITSnCls{"minITSnCls", 5, "min ITSnCls"}; + // Configurable minITSnCls{"minITSnCls", 5, "min ITSnCls"}; Configurable itsRequirement{"itsRequirement", TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSall7Layers, "0: Global Tracks, 2: Hits in the 7 ITS layers"}; Configurable requireITS{"requireITS", true, "Additional cut on the ITS requirement"}; @@ -166,13 +165,13 @@ struct UccZdc { Service ccdb; Configurable paTH{"paTH", "Users/o/omvazque/TrackingEfficiency", "base path to the ccdb object"}; - Configurable paTHmeanNch{"paTHmeanNch", "Users/o/omvazque/FitMeanNch", "base path to the ccdb object"}; - Configurable paTHsigmaNch{"paTHsigmaNch", "Users/o/omvazque/FitSigmaNch", "base path to the ccdb object"}; + Configurable paTHmeanNch{"paTHmeanNch", "Users/o/omvazque/FitMeanNch_9May2025", "base path to the ccdb object"}; + Configurable paTHsigmaNch{"paTHsigmaNch", "Users/o/omvazque/FitSigmaNch_9May2025", "base path to the ccdb object"}; // the efficiency has been previously stored in the CCDB as TH1F histogram TH1F* efficiency = nullptr; - TF1* fitSigmaNch = nullptr; - TF1* fitMeanNch = nullptr; + TF1* fSigmaNch = nullptr; + TF1* fMeanNch = nullptr; void init(InitContext const&) { @@ -242,10 +241,7 @@ struct UccZdc { registry.add("ZposVsEta", "", kTProfile, {axisZpos}); registry.add("ZN", ";ZNA+ZNC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); registry.add("EtaVsPhi", ";#eta;#varphi", kTH2F, {{{axisEta}, {100, -0.1 * PI, +2.1 * PI}}}); - registry.add("sigma1Pt", ";;#sigma(p_{T})/p_{T};", kTProfile, {axisPt}); registry.add("dcaXYvspT", ";DCA_{xy} (cm);;", kTH2F, {{{50, -1., 1.}, {axisPt}}}); - registry.add("RejectedEvtsVsFT0M", ";T0A+T0C (#times 1/100, -3.3 < #eta < -2.1 and 3.5 < #eta < 4.9);Entries;", kTH1F, {{nBinsAmpFT0, 0., 3000.}}); - registry.add("RejectedEvtsVsNch", ";#it{N}_{ch} (|#eta|<0.8);Entries;", kTH1F, {{300, 0., 3000.}}); registry.add("Nch", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);", kTH1F, {{nBinsNch, minNch, maxNch}}); registry.add("NchVsPt", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);;", kTH2F, {{{nBinsNch, minNch, maxNch}, {axisPt}}}); @@ -254,6 +250,9 @@ struct UccZdc { registry.add("NchVsTwoParCorrVsZN", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);ZNA+ZNC;#LT[#it{p}_{T}^{(2)}]#GT", kTProfile2D, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, -0.5, maxZN}}}); registry.add("NchVsThreeParCorrVsZN", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);ZNA+ZNC;#LT[#it{p}_{T}^{(3)}]#GT", kTProfile2D, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, -0.5, maxZN}}}); registry.add("NchVsFourParCorrVsZN", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);ZNA+ZNC;#LT[#it{p}_{T}^{(4)}]#GT", kTProfile2D, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, -0.5, maxZN}}}); + + registry.add("RejectedEvtsVsFT0M", ";T0A+T0C (#times 1/100, -3.3 < #eta < -2.1 and 3.5 < #eta < 4.9);Entries;", kTH1F, {{nBinsAmpFT0, 0., 3000.}}); + registry.add("RejectedEvtsVsNch", ";#it{N}_{ch} (|#eta|<0.8);Entries;", kTH1F, {{nBinsNch, minNch, maxNch}}); } // MC Histograms @@ -309,16 +308,14 @@ struct UccZdc { if (doprocessQA) { registry.add("T0Ccent", ";;Entries", kTH1F, {axisCent}); registry.add("EtaVsPhi", ";#eta;#varphi", kTH2F, {{{axisEta}, {100, -0.1 * PI, +2.1 * PI}}}); - registry.add("dcaXYvspTOpen", ";DCA_{xy} (cm);;", kTH2F, {{{150, -1.5, 1.5}, {axisPt}}}); - registry.add("dcaXYvspT", ";DCA_{xy} (cm);;", kTH2F, {{{150, -1.5, 1.5}, {axisPt}}}); + registry.add("dcaXYvspTOpen", ";DCA_{xy} (cm);;", kTH2F, {{{150, -3., 3.}, {axisPt}}}); + registry.add("dcaXYvspT", ";DCA_{xy} (cm);;", kTH2F, {{{150, -3., 3.}, {axisPt}}}); registry.add("nClustersITS", ";;;", kTProfile, {{axisPt}}); registry.add("nClustersTPC", ";;;", kTProfile, {{axisPt}}); registry.add("ZNVsFT0A", ";T0A (#times 1/100);ZNA+ZNC;", kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsZDC, -0.5, maxZN}}}); registry.add("ZNVsFT0C", ";T0C (#times 1/100);ZNA+ZNC;", kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsZDC, -0.5, maxZN}}}); registry.add("ZNVsFT0M", ";T0A+T0C (#times 1/100);ZNA+ZNC;", kTH2F, {{{nBinsAmpFT0, 0., 3000.}, {nBinsZDC, -0.5, maxZN}}}); - registry.add("RejectedEvtsVsFT0M", ";T0A+T0C (#times 1/100, -3.3 < #eta < -2.1 and 3.5 < #eta < 4.9);Entries;", kTH1F, {{nBinsAmpFT0, 0., 3000.}}); - registry.add("RejectedEvtsVsNch", ";#it{N}_{ch} (|#eta|<0.8);Entries;", kTH1F, {{nBinsNch, minNch, maxNch}}); registry.add("ZN", ";ZNA+ZNC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); registry.add("ZNA", ";ZNA;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); @@ -329,10 +326,6 @@ struct UccZdc { registry.add("ZPAVsZPC", ";ZPC;ZPA;", kTH2F, {{{100, -0.5, maxZP}, {100, -0.5, maxZP}}}); registry.add("ZNAVsZPA", ";ZPA;ZNA;", kTH2F, {{{20, -0.5, maxZP}, {30, -0.5, maxZN}}}); registry.add("ZNCVsZPC", ";ZPC;ZNC;", kTH2F, {{{20, -0.5, maxZP}, {30, -0.5, maxZN}}}); - registry.add("ZNCcvsZNCsum", ";ZNC common;ZNC sum towers;", kTH2F, {{{30, -0.5, maxZN}, {30, -0.5, maxZN}}}); - registry.add("ZNAcvsZNAsum", ";ZNA common;ZNA sum towers;", kTH2F, {{{30, -0.5, maxZN}, {30, -0.5, maxZN}}}); - registry.add("ZPCcvsZPCsum", ";ZPC common;ZPC sum towers;", kTH2F, {{{30, -0.5, maxZP}, {30, -0.5, maxZP}}}); - registry.add("ZPAcvsZPAsum", ";ZPA common;ZPA sum towers;", kTH2F, {{{30, -0.5, maxZP}, {30, -0.5, maxZP}}}); registry.add("ZNVsZEM", ";ZEM;ZNA+ZNC;", kTH2F, {{{60, -0.5, maxZEM}, {60, -0.5, maxZN}}}); registry.add("ZNCVstdc", ";t_{ZNC};ZNC;", kTH2F, {{{30, -15., 15.}, {nBinsZDC, -0.5, maxZN}}}); registry.add("ZNAVstdc", ";t_{ZNA};ZNA;", kTH2F, {{{30, -15., 15.}, {30, -0.5, maxZN}}}); @@ -342,6 +335,9 @@ struct UccZdc { registry.add("ZEM2Vstdc", ";t_{ZEM2};ZEM2;", kTH2F, {{{30, -15., 15.}, {30, -0.5, 2000.5}}}); registry.add("debunch", ";t_{ZDC}-t_{ZDA};t_{ZDC}+t_{ZDA}", kTH2F, {{{nBinsTDC, minTdc, maxTdc}, {nBinsTDC, minTdc, maxTdc}}}); + registry.add("RejectedEvtsVsFT0M", ";T0A+T0C (#times 1/100, -3.3 < #eta < -2.1 and 3.5 < #eta < 4.9);Entries;", kTH1F, {{nBinsAmpFT0, 0., 3000.}}); + registry.add("RejectedEvtsVsNch", ";#it{N}_{ch} (|#eta|<0.8);Entries;", kTH1F, {{nBinsNch, minNch, maxNch}}); + registry.add("NchVsFT0C", ";T0C (#times 1/100, -3.3 < #eta < -2.1);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFT0, 0., 950.}, {nBinsNch, minNch, maxNch}}}); registry.add("NchVsFT0M", ";T0A+T0C (#times 1/100, -3.3 < #eta < -2.1 and 3.5 < #eta < 4.9);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFT0, 0., 3000.}, {nBinsNch, minNch, maxNch}}}); registry.add("NchVsFT0A", ";T0A (#times 1/100, 3.5 < #eta < 4.9);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsNch, minNch, maxNch}}}); @@ -454,7 +450,7 @@ struct UccZdc { void processQA(o2::aod::ColEvSels::iterator const& collision, o2::aod::BCsRun3 const& /**/, aod::Zdcs const& /**/, aod::FV0As const& /**/, aod::FT0s const& /**/, TheFilteredTracks const& tracks) { - + const double ePerNucleon{2.68}; // LOG(info) << " Collisions size: " << collisions.size() << " Table's size: " << collisions.tableSize() << "\n"; const auto& foundBC = collision.foundBC_as(); // LOG(info) << "Run number: " << foundBC.runNumber() << "\n"; @@ -462,18 +458,6 @@ struct UccZdc { return; } - auto fitMeanNch = ccdb->getForTimeStamp(paTHmeanNch.value, foundBC.timestamp()); - if (!fitMeanNch) { - LOGF(fatal, "fitMeanNch object not found!"); - return; - } - - auto fitSigmaNch = ccdb->getForTimeStamp(paTHsigmaNch.value, foundBC.timestamp()); - if (!fitSigmaNch) { - LOGF(fatal, "fitSigmaNch object not found!"); - return; - } - // has ZDC? if (!foundBC.has_zdc()) { return; @@ -492,6 +476,8 @@ struct UccZdc { } else { return; } + const double normT0M{(aT0A + aT0C) / 100.}; + registry.fill(HIST("hEventCounter"), EvCutLabel::TZero); if (foundBC.has_fv0a()) { @@ -529,33 +515,36 @@ struct UccZdc { registry.fill(HIST("hEventCounter"), EvCutLabel::Zem); } + const auto& fMeanNch = ccdb->getForTimeStamp(paTHmeanNch.value, foundBC.timestamp()); + const auto& fSigmaNch = ccdb->getForTimeStamp(paTHsigmaNch.value, foundBC.timestamp()); + if (!fMeanNch) { + LOGF(fatal, "fMeanNch object not found!"); + } + if (!fSigmaNch) { + LOGF(fatal, "fSigmaNch object not found!"); + } + float znA{zdc.amplitudeZNA()}; float znC{zdc.amplitudeZNC()}; float zpA{zdc.amplitudeZPA()}; float zpC{zdc.amplitudeZPC()}; - znA /= 2.68; - znC /= 2.68; - zpA /= 2.68; - zpC /= 2.68; + znA /= ePerNucleon; + znC /= ePerNucleon; + zpA /= ePerNucleon; + zpC /= ePerNucleon; float tZEM1{zdc.timeZEM1()}; float tZEM2{zdc.timeZEM2()}; float sumZNs{znA + znC}; - float sumZNC = (zdc.energySectorZNC())[0] + (zdc.energySectorZNC())[1] + (zdc.energySectorZNC())[2] + (zdc.energySectorZNC())[3]; - float sumZNA = (zdc.energySectorZNA())[0] + (zdc.energySectorZNA())[1] + (zdc.energySectorZNA())[2] + (zdc.energySectorZNA())[3]; - float sumZPC = (zdc.energySectorZPC())[0] + (zdc.energySectorZPC())[1] + (zdc.energySectorZPC())[2] + (zdc.energySectorZPC())[3]; - float sumZPA = (zdc.energySectorZPA())[0] + (zdc.energySectorZPA())[1] + (zdc.energySectorZPA())[2] + (zdc.energySectorZPA())[3]; - int itsTracks = 0, glbTracks = 0; float et = 0., meanpt = 0.; for (const auto& track : tracks) { - if (track.hasITS() && track.itsNCls() >= minITSnCls) { + if (track.hasITS()) { itsTracks++; } // Track Selection if (myTrackSel.IsSelected(track)) { - registry.fill(HIST("dcaXYvspTOpen"), track.dcaXY(), track.pt()); if (passesDCAxyCut(track)) { glbTracks++; meanpt += track.pt(); @@ -565,27 +554,22 @@ struct UccZdc { registry.fill(HIST("nClustersITS"), track.pt(), track.itsNCls()); registry.fill(HIST("nClustersTPC"), track.pt(), track.tpcNClsFound()); } + registry.fill(HIST("dcaXYvspTOpen"), track.dcaXY(), track.pt()); } } - const double meanNch{fitMeanNch->Eval((aT0A + aT0C) / 100.)}; - const double sigmaNch{fitSigmaNch->Eval((aT0A + aT0C) / 100.)}; - const double diffMeanNch{std::abs(meanNch - glbTracks)}; + const double meanNch{fMeanNch->Eval(normT0M)}; + const double sigmaNch{fSigmaNch->Eval(normT0M)}; const double nSigmaSelection{nSigmaNchCut * sigmaNch}; - if (!(diffMeanNch < nSigmaSelection)) { - registry.fill(HIST("RejectedEvtsVsFT0M"), (aT0A + aT0C) / 100.); + const double diffMeanNch{meanNch - glbTracks}; + if (!(std::abs(diffMeanNch) < nSigmaSelection)) { + registry.fill(HIST("RejectedEvtsVsFT0M"), normT0M); registry.fill(HIST("RejectedEvtsVsNch"), glbTracks); return; } registry.fill(HIST("zPos"), collision.posZ()); registry.fill(HIST("T0Ccent"), collision.centFT0C()); - - registry.fill(HIST("ZNCcvsZNCsum"), sumZNC / 2.68, zdc.energyCommonZNC() / 2.68); - registry.fill(HIST("ZNAcvsZNAsum"), sumZNA / 2.68, zdc.energyCommonZNA() / 2.68); - registry.fill(HIST("ZPCcvsZPCsum"), sumZPC / 2.68, zdc.energyCommonZPC() / 2.68); - registry.fill(HIST("ZPAcvsZPAsum"), sumZPA / 2.68, zdc.energyCommonZPA() / 2.68); - registry.fill(HIST("ZNA"), znA); registry.fill(HIST("ZNC"), znC); registry.fill(HIST("ZPA"), zpA); @@ -603,16 +587,13 @@ struct UccZdc { registry.fill(HIST("ZEM1Vstdc"), tZEM1, aZEM1); registry.fill(HIST("ZEM2Vstdc"), tZEM2, aZEM2); registry.fill(HIST("debunch"), tZDCdif, tZDCsum); - registry.fill(HIST("ZNVsFT0A"), aT0A / 100., sumZNs); registry.fill(HIST("ZNVsFT0C"), aT0C / 100., sumZNs); - registry.fill(HIST("ZNVsFT0M"), (aT0A + aT0C) / 100., sumZNs); - + registry.fill(HIST("ZNVsFT0M"), normT0M, sumZNs); registry.fill(HIST("NchVsFV0A"), aV0A / 100., glbTracks); registry.fill(HIST("NchVsFT0A"), aT0A / 100., glbTracks); registry.fill(HIST("NchVsFT0C"), aT0C / 100., glbTracks); - registry.fill(HIST("NchVsFT0M"), (aT0A + aT0C) / 100., glbTracks); - + registry.fill(HIST("NchVsFT0M"), normT0M, glbTracks); registry.fill(HIST("Nch"), glbTracks); registry.fill(HIST("NchVsEt"), et, glbTracks); registry.fill(HIST("NchVsNPV"), collision.multNTracksPVeta1(), glbTracks); @@ -629,6 +610,7 @@ struct UccZdc { void processZdcCollAss(o2::aod::ColEvSels::iterator const& collision, o2::aod::BCsRun3 const& /*bcs*/, aod::Zdcs const& /*zdcs*/, aod::FV0As const& /*fv0as*/, aod::FT0s const& /*ft0s*/, TheFilteredTracks const& tracks) { + const double ePerNucleon{2.68}; if (!isEventSelected(collision)) { return; @@ -637,22 +619,10 @@ struct UccZdc { const auto& foundBC = collision.foundBC_as(); // LOGF(info, "Getting object %s for run number %i from timestamp=%llu", paTH.value.data(), foundBC.runNumber(), foundBC.timestamp()); - auto efficiency = ccdb->getForTimeStamp(paTH.value, foundBC.timestamp()); + const auto& efficiency = ccdb->getForTimeStamp(paTH.value, foundBC.timestamp()); + // auto efficiency = ccdb->getForRun(paTH.value, foundBC.runNumber()); if (!efficiency) { LOGF(fatal, "Efficiency object not found!"); - return; - } - - auto fitMeanNch = ccdb->getForTimeStamp(paTHmeanNch.value, foundBC.timestamp()); - if (!fitMeanNch) { - LOGF(fatal, "fitMeanNch object not found!"); - return; - } - - auto fitSigmaNch = ccdb->getForTimeStamp(paTHsigmaNch.value, foundBC.timestamp()); - if (!fitSigmaNch) { - LOGF(fatal, "fitSigmaNch object not found!"); - return; } // has ZDC? @@ -661,20 +631,20 @@ struct UccZdc { } registry.fill(HIST("hEventCounter"), EvCutLabel::Zdc); - // has T0? - float aT0A = 0., aT0C = 0.; - if (foundBC.has_ft0()) { - for (const auto& amplitude : foundBC.ft0().amplitudeA()) { - aT0A += amplitude; - } - for (const auto& amplitude : foundBC.ft0().amplitudeC()) { - aT0C += amplitude; - } - } else { + if (!foundBC.has_ft0()) { return; } registry.fill(HIST("hEventCounter"), EvCutLabel::TZero); + float aT0A = 0., aT0C = 0.; + for (const auto& amplitude : foundBC.ft0().amplitudeA()) { + aT0A += amplitude; + } + for (const auto& amplitude : foundBC.ft0().amplitudeC()) { + aT0C += amplitude; + } + const double normT0M{(aT0A + aT0C) / 100.}; + float znA{foundBC.zdc().amplitudeZNA()}; float znC{foundBC.zdc().amplitudeZNC()}; float aZEM1{foundBC.zdc().amplitudeZEM1()}; @@ -685,8 +655,8 @@ struct UccZdc { float tZPC{foundBC.zdc().timeZPC()}; float tZDCdif{tZNC + tZPC - tZNA - tZPA}; float tZDCsum{tZNC + tZPC + tZNA + tZPA}; - znA /= 2.68; - znC /= 2.68; + znA /= ePerNucleon; + znC /= ePerNucleon; float sumZNs{znA + znC}; float sumZEMs{aZEM1 + aZEM2}; @@ -706,12 +676,19 @@ struct UccZdc { registry.fill(HIST("hEventCounter"), EvCutLabel::Zem); } - registry.fill(HIST("zPos"), collision.posZ()); - registry.fill(HIST("T0Ccent"), collision.centFT0C()); + // Nch-based selection + const auto& fMeanNch = ccdb->getForTimeStamp(paTHmeanNch.value, foundBC.timestamp()); + const auto& fSigmaNch = ccdb->getForTimeStamp(paTHsigmaNch.value, foundBC.timestamp()); + if (!fMeanNch) { + LOGF(fatal, "fMeanNch object not found!"); + } + if (!fSigmaNch) { + LOGF(fatal, "fSigmaNch object not found!"); + } - int glbTracks{0}; std::vector pTs; std::vector wIs; + int glbTracks{0}; // Calculates the event weight, W_k for (const auto& track : tracks) { // Track Selection @@ -719,7 +696,6 @@ struct UccZdc { if (passesDCAxyCut(track)) { registry.fill(HIST("ZposVsEta"), collision.posZ(), track.eta()); registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); - registry.fill(HIST("sigma1Pt"), track.pt(), track.sigma1Pt()); registry.fill(HIST("dcaXYvspT"), track.dcaXY(), track.pt()); glbTracks++; @@ -727,22 +703,19 @@ struct UccZdc { double weight{efficiency->GetBinContent(efficiency->FindBin(pt))}; if (weight > 0.) { pTs.emplace_back(pt); - if (applyWeights) { - wIs.emplace_back(weight); - } else { - wIs.emplace_back(1.); - } + wIs.emplace_back(weight); } } } } - const double meanNch{fitMeanNch->Eval((aT0A + aT0C) / 100.)}; - const double sigmaNch{fitSigmaNch->Eval((aT0A + aT0C) / 100.)}; - const double diffMeanNch{std::abs(meanNch - glbTracks)}; + const double meanNch{fMeanNch->Eval(normT0M)}; + const double sigmaNch{fSigmaNch->Eval(normT0M)}; const double nSigmaSelection{nSigmaNchCut * sigmaNch}; - if (!(diffMeanNch < nSigmaSelection)) { - registry.fill(HIST("RejectedEvtsVsFT0M"), (aT0A + aT0C) / 100.); + const double diffMeanNch{meanNch - glbTracks}; + + if (!(std::abs(diffMeanNch) < nSigmaSelection)) { + registry.fill(HIST("RejectedEvtsVsFT0M"), normT0M); registry.fill(HIST("RejectedEvtsVsNch"), glbTracks); return; } @@ -751,7 +724,6 @@ struct UccZdc { p1 = p2 = p3 = p4 = w1 = w2 = w3 = w4 = 0.0; getPTpowers(pTs, wIs, p1, w1, p2, w2, p3, w3, p4, w4); const double nch{static_cast(pTs.size())}; - // To avoid calculating with zero particles if (nch < minNchSel) { return; } @@ -784,12 +756,10 @@ struct UccZdc { double numFourParCorr{std::pow(p1, 4.) - 6. * p2 * std::pow(p1, 2.) + 3. * std::pow(p2, 2.) + 8 * p3 * p1 - 6. * p4}; double fourParCorr{numFourParCorr / denFourParCorr}; - if (sumZNs > znBasedCut) { - return; - } - registry.fill(HIST("Nch"), w1); registry.fill(HIST("ZN"), sumZNs); + registry.fill(HIST("zPos"), collision.posZ()); + registry.fill(HIST("T0Ccent"), collision.centFT0C()); registry.fill(HIST("NchVsOneParCorr"), w1, oneParCorr, w1); registry.fill(HIST("NchVsOneParCorrVsZN"), w1, sumZNs, oneParCorr, w1); registry.fill(HIST("NchVsTwoParCorrVsZN"), w1, sumZNs, twoParCorr, denTwoParCorr); @@ -804,59 +774,49 @@ struct UccZdc { void processMCclosure(aod::McCollisions::iterator const& mccollision, soa::SmallGroups const& collisions, o2::aod::BCsRun3 const& /*bcs*/, aod::McParticles const& mcParticles, TheFilteredSimTracks const& simTracks) { - for (const auto& collision : collisions) { - - // To use run-by-run efficiency - const auto& foundBC = collision.foundBC_as(); - auto efficiency = ccdb->getForTimeStamp(paTH.value, foundBC.timestamp()); - if (!efficiency) { - LOGF(fatal, "Efficiency object not found!"); - continue; - } - - registry.fill(HIST("hEventCounterMC"), EvCutLabel::All); - - // Event selection - if (!isEventSelected(collision)) { - continue; - } - // MC collision? - if (!collision.has_mcCollision()) { - continue; - } - - if (std::fabs(mccollision.posZ()) > posZcut) { - continue; - } - registry.fill(HIST("hEventCounterMC"), EvCutLabel::VtxZ); - registry.fill(HIST("zPosMC"), mccollision.posZ()); + float rndNum = randPointer->Uniform(0.0, 1.0); + registry.fill(HIST("RandomNumber"), rndNum); + + // Half of the statistics for MC closure + if (rndNum >= zEro && rndNum < oneHalf) { + registry.fill(HIST("EvtsDivided"), 0); + //----- MC reconstructed -----// + for (const auto& collision : collisions) { + + // To use run-by-run efficiency + const auto& foundBC = collision.foundBC_as(); + auto efficiency = ccdb->getForTimeStamp(paTH.value, foundBC.timestamp()); + // auto efficiency = ccdb->getForRun(paTH.value, foundBC.runNumber()); + if (!efficiency) { + LOGF(fatal, "Efficiency object not found!"); + } - const auto& cent{collision.centFT0C()}; - registry.fill(HIST("nRecColvsCent"), collisions.size(), cent); - registry.fill(HIST("T0Ccent"), cent); - registry.fill(HIST("zPos"), collision.posZ()); + // Event selection + if (!isEventSelected(collision)) { + continue; + } + // MC collision? + if (!collision.has_mcCollision()) { + continue; + } - float rndNum = randPointer->Uniform(0.0, 1.0); - registry.fill(HIST("RandomNumber"), rndNum); - const auto& groupedTracks{simTracks.sliceBy(perCollision, collision.globalIndex())}; + registry.fill(HIST("T0Ccent"), collision.centFT0C()); + registry.fill(HIST("zPos"), collision.posZ()); - if (rndNum >= zEro && rndNum < oneHalf) { // Half of the statistics for MC closure + const auto& groupedTracks{simTracks.sliceBy(perCollision, collision.globalIndex())}; - registry.fill(HIST("EvtsDivided"), 0); std::vector pTs; std::vector wIs; // Calculates the event weight, W_k for (const auto& track : groupedTracks) { // Track Selection - if (myTrackSel.IsSelected(track) && passesDCAxyCut(track)) { - float pt{track.pt()}; - double weight{efficiency->GetBinContent(efficiency->FindBin(pt))}; - if (weight > 0.) { - pTs.emplace_back(pt); - if (applyWeights) { + if (myTrackSel.IsSelected(track)) { + if (passesDCAxyCut(track)) { + float pt{track.pt()}; + double weight{efficiency->GetBinContent(efficiency->FindBin(pt))}; + if (weight > 0.) { + pTs.emplace_back(pt); wIs.emplace_back(weight); - } else { - wIs.emplace_back(1.); } } } @@ -891,6 +851,13 @@ struct UccZdc { registry.fill(HIST("NchVsFourParCorr"), w1, fourParCorr, denFourParCorr); //--------------------------- Generated MC --------------------------- + registry.fill(HIST("hEventCounterMC"), EvCutLabel::All); + if (std::fabs(mccollision.posZ()) > posZcut) { + continue; + } + registry.fill(HIST("zPosMC"), mccollision.posZ()); + registry.fill(HIST("hEventCounterMC"), EvCutLabel::VtxZ); + std::vector pTsMC; std::vector wIsMC; // Calculates the event weight, W_k @@ -936,42 +903,69 @@ struct UccZdc { registry.fill(HIST("NchvsTwoParCorrGen"), nchMC, twoParCorrMC, denTwoParCorrMC); registry.fill(HIST("NchvsThreeParCorrGen"), nchMC, threeParCorrMC, denThreeParCorrMC); registry.fill(HIST("NchvsFourParCorrGen"), nchMC, fourParCorrMC, denFourParCorrMC); - } else { // Correction with the remaining half of the sample - registry.fill(HIST("EvtsDivided"), 1); - //----- MC reconstructed -----// + } + } else { // Correction with the remaining half of the sample + registry.fill(HIST("EvtsDivided"), 1); + //----- MC reconstructed -----// + for (const auto& collision : collisions) { + // Event selection + if (!isEventSelected(collision)) { + continue; + } + // MC collision? + if (!collision.has_mcCollision()) { + continue; + } + + registry.fill(HIST("zPos"), collision.posZ()); + registry.fill(HIST("nRecColvsCent"), collisions.size(), collision.centFT0C()); + + const auto& cent{collision.centFT0C()}; + registry.fill(HIST("T0Ccent"), cent); + + const auto& groupedTracks{simTracks.sliceBy(perCollision, collision.globalIndex())}; for (const auto& track : groupedTracks) { // Has MC particle? if (!track.has_mcParticle()) { continue; } // Track selection - if (myTrackSel.IsSelected(track) && passesDCAxyCut(track)) { - registry.fill(HIST("Pt_all_ch"), cent, track.pt()); - registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); - - const auto& particle{track.mcParticle()}; - if (!particle.isPhysicalPrimary()) { - continue; - } + if (myTrackSel.IsSelected(track)) { + if (passesDCAxyCut(track)) { + registry.fill(HIST("Pt_all_ch"), cent, track.pt()); + registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); + + const auto& particle{track.mcParticle()}; + if (!particle.isPhysicalPrimary()) { + continue; + } - registry.fill(HIST("Pt_ch"), cent, track.pt()); - if (particle.pdgCode() == PDG_t::kPiPlus || particle.pdgCode() == PDG_t::kPiMinus) { - registry.fill(HIST("Pt_pi"), cent, track.pt()); - } else if (particle.pdgCode() == PDG_t::kKPlus || particle.pdgCode() == PDG_t::kKMinus) { - registry.fill(HIST("Pt_ka"), cent, track.pt()); - } else if (particle.pdgCode() == PDG_t::kProton || particle.pdgCode() == PDG_t::kProtonBar) { - registry.fill(HIST("Pt_pr"), cent, track.pt()); - } else if (particle.pdgCode() == PDG_t::kSigmaPlus || particle.pdgCode() == PDG_t::kSigmaBarMinus) { - registry.fill(HIST("Pt_sigpos"), cent, track.pt()); - } else if (particle.pdgCode() == PDG_t::kSigmaMinus || particle.pdgCode() == PDG_t::kSigmaBarPlus) { - registry.fill(HIST("Pt_signeg"), cent, track.pt()); - } else { - registry.fill(HIST("Pt_re"), cent, track.pt()); + registry.fill(HIST("Pt_ch"), cent, track.pt()); + if (particle.pdgCode() == PDG_t::kPiPlus || particle.pdgCode() == PDG_t::kPiMinus) { + registry.fill(HIST("Pt_pi"), cent, track.pt()); + } else if (particle.pdgCode() == PDG_t::kKPlus || particle.pdgCode() == PDG_t::kKMinus) { + registry.fill(HIST("Pt_ka"), cent, track.pt()); + } else if (particle.pdgCode() == PDG_t::kProton || particle.pdgCode() == PDG_t::kProtonBar) { + registry.fill(HIST("Pt_pr"), cent, track.pt()); + } else if (particle.pdgCode() == PDG_t::kSigmaPlus || particle.pdgCode() == PDG_t::kSigmaBarMinus) { + registry.fill(HIST("Pt_sigpos"), cent, track.pt()); + } else if (particle.pdgCode() == PDG_t::kSigmaMinus || particle.pdgCode() == PDG_t::kSigmaBarPlus) { + registry.fill(HIST("Pt_signeg"), cent, track.pt()); + } else { + registry.fill(HIST("Pt_re"), cent, track.pt()); + } } } } - //----- MC generated -----// + // Generated MC + registry.fill(HIST("hEventCounterMC"), EvCutLabel::All); + if (std::fabs(mccollision.posZ()) > posZcut) { + continue; + } + registry.fill(HIST("zPosMC"), mccollision.posZ()); + registry.fill(HIST("hEventCounterMC"), EvCutLabel::VtxZ); + for (const auto& particle : mcParticles) { if (particle.eta() < minEta || particle.eta() > maxEta) { continue; @@ -998,8 +992,8 @@ struct UccZdc { registry.fill(HIST("PtMC_re"), cent, particle.pt()); } } - } // Half of statistics for corrections - } // Collisions loop + } + } // Half of statistics for corrections } PROCESS_SWITCH(UccZdc, processMCclosure, "Process MC closure", false); From f6f48a36dd7c8b92172bacf8f4dc14d3f4d3c0c3 Mon Sep 17 00:00:00 2001 From: Gyula Bencedi Date: Wed, 14 May 2025 16:58:24 +0200 Subject: [PATCH 1270/1650] [PWGLF] PWGMM:Mult Updated event and track selections (#11192) Co-authored-by: ALICE Action Bot --- PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx | 53 +++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx b/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx index 13ae6acbc83..2ae0df0c707 100644 --- a/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx +++ b/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx @@ -93,6 +93,7 @@ struct DndetaMFTPbPb { Configurable maxEta{"maxEta", -2.5f, ""}; Configurable minNclusterMft{"minNclusterMft", 5, "minimum number of MFT clusters"}; + Configurable maxChi2{"maxChi2", 10.f, ""}; Configurable minPt{"minPt", 0., "minimum pT of the MFT tracks"}; Configurable requireCA{ "requireCA", false, "Use Cellular Automaton track-finding algorithm"}; @@ -106,6 +107,10 @@ struct DndetaMFTPbPb { Configurable maxZvtxDiff{ "maxZvtxDiff", 1.0f, "max allowed Z vtx difference for reconstruced collisions (cm)"}; + Configurable requireNoCollInTimeRangeStrict{"requireNoCollInTimeRangeStrict", true, " requireNoCollInTimeRangeStrict"}; + Configurable requireNoCollInRofStrict{"requireNoCollInRofStrict", true, "requireNoCollInRofStrict"}; + Configurable requireNoCollInRofStandard{"requireNoCollInRofStandard", false, "requireNoCollInRofStandard"}; + Configurable requireNoHighMultCollInPrevRof{"requireNoHighMultCollInPrevRof", true, "requireNoHighMultCollInPrevRof"}; Configurable requireNoCollInTimeRangeStd{ "requireNoCollInTimeRangeStd", false, "reject collisions corrupted by the cannibalism, with other collisions " @@ -215,7 +220,7 @@ struct DndetaMFTPbPb { } auto hev = registry.add("hEvtSel", "hEvtSel", HistType::kTH1F, - {{12, -0.5f, +11.5f}}); + {{16, -0.5f, +15.5f}}); hev->GetXaxis()->SetBinLabel(1, "All collisions"); hev->GetXaxis()->SetBinLabel(2, "Ev. sel."); hev->GetXaxis()->SetBinLabel(3, "kIsGoodZvtxFT0vsPV"); @@ -223,10 +228,14 @@ struct DndetaMFTPbPb { hev->GetXaxis()->SetBinLabel(5, "Z-vtx cut"); hev->GetXaxis()->SetBinLabel(6, "kNoCollInTimeRangeStd"); hev->GetXaxis()->SetBinLabel(7, "kNoCollInTimeRangeNarrow"); - hev->GetXaxis()->SetBinLabel(8, "Below min occup."); - hev->GetXaxis()->SetBinLabel(9, "Above max occup."); - hev->GetXaxis()->SetBinLabel(10, "Below min IR (kHz)"); - hev->GetXaxis()->SetBinLabel(11, "Above max IR (kHz)"); + hev->GetXaxis()->SetBinLabel(8, "kNoCollInTimeRangeStrict"); + hev->GetXaxis()->SetBinLabel(9, "kNoCollInRofStrict"); + hev->GetXaxis()->SetBinLabel(10, "kNoCollInRofStandard"); + hev->GetXaxis()->SetBinLabel(11, "kNoHighMultCollInPrevRof"); + hev->GetXaxis()->SetBinLabel(12, "Below min occup."); + hev->GetXaxis()->SetBinLabel(13, "Above max occup."); + hev->GetXaxis()->SetBinLabel(14, "Below min IR (kHz)"); + hev->GetXaxis()->SetBinLabel(15, "Above max IR (kHz)"); auto hBcSel = registry.add("hBcSel", "hBcSel", HistType::kTH1F, {{3, -0.5f, +2.5f}}); @@ -736,13 +745,13 @@ struct DndetaMFTPbPb { return false; } if (fillHis) { - registry.fill(HIST("hEvtSel"), 9); + registry.fill(HIST("hEvtSel"), 13); } if (eventCuts.maxIR >= 0 && ir > eventCuts.maxIR) { return false; } if (fillHis) { - registry.fill(HIST("hEvtSel"), 10); + registry.fill(HIST("hEvtSel"), 14); } return true; } @@ -752,6 +761,8 @@ struct DndetaMFTPbPb { { if (track.eta() < trackCuts.minEta || track.eta() > trackCuts.maxEta) return false; + if (track.chi2() > trackCuts.maxChi2) + return false; if (trackCuts.requireCA && !track.isCA()) return false; if (track.nClusters() < trackCuts.minNclusterMft) @@ -960,13 +971,37 @@ struct DndetaMFTPbPb { if constexpr (fillHis) { registry.fill(HIST("hEvtSel"), 6); } + if (eventCuts.requireNoCollInTimeRangeStrict && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStrict)) { + return false; + } + if constexpr (fillHis) { + registry.fill(HIST("hEvtSel"), 7); + } + if (eventCuts.requireNoCollInRofStrict && !collision.selection_bit(o2::aod::evsel::kNoCollInRofStrict)) { + return false; + } + if constexpr (fillHis) { + registry.fill(HIST("hEvtSel"), 8); + } + if (eventCuts.requireNoCollInRofStandard && !collision.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { + return false; + } + if constexpr (fillHis) { + registry.fill(HIST("hEvtSel"), 9); + } + if (eventCuts.requireNoHighMultCollInPrevRof && !collision.selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof)) { + return false; + } + if constexpr (fillHis) { + registry.fill(HIST("hEvtSel"), 10); + } if (eventCuts.minOccupancy >= 0 && getOccupancy(collision, eventCuts.occupancyEstimator) < eventCuts.minOccupancy) { return false; } if constexpr (fillHis) { - registry.fill(HIST("hEvtSel"), 7); + registry.fill(HIST("hEvtSel"), 11); } if (eventCuts.maxOccupancy >= 0 && getOccupancy(collision, eventCuts.occupancyEstimator) > @@ -974,7 +1009,7 @@ struct DndetaMFTPbPb { return false; } if constexpr (fillHis) { - registry.fill(HIST("hEvtSel"), 8); + registry.fill(HIST("hEvtSel"), 12); } return true; } From 17cf5eaec259a3f70e9bd5315857063e8bdbbc7b Mon Sep 17 00:00:00 2001 From: Nazar Burmasov Date: Wed, 14 May 2025 18:07:55 +0300 Subject: [PATCH 1271/1650] [PWGUD] Implement luminosity calculation in SG candidate producer (#11089) Co-authored-by: rolavick --- PWGUD/TableProducer/SGCandProducer.cxx | 114 +++++++++++++++++++++++-- 1 file changed, 107 insertions(+), 7 deletions(-) diff --git a/PWGUD/TableProducer/SGCandProducer.cxx b/PWGUD/TableProducer/SGCandProducer.cxx index bc42a71016b..de75fff3e72 100644 --- a/PWGUD/TableProducer/SGCandProducer.cxx +++ b/PWGUD/TableProducer/SGCandProducer.cxx @@ -8,6 +8,13 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +// +/// \file SGCandProducer.cxx +/// \brief Produces PWGUD derived table from standard tables +/// +/// \author Alexander Bylinkin , Uniersity of Bergen +/// \since 23.11.2023 +// #include #include @@ -21,6 +28,8 @@ #include "DataFormatsFIT/Triggers.h" #include "DataFormatsParameters/GRPMagField.h" #include "DataFormatsParameters/GRPObject.h" +#include "DataFormatsParameters/GRPLHCIFData.h" +#include "DataFormatsParameters/AggregatedRunInfo.h" #include "Framework/AnalysisTask.h" #include "Framework/ASoAHelpers.h" @@ -74,6 +83,7 @@ struct SGCandProducer { // Configurables to decide which tables are filled Configurable fillTrackTables{"fillTrackTables", true, "Fill track tables"}; Configurable fillFwdTrackTables{"fillFwdTrackTables", true, "Fill forward track tables"}; + // SG selector SGSelector sgSelector; ctpRateFetcher mRateFetcher; @@ -103,6 +113,8 @@ struct SGCandProducer { {}}; std::map histPointers; + int runNumber = -1; + // function to update UDFwdTracks, UDFwdTracksExtra template void updateUDFwdTrackTables(TFwdTrack const& fwdtrack, uint64_t const& bcnum) @@ -180,6 +192,78 @@ struct SGCandProducer { outputTracksLabel(track.globalIndex()); } + // function to process trigger counters, accounting for BC selection bits + void processCountersTrg(BCs const& bcs, aod::FT0s const&, aod::Zdcs const&) + { + const auto& firstBc = bcs.iteratorAt(0); + if (runNumber != firstBc.runNumber()) + runNumber = firstBc.runNumber(); + + auto hCountersTrg = getHist(TH1, "reco/hCountersTrg"); + auto hCountersTrgBcSel = getHist(TH1, "reco/hCountersTrgBcSel"); + auto hLumi = getHist(TH1, "reco/hLumi"); + auto hLumiBcSel = getHist(TH1, "reco/hLumiBcSel"); + + // Cross sections in ub. Using dummy -1 if lumi estimator is not reliable + float csTCE = 10.36e6; + float csZEM = 415.2e6; // see AN: https://alice-notes.web.cern.ch/node/1515 + float csZNC = 214.5e6; // see AN: https://alice-notes.web.cern.ch/node/1515 + if (runNumber > 543437 && runNumber < 543514) { + csTCE = 8.3e6; + } + if (runNumber >= 543514) { + csTCE = 4.10e6; // see AN: https://alice-notes.web.cern.ch/node/1515 + } + + for (const auto& bc : bcs) { + bool hasFT0 = bc.has_foundFT0(); + bool hasZDC = bc.has_foundZDC(); + if (!hasFT0 && !hasZDC) + continue; + bool isSelectedBc = true; + if (rejectAtTFBoundary && !bc.selection_bit(aod::evsel::kNoTimeFrameBorder)) + isSelectedBc = false; + if (noITSROFrameBorder && !bc.selection_bit(aod::evsel::kNoITSROFrameBorder)) + isSelectedBc = false; + if (hasFT0) { + auto ft0TrgMask = bc.ft0().triggerMask(); + if (TESTBIT(ft0TrgMask, o2::fit::Triggers::bitVertex)) { + hCountersTrg->Fill("TVX", 1); + if (isSelectedBc) + hCountersTrgBcSel->Fill("TVX", 1); + } + if (TESTBIT(ft0TrgMask, o2::fit::Triggers::bitVertex) && TESTBIT(ft0TrgMask, o2::fit::Triggers::bitCen)) { + hCountersTrg->Fill("TCE", 1); + hLumi->Fill("TCE", 1. / csTCE); + if (isSelectedBc) { + hCountersTrgBcSel->Fill("TCE", 1); + hLumiBcSel->Fill("TCE", 1. / csTCE); + } + } + } + if (hasZDC) { + if (bc.selection_bit(aod::evsel::kIsBBZNA) || bc.selection_bit(aod::evsel::kIsBBZNC)) { + hCountersTrg->Fill("ZEM", 1); + hLumi->Fill("ZEM", 1. / csZEM); + if (isSelectedBc) { + hCountersTrgBcSel->Fill("ZEM", 1); + hLumiBcSel->Fill("ZEM", 1. / csZEM); + } + } + if (bc.selection_bit(aod::evsel::kIsBBZNC)) { + hCountersTrg->Fill("ZNC", 1); + hLumi->Fill("ZNC", 1. / csZNC); + if (isSelectedBc) { + hCountersTrgBcSel->Fill("ZNC", 1); + hLumiBcSel->Fill("ZNC", 1. / csZNC); + } + } + } + } + } + + PROCESS_SWITCH(SGCandProducer, processCountersTrg, "Produce trigger counters and luminosity histograms", true); + // function to process reconstructed data template void processReco(std::string histdir, TCol const& collision, BCs const& bcs, @@ -289,7 +373,7 @@ struct SGCandProducer { } // update SGTracks tables if (fillTrackTables) { - for (auto& track : tracks) { + for (const auto& track : tracks) { if (track.pt() > sameCuts.minPt() && track.eta() > sameCuts.minEta() && track.eta() < sameCuts.maxEta()) { if (track.isPVContributor()) { updateUDTrackTables(outputCollisions.lastIndex(), track, bc.globalBC()); @@ -304,7 +388,7 @@ struct SGCandProducer { // update SGFwdTracks tables if (fillFwdTrackTables) { if (sameCuts.withFwdTracks()) { - for (auto& fwdtrack : fwdtracks) { + for (const auto& fwdtrack : fwdtracks) { if (!sgSelector.FwdTrkSelector(fwdtrack)) updateUDFwdTrackTables(fwdtrack, bc.globalBC()); } @@ -324,6 +408,22 @@ struct SGCandProducer { histPointers.clear(); if (context.mOptions.get("processData")) { histPointers.insert({"reco/Stat", registry.add("reco/Stat", "Cut statistics; Selection criterion; Collisions", {HistType::kTH1F, {{14, -0.5, 13.5}}})}); + + const AxisSpec axisCountersTrg{10, 0.5, 10.5, ""}; + histPointers.insert({"reco/hCountersTrg", registry.add("reco/hCountersTrg", "Trigger counts before selections; Trigger; Counts", {HistType::kTH1F, {axisCountersTrg}})}); + histPointers.insert({"reco/hCountersTrgBcSel", registry.add("reco/hCountersTrgSel", "Trigger counts after BC selections; Trigger; Counts", {HistType::kTH1F, {axisCountersTrg}})}); + histPointers.insert({"reco/hLumi", registry.add("reco/hLumi", "Integrated luminosity before selections; Trigger; Luminosity, 1/#mub", {HistType::kTH1F, {axisCountersTrg}})}); + histPointers.insert({"reco/hLumiBcSel", registry.add("reco/hLumiBcSel", "Integrated luminosity before selections; Trigger; Luminosity, 1/#mub", {HistType::kTH1F, {axisCountersTrg}})}); + auto hCountersTrg = getHist(TH1, "reco/hCountersTrg"); + auto hCountersTrgBcSel = getHist(TH1, "reco/hCountersTrgBcSel"); + auto hLumi = getHist(TH1, "reco/hLumi"); + auto hLumiBcSel = getHist(TH1, "reco/hLumiBcSel"); + for (const auto& h : {hCountersTrg, hCountersTrgBcSel, hLumi, hLumiBcSel}) { + h->GetXaxis()->SetBinLabel(1, "TVX"); + h->GetXaxis()->SetBinLabel(2, "TCE"); + h->GetXaxis()->SetBinLabel(3, "ZEM"); + h->GetXaxis()->SetBinLabel(4, "ZNC"); + } } if (context.mOptions.get("processMcData")) { histPointers.insert({"MCreco/Stat", registry.add("MCreco/Stat", "Cut statistics; Selection criterion; Collisions", {HistType::kTH1F, {{14, -0.5, 13.5}}})}); @@ -441,7 +541,7 @@ struct McSGCandProducer { // This is needed to be able to assign the new daughter indices std::map oldnew; auto lastId = outputMcParticles.lastIndex(); - for (auto mcpart : McParts) { + for (const auto& mcpart : McParts) { auto oldId = mcpart.globalIndex(); if (mcPartIsSaved.find(oldId) != mcPartIsSaved.end()) { oldnew[oldId] = mcPartIsSaved[oldId]; @@ -452,12 +552,12 @@ struct McSGCandProducer { } // all particles of the McCollision are saved - for (auto mcpart : McParts) { + for (const auto& mcpart : McParts) { if (mcPartIsSaved.find(mcpart.globalIndex()) == mcPartIsSaved.end()) { // mothers newmids.clear(); auto oldmids = mcpart.mothersIds(); - for (auto oldmid : oldmids) { + for (const auto& oldmid : oldmids) { auto m = McParts.rawIteratorAt(oldmid); if (verboseInfoMC) LOGF(debug, " m %d", m.globalIndex()); @@ -524,7 +624,7 @@ struct McSGCandProducer { void updateUDMcTrackLabels(TTrack const& udtracks, std::map& mcPartIsSaved) { // loop over all tracks - for (auto udtrack : udtracks) { + for (const auto& udtrack : udtracks) { // udtrack (UDTCs) -> track (TCs) -> mcTrack (McParticles) -> udMcTrack (UDMcParticles) auto trackId = udtrack.trackId(); if (trackId >= 0) { @@ -634,7 +734,7 @@ struct McSGCandProducer { // update UDMcParticles and UDMcTrackLabels (for each UDTrack -> UDMcParticles) // loop over tracks of dgcand - for (auto sgtrack : sgTracks) { + for (const auto& sgtrack : sgTracks) { if (sgtrack.has_track()) { auto track = sgtrack.track_as(); if (track.has_mcParticle()) { From effe38ca2ec902b12ecd0015a6c101b299864849 Mon Sep 17 00:00:00 2001 From: Zhang Yuan Date: Wed, 14 May 2025 18:25:47 +0200 Subject: [PATCH 1272/1650] [PWGDQ] Change some names of subgroups to lower-case (#11177) --- PWGDQ/Core/HistogramsLibrary.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index dffbf25984e..c047716bcfa 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -524,7 +524,7 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "TPCnSigPi_pIN", "TPC n-#sigma(#pi) vs pIN", false, nbins_pIN, pIN_bins, VarManager::kPin, nbins_nSigma, nSigma_bins, VarManager::kTPCnSigmaPi); hm->AddHistogram(histClass, "TPCnSigKa_pIN", "TPC n-#sigma(K) vs pIN", false, nbins_pIN, pIN_bins, VarManager::kPin, nbins_nSigma, nSigma_bins, VarManager::kTPCnSigmaKa); hm->AddHistogram(histClass, "TPCnSigPr_pIN", "TPC n-#sigma(p) vs pIN", false, nbins_pIN, pIN_bins, VarManager::kPin, nbins_nSigma, nSigma_bins, VarManager::kTPCnSigmaPr); - if (subGroupStr.Contains("tpcpid_fine_Corr")) { + if (subGroupStr.Contains("tpcpid_fine_corr")) { hm->AddHistogram(histClass, "TPCnSigEl_Corr_pIN", "TPC n-#sigma(e) Corr. vs pIN", false, nbins_pIN, pIN_bins, VarManager::kPin, nbins_nSigma, nSigma_bins, VarManager::kTPCnSigmaEl_Corr); hm->AddHistogram(histClass, "TPCnSigPi_Corr_pIN", "TPC n-#sigma(#pi) Corr. vs pIN", false, nbins_pIN, pIN_bins, VarManager::kPin, nbins_nSigma, nSigma_bins, VarManager::kTPCnSigmaPi_Corr); hm->AddHistogram(histClass, "TPCnSigPr_Corr_pIN", "TPC n-#sigma(p) Corr. vs pIN", false, nbins_pIN, pIN_bins, VarManager::kPin, nbins_nSigma, nSigma_bins, VarManager::kTPCnSigmaPr_Corr); @@ -559,13 +559,13 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "TPCnSigPr_pIN", "TPC n-#sigma(p) vs pIN", false, 100, 0.0, 10.0, VarManager::kPin, 100, -5.0, 5.0, VarManager::kTPCnSigmaPr); hm->AddHistogram(histClass, "TPCnSigPr_timeFromSOR", "TPC n-#sigma(p) vs time from SOR", true, 10000, 0.0, 1000.0, VarManager::kTimeFromSOR, 10, -5.0, 5.0, VarManager::kTPCnSigmaPr); hm->AddHistogram(histClass, "TPCnSigPr_occupancy", "TPC n-#sigma(p) vs. occupancy", false, 200, 0., 20000., VarManager::kTrackOccupancyInTimeRange, 100, -5.0, 5.0, VarManager::kTPCnSigmaPr); - if (subGroupStr.Contains("tpcpid_Corr")) { + if (subGroupStr.Contains("tpcpid_corr")) { hm->AddHistogram(histClass, "TPCnSigEl_Corr_pIN", "TPC n-#sigma(e) Corr. vs pIN", false, 100, 0.0, 10.0, VarManager::kPin, 100, -5.0, 5.0, VarManager::kTPCnSigmaEl_Corr); hm->AddHistogram(histClass, "TPCnSigPi_Corr_pIN", "TPC n-#sigma(#pi) Corr. vs pIN", false, 100, 0.0, 10.0, VarManager::kPin, 100, -5.0, 5.0, VarManager::kTPCnSigmaPi_Corr); hm->AddHistogram(histClass, "TPCnSigKa_Corr_pIN", "TPC n-#sigma(K) Corr. vs pIN", false, 100, 0.0, 10.0, VarManager::kPin, 100, -5.0, 5.0, VarManager::kTPCnSigmaKa_Corr); hm->AddHistogram(histClass, "TPCnSigPr_Corr_pIN", "TPC n-#sigma(p) Corr. vs pIN", false, 100, 0.0, 10.0, VarManager::kPin, 100, -5.0, 5.0, VarManager::kTPCnSigmaPr_Corr); } - if (subGroupStr.Contains("tpcpid_nSigEl")) { + if (subGroupStr.Contains("tpcpid_nsigel")) { hm->AddHistogram(histClass, "TPCnSigEl_TPCnSigPi", "TPC n-#sigma(e) . vs TPC n-#sigma(#pi)", false, 100, -5.0, 5.0, VarManager::kTPCnSigmaEl, 100, -5.0, 5.0, VarManager::kTPCnSigmaPi); hm->AddHistogram(histClass, "TPCnSigEl_TPCnSigKa", "TPC n-#sigma(e) . vs TPC n-#sigma(K)", false, 100, -5.0, 5.0, VarManager::kTPCnSigmaEl, 100, -5.0, 5.0, VarManager::kTPCnSigmaKa); hm->AddHistogram(histClass, "TPCnSigEl_TPCnSigPr", "TPC n-#sigma(e) . vs TPC n-#sigma(p)", false, 100, -5.0, 5.0, VarManager::kTPCnSigmaEl, 100, -5.0, 5.0, VarManager::kTPCnSigmaPr); From da342325b4cf71cf889af6ad2f3b5b29b0b13a4d Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Thu, 15 May 2025 03:35:23 +0900 Subject: [PATCH 1273/1650] [PWGEM/Dilepton] update skimmerPrimaryElectron.cxx for eID in low B (#11199) --- PWGEM/Dilepton/TableProducer/skimmerPrimaryElectron.cxx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/PWGEM/Dilepton/TableProducer/skimmerPrimaryElectron.cxx b/PWGEM/Dilepton/TableProducer/skimmerPrimaryElectron.cxx index 26b1106448c..9d0ac52e982 100644 --- a/PWGEM/Dilepton/TableProducer/skimmerPrimaryElectron.cxx +++ b/PWGEM/Dilepton/TableProducer/skimmerPrimaryElectron.cxx @@ -92,7 +92,8 @@ struct skimmerPrimaryElectron { Configurable maxTPCNsigmaPr{"maxTPCNsigmaPr", 2.5, "max. TPC n sigma for proton exclusion"}; Configurable minTPCNsigmaPr{"minTPCNsigmaPr", -2.5, "min. TPC n sigma for proton exclusion"}; Configurable requireTOF{"requireTOF", false, "require TOF hit"}; - Configurable max_pin_for_pion_rejection{"max_pin_for_pion_rejection", 1e+10, "pion rejection is applied below this pin"}; + Configurable min_pin_for_pion_rejection{"min_pin_for_pion_rejection", 0.0, "pion rejection is applied above this pin"}; // this is used only in TOFreq + Configurable max_pin_for_pion_rejection{"max_pin_for_pion_rejection", 0.5, "pion rejection is applied below this pin"}; Configurable max_frac_shared_clusters_tpc{"max_frac_shared_clusters_tpc", 999.f, "max fraction of shared clusters in TPC"}; HistogramRegistry fRegistry{"output", {}, OutputObjHandlingPolicy::AnalysisObject, false, false}; @@ -328,7 +329,7 @@ struct skimmerPrimaryElectron { template bool isElectron_TOFreq(TTrack const& track) { - if (minTPCNsigmaPi < track.tpcNSigmaPi() && track.tpcNSigmaPi() < maxTPCNsigmaPi && track.tpcInnerParam() < max_pin_for_pion_rejection) { + if (minTPCNsigmaPi < track.tpcNSigmaPi() && track.tpcNSigmaPi() < maxTPCNsigmaPi && (min_pin_for_pion_rejection < track.tpcInnerParam() && track.tpcInnerParam() < max_pin_for_pion_rejection)) { return false; } return minTPCNsigmaEl < track.tpcNSigmaEl() && track.tpcNSigmaEl() < maxTPCNsigmaEl && std::fabs(track.tofNSigmaEl()) < maxTOFNsigmaEl; From 7582a9e39df5e91b932ae31576dcc55530ce0719 Mon Sep 17 00:00:00 2001 From: omvazque Date: Wed, 14 May 2025 14:24:33 -0500 Subject: [PATCH 1274/1650] [PWGLF] Update the methods to get the ccdb objects (#11197) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 34 ++++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index 3b9f1de7664..3c539d69cef 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -515,13 +515,14 @@ struct UccZdc { registry.fill(HIST("hEventCounter"), EvCutLabel::Zem); } - const auto& fMeanNch = ccdb->getForTimeStamp(paTHmeanNch.value, foundBC.timestamp()); - const auto& fSigmaNch = ccdb->getForTimeStamp(paTHsigmaNch.value, foundBC.timestamp()); - if (!fMeanNch) { - LOGF(fatal, "fMeanNch object not found!"); + // Get Nch-based selection objects from the CCDB + fMeanNch = ccdb->getForTimeStamp(paTHmeanNch.value, foundBC.timestamp()); + fSigmaNch = ccdb->getForTimeStamp(paTHsigmaNch.value, foundBC.timestamp()); + if (fMeanNch == nullptr) { + LOGF(fatal, "Could not load fMeanNch!"); } - if (!fSigmaNch) { - LOGF(fatal, "fSigmaNch object not found!"); + if (fSigmaNch == nullptr) { + LOGF(fatal, "Could not load fSigmaNch!"); } float znA{zdc.amplitudeZNA()}; @@ -619,10 +620,9 @@ struct UccZdc { const auto& foundBC = collision.foundBC_as(); // LOGF(info, "Getting object %s for run number %i from timestamp=%llu", paTH.value.data(), foundBC.runNumber(), foundBC.timestamp()); - const auto& efficiency = ccdb->getForTimeStamp(paTH.value, foundBC.timestamp()); - // auto efficiency = ccdb->getForRun(paTH.value, foundBC.runNumber()); - if (!efficiency) { - LOGF(fatal, "Efficiency object not found!"); + efficiency = ccdb->getForTimeStamp(paTH.value, foundBC.timestamp()); + if (efficiency == nullptr) { + LOGF(fatal, "Could not load efficiency!"); } // has ZDC? @@ -676,14 +676,14 @@ struct UccZdc { registry.fill(HIST("hEventCounter"), EvCutLabel::Zem); } - // Nch-based selection - const auto& fMeanNch = ccdb->getForTimeStamp(paTHmeanNch.value, foundBC.timestamp()); - const auto& fSigmaNch = ccdb->getForTimeStamp(paTHsigmaNch.value, foundBC.timestamp()); - if (!fMeanNch) { - LOGF(fatal, "fMeanNch object not found!"); + // Get Nch-based selection objects from the CCDB + fMeanNch = ccdb->getForTimeStamp(paTHmeanNch.value, foundBC.timestamp()); + fSigmaNch = ccdb->getForTimeStamp(paTHsigmaNch.value, foundBC.timestamp()); + if (fMeanNch == nullptr) { + LOGF(fatal, "Could not load fMeanNch!"); } - if (!fSigmaNch) { - LOGF(fatal, "fSigmaNch object not found!"); + if (fSigmaNch == nullptr) { + LOGF(fatal, "Could not load fSigmaNch!"); } std::vector pTs; From c9d762bb5aba5469aa021b72d8974c5b6f980044 Mon Sep 17 00:00:00 2001 From: prottayCMT <61418725+prottayCMT@users.noreply.github.com> Date: Wed, 14 May 2025 23:16:07 +0200 Subject: [PATCH 1275/1650] [PWGLF] added antilambdalambdapairhistograms along with a switch for QA histograms and rejected misidentifications (#11200) Co-authored-by: Prottay Das --- .../Tasks/Strangeness/taskLambdaSpinCorr.cxx | 112 ++++++++++++++---- 1 file changed, 90 insertions(+), 22 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx index 737c3a253e1..4935cfc09f0 100644 --- a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx +++ b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx @@ -52,7 +52,8 @@ struct LfTaskLambdaSpinCorr { // fill output Configurable additionalEvSel{"additionalEvSel", false, "additionalEvSel"}; Configurable additionalEvSel3{"additionalEvSel3", false, "additionalEvSel3"}; - Configurable fillGEN{"fillGEN", true, "filling generated histograms"}; + Configurable fillGEN{"fillGEN", false, "filling generated histograms"}; + Configurable fillQA{"fillQA", false, "filling QA histograms"}; // events Configurable cfgCutVertex{"cfgCutVertex", 10.0f, "Accepted z-vertex range"}; @@ -105,20 +106,27 @@ struct LfTaskLambdaSpinCorr { histos.add("hSparseLambdaLambda", "hSparseLambdaLambda", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); histos.add("hSparseLambdaAntiLambda", "hSparseLambdaAntiLambda", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + histos.add("hSparseAntiLambdaLambda", "hSparseAntiLambdaLambda", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); histos.add("hSparseAntiLambdaAntiLambda", "hSparseAntiLambdaAntiLambda", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); - ///////// along quantization axes/////////// - histos.add("hSparseLambdaLambdaQA", "hSparseLambdaLambdaQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); - histos.add("hSparseLambdaAntiLambdaQA", "hSparseLambdaAntiLambdaQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); - histos.add("hSparseAntiLambdaAntiLambdaQA", "hSparseAntiLambdaAntiLambdaQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + if (fillQA) { + ///////// along quantization axes/////////// + histos.add("hSparseLambdaLambdaQA", "hSparseLambdaLambdaQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + histos.add("hSparseLambdaAntiLambdaQA", "hSparseLambdaAntiLambdaQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + histos.add("hSparseAntiLambdaLambdaQA", "hSparseAntiLambdaLambdaQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + histos.add("hSparseAntiLambdaAntiLambdaQA", "hSparseAntiLambdaAntiLambdaQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + } if (fillGEN) { histos.add("hSparseLambdaLambdaMC", "hSparseLambdaLambdaMC", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); histos.add("hSparseLambdaAntiLambdaMC", "hSparseLambdaAntiLambdaMC", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + histos.add("hSparseAntiLambdaLambdaMC", "hSparseAntiLambdaLambdaMC", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); histos.add("hSparseAntiLambdaAntiLambdaMC", "hSparseAntiLambdaAntiLambdaMC", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); - - histos.add("hSparseLambdaLambdaMCQA", "hSparseLambdaLambdaMCQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); - histos.add("hSparseLambdaAntiLambdaMCQA", "hSparseLambdaAntiLambdaMCQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); - histos.add("hSparseAntiLambdaAntiLambdaMCQA", "hSparseAntiLambdaAntiLambdaMCQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + if (fillQA) { + histos.add("hSparseLambdaLambdaMCQA", "hSparseLambdaLambdaMCQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + histos.add("hSparseLambdaAntiLambdaMCQA", "hSparseLambdaAntiLambdaMCQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + histos.add("hSparseAntiLambdaLambdaMCQA", "hSparseAntiLambdaLambdaMCQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + histos.add("hSparseAntiLambdaAntiLambdaMCQA", "hSparseAntiLambdaAntiLambdaMCQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + } } } @@ -206,8 +214,8 @@ struct LfTaskLambdaSpinCorr { const ROOT::Math::PxPyPzMVector& Lambdadummy, const ROOT::Math::PxPyPzMVector& AntiLambdadummy) { - const double minMass = 1.105; - const double maxMass = 1.125; + const double minMass = 1.0; + const double maxMass = 2.0; return (lambdaTag && aLambdaTag && (Lambdadummy.M() > minMass && Lambdadummy.M() < maxMass) && (AntiLambdadummy.M() > minMass && AntiLambdadummy.M() < maxMass)); @@ -257,6 +265,8 @@ struct LfTaskLambdaSpinCorr { histos.fill(HIST("hSparseLambdaLambdaMC"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); if (tag1 && tag4) histos.fill(HIST("hSparseLambdaAntiLambdaMC"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); + if (tag2 && tag3) + histos.fill(HIST("hSparseAntiLambdaLambdaMC"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); if (tag2 && tag4) histos.fill(HIST("hSparseAntiLambdaAntiLambdaMC"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); } else { @@ -265,6 +275,8 @@ struct LfTaskLambdaSpinCorr { histos.fill(HIST("hSparseLambdaLambda"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); if (tag1 && tag4) histos.fill(HIST("hSparseLambdaAntiLambda"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); + if (tag2 && tag3) + histos.fill(HIST("hSparseAntiLambdaLambda"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); if (tag2 && tag4) histos.fill(HIST("hSparseAntiLambdaAntiLambda"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); } @@ -309,6 +321,8 @@ struct LfTaskLambdaSpinCorr { histos.fill(HIST("hSparseLambdaLambdaMCQA"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); if (tag1 && tag4) histos.fill(HIST("hSparseLambdaAntiLambdaMCQA"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); + if (tag2 && tag3) + histos.fill(HIST("hSparseAntiLambdaLambdaMCQA"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); if (tag2 && tag4) histos.fill(HIST("hSparseAntiLambdaAntiLambdaMCQA"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); } else { @@ -317,6 +331,8 @@ struct LfTaskLambdaSpinCorr { histos.fill(HIST("hSparseLambdaLambdaQA"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); if (tag1 && tag4) histos.fill(HIST("hSparseLambdaAntiLambdaQA"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); + if (tag2 && tag3) + histos.fill(HIST("hSparseAntiLambdaLambdaQA"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); if (tag2 && tag4) histos.fill(HIST("hSparseAntiLambdaAntiLambdaQA"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); } @@ -401,10 +417,10 @@ struct LfTaskLambdaSpinCorr { ROOT::Math::PxPyPzMVector lambda, antiLambda, lambdadummy, antiLambdadummy, proton, pion, antiProton, antiPion, fourVecDauCM; ROOT::Math::PxPyPzMVector lambda2, antiLambda2, lambdadummy2, antiLambdadummy2, proton2, pion2, antiProton2, antiPion2; - ROOT::Math::PxPyPzMVector lambdaLambdapair, lambdaAntiLambdapair, antiLambdaAntiLambdapair; + ROOT::Math::PxPyPzMVector lambdaLambdapair, lambdaAntiLambdapair, antiLambdaLambdapair, antiLambdaAntiLambdapair; ROOT::Math::PxPyPzMVector lambdamc, antiLambdamc, lambdadummymc, antiLambdadummymc, protonmc, pionmc, antiProtonmc, antiPionmc; ROOT::Math::PxPyPzMVector lambda2mcmc, antiLambda2mc, lambdadummy2mc, antiLambdadummy2mc, proton2mc, pion2mc, antiProton2mc, antiPion2mc; - ROOT::Math::PxPyPzMVector lambdaLambdapairmc, lambdaAntiLambdapairmc, antiLambdaAntiLambdapairmc; + ROOT::Math::PxPyPzMVector lambdaLambdapairmc, lambdaAntiLambdapairmc, antiLambdaLambdapairmc, antiLambdaAntiLambdapairmc; ROOT::Math::XYZVector threeVecDauCM, threeVecDauCMXY; @@ -505,7 +521,9 @@ struct LfTaskLambdaSpinCorr { tagb = 0; tagb2 = 0; fillHistograms(taga, tagb, taga2, tagb2, lambdaLambdapair, lambdadummy, lambdadummy2, proton, proton2, centrality, 0); - fillHistograms2(taga, tagb, taga2, tagb2, lambdaLambdapair, lambdadummy, lambdadummy2, proton, proton2, centrality, 0); + if (fillQA) { + fillHistograms2(taga, tagb, taga2, tagb2, lambdaLambdapair, lambdadummy, lambdadummy2, proton, proton2, centrality, 0); + } } tagb2 = aLambdaTag2; @@ -515,18 +533,35 @@ struct LfTaskLambdaSpinCorr { tagb = 0; taga2 = 0; fillHistograms(taga, tagb, taga2, tagb2, lambdaAntiLambdapair, lambdadummy, antiLambdadummy2, proton, antiProton2, centrality, 0); - fillHistograms2(taga, tagb, taga2, tagb2, lambdaAntiLambdapair, lambdadummy, antiLambdadummy2, proton, antiProton2, centrality, 0); + if (fillQA) { + fillHistograms2(taga, tagb, taga2, tagb2, lambdaAntiLambdapair, lambdadummy, antiLambdadummy2, proton, antiProton2, centrality, 0); + } } tagb = aLambdaTag; taga2 = lambdaTag2; + if (aLambdaTag && lambdaTag2) { + antiLambdaLambdapair = antiLambdadummy + lambdadummy2; + taga = 0; + tagb2 = 0; + fillHistograms(taga, tagb, taga2, tagb2, antiLambdaLambdapair, antiLambdadummy, lambdadummy2, antiProton, proton2, centrality, 0); + if (fillQA) { + fillHistograms2(taga, tagb, taga2, tagb2, antiLambdaLambdapair, antiLambdadummy, lambdadummy2, antiProton, proton2, centrality, 0); + } + } + + taga = lambdaTag; + tagb2 = aLambdaTag2; + if (aLambdaTag && aLambdaTag2) { antiLambdaAntiLambdapair = antiLambdadummy + antiLambdadummy2; taga = 0; taga2 = 0; fillHistograms(taga, tagb, taga2, tagb2, antiLambdaAntiLambdapair, antiLambdadummy, antiLambdadummy2, antiProton, antiProton2, centrality, 0); - fillHistograms2(taga, tagb, taga2, tagb2, antiLambdaAntiLambdapair, antiLambdadummy, antiLambdadummy2, antiProton, antiProton2, centrality, 0); + if (fillQA) { + fillHistograms2(taga, tagb, taga2, tagb2, antiLambdaAntiLambdapair, antiLambdadummy, antiLambdadummy2, antiProton, antiProton2, centrality, 0); + } } } } @@ -629,7 +664,9 @@ struct LfTaskLambdaSpinCorr { tagb = 0; tagb2 = 0; fillHistograms(taga, tagb, taga2, tagb2, lambdaLambdapair, lambdadummy, lambdadummy2, proton, proton2, centrality, 0); - fillHistograms2(taga, tagb, taga2, tagb2, lambdaLambdapair, lambdadummy, lambdadummy2, proton, proton2, centrality, 0); + if (fillQA) { + fillHistograms2(taga, tagb, taga2, tagb2, lambdaLambdapair, lambdadummy, lambdadummy2, proton, proton2, centrality, 0); + } } tagb2 = aLambdaTag2; @@ -639,18 +676,35 @@ struct LfTaskLambdaSpinCorr { tagb = 0; taga2 = 0; fillHistograms(taga, tagb, taga2, tagb2, lambdaAntiLambdapair, lambdadummy, antiLambdadummy2, proton, antiProton2, centrality, 0); - fillHistograms2(taga, tagb, taga2, tagb2, lambdaAntiLambdapair, lambdadummy, antiLambdadummy2, proton, antiProton2, centrality, 0); + if (fillQA) { + fillHistograms2(taga, tagb, taga2, tagb2, lambdaAntiLambdapair, lambdadummy, antiLambdadummy2, proton, antiProton2, centrality, 0); + } } tagb = aLambdaTag; taga2 = lambdaTag2; + if (aLambdaTag && lambdaTag2) { + antiLambdaLambdapair = antiLambdadummy + lambdadummy2; + taga = 0; + tagb2 = 0; + fillHistograms(taga, tagb, taga2, tagb2, antiLambdaLambdapair, antiLambdadummy, lambdadummy2, antiProton, proton2, centrality, 0); + if (fillQA) { + fillHistograms2(taga, tagb, taga2, tagb2, antiLambdaLambdapair, antiLambdadummy, lambdadummy2, antiProton, proton2, centrality, 0); + } + } + + taga = lambdaTag; + tagb2 = aLambdaTag2; + if (aLambdaTag && aLambdaTag2) { antiLambdaAntiLambdapair = antiLambdadummy + antiLambdadummy2; taga = 0; taga2 = 0; fillHistograms(taga, tagb, taga2, tagb2, antiLambdaAntiLambdapair, antiLambdadummy, antiLambdadummy2, antiProton, antiProton2, centrality, 0); - fillHistograms2(taga, tagb, taga2, tagb2, antiLambdaAntiLambdapair, antiLambdadummy, antiLambdadummy2, antiProton, antiProton2, centrality, 0); + if (fillQA) { + fillHistograms2(taga, tagb, taga2, tagb2, antiLambdaAntiLambdapair, antiLambdadummy, antiLambdadummy2, antiProton, antiProton2, centrality, 0); + } } } } @@ -757,19 +811,33 @@ struct LfTaskLambdaSpinCorr { if (tagamc && taga2mc) { lambdaLambdapairmc = lambdadummymc + lambdadummy2mc; fillHistograms(tagamc, tagbmc, taga2mc, tagb2mc, lambdaLambdapairmc, lambdadummymc, lambdadummy2mc, protonmc, proton2mc, centrality, 1); - fillHistograms2(tagamc, tagbmc, taga2mc, tagb2mc, lambdaLambdapairmc, lambdadummymc, lambdadummy2mc, protonmc, proton2mc, centrality, 1); + if (fillQA) { + fillHistograms2(tagamc, tagbmc, taga2mc, tagb2mc, lambdaLambdapairmc, lambdadummymc, lambdadummy2mc, protonmc, proton2mc, centrality, 1); + } } if (tagamc && tagb2mc) { lambdaAntiLambdapairmc = lambdadummymc + antiLambdadummy2mc; fillHistograms(tagamc, tagbmc, taga2mc, tagb2mc, lambdaAntiLambdapairmc, lambdadummymc, antiLambdadummy2mc, protonmc, antiProton2mc, centrality, 1); - fillHistograms2(tagamc, tagbmc, taga2mc, tagb2mc, lambdaAntiLambdapairmc, lambdadummymc, antiLambdadummy2mc, protonmc, antiProton2mc, centrality, 1); + if (fillQA) { + fillHistograms2(tagamc, tagbmc, taga2mc, tagb2mc, lambdaAntiLambdapairmc, lambdadummymc, antiLambdadummy2mc, protonmc, antiProton2mc, centrality, 1); + } + } + + if (tagbmc && taga2mc) { + antiLambdaLambdapairmc = antiLambdadummymc + lambdadummy2mc; + fillHistograms(tagamc, tagbmc, taga2mc, tagb2mc, antiLambdaLambdapairmc, antiLambdadummymc, lambdadummy2mc, antiProtonmc, proton2mc, centrality, 1); + if (fillQA) { + fillHistograms2(tagamc, tagbmc, taga2mc, tagb2mc, antiLambdaLambdapairmc, antiLambdadummymc, lambdadummy2mc, antiProtonmc, proton2mc, centrality, 1); + } } if (tagbmc && tagb2mc) { antiLambdaAntiLambdapairmc = antiLambdadummymc + antiLambdadummy2mc; fillHistograms(tagamc, tagbmc, taga2mc, tagb2mc, antiLambdaAntiLambdapairmc, antiLambdadummymc, antiLambdadummy2mc, antiProtonmc, antiProton2mc, centrality, 1); - fillHistograms2(tagamc, tagbmc, taga2mc, tagb2mc, antiLambdaAntiLambdapairmc, antiLambdadummymc, antiLambdadummy2mc, antiProtonmc, antiProton2mc, centrality, 1); + if (fillQA) { + fillHistograms2(tagamc, tagbmc, taga2mc, tagb2mc, antiLambdaAntiLambdapairmc, antiLambdadummymc, antiLambdadummy2mc, antiProtonmc, antiProton2mc, centrality, 1); + } } } } From 587aef3ead92ec6e3855a13ff4cd9ec566fdc66e Mon Sep 17 00:00:00 2001 From: sashingo Date: Thu, 15 May 2025 10:26:26 +0900 Subject: [PATCH 1276/1650] [PWGHF/HFL] Add software trigger selection in the W/Z task (#11158) --- PWGHF/HFL/Tasks/CMakeLists.txt | 2 +- PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx | 78 +++++++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/PWGHF/HFL/Tasks/CMakeLists.txt b/PWGHF/HFL/Tasks/CMakeLists.txt index 8a6c9ab4285..275bd761534 100644 --- a/PWGHF/HFL/Tasks/CMakeLists.txt +++ b/PWGHF/HFL/Tasks/CMakeLists.txt @@ -11,7 +11,7 @@ o2physics_add_dpl_workflow(task-electron-weak-boson SOURCES taskElectronWeakBoson.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::EventFilteringUtils COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(task-muon-charm-beauty-separation diff --git a/PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx b/PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx index ceb92e5e61c..b86e10b98e4 100644 --- a/PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx +++ b/PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx @@ -13,6 +13,9 @@ /// \brief task for WeakBoson (W/Z) based on electron in mid-rapidity /// \author S. Sakai & S. Ito (Univ. of Tsukuba) #include +#include + +#include "CCDB/BasicCCDBManager.h" #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -30,6 +33,8 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/PIDResponse.h" +#include "EventFiltering/Zorro.h" + #include "PWGJE/DataModel/EMCALClusters.h" #include "PWGHF/Core/HfHelper.h" @@ -76,6 +81,14 @@ struct HfTaskElectronWeakBoson { Configurable energyIsolationMax{"energyIsolationMax", 0.1, "isolation cut on energy"}; Configurable trackIsolationMax{"trackIsolationMax", 3, "Maximum number of tracks in isolation cone"}; + // Skimmed dataset processing configurations + Configurable cfgSkimmedProcessing{"cfgSkimmedProcessing", true, "Enables processing of skimmed datasets"}; + Configurable cfgTriggerName{"cfgTriggerName", "fGammaHighPtEMCAL", "Trigger of interest (comma separated for multiple)"}; + + // CCDB service object + Configurable cfgCCDBPath{"cfgCCDBPath", "Users/m/mpuccio/EventFiltering/OTS/", "Path to CCDB for trigger data"}; + Service ccdb; + struct HfElectronCandidate { float pt, eta, phi, energy; int charge; @@ -112,8 +125,23 @@ struct HfTaskElectronWeakBoson { // Histogram registry: an object to hold your registrygrams HistogramRegistry registry{"registry"}; + // Zorro objects for skimmed data processing + Zorro zorro; + OutputObj zorroSummary{"zorroSummary"}; + void init(InitContext const&) { + // Configure CCDB + ccdb->setURL("http://alice-ccdb.cern.ch"); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + // CCDB path for debug + LOGF(info, "CCDB path for Zorro: %s", cfgCCDBPath.value.c_str()); + + // Setup Zorro Summary + if (cfgSkimmedProcessing) { + zorroSummary.setObject(zorro.getZorroSummary()); + } // define axes you want to use const AxisSpec axisZvtx{400, -20, 20, "Zvtx"}; @@ -135,9 +163,11 @@ struct HfTaskElectronWeakBoson { const AxisSpec axisIsoTrack{20, -0.5, 19.5, "Isolation Track"}; const AxisSpec axisInvMassZ{200, 0, 200, "M_{ee} (GeV/c^{2})"}; const AxisSpec axisInvMassDy{200, 0, 2, "M_{ee} (GeV/c^{2})"}; + const AxisSpec axisTrigger{3, 0, 2, "Trigger status of zorro"}; // create registrygrams registry.add("hZvtx", "Z vertex", kTH1F, {axisZvtx}); + registry.add("hEventCounterInit", "hEventCounterInit", kTH1F, {axisCounter}); registry.add("hEventCounter", "hEventCounter", kTH1F, {axisCounter}); registry.add("hITSchi2", "ITS #chi^{2}", kTH1F, {axisChi2}); registry.add("hTPCchi2", "TPC #chi^{2}", kTH1F, {axisChi2}); @@ -163,7 +193,11 @@ struct HfTaskElectronWeakBoson { registry.add("hIsolationTrack", "Isolation Track", kTH2F, {{axisE}, {axisIsoTrack}}); registry.add("hInvMassZeeLs", "invariant mass for Z LS pair", kTH2F, {{axisPt}, {axisInvMassZ}}); registry.add("hInvMassZeeUls", "invariant mass for Z ULS pair", kTH2F, {{axisPt}, {axisInvMassZ}}); + + // hisotgram for EMCal trigger + registry.add("hEMCalTrigger", "EMCal trigger", kTH1F, {axisTrigger}); } + bool isIsolatedCluster(const o2::aod::EMCALCluster& cluster, const SelectedClusters& clusters) { @@ -226,10 +260,54 @@ struct HfTaskElectronWeakBoson { } void process(soa::Filtered::iterator const& collision, + aod::BCsWithTimestamps const&, SelectedClusters const& emcClusters, TrackEle const& tracks, o2::aod::EMCALMatchedTracks const& matchedtracks) { + registry.fill(HIST("hEventCounterInit"), 0.5); + + // Get BC for this collision + auto bc = collision.bc_as(); + uint64_t globalBC = bc.globalBC(); + int runNumber = bc.runNumber(); + + // Initialize Zorro for the first event (once per run) + static bool isFirstEvent = true; + static int lastRunNumber = -1; + + if ((isFirstEvent || runNumber != lastRunNumber) && cfgSkimmedProcessing) { + LOGF(info, "Initializing Zorro for run %d", runNumber); + uint64_t currentTimestamp = bc.timestamp(); + + // add configurable for CCDB path + zorro.setBaseCCDBPath(cfgCCDBPath.value); + + // debug for timestamp + LOGF(info, "Using CCDB path: %s, timestamp: %llu", cfgCCDBPath.value.c_str(), currentTimestamp); + + // initialize Zorro + zorro.initCCDB(ccdb.service, runNumber, currentTimestamp, cfgTriggerName); + isFirstEvent = false; + lastRunNumber = runNumber; + } + + // Check if this is a triggered event using Zorro + bool isTriggered = true; + if (cfgSkimmedProcessing) { + isTriggered = zorro.isSelected(globalBC); + registry.fill(HIST("hEMCalTrigger"), isTriggered ? 1 : 0); + + // Skip event if not triggered and we're processing skimmed data + if (!isTriggered && cfgSkimmedProcessing) { + return; + } + } + + // initialze for inclusive-electron + selectedElectronsIso.clear(); + selectedElectronsAss.clear(); + registry.fill(HIST("hEventCounter"), 0.5); // LOGF(info, "Collision index : %d", collision.index()); From 40fa87c3f6a5790c6d18aa424649889eb48f19b7 Mon Sep 17 00:00:00 2001 From: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> Date: Thu, 15 May 2025 03:51:08 +0200 Subject: [PATCH 1277/1650] [PWGLF] Add converters in strangeness data model for missing info/tables (#11201) --- .../Strangeness/Converters/CMakeLists.txt | 7 ++- .../Converters/straevselsconverter5.cxx | 62 ++++++++++++++++++- .../Converters/zdcneutronsconverter.cxx | 34 ++++++++++ 3 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 PWGLF/TableProducer/Strangeness/Converters/zdcneutronsconverter.cxx diff --git a/PWGLF/TableProducer/Strangeness/Converters/CMakeLists.txt b/PWGLF/TableProducer/Strangeness/Converters/CMakeLists.txt index 3ba4fdb55b7..131672fd384 100644 --- a/PWGLF/TableProducer/Strangeness/Converters/CMakeLists.txt +++ b/PWGLF/TableProducer/Strangeness/Converters/CMakeLists.txt @@ -56,7 +56,7 @@ o2physics_add_dpl_workflow(straevselsconverter4 o2physics_add_dpl_workflow(straevselsconverter5 SOURCES straevselsconverter5.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::ITStracking + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::ITStracking O2Physics::AnalysisCCDB COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(straevselsconverter2rawcents @@ -113,3 +113,8 @@ o2physics_add_dpl_workflow(stramccollisionconverter2 SOURCES stramccollisionconverter2.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(zdcneutronsconverter + SOURCES zdcneutronsconverter.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) \ No newline at end of file diff --git a/PWGLF/TableProducer/Strangeness/Converters/straevselsconverter5.cxx b/PWGLF/TableProducer/Strangeness/Converters/straevselsconverter5.cxx index ab2962e36be..f9617c42a0b 100644 --- a/PWGLF/TableProducer/Strangeness/Converters/straevselsconverter5.cxx +++ b/PWGLF/TableProducer/Strangeness/Converters/straevselsconverter5.cxx @@ -11,17 +11,75 @@ #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" +#include "CCDB/BasicCCDBManager.h" +#include "DataFormatsParameters/AggregatedRunInfo.h" #include "ITStracking/Vertexer.h" #include "PWGLF/DataModel/LFStrangenessTables.h" using namespace o2; using namespace o2::framework; +using namespace o2::aod::evsel; + +static const int32_t nBCsPerOrbit = o2::constants::lhc::LHCMaxBunches; // Converts Stra Event selections from 004 to 005 struct straevselsconverter5 { Produces straEvSels_005; - void process(aod::StraEvSels_004 const& straEvSels_004) + Service ccdb; + + int lastRun = -1; + int64_t lastTF = -1; + uint32_t lastRCT = 0; + uint64_t sorTimestamp = 0; // default SOR timestamp + uint64_t eorTimestamp = 1; // default EOR timestamp + int64_t bcSOR = -1; // global bc of the start of run + int64_t nBCsPerTF = -1; // duration of TF in bcs, should be 128*3564 or 3 + std::map* mapRCT = nullptr; + + uint32_t getRctRaw(int run, uint64_t timestamp, uint64_t globalBC) + { + if (run != lastRun) { + lastRun = run; + auto runInfo = o2::parameters::AggregatedRunInfo::buildAggregatedRunInfo(o2::ccdb::BasicCCDBManager::instance(), run); + // first bc of the first orbit + bcSOR = runInfo.orbitSOR * nBCsPerOrbit; + // duration of TF in bcs + nBCsPerTF = runInfo.orbitsPerTF * nBCsPerOrbit; + // SOR and EOR timestamps + sorTimestamp = runInfo.sor; + eorTimestamp = runInfo.eor; + // timestamp of the middle of the run used to access run-wise CCDB entries + int64_t ts = runInfo.sor / 2 + runInfo.eor / 2; + // QC info + std::map metadata; + metadata["run"] = Form("%d", run); + ccdb->setFatalWhenNull(0); + mapRCT = ccdb->getSpecific>("Users/j/jian/RCT", ts, metadata); + ccdb->setFatalWhenNull(1); + if (mapRCT == nullptr) { + LOGP(info, "rct object missing... inserting dummy rct flags"); + mapRCT = new std::map; + mapRCT->insert(std::pair(sorTimestamp, 0)); + } + } + + // store rct flags + uint32_t rct = lastRCT; + int64_t thisTF = (globalBC - bcSOR) / nBCsPerTF; + if (mapRCT != nullptr && thisTF != lastTF) { // skip for unanchored runs; do it once per TF + auto itrct = mapRCT->upper_bound(timestamp); + if (itrct != mapRCT->begin()) + itrct--; + rct = itrct->second; + LOGP(debug, "sor={} eor={} ts={} rct={}", sorTimestamp, eorTimestamp, timestamp, rct); + lastRCT = rct; + lastTF = thisTF; + } + return rct; + } + + void process(soa::Join const& straEvSels_004) { for (auto& values : straEvSels_004) { straEvSels_005(values.sel8(), @@ -55,7 +113,7 @@ struct straevselsconverter5 { values.energyCommonZNC(), values.flags(), 0 /*dummy Alias value*/, - 0 /*dummy Rct value*/); + getRctRaw(values.runNumber(), values.timestamp(), values.globalBC()) /* Rct value*/); } } }; diff --git a/PWGLF/TableProducer/Strangeness/Converters/zdcneutronsconverter.cxx b/PWGLF/TableProducer/Strangeness/Converters/zdcneutronsconverter.cxx new file mode 100644 index 00000000000..ad081a43052 --- /dev/null +++ b/PWGLF/TableProducer/Strangeness/Converters/zdcneutronsconverter.cxx @@ -0,0 +1,34 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" +#include "PWGLF/DataModel/LFStrangenessMLTables.h" + +using namespace o2; +using namespace o2::framework; + +// +struct zdcneutronsconverter { + Produces zdcNeutrons; // Primary neutrons within ZDC acceptance + Produces zdcNeutronsMCCollRefs; // references collisions from ZDCNeutrons + + void process(aod::StraEvSels const&) + { + } +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc)}; +} From 19f68ad32f24d83aa384893e8c9ffaf1b1067de3 Mon Sep 17 00:00:00 2001 From: Mattia Faggin Date: Thu, 15 May 2025 07:37:30 +0200 Subject: [PATCH 1278/1650] [DPG] Add TF border cut. (#11180) Co-authored-by: Mattia Faggin --- DPG/Tasks/AOTTrack/qaEfficiency.cxx | 39 ++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/DPG/Tasks/AOTTrack/qaEfficiency.cxx b/DPG/Tasks/AOTTrack/qaEfficiency.cxx index f308ccb8568..a55d205ed57 100644 --- a/DPG/Tasks/AOTTrack/qaEfficiency.cxx +++ b/DPG/Tasks/AOTTrack/qaEfficiency.cxx @@ -231,6 +231,7 @@ struct QaEfficiency { Configurable doPtEta{"doPtEta", false, "Flag to produce the efficiency vs pT and Eta"}; Configurable doPtRadius{"doPtRadius", false, "Flag to produce the efficiency vs pT and Radius"}; Configurable applyEvSel{"applyEvSel", 0, "Flag to apply event selection: 0 -> no event selection, 1 -> Run 2 event selection, 2 -> Run 3 event selection"}; + Configurable applyTimeFrameBorderCut{"applyTimeFrameBorderCut", false, "Flag to apply the TF border cut"}; // Custom track cuts for debug purposes TrackSelection customTrackCuts; struct : ConfigurableGroup { @@ -264,6 +265,7 @@ struct QaEfficiency { using CollisionCandidatesMC = o2::soa::Join; using TrackCandidates = o2::soa::Join; using TrackCandidatesMC = o2::soa::Join; + using BCsInfo = soa::Join; // Histograms HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -972,6 +974,7 @@ struct QaEfficiency { histos.get(HIST("eventSelection"))->GetXaxis()->SetBinLabel(3, "Passed Contrib."); histos.get(HIST("eventSelection"))->GetXaxis()->SetBinLabel(4, "Passed Position"); + histos.get(HIST("eventSelection"))->GetXaxis()->SetBinLabel(5, "Passed Time Frame border cut"); if (doprocessMC) { histos.add("MC/generatedCollisions", "Generated Collisions", kTH1D, {{10, 0.5, 10.5, "Generated collisions"}}); @@ -1265,7 +1268,7 @@ struct QaEfficiency { for (const auto& mother : mothers) { for (const auto& pdgToCheck : mothersPDGs.value) { if (mother.pdgCode() == pdgToCheck) { - motherIsAccepted = true; // Mother matches the list of specified PDGs + motherIsAccepted = true; // Mother matches the list of specified PDGs hPtmotherGenerated[histogramIndex]->Fill(mother.pt()); // Fill generated pT for mother break; } @@ -1454,6 +1457,12 @@ struct QaEfficiency { if constexpr (doFillHistograms) { histos.fill(HIST("eventSelection"), 4); } + if (applyTimeFrameBorderCut && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { + return false; + } + if constexpr (doFillHistograms) { + histos.fill(HIST("eventSelection"), 5); + } return true; } @@ -1743,7 +1752,8 @@ struct QaEfficiency { // o2::soa::SmallGroups const& collisions, CollisionCandidatesMC const& collisions, TrackCandidatesMC const& tracks, - o2::aod::McParticles const& mcParticles) + o2::aod::McParticles const& mcParticles, + BCsInfo const&) { /// loop over generated collisions @@ -1874,6 +1884,13 @@ struct QaEfficiency { continue; } } + // apply time-frame border cut also to the generated collision + if (applyTimeFrameBorderCut) { + auto bc = mcCollision.bc_as(); + if (!bc.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { + continue; + } + } } /// only to fill denominator of ITS-TPC matched primary tracks only in MC events with at least 1 reco. vtx @@ -1922,6 +1939,13 @@ struct QaEfficiency { continue; } } + // apply time-frame border cut also to the generated collision + if (applyTimeFrameBorderCut) { + auto bc = mcCollision.bc_as(); + if (!bc.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { + continue; + } + } // Loop on particles to fill the denominator float dNdEta = 0; // Multiplicity @@ -1976,7 +2000,8 @@ struct QaEfficiency { void processMCWithoutCollisions(TrackCandidatesMC const& tracks, o2::aod::Collisions const&, o2::aod::McParticles const& mcParticles, - o2::aod::McCollisions const&) + o2::aod::McCollisions const&, + BCsInfo const&) { // Track loop for (const auto& track : tracks) { @@ -2028,6 +2053,14 @@ struct QaEfficiency { continue; } } + // apply time-frame border cut also to the generated collision + if (applyTimeFrameBorderCut) { + const auto mcCollision = mcParticle.mcCollision(); + auto bc = mcCollision.bc_as(); + if (!bc.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { + continue; + } + } // search for particles from HF decays if (keepOnlyHfParticles && !RecoDecay::getCharmHadronOrigin(mcParticles, mcParticle, /*searchUpToQuark*/ true)) { From ded2224f06bdc486680832a0dcc17995bd041f87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Thu, 15 May 2025 10:17:22 +0200 Subject: [PATCH 1279/1650] [PWGHF] Add B0 derived-data creator. Add ML in B0 selector (#11163) --- PWGHF/Core/HfMlResponseB0ToDPi.h | 96 ++-- .../candidateSelectorB0ToDPiReduced.cxx | 2 +- .../DataModel/CandidateReconstructionTables.h | 41 +- PWGHF/DataModel/DerivedTables.h | 123 ++++- PWGHF/TableProducer/CMakeLists.txt | 7 +- .../candidateSelectorB0ToDPi.cxx | 173 +++++-- .../derivedDataCreatorB0ToDPi.cxx | 431 ++++++++++++++++++ 7 files changed, 747 insertions(+), 126 deletions(-) create mode 100644 PWGHF/TableProducer/derivedDataCreatorB0ToDPi.cxx diff --git a/PWGHF/Core/HfMlResponseB0ToDPi.h b/PWGHF/Core/HfMlResponseB0ToDPi.h index 1e2f82c028f..7f6c1c80cc5 100644 --- a/PWGHF/Core/HfMlResponseB0ToDPi.h +++ b/PWGHF/Core/HfMlResponseB0ToDPi.h @@ -12,6 +12,7 @@ /// \file HfMlResponseB0ToDPi.h /// \brief Class to compute the ML response for B0 → D∓ π± analysis selections /// \author Alexandre Bigot , IPHC Strasbourg +/// \author Vít Kučera , Inha University #ifndef PWGHF_CORE_HFMLRESPONSEB0TODPI_H_ #define PWGHF_CORE_HFMLRESPONSEB0TODPI_H_ @@ -59,6 +60,14 @@ break; \ } +// +// Make FEATURE from an element of VECTOR at INDEX. +#define CHECK_AND_FILL_VEC_B0_INDEX(FEATURE, VECTOR, INDEX) \ + case static_cast(InputFeaturesB0ToDPi::FEATURE): { \ + inputFeatures.emplace_back((VECTOR)[INDEX]); \ + break; \ + } + namespace o2::analysis { @@ -84,7 +93,7 @@ enum class InputFeaturesB0ToDPi : uint8_t { tpcTofNSigmaPi1 }; -template +template class HfMlResponseB0ToDPi : public HfMlResponse { public: @@ -99,57 +108,50 @@ class HfMlResponseB0ToDPi : public HfMlResponse /// \return inputFeatures vector template std::vector getInputFeatures(T1 const& candidate, - T2 const& prong1) + T2 const& prong1, + const std::vector* mlScoresD = nullptr) { std::vector inputFeatures; for (const auto& idx : MlResponse::mCachedIndices) { + switch (idx) { + CHECK_AND_FILL_VEC_B0(ptProng0); + CHECK_AND_FILL_VEC_B0(ptProng1); + CHECK_AND_FILL_VEC_B0(impactParameter0); + CHECK_AND_FILL_VEC_B0(impactParameter1); + CHECK_AND_FILL_VEC_B0(impactParameterProduct); + CHECK_AND_FILL_VEC_B0(chi2PCA); + CHECK_AND_FILL_VEC_B0(decayLength); + CHECK_AND_FILL_VEC_B0(decayLengthXY); + CHECK_AND_FILL_VEC_B0(decayLengthNormalised); + CHECK_AND_FILL_VEC_B0(decayLengthXYNormalised); + CHECK_AND_FILL_VEC_B0(cpa); + CHECK_AND_FILL_VEC_B0(cpaXY); + CHECK_AND_FILL_VEC_B0(maxNormalisedDeltaIP); + // TPC PID variable + CHECK_AND_FILL_VEC_B0_FULL(prong1, tpcNSigmaPi1, tpcNSigmaPi); + // TOF PID variable + CHECK_AND_FILL_VEC_B0_FULL(prong1, tofNSigmaPi1, tofNSigmaPi); + // Combined PID variables + CHECK_AND_FILL_VEC_B0_FUNC(prong1, tpcTofNSigmaPi1, o2::pid_tpc_tof_utils::getTpcTofNSigmaPi1); + } if constexpr (withDmesMl) { - switch (idx) { - CHECK_AND_FILL_VEC_B0(ptProng0); - CHECK_AND_FILL_VEC_B0(ptProng1); - CHECK_AND_FILL_VEC_B0(impactParameter0); - CHECK_AND_FILL_VEC_B0(impactParameter1); - CHECK_AND_FILL_VEC_B0(impactParameterProduct); - CHECK_AND_FILL_VEC_B0(chi2PCA); - CHECK_AND_FILL_VEC_B0(decayLength); - CHECK_AND_FILL_VEC_B0(decayLengthXY); - CHECK_AND_FILL_VEC_B0(decayLengthNormalised); - CHECK_AND_FILL_VEC_B0(decayLengthXYNormalised); - CHECK_AND_FILL_VEC_B0(cpa); - CHECK_AND_FILL_VEC_B0(cpaXY); - CHECK_AND_FILL_VEC_B0(maxNormalisedDeltaIP); - CHECK_AND_FILL_VEC_B0(prong0MlScoreBkg); - CHECK_AND_FILL_VEC_B0(prong0MlScorePrompt); - CHECK_AND_FILL_VEC_B0(prong0MlScoreNonprompt); - // TPC PID variable - CHECK_AND_FILL_VEC_B0_FULL(prong1, tpcNSigmaPi1, tpcNSigmaPi); - // TOF PID variable - CHECK_AND_FILL_VEC_B0_FULL(prong1, tofNSigmaPi1, tofNSigmaPi); - // Combined PID variables - CHECK_AND_FILL_VEC_B0_FUNC(prong1, tpcTofNSigmaPi1, o2::pid_tpc_tof_utils::getTpcTofNSigmaPi1); - } - } else { - switch (idx) { - CHECK_AND_FILL_VEC_B0(ptProng0); - CHECK_AND_FILL_VEC_B0(ptProng1); - CHECK_AND_FILL_VEC_B0(impactParameter0); - CHECK_AND_FILL_VEC_B0(impactParameter1); - CHECK_AND_FILL_VEC_B0(impactParameterProduct); - CHECK_AND_FILL_VEC_B0(chi2PCA); - CHECK_AND_FILL_VEC_B0(decayLength); - CHECK_AND_FILL_VEC_B0(decayLengthXY); - CHECK_AND_FILL_VEC_B0(decayLengthNormalised); - CHECK_AND_FILL_VEC_B0(decayLengthXYNormalised); - CHECK_AND_FILL_VEC_B0(cpa); - CHECK_AND_FILL_VEC_B0(cpaXY); - CHECK_AND_FILL_VEC_B0(maxNormalisedDeltaIP); - // TPC PID variable - CHECK_AND_FILL_VEC_B0_FULL(prong1, tpcNSigmaPi1, tpcNSigmaPi); - // TOF PID variable - CHECK_AND_FILL_VEC_B0_FULL(prong1, tofNSigmaPi1, tofNSigmaPi); - // Combined PID variables - CHECK_AND_FILL_VEC_B0_FUNC(prong1, tpcTofNSigmaPi1, o2::pid_tpc_tof_utils::getTpcTofNSigmaPi1); + if constexpr (reduced) { + switch (idx) { + CHECK_AND_FILL_VEC_B0(prong0MlScoreBkg); + CHECK_AND_FILL_VEC_B0(prong0MlScorePrompt); + CHECK_AND_FILL_VEC_B0(prong0MlScoreNonprompt); + } + } else { + if (mlScoresD) { + switch (idx) { + CHECK_AND_FILL_VEC_B0_INDEX(prong0MlScoreBkg, *mlScoresD, 0); + CHECK_AND_FILL_VEC_B0_INDEX(prong0MlScorePrompt, *mlScoresD, 1); + CHECK_AND_FILL_VEC_B0_INDEX(prong0MlScoreNonprompt, *mlScoresD, 2); + } + } else { + LOG(fatal) << "ML scores of D not provided"; + } } } } diff --git a/PWGHF/D2H/TableProducer/candidateSelectorB0ToDPiReduced.cxx b/PWGHF/D2H/TableProducer/candidateSelectorB0ToDPiReduced.cxx index 2ad0f29869a..4bab1d49cc4 100644 --- a/PWGHF/D2H/TableProducer/candidateSelectorB0ToDPiReduced.cxx +++ b/PWGHF/D2H/TableProducer/candidateSelectorB0ToDPiReduced.cxx @@ -78,7 +78,7 @@ struct HfCandidateSelectorB0ToDPiReduced { // variable that will store the value of selectionFlagD (defined in dataCreatorDplusPiReduced.cxx) int mySelectionFlagD = -1; - o2::analysis::HfMlResponseB0ToDPi hfMlResponse; + o2::analysis::HfMlResponseB0ToDPi hfMlResponse; float outputMlNotPreselected = -1.; std::vector outputMl = {}; o2::ccdb::CcdbApi ccdbApi; diff --git a/PWGHF/DataModel/CandidateReconstructionTables.h b/PWGHF/DataModel/CandidateReconstructionTables.h index 8c2039afee6..71fdf92561b 100644 --- a/PWGHF/DataModel/CandidateReconstructionTables.h +++ b/PWGHF/DataModel/CandidateReconstructionTables.h @@ -243,6 +243,7 @@ DECLARE_SOA_INDEX_COLUMN(Collision, collision); //! Collision DECLARE_SOA_INDEX_COLUMN_FULL(Prong0, prong0, int, Tracks, "_0"); //! Index to first prong DECLARE_SOA_INDEX_COLUMN_FULL(Prong1, prong1, int, Tracks, "_1"); //! Index to second prong DECLARE_SOA_INDEX_COLUMN_FULL(Prong2, prong2, int, Tracks, "_2"); //! Index to third prong +DECLARE_SOA_INDEX_COLUMN_FULL(Prong3, prong3, int, Tracks, "_3"); //! Index to fourth prong DECLARE_SOA_INDEX_COLUMN(V0, v0); //! Index to V0 prong DECLARE_SOA_INDEX_COLUMN(Cascade, cascade); //! Index to cascade prong DECLARE_SOA_COLUMN(HFflag, hfflag, uint8_t); //! Bitmap to store selection results, o2-linter: disable=name/o2-column (written to disk) @@ -483,28 +484,28 @@ DECLARE_SOA_COLUMN(ImpactParameterZ2, impactParameterZ2, float); DECLARE_SOA_COLUMN(ErrorImpactParameterZ2, errorImpactParameterZ2, float); //! DECLARE_SOA_DYNAMIC_COLUMN(ImpactParameterZNormalised2, impactParameterZNormalised2, //! [](float dca, float err) -> float { return dca / err; }); -/// prong PID nsigma DECLARE_SOA_COLUMN(NProngsContributorsPV, nProngsContributorsPV, uint8_t); //! number of prongs contributing to the primary-vertex reconstruction DECLARE_SOA_COLUMN(BitmapProngsContributorsPV, bitmapProngsContributorsPV, uint8_t); //! bitmap with booleans indicating prongs contributing to the primary-vertex reconstruction -DECLARE_SOA_COLUMN(NSigTpcPi0, nSigTpcPi0, float); //! TPC nSigma for pion hypothesis - prong 0 -DECLARE_SOA_COLUMN(NSigTpcPi1, nSigTpcPi1, float); //! TPC nSigma for pion hypothesis - prong 1 -DECLARE_SOA_COLUMN(NSigTpcPi2, nSigTpcPi2, float); //! TPC nSigma for pion hypothesis - prong 2 -DECLARE_SOA_COLUMN(NSigTpcKa0, nSigTpcKa0, float); //! TPC nSigma for kaon hypothesis - prong 0 -DECLARE_SOA_COLUMN(NSigTpcKa1, nSigTpcKa1, float); //! TPC nSigma for kaon hypothesis - prong 1 -DECLARE_SOA_COLUMN(NSigTpcKa2, nSigTpcKa2, float); //! TPC nSigma for kaon hypothesis - prong 2 -DECLARE_SOA_COLUMN(NSigTpcPr0, nSigTpcPr0, float); //! TPC nSigma for proton hypothesis - prong 0 -DECLARE_SOA_COLUMN(NSigTpcPr1, nSigTpcPr1, float); //! TPC nSigma for proton hypothesis - prong 1 -DECLARE_SOA_COLUMN(NSigTpcPr2, nSigTpcPr2, float); //! TPC nSigma for proton hypothesis - prong 2 -DECLARE_SOA_COLUMN(NSigTofPi0, nSigTofPi0, float); //! TOF nSigma for pion hypothesis - prong 0 -DECLARE_SOA_COLUMN(NSigTofPi1, nSigTofPi1, float); //! TOF nSigma for pion hypothesis - prong 1 -DECLARE_SOA_COLUMN(NSigTofPi2, nSigTofPi2, float); //! TOF nSigma for pion hypothesis - prong 2 -DECLARE_SOA_COLUMN(NSigTofKa0, nSigTofKa0, float); //! TOF nSigma for kaon hypothesis - prong 0 -DECLARE_SOA_COLUMN(NSigTofKa1, nSigTofKa1, float); //! TOF nSigma for kaon hypothesis - prong 1 -DECLARE_SOA_COLUMN(NSigTofKa2, nSigTofKa2, float); //! TOF nSigma for kaon hypothesis - prong 2 -DECLARE_SOA_COLUMN(NSigTofPr0, nSigTofPr0, float); //! TOF nSigma for proton hypothesis - prong 0 -DECLARE_SOA_COLUMN(NSigTofPr1, nSigTofPr1, float); //! TOF nSigma for proton hypothesis - prong 1 -DECLARE_SOA_COLUMN(NSigTofPr2, nSigTofPr2, float); //! TOF nSigma for proton hypothesis - prong 2 -DECLARE_SOA_DYNAMIC_COLUMN(TpcTofNSigmaPi0, tpcTofNSigmaPi0, //! Combined NSigma separation with the TPC & TOF detectors for pion - prong 0 +/// prong PID nsigma +DECLARE_SOA_COLUMN(NSigTpcPi0, nSigTpcPi0, float); //! TPC nSigma for pion hypothesis - prong 0 +DECLARE_SOA_COLUMN(NSigTpcPi1, nSigTpcPi1, float); //! TPC nSigma for pion hypothesis - prong 1 +DECLARE_SOA_COLUMN(NSigTpcPi2, nSigTpcPi2, float); //! TPC nSigma for pion hypothesis - prong 2 +DECLARE_SOA_COLUMN(NSigTpcKa0, nSigTpcKa0, float); //! TPC nSigma for kaon hypothesis - prong 0 +DECLARE_SOA_COLUMN(NSigTpcKa1, nSigTpcKa1, float); //! TPC nSigma for kaon hypothesis - prong 1 +DECLARE_SOA_COLUMN(NSigTpcKa2, nSigTpcKa2, float); //! TPC nSigma for kaon hypothesis - prong 2 +DECLARE_SOA_COLUMN(NSigTpcPr0, nSigTpcPr0, float); //! TPC nSigma for proton hypothesis - prong 0 +DECLARE_SOA_COLUMN(NSigTpcPr1, nSigTpcPr1, float); //! TPC nSigma for proton hypothesis - prong 1 +DECLARE_SOA_COLUMN(NSigTpcPr2, nSigTpcPr2, float); //! TPC nSigma for proton hypothesis - prong 2 +DECLARE_SOA_COLUMN(NSigTofPi0, nSigTofPi0, float); //! TOF nSigma for pion hypothesis - prong 0 +DECLARE_SOA_COLUMN(NSigTofPi1, nSigTofPi1, float); //! TOF nSigma for pion hypothesis - prong 1 +DECLARE_SOA_COLUMN(NSigTofPi2, nSigTofPi2, float); //! TOF nSigma for pion hypothesis - prong 2 +DECLARE_SOA_COLUMN(NSigTofKa0, nSigTofKa0, float); //! TOF nSigma for kaon hypothesis - prong 0 +DECLARE_SOA_COLUMN(NSigTofKa1, nSigTofKa1, float); //! TOF nSigma for kaon hypothesis - prong 1 +DECLARE_SOA_COLUMN(NSigTofKa2, nSigTofKa2, float); //! TOF nSigma for kaon hypothesis - prong 2 +DECLARE_SOA_COLUMN(NSigTofPr0, nSigTofPr0, float); //! TOF nSigma for proton hypothesis - prong 0 +DECLARE_SOA_COLUMN(NSigTofPr1, nSigTofPr1, float); //! TOF nSigma for proton hypothesis - prong 1 +DECLARE_SOA_COLUMN(NSigTofPr2, nSigTofPr2, float); //! TOF nSigma for proton hypothesis - prong 2 +DECLARE_SOA_DYNAMIC_COLUMN(TpcTofNSigmaPi0, tpcTofNSigmaPi0, //! Combined NSigma separation with the TPC & TOF detectors for pion - prong 0 [](float tpcNSigmaPi0, float tofNSigmaPi0) -> float { return pid_tpc_tof_utils::combineNSigma(tpcNSigmaPi0, tofNSigmaPi0); }); DECLARE_SOA_DYNAMIC_COLUMN(TpcTofNSigmaPi1, tpcTofNSigmaPi1, //! Combined NSigma separation with the TPC & TOF detectors for pion - prong 1 [](float tpcNSigmaPi1, float tofNSigmaPi1) -> float { return pid_tpc_tof_utils::combineNSigma(tpcNSigmaPi1, tofNSigmaPi1); }); diff --git a/PWGHF/DataModel/DerivedTables.h b/PWGHF/DataModel/DerivedTables.h index 19f8d30ddbe..77f5f848ce2 100644 --- a/PWGHF/DataModel/DerivedTables.h +++ b/PWGHF/DataModel/DerivedTables.h @@ -37,7 +37,7 @@ namespace o2::aod // Ds+ → K− K+ π+ (todo) // composite species -// B0 → D− π+ (todo) +// B0 → D− π+ // B+ → D0 π+ // D*+ → D0 π+ @@ -203,6 +203,16 @@ DECLARE_SOA_COLUMN(FlagMcDecayChanGen, flagMcDecayChanGen, int8_t); //! resonant hf_track_index::Prong2Id, \ o2::soa::Marker); +// Declares the table with global indices for 4-prong candidates (Ids). +#define DECLARE_TABLE_CAND_ID_4P(_hf_type_, _hf_description_) \ + DECLARE_SOA_TABLE_STAGED(Hf##_hf_type_##Ids, "HF" _hf_description_ "ID", \ + hf_cand::CollisionId, \ + hf_track_index::Prong0Id, \ + hf_track_index::Prong1Id, \ + hf_track_index::Prong2Id, \ + hf_track_index::Prong3Id, \ + o2::soa::Marker); + // Declares the table with candidate selection flags (Sels). #define DECLARE_TABLE_CAND_SEL(_hf_type_, _hf_description_) \ DECLARE_SOA_TABLE_STAGED(Hf##_hf_type_##Sels, "HF" _hf_description_ "SEL", \ @@ -266,6 +276,11 @@ DECLARE_SOA_COLUMN(FlagMcDecayChanGen, flagMcDecayChanGen, int8_t); //! resonant DECLARE_TABLES_COMMON(_hf_type_, _hf_description_, _hf_namespace_) \ DECLARE_TABLE_CAND_ID_3P(_hf_type_, _hf_description_) +#define DECLARE_TABLES_4P(_hf_type_, _hf_description_, _hf_namespace_, _marker_number_) \ + constexpr uint Marker##_hf_type_ = _marker_number_; \ + DECLARE_TABLES_COMMON(_hf_type_, _hf_description_, _hf_namespace_) \ + DECLARE_TABLE_CAND_ID_4P(_hf_type_, _hf_description_) + // ================ // Declarations of common tables for individual species // ================ @@ -275,6 +290,11 @@ DECLARE_TABLES_3P(Lc, "LC", lc, 3); DECLARE_TABLES_3P(Dplus, "DP", dplus, 4); DECLARE_TABLES_3P(Bplus, "BP", bplus, 5); DECLARE_TABLES_3P(Dstar, "DST", dstar, 6); +// Workaround for the existing B0 macro in termios.h +#pragma push_macro("B0") +#undef B0 +DECLARE_TABLES_4P(B0, "B0", b0, 7); +#pragma pop_macro("B0") // ================ // Additional species-specific candidate tables @@ -364,6 +384,8 @@ DECLARE_SOA_COLUMN(NSigTpcTofPiSoftPi, nSigTpcTofPiSoftPi, float); // We don't want to link the charm candidate table because we want to avoid producing it. namespace hf_cand_par_charm { +DECLARE_SOA_COLUMN(Chi2PCACharm, chi2PCACharm, float); //! sum of (non-weighted) distances of the secondary vertex to its prongs +DECLARE_SOA_COLUMN(NProngsContributorsPVCharm, nProngsContributorsPVCharm, uint8_t); //! number of prongs contributing to the primary-vertex reconstruction DECLARE_SOA_COLUMN(CosThetaStarCharm, cosThetaStarCharm, float); //! cosine of theta star DECLARE_SOA_COLUMN(CpaCharm, cpaCharm, float); //! cosine of pointing angle DECLARE_SOA_COLUMN(CpaXYCharm, cpaXYCharm, float); //! cosine of pointing angle in the transverse plane @@ -374,6 +396,7 @@ DECLARE_SOA_COLUMN(DecayLengthXYCharm, decayLengthXYCharm, float); DECLARE_SOA_COLUMN(DecayLengthXYNormalisedCharm, decayLengthXYNormalisedCharm, float); //! decay length in the transverse plane divided by its uncertainty DECLARE_SOA_COLUMN(ImpactParameter0Charm, impactParameter0Charm, float); //! impact parameter of prong 0 DECLARE_SOA_COLUMN(ImpactParameter1Charm, impactParameter1Charm, float); //! impact parameter of prong 1 +DECLARE_SOA_COLUMN(ImpactParameter2Charm, impactParameter2Charm, float); //! impact parameter of prong 2 DECLARE_SOA_COLUMN(ImpactParameterNormalised0Charm, impactParameterNormalised0Charm, float); //! impact parameter of prong 0 divided by its uncertainty DECLARE_SOA_COLUMN(ImpactParameterNormalised1Charm, impactParameterNormalised1Charm, float); //! impact parameter of prong 1 divided by its uncertainty DECLARE_SOA_COLUMN(ImpactParameterNormalised2Charm, impactParameterNormalised2Charm, float); //! impact parameter of prong 2 divided by its uncertainty @@ -517,10 +540,6 @@ DECLARE_SOA_TABLE_STAGED(HfD0Mcs, "HFD0MC", //! Table with MC candidate info // B+ // ---------------- -// candidates for removal: -// PxProng0, PyProng0, PzProng0,... (same for 1, 2), we can keep Pt, Eta, Phi instead -// XY: CpaXY, DecayLengthXY, ErrorDecayLengthXY -// normalised: DecayLengthNormalised, DecayLengthXYNormalised, ImpactParameterNormalised0 DECLARE_SOA_TABLE_STAGED(HfBplusPars, "HFBPPAR", //! Table with candidate properties used for selection hf_cand::Chi2PCA, hf_cand_par::Cpa, @@ -593,14 +612,96 @@ DECLARE_SOA_TABLE_STAGED(HfBplusMcs, "HFBPMC", //! Table with MC candidate info hf_cand_mc::OriginMcRec, o2::soa::Marker); +// ---------------- +// B0 +// ---------------- + +DECLARE_SOA_TABLE_STAGED(HfB0Pars, "HFB0PAR", //! Table with candidate properties used for selection + hf_cand::Chi2PCA, + hf_cand_par::Cpa, + hf_cand_par::CpaXY, + hf_cand_par::DecayLength, + hf_cand_par::DecayLengthXY, + hf_cand_par::DecayLengthNormalised, + hf_cand_par::DecayLengthXYNormalised, + hf_cand_par::PtProng0, + hf_cand_par::PtProng1, + hf_cand::ImpactParameter0, + hf_cand::ImpactParameter1, + hf_cand_par::ImpactParameterNormalised0, + hf_cand_par::ImpactParameterNormalised1, + hf_cand_par::NSigTpcPiExpPi, + hf_cand_par::NSigTofPiExpPi, + hf_cand_par::NSigTpcTofPiExpPi, + hf_cand_par::NSigTpcKaExpPi, + hf_cand_par::NSigTofKaExpPi, + hf_cand_par::NSigTpcTofKaExpPi, + hf_cand_par::MaxNormalisedDeltaIP, + hf_cand_par::ImpactParameterProduct, + o2::soa::Marker); + +DECLARE_SOA_TABLE_STAGED(HfB0ParDpluss, "HFB0PARDP", //! Table with D+ candidate properties used for selection of B0 + hf_cand_par_charm::Chi2PCACharm, + hf_cand_par_charm::NProngsContributorsPVCharm, + hf_cand_par_charm::CpaCharm, + hf_cand_par_charm::CpaXYCharm, + hf_cand_par_charm::DecayLengthCharm, + hf_cand_par_charm::DecayLengthXYCharm, + hf_cand_par_charm::DecayLengthNormalisedCharm, + hf_cand_par_charm::DecayLengthXYNormalisedCharm, + hf_cand_par_charm::PtProng0Charm, + hf_cand_par_charm::PtProng1Charm, + hf_cand_par_charm::PtProng2Charm, + hf_cand_par_charm::ImpactParameter0Charm, + hf_cand_par_charm::ImpactParameter1Charm, + hf_cand_par_charm::ImpactParameter2Charm, + hf_cand_par_charm::ImpactParameterNormalised0Charm, + hf_cand_par_charm::ImpactParameterNormalised1Charm, + hf_cand_par_charm::ImpactParameterNormalised2Charm, + hf_cand_par_charm::NSigTpcPi0Charm, + hf_cand_par_charm::NSigTofPi0Charm, + hf_cand_par_charm::NSigTpcTofPi0Charm, + hf_cand_par_charm::NSigTpcKa1Charm, + hf_cand_par_charm::NSigTofKa1Charm, + hf_cand_par_charm::NSigTpcTofKa1Charm, + hf_cand_par_charm::NSigTpcPi2Charm, + hf_cand_par_charm::NSigTofPi2Charm, + hf_cand_par_charm::NSigTpcTofPi2Charm, + o2::soa::Marker); + +DECLARE_SOA_TABLE_STAGED(HfB0ParEs, "HFB0PARE", //! Table with additional candidate properties used for selection + hf_cand::XSecondaryVertex, + hf_cand::YSecondaryVertex, + hf_cand::ZSecondaryVertex, + hf_cand::ErrorDecayLength, + hf_cand::ErrorDecayLengthXY, + hf_cand_par::RSecondaryVertex, + hf_cand_par::PProng1, + hf_cand::PxProng1, + hf_cand::PyProng1, + hf_cand::PzProng1, + hf_cand::ErrorImpactParameter1, + hf_cand_par::CosThetaStar, + hf_cand_par::Ct, + o2::soa::Marker); + +DECLARE_SOA_TABLE_STAGED(HfB0Mls, "HFB0ML", //! Table with candidate selection ML scores + hf_cand_mc::MlScoreSig, + o2::soa::Marker); + +DECLARE_SOA_TABLE_STAGED(HfB0MlDpluss, "HFB0MLDP", //! Table with D+ candidate selection ML scores + hf_cand_mc_charm::MlScoresCharm, + o2::soa::Marker); + +DECLARE_SOA_TABLE_STAGED(HfB0Mcs, "HFB0MC", //! Table with MC candidate info + hf_cand_mc::FlagMcMatchRec, + hf_cand_mc::OriginMcRec, + o2::soa::Marker); + // ---------------- // Lc // ---------------- -// candidates for removal: -// PxProng0, PyProng0, PzProng0,... (same for 1, 2), we can keep Pt, Eta, Phi instead -// XY: CpaXY, DecayLengthXY, ErrorDecayLengthXY -// normalised: DecayLengthNormalised, DecayLengthXYNormalised, ImpactParameterNormalised0 DECLARE_SOA_TABLE_STAGED(HfLcPars, "HFLCPAR", //! Table with candidate properties used for selection hf_cand::Chi2PCA, hf_cand::NProngsContributorsPV, @@ -675,10 +776,6 @@ DECLARE_SOA_TABLE_STAGED(HfLcMcs, "HFLCMC", //! Table with MC candidate info // D+ // ---------------- -// candidates for removal: -// PxProng0, PyProng0, PzProng0,... (same for 1, 2), we can keep Pt, Eta, Phi instead -// XY: CpaXY, DecayLengthXY, ErrorDecayLengthXY -// normalised: DecayLengthNormalised, DecayLengthXYNormalised, ImpactParameterNormalised0 DECLARE_SOA_TABLE_STAGED(HfDplusPars, "HFDPPAR", //! Table with candidate properties used for selection hf_cand::Chi2PCA, hf_cand::NProngsContributorsPV, diff --git a/PWGHF/TableProducer/CMakeLists.txt b/PWGHF/TableProducer/CMakeLists.txt index 929e6a4c22b..c74e876761e 100644 --- a/PWGHF/TableProducer/CMakeLists.txt +++ b/PWGHF/TableProducer/CMakeLists.txt @@ -109,7 +109,7 @@ o2physics_add_dpl_workflow(candidate-creator-mc-gen o2physics_add_dpl_workflow(candidate-selector-b0-to-d-pi SOURCES candidateSelectorB0ToDPi.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::MLCore COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(candidate-selector-bplus-to-d0-pi @@ -295,6 +295,11 @@ o2physics_add_dpl_workflow(tree-creator-tcc-to-d0-d0-pi COMPONENT_NAME Analysis) # Derived-data creators +o2physics_add_dpl_workflow(derived-data-creator-b0-to-d-pi + SOURCES derivedDataCreatorB0ToDPi.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(derived-data-creator-bplus-to-d0-pi SOURCES derivedDataCreatorBplusToD0Pi.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore diff --git a/PWGHF/TableProducer/candidateSelectorB0ToDPi.cxx b/PWGHF/TableProducer/candidateSelectorB0ToDPi.cxx index 9387fb6261b..d262739438d 100644 --- a/PWGHF/TableProducer/candidateSelectorB0ToDPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorB0ToDPi.cxx @@ -14,8 +14,9 @@ /// /// \author Alexandre Bigot , IPHC Strasbourg -#include +#include #include +#include #include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" @@ -24,6 +25,7 @@ #include "Common/Core/TrackSelectorPID.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/HfMlResponseB0ToDPi.h" #include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" @@ -35,11 +37,12 @@ using namespace o2::analysis; struct HfCandidateSelectorB0ToDPi { Produces hfSelB0ToDPiCandidate; // table defined in CandidateSelectionTables.h + Produces hfMlB0ToDPiCandidate; // table defined in CandidateSelectionTables.h Configurable ptCandMin{"ptCandMin", 0., "Lower bound of candidate pT"}; Configurable ptCandMax{"ptCandMax", 50., "Upper bound of candidate pT"}; // Enable PID - Configurable usePid{"usePid", true, "Switch for PID selection at track level"}; + Configurable pionPidMethod{"pionPidMethod", 1, "PID selection method for the bachelor pion (0: none, 1: TPC or TOF, 2: TPC and TOF)"}; Configurable acceptPIDNotApplicable{"acceptPIDNotApplicable", true, "Switch to accept Status::NotApplicable [(NotApplicable for one detector) and (NotApplicable or Conditional for the other)] in PID selection"}; // TPC PID Configurable ptPidTpcMin{"ptPidTpcMin", 0.15, "Lower bound of track pT for TPC PID"}; @@ -54,21 +57,49 @@ struct HfCandidateSelectorB0ToDPi { // topological cuts Configurable> binsPt{"binsPt", std::vector{hf_cuts_b0_to_d_pi::vecBinsPt}, "pT bin limits"}; Configurable> cuts{"cuts", {hf_cuts_b0_to_d_pi::Cuts[0], hf_cuts_b0_to_d_pi::NBinsPt, hf_cuts_b0_to_d_pi::NCutVars, hf_cuts_b0_to_d_pi::labelsPt, hf_cuts_b0_to_d_pi::labelsCutVar}, "B0 candidate selection per pT bin"}; + // D-meson ML cuts + Configurable> binsPtDmesMl{"binsPtDmesMl", std::vector{hf_cuts_ml::vecBinsPt}, "D-meson pT bin limits for ML cuts"}; + Configurable> cutsDmesMl{"cutsDmesMl", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsDmesCutScore}, "D-meson ML cuts per pT bin"}; // QA switch Configurable activateQA{"activateQA", false, "Flag to enable QA histogram"}; - // check if selectionFlagD (defined in candidateCreatorB0.cxx) and usePid configurables are in sync + // B0 ML inference + Configurable applyB0Ml{"applyB0Ml", false, "Flag to apply ML selections"}; + Configurable> binsPtB0Ml{"binsPtB0Ml", std::vector{hf_cuts_ml::vecBinsPt}, "pT bin limits for ML application"}; + Configurable> cutDirB0Ml{"cutDirB0Ml", std::vector{hf_cuts_ml::vecCutDir}, "Whether to reject score values greater or smaller than the threshold"}; + Configurable> cutsB0Ml{"cutsB0Ml", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; + Configurable nClassesB0Ml{"nClassesB0Ml", static_cast(hf_cuts_ml::NCutScores), "Number of classes in ML model"}; + Configurable> namesInputFeatures{"namesInputFeatures", std::vector{"feature1", "feature2"}, "Names of ML model input features"}; + // CCDB configuration + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable> modelPathsCCDB{"modelPathsCCDB", std::vector{"path_ccdb/BDT_B0/"}, "Paths of models on CCDB"}; + Configurable> onnxFileNames{"onnxFileNames", std::vector{"ModelHandler_onnx_B0ToDPi.onnx"}, "ONNX file names for each pT bin (if not from CCDB full path)"}; + Configurable timestampCCDB{"timestampCCDB", -1, "timestamp of the ONNX file for ML model used to query in CCDB"}; + Configurable loadModelsFromCCDB{"loadModelsFromCCDB", false, "Flag to enable or disable the loading of models from CCDB"}; + + o2::analysis::HfMlResponseB0ToDPi hfMlResponse; + float outputMlNotPreselected = -1.; + std::vector outputMl = {}; + o2::ccdb::CcdbApi ccdbApi; - bool selectionFlagDAndUsePidInSync = true; - TrackSelectorPi selectorPion; HfHelper hfHelper; + TrackSelectorPi selectorPion; - using TracksPidWithSel = soa::Join; + using TracksPion = soa::Join; HistogramRegistry registry{"registry"}; - void init(InitContext& initContext) + void init(InitContext const&) { - if (usePid) { + std::array doprocess{doprocessSelection, doprocessSelectionWithDmesMl}; + if ((std::accumulate(doprocess.begin(), doprocess.end(), 0)) != 1) { + LOGP(fatal, "Only one process function for data should be enabled at a time."); + } + + if (pionPidMethod < 0 || pionPidMethod > 2) { + LOGP(fatal, "Invalid PID option in configurable, please set 0 (no PID), 1 (TPC or TOF), or 2 (TPC and TOF)"); + } + + if (pionPidMethod != 0) { selectorPion.setRangePtTpc(ptPidTpcMin, ptPidTpcMax); selectorPion.setRangeNSigmaTpc(-nSigmaTpcMax, nSigmaTpcMax); selectorPion.setRangeNSigmaTpcCondTof(-nSigmaTpcCombinedMax, nSigmaTpcCombinedMax); @@ -84,6 +115,7 @@ struct HfCandidateSelectorB0ToDPi { labels[1 + SelectionStep::RecoSkims] = "Skims selection"; labels[1 + SelectionStep::RecoTopol] = "Skims & Topological selections"; labels[1 + SelectionStep::RecoPID] = "Skims & Topological & PID selections"; + labels[1 + aod::SelectionStep::RecoMl] = "ML selection"; static const AxisSpec axisSelections = {kNBinsSelections, 0.5, kNBinsSelections + 0.5, ""}; registry.add("hSelections", "Selections;;#it{p}_{T} (GeV/#it{c})", {HistType::kTH2F, {axisSelections, {(std::vector)binsPt, "#it{p}_{T} (GeV/#it{c})"}}}); for (int iBin = 0; iBin < kNBinsSelections; ++iBin) { @@ -91,76 +123,129 @@ struct HfCandidateSelectorB0ToDPi { } } - int selectionFlagD = -1; - auto& workflows = initContext.services().get(); - for (const DeviceSpec& device : workflows.devices) { - if (device.name.compare("hf-candidate-creator-b0") == 0) { - for (const auto& option : device.options) { - if (option.name.compare("selectionFlagD") == 0) { - selectionFlagD = option.defaultValue.get(); - LOGF(info, "selectionFlagD = %d", selectionFlagD); - } - } + if (applyB0Ml) { + hfMlResponse.configure(binsPtB0Ml, cutsB0Ml, cutDirB0Ml, nClassesB0Ml); + if (loadModelsFromCCDB) { + ccdbApi.init(ccdbUrl); + hfMlResponse.setModelPathsCCDB(onnxFileNames, ccdbApi, modelPathsCCDB, timestampCCDB); + } else { + hfMlResponse.setModelPathsLocal(onnxFileNames); } - } - - if (usePid && !TESTBIT(selectionFlagD, SelectionStep::RecoPID)) { - selectionFlagDAndUsePidInSync = false; - LOG(warning) << "PID selections required on B0 daughters (usePid=true) but no PID selections on D candidates were required a priori (selectionFlagD<7). Set selectionFlagD=7 in hf-candidate-creator-b0"; - } - if (!usePid && TESTBIT(selectionFlagD, SelectionStep::RecoPID)) { - selectionFlagDAndUsePidInSync = false; - LOG(warning) << "No PID selections required on B0 daughters (usePid=false) but PID selections on D candidates were required a priori (selectionFlagD=7). Set selectionFlagD<7 in hf-candidate-creator-b0"; + hfMlResponse.cacheInputFeaturesIndices(namesInputFeatures); + hfMlResponse.init(); } } - void process(aod::HfCandB0 const& hfCandsB0, - TracksPidWithSel const&) + /// Main function to perform B0 candidate creation + /// \param withDmesMl is the flag to use the table with ML scores for the D- daughter (only possible if present in the derived data) + /// \param hfCandsB0 B0 candidates + /// \param pionTracks pion tracks + template + void runSelection(Cands const& hfCandsB0, + CandsDmes const& /*hfCandsD*/, + TracksPion const& /*pionTracks*/) { + for (const auto& hfCandB0 : hfCandsB0) { - int statusB0ToDPi = 0; + int statusB0 = 0; auto ptCandB0 = hfCandB0.pt(); - SETBIT(statusB0ToDPi, SelectionStep::RecoSkims); // RecoSkims = 0 --> statusB0ToDPi = 1 + SETBIT(statusB0, SelectionStep::RecoSkims); // RecoSkims = 0 --> statusB0 = 1 if (activateQA) { registry.fill(HIST("hSelections"), 2 + SelectionStep::RecoSkims, ptCandB0); } // topological cuts if (!hfHelper.selectionB0ToDPiTopol(hfCandB0, cuts, binsPt)) { - hfSelB0ToDPiCandidate(statusB0ToDPi); + hfSelB0ToDPiCandidate(statusB0); + if (applyB0Ml) { + hfMlB0ToDPiCandidate(outputMlNotPreselected); + } // LOGF(info, "B0 candidate selection failed at topology selection"); continue; } - SETBIT(statusB0ToDPi, SelectionStep::RecoTopol); // RecoTopol = 1 --> statusB0ToDPi = 3 + + auto trackPi = hfCandB0.template prong1_as(); + auto hfCandD = hfCandB0.template prong0_as(); + + std::vector mlScoresD; + if constexpr (withDmesMl) { + std::copy(hfCandD.mlProbDplusToPiKPi().begin(), hfCandD.mlProbDplusToPiKPi().end(), std::back_inserter(mlScoresD)); + + if (!hfHelper.selectionDmesMlScoresForB(hfCandD, cutsDmesMl, binsPtDmesMl, mlScoresD)) { + hfSelB0ToDPiCandidate(statusB0); + if (applyB0Ml) { + hfMlB0ToDPiCandidate(outputMlNotPreselected); + } + // LOGF(info, "B0 candidate selection failed at D-meson ML selection"); + continue; + } + } + + SETBIT(statusB0, SelectionStep::RecoTopol); // RecoTopol = 1 --> statusB0 = 3 if (activateQA) { registry.fill(HIST("hSelections"), 2 + SelectionStep::RecoTopol, ptCandB0); } - // checking if selectionFlagD and usePid are in sync - if (!selectionFlagDAndUsePidInSync) { - hfSelB0ToDPiCandidate(statusB0ToDPi); - continue; - } // track-level PID selection - if (usePid) { - auto trackPi = hfCandB0.prong1_as(); - int pidTrackPi = selectorPion.statusTpcAndTof(trackPi); + if (pionPidMethod) { + int pidTrackPi{TrackSelectorPID::Status::NotApplicable}; + if (pionPidMethod == 1) { + pidTrackPi = selectorPion.statusTpcOrTof(trackPi); + } else { + pidTrackPi = selectorPion.statusTpcAndTof(trackPi); + } if (!hfHelper.selectionB0ToDPiPid(pidTrackPi, acceptPIDNotApplicable.value)) { // LOGF(info, "B0 candidate selection failed at PID selection"); - hfSelB0ToDPiCandidate(statusB0ToDPi); + hfSelB0ToDPiCandidate(statusB0); + if (applyB0Ml) { + hfMlB0ToDPiCandidate(outputMlNotPreselected); + } continue; } - SETBIT(statusB0ToDPi, SelectionStep::RecoPID); // RecoPID = 2 --> statusB0ToDPi = 7 + SETBIT(statusB0, SelectionStep::RecoPID); // RecoPID = 2 --> statusB0 = 7 if (activateQA) { registry.fill(HIST("hSelections"), 2 + SelectionStep::RecoPID, ptCandB0); } } + if (applyB0Ml) { + // B0 ML selections + std::vector inputFeatures = hfMlResponse.getInputFeatures(hfCandB0, trackPi, &mlScoresD); + bool isSelectedMl = hfMlResponse.isSelectedMl(inputFeatures, ptCandB0, outputMl); + hfMlB0ToDPiCandidate(outputMl[1]); // storing ML score for signal class + + if (!isSelectedMl) { + hfSelB0ToDPiCandidate(statusB0); + continue; + } + SETBIT(statusB0, SelectionStep::RecoMl); // RecoML = 3 --> statusB0 = 15 if pionPidMethod, 11 otherwise + if (activateQA) { + registry.fill(HIST("hSelections"), 2 + SelectionStep::RecoMl, ptCandB0); + } + } - hfSelB0ToDPiCandidate(statusB0ToDPi); + hfSelB0ToDPiCandidate(statusB0); // LOGF(info, "B0 candidate selection passed all selections"); } } + + void processSelection(HfCandB0 const& hfCandsB0, + aod::HfCand3ProngWPidPiKa const& hfCandsD, + TracksPion const& pionTracks) + { + runSelection(hfCandsB0, hfCandsD, pionTracks); + } // processSelection + + PROCESS_SWITCH(HfCandidateSelectorB0ToDPi, processSelection, "Process selection without ML scores of D mesons", true); + + void processSelectionWithDmesMl(HfCandB0 const& hfCandsB0, + soa::Join const& hfCandsD, + TracksPion const& pionTracks) + { + runSelection(hfCandsB0, hfCandsD, pionTracks); + } // processSelectionWithDmesMl + + PROCESS_SWITCH(HfCandidateSelectorB0ToDPi, processSelectionWithDmesMl, "Process selection with ML scores of D mesons", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) diff --git a/PWGHF/TableProducer/derivedDataCreatorB0ToDPi.cxx b/PWGHF/TableProducer/derivedDataCreatorB0ToDPi.cxx new file mode 100644 index 00000000000..0dda7288169 --- /dev/null +++ b/PWGHF/TableProducer/derivedDataCreatorB0ToDPi.cxx @@ -0,0 +1,431 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file derivedDataCreatorB0ToDPi.cxx +/// \brief Producer of derived tables of B+ candidates, collisions and MC particles +/// \note Based on derivedDataCreatorBplusToD0Pi.cxx +/// +/// \author Vít Kučera , Inha University + +#include +#include +#include + +#include "CommonConstants/PhysicsConstants.h" +#include "Framework/AnalysisTask.h" +#include "Framework/runDataProcessing.h" + +#include "Common/Core/RecoDecay.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/Multiplicity.h" + +#include "PWGLF/DataModel/mcCentrality.h" + +#include "PWGHF/Core/HfHelper.h" +#include "PWGHF/DataModel/CandidateReconstructionTables.h" +#include "PWGHF/DataModel/CandidateSelectionTables.h" +#include "PWGHF/DataModel/DerivedTables.h" +#include "PWGHF/Utils/utilsDerivedData.h" +#include "PWGHF/Utils/utilsPid.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::aod::pid_tpc_tof_utils; +using namespace o2::analysis::hf_derived; + +/// Writes the full information in an output TTree +struct HfDerivedDataCreatorB0ToDPi { + HfProducesDerivedData< + o2::aod::HfB0Bases, + o2::aod::HfB0CollBases, + o2::aod::HfB0CollIds, + o2::aod::HfB0McCollBases, + o2::aod::HfB0McCollIds, + o2::aod::HfB0McRCollIds, + o2::aod::HfB0PBases, + o2::aod::HfB0PIds> + rowsCommon; + // Candidates + Produces rowCandidatePar; + Produces rowCandidateParDplus; + Produces rowCandidateParE; + Produces rowCandidateSel; + Produces rowCandidateMl; + Produces rowCandidateMlDplus; + Produces rowCandidateId; + Produces rowCandidateMc; + + // Switches for filling tables + HfConfigurableDerivedData confDerData; + Configurable fillCandidatePar{"fillCandidatePar", true, "Fill candidate parameters"}; + Configurable fillCandidateParDplus{"fillCandidateParDplus", true, "Fill D+ candidate parameters"}; + Configurable fillCandidateParE{"fillCandidateParE", true, "Fill candidate extended parameters"}; + Configurable fillCandidateSel{"fillCandidateSel", true, "Fill candidate selection flags"}; + Configurable fillCandidateMl{"fillCandidateMl", true, "Fill candidate selection ML scores"}; + Configurable fillCandidateMlDplus{"fillCandidateMlDplus", true, "Fill D+ candidate selection ML scores"}; + Configurable fillCandidateId{"fillCandidateId", true, "Fill original indices from the candidate table"}; + Configurable fillCandidateMc{"fillCandidateMc", true, "Fill candidate MC info"}; + // Parameters for production of training samples + Configurable downSampleBkgFactor{"downSampleBkgFactor", 1., "Fraction of background candidates to keep for ML trainings"}; + Configurable ptMaxForDownSample{"ptMaxForDownSample", 10., "Maximum pt for the application of the downsampling factor"}; + + HfHelper hfHelper; + SliceCache cache; + static constexpr double mass{o2::constants::physics::MassB0}; + + using CollisionsWCentMult = soa::Join; + using CollisionsWMcCentMult = soa::Join; + using TracksWPid = soa::Join; + using SelectedCandidates = soa::Filtered>; + using SelectedCandidatesMc = soa::Filtered>; + using SelectedCandidatesMl = soa::Filtered>; + using SelectedCandidatesMcMl = soa::Filtered>; + using MatchedGenCandidatesMc = soa::Filtered>; + using TypeMcCollisions = soa::Join; + using THfCandDaughtersMl = soa::Join; + + Filter filterSelectCandidates = (aod::hf_sel_candidate_b0::isSelB0ToDPi & static_cast(BIT(aod::SelectionStep::RecoMl - 1))) != 0; + Filter filterMcGenMatching = nabs(aod::hf_cand_b0::flagMcMatchGen) == static_cast(BIT(aod::hf_cand_b0::DecayType::B0ToDPi)); + + Preslice candidatesPerCollision = aod::hf_cand::collisionId; + Preslice candidatesMcPerCollision = aod::hf_cand::collisionId; + Preslice candidatesMlPerCollision = aod::hf_cand::collisionId; + Preslice candidatesMcMlPerCollision = aod::hf_cand::collisionId; + Preslice mcParticlesPerMcCollision = aod::mcparticle::mcCollisionId; + + // trivial partitions for all candidates to allow "->sliceByCached" inside processCandidates + Partition candidatesAll = aod::hf_sel_candidate_b0::isSelB0ToDPi >= 0; + Partition candidatesMcAll = aod::hf_sel_candidate_b0::isSelB0ToDPi >= 0; + Partition candidatesMlAll = aod::hf_sel_candidate_b0::isSelB0ToDPi >= 0; + Partition candidatesMcMlAll = aod::hf_sel_candidate_b0::isSelB0ToDPi >= 0; + // partitions for signal and background + Partition candidatesMcSig = nabs(aod::hf_cand_b0::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_b0::DecayType::B0ToDPi)); + Partition candidatesMcBkg = nabs(aod::hf_cand_b0::flagMcMatchRec) != static_cast(BIT(aod::hf_cand_b0::DecayType::B0ToDPi)); + Partition candidatesMcMlSig = nabs(aod::hf_cand_b0::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_b0::DecayType::B0ToDPi)); + Partition candidatesMcMlBkg = nabs(aod::hf_cand_b0::flagMcMatchRec) != static_cast(BIT(aod::hf_cand_b0::DecayType::B0ToDPi)); + + void init(InitContext const&) + { + std::array doprocess{doprocessData, doprocessMcSig, doprocessMcBkg, doprocessMcAll, doprocessDataMl, doprocessMcMlSig, doprocessMcMlBkg, doprocessMcMlAll, doprocessMcGenOnly}; + if (std::accumulate(doprocess.begin(), doprocess.end(), 0) != 1) { + LOGP(fatal, "Only one process function can be enabled at a time."); + } + rowsCommon.init(confDerData); + } + + template + void fillTablesCandidate(const T& candidate, const U& prongCharm, const V& prongBachelor, int candFlag, double invMass, + double ct, double y, int8_t flagMc, int8_t origin, float mlScore, const std::vector& mlScoresCharm) + { + rowsCommon.fillTablesCandidate(candidate, invMass, y); + if (fillCandidatePar) { + rowCandidatePar( + candidate.chi2PCA(), + candidate.cpa(), + candidate.cpaXY(), + candidate.decayLength(), + candidate.decayLengthXY(), + candidate.decayLengthNormalised(), + candidate.decayLengthXYNormalised(), + candidate.ptProng0(), + candidate.ptProng1(), + candidate.impactParameter0(), + candidate.impactParameter1(), + candidate.impactParameterNormalised0(), + candidate.impactParameterNormalised1(), + prongBachelor.tpcNSigmaPi(), + prongBachelor.tofNSigmaPi(), + prongBachelor.tpcTofNSigmaPi(), + prongBachelor.tpcNSigmaKa(), + prongBachelor.tofNSigmaKa(), + prongBachelor.tpcTofNSigmaKa(), + candidate.maxNormalisedDeltaIP(), + candidate.impactParameterProduct()); + } + if (fillCandidateParDplus) { + rowCandidateParDplus( + prongCharm.chi2PCA(), + prongCharm.nProngsContributorsPV(), + prongCharm.cpa(), + prongCharm.cpaXY(), + prongCharm.decayLength(), + prongCharm.decayLengthXY(), + prongCharm.decayLengthNormalised(), + prongCharm.decayLengthXYNormalised(), + prongCharm.ptProng0(), + prongCharm.ptProng1(), + prongCharm.ptProng2(), + prongCharm.impactParameter0(), + prongCharm.impactParameter1(), + prongCharm.impactParameter2(), + prongCharm.impactParameterNormalised0(), + prongCharm.impactParameterNormalised1(), + prongCharm.impactParameterNormalised2(), + prongCharm.nSigTpcPi0(), + prongCharm.nSigTofPi0(), + prongCharm.tpcTofNSigmaPi0(), + prongCharm.nSigTpcKa1(), + prongCharm.nSigTofKa1(), + prongCharm.tpcTofNSigmaKa1(), + prongCharm.nSigTpcPi2(), + prongCharm.nSigTofPi2(), + prongCharm.tpcTofNSigmaPi2()); + } + if (fillCandidateParE) { + rowCandidateParE( + candidate.xSecondaryVertex(), + candidate.ySecondaryVertex(), + candidate.zSecondaryVertex(), + candidate.errorDecayLength(), + candidate.errorDecayLengthXY(), + candidate.rSecondaryVertex(), + RecoDecay::p(candidate.pxProng1(), candidate.pyProng1(), candidate.pzProng1()), + candidate.pxProng1(), + candidate.pyProng1(), + candidate.pzProng1(), + candidate.errorImpactParameter1(), + hfHelper.cosThetaStarB0(candidate), + ct); + } + if (fillCandidateSel) { + rowCandidateSel( + BIT(candFlag)); + } + if (fillCandidateMl) { + rowCandidateMl( + mlScore); + } + if (fillCandidateMlDplus) { + rowCandidateMlDplus( + mlScoresCharm); + } + if (fillCandidateId) { + rowCandidateId( + candidate.collisionId(), + prongCharm.prong0Id(), + prongCharm.prong1Id(), + prongCharm.prong2Id(), + candidate.prong1Id()); + } + if (fillCandidateMc) { + rowCandidateMc( + flagMc, + origin); + } + } + + template + void processCandidates(CollType const& collisions, + Partition& candidates, + CandCharmType const&, + TracksWPid const&, + aod::BCs const&) + { + // Fill collision properties + if constexpr (isMc) { + if (confDerData.fillMcRCollId) { + rowsCommon.matchedCollisions.clear(); + } + } + auto sizeTableColl = collisions.size(); + rowsCommon.reserveTablesColl(sizeTableColl); + for (const auto& collision : collisions) { + auto thisCollId = collision.globalIndex(); + auto candidatesThisColl = candidates->sliceByCached(aod::hf_cand::collisionId, thisCollId, cache); // FIXME + auto sizeTableCand = candidatesThisColl.size(); + LOGF(debug, "Rec. collision %d has %d candidates", thisCollId, sizeTableCand); + // Skip collisions without HF candidates (and without HF particles in matched MC collisions if saving indices of reconstructed collisions matched to MC collisions) + bool mcCollisionHasMcParticles{false}; + if constexpr (isMc) { + mcCollisionHasMcParticles = confDerData.fillMcRCollId && collision.has_mcCollision() && rowsCommon.hasMcParticles[collision.mcCollisionId()]; + LOGF(debug, "Rec. collision %d has MC collision %d with MC particles? %s", thisCollId, collision.mcCollisionId(), mcCollisionHasMcParticles ? "yes" : "no"); + } + if (sizeTableCand == 0 && (!confDerData.fillMcRCollId || !mcCollisionHasMcParticles)) { + LOGF(debug, "Skipping rec. collision %d", thisCollId); + continue; + } + LOGF(debug, "Filling rec. collision %d at derived index %d", thisCollId, rowsCommon.rowCollBase.lastIndex() + 1); + rowsCommon.fillTablesCollision(collision); + + // Fill candidate properties + rowsCommon.reserveTablesCandidates(sizeTableCand); + reserveTable(rowCandidatePar, fillCandidatePar, sizeTableCand); + reserveTable(rowCandidateParDplus, fillCandidateParDplus, sizeTableCand); + reserveTable(rowCandidateParE, fillCandidateParE, sizeTableCand); + reserveTable(rowCandidateSel, fillCandidateSel, sizeTableCand); + reserveTable(rowCandidateMl, fillCandidateMl, sizeTableCand); + reserveTable(rowCandidateMlDplus, fillCandidateMlDplus, sizeTableCand); + reserveTable(rowCandidateId, fillCandidateId, sizeTableCand); + if constexpr (isMc) { + reserveTable(rowCandidateMc, fillCandidateMc, sizeTableCand); + } + int8_t flagMcRec = 0, origin = 0; + for (const auto& candidate : candidatesThisColl) { + if constexpr (isMl) { + if (!TESTBIT(candidate.isSelB0ToDPi(), aod::SelectionStep::RecoMl)) { + continue; + } + } + if constexpr (isMc) { + flagMcRec = candidate.flagMcMatchRec(); + origin = candidate.originMcRec(); + if constexpr (onlyBkg) { + if (TESTBIT(std::abs(flagMcRec), aod::hf_cand_b0::DecayType::B0ToDPi)) { + continue; + } + if (downSampleBkgFactor < 1.) { + float pseudoRndm = candidate.ptProng0() * 1000. - static_cast(candidate.ptProng0() * 1000); + if (candidate.pt() < ptMaxForDownSample && pseudoRndm >= downSampleBkgFactor) { + continue; + } + } + } + if constexpr (onlySig) { + if (!TESTBIT(std::abs(flagMcRec), aod::hf_cand_b0::DecayType::B0ToDPi)) { + continue; + } + } + } + auto prongCharm = candidate.template prong0_as(); + auto prongBachelor = candidate.template prong1_as(); + double ct = hfHelper.ctB0(candidate); + double y = hfHelper.yB0(candidate); + float massB0ToDPi = hfHelper.invMassB0ToDPi(candidate); + float mlScoreB0ToDPi{-1.f}; + std::vector mlScoresDplus; + std::copy(prongCharm.mlProbDplusToPiKPi().begin(), prongCharm.mlProbDplusToPiKPi().end(), std::back_inserter(mlScoresDplus)); + if constexpr (isMl) { + mlScoreB0ToDPi = candidate.mlProbB0ToDPi(); + } + fillTablesCandidate(candidate, prongCharm, prongBachelor, 0, massB0ToDPi, ct, y, flagMcRec, origin, mlScoreB0ToDPi, mlScoresDplus); + } + } + } + + void processData(CollisionsWCentMult const& collisions, + SelectedCandidates const&, + THfCandDaughtersMl const& candidatesDaughters, + TracksWPid const& tracks, + aod::BCs const& bcs) + { + processCandidates(collisions, candidatesAll, candidatesDaughters, tracks, bcs); + } + PROCESS_SWITCH(HfDerivedDataCreatorB0ToDPi, processData, "Process data", true); + + void processMcSig(CollisionsWMcCentMult const& collisions, + SelectedCandidatesMc const&, + TypeMcCollisions const& mcCollisions, + MatchedGenCandidatesMc const& mcParticles, + THfCandDaughtersMl const& candidatesDaughters, + TracksWPid const& tracks, + aod::BCs const& bcs) + { + rowsCommon.preProcessMcCollisions(mcCollisions, mcParticlesPerMcCollision, mcParticles); + processCandidates(collisions, candidatesMcSig, candidatesDaughters, tracks, bcs); + rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, mass); + } + PROCESS_SWITCH(HfDerivedDataCreatorB0ToDPi, processMcSig, "Process MC only for signals", false); + + void processMcBkg(CollisionsWMcCentMult const& collisions, + SelectedCandidatesMc const&, + TypeMcCollisions const& mcCollisions, + MatchedGenCandidatesMc const& mcParticles, + THfCandDaughtersMl const& candidatesDaughters, + TracksWPid const& tracks, + aod::BCs const& bcs) + { + rowsCommon.preProcessMcCollisions(mcCollisions, mcParticlesPerMcCollision, mcParticles); + processCandidates(collisions, candidatesMcBkg, candidatesDaughters, tracks, bcs); + rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, mass); + } + PROCESS_SWITCH(HfDerivedDataCreatorB0ToDPi, processMcBkg, "Process MC only for background", false); + + void processMcAll(CollisionsWMcCentMult const& collisions, + SelectedCandidatesMc const&, + TypeMcCollisions const& mcCollisions, + MatchedGenCandidatesMc const& mcParticles, + THfCandDaughtersMl const& candidatesDaughters, + TracksWPid const& tracks, + aod::BCs const& bcs) + { + rowsCommon.preProcessMcCollisions(mcCollisions, mcParticlesPerMcCollision, mcParticles); + processCandidates(collisions, candidatesMcAll, candidatesDaughters, tracks, bcs); + rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, mass); + } + PROCESS_SWITCH(HfDerivedDataCreatorB0ToDPi, processMcAll, "Process MC", false); + + // ML versions + + void processDataMl(CollisionsWCentMult const& collisions, + SelectedCandidatesMl const&, + THfCandDaughtersMl const& candidatesDaughters, + TracksWPid const& tracks, + aod::BCs const& bcs) + { + processCandidates(collisions, candidatesMlAll, candidatesDaughters, tracks, bcs); + } + PROCESS_SWITCH(HfDerivedDataCreatorB0ToDPi, processDataMl, "Process data with ML", false); + + void processMcMlSig(CollisionsWMcCentMult const& collisions, + SelectedCandidatesMcMl const&, + TypeMcCollisions const& mcCollisions, + MatchedGenCandidatesMc const& mcParticles, + THfCandDaughtersMl const& candidatesDaughters, + TracksWPid const& tracks, + aod::BCs const& bcs) + { + rowsCommon.preProcessMcCollisions(mcCollisions, mcParticlesPerMcCollision, mcParticles); + processCandidates(collisions, candidatesMcMlSig, candidatesDaughters, tracks, bcs); + rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, mass); + } + PROCESS_SWITCH(HfDerivedDataCreatorB0ToDPi, processMcMlSig, "Process MC with ML only for signals", false); + + void processMcMlBkg(CollisionsWMcCentMult const& collisions, + SelectedCandidatesMcMl const&, + TypeMcCollisions const& mcCollisions, + MatchedGenCandidatesMc const& mcParticles, + THfCandDaughtersMl const& candidatesDaughters, + TracksWPid const& tracks, + aod::BCs const& bcs) + { + rowsCommon.preProcessMcCollisions(mcCollisions, mcParticlesPerMcCollision, mcParticles); + processCandidates(collisions, candidatesMcMlBkg, candidatesDaughters, tracks, bcs); + rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, mass); + } + PROCESS_SWITCH(HfDerivedDataCreatorB0ToDPi, processMcMlBkg, "Process MC with ML only for background", false); + + void processMcMlAll(CollisionsWMcCentMult const& collisions, + SelectedCandidatesMcMl const&, + TypeMcCollisions const& mcCollisions, + MatchedGenCandidatesMc const& mcParticles, + THfCandDaughtersMl const& candidatesDaughters, + TracksWPid const& tracks, + aod::BCs const& bcs) + { + rowsCommon.preProcessMcCollisions(mcCollisions, mcParticlesPerMcCollision, mcParticles); + processCandidates(collisions, candidatesMcMlAll, candidatesDaughters, tracks, bcs); + rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, mass); + } + PROCESS_SWITCH(HfDerivedDataCreatorB0ToDPi, processMcMlAll, "Process MC with ML", false); + + void processMcGenOnly(TypeMcCollisions const& mcCollisions, + MatchedGenCandidatesMc const& mcParticles) + { + rowsCommon.processMcParticles(mcCollisions, mcParticlesPerMcCollision, mcParticles, mass); + } + PROCESS_SWITCH(HfDerivedDataCreatorB0ToDPi, processMcGenOnly, "Process MC gen. only", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} From 082711c7ad1c042ae33f33e1c98d66fdbce71f06 Mon Sep 17 00:00:00 2001 From: Francesco Mazzaschi <43742195+fmazzasc@users.noreply.github.com> Date: Thu, 15 May 2025 10:22:47 +0200 Subject: [PATCH 1280/1650] [PWGLF] Add PV refit w/o ITS fake track (#11181) Co-authored-by: Francesco Mazzaschi Co-authored-by: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> --- PWGLF/Tasks/Strangeness/CMakeLists.txt | 2 +- PWGLF/Tasks/Strangeness/nonPromptCascade.cxx | 66 ++++++++++++++++---- 2 files changed, 56 insertions(+), 12 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/CMakeLists.txt b/PWGLF/Tasks/Strangeness/CMakeLists.txt index 9ae8e095784..569768bd273 100644 --- a/PWGLF/Tasks/Strangeness/CMakeLists.txt +++ b/PWGLF/Tasks/Strangeness/CMakeLists.txt @@ -51,7 +51,7 @@ o2physics_add_dpl_workflow(cascadecorrelations o2physics_add_dpl_workflow(non-prompt-cascade SOURCES nonPromptCascade.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2::ReconstructionDataFormats O2Physics::AnalysisCore O2::DetectorsBase O2Physics::EventFilteringUtils + PUBLIC_LINK_LIBRARIES O2::Framework O2::ReconstructionDataFormats O2Physics::AnalysisCore O2::DetectorsBase O2::DetectorsVertexing O2Physics::EventFilteringUtils COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(k0mixedevents diff --git a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx index 6c1ea1f39f6..51f6ba34bb2 100644 --- a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx +++ b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx @@ -24,6 +24,8 @@ #include "Common/DataModel/Multiplicity.h" #include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" +#include "DetectorsVertexing/PVertexer.h" +#include "ReconstructionDataFormats/Vertex.h" #include "DataFormatsParameters/GRPMagField.h" #include "DataFormatsParameters/GRPObject.h" #include "DataFormatsTPC/BetheBlochAleph.h" @@ -171,8 +173,12 @@ struct NonPromptCascadeTask { using CollisionCandidatesRun3 = soa::Join; using CollisionCandidatesRun3MC = soa::Join; + Preslice perCollision = aod::track::collisionId; + Preslice perCollisionMC = aod::track::collisionId; + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Configurable cfgPropToPCA{"cfgPropToPCA", true, "create tracks version propagated to PCA"}; + Configurable cfgRedoPV{"cfgRedoPV", true, "redo PV"}; Configurable cfgUseAbsDCA{"cfgUseAbsDCA", true, "Minimise abs. distance rather than chi2"}; Configurable cfgMaxR{"cfgMaxR", 200., "reject PCA's above this radius"}; Configurable cfgMaxDZIni{"cfgMaxDZIni", 4., "reject (if>0) PCA candidate if tracks DZ exceeds threshold"}; @@ -189,6 +195,7 @@ struct NonPromptCascadeTask { Zorro mZorro; OutputObj mZorroSummary{"ZorroSummary"}; + SliceCache cache; Service mCCDB; int mRunNumber = 0; @@ -212,7 +219,7 @@ struct NonPromptCascadeTask { if (static_cast(cfgMaterialCorrection.value) == o2::base::Propagator::MatCorrType::USEMatCorrLUT) { auto* lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(mCCDB->getForRun("GLO/Param/MatLUT", mRunNumber)); - o2::base::Propagator::Instance(true)->setMatLUT(lut); + o2::base::Propagator::Instance()->setMatLUT(lut); } } @@ -244,6 +251,38 @@ struct NonPromptCascadeTask { } } + template + bool recalculatePV(CollisionType const& collision, TrackType const& tracks, int idToRemove, o2::dataformats::VertexBase& primaryVertex) + { + // slice tracks by collision + o2::vertexing::PVertexer vertexer; + std::vector pvContributors = {}; + std::vector pvContributorsMask = {}; + + auto tracksInCollision = doprocessTrackedCascadesMC ? tracks.sliceBy(perCollisionMC, collision.globalIndex()) : tracks.sliceBy(perCollision, collision.globalIndex()); + // loop over tracks + for (auto const& trkInColl : tracksInCollision) { // Loop on tracks + if (trkInColl.isPVContributor()) { + pvContributors.push_back(getTrackParCov(trkInColl)); + idToRemove == trkInColl.globalIndex() ? pvContributorsMask.push_back(false) : pvContributorsMask.push_back(true); + } + } + LOG(debug) << "Tracks pushed to the vector: " << pvContributors.size(); + vertexer.init(); + bool canRefit = vertexer.prepareVertexRefit(pvContributors, primaryVertex); + if (!canRefit) { + return false; + } + // refit the vertex + auto newPV = vertexer.refitVertex(pvContributorsMask, primaryVertex); + // set the new vertex to primaryVertex + primaryVertex.setX(newPV.getX()); + primaryVertex.setY(newPV.getY()); + primaryVertex.setZ(newPV.getZ()); + primaryVertex.setCov(newPV.getCov()); + return true; + } + void zorroAccounting(const auto& collisions) { if (cfgSkimmedProcessing) { @@ -261,7 +300,7 @@ struct NonPromptCascadeTask { } template - void fillCandidatesVector(CollisionType const&, auto const& cascades, auto& candidates) + void fillCandidatesVector(CollisionType const&, TrackType const& tracks, auto const& cascades, auto& candidates) { const auto& getCascade = [](auto const& candidate) { @@ -279,7 +318,7 @@ struct NonPromptCascadeTask { auto bc = collision.template bc_as(); initCCDB(bc); - const auto primaryVertex = getPrimaryVertex(collision); + auto primaryVertex = getPrimaryVertex(collision); const auto& casc = getCascade(candidate); const auto& bachelor = casc.template bachelor_as(); @@ -435,6 +474,11 @@ struct NonPromptCascadeTask { if constexpr (requires { candidate.track(); }) { const auto& track = candidate.template track_as(); const auto& ITStrack = candidate.template itsTrack_as(); + if (cfgRedoPV && ITStrack.isPVContributor()) { + if (!recalculatePV(collision, tracks, ITStrack.globalIndex(), primaryVertex)) { + continue; + } + } cascPVContribs |= ITStrack.isPVContributor() << 0; auto trackTrkParCov = getTrackParCov(track); o2::base::Propagator::Instance()->propagateToDCA(primaryVertex, trackTrkParCov, mBz, 2.f, matCorr, &motherDCA); @@ -555,19 +599,19 @@ struct NonPromptCascadeTask { void processTrackedCascadesMC(CollisionCandidatesRun3MC const& collisions, aod::AssignedTrackedCascades const& trackedCascades, aod::Cascades const& /*cascades*/, - aod::V0s const& /*v0s*/, TracksExtMC const& /*tracks*/, + aod::V0s const& /*v0s*/, TracksExtMC const& tracks, aod::McParticles const& mcParticles, aod::McCollisions const&, aod::BCsWithTimestamps const&) { - fillCandidatesVector(collisions, trackedCascades, gCandidates); + fillCandidatesVector(collisions, tracks, trackedCascades, gCandidates); fillMCtable(mcParticles, collisions, gCandidates); } PROCESS_SWITCH(NonPromptCascadeTask, processTrackedCascadesMC, "process cascades from strangeness tracking: MC analysis", true); void processCascadesMC(CollisionCandidatesRun3MC const& collisions, aod::Cascades const& cascades, - aod::V0s const& /*v0s*/, TracksExtMC const& /*tracks*/, + aod::V0s const& /*v0s*/, TracksExtMC const& tracks, aod::McParticles const& mcParticles, aod::McCollisions const&, aod::BCsWithTimestamps const&) { - fillCandidatesVector(collisions, cascades, gCandidatesNT); + fillCandidatesVector(collisions, tracks, cascades, gCandidatesNT); fillMCtable(mcParticles, collisions, gCandidatesNT); } PROCESS_SWITCH(NonPromptCascadeTask, processCascadesMC, "process cascades: MC analysis", false); @@ -603,21 +647,21 @@ struct NonPromptCascadeTask { void processTrackedCascadesData(CollisionCandidatesRun3 const& collisions, aod::AssignedTrackedCascades const& trackedCascades, aod::Cascades const& /*cascades*/, - aod::V0s const& /*v0s*/, TracksExtData const& /*tracks*/, + aod::V0s const& /*v0s*/, TracksExtData const& tracks, aod::BCsWithTimestamps const&) { zorroAccounting(collisions); - fillCandidatesVector(collisions, trackedCascades, gCandidates); + fillCandidatesVector(collisions, tracks, trackedCascades, gCandidates); fillDataTable(gCandidates); } PROCESS_SWITCH(NonPromptCascadeTask, processTrackedCascadesData, "process cascades from strangeness tracking: Data analysis", false); void processCascadesData(CollisionCandidatesRun3 const& collisions, aod::Cascades const& cascades, - aod::V0s const& /*v0s*/, TracksExtData const& /*tracks*/, + aod::V0s const& /*v0s*/, TracksExtData const& tracks, aod::BCsWithTimestamps const&) { zorroAccounting(collisions); - fillCandidatesVector(collisions, cascades, gCandidatesNT); + fillCandidatesVector(collisions, tracks, cascades, gCandidatesNT); fillDataTable(gCandidatesNT); } PROCESS_SWITCH(NonPromptCascadeTask, processCascadesData, "process cascades: Data analysis", false); From 65245c03a40d9ed801a6c8409c396f018a79e197 Mon Sep 17 00:00:00 2001 From: Rrantu <156880782+Rrantu@users.noreply.github.com> Date: Thu, 15 May 2025 17:58:22 +0800 Subject: [PATCH 1281/1650] [PWGHF] Rebin some KFParticle QA histograms and fix previously existing O2 linter errors (#11204) --- .../candidateCreatorXic0Omegac0.cxx | 152 +++++++++--------- 1 file changed, 79 insertions(+), 73 deletions(-) diff --git a/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx b/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx index 277fc56227e..0e977c5143e 100644 --- a/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx +++ b/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx @@ -14,6 +14,7 @@ /// \author Federica Zanone , Heidelberg University /// \author Ruiqi Yin , Fudan University /// \author Yunfan Liu , China University of Geosciences +/// \author Ran Tu , Fudan University #ifndef HomogeneousField #define HomogeneousField // o2-linter: disable=name/macro (required by KFParticle) @@ -480,8 +481,9 @@ struct HfCandidateCreatorXic0Omegac0 { std::array vertexCasc = {casc.x(), casc.y(), casc.z()}; std::array pVecCasc = {casc.px(), casc.py(), casc.pz()}; std::array covCasc = {0.}; - constexpr int MomInd[6] = {9, 13, 14, 18, 19, 20}; // cov matrix elements for momentum component - for (int i = 0; i < 6; i++) { + constexpr int NumCovElements = 6; + constexpr int MomInd[NumCovElements] = {9, 13, 14, 18, 19, 20}; // cov matrix elements for momentum component + for (int i = 0; i < NumCovElements; i++) { covCasc[MomInd[i]] = casc.momentumCovMat()[i]; covCasc[i] = casc.positionCovMat()[i]; } @@ -1919,63 +1921,65 @@ struct HfCandidateCreatorXic0Omegac0Mc { // QA if (doprocessMcXicToXiPiKfQa) { AxisSpec axisPt{20, 0., 20.}; + AxisSpec axisDelta{1000, -0.5, 0.5}; AxisSpec axisPull{2000, -10., 10.}; + AxisSpec axisPtRes{400, -0.2, 0.2}; // mass over pt registry.add("hV0MassPullVsPt", "m_{PULL}(V0) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); registry.add("hXiMassPullVsPt", "m_{PULL}(#Xi^{-}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); registry.add("hXic0MassPullVsPt", "m_{PULL}(#Xic0) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); // delta - registry.add("hV0DauPosXDelta", "x^{p} - x^{MC}", kTH1D, {axisPull}); - registry.add("hV0DauPosYDelta", "y^{p} - y^{MC}", kTH1D, {axisPull}); - registry.add("hV0DauPosZDelta", "z^{p} - z^{MC}", kTH1D, {axisPull}); - registry.add("hV0DauNegXDelta", "x^{#pi^{-}} - x^{MC}", kTH1D, {axisPull}); - registry.add("hV0DauNegYDelta", "y^{#pi^{-}} - y^{MC}", kTH1D, {axisPull}); - registry.add("hV0DauNegZDelta", "z^{#pi^{-}} - z^{MC}", kTH1D, {axisPull}); - registry.add("hV0XDelta", "x^{#Lambda} - x^{MC}", kTH1D, {axisPull}); - registry.add("hV0YDelta", "y^{#Lambda} - y^{MC}", kTH1D, {axisPull}); - registry.add("hV0ZDelta", "z^{#Lambda} - z^{MC}", kTH1D, {axisPull}); - - registry.add("hXiBachelorXDelta", "x^{#pi^{-} from #Xi^{-}} - x^{MC}", kTH1D, {axisPull}); - registry.add("hXiBachelorYDelta", "y^{#pi^{-} from #Xi^{-}} - y^{MC}", kTH1D, {axisPull}); - registry.add("hXiBachelorZDelta", "z^{#pi^{-} from #Xi^{-}} - z^{MC}", kTH1D, {axisPull}); - - registry.add("hXiXDelta", "x^{#Xi^{-}} - x^{MC}", kTH1D, {axisPull}); - registry.add("hXiYDelta", "y^{#Xi^{-}} - y^{MC}", kTH1D, {axisPull}); - registry.add("hXiZDelta", "z^{#Xi^{-}} - z^{MC}", kTH1D, {axisPull}); - - registry.add("hXic0BachelorXDelta", "x^{#pi^{+} from #Xi_{c}^{0}} - x^{MC}", kTH1D, {axisPull}); - registry.add("hXic0BachelorYDelta", "y^{#pi^{+} from #Xi_{c}^{0}} - y^{MC}", kTH1D, {axisPull}); - registry.add("hXic0BachelorZDelta", "z^{#pi^{+} from #Xi_{c}^{0}} - z^{MC}", kTH1D, {axisPull}); - - registry.add("hXic0XDelta", "x^{#Xi_(c)^(0)} - x^{MC}", kTH1D, {axisPull}); - registry.add("hXic0YDelta", "y^{#Xi_(c)^(0)} - y^{MC}", kTH1D, {axisPull}); - registry.add("hXic0ZDelta", "z^{#Xi_(c)^(0)} - z^{MC}", kTH1D, {axisPull}); + registry.add("hV0DauPosXDelta", "x^{p} - x^{MC}", kTH1D, {axisDelta}); + registry.add("hV0DauPosYDelta", "y^{p} - y^{MC}", kTH1D, {axisDelta}); + registry.add("hV0DauPosZDelta", "z^{p} - z^{MC}", kTH1D, {axisDelta}); + registry.add("hV0DauNegXDelta", "x^{#pi^{-}} - x^{MC}", kTH1D, {axisDelta}); + registry.add("hV0DauNegYDelta", "y^{#pi^{-}} - y^{MC}", kTH1D, {axisDelta}); + registry.add("hV0DauNegZDelta", "z^{#pi^{-}} - z^{MC}", kTH1D, {axisDelta}); + registry.add("hV0XDelta", "x^{#Lambda} - x^{MC}", kTH1D, {axisDelta}); + registry.add("hV0YDelta", "y^{#Lambda} - y^{MC}", kTH1D, {axisDelta}); + registry.add("hV0ZDelta", "z^{#Lambda} - z^{MC}", kTH1D, {axisDelta}); + + registry.add("hXiBachelorXDelta", "x^{#pi^{-} from #Xi^{-}} - x^{MC}", kTH1D, {axisDelta}); + registry.add("hXiBachelorYDelta", "y^{#pi^{-} from #Xi^{-}} - y^{MC}", kTH1D, {axisDelta}); + registry.add("hXiBachelorZDelta", "z^{#pi^{-} from #Xi^{-}} - z^{MC}", kTH1D, {axisDelta}); + + registry.add("hXiXDelta", "x^{#Xi^{-}} - x^{MC}", kTH1D, {axisDelta}); + registry.add("hXiYDelta", "y^{#Xi^{-}} - y^{MC}", kTH1D, {axisDelta}); + registry.add("hXiZDelta", "z^{#Xi^{-}} - z^{MC}", kTH1D, {axisDelta}); + + registry.add("hXic0BachelorXDelta", "x^{#pi^{+} from #Xi_{c}^{0}} - x^{MC}", kTH1D, {axisDelta}); + registry.add("hXic0BachelorYDelta", "y^{#pi^{+} from #Xi_{c}^{0}} - y^{MC}", kTH1D, {axisDelta}); + registry.add("hXic0BachelorZDelta", "z^{#pi^{+} from #Xi_{c}^{0}} - z^{MC}", kTH1D, {axisDelta}); + + registry.add("hXic0XDelta", "x^{#Xi_(c)^(0)} - x^{MC}", kTH1D, {axisDelta}); + registry.add("hXic0YDelta", "y^{#Xi_(c)^(0)} - y^{MC}", kTH1D, {axisDelta}); + registry.add("hXic0ZDelta", "z^{#Xi_(c)^(0)} - z^{MC}", kTH1D, {axisDelta}); // delta over pt - registry.add("hV0DauPosXDeltaVsPt", "#Delta_{x}(p) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); - registry.add("hV0DauPosYDeltaVsPt", "#Delta_{y}(p) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); - registry.add("hV0DauPosZDeltaVsPt", "#Delta_{z}(p) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); - registry.add("hV0DauNegXDeltaVsPt", "#Delta_{x}(#pi) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); - registry.add("hV0DauNegYDeltaVsPt", "#Delta_{y}(#pi) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); - registry.add("hV0DauNegZDeltaVsPt", "#Delta_{z}(#pi) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); - registry.add("hV0XDeltaVsPt", "#Delta_{x}(#Lambda) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); - registry.add("hV0YDeltaVsPt", "#Delta_{y}(#Lambda) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); - registry.add("hV0ZDeltaVsPt", "#Delta_{z}(#Lambda) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); - - registry.add("hXiBachelorXDeltaVsPt", "#Delta_{x}(#pi^{-} from #Xi^{-}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); - registry.add("hXiBachelorYDeltaVsPt", "#Delta_{y}(#pi^{-} from #Xi^{-}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); - registry.add("hXiBachelorZDeltaVsPt", "#Delta_{z}(#pi^{-} from #Xi^{-}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); - - registry.add("hXiXDeltaVsPt", "#Delta_{x}(#Xi^{-}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); - registry.add("hXiYDeltaVsPt", "#Delta_{y}(#Xi^{-}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); - registry.add("hXiZDeltaVsPt", "#Delta_{z}(#Xi^{-}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); - - registry.add("hXic0BachelorXDeltaVsPt", "#Delta_{x}(#pi^{+} from #Xi_{c}^{0}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); - registry.add("hXic0BachelorYDeltaVsPt", "#Delta_{y}(#pi^{+} from #Xi_{c}^{0}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); - registry.add("hXic0BachelorZDeltaVsPt", "#Delta_{z}(#pi^{+} from #Xi_{c}^{0}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); - - registry.add("hXic0XDeltaVsPt", "#Delta_{x}(#Xi_{c}^{0}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); - registry.add("hXic0YDeltaVsPt", "#Delta_{y}(#Xi_{c}^{0}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); - registry.add("hXic0ZDeltaVsPt", "#Delta_{z}(#Xi_{c}^{0}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); + registry.add("hV0DauPosXDeltaVsPt", "#Delta_{x}(p) vs. p_{T}", HistType::kTH2D, {axisPt, axisDelta}); + registry.add("hV0DauPosYDeltaVsPt", "#Delta_{y}(p) vs. p_{T}", HistType::kTH2D, {axisPt, axisDelta}); + registry.add("hV0DauPosZDeltaVsPt", "#Delta_{z}(p) vs. p_{T}", HistType::kTH2D, {axisPt, axisDelta}); + registry.add("hV0DauNegXDeltaVsPt", "#Delta_{x}(#pi) vs. p_{T}", HistType::kTH2D, {axisPt, axisDelta}); + registry.add("hV0DauNegYDeltaVsPt", "#Delta_{y}(#pi) vs. p_{T}", HistType::kTH2D, {axisPt, axisDelta}); + registry.add("hV0DauNegZDeltaVsPt", "#Delta_{z}(#pi) vs. p_{T}", HistType::kTH2D, {axisPt, axisDelta}); + registry.add("hV0XDeltaVsPt", "#Delta_{x}(#Lambda) vs. p_{T}", HistType::kTH2D, {axisPt, axisDelta}); + registry.add("hV0YDeltaVsPt", "#Delta_{y}(#Lambda) vs. p_{T}", HistType::kTH2D, {axisPt, axisDelta}); + registry.add("hV0ZDeltaVsPt", "#Delta_{z}(#Lambda) vs. p_{T}", HistType::kTH2D, {axisPt, axisDelta}); + + registry.add("hXiBachelorXDeltaVsPt", "#Delta_{x}(#pi^{-} from #Xi^{-}) vs. p_{T}", HistType::kTH2D, {axisPt, axisDelta}); + registry.add("hXiBachelorYDeltaVsPt", "#Delta_{y}(#pi^{-} from #Xi^{-}) vs. p_{T}", HistType::kTH2D, {axisPt, axisDelta}); + registry.add("hXiBachelorZDeltaVsPt", "#Delta_{z}(#pi^{-} from #Xi^{-}) vs. p_{T}", HistType::kTH2D, {axisPt, axisDelta}); + + registry.add("hXiXDeltaVsPt", "#Delta_{x}(#Xi^{-}) vs. p_{T}", HistType::kTH2D, {axisPt, axisDelta}); + registry.add("hXiYDeltaVsPt", "#Delta_{y}(#Xi^{-}) vs. p_{T}", HistType::kTH2D, {axisPt, axisDelta}); + registry.add("hXiZDeltaVsPt", "#Delta_{z}(#Xi^{-}) vs. p_{T}", HistType::kTH2D, {axisPt, axisDelta}); + + registry.add("hXic0BachelorXDeltaVsPt", "#Delta_{x}(#pi^{+} from #Xi_{c}^{0}) vs. p_{T}", HistType::kTH2D, {axisPt, axisDelta}); + registry.add("hXic0BachelorYDeltaVsPt", "#Delta_{y}(#pi^{+} from #Xi_{c}^{0}) vs. p_{T}", HistType::kTH2D, {axisPt, axisDelta}); + registry.add("hXic0BachelorZDeltaVsPt", "#Delta_{z}(#pi^{+} from #Xi_{c}^{0}) vs. p_{T}", HistType::kTH2D, {axisPt, axisDelta}); + + registry.add("hXic0XDeltaVsPt", "#Delta_{x}(#Xi_{c}^{0}) vs. p_{T}", HistType::kTH2D, {axisPt, axisDelta}); + registry.add("hXic0YDeltaVsPt", "#Delta_{y}(#Xi_{c}^{0}) vs. p_{T}", HistType::kTH2D, {axisPt, axisDelta}); + registry.add("hXic0ZDeltaVsPt", "#Delta_{z}(#Xi_{c}^{0}) vs. p_{T}", HistType::kTH2D, {axisPt, axisDelta}); // pull registry.add("hV0DauPosXPull", "x^{PULL}", kTH1D, {axisPull}); @@ -2031,22 +2035,22 @@ struct HfCandidateCreatorXic0Omegac0Mc { registry.add("hXic0ZPullVsPt", "z_{PULL}(#Xi_{c}^{0}) vs. p_{T}", HistType::kTH2D, {axisPt, axisPull}); // Defaut delta - registry.add("hLambdaXDelta", "x^{#Lambda} - x^{MC}(Default)", kTH1D, {axisPull}); - registry.add("hLambdaYDelta", "y^{#Lambda} - y^{MC}(Default)", kTH1D, {axisPull}); - registry.add("hLambdaZDelta", "z^{#Lambda} - z^{MC}(Default)", kTH1D, {axisPull}); + registry.add("hLambdaXDelta", "x^{#Lambda} - x^{MC}(Default)", kTH1D, {axisDelta}); + registry.add("hLambdaYDelta", "y^{#Lambda} - y^{MC}(Default)", kTH1D, {axisDelta}); + registry.add("hLambdaZDelta", "z^{#Lambda} - z^{MC}(Default)", kTH1D, {axisDelta}); - registry.add("hCascXDelta", "x^{#Xi^{-}} - x^{MC}(Default)", kTH1D, {axisPull}); - registry.add("hCascYDelta", "y^{#Xi^{-}} - y^{MC}(Default)", kTH1D, {axisPull}); - registry.add("hCascZDelta", "z^{#Xi^{-}} - z^{MC}(Default)", kTH1D, {axisPull}); + registry.add("hCascXDelta", "x^{#Xi^{-}} - x^{MC}(Default)", kTH1D, {axisDelta}); + registry.add("hCascYDelta", "y^{#Xi^{-}} - y^{MC}(Default)", kTH1D, {axisDelta}); + registry.add("hCascZDelta", "z^{#Xi^{-}} - z^{MC}(Default)", kTH1D, {axisDelta}); // Pt Resolution - registry.add("hV0DauPosPtRes", "Pt Resolution (p)", kTH1D, {axisPull}); - registry.add("hV0DauNegPtRes", "Pt Resolution (#pi^{-} from #Lambda)", kTH1D, {axisPull}); - registry.add("hV0PtRes", "Pt Resolution (V0)", kTH1D, {axisPull}); - registry.add("hXiBachelorPtRes", "Pt Resolution (#pi^{-} from #Xi^{-})", kTH1D, {axisPull}); - registry.add("hXiPtRes", "Pt Resolution (#Xi^{-})", kTH1D, {axisPull}); - registry.add("hXic0BachelorPtRes", "Pt Resolution (#pi^{+} from #Xi_{c}^{0})", kTH1D, {axisPull}); - registry.add("hXic0PtRes", "Pt Resolution (#Xi_{c}^{0})", kTH1D, {axisPull}); + registry.add("hV0DauPosPtRes", "Pt Resolution (p)", kTH1D, {axisPtRes}); + registry.add("hV0DauNegPtRes", "Pt Resolution (#pi^{-} from #Lambda)", kTH1D, {axisPtRes}); + registry.add("hV0PtRes", "Pt Resolution (V0)", kTH1D, {axisPtRes}); + registry.add("hXiBachelorPtRes", "Pt Resolution (#pi^{-} from #Xi^{-})", kTH1D, {axisPtRes}); + registry.add("hXiPtRes", "Pt Resolution (#Xi^{-})", kTH1D, {axisPtRes}); + registry.add("hXic0BachelorPtRes", "Pt Resolution (#pi^{+} from #Xi_{c}^{0})", kTH1D, {axisPtRes}); + registry.add("hXic0PtRes", "Pt Resolution (#Xi_{c}^{0})", kTH1D, {axisPtRes}); } } @@ -2351,6 +2355,8 @@ struct HfCandidateCreatorXic0Omegac0Mc { debugGenLambda = 0; origin = RecoDecay::OriginType::None; std::vector idxBhadMothers{}; + float kRapidityCutTight = 0.5; + float kRapidityCutLoose = 0.8; // Reject particles from background events if (particle.fromBackgroundEvent() && rejectBackground) { @@ -2395,10 +2401,10 @@ struct HfCandidateCreatorXic0Omegac0Mc { // Check whether the charm baryon is non-prompt (from a b quark) if (flag != 0) { origin = RecoDecay::getCharmHadronOrigin(mcParticles, particle, false, &idxBhadMothers); - if (std::abs(rapidityCharmBaryonGen) < 0.5) { + if (std::abs(rapidityCharmBaryonGen) < kRapidityCutTight) { hGenCharmBaryonPtRapidityTightXicToXiPi->SetBinContent(hGenCharmBaryonPtRapidityTightXicToXiPi->FindBin(ptCharmBaryonGen), hGenCharmBaryonPtRapidityTightXicToXiPi->GetBinContent(hGenCharmBaryonPtRapidityTightXicToXiPi->FindBin(ptCharmBaryonGen)) + 1); } - if (std::abs(rapidityCharmBaryonGen) < 0.8) { + if (std::abs(rapidityCharmBaryonGen) < kRapidityCutLoose) { hGenCharmBaryonPtRapidityLooseXicToXiPi->SetBinContent(hGenCharmBaryonPtRapidityLooseXicToXiPi->FindBin(ptCharmBaryonGen), hGenCharmBaryonPtRapidityLooseXicToXiPi->GetBinContent(hGenCharmBaryonPtRapidityLooseXicToXiPi->FindBin(ptCharmBaryonGen)) + 1); } } @@ -2437,10 +2443,10 @@ struct HfCandidateCreatorXic0Omegac0Mc { // Check whether the charm baryon is non-prompt (from a b quark) if (flag != 0) { origin = RecoDecay::getCharmHadronOrigin(mcParticles, particle, false, &idxBhadMothers); - if (std::abs(rapidityCharmBaryonGen) < 0.5) { + if (std::abs(rapidityCharmBaryonGen) < kRapidityCutTight) { hGenCharmBaryonPtRapidityTightOmegacToXiPi->SetBinContent(hGenCharmBaryonPtRapidityTightOmegacToXiPi->FindBin(ptCharmBaryonGen), hGenCharmBaryonPtRapidityTightOmegacToXiPi->GetBinContent(hGenCharmBaryonPtRapidityTightOmegacToXiPi->FindBin(ptCharmBaryonGen)) + 1); } - if (std::abs(rapidityCharmBaryonGen) < 0.8) { + if (std::abs(rapidityCharmBaryonGen) < kRapidityCutLoose) { hGenCharmBaryonPtRapidityLooseOmegacToXiPi->SetBinContent(hGenCharmBaryonPtRapidityLooseOmegacToXiPi->FindBin(ptCharmBaryonGen), hGenCharmBaryonPtRapidityLooseOmegacToXiPi->GetBinContent(hGenCharmBaryonPtRapidityLooseOmegacToXiPi->FindBin(ptCharmBaryonGen)) + 1); } } @@ -2479,10 +2485,10 @@ struct HfCandidateCreatorXic0Omegac0Mc { // Check whether the charm baryon is non-prompt (from a b quark) if (flag != 0) { origin = RecoDecay::getCharmHadronOrigin(mcParticles, particle, false, &idxBhadMothers); - if (std::abs(rapidityCharmBaryonGen) < 0.5) { + if (std::abs(rapidityCharmBaryonGen) < kRapidityCutTight) { hGenCharmBaryonPtRapidityTightOmegacToOmegaPi->SetBinContent(hGenCharmBaryonPtRapidityTightOmegacToOmegaPi->FindBin(ptCharmBaryonGen), hGenCharmBaryonPtRapidityTightOmegacToOmegaPi->GetBinContent(hGenCharmBaryonPtRapidityTightOmegacToOmegaPi->FindBin(ptCharmBaryonGen)) + 1); } - if (std::abs(rapidityCharmBaryonGen) < 0.8) { + if (std::abs(rapidityCharmBaryonGen) < kRapidityCutLoose) { hGenCharmBaryonPtRapidityLooseOmegacToOmegaPi->SetBinContent(hGenCharmBaryonPtRapidityLooseOmegacToOmegaPi->FindBin(ptCharmBaryonGen), hGenCharmBaryonPtRapidityLooseOmegacToOmegaPi->GetBinContent(hGenCharmBaryonPtRapidityLooseOmegacToOmegaPi->FindBin(ptCharmBaryonGen)) + 1); } } @@ -2521,10 +2527,10 @@ struct HfCandidateCreatorXic0Omegac0Mc { // Check whether the charm baryon is non-prompt (from a b quark) if (flag != 0) { origin = RecoDecay::getCharmHadronOrigin(mcParticles, particle, false, &idxBhadMothers); - if (std::abs(rapidityCharmBaryonGen) < 0.5) { + if (std::abs(rapidityCharmBaryonGen) < kRapidityCutTight) { hGenCharmBaryonPtRapidityTightOmegacToOmegaK->SetBinContent(hGenCharmBaryonPtRapidityTightOmegacToOmegaK->FindBin(ptCharmBaryonGen), hGenCharmBaryonPtRapidityTightOmegacToOmegaK->GetBinContent(hGenCharmBaryonPtRapidityTightOmegacToOmegaK->FindBin(ptCharmBaryonGen)) + 1); } - if (std::abs(rapidityCharmBaryonGen) < 0.8) { + if (std::abs(rapidityCharmBaryonGen) < kRapidityCutLoose) { hGenCharmBaryonPtRapidityLooseOmegacToOmegaK->SetBinContent(hGenCharmBaryonPtRapidityLooseOmegacToOmegaK->FindBin(ptCharmBaryonGen), hGenCharmBaryonPtRapidityLooseOmegacToOmegaK->GetBinContent(hGenCharmBaryonPtRapidityLooseOmegacToOmegaK->FindBin(ptCharmBaryonGen)) + 1); } } From d3095349286502c3327781506815aec13bd7c1c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Thu, 15 May 2025 13:05:50 +0200 Subject: [PATCH 1282/1650] [ALICE3] A3PID: add parametric getters (#11183) --- ALICE3/DataModel/OTFRICH.h | 31 +++++++++- ALICE3/DataModel/OTFTOF.h | 59 +++++++++++++++++++- ALICE3/TableProducer/OTF/onTheFlyRichPid.cxx | 2 +- ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx | 2 +- 4 files changed, 90 insertions(+), 4 deletions(-) diff --git a/ALICE3/DataModel/OTFRICH.h b/ALICE3/DataModel/OTFRICH.h index e853a2ff30f..a81197dae93 100644 --- a/ALICE3/DataModel/OTFRICH.h +++ b/ALICE3/DataModel/OTFRICH.h @@ -31,13 +31,42 @@ DECLARE_SOA_COLUMN(NSigmaMuonRich, nSigmaMuonRich, float); //! NSigma mu DECLARE_SOA_COLUMN(NSigmaPionRich, nSigmaPionRich, float); //! NSigma pion BarrelRich DECLARE_SOA_COLUMN(NSigmaKaonRich, nSigmaKaonRich, float); //! NSigma kaon BarrelRich DECLARE_SOA_COLUMN(NSigmaProtonRich, nSigmaProtonRich, float); //! NSigma proton BarrelRich +DECLARE_SOA_DYNAMIC_COLUMN(NSigmaRich, nSigmaRich, //! General function to get the nSigma for the RICH + [](const float el, + const float mu, + const float pi, + const float ka, + const float pr, + const int id) -> float { + switch (std::abs(id)) { + case 0: + return el; + case 1: + return mu; + case 2: + return pi; + case 3: + return ka; + case 4: + return pr; + default: + LOG(fatal) << "Unrecognized PDG code for RICH"; + return 999.f; + } + }); + } // namespace upgrade_rich DECLARE_SOA_TABLE(UpgradeRichs, "AOD", "UPGRADERICH", upgrade_rich::NSigmaElectronRich, upgrade_rich::NSigmaMuonRich, upgrade_rich::NSigmaPionRich, upgrade_rich::NSigmaKaonRich, - upgrade_rich::NSigmaProtonRich); + upgrade_rich::NSigmaProtonRich, + upgrade_rich::NSigmaRich); using UpgradeRich = UpgradeRichs::iterator; diff --git a/ALICE3/DataModel/OTFTOF.h b/ALICE3/DataModel/OTFTOF.h index 10f3de38b19..f6f7c39234b 100644 --- a/ALICE3/DataModel/OTFTOF.h +++ b/ALICE3/DataModel/OTFTOF.h @@ -61,6 +61,53 @@ DECLARE_SOA_COLUMN(OuterTOFExpectedTimeMu, outerTOFExpectedTimeMu, float); //! R DECLARE_SOA_COLUMN(OuterTOFExpectedTimePi, outerTOFExpectedTimePi, float); //! Reconstructed expected time at the OuterTOF for the Pion mass hypotheses DECLARE_SOA_COLUMN(OuterTOFExpectedTimeKa, outerTOFExpectedTimeKa, float); //! Reconstructed expected time at the OuterTOF for the Kaon mass hypotheses DECLARE_SOA_COLUMN(OuterTOFExpectedTimePr, outerTOFExpectedTimePr, float); //! Reconstructed expected time at the OuterTOF for the Proton mass hypotheses +DECLARE_SOA_DYNAMIC_COLUMN(NSigmaInnerTOF, nSigmaInnerTOF, //! General function to get the nSigma for the InnerTOF + [](const float el, + const float mu, + const float pi, + const float ka, + const float pr, + const int id) -> float { + switch (std::abs(id)) { + case 0: + return el; + case 1: + return mu; + case 2: + return pi; + case 3: + return ka; + case 4: + return pr; + default: + LOG(fatal) << "Unrecognized PDG code for InnerTOF"; + return 999.f; + } + }); +DECLARE_SOA_DYNAMIC_COLUMN(NSigmaOuterTOF, nSigmaOuterTOF, //! General function to get the nSigma for the OuterTOF + [](const float el, + const float mu, + const float pi, + const float ka, + const float pr, + const int id) -> float { + switch (std::abs(id)) { + case 0: + return el; + case 1: + return mu; + case 2: + return pi; + case 3: + return ka; + case 4: + return pr; + default: + LOG(fatal) << "Unrecognized PDG code for InnerTOF"; + return 999.f; + } + }); + } // namespace upgrade_tof DECLARE_SOA_TABLE(UpgradeTofMCs, "AOD", "UPGRADETOFMC", @@ -85,7 +132,17 @@ DECLARE_SOA_TABLE(UpgradeTofs, "AOD", "UPGRADETOF", upgrade_tof::NSigmaKaonOuterTOF, upgrade_tof::NSigmaProtonOuterTOF, upgrade_tof::OuterTOFTrackTimeReco, - upgrade_tof::OuterTOFTrackLengthReco); + upgrade_tof::OuterTOFTrackLengthReco, + upgrade_tof::NSigmaInnerTOF, + upgrade_tof::NSigmaOuterTOF); DECLARE_SOA_TABLE(UpgradeTofExpectedTimes, "AOD", "UPGRADETOFEXPT", upgrade_tof::InnerTOFExpectedTimeEl, diff --git a/ALICE3/TableProducer/OTF/onTheFlyRichPid.cxx b/ALICE3/TableProducer/OTF/onTheFlyRichPid.cxx index f7cd2e62451..713b1ce1581 100644 --- a/ALICE3/TableProducer/OTF/onTheFlyRichPid.cxx +++ b/ALICE3/TableProducer/OTF/onTheFlyRichPid.cxx @@ -325,7 +325,7 @@ struct OnTheFlyRichPid { if (lut.value != "inherit") { return; } - if (!getTaskOptionValue(initContext, "on-the-fly-tracker", lut.name, lut.value, true)) { + if (!getTaskOptionValue(initContext, "on-the-fly-tracker", lut, false)) { LOG(fatal) << "Could not get " << lut.name << " from on-the-fly-tracker task"; } }; diff --git a/ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx b/ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx index dada9758bea..4877a510a86 100644 --- a/ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx +++ b/ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx @@ -145,7 +145,7 @@ struct OnTheFlyTofPid { if (lut.value != "inherit") { return; } - if (!getTaskOptionValue(initContext, "on-the-fly-tracker", lut.name, lut.value, true)) { + if (!getTaskOptionValue(initContext, "on-the-fly-tracker", lut, false)) { LOG(fatal) << "Could not get " << lut.name << " from on-the-fly-tracker task"; } }; From 254ce6a31eab9eb0e68c8669e6060fd2b1cc44bd Mon Sep 17 00:00:00 2001 From: yhambard <127940767+yhambard@users.noreply.github.com> Date: Thu, 15 May 2025 14:30:34 +0300 Subject: [PATCH 1283/1650] [PWGEM] phosElId TPC efficiency checker (#11194) --- PWGEM/Tasks/phosElId.cxx | 1221 +++++++++++++++++++++----------------- 1 file changed, 677 insertions(+), 544 deletions(-) diff --git a/PWGEM/Tasks/phosElId.cxx b/PWGEM/Tasks/phosElId.cxx index a2e43d23b01..50e091a69e0 100644 --- a/PWGEM/Tasks/phosElId.cxx +++ b/PWGEM/Tasks/phosElId.cxx @@ -46,7 +46,6 @@ #include "DataFormatsParameters/GRPLHCIFData.h" #include "DetectorsBase/Propagator.h" #include "TF1.h" -#include "TLorentzVector.h" using namespace o2; using namespace o2::soa; @@ -90,7 +89,9 @@ struct PhosElId { using MyTracks = soa::Join; - Configurable mMinCluE{"mMinCluE", 0.3, "Minimum cluster energy for analysis"}, + Configurable isSel8{"isSel8", 1, "check if event is Single Event Latch-up 8"}; + Configurable mColMaxZ{"mColMaxZ", 10.f, "maximum z accepted in analysis"}, + mMinCluE{"mMinCluE", 0.3, "Minimum cluster energy for analysis"}, mMinCluTime{"minCluTime", -25.e-9, "Min. cluster time"}, mMaxCluTime{"mMaxCluTime", 25.e-9, "Max. cluster time"}, mCluTimeAxisMin{"mCluTimeAxisMin", -100, "lower axis limit for cluster time in nanoseconds"}, @@ -101,32 +102,33 @@ struct PhosElId { mDeltaZmax{"mDeltaZmax", 100., "Max for track and cluster coordinate delta"}, mEpmin{"mEpmin", -1., "Min for E/p histograms"}, mEpmax{"mEpmax", 3., "Max for E/p histograms"}, - cfgEtaMax{"cfgEtaMax", {0.8f}, "eta ranges"}, - cfgPtMin{"cfgPtMin", {0.2f}, "pt min"}, - cfgPtMax{"cfgPtMax", {20.f}, "pt max"}, - cfgDCAxyMax{"cfgDCAxyMax", {3.f}, "dcaxy max"}, - cfgDCAzMax{"cfgDCAzMax", {3.f}, "dcaz max"}, - cfgITSchi2Max{"cfgITSchi2Max", {5.f}, "its chi2 max"}, - cfgITSnclsMin{"cfgITSnclsMin", {4.5f}, "min number of ITS clusters"}, - cfgITSnclsMax{"cfgITSnclsMax", {7.5f}, "max number of ITS clusters"}, - cfgTPCchi2Max{"cfgTPCchi2Max", {4.f}, "tpc chi2 max"}, - cfgTPCnclsMin{"cfgTPCnclsMin", {90.f}, "min number of TPC clusters"}, - cfgTPCnclsMax{"cfgTPCnclsMax", {170.f}, "max number of TPC clusters"}, - cfgTPCnclsCRMin{"cfgTPCnclsCRMin", {80.f}, "min number of TPC crossed rows"}, - cfgTPCnclsCRMax{"cfgTPCnclsCRMax", {161.f}, "max number of TPC crossed rows"}, - cfgTPCNSigmaElMin{"cfgTPCNSigmaElMin", {-3.f}, "min TPC nsigma e for inclusion"}, - cfgTPCNSigmaElMax{"cfgTPCNSigmaElMax", {2.f}, "max TPC nsigma e for inclusion"}, - cfgTPCNSigmaPiMin{"cfgTPCNSigmaPiMin", {-3.f}, "min TPC nsigma pion for exclusion"}, - cfgTPCNSigmaPiMax{"cfgTPCNSigmaPiMax", {3.5f}, "max TPC nsigma pion for exclusion"}, - cfgTPCNSigmaPrMin{"cfgTPCNSigmaPrMin", {-3.f}, "min TPC nsigma proton for exclusion"}, - cfgTPCNSigmaPrMax{"cfgTPCNSigmaPrMax", {4.f}, "max TPC nsigma proton for exclusion"}, - cfgTPCNSigmaKaMin{"cfgTPCNSigmaKaMin", {-3.f}, "min TPC nsigma kaon for exclusion"}, - cfgTPCNSigmaKaMax{"cfgTPCNSigmaKaMax", {4.f}, "max TPC nsigma kaon for exclusion"}, - cfgTOFNSigmaElMin{"cfgTOFNSigmaElMin", {-3.f}, "min TOF nsigma e for inclusion"}, - cfgTOFNSigmaElMax{"cfgTOFNSigmaElMax", {3.f}, "max TOF nsigma e for inclusion"}, - cfgNsigmaTrackMatch{"cfgNsigmaTrackMatch", {2.f}, "PHOS Track Matching Nsigma for inclusion"}; + EtaMax{"EtaMax", {0.8f}, "eta ranges"}, + PtMin{"PtMin", {0.2f}, "pt min"}, + PtMax{"PtMax", {20.f}, "pt max"}, + DCAxyMax{"DCAxyMax", {3.f}, "dcaxy max"}, + DCAzMax{"DCAzMax", {3.f}, "dcaz max"}, + ITSchi2Max{"ITSchi2Max", {5.f}, "its chi2 max"}, + ITSnclsMin{"ITSnclsMin", {4.5f}, "min number of ITS clusters"}, + ITSnclsMax{"ITSnclsMax", {7.5f}, "max number of ITS clusters"}, + TPCchi2Max{"TPCchi2Max", {4.f}, "tpc chi2 max"}, + TPCnclsMin{"TPCnclsMin", {90.f}, "min number of TPC clusters"}, + TPCnclsMax{"TPCnclsMax", {170.f}, "max number of TPC clusters"}, + TPCnclsCRMin{"TPCnclsCRMin", {80.f}, "min number of TPC crossed rows"}, + TPCnclsCRMax{"TPCnclsCRMax", {161.f}, "max number of TPC crossed rows"}, + TPCNSigmaElMin{"TPCNSigmaElMin", {-3.f}, "min TPC nsigma e for inclusion"}, + TPCNSigmaElMax{"TPCNSigmaElMax", {2.f}, "max TPC nsigma e for inclusion"}, + TPCNSigmaPiMin{"TPCNSigmaPiMin", {-3.f}, "min TPC nsigma pion for exclusion"}, + TPCNSigmaPiMax{"TPCNSigmaPiMax", {3.5f}, "max TPC nsigma pion for exclusion"}, + TPCNSigmaPrMin{"TPCNSigmaPrMin", {-3.f}, "min TPC nsigma proton for exclusion"}, + TPCNSigmaPrMax{"TPCNSigmaPrMax", {4.f}, "max TPC nsigma proton for exclusion"}, + TPCNSigmaKaMin{"TPCNSigmaKaMin", {-3.f}, "min TPC nsigma kaon for exclusion"}, + TPCNSigmaKaMax{"TPCNSigmaKaMax", {4.f}, "max TPC nsigma kaon for exclusion"}, + TOFNSigmaElMin{"TOFNSigmaElMin", {-3.f}, "min TOF nsigma e for inclusion"}, + TOFNSigmaElMax{"TOFNSigmaElMax", {3.f}, "max TOF nsigma e for inclusion"}, + NsigmaTrackMatch{"NsigmaTrackMatch", {2.f}, "PHOS Track Matching Nsigma for inclusion"}; Configurable mEvSelTrig{"mEvSelTrig", kTVXinPHOS, "Select events with this trigger"}, + mAmountOfModules{"mAmountOfModules", 4, "amount of modules for PHOS"}, mMinCluNcell{"minCluNcell", 3, "min cells in cluster"}, nBinsDeltaX{"nBinsDeltaX", 500, "N bins for track and cluster coordinate delta"}, nBinsDeltaZ{"nBinsDeltaZ", 500, "N bins for track and cluster coordinate delta"}, @@ -136,22 +138,16 @@ struct PhosElId { pSigmadX{"pSigmadX", {2.17769, 1.60275, 2.24136}, "parameters for sigma dx function"}, pPhosShiftZ{"pPhosShiftZ", {4.78838, 2.75138, 1.40825, 2.28735}, "Phos coordinate centering Z per module"}, pPhosShiftX{"pPhosShiftX", {2.158702, -1.526772, -0.814658, -1.852678}, "Phos coordinate centering X per module"}, - pMeandXPosMod1{"pMeandXPosMod1", {-10.57, -0.42, 1.06}, "parameters for mean dx function on module 1 for positive tracks"}, - pMeandXPosMod2{"pMeandXPosMod2", {-8.1, -0.42, 1.14}, "parameters for mean dx function on module 2 for positive tracks"}, - pMeandXPosMod3{"pMeandXPosMod3", {-8.34, -0.42, 1.04}, "parameters for mean dx function on module 3 for positive tracks"}, - pMeandXPosMod4{"pMeandXPosMod4", {-7.38, -0.42, 1.17}, "parameters for mean dx function on module 4 for positive tracks"}, - pMeandXNegMod1{"pMeandXNegMod1", {9.92, -0.42, 1.29}, "parameters for mean dx function on module 1 for negative tracks"}, - pMeandXNegMod2{"pMeandXNegMod2", {7.82, -0.4, 1.34}, "parameters for mean dx function on module 2 for negative tracks"}, - pMeandXNegMod3{"pMeandXNegMod3", {8.45, -0.33, 1.5}, "parameters for mean dx function on module 3 for negative tracks"}, - pMeandXNegMod4{"pMeandXNegMod4", {7.5, -0.42, 1.25}, "parameters for mean dx function on module 4 for negative tracks"}; - - Filter ptFilter = (aod::track::pt > cfgPtMin) && (aod::track::pt < cfgPtMax); - Filter etafilter = nabs(aod::track::eta) < cfgEtaMax; - Filter dcaxyfilter = nabs(aod::track::dcaXY) < cfgDCAxyMax; - Filter dcazfilter = nabs(aod::track::dcaZ) < cfgDCAzMax; - Filter itschi2filter = aod::track::itsChi2NCl < cfgITSchi2Max; - Filter tpcchi2filter = aod::track::tpcChi2NCl < cfgTPCchi2Max; - Filter mapfilter = (aod::track::itsClusterMap & uint8_t(1)) > 0; + pMeandXPosMod{"pMeandXPosMod", {-10.57, -0.42, 1.06, -8.1, -0.42, 1.14, -8.34, -0.42, 1.04, -7.38, -0.42, 1.17}, "parameters for mean dx function for positive tracks"}, + pMeandXNegMod{"pMeandXNegMod", {9.92, -0.42, 1.29, 7.82, -0.4, 1.34, 8.45, -0.33, 1.5, 7.5, -0.42, 1.25}, "parameters for mean dx function for negative tracks"}; + + Filter ptFilter = (aod::track::pt > PtMin) && (aod::track::pt < PtMax), + etafilter = nabs(aod::track::eta) < EtaMax, + dcaxyfilter = nabs(aod::track::dcaXY) < DCAxyMax, + dcazfilter = nabs(aod::track::dcaZ) < DCAzMax, + itschi2filter = aod::track::itsChi2NCl < ITSchi2Max, + tpcchi2filter = aod::track::tpcChi2NCl < TPCchi2Max, + mapfilter = (aod::track::itsClusterMap & uint8_t(1)) > 0; Service ccdb; std::unique_ptr geomPHOS; @@ -160,16 +156,7 @@ struct PhosElId { HistogramRegistry mHistManager{"PhosElIdHistograms"}; TF1 *fSigma_dz, *fSigma_dx; - float *PhosShiftX, *PhosShiftZ; - - TF1* fMeandXPosMod1; - TF1* fMeandXNegMod1; - TF1* fMeandXPosMod2; - TF1* fMeandXNegMod2; - TF1* fMeandXPosMod3; - TF1* fMeandXNegMod3; - TF1* fMeandXPosMod4; - TF1* fMeandXNegMod4; + std::array fMeandXPosMod, fMeandXNegMod; void init(InitContext const&) { @@ -178,32 +165,8 @@ struct PhosElId { std::vector momentumBinning = {0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 10.}; - std::vector parametersSigmadZ = pSigmadZ; - std::vector parametersSigmadX = pSigmadX; - std::vector vPhosShiftX = pPhosShiftX; - std::vector vPhosShiftZ = pPhosShiftZ; - std::vector meandXPosMod1 = pMeandXPosMod1; - std::vector meandXPosMod2 = pMeandXPosMod2; - std::vector meandXPosMod3 = pMeandXPosMod3; - std::vector meandXPosMod4 = pMeandXPosMod4; - std::vector meandXNegMod1 = pMeandXNegMod1; - std::vector meandXNegMod2 = pMeandXNegMod2; - std::vector meandXNegMod3 = pMeandXNegMod3; - std::vector meandXNegMod4 = pMeandXNegMod4; - - PhosShiftX = new float[4]; - PhosShiftX[0] = vPhosShiftX.at(0); - PhosShiftX[1] = vPhosShiftX.at(1); - PhosShiftX[2] = vPhosShiftX.at(2); - PhosShiftX[3] = vPhosShiftX.at(3); - - PhosShiftZ = new float[4]; - PhosShiftZ[0] = vPhosShiftZ.at(0); - PhosShiftZ[1] = vPhosShiftZ.at(1); - PhosShiftZ[2] = vPhosShiftZ.at(2); - PhosShiftZ[3] = vPhosShiftZ.at(3); - - const AxisSpec axisCounter{1, 0, +1, ""}, + + const AxisSpec axisCounter{3, 0, +3, ""}, axisP{momentumBinning, "p (GeV/c)"}, axisPt{momentumBinning, "p_{T} (GeV/c)"}, axisEta{200, -0.2, 0.2, "#eta"}, @@ -228,85 +191,97 @@ struct PhosElId { axisVTrackZ{400, -10., 10., "track vertex z (cm)", "track vertex z (cm)"}; mHistManager.add("eventCounter", "eventCounter", kTH1F, {axisCounter}); - mHistManager.add("TVXinPHOSCounter", "TVXinPHOSCounter", kTH1F, {axisCounter}); - - mHistManager.add("hTrackPtEtaPhi", "Track pt vs eta vs phi", HistType::kTH3F, {axisPt, axisEta, axisPhi}); - mHistManager.add("hTrackPtEtaPhi_Phos", "Track pt vs eta vs phi on Phos surface", HistType::kTH3F, {axisPt, axisEta, axisPhi}); - mHistManager.add("hTrackDCA", "Track DCA info", HistType::kTH2F, {axisDCATrackXY, axisDCATrackZ}); - mHistManager.add("hTrackVX", "Track vertex coordinate X", HistType::kTH1F, {axisVTrackX}); - mHistManager.add("hTrackVY", "Track vertex coordinate Y", HistType::kTH1F, {axisVTrackY}); - mHistManager.add("hTrackVZ", "Track vertex coordinate Z", HistType::kTH1F, {axisVTrackZ}); - mHistManager.add("hColVX", "Collision vertex coordinate X", HistType::kTH1F, {axisVColX}); - mHistManager.add("hColVY", "Collision vertex coordinate Y", HistType::kTH1F, {axisVColY}); - mHistManager.add("hColVZ", "Collision vertex coordinate Z", HistType::kTH1F, {axisVColZ}); - mHistManager.add("hTrackPhosProjMod", "Track projection coordinates on PHOS modules", HistType::kTH3F, {axisX, axisZ, axisModes}); - - mHistManager.add("hCluE_v_mod_v_time", "Cluster energy spectrum (E > 0.3 GeV) vs time per module", HistType::kTH3F, {axisE, axisTime, axisModes}); - - mHistManager.add("hCluE_mod_energy_cut", "Cluster energy spectrum (E > 0.3 GeV) per module", HistType::kTH2F, {axisE, axisModes}); - mHistManager.add("hCluE_mod_time_cut", "Cluster energy spectrum (E > 0.3 GeV)(time +-25 ns) per module", HistType::kTH2F, {axisE, axisModes}); - mHistManager.add("hCluE_mod_cell_cut", "Cluster energy spectrum (E > 0.3 GeV)(time +-25 ns)(ncells > 3) per module", HistType::kTH2F, {axisE, axisModes}); - mHistManager.add("hCluE_mod_disp", "Cluster energy spectrum OK dispersion and (E > 0.3 GeV)(time +-25 ns)(ncells > 3) per module", HistType::kTH2F, {axisE, axisModes}); - mHistManager.add("hCluE_ncells_mod", "Cluster energy spectrum per module", HistType::kTH3F, {axisE, axisCells, axisModes}); - mHistManager.add("hCluXZ_mod", "Local cluster X Z per module", HistType::kTH3F, {axisX, axisZ, axisModes}); - - mHistManager.add("hdZpmod", "dz,p_{tr},module", HistType::kTH3F, {axisdZ, axisPt, axisModes}); - mHistManager.add("hdZpmod_pos", "dz,p_{tr},module positive tracks", HistType::kTH3F, {axisdZ, axisPt, axisModes}); - mHistManager.add("hdZpmod_neg", "dz,p_{tr},module negative tracks", HistType::kTH3F, {axisdZ, axisPt, axisModes}); - mHistManager.add("hdXpmod", "dx,p_{tr},module", HistType::kTH3F, {axisdX, axisPt, axisModes}); - mHistManager.add("hdXpmod_pos", "dx,p_{tr},module positive tracks", HistType::kTH3F, {axisdX, axisPt, axisModes}); - mHistManager.add("hdXpmod_neg", "dx,p_{tr},module negative tracks", HistType::kTH3F, {axisdX, axisPt, axisModes}); - - mHistManager.add("hCluE_v_pt_disp", "Cluster energy vs p | OK dispersion", HistType::kTH3F, {axisE, axisPt, axisModes}); - mHistManager.add("hCluE_v_pt_Nsigma", "Cluster energy vs p within trackmatch Nsigma", HistType::kTH3F, {axisE, axisPt, axisModes}); - mHistManager.add("hCluE_v_pt_Nsigma_disp", "Cluster energy vs p within trackmatch Nsigma | OK dispersion", HistType::kTH3F, {axisE, axisPt, axisModes}); - - mHistManager.add("hCluE_v_pt_disp_TPC", "Cluster energy vs p | OK dispersion", HistType::kTH3F, {axisE, axisPt, axisModes}); - mHistManager.add("hCluE_v_pt_Nsigma_TPC", "Cluster energy vs p within trackmatch Nsigma", HistType::kTH3F, {axisE, axisPt, axisModes}); - mHistManager.add("hCluE_v_pt_Nsigma_disp_TPC", "Cluster energy vs p within trackmatch Nsigma | OK dispersion", HistType::kTH3F, {axisE, axisPt, axisModes}); - - mHistManager.add("hEp_v_pt_disp", "E/p ratio vs p | OK dispersion", HistType::kTH3F, {axisEp, axisPt, axisModes}); - mHistManager.add("hEp_v_pt_Nsigma", "E/p ratio vs p within trackmatch Nsigma", HistType::kTH3F, {axisEp, axisPt, axisModes}); - mHistManager.add("hEp_v_pt_Nsigma_disp", "E/p ratio vs p within trackmatch Nsigma | OK dispersion", HistType::kTH3F, {axisEp, axisPt, axisModes}); - - mHistManager.add("hEp_v_E_disp", "E/p ratio vs cluster E | OK dispersion", HistType::kTH3F, {axisEp, axisE, axisModes}); - mHistManager.add("hEp_v_E_Nsigma", "E/p ratio vs cluster E within trackmatch Nsigma", HistType::kTH3F, {axisEp, axisE, axisModes}); - mHistManager.add("hEp_v_E_Nsigma_disp", "E/p ratio vs cluster E within trackmatch Nsigma | OK dispersion", HistType::kTH3F, {axisEp, axisE, axisModes}); - - mHistManager.add("hEp_v_pt_disp_TPC", "E/p ratio vs p | OK dispersion", HistType::kTH3F, {axisEp, axisPt, axisModes}); - mHistManager.add("hEp_v_pt_Nsigma_TPC", "E/p ratio vs p within trackmatch Nsigma", HistType::kTH3F, {axisEp, axisPt, axisModes}); - mHistManager.add("hEp_v_pt_Nsigma_disp_TPC", "E/p ratio vs p within trackmatch Nsigma | OK dispersion", HistType::kTH3F, {axisEp, axisPt, axisModes}); - - mHistManager.add("hEp_v_E_disp_TPC", "E/p ratio vs cluster E | OK dispersion", HistType::kTH3F, {axisEp, axisE, axisModes}); - mHistManager.add("hEp_v_E_Nsigma_TPC", "E/p ratio vs cluster E within trackmatch Nsigma", HistType::kTH3F, {axisEp, axisE, axisModes}); - mHistManager.add("hEp_v_E_Nsigma_disp_TPC", "E/p ratio vs cluster E within trackmatch Nsigma | OK dispersion", HistType::kTH3F, {axisEp, axisE, axisModes}); + mHistManager.add("tracks/hTrackPtEtaPhi", "Track pt vs eta vs phi", HistType::kTH3F, {axisPt, axisEta, axisPhi}); + mHistManager.add("tracks/hTrackPtEtaPhi_Phos", "Track pt vs eta vs phi on Phos surface", HistType::kTH3F, {axisPt, axisEta, axisPhi}); + mHistManager.add("tracks/hTrackDCA", "Track DCA info", HistType::kTH2F, {axisDCATrackXY, axisDCATrackZ}); + mHistManager.add("tracks/hTrackVX", "Track vertex coordinate X", HistType::kTH1F, {axisVTrackX}); + mHistManager.add("tracks/hTrackVY", "Track vertex coordinate Y", HistType::kTH1F, {axisVTrackY}); + mHistManager.add("tracks/hTrackVZ", "Track vertex coordinate Z", HistType::kTH1F, {axisVTrackZ}); + mHistManager.add("collision/hColVX", "Collision vertex coordinate X", HistType::kTH1F, {axisVColX}); + mHistManager.add("collision/hColVY", "Collision vertex coordinate Y", HistType::kTH1F, {axisVColY}); + mHistManager.add("collision/hColVZ", "Collision vertex coordinate Z", HistType::kTH1F, {axisVColZ}); + mHistManager.add("tracks/hTrackPhosProjMod", "Track projection coordinates on PHOS modules", HistType::kTH3F, {axisX, axisZ, axisModes}); + + mHistManager.add("clusterSpectra/hCluE_v_mod_v_time", "Cluster energy spectrum (E > 0.3 GeV) vs time per module", HistType::kTH3F, {axisE, axisTime, axisModes}); + mHistManager.add("clusterSpectra/hCluE_mod_energy_cut", "Cluster energy spectrum (E > 0.3 GeV) per module", HistType::kTH2F, {axisE, axisModes}); + mHistManager.add("clusterSpectra/hCluE_mod_time_cut", "Cluster energy spectrum (E > 0.3 GeV)(time +-25 ns) per module", HistType::kTH2F, {axisE, axisModes}); + mHistManager.add("clusterSpectra/hCluE_mod_cell_cut", "Cluster energy spectrum (E > 0.3 GeV)(time +-25 ns)(ncells > 3) per module", HistType::kTH2F, {axisE, axisModes}); + mHistManager.add("clusterSpectra/hCluE_mod_disp", "Cluster energy spectrum OK dispersion and (E > 0.3 GeV)(time +-25 ns)(ncells > 3) per module", HistType::kTH2F, {axisE, axisModes}); + mHistManager.add("clusterSpectra/hCluE_ncells_mod", "Cluster energy spectrum vs cell ammount per module", HistType::kTH3F, {axisE, axisCells, axisModes}); + + mHistManager.add("coordinateMatching/hCluXZ_mod", "Local cluster X Z per module", HistType::kTH3F, {axisX, axisZ, axisModes}); + mHistManager.add("coordinateMatching/hdZpmod", "dz,p_{tr},module", HistType::kTH3F, {axisdZ, axisPt, axisModes}); + mHistManager.add("coordinateMatching/hdZpmod_pos", "dz,p_{tr},module positive tracks", HistType::kTH3F, {axisdZ, axisPt, axisModes}); + mHistManager.add("coordinateMatching/hdZpmod_neg", "dz,p_{tr},module negative tracks", HistType::kTH3F, {axisdZ, axisPt, axisModes}); + mHistManager.add("coordinateMatching/hdXpmod", "dx,p_{tr},module", HistType::kTH3F, {axisdX, axisPt, axisModes}); + mHistManager.add("coordinateMatching/hdXpmod_pos", "dx,p_{tr},module positive tracks", HistType::kTH3F, {axisdX, axisPt, axisModes}); + mHistManager.add("coordinateMatching/hdXpmod_neg", "dx,p_{tr},module negative tracks", HistType::kTH3F, {axisdX, axisPt, axisModes}); + + mHistManager.add("clusterSpectra/hCluE_v_pt_disp", "Cluster energy vs p | OK dispersion", HistType::kTH3F, {axisE, axisPt, axisModes}); + mHistManager.add("clusterSpectra/hCluE_v_pt_Nsigma", "Cluster energy vs p within trackmatch Nsigma", HistType::kTH3F, {axisE, axisPt, axisModes}); + mHistManager.add("clusterSpectra/hCluE_v_pt_Nsigma_disp", "Cluster energy vs p within trackmatch Nsigma | OK dispersion", HistType::kTH3F, {axisE, axisPt, axisModes}); + mHistManager.add("clusterSpectra/hCluE_v_pt_disp_TPCel", "Cluster energy vs p | OK dispersion", HistType::kTH3F, {axisE, axisPt, axisModes}); + mHistManager.add("clusterSpectra/hCluE_v_pt_Nsigma_TPCel", "Cluster energy vs p within trackmatch Nsigma", HistType::kTH3F, {axisE, axisPt, axisModes}); + mHistManager.add("clusterSpectra/hCluE_v_pt_Nsigma_disp_TPCel", "Cluster energy vs p within trackmatch Nsigma | OK dispersion", HistType::kTH3F, {axisE, axisPt, axisModes}); + + mHistManager.add("energyMomentumRatio/hEp_v_pt_disp", "E/p ratio vs p | OK dispersion", HistType::kTH3F, {axisEp, axisPt, axisModes}); + mHistManager.add("energyMomentumRatio/hEp_v_pt_Nsigma", "E/p ratio vs p within trackmatch Nsigma", HistType::kTH3F, {axisEp, axisPt, axisModes}); + mHistManager.add("energyMomentumRatio/hEp_v_pt_Nsigma_disp", "E/p ratio vs p within trackmatch Nsigma | OK dispersion", HistType::kTH3F, {axisEp, axisPt, axisModes}); + + mHistManager.add("energyMomentumRatio/hEp_v_E_disp", "E/p ratio vs cluster E | OK dispersion", HistType::kTH3F, {axisEp, axisE, axisModes}); + mHistManager.add("energyMomentumRatio/hEp_v_E_Nsigma", "E/p ratio vs cluster E within trackmatch Nsigma", HistType::kTH3F, {axisEp, axisE, axisModes}); + mHistManager.add("energyMomentumRatio/hEp_v_E_Nsigma_disp", "E/p ratio vs cluster E within trackmatch Nsigma | OK dispersion", HistType::kTH3F, {axisEp, axisE, axisModes}); + + mHistManager.add("energyMomentumRatio/hEp_v_pt_disp_TPCel", "E/p ratio vs p | OK dispersion", HistType::kTH3F, {axisEp, axisPt, axisModes}); + mHistManager.add("energyMomentumRatio/hEp_v_pt_Nsigma_TPCel", "E/p ratio vs p within trackmatch Nsigma", HistType::kTH3F, {axisEp, axisPt, axisModes}); + mHistManager.add("energyMomentumRatio/hEp_v_pt_Nsigma_disp_TPCel", "E/p ratio vs p within trackmatch Nsigma | OK dispersion", HistType::kTH3F, {axisEp, axisPt, axisModes}); + + mHistManager.add("energyMomentumRatio/hEp_v_E_disp_TPCel", "E/p ratio vs cluster E | OK dispersion", HistType::kTH3F, {axisEp, axisE, axisModes}); + mHistManager.add("energyMomentumRatio/hEp_v_E_Nsigma_TPCel", "E/p ratio vs cluster E within trackmatch Nsigma", HistType::kTH3F, {axisEp, axisE, axisModes}); + mHistManager.add("energyMomentumRatio/hEp_v_E_Nsigma_disp_TPCel", "E/p ratio vs cluster E within trackmatch Nsigma | OK dispersion", HistType::kTH3F, {axisEp, axisE, axisModes}); + + mHistManager.add("doubleLoop/trackdist/clusterSpectra/hCluE_v_pt_Nsigma", "Cluster energy vs p within trackmatch Nsigma", HistType::kTH3F, {axisE, axisPt, axisModes}); + mHistManager.add("doubleLoop/trackdist/clusterSpectra/hCluE_v_pt_Nsigma_disp", "Cluster energy vs p within trackmatch Nsigma | OK dispersion", HistType::kTH3F, {axisE, axisPt, axisModes}); + mHistManager.add("doubleLoop/trackdist/clusterSpectra/hCluE_v_pt_Nsigma_TPCel", "Cluster energy vs p within trackmatch Nsigma", HistType::kTH3F, {axisE, axisPt, axisModes}); + mHistManager.add("doubleLoop/trackdist/clusterSpectra/hCluE_v_pt_Nsigma_disp_TPCel", "Cluster energy vs p within trackmatch Nsigma | OK dispersion", HistType::kTH3F, {axisE, axisPt, axisModes}); + mHistManager.add("doubleLoop/trackdist/energyMomentumRatio/hEp_v_pt_Nsigma", "E/p ratio vs p within trackmatch Nsigma", HistType::kTH3F, {axisEp, axisPt, axisModes}); + mHistManager.add("doubleLoop/trackdist/energyMomentumRatio/hEp_v_pt_Nsigma_disp", "E/p ratio vs p within trackmatch Nsigma | OK dispersion", HistType::kTH3F, {axisEp, axisPt, axisModes}); + mHistManager.add("doubleLoop/trackdist/energyMomentumRatio/hEp_v_pt_Nsigma_TPCel", "E/p ratio vs p within trackmatch Nsigma", HistType::kTH3F, {axisEp, axisPt, axisModes}); + mHistManager.add("doubleLoop/trackdist/energyMomentumRatio/hEp_v_pt_Nsigma_disp_TPCel", "E/p ratio vs p within trackmatch Nsigma | OK dispersion", HistType::kTH3F, {axisEp, axisPt, axisModes}); + mHistManager.add("doubleLoop/trackdist/energyMomentumRatio/hEp_v_E_Nsigma", "E/p ratio vs cluster E within trackmatch Nsigma", HistType::kTH3F, {axisEp, axisE, axisModes}); + mHistManager.add("doubleLoop/trackdist/energyMomentumRatio/hEp_v_E_Nsigma_disp", "E/p ratio vs cluster E within trackmatch Nsigma | OK dispersion", HistType::kTH3F, {axisEp, axisE, axisModes}); + mHistManager.add("doubleLoop/trackdist/energyMomentumRatio/hEp_v_E_Nsigma_TPCel", "E/p ratio vs cluster E within trackmatch Nsigma", HistType::kTH3F, {axisEp, axisE, axisModes}); + mHistManager.add("doubleLoop/trackdist/energyMomentumRatio/hEp_v_E_Nsigma_disp_TPCel", "E/p ratio vs cluster E within trackmatch Nsigma | OK dispersion", HistType::kTH3F, {axisEp, axisE, axisModes}); + + mHistManager.add("singleLoop/trackdist/clusterSpectra/hCluE_v_pt_Nsigma", "Cluster energy vs p within trackmatch Nsigma", HistType::kTH3F, {axisE, axisPt, axisModes}); + mHistManager.add("singleLoop/trackdist/clusterSpectra/hCluE_v_pt_Nsigma_disp", "Cluster energy vs p within trackmatch Nsigma | OK dispersion", HistType::kTH3F, {axisE, axisPt, axisModes}); + mHistManager.add("singleLoop/trackdist/clusterSpectra/hCluE_v_pt_Nsigma_TPCel", "Cluster energy vs p within trackmatch Nsigma", HistType::kTH3F, {axisE, axisPt, axisModes}); + mHistManager.add("singleLoop/trackdist/clusterSpectra/hCluE_v_pt_Nsigma_disp_TPCel", "Cluster energy vs p within trackmatch Nsigma | OK dispersion", HistType::kTH3F, {axisE, axisPt, axisModes}); + mHistManager.add("singleLoop/trackdist/energyMomentumRatio/hEp_v_pt_Nsigma", "E/p ratio vs p within trackmatch Nsigma", HistType::kTH3F, {axisEp, axisPt, axisModes}); + mHistManager.add("singleLoop/trackdist/energyMomentumRatio/hEp_v_pt_Nsigma_disp", "E/p ratio vs p within trackmatch Nsigma | OK dispersion", HistType::kTH3F, {axisEp, axisPt, axisModes}); + mHistManager.add("singleLoop/trackdist/energyMomentumRatio/hEp_v_pt_Nsigma_TPCel", "E/p ratio vs p within trackmatch Nsigma", HistType::kTH3F, {axisEp, axisPt, axisModes}); + mHistManager.add("singleLoop/trackdist/energyMomentumRatio/hEp_v_pt_Nsigma_disp_TPCel", "E/p ratio vs p within trackmatch Nsigma | OK dispersion", HistType::kTH3F, {axisEp, axisPt, axisModes}); + mHistManager.add("singleLoop/trackdist/energyMomentumRatio/hEp_v_E_Nsigma", "E/p ratio vs cluster E within trackmatch Nsigma", HistType::kTH3F, {axisEp, axisE, axisModes}); + mHistManager.add("singleLoop/trackdist/energyMomentumRatio/hEp_v_E_Nsigma_disp", "E/p ratio vs cluster E within trackmatch Nsigma | OK dispersion", HistType::kTH3F, {axisEp, axisE, axisModes}); + mHistManager.add("singleLoop/trackdist/energyMomentumRatio/hEp_v_E_Nsigma_TPCel", "E/p ratio vs cluster E within trackmatch Nsigma", HistType::kTH3F, {axisEp, axisE, axisModes}); + mHistManager.add("singleLoop/trackdist/energyMomentumRatio/hEp_v_E_Nsigma_disp_TPCel", "E/p ratio vs cluster E within trackmatch Nsigma | OK dispersion", HistType::kTH3F, {axisEp, axisE, axisModes}); geomPHOS = std::make_unique("PHOS"); + fSigma_dz = new TF1("fSigma_dz", "[0]/(x+[1])^[2]+pol1(3)", 0.3, 10); - fSigma_dz->SetParameters(parametersSigmadZ.at(0), parametersSigmadZ.at(1), parametersSigmadZ.at(2), parametersSigmadZ.at(3), parametersSigmadZ.at(4)); + fSigma_dz->SetParameters(((std::vector)pSigmadZ).at(0), ((std::vector)pSigmadZ).at(1), ((std::vector)pSigmadZ).at(2), ((std::vector)pSigmadZ).at(3), ((std::vector)pSigmadZ).at(4)); fSigma_dx = new TF1("fSigma_dx", "[0]/x^[1]+[2]", 0.1, 10); - fSigma_dx->SetParameters(parametersSigmadX.at(0), parametersSigmadX.at(1), parametersSigmadX.at(2)); - - fMeandXPosMod1 = new TF1("funcMeandx_pos_mod1", "[0]/(x+[1])^[2]", 0.1, 10); - fMeandXNegMod1 = new TF1("funcMeandx_neg_mod1", "[0]/(x+[1])^[2]", 0.1, 10); - fMeandXPosMod2 = new TF1("funcMeandx_pos_mod2", "[0]/(x+[1])^[2]", 0.1, 10); - fMeandXNegMod2 = new TF1("funcMeandx_neg_mod2", "[0]/(x+[1])^[2]", 0.1, 10); - fMeandXPosMod3 = new TF1("funcMeandx_pos_mod3", "[0]/(x+[1])^[2]", 0.1, 10); - fMeandXNegMod3 = new TF1("funcMeandx_neg_mod3", "[0]/(x+[1])^[2]", 0.1, 10); - fMeandXPosMod4 = new TF1("funcMeandx_pos_mod4", "[0]/(x+[1])^[2]", 0.1, 10); - fMeandXNegMod4 = new TF1("funcMeandx_neg_mod4", "[0]/(x+[1])^[2]", 0.1, 10); - - fMeandXPosMod1->SetParameters(meandXPosMod1.at(0), meandXPosMod1.at(1), meandXPosMod1.at(2)); - fMeandXPosMod2->SetParameters(meandXPosMod2.at(0), meandXPosMod2.at(1), meandXPosMod2.at(2)); - fMeandXPosMod3->SetParameters(meandXPosMod3.at(0), meandXPosMod3.at(1), meandXPosMod3.at(2)); - fMeandXPosMod4->SetParameters(meandXPosMod4.at(0), meandXPosMod4.at(1), meandXPosMod4.at(2)); - - fMeandXNegMod1->SetParameters(meandXNegMod1.at(0), meandXNegMod1.at(1), meandXNegMod1.at(2)); - fMeandXNegMod2->SetParameters(meandXNegMod2.at(0), meandXNegMod2.at(1), meandXNegMod2.at(2)); - fMeandXNegMod3->SetParameters(meandXNegMod3.at(0), meandXNegMod3.at(1), meandXNegMod3.at(2)); - fMeandXNegMod4->SetParameters(meandXNegMod4.at(0), meandXNegMod4.at(1), meandXNegMod4.at(2)); + fSigma_dx->SetParameters(((std::vector)pSigmadX).at(0), ((std::vector)pSigmadX).at(1), ((std::vector)pSigmadX).at(2)); + + for (int i = 0; i < mAmountOfModules; i++) { + fMeandXPosMod[i] = new TF1(Form("funcMeandx_pos_mod%i", i + 1), "[0]/(x+[1])^[2]", 0.1, 10); + fMeandXPosMod[i]->SetParameters(pMeandXPosMod->at(3 * i), pMeandXPosMod->at(3 * i + 1), pMeandXPosMod->at(3 * i + 2)); + + fMeandXNegMod[i] = new TF1(Form("funcMeandx_neg_mod%i", i + 1), "[0]/(x+[1])^[2]", 0.1, 10); + fMeandXNegMod[i]->SetParameters(pMeandXNegMod->at(3 * i), pMeandXNegMod->at(3 * i + 1), pMeandXNegMod->at(3 * i + 2)); + } } void process(SelCollisions::iterator const& collision, aod::CaloClusters const& clusters, @@ -325,39 +300,37 @@ struct PhosElId { LOG(info) << ">>>>>>>>>>>> Magnetic field: " << bz; runNumber = bc.runNumber(); } - if (std::fabs(collision.posZ()) > 10.f) + if (std::fabs(collision.posZ()) > mColMaxZ) return; mHistManager.fill(HIST("eventCounter"), 0.5); if (!collision.alias_bit(mEvSelTrig)) return; - mHistManager.fill(HIST("TVXinPHOSCounter"), 0.5); - + mHistManager.fill(HIST("eventCounter"), 1.5); + if (isSel8) { + if (!collision.sel8()) + return; + mHistManager.fill(HIST("eventCounter"), 2.5); + } if (clusters.size() == 0) return; // Nothing to process - mHistManager.fill(HIST("hColVX"), collision.posX()); - mHistManager.fill(HIST("hColVY"), collision.posY()); - mHistManager.fill(HIST("hColVZ"), collision.posZ()); + mHistManager.fill(HIST("collision/hColVX"), collision.posX()); + mHistManager.fill(HIST("collision/hColVY"), collision.posY()); + mHistManager.fill(HIST("collision/hColVZ"), collision.posZ()); for (auto const& track : tracks) { - if (!track.has_collision() || std::fabs(track.dcaXY()) > cfgDCAxyMax || std::fabs(track.dcaZ()) > cfgDCAzMax || !track.hasTPC() || std::fabs(track.eta()) > 0.15) - continue; - if (track.pt() < cfgPtMin || track.pt() > cfgPtMax) - continue; - if (track.itsChi2NCl() > cfgITSchi2Max) - continue; - if (track.itsNCls() < cfgITSnclsMin || track.itsNCls() > cfgITSnclsMax || !((track.itsClusterMap() & uint8_t(1)) > 0)) + if (!track.has_collision() || !track.hasTPC()) continue; - if (track.tpcChi2NCl() > cfgTPCchi2Max) + if (track.itsNCls() < ITSnclsMin || track.itsNCls() > ITSnclsMax || !((track.itsClusterMap() & uint8_t(1)) > 0)) continue; - if (track.tpcNClsFound() < cfgTPCnclsMin || track.tpcNClsFound() > cfgTPCnclsMax) + if (track.tpcNClsFound() < TPCnclsMin || track.tpcNClsFound() > TPCnclsMax) continue; - if (track.tpcNClsCrossedRows() < cfgTPCnclsCRMin || track.tpcNClsCrossedRows() > cfgTPCnclsCRMax) + if (track.tpcNClsCrossedRows() < TPCnclsCRMin || track.tpcNClsCrossedRows() > TPCnclsCRMax) continue; - mHistManager.fill(HIST("hTrackVX"), track.x()); - mHistManager.fill(HIST("hTrackVY"), track.y()); - mHistManager.fill(HIST("hTrackVZ"), track.z()); + mHistManager.fill(HIST("tracks/hTrackVX"), track.x()); + mHistManager.fill(HIST("tracks/hTrackVY"), track.y()); + mHistManager.fill(HIST("tracks/hTrackVZ"), track.z()); int16_t module; float trackX = 999., trackZ = 999.; @@ -373,16 +346,16 @@ struct PhosElId { if (track.hasTPC()) { float nsigmaTPCEl = track.tpcNSigmaEl(); float nsigmaTOFEl = track.tofNSigmaEl(); - bool isTPCElectron = nsigmaTPCEl > cfgTPCNSigmaElMin && nsigmaTPCEl < cfgTPCNSigmaElMax; - bool isTOFElectron = nsigmaTOFEl > cfgTOFNSigmaElMin && nsigmaTOFEl < cfgTOFNSigmaElMax; + bool isTPCElectron = nsigmaTPCEl > TPCNSigmaElMin && nsigmaTPCEl < TPCNSigmaElMax; + bool isTOFElectron = nsigmaTOFEl > TOFNSigmaElMin && nsigmaTOFEl < TOFNSigmaElMax; isElectron = isTPCElectron || isTOFElectron; float nsigmaTPCPi = track.tpcNSigmaPi(); float nsigmaTPCKa = track.tpcNSigmaKa(); float nsigmaTPCPr = track.tpcNSigmaPr(); - bool isPion = nsigmaTPCPi > cfgTPCNSigmaPiMin && nsigmaTPCPi < cfgTPCNSigmaPiMax; - bool isKaon = nsigmaTPCKa > cfgTPCNSigmaKaMin && nsigmaTPCKa < cfgTPCNSigmaKaMax; - bool isProton = nsigmaTPCPr > cfgTPCNSigmaPrMin && nsigmaTPCPr < cfgTPCNSigmaPrMax; + bool isPion = nsigmaTPCPi > TPCNSigmaPiMin && nsigmaTPCPi < TPCNSigmaPiMax; + bool isKaon = nsigmaTPCKa > TPCNSigmaKaMin && nsigmaTPCKa < TPCNSigmaKaMax; + bool isProton = nsigmaTPCPr > TPCNSigmaPrMin && nsigmaTPCPr < TPCNSigmaPrMax; if (isElectron && !(isPion || isKaon || isProton)) isElectron = true; } @@ -401,102 +374,163 @@ struct PhosElId { bool isDispOK = testLambda(cluE, clu.m02(), clu.m20()); float posX = clu.x(), posZ = clu.z(), dX = trackX - posX, dZ = trackZ - posZ, Ep = cluE / trackMom; - mHistManager.fill(HIST("hdZpmod"), dZ, trackPT, module); - mHistManager.fill(HIST("hdXpmod"), dX, trackPT, module); + mHistManager.fill(HIST("coordinateMatching/hdZpmod"), dZ, trackPT, module); + mHistManager.fill(HIST("coordinateMatching/hdXpmod"), dX, trackPT, module); if (posTrack) { - mHistManager.fill(HIST("hdZpmod_pos"), dZ, trackPT, module); - mHistManager.fill(HIST("hdXpmod_pos"), dX, trackPT, module); + mHistManager.fill(HIST("coordinateMatching/hdZpmod_pos"), dZ, trackPT, module); + mHistManager.fill(HIST("coordinateMatching/hdXpmod_pos"), dX, trackPT, module); } else { - mHistManager.fill(HIST("hdZpmod_neg"), dZ, trackPT, module); - mHistManager.fill(HIST("hdXpmod_neg"), dX, trackPT, module); + mHistManager.fill(HIST("coordinateMatching/hdZpmod_neg"), dZ, trackPT, module); + mHistManager.fill(HIST("coordinateMatching/hdXpmod_neg"), dX, trackPT, module); } if (isDispOK) { - mHistManager.fill(HIST("hCluE_v_pt_disp"), cluE, trackPT, module); - mHistManager.fill(HIST("hEp_v_pt_disp"), Ep, trackPT, module); - mHistManager.fill(HIST("hEp_v_E_disp"), Ep, cluE, module); + mHistManager.fill(HIST("clusterSpectra/hCluE_v_pt_disp"), cluE, trackPT, module); + mHistManager.fill(HIST("energyMomentumRatio/hEp_v_pt_disp"), Ep, trackPT, module); + mHistManager.fill(HIST("energyMomentumRatio/hEp_v_E_disp"), Ep, cluE, module); if (isElectron) { - mHistManager.fill(HIST("hCluE_v_pt_disp_TPC"), cluE, trackPT, module); - mHistManager.fill(HIST("hEp_v_pt_disp_TPC"), Ep, trackPT, module); - mHistManager.fill(HIST("hEp_v_E_disp_TPC"), Ep, cluE, module); + mHistManager.fill(HIST("clusterSpectra/hCluE_v_pt_disp_TPCel"), cluE, trackPT, module); + mHistManager.fill(HIST("energyMomentumRatio/hEp_v_pt_disp_TPCel"), Ep, trackPT, module); + mHistManager.fill(HIST("energyMomentumRatio/hEp_v_E_disp_TPCel"), Ep, cluE, module); } } - if (!isWithinNSigma(module, trackPT, dZ, dX)) + if (clu.trackdist() < NsigmaTrackMatch) { + mHistManager.fill(HIST("doubleLoop/trackdist/clusterSpectra/hCluE_v_pt_Nsigma"), cluE, trackPT, module); + mHistManager.fill(HIST("doubleLoop/trackdist/energyMomentumRatio/hEp_v_pt_Nsigma"), Ep, trackPT, module); + mHistManager.fill(HIST("doubleLoop/trackdist/energyMomentumRatio/hEp_v_E_Nsigma"), Ep, cluE, module); + if (isElectron) { + mHistManager.fill(HIST("doubleLoop/trackdist/clusterSpectra/hCluE_v_pt_Nsigma_TPCel"), cluE, trackPT, module); + mHistManager.fill(HIST("doubleLoop/trackdist/energyMomentumRatio/hEp_v_pt_Nsigma_TPCel"), Ep, trackPT, module); + mHistManager.fill(HIST("doubleLoop/trackdist/energyMomentumRatio/hEp_v_E_Nsigma_TPCel"), Ep, cluE, module); + } + if (isDispOK) { + mHistManager.fill(HIST("doubleLoop/trackdist/clusterSpectra/hCluE_v_pt_Nsigma_disp"), cluE, trackPT, module); + mHistManager.fill(HIST("doubleLoop/trackdist/energyMomentumRatio/hEp_v_pt_Nsigma_disp"), Ep, trackPT, module); + mHistManager.fill(HIST("doubleLoop/trackdist/energyMomentumRatio/hEp_v_E_Nsigma_disp"), Ep, cluE, module); + if (isElectron) { + mHistManager.fill(HIST("doubleLoop/trackdist/clusterSpectra/hCluE_v_pt_Nsigma_disp_TPCel"), cluE, trackPT, module); + mHistManager.fill(HIST("doubleLoop/trackdist/energyMomentumRatio/hEp_v_pt_Nsigma_disp_TPCel"), Ep, trackPT, module); + mHistManager.fill(HIST("doubleLoop/trackdist/energyMomentumRatio/hEp_v_E_Nsigma_disp_TPCel"), Ep, cluE, module); + } + } + } + if (!isWithinNSigma(module, trackPT, dZ, dX, posTrack)) continue; - mHistManager.fill(HIST("hCluE_v_pt_Nsigma"), cluE, trackPT, module); - mHistManager.fill(HIST("hEp_v_pt_Nsigma"), Ep, trackPT, module); - mHistManager.fill(HIST("hEp_v_E_Nsigma"), Ep, cluE, module); + mHistManager.fill(HIST("clusterSpectra/hCluE_v_pt_Nsigma"), cluE, trackPT, module); + mHistManager.fill(HIST("energyMomentumRatio/hEp_v_pt_Nsigma"), Ep, trackPT, module); + mHistManager.fill(HIST("energyMomentumRatio/hEp_v_E_Nsigma"), Ep, cluE, module); if (isElectron) { - mHistManager.fill(HIST("hCluE_v_pt_Nsigma_TPC"), cluE, trackPT, module); - mHistManager.fill(HIST("hEp_v_pt_Nsigma_TPC"), Ep, trackPT, module); - mHistManager.fill(HIST("hEp_v_E_Nsigma_TPC"), Ep, cluE, module); + mHistManager.fill(HIST("clusterSpectra/hCluE_v_pt_Nsigma_TPCel"), cluE, trackPT, module); + mHistManager.fill(HIST("energyMomentumRatio/hEp_v_pt_Nsigma_TPCel"), Ep, trackPT, module); + mHistManager.fill(HIST("energyMomentumRatio/hEp_v_E_Nsigma_TPCel"), Ep, cluE, module); } if (isDispOK) { - mHistManager.fill(HIST("hCluE_v_pt_Nsigma_disp"), cluE, trackPT, module); - mHistManager.fill(HIST("hEp_v_pt_Nsigma_disp"), Ep, trackPT, module); - mHistManager.fill(HIST("hEp_v_E_Nsigma_disp"), Ep, cluE, module); + mHistManager.fill(HIST("clusterSpectra/hCluE_v_pt_Nsigma_disp"), cluE, trackPT, module); + mHistManager.fill(HIST("energyMomentumRatio/hEp_v_pt_Nsigma_disp"), Ep, trackPT, module); + mHistManager.fill(HIST("energyMomentumRatio/hEp_v_E_Nsigma_disp"), Ep, cluE, module); if (isElectron) { - mHistManager.fill(HIST("hCluE_v_pt_Nsigma_disp_TPC"), cluE, trackPT, module); - mHistManager.fill(HIST("hEp_v_pt_Nsigma_disp_TPC"), Ep, trackPT, module); - mHistManager.fill(HIST("hEp_v_E_Nsigma_disp_TPC"), Ep, cluE, module); + mHistManager.fill(HIST("clusterSpectra/hCluE_v_pt_Nsigma_disp_TPCel"), cluE, trackPT, module); + mHistManager.fill(HIST("energyMomentumRatio/hEp_v_pt_Nsigma_disp_TPCel"), Ep, trackPT, module); + mHistManager.fill(HIST("energyMomentumRatio/hEp_v_E_Nsigma_disp_TPCel"), Ep, cluE, module); } phosMatch(collision.index(), clu.index(), track.index()); } } - mHistManager.fill(HIST("hTrackPtEtaPhi"), track.pt(), track.eta(), track.phi() * TMath::RadToDeg()); - mHistManager.fill(HIST("hTrackPtEtaPhi_Phos"), track.pt(), track.trackEtaEmcal(), track.trackPhiEmcal() * TMath::RadToDeg()); - mHistManager.fill(HIST("hTrackDCA"), track.dcaXY(), track.dcaZ()); - mHistManager.fill(HIST("hTrackPhosProjMod"), trackX, trackZ, module); + mHistManager.fill(HIST("tracks/hTrackPtEtaPhi"), track.pt(), track.eta(), track.phi() * TMath::RadToDeg()); + mHistManager.fill(HIST("tracks/hTrackPtEtaPhi_Phos"), track.pt(), track.trackEtaEmcal(), track.trackPhiEmcal() * TMath::RadToDeg()); + mHistManager.fill(HIST("tracks/hTrackDCA"), track.dcaXY(), track.dcaZ()); + mHistManager.fill(HIST("tracks/hTrackPhosProjMod"), trackX, trackZ, module); } // end of double loop for (auto const& clu : clusters) { double cluE = clu.e(), cluTime = clu.time(); int mod = clu.mod(); if (cluE > mMinCluE) { - mHistManager.fill(HIST("hCluE_mod_energy_cut"), cluE, mod); - mHistManager.fill(HIST("hCluE_v_mod_v_time"), cluE, cluTime * 1e9, mod); + mHistManager.fill(HIST("clusterSpectra/hCluE_mod_energy_cut"), cluE, mod); + mHistManager.fill(HIST("clusterSpectra/hCluE_v_mod_v_time"), cluE, cluTime * 1e9, mod); if (cluTime < mMaxCluTime && cluTime > mMinCluTime) { - mHistManager.fill(HIST("hCluE_mod_time_cut"), cluE, mod); + mHistManager.fill(HIST("clusterSpectra/hCluE_mod_time_cut"), cluE, mod); if (clu.ncell() >= mMinCluNcell) { - mHistManager.fill(HIST("hCluE_mod_cell_cut"), cluE, mod); - mHistManager.fill(HIST("hCluXZ_mod"), clu.x(), clu.z(), mod); - mHistManager.fill(HIST("hCluE_ncells_mod"), cluE, clu.ncell(), mod); + mHistManager.fill(HIST("clusterSpectra/hCluE_mod_cell_cut"), cluE, mod); + mHistManager.fill(HIST("coordinateMatching/hCluXZ_mod"), clu.x(), clu.z(), mod); + mHistManager.fill(HIST("clusterSpectra/hCluE_ncells_mod"), cluE, clu.ncell(), mod); if (testLambda(cluE, clu.m02(), clu.m20())) - mHistManager.fill(HIST("hCluE_mod_disp"), cluE, mod); + mHistManager.fill(HIST("clusterSpectra/hCluE_mod_disp"), cluE, mod); } } } + + if (cluE < mMinCluE || + clu.ncell() < mMinCluNcell || + clu.time() > mMaxCluTime || clu.time() < mMinCluTime) + continue; + + if (clu.trackdist() > NsigmaTrackMatch) + continue; + auto matchedTrack = tracks.iteratorAt(clu.trackIndex()); + if (!matchedTrack.has_collision() || !matchedTrack.hasTPC()) + continue; + + if (matchedTrack.itsNCls() < ITSnclsMin || matchedTrack.itsNCls() > ITSnclsMax || !((matchedTrack.itsClusterMap() & uint8_t(1)) > 0)) + continue; + if (matchedTrack.tpcNClsFound() < TPCnclsMin || matchedTrack.tpcNClsFound() > TPCnclsMax) + continue; + if (matchedTrack.tpcNClsCrossedRows() < TPCnclsCRMin || matchedTrack.tpcNClsCrossedRows() > TPCnclsCRMax) + continue; + + mHistManager.fill(HIST("singleLoop/trackdist/clusterSpectra/hCluE_v_pt_Nsigma"), cluE, matchedTrack.pt(), mod); + mHistManager.fill(HIST("singleLoop/trackdist/energyMomentumRatio/hEp_v_pt_Nsigma"), cluE / matchedTrack.p(), matchedTrack.pt(), mod); + mHistManager.fill(HIST("singleLoop/trackdist/energyMomentumRatio/hEp_v_E_Nsigma"), cluE / matchedTrack.p(), cluE, mod); + if (testLambda(cluE, clu.m02(), clu.m20())) { + mHistManager.fill(HIST("singleLoop/trackdist/clusterSpectra/hCluE_v_pt_Nsigma_disp"), cluE, matchedTrack.pt(), mod); + mHistManager.fill(HIST("singleLoop/trackdist/energyMomentumRatio/hEp_v_pt_Nsigma_disp"), cluE / matchedTrack.p(), matchedTrack.pt(), mod); + mHistManager.fill(HIST("singleLoop/trackdist/energyMomentumRatio/hEp_v_E_Nsigma_disp"), cluE / matchedTrack.p(), cluE, mod); + } + bool isElectron = false; + if (matchedTrack.hasTPC()) { + float nsigmaTPCEl = matchedTrack.tpcNSigmaEl(); + float nsigmaTOFEl = matchedTrack.tofNSigmaEl(); + bool isTPCElectron = nsigmaTPCEl > TPCNSigmaElMin && nsigmaTPCEl < TPCNSigmaElMax; + bool isTOFElectron = nsigmaTOFEl > TOFNSigmaElMin && nsigmaTOFEl < TOFNSigmaElMax; + isElectron = isTPCElectron || isTOFElectron; + + float nsigmaTPCPi = matchedTrack.tpcNSigmaPi(); + float nsigmaTPCKa = matchedTrack.tpcNSigmaKa(); + float nsigmaTPCPr = matchedTrack.tpcNSigmaPr(); + bool isPion = nsigmaTPCPi > TPCNSigmaPiMin && nsigmaTPCPi < TPCNSigmaPiMax; + bool isKaon = nsigmaTPCKa > TPCNSigmaKaMin && nsigmaTPCKa < TPCNSigmaKaMax; + bool isProton = nsigmaTPCPr > TPCNSigmaPrMin && nsigmaTPCPr < TPCNSigmaPrMax; + if (isElectron && !(isPion || isKaon || isProton)) + isElectron = true; + } + if (isElectron) { + mHistManager.fill(HIST("singleLoop/trackdist/clusterSpectra/hCluE_v_pt_Nsigma_TPC"), cluE, matchedTrack.pt(), mod); + mHistManager.fill(HIST("singleLoop/trackdist/energyMomentumRatio/hEp_v_pt_Nsigma_TPC"), cluE / matchedTrack.p(), matchedTrack.pt(), mod); + mHistManager.fill(HIST("singleLoop/trackdist/energyMomentumRatio/hEp_v_E_Nsigma_TPC"), cluE / matchedTrack.p(), cluE, mod); + if (testLambda(cluE, clu.m02(), clu.m20())) { + mHistManager.fill(HIST("singleLoop/trackdist/clusterSpectra/hCluE_v_pt_Nsigma_disp_TPC"), cluE, matchedTrack.pt(), mod); + mHistManager.fill(HIST("singleLoop/trackdist/energyMomentumRatio/hEp_v_pt_Nsigma_disp_TPC"), cluE / matchedTrack.p(), matchedTrack.pt(), mod); + mHistManager.fill(HIST("singleLoop/trackdist/energyMomentumRatio/hEp_v_E_Nsigma_disp_TPC"), cluE / matchedTrack.p(), cluE, mod); + } + } } // end of cluster loop } - - bool isWithinNSigma(int16_t& mod, float p, float deltaZ, float deltaX) + bool isWithinNSigma(int16_t& mod, float p, float deltaZ, float deltaX, bool positiveCharge) { - if (mod == 1) { - if (std::fabs(deltaZ - PhosShiftZ[0]) > cfgNsigmaTrackMatch * fSigma_dz->Eval(p)) - return false; - if (std::fabs(deltaX - fMeandXPosMod1->Eval(p) + PhosShiftX[0]) > cfgNsigmaTrackMatch * fSigma_dx->Eval(p)) - return false; - } else if (mod == 2) { - if (std::fabs(deltaZ - PhosShiftZ[1]) > cfgNsigmaTrackMatch * fSigma_dz->Eval(p)) - return false; - if (std::fabs(deltaX - fMeandXPosMod2->Eval(p) + PhosShiftX[1]) > cfgNsigmaTrackMatch * fSigma_dx->Eval(p)) - return false; - } else if (mod == 3) { - if (std::fabs(deltaZ - PhosShiftZ[2]) > cfgNsigmaTrackMatch * fSigma_dz->Eval(p)) - return false; - if (std::fabs(deltaX - fMeandXPosMod3->Eval(p) + PhosShiftX[2]) > cfgNsigmaTrackMatch * fSigma_dx->Eval(p)) - return false; - } else if (mod == 4) { - if (std::fabs(deltaZ - PhosShiftZ[3]) > cfgNsigmaTrackMatch * fSigma_dz->Eval(p)) + int modMinus1 = mod - 1; + if (std::fabs(deltaZ - ((std::vector)pPhosShiftZ).at(modMinus1)) > NsigmaTrackMatch * fSigma_dz->Eval(p)) + return false; + if (positiveCharge) { + if (std::fabs(deltaX - fMeandXPosMod[modMinus1]->Eval(p) - ((std::vector)pPhosShiftX).at(modMinus1)) > NsigmaTrackMatch * fSigma_dx->Eval(p)) return false; - if (std::fabs(deltaX - fMeandXPosMod4->Eval(p) + PhosShiftX[3]) > cfgNsigmaTrackMatch * fSigma_dx->Eval(p)) + } else { + if (std::fabs(deltaX - fMeandXNegMod[modMinus1]->Eval(p) - ((std::vector)pPhosShiftX).at(modMinus1)) > NsigmaTrackMatch * fSigma_dx->Eval(p)) return false; } return true; } - - /////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////// taken from PHOSAlign bool impactOnPHOS(o2::track::TrackParametrization& trackPar, float trackEta, float trackPhi, float /*zvtx*/, int16_t& module, float& trackX, float& trackZ) { // eta,phi was calculated at EMCAL radius. @@ -509,12 +543,14 @@ struct PhosElId { return false; } const float dphi = 20. * 0.017453293; + trackPhi = RecoDecay::constrainAngle(trackPhi); + module = 1 + static_cast((trackPhi - phiMin) / dphi); if (module < 1) { module = 1; } - if (module > 4) { - module = 4; + if (module > mAmountOfModules) { // > 4 + module = mAmountOfModules; // = 4 } // get PHOS radius @@ -583,42 +619,45 @@ struct MassSpectra { using MyTracks = soa::Join; + Configurable isSel8{"isSel8", 1, "check if event is Single Event Latch-up 8"}; Configurable mEvSelTrig{"mEvSelTrig", kTVXinPHOS, "Select events with this trigger"}, - cfgMassBinning{"cfgMassBinning", 1000, "Binning for mass"}, - cfgEnergyBinning{"cfgEnergyBinning", 100, "Binning for energy"}, - cfgEpRatioBinning{"cfgEpRatioBinning", 200, "Binning for energy to momentum ratio"}, - cfgCentBinning{"cfgCentBinning", 10, "Binning for centrality"}, - cfgCentEst{"cfgCentEst", 1, "Centrality estimator, 0: FV0A, 1: FT0M, 2: FT0A, 3: FT0C, 4: FDDM, 5: NTPV"}; - - Configurable cfgEtaMax{"cfgEtaMax", {0.8f}, "eta ranges"}, - cfgPtMin{"cfgPtMin", {0.2f}, "pt min"}, - cfgPtMax{"cfgPtMax", {20.f}, "pt max"}, - cfgMassSpectraMin{"cfgMassSpectraMin", {2.5f}, "mass spectra min for e+e-"}, - cfgMassSpectraMax{"cfgMassSpectraMax", {3.5f}, "mass spcetra max for e+e-"}, - cfgDCAxyMax{"cfgDCAxyMax", {3.f}, "dcaxy max"}, - cfgDCAzMax{"cfgDCAzMax", {3.f}, "dcaz max"}, - cfgITSchi2Max{"cfgITSchi2Max", {5.f}, "its chi2 max"}, - cfgITSnclsMin{"cfgITSnclsMin", {4.5f}, "min number of ITS clusters"}, - cfgITSnclsMax{"cfgITSnclsMax", {7.5f}, "max number of ITS clusters"}, - cfgTPCchi2Max{"cfgTPCchi2Max", {4.f}, "tpc chi2 max"}, - cfgTPCnclsMin{"cfgTPCnclsMin", {90.f}, "min number of TPC clusters"}, - cfgTPCnclsMax{"cfgTPCnclsMax", {170.f}, "max number of TPC clusters"}, - cfgTPCnclsCRMin{"cfgTPCnclsCRMin", {80.f}, "min number of TPC crossed rows"}, - cfgTPCnclsCRMax{"cfgTPCnclsCRMax", {161.f}, "max number of TPC crossed rows"}, - cfgTPCNSigmaElMin{"cfgTPCNSigmaElMin", {-3.f}, "min TPC nsigma e for inclusion"}, - cfgTPCNSigmaElMax{"cfgTPCNSigmaElMax", {2.f}, "max TPC nsigma e for inclusion"}, - cfgTPCNSigmaPiMin{"cfgTPCNSigmaPiMin", {-3.f}, "min TPC nsigma pion for exclusion"}, - cfgTPCNSigmaPiMax{"cfgTPCNSigmaPiMax", {3.5f}, "max TPC nsigma pion for exclusion"}, - cfgTPCNSigmaPrMin{"cfgTPCNSigmaPrMin", {-3.f}, "min TPC nsigma proton for exclusion"}, - cfgTPCNSigmaPrMax{"cfgTPCNSigmaPrMax", {4.f}, "max TPC nsigma proton for exclusion"}, - cfgTPCNSigmaKaMin{"cfgTPCNSigmaKaMin", {-3.f}, "min TPC nsigma kaon for exclusion"}, - cfgTPCNSigmaKaMax{"cfgTPCNSigmaKaMax", {4.f}, "max TPC nsigma kaon for exclusion"}, - cfgTOFNSigmaElMin{"cfgTOFNSigmaElMin", {-3.f}, "min TOF nsigma e for inclusion"}, - cfgTOFNSigmaElMax{"cfgTOFNSigmaElMax", {3.f}, "max TOF nsigma e for inclusion"}, - cfgShiftEp{"cfgShiftEp", {0.055f}, "PHOS E/p shift for electrons"}, - cfgNsigmaEp{"cfgNsigmaEp", {2.f}, "PHOS E/p nsigma for inclusion"}; - - Configurable> cfgEpSigmaPars{"cfgEpSigmaPars", {1.3e-02, 1.9e-02, 1.1e-02, 3.e-02}, "E/p sigma function parameters (from alice 3 mc tests + const)"}; + MassBinning{"MassBinning", 1000, "Binning for mass"}, + EnergyBinning{"EnergyBinning", 100, "Binning for energy"}, + EpRatioBinning{"EpRatioBinning", 200, "Binning for energy to momentum ratio"}, + CentBinning{"CentBinning", 10, "Binning for centrality"}, + CentEst{"CentEst", 1, "Centrality estimator, 0: FV0A, 1: FT0M, 2: FT0A, 3: FT0C, 4: FDDM, 5: NTPV"}; + + Configurable mColMaxZ{"mColMaxZ", 10.f, "maximum z accepted in analysis"}, + fEtaMax{"fEtaMax", {0.8f}, "eta ranges"}, + fEtaMaxPhos{"fEtaMaxPhos", {0.15f}, "eta ranges of phos"}, + fPtMin{"fPtMin", {0.2f}, "pt min"}, + fPtMax{"fPtMax", {20.f}, "pt max"}, + fMassSpectraMin{"fMassSpectraMin", {2.5f}, "mass spectra min for e+e-"}, + fMassSpectraMax{"fMassSpectraMax", {3.5f}, "mass spcetra max for e+e-"}, + fDCAxyMax{"fDCAxyMax", {3.f}, "dcaxy max"}, + fDCAzMax{"fDCAzMax", {3.f}, "dcaz max"}, + fITSchi2Max{"fITSchi2Max", {5.f}, "its chi2 max"}, + fITSnclsMin{"fITSnclsMin", {4.5f}, "min number of ITS clusters"}, + fITSnclsMax{"fITSnclsMax", {7.5f}, "max number of ITS clusters"}, + fTPCchi2Max{"fTPCchi2Max", {4.f}, "tpc chi2 max"}, + fTPCnclsMin{"fTPCnclsMin", {90.f}, "min number of TPC clusters"}, + fTPCnclsMax{"fTPCnclsMax", {170.f}, "max number of TPC clusters"}, + fTPCnclsCRMin{"fTPCnclsCRMin", {80.f}, "min number of TPC crossed rows"}, + fTPCnclsCRMax{"fTPCnclsCRMax", {161.f}, "max number of TPC crossed rows"}, + fTPCNSigmaElMin{"fTPCNSigmaElMin", {-3.f}, "min TPC nsigma e for inclusion"}, + fTPCNSigmaElMax{"fTPCNSigmaElMax", {2.f}, "max TPC nsigma e for inclusion"}, + fTPCNSigmaPiMin{"fTPCNSigmaPiMin", {-3.f}, "min TPC nsigma pion for exclusion"}, + fTPCNSigmaPiMax{"fTPCNSigmaPiMax", {3.5f}, "max TPC nsigma pion for exclusion"}, + fTPCNSigmaPrMin{"fTPCNSigmaPrMin", {-3.f}, "min TPC nsigma proton for exclusion"}, + fTPCNSigmaPrMax{"fTPCNSigmaPrMax", {4.f}, "max TPC nsigma proton for exclusion"}, + fTPCNSigmaKaMin{"fTPCNSigmaKaMin", {-3.f}, "min TPC nsigma kaon for exclusion"}, + fTPCNSigmaKaMax{"fTPCNSigmaKaMax", {4.f}, "max TPC nsigma kaon for exclusion"}, + fTOFNSigmaElMin{"fTOFNSigmaElMin", {-3.f}, "min TOF nsigma e for inclusion"}, + fTOFNSigmaElMax{"fTOFNSigmaElMax", {3.f}, "max TOF nsigma e for inclusion"}, + fShiftEp{"fShiftEp", {0.055f}, "PHOS E/p shift for electrons"}, + fNsigmaEp{"fNsigmaEp", {2.f}, "PHOS E/p nsigma for inclusion"}; + + Configurable> fEpSigmaPars{"fEpSigmaPars", {1.3e-02, 1.9e-02, 1.1e-02, 3.e-02}, "E/p sigma function parameters (from alice 3 mc tests + const)"}; Service ccdb; std::unique_ptr geomPHOS; @@ -635,15 +674,14 @@ struct MassSpectra { std::vector momentumBinning = {0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 10.}; - const AxisSpec axisCounter{1, 0, +1, ""}, - axisCent{cfgCentBinning, 0, 100, "centrality percentage"}, + const AxisSpec axisCounter{3, 0, +3, ""}, + axisCent{CentBinning, 0, 100, "centrality percentage"}, axisPt{momentumBinning, "p_{T} (GeV/c)"}, - axisEp{cfgEpRatioBinning, 0., 2., "E/p", "E_{cluster}/p_{track}"}, - axisE{cfgEnergyBinning, 0, 10, "E (GeV)", "E (GeV)"}, - axisMassSpectrum{cfgMassBinning, cfgMassSpectraMin, cfgMassSpectraMax, "M (GeV/c^{2})", "Mass e^{+}e^{-} (GeV/c^{2})"}; + axisEp{EpRatioBinning, 0., 2., "E/p", "E_{cluster}/p_{track}"}, + axisE{EnergyBinning, 0, 10, "E (GeV)", "E (GeV)"}, + axisMassSpectrum{MassBinning, fMassSpectraMin, fMassSpectraMax, "M (GeV/c^{2})", "Mass e^{+}e^{-} (GeV/c^{2})"}; mHistManager.add("eventCounter", "eventCounter", kTH1F, {axisCounter}); - mHistManager.add("TVXinPHOSCounter", "TVXinPHOSCounter", kTH1F, {axisCounter}); mHistManager.add("h_eh_pp_mass_spectra_v_pt_v_cent", "Mass e^{+}h^{+} vs momentum e^{+}h^{+}", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); mHistManager.add("h_ee_pp_mass_spectra_v_pt_v_cent", "Mass e^{+}e^{+} vs momentum e^{+}e^{+}", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); @@ -665,7 +703,7 @@ struct MassSpectra { geomPHOS = std::make_unique("PHOS"); - std::vector epSigmaPars = cfgEpSigmaPars; + std::vector epSigmaPars = fEpSigmaPars; fEpSigmaPhos = new TF1("fEpSigmaPhos", "sqrt([0]*[0]/x/x+[1]*[1]/x+[2]*[2])+[3]", 0.01, 10); fEpSigmaPhos->SetParameters(epSigmaPars.at(0), epSigmaPars.at(1), epSigmaPars.at(2), epSigmaPars.at(3)); } @@ -688,18 +726,23 @@ struct MassSpectra { LOG(info) << ">>>>>>>>>>>> Magnetic field: " << bz; runNumber = bc.runNumber(); } - if (std::fabs(collision.posZ()) > 10.f) + if (std::fabs(collision.posZ()) > mColMaxZ) return; mHistManager.fill(HIST("eventCounter"), 0.5); if (!collision.alias_bit(mEvSelTrig)) return; - mHistManager.fill(HIST("TVXinPHOSCounter"), 0.5); + mHistManager.fill(HIST("eventCounter"), 1.5); + if (isSel8) { + if (!collision.sel8()) + return; + mHistManager.fill(HIST("eventCounter"), 2.5); + } if (clusters.size() == 0) return; // Nothing to process float cent = -1.; - switch (cfgCentEst) { + switch (CentEst) { case FV0A: cent = collision.centFV0A(); break; @@ -721,35 +764,34 @@ struct MassSpectra { } for (auto const& TPCel : tracks) { - - if (!TPCel.has_collision() || std::fabs(TPCel.dcaXY()) > cfgDCAxyMax || std::fabs(TPCel.dcaZ()) > cfgDCAzMax || !TPCel.hasTPC() || std::fabs(TPCel.eta()) > 0.15) + if (!TPCel.has_collision() || std::fabs(TPCel.dcaXY()) > fDCAxyMax || std::fabs(TPCel.dcaZ()) > fDCAzMax || !TPCel.hasTPC() || std::fabs(TPCel.eta()) > fEtaMaxPhos) continue; - if (TPCel.pt() < cfgPtMin || TPCel.pt() > cfgPtMax) + if (TPCel.pt() < fPtMin || TPCel.pt() > fPtMax) continue; - if (TPCel.itsChi2NCl() > cfgITSchi2Max) + if (TPCel.itsChi2NCl() > fITSchi2Max) continue; - if (TPCel.itsNCls() < cfgITSnclsMin || TPCel.itsNCls() > cfgITSnclsMax || !((TPCel.itsClusterMap() & uint8_t(1)) > 0)) + if (TPCel.itsNCls() < fITSnclsMin || TPCel.itsNCls() > fITSnclsMax || !((TPCel.itsClusterMap() & uint8_t(1)) > 0)) continue; - if (TPCel.tpcChi2NCl() > cfgTPCchi2Max) + if (TPCel.tpcChi2NCl() > fTPCchi2Max) continue; - if (TPCel.tpcNClsFound() < cfgTPCnclsMin || TPCel.tpcNClsFound() > cfgTPCnclsMax) + if (TPCel.tpcNClsFound() < fTPCnclsMin || TPCel.tpcNClsFound() > fTPCnclsMax) continue; - if (TPCel.tpcNClsCrossedRows() < cfgTPCnclsCRMin || TPCel.tpcNClsCrossedRows() > cfgTPCnclsCRMax) + if (TPCel.tpcNClsCrossedRows() < fTPCnclsCRMin || TPCel.tpcNClsCrossedRows() > fTPCnclsCRMax) continue; bool isElectron = false; float nsigmaTPCEl = TPCel.tpcNSigmaEl(); float nsigmaTOFEl = TPCel.tofNSigmaEl(); - bool isTPCElectron = nsigmaTPCEl > cfgTPCNSigmaElMin && nsigmaTPCEl < cfgTPCNSigmaElMax; - bool isTOFElectron = nsigmaTOFEl > cfgTOFNSigmaElMin && nsigmaTOFEl < cfgTOFNSigmaElMax; + bool isTPCElectron = nsigmaTPCEl > fTPCNSigmaElMin && nsigmaTPCEl < fTPCNSigmaElMax; + bool isTOFElectron = nsigmaTOFEl > fTOFNSigmaElMin && nsigmaTOFEl < fTOFNSigmaElMax; isElectron = isTPCElectron || isTOFElectron; float nsigmaTPCPi = TPCel.tpcNSigmaPi(); float nsigmaTPCKa = TPCel.tpcNSigmaKa(); float nsigmaTPCPr = TPCel.tpcNSigmaPr(); - bool isPion = nsigmaTPCPi > cfgTPCNSigmaPiMin && nsigmaTPCPi < cfgTPCNSigmaPiMax; - bool isKaon = nsigmaTPCKa > cfgTPCNSigmaKaMin && nsigmaTPCKa < cfgTPCNSigmaKaMax; - bool isProton = nsigmaTPCPr > cfgTPCNSigmaPrMin && nsigmaTPCPr < cfgTPCNSigmaPrMax; + bool isPion = nsigmaTPCPi > fTPCNSigmaPiMin && nsigmaTPCPi < fTPCNSigmaPiMax; + bool isKaon = nsigmaTPCKa > fTPCNSigmaKaMin && nsigmaTPCKa < fTPCNSigmaKaMax; + bool isProton = nsigmaTPCPr > fTPCNSigmaPrMin && nsigmaTPCPr < fTPCNSigmaPrMax; if (isElectron && !(isPion || isKaon || isProton)) isElectron = true; if (!isElectron) @@ -765,35 +807,34 @@ struct MassSpectra { if (TPCel.index() >= track2.index()) break; - float mass2Tracks = 0, mom2Tracks = 0, cluE = clust2.e(); - TLorentzVector fourVectorP1, fourVectorP2; + float mass2Tracks = 0, momProbeTrack = track2.pt(), cluE = clust2.e(); + ROOT::Math::LorentzVector> fourVectorP1, fourVectorP2; fourVectorP1.SetPxPyPzE(TPCel.px(), TPCel.py(), TPCel.pz(), TPCel.energy(0)); fourVectorP2.SetPxPyPzE(track2.px(), track2.py(), track2.pz(), track2.energy(0)); - mom2Tracks = (fourVectorP1 + fourVectorP2).Pt(); mass2Tracks = (fourVectorP1 + fourVectorP2).M(); - bool elCandidate = (std::fabs(cluE / track2.p() - cfgShiftEp - 1) < cfgNsigmaEp * fEpSigmaPhos->Eval(cluE)); + bool elCandidate = (std::fabs(cluE / track2.p() - fShiftEp - 1) < fNsigmaEp * fEpSigmaPhos->Eval(cluE)); if (TPCel.sign() == track2.sign()) { if (posTrack) { - mHistManager.fill(HIST("h_eh_pp_mass_spectra_v_pt_v_cent"), mass2Tracks, mom2Tracks, cent); + mHistManager.fill(HIST("h_eh_pp_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); mHistManager.fill(HIST("h_eh_pp_mass_spectra_v_E_v_cent"), mass2Tracks, cluE, cent); if (elCandidate) { - mHistManager.fill(HIST("h_ee_pp_mass_spectra_v_pt_v_cent"), mass2Tracks, mom2Tracks, cent); + mHistManager.fill(HIST("h_ee_pp_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); mHistManager.fill(HIST("h_ee_pp_mass_spectra_v_E_v_cent"), mass2Tracks, cluE, cent); } } else { - mHistManager.fill(HIST("h_eh_mm_mass_spectra_v_pt_v_cent"), mass2Tracks, mom2Tracks, cent); + mHistManager.fill(HIST("h_eh_mm_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); mHistManager.fill(HIST("h_eh_mm_mass_spectra_v_E_v_cent"), mass2Tracks, cluE, cent); if (elCandidate) { - mHistManager.fill(HIST("h_ee_mm_mass_spectra_v_pt_v_cent"), mass2Tracks, mom2Tracks, cent); + mHistManager.fill(HIST("h_ee_mm_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); mHistManager.fill(HIST("h_ee_mm_mass_spectra_v_E_v_cent"), mass2Tracks, cluE, cent); } } } else { - mHistManager.fill(HIST("h_eh_mp_mass_spectra_v_pt_v_cent"), mass2Tracks, mom2Tracks, cent); + mHistManager.fill(HIST("h_eh_mp_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); mHistManager.fill(HIST("h_eh_mp_mass_spectra_v_E_v_cent"), mass2Tracks, cluE, cent); if (elCandidate) { - mHistManager.fill(HIST("h_ee_mp_mass_spectra_v_pt_v_cent"), mass2Tracks, mom2Tracks, cent); + mHistManager.fill(HIST("h_ee_mp_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); mHistManager.fill(HIST("h_ee_mp_mass_spectra_v_E_v_cent"), mass2Tracks, cluE, cent); } } @@ -806,7 +847,7 @@ struct MassSpectra { float cluE = clust.e(); float epRatio = cluE / track.p(); mHistManager.fill(HIST("hEp_v_E_v_cent"), epRatio, cluE, cent); - bool elCandidate = (std::fabs(epRatio - cfgShiftEp - 1) < cfgNsigmaEp * fEpSigmaPhos->Eval(cluE)); + bool elCandidate = (std::fabs(epRatio - fShiftEp - 1) < fNsigmaEp * fEpSigmaPhos->Eval(cluE)); if (elCandidate) mHistManager.fill(HIST("hEp_v_E_v_cent_cutEp"), epRatio, cluE, cent); } @@ -822,62 +863,69 @@ struct TpcElIdMassSpectrum { using MyTracks = soa::Join; - Configurable mMinCluE{"mMinCluE", 0.1, "Minimum cluster energy for photons in the analysis"}, + Configurable isSel8{"isSel8", 1, "check if event is Single Event Latch-up 8"}; + Configurable mColMaxZ{"mColMaxZ", 10.f, "maximum z accepted in analysis"}, + mMinCluE{"mMinCluE", 0.1, "Minimum cluster energy for photons in the analysis"}, mCutMIPCluE{"mCutMIPCluE", 0.3, "Min cluster energy to reject MIPs in the analysis"}, mMaxCluE{"mMaxCluE", 1., "Maximum cluster energy for photons in the analysis"}, mMinCluTime{"minCluTime", -25.e-9, "Min. cluster time"}, mMaxCluTime{"mMaxCluTime", 25.e-9, "Max. cluster time"}, - cfgEtaMax{"cfgEtaMax", {0.8f}, "eta ranges"}, - cfgPtMin{"cfgPtMin", {0.2f}, "pt min"}, - cfgPtMax{"cfgPtMax", {20.f}, "pt max"}, - cfgMassSpectraJpsiMin{"cfgMassSpectraJpsiMin", {2.5f}, "mass spectra min for Jpsi region"}, - cfgMassSpectraJpsiMax{"cfgMassSpectraJpsiMax", {3.5f}, "mass spcetra max for Jpsi region"}, - cfgMassSpectraChicMin{"cfgMassSpectraChicMin", {3.f}, "mass spectra min Chic region"}, - cfgMassSpectraChicMax{"cfgMassSpectraChicMax", {4.f}, "mass spcetra max Chic region"}, - cfgDCAxyMax{"cfgDCAxyMax", {3.f}, "dcaxy max"}, - cfgDCAzMax{"cfgDCAzMax", {3.f}, "dcaz max"}, - cfgITSchi2Max{"cfgITSchi2Max", {5.f}, "its chi2 max"}, - cfgITSnclsMin{"cfgITSnclsMin", {4.5f}, "min number of ITS clusters"}, - cfgITSnclsMax{"cfgITSnclsMax", {7.5f}, "max number of ITS clusters"}, - cfgTPCchi2Max{"cfgTPCchi2Max", {4.f}, "tpc chi2 max"}, - cfgTPCnclsMin{"cfgTPCnclsMin", {90.f}, "min number of TPC clusters"}, - cfgTPCnclsMax{"cfgTPCnclsMax", {170.f}, "max number of TPC clusters"}, - cfgTPCnclsCRMin{"cfgTPCnclsCRMin", {80.f}, "min number of TPC crossed rows"}, - cfgTPCnclsCRMax{"cfgTPCnclsCRMax", {161.f}, "max number of TPC crossed rows"}, - cfgTPCNSigmaElMin{"cfgTPCNSigmaElMin", {-3.f}, "min TPC nsigma e for inclusion"}, - cfgTPCNSigmaElMax{"cfgTPCNSigmaElMax", {2.f}, "max TPC nsigma e for inclusion"}, - cfgTPCNSigmaPiMin{"cfgTPCNSigmaPiMin", {-3.f}, "min TPC nsigma pion for exclusion"}, - cfgTPCNSigmaPiMax{"cfgTPCNSigmaPiMax", {3.5f}, "max TPC nsigma pion for exclusion"}, - cfgTPCNSigmaPrMin{"cfgTPCNSigmaPrMin", {-3.f}, "min TPC nsigma proton for exclusion"}, - cfgTPCNSigmaPrMax{"cfgTPCNSigmaPrMax", {4.f}, "max TPC nsigma proton for exclusion"}, - cfgTPCNSigmaKaMin{"cfgTPCNSigmaKaMin", {-3.f}, "min TPC nsigma kaon for exclusion"}, - cfgTPCNSigmaKaMax{"cfgTPCNSigmaKaMax", {4.f}, "max TPC nsigma kaon for exclusion"}, - cfgTOFNSigmaElMin{"cfgTOFNSigmaElMin", {-3.f}, "min TOF nsigma e for inclusion"}, - cfgTOFNSigmaElMax{"cfgTOFNSigmaElMax", {3.f}, "max TOF nsigma e for inclusion"}, - cfgPhosRangeEta{"cfgPhosRangeEta", {0.12f}, "Phos range definition plus minus eta"}, - cfgPhosRangePhiMin{"cfgPhosRangePhiMin", {230.f}, "Phos range angle phi min"}, - cfgPhosRangePhiMax{"cfgPhosRangePhiMax", {330.f}, "Phos range angle phi max"}, - cfgeeMassMin{"cfgeeMassMin", {2.9f}, "J/psi(e+e-) Mass corridor lower limit"}, - cfgeeMassMax{"cfgeeMassMax", {3.3f}, "J/psi(e+e-) Mass corridor upper limit"}, - cfgJpsiMass{"cfgJpsiMass", {3.097f}, "J/psi Mass constant"}; + EtaMax{"EtaMax", {0.8f}, "eta ranges"}, + PtMin{"PtMin", {0.2f}, "pt min"}, + PtMax{"PtMax", {20.f}, "pt max"}, + MassSpectraJpsiMin{"MassSpectraJpsiMin", {2.5f}, "mass spectra min for Jpsi region"}, + MassSpectraJpsiMax{"MassSpectraJpsiMax", {3.5f}, "mass spcetra max for Jpsi region"}, + MassSpectraChicMin{"MassSpectraChicMin", {3.f}, "mass spectra min Chic region"}, + MassSpectraChicMax{"MassSpectraChicMax", {4.f}, "mass spcetra max Chic region"}, + DCAxyMax{"DCAxyMax", {3.f}, "dcaxy max"}, + DCAzMax{"DCAzMax", {3.f}, "dcaz max"}, + ITSchi2Max{"ITSchi2Max", {5.f}, "its chi2 max"}, + ITSnclsMin{"ITSnclsMin", {4.5f}, "min number of ITS clusters"}, + ITSnclsMax{"ITSnclsMax", {7.5f}, "max number of ITS clusters"}, + TPCchi2Max{"TPCchi2Max", {4.f}, "tpc chi2 max"}, + TPCnclsMin{"TPCnclsMin", {90.f}, "min number of TPC clusters"}, + TPCnclsMax{"TPCnclsMax", {170.f}, "max number of TPC clusters"}, + TPCnclsCRMin{"TPCnclsCRMin", {80.f}, "min number of TPC crossed rows"}, + TPCnclsCRMax{"TPCnclsCRMax", {161.f}, "max number of TPC crossed rows"}, + TPCNSigmaElMin{"TPCNSigmaElMin", {-3.f}, "min TPC nsigma e for inclusion"}, + TPCNSigmaElMax{"TPCNSigmaElMax", {2.f}, "max TPC nsigma e for inclusion"}, + TPCNSigmaPiMin{"TPCNSigmaPiMin", {-3.f}, "min TPC nsigma pion for exclusion"}, + TPCNSigmaPiMax{"TPCNSigmaPiMax", {3.5f}, "max TPC nsigma pion for exclusion"}, + TPCNSigmaPrMin{"TPCNSigmaPrMin", {-3.f}, "min TPC nsigma proton for exclusion"}, + TPCNSigmaPrMax{"TPCNSigmaPrMax", {4.f}, "max TPC nsigma proton for exclusion"}, + TPCNSigmaKaMin{"TPCNSigmaKaMin", {-3.f}, "min TPC nsigma kaon for exclusion"}, + TPCNSigmaKaMax{"TPCNSigmaKaMax", {4.f}, "max TPC nsigma kaon for exclusion"}, + TOFNSigmaElMin{"TOFNSigmaElMin", {-3.f}, "min TOF nsigma e for inclusion"}, + TOFNSigmaElMax{"TOFNSigmaElMax", {3.f}, "max TOF nsigma e for inclusion"}, + PhosRangeEta{"PhosRangeEta", {0.12f}, "Phos range definition plus minus eta"}, + PhosRangePhiMin{"PhosRangePhiMin", {230.f}, "Phos range angle phi min"}, + PhosRangePhiMax{"PhosRangePhiMax", {330.f}, "Phos range angle phi max"}, + eeMassMin{"eeMassMin", {2.9f}, "J/psi(e+e-) Mass corridor lower limit"}, + eeMassMax{"eeMassMax", {3.3f}, "J/psi(e+e-) Mass corridor upper limit"}, + JpsiMass{"JpsiMass", {3.097f}, "J/psi Mass constant"}, + mMassSpectrumLowerCutoff{"mMassSpectrumLowerCutoff", {0.01f}, "Used to exclude 0+0 masses"}, + mLowMassRegionUpperThreshold{"mLowMassRegionUpperThreshold", {1.75f}, "Arbitrary upper limit for low mass region"}; Configurable mEvSelTrig{"mEvSelTrig", kTVXinPHOS, "Select events with this trigger"}, - cfgCentBinning{"cfgCentBinning", 10, "Binning for centrality"}, - cfgCentEst{"cfgCentEst", 1, "Centrality estimator, 0: FV0A, 1: FT0M, 2: FT0A, 3: FT0C, 4: FDDM, 5: NTPV"}, - cfgMassBinning{"cfgMassBinning", 1000, "Binning for mass"}, - cfgEnergyBinning{"cfgEnergyBinning", 100, "Binning for energy"}, + CentBinning{"CentBinning", 10, "Binning for centrality"}, + CentEst{"CentEst", 1, "Centrality estimator, 0: FV0A, 1: FT0M, 2: FT0A, 3: FT0C, 4: FDDM, 5: NTPV"}, + MassBinning{"MassBinning", 1000, "Binning for mass"}, + EnergyBinning{"EnergyBinning", 100, "Binning for energy"}, mMinCluNcell{"minCluNcell", 3, "min cells in cluster"}; - Filter ptFilter = (aod::track::pt > cfgPtMin) && (aod::track::pt < cfgPtMax), - etaFilter = nabs(aod::track::eta) < cfgEtaMax, - dcaxyFilter = nabs(aod::track::dcaXY) < cfgDCAxyMax, - dcazFilter = nabs(aod::track::dcaZ) < cfgDCAzMax; + Filter ptFilter = (aod::track::pt > PtMin) && (aod::track::pt < PtMax), + etaFilter = nabs(aod::track::eta) < EtaMax, + dcaxyFilter = nabs(aod::track::dcaXY) < DCAxyMax, + dcazFilter = nabs(aod::track::dcaZ) < DCAzMax, + itschi2filter = aod::track::itsChi2NCl < ITSchi2Max, + tpcchi2filter = aod::track::tpcChi2NCl < TPCchi2Max, + mapfilter = (aod::track::itsClusterMap & uint8_t(1)) > 0; - Filter tpctofEl = ((aod::pidtpc::tpcNSigmaEl > cfgTPCNSigmaElMin) && (aod::pidtpc::tpcNSigmaEl < cfgTPCNSigmaElMax)) || - ((aod::pidtof::tofNSigmaEl > cfgTOFNSigmaElMin) && (aod::pidtof::tofNSigmaEl < cfgTOFNSigmaElMax)), - tpcPiRej = (aod::pidtpc::tpcNSigmaPi < cfgTPCNSigmaPiMin) || (aod::pidtpc::tpcNSigmaPi > cfgTPCNSigmaPiMax), - tpcKaRej = (aod::pidtpc::tpcNSigmaKa < cfgTPCNSigmaKaMin) || (aod::pidtpc::tpcNSigmaKa > cfgTPCNSigmaPrMax), - tpcPrRej = (aod::pidtpc::tpcNSigmaPr < cfgTPCNSigmaPrMin) || (aod::pidtpc::tpcNSigmaPr > cfgTPCNSigmaPrMax); + Filter tpctofEl = ((aod::pidtpc::tpcNSigmaEl > TPCNSigmaElMin) && (aod::pidtpc::tpcNSigmaEl < TPCNSigmaElMax)) || + ((aod::pidtof::tofNSigmaEl > TOFNSigmaElMin) && (aod::pidtof::tofNSigmaEl < TOFNSigmaElMax)), + tpcPiRej = (aod::pidtpc::tpcNSigmaPi < TPCNSigmaPiMin) || (aod::pidtpc::tpcNSigmaPi > TPCNSigmaPiMax), + tpcKaRej = (aod::pidtpc::tpcNSigmaKa < TPCNSigmaKaMin) || (aod::pidtpc::tpcNSigmaKa > TPCNSigmaPrMax), + tpcPrRej = (aod::pidtpc::tpcNSigmaPr < TPCNSigmaPrMin) || (aod::pidtpc::tpcNSigmaPr > TPCNSigmaPrMax); Service ccdb; double bz{0.}; // magnetic field @@ -892,95 +940,80 @@ struct TpcElIdMassSpectrum { std::vector momentumBinning = {0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 10.}; - const AxisSpec axisCounter{1, 0, +1, ""}, - axisCent{cfgCentBinning, 0, 100, "centrality percentage"}, + const AxisSpec axisCounter{3, 0, +3, ""}, + axisCent{CentBinning, 0, 100, "centrality percentage"}, axisVTrackX{400, -5., 5., "track vertex x (cm)", "track vertex x (cm)"}, axisVTrackY{400, -5., 5., "track vertex y (cm)", "track vertex y (cm)"}, axisVTrackZ{400, -20., 20., "track vertex z (cm)", "track vertex z (cm)"}, - axisE{cfgEnergyBinning, 0, 10, "E (GeV)", "E (GeV)"}, - axisMassSpectrum{cfgMassBinning, cfgMassSpectraJpsiMin, cfgMassSpectraJpsiMax, "M (GeV/c^{2})", "Mass e^{+}e^{-} (GeV/c^{2})"}, - axisMassSpectrumChiC{cfgMassBinning, cfgMassSpectraChicMin, cfgMassSpectraChicMax, "M (GeV/c^{2})", "Mass e^{+}e^{-}#gamma (GeV/c^{2})"}, - axisMassSpectrumChiCNoJpsiErrors{cfgMassBinning, cfgMassSpectraChicMin, cfgMassSpectraChicMax, "M (GeV/c^{2})", "Mass e^{+}e^{-}#gamma - Mass e^{+}e^{-} + Mass J/#psi (GeV/c^{2})"}, + axisE{EnergyBinning, 0, 10, "E (GeV)", "E (GeV)"}, + axisMassSpectrum{MassBinning, MassSpectraJpsiMin, MassSpectraJpsiMax, "M (GeV/c^{2})", "Mass e^{+}e^{-} (GeV/c^{2})"}, + axisMassSpectrumlmee{MassBinning, 0.4, 1.2, "M (GeV/c^{2})", "Mass e^{+}e^{-} (GeV/c^{2})"}, + axisMassSpectrumChiC{MassBinning, MassSpectraChicMin, MassSpectraChicMax, "M (GeV/c^{2})", "Mass e^{+}e^{-}#gamma (GeV/c^{2})"}, + axisMassSpectrumChiCNoJpsiErrors{MassBinning, MassSpectraChicMin, MassSpectraChicMax, "M (GeV/c^{2})", "Mass e^{+}e^{-}#gamma - Mass e^{+}e^{-} + Mass J/#psi (GeV/c^{2})"}, + axisMassSpectrumgammagamma{MassBinning, 0, 0.3, "M (GeV/c^{2})", "Mass #gamma#gamma (GeV/c^{2})"}, axisTPC{1000, 0, 200, "TPC signal (dE/dx)"}, axisPt{momentumBinning, "p_{T} (GeV/c)"}, + axisPtProbe{momentumBinning, "Probe p_{T} (GeV/c)"}, axisPtBig{2000, 0, 20, "p_{T} (GeV/c)"}, axisEta{600, -3., 3., "#eta"}; mHistManager.add("eventCounter", "eventCounter", kTH1F, {axisCounter}); + mHistManager.add("centCounter", "centCounter", kTH1F, {axisCent}); mHistManager.add("hTPCspectra", "TPC dE/dx spectra", HistType::kTH2F, {axisPt, axisTPC}); mHistManager.add("hTPCspectra_isElectronRej", "isElectron with rejection | TPC dE/dx spectra", HistType::kTH2F, {axisPt, axisTPC}); - mHistManager.add("h_TPCee_MS_mp_v_pt_v_cent", "Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp} (from TPC candidates)", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); - mHistManager.add("h_TPCee_MS_mm_v_pt_v_cent", "Mass e^{-}e^{-} vs momentum e^{-}e^{-} (from TPC candidates)", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); - mHistManager.add("h_TPCee_MS_pp_v_pt_v_cent", "Mass e^{+}e^{+} vs momentum e^{+}e^{+} (from TPC candidates)", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); - - mHistManager.add("h_TPCee_MS_mp_phosRange_v_pt_v_cent", "Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp} (from TPC candidates) with one e in phos acceptance range", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); - mHistManager.add("h_TPCee_MS_mm_phosRange_v_pt_v_cent", "Mass e^{-}e^{-} vs momentum e^{-}e^{-} (from TPC candidates) with one e in phos acceptance range", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); - mHistManager.add("h_TPCee_MS_pp_phosRange_v_pt_v_cent", "Mass e^{+}e^{+} vs momentum e^{+}e^{+} (from TPC candidates) with one e in phos acceptance range", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); - - mHistManager.add("h_TPCee_MS_mp_phosRange_kTVXinPHOS_v_pt_v_cent", "Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp} (from TPC candidates) with one e in phos acceptance range", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); - mHistManager.add("h_TPCee_MS_mm_phosRange_kTVXinPHOS_v_pt_v_cent", "Mass e^{-}e^{-} vs momentum e^{-}e^{-} (from TPC candidates) with one e in phos acceptance range", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); - mHistManager.add("h_TPCee_MS_pp_phosRange_kTVXinPHOS_v_pt_v_cent", "Mass e^{+}e^{+} vs momentum e^{+}e^{+} (from TPC candidates) with one e in phos acceptance range", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); - - mHistManager.add("h_TPCeePhosGamma_MS_withMatches_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}Track vs momentum e^{#pm}e^{#mp}Track", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_MS_noMatches_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_MS_noMatches_aroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_MS_noMatches_aroundJpsi_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | DispOK", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_MS_noMatches_aroundJpsi_DispNotOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_MS_noMatches_notAroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma (not around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_MS_noMatches_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | DispOK", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_MS_noMatches_DispNotOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_MS_aroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_MS_notAroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma (not around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_MS_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | DispOK", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_MS_DispNotOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_notMIP_MS_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_notMIP_MS_withMatches_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}Track vs momentum e^{#pm}e^{#mp}Track | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_notMIP_MS_noMatches_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_notMIP_MS_noMatches_aroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_notMIP_MS_noMatches_aroundJpsi_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | DispOK | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_notMIP_MS_noMatches_aroundJpsi_DispNotOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_notMIP_MS_noMatches_notAroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma (not around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_notMIP_MS_noMatches_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | DispOK | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_notMIP_MS_noMatches_DispNotOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_notMIP_MS_aroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_notMIP_MS_notAroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma (not around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_notMIP_MS_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | DispOK | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_notMIP_MS_DispNotOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_isMIP_MS_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | cluE < E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); - - mHistManager.add("h_TPCeePhosGamma_MS_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma (TPC candidates + Phos cluster)", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_MS_v_cluE", "Mass e^{#pm}e^{#mp}#gamma vs cluster Energy left by the photon", HistType::kTH3F, {axisMassSpectrumChiC, axisE, axisCent}); - - mHistManager.add("h_TPCeePhosGamma_minusee_MS_withMatches_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}Track - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}Track", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_minusee_MS_noMatches_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_minusee_MS_noMatches_aroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_minusee_MS_noMatches_aroundJpsi_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | DispOK", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_minusee_MS_noMatches_aroundJpsi_DispNotOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_minusee_MS_noMatches_notAroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (not around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_minusee_MS_noMatches_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | DispOK", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_minusee_MS_noMatches_DispNotOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_minusee_MS_aroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_minusee_MS_notAroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (not around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_minusee_MS_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | DispOK", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_minusee_MS_DispNotOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_withMatches_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}Track - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}Track | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_aroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_aroundJpsi_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | DispOK | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_aroundJpsi_DispNotOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_notAroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (not around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | DispOK | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_DispNotOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_aroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_notAroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (not around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | DispOK | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_notMIP_minusee_MS_DispNotOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | DispNotOK | cluE > E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_isMIP_minusee_MS_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | cluE < E_{MIP}", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); - - mHistManager.add("h_TPCeePhosGamma_minusee_MS_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} - Mass e^{#pm}e^{#mp} + Mass J/#psi vs momentum e^{#pm}e^{#mp}#gamma (TPC candidates + Phos cluster)", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); - mHistManager.add("h_TPCeePhosGamma_minusee_MS_v_cluE", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} - Mass e^{#pm}e^{#mp} + Mass J/#psi vs cluster Energy left by the photon", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisE, axisCent}); + mHistManager.add("TPCee/h_MS_mp_v_pt_v_cent", "Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp} (from TPC candidates)", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); + mHistManager.add("TPCee/h_MS_mm_v_pt_v_cent", "Mass e^{-}e^{-} vs momentum e^{-}e^{-} (from TPC candidates)", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); + mHistManager.add("TPCee/h_MS_pp_v_pt_v_cent", "Mass e^{+}e^{+} vs momentum e^{+}e^{+} (from TPC candidates)", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); + + mHistManager.add("TPCee/h_MS_mp_kTVXinPHOS_v_pt_v_cent", "TVXinPHOS | Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp} (from TPC candidates)", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); + mHistManager.add("TPCee/h_MS_mm_kTVXinPHOS_v_pt_v_cent", "TVXinPHOS | Mass e^{-}e^{-} vs momentum e^{-}e^{-} (from TPC candidates)", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); + mHistManager.add("TPCee/h_MS_pp_kTVXinPHOS_v_pt_v_cent", "TVXinPHOS | Mass e^{+}e^{+} vs momentum e^{+}e^{+} (from TPC candidates)", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); + + mHistManager.add("TPCee/h_MS_mp_phosRange_v_pt_v_cent", "Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp} (from TPC candidates) with one e in phos acceptance range", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); + mHistManager.add("TPCee/h_MS_mm_phosRange_v_pt_v_cent", "Mass e^{-}e^{-} vs momentum e^{-}e^{-} (from TPC candidates) with one e in phos acceptance range", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); + mHistManager.add("TPCee/h_MS_pp_phosRange_v_pt_v_cent", "Mass e^{+}e^{+} vs momentum e^{+}e^{+} (from TPC candidates) with one e in phos acceptance range", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); + + mHistManager.add("TPCee/h_MS_mp_phosRange_kTVXinPHOS_v_pt_v_cent", "TVXinPHOS | Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp} (from TPC candidates) with one e in phos acceptance range", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); + mHistManager.add("TPCee/h_MS_mm_phosRange_kTVXinPHOS_v_pt_v_cent", "TVXinPHOS | Mass e^{-}e^{-} vs momentum e^{-}e^{-} (from TPC candidates) with one e in phos acceptance range", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); + mHistManager.add("TPCee/h_MS_pp_phosRange_kTVXinPHOS_v_pt_v_cent", "TVXinPHOS | Mass e^{+}e^{+} vs momentum e^{+}e^{+} (from TPC candidates) with one e in phos acceptance range", HistType::kTH3F, {axisMassSpectrum, axisPt, axisCent}); + + mHistManager.add("TPCeePhosGamma/h_MS_noMatches_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("TPCeePhosGamma/h_MS_noMatches_aroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("TPCeePhosGamma/h_MS_noMatches_aroundJpsi_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | DispOK", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("TPCeePhosGamma/h_MS_noMatches_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | DispOK", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("TPCeePhosGamma/h_MS_aroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("TPCeePhosGamma/h_MS_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma | DispOK", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + + mHistManager.add("TPCeePhosGamma/h_MS_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs momentum e^{#pm}e^{#mp}#gamma (TPC candidates + Phos cluster)", HistType::kTH3F, {axisMassSpectrumChiC, axisPt, axisCent}); + mHistManager.add("TPCeePhosGamma/h_MS_v_cluE_v_cent", "Mass e^{#pm}e^{#mp}#gamma vs cluster Energy left by the photon", HistType::kTH3F, {axisMassSpectrumChiC, axisE, axisCent}); + + mHistManager.add("TPCeePhosGamma/h_minusee_MS_noMatches_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("TPCeePhosGamma/h_minusee_MS_noMatches_aroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("TPCeePhosGamma/h_minusee_MS_noMatches_aroundJpsi_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma | DispOK", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("TPCeePhosGamma/h_minusee_MS_noMatches_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | DispOK", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("TPCeePhosGamma/h_minusee_MS_aroundJpsi_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} (around J/#psi) vs momentum e^{#pm}e^{#mp}#gamma", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("TPCeePhosGamma/h_minusee_MS_DispOK_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}#gamma | DispOK", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + + mHistManager.add("TPCeePhosGamma/h_minusee_MS_v_3pt_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} - Mass e^{#pm}e^{#mp} + Mass J/#psi vs momentum e^{#pm}e^{#mp}#gamma (TPC candidates + Phos cluster)", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisPt, axisCent}); + mHistManager.add("TPCeePhosGamma/h_minusee_MS_v_cluE_v_cent", "Mass e^{#pm}e^{#mp}#gamma - Mass e^{#pm}e^{#mp} - Mass e^{#pm}e^{#mp} + Mass J/#psi vs cluster Energy left by the photon", HistType::kTH3F, {axisMassSpectrumChiCNoJpsiErrors, axisE, axisCent}); + + mHistManager.add("twoPhoton/MS_noCuts", "Mass vs Transverse Momentum for #gamma#gamma", HistType::kTH3F, {axisMassSpectrumgammagamma, axisPt, axisCent}); + mHistManager.add("twoPhoton/MS_noMatches", "Mass vs Transverse Momentum for #gamma#gamma excluding trackmatched clusters", HistType::kTH3F, {axisMassSpectrumgammagamma, axisPt, axisCent}); + + mHistManager.add("TPCeff/h_eh_pp_mass_spectra_v_pt_v_cent", "Mass e^{+}h^{+} vs momentum e^{+}h^{+}", HistType::kTH3F, {axisMassSpectrum, axisPtProbe, axisCent}); + mHistManager.add("TPCeff/h_ee_pp_mass_spectra_v_pt_v_cent", "Mass e^{+}e^{+} vs momentum e^{+}e^{+}", HistType::kTH3F, {axisMassSpectrum, axisPtProbe, axisCent}); + mHistManager.add("TPCeff/h_eh_mm_mass_spectra_v_pt_v_cent", "Mass e^{-}h^{-} vs momentum e^{-}h^{-}", HistType::kTH3F, {axisMassSpectrum, axisPtProbe, axisCent}); + mHistManager.add("TPCeff/h_ee_mm_mass_spectra_v_pt_v_cent", "Mass e^{-}e^{-} vs momentum e^{-}e^{-}", HistType::kTH3F, {axisMassSpectrum, axisPtProbe, axisCent}); + mHistManager.add("TPCeff/h_eh_mp_mass_spectra_v_pt_v_cent", "Mass e^{#pm}h^{#mp} vs momentum e^{#pm}h^{#mp}", HistType::kTH3F, {axisMassSpectrum, axisPtProbe, axisCent}); + mHistManager.add("TPCeff/h_ee_mp_mass_spectra_v_pt_v_cent", "Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}", HistType::kTH3F, {axisMassSpectrum, axisPtProbe, axisCent}); + + mHistManager.add("TPCeff/lmee/h_eh_pp_mass_spectra_v_pt_v_cent", "Low mass region e^{+}h^{+} vs momentum e^{+}h^{+}", HistType::kTH3F, {axisMassSpectrumlmee, axisPtProbe, axisCent}); + mHistManager.add("TPCeff/lmee/h_ee_pp_mass_spectra_v_pt_v_cent", "Low mass region e^{+}e^{+} vs momentum e^{+}e^{+}", HistType::kTH3F, {axisMassSpectrumlmee, axisPtProbe, axisCent}); + mHistManager.add("TPCeff/lmee/h_eh_mm_mass_spectra_v_pt_v_cent", "Low mass region e^{-}h^{-} vs momentum e^{-}h^{-}", HistType::kTH3F, {axisMassSpectrumlmee, axisPtProbe, axisCent}); + mHistManager.add("TPCeff/lmee/h_ee_mm_mass_spectra_v_pt_v_cent", "Low mass region e^{-}e^{-} vs momentum e^{-}e^{-}", HistType::kTH3F, {axisMassSpectrumlmee, axisPtProbe, axisCent}); + mHistManager.add("TPCeff/lmee/h_eh_mp_mass_spectra_v_pt_v_cent", "Low mass region e^{#pm}h^{#mp} vs momentum e^{#pm}h^{#mp}", HistType::kTH3F, {axisMassSpectrumlmee, axisPtProbe, axisCent}); + mHistManager.add("TPCeff/lmee/h_ee_mp_mass_spectra_v_pt_v_cent", "Low mass region e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}", HistType::kTH3F, {axisMassSpectrumlmee, axisPtProbe, axisCent}); mHistManager.add("hTrackVX", "Track vertex coordinate X", HistType::kTH1F, {axisVTrackX}); mHistManager.add("hTrackVY", "Track vertex coordinate Y", HistType::kTH1F, {axisVTrackY}); @@ -1013,12 +1046,11 @@ struct TpcElIdMassSpectrum { LOG(info) << ">>>>>>>>>>>> Magnetic field: " << bz; runNumber = bc.runNumber(); } - mHistManager.fill(HIST("eventCounter"), 0.5); - if (std::fabs(collision.posZ()) > 10.f) + if (std::fabs(collision.posZ()) > mColMaxZ) return; float cent = -1.; - switch (cfgCentEst) { + switch (CentEst) { case FV0A: cent = collision.centFV0A(); break; @@ -1038,6 +1070,16 @@ struct TpcElIdMassSpectrum { cent = collision.centNTPV(); break; } + mHistManager.fill(HIST("eventCounter"), 0.5); + mHistManager.fill(HIST("centCounter"), cent); + if (!collision.alias_bit(mEvSelTrig)) + return; + mHistManager.fill(HIST("eventCounter"), 1.5); + if (isSel8) { + if (!collision.sel8()) + return; + mHistManager.fill(HIST("eventCounter"), 2.5); + } for (auto const& [track1, track2] : combinations(CombinationsStrictlyUpperIndexPolicy(filteredTracks, filteredTracks))) { if (!track1.has_collision() || !track1.hasTPC()) @@ -1048,31 +1090,27 @@ struct TpcElIdMassSpectrum { continue; if (!((track1.itsClusterMap() & uint8_t(1)) > 0) || !((track2.itsClusterMap() & uint8_t(1)) > 0)) continue; - if (track1.itsChi2NCl() > cfgITSchi2Max || track2.itsChi2NCl() > cfgITSchi2Max) - continue; - if (track1.tpcChi2NCl() > cfgTPCchi2Max || track2.tpcChi2NCl() > cfgTPCchi2Max) + if (track1.itsNCls() < ITSnclsMin || track2.itsNCls() < ITSnclsMin) continue; - if (track1.itsNCls() < cfgITSnclsMin || track2.itsNCls() < cfgITSnclsMin) + if (track1.itsNCls() > ITSnclsMax || track2.itsNCls() > ITSnclsMax) continue; - if (track1.itsNCls() > cfgITSnclsMax || track2.itsNCls() > cfgITSnclsMax) + if (track1.tpcNClsFound() < TPCnclsMin || track2.tpcNClsFound() < TPCnclsMin) continue; - if (track1.tpcNClsFound() < cfgTPCnclsMin || track2.tpcNClsFound() < cfgTPCnclsMin) + if (track1.tpcNClsFound() > TPCnclsMax || track2.tpcNClsFound() > TPCnclsMax) continue; - if (track1.tpcNClsFound() > cfgTPCnclsMax || track2.tpcNClsFound() > cfgTPCnclsMax) + if (track1.tpcNClsCrossedRows() < TPCnclsCRMin || track2.tpcNClsCrossedRows() < TPCnclsCRMin) continue; - if (track1.tpcNClsCrossedRows() < cfgTPCnclsCRMin || track2.tpcNClsCrossedRows() < cfgTPCnclsCRMin) - continue; - if (track1.tpcNClsCrossedRows() > cfgTPCnclsCRMax || track2.tpcNClsCrossedRows() > cfgTPCnclsCRMax) + if (track1.tpcNClsCrossedRows() > TPCnclsCRMax || track2.tpcNClsCrossedRows() > TPCnclsCRMax) continue; - TLorentzVector fourVectorP1, fourVectorP2; + ROOT::Math::LorentzVector> fourVectorP1, fourVectorP2; fourVectorP1.SetPxPyPzE(track1.px(), track1.py(), track1.pz(), track1.energy(0)); fourVectorP2.SetPxPyPzE(track2.px(), track2.py(), track2.pz(), track2.energy(0)); - bool inPhosEtaRange1 = std::fabs(track1.eta()) < cfgPhosRangeEta; - bool inPhosEtaRange2 = std::fabs(track2.eta()) < cfgPhosRangeEta; - bool inPhosPhiRange1 = (track1.phi() * TMath::RadToDeg() > cfgPhosRangePhiMin && track1.phi() * TMath::RadToDeg() < cfgPhosRangePhiMax); - bool inPhosPhiRange2 = (track2.phi() * TMath::RadToDeg() > cfgPhosRangePhiMin && track2.phi() * TMath::RadToDeg() < cfgPhosRangePhiMax); + bool inPhosEtaRange1 = std::fabs(track1.eta()) < PhosRangeEta; + bool inPhosEtaRange2 = std::fabs(track2.eta()) < PhosRangeEta; + bool inPhosPhiRange1 = (track1.phi() * TMath::RadToDeg() > PhosRangePhiMin && track1.phi() * TMath::RadToDeg() < PhosRangePhiMax); + bool inPhosPhiRange2 = (track2.phi() * TMath::RadToDeg() > PhosRangePhiMin && track2.phi() * TMath::RadToDeg() < PhosRangePhiMax); bool inPhosRange = (inPhosEtaRange1 && inPhosPhiRange1) || (inPhosEtaRange2 && inPhosPhiRange2); bool posTrack = track1.sign() * bz > 0; @@ -1080,26 +1118,32 @@ struct TpcElIdMassSpectrum { if (track1.sign() == track2.sign()) { if (posTrack) { - mHistManager.fill(HIST("h_TPCee_MS_pp_v_pt_v_cent"), pairMass, pairPt, cent); + mHistManager.fill(HIST("TPCee/h_MS_pp_v_pt_v_cent"), pairMass, pairPt, cent); + if (collision.alias_bit(mEvSelTrig)) + mHistManager.fill(HIST("TPCee/h_MS_pp_kTVXinPHOS_v_pt_v_cent"), pairMass, pairPt, cent); if (inPhosRange) { - mHistManager.fill(HIST("h_TPCee_MS_pp_phosRange_v_pt_v_cent"), pairMass, pairPt, cent); + mHistManager.fill(HIST("TPCee/h_MS_pp_phosRange_v_pt_v_cent"), pairMass, pairPt, cent); if (collision.alias_bit(mEvSelTrig)) - mHistManager.fill(HIST("h_TPCee_MS_pp_phosRange_kTVXinPHOS_v_pt_v_cent"), pairMass, pairPt, cent); + mHistManager.fill(HIST("TPCee/h_MS_pp_phosRange_kTVXinPHOS_v_pt_v_cent"), pairMass, pairPt, cent); } } else { - mHistManager.fill(HIST("h_TPCee_MS_mm_v_pt_v_cent"), pairMass, pairPt, cent); + mHistManager.fill(HIST("TPCee/h_MS_mm_v_pt_v_cent"), pairMass, pairPt, cent); + if (collision.alias_bit(mEvSelTrig)) + mHistManager.fill(HIST("TPCee/h_MS_mm_kTVXinPHOS_v_pt_v_cent"), pairMass, pairPt, cent); if (inPhosRange) { - mHistManager.fill(HIST("h_TPCee_MS_mm_phosRange_v_pt_v_cent"), pairMass, pairPt, cent); + mHistManager.fill(HIST("TPCee/h_MS_mm_phosRange_v_pt_v_cent"), pairMass, pairPt, cent); if (collision.alias_bit(mEvSelTrig)) - mHistManager.fill(HIST("h_TPCee_MS_mm_phosRange_kTVXinPHOS_v_pt_v_cent"), pairMass, pairPt, cent); + mHistManager.fill(HIST("TPCee/h_MS_mm_phosRange_kTVXinPHOS_v_pt_v_cent"), pairMass, pairPt, cent); } } } else { - mHistManager.fill(HIST("h_TPCee_MS_mp_v_pt_v_cent"), pairMass, pairPt, cent); + mHistManager.fill(HIST("TPCee/h_MS_mp_v_pt_v_cent"), pairMass, pairPt, cent); + if (collision.alias_bit(mEvSelTrig)) + mHistManager.fill(HIST("TPCee/h_MS_mp_kTVXinPHOS_v_pt_v_cent"), pairMass, pairPt, cent); if (inPhosRange) { - mHistManager.fill(HIST("h_TPCee_MS_mp_phosRange_v_pt_v_cent"), pairMass, pairPt, cent); + mHistManager.fill(HIST("TPCee/h_MS_mp_phosRange_v_pt_v_cent"), pairMass, pairPt, cent); if (collision.alias_bit(mEvSelTrig)) - mHistManager.fill(HIST("h_TPCee_MS_mp_phosRange_kTVXinPHOS_v_pt_v_cent"), pairMass, pairPt, cent); + mHistManager.fill(HIST("TPCee/h_MS_mp_phosRange_kTVXinPHOS_v_pt_v_cent"), pairMass, pairPt, cent); } if (collision.alias_bit(mEvSelTrig) && clusters.size() != 0) { @@ -1113,10 +1157,10 @@ struct TpcElIdMassSpectrum { bool matchFlag = 0, isJpsi = 0, - isNotMIP = cluE > mCutMIPCluE, - isDispOK = testLambda(cluE, gamma.m02(), gamma.m20()); + // isNotMIP = cluE > mCutMIPCluE, + isDispOK = testLambda(cluE, gamma.m02(), gamma.m20()); - if (pairMass > cfgeeMassMin && pairMass < cfgeeMassMax) + if (pairMass > eeMassMin && pairMass < eeMassMax) isJpsi = 1; for (auto const& match : matches) { @@ -1126,115 +1170,204 @@ struct TpcElIdMassSpectrum { } } - TLorentzVector fourVectorP3; + ROOT::Math::LorentzVector> fourVectorP3; fourVectorP3.SetPxPyPzE(gamma.px(), gamma.py(), gamma.pz(), cluE); - double tripletMass = (fourVectorP1 + fourVectorP2 + fourVectorP3).M(), tripletPt = (fourVectorP1 + fourVectorP2 + fourVectorP3).Pt(); + double tripletMass = (fourVectorP1 + fourVectorP2 + fourVectorP3).M(), tripletPt = (fourVectorP1 + fourVectorP2 + fourVectorP3).Pt(), tripletMinusPairPlusJpsiMass = tripletMass - pairMass + JpsiMass; - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); + mHistManager.fill(HIST("TPCeePhosGamma/h_MS_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("TPCeePhosGamma/h_minusee_MS_v_3pt_v_cent"), tripletMinusPairPlusJpsiMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_v_cluE"), tripletMass, cluE, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_v_cluE"), tripletMass - pairMass + cfgJpsiMass, cluE, cent); + mHistManager.fill(HIST("TPCeePhosGamma/h_MS_v_cluE_v_cent"), tripletMass, cluE, cent); + mHistManager.fill(HIST("TPCeePhosGamma/h_minusee_MS_v_cluE_v_cent"), tripletMinusPairPlusJpsiMass, cluE, cent); - if (matchFlag) { - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_withMatches_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_withMatches_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); - } else { - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_noMatches_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_noMatches_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); + if (!matchFlag) { + mHistManager.fill(HIST("TPCeePhosGamma/h_MS_noMatches_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("TPCeePhosGamma/h_minusee_MS_noMatches_v_3pt_v_cent"), tripletMinusPairPlusJpsiMass, tripletPt, cent); if (isJpsi) { - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_noMatches_aroundJpsi_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_noMatches_aroundJpsi_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); + mHistManager.fill(HIST("TPCeePhosGamma/h_MS_noMatches_aroundJpsi_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("TPCeePhosGamma/h_minusee_MS_noMatches_aroundJpsi_v_3pt_v_cent"), tripletMinusPairPlusJpsiMass, tripletPt, cent); if (isDispOK) { - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_noMatches_aroundJpsi_DispOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_noMatches_aroundJpsi_DispOK_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); - } else { - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_noMatches_aroundJpsi_DispNotOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_noMatches_aroundJpsi_DispNotOK_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); + mHistManager.fill(HIST("TPCeePhosGamma/h_MS_noMatches_aroundJpsi_DispOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("TPCeePhosGamma/h_minusee_MS_noMatches_aroundJpsi_DispOK_v_3pt_v_cent"), tripletMinusPairPlusJpsiMass, tripletPt, cent); } - } else { - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_noMatches_notAroundJpsi_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_noMatches_notAroundJpsi_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); } if (isDispOK) { - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_noMatches_DispOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_noMatches_DispOK_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); - } else { - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_noMatches_DispNotOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_noMatches_DispNotOK_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); + mHistManager.fill(HIST("TPCeePhosGamma/h_MS_noMatches_DispOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("TPCeePhosGamma/h_minusee_MS_noMatches_DispOK_v_3pt_v_cent"), tripletMinusPairPlusJpsiMass, tripletPt, cent); } } - if (isJpsi) { - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_aroundJpsi_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_aroundJpsi_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); - } else { - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_notAroundJpsi_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_notAroundJpsi_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); + mHistManager.fill(HIST("TPCeePhosGamma/h_MS_aroundJpsi_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("TPCeePhosGamma/h_minusee_MS_aroundJpsi_v_3pt_v_cent"), tripletMinusPairPlusJpsiMass, tripletPt, cent); } - if (isDispOK) { - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_DispOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_DispOK_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); - } else { - mHistManager.fill(HIST("h_TPCeePhosGamma_MS_DispNotOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_minusee_MS_DispNotOK_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); + mHistManager.fill(HIST("TPCeePhosGamma/h_MS_DispOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("TPCeePhosGamma/h_minusee_MS_DispOK_v_3pt_v_cent"), tripletMinusPairPlusJpsiMass, tripletPt, cent); } + } + } + } + } + // tag-n-probe method for TPC identification efficiency calculations + for (auto const& track1 : tracks) { + if (!track1.has_collision() || !track1.hasTPC()) + continue; + if (!((track1.itsClusterMap() & uint8_t(1)) > 0)) + continue; + if (track1.itsChi2NCl() > ITSchi2Max || track1.tpcChi2NCl() > TPCchi2Max) + continue; + if (track1.itsNCls() < ITSnclsMin || track1.itsNCls() > ITSnclsMax) + continue; + if (track1.tpcNClsFound() < TPCnclsMin || track1.tpcNClsFound() > TPCnclsMax) + continue; + if (track1.tpcNClsCrossedRows() < TPCnclsCRMin || track1.tpcNClsCrossedRows() > TPCnclsCRMax) + continue; + bool isElectron1 = false; + if (track1.hasTPC()) { + float nsigmaTPCEl = track1.tpcNSigmaEl(); + float nsigmaTOFEl = track1.tofNSigmaEl(); + bool isTPCElectron1 = nsigmaTPCEl > TPCNSigmaElMin && nsigmaTPCEl < TPCNSigmaElMax; + bool isTOFElectron1 = nsigmaTOFEl > TOFNSigmaElMin && nsigmaTOFEl < TOFNSigmaElMax; + isElectron1 = isTPCElectron1 || isTOFElectron1; + + float nsigmaTPCPi = track1.tpcNSigmaPi(); + float nsigmaTPCKa = track1.tpcNSigmaKa(); + float nsigmaTPCPr = track1.tpcNSigmaPr(); + bool isPion = nsigmaTPCPi > TPCNSigmaPiMin && nsigmaTPCPi < TPCNSigmaPiMax; + bool isKaon = nsigmaTPCKa > TPCNSigmaKaMin && nsigmaTPCKa < TPCNSigmaKaMax; + bool isProton = nsigmaTPCPr > TPCNSigmaPrMin && nsigmaTPCPr < TPCNSigmaPrMax; + if (isElectron1 && !(isPion || isKaon || isProton)) + isElectron1 = true; + } + if (isElectron1) { + bool posTrack = track1.sign() * bz > 0; + for (auto const& track2 : tracks) { + if (!track2.has_collision() || !track2.hasTPC()) + continue; + if (!((track2.itsClusterMap() & uint8_t(1)) > 0)) + continue; + if (track1.collisionId() != track2.collisionId()) + continue; + if (track2.itsChi2NCl() > ITSchi2Max || track2.tpcChi2NCl() > TPCchi2Max) + continue; + if (track2.itsNCls() < ITSnclsMin || track2.itsNCls() > ITSnclsMax) + continue; + if (track2.tpcNClsFound() < TPCnclsMin || track2.tpcNClsFound() > TPCnclsMax) + continue; + if (track2.tpcNClsCrossedRows() < TPCnclsCRMin || track2.tpcNClsCrossedRows() > TPCnclsCRMax) + continue; + bool isElectron2 = false; + if (track2.hasTPC()) { + float nsigmaTPCEl = track2.tpcNSigmaEl(); + float nsigmaTOFEl = track2.tofNSigmaEl(); + bool isTPCElectron2 = nsigmaTPCEl > TPCNSigmaElMin && nsigmaTPCEl < TPCNSigmaElMax; + bool isTOFElectron2 = nsigmaTOFEl > TOFNSigmaElMin && nsigmaTOFEl < TOFNSigmaElMax; + isElectron2 = isTPCElectron2 || isTOFElectron2; + + float nsigmaTPCPi = track2.tpcNSigmaPi(); + float nsigmaTPCKa = track2.tpcNSigmaKa(); + float nsigmaTPCPr = track2.tpcNSigmaPr(); + bool isPion = nsigmaTPCPi > TPCNSigmaPiMin && nsigmaTPCPi < TPCNSigmaPiMax; + bool isKaon = nsigmaTPCKa > TPCNSigmaKaMin && nsigmaTPCKa < TPCNSigmaKaMax; + bool isProton = nsigmaTPCPr > TPCNSigmaPrMin && nsigmaTPCPr < TPCNSigmaPrMax; + if (isElectron2 && !(isPion || isKaon || isProton)) + isElectron2 = true; + } - if (isNotMIP) { - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); - if (matchFlag) { - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_withMatches_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_withMatches_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); - } else { - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_noMatches_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); - if (isJpsi) { - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_noMatches_aroundJpsi_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_aroundJpsi_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); - if (isDispOK) { - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_noMatches_aroundJpsi_DispOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_aroundJpsi_DispOK_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); - } else { - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_noMatches_aroundJpsi_DispNotOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_aroundJpsi_DispNotOK_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); - } - } else { - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_noMatches_notAroundJpsi_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_notAroundJpsi_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); + float mass2Tracks = 0, momProbeTrack = track2.pt(); + ROOT::Math::LorentzVector> fourVectorP1, fourVectorP2; + fourVectorP1.SetPxPyPzE(track1.px(), track1.py(), track1.pz(), track1.energy(0)); + fourVectorP2.SetPxPyPzE(track2.px(), track2.py(), track2.pz(), track2.energy(0)); + mass2Tracks = (fourVectorP1 + fourVectorP2).M(); + if (mass2Tracks < mLowMassRegionUpperThreshold) { + if (track1.sign() == track2.sign()) { + if (posTrack) { + mHistManager.fill(HIST("TPCeff/lmee/h_eh_pp_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); + if (isElectron2) { + mHistManager.fill(HIST("TPCeff/lmee/h_ee_pp_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); } - if (isDispOK) { - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_noMatches_DispOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_DispOK_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); - } else { - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_noMatches_DispNotOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_noMatches_DispNotOK_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); + } else { + mHistManager.fill(HIST("TPCeff/lmee/h_eh_mm_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); + if (isElectron2) { + mHistManager.fill(HIST("TPCeff/lmee/h_ee_mm_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); } } - - if (isJpsi) { - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_aroundJpsi_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_aroundJpsi_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); - } else { - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_notAroundJpsi_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_notAroundJpsi_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); + } else { + mHistManager.fill(HIST("TPCeff/lmee/h_eh_mp_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); + if (isElectron2) { + mHistManager.fill(HIST("TPCeff/lmee/h_ee_mp_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); } - - if (isDispOK) { - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_DispOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_DispOK_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); + } + } else { + if (track1.sign() == track2.sign()) { + if (posTrack) { + mHistManager.fill(HIST("TPCeff/h_eh_pp_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); + if (isElectron2) { + mHistManager.fill(HIST("TPCeff/h_ee_pp_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); + } } else { - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_MS_DispNotOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_notMIP_minusee_MS_DispNotOK_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); + mHistManager.fill(HIST("TPCeff/h_eh_mm_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); + if (isElectron2) { + mHistManager.fill(HIST("TPCeff/h_ee_mm_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); + } } } else { - mHistManager.fill(HIST("h_TPCeePhosGamma_isMIP_MS_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("h_TPCeePhosGamma_isMIP_minusee_MS_v_3pt_v_cent"), tripletMass - pairMass + cfgJpsiMass, tripletPt, cent); + mHistManager.fill(HIST("TPCeff/h_eh_mp_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); + if (isElectron2) { + mHistManager.fill(HIST("TPCeff/h_ee_mp_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); + } } } } } + } // end of double loop + + for (auto const& gamma1 : clusters) { + float cluE1 = gamma1.e(); + + if (cluE1 < mMinCluE || cluE1 > mMaxCluE || + gamma1.ncell() < mMinCluNcell || + gamma1.time() > mMaxCluTime || gamma1.time() < mMinCluTime) + continue; + + bool matchFlag1 = 0, matchFlag2 = 0; + if (!testLambda(cluE1, gamma1.m02(), gamma1.m20())) + continue; + + for (auto const& match : matches) { + if (gamma1.index() == match.caloClusterId()) { + matchFlag1 = 1; + break; + } + } + for (auto const& gamma2 : clusters) { + float cluE2 = gamma2.e(); + + if (cluE2 < mMinCluE || cluE2 > mMaxCluE || + gamma2.ncell() < mMinCluNcell || + gamma2.time() > mMaxCluTime || gamma2.time() < mMinCluTime) + continue; + + if (!testLambda(cluE2, gamma1.m02(), gamma1.m20())) + continue; + + for (auto const& match : matches) { + if (gamma2.index() == match.caloClusterId()) { + matchFlag2 = 1; + break; + } + } + ROOT::Math::LorentzVector> fourVectorP1, fourVectorP2; + fourVectorP1.SetPxPyPzE(gamma1.px(), gamma1.py(), gamma1.pz(), gamma1.e()); + fourVectorP2.SetPxPyPzE(gamma2.px(), gamma2.py(), gamma2.pz(), gamma2.e()); + double pairMass = (fourVectorP1 + fourVectorP2).M(), pairPt = (fourVectorP1 + fourVectorP2).Pt(); + if (pairMass < mMassSpectrumLowerCutoff) + continue; + mHistManager.fill(HIST("twoPhoton/MS_noCuts"), pairMass, pairPt, cent); + if (matchFlag1 || matchFlag2) + continue; + mHistManager.fill(HIST("twoPhoton/MS_noMatches"), pairMass, pairPt, cent); + } } for (auto const& track : tracks) { @@ -1248,13 +1381,13 @@ struct TpcElIdMassSpectrum { for (auto const& track : filteredTracks) { if (!track.has_collision() || !track.hasTPC()) continue; - if (track.itsChi2NCl() > cfgITSchi2Max || track.tpcChi2NCl() > cfgTPCchi2Max) + if (track.itsChi2NCl() > ITSchi2Max || track.tpcChi2NCl() > TPCchi2Max) continue; - if (track.itsNCls() < cfgITSnclsMin || track.itsNCls() > cfgITSnclsMax || !((track.itsClusterMap() & uint8_t(1)) > 0)) + if (track.itsNCls() < ITSnclsMin || track.itsNCls() > ITSnclsMax || !((track.itsClusterMap() & uint8_t(1)) > 0)) continue; - if (track.tpcNClsFound() < cfgTPCnclsMin || track.tpcNClsFound() > cfgTPCnclsMax) + if (track.tpcNClsFound() < TPCnclsMin || track.tpcNClsFound() > TPCnclsMax) continue; - if (track.tpcNClsCrossedRows() < cfgTPCnclsCRMin || track.tpcNClsCrossedRows() > cfgTPCnclsCRMax) + if (track.tpcNClsCrossedRows() < TPCnclsCRMin || track.tpcNClsCrossedRows() > TPCnclsCRMax) continue; mHistManager.fill(HIST("hTPCspectra_isElectronRej"), track.pt(), track.tpcSignal()); mHistManager.fill(HIST("hTrackPt_Cut"), track.pt()); From 1b5e4f519a5fb808cdde7ebe172f1cb3992758e6 Mon Sep 17 00:00:00 2001 From: "Paul Veen (paveen)" <80593165+ppoava@users.noreply.github.com> Date: Thu, 15 May 2025 15:10:39 +0200 Subject: [PATCH 1284/1650] [PWGDQ] Process using realigned muon track in table-maker-mc-with-assoc (#11195) --- .../TableProducer/tableMakerMC_withAssoc.cxx | 133 ++++++++++++++---- 1 file changed, 109 insertions(+), 24 deletions(-) diff --git a/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx b/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx index 440a24a3ec1..3c8e4bdfe7e 100644 --- a/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx +++ b/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx @@ -46,6 +46,7 @@ #include "PWGDQ/Core/MCSignalLibrary.h" #include "Common/DataModel/PIDResponse.h" #include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/FwdTrackReAlignTables.h" #include "Common/DataModel/CollisionAssociationTables.h" #include "DataFormatsParameters/GRPMagField.h" #include "DataFormatsParameters/GRPObject.h" @@ -84,6 +85,7 @@ using MyBarrelTracksWithCov = soa::Join; using MyMuons = soa::Join; using MyMuonsWithCov = soa::Join; +using MyMuonsRealignWithCov = soa::Join; using MyEvents = soa::Join; using MyEventsWithMults = soa::Join; @@ -104,6 +106,7 @@ constexpr static uint32_t gkTrackFillMapWithCov = VarManager::ObjTypes::Track | // constexpr static uint32_t gkTrackFillMapWithDalitzBits = gkTrackFillMap | VarManager::ObjTypes::DalitzBits; // constexpr static uint32_t gkMuonFillMap = VarManager::ObjTypes::Muon; constexpr static uint32_t gkMuonFillMapWithCov = VarManager::ObjTypes::Muon | VarManager::ObjTypes::MuonCov; +constexpr static uint32_t gkMuonRealignFillMapWithCov = VarManager::ObjTypes::MuonRealign | VarManager::ObjTypes::MuonCovRealign; // constexpr static uint32_t gkMuonFillMapWithAmbi = VarManager::ObjTypes::Muon | VarManager::ObjTypes::AmbiMuon; // constexpr static uint32_t gkMuonFillMapWithCovAmbi = VarManager::ObjTypes::Muon | VarManager::ObjTypes::MuonCov | VarManager::ObjTypes::AmbiMuon; // constexpr static uint32_t gkTrackFillMapWithAmbi = VarManager::ObjTypes::Track | VarManager::ObjTypes::AmbiTrack; @@ -214,7 +217,7 @@ struct TableMakerMC { o2::parameters::GRPObject* fGrpMagRun2 = nullptr; // for run 2, we access the GRPObject from GLO/GRP/GRP o2::parameters::GRPMagField* fGrpMag = nullptr; // for run 3, we access GRPMagField from GLO/Config/GRPMagField - AnalysisCompositeCut* fEventCut; //! Event selection cut + AnalysisCompositeCut* fEventCut; //! Event selection cut std::vector fTrackCuts; //! Barrel track cuts std::vector fMuonCuts; //! Muon track cuts @@ -240,7 +243,7 @@ struct TableMakerMC { // Check whether barrel or muon are enabled bool isProcessBCenabled = context.mOptions.get("processPP"); bool isBarrelEnabled = (context.mOptions.get("processPP") || context.mOptions.get("processPPBarrelOnly") || context.mOptions.get("processPbPbBarrelOnly") || context.mOptions.get("processPbPbWithFilterBarrelOnly")); - bool isMuonEnabled = (context.mOptions.get("processPP") || context.mOptions.get("processPPMuonOnlyBasic") || context.mOptions.get("processPPMuonOnly") || context.mOptions.get("processPbPbMuonOnly")); + bool isMuonEnabled = (context.mOptions.get("processPP") || context.mOptions.get("processPPMuonOnlyBasic") || context.mOptions.get("processPPMuonOnly") || context.mOptions.get("processPPRealignedMuonOnly") || context.mOptions.get("processPbPbMuonOnly") || context.mOptions.get("processPbPbRealignedMuonOnly")); // Make sure at least one process function is enabled if (!(isProcessBCenabled || isBarrelEnabled || isMuonEnabled)) { LOG(fatal) << "No process function was enabled for TableMakerMC. Check it out!!!"; @@ -341,7 +344,7 @@ struct TableMakerMC { } } - DefineHistograms(histClasses); // define all histograms + DefineHistograms(histClasses); // define all histograms // Additional histogram via the JSON configurable TString addHistsStr = fConfigHistOutput.fConfigAddJSONHistograms.value; if (fConfigHistOutput.fConfigQA && addHistsStr != "") { @@ -416,6 +419,8 @@ struct TableMakerMC { Preslice trackIndicesPerCollision = aod::track_association::collisionId; Preslice fwdtrackIndicesPerCollision = aod::track_association::collisionId; Preslice mfttrackIndicesPerCollision = aod::track_association::collisionId; + PresliceUnsorted perCollisionMuonsRealign = aod::fwdtrackrealign::collisionId; + PresliceUnsorted fwdtrackRealignPerMuon = aod::fwdtrackrealign::fwdtrackId; void skimMCCollisions(aod::McCollisions const& mcCollisions) { @@ -887,8 +892,8 @@ struct TableMakerMC { } } - template - void skimMuons(TEvent const& collision, TMuons const& muons, FwdTrackAssoc const& muonAssocs, aod::McParticles const& mcTracks, TMFTTracks const& /*mftTracks*/) + template + void skimMuons(TEvent const& collision, TMuons const& muons, TMuonsRealign const& muonsRealign, FwdTrackAssoc const& muonAssocs, aod::McParticles const& mcTracks, TMFTTracks const& /*mftTracks*/) { // Skim the fwd-tracks (muons) // Loop over the collision-track associations, recompute track properties depending on the collision assigned, and apply track cuts for selection @@ -929,7 +934,35 @@ struct TableMakerMC { VarManager::FillTrackCollision(muontrack, collision); VarManager::FillGlobalMuonRefit(muontrack, mfttrack, collision); } else { - VarManager::FillTrackCollision(muon, collision); + if constexpr ((static_cast(TMuonRealignFillMap))) { + if (static_cast(muon.trackType()) > 2) { + // refill kinematic info and recalculate propagation in case of using realigned muons + auto muonRealignSelected = muonsRealign.sliceBy(fwdtrackRealignPerMuon, assoc.fwdtrackId()); + int realignRemoveFlag = 0; + if (muonRealignSelected.size() == 1) { + for (const auto& muonRealign : muonRealignSelected) { + // refill muon information with realigned tracks + VarManager::FillTrack(muonRealign); + realignRemoveFlag = muonRealign.isRemovable(); + + if (fConfigVariousOptions.fPropMuon) { + VarManager::FillPropagateMuon(muonRealign, collision); + } + + VarManager::FillTrackCollision(muonRealign, collision); + } + + if (realignRemoveFlag) { + continue; + } + + } else { + LOGF(fatal, "Inconsistent size of realigned muon track candidates."); + } + } + } else { + VarManager::FillTrackCollision(muon, collision); + } } if (fDoDetailedQA) { @@ -998,7 +1031,7 @@ struct TableMakerMC { trackCounter++; } - } // end if (has_mcParticle) + } // end if (has_mcParticle) } else { // if muon already in the map, make a bitwise OR with previous existing cuts fFwdTrackFilterMap[muon.globalIndex()] |= trackFilteringTag; } @@ -1041,16 +1074,44 @@ struct TableMakerMC { VarManager::FillTrackCollision(muontrack, collision); VarManager::FillGlobalMuonRefit(muontrack, mfttrack, collision); } else { - VarManager::FillTrackCollision(muon, collision); + if constexpr ((static_cast(TMuonRealignFillMap))) { + if (static_cast(muon.trackType()) > 2) { + // refill kinematic info and recalculate propagation in case of using realigned muons + auto muonRealignSelected = muonsRealign.sliceBy(fwdtrackRealignPerMuon, muon.globalIndex()); + int realignRemoveFlag = 0; + if (muonRealignSelected.size() == 1) { + for (const auto& muonRealign : muonRealignSelected) { + // refill muon information with realigned tracks + VarManager::FillTrack(muonRealign); + realignRemoveFlag = muonRealign.isRemovable(); + + if (fConfigVariousOptions.fPropMuon) { + VarManager::FillPropagateMuon(muonRealign, collision); + } + + VarManager::FillTrackCollision(muonRealign, collision); + } + + if (realignRemoveFlag) { + continue; + } + + } else { + LOGF(fatal, "Inconsistent size of realigned muon track candidates."); + } + } + } else { + VarManager::FillTrackCollision(muon, collision); + } } muonBasic(reducedEventIdx, mchIdx, mftIdx, fFwdTrackFilterMap[muon.globalIndex()], VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kEta], VarManager::fgValues[VarManager::kPhi], muon.sign(), 0); muonExtra(muon.nClusters(), VarManager::fgValues[VarManager::kMuonPDca], VarManager::fgValues[VarManager::kMuonRAtAbsorberEnd], - muon.chi2(), muon.chi2MatchMCHMID(), muon.chi2MatchMCHMFT(), + VarManager::fgValues[VarManager::kMuonChi2], muon.chi2MatchMCHMID(), muon.chi2MatchMCHMFT(), muon.matchScoreMCHMFT(), muon.mchBitMap(), muon.midBitMap(), muon.midBoards(), muon.trackType(), VarManager::fgValues[VarManager::kMuonDCAx], VarManager::fgValues[VarManager::kMuonDCAy], muon.trackTime(), muon.trackTimeRes()); - if constexpr (static_cast(TMuonFillMap & VarManager::ObjTypes::MuonCov)) { + if constexpr (static_cast(TMuonFillMap & VarManager::ObjTypes::MuonCov) || static_cast(TMuonRealignFillMap & VarManager::ObjTypes::MuonCovRealign)) { muonCov(VarManager::fgValues[VarManager::kX], VarManager::fgValues[VarManager::kY], VarManager::fgValues[VarManager::kZ], VarManager::fgValues[VarManager::kPhi], VarManager::fgValues[VarManager::kTgl], muon.sign() / VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kMuonCXX], VarManager::fgValues[VarManager::kMuonCXY], VarManager::fgValues[VarManager::kMuonCYY], VarManager::fgValues[VarManager::kMuonCPhiX], VarManager::fgValues[VarManager::kMuonCPhiY], VarManager::fgValues[VarManager::kMuonCPhiPhi], VarManager::fgValues[VarManager::kMuonCTglX], VarManager::fgValues[VarManager::kMuonCTglY], VarManager::fgValues[VarManager::kMuonCTglPhi], VarManager::fgValues[VarManager::kMuonCTglTgl], VarManager::fgValues[VarManager::kMuonC1Pt2X], VarManager::fgValues[VarManager::kMuonC1Pt2Y], @@ -1065,10 +1126,10 @@ struct TableMakerMC { } // end loop over selected muons } // end skimMuons - template + template void fullSkimming(TEvents const& collisions, BCsWithTimestamps const& bcs, - TTracks const& tracksBarrel, TMuons const& muons, TMFTTracks const& mftTracks, + TTracks const& tracksBarrel, TMuons const& muons, TMuonsRealign const& muonsRealign, TMFTTracks const& mftTracks, TTrackAssoc const& trackAssocs, TFwdTrackAssoc const& fwdTrackAssocs, TMFTTrackAssoc const& mftAssocs, aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) { @@ -1168,10 +1229,16 @@ struct TableMakerMC { if (fConfigVariousOptions.fKeepBestMatch) { skimBestMuonMatches(muons); } - skimMuons(collision, muons, groupedMuonIndices, mcParticles, mftTracks); + skimMuons(collision, muons, nullptr, groupedMuonIndices, mcParticles, mftTracks); } else { - auto groupedMuonIndices = fwdTrackAssocs.sliceBy(fwdtrackIndicesPerCollision, origIdx); - skimMuons(collision, muons, groupedMuonIndices, mcParticles, nullptr); + if constexpr (static_cast(TMuonRealignFillMap)) { + auto groupedMuonIndices = fwdTrackAssocs.sliceBy(fwdtrackIndicesPerCollision, origIdx); + auto muonsRealignThisCollision = muonsRealign.sliceBy(perCollisionMuonsRealign, origIdx); + skimMuons(collision, muons, muonsRealignThisCollision, groupedMuonIndices, mcParticles, mftTracks); + } else { + auto groupedMuonIndices = fwdTrackAssocs.sliceBy(fwdtrackIndicesPerCollision, origIdx); + skimMuons(collision, muons, nullptr, groupedMuonIndices, mcParticles, nullptr); + } } } } // end loop over skimmed collisions @@ -1320,14 +1387,14 @@ struct TableMakerMC { aod::TrackAssoc const& trackAssocs, aod::FwdTrackAssoc const& fwdTrackAssocs, aod::MFTTrackAssoc const& mftAssocs, aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) { - fullSkimming(collisions, bcs, tracksBarrel, tracksMuon, mftTracks, trackAssocs, fwdTrackAssocs, mftAssocs, mcCollisions, mcParticles); + fullSkimming(collisions, bcs, tracksBarrel, tracksMuon, nullptr, mftTracks, trackAssocs, fwdTrackAssocs, mftAssocs, mcCollisions, mcParticles); } void processPPBarrelOnly(MyEventsWithMults const& collisions, aod::BCsWithTimestamps const& bcs, MyBarrelTracksWithCov const& tracksBarrel, aod::TrackAssoc const& trackAssocs, aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) { - fullSkimming(collisions, bcs, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr, mcCollisions, mcParticles); + fullSkimming(collisions, bcs, tracksBarrel, nullptr, nullptr, nullptr, trackAssocs, nullptr, nullptr, mcCollisions, mcParticles); } void processPPMuonOnlyBasic(MyEvents const& collisions, aod::BCsWithTimestamps const& bcs, @@ -1335,7 +1402,7 @@ struct TableMakerMC { aod::FwdTrackAssoc const& fwdTrackAssocs, aod::MFTTrackAssoc const& mftAssocs, aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) { - fullSkimming(collisions, bcs, nullptr, tracksMuon, mftTracks, nullptr, fwdTrackAssocs, mftAssocs, mcCollisions, mcParticles); + fullSkimming(collisions, bcs, nullptr, tracksMuon, nullptr, mftTracks, nullptr, fwdTrackAssocs, mftAssocs, mcCollisions, mcParticles); } void processPPMuonOnly(MyEventsWithMults const& collisions, aod::BCsWithTimestamps const& bcs, @@ -1343,7 +1410,15 @@ struct TableMakerMC { aod::FwdTrackAssoc const& fwdTrackAssocs, aod::MFTTrackAssoc const& mftAssocs, aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) { - fullSkimming(collisions, bcs, nullptr, tracksMuon, mftTracks, nullptr, fwdTrackAssocs, mftAssocs, mcCollisions, mcParticles); + fullSkimming(collisions, bcs, nullptr, tracksMuon, nullptr, mftTracks, nullptr, fwdTrackAssocs, mftAssocs, mcCollisions, mcParticles); + } + + void processPPRealignedMuonOnly(MyEventsWithMults const& collisions, aod::BCsWithTimestamps const& bcs, + MyMuonsWithCov const& tracksMuon, MyMuonsRealignWithCov const& muonsRealign, MFTTrackLabeled const& mftTracks, + aod::FwdTrackAssoc const& fwdTrackAssocs, + aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) + { + fullSkimming(collisions, bcs, nullptr, tracksMuon, muonsRealign, mftTracks, nullptr, fwdTrackAssocs, nullptr, mcCollisions, mcParticles); } void processPbPb(MyEventsWithCentAndMults const& collisions, aod::BCsWithTimestamps const& bcs, @@ -1351,21 +1426,21 @@ struct TableMakerMC { aod::TrackAssoc const& trackAssocs, aod::FwdTrackAssoc const& fwdTrackAssocs, aod::MFTTrackAssoc const& mftAssocs, aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) { - fullSkimming(collisions, bcs, tracksBarrel, tracksMuon, mftTracks, trackAssocs, fwdTrackAssocs, mftAssocs, mcCollisions, mcParticles); + fullSkimming(collisions, bcs, tracksBarrel, tracksMuon, nullptr, mftTracks, trackAssocs, fwdTrackAssocs, mftAssocs, mcCollisions, mcParticles); } void processPbPbBarrelOnly(MyEventsWithCentAndMults const& collisions, aod::BCsWithTimestamps const& bcs, MyBarrelTracksWithCov const& tracksBarrel, aod::TrackAssoc const& trackAssocs, aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) { - fullSkimming(collisions, bcs, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr, mcCollisions, mcParticles); + fullSkimming(collisions, bcs, tracksBarrel, nullptr, nullptr, nullptr, trackAssocs, nullptr, nullptr, mcCollisions, mcParticles); } void processPbPbWithFilterBarrelOnly(MyEventsWithMultsAndRapidityGapFilter const& collisions, aod::BCsWithTimestamps const& bcs, MyBarrelTracksWithCov const& tracksBarrel, aod::TrackAssoc const& trackAssocs, aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) { - fullSkimming(collisions, bcs, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr, mcCollisions, mcParticles); + fullSkimming(collisions, bcs, tracksBarrel, nullptr, nullptr, nullptr, trackAssocs, nullptr, nullptr, mcCollisions, mcParticles); } void processPbPbMuonOnly(MyEventsWithCentAndMults const& collisions, aod::BCsWithTimestamps const& bcs, @@ -1373,7 +1448,15 @@ struct TableMakerMC { aod::FwdTrackAssoc const& fwdTrackAssocs, aod::MFTTrackAssoc const& mftAssocs, aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) { - fullSkimming(collisions, bcs, nullptr, tracksMuon, mftTracks, nullptr, fwdTrackAssocs, mftAssocs, mcCollisions, mcParticles); + fullSkimming(collisions, bcs, nullptr, tracksMuon, nullptr, mftTracks, nullptr, fwdTrackAssocs, mftAssocs, mcCollisions, mcParticles); + } + + void processPbPbRealignedMuonOnly(MyEventsWithCentAndMults const& collisions, aod::BCsWithTimestamps const& bcs, + MyMuonsWithCov const& tracksMuon, MyMuonsRealignWithCov const& muonsRealign, MFTTrackLabeled const& mftTracks, + aod::FwdTrackAssoc const& fwdTrackAssocs, + aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) + { + fullSkimming(collisions, bcs, nullptr, tracksMuon, muonsRealign, mftTracks, nullptr, fwdTrackAssocs, nullptr, mcCollisions, mcParticles); } // Process the BCs and store stats for luminosity retrieval ----------------------------------------------------------------------------------- @@ -1391,10 +1474,12 @@ struct TableMakerMC { PROCESS_SWITCH(TableMakerMC, processPPBarrelOnly, "Produce only barrel skims, pp settings ", false); PROCESS_SWITCH(TableMakerMC, processPPMuonOnlyBasic, "Produce only muon skims, pp settings, no multiplicity", false); PROCESS_SWITCH(TableMakerMC, processPPMuonOnly, "Produce only muon skims, pp settings", false); + PROCESS_SWITCH(TableMakerMC, processPPRealignedMuonOnly, "Build realigned muon only DQ skimmed data model typically for pp/p-Pb and UPC Pb-Pb", false); PROCESS_SWITCH(TableMakerMC, processPbPb, "Produce both barrel and muon skims, PbPb settings", false); PROCESS_SWITCH(TableMakerMC, processPbPbBarrelOnly, "Produce only barrel skims, PbPb settings", false); PROCESS_SWITCH(TableMakerMC, processPbPbWithFilterBarrelOnly, "Produce only barrel skims, pp settings with rapidity gap filter ", false); PROCESS_SWITCH(TableMakerMC, processPbPbMuonOnly, "Produce only muon skims, PbPb settings", false); + PROCESS_SWITCH(TableMakerMC, processPbPbRealignedMuonOnly, "Build realigned muon only DQ skimmed data model typically for Pb-Pb, w/o event filtering", false); PROCESS_SWITCH(TableMakerMC, processOnlyBCs, "Analyze the BCs to store sampled lumi", false); }; From 9ab490fd6f1f965fa7cfabf112184a4691f709b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Thu, 15 May 2025 16:05:04 +0200 Subject: [PATCH 1285/1650] [PWGHF] Unify PID method configuration in selectors (#11187) --- .../candidateSelectorB0ToDPiReduced.cxx | 14 +++++++------ .../candidateSelectorBplusToD0PiReduced.cxx | 18 +++++++++-------- .../candidateSelectorBsToDsPiReduced.cxx | 14 +++++++------ .../candidateSelectorLbToLcPiReduced.cxx | 20 ++++++++----------- .../candidateSelectorB0ToDPi.cxx | 14 +++++++------ .../candidateSelectorBplusToD0Pi.cxx | 14 +++++++------ PWGHF/Utils/utilsPid.h | 18 ++++++++++++++--- 7 files changed, 65 insertions(+), 47 deletions(-) diff --git a/PWGHF/D2H/TableProducer/candidateSelectorB0ToDPiReduced.cxx b/PWGHF/D2H/TableProducer/candidateSelectorB0ToDPiReduced.cxx index 4bab1d49cc4..5ddf1bcd1a8 100644 --- a/PWGHF/D2H/TableProducer/candidateSelectorB0ToDPiReduced.cxx +++ b/PWGHF/D2H/TableProducer/candidateSelectorB0ToDPiReduced.cxx @@ -29,11 +29,13 @@ #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/D2H/DataModel/ReducedDataModel.h" +#include "PWGHF/Utils/utilsPid.h" using namespace o2; using namespace o2::aod; using namespace o2::framework; using namespace o2::analysis; +using namespace o2::aod::pid_tpc_tof_utils; struct HfCandidateSelectorB0ToDPiReduced { Produces hfSelB0ToDPiCandidate; // table defined in CandidateSelectionTables.h @@ -42,7 +44,7 @@ struct HfCandidateSelectorB0ToDPiReduced { Configurable ptCandMin{"ptCandMin", 0., "Lower bound of candidate pT"}; Configurable ptCandMax{"ptCandMax", 50., "Upper bound of candidate pT"}; // Enable PID - Configurable pionPidMethod{"pionPidMethod", 1, "PID selection method for the bachelor pion (0: none, 1: TPC or TOF, 2: TPC and TOF)"}; + Configurable pionPidMethod{"pionPidMethod", PidMethod::TpcOrTof, "PID selection method for the bachelor pion (PidMethod::NoPid: none, PidMethod::TpcOrTof: TPC or TOF, PidMethod::TpcAndTof: TPC and TOF)"}; Configurable acceptPIDNotApplicable{"acceptPIDNotApplicable", true, "Switch to accept Status::NotApplicable [(NotApplicable for one detector) and (NotApplicable or Conditional for the other)] in PID selection"}; // TPC PID Configurable ptPidTpcMin{"ptPidTpcMin", 0.15, "Lower bound of track pT for TPC PID"}; @@ -97,11 +99,11 @@ struct HfCandidateSelectorB0ToDPiReduced { LOGP(fatal, "Only one process function for data should be enabled at a time."); } - if (pionPidMethod < 0 || pionPidMethod > 2) { + if (pionPidMethod < 0 || pionPidMethod >= PidMethod::NPidMethods) { LOGP(fatal, "Invalid PID option in configurable, please set 0 (no PID), 1 (TPC or TOF), or 2 (TPC and TOF)"); } - if (pionPidMethod) { + if (pionPidMethod != PidMethod::NoPid) { selectorPion.setRangePtTpc(ptPidTpcMin, ptPidTpcMax); selectorPion.setRangeNSigmaTpc(-nSigmaTpcMax, nSigmaTpcMax); selectorPion.setRangeNSigmaTpcCondTof(-nSigmaTpcCombinedMax, nSigmaTpcCombinedMax); @@ -190,11 +192,11 @@ struct HfCandidateSelectorB0ToDPiReduced { // track-level PID selection auto trackPi = hfCandB0.template prong1_as(); - if (pionPidMethod) { + if (pionPidMethod == PidMethod::TpcOrTof || pionPidMethod == PidMethod::TpcAndTof) { int pidTrackPi{TrackSelectorPID::Status::NotApplicable}; - if (pionPidMethod == 1) { + if (pionPidMethod == PidMethod::TpcOrTof) { pidTrackPi = selectorPion.statusTpcOrTof(trackPi); - } else { + } else if (pionPidMethod == PidMethod::TpcAndTof) { pidTrackPi = selectorPion.statusTpcAndTof(trackPi); } if (!hfHelper.selectionB0ToDPiPid(pidTrackPi, acceptPIDNotApplicable.value)) { diff --git a/PWGHF/D2H/TableProducer/candidateSelectorBplusToD0PiReduced.cxx b/PWGHF/D2H/TableProducer/candidateSelectorBplusToD0PiReduced.cxx index 09a9c39c933..b11b65a39fb 100644 --- a/PWGHF/D2H/TableProducer/candidateSelectorBplusToD0PiReduced.cxx +++ b/PWGHF/D2H/TableProducer/candidateSelectorBplusToD0PiReduced.cxx @@ -28,11 +28,13 @@ #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/D2H/DataModel/ReducedDataModel.h" +#include "PWGHF/Utils/utilsPid.h" using namespace o2; using namespace o2::aod; using namespace o2::framework; using namespace o2::analysis; +using namespace o2::aod::pid_tpc_tof_utils; struct HfCandidateSelectorBplusToD0PiReduced { Produces hfSelBplusToD0PiCandidate; // table defined in CandidateSelectionTables.h @@ -41,7 +43,7 @@ struct HfCandidateSelectorBplusToD0PiReduced { Configurable ptCandMin{"ptCandMin", 0., "Lower bound of candidate pT"}; Configurable ptCandMax{"ptCandMax", 50., "Upper bound of candidate pT"}; // Enable PID - Configurable pionPidMethod{"pionPidMethod", 1, "PID selection method for the bachelor pion (0: none, 1: TPC or TOF, 2: TPC and TOF)"}; + Configurable pionPidMethod{"pionPidMethod", PidMethod::TpcOrTof, "PID selection method for the bachelor pion (PidMethod::NoPid: none, PidMethod::TpcOrTof: TPC or TOF, PidMethod::TpcAndTof: TPC and TOF)"}; Configurable acceptPIDNotApplicable{"acceptPIDNotApplicable", true, "Switch to accept Status::NotApplicable [(NotApplicable for one detector) and (NotApplicable or Conditional for the other)] in PID selection"}; // TPC PID Configurable ptPidTpcMin{"ptPidTpcMin", 0.15, "Lower bound of track pT for TPC PID"}; @@ -86,10 +88,10 @@ struct HfCandidateSelectorBplusToD0PiReduced { HfHelper hfHelper; TrackSelectorPi selectorPion; - HistogramRegistry registry{"registry"}; - using TracksPion = soa::Join; + HistogramRegistry registry{"registry"}; + void init(InitContext const&) { std::array doprocess{doprocessSelection, doprocessSelectionWithDmesMl}; @@ -97,11 +99,11 @@ struct HfCandidateSelectorBplusToD0PiReduced { LOGP(fatal, "Only one process function for data should be enabled at a time."); } - if (pionPidMethod < 0 || pionPidMethod > 2) { + if (pionPidMethod < 0 || pionPidMethod >= PidMethod::NPidMethods) { LOGP(fatal, "Invalid PID option in configurable, please set 0 (no PID), 1 (TPC or TOF), or 2 (TPC and TOF)"); } - if (pionPidMethod) { + if (pionPidMethod != PidMethod::NoPid) { selectorPion.setRangePtTpc(ptPidTpcMin, ptPidTpcMax); selectorPion.setRangeNSigmaTpc(-nSigmaTpcMax, nSigmaTpcMax); selectorPion.setRangeNSigmaTpcCondTof(-nSigmaTpcCombinedMax, nSigmaTpcCombinedMax); @@ -191,11 +193,11 @@ struct HfCandidateSelectorBplusToD0PiReduced { // track-level PID selection auto trackPi = hfCandBp.template prong1_as(); - if (pionPidMethod) { + if (pionPidMethod == PidMethod::TpcOrTof || pionPidMethod == PidMethod::TpcAndTof) { int pidTrackPi{TrackSelectorPID::Status::NotApplicable}; - if (pionPidMethod == 1) { + if (pionPidMethod == PidMethod::TpcOrTof) { pidTrackPi = selectorPion.statusTpcOrTof(trackPi); - } else { + } else if (pionPidMethod == PidMethod::TpcAndTof) { pidTrackPi = selectorPion.statusTpcAndTof(trackPi); } if (!hfHelper.selectionBplusToD0PiPid(pidTrackPi, acceptPIDNotApplicable.value)) { diff --git a/PWGHF/D2H/TableProducer/candidateSelectorBsToDsPiReduced.cxx b/PWGHF/D2H/TableProducer/candidateSelectorBsToDsPiReduced.cxx index 3e970cc347b..7864ee493b7 100644 --- a/PWGHF/D2H/TableProducer/candidateSelectorBsToDsPiReduced.cxx +++ b/PWGHF/D2H/TableProducer/candidateSelectorBsToDsPiReduced.cxx @@ -28,11 +28,13 @@ #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/D2H/DataModel/ReducedDataModel.h" +#include "PWGHF/Utils/utilsPid.h" using namespace o2; using namespace o2::aod; using namespace o2::framework; using namespace o2::analysis; +using namespace o2::aod::pid_tpc_tof_utils; struct HfCandidateSelectorBsToDsPiReduced { Produces hfSelBsToDsPiCandidate; // table defined in CandidateSelectionTables.h @@ -41,7 +43,7 @@ struct HfCandidateSelectorBsToDsPiReduced { Configurable ptCandMin{"ptCandMin", 0., "Lower bound of candidate pT"}; Configurable ptCandMax{"ptCandMax", 50., "Upper bound of candidate pT"}; // Enable PID - Configurable pionPidMethod{"pionPidMethod", 1, "PID selection method for the bachelor pion (0: none, 1: TPC or TOF, 2: TPC and TOF)"}; + Configurable pionPidMethod{"pionPidMethod", PidMethod::TpcOrTof, "PID selection method for the bachelor pion (PidMethod::NoPid: none, PidMethod::TpcOrTof: TPC or TOF, PidMethod::TpcAndTof: TPC and TOF)"}; Configurable acceptPIDNotApplicable{"acceptPIDNotApplicable", true, "Switch to accept Status::NotApplicable [(NotApplicable for one detector) and (NotApplicable or Conditional for the other)] in PID selection"}; // TPC PID Configurable ptPidTpcMin{"ptPidTpcMin", 0.15, "Lower bound of track pT for TPC PID"}; @@ -93,11 +95,11 @@ struct HfCandidateSelectorBsToDsPiReduced { LOGP(fatal, "Only one process function for data should be enabled at a time."); } - if (pionPidMethod < 0 || pionPidMethod > 2) { + if (pionPidMethod < 0 || pionPidMethod >= PidMethod::NPidMethods) { LOGP(fatal, "Invalid PID option in configurable, please set 0 (no PID), 1 (TPC or TOF), or 2 (TPC and TOF)"); } - if (pionPidMethod) { + if (pionPidMethod != PidMethod::NoPid) { selectorPion.setRangePtTpc(ptPidTpcMin, ptPidTpcMax); selectorPion.setRangeNSigmaTpc(-nSigmaTpcMax, nSigmaTpcMax); selectorPion.setRangeNSigmaTpcCondTof(-nSigmaTpcCombinedMax, nSigmaTpcCombinedMax); @@ -180,11 +182,11 @@ struct HfCandidateSelectorBsToDsPiReduced { // track-level PID selection auto trackPi = hfCandBs.template prong1_as(); - if (pionPidMethod) { + if (pionPidMethod == PidMethod::TpcOrTof || pionPidMethod == PidMethod::TpcAndTof) { int pidTrackPi{TrackSelectorPID::Status::NotApplicable}; - if (pionPidMethod == 1) { + if (pionPidMethod == PidMethod::TpcOrTof) { pidTrackPi = selectorPion.statusTpcOrTof(trackPi); - } else { + } else if (pionPidMethod == PidMethod::TpcAndTof) { pidTrackPi = selectorPion.statusTpcAndTof(trackPi); } if (!hfHelper.selectionBsToDsPiPid(pidTrackPi, acceptPIDNotApplicable.value)) { diff --git a/PWGHF/D2H/TableProducer/candidateSelectorLbToLcPiReduced.cxx b/PWGHF/D2H/TableProducer/candidateSelectorLbToLcPiReduced.cxx index 40e3cb4c8c6..11341a0266c 100644 --- a/PWGHF/D2H/TableProducer/candidateSelectorLbToLcPiReduced.cxx +++ b/PWGHF/D2H/TableProducer/candidateSelectorLbToLcPiReduced.cxx @@ -28,17 +28,13 @@ #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/D2H/DataModel/ReducedDataModel.h" +#include "PWGHF/Utils/utilsPid.h" using namespace o2; using namespace o2::aod; using namespace o2::framework; using namespace o2::analysis; - -enum PidMethod { - NoPid = 0, // none - TpcOrTof, // TPC or TOF - TpcAndTof // TPC and TOF -}; +using namespace o2::aod::pid_tpc_tof_utils; struct HfCandidateSelectorLbToLcPiReduced { Produces hfSelLbToLcPiCandidate; // table defined in CandidateSelectionTables.h @@ -47,7 +43,7 @@ struct HfCandidateSelectorLbToLcPiReduced { Configurable ptCandMin{"ptCandMin", 0., "Lower bound of candidate pT"}; Configurable ptCandMax{"ptCandMax", 50., "Upper bound of candidate pT"}; // Enable PID - Configurable pidMethod{"pidMethod", 1, "PID selection method for the bachelor pion (PidMethod::NoPid: none, PidMethod::TpcOrTof: TPC or TOF, PidMethod::TpcAndTof: TPC and TOF)"}; + Configurable pionPidMethod{"pionPidMethod", PidMethod::TpcOrTof, "PID selection method for the bachelor pion (PidMethod::NoPid: none, PidMethod::TpcOrTof: TPC or TOF, PidMethod::TpcAndTof: TPC and TOF)"}; Configurable acceptPIDNotApplicable{"acceptPIDNotApplicable", true, "Switch to accept Status::NotApplicable [(NotApplicable for one detector) and (NotApplicable or Conditional for the other)] in PID selection"}; // TPC PID Configurable ptPidTpcMin{"ptPidTpcMin", 0.15, "Lower bound of track pT for TPC PID"}; @@ -100,11 +96,11 @@ struct HfCandidateSelectorLbToLcPiReduced { LOGP(fatal, "Only one process function for data should be enabled at a time."); } - if (pidMethod < PidMethod::NoPid || pidMethod > PidMethod::TpcAndTof) { + if (pionPidMethod < 0 || pionPidMethod >= PidMethod::NPidMethods) { LOGP(fatal, "Invalid PID option in configurable, please set 0 (no PID), 1 (TPC or TOF), or 2 (TPC and TOF)"); } - if (pidMethod == PidMethod::TpcOrTof || pidMethod == PidMethod::TpcAndTof) { + if (pionPidMethod != PidMethod::NoPid) { selectorPion.setRangePtTpc(ptPidTpcMin, ptPidTpcMax); selectorPion.setRangeNSigmaTpc(-nSigmaTpcMax, nSigmaTpcMax); selectorPion.setRangeNSigmaTpcCondTof(-nSigmaTpcCombinedMax, nSigmaTpcCombinedMax); @@ -187,11 +183,11 @@ struct HfCandidateSelectorLbToLcPiReduced { // track-level PID selection auto trackPi = hfCandLb.template prong1Track_as(); - if (pidMethod == PidMethod::TpcOrTof || pidMethod == PidMethod::TpcAndTof) { + if (pionPidMethod == PidMethod::TpcOrTof || pionPidMethod == PidMethod::TpcAndTof) { int pidTrackPi{TrackSelectorPID::Status::NotApplicable}; - if (pidMethod == PidMethod::TpcOrTof) { + if (pionPidMethod == PidMethod::TpcOrTof) { pidTrackPi = selectorPion.statusTpcOrTof(trackPi); - } else { + } else if (pionPidMethod == PidMethod::TpcAndTof) { pidTrackPi = selectorPion.statusTpcAndTof(trackPi); } if (!hfHelper.selectionLbToLcPiPid(pidTrackPi, acceptPIDNotApplicable.value)) { diff --git a/PWGHF/TableProducer/candidateSelectorB0ToDPi.cxx b/PWGHF/TableProducer/candidateSelectorB0ToDPi.cxx index d262739438d..cf7658810d8 100644 --- a/PWGHF/TableProducer/candidateSelectorB0ToDPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorB0ToDPi.cxx @@ -29,11 +29,13 @@ #include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" +#include "PWGHF/Utils/utilsPid.h" using namespace o2; using namespace o2::aod; using namespace o2::framework; using namespace o2::analysis; +using namespace o2::aod::pid_tpc_tof_utils; struct HfCandidateSelectorB0ToDPi { Produces hfSelB0ToDPiCandidate; // table defined in CandidateSelectionTables.h @@ -42,7 +44,7 @@ struct HfCandidateSelectorB0ToDPi { Configurable ptCandMin{"ptCandMin", 0., "Lower bound of candidate pT"}; Configurable ptCandMax{"ptCandMax", 50., "Upper bound of candidate pT"}; // Enable PID - Configurable pionPidMethod{"pionPidMethod", 1, "PID selection method for the bachelor pion (0: none, 1: TPC or TOF, 2: TPC and TOF)"}; + Configurable pionPidMethod{"pionPidMethod", PidMethod::TpcOrTof, "PID selection method for the bachelor pion (PidMethod::NoPid: none, PidMethod::TpcOrTof: TPC or TOF, PidMethod::TpcAndTof: TPC and TOF)"}; Configurable acceptPIDNotApplicable{"acceptPIDNotApplicable", true, "Switch to accept Status::NotApplicable [(NotApplicable for one detector) and (NotApplicable or Conditional for the other)] in PID selection"}; // TPC PID Configurable ptPidTpcMin{"ptPidTpcMin", 0.15, "Lower bound of track pT for TPC PID"}; @@ -95,11 +97,11 @@ struct HfCandidateSelectorB0ToDPi { LOGP(fatal, "Only one process function for data should be enabled at a time."); } - if (pionPidMethod < 0 || pionPidMethod > 2) { + if (pionPidMethod < 0 || pionPidMethod >= PidMethod::NPidMethods) { LOGP(fatal, "Invalid PID option in configurable, please set 0 (no PID), 1 (TPC or TOF), or 2 (TPC and TOF)"); } - if (pionPidMethod != 0) { + if (pionPidMethod != PidMethod::NoPid) { selectorPion.setRangePtTpc(ptPidTpcMin, ptPidTpcMax); selectorPion.setRangeNSigmaTpc(-nSigmaTpcMax, nSigmaTpcMax); selectorPion.setRangeNSigmaTpcCondTof(-nSigmaTpcCombinedMax, nSigmaTpcCombinedMax); @@ -188,11 +190,11 @@ struct HfCandidateSelectorB0ToDPi { } // track-level PID selection - if (pionPidMethod) { + if (pionPidMethod == PidMethod::TpcOrTof || pionPidMethod == PidMethod::TpcAndTof) { int pidTrackPi{TrackSelectorPID::Status::NotApplicable}; - if (pionPidMethod == 1) { + if (pionPidMethod == PidMethod::TpcOrTof) { pidTrackPi = selectorPion.statusTpcOrTof(trackPi); - } else { + } else if (pionPidMethod == PidMethod::TpcAndTof) { pidTrackPi = selectorPion.statusTpcAndTof(trackPi); } if (!hfHelper.selectionB0ToDPiPid(pidTrackPi, acceptPIDNotApplicable.value)) { diff --git a/PWGHF/TableProducer/candidateSelectorBplusToD0Pi.cxx b/PWGHF/TableProducer/candidateSelectorBplusToD0Pi.cxx index fb520f85b21..154067f6bc2 100644 --- a/PWGHF/TableProducer/candidateSelectorBplusToD0Pi.cxx +++ b/PWGHF/TableProducer/candidateSelectorBplusToD0Pi.cxx @@ -31,11 +31,13 @@ #include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" +#include "PWGHF/Utils/utilsPid.h" using namespace o2; using namespace o2::aod; using namespace o2::framework; using namespace o2::analysis; +using namespace o2::aod::pid_tpc_tof_utils; struct HfCandidateSelectorBplusToD0Pi { Produces hfSelBplusToD0PiCandidate; // table defined in CandidateSelectionTables.h @@ -44,7 +46,7 @@ struct HfCandidateSelectorBplusToD0Pi { Configurable ptCandMin{"ptCandMin", 0., "Lower bound of candidate pT"}; Configurable ptCandMax{"ptCandMax", 50., "Upper bound of candidate pT"}; // Enable PID - Configurable pionPidMethod{"pionPidMethod", 1, "PID selection method for the bachelor pion (0: none, 1: TPC or TOF, 2: TPC and TOF)"}; + Configurable pionPidMethod{"pionPidMethod", PidMethod::TpcOrTof, "PID selection method for the bachelor pion (PidMethod::NoPid: none, PidMethod::TpcOrTof: TPC or TOF, PidMethod::TpcAndTof: TPC and TOF)"}; Configurable acceptPIDNotApplicable{"acceptPIDNotApplicable", true, "Switch to accept Status::NotApplicable [(NotApplicable for one detector) and (NotApplicable or Conditional for the other)] in PID selection"}; // TPC PID Configurable ptPidTpcMin{"ptPidTpcMin", 0.15, "Lower bound of track pT for TPC PID"}; @@ -97,11 +99,11 @@ struct HfCandidateSelectorBplusToD0Pi { LOGP(fatal, "Only one process function for data should be enabled at a time."); } - if (pionPidMethod < 0 || pionPidMethod > 2) { + if (pionPidMethod < 0 || pionPidMethod >= PidMethod::NPidMethods) { LOGP(fatal, "Invalid PID option in configurable, please set 0 (no PID), 1 (TPC or TOF), or 2 (TPC and TOF)"); } - if (pionPidMethod != 0) { + if (pionPidMethod != PidMethod::NoPid) { selectorPion.setRangePtTpc(ptPidTpcMin, ptPidTpcMax); selectorPion.setRangeNSigmaTpc(-nSigmaTpcMax, nSigmaTpcMax); selectorPion.setRangeNSigmaTpcCondTof(-nSigmaTpcCombinedMax, nSigmaTpcCombinedMax); @@ -194,11 +196,11 @@ struct HfCandidateSelectorBplusToD0Pi { } // track-level PID selection - if (pionPidMethod) { + if (pionPidMethod == PidMethod::TpcOrTof || pionPidMethod == PidMethod::TpcAndTof) { int pidTrackPi{TrackSelectorPID::Status::NotApplicable}; - if (pionPidMethod == 1) { + if (pionPidMethod == PidMethod::TpcOrTof) { pidTrackPi = selectorPion.statusTpcOrTof(trackPi); - } else { + } else if (pionPidMethod == PidMethod::TpcAndTof) { pidTrackPi = selectorPion.statusTpcAndTof(trackPi); } if (!hfHelper.selectionBplusToD0PiPid(pidTrackPi, acceptPIDNotApplicable.value)) { diff --git a/PWGHF/Utils/utilsPid.h b/PWGHF/Utils/utilsPid.h index 5fd2b95ef1e..1ea021c096a 100644 --- a/PWGHF/Utils/utilsPid.h +++ b/PWGHF/Utils/utilsPid.h @@ -19,9 +19,21 @@ namespace o2::aod::pid_tpc_tof_utils { -enum HfProngSpecies : uint8_t { Pion = 0, - Kaon, - Proton }; +/// @brief Species of HF-candidate daughter tracks +enum HfProngSpecies : uint8_t { + Pion = 0, + Kaon, + Proton, + NHfProngSpecies +}; + +/// @brief PID methods used for HF-candidate daughter tracks +enum PidMethod { + NoPid = 0, // none + TpcOrTof, // TPC or TOF + TpcAndTof, // TPC and TOF + NPidMethods +}; /// Function to combine TPC and TOF NSigma /// \param tiny switch between full and tiny (binned) PID tables From e6d0fa2fe3519ddeaec026972ea04d9ba5eaf12b Mon Sep 17 00:00:00 2001 From: jaimenorman Date: Thu, 15 May 2025 15:48:23 +0100 Subject: [PATCH 1286/1650] [PWGJE] add recluster method for WTA jets (#11185) --- PWGJE/Tasks/jetHadronRecoil.cxx | 213 ++++++++++++++++++-------------- 1 file changed, 123 insertions(+), 90 deletions(-) diff --git a/PWGJE/Tasks/jetHadronRecoil.cxx b/PWGJE/Tasks/jetHadronRecoil.cxx index e798b406ed8..2a4c47c17b6 100644 --- a/PWGJE/Tasks/jetHadronRecoil.cxx +++ b/PWGJE/Tasks/jetHadronRecoil.cxx @@ -41,12 +41,19 @@ #include "EventFiltering/filterTables.h" +#include "PWGJE/Core/FastJetUtilities.h" +#include "PWGJE/DataModel/JetSubstructure.h" + using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; struct JetHadronRecoil { + std::vector jetConstituents; + std::vector jetReclustered; + JetFinder jetReclusterer; + Configurable eventSelections{"eventSelections", "sel8", "choose event selection"}; Configurable trackSelections{"trackSelections", "globalTracks", "set track selections"}; Configurable trackPtMin{"trackPtMin", 0.15, "minimum pT acceptance for tracks"}; @@ -69,6 +76,7 @@ struct JetHadronRecoil { Configurable rhoReferenceShift{"rhoReferenceShift", 0.0, "shift in rho calculated in reference events for consistency with signal events"}; Configurable triggerMasks{"triggerMasks", "", "possible JE Trigger masks: fJetChLowPt,fJetChHighPt,fTrackLowPt,fTrackHighPt,fJetD0ChLowPt,fJetD0ChHighPt,fJetLcChLowPt,fJetLcChHighPt,fEMCALReadout,fJetFullHighPt,fJetFullLowPt,fJetNeutralHighPt,fJetNeutralLowPt,fGammaVeryHighPtEMCAL,fGammaVeryHighPtDCAL,fGammaHighPtEMCAL,fGammaHighPtDCAL,fGammaLowPtEMCAL,fGammaLowPtDCAL,fGammaVeryLowPtEMCAL,fGammaVeryLowPtDCAL"}; Configurable skipMBGapEvents{"skipMBGapEvents", false, "flag to choose to reject min. bias gap events; jet-level rejection applied at the jet finder level, here rejection is applied for collision and track process functions"}; + Configurable wtaMethod{"wtaMethod", 1, "method for WTA axis definition: 0 = matching closest WTA jet (incorrect), 1 = recluster original jet"}; Preslice> partJetsPerCollision = aod::jet::mcCollisionId; @@ -96,7 +104,8 @@ struct JetHadronRecoil { 0.147, 0.15, 0.153, 0.156, 0.159, 0.162, 0.165, 0.168, 0.171, 0.174, 0.177, 0.18, 0.183, 0.186, 0.189, 0.192, 0.195, 0.198, 0.201, 0.204, 0.207, 0.21, 0.213, 0.216, 0.219, 0.222, 0.225, 0.228, 0.231, 0.234, - 0.237, 0.24}; + 0.237, 0.24, 0.27, 0.30, 0.33, 0.36, 0.39, 0.42, 0.45, 0.48, 0.51, 0.54, + 0.57, 0.60}; AxisSpec dRAxis = {dRBinning, "#Delta R"}; @@ -174,10 +183,15 @@ struct JetHadronRecoil { Filter trackCuts = (aod::jtrack::pt >= trackPtMin && aod::jtrack::pt < trackPtMax && aod::jtrack::eta > trackEtaMin && aod::jtrack::eta < trackEtaMax); Filter particleCuts = (aod::jmcparticle::pt >= trackPtMin && aod::jmcparticle::pt < trackPtMax && aod::jmcparticle::eta > trackEtaMin && aod::jmcparticle::eta < trackEtaMax); Filter eventTrackLevelCuts = nabs(aod::jcollision::posZ) < vertexZCut; + + jetReclusterer.isReclustering = true; + jetReclusterer.algorithm = fastjet::JetAlgorithm::cambridge_algorithm; + jetReclusterer.jetR = 2 * jetR; + jetReclusterer.recombScheme = fastjet::WTA_pt_scheme; } template - void fillHistograms(T const& jets, W const& /*jetsWTA*/, U const& tracks, float weight = 1.0, float rho = 0.0) + void fillHistograms(T const& jets, W const& jetsWTA, U const& tracks, float weight = 1.0, float rho = 0.0) { bool isSigCol; std::vector phiTTAr; @@ -246,44 +260,34 @@ struct JetHadronRecoil { registry.fill(HIST("hJetPt"), jet.pt() - (rho * jet.area()), weight); registry.fill(HIST("hJetEta"), jet.eta(), weight); registry.fill(HIST("hJetPhi"), jet.phi(), weight); - for (const auto& jetWTA : jet.template matchedJetGeo_as>()) { - double deltaPhi = RecoDecay::constrainAngle(jetWTA.phi() - jet.phi(), -o2::constants::math::PI); - double deltaEta = jetWTA.eta() - jet.eta(); - double dR = RecoDecay::sqrtSumOfSquares(deltaPhi, deltaEta); - registry.fill(HIST("hDeltaR"), dR, weight); - registry.fill(HIST("hDeltaRpT"), jet.pt() - (rho * jet.area()), dR, weight); - } + + double dR = getWTAaxisDifference(jet, jetsWTA, tracks); + + registry.fill(HIST("hDeltaR"), dR, weight); + registry.fill(HIST("hDeltaRpT"), jet.pt() - (rho * jet.area()), dR, weight); + // try with fjcontrib + if (nTT > 0) { float dphi = RecoDecay::constrainAngle(jet.phi() - phiTT); if (isSigCol) { - for (const auto& jetWTA : jet.template matchedJetGeo_as>()) { - double deltaPhi = RecoDecay::constrainAngle(jetWTA.phi() - jet.phi(), -o2::constants::math::PI); - double deltaEta = jetWTA.eta() - jet.eta(); - double dR = RecoDecay::sqrtSumOfSquares(deltaPhi, deltaEta); - if (std::abs(dphi - o2::constants::math::PI) < 0.6) { - registry.fill(HIST("hDeltaRpTSignal"), jet.pt() - (rho * jet.area()), dR, weight); - registry.fill(HIST("hDeltaRSignal"), dR, weight); - } - registry.fill(HIST("hDeltaRpTDPhiSignal"), jet.pt() - (rho * jet.area()), dphi, dR, weight); + if (std::abs(dphi - o2::constants::math::PI) < 0.6) { + registry.fill(HIST("hDeltaRpTSignal"), jet.pt() - (rho * jet.area()), dR, weight); + registry.fill(HIST("hDeltaRSignal"), dR, weight); } + registry.fill(HIST("hDeltaRpTDPhiSignal"), jet.pt() - (rho * jet.area()), dphi, dR, weight); registry.fill(HIST("hSignalPtDPhi"), dphi, jet.pt() - (rho * jet.area()), weight); if (std::abs(dphi - o2::constants::math::PI) < 0.6) { registry.fill(HIST("hSignalPt"), jet.pt() - (rho * jet.area()), weight); } } if (!isSigCol) { - for (const auto& jetWTA : jet.template matchedJetGeo_as>()) { - double deltaPhi = RecoDecay::constrainAngle(jetWTA.phi() - jet.phi(), -o2::constants::math::PI); - double deltaEta = jetWTA.eta() - jet.eta(); - double dR = RecoDecay::sqrtSumOfSquares(deltaPhi, deltaEta); - if (std::abs(dphi - o2::constants::math::PI) < 0.6) { - registry.fill(HIST("hDeltaRpTReference"), jet.pt() - (rhoReference * jet.area()), dR, weight); - registry.fill(HIST("hDeltaRReference"), dR, weight); - } - registry.fill(HIST("hDeltaRpTDPhiReference"), jet.pt() - (rhoReference * jet.area()), dphi, dR, weight); - for (double shift = 0.0; shift <= 2.0; shift += 0.1) { - registry.fill(HIST("hDeltaRpTDPhiReferenceShifts"), jet.pt() - ((rho + shift) * jet.area()), dphi, dR, shift, weight); - } + if (std::abs(dphi - o2::constants::math::PI) < 0.6) { + registry.fill(HIST("hDeltaRpTReference"), jet.pt() - (rhoReference * jet.area()), dR, weight); + registry.fill(HIST("hDeltaRReference"), dR, weight); + } + registry.fill(HIST("hDeltaRpTDPhiReference"), jet.pt() - (rhoReference * jet.area()), dphi, dR, weight); + for (double shift = 0.0; shift <= 2.0; shift += 0.1) { + registry.fill(HIST("hDeltaRpTDPhiReferenceShifts"), jet.pt() - ((rho + shift) * jet.area()), dphi, dR, shift, weight); } registry.fill(HIST("hReferencePtDPhi"), dphi, jet.pt() - (rhoReference * jet.area()), weight); for (double shift = 0.0; shift <= 2.0; shift += 0.1) { @@ -298,7 +302,7 @@ struct JetHadronRecoil { } template - void fillMCPHistograms(T const& jets, W const& /*jetsWTA*/, U const& particles, float weight = 1.0) + void fillMCPHistograms(T const& jets, W const& jetsWTA, U const& particles, float weight = 1.0) { bool isSigCol; std::vector phiTTAr; @@ -354,53 +358,41 @@ struct JetHadronRecoil { registry.fill(HIST("hJetPt"), jet.pt(), weight); registry.fill(HIST("hJetEta"), jet.eta(), weight); registry.fill(HIST("hJetPhi"), jet.phi(), weight); - for (const auto& jetWTA : jet.template matchedJetGeo_as>()) { - double deltaPhi = RecoDecay::constrainAngle(jetWTA.phi() - jet.phi(), -o2::constants::math::PI); - double deltaEta = jetWTA.eta() - jet.eta(); - double dR = RecoDecay::sqrtSumOfSquares(deltaPhi, deltaEta); - registry.fill(HIST("hDeltaRPart"), dR, weight); - registry.fill(HIST("hDeltaRpTPart"), jet.pt(), dR, weight); - } + + double dR = getWTAaxisDifference(jet, jetsWTA, particles); + + registry.fill(HIST("hDeltaRPart"), dR, weight); + registry.fill(HIST("hDeltaRpTPart"), jet.pt(), dR, weight); if (nTT > 0) { float dphi = RecoDecay::constrainAngle(jet.phi() - phiTT); if (isSigCol) { - for (const auto& jetWTA : jet.template matchedJetGeo_as>()) { - double deltaPhi = RecoDecay::constrainAngle(jetWTA.phi() - jet.phi(), -o2::constants::math::PI); - double deltaEta = jetWTA.eta() - jet.eta(); - double dR = RecoDecay::sqrtSumOfSquares(deltaPhi, deltaEta); - if (std::abs(dphi - o2::constants::math::PI) < 0.6) { - registry.fill(HIST("hDeltaRpTSignalPart"), jet.pt(), dR, weight); - registry.fill(HIST("hDeltaRSignalPart"), dR, weight); - } - registry.fill(HIST("hDeltaRpTDPhiSignalPart"), jet.pt(), dphi, dR, weight); - } - registry.fill(HIST("hSignalPtDPhi"), dphi, jet.pt(), weight); if (std::abs(dphi - o2::constants::math::PI) < 0.6) { - registry.fill(HIST("hSignalPt"), jet.pt(), weight); + registry.fill(HIST("hDeltaRpTSignalPart"), jet.pt(), dR, weight); + registry.fill(HIST("hDeltaRSignalPart"), dR, weight); } + registry.fill(HIST("hDeltaRpTDPhiSignalPart"), jet.pt(), dphi, dR, weight); + } + registry.fill(HIST("hSignalPtDPhi"), dphi, jet.pt(), weight); + if (std::abs(dphi - o2::constants::math::PI) < 0.6) { + registry.fill(HIST("hSignalPt"), jet.pt(), weight); } if (!isSigCol) { - for (const auto& jetWTA : jet.template matchedJetGeo_as>()) { - double deltaPhi = RecoDecay::constrainAngle(jetWTA.phi() - jet.phi(), -o2::constants::math::PI); - double deltaEta = jetWTA.eta() - jet.eta(); - double dR = RecoDecay::sqrtSumOfSquares(deltaPhi, deltaEta); - if (std::abs(dphi - o2::constants::math::PI) < 0.6) { - registry.fill(HIST("hDeltaRpTPartReference"), jet.pt(), dR, weight); - registry.fill(HIST("hDeltaRPartReference"), dR, weight); - } - registry.fill(HIST("hDeltaRpTDPhiReferencePart"), jet.pt(), dphi, dR, weight); - } - registry.fill(HIST("hReferencePtDPhi"), dphi, jet.pt(), weight); if (std::abs(dphi - o2::constants::math::PI) < 0.6) { - registry.fill(HIST("hReferencePt"), jet.pt(), weight); + registry.fill(HIST("hDeltaRpTPartReference"), jet.pt(), dR, weight); + registry.fill(HIST("hDeltaRPartReference"), dR, weight); } + registry.fill(HIST("hDeltaRpTDPhiReferencePart"), jet.pt(), dphi, dR, weight); + } + registry.fill(HIST("hReferencePtDPhi"), dphi, jet.pt(), weight); + if (std::abs(dphi - o2::constants::math::PI) < 0.6) { + registry.fill(HIST("hReferencePt"), jet.pt(), weight); } } } } - template - void fillMatchedHistograms(T const& jetBase, V const& mcdjetsWTA, W const& mcpjetsWTA, U const&, float weight = 1.0, float rho = 0.0) + template + void fillMatchedHistograms(T const& jetBase, V const& mcdjetsWTA, W const& mcpjetsWTA, U const&, X const& tracks, Y const& particles, float weight = 1.0, float rho = 0.0) { double dR = 0; double dRp = 0; @@ -421,21 +413,16 @@ struct JetHadronRecoil { } } + dR = getWTAaxisDifference(jetBase, mcdjetsWTA, tracks, true); + if (jetBase.has_matchedJetGeo()) { for (const auto& jetTag : jetBase.template matchedJetGeo_as>()) { if (jetTag.pt() > pTHatMaxMCP * pTHat) { continue; } - for (const auto& mcpjetWTA : mcpjetsWTA) { - double djetp = RecoDecay::sqrtSumOfSquares(RecoDecay::constrainAngle(jetTag.phi() - mcpjetWTA.phi(), -o2::constants::math::PI), jetTag.eta() - mcpjetWTA.eta()); - if (mcpjetWTA.pt() > pTHatMaxMCP * pTHat) { - continue; - } - if (djetp < 0.6 * jetR) { - dRp = djetp; - break; - } - } + + dRp = getWTAaxisDifference(jetTag, mcpjetsWTA, particles, true); + registry.fill(HIST("hPtMatched"), jetBase.pt() - (rho * jetBase.area()), jetTag.pt(), weight); registry.fill(HIST("hPhiMatched"), jetBase.phi(), jetTag.phi(), weight); registry.fill(HIST("hPtResolution"), jetTag.pt(), (jetTag.pt() - (jetBase.pt() - (rho * jetBase.area()))) / jetTag.pt(), weight); @@ -595,8 +582,8 @@ struct JetHadronRecoil { soa::Filtered> const& mcdjets, soa::Filtered> const& mcdjetsWTA, soa::Filtered> const& mcpjetsWTA, - aod::JetTracks const&, - aod::JetParticles const&, + aod::JetTracks const& tracks, + aod::JetParticles const& particles, aod::JetMcCollisions const&, soa::Filtered> const& mcpjets) { @@ -609,7 +596,7 @@ struct JetHadronRecoil { registry.fill(HIST("hZvtxSelected"), collision.posZ()); const auto& mcpjetsWTACut = mcpjetsWTA.sliceBy(partJetsPerCollision, collision.mcCollisionId()); for (const auto& mcdjet : mcdjets) { - fillMatchedHistograms(mcdjet, mcdjetsWTA, mcpjetsWTACut, mcpjets); + fillMatchedHistograms(mcdjet, mcdjetsWTA, mcpjetsWTACut, mcpjets, tracks, particles); } } PROCESS_SWITCH(JetHadronRecoil, processJetsMCPMCDMatched, "process MC matched (inc jets)", false); @@ -618,8 +605,8 @@ struct JetHadronRecoil { soa::Filtered> const& mcdjets, soa::Filtered> const& mcdjetsWTA, soa::Filtered> const& mcpjetsWTA, - aod::JetTracks const&, - aod::JetParticles const&, + aod::JetTracks const& tracks, + aod::JetParticles const& particles, aod::JetMcCollisions const&, soa::Filtered> const& mcpjets) { @@ -632,7 +619,7 @@ struct JetHadronRecoil { registry.fill(HIST("hZvtxSelected"), collision.posZ()); const auto& mcpjetsWTACut = mcpjetsWTA.sliceBy(partJetsPerCollision, collision.mcCollisionId()); for (const auto& mcdjet : mcdjets) { - fillMatchedHistograms(mcdjet, mcdjetsWTA, mcpjetsWTACut, mcpjets, 1.0, collision.rho()); + fillMatchedHistograms(mcdjet, mcdjetsWTA, mcpjetsWTACut, mcpjets, tracks, particles, 1.0, collision.rho()); } } PROCESS_SWITCH(JetHadronRecoil, processJetsMCPMCDMatchedWithRhoSubtraction, "process MC matched (inc jets) with rho subtraction", false); @@ -641,8 +628,8 @@ struct JetHadronRecoil { soa::Filtered> const& mcdjets, soa::Filtered> const& mcdjetsWTA, soa::Filtered> const& mcpjetsWTA, - aod::JetTracks const&, - aod::JetParticles const&, + aod::JetTracks const& tracks, + aod::JetParticles const& particles, aod::JetMcCollisions const&, soa::Filtered> const& mcpjets) { @@ -655,7 +642,7 @@ struct JetHadronRecoil { registry.fill(HIST("hZvtxSelected"), collision.posZ()); const auto& mcpjetsWTACut = mcpjetsWTA.sliceBy(partJetsPerCollision, collision.mcCollisionId()); for (const auto& mcdjet : mcdjets) { - fillMatchedHistograms(mcdjet, mcdjetsWTA, mcpjetsWTACut, mcpjets, mcdjet.eventWeight()); + fillMatchedHistograms(mcdjet, mcdjetsWTA, mcpjetsWTACut, mcpjets, tracks, particles, mcdjet.eventWeight()); } } PROCESS_SWITCH(JetHadronRecoil, processJetsMCPMCDMatchedWeighted, "process MC matched with event weights (inc jets)", false); @@ -664,8 +651,8 @@ struct JetHadronRecoil { soa::Filtered> const& mcdjets, soa::Filtered> const& mcdjetsWTA, soa::Filtered> const& mcpjetsWTA, - aod::JetTracks const&, - aod::JetParticles const&, + aod::JetTracks const& tracks, + aod::JetParticles const& particles, aod::JetMcCollisions const&, soa::Filtered> const& mcpjets) { @@ -678,7 +665,7 @@ struct JetHadronRecoil { registry.fill(HIST("hZvtxSelected"), collision.posZ()); const auto& mcpjetsWTACut = mcpjetsWTA.sliceBy(partJetsPerCollision, collision.mcCollisionId()); for (const auto& mcdjet : mcdjets) { - fillMatchedHistograms(mcdjet, mcdjetsWTA, mcpjetsWTACut, mcpjets, mcdjet.eventWeight(), collision.rho()); + fillMatchedHistograms(mcdjet, mcdjetsWTA, mcpjetsWTACut, mcpjets, tracks, particles, mcdjet.eventWeight(), collision.rho()); } } PROCESS_SWITCH(JetHadronRecoil, processJetsMCPMCDMatchedWeightedWithRhoSubtraction, "process MC matched with event weights (inc jets) and rho subtraction", false); @@ -688,7 +675,7 @@ struct JetHadronRecoil { soa::Filtered> const& mcdjetsWTA, soa::Filtered> const& mcpjetsWTA, soa::Filtered const& tracks, - soa::Filtered const&, + soa::Filtered const& particles, aod::JetMcCollisions const&, soa::Filtered> const& mcpjets) { @@ -709,7 +696,7 @@ struct JetHadronRecoil { } if (ishJetEvent) { for (const auto& mcdjet : mcdjets) { - fillMatchedHistograms(mcdjet, mcdjetsWTA, mcpjetsWTACut, mcpjets); + fillMatchedHistograms(mcdjet, mcdjetsWTA, mcpjetsWTACut, mcpjets, tracks, particles); } } } @@ -720,7 +707,7 @@ struct JetHadronRecoil { soa::Filtered> const& mcdjetsWTA, soa::Filtered> const& mcpjetsWTA, soa::Filtered const& tracks, - soa::Filtered const&, + soa::Filtered const& particles, aod::JetMcCollisions const&, soa::Filtered> const& mcpjets) { @@ -741,11 +728,57 @@ struct JetHadronRecoil { } if (ishJetEvent) { for (const auto& mcdjet : mcdjets) { - fillMatchedHistograms(mcdjet, mcdjetsWTA, mcpjetsWTACut, mcpjets, mcdjet.eventWeight()); + fillMatchedHistograms(mcdjet, mcdjetsWTA, mcpjetsWTACut, mcpjets, tracks, particles, mcdjet.eventWeight()); } } } PROCESS_SWITCH(JetHadronRecoil, processRecoilJetsMCPMCDMatchedWeighted, "process MC matched with event weights (recoil jets)", false); + + template + double getWTAaxisDifference(T const& jet, U const& jetsWTA, X const& /*tracks or particles*/, bool isMatched = false) + { + double deltaPhi = -1; + double deltaEta = -1; + double deltaY = -1; + double dR = -1; + if (wtaMethod == 0) { + // get WTA matched jet - should just be one jet matched geometrically + if (isMatched) { + // response - requires alternative method + for (const auto& jetWTA : jetsWTA) { + double djetp = RecoDecay::sqrtSumOfSquares(RecoDecay::constrainAngle(jet.phi() - jetWTA.phi(), -o2::constants::math::PI), jet.eta() - jetWTA.eta()); + if (djetp < 0.6 * jetR) { + dR = djetp; + break; + } + } + } else { + // MCP or MCD + for (const auto& jetWTA : jet.template matchedJetGeo_as>()) { + deltaPhi = RecoDecay::constrainAngle(jetWTA.phi() - jet.phi(), -o2::constants::math::PI); + deltaEta = jetWTA.eta() - jet.eta(); + dR = RecoDecay::sqrtSumOfSquares(deltaPhi, deltaEta); + } + } + } else if (wtaMethod == 1) { + // recluster jet + jetConstituents.clear(); + for (auto& jetConstituent : jet.template tracks_as()) { + fastjetutilities::fillTracks(jetConstituent, jetConstituents, jetConstituent.globalIndex()); + } + jetReclustered.clear(); + fastjet::ClusterSequenceArea clusterSeq(jetReclusterer.findJets(jetConstituents, jetReclustered)); + jetReclustered = sorted_by_pt(jetReclustered); + + deltaPhi = RecoDecay::constrainAngle(jet.phi() - jetReclustered[0].phi(), -o2::constants::math::PI); + deltaY = jet.y() - jetReclustered[0].rap(); + dR = RecoDecay::sqrtSumOfSquares(deltaPhi, deltaY); + LOG(debug) << "orig. jet n const = " << jet.tracksIds().size() << " pt = " << jet.pt() << " eta = " << jet.eta() << " phi = " << jet.phi(); + LOG(debug) << "recl. jet n const = " << clusterSeq.constituents(jetReclustered[0]).size() << " pt = " << jetReclustered[0].pt() << " eta = " << jetReclustered[0].eta() << " phi = " << jetReclustered[0].phi(); + LOG(debug) << "distance = " << dR; + } + return dR; + } }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From c4b39445f27d483aa8cd92f1e6413ad51d0211c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Thu, 15 May 2025 17:38:03 +0200 Subject: [PATCH 1287/1650] [PWGHF] reshape the treeCreator of Tcc (#11207) --- .../TableProducer/treeCreatorTccToD0D0Pi.cxx | 552 +++++++++--------- 1 file changed, 283 insertions(+), 269 deletions(-) diff --git a/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx b/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx index 78fd5f0098f..b4b66af4bf5 100644 --- a/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx +++ b/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx @@ -232,6 +232,7 @@ struct HfTreeCreatorTccToD0D0Pi { Preslice trackIndicesPerCollision = aod::track_association::collisionId; // Partition candidatesMlAll = aod::hf_sel_candidate_d0::isSelD0 >= 0; std::shared_ptr hCandidatesD1, hCandidatesD2, hCandidatesTcc; + HistogramRegistry registry{"registry"}; OutputObj hCovPVXX{TH1F("hCovPVXX", "Tcc candidates;XX element of cov. matrix of prim. vtx. position (cm^{2});entries", 100, 0., 1.e-4)}; OutputObj hCovSVXX{TH1F("hCovSVXX", "Tcc candidates;XX element of cov. matrix of sec. vtx. position (cm^{2});entries", 100, 0., 0.2)}; void init(InitContext const&) @@ -272,6 +273,13 @@ struct HfTreeCreatorTccToD0D0Pi { ccdb->setLocalObjectValidityChecking(); lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get(ccdbPathLut)); runNumber = 0; + + hCandidatesD1 = registry.add("hCandidatesD1", "D1 candidate counter", {HistType::kTH1D, {axisCands}}); + hCandidatesD2 = registry.add("hCandidatesD2", "D2 candidate counter", {HistType::kTH1D, {axisCands}}); + hCandidatesTcc = registry.add("hCandidatesTcc", "Tcc candidate counter", {HistType::kTH1D, {axisCands}}); + setLabelHistoCands(hCandidatesD1); + setLabelHistoCands(hCandidatesD2); + setLabelHistoCands(hCandidatesTcc); } template @@ -297,293 +305,315 @@ struct HfTreeCreatorTccToD0D0Pi { } template - void runCandCreatorData(CollType const& collision, + void runCandCreatorData(CollType const& collisions, CandType const& candidates, aod::TrackAssoc const& trackIndices, - TrkType const&, - aod::BCs const&) + TrkType const&) { - auto primaryVertex = getPrimaryVertex(collision); - auto bc = collision.template bc_as(); - if (runNumber != bc.runNumber()) { - LOG(info) << ">>>>>>>>>>>> Current run number: " << runNumber; - initCCDB(bc, runNumber, ccdb, isRun2 ? ccdbPathGrp : ccdbPathGrpMag, lut, isRun2); - bz = o2::base::Propagator::Instance()->getNominalBz(); - LOG(info) << ">>>>>>>>>>>> Magnetic field: " << bz; - } - dfTcc.setBz(bz); - dfD1.setBz(bz); - dfD2.setBz(bz); - - for (const auto& candidateD1 : candidates) { - - auto trackD1Prong0 = candidateD1.template prong0_as(); - auto trackD1Prong1 = candidateD1.template prong1_as(); - auto trackParVarD1Prong0 = getTrackParCov(trackD1Prong0); - auto trackParVarD1Prong1 = getTrackParCov(trackD1Prong1); - // reconstruct the 2-prong secondary vertex - hCandidatesD1->Fill(SVFitting::BeforeFit); - try { - if (dfD1.process(trackParVarD1Prong0, trackParVarD1Prong1) == 0) { - continue; - } - } catch (const std::runtime_error& error) { - LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN for first D0 cannot work, skipping the candidate."; - hCandidatesD1->Fill(SVFitting::Fail); - continue; + for (const auto& collision : collisions) { + auto bc = collision.template bc_as(); + if (runNumber != bc.runNumber()) { + LOG(info) << ">>>>>>>>>>>> Current run number: " << runNumber; + initCCDB(bc, runNumber, ccdb, isRun2 ? ccdbPathGrp : ccdbPathGrpMag, lut, isRun2); + bz = o2::base::Propagator::Instance()->getNominalBz(); + LOG(info) << ">>>>>>>>>>>> Magnetic field: " << bz; } - hCandidatesD1->Fill(SVFitting::FitOk); - const auto& vertexD1 = dfD1.getPCACandidatePos(); - trackParVarD1Prong0.propagateTo(vertexD1[0], bz); - trackParVarD1Prong1.propagateTo(vertexD1[0], bz); - // Get pVec of tracks of D1 - std::array pVecD1Prong0 = {0}; - std::array pVecD1Prong1 = {0}; - dfD1.getTrack(0).getPxPyPzGlo(pVecD1Prong0); - dfD1.getTrack(1).getPxPyPzGlo(pVecD1Prong1); - // Get D1 momentum - std::array pVecD1 = RecoDecay::pVec(pVecD1Prong0, pVecD1Prong1); - - // build a D1 neutral track - auto trackD1 = o2::dataformats::V0(vertexD1, pVecD1, dfD1.calcPCACovMatrixFlat(), trackParVarD1Prong0, trackParVarD1Prong1); - - for (auto candidateD2 = candidateD1 + 1; candidateD2 != candidates.end(); ++candidateD2) { - - auto trackD2Prong0 = candidateD2.template prong0_as(); - auto trackD2Prong1 = candidateD2.template prong1_as(); - auto trackParVarD2Prong0 = getTrackParCov(trackD2Prong0); - auto trackParVarD2Prong1 = getTrackParCov(trackD2Prong1); + dfTcc.setBz(bz); + dfD1.setBz(bz); + dfD2.setBz(bz); + fillEvent(collision, 0, bc.runNumber()); + auto thisCollId = collision.globalIndex(); + auto candwD0ThisColl = candidates.sliceBy(candsD0PerCollisionWithMl, thisCollId); + if (candwD0ThisColl.size() <= 1) + continue; // only loop the collision that include at least 2 D candidates + auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); + auto primaryVertex = getPrimaryVertex(collision); + + for (const auto& candidateD1 : candidates) { + auto trackD1Prong0 = candidateD1.template prong0_as(); + auto trackD1Prong1 = candidateD1.template prong1_as(); + auto trackParVarD1Prong0 = getTrackParCov(trackD1Prong0); + auto trackParVarD1Prong1 = getTrackParCov(trackD1Prong1); + + auto dca0D1 = o2::dataformats::DCA(trackD1Prong0.dcaXY(), trackD1Prong0.dcaZ(), trackD1Prong0.cYY(), trackD1Prong0.cZY(), trackD1Prong0.cZZ()); + auto dca1D1 = o2::dataformats::DCA(trackD1Prong1.dcaXY(), trackD1Prong1.dcaZ(), trackD1Prong1.cYY(), trackD1Prong1.cZY(), trackD1Prong1.cZZ()); + + // repropagate tracks to this collision if needed + if (trackD1Prong0.collisionId() != thisCollId) { + trackParVarD1Prong0.propagateToDCA(primaryVertex, bz, &dca0D1); + } + + if (trackD1Prong0.collisionId() != thisCollId) { + trackParVarD1Prong1.propagateToDCA(primaryVertex, bz, &dca1D1); + } // reconstruct the 2-prong secondary vertex - hCandidatesD2->Fill(SVFitting::BeforeFit); + hCandidatesD1->Fill(SVFitting::BeforeFit); try { - if (dfD2.process(trackParVarD2Prong0, trackParVarD2Prong1) == 0) { + if (dfD1.process(trackParVarD1Prong0, trackParVarD1Prong1) == 0) { continue; } } catch (const std::runtime_error& error) { - LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN for second D0 cannot work, skipping the candidate."; - hCandidatesD2->Fill(SVFitting::Fail); + LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN for first D0 cannot work, skipping the candidate."; + hCandidatesD1->Fill(SVFitting::Fail); continue; } - hCandidatesD2->Fill(SVFitting::FitOk); - const auto& vertexD2 = dfD2.getPCACandidatePos(); - trackParVarD2Prong0.propagateTo(vertexD2[0], bz); - trackParVarD2Prong1.propagateTo(vertexD2[0], bz); - // Get pVec of tracks of D2 - std::array pVecD2Prong0 = {0}; - std::array pVecD2Prong1 = {0}; - dfD2.getTrack(0).getPxPyPzGlo(pVecD2Prong0); - dfD2.getTrack(1).getPxPyPzGlo(pVecD2Prong1); - // Get D2 momentum - std::array pVecD2 = RecoDecay::pVec(pVecD2Prong0, pVecD2Prong1); - - // build a D2 neutral track - auto trackD2 = o2::dataformats::V0(vertexD2, pVecD2, dfD2.calcPCACovMatrixFlat(), trackParVarD2Prong0, trackParVarD2Prong1); - - for (const auto& trackId : trackIndices) { - auto trackPion = trackId.template track_as(); - if (usePionIsGlobalTrackWoDCA && !trackPion.isGlobalTrackWoDCA()) { - continue; - } - // minimum pT selection - if (trackPion.pt() < ptMinSoftPion) { - continue; - } - if (std::abs(trackPion.dcaXY()) > softPiDcaXYMax || std::abs(trackPion.dcaZ()) > softPiDcaZMax) { - continue; - } - // avoid shared tracks - if ( - (candidateD1.prong0Id() == candidateD2.prong0Id()) || - (candidateD1.prong0Id() == candidateD2.prong1Id()) || - (candidateD1.prong1Id() == candidateD2.prong0Id()) || - (candidateD1.prong1Id() == candidateD2.prong1Id()) || - (candidateD1.prong0Id() == trackPion.globalIndex()) || - (candidateD1.prong1Id() == trackPion.globalIndex()) || - (candidateD2.prong0Id() == trackPion.globalIndex()) || - (candidateD2.prong1Id() == trackPion.globalIndex())) { - continue; + hCandidatesD1->Fill(SVFitting::FitOk); + const auto& vertexD1 = dfD1.getPCACandidatePos(); + trackParVarD1Prong0.propagateTo(vertexD1[0], bz); + trackParVarD1Prong1.propagateTo(vertexD1[0], bz); + // Get pVec of tracks of D1 + std::array pVecD1Prong0 = {0}; + std::array pVecD1Prong1 = {0}; + dfD1.getTrack(0).getPxPyPzGlo(pVecD1Prong0); + dfD1.getTrack(1).getPxPyPzGlo(pVecD1Prong1); + // Get D1 momentum + std::array pVecD1 = RecoDecay::pVec(pVecD1Prong0, pVecD1Prong1); + // build a D1 neutral track + auto trackD1 = o2::dataformats::V0(vertexD1, pVecD1, dfD1.calcPCACovMatrixFlat(), trackParVarD1Prong0, trackParVarD1Prong1); + + for (auto candidateD2 = candidateD1 + 1; candidateD2 != candidates.end(); ++candidateD2) { + + auto trackD2Prong0 = candidateD2.template prong0_as(); + auto trackD2Prong1 = candidateD2.template prong1_as(); + auto trackParVarD2Prong0 = getTrackParCov(trackD2Prong0); + auto trackParVarD2Prong1 = getTrackParCov(trackD2Prong1); + + auto dca0D2 = o2::dataformats::DCA(trackD2Prong0.dcaXY(), trackD2Prong0.dcaZ(), trackD2Prong0.cYY(), trackD2Prong0.cZY(), trackD2Prong0.cZZ()); + auto dca1D2 = o2::dataformats::DCA(trackD2Prong1.dcaXY(), trackD2Prong1.dcaZ(), trackD2Prong1.cYY(), trackD2Prong1.cZY(), trackD2Prong1.cZZ()); + + // repropagate tracks to this collision if needed + if (trackD2Prong0.collisionId() != thisCollId) { + trackParVarD2Prong0.propagateToDCA(primaryVertex, bz, &dca0D2); } - auto trackParCovPi = getTrackParCov(trackPion); - std::array pVecD1New = {0., 0., 0.}; - std::array pVecD2New = {0., 0., 0.}; - std::array pVecSoftPi = {0., 0., 0.}; + if (trackD2Prong0.collisionId() != thisCollId) { + trackParVarD2Prong1.propagateToDCA(primaryVertex, bz, &dca1D2); + } - // find the DCA between the D01, D02 and the bachelor track, for Tcc - hCandidatesTcc->Fill(SVFitting::BeforeFit); + // reconstruct the 2-prong secondary vertex + hCandidatesD2->Fill(SVFitting::BeforeFit); try { - if (dfTcc.process(trackD1, trackD2, trackParCovPi) == 0) { + if (dfD2.process(trackParVarD2Prong0, trackParVarD2Prong1) == 0) { continue; } } catch (const std::runtime_error& error) { - LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN for Tcc cannot work, skipping the candidate."; - hCandidatesTcc->Fill(SVFitting::Fail); + LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN for second D0 cannot work, skipping the candidate."; + hCandidatesD2->Fill(SVFitting::Fail); continue; } - hCandidatesTcc->Fill(SVFitting::FitOk); - - dfTcc.propagateTracksToVertex(); // propagate the softpi and D0 pair to the Tcc vertex - trackD1.getPxPyPzGlo(pVecD1New); // momentum of D1 at the Tcc vertex - trackD2.getPxPyPzGlo(pVecD2New); // momentum of D2 at the Tcc vertex - trackParCovPi.getPxPyPzGlo(pVecSoftPi); // momentum of pi at the Tcc vertex - - auto chi2PCA = dfTcc.getChi2AtPCACandidate(); - auto covMatrixPCA = dfTcc.calcPCACovMatrixFlat(); - hCovSVXX->Fill(covMatrixPCA[0]); - - // get track impact parameters - // This modifies track momenta! - auto covMatrixPV = primaryVertex.getCov(); - hCovPVXX->Fill(covMatrixPV[0]); - o2::dataformats::DCA impactParameterD1; - o2::dataformats::DCA impactParameterD2; - o2::dataformats::DCA impactParameterSoftPi; - - trackD1.propagateToDCA(primaryVertex, bz, &impactParameterD1); - trackD2.propagateToDCA(primaryVertex, bz, &impactParameterD2); - trackParCovPi.propagateToDCA(primaryVertex, bz, &impactParameterSoftPi); - - // Retrieve properties of the two D0 candidates - float yD1 = hfHelper.yD0(candidateD1); - float yD2 = hfHelper.yD0(candidateD2); - float massD01 = -999; - float massD02 = -999; - float deltaMassD01 = -999; - float deltaMassD02 = -999; - int candFlagD1 = -999; - int candFlagD2 = -999; - float cent = evaluateCentralityColl(collision); - - std::vector mlScoresD1; - std::vector mlScoresD2; - - if (candidateD1.isSelD0()) { - candFlagD1 = (candidateD1.isSelD0bar()) ? 3 : 1; - std::copy(candidateD1.mlProbD0().begin(), candidateD1.mlProbD0().end(), std::back_inserter(mlScoresD1)); - massD01 = hfHelper.invMassD0ToPiK(candidateD1); - } - if (candidateD1.isSelD0bar() && !candidateD1.isSelD0()) { - candFlagD1 = 2; - std::copy(candidateD1.mlProbD0bar().begin(), candidateD1.mlProbD0bar().end(), std::back_inserter(mlScoresD1)); - massD01 = hfHelper.invMassD0barToKPi(candidateD1); - } - if (candidateD2.isSelD0()) { - candFlagD2 = (candidateD2.isSelD0bar()) ? 3 : 1; - std::copy(candidateD2.mlProbD0().begin(), candidateD2.mlProbD0().end(), std::back_inserter(mlScoresD2)); - massD02 = hfHelper.invMassD0ToPiK(candidateD2); - } - if (candidateD2.isSelD0bar() && !candidateD2.isSelD0()) { - candFlagD2 = 2; - std::copy(candidateD2.mlProbD0bar().begin(), candidateD2.mlProbD0bar().end(), std::back_inserter(mlScoresD2)); - massD02 = hfHelper.invMassD0barToKPi(candidateD2); - } + hCandidatesD2->Fill(SVFitting::FitOk); + const auto& vertexD2 = dfD2.getPCACandidatePos(); + trackParVarD2Prong0.propagateTo(vertexD2[0], bz); + trackParVarD2Prong1.propagateTo(vertexD2[0], bz); + // Get pVec of tracks of D2 + std::array pVecD2Prong0 = {0}; + std::array pVecD2Prong1 = {0}; + dfD2.getTrack(0).getPxPyPzGlo(pVecD2Prong0); + dfD2.getTrack(1).getPxPyPzGlo(pVecD2Prong1); + // Get D2 momentum + std::array pVecD2 = RecoDecay::pVec(pVecD2Prong0, pVecD2Prong1); + + // build a D2 neutral track + auto trackD2 = o2::dataformats::V0(vertexD2, pVecD2, dfD2.calcPCACovMatrixFlat(), trackParVarD2Prong0, trackParVarD2Prong1); + + for (const auto& trackId : trackIndices) { + auto trackPion = trackId.template track_as(); + if (usePionIsGlobalTrackWoDCA && !trackPion.isGlobalTrackWoDCA()) { + continue; + } + // minimum pT selection + if (trackPion.pt() < ptMinSoftPion) { + continue; + } + if (std::abs(trackPion.dcaXY()) > softPiDcaXYMax || std::abs(trackPion.dcaZ()) > softPiDcaZMax) { + continue; + } + // avoid shared tracks + if ( + (candidateD1.prong0Id() == candidateD2.prong0Id()) || + (candidateD1.prong0Id() == candidateD2.prong1Id()) || + (candidateD1.prong1Id() == candidateD2.prong0Id()) || + (candidateD1.prong1Id() == candidateD2.prong1Id()) || + (candidateD1.prong0Id() == trackPion.globalIndex()) || + (candidateD1.prong1Id() == trackPion.globalIndex()) || + (candidateD2.prong0Id() == trackPion.globalIndex()) || + (candidateD2.prong1Id() == trackPion.globalIndex())) { + continue; + } + + auto trackParCovPi = getTrackParCov(trackPion); + std::array pVecD1New = {0., 0., 0.}; + std::array pVecD2New = {0., 0., 0.}; + std::array pVecSoftPi = {0., 0., 0.}; + + // find the DCA between the D01, D02 and the bachelor track, for Tcc + hCandidatesTcc->Fill(SVFitting::BeforeFit); + try { + if (dfTcc.process(trackD1, trackD2, trackParCovPi) == 0) { + continue; + } + } catch (const std::runtime_error& error) { + LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN for Tcc cannot work, skipping the candidate."; + hCandidatesTcc->Fill(SVFitting::Fail); + continue; + } + hCandidatesTcc->Fill(SVFitting::FitOk); + + dfTcc.propagateTracksToVertex(); // propagate the softpi and D0 pair to the Tcc vertex + trackD1.getPxPyPzGlo(pVecD1New); // momentum of D1 at the Tcc vertex + trackD2.getPxPyPzGlo(pVecD2New); // momentum of D2 at the Tcc vertex + trackParCovPi.getPxPyPzGlo(pVecSoftPi); // momentum of pi at the Tcc vertex + + auto chi2PCA = dfTcc.getChi2AtPCACandidate(); + auto covMatrixPCA = dfTcc.calcPCACovMatrixFlat(); + hCovSVXX->Fill(covMatrixPCA[0]); + + // get track impact parameters + // This modifies track momenta! + auto covMatrixPV = primaryVertex.getCov(); + hCovPVXX->Fill(covMatrixPV[0]); + o2::dataformats::DCA impactParameterD1; + o2::dataformats::DCA impactParameterD2; + o2::dataformats::DCA impactParameterSoftPi; + + trackD1.propagateToDCA(primaryVertex, bz, &impactParameterD1); + trackD2.propagateToDCA(primaryVertex, bz, &impactParameterD2); + trackParCovPi.propagateToDCA(primaryVertex, bz, &impactParameterSoftPi); + + // Retrieve properties of the two D0 candidates + float yD1 = hfHelper.yD0(candidateD1); + float yD2 = hfHelper.yD0(candidateD2); + float massD01 = -999; + float massD02 = -999; + float deltaMassD01 = -999; + float deltaMassD02 = -999; + int candFlagD1 = -999; + int candFlagD2 = -999; + float cent = evaluateCentralityColl(collision); + + std::vector mlScoresD1; + std::vector mlScoresD2; + + if (candidateD1.isSelD0()) { + candFlagD1 = (candidateD1.isSelD0bar()) ? 3 : 1; + std::copy(candidateD1.mlProbD0().begin(), candidateD1.mlProbD0().end(), std::back_inserter(mlScoresD1)); + massD01 = hfHelper.invMassD0ToPiK(candidateD1); + } + if (candidateD1.isSelD0bar() && !candidateD1.isSelD0()) { + candFlagD1 = 2; + std::copy(candidateD1.mlProbD0bar().begin(), candidateD1.mlProbD0bar().end(), std::back_inserter(mlScoresD1)); + massD01 = hfHelper.invMassD0barToKPi(candidateD1); + } - // LOG(info) << " candidateD1.collisionId() " << candidateD1.collisionId()<<" massD01 "< massD1Daus{MassPiPlus, MassKPlus}; - std::array massD2Daus{MassPiPlus, MassKPlus}; + // LOG(info) << " candidateD1.collisionId() " << candidateD1.collisionId()<<" massD01 "< massD1Daus{MassPiPlus, MassKPlus}; + std::array massD2Daus{MassPiPlus, MassKPlus}; - massD1Daus[0] = MassKPlus; - massD1Daus[1] = MassPiPlus; - } - if (candidateD2.isSelD0bar()) { - massD2Daus[0] = MassKPlus; - massD2Daus[1] = MassPiPlus; - } + if (candidateD1.isSelD0bar()) { - auto massKpipi1 = RecoDecay::m(std::array{pVecD1Prong0, pVecD1Prong1, pVecSoftPi}, std::array{massD1Daus[0], massD1Daus[1], MassPiPlus}); - auto massKpipi2 = RecoDecay::m(std::array{pVecD2Prong0, pVecD2Prong1, pVecSoftPi}, std::array{massD2Daus[0], massD2Daus[1], MassPiPlus}); + massD1Daus[0] = MassKPlus; + massD1Daus[1] = MassPiPlus; + } + if (candidateD2.isSelD0bar()) { + massD2Daus[0] = MassKPlus; + massD2Daus[1] = MassPiPlus; + } - deltaMassD01 = massKpipi1 - massD01; - deltaMassD02 = massKpipi2 - massD02; + auto massKpipi1 = RecoDecay::m(std::array{pVecD1Prong0, pVecD1Prong1, pVecSoftPi}, std::array{massD1Daus[0], massD1Daus[1], MassPiPlus}); + auto massKpipi2 = RecoDecay::m(std::array{pVecD2Prong0, pVecD2Prong1, pVecSoftPi}, std::array{massD2Daus[0], massD2Daus[1], MassPiPlus}); - auto arrayMomentaDDpi = std::array{pVecD1New, pVecD2New, pVecSoftPi}; - const auto massD0D0Pi = RecoDecay::m(std::move(arrayMomentaDDpi), std::array{MassD0, MassD0, MassPiPlus}); - const auto deltaMassD0D0Pi = massD0D0Pi - (massD01 + massD02); - const auto massD0D0Pair = RecoDecay::m(std::array{pVecD1New, pVecD2New}, std::array{MassD0, MassD0}); + deltaMassD01 = massKpipi1 - massD01; + deltaMassD02 = massKpipi2 - massD02; - if (deltaMassD0D0Pi > deltaMassCanMax || massD0D0Pi > massCanMax) { - continue; - } + auto arrayMomentaDDpi = std::array{pVecD1New, pVecD2New, pVecSoftPi}; + const auto massD0D0Pi = RecoDecay::m(std::move(arrayMomentaDDpi), std::array{MassD0, MassD0, MassPiPlus}); + const auto deltaMassD0D0Pi = massD0D0Pi - (massD01 + massD02); + const auto massD0D0Pair = RecoDecay::m(std::array{pVecD1New, pVecD2New}, std::array{MassD0, MassD0}); - rowCandidateLite( - candidateD1.pxProng0(), - candidateD1.pxProng1(), - candidateD1.pyProng0(), - candidateD1.pyProng1(), - candidateD1.pzProng0(), - candidateD1.pzProng1(), - candidateD2.pxProng0(), - candidateD2.pxProng1(), - candidateD2.pyProng0(), - candidateD2.pyProng1(), - candidateD2.pzProng0(), - candidateD2.pzProng1(), - trackPion.px(), - trackPion.py(), - trackPion.pz(), - candFlagD1, - candFlagD2, - massD01, - massD02, - deltaMassD01, - deltaMassD02, - massD0D0Pair, - massKpipi1, - massKpipi2, - massD0D0Pi, - deltaMassD0D0Pi, - candidateD1.eta(), - candidateD2.eta(), - trackPion.eta(), - candidateD1.phi(), - candidateD2.phi(), - trackPion.phi(), - yD1, - yD2, - trackPion.y(), - trackPion.tpcNSigmaPi(), - trackPion.tofNSigmaPi(), - mlScoresD1[0], - mlScoresD2[0], - impactParameterD1.getY(), - impactParameterD2.getY(), - impactParameterSoftPi.getY(), - candidateD1.cpa(), - candidateD2.cpa(), - chi2PCA, - trackPion.sign(), - trackPion.dcaXY(), - trackPion.dcaZ(), - trackPion.itsNCls(), - trackPion.tpcNClsCrossedRows(), - trackPion.tpcChi2NCl(), - cent); - } // end of loop track - } // end of loop second D0 - } // end of loop first D0 - } + if (deltaMassD0D0Pi > deltaMassCanMax || massD0D0Pi > massCanMax) { + continue; + } + rowCandidateLite( + candidateD1.pxProng0(), + candidateD1.pxProng1(), + candidateD1.pyProng0(), + candidateD1.pyProng1(), + candidateD1.pzProng0(), + candidateD1.pzProng1(), + candidateD2.pxProng0(), + candidateD2.pxProng1(), + candidateD2.pyProng0(), + candidateD2.pyProng1(), + candidateD2.pzProng0(), + candidateD2.pzProng1(), + trackPion.px(), + trackPion.py(), + trackPion.pz(), + candFlagD1, + candFlagD2, + massD01, + massD02, + deltaMassD01, + deltaMassD02, + massD0D0Pair, + massKpipi1, + massKpipi2, + massD0D0Pi, + deltaMassD0D0Pi, + candidateD1.eta(), + candidateD2.eta(), + trackPion.eta(), + candidateD1.phi(), + candidateD2.phi(), + trackPion.phi(), + yD1, + yD2, + trackPion.y(), + trackPion.tpcNSigmaPi(), + trackPion.tofNSigmaPi(), + mlScoresD1[0], + mlScoresD2[0], + impactParameterD1.getY(), + impactParameterD2.getY(), + impactParameterSoftPi.getY(), + candidateD1.cpa(), + candidateD2.cpa(), + chi2PCA, + trackPion.sign(), + trackPion.dcaXY(), + trackPion.dcaZ(), + trackPion.itsNCls(), + trackPion.tpcNClsCrossedRows(), + trackPion.tpcChi2NCl(), + cent); + } // end of loop track + } // end of loop second D0 + } // end of loop first D0 + } // end of loop collision + } void processDataWithMl(Collisions const& collisions, SelectedCandidatesMl const& candidates, aod::TrackAssoc const& trackIndices, TracksWPid const& tracks, - aod::BCs const& bcs) + aod::BCsWithTimestamps const&) { rowCandidateFullEvents.reserve(collisions.size()); - for (const auto& collision : collisions) { - fillEvent(collision, 0, collision.bc().runNumber()); - auto thisCollId = collision.globalIndex(); - auto candwD0ThisColl = candidates.sliceBy(candsD0PerCollisionWithMl, thisCollId); - if (candwD0ThisColl.size() <= 1) - continue; // only loop the collision that include at least 2 D candidates - auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); - runCandCreatorData(collision, candwD0ThisColl, trackIdsThisCollision, tracks, bcs); - } + runCandCreatorData(collisions, candidates, trackIndices, tracks); } PROCESS_SWITCH(HfTreeCreatorTccToD0D0Pi, processDataWithMl, "Process data with DCAFitterN with the ML method and without centrality", false); @@ -591,18 +621,10 @@ struct HfTreeCreatorTccToD0D0Pi { SelectedCandidatesMl const& candidates, aod::TrackAssoc const& trackIndices, TracksWPid const& tracks, - aod::BCs const& bcs) + aod::BCsWithTimestamps const&) { rowCandidateFullEvents.reserve(collisions.size()); - for (const auto& collision : collisions) { - fillEvent(collision, 0, collision.bc().runNumber()); - auto thisCollId = collision.globalIndex(); - auto candwD0ThisColl = candidates.sliceBy(candsD0PerCollisionWithMl, thisCollId); - if (candwD0ThisColl.size() <= 1) - continue; // only loop the collision that include at least 2 D candidates - auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); - runCandCreatorData(collision, candwD0ThisColl, trackIdsThisCollision, tracks, bcs); - } + runCandCreatorData(collisions, candidates, trackIndices, tracks); } PROCESS_SWITCH(HfTreeCreatorTccToD0D0Pi, processDataWithMlWithFT0C, "Process data with DCAFitterN with the ML method and with FT0C centrality", true); @@ -610,18 +632,10 @@ struct HfTreeCreatorTccToD0D0Pi { SelectedCandidatesMl const& candidates, aod::TrackAssoc const& trackIndices, TracksWPid const& tracks, - aod::BCs const& bcs) + aod::BCsWithTimestamps const&) { rowCandidateFullEvents.reserve(collisions.size()); - for (const auto& collision : collisions) { - fillEvent(collision, 0, collision.bc().runNumber()); - auto thisCollId = collision.globalIndex(); - auto candwD0ThisColl = candidates.sliceBy(candsD0PerCollisionWithMl, thisCollId); - if (candwD0ThisColl.size() <= 1) - continue; // only loop the collision that include at least 2 D candidates - auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); - runCandCreatorData(collision, candwD0ThisColl, trackIdsThisCollision, tracks, bcs); - } + runCandCreatorData(collisions, candidates, trackIndices, tracks); } PROCESS_SWITCH(HfTreeCreatorTccToD0D0Pi, processDataWithMlWithFT0M, "Process data with DCAFitterN with the ML method and with FT0M centrality", false); }; From c109495d8f2a378b839810e9fd9b3c9b6b972ca2 Mon Sep 17 00:00:00 2001 From: JBae <110481228+joonsukbae@users.noreply.github.com> Date: Fri, 16 May 2025 02:04:36 +0900 Subject: [PATCH 1288/1650] [PWGJE] debugged hadronic rate error when filling histograms (#11196) --- PWGJE/Tasks/jetFinderQA.cxx | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/PWGJE/Tasks/jetFinderQA.cxx b/PWGJE/Tasks/jetFinderQA.cxx index c2fd285a7a2..1a6cd948200 100644 --- a/PWGJE/Tasks/jetFinderQA.cxx +++ b/PWGJE/Tasks/jetFinderQA.cxx @@ -422,7 +422,7 @@ struct JetFinderQATask { } template - void fillHistograms(T const& jet, float centrality, float occupancy, float weight = 1.0) + void fillHistograms(T const& jet, float centrality, float occupancy, float hadronicRate, float weight = 1.0) { float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); @@ -442,7 +442,7 @@ struct JetFinderQATask { registry.fill(HIST("h2_centrality_jet_phi"), centrality, jet.phi(), weight); registry.fill(HIST("h2_centrality_jet_ntracks"), centrality, jet.tracksIds().size(), weight); registry.fill(HIST("h3_centrality_occupancy_jet_pt"), centrality, occupancy, jet.pt(), weight); - registry.fill(HIST("h2_intrate_jet_pt"), jet.collision().hadronicRate(), jet.pt(), weight); + registry.fill(HIST("h2_intrate_jet_pt"), hadronicRate, jet.pt(), weight); } registry.fill(HIST("h3_jet_r_jet_pt_centrality"), jet.r() / 100.0, jet.pt(), centrality, weight); @@ -783,7 +783,7 @@ struct JetFinderQATask { if (!isAcceptedJet(jet)) { continue; } - fillHistograms(jet, collision.centrality(), collision.trackOccupancyInTimeRange()); + fillHistograms(jet, collision.centrality(), collision.trackOccupancyInTimeRange(), collision.hadronicRate()); } } PROCESS_SWITCH(JetFinderQATask, processJetsData, "jet finder QA data", false); @@ -898,7 +898,7 @@ struct JetFinderQATask { if (!isAcceptedJet(jet)) { continue; } - fillHistograms(jet, collision.centrality(), collision.trackOccupancyInTimeRange()); + fillHistograms(jet, collision.centrality(), collision.trackOccupancyInTimeRange(), collision.hadronicRate()); } } PROCESS_SWITCH(JetFinderQATask, processJetsMCD, "jet finder QA mcd", false); @@ -921,7 +921,7 @@ struct JetFinderQATask { registry.fill(HIST("h_jet_ptcut"), jet.pt(), N * 0.25, jet.eventWeight()); } } - fillHistograms(jet, collision.centrality(), collision.trackOccupancyInTimeRange(), jet.eventWeight()); + fillHistograms(jet, collision.centrality(), collision.trackOccupancyInTimeRange(), collision.hadronicRate(), jet.eventWeight()); } } PROCESS_SWITCH(JetFinderQATask, processJetsMCDWeighted, "jet finder QA mcd with weighted events", false); @@ -1301,4 +1301,7 @@ struct JetFinderQATask { PROCESS_SWITCH(JetFinderQATask, processOccupancyQA, "occupancy QA on jet derived data", false); }; -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc, TaskName{"jet-finder-charged-qa"})}; } +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc, TaskName{"jet-finder-charged-qa"})}; // o2-linter: disable=name/o2-task,name/workflow-file +} From b8d81bc3795ec595dff358e727dac15837a1c974 Mon Sep 17 00:00:00 2001 From: EmilGorm <50658075+EmilGorm@users.noreply.github.com> Date: Thu, 15 May 2025 19:51:21 +0200 Subject: [PATCH 1289/1650] [PWGCF] Add OTF process function (#11203) Co-authored-by: ALICE Action Bot --- .../Tasks/flowGenericFramework.cxx | 177 +++++++++--------- 1 file changed, 93 insertions(+), 84 deletions(-) diff --git a/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx b/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx index 271f3b16493..9f419324209 100644 --- a/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx +++ b/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx @@ -52,13 +52,10 @@ using namespace o2; using namespace o2::framework; -using namespace o2::framework::expressions; -using namespace o2::analysis; -using namespace o2::constants::math; #define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable NAME{#NAME, DEFAULT, HELP}; -namespace o2::analysis::genericframework +namespace o2::analysis::gfw { std::vector ptbinning = {0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.2, 2.4, 2.6, 2.8, 3, 3.5, 4, 5, 6, 8, 10}; float ptpoilow = 0.2, ptpoiup = 10.0; @@ -70,7 +67,7 @@ int vtxZbins = 40; float vtxZlow = -10.0, vtxZup = 10.0; int phibins = 72; float philow = 0.0; -float phiup = TwoPI; +float phiup = o2::constants::math::TwoPI; int nchbins = 300; float nchlow = 0; float nchup = 3000; @@ -78,9 +75,7 @@ std::vector centbinning(90); int nBootstrap = 10; GFWRegions regions; GFWCorrConfigs configs; -} // namespace o2::analysis::genericframework - -using namespace o2::analysis::genericframework; +} // namespace o2::analysis::gfw struct FlowGenericFramework { @@ -105,7 +100,7 @@ struct FlowGenericFramework { O2_DEFINE_CONFIGURABLE(cfgEta, float, 0.8, "eta cut"); O2_DEFINE_CONFIGURABLE(cfgEtaPtPt, float, 0.4, "eta cut for pt-pt correlations"); O2_DEFINE_CONFIGURABLE(cfgVtxZ, float, 10, "vertex cut (cm)"); - O2_DEFINE_CONFIGURABLE(cfgOccupancySelection, int, -999, "Max occupancy selection, -999 to disable"); + O2_DEFINE_CONFIGURABLE(cfgOccupancySelection, int, 2000, "Max occupancy selection, -999 to disable"); O2_DEFINE_CONFIGURABLE(cfgNoSameBunchPileupCut, bool, true, "kNoSameBunchPileupCut"); O2_DEFINE_CONFIGURABLE(cfgIsGoodZvtxFT0vsPV, bool, true, "kIsGoodZvtxFT0vsPV"); O2_DEFINE_CONFIGURABLE(cfgIsGoodITSLayersAll, bool, true, "kIsGoodITSLayersAll"); @@ -208,39 +203,39 @@ struct FlowGenericFramework { void init(InitContext const&) { LOGF(info, "flowGenericFramework::init()"); - regions.SetNames(cfgRegions->GetNames()); - regions.SetEtaMin(cfgRegions->GetEtaMin()); - regions.SetEtaMax(cfgRegions->GetEtaMax()); - regions.SetpTDifs(cfgRegions->GetpTDifs()); - regions.SetBitmasks(cfgRegions->GetBitmasks()); - configs.SetCorrs(cfgCorrConfig->GetCorrs()); - configs.SetHeads(cfgCorrConfig->GetHeads()); - configs.SetpTDifs(cfgCorrConfig->GetpTDifs()); - configs.SetpTCorrMasks(cfgCorrConfig->GetpTCorrMasks()); - regions.Print(); - configs.Print(); - ptbinning = cfgGFWBinning->GetPtBinning(); - ptpoilow = cfgGFWBinning->GetPtPOImin(); - ptpoiup = cfgGFWBinning->GetPtPOImax(); - ptreflow = cfgGFWBinning->GetPtRefMin(); - ptrefup = cfgGFWBinning->GetPtRefMax(); - ptlow = cfgPtmin; - ptup = cfgPtmax; - etabins = cfgGFWBinning->GetEtaBins(); - vtxZbins = cfgGFWBinning->GetVtxZbins(); - phibins = cfgGFWBinning->GetPhiBins(); - philow = 0.0f; - phiup = TwoPI; - nchbins = cfgGFWBinning->GetNchBins(); - nchlow = cfgGFWBinning->GetNchMin(); - nchup = cfgGFWBinning->GetNchMax(); - centbinning = cfgGFWBinning->GetCentBinning(); + o2::analysis::gfw::regions.SetNames(cfgRegions->GetNames()); + o2::analysis::gfw::regions.SetEtaMin(cfgRegions->GetEtaMin()); + o2::analysis::gfw::regions.SetEtaMax(cfgRegions->GetEtaMax()); + o2::analysis::gfw::regions.SetpTDifs(cfgRegions->GetpTDifs()); + o2::analysis::gfw::regions.SetBitmasks(cfgRegions->GetBitmasks()); + o2::analysis::gfw::configs.SetCorrs(cfgCorrConfig->GetCorrs()); + o2::analysis::gfw::configs.SetHeads(cfgCorrConfig->GetHeads()); + o2::analysis::gfw::configs.SetpTDifs(cfgCorrConfig->GetpTDifs()); + o2::analysis::gfw::configs.SetpTCorrMasks(cfgCorrConfig->GetpTCorrMasks()); + o2::analysis::gfw::regions.Print(); + o2::analysis::gfw::configs.Print(); + o2::analysis::gfw::ptbinning = cfgGFWBinning->GetPtBinning(); + o2::analysis::gfw::ptpoilow = cfgGFWBinning->GetPtPOImin(); + o2::analysis::gfw::ptpoiup = cfgGFWBinning->GetPtPOImax(); + o2::analysis::gfw::ptreflow = cfgGFWBinning->GetPtRefMin(); + o2::analysis::gfw::ptrefup = cfgGFWBinning->GetPtRefMax(); + o2::analysis::gfw::ptlow = cfgPtmin; + o2::analysis::gfw::ptup = cfgPtmax; + o2::analysis::gfw::etabins = cfgGFWBinning->GetEtaBins(); + o2::analysis::gfw::vtxZbins = cfgGFWBinning->GetVtxZbins(); + o2::analysis::gfw::phibins = cfgGFWBinning->GetPhiBins(); + o2::analysis::gfw::philow = 0.0f; + o2::analysis::gfw::phiup = o2::constants::math::TwoPI; + o2::analysis::gfw::nchbins = cfgGFWBinning->GetNchBins(); + o2::analysis::gfw::nchlow = cfgGFWBinning->GetNchMin(); + o2::analysis::gfw::nchup = cfgGFWBinning->GetNchMax(); + o2::analysis::gfw::centbinning = cfgGFWBinning->GetCentBinning(); cfgGFWBinning->Print(); - AxisSpec phiAxis = {phibins, philow, phiup, "#phi"}; - AxisSpec etaAxis = {etabins, -cfgEta, cfgEta, "#eta"}; - AxisSpec vtxAxis = {vtxZbins, -cfgVtxZ, cfgVtxZ, "Vtx_{z} (cm)"}; - AxisSpec ptAxis = {ptbinning, "#it{p}_{T} GeV/#it{c}"}; + AxisSpec phiAxis = {o2::analysis::gfw::phibins, o2::analysis::gfw::philow, o2::analysis::gfw::phiup, "#phi"}; + AxisSpec etaAxis = {o2::analysis::gfw::etabins, -cfgEta, cfgEta, "#eta"}; + AxisSpec vtxAxis = {o2::analysis::gfw::vtxZbins, -cfgVtxZ, cfgVtxZ, "Vtx_{z} (cm)"}; + AxisSpec ptAxis = {o2::analysis::gfw::ptbinning, "#it{p}_{T} GeV/#it{c}"}; std::string sCentralityEstimator; switch (cfgCentEstimator) { case kCentFT0C: @@ -259,11 +254,11 @@ struct FlowGenericFramework { sCentralityEstimator = "FT0C"; } sCentralityEstimator += " centrality (%)"; - AxisSpec centAxis = {centbinning, sCentralityEstimator.c_str()}; + AxisSpec centAxis = {o2::analysis::gfw::centbinning, sCentralityEstimator.c_str()}; std::vector nchbinning; - int nchskip = (nchup - nchlow) / nchbins; - for (int i = 0; i <= nchbins; ++i) { - nchbinning.push_back(nchskip * i + nchlow + 0.5); + int nchskip = (o2::analysis::gfw::nchup - o2::analysis::gfw::nchlow) / o2::analysis::gfw::nchbins; + for (int i = 0; i <= o2::analysis::gfw::nchbins; ++i) { + nchbinning.push_back(nchskip * i + o2::analysis::gfw::nchlow + 0.5); } AxisSpec nchAxis = {nchbinning, "N_{ch}"}; AxisSpec t0cAxis = {70, 0, 70000, "N_{ch} (T0C)"}; @@ -279,8 +274,8 @@ struct FlowGenericFramework { int64_t now = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); ccdb->setCreatedNotAfter(now); - int ptbins = ptbinning.size() - 1; - fPtAxis = new TAxis(ptbins, &ptbinning[0]); + int ptbins = o2::analysis::gfw::ptbinning.size() - 1; + fPtAxis = new TAxis(ptbins, &o2::analysis::gfw::ptbinning[0]); if (doprocessMCGen) { registry.add("MCGen/before/pt_gen", "", {HistType::kTH1D, {ptAxis}}); @@ -297,8 +292,8 @@ struct FlowGenericFramework { registry.add("trackQA/before/nTPCCrossedRows", "Number of crossed TPC Rows", {HistType::kTH1D, {{100, 40, 180}}}); registry.addClone("trackQA/before/", "trackQA/after/"); - registry.add("trackQA/after/pt_ref", "", {HistType::kTH1D, {{100, ptreflow, ptrefup}}}); - registry.add("trackQA/after/pt_poi", "", {HistType::kTH1D, {{100, ptpoilow, ptpoiup}}}); + registry.add("trackQA/after/pt_ref", "", {HistType::kTH1D, {{100, o2::analysis::gfw::ptreflow, o2::analysis::gfw::ptrefup}}}); + registry.add("trackQA/after/pt_poi", "", {HistType::kTH1D, {{100, o2::analysis::gfw::ptpoilow, o2::analysis::gfw::ptpoiup}}}); registry.add("eventQA/before/centrality", "", {HistType::kTH1D, {centAxis}}); registry.add("eventQA/before/multiplicity", "", {HistType::kTH1D, {nchAxis}}); @@ -336,13 +331,13 @@ struct FlowGenericFramework { } } - if (regions.GetSize() < 0) + if (o2::analysis::gfw::regions.GetSize() < 0) LOGF(error, "Configuration contains vectors of different size - check the GFWRegions configurable"); - for (auto i(0); i < regions.GetSize(); ++i) { - fGFW->AddRegion(regions.GetNames()[i], regions.GetEtaMin()[i], regions.GetEtaMax()[i], (regions.GetpTDifs()[i]) ? ptbins + 1 : 1, regions.GetBitmasks()[i]); + for (auto i(0); i < o2::analysis::gfw::regions.GetSize(); ++i) { + fGFW->AddRegion(o2::analysis::gfw::regions.GetNames()[i], o2::analysis::gfw::regions.GetEtaMin()[i], o2::analysis::gfw::regions.GetEtaMax()[i], (o2::analysis::gfw::regions.GetpTDifs()[i]) ? ptbins + 1 : 1, o2::analysis::gfw::regions.GetBitmasks()[i]); } - for (auto i = 0; i < configs.GetSize(); ++i) { - corrconfigs.push_back(fGFW->GetCorrelatorConfig(configs.GetCorrs()[i], configs.GetHeads()[i], configs.GetpTDifs()[i])); + for (auto i = 0; i < o2::analysis::gfw::configs.GetSize(); ++i) { + corrconfigs.push_back(fGFW->GetCorrelatorConfig(o2::analysis::gfw::configs.GetCorrs()[i], o2::analysis::gfw::configs.GetHeads()[i], o2::analysis::gfw::configs.GetpTDifs()[i])); } if (corrconfigs.empty()) LOGF(error, "Configuration contains vectors of different size - check the GFWCorrConfig configurable"); @@ -362,7 +357,7 @@ struct FlowGenericFramework { delete oba; fFCpt->setUseCentralMoments(cfgUseCentralMoments); fFCpt->setUseGapMethod(cfgUseGapMethod); - fFCpt->initialise(multAxis, cfgMpar, configs, cfgNbootstrap); + fFCpt->initialise(multAxis, cfgMpar, o2::analysis::gfw::configs, cfgNbootstrap); // Event selection - Alex if (cfgUseAdditionalEventCut) { fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x - 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); @@ -498,7 +493,8 @@ struct FlowGenericFramework { return -1; // Select particle with the lowest nsigma - for (int i = 0; i < 3; ++i) { + const int nspecies = 3; + for (int i = 0; i < nspecies; ++i) { if (std::abs(nSigmaToUse[i]) < nsigma) { pid = i; nsigma = std::abs(nSigmaToUse[i]); @@ -573,7 +569,9 @@ struct FlowGenericFramework { if (collision.numContrib() > 1) { vtxz = collision.posZ(); float zRes = std::sqrt(collision.covZZ()); - if (zRes > 0.25 && collision.numContrib() < 20) + float minZRes = 0.25; + int minNContrib = 20; + if (zRes > minZRes && collision.numContrib() < minNContrib) vtxz = -999; } // auto multV0A = collision.multFV0A(); @@ -581,7 +579,7 @@ struct FlowGenericFramework { // auto multT0C = collision.multFT0C(); auto multNTracksPV = collision.multNTracksPV(); - if (vtxz > vtxZup || vtxz < vtxZlow) + if (vtxz > o2::analysis::gfw::vtxZup || vtxz < o2::analysis::gfw::vtxZlow) return 0; if (cfgMultCut) { @@ -609,10 +607,10 @@ struct FlowGenericFramework { void fillWeights(const TTrack track, const double vtxz, const int& pid_index, const int& run) { if (cfgUsePID) { - double ptpidmins[] = {ptpoilow, ptpoilow, 0.3, 0.5}; // min pt for ch, pi, ka, pr - double ptpidmaxs[] = {ptpoiup, ptpoiup, 6.0, 6.0}; // max pt for ch, pi, ka, pr - bool withinPtPOI = (ptpidmins[pid_index] < track.pt()) && (track.pt() < ptpidmaxs[pid_index]); // within POI pT range - bool withinPtRef = (ptreflow < track.pt()) && (track.pt() < ptrefup); // within RF pT range + double ptpidmins[] = {o2::analysis::gfw::ptpoilow, o2::analysis::gfw::ptpoilow, 0.3, 0.5}; // min pt for ch, pi, ka, pr + double ptpidmaxs[] = {o2::analysis::gfw::ptpoiup, o2::analysis::gfw::ptpoiup, 6.0, 6.0}; // max pt for ch, pi, ka, pr + bool withinPtPOI = (ptpidmins[pid_index] < track.pt()) && (track.pt() < ptpidmaxs[pid_index]); // within POI pT range + bool withinPtRef = (o2::analysis::gfw::ptreflow < track.pt()) && (track.pt() < o2::analysis::gfw::ptrefup); // within RF pT range if (cfgRunByRun) { if (withinPtRef && !pid_index) th3sList[run][hNUAref]->Fill(track.phi(), track.eta(), vtxz); // pt-subset of charged particles for ref flow @@ -649,11 +647,11 @@ struct FlowGenericFramework { void createRunByRunHistograms(const int& run) { - AxisSpec phiAxis = {phibins, philow, phiup, "#phi"}; - AxisSpec etaAxis = {etabins, -cfgEta, cfgEta, "#eta"}; - AxisSpec vtxAxis = {vtxZbins, -cfgVtxZ, cfgVtxZ, "Vtx_{z} (cm)"}; - AxisSpec nchAxis = {nchbins, nchlow, nchup, "N_{ch}"}; - AxisSpec centAxis = {centbinning, "Centrality (%)"}; + AxisSpec phiAxis = {o2::analysis::gfw::phibins, o2::analysis::gfw::philow, o2::analysis::gfw::phiup, "#phi"}; + AxisSpec etaAxis = {o2::analysis::gfw::etabins, -cfgEta, cfgEta, "#eta"}; + AxisSpec vtxAxis = {o2::analysis::gfw::vtxZbins, -cfgVtxZ, cfgVtxZ, "Vtx_{z} (cm)"}; + AxisSpec nchAxis = {o2::analysis::gfw::nchbins, o2::analysis::gfw::nchlow, o2::analysis::gfw::nchup, "N_{ch}"}; + AxisSpec centAxis = {o2::analysis::gfw::centbinning, "Centrality (%)"}; std::vector> histos(kCount_TH1Names); histos[hPhi] = registry.add(Form("%d/phi", run), "", {HistType::kTH1D, {phiAxis}}); histos[hEta] = registry.add(Form("%d/eta", run), "", {HistType::kTH1D, {etaAxis}}); @@ -704,7 +702,7 @@ struct FlowGenericFramework { if (std::abs(val) < 1) { (dt == kGen) ? fFCgen->FillProfile(corrconfigs.at(l_ind).Head.c_str(), centmult, val, dnx, rndm) : fFC->FillProfile(corrconfigs.at(l_ind).Head.c_str(), centmult, val, dnx, rndm); if (cfgUseGapMethod) - fFCpt->fillVnPtProfiles(centmult, val, dnx, rndm, configs.GetpTCorrMasks()[l_ind]); + fFCpt->fillVnPtProfiles(centmult, val, dnx, rndm, o2::analysis::gfw::configs.GetpTCorrMasks()[l_ind]); } continue; } @@ -725,11 +723,13 @@ struct FlowGenericFramework { { if (tracks.size() < 1) return; - if (centrality < centbinning.front() || centrality > centbinning.back()) + if (dt != kGen && (centrality < o2::analysis::gfw::centbinning.front() || centrality > o2::analysis::gfw::centbinning.back())) return; - registry.fill(HIST("eventQA/eventSel"), 10.5); - if (cfgRunByRun) - th1sList[run][hEventSel]->Fill(10.5); + if (dt != kGen) { + registry.fill(HIST("eventQA/eventSel"), 10.5); + if (cfgRunByRun) + th1sList[run][hEventSel]->Fill(10.5); + } float vtxz = collision.posZ(); if (dt != kGen && cfgRunByRun) { th1sList[run][hVtxZ]->Fill(vtxz); @@ -750,7 +750,7 @@ struct FlowGenericFramework { double q3x = 0, q3y = 0; double q4x = 0, q4y = 0; for (const auto& track : tracks) { - bool withinPtRef = (ptreflow < track.pt()) && (track.pt() < ptrefup); // within RF pT rang + bool withinPtRef = (o2::analysis::gfw::ptreflow < track.pt()) && (track.pt() < o2::analysis::gfw::ptrefup); // within RF pT rang if (withinPtRef) { q2x += std::cos(2 * track.phi()); q2y += std::sin(2 * track.phi()); @@ -795,7 +795,7 @@ struct FlowGenericFramework { if (cfgFillQA) fillTrackQA(track, vtxz); - if (mcParticle.eta() < etalow || mcParticle.eta() > etaup || mcParticle.pt() < ptlow || mcParticle.pt() > ptup || track.tpcNClsFound() < cfgNcls) + if (mcParticle.eta() < o2::analysis::gfw::etalow || mcParticle.eta() > o2::analysis::gfw::etaup || mcParticle.pt() < o2::analysis::gfw::ptlow || mcParticle.pt() > o2::analysis::gfw::ptup || track.tpcNClsFound() < cfgNcls) return; int pidIndex = 0; @@ -829,7 +829,7 @@ struct FlowGenericFramework { if (cfgFillQA) fillTrackQA(track, vtxz); - if (track.eta() < etalow || track.eta() > etaup || track.pt() < ptlow || track.pt() > ptup) + if (track.eta() < o2::analysis::gfw::etalow || track.eta() > o2::analysis::gfw::etaup || track.pt() < o2::analysis::gfw::ptlow || track.pt() > o2::analysis::gfw::ptup) return; int pidIndex = 0; @@ -896,9 +896,9 @@ struct FlowGenericFramework { inline void fillGFW(TTrack track, const double& vtxz, int pid_index, DensityCorr densitycorrections) { if (cfgUsePID) { // Analysing POI flow with id'ed particles - double ptmins[] = {ptpoilow, ptpoilow, 0.3, 0.5}; - double ptmaxs[] = {ptpoiup, ptpoiup, 6.0, 6.0}; - bool withinPtRef = (track.pt() > ptreflow && track.pt() < ptrefup); + double ptmins[] = {o2::analysis::gfw::ptpoilow, o2::analysis::gfw::ptpoilow, 0.3, 0.5}; + double ptmaxs[] = {o2::analysis::gfw::ptpoiup, o2::analysis::gfw::ptpoiup, 6.0, 6.0}; + bool withinPtRef = (track.pt() > o2::analysis::gfw::ptreflow && track.pt() < o2::analysis::gfw::ptrefup); bool withinPtPOI = (track.pt() > ptmins[pid_index] && track.pt() < ptmaxs[pid_index]); bool withinPtNch = (track.pt() > ptmins[0] && track.pt() < ptmaxs[0]); if (!withinPtPOI && !withinPtRef) @@ -919,8 +919,8 @@ struct FlowGenericFramework { if (withinPtNch && withinPtRef) fGFW->Fill(track.eta(), fPtAxis->FindBin(track.pt()) - 1, track.phi(), waccPOI, 32); } else { // Analysing only integrated flow - bool withinPtRef = (track.pt() > ptreflow && track.pt() < ptrefup); - bool withinPtPOI = (track.pt() > ptpoilow && track.pt() < ptpoiup); + bool withinPtRef = (track.pt() > o2::analysis::gfw::ptreflow && track.pt() < o2::analysis::gfw::ptrefup); + bool withinPtPOI = (track.pt() > o2::analysis::gfw::ptpoilow && track.pt() < o2::analysis::gfw::ptpoiup); if (!withinPtPOI && !withinPtRef) return; double weff = (dt == kGen) ? 1. : getEfficiency(track); @@ -986,8 +986,8 @@ struct FlowGenericFramework { return; } - Filter collisionFilter = nabs(aod::collision::posZ) < cfgVtxZ; - Filter trackFilter = nabs(aod::track::eta) < cfgEta && aod::track::pt > cfgPtmin&& aod::track::pt < cfgPtmax && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && nabs(aod::track::dcaXY) < cfgDCAxy&& nabs(aod::track::dcaZ) < cfgDCAz; + o2::framework::expressions::Filter collisionFilter = nabs(aod::collision::posZ) < cfgVtxZ; + o2::framework::expressions::Filter trackFilter = nabs(aod::track::eta) < cfgEta && aod::track::pt > cfgPtmin&& aod::track::pt < cfgPtmax && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && nabs(aod::track::dcaXY) < cfgDCAxy&& nabs(aod::track::dcaZ) < cfgDCAz; using GFWTracks = soa::Filtered>; void processData(soa::Filtered>::iterator const& collision, aod::BCsWithTimestamps const&, GFWTracks const& tracks) @@ -1019,7 +1019,7 @@ struct FlowGenericFramework { registry.fill(HIST("eventQA/eventSel"), 1.5); if (cfgRunByRun) th1sList[run][hEventSel]->Fill(1.5); - if (cfgOccupancySelection != -999) { + if (cfgDoOccupancySel) { int occupancy = collision.trackOccupancyInTimeRange(); if (occupancy < 0 || occupancy > cfgOccupancySelection) return; @@ -1083,7 +1083,7 @@ struct FlowGenericFramework { } PROCESS_SWITCH(FlowGenericFramework, processMCReco, "Process analysis for MC reconstructed events", false); - Filter mcCollFilter = nabs(aod::mccollision::posZ) < cfgVtxZ; + o2::framework::expressions::Filter mcCollFilter = nabs(aod::mccollision::posZ) < cfgVtxZ; void processMCGen(soa::Filtered::iterator const& mcCollision, soa::SmallGroups> const& collisions, aod::McParticles const& particles) { if (collisions.size() != 1) @@ -1092,10 +1092,19 @@ struct FlowGenericFramework { for (const auto& collision : collisions) { centrality = collision.centFT0C(); } - processCollision(mcCollision, particles, centrality, 0); + int run = 0; + processCollision(mcCollision, particles, centrality, run); } PROCESS_SWITCH(FlowGenericFramework, processMCGen, "Process analysis for MC generated events", false); + void processOnTheFly(soa::Filtered::iterator const& mcCollision, aod::McParticles const& mcParticles) + { + float centrality = -1; + int run = 0; + processCollision(mcCollision, mcParticles, centrality, run); + } + PROCESS_SWITCH(FlowGenericFramework, processOnTheFly, "Process analysis for MC on-the-fly generated events", false); + void processRun2(soa::Filtered>::iterator const& collision, aod::BCsWithTimestamps const&, GFWTracks const& tracks) { auto bc = collision.bc_as(); From adb14d03c91b327d726e961d0406617e8bcf1ff0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Thu, 15 May 2025 21:57:20 +0200 Subject: [PATCH 1290/1650] [ALICE3] A3TOF: update histograms, streamline (#11205) --- ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx | 181 +++++++++++--------- 1 file changed, 97 insertions(+), 84 deletions(-) diff --git a/ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx b/ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx index 4877a510a86..dfc90b4cf83 100644 --- a/ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx +++ b/ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx @@ -201,18 +201,17 @@ struct OnTheFlyTofPid { const AxisSpec axisTrackLengthInner{static_cast(plotsConfig.nBinsTrackLengthInner), 0.0f, 60.0f, "Track length (cm)"}; const AxisSpec axisTrackLengthOuter{static_cast(plotsConfig.nBinsTrackLengthOuter), 0.0f, 300.0f, "Track length (cm)"}; const AxisSpec axisTrackDeltaLength{static_cast(plotsConfig.nBinsTrackDeltaLength), 0.0f, 30.0f, "Delta Track length (cm)"}; - histos.add("h2dVelocityVsMomentumInner", "h2dVelocityVsMomentumInner", kTH2F, {axisMomentum, axisVelocity}); - histos.add("h2dVelocityVsMomentumOuter", "h2dVelocityVsMomentumOuter", kTH2F, {axisMomentum, axisVelocity}); - histos.add("h2dTrackLengthInnerVsPt", "h2dTrackLengthInnerVsPt", kTH2F, {axisMomentumSmall, axisTrackLengthInner}); - histos.add("h2dTrackLengthOuterVsPt", "h2dTrackLengthOuterVsPt", kTH2F, {axisMomentumSmall, axisTrackLengthOuter}); + histos.add("iTOF/h2dVelocityVsMomentumInner", "h2dVelocityVsMomentumInner", kTH2F, {axisMomentum, axisVelocity}); + histos.add("iTOF/h2dTrackLengthInnerVsPt", "h2dTrackLengthInnerVsPt", kTH2F, {axisMomentumSmall, axisTrackLengthInner}); + histos.add("iTOF/h2dTrackLengthInnerRecoVsPt", "h2dTrackLengthInnerRecoVsPt", kTH2F, {axisMomentumSmall, axisTrackLengthInner}); + histos.add("iTOF/h2dDeltaTrackLengthInnerVsPt", "h2dDeltaTrackLengthInnerVsPt", kTH2F, {axisMomentumSmall, axisTrackDeltaLength}); - histos.add("h2dTrackLengthInnerRecoVsPt", "h2dTrackLengthInnerRecoVsPt", kTH2F, {axisMomentumSmall, axisTrackLengthInner}); - histos.add("h2dTrackLengthOuterRecoVsPt", "h2dTrackLengthOuterRecoVsPt", kTH2F, {axisMomentumSmall, axisTrackLengthOuter}); + histos.add("oTOF/h2dVelocityVsMomentumOuter", "h2dVelocityVsMomentumOuter", kTH2F, {axisMomentum, axisVelocity}); + histos.add("oTOF/h2dTrackLengthOuterVsPt", "h2dTrackLengthOuterVsPt", kTH2F, {axisMomentumSmall, axisTrackLengthOuter}); + histos.add("oTOF/h2dTrackLengthOuterRecoVsPt", "h2dTrackLengthOuterRecoVsPt", kTH2F, {axisMomentumSmall, axisTrackLengthOuter}); + histos.add("oTOF/h2dDeltaTrackLengthOuterVsPt", "h2dDeltaTrackLengthOuterVsPt", kTH2F, {axisMomentumSmall, axisTrackDeltaLength}); - histos.add("h2dDeltaTrackLengthInnerVsPt", "h2dDeltaTrackLengthInnerVsPt", kTH2F, {axisMomentumSmall, axisTrackDeltaLength}); - histos.add("h2dDeltaTrackLengthOuterVsPt", "h2dDeltaTrackLengthOuterVsPt", kTH2F, {axisMomentumSmall, axisTrackDeltaLength}); - - const AxisSpec axisPt{static_cast(plotsConfig.nBinsP), 0.0f, +4.0f, "#it{p_{T}} (GeV/#it{c})"}; + const AxisSpec axisPt{static_cast(plotsConfig.nBinsP), 0.0f, +4.0f, "#it{p}_{T} (GeV/#it{c})"}; const AxisSpec axisEta{static_cast(plotsConfig.nBinsEta), -2.0f, +2.0f, "#eta"}; const AxisSpec axisRelativePt{static_cast(plotsConfig.nBinsRelativeEtaPt), 0.0f, +10.0f, "#it{#sigma_{p_{T}}} / #it{p_{T}} (%)"}; const AxisSpec axisRelativeEta{static_cast(plotsConfig.nBinsRelativeEtaPt), 0.0f, +10.0f, "#it{#sigma_{#eta}} / #it{#eta} (%)"}; @@ -222,39 +221,32 @@ struct OnTheFlyTofPid { std::string particleNames[kParticles] = {"#it{e}", "#it{#mu}", "#it{#pi}", "#it{K}", "#it{p}"}; std::string particleNames2[kParticles] = {"Elec", "Muon", "Pion", "Kaon", "Prot"}; for (int i_true = 0; i_true < kParticles; i_true++) { - std::string nameTitleInnerTrackRes = "h2dInnerTimeResTrack" + particleNames2[i_true] + "VsP"; - std::string nameTitleTotalRes = "h2dInnerTimeResTotal" + particleNames2[i_true] + "VsP"; - std::string nameTitleOuterTrackRes = "h2dOuterTimeResTrack" + particleNames2[i_true] + "VsP"; - std::string nameTitleOuterTotalRes = "h2dOuterTimeResTotal" + particleNames2[i_true] + "VsP"; - const AxisSpec axisTrackTimeRes{static_cast(plotsConfig.nBinsTimeRes), 0.0f, +200.0f, "Track time resolution - " + particleNames[i_true] + " (ps)"}; - const AxisSpec axisTotalTimeRes{static_cast(plotsConfig.nBinsTimeRes), 0.0f, +200.0f, "Total time resolution - " + particleNames[i_true] + " (ps)"}; - h2dInnerTimeResTrack[i_true] = histos.add(nameTitleInnerTrackRes, nameTitleInnerTrackRes.c_str(), kTH2F, {axisMomentum, axisTrackTimeRes}); - h2dInnerTimeResTotal[i_true] = histos.add(nameTitleTotalRes, nameTitleTotalRes.c_str(), kTH2F, {axisMomentum, axisTotalTimeRes}); - h2dOuterTimeResTrack[i_true] = histos.add(nameTitleOuterTrackRes, nameTitleOuterTrackRes.c_str(), kTH2F, {axisMomentum, axisTrackTimeRes}); - h2dOuterTimeResTotal[i_true] = histos.add(nameTitleOuterTotalRes, nameTitleOuterTotalRes.c_str(), kTH2F, {axisMomentum, axisTotalTimeRes}); + auto addHistogram = [&](const std::string& name, const AxisSpec& axis) { + return histos.add(name, "", kTH2F, {axisMomentum, axis}); + }; + + const AxisSpec axisTrackTimeRes{plotsConfig.nBinsTimeRes, 0.0f, +200.0f, "Track time resolution - " + particleNames[i_true] + " (ps)"}; + h2dInnerTimeResTrack[i_true] = addHistogram("iTOF/res/h2dInnerTimeResTrack" + particleNames2[i_true] + "VsP", axisTrackTimeRes); + h2dOuterTimeResTrack[i_true] = addHistogram("oTOF/res/h2dOuterTimeResTrack" + particleNames2[i_true] + "VsP", axisTrackTimeRes); + const AxisSpec axisTotalTimeRes{plotsConfig.nBinsTimeRes, 0.0f, +200.0f, "Total time resolution - " + particleNames[i_true] + " (ps)"}; + h2dInnerTimeResTotal[i_true] = addHistogram("iTOF/res/h2dInnerTimeResTotal" + particleNames2[i_true] + "VsP", axisTotalTimeRes); + h2dOuterTimeResTotal[i_true] = addHistogram("oTOF/res/h2dOuterTimeResTotal" + particleNames2[i_true] + "VsP", axisTotalTimeRes); for (int i_hyp = 0; i_hyp < kParticles; i_hyp++) { std::string nameTitleInner = "h2dInnerNsigmaTrue" + particleNames2[i_true] + "Vs" + particleNames2[i_hyp] + "Hypothesis"; std::string nameTitleOuter = "h2dOuterNsigmaTrue" + particleNames2[i_true] + "Vs" + particleNames2[i_hyp] + "Hypothesis"; std::string nameTitleInnerDelta = "h2dInnerDeltaTrue" + particleNames2[i_true] + "Vs" + particleNames2[i_hyp] + "Hypothesis"; std::string nameTitleOuterDelta = "h2dOuterDeltaTrue" + particleNames2[i_true] + "Vs" + particleNames2[i_hyp] + "Hypothesis"; const AxisSpec axisX{plotsConfig.doSeparationVsPt.value ? axisPt : axisMomentum}; - if (i_true == i_hyp) { - const AxisSpec axisNsigmaCorrect{static_cast(plotsConfig.nBinsNsigmaCorrectSpecies), plotsConfig.minNsigmaRange, plotsConfig.maxNsigmaRange, "N#sigma - True " + particleNames[i_true] + " vs " + particleNames[i_hyp] + " hypothesis"}; - h2dInnerNsigmaTrue[i_true][i_hyp] = histos.add(nameTitleInner, nameTitleInner.c_str(), kTH2F, {axisX, axisNsigmaCorrect}); - h2dOuterNsigmaTrue[i_true][i_hyp] = histos.add(nameTitleOuter, nameTitleOuter.c_str(), kTH2F, {axisX, axisNsigmaCorrect}); - - const AxisSpec axisDeltaCorrect{static_cast(plotsConfig.nBinsDeltaCorrectSpecies), plotsConfig.minDeltaRange, plotsConfig.maxDeltaRange, "#Delta - True " + particleNames[i_true] + " vs " + particleNames[i_hyp] + " hypothesis"}; - h2dInnerDeltaTrue[i_true][i_hyp] = histos.add(nameTitleInnerDelta, nameTitleInnerDelta.c_str(), kTH2F, {axisX, axisDeltaCorrect}); - h2dOuterDeltaTrue[i_true][i_hyp] = histos.add(nameTitleOuterDelta, nameTitleOuterDelta.c_str(), kTH2F, {axisX, axisDeltaCorrect}); - } else { - const AxisSpec axisNsigmaWrong{static_cast(plotsConfig.nBinsNsigmaWrongSpecies), plotsConfig.minNsigmaRange, plotsConfig.maxNsigmaRange, "N#sigma - True " + particleNames[i_true] + " vs " + particleNames[i_hyp] + " hypothesis"}; - h2dInnerNsigmaTrue[i_true][i_hyp] = histos.add(nameTitleInner, nameTitleInner.c_str(), kTH2F, {axisX, axisNsigmaWrong}); - h2dOuterNsigmaTrue[i_true][i_hyp] = histos.add(nameTitleOuter, nameTitleOuter.c_str(), kTH2F, {axisX, axisNsigmaWrong}); - - const AxisSpec axisDeltaWrong{static_cast(plotsConfig.nBinsDeltaWrongSpecies), plotsConfig.minDeltaRange, plotsConfig.maxDeltaRange, "#Delta - True " + particleNames[i_true] + " vs " + particleNames[i_hyp] + " hypothesis"}; - h2dInnerDeltaTrue[i_true][i_hyp] = histos.add(nameTitleInnerDelta, nameTitleInnerDelta.c_str(), kTH2F, {axisX, axisDeltaWrong}); - h2dOuterDeltaTrue[i_true][i_hyp] = histos.add(nameTitleOuterDelta, nameTitleOuterDelta.c_str(), kTH2F, {axisX, axisDeltaWrong}); - } + const AxisSpec axisNsigmaCorrect{plotsConfig.nBinsNsigmaCorrectSpecies, plotsConfig.minNsigmaRange, plotsConfig.maxNsigmaRange, "N#sigma - True " + particleNames[i_true] + " vs " + particleNames[i_hyp] + " hypothesis"}; + const AxisSpec axisDeltaCorrect{plotsConfig.nBinsDeltaCorrectSpecies, plotsConfig.minDeltaRange, plotsConfig.maxDeltaRange, "#Delta - True " + particleNames[i_true] + " vs " + particleNames[i_hyp] + " hypothesis"}; + const AxisSpec axisNsigmaWrong{plotsConfig.nBinsNsigmaWrongSpecies, plotsConfig.minNsigmaRange, plotsConfig.maxNsigmaRange, "N#sigma - True " + particleNames[i_true] + " vs " + particleNames[i_hyp] + " hypothesis"}; + const AxisSpec axisDeltaWrong{plotsConfig.nBinsDeltaWrongSpecies, plotsConfig.minDeltaRange, plotsConfig.maxDeltaRange, "#Delta - True " + particleNames[i_true] + " vs " + particleNames[i_hyp] + " hypothesis"}; + const AxisSpec axisNSigma{i_true == i_hyp ? axisNsigmaCorrect : axisNsigmaWrong}; + const AxisSpec axisDelta{i_true == i_hyp ? axisDeltaCorrect : axisDeltaWrong}; + h2dInnerNsigmaTrue[i_true][i_hyp] = histos.add("iTOF/nsigma/h2dInnerNsigmaTrue" + particleNames2[i_true] + "Vs" + particleNames2[i_hyp] + "Hypothesis", "", kTH2F, {axisX, axisNSigma}); + h2dOuterNsigmaTrue[i_true][i_hyp] = histos.add("oTOF/nsigma/h2dOuterNsigmaTrue" + particleNames2[i_true] + "Vs" + particleNames2[i_hyp] + "Hypothesis", "", kTH2F, {axisX, axisNSigma}); + h2dInnerDeltaTrue[i_true][i_hyp] = histos.add("iTOF/delta/h2dInnerDeltaTrue" + particleNames2[i_true] + "Vs" + particleNames2[i_hyp] + "Hypothesis", "", kTH2F, {axisX, axisDelta}); + h2dOuterDeltaTrue[i_true][i_hyp] = histos.add("oTOF/delta/h2dOuterDeltaTrue" + particleNames2[i_true] + "Vs" + particleNames2[i_hyp] + "Hypothesis", "", kTH2F, {axisX, axisDelta}); } } } @@ -292,7 +284,7 @@ struct OnTheFlyTofPid { /// \param track the input track /// \param radius the radius of the layer you're calculating the length to /// \param magneticField the magnetic field to use when propagating - float trackLength(o2::track::TrackParCov track, float radius, float magneticField) + float computeTrackLength(o2::track::TrackParCov track, float radius, float magneticField) { // don't make use of the track parametrization float length = -100; @@ -302,36 +294,36 @@ struct OnTheFlyTofPid { track.getCircleParams(magneticField, trcCircle, sna, csa); // distance between circle centers (one circle is at origin -> easy) - float centerDistance = std::hypot(trcCircle.xC, trcCircle.yC); + const float centerDistance = std::hypot(trcCircle.xC, trcCircle.yC); // condition of circles touching - if not satisfied returned length will be -100 if (centerDistance < trcCircle.rC + radius && centerDistance > std::fabs(trcCircle.rC - radius)) { length = 0.0f; // base radical direction - float ux = trcCircle.xC / centerDistance; - float uy = trcCircle.yC / centerDistance; + const float ux = trcCircle.xC / centerDistance; + const float uy = trcCircle.yC / centerDistance; // calculate perpendicular vector (normalized) for +/- displacement - float vx = -uy; - float vy = +ux; + const float vx = -uy; + const float vy = +ux; // calculate coordinate for radical line - float radical = (centerDistance * centerDistance - trcCircle.rC * trcCircle.rC + radius * radius) / (2.0f * centerDistance); + const float radical = (centerDistance * centerDistance - trcCircle.rC * trcCircle.rC + radius * radius) / (2.0f * centerDistance); // calculate absolute displacement from center-to-center axis - float displace = (0.5f / centerDistance) * std::sqrt( - (-centerDistance + trcCircle.rC - radius) * - (-centerDistance - trcCircle.rC + radius) * - (-centerDistance + trcCircle.rC + radius) * - (centerDistance + trcCircle.rC + radius)); + const float displace = (0.5f / centerDistance) * std::sqrt( + (-centerDistance + trcCircle.rC - radius) * + (-centerDistance - trcCircle.rC + radius) * + (-centerDistance + trcCircle.rC + radius) * + (centerDistance + trcCircle.rC + radius)); // possible intercept points of track and TOF layer in 2D plane - float point1[2] = {radical * ux + displace * vx, radical * uy + displace * vy}; - float point2[2] = {radical * ux - displace * vx, radical * uy - displace * vy}; + const float point1[2] = {radical * ux + displace * vx, radical * uy + displace * vy}; + const float point2[2] = {radical * ux - displace * vx, radical * uy - displace * vy}; // decide on correct intercept point std::array mom; track.getPxPyPzGlo(mom); - float scalarProduct1 = point1[0] * mom[0] + point1[1] * mom[1]; - float scalarProduct2 = point2[0] * mom[0] + point2[1] * mom[1]; + const float scalarProduct1 = point1[0] * mom[0] + point1[1] * mom[1]; + const float scalarProduct2 = point2[0] * mom[0] + point2[1] * mom[1]; // get start point std::array startPoint; @@ -356,7 +348,7 @@ struct OnTheFlyTofPid { /// returns velocity in centimeters per picoseconds /// \param momentum the momentum of the tarck /// \param mass the mass of the particle - float particleVelocity(float momentum, float mass) + float computeParticleVelocity(float momentum, float mass) { const float a = momentum / mass; // uses light speed in cm/ps so output is in those units @@ -407,7 +399,10 @@ struct OnTheFlyTofPid { } const float mass = pdgInfo->Mass(); const float mass2 = mass * mass; - const float tof = track.mInnerTOFTime.first; // [ps] + const float tof = track.mInnerTOFTime.first; // [ps] + if (tof <= 0) { + continue; + } const float etof = track.mInnerTOFTime.second; // [ps] const float length = track.mTrackLengthInnerTOF.first; // [cm] float p = track.mMomentum.first; // [GeV/c] @@ -427,9 +422,10 @@ struct OnTheFlyTofPid { sumw += w; } - if (sumw <= 0.) { + static constexpr float kMaxEventTimeResolution = 200.f; + if (sumw <= 0. || tracks.size() <= 1 || std::sqrt(1. / sumw) > kMaxEventTimeResolution) { tzero[0] = 0.; // [ps] - tzero[1] = 200.f; // [ps] + tzero[1] = kMaxEventTimeResolution; // [ps] return false; } @@ -446,13 +442,13 @@ struct OnTheFlyTofPid { /// \param mass the mass of the particle /// \param detRadius the radius of the cylindrical layer /// \param magneticField the magnetic field (along Z) - double calculateTrackTimeResolutionAdvanced(float pt, - float eta, - float trackPtResolution, - float trackEtaResolution, - float mass, - float detRadius, - float magneticField) + double calculateTrackTimeResolutionAdvanced(const float pt, + const float eta, + const float trackPtResolution, + const float trackEtaResolution, + const float mass, + const float detRadius, + const float magneticField) { // Compute tracking contribution to timing using the error propagation formula // Uses light speed in m/ps, magnetic field in T (*0.1 for conversion kGauss -> T) @@ -516,27 +512,34 @@ struct OnTheFlyTofPid { for (const auto& track : tracks) { // first step: find precise arrival time (if any) // --- convert track into perfect track - if (!track.has_mcParticle()) // should always be OK but check please + if (!track.has_mcParticle()) { // should always be OK but check please + upgradeTofMC(-999.f, -999.f, -999.f, -999.f); continue; + } else { + LOG(debug) << "Track without mcParticle found!"; + } const auto& mcParticle = track.mcParticle(); o2::track::TrackParCov o2track = convertMCParticleToO2Track(mcParticle); - float xPv = -100, trackLengthInnerTOF = -1, trackLengthOuterTOF = -1; + float xPv = -100.f; static constexpr float kTrkXThreshold = -99.f; // Threshold to consider a good propagation of the track if (o2track.propagateToDCA(mcPvVtx, simConfig.dBz)) { xPv = o2track.getX(); } + float trackLengthInnerTOF = -1, trackLengthOuterTOF = -1; if (xPv > kTrkXThreshold) { - trackLengthInnerTOF = trackLength(o2track, simConfig.innerTOFRadius, simConfig.dBz); - trackLengthOuterTOF = trackLength(o2track, simConfig.outerTOFRadius, simConfig.dBz); + trackLengthInnerTOF = computeTrackLength(o2track, simConfig.innerTOFRadius, simConfig.dBz); + trackLengthOuterTOF = computeTrackLength(o2track, simConfig.outerTOFRadius, simConfig.dBz); } // get mass to calculate velocity auto pdgInfo = pdg->GetParticle(mcParticle.pdgCode()); if (pdgInfo == nullptr) { + LOG(error) << "PDG code " << mcParticle.pdgCode() << " not found in the database"; + upgradeTofMC(-999.f, -999.f, -999.f, -999.f); continue; } - const float v = particleVelocity(o2track.getP(), pdgInfo->Mass()); + const float v = computeParticleVelocity(o2track.getP(), pdgInfo->Mass()); const float expectedTimeInnerTOF = trackLengthInnerTOF / v + eventCollisionTimePS; // arrival time to the Inner TOF in ps const float expectedTimeOuterTOF = trackLengthOuterTOF / v + eventCollisionTimePS; // arrival time to the Outer TOF in ps upgradeTofMC(expectedTimeInnerTOF, trackLengthInnerTOF, expectedTimeOuterTOF, trackLengthOuterTOF); @@ -549,12 +552,13 @@ struct OnTheFlyTofPid { // and the (imperfect!) reconstructed track parametrizations float trackLengthRecoInnerTOF = -1, trackLengthRecoOuterTOF = -1; auto recoTrack = getTrackParCov(track); + xPv = -100.f; if (recoTrack.propagateToDCA(pvVtx, simConfig.dBz)) { xPv = recoTrack.getX(); } if (xPv > kTrkXThreshold) { - trackLengthRecoInnerTOF = trackLength(recoTrack, simConfig.innerTOFRadius, simConfig.dBz); - trackLengthRecoOuterTOF = trackLength(recoTrack, simConfig.outerTOFRadius, simConfig.dBz); + trackLengthRecoInnerTOF = computeTrackLength(recoTrack, simConfig.innerTOFRadius, simConfig.dBz); + trackLengthRecoOuterTOF = computeTrackLength(recoTrack, simConfig.outerTOFRadius, simConfig.dBz); } // cache the track info needed for the event time calculation @@ -576,7 +580,7 @@ struct OnTheFlyTofPid { if (simConfig.considerEventTime.value) { etStatus = eventTime(tracksWithTime, tzero); if (!etStatus) { - LOG(warning) << "Event time calculation failed with " << tracksWithTime.size() << " tracks"; + LOG(warning) << "Event time calculation failed with " << tracksWithTime.size() << " tracks with time and " << dNdEta << " charged particles"; } } @@ -594,8 +598,9 @@ struct OnTheFlyTofPid { // Then we do a second loop to compute the measured quantities with the measured event time int trackWithTimeIndex = 0; for (const auto& track : tracks) { - if (!track.has_mcParticle()) // should always be OK but check please + if (!track.has_mcParticle()) { // should always be OK but check please continue; + } const auto& mcParticle = track.mcParticle(); const auto& trkWithTime = tracksWithTime[trackWithTimeIndex++]; @@ -622,24 +627,28 @@ struct OnTheFlyTofPid { const float innerBeta = (trackLengthInnerTOF / measuredTimeInnerTOF) / o2::constants::physics::LightSpeedCm2PS; const float outerBeta = (trackLengthOuterTOF / measuredTimeOuterTOF) / o2::constants::physics::LightSpeedCm2PS; if (trackLengthRecoInnerTOF > 0) { - histos.fill(HIST("h2dVelocityVsMomentumInner"), momentum, innerBeta); - histos.fill(HIST("h2dTrackLengthInnerVsPt"), noSmearingPt, trackLengthInnerTOF); - histos.fill(HIST("h2dTrackLengthInnerRecoVsPt"), noSmearingPt, trackLengthRecoInnerTOF); + histos.fill(HIST("iTOF/h2dVelocityVsMomentumInner"), momentum, innerBeta); + histos.fill(HIST("iTOF/h2dTrackLengthInnerVsPt"), noSmearingPt, trackLengthInnerTOF); + histos.fill(HIST("iTOF/h2dTrackLengthInnerRecoVsPt"), noSmearingPt, trackLengthRecoInnerTOF); } if (trackLengthRecoOuterTOF > 0) { - histos.fill(HIST("h2dVelocityVsMomentumOuter"), momentum, outerBeta); - histos.fill(HIST("h2dTrackLengthOuterVsPt"), noSmearingPt, trackLengthOuterTOF); - histos.fill(HIST("h2dTrackLengthOuterRecoVsPt"), noSmearingPt, trackLengthRecoOuterTOF); + histos.fill(HIST("oTOF/h2dVelocityVsMomentumOuter"), momentum, outerBeta); + histos.fill(HIST("oTOF/h2dTrackLengthOuterVsPt"), noSmearingPt, trackLengthOuterTOF); + histos.fill(HIST("oTOF/h2dTrackLengthOuterRecoVsPt"), noSmearingPt, trackLengthRecoOuterTOF); } } for (int ii = 0; ii < kParticles; ii++) { + expectedTimeInnerTOF[ii] = -100; + expectedTimeOuterTOF[ii] = -100; + deltaTimeInnerTOF[ii] = -100; + deltaTimeOuterTOF[ii] = -100; nSigmaInnerTOF[ii] = -100; nSigmaOuterTOF[ii] = -100; auto pdgInfoThis = pdg->GetParticle(kParticlePdgs[ii]); masses[ii] = pdgInfoThis->Mass(); - const float v = particleVelocity(momentum, masses[ii]); + const float v = computeParticleVelocity(momentum, masses[ii]); expectedTimeInnerTOF[ii] = trackLengthInnerTOF / v; expectedTimeOuterTOF[ii] = trackLengthOuterTOF / v; @@ -711,13 +720,13 @@ struct OnTheFlyTofPid { } } - float deltaTrackLengthInnerTOF = std::abs(trackLengthInnerTOF - trackLengthRecoInnerTOF); + const float deltaTrackLengthInnerTOF = std::abs(trackLengthInnerTOF - trackLengthRecoInnerTOF); if (trackLengthInnerTOF > 0 && trackLengthRecoInnerTOF > 0) { - histos.fill(HIST("h2dDeltaTrackLengthInnerVsPt"), noSmearingPt, deltaTrackLengthInnerTOF); + histos.fill(HIST("iTOF/h2dDeltaTrackLengthInnerVsPt"), noSmearingPt, deltaTrackLengthInnerTOF); } - float deltaTrackLengthOuterTOF = std::abs(trackLengthOuterTOF - trackLengthRecoOuterTOF); + const float deltaTrackLengthOuterTOF = std::abs(trackLengthOuterTOF - trackLengthRecoOuterTOF); if (trackLengthOuterTOF > 0 && trackLengthRecoOuterTOF > 0) { - histos.fill(HIST("h2dDeltaTrackLengthOuterVsPt"), noSmearingPt, deltaTrackLengthOuterTOF); + histos.fill(HIST("oTOF/h2dDeltaTrackLengthOuterVsPt"), noSmearingPt, deltaTrackLengthOuterTOF); } // Sigmas have been fully calculated. Please populate the NSigma helper table (once per track) @@ -729,6 +738,10 @@ struct OnTheFlyTofPid { upgradeTofExpectedTime(expectedTimeInnerTOF[0], expectedTimeInnerTOF[1], expectedTimeInnerTOF[2], expectedTimeInnerTOF[3], expectedTimeInnerTOF[4], expectedTimeOuterTOF[0], expectedTimeOuterTOF[1], expectedTimeOuterTOF[2], expectedTimeOuterTOF[3], expectedTimeOuterTOF[4]); } + + if (trackWithTimeIndex != tracks.size()) { + LOG(fatal) << "Track with time index " << trackWithTimeIndex << " does not match the number of tracks " << tracks.size(); + } } }; From 236570d96da63b50f38240b016a7917bd4ceabe4 Mon Sep 17 00:00:00 2001 From: omvazque Date: Thu, 15 May 2025 16:26:52 -0500 Subject: [PATCH 1291/1650] [PWGLF] Update ccdb object fetching (#11212) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 130 ++++++++++++++----- 1 file changed, 99 insertions(+), 31 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index 3c539d69cef..78e327cc372 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -96,6 +96,7 @@ struct UccZdc { ConfigurableAxis binsCent{"binsCent", {VARIABLE_WIDTH, 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.}, "T0C binning"}; // Configurables Event Selection + Configurable useTimeStamps{"useTimeStamps", true, "Use time stamps for CCDB object calls"}; Configurable isNoCollInTimeRangeStrict{"isNoCollInTimeRangeStrict", true, "isNoCollInTimeRangeStrict?"}; Configurable isNoCollInTimeRangeStandard{"isNoCollInTimeRangeStandard", false, "isNoCollInTimeRangeStandard?"}; Configurable isNoCollInRofStrict{"isNoCollInRofStrict", true, "isNoCollInRofStrict?"}; @@ -252,7 +253,7 @@ struct UccZdc { registry.add("NchVsFourParCorrVsZN", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);ZNA+ZNC;#LT[#it{p}_{T}^{(4)}]#GT", kTProfile2D, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, -0.5, maxZN}}}); registry.add("RejectedEvtsVsFT0M", ";T0A+T0C (#times 1/100, -3.3 < #eta < -2.1 and 3.5 < #eta < 4.9);Entries;", kTH1F, {{nBinsAmpFT0, 0., 3000.}}); - registry.add("RejectedEvtsVsNch", ";#it{N}_{ch} (|#eta|<0.8);Entries;", kTH1F, {{nBinsNch, minNch, maxNch}}); + registry.add("RejectedEvtsVsNch", ";#it{N}_{ch} (|#eta|<0.8);Entries;", kTH1F, {{300, 0, 3000}}); } // MC Histograms @@ -358,10 +359,8 @@ struct UccZdc { // Enabling object caching, otherwise each call goes to the CCDB server ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); - // Not later than now, will be replaced by the value of the train creation - // This avoids that users can replace objects **while** a train is running - int64_t now = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); - ccdb->setCreatedNotAfter(now); + ccdb->setCreatedNotAfter(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); + ccdb->setFatalWhenNull(false); } template @@ -451,9 +450,7 @@ struct UccZdc { void processQA(o2::aod::ColEvSels::iterator const& collision, o2::aod::BCsRun3 const& /**/, aod::Zdcs const& /**/, aod::FV0As const& /**/, aod::FT0s const& /**/, TheFilteredTracks const& tracks) { const double ePerNucleon{2.68}; - // LOG(info) << " Collisions size: " << collisions.size() << " Table's size: " << collisions.tableSize() << "\n"; const auto& foundBC = collision.foundBC_as(); - // LOG(info) << "Run number: " << foundBC.runNumber() << "\n"; if (!isEventSelected(collision)) { return; } @@ -515,14 +512,14 @@ struct UccZdc { registry.fill(HIST("hEventCounter"), EvCutLabel::Zem); } - // Get Nch-based selection objects from the CCDB - fMeanNch = ccdb->getForTimeStamp(paTHmeanNch.value, foundBC.timestamp()); - fSigmaNch = ccdb->getForTimeStamp(paTHsigmaNch.value, foundBC.timestamp()); - if (fMeanNch == nullptr) { - LOGF(fatal, "Could not load fMeanNch!"); + bool areParsLoaded{false}; + if (useTimeStamps) { + areParsLoaded = loadMeanSigmaNchParams(foundBC.timestamp()); + } else { + areParsLoaded = loadMeanSigmaNchParams(foundBC.runNumber()); } - if (fSigmaNch == nullptr) { - LOGF(fatal, "Could not load fSigmaNch!"); + if (!areParsLoaded) { + return; } float znA{zdc.amplitudeZNA()}; @@ -620,11 +617,6 @@ struct UccZdc { const auto& foundBC = collision.foundBC_as(); // LOGF(info, "Getting object %s for run number %i from timestamp=%llu", paTH.value.data(), foundBC.runNumber(), foundBC.timestamp()); - efficiency = ccdb->getForTimeStamp(paTH.value, foundBC.timestamp()); - if (efficiency == nullptr) { - LOGF(fatal, "Could not load efficiency!"); - } - // has ZDC? if (!foundBC.has_zdc()) { return; @@ -676,14 +668,26 @@ struct UccZdc { registry.fill(HIST("hEventCounter"), EvCutLabel::Zem); } + // Load Efficiency correction + bool isEffLoaded{false}; + if (useTimeStamps) { + isEffLoaded = loadEfficiencyCorrection(foundBC.timestamp()); + } else { + isEffLoaded = loadEfficiencyCorrection(foundBC.runNumber()); + } + if (!isEffLoaded) { + return; + } + // Get Nch-based selection objects from the CCDB - fMeanNch = ccdb->getForTimeStamp(paTHmeanNch.value, foundBC.timestamp()); - fSigmaNch = ccdb->getForTimeStamp(paTHsigmaNch.value, foundBC.timestamp()); - if (fMeanNch == nullptr) { - LOGF(fatal, "Could not load fMeanNch!"); + bool areParsLoaded{false}; + if (useTimeStamps) { + areParsLoaded = loadMeanSigmaNchParams(foundBC.timestamp()); + } else { + areParsLoaded = loadMeanSigmaNchParams(foundBC.runNumber()); } - if (fSigmaNch == nullptr) { - LOGF(fatal, "Could not load fSigmaNch!"); + if (!areParsLoaded) { + return; } std::vector pTs; @@ -783,13 +787,7 @@ struct UccZdc { //----- MC reconstructed -----// for (const auto& collision : collisions) { - // To use run-by-run efficiency const auto& foundBC = collision.foundBC_as(); - auto efficiency = ccdb->getForTimeStamp(paTH.value, foundBC.timestamp()); - // auto efficiency = ccdb->getForRun(paTH.value, foundBC.runNumber()); - if (!efficiency) { - LOGF(fatal, "Efficiency object not found!"); - } // Event selection if (!isEventSelected(collision)) { @@ -800,6 +798,17 @@ struct UccZdc { continue; } + // Load Efficiency correction + bool isEffLoaded{false}; + if (useTimeStamps) { + isEffLoaded = loadEfficiencyCorrection(foundBC.timestamp()); + } else { + isEffLoaded = loadEfficiencyCorrection(foundBC.runNumber()); + } + if (!isEffLoaded) { + return; + } + registry.fill(HIST("T0Ccent"), collision.centFT0C()); registry.fill(HIST("zPos"), collision.posZ()); @@ -1024,6 +1033,65 @@ struct UccZdc { return false; } } + + template + bool loadMeanSigmaNchParams(const T& parameter) + { + fMeanNch = nullptr; + fSigmaNch = nullptr; + // Get Nch-based selection objects from the CCDB + if (useTimeStamps) { + fMeanNch = ccdb->getForTimeStamp(paTHmeanNch.value, parameter); + fSigmaNch = ccdb->getForTimeStamp(paTHsigmaNch.value, parameter); + } else { + fMeanNch = ccdb->getForRun(paTHmeanNch.value, parameter); + fSigmaNch = ccdb->getForRun(paTHsigmaNch.value, parameter); + // auto efficiency = ccdb->getForRun(paTH.value, foundBC.runNumber()); + } + if (!fMeanNch) { + LOGF(fatal, "Could not load fMeanNch from %s", paTHmeanNch.value.c_str()); + return false; + } + if (!fSigmaNch) { + LOGF(fatal, "Could not load fSigmaNch from %s", paTHsigmaNch.value.c_str()); + return false; + } + // if (fMeanNch) { + // LOGF(info, "Loaded fMeanNch from %s (%p)", paTHmeanNch.value.c_str(), (void*)fMeanNch); + // } + // if (fSigmaNch) { + // LOGF(info, "Loaded fSigmaNch from %s (%p)", paTHsigmaNch.value.c_str(), (void*)fSigmaNch); + // } + if (!fMeanNch || !fSigmaNch) { + return false; + } else { + return true; + } + } + + template + bool loadEfficiencyCorrection(const T& parameter) + { + efficiency = nullptr; + // Get Nch-based selection objects from the CCDB + if (useTimeStamps) { + efficiency = ccdb->getForTimeStamp(paTH.value, parameter); + } else { + efficiency = ccdb->getForRun(paTH.value, parameter); + } + if (!efficiency) { + LOGF(fatal, "Could not load efficiency from %s", paTH.value.c_str()); + return false; + } + // if (efficiency) { + // LOGF(info, "Loaded efficiency from %s (%p)", paTH.value.c_str(), (void*)efficiency); + // } + if (!efficiency) { + return false; + } else { + return true; + } + } }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 964bdf5474796af798e87a34496753483b6ba843 Mon Sep 17 00:00:00 2001 From: Stefano Cannito <143754257+scannito@users.noreply.github.com> Date: Fri, 16 May 2025 02:24:28 +0200 Subject: [PATCH 1292/1650] [PWGLF] Fixed bug in track partitioning and bin number for phik0shortanalysis.cxx (#11215) --- .../Tasks/Strangeness/phik0shortanalysis.cxx | 47 ++++++++++--------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx index 747a9ab1009..2bd9467879b 100644 --- a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx @@ -208,7 +208,9 @@ struct Phik0shortanalysis { // Defining the type of the tracks for data and MC using FullTracks = soa::Join; + using FilteredTracks = soa::Filtered; using FullMCTracks = soa::Join; + using FilteredMCTracks = soa::Filtered; using V0DauTracks = soa::Join; using V0DauMCTracks = soa::Join; @@ -221,6 +223,9 @@ struct Phik0shortanalysis { Partition posTracks = aod::track::signed1Pt > trackConfigs.cfgCutCharge; Partition negTracks = aod::track::signed1Pt < trackConfigs.cfgCutCharge; + Partition posFiltTracks = aod::track::signed1Pt > trackConfigs.cfgCutCharge; + Partition negFiltTracks = aod::track::signed1Pt < trackConfigs.cfgCutCharge; + Partition posMCTracks = aod::track::signed1Pt > trackConfigs.cfgCutCharge; Partition negMCTracks = aod::track::signed1Pt < trackConfigs.cfgCutCharge; @@ -315,13 +320,13 @@ struct Phik0shortanalysis { // Phi invariant mass for computing purities and normalisation dataPhiHist.add("h3PhipurData", "Invariant mass of Phi for Purity (no K0S/Pi) in Data", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); - dataPhiHist.add("h4PhipurK0SData", "Invariant mass of Phi for Purity (K0S) in Data", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); + dataPhiHist.add("h4PhipurK0SData", "Invariant mass of Phi for Purity (K0S) in Data", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size() + 1), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); dataPhiHist.get(HIST("h4PhipurK0SData"))->GetAxis(0)->SetBinLabel(1, "Inclusive"); for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { dataPhiHist.get(HIST("h4PhipurK0SData"))->GetAxis(0)->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); } - dataPhiHist.add("h4PhipurPiData", "Invariant mass of Phi for Purity (Pi) in Data", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); + dataPhiHist.add("h4PhipurPiData", "Invariant mass of Phi for Purity (Pi) in Data", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size() + 1), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); dataPhiHist.get(HIST("h4PhipurPiData"))->GetAxis(0)->SetBinLabel(1, "Inclusive"); for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { dataPhiHist.get(HIST("h4PhipurPiData"))->GetAxis(0)->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); @@ -336,13 +341,13 @@ struct Phik0shortanalysis { // MCPhi invariant mass for computing purities closureMCPhiHist.add("h3PhipurMCClosure", "Invariant mass of Phi for Purity (no K0S/Pi)", kTH3F, {binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); - closureMCPhiHist.add("h4PhipurK0SMCClosure", "Invariant mass of Phi for Purity (K0S) in MCClosure", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); + closureMCPhiHist.add("h4PhipurK0SMCClosure", "Invariant mass of Phi for Purity (K0S) in MCClosure", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size() + 1), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); closureMCPhiHist.get(HIST("h4PhipurK0SMCClosure"))->GetAxis(0)->SetBinLabel(1, "Inclusive"); for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { closureMCPhiHist.get(HIST("h4PhipurK0SMCClosure"))->GetAxis(0)->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); } - closureMCPhiHist.add("h4PhipurPiMCClosure", "Invariant mass of Phi for Purity (Pi) in MCClosure", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); + closureMCPhiHist.add("h4PhipurPiMCClosure", "Invariant mass of Phi for Purity (Pi) in MCClosure", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size() + 1), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedpTPhiAxis, massPhiAxis}); closureMCPhiHist.get(HIST("h4PhipurPiMCClosure"))->GetAxis(0)->SetBinLabel(1, "Inclusive"); for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { closureMCPhiHist.get(HIST("h4PhipurPiMCClosure"))->GetAxis(0)->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); @@ -355,7 +360,7 @@ struct Phik0shortanalysis { dataK0SHist.add("hNSigmaNegPionFromK0S", "hNSigmaNegPionFromK0Short", kTH2F, {{100, 0.0, 5.0, "#it{p} (GeV/#it{c})"}, {100, -10.0f, 10.0f}}); // 2D mass of Phi and K0S for Data - dataPhiK0SHist.add("h5PhiK0SData", "2D Invariant mass of Phi and K0Short for Data", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptK0SAxis, massK0SAxis, sigmassPhiAxis}); + dataPhiK0SHist.add("h5PhiK0SData", "2D Invariant mass of Phi and K0Short for Data", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size() + 1), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptK0SAxis, massK0SAxis, sigmassPhiAxis}); dataPhiK0SHist.get(HIST("h5PhiK0SData"))->GetAxis(0)->SetBinLabel(1, "Inclusive"); for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { dataPhiK0SHist.get(HIST("h5PhiK0SData"))->GetAxis(0)->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); @@ -370,27 +375,27 @@ struct Phik0shortanalysis { dataK0SHist.add("h3K0SRapidityData", "K0Short rapidity for Data", kTH3F, {binnedmultAxis, binnedptK0SAxis, yAxis}); // RecMC K0S coupled to Phi - mcPhiK0SHist.add("h4PhiK0SMCReco", "K0S coupled to Phi in MCReco", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptK0SAxis, massK0SAxis}); + mcPhiK0SHist.add("h4PhiK0SMCReco", "K0S coupled to Phi in MCReco", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size() + 1), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptK0SAxis, massK0SAxis}); mcPhiK0SHist.get(HIST("h4PhiK0SMCReco"))->GetAxis(0)->SetBinLabel(1, "Inclusive"); for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { mcPhiK0SHist.get(HIST("h4PhiK0SMCReco"))->GetAxis(0)->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); } // GenMC K0S coupled to Phi - mcPhiK0SHist.add("h3PhiK0SMCGen", "K0S coupled toPhi in MCGen", kTH3F, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptK0SAxis}); + mcPhiK0SHist.add("h3PhiK0SMCGen", "K0S coupled toPhi in MCGen", kTH3F, {{static_cast(cfgDeltaYAcceptanceBins->size() + 1), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptK0SAxis}); mcPhiK0SHist.get(HIST("h3PhiK0SMCGen"))->GetXaxis()->SetBinLabel(1, "Inclusive"); for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { mcPhiK0SHist.get(HIST("h3PhiK0SMCGen"))->GetXaxis()->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); } - mcPhiK0SHist.add("h3PhiK0SMCGenAssocReco", "K0S coupled toPhi in MCGen Associated MCReco Collision", kTH3F, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptK0SAxis}); + mcPhiK0SHist.add("h3PhiK0SMCGenAssocReco", "K0S coupled toPhi in MCGen Associated MCReco Collision", kTH3F, {{static_cast(cfgDeltaYAcceptanceBins->size() + 1), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptK0SAxis}); mcPhiK0SHist.get(HIST("h3PhiK0SMCGenAssocReco"))->GetXaxis()->SetBinLabel(1, "Inclusive"); for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { mcPhiK0SHist.get(HIST("h3PhiK0SMCGenAssocReco"))->GetXaxis()->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); } // 2D mass of Phi and K0S for Closure Test - closureMCPhiK0SHist.add("h5PhiK0SMCClosure", "2D Invariant mass of Phi and K0Short for MC Closure Test", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptK0SAxis, massK0SAxis, sigmassPhiAxis}); + closureMCPhiK0SHist.add("h5PhiK0SMCClosure", "2D Invariant mass of Phi and K0Short for MC Closure Test", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size() + 1), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptK0SAxis, massK0SAxis, sigmassPhiAxis}); closureMCPhiK0SHist.get(HIST("h5PhiK0SMCClosure"))->GetAxis(0)->SetBinLabel(1, "Inclusive"); for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { closureMCPhiK0SHist.get(HIST("h5PhiK0SMCClosure"))->GetAxis(0)->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); @@ -402,7 +407,7 @@ struct Phik0shortanalysis { closureMCPhiK0SHist.add("h3ClosureMCPhiK0SSESCutNew", "Invariant mass of K0Short for Deltay < SecondCut for Closure Test", kTH3F, {binnedmultAxis, binnedptK0SAxis, massK0SAxis}); // Phi mass vs Pion NSigma dE/dx for Data - dataPhiPionHist.add("h6PhiPiData", "Phi Invariant mass vs Pion nSigma TPC/TOF for Data", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); + dataPhiPionHist.add("h6PhiPiData", "Phi Invariant mass vs Pion nSigma TPC/TOF for Data", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size() + 1), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); dataPhiPionHist.get(HIST("h6PhiPiData"))->GetAxis(0)->SetBinLabel(1, "Inclusive"); for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { dataPhiPionHist.get(HIST("h6PhiPiData"))->GetAxis(0)->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); @@ -434,33 +439,33 @@ struct Phik0shortanalysis { mcPionHist.add("h3RecMCDCAxySecMaterialPi", "Dcaxy distribution vs pt for Secondary Pions from Material", kTH2F, {binnedptPiAxis, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); // RecMC Pion coupled to Phi with TPC - mcPhiPionHist.add("h4PhiPiTPCMCReco", "Pion coupled to Phi in MCReco (TPC)", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}}); + mcPhiPionHist.add("h4PhiPiTPCMCReco", "Pion coupled to Phi in MCReco (TPC)", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size() + 1), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}}); mcPhiPionHist.get(HIST("h4PhiPiTPCMCReco"))->GetAxis(0)->SetBinLabel(1, "Inclusive"); for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { mcPhiPionHist.get(HIST("h4PhiPiTPCMCReco"))->GetAxis(0)->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); } // RecMC Pion coupled to Phi with TPC and TOF - mcPhiPionHist.add("h5PhiPiTPCTOFMCReco", "Pion coupled to Phi in MCReco (TPC and TOF)", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}}); + mcPhiPionHist.add("h5PhiPiTPCTOFMCReco", "Pion coupled to Phi in MCReco (TPC and TOF)", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size() + 1), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}}); mcPhiPionHist.get(HIST("h5PhiPiTPCTOFMCReco"))->GetAxis(0)->SetBinLabel(1, "Inclusive"); for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { mcPhiPionHist.get(HIST("h5PhiPiTPCTOFMCReco"))->GetAxis(0)->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); } - mcPhiPionHist.add("h3PhiPiMCGen", "Pion coupled to Phi in MCGen", kTH3F, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptPiAxis}); + mcPhiPionHist.add("h3PhiPiMCGen", "Pion coupled to Phi in MCGen", kTH3F, {{static_cast(cfgDeltaYAcceptanceBins->size() + 1), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptPiAxis}); mcPhiPionHist.get(HIST("h3PhiPiMCGen"))->GetXaxis()->SetBinLabel(1, "Inclusive"); for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { mcPhiPionHist.get(HIST("h3PhiPiMCGen"))->GetXaxis()->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); } - mcPhiPionHist.add("h3PhiPiMCGenAssocReco", "Pion coupled to Phi in MCGen Associated Reco Collision", kTH3F, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptPiAxis}); + mcPhiPionHist.add("h3PhiPiMCGenAssocReco", "Pion coupled to Phi in MCGen Associated Reco Collision", kTH3F, {{static_cast(cfgDeltaYAcceptanceBins->size() + 1), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptPiAxis}); mcPhiPionHist.get(HIST("h3PhiPiMCGenAssocReco"))->GetXaxis()->SetBinLabel(1, "Inclusive"); for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { mcPhiPionHist.get(HIST("h3PhiPiMCGenAssocReco"))->GetXaxis()->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); } // Phi mass vs Pion NSigma dE/dx for Closure Test - closureMCPhiPionHist.add("h6PhiPiMCClosure", "Phi Invariant mass vs Pion nSigma TPC/TOF for MC Closure Test", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size()), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); + closureMCPhiPionHist.add("h6PhiPiMCClosure", "Phi Invariant mass vs Pion nSigma TPC/TOF for MC Closure Test", kTHnSparseF, {{static_cast(cfgDeltaYAcceptanceBins->size() + 1), -0.5f, static_cast(cfgDeltaYAcceptanceBins->size() + 1.0f - 0.5f)}, binnedmultAxis, binnedptPiAxis, {100, -10.0f, 10.0f}, {100, -10.0f, 10.0f}, sigmassPhiAxis}); closureMCPhiPionHist.get(HIST("h6PhiPiMCClosure"))->GetAxis(0)->SetBinLabel(1, "Inclusive"); for (size_t i = 0; i < cfgDeltaYAcceptanceBins->size(); i++) { closureMCPhiPionHist.get(HIST("h6PhiPiMCClosure"))->GetAxis(0)->SetBinLabel(i + 2, Form("|Delta#it{y}| < %.1f", cfgDeltaYAcceptanceBins->at(i))); @@ -2259,14 +2264,14 @@ struct Phik0shortanalysis { PROCESS_SWITCH(Phik0shortanalysis, processPhiPionMCGen, "Process function for Phi-Pion Correlations Efficiency correction in MCGen", false); - void processdNdetaWPhiData(SelCollisions::iterator const& collision, soa::Filtered const& fullTracks) + void processdNdetaWPhiData(SelCollisions::iterator const& collision, FilteredTracks const& filteredTracks) { // Check if the event selection is passed if (!acceptEventQA(collision, true)) return; - auto posThisColl = posTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - auto negThisColl = negTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + auto posThisColl = posFiltTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + auto negThisColl = negFiltTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); // Check if the event contains a phi candidate if (!eventHasPhi(posThisColl, negThisColl)) @@ -2274,13 +2279,13 @@ struct Phik0shortanalysis { float multiplicity = collision.centFT0M(); - for (const auto& track : fullTracks) + for (const auto& track : filteredTracks) dataEventHist.fill(HIST("h2EtaDistribution"), multiplicity, track.eta()); } PROCESS_SWITCH(Phik0shortanalysis, processdNdetaWPhiData, "Process function for dN/deta values in Data", false); - void processdNdetaWPhiMCReco(SimCollisions const& collisions, soa::Filtered const& fullMCTracks, MCCollisions const&, aod::McParticles const& mcParticles) + void processdNdetaWPhiMCReco(SimCollisions const& collisions, FilteredMCTracks const& filteredMCTracks, MCCollisions const&, aod::McParticles const& mcParticles) { for (const auto& collision : collisions) { if (!acceptEventQA(collision, true)) @@ -2296,7 +2301,7 @@ struct Phik0shortanalysis { float genmultiplicity = mcCollision.centFT0M(); - auto mcTracksThisColl = fullMCTracks.sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + auto mcTracksThisColl = filteredMCTracks.sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); for (const auto& track : mcTracksThisColl) { if (!track.has_mcParticle()) From 409cb97094a3febd5228945d2a0a43c7584e320f Mon Sep 17 00:00:00 2001 From: abmodak <67369858+abmodak@users.noreply.github.com> Date: Fri, 16 May 2025 07:54:13 +0200 Subject: [PATCH 1293/1650] [PWGLF] Add processGen function to have MC gen level info (#11218) --- .../heavyionMultiplicity.cxx | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/PWGLF/Tasks/GlobalEventProperties/heavyionMultiplicity.cxx b/PWGLF/Tasks/GlobalEventProperties/heavyionMultiplicity.cxx index 120c6b760ef..dfd24dddafb 100644 --- a/PWGLF/Tasks/GlobalEventProperties/heavyionMultiplicity.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/heavyionMultiplicity.cxx @@ -147,6 +147,7 @@ struct HeavyionMultiplicity { ConfigurableAxis ptHistBin{"ptHistBin", {200, 0., 20.}, ""}; ConfigurableAxis centralityBinning{"centralityBinning", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100}, ""}; ConfigurableAxis occupancyBin{"occupancyBin", {VARIABLE_WIDTH, 0, 500, 1000, 2000, 5000, 10000}, ""}; + ConfigurableAxis centBinGen{"centBinGen", {VARIABLE_WIDTH, 0, 500, 1000, 2000, 5000, 10000}, ""}; Configurable isApplySameBunchPileup{"isApplySameBunchPileup", true, "Enable SameBunchPileup cut"}; Configurable isApplyGoodZvtxFT0vsPV{"isApplyGoodZvtxFT0vsPV", true, "Enable GoodZvtxFT0vsPV cut"}; @@ -174,6 +175,7 @@ struct HeavyionMultiplicity { AxisSpec centAxis = {centralityBinning, "Centrality", "CentralityAxis"}; AxisSpec axisPt = {ptHistBin, "pT", "pTAxis"}; AxisSpec axisOccupancy = {occupancyBin, "occupancy", "OccupancyAxis"}; + AxisSpec axisCentBinGen = {centBinGen, "GenCentrality", "CentGenAxis"}; histos.add("EventHist", "EventHist", kTH1D, {axisEvent}, false); histos.add("VtxZHist", "VtxZHist", kTH1D, {axisVtxZ}, false); @@ -252,6 +254,18 @@ struct HeavyionMultiplicity { histos.add("hmcrecdndetapp", "hmcrecdndetapp", kTHnSparseD, {axisVtxZ, centAxis, axisEta, axisPhi, axisSpecies, axisTrackType}, false); histos.add("hmcgendndetapp", "hmcgendndetapp", kTHnSparseD, {axisVtxZ, centAxis, axisEta, axisPhi, axisSpecies, axisGenPtVary}, false); } + + if (doprocessGen) { + histos.add("MultBarrelEta10_vs_FT0A", "MultBarrelEta10_vs_FT0A", kTH2F, {axisMult, axisFt0aMult}, true); + histos.add("MultBarrelEta10_vs_FT0C", "MultBarrelEta10_vs_FT0C", kTH2F, {axisMult, axisFt0cMult}, true); + histos.add("MultBarrelEta10", "MultBarrelEta10", kTH1F, {axisMult}, true); + histos.add("MultFT0A", "MultFT0A", kTH1F, {axisFt0aMult}, true); + histos.add("MultFT0C", "MultFT0C", kTH1F, {axisFt0cMult}, true); + histos.add("dndeta10_vs_FT0C", "dndeta10_vs_FT0C", kTH2F, {axisEta, axisCentBinGen}, true); + histos.add("dndeta10_vs_FT0A", "dndeta10_vs_FT0A", kTH2F, {axisEta, axisCentBinGen}, true); + histos.add("mult10_vs_FT0C", "mult10_vs_FT0C", kTH2F, {axisMult, axisCentBinGen}, true); + histos.add("mult10_vs_FT0A", "mult10_vs_FT0A", kTH2F, {axisMult, axisCentBinGen}, true); + } } template @@ -791,6 +805,26 @@ struct HeavyionMultiplicity { } // collision loop } PROCESS_SWITCH(HeavyionMultiplicity, processppMonteCarlo, "process pp MC", false); + + void processGen(soa::Join::iterator const& mccols, aod::McParticles const& GenParticles) + { + histos.fill(HIST("MultBarrelEta10_vs_FT0A"), mccols.multMCNParticlesEta10(), mccols.multMCFT0A()); + histos.fill(HIST("MultBarrelEta10_vs_FT0C"), mccols.multMCNParticlesEta10(), mccols.multMCFT0C()); + histos.fill(HIST("MultBarrelEta10"), mccols.multMCNParticlesEta10()); + histos.fill(HIST("MultFT0A"), mccols.multMCFT0A()); + histos.fill(HIST("MultFT0C"), mccols.multMCFT0C()); + histos.fill(HIST("mult10_vs_FT0A"), mccols.multMCNParticlesEta10(), mccols.multMCFT0A()); + histos.fill(HIST("mult10_vs_FT0C"), mccols.multMCNParticlesEta10(), mccols.multMCFT0C()); + + for (const auto& particle : GenParticles) { + if (!isGenTrackSelected(particle)) { + continue; + } + histos.fill(HIST("dndeta10_vs_FT0A"), particle.eta(), mccols.multMCFT0A()); + histos.fill(HIST("dndeta10_vs_FT0C"), particle.eta(), mccols.multMCFT0C()); + } + } + PROCESS_SWITCH(HeavyionMultiplicity, processGen, "process pure MC gen", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From fd11ca785bc1283d7edbe33c682c72825bbb6feb Mon Sep 17 00:00:00 2001 From: Nicolas Strangmann <77485327+nstrangm@users.noreply.github.com> Date: Fri, 16 May 2025 07:57:45 +0200 Subject: [PATCH 1294/1650] [PWGEM/PhotonMeson] Add task for on-the-fly MC generator studies (#11217) Co-authored-by: Nicolas Strangmann --- PWGEM/PhotonMeson/Tasks/CMakeLists.txt | 5 ++ .../PhotonMeson/Tasks/mcGeneratorStudies.cxx | 48 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 PWGEM/PhotonMeson/Tasks/mcGeneratorStudies.cxx diff --git a/PWGEM/PhotonMeson/Tasks/CMakeLists.txt b/PWGEM/PhotonMeson/Tasks/CMakeLists.txt index 975a217fab7..6483af43f4c 100644 --- a/PWGEM/PhotonMeson/Tasks/CMakeLists.txt +++ b/PWGEM/PhotonMeson/Tasks/CMakeLists.txt @@ -29,6 +29,11 @@ o2physics_add_dpl_workflow(emc-bc-wise-pi0 PUBLIC_LINK_LIBRARIES O2::Framework O2::EMCALBase O2::EMCALCalib O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(mc-generator-studies + SOURCES mcGeneratorStudies.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(pcm-qc SOURCES pcmQC.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2::DetectorsBase O2Physics::AnalysisCore O2Physics::PWGEMPhotonMesonCore diff --git a/PWGEM/PhotonMeson/Tasks/mcGeneratorStudies.cxx b/PWGEM/PhotonMeson/Tasks/mcGeneratorStudies.cxx new file mode 100644 index 00000000000..2ff74efa6c3 --- /dev/null +++ b/PWGEM/PhotonMeson/Tasks/mcGeneratorStudies.cxx @@ -0,0 +1,48 @@ +// Copyright 2019-2024 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// +/// \file mcGeneratorStudies.cxx +/// +/// \brief Task that produces the generated pT spectrum of a given particle for MC studies based on on the fly MC simulations +/// +/// \author Nicolas Strangmann (nicolas.strangmann@cern.ch) - Goethe University Frankfurt +/// + +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/ASoA.h" +#include "Framework/HistogramRegistry.h" + +#include "TDatabasePDG.h" + +using namespace o2; +using namespace o2::framework; + +struct MCGeneratorStudies { + HistogramRegistry mHistManager{"MCGeneratorStudyHistograms"}; + Configurable cfgSelectedParticleCode{"cfgSelectedParticleCode", 111, "PDG code of the particle to be investigated"}; + Configurable cfgMaxZVertex{"cfgMaxZVertex", 10, "Maximum absolute z-vertex distance (cm)"}; + expressions::Filter zVertexFilter = aod::mccollision::posZ < cfgMaxZVertex && aod::mccollision::posZ > -cfgMaxZVertex; + + void init(InitContext const&) { mHistManager.add("YieldVsNParticles", "pT of selected particles in all MC collisions vs number of all generated particles in event;#bf{#it{p}_{T} (GeV/#it{c})};#bf{#it{N} (Multiplicity)};#bf{#it{N}}", HistType::kTH2F, {{200, 0, 20}, {1000, 0, 10000}}); } + + void process(soa::Filtered::iterator const&, aod::McParticles const& mcParticles) + { + int nParticles = mcParticles.size(); + for (auto& mcParticle : mcParticles) { + if (mcParticle.pdgCode() == cfgSelectedParticleCode && std::abs(mcParticle.y()) < 0.8f) + mHistManager.fill(HIST("YieldVsNParticles"), mcParticle.pt(), nParticles); + } + } +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc, TaskName{"mc-generator-studies"})}; } From 2db20496d78ff8d4d2843a01ee08feebfc4153e6 Mon Sep 17 00:00:00 2001 From: alcaliva <32872606+alcaliva@users.noreply.github.com> Date: Fri, 16 May 2025 08:19:54 +0200 Subject: [PATCH 1295/1650] [PWGLF] Temporarily disabling histograms for pi,k,p (#11214) --- PWGLF/Tasks/Strangeness/strangenessInJets.cxx | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/strangenessInJets.cxx b/PWGLF/Tasks/Strangeness/strangenessInJets.cxx index f5878bb17ad..b7e65345661 100644 --- a/PWGLF/Tasks/Strangeness/strangenessInJets.cxx +++ b/PWGLF/Tasks/Strangeness/strangenessInJets.cxx @@ -15,7 +15,6 @@ /// \author Alberto Caliva (alberto.caliva@cern.ch), Francesca Ercolessi (francesca.ercolessi@cern.ch), Nicolò Jacazio (nicolo.jacazio@cern.ch) /// \since May 22, 2024 -#include #include #include #include @@ -1681,6 +1680,7 @@ struct StrangenessInJets { } } + /* // Reconstructed Tracks for (const auto& track : tracksPerColl) { @@ -1788,7 +1788,7 @@ struct StrangenessInJets { registryMC.fill(HIST("pi_minus_rec_in_ue_tof"), multiplicity, track.pt(), wPiminusUe); } } - + */ for (const auto& mcParticle : mcParticlesPerColl) { if (mcParticle.eta() < etaMin || mcParticle.eta() > etaMax) @@ -1796,14 +1796,17 @@ struct StrangenessInJets { if (!mcParticle.isPhysicalPrimary()) continue; + /* double wPiplusJet(1.0), wPiplusUe(1.0); double wPiminusJet(1.0), wPiminusUe(1.0); double wKaplusJet(1.0), wKaplusUe(1.0); double wKaminusJet(1.0), wKaminusUe(1.0); double wPrplusJet(1.0), wPrplusUe(1.0); double wPrminusJet(1.0), wPrminusUe(1.0); + */ double wK0jet(1.0), wK0Ue(1.0), wLambdaJet(1.0), wLambdaUe(1.0), wAntilambdaJet(1.0), wAntilambdaUe(1.0); if (applyReweighting) { + /* auto getWeight = [&](TH2F* histo) { if (!histo) { return 1.0; @@ -1822,7 +1825,7 @@ struct StrangenessInJets { wPiplusUe = getWeight(twodWeightsPiplusUe); wPiminusJet = getWeight(twodWeightsPiminusJet); wPiminusUe = getWeight(twodWeightsPiminusUe); - + */ int ix = twodWeightsK0Jet->GetXaxis()->FindBin(mcParticle.pt()); int iy = twodWeightsK0Jet->GetYaxis()->FindBin(mcParticle.eta()); wK0jet = twodWeightsK0Jet->GetBinContent(ix, iy); @@ -1852,6 +1855,7 @@ struct StrangenessInJets { } switch (mcParticle.pdgCode()) { + /* case kPiPlus: // Pi+ registryMC.fill(HIST("mc_pi_plus/in_jet/gen"), multiplicity, mcParticle.pt(), wPiplusJet); registryMC.fill(HIST("mc_pi_plus/in_ue/gen"), multiplicity, mcParticle.pt(), wPiplusUe); @@ -1882,6 +1886,7 @@ struct StrangenessInJets { registryMC.fill(HIST("mc_pr_minus/in_ue/gen"), multiplicity, mcParticle.pt(), wPrminusUe); registryMC.fill(HIST("pr_minus_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); break; + */ case kK0Short: // K0s registryMC.fill(HIST("K0s_generated_jet"), multiplicity, mcParticle.pt(), wK0jet); registryMC.fill(HIST("K0s_generated_ue"), multiplicity, mcParticle.pt(), wK0Ue); @@ -2015,12 +2020,14 @@ struct StrangenessInJets { // In jet if (deltaRjet < rJet) { switch (particle.pdgCode()) { + /* case kPiPlus: registryMC.fill(HIST("pi_plus_eta_pt_jet"), particle.pt(), particle.eta()); break; case kPiMinus: registryMC.fill(HIST("pi_minus_eta_pt_jet"), particle.pt(), particle.eta()); break; + */ case kK0Short: registryMC.fill(HIST("K0s_eta_pt_jet"), particle.pt(), particle.eta()); break; @@ -2049,12 +2056,14 @@ struct StrangenessInJets { if (deltaRue1 < rJet || deltaRue2 < rJet) { switch (particle.pdgCode()) { + /* case kPiPlus: registryMC.fill(HIST("pi_plus_eta_pt_ue"), particle.pt(), particle.eta()); break; case kPiMinus: registryMC.fill(HIST("pi_minus_eta_pt_ue"), particle.pt(), particle.eta()); break; + */ case kK0Short: registryMC.fill(HIST("K0s_eta_pt_ue"), particle.pt(), particle.eta()); break; From e1e985d0e2d21bc53e99a92fed0776c99720152f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Fri, 16 May 2025 09:56:35 +0200 Subject: [PATCH 1296/1650] [PWGHF,PWGCF] Split same-event table and add the collision infos into lcp femto task (#11191) Co-authored-by: ALICE Action Bot --- PWGCF/DataModel/FemtoDerived.h | 41 +++++-- .../HFC/TableProducer/femtoDreamProducer.cxx | 54 ++++---- .../HFC/Tasks/taskCharmHadronsFemtoDream.cxx | 115 +++++------------- 3 files changed, 86 insertions(+), 124 deletions(-) diff --git a/PWGCF/DataModel/FemtoDerived.h b/PWGCF/DataModel/FemtoDerived.h index 705b134525e..046d4c0a94f 100644 --- a/PWGCF/DataModel/FemtoDerived.h +++ b/PWGCF/DataModel/FemtoDerived.h @@ -210,7 +210,9 @@ enum CharmHadronMassHypo { lcToPKPi = 1, lcToPiKP = 2 }; - +DECLARE_SOA_COLUMN(GIndexCol, gIndexCol, int); //! Global index for the collision +DECLARE_SOA_COLUMN(TimeStamp, timeStamp, int64_t); //! Timestamp for the collision +DECLARE_SOA_COLUMN(VertexZ, vertexZ, float); //! VertexZ for the collision DECLARE_SOA_COLUMN(TrackId, trackId, int); //! track id to match associate particle with charm hadron prongs DECLARE_SOA_COLUMN(Charge, charge, int8_t); //! Charge of charm hadron DECLARE_SOA_COLUMN(Prong0Id, prong0Id, int); //! Track id of charm hadron prong0 @@ -233,12 +235,16 @@ DECLARE_SOA_COLUMN(FlagMc, flagMc, int8_t); //! To selec DECLARE_SOA_COLUMN(OriginMcRec, originMcRec, int8_t); //! flag for reconstruction level matching (1 for prompt, 2 for non-prompt) DECLARE_SOA_COLUMN(OriginMcGen, originMcGen, int8_t); //! flag for generator level matching (1 for prompt, 2 for non-prompt) DECLARE_SOA_COLUMN(IsCandidateSwapped, isCandidateSwapped, int8_t); //! swapping of the prongs order (0 for Lc -> pkpi, 1 for Lc -> pikp) -DECLARE_SOA_COLUMN(PtAssoc, ptAssoc, float); //! Transverse momentum of associate femto particle +DECLARE_SOA_COLUMN(TrkPt, trkPt, float); //! Transverse momentum of associate femto particle +DECLARE_SOA_COLUMN(TrkEta, trkEta, float); //! Eta of associate femto particle +DECLARE_SOA_COLUMN(TrkPhi, trkPhi, float); //! Phi of associate femto particle DECLARE_SOA_COLUMN(Kstar, kstar, float); //! Relative momentum in particles pair frame DECLARE_SOA_COLUMN(KT, kT, float); //! kT distribution of particle pairs DECLARE_SOA_COLUMN(MT, mT, float); //! Transverse mass distribution DECLARE_SOA_COLUMN(CharmM, charmM, float); //! Charm hadron mass DECLARE_SOA_COLUMN(CharmPt, charmPt, float); //! Transverse momentum of charm hadron for result task +DECLARE_SOA_COLUMN(CharmEta, charmEta, float); //! Eta of charm hadron for result task +DECLARE_SOA_COLUMN(CharmPhi, charmPhi, float); //! Phi of charm hadron for result task DECLARE_SOA_COLUMN(Mult, mult, int); //! Charge particle multiplicity DECLARE_SOA_COLUMN(MultPercentile, multPercentile, float); //! Multiplicity precentile DECLARE_SOA_COLUMN(PairSign, pairSign, int8_t); //! Selection between like sign (1) and unlike sign pair (2) @@ -281,6 +287,7 @@ DECLARE_SOA_DYNAMIC_COLUMN(Eta, eta, DECLARE_SOA_TABLE(FDHfCand, "AOD", "FDHFCAND", //! Table to store the derived data for charm hadron candidates o2::soa::Index<>, femtodreamparticle::FDCollisionId, + fdhf::TimeStamp, fdhf::Charge, fdhf::Prong0Id, fdhf::Prong1Id, @@ -305,31 +312,39 @@ DECLARE_SOA_TABLE(FDHfCand, "AOD", "FDHFCAND", //! Table to store the derived da fdhf::Phi, fdhf::Pt); -DECLARE_SOA_TABLE(FDResultsHF, "AOD", "FDRESULTSHF", //! table to store results for HF femtoscopy +DECLARE_SOA_TABLE(FDHfCharm, "AOD", "FDHFCHARM", //! table to store results for HF femtoscopy + fdhf::GIndexCol, + fdhf::TimeStamp, fdhf::CharmM, fdhf::CharmPt, - fdhf::PtAssoc, + fdhf::CharmEta, + fdhf::CharmPhi, + fdhf::Charge, fdhf::BDTBkg, fdhf::BDTPrompt, fdhf::BDTFD, - fdhf::Kstar, - fdhf::KT, - fdhf::MT, - fdhf::Mult, - fdhf::MultPercentile, - fdhf::Charge, - fdhf::PairSign, - fdhf::ProcessType, fdhf::FlagMc, fdhf::OriginMcRec); -DECLARE_SOA_TABLE(FDResultsHFTrkInfo, "AOD", "FDRESULTSHFTRKINFO", //! table to store results for HF femtoscopy +DECLARE_SOA_TABLE(FDHfTrk, "AOD", "FDHFTRK", //! table to store results for HF femtoscopy + fdhf::GIndexCol, + fdhf::TimeStamp, + fdhf::TrkPt, + fdhf::TrkEta, + fdhf::TrkPhi, + femtodreamparticle::Sign, femtodreamparticle::TPCNClsFound, track::TPCNClsFindable, femtodreamparticle::TPCNClsCrossedRows, femtodreamparticle::TPCNSigmaPr, femtodreamparticle::TOFNSigmaPr); +DECLARE_SOA_TABLE(FDHfColl, "AOD", "FDHFCOLL", //! table to store results for HF femtoscopy + fdhf::GIndexCol, + fdhf::TimeStamp, + fdhf::VertexZ, + fdhf::Mult); + DECLARE_SOA_TABLE(FDHfCandMC, "AOD", "FDHFCANDMC", //! Table for reconstructed MC charm hadron candidates o2::soa::Index<>, fdhf::FlagMc, diff --git a/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx b/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx index f74e6772159..cff8724c88d 100644 --- a/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx +++ b/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx @@ -475,37 +475,41 @@ struct HfFemtoDreamProducer { LOGF(fatal, "Please check your Ml configuration!!"); } } + auto bc = col.template bc_as(); + int64_t timeStamp = bc.timestamp(); auto fillTable = [&](int CandFlag, int FunctionSelection, float BDTScoreBkg, float BDTScorePrompt, float BDTScoreFD) { if (FunctionSelection >= 1){ - rowCandCharmHad( - outputCollision.lastIndex(), - trackPos1.sign() + trackNeg.sign() + trackPos2.sign(), - trackPos1.globalIndex(), - trackNeg.globalIndex(), - trackPos2.globalIndex(), - trackPos1.pt(), - trackNeg.pt(), - trackPos2.pt(), - trackPos1.eta(), - trackNeg.eta(), - trackPos2.eta(), - trackPos1.phi(), - trackNeg.phi(), - trackPos2.phi(), - 1 << CandFlag, - BDTScoreBkg, - BDTScorePrompt, - BDTScoreFD); - - // Row for MC candidate charm hadron (if constexpr isMc) - if constexpr (isMc) { - rowCandMcCharmHad( - candidate.flagMcMatchRec(), - candidate.originMcRec());} + rowCandCharmHad( + outputCollision.lastIndex(), + timeStamp, + trackPos1.sign() + trackNeg.sign() + trackPos2.sign(), + trackPos1.globalIndex(), + trackNeg.globalIndex(), + trackPos2.globalIndex(), + trackPos1.pt(), + trackNeg.pt(), + trackPos2.pt(), + trackPos1.eta(), + trackNeg.eta(), + trackPos2.eta(), + trackPos1.phi(), + trackNeg.phi(), + trackPos2.phi(), + 1 << CandFlag, + BDTScoreBkg, + BDTScorePrompt, + BDTScoreFD); + + // Row for MC candidate charm hadron (if constexpr isMc) + if constexpr (isMc) { + rowCandMcCharmHad( + candidate.flagMcMatchRec(), + candidate.originMcRec()); + } } }; fillTable(0, candidate.isSelLcToPKPi(), outputMlPKPi.at(0), outputMlPKPi.at(1), outputMlPKPi.at(2)); diff --git a/PWGHF/HFC/Tasks/taskCharmHadronsFemtoDream.cxx b/PWGHF/HFC/Tasks/taskCharmHadronsFemtoDream.cxx index 1f474a175c7..e922abade2f 100644 --- a/PWGHF/HFC/Tasks/taskCharmHadronsFemtoDream.cxx +++ b/PWGHF/HFC/Tasks/taskCharmHadronsFemtoDream.cxx @@ -47,12 +47,6 @@ struct HfTaskCharmHadronsFemtoDream { NegativeCharge = -1 }; - enum PairSign { - PairNotDefined = 0, - LikeSignPair = 1, - UnLikeSignPair = 2 - }; - /// Binning configurables ConfigurableAxis bin4Dkstar{"bin4Dkstar", {1500, 0., 6.}, "binning kstar for the 4Dimensional plot: k* vs multiplicity vs multiplicity percentile vs mT (set <> to true in order to use)"}; ConfigurableAxis bin4DMult{"bin4Dmult", {VARIABLE_WIDTH, 0.0f, 4.0f, 8.0f, 12.0f, 16.0f, 20.0f, 24.0f, 28.0f, 32.0f, 36.0f, 40.0f, 44.0f, 48.0f, 52.0f, 56.0f, 60.0f, 64.0f, 68.0f, 72.0f, 76.0f, 80.0f, 84.0f, 88.0f, 92.0f, 96.0f, 100.0f, 200.0f}, "multiplicity Binning for the 4Dimensional plot: k* vs multiplicity vs multiplicity percentile vs mT (set <> to true in order to use)"}; @@ -195,8 +189,9 @@ struct HfTaskCharmHadronsFemtoDream { SliceCache cache; Preslice perCol = aod::femtodreamparticle::fdCollisionId; - Produces fillFemtoResult; - Produces fillFemtoResultTrkInfo; + Produces rowFemtoResultCharm; + Produces rowFemtoResultTrk; + Produces rowFemtoResultColl; void init(InitContext& /*context*/) { @@ -243,25 +238,12 @@ struct HfTaskCharmHadronsFemtoDream { registryMixQa.fill(HIST("MixingQA/hSECollisionPool"), col.posZ(), col.multNtr()); } - template - void fillTableTrkInfo(Part1 const& p1) - { - fillFemtoResultTrkInfo( - p1.tpcNClsFound(), - p1.tpcNClsFindable(), - p1.tpcNClsCrossedRows(), - p1.tpcNSigmaPr(), - p1.tofNSigmaPr()); - } - /// This function processes the same event and takes care of all the histogramming template void doSameEvent(PartitionType& sliceTrk1, CandType& sliceCharmHad, TableTracks const& parts, Collision const& col) { fillCollision(col); - processType = 1; // for same event - for (auto const& [p1, p2] : combinations(CombinationsFullIndexPolicy(sliceTrk1, sliceCharmHad))) { if (p1.trackId() == p2.prong0Id() || p1.trackId() == p2.prong1Id() || p1.trackId() == p2.prong2Id()) @@ -285,24 +267,11 @@ struct HfTaskCharmHadronsFemtoDream { chargeTrack = NegativeCharge; } - int pairSign = 0; - if (chargeTrack == p2.charge()) { - pairSign = LikeSignPair; - } else { - pairSign = UnLikeSignPair; - } - float kstar = FemtoDreamMath::getkstar(p1, massOne, p2, massTwo); if (kstar > highkstarCut) { continue; } - // if (chargeTrack == 1) { - // partSign = 1; - // } else { - // partSign = 1 << 1; - // } - float invMass; if (p2.candidateSelFlag() == 1) { invMass = p2.m(std::array{o2::constants::physics::MassProton, o2::constants::physics::MassKPlus, o2::constants::physics::MassPiPlus}); @@ -326,24 +295,39 @@ struct HfTaskCharmHadronsFemtoDream { charmHadMc = p2.flagMc(); originType = p2.originMcRec(); } - fillFemtoResult( + + rowFemtoResultCharm( + col.globalIndex(), + p2.timeStamp(), invMass, p2.pt(), - p1.pt(), + p2.eta(), + p2.phi(), + p2.charge(), p2.bdtBkg(), p2.bdtPrompt(), p2.bdtFD(), - kstar, - FemtoDreamMath::getkT(p1, massOne, p2, massTwo), - FemtoDreamMath::getmT(p1, massOne, p2, massTwo), - col.multNtr(), - col.multV0M(), - p2.charge(), - pairSign, - processType, charmHadMc, originType); - fillTableTrkInfo(p1); + + rowFemtoResultTrk( + col.globalIndex(), + p2.timeStamp(), + p1.pt(), + p1.eta(), + p1.phi(), + chargeTrack, + p1.tpcNClsFound(), + p1.tpcNClsFindable(), + p1.tpcNClsCrossedRows(), + p1.tpcNSigmaPr(), + p1.tofNSigmaPr()); + + rowFemtoResultColl( + col.globalIndex(), + p2.timeStamp(), + col.posZ(), + col.multNtr()); sameEventCont.setPair(p1, p2, col.multNtr(), col.multV0M(), use4D, extendedPlots, smearingByOrigin); } @@ -354,8 +338,6 @@ struct HfTaskCharmHadronsFemtoDream { { // Mixed events that contain the pair of interest - processType = 2; // for mixed event - Partition PartitionMaskedCol1 = (aod::femtodreamcollision::bitmaskTrackOne & BitMask) == BitMask; PartitionMaskedCol1.bindTable(cols); @@ -384,20 +366,6 @@ struct HfTaskCharmHadronsFemtoDream { continue; } - float chargeTrack = 0.; - if ((p1.cut() & 2) == 2) { - chargeTrack = PositiveCharge; - } else { - chargeTrack = NegativeCharge; - } - - int pairSign = 0; - if (chargeTrack == p2.charge()) { - pairSign = LikeSignPair; - } else { - pairSign = UnLikeSignPair; - } - float kstar = FemtoDreamMath::getkstar(p1, massOne, p2, massTwo); if (kstar > highkstarCut) { continue; @@ -417,31 +385,6 @@ struct HfTaskCharmHadronsFemtoDream { continue; } - int charmHadMc = 0; - int originType = 0; - if constexpr (isMc) { - charmHadMc = p2.flagMc(); - originType = p2.originMcRec(); - } - fillFemtoResult( - invMass, - p2.pt(), - p1.pt(), - p2.bdtBkg(), - p2.bdtPrompt(), - p2.bdtFD(), - kstar, - FemtoDreamMath::getkT(p1, massOne, p2, massTwo), - FemtoDreamMath::getmT(p1, massOne, p2, massTwo), - collision1.multNtr(), - collision1.multV0M(), - p2.charge(), - pairSign, - processType, - charmHadMc, - originType); - fillTableTrkInfo(p1); - // if constexpr (!isMc) mixedEventCont.setPair(p1, p2, collision1.multNtr(), collision1.multV0M(), use4D, extendedPlots, smearingByOrigin); mixedEventCont.setPair(p1, p2, collision1.multNtr(), collision1.multV0M(), use4D, extendedPlots, smearingByOrigin); } From c33140a26ff68bfe79db63d62e9ec0fa7a660007 Mon Sep 17 00:00:00 2001 From: Yuanjing Ji Date: Fri, 16 May 2025 10:28:37 +0200 Subject: [PATCH 1297/1650] [PWGDQ] Pjpsi femto - add Jpsi-hadron kstar variable (#11161) Co-authored-by: Yuanjing Ji Co-authored-by: Yuanjing Ji --- PWGDQ/Core/HistogramsLibrary.cxx | 3 +++ PWGDQ/Core/VarManager.cxx | 3 +++ PWGDQ/Core/VarManager.h | 9 ++++++++- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index c047716bcfa..a11747619de 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -1778,6 +1778,9 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "InvMass_DelEta_DelPhi", "", 4, varsJPsiHadCorr, nJPsiHadCorr); // Without efficiency // hm->AddHistogram(histClass, "InvMass_DelEta_DelPhi", "", 4, varsJPsiHadCorr, nJPsiHadCorr, nullptr, VarManager::kJpsiHadronEff); } + if (subGroupStr.Contains("dilepton-hadron-femto")) { + hm->AddHistogram(histClass, "DileptonHadronKstar_DileptonMass", "", false, 150, 0.0, 3.0, VarManager::kDileptonHadronKstar, 100, 1.5, 4.5, VarManager::kPairMassDau); + } if (subGroupStr.Contains("opencharm")) { hm->AddHistogram(histClass, "Delta_Mass_DstarD0region", "", false, 50, 0.14, 0.16, VarManager::kDeltaMass); } diff --git a/PWGDQ/Core/VarManager.cxx b/PWGDQ/Core/VarManager.cxx index fa9cb8c20ed..dc3c963be43 100644 --- a/PWGDQ/Core/VarManager.cxx +++ b/PWGDQ/Core/VarManager.cxx @@ -926,6 +926,8 @@ void VarManager::SetDefaultVarNames() fgVariableUnits[kPairPhi] = "rad."; fgVariableNames[kPairPhiv] = "#varphi_{V}"; fgVariableUnits[kPairPhiv] = "rad."; + fgVariableNames[kDileptonHadronKstar] = "Dilepton-hadron k^{*}"; + fgVariableUnits[kDileptonHadronKstar] = "GeV/c^{2}"; fgVariableNames[kDeltaEta] = "#Delta#eta"; fgVariableUnits[kDeltaEta] = ""; fgVariableNames[kDeltaPhi] = "#Delta#phi"; @@ -1636,6 +1638,7 @@ void VarManager::SetDefaultVarNames() fgVarNamesMap["kPairEta"] = kPairEta; fgVarNamesMap["kPairPhi"] = kPairPhi; fgVarNamesMap["kPairPhiv"] = kPairPhiv; + fgVarNamesMap["kDileptonHadronKstar"] = kDileptonHadronKstar; fgVarNamesMap["kDeltaEta"] = kDeltaEta; fgVarNamesMap["kDeltaPhi"] = kDeltaPhi; fgVarNamesMap["kDeltaPhiSym"] = kDeltaPhiSym; diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 1dbe0045754..dd95386f3de 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -144,6 +144,7 @@ class VarManager : public TObject kElectronMuon, // e.g. Electron - muon correlations kBcToThreeMuons, // e.g. Bc -> mu+ mu- mu+ kBtoJpsiEEK, // e.g. B+ -> e+ e- K+ + kJpsiEEProton, // e.g. Jpsi-proton correlation, Jpsi to e+e- kXtoJpsiPiPi, // e.g. X(3872) -> J/psi pi+ pi- kChictoJpsiEE, // e.g. Chi_c1 -> J/psi e+ e- kDstarToD0KPiPi, // e.g. D*+ -> D0 pi+ -> K- pi+ pi+ @@ -809,6 +810,7 @@ class VarManager : public TObject kDeltaPhi, kDeltaPhiSym, kNCorrelationVariables, + kDileptonHadronKstar, // Dilepton-track-track variables kQuadMass, @@ -4723,7 +4725,7 @@ void VarManager::FillDileptonHadron(T1 const& dilepton, T2 const& hadron, float* values = fgValues; } - if (fgUsedVars[kPairMass] || fgUsedVars[kPairPt] || fgUsedVars[kPairEta] || fgUsedVars[kPairPhi] || fgUsedVars[kPairMassDau] || fgUsedVars[kPairPtDau]) { + if (fgUsedVars[kPairMass] || fgUsedVars[kPairPt] || fgUsedVars[kPairEta] || fgUsedVars[kPairPhi] || fgUsedVars[kPairMassDau] || fgUsedVars[kPairPtDau] || fgUsedVars[kDileptonHadronKstar]) { ROOT::Math::PtEtaPhiMVector v1(dilepton.pt(), dilepton.eta(), dilepton.phi(), dilepton.mass()); ROOT::Math::PtEtaPhiMVector v2(hadron.pt(), hadron.eta(), hadron.phi(), hadronMass); ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; @@ -4735,6 +4737,11 @@ void VarManager::FillDileptonHadron(T1 const& dilepton, T2 const& hadron, float* values[kPairPtDau] = dilepton.pt(); values[kMassDau] = hadronMass; values[kDeltaMass] = v12.M() - dilepton.mass(); + // Calculate kstar of Dilepton and hadron pair + ROOT::Math::PtEtaPhiMVector v12_Qvect = v1 - v2; + double Pinv = v12.M(); + double Q1 = (dilepton.mass() * dilepton.mass() - hadronMass * hadronMass) / Pinv; + values[kDileptonHadronKstar] = sqrt(Q1 * Q1 - v12_Qvect.M2()) / 2.0; } if (fgUsedVars[kDeltaPhi]) { double delta = dilepton.phi() - hadron.phi(); From ac5447aed6763faf2c6c3a3e0a20e9b0d329f577 Mon Sep 17 00:00:00 2001 From: bghanley1995 Date: Fri, 16 May 2025 05:38:05 -0400 Subject: [PATCH 1298/1650] [PWGCF] Identified BF Filter, Overhauled N Sigma PID (#11213) Co-authored-by: ALICE Action Bot --- .../TableProducer/identifiedBfFilter.cxx | 601 ++++++++++++++---- .../TableProducer/identifiedBfFilter.h | 20 +- 2 files changed, 504 insertions(+), 117 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx b/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx index 5eda3450473..535dd77cce2 100644 --- a/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx +++ b/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx @@ -59,16 +59,17 @@ namespace o2::analysis::identifiedbffilter using IdBfFullTracks = soa::Join; using IdBfFullTracksAmbiguous = soa::Join; using IdBfTracksPID = soa::Join; +using IdBfTracksTOF = soa::Join; using IdBfTracksFullPID = soa::Join; -using IdBfFullTracksPID = soa::Join; +using IdBfFullTracksPID = soa::Join; using IdBfFullTracksFullPID = soa::Join; -using IdBfFullTracksPIDAmbiguous = soa::Join; +using IdBfFullTracksPIDAmbiguous = soa::Join; using IdBfFullTracksFullPIDAmbiguous = soa::Join; using IdBfFullTracksDetLevel = soa::Join; using IdBfFullTracksDetLevelAmbiguous = soa::Join; -using IdBfFullTracksPIDDetLevel = soa::Join; +using IdBfFullTracksPIDDetLevel = soa::Join; using IdBfFullTracksFullPIDDetLevel = soa::Join; -using IdBfFullTracksPIDDetLevelAmbiguous = soa::Join; +using IdBfFullTracksPIDDetLevelAmbiguous = soa::Join; using IdBfFullTracksFullPIDDetLevelAmbiguous = soa::Join; bool fullDerivedData = false; /* produce full derived data for its external storage */ @@ -133,12 +134,22 @@ TH1F* fhEtaA = nullptr; TH1F* fhPhiB = nullptr; TH1F* fhPhiA = nullptr; +TH1F* fhTrackLengthB = nullptr; +TH1F* fhTrackLengthTOFB = nullptr; +TH2F* fhTrackTimeB = nullptr; +TH2F* fhTrackBetaInvB = nullptr; +TH2F* fhTrackTimeIPB = nullptr; +TH2F* fhTrackBetaInvIPB = nullptr; TH2F* fhdEdxB = nullptr; TH2F* fhdEdxIPTPCB = nullptr; +TH1F* fhTrackLengthA[kIdBfNoOfSpecies + 2] = {nullptr}; +TH1F* fhTrackLengthTOFA[kIdBfNoOfSpecies + 2] = {nullptr}; TH2F* fhdEdxA[kIdBfNoOfSpecies + 2] = {nullptr}; TH2F* fhdEdxIPTPCA[kIdBfNoOfSpecies + 2] = {nullptr}; TH2F* fhTrackTimeA[kIdBfNoOfSpecies + 2] = {nullptr}; -TH2F* fhTrackBetaA[kIdBfNoOfSpecies + 2] = {nullptr}; +TH2F* fhTrackBetaInvA[kIdBfNoOfSpecies + 2] = {nullptr}; +TH2F* fhTrackTimeIPA[kIdBfNoOfSpecies + 2] = {nullptr}; +TH2F* fhTrackBetaInvIPA[kIdBfNoOfSpecies + 2] = {nullptr}; TH1F* fhMassB = nullptr; TH1F* fhMassA[kIdBfNoOfSpecies + 1] = {nullptr}; @@ -167,6 +178,9 @@ TH1S* fhTruePIDCorrect = nullptr; std::vector> fhTrueNSigmaTPC = {o2::analysis::identifiedbffilter::kIdBfNoOfSpecies, {o2::analysis::identifiedbffilter::kIdBfNoOfSpecies, nullptr}}; std::vector> fhTrueNSigmaTOF = {o2::analysis::identifiedbffilter::kIdBfNoOfSpecies, {o2::analysis::identifiedbffilter::kIdBfNoOfSpecies, nullptr}}; +std::vector> fhPrimaryNSigmaTPC = {o2::analysis::identifiedbffilter::kIdBfNoOfSpecies, {o2::analysis::identifiedbffilter::kIdBfNoOfSpecies, nullptr}}; +std::vector> fhPrimaryNSigmaTOF = {o2::analysis::identifiedbffilter::kIdBfNoOfSpecies, {o2::analysis::identifiedbffilter::kIdBfNoOfSpecies, nullptr}}; + TH1F* fhTrueCentMultB = nullptr; TH1F* fhTrueCentMultA = nullptr; TH1F* fhTrueVertexZB = nullptr; @@ -184,8 +198,36 @@ TH1F* fhTruePtNegA[kIdBfNoOfSpecies + 1] = {nullptr}; TH2F* fhTrueNPosNegA[kIdBfNoOfSpecies + 1] = {nullptr}; TH1F* fhTrueDeltaNA[kIdBfNoOfSpecies + 1] = {nullptr}; -TH2F* fhTruedEdx[kIdBfNoOfSpecies + 1] = {nullptr}; -TH2F* fhTrueTrackTime[kIdBfNoOfSpecies + 1] = {nullptr}; +TH2F* fhTruedEdxA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH2F* fhTruedEdxIPTPCA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH1F* fhTrueTrackLengthA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH1F* fhTrueTrackLengthTOFA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH2F* fhTrueTrackTimeA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH2F* fhTrueTrackBetaInvA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH2F* fhTrueTrackTimeIPA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH2F* fhTrueTrackBetaInvIPA[kIdBfNoOfSpecies + 1] = {nullptr}; + +TH1F* fhPrimaryPA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH1F* fhPrimaryPtA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH2F* fhPrimarydEdxA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH2F* fhPrimarydEdxIPTPCA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH1F* fhPrimaryTrackLengthA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH1F* fhPrimaryTrackLengthTOFA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH2F* fhPrimaryTrackTimeA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH2F* fhPrimaryTrackBetaInvA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH2F* fhPrimaryTrackTimeIPA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH2F* fhPrimaryTrackBetaInvIPA[kIdBfNoOfSpecies + 1] = {nullptr}; + +TH1F* fhPurePA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH1F* fhPurePtA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH2F* fhPuredEdxA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH2F* fhPuredEdxIPTPCA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH1F* fhPureTrackLengthA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH1F* fhPureTrackLengthTOFA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH2F* fhPureTrackTimeA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH2F* fhPureTrackBetaInvA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH2F* fhPureTrackTimeIPA[kIdBfNoOfSpecies + 1] = {nullptr}; +TH2F* fhPureTrackBetaInvIPA[kIdBfNoOfSpecies + 1] = {nullptr}; TH2F* fhTruePtEtaPosA[kIdBfNoOfSpecies + 1] = {nullptr}; TH2F* fhTruePtEtaNegA[kIdBfNoOfSpecies + 1] = {nullptr}; @@ -210,6 +252,17 @@ TH1F* fhTrueDCAzA = nullptr; TH2F* fhTrueDCAxyzB = nullptr; TH2F* fhTrueDCAxyzA = nullptr; +TH1F* fhPrimaryPB = nullptr; +TH1F* fhPrimaryPtB = nullptr; +TH2F* fhPrimarydEdxB = nullptr; +TH2F* fhPrimarydEdxIPTPCB = nullptr; +TH1F* fhPrimaryTrackLengthB = nullptr; +TH1F* fhPrimaryTrackLengthTOFB = nullptr; +TH2F* fhPrimaryTrackTimeB = nullptr; +TH2F* fhPrimaryTrackBetaInvB = nullptr; +TH2F* fhPrimaryTrackTimeIPB = nullptr; +TH2F* fhPrimaryTrackBetaInvIPB = nullptr; + //============================================================================================ // The IdentifiedBfFilter multiplicity counters //============================================================================================ @@ -688,20 +741,41 @@ struct IdentifiedBfFilterTracks { Configurable reqTOF{"reqTOF", false, "Require TOF data for PID. Default false"}; Configurable onlyTOF{"onlyTOF", false, "Only use TOF data for PID. Default false"}; - Configurable pidEl{"pidEl", -1, "Identify Electron Tracks"}; - Configurable pidPi{"pidPi", -1, "Identify Pion Tracks"}; - Configurable pidKa{"pidKa", -1, "Identify Kaon Tracks"}; - Configurable pidPr{"pidPr", -1, "Identify Proton Tracks"}; + // Configurable pidEl{"pidEl", -1, "Identify Electron Tracks"}; + // Configurable pidPi{"pidPi", -1, "Identify Pion Tracks"}; + // Configurable pidKa{"pidKa", -1, "Identify Kaon Tracks"}; + // Configurable pidPr{"pidPr", -1, "Identify Proton Tracks"}; + + // Configurable minPIDSigma{"minPIDSigma", -3.0, "Minimum required sigma for PID Acceptance"}; + // Configurable maxPIDSigma{"maxPIDSigma", 3.0, "Maximum required sigma for PID Acceptance"}; + + // Configurable> minPIDSigmas{"minPIDSigmas", {-3.,-3.,-3.,-3.},"Minimum required sigma for PID Acceptance, {e, pi, K, p}"}; + // Configurable>> acceptPIDSigmas{"acceptPIDSigmas", {{-3.,3.},{-3.,3.},{-3.,3.},{-3.,3.}},"Sigma range for PID Acceptance, {e, pi, K, p}"}; + // Configurable> minRejectSigmas{"minRejectSigmas", {-1.,-1.,-1.,-1.},"Minimum required sigma for PID double match rejection, {e, pi, K, p}"}; - Configurable minPIDSigma{"minPIDSigma", -3.0, "Minimum required sigma for PID Acceptance"}; - Configurable maxPIDSigma{"maxPIDSigma", 3.0, "Maximum required sigma for PID Acceptance"}; + // Configurable minRejectSigma{"minRejectSigma", -1.0, "Minimum required sigma for PID double match rejection"}; + // Configurable maxRejectSigma{"maxRejectSigma", 1.0, "Maximum required sigma for PID double match rejection"}; - Configurable minRejectSigma{"minRejectSigma", -1.0, "Minimum required sigma for PID double match rejection"}; - Configurable maxRejectSigma{"maxRejectSigma", 1.0, "Maximum required sigma for PID double match rejection"}; + Configurable> cfgDoPID{"cfgDoPID", {-1, -1, -1, -1}, "Do PID for particle, {e, pi, K, p}"}; + Configurable> cfgTOFCut{"cfgTOFCut", {0.8, 0.8, 0.8, 0.8}, "Momentum under which we don't use TOF PID data, {e, pi, K, p}"}; + Configurable> cfgTPCCut{"cfgTPCCut", {1.2, 1.2, 1.2, 1.2}, "Momentum over which we don't use TPC PID data, {e, pi, K, p}"}; - Configurable tofCut{"tofCut", 0.8, "Momentum under which we don't use TOF PID data"}; Configurable makeNSigmaPlots{"makeNSigmaPlots", false, "Produce the N Sigma Plots for external storage. Default false"}; + struct : ConfigurableGroup { + Configurable> rejectPIDSigmasEl{"rejectPIDSigmasEl", {0., 1., 1., 1.}, "Required sigma for PID double match rejection of electrons for {e, pi, K, p}"}; + Configurable> rejectPIDSigmasPi{"rejectPIDSigmasPi", {1., 0., 1., 1.}, "Required sigma for PID double match rejection of pions for {e, pi, K, p}"}; + Configurable> rejectPIDSigmasKa{"rejectPIDSigmasKa", {1., 1., 0., 1.}, "Required sigma for PID double match rejection of kaons for {e, pi, K, p}"}; + Configurable> rejectPIDSigmasPr{"rejectPIDSigmasPr", {1., 1., 1., 0.}, "Required sigma for PID double match rejection of protons for {e, pi, K, p}"}; + } rejectPIDSigmas; + + struct : ConfigurableGroup { + Configurable> acceptPIDSigmasEl{"acceptPIDSigmasEl", {-3., 3.}, "Sigma range for PID Acceptance for electrons"}; + Configurable> acceptPIDSigmasPi{"acceptPIDSigmasPi", {-3., 3.}, "Sigma range for PID Acceptance for pions"}; + Configurable> acceptPIDSigmasKa{"acceptPIDSigmasKa", {-3., 3.}, "Sigma range for PID Acceptance for kaons"}; + Configurable> acceptPIDSigmasPr{"acceptPIDSigmasPr", {-3., 3.}, "Sigma range for PID Acceptance for protons"}; + } acceptPIDSigmas; + OutputObj fOutput{"IdentifiedBfFilterTracksInfo", OutputObjHandlingPolicy::AnalysisObject}; bool checkAmbiguousTracks = false; @@ -742,6 +816,21 @@ struct IdentifiedBfFilterTracks { zvtxbins = cfgBinning->mZVtxbins; zvtxlow = cfgBinning->mZVtxmin; zvtxup = cfgBinning->mZVtxmax; + + LOGF(info, "Initializing ranges"); + acceptRange.push_back(acceptPIDSigmas.acceptPIDSigmasEl); + acceptRange.push_back(acceptPIDSigmas.acceptPIDSigmasPi); + acceptRange.push_back(acceptPIDSigmas.acceptPIDSigmasKa); + acceptRange.push_back(acceptPIDSigmas.acceptPIDSigmasPr); + + rejectRange.push_back(rejectPIDSigmas.rejectPIDSigmasEl); + rejectRange.push_back(rejectPIDSigmas.rejectPIDSigmasPi); + rejectRange.push_back(rejectPIDSigmas.rejectPIDSigmasKa); + rejectRange.push_back(rejectPIDSigmas.rejectPIDSigmasPr); + + doPID = cfgDoPID; + tofCut = cfgTOFCut; + tpcCut = cfgTPCCut; /* the track types and combinations */ tracktype = cfgTrackType.value; initializeTrackSelection(); @@ -812,6 +901,24 @@ struct IdentifiedBfFilterTracks { fhPhiB = new TH1F("fHistPhiB", "#phi distribution for reconstructed before;#phi;counts", 360, 0.0, constants::math::TwoPI); fhdEdxB = new TH2F("fHistdEdxB", "dE/dx vs P before; P (GeV/c); dE/dx (a.u.)", ptbins, ptlow, ptup, 1000, 0.0, 1000.0); fhdEdxIPTPCB = new TH2F("fHistdEdxIPTPCB", "dE/dx vs P_{IP} before; P (GeV/c); dE/dx (a.u.)", ptbins, ptlow, ptup, 1000, 0.0, 1000.0); + fhTrackLengthB = new TH1F(TString::Format("fhTrackLengthB").Data(), + TString::Format("Track Length; L (cm)").Data(), + 1000, 0., 1000.0); + fhTrackLengthTOFB = new TH1F(TString::Format("fhTrackLengthTOFB").Data(), + TString::Format("Track Length with TOF; L (cm)").Data(), + 1000, 0.0, 1000.0); + fhTrackTimeB = new TH2F(TString::Format("fhTrackTimeB").Data(), + TString::Format("Track Time vs P; P (GeV/c); Track Time(ns)").Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); + fhTrackBetaInvB = new TH2F(TString::Format("fhTrackBetaInvB").Data(), + TString::Format("1/#Beta vs P; P (GeV/c); 1/#Beta(ns/m)").Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); + fhTrackTimeIPB = new TH2F(TString::Format("fhTrackTimeIPB").Data(), + TString::Format("Track Time vs P_{IP}; P (GeV/c); Track Time(ns)").Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); + fhTrackBetaInvIPB = new TH2F(TString::Format("fhTrackBetaInvIPB").Data(), + TString::Format("1/#Beta vs P_{IP}; P (GeV/c); 1/#Beta(ns/m)").Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); fhPhiA = new TH1F("fHistPhiA", "#phi distribution for reconstructed;#phi;counts", 360, 0.0, constants::math::TwoPI); fhDCAxyB = new TH1F("DCAxyB", "DCA_{xy} distribution for reconstructed before;DCA_{xy} (cm);counts", 1000, -4.0, 4.0); fhDCAxyA = new TH1F("DCAxyA", "DCA_{xy} distribution for reconstructed;DCA_{xy} (cm);counts", 1000, -4., 4.0); @@ -897,12 +1004,24 @@ struct IdentifiedBfFilterTracks { fhdEdxIPTPCA[sp] = new TH2F(TString::Format("fhdEdxIPTPCA_%s", speciesName[sp]).Data(), TString::Format("dE/dx vs P_{IP} reconstructed %s; P (GeV/c); dE/dx (a.u.)", speciesTitle[sp]).Data(), ptbins, ptlow, ptup, 1000, 0.0, 1000.0); + fhTrackLengthA[sp] = new TH1F(TString::Format("fhTrackLengthA_%s", speciesName[sp]).Data(), + TString::Format("Track Length of reconstructed %s; L (cm)", speciesTitle[sp]).Data(), + 1000, 0.0, 1000.0); + fhTrackLengthTOFA[sp] = new TH1F(TString::Format("fhTrackLengthTOFA_%s", speciesName[sp]).Data(), + TString::Format("Track Length of reconstructed %s with TOF; L (cm)", speciesTitle[sp]).Data(), + 1000, 0.0, 1000.0); fhTrackTimeA[sp] = new TH2F(TString::Format("fhTrackTimeA_%s", speciesName[sp]).Data(), - TString::Format("Track Time vs P_{IP} reconstructed %s; P (GeV/c); Track Time(ns)", speciesTitle[sp]).Data(), - ptbins, ptlow, ptup, 1000, 0.0, 10.0); - fhTrackBetaA[sp] = new TH2F(TString::Format("fhTrackBetaA_%s", speciesName[sp]).Data(), - TString::Format("1/#Beta vs P_{IP} reconstructed %s; P (GeV/c); 1/#Beta(ns/m)", speciesTitle[sp]).Data(), - ptbins, ptlow, ptup, 1000, 0.0, 10.0); + TString::Format("Track Time vs P reconstructed %s; P (GeV/c); Track Time(ns)", speciesTitle[sp]).Data(), ptbins, ptlow, ptup, 1000, 0.0, 10.0); + fhTrackBetaInvA[sp] = new TH2F(TString::Format("fhTrackBetaInvA_%s", speciesName[sp]).Data(), + TString::Format("1/#Beta vs P reconstructed %s; P (GeV/c); 1/#Beta(ns/m)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); + fhTrackTimeIPA[sp] = new TH2F(TString::Format("fhTrackTimeIPA_%s", speciesName[sp]).Data(), + TString::Format("Track Time vs P_{IP} reconstructed %s; P (GeV/c); Track Time(ns)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); + fhTrackBetaInvIPA[sp] = new TH2F(TString::Format("fhTrackBetaInvIPA_%s", speciesName[sp]).Data(), + TString::Format("1/#Beta vs P_{IP} reconstructed %s; P (GeV/c); 1/#Beta(ns/m)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); + LOGF(info, "Made Histos"); } fhdEdxA[kIdBfNoOfSpecies + 1] = new TH2F(TString::Format("fhdEdxA_WrongSpecies").Data(), TString::Format("dE/dx vs P reconstructed Wrong Species; P (GeV/c); dE/dx (a.u.)").Data(), @@ -910,12 +1029,24 @@ struct IdentifiedBfFilterTracks { fhdEdxIPTPCA[kIdBfNoOfSpecies + 1] = new TH2F(TString::Format("fhdEdxIPTPCA_WrongSpecies").Data(), TString::Format("dE/dx vs P_{IP} reconstructed Wrong Species; P (GeV/c); dE/dx (a.u.)").Data(), ptbins, ptlow, ptup, 1000, 0.0, 1000.0); + fhTrackLengthA[kIdBfNoOfSpecies + 1] = new TH1F(TString::Format("fhTrackLengthA_WrongSpecies").Data(), + TString::Format("Track Length of reconstructed Wrong Species; L (cm)").Data(), + 1000, 0.0, 1000.0); + fhTrackLengthTOFA[kIdBfNoOfSpecies + 1] = new TH1F(TString::Format("fhTrackLengthTOFA_WrongSpecies").Data(), + TString::Format("Track Length of reconstructed Wrong Species with TOF; L (cm)").Data(), + 1000, 0.0, 1000.0); fhTrackTimeA[kIdBfNoOfSpecies + 1] = new TH2F(TString::Format("fhTrackTimeA_WrongSpecies").Data(), - TString::Format("Track Time vs P_{IP} reconstructed Wrong Species; P (GeV/c); Track Time(ns)").Data(), - ptbins, ptlow, ptup, 1000, 0.0, 10.0); - fhTrackBetaA[kIdBfNoOfSpecies + 1] = new TH2F(TString::Format("fhTrackBetaA_WrongSpecies").Data(), - TString::Format("1/#Beta vs P_{IP} reconstructed Wrong Species; P (GeV/c); 1/#Beta(ns/m)").Data(), + TString::Format("Track Time vs P reconstructed Wrong Species; P (GeV/c); Track Time(ns)").Data(), ptbins, ptlow, ptup, 1000, 0.0, 10.0); + fhTrackBetaInvA[kIdBfNoOfSpecies + 1] = new TH2F(TString::Format("fhTrackBetaInvA_WrongSpecies").Data(), + TString::Format("1/#Beta vs P reconstructed Wrong Species; P (GeV/c); 1/#Beta(ns/m)").Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); + fhTrackTimeIPA[kIdBfNoOfSpecies + 1] = new TH2F(TString::Format("fhTrackTimeIPA_WrongSpecies").Data(), + TString::Format("Track Time vs P_{IP} reconstructed Wrong Species; P (GeV/c); Track Time(ns)").Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); + fhTrackBetaInvIPA[kIdBfNoOfSpecies + 1] = new TH2F(TString::Format("fhTrackBetaInvIPA_WrongSpecies").Data(), + TString::Format("1/#Beta vs P_{IP} reconstructed Wrong Species; P (GeV/c); 1/#Beta(ns/m)").Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); /* add the hstograms to the output list */ fOutputList->Add(fhXYB); @@ -942,6 +1073,12 @@ struct IdentifiedBfFilterTracks { fOutputList->Add(fhPhiA); fOutputList->Add(fhdEdxB); fOutputList->Add(fhdEdxIPTPCB); + fOutputList->Add(fhTrackLengthB); + fOutputList->Add(fhTrackLengthTOFB); + fOutputList->Add(fhTrackTimeB); + fOutputList->Add(fhTrackBetaInvB); + fOutputList->Add(fhTrackTimeIPB); + fOutputList->Add(fhTrackBetaInvIPB); fOutputList->Add(fhDCAxyB); fOutputList->Add(fhDCAxyA); fOutputList->Add(fhDCAxyzB); @@ -978,13 +1115,22 @@ struct IdentifiedBfFilterTracks { fOutputList->Add(fhDeltaNA[sp]); fOutputList->Add(fhdEdxA[sp]); fOutputList->Add(fhdEdxIPTPCA[sp]); + fOutputList->Add(fhTrackLengthA[sp]); + fOutputList->Add(fhTrackLengthTOFA[sp]); fOutputList->Add(fhTrackTimeA[sp]); - fOutputList->Add(fhTrackBetaA[sp]); + fOutputList->Add(fhTrackBetaInvA[sp]); + fOutputList->Add(fhTrackTimeIPA[sp]); + fOutputList->Add(fhTrackBetaInvIPA[sp]); + LOGF(info, "Added histos"); } fOutputList->Add(fhdEdxA[kIdBfNoOfSpecies + 1]); fOutputList->Add(fhdEdxIPTPCA[kIdBfNoOfSpecies + 1]); + fOutputList->Add(fhTrackLengthA[kIdBfNoOfSpecies + 1]); + fOutputList->Add(fhTrackLengthTOFA[kIdBfNoOfSpecies + 1]); fOutputList->Add(fhTrackTimeA[kIdBfNoOfSpecies + 1]); - fOutputList->Add(fhTrackBetaA[kIdBfNoOfSpecies + 1]); + fOutputList->Add(fhTrackBetaInvA[kIdBfNoOfSpecies + 1]); + fOutputList->Add(fhTrackTimeIPA[kIdBfNoOfSpecies + 1]); + fOutputList->Add(fhTrackBetaInvIPA[kIdBfNoOfSpecies + 1]); } if ((fDataType != kData) && (fDataType != kDataNoEvtSel)) { @@ -1010,6 +1156,36 @@ struct IdentifiedBfFilterTracks { fhTruePhiB = new TH1F("fTrueHistPhiB", "#phi distribution before (truth);#phi;counts", 360, 0.0, constants::math::TwoPI); fhTruePhiA = new TH1F("fTrueHistPhiA", "#phi distribution (truth);#phi;counts", 360, 0.0, constants::math::TwoPI); fhTrueDCAxyB = new TH1F("TrueDCAxyB", "DCA_{xy} distribution for generated before;DCA_{xy} (cm);counts", 1000, -4.0, 4.0); + fhPrimaryPB = new TH1F(TString::Format("fhPrimaryPB").Data(), + TString::Format("p distribution Primary Before Selection;p (GeV/c);dN/dp (c/GeV)").Data(), + ptbins, ptlow, ptup); + fhPrimaryPtB = new TH1F(TString::Format("fhPrimaryPtB"), + TString::Format("p_{T} distribution Primary Before Selection ;p_{T} (GeV/c);dN/dP_{T} (c/GeV)").Data(), + ptbins, ptlow, ptup); + fhPrimarydEdxB = new TH2F(TString::Format("fhPrimarydEdxB").Data(), + TString::Format("dE/dx vs P Primary Before Selection; P (GeV/c); dE/dx (a.u.)").Data(), + ptbins, ptlow, ptup, 1000, 0.0, 1000.0); + fhPrimarydEdxIPTPCB = new TH2F(TString::Format("fhPrimarydEdxIPTPCB").Data(), + TString::Format("dE/dx vs P_{IP} Primary Before Selection; P (GeV/c); dE/dx (a.u.)").Data(), + ptbins, ptlow, ptup, 1000, 0.0, 1000.0); + fhPrimaryTrackLengthB = new TH1F(TString::Format("fhPrimaryTrackLengthB").Data(), + TString::Format("Track Length of Primary Before Selection; L (cm)").Data(), + 1000, 0.0, 1000.0); + fhPrimaryTrackLengthTOFB = new TH1F(TString::Format("fhPrimaryTrackLengthTOFB").Data(), + TString::Format("Track Length of Primary Before Selection with TOF; L (cm)").Data(), + 1000, 0.0, 1000.0); + fhPrimaryTrackTimeB = new TH2F(TString::Format("fhPrimaryTrackTimeB").Data(), + TString::Format("Track Time vs P Primary Before Selection; P (GeV/c); Track Time(ns)").Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); + fhPrimaryTrackBetaInvB = new TH2F(TString::Format("fhPrimaryTrackBetaInvB").Data(), + TString::Format("1/#Beta vs P Primary Before Selection; P (GeV/c); 1/#Beta(ns/m)").Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); + fhPrimaryTrackTimeIPB = new TH2F(TString::Format("fhPrimaryTrackTimeIPB").Data(), + TString::Format("Track Time vs P_{IP} Primary Before Selection; P (GeV/c); Track Time(ns)").Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); + fhPrimaryTrackBetaInvIPB = new TH2F(TString::Format("fhPrimaryTrackBetaInvIPB").Data(), + TString::Format("1/#Beta vs P_{IP} Primary Before Selection; P (GeV/c); 1/#Beta(ns/m)").Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); if (traceDCAOutliers.mDoIt) { fhTrueDCAxyBid = new TH1F("PDGCodeDCAxyB", TString::Format("PDG code within %.2f<|DCA_{#it{xy}}|<%.2f; PDG code", traceDCAOutliers.mLowValue, traceDCAOutliers.mUpValue).Data(), @@ -1048,6 +1224,92 @@ struct IdentifiedBfFilterTracks { fhTrueDeltaNA[sp] = new TH1F(TString::Format("fhTrueDeltaNA_%s", speciesName[sp]).Data(), TString::Format("N(%s^{#plus}) #minus N(%s^{#minus}) distribution (truth);N(%s^{#plus}) #minus N(%s^{#minus})", speciesTitle[sp], speciesTitle[sp], speciesTitle[sp], speciesTitle[sp]).Data(), 79, -39.5, 39.5); + fhTruedEdxA[sp] = new TH2F(TString::Format("fhTruedEdxA_%s", speciesName[sp]).Data(), + TString::Format("dE/dx vs P generated %s; P (GeV/c); dE/dx (a.u.)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup, 1000, 0.0, 1000.0); + fhTruedEdxIPTPCA[sp] = new TH2F(TString::Format("fhTruedEdxIPTPCA_%s", speciesName[sp]).Data(), + TString::Format("dE/dx vs P_{IP} generated %s; P (GeV/c); dE/dx (a.u.)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup, 1000, 0.0, 1000.0); + fhTrueTrackLengthA[sp] = new TH1F(TString::Format("fhTrueTrackLengthA_%s", speciesName[sp]).Data(), + TString::Format("Track Length of generated %s; L (cm)", speciesTitle[sp]).Data(), + 1000, 0.0, 1000.0); + fhTrueTrackLengthTOFA[sp] = new TH1F(TString::Format("fhTrueTrackLengthTOFA_%s", speciesName[sp]).Data(), + TString::Format("Track Length of generated %s with TOF; L (cm)", speciesTitle[sp]).Data(), + 1000, 0.0, 1000.0); + fhTrueTrackTimeA[sp] = new TH2F(TString::Format("fhTrueTrackTimeA_%s", speciesName[sp]).Data(), + TString::Format("Track Time vs P generated %s; P (GeV/c); Track Time(ns)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); + fhTrueTrackBetaInvA[sp] = new TH2F(TString::Format("fhTrueTrackBetaInvA_%s", speciesName[sp]).Data(), + TString::Format("1/#Beta vs P generated %s; P (GeV/c); 1/#Beta(ns/m)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); + fhTrueTrackTimeIPA[sp] = new TH2F(TString::Format("fhTrueTrackTimeIPA_%s", speciesName[sp]).Data(), + TString::Format("Track Time vs P_{IP} generated %s; P (GeV/c); Track Time(ns)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); + fhTrueTrackBetaInvIPA[sp] = new TH2F(TString::Format("fhTrueTrackBetaInvIPA_%s", speciesName[sp]).Data(), + TString::Format("1/#Beta vs P_{IP} generated %s; P (GeV/c); 1/#Beta(ns/m)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); + + fhPrimaryPA[sp] = new TH1F(TString::Format("fhPrimaryPA_%s", speciesName[sp]).Data(), + TString::Format("p distribution Primary %s;p (GeV/c);dN/dp (c/GeV)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup); + fhPrimaryPtA[sp] = new TH1F(TString::Format("fhPrimaryPtA_%s", speciesName[sp]), + TString::Format("p_{T} distribution Primary %s ;p_{T} (GeV/c);dN/dP_{T} (c/GeV)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup); + fhPrimarydEdxA[sp] = new TH2F(TString::Format("fhPrimarydEdxA_%s", speciesName[sp]).Data(), + TString::Format("dE/dx vs P Primary %s; P (GeV/c); dE/dx (a.u.)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup, 1000, 0.0, 1000.0); + fhPrimarydEdxIPTPCA[sp] = new TH2F(TString::Format("fhPrimarydEdxIPTPCA_%s", speciesName[sp]).Data(), + TString::Format("dE/dx vs P_{IP} Primary %s; P (GeV/c); dE/dx (a.u.)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup, 1000, 0.0, 1000.0); + fhPrimaryTrackLengthA[sp] = new TH1F(TString::Format("fhPrimaryTrackLengthA_%s", speciesName[sp]).Data(), + TString::Format("Track Length of Primary %s; L (cm)", speciesTitle[sp]).Data(), + 1000, 0.0, 1000.0); + fhPrimaryTrackLengthTOFA[sp] = new TH1F(TString::Format("fhPrimaryTrackLengthTOFA_%s", speciesName[sp]).Data(), + TString::Format("Track Length of Primary %s with TOF; L (cm)", speciesTitle[sp]).Data(), + 1000, 0.0, 1000.0); + fhPrimaryTrackTimeA[sp] = new TH2F(TString::Format("fhPrimaryTrackTimeA_%s", speciesName[sp]).Data(), + TString::Format("Track Time vs P Primary %s; P (GeV/c); Track Time(ns)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); + fhPrimaryTrackBetaInvA[sp] = new TH2F(TString::Format("fhPrimaryTrackBetaInvA_%s", speciesName[sp]).Data(), + TString::Format("1/#Beta vs P Primary %s; P (GeV/c); 1/#Beta(ns/m)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); + fhPrimaryTrackTimeIPA[sp] = new TH2F(TString::Format("fhPrimaryTrackTimeIPA_%s", speciesName[sp]).Data(), + TString::Format("Track Time vs P_{IP} Primary %s; P (GeV/c); Track Time(ns)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); + fhPrimaryTrackBetaInvIPA[sp] = new TH2F(TString::Format("fhPrimaryTrackBetaInvIPA_%s", speciesName[sp]).Data(), + TString::Format("1/#Beta vs P_{IP} Primary %s; P (GeV/c); 1/#Beta(ns/m)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); + + fhPurePA[sp] = new TH1F(TString::Format("fhPurePA_%s", speciesName[sp]).Data(), + TString::Format("p distribution Pure %s;p (GeV/c);dN/dp (c/GeV)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup); + fhPurePtA[sp] = new TH1F(TString::Format("fhPurePtA_%s", speciesName[sp]), + TString::Format("p_{T} distribution Pure %s ;p_{T} (GeV/c);dN/dP_{T} (c/GeV)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup); + fhPuredEdxA[sp] = new TH2F(TString::Format("fhPuredEdxA_%s", speciesName[sp]).Data(), + TString::Format("dE/dx vs P Pure %s; P (GeV/c); dE/dx (a.u.)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup, 1000, 0.0, 1000.0); + fhPuredEdxIPTPCA[sp] = new TH2F(TString::Format("fhPuredEdxIPTPCA_%s", speciesName[sp]).Data(), + TString::Format("dE/dx vs P_{IP} Pure %s; P (GeV/c); dE/dx (a.u.)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup, 1000, 0.0, 1000.0); + fhPureTrackLengthA[sp] = new TH1F(TString::Format("fhPureTrackLengthA_%s", speciesName[sp]).Data(), + TString::Format("Track Length of Pure %s; L (cm)", speciesTitle[sp]).Data(), + 1000, 0.0, 1000.0); + fhPureTrackLengthTOFA[sp] = new TH1F(TString::Format("fhPureTrackLengthTOFA_%s", speciesName[sp]).Data(), + TString::Format("Track Length of Pure %s with TOF; L (cm)", speciesTitle[sp]).Data(), + 1000, 0.0, 1000.0); + fhPureTrackTimeA[sp] = new TH2F(TString::Format("fhPureTrackTimeA_%s", speciesName[sp]).Data(), + TString::Format("Track Time vs P Pure %s; P (GeV/c); Track Time(ns)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); + fhPureTrackBetaInvA[sp] = new TH2F(TString::Format("fhPureTrackBetaInvA_%s", speciesName[sp]).Data(), + TString::Format("1/#Beta vs P Pure %s; P (GeV/c); 1/#Beta(ns/m)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); + fhPureTrackTimeIPA[sp] = new TH2F(TString::Format("fhPureTrackTimeIPA_%s", speciesName[sp]).Data(), + TString::Format("Track Time vs P_{IP} Pure %s; P (GeV/c); Track Time(ns)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); + fhPureTrackBetaInvIPA[sp] = new TH2F(TString::Format("fhPureTrackBetaInvIPA_%s", speciesName[sp]).Data(), + TString::Format("1/#Beta vs P_{IP} Pure %s; P (GeV/c); 1/#Beta(ns/m)", speciesTitle[sp]).Data(), + ptbins, ptlow, ptup, 1000, 0.0, 10.0); } if (makeNSigmaPlots) { for (int sp1 = 0; sp1 < kIdBfNoOfSpecies; ++sp1) { @@ -1061,6 +1323,15 @@ struct IdentifiedBfFilterTracks { TString::Format("N #sigma %s from TOF vs P for generated %s;N #sigma;p (GeV/c)", speciesTitle[sp1], speciesTitle[sp2]).Data(), 48, -6, 6, ptbins, ptlow, ptup); + fhPrimaryNSigmaTPC[sp1][sp2] = new TH2F(TString::Format("fhPrimaryNSigmaTPC%s_%s", speciesName[sp1], speciesName[sp2]).Data(), + TString::Format("N #sigma %s from TPC vs P for primary %s;N #sigma;p (GeV/c)", speciesTitle[sp1], speciesTitle[sp2]).Data(), + 48, -6, 6, + ptbins, ptlow, ptup); + + fhPrimaryNSigmaTOF[sp1][sp2] = new TH2F(TString::Format("fhPrimaryNSigmaTOF%s_%s", speciesName[sp1], speciesName[sp2]).Data(), + TString::Format("N #sigma %s from TOF vs P for primary %s;N #sigma;p (GeV/c)", speciesTitle[sp1], speciesTitle[sp2]).Data(), + 48, -6, 6, + ptbins, ptlow, ptup); } } } @@ -1082,6 +1353,16 @@ struct IdentifiedBfFilterTracks { fOutputList->Add(fhTruePhiB); fOutputList->Add(fhTruePhiA); fOutputList->Add(fhTrueDCAxyB); + fOutputList->Add(fhPrimaryPB); + fOutputList->Add(fhPrimaryPtB); + fOutputList->Add(fhPrimarydEdxB); + fOutputList->Add(fhPrimarydEdxIPTPCB); + fOutputList->Add(fhPrimaryTrackLengthB); + fOutputList->Add(fhPrimaryTrackLengthTOFB); + fOutputList->Add(fhPrimaryTrackTimeB); + fOutputList->Add(fhPrimaryTrackBetaInvB); + fOutputList->Add(fhPrimaryTrackTimeIPB); + fOutputList->Add(fhPrimaryTrackBetaInvIPB); if (traceDCAOutliers.mDoIt) { fOutputList->Add(fhTrueDCAxyBid); } @@ -1100,12 +1381,45 @@ struct IdentifiedBfFilterTracks { fOutputList->Add(fhTruePtEtaNegA[sp]); fOutputList->Add(fhTrueNPosNegA[sp]); fOutputList->Add(fhTrueDeltaNA[sp]); + + fOutputList->Add(fhTruedEdxA[sp]); + fOutputList->Add(fhTruedEdxIPTPCA[sp]); + fOutputList->Add(fhTrueTrackLengthA[sp]); + fOutputList->Add(fhTrueTrackLengthTOFA[sp]); + fOutputList->Add(fhTrueTrackTimeA[sp]); + fOutputList->Add(fhTrueTrackBetaInvA[sp]); + fOutputList->Add(fhTrueTrackTimeIPA[sp]); + fOutputList->Add(fhTrueTrackBetaInvIPA[sp]); + + fOutputList->Add(fhPrimaryPA[sp]); + fOutputList->Add(fhPrimaryPtA[sp]); + fOutputList->Add(fhPrimarydEdxA[sp]); + fOutputList->Add(fhPrimarydEdxIPTPCA[sp]); + fOutputList->Add(fhPrimaryTrackLengthA[sp]); + fOutputList->Add(fhPrimaryTrackLengthTOFA[sp]); + fOutputList->Add(fhPrimaryTrackTimeA[sp]); + fOutputList->Add(fhPrimaryTrackBetaInvA[sp]); + fOutputList->Add(fhPrimaryTrackTimeIPA[sp]); + fOutputList->Add(fhPrimaryTrackBetaInvIPA[sp]); + + fOutputList->Add(fhPurePA[sp]); + fOutputList->Add(fhPurePtA[sp]); + fOutputList->Add(fhPuredEdxA[sp]); + fOutputList->Add(fhPuredEdxIPTPCA[sp]); + fOutputList->Add(fhPureTrackLengthA[sp]); + fOutputList->Add(fhPureTrackLengthTOFA[sp]); + fOutputList->Add(fhPureTrackTimeA[sp]); + fOutputList->Add(fhPureTrackBetaInvA[sp]); + fOutputList->Add(fhPureTrackTimeIPA[sp]); + fOutputList->Add(fhPureTrackBetaInvIPA[sp]); } if (makeNSigmaPlots) { for (int sp1 = 0; sp1 < kIdBfNoOfSpecies; ++sp1) { for (int sp2 = 0; sp2 < kIdBfNoOfSpecies; ++sp2) { fOutputList->Add(fhTrueNSigmaTPC[sp1][sp2]); fOutputList->Add(fhTrueNSigmaTOF[sp1][sp2]); + fOutputList->Add(fhPrimaryNSigmaTPC[sp1][sp2]); + fOutputList->Add(fhPrimaryNSigmaTOF[sp1][sp2]); } } } @@ -1131,6 +1445,10 @@ struct IdentifiedBfFilterTracks { void fillTrackHistosBeforeSelection(TrackObject const& track); template void fillTrackHistosAfterSelection(TrackObject const& track, MatchRecoGenSpecies sp); + template + bool isPrimary(ParticleObject const& particle); + template + void fillRealPIDTrackHistosAfter(TrackObject const& track, MatchRecoGenSpecies sp); template void fillParticleHistosBeforeSelection(ParticleObject const& particle, MCCollisionObject const& collision, @@ -1147,6 +1465,7 @@ struct IdentifiedBfFilterTracks { void filterTracks(soa::Join const& collisions, passedtracks const& tracks) { + // LOGF(info, "Top of filterTracks"); int naccepted = 0; int ncollaccepted = 0; if (!fullDerivedData) { @@ -1344,6 +1663,7 @@ template inline MatchRecoGenSpecies IdentifiedBfFilterTracks::identifyParticle(ParticleObject const& particle) { using namespace identifiedbffilter; + // LOGF(info, "Top of identifyParticle"); int pdgcode = std::fabs(particle.pdgCode()); @@ -1374,29 +1694,7 @@ inline MatchRecoGenSpecies IdentifiedBfFilterTracks::identifyParticle(ParticleOb template inline void IdentifiedBfFilterTracks::identifyPIDMismatch(ParticleObject const& particle, MatchRecoGenSpecies const& trkId) { - MatchRecoGenSpecies realPID = kWrongSpecies; - int pdgcode = std::fabs(particle.pdgCode()); - - switch (pdgcode) { - case kPositron: - realPID = kIdBfElectron; - break; - case kPiPlus: - realPID = kIdBfPion; - break; - case kKPlus: - realPID = kIdBfKaon; - break; - case kProton: - realPID = kIdBfProton; - break; - default: - if (traceOutOfSpeciesParticles) { - LOGF(info, "Wrong particle passed selection cuts. PDG code: %d", pdgcode); - } - realPID = kWrongSpecies; - break; - } + MatchRecoGenSpecies realPID = identifyParticle(particle); if (!(realPID < 0)) { if (realPID == trkId) { fhTruePIDCorrect->Fill(realPID); @@ -1410,28 +1708,7 @@ template inline void IdentifiedBfFilterTracks::identifyRealNSigma(ParticleObject const& particle, std::vector tpcNSigma, std::vector tofNSigma, float tpcInnerParam) { - MatchRecoGenSpecies realPID = kWrongSpecies; - int pdgcode = std::fabs(particle.pdgCode()); - switch (pdgcode) { - case kPositron: - realPID = kIdBfElectron; - break; - case kPiPlus: - realPID = kIdBfPion; - break; - case kKPlus: - realPID = kIdBfKaon; - break; - case kProton: - realPID = kIdBfProton; - break; - default: - if (traceOutOfSpeciesParticles) { - LOGF(info, "Wrong particle passed selection cuts. PDG code: %d", pdgcode); - } - realPID = kWrongSpecies; - break; - } + MatchRecoGenSpecies realPID = identifyParticle(particle); if (!(realPID < 0)) { fhTrueNSigmaTPC[kIdBfElectron][realPID]->Fill(tpcNSigma[kIdBfElectron], tpcInnerParam); fhTrueNSigmaTOF[kIdBfElectron][realPID]->Fill(tofNSigma[kIdBfElectron], tpcInnerParam); @@ -1441,6 +1718,17 @@ inline void IdentifiedBfFilterTracks::identifyRealNSigma(ParticleObject const& p fhTrueNSigmaTOF[kIdBfKaon][realPID]->Fill(tofNSigma[kIdBfKaon], tpcInnerParam); fhTrueNSigmaTPC[kIdBfProton][realPID]->Fill(tpcNSigma[kIdBfProton], tpcInnerParam); fhTrueNSigmaTOF[kIdBfProton][realPID]->Fill(tofNSigma[kIdBfProton], tpcInnerParam); + + if (particle.isPhysicalPrimary()) { + fhPrimaryNSigmaTPC[kIdBfElectron][realPID]->Fill(tpcNSigma[kIdBfElectron], tpcInnerParam); + fhPrimaryNSigmaTOF[kIdBfElectron][realPID]->Fill(tofNSigma[kIdBfElectron], tpcInnerParam); + fhPrimaryNSigmaTPC[kIdBfPion][realPID]->Fill(tpcNSigma[kIdBfPion], tpcInnerParam); + fhPrimaryNSigmaTOF[kIdBfPion][realPID]->Fill(tofNSigma[kIdBfPion], tpcInnerParam); + fhPrimaryNSigmaTPC[kIdBfKaon][realPID]->Fill(tpcNSigma[kIdBfKaon], tpcInnerParam); + fhPrimaryNSigmaTOF[kIdBfKaon][realPID]->Fill(tofNSigma[kIdBfKaon], tpcInnerParam); + fhPrimaryNSigmaTPC[kIdBfProton][realPID]->Fill(tpcNSigma[kIdBfProton], tpcInnerParam); + fhPrimaryNSigmaTOF[kIdBfProton][realPID]->Fill(tofNSigma[kIdBfProton], tpcInnerParam); + } } } @@ -1524,59 +1812,38 @@ inline MatchRecoGenSpecies IdentifiedBfFilterTracks::identifyTrack(TrackObject c } } - if (track.tpcInnerParam() < tofCut && !onlyTOF) { + for (int iSp = 0; iSp < kIdBfNoOfSpecies; iSp++) { - for (int iSp = 0; iSp < kIdBfNoOfSpecies; iSp++) { + if (track.tpcInnerParam() < tofCut[iSp] && track.tpcInnerParam() < tpcCut[iSp] && !onlyTOF) { nsigmas[iSp] = actualTPCNSigma[iSp]; - } - } else { - /* introduce require TOF flag */ - if (track.hasTOF() && !onlyTOF) { - // TODO: Add an output that tells if TOF was used for PID and at what momentum - for (int iSp = 0; iSp < kIdBfNoOfSpecies; iSp++) { - nsigmas[iSp] = sqrtf(actualTPCNSigma[iSp] * actualTPCNSigma[iSp] + actualTOFNSigma[iSp] * actualTOFNSigma[iSp]); - } - } else if (!track.hasTOF() && !reqTOF && !onlyTOF) { - for (int iSp = 0; iSp < kIdBfNoOfSpecies; iSp++) { - nsigmas[iSp] = actualTPCNSigma[iSp]; - } - - } else if (track.hasTOF() && onlyTOF) { - for (int iSp = 0; iSp < kIdBfNoOfSpecies; iSp++) { - nsigmas[iSp] = actualTOFNSigma[iSp]; - } + } else if (track.tpcInnerParam() > tofCut[iSp] && track.tpcInnerParam() < tpcCut[iSp] && !onlyTOF && track.hasTOF()) { + nsigmas[iSp] = sqrtf(actualTPCNSigma[iSp] * actualTPCNSigma[iSp] + actualTOFNSigma[iSp] * actualTOFNSigma[iSp]); + } else if (track.hasTOF() && ((track.tpcInnerParam() > tofCut[iSp] && track.tpcInnerParam() > tpcCut[iSp]) || onlyTOF)) { + nsigmas[iSp] = actualTOFNSigma[iSp]; } else { return kWrongSpecies; } } - if (!pidEl) { - nsigmas[kIdBfElectron] = 999.0f; - } - if (!pidPi) { - nsigmas[kIdBfPion] = 999.0f; - } - if (!pidKa) { - nsigmas[kIdBfKaon] = 999.0f; - } - if (!pidPr) { - nsigmas[kIdBfProton] = 999.0f; - } - float minNSigma = 999.0f; MatchRecoGenSpecies spMinNSigma = kWrongSpecies; for (int sp = 0; sp < kIdBfNoOfSpecies; ++sp) { - if (std::fabs(nsigmas[sp]) < std::fabs(minNSigma)) { // Check if species nsigma is less than current nsigma - minNSigma = nsigmas[sp]; // If yes, set species nsigma to current nsigma - spMinNSigma = MatchRecoGenSpecies(sp); // set current species sp number to current sp + if (doPID[sp]) { // Check if we're IDing PID for this species + if (std::fabs(nsigmas[sp]) < std::fabs(minNSigma)) { // Check if species nsigma is less than current nsigma + minNSigma = nsigmas[sp]; // If yes, set species nsigma to current nsigma + spMinNSigma = MatchRecoGenSpecies(sp); // set current species sp number to current sp + } } } bool doublematch = false; MatchRecoGenSpecies spDouble = kWrongSpecies; - if (minNSigma < maxPIDSigma && minNSigma > minPIDSigma) { // Check that current nsigma is in accpetance range + // LOGF(info,"Looking at accept range"); + if (minNSigma < acceptRange[spMinNSigma][1] && minNSigma > acceptRange[spMinNSigma][0]) { // Check that current nsigma is in accpetance range + // LOGF(info,"In accept Range"); for (int sp = 0; (sp < kIdBfNoOfSpecies) && !doublematch; ++sp) { // iterate over all species while there's no double match and we're in the list if (sp != spMinNSigma) { // for species not current minimum nsigma species - if (nsigmas[sp] < maxRejectSigma && nsigmas[sp] > minRejectSigma) { // If secondary species is in rejection range + // LOGF(info, "looking at Reject Range"); + if (std::fabs(nsigmas[sp]) < rejectRange[spMinNSigma][sp]) { // If secondary species is in rejection range doublematch = true; // Set double match true spDouble = MatchRecoGenSpecies(sp); } @@ -1586,8 +1853,14 @@ inline MatchRecoGenSpecies IdentifiedBfFilterTracks::identifyTrack(TrackObject c fhWrongTrackID->Fill(track.p()); fhdEdxA[kIdBfNoOfSpecies]->Fill(track.p(), track.tpcSignal()); fhdEdxIPTPCA[kIdBfNoOfSpecies]->Fill(track.tpcInnerParam(), track.tpcSignal()); - fhTrackTimeA[kIdBfNoOfSpecies]->Fill(track.tpcInnerParam(), track.trackTime()); - fhTrackBetaA[kIdBfNoOfSpecies]->Fill(track.tpcInnerParam(), track.trackTime() / track.length()); + fhTrackLengthA[kIdBfNoOfSpecies]->Fill(track.length()); + fhTrackTimeA[kIdBfNoOfSpecies]->Fill(track.p(), (track.trackTime())); + fhTrackTimeIPA[kIdBfNoOfSpecies]->Fill(track.tpcInnerParam(), (track.trackTime())); + + if constexpr (framework::has_type_v) { + fhTrackBetaInvA[kIdBfNoOfSpecies]->Fill(track.p(), 1 / track.beta()); + fhTrackBetaInvIPA[kIdBfNoOfSpecies]->Fill(track.tpcInnerParam(), 1 / track.beta()); + } fhDoublePID->Fill(spMinNSigma, spDouble); return kWrongSpecies; // Return wrong species value } else { @@ -1610,17 +1883,21 @@ inline MatchRecoGenSpecies IdentifiedBfFilterTracks::identifyTrack(TrackObject c template inline int8_t IdentifiedBfFilterTracks::acceptTrack(TrackObject const& track) { + // LOGF(info,"Top of acceptTrack"); fillTrackHistosBeforeSelection(track); // ) { if (track.mcParticleId() < 0) { + // LOGF(info,"No matching MC particle"); return -1; } } if (matchTrackType(track)) { + // LOGF(info, "Track type match"); if (ptlow < track.pt() && track.pt() < ptup && etalow < track.eta() && track.eta() < etaup) { + // LOGF(info, "Track Accepted"); fillTrackHistosAfterSelection(track, kIdBfCharged); MatchRecoGenSpecies sp = kWrongSpecies; if (recoIdMethod == recoIdMethods[0]) { @@ -1730,6 +2007,7 @@ inline int8_t IdentifiedBfFilterTracks::acceptParticle(ParticleObject& particle, template int8_t IdentifiedBfFilterTracks::selectTrackAmbiguousCheck(CollisionObjects const& collisions, TrackObject const& track) { + // LOGF(info,"Top of AmbiguousCheck"); bool ambiguoustrack = false; int tracktype = 0; /* no ambiguous */ std::vector zvertexes{}; @@ -1806,12 +2084,96 @@ void IdentifiedBfFilterTracks::fillTrackHistosBeforeSelection(TrackObject const& fhDCAxyB->Fill(track.dcaXY()); fhDCAzB->Fill(track.dcaZ()); fhDCAxyzB->Fill(track.dcaXY(), track.dcaZ()); + + if constexpr (framework::has_type_v) { + + if (isPrimary(track.template mcParticle_as())) { + fhPrimaryPB->Fill(track.p()); + fhPrimaryPtB->Fill(track.pt()); + fhPrimarydEdxB->Fill(track.p(), track.tpcSignal()); + fhPrimarydEdxIPTPCB->Fill(track.tpcInnerParam(), track.tpcSignal()); + fhPrimaryTrackLengthB->Fill(track.length()); + if (track.hasTOF() && track.p() > tofCut[0]) { + fhPrimaryTrackLengthTOFB->Fill(track.length()); + fhPrimaryTrackTimeB->Fill(track.p(), (track.trackTime())); + fhPrimaryTrackTimeIPB->Fill(track.tpcInnerParam(), (track.trackTime())); + + if constexpr (framework::has_type_v) { + fhPrimaryTrackBetaInvB->Fill(track.p(), 1 / track.beta()); + fhPrimaryTrackBetaInvIPB->Fill(track.tpcInnerParam(), 1 / track.beta()); + } + } + } + } } +template +bool IdentifiedBfFilterTracks::isPrimary(ParticleObject const& particle) +{ + return particle.isPhysicalPrimary(); +} +template +void IdentifiedBfFilterTracks::fillRealPIDTrackHistosAfter(TrackObject const& track, MatchRecoGenSpecies sp) +{ + if constexpr (framework::has_type_v) { + MatchRecoGenSpecies realPID = identifyParticle(track.template mcParticle_as()); + if (!(realPID < 0)) { + fhTruedEdxA[realPID]->Fill(track.p(), track.tpcSignal()); + fhTruedEdxIPTPCA[realPID]->Fill(track.tpcInnerParam(), track.tpcSignal()); + fhTrueTrackLengthA[realPID]->Fill(track.length()); + if (track.hasTOF() && track.p() > tofCut[realPID]) { + fhTrueTrackLengthTOFA[realPID]->Fill(track.length()); + fhTrueTrackTimeA[realPID]->Fill(track.p(), (track.trackTime())); + fhTrueTrackTimeIPA[realPID]->Fill(track.tpcInnerParam(), (track.trackTime())); + if constexpr (framework::has_type_v) { + fhTrueTrackBetaInvA[realPID]->Fill(track.p(), 1 / track.beta()); + fhTrueTrackBetaInvIPA[realPID]->Fill(track.tpcInnerParam(), 1 / track.beta()); + } + } + } + + if (isPrimary(track.template mcParticle_as())) { + fhPrimaryPA[sp]->Fill(track.p()); + fhPrimaryPtA[sp]->Fill(track.pt()); + fhPrimarydEdxA[sp]->Fill(track.p(), track.tpcSignal()); + fhPrimarydEdxIPTPCA[sp]->Fill(track.tpcInnerParam(), track.tpcSignal()); + fhPrimaryTrackLengthA[sp]->Fill(track.length()); + if (track.hasTOF() && track.p() > tofCut[sp]) { + fhPrimaryTrackLengthTOFA[sp]->Fill(track.length()); + fhPrimaryTrackTimeA[sp]->Fill(track.p(), (track.trackTime())); + fhPrimaryTrackTimeIPA[sp]->Fill(track.tpcInnerParam(), (track.trackTime())); + + if constexpr (framework::has_type_v) { + fhPrimaryTrackBetaInvA[sp]->Fill(track.p(), 1 / track.beta()); + fhPrimaryTrackBetaInvIPA[sp]->Fill(track.tpcInnerParam(), 1 / track.beta()); + } + } + + if (sp == realPID) { + fhPurePA[realPID]->Fill(track.p()); + fhPurePtA[realPID]->Fill(track.pt()); + fhPuredEdxA[realPID]->Fill(track.p(), track.tpcSignal()); + fhPuredEdxIPTPCA[realPID]->Fill(track.tpcInnerParam(), track.tpcSignal()); + fhPureTrackLengthA[realPID]->Fill(track.length()); + if (track.hasTOF() && track.p() > tofCut[realPID]) { + fhPureTrackLengthTOFA[realPID]->Fill(track.length()); + fhPureTrackTimeA[realPID]->Fill(track.p(), (track.trackTime())); + fhPureTrackTimeIPA[realPID]->Fill(track.tpcInnerParam(), (track.trackTime())); + + if constexpr (framework::has_type_v) { + fhPureTrackBetaInvA[realPID]->Fill(track.p(), 1 / track.beta()); + fhPureTrackBetaInvIPA[realPID]->Fill(track.tpcInnerParam(), 1 / track.beta()); + } + } + } + } + } +} template void IdentifiedBfFilterTracks::fillTrackHistosAfterSelection(TrackObject const& track, MatchRecoGenSpecies sp) { /* the charged species should have been called first so avoid double counting */ + // LOGF(info,"Top of AfterSelection"); if (sp == kIdBfCharged) { fhEtaA->Fill(track.eta()); fhPhiA->Fill(track.phi()); @@ -1837,8 +2199,17 @@ void IdentifiedBfFilterTracks::fillTrackHistosAfterSelection(TrackObject const& fhPtA[sp]->Fill(track.pt()); fhdEdxA[sp]->Fill(track.p(), track.tpcSignal()); fhdEdxIPTPCA[sp]->Fill(track.tpcInnerParam(), track.tpcSignal()); - fhTrackTimeA[sp]->Fill(track.tpcInnerParam(), track.trackTime()); - fhTrackBetaA[sp]->Fill(track.tpcInnerParam(), track.trackTime() / track.length()); + fhTrackLengthA[sp]->Fill(track.length()); + if (track.hasTOF() && track.p() > tofCut[sp]) { + fhTrackLengthTOFA[sp]->Fill(track.length()); + fhTrackTimeA[sp]->Fill(track.p(), (track.trackTime())); + fhTrackTimeIPA[sp]->Fill(track.tpcInnerParam(), (track.trackTime())); + + if constexpr (framework::has_type_v) { + fhTrackBetaInvA[sp]->Fill(track.p(), 1 / track.beta()); + fhTrackBetaInvIPA[sp]->Fill(track.tpcInnerParam(), 1 / track.beta()); + } + } if (track.sign() > 0) { fhPtPosA[sp]->Fill(track.pt()); fhPtEtaPosA[sp]->Fill(track.pt(), track.eta()); @@ -1846,6 +2217,9 @@ void IdentifiedBfFilterTracks::fillTrackHistosAfterSelection(TrackObject const& fhPtNegA[sp]->Fill(track.pt()); fhPtEtaNegA[sp]->Fill(track.pt(), track.eta()); } + if ((fDataType != kData) && (fDataType != kDataNoEvtSel)) { + fillRealPIDTrackHistosAfter(track, sp); + } } template @@ -1911,7 +2285,6 @@ void IdentifiedBfFilterTracks::fillParticleHistosAfterSelection(ParticleObject c fhTruePtEtaNegA[sp]->Fill(particle.pt(), particle.eta()); } } - WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { WorkflowSpec workflow{adaptAnalysisTask(cfgc, diff --git a/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.h b/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.h index f92ecbd813f..7335b36c421 100644 --- a/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.h +++ b/PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.h @@ -160,6 +160,13 @@ int phibins = 72; float philow = 0.0; float phiup = constants::math::TwoPI; +std::vector> acceptRange; +std::vector> rejectRange; + +std::vector doPID; +std::vector tofCut; +std::vector tpcCut; + int tracktype = 1; std::vector trackFilters = {}; @@ -590,7 +597,9 @@ template inline bool centralitySelectionMult(CollisionObject collision, float& centmult) { float mult = getCentMultPercentile(collision); - if (mult < 100 && 0 < mult) { + int maxMult = 100; + int minMult = 0; + if (mult < maxMult && minMult < mult) { centmult = mult; return true; } @@ -672,7 +681,9 @@ inline bool centralitySelection inline bool centralitySelection(aod::McCollision const&, float& centmult) { - if (centmult < 100 && 0 < centmult) { + int maxMult = 100; + int minMult = 0; + if (centmult < maxMult && minMult < centmult) { return true; } else { return false; @@ -750,7 +761,10 @@ void exploreMothers(ParticleObject& particle, MCCollisionObject& collision) inline float getCharge(float pdgCharge) { - float charge = (pdgCharge / 3 >= 1) ? 1.0 : ((pdgCharge / 3 <= -1) ? -1.0 : 0); + int posCharge = 1; + int negCharge = -1; + int denom = 3; + float charge = (pdgCharge / denom >= posCharge) ? 1.0 : ((pdgCharge / denom <= negCharge) ? -1.0 : 0); return charge; } From d50ff9f7eee18e16dfcecf3437589f7b7fd0d92b Mon Sep 17 00:00:00 2001 From: Francesco Mazzaschi <43742195+fmazzasc@users.noreply.github.com> Date: Fri, 16 May 2025 14:18:31 +0200 Subject: [PATCH 1299/1650] [PWGLF] Add feed-down from beauty (#11222) Co-authored-by: Francesco Mazzaschi --- PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx | 21 ++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx index 134a1a150cf..bc3ea5128f7 100644 --- a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx +++ b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx @@ -183,6 +183,7 @@ constexpr float charges[5]{1.f, 1.f, 1.f, 2.f, 2.f}; constexpr float masses[5]{MassProton, MassDeuteron, MassTriton, MassHelium3, MassAlpha}; static const std::vector matter{"M", "A"}; static const std::vector pidName{"TPC", "TOF"}; +static const std::vector hfMothCodes{511, 521, 531, 541, 5122}; // b-mesons + Lambda_b static const std::vector names{"proton", "deuteron", "triton", "He3", "alpha"}; static const std::vector treeConfigNames{"Filter trees", "Use TOF selection"}; static const std::vector flowConfigNames{"Save flow hists"}; @@ -948,6 +949,17 @@ struct nucleiSpectra { if (particle.getProcess() == 4) { c.fromWeakDecay = true; } + } else { + // if the particle has a hf mother it is flagged as secondary + if (particle.has_mothers()) { + for (auto& motherparticle : particle.mothers_as()) { + if (std::find(nuclei::hfMothCodes.begin(), nuclei::hfMothCodes.end(), std::abs(motherparticle.pdgCode())) != nuclei::hfMothCodes.end()) { + c.isSecondary = true; + c.fromWeakDecay = true; + break; + } + } + } } if (c.fillDCAHist && cfgDCAHists->get(iS, c.pt < 0)) { @@ -962,6 +974,15 @@ struct nucleiSpectra { isReconstructed[particle.globalIndex()] = true; if (particle.isPhysicalPrimary()) { c.flags |= kIsPhysicalPrimary; + if (particle.has_mothers()) { + for (auto& motherparticle : particle.mothers_as()) { + if (std::find(nuclei::hfMothCodes.begin(), nuclei::hfMothCodes.end(), std::abs(motherparticle.pdgCode())) != nuclei::hfMothCodes.end()) { + c.flags |= kIsSecondaryFromWeakDecay; + MotherpdgCode = motherparticle.pdgCode(); + break; + } + } + } } else if (particle.has_mothers()) { c.flags |= kIsSecondaryFromWeakDecay; for (auto& motherparticle : particle.mothers_as()) { From e19518360729fd33abfe267d63741fc17c49f366 Mon Sep 17 00:00:00 2001 From: omvazque Date: Fri, 16 May 2025 08:43:54 -0500 Subject: [PATCH 1300/1650] [PWGLF] Update on ccdb fetching (#11226) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 153 +++++++++---------- 1 file changed, 72 insertions(+), 81 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index 78e327cc372..e06ec1c6c8f 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -169,11 +169,6 @@ struct UccZdc { Configurable paTHmeanNch{"paTHmeanNch", "Users/o/omvazque/FitMeanNch_9May2025", "base path to the ccdb object"}; Configurable paTHsigmaNch{"paTHsigmaNch", "Users/o/omvazque/FitSigmaNch_9May2025", "base path to the ccdb object"}; - // the efficiency has been previously stored in the CCDB as TH1F histogram - TH1F* efficiency = nullptr; - TF1* fSigmaNch = nullptr; - TF1* fMeanNch = nullptr; - void init(InitContext const&) { // define axes you want to use @@ -208,6 +203,7 @@ struct UccZdc { x->SetBinLabel(16, "Within TDC cut?"); x->SetBinLabel(17, "Within ZEM cut?"); + LOG(info) << "\tuseTimeStamps=" << useTimeStamps.value; LOG(info) << "\titsRequirement=" << itsRequirement.value; LOG(info) << "\trequireITS=" << requireITS.value; LOG(info) << "\trequireTPC=" << requireTPC.value; @@ -512,13 +508,15 @@ struct UccZdc { registry.fill(HIST("hEventCounter"), EvCutLabel::Zem); } - bool areParsLoaded{false}; - if (useTimeStamps) { - areParsLoaded = loadMeanSigmaNchParams(foundBC.timestamp()); - } else { - areParsLoaded = loadMeanSigmaNchParams(foundBC.runNumber()); + // Load Mean Nch and Sigma Nch from CCDB + auto fMeanNch = ccdb->getForRun(paTHmeanNch.value, foundBC.runNumber()); + auto fSigmaNch = ccdb->getForRun(paTHsigmaNch.value, foundBC.runNumber()); + if (!fMeanNch) { + LOGF(fatal, "Could not load fMeanNch from %s", paTHmeanNch.value.c_str()); + return; } - if (!areParsLoaded) { + if (!fSigmaNch) { + LOGF(fatal, "Could not load fSigmaNch from %s", paTHsigmaNch.value.c_str()); return; } @@ -669,24 +667,21 @@ struct UccZdc { } // Load Efficiency correction - bool isEffLoaded{false}; - if (useTimeStamps) { - isEffLoaded = loadEfficiencyCorrection(foundBC.timestamp()); - } else { - isEffLoaded = loadEfficiencyCorrection(foundBC.runNumber()); - } - if (!isEffLoaded) { + auto efficiency = ccdb->getForRun(paTH.value, foundBC.runNumber()); + if (!efficiency) { + LOGF(fatal, "Could not load efficiency from %s", paTH.value.c_str()); return; } // Get Nch-based selection objects from the CCDB - bool areParsLoaded{false}; - if (useTimeStamps) { - areParsLoaded = loadMeanSigmaNchParams(foundBC.timestamp()); - } else { - areParsLoaded = loadMeanSigmaNchParams(foundBC.runNumber()); + auto fMeanNch = ccdb->getForRun(paTHmeanNch.value, foundBC.runNumber()); + auto fSigmaNch = ccdb->getForRun(paTHsigmaNch.value, foundBC.runNumber()); + if (!fMeanNch) { + LOGF(fatal, "Could not load fMeanNch from %s", paTHmeanNch.value.c_str()); + return; } - if (!areParsLoaded) { + if (!fSigmaNch) { + LOGF(fatal, "Could not load fSigmaNch from %s", paTHsigmaNch.value.c_str()); return; } @@ -799,13 +794,14 @@ struct UccZdc { } // Load Efficiency correction - bool isEffLoaded{false}; - if (useTimeStamps) { - isEffLoaded = loadEfficiencyCorrection(foundBC.timestamp()); - } else { - isEffLoaded = loadEfficiencyCorrection(foundBC.runNumber()); - } - if (!isEffLoaded) { + // bool isEffLoaded{false}; + // if (useTimeStamps) { isEffLoaded = loadEfficiencyCorrection(foundBC.timestamp()); } + // else { isEffLoaded = loadEfficiencyCorrection(foundBC.runNumber()); } + // if(!isEffLoaded) { return; } + + auto efficiency = ccdb->getForRun(paTH.value, foundBC.runNumber()); + if (!efficiency) { + LOGF(fatal, "Could not load efficiency from %s", paTH.value.c_str()); return; } @@ -1034,64 +1030,59 @@ struct UccZdc { } } + /* template bool loadMeanSigmaNchParams(const T& parameter) { - fMeanNch = nullptr; - fSigmaNch = nullptr; - // Get Nch-based selection objects from the CCDB - if (useTimeStamps) { - fMeanNch = ccdb->getForTimeStamp(paTHmeanNch.value, parameter); - fSigmaNch = ccdb->getForTimeStamp(paTHsigmaNch.value, parameter); - } else { - fMeanNch = ccdb->getForRun(paTHmeanNch.value, parameter); - fSigmaNch = ccdb->getForRun(paTHsigmaNch.value, parameter); - // auto efficiency = ccdb->getForRun(paTH.value, foundBC.runNumber()); - } - if (!fMeanNch) { - LOGF(fatal, "Could not load fMeanNch from %s", paTHmeanNch.value.c_str()); - return false; - } - if (!fSigmaNch) { - LOGF(fatal, "Could not load fSigmaNch from %s", paTHsigmaNch.value.c_str()); - return false; - } - // if (fMeanNch) { - // LOGF(info, "Loaded fMeanNch from %s (%p)", paTHmeanNch.value.c_str(), (void*)fMeanNch); - // } - // if (fSigmaNch) { - // LOGF(info, "Loaded fSigmaNch from %s (%p)", paTHsigmaNch.value.c_str(), (void*)fSigmaNch); - // } - if (!fMeanNch || !fSigmaNch) { - return false; - } else { - return true; - } + fMeanNch = nullptr; + fSigmaNch = nullptr; + // Get Nch-based selection objects from the CCDB + if(useTimeStamps){ + fMeanNch = ccdb->getForTimeStamp(paTHmeanNch.value, parameter); + fSigmaNch = ccdb->getForTimeStamp(paTHsigmaNch.value, parameter); + } else{ + fMeanNch = ccdb->getForRun(paTHmeanNch.value, parameter); + fSigmaNch = ccdb->getForRun(paTHsigmaNch.value, parameter); + // auto efficiency = ccdb->getForRun(paTH.value, foundBC.runNumber()); + } + if (!fMeanNch) { + LOGF(fatal, "Could not load fMeanNch from %s", paTHmeanNch.value.c_str()); + return false; + } + if (!fSigmaNch) { + LOGF(fatal, "Could not load fSigmaNch from %s", paTHsigmaNch.value.c_str()); + return false; + } + // if (fMeanNch) { + // LOGF(info, "Loaded fMeanNch from %s (%p)", paTHmeanNch.value.c_str(), (void*)fMeanNch); + // } + // if (fSigmaNch) { + // LOGF(info, "Loaded fSigmaNch from %s (%p)", paTHsigmaNch.value.c_str(), (void*)fSigmaNch); + // } + if(!fMeanNch || !fSigmaNch) { return false; } + else{ return true; } } template bool loadEfficiencyCorrection(const T& parameter) { - efficiency = nullptr; - // Get Nch-based selection objects from the CCDB - if (useTimeStamps) { - efficiency = ccdb->getForTimeStamp(paTH.value, parameter); - } else { - efficiency = ccdb->getForRun(paTH.value, parameter); - } - if (!efficiency) { - LOGF(fatal, "Could not load efficiency from %s", paTH.value.c_str()); - return false; - } - // if (efficiency) { - // LOGF(info, "Loaded efficiency from %s (%p)", paTH.value.c_str(), (void*)efficiency); - // } - if (!efficiency) { - return false; - } else { - return true; - } - } + efficiency = nullptr; + // Get Nch-based selection objects from the CCDB + if(useTimeStamps){ + efficiency = ccdb->getForTimeStamp(paTH.value, parameter); + } else{ + efficiency = ccdb->getForRun(paTH.value, parameter); + } + if (!efficiency) { + LOGF(fatal, "Could not load efficiency from %s", paTH.value.c_str()); + return false; + } + // if (efficiency) { + // LOGF(info, "Loaded efficiency from %s (%p)", paTH.value.c_str(), (void*)efficiency); + // } + if(!efficiency) { return false; } + else{ return true; } + }*/ }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 19f6c9df746e292139809bea0553e1b01ab2e6d3 Mon Sep 17 00:00:00 2001 From: Evgeny Kryshen Date: Fri, 16 May 2025 18:37:45 +0300 Subject: [PATCH 1301/1650] [Common] Fix for unanchored Run 3 MC (#11223) --- Common/TableProducer/eventSelection.cxx | 84 +++++++++++++++---------- 1 file changed, 51 insertions(+), 33 deletions(-) diff --git a/Common/TableProducer/eventSelection.cxx b/Common/TableProducer/eventSelection.cxx index 1e55b6288a3..1418e42604f 100644 --- a/Common/TableProducer/eventSelection.cxx +++ b/Common/TableProducer/eventSelection.cxx @@ -266,16 +266,31 @@ struct BcSelectionTask { if (run != lastRun) { lastRun = run; - auto runInfo = o2::parameters::AggregatedRunInfo::buildAggregatedRunInfo(o2::ccdb::BasicCCDBManager::instance(), run); - // first bc of the first orbit - bcSOR = runInfo.orbitSOR * nBCsPerOrbit; - // duration of TF in bcs - nBCsPerTF = runInfo.orbitsPerTF * nBCsPerOrbit; - // SOR and EOR timestamps - sorTimestamp = runInfo.sor; - eorTimestamp = runInfo.eor; + int run3min = 500000; + if (run < run3min) { // unanchored Run3 MC + auto runDuration = ccdb->getRunDuration(run, true); // fatalise if timestamps are not found + // SOR and EOR timestamps + sorTimestamp = runDuration.first; // timestamp of the SOR/SOX/STF in ms + eorTimestamp = runDuration.second; // timestamp of the EOR/EOX/ETF in ms + auto ctp = ccdb->getForTimeStamp>("CTP/Calib/OrbitReset", sorTimestamp / 2 + eorTimestamp / 2); + auto orbitResetMUS = (*ctp)[0]; + // first bc of the first orbit + bcSOR = static_cast((sorTimestamp * 1000 - orbitResetMUS) / o2::constants::lhc::LHCOrbitMUS) * nBCsPerOrbit; + // duration of TF in bcs + nBCsPerTF = 32; // hard-coded for Run3 MC (no info from ccdb at the moment) + } else { + auto runInfo = o2::parameters::AggregatedRunInfo::buildAggregatedRunInfo(o2::ccdb::BasicCCDBManager::instance(), run); + // SOR and EOR timestamps + sorTimestamp = runInfo.sor; + eorTimestamp = runInfo.eor; + // first bc of the first orbit + bcSOR = runInfo.orbitSOR * nBCsPerOrbit; + // duration of TF in bcs + nBCsPerTF = runInfo.orbitsPerTF * nBCsPerOrbit; + } + // timestamp of the middle of the run used to access run-wise CCDB entries - int64_t ts = runInfo.sor / 2 + runInfo.eor / 2; + int64_t ts = sorTimestamp / 2 + eorTimestamp / 2; // access ITSROF and TF border margins par = ccdb->getForTimeStamp("EventSelection/EventSelectionParams", ts); mITSROFrameStartBorderMargin = confITSROFrameStartBorderMargin < 0 ? par->fITSROFrameStartBorderMargin : confITSROFrameStartBorderMargin; @@ -336,8 +351,8 @@ struct BcSelectionTask { } int triggerBcShift = confTriggerBcShift; - if (confTriggerBcShift == 999) { - triggerBcShift = (run <= 526766 || (run >= 526886 && run <= 527237) || (run >= 527259 && run <= 527518) || run == 527523 || run == 527734 || run >= 534091) ? 0 : 294; + if (confTriggerBcShift == 999) { // o2-linter: disable=magic-number (special shift for early 2022 data) + triggerBcShift = (run <= 526766 || (run >= 526886 && run <= 527237) || (run >= 527259 && run <= 527518) || run == 527523 || run == 527734 || run >= 534091) ? 0 : 294; // o2-linter: disable=magic-number (magic list of runs) } // bc loop @@ -393,12 +408,14 @@ struct BcSelectionTask { } --bc; backwardMoveCount++; - if (bc.globalBC() + 1 == globalBC) { + int bcDistanceToBeamGasForFT0 = 1; + int bcDistanceToBeamGasForFDD = 5; + if (bc.globalBC() + bcDistanceToBeamGasForFT0 == globalBC) { timeV0ABG = bc.has_fv0a() ? bc.fv0a().time() : -999.f; timeT0ABG = bc.has_ft0() ? bc.ft0().timeA() : -999.f; timeT0CBG = bc.has_ft0() ? bc.ft0().timeC() : -999.f; } - if (bc.globalBC() + 5 == globalBC) { + if (bc.globalBC() + bcDistanceToBeamGasForFDD == globalBC) { timeFDABG = bc.has_fdd() ? bc.fdd().timeA() : -999.f; timeFDCBG = bc.has_fdd() ? bc.fdd().timeC() : -999.f; } @@ -453,7 +470,7 @@ struct BcSelectionTask { LOGP(debug, "prev inactive chips: {} {} {} {} {} {} {}", vPrevInactiveChips[0], vPrevInactiveChips[1], vPrevInactiveChips[2], vPrevInactiveChips[3], vPrevInactiveChips[4], vPrevInactiveChips[5], vPrevInactiveChips[6]); isGoodITSLayer3 = vPrevInactiveChips[3] <= maxInactiveChipsPerLayer->at(3) && vNextInactiveChips[3] <= maxInactiveChipsPerLayer->at(3); isGoodITSLayer0123 = true; - for (int i = 0; i < 4; i++) { + for (int i = 0; i < 4; i++) { // o2-linter: disable=magic-number (counting first 4 ITS layers) isGoodITSLayer0123 &= vPrevInactiveChips[i] <= maxInactiveChipsPerLayer->at(i) && vNextInactiveChips[i] <= maxInactiveChipsPerLayer->at(i); } isGoodITSLayersAll = true; @@ -476,17 +493,17 @@ struct BcSelectionTask { // Temporary workaround to get visible cross section. TODO: store run-by-run visible cross sections in CCDB const char* srun = Form("%d", run); - bool injectionEnergy = (run >= 500000 && run <= 520099) || (run >= 534133 && run <= 534468); + bool injectionEnergy = (run >= 500000 && run <= 520099) || (run >= 534133 && run <= 534468); // o2-linter: disable=magic-number (TODO extract from ccdb) // Cross sections in ub. Using dummy -1 if lumi estimator is not reliable float csTVX = isPP ? (injectionEnergy ? 0.0355e6 : 0.0594e6) : -1.; float csTCE = isPP ? -1. : 10.36e6; float csZEM = isPP ? -1. : 415.2e6; // see AN: https://alice-notes.web.cern.ch/node/1515 float csZNC = isPP ? -1. : 214.5e6; // see AN: https://alice-notes.web.cern.ch/node/1515 - if (run > 543437 && run < 543514) { + if (run > 543437 && run < 543514) { // o2-linter: disable=magic-number (TODO store and extract cross sections from ccdb) csTCE = 8.3e6; } - if (run >= 543514) { - csTCE = 4.10e6; // see AN: https://alice-notes.web.cern.ch/node/1515 + if (run >= 543514) { // o2-linter: disable=magic-number (TODO store and extract cross sections from ccdb) + csTCE = 4.10e6; // see AN: https://alice-notes.web.cern.ch/node/1515 } // Fill TVX (T0 vertex) counters @@ -703,7 +720,7 @@ struct EventSelectionTask { int spdClusters = bc.spdClustersL0() + bc.spdClustersL1(); selection |= (spdClusters < par->fSPDClsVsTklA + nTkl * par->fSPDClsVsTklB) ? BIT(kNoSPDClsVsTklBG) : 0; - selection |= !(nTkl < 6 && multV0C012 > par->fV0C012vsTklA + nTkl * par->fV0C012vsTklB) ? BIT(kNoV0C012vsTklBG) : 0; + selection |= !(nTkl < 6 && multV0C012 > par->fV0C012vsTklA + nTkl * par->fV0C012vsTklB) ? BIT(kNoV0C012vsTklBG) : 0; // o2-linter: disable=magic-number (nTkl dependent parameterization) // copy rct flags from bcsel table uint32_t rct = bc.rct_raw(); @@ -723,7 +740,7 @@ struct EventSelectionTask { sel1 = sel1 && bc.selection_bit(kNoTPCHVdip); // INT1 (SPDFO>0 | V0A | V0C) minimum bias trigger logic used in pp2010 and pp2011 - bool isINT1period = bc.runNumber() <= 136377 || (bc.runNumber() >= 144871 && bc.runNumber() <= 159582); + bool isINT1period = bc.runNumber() <= 136377 || (bc.runNumber() >= 144871 && bc.runNumber() <= 159582); // o2-linter: disable=magic-number (magic run numbers) // fill counters if (isMC == 1 || (!isINT1period && bc.alias_bit(kINT7)) || (isINT1period && bc.alias_bit(kINT1))) { @@ -742,7 +759,8 @@ struct EventSelectionTask { { int run = bcs.iteratorAt(0).runNumber(); // extract bc pattern from CCDB for data or anchored MC only - if (run != lastRun && run >= 500000) { + int run3min = 500000; + if (run != lastRun && run >= run3min) { lastRun = run; auto runInfo = o2::parameters::AggregatedRunInfo::buildAggregatedRunInfo(o2::ccdb::BasicCCDBManager::instance(), run); // first bc of the first orbit @@ -768,7 +786,7 @@ struct EventSelectionTask { for (const auto& bc : bcs) { int64_t globalBC = bc.globalBC(); // skip non-colliding bcs for data and anchored runs - if (run >= 500000 && bcPatternB[globalBC % nBCsPerOrbit] == 0) { + if (run >= run3min && bcPatternB[globalBC % nBCsPerOrbit] == 0) { continue; } if (bc.selection_bit(kIsTriggerTVX)) { @@ -837,7 +855,7 @@ struct EventSelectionTask { float sumTime = 0, sumW = 0, sumHighPtTime = 0, sumHighPtW = 0; for (const auto& track : colPvTracks) { float trackTime = track.trackTime(); - if (track.itsNCls() >= 5) + if (track.itsNCls() >= 5) // o2-linter: disable=magic-number (indeed counting layers 5 6 7) vTracksITS567perColl[colIndex]++; if (track.hasTRD()) vIsVertexTRDmatched[colIndex] = 1; @@ -1109,16 +1127,16 @@ struct EventSelectionTask { if (confUseWeightsForOccupancyVariable) { // weighted occupancy wOccup = 0; - if (dt >= -40 && dt < -5) // collisions in the past - wOccup = 1. / 1225 * (dt + 40) * (dt + 40); - else if (dt >= -5 && dt < 15) // collisions near a given one + if (dt >= -40 && dt < -5) // collisions in the past // o2-linter: disable=magic-number (to be checked by Igor) + wOccup = 1. / 1225 * (dt + 40) * (dt + 40); // o2-linter: disable=magic-number (to be checked by Igor) + else if (dt >= -5 && dt < 15) // collisions near a given one // o2-linter: disable=magic-number (to be checked by Igor) wOccup = 1; // else if (dt >= 15 && dt < 100) // collisions from the future // wOccup = -1. / 85 * dt + 20. / 17; - else if (dt >= 15 && dt < 40) // collisions from the future - wOccup = -0.4 / 25 * dt + 1.24; - else if (dt >= 40 && dt < 100) // collisions from the distant future - wOccup = -0.4 / 60 * dt + 0.6 + 0.8 / 3; + else if (dt >= 15 && dt < 40) // collisions from the future // o2-linter: disable=magic-number (to be checked by Igor) + wOccup = -0.4 / 25 * dt + 1.24; // o2-linter: disable=magic-number (to be checked by Igor) + else if (dt >= 40 && dt < 100) // collisions from the distant future // o2-linter: disable=magic-number (to be checked by Igor) + wOccup = -0.4 / 60 * dt + 0.6 + 0.8 / 3; // o2-linter: disable=magic-number (to be checked by Igor) } nITS567tracksInFullTimeWindow += wOccup * vTracksITS567perColl[thisColIndex]; sumAmpFT0CInFullTimeWindow += wOccup * vAmpFT0CperColl[thisColIndex]; @@ -1131,12 +1149,12 @@ struct EventSelectionTask { // standard cut on other collisions vs delta-times const float driftV = 2.5; // drift velocity in cm/us, TPC drift_length / drift_time = 250 cm / 100 us - if (std::fabs(dt) < 2.0) { // us, complete veto on other collisions + if (std::fabs(dt) < 2.0) { // us, complete veto on other collisions // o2-linter: disable=magic-number (to be checked by Igor) nCollsWithFT0CAboveVetoStandard++; - } else if (dt > -4.0 && dt <= -2.0) { // us, strict veto to suppress fake ITS-TPC matches more + } else if (dt > -4.0 && dt <= -2.0) { // us, strict veto to suppress fake ITS-TPC matches more // o2-linter: disable=magic-number (to be checked by Igor) if (vAmpFT0CperColl[thisColIndex] > confFT0CamplCutVetoOnCollInTimeRange / 5) nCollsWithFT0CAboveVetoStandard++; - } else if (std::fabs(dt) < 8 + std::fabs(vZ) / driftV) { // loose veto, 8 us corresponds to maximum possible |vZ|, which is ~20 cm + } else if (std::fabs(dt) < 8 + std::fabs(vZ) / driftV) { // loose veto, 8 us corresponds to maximum possible |vZ|, which is ~20 cm // o2-linter: disable=magic-number (to be checked by Igor) // counting number of other collisions with multiplicity above threshold if (vAmpFT0CperColl[thisColIndex] > confFT0CamplCutVetoOnCollInTimeRange) nCollsWithFT0CAboveVetoStandard++; From 0ffe02fa7cd59f633e201e4e5e1d8375d24aac45 Mon Sep 17 00:00:00 2001 From: Nicolas Strangmann <77485327+nstrangm@users.noreply.github.com> Date: Fri, 16 May 2025 18:16:17 +0200 Subject: [PATCH 1302/1650] [PWGEM/PhotonMeson] Add gen mult histogram for bc wise analysis (#11227) Co-authored-by: Nicolas Strangmann --- .../TableProducer/bcWiseClusterSkimmer.cxx | 7 +++++++ PWGEM/PhotonMeson/Tasks/mcGeneratorStudies.cxx | 13 ++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/PWGEM/PhotonMeson/TableProducer/bcWiseClusterSkimmer.cxx b/PWGEM/PhotonMeson/TableProducer/bcWiseClusterSkimmer.cxx index 699c48fb8a7..8a09995167d 100644 --- a/PWGEM/PhotonMeson/TableProducer/bcWiseClusterSkimmer.cxx +++ b/PWGEM/PhotonMeson/TableProducer/bcWiseClusterSkimmer.cxx @@ -75,6 +75,7 @@ struct bcWiseClusterSkimmer { Configurable cfgRequirekTVXinEMC{"cfgRequirekTVXinEMC", false, "Only store kTVXinEMC triggered BCs"}; Configurable cfgRequireGoodRCTQuality{"cfgRequireGoodRCTQuality", false, "Only store BCs with good quality of T0 and EMC in RCT"}; Configurable cfgStoreMu{"cfgStoreMu", false, "Calculate and store mu (probablity of a TVX collision in the BC) per BC. Otherwise fill with 0"}; + ConfigurableAxis cfgMultiplicityBinning{"cfgMultiplicityBinning", {1000, 0, 10000}, "Binning used for the binning of the number of particles in the event"}; aod::rctsel::RCTFlagsChecker isFT0EMCGoodRCTChecker{aod::rctsel::kFT0Bad, aod::rctsel::kEMCBad}; parameters::GRPLHCIFData* mLHCIFdata = nullptr; @@ -98,6 +99,8 @@ struct bcWiseClusterSkimmer { for (int iBin = 0; iBin < nEventBins; iBin++) mHistManager.get(HIST("nBCs"))->GetXaxis()->SetBinLabel(iBin + 1, binLabels[iBin]); + mHistManager.add("CentralityVsGenMultiplicity", "Centrality vs number of generated MC particles;Centrality;#bf{#it{N}_{gen}}", HistType::kTH2F, {{102, 0., 102}, cfgMultiplicityBinning}); + LOG(info) << "BC wise cluster skimmer cuts:"; LOG(info) << "------------------------------------"; LOG(info) << "| Timing cut: " << cfgMinTime << " < t < " << cfgMaxTime; @@ -310,6 +313,10 @@ struct bcWiseClusterSkimmer { auto mcCollisionsBC = mcCollisions.sliceBy(mcCollperBC, bc.globalIndex()); for (const auto& mcCollision : mcCollisionsBC) { auto mcParticlesInColl = mcParticles.sliceBy(perMcCollision, mcCollision.globalIndex()); + double centrality = 101.5; + if (collisionsInBC.size() > 0) + centrality = collisionsInBC.iteratorAt(0).centFT0M(); + mHistManager.fill(HIST("CentralityVsGenMultiplicity"), centrality, mcParticlesInColl.size()); for (const auto& mcParticle : mcParticlesInColl) { if (mcParticle.pdgCode() != 111 || std::abs(mcParticle.y()) > cfgRapidityCut || !isGammaGammaDecay(mcParticle, mcParticles) || mcParticle.pt() < cfgMinPtGenPi0) continue; diff --git a/PWGEM/PhotonMeson/Tasks/mcGeneratorStudies.cxx b/PWGEM/PhotonMeson/Tasks/mcGeneratorStudies.cxx index 2ff74efa6c3..41546b0a77d 100644 --- a/PWGEM/PhotonMeson/Tasks/mcGeneratorStudies.cxx +++ b/PWGEM/PhotonMeson/Tasks/mcGeneratorStudies.cxx @@ -31,16 +31,23 @@ struct MCGeneratorStudies { HistogramRegistry mHistManager{"MCGeneratorStudyHistograms"}; Configurable cfgSelectedParticleCode{"cfgSelectedParticleCode", 111, "PDG code of the particle to be investigated"}; Configurable cfgMaxZVertex{"cfgMaxZVertex", 10, "Maximum absolute z-vertex distance (cm)"}; + Configurable cfgRapidityCut{"cfgRapidityCut", 0.8, "Maximum absolute rapditity of selected generated particles"}; + ConfigurableAxis cfgMultiplicityBinning{"cfgMultiplicityBinning", {1000, 0, 10000}, "Binning used for the binning of the number of particles in the event"}; expressions::Filter zVertexFilter = aod::mccollision::posZ < cfgMaxZVertex && aod::mccollision::posZ > -cfgMaxZVertex; - void init(InitContext const&) { mHistManager.add("YieldVsNParticles", "pT of selected particles in all MC collisions vs number of all generated particles in event;#bf{#it{p}_{T} (GeV/#it{c})};#bf{#it{N} (Multiplicity)};#bf{#it{N}}", HistType::kTH2F, {{200, 0, 20}, {1000, 0, 10000}}); } + void init(InitContext const&) + { + mHistManager.add("Multiplicity", "Number of generated particles per MC collision;#bf{#it{N} (Multiplicity)};#bf{#it{N}_{MC collisions}}", HistType::kTH1F, {cfgMultiplicityBinning}); + mHistManager.add("YieldVsMultiplicity", "pT of selected particles in all MC collisions vs number of all generated particles in event;#bf{#it{p}_{T} (GeV/#it{c})};#bf{#it{N} (Multiplicity)};#bf{#it{N}}", HistType::kTH2F, {{200, 0, 20}, cfgMultiplicityBinning}); + } void process(soa::Filtered::iterator const&, aod::McParticles const& mcParticles) { int nParticles = mcParticles.size(); + mHistManager.fill(HIST("Multiplicity"), nParticles); for (auto& mcParticle : mcParticles) { - if (mcParticle.pdgCode() == cfgSelectedParticleCode && std::abs(mcParticle.y()) < 0.8f) - mHistManager.fill(HIST("YieldVsNParticles"), mcParticle.pt(), nParticles); + if (mcParticle.pdgCode() == cfgSelectedParticleCode && std::abs(mcParticle.y()) < cfgRapidityCut) + mHistManager.fill(HIST("YieldVsMultiplicity"), mcParticle.pt(), nParticles); } } }; From baf4d7f530db5c1f49b298044c8e880f6589fb44 Mon Sep 17 00:00:00 2001 From: Ionut Cristian Arsene Date: Fri, 16 May 2025 18:55:53 +0200 Subject: [PATCH 1303/1650] [Infrastructure] Adding Maurice Coquet as code owner for PWG DQ (#11225) Co-authored-by: Ionut Cristian Arsene --- CODEOWNERS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index ddfcd4eda46..3bb7d23b8cd 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -34,7 +34,7 @@ /PWGCF/DataModel @alibuild @jgrosseo @saganatt @victor-gonzalez @zchochul @lgraczykCern @prchakra @lauraser @ariedel-cern @EmilGorm @otonvd @shouqiye @glromane /PWGCF/TableProducer @alibuild @jgrosseo @saganatt @victor-gonzalez @zchochul @lgraczykCern @prchakra @lauraser @ariedel-cern @EmilGorm @otonvd @shouqiye @glromane /PWGCF/Tasks @alibuild @jgrosseo @saganatt @victor-gonzalez @zchochul @lgraczykCern @prchakra @lauraser @ariedel-cern @EmilGorm @otonvd @shouqiye @glromane -/PWGDQ @alibuild @iarsene @dsekihat @feisenhu @lucamicheletti93 +/PWGDQ @alibuild @iarsene @mcoquet @dsekihat @feisenhu @lucamicheletti93 /PWGEM @alibuild @feisenhu @dsekihat @ivorobye /PWGEM/Dilepton @alibuild @mikesas @rbailhac @dsekihat @ivorobye @feisenhu /PWGEM/PhotonMeson @alibuild @mikesas @rbailhac @m-c-danisch @novitzky @mhemmer-cern @dsekihat @@ -61,7 +61,7 @@ /Tools/PIDML @alibuild @saganatt /Tools/ML @alibuild @fcatalan92 @fmazzasc /Tutorials/PWGCF @alibuild @jgrosseo @saganatt @victor-gonzalez @zchochul -/Tutorials/PWGDQ @alibuild @iarsene @dsekihat @feisenhu @lucamicheletti93 +/Tutorials/PWGDQ @alibuild @iarsene @mcoquet @lucamicheletti93 /Tutorials/PWGEM @alibuild @mikesas @rbailhac @dsekihat @ivorobye @feisenhu /Tutorials/PWGHF @alibuild @vkucera @fcolamar @fgrosa @gluparel /Tutorials/PWGJE @alibuild @lhavener @maoyx @nzardosh @mfasDa @fjonasALICE From 573ba7874d7ef142a87933b2bb6e4dcdfad1a48b Mon Sep 17 00:00:00 2001 From: Yash Patley <52608802+yashpatley@users.noreply.github.com> Date: Fri, 16 May 2025 23:50:20 +0530 Subject: [PATCH 1304/1650] [PWGCF] Update lambdaR2Correlation.cxx (#11224) --- .../Tasks/lambdaR2Correlation.cxx | 157 +++++++++++------- 1 file changed, 94 insertions(+), 63 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx index bf76e6973fa..76f6e4db283 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx @@ -148,6 +148,7 @@ enum TrackLabels { kPassV0DauTrackSel, kPassV0KinCuts, kPassV0TopoSel, + kAllV0SelPassed, kAllSelPassed, kNotPrimaryLambda, kNotSecondaryLambda, @@ -259,6 +260,18 @@ struct LambdaTableProducer { Configurable cV0TypeSelFlag{"cV0TypeSelFlag", false, "V0 Type Selection Flag"}; Configurable cV0TypeSelection{"cV0TypeSelection", 1, "V0 Type Selection"}; + // Cascade V0 + Configurable cRemoveCascLambda{"cRemoveCascLambda", false, "Remove Cascade V0s"}; + Configurable cMinCascDcaPosToPV{"cMinCascDcaPosToPV", 0.03, "DCA Casc Pos To PV"}; + Configurable cMinCascDcaNegToPV{"cMinCascDcaNegToPV", 0.03, "DCA Casc Neg To PV"}; + Configurable cMinCascDcaBachToPV{"cMinCascDcaBachToPV", 0.03, "DCA Casc Bach To PV"}; + Configurable cMaxCascDcaDaughters{"cMaxCascDcaDaughters", 1.0, "DCA Casc Dau at Casc Decay Vtx"}; + Configurable cMinCascRadius{"cMinCascRadius", 0.4, "Casc Decay Radius"}; + Configurable cMinCascV0Radius{"cMinCascV0Radius", 0.9, "Casc V0 Decay Radius"}; + Configurable cMinCascCosPA{"cMinCascCosPA", 0.99, "Casc CosThetaPA"}; + Configurable cMinCascV0CosPA{"cMinCascV0CosPA", 0.99, "Casc V0 CosThetaPA"}; + Configurable cCascMassWindow{"cCascMassWindow", 0.005, "Casc Mass Window"}; + // V0s MC Configurable cHasMcFlag{"cHasMcFlag", true, "Has Mc Tag"}; Configurable cSelectTrueLambda{"cSelectTrueLambda", true, "Select True Lambda"}; @@ -336,6 +349,8 @@ struct LambdaTableProducer { const AxisSpec axisNsigma(401, -10.025, 10.025, {"n#sigma"}); const AxisSpec axisdEdx(360, 20, 200, "#frac{dE}{dx}"); + const AxisSpec axisCascMass{100, 1.28, 1.38, "M_{#Xi}"}; + // Create Histograms. // Event histograms histos.add("Events/h1f_collisions_info", "# of Collisions", kTH1F, {axisCols}); @@ -380,6 +395,9 @@ struct LambdaTableProducer { histos.add("QA/Lambda/h2f_pos_prong_tpc_nsigma_pi_vs_p", "TPC n#sigma Pos Prong", kTH2F, {axisMomPID, axisNsigma}); histos.add("QA/Lambda/h2f_neg_prong_tpc_nsigma_pi_vs_p", "TPC n#sigma Neg Prong", kTH2F, {axisMomPID, axisNsigma}); + histos.add("QA/Casc/hMassBeforeCuts", "Xi Mass", kTH1F, {axisCascMass}); + histos.add("QA/Casc/hMass", "Xi Mass", kTH1F, {axisCascMass}); + // Kinematic Histograms histos.add("McRec/Lambda/hPt", "Transverse Momentum", kTH1F, {axisV0Pt}); histos.add("McRec/Lambda/hEta", "Pseudorapidity", kTH1F, {axisV0Eta}); @@ -391,7 +409,7 @@ struct LambdaTableProducer { histos.addClone("McRec/Lambda/", "McRec/AntiLambda/"); // MC Generated Histograms - if (doprocessMCRun3 || doprocessMCRun2 || doprocessRecoGen) { + if (doprocessMCRun3 || doprocessMCRun2) { // McReco Histos histos.add("Tracks/h2f_tracks_pid_before_sel", "PIDs", kTH2F, {axisPID, axisV0Pt}); histos.add("Tracks/h2f_tracks_pid_after_sel", "PIDs", kTH2F, {axisPID, axisV0Pt}); @@ -446,6 +464,7 @@ struct LambdaTableProducer { histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPassV0DauTrackSel, "kPassV0DauTrackSel"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPassV0KinCuts, "kPassV0KinCuts"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPassV0TopoSel, "kPassV0TopoSel"); + histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kAllV0SelPassed, "kAllV0SelPassed"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kAllSelPassed, "kAllSelPassed"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kEffCorrPt, "kEffCorrPt"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kEffCorrPtRap, "kEffCorrPtRap"); @@ -790,6 +809,57 @@ struct LambdaTableProducer { return true; } + // Remove Lambda from Xi ---> Lambda Pi + template + bool removeCascLambda(C const& collision, V const& v0, X const& cascs, T const&) + { + // Loop over cascades + for (auto const& casc : cascs) { + // cascade daughters + auto cascposdau = casc.template posTrack_as(); + auto cascnegdau = casc.template negTrack_as(); + auto bachelor = casc.template bachelor_as(); + + // V0 daughters + auto v0posdau = v0.template posTrack_as(); + auto v0negdau = v0.template negTrack_as(); + + // topological selection + if (std::abs(casc.dcapostopv()) <= cMinCascDcaPosToPV || + std::abs(casc.dcanegtopv()) <= cMinCascDcaNegToPV || + std::abs(casc.dcabachtopv()) <= cMinCascDcaBachToPV || + casc.dcaV0daughters() >= cMaxV0DcaDaughters || + casc.dcacascdaughters() >= cMaxCascDcaDaughters || + casc.cascradius() <= cMinCascRadius || + casc.v0radius() <= cMinCascV0Radius || + casc.casccosPA(collision.posX(), collision.posY(), collision.posZ()) <= cMinCascCosPA || + casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ()) <= cMinCascV0CosPA || + std::abs(cascposdau.eta()) >= cTrackEtaCut || + std::abs(cascnegdau.eta()) >= cTrackEtaCut || + std::abs(bachelor.eta()) >= cTrackEtaCut) { + continue; + } + + histos.fill(HIST("QA/Casc/hMassBeforeCuts"), casc.mXi()); + + // apply mass window selection to Xi + if (std::abs(casc.mXi() - MassXiMinus) >= cCascMassWindow) { + continue; + } + + histos.fill(HIST("QA/Casc/hMass"), casc.mXi()); + + // Check if the daughters of cascades match with v0 daughters + // The "OR" Logic is Temperory, we can further see the effect of "AND" Logic + if (v0posdau.index() == cascposdau.index() || v0negdau.index() == cascnegdau.index()) { + return true; + } + } + + // No Lambda from Cascade + return false; + } + template bool getMcMatch(T const& vrec, T const& vgen) { @@ -943,8 +1013,8 @@ struct LambdaTableProducer { } // Reconstructed Level Tables - template - void fillLambdaRecoTables(C const& collision, V const& v0tracks, T const& tracks) + template + void fillLambdaRecoTables(C const& collision, V const& v0tracks, T const& tracks, X const& cascs) { // Total Collisions histos.fill(HIST("Events/h1f_collisions_info"), kTotCol); @@ -966,6 +1036,7 @@ struct LambdaTableProducer { ParticleType v0Type = kLambda; float mass = 0., corr_fact = 1.; + // Loop Over V0s for (auto const& v0 : v0tracks) { // check for corresponding MCGen Particle if constexpr (dmc == kMC) { @@ -988,6 +1059,13 @@ struct LambdaTableProducer { continue; } + histos.fill(HIST("Tracks/h1f_tracks_info"), kAllV0SelPassed); + + // Remove Lambda V0 coming from Xi -> Lambda Pi + if (cRemoveCascLambda && removeCascLambda(collision, v0, cascs, tracks)) { + continue; + } + histos.fill(HIST("Tracks/h1f_tracks_info"), kAllSelPassed); // we have v0 as lambda @@ -1145,8 +1223,8 @@ struct LambdaTableProducer { } } - template - void analyzeMcRecoGen(M const& mcCollision, C const& collisions, V const& V0s, T const& tracks, P const& mcParticles) + template + void analyzeMcRecoGen(M const& mcCollision, C const& collisions, V const& V0s, T const& tracks, X const& cascs, P const& mcParticles) { // Number of Rec Collisions Associated to the McGen Collision int nRecCols = collisions.size(); @@ -1173,7 +1251,7 @@ struct LambdaTableProducer { histos.fill(HIST("McGen/h2f_collision_posZ"), mcCollision.posZ(), collisions.begin().posZ()); histos.fill(HIST("McGen/h2f_collision_cent"), mcCollision.centFT0M(), cent); auto v0Tracks = V0s.sliceBy(perCollision, collisions.begin().globalIndex()); - fillLambdaRecoTables(collisions.begin(), v0Tracks, tracks); + fillLambdaRecoTables(collisions.begin(), v0Tracks, tracks, cascs); fillLambdaMcGenTables(mcCollision, mcParticles); } @@ -1182,92 +1260,45 @@ struct LambdaTableProducer { using CollisionsRun3 = soa::Join; using CollisionsRun2 = soa::Join; + using CascsTracks = aod::CascDataExt; using Tracks = soa::Join; using McV0Tracks = soa::Join; + using McCascTracks = soa::Join; using TracksMC = soa::Join; - void processDataRun3(CollisionsRun3::iterator const& collision, aod::V0Datas const& V0s, Tracks const& tracks) + void processDataRun3(CollisionsRun3::iterator const& collision, aod::V0Datas const& V0s, Tracks const& tracks, CascsTracks const& cascs) { - fillLambdaRecoTables(collision, V0s, tracks); + fillLambdaRecoTables(collision, V0s, tracks, cascs); } PROCESS_SWITCH(LambdaTableProducer, processDataRun3, "Process for Run3 DATA", true); - void processDataRun2(CollisionsRun2::iterator const& collision, aod::V0Datas const& V0s, Tracks const& tracks) + void processDataRun2(CollisionsRun2::iterator const& collision, aod::V0Datas const& V0s, Tracks const& tracks, CascsTracks const& cascs) { - fillLambdaRecoTables(collision, V0s, tracks); + fillLambdaRecoTables(collision, V0s, tracks, cascs); } PROCESS_SWITCH(LambdaTableProducer, processDataRun2, "Process for Run2 DATA", false); void processMCRun3(soa::Join::iterator const& mcCollision, soa::SmallGroups> const& collisions, - McV0Tracks const& V0s, TracksMC const& tracks, + McV0Tracks const& V0s, TracksMC const& tracks, McCascTracks const& cascs, aod::McParticles const& mcParticles) { - analyzeMcRecoGen(mcCollision, collisions, V0s, tracks, mcParticles); + analyzeMcRecoGen(mcCollision, collisions, V0s, tracks, cascs, mcParticles); } PROCESS_SWITCH(LambdaTableProducer, processMCRun3, "Process for Run3 MC RecoGen", false); void processMCRun2(soa::Join::iterator const& mcCollision, soa::SmallGroups> const& collisions, - McV0Tracks const& V0s, TracksMC const& tracks, + McV0Tracks const& V0s, TracksMC const& tracks, McCascTracks const& cascs, aod::McParticles const& mcParticles) { - analyzeMcRecoGen(mcCollision, collisions, V0s, tracks, mcParticles); + analyzeMcRecoGen(mcCollision, collisions, V0s, tracks, cascs, mcParticles); } PROCESS_SWITCH(LambdaTableProducer, processMCRun2, "Process for Run2 MC RecoGen", false); - - void processRecoGen(soa::Join::iterator const& collision, - soa::Join const&, - McV0Tracks const& V0s, TracksMC const& tracks, - aod::McParticles const& mcParticles) - { - // Select Collision - if (!selCollision(collision) || !collision.has_mcCollision()) { - return; - } - - // Fill Reco Table - fillLambdaRecoTables(collision, V0s, tracks); - - // Get Generator Level Collision and Particles - auto mcCollision = collision.template mcCollision_as>(); - auto mcGenParticles = mcParticles.sliceByCached(aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); - - // Fill Gen Table - lambdaMCGenCollisionTable(mcCollision.centFT0M(), mcCollision.posX(), mcCollision.posY(), mcCollision.posZ()); - - // initialize track objects - ParticleType v0Type = kLambda; - for (auto const& mcpart : mcGenParticles) { - if (!mcpart.isPhysicalPrimary()) { - continue; - } - - if (std::abs(mcpart.y()) > cMaxV0Rap) { - continue; - } - - // check for Lambda first - if (mcpart.pdgCode() == kLambda0) { - v0Type = kLambda; - } else if (mcpart.pdgCode() == kLambda0Bar) { - v0Type = kAntiLambda; - } else { - continue; - } - - // Fill Lambda McGen Table - lambdaMCGenTrackTable(lambdaMCGenCollisionTable.lastIndex(), mcpart.px(), mcpart.py(), mcpart.pz(), - mcpart.pt(), mcpart.eta(), mcpart.phi(), mcpart.y(), RecoDecay::m(mcpart.p(), mcpart.e()), - 99., -97., (int8_t)v0Type, -999., -999., 1.); - } - } - - PROCESS_SWITCH(LambdaTableProducer, processRecoGen, "Process for MC RecoGen", false); }; struct LambdaTracksExtProducer { From d9e70c0169523e60fa9c4c089f39a0d6c11c71e7 Mon Sep 17 00:00:00 2001 From: pravatp98 <158029188+pravatp98@users.noreply.github.com> Date: Fri, 16 May 2025 23:53:45 +0530 Subject: [PATCH 1305/1650] [PWGCF] New PID cuts added (#11193) --- .../EbyEFluctuations/Tasks/nchCumulantsId.cxx | 591 ++++++++++-------- 1 file changed, 340 insertions(+), 251 deletions(-) diff --git a/PWGCF/EbyEFluctuations/Tasks/nchCumulantsId.cxx b/PWGCF/EbyEFluctuations/Tasks/nchCumulantsId.cxx index e9bdb714580..2d4ba400285 100644 --- a/PWGCF/EbyEFluctuations/Tasks/nchCumulantsId.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/nchCumulantsId.cxx @@ -9,27 +9,26 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file NchCumulantsId.cxx +/// \file nchCumulantsId.cxx /// \brief Event by Event conserved charges fluctuations -/// it is meant to be a blank page for further developments. -/// \author Pravata Panigrahi :: Sadhana Dash (sadhana@phy.iitb.ac.in) and Rahul Verma (rahul.verma@iitb.ac.in) +/// \author Pravata Panigrahi :: Sadhana Dash(sadhana@phy.iitb.ac.in) + #include #include -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" #include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" #include "Framework/HistogramRegistry.h" #include "Framework/HistogramSpec.h" #include "Framework/O2DatabasePDGPlugin.h" +#include "Framework/runDataProcessing.h" -#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/Centrality.h" #include "Common/DataModel/EventSelection.h" -#include "Common/DataModel/PIDResponse.h" #include "Common/DataModel/Multiplicity.h" -#include "Common/DataModel/Centrality.h" -#include "TLorentzVector.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/TrackSelectionTables.h" using namespace o2; using namespace o2::framework; @@ -48,6 +47,58 @@ struct NchCumulantsId { Configurable cfgCutDcaXY{"cfgCutDcaXY", 0.12, "cut for dcaXY"}; Configurable cfgCutDcaZ{"cfgCutDcaZ", 0.3, "cut for dcaZ"}; Configurable cfgCutEta{"cfgCutEta", 0.8, "cut for eta"}; + Configurable cfgCutPtMax{"cfgCutPtMax", 3.0, "max cut for pT"}; + Configurable cfgCutPtMin{"cfgCutPtMin", 0.15, "min cut for pT"}; + + // Configurables for particle Identification + Configurable cfgId01CheckVetoCut{"cfgId01CheckVetoCut", false, "cfgId01CheckVetoCut"}; + Configurable cfgId02DoElRejection{"cfgId02DoElRejection", true, "cfgId02DoElRejection"}; + Configurable cfgId03DoDeRejection{"cfgId03DoDeRejection", false, "cfgId03DoDeRejection"}; + Configurable cfgId04DoPdependentId{"cfgId04DoPdependentId", true, "cfgId04DoPdependentId"}; + Configurable cfgId05DoTpcInnerParamId{"cfgId05DoTpcInnerParamId", false, "cfgId05DoTpcInnerParamId"}; + + Configurable cfgIdPi01ThrPforTOF{"cfgIdPi01ThrPforTOF", 0.7, "cfgIdPi01ThrPforTOF"}; + Configurable cfgIdPi02IdCutTypeLowP{"cfgIdPi02IdCutTypeLowP", 0, "cfgIdPi02IdCutTypeLowP"}; + Configurable cfgIdPi03NSigmaTPCLowP{"cfgIdPi03NSigmaTPCLowP", 2.0, "cfgIdPi03NSigmaTPCLowP"}; + Configurable cfgIdPi04NSigmaTOFLowP{"cfgIdPi04NSigmaTOFLowP", 2.0, "cfgIdPi04NSigmaTOFLowP"}; + Configurable cfgIdPi05NSigmaRadLowP{"cfgIdPi05NSigmaRadLowP", 4.0, "cfgIdPi05NSigmaRadLowP"}; + Configurable cfgIdPi06IdCutTypeHighP{"cfgIdPi06IdCutTypeHighP", 0, "cfgIdPi06IdCutTypeHighP"}; + Configurable cfgIdPi07NSigmaTPCHighP{"cfgIdPi07NSigmaTPCHighP", 2.0, "cfgIdPi07NSigmaTPCHighP"}; + Configurable cfgIdPi08NSigmaTOFHighP{"cfgIdPi08NSigmaTOFHighP", 2.0, "cfgIdPi08NSigmaTOFHighP"}; + Configurable cfgIdPi09NSigmaRadHighP{"cfgIdPi09NSigmaRadHighP", 4.0, "cfgIdPi09NSigmaRadHighP"}; + + Configurable cfgIdKa01ThrPforTOF{"cfgIdKa01ThrPforTOF", 0.8, "cfgIdKa01ThrPforTOF"}; + Configurable cfgIdKa02IdCutTypeLowP{"cfgIdKa02IdCutTypeLowP", 0, "cfgIdKa02IdCutTypeLowP"}; + Configurable cfgIdKa03NSigmaTPCLowP{"cfgIdKa03NSigmaTPCLowP", 2.0, "cfgIdKa03NSigmaTPCLowP"}; + Configurable cfgIdKa04NSigmaTOFLowP{"cfgIdKa04NSigmaTOFLowP", 2.0, "cfgIdKa04NSigmaTOFLowP"}; + Configurable cfgIdKa05NSigmaRadLowP{"cfgIdKa05NSigmaRadLowP", 4.0, "cfgIdKa05NSigmaRadLowP"}; + Configurable cfgIdKa06IdCutTypeHighP{"cfgIdKa06IdCutTypeHighP", 0, "cfgIdKa06IdCutTypeHighP"}; + Configurable cfgIdKa07NSigmaTPCHighP{"cfgIdKa07NSigmaTPCHighP", 2.0, "cfgIdKa07NSigmaTPCHighP"}; + Configurable cfgIdKa08NSigmaTOFHighP{"cfgIdKa08NSigmaTOFHighP", 2.0, "cfgIdKa08NSigmaTOFHighP"}; + Configurable cfgIdKa09NSigmaRadHighP{"cfgIdKa09NSigmaRadHighP", 4.0, "cfgIdKa09NSigmaRadHighP"}; + + Configurable cfgIdPr01ThrPforTOF{"cfgIdPr01ThrPforTOF", 0.8, "cfgIdPr01ThrPforTOF"}; + Configurable cfgIdPr02IdCutTypeLowP{"cfgIdPr02IdCutTypeLowP", 0, "cfgIdPr02IdCutTypeLowP"}; + Configurable cfgIdPr03NSigmaTPCLowP{"cfgIdPr03NSigmaTPCLowP", 2.0, "cfgIdPr03NSigmaTPCLowP"}; + Configurable cfgIdPr04NSigmaTOFLowP{"cfgIdPr04NSigmaTOFLowP", 2.0, "cfgIdPr04NSigmaTOFLowP"}; + Configurable cfgIdPr05NSigmaRadLowP{"cfgIdPr05NSigmaRadLowP", 4.0, "cfgIdPr05NSigmaRadLowP"}; + Configurable cfgIdPr06IdCutTypeHighP{"cfgIdPr06IdCutTypeHighP", 0, "cfgIdPr06IdCutTypeHighP"}; + Configurable cfgIdPr07NSigmaTPCHighP{"cfgIdPr07NSigmaTPCHighP", 2.0, "cfgIdPr07NSigmaTPCHighP"}; + Configurable cfgIdPr08NSigmaTOFHighP{"cfgIdPr08NSigmaTOFHighP", 2.0, "cfgIdPr08NSigmaTOFHighP"}; + Configurable cfgIdPr09NSigmaRadHighP{"cfgIdPr09NSigmaRadHighP", 4.0, "cfgIdPr09NSigmaRadHighP"}; + + struct : ConfigurableGroup { + Configurable cfgVetoId01PiTPC{"cfgVetoId01PiTPC", 3.0, "cfgVetoId01PiTPC"}; + Configurable cfgVetoId02PiTOF{"cfgVetoId02PiTOF", 3.0, "cfgVetoId02PiTOF"}; + Configurable cfgVetoId03KaTPC{"cfgVetoId03KaTPC", 3.0, "cfgVetoId03KaTPC"}; + Configurable cfgVetoId04KaTOF{"cfgVetoId04KaTOF", 3.0, "cfgVetoId04KaTOF"}; + Configurable cfgVetoId05PrTPC{"cfgVetoId05PrTPC", 3.0, "cfgVetoId05PrTPC"}; + Configurable cfgVetoId06PrTOF{"cfgVetoId06PrTOF", 3.0, "cfgVetoId06PrTOF"}; + Configurable cfgVetoId07ElTPC{"cfgVetoId07ElTPC", 3.0, "cfgVetoId07ElTPC"}; + Configurable cfgVetoId08ElTOF{"cfgVetoId08ElTOF", 3.0, "cfgVetoId08ElTOF"}; + Configurable cfgVetoId09DeTPC{"cfgVetoId09DeTPC", 3.0, "cfgVetoId09DeTPC"}; + Configurable cfgVetoId10DeTOF{"cfgVetoId10DeTOF", 3.0, "cfgVetoId10DeTOF"}; + } cfgVetoIdCut; void init(InitContext const&) { @@ -164,7 +215,7 @@ struct NchCumulantsId { hist.add("QA/tracks/Idfd/Pi/tpcId/tofExpMom_tofNSigma", "tofExpMom_tofNSigma", histTofExpMomTofNSigma); hist.add("QA/tracks/Idfd/Pi/tpcId/tpcNSigma_tofNSigma", "tpcNSigma_tofNSigma", histTpcNSigmaTofNSigma); - hist.addClone("QA/tracks/Idfd/Pi/tpcId/", "QA/tracks/Idfd/Pi/tofId/"); + hist.addClone("QA/tracks/Idfd/Pi/tpcId/", "QA/tracks/Idfd/Pi/tpctofId/"); hist.addClone("QA/tracks/Idfd/Pi/", "QA/tracks/Idfd/Ka/"); hist.addClone("QA/tracks/Idfd/Pi/", "QA/tracks/Idfd/Pr/"); @@ -172,310 +223,348 @@ struct NchCumulantsId { hist.add("sparse2", "sparse2", qnHist2); } // init ends + enum IdentificationType { + kTPCidentified = 0, + kTOFidentified, + kTPCTOFidentified, + kUnidentified + }; + + enum TpcTofCutType { + kRectangularCut = 0, + kCircularCut, + kEllipsoidalCut + }; + + enum DetEnum { + tpcId = 0, + tofId, + tpctofId, + NoId + }; + + static constexpr std::string_view DetDire[] = { + "tpcId/", + "tofId/", + "tpctofId/", + "NoId/"}; + + enum HistRegEnum { + qaEventPreSel = 0, + qaEventPostSel, + qaTracksPreSel, + qaTracksPostSel, + qaTracksIdfd + }; + + static constexpr std::string_view HistRegDire[] = { + "QA/events/preSel/", + "QA/events/postSel/", + "QA/tracks/preSel/", + "QA/tracks/postSel/", + "QA/tracks/Idfd/"}; + + enum PidEnum { + kPi = 0, // dont use kPion, kKaon, as these enumeration + kKa, // are already defined in $ROOTSYS/root/include/TPDGCode.h + kPr, + kEl, + kDe + }; + + static constexpr std::string_view PidDire[] = { + "Pi/", + "Ka/", + "Pr/", + "El/", + "De/"}; + // particle identifications // tpc Selections - template - bool selPionTPCInnerParam(T track) + + template + bool vetoIdOthersTPC(const T& track) { - if (std::abs(track.tpcNSigmaEl()) > 3.0 && std::abs(track.tpcNSigmaKa()) > 3.0 && std::abs(track.tpcNSigmaPr()) > 3.0 && std::abs(track.tpcNSigmaDe()) > 3.0) { - if (0.05 <= track.tpcInnerParam() && track.tpcInnerParam() < 0.70 && std::abs(track.tpcNSigmaPi()) < 3.0) { - return true; + if (pidMode != kPi) { + if (std::fabs(track.tpcNSigmaPi()) < cfgVetoIdCut.cfgVetoId01PiTPC) + return false; + } + if (pidMode != kKa) { + if (std::fabs(track.tpcNSigmaKa()) < cfgVetoIdCut.cfgVetoId03KaTPC) + return false; + } + if (pidMode != kPr) { + if (std::fabs(track.tpcNSigmaPr()) < cfgVetoIdCut.cfgVetoId05PrTPC) + return false; + } + if (cfgId02DoElRejection) { + if (pidMode != kEl) { + if (std::fabs(track.tpcNSigmaEl()) < cfgVetoIdCut.cfgVetoId07ElTPC) + return false; } - if (0.70 <= track.tpcInnerParam() && std::abs(track.tpcNSigmaPi()) < 2.0) { - return true; + } + if (cfgId03DoDeRejection) { + if (pidMode != kDe) { + if (std::fabs(track.tpcNSigmaDe()) < cfgVetoIdCut.cfgVetoId09DeTPC) + return false; } } - return false; + return true; } - template - bool selKaonTPCInnerParam(T track) + template + bool vetoIdOthersTOF(const T& track) { - // p dependent cuts - if (std::abs(track.tpcNSigmaEl()) > 3.0 && std::abs(track.tpcNSigmaPi()) > 3.0 && std::abs(track.tpcNSigmaPr()) > 3.0 && std::abs(track.tpcNSigmaDe()) > 3.0) { - if (0.05 <= track.tpcInnerParam() && track.tpcInnerParam() < 0.70 && std::abs(track.tpcNSigmaKa()) < 3.0) { - return true; + if (pidMode != kPi) { + if (std::fabs(track.tofNSigmaPi()) < cfgVetoIdCut.cfgVetoId02PiTOF) + return false; + } + if (pidMode != kKa) { + if (std::fabs(track.tofNSigmaKa()) < cfgVetoIdCut.cfgVetoId04KaTOF) + return false; + } + if (pidMode != kPr) { + if (std::fabs(track.tofNSigmaPr()) < cfgVetoIdCut.cfgVetoId06PrTOF) + return false; + } + if (cfgId02DoElRejection) { + if (pidMode != kEl) { + if (std::fabs(track.tofNSigmaEl()) < cfgVetoIdCut.cfgVetoId08ElTOF) + return false; } - if (0.70 <= track.tpcInnerParam() && std::abs(track.tpcNSigmaKa()) < 2.0) { - return true; + } + if (cfgId03DoDeRejection) { + if (pidMode != kDe) { + if (std::fabs(track.tofNSigmaDe()) < cfgVetoIdCut.cfgVetoId10DeTOF) + return false; } } - return false; + return true; } - template - bool selProtonTPCInnerParam(T track) + template + bool vetoIdOthersTPCTOF(const T& track) { - if (std::abs(track.tpcNSigmaEl()) > 3.0 && std::abs(track.tpcNSigmaPi()) > 3.0 && std::abs(track.tpcNSigmaKa()) > 3.0 && std::abs(track.tpcNSigmaDe()) > 3.0) { - if (0.05 <= track.tpcInnerParam() && track.tpcInnerParam() < 1.60 && std::abs(track.tpcNSigmaPr()) < 3.0) { - return true; + if (pidMode != kPi) { + if (std::fabs(track.tpcNSigmaPi()) < cfgVetoIdCut.cfgVetoId01PiTPC && std::fabs(track.tofNSigmaPi()) < cfgVetoIdCut.cfgVetoId02PiTOF) + return false; + } + if (pidMode != kKa) { + if (std::fabs(track.tpcNSigmaKa()) < cfgVetoIdCut.cfgVetoId03KaTPC && std::fabs(track.tofNSigmaKa()) < cfgVetoIdCut.cfgVetoId04KaTOF) + return false; + } + if (pidMode != kPr) { + if (std::fabs(track.tpcNSigmaPr()) < cfgVetoIdCut.cfgVetoId05PrTPC && std::fabs(track.tofNSigmaPr()) < cfgVetoIdCut.cfgVetoId06PrTOF) + return false; + } + if (cfgId02DoElRejection) { + if (pidMode != kEl) { + if (std::fabs(track.tpcNSigmaEl()) < cfgVetoIdCut.cfgVetoId07ElTPC && std::fabs(track.tofNSigmaEl()) < cfgVetoIdCut.cfgVetoId08ElTOF) + return false; } - if (1.60 <= track.tpcInnerParam() && std::abs(track.tpcNSigmaPr()) < 2.0) { - return true; + } + if (cfgId03DoDeRejection) { + if (pidMode != kDe) { + if (std::fabs(track.tpcNSigmaDe()) < cfgVetoIdCut.cfgVetoId09DeTPC && std::fabs(track.tofNSigmaDe()) < cfgVetoIdCut.cfgVetoId10DeTOF) + return false; } } - return false; + return true; } - template - bool selDeuteronTPCInnerParam(T track) + template + bool selIdRectangularCut(const T& track, const float& nSigmaTPC, const float& nSigmaTOF) { - if (std::abs(track.tpcNSigmaEl()) > 3.0 && std::abs(track.tpcNSigmaPi()) > 3.0 && std::abs(track.tpcNSigmaKa()) > 3.0 && std::abs(track.tpcNSigmaPr()) > 3.0) { - if (0.05 <= track.tpcInnerParam() && track.tpcInnerParam() < 1.80 && std::abs(track.tpcNSigmaDe()) < 3.0) { - return true; - } - if (1.80 <= track.tpcInnerParam() && std::abs(track.tpcNSigmaDe()) < 2.0) { - return true; - } + switch (pidMode) { + case kPi: + if (std::fabs(track.tpcNSigmaPi()) < nSigmaTPC && + std::fabs(track.tofNSigmaPi()) < nSigmaTOF) { + return true; + } + break; + case kKa: + if (std::fabs(track.tpcNSigmaKa()) < nSigmaTPC && + std::fabs(track.tofNSigmaKa()) < nSigmaTOF) { + return true; + } + break; + case kPr: + if (std::fabs(track.tpcNSigmaPr()) < nSigmaTPC && + std::fabs(track.tofNSigmaPr()) < nSigmaTOF) { + return true; + } + break; + default: + return false; + break; } return false; } - template - bool selElectronTPCInnerParam(T track) + template + bool selIdEllipsoidalCut(const T& track, const float& nSigmaTPC, const float& nSigmaTOF) { - if (track.tpcNSigmaEl() < 3.0 && track.tpcNSigmaPi() > 3.0 && track.tpcNSigmaKa() > 3.0 && track.tpcNSigmaPr() > 3.0 && track.tpcNSigmaDe() > 3.0) { - return true; + switch (pidMode) { + case kPi: + if (std::pow(track.tpcNSigmaPi() / nSigmaTPC, 2) + std::pow(track.tofNSigmaPi() / nSigmaTOF, 2) < 1.0) + return true; + break; + case kKa: + if (std::pow(track.tpcNSigmaKa() / nSigmaTPC, 2) + std::pow(track.tofNSigmaKa() / nSigmaTOF, 2) < 1.0) + return true; + break; + case kPr: + if (std::pow(track.tpcNSigmaPr() / nSigmaTPC, 2) + std::pow(track.tofNSigmaPr() / nSigmaTOF, 2) < 1.0) + return true; + break; + default: + return false; + break; } return false; } - // - // TOF Selections - // Pion - template - bool selPionTOF(T track) + template + bool selIdCircularCut(const T& track, const float& nSigmaSquaredRad) { - if (track.p() <= 0.75 && std::abs(track.tpcNSigmaPi()) < 3.0 && std::abs(track.tofNSigmaPi()) < 3.0 && std::abs(track.tofNSigmaEl()) > 3.0) { - return true; - } else if (0.75 < track.p() // after p = 0.75, Pi and Ka lines of nSigma 3.0 will start intersecting - && std::abs(track.tpcNSigmaPi()) < 2.0 && std::abs(track.tofNSigmaPi()) < 2.0 && std::abs(track.tofNSigmaEl()) > 3.0 && std::abs(track.tofNSigmaKa()) > 3.0 && std::abs(track.tofNSigmaPr()) > 3.0 && std::abs(track.tofNSigmaDe()) > 3.0) { - return true; + switch (pidMode) { + case kPi: + if (std::pow(track.tpcNSigmaPi(), 2) + std::pow(track.tofNSigmaPi(), 2) < nSigmaSquaredRad) + return true; + break; + case kKa: + if (std::pow(track.tpcNSigmaKa(), 2) + std::pow(track.tofNSigmaKa(), 2) < nSigmaSquaredRad) + return true; + break; + case kPr: + if (std::pow(track.tpcNSigmaPr(), 2) + std::pow(track.tofNSigmaPr(), 2) < nSigmaSquaredRad) + return true; + break; + default: + return false; + break; } return false; } - // Kaon template - bool selKaonTOF(T track) + bool checkReliableTOF(const T& track) { - if (track.p() <= 0.75 && std::abs(track.tpcNSigmaKa()) < 3.0 && std::abs(track.tofNSigmaKa()) < 3.0) { - return true; - } - if (0.75 < track.p() && track.p() <= 1.30 // after 0.75 Pi and Ka lines of nSigma 3.0 will start intersecting - && std::abs(track.tpcNSigmaKa()) < 3.0 && std::abs(track.tofNSigmaKa()) < 3.0 && std::abs(track.tofNSigmaPi()) > 3.0 && std::abs(track.tofNSigmaEl()) > 3.0) { - return true; - } - if (1.30 < track.p() // after 1.30 Pr and Ka lines of nSigma 3.0 will start intersecting - && std::abs(track.tpcNSigmaKa()) < 2.0 && std::abs(track.tofNSigmaKa()) < 2.0 && std::abs(track.tofNSigmaEl()) > 3.0 && std::abs(track.tofNSigmaPi()) > 3.0 && std::abs(track.tofNSigmaPr()) > 3.0 && std::abs(track.tofNSigmaDe()) > 3.0) { - return true; - } - return false; + if (track.hasTOF()) + return true; // which check makes the information of TOF relaiable? should track.beta() be checked? + else + return false; } - // Proton - template - bool selProtonTOF(T track) + template + bool idTPC(const T& track, const float& nSigmaTPC) { - if (track.p() <= 1.30 && std::abs(track.tpcNSigmaPr()) < 3.0 && std::abs(track.tofNSigmaPr()) < 3.0) { - return true; - } - if (1.30 < track.p() && track.p() <= 3.10 // after 1.30 Pr and Ka lines of nSigma 3.0 will start intersecting - && std::abs(track.tpcNSigmaPr()) < 3.0 && std::abs(track.tofNSigmaPr()) < 3.0 && std::abs(track.tofNSigmaEl()) > 3.0 && std::abs(track.tofNSigmaPi()) > 3.0 && std::abs(track.tofNSigmaKa()) > 3.0 && std::abs(track.tofNSigmaDe()) > 3.0 // Some Deuteron contamination is still coming in p dependent cuts - ) { - return true; - } - if (3.10 < track.p() // after 3.10 Pr and De lines of nSigma 3.0 will start intersecting - && std::abs(track.tpcNSigmaPr()) < 2.0 && std::abs(track.tofNSigmaPr()) < 2.0 && std::abs(track.tofNSigmaEl()) > 3.0 && std::abs(track.tofNSigmaPi()) > 3.0 && std::abs(track.tofNSigmaKa()) > 3.0 && std::abs(track.tofNSigmaDe()) > 3.0) { - return true; + if (cfgId01CheckVetoCut && !vetoIdOthersTPC(track)) + return false; + switch (pidMode) { + case kPi: + if (std::fabs(track.tpcNSigmaPi()) < nSigmaTPC) + return true; + break; + case kKa: + if (std::fabs(track.tpcNSigmaKa()) < nSigmaTPC) + return true; + break; + case kPr: + if (std::fabs(track.tpcNSigmaPr()) < nSigmaTPC) + return true; + break; + default: + return false; + break; } return false; } - // Deuteron - template - bool selDeuteronTOF(T track) + template + bool idTPCTOF(const T& track, const int& pidCutType, const float& nSigmaTPC, const float& nSigmaTOF, const float& nSigmaSquaredRad) { - if (track.p() <= 3.10 && std::abs(track.tpcNSigmaDe()) < 3.0 && std::abs(track.tofNSigmaDe()) < 3.0 && std::abs(track.tofNSigmaEl()) > 3.0 && std::abs(track.tofNSigmaPi()) > 3.0 && std::abs(track.tofNSigmaKa()) > 3.0 && std::abs(track.tofNSigmaPr()) > 3.0) { - return true; - } - if (3.10 < track.p() // after 3.10 De and Pr lines of nSigma 3.0 will start intersecting - && std::abs(track.tpcNSigmaDe()) < 2.0 && std::abs(track.tofNSigmaDe()) < 2.0 && std::abs(track.tofNSigmaEl()) > 3.0 && std::abs(track.tofNSigmaPi()) > 3.0 && std::abs(track.tofNSigmaKa()) > 3.0 && std::abs(track.tofNSigmaPr()) > 3.0) { - return true; + if (cfgId01CheckVetoCut && !vetoIdOthersTPCTOF(track)) + return false; + if (pidCutType == kRectangularCut) { + return selIdRectangularCut(track, nSigmaTPC, nSigmaTOF); + } else if (pidCutType == kCircularCut) { + return selIdCircularCut(track, nSigmaSquaredRad); + } else if (pidCutType == kEllipsoidalCut) { + return selIdEllipsoidalCut(track, nSigmaTPC, nSigmaTOF); } return false; } - // Electron - template - bool selElectronTOF(T track) + template + bool selPdependent(const T& track, int& IdMethod, const float& cfgIdThrPforTOF, + const int& idCutTypeLowP, const float& nSigmaTPCLowP, const float& nSigmaTOFLowP, const float& nSigmaRadLowP, + const int& idCutTypeHighP, const float& nSigmaTPCHighP, const float& nSigmaTOFHighP, const float& nSigmaRadHighP) { - if ( - (std::pow(track.tpcNSigmaEl(), 2) + std::pow(track.tofNSigmaEl(), 2)) < 9.00 && std::abs(track.tofNSigmaPi()) > 3.0 && std::abs(track.tofNSigmaKa()) > 3.0 && std::abs(track.tofNSigmaPr()) > 3.0 && std::abs(track.tofNSigmaDe()) > 3.0) { - return true; + if (track.p() < cfgIdThrPforTOF) { + if (checkReliableTOF(track)) { + if (idTPCTOF(track, idCutTypeLowP, nSigmaTPCLowP, nSigmaTOFLowP, nSigmaRadLowP)) { + IdMethod = kTPCTOFidentified; + return true; + } + return false; + } else { + if (idTPC(track, nSigmaTPCLowP)) { + IdMethod = kTPCidentified; + return true; + } + return false; + } + } else { + if (checkReliableTOF(track)) { + if (idTPCTOF(track, idCutTypeHighP, nSigmaTPCHighP, nSigmaTOFHighP, nSigmaRadHighP)) { + IdMethod = kTPCTOFidentified; + return true; + } + return false; + } + return false; } - return false; } - // - // SelectionFunctions + // + //______________________________Identification Functions________________________________________________________________ // Pion template - bool selPion(T track, int& IdMethod) + bool selPion(const T& track, int& IdMethod) { - if (!track.hasTOF() && selPionTPCInnerParam(track)) { - IdMethod = 0; - return true; - } - if (track.hasTOF() && track.beta() < 0.0 && selPionTPCInnerParam(track)) { - IdMethod = 0; - return true; - } - if (track.hasTOF() && track.beta() > 0.0 && selPionTPCInnerParam(track)) { - IdMethod = 0; - return true; - } - if (track.hasTOF() && track.beta() > 0.0 && !selPionTPCInnerParam(track)) { - IdMethod = 1; - return selPionTOF(track); + if (cfgId04DoPdependentId) { + return selPdependent(track, IdMethod, + cfgIdPi01ThrPforTOF, cfgIdPi02IdCutTypeLowP, cfgIdPi03NSigmaTPCLowP, cfgIdPi04NSigmaTOFLowP, cfgIdPi05NSigmaRadLowP, + cfgIdPi06IdCutTypeHighP, cfgIdPi07NSigmaTPCHighP, cfgIdPi08NSigmaTOFHighP, cfgIdPi09NSigmaRadHighP); } return false; } // Kaon template - bool selKaon(T track, int& IdMethod) + bool selKaon(const T& track, int& IdMethod) { - if (!track.hasTOF() && selKaonTPCInnerParam(track)) { - IdMethod = 0; - return true; - } - if (track.hasTOF() && track.beta() < 0.0 && selKaonTPCInnerParam(track)) { - IdMethod = 0; - return true; - } - if (track.hasTOF() && track.beta() > 0.0 && selKaonTPCInnerParam(track)) { - IdMethod = 0; - return true; - } - if (track.hasTOF() && track.beta() > 0.0 && !selKaonTPCInnerParam(track)) { - IdMethod = 1; - return selKaonTOF(track); + if (cfgId04DoPdependentId) { + return selPdependent(track, IdMethod, + cfgIdKa01ThrPforTOF, cfgIdKa02IdCutTypeLowP, cfgIdKa03NSigmaTPCLowP, cfgIdKa04NSigmaTOFLowP, cfgIdKa05NSigmaRadLowP, + cfgIdKa06IdCutTypeHighP, cfgIdKa07NSigmaTPCHighP, cfgIdKa08NSigmaTOFHighP, cfgIdKa09NSigmaRadHighP); } return false; } // Proton template - bool selProton(T track, int& IdMethod) + bool selProton(const T& track, int& IdMethod) { - if (!track.hasTOF() && selProtonTPCInnerParam(track)) { - IdMethod = 0; - return true; - } - if (track.hasTOF() && track.beta() < 0.0 && selProtonTPCInnerParam(track)) { - IdMethod = 0; - return true; - } - if (track.hasTOF() && track.beta() > 0.0 && selProtonTPCInnerParam(track)) { - IdMethod = 0; - return true; - } - if (track.hasTOF() && track.beta() > 0.0 && !selProtonTPCInnerParam(track)) { - IdMethod = 1; - return selProtonTOF(track); - } - return false; - } - - // Deuteron - template - bool selDeuteron(T track, int& IdMethod) - { - if (!track.hasTOF() && selDeuteronTPCInnerParam(track)) { - IdMethod = 0; - return true; - } - if (track.hasTOF() && track.beta() < 0.0 && selDeuteronTPCInnerParam(track)) { - IdMethod = 0; - return true; - } - if (track.hasTOF() && track.beta() > 0.0 && selDeuteronTPCInnerParam(track)) { - IdMethod = 0; - return true; - } - if (track.hasTOF() && track.beta() > 0.0 && !selDeuteronTPCInnerParam(track)) { - IdMethod = 1; - return selDeuteronTOF(track); + if (cfgId04DoPdependentId) { + return selPdependent(track, IdMethod, + cfgIdPr01ThrPforTOF, cfgIdPr02IdCutTypeLowP, cfgIdPr03NSigmaTPCLowP, cfgIdPr04NSigmaTOFLowP, cfgIdPr05NSigmaRadLowP, + cfgIdPr06IdCutTypeHighP, cfgIdPr07NSigmaTPCHighP, cfgIdPr08NSigmaTOFHighP, cfgIdPr09NSigmaRadHighP); } return false; } - // Electron - template - bool selElectron(T track, int& IdMethod) - { - if (!track.hasTOF() && selElectronTPCInnerParam(track)) { - IdMethod = 0; - return true; - } - if (track.hasTOF() && track.beta() < 0.0 && selElectronTPCInnerParam(track)) { - IdMethod = 0; - return true; - } - if (track.hasTOF() && track.beta() > 0.0 && selElectronTPCInnerParam(track)) { - IdMethod = 0; - return true; - } - if (track.hasTOF() && track.beta() > 0.0 && !selElectronTPCInnerParam(track)) { - IdMethod = 1; - return selElectronTOF(track); - } - return false; - } - // - - enum HistRegEnum { - qaEventPreSel = 0, - qaEventPostSel, - qaTracksPreSel, - qaTracksPostSel, - qaTracksIdfd - }; - - static constexpr std::string_view HistRegDire[] = { - "QA/events/preSel/", - "QA/events/postSel/", - "QA/tracks/preSel/", - "QA/tracks/postSel/", - "QA/tracks/Idfd/"}; - - enum PidEnum { - kPi = 0, // dont use kPion, kKaon, as these enumeration - kKa, // are already defined in $ROOTSYS/root/include/TPDGCode.h - kPr, - kEl, - kDe - }; - - static constexpr std::string_view PidDire[] = { - "Pi/", - "Ka/", - "Pr/", - "El/", - "De/"}; - - enum DetEnum { - tpcId = 0, - tofId, - NoId - }; - - static constexpr std::string_view DetDire[] = { - "tpcId/", - "tofId/", - "NoId/"}; - template void fillIdentificationQA(H histReg, const T& track) { @@ -566,7 +655,7 @@ struct NchCumulantsId { Filter col = aod::evsel::sel8 == true; Filter colFilter = nabs(aod::collision::posZ) < cfgCutPosZ; Filter trackFilter = requireGlobalTrackInFilter(); - Filter trackPt = (aod::track::pt > 0.15f) && (aod::track::pt < 2.0f); + Filter trackPt = (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax); Filter trackDCAxy = nabs(aod::track::dcaXY) < cfgCutDcaXY; Filter trackDCAz = nabs(aod::track::dcaZ) < cfgCutDcaZ; Filter tracketa = nabs(aod::track::eta) < cfgCutEta; @@ -617,10 +706,10 @@ struct NchCumulantsId { nAPi++; } - if (idMethod == 0) + if (idMethod == kTPCidentified) fillIdentificationQA(hist, track); - if (idMethod == 1) - fillIdentificationQA(hist, track); + if (idMethod == kTPCTOFidentified) + fillIdentificationQA(hist, track); } // kaon if (selKaon(track, idMethod)) { @@ -631,10 +720,10 @@ struct NchCumulantsId { nAKa++; } - if (idMethod == 0) + if (idMethod == kTPCidentified) fillIdentificationQA(hist, track); - if (idMethod == 1) - fillIdentificationQA(hist, track); + if (idMethod == kTPCTOFidentified) + fillIdentificationQA(hist, track); } // proton if (selProton(track, idMethod)) { @@ -645,10 +734,10 @@ struct NchCumulantsId { nAPr++; } - if (idMethod == 0) + if (idMethod == kTPCidentified) fillIdentificationQA(hist, track); - if (idMethod == 1) - fillIdentificationQA(hist, track); + if (idMethod == kTPCTOFidentified) + fillIdentificationQA(hist, track); } } // track itteration ends From 62929fc2c41b5a377a8c0586988e47d95760e798 Mon Sep 17 00:00:00 2001 From: JStaa <39123272+JStaa@users.noreply.github.com> Date: Fri, 16 May 2025 22:25:48 +0200 Subject: [PATCH 1306/1650] [PWGCF] Added various histograms for QA and MC Closure (#11231) Co-authored-by: ALICE Action Bot --- .../Tasks/threeParticleCorrelations.cxx | 205 ++++++++++++++---- 1 file changed, 160 insertions(+), 45 deletions(-) diff --git a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx index 15f37379a33..8ad7f7db394 100644 --- a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx +++ b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx @@ -92,7 +92,7 @@ struct ThreeParticleCorrelations { using MyFilteredMCGenCollisions = soa::Filtered>; using MyFilteredMCGenCollision = MyFilteredMCGenCollisions::iterator; using MyFilteredMCParticles = soa::Filtered; - using MyFilteredMCRecCollision = soa::Filtered>::iterator; + using MyFilteredMCRecCollision = soa::Filtered>::iterator; using MyFilteredMCTracks = soa::Filtered>; @@ -162,6 +162,10 @@ struct ThreeParticleCorrelations { rQARegistry.add("hPtKaon", "hPtKaon", {HistType::kTH1D, {{trackPtAxis}}}); rQARegistry.add("hPtProton", "hPtProton", {HistType::kTH1D, {{trackPtAxis}}}); rQARegistry.add("hPtV0", "hPtV0", {HistType::kTH1D, {{v0PtAxis}}}); + rQARegistry.add("hPtPion_MC", "hPtPion_MC", {HistType::kTH1D, {{trackPtAxis}}}); + rQARegistry.add("hPtKaon_MC", "hPtKaon_MC", {HistType::kTH1D, {{trackPtAxis}}}); + rQARegistry.add("hPtProton_MC", "hPtProton_MC", {HistType::kTH1D, {{trackPtAxis}}}); + rQARegistry.add("hdEdx", "hdEdx", {HistType::kTH2D, {{56, 0.2, 3.0}, {180, 20, 200}}}); rQARegistry.add("hdEdxPion", "hdEdxPion", {HistType::kTH2D, {{56, 0.2, 3.0}, {180, 20, 200}}}); rQARegistry.add("hdEdxKaon", "hdEdxKaon", {HistType::kTH2D, {{56, 0.2, 3.0}, {180, 20, 200}}}); @@ -183,26 +187,37 @@ struct ThreeParticleCorrelations { rQARegistry.add("hNLambdas", "hNLambdas", {HistType::kTH3D, {{2, -2, 2}, {v0PtAxis}, {centralityAxis}}}); // PhiStar - rPhiStarRegistry.add("hSEProtonPreCut", "hSEProtonPreCut", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); - rPhiStarRegistry.add("hSEProtonPostCut", "hSEProtonPostCut", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); - rPhiStarRegistry.add("hMEProtonPreCut", "hMEProtonPreCut", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); - rPhiStarRegistry.add("hMEProtonPostCut", "hMEProtonPostCut", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); + rPhiStarRegistry.add("hSEProtonPreCut_OS", "hSEProtonPreCut_OS", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); + rPhiStarRegistry.add("hSEProtonPreCut_SS", "hSEProtonPreCut_SS", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); + rPhiStarRegistry.add("hSEProtonPostCut_OS", "hSEProtonPostCut_OS", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); + rPhiStarRegistry.add("hSEProtonPostCut_SS", "hSEProtonPostCut_SS", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); + rPhiStarRegistry.add("hMEProtonPreCut_OS", "hMEProtonPreCut_OS", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); + rPhiStarRegistry.add("hMEProtonPreCut_SS", "hMEProtonPreCut_SS", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); + rPhiStarRegistry.add("hMEProtonPostCut_OS", "hMEProtonPostCut_OS", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); + rPhiStarRegistry.add("hMEProtonPostCut_SS", "hMEProtonPostCut_SS", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); // Efficiency - rMCRegistry.add("hGenerated", "hGenerated", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); - rMCRegistry.add("hGenPionP", "hGenPionP", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); - rMCRegistry.add("hGenPionN", "hGenPionN", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); - rMCRegistry.add("hGenKaonP", "hGenKaonP", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); - rMCRegistry.add("hGenKaonN", "hGenKaonN", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); - rMCRegistry.add("hGenProtonP", "hGenProtonP", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); - rMCRegistry.add("hGenProtonN", "hGenProtonN", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); - rMCRegistry.add("hReconstructed", "hReconstructed", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); - rMCRegistry.add("hRecPionP", "hRecPionP", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); - rMCRegistry.add("hRecPionN", "hRecPionN", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); - rMCRegistry.add("hRecKaonP", "hRecKaonP", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); - rMCRegistry.add("hRecKaonN", "hRecKaonN", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); - rMCRegistry.add("hRecProtonP", "hRecProtonP", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); - rMCRegistry.add("hRecProtonN", "hRecProtonN", {HistType::kTH2D, {{trackPtAxis}, {trackEtaAxis}}}); + rMCRegistry.add("hGenerated", "hGenerated", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hGenPionP", "hGenPionP", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hGenPionN", "hGenPionN", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hGenKaonP", "hGenKaonP", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hGenKaonN", "hGenKaonN", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hGenProtonP", "hGenProtonP", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hGenProtonN", "hGenProtonN", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hReconstructed", "hReconstructed", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hRecPionP", "hRecPionP", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hRecPionN", "hRecPionN", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hRecKaonP", "hRecKaonP", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hRecKaonN", "hRecKaonN", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hRecProtonP", "hRecProtonP", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hRecProtonN", "hRecProtonN", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hIdentified", "hIdentified", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hPIDPionP", "hPIDPionP", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hPIDPionN", "hPIDPionN", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hPIDKaonP", "hPIDKaonP", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hPIDKaonN", "hPIDKaonN", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hPIDProtonP", "hPIDProtonP", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hPIDProtonN", "hPIDProtonN", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); // Purity rMCRegistry.add("hSelectPionP", "hSelectPionP", {HistType::kTH1D, {trackPtAxis}}); @@ -229,6 +244,13 @@ struct ThreeParticleCorrelations { rSECorrRegistry.add("hSameLambdaKaon_MC", "Same-event #Lambda - K correlator (MC)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); rSECorrRegistry.add("hSameLambdaProton_MC", "Same-event #Lambda - p correlator (MC)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaPion_leftSB", "Same-event #Lambda - #pi correlator (Left SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaPion_rightSB", "Same-event #Lambda - #pi correlator (Right SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaKaon_leftSB", "Same-event #Lambda - K correlator (Left SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaKaon_rightSB", "Same-event #Lambda - K correlator (Right SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaProton_leftSB", "Same-event #Lambda - p correlator (Left SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaProton_rightSB", "Same-event #Lambda - p correlator (Right SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaPion_SGNL", "Mixed-event #Lambda - #pi correlator (SGNL region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); rMECorrRegistry.add("hMixLambdaPion_SB", "Mixed-event #Lambda - #pi correlator (SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); rMECorrRegistry.add("hMixLambdaKaon_SGNL", "Mixed-event #Lambda - K correlator (SGNL region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); @@ -239,6 +261,13 @@ struct ThreeParticleCorrelations { rMECorrRegistry.add("hMixLambdaKaon_MC", "Mixed-event #Lambda - K correlator (MC)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); rMECorrRegistry.add("hMixLambdaProton_MC", "Mixed-event #Lambda - p correlator (MC)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaPion_leftSB", "Mixed-event #Lambda - #pi correlator (Left SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaPion_rightSB", "Mixed-event #Lambda - #pi correlator (Right SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaKaon_leftSB", "Mixed-event #Lambda - K correlator (Left SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaKaon_rightSB", "Mixed-event #Lambda - K correlator (Right SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaProton_leftSB", "Mixed-event #Lambda - p correlator (Left SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaProton_rightSB", "Mixed-event #Lambda - p correlator (Right SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + ccdb->setURL("http://alice-ccdb.cern.ch"); ccdb->setCaching(true); TList* efficiencyList = ccdb->getForTimeStamp("Users/j/jstaa/Efficiency/ChargedParticles", 1); @@ -325,13 +354,31 @@ struct ThreeParticleCorrelations { } else if (assocPID[0] == protonID) { // Protons rSECorrRegistry.fill(HIST("hSameLambdaProton_SGNL"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate)); } + } else if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { if (assocPID[0] == pionID) { // Pions rSECorrRegistry.fill(HIST("hSameLambdaPion_SB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate)); + if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass < MassLambda0 + 4 * dGaussSigma) { + rSECorrRegistry.fill(HIST("hSameLambdaPion_leftSB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate)); + } else if (candMass > MassLambda0 - 4 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { + rSECorrRegistry.fill(HIST("hSameLambdaPion_rightSB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate)); + } + } else if (assocPID[0] == kaonID) { // Kaons rSECorrRegistry.fill(HIST("hSameLambdaKaon_SB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate)); + if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass < MassLambda0 + 4 * dGaussSigma) { + rSECorrRegistry.fill(HIST("hSameLambdaKaon_leftSB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate)); + } else if (candMass > MassLambda0 - 4 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { + rSECorrRegistry.fill(HIST("hSameLambdaKaon_rightSB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate)); + } + } else if (assocPID[0] == protonID) { // Protons rSECorrRegistry.fill(HIST("hSameLambdaProton_SB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate)); + if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass < MassLambda0 + 4 * dGaussSigma) { + rSECorrRegistry.fill(HIST("hSameLambdaProton_leftSB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate)); + } else if (candMass > MassLambda0 - 4 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { + rSECorrRegistry.fill(HIST("hSameLambdaProton_rightSB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate)); + } } } } @@ -373,13 +420,31 @@ struct ThreeParticleCorrelations { } else if (assocPID[0] == protonID) { // Protons rMECorrRegistry.fill(HIST("hMixLambdaProton_SGNL"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate)); } + } else if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { if (assocPID[0] == pionID) { // Pions rMECorrRegistry.fill(HIST("hMixLambdaPion_SB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate)); + if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass < MassLambda0 + 4 * dGaussSigma) { + rMECorrRegistry.fill(HIST("hMixLambdaPion_leftSB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate)); + } else if (candMass > MassLambda0 - 4 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { + rMECorrRegistry.fill(HIST("hMixLambdaPion_rightSB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate)); + } + } else if (assocPID[0] == kaonID) { // Kaons rMECorrRegistry.fill(HIST("hMixLambdaKaon_SB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate)); + if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass < MassLambda0 + 4 * dGaussSigma) { + rMECorrRegistry.fill(HIST("hMixLambdaKaon_leftSB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate)); + } else if (candMass > MassLambda0 - 4 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { + rMECorrRegistry.fill(HIST("hMixLambdaKaon_rightSB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate)); + } + } else if (assocPID[0] == protonID) { // Protons rMECorrRegistry.fill(HIST("hMixLambdaProton_SB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate)); + if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass < MassLambda0 + 4 * dGaussSigma) { + rMECorrRegistry.fill(HIST("hMixLambdaProton_leftSB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate)); + } else if (candMass > MassLambda0 - 4 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { + rMECorrRegistry.fill(HIST("hMixLambdaProton_rightSB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate)); + } } } } @@ -396,6 +461,21 @@ struct ThreeParticleCorrelations { auto groupMCTriggers = mcTriggers->sliceByCached(aod::mcparticle::mcCollisionId, collision.globalIndex(), cache); auto groupMCAssociates = mcAssociates->sliceByCached(aod::mcparticle::mcCollisionId, collision.globalIndex(), cache); + // Start of the MC Track QA + for (const auto& track : groupMCAssociates) { + if (track.isPhysicalPrimary()) { + + if (std::abs(track.pdgCode()) == kPiPlus) { // Pions + rQARegistry.fill(HIST("hPtPion_MC"), track.pt()); + } else if (std::abs(track.pdgCode()) == kKPlus) { // Kaons + rQARegistry.fill(HIST("hPtKaon_MC"), track.pt()); + } else if (std::abs(track.pdgCode()) == kProton) { // Protons + rQARegistry.fill(HIST("hPtProton_MC"), track.pt()); + } + } + } + // End of the MC Track QA + // Start of the MC Same-Event correlations for (const auto& trigger : groupMCTriggers) { if (trigger.isPhysicalPrimary()) { @@ -481,19 +561,19 @@ struct ThreeParticleCorrelations { if (particle.isPhysicalPrimary()) { // Efficiency - Generated - rMCRegistry.fill(HIST("hGenerated"), particle.pt(), particle.eta()); + rMCRegistry.fill(HIST("hGenerated"), particle.pt(), particle.eta(), collision.bestCollisionCentFT0C()); if (particle.pdgCode() == kPiPlus) { // Pos pions - rMCRegistry.fill(HIST("hGenPionP"), particle.pt(), particle.eta()); + rMCRegistry.fill(HIST("hGenPionP"), particle.pt(), particle.eta(), collision.bestCollisionCentFT0C()); } else if (particle.pdgCode() == kPiMinus) { // Neg pions - rMCRegistry.fill(HIST("hGenPionN"), particle.pt(), particle.eta()); + rMCRegistry.fill(HIST("hGenPionN"), particle.pt(), particle.eta(), collision.bestCollisionCentFT0C()); } else if (particle.pdgCode() == kKPlus) { // Pos kaons - rMCRegistry.fill(HIST("hGenKaonP"), particle.pt(), particle.eta()); + rMCRegistry.fill(HIST("hGenKaonP"), particle.pt(), particle.eta(), collision.bestCollisionCentFT0C()); } else if (particle.pdgCode() == kKMinus) { // Neg kaons - rMCRegistry.fill(HIST("hGenKaonN"), particle.pt(), particle.eta()); + rMCRegistry.fill(HIST("hGenKaonN"), particle.pt(), particle.eta(), collision.bestCollisionCentFT0C()); } else if (particle.pdgCode() == kProton) { // Pos protons - rMCRegistry.fill(HIST("hGenProtonP"), particle.pt(), particle.eta()); + rMCRegistry.fill(HIST("hGenProtonP"), particle.pt(), particle.eta(), collision.bestCollisionCentFT0C()); } else if (particle.pdgCode() == kProtonBar) { // Neg protons - rMCRegistry.fill(HIST("hGenProtonN"), particle.pt(), particle.eta()); + rMCRegistry.fill(HIST("hGenProtonN"), particle.pt(), particle.eta(), collision.bestCollisionCentFT0C()); } } } @@ -513,24 +593,41 @@ struct ThreeParticleCorrelations { continue; } - if (trackFilters(track)) { - auto particle = track.mcParticle(); - if (particle.isPhysicalPrimary()) { + auto particle = track.mcParticle(); + if (particle.isPhysicalPrimary()) { - // Efficiency - Reconstructed - rMCRegistry.fill(HIST("hReconstructed"), track.pt(), track.eta()); + // Efficiency - Reconstructed + rMCRegistry.fill(HIST("hReconstructed"), track.pt(), track.eta(), collision.centFT0C()); + if (particle.pdgCode() == kPiPlus) { // Pos pions + rMCRegistry.fill(HIST("hRecPionP"), track.pt(), track.eta(), collision.centFT0C()); + } else if (particle.pdgCode() == kPiMinus) { // Neg pions + rMCRegistry.fill(HIST("hRecPionN"), track.pt(), track.eta(), collision.centFT0C()); + } else if (particle.pdgCode() == kKPlus) { // Pos kaons + rMCRegistry.fill(HIST("hRecKaonP"), track.pt(), track.eta(), collision.centFT0C()); + } else if (particle.pdgCode() == kKMinus) { // Neg kaons + rMCRegistry.fill(HIST("hRecKaonN"), track.pt(), track.eta(), collision.centFT0C()); + } else if (particle.pdgCode() == kProton) { // Pos protons + rMCRegistry.fill(HIST("hRecProtonP"), track.pt(), track.eta(), collision.centFT0C()); + } else if (particle.pdgCode() == kProtonBar) { // Neg protons + rMCRegistry.fill(HIST("hRecProtonN"), track.pt(), track.eta(), collision.centFT0C()); + } + + if (trackFilters(track)) { + + // Efficiency - Reconstructed & PID filters applied + rMCRegistry.fill(HIST("hIdentified"), track.pt(), track.eta(), collision.centFT0C()); if (particle.pdgCode() == kPiPlus) { // Pos pions - rMCRegistry.fill(HIST("hRecPionP"), track.pt(), track.eta()); + rMCRegistry.fill(HIST("hPIDPionP"), track.pt(), track.eta(), collision.centFT0C()); } else if (particle.pdgCode() == kPiMinus) { // Neg pions - rMCRegistry.fill(HIST("hRecPionN"), track.pt(), track.eta()); + rMCRegistry.fill(HIST("hPIDPionN"), track.pt(), track.eta(), collision.centFT0C()); } else if (particle.pdgCode() == kKPlus) { // Pos kaons - rMCRegistry.fill(HIST("hRecKaonP"), track.pt(), track.eta()); + rMCRegistry.fill(HIST("hPIDKaonP"), track.pt(), track.eta(), collision.centFT0C()); } else if (particle.pdgCode() == kKMinus) { // Neg kaons - rMCRegistry.fill(HIST("hRecKaonN"), track.pt(), track.eta()); + rMCRegistry.fill(HIST("hPIDKaonN"), track.pt(), track.eta(), collision.centFT0C()); } else if (particle.pdgCode() == kProton) { // Pos protons - rMCRegistry.fill(HIST("hRecProtonP"), track.pt(), track.eta()); + rMCRegistry.fill(HIST("hPIDProtonP"), track.pt(), track.eta(), collision.centFT0C()); } else if (particle.pdgCode() == kProtonBar) { // Neg protons - rMCRegistry.fill(HIST("hRecProtonN"), track.pt(), track.eta()); + rMCRegistry.fill(HIST("hPIDProtonN"), track.pt(), track.eta(), collision.centFT0C()); } // Purity (PID) @@ -836,10 +933,19 @@ struct ThreeParticleCorrelations { dPhiStar = RecoDecay::constrainAngle(dPhi + std::asin(phaseProton * r) - std::asin(phaseTrack * r), -constants::math::PIHalf); if (r == rMin) { - if (!Mix) { - rPhiStarRegistry.fill(HIST("hSEProtonPreCut"), dPhiStar, dEta); - } else { - rPhiStarRegistry.fill(HIST("hMEProtonPreCut"), dPhiStar, dEta); + if (!Mix) { // Same-event + if (v0Sign(v0) * track.sign() == -1) { // OS + rPhiStarRegistry.fill(HIST("hSEProtonPreCut_OS"), dPhiStar, dEta); + } else if (v0Sign(v0) * track.sign() == 1) { // SS + rPhiStarRegistry.fill(HIST("hSEProtonPreCut_SS"), dPhiStar, dEta); + } + + } else { // Mixed-event + if (v0Sign(v0) * track.sign() == -1) { // OS + rPhiStarRegistry.fill(HIST("hMEProtonPreCut_OS"), dPhiStar, dEta); + } else if (v0Sign(v0) * track.sign() == 1) { // SS + rPhiStarRegistry.fill(HIST("hMEProtonPreCut_SS"), dPhiStar, dEta); + } } } @@ -848,10 +954,19 @@ struct ThreeParticleCorrelations { } if (r == rMin) { - if (!Mix) { - rPhiStarRegistry.fill(HIST("hSEProtonPostCut"), dPhiStar, dEta); - } else { - rPhiStarRegistry.fill(HIST("hMEProtonPostCut"), dPhiStar, dEta); + if (!Mix) { // Same-event + if (v0Sign(v0) * track.sign() == -1) { // OS + rPhiStarRegistry.fill(HIST("hSEProtonPostCut_OS"), dPhiStar, dEta); + } else if (v0Sign(v0) * track.sign() == 1) { // SS + rPhiStarRegistry.fill(HIST("hSEProtonPostCut_SS"), dPhiStar, dEta); + } + + } else { // Mixed-event + if (v0Sign(v0) * track.sign() == -1) { // OS + rPhiStarRegistry.fill(HIST("hMEProtonPostCut_OS"), dPhiStar, dEta); + } else if (v0Sign(v0) * track.sign() == 1) { // SS + rPhiStarRegistry.fill(HIST("hMEProtonPostCut_SS"), dPhiStar, dEta); + } } } } From f64d0e5693b869fa2f56cc1565513926f660c7ca Mon Sep 17 00:00:00 2001 From: Rik Spijkers <78484875+rspijkers@users.noreply.github.com> Date: Fri, 16 May 2025 23:39:15 +0200 Subject: [PATCH 1307/1650] [PWGLF] Add exception for empty bins in eff correction (#11229) --- .../Tasks/Strangeness/cascadecorrelations.cxx | 64 ++++++++++--------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx b/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx index 7c988dbb4ca..5c07269caed 100644 --- a/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx +++ b/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx @@ -437,8 +437,12 @@ struct CascadeCorrelations { double getEfficiency(TH1* h, double pT, double y = 0) { - // This function returns the value of histogram h corresponding to the x-coordinate pT - return h->GetBinContent(h->FindFixBin(pT, y)); + // This function returns 1 / eff + double eff = h->GetBinContent(h->FindFixBin(pT, y)); + if (eff == 0) + return 0; + else + return 1. / eff; } HistogramRegistry registry{ @@ -552,10 +556,10 @@ struct CascadeCorrelations { if (casc.isSelected() <= 2) { // not exclusively an Omega --> consistent with Xi or both if (casc.sign() < 0) { registry.fill(HIST("hMassXiMinus"), casc.mXi(), casc.pt()); - weight = 1. / getEfficiency(hEffXiMin, casc.pt()); + weight = getEfficiency(hEffXiMin, casc.pt()); } else { registry.fill(HIST("hMassXiPlus"), casc.mXi(), casc.pt()); - weight = 1. / getEfficiency(hEffXiPlus, casc.pt()); + weight = getEfficiency(hEffXiPlus, casc.pt()); } // LOGF(info, "casc pt %f, weight %f", casc.pt(), weight); registry.fill(HIST("hMassXiEffCorrected"), casc.mXi(), casc.pt(), casc.yXi(), collision.posZ(), collision.multFT0M(), weight); @@ -564,10 +568,10 @@ struct CascadeCorrelations { if (casc.isSelected() >= 2) { // consistent with Omega or both if (casc.sign() < 0) { registry.fill(HIST("hMassOmegaMinus"), casc.mOmega(), casc.pt()); - weight = 1. / getEfficiency(hEffOmegaMin, casc.pt()); + weight = getEfficiency(hEffOmegaMin, casc.pt()); } else { registry.fill(HIST("hMassOmegaPlus"), casc.mOmega(), casc.pt()); - weight = 1. / getEfficiency(hEffOmegaPlus, casc.pt()); + weight = getEfficiency(hEffOmegaPlus, casc.pt()); } registry.fill(HIST("hMassOmegaEffCorrected"), casc.mOmega(), casc.pt(), casc.yOmega(), collision.posZ(), collision.multFT0M(), weight); registry.fill(HIST("hRapidityOmega"), casc.yOmega()); @@ -648,29 +652,29 @@ struct CascadeCorrelations { // Fill the different THnSparses depending on PID logic (important for rapidity & inv mass information) if (trigger.isSelected() <= 2 && TMath::Abs(trigger.yXi()) < maxRapidity) { // trigger Xi if (doEfficiencyCorrection) - weightTrigg = trigger.sign() < 0 ? 1. / getEfficiency(hEffXiMin, trigger.pt()) : 1. / getEfficiency(hEffXiPlus, trigger.pt()); + weightTrigg = trigger.sign() < 0 ? getEfficiency(hEffXiMin, trigger.pt()) : getEfficiency(hEffXiPlus, trigger.pt()); if (assoc.isSelected() <= 2 && TMath::Abs(assoc.yXi()) < maxRapidity) { // assoc Xi if (doEfficiencyCorrection) - weightAssoc = assoc.sign() < 0 ? 1. / getEfficiency(hEffXiMin, assoc.pt()) : 1. / getEfficiency(hEffXiPlus, assoc.pt()); + weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffXiMin, assoc.pt()) : getEfficiency(hEffXiPlus, assoc.pt()); registry.fill(HIST("hXiXiOS"), dphi, trigger.yXi() - assoc.yXi(), trigger.pt(), assoc.pt(), invMassXiTrigg, invMassXiAssoc, collision.posZ(), collision.multFT0M(), weightTrigg * weightAssoc); } if (assoc.isSelected() >= 2 && TMath::Abs(assoc.yOmega()) < maxRapidity) { // assoc Omega if (doEfficiencyCorrection) - weightAssoc = assoc.sign() < 0 ? 1. / getEfficiency(hEffOmegaMin, assoc.pt()) : 1. / getEfficiency(hEffOmegaPlus, assoc.pt()); + weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffOmegaMin, assoc.pt()) : getEfficiency(hEffOmegaPlus, assoc.pt()); registry.fill(HIST("hXiOmOS"), dphi, trigger.yXi() - assoc.yOmega(), trigger.pt(), assoc.pt(), invMassXiTrigg, invMassOmAssoc, collision.posZ(), collision.multFT0M(), weightTrigg * weightAssoc); } } if (trigger.isSelected() >= 2 && TMath::Abs(trigger.yOmega()) < maxRapidity) { // trigger Omega if (doEfficiencyCorrection) - weightTrigg = trigger.sign() < 0 ? 1. / getEfficiency(hEffOmegaMin, trigger.pt()) : 1. / getEfficiency(hEffOmegaPlus, trigger.pt()); + weightTrigg = trigger.sign() < 0 ? getEfficiency(hEffOmegaMin, trigger.pt()) : getEfficiency(hEffOmegaPlus, trigger.pt()); if (assoc.isSelected() <= 2 && TMath::Abs(assoc.yXi()) < maxRapidity) { // assoc Xi if (doEfficiencyCorrection) - weightAssoc = assoc.sign() < 0 ? 1. / getEfficiency(hEffXiMin, assoc.pt()) : 1. / getEfficiency(hEffXiPlus, assoc.pt()); + weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffXiMin, assoc.pt()) : getEfficiency(hEffXiPlus, assoc.pt()); registry.fill(HIST("hOmXiOS"), dphi, trigger.yOmega() - assoc.yXi(), trigger.pt(), assoc.pt(), invMassOmTrigg, invMassXiAssoc, collision.posZ(), collision.multFT0M(), weightTrigg * weightAssoc); } if (assoc.isSelected() >= 2 && TMath::Abs(assoc.yOmega()) < maxRapidity) { // assoc Omega if (doEfficiencyCorrection) - weightAssoc = assoc.sign() < 0 ? 1. / getEfficiency(hEffOmegaMin, assoc.pt()) : 1. / getEfficiency(hEffOmegaPlus, assoc.pt()); + weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffOmegaMin, assoc.pt()) : getEfficiency(hEffOmegaPlus, assoc.pt()); registry.fill(HIST("hOmOmOS"), dphi, trigger.yOmega() - assoc.yOmega(), trigger.pt(), assoc.pt(), invMassOmTrigg, invMassOmAssoc, collision.posZ(), collision.multFT0M(), weightTrigg * weightAssoc); } } @@ -712,29 +716,29 @@ struct CascadeCorrelations { // Fill the different THnSparses depending on PID logic (important for rapidity & inv mass information) if (trigger.isSelected() <= 2 && TMath::Abs(trigger.yXi()) < maxRapidity) { // trigger Xi if (doEfficiencyCorrection) - weightTrigg = trigger.sign() < 0 ? 1. / getEfficiency(hEffXiMin, trigger.pt()) : 1. / getEfficiency(hEffXiPlus, trigger.pt()); + weightTrigg = trigger.sign() < 0 ? getEfficiency(hEffXiMin, trigger.pt()) : getEfficiency(hEffXiPlus, trigger.pt()); if (assoc.isSelected() <= 2 && TMath::Abs(assoc.yXi()) < maxRapidity) { // assoc Xi if (doEfficiencyCorrection) - weightAssoc = assoc.sign() < 0 ? 1. / getEfficiency(hEffXiMin, assoc.pt()) : 1. / getEfficiency(hEffXiPlus, assoc.pt()); + weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffXiMin, assoc.pt()) : getEfficiency(hEffXiPlus, assoc.pt()); registry.fill(HIST("hXiXiSS"), dphi, trigger.yXi() - assoc.yXi(), trigger.pt(), assoc.pt(), invMassXiTrigg, invMassXiAssoc, collision.posZ(), collision.multFT0M(), weightTrigg * weightAssoc); } if (assoc.isSelected() >= 2 && TMath::Abs(assoc.yOmega()) < maxRapidity) { // assoc Omega if (doEfficiencyCorrection) - weightAssoc = assoc.sign() < 0 ? 1. / getEfficiency(hEffOmegaMin, assoc.pt()) : 1. / getEfficiency(hEffOmegaPlus, assoc.pt()); + weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffOmegaMin, assoc.pt()) : getEfficiency(hEffOmegaPlus, assoc.pt()); registry.fill(HIST("hXiOmSS"), dphi, trigger.yXi() - assoc.yOmega(), trigger.pt(), assoc.pt(), invMassXiTrigg, invMassOmAssoc, collision.posZ(), collision.multFT0M(), weightTrigg * weightAssoc); } } if (trigger.isSelected() >= 2 && TMath::Abs(trigger.yOmega()) < maxRapidity) { // trigger Omega if (doEfficiencyCorrection) - weightTrigg = trigger.sign() < 0 ? 1. / getEfficiency(hEffOmegaMin, trigger.pt()) : 1. / getEfficiency(hEffOmegaPlus, trigger.pt()); + weightTrigg = trigger.sign() < 0 ? getEfficiency(hEffOmegaMin, trigger.pt()) : getEfficiency(hEffOmegaPlus, trigger.pt()); if (assoc.isSelected() <= 2 && TMath::Abs(assoc.yXi()) < maxRapidity) { // assoc Xi if (doEfficiencyCorrection) - weightAssoc = assoc.sign() < 0 ? 1. / getEfficiency(hEffXiMin, assoc.pt()) : 1. / getEfficiency(hEffXiPlus, assoc.pt()); + weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffXiMin, assoc.pt()) : getEfficiency(hEffXiPlus, assoc.pt()); registry.fill(HIST("hOmXiSS"), dphi, trigger.yOmega() - assoc.yXi(), trigger.pt(), assoc.pt(), invMassOmTrigg, invMassXiAssoc, collision.posZ(), collision.multFT0M(), weightTrigg * weightAssoc); } if (assoc.isSelected() >= 2 && TMath::Abs(assoc.yOmega()) < maxRapidity) { // assoc Omega if (doEfficiencyCorrection) - weightAssoc = assoc.sign() < 0 ? 1. / getEfficiency(hEffOmegaMin, assoc.pt()) : 1. / getEfficiency(hEffOmegaPlus, assoc.pt()); + weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffOmegaMin, assoc.pt()) : getEfficiency(hEffOmegaPlus, assoc.pt()); registry.fill(HIST("hOmOmSS"), dphi, trigger.yOmega() - assoc.yOmega(), trigger.pt(), assoc.pt(), invMassOmTrigg, invMassOmAssoc, collision.posZ(), collision.multFT0M(), weightTrigg * weightAssoc); } } @@ -824,29 +828,29 @@ struct CascadeCorrelations { // Fill the different THnSparses depending on PID logic (important for rapidity & inv mass information) if (trigger.isSelected() <= 2 && TMath::Abs(trigger.yXi()) < maxRapidity) { // trigger Xi if (doEfficiencyCorrection) - weightTrigg = trigger.sign() < 0 ? 1. / getEfficiency(hEffXiMin, trigger.pt()) : 1. / getEfficiency(hEffXiPlus, trigger.pt()); + weightTrigg = trigger.sign() < 0 ? getEfficiency(hEffXiMin, trigger.pt()) : getEfficiency(hEffXiPlus, trigger.pt()); if (assoc.isSelected() <= 2 && TMath::Abs(assoc.yXi()) < maxRapidity) { // assoc Xi if (doEfficiencyCorrection) - weightAssoc = assoc.sign() < 0 ? 1. / getEfficiency(hEffXiMin, assoc.pt()) : 1. / getEfficiency(hEffXiPlus, assoc.pt()); + weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffXiMin, assoc.pt()) : getEfficiency(hEffXiPlus, assoc.pt()); registry.fill(HIST("MixedEvents/hMEXiXiOS"), dphi, trigger.yXi() - assoc.yXi(), trigger.pt(), assoc.pt(), invMassXiTrigg, invMassXiAssoc, col1.posZ(), col1.multFT0M(), weightTrigg * weightAssoc); } if (assoc.isSelected() >= 2 && TMath::Abs(assoc.yOmega()) < maxRapidity) { // assoc Omega if (doEfficiencyCorrection) - weightAssoc = assoc.sign() < 0 ? 1. / getEfficiency(hEffOmegaMin, assoc.pt()) : 1. / getEfficiency(hEffOmegaPlus, assoc.pt()); + weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffOmegaMin, assoc.pt()) : getEfficiency(hEffOmegaPlus, assoc.pt()); registry.fill(HIST("MixedEvents/hMEXiOmOS"), dphi, trigger.yXi() - assoc.yOmega(), trigger.pt(), assoc.pt(), invMassXiTrigg, invMassOmAssoc, col1.posZ(), col1.multFT0M(), weightTrigg * weightAssoc); } } if (trigger.isSelected() >= 2 && TMath::Abs(trigger.yOmega()) < maxRapidity) { // trigger Omega if (doEfficiencyCorrection) - weightTrigg = trigger.sign() < 0 ? 1. / getEfficiency(hEffOmegaMin, trigger.pt()) : 1. / getEfficiency(hEffOmegaPlus, trigger.pt()); + weightTrigg = trigger.sign() < 0 ? getEfficiency(hEffOmegaMin, trigger.pt()) : getEfficiency(hEffOmegaPlus, trigger.pt()); if (assoc.isSelected() <= 2 && TMath::Abs(assoc.yXi()) < maxRapidity) { // assoc Xi if (doEfficiencyCorrection) - weightAssoc = assoc.sign() < 0 ? 1. / getEfficiency(hEffXiMin, assoc.pt()) : 1. / getEfficiency(hEffXiPlus, assoc.pt()); + weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffXiMin, assoc.pt()) : getEfficiency(hEffXiPlus, assoc.pt()); registry.fill(HIST("MixedEvents/hMEOmXiOS"), dphi, trigger.yOmega() - assoc.yXi(), trigger.pt(), assoc.pt(), invMassOmTrigg, invMassXiAssoc, col1.posZ(), col1.multFT0M(), weightTrigg * weightAssoc); } if (assoc.isSelected() >= 2 && TMath::Abs(assoc.yOmega()) < maxRapidity) { // assoc Omega if (doEfficiencyCorrection) - weightAssoc = assoc.sign() < 0 ? 1. / getEfficiency(hEffOmegaMin, assoc.pt()) : 1. / getEfficiency(hEffOmegaPlus, assoc.pt()); + weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffOmegaMin, assoc.pt()) : getEfficiency(hEffOmegaPlus, assoc.pt()); registry.fill(HIST("MixedEvents/hMEOmOmOS"), dphi, trigger.yOmega() - assoc.yOmega(), trigger.pt(), assoc.pt(), invMassOmTrigg, invMassOmAssoc, col1.posZ(), col1.multFT0M(), weightTrigg * weightAssoc); } } @@ -889,29 +893,29 @@ struct CascadeCorrelations { if (trigger.isSelected() <= 2 && TMath::Abs(trigger.yXi()) < maxRapidity) { // trigger Xi if (doEfficiencyCorrection) - weightTrigg = trigger.sign() < 0 ? 1. / getEfficiency(hEffXiMin, trigger.pt()) : 1. / getEfficiency(hEffXiPlus, trigger.pt()); + weightTrigg = trigger.sign() < 0 ? getEfficiency(hEffXiMin, trigger.pt()) : getEfficiency(hEffXiPlus, trigger.pt()); if (assoc.isSelected() <= 2 && TMath::Abs(assoc.yXi()) < maxRapidity) { // assoc Xi if (doEfficiencyCorrection) - weightAssoc = assoc.sign() < 0 ? 1. / getEfficiency(hEffXiMin, assoc.pt()) : 1. / getEfficiency(hEffXiPlus, assoc.pt()); + weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffXiMin, assoc.pt()) : getEfficiency(hEffXiPlus, assoc.pt()); registry.fill(HIST("MixedEvents/hMEXiXiSS"), dphi, trigger.yXi() - assoc.yXi(), trigger.pt(), assoc.pt(), invMassXiTrigg, invMassXiAssoc, col1.posZ(), col1.multFT0M(), weightTrigg * weightAssoc); } if (assoc.isSelected() >= 2 && TMath::Abs(assoc.yOmega()) < maxRapidity) { // assoc Omega if (doEfficiencyCorrection) - weightAssoc = assoc.sign() < 0 ? 1. / getEfficiency(hEffOmegaMin, assoc.pt()) : 1. / getEfficiency(hEffOmegaPlus, assoc.pt()); + weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffOmegaMin, assoc.pt()) : getEfficiency(hEffOmegaPlus, assoc.pt()); registry.fill(HIST("MixedEvents/hMEXiOmSS"), dphi, trigger.yXi() - assoc.yOmega(), trigger.pt(), assoc.pt(), invMassXiTrigg, invMassOmAssoc, col1.posZ(), col1.multFT0M(), weightTrigg * weightAssoc); } } if (trigger.isSelected() >= 2 && TMath::Abs(trigger.yOmega()) < maxRapidity) { // trigger Omega if (doEfficiencyCorrection) - weightTrigg = trigger.sign() < 0 ? 1. / getEfficiency(hEffOmegaMin, trigger.pt()) : 1. / getEfficiency(hEffOmegaPlus, trigger.pt()); + weightTrigg = trigger.sign() < 0 ? getEfficiency(hEffOmegaMin, trigger.pt()) : getEfficiency(hEffOmegaPlus, trigger.pt()); if (assoc.isSelected() <= 2 && TMath::Abs(assoc.yXi()) < maxRapidity) { // assoc Xi if (doEfficiencyCorrection) - weightAssoc = assoc.sign() < 0 ? 1. / getEfficiency(hEffXiMin, assoc.pt()) : 1. / getEfficiency(hEffXiPlus, assoc.pt()); + weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffXiMin, assoc.pt()) : getEfficiency(hEffXiPlus, assoc.pt()); registry.fill(HIST("MixedEvents/hMEOmXiSS"), dphi, trigger.yOmega() - assoc.yXi(), trigger.pt(), assoc.pt(), invMassOmTrigg, invMassXiAssoc, col1.posZ(), col1.multFT0M(), weightTrigg * weightAssoc); } if (assoc.isSelected() >= 2 && TMath::Abs(assoc.yOmega()) < maxRapidity) { // assoc Omega if (doEfficiencyCorrection) - weightAssoc = assoc.sign() < 0 ? 1. / getEfficiency(hEffOmegaMin, assoc.pt()) : 1. / getEfficiency(hEffOmegaPlus, assoc.pt()); + weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffOmegaMin, assoc.pt()) : getEfficiency(hEffOmegaPlus, assoc.pt()); registry.fill(HIST("MixedEvents/hMEOmOmSS"), dphi, trigger.yOmega() - assoc.yOmega(), trigger.pt(), assoc.pt(), invMassOmTrigg, invMassOmAssoc, col1.posZ(), col1.multFT0M(), weightTrigg * weightAssoc); } } From f3268c0c53c858fd22fc05222b14a67fa07b05e0 Mon Sep 17 00:00:00 2001 From: prottayCMT <61418725+prottayCMT@users.noreply.github.com> Date: Sat, 17 May 2025 16:32:04 +0200 Subject: [PATCH 1308/1650] [PWGLF] added ZvtxFT0CvsPV cut before calib (#11232) Co-authored-by: Prottay Das --- PWGLF/TableProducer/Common/spvector.cxx | 51 +++++++++++++------------ 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/PWGLF/TableProducer/Common/spvector.cxx b/PWGLF/TableProducer/Common/spvector.cxx index 20f5f738255..abcca438cf8 100644 --- a/PWGLF/TableProducer/Common/spvector.cxx +++ b/PWGLF/TableProducer/Common/spvector.cxx @@ -21,6 +21,7 @@ #include #include #include +#include #include "Math/Vector4D.h" #include "TRandom3.h" #include "TF1.h" @@ -305,11 +306,11 @@ struct spvector { TAxis* channelAxis = hrecentereSp->GetAxis(4); // Axis 4: channel // Find bin indices for centrality, vx, vy, vz, and channel (for meanxA, 0.5) - binCoords[0] = centralityAxis->FindBin(centrality); // Centrality - binCoords[1] = vxAxis->FindBin(vx); // vx - binCoords[2] = vyAxis->FindBin(vy); // vy - binCoords[3] = vzAxis->FindBin(vz); // vz - binCoords[4] = channelAxis->FindBin(0.5); // Channel for meanxA + binCoords[0] = centralityAxis->FindBin(centrality + 0.00001); // Centrality + binCoords[1] = vxAxis->FindBin(vx + 0.00001); // vx + binCoords[2] = vyAxis->FindBin(vy + 0.00001); // vy + binCoords[3] = vzAxis->FindBin(vz + 0.00001); // vz + binCoords[4] = channelAxis->FindBin(0.5); // Channel for meanxA // Get the global bin for meanxA int globalBinMeanxA = hrecentereSp->GetBin(binCoords); @@ -353,25 +354,25 @@ struct spvector { hrecenterevzSp = ccdb->getForTimeStamp(ConfRecenterevzSpp.value, ts); }*/ - double meanxAcent = hrecenterecentSp->GetBinContent(hrecenterecentSp->FindBin(centrality, 0.5)); - double meanyAcent = hrecenterecentSp->GetBinContent(hrecenterecentSp->FindBin(centrality, 1.5)); - double meanxCcent = hrecenterecentSp->GetBinContent(hrecenterecentSp->FindBin(centrality, 2.5)); - double meanyCcent = hrecenterecentSp->GetBinContent(hrecenterecentSp->FindBin(centrality, 3.5)); + double meanxAcent = hrecenterecentSp->GetBinContent(hrecenterecentSp->FindBin(centrality + 0.00001, 0.5)); + double meanyAcent = hrecenterecentSp->GetBinContent(hrecenterecentSp->FindBin(centrality + 0.00001, 1.5)); + double meanxCcent = hrecenterecentSp->GetBinContent(hrecenterecentSp->FindBin(centrality + 0.00001, 2.5)); + double meanyCcent = hrecenterecentSp->GetBinContent(hrecenterecentSp->FindBin(centrality + 0.00001, 3.5)); - double meanxAvx = hrecenterevxSp->GetBinContent(hrecenterevxSp->FindBin(vx, 0.5)); - double meanyAvx = hrecenterevxSp->GetBinContent(hrecenterevxSp->FindBin(vx, 1.5)); - double meanxCvx = hrecenterevxSp->GetBinContent(hrecenterevxSp->FindBin(vx, 2.5)); - double meanyCvx = hrecenterevxSp->GetBinContent(hrecenterevxSp->FindBin(vx, 3.5)); + double meanxAvx = hrecenterevxSp->GetBinContent(hrecenterevxSp->FindBin(vx + 0.00001, 0.5)); + double meanyAvx = hrecenterevxSp->GetBinContent(hrecenterevxSp->FindBin(vx + 0.00001, 1.5)); + double meanxCvx = hrecenterevxSp->GetBinContent(hrecenterevxSp->FindBin(vx + 0.00001, 2.5)); + double meanyCvx = hrecenterevxSp->GetBinContent(hrecenterevxSp->FindBin(vx + 0.00001, 3.5)); - double meanxAvy = hrecenterevySp->GetBinContent(hrecenterevySp->FindBin(vy, 0.5)); - double meanyAvy = hrecenterevySp->GetBinContent(hrecenterevySp->FindBin(vy, 1.5)); - double meanxCvy = hrecenterevySp->GetBinContent(hrecenterevySp->FindBin(vy, 2.5)); - double meanyCvy = hrecenterevySp->GetBinContent(hrecenterevySp->FindBin(vy, 3.5)); + double meanxAvy = hrecenterevySp->GetBinContent(hrecenterevySp->FindBin(vy + 0.00001, 0.5)); + double meanyAvy = hrecenterevySp->GetBinContent(hrecenterevySp->FindBin(vy + 0.00001, 1.5)); + double meanxCvy = hrecenterevySp->GetBinContent(hrecenterevySp->FindBin(vy + 0.00001, 2.5)); + double meanyCvy = hrecenterevySp->GetBinContent(hrecenterevySp->FindBin(vy + 0.00001, 3.5)); - double meanxAvz = hrecenterevzSp->GetBinContent(hrecenterevzSp->FindBin(vz, 0.5)); - double meanyAvz = hrecenterevzSp->GetBinContent(hrecenterevzSp->FindBin(vz, 1.5)); - double meanxCvz = hrecenterevzSp->GetBinContent(hrecenterevzSp->FindBin(vz, 2.5)); - double meanyCvz = hrecenterevzSp->GetBinContent(hrecenterevzSp->FindBin(vz, 3.5)); + double meanxAvz = hrecenterevzSp->GetBinContent(hrecenterevzSp->FindBin(vz + 0.00001, 0.5)); + double meanyAvz = hrecenterevzSp->GetBinContent(hrecenterevzSp->FindBin(vz + 0.00001, 1.5)); + double meanxCvz = hrecenterevzSp->GetBinContent(hrecenterevzSp->FindBin(vz + 0.00001, 2.5)); + double meanyCvz = hrecenterevzSp->GetBinContent(hrecenterevzSp->FindBin(vz + 0.00001, 3.5)); qxZDCA = qxZDCA - meanxAcent - meanxAvx - meanxAvy - meanxAvz; qyZDCA = qyZDCA - meanyAcent - meanyAvx - meanyAvy - meanyAvz; @@ -440,7 +441,7 @@ struct spvector { } // if (collision.sel8() && centrality > cfgCutCentralityMin && centrality < cfgCutCentralityMax && TMath::Abs(vz) < cfgCutVertex && collision.has_foundFT0() && eventSelected(collision, centrality) && collision.selection_bit(aod::evsel::kNoTimeFrameBorder) && collision.selection_bit(aod::evsel::kNoITSROFrameBorder)) { - if (collision.sel8() && centrality > cfgCutCentralityMin && centrality < cfgCutCentralityMax && TMath::Abs(vz) < cfgCutVertex && collision.has_foundFT0() && collision.selection_bit(aod::evsel::kNoTimeFrameBorder) && collision.selection_bit(aod::evsel::kNoITSROFrameBorder)) { + if (collision.sel8() && centrality > cfgCutCentralityMin && centrality < cfgCutCentralityMax && TMath::Abs(vz) < cfgCutVertex && collision.has_foundFT0() && collision.selection_bit(aod::evsel::kNoTimeFrameBorder) && collision.selection_bit(aod::evsel::kNoITSROFrameBorder) && collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { triggerevent = true; if (useGainCallib && (currentRunNumber != lastRunNumber)) { gainprofile = ccdb->getForTimeStamp(ConfGainPath.value, bc.timestamp()); @@ -457,7 +458,7 @@ struct spvector { for (std::size_t iChA = 0; iChA < 8; iChA++) { auto chanelid = iChA; if (useGainCallib && gainprofile) { - gainequal = gainprofile->GetBinContent(gainprofile->FindBin(vz, chanelid + 0.5)); + gainequal = gainprofile->GetBinContent(gainprofile->FindBin(vz + 0.00001, chanelid + 0.5)); } if (iChA < 4) { @@ -530,6 +531,7 @@ struct spvector { Bool_t res = 0; Bool_t resfine = 0; + Int_t check = 1; if (coarse1) { if (useRecentereSp && (currentRunNumber != lastRunNumber)) { @@ -624,7 +626,8 @@ struct spvector { res = Correctcoarse(hrecentereSpA[5], centrality, vx, vy, vz, qxZDCA, qyZDCA, qxZDCC, qyZDCC); } - if (res == 0 || resfine == 0) { + if (res == 0 && resfine == 0 && check == 0) { + LOG(info) << "Histograms are null"; } psiZDCC = 1.0 * TMath::ATan2(qyZDCC, qxZDCC); psiZDCA = 1.0 * TMath::ATan2(qyZDCA, qxZDCA); From cf82d3586b416f79690fa5db0b2dc5d7eb4edd0a Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Sat, 17 May 2025 17:06:24 +0200 Subject: [PATCH 1309/1650] [PWGLF] Add new process function for event mixing (#11233) --- .../Tasks/Strangeness/taskLambdaSpinCorr.cxx | 642 ++++++++++-------- 1 file changed, 356 insertions(+), 286 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx index 4935cfc09f0..78a01b9f9fb 100644 --- a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx +++ b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx @@ -14,6 +14,7 @@ /// /// \author prottay.das@cern.ch +#include #include #include "Math/Vector3D.h" #include "Math/Vector4D.h" @@ -48,7 +49,13 @@ using std::array; struct LfTaskLambdaSpinCorr { Service ccdb; - + // mixing + ConfigurableAxis axisVertex{"axisVertex", {5, -10, 10}, "vertex axis for bin"}; + ConfigurableAxis axisMultiplicityClass{"axisMultiplicityClass", {8, 0, 80}, "multiplicity percentile for bin"}; + Configurable nMix{"nMix", 5, "number of event mixing"}; + Configurable ptMix{"ptMix", 1.0, "pt cut on mixing"}; + Configurable etaMix{"etaMix", 0.4, "eta cut on mixing"}; + Configurable phiMix{"phiMix", 0.2, "phi cut on mixing"}; // fill output Configurable additionalEvSel{"additionalEvSel", false, "additionalEvSel"}; Configurable additionalEvSel3{"additionalEvSel3", false, "additionalEvSel3"}; @@ -65,6 +72,7 @@ struct LfTaskLambdaSpinCorr { Configurable cfgCutEta{"cfgCutEta", 0.8, "Eta cut on daughter track"}; // Configs for V0 Configurable confV0PtMin{"confV0PtMin", 0.f, "Minimum transverse momentum of V0"}; + Configurable confV0PtMax{"confV0PtMax", 0.f, "Maximum transverse momentum of V0"}; Configurable confV0Rap{"confV0Rap", 0.8f, "Rapidity range of V0"}; Configurable confV0DCADaughMax{"confV0DCADaughMax", 0.2f, "Maximum DCA between the V0 daughters"}; Configurable confV0CPAMin{"confV0CPAMin", 0.9998f, "Minimum CPA of V0"}; @@ -86,15 +94,14 @@ struct LfTaskLambdaSpinCorr { Configurable iMNbins{"iMNbins", 100, "Number of bins in invariant mass"}; Configurable lbinIM{"lbinIM", 1.0, "lower bin value in IM histograms"}; Configurable hbinIM{"hbinIM", 1.2, "higher bin value in IM histograms"}; - Configurable iMNbinspair{"iMNbinspair", 100, "Number of bins in invariant mass pair"}; - Configurable lbinIMpair{"lbinIMpair", 1.0, "lower bin value in IMpair histograms"}; - Configurable hbinIMpair{"hbinIMpair", 1.2, "higher bin value in IMpair histograms"}; + Configurable iMNbinspair{"iMNbinspair", 400, "Number of bins in invariant mass pair"}; + Configurable lbinIMpair{"lbinIMpair", 0.0, "lower bin value in IMpair histograms"}; + Configurable hbinIMpair{"hbinIMpair", 8.0, "higher bin value in IMpair histograms"}; ConfigurableAxis configcentAxis{"configcentAxis", {VARIABLE_WIDTH, 0.0, 10.0, 40.0, 80.0}, "Cent V0M"}; ConfigurableAxis configthnAxisPt{"configthnAxisPt", {VARIABLE_WIDTH, 0.2, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 6.5, 8.0, 10.0, 100.0}, "#it{p}_{T} (GeV/#it{c})"}; ConfigurableAxis configthnAxisPol{"configthnAxisPol", {VARIABLE_WIDTH, -1.0, -0.6, -0.2, 0, 0.2, 0.4, 0.8}, "Pol"}; - SliceCache cache; HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; void init(o2::framework::InitContext&) @@ -106,25 +113,25 @@ struct LfTaskLambdaSpinCorr { histos.add("hSparseLambdaLambda", "hSparseLambdaLambda", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); histos.add("hSparseLambdaAntiLambda", "hSparseLambdaAntiLambda", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); - histos.add("hSparseAntiLambdaLambda", "hSparseAntiLambdaLambda", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); histos.add("hSparseAntiLambdaAntiLambda", "hSparseAntiLambdaAntiLambda", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + histos.add("hSparseLambdaLambdaMixed", "hSparseLambdaLambdaMixed", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + histos.add("hSparseLambdaAntiLambdaMixed", "hSparseLambdaAntiLambdaMixed", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + histos.add("hSparseAntiLambdaAntiLambdaMixed", "hSparseAntiLambdaAntiLambdaMixed", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); + if (fillQA) { ///////// along quantization axes/////////// histos.add("hSparseLambdaLambdaQA", "hSparseLambdaLambdaQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); histos.add("hSparseLambdaAntiLambdaQA", "hSparseLambdaAntiLambdaQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); - histos.add("hSparseAntiLambdaLambdaQA", "hSparseAntiLambdaLambdaQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); histos.add("hSparseAntiLambdaAntiLambdaQA", "hSparseAntiLambdaAntiLambdaQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); } if (fillGEN) { histos.add("hSparseLambdaLambdaMC", "hSparseLambdaLambdaMC", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); histos.add("hSparseLambdaAntiLambdaMC", "hSparseLambdaAntiLambdaMC", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); - histos.add("hSparseAntiLambdaLambdaMC", "hSparseAntiLambdaLambdaMC", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); histos.add("hSparseAntiLambdaAntiLambdaMC", "hSparseAntiLambdaAntiLambdaMC", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); if (fillQA) { histos.add("hSparseLambdaLambdaMCQA", "hSparseLambdaLambdaMCQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); histos.add("hSparseLambdaAntiLambdaMCQA", "hSparseLambdaAntiLambdaMCQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); - histos.add("hSparseAntiLambdaLambdaMCQA", "hSparseAntiLambdaLambdaMCQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); histos.add("hSparseAntiLambdaAntiLambdaMCQA", "hSparseAntiLambdaAntiLambdaMCQA", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); } } @@ -146,6 +153,9 @@ struct LfTaskLambdaSpinCorr { if (pT < confV0PtMin) { return false; } + if (pT > confV0PtMax) { + return false; + } if (dcaDaughv0 > confV0DCADaughMax) { return false; } @@ -221,16 +231,21 @@ struct LfTaskLambdaSpinCorr { (AntiLambdadummy.M() > minMass && AntiLambdadummy.M() < maxMass)); } - void fillHistograms(bool tag1, bool tag2, bool tag3, bool tag4, const ROOT::Math::PxPyPzMVector& particlepair, + void fillHistograms(bool tag1, bool tag2, bool tag3, bool tag4, const ROOT::Math::PxPyPzMVector& particle1, const ROOT::Math::PxPyPzMVector& particle2, const ROOT::Math::PxPyPzMVector& daughpart1, const ROOT::Math::PxPyPzMVector& daughpart2, - double centrality, bool datatype) + double centrality, int datatype) { - ROOT::Math::Boost boostPairToCM{particlepair.BoostToCM()}; // boosting vector for pair CM + auto particle1Dummy = ROOT::Math::PxPyPzMVector(particle1.Px(), particle1.Py(), particle1.Pz(), 1.115683); + auto particle2Dummy = ROOT::Math::PxPyPzMVector(particle2.Px(), particle2.Py(), particle2.Pz(), 1.115683); + auto pairDummy = particle1Dummy + particle2Dummy; + // auto pairParticle = particle1 + particle2; + + ROOT::Math::Boost boostPairToCM{pairDummy.BoostToCM()}; // boosting vector for pair CM // Boosting both Lambdas to Lambda-Lambda pair rest frame - auto lambda1CM = boostPairToCM(particle1); - auto lambda2CM = boostPairToCM(particle2); + auto lambda1CM = boostPairToCM(particle1Dummy); + auto lambda2CM = boostPairToCM(particle2Dummy); // Step 2: Boost Each Lambda to its Own Rest Frame ROOT::Math::Boost boostLambda1ToCM{lambda1CM.BoostToCM()}; @@ -244,97 +259,50 @@ struct LfTaskLambdaSpinCorr { auto proton1LambdaRF = boostLambda1ToCM(proton1pairCM); auto proton2LambdaRF = boostLambda2ToCM(proton2pairCM); - // Method2 - /* - ROOT::Math::XYZVector quantizationAxis = lambda1CM.Vect().Unit(); // Unit vector along Lambda1's direction in pair rest frame - double cosTheta1 = proton1LambdaRF.Vect().Unit().Dot(quantizationAxis); - double cosTheta2 = proton2LambdaRF.Vect().Unit().Dot(-quantizationAxis); // Opposite for Lambda2 - - double theta1 = std::acos(cosTheta1); // angle in radians - double theta2 = std::acos(cosTheta2); // angle in radians - double cosThetaDiff = std::cos(theta1 - theta2); - */ - // STAR method double cosThetaDiff = proton1LambdaRF.Vect().Unit().Dot(proton2LambdaRF.Vect().Unit()); - - auto lowptcut = 0.5; - auto highptcut = 10.0; + double deltaR = TMath::Sqrt(TMath::Power(particle1.Eta() - particle2.Eta(), 2.0) + TMath::Power(particle1.Phi() - particle2.Phi(), 2.0)); + if (datatype == 0) { + if (tag1 && tag3) { + histos.fill(HIST("hSparseLambdaLambda"), particle1.M(), particle2.M(), cosThetaDiff, centrality, deltaR); + } + if (tag2 && tag4) { + histos.fill(HIST("hSparseAntiLambdaAntiLambda"), particle1.M(), particle2.M(), cosThetaDiff, centrality, deltaR); + } + if (tag1 && tag4) { + histos.fill(HIST("hSparseLambdaAntiLambda"), particle1.M(), particle2.M(), cosThetaDiff, centrality, deltaR); + } + if (tag2 && tag3) { + histos.fill(HIST("hSparseLambdaAntiLambda"), particle2.M(), particle1.M(), cosThetaDiff, centrality, deltaR); + } + } if (datatype == 1) { - if (tag1 && tag3) - histos.fill(HIST("hSparseLambdaLambdaMC"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); - if (tag1 && tag4) - histos.fill(HIST("hSparseLambdaAntiLambdaMC"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); - if (tag2 && tag3) - histos.fill(HIST("hSparseAntiLambdaLambdaMC"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); - if (tag2 && tag4) - histos.fill(HIST("hSparseAntiLambdaAntiLambdaMC"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); - } else { - if (particle1.Pt() > lowptcut && particle1.Pt() < highptcut && particle2.Pt() > lowptcut && particle2.Pt() < highptcut) { - if (tag1 && tag3) - histos.fill(HIST("hSparseLambdaLambda"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); - if (tag1 && tag4) - histos.fill(HIST("hSparseLambdaAntiLambda"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); - if (tag2 && tag3) - histos.fill(HIST("hSparseAntiLambdaLambda"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); - if (tag2 && tag4) - histos.fill(HIST("hSparseAntiLambdaAntiLambda"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); + if (tag1 && tag3) { + histos.fill(HIST("hSparseLambdaLambdaMC"), particle1.M(), particle2.M(), cosThetaDiff, centrality, deltaR); + } + if (tag2 && tag4) { + histos.fill(HIST("hSparseAntiLambdaAntiLambdaMC"), particle1.M(), particle2.M(), cosThetaDiff, centrality, deltaR); + } + if (tag1 && tag4) { + histos.fill(HIST("hSparseLambdaAntiLambdaMC"), particle1.M(), particle2.M(), cosThetaDiff, centrality, deltaR); + } + if (tag2 && tag3) { + histos.fill(HIST("hSparseLambdaAntiLambdaMC"), particle2.M(), particle1.M(), cosThetaDiff, centrality, deltaR); } } - } - - void fillHistograms2(bool tag1, bool tag2, bool tag3, bool tag4, const ROOT::Math::PxPyPzMVector& particlepair, - const ROOT::Math::PxPyPzMVector& particle1, const ROOT::Math::PxPyPzMVector& particle2, - const ROOT::Math::PxPyPzMVector& daughpart1, const ROOT::Math::PxPyPzMVector& daughpart2, - double centrality, bool datatype) - { - - ROOT::Math::Boost boostPairToCM{particlepair.BoostToCM()}; // boosting vector for pair CM - // Boosting both Lambdas to Lambda-Lambda pair rest frame - auto lambda1CM = boostPairToCM(particle1); - auto lambda2CM = boostPairToCM(particle2); - // Step 2: Boost Each Lambda to its Own Rest Frame - ROOT::Math::Boost boostLambda1ToCM{lambda1CM.BoostToCM()}; - ROOT::Math::Boost boostLambda2ToCM{lambda2CM.BoostToCM()}; - - ROOT::Math::XYZVector quantizationAxis = lambda1CM.Vect().Unit(); // Unit vector along Lambda1's direction in pair rest frame - - // Also boost the daughter protons to the same frame - auto proton1pairCM = boostPairToCM(daughpart1); // proton1 to pair CM - auto proton2pairCM = boostPairToCM(daughpart2); // proton2 to pair CM - - // Boost protons into their respective Lambda rest frames - auto proton1LambdaRF = boostLambda1ToCM(proton1pairCM); - auto proton2LambdaRF = boostLambda2ToCM(proton2pairCM); - - double cosTheta1 = proton1LambdaRF.Vect().Unit().Dot(quantizationAxis); - double cosTheta2 = proton2LambdaRF.Vect().Unit().Dot(quantizationAxis); - - double cosThetaDiff = cosTheta1 * cosTheta2; - - auto lowptcut = 0.5; - auto highptcut = 10.0; - - if (datatype == 1) { - if (tag1 && tag3) - histos.fill(HIST("hSparseLambdaLambdaMCQA"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); - if (tag1 && tag4) - histos.fill(HIST("hSparseLambdaAntiLambdaMCQA"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); - if (tag2 && tag3) - histos.fill(HIST("hSparseAntiLambdaLambdaMCQA"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); - if (tag2 && tag4) - histos.fill(HIST("hSparseAntiLambdaAntiLambdaMCQA"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); - } else { - if (particle1.Pt() > lowptcut && particle1.Pt() < highptcut && particle2.Pt() > lowptcut && particle2.Pt() < highptcut) { - if (tag1 && tag3) - histos.fill(HIST("hSparseLambdaLambdaQA"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); - if (tag1 && tag4) - histos.fill(HIST("hSparseLambdaAntiLambdaQA"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); - if (tag2 && tag3) - histos.fill(HIST("hSparseAntiLambdaLambdaQA"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); - if (tag2 && tag4) - histos.fill(HIST("hSparseAntiLambdaAntiLambdaQA"), particle1.M(), particle2.M(), cosThetaDiff, centrality, particlepair.M()); + if (datatype == 2) { + if (tag1 && tag3) { + histos.fill(HIST("hSparseLambdaLambdaMixed"), particle1.M(), particle2.M(), cosThetaDiff, centrality, deltaR); + } + if (tag2 && tag4) { + histos.fill(HIST("hSparseAntiLambdaAntiLambdaMixed"), particle1.M(), particle2.M(), cosThetaDiff, centrality, deltaR); + } + if (tag1 && tag4) { + histos.fill(HIST("hSparseLambdaAntiLambdaMixed"), particle1.M(), particle2.M(), cosThetaDiff, centrality, deltaR); + } + if (tag2 && tag3) { + histos.fill(HIST("hSparseLambdaAntiLambdaMixed"), particle2.M(), particle1.M(), cosThetaDiff, centrality, deltaR); } } } @@ -369,11 +337,6 @@ struct LfTaskLambdaSpinCorr { return {0, 0, false}; // Fails selection } - const auto netav = 0.8; - if (std::abs(v0.eta()) > netav) { - return {0, 0, false}; // Fails selection - } - return {lambdaTag, aLambdaTag, true}; // Valid candidate } @@ -415,14 +378,10 @@ struct LfTaskLambdaSpinCorr { return {lambdaTag, aLambdaTag, true}; // Valid candidate } - ROOT::Math::PxPyPzMVector lambda, antiLambda, lambdadummy, antiLambdadummy, proton, pion, antiProton, antiPion, fourVecDauCM; - ROOT::Math::PxPyPzMVector lambda2, antiLambda2, lambdadummy2, antiLambdadummy2, proton2, pion2, antiProton2, antiPion2; - ROOT::Math::PxPyPzMVector lambdaLambdapair, lambdaAntiLambdapair, antiLambdaLambdapair, antiLambdaAntiLambdapair; - ROOT::Math::PxPyPzMVector lambdamc, antiLambdamc, lambdadummymc, antiLambdadummymc, protonmc, pionmc, antiProtonmc, antiPionmc; - ROOT::Math::PxPyPzMVector lambda2mcmc, antiLambda2mc, lambdadummy2mc, antiLambdadummy2mc, proton2mc, pion2mc, antiProton2mc, antiPion2mc; - ROOT::Math::PxPyPzMVector lambdaLambdapairmc, lambdaAntiLambdapairmc, antiLambdaLambdapairmc, antiLambdaAntiLambdapairmc; - - ROOT::Math::XYZVector threeVecDauCM, threeVecDauCMXY; + ROOT::Math::PxPyPzMVector lambda, antiLambda, proton, pion, antiProton, antiPion; + ROOT::Math::PxPyPzMVector lambda2, antiLambda2, proton2, pion2, antiProton2, antiPion2; + ROOT::Math::PxPyPzMVector lambdamc, antiLambdamc, protonmc, pionmc, antiProtonmc, antiPionmc; + ROOT::Math::PxPyPzMVector lambda2mc, antiLambda2mc, proton2mc, pion2mc, antiProton2mc, antiPion2mc; Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; Filter centralityFilter = (nabs(aod::cent::centFT0C) < cfgCutCentralityMax && nabs(aod::cent::centFT0C) > cfgCutCentralityMin); @@ -433,17 +392,12 @@ struct LfTaskLambdaSpinCorr { using AllTrackCandidates = soa::Join; using ResoV0s = aod::V0Datas; - void processData(EventCandidates::iterator const& collision, AllTrackCandidates const& /*tracks*/, ResoV0s const& V0s, aod::BCs const&) + void processData(EventCandidates::iterator const& collision, AllTrackCandidates const& /*tracks*/, ResoV0s const& V0s) { - if (!collision.sel8()) { return; } auto centrality = collision.centFT0C(); - /*if (!collision.triggereventsp()) { - return; - }*/ - if (additionalEvSel && (!collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { return; } @@ -451,122 +405,196 @@ struct LfTaskLambdaSpinCorr { if (additionalEvSel3 && (!collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(aod::evsel::kNoITSROFrameBorder))) { return; } - histos.fill(HIST("hCentrality"), centrality); - for (const auto& v0 : V0s) { - auto [lambdaTag, aLambdaTag, isValid] = getLambdaTags(v0, collision); - if (!isValid) + if (!isValid) { continue; - + } + if (lambdaTag && aLambdaTag) { + continue; + } if (lambdaTag) { proton = ROOT::Math::PxPyPzMVector(v0.pxpos(), v0.pypos(), v0.pzpos(), o2::constants::physics::MassProton); antiPion = ROOT::Math::PxPyPzMVector(v0.pxneg(), v0.pyneg(), v0.pzneg(), o2::constants::physics::MassPionCharged); - lambdadummy = proton + antiPion; + lambda = proton + antiPion; } if (aLambdaTag) { antiProton = ROOT::Math::PxPyPzMVector(v0.pxneg(), v0.pyneg(), v0.pzneg(), o2::constants::physics::MassProton); pion = ROOT::Math::PxPyPzMVector(v0.pxpos(), v0.pypos(), v0.pzpos(), o2::constants::physics::MassPionCharged); - antiLambdadummy = antiProton + pion; - } - - if (shouldReject(lambdaTag, aLambdaTag, lambdadummy, antiLambdadummy)) { - continue; + antiLambda = antiProton + pion; } - int taga = lambdaTag; - int tagb = aLambdaTag; - auto postrack1 = v0.template posTrack_as(); auto negtrack1 = v0.template negTrack_as(); // 2nd loop for combination of lambda lambda for (const auto& v02 : V0s) { - - if (v0.v0Id() >= v02.v0Id()) + if (v02.v0Id() <= v0.v0Id()) { continue; - + } auto [lambdaTag2, aLambdaTag2, isValid2] = getLambdaTags(v02, collision); - if (!isValid2) + if (!isValid2) { continue; - + } + if (lambdaTag2 && aLambdaTag2) { + continue; + } if (lambdaTag2) { proton2 = ROOT::Math::PxPyPzMVector(v02.pxpos(), v02.pypos(), v02.pzpos(), o2::constants::physics::MassProton); antiPion2 = ROOT::Math::PxPyPzMVector(v02.pxneg(), v02.pyneg(), v02.pzneg(), o2::constants::physics::MassPionCharged); - lambdadummy2 = proton2 + antiPion2; + lambda2 = proton2 + antiPion2; } if (aLambdaTag2) { antiProton2 = ROOT::Math::PxPyPzMVector(v02.pxneg(), v02.pyneg(), v02.pzneg(), o2::constants::physics::MassProton); pion2 = ROOT::Math::PxPyPzMVector(v02.pxpos(), v02.pypos(), v02.pzpos(), o2::constants::physics::MassPionCharged); - antiLambdadummy2 = antiProton2 + pion2; + antiLambda2 = antiProton2 + pion2; } - - if (shouldReject(lambdaTag2, aLambdaTag2, lambdadummy2, antiLambdadummy2)) { - continue; - } - - int taga2 = lambdaTag2; - int tagb2 = aLambdaTag2; - auto postrack2 = v02.template posTrack_as(); auto negtrack2 = v02.template negTrack_as(); - if (postrack1.globalIndex() == postrack2.globalIndex() || negtrack1.globalIndex() == negtrack2.globalIndex()) { - continue; // no shared decay products + continue; } - if (lambdaTag && lambdaTag2) { - lambdaLambdapair = lambdadummy + lambdadummy2; - tagb = 0; - tagb2 = 0; - fillHistograms(taga, tagb, taga2, tagb2, lambdaLambdapair, lambdadummy, lambdadummy2, proton, proton2, centrality, 0); - if (fillQA) { - fillHistograms2(taga, tagb, taga2, tagb2, lambdaLambdapair, lambdadummy, lambdadummy2, proton, proton2, centrality, 0); - } + fillHistograms(1, 0, 1, 0, lambda, lambda2, proton, proton2, centrality, 0); + } + if (aLambdaTag && aLambdaTag2) { + fillHistograms(0, 1, 0, 1, antiLambda, antiLambda2, antiProton, antiProton2, centrality, 0); } - - tagb2 = aLambdaTag2; - if (lambdaTag && aLambdaTag2) { - lambdaAntiLambdapair = lambdadummy + antiLambdadummy2; - tagb = 0; - taga2 = 0; - fillHistograms(taga, tagb, taga2, tagb2, lambdaAntiLambdapair, lambdadummy, antiLambdadummy2, proton, antiProton2, centrality, 0); - if (fillQA) { - fillHistograms2(taga, tagb, taga2, tagb2, lambdaAntiLambdapair, lambdadummy, antiLambdadummy2, proton, antiProton2, centrality, 0); - } + fillHistograms(1, 0, 0, 1, lambda, antiLambda2, proton, antiProton2, centrality, 0); } + if (aLambdaTag && lambdaTag2) { + fillHistograms(0, 1, 1, 0, antiLambda, lambda2, antiProton, proton2, centrality, 0); + } + } + } + } + PROCESS_SWITCH(LfTaskLambdaSpinCorr, processData, "Process data", false); - tagb = aLambdaTag; - taga2 = lambdaTag2; + // Processing Event Mixing + SliceCache cache; + using BinningType = ColumnBinningPolicy; + BinningType colBinning{{axisVertex, axisMultiplicityClass}, true}; + Preslice tracksPerCollisionV0 = aod::v0data::collisionId; + void processME(EventCandidates const& collisions, AllTrackCandidates const&, ResoV0s const& V0s) + { + for (auto& [collision1, collision2] : selfCombinations(colBinning, nMix, -1, collisions, collisions)) { + // LOGF(info, "Mixed event collisions: (%d, %d)", collision1.index(), collision2.index()); - if (aLambdaTag && lambdaTag2) { - antiLambdaLambdapair = antiLambdadummy + lambdadummy2; - taga = 0; - tagb2 = 0; - fillHistograms(taga, tagb, taga2, tagb2, antiLambdaLambdapair, antiLambdadummy, lambdadummy2, antiProton, proton2, centrality, 0); - if (fillQA) { - fillHistograms2(taga, tagb, taga2, tagb2, antiLambdaLambdapair, antiLambdadummy, lambdadummy2, antiProton, proton2, centrality, 0); - } + if (collision1.index() == collision2.index()) { + continue; + } + if (!collision1.sel8() || !collision2.sel8()) { + continue; + } + if (additionalEvSel && (!collision1.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision1.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { + continue; + } + if (additionalEvSel3 && (!collision1.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision1.selection_bit(aod::evsel::kNoITSROFrameBorder))) { + continue; + } + if (additionalEvSel && (!collision2.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision2.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { + continue; + } + if (additionalEvSel3 && (!collision2.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision2.selection_bit(aod::evsel::kNoITSROFrameBorder))) { + continue; + } + auto centrality = collision1.centFT0C(); + auto groupV01 = V0s.sliceBy(tracksPerCollisionV0, collision1.globalIndex()); + auto groupV02 = V0s.sliceBy(tracksPerCollisionV0, collision1.globalIndex()); + auto groupV03 = V0s.sliceBy(tracksPerCollisionV0, collision2.globalIndex()); + // for (auto& [t1, t2, t3] : soa::combinations(o2::soa::CombinationsFullIndexPolicy(groupV01, groupV02, groupV03))) { + // LOGF(info, "Mixed event collisions: (%d, %d, %d)", t1.collisionId(),t2.collisionId(),t3.collisionId()); + for (auto& [t1, t2] : soa::combinations(o2::soa::CombinationsFullIndexPolicy(groupV01, groupV02))) { + bool pairfound = false; + if (t2.v0Id() <= t1.v0Id()) { + continue; } + if (t1.collisionId() != t2.collisionId()) { + continue; + } + auto [lambdaTag1, aLambdaTag1, isValid1] = getLambdaTags(t1, collision1); + auto [lambdaTag2, aLambdaTag2, isValid2] = getLambdaTags(t2, collision1); + if (!isValid1) { + continue; + } + if (!isValid2) { + continue; + } + if (lambdaTag1 && aLambdaTag1) { + continue; + } + if (lambdaTag2 && aLambdaTag2) { + continue; + } + for (const auto& t3 : groupV03) { + if (t1.collisionId() == t3.collisionId()) { + continue; + } + auto [lambdaTag3, aLambdaTag3, isValid3] = getLambdaTags(t3, collision2); + if (!isValid3) { + continue; + } + if (lambdaTag3 && aLambdaTag3) { + continue; + } - taga = lambdaTag; - tagb2 = aLambdaTag2; + if (lambdaTag1 != lambdaTag3 || aLambdaTag1 != aLambdaTag3) { + continue; + } + if (std::abs(t1.pt() - t3.pt()) > ptMix) { + continue; + } + if (std::abs(t1.eta() - t3.eta()) > etaMix) { + continue; + } + if (std::abs(t1.phi() - t3.phi()) > phiMix) { + continue; + } - if (aLambdaTag && aLambdaTag2) { - antiLambdaAntiLambdapair = antiLambdadummy + antiLambdadummy2; - taga = 0; - taga2 = 0; - fillHistograms(taga, tagb, taga2, tagb2, antiLambdaAntiLambdapair, antiLambdadummy, antiLambdadummy2, antiProton, antiProton2, centrality, 0); - if (fillQA) { - fillHistograms2(taga, tagb, taga2, tagb2, antiLambdaAntiLambdapair, antiLambdadummy, antiLambdadummy2, antiProton, antiProton2, centrality, 0); + if (lambdaTag2) { + proton = ROOT::Math::PxPyPzMVector(t2.pxpos(), t2.pypos(), t2.pzpos(), o2::constants::physics::MassProton); + antiPion = ROOT::Math::PxPyPzMVector(t2.pxneg(), t2.pyneg(), t2.pzneg(), o2::constants::physics::MassPionCharged); + lambda = proton + antiPion; + } + if (aLambdaTag2) { + antiProton = ROOT::Math::PxPyPzMVector(t2.pxneg(), t2.pyneg(), t2.pzneg(), o2::constants::physics::MassProton); + pion = ROOT::Math::PxPyPzMVector(t2.pxpos(), t2.pypos(), t2.pzpos(), o2::constants::physics::MassPionCharged); + antiLambda = antiProton + pion; + } + if (lambdaTag3) { + proton2 = ROOT::Math::PxPyPzMVector(t3.pxpos(), t3.pypos(), t3.pzpos(), o2::constants::physics::MassProton); + antiPion2 = ROOT::Math::PxPyPzMVector(t3.pxneg(), t3.pyneg(), t3.pzneg(), o2::constants::physics::MassPionCharged); + lambda2 = proton2 + antiPion2; + } + if (aLambdaTag3) { + antiProton2 = ROOT::Math::PxPyPzMVector(t3.pxneg(), t3.pyneg(), t3.pzneg(), o2::constants::physics::MassProton); + pion2 = ROOT::Math::PxPyPzMVector(t3.pxpos(), t3.pypos(), t3.pzpos(), o2::constants::physics::MassPionCharged); + antiLambda2 = antiProton2 + pion2; + } + if (lambdaTag2 && lambdaTag3) { + fillHistograms(1, 0, 1, 0, lambda, lambda2, proton, proton2, centrality, 2); + } + if (aLambdaTag2 && aLambdaTag3) { + fillHistograms(0, 1, 0, 1, antiLambda, antiLambda2, antiProton, antiProton2, centrality, 2); + } + if (lambdaTag2 && aLambdaTag3) { + fillHistograms(1, 0, 0, 1, lambda, antiLambda2, proton, antiProton2, centrality, 2); + } + if (aLambdaTag2 && lambdaTag3) { + fillHistograms(0, 1, 1, 0, antiLambda, lambda2, antiProton, proton2, centrality, 2); + } + pairfound = true; + if (pairfound) { + // LOGF(info, "Pair found"); + break; } } } } } - PROCESS_SWITCH(LfTaskLambdaSpinCorr, processData, "Process data", true); + PROCESS_SWITCH(LfTaskLambdaSpinCorr, processME, "Process data ME", true); using CollisionMCTrueTable = aod::McCollisions; using TrackMCTrueTable = aod::McParticles; @@ -585,126 +613,72 @@ struct LfTaskLambdaSpinCorr { if (!RecCollision.sel8()) { continue; } - if (!RecCollision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !RecCollision.selection_bit(aod::evsel::kNoITSROFrameBorder)) { - continue; + // continue; } - if (std::abs(RecCollision.posZ()) > cfgCutVertex) { continue; } - auto centrality = RecCollision.centFT0C(); histos.fill(HIST("hCentrality"), centrality); - for (const auto& v0 : V0s) { - auto [lambdaTag, aLambdaTag, isValid] = getLambdaTagsMC(v0, RecCollision); - if (!isValid) + if (!isValid) { continue; - + } if (lambdaTag) { proton = ROOT::Math::PxPyPzMVector(v0.pxpos(), v0.pypos(), v0.pzpos(), o2::constants::physics::MassProton); antiPion = ROOT::Math::PxPyPzMVector(v0.pxneg(), v0.pyneg(), v0.pzneg(), o2::constants::physics::MassPionCharged); - lambdadummy = proton + antiPion; + lambda = proton + antiPion; } if (aLambdaTag) { antiProton = ROOT::Math::PxPyPzMVector(v0.pxneg(), v0.pyneg(), v0.pzneg(), o2::constants::physics::MassProton); pion = ROOT::Math::PxPyPzMVector(v0.pxpos(), v0.pypos(), v0.pzpos(), o2::constants::physics::MassPionCharged); - antiLambdadummy = antiProton + pion; + antiLambda = antiProton + pion; } - - if (shouldReject(lambdaTag, aLambdaTag, lambdadummy, antiLambdadummy)) { + if (lambdaTag && aLambdaTag) { continue; } - - int taga = lambdaTag; - int tagb = aLambdaTag; - auto postrack1 = v0.template posTrack_as(); auto negtrack1 = v0.template negTrack_as(); - // 2nd loop for combination of lambda lambda for (const auto& v02 : V0s) { - - if (v0.v0Id() >= v02.v0Id()) + if (v02.v0Id() <= v0.v0Id()) { continue; - + } auto [lambdaTag2, aLambdaTag2, isValid2] = getLambdaTagsMC(v02, RecCollision); - if (!isValid2) + if (!isValid2) { continue; - + } if (lambdaTag2) { proton2 = ROOT::Math::PxPyPzMVector(v02.pxpos(), v02.pypos(), v02.pzpos(), o2::constants::physics::MassProton); antiPion2 = ROOT::Math::PxPyPzMVector(v02.pxneg(), v02.pyneg(), v02.pzneg(), o2::constants::physics::MassPionCharged); - lambdadummy2 = proton2 + antiPion2; + lambda2 = proton2 + antiPion2; } if (aLambdaTag2) { antiProton2 = ROOT::Math::PxPyPzMVector(v02.pxneg(), v02.pyneg(), v02.pzneg(), o2::constants::physics::MassProton); pion2 = ROOT::Math::PxPyPzMVector(v02.pxpos(), v02.pypos(), v02.pzpos(), o2::constants::physics::MassPionCharged); - antiLambdadummy2 = antiProton2 + pion2; + antiLambda2 = antiProton2 + pion2; } - - if (shouldReject(lambdaTag2, aLambdaTag2, lambdadummy2, antiLambdadummy2)) { + if (lambdaTag && aLambdaTag) { continue; } - - int taga2 = lambdaTag2; - int tagb2 = aLambdaTag2; - auto postrack2 = v02.template posTrack_as(); auto negtrack2 = v02.template negTrack_as(); - if (postrack1.globalIndex() == postrack2.globalIndex() || negtrack1.globalIndex() == negtrack2.globalIndex()) { continue; // no shared decay products } - if (lambdaTag && lambdaTag2) { - lambdaLambdapair = lambdadummy + lambdadummy2; - tagb = 0; - tagb2 = 0; - fillHistograms(taga, tagb, taga2, tagb2, lambdaLambdapair, lambdadummy, lambdadummy2, proton, proton2, centrality, 0); - if (fillQA) { - fillHistograms2(taga, tagb, taga2, tagb2, lambdaLambdapair, lambdadummy, lambdadummy2, proton, proton2, centrality, 0); - } + fillHistograms(1, 0, 1, 0, lambda, lambda2, proton, proton2, centrality, 0); + } + if (aLambdaTag && aLambdaTag2) { + fillHistograms(0, 1, 0, 1, antiLambda, antiLambda2, antiProton, antiProton2, centrality, 0); } - - tagb2 = aLambdaTag2; - if (lambdaTag && aLambdaTag2) { - lambdaAntiLambdapair = lambdadummy + antiLambdadummy2; - tagb = 0; - taga2 = 0; - fillHistograms(taga, tagb, taga2, tagb2, lambdaAntiLambdapair, lambdadummy, antiLambdadummy2, proton, antiProton2, centrality, 0); - if (fillQA) { - fillHistograms2(taga, tagb, taga2, tagb2, lambdaAntiLambdapair, lambdadummy, antiLambdadummy2, proton, antiProton2, centrality, 0); - } + fillHistograms(1, 0, 0, 1, lambda, antiLambda2, proton, antiProton2, centrality, 0); } - - tagb = aLambdaTag; - taga2 = lambdaTag2; - if (aLambdaTag && lambdaTag2) { - antiLambdaLambdapair = antiLambdadummy + lambdadummy2; - taga = 0; - tagb2 = 0; - fillHistograms(taga, tagb, taga2, tagb2, antiLambdaLambdapair, antiLambdadummy, lambdadummy2, antiProton, proton2, centrality, 0); - if (fillQA) { - fillHistograms2(taga, tagb, taga2, tagb2, antiLambdaLambdapair, antiLambdadummy, lambdadummy2, antiProton, proton2, centrality, 0); - } - } - - taga = lambdaTag; - tagb2 = aLambdaTag2; - - if (aLambdaTag && aLambdaTag2) { - antiLambdaAntiLambdapair = antiLambdadummy + antiLambdadummy2; - taga = 0; - taga2 = 0; - fillHistograms(taga, tagb, taga2, tagb2, antiLambdaAntiLambdapair, antiLambdadummy, antiLambdadummy2, antiProton, antiProton2, centrality, 0); - if (fillQA) { - fillHistograms2(taga, tagb, taga2, tagb2, antiLambdaAntiLambdapair, antiLambdadummy, antiLambdadummy2, antiProton, antiProton2, centrality, 0); - } + fillHistograms(0, 1, 1, 0, antiLambda, lambda2, antiProton, proton2, centrality, 0); } } } @@ -752,12 +726,12 @@ struct LfTaskLambdaSpinCorr { } if (pdg1 == PDG_t::kLambda0) { tagamc = 1; - lambdadummymc = protonmc + antiPionmc; + lambdamc = protonmc + antiPionmc; } if (pdg1 == PDG_t::kLambda0Bar) { tagbmc = 1; - antiLambdadummymc = antiProtonmc + pionmc; + antiLambdamc = antiProtonmc + pionmc; } for (const auto& mcParticle2 : GenParticles) { @@ -800,51 +774,147 @@ struct LfTaskLambdaSpinCorr { if (pdg2 == PDG_t::kLambda0) { taga2mc = 1; - lambdadummy2mc = proton2mc + antiPion2mc; + lambda2mc = proton2mc + antiPion2mc; } if (pdg2 == PDG_t::kLambda0Bar) { tagb2mc = 1; - antiLambdadummy2mc = antiProton2mc + pion2mc; + antiLambda2mc = antiProton2mc + pion2mc; } if (tagamc && taga2mc) { - lambdaLambdapairmc = lambdadummymc + lambdadummy2mc; - fillHistograms(tagamc, tagbmc, taga2mc, tagb2mc, lambdaLambdapairmc, lambdadummymc, lambdadummy2mc, protonmc, proton2mc, centrality, 1); - if (fillQA) { - fillHistograms2(tagamc, tagbmc, taga2mc, tagb2mc, lambdaLambdapairmc, lambdadummymc, lambdadummy2mc, protonmc, proton2mc, centrality, 1); - } + fillHistograms(tagamc, tagbmc, taga2mc, tagb2mc, lambdamc, lambda2mc, protonmc, proton2mc, centrality, 1); } - if (tagamc && tagb2mc) { - lambdaAntiLambdapairmc = lambdadummymc + antiLambdadummy2mc; - fillHistograms(tagamc, tagbmc, taga2mc, tagb2mc, lambdaAntiLambdapairmc, lambdadummymc, antiLambdadummy2mc, protonmc, antiProton2mc, centrality, 1); - if (fillQA) { - fillHistograms2(tagamc, tagbmc, taga2mc, tagb2mc, lambdaAntiLambdapairmc, lambdadummymc, antiLambdadummy2mc, protonmc, antiProton2mc, centrality, 1); - } + fillHistograms(tagamc, tagbmc, taga2mc, tagb2mc, lambdamc, antiLambda2mc, protonmc, antiProton2mc, centrality, 1); } if (tagbmc && taga2mc) { - antiLambdaLambdapairmc = antiLambdadummymc + lambdadummy2mc; - fillHistograms(tagamc, tagbmc, taga2mc, tagb2mc, antiLambdaLambdapairmc, antiLambdadummymc, lambdadummy2mc, antiProtonmc, proton2mc, centrality, 1); - if (fillQA) { - fillHistograms2(tagamc, tagbmc, taga2mc, tagb2mc, antiLambdaLambdapairmc, antiLambdadummymc, lambdadummy2mc, antiProtonmc, proton2mc, centrality, 1); - } + fillHistograms(tagamc, tagbmc, taga2mc, tagb2mc, antiLambdamc, lambda2mc, antiProtonmc, proton2mc, centrality, 1); } if (tagbmc && tagb2mc) { - antiLambdaAntiLambdapairmc = antiLambdadummymc + antiLambdadummy2mc; - fillHistograms(tagamc, tagbmc, taga2mc, tagb2mc, antiLambdaAntiLambdapairmc, antiLambdadummymc, antiLambdadummy2mc, antiProtonmc, antiProton2mc, centrality, 1); - if (fillQA) { - fillHistograms2(tagamc, tagbmc, taga2mc, tagb2mc, antiLambdaAntiLambdapairmc, antiLambdadummymc, antiLambdadummy2mc, antiProtonmc, antiProton2mc, centrality, 1); - } + fillHistograms(tagamc, tagbmc, taga2mc, tagb2mc, antiLambdamc, antiLambda2mc, antiProtonmc, antiProton2mc, centrality, 1); } } } } } - PROCESS_SWITCH(LfTaskLambdaSpinCorr, processMC, "Process montecarlo", false); + + // Processing Event Mixing MC + void processMEMC(CollisionMCRecTableCentFT0C const& collisions, TrackMCRecTable const&, V0TrackCandidatesMC const& V0s) + { + for (auto& [collision1, collision2] : selfCombinations(colBinning, nMix, -1, collisions, collisions)) { + // LOGF(info, "Mixed event collisions: (%d, %d)", collision1.index(), collision2.index()); + + if (collision1.index() == collision2.index()) { + continue; + } + if (!collision1.sel8() || !collision2.sel8()) { + continue; + } + if (std::abs(collision1.posZ()) > cfgCutVertex) { + continue; + } + if (std::abs(collision2.posZ()) > cfgCutVertex) { + continue; + } + + auto centrality = collision1.centFT0C(); + auto groupV01 = V0s.sliceBy(tracksPerCollisionV0, collision1.globalIndex()); + auto groupV02 = V0s.sliceBy(tracksPerCollisionV0, collision1.globalIndex()); + auto groupV03 = V0s.sliceBy(tracksPerCollisionV0, collision2.globalIndex()); + // for (auto& [t1, t2, t3] : soa::combinations(o2::soa::CombinationsFullIndexPolicy(groupV01, groupV02, groupV03))) { + // LOGF(info, "Mixed event collisions: (%d, %d, %d)", t1.collisionId(),t2.collisionId(),t3.collisionId()); + for (auto& [t1, t2] : soa::combinations(o2::soa::CombinationsFullIndexPolicy(groupV01, groupV02))) { + bool pairfound = false; + if (t2.v0Id() <= t1.v0Id()) { + continue; + } + if (t1.collisionId() != t2.collisionId()) { + continue; + } + auto [lambdaTag1, aLambdaTag1, isValid1] = getLambdaTagsMC(t1, collision1); + auto [lambdaTag2, aLambdaTag2, isValid2] = getLambdaTagsMC(t2, collision1); + if (!isValid1) { + continue; + } + if (!isValid2) { + continue; + } + if (lambdaTag1 && aLambdaTag1) { + continue; + } + if (lambdaTag2 && aLambdaTag2) { + continue; + } + for (const auto& t3 : groupV03) { + if (t1.collisionId() == t3.collisionId()) { + continue; + } + auto [lambdaTag3, aLambdaTag3, isValid3] = getLambdaTagsMC(t3, collision2); + if (!isValid3) { + continue; + } + if (lambdaTag3 && aLambdaTag3) { + continue; + } + if (lambdaTag1 != lambdaTag3 || aLambdaTag1 != aLambdaTag3) { + continue; + } + if (std::abs(t1.pt() - t3.pt()) > ptMix) { + continue; + } + if (std::abs(t1.eta() - t3.eta()) > etaMix) { + continue; + } + if (std::abs(t1.phi() - t3.phi()) > phiMix) { + continue; + } + + if (lambdaTag2) { + proton = ROOT::Math::PxPyPzMVector(t2.pxpos(), t2.pypos(), t2.pzpos(), o2::constants::physics::MassProton); + antiPion = ROOT::Math::PxPyPzMVector(t2.pxneg(), t2.pyneg(), t2.pzneg(), o2::constants::physics::MassPionCharged); + lambda = proton + antiPion; + } + if (aLambdaTag2) { + antiProton = ROOT::Math::PxPyPzMVector(t2.pxneg(), t2.pyneg(), t2.pzneg(), o2::constants::physics::MassProton); + pion = ROOT::Math::PxPyPzMVector(t2.pxpos(), t2.pypos(), t2.pzpos(), o2::constants::physics::MassPionCharged); + antiLambda = antiProton + pion; + } + if (lambdaTag3) { + proton2 = ROOT::Math::PxPyPzMVector(t3.pxpos(), t3.pypos(), t3.pzpos(), o2::constants::physics::MassProton); + antiPion2 = ROOT::Math::PxPyPzMVector(t3.pxneg(), t3.pyneg(), t3.pzneg(), o2::constants::physics::MassPionCharged); + lambda2 = proton2 + antiPion2; + } + if (aLambdaTag3) { + antiProton2 = ROOT::Math::PxPyPzMVector(t3.pxneg(), t3.pyneg(), t3.pzneg(), o2::constants::physics::MassProton); + pion2 = ROOT::Math::PxPyPzMVector(t3.pxpos(), t3.pypos(), t3.pzpos(), o2::constants::physics::MassPionCharged); + antiLambda2 = antiProton2 + pion2; + } + if (lambdaTag2 && lambdaTag3) { + fillHistograms(1, 0, 1, 0, lambda, lambda2, proton, proton2, centrality, 2); + } + if (aLambdaTag2 && aLambdaTag3) { + fillHistograms(0, 1, 0, 1, antiLambda, antiLambda2, antiProton, antiProton2, centrality, 2); + } + if (lambdaTag2 && aLambdaTag3) { + fillHistograms(1, 0, 0, 1, lambda, antiLambda2, proton, antiProton2, centrality, 2); + } + if (aLambdaTag2 && lambdaTag3) { + fillHistograms(0, 1, 1, 0, antiLambda, lambda2, antiProton, proton2, centrality, 2); + } + pairfound = true; + if (pairfound) { + // LOGF(info, "Pair found"); + break; + } + } + } + } + } + PROCESS_SWITCH(LfTaskLambdaSpinCorr, processMEMC, "Process MC ME", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { From 1cd77be7d95289512378e22ff26bfb958eb1417a Mon Sep 17 00:00:00 2001 From: Ionut Cristian Arsene Date: Sat, 17 May 2025 17:41:24 +0200 Subject: [PATCH 1310/1650] =?UTF-8?q?[PWGDQ]=20Adding=20a=20process=20func?= =?UTF-8?q?tion=20in=20table-maker=20which=20does=20not=20use=20TOF=20as?= =?UTF-8?q?=20a=20=E2=80=A6=20(#11234)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ionut Cristian Arsene Co-authored-by: ALICE Action Bot --- PWGDQ/TableProducer/tableMaker_withAssoc.cxx | 20 +++++++++++++++++++- PWGDQ/Tasks/dqFlow.cxx | 8 -------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/PWGDQ/TableProducer/tableMaker_withAssoc.cxx b/PWGDQ/TableProducer/tableMaker_withAssoc.cxx index 651d157c531..f62be6d5753 100644 --- a/PWGDQ/TableProducer/tableMaker_withAssoc.cxx +++ b/PWGDQ/TableProducer/tableMaker_withAssoc.cxx @@ -83,6 +83,9 @@ using MyBarrelTracksWithCov = soa::Join; +using MyBarrelTracksWithCovNoTOF = soa::Join; using MyBarrelTracksWithV0Bits = soa::Join tracksPosNoTOF = (((aod::track::flags & static_cast(o2::aod::track::PVContributor)) == static_cast(o2::aod::track::PVContributor)) && (aod::track::tgl > static_cast(0.05))); Partition tracksNegNoTOF = (((aod::track::flags & static_cast(o2::aod::track::PVContributor)) == static_cast(o2::aod::track::PVContributor)) && (aod::track::tgl < static_cast(-0.05))); + Preslice presliceWithCovNoTOF = aod::track::collisionId; + Partition tracksPosWithCovNoTOF = (((aod::track::flags & static_cast(o2::aod::track::PVContributor)) == static_cast(o2::aod::track::PVContributor)) && (aod::track::tgl > static_cast(0.05))); + Partition tracksNegWithCovNoTOF = (((aod::track::flags & static_cast(o2::aod::track::PVContributor)) == static_cast(o2::aod::track::PVContributor)) && (aod::track::tgl < static_cast(-0.05))); + struct { std::map oMeanTimeShortA; std::map oMeanTimeShortC; @@ -363,7 +371,7 @@ struct TableMaker { // Check whether we have to define barrel or muon histograms bool enableBarrelHistos = (context.mOptions.get("processPPWithFilter") || context.mOptions.get("processPPWithFilterBarrelOnly") || context.mOptions.get("processPPBarrelOnly") || context.mOptions.get("processPbPb") || context.mOptions.get("processPbPbBarrelOnly") || context.mOptions.get("processPbPbBarrelOnlyWithV0Bits") || context.mOptions.get("processPbPbBarrelOnlyWithV0BitsNoTOF")) || - context.mOptions.get("processPbPbWithFilterBarrelOnly") || context.mOptions.get("processPPBarrelOnlyWithV0s"); + context.mOptions.get("processPbPbWithFilterBarrelOnly") || context.mOptions.get("processPPBarrelOnlyWithV0s") || context.mOptions.get("processPbPbBarrelOnlyNoTOF"); bool enableMuonHistos = (context.mOptions.get("processPPWithFilter") || context.mOptions.get("processPPWithFilterMuonOnly") || context.mOptions.get("processPPWithFilterMuonMFT") || context.mOptions.get("processPPMuonOnly") || context.mOptions.get("processPPRealignedMuonOnly") || context.mOptions.get("processPPMuonMFT") || context.mOptions.get("processPPMuonMFTWithMultsExtra") || context.mOptions.get("processPbPb") || context.mOptions.get("processPbPbMuonOnly") || context.mOptions.get("processPbPbRealignedMuonOnly") || context.mOptions.get("processPbPbMuonMFT")); @@ -1526,6 +1534,15 @@ struct TableMaker { fullSkimming(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, nullptr, trackAssocs, nullptr, nullptr); } + // produce the barrel only DQ skimmed data model typically for Pb-Pb (with centrality), no TOF + void processPbPbBarrelOnlyNoTOF(MyEventsWithCentAndMults const& collisions, BCsWithTimestamps const& bcs, + MyBarrelTracksWithCovNoTOF const& tracksBarrel, + TrackAssoc const& trackAssocs) + { + computeOccupancyEstimators(collisions, tracksPosWithCovNoTOF, tracksNegWithCovNoTOF, presliceWithCovNoTOF, bcs); + fullSkimming(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, nullptr, trackAssocs, nullptr, nullptr); + } + // produce the barrel-only DQ skimmed data model typically for UPC Pb-Pb (no centrality), subscribe to the DQ rapidity gap event filter (filter-PbPb) void processPbPbWithFilterBarrelOnly(MyEventsWithMultsAndRapidityGapFilter const& collisions, MyBCs const& bcs, aod::Zdcs& zdcs, MyBarrelTracksWithCov const& tracksBarrel, @@ -1597,6 +1614,7 @@ struct TableMaker { PROCESS_SWITCH(TableMaker, processPPMuonMFTWithMultsExtra, "Build muon + mft DQ skimmed data model typically for pp/p-Pb and UPC Pb-Pb", false); PROCESS_SWITCH(TableMaker, processPbPb, "Build full DQ skimmed data model typically for Pb-Pb, w/o event filtering", false); PROCESS_SWITCH(TableMaker, processPbPbBarrelOnly, "Build barrel only DQ skimmed data model typically for Pb-Pb, w/o event filtering", false); + PROCESS_SWITCH(TableMaker, processPbPbBarrelOnlyNoTOF, "Build barrel only DQ skimmed data model typically for Pb-Pb, w/o event filtering, no TOF", false); PROCESS_SWITCH(TableMaker, processPbPbWithFilterBarrelOnly, "Build barrel only DQ skimmed data model typically for UPC Pb-Pb, w/ event filtering", false); PROCESS_SWITCH(TableMaker, processPbPbBarrelOnlyWithV0Bits, "Build barrel only DQ skimmed data model typically for Pb-Pb, w/ V0 bits, w/o event filtering", false); PROCESS_SWITCH(TableMaker, processPbPbBarrelOnlyWithV0BitsNoTOF, "Build barrel only DQ skimmed data model typically for Pb-Pb, w/ V0 bits, no TOF, w/o event filtering", false); diff --git a/PWGDQ/Tasks/dqFlow.cxx b/PWGDQ/Tasks/dqFlow.cxx index ad500439924..cdbee28a8a0 100644 --- a/PWGDQ/Tasks/dqFlow.cxx +++ b/PWGDQ/Tasks/dqFlow.cxx @@ -108,8 +108,6 @@ struct DQEventQvector { Produces eventQvectorCentrExtra; Produces eventRefFlow; Produces eventQvectorZN; - Produces eventReducedZdc; - Produces eventReducedZdcExtra; Configurable fConfigEventCuts{"cfgEventCuts", "eventStandard", "Event selection"}; Configurable fConfigQA{"cfgQA", true, "If true, fill QA histograms"}; @@ -537,14 +535,8 @@ struct DQEventQvector { eventQvectorCentrExtra(collision.qvecTPCallRe(), collision.qvecTPCallIm(), collision.nTrkTPCall()); if (bc.has_zdc()) { eventQvectorZN(VarManager::fgValues[VarManager::kQ1ZNAX], VarManager::fgValues[VarManager::kQ1ZNAY], VarManager::fgValues[VarManager::kQ1ZNCX], VarManager::fgValues[VarManager::kQ1ZNCY]); - eventReducedZdc(VarManager::fgValues[VarManager::kEnergyCommonZNA], VarManager::fgValues[VarManager::kEnergyCommonZNC], VarManager::fgValues[VarManager::kEnergyCommonZPA], VarManager::fgValues[VarManager::kEnergyCommonZPC], - VarManager::fgValues[VarManager::kTimeZNA], VarManager::fgValues[VarManager::kTimeZNC], VarManager::fgValues[VarManager::kTimeZPA], VarManager::fgValues[VarManager::kTimeZPC]); - eventReducedZdcExtra(VarManager::fgValues[VarManager::kEnergyZNA1], VarManager::fgValues[VarManager::kEnergyZNA2], VarManager::fgValues[VarManager::kEnergyZNA3], VarManager::fgValues[VarManager::kEnergyZNA4], - VarManager::fgValues[VarManager::kEnergyZNC1], VarManager::fgValues[VarManager::kEnergyZNC2], VarManager::fgValues[VarManager::kEnergyZNC3], VarManager::fgValues[VarManager::kEnergyZNC4]); } else { eventQvectorZN(-999, -999, -999, -999); - eventReducedZdc(-999, -999, -999, -999, -999, -999, -999, -999); - eventReducedZdcExtra(-999, -999, -999, -999, -999, -999, -999, -999); } } } From af6e319332e3c58bec39b29354a8110b63533da1 Mon Sep 17 00:00:00 2001 From: basiach <74355517+basiach@users.noreply.github.com> Date: Sat, 17 May 2025 22:45:28 +0200 Subject: [PATCH 1311/1650] [PWGCF] FemtoUniverse - Adding a pT vs invM vs mult histogram to Cascade task (#11221) Co-authored-by: Barbara Chytla --- .../Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx index 0d14659f715..2d3ecde6f0e 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx @@ -211,6 +211,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { void init(InitContext const&) { + std::vector multBinning = {0.0, 5.0, 10.0, 20.0, 30.0f, 40.0, 50.0, 60.0f, 70.0, 80.0, 100.0, 200.0, 99999.0}; // Axes AxisSpec aXiMassAxis = {200, 1.28f, 1.36f, "#it{M}_{inv} [GeV/#it{c}^{2}]"}; AxisSpec ptAxis = {100, 0.0f, 10.0f, "#it{p}_{T} (GeV/#it{c})"}; @@ -220,6 +221,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { AxisSpec aCPAAxis = {1000, 0.95f, 1.0f, "#it{cos #theta_{p}}"}; AxisSpec tranRadAxis = {1000, 0.0f, 100.0f, "#it{r}_{xy} (cm)"}; AxisSpec aDCAToPVAxis = {1000, -10.0f, 10.0f, "DCA to PV (cm)"}; + AxisSpec multAxis = {multBinning, "Multiplicity"}; // Histograms rXiQA.add("hMassXi", "hMassXi", {HistType::kTH1F, {aXiMassAxis}}); @@ -238,6 +240,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { rXiQA.add("hDcaBachtoPV", "hDcaBachtoPV", {HistType::kTH1F, {aDCAToPVAxis}}); rXiQA.add("hDcaV0toPV", "hDcaV0toPV", {HistType::kTH1F, {aDCAToPVAxis}}); rXiQA.add("hInvMpT", "hInvMpT", kTH2F, {{ptAxis}, {aXiMassAxis}}); + rXiQA.add("hInvMpTmult", "hInvMpTmult", kTH3F, {{ptAxis}, {aXiMassAxis}, {multAxis}}); eventHisto.init(&qaRegistry); qaRegistry.add("Tracks_pos/nSigmaTPC", "; #it{p} (GeV/#it{c}); n#sigma_{TPC}", kTH2F, {{100, 0, 10}, {200, -4.975, 5.025}}); @@ -377,6 +380,8 @@ struct femtoUniversePairTaskTrackCascadeExtended { posChildHistos.fillQA(posChild); negChildHistos.fillQA(negChild); bachHistos.fillQABase(bachelor, HIST("hBachelor")); + + rXiQA.fill(HIST("hInvMpTmult"), part.pt(), part.mLambda(), multCol); } for (const auto& part : groupPartsOne) { From 838e136becdb46510c94a148cb348890835d8c1b Mon Sep 17 00:00:00 2001 From: FDUEnrich <23210190047@m.fudan.edu.cn> Date: Sun, 18 May 2025 19:56:11 +0800 Subject: [PATCH 1312/1650] [PWGHF] Add ml features and create a small table for local analysis. (#11202) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ALICE Action Bot Co-authored-by: BiaoZhang (张彪) <52267892+zhangbiao-phy@users.noreply.github.com> --- PWGHF/Core/HfMlResponseOmegacToOmegaPi.h | 51 ++++++++++++---- PWGHF/DataModel/CandidateSelectionTables.h | 4 +- .../candidateSelectorOmegac0ToOmegaPi.cxx | 6 +- .../treeCreatorOmegac0ToOmegaPi.cxx | 58 ++++++++++++++++--- 4 files changed, 96 insertions(+), 23 deletions(-) diff --git a/PWGHF/Core/HfMlResponseOmegacToOmegaPi.h b/PWGHF/Core/HfMlResponseOmegacToOmegaPi.h index be2b5ac62ce..53b40330e04 100644 --- a/PWGHF/Core/HfMlResponseOmegacToOmegaPi.h +++ b/PWGHF/Core/HfMlResponseOmegacToOmegaPi.h @@ -64,13 +64,24 @@ enum class InputFeaturesOmegacToOmegaPi : uint8_t { cosPaOmegacToPv = 0, kfDcaXYPiFromOmegac, - cosThetaStarPiFromOmegac, chi2TopoPiFromOmegacToPv, dcaCharmBaryonDau, invMassCascade, massCascChi2OverNdf, - cosPaCascToPv, kfDcaXYCascToPv, + cosPaCascToPv, + cosThetaStarPiFromOmegac, + chi2NdfTopoOmegacToPv, + ldlCasc, + dcaCascDau, + cosPaCascToOmegac, + decayLenXYCasc, + ldlOmegac, + chi2NdfTopoCascToOmegac, + chi2NdfTopoCascToPv, + chi2GeoOmegac, + chi2GeoCasc, + nSigmaTPCPiFromV0, nSigmaTPCPiFromOmegac, nSigmaTPCKaFromCasc @@ -99,16 +110,26 @@ class HfMlResponseOmegacToOmegaPi : public HfMlResponse for (const auto& idx : MlResponse::mCachedIndices) { switch (idx) { - + CHECK_AND_FILL_VEC_OMEGAC0_FULL(candidate, cosPaOmegacToPv, cosPACharmBaryon); CHECK_AND_FILL_VEC_OMEGAC0(kfDcaXYPiFromOmegac); - CHECK_AND_FILL_VEC_OMEGAC0(cosThetaStarPiFromOmegac); CHECK_AND_FILL_VEC_OMEGAC0(chi2TopoPiFromOmegacToPv); CHECK_AND_FILL_VEC_OMEGAC0(dcaCharmBaryonDau); CHECK_AND_FILL_VEC_OMEGAC0(invMassCascade); CHECK_AND_FILL_VEC_OMEGAC0(massCascChi2OverNdf); CHECK_AND_FILL_VEC_OMEGAC0(kfDcaXYCascToPv); - CHECK_AND_FILL_VEC_OMEGAC0_FULL(candidate, cosPaOmegacToPv, cosPACharmBaryon); CHECK_AND_FILL_VEC_OMEGAC0_FULL(candidate, cosPaCascToPv, cosPACasc); + CHECK_AND_FILL_VEC_OMEGAC0(cosThetaStarPiFromOmegac); + CHECK_AND_FILL_VEC_OMEGAC0_FULL(candidate, chi2NdfTopoOmegacToPv, chi2TopoOmegacToPv); + CHECK_AND_FILL_VEC_OMEGAC0_FULL(candidate, ldlCasc, cascldl); + CHECK_AND_FILL_VEC_OMEGAC0(dcaCascDau); + CHECK_AND_FILL_VEC_OMEGAC0(cosPaCascToOmegac); + CHECK_AND_FILL_VEC_OMEGAC0(decayLenXYCasc); + CHECK_AND_FILL_VEC_OMEGAC0_FULL(candidate, ldlOmegac, omegacldl); + CHECK_AND_FILL_VEC_OMEGAC0_FULL(candidate, chi2NdfTopoCascToOmegac, chi2TopoCascToOmegac); + CHECK_AND_FILL_VEC_OMEGAC0_FULL(candidate, chi2NdfTopoCascToPv, chi2TopoCascToPv); + CHECK_AND_FILL_VEC_OMEGAC0(chi2GeoOmegac); + CHECK_AND_FILL_VEC_OMEGAC0(chi2GeoCasc); + // TPC PID variables CHECK_AND_FILL_VEC_OMEGAC0_FULL(lamProngPi, nSigmaTPCPiFromV0, tpcNSigmaPi); CHECK_AND_FILL_VEC_OMEGAC0_FULL(cascProng, nSigmaTPCKaFromCasc, tpcNSigmaKa); @@ -125,16 +146,26 @@ class HfMlResponseOmegacToOmegaPi : public HfMlResponse { MlResponse::mAvailableInputFeatures = { - FILL_MAP_OMEGAC0(invMassCascade), FILL_MAP_OMEGAC0(cosPaOmegacToPv), - FILL_MAP_OMEGAC0(dcaCharmBaryonDau), FILL_MAP_OMEGAC0(kfDcaXYPiFromOmegac), - FILL_MAP_OMEGAC0(cosThetaStarPiFromOmegac), FILL_MAP_OMEGAC0(chi2TopoPiFromOmegacToPv), + FILL_MAP_OMEGAC0(dcaCharmBaryonDau), + FILL_MAP_OMEGAC0(invMassCascade), FILL_MAP_OMEGAC0(massCascChi2OverNdf), - FILL_MAP_OMEGAC0(cosPaCascToPv), FILL_MAP_OMEGAC0(kfDcaXYCascToPv), - // TPC PID variables + FILL_MAP_OMEGAC0(cosPaCascToPv), + FILL_MAP_OMEGAC0(cosThetaStarPiFromOmegac), + FILL_MAP_OMEGAC0(chi2NdfTopoOmegacToPv), + FILL_MAP_OMEGAC0(ldlCasc), + FILL_MAP_OMEGAC0(dcaCascDau), + FILL_MAP_OMEGAC0(cosPaCascToOmegac), + FILL_MAP_OMEGAC0(decayLenXYCasc), + FILL_MAP_OMEGAC0(ldlOmegac), + FILL_MAP_OMEGAC0(chi2NdfTopoCascToOmegac), + FILL_MAP_OMEGAC0(chi2NdfTopoCascToPv), + FILL_MAP_OMEGAC0(chi2GeoOmegac), + FILL_MAP_OMEGAC0(chi2GeoCasc), + FILL_MAP_OMEGAC0(nSigmaTPCPiFromV0), FILL_MAP_OMEGAC0(nSigmaTPCKaFromCasc), FILL_MAP_OMEGAC0(nSigmaTPCPiFromOmegac), diff --git a/PWGHF/DataModel/CandidateSelectionTables.h b/PWGHF/DataModel/CandidateSelectionTables.h index 44719b1e5d9..ca58828bc0c 100644 --- a/PWGHF/DataModel/CandidateSelectionTables.h +++ b/PWGHF/DataModel/CandidateSelectionTables.h @@ -393,13 +393,13 @@ DECLARE_SOA_COLUMN(PidTpcInfoStored, pidTpcInfoStored, int); DECLARE_SOA_COLUMN(PidTofInfoStored, pidTofInfoStored, int); // Machine learning column for omegac0 to omega pi DECLARE_SOA_COLUMN(MlProbOmegac, mlProbOmegac, std::vector); -DECLARE_SOA_COLUMN(MlProbOmegacBar, mlProbOmegacBar, std::vector); +DECLARE_SOA_COLUMN(MlValueOmegac, mlValueOmegac, float); } // namespace hf_sel_toomegapi DECLARE_SOA_TABLE(HfSelToOmegaPi, "AOD", "HFSELTOOMEPI", hf_sel_toomegapi::StatusPidLambda, hf_sel_toomegapi::StatusPidCascade, hf_sel_toomegapi::StatusPidCharmBaryon, hf_sel_toomegapi::StatusInvMassLambda, hf_sel_toomegapi::StatusInvMassCascade, hf_sel_toomegapi::StatusInvMassCharmBaryon, - hf_sel_toomegapi::ResultSelections, hf_sel_toomegapi::PidTpcInfoStored, hf_sel_toomegapi::PidTofInfoStored, + hf_sel_toomegapi::ResultSelections, hf_sel_toomegapi::PidTpcInfoStored, hf_sel_toomegapi::PidTofInfoStored, hf_sel_toomegapi::MlValueOmegac, hf_sel_toomegapi::TpcNSigmaPiFromCharmBaryon, hf_sel_toomegapi::TpcNSigmaKaFromCasc, hf_sel_toomegapi::TpcNSigmaPiFromLambda, hf_sel_toomegapi::TpcNSigmaPrFromLambda, hf_sel_toomegapi::TofNSigmaPiFromCharmBaryon, hf_sel_toomegapi::TofNSigmaKaFromCasc, hf_sel_toomegapi::TofNSigmaPiFromLambda, hf_sel_toomegapi::TofNSigmaPrFromLambda); diff --git a/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx b/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx index 7ef19ae4032..14ca3d917d0 100644 --- a/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx @@ -354,7 +354,7 @@ struct HfCandidateSelectorToOmegaPi { // pt-dependent selection if (!selectionTopol(candidate)) { resultSelections = false; - hfSelToOmegaPi(statusPidLambda, statusPidCascade, statusPidCharmBaryon, statusInvMassLambda, statusInvMassCascade, statusInvMassCharmBaryon, resultSelections, infoTpcStored, infoTofStored, + hfSelToOmegaPi(statusPidLambda, statusPidCascade, statusPidCharmBaryon, statusInvMassLambda, statusInvMassCascade, statusInvMassCharmBaryon, resultSelections, infoTpcStored, infoTofStored, outputMlOmegac[0], trackPiFromCharm.tpcNSigmaPi(), trackKaFromCasc.tpcNSigmaKa(), trackPiFromLam.tpcNSigmaPi(), trackPrFromLam.tpcNSigmaPr(), trackPiFromCharm.tofNSigmaPi(), trackKaFromCasc.tofNSigmaKa(), trackPiFromLam.tofNSigmaPi(), trackPrFromLam.tofNSigmaPr()); if constexpr (ConstructMethod == hf_cand_casc_lf::ConstructMethod::KfParticle) { @@ -746,12 +746,14 @@ struct HfCandidateSelectorToOmegaPi { isSelectedMlOmegac = hfMlResponse.isSelectedMl(inputFeaturesOmegaC, ptCand, outputMlOmegac); if (isSelectedMlOmegac) { registry.fill(HIST("hBDTScoreTest1"), outputMlOmegac[0]); + } else { + resultSelections = false; } hfMlSelToOmegaPi(outputMlOmegac); } } - hfSelToOmegaPi(statusPidLambda, statusPidCascade, statusPidCharmBaryon, statusInvMassLambda, statusInvMassCascade, statusInvMassCharmBaryon, resultSelections, infoTpcStored, infoTofStored, + hfSelToOmegaPi(statusPidLambda, statusPidCascade, statusPidCharmBaryon, statusInvMassLambda, statusInvMassCascade, statusInvMassCharmBaryon, resultSelections, infoTpcStored, infoTofStored, outputMlOmegac[0], trackPiFromCharm.tpcNSigmaPi(), trackKaFromCasc.tpcNSigmaKa(), trackPiFromLam.tpcNSigmaPi(), trackPrFromLam.tpcNSigmaPr(), trackPiFromCharm.tofNSigmaPi(), trackKaFromCasc.tofNSigmaKa(), trackPiFromLam.tofNSigmaPi(), trackPrFromLam.tofNSigmaPr()); diff --git a/PWGHF/TableProducer/treeCreatorOmegac0ToOmegaPi.cxx b/PWGHF/TableProducer/treeCreatorOmegac0ToOmegaPi.cxx index 94cb83fa870..3c5491e0dae 100644 --- a/PWGHF/TableProducer/treeCreatorOmegac0ToOmegaPi.cxx +++ b/PWGHF/TableProducer/treeCreatorOmegac0ToOmegaPi.cxx @@ -16,6 +16,7 @@ /// \author Federica Zanone , Heidelberg University /// \author Yunfan Liu , China University of Geosciences /// \author Fabio Catalano , University of Houston +/// \author Ruiqi Yin , Fudan University #include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" @@ -151,6 +152,7 @@ DECLARE_SOA_COLUMN(OmegacChi2OverNdf, omegacChi2OverNdf, float); DECLARE_SOA_COLUMN(MassV0Chi2OverNdf, massV0Chi2OverNdf, float); DECLARE_SOA_COLUMN(MassCascChi2OverNdf, massCascChi2OverNdf, float); DECLARE_SOA_COLUMN(CascRejectInvmass, cascRejectInvmass, float); +DECLARE_SOA_COLUMN(OutputMlOmegac, outputMlOmegac, float); } // namespace full DECLARE_SOA_TABLE(HfToOmegaPiEvs, "AOD", "HFTOOMEPIEV", @@ -198,7 +200,7 @@ DECLARE_SOA_TABLE(HfKfOmegacFulls, "AOD", "HFKFOMEGACFULL", full::V0Ndf, full::CascNdf, full::OmegacNdf, full::MassV0Ndf, full::MassCascNdf, full::V0Chi2OverNdf, full::CascChi2OverNdf, full::OmegacChi2OverNdf, - full::MassV0Chi2OverNdf, full::MassCascChi2OverNdf, full::CascRejectInvmass, + full::MassV0Chi2OverNdf, full::MassCascChi2OverNdf, full::CascRejectInvmass, full::OutputMlOmegac, full::FlagMcMatchRec, full::OriginRec, full::CollisionMatched, hf_track_index::HFflag); DECLARE_SOA_TABLE(HfKfOmegacLites, "AOD", "HFKFOMEGACLITE", @@ -214,14 +216,18 @@ DECLARE_SOA_TABLE(HfKfOmegacLites, "AOD", "HFKFOMEGACLITE", full::V0Chi2OverNdf, full::CascChi2OverNdf, full::OmegacChi2OverNdf, full::CascRejectInvmass, full::FlagMcMatchRec, full::OriginRec, full::CollisionMatched, hf_track_index::HFflag); + +DECLARE_SOA_TABLE(HfKfOmegacMl, "AOD", "HFKFOMEGACML", + full::InvMassCharmBaryon, full::KfptOmegac, full::KfptPiFromOmegac, full::OutputMlOmegac, full::FlagMcMatchRec, full::OriginRec, full::CollisionMatched, hf_track_index::HFflag); } // namespace o2::aod /// Writes the full information in an output TTree -struct HfTreeCreatorOmegacToOmegaPi { // FIXME: Rename to HfTreeCreatorOmegac0ToOmegaPi +struct HfTreeCreatorOmegac0ToOmegaPi { Produces rowCandidateLite; Produces rowKfCandidateFull; Produces rowKfCandidateLite; + Produces rowKfCandidateMl; Produces rowEv; Configurable zPvCut{"zPvCut", 10., "Cut on absolute value of primary vertex z coordinate"}; @@ -381,6 +387,7 @@ struct HfTreeCreatorOmegacToOmegaPi { // FIXME: Rename to HfTreeCreatorOmegac0To candidate.massV0Chi2OverNdf(), candidate.massCascChi2OverNdf(), candidate.cascRejectInvmass(), + candidate.mlValueOmegac(), flagMc, originMc, collisionMatched, @@ -431,6 +438,23 @@ struct HfTreeCreatorOmegacToOmegaPi { // FIXME: Rename to HfTreeCreatorOmegac0To } } // fillKfCandidateLite end + template + void fillKfCandidateMl(const T& candidate, int8_t flagMc, int8_t originMc, bool collisionMatched) + { + if (candidate.resultSelections() && candidate.statusPidCharmBaryon() && candidate.statusInvMassLambda() && candidate.statusInvMassCascade() && candidate.statusInvMassCharmBaryon()) { + + rowKfCandidateMl( + candidate.invMassCharmBaryon(), + candidate.kfptOmegac(), + candidate.kfptPiFromOmegac(), + candidate.mlValueOmegac(), + flagMc, + originMc, + collisionMatched, + candidate.hfflag()); + } + } // fillCandidateMl end + void processDataLite(Colls const& collisions, Tracks const&, soa::Filtered> const& candidates) { @@ -446,7 +470,7 @@ struct HfTreeCreatorOmegacToOmegaPi { // FIXME: Rename to HfTreeCreatorOmegac0To fillCandidateLite(candidate, -7, RecoDecay::OriginType::None, false); } } - PROCESS_SWITCH(HfTreeCreatorOmegacToOmegaPi, processDataLite, "Process data", true); + PROCESS_SWITCH(HfTreeCreatorOmegac0ToOmegaPi, processDataLite, "Process data", false); void processKfDataFull(Colls const& collisions, Tracks const&, CandKfSel const& candidates) { @@ -462,7 +486,7 @@ struct HfTreeCreatorOmegacToOmegaPi { // FIXME: Rename to HfTreeCreatorOmegac0To fillKfCandidate(candidate, -7, RecoDecay::OriginType::None, false); } } - PROCESS_SWITCH(HfTreeCreatorOmegacToOmegaPi, processKfDataFull, "Process KF data", false); + PROCESS_SWITCH(HfTreeCreatorOmegac0ToOmegaPi, processKfDataFull, "Process KF data", false); void processKfDataLite(Colls const& collisions, Tracks const&, CandKfSel const& candidates) { @@ -478,7 +502,23 @@ struct HfTreeCreatorOmegacToOmegaPi { // FIXME: Rename to HfTreeCreatorOmegac0To fillKfCandidateLite(candidate, -7, RecoDecay::OriginType::None, false); } } - PROCESS_SWITCH(HfTreeCreatorOmegacToOmegaPi, processKfDataLite, "Process KF data Lite", false); + PROCESS_SWITCH(HfTreeCreatorOmegac0ToOmegaPi, processKfDataLite, "Process KF data Lite", false); + + void processKfCandidateMl(Colls const& collisions, Tracks const&, CandKfSel const& candidates) + { + // Filling event properties + rowEv.reserve(collisions.size()); + for (const auto& collision : collisions) { + fillEvent(collision, zPvCut); + } + + // Filling candidate properties + rowKfCandidateFull.reserve(candidates.size()); + for (const auto& candidate : candidates) { + fillKfCandidateMl(candidate, -7, RecoDecay::OriginType::None, false); + } + } + PROCESS_SWITCH(HfTreeCreatorOmegac0ToOmegaPi, processKfCandidateMl, "Process KF data ML", true); void processMcLite(Colls const& collisions, Tracks const&, soa::Filtered> const& candidates) @@ -495,7 +535,7 @@ struct HfTreeCreatorOmegacToOmegaPi { // FIXME: Rename to HfTreeCreatorOmegac0To fillCandidateLite(candidate, candidate.flagMcMatchRec(), candidate.originRec(), candidate.collisionMatched()); } } - PROCESS_SWITCH(HfTreeCreatorOmegacToOmegaPi, processMcLite, "Process MC", false); + PROCESS_SWITCH(HfTreeCreatorOmegac0ToOmegaPi, processMcLite, "Process MC", false); void processKFMcFull(Colls const& collisions, Tracks const&, CascKfMcSel const& candidates) { @@ -517,7 +557,7 @@ struct HfTreeCreatorOmegacToOmegaPi { // FIXME: Rename to HfTreeCreatorOmegac0To } } } - PROCESS_SWITCH(HfTreeCreatorOmegacToOmegaPi, processKFMcFull, "Process KF MC", false); + PROCESS_SWITCH(HfTreeCreatorOmegac0ToOmegaPi, processKFMcFull, "Process KF MC", false); void processKFMcLite(Colls const& collisions, Tracks const&, CascKfMcSel const& candidates) { @@ -539,12 +579,12 @@ struct HfTreeCreatorOmegacToOmegaPi { // FIXME: Rename to HfTreeCreatorOmegac0To } } } - PROCESS_SWITCH(HfTreeCreatorOmegacToOmegaPi, processKFMcLite, "Process KF MC Lite", false); + PROCESS_SWITCH(HfTreeCreatorOmegac0ToOmegaPi, processKFMcLite, "Process KF MC Lite", false); }; // end of struct WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc)}; + adaptAnalysisTask(cfgc)}; } From 08a4503e15e97d7b809357bf236718ab6a7287a6 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Sun, 18 May 2025 22:21:45 +0900 Subject: [PATCH 1313/1650] [PWGEM/Dilepton] update skimmerPrimaryElectron.cxx to reduce memory (#11237) --- .../TableProducer/skimmerPrimaryElectron.cxx | 98 +++++++++++++------ 1 file changed, 66 insertions(+), 32 deletions(-) diff --git a/PWGEM/Dilepton/TableProducer/skimmerPrimaryElectron.cxx b/PWGEM/Dilepton/TableProducer/skimmerPrimaryElectron.cxx index 9d0ac52e982..a4eac761725 100644 --- a/PWGEM/Dilepton/TableProducer/skimmerPrimaryElectron.cxx +++ b/PWGEM/Dilepton/TableProducer/skimmerPrimaryElectron.cxx @@ -655,6 +655,7 @@ struct prefilterPrimaryElectron { // Operation and minimisation criteria Configurable d_bz_input{"d_bz", -999, "bz field, -999 is automatic"}; + Configurable fillQAHistogram{"fillQAHistogram", false, "flag to fill QA histograms"}; Configurable max_dcaxy{"max_dcaxy", 0.3, "DCAxy To PV for loose track sample"}; Configurable max_dcaz{"max_dcaz", 0.3, "DCAz To PV for loose track sample"}; Configurable minpt{"minpt", 0.1, "min pt for track for loose track sample"}; @@ -695,7 +696,7 @@ struct prefilterPrimaryElectron { ccdb->setLocalObjectValidityChecking(); ccdb->setFatalWhenNull(false); - if (!doprocessDummy) { + if (!doprocessDummy && fillQAHistogram) { addHistograms(); } } @@ -902,8 +903,10 @@ struct prefilterPrimaryElectron { if (!checkTrack(collision, track)) { continue; } - fRegistry.fill(HIST("Track/hPt"), track.pt()); - fRegistry.fill(HIST("Track/hEtaPhi"), track.phi(), track.eta()); + if (fillQAHistogram) { + fRegistry.fill(HIST("Track/hPt"), track.pt()); + fRegistry.fill(HIST("Track/hEtaPhi"), track.phi(), track.eta()); + } if (track.sign() > 0) { posTracks_per_coll.emplace_back(track); } else { @@ -934,10 +937,14 @@ struct prefilterPrimaryElectron { ROOT::Math::PtEtaPhiMVector v2(empos.pt(), empos.eta(), empos.phi(), o2::constants::physics::MassElectron); // signal track ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; float phiv = o2::aod::pwgem::dilepton::utils::pairutil::getPhivPair(empos.px(), empos.py(), empos.pz(), pVec_recalc[0], pVec_recalc[1], pVec_recalc[2], empos.sign(), ele.sign(), d_bz); - fRegistry.fill(HIST("Pair/before/uls/hMvsPhiV"), phiv, v12.M()); - fRegistry.fill(HIST("Pair/before/uls/hMvsPt"), v12.M(), v12.Pt()); + if (fillQAHistogram) { + fRegistry.fill(HIST("Pair/before/uls/hMvsPhiV"), phiv, v12.M()); + fRegistry.fill(HIST("Pair/before/uls/hMvsPt"), v12.M(), v12.Pt()); + } if (v12.M() < max_mee_vec->at(static_cast(max_mee_vec->size()) - 1)) { - fRegistry.fill(HIST("Track/hTPCNsigmaEl"), ele.tpcInnerParam(), ele.tpcNSigmaEl()); + if (fillQAHistogram) { + fRegistry.fill(HIST("Track/hTPCNsigmaEl"), ele.tpcInnerParam(), ele.tpcNSigmaEl()); + } } for (int i = 0; i < static_cast(max_mee_vec->size()); i++) { if (v12.M() < max_mee_vec->at(i)) { @@ -974,10 +981,14 @@ struct prefilterPrimaryElectron { ROOT::Math::PtEtaPhiMVector v2(track_par_cov_recalc.getPt(), track_par_cov_recalc.getEta(), track_par_cov_recalc.getPhi(), o2::constants::physics::MassElectron); // loose track ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; float phiv = o2::aod::pwgem::dilepton::utils::pairutil::getPhivPair(pVec_recalc[0], pVec_recalc[1], pVec_recalc[2], emele.px(), emele.py(), emele.pz(), pos.sign(), emele.sign(), d_bz); - fRegistry.fill(HIST("Pair/before/uls/hMvsPhiV"), phiv, v12.M()); - fRegistry.fill(HIST("Pair/before/uls/hMvsPt"), v12.M(), v12.Pt()); + if (fillQAHistogram) { + fRegistry.fill(HIST("Pair/before/uls/hMvsPhiV"), phiv, v12.M()); + fRegistry.fill(HIST("Pair/before/uls/hMvsPt"), v12.M(), v12.Pt()); + } if (v12.M() < max_mee_vec->at(static_cast(max_mee_vec->size()) - 1)) { - fRegistry.fill(HIST("Track/hTPCNsigmaEl"), pos.tpcInnerParam(), pos.tpcNSigmaEl()); + if (fillQAHistogram) { + fRegistry.fill(HIST("Track/hTPCNsigmaEl"), pos.tpcInnerParam(), pos.tpcNSigmaEl()); + } } for (int i = 0; i < static_cast(max_mee_vec->size()); i++) { if (v12.M() < max_mee_vec->at(i)) { @@ -1013,8 +1024,10 @@ struct prefilterPrimaryElectron { ROOT::Math::PtEtaPhiMVector v2(track_par_cov_recalc.getPt(), track_par_cov_recalc.getEta(), track_par_cov_recalc.getPhi(), o2::constants::physics::MassElectron); // loose track ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; float phiv = o2::aod::pwgem::dilepton::utils::pairutil::getPhivPair(pVec_recalc[0], pVec_recalc[1], pVec_recalc[2], empos.px(), empos.py(), empos.pz(), pos.sign(), empos.sign(), d_bz); - fRegistry.fill(HIST("Pair/before/lspp/hMvsPhiV"), phiv, v12.M()); - fRegistry.fill(HIST("Pair/before/lspp/hMvsPt"), v12.M(), v12.Pt()); + if (fillQAHistogram) { + fRegistry.fill(HIST("Pair/before/lspp/hMvsPhiV"), phiv, v12.M()); + fRegistry.fill(HIST("Pair/before/lspp/hMvsPt"), v12.M(), v12.Pt()); + } } // end of signal positron loop } // end of loose positon loop @@ -1041,8 +1054,10 @@ struct prefilterPrimaryElectron { ROOT::Math::PtEtaPhiMVector v2(emele.pt(), emele.eta(), emele.phi(), o2::constants::physics::MassElectron); // signal track ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; float phiv = o2::aod::pwgem::dilepton::utils::pairutil::getPhivPair(emele.px(), emele.py(), emele.pz(), pVec_recalc[0], pVec_recalc[1], pVec_recalc[2], emele.sign(), ele.sign(), d_bz); - fRegistry.fill(HIST("Pair/before/lsmm/hMvsPhiV"), phiv, v12.M()); - fRegistry.fill(HIST("Pair/before/lsmm/hMvsPt"), v12.M(), v12.Pt()); + if (fillQAHistogram) { + fRegistry.fill(HIST("Pair/before/lsmm/hMvsPhiV"), phiv, v12.M()); + fRegistry.fill(HIST("Pair/before/lsmm/hMvsPt"), v12.M(), v12.Pt()); + } } // end of signal electron loop } // end of loose electron loop @@ -1071,9 +1086,10 @@ struct prefilterPrimaryElectron { ROOT::Math::PtEtaPhiMVector v2(pos.pt(), pos.eta(), pos.phi(), o2::constants::physics::MassElectron); ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; float phiv = o2::aod::pwgem::dilepton::utils::pairutil::getPhivPair(pos.px(), pos.py(), pos.pz(), ele.px(), ele.py(), ele.pz(), pos.sign(), ele.sign(), d_bz); - fRegistry.fill(HIST("Pair/after/uls/hMvsPhiV"), phiv, v12.M()); - fRegistry.fill(HIST("Pair/after/uls/hMvsPt"), v12.M(), v12.Pt()); - + if (fillQAHistogram) { + fRegistry.fill(HIST("Pair/after/uls/hMvsPhiV"), phiv, v12.M()); + fRegistry.fill(HIST("Pair/after/uls/hMvsPt"), v12.M(), v12.Pt()); + } } // end of ULS pairing } // end of collision loop @@ -1102,15 +1118,19 @@ struct prefilterPrimaryElectron { if (!checkTrack(collision, pos)) { // track cut is applied to loose sample continue; } - fRegistry.fill(HIST("Track/hPt"), pos.pt()); - fRegistry.fill(HIST("Track/hEtaPhi"), pos.phi(), pos.eta()); + if (fillQAHistogram) { + fRegistry.fill(HIST("Track/hPt"), pos.pt()); + fRegistry.fill(HIST("Track/hEtaPhi"), pos.phi(), pos.eta()); + } } for (const auto& neg : negTracks_per_coll) { if (!checkTrack(collision, neg)) { // track cut is applied to loose sample continue; } - fRegistry.fill(HIST("Track/hPt"), neg.pt()); - fRegistry.fill(HIST("Track/hEtaPhi"), neg.phi(), neg.eta()); + if (fillQAHistogram) { + fRegistry.fill(HIST("Track/hPt"), neg.pt()); + fRegistry.fill(HIST("Track/hEtaPhi"), neg.phi(), neg.eta()); + } } for (const auto& [ele, empos] : combinations(CombinationsFullIndexPolicy(negTracks_per_coll, positrons_per_coll))) { @@ -1126,10 +1146,14 @@ struct prefilterPrimaryElectron { ROOT::Math::PtEtaPhiMVector v2(empos.pt(), empos.eta(), empos.phi(), o2::constants::physics::MassElectron); // signal track ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; float phiv = o2::aod::pwgem::dilepton::utils::pairutil::getPhivPair(empos.px(), empos.py(), empos.pz(), ele.px(), ele.py(), ele.pz(), empos.sign(), ele.sign(), d_bz); - fRegistry.fill(HIST("Pair/before/uls/hMvsPhiV"), phiv, v12.M()); - fRegistry.fill(HIST("Pair/before/uls/hMvsPt"), v12.M(), v12.Pt()); + if (fillQAHistogram) { + fRegistry.fill(HIST("Pair/before/uls/hMvsPhiV"), phiv, v12.M()); + fRegistry.fill(HIST("Pair/before/uls/hMvsPt"), v12.M(), v12.Pt()); + } if (v12.M() < max_mee_vec->at(static_cast(max_mee_vec->size()) - 1)) { - fRegistry.fill(HIST("Track/hTPCNsigmaEl"), ele.tpcInnerParam(), ele.tpcNSigmaEl()); + if (fillQAHistogram) { + fRegistry.fill(HIST("Track/hTPCNsigmaEl"), ele.tpcInnerParam(), ele.tpcNSigmaEl()); + } } for (int i = 0; i < static_cast(max_mee_vec->size()); i++) { if (v12.M() < max_mee_vec->at(i)) { @@ -1156,10 +1180,14 @@ struct prefilterPrimaryElectron { ROOT::Math::PtEtaPhiMVector v2(pos.pt(), pos.eta(), pos.phi(), o2::constants::physics::MassElectron); // loose track ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; float phiv = o2::aod::pwgem::dilepton::utils::pairutil::getPhivPair(pos.px(), pos.py(), pos.pz(), emele.px(), emele.py(), emele.pz(), pos.sign(), emele.sign(), d_bz); - fRegistry.fill(HIST("Pair/before/uls/hMvsPhiV"), phiv, v12.M()); - fRegistry.fill(HIST("Pair/before/uls/hMvsPt"), v12.M(), v12.Pt()); + if (fillQAHistogram) { + fRegistry.fill(HIST("Pair/before/uls/hMvsPhiV"), phiv, v12.M()); + fRegistry.fill(HIST("Pair/before/uls/hMvsPt"), v12.M(), v12.Pt()); + } if (v12.M() < max_mee_vec->at(static_cast(max_mee_vec->size()) - 1)) { - fRegistry.fill(HIST("Track/hTPCNsigmaEl"), pos.tpcInnerParam(), pos.tpcNSigmaEl()); + if (fillQAHistogram) { + fRegistry.fill(HIST("Track/hTPCNsigmaEl"), pos.tpcInnerParam(), pos.tpcNSigmaEl()); + } } for (int i = 0; i < static_cast(max_mee_vec->size()); i++) { if (v12.M() < max_mee_vec->at(i)) { @@ -1186,8 +1214,10 @@ struct prefilterPrimaryElectron { ROOT::Math::PtEtaPhiMVector v2(empos.pt(), empos.eta(), empos.phi(), o2::constants::physics::MassElectron); // signal track ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; float phiv = o2::aod::pwgem::dilepton::utils::pairutil::getPhivPair(empos.px(), empos.py(), empos.pz(), pos.px(), pos.py(), pos.pz(), empos.sign(), pos.sign(), d_bz); - fRegistry.fill(HIST("Pair/before/lspp/hMvsPhiV"), phiv, v12.M()); - fRegistry.fill(HIST("Pair/before/lspp/hMvsPt"), v12.M(), v12.Pt()); + if (fillQAHistogram) { + fRegistry.fill(HIST("Pair/before/lspp/hMvsPhiV"), phiv, v12.M()); + fRegistry.fill(HIST("Pair/before/lspp/hMvsPt"), v12.M(), v12.Pt()); + } } // end of LS++ pairing for (const auto& [ele, emele] : combinations(CombinationsFullIndexPolicy(negTracks_per_coll, electrons_per_coll))) { @@ -1203,8 +1233,10 @@ struct prefilterPrimaryElectron { ROOT::Math::PtEtaPhiMVector v2(emele.pt(), emele.eta(), emele.phi(), o2::constants::physics::MassElectron); // signal track ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; float phiv = o2::aod::pwgem::dilepton::utils::pairutil::getPhivPair(emele.px(), emele.py(), emele.pz(), ele.px(), ele.py(), ele.pz(), emele.sign(), ele.sign(), d_bz); - fRegistry.fill(HIST("Pair/before/lsmm/hMvsPhiV"), phiv, v12.M()); - fRegistry.fill(HIST("Pair/before/lsmm/hMvsPt"), v12.M(), v12.Pt()); + if (fillQAHistogram) { + fRegistry.fill(HIST("Pair/before/lsmm/hMvsPhiV"), phiv, v12.M()); + fRegistry.fill(HIST("Pair/before/lsmm/hMvsPt"), v12.M(), v12.Pt()); + } } // end of LS-- pairing } // end of collision loop @@ -1227,8 +1259,10 @@ struct prefilterPrimaryElectron { ROOT::Math::PtEtaPhiMVector v2(pos.pt(), pos.eta(), pos.phi(), o2::constants::physics::MassElectron); ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; float phiv = o2::aod::pwgem::dilepton::utils::pairutil::getPhivPair(pos.px(), pos.py(), pos.pz(), ele.px(), ele.py(), ele.pz(), pos.sign(), ele.sign(), d_bz); - fRegistry.fill(HIST("Pair/after/uls/hMvsPhiV"), phiv, v12.M()); - fRegistry.fill(HIST("Pair/after/uls/hMvsPt"), v12.M(), v12.Pt()); + if (fillQAHistogram) { + fRegistry.fill(HIST("Pair/after/uls/hMvsPhiV"), phiv, v12.M()); + fRegistry.fill(HIST("Pair/after/uls/hMvsPt"), v12.M(), v12.Pt()); + } } // end of ULS pairing } // end of collision loop From 705e110d0713fb6cb933cd8cb45f0736d6e90452 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Mon, 19 May 2025 01:24:46 +0900 Subject: [PATCH 1314/1650] [PWGEM/Dilepton] update matchingMFT.cxx (#11238) --- PWGEM/Dilepton/DataModel/lmeeMLTables.h | 21 ++++- .../treeCreatorElectronMLDDA.cxx | 72 ++++++++--------- PWGEM/Dilepton/Tasks/matchingMFT.cxx | 77 +++++++++++++++---- 3 files changed, 114 insertions(+), 56 deletions(-) diff --git a/PWGEM/Dilepton/DataModel/lmeeMLTables.h b/PWGEM/Dilepton/DataModel/lmeeMLTables.h index 9ab6ed32781..a89fe328705 100644 --- a/PWGEM/Dilepton/DataModel/lmeeMLTables.h +++ b/PWGEM/Dilepton/DataModel/lmeeMLTables.h @@ -48,6 +48,7 @@ DECLARE_SOA_COLUMN(PIDLabel, pidlabel, int); //! DECLARE_SOA_COLUMN(TrackType, tracktype, int); //! DECLARE_SOA_COLUMN(TPCNClsFound, tpcNClsFound, int); //! DECLARE_SOA_COLUMN(TPCNClsCrossedRows, tpcNClsCrossedRows, int); //! +DECLARE_SOA_COLUMN(IsForValidation, isForValidation, bool); //! DECLARE_SOA_DYNAMIC_COLUMN(P, p, [](float pt, float eta) -> float { return pt * std::cosh(eta); }); DECLARE_SOA_DYNAMIC_COLUMN(MeanClusterSizeITS, meanClusterSizeITS, [](uint32_t itsClusterSizes) -> float { int total_cluster_size = 0, nl = 0; @@ -64,6 +65,21 @@ DECLARE_SOA_DYNAMIC_COLUMN(MeanClusterSizeITS, meanClusterSizeITS, [](uint32_t i return 0; } }); +DECLARE_SOA_DYNAMIC_COLUMN(MeanClusterSizeITSob, meanClusterSizeITSob, [](uint32_t itsClusterSizes) -> float { + int total_cluster_size = 0, nl = 0; + for (unsigned int layer = 3; layer < 7; layer++) { + int cluster_size_per_layer = (itsClusterSizes >> (layer * 4)) & 0xf; + if (cluster_size_per_layer > 0) { + nl++; + } + total_cluster_size += cluster_size_per_layer; + } + if (nl > 0) { + return static_cast(total_cluster_size) / static_cast(nl); + } else { + return 0; + } +}); } // namespace emprimarytrack // reconstructed track information @@ -75,11 +91,12 @@ DECLARE_SOA_TABLE(EMPrimaryTracks, "AOD", "EMPTRACK", //! track::TPCChi2NCl, track::TPCInnerParam, track::TPCSignal, pidtpc::TPCNSigmaEl, pidtpc::TPCNSigmaMu, pidtpc::TPCNSigmaPi, pidtpc::TPCNSigmaKa, pidtpc::TPCNSigmaPr, pidtofbeta::Beta, pidtof::TOFNSigmaEl, pidtof::TOFNSigmaMu, pidtof::TOFNSigmaPi, pidtof::TOFNSigmaKa, pidtof::TOFNSigmaPr, - track::ITSClusterSizes, track::ITSChi2NCl, track::TOFChi2, track::DetectorMap, emprimarytrack::PIDLabel, emprimarytrack::TrackType, + track::ITSClusterSizes, track::ITSChi2NCl, track::TOFChi2, track::DetectorMap, emprimarytrack::PIDLabel, emprimarytrack::TrackType, emprimarytrack::IsForValidation, // dynamic column emprimarytrack::P, - emprimarytrack::MeanClusterSizeITS); + emprimarytrack::MeanClusterSizeITS, + emprimarytrack::MeanClusterSizeITSob); // iterators using EMPrimaryTrack = EMPrimaryTracks::iterator; diff --git a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx index 16aa791d217..227af22c1bb 100644 --- a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx +++ b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx @@ -59,13 +59,13 @@ using MyTracks = soa::Join emprimarytracks; // flat table containing collision + track information @@ -151,6 +151,7 @@ struct TreeCreatorElectronMLDDA { Configurable d_bz_input{"d_bz_input", -999, "bz field, -999 is automatic"}; Configurable useMatCorrType{"useMatCorrType", 0, "0: none, 1: TGeo, 2: LUT"}; + Configurable downscaling_track{"downscaling_track", 1e-4, "down scaling factor to store track"}; Configurable downscaling_electron{"downscaling_electron", 0.005, "down scaling factor to store electron"}; Configurable downscaling_pion{"downscaling_pion", 0.001, "down scaling factor to store pion"}; Configurable downscaling_kaon{"downscaling_kaon", 1.1, "down scaling factor to store kaon"}; @@ -167,12 +168,12 @@ struct TreeCreatorElectronMLDDA { Configurable cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 0.7, "max fraction of shared clusters in TPC"}; Configurable cfg_min_ncrossedrows_tpc{"cfg_min_ncrossedrows_tpc", 70, "min ncrossed rows"}; Configurable cfg_min_ncluster_tpc{"cfg_min_ncluster_tpc", 0, "min ncluster tpc"}; - Configurable cfg_min_ncluster_its{"cfg_min_ncluster_its", 2, "min ncluster its"}; - Configurable cfg_min_ncluster_itsib{"cfg_min_ncluster_itsib", 0, "min ncluster itsib"}; + Configurable cfg_min_ncluster_its{"cfg_min_ncluster_its", 4, "min ncluster its"}; + Configurable cfg_min_ncluster_itsib{"cfg_min_ncluster_itsib", 1, "min ncluster itsib"}; Configurable cfg_max_chi2tpc{"cfg_max_chi2tpc", 5.0, "max chi2/NclsTPC"}; Configurable cfg_max_chi2its{"cfg_max_chi2its", 6.0, "max chi2/NclsITS"}; - Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 0.3, "max dca XY in cm"}; - Configurable cfg_max_dcaz{"cfg_max_dcaz", 0.3, "max dca Z in cm"}; + Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 1.0, "max dca XY in cm"}; + Configurable cfg_max_dcaz{"cfg_max_dcaz", 1.0, "max dca Z in cm"}; } trackcuts; struct : ConfigurableGroup { @@ -513,7 +514,7 @@ struct TreeCreatorElectronMLDDA { } template - void fillTrackTable(TCollision const& collision, TTrack const& track, const int pidlabel, const int tracktype) + void fillTrackTable(TCollision const& collision, TTrack const& track, const int pidlabel, const int tracktype, const bool isForValidation) { if (std::find(stored_trackIds.begin(), stored_trackIds.end(), track.globalIndex()) == stored_trackIds.end()) { mDcaInfoCov.set(999, 999, 999, 999, 999); @@ -532,7 +533,7 @@ struct TreeCreatorElectronMLDDA { track.tpcChi2NCl(), track.tpcInnerParam(), track.tpcSignal(), track.tpcNSigmaEl(), track.tpcNSigmaMu(), track.tpcNSigmaPi(), track.tpcNSigmaKa(), track.tpcNSigmaPr(), track.beta(), track.tofNSigmaEl(), track.tofNSigmaMu(), track.tofNSigmaPi(), track.tofNSigmaKa(), track.tofNSigmaPr(), - track.itsClusterSizes(), track.itsChi2NCl(), track.tofChi2(), track.detectorMap(), pidlabel, tracktype); + track.itsClusterSizes(), track.itsChi2NCl(), track.tofChi2(), track.detectorMap(), pidlabel, tracktype, isForValidation); stored_trackIds.emplace_back(track.globalIndex()); } } @@ -594,10 +595,10 @@ struct TreeCreatorElectronMLDDA { registry.fill(HIST("V0/hTPCdEdx_P_Pi"), pos.p(), pos.tpcSignal()); registry.fill(HIST("V0/hTOFbeta_P_Pi"), pos.p(), pos.beta()); if (dist01(engine) < downscaling_pion) { - fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kPion), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary)); + fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kPion), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } if (dist01(engine) < downscaling_pion) { - fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kPion), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary)); + fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kPion), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } } } @@ -605,7 +606,7 @@ struct TreeCreatorElectronMLDDA { registry.fill(HIST("V0/hMassLambda"), v0.mLambda()); if (v0cuts.cfg_min_mass_lambda < v0.mLambda() && v0.mLambda() < v0cuts.cfg_max_mass_lambda) { if (dist01(engine) < downscaling_proton) { - fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kProton), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary)); + fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kProton), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } registry.fill(HIST("V0/hTPCdEdx_P_Pr"), pos.p(), pos.tpcSignal()); registry.fill(HIST("V0/hTOFbeta_P_Pr"), pos.p(), pos.beta()); @@ -615,7 +616,7 @@ struct TreeCreatorElectronMLDDA { registry.fill(HIST("V0/hMassAntiLambda"), v0.mAntiLambda()); if (v0cuts.cfg_min_mass_lambda < v0.mAntiLambda() && v0.mAntiLambda() < v0cuts.cfg_max_mass_lambda) { if (dist01(engine) < downscaling_proton) { - fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kProton), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary)); + fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kProton), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } registry.fill(HIST("V0/hTPCdEdx_P_Pr"), neg.p(), neg.tpcSignal()); registry.fill(HIST("V0/hTOFbeta_P_Pr"), neg.p(), neg.beta()); @@ -627,10 +628,10 @@ struct TreeCreatorElectronMLDDA { registry.fill(HIST("V0/hMassGamma_Rxy"), v0.v0radius(), v0.mGamma()); if ((v0cuts.cfg_min_mass_photon < v0.mGamma() && v0.mGamma() < v0cuts.cfg_max_mass_photon)) { if (dist01(engine) < downscaling_electron) { - fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary)); + fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } if (dist01(engine) < downscaling_electron) { - fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary)); + fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } registry.fill(HIST("V0/hTPCdEdx_P_El"), neg.p(), neg.tpcSignal()); registry.fill(HIST("V0/hTOFbeta_P_El"), neg.p(), neg.beta()); @@ -665,10 +666,10 @@ struct TreeCreatorElectronMLDDA { registry.fill(HIST("V0/hTOFbeta_P_El"), pos.p(), pos.beta()); if (dist01(engine) < downscaling_electron) { - fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary)); // secondary in primary electron candidates + fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary), false); // secondary in primary electron candidates } if (dist01(engine) < downscaling_electron) { - fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary)); // secondary in primary electron candidates + fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary), false); // secondary in primary electron candidates } } } // end of ULS pair loop @@ -755,31 +756,20 @@ struct TreeCreatorElectronMLDDA { registry.fill(HIST("V0/hTPCdEdx_P_Ka"), bachelor.p(), bachelor.tpcSignal()); registry.fill(HIST("V0/hTOFbeta_P_Ka"), bachelor.p(), bachelor.beta()); if (dist01(engine) < downscaling_kaon) { - fillTrackTable(collision, bachelor, static_cast(o2::aod::pwgem::dilepton::PID_Label::kKaon), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary)); + fillTrackTable(collision, bachelor, static_cast(o2::aod::pwgem::dilepton::PID_Label::kKaon), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary), false); } } } } // end of cascade loop - // auto tracks_coll = tracks.sliceBy(perCollision_track, collision.globalIndex()); - // for (const auto& track : tracks_coll) { - // if (!isSelectedTrack(collision, track)) { - // continue; - // } - // registry.fill(HIST("PrimaryTrack/hTPCdEdx_P"), track.p(), track.tpcSignal()); - // registry.fill(HIST("PrimaryTrack/hTOFbeta_P"), track.p(), track.beta()); - // registry.fill(HIST("PrimaryTrack/hITSClusterSize_P"), track.p(), meanClusterSizeITS<0, 7>(track) * std::cos(std::atan(track.tgl()))); - // registry.fill(HIST("PrimaryTrack/hTPCNsigmaEl_P"), track.p(), track.tpcNSigmaEl()); - // registry.fill(HIST("PrimaryTrack/hTOFNsigmaEl_P"), track.p(), track.tofNSigmaEl()); - // registry.fill(HIST("PrimaryTrack/hTPCNsigmaMu_P"), track.p(), track.tpcNSigmaMu()); - // registry.fill(HIST("PrimaryTrack/hTOFNsigmaMu_P"), track.p(), track.tofNSigmaMu()); - // registry.fill(HIST("PrimaryTrack/hTPCNsigmaPi_P"), track.p(), track.tpcNSigmaPi()); - // registry.fill(HIST("PrimaryTrack/hTOFNsigmaPi_P"), track.p(), track.tofNSigmaPi()); - // registry.fill(HIST("PrimaryTrack/hTPCNsigmaKa_P"), track.p(), track.tpcNSigmaKa()); - // registry.fill(HIST("PrimaryTrack/hTOFNsigmaKa_P"), track.p(), track.tofNSigmaKa()); - // registry.fill(HIST("PrimaryTrack/hTPCNsigmaPr_P"), track.p(), track.tpcNSigmaPr()); - // registry.fill(HIST("PrimaryTrack/hTOFNsigmaPr_P"), track.p(), track.tofNSigmaPr()); - // } // end of track loop + const auto& tracks_coll = tracks.sliceBy(perCollision_track, collision.globalIndex()); + for (const auto& track : tracks_coll) { + if (isSelectedTrack(collision, track) && (v0cuts.cfg_min_TPCNsigmaEl < track.tpcNSigmaEl() && track.tpcNSigmaEl() < v0cuts.cfg_max_TPCNsigmaEl)) { + if (dist01(engine) < downscaling_track) { + fillTrackTable(collision, track, static_cast(o2::aod::pwgem::dilepton::PID_Label::kUnDef), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary), true); + } + } + } // end of track loop } // end of collision loop stored_trackIds.clear(); diff --git a/PWGEM/Dilepton/Tasks/matchingMFT.cxx b/PWGEM/Dilepton/Tasks/matchingMFT.cxx index 60431fb3826..29050623956 100644 --- a/PWGEM/Dilepton/Tasks/matchingMFT.cxx +++ b/PWGEM/Dilepton/Tasks/matchingMFT.cxx @@ -175,6 +175,9 @@ struct matchingMFT { fRegistry.add("MFTMCHMID/primary/correct/hDCAxResolutionvsPt", "DCA_{x} resolution vs. p_{T};p_{T} (GeV/c);DCA_{x} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 500}}, false); fRegistry.add("MFTMCHMID/primary/correct/hDCAyResolutionvsPt", "DCA_{y} resolution vs. p_{T};p_{T} (GeV/c);DCA_{y} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 500}}, false); fRegistry.add("MFTMCHMID/primary/correct/hDCAxyResolutionvsPt", "DCA_{xy} resolution vs. p_{T};p_{T} (GeV/c);DCA_{xy} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 500}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hMCHBitMap", "MCH bit map;MCH bit map", kTH1F, {{1024, -0.5, 1023.5}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hMIDBitMap", "MID bit map;MID bit map", kTH1F, {{256, -0.5, 255.5}}, false); + fRegistry.add("MFTMCHMID/primary/correct/hMeanMFTClusterSize", "mean MFT cluster size vs. p;p (GeV/c); #times cos(#lambda)", kTH2F, {{100, 0, 100}, {100, 0, 1}}, false); fRegistry.add("MFTMCHMID/primary/correct/hProdVtxZ", "prod. vtx Z of muon;V_{z} (cm)", kTH1F, {{200, -100, 100}}, false); fRegistry.add("MFTMCHMID/primary/correct/hRelDeltaPt", "pT resolution;p_{T}^{gen} (GeV/c);(p_{T}^{rec} - p_{T}^{gen})/p_{T}^{gen}", kTH2F, {{100, 0, 10}, {400, -1, +1}}, false); @@ -184,7 +187,6 @@ struct matchingMFT { fRegistry.add("MFTMCHMID/primary/correct/hDeltaPhi_Neg", "#varphi resolution;p_{T}^{gen} (GeV/c);#varphi^{rec} - #varphi^{gen} (rad.)", kTH2F, {{100, 0, 10}, {400, -0.2, +0.2}}, false); fRegistry.addClone("MFTMCHMID/primary/correct/", "MFTMCHMID/primary/wrong/"); fRegistry.addClone("MFTMCHMID/primary/", "MFTMCHMID/secondary/"); - // fRegistry.add("Generated/primary/hs", "gen. info;p_{T} (GeV/c);#eta;#varphi (rad.)", kTHnSparseF, {{100, 0.0f, 10}, {60, -5, -2}, {90, 0, 2.f * M_PI}}, false); } bool isSelected(const float pt, const float eta, const float rAtAbsorberEnd, const float pDCA, const float chi2, const uint8_t trackType, const float dcaXY) @@ -250,6 +252,28 @@ struct matchingMFT { return (clmap > 0); } + template + float meanClusterSizeMFT(T const& track) + { + uint64_t mftClusterSizesAndTrackFlags = track.mftClusterSizesAndTrackFlags(); + uint16_t clsSize = 0; + uint16_t n = 0; + for (unsigned int layer = 0; layer < 10; layer++) { + uint16_t size_per_layer = (mftClusterSizesAndTrackFlags >> (layer * 6)) & 0x3f; + clsSize += size_per_layer; + if (size_per_layer > 0) { + n++; + } + // LOGF(info, "track.globalIndex() = %d, layer = %d, size_per_layer = %d", track.globalIndex(), layer, size_per_layer); + } + + if (n > 0) { + return static_cast(clsSize) / static_cast(n) * std::cos(std::atan(track.tgl())); + } else { + return 0.f; + } + } + template void fillHistograms(TCollision const& collision, TFwdTrack fwdtrack, TFwdTracks const&, TMFTTracks const&) { @@ -296,6 +320,7 @@ struct matchingMFT { o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon(fwdtrack, collision, propagationPoint::kToVertex); o2::dataformats::GlobalFwdTrack propmuonAtDCA = propagateMuon(fwdtrack, collision, propagationPoint::kToDCA); + float p = propmuonAtPV.getP(); float pt = propmuonAtPV.getPt(); float eta = propmuonAtPV.getEta(); float phi = propmuonAtPV.getPhi(); @@ -320,18 +345,18 @@ struct matchingMFT { } float sigma_dcaXY = dcaXY / dcaXYinSigma; - o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToVertex); - float ptMatchedMCHMID = propmuonAtPV_Matched.getPt(); - float etaMatchedMCHMID = propmuonAtPV_Matched.getEta(); - float phiMatchedMCHMID = propmuonAtPV_Matched.getPhi(); - o2::math_utils::bringTo02Pi(phiMatchedMCHMID); - float dpt = (ptMatchedMCHMID - pt) / pt; - float deta = etaMatchedMCHMID - eta; - float dphi = phiMatchedMCHMID - phi; - o2::math_utils::bringToPMPi(dphi); - if (std::sqrt(std::pow(deta / maxDEta, 2) + std::pow(dphi / maxDPhi, 2)) > 1.f || std::fabs(dpt) > maxRelDPt) { - return; - } + // o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToVertex); + // float ptMatchedMCHMID = propmuonAtPV_Matched.getPt(); + // float etaMatchedMCHMID = propmuonAtPV_Matched.getEta(); + // float phiMatchedMCHMID = propmuonAtPV_Matched.getPhi(); + // o2::math_utils::bringTo02Pi(phiMatchedMCHMID); + // float dpt = (ptMatchedMCHMID - pt) / pt; + // float deta = etaMatchedMCHMID - eta; + // float dphi = phiMatchedMCHMID - phi; + // o2::math_utils::bringToPMPi(dphi); + // if (std::sqrt(std::pow(deta / maxDEta, 2) + std::pow(dphi / maxDPhi, 2)) > 1.f || std::fabs(dpt) > maxRelDPt) { + // return; + // } o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToDCA); float dcaX_Matched = propmuonAtDCA_Matched.getX() - collision.posX(); @@ -345,11 +370,25 @@ struct matchingMFT { return; } + o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToVertex); if (refitGlobalMuon) { eta = mfttrack.eta(); phi = mfttrack.phi(); o2::math_utils::bringTo02Pi(phi); pt = propmuonAtPV_Matched.getP() * std::sin(2.f * std::atan(std::exp(-eta))); + p = propmuonAtPV_Matched.getP(); + } + + float ptMatchedMCHMID = propmuonAtPV_Matched.getPt(); + float etaMatchedMCHMID = propmuonAtPV_Matched.getEta(); + float phiMatchedMCHMID = propmuonAtPV_Matched.getPhi(); + o2::math_utils::bringTo02Pi(phiMatchedMCHMID); + float dpt = (ptMatchedMCHMID - pt) / pt; + float deta = etaMatchedMCHMID - eta; + float dphi = phiMatchedMCHMID - phi; + o2::math_utils::bringToPMPi(dphi); + if (std::sqrt(std::pow(deta / maxDEta, 2) + std::pow(dphi / maxDPhi, 2)) > 1.f || std::fabs(dpt) > maxRelDPt) { + return; } if (!isSelected(pt, eta, rAtAbsorberEnd, pDCA, fwdtrack.chi2(), fwdtrack.trackType(), dcaXY)) { @@ -388,6 +427,9 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxy2DinSigma"), dcaX / std::sqrt(cXXatDCA), dcaY / std::sqrt(cYYatDCA)); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxy"), dcaXY); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxyinSigma"), dcaXYinSigma); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hMCHBitMap"), fwdtrack.mchBitMap()); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hMIDBitMap"), fwdtrack.midBitMap()); + fRegistry.fill(HIST("MFTMCHMID/primary/correct/hMeanMFTClusterSize"), p, meanClusterSizeMFT(mfttrack)); fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxResolutionvsPt"), pt, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAyResolutionvsPt"), pt, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/primary/correct/hDCAxyResolutionvsPt"), pt, sigma_dcaXY * 1e+4); // convert cm to um @@ -422,6 +464,9 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxy2DinSigma"), dcaX / std::sqrt(cXXatDCA), dcaY / std::sqrt(cYYatDCA)); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxy"), dcaXY); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxyinSigma"), dcaXYinSigma); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hMCHBitMap"), fwdtrack.mchBitMap()); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hMIDBitMap"), fwdtrack.midBitMap()); + fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hMeanMFTClusterSize"), p, meanClusterSizeMFT(mfttrack)); fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxResolutionvsPt"), pt, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAyResolutionvsPt"), pt, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/primary/wrong/hDCAxyResolutionvsPt"), pt, sigma_dcaXY * 1e+4); // convert cm to um @@ -457,6 +502,9 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxy2DinSigma"), dcaX / std::sqrt(cXXatDCA), dcaY / std::sqrt(cYYatDCA)); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxy"), dcaXY); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxyinSigma"), dcaXYinSigma); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hMCHBitMap"), fwdtrack.mchBitMap()); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hMIDBitMap"), fwdtrack.midBitMap()); + fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hMeanMFTClusterSize"), p, meanClusterSizeMFT(mfttrack)); fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxResolutionvsPt"), pt, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAyResolutionvsPt"), pt, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/secondary/correct/hDCAxyResolutionvsPt"), pt, sigma_dcaXY * 1e+4); // convert cm to um @@ -490,6 +538,9 @@ struct matchingMFT { fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxy2DinSigma"), dcaX / std::sqrt(cXXatDCA), dcaY / std::sqrt(cYYatDCA)); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxy"), dcaXY); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxyinSigma"), dcaXYinSigma); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hMCHBitMap"), fwdtrack.mchBitMap()); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hMIDBitMap"), fwdtrack.midBitMap()); + fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hMeanMFTClusterSize"), p, meanClusterSizeMFT(mfttrack)); fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxResolutionvsPt"), pt, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAyResolutionvsPt"), pt, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um fRegistry.fill(HIST("MFTMCHMID/secondary/wrong/hDCAxyResolutionvsPt"), pt, sigma_dcaXY * 1e+4); // convert cm to um From e44b7204a88609f602af51b058133cbf0b7fad59 Mon Sep 17 00:00:00 2001 From: abmodak <67369858+abmodak@users.noreply.github.com> Date: Sun, 18 May 2025 19:58:03 +0200 Subject: [PATCH 1315/1650] [PWGLF] Update gen process function (#11239) --- .../heavyionMultiplicity.cxx | 40 ++++++++++++++----- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/heavyionMultiplicity.cxx b/PWGLF/Tasks/GlobalEventProperties/heavyionMultiplicity.cxx index dfd24dddafb..b91db8d09e0 100644 --- a/PWGLF/Tasks/GlobalEventProperties/heavyionMultiplicity.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/heavyionMultiplicity.cxx @@ -806,22 +806,42 @@ struct HeavyionMultiplicity { } PROCESS_SWITCH(HeavyionMultiplicity, processppMonteCarlo, "process pp MC", false); - void processGen(soa::Join::iterator const& mccols, aod::McParticles const& GenParticles) + void processGen(aod::McCollisions::iterator const&, aod::McParticles const& GenParticles) { - histos.fill(HIST("MultBarrelEta10_vs_FT0A"), mccols.multMCNParticlesEta10(), mccols.multMCFT0A()); - histos.fill(HIST("MultBarrelEta10_vs_FT0C"), mccols.multMCNParticlesEta10(), mccols.multMCFT0C()); - histos.fill(HIST("MultBarrelEta10"), mccols.multMCNParticlesEta10()); - histos.fill(HIST("MultFT0A"), mccols.multMCFT0A()); - histos.fill(HIST("MultFT0C"), mccols.multMCFT0C()); - histos.fill(HIST("mult10_vs_FT0A"), mccols.multMCNParticlesEta10(), mccols.multMCFT0A()); - histos.fill(HIST("mult10_vs_FT0C"), mccols.multMCNParticlesEta10(), mccols.multMCFT0C()); + + int multFT0A = 0; + int multFT0C = 0; + int multBarrelEta10 = 0; + + for (const auto& particle : GenParticles) { + if (!isGenTrackSelected(particle)) { + continue; + } + if (std::abs(particle.eta()) < 1.0) { + multBarrelEta10++; + } + if (-3.3 < particle.eta() && particle.eta() < -2.1) { + multFT0C++; + } + if (3.5 < particle.eta() && particle.eta() < 4.9) { + multFT0A++; + } + } + + histos.fill(HIST("MultBarrelEta10_vs_FT0A"), multBarrelEta10, multFT0A); + histos.fill(HIST("MultBarrelEta10_vs_FT0C"), multBarrelEta10, multFT0C); + histos.fill(HIST("MultBarrelEta10"), multBarrelEta10); + histos.fill(HIST("MultFT0A"), multFT0A); + histos.fill(HIST("MultFT0C"), multFT0C); + histos.fill(HIST("mult10_vs_FT0A"), multBarrelEta10, multFT0A); + histos.fill(HIST("mult10_vs_FT0C"), multBarrelEta10, multFT0C); for (const auto& particle : GenParticles) { if (!isGenTrackSelected(particle)) { continue; } - histos.fill(HIST("dndeta10_vs_FT0A"), particle.eta(), mccols.multMCFT0A()); - histos.fill(HIST("dndeta10_vs_FT0C"), particle.eta(), mccols.multMCFT0C()); + histos.fill(HIST("dndeta10_vs_FT0A"), particle.eta(), multFT0A); + histos.fill(HIST("dndeta10_vs_FT0C"), particle.eta(), multFT0C); } } PROCESS_SWITCH(HeavyionMultiplicity, processGen, "process pure MC gen", false); From 292de55c4895297aec5fa6609e6c530b59294b07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Mon, 19 May 2025 00:20:06 +0200 Subject: [PATCH 1316/1650] [PWGHF] add a flag for vertex build and fix the issue of CPU time consumption (#11241) --- .../TableProducer/treeCreatorTccToD0D0Pi.cxx | 348 +++++++++--------- 1 file changed, 174 insertions(+), 174 deletions(-) diff --git a/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx b/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx index b4b66af4bf5..3d03e442834 100644 --- a/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx +++ b/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx @@ -186,6 +186,7 @@ struct HfTreeCreatorTccToD0D0Pi { Configurable usePionIsGlobalTrackWoDCA{"usePionIsGlobalTrackWoDCA", true, "check isGlobalTrackWoDCA status for pions"}; // vertexing + Configurable buildVertex{"buildVertex", false, "build vertext for Tcc"}; Configurable propagateToPCA{"propagateToPCA", true, "create tracks version propagated to PCA"}; Configurable useAbsDCA{"useAbsDCA", false, "Minimise abs. distance rather than chi2"}; Configurable useWeightedFinalPCA{"useWeightedFinalPCA", false, "Recalculate vertex position using track covariances, effective only if useAbsDCA is true"}; @@ -214,8 +215,8 @@ struct HfTreeCreatorTccToD0D0Pi { Service ccdb; o2::base::MatLayerCylSet* lut; o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT; - int runNumber; double bz{0.}; + int runNumber{0}; using TracksPid = soa::Join; using TracksWPid = soa::Join; @@ -242,44 +243,44 @@ struct HfTreeCreatorTccToD0D0Pi { if (std::accumulate(doprocess.begin(), doprocess.end(), 0) != 1) { LOGP(fatal, "Only one process function can be enabled at a time."); } - - dfD1.setPropagateToPCA(propagateToPCA); - dfD1.setMaxR(maxR); - dfD1.setMaxDZIni(maxDZIni); - dfD1.setMinParamChange(minParamChange); - dfD1.setMinRelChi2Change(minRelChi2Change); - dfD1.setUseAbsDCA(useAbsDCA); - dfD1.setWeightedFinalPCA(useWeightedFinalPCA); - - dfD2.setPropagateToPCA(propagateToPCA); - dfD2.setMaxR(maxR); - dfD2.setMaxDZIni(maxDZIni); - dfD2.setMinParamChange(minParamChange); - dfD2.setMinRelChi2Change(minRelChi2Change); - dfD2.setUseAbsDCA(useAbsDCA); - dfD2.setWeightedFinalPCA(useWeightedFinalPCA); - - dfTcc.setPropagateToPCA(propagateToPCA); - dfTcc.setMaxR(maxR); - dfTcc.setMaxDZIni(maxDZIni); - dfTcc.setMinParamChange(minParamChange); - dfTcc.setMinRelChi2Change(minRelChi2Change); - dfTcc.setUseAbsDCA(useAbsDCA); - dfTcc.setWeightedFinalPCA(useWeightedFinalPCA); - - // Configure CCDB access - ccdb->setURL(ccdbUrl); - ccdb->setCaching(true); - ccdb->setLocalObjectValidityChecking(); - lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get(ccdbPathLut)); - runNumber = 0; - - hCandidatesD1 = registry.add("hCandidatesD1", "D1 candidate counter", {HistType::kTH1D, {axisCands}}); - hCandidatesD2 = registry.add("hCandidatesD2", "D2 candidate counter", {HistType::kTH1D, {axisCands}}); - hCandidatesTcc = registry.add("hCandidatesTcc", "Tcc candidate counter", {HistType::kTH1D, {axisCands}}); - setLabelHistoCands(hCandidatesD1); - setLabelHistoCands(hCandidatesD2); - setLabelHistoCands(hCandidatesTcc); + if (buildVertex) { + dfD1.setPropagateToPCA(propagateToPCA); + dfD1.setMaxR(maxR); + dfD1.setMaxDZIni(maxDZIni); + dfD1.setMinParamChange(minParamChange); + dfD1.setMinRelChi2Change(minRelChi2Change); + dfD1.setUseAbsDCA(useAbsDCA); + dfD1.setWeightedFinalPCA(useWeightedFinalPCA); + + dfD2.setPropagateToPCA(propagateToPCA); + dfD2.setMaxR(maxR); + dfD2.setMaxDZIni(maxDZIni); + dfD2.setMinParamChange(minParamChange); + dfD2.setMinRelChi2Change(minRelChi2Change); + dfD2.setUseAbsDCA(useAbsDCA); + dfD2.setWeightedFinalPCA(useWeightedFinalPCA); + + dfTcc.setPropagateToPCA(propagateToPCA); + dfTcc.setMaxR(maxR); + dfTcc.setMaxDZIni(maxDZIni); + dfTcc.setMinParamChange(minParamChange); + dfTcc.setMinRelChi2Change(minRelChi2Change); + dfTcc.setUseAbsDCA(useAbsDCA); + dfTcc.setWeightedFinalPCA(useWeightedFinalPCA); + + // Configure CCDB access + ccdb->setURL(ccdbUrl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get(ccdbPathLut)); + + hCandidatesD1 = registry.add("hCandidatesD1", "D1 candidate counter", {HistType::kTH1D, {axisCands}}); + hCandidatesD2 = registry.add("hCandidatesD2", "D2 candidate counter", {HistType::kTH1D, {axisCands}}); + hCandidatesTcc = registry.add("hCandidatesTcc", "Tcc candidate counter", {HistType::kTH1D, {axisCands}}); + setLabelHistoCands(hCandidatesD1); + setLabelHistoCands(hCandidatesD2); + setLabelHistoCands(hCandidatesTcc); + } } template @@ -308,117 +309,35 @@ struct HfTreeCreatorTccToD0D0Pi { void runCandCreatorData(CollType const& collisions, CandType const& candidates, aod::TrackAssoc const& trackIndices, - TrkType const&) + TrkType const& tracks) { for (const auto& collision : collisions) { auto bc = collision.template bc_as(); + auto primaryVertex = getPrimaryVertex(collision); if (runNumber != bc.runNumber()) { LOG(info) << ">>>>>>>>>>>> Current run number: " << runNumber; initCCDB(bc, runNumber, ccdb, isRun2 ? ccdbPathGrp : ccdbPathGrpMag, lut, isRun2); bz = o2::base::Propagator::Instance()->getNominalBz(); LOG(info) << ">>>>>>>>>>>> Magnetic field: " << bz; } - dfTcc.setBz(bz); - dfD1.setBz(bz); - dfD2.setBz(bz); + + if (buildVertex) { + dfTcc.setBz(bz); + dfD1.setBz(bz); + dfD2.setBz(bz); + } fillEvent(collision, 0, bc.runNumber()); auto thisCollId = collision.globalIndex(); auto candwD0ThisColl = candidates.sliceBy(candsD0PerCollisionWithMl, thisCollId); if (candwD0ThisColl.size() <= 1) continue; // only loop the collision that include at least 2 D candidates auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); - auto primaryVertex = getPrimaryVertex(collision); for (const auto& candidateD1 : candidates) { - auto trackD1Prong0 = candidateD1.template prong0_as(); - auto trackD1Prong1 = candidateD1.template prong1_as(); - auto trackParVarD1Prong0 = getTrackParCov(trackD1Prong0); - auto trackParVarD1Prong1 = getTrackParCov(trackD1Prong1); - - auto dca0D1 = o2::dataformats::DCA(trackD1Prong0.dcaXY(), trackD1Prong0.dcaZ(), trackD1Prong0.cYY(), trackD1Prong0.cZY(), trackD1Prong0.cZZ()); - auto dca1D1 = o2::dataformats::DCA(trackD1Prong1.dcaXY(), trackD1Prong1.dcaZ(), trackD1Prong1.cYY(), trackD1Prong1.cZY(), trackD1Prong1.cZZ()); - - // repropagate tracks to this collision if needed - if (trackD1Prong0.collisionId() != thisCollId) { - trackParVarD1Prong0.propagateToDCA(primaryVertex, bz, &dca0D1); - } - - if (trackD1Prong0.collisionId() != thisCollId) { - trackParVarD1Prong1.propagateToDCA(primaryVertex, bz, &dca1D1); - } - // reconstruct the 2-prong secondary vertex - hCandidatesD1->Fill(SVFitting::BeforeFit); - try { - if (dfD1.process(trackParVarD1Prong0, trackParVarD1Prong1) == 0) { - continue; - } - } catch (const std::runtime_error& error) { - LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN for first D0 cannot work, skipping the candidate."; - hCandidatesD1->Fill(SVFitting::Fail); - continue; - } - hCandidatesD1->Fill(SVFitting::FitOk); - const auto& vertexD1 = dfD1.getPCACandidatePos(); - trackParVarD1Prong0.propagateTo(vertexD1[0], bz); - trackParVarD1Prong1.propagateTo(vertexD1[0], bz); - // Get pVec of tracks of D1 - std::array pVecD1Prong0 = {0}; - std::array pVecD1Prong1 = {0}; - dfD1.getTrack(0).getPxPyPzGlo(pVecD1Prong0); - dfD1.getTrack(1).getPxPyPzGlo(pVecD1Prong1); - // Get D1 momentum - std::array pVecD1 = RecoDecay::pVec(pVecD1Prong0, pVecD1Prong1); - // build a D1 neutral track - auto trackD1 = o2::dataformats::V0(vertexD1, pVecD1, dfD1.calcPCACovMatrixFlat(), trackParVarD1Prong0, trackParVarD1Prong1); - for (auto candidateD2 = candidateD1 + 1; candidateD2 != candidates.end(); ++candidateD2) { - - auto trackD2Prong0 = candidateD2.template prong0_as(); - auto trackD2Prong1 = candidateD2.template prong1_as(); - auto trackParVarD2Prong0 = getTrackParCov(trackD2Prong0); - auto trackParVarD2Prong1 = getTrackParCov(trackD2Prong1); - - auto dca0D2 = o2::dataformats::DCA(trackD2Prong0.dcaXY(), trackD2Prong0.dcaZ(), trackD2Prong0.cYY(), trackD2Prong0.cZY(), trackD2Prong0.cZZ()); - auto dca1D2 = o2::dataformats::DCA(trackD2Prong1.dcaXY(), trackD2Prong1.dcaZ(), trackD2Prong1.cYY(), trackD2Prong1.cZY(), trackD2Prong1.cZZ()); - - // repropagate tracks to this collision if needed - if (trackD2Prong0.collisionId() != thisCollId) { - trackParVarD2Prong0.propagateToDCA(primaryVertex, bz, &dca0D2); - } - - if (trackD2Prong0.collisionId() != thisCollId) { - trackParVarD2Prong1.propagateToDCA(primaryVertex, bz, &dca1D2); - } - - // reconstruct the 2-prong secondary vertex - hCandidatesD2->Fill(SVFitting::BeforeFit); - try { - if (dfD2.process(trackParVarD2Prong0, trackParVarD2Prong1) == 0) { - continue; - } - } catch (const std::runtime_error& error) { - LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN for second D0 cannot work, skipping the candidate."; - hCandidatesD2->Fill(SVFitting::Fail); - continue; - } - - hCandidatesD2->Fill(SVFitting::FitOk); - const auto& vertexD2 = dfD2.getPCACandidatePos(); - trackParVarD2Prong0.propagateTo(vertexD2[0], bz); - trackParVarD2Prong1.propagateTo(vertexD2[0], bz); - // Get pVec of tracks of D2 - std::array pVecD2Prong0 = {0}; - std::array pVecD2Prong1 = {0}; - dfD2.getTrack(0).getPxPyPzGlo(pVecD2Prong0); - dfD2.getTrack(1).getPxPyPzGlo(pVecD2Prong1); - // Get D2 momentum - std::array pVecD2 = RecoDecay::pVec(pVecD2Prong0, pVecD2Prong1); - - // build a D2 neutral track - auto trackD2 = o2::dataformats::V0(vertexD2, pVecD2, dfD2.calcPCACovMatrixFlat(), trackParVarD2Prong0, trackParVarD2Prong1); - for (const auto& trackId : trackIndices) { + auto trackPion = trackId.template track_as(); if (usePionIsGlobalTrackWoDCA && !trackPion.isGlobalTrackWoDCA()) { continue; @@ -443,45 +362,129 @@ struct HfTreeCreatorTccToD0D0Pi { continue; } - auto trackParCovPi = getTrackParCov(trackPion); - std::array pVecD1New = {0., 0., 0.}; - std::array pVecD2New = {0., 0., 0.}; - std::array pVecSoftPi = {0., 0., 0.}; + auto trackD1Prong0 = tracks.rawIteratorAt(candidateD1.prong0Id()); // positive daughter for D1 + auto trackD1Prong1 = tracks.rawIteratorAt(candidateD1.prong1Id()); // negative daughter for D1 + auto trackD2Prong0 = tracks.rawIteratorAt(candidateD2.prong0Id()); // positive daughter for D2 + auto trackD2Prong1 = tracks.rawIteratorAt(candidateD2.prong1Id()); // negative daughter for D2 + + std::array pVecD1Prong0{trackD1Prong0.pVector()}; + std::array pVecD1Prong1{trackD1Prong1.pVector()}; + std::array pVecD2Prong0{trackD2Prong0.pVector()}; + std::array pVecD2Prong1{trackD2Prong1.pVector()}; + std::array pVecSoftPi = {trackPion.pVector()}; + // Get D momentum + std::array pVecD1 = RecoDecay::pVec(pVecD1Prong0, pVecD1Prong1); + std::array pVecD2 = RecoDecay::pVec(pVecD2Prong0, pVecD2Prong1); + + float impactParameterYD1 = -999.f; + float impactParameterYD2 = -999.f; + float impactParameterYSoftPi = -999.f; + float chi2PCA = -999.f; + if (buildVertex) { + auto trackParVarD1Prong0 = getTrackParCov(trackD1Prong0); + auto trackParVarD1Prong1 = getTrackParCov(trackD1Prong1); + auto dca0D1 = o2::dataformats::DCA(trackD1Prong0.dcaXY(), trackD1Prong0.dcaZ(), trackD1Prong0.cYY(), trackD1Prong0.cZY(), trackD1Prong0.cZZ()); + auto dca1D1 = o2::dataformats::DCA(trackD1Prong1.dcaXY(), trackD1Prong1.dcaZ(), trackD1Prong1.cYY(), trackD1Prong1.cZY(), trackD1Prong1.cZZ()); + + // repropagate tracks to this collision if needed + if (trackD1Prong0.collisionId() != thisCollId) { + trackParVarD1Prong0.propagateToDCA(primaryVertex, bz, &dca0D1); + } - // find the DCA between the D01, D02 and the bachelor track, for Tcc - hCandidatesTcc->Fill(SVFitting::BeforeFit); - try { - if (dfTcc.process(trackD1, trackD2, trackParCovPi) == 0) { + if (trackD1Prong1.collisionId() != thisCollId) { + trackParVarD1Prong1.propagateToDCA(primaryVertex, bz, &dca1D1); + } + // reconstruct the 2-prong secondary vertex + hCandidatesD1->Fill(SVFitting::BeforeFit); + try { + if (dfD1.process(trackParVarD1Prong0, trackParVarD1Prong1) == 0) { + continue; + } + } catch (const std::runtime_error& error) { + LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN for first D0 cannot work, skipping the candidate."; + hCandidatesD1->Fill(SVFitting::Fail); continue; } - } catch (const std::runtime_error& error) { - LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN for Tcc cannot work, skipping the candidate."; - hCandidatesTcc->Fill(SVFitting::Fail); - continue; - } - hCandidatesTcc->Fill(SVFitting::FitOk); - - dfTcc.propagateTracksToVertex(); // propagate the softpi and D0 pair to the Tcc vertex - trackD1.getPxPyPzGlo(pVecD1New); // momentum of D1 at the Tcc vertex - trackD2.getPxPyPzGlo(pVecD2New); // momentum of D2 at the Tcc vertex - trackParCovPi.getPxPyPzGlo(pVecSoftPi); // momentum of pi at the Tcc vertex - - auto chi2PCA = dfTcc.getChi2AtPCACandidate(); - auto covMatrixPCA = dfTcc.calcPCACovMatrixFlat(); - hCovSVXX->Fill(covMatrixPCA[0]); - - // get track impact parameters - // This modifies track momenta! - auto covMatrixPV = primaryVertex.getCov(); - hCovPVXX->Fill(covMatrixPV[0]); - o2::dataformats::DCA impactParameterD1; - o2::dataformats::DCA impactParameterD2; - o2::dataformats::DCA impactParameterSoftPi; + hCandidatesD1->Fill(SVFitting::FitOk); + const auto& vertexD1 = dfD1.getPCACandidatePos(); + trackParVarD1Prong0.propagateTo(vertexD1[0], bz); + trackParVarD1Prong1.propagateTo(vertexD1[0], bz); + + // build a D1 neutral track + auto trackD1 = o2::dataformats::V0(vertexD1, pVecD1, dfD1.calcPCACovMatrixFlat(), trackParVarD1Prong0, trackParVarD1Prong1); + + auto trackParVarD2Prong0 = getTrackParCov(trackD2Prong0); + auto trackParVarD2Prong1 = getTrackParCov(trackD2Prong1); + auto dca0D2 = o2::dataformats::DCA(trackD2Prong0.dcaXY(), trackD2Prong0.dcaZ(), trackD2Prong0.cYY(), trackD2Prong0.cZY(), trackD2Prong0.cZZ()); + auto dca1D2 = o2::dataformats::DCA(trackD2Prong1.dcaXY(), trackD2Prong1.dcaZ(), trackD2Prong1.cYY(), trackD2Prong1.cZY(), trackD2Prong1.cZZ()); + + // repropagate tracks to this collision if needed + if (trackD2Prong0.collisionId() != thisCollId) { + trackParVarD2Prong0.propagateToDCA(primaryVertex, bz, &dca0D2); + } + if (trackD2Prong1.collisionId() != thisCollId) { + trackParVarD2Prong1.propagateToDCA(primaryVertex, bz, &dca1D2); + } - trackD1.propagateToDCA(primaryVertex, bz, &impactParameterD1); - trackD2.propagateToDCA(primaryVertex, bz, &impactParameterD2); - trackParCovPi.propagateToDCA(primaryVertex, bz, &impactParameterSoftPi); + // reconstruct the 2-prong secondary vertex + hCandidatesD2->Fill(SVFitting::BeforeFit); + try { + if (dfD2.process(trackParVarD2Prong0, trackParVarD2Prong1) == 0) { + continue; + } + } catch (const std::runtime_error& error) { + LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN for second D0 cannot work, skipping the candidate."; + hCandidatesD2->Fill(SVFitting::Fail); + continue; + } + hCandidatesD2->Fill(SVFitting::FitOk); + const auto& vertexD2 = dfD2.getPCACandidatePos(); + trackParVarD2Prong0.propagateTo(vertexD2[0], bz); + trackParVarD2Prong1.propagateTo(vertexD2[0], bz); + // build a D2 neutral track + auto trackD2 = o2::dataformats::V0(vertexD2, pVecD2, dfD2.calcPCACovMatrixFlat(), trackParVarD2Prong0, trackParVarD2Prong1); + + auto trackParCovPi = getTrackParCov(trackPion); + + // find the DCA between the D01, D02 and the bachelor track, for Tcc + hCandidatesTcc->Fill(SVFitting::BeforeFit); + try { + if (dfTcc.process(trackD1, trackD2, trackParCovPi) == 0) { + continue; + } + } catch (const std::runtime_error& error) { + LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN for Tcc cannot work, skipping the candidate."; + hCandidatesTcc->Fill(SVFitting::Fail); + continue; + } + hCandidatesTcc->Fill(SVFitting::FitOk); + + dfTcc.propagateTracksToVertex(); // propagate the softpi and D0 pair to the Tcc vertex + trackD1.getPxPyPzGlo(pVecD1); // momentum of D1 at the Tcc vertex + trackD2.getPxPyPzGlo(pVecD2); // momentum of D2 at the Tcc vertex + trackParCovPi.getPxPyPzGlo(pVecSoftPi); // momentum of pi at the Tcc vertex + + chi2PCA = dfTcc.getChi2AtPCACandidate(); + auto covMatrixPCA = dfTcc.calcPCACovMatrixFlat(); + hCovSVXX->Fill(covMatrixPCA[0]); + + // get track impact parameters + // This modifies track momenta! + auto covMatrixPV = primaryVertex.getCov(); + hCovPVXX->Fill(covMatrixPV[0]); + o2::dataformats::DCA impactParameterD1; + o2::dataformats::DCA impactParameterD2; + o2::dataformats::DCA impactParameterSoftPi; + + trackD1.propagateToDCA(primaryVertex, bz, &impactParameterD1); + trackD2.propagateToDCA(primaryVertex, bz, &impactParameterD2); + trackParCovPi.propagateToDCA(primaryVertex, bz, &impactParameterSoftPi); + + impactParameterYD1 = impactParameterD1.getY(); + impactParameterYD2 = impactParameterD2.getY(); + impactParameterYSoftPi = impactParameterSoftPi.getY(); + } // Retrieve properties of the two D0 candidates float yD1 = hfHelper.yD0(candidateD1); float yD2 = hfHelper.yD0(candidateD2); @@ -518,8 +521,6 @@ struct HfTreeCreatorTccToD0D0Pi { massD02 = hfHelper.invMassD0barToKPi(candidateD2); } - // LOG(info) << " candidateD1.collisionId() " << candidateD1.collisionId()<<" massD01 "< massD1Daus{MassPiPlus, MassKPlus}; std::array massD2Daus{MassPiPlus, MassKPlus}; @@ -535,15 +536,14 @@ struct HfTreeCreatorTccToD0D0Pi { auto massKpipi1 = RecoDecay::m(std::array{pVecD1Prong0, pVecD1Prong1, pVecSoftPi}, std::array{massD1Daus[0], massD1Daus[1], MassPiPlus}); auto massKpipi2 = RecoDecay::m(std::array{pVecD2Prong0, pVecD2Prong1, pVecSoftPi}, std::array{massD2Daus[0], massD2Daus[1], MassPiPlus}); + auto arrayMomentaDDpi = std::array{pVecD1, pVecD2, pVecSoftPi}; + const auto massD0D0Pi = RecoDecay::m(std::move(arrayMomentaDDpi), std::array{MassD0, MassD0, MassPiPlus}); + const auto deltaMassD0D0Pi = massD0D0Pi - (massD01 + massD02); + const auto massD0D0Pair = RecoDecay::m(std::array{pVecD1, pVecD2}, std::array{MassD0, MassD0}); deltaMassD01 = massKpipi1 - massD01; deltaMassD02 = massKpipi2 - massD02; - auto arrayMomentaDDpi = std::array{pVecD1New, pVecD2New, pVecSoftPi}; - const auto massD0D0Pi = RecoDecay::m(std::move(arrayMomentaDDpi), std::array{MassD0, MassD0, MassPiPlus}); - const auto deltaMassD0D0Pi = massD0D0Pi - (massD01 + massD02); - const auto massD0D0Pair = RecoDecay::m(std::array{pVecD1New, pVecD2New}, std::array{MassD0, MassD0}); - if (deltaMassD0D0Pi > deltaMassCanMax || massD0D0Pi > massCanMax) { continue; } @@ -588,9 +588,9 @@ struct HfTreeCreatorTccToD0D0Pi { trackPion.tofNSigmaPi(), mlScoresD1[0], mlScoresD2[0], - impactParameterD1.getY(), - impactParameterD2.getY(), - impactParameterSoftPi.getY(), + impactParameterYD1, + impactParameterYD2, + impactParameterYSoftPi, candidateD1.cpa(), candidateD2.cpa(), chi2PCA, From 66ba621871df0ff69bfe869005ee720b4947d16d Mon Sep 17 00:00:00 2001 From: omvazque Date: Sun, 18 May 2025 23:26:55 -0500 Subject: [PATCH 1317/1650] [PWGLF] Debugging: Use the version from 2025-05-06 (#11240) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 690 +++++++------------ 1 file changed, 265 insertions(+), 425 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index e06ec1c6c8f..36a08f4a72f 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -34,7 +34,6 @@ #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/TrackSelectionTables.h" -#include "Common/Core/TrackSelectionDefaults.h" #include "CommonConstants/MathConstants.h" #include "CommonConstants/ZDCConstants.h" #include "Framework/ASoAHelpers.h" // required for Filter op. @@ -66,11 +65,37 @@ using SimTracks = soa::Join isNoCollInTimeRangeStrict{"isNoCollInTimeRangeStrict", true, "use isNoCollInTimeRangeStrict?"}; + Configurable isNoCollInTimeRangeStandard{"isNoCollInTimeRangeStandard", false, "use isNoCollInTimeRangeStandard?"}; + Configurable isNoCollInRofStrict{"isNoCollInRofStrict", true, "use isNoCollInRofStrict?"}; + Configurable isNoCollInRofStandard{"isNoCollInRofStandard", false, "use isNoCollInRofStandard?"}; + Configurable isNoHighMultCollInPrevRof{"isNoHighMultCollInPrevRof", true, "use isNoHighMultCollInPrevRof?"}; + Configurable isNoCollInTimeRangeNarrow{"isNoCollInTimeRangeNarrow", false, "use isNoCollInTimeRangeNarrow?"}; + Configurable isOccupancyCut{"isOccupancyCut", true, "Occupancy cut?"}; + Configurable isApplyFT0CbasedOccupancy{"isApplyFT0CbasedOccupancy", false, "T0C Occu cut"}; + Configurable isTDCcut{"isTDCcut", false, "Use TDC cut"}; + Configurable isZEMcut{"isZEMcut", true, "Use ZEM cut"}; + Configurable useMidRapNchSel{"useMidRapNchSel", true, "Use mid-rapidit Nch selection"}; + Configurable applyEff{"applyEff", true, "Apply track-by-track efficiency correction"}; + // Event selection Configurable posZcut{"posZcut", +10.0, "z-vertex position cut"}; Configurable minT0CcentCut{"minT0CcentCut", 0.0, "Min T0C Cent. cut"}; Configurable maxT0CcentCut{"maxT0CcentCut", 90.0, "Max T0C Cent. cut"}; + Configurable nSigmaNchCut{"nSigmaNchCut", 1., "nSigma Nch selection"}; + Configurable zemCut{"zemCut", 1000., "ZEM cut"}; + Configurable tdcCut{"tdcCut", 1., "TDC cut"}; + Configurable minOccCut{"minOccCut", 0., "min Occu cut"}; + Configurable maxOccCut{"maxOccCut", 500., "max Occu cut"}; + Configurable minNchSel{"minNchSel", 5., "min Nch Selection"}; + Configurable evtFracMCcl{"evtFracMCcl", 0.5, "fraction of events for MC closure"}; + // Track-kinematics selection Configurable minPt{"minPt", 0.1, "minimum pt of the tracks"}; Configurable maxPt{"maxPt", 50., "maximum pt of the tracks"}; Configurable minEta{"minEta", -0.8, "minimum eta"}; @@ -84,8 +109,8 @@ struct UccZdc { Configurable nBinsNch{"nBinsNch", 2501, "N bins Nch (|eta|<0.8)"}; Configurable minNch{"minNch", 0, "Min Nch (|eta|<0.8)"}; Configurable maxNch{"maxNch", 2500, "Max Nch (|eta|<0.8)"}; - Configurable nBinsZDC{"nBinsZDC", 400, "nBinsZDC"}; - Configurable nBinsZEM{"nBinsZEM", 100, "nBinsZEM"}; + Configurable nBinsZDC{"nBinsZDC", 400, "N bins ZDC"}; + Configurable minZN{"minZN", 0, "Min ZN signal"}; Configurable maxZN{"maxZN", 150, "Max ZN signal"}; Configurable maxZP{"maxZP", 60, "Max ZP signal"}; Configurable maxZEM{"maxZEM", 2200, "Max ZEM signal"}; @@ -95,39 +120,10 @@ struct UccZdc { ConfigurableAxis binsPt{"binsPt", {VARIABLE_WIDTH, 0.0, 0.1, 0.12}, "pT binning"}; ConfigurableAxis binsCent{"binsCent", {VARIABLE_WIDTH, 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.}, "T0C binning"}; - // Configurables Event Selection - Configurable useTimeStamps{"useTimeStamps", true, "Use time stamps for CCDB object calls"}; - Configurable isNoCollInTimeRangeStrict{"isNoCollInTimeRangeStrict", true, "isNoCollInTimeRangeStrict?"}; - Configurable isNoCollInTimeRangeStandard{"isNoCollInTimeRangeStandard", false, "isNoCollInTimeRangeStandard?"}; - Configurable isNoCollInRofStrict{"isNoCollInRofStrict", true, "isNoCollInRofStrict?"}; - Configurable isNoCollInRofStandard{"isNoCollInRofStandard", false, "isNoCollInRofStandard?"}; - Configurable isNoHighMultCollInPrevRof{"isNoHighMultCollInPrevRof", true, "isNoHighMultCollInPrevRof?"}; - Configurable isNoCollInTimeRangeNarrow{"isNoCollInTimeRangeNarrow", false, "isNoCollInTimeRangeNarrow?"}; - Configurable isOccupancyCut{"isOccupancyCut", true, "Occupancy cut?"}; - Configurable isApplyFT0CbasedOccupancy{"isApplyFT0CbasedOccupancy", false, "T0C Occu cut?"}; - Configurable isTDCcut{"isTDCcut", false, "Use TDC cut?"}; - Configurable isZEMcut{"isZEMcut", true, "Use ZEM cut?"}; - - Configurable nSigmaNchCut{"nSigmaNchCut", 1., "nSigma Nch selection"}; - Configurable minNchSel{"minNchSel", 5., "min Nch Selection"}; - // Configurable znBasedCut{"znBasedCut", 100, "ZN-based cut"}; - Configurable zemCut{"zemCut", 1000., "ZEM cut"}; - Configurable tdcCut{"tdcCut", 1., "TDC cut"}; - Configurable minOccCut{"minOccCut", 0, "min Occu cut"}; - Configurable maxOccCut{"maxOccCut", 500, "max Occu cut"}; - // Configurable minITSnCls{"minITSnCls", 5, "min ITSnCls"}; - - Configurable itsRequirement{"itsRequirement", TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSall7Layers, "0: Global Tracks, 2: Hits in the 7 ITS layers"}; - Configurable requireITS{"requireITS", true, "Additional cut on the ITS requirement"}; - Configurable requireTPC{"requireTPC", true, "Additional cut on the TPC requirement"}; - Configurable requireGoldenChi2{"requireGoldenChi2", false, "Additional cut on the GoldenChi2"}; - Configurable minNCrossedRowsTPC{"minNCrossedRowsTPC", 70.f, "Additional cut on the minimum number of crossed rows in the TPC"}; - Configurable minNCrossedRowsOverFindableClustersTPC{"minNCrossedRowsOverFindableClustersTPC", 0.8f, "Additional cut on the minimum value of the ratio between crossed rows and findable clusters in the TPC"}; - Configurable maxChi2PerClusterTPC{"maxChi2PerClusterTPC", 4.f, "Additional cut on the maximum value of the chi2 per cluster in the TPC"}; - // Configurable minChi2PerClusterTPC{"minChi2PerClusterTPC", 0.5f, "Additional cut on the minimum value of the chi2 per cluster in the TPC"}; - Configurable maxChi2PerClusterITS{"maxChi2PerClusterITS", 36.f, "Additional cut on the maximum value of the chi2 per cluster in the ITS"}; - Configurable maxDcaZ{"maxDcaZ", 2.f, "Additional cut on the maximum value of the DCA z"}; - // Configurable minTPCNClsFound{"minTPCNClsFound", 100.f, "Additional cut on the minimum value of the number of found clusters in the TPC"}; + // CCDB paths + Configurable paTH{"paTH", "Users/o/omvazque/TrackingEfficiency", "base path to the ccdb object"}; + Configurable paTHmeanNch{"paTHmeanNch", "Users/o/omvazque/FitMeanNch_9May2025", "base path to the ccdb object"}; + Configurable paTHsigmaNch{"paTHsigmaNch", "Users/o/omvazque/FitSigmaNch_9May2025", "base path to the ccdb object"}; enum EvCutLabel { All = 1, @@ -149,25 +145,16 @@ struct UccZdc { Zem }; - static constexpr float zEro{0.}; - static constexpr float oneHalf{0.5}; - - // Filters + // Filter trackFilter = ((aod::track::eta > minEta) && (aod::track::eta < maxEta) && (aod::track::pt > minPt) && (aod::track::pt < maxPt) && requireGlobalTrackInFilter()); Filter trackFilter = ((aod::track::eta > minEta) && (aod::track::eta < maxEta) && (aod::track::pt > minPt) && (aod::track::pt < maxPt)); + // Apply Filters using TheFilteredTracks = soa::Filtered; using TheFilteredSimTracks = soa::Filtered; - // Additional filters for tracks - TrackSelection myTrackSel; - // Histograms: Data HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; - Service ccdb; - Configurable paTH{"paTH", "Users/o/omvazque/TrackingEfficiency", "base path to the ccdb object"}; - Configurable paTHmeanNch{"paTHmeanNch", "Users/o/omvazque/FitMeanNch_9May2025", "base path to the ccdb object"}; - Configurable paTHsigmaNch{"paTHsigmaNch", "Users/o/omvazque/FitSigmaNch_9May2025", "base path to the ccdb object"}; void init(InitContext const&) { @@ -182,7 +169,19 @@ struct UccZdc { const AxisSpec axisEneCh{300, 0., 300., "Energy of non-zero channels"}; registry.add("zPos", ";;Entries;", kTH1F, {axisZpos}); + registry.add("T0Ccent", ";;Entries", kTH1F, {axisCent}); + registry.add("NchUncorrected", ";#it{N}_{ch} (|#eta| < 0.8);Entries;", kTH1F, {{300, 0., 3000.}}); registry.add("hEventCounter", ";;Events", kTH1F, {axisEvent}); + registry.add("ZNamp", ";ZNA+ZNC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); + registry.add("ExcludedEvtVsFT0M", ";T0A+T0C (#times 1/100, -3.3 < #eta < -2.1 and 3.5 < #eta < 4.9);Entries;", kTH1F, {{nBinsAmpFT0, 0., 3000.}}); + registry.add("ExcludedEvtVsNch", ";#it{N}_{ch} (|#eta|<0.8);Entries;", kTH1F, {{300, 0, 3000}}); + registry.add("Nch", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);", kTH1F, {{nBinsNch, minNch, maxNch}}); + registry.add("NchVsOneParCorr", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);#LT[#it{p}_{T}^{(1)}]#GT (GeV/#it{c})", kTProfile, {{nBinsNch, minNch, maxNch}}); + registry.add("EtaVsPhi", ";#eta;#varphi", kTH2F, {{{axisEta}, {100, -0.1 * PI, +2.1 * PI}}}); + registry.add("ZposVsEta", "", kTProfile, {axisZpos}); + registry.add("sigma1Pt", ";;#sigma(p_{T})/p_{T};", kTProfile, {axisPt}); + registry.add("dcaXYvspT", ";DCA_{xy} (cm);;", kTH2F, {{{50, -1., 1.}, {axisPt}}}); + auto hstat = registry.get(HIST("hEventCounter")); auto* x = hstat->GetXaxis(); x->SetBinLabel(1, "All"); @@ -203,79 +202,33 @@ struct UccZdc { x->SetBinLabel(16, "Within TDC cut?"); x->SetBinLabel(17, "Within ZEM cut?"); - LOG(info) << "\tuseTimeStamps=" << useTimeStamps.value; - LOG(info) << "\titsRequirement=" << itsRequirement.value; - LOG(info) << "\trequireITS=" << requireITS.value; - LOG(info) << "\trequireTPC=" << requireTPC.value; - LOG(info) << "\trequireGoldenChi2=" << requireGoldenChi2.value; - LOG(info) << "\tmaxChi2PerClusterTPC=" << maxChi2PerClusterTPC.value; - LOG(info) << "\tminNCrossedRowsTPC=" << minNCrossedRowsTPC.value; - LOG(info) << "\tminNCrossedRowsOverFindableClustersTPC=" << minNCrossedRowsOverFindableClustersTPC.value; - LOG(info) << "\tmaxChi2PerClusterITS=" << maxChi2PerClusterITS.value; - LOG(info) << "\tminPt=" << minPt.value; - LOG(info) << "\tmaxPt=" << maxPt.value; - LOG(info) << "\tminEta=" << minEta.value; - LOG(info) << "\tmaxEta=" << maxEta.value; - - myTrackSel = getGlobalTrackSelectionRun3ITSMatch(itsRequirement, TrackSelection::GlobalTrackRun3DCAxyCut::Default); - myTrackSel.SetMinNCrossedRowsTPC(minNCrossedRowsTPC.value); - myTrackSel.SetMinNCrossedRowsOverFindableClustersTPC(minNCrossedRowsOverFindableClustersTPC.value); - myTrackSel.SetMaxChi2PerClusterTPC(maxChi2PerClusterTPC.value); - myTrackSel.SetMaxChi2PerClusterITS(maxChi2PerClusterITS.value); - myTrackSel.SetRequireITSRefit(requireITS.value); - myTrackSel.SetRequireTPCRefit(requireTPC.value); - myTrackSel.SetMaxDcaZ(maxDcaZ.value); - myTrackSel.SetRequireGoldenChi2(requireGoldenChi2.value); - myTrackSel.SetMaxDcaXYPtDep([](float /*pt*/) { return 10000.f; }); // No DCAxy cut will be used, this is done via the member function of the task - myTrackSel.SetPtRange(minPt, maxPt); - myTrackSel.SetEtaRange(minEta, maxEta); - LOGF(info, "----- Custom Track selection -----"); - myTrackSel.print(); - - // Histograms: paritcle-level info if (doprocessZdcCollAss) { - registry.add("T0Ccent", ";;Entries", kTH1F, {axisCent}); - registry.add("ZposVsEta", "", kTProfile, {axisZpos}); - registry.add("ZN", ";ZNA+ZNC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); - registry.add("EtaVsPhi", ";#eta;#varphi", kTH2F, {{{axisEta}, {100, -0.1 * PI, +2.1 * PI}}}); - registry.add("dcaXYvspT", ";DCA_{xy} (cm);;", kTH2F, {{{50, -1., 1.}, {axisPt}}}); - - registry.add("Nch", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);", kTH1F, {{nBinsNch, minNch, maxNch}}); registry.add("NchVsPt", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);;", kTH2F, {{{nBinsNch, minNch, maxNch}, {axisPt}}}); - registry.add("NchVsOneParCorr", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);#LT[#it{p}_{T}^{(1)}]#GT (GeV/#it{c})", kTProfile, {{nBinsNch, minNch, maxNch}}); registry.add("NchVsOneParCorrVsZN", ";#it{N}_{ch} (|#eta| < 0.8, Corrected); ZNA+ZNC; #LT[#it{p}_{T}^{(1)}]#GT", kTProfile2D, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, -0.5, maxZN}}}); registry.add("NchVsTwoParCorrVsZN", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);ZNA+ZNC;#LT[#it{p}_{T}^{(2)}]#GT", kTProfile2D, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, -0.5, maxZN}}}); registry.add("NchVsThreeParCorrVsZN", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);ZNA+ZNC;#LT[#it{p}_{T}^{(3)}]#GT", kTProfile2D, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, -0.5, maxZN}}}); registry.add("NchVsFourParCorrVsZN", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);ZNA+ZNC;#LT[#it{p}_{T}^{(4)}]#GT", kTProfile2D, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, -0.5, maxZN}}}); - - registry.add("RejectedEvtsVsFT0M", ";T0A+T0C (#times 1/100, -3.3 < #eta < -2.1 and 3.5 < #eta < 4.9);Entries;", kTH1F, {{nBinsAmpFT0, 0., 3000.}}); - registry.add("RejectedEvtsVsNch", ";#it{N}_{ch} (|#eta|<0.8);Entries;", kTH1F, {{300, 0, 3000}}); } - // MC Histograms if (doprocessMCclosure) { - registry.add("RandomNumber", "", kTH1F, {{100, 0., 1.}}); + registry.add("RandomNumber", "", kTH1F, {{50, 0., 1.}}); registry.add("EvtsDivided", ";Event type;Entries;", kTH1F, {{2, -0.5, 1.5}}); auto hEvtsDiv = registry.get(HIST("EvtsDivided")); auto* xEvtsDiv = hEvtsDiv->GetXaxis(); xEvtsDiv->SetBinLabel(1, "MC closure"); xEvtsDiv->SetBinLabel(2, "Corrections"); - + // MC closure registry.add("NchGen", "MC closure;#it{N}_{ch} (|#eta| < 0.8);Entries;", kTH1F, {{nBinsNch, minNch, maxNch}}); registry.add("NchvsOneParCorrGen", "MC closure;#it{N}_{ch} (|#eta| < 0.8);#LT[#it{p}_{T}^{(1)}]#GT (GeV/#it{c})", kTProfile, {{nBinsNch, minNch, maxNch}}); registry.add("NchvsTwoParCorrGen", "MC closure;#it{N}_{ch} (|#eta| < 0.8);#LT[#it{p}_{T}^{(2)}]#GT", kTProfile, {{nBinsNch, minNch, maxNch}}); registry.add("NchvsThreeParCorrGen", "MC closure;#it{N}_{ch} (|#eta| < 0.8);#LT[#it{p}_{T}^{(3)}]#GT", kTProfile, {{nBinsNch, minNch, maxNch}}); registry.add("NchvsFourParCorrGen", "MC closure;#it{N}_{ch} (|#eta| < 0.8);#LT[#it{p}_{T}^{(4)}]#GT", kTProfile, {{nBinsNch, minNch, maxNch}}); - - registry.add("T0Ccent", "Filled at MC closure + Corrections;;Entries", kTH1F, {axisCent}); - registry.add("NchRaw", "MC closure;#it{N}_{ch} (|#eta| < 0.8);Entries;", kTH1F, {{nBinsNch, minNch, maxNch}}); - registry.add("Nch", "MC closure;#it{N}_{ch} (|#eta| < 0.8, Corrected);Entries;", kTH1F, {{nBinsNch, minNch, maxNch}}); - registry.add("NchVsOneParCorr", "MC closure;#it{N}_{ch} (|#eta| < 0.8, Corrected);#LT[#it{p}_{T}^{(1)}]#GT (GeV/#it{c})", kTProfile, {{nBinsNch, minNch, maxNch}}); registry.add("NchVsTwoParCorr", "MC closure;#it{N}_{ch} (|#eta| < 0.8, Corrected);#LT[#it{p}_{T}^{(2)}]#GT", kTProfile, {{nBinsNch, minNch, maxNch}}); registry.add("NchVsThreeParCorr", "MC closure;#it{N}_{ch} (|#eta| < 0.8, Corrected);#LT[#it{p}_{T}^{(3)}]#GT", kTProfile, {{nBinsNch, minNch, maxNch}}); registry.add("NchVsFourParCorr", "MC closure;#it{N}_{ch} (|#eta| < 0.8, Corrected);#LT[#it{p}_{T}^{(4)}]#GT", kTProfile, {{nBinsNch, minNch, maxNch}}); - // Corrections + registry.add("zPosMC", "Filled at MC closure + Corrections;;Entries;", kTH1F, {axisZpos}); + registry.add("hEventCounterMC", "Event counter", kTH1F, {axisEvent}); registry.add("nRecColvsCent", "", kTH2F, {{6, -0.5, 5.5}, {{axisCent}}}); registry.add("Pt_all_ch", "Corrections;;;", kTH2F, {{axisCent}, {axisPt}}); registry.add("Pt_ch", "Corrections;;;", kTH2F, {{axisCent}, {axisPt}}); @@ -285,9 +238,6 @@ struct UccZdc { registry.add("Pt_sigpos", "Corrections;;;", kTH2F, {{axisCent}, {axisPt}}); registry.add("Pt_signeg", "Corrections;;;", kTH2F, {{axisCent}, {axisPt}}); registry.add("Pt_re", "Corrections;;;", kTH2F, {{axisCent}, {axisPt}}); - registry.add("EtaVsPhi", "Corrections;;#varphi;", kTH2F, {{{axisEta}, {100, -0.1 * PI, +2.1 * PI}}}); - registry.add("hEventCounterMC", "Event counter", kTH1F, {axisEvent}); - registry.add("zPosMC", "Filled at MC closure + Corrections;;Entries;", kTH1F, {axisZpos}); registry.add("PtMC_ch", "Corrections;;;", kTH2F, {{axisCent}, {axisPt}}); registry.add("PtMC_pi", "Corrections;;;", kTH2F, {{axisCent}, {axisPt}}); registry.add("PtMC_ka", "Corrections;;;", kTH2F, {{axisCent}, {axisPt}}); @@ -303,51 +253,29 @@ struct UccZdc { } if (doprocessQA) { - registry.add("T0Ccent", ";;Entries", kTH1F, {axisCent}); - registry.add("EtaVsPhi", ";#eta;#varphi", kTH2F, {{{axisEta}, {100, -0.1 * PI, +2.1 * PI}}}); - registry.add("dcaXYvspTOpen", ";DCA_{xy} (cm);;", kTH2F, {{{150, -3., 3.}, {axisPt}}}); - registry.add("dcaXYvspT", ";DCA_{xy} (cm);;", kTH2F, {{{150, -3., 3.}, {axisPt}}}); - registry.add("nClustersITS", ";;;", kTProfile, {{axisPt}}); - registry.add("nClustersTPC", ";;;", kTProfile, {{axisPt}}); - + registry.add("Debunch", ";t_{ZDC}-t_{ZDA};t_{ZDC}+t_{ZDA}", kTH2F, {{{nBinsTDC, minTdc, maxTdc}, {nBinsTDC, minTdc, maxTdc}}}); + registry.add("NchVsFT0M", ";T0A+T0C (#times 1/100, -3.3 < #eta < -2.1 and 3.5 < #eta < 4.9);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFT0, 0., 3000.}, {nBinsNch, minNch, maxNch}}}); + registry.add("NchVsFT0A", ";T0A (#times 1/100, 3.5 < #eta < 4.9);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsNch, minNch, maxNch}}}); + registry.add("NchVsFT0C", ";T0C (#times 1/100, -3.3 < #eta < -2.1);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFT0, 0., 950.}, {nBinsNch, minNch, maxNch}}}); + registry.add("NchVsFV0A", ";V0A (#times 1/100, 2.2 < #eta < 5);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFV0, 0., maxAmpFV0}, {nBinsNch, minNch, maxNch}}}); + registry.add("NchVsEt", ";#it{E}_{T} (|#eta|<0.8);#LTITS+TPC tracks#GT (|#eta|<0.8);", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsNch, minNch, maxNch}}}); + registry.add("NchVsNPV", ";#it{N}_{PV} (|#eta|<1);ITS+TPC tracks (|#eta|<0.8);", kTH2F, {{{300, -0.5, 5999.5}, {nBinsNch, minNch, maxNch}}}); + registry.add("NchVsITStracks", ";ITS tracks nCls >= 5;TITS+TPC tracks (|#eta|<0.8);", kTH2F, {{{300, -0.5, 5999.5}, {nBinsNch, minNch, maxNch}}}); registry.add("ZNVsFT0A", ";T0A (#times 1/100);ZNA+ZNC;", kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsZDC, -0.5, maxZN}}}); registry.add("ZNVsFT0C", ";T0C (#times 1/100);ZNA+ZNC;", kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsZDC, -0.5, maxZN}}}); registry.add("ZNVsFT0M", ";T0A+T0C (#times 1/100);ZNA+ZNC;", kTH2F, {{{nBinsAmpFT0, 0., 3000.}, {nBinsZDC, -0.5, maxZN}}}); - - registry.add("ZN", ";ZNA+ZNC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); - registry.add("ZNA", ";ZNA;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); - registry.add("ZPA", ";ZPA;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZP}}); - registry.add("ZNC", ";ZNC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); - registry.add("ZPC", ";ZPC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZP}}); + registry.add("ZNAamp", ";ZNA;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); + registry.add("ZPAamp", ";ZPA;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZP}}); + registry.add("ZNCamp", ";ZNC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); + registry.add("ZPCamp", ";ZPC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZP}}); registry.add("ZNAVsZNC", ";ZNC;ZNA", kTH2F, {{{30, -0.5, maxZN}, {30, -0.5, maxZN}}}); registry.add("ZPAVsZPC", ";ZPC;ZPA;", kTH2F, {{{100, -0.5, maxZP}, {100, -0.5, maxZP}}}); registry.add("ZNAVsZPA", ";ZPA;ZNA;", kTH2F, {{{20, -0.5, maxZP}, {30, -0.5, maxZN}}}); registry.add("ZNCVsZPC", ";ZPC;ZNC;", kTH2F, {{{20, -0.5, maxZP}, {30, -0.5, maxZN}}}); registry.add("ZNVsZEM", ";ZEM;ZNA+ZNC;", kTH2F, {{{60, -0.5, maxZEM}, {60, -0.5, maxZN}}}); - registry.add("ZNCVstdc", ";t_{ZNC};ZNC;", kTH2F, {{{30, -15., 15.}, {nBinsZDC, -0.5, maxZN}}}); - registry.add("ZNAVstdc", ";t_{ZNA};ZNA;", kTH2F, {{{30, -15., 15.}, {30, -0.5, maxZN}}}); - registry.add("ZPCVstdc", ";t_{ZPC};ZPC;", kTH2F, {{{30, -15., 15}, {20, -0.5, maxZP}}}); - registry.add("ZPAVstdc", ";t_{ZPA};ZPA;", kTH2F, {{{30, -15., 15.}, {20, -0.5, maxZP}}}); - registry.add("ZEM1Vstdc", ";t_{ZEM1};ZEM1;", kTH2F, {{{30, -15., 15.}, {30, -0.5, 2000.5}}}); - registry.add("ZEM2Vstdc", ";t_{ZEM2};ZEM2;", kTH2F, {{{30, -15., 15.}, {30, -0.5, 2000.5}}}); - registry.add("debunch", ";t_{ZDC}-t_{ZDA};t_{ZDC}+t_{ZDA}", kTH2F, {{{nBinsTDC, minTdc, maxTdc}, {nBinsTDC, minTdc, maxTdc}}}); - - registry.add("RejectedEvtsVsFT0M", ";T0A+T0C (#times 1/100, -3.3 < #eta < -2.1 and 3.5 < #eta < 4.9);Entries;", kTH1F, {{nBinsAmpFT0, 0., 3000.}}); - registry.add("RejectedEvtsVsNch", ";#it{N}_{ch} (|#eta|<0.8);Entries;", kTH1F, {{nBinsNch, minNch, maxNch}}); - - registry.add("NchVsFT0C", ";T0C (#times 1/100, -3.3 < #eta < -2.1);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFT0, 0., 950.}, {nBinsNch, minNch, maxNch}}}); - registry.add("NchVsFT0M", ";T0A+T0C (#times 1/100, -3.3 < #eta < -2.1 and 3.5 < #eta < 4.9);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFT0, 0., 3000.}, {nBinsNch, minNch, maxNch}}}); - registry.add("NchVsFT0A", ";T0A (#times 1/100, 3.5 < #eta < 4.9);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsNch, minNch, maxNch}}}); - registry.add("NchVsFV0A", ";V0A (#times 1/100, 2.2 < #eta < 5);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFV0, 0., maxAmpFV0}, {nBinsNch, minNch, maxNch}}}); - - registry.add("Nch", ";#it{N}_{ch} (|#eta|<0.8);", kTH1F, {{nBinsNch, minNch, maxNch}}); - registry.add("NchVsEt", ";#it{E}_{T} (|#eta|<0.8);#LTITS+TPC tracks#GT (|#eta|<0.8);", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsNch, minNch, maxNch}}}); - registry.add("NchVsMeanPt", ";#it{N}_{ch} (|#eta|<0.8);#LT[#it{p}_{T}]#GT (|#eta|<0.8);", kTProfile, {{nBinsNch, minNch, maxNch}}); - registry.add("NchVsNPV", ";#it{N}_{PV} (|#eta|<1);ITS+TPC tracks (|#eta|<0.8);", kTH2F, {{{300, -0.5, 5999.5}, {nBinsNch, minNch, maxNch}}}); - registry.add("NchVsITStracks", ";ITS tracks nCls >= 5;TITS+TPC tracks (|#eta|<0.8);", kTH2F, {{{300, -0.5, 5999.5}, {nBinsNch, minNch, maxNch}}}); - registry.add("ZNCVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNC;", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, minNch, maxZN}}}); - registry.add("ZNAVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA;", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, minNch, maxZN}}}); - registry.add("ZNVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA+ZNC;", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, minNch, maxZN}}}); + registry.add("ZNCVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNC;", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, minZN, maxZN}}}); + registry.add("ZNAVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA;", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, minZN, maxZN}}}); + registry.add("ZNVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA+ZNC;", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, minZN, maxZN}}}); registry.add("ZNDifVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA-ZNC;", kTH2F, {{{nBinsNch, minNch, maxNch}, {100, -50., 50.}}}); } @@ -355,8 +283,11 @@ struct UccZdc { // Enabling object caching, otherwise each call goes to the CCDB server ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); - ccdb->setCreatedNotAfter(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); ccdb->setFatalWhenNull(false); + // Not later than now, will be replaced by the value of the train creation + // This avoids that users can replace objects **while** a train is running + int64_t now = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); + ccdb->setCreatedNotAfter(now); } template @@ -445,8 +376,9 @@ struct UccZdc { void processQA(o2::aod::ColEvSels::iterator const& collision, o2::aod::BCsRun3 const& /**/, aod::Zdcs const& /**/, aod::FV0As const& /**/, aod::FT0s const& /**/, TheFilteredTracks const& tracks) { - const double ePerNucleon{2.68}; + // LOG(info) << " Collisions size: " << collisions.size() << " Table's size: " << collisions.tableSize() << "\n"; const auto& foundBC = collision.foundBC_as(); + // LOG(info) << "Run number: " << foundBC.runNumber() << "\n"; if (!isEventSelected(collision)) { return; } @@ -469,8 +401,6 @@ struct UccZdc { } else { return; } - const double normT0M{(aT0A + aT0C) / 100.}; - registry.fill(HIST("hEventCounter"), EvCutLabel::TZero); if (foundBC.has_fv0a()) { @@ -481,12 +411,25 @@ struct UccZdc { aV0A = -999.; } + const double normT0M{(aT0A + aT0C) / 100.}; + float znA{zdc.amplitudeZNA()}; + float znC{zdc.amplitudeZNC()}; + float zpA{zdc.amplitudeZPA()}; + float zpC{zdc.amplitudeZPC()}; + float aZEM1{zdc.amplitudeZEM1()}; + float aZEM2{zdc.amplitudeZEM2()}; float tZNA{zdc.timeZNA()}; float tZNC{zdc.timeZNC()}; float tZPA{zdc.timeZPA()}; float tZPC{zdc.timeZPC()}; float tZDCdif{tZNC + tZPC - tZNA - tZPA}; float tZDCsum{tZNC + tZPC + tZNA + tZPA}; + znA /= collEnergy; + znC /= collEnergy; + zpA /= collEnergy; + zpC /= collEnergy; + float sumZNs{znA + znC}; + float sumZEMs{aZEM1 + aZEM2}; // TDC cut if (isTDCcut) { @@ -496,10 +439,6 @@ struct UccZdc { registry.fill(HIST("hEventCounter"), EvCutLabel::Tdc); } - float aZEM1{zdc.amplitudeZEM1()}; - float aZEM2{zdc.amplitudeZEM2()}; - float sumZEMs{aZEM1 + aZEM2}; - // ZEM cut if (isZEMcut) { if (sumZEMs < zemCut) { @@ -508,81 +447,65 @@ struct UccZdc { registry.fill(HIST("hEventCounter"), EvCutLabel::Zem); } - // Load Mean Nch and Sigma Nch from CCDB - auto fMeanNch = ccdb->getForRun(paTHmeanNch.value, foundBC.runNumber()); - auto fSigmaNch = ccdb->getForRun(paTHsigmaNch.value, foundBC.runNumber()); - if (!fMeanNch) { - LOGF(fatal, "Could not load fMeanNch from %s", paTHmeanNch.value.c_str()); - return; - } - if (!fSigmaNch) { - LOGF(fatal, "Could not load fSigmaNch from %s", paTHsigmaNch.value.c_str()); - return; - } - - float znA{zdc.amplitudeZNA()}; - float znC{zdc.amplitudeZNC()}; - float zpA{zdc.amplitudeZPA()}; - float zpC{zdc.amplitudeZPC()}; - znA /= ePerNucleon; - znC /= ePerNucleon; - zpA /= ePerNucleon; - zpC /= ePerNucleon; - - float tZEM1{zdc.timeZEM1()}; - float tZEM2{zdc.timeZEM2()}; - float sumZNs{znA + znC}; - int itsTracks = 0, glbTracks = 0; - float et = 0., meanpt = 0.; for (const auto& track : tracks) { if (track.hasITS()) { itsTracks++; } // Track Selection - if (myTrackSel.IsSelected(track)) { - if (passesDCAxyCut(track)) { - glbTracks++; - meanpt += track.pt(); - et += std::sqrt(std::pow(track.pt(), 2.) + std::pow(o2::constants::physics::MassPionCharged, 2.)); - registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); - registry.fill(HIST("dcaXYvspT"), track.dcaXY(), track.pt()); - registry.fill(HIST("nClustersITS"), track.pt(), track.itsNCls()); - registry.fill(HIST("nClustersTPC"), track.pt(), track.tpcNClsFound()); - } - registry.fill(HIST("dcaXYvspTOpen"), track.dcaXY(), track.pt()); + if (!track.isGlobalTrack()) { + continue; } + glbTracks++; } - const double meanNch{fMeanNch->Eval(normT0M)}; - const double sigmaNch{fSigmaNch->Eval(normT0M)}; - const double nSigmaSelection{nSigmaNchCut * sigmaNch}; - const double diffMeanNch{meanNch - glbTracks}; - if (!(std::abs(diffMeanNch) < nSigmaSelection)) { - registry.fill(HIST("RejectedEvtsVsFT0M"), normT0M); - registry.fill(HIST("RejectedEvtsVsNch"), glbTracks); - return; + // Nch-based selection + if (useMidRapNchSel) { + auto fMeanNch = ccdb->getForRun(paTHmeanNch.value, foundBC.runNumber()); + auto fSigmaNch = ccdb->getForRun(paTHsigmaNch.value, foundBC.runNumber()); + if (!fMeanNch || !fSigmaNch) { + return; + } + + const double meanNch{fMeanNch->Eval(normT0M)}; + const double sigmaNch{fSigmaNch->Eval(normT0M)}; + const double nSigmaSelection{nSigmaNchCut * sigmaNch}; + const double diffMeanNch{meanNch - glbTracks}; + if (!(std::abs(diffMeanNch) < nSigmaSelection)) { + registry.fill(HIST("ExcludedEvtVsFT0M"), normT0M); + registry.fill(HIST("ExcludedEvtVsNch"), glbTracks); + return; + } + } + + float et = 0., meanpt = 0.; + for (const auto& track : tracks) { + // Track Selection + if (!track.isGlobalTrack()) { + continue; + } + + registry.fill(HIST("ZposVsEta"), collision.posZ(), track.eta()); + registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); + registry.fill(HIST("sigma1Pt"), track.pt(), track.sigma1Pt()); + registry.fill(HIST("dcaXYvspT"), track.dcaXY(), track.pt()); + et += std::sqrt(std::pow(track.pt(), 2.) + std::pow(o2::constants::physics::MassPionCharged, 2.)); + meanpt += track.pt(); } registry.fill(HIST("zPos"), collision.posZ()); registry.fill(HIST("T0Ccent"), collision.centFT0C()); - registry.fill(HIST("ZNA"), znA); - registry.fill(HIST("ZNC"), znC); - registry.fill(HIST("ZPA"), zpA); - registry.fill(HIST("ZPC"), zpC); - registry.fill(HIST("ZN"), znA + znC); + registry.fill(HIST("ZNAamp"), znA); + registry.fill(HIST("ZNCamp"), znC); + registry.fill(HIST("ZPAamp"), zpA); + registry.fill(HIST("ZPCamp"), zpC); + registry.fill(HIST("ZNamp"), sumZNs); registry.fill(HIST("ZNAVsZNC"), znC, znA); registry.fill(HIST("ZNAVsZPA"), zpA, znA); registry.fill(HIST("ZNCVsZPC"), zpC, znC); registry.fill(HIST("ZPAVsZPC"), zpC, zpA); registry.fill(HIST("ZNVsZEM"), sumZEMs, sumZNs); - registry.fill(HIST("ZNCVstdc"), tZNC, znC); - registry.fill(HIST("ZNAVstdc"), tZNA, znA); - registry.fill(HIST("ZPCVstdc"), tZPC, zpC); - registry.fill(HIST("ZPAVstdc"), tZPA, zpA); - registry.fill(HIST("ZEM1Vstdc"), tZEM1, aZEM1); - registry.fill(HIST("ZEM2Vstdc"), tZEM2, aZEM2); - registry.fill(HIST("debunch"), tZDCdif, tZDCsum); + registry.fill(HIST("Debunch"), tZDCdif, tZDCsum); registry.fill(HIST("ZNVsFT0A"), aT0A / 100., sumZNs); registry.fill(HIST("ZNVsFT0C"), aT0C / 100., sumZNs); registry.fill(HIST("ZNVsFT0M"), normT0M, sumZNs); @@ -590,6 +513,7 @@ struct UccZdc { registry.fill(HIST("NchVsFT0A"), aT0A / 100., glbTracks); registry.fill(HIST("NchVsFT0C"), aT0C / 100., glbTracks); registry.fill(HIST("NchVsFT0M"), normT0M, glbTracks); + registry.fill(HIST("NchUncorrected"), glbTracks); registry.fill(HIST("Nch"), glbTracks); registry.fill(HIST("NchVsEt"), et, glbTracks); registry.fill(HIST("NchVsNPV"), collision.multNTracksPVeta1(), glbTracks); @@ -599,15 +523,13 @@ struct UccZdc { registry.fill(HIST("ZNVsNch"), glbTracks, sumZNs); registry.fill(HIST("ZNDifVsNch"), glbTracks, znA - znC); if (glbTracks >= minNchSel) { - registry.fill(HIST("NchVsMeanPt"), glbTracks, meanpt / glbTracks); + registry.fill(HIST("NchVsOneParCorr"), glbTracks, meanpt / glbTracks); } } PROCESS_SWITCH(UccZdc, processQA, "Process QA", true); void processZdcCollAss(o2::aod::ColEvSels::iterator const& collision, o2::aod::BCsRun3 const& /*bcs*/, aod::Zdcs const& /*zdcs*/, aod::FV0As const& /*fv0as*/, aod::FT0s const& /*ft0s*/, TheFilteredTracks const& tracks) { - const double ePerNucleon{2.68}; - if (!isEventSelected(collision)) { return; } @@ -621,20 +543,20 @@ struct UccZdc { } registry.fill(HIST("hEventCounter"), EvCutLabel::Zdc); - if (!foundBC.has_ft0()) { + float aT0A = 0., aT0C = 0.; + if (foundBC.has_ft0()) { + for (const auto& amplitude : foundBC.ft0().amplitudeA()) { + aT0A += amplitude; + } + for (const auto& amplitude : foundBC.ft0().amplitudeC()) { + aT0C += amplitude; + } + } else { return; } registry.fill(HIST("hEventCounter"), EvCutLabel::TZero); - float aT0A = 0., aT0C = 0.; - for (const auto& amplitude : foundBC.ft0().amplitudeA()) { - aT0A += amplitude; - } - for (const auto& amplitude : foundBC.ft0().amplitudeC()) { - aT0C += amplitude; - } const double normT0M{(aT0A + aT0C) / 100.}; - float znA{foundBC.zdc().amplitudeZNA()}; float znC{foundBC.zdc().amplitudeZNC()}; float aZEM1{foundBC.zdc().amplitudeZEM1()}; @@ -645,8 +567,8 @@ struct UccZdc { float tZPC{foundBC.zdc().timeZPC()}; float tZDCdif{tZNC + tZPC - tZNA - tZPA}; float tZDCsum{tZNC + tZPC + tZNA + tZPA}; - znA /= ePerNucleon; - znC /= ePerNucleon; + znA /= collEnergy; + znC /= collEnergy; float sumZNs{znA + znC}; float sumZEMs{aZEM1 + aZEM2}; @@ -666,57 +588,65 @@ struct UccZdc { registry.fill(HIST("hEventCounter"), EvCutLabel::Zem); } - // Load Efficiency correction - auto efficiency = ccdb->getForRun(paTH.value, foundBC.runNumber()); - if (!efficiency) { - LOGF(fatal, "Could not load efficiency from %s", paTH.value.c_str()); - return; + registry.fill(HIST("zPos"), collision.posZ()); + registry.fill(HIST("T0Ccent"), collision.centFT0C()); + + // Nch-based selection + int glbTracks{0}; + for (const auto& track : tracks) { + // Track Selection + if (!track.isGlobalTrack()) { + continue; + } + registry.fill(HIST("ZposVsEta"), collision.posZ(), track.eta()); + registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); + registry.fill(HIST("sigma1Pt"), track.pt(), track.sigma1Pt()); + registry.fill(HIST("dcaXYvspT"), track.dcaXY(), track.pt()); + glbTracks++; } - // Get Nch-based selection objects from the CCDB - auto fMeanNch = ccdb->getForRun(paTHmeanNch.value, foundBC.runNumber()); - auto fSigmaNch = ccdb->getForRun(paTHsigmaNch.value, foundBC.runNumber()); - if (!fMeanNch) { - LOGF(fatal, "Could not load fMeanNch from %s", paTHmeanNch.value.c_str()); - return; + if (useMidRapNchSel) { + auto fMeanNch = ccdb->getForRun(paTHmeanNch.value, foundBC.runNumber()); + auto fSigmaNch = ccdb->getForRun(paTHsigmaNch.value, foundBC.runNumber()); + if (!fMeanNch || !fSigmaNch) { + return; + } + + const double meanNch{fMeanNch->Eval(normT0M)}; + const double sigmaNch{fSigmaNch->Eval(normT0M)}; + const double nSigmaSelection{nSigmaNchCut * sigmaNch}; + const double diffMeanNch{meanNch - glbTracks}; + if (!(std::abs(diffMeanNch) < nSigmaSelection)) { + registry.fill(HIST("ExcludedEvtVsFT0M"), normT0M); + registry.fill(HIST("ExcludedEvtVsNch"), glbTracks); + return; + } } - if (!fSigmaNch) { - LOGF(fatal, "Could not load fSigmaNch from %s", paTHsigmaNch.value.c_str()); + + // auto efficiency = ccdb->getForTimeStamp(paTH.value, foundBC.timestamp()); + auto efficiency = ccdb->getForRun(paTH.value, foundBC.runNumber()); + if (!efficiency) { return; } std::vector pTs; std::vector wIs; - int glbTracks{0}; // Calculates the event weight, W_k for (const auto& track : tracks) { // Track Selection - if (myTrackSel.IsSelected(track)) { - if (passesDCAxyCut(track)) { - registry.fill(HIST("ZposVsEta"), collision.posZ(), track.eta()); - registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); - registry.fill(HIST("dcaXYvspT"), track.dcaXY(), track.pt()); - - glbTracks++; - float pt{track.pt()}; - double weight{efficiency->GetBinContent(efficiency->FindBin(pt))}; - if (weight > 0.) { - pTs.emplace_back(pt); - wIs.emplace_back(weight); - } - } + if (!track.isGlobalTrack()) { + continue; } - } - - const double meanNch{fMeanNch->Eval(normT0M)}; - const double sigmaNch{fSigmaNch->Eval(normT0M)}; - const double nSigmaSelection{nSigmaNchCut * sigmaNch}; - const double diffMeanNch{meanNch - glbTracks}; - if (!(std::abs(diffMeanNch) < nSigmaSelection)) { - registry.fill(HIST("RejectedEvtsVsFT0M"), normT0M); - registry.fill(HIST("RejectedEvtsVsNch"), glbTracks); - return; + float pt{track.pt()}; + double weight{1.}; + if (applyEff) { + weight = efficiency->GetBinContent(efficiency->FindBin(pt)); + } + if (weight > 0.) { + pTs.emplace_back(pt); + wIs.emplace_back(weight); + } } double p1, p2, p3, p4, w1, w2, w3, w4; @@ -730,11 +660,10 @@ struct UccZdc { // To calculate event-averaged for (const auto& track : tracks) { // Track Selection - if (myTrackSel.IsSelected(track)) { - if (passesDCAxyCut(track)) { - registry.fill(HIST("NchVsPt"), w1, track.pt()); - } + if (!track.isGlobalTrack()) { + continue; } + registry.fill(HIST("NchVsPt"), w1, track.pt()); } // EbE one-particle pT correlation @@ -756,9 +685,8 @@ struct UccZdc { double fourParCorr{numFourParCorr / denFourParCorr}; registry.fill(HIST("Nch"), w1); - registry.fill(HIST("ZN"), sumZNs); - registry.fill(HIST("zPos"), collision.posZ()); - registry.fill(HIST("T0Ccent"), collision.centFT0C()); + registry.fill(HIST("ZNamp"), sumZNs); + registry.fill(HIST("NchUncorrected"), glbTracks); registry.fill(HIST("NchVsOneParCorr"), w1, oneParCorr, w1); registry.fill(HIST("NchVsOneParCorrVsZN"), w1, sumZNs, oneParCorr, w1); registry.fill(HIST("NchVsTwoParCorrVsZN"), w1, sumZNs, twoParCorr, denTwoParCorr); @@ -776,60 +704,65 @@ struct UccZdc { float rndNum = randPointer->Uniform(0.0, 1.0); registry.fill(HIST("RandomNumber"), rndNum); - // Half of the statistics for MC closure - if (rndNum >= zEro && rndNum < oneHalf) { - registry.fill(HIST("EvtsDivided"), 0); - //----- MC reconstructed -----// - for (const auto& collision : collisions) { + for (const auto& collision : collisions) { - const auto& foundBC = collision.foundBC_as(); + // Event selection + if (!isEventSelected(collision)) { + continue; + } + // MC collision? + if (!collision.has_mcCollision()) { + continue; + } - // Event selection - if (!isEventSelected(collision)) { - continue; - } - // MC collision? - if (!collision.has_mcCollision()) { - continue; - } + registry.fill(HIST("hEventCounterMC"), EvCutLabel::All); + // Vtx_z selection MC + if (std::fabs(mccollision.posZ()) > posZcut) { + continue; + } - // Load Efficiency correction - // bool isEffLoaded{false}; - // if (useTimeStamps) { isEffLoaded = loadEfficiencyCorrection(foundBC.timestamp()); } - // else { isEffLoaded = loadEfficiencyCorrection(foundBC.runNumber()); } - // if(!isEffLoaded) { return; } + registry.fill(HIST("zPos"), collision.posZ()); + registry.fill(HIST("zPosMC"), mccollision.posZ()); + registry.fill(HIST("hEventCounterMC"), EvCutLabel::VtxZ); + registry.fill(HIST("nRecColvsCent"), collisions.size(), collision.centFT0C()); + const auto& cent{collision.centFT0C()}; + registry.fill(HIST("T0Ccent"), cent); + + // Half of the statistics for MC closure + if (rndNum >= zEro && rndNum < evtFracMCcl) { + registry.fill(HIST("EvtsDivided"), 0); + + // To use run-by-run efficiency + const auto& foundBC = collision.foundBC_as(); + // auto efficiency = ccdb->getForTimeStamp(paTH.value, foundBC.timestamp()); auto efficiency = ccdb->getForRun(paTH.value, foundBC.runNumber()); if (!efficiency) { - LOGF(fatal, "Could not load efficiency from %s", paTH.value.c_str()); - return; + continue; } - registry.fill(HIST("T0Ccent"), collision.centFT0C()); - registry.fill(HIST("zPos"), collision.posZ()); - - const auto& groupedTracks{simTracks.sliceBy(perCollision, collision.globalIndex())}; - std::vector pTs; std::vector wIs; + const auto& groupedTracks{simTracks.sliceBy(perCollision, collision.globalIndex())}; // Calculates the event weight, W_k for (const auto& track : groupedTracks) { // Track Selection - if (myTrackSel.IsSelected(track)) { - if (passesDCAxyCut(track)) { - float pt{track.pt()}; - double weight{efficiency->GetBinContent(efficiency->FindBin(pt))}; - if (weight > 0.) { - pTs.emplace_back(pt); - wIs.emplace_back(weight); - } - } + if (!track.isGlobalTrack()) { + continue; + } + + float pt{track.pt()}; + double weight{efficiency->GetBinContent(efficiency->FindBin(pt))}; + if (!(weight > 0.)) { + continue; } + pTs.emplace_back(pt); + wIs.emplace_back(weight); } const double nch{static_cast(pTs.size())}; if (nch < minNchSel) { - return; + continue; } double p1, p2, p3, p4, w1, w2, w3, w4; @@ -849,20 +782,13 @@ struct UccZdc { const double fourParCorr{numFourParCorr / denFourParCorr}; registry.fill(HIST("Nch"), w1); - registry.fill(HIST("NchRaw"), nch); + registry.fill(HIST("NchUncorrected"), nch); registry.fill(HIST("NchVsOneParCorr"), w1, oneParCorr, w1); registry.fill(HIST("NchVsTwoParCorr"), w1, twoParCorr, denTwoParCorr); registry.fill(HIST("NchVsThreeParCorr"), w1, threeParCorr, denThreeParCorr); registry.fill(HIST("NchVsFourParCorr"), w1, fourParCorr, denFourParCorr); //--------------------------- Generated MC --------------------------- - registry.fill(HIST("hEventCounterMC"), EvCutLabel::All); - if (std::fabs(mccollision.posZ()) > posZcut) { - continue; - } - registry.fill(HIST("zPosMC"), mccollision.posZ()); - registry.fill(HIST("hEventCounterMC"), EvCutLabel::VtxZ); - std::vector pTsMC; std::vector wIsMC; // Calculates the event weight, W_k @@ -884,7 +810,7 @@ struct UccZdc { const double nchMC{static_cast(pTsMC.size())}; if (nchMC < minNchSel) { - return; + continue; } double p1MC, p2MC, p3MC, p4MC, w1MC, w2MC, w3MC, w4MC; @@ -908,69 +834,47 @@ struct UccZdc { registry.fill(HIST("NchvsTwoParCorrGen"), nchMC, twoParCorrMC, denTwoParCorrMC); registry.fill(HIST("NchvsThreeParCorrGen"), nchMC, threeParCorrMC, denThreeParCorrMC); registry.fill(HIST("NchvsFourParCorrGen"), nchMC, fourParCorrMC, denFourParCorrMC); - } - } else { // Correction with the remaining half of the sample - registry.fill(HIST("EvtsDivided"), 1); - //----- MC reconstructed -----// - for (const auto& collision : collisions) { - // Event selection - if (!isEventSelected(collision)) { - continue; - } - // MC collision? - if (!collision.has_mcCollision()) { - continue; - } - - registry.fill(HIST("zPos"), collision.posZ()); - registry.fill(HIST("nRecColvsCent"), collisions.size(), collision.centFT0C()); - - const auto& cent{collision.centFT0C()}; - registry.fill(HIST("T0Ccent"), cent); - + } else { // Correction with the remaining half of the sample + registry.fill(HIST("EvtsDivided"), 1); + //----- MC reconstructed -----// const auto& groupedTracks{simTracks.sliceBy(perCollision, collision.globalIndex())}; for (const auto& track : groupedTracks) { + // Track Selection + if (!track.isGlobalTrack()) { + continue; + } // Has MC particle? if (!track.has_mcParticle()) { continue; } - // Track selection - if (myTrackSel.IsSelected(track)) { - if (passesDCAxyCut(track)) { - registry.fill(HIST("Pt_all_ch"), cent, track.pt()); - registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); - - const auto& particle{track.mcParticle()}; - if (!particle.isPhysicalPrimary()) { - continue; - } - - registry.fill(HIST("Pt_ch"), cent, track.pt()); - if (particle.pdgCode() == PDG_t::kPiPlus || particle.pdgCode() == PDG_t::kPiMinus) { - registry.fill(HIST("Pt_pi"), cent, track.pt()); - } else if (particle.pdgCode() == PDG_t::kKPlus || particle.pdgCode() == PDG_t::kKMinus) { - registry.fill(HIST("Pt_ka"), cent, track.pt()); - } else if (particle.pdgCode() == PDG_t::kProton || particle.pdgCode() == PDG_t::kProtonBar) { - registry.fill(HIST("Pt_pr"), cent, track.pt()); - } else if (particle.pdgCode() == PDG_t::kSigmaPlus || particle.pdgCode() == PDG_t::kSigmaBarMinus) { - registry.fill(HIST("Pt_sigpos"), cent, track.pt()); - } else if (particle.pdgCode() == PDG_t::kSigmaMinus || particle.pdgCode() == PDG_t::kSigmaBarPlus) { - registry.fill(HIST("Pt_signeg"), cent, track.pt()); - } else { - registry.fill(HIST("Pt_re"), cent, track.pt()); - } - } + + const auto& particle{track.mcParticle()}; + registry.fill(HIST("Pt_all_ch"), cent, track.pt()); + registry.fill(HIST("ZposVsEta"), collision.posZ(), track.eta()); + registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); + registry.fill(HIST("dcaXYvspT"), track.dcaXY(), track.pt()); + + if (!particle.isPhysicalPrimary()) { + continue; } - } - // Generated MC - registry.fill(HIST("hEventCounterMC"), EvCutLabel::All); - if (std::fabs(mccollision.posZ()) > posZcut) { - continue; + registry.fill(HIST("Pt_ch"), cent, track.pt()); + if (particle.pdgCode() == PDG_t::kPiPlus || particle.pdgCode() == PDG_t::kPiMinus) { + registry.fill(HIST("Pt_pi"), cent, track.pt()); + } else if (particle.pdgCode() == PDG_t::kKPlus || particle.pdgCode() == PDG_t::kKMinus) { + registry.fill(HIST("Pt_ka"), cent, track.pt()); + } else if (particle.pdgCode() == PDG_t::kProton || particle.pdgCode() == PDG_t::kProtonBar) { + registry.fill(HIST("Pt_pr"), cent, track.pt()); + } else if (particle.pdgCode() == PDG_t::kSigmaPlus || particle.pdgCode() == PDG_t::kSigmaBarMinus) { + registry.fill(HIST("Pt_sigpos"), cent, track.pt()); + } else if (particle.pdgCode() == PDG_t::kSigmaMinus || particle.pdgCode() == PDG_t::kSigmaBarPlus) { + registry.fill(HIST("Pt_signeg"), cent, track.pt()); + } else { + registry.fill(HIST("Pt_re"), cent, track.pt()); + } } - registry.fill(HIST("zPosMC"), mccollision.posZ()); - registry.fill(HIST("hEventCounterMC"), EvCutLabel::VtxZ); + // Generated MC for (const auto& particle : mcParticles) { if (particle.eta() < minEta || particle.eta() > maxEta) { continue; @@ -997,8 +901,8 @@ struct UccZdc { registry.fill(HIST("PtMC_re"), cent, particle.pt()); } } - } - } // Half of statistics for corrections + } // Half of statistics for corrections + } // Collisions } PROCESS_SWITCH(UccZdc, processMCclosure, "Process MC closure", false); @@ -1019,70 +923,6 @@ struct UccZdc { wFour += std::pow(wEighti, 4.); } } - - template - bool passesDCAxyCut(TrackType const& track) const - { - if (std::fabs(track.dcaXY()) <= (0.0105f + 0.0350f / std::pow(track.pt(), 1.1f))) { - return true; - } else { - return false; - } - } - - /* - template - bool loadMeanSigmaNchParams(const T& parameter) - { - fMeanNch = nullptr; - fSigmaNch = nullptr; - // Get Nch-based selection objects from the CCDB - if(useTimeStamps){ - fMeanNch = ccdb->getForTimeStamp(paTHmeanNch.value, parameter); - fSigmaNch = ccdb->getForTimeStamp(paTHsigmaNch.value, parameter); - } else{ - fMeanNch = ccdb->getForRun(paTHmeanNch.value, parameter); - fSigmaNch = ccdb->getForRun(paTHsigmaNch.value, parameter); - // auto efficiency = ccdb->getForRun(paTH.value, foundBC.runNumber()); - } - if (!fMeanNch) { - LOGF(fatal, "Could not load fMeanNch from %s", paTHmeanNch.value.c_str()); - return false; - } - if (!fSigmaNch) { - LOGF(fatal, "Could not load fSigmaNch from %s", paTHsigmaNch.value.c_str()); - return false; - } - // if (fMeanNch) { - // LOGF(info, "Loaded fMeanNch from %s (%p)", paTHmeanNch.value.c_str(), (void*)fMeanNch); - // } - // if (fSigmaNch) { - // LOGF(info, "Loaded fSigmaNch from %s (%p)", paTHsigmaNch.value.c_str(), (void*)fSigmaNch); - // } - if(!fMeanNch || !fSigmaNch) { return false; } - else{ return true; } - } - - template - bool loadEfficiencyCorrection(const T& parameter) - { - efficiency = nullptr; - // Get Nch-based selection objects from the CCDB - if(useTimeStamps){ - efficiency = ccdb->getForTimeStamp(paTH.value, parameter); - } else{ - efficiency = ccdb->getForRun(paTH.value, parameter); - } - if (!efficiency) { - LOGF(fatal, "Could not load efficiency from %s", paTH.value.c_str()); - return false; - } - // if (efficiency) { - // LOGF(info, "Loaded efficiency from %s (%p)", paTH.value.c_str(), (void*)efficiency); - // } - if(!efficiency) { return false; } - else{ return true; } - }*/ }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 7bd54e8ff643fb63451b2fe8cb1b34345205469e Mon Sep 17 00:00:00 2001 From: David Rohr Date: Mon, 19 May 2025 09:04:36 +0200 Subject: [PATCH 1318/1650] [Common,PWGEM,PWGHF,PWGLF,DPG,Trigger] Use std::array instead of deprecated gpustd::array (#11219) --- Common/TableProducer/trackPropagation.cxx | 2 +- .../TableProducer/trackPropagationTester.cxx | 2 +- Common/TableProducer/trackextension.cxx | 2 +- Common/Tasks/propagatorQa.cxx | 6 +-- DPG/Tasks/AOTTrack/qaImpPar.cxx | 2 +- EventFiltering/PWGHF/HFFilter.cxx | 42 +++++++++---------- .../PWGHF/HFFilterCharmHadronSignals.cxx | 12 +++--- EventFiltering/PWGHF/HFFilterHelpers.h | 8 ++-- .../PWGHF/HFFilterPrepareMLSamples.cxx | 20 ++++----- EventFiltering/PWGLF/nucleiFilter.cxx | 8 ++-- .../TableProducer/filterDielectronEvent.cxx | 8 ++-- .../skimmerSecondaryElectron.cxx | 2 +- .../TableProducer/photonconversionbuilder.cxx | 2 +- .../dataCreatorCharmHadPiReduced.cxx | 2 +- .../dataCreatorCharmResoReduced.cxx | 6 +-- .../candidateCreatorSigmac0plusplus.cxx | 2 +- .../candidateCreatorXic0Omegac0.cxx | 12 +++--- PWGHF/TableProducer/trackIndexSkimCreator.cxx | 18 ++++---- PWGLF/TableProducer/Common/kinkBuilder.cxx | 4 +- .../Nuspex/LFTreeCreatorClusterStudies.cxx | 6 +-- .../Nuspex/decay3bodybuilder.cxx | 2 +- PWGLF/TableProducer/Nuspex/ebyeMaker.cxx | 2 +- PWGLF/TableProducer/Nuspex/hyhe4builder.cxx | 2 +- PWGLF/TableProducer/Nuspex/hyperRecoTask.cxx | 2 +- .../Nuspex/hypertriton3bodyfinder.cxx | 2 +- PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx | 2 +- PWGLF/TableProducer/Nuspex/nucleiFlowTree.cxx | 2 +- PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx | 2 +- .../Strangeness/LFStrangeTreeCreator.cxx | 2 +- .../Strangeness/cascadebuilder.cxx | 16 +++---- .../Strangeness/cascadefinder.cxx | 4 +- .../Strangeness/lambdakzerobuilder.cxx | 2 +- .../Strangeness/strangenessbuilder.cxx | 2 +- PWGLF/Tasks/Nuspex/antidLambdaEbye.cxx | 2 +- PWGLF/Tasks/Nuspex/ebyeMult.cxx | 2 +- PWGLF/Tasks/Nuspex/hypertritonAnalysis.cxx | 4 +- PWGLF/Tasks/QC/efficiencyQA.cxx | 10 ++--- PWGLF/Utils/strangenessBuilderHelper.h | 14 +++---- PWGMM/Mult/TableProducer/trackPropagation.cxx | 2 +- Tools/KFparticle/KFUtilities.h | 4 +- 40 files changed, 123 insertions(+), 123 deletions(-) diff --git a/Common/TableProducer/trackPropagation.cxx b/Common/TableProducer/trackPropagation.cxx index 073533a191c..e1b6528ce53 100644 --- a/Common/TableProducer/trackPropagation.cxx +++ b/Common/TableProducer/trackPropagation.cxx @@ -162,7 +162,7 @@ struct TrackPropagation { } // Running variables - gpu::gpustd::array mDcaInfo; + std::array mDcaInfo; o2::dataformats::DCA mDcaInfoCov; o2::dataformats::VertexBase mVtx; o2::track::TrackParametrization mTrackPar; diff --git a/Common/TableProducer/trackPropagationTester.cxx b/Common/TableProducer/trackPropagationTester.cxx index 92139a4fceb..3787c19ee19 100644 --- a/Common/TableProducer/trackPropagationTester.cxx +++ b/Common/TableProducer/trackPropagationTester.cxx @@ -209,7 +209,7 @@ struct TrackPropagationTester { } initCCDB(bcs.begin()); - gpu::gpustd::array dcaInfo; + std::array dcaInfo; int lNAll = 0; int lNaccTPC = 0; diff --git a/Common/TableProducer/trackextension.cxx b/Common/TableProducer/trackextension.cxx index 205be621f76..210f9adc122 100644 --- a/Common/TableProducer/trackextension.cxx +++ b/Common/TableProducer/trackextension.cxx @@ -134,7 +134,7 @@ struct TrackExtension { } auto trackPar = getTrackPar(track); auto const& collision = track.collision(); - gpu::gpustd::array dcaInfo; + std::array dcaInfo; if (o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackPar, 2.f, matCorr, &dcaInfo)) { dca[0] = dcaInfo[0]; dca[1] = dcaInfo[1]; diff --git a/Common/Tasks/propagatorQa.cxx b/Common/Tasks/propagatorQa.cxx index b5abade3ba5..f978f8bc564 100644 --- a/Common/Tasks/propagatorQa.cxx +++ b/Common/Tasks/propagatorQa.cxx @@ -208,7 +208,7 @@ struct propagatorQa { /* check the previous run number */ auto bc = collision.bc_as(); initCCDB(bc); - gpu::gpustd::array dcaInfo; + std::array dcaInfo; for (auto& track : tracks) { if (track.tpcNClsFound() < minTPCClustersRequired) @@ -328,7 +328,7 @@ struct propagatorQa { /* check the previous run number */ auto bc = collision.bc_as(); initCCDB(bc); - gpu::gpustd::array dcaInfo; + std::array dcaInfo; for (auto& track : tracks) { if (track.tpcNClsFound() < minTPCClustersRequired) @@ -444,7 +444,7 @@ struct propagatorQa { /* check the previous run number */ auto bc = collision.bc_as(); initCCDB(bc); - gpu::gpustd::array dcaInfo; + std::array dcaInfo; for (auto& trackIU : tracksIU) { if (trackIU.tpcNClsFound() < minTPCClustersRequired) diff --git a/DPG/Tasks/AOTTrack/qaImpPar.cxx b/DPG/Tasks/AOTTrack/qaImpPar.cxx index 787ac03d8c2..1f7494c9395 100644 --- a/DPG/Tasks/AOTTrack/qaImpPar.cxx +++ b/DPG/Tasks/AOTTrack/qaImpPar.cxx @@ -692,7 +692,7 @@ struct QaImpactPar { } } else { auto trackPar = getTrackPar(track); - o2::gpu::gpustd::array dcaInfo{-999., -999.}; + std::array dcaInfo{-999., -999.}; if (o2::base::Propagator::Instance()->propagateToDCABxByBz({PVbase_recalculated.getX(), PVbase_recalculated.getY(), PVbase_recalculated.getZ()}, trackPar, 2.f, matCorr, &dcaInfo)) { impParRPhi = dcaInfo[0] * toMicrometers; impParZ = dcaInfo[1] * toMicrometers; diff --git a/EventFiltering/PWGHF/HFFilter.cxx b/EventFiltering/PWGHF/HFFilter.cxx index 14390515f56..6a9112c8c85 100644 --- a/EventFiltering/PWGHF/HFFilter.cxx +++ b/EventFiltering/PWGHF/HFFilter.cxx @@ -450,8 +450,8 @@ struct HfFilter { // Main struct for HF triggers auto trackParPos = getTrackParCov(trackPos); auto trackParNeg = getTrackParCov(trackNeg); - o2::gpu::gpustd::array dcaPos{trackPos.dcaXY(), trackPos.dcaZ()}; - o2::gpu::gpustd::array dcaNeg{trackNeg.dcaXY(), trackNeg.dcaZ()}; + std::array dcaPos{trackPos.dcaXY(), trackPos.dcaZ()}; + std::array dcaNeg{trackNeg.dcaXY(), trackNeg.dcaZ()}; std::array pVecPos{trackPos.pVector()}; std::array pVecNeg{trackNeg.pVector()}; if (trackPos.collisionId() != thisCollId) { @@ -545,7 +545,7 @@ struct HfFilter { // Main struct for HF triggers } auto trackParThird = getTrackParCov(track); - o2::gpu::gpustd::array dcaThird{track.dcaXY(), track.dcaZ()}; + std::array dcaThird{track.dcaXY(), track.dcaZ()}; std::array pVecThird = track.pVector(); if (track.collisionId() != thisCollId) { o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParThird, 2.f, noMatCorr, &dcaThird); @@ -600,7 +600,7 @@ struct HfFilter { // Main struct for HF triggers std::array pVecThirdVtx{}; dfB.getTrack(0).getPxPyPzGlo(pVec2ProngVtx); dfB.getTrack(1).getPxPyPzGlo(pVecThirdVtx); - o2::gpu::gpustd::array dca2Prong; //{trackParD.dcaXY(), trackParD.dcaZ()}; + std::array dca2Prong; //{trackParD.dcaXY(), trackParD.dcaZ()}; o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParD, 2.f, noMatCorr, &dca2Prong); bool isBplus = helper.isSelectedBhadron(pVec2ProngVtx, pVecThirdVtx, dca2Prong, dcaThird, std::array{static_cast(collision.posX()), static_cast(collision.posY()), static_cast(collision.posZ())}, std::array{secondaryVertexBtoD0h[0], secondaryVertexBtoD0h[1], secondaryVertexBtoD0h[2]}, kBplus); bool isBc = helper.isSelectedBhadron(pVec2ProngVtx, pVecThirdVtx, dca2Prong, dcaThird, std::array{static_cast(collision.posX()), static_cast(collision.posY()), static_cast(collision.posZ())}, std::array{secondaryVertexBtoD0h[0], secondaryVertexBtoD0h[1], secondaryVertexBtoD0h[2]}, kBc); @@ -654,7 +654,7 @@ struct HfFilter { // Main struct for HF triggers continue; } auto trackParFourth = getTrackParCov(trackB); - o2::gpu::gpustd::array dcaFourth{trackB.dcaXY(), trackB.dcaZ()}; + std::array dcaFourth{trackB.dcaXY(), trackB.dcaZ()}; std::array pVecFourth = trackB.pVector(); if (trackB.collisionId() != thisCollId) { o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParFourth, 2.f, noMatCorr, &dcaFourth); @@ -772,7 +772,7 @@ struct HfFilter { // Main struct for HF triggers continue; } auto trackParFourth = getTrackParCov(trackFourth); - o2::gpu::gpustd::array dcaFourth{trackFourth.dcaXY(), trackFourth.dcaZ()}; + std::array dcaFourth{trackFourth.dcaXY(), trackFourth.dcaZ()}; std::array pVecFourth = trackFourth.pVector(); if (trackFourth.collisionId() != thisCollId) { o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParFourth, 2.f, noMatCorr, &dcaFourth); @@ -813,7 +813,7 @@ struct HfFilter { // Main struct for HF triggers if (!helper.isSelectedPhoton(photon, std::array{posTrack, negTrack}, activateQA, hV0Selected, hArmPod)) { continue; } - gpu::gpustd::array dcaInfo; + std::array dcaInfo; std::array pVecPhoton = {photon.px(), photon.py(), photon.pz()}; std::array posVecPhoton = {photon.vx(), photon.vy(), photon.vz()}; auto trackParPhoton = o2::track::TrackPar(posVecPhoton, pVecPhoton, 0, true); @@ -876,7 +876,7 @@ struct HfFilter { // Main struct for HF triggers } auto trackParBachelor = getTrackPar(trackBachelor); - o2::gpu::gpustd::array dcaBachelor{trackBachelor.dcaXY(), trackBachelor.dcaZ()}; + std::array dcaBachelor{trackBachelor.dcaXY(), trackBachelor.dcaZ()}; std::array pVecBachelor = trackBachelor.pVector(); if (trackBachelor.collisionId() != thisCollId) { o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParBachelor, 2.f, noMatCorr, &dcaBachelor); @@ -973,7 +973,7 @@ struct HfFilter { // Main struct for HF triggers if (trackProton.globalIndex() == trackPos.globalIndex() || trackProton.globalIndex() == trackNeg.globalIndex()) { continue; } - gpu::gpustd::array dcaInfoBachProton; + std::array dcaInfoBachProton; if (trackProton.collisionId() != thisCollId) { o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParBachelorProton, 2.f, noMatCorr, &dcaInfoBachProton); } @@ -991,7 +991,7 @@ struct HfFilter { // Main struct for HF triggers continue; } auto trackParBachelor = getTrackPar(trackBachelor); - o2::gpu::gpustd::array dcaBachelor{trackBachelor.dcaXY(), trackBachelor.dcaZ()}; + std::array dcaBachelor{trackBachelor.dcaXY(), trackBachelor.dcaZ()}; std::array pVecBachelor = trackBachelor.pVector(); if (trackBachelor.collisionId() != thisCollId) { o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParBachelor, 2.f, noMatCorr, &dcaBachelor); @@ -1137,9 +1137,9 @@ struct HfFilter { // Main struct for HF triggers auto trackParFirst = getTrackParCov(trackFirst); auto trackParSecond = getTrackParCov(trackSecond); auto trackParThird = getTrackParCov(trackThird); - o2::gpu::gpustd::array dcaFirst{trackFirst.dcaXY(), trackFirst.dcaZ()}; - o2::gpu::gpustd::array dcaSecond{trackSecond.dcaXY(), trackSecond.dcaZ()}; - o2::gpu::gpustd::array dcaThird{trackThird.dcaXY(), trackThird.dcaZ()}; + std::array dcaFirst{trackFirst.dcaXY(), trackFirst.dcaZ()}; + std::array dcaSecond{trackSecond.dcaXY(), trackSecond.dcaZ()}; + std::array dcaThird{trackThird.dcaXY(), trackThird.dcaZ()}; std::array pVecFirst = trackFirst.pVector(); std::array pVecSecond = trackSecond.pVector(); std::array pVecThird = trackThird.pVector(); @@ -1280,7 +1280,7 @@ struct HfFilter { // Main struct for HF triggers } auto trackParFourth = getTrackParCov(track); - o2::gpu::gpustd::array dcaFourth{track.dcaXY(), track.dcaZ()}; + std::array dcaFourth{track.dcaXY(), track.dcaZ()}; std::array pVecFourth = track.pVector(); if (track.collisionId() != thisCollId) { o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParFourth, 2.f, noMatCorr, &dcaFourth); @@ -1328,7 +1328,7 @@ struct HfFilter { // Main struct for HF triggers std::array pVecFourtVtx{}; dfB.getTrack(0).getPxPyPzGlo(pVec3ProngVtx); dfB.getTrack(1).getPxPyPzGlo(pVecFourtVtx); - o2::gpu::gpustd::array dca3Prong; //{trackParD.dcaXY(), trackParD.dcaZ()}; + std::array dca3Prong; //{trackParD.dcaXY(), trackParD.dcaZ()}; o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParD, 2.f, noMatCorr, &dca3Prong); bool isBhad = helper.isSelectedBhadron(pVec3ProngVtx, pVecFourtVtx, dca3Prong, dcaFourth, std::array{static_cast(collision.posX()), static_cast(collision.posY()), static_cast(collision.posZ())}, std::array{secondaryVertexB[0], secondaryVertexB[1], secondaryVertexB[2]}, iHypo + 3); if (isBhad) { @@ -1420,7 +1420,7 @@ struct HfFilter { // Main struct for HF triggers // select soft pion candidates auto trackParSoftPi = getTrackPar(trackSoftPi); - o2::gpu::gpustd::array dcaSoftPi{trackSoftPi.dcaXY(), trackSoftPi.dcaZ()}; + std::array dcaSoftPi{trackSoftPi.dcaXY(), trackSoftPi.dcaZ()}; std::array pVecSoftPi = trackSoftPi.pVector(); if (trackSoftPi.collisionId() != thisCollId) { // This is a track reassociated to this PV by the track-to-collision-associator @@ -1505,7 +1505,7 @@ struct HfFilter { // Main struct for HF triggers if (!helper.isSelectedPhoton(photon, std::array{posTrack, negTrack}, activateQA, hV0Selected, hArmPod)) { continue; } - gpu::gpustd::array dcaInfo; + std::array dcaInfo; std::array pVecPhoton = {photon.px(), photon.py(), photon.pz()}; std::array posVecPhoton = {photon.vx(), photon.vy(), photon.vz()}; auto trackParPhoton = o2::track::TrackPar(posVecPhoton, pVecPhoton, 0, true); @@ -1626,7 +1626,7 @@ struct HfFilter { // Main struct for HF triggers // select soft pion candidates auto trackParSoftPi = getTrackPar(trackSoftPi); - o2::gpu::gpustd::array dcaSoftPi{trackSoftPi.dcaXY(), trackSoftPi.dcaZ()}; + std::array dcaSoftPi{trackSoftPi.dcaXY(), trackSoftPi.dcaZ()}; std::array pVecSoftPi = trackSoftPi.pVector(); if (trackSoftPi.collisionId() != thisCollId) { // This is a track reassociated to this PV by the track-to-collision-associator @@ -1733,7 +1733,7 @@ struct HfFilter { // Main struct for HF triggers auto v0DauNegId = v0.negTrackId(); // propagate to PV - gpu::gpustd::array dcaInfo; + std::array dcaInfo; o2::track::TrackParCov trackParCasc; o2::track::TrackParCov trackParCascTrack; if (requireStrangenessTrackingAny < 2) { // needed for at least one of the two @@ -1758,7 +1758,7 @@ struct HfFilter { // Main struct for HF triggers } auto trackParBachelor = getTrackParCov(track); - gpu::gpustd::array dcaInfoBach; + std::array dcaInfoBach; if (track.collisionId() != thisCollId) { o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParBachelor, 2.f, noMatCorr, &dcaInfoBach); } @@ -1802,7 +1802,7 @@ struct HfFilter { // Main struct for HF triggers } auto trackParBachelorSecond = getTrackParCov(trackSecond); - gpu::gpustd::array dcaInfoBachSecond; + std::array dcaInfoBachSecond; if (trackSecond.collisionId() != thisCollId) { o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParBachelorSecond, 2.f, noMatCorr, &dcaInfoBachSecond); } diff --git a/EventFiltering/PWGHF/HFFilterCharmHadronSignals.cxx b/EventFiltering/PWGHF/HFFilterCharmHadronSignals.cxx index 6ed8498e838..e3a9cf8044a 100644 --- a/EventFiltering/PWGHF/HFFilterCharmHadronSignals.cxx +++ b/EventFiltering/PWGHF/HFFilterCharmHadronSignals.cxx @@ -162,8 +162,8 @@ struct HfFilterCharmHadronSignals { // Main struct for HF triggers auto trackParPos = getTrackPar(trackPos); auto trackParNeg = getTrackPar(trackNeg); - o2::gpu::gpustd::array dcaPos{trackPos.dcaXY(), trackPos.dcaZ()}; - o2::gpu::gpustd::array dcaNeg{trackNeg.dcaXY(), trackNeg.dcaZ()}; + std::array dcaPos{trackPos.dcaXY(), trackPos.dcaZ()}; + std::array dcaNeg{trackNeg.dcaXY(), trackNeg.dcaZ()}; std::array pVecPos{trackPos.pVector()}; std::array pVecNeg{trackNeg.pVector()}; if (trackPos.collisionId() != thisCollId) { @@ -218,7 +218,7 @@ struct HfFilterCharmHadronSignals { // Main struct for HF triggers } auto trackParThird = getTrackPar(track); - o2::gpu::gpustd::array dcaThird{track.dcaXY(), track.dcaZ()}; + std::array dcaThird{track.dcaXY(), track.dcaZ()}; std::array pVecThird = track.pVector(); if (track.collisionId() != thisCollId) { o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParThird, 2.f, noMatCorr, &dcaThird); @@ -268,9 +268,9 @@ struct HfFilterCharmHadronSignals { // Main struct for HF triggers auto trackParFirst = getTrackPar(trackFirst); auto trackParSecond = getTrackPar(trackSecond); auto trackParThird = getTrackPar(trackThird); - o2::gpu::gpustd::array dcaFirst{trackFirst.dcaXY(), trackFirst.dcaZ()}; - o2::gpu::gpustd::array dcaSecond{trackSecond.dcaXY(), trackSecond.dcaZ()}; - o2::gpu::gpustd::array dcaThird{trackThird.dcaXY(), trackThird.dcaZ()}; + std::array dcaFirst{trackFirst.dcaXY(), trackFirst.dcaZ()}; + std::array dcaSecond{trackSecond.dcaXY(), trackSecond.dcaZ()}; + std::array dcaThird{trackThird.dcaXY(), trackThird.dcaZ()}; std::array pVecFirst = trackFirst.pVector(); std::array pVecSecond = trackSecond.pVector(); std::array pVecThird = trackThird.pVector(); diff --git a/EventFiltering/PWGHF/HFFilterHelpers.h b/EventFiltering/PWGHF/HFFilterHelpers.h index 798a96b1ec7..6135e0a715d 100644 --- a/EventFiltering/PWGHF/HFFilterHelpers.h +++ b/EventFiltering/PWGHF/HFFilterHelpers.h @@ -2585,7 +2585,7 @@ inline bool HfFilterHelper::buildV0(V const& v0Indices, T const& tracks, C const auto trackParCovPos = getTrackParCov(trackPos); auto trackParCovNeg = getTrackParCov(trackNeg); std::array primVtx = {collision.posX(), collision.posY(), collision.posZ()}; - gpu::gpustd::array dcaInfoPos, dcaInfoNeg; + std::array dcaInfoPos, dcaInfoNeg; o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParCovPos, 2.f, dcaFitter.getMatCorrType(), &dcaInfoPos); o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParCovNeg, 2.f, dcaFitter.getMatCorrType(), &dcaInfoNeg); @@ -2655,7 +2655,7 @@ inline bool HfFilterHelper::buildV0(V const& v0Indices, T const& tracks, C const auto trackParV0 = dcaFitter.createParentTrackParCov(); trackParV0.setAbsCharge(0); trackParV0.setPID(o2::track::PID::K0); - gpu::gpustd::array dcaInfoV0; + std::array dcaInfoV0; o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParV0, 2.f, dcaFitter.getMatCorrType(), &dcaInfoV0); v0Cand.dcav0topv = dcaInfoV0[0]; @@ -2707,7 +2707,7 @@ inline bool HfFilterHelper::buildCascade(Casc const& cascIndices, V const& v0Ind return false; } - gpu::gpustd::array dcaInfoBach; + std::array dcaInfoBach; auto bachTrackParCov = getTrackParCov(trackBachelor); o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, bachTrackParCov, 2.f, dcaFitter.getMatCorrType(), &dcaInfoBach); @@ -2781,7 +2781,7 @@ inline bool HfFilterHelper::buildCascade(Casc const& cascIndices, V const& v0Ind auto trackParCasc = dcaFitter.createParentTrackParCov(); trackParCasc.setAbsCharge(1); trackParCasc.setPID(o2::track::PID::XiMinus); - gpu::gpustd::array dcaInfoCasc; + std::array dcaInfoCasc; o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParCasc, 2.f, dcaFitter.getMatCorrType(), &dcaInfoCasc); cascCand.dcaXYCascToPV = dcaInfoCasc[0]; cascCand.dcacascdaughters = std::sqrt(dcaFitter.getChi2AtPCACandidate()); diff --git a/EventFiltering/PWGHF/HFFilterPrepareMLSamples.cxx b/EventFiltering/PWGHF/HFFilterPrepareMLSamples.cxx index fd4cf6dba7e..39e903e9f60 100644 --- a/EventFiltering/PWGHF/HFFilterPrepareMLSamples.cxx +++ b/EventFiltering/PWGHF/HFFilterPrepareMLSamples.cxx @@ -114,8 +114,8 @@ struct HfFilterPrepareMlSamples { // Main struct auto trackParPos = getTrackPar(trackPos); auto trackParNeg = getTrackPar(trackNeg); - o2::gpu::gpustd::array dcaPos{trackPos.dcaXY(), trackPos.dcaZ()}; - o2::gpu::gpustd::array dcaNeg{trackNeg.dcaXY(), trackNeg.dcaZ()}; + std::array dcaPos{trackPos.dcaXY(), trackPos.dcaZ()}; + std::array dcaNeg{trackNeg.dcaXY(), trackNeg.dcaZ()}; std::array pVecPos{trackPos.pVector()}; std::array pVecNeg{trackNeg.pVector()}; if (trackPos.collisionId() != thisCollId) { @@ -171,9 +171,9 @@ struct HfFilterPrepareMlSamples { // Main struct auto trackParFirst = getTrackPar(trackFirst); auto trackParSecond = getTrackPar(trackSecond); auto trackParThird = getTrackPar(trackThird); - o2::gpu::gpustd::array dcaFirst{trackFirst.dcaXY(), trackFirst.dcaZ()}; - o2::gpu::gpustd::array dcaSecond{trackSecond.dcaXY(), trackSecond.dcaZ()}; - o2::gpu::gpustd::array dcaThird{trackThird.dcaXY(), trackThird.dcaZ()}; + std::array dcaFirst{trackFirst.dcaXY(), trackFirst.dcaZ()}; + std::array dcaSecond{trackSecond.dcaXY(), trackSecond.dcaZ()}; + std::array dcaThird{trackThird.dcaXY(), trackThird.dcaZ()}; std::array pVecFirst{trackFirst.pVector()}; std::array pVecSecond{trackSecond.pVector()}; std::array pVecThird{trackThird.pVector()}; @@ -248,8 +248,8 @@ struct HfFilterPrepareMlSamples { // Main struct auto trackParPos = getTrackPar(trackPos); auto trackParNeg = getTrackPar(trackNeg); - o2::gpu::gpustd::array dcaPos{trackPos.dcaXY(), trackPos.dcaZ()}; - o2::gpu::gpustd::array dcaNeg{trackNeg.dcaXY(), trackNeg.dcaZ()}; + std::array dcaPos{trackPos.dcaXY(), trackPos.dcaZ()}; + std::array dcaNeg{trackNeg.dcaXY(), trackNeg.dcaZ()}; std::array pVecPos{trackPos.pVector()}; std::array pVecNeg{trackNeg.pVector()}; if (trackPos.collisionId() != thisCollId) { @@ -323,9 +323,9 @@ struct HfFilterPrepareMlSamples { // Main struct auto trackParFirst = getTrackPar(trackFirst); auto trackParSecond = getTrackPar(trackSecond); auto trackParThird = getTrackPar(trackThird); - o2::gpu::gpustd::array dcaFirst{trackFirst.dcaXY(), trackFirst.dcaZ()}; - o2::gpu::gpustd::array dcaSecond{trackSecond.dcaXY(), trackSecond.dcaZ()}; - o2::gpu::gpustd::array dcaThird{trackThird.dcaXY(), trackThird.dcaZ()}; + std::array dcaFirst{trackFirst.dcaXY(), trackFirst.dcaZ()}; + std::array dcaSecond{trackSecond.dcaXY(), trackSecond.dcaZ()}; + std::array dcaThird{trackThird.dcaXY(), trackThird.dcaZ()}; std::array pVecFirst{trackFirst.pVector()}; std::array pVecSecond{trackSecond.pVector()}; std::array pVecThird{trackThird.pVector()}; diff --git a/EventFiltering/PWGLF/nucleiFilter.cxx b/EventFiltering/PWGLF/nucleiFilter.cxx index 1c319a949f5..54f3ed507ad 100644 --- a/EventFiltering/PWGLF/nucleiFilter.cxx +++ b/EventFiltering/PWGLF/nucleiFilter.cxx @@ -491,9 +491,9 @@ struct nucleiFilter { vtxXYZ[1] -= collision.posY(); vtxXYZ[2] -= collision.posZ(); - o2::gpu::gpustd::array momHe3 = {0.}; - o2::gpu::gpustd::array momPi = {0.}; - o2::gpu::gpustd::array momTot = {0.}; + std::array momHe3 = {0.}; + std::array momPi = {0.}; + std::array momTot = {0.}; auto& hePropTrack = fitter2body.getTrack(0); auto& piPropTrack = fitter2body.getTrack(1); hePropTrack.getPxPyPzGlo(momHe3); @@ -590,7 +590,7 @@ struct nucleiFilter { } // Calculate DCA with respect to the collision associated to the SV, not individual tracks - gpu::gpustd::array dcaInfo; + std::array dcaInfo; auto track0Par = getTrackPar(track0); o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, track0Par, 2.f, fitter3body.getMatCorrType(), &dcaInfo); diff --git a/PWGEM/Dilepton/TableProducer/filterDielectronEvent.cxx b/PWGEM/Dilepton/TableProducer/filterDielectronEvent.cxx index 69dc9ad0b2b..b0332194b55 100644 --- a/PWGEM/Dilepton/TableProducer/filterDielectronEvent.cxx +++ b/PWGEM/Dilepton/TableProducer/filterDielectronEvent.cxx @@ -241,7 +241,7 @@ struct filterDielectronEvent { return false; } - gpu::gpustd::array dcaInfo; + std::array dcaInfo; auto track_par_cov_recalc = getTrackParCov(track); track_par_cov_recalc.setPID(o2::track::PID::Electron); // std::array pVec_recalc = {0, 0, 0}; // px, py, pz @@ -313,7 +313,7 @@ struct filterDielectronEvent { void fillTrackTable(TCollision const& collision, TTrack const& track) { if (std::find(stored_trackIds.begin(), stored_trackIds.end(), std::pair{collision.globalIndex(), track.globalIndex()}) == stored_trackIds.end()) { - gpu::gpustd::array dcaInfo; + std::array dcaInfo; auto track_par_cov_recalc = getTrackParCov(track); track_par_cov_recalc.setPID(o2::track::PID::Electron); // std::array pVec_recalc = {0, 0, 0}; // px, py, pz @@ -405,7 +405,7 @@ struct filterDielectronEvent { template o2::track::TrackParCov propagateTrack(TCollision const& collision, TTrack const& track) { - gpu::gpustd::array dcaInfo; + std::array dcaInfo; auto track_par_cov_recalc = getTrackParCov(track); track_par_cov_recalc.setPID(o2::track::PID::Electron); // std::array pVec_recalc = {0, 0, 0}; // px, py, pz @@ -1266,7 +1266,7 @@ struct prefilterPrimaryElectron { return false; } - gpu::gpustd::array dcaInfo; + std::array dcaInfo; auto track_par_cov_recalc = getTrackParCov(track); // std::array pVec_recalc = {0, 0, 0}; // px, py, pz o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, track_par_cov_recalc, 2.f, matCorr, &dcaInfo); diff --git a/PWGEM/Dilepton/TableProducer/skimmerSecondaryElectron.cxx b/PWGEM/Dilepton/TableProducer/skimmerSecondaryElectron.cxx index ecb138b57c9..837fd99b3d4 100644 --- a/PWGEM/Dilepton/TableProducer/skimmerSecondaryElectron.cxx +++ b/PWGEM/Dilepton/TableProducer/skimmerSecondaryElectron.cxx @@ -242,7 +242,7 @@ struct skimmerSecondaryElectron { void fillTrackTable(TCollision const& collision, TTrack const& track) { if (std::find(stored_trackIds.begin(), stored_trackIds.end(), std::pair{collision.globalIndex(), track.globalIndex()}) == stored_trackIds.end()) { - gpu::gpustd::array dcaInfo; + std::array dcaInfo; auto track_par_cov_recalc = getTrackParCov(track); track_par_cov_recalc.setPID(o2::track::PID::Electron); std::array pVec_recalc = {0, 0, 0}; // px, py, pz diff --git a/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx b/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx index b8c46daa494..7c98bd33d95 100644 --- a/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx +++ b/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx @@ -412,7 +412,7 @@ struct PhotonConversionBuilder { // } // Calculate DCA with respect to the collision associated to the v0, not individual tracks - gpu::gpustd::array dcaInfo; + std::array dcaInfo; auto pTrack = getTrackParCov(pos); if (moveTPCTracks && isTPConlyTrack(pos) && !mVDriftMgr.moveTPCTrack(collision, pos, pTrack)) { diff --git a/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx b/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx index 496f5b5f55f..8eac85d1878 100644 --- a/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx +++ b/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx @@ -1126,7 +1126,7 @@ struct HfDataCreatorCharmHadPiReduced { // apply selections on pion tracks auto trackParCovPion = getTrackParCov(trackPion); - o2::gpu::gpustd::array dcaPion{trackPion.dcaXY(), trackPion.dcaZ()}; + std::array dcaPion{trackPion.dcaXY(), trackPion.dcaZ()}; std::array pVecPion = trackPion.pVector(); if (trackPion.collisionId() != thisCollId) { o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParCovPion, 2.f, noMatCorr, &dcaPion); diff --git a/PWGHF/D2H/TableProducer/dataCreatorCharmResoReduced.cxx b/PWGHF/D2H/TableProducer/dataCreatorCharmResoReduced.cxx index d11a2db65d6..3dc7cdcb08c 100644 --- a/PWGHF/D2H/TableProducer/dataCreatorCharmResoReduced.cxx +++ b/PWGHF/D2H/TableProducer/dataCreatorCharmResoReduced.cxx @@ -364,7 +364,7 @@ struct HfDataCreatorCharmResoReduced { if (!selectV0Daughter(trackPos, dDaughtersIds) || !selectV0Daughter(trackNeg, dDaughtersIds)) return false; // daughters DCA to V0's collision primary vertex - gpu::gpustd::array dcaInfo; + std::array dcaInfo; auto trackPosPar = getTrackPar(trackPos); o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackPosPar, 2.f, fitter.getMatCorrType(), &dcaInfo); auto trackPosDcaXY = dcaInfo[0]; @@ -860,7 +860,7 @@ struct HfDataCreatorCharmResoReduced { // propagate V0 to primary vertex (if enabled) if (propagateV0toPV) { std::array pVecV0Orig = {candidateV0.mom[0], candidateV0.mom[1], candidateV0.mom[2]}; - gpu::gpustd::array dcaInfo; + std::array dcaInfo; auto trackParK0 = o2::track::TrackPar(candidateV0.pos, pVecV0Orig, 0, true); trackParK0.setPID(o2::track::PID::K0); trackParK0.setAbsCharge(0); @@ -942,7 +942,7 @@ struct HfDataCreatorCharmResoReduced { // if the track has been reassociated, re-propagate it to PV (minor difference) auto trackParCovTrack = getTrackParCov(track); - o2::gpu::gpustd::array dcaTrack{track.dcaXY(), track.dcaZ()}; + std::array dcaTrack{track.dcaXY(), track.dcaZ()}; std::array pVecTrack = track.pVector(); if (track.collisionId() != collision.globalIndex()) { o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParCovTrack, 2.f, matCorr, &dcaTrack); diff --git a/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx b/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx index 4df8dabd859..b87c879d7e8 100644 --- a/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx +++ b/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx @@ -293,7 +293,7 @@ struct HfCandidateCreatorSigmac0plusplus { auto bc = collision.bc_as(); initCCDB(bc, runNumber, ccdb, isRun2Ccdb ? ccdbPathGrp : ccdbPathGrpMag, lut, isRun2Ccdb); auto trackParSoftPi = getTrackPar(trackSoftPi); - o2::gpu::gpustd::array dcaInfo{-999., -999.}; + std::array dcaInfo{-999., -999.}; o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParSoftPi, 2.f, noMatCorr, &dcaInfo); if (std::abs(dcaInfo[0]) > softPiDcaXYMax || std::abs(dcaInfo[1]) > softPiDcaZMax) { return; diff --git a/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx b/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx index 0e977c5143e..b8d114a6583 100644 --- a/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx +++ b/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx @@ -971,9 +971,9 @@ struct HfCandidateCreatorXic0Omegac0 { kfVertex.GetCovarianceMatrix(covMatrixPV); // impact parameters - gpu::gpustd::array impactParameterV0Dau0; - gpu::gpustd::array impactParameterV0Dau1; - gpu::gpustd::array impactParameterKaFromCasc; + std::array impactParameterV0Dau0; + std::array impactParameterV0Dau1; + std::array impactParameterKaFromCasc; o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParCovV0Dau0, 2.f, matCorr, &impactParameterV0Dau0); o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParCovV0Dau1, 2.f, matCorr, &impactParameterV0Dau1); o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, omegaDauChargedTrackParCov, 2.f, matCorr, &impactParameterKaFromCasc); @@ -1443,9 +1443,9 @@ struct HfCandidateCreatorXic0Omegac0 { kfVertex.GetCovarianceMatrix(covMatrixPV); // impact parameters - gpu::gpustd::array impactParameterV0Dau0; - gpu::gpustd::array impactParameterV0Dau1; - gpu::gpustd::array impactParameterKaFromCasc; + std::array impactParameterV0Dau0; + std::array impactParameterV0Dau1; + std::array impactParameterKaFromCasc; o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParCovV0Dau0, 2.f, matCorr, &impactParameterV0Dau0); o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParCovV0Dau1, 2.f, matCorr, &impactParameterV0Dau1); o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, xiDauChargedTrackParCov, 2.f, matCorr, &impactParameterKaFromCasc); diff --git a/PWGHF/TableProducer/trackIndexSkimCreator.cxx b/PWGHF/TableProducer/trackIndexSkimCreator.cxx index d5994cfbad3..c84a0c11c10 100644 --- a/PWGHF/TableProducer/trackIndexSkimCreator.cxx +++ b/PWGHF/TableProducer/trackIndexSkimCreator.cxx @@ -813,7 +813,7 @@ struct HfTrackIndexSkimCreatorTagSelTracks { /// Track propagation to the PV refit considering also the material budget /// Mandatory for tracks updated at most only to the innermost ITS layer auto trackPar = getTrackPar(trackToRemove); - o2::gpu::gpustd::array dcaInfo{-999., -999.}; + std::array dcaInfo{-999., -999.}; if (o2::base::Propagator::Instance()->propagateToDCABxByBz({primVtxBaseRecalc.getX(), primVtxBaseRecalc.getY(), primVtxBaseRecalc.getZ()}, trackPar, 2.f, noMatCorr, &dcaInfo)) { pvCoord[0] = primVtxBaseRecalc.getX(); pvCoord[1] = primVtxBaseRecalc.getY(); @@ -916,7 +916,7 @@ struct HfTrackIndexSkimCreatorTagSelTracks { auto bc = collision.bc_as(); initCCDB(bc, runNumber, ccdb, config.isRun2 ? config.ccdbPathGrp : config.ccdbPathGrpMag, lut, config.isRun2); auto trackPar = getTrackPar(track); - o2::gpu::gpustd::array dcaInfo{-999., -999.}; + std::array dcaInfo{-999., -999.}; o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackPar, 2.f, noMatCorr, &dcaInfo); trackPt = trackPar.getPt(); trackEta = trackPar.getEta(); @@ -2121,7 +2121,7 @@ struct HfTrackIndexSkimCreator { auto trackParVarPos1 = getTrackParCov(trackPos1); std::array pVecTrackPos1{trackPos1.pVector()}; - o2::gpu::gpustd::array dcaInfoPos1{trackPos1.dcaXY(), trackPos1.dcaZ()}; + std::array dcaInfoPos1{trackPos1.dcaXY(), trackPos1.dcaZ()}; if (thisCollId != trackPos1.collisionId()) { // this is not the "default" collision for this track, we have to re-propagate it o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParVarPos1, 2.f, noMatCorr, &dcaInfoPos1); getPxPyPz(trackParVarPos1, pVecTrackPos1); @@ -2139,7 +2139,7 @@ struct HfTrackIndexSkimCreator { auto trackParVarNeg1 = getTrackParCov(trackNeg1); std::array pVecTrackNeg1{trackNeg1.pVector()}; - o2::gpu::gpustd::array dcaInfoNeg1{trackNeg1.dcaXY(), trackNeg1.dcaZ()}; + std::array dcaInfoNeg1{trackNeg1.dcaXY(), trackNeg1.dcaZ()}; if (thisCollId != trackNeg1.collisionId()) { // this is not the "default" collision for this track, we have to re-propagate it o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParVarNeg1, 2.f, noMatCorr, &dcaInfoNeg1); getPxPyPz(trackParVarNeg1, pVecTrackNeg1); @@ -2373,7 +2373,7 @@ struct HfTrackIndexSkimCreator { auto trackPos2 = trackIndexPos2.template track_as(); auto trackParVarPos2 = getTrackParCov(trackPos2); - o2::gpu::gpustd::array dcaInfoPos2{trackPos2.dcaXY(), trackPos2.dcaZ()}; + std::array dcaInfoPos2{trackPos2.dcaXY(), trackPos2.dcaZ()}; // preselection of 3-prong candidates if (isSelected3ProngCand) { @@ -2625,7 +2625,7 @@ struct HfTrackIndexSkimCreator { auto trackNeg2 = trackIndexNeg2.template track_as(); auto trackParVarNeg2 = getTrackParCov(trackNeg2); - o2::gpu::gpustd::array dcaInfoNeg2{trackNeg2.dcaXY(), trackNeg2.dcaZ()}; + std::array dcaInfoNeg2{trackNeg2.dcaXY(), trackNeg2.dcaZ()}; // preselection of 3-prong candidates if (isSelected3ProngCand) { @@ -2869,7 +2869,7 @@ struct HfTrackIndexSkimCreator { std::array pVecTrackPos2{trackPos2.pVector()}; if (thisCollId != trackPos2.collisionId()) { // this is not the "default" collision for this track, we have to re-propagate it auto trackParVarPos2 = getTrackParCov(trackPos2); - o2::gpu::gpustd::array dcaInfoPos2{trackPos2.dcaXY(), trackPos2.dcaZ()}; + std::array dcaInfoPos2{trackPos2.dcaXY(), trackPos2.dcaZ()}; o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParVarPos2, 2.f, noMatCorr, &dcaInfoPos2); getPxPyPz(trackParVarPos2, pVecTrackPos2); } @@ -2906,7 +2906,7 @@ struct HfTrackIndexSkimCreator { std::array pVecTrackNeg2{trackNeg2.pVector()}; if (thisCollId != trackNeg2.collisionId()) { // this is not the "default" collision for this track, we have to re-propagate it auto trackParVarNeg2 = getTrackParCov(trackNeg2); - o2::gpu::gpustd::array dcaInfoNeg2{trackNeg2.dcaXY(), trackNeg2.dcaZ()}; + std::array dcaInfoNeg2{trackNeg2.dcaXY(), trackNeg2.dcaZ()}; o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParVarNeg2, 2.f, noMatCorr, &dcaInfoNeg2); getPxPyPz(trackParVarNeg2, pVecTrackNeg2); } @@ -3135,7 +3135,7 @@ struct HfTrackIndexSkimCreatorCascades { std::array pVecBach{bach.pVector()}; auto trackBach = getTrackParCov(bach); if (thisCollId != bach.collisionId()) { // this is not the "default" collision for this track, we have to re-propagate it - o2::gpu::gpustd::array dcaInfoBach{bach.dcaXY(), bach.dcaZ()}; + std::array dcaInfoBach{bach.dcaXY(), bach.dcaZ()}; o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackBach, 2.f, noMatCorr, &dcaInfoBach); getPxPyPz(trackBach, pVecBach); } diff --git a/PWGLF/TableProducer/Common/kinkBuilder.cxx b/PWGLF/TableProducer/Common/kinkBuilder.cxx index 8d88c70a746..f51e1ba1599 100644 --- a/PWGLF/TableProducer/Common/kinkBuilder.cxx +++ b/PWGLF/TableProducer/Common/kinkBuilder.cxx @@ -286,7 +286,7 @@ struct kinkBuilder { o2::base::Propagator::Instance()->PropagateToXBxByBz(trackParCovMoth, LayerRadii[trackMoth.itsNCls() - 1]); o2::track::TrackParCov trackParCovMothPV = getTrackParCov(trackMoth); - gpu::gpustd::array dcaInfoMoth; + std::array dcaInfoMoth; o2::base::Propagator::Instance()->propagateToDCABxByBz({primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ()}, trackParCovMothPV, 2.f, static_cast(cfgMaterialCorrection.value), &dcaInfoMoth); if (std::abs(dcaInfoMoth[0]) > maxDCAMothToPV) { @@ -305,7 +305,7 @@ struct kinkBuilder { } // propagate to PV - gpu::gpustd::array dcaInfoDaug; + std::array dcaInfoDaug; o2::base::Propagator::Instance()->propagateToDCABxByBz({primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ()}, trackParCovDaug, 2.f, static_cast(cfgMaterialCorrection.value), &dcaInfoDaug); if (std::abs(dcaInfoDaug[0]) < minDCADaugToPV) { continue; diff --git a/PWGLF/TableProducer/Nuspex/LFTreeCreatorClusterStudies.cxx b/PWGLF/TableProducer/Nuspex/LFTreeCreatorClusterStudies.cxx index 237b4538a2d..d8df6f0bbf6 100644 --- a/PWGLF/TableProducer/Nuspex/LFTreeCreatorClusterStudies.cxx +++ b/PWGLF/TableProducer/Nuspex/LFTreeCreatorClusterStudies.cxx @@ -331,7 +331,7 @@ struct LfTreeCreatorClusterStudies { } template - float dcaToPV(const std::array& PV, T& trackParCov, gpu::gpustd::array& dcaInfo) + float dcaToPV(const std::array& PV, T& trackParCov, std::array& dcaInfo) { o2::base::Propagator::Instance()->propagateToDCABxByBz({PV[0], PV[1], PV[2]}, trackParCov, 2.f, m_fitter.getMatCorrType(), &dcaInfo); return std::hypot(dcaInfo[0], dcaInfo[1]); @@ -605,7 +605,7 @@ struct LfTreeCreatorClusterStudies { float qtAP = computeQtAP(momMother, momPos); m_hAnalysis.fill(HIST("armenteros_plot_before_selections"), alphaAP, qtAP); - gpu::gpustd::array dcaInfo; + std::array dcaInfo; V0TrackParCov v0TrackParCov{v0.globalIndex(), m_fitter.createParentTrackParCov()}; float dcaV0daughters = std::sqrt(std::abs(m_fitter.getChi2AtPCACandidate())); float radiusV0 = std::hypot(decayVtx[0], decayVtx[1]); @@ -866,7 +866,7 @@ struct LfTreeCreatorClusterStudies { if (!qualitySelectionCascade(dcaV0daughters, cosPA)) { return; } - // gpu::gpustd::array dcaInfo; + // std::array dcaInfo; // float dcaToPVbachelor = dcaToPV(PV, bachelorTrackCovariance, dcaInfo); float massXi = computeMassMother(o2::constants::physics::MassLambda0, o2::constants::physics::MassPionCharged, momV0, momBachelor, momMother); diff --git a/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx b/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx index e4d05bbacd5..b7b643bca21 100644 --- a/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx +++ b/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx @@ -824,7 +824,7 @@ struct decay3bodyBuilder { registry.fill(HIST("hVtx3BodyCounter"), kVtxPIDCut); // Calculate DCA with respect to the collision associated to the V0, not individual tracks - gpu::gpustd::array dcaInfo; + std::array dcaInfo; auto Track0Par = getTrackPar(t0); o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, Track0Par, 2.f, fitter3body.getMatCorrType(), &dcaInfo); diff --git a/PWGLF/TableProducer/Nuspex/ebyeMaker.cxx b/PWGLF/TableProducer/Nuspex/ebyeMaker.cxx index e69142e2bbd..be6be00f699 100644 --- a/PWGLF/TableProducer/Nuspex/ebyeMaker.cxx +++ b/PWGLF/TableProducer/Nuspex/ebyeMaker.cxx @@ -670,7 +670,7 @@ struct EbyeMaker { candidateTracks[1].clear(); candidateV0s.clear(); - gpu::gpustd::array dcaInfo; + std::array dcaInfo; uint8_t nTracklets[2]{0, 0}; uint8_t nTracks{0}; const float tklEtaCuts[]{1.2, 0.6, 0.7}; diff --git a/PWGLF/TableProducer/Nuspex/hyhe4builder.cxx b/PWGLF/TableProducer/Nuspex/hyhe4builder.cxx index ea733209de8..66fe812f7a2 100644 --- a/PWGLF/TableProducer/Nuspex/hyhe4builder.cxx +++ b/PWGLF/TableProducer/Nuspex/hyhe4builder.cxx @@ -249,7 +249,7 @@ struct hyhefourbuilder { //---/---/---/---/---/---/---/---/---/---/---/---/---/ // Calculate DCA with respect to the collision associated to the V0, not individual tracks - gpu::gpustd::array dcaInfo; + std::array dcaInfo; o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, lHelium3TrackForDCA, 2.f, fitter.getMatCorrType(), &dcaInfo); hyHe4Candidate.dcaXY3He = dcaInfo[0]; o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, lProtonTrackForDCA, 2.f, fitter.getMatCorrType(), &dcaInfo); diff --git a/PWGLF/TableProducer/Nuspex/hyperRecoTask.cxx b/PWGLF/TableProducer/Nuspex/hyperRecoTask.cxx index d5141f1b3e2..09ed3ec07b8 100644 --- a/PWGLF/TableProducer/Nuspex/hyperRecoTask.cxx +++ b/PWGLF/TableProducer/Nuspex/hyperRecoTask.cxx @@ -507,7 +507,7 @@ struct hyperRecoTask { } // if survived all selections, propagate decay daughters to PV - gpu::gpustd::array dcaInfo; + std::array dcaInfo; o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, heTrackCov, 2.f, fitter.getMatCorrType(), &dcaInfo); hypCand.he3DCAXY = dcaInfo[0]; o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, piTrackCov, 2.f, fitter.getMatCorrType(), &dcaInfo); diff --git a/PWGLF/TableProducer/Nuspex/hypertriton3bodyfinder.cxx b/PWGLF/TableProducer/Nuspex/hypertriton3bodyfinder.cxx index 40019d82533..bad62accce2 100644 --- a/PWGLF/TableProducer/Nuspex/hypertriton3bodyfinder.cxx +++ b/PWGLF/TableProducer/Nuspex/hypertriton3bodyfinder.cxx @@ -682,7 +682,7 @@ struct hypertriton3bodyFinder { FillVtxCounter(kVtxDcaDau, isTrue3bodyVtx); // Calculate DCA with respect to the collision associated to the V0, not individual tracks - gpu::gpustd::array dcaInfo; + std::array dcaInfo; auto Track0Par = getTrackPar(dPtrack); o2::base::Propagator::Instance()->propagateToDCABxByBz({dCollision.posX(), dCollision.posY(), dCollision.posZ()}, Track0Par, 2.f, fitter3body.getMatCorrType(), &dcaInfo); diff --git a/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx b/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx index c84a4c95dcb..e607057e5c6 100644 --- a/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx +++ b/PWGLF/TableProducer/Nuspex/lnnRecoTask.cxx @@ -508,7 +508,7 @@ struct lnnRecoTask { } // if survived all selections, propagate decay daughters to PV - gpu::gpustd::array dcaInfo; + std::array dcaInfo; o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, h3PropTrack, 2.f, fitter.getMatCorrType(), &dcaInfo); lnnCand.h3DCAXY = dcaInfo[0]; diff --git a/PWGLF/TableProducer/Nuspex/nucleiFlowTree.cxx b/PWGLF/TableProducer/Nuspex/nucleiFlowTree.cxx index 85dea6f7ac0..68c9b7ac91d 100644 --- a/PWGLF/TableProducer/Nuspex/nucleiFlowTree.cxx +++ b/PWGLF/TableProducer/Nuspex/nucleiFlowTree.cxx @@ -347,7 +347,7 @@ struct nucleiFlowTree { setTrackParCov(track, mTrackParCov); mTrackParCov.setPID(track.pidForTracking()); - gpu::gpustd::array dcaInfo; + std::array dcaInfo; o2::base::Propagator::Instance()->propagateToDCA(collVtx, mTrackParCov, mBz, 2.f, static_cast(cfgMaterialCorrection.value), &dcaInfo); float beta{o2::pid::tof::Beta::GetBeta(track)}; diff --git a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx index bc3ea5128f7..57796ba11af 100644 --- a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx +++ b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx @@ -676,7 +676,7 @@ struct nucleiSpectra { } } - gpu::gpustd::array dcaInfo; + std::array dcaInfo; o2::base::Propagator::Instance()->propagateToDCA(collVtx, mTrackParCov, mBz, 2.f, static_cast(cfgMaterialCorrection.value), &dcaInfo); float beta{o2::pid::tof::Beta::GetBeta(track)}; diff --git a/PWGLF/TableProducer/Strangeness/LFStrangeTreeCreator.cxx b/PWGLF/TableProducer/Strangeness/LFStrangeTreeCreator.cxx index fd5f225ea99..955b4ebc142 100644 --- a/PWGLF/TableProducer/Strangeness/LFStrangeTreeCreator.cxx +++ b/PWGLF/TableProducer/Strangeness/LFStrangeTreeCreator.cxx @@ -288,7 +288,7 @@ struct LFStrangeTreeCreator { { candidateV0s.clear(); - gpu::gpustd::array dcaInfo; + std::array dcaInfo; for (const auto& v0 : V0s) { auto posTrack = v0.posTrack_as(); diff --git a/PWGLF/TableProducer/Strangeness/cascadebuilder.cxx b/PWGLF/TableProducer/Strangeness/cascadebuilder.cxx index 8aeb741bff7..453072b6b30 100644 --- a/PWGLF/TableProducer/Strangeness/cascadebuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/cascadebuilder.cxx @@ -862,8 +862,8 @@ struct cascadeBuilder { // from Carolina Reetz (thank you!) o2::track::TrackParCov getTrackParCovFromKFP(const KFParticle& kfParticle, const o2::track::PID pid, const int sign) { - o2::gpu::gpustd::array xyz, pxpypz; - o2::gpu::gpustd::array cv; + std::array xyz, pxpypz; + std::array cv; // get parameters from kfParticle xyz[0] = kfParticle.GetX(); @@ -909,7 +909,7 @@ struct cascadeBuilder { // Calculate DCAxy of the cascade (with bending) o2::track::TrackPar wrongV0 = fitter.createParentTrackPar(); wrongV0.setAbsCharge(0); // charge zero - gpu::gpustd::array dcaInfo; + std::array dcaInfo; dcaInfo[0] = 999; dcaInfo[1] = 999; @@ -989,7 +989,7 @@ struct cascadeBuilder { // bachelor DCA track to PV // Calculate DCA with respect to the collision associated to the V0, not individual tracks - gpu::gpustd::array dcaInfo; + std::array dcaInfo; auto bachTrackPar = getTrackPar(bachTrack); o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, bachTrackPar, 2.f, fitter.getMatCorrType(), &dcaInfo); @@ -1273,7 +1273,7 @@ struct cascadeBuilder { // bachelor DCA track to PV // Calculate DCA with respect to the collision associated to the V0, not individual tracks - gpu::gpustd::array dcaInfo; + std::array dcaInfo; auto bachTrackPar = getTrackPar(bachTrack); o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, bachTrackPar, 2.f, fitter.getMatCorrType(), &dcaInfo); @@ -1514,14 +1514,14 @@ struct cascadeBuilder { cascadecandidate.yOmega = KFOmega.GetRapidity(); // KF Cascade covariance matrix - o2::gpu::gpustd::array covCascKF; + std::array covCascKF; for (int i = 0; i < 21; i++) { // get covariance matrix elements (lower triangle) covCascKF[i] = KFXi.GetCovariance(i); cascadecandidate.kfCascadeCov[i] = covCascKF[i]; } // KF V0 covariance matrix - o2::gpu::gpustd::array covV0KF; + std::array covV0KF; for (int i = 0; i < 21; i++) { // get covariance matrix elements (lower triangle) covV0KF[i] = KFV0.GetCovariance(i); cascadecandidate.kfV0Cov[i] = covV0KF[i]; @@ -1839,7 +1839,7 @@ struct cascadeBuilder { auto cascadeTrack = trackedCascade.template track_as(); auto cascadeTrackPar = getTrackParCov(cascadeTrack); auto const& collision = cascade.collision(); - gpu::gpustd::array dcaInfo; + std::array dcaInfo; lCascadeTrack.setPID(o2::track::PID::XiMinus); // FIXME: not OK for omegas o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, cascadeTrackPar, 2.f, matCorrCascade, &dcaInfo); diff --git a/PWGLF/TableProducer/Strangeness/cascadefinder.cxx b/PWGLF/TableProducer/Strangeness/cascadefinder.cxx index a56b02666a1..fcb0479fca2 100644 --- a/PWGLF/TableProducer/Strangeness/cascadefinder.cxx +++ b/PWGLF/TableProducer/Strangeness/cascadefinder.cxx @@ -244,7 +244,7 @@ struct cascadefinder { auto lCascadeTrack = fitterCasc.createParentTrackPar(); lCascadeTrack.setAbsCharge(-1); // to be sure lCascadeTrack.setPID(o2::track::PID::XiMinus); // FIXME: not OK for omegas - gpu::gpustd::array dcaInfo; + std::array dcaInfo; dcaInfo[0] = 999; dcaInfo[1] = 999; @@ -334,7 +334,7 @@ struct cascadefinder { auto lCascadeTrack = fitterCasc.createParentTrackPar(); lCascadeTrack.setAbsCharge(+1); // to be sure lCascadeTrack.setPID(o2::track::PID::XiMinus); // FIXME: not OK for omegas - gpu::gpustd::array dcaInfo; + std::array dcaInfo; dcaInfo[0] = 999; dcaInfo[1] = 999; diff --git a/PWGLF/TableProducer/Strangeness/lambdakzerobuilder.cxx b/PWGLF/TableProducer/Strangeness/lambdakzerobuilder.cxx index c1de2354aa4..bcf2c1268e2 100644 --- a/PWGLF/TableProducer/Strangeness/lambdakzerobuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/lambdakzerobuilder.cxx @@ -838,7 +838,7 @@ struct lambdakzeroBuilder { statisticsRegistry.v0statsUnassociated[kV0TPCrefit]++; // Calculate DCA with respect to the collision associated to the V0, not individual tracks - gpu::gpustd::array dcaInfo; + std::array dcaInfo; auto posTrackPar = getTrackPar(posTrack); o2::base::Propagator::Instance()->propagateToDCABxByBz({primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ()}, posTrackPar, 2.f, fitter.getMatCorrType(), &dcaInfo); diff --git a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx index 3a6796c490f..cea901b0fb2 100644 --- a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx @@ -2195,7 +2195,7 @@ struct StrangenessBuilder { // recalculate DCAxy, DCAz with strange track auto strangeTrackParCov = getTrackParCov(strangeTrack); - gpu::gpustd::array dcaInfo; + std::array dcaInfo; strangeTrackParCov.setPID(o2::track::PID::XiMinus); // FIXME: not OK for omegas o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, strangeTrackParCov, 2.f, straHelper.fitter.getMatCorrType(), &dcaInfo); straHelper.cascade.cascadeDCAxy = dcaInfo[0]; diff --git a/PWGLF/Tasks/Nuspex/antidLambdaEbye.cxx b/PWGLF/Tasks/Nuspex/antidLambdaEbye.cxx index 7ee32edd1f8..baa91ce1b27 100644 --- a/PWGLF/Tasks/Nuspex/antidLambdaEbye.cxx +++ b/PWGLF/Tasks/Nuspex/antidLambdaEbye.cxx @@ -584,7 +584,7 @@ struct antidLambdaEbye { auto rnd = static_cast(gen32()) / static_cast(gen32.max()); auto subsample = static_cast(rnd * nSubsamples); - gpu::gpustd::array dcaInfo; + std::array dcaInfo; int nTracklets[2]{0, 0}; for (const auto& track : tracks) { diff --git a/PWGLF/Tasks/Nuspex/ebyeMult.cxx b/PWGLF/Tasks/Nuspex/ebyeMult.cxx index 7fc0ca8e941..63002a0ec31 100644 --- a/PWGLF/Tasks/Nuspex/ebyeMult.cxx +++ b/PWGLF/Tasks/Nuspex/ebyeMult.cxx @@ -329,7 +329,7 @@ struct EbyeMult { auto tracks = tracksAll.sliceBy(perCollisionTracksFull, collision.globalIndex()); candidateTracks.clear(); - gpu::gpustd::array dcaInfo; + std::array dcaInfo; int nTracklets[2]{0, 0}; int nTracks{0}; for (const auto& track : tracks) { diff --git a/PWGLF/Tasks/Nuspex/hypertritonAnalysis.cxx b/PWGLF/Tasks/Nuspex/hypertritonAnalysis.cxx index 8a296edc5b5..42470a606b0 100644 --- a/PWGLF/Tasks/Nuspex/hypertritonAnalysis.cxx +++ b/PWGLF/Tasks/Nuspex/hypertritonAnalysis.cxx @@ -218,7 +218,7 @@ struct hypertritonAnalysis { auto bc = collision.bc_as(); initCCDB(bc); - gpu::gpustd::array dcaInfo; + std::array dcaInfo; evselstats[kEvSelAll]++; if (event_sel8_selection && !collision.sel8()) { @@ -324,7 +324,7 @@ struct hypertritonAnalysis { auto bc = collision.bc_as(); initCCDB(bc); - gpu::gpustd::array dcaInfo; + std::array dcaInfo; evselstats[kEvSelAll]++; if (event_sel8_selection && !collision.sel8()) { diff --git a/PWGLF/Tasks/QC/efficiencyQA.cxx b/PWGLF/Tasks/QC/efficiencyQA.cxx index 62bfc4e1622..4a0257bb6e5 100644 --- a/PWGLF/Tasks/QC/efficiencyQA.cxx +++ b/PWGLF/Tasks/QC/efficiencyQA.cxx @@ -449,7 +449,7 @@ struct efficiencyQA { histos.fill(HIST("tagCuts"), 5., tagTrack.sign() * tagTrack.pt()); // if survived all selections, propagate decay daughters to PV - gpu::gpustd::array dcaInfo; + std::array dcaInfo; o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, tagTrackCov, 2.f, fitter.getMatCorrType(), &dcaInfo); float tagDcaXYZ = dcaInfo[0]; @@ -534,7 +534,7 @@ struct efficiencyQA { continue; } - gpu::gpustd::array dcaInfo; + std::array dcaInfo; auto tpcTrackCov = getTrackParCov(tpcTrack); if (propToTPCinnerWall) { o2::base::Propagator::Instance()->PropagateToXBxByBz(probeTrackCov, 70.f, 1.f, 2.f, fitter.getMatCorrType()); @@ -660,7 +660,7 @@ struct efficiencyQA { if (hasITS && !hasTPC) { auto tagTrack = tracks.rawIteratorAt(probeTrack.globalIndexTag); auto tagTrackCov = getTrackParCov(tagTrack); - gpu::gpustd::array dcaInfo; + std::array dcaInfo; o2::base::Propagator::Instance()->propagateToDCABxByBz({probeTrack.vtx0, probeTrack.vtx1, probeTrack.vtx2}, tagTrackCov, 2.f, fitter.getMatCorrType(), &dcaInfo); std::array momTag; tagTrackCov.getPxPyPzGlo(momTag); @@ -697,7 +697,7 @@ struct efficiencyQA { histos.fill(HIST("timeTpcItsNoNorm"), tdiff); auto trackCov = getTrackParCov(tpcTrack); - gpu::gpustd::array dcaInfo; + std::array dcaInfo; if (propToTPCinnerWall) { o2::base::Propagator::Instance()->PropagateToXBxByBz(trackCov, 70.f, 1.f, 2.f, fitter.getMatCorrType()); } else { @@ -848,7 +848,7 @@ struct efficiencyQA { const o2::math_utils::Point3D collVtx{collision.posX(), collision.posY(), collision.posZ()}; auto trackParCov = getTrackParCov(track); - gpu::gpustd::array dcaInfo; + std::array dcaInfo; o2::base::Propagator::Instance()->propagateToDCA(collVtx, trackParCov, d_bz, 2.f, static_cast(cfgMaterialCorrection.value), &dcaInfo); auto trackPt = track.sign() * trackParCov.getPt(); diff --git a/PWGLF/Utils/strangenessBuilderHelper.h b/PWGLF/Utils/strangenessBuilderHelper.h index ed92bf4f0b1..85257418e0a 100644 --- a/PWGLF/Utils/strangenessBuilderHelper.h +++ b/PWGLF/Utils/strangenessBuilderHelper.h @@ -305,7 +305,7 @@ class strangenessBuilderHelper } // Calculate DCA with respect to the collision associated to the V0 - gpu::gpustd::array dcaInfo; + std::array dcaInfo; // do DCA to PV on copies instead of originals auto positiveTrackParamCopy = positiveTrackParam; @@ -485,7 +485,7 @@ class strangenessBuilderHelper } // Calculate DCA with respect to the collision associated to the V0 - gpu::gpustd::array dcaInfo; + std::array dcaInfo; // do DCA to PV on copies instead of originals auto positiveTrackParamCopy = positiveTrackParam; @@ -713,7 +713,7 @@ class strangenessBuilderHelper // bachelor DCA track to PV // Calculate DCA with respect to the collision associated to the V0, not individual tracks - gpu::gpustd::array dcaInfo; + std::array dcaInfo; auto bachTrackPar = getTrackPar(bachelorTrack); o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, bachTrackPar, 2.f, fitter.getMatCorrType(), &dcaInfo); @@ -937,7 +937,7 @@ class strangenessBuilderHelper // bachelor DCA track to PV // Calculate DCA with respect to the collision associated to the V0, not individual tracks - gpu::gpustd::array dcaInfo; + std::array dcaInfo; auto bachTrackPar = getTrackPar(bachelorTrack); o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, bachTrackPar, 2.f, fitter.getMatCorrType(), &dcaInfo); @@ -1175,14 +1175,14 @@ class strangenessBuilderHelper cascade.massOmega = MOmega; // KF Cascade covariance matrix - o2::gpu::gpustd::array covCascKF; + std::array covCascKF; for (int i = 0; i < 21; i++) { // get covariance matrix elements (lower triangle) covCascKF[i] = KFXi.GetCovariance(i); cascade.covariance[i] = covCascKF[i]; } // KF V0 covariance matrix - o2::gpu::gpustd::array covV0KF; + std::array covV0KF; for (int i = 0; i < 21; i++) { // get covariance matrix elements (lower triangle) covV0KF[i] = KFV0.GetCovariance(i); cascade.kfTrackCovarianceV0[i] = covV0KF[i]; @@ -1259,7 +1259,7 @@ class strangenessBuilderHelper // Calculate DCAxy of the cascade (with bending) o2::track::TrackPar wrongV0 = fitter.createParentTrackPar(); wrongV0.setAbsCharge(0); // charge zero - gpu::gpustd::array dcaInfo; + std::array dcaInfo; dcaInfo[0] = 999; dcaInfo[1] = 999; diff --git a/PWGMM/Mult/TableProducer/trackPropagation.cxx b/PWGMM/Mult/TableProducer/trackPropagation.cxx index a1dffe08dbf..8eaa59e850b 100644 --- a/PWGMM/Mult/TableProducer/trackPropagation.cxx +++ b/PWGMM/Mult/TableProducer/trackPropagation.cxx @@ -150,7 +150,7 @@ struct AmbiguousTrackPropagation { auto bc = bcs.begin(); initCCDB(bc); - gpu::gpustd::array dcaInfo; + std::array dcaInfo; float bestDCA[2]; o2::track::TrackParametrization bestTrackPar; for (auto& track : tracks) { diff --git a/Tools/KFparticle/KFUtilities.h b/Tools/KFparticle/KFUtilities.h index e27b2340866..d1545e11651 100644 --- a/Tools/KFparticle/KFUtilities.h +++ b/Tools/KFparticle/KFUtilities.h @@ -156,8 +156,8 @@ KFParticle createKFParticleFromTrackParCov(const o2::track::TrackParametrization /// @return o2::track::TrackParametrizationWithError track o2::track::TrackParCov getTrackParCovFromKFP(const KFParticle& kfParticle, const o2::track::PID pid, const int sign) { - o2::gpu::gpustd::array xyz, pxpypz; - o2::gpu::gpustd::array cv; + std::array xyz, pxpypz; + std::array cv; // get parameters from kfParticle xyz[0] = kfParticle.GetX(); From 7d7dd1e7a1668966f7654b47fd4f8e83ebefd64b Mon Sep 17 00:00:00 2001 From: abmodak <67369858+abmodak@users.noreply.github.com> Date: Mon, 19 May 2025 12:01:25 +0200 Subject: [PATCH 1319/1650] [Common] Add PMD QA task (#11167) --- Common/DataModel/PmdTable.h | 36 ++++++++ Common/LegacyDataQA/CMakeLists.txt | 7 +- Common/LegacyDataQA/pmdQa.cxx | 133 +++++++++++++++++++++++++++++ 3 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 Common/DataModel/PmdTable.h create mode 100644 Common/LegacyDataQA/pmdQa.cxx diff --git a/Common/DataModel/PmdTable.h b/Common/DataModel/PmdTable.h new file mode 100644 index 00000000000..fe1cb14018e --- /dev/null +++ b/Common/DataModel/PmdTable.h @@ -0,0 +1,36 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// +/// \file PmdTable.h +/// +/// \brief pmd index table define +/// \author Abhi Modak (abhi.modak@cern.ch) +/// \since May 17, 2025 + +#ifndef COMMON_DATAMODEL_PMDTABLE_H_ +#define COMMON_DATAMODEL_PMDTABLE_H_ + +#include "Framework/AnalysisDataModel.h" + +namespace o2::aod +{ +namespace pmdtrack +{ +DECLARE_SOA_INDEX_COLUMN(Collision, collision); +DECLARE_SOA_ARRAY_INDEX_COLUMN(Collision, collisions); +DECLARE_SOA_INDEX_COLUMN(BC, bc); +DECLARE_SOA_SLICE_INDEX_COLUMN(Pmd, pmd); +} // namespace pmdtrack + +DECLARE_SOA_INDEX_TABLE_USER(PMDTracksIndex, BCs, "PMDTRKIDX", pmdtrack::CollisionId, pmdtrack::BCId, pmdtrack::PmdIdSlice); +} // namespace o2::aod + +#endif // COMMON_DATAMODEL_PMDTABLE_H_ diff --git a/Common/LegacyDataQA/CMakeLists.txt b/Common/LegacyDataQA/CMakeLists.txt index c40882e2376..08817428042 100644 --- a/Common/LegacyDataQA/CMakeLists.txt +++ b/Common/LegacyDataQA/CMakeLists.txt @@ -22,4 +22,9 @@ o2physics_add_dpl_workflow(centqa o2physics_add_dpl_workflow(tpcpidqa SOURCES tpcpidqa.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore - COMPONENT_NAME Analysis) \ No newline at end of file + COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(pmd-qa + SOURCES pmdQa.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + COMPONENT_NAME Analysis) diff --git a/Common/LegacyDataQA/pmdQa.cxx b/Common/LegacyDataQA/pmdQa.cxx new file mode 100644 index 00000000000..9958fd26761 --- /dev/null +++ b/Common/LegacyDataQA/pmdQa.cxx @@ -0,0 +1,133 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// +/// \file pmdQa.cxx +/// +/// \brief QA task to check PMD info on Run 2 converted data +/// \author Abhi Modak (abhi.modak@cern.ch) +/// \since May 17, 2025 + +#include +#include +#include + +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/ASoA.h" +#include "Framework/AnalysisDataModel.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/PmdTable.h" +#include "Framework/O2DatabasePDGPlugin.h" +#include "CCDB/BasicCCDBManager.h" +#include "TH1F.h" +#include "TH2F.h" + +using namespace o2; +using namespace o2::aod::run2; +using namespace o2::framework; +using namespace o2::aod::evsel; +using namespace o2::framework::expressions; + +struct BuiltPmdIndex { + // build the index table PMDTracksIndex + Builds idx; + void init(InitContext const&) {} +}; + +struct PmdQa { + + HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + ConfigurableAxis axisEventBin{"axisEventBin", {4, 0.5, 4.5}, ""}; + ConfigurableAxis axisVtxZBin{"axisVtxZBin", {40, -20, 20}, ""}; + ConfigurableAxis axisNPMDtracksBin{"axisNPMDtracksBin", {500, 0, 500}, "Number of pmdtracks"}; + ConfigurableAxis axisClsxyBin{"axisClsxyBin", {200, -100, 100}, ""}; + ConfigurableAxis axisAdcBin{"axisAdcBin", {200, 0, 2000}, ""}; + ConfigurableAxis axisEtaBin{"axisEtaBin", {10, 2.1, 4.1}, ""}; + ConfigurableAxis axisNcellBin{"axisNcellBin", {50, -0.5, 49.5}, ""}; + Configurable fMipCut{"fMipCut", 432, "fMipCut"}; + Configurable fNcellCut{"fNcellCut", 2, "fNcellCut"}; + Configurable fEtalow{"fEtalow", 2.3, "fEtalow"}; + Configurable fEtahigh{"fEtahigh", 3.9, "fEtahigh"}; + Configurable fVtxCut{"fVtxCut", 10.0, "fVtxCut"}; + + void init(InitContext&) + { + + AxisSpec axisEvent = {axisEventBin, "Event", "EventAxis"}; + AxisSpec axisVtxZ = {axisVtxZBin, "VtxZ", "VtxZAxis"}; + AxisSpec axisNPMDtracks = {axisNPMDtracksBin, "NPMDtracks", "NPMDtracksAxis"}; + AxisSpec axisClsxy = {axisClsxyBin, "Clsxy", "ClsxyAxis"}; + AxisSpec axisAdc = {axisAdcBin, "Adc", "AdcAxis"}; + AxisSpec axisEta = {axisEtaBin, "Eta", "EtaAxis"}; + AxisSpec axisNcell = {axisNcellBin, "Ncell", "NcellAxis"}; + + histos.add("hEventHist", "hEventHist", kTH1F, {axisEvent}); + histos.add("hVtxZHist", "hVtxZHist", kTH1F, {axisVtxZ}); + histos.add("hNPMDtracks", "Number of pmdtracks", kTH1F, {axisNPMDtracks}); + histos.add("hClusXY", "hClusXY", kTH2F, {axisClsxy, axisClsxy}); + histos.add("hClusAdc", "hClusAdc", kTH1F, {axisAdc}); + histos.add("hetacls", "hetacls", kTH1F, {axisEta}); + histos.add("hclsncell", "hclsncell", kTH1F, {axisNcell}); + } + + using ColTable = soa::Join; + using ColevSel = soa::Join; + + void process(ColevSel::iterator const& collision, aod::Pmds const&) + { + histos.fill(HIST("hEventHist"), 1); + if (collision.sel7()) { + return; + } + histos.fill(HIST("hEventHist"), 2); + if (std::abs(collision.posZ()) >= fVtxCut) { + return; + } + histos.fill(HIST("hEventHist"), 3); + histos.fill(HIST("hVtxZHist"), collision.posZ()); + + if (collision.has_pmd()) { + histos.fill(HIST("hEventHist"), 4); + auto tracks = collision.pmd(); + histos.fill(HIST("hNPMDtracks"), tracks.size()); + for (const auto& track : tracks) { + if (track.pmddet() == 1) { + return; + } + if (track.pmdclsz() == 0) { + return; + } + if (!track.pmdmodule()) { + return; + } + histos.fill(HIST("hClusXY"), track.pmdclsx(), track.pmdclsy()); + histos.fill(HIST("hClusAdc"), track.pmdclsadc()); + float rdist = std::sqrt(track.pmdclsx() * track.pmdclsx() + track.pmdclsy() * track.pmdclsy()); + float theta = std::atan2(rdist, track.pmdclsz()); + float etacls = -std::log(std::tan(0.5 * theta)); + if (track.pmdclsadc() > fMipCut && track.pmdncell() > fNcellCut) { + if (etacls > fEtalow && etacls < fEtahigh) { + histos.fill(HIST("hetacls"), etacls); + histos.fill(HIST("hclsncell"), track.pmdncell()); + } + } + } + } + } +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc), + }; +} From 703668f7ec172586f42c449cb8dc9a1ccb587286 Mon Sep 17 00:00:00 2001 From: Ionut Cristian Arsene Date: Mon, 19 May 2025 12:06:11 +0200 Subject: [PATCH 1320/1650] [Infrastructure] Adding correct user name for Maurice Coquet as codeowner of PWG-DQ (#11244) Co-authored-by: Ionut Cristian Arsene --- CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index 3bb7d23b8cd..1c6a87f8878 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -34,7 +34,7 @@ /PWGCF/DataModel @alibuild @jgrosseo @saganatt @victor-gonzalez @zchochul @lgraczykCern @prchakra @lauraser @ariedel-cern @EmilGorm @otonvd @shouqiye @glromane /PWGCF/TableProducer @alibuild @jgrosseo @saganatt @victor-gonzalez @zchochul @lgraczykCern @prchakra @lauraser @ariedel-cern @EmilGorm @otonvd @shouqiye @glromane /PWGCF/Tasks @alibuild @jgrosseo @saganatt @victor-gonzalez @zchochul @lgraczykCern @prchakra @lauraser @ariedel-cern @EmilGorm @otonvd @shouqiye @glromane -/PWGDQ @alibuild @iarsene @mcoquet @dsekihat @feisenhu @lucamicheletti93 +/PWGDQ @alibuild @iarsene @mcoquet642 @lucamicheletti93 /PWGEM @alibuild @feisenhu @dsekihat @ivorobye /PWGEM/Dilepton @alibuild @mikesas @rbailhac @dsekihat @ivorobye @feisenhu /PWGEM/PhotonMeson @alibuild @mikesas @rbailhac @m-c-danisch @novitzky @mhemmer-cern @dsekihat From 697ffb6169c2509470bcdab3ac991568e7aff361 Mon Sep 17 00:00:00 2001 From: Bhagyarathi Sahoo Date: Mon, 19 May 2025 16:36:35 +0530 Subject: [PATCH 1321/1650] [PWGDQ] Fine binning for precise measurement (#11189) --- PWGDQ/Core/HistogramsLibrary.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index a11747619de..b13a55d026a 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -897,7 +897,7 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h int varspTHE[3] = {VarManager::kMCPt, VarManager::kMCCosThetaHE, VarManager::kMCPhiHE}; int varspTCS[3] = {VarManager::kMCPt, VarManager::kMCCosThetaCS, VarManager::kMCPhiCS}; int varspTPP[3] = {VarManager::kMCPt, VarManager::kMCCosThetaPP, VarManager::kMCPhiPP}; - int binspT[3] = {20, 20, 20}; + int binspT[3] = {40, 20, 20}; double xminpT[3] = {0., -1., -3.14}; double xmaxpT[3] = {20., 1., +3.14}; hm->AddHistogram(histClass, "Pt_cosThetaHE_phiHE", "", 3, varspTHE, binspT, xminpT, xmaxpT, 0, -1, kFALSE); @@ -1195,7 +1195,7 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h if (subGroupStr.Contains("dimuon-polarization-he")) { int varspTHE[4] = {VarManager::kMass, VarManager::kPt, VarManager::kCosThetaHE, VarManager::kPhiHE}; int varsrapHE[4] = {VarManager::kMass, VarManager::kRap, VarManager::kCosThetaHE, VarManager::kPhiHE}; - int binspT[4] = {100, 20, 20, 20}; + int binspT[4] = {100, 40, 20, 20}; int binsy[4] = {100, 10, 20, 20}; double xminpT[4] = {1., 0., -1., -3.14}; double xmaxpT[4] = {5., 20., 1., +3.14}; @@ -1207,7 +1207,7 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h if (subGroupStr.Contains("dimuon-polarization-cs")) { int varspTCS[4] = {VarManager::kMass, VarManager::kPt, VarManager::kCosThetaCS, VarManager::kPhiCS}; int varsrapCS[4] = {VarManager::kMass, VarManager::kRap, VarManager::kCosThetaCS, VarManager::kPhiCS}; - int binspT[4] = {100, 20, 20, 20}; + int binspT[4] = {100, 40, 20, 20}; int binsy[4] = {100, 10, 20, 20}; double xminpT[4] = {1., 0., -1., -3.14}; double xmaxpT[4] = {5., 20., 1., +3.14}; @@ -1219,7 +1219,7 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h if (subGroupStr.Contains("dimuon-polarization-pp")) { int varspTPP[4] = {VarManager::kMass, VarManager::kPt, VarManager::kCosThetaPP, VarManager::kPhiPP}; int varsrapPP[4] = {VarManager::kMass, VarManager::kRap, VarManager::kCosThetaPP, VarManager::kPhiPP}; - int binspT[4] = {100, 20, 20, 20}; + int binspT[4] = {100, 40, 20, 20}; int binsy[4] = {100, 10, 20, 20}; double xminpT[4] = {1., 0., -1., -3.14}; double xmaxpT[4] = {5., 20., 1., +3.14}; From d25585319a524657a8d446e16cffa8db9873cac8 Mon Sep 17 00:00:00 2001 From: Zhang Yuan Date: Mon, 19 May 2025 13:09:18 +0200 Subject: [PATCH 1322/1650] [PWGDQ] Save the information of ambiguous pairs (#10733) Co-authored-by: ALICE Action Bot --- PWGDQ/Tasks/tableReader_withAssoc.cxx | 115 ++++++++++++++++++-------- 1 file changed, 82 insertions(+), 33 deletions(-) diff --git a/PWGDQ/Tasks/tableReader_withAssoc.cxx b/PWGDQ/Tasks/tableReader_withAssoc.cxx index 27138a44222..6677891da0f 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.cxx +++ b/PWGDQ/Tasks/tableReader_withAssoc.cxx @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -1178,6 +1179,8 @@ struct AnalysisSameEventPairing { std::map> fMuonHistNames; std::map> fTrackMuonHistNames; std::vector fPairCuts; + std::vector fTrackCuts; + std::map, uint32_t> fAmbiguousPairs; uint32_t fTrackFilterMask; // mask for the track cuts required in this task to be applied on the barrel cuts produced upstream uint32_t fMuonFilterMask; // mask for the muon cuts required in this task to be applied on the muon cuts produced upstream @@ -1213,6 +1216,7 @@ struct AnalysisSameEventPairing { // Keep track of all the histogram class names to avoid composing strings in the pairing loop TString histNames = ""; std::vector names; + fTrackCuts.clear(); // NOTE: Pair cuts are only applied on the histogram output. The produced pair tables do not have these cuts applied TString cutNamesStr = fConfigCuts.pair.value; @@ -1254,6 +1258,7 @@ struct AnalysisSameEventPairing { fNCutsBarrel = objArray->GetEntries(); for (int icut = 0; icut < objArray->GetEntries(); ++icut) { TString tempStr = objArray->At(icut)->GetName(); + fTrackCuts.push_back(tempStr); if (objArrayTrackCuts->FindObject(tempStr.Data()) != nullptr) { fTrackFilterMask |= (static_cast(1) << icut); @@ -1263,20 +1268,16 @@ struct AnalysisSameEventPairing { Form("PairsBarrelSEPP_%s", objArray->At(icut)->GetName()), Form("PairsBarrelSEMM_%s", objArray->At(icut)->GetName())}; histNames += Form("%s;%s;%s;", names[0].Data(), names[1].Data(), names[2].Data()); + names.push_back(Form("PairsBarrelSEPM_ambiguousextra_%s", objArray->At(icut)->GetName())); + names.push_back(Form("PairsBarrelSEPP_ambiguousextra_%s", objArray->At(icut)->GetName())); + names.push_back(Form("PairsBarrelSEMM_ambiguousextra_%s", objArray->At(icut)->GetName())); + histNames += Form("%s;%s;%s;", names[3].Data(), names[4].Data(), names[5].Data()); if (fEnableBarrelMixingHistos) { names.push_back(Form("PairsBarrelMEPM_%s", objArray->At(icut)->GetName())); names.push_back(Form("PairsBarrelMEPP_%s", objArray->At(icut)->GetName())); names.push_back(Form("PairsBarrelMEMM_%s", objArray->At(icut)->GetName())); - histNames += Form("%s;%s;%s;", names[3].Data(), names[4].Data(), names[5].Data()); + histNames += Form("%s;%s;%s;", names[6].Data(), names[7].Data(), names[8].Data()); } - names.push_back(Form("PairsBarrelSEPM_ambiguousInBunch_%s", objArray->At(icut)->GetName())); - names.push_back(Form("PairsBarrelSEPP_ambiguousInBunch_%s", objArray->At(icut)->GetName())); - names.push_back(Form("PairsBarrelSEMM_ambiguousInBunch_%s", objArray->At(icut)->GetName())); - names.push_back(Form("PairsBarrelSEPM_ambiguousOutOfBunch_%s", objArray->At(icut)->GetName())); - names.push_back(Form("PairsBarrelSEPP_ambiguousOutOfBunch_%s", objArray->At(icut)->GetName())); - names.push_back(Form("PairsBarrelSEMM_ambiguousOutOfBunch_%s", objArray->At(icut)->GetName())); - histNames += Form("%s;%s;%s;", names[(fEnableBarrelMixingHistos ? 6 : 3)].Data(), names[(fEnableBarrelMixingHistos ? 7 : 4)].Data(), names[(fEnableBarrelMixingHistos ? 8 : 5)].Data()); - histNames += Form("%s;%s;%s;", names[(fEnableBarrelMixingHistos ? 9 : 6)].Data(), names[(fEnableBarrelMixingHistos ? 10 : 7)].Data(), names[(fEnableBarrelMixingHistos ? 11 : 8)].Data()); fTrackHistNames[icut] = names; TString cutNamesStr = fConfigCuts.pair.value; @@ -1529,6 +1530,7 @@ struct AnalysisSameEventPairing { dielectronAllList.reserve(1); dimuonAllList.reserve(1); } + fAmbiguousPairs.clear(); constexpr bool eventHasQvector = ((TEventFillMap & VarManager::ObjTypes::ReducedEventQvector) > 0); constexpr bool eventHasQvectorCentr = ((TEventFillMap & VarManager::ObjTypes::CollisionQvect) > 0); constexpr bool trackHasCov = ((TTrackFillMap & VarManager::ObjTypes::TrackCov) > 0 || (TTrackFillMap & VarManager::ObjTypes::ReducedTrackBarrelCov) > 0); @@ -1720,52 +1722,89 @@ struct AnalysisSameEventPairing { bool isAmbiInBunch = false; bool isAmbiOutOfBunch = false; bool isUnambiguous = false; + bool isLeg1Ambi = false; + bool isLeg2Ambi = false; + bool isAmbiExtra = false; for (int icut = 0; icut < ncuts; icut++) { if (twoTrackFilter & (static_cast(1) << icut)) { isAmbiInBunch = (twoTrackFilter & (static_cast(1) << 28)) || (twoTrackFilter & (static_cast(1) << 29)); isAmbiOutOfBunch = (twoTrackFilter & (static_cast(1) << 30)) || (twoTrackFilter & (static_cast(1) << 31)); isUnambiguous = !(isAmbiInBunch || isAmbiOutOfBunch); + isLeg1Ambi = (twoTrackFilter & (static_cast(1) << 28) || (twoTrackFilter & (static_cast(1) << 30))); + isLeg2Ambi = (twoTrackFilter & (static_cast(1) << 29) || (twoTrackFilter & (static_cast(1) << 31))); + if constexpr (TPairType == VarManager::kDecayToEE) { + if (isLeg1Ambi && isLeg2Ambi) { + std::pair iPair(a1.reducedtrackId(), a2.reducedtrackId()); + if (fAmbiguousPairs.find(iPair) != fAmbiguousPairs.end()) { + if (fAmbiguousPairs[iPair] & (static_cast(1) << icut)) { // if this pair is already stored with this cut + isAmbiExtra = true; + } else { + fAmbiguousPairs[iPair] |= static_cast(1) << icut; + } + } else { + fAmbiguousPairs[iPair] = static_cast(1) << icut; + } + } + } if (sign1 * sign2 < 0) { - fHistMan->FillHistClass(histNames[icut][0].Data(), VarManager::fgValues); PromptNonPromptSepTable(VarManager::fgValues[VarManager::kMass], VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kVertexingTauxyProjected], VarManager::fgValues[VarManager::kVertexingTauxyProjectedPoleJPsiMass], VarManager::fgValues[VarManager::kVertexingTauzProjected], isAmbiInBunch, isAmbiOutOfBunch); - if (isAmbiInBunch) { - fHistMan->FillHistClass(histNames[icut][3 + histIdxOffset].Data(), VarManager::fgValues); - } - if (isAmbiOutOfBunch) { - fHistMan->FillHistClass(histNames[icut][3 + histIdxOffset + 3].Data(), VarManager::fgValues); - } if constexpr (TPairType == VarManager::kDecayToMuMu) { + fHistMan->FillHistClass(histNames[icut][0].Data(), VarManager::fgValues); + if (isAmbiInBunch) { + fHistMan->FillHistClass(histNames[icut][3 + histIdxOffset].Data(), VarManager::fgValues); + } + if (isAmbiOutOfBunch) { + fHistMan->FillHistClass(histNames[icut][3 + histIdxOffset + 3].Data(), VarManager::fgValues); + } if (isUnambiguous) { fHistMan->FillHistClass(histNames[icut][3 + histIdxOffset + 6].Data(), VarManager::fgValues); } } + if constexpr (TPairType == VarManager::kDecayToEE) { + fHistMan->FillHistClass(Form("PairsBarrelSEPM_%s", fTrackCuts[icut].Data()), VarManager::fgValues); + if (isAmbiExtra) { + fHistMan->FillHistClass(Form("PairsBarrelSEPM_ambiguousextra_%s", fTrackCuts[icut].Data()), VarManager::fgValues); + } + } } else { if (sign1 > 0) { - fHistMan->FillHistClass(histNames[icut][1].Data(), VarManager::fgValues); - if (isAmbiInBunch) { - fHistMan->FillHistClass(histNames[icut][4 + histIdxOffset].Data(), VarManager::fgValues); - } - if (isAmbiOutOfBunch) { - fHistMan->FillHistClass(histNames[icut][4 + histIdxOffset + 3].Data(), VarManager::fgValues); - } if constexpr (TPairType == VarManager::kDecayToMuMu) { + fHistMan->FillHistClass(histNames[icut][1].Data(), VarManager::fgValues); + if (isAmbiInBunch) { + fHistMan->FillHistClass(histNames[icut][4 + histIdxOffset].Data(), VarManager::fgValues); + } + if (isAmbiOutOfBunch) { + fHistMan->FillHistClass(histNames[icut][4 + histIdxOffset + 3].Data(), VarManager::fgValues); + } if (isUnambiguous) { fHistMan->FillHistClass(histNames[icut][4 + histIdxOffset + 6].Data(), VarManager::fgValues); } } - } else { - fHistMan->FillHistClass(histNames[icut][2].Data(), VarManager::fgValues); - if (isAmbiInBunch) { - fHistMan->FillHistClass(histNames[icut][5 + histIdxOffset].Data(), VarManager::fgValues); - } - if (isAmbiOutOfBunch) { - fHistMan->FillHistClass(histNames[icut][5 + histIdxOffset + 3].Data(), VarManager::fgValues); + if constexpr (TPairType == VarManager::kDecayToEE) { + fHistMan->FillHistClass(Form("PairsBarrelSEPP_%s", fTrackCuts[icut].Data()), VarManager::fgValues); + if (isAmbiExtra) { + fHistMan->FillHistClass(Form("PairsBarrelSEPP_ambiguousextra_%s", fTrackCuts[icut].Data()), VarManager::fgValues); + } } + } else { if constexpr (TPairType == VarManager::kDecayToMuMu) { + fHistMan->FillHistClass(histNames[icut][2].Data(), VarManager::fgValues); + if (isAmbiInBunch) { + fHistMan->FillHistClass(histNames[icut][5 + histIdxOffset].Data(), VarManager::fgValues); + } + if (isAmbiOutOfBunch) { + fHistMan->FillHistClass(histNames[icut][5 + histIdxOffset + 3].Data(), VarManager::fgValues); + } if (isUnambiguous) { fHistMan->FillHistClass(histNames[icut][5 + histIdxOffset + 6].Data(), VarManager::fgValues); } } + if constexpr (TPairType == VarManager::kDecayToEE) { + fHistMan->FillHistClass(Form("PairsBarrelSEMM_%s", fTrackCuts[icut].Data()), VarManager::fgValues); + if (isAmbiExtra) { + fHistMan->FillHistClass(Form("PairsBarrelSEMM_ambiguousextra_%s", fTrackCuts[icut].Data()), VarManager::fgValues); + } + } } } for (unsigned int iPairCut = 0; iPairCut < fPairCuts.size(); iPairCut++) { @@ -1887,8 +1926,8 @@ struct AnalysisSameEventPairing { isAmbiOutOfBunch = (twoTrackFilter & (static_cast(1) << 30)) || (twoTrackFilter & (static_cast(1) << 31)); isUnambiguous = !((twoTrackFilter & (static_cast(1) << 28)) || (twoTrackFilter & (static_cast(1) << 29)) || (twoTrackFilter & (static_cast(1) << 30)) || (twoTrackFilter & (static_cast(1) << 31))); if (pairSign == 0) { - fHistMan->FillHistClass(histNames[icut][3].Data(), VarManager::fgValues); if constexpr (TPairType == VarManager::kDecayToMuMu) { + fHistMan->FillHistClass(histNames[icut][3].Data(), VarManager::fgValues); if (isAmbiInBunch) { fHistMan->FillHistClass(histNames[icut][15].Data(), VarManager::fgValues); } @@ -1899,10 +1938,13 @@ struct AnalysisSameEventPairing { fHistMan->FillHistClass(histNames[icut][21].Data(), VarManager::fgValues); } } + if constexpr (TPairType == VarManager::kDecayToEE) { + fHistMan->FillHistClass(Form("PairsBarrelMEPM_%s", fTrackCuts[icut].Data()), VarManager::fgValues); + } } else { if (pairSign > 0) { - fHistMan->FillHistClass(histNames[icut][4].Data(), VarManager::fgValues); if constexpr (TPairType == VarManager::kDecayToMuMu) { + fHistMan->FillHistClass(histNames[icut][4].Data(), VarManager::fgValues); if (isAmbiInBunch) { fHistMan->FillHistClass(histNames[icut][16].Data(), VarManager::fgValues); } @@ -1913,9 +1955,12 @@ struct AnalysisSameEventPairing { fHistMan->FillHistClass(histNames[icut][22].Data(), VarManager::fgValues); } } + if constexpr (TPairType == VarManager::kDecayToEE) { + fHistMan->FillHistClass(Form("PairsBarrelMEPP_%s", fTrackCuts[icut].Data()), VarManager::fgValues); + } } else { - fHistMan->FillHistClass(histNames[icut][5].Data(), VarManager::fgValues); if constexpr (TPairType == VarManager::kDecayToMuMu) { + fHistMan->FillHistClass(histNames[icut][5].Data(), VarManager::fgValues); if (isAmbiInBunch) { fHistMan->FillHistClass(histNames[icut][17].Data(), VarManager::fgValues); } @@ -1926,6 +1971,9 @@ struct AnalysisSameEventPairing { fHistMan->FillHistClass(histNames[icut][23].Data(), VarManager::fgValues); } } + if constexpr (TPairType == VarManager::kDecayToEE) { + fHistMan->FillHistClass(Form("PairsBarrelMEMM_%s", fTrackCuts[icut].Data()), VarManager::fgValues); + } } } } // end for (cuts) @@ -1939,6 +1987,7 @@ struct AnalysisSameEventPairing { { events.bindExternalIndices(&assocs); int mixingDepth = fConfigMixingDepth.value; + fAmbiguousPairs.clear(); for (auto& [event1, event2] : selfCombinations(hashBin, mixingDepth, -1, events, events)) { VarManager::ResetValues(0, VarManager::kNVars); VarManager::FillEvent(event1, VarManager::fgValues); From 8f35cb8cb724039673b966811f6bb7b4cda1ca1d Mon Sep 17 00:00:00 2001 From: czhang Date: Mon, 19 May 2025 13:32:25 +0200 Subject: [PATCH 1323/1650] [Common,PWGDQ] Optimising muon realignment code (#11235) --- Common/DataModel/FwdTrackReAlignTables.h | 152 ++++------------ Common/TableProducer/muonRealignment.cxx | 170 ++++++++---------- PWGDQ/Core/VarManager.h | 11 +- PWGDQ/TableProducer/tableMaker.cxx | 109 +++-------- .../TableProducer/tableMakerMC_withAssoc.cxx | 134 +++++--------- PWGDQ/TableProducer/tableMaker_withAssoc.cxx | 148 ++++++--------- 6 files changed, 235 insertions(+), 489 deletions(-) diff --git a/Common/DataModel/FwdTrackReAlignTables.h b/Common/DataModel/FwdTrackReAlignTables.h index e8249e56608..2dc9bf3dd6c 100644 --- a/Common/DataModel/FwdTrackReAlignTables.h +++ b/Common/DataModel/FwdTrackReAlignTables.h @@ -22,129 +22,51 @@ namespace o2::aod { namespace fwdtrackrealign { -// FwdTracksRealign Columns definitions -DECLARE_SOA_INDEX_COLUMN(Collision, collision); //! -DECLARE_SOA_INDEX_COLUMN(FwdTrack, fwdtrack); //! FwdTrack index -DECLARE_SOA_COLUMN(TrackType, trackType, uint8_t); //! Type of track. See enum ForwardTrackTypeEnum -DECLARE_SOA_COLUMN(X, x, float); //! TrackParFwd parameter x -DECLARE_SOA_COLUMN(Y, y, float); //! TrackParFwd parameter y -DECLARE_SOA_COLUMN(Z, z, float); //! TrackParFwd propagation parameter z -DECLARE_SOA_COLUMN(Phi, phi, float); //! TrackParFwd parameter phi; (i.e. pt pointing direction) -DECLARE_SOA_COLUMN(Tgl, tgl, float); //! TrackParFwd parameter tan(\lamba); (\lambda = 90 - \theta_{polar}) -DECLARE_SOA_COLUMN(Signed1Pt, signed1Pt, float); //! TrackParFwd parameter: charged inverse transverse momentum; (q/pt) -DECLARE_SOA_COLUMN(IsRemovable, isRemovable, int); //! flag to validate the re-aligned track -DECLARE_SOA_COLUMN(Chi2, chi2, float); //! Track chi^2 +DECLARE_SOA_COLUMN(IsRemovable, isRemovable, int); //! flag to check the refit status +} -// FwdTracksCovRealign columns definitions -DECLARE_SOA_COLUMN(SigmaX, sigmaX, float); //! Covariance matrix -DECLARE_SOA_COLUMN(SigmaY, sigmaY, float); //! Covariance matrix -DECLARE_SOA_COLUMN(SigmaPhi, sigmaPhi, float); //! Covariance matrix -DECLARE_SOA_COLUMN(SigmaTgl, sigmaTgl, float); //! Covariance matrix -DECLARE_SOA_COLUMN(Sigma1Pt, sigma1Pt, float); //! Covariance matrix -DECLARE_SOA_COLUMN(RhoXY, rhoXY, int8_t); //! Covariance matrix in compressed form -DECLARE_SOA_COLUMN(RhoPhiX, rhoPhiX, int8_t); //! Covariance matrix in compressed form -DECLARE_SOA_COLUMN(RhoPhiY, rhoPhiY, int8_t); //! Covariance matrix in compressed form -DECLARE_SOA_COLUMN(RhoTglX, rhoTglX, int8_t); //! Covariance matrix in compressed form -DECLARE_SOA_COLUMN(RhoTglY, rhoTglY, int8_t); //! Covariance matrix in compressed form -DECLARE_SOA_COLUMN(RhoTglPhi, rhoTglPhi, int8_t); //! Covariance matrix in compressed form -DECLARE_SOA_COLUMN(Rho1PtX, rho1PtX, int8_t); //! Covariance matrix in compressed form -DECLARE_SOA_COLUMN(Rho1PtY, rho1PtY, int8_t); //! Covariance matrix in compressed form -DECLARE_SOA_COLUMN(Rho1PtPhi, rho1PtPhi, int8_t); //! Covariance matrix in compressed form -DECLARE_SOA_COLUMN(Rho1PtTgl, rho1PtTgl, int8_t); //! Covariance matrix in compressed form - -// Dynamic and expression columns -DECLARE_SOA_DYNAMIC_COLUMN(Sign, sign, //! Sign of the track eletric charge - [](float signed1Pt) -> short { return (signed1Pt > 0) ? 1 : -1; }); -DECLARE_SOA_DYNAMIC_COLUMN(Px, px, //! - [](float pt, float phi) -> float { - return pt * std::cos(phi); - }); -DECLARE_SOA_DYNAMIC_COLUMN(Py, py, //! - [](float pt, float phi) -> float { - return pt * std::sin(phi); - }); -DECLARE_SOA_DYNAMIC_COLUMN(Pz, pz, //! - [](float pt, float tgl) -> float { - return pt * tgl; - }); - -DECLARE_SOA_EXPRESSION_COLUMN(Eta, eta, float, //! - -1.f * nlog(ntan(o2::constants::math::PIQuarter - 0.5f * natan(aod::fwdtrackrealign::tgl)))); -DECLARE_SOA_EXPRESSION_COLUMN(Pt, pt, float, //! - ifnode(nabs(aod::fwdtrackrealign::signed1Pt) < o2::constants::math::Almost0, o2::constants::math::VeryBig, nabs(1.f / aod::fwdtrackrealign::signed1Pt))); -DECLARE_SOA_EXPRESSION_COLUMN(P, p, float, //! - ifnode((nabs(aod::fwdtrackrealign::signed1Pt) < o2::constants::math::Almost0) || (nabs(o2::constants::math::PIQuarter - 0.5f * natan(aod::fwdtrackrealign::tgl)) < o2::constants::math::Almost0), o2::constants::math::VeryBig, 0.5f * (ntan(o2::constants::math::PIQuarter - 0.5f * natan(aod::fwdtrackrealign::tgl)) + 1.f / ntan(o2::constants::math::PIQuarter - 0.5f * natan(aod::fwdtrackrealign::tgl))) / nabs(aod::fwdtrackrealign::signed1Pt))); -DECLARE_SOA_EXPRESSION_COLUMN(CXX, cXX, float, //! - aod::fwdtrackrealign::sigmaX* aod::fwdtrackrealign::sigmaX); -DECLARE_SOA_EXPRESSION_COLUMN(CXY, cXY, float, //! - (aod::fwdtrackrealign::rhoXY / 128.f) * (aod::fwdtrackrealign::sigmaX * aod::fwdtrackrealign::sigmaY)); -DECLARE_SOA_EXPRESSION_COLUMN(CYY, cYY, float, //! - aod::fwdtrackrealign::sigmaY* aod::fwdtrackrealign::sigmaY); -DECLARE_SOA_EXPRESSION_COLUMN(CPhiX, cPhiX, float, //! - (aod::fwdtrackrealign::rhoPhiX / 128.f) * (aod::fwdtrackrealign::sigmaPhi * aod::fwdtrackrealign::sigmaX)); -DECLARE_SOA_EXPRESSION_COLUMN(CPhiY, cPhiY, float, //! - (aod::fwdtrackrealign::rhoPhiY / 128.f) * (aod::fwdtrackrealign::sigmaPhi * aod::fwdtrackrealign::sigmaY)); -DECLARE_SOA_EXPRESSION_COLUMN(CPhiPhi, cPhiPhi, float, //! - aod::fwdtrackrealign::sigmaPhi* aod::fwdtrackrealign::sigmaPhi); -DECLARE_SOA_EXPRESSION_COLUMN(CTglX, cTglX, float, //! - (aod::fwdtrackrealign::rhoTglX / 128.f) * (aod::fwdtrackrealign::sigmaTgl * aod::fwdtrackrealign::sigmaX)); -DECLARE_SOA_EXPRESSION_COLUMN(CTglY, cTglY, float, //! - (aod::fwdtrackrealign::rhoTglY / 128.f) * (aod::fwdtrackrealign::sigmaTgl * aod::fwdtrackrealign::sigmaY)); -DECLARE_SOA_EXPRESSION_COLUMN(CTglPhi, cTglPhi, float, //! - (aod::fwdtrackrealign::rhoTglPhi / 128.f) * (aod::fwdtrackrealign::sigmaTgl * aod::fwdtrackrealign::sigmaPhi)); -DECLARE_SOA_EXPRESSION_COLUMN(CTglTgl, cTglTgl, float, //! - aod::fwdtrackrealign::sigmaTgl* aod::fwdtrackrealign::sigmaTgl); -DECLARE_SOA_EXPRESSION_COLUMN(C1PtY, c1PtY, float, //! - (aod::fwdtrackrealign::rho1PtY / 128.f) * (aod::fwdtrackrealign::sigma1Pt * aod::fwdtrackrealign::sigmaY)); -DECLARE_SOA_EXPRESSION_COLUMN(C1PtX, c1PtX, float, //! - (aod::fwdtrackrealign::rho1PtX / 128.f) * (aod::fwdtrackrealign::sigma1Pt * aod::fwdtrackrealign::sigmaX)); -DECLARE_SOA_EXPRESSION_COLUMN(C1PtPhi, c1PtPhi, float, //! - (aod::fwdtrackrealign::rho1PtPhi / 128.f) * (aod::fwdtrackrealign::sigma1Pt * aod::fwdtrackrealign::sigmaPhi)); -DECLARE_SOA_EXPRESSION_COLUMN(C1PtTgl, c1PtTgl, float, //! - (aod::fwdtrackrealign::rho1PtTgl / 128.f) * (aod::fwdtrackrealign::sigma1Pt * aod::fwdtrackrealign::sigmaTgl)); -DECLARE_SOA_EXPRESSION_COLUMN(C1Pt21Pt2, c1Pt21Pt2, float, //! - aod::fwdtrackrealign::sigma1Pt* aod::fwdtrackrealign::sigma1Pt); -} // namespace fwdtrackrealign - -// Tracks including MCH and/or MCH (plus optionally MFT) //! DECLARE_SOA_TABLE_FULL(StoredFwdTracksReAlign, "FwdTracksReAlign", "AOD", "FWDTRACKREALIGN", - o2::soa::Index<>, fwdtrackrealign::CollisionId, fwdtrackrealign::FwdTrackId, fwdtrackrealign::TrackType, fwdtrackrealign::X, fwdtrackrealign::Y, fwdtrackrealign::Z, fwdtrackrealign::Phi, fwdtrackrealign::Tgl, - fwdtrackrealign::Signed1Pt, - fwdtrackrealign::Px, - fwdtrackrealign::Py, - fwdtrackrealign::Pz, - fwdtrackrealign::Sign, - fwdtrackrealign::Chi2, - fwdtrackrealign::IsRemovable); - -DECLARE_SOA_TABLE_FULL(StoredFwdTrksCovReAlign, "FwdCovsReAlign", "AOD", "FWDCOVREALIGN", //! - fwdtrackrealign::SigmaX, fwdtrackrealign::SigmaY, fwdtrackrealign::SigmaPhi, fwdtrackrealign::SigmaTgl, fwdtrackrealign::Sigma1Pt, - fwdtrackrealign::RhoXY, fwdtrackrealign::RhoPhiY, fwdtrackrealign::RhoPhiX, fwdtrackrealign::RhoTglX, fwdtrackrealign::RhoTglY, - fwdtrackrealign::RhoTglPhi, fwdtrackrealign::Rho1PtX, fwdtrackrealign::Rho1PtY, fwdtrackrealign::Rho1PtPhi, fwdtrackrealign::Rho1PtTgl); + o2::soa::Index<>, fwdtrack::CollisionId, fwdtrack::TrackType, + fwdtrack::X, fwdtrack::Y, fwdtrack::Z, fwdtrack::Phi, fwdtrack::Tgl, + fwdtrack::Signed1Pt, fwdtrack::NClusters, fwdtrack::PDca, fwdtrack::RAtAbsorberEnd, + fwdtrackrealign::IsRemovable, + fwdtrack::Px, + fwdtrack::Py, + fwdtrack::Pz, + fwdtrack::Sign, + fwdtrack::Chi2, fwdtrack::Chi2MatchMCHMID, fwdtrack::Chi2MatchMCHMFT, + fwdtrack::MatchScoreMCHMFT, fwdtrack::MFTTrackId, fwdtrack::MCHTrackId, + fwdtrack::MCHBitMap, fwdtrack::MIDBitMap, fwdtrack::MIDBoards, + fwdtrack::TrackTime, fwdtrack::TrackTimeRes); // extended table with expression columns that can be used as arguments of dynamic columns DECLARE_SOA_EXTENDED_TABLE_USER(FwdTracksReAlign, StoredFwdTracksReAlign, "FWDTRKREALIGNEXT", //! - fwdtrackrealign::Pt, - fwdtrackrealign::Eta, - fwdtrackrealign::P); // the table name has here to be the one with EXT which is not nice and under study + fwdtrack::Pt, + fwdtrack::Eta, + fwdtrack::P); + +DECLARE_SOA_TABLE_FULL(StoredFwdTrksCovReAlign, "FwdCovsReAlign", "AOD", "FWDCOVREALIGN", + fwdtrack::SigmaX, fwdtrack::SigmaY, fwdtrack::SigmaPhi, fwdtrack::SigmaTgl, fwdtrack::Sigma1Pt, + fwdtrack::RhoXY, fwdtrack::RhoPhiY, fwdtrack::RhoPhiX, fwdtrack::RhoTglX, fwdtrack::RhoTglY, + fwdtrack::RhoTglPhi, fwdtrack::Rho1PtX, fwdtrack::Rho1PtY, fwdtrack::Rho1PtPhi, fwdtrack::Rho1PtTgl); // extended table with expression columns that can be used as arguments of dynamic columns DECLARE_SOA_EXTENDED_TABLE_USER(FwdTrksCovReAlign, StoredFwdTrksCovReAlign, "FWDCOVREALIGNEXT", //! - fwdtrackrealign::CXX, - fwdtrackrealign::CXY, - fwdtrackrealign::CYY, - fwdtrackrealign::CPhiX, - fwdtrackrealign::CPhiY, - fwdtrackrealign::CPhiPhi, - fwdtrackrealign::CTglX, - fwdtrackrealign::CTglY, - fwdtrackrealign::CTglPhi, - fwdtrackrealign::CTglTgl, - fwdtrackrealign::C1PtX, - fwdtrackrealign::C1PtY, - fwdtrackrealign::C1PtPhi, - fwdtrackrealign::C1PtTgl, - fwdtrackrealign::C1Pt21Pt2); // the table name has here to be the one with EXT which is not nice and under study + fwdtrack::CXX, + fwdtrack::CXY, + fwdtrack::CYY, + fwdtrack::CPhiX, + fwdtrack::CPhiY, + fwdtrack::CPhiPhi, + fwdtrack::CTglX, + fwdtrack::CTglY, + fwdtrack::CTglPhi, + fwdtrack::CTglTgl, + fwdtrack::C1PtX, + fwdtrack::C1PtY, + fwdtrack::C1PtPhi, + fwdtrack::C1PtTgl, + fwdtrack::C1Pt21Pt2); using FwdTrackRealign = FwdTracksReAlign::iterator; using FwdTrkCovRealign = FwdTrksCovReAlign::iterator; diff --git a/Common/TableProducer/muonRealignment.cxx b/Common/TableProducer/muonRealignment.cxx index 9da3a27d97f..58745af69a6 100644 --- a/Common/TableProducer/muonRealignment.cxx +++ b/Common/TableProducer/muonRealignment.cxx @@ -13,7 +13,6 @@ /// \brief Task for muon re-alignment at analysis level /// \author Chi Zhang , CEA-Saclay -#include #include #include "Framework/AnalysisDataModel.h" #include "Framework/AnalysisTask.h" @@ -48,6 +47,8 @@ using namespace o2::framework; using namespace o2::mch; using namespace o2::framework::expressions; +using MyMuonsWithCov = soa::Join; + const int fgNDetElemCh[10] = {4, 4, 4, 4, 18, 18, 26, 26, 26, 26}; const int fgSNDetElemCh[11] = {0, 4, 8, 12, 16, 34, 52, 78, 104, 130, 156}; @@ -77,15 +78,11 @@ struct MuonRealignment { Configurable geoRefPath{"geoRefPath", "GLO/Config/GeometryAligned", "Path of the reference geometry file"}; Configurable geoNewPath{"geoNewPath", "GLO/Config/GeometryAligned", "Path of the new geometry file"}; Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; - Configurable grpPathLocal{"grpPathLocal", "", "Local path of the GRP object if not using CCDB"}; - Configurable geoNewPathLocal{"geoNewPathLocal", "", "Local path of the GRP object if not using CCDB"}; Configurable nolaterthanRef{"ccdb-no-later-than-ref", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object of reference basis"}; Configurable nolaterthanNew{"ccdb-no-later-than-new", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object of new basis"}; Configurable cfgChamberResolutionX{"cfgChamberResolutionX", 0.04, "Chamber resolution along X configuration for refit"}; // 0.4cm pp, 0.2cm PbPb Configurable cfgChamberResolutionY{"cfgChamberResolutionY", 0.04, "Chamber resolution along Y configuration for refit"}; // 0.4cm pp, 0.2cm PbPb Configurable cfgSigmaCutImprove{"cfgSigmaCutImprove", 6., "Sigma cut for track improvement"}; // 6 for pp, 4 for PbPb - Configurable fUseRemoteField{"cfgUseRemoteField", true, "Chose whether to fetch the magnetic field from ccdb or set it manually"}; - Configurable fUseRemoteGeometry{"cfgUseRemoteGeometry", false, "Chose whether to fetch new geometry from ccdb or set it manually"}; parameters::GRPMagField* grpmag = nullptr; base::MatLayerCylSet* lut = nullptr; @@ -101,7 +98,6 @@ struct MuonRealignment { TGeoManager* geoRef = nullptr; Preslice perMuon = aod::fwdtrkcl::fwdtrackId; - Preslice fwdtrackIndicesPerCollision = aod::track_association::collisionId; int GetDetElemId(int iDetElemNumber) { @@ -222,89 +218,18 @@ struct MuonRealignment { mImproveCutChi2 = 2. * cfgSigmaCutImprove.value * cfgSigmaCutImprove.value; } - template - void runMuonRealignment(TEvent const& collision, aod::BCsWithTimestamps const&, TMuons const&, TMuonCls const& clusters, AssocMuons const& fwdtrackIndices) + template + void runMuonRealignment(TMuons const& muons, TMuonCls const& clusters) { - auto bc = collision.template bc_as(); - if (fCurrentRun != bc.runNumber()) { - // Load magnetic field information from CCDB/local - if (fUseRemoteField) { - ccdb->setCreatedNotAfter(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); - grpmag = ccdb->getForTimeStamp(grpmagPath, bc.timestamp()); - if (grpmag != nullptr) { - base::Propagator::initFieldFromGRP(grpmag); - TrackExtrap::setField(); - TrackExtrap::useExtrapV2(); - } else { - LOGF(fatal, "GRP object is not available in CCDB at timestamp=%llu", bc.timestamp()); - } - } else { - if (std::filesystem::exists(grpPathLocal.value)) { - const auto grp = parameters::GRPObject::loadFrom(grpPathLocal.value); - base::Propagator::initFieldFromGRP(grp); - TrackExtrap::setField(); - TrackExtrap::useExtrapV2(); - } else { - LOGF(fatal, "GRP object is not available in local path: %s", grpPathLocal.value); - } - } - - // Load geometry information from CCDB/local - LOGF(info, "Loading reference aligned geometry from CCDB no later than %d", nolaterthanRef.value); - ccdb->setCreatedNotAfter(nolaterthanRef.value); // this timestamp has to be consistent with what has been used in reco - geoRef = ccdb->getForTimeStamp(geoRefPath, bc.timestamp()); - ccdb->clearCache(geoRefPath); - if (geoRef != nullptr) { - transformation = geo::transformationFromTGeoManager(*geoRef); - } else { - LOGF(fatal, "Reference aligned geometry object is not available in CCDB at timestamp=%llu", bc.timestamp()); - } - for (int i = 0; i < 156; i++) { - int iDEN = GetDetElemId(i); - transformRef[iDEN] = transformation(iDEN); - } - - if (fUseRemoteGeometry) { - LOGF(info, "Loading new aligned geometry from CCDB no later than %d", nolaterthanNew.value); - ccdb->setCreatedNotAfter(nolaterthanNew.value); // make sure this timestamp can be resolved regarding the reference one - geoNew = ccdb->getForTimeStamp(geoNewPath, bc.timestamp()); - ccdb->clearCache(geoNewPath); - if (geoNew != nullptr) { - transformation = geo::transformationFromTGeoManager(*geoNew); - } else { - LOGF(fatal, "New aligned geometry object is not available in CCDB at timestamp=%llu", bc.timestamp()); - } - for (int i = 0; i < 156; i++) { - int iDEN = GetDetElemId(i); - transformNew[iDEN] = transformation(iDEN); - } - } else { - LOGF(info, "Loading new aligned geometry from local path: %s", geoNewPathLocal.value); - if (std::filesystem::exists(geoNewPathLocal.value)) { - base::GeometryManager::loadGeometry(geoNewPathLocal.value); - transformation = geo::transformationFromTGeoManager(*gGeoManager); - for (int i = 0; i < 156; i++) { - int iDEN = GetDetElemId(i); - transformNew[iDEN] = transformation(iDEN); - } - } else { - LOGF(fatal, "New geometry file is not available in local path: %s", geoNewPathLocal.value); - } - } - - fCurrentRun = bc.runNumber(); - } - // Reserve storage for output table - realignFwdTrks.reserve(fwdtrackIndices.size()); - realignFwdTrksCov.reserve(fwdtrackIndices.size()); + realignFwdTrks.reserve(muons.size()); + realignFwdTrksCov.reserve(muons.size()); // Loop over forward tracks using association indices FwdTrkCovRealignInfo fwdTrkCovRealignInfo; - for (auto const& muonId : fwdtrackIndices) { - auto muon = muonId.template fwdtrack_as(); + for (auto const& muon : muons) { int muonRealignId = muon.globalIndex(); - if ((muon.trackType() == aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) || (muon.trackType() == aod::fwdtrack::ForwardTrackTypeEnum::MCHStandaloneTrack)) { + if (static_cast(muon.trackType() > 2)) { auto clustersSliced = clusters.sliceBy(perMuon, muon.globalIndex()); // Slice clusters by muon id mch::Track convertedTrack = mch::Track(); // Temporary variable to store re-aligned clusters @@ -370,7 +295,10 @@ struct MuonRealignment { LOGF(debug, "TrackParm %d, x:%g y:%g z:%g phi:%g tgl:%g InvQPt:%g chi2:%g nClusters:%d", muon.globalIndex(), muon.x(), muon.y(), muon.z(), muon.phi(), muon.tgl(), muon.signed1Pt(), muon.chi2(), muon.nClusters()); LOGF(debug, "Re-aligned trackParm %d, x:%g y:%g z:%g phi:%g tgl:%g InvQPt:%g chi2:%g nClusters:%d removable:%d", muonRealignId, fwdtrack.getX(), fwdtrack.getY(), fwdtrack.getZ(), fwdtrack.getPhi(), fwdtrack.getTgl(), fwdtrack.getInvQPt(), fwdtrack.getTrackChi2(), convertedTrack.getNClusters(), removable); // Fill refitted track info - realignFwdTrks(muonId.collisionId(), muonId.fwdtrackId(), muon.trackType(), fwdtrack.getX(), fwdtrack.getY(), fwdtrack.getZ(), fwdtrack.getPhi(), fwdtrack.getTgl(), fwdtrack.getInvQPt(), fwdtrack.getTrackChi2(), removable); + realignFwdTrks(muon.collisionId(), muon.trackType(), fwdtrack.getX(), fwdtrack.getY(), fwdtrack.getZ(), fwdtrack.getPhi(), fwdtrack.getTgl(), fwdtrack.getInvQPt(), convertedTrack.getNClusters(), muon.pDca(), muon.rAtAbsorberEnd(), removable, fwdtrack.getTrackChi2(), muon.chi2MatchMCHMID(), muon.chi2MatchMCHMFT(), + muon.matchScoreMCHMFT(), muon.matchMFTTrackId(), muon.matchMCHTrackId(), + muon.mchBitMap(), muon.midBitMap(), muon.midBoards(), + muon.trackTime(), muon.trackTimeRes()); realignFwdTrksCov(fwdTrkCovRealignInfo.sigX, fwdTrkCovRealignInfo.sigY, fwdTrkCovRealignInfo.sigPhi, fwdTrkCovRealignInfo.sigTgl, fwdTrkCovRealignInfo.sig1Pt, fwdTrkCovRealignInfo.rhoXY, fwdTrkCovRealignInfo.rhoPhiX, fwdTrkCovRealignInfo.rhoPhiY, fwdTrkCovRealignInfo.rhoTglX, @@ -378,22 +306,75 @@ struct MuonRealignment { fwdTrkCovRealignInfo.rho1PtY, fwdTrkCovRealignInfo.rho1PtPhi, fwdTrkCovRealignInfo.rho1PtTgl); muonRealignId++; } else { - // Fill nothing for global muons - realignFwdTrks(muonId.collisionId(), muonId.fwdtrackId(), muon.trackType(), 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, -1.0); - realignFwdTrksCov(0.f, 0.f, 0.f, 0.f, 0.f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + realignFwdTrks(muon.collisionId(), muon.trackType(), muon.x(), muon.y(), muon.z(), muon.phi(), muon.tgl(), muon.signed1Pt(), muon.nClusters(), muon.pDca(), muon.rAtAbsorberEnd(), 0, muon.chi2(), muon.chi2MatchMCHMID(), muon.chi2MatchMCHMFT(), + muon.matchScoreMCHMFT(), muon.matchMFTTrackId(), muon.matchMCHTrackId(), + muon.mchBitMap(), muon.midBitMap(), muon.midBoards(), + muon.trackTime(), muon.trackTimeRes()); + realignFwdTrksCov(muon.sigmaX(), muon.sigmaY(), muon.sigmaPhi(), muon.sigmaTgl(), muon.sigma1Pt(), muon.rhoXY(), muon.rhoPhiY(), muon.rhoPhiX(), muon.rhoTglX(), muon.rhoTglY(), muon.rhoTglPhi(), muon.rho1PtX(), muon.rho1PtY(), muon.rho1PtPhi(), muon.rho1PtTgl()); muonRealignId++; } } } - void processMuonReAlignmentWithAssoc(aod::Collisions const& collisions, aod::BCsWithTimestamps const& bcs, aod::FwdTracks const& tracks, aod::FwdTrkCls const& clusters, aod::FwdTrackAssoc const& fwdtrackIndices) + void processMuonReAlignment(aod::Collisions const& collisions, aod::BCsWithTimestamps const&, MyMuonsWithCov const& tracks, aod::FwdTrkCls const& clusters) { - for (auto& collision : collisions) { - auto muonIdsThisCollision = fwdtrackIndices.sliceBy(fwdtrackIndicesPerCollision, collision.globalIndex()); - runMuonRealignment(collision, bcs, tracks, clusters, muonIdsThisCollision); + bool FirstEvent = true; + for (auto const& collision : collisions) { + + if (!FirstEvent) { + break; + } + + auto bc = collision.template bc_as(); + if (fCurrentRun != bc.runNumber()) { + // Load magnetic field information from CCDB/local + ccdb->setCreatedNotAfter(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); + grpmag = ccdb->getForTimeStamp(grpmagPath, bc.timestamp()); + if (grpmag != nullptr) { + base::Propagator::initFieldFromGRP(grpmag); + TrackExtrap::setField(); + TrackExtrap::useExtrapV2(); + } else { + LOGF(fatal, "GRP object is not available in CCDB at timestamp=%llu", bc.timestamp()); + } + + // Load geometry information from CCDB/local + LOGF(info, "Loading reference aligned geometry from CCDB no later than %d", nolaterthanRef.value); + ccdb->setCreatedNotAfter(nolaterthanRef.value); // this timestamp has to be consistent with what has been used in reco + geoRef = ccdb->getForTimeStamp(geoRefPath, bc.timestamp()); + ccdb->clearCache(geoRefPath); + if (geoRef != nullptr) { + transformation = geo::transformationFromTGeoManager(*geoRef); + } else { + LOGF(fatal, "Reference aligned geometry object is not available in CCDB at timestamp=%llu", bc.timestamp()); + } + for (int i = 0; i < 156; i++) { + int iDEN = GetDetElemId(i); + transformRef[iDEN] = transformation(iDEN); + } + + LOGF(info, "Loading new aligned geometry from CCDB no later than %d", nolaterthanNew.value); + ccdb->setCreatedNotAfter(nolaterthanNew.value); // make sure this timestamp can be resolved regarding the reference one + geoNew = ccdb->getForTimeStamp(geoNewPath, bc.timestamp()); + ccdb->clearCache(geoNewPath); + if (geoNew != nullptr) { + transformation = geo::transformationFromTGeoManager(*geoNew); + } else { + LOGF(fatal, "New aligned geometry object is not available in CCDB at timestamp=%llu", bc.timestamp()); + } + for (int i = 0; i < 156; i++) { + int iDEN = GetDetElemId(i); + transformNew[iDEN] = transformation(iDEN); + } + + fCurrentRun = bc.runNumber(); + } + FirstEvent = false; } + + runMuonRealignment(tracks, clusters); } - PROCESS_SWITCH(MuonRealignment, processMuonReAlignmentWithAssoc, "Process to produce realigned muons based on associated fwdtracks info", true); + PROCESS_SWITCH(MuonRealignment, processMuonReAlignment, "Process to do muon realignment", true); }; // Extends the fwdtracksrealign table with expression columns @@ -405,6 +386,7 @@ struct MuonRealignmentSpawner { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{adaptAnalysisTask(cfgc), - adaptAnalysisTask(cfgc)}; + return WorkflowSpec{ + adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc)}; } diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index dd95386f3de..b1e18ab7635 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -876,8 +876,8 @@ class VarManager : public TObject kToRabs }; - static TString fgVariableNames[kNVars]; // variable names - static TString fgVariableUnits[kNVars]; // variable units + static TString fgVariableNames[kNVars]; // variable names + static TString fgVariableUnits[kNVars]; // variable units static std::map fgVarNamesMap; // key: variables short name, value: order in the Variables enum static void SetDefaultVarNames(); @@ -2180,11 +2180,6 @@ void VarManager::FillTrack(T const& track, float* values) } } - if constexpr ((fillMap & MuonRealign) > 0) { - values[kMuonChi2] = track.chi2(); - values[kMuonTrackType] = track.trackType(); - } - if (fgUsedVars[kM11REFoverMpsingle]) { float m = o2::constants::physics::MassMuon; ROOT::Math::PtEtaPhiMVector v(track.pt(), track.eta(), track.phi(), m); @@ -2518,7 +2513,7 @@ void VarManager::FillTrack(T const& track, float* values) } // Quantities based on the muon extra table - if constexpr ((fillMap & ReducedMuonExtra) > 0 || (fillMap & Muon) > 0) { + if constexpr ((fillMap & ReducedMuonExtra) > 0 || (fillMap & Muon) > 0 || (fillMap & MuonRealign) > 0) { values[kMuonNClusters] = track.nClusters(); values[kMuonPDca] = track.pDca(); values[kMCHBitMap] = track.mchBitMap(); diff --git a/PWGDQ/TableProducer/tableMaker.cxx b/PWGDQ/TableProducer/tableMaker.cxx index 1e7442fa275..6792ba67932 100644 --- a/PWGDQ/TableProducer/tableMaker.cxx +++ b/PWGDQ/TableProducer/tableMaker.cxx @@ -119,7 +119,7 @@ using MyMuons = soa::Join; using MyMuonsWithCov = soa::Join; using MyMuonsColl = soa::Join; using MyMuonsCollWithCov = soa::Join; -using MyMuonsRealignWithCov = soa::Join; +using MyMuonsRealignCollWithCov = soa::Join; using ExtBCs = soa::Join; constexpr static uint32_t gkEventFillMap = VarManager::ObjTypes::BC | VarManager::ObjTypes::Collision; @@ -139,7 +139,7 @@ constexpr static uint32_t gkTrackFillMapForElectronMuon = VarManager::ObjTypes:: constexpr static uint32_t gkMuonFillMap = VarManager::ObjTypes::Muon; constexpr static uint32_t gkMuonFillMapWithCov = VarManager::ObjTypes::Muon | VarManager::ObjTypes::MuonCov; constexpr static uint32_t gkMuonFillMapWithCovAmbi = VarManager::ObjTypes::Muon | VarManager::ObjTypes::MuonCov | VarManager::ObjTypes::AmbiMuon; -constexpr static uint32_t gkMuonRealignFillMapWithCov = VarManager::ObjTypes::MuonRealign | VarManager::ObjTypes::MuonCovRealign; +constexpr static uint32_t gkMuonRealignFillMapWithCovAmbi = VarManager::ObjTypes::MuonRealign | VarManager::ObjTypes::MuonCovRealign | VarManager::ObjTypes::AmbiMuon; constexpr static uint32_t gkTrackFillMapWithAmbi = VarManager::ObjTypes::Track | VarManager::ObjTypes::AmbiTrack; constexpr static uint32_t gkMFTFillMap = VarManager::ObjTypes::TrackMFT; @@ -227,10 +227,8 @@ struct TableMaker { Preslice perCollisionTracks = aod::track::collisionId; Preslice perCollisionMuons = aod::fwdtrack::collisionId; - PresliceUnsorted perCollisionMuonsRealign = aod::fwdtrackrealign::collisionId; Preslice trackIndicesPerCollision = aod::track_association::collisionId; Preslice fwdtrackIndicesPerCollision = aod::track_association::collisionId; - PresliceUnsorted fwdtrackRealignPerMuon = aod::fwdtrackrealign::fwdtrackId; bool fDoDetailedQA = false; // Bool to set detailed QA true, if QA is set true int fCurrentRun; // needed to detect if the run changed and trigger update of calibrations etc. @@ -845,8 +843,8 @@ struct TableMaker { } // end fullSkimming() // Templated function instantianed for all of the process functions - template - void fullSkimmingIndices(TEvent const& collision, aod::BCsWithTimestamps const&, TTracks const& tracksBarrel, TMuons const& tracksMuon, TMuonsRealign const& tracksMuonRealign, AssocTracks const& trackIndices, AssocMuons const& fwdtrackIndices) + template + void fullSkimmingIndices(TEvent const& collision, aod::BCsWithTimestamps const&, TTracks const& tracksBarrel, TMuons const& tracksMuon, AssocTracks const& trackIndices, AssocMuons const& fwdtrackIndices) { auto bc = collision.template bc_as(); if (fCurrentRun != bc.runNumber()) { @@ -1106,7 +1104,7 @@ struct TableMaker { muonBasic.reserve(tracksMuon.size()); muonExtra.reserve(tracksMuon.size()); muonInfo.reserve(tracksMuon.size()); - if constexpr (static_cast((TMuonFillMap & VarManager::ObjTypes::MuonCov) || (TMuonRealignFillMap & VarManager::ObjTypes::MuonCovRealign))) { + if constexpr (static_cast((TMuonFillMap & VarManager::ObjTypes::MuonCov) || (TMuonFillMap & VarManager::ObjTypes::MuonCovRealign))) { muonCov.reserve(tracksMuon.size()); } // loop over muons @@ -1118,28 +1116,10 @@ struct TableMaker { std::map newMatchIndex; for (const auto& muonId : fwdtrackIndices) { // start loop over tracks - auto muon = muonId.template fwdtrack_as(); + auto muon = tracksMuon.rawIteratorAt(muonId.fwdtrackId()); trackFilteringTag = static_cast(0); - int realignRemoveFlag = 0; - if constexpr (static_cast(TMuonRealignFillMap)) { - // Update muon information using realigned tracks - if (static_cast(muon.trackType()) > 2) { - // Update only MCH or MCH-MID tracks with realigned information - auto muonRealignSelected = tracksMuonRealign.sliceBy(fwdtrackRealignPerMuon, muonId.fwdtrackId()); - if (muonRealignSelected.size() == 1) { - for (const auto& muonRealign : muonRealignSelected) { - VarManager::FillTrack(muonRealign); - realignRemoveFlag = muonRealign.isRemovable(); - } - } else { - LOGF(fatal, "Inconsistent size of realigned muon track candidates."); - } - } else { - VarManager::FillTrack(muon); - } - } else { - VarManager::FillTrack(muon); - } + + VarManager::FillTrack(muon); if (muon.index() > idxPrev + 1) { // checks if some muons are filtered even before the skimming function nDel += muon.index() - (idxPrev + 1); @@ -1153,7 +1133,7 @@ struct TableMaker { trackTempFilterMap |= (uint8_t(1) << i); } - if (!trackTempFilterMap || realignRemoveFlag) { // does not pass the cuts + if (!trackTempFilterMap) { // does not pass the cuts nDel++; } else { // it passes the cuts and will be saved in the tables newEntryNb[muon.index()] = muon.index() - nDel; @@ -1162,7 +1142,7 @@ struct TableMaker { // now let's save the muons with the correct indices and matches for (const auto& muonId : fwdtrackIndices) { // start loop over tracks - auto muon = muonId.template fwdtrack_as(); + auto muon = tracksMuon.rawIteratorAt(muonId.fwdtrackId()); if constexpr ((TMuonFillMap & VarManager::ObjTypes::AmbiMuon) > 0) { if (fIsAmbiguous) { isAmbiguous = (muon.compatibleCollIds().size() != 1); @@ -1171,55 +1151,19 @@ struct TableMaker { trackFilteringTag = static_cast(0); trackTempFilterMap = uint8_t(0); - if constexpr (static_cast(TMuonRealignFillMap)) { - // Update muon information using realigned tracks - if (static_cast(muon.trackType()) > 2) { - // Update only MCH or MCH-MID tracks with realigned information - auto muonRealignSelected = tracksMuonRealign.sliceBy(fwdtrackRealignPerMuon, muonId.fwdtrackId()); - int realignRemoveFlag = 0; - if (muonRealignSelected.size() == 1) { - for (const auto& muonRealign : muonRealignSelected) { - LOGF(debug, "Muon original - collisionId:%d x:%g y:%g z:%g phi:%g tgl:%g signed1pt:%g pt:%g p:%g eta:%g chi2:%g", muon.collisionId(), muon.x(), muon.y(), muon.z(), muon.phi(), muon.tgl(), muon.signed1Pt(), muon.pt(), muon.p(), muon.eta(), muon.chi2()); - LOGF(debug, "Muon realigned - collisionId:%d x:%g y:%g z:%g phi:%g tgl:%g signed1pt:%g pt:%g p:%g eta:%g chi2:%g", muonRealign.collisionId(), muonRealign.x(), muonRealign.y(), muonRealign.z(), muonRealign.phi(), muonRealign.tgl(), muonRealign.signed1Pt(), muonRealign.pt(), muonRealign.p(), muonRealign.eta(), muonRealign.chi2()); - VarManager::FillTrack(muonRealign); - realignRemoveFlag = muonRealign.isRemovable(); - - // recalculte pDca for global muon tracks - VarManager::FillTrackCollision(muonRealign, collision); - - if (fPropMuon) { - VarManager::FillPropagateMuon(muonRealign, collision); - } - } - - if (realignRemoveFlag) { - continue; - } - - } else { - LOGF(fatal, "Inconsistent size of realigned muon track candidates."); - } - } else { - // For global tracks, their matched muon tracks should be updated already - - VarManager::FillTrack(muon); - - // recalculte pDca for global muon tracks - VarManager::FillTrackCollision(muon, collision); - - if (fPropMuon) { - VarManager::FillPropagateMuon(muon, collision); - } + if constexpr (static_cast(TMuonFillMap & VarManager::ObjTypes::MuonRealign)) { + if (static_cast(muon.isRemovable())) { + continue; } - } else { - VarManager::FillTrack(muon); + } + + VarManager::FillTrack(muon); - // recalculte pDca for global muon tracks - VarManager::FillTrackCollision(muon, collision); + // recalculte pDca for global muon tracks + VarManager::FillTrackCollision(muon, collision); - if (fPropMuon) { - VarManager::FillPropagateMuon(muon, collision); - } + if (fPropMuon) { + VarManager::FillPropagateMuon(muon, collision); } if (fDoDetailedQA) { @@ -1274,7 +1218,7 @@ struct TableMaker { muonBasic(event.lastIndex(), newMatchIndex.find(muon.index())->second, -1, trackFilteringTag, VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kEta], VarManager::fgValues[VarManager::kPhi], muon.sign(), isAmbiguous); muonInfo(muon.collisionId(), collision.posX(), collision.posY(), collision.posZ()); - if constexpr (static_cast((TMuonFillMap & VarManager::ObjTypes::MuonCov))) { + if constexpr (static_cast((TMuonFillMap & VarManager::ObjTypes::MuonCov) || (TMuonFillMap & VarManager::ObjTypes::MuonCovRealign))) { if (fPropMuon) { muonExtra(muon.nClusters(), VarManager::fgValues[VarManager::kMuonPDca], VarManager::fgValues[VarManager::kMuonRAtAbsorberEnd], @@ -1684,17 +1628,16 @@ struct TableMaker { { for (auto& collision : collisions) { auto muonIdsThisCollision = fwdtrackIndices.sliceBy(fwdtrackIndicesPerCollision, collision.globalIndex()); - fullSkimmingIndices(collision, bcs, nullptr, tracksMuon, nullptr, nullptr, muonIdsThisCollision); + fullSkimmingIndices(collision, bcs, nullptr, tracksMuon, nullptr, muonIdsThisCollision); } } void processAssociatedRealignedMuonOnlyWithCov(MyEvents const& collisions, aod::BCsWithTimestamps const& bcs, - soa::Filtered const& tracksMuon, MyMuonsRealignWithCov const& tracksMuonRealign, aod::AmbiguousFwdTracks const&, aod::FwdTrackAssoc const& fwdtrackIndices) + soa::Filtered const& tracksMuon, aod::AmbiguousFwdTracks const&, aod::FwdTrackAssoc const& fwdtrackIndices) { for (auto& collision : collisions) { auto muonIdsThisCollision = fwdtrackIndices.sliceBy(fwdtrackIndicesPerCollision, collision.globalIndex()); - auto muonsRealignThisCollision = tracksMuonRealign.sliceBy(perCollisionMuonsRealign, collision.globalIndex()); - fullSkimmingIndices(collision, bcs, nullptr, tracksMuon, muonsRealignThisCollision, nullptr, muonIdsThisCollision); + fullSkimmingIndices(collision, bcs, nullptr, tracksMuon, nullptr, muonIdsThisCollision); } } @@ -1703,7 +1646,7 @@ struct TableMaker { { for (auto& collision : collisions) { auto muonIdsThisCollision = fwdtrackIndices.sliceBy(fwdtrackIndicesPerCollision, collision.globalIndex()); - fullSkimmingIndices(collision, bcs, nullptr, tracksMuon, nullptr, nullptr, muonIdsThisCollision); + fullSkimmingIndices(collision, bcs, nullptr, tracksMuon, nullptr, muonIdsThisCollision); } } @@ -1712,7 +1655,7 @@ struct TableMaker { { for (auto& collision : collisions) { auto muonIdsThisCollision = fwdtrackIndices.sliceBy(fwdtrackIndicesPerCollision, collision.globalIndex()); - fullSkimmingIndices(collision, bcs, nullptr, tracksMuon, nullptr, nullptr, muonIdsThisCollision); + fullSkimmingIndices(collision, bcs, nullptr, tracksMuon, nullptr, muonIdsThisCollision); } } diff --git a/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx b/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx index 3c8e4bdfe7e..a2e053375d9 100644 --- a/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx +++ b/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx @@ -85,7 +85,7 @@ using MyBarrelTracksWithCov = soa::Join; using MyMuons = soa::Join; using MyMuonsWithCov = soa::Join; -using MyMuonsRealignWithCov = soa::Join; +using MyMuonsRealignWithCov = soa::Join; using MyEvents = soa::Join; using MyEventsWithMults = soa::Join; @@ -419,8 +419,6 @@ struct TableMakerMC { Preslice trackIndicesPerCollision = aod::track_association::collisionId; Preslice fwdtrackIndicesPerCollision = aod::track_association::collisionId; Preslice mfttrackIndicesPerCollision = aod::track_association::collisionId; - PresliceUnsorted perCollisionMuonsRealign = aod::fwdtrackrealign::collisionId; - PresliceUnsorted fwdtrackRealignPerMuon = aod::fwdtrackrealign::fwdtrackId; void skimMCCollisions(aod::McCollisions const& mcCollisions) { @@ -892,8 +890,8 @@ struct TableMakerMC { } } - template - void skimMuons(TEvent const& collision, TMuons const& muons, TMuonsRealign const& muonsRealign, FwdTrackAssoc const& muonAssocs, aod::McParticles const& mcTracks, TMFTTracks const& /*mftTracks*/) + template + void skimMuons(TEvent const& collision, TMuons const& muons, FwdTrackAssoc const& muonAssocs, aod::McParticles const& mcTracks, TMFTTracks const& /*mftTracks*/) { // Skim the fwd-tracks (muons) // Loop over the collision-track associations, recompute track properties depending on the collision assigned, and apply track cuts for selection @@ -909,7 +907,7 @@ struct TableMakerMC { uint32_t counter = 0; for (const auto& assoc : muonAssocs) { // get the muon - auto muon = assoc.template fwdtrack_as(); + auto muon = muons.rawIteratorAt(assoc.fwdtrackId()); if (fConfigVariousOptions.fKeepBestMatch && static_cast(muon.trackType()) < 2) { if (fBestMatch.find(muon.globalIndex()) == fBestMatch.end()) { continue; @@ -918,6 +916,14 @@ struct TableMakerMC { trackFilteringTag = uint8_t(0); trackTempFilterMap = uint8_t(0); + + if constexpr (static_cast(TMuonFillMap & VarManager::ObjTypes::MuonRealign)) { + // Check refit flag in case of realigned muons + if (static_cast(muon.isRemovable())) { + continue; + } + } + VarManager::FillTrack(muon); // NOTE: If a muon is associated to multiple collisions, depending on the selections, // it may be accepted for some associations and rejected for other @@ -934,35 +940,7 @@ struct TableMakerMC { VarManager::FillTrackCollision(muontrack, collision); VarManager::FillGlobalMuonRefit(muontrack, mfttrack, collision); } else { - if constexpr ((static_cast(TMuonRealignFillMap))) { - if (static_cast(muon.trackType()) > 2) { - // refill kinematic info and recalculate propagation in case of using realigned muons - auto muonRealignSelected = muonsRealign.sliceBy(fwdtrackRealignPerMuon, assoc.fwdtrackId()); - int realignRemoveFlag = 0; - if (muonRealignSelected.size() == 1) { - for (const auto& muonRealign : muonRealignSelected) { - // refill muon information with realigned tracks - VarManager::FillTrack(muonRealign); - realignRemoveFlag = muonRealign.isRemovable(); - - if (fConfigVariousOptions.fPropMuon) { - VarManager::FillPropagateMuon(muonRealign, collision); - } - - VarManager::FillTrackCollision(muonRealign, collision); - } - - if (realignRemoveFlag) { - continue; - } - - } else { - LOGF(fatal, "Inconsistent size of realigned muon track candidates."); - } - } - } else { - VarManager::FillTrackCollision(muon, collision); - } + VarManager::FillTrackCollision(muon, collision); } if (fDoDetailedQA) { @@ -1063,6 +1041,14 @@ struct TableMakerMC { mftIdx = fMftIndexMap[muon.matchMFTTrackId()]; } } + + if constexpr (static_cast(TMuonFillMap & VarManager::ObjTypes::MuonRealign)) { + // Check refit flag in case of realigned muons + if (static_cast(muon.isRemovable())) { + continue; + } + } + VarManager::FillTrack(muon); if (fConfigVariousOptions.fPropMuon) { VarManager::FillPropagateMuon(muon, collision); @@ -1074,35 +1060,7 @@ struct TableMakerMC { VarManager::FillTrackCollision(muontrack, collision); VarManager::FillGlobalMuonRefit(muontrack, mfttrack, collision); } else { - if constexpr ((static_cast(TMuonRealignFillMap))) { - if (static_cast(muon.trackType()) > 2) { - // refill kinematic info and recalculate propagation in case of using realigned muons - auto muonRealignSelected = muonsRealign.sliceBy(fwdtrackRealignPerMuon, muon.globalIndex()); - int realignRemoveFlag = 0; - if (muonRealignSelected.size() == 1) { - for (const auto& muonRealign : muonRealignSelected) { - // refill muon information with realigned tracks - VarManager::FillTrack(muonRealign); - realignRemoveFlag = muonRealign.isRemovable(); - - if (fConfigVariousOptions.fPropMuon) { - VarManager::FillPropagateMuon(muonRealign, collision); - } - - VarManager::FillTrackCollision(muonRealign, collision); - } - - if (realignRemoveFlag) { - continue; - } - - } else { - LOGF(fatal, "Inconsistent size of realigned muon track candidates."); - } - } - } else { - VarManager::FillTrackCollision(muon, collision); - } + VarManager::FillTrackCollision(muon, collision); } muonBasic(reducedEventIdx, mchIdx, mftIdx, fFwdTrackFilterMap[muon.globalIndex()], VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kEta], VarManager::fgValues[VarManager::kPhi], muon.sign(), 0); muonExtra(muon.nClusters(), VarManager::fgValues[VarManager::kMuonPDca], VarManager::fgValues[VarManager::kMuonRAtAbsorberEnd], @@ -1111,7 +1069,7 @@ struct TableMakerMC { muon.mchBitMap(), muon.midBitMap(), muon.midBoards(), muon.trackType(), VarManager::fgValues[VarManager::kMuonDCAx], VarManager::fgValues[VarManager::kMuonDCAy], muon.trackTime(), muon.trackTimeRes()); - if constexpr (static_cast(TMuonFillMap & VarManager::ObjTypes::MuonCov) || static_cast(TMuonRealignFillMap & VarManager::ObjTypes::MuonCovRealign)) { + if constexpr (static_cast(TMuonFillMap & VarManager::ObjTypes::MuonCov) || static_cast(TMuonFillMap & VarManager::ObjTypes::MuonCovRealign)) { muonCov(VarManager::fgValues[VarManager::kX], VarManager::fgValues[VarManager::kY], VarManager::fgValues[VarManager::kZ], VarManager::fgValues[VarManager::kPhi], VarManager::fgValues[VarManager::kTgl], muon.sign() / VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kMuonCXX], VarManager::fgValues[VarManager::kMuonCXY], VarManager::fgValues[VarManager::kMuonCYY], VarManager::fgValues[VarManager::kMuonCPhiX], VarManager::fgValues[VarManager::kMuonCPhiY], VarManager::fgValues[VarManager::kMuonCPhiPhi], VarManager::fgValues[VarManager::kMuonCTglX], VarManager::fgValues[VarManager::kMuonCTglY], VarManager::fgValues[VarManager::kMuonCTglPhi], VarManager::fgValues[VarManager::kMuonCTglTgl], VarManager::fgValues[VarManager::kMuonC1Pt2X], VarManager::fgValues[VarManager::kMuonC1Pt2Y], @@ -1126,10 +1084,10 @@ struct TableMakerMC { } // end loop over selected muons } // end skimMuons - template + template void fullSkimming(TEvents const& collisions, BCsWithTimestamps const& bcs, - TTracks const& tracksBarrel, TMuons const& muons, TMuonsRealign const& muonsRealign, TMFTTracks const& mftTracks, + TTracks const& tracksBarrel, TMuons const& muons, TMFTTracks const& mftTracks, TTrackAssoc const& trackAssocs, TFwdTrackAssoc const& fwdTrackAssocs, TMFTTrackAssoc const& mftAssocs, aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) { @@ -1229,16 +1187,10 @@ struct TableMakerMC { if (fConfigVariousOptions.fKeepBestMatch) { skimBestMuonMatches(muons); } - skimMuons(collision, muons, nullptr, groupedMuonIndices, mcParticles, mftTracks); + skimMuons(collision, muons, groupedMuonIndices, mcParticles, mftTracks); } else { - if constexpr (static_cast(TMuonRealignFillMap)) { - auto groupedMuonIndices = fwdTrackAssocs.sliceBy(fwdtrackIndicesPerCollision, origIdx); - auto muonsRealignThisCollision = muonsRealign.sliceBy(perCollisionMuonsRealign, origIdx); - skimMuons(collision, muons, muonsRealignThisCollision, groupedMuonIndices, mcParticles, mftTracks); - } else { - auto groupedMuonIndices = fwdTrackAssocs.sliceBy(fwdtrackIndicesPerCollision, origIdx); - skimMuons(collision, muons, nullptr, groupedMuonIndices, mcParticles, nullptr); - } + auto groupedMuonIndices = fwdTrackAssocs.sliceBy(fwdtrackIndicesPerCollision, origIdx); + skimMuons(collision, muons, groupedMuonIndices, mcParticles, nullptr); } } } // end loop over skimmed collisions @@ -1387,14 +1339,14 @@ struct TableMakerMC { aod::TrackAssoc const& trackAssocs, aod::FwdTrackAssoc const& fwdTrackAssocs, aod::MFTTrackAssoc const& mftAssocs, aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) { - fullSkimming(collisions, bcs, tracksBarrel, tracksMuon, nullptr, mftTracks, trackAssocs, fwdTrackAssocs, mftAssocs, mcCollisions, mcParticles); + fullSkimming(collisions, bcs, tracksBarrel, tracksMuon, mftTracks, trackAssocs, fwdTrackAssocs, mftAssocs, mcCollisions, mcParticles); } void processPPBarrelOnly(MyEventsWithMults const& collisions, aod::BCsWithTimestamps const& bcs, MyBarrelTracksWithCov const& tracksBarrel, aod::TrackAssoc const& trackAssocs, aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) { - fullSkimming(collisions, bcs, tracksBarrel, nullptr, nullptr, nullptr, trackAssocs, nullptr, nullptr, mcCollisions, mcParticles); + fullSkimming(collisions, bcs, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr, mcCollisions, mcParticles); } void processPPMuonOnlyBasic(MyEvents const& collisions, aod::BCsWithTimestamps const& bcs, @@ -1402,7 +1354,7 @@ struct TableMakerMC { aod::FwdTrackAssoc const& fwdTrackAssocs, aod::MFTTrackAssoc const& mftAssocs, aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) { - fullSkimming(collisions, bcs, nullptr, tracksMuon, nullptr, mftTracks, nullptr, fwdTrackAssocs, mftAssocs, mcCollisions, mcParticles); + fullSkimming(collisions, bcs, nullptr, tracksMuon, mftTracks, nullptr, fwdTrackAssocs, mftAssocs, mcCollisions, mcParticles); } void processPPMuonOnly(MyEventsWithMults const& collisions, aod::BCsWithTimestamps const& bcs, @@ -1410,15 +1362,15 @@ struct TableMakerMC { aod::FwdTrackAssoc const& fwdTrackAssocs, aod::MFTTrackAssoc const& mftAssocs, aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) { - fullSkimming(collisions, bcs, nullptr, tracksMuon, nullptr, mftTracks, nullptr, fwdTrackAssocs, mftAssocs, mcCollisions, mcParticles); + fullSkimming(collisions, bcs, nullptr, tracksMuon, mftTracks, nullptr, fwdTrackAssocs, mftAssocs, mcCollisions, mcParticles); } void processPPRealignedMuonOnly(MyEventsWithMults const& collisions, aod::BCsWithTimestamps const& bcs, - MyMuonsWithCov const& tracksMuon, MyMuonsRealignWithCov const& muonsRealign, MFTTrackLabeled const& mftTracks, - aod::FwdTrackAssoc const& fwdTrackAssocs, + MyMuonsRealignWithCov const& tracksMuon, MFTTrackLabeled const& mftTracks, + aod::FwdTrackAssoc const& fwdTrackAssocs, aod::MFTTrackAssoc const& mftAssocs, aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) { - fullSkimming(collisions, bcs, nullptr, tracksMuon, muonsRealign, mftTracks, nullptr, fwdTrackAssocs, nullptr, mcCollisions, mcParticles); + fullSkimming(collisions, bcs, nullptr, tracksMuon, mftTracks, nullptr, fwdTrackAssocs, mftAssocs, mcCollisions, mcParticles); } void processPbPb(MyEventsWithCentAndMults const& collisions, aod::BCsWithTimestamps const& bcs, @@ -1426,21 +1378,21 @@ struct TableMakerMC { aod::TrackAssoc const& trackAssocs, aod::FwdTrackAssoc const& fwdTrackAssocs, aod::MFTTrackAssoc const& mftAssocs, aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) { - fullSkimming(collisions, bcs, tracksBarrel, tracksMuon, nullptr, mftTracks, trackAssocs, fwdTrackAssocs, mftAssocs, mcCollisions, mcParticles); + fullSkimming(collisions, bcs, tracksBarrel, tracksMuon, mftTracks, trackAssocs, fwdTrackAssocs, mftAssocs, mcCollisions, mcParticles); } void processPbPbBarrelOnly(MyEventsWithCentAndMults const& collisions, aod::BCsWithTimestamps const& bcs, MyBarrelTracksWithCov const& tracksBarrel, aod::TrackAssoc const& trackAssocs, aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) { - fullSkimming(collisions, bcs, tracksBarrel, nullptr, nullptr, nullptr, trackAssocs, nullptr, nullptr, mcCollisions, mcParticles); + fullSkimming(collisions, bcs, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr, mcCollisions, mcParticles); } void processPbPbWithFilterBarrelOnly(MyEventsWithMultsAndRapidityGapFilter const& collisions, aod::BCsWithTimestamps const& bcs, MyBarrelTracksWithCov const& tracksBarrel, aod::TrackAssoc const& trackAssocs, aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) { - fullSkimming(collisions, bcs, tracksBarrel, nullptr, nullptr, nullptr, trackAssocs, nullptr, nullptr, mcCollisions, mcParticles); + fullSkimming(collisions, bcs, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr, mcCollisions, mcParticles); } void processPbPbMuonOnly(MyEventsWithCentAndMults const& collisions, aod::BCsWithTimestamps const& bcs, @@ -1448,15 +1400,15 @@ struct TableMakerMC { aod::FwdTrackAssoc const& fwdTrackAssocs, aod::MFTTrackAssoc const& mftAssocs, aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) { - fullSkimming(collisions, bcs, nullptr, tracksMuon, nullptr, mftTracks, nullptr, fwdTrackAssocs, mftAssocs, mcCollisions, mcParticles); + fullSkimming(collisions, bcs, nullptr, tracksMuon, mftTracks, nullptr, fwdTrackAssocs, mftAssocs, mcCollisions, mcParticles); } void processPbPbRealignedMuonOnly(MyEventsWithCentAndMults const& collisions, aod::BCsWithTimestamps const& bcs, - MyMuonsWithCov const& tracksMuon, MyMuonsRealignWithCov const& muonsRealign, MFTTrackLabeled const& mftTracks, - aod::FwdTrackAssoc const& fwdTrackAssocs, + MyMuonsRealignWithCov const& tracksMuon, MFTTrackLabeled const& mftTracks, + aod::FwdTrackAssoc const& fwdTrackAssocs, aod::MFTTrackAssoc const& mftAssocs, aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) { - fullSkimming(collisions, bcs, nullptr, tracksMuon, muonsRealign, mftTracks, nullptr, fwdTrackAssocs, nullptr, mcCollisions, mcParticles); + fullSkimming(collisions, bcs, nullptr, tracksMuon, mftTracks, nullptr, fwdTrackAssocs, mftAssocs, mcCollisions, mcParticles); } // Process the BCs and store stats for luminosity retrieval ----------------------------------------------------------------------------------- diff --git a/PWGDQ/TableProducer/tableMaker_withAssoc.cxx b/PWGDQ/TableProducer/tableMaker_withAssoc.cxx index f62be6d5753..9c269de06d3 100644 --- a/PWGDQ/TableProducer/tableMaker_withAssoc.cxx +++ b/PWGDQ/TableProducer/tableMaker_withAssoc.cxx @@ -109,7 +109,7 @@ using MyEventsWithCentAndMults = soa::Join; using MyMuons = soa::Join; using MyMuonsWithCov = soa::Join; -using MyMuonsRealignWithCov = soa::Join; +using MyMuonsRealignWithCov = soa::Join; using MyMuonsColl = soa::Join; using MyMuonsCollWithCov = soa::Join; using MyBCs = soa::Join; @@ -294,8 +294,6 @@ struct TableMaker { Preslice trackIndicesPerCollision = aod::track_association::collisionId; Preslice fwdtrackIndicesPerCollision = aod::track_association::collisionId; Preslice mfttrackIndicesPerCollision = aod::track_association::collisionId; - PresliceUnsorted perCollisionMuonsRealign = aod::fwdtrackrealign::collisionId; - PresliceUnsorted fwdtrackRealignPerMuon = aod::fwdtrackrealign::fwdtrackId; Preslice preslice = aod::track::collisionId; Partition tracksPos = (((aod::track::flags & static_cast(o2::aod::track::PVContributor)) == static_cast(o2::aod::track::PVContributor)) && (aod::track::tgl > static_cast(0.05))); @@ -1123,8 +1121,8 @@ struct TableMaker { } } - template - void skimMuons(TEvent const& collision, TBCs const& /*bcs*/, TMuons const& muons, TMuonsRealign const& muonsRealign, FwdTrackAssoc const& muonAssocs, TMFTTracks const& /*mftTracks*/) + template + void skimMuons(TEvent const& collision, TBCs const& /*bcs*/, TMuons const& muons, FwdTrackAssoc const& muonAssocs, TMFTTracks const& /*mftTracks*/) { // Skim the fwd-tracks (muons) // Loop over the collision-track associations, recompute track properties depending on the collision assigned, and apply track cuts for selection @@ -1141,10 +1139,18 @@ struct TableMaker { uint32_t counter = 0; for (const auto& assoc : muonAssocs) { // get the muon - auto muon = assoc.template fwdtrack_as(); + auto muon = muons.rawIteratorAt(assoc.fwdtrackId()); trackFilteringTag = static_cast(0); trackTempFilterMap = static_cast(0); + + if constexpr (static_cast(TMuonFillMap & VarManager::ObjTypes::MuonRealign)) { + // Check refit flag in case of realigned muons + if (static_cast(muon.isRemovable())) { + continue; + } + } + VarManager::FillTrack(muon); // NOTE: Muons are propagated to the current associated collisions. // So if a muon is associated to multiple collisions, depending on the selections, @@ -1164,35 +1170,7 @@ struct TableMaker { auto mfttrack = muon.template matchMFTTrack_as(); VarManager::FillGlobalMuonRefit(muontrack, mfttrack, collision); } else { - if constexpr ((static_cast(TMuonRealignFillMap))) { - if (static_cast(muon.trackType()) > 2) { - // refill kinematic info and recalculate propagation in case of using realigned muons - auto muonRealignSelected = muonsRealign.sliceBy(fwdtrackRealignPerMuon, assoc.fwdtrackId()); - int realignRemoveFlag = 0; - if (muonRealignSelected.size() == 1) { - for (const auto& muonRealign : muonRealignSelected) { - // refill muon information with realigned tracks - VarManager::FillTrack(muonRealign); - realignRemoveFlag = muonRealign.isRemovable(); - - if (fConfigVariousOptions.fPropMuon) { - VarManager::FillPropagateMuon(muonRealign, collision); - } - - VarManager::FillTrackCollision(muonRealign, collision); - } - - if (realignRemoveFlag) { - continue; - } - - } else { - LOGF(fatal, "Inconsistent size of realigned muon track candidates."); - } - } - } else { - VarManager::FillTrackCollision(muon, collision); - } + VarManager::FillTrackCollision(muon, collision); } if (fDoDetailedQA) { @@ -1258,6 +1236,14 @@ struct TableMaker { mftIdx = fMftIndexMap[muon.matchMFTTrackId()]; } } + + if constexpr (static_cast(TMuonFillMap & VarManager::ObjTypes::MuonRealign)) { + // Check refit flag in case of realigned muons + if (static_cast(muon.isRemovable())) { + continue; + } + } + VarManager::FillTrack(muon); if (fConfigVariousOptions.fPropMuon) { VarManager::FillPropagateMuon(muon, collision); @@ -1271,35 +1257,7 @@ struct TableMaker { VarManager::FillTrackCollision(muontrack, collision); VarManager::FillGlobalMuonRefit(muontrack, mfttrack, collision); } else { - if constexpr ((static_cast(TMuonRealignFillMap))) { - if (static_cast(muon.trackType()) > 2) { - // refill kinematic info and recalculate propagation in case of using realigned muons - auto muonRealignSelected = muonsRealign.sliceBy(fwdtrackRealignPerMuon, muon.globalIndex()); - int realignRemoveFlag = 0; - if (muonRealignSelected.size() == 1) { - for (const auto& muonRealign : muonRealignSelected) { - // refill muon information with realigned tracks - VarManager::FillTrack(muonRealign); - realignRemoveFlag = muonRealign.isRemovable(); - - if (fConfigVariousOptions.fPropMuon) { - VarManager::FillPropagateMuon(muonRealign, collision); - } - - VarManager::FillTrackCollision(muonRealign, collision); - } - - if (realignRemoveFlag) { - continue; - } - - } else { - LOGF(fatal, "Inconsistent size of realigned muon track candidates."); - } - } - } else { - VarManager::FillTrackCollision(muon, collision); - } + VarManager::FillTrackCollision(muon, collision); } muonBasic(reducedEventIdx, mchIdx, mftIdx, fFwdTrackFilterMap[muon.globalIndex()], VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kEta], VarManager::fgValues[VarManager::kPhi], muon.sign(), 0); muonExtra(globalClusters, VarManager::fgValues[VarManager::kMuonPDca], VarManager::fgValues[VarManager::kMuonRAtAbsorberEnd], @@ -1309,7 +1267,7 @@ struct TableMaker { muon.midBoards(), muon.trackType(), VarManager::fgValues[VarManager::kMuonDCAx], VarManager::fgValues[VarManager::kMuonDCAy], muon.trackTime(), muon.trackTimeRes()); muonInfo(muon.collisionId(), collision.posX(), collision.posY(), collision.posZ()); - if constexpr (static_cast(TMuonFillMap & VarManager::ObjTypes::MuonCov) || static_cast(TMuonRealignFillMap & VarManager::ObjTypes::MuonCovRealign)) { + if constexpr (static_cast(TMuonFillMap & VarManager::ObjTypes::MuonCov) || static_cast(TMuonFillMap & VarManager::ObjTypes::MuonCovRealign)) { muonCov(VarManager::fgValues[VarManager::kX], VarManager::fgValues[VarManager::kY], VarManager::fgValues[VarManager::kZ], VarManager::fgValues[VarManager::kPhi], VarManager::fgValues[VarManager::kTgl], muon.sign() / VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kMuonCXX], VarManager::fgValues[VarManager::kMuonCXY], VarManager::fgValues[VarManager::kMuonCYY], VarManager::fgValues[VarManager::kMuonCPhiX], VarManager::fgValues[VarManager::kMuonCPhiY], VarManager::fgValues[VarManager::kMuonCPhiPhi], VarManager::fgValues[VarManager::kMuonCTglX], VarManager::fgValues[VarManager::kMuonCTglY], VarManager::fgValues[VarManager::kMuonCTglPhi], VarManager::fgValues[VarManager::kMuonCTglTgl], VarManager::fgValues[VarManager::kMuonC1Pt2X], VarManager::fgValues[VarManager::kMuonC1Pt2Y], @@ -1319,11 +1277,11 @@ struct TableMaker { } // end skimMuons // Produce standard barrel + muon tables with event filter (typically for pp and p-Pb) ------------------------------------------------------ - template void fullSkimming(TEvents const& collisions, TBCs const& bcs, TZdcs const& zdcs, - TTracks const& tracksBarrel, TMuons const& muons, TMuonsRealign const& muonsRealign, TMFTTracks const& mftTracks, + TTracks const& tracksBarrel, TMuons const& muons, TMFTTracks const& mftTracks, TTrackAssoc const& trackAssocs, TFwdTrackAssoc const& fwdTrackAssocs, TMFTTrackAssoc const& mftAssocs) { @@ -1418,16 +1376,10 @@ struct TableMaker { if constexpr (static_cast(TMuonFillMap)) { if constexpr (static_cast(TMFTFillMap)) { auto groupedMuonIndices = fwdTrackAssocs.sliceBy(fwdtrackIndicesPerCollision, origIdx); - skimMuons(collision, bcs, muons, nullptr, groupedMuonIndices, mftTracks); + skimMuons(collision, bcs, muons, groupedMuonIndices, mftTracks); } else { - if constexpr (static_cast(TMuonRealignFillMap)) { - auto groupedMuonIndices = fwdTrackAssocs.sliceBy(fwdtrackIndicesPerCollision, origIdx); - auto muonsRealignThisCollision = muonsRealign.sliceBy(perCollisionMuonsRealign, origIdx); - skimMuons(collision, bcs, muons, muonsRealignThisCollision, groupedMuonIndices, nullptr); - } else { - auto groupedMuonIndices = fwdTrackAssocs.sliceBy(fwdtrackIndicesPerCollision, origIdx); - skimMuons(collision, bcs, muons, nullptr, groupedMuonIndices, nullptr); - } + auto groupedMuonIndices = fwdTrackAssocs.sliceBy(fwdtrackIndicesPerCollision, origIdx); + skimMuons(collision, bcs, muons, groupedMuonIndices, nullptr); } } } // end loop over skimmed collisions @@ -1444,7 +1396,7 @@ struct TableMaker { TrackAssoc const& trackAssocs, FwdTrackAssoc const& fwdTrackAssocs, MFTTrackAssoc const& mftAssocs) { - fullSkimming(collisions, bcs, nullptr, tracksBarrel, muons, nullptr, mftTracks, trackAssocs, fwdTrackAssocs, mftAssocs); + fullSkimming(collisions, bcs, nullptr, tracksBarrel, muons, mftTracks, trackAssocs, fwdTrackAssocs, mftAssocs); } // produce the barrel-only DQ skimmed data model typically for pp/p-Pb or UPC Pb-Pb (no centrality), subscribe to the DQ event filter (filter-pp or filter-PbPb) @@ -1452,14 +1404,14 @@ struct TableMaker { MyBarrelTracksWithCov const& tracksBarrel, TrackAssoc const& trackAssocs) { - fullSkimming(collisions, bcs, zdcs, tracksBarrel, nullptr, nullptr, nullptr, trackAssocs, nullptr, nullptr); + fullSkimming(collisions, bcs, zdcs, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr); } // produce the muon-only DQ skimmed data model typically for pp/p-Pb or UPC Pb-Pb (no centrality), subscribe to the DQ event filter (filter-pp or filter-PbPb) void processPPWithFilterMuonOnly(MyEventsWithMultsAndFilter const& collisions, BCsWithTimestamps const& bcs, MyMuonsWithCov const& muons, FwdTrackAssoc const& fwdTrackAssocs) { - fullSkimming(collisions, bcs, nullptr, nullptr, muons, nullptr, nullptr, nullptr, fwdTrackAssocs, nullptr); + fullSkimming(collisions, bcs, nullptr, nullptr, muons, nullptr, nullptr, fwdTrackAssocs, nullptr); } // produce the muon+mft DQ skimmed data model typically for pp/p-Pb or UPC Pb-Pb (no centrality), subscribe to the DQ event filter (filter-pp or filter-PbPb) @@ -1467,7 +1419,7 @@ struct TableMaker { MyMuonsWithCov const& muons, MFTTracks const& mftTracks, FwdTrackAssoc const& fwdTrackAssocs, MFTTrackAssoc const& mftAssocs) { - fullSkimming(collisions, bcs, nullptr, nullptr, muons, nullptr, mftTracks, nullptr, fwdTrackAssocs, mftAssocs); + fullSkimming(collisions, bcs, nullptr, nullptr, muons, mftTracks, nullptr, fwdTrackAssocs, mftAssocs); } // produce the barrel-only DQ skimmed data model typically for pp/p-Pb or UPC Pb-Pb (no centrality), meant to run on skimmed data @@ -1475,7 +1427,7 @@ struct TableMaker { MyBarrelTracksWithCov const& tracksBarrel, TrackAssoc const& trackAssocs) { - fullSkimming(collisions, bcs, zdcs, tracksBarrel, nullptr, nullptr, nullptr, trackAssocs, nullptr, nullptr); + fullSkimming(collisions, bcs, zdcs, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr); } // produce the barrel-only DQ skimmed barrel data model, with V0 tagged tracks @@ -1483,21 +1435,21 @@ struct TableMaker { MyBarrelTracksWithV0BitsNoTOF const& tracksBarrel, TrackAssoc const& trackAssocs) { - fullSkimming(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, nullptr, trackAssocs, nullptr, nullptr); + fullSkimming(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr); } // produce the muon-only DQ skimmed data model typically for pp/p-Pb or UPC Pb-Pb (no centrality), meant to run on skimmed data void processPPMuonOnly(MyEventsWithMults const& collisions, BCsWithTimestamps const& bcs, MyMuonsWithCov const& muons, FwdTrackAssoc const& fwdTrackAssocs) { - fullSkimming(collisions, bcs, nullptr, nullptr, muons, nullptr, nullptr, nullptr, fwdTrackAssocs, nullptr); + fullSkimming(collisions, bcs, nullptr, nullptr, muons, nullptr, nullptr, fwdTrackAssocs, nullptr); } // produce the realigned muon-only DQ skimmed data model typically for pp/p-Pb or UPC Pb-Pb (no centrality), meant to run on skimmed data void processPPRealignedMuonOnly(MyEventsWithMults const& collisions, BCsWithTimestamps const& bcs, - MyMuonsWithCov const& muons, MyMuonsRealignWithCov const& muonsRealign, FwdTrackAssoc const& fwdTrackAssocs) + MyMuonsRealignWithCov const& muons, FwdTrackAssoc const& fwdTrackAssocs) { - fullSkimming(collisions, bcs, nullptr, nullptr, muons, muonsRealign, nullptr, nullptr, fwdTrackAssocs, nullptr); + fullSkimming(collisions, bcs, nullptr, nullptr, muons, nullptr, nullptr, fwdTrackAssocs, nullptr); } // produce the muon+mft DQ skimmed data model typically for pp/p-Pb or UPC Pb-Pb (no centrality), meant to run on skimmed data @@ -1505,7 +1457,7 @@ struct TableMaker { MyMuonsWithCov const& muons, MFTTracks const& mftTracks, FwdTrackAssoc const& fwdTrackAssocs, MFTTrackAssoc const& mftAssocs) { - fullSkimming(collisions, bcs, nullptr, nullptr, muons, nullptr, mftTracks, nullptr, fwdTrackAssocs, mftAssocs); + fullSkimming(collisions, bcs, nullptr, nullptr, muons, mftTracks, nullptr, fwdTrackAssocs, mftAssocs); } // Central barrel multiplicity estimation @@ -1513,7 +1465,7 @@ struct TableMaker { MyMuonsWithCov const& muons, MFTTracks const& mftTracks, FwdTrackAssoc const& fwdTrackAssocs, MFTTrackAssoc const& mftAssocs) { - fullSkimming(collisions, bcs, nullptr, nullptr, muons, nullptr, mftTracks, nullptr, fwdTrackAssocs, mftAssocs); + fullSkimming(collisions, bcs, nullptr, nullptr, muons, mftTracks, nullptr, fwdTrackAssocs, mftAssocs); } // produce the full DQ skimmed data model typically for Pb-Pb (with centrality), no subscribtion to the DQ event filter @@ -1523,7 +1475,7 @@ struct TableMaker { TrackAssoc const& trackAssocs, FwdTrackAssoc const& fwdTrackAssocs, MFTTrackAssoc const& mftAssocs) { - fullSkimming(collisions, bcs, nullptr, tracksBarrel, muons, nullptr, mftTracks, trackAssocs, fwdTrackAssocs, mftAssocs); + fullSkimming(collisions, bcs, nullptr, tracksBarrel, muons, mftTracks, trackAssocs, fwdTrackAssocs, mftAssocs); } // produce the barrel only DQ skimmed data model typically for Pb-Pb (with centrality), no subscribtion to the DQ event filter @@ -1531,7 +1483,7 @@ struct TableMaker { MyBarrelTracksWithCov const& tracksBarrel, TrackAssoc const& trackAssocs) { - fullSkimming(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, nullptr, trackAssocs, nullptr, nullptr); + fullSkimming(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr); } // produce the barrel only DQ skimmed data model typically for Pb-Pb (with centrality), no TOF @@ -1540,7 +1492,7 @@ struct TableMaker { TrackAssoc const& trackAssocs) { computeOccupancyEstimators(collisions, tracksPosWithCovNoTOF, tracksNegWithCovNoTOF, presliceWithCovNoTOF, bcs); - fullSkimming(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, nullptr, trackAssocs, nullptr, nullptr); + fullSkimming(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr); } // produce the barrel-only DQ skimmed data model typically for UPC Pb-Pb (no centrality), subscribe to the DQ rapidity gap event filter (filter-PbPb) @@ -1548,7 +1500,7 @@ struct TableMaker { MyBarrelTracksWithCov const& tracksBarrel, TrackAssoc const& trackAssocs) { - fullSkimming(collisions, bcs, zdcs, tracksBarrel, nullptr, nullptr, nullptr, trackAssocs, nullptr, nullptr); + fullSkimming(collisions, bcs, zdcs, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr); } // produce the barrel only DQ skimmed data model typically for Pb-Pb (with centrality), no subscribtion to the DQ event filter @@ -1557,7 +1509,7 @@ struct TableMaker { TrackAssoc const& trackAssocs) { computeOccupancyEstimators(collisions, tracksPos, tracksNeg, preslice, bcs); - fullSkimming(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, nullptr, trackAssocs, nullptr, nullptr); + fullSkimming(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr); } // produce the barrel only DQ skimmed data model typically for Pb-Pb (with centrality), no subscribtion to the DQ event filter @@ -1566,21 +1518,21 @@ struct TableMaker { TrackAssoc const& trackAssocs) { computeOccupancyEstimators(collisions, tracksPosNoTOF, tracksNegNoTOF, presliceNoTOF, bcs); - fullSkimming(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, nullptr, trackAssocs, nullptr, nullptr); + fullSkimming(collisions, bcs, nullptr, tracksBarrel, nullptr, nullptr, trackAssocs, nullptr, nullptr); } // produce the muon only DQ skimmed data model typically for Pb-Pb (with centrality), no subscribtion to the DQ event filter void processPbPbMuonOnly(MyEventsWithCentAndMults const& collisions, BCsWithTimestamps const& bcs, MyMuonsWithCov const& muons, FwdTrackAssoc const& fwdTrackAssocs) { - fullSkimming(collisions, bcs, nullptr, nullptr, muons, nullptr, nullptr, nullptr, fwdTrackAssocs, nullptr); + fullSkimming(collisions, bcs, nullptr, nullptr, muons, nullptr, nullptr, fwdTrackAssocs, nullptr); } // produce the realigned muon only DQ skimmed data model typically for Pb-Pb (with centrality), no subscribtion to the DQ event filter void processPbPbRealignedMuonOnly(MyEventsWithCentAndMults const& collisions, BCsWithTimestamps const& bcs, - MyMuonsWithCov const& muons, MyMuonsRealignWithCov const& muonsRealign, FwdTrackAssoc const& fwdTrackAssocs) + MyMuonsRealignWithCov const& muons, FwdTrackAssoc const& fwdTrackAssocs) { - fullSkimming(collisions, bcs, nullptr, nullptr, muons, muonsRealign, nullptr, nullptr, fwdTrackAssocs, nullptr); + fullSkimming(collisions, bcs, nullptr, nullptr, muons, nullptr, nullptr, fwdTrackAssocs, nullptr); } // produce the muon+mft DQ skimmed data model typically for Pb-Pb (with centrality), no subscribtion to the DQ event filter @@ -1588,7 +1540,7 @@ struct TableMaker { MyMuonsWithCov const& muons, MFTTracks const& mftTracks, FwdTrackAssoc const& fwdTrackAssocs, MFTTrackAssoc const& mftAssocs) { - fullSkimming(collisions, bcs, nullptr, nullptr, muons, nullptr, mftTracks, nullptr, fwdTrackAssocs, mftAssocs); + fullSkimming(collisions, bcs, nullptr, nullptr, muons, mftTracks, nullptr, fwdTrackAssocs, mftAssocs); } // Process the BCs and store stats for luminosity retrieval ----------------------------------------------------------------------------------- From 2c81ced26deea0b8d5535819e486e73d79484e20 Mon Sep 17 00:00:00 2001 From: Anantha Padmanabhan M Nair <82643666+ananthapadmanabhan18@users.noreply.github.com> Date: Mon, 19 May 2025 17:42:01 +0530 Subject: [PATCH 1324/1650] [PWGUD] Removed 2 process functions and fixed o2-linter issues (#11243) --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 719 ++++++++---------------------- 1 file changed, 184 insertions(+), 535 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index 57509889089..4a72438bcf1 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -27,7 +27,6 @@ #include "PWGUD/Core/SGTrackSelector.h" #include "Common/DataModel/PIDResponse.h" #include -#include "TLorentzVector.h" #include #include "Math/Vector4D.h" #include "Math/Vector3D.h" @@ -494,7 +493,10 @@ DECLARE_SOA_TABLE(SignalMCreco, "AOD", "SignalMCreco", struct ExclusiveRhoTo4Pi { SGSelector sgSelector; int rhoPrime = 30113; - uint16_t numPVContrib = 4; + int numFourPionTracks = 4; + int numPiPlus = 2; + int numPiMinus = 2; + float zeroPointEight = 0.8; Produces sigFromData; Produces bkgFromData; Produces generatedMC; @@ -503,16 +505,16 @@ struct ExclusiveRhoTo4Pi { HistogramRegistry histosData{"histosData", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry histosMCgen{"histosMCgen", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry histosMCreco{"histosMCreco", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; - HistogramRegistry histosFastData{"histosFastData", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; - HistogramRegistry histosFastMCreco{"histosFastMCreco", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Configurable vZCut{"vZCut", 10., "Vertex Cut"}; Configurable fv0Cut{"fv0Cut", 50., "FV0A threshold"}; Configurable ft0aCut{"ft0aCut", 150., "FT0A threshold"}; Configurable ft0cCut{"ft0cCut", 50., "FT0C threshold"}; Configurable zdcCut{"zdcCut", 1., "ZDC threshold"}; Configurable pvCut{"pvCut", 1.0, "Use Only PV tracks"}; + Configurable numPVContrib{"numPVContrib", 4, "Number of PV Contributors"}; Configurable dcaZcut{"dcaZcut", 2, "dcaZ cut"}; Configurable dcaXYcut{"dcaXYcut", 0, "dcaXY cut"}; Configurable tpcChi2Cut{"tpcChi2Cut", 4, "Max tpcChi2NCl"}; @@ -524,6 +526,9 @@ struct ExclusiveRhoTo4Pi { Configurable nSigmaTPCcut{"nSigmaTPCcut", 3, "TPC cut"}; Configurable nSigmaTOFcut{"nSigmaTOFcut", 3, "TOF cut"}; + Configurable rhoRapCut{"rhoRapCut", 0.5, "Max abs Rapidity of rho"}; + Configurable rhoPtCut{"rhoPtCut", 0.15, "Min Pt of rho"}; + Configurable nBinsPt{"nBinsPt", 1000, "Number of bins for pT"}; Configurable nBinsInvariantMass{"nBinsInvariantMass", 1000, "Number of bins for Invariant Mass"}; Configurable invariantMassMin{"invariantMassMin", 0.8, "Minimum Invariant Mass"}; @@ -549,7 +554,6 @@ struct ExclusiveRhoTo4Pi { histosData.add("tpcNClsFindable", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); // TPC nSigma - histosData.add("tpcNSigmaPi_WOTS", "TPC nSigma Pion without track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); histosData.add("tpcNSigmaPi_WTS", "TPC nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); histosData.add("tpcNSigmaPi_WTS_PID_Pi", "TPC nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); @@ -561,7 +565,6 @@ struct ExclusiveRhoTo4Pi { // TOF nSigma histosData.add("tofNSigmaPi_WTS", "TOF nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosData.add("tofNSigmaPi_WOTS", "TOF nSigma Pion without track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); histosData.add("tofNSigmaPi_WTS_PID_Pi", "TOF nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); // TOF nSigma of other particles with selected pion tracks @@ -571,13 +574,11 @@ struct ExclusiveRhoTo4Pi { histosData.add("tofNSigmaMu_WTS_PID_Pi", "TOF nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); // Track Transverse Momentum - histosData.add("pT_track_WOTS", "pT without track selection; pT [GeV/c]; Counts", kTH1F, {{nBinsPt, 0, 2}}); histosData.add("pT_track_WTS", "pT with track selection; pT [GeV/c]; Counts", kTH1F, {{nBinsPt, 0, 2}}); histosData.add("pT_track_WTS_PID_Pi", "pT with track selection and PID selection of Pi; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); histosData.add("pT_track_WTS_PID_Pi_contributed", "pT with track selection and PID selection of Pi which are contributed to selected event; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); // Track Rapidity - histosData.add("rapidity_track_WOTS", "Rapidity without track selection; y; Counts", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); histosData.add("rapidity_track_WTS", "Rapidity with track selection; y; Counts", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); histosData.add("rapidity_track_WTS_PID_Pi", "Rapidity with track selection and PID selection of Pi; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); histosData.add("rapidity_track_WTS_PID_Pi_contributed", "Rapidity with track selection and PID selection of Pi which are contributed to selected event; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); @@ -686,7 +687,6 @@ struct ExclusiveRhoTo4Pi { histosMCreco.add("EventCounts", "Total Events; Events", kTH1F, {{10, 0, 10}}); // TPC nSigma - histosMCreco.add("tpcNSigmaPi_WOTS", "TPC nSigma Pion without track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); histosMCreco.add("tpcNSigmaPi_WTS", "TPC nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); histosMCreco.add("tpcNSigmaPi_WTS_PID_Pi", "TPC nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); @@ -698,7 +698,6 @@ struct ExclusiveRhoTo4Pi { // TOF nSigma histosMCreco.add("tofNSigmaPi_WTS", "TOF nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosMCreco.add("tofNSigmaPi_WOTS", "TOF nSigma Pion without track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); histosMCreco.add("tofNSigmaPi_WTS_PID_Pi", "TOF nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); // TOF nSigma of other particles with selected pion tracks @@ -708,13 +707,11 @@ struct ExclusiveRhoTo4Pi { histosMCreco.add("tofNSigmaMu_WTS_PID_Pi", "TOF nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); // Track Transverse Momentum - histosMCreco.add("pT_track_WOTS", "pT without track selection; pT [GeV/c]; Counts", kTH1F, {{nBinsPt, 0, 2}}); histosMCreco.add("pT_track_WTS", "pT with track selection; pT [GeV/c]; Counts", kTH1F, {{nBinsPt, 0, 2}}); histosMCreco.add("pT_track_WTS_PID_Pi", "pT with track selection and PID selection of Pi; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); histosMCreco.add("pT_track_WTS_PID_Pi_contributed", "pT with track selection and PID selection of Pi which are contributed to selected event; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); // Track Rapidity - histosMCreco.add("rapidity_track_WOTS", "Rapidity without track selection; y; Counts", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); histosMCreco.add("rapidity_track_WTS", "Rapidity with track selection; y; Counts", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); histosMCreco.add("rapidity_track_WTS_PID_Pi", "Rapidity with track selection and PID selection of Pi; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); histosMCreco.add("rapidity_track_WTS_PID_Pi_contributed", "Rapidity with track selection and PID selection of Pi which are contributed to selected event; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); @@ -774,18 +771,6 @@ struct ExclusiveRhoTo4Pi { histosMCreco.add("phi_cosTheta_pair_1", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); histosMCreco.add("phi_cosTheta_pair_2", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); - // Fast Data Stuff - histosFastData.add("4PionMassWithCut", "", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); - histosFastData.add("4PionMassFull", "", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); - histosFastData.add("4PionPt", "", kTH1F, {{nBinsPt, 0, 10}}); - histosFastData.add("4PionRapidity", "", kTH1F, {{nBinsRapidity, -1, 1}}); - - // Fast MC reco Stuff - histosFastMCreco.add("4PionMassWithCut", "", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); - histosFastMCreco.add("4PionMassFull", "", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); - histosFastMCreco.add("4PionPt", "", kTH1F, {{nBinsPt, 0, 10}}); - histosFastMCreco.add("4PionRapidity", "", kTH1F, {{nBinsRapidity, -1, 1}}); - } // End of init function //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -796,8 +781,8 @@ struct ExclusiveRhoTo4Pi { double massOfLead208 = 193.6823; double momentumBeam = std::sqrt(halfSqrtSnn * halfSqrtSnn * 208 * 208 - massOfLead208 * massOfLead208); - TLorentzVector pProjCM(0., 0., -momentumBeam, halfSqrtSnn * 208); // projectile - TLorentzVector pTargCM(0., 0., momentumBeam, halfSqrtSnn * 208); // target + ROOT::Math::PxPyPzEVector pProjCM(0., 0., -momentumBeam, halfSqrtSnn * 208); // projectile + ROOT::Math::PxPyPzEVector pTargCM(0., 0., momentumBeam, halfSqrtSnn * 208); // target // TVector3 beta = (-1. / fourpion.E()) * fourpion.Vect(); ROOT::Math::PtEtaPhiMVector v1 = pair1; @@ -826,8 +811,8 @@ struct ExclusiveRhoTo4Pi { double massOfLead208 = 193.6823; double momentumBeam = std::sqrt(halfSqrtSnn * halfSqrtSnn * 208 * 208 - massOfLead208 * massOfLead208); - TLorentzVector pProjCM(0., 0., -momentumBeam, halfSqrtSnn * 208); // projectile - TLorentzVector pTargCM(0., 0., momentumBeam, halfSqrtSnn * 208); // target + ROOT::Math::PxPyPzEVector pProjCM(0., 0., -momentumBeam, halfSqrtSnn * 208); // projectile + ROOT::Math::PxPyPzEVector pTargCM(0., 0., momentumBeam, halfSqrtSnn * 208); // target ROOT::Math::PtEtaPhiMVector v1 = pair1; ROOT::Math::PtEtaPhiMVector v2 = pair2; ROOT::Math::PtEtaPhiMVector v12 = fourpion; @@ -847,31 +832,24 @@ struct ExclusiveRhoTo4Pi { } // End of phiCollinsSoperFrame function------------------------------------------------------------------------------------------------------------------------ //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - using UDtracksfull = soa::Join; - using UDCollisionsFull = soa::Join; // - using UDCollisionFull = UDCollisionsFull::iterator; + Filter vertexCut = (nabs(o2::aod::collision::posZ) <= vZCut) && (o2::aod::collision::numContrib == numPVContrib); + Filter fitcuts = o2::aod::udcollision::totalFV0AmplitudeA < fv0Cut && o2::aod::udcollision::totalFT0AmplitudeA < ft0aCut && o2::aod::udcollision::totalFT0AmplitudeC < ft0cCut; + Filter zdcCuts = (o2::aod::udzdc::energyCommonZNA < zdcCut) && (o2::aod::udzdc::energyCommonZNC < zdcCut); + using UDtracks = soa::Join; + using UDCollisions = soa::Filtered>; // + using UDCollision = UDCollisions::iterator; //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- // Begin of Process function-------------------------------------------------------------------------------------------------------------------------------------------------- - void processData(UDCollisionFull const& collision, UDtracksfull const& tracks) + void processData(UDCollision const& collision, UDtracks const& tracks) { - if (std::abs(collision.posZ()) > 10) { - return; - } - int gapSide = collision.gapSide(); std::vector parameters = {pvCut, dcaZcut, dcaXYcut, tpcChi2Cut, tpcNClsFindableCut, itsChi2Cut, etaCut, pTcut}; int truegapSide = sgSelector.trueGap(collision, fv0Cut, ft0aCut, ft0cCut, zdcCut); histosData.fill(HIST("GapSide"), gapSide); histosData.fill(HIST("TrueGapSide"), truegapSide); histosData.fill(HIST("EventCounts"), 1); - gapSide = truegapSide; - - if ((gapSide != 2)) { - return; - } - histosData.fill(HIST("vertexZ"), collision.posZ()); histosData.fill(HIST("V0A"), collision.totalFV0AmplitudeA()); histosData.fill(HIST("FT0A"), collision.totalFT0AmplitudeA()); @@ -879,108 +857,77 @@ struct ExclusiveRhoTo4Pi { histosData.fill(HIST("ZDC_A"), collision.energyCommonZNA()); histosData.fill(HIST("ZDC_C"), collision.energyCommonZNC()); - if (collision.numContrib() != 4) { - return; - } - - std::vector WOTS_tracks; - std::vector WTS_tracks; - std::vector WTS_PID_Pi_tracks; - std::vector Pi_plus_tracks; - std::vector Pi_minus_tracks; + std::vector selectedTracks; + std::vector selectedPionTracks; + std::vector selectedPionPlusTracks; + std::vector selectedPionMinusTracks; for (const auto& t0 : tracks) { - - WOTS_tracks.push_back(t0); - if (trackselector(t0, parameters)) { - WTS_tracks.push_back(t0); - + selectedTracks.push_back(t0); if (selectionPIDPion(t0, true, nSigmaTPCcut, nSigmaTOFcut)) { - WTS_PID_Pi_tracks.push_back(t0); + selectedPionTracks.push_back(t0); if (t0.sign() == 1) { - Pi_plus_tracks.push_back(t0); + selectedPionPlusTracks.push_back(t0); } if (t0.sign() == -1) { - Pi_minus_tracks.push_back(t0); + selectedPionMinusTracks.push_back(t0); } } // End of Selection PID Pion - } // End of track selections - } // End of loop over tracks - int numTracksWOTS = static_cast(WOTS_tracks.size()); - int numTracksWTS = static_cast(WTS_tracks.size()); - int numTracksWTSandPIDpi = static_cast(WTS_PID_Pi_tracks.size()); - int numPiPlusTracks = static_cast(Pi_plus_tracks.size()); - int numPionMinusTRacks = static_cast(Pi_minus_tracks.size()); - - TLorentzVector tempWOTS; - for (int i = 0; i < numTracksWOTS; i++) { - tempWOTS.SetXYZM(WOTS_tracks[i].px(), WOTS_tracks[i].py(), WOTS_tracks[i].pz(), o2::constants::physics::MassPionCharged); - histosData.fill(HIST("tpcNSigmaPi_WOTS"), WOTS_tracks[i].tpcNSigmaPi(), std::sqrt(WOTS_tracks[i].px() * WOTS_tracks[i].px() + WOTS_tracks[i].py() * WOTS_tracks[i].py())); - histosData.fill(HIST("tofNSigmaPi_WOTS"), WOTS_tracks[i].tofNSigmaPi(), std::sqrt(WOTS_tracks[i].px() * WOTS_tracks[i].px() + WOTS_tracks[i].py() * WOTS_tracks[i].py())); - histosData.fill(HIST("pT_track_WOTS"), std::sqrt(WOTS_tracks[i].px() * WOTS_tracks[i].px() + WOTS_tracks[i].py() * WOTS_tracks[i].py())); - histosData.fill(HIST("rapidity_track_WOTS"), tempWOTS.Rapidity()); - } // End of loop over tracks without selection - - TLorentzVector tempWTS; - for (int i = 0; i < numTracksWTS; i++) { - tempWTS.SetXYZM(WTS_tracks[i].px(), WTS_tracks[i].py(), WTS_tracks[i].pz(), o2::constants::physics::MassPionCharged); - histosData.fill(HIST("tpcSignal"), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py() + WTS_tracks[i].pz() * WTS_tracks[i].pz()), WTS_tracks[i].tpcSignal()); - histosData.fill(HIST("tofBeta"), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py() + WTS_tracks[i].pz() * WTS_tracks[i].pz()), WTS_tracks[i].beta()); - histosData.fill(HIST("tpcNSigmaPi_WTS"), WTS_tracks[i].tpcNSigmaPi(), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py())); - histosData.fill(HIST("tofNSigmaPi_WTS"), WTS_tracks[i].tofNSigmaPi(), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py())); - histosData.fill(HIST("pT_track_WTS"), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py())); - histosData.fill(HIST("rapidity_track_WTS"), tempWTS.Rapidity()); - - histosData.fill(HIST("itsChi2NCl"), WTS_tracks[i].itsChi2NCl()); - histosData.fill(HIST("tpcChi2NCl"), WTS_tracks[i].tpcChi2NCl()); - histosData.fill(HIST("tpcNClsFindable"), WTS_tracks[i].tpcNClsFindable()); - histosData.fill(HIST("dcaXY"), WTS_tracks[i].dcaXY()); - histosData.fill(HIST("dcaZ"), WTS_tracks[i].dcaZ()); - + int numSelectedTracks = static_cast(selectedTracks.size()); + int numSelectedPionTracks = static_cast(selectedPionTracks.size()); + int numPiPlusTracks = static_cast(selectedPionPlusTracks.size()); + int numPionMinusTracks = static_cast(selectedPionMinusTracks.size()); + + for (int i = 0; i < numSelectedTracks; i++) { + ROOT::Math::PxPyPzMVector selectedTrackVector(selectedTracks[i].px(), selectedTracks[i].py(), selectedTracks[i].pz(), o2::constants::physics::MassPionCharged); + histosData.fill(HIST("tpcSignal"), selectedTrackVector.P(), selectedTracks[i].tpcSignal()); + histosData.fill(HIST("tofBeta"), selectedTrackVector.P(), selectedTracks[i].beta()); + histosData.fill(HIST("tpcNSigmaPi_WTS"), selectedTracks[i].tpcNSigmaPi(), selectedTrackVector.Pt()); + histosData.fill(HIST("tofNSigmaPi_WTS"), selectedTracks[i].tofNSigmaPi(), selectedTrackVector.Pt()); + histosData.fill(HIST("pT_track_WTS"), selectedTrackVector.Pt()); + histosData.fill(HIST("rapidity_track_WTS"), selectedTrackVector.Rapidity()); + histosData.fill(HIST("itsChi2NCl"), selectedTracks[i].itsChi2NCl()); + histosData.fill(HIST("tpcChi2NCl"), selectedTracks[i].tpcChi2NCl()); + histosData.fill(HIST("tpcNClsFindable"), selectedTracks[i].tpcNClsFindable()); + histosData.fill(HIST("dcaXY"), selectedTracks[i].dcaXY()); + histosData.fill(HIST("dcaZ"), selectedTracks[i].dcaZ()); } // End of loop over tracks with selection only - TLorentzVector tempWTSPIDPi; - for (int i = 0; i < numTracksWTSandPIDpi; i++) { - - tempWTSPIDPi.SetXYZM(WTS_PID_Pi_tracks[i].px(), WTS_PID_Pi_tracks[i].py(), WTS_PID_Pi_tracks[i].pz(), o2::constants::physics::MassPionCharged); - - histosData.fill(HIST("tpcSignal_Pi"), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py() + WTS_PID_Pi_tracks[i].pz() * WTS_PID_Pi_tracks[i].pz()), WTS_PID_Pi_tracks[i].tpcSignal()); - histosData.fill(HIST("tofBeta_Pi"), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py() + WTS_PID_Pi_tracks[i].pz() * WTS_PID_Pi_tracks[i].pz()), WTS_PID_Pi_tracks[i].beta()); - - histosData.fill(HIST("tpcNSigmaPi_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaPi(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); - histosData.fill(HIST("tpcNSigmaKa_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaKa(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); - histosData.fill(HIST("tpcNSigmaPr_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaPr(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); - histosData.fill(HIST("tpcNSigmaEl_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaEl(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); - histosData.fill(HIST("tpcNSigmaMu_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaMu(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); - - histosData.fill(HIST("tofNSigmaPi_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaPi(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); - histosData.fill(HIST("tofNSigmaKa_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaKa(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); - histosData.fill(HIST("tofNSigmaPr_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaPr(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); - histosData.fill(HIST("tofNSigmaEl_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaEl(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); - histosData.fill(HIST("tofNSigmaMu_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaMu(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); - - histosData.fill(HIST("pT_track_WTS_PID_Pi"), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); - histosData.fill(HIST("rapidity_track_WTS_PID_Pi"), tempWTSPIDPi.Rapidity()); + for (int i = 0; i < numSelectedPionTracks; i++) { + ROOT::Math::PxPyPzMVector selectedPionTrackVector(selectedPionTracks[i].px(), selectedPionTracks[i].py(), selectedPionTracks[i].pz(), o2::constants::physics::MassPionCharged); + histosData.fill(HIST("tpcSignal_Pi"), selectedPionTrackVector.P(), selectedPionTracks[i].tpcSignal()); + histosData.fill(HIST("tofBeta_Pi"), selectedPionTrackVector.P(), selectedPionTracks[i].beta()); + histosData.fill(HIST("tpcNSigmaPi_WTS_PID_Pi"), selectedPionTracks[i].tpcNSigmaPi(), selectedPionTrackVector.Pt()); + histosData.fill(HIST("tpcNSigmaKa_WTS_PID_Pi"), selectedPionTracks[i].tpcNSigmaKa(), selectedPionTrackVector.Pt()); + histosData.fill(HIST("tpcNSigmaPr_WTS_PID_Pi"), selectedPionTracks[i].tpcNSigmaPr(), selectedPionTrackVector.Pt()); + histosData.fill(HIST("tpcNSigmaEl_WTS_PID_Pi"), selectedPionTracks[i].tpcNSigmaEl(), selectedPionTrackVector.Pt()); + histosData.fill(HIST("tpcNSigmaMu_WTS_PID_Pi"), selectedPionTracks[i].tpcNSigmaMu(), selectedPionTrackVector.Pt()); + histosData.fill(HIST("tofNSigmaPi_WTS_PID_Pi"), selectedPionTracks[i].tofNSigmaPi(), selectedPionTrackVector.Pt()); + histosData.fill(HIST("tofNSigmaKa_WTS_PID_Pi"), selectedPionTracks[i].tofNSigmaKa(), selectedPionTrackVector.Pt()); + histosData.fill(HIST("tofNSigmaPr_WTS_PID_Pi"), selectedPionTracks[i].tofNSigmaPr(), selectedPionTrackVector.Pt()); + histosData.fill(HIST("tofNSigmaEl_WTS_PID_Pi"), selectedPionTracks[i].tofNSigmaEl(), selectedPionTrackVector.Pt()); + histosData.fill(HIST("tofNSigmaMu_WTS_PID_Pi"), selectedPionTracks[i].tofNSigmaMu(), selectedPionTrackVector.Pt()); + histosData.fill(HIST("pT_track_WTS_PID_Pi"), selectedPionTrackVector.Pt()); + histosData.fill(HIST("rapidity_track_WTS_PID_Pi"), selectedPionTrackVector.Rapidity()); } // End of loop over tracks with selection and PID selection of Pions - if (numTracksWTSandPIDpi != 4) { + if (numSelectedPionTracks != numFourPionTracks) { return; } // Selecting Events with net charge = 0 - if (numPionMinusTRacks == 2 && numPiPlusTracks == 2) { + if (numPionMinusTracks == numPiMinus && numPiPlusTracks == numPiPlus) { - TLorentzVector p1, p2, p3, p4, p1234; ROOT::Math::PtEtaPhiMVector k1, k2, k3, k4, k1234, k13, k14, k23, k24; - p1.SetXYZM(Pi_plus_tracks[0].px(), Pi_plus_tracks[0].py(), Pi_plus_tracks[0].pz(), o2::constants::physics::MassPionCharged); - p2.SetXYZM(Pi_plus_tracks[1].px(), Pi_plus_tracks[1].py(), Pi_plus_tracks[1].pz(), o2::constants::physics::MassPionCharged); - p3.SetXYZM(Pi_minus_tracks[0].px(), Pi_minus_tracks[0].py(), Pi_minus_tracks[0].pz(), o2::constants::physics::MassPionCharged); - p4.SetXYZM(Pi_minus_tracks[1].px(), Pi_minus_tracks[1].py(), Pi_minus_tracks[1].pz(), o2::constants::physics::MassPionCharged); + ROOT::Math::PxPyPzMVector p1(selectedPionPlusTracks[0].px(), selectedPionPlusTracks[0].py(), selectedPionPlusTracks[0].pz(), o2::constants::physics::MassPionCharged); + ROOT::Math::PxPyPzMVector p2(selectedPionPlusTracks[1].px(), selectedPionPlusTracks[1].py(), selectedPionPlusTracks[1].pz(), o2::constants::physics::MassPionCharged); + ROOT::Math::PxPyPzMVector p3(selectedPionMinusTracks[0].px(), selectedPionMinusTracks[0].py(), selectedPionMinusTracks[0].pz(), o2::constants::physics::MassPionCharged); + ROOT::Math::PxPyPzMVector p4(selectedPionMinusTracks[1].px(), selectedPionMinusTracks[1].py(), selectedPionMinusTracks[1].pz(), o2::constants::physics::MassPionCharged); histosData.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p1.Pt()); histosData.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p2.Pt()); @@ -997,7 +944,7 @@ struct ExclusiveRhoTo4Pi { k3.SetCoordinates(p3.Pt(), p3.Eta(), p3.Phi(), o2::constants::physics::MassPionCharged); k4.SetCoordinates(p4.Pt(), p4.Eta(), p4.Phi(), o2::constants::physics::MassPionCharged); - p1234 = p1 + p2 + p3 + p4; + ROOT::Math::PxPyPzMVector p1234 = p1 + p2 + p3 + p4; k1234 = k1 + k2 + k3 + k4; k13 = k1 + k3; @@ -1014,25 +961,25 @@ struct ExclusiveRhoTo4Pi { collision.posX(), collision.posY(), collision.posZ(), collision.totalFV0AmplitudeA(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), collision.timeFV0A(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFDDA(), collision.timeFDDC(), collision.timeZNA(), collision.timeZNC(), - Pi_plus_tracks[0].dcaXY(), Pi_plus_tracks[1].dcaXY(), Pi_minus_tracks[0].dcaXY(), Pi_minus_tracks[1].dcaXY(), + selectedPionPlusTracks[0].dcaXY(), selectedPionPlusTracks[1].dcaXY(), selectedPionMinusTracks[0].dcaXY(), selectedPionMinusTracks[1].dcaXY(), - Pi_plus_tracks[0].dcaZ(), Pi_plus_tracks[1].dcaZ(), Pi_minus_tracks[0].dcaZ(), Pi_minus_tracks[1].dcaZ(), + selectedPionPlusTracks[0].dcaZ(), selectedPionPlusTracks[1].dcaZ(), selectedPionMinusTracks[0].dcaZ(), selectedPionMinusTracks[1].dcaZ(), - Pi_plus_tracks[0].tpcNSigmaPi(), Pi_plus_tracks[1].tpcNSigmaPi(), Pi_minus_tracks[0].tpcNSigmaPi(), Pi_minus_tracks[1].tpcNSigmaPi(), + selectedPionPlusTracks[0].tpcNSigmaPi(), selectedPionPlusTracks[1].tpcNSigmaPi(), selectedPionMinusTracks[0].tpcNSigmaPi(), selectedPionMinusTracks[1].tpcNSigmaPi(), - Pi_plus_tracks[0].tpcNSigmaKa(), Pi_plus_tracks[1].tpcNSigmaKa(), Pi_minus_tracks[0].tpcNSigmaKa(), Pi_minus_tracks[1].tpcNSigmaKa(), + selectedPionPlusTracks[0].tpcNSigmaKa(), selectedPionPlusTracks[1].tpcNSigmaKa(), selectedPionMinusTracks[0].tpcNSigmaKa(), selectedPionMinusTracks[1].tpcNSigmaKa(), - Pi_plus_tracks[0].tpcNSigmaPr(), Pi_plus_tracks[1].tpcNSigmaPr(), Pi_minus_tracks[0].tpcNSigmaPr(), Pi_minus_tracks[1].tpcNSigmaPr(), + selectedPionPlusTracks[0].tpcNSigmaPr(), selectedPionPlusTracks[1].tpcNSigmaPr(), selectedPionMinusTracks[0].tpcNSigmaPr(), selectedPionMinusTracks[1].tpcNSigmaPr(), - Pi_plus_tracks[0].tpcNSigmaEl(), Pi_plus_tracks[1].tpcNSigmaEl(), Pi_minus_tracks[0].tpcNSigmaEl(), Pi_minus_tracks[1].tpcNSigmaEl(), + selectedPionPlusTracks[0].tpcNSigmaEl(), selectedPionPlusTracks[1].tpcNSigmaEl(), selectedPionMinusTracks[0].tpcNSigmaEl(), selectedPionMinusTracks[1].tpcNSigmaEl(), - Pi_plus_tracks[0].tpcNSigmaMu(), Pi_plus_tracks[1].tpcNSigmaMu(), Pi_minus_tracks[0].tpcNSigmaMu(), Pi_minus_tracks[1].tpcNSigmaMu(), + selectedPionPlusTracks[0].tpcNSigmaMu(), selectedPionPlusTracks[1].tpcNSigmaMu(), selectedPionMinusTracks[0].tpcNSigmaMu(), selectedPionMinusTracks[1].tpcNSigmaMu(), - Pi_plus_tracks[0].tpcChi2NCl(), Pi_plus_tracks[1].tpcChi2NCl(), Pi_minus_tracks[0].tpcChi2NCl(), Pi_minus_tracks[1].tpcChi2NCl(), + selectedPionPlusTracks[0].tpcChi2NCl(), selectedPionPlusTracks[1].tpcChi2NCl(), selectedPionMinusTracks[0].tpcChi2NCl(), selectedPionMinusTracks[1].tpcChi2NCl(), - Pi_plus_tracks[0].tpcNClsFindable(), Pi_plus_tracks[1].tpcNClsFindable(), Pi_minus_tracks[0].tpcNClsFindable(), Pi_minus_tracks[1].tpcNClsFindable(), + selectedPionPlusTracks[0].tpcNClsFindable(), selectedPionPlusTracks[1].tpcNClsFindable(), selectedPionMinusTracks[0].tpcNClsFindable(), selectedPionMinusTracks[1].tpcNClsFindable(), - Pi_plus_tracks[0].itsChi2NCl(), Pi_plus_tracks[1].itsChi2NCl(), Pi_minus_tracks[0].itsChi2NCl(), Pi_minus_tracks[1].itsChi2NCl(), + selectedPionPlusTracks[0].itsChi2NCl(), selectedPionPlusTracks[1].itsChi2NCl(), selectedPionMinusTracks[0].itsChi2NCl(), selectedPionMinusTracks[1].itsChi2NCl(), p1.Pt(), p2.Pt(), p3.Pt(), p4.Pt(), p1.Eta(), p2.Eta(), p3.Eta(), p4.Eta(), @@ -1041,9 +988,9 @@ struct ExclusiveRhoTo4Pi { p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), fourPiPhiPair1, fourPiPhiPair2, fourPiCosThetaPair1, fourPiCosThetaPair2); - if (std::fabs(p1234.Rapidity()) < 0.5) { + if (std::fabs(p1234.Rapidity()) < rhoRapCut) { histosData.fill(HIST("pT_event_0charge_WTS_PID_Pi"), p1234.Pt()); - if (p1234.Pt() < 0.15) { + if (p1234.Pt() < rhoPtCut) { histosData.fill(HIST("rapidity_event_0charge_WTS_PID_Pi_domainA"), p1234.Rapidity()); histosData.fill(HIST("invMass_event_0charge_WTS_PID_Pi_domainA"), p1234.M()); @@ -1060,11 +1007,11 @@ struct ExclusiveRhoTo4Pi { histosData.fill(HIST("phi_cosTheta_pair_1"), fourPiPhiPair1, fourPiCosThetaPair1); histosData.fill(HIST("phi_cosTheta_pair_2"), fourPiPhiPair2, fourPiCosThetaPair2); } - if (p1234.Pt() > 0.15 && p1234.Pt() < 0.80) { + if (p1234.Pt() > rhoPtCut && p1234.Pt() < zeroPointEight) { histosData.fill(HIST("rapidity_event_0charge_WTS_PID_Pi_domainB"), p1234.Rapidity()); histosData.fill(HIST("invMass_event_0charge_WTS_PID_Pi_domainB"), p1234.M()); } - if (p1234.Pt() > 0.80) { + if (p1234.Pt() > zeroPointEight) { histosData.fill(HIST("rapidity_event_0charge_WTS_PID_Pi_domainC"), p1234.Rapidity()); histosData.fill(HIST("invMass_event_0charge_WTS_PID_Pi_domainC"), p1234.M()); } @@ -1073,225 +1020,67 @@ struct ExclusiveRhoTo4Pi { } // End of Analysis for 0 charge events // Selecting Events with net charge != 0 for estimation of background - if (numPionMinusTRacks != 2 && numPiPlusTracks != 2) { + if (numPionMinusTracks != numPiMinus && numPiPlusTracks != numPiPlus) { - TLorentzVector p1, p2, p3, p4, p1234; - TLorentzVector tempVec; - p1.SetXYZM(WTS_PID_Pi_tracks[0].px(), WTS_PID_Pi_tracks[0].py(), WTS_PID_Pi_tracks[0].pz(), o2::constants::physics::MassPionCharged); - p2.SetXYZM(WTS_PID_Pi_tracks[1].px(), WTS_PID_Pi_tracks[1].py(), WTS_PID_Pi_tracks[1].pz(), o2::constants::physics::MassPionCharged); - p3.SetXYZM(WTS_PID_Pi_tracks[2].px(), WTS_PID_Pi_tracks[2].py(), WTS_PID_Pi_tracks[2].pz(), o2::constants::physics::MassPionCharged); - p4.SetXYZM(WTS_PID_Pi_tracks[3].px(), WTS_PID_Pi_tracks[3].py(), WTS_PID_Pi_tracks[3].pz(), o2::constants::physics::MassPionCharged); + ROOT::Math::PxPyPzMVector p1(selectedPionTracks[0].px(), selectedPionTracks[0].py(), selectedPionTracks[0].pz(), o2::constants::physics::MassPionCharged); + ROOT::Math::PxPyPzMVector p2(selectedPionTracks[1].px(), selectedPionTracks[1].py(), selectedPionTracks[1].pz(), o2::constants::physics::MassPionCharged); + ROOT::Math::PxPyPzMVector p3(selectedPionTracks[2].px(), selectedPionTracks[2].py(), selectedPionTracks[2].pz(), o2::constants::physics::MassPionCharged); + ROOT::Math::PxPyPzMVector p4(selectedPionTracks[3].px(), selectedPionTracks[3].py(), selectedPionTracks[3].pz(), o2::constants::physics::MassPionCharged); - p1234 = p1 + p2 + p3 + p4; + ROOT::Math::PxPyPzMVector p1234 = p1 + p2 + p3 + p4; bkgFromData( collision.posX(), collision.posY(), collision.posZ(), collision.totalFV0AmplitudeA(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), collision.timeFV0A(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFDDA(), collision.timeFDDC(), collision.timeZNA(), collision.timeZNC(), - WTS_PID_Pi_tracks[0].dcaXY(), WTS_PID_Pi_tracks[1].dcaXY(), WTS_PID_Pi_tracks[0].dcaXY(), WTS_PID_Pi_tracks[1].dcaXY(), - WTS_PID_Pi_tracks[0].dcaZ(), WTS_PID_Pi_tracks[1].dcaZ(), WTS_PID_Pi_tracks[0].dcaZ(), WTS_PID_Pi_tracks[1].dcaZ(), - WTS_PID_Pi_tracks[0].tpcNSigmaPi(), WTS_PID_Pi_tracks[1].tpcNSigmaPi(), WTS_PID_Pi_tracks[0].tpcNSigmaPi(), WTS_PID_Pi_tracks[1].tpcNSigmaPi(), - WTS_PID_Pi_tracks[0].tpcNSigmaKa(), WTS_PID_Pi_tracks[1].tpcNSigmaKa(), WTS_PID_Pi_tracks[0].tpcNSigmaKa(), WTS_PID_Pi_tracks[1].tpcNSigmaKa(), - WTS_PID_Pi_tracks[0].tpcNSigmaPr(), WTS_PID_Pi_tracks[1].tpcNSigmaPr(), WTS_PID_Pi_tracks[0].tpcNSigmaPr(), WTS_PID_Pi_tracks[1].tpcNSigmaPr(), - WTS_PID_Pi_tracks[0].tpcNSigmaEl(), WTS_PID_Pi_tracks[1].tpcNSigmaEl(), WTS_PID_Pi_tracks[0].tpcNSigmaEl(), WTS_PID_Pi_tracks[1].tpcNSigmaEl(), - WTS_PID_Pi_tracks[0].tpcNSigmaMu(), WTS_PID_Pi_tracks[1].tpcNSigmaMu(), WTS_PID_Pi_tracks[0].tpcNSigmaMu(), WTS_PID_Pi_tracks[1].tpcNSigmaMu(), - WTS_PID_Pi_tracks[0].itsChi2NCl(), WTS_PID_Pi_tracks[1].itsChi2NCl(), WTS_PID_Pi_tracks[0].itsChi2NCl(), WTS_PID_Pi_tracks[1].itsChi2NCl(), - WTS_PID_Pi_tracks[0].tpcChi2NCl(), WTS_PID_Pi_tracks[1].tpcChi2NCl(), WTS_PID_Pi_tracks[0].tpcChi2NCl(), WTS_PID_Pi_tracks[1].tpcChi2NCl(), - WTS_PID_Pi_tracks[0].tpcNClsFindable(), WTS_PID_Pi_tracks[1].tpcNClsFindable(), WTS_PID_Pi_tracks[0].tpcNClsFindable(), WTS_PID_Pi_tracks[1].tpcNClsFindable(), + selectedPionTracks[0].dcaXY(), selectedPionTracks[1].dcaXY(), selectedPionTracks[0].dcaXY(), selectedPionTracks[1].dcaXY(), + selectedPionTracks[0].dcaZ(), selectedPionTracks[1].dcaZ(), selectedPionTracks[0].dcaZ(), selectedPionTracks[1].dcaZ(), + selectedPionTracks[0].tpcNSigmaPi(), selectedPionTracks[1].tpcNSigmaPi(), selectedPionTracks[0].tpcNSigmaPi(), selectedPionTracks[1].tpcNSigmaPi(), + selectedPionTracks[0].tpcNSigmaKa(), selectedPionTracks[1].tpcNSigmaKa(), selectedPionTracks[0].tpcNSigmaKa(), selectedPionTracks[1].tpcNSigmaKa(), + selectedPionTracks[0].tpcNSigmaPr(), selectedPionTracks[1].tpcNSigmaPr(), selectedPionTracks[0].tpcNSigmaPr(), selectedPionTracks[1].tpcNSigmaPr(), + selectedPionTracks[0].tpcNSigmaEl(), selectedPionTracks[1].tpcNSigmaEl(), selectedPionTracks[0].tpcNSigmaEl(), selectedPionTracks[1].tpcNSigmaEl(), + selectedPionTracks[0].tpcNSigmaMu(), selectedPionTracks[1].tpcNSigmaMu(), selectedPionTracks[0].tpcNSigmaMu(), selectedPionTracks[1].tpcNSigmaMu(), + selectedPionTracks[0].itsChi2NCl(), selectedPionTracks[1].itsChi2NCl(), selectedPionTracks[0].itsChi2NCl(), selectedPionTracks[1].itsChi2NCl(), + selectedPionTracks[0].tpcChi2NCl(), selectedPionTracks[1].tpcChi2NCl(), selectedPionTracks[0].tpcChi2NCl(), selectedPionTracks[1].tpcChi2NCl(), + selectedPionTracks[0].tpcNClsFindable(), selectedPionTracks[1].tpcNClsFindable(), selectedPionTracks[0].tpcNClsFindable(), selectedPionTracks[1].tpcNClsFindable(), p1.Pt(), p2.Pt(), p3.Pt(), p4.Pt(), p1.Eta(), p2.Eta(), p3.Eta(), p4.Eta(), p1.Phi(), p2.Phi(), p3.Phi(), p4.Phi(), p1.Rapidity(), p2.Rapidity(), p3.Rapidity(), p4.Rapidity(), p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M()); - if (std::fabs(p1234.Rapidity()) < 0.5) { + if (std::fabs(p1234.Rapidity()) < rhoRapCut) { histosData.fill(HIST("pT_event_non0charge_WTS_PID_Pi"), p1234.Pt()); - if (p1234.Pt() < 0.15) { + if (p1234.Pt() < rhoPtCut) { histosData.fill(HIST("rapidity_event_non0charge_WTS_PID_Pi_domainA"), p1234.Rapidity()); histosData.fill(HIST("invMass_event_non0charge_WTS_PID_Pi_domainA"), p1234.M()); } - if (p1234.Pt() > 0.15 && p1234.Pt() < 0.80) { + if (p1234.Pt() > rhoPtCut && p1234.Pt() < zeroPointEight) { histosData.fill(HIST("rapidity_event_non0charge_WTS_PID_Pi_domainB"), p1234.Rapidity()); histosData.fill(HIST("invMass_event_non0charge_WTS_PID_Pi_domainB"), p1234.M()); } - if (p1234.Pt() > 0.80) { + if (p1234.Pt() > zeroPointEight) { histosData.fill(HIST("rapidity_event_non0charge_WTS_PID_Pi_domainC"), p1234.Rapidity()); histosData.fill(HIST("invMass_event_non0charge_WTS_PID_Pi_domainC"), p1234.M()); } } // End of Rapidity range selection - } // End of Analysis for non 0 charge events - } // End of 4 Pion Analysis Process function for Data PROCESS_SWITCH(ExclusiveRhoTo4Pi, processData, "The Process for 4 Pion Analysis from data", true); //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - Filter collCuts = (nabs(o2::aod::collision::posZ) < 10.0f) && (o2::aod::collision::numContrib == numPVContrib); - Filter fitCuts = (o2::aod::udcollision::totalFT0AmplitudeA < ft0aCut) && (o2::aod::udcollision::totalFT0AmplitudeC < ft0cCut) && (o2::aod::udcollision::totalFV0AmplitudeA < fv0Cut); - Filter zdcCuts = (o2::aod::udzdc::energyCommonZNA < zdcCut) && (o2::aod::udzdc::energyCommonZNC < zdcCut); - Filter trackCuts = (o2::aod::track::tpcChi2NCl < tpcChi2Cut) && (o2::aod::track::tpcNClsFindable > tpcNClsFindableCut) && (o2::aod::track::itsChi2NCl < itsChi2Cut) && (nabs(o2::aod::track::eta) < etaCut) && (o2::aod::track::pt > pTcut) && (nabs(o2::aod::track::dcaZ) < dcaZcut) && (nabs(o2::aod::track::dcaXY) < dcaXYcut); - Filter udtrackCuts = (o2::aod::udtrack::isPVContributor == true); - Filter pidCuts = (nabs(o2::aod::pidtpc::tpcNSigmaPi) < nSigmaTPCcut); - using FilteredTracks = soa::Filtered>; - using FilteredCollisions = soa::Filtered>; - using FilteredCollisionsFull = FilteredCollisions::iterator; - - // // Begin of FAST Process function-------------------------------------------------------------------------------------------------------------------------------------------------- - void processDataFast(FilteredCollisionsFull const& collision, FilteredTracks const& tracks) - { - - if (tracks.size() != 4) { - return; - } - - std::vector pionPlusTracks; - std::vector pionMinusTracks; - - for (const auto& track : tracks) { - if ((!selectionPIDPion(track, true, nSigmaTPCcut, nSigmaTOFcut))) { - continue; - } - if (track.sign() == 1) { - pionPlusTracks.push_back(track); - } - if (track.sign() == -1) { - pionMinusTracks.push_back(track); - } - } // end of loop over tracks - - if ((pionPlusTracks.size() + pionMinusTracks.size()) != 4) { - return; - } - - if (pionPlusTracks.size() == 2 || pionMinusTracks.size() == 2) { - - TLorentzVector p1, p2, p3, p4, p1234; - ROOT::Math::PtEtaPhiMVector k1, k2, k3, k4, k1234, k13, k14, k23, k24; - - p1.SetXYZM(pionPlusTracks[0].px(), pionPlusTracks[0].py(), pionPlusTracks[0].pz(), o2::constants::physics::MassPionCharged); - p2.SetXYZM(pionPlusTracks[1].px(), pionPlusTracks[1].py(), pionPlusTracks[1].pz(), o2::constants::physics::MassPionCharged); - p3.SetXYZM(pionMinusTracks[0].px(), pionMinusTracks[0].py(), pionMinusTracks[0].pz(), o2::constants::physics::MassPionCharged); - p4.SetXYZM(pionMinusTracks[1].px(), pionMinusTracks[1].py(), pionMinusTracks[1].pz(), o2::constants::physics::MassPionCharged); - - k1.SetCoordinates(p1.Pt(), p1.Eta(), p1.Phi(), o2::constants::physics::MassPionCharged); - k2.SetCoordinates(p2.Pt(), p2.Eta(), p2.Phi(), o2::constants::physics::MassPionCharged); - k3.SetCoordinates(p3.Pt(), p3.Eta(), p3.Phi(), o2::constants::physics::MassPionCharged); - k4.SetCoordinates(p4.Pt(), p4.Eta(), p4.Phi(), o2::constants::physics::MassPionCharged); - - p1234 = p1 + p2 + p3 + p4; - k1234 = k1 + k2 + k3 + k4; - - k13 = k1 + k3; - k14 = k1 + k4; - k23 = k2 + k3; - k24 = k2 + k4; - - double fourPiPhiPair1 = phiCollinsSoperFrame(k13, k24, k1234); - double fourPiPhiPair2 = phiCollinsSoperFrame(k14, k23, k1234); - double fourPiCosThetaPair1 = cosThetaCollinsSoperFrame(k13, k24, k1234); - double fourPiCosThetaPair2 = cosThetaCollinsSoperFrame(k14, k23, k1234); - - sigFromData( - collision.posX(), collision.posY(), collision.posZ(), - collision.totalFV0AmplitudeA(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), - collision.timeFV0A(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFDDA(), collision.timeFDDC(), - collision.timeZNA(), collision.timeZNC(), - pionPlusTracks[0].dcaXY(), pionPlusTracks[1].dcaXY(), pionMinusTracks[0].dcaXY(), pionMinusTracks[1].dcaXY(), - pionPlusTracks[0].dcaZ(), pionPlusTracks[1].dcaZ(), pionMinusTracks[0].dcaZ(), pionMinusTracks[1].dcaZ(), - pionPlusTracks[0].tpcNSigmaPi(), pionPlusTracks[1].tpcNSigmaPi(), pionMinusTracks[0].tpcNSigmaPi(), pionMinusTracks[1].tpcNSigmaPi(), - pionPlusTracks[0].tpcNSigmaKa(), pionPlusTracks[1].tpcNSigmaKa(), pionMinusTracks[0].tpcNSigmaKa(), pionMinusTracks[1].tpcNSigmaKa(), - pionPlusTracks[0].tpcNSigmaPr(), pionPlusTracks[1].tpcNSigmaPr(), pionMinusTracks[0].tpcNSigmaPr(), pionMinusTracks[1].tpcNSigmaPr(), - pionPlusTracks[0].tpcNSigmaEl(), pionPlusTracks[1].tpcNSigmaEl(), pionMinusTracks[0].tpcNSigmaEl(), pionMinusTracks[1].tpcNSigmaEl(), - pionPlusTracks[0].tpcNSigmaMu(), pionPlusTracks[1].tpcNSigmaMu(), pionMinusTracks[0].tpcNSigmaMu(), pionMinusTracks[1].tpcNSigmaMu(), - pionPlusTracks[0].tpcChi2NCl(), pionPlusTracks[1].tpcChi2NCl(), pionMinusTracks[0].tpcChi2NCl(), pionMinusTracks[1].tpcChi2NCl(), - pionPlusTracks[0].tpcNClsFindable(), pionPlusTracks[1].tpcNClsFindable(), pionMinusTracks[0].tpcNClsFindable(), pionMinusTracks[1].tpcNClsFindable(), - pionPlusTracks[0].itsChi2NCl(), pionPlusTracks[1].itsChi2NCl(), pionMinusTracks[0].itsChi2NCl(), pionMinusTracks[1].itsChi2NCl(), - p1.Pt(), p2.Pt(), p3.Pt(), p4.Pt(), - p1.Eta(), p2.Eta(), p3.Eta(), p4.Eta(), - p1.Phi(), p2.Phi(), p3.Phi(), p4.Phi(), - p1.Rapidity(), p2.Rapidity(), p3.Rapidity(), p4.Rapidity(), - p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), - fourPiPhiPair1, fourPiPhiPair2, fourPiCosThetaPair1, fourPiCosThetaPair2); - - histosFastData.fill(HIST("4PionPt"), p1234.Pt()); - histosFastData.fill(HIST("4PionRapidity"), p1234.Rapidity()); - histosFastData.fill(HIST("4PionMassFull"), p1234.M()); - - if ((p1234.Pt() < 0.15) && (std::abs(p1234.Rapidity()) < 0.5)) { - histosFastData.fill(HIST("4PionMassWithCut"), p1234.M()); - } - } // End 0 charge event - - if (pionPlusTracks.size() != 2 && pionMinusTracks.size() != 2) { - std::vector allTracks; - int piPlussize = static_cast(pionPlusTracks.size()); - int piMinussize = static_cast(pionMinusTracks.size()); - - for (int i = 0; i < piPlussize; i++) { - allTracks.push_back(pionPlusTracks[i]); - } - for (int i = 0; i < piMinussize; i++) { - allTracks.push_back(pionMinusTracks[i]); - } - - TLorentzVector p1, p2, p3, p4, p1234; - - p1.SetXYZM(allTracks[0].px(), allTracks[0].py(), allTracks[0].pz(), o2::constants::physics::MassPionCharged); - p2.SetXYZM(allTracks[1].px(), allTracks[1].py(), allTracks[1].pz(), o2::constants::physics::MassPionCharged); - p3.SetXYZM(allTracks[2].px(), allTracks[2].py(), allTracks[2].pz(), o2::constants::physics::MassPionCharged); - p4.SetXYZM(allTracks[3].px(), allTracks[3].py(), allTracks[3].pz(), o2::constants::physics::MassPionCharged); - - p1234 = p1 + p2 + p3 + p4; - - bkgFromData( - collision.posX(), collision.posY(), collision.posZ(), - collision.totalFV0AmplitudeA(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), - collision.timeFV0A(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFDDA(), collision.timeFDDC(), collision.timeZNA(), collision.timeZNC(), - allTracks[0].dcaXY(), allTracks[1].dcaXY(), allTracks[2].dcaXY(), allTracks[3].dcaXY(), - - allTracks[0].dcaZ(), allTracks[1].dcaZ(), allTracks[2].dcaZ(), allTracks[3].dcaZ(), - - allTracks[0].tpcNSigmaPi(), allTracks[1].tpcNSigmaPi(), allTracks[2].tpcNSigmaPi(), allTracks[3].tpcNSigmaPi(), - - allTracks[0].tpcNSigmaKa(), allTracks[1].tpcNSigmaKa(), allTracks[2].tpcNSigmaKa(), allTracks[3].tpcNSigmaKa(), - - allTracks[0].tpcNSigmaPr(), allTracks[1].tpcNSigmaPr(), allTracks[2].tpcNSigmaPr(), allTracks[3].tpcNSigmaPr(), - - allTracks[0].tpcNSigmaEl(), allTracks[1].tpcNSigmaEl(), allTracks[2].tpcNSigmaEl(), allTracks[3].tpcNSigmaEl(), - - allTracks[0].tpcNSigmaMu(), allTracks[1].tpcNSigmaMu(), allTracks[2].tpcNSigmaMu(), allTracks[3].tpcNSigmaMu(), - - allTracks[0].tpcChi2NCl(), allTracks[1].tpcChi2NCl(), allTracks[2].tpcChi2NCl(), allTracks[3].tpcChi2NCl(), - - allTracks[0].tpcNClsFindable(), allTracks[1].tpcNClsFindable(), allTracks[2].tpcNClsFindable(), allTracks[3].tpcNClsFindable(), - - allTracks[0].itsChi2NCl(), allTracks[1].itsChi2NCl(), allTracks[2].itsChi2NCl(), allTracks[3].itsChi2NCl(), - - p1.Pt(), p2.Pt(), p3.Pt(), p4.Pt(), - p1.Eta(), p2.Eta(), p3.Eta(), p4.Eta(), - p1.Phi(), p2.Phi(), p3.Phi(), p4.Phi(), - p1.Rapidity(), p2.Rapidity(), p3.Rapidity(), p4.Rapidity(), - p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M()); - - } // end of non 0 charge event - - } // End of 4 Pion Analysis Process function for Fast Data - PROCESS_SWITCH(ExclusiveRhoTo4Pi, processDataFast, "The Process for 4 Pion Analysis from data fast", true); - // //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - // Begin of MC Generation function----------------------------------------------------------------------------------------------------------------------------------------------- void processMCgen(aod::UDMcCollisions::iterator const&, aod::UDMcParticles const& mcParts) { - std::vector piPlusvectors; - std::vector piMinusvectors; - TLorentzVector daughterVector; + std::vector piPlusvectors; + std::vector piMinusvectors; TVector3 particleVector; for (const auto& particle : mcParts) { - if ((particle.pdgCode() != rhoPrime) || (particle.daughters_as().size() != 4)) { + if ((particle.pdgCode() != rhoPrime) || (particle.daughters_as().size() != numFourPionTracks)) { continue; } @@ -1301,7 +1090,7 @@ struct ExclusiveRhoTo4Pi { histosMCgen.fill(HIST("rhoPrime_eta"), particleVector.Eta()); for (const auto& daughter : particle.daughters_as()) { - daughterVector.SetXYZM(daughter.px(), daughter.py(), daughter.pz(), o2::constants::physics::MassPionCharged); + ROOT::Math::PxPyPzMVector daughterVector(daughter.px(), daughter.py(), daughter.pz(), o2::constants::physics::MassPionCharged); if (daughter.pdgCode() == PDG_t::kPiPlus) { piPlusvectors.push_back(daughterVector); } @@ -1312,11 +1101,11 @@ struct ExclusiveRhoTo4Pi { } // End of loop over MC particles - if (piPlusvectors.size() != 2 || piMinusvectors.size() != 2) { + if (static_cast(piPlusvectors.size()) != numPiPlus || static_cast(piMinusvectors.size()) != numPiMinus) { return; } - TLorentzVector p1234 = piPlusvectors[0] + piPlusvectors[1] + piMinusvectors[0] + piMinusvectors[1]; + ROOT::Math::PxPyPzMVector p1234 = piPlusvectors[0] + piPlusvectors[1] + piMinusvectors[0] + piMinusvectors[1]; histosMCgen.fill(HIST("pion_pT"), piPlusvectors[0].Pt()); histosMCgen.fill(HIST("pion_pT"), piPlusvectors[1].Pt()); @@ -1380,17 +1169,14 @@ struct ExclusiveRhoTo4Pi { } // End of 4 Pion MC Generation Process function PROCESS_SWITCH(ExclusiveRhoTo4Pi, processMCgen, "The Process for 4 Pion Analysis from MC Generation", false); - using CollisionStuff = soa::Join; + // Begin of MC Reconstruction function----------------------------------------------------------------------------------------------------------------------------------------------- + using CollisionStuff = soa::Filtered>; using CollisionTotal = CollisionStuff::iterator; using TrackStuff = soa::Join; void processMCrec(CollisionTotal const& collision, TrackStuff const& tracks) { - if (std::abs(collision.posZ()) > 10) { - return; - } - if (!collision.has_udMcCollision()) { return; } @@ -1401,12 +1187,6 @@ struct ExclusiveRhoTo4Pi { histosMCreco.fill(HIST("GapSide"), gapSide); histosMCreco.fill(HIST("TrueGapSide"), truegapSide); histosMCreco.fill(HIST("EventCounts"), 1); - gapSide = truegapSide; - - if ((gapSide != 2)) { - return; - } - histosMCreco.fill(HIST("vertexZ"), collision.posZ()); histosMCreco.fill(HIST("V0A"), collision.totalFV0AmplitudeA()); histosMCreco.fill(HIST("FT0A"), collision.totalFT0AmplitudeA()); @@ -1414,108 +1194,77 @@ struct ExclusiveRhoTo4Pi { histosMCreco.fill(HIST("ZDC_A"), collision.energyCommonZNA()); histosMCreco.fill(HIST("ZDC_C"), collision.energyCommonZNC()); - if (collision.numContrib() != 4) { - return; - } - - std::vector WOTS_tracks; - std::vector WTS_tracks; - std::vector WTS_PID_Pi_tracks; - std::vector Pi_plus_tracks; - std::vector Pi_minus_tracks; + std::vector selectedTracks; + std::vector selectedPionTracks; + std::vector selectedPionPlusTracks; + std::vector selectedPionMinusTracks; for (const auto& t0 : tracks) { - - WOTS_tracks.push_back(t0); - if (trackselector(t0, parameters) && t0.has_udMcParticle()) { - WTS_tracks.push_back(t0); - + selectedTracks.push_back(t0); if (selectionPIDPion(t0, true, nSigmaTPCcut, nSigmaTOFcut)) { - WTS_PID_Pi_tracks.push_back(t0); + selectedPionTracks.push_back(t0); if (t0.sign() == 1) { - Pi_plus_tracks.push_back(t0); + selectedPionPlusTracks.push_back(t0); } if (t0.sign() == -1) { - Pi_minus_tracks.push_back(t0); + selectedPionMinusTracks.push_back(t0); } } // End of Selection PID Pion - } // End of track selections - } // End of loop over tracks - int numTracksWOTS = static_cast(WOTS_tracks.size()); - int numTracksWTS = static_cast(WTS_tracks.size()); - int numTracksWTSandPIDpi = static_cast(WTS_PID_Pi_tracks.size()); - int numPiPlusTracks = static_cast(Pi_plus_tracks.size()); - int numPionMinusTRacks = static_cast(Pi_minus_tracks.size()); - - TLorentzVector tempWOTS; - for (int i = 0; i < numTracksWOTS; i++) { - tempWOTS.SetXYZM(WOTS_tracks[i].px(), WOTS_tracks[i].py(), WOTS_tracks[i].pz(), o2::constants::physics::MassPionCharged); - histosMCreco.fill(HIST("tpcNSigmaPi_WOTS"), WOTS_tracks[i].tpcNSigmaPi(), std::sqrt(WOTS_tracks[i].px() * WOTS_tracks[i].px() + WOTS_tracks[i].py() * WOTS_tracks[i].py())); - histosMCreco.fill(HIST("tofNSigmaPi_WOTS"), WOTS_tracks[i].tofNSigmaPi(), std::sqrt(WOTS_tracks[i].px() * WOTS_tracks[i].px() + WOTS_tracks[i].py() * WOTS_tracks[i].py())); - histosMCreco.fill(HIST("pT_track_WOTS"), std::sqrt(WOTS_tracks[i].px() * WOTS_tracks[i].px() + WOTS_tracks[i].py() * WOTS_tracks[i].py())); - histosMCreco.fill(HIST("rapidity_track_WOTS"), tempWOTS.Rapidity()); - - } // End of loop over tracks without selection - - TLorentzVector tempWTS; - for (int i = 0; i < numTracksWTS; i++) { - tempWTS.SetXYZM(WTS_tracks[i].px(), WTS_tracks[i].py(), WTS_tracks[i].pz(), o2::constants::physics::MassPionCharged); - histosMCreco.fill(HIST("tpcSignal"), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py() + WTS_tracks[i].pz() * WTS_tracks[i].pz()), WTS_tracks[i].tpcSignal()); - histosMCreco.fill(HIST("tofBeta"), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py() + WTS_tracks[i].pz() * WTS_tracks[i].pz()), WTS_tracks[i].beta()); - histosMCreco.fill(HIST("tpcNSigmaPi_WTS"), WTS_tracks[i].tpcNSigmaPi(), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py())); - histosMCreco.fill(HIST("tofNSigmaPi_WTS"), WTS_tracks[i].tofNSigmaPi(), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py())); - histosMCreco.fill(HIST("pT_track_WTS"), std::sqrt(WTS_tracks[i].px() * WTS_tracks[i].px() + WTS_tracks[i].py() * WTS_tracks[i].py())); - histosMCreco.fill(HIST("rapidity_track_WTS"), tempWTS.Rapidity()); - - histosMCreco.fill(HIST("itsChi2NCl"), WTS_tracks[i].itsChi2NCl()); - histosMCreco.fill(HIST("tpcChi2NCl"), WTS_tracks[i].tpcChi2NCl()); - histosMCreco.fill(HIST("tpcNClsFindable"), WTS_tracks[i].tpcNClsFindable()); - histosMCreco.fill(HIST("dcaXY"), WTS_tracks[i].dcaXY()); - histosMCreco.fill(HIST("dcaZ"), WTS_tracks[i].dcaZ()); + int numSelectedTracks = static_cast(selectedTracks.size()); + int numSelectedPionTracks = static_cast(selectedPionTracks.size()); + int numPiPlusTracks = static_cast(selectedPionPlusTracks.size()); + int numPionMinusTRacks = static_cast(selectedPionMinusTracks.size()); + + for (int i = 0; i < numSelectedTracks; i++) { + ROOT::Math::PxPyPzMVector selectedTrackVector(selectedTracks[i].px(), selectedTracks[i].py(), selectedTracks[i].pz(), o2::constants::physics::MassPionCharged); + histosMCreco.fill(HIST("tpcSignal"), selectedTrackVector.P(), selectedTracks[i].tpcSignal()); + histosMCreco.fill(HIST("tofBeta"), selectedTrackVector.P(), selectedTracks[i].beta()); + histosMCreco.fill(HIST("tpcNSigmaPi_WTS"), selectedTracks[i].tpcNSigmaPi(), selectedTrackVector.Pt()); + histosMCreco.fill(HIST("tofNSigmaPi_WTS"), selectedTracks[i].tofNSigmaPi(), selectedTrackVector.Pt()); + histosMCreco.fill(HIST("pT_track_WTS"), selectedTrackVector.Pt()); + histosMCreco.fill(HIST("rapidity_track_WTS"), selectedTrackVector.Rapidity()); + histosMCreco.fill(HIST("itsChi2NCl"), selectedTracks[i].itsChi2NCl()); + histosMCreco.fill(HIST("tpcChi2NCl"), selectedTracks[i].tpcChi2NCl()); + histosMCreco.fill(HIST("tpcNClsFindable"), selectedTracks[i].tpcNClsFindable()); + histosMCreco.fill(HIST("dcaXY"), selectedTracks[i].dcaXY()); + histosMCreco.fill(HIST("dcaZ"), selectedTracks[i].dcaZ()); } // End of loop over tracks with selection only - TLorentzVector tempWTSPIDPi; - for (int i = 0; i < numTracksWTSandPIDpi; i++) { - - tempWTSPIDPi.SetXYZM(WTS_PID_Pi_tracks[i].px(), WTS_PID_Pi_tracks[i].py(), WTS_PID_Pi_tracks[i].pz(), o2::constants::physics::MassPionCharged); - - histosMCreco.fill(HIST("tpcSignal_Pi"), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py() + WTS_PID_Pi_tracks[i].pz() * WTS_PID_Pi_tracks[i].pz()), WTS_PID_Pi_tracks[i].tpcSignal()); - histosMCreco.fill(HIST("tofBeta_Pi"), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py() + WTS_PID_Pi_tracks[i].pz() * WTS_PID_Pi_tracks[i].pz()), WTS_PID_Pi_tracks[i].beta()); - - histosMCreco.fill(HIST("tpcNSigmaPi_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaPi(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); - histosMCreco.fill(HIST("tpcNSigmaKa_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaKa(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); - histosMCreco.fill(HIST("tpcNSigmaPr_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaPr(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); - histosMCreco.fill(HIST("tpcNSigmaEl_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaEl(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); - histosMCreco.fill(HIST("tpcNSigmaMu_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tpcNSigmaMu(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); - - histosMCreco.fill(HIST("tofNSigmaPi_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaPi(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); - histosMCreco.fill(HIST("tofNSigmaKa_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaKa(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); - histosMCreco.fill(HIST("tofNSigmaPr_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaPr(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); - histosMCreco.fill(HIST("tofNSigmaEl_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaEl(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); - histosMCreco.fill(HIST("tofNSigmaMu_WTS_PID_Pi"), WTS_PID_Pi_tracks[i].tofNSigmaMu(), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); - - histosMCreco.fill(HIST("pT_track_WTS_PID_Pi"), std::sqrt(WTS_PID_Pi_tracks[i].px() * WTS_PID_Pi_tracks[i].px() + WTS_PID_Pi_tracks[i].py() * WTS_PID_Pi_tracks[i].py())); - histosMCreco.fill(HIST("rapidity_track_WTS_PID_Pi"), tempWTSPIDPi.Rapidity()); + for (int i = 0; i < numSelectedPionTracks; i++) { + ROOT::Math::PxPyPzMVector selectedPionTrackVector(selectedPionTracks[i].px(), selectedPionTracks[i].py(), selectedPionTracks[i].pz(), o2::constants::physics::MassPionCharged); + histosMCreco.fill(HIST("tpcSignal_Pi"), selectedPionTrackVector.P(), selectedPionTracks[i].tpcSignal()); + histosMCreco.fill(HIST("tofBeta_Pi"), selectedPionTrackVector.P(), selectedPionTracks[i].beta()); + histosMCreco.fill(HIST("tpcNSigmaPi_WTS_PID_Pi"), selectedPionTracks[i].tpcNSigmaPi(), selectedPionTrackVector.Pt()); + histosMCreco.fill(HIST("tpcNSigmaKa_WTS_PID_Pi"), selectedPionTracks[i].tpcNSigmaKa(), selectedPionTrackVector.Pt()); + histosMCreco.fill(HIST("tpcNSigmaPr_WTS_PID_Pi"), selectedPionTracks[i].tpcNSigmaPr(), selectedPionTrackVector.Pt()); + histosMCreco.fill(HIST("tpcNSigmaEl_WTS_PID_Pi"), selectedPionTracks[i].tpcNSigmaEl(), selectedPionTrackVector.Pt()); + histosMCreco.fill(HIST("tpcNSigmaMu_WTS_PID_Pi"), selectedPionTracks[i].tpcNSigmaMu(), selectedPionTrackVector.Pt()); + histosMCreco.fill(HIST("tofNSigmaPi_WTS_PID_Pi"), selectedPionTracks[i].tofNSigmaPi(), selectedPionTrackVector.Pt()); + histosMCreco.fill(HIST("tofNSigmaKa_WTS_PID_Pi"), selectedPionTracks[i].tofNSigmaKa(), selectedPionTrackVector.Pt()); + histosMCreco.fill(HIST("tofNSigmaPr_WTS_PID_Pi"), selectedPionTracks[i].tofNSigmaPr(), selectedPionTrackVector.Pt()); + histosMCreco.fill(HIST("tofNSigmaEl_WTS_PID_Pi"), selectedPionTracks[i].tofNSigmaEl(), selectedPionTrackVector.Pt()); + histosMCreco.fill(HIST("tofNSigmaMu_WTS_PID_Pi"), selectedPionTracks[i].tofNSigmaMu(), selectedPionTrackVector.Pt()); + histosMCreco.fill(HIST("pT_track_WTS_PID_Pi"), std::sqrt(selectedPionTracks[i].px() * selectedPionTracks[i].px() + selectedPionTracks[i].py() * selectedPionTracks[i].py())); + histosMCreco.fill(HIST("rapidity_track_WTS_PID_Pi"), selectedPionTrackVector.Rapidity()); } // End of loop over tracks with selection and PID selection of Pions - if (numTracksWTSandPIDpi != 4) { + if (numSelectedPionTracks != numFourPionTracks) { return; } // Selecting Events with net charge = 0 - if (numPionMinusTRacks == 2 && numPiPlusTracks == 2) { + if (numPionMinusTRacks == numPiMinus && numPiPlusTracks == numPiPlus) { - TLorentzVector p1, p2, p3, p4, p1234; ROOT::Math::PtEtaPhiMVector k1, k2, k3, k4, k1234, k13, k14, k23, k24; - p1.SetXYZM(Pi_plus_tracks[0].px(), Pi_plus_tracks[0].py(), Pi_plus_tracks[0].pz(), o2::constants::physics::MassPionCharged); - p2.SetXYZM(Pi_plus_tracks[1].px(), Pi_plus_tracks[1].py(), Pi_plus_tracks[1].pz(), o2::constants::physics::MassPionCharged); - p3.SetXYZM(Pi_minus_tracks[0].px(), Pi_minus_tracks[0].py(), Pi_minus_tracks[0].pz(), o2::constants::physics::MassPionCharged); - p4.SetXYZM(Pi_minus_tracks[1].px(), Pi_minus_tracks[1].py(), Pi_minus_tracks[1].pz(), o2::constants::physics::MassPionCharged); + ROOT::Math::PxPyPzMVector p1(selectedPionPlusTracks[0].px(), selectedPionPlusTracks[0].py(), selectedPionPlusTracks[0].pz(), o2::constants::physics::MassPionCharged); + ROOT::Math::PxPyPzMVector p2(selectedPionPlusTracks[1].px(), selectedPionPlusTracks[1].py(), selectedPionPlusTracks[1].pz(), o2::constants::physics::MassPionCharged); + ROOT::Math::PxPyPzMVector p3(selectedPionMinusTracks[0].px(), selectedPionMinusTracks[0].py(), selectedPionMinusTracks[0].pz(), o2::constants::physics::MassPionCharged); + ROOT::Math::PxPyPzMVector p4(selectedPionMinusTracks[1].px(), selectedPionMinusTracks[1].py(), selectedPionMinusTracks[1].pz(), o2::constants::physics::MassPionCharged); histosMCreco.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p1.Pt()); histosMCreco.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p2.Pt()); @@ -1532,7 +1281,7 @@ struct ExclusiveRhoTo4Pi { k3.SetCoordinates(p3.Pt(), p3.Eta(), p3.Phi(), o2::constants::physics::MassPionCharged); k4.SetCoordinates(p4.Pt(), p4.Eta(), p4.Phi(), o2::constants::physics::MassPionCharged); - p1234 = p1 + p2 + p3 + p4; + ROOT::Math::PxPyPzMVector p1234 = p1 + p2 + p3 + p4; k1234 = k1 + k2 + k3 + k4; k13 = k1 + k3; @@ -1550,16 +1299,16 @@ struct ExclusiveRhoTo4Pi { collision.totalFV0AmplitudeA(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), collision.timeFV0A(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFDDA(), collision.timeFDDC(), collision.timeZNA(), collision.timeZNC(), - Pi_plus_tracks[0].dcaXY(), Pi_plus_tracks[1].dcaXY(), Pi_minus_tracks[0].dcaXY(), Pi_minus_tracks[1].dcaXY(), - Pi_plus_tracks[0].dcaZ(), Pi_plus_tracks[1].dcaZ(), Pi_minus_tracks[0].dcaZ(), Pi_minus_tracks[1].dcaZ(), - Pi_plus_tracks[0].tpcNSigmaPi(), Pi_plus_tracks[1].tpcNSigmaPi(), Pi_minus_tracks[0].tpcNSigmaPi(), Pi_minus_tracks[1].tpcNSigmaPi(), - Pi_plus_tracks[0].tpcNSigmaKa(), Pi_plus_tracks[1].tpcNSigmaKa(), Pi_minus_tracks[0].tpcNSigmaKa(), Pi_minus_tracks[1].tpcNSigmaKa(), - Pi_plus_tracks[0].tpcNSigmaPr(), Pi_plus_tracks[1].tpcNSigmaPr(), Pi_minus_tracks[0].tpcNSigmaPr(), Pi_minus_tracks[1].tpcNSigmaPr(), - Pi_plus_tracks[0].tpcNSigmaEl(), Pi_plus_tracks[1].tpcNSigmaEl(), Pi_minus_tracks[0].tpcNSigmaEl(), Pi_minus_tracks[1].tpcNSigmaEl(), - Pi_plus_tracks[0].tpcNSigmaMu(), Pi_plus_tracks[1].tpcNSigmaMu(), Pi_minus_tracks[0].tpcNSigmaMu(), Pi_minus_tracks[1].tpcNSigmaMu(), - Pi_plus_tracks[0].tpcChi2NCl(), Pi_plus_tracks[1].tpcChi2NCl(), Pi_minus_tracks[0].tpcChi2NCl(), Pi_minus_tracks[1].tpcChi2NCl(), - Pi_plus_tracks[0].tpcNClsFindable(), Pi_plus_tracks[1].tpcNClsFindable(), Pi_minus_tracks[0].tpcNClsFindable(), Pi_minus_tracks[1].tpcNClsFindable(), - Pi_plus_tracks[0].itsChi2NCl(), Pi_plus_tracks[1].itsChi2NCl(), Pi_minus_tracks[0].itsChi2NCl(), Pi_minus_tracks[1].itsChi2NCl(), + selectedPionPlusTracks[0].dcaXY(), selectedPionPlusTracks[1].dcaXY(), selectedPionMinusTracks[0].dcaXY(), selectedPionMinusTracks[1].dcaXY(), + selectedPionPlusTracks[0].dcaZ(), selectedPionPlusTracks[1].dcaZ(), selectedPionMinusTracks[0].dcaZ(), selectedPionMinusTracks[1].dcaZ(), + selectedPionPlusTracks[0].tpcNSigmaPi(), selectedPionPlusTracks[1].tpcNSigmaPi(), selectedPionMinusTracks[0].tpcNSigmaPi(), selectedPionMinusTracks[1].tpcNSigmaPi(), + selectedPionPlusTracks[0].tpcNSigmaKa(), selectedPionPlusTracks[1].tpcNSigmaKa(), selectedPionMinusTracks[0].tpcNSigmaKa(), selectedPionMinusTracks[1].tpcNSigmaKa(), + selectedPionPlusTracks[0].tpcNSigmaPr(), selectedPionPlusTracks[1].tpcNSigmaPr(), selectedPionMinusTracks[0].tpcNSigmaPr(), selectedPionMinusTracks[1].tpcNSigmaPr(), + selectedPionPlusTracks[0].tpcNSigmaEl(), selectedPionPlusTracks[1].tpcNSigmaEl(), selectedPionMinusTracks[0].tpcNSigmaEl(), selectedPionMinusTracks[1].tpcNSigmaEl(), + selectedPionPlusTracks[0].tpcNSigmaMu(), selectedPionPlusTracks[1].tpcNSigmaMu(), selectedPionMinusTracks[0].tpcNSigmaMu(), selectedPionMinusTracks[1].tpcNSigmaMu(), + selectedPionPlusTracks[0].tpcChi2NCl(), selectedPionPlusTracks[1].tpcChi2NCl(), selectedPionMinusTracks[0].tpcChi2NCl(), selectedPionMinusTracks[1].tpcChi2NCl(), + selectedPionPlusTracks[0].tpcNClsFindable(), selectedPionPlusTracks[1].tpcNClsFindable(), selectedPionMinusTracks[0].tpcNClsFindable(), selectedPionMinusTracks[1].tpcNClsFindable(), + selectedPionPlusTracks[0].itsChi2NCl(), selectedPionPlusTracks[1].itsChi2NCl(), selectedPionMinusTracks[0].itsChi2NCl(), selectedPionMinusTracks[1].itsChi2NCl(), p1.Pt(), p2.Pt(), p3.Pt(), p4.Pt(), p1.Eta(), p2.Eta(), p3.Eta(), p4.Eta(), p1.Phi(), p2.Phi(), p3.Phi(), p4.Phi(), @@ -1567,9 +1316,9 @@ struct ExclusiveRhoTo4Pi { p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), phiPair1, phiPair2, cosThetaPair1, cosThetaPair2); - if (std::fabs(p1234.Rapidity()) < 0.5) { + if (std::fabs(p1234.Rapidity()) < rhoRapCut) { histosMCreco.fill(HIST("pT_event_0charge_WTS_PID_Pi"), p1234.Pt()); - if (p1234.Pt() < 0.15) { + if (p1234.Pt() < rhoPtCut) { histosMCreco.fill(HIST("rapidity_event_0charge_WTS_PID_Pi_domainA"), p1234.Rapidity()); histosMCreco.fill(HIST("invMass_event_0charge_WTS_PID_Pi_domainA"), p1234.M()); @@ -1585,11 +1334,11 @@ struct ExclusiveRhoTo4Pi { histosMCreco.fill(HIST("phi_cosTheta_pair_1"), phiPair1, cosThetaPair1); histosMCreco.fill(HIST("phi_cosTheta_pair_2"), phiPair2, cosThetaPair2); } - if (p1234.Pt() > 0.15 && p1234.Pt() < 0.80) { + if (p1234.Pt() > rhoPtCut && p1234.Pt() < zeroPointEight) { histosMCreco.fill(HIST("rapidity_event_0charge_WTS_PID_Pi_domainB"), p1234.Rapidity()); histosMCreco.fill(HIST("invMass_event_0charge_WTS_PID_Pi_domainB"), p1234.M()); } - if (p1234.Pt() > 0.80) { + if (p1234.Pt() > zeroPointEight) { histosMCreco.fill(HIST("rapidity_event_0charge_WTS_PID_Pi_domainC"), p1234.Rapidity()); histosMCreco.fill(HIST("invMass_event_0charge_WTS_PID_Pi_domainC"), p1234.M()); } @@ -1598,28 +1347,26 @@ struct ExclusiveRhoTo4Pi { } // End of Analysis for 0 charge events // Selecting Events with net charge != 0 for estimation of background - if (numPionMinusTRacks != 2 && numPiPlusTracks != 2) { - - TLorentzVector p1, p2, p3, p4, p1234; - p1.SetXYZM(WTS_PID_Pi_tracks[0].px(), WTS_PID_Pi_tracks[0].py(), WTS_PID_Pi_tracks[0].pz(), o2::constants::physics::MassPionCharged); - p2.SetXYZM(WTS_PID_Pi_tracks[1].px(), WTS_PID_Pi_tracks[1].py(), WTS_PID_Pi_tracks[1].pz(), o2::constants::physics::MassPionCharged); - p3.SetXYZM(WTS_PID_Pi_tracks[2].px(), WTS_PID_Pi_tracks[2].py(), WTS_PID_Pi_tracks[2].pz(), o2::constants::physics::MassPionCharged); - p4.SetXYZM(WTS_PID_Pi_tracks[3].px(), WTS_PID_Pi_tracks[3].py(), WTS_PID_Pi_tracks[3].pz(), o2::constants::physics::MassPionCharged); + if (numPionMinusTRacks != numPiMinus && numPiPlusTracks != numPiPlus) { + ROOT::Math::PxPyPzMVector p1(selectedPionTracks[0].px(), selectedPionTracks[0].py(), selectedPionTracks[0].pz(), o2::constants::physics::MassPionCharged); + ROOT::Math::PxPyPzMVector p2(selectedPionTracks[1].px(), selectedPionTracks[1].py(), selectedPionTracks[1].pz(), o2::constants::physics::MassPionCharged); + ROOT::Math::PxPyPzMVector p3(selectedPionTracks[2].px(), selectedPionTracks[2].py(), selectedPionTracks[2].pz(), o2::constants::physics::MassPionCharged); + ROOT::Math::PxPyPzMVector p4(selectedPionTracks[3].px(), selectedPionTracks[3].py(), selectedPionTracks[3].pz(), o2::constants::physics::MassPionCharged); - p1234 = p1 + p2 + p3 + p4; + ROOT::Math::PxPyPzMVector p1234 = p1 + p2 + p3 + p4; - if (std::fabs(p1234.Rapidity()) < 0.5) { + if (std::fabs(p1234.Rapidity()) < rhoRapCut) { histosMCreco.fill(HIST("pT_event_non0charge_WTS_PID_Pi"), p1234.Pt()); - if (p1234.Pt() < 0.15) { + if (p1234.Pt() < rhoPtCut) { histosMCreco.fill(HIST("rapidity_event_non0charge_WTS_PID_Pi_domainA"), p1234.Rapidity()); histosMCreco.fill(HIST("invMass_event_non0charge_WTS_PID_Pi_domainA"), p1234.M()); } - if (p1234.Pt() > 0.15 && p1234.Pt() < 0.80) { + if (p1234.Pt() > rhoPtCut && p1234.Pt() < zeroPointEight) { histosMCreco.fill(HIST("rapidity_event_non0charge_WTS_PID_Pi_domainB"), p1234.Rapidity()); histosMCreco.fill(HIST("invMass_event_non0charge_WTS_PID_Pi_domainB"), p1234.M()); } - if (p1234.Pt() > 0.80) { + if (p1234.Pt() > zeroPointEight) { histosMCreco.fill(HIST("rapidity_event_non0charge_WTS_PID_Pi_domainC"), p1234.Rapidity()); histosMCreco.fill(HIST("invMass_event_non0charge_WTS_PID_Pi_domainC"), p1234.M()); } @@ -1630,104 +1377,6 @@ struct ExclusiveRhoTo4Pi { } // End of 4 Pion Analysis Process function for MC Reconstruction PROCESS_SWITCH(ExclusiveRhoTo4Pi, processMCrec, "The Process for 4 Pion Analysis from MC Reconstruction", false); - using FilteredTrackStuff = soa::Filtered>; - using FilteredCollisionStuff = soa::Filtered>; - using FilteredCollisionTotal = FilteredCollisionStuff::iterator; - - void processMCrecFast(FilteredCollisionTotal const& collision, FilteredTrackStuff const& tracks) - { - - if ((tracks.size() != 4) || (!collision.has_udMcCollision())) { - return; - } - - std::vector pionPlusTracks; - std::vector pionMinusTracks; - - for (const auto& track : tracks) { - if ((!selectionPIDPion(track, true, nSigmaTPCcut, nSigmaTOFcut)) || (!track.has_udMcParticle())) { - continue; - } - if (track.sign() == 1) { - pionPlusTracks.push_back(track); - } - if (track.sign() == -1) { - pionMinusTracks.push_back(track); - } - } // end of loop over tracks - - if ((pionPlusTracks.size() + pionMinusTracks.size()) != 4) { - return; - } - - if (pionPlusTracks.size() == 2 || pionMinusTracks.size() == 2) { - - TLorentzVector p1, p2, p3, p4, p1234; - ROOT::Math::PtEtaPhiMVector k1, k2, k3, k4, k1234, k13, k14, k23, k24; - - p1.SetXYZM(pionPlusTracks[0].px(), pionPlusTracks[0].py(), pionPlusTracks[0].pz(), o2::constants::physics::MassPionCharged); - p2.SetXYZM(pionPlusTracks[1].px(), pionPlusTracks[1].py(), pionPlusTracks[1].pz(), o2::constants::physics::MassPionCharged); - p3.SetXYZM(pionMinusTracks[0].px(), pionMinusTracks[0].py(), pionMinusTracks[0].pz(), o2::constants::physics::MassPionCharged); - p4.SetXYZM(pionMinusTracks[1].px(), pionMinusTracks[1].py(), pionMinusTracks[1].pz(), o2::constants::physics::MassPionCharged); - - k1.SetCoordinates(p1.Pt(), p1.Eta(), p1.Phi(), o2::constants::physics::MassPionCharged); - k2.SetCoordinates(p2.Pt(), p2.Eta(), p2.Phi(), o2::constants::physics::MassPionCharged); - k3.SetCoordinates(p3.Pt(), p3.Eta(), p3.Phi(), o2::constants::physics::MassPionCharged); - k4.SetCoordinates(p4.Pt(), p4.Eta(), p4.Phi(), o2::constants::physics::MassPionCharged); - - p1234 = p1 + p2 + p3 + p4; - k1234 = k1 + k2 + k3 + k4; - - k13 = k1 + k3; - k14 = k1 + k4; - k23 = k2 + k3; - k24 = k2 + k4; - - double fourPiPhiPair1 = phiCollinsSoperFrame(k13, k24, k1234); - double fourPiPhiPair2 = phiCollinsSoperFrame(k14, k23, k1234); - double fourPiCosThetaPair1 = cosThetaCollinsSoperFrame(k13, k24, k1234); - double fourPiCosThetaPair2 = cosThetaCollinsSoperFrame(k14, k23, k1234); - - sigFromMC( - collision.posX(), collision.posY(), collision.posZ(), - collision.totalFV0AmplitudeA(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), - collision.timeFV0A(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFDDA(), collision.timeFDDC(), collision.timeZNA(), collision.timeZNC(), - pionPlusTracks[0].dcaXY(), pionPlusTracks[1].dcaXY(), pionMinusTracks[0].dcaXY(), pionMinusTracks[1].dcaXY(), - - pionPlusTracks[0].dcaZ(), pionPlusTracks[1].dcaZ(), pionMinusTracks[0].dcaZ(), pionMinusTracks[1].dcaZ(), - - pionPlusTracks[0].tpcNSigmaPi(), pionPlusTracks[1].tpcNSigmaPi(), pionMinusTracks[0].tpcNSigmaPi(), pionMinusTracks[1].tpcNSigmaPi(), - - pionPlusTracks[0].tpcNSigmaKa(), pionPlusTracks[1].tpcNSigmaKa(), pionMinusTracks[0].tpcNSigmaKa(), pionMinusTracks[1].tpcNSigmaKa(), - - pionPlusTracks[0].tpcNSigmaPr(), pionPlusTracks[1].tpcNSigmaPr(), pionMinusTracks[0].tpcNSigmaPr(), pionMinusTracks[1].tpcNSigmaPr(), - - pionPlusTracks[0].tpcNSigmaEl(), pionPlusTracks[1].tpcNSigmaEl(), pionMinusTracks[0].tpcNSigmaEl(), pionMinusTracks[1].tpcNSigmaEl(), - - pionPlusTracks[0].tpcNSigmaMu(), pionPlusTracks[1].tpcNSigmaMu(), pionMinusTracks[0].tpcNSigmaMu(), pionMinusTracks[1].tpcNSigmaMu(), - - pionPlusTracks[0].tpcChi2NCl(), pionPlusTracks[1].tpcChi2NCl(), pionMinusTracks[0].tpcChi2NCl(), pionMinusTracks[1].tpcChi2NCl(), - pionPlusTracks[0].tpcNClsFindable(), pionPlusTracks[1].tpcNClsFindable(), pionMinusTracks[0].tpcNClsFindable(), pionMinusTracks[1].tpcNClsFindable(), - pionPlusTracks[0].itsChi2NCl(), pionPlusTracks[1].itsChi2NCl(), pionMinusTracks[0].itsChi2NCl(), pionMinusTracks[1].itsChi2NCl(), - p1.Pt(), p2.Pt(), p3.Pt(), p4.Pt(), - p1.Eta(), p2.Eta(), p3.Eta(), p4.Eta(), - p1.Phi(), p2.Phi(), p3.Phi(), p4.Phi(), - p1.Rapidity(), p2.Rapidity(), p3.Rapidity(), p4.Rapidity(), - p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M(), - fourPiPhiPair1, fourPiPhiPair2, fourPiCosThetaPair1, fourPiCosThetaPair2); - - histosFastMCreco.fill(HIST("4PionPt"), p1234.Pt()); - histosFastMCreco.fill(HIST("4PionRapidity"), p1234.Rapidity()); - histosFastMCreco.fill(HIST("4PionMassFull"), p1234.M()); - - if ((p1234.Pt() < 0.15) && (std::abs(p1234.Rapidity()) < 0.5)) { - histosFastMCreco.fill(HIST("4PionMassWithCut"), p1234.M()); - } - } // End 0 charge event - } // End of 4 Pion Analysis Process function for Fast MC Reconstruction - - PROCESS_SWITCH(ExclusiveRhoTo4Pi, processMCrecFast, "The Process for 4 Pion Analysis from Fast MC Reconstruction", false); - }; // End of Struct exclusiveRhoTo4Pi ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// From 69e813da0f4558df6550922819ea7ef9d486e73f Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Mon, 19 May 2025 21:16:11 +0900 Subject: [PATCH 1325/1650] [PWGEM/Dilepton] update treeCreatorElectronMLDDA.cxx (#11245) --- PWGEM/Dilepton/DataModel/lmeeMLTables.h | 2 +- PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGEM/Dilepton/DataModel/lmeeMLTables.h b/PWGEM/Dilepton/DataModel/lmeeMLTables.h index a89fe328705..8e0104daf90 100644 --- a/PWGEM/Dilepton/DataModel/lmeeMLTables.h +++ b/PWGEM/Dilepton/DataModel/lmeeMLTables.h @@ -84,7 +84,7 @@ DECLARE_SOA_DYNAMIC_COLUMN(MeanClusterSizeITSob, meanClusterSizeITSob, [](uint32 // reconstructed track information DECLARE_SOA_TABLE(EMPrimaryTracks, "AOD", "EMPTRACK", //! - o2::soa::Index<>, emprimarytrack::CollisionId, collision::PosZ, collision::NumContrib, + o2::soa::Index<>, emprimarytrack::CollisionId, collision::PosZ, collision::NumContrib, evsel::NumTracksInTimeRange, evsel::SumAmpFT0CInTimeRange, track::Pt, track::Eta, track::Phi, track::Tgl, track::Signed1Pt, track::DcaXY, track::DcaZ, track::CYY, track::CZZ, track::CZY, track::TPCNClsFindable, emprimarytrack::TPCNClsFound, emprimarytrack::TPCNClsCrossedRows, diff --git a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx index 227af22c1bb..6b39fd3f7b0 100644 --- a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx +++ b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx @@ -526,7 +526,7 @@ struct TreeCreatorElectronMLDDA { float dcaXY = mDcaInfoCov.getY(); float dcaZ = mDcaInfoCov.getZ(); - emprimarytracks(collision.globalIndex(), collision.posZ(), collision.numContrib(), + emprimarytracks(collision.globalIndex(), collision.posZ(), collision.numContrib(), collision.trackOccupancyInTimeRange(), collision.ft0cOccupancyInTimeRange(), track.pt(), track.eta(), track.phi(), track.tgl(), track.signed1Pt(), dcaXY, dcaZ, track_par_cov_recalc.getSigmaY2(), track_par_cov_recalc.getSigmaZ2(), track_par_cov_recalc.getSigmaZY(), track.tpcNClsFindable(), track.tpcNClsFound(), track.tpcNClsCrossedRows(), From b70f591d1ed057ad08278aeb07a211985bdf2728 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Mon, 19 May 2025 23:11:56 +0900 Subject: [PATCH 1326/1650] [PWGEM/Dilepton] update matchingMFT.cxx (#11247) --- PWGEM/Dilepton/Tasks/matchingMFT.cxx | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/PWGEM/Dilepton/Tasks/matchingMFT.cxx b/PWGEM/Dilepton/Tasks/matchingMFT.cxx index 29050623956..9429b7b8063 100644 --- a/PWGEM/Dilepton/Tasks/matchingMFT.cxx +++ b/PWGEM/Dilepton/Tasks/matchingMFT.cxx @@ -39,6 +39,7 @@ #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/Centrality.h" +#include "Common/CCDB/RCTSelectionFlags.h" using namespace o2; using namespace o2::soa; @@ -86,6 +87,14 @@ struct matchingMFT { Configurable cfgZvtxMin{"cfgZvtxMin", -10.f, "min. Zvtx"}; Configurable cfgZvtxMax{"cfgZvtxMax", 10.f, "max. Zvtx"}; + // for RCT + Configurable cfgRequireGoodRCT{"cfgRequireGoodRCT", false, "require good detector flag in run condtion table"}; + Configurable cfgRCTLabel{"cfgRCTLabel", "CBT_muon_glo", "select 1 [CBT, CBT_hadron, CBT_muon_glo] see O2Physics/Common/CCDB/RCTSelectionFlags.h"}; + Configurable cfgCheckZDC{"cfgCheckZDC", false, "set ZDC flag for PbPb"}; + Configurable cfgTreatLimitedAcceptanceAsBad{"cfgTreatLimitedAcceptanceAsBad", false, "reject all events where the detectors relevant for the specified Runlist are flagged as LimitedAcceptance"}; + + o2::aod::rctsel::RCTFlagsChecker rctChecker; + HistogramRegistry fRegistry{"fRegistry"}; static constexpr std::string_view muon_types[5] = {"MFTMCHMID/", "MFTMCHMIDOtherMatch/", "MFTMCH/", "MCHMID/", "MCH/"}; @@ -100,6 +109,7 @@ struct matchingMFT { ccdb->setLocalObjectValidityChecking(); ccdb->setFatalWhenNull(false); ccdbApi.init(ccdburl); + rctChecker.init(cfgRCTLabel.value, cfgCheckZDC.value, cfgTreatLimitedAcceptanceAsBad.value); addHistograms(); } @@ -609,6 +619,9 @@ struct matchingMFT { if (!collision.has_mcCollision()) { continue; } + if (cfgRequireGoodRCT && !rctChecker.checkTable(collision)) { + continue; + } const float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { continue; @@ -637,6 +650,9 @@ struct matchingMFT { if (!collision.has_mcCollision()) { continue; } + if (cfgRequireGoodRCT && !rctChecker.checkTable(collision)) { + continue; + } const float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}; if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) { continue; From 5750d5c7315262e9c82c7734131949e4df23aaa4 Mon Sep 17 00:00:00 2001 From: Jaideep Tanwar <141036812+jtanwar2212@users.noreply.github.com> Date: Mon, 19 May 2025 20:25:08 +0530 Subject: [PATCH 1327/1650] [PWGLF] Update NucleiTPCPbPb.cxx (#11246) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Nuspex/NucleiTPCPbPb.cxx | 85 ++++++++++++++++++++-------- 1 file changed, 60 insertions(+), 25 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/NucleiTPCPbPb.cxx b/PWGLF/Tasks/Nuspex/NucleiTPCPbPb.cxx index f0bc8ee1851..f4099c4b754 100644 --- a/PWGLF/Tasks/Nuspex/NucleiTPCPbPb.cxx +++ b/PWGLF/Tasks/Nuspex/NucleiTPCPbPb.cxx @@ -65,15 +65,15 @@ constexpr double betheBlochDefault[nParticles][nBetheParams]{ {5.393020, 7.859534, 0.004048, 2.323197, 1.609307, 0.09}, // triton {-126.557359, -0.858569, 1.111643, 1.210323, 2.656374, 0.09}, // helion {-126.557359, -0.858569, 1.111643, 1.210323, 2.656374, 0.09}}; // alpha -const int nTrkSettings = 15; -static const std::vector trackPIDsettingsNames{"useBBparams", "minITSnCls", "minTPCnCls", "maxTPCchi2", "maxITSchi2", "minRigidity", "maxRigidity", "maxTPCnSigma", "TOFrequiredabove", "minTOFmass", "maxTOFmass", "maxDcaXY", "maxDcaZ", "minITSclsSize", "maxITSclsSize"}; +const int nTrkSettings = 16; +static const std::vector trackPIDsettingsNames{"useBBparams", "minITSnCls", "minTPCnCls", "maxTPCchi2", "maxITSchi2", "minRigidity", "maxRigidity", "maxTPCnSigma", "TOFrequiredabove", "minTOFmass", "maxTOFmass", "maxDcaXY", "maxDcaZ", "minITSclsSize", "maxITSclsSize", "minTPCnClsCrossedRows"}; constexpr double trackPIDsettings[nParticles][nTrkSettings]{ - {0, 0, 60, 3.0, 100, 0.15, 1.2, 2.5, -1, 0, 100, 2., 2., 0., 1000}, - {1, 0, 70, 2.5, 100, 0.20, 4.0, 3.0, -1, 0, 100, 2., 2., 0., 1000}, - {1, 0, 70, 5.0, 100, 0.50, 5.0, 3.0, -1, 0, 100, 2., 2., 0., 1000}, - {1, 0, 70, 5.0, 100, 0.50, 5.0, 3.0, -1, 0, 100, 2., 2., 0., 1000}, - {1, 0, 75, 1.5, 100, 0.50, 5.0, 3.0, -1, 0, 100, 2., 2., 0., 1000}, - {1, 0, 70, 1.5, 100, 0.50, 5.0, 3.0, -1, 0, 100, 2., 2., 0., 1000}}; + {0, 0, 60, 3.0, 100, 0.15, 1.2, 2.5, -1, 0, 100, 2., 2., 0., 1000, 70}, + {1, 0, 70, 2.5, 100, 0.20, 4.0, 3.0, -1, 0, 100, 2., 2., 0., 1000, 70}, + {1, 0, 70, 5.0, 100, 0.50, 5.0, 3.0, -1, 0, 100, 2., 2., 0., 1000, 70}, + {1, 0, 70, 5.0, 100, 0.50, 5.0, 3.0, -1, 0, 100, 2., 2., 0., 1000, 70}, + {1, 0, 75, 1.5, 100, 0.50, 5.0, 3.0, -1, 0, 100, 2., 2., 0., 1000, 70}, + {1, 0, 70, 1.5, 100, 0.50, 5.0, 3.0, -1, 0, 100, 2., 2., 0., 1000, 70}}; struct PrimParticles { TString name; int pdgCode, charge; @@ -99,13 +99,34 @@ struct NucleitpcPbPb { Preslice perCollision = aod::track_association::collisionId; HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; Configurable cfgDebug{"cfgDebug", 1, "debug level"}; + // event Selections cuts + Configurable removeITSROFrameBorder{"removeITSROFrameBorder", false, "Remove TF border"}; + Configurable removeNoSameBunchPileup{"removeNoSameBunchPileup", false, "Remove TF border"}; + Configurable requireIsGoodZvtxFT0vsPV{"requireIsGoodZvtxFT0vsPV", false, "Remove TF border"}; + Configurable requireIsVertexITSTPC{"requireIsVertexITSTPC", false, "Remove TF border"}; + Configurable removeNoTimeFrameBorder{"removeNoTimeFrameBorder", false, "Remove TF border"}; Configurable cfgRigidityCorrection{"cfgRigidityCorrection", false, "apply rigidity correction"}; + // Track Selection Cuts Configurable cfgCutEta{"cfgCutEta", 0.9f, "Eta range for tracks"}; Configurable cfgUsePVcontributors{"cfgUsePVcontributors", true, "use tracks that are PV contibutors"}; Configurable cfgITSrequire{"cfgITSrequire", true, "Additional cut on ITS require"}; Configurable cfgTPCrequire{"cfgTPCrequire", true, "Additional cut on TPC require"}; Configurable cfgPassedITSRefit{"cfgPassedITSRefit", true, "Require ITS refit"}; Configurable cfgPassedTPCRefit{"cfgPassedTPCRefit", true, "Require TPC refit"}; + Configurable cfgRapidityRequire{"cfgRapidityRequire", true, "Require Rapidity cut"}; + Configurable cfgTPCNClsfoundRequire{"cfgTPCNClsfoundRequire", true, "Require TPCNClsfound Cut"}; + Configurable cfgTPCNClsCrossedRowsRequire{"cfgTPCNClsCrossedRowsRequire", true, "Require TPCNClsCrossedRows Cut"}; + Configurable cfgmaxTPCchi2Require{"cfgmaxTPCchi2Require", true, "Require maxTPCchi2 Cut"}; + Configurable cfgminITSnClsRequire{"cfgminITSnClsRequire", true, "Require minITSnCls Cut"}; + Configurable cfgmaxITSchi2Require{"cfgmaxITSchi2Require", true, "Require maxITSchi2 Cut"}; + Configurable cfgmaxTPCnSigmaRequire{"cfgmaxTPCnSigmaRequire", true, "Require maxTPCnSigma Cut"}; + Configurable cfgminGetMeanItsClsSizeRequire{"cfgminGetMeanItsClsSizeRequire", true, "Require minGetMeanItsClsSize Cut"}; + Configurable cfgmaxGetMeanItsClsSizeRequire{"cfgmaxGetMeanItsClsSizeRequire", true, "Require maxGetMeanItsClsSize Cut"}; + Configurable cfgRigidityCutRequire{"cfgRigidityCutRequire", true, "Require Rigidity Cut"}; + Configurable cfgmassRequire{"cfgmassRequire", true, "Require mass Cuts"}; + Configurable cfgDCAwithptRequire{"cfgDCAwithptRequire", true, "Require DCA cuts with pt dependance"}; + Configurable cfgDCAnopt{"cfgDCAnopt", true, "Require DCA cuts without pt dependance"}; + Configurable cfgTwicemass{"cfgTwicemass", true, "multiply mass by its charge"}; Configurable> cfgBetheBlochParams{"cfgBetheBlochParams", {betheBlochDefault[0], nParticles, nBetheParams, particleNames, betheBlochParNames}, "TPC Bethe-Bloch parameterisation for light nuclei"}; Configurable> cfgTrackPIDsettings{"cfgTrackPIDsettings", {trackPIDsettings[0], nParticles, nTrkSettings, particleNames, trackPIDsettingsNames}, "track selection and PID criteria"}; Configurable cfgFillDeDxWithoutCut{"cfgFillDeDxWithoutCut", false, "Fill without cut beth bloch"}; @@ -153,7 +174,7 @@ struct NucleitpcPbPb { const AxisSpec axisdEdx{2000, 0, 2000, "d#it{E}/d#it{x}"}; const AxisSpec axisCent{100, 0, 100, "centrality"}; const AxisSpec axisVtxZ{100, -20, 20, "z"}; - const AxisSpec ptAxis{100, 0, 20, "#it{p}_{T} (GeV/#it{c})"}; + const AxisSpec ptAxis{1000, 0, 20, "#it{p}_{T} (GeV/#it{c})"}; const AxisSpec axiseta{100, -1, 1, "eta"}; const AxisSpec axisrapidity{100, -2, 2, "rapidity"}; const AxisSpec axismass{100, 0, 20, "mass^{2}"}; @@ -215,31 +236,30 @@ struct NucleitpcPbPb { if (std::abs(track.eta()) > cfgCutEta) continue; for (size_t i = 0; i < primaryParticles.size(); i++) { - if (std::abs(getRapidity(track, i)) > cfgCutRapidity) + if (std::abs(getRapidity(track, i)) > cfgCutRapidity && cfgRapidityRequire) continue; - if (track.tpcNClsFound() < cfgTrackPIDsettings->get(i, "minTPCnCls")) + if (track.tpcNClsFound() < cfgTrackPIDsettings->get(i, "minTPCnCls") && cfgTPCNClsfoundRequire) continue; - if (track.tpcChi2NCl() > cfgTrackPIDsettings->get(i, "maxTPCchi2")) + if (((track.tpcNClsCrossedRows() < cfgTrackPIDsettings->get(i, "minTPCnClsCrossedRows")) || track.tpcNClsCrossedRows() < 0.8 * track.tpcNClsFindable()) && cfgTPCNClsCrossedRowsRequire) continue; - if (track.itsNCls() < cfgTrackPIDsettings->get(i, "minITSnCls")) + if (track.tpcChi2NCl() > cfgTrackPIDsettings->get(i, "maxTPCchi2") && cfgmaxTPCchi2Require) continue; - if (track.itsChi2NCl() > cfgTrackPIDsettings->get(i, "maxITSchi2")) + if (track.itsNCls() < cfgTrackPIDsettings->get(i, "minITSnCls") && cfgminITSnClsRequire) continue; - fillnsigma(track, i); - if (std::abs(getTPCnSigma(track, primaryParticles.at(i))) > cfgTrackPIDsettings->get(i, "maxTPCnSigma")) + if (track.itsChi2NCl() > cfgTrackPIDsettings->get(i, "maxITSchi2") && cfgmaxITSchi2Require) continue; - filldedx(track, i); - fillhmass(track, i); - if (getMeanItsClsSize(track) < cfgTrackPIDsettings->get(i, "minITSclsSize")) + if (getMeanItsClsSize(track) < cfgTrackPIDsettings->get(i, "minITSclsSize") && cfgminGetMeanItsClsSizeRequire) continue; - if (getMeanItsClsSize(track) > cfgTrackPIDsettings->get(i, "maxITSclsSize")) + if (getMeanItsClsSize(track) > cfgTrackPIDsettings->get(i, "maxITSclsSize") && cfgmaxGetMeanItsClsSizeRequire) continue; - if (getRigidity(track) < cfgTrackPIDsettings->get(i, "minRigidity") || getRigidity(track) > cfgTrackPIDsettings->get(i, "maxRigidity")) + if ((getRigidity(track) < cfgTrackPIDsettings->get(i, "minRigidity") || getRigidity(track) > cfgTrackPIDsettings->get(i, "maxRigidity")) && cfgRigidityCutRequire) continue; - if (cfgTrackPIDsettings->get(i, "TOFrequiredabove") >= 0 && getRigidity(track) > cfgTrackPIDsettings->get(i, "TOFrequiredabove") && (track.mass() < cfgTrackPIDsettings->get(i, "minTOFmass") || track.mass() > cfgTrackPIDsettings->get(i, "maxTOFmass"))) + if ((cfgTrackPIDsettings->get(i, "TOFrequiredabove") >= 0 && getRigidity(track) > cfgTrackPIDsettings->get(i, "TOFrequiredabove") && (track.mass() < cfgTrackPIDsettings->get(i, "minTOFmass") || track.mass() > cfgTrackPIDsettings->get(i, "maxTOFmass"))) && cfgmassRequire) continue; bool insideDCAxy = (std::abs(track.dcaXY()) <= (cfgTrackPIDsettings->get(i, "maxDcaXY") * (0.0105f + 0.0350f / std::pow(track.pt(), 1.1f)))); - if (!(insideDCAxy) || std::abs(track.dcaZ()) > cfgTrackPIDsettings->get(i, "maxDcaZ")) + if ((!(insideDCAxy) || std::abs(track.dcaZ()) > cfgTrackPIDsettings->get(i, "maxDcaZ")) && cfgDCAwithptRequire) + continue; + if ((std::abs(track.dcaXY()) > cfgTrackPIDsettings->get(i, "maxDcaXY") || std::abs(track.dcaZ()) > cfgTrackPIDsettings->get(i, "maxDcaZ")) && cfgDCAnopt) continue; if (track.sign() > 0) { histos.fill(HIST("histDcaZVsPtData_particle"), track.pt(), track.dcaZ()); @@ -249,6 +269,11 @@ struct NucleitpcPbPb { histos.fill(HIST("histDcaZVsPtData_antiparticle"), track.pt(), track.dcaZ()); histos.fill(HIST("histDcaXYVsPtData_antiparticle"), track.pt(), track.dcaXY()); } + fillnsigma(track, i); + if (std::abs(getTPCnSigma(track, primaryParticles.at(i))) > cfgTrackPIDsettings->get(i, "maxTPCnSigma") && cfgmaxTPCnSigmaRequire) + continue; + filldedx(track, i); + fillhmass(track, i); } histos.fill(HIST("histeta"), track.eta()); } // track loop @@ -265,6 +290,16 @@ struct NucleitpcPbPb { continue; if (collision.centFT0C() > centcut) continue; + if (removeITSROFrameBorder && !collision.selection_bit(aod::evsel::kNoITSROFrameBorder)) + continue; + if (removeNoSameBunchPileup && !collision.selection_bit(aod::evsel::kNoSameBunchPileup)) + continue; + if (requireIsGoodZvtxFT0vsPV && !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) + continue; + if (requireIsVertexITSTPC && !collision.selection_bit(aod::evsel::kIsVertexITSTPC)) + continue; + if (removeNoTimeFrameBorder && !collision.selection_bit(aod::evsel::kNoTimeFrameBorder)) + continue; histos.fill(HIST("histCentFTOC_cut"), collision.centFT0C()); const uint64_t collIdx = collision.globalIndex(); auto tracksByColl = tracksColl.sliceBy(perCollision, collIdx); @@ -325,7 +360,7 @@ struct NucleitpcPbPb { // histos.fill(HIST("histCentFT0A"), collision.centFT0A()); histos.fill(HIST("histCentFT0C"), collision.centFT0C()); histos.fill(HIST("histCentFT0M"), collision.centFT0M()); - // histos.fill(HIST("histEvents"), collision.centFT0C(), occupancy); + histos.fill(HIST("histEvents"), collision.centFT0C(), occupancy); } primVtx.assign({collision.posX(), collision.posY(), collision.posZ()}); cents.assign({collision.centFT0A(), collision.centFT0C(), collision.centFT0M()}); @@ -379,7 +414,7 @@ struct NucleitpcPbPb { double mass; int speciesHe3 = 4; int speciesHe4 = 5; - if (species == speciesHe3 || species == speciesHe4) { + if ((species == speciesHe3 || species == speciesHe4) && cfgTwicemass) { mass = 2 * track.mass(); } else { mass = track.mass(); From ad05be097aa7bf2b18c41e16c8226ef55b3c895c Mon Sep 17 00:00:00 2001 From: Ida Storehaug <38440296+torkjellsdatter@users.noreply.github.com> Date: Mon, 19 May 2025 17:38:37 +0200 Subject: [PATCH 1328/1650] [PWGDQ] columns added to flat B meson table (tableReader_withAssoc:AnalysisDileptonTrack) (#11248) Co-authored-by: Ida Torkjellsdatter Storehaug Co-authored-by: ALICE Action Bot --- PWGDQ/Tasks/tableReader_withAssoc.cxx | 69 ++++++++++++++++++++++++--- 1 file changed, 63 insertions(+), 6 deletions(-) diff --git a/PWGDQ/Tasks/tableReader_withAssoc.cxx b/PWGDQ/Tasks/tableReader_withAssoc.cxx index 6677891da0f..2f3c3933bde 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.cxx +++ b/PWGDQ/Tasks/tableReader_withAssoc.cxx @@ -86,6 +86,7 @@ DECLARE_SOA_COLUMN(massBcandidate, MBcandidate, float); DECLARE_SOA_COLUMN(MassDileptonCandidate, massDileptonCandidate, float); DECLARE_SOA_COLUMN(deltamassBcandidate, deltaMBcandidate, float); DECLARE_SOA_COLUMN(pTBcandidate, PtBcandidate, float); +DECLARE_SOA_COLUMN(EtaBcandidate, etaBcandidate, float); DECLARE_SOA_COLUMN(LxyBcandidate, lxyBcandidate, float); DECLARE_SOA_COLUMN(LxyzBcandidate, lxyzBcandidate, float); DECLARE_SOA_COLUMN(LzBcandidate, lzBcandidate, float); @@ -93,6 +94,42 @@ DECLARE_SOA_COLUMN(TauxyBcandidate, tauxyBcandidate, float); DECLARE_SOA_COLUMN(TauzBcandidate, tauzBcandidate, float); DECLARE_SOA_COLUMN(CosPBcandidate, cosPBcandidate, float); DECLARE_SOA_COLUMN(Chi2Bcandidate, chi2Bcandidate, float); +DECLARE_SOA_COLUMN(Ptassoc, ptassoc, float); +DECLARE_SOA_COLUMN(Etaassoc, etaassoc, float); +DECLARE_SOA_COLUMN(Ptpair, ptpair, float); +DECLARE_SOA_COLUMN(Etapair, etapair, float); +DECLARE_SOA_COLUMN(Ptleg1, ptleg1, float); +DECLARE_SOA_COLUMN(Etaleg1, etaleg1, float); +DECLARE_SOA_COLUMN(Ptleg2, ptleg2, float); +DECLARE_SOA_COLUMN(Etaleg2, etaleg2, float); +DECLARE_SOA_COLUMN(TPCnsigmaKaassoc, tpcnsigmaKaassoc, float); +DECLARE_SOA_COLUMN(TPCnsigmaPiassoc, tpcnsigmaPiassoc, float); +DECLARE_SOA_COLUMN(TPCnsigmaPrassoc, tpcnsigmaPrassoc, float); +DECLARE_SOA_COLUMN(TOFnsigmaKaassoc, tofnsigmaKaassoc, float); +DECLARE_SOA_COLUMN(TPCnsigmaElleg1, tpcnsigmaElleg1, float); +DECLARE_SOA_COLUMN(TPCnsigmaPileg1, tpcnsigmaPileg1, float); +DECLARE_SOA_COLUMN(TPCnsigmaPrleg1, tpcnsigmaPrleg1, float); +DECLARE_SOA_COLUMN(TPCnsigmaElleg2, tpcnsigmaElleg2, float); +DECLARE_SOA_COLUMN(TPCnsigmaPileg2, tpcnsigmaPileg2, float); +DECLARE_SOA_COLUMN(TPCnsigmaPrleg2, tpcnsigmaPrleg2, float); +DECLARE_SOA_COLUMN(DCAXYassoc, dcaXYassoc, float); +DECLARE_SOA_COLUMN(DCAZassoc, dcaZassoc, float); +DECLARE_SOA_COLUMN(DCAXYleg1, dcaXYleg1, float); +DECLARE_SOA_COLUMN(DCAZleg1, dcaZleg1, float); +DECLARE_SOA_COLUMN(DCAXYleg2, dcaXYleg2, float); +DECLARE_SOA_COLUMN(DCAZleg2, dcaZleg2, float); +DECLARE_SOA_COLUMN(ITSClusterMapassoc, itsClusterMapassoc, uint8_t); +DECLARE_SOA_COLUMN(ITSClusterMapleg1, itsClusterMapleg1, uint8_t); +DECLARE_SOA_COLUMN(ITSClusterMapleg2, itsClusterMapleg2, uint8_t); +DECLARE_SOA_COLUMN(ITSChi2assoc, itsChi2assoc, float); +DECLARE_SOA_COLUMN(ITSChi2leg1, itsChi2leg1, float); +DECLARE_SOA_COLUMN(ITSChi2leg2, itsChi2leg2, float); +DECLARE_SOA_COLUMN(TPCNclsassoc, tpcNclsassoc, float); +DECLARE_SOA_COLUMN(TPCNclsleg1, tpcNclsleg1, float); +DECLARE_SOA_COLUMN(TPCNclsleg2, tpcNclsleg2, float); +DECLARE_SOA_COLUMN(TPCChi2assoc, tpcChi2assoc, float); +DECLARE_SOA_COLUMN(TPCChi2leg1, tpcChi2leg1, float); +DECLARE_SOA_COLUMN(TPCChi2leg2, tpcChi2leg2, float); DECLARE_SOA_BITMAP_COLUMN(IsJpsiFromBSelected, isJpsiFromBSelected, 32); // Candidate columns for prompt-non-prompt JPsi separation DECLARE_SOA_COLUMN(Massee, massJPsi2ee, float); @@ -112,9 +149,19 @@ DECLARE_SOA_TABLE(MuonTrackCuts, "AOD", "DQANAMUONCUTSA", dqanalysisflags::IsMuo DECLARE_SOA_TABLE(MuonAmbiguities, "AOD", "DQMUONAMBA", dqanalysisflags::MuonAmbiguityInBunch, dqanalysisflags::MuonAmbiguityOutOfBunch); //! joinable to ReducedMuonTracks DECLARE_SOA_TABLE(Prefilter, "AOD", "DQPREFILTERA", dqanalysisflags::IsBarrelSelectedPrefilter); //! joinable to ReducedTracksAssoc DECLARE_SOA_TABLE(BmesonCandidates, "AOD", "DQBMESONSA", - dqanalysisflags::massBcandidate, dqanalysisflags::MassDileptonCandidate, dqanalysisflags::deltamassBcandidate, dqanalysisflags::pTBcandidate, + dqanalysisflags::massBcandidate, dqanalysisflags::MassDileptonCandidate, dqanalysisflags::deltamassBcandidate, dqanalysisflags::pTBcandidate, dqanalysisflags::EtaBcandidate, dqanalysisflags::LxyBcandidate, dqanalysisflags::LxyzBcandidate, dqanalysisflags::LzBcandidate, dqanalysisflags::TauxyBcandidate, dqanalysisflags::TauzBcandidate, dqanalysisflags::CosPBcandidate, dqanalysisflags::Chi2Bcandidate, + dqanalysisflags::Ptassoc, dqanalysisflags::Etaassoc, dqanalysisflags::Ptpair, dqanalysisflags::Etapair, + dqanalysisflags::Ptleg1, dqanalysisflags::Etaleg1, dqanalysisflags::Ptleg2, dqanalysisflags::Etaleg2, + dqanalysisflags::TPCnsigmaKaassoc, dqanalysisflags::TPCnsigmaPiassoc, dqanalysisflags::TPCnsigmaPrassoc, dqanalysisflags::TOFnsigmaKaassoc, + dqanalysisflags::TPCnsigmaElleg1, dqanalysisflags::TPCnsigmaPileg1, dqanalysisflags::TPCnsigmaPrleg1, + dqanalysisflags::TPCnsigmaElleg2, dqanalysisflags::TPCnsigmaPileg2, dqanalysisflags::TPCnsigmaPrleg2, + dqanalysisflags::DCAXYassoc, dqanalysisflags::DCAZassoc, dqanalysisflags::DCAXYleg1, dqanalysisflags::DCAZleg1, dqanalysisflags::DCAXYleg2, dqanalysisflags::DCAZleg2, + dqanalysisflags::ITSClusterMapassoc, dqanalysisflags::ITSClusterMapleg1, dqanalysisflags::ITSClusterMapleg2, + dqanalysisflags::ITSChi2assoc, dqanalysisflags::ITSChi2leg1, dqanalysisflags::ITSChi2leg2, + dqanalysisflags::TPCNclsassoc, dqanalysisflags::TPCNclsleg1, dqanalysisflags::TPCNclsleg2, + dqanalysisflags::TPCChi2assoc, dqanalysisflags::TPCChi2leg1, dqanalysisflags::TPCChi2leg2, dqanalysisflags::IsJpsiFromBSelected, dqanalysisflags::IsBarrelSelected); DECLARE_SOA_TABLE(JPsieeCandidates, "AOD", "DQPSEUDOPROPER", dqanalysisflags::Massee, dqanalysisflags::Ptee, dqanalysisflags::Lxyee, dqanalysisflags::LxyeePoleMass, dqanalysisflags::Lzee, dqanalysisflags::AmbiguousInBunchPairs, dqanalysisflags::AmbiguousOutOfBunchPairs); } // namespace o2::aod @@ -3182,6 +3229,21 @@ struct AnalysisDileptonTrack { // compute needed quantities VarManager::FillDileptonHadron(dilepton, track, fValuesHadron); VarManager::FillDileptonTrackVertexing(event, lepton1, lepton2, track, fValuesHadron); + // table to be written out for ML analysis + BmesonsTable(fValuesHadron[VarManager::kPairMass], dilepton.mass(), fValuesHadron[VarManager::kDeltaMass], fValuesHadron[VarManager::kPairPt], fValuesHadron[VarManager::kPairEta], + fValuesHadron[VarManager::kVertexingLxy], fValuesHadron[VarManager::kVertexingLxyz], fValuesHadron[VarManager::kVertexingLz], + fValuesHadron[VarManager::kVertexingTauxy], fValuesHadron[VarManager::kVertexingTauz], fValuesHadron[VarManager::kCosPointingAngle], + fValuesHadron[VarManager::kVertexingChi2PCA], + track.pt(), track.eta(), dilepton.pt(), dilepton.eta(), lepton1.pt(), lepton1.eta(), lepton2.pt(), lepton2.eta(), + track.tpcNSigmaKa(), track.tpcNSigmaPi(), track.tpcNSigmaPr(), track.tofNSigmaKa(), + lepton1.tpcNSigmaEl(), lepton1.tpcNSigmaPi(), lepton1.tpcNSigmaPr(), + lepton2.tpcNSigmaEl(), lepton2.tpcNSigmaPi(), lepton2.tpcNSigmaPr(), + track.dcaXY(), track.dcaZ(), lepton1.dcaXY(), lepton1.dcaZ(), lepton2.dcaXY(), lepton2.dcaZ(), + track.itsClusterMap(), lepton1.itsClusterMap(), lepton2.itsClusterMap(), + track.itsChi2NCl(), lepton1.itsChi2NCl(), lepton2.itsChi2NCl(), + track.tpcNClsFound(), lepton1.tpcNClsFound(), lepton2.tpcNClsFound(), + track.tpcChi2NCl(), lepton1.tpcChi2NCl(), lepton2.tpcChi2NCl(), + dilepton.filterMap_raw(), trackSelection); } if constexpr (TCandidateType == VarManager::kDstarToD0KPiPi) { trackSelection = (assoc.isBarrelSelected_raw() & fTrackCutBitMap); @@ -3248,11 +3310,6 @@ struct AnalysisDileptonTrack { } } // end loop over track cuts } // end loop over dilepton cuts - // table to be written out for ML analysis - BmesonsTable(fValuesHadron[VarManager::kPairMass], dilepton.mass(), fValuesHadron[VarManager::kDeltaMass], fValuesHadron[VarManager::kPairPt], - fValuesHadron[VarManager::kVertexingLxy], fValuesHadron[VarManager::kVertexingLxyz], fValuesHadron[VarManager::kVertexingLz], - fValuesHadron[VarManager::kVertexingTauxy], fValuesHadron[VarManager::kVertexingTauz], fValuesHadron[VarManager::kCosPointingAngle], - fValuesHadron[VarManager::kVertexingChi2PCA], dilepton.filterMap_raw(), trackSelection); } } } From 2710607214c2549262b4a05bb3e4882a931add8b Mon Sep 17 00:00:00 2001 From: glromane <95305986+glromane@users.noreply.github.com> Date: Mon, 19 May 2025 19:29:19 +0200 Subject: [PATCH 1329/1650] [PWGCF] adding RCT evsel flag + ITS param. for PID in MC (#11249) --- .../TableProducer/singleTrackSelector.cxx | 20 +++++++++++++------ PWGCF/Femto3D/Tasks/femto3dPairTaskMC.cxx | 5 ++++- PWGCF/Femto3D/Tasks/femto3dQA.cxx | 6 ++++++ 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/PWGCF/Femto3D/TableProducer/singleTrackSelector.cxx b/PWGCF/Femto3D/TableProducer/singleTrackSelector.cxx index 05a47bdc8e2..729538a1470 100644 --- a/PWGCF/Femto3D/TableProducer/singleTrackSelector.cxx +++ b/PWGCF/Femto3D/TableProducer/singleTrackSelector.cxx @@ -58,6 +58,7 @@ struct singleTrackSelector { Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; Configurable applySkimming{"applySkimming", false, "Skimmed dataset processing"}; Configurable cfgSkimming{"cfgSkimming", "fPD", "Configurable for skimming"}; + Configurable CBThadronPID{"CBThadronPID", false, "Apply ev. sel. based on RCT flag `hadronPID`"}; // more in Common/CCDB/RCTSelectionFlags.h Configurable applyEvSel{"applyEvSel", 2, "Flag to apply rapidity cut: 0 -> no event selection, 1 -> Run 2 event selection, 2 -> Run 3 event selection"}; // Configurable trackSelection{"trackSelection", 1, "Track selection: 0 -> No Cut, 1 -> kGlobalTrack, 2 -> kGlobalTrackWoPtEta, 3 -> kGlobalTrackWoDCA, 4 -> kQualityTracks, 5 -> kInAcceptanceTracks"}; @@ -134,6 +135,8 @@ struct singleTrackSelector { HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject}; SliceCache cache; + rctsel::RCTFlagsChecker myChecker{"CBT_hadronPID"}; + void init(InitContext&) { @@ -148,6 +151,8 @@ struct singleTrackSelector { ccdb->setLocalObjectValidityChecking(); ccdb->setFatalWhenNull(false); + myChecker.init("CBT_hadronPID", true); + registry.add("hNEvents", "hNEvents", {HistType::kTH1D, {{2, 0.f, 2.f}}}); registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(1, "All"); registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(2, "Skimmed"); @@ -158,12 +163,12 @@ struct singleTrackSelector { if (enable_gen_info) { registry.add("hNEvents_MCGen", "hNEvents_MCGen", {HistType::kTH1F, {{1, 0.f, 1.f}}}); - registry.add("hGen_EtaPhiPt_Proton", "Gen (anti)protons in true collisions", {HistType::kTH3F, {{100, -1., 1., "#eta"}, {157, 0., 2 * TMath::Pi(), "#phi"}, {100, -5.f, 5.f, "p_{T} GeV/c"}}}); - registry.add("hGen_EtaPhiPt_Deuteron", "Gen (anti)deuteron in true collisions", {HistType::kTH3F, {{100, -1., 1., "#eta"}, {157, 0., 2 * TMath::Pi(), "#phi"}, {100, -5.f, 5.f, "p_{T} GeV/c"}}}); - registry.add("hGen_EtaPhiPt_Helium3", "Gen (anti)Helium3 in true collisions", {HistType::kTH3F, {{100, -1., 1., "#eta"}, {157, 0., 2 * TMath::Pi(), "#phi"}, {100, -5.f, 5.f, "p_{T} GeV/c"}}}); - registry.add("hReco_EtaPhiPt_Proton", "Gen (anti)protons in reco collisions", {HistType::kTH3F, {{100, -1., 1., "#eta"}, {157, 0., 2 * TMath::Pi(), "#phi"}, {100, -5.f, 5.f, "p_{T} GeV/c"}}}); - registry.add("hReco_EtaPhiPt_Deuteron", "Gen (anti)deuteron in reco collisions", {HistType::kTH3F, {{100, -1., 1., "#eta"}, {157, 0., 2 * TMath::Pi(), "#phi"}, {100, -5.f, 5.f, "p_{T} GeV/c"}}}); - registry.add("hReco_EtaPhiPt_Helium3", "Gen (anti)Helium3 in reco collisions", {HistType::kTH3F, {{100, -1., 1., "#eta"}, {157, 0., 2 * TMath::Pi(), "#phi"}, {100, -5.f, 5.f, "p_{T} GeV/c"}}}); + registry.add("hGen_EtaPhiPt_Proton", "Gen (anti)protons in true collisions", {HistType::kTH3F, {{100, -1., 1., "#eta"}, {157, 0., o2::constants::math::TwoPI, "#phi"}, {100, -5.f, 5.f, "p_{T} GeV/c"}}}); + registry.add("hGen_EtaPhiPt_Deuteron", "Gen (anti)deuteron in true collisions", {HistType::kTH3F, {{100, -1., 1., "#eta"}, {157, 0., o2::constants::math::TwoPI, "#phi"}, {100, -5.f, 5.f, "p_{T} GeV/c"}}}); + registry.add("hGen_EtaPhiPt_Helium3", "Gen (anti)Helium3 in true collisions", {HistType::kTH3F, {{100, -1., 1., "#eta"}, {157, 0., o2::constants::math::TwoPI, "#phi"}, {100, -5.f, 5.f, "p_{T} GeV/c"}}}); + registry.add("hReco_EtaPhiPt_Proton", "Gen (anti)protons in reco collisions", {HistType::kTH3F, {{100, -1., 1., "#eta"}, {157, 0., o2::constants::math::TwoPI, "#phi"}, {100, -5.f, 5.f, "p_{T} GeV/c"}}}); + registry.add("hReco_EtaPhiPt_Deuteron", "Gen (anti)deuteron in reco collisions", {HistType::kTH3F, {{100, -1., 1., "#eta"}, {157, 0., o2::constants::math::TwoPI, "#phi"}, {100, -5.f, 5.f, "p_{T} GeV/c"}}}); + registry.add("hReco_EtaPhiPt_Helium3", "Gen (anti)Helium3 in reco collisions", {HistType::kTH3F, {{100, -1., 1., "#eta"}, {157, 0., o2::constants::math::TwoPI, "#phi"}, {100, -5.f, 5.f, "p_{T} GeV/c"}}}); } } @@ -349,6 +354,9 @@ struct singleTrackSelector { const auto& bc = collision.bc_as(); initCCDB(bc); + if (!myChecker(*collision) && CBThadronPID) + return; + registry.fill(HIST("hNEvents"), 0.5); if (applySkimming) { if (!zorro.isSelected(bc.globalBC())) { diff --git a/PWGCF/Femto3D/Tasks/femto3dPairTaskMC.cxx b/PWGCF/Femto3D/Tasks/femto3dPairTaskMC.cxx index 06635858ce0..be66280928e 100644 --- a/PWGCF/Femto3D/Tasks/femto3dPairTaskMC.cxx +++ b/PWGCF/Femto3D/Tasks/femto3dPairTaskMC.cxx @@ -105,7 +105,8 @@ struct FemtoCorrelationsMC { std::pair> TOFcuts_2; using FilteredCollisions = soa::Join; - using FilteredTracks = soa::Join; + using FilteredTracks = soa::Join; + // using FilteredTracks = soa::Join; typedef std::shared_ptr::iterator> trkType; typedef std::shared_ptr::iterator> colType; @@ -143,6 +144,8 @@ struct FemtoCorrelationsMC { void init(o2::framework::InitContext&) { + o2::aod::ITSResponse::setMCDefaultParameters(); // set MC parametrisation for the ITS PID + IsIdentical = (_sign_1 * _particlePDG_1 == _sign_2 * _particlePDG_2); Pair->SetIdentical(IsIdentical); diff --git a/PWGCF/Femto3D/Tasks/femto3dQA.cxx b/PWGCF/Femto3D/Tasks/femto3dQA.cxx index 6923ae91cb6..64858324b48 100644 --- a/PWGCF/Femto3D/Tasks/femto3dQA.cxx +++ b/PWGCF/Femto3D/Tasks/femto3dQA.cxx @@ -45,6 +45,8 @@ struct QAHistograms { /// Construct a registry object with direct declaration HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject}; + Configurable _isMC{"isMC", false, ""}; + Configurable _removeSameBunchPileup{"removeSameBunchPileup", false, ""}; Configurable _requestGoodZvtxFT0vsPV{"requestGoodZvtxFT0vsPV", false, ""}; Configurable _requestVertexITSTPC{"requestVertexITSTPC", false, ""}; @@ -101,6 +103,10 @@ struct QAHistograms { void init(o2::framework::InitContext&) { + + if (_isMC.value) + o2::aod::ITSResponse::setMCDefaultParameters(); // set MC parametrisation for the ITS PID + TPCcuts = std::make_pair(_particlePDG, _tpcNSigma); TOFcuts = std::make_pair(_particlePDG, _tofNSigma); From fc31fa56417f7d0bfded91b7a4f57406da40b5bd Mon Sep 17 00:00:00 2001 From: Victor Gonzalez Date: Mon, 19 May 2025 23:29:06 +0200 Subject: [PATCH 1330/1650] [PWGCF] DptDpt - First step in implementing linter recommendations (#11252) Co-authored-by: Victor --- PWGCF/TableProducer/CMakeLists.txt | 4 ++-- PWGCF/TableProducer/{dptdptfilter.cxx => dptDptFilter.cxx} | 4 ++-- PWGCF/TableProducer/{dptdptfilter.h => dptDptFilter.h} | 2 +- PWGCF/Tasks/CMakeLists.txt | 4 ++-- .../Tasks/{dptdptcorrelations.cxx => dptDptCorrelations.cxx} | 4 ++-- PWGCF/Tasks/dptDptFilterQa.cxx | 2 +- PWGCF/Tasks/matchRecoGen.cxx | 2 +- PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx | 2 +- PWGCF/TwoParticleCorrelations/Tasks/dptDptPerRunExtraQc.cxx | 2 +- PWGCF/TwoParticleCorrelations/Tasks/dptDptPerRunQc.cxx | 2 +- 10 files changed, 14 insertions(+), 14 deletions(-) rename PWGCF/TableProducer/{dptdptfilter.cxx => dptDptFilter.cxx} (99%) rename PWGCF/TableProducer/{dptdptfilter.h => dptDptFilter.h} (99%) rename PWGCF/Tasks/{dptdptcorrelations.cxx => dptDptCorrelations.cxx} (99%) diff --git a/PWGCF/TableProducer/CMakeLists.txt b/PWGCF/TableProducer/CMakeLists.txt index 1bfef915ff3..6438d45a5fe 100644 --- a/PWGCF/TableProducer/CMakeLists.txt +++ b/PWGCF/TableProducer/CMakeLists.txt @@ -19,7 +19,7 @@ o2physics_add_dpl_workflow(filter-correlations-2prong PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(dptdpt-filter - SOURCES dptdptfilter.cxx +o2physics_add_dpl_workflow(dpt-dpt-filter + SOURCES dptDptFilter.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore COMPONENT_NAME Analysis) diff --git a/PWGCF/TableProducer/dptdptfilter.cxx b/PWGCF/TableProducer/dptDptFilter.cxx similarity index 99% rename from PWGCF/TableProducer/dptdptfilter.cxx rename to PWGCF/TableProducer/dptDptFilter.cxx index cc29cd7ece8..5f99e3ff1d7 100644 --- a/PWGCF/TableProducer/dptdptfilter.cxx +++ b/PWGCF/TableProducer/dptDptFilter.cxx @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file dptdptfilter.cxx +/// \file dptDptFilter.cxx /// \brief Filters collisions and tracks according to selection criteria /// \author victor.gonzalez.sebastian@gmail.com @@ -46,7 +46,7 @@ #include #include -#include "PWGCF/TableProducer/dptdptfilter.h" +#include "PWGCF/TableProducer/dptDptFilter.h" using namespace o2; using namespace o2::framework; diff --git a/PWGCF/TableProducer/dptdptfilter.h b/PWGCF/TableProducer/dptDptFilter.h similarity index 99% rename from PWGCF/TableProducer/dptdptfilter.h rename to PWGCF/TableProducer/dptDptFilter.h index 474e341907d..8638e56959e 100644 --- a/PWGCF/TableProducer/dptdptfilter.h +++ b/PWGCF/TableProducer/dptDptFilter.h @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file dptdptfilter.h +/// \file dptDptFilter.h /// \brief Filters collisions and tracks according to selection criteria /// \author victor.gonzalez.sebastian@gmail.com diff --git a/PWGCF/Tasks/CMakeLists.txt b/PWGCF/Tasks/CMakeLists.txt index 233cb351d13..22e2b0f9f21 100644 --- a/PWGCF/Tasks/CMakeLists.txt +++ b/PWGCF/Tasks/CMakeLists.txt @@ -9,8 +9,8 @@ # granted to it by virtue of its status as an Intergovernmental Organization # or submit itself to any jurisdiction. -o2physics_add_dpl_workflow(dptdptcorrelations - SOURCES dptdptcorrelations.cxx +o2physics_add_dpl_workflow(dpt-dpt-correlations + SOURCES dptDptCorrelations.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore COMPONENT_NAME Analysis) diff --git a/PWGCF/Tasks/dptdptcorrelations.cxx b/PWGCF/Tasks/dptDptCorrelations.cxx similarity index 99% rename from PWGCF/Tasks/dptdptcorrelations.cxx rename to PWGCF/Tasks/dptDptCorrelations.cxx index 10849b9901b..bdd119944c0 100644 --- a/PWGCF/Tasks/dptdptcorrelations.cxx +++ b/PWGCF/Tasks/dptDptCorrelations.cxx @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file dptdptcorrelations.cxx +/// \file dptDptCorrelations.cxx /// \brief implements two-particle correlations base data collection /// \author victor.gonzalez.sebastian@gmail.com @@ -44,7 +44,7 @@ #include "PWGCF/Core/AnalysisConfigurableCuts.h" #include "PWGCF/Core/PairCuts.h" #include "PWGCF/DataModel/DptDptFiltered.h" -#include "PWGCF/TableProducer/dptdptfilter.h" +#include "PWGCF/TableProducer/dptDptFilter.h" using namespace o2; using namespace o2::framework; diff --git a/PWGCF/Tasks/dptDptFilterQa.cxx b/PWGCF/Tasks/dptDptFilterQa.cxx index ebb50785a61..97557016ffa 100644 --- a/PWGCF/Tasks/dptDptFilterQa.cxx +++ b/PWGCF/Tasks/dptDptFilterQa.cxx @@ -21,7 +21,7 @@ #include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" #include "PWGCF/DataModel/DptDptFiltered.h" -#include "PWGCF/TableProducer/dptdptfilter.h" +#include "PWGCF/TableProducer/dptDptFilter.h" using namespace o2; using namespace o2::framework; diff --git a/PWGCF/Tasks/matchRecoGen.cxx b/PWGCF/Tasks/matchRecoGen.cxx index 486eae85e37..795a23e4152 100644 --- a/PWGCF/Tasks/matchRecoGen.cxx +++ b/PWGCF/Tasks/matchRecoGen.cxx @@ -31,7 +31,7 @@ #include "Framework/runDataProcessing.h" #include "PWGCF/Core/AnalysisConfigurableCuts.h" #include "PWGCF/DataModel/DptDptFiltered.h" -#include "PWGCF/TableProducer/dptdptfilter.h" +#include "PWGCF/TableProducer/dptDptFilter.h" #include #include #include diff --git a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx index 1f835ca8db2..6ef8f58b49b 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx @@ -41,7 +41,7 @@ #include "PWGCF/Core/AnalysisConfigurableCuts.h" #include "PWGCF/DataModel/DptDptFiltered.h" -#include "PWGCF/TableProducer/dptdptfilter.h" +#include "PWGCF/TableProducer/dptDptFilter.h" using namespace o2; using namespace o2::framework; diff --git a/PWGCF/TwoParticleCorrelations/Tasks/dptDptPerRunExtraQc.cxx b/PWGCF/TwoParticleCorrelations/Tasks/dptDptPerRunExtraQc.cxx index d6500b88617..8617a65de2f 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/dptDptPerRunExtraQc.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/dptDptPerRunExtraQc.cxx @@ -24,7 +24,7 @@ #include "Framework/runDataProcessing.h" #include "PWGCF/DataModel/DptDptFiltered.h" -#include "PWGCF/TableProducer/dptdptfilter.h" +#include "PWGCF/TableProducer/dptDptFilter.h" using namespace o2; using namespace o2::framework; diff --git a/PWGCF/TwoParticleCorrelations/Tasks/dptDptPerRunQc.cxx b/PWGCF/TwoParticleCorrelations/Tasks/dptDptPerRunQc.cxx index fb179838563..598d3305539 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/dptDptPerRunQc.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/dptDptPerRunQc.cxx @@ -35,7 +35,7 @@ #include "Framework/runDataProcessing.h" #include "PWGCF/DataModel/DptDptFiltered.h" -#include "PWGCF/TableProducer/dptdptfilter.h" +#include "PWGCF/TableProducer/dptDptFilter.h" using namespace o2; using namespace o2::framework; From a0da7fbd1857f546a7d963a70995e41baad069fb Mon Sep 17 00:00:00 2001 From: yuanzhe <90246048+wang-yuanzhe@users.noreply.github.com> Date: Tue, 20 May 2025 00:02:49 +0200 Subject: [PATCH 1331/1650] [PWGLF] Update QA for hyperhelium4sigma analysis (#11251) Co-authored-by: ALICE Action Bot --- .../Nuspex/hyperhelium4sigmaAnalysis.cxx | 446 ++++++++++++++---- 1 file changed, 364 insertions(+), 82 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/hyperhelium4sigmaAnalysis.cxx b/PWGLF/Tasks/Nuspex/hyperhelium4sigmaAnalysis.cxx index bdbb7c5911b..22ee0a41d0f 100644 --- a/PWGLF/Tasks/Nuspex/hyperhelium4sigmaAnalysis.cxx +++ b/PWGLF/Tasks/Nuspex/hyperhelium4sigmaAnalysis.cxx @@ -10,10 +10,11 @@ // or submit itself to any jurisdiction. // /// \file hyperhelium4sigmaAnalysis.cxx -/// \brief Simple check for injected hyper-helium4sigma (H4S) in MC productions +/// \brief QA and analysis task for hyper-helium4sigma (He4S) /// \author Yuanzhe Wang #include +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -30,10 +31,22 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; -using CollisionsFull = soa::Join; +using CollisionsFull = soa::Join; using FullTracksExtIU = soa::Join; using MCLabeledTracksIU = soa::Join; +namespace +{ +constexpr int kITSLayers = 7; +constexpr int kITSInnerBarrelLayers = 3; +// constexpr int kITSOuterBarrelLayers = 4; +std::shared_ptr hMotherCounter; +std::shared_ptr hDauAlphaCounter; +std::shared_ptr hDauTritonCounter; +std::shared_ptr hDauProtonCounter; +std::shared_ptr hDauPionCounter; +} // namespace + //-------------------------------Check the decay channel of H4S------------------------------- enum Channel { k2body = 0, // helium4, pion0 @@ -43,11 +56,16 @@ enum Channel { }; template -Channel getDecayChannelH4S(TMCParticle const& particle) +Channel getDecayChannelH4S(TMCParticle const& particle, std::vector& list) { if (std::abs(particle.pdgCode()) != o2::constants::physics::Pdg::kHyperHelium4Sigma) { return kNDecayChannel; } + + // list: charged, charged or empty, neutral + list.clear(); + list.resize(3, -1); + bool haveAlpha = false, haveTriton = false, haveProton = false, haveNeuteron = false; bool haveAntiAlpha = false, haveAntiTriton = false, haveAntiProton = false, haveAntiNeuteron = false; bool havePionPlus = false, havePionMinus = false, havePion0 = false; @@ -55,36 +73,47 @@ Channel getDecayChannelH4S(TMCParticle const& particle) for (const auto& mcDaughter : particle.template daughters_as()) { if (mcDaughter.pdgCode() == o2::constants::physics::Pdg::kAlpha) { haveAlpha = true; + list[0] = mcDaughter.globalIndex(); } if (mcDaughter.pdgCode() == -o2::constants::physics::Pdg::kAlpha) { haveAntiAlpha = true; + list[0] = mcDaughter.globalIndex(); } if (mcDaughter.pdgCode() == o2::constants::physics::Pdg::kTriton) { haveTriton = true; + list[0] = mcDaughter.globalIndex(); } if (mcDaughter.pdgCode() == -o2::constants::physics::Pdg::kTriton) { haveAntiTriton = true; + list[0] = mcDaughter.globalIndex(); } if (mcDaughter.pdgCode() == PDG_t::kProton) { haveProton = true; + list[1] = mcDaughter.globalIndex(); } if (mcDaughter.pdgCode() == -PDG_t::kProton) { haveAntiProton = true; + list[1] = mcDaughter.globalIndex(); } if (mcDaughter.pdgCode() == PDG_t::kNeutron) { haveNeuteron = true; + list[2] = mcDaughter.globalIndex(); } if (mcDaughter.pdgCode() == -PDG_t::kNeutron) { haveAntiNeuteron = true; + list[2] = mcDaughter.globalIndex(); } if (mcDaughter.pdgCode() == PDG_t::kPiPlus) { havePionPlus = true; + list[1] = mcDaughter.globalIndex(); } if (mcDaughter.pdgCode() == -PDG_t::kPiPlus) { havePionMinus = true; + list[1] = mcDaughter.globalIndex(); } if (mcDaughter.pdgCode() == PDG_t::kPi0) { havePion0 = true; + list[2] = mcDaughter.globalIndex(); } } @@ -98,12 +127,31 @@ Channel getDecayChannelH4S(TMCParticle const& particle) return kNDecayChannel; } + //-------------------------------------------------------------- +// check if the mcparticle is daughter of hyperhelium4sigma +template +bool isDaughterTrack(TMCParticle const& mcparticle, int pdgcode = o2::constants::physics::Pdg::kHyperHelium4Sigma) +{ + if (!mcparticle.has_mothers()) { + return false; + } + for (const auto& particleMother : mcparticle.template mothers_as()) { + if (std::abs(particleMother.pdgCode()) == pdgcode) { + return true; + } + } + return false; +} + +//-------------------------------------------------------------- +// analysis task for hyperhelium4sigma 2-body decay struct Hyperhelium4sigmaAnalysis { // Histograms are defined with HistogramRegistry HistogramRegistry registry{"registry", {}}; // Configurable for event selection + Configurable doEventCut{"doEventCut", true, "Apply event selection"}; Configurable cutzvertex{"cutzvertex", 10.0f, "Accepted z-vertex range (cm)"}; Configurable cutNSigmaAl{"cutNSigmaAl", 5, "NSigmaTPCAlpha"}; @@ -115,42 +163,131 @@ struct Hyperhelium4sigmaAnalysis { const AxisSpec nSigmaAxis{120, -6.f, 6.f, "n#sigma_{#alpha}"}; const AxisSpec massAxis{100, 3.85, 4.25, "m (GeV/#it{c}^{2})"}; - registry.add("hVertexZRec", "hVertexZRec", {HistType::kTH1F, {vertexZAxis}}); + registry.add("hEventCounter", "hEventCounter", HistType::kTH1F, {{2, 0, 2}}); + registry.add("hVertexZCollision", "hVertexZCollision", HistType::kTH1F, {vertexZAxis}); - registry.add("h2MassHyperhelium4sigmaPt", "h2MassHyperhelium4sigmaPt", {HistType::kTH2F, {ptAxis, massAxis}}); - registry.add("h2NSigmaAlPt", "h2NSigmaAlPt", {HistType::kTH2F, {ptAxis, nSigmaAxis}}); + if (doprocessData == true) { + registry.add("hCandidateCounter", "hCandidateCounter", HistType::kTH1F, {{3, 0, 3}}); + } + + if (doprocessMC == true) { + registry.add("hCandidateCounter", "hCandidateCounter", HistType::kTH1F, {{6, 0, 6}}); + registry.add("hDiffSVx", ";;#Delta x (cm)", HistType::kTH1F, {{200, -10, 10}}); + registry.add("hDiffSVy", ";;#Delta y (cm)", HistType::kTH1F, {{200, -10, 10}}); + registry.add("hDiffSVz", ";;#Delta z (cm)", HistType::kTH1F, {{200, -10, 10}}); + registry.add("hDiffDauPx", ";#Delta p_{x} (GeV/#it{c}); ", HistType::kTH1D, {{200, -10, 10}}); + registry.add("hDiffDauPy", ";#Delta p_{y} (GeV/#it{c}); ", HistType::kTH1D, {{200, -10, 10}}); + registry.add("hDiffDauPz", ";#Delta p_{z} (GeV/#it{c}); ", HistType::kTH1D, {{200, -10, 10}}); + } + + registry.add("h2MassHyperhelium4sigmaPt", "h2MassHyperhelium4sigmaPt", HistType::kTH2F, {{ptAxis, massAxis}}); + registry.add("h2NSigmaAlPt", "h2NSigmaAlPt", HistType::kTH2F, {{ptAxis, nSigmaAxis}}); } - void process(soa::Join::iterator const& collision, - aod::KinkCands const& KinkCands, FullTracksExtIU const&) + void processData(CollisionsFull const& collisions, aod::KinkCands const& KinkCands, FullTracksExtIU const&) { - if (std::abs(collision.posZ()) > cutzvertex || !collision.sel8()) { - return; + for (const auto& collision : collisions) { + registry.fill(HIST("hEventCounter"), 0); + if (doEventCut && (std::abs(collision.posZ()) > cutzvertex || !collision.sel8())) { + continue; + } + registry.fill(HIST("hEventCounter"), 1); + registry.fill(HIST("hVertexZCollision"), collision.posZ()); } - registry.fill(HIST("hVertexZRec"), collision.posZ()); + for (const auto& kinkCand : KinkCands) { + registry.fill(HIST("hCandidateCounter"), 0); + auto collision = kinkCand.collision_as(); + if (doEventCut && (std::abs(collision.posZ()) > cutzvertex || !collision.sel8())) { + continue; + } + registry.fill(HIST("hCandidateCounter"), 1); + auto dauTrack = kinkCand.trackDaug_as(); if (std::abs(dauTrack.tpcNSigmaAl()) > cutNSigmaAl) { continue; } float invMass = RecoDecay::m(std::array{std::array{kinkCand.pxDaug(), kinkCand.pyDaug(), kinkCand.pzDaug()}, std::array{kinkCand.pxDaugNeut(), kinkCand.pyDaugNeut(), kinkCand.pzDaugNeut()}}, std::array{o2::constants::physics::MassAlpha, o2::constants::physics::MassPi0}); + registry.fill(HIST("hCandidateCounter"), 2); registry.fill(HIST("h2MassHyperhelium4sigmaPt"), kinkCand.mothSign() * kinkCand.ptMoth(), invMass); registry.fill(HIST("h2NSigmaAlPt"), kinkCand.mothSign() * kinkCand.ptDaug(), dauTrack.tpcNSigmaAl()); } } + PROCESS_SWITCH(Hyperhelium4sigmaAnalysis, processData, "process data", true); + + void processMC(CollisionsFull const& collisions, aod::KinkCands const& KinkCands, MCLabeledTracksIU const&, aod::McParticles const&) + { + std::vector dauIDList; + + for (const auto& collision : collisions) { + registry.fill(HIST("hEventCounter"), 0); + if (doEventCut && (!collision.selection_bit(aod::evsel::kIsTriggerTVX) || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || std::abs(collision.posZ()) > cutzvertex)) { + continue; + } + registry.fill(HIST("hEventCounter"), 1); + registry.fill(HIST("hVertexZCollision"), collision.posZ()); + } + + for (const auto& kinkCand : KinkCands) { + registry.fill(HIST("hCandidateCounter"), 0); + auto collision = kinkCand.collision_as(); + if (doEventCut && (!collision.selection_bit(aod::evsel::kIsTriggerTVX) || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || std::abs(collision.posZ()) > cutzvertex)) { + continue; + } + registry.fill(HIST("hCandidateCounter"), 1); + + auto motherTrack = kinkCand.trackMoth_as(); + auto dauTrack = kinkCand.trackDaug_as(); + if (!motherTrack.has_mcParticle() || !dauTrack.has_mcParticle()) { + continue; + } + registry.fill(HIST("hCandidateCounter"), 2); + + auto mcMotherTrack = motherTrack.mcParticle_as(); + auto mcDauTrack = dauTrack.mcParticle_as(); + auto dChannel = getDecayChannelH4S(mcMotherTrack, dauIDList); + if (dChannel != k2body) { + continue; + } + registry.fill(HIST("hCandidateCounter"), 3); + + if (dauIDList[0] != mcDauTrack.globalIndex()) { + continue; + } + registry.fill(HIST("hCandidateCounter"), 4); + + if (std::abs(dauTrack.tpcNSigmaAl()) > cutNSigmaAl) { + continue; + } + registry.fill(HIST("hCandidateCounter"), 5); + + float invMass = RecoDecay::m(std::array{std::array{kinkCand.pxDaug(), kinkCand.pyDaug(), kinkCand.pzDaug()}, std::array{kinkCand.pxDaugNeut(), kinkCand.pyDaugNeut(), kinkCand.pzDaugNeut()}}, std::array{o2::constants::physics::MassAlpha, o2::constants::physics::MassPi0}); + registry.fill(HIST("hDiffSVx"), kinkCand.xDecVtx() - mcDauTrack.vx()); + registry.fill(HIST("hDiffSVy"), kinkCand.yDecVtx() - mcDauTrack.vy()); + registry.fill(HIST("hDiffSVz"), kinkCand.zDecVtx() - mcDauTrack.vz()); + registry.fill(HIST("hDiffDauPx"), kinkCand.pxDaug() - mcDauTrack.px()); + registry.fill(HIST("hDiffDauPy"), kinkCand.pyDaug() - mcDauTrack.py()); + registry.fill(HIST("hDiffDauPz"), kinkCand.pzDaug() - mcDauTrack.pz()); + registry.fill(HIST("h2MassHyperhelium4sigmaPt"), kinkCand.mothSign() * kinkCand.ptMoth(), invMass); + registry.fill(HIST("h2NSigmaAlPt"), kinkCand.mothSign() * kinkCand.ptDaug(), dauTrack.tpcNSigmaAl()); + } + } + PROCESS_SWITCH(Hyperhelium4sigmaAnalysis, processMC, "process MC", false); }; //-------------------------------------------------------------- // check the performance of mcparticle struct Hyperhelium4sigmaQa { - // Basic checks - HistogramRegistry registry{"registry", {}}; + + HistogramRegistry genQAHist{"genQAHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry recoQAHist{"recoQAHist", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; ConfigurableAxis ptBins{"ptBins", {200, 0.f, 10.f}, "Binning for #it{p}_{T} (GeV/#it{c})"}; ConfigurableAxis ctBins{"ctBins", {100, 0.f, 25.f}, "Binning for c#it{t} (cm)"}; ConfigurableAxis rigidityBins{"rigidityBins", {200, -10.f, 10.f}, "Binning for #it{p}_{T} (GeV/#it{c})"}; ConfigurableAxis nsigmaBins{"nsigmaBins", {120, -6.f, 6.f}, "Binning for n sigma"}; - ConfigurableAxis invMassBins{"invMassBins", {100, 3.85, 4.15f}, "Binning for invariant mass (GeV/#it{c}^{2})"}; + ConfigurableAxis invMassBins{"invMassBins", {100, 3.85f, 4.15f}, "Binning for invariant mass (GeV/#it{c}^{2})"}; + ConfigurableAxis radiusBins{"radiusBins", {40, 0.f, 40.f}, "Binning for radius in xy plane (cm)"}; void init(InitContext&) { @@ -160,49 +297,82 @@ struct Hyperhelium4sigmaQa { const AxisSpec rigidityAxis{rigidityBins, "p/z (GeV/#it{c})"}; const AxisSpec nsigmaAxis{nsigmaBins, "TPC n#sigma"}; const AxisSpec invMassAxis{invMassBins, "Inv Mass (GeV/#it{c}^{2})"}; - - auto hCollCounter = registry.add("hCollCounter", "hCollCounter", HistType::kTH1F, {{2, 0.0f, 2.0f}}); - registry.get(HIST("hCollCounter"))->GetXaxis()->SetBinLabel(1, "Reconstructed Collisions"); - registry.get(HIST("hCollCounter"))->GetXaxis()->SetBinLabel(2, "Selected"); - auto hMcCollCounter = registry.add("hMcCollCounter", "hMcCollCounter", HistType::kTH1F, {{2, 0.0f, 2.0f}}); - registry.get(HIST("hMcCollCounter"))->GetXaxis()->SetBinLabel(1, "MC Collisions"); - registry.get(HIST("hMcCollCounter"))->GetXaxis()->SetBinLabel(2, "Reconstructed"); - - auto hGenHyperHelium4SigmaCounter = registry.add("hGenHyperHelium4SigmaCounter", "", HistType::kTH1F, {{10, 0.f, 10.f}}); - registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(1, "H4S All"); - registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(2, "Matter"); - registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(3, "AntiMatter"); - registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(4, "#alpha + #pi^{0}"); - registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(5, "#bar{#alpha} + #pi^{0}"); - registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(6, "t + p + #pi^{0}"); - registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(7, "#bar{t} + #bar{p} + #pi^{0}"); - registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(8, "t + n + #pi^{+}"); - registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(9, "#bar{t} + #bar{n} + #pi^{+}"); - registry.get(HIST("hGenHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(10, "Unexpected"); - - auto hEvtSelectedHyperHelium4SigmaCounter = registry.add("hEvtSelectedHyperHelium4SigmaCounter", "", HistType::kTH1F, {{2, 0.f, 2.f}}); - registry.get(HIST("hEvtSelectedHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(1, "Generated"); - registry.get(HIST("hEvtSelectedHyperHelium4SigmaCounter"))->GetXaxis()->SetBinLabel(2, "Survived"); - - registry.add("hGenHyperHelium4SigmaP", "", HistType::kTH1F, {ptAxis}); - registry.add("hGenHyperHelium4SigmaPt", "", HistType::kTH1F, {ptAxis}); - registry.add("hGenHyperHelium4SigmaCt", "", HistType::kTH1F, {ctAxis}); - registry.add("hMcRecoInvMass", "", HistType::kTH1F, {invMassAxis}); - - registry.add("hDauHelium4TPCNSigma", "", HistType::kTH2F, {rigidityAxis, nsigmaAxis}); - registry.add("hDauTritonTPCNSigma", "", HistType::kTH2F, {rigidityAxis, nsigmaAxis}); - registry.add("hDauProtonTPCNSigma", "", HistType::kTH2F, {rigidityAxis, nsigmaAxis}); + const AxisSpec diffPtAxis{200, -10.f, 10.f, "#Delta p_{T} (GeV/#it{c})"}; + const AxisSpec radiusAxis{radiusBins, "R (cm)"}; + + auto hCollCounter = genQAHist.add("hCollCounter", "hCollCounter", HistType::kTH1F, {{2, 0.0f, 2.0f}}); + hCollCounter->GetXaxis()->SetBinLabel(1, "Reconstructed Collisions"); + hCollCounter->GetXaxis()->SetBinLabel(2, "Selected"); + auto hMcCollCounter = genQAHist.add("hMcCollCounter", "hMcCollCounter", HistType::kTH1F, {{2, 0.0f, 2.0f}}); + hMcCollCounter->GetXaxis()->SetBinLabel(1, "MC Collisions"); + hMcCollCounter->GetXaxis()->SetBinLabel(2, "Reconstructed"); + + auto hGenHyperHelium4SigmaCounter = genQAHist.add("hGenHyperHelium4SigmaCounter", "", HistType::kTH1F, {{10, 0.f, 10.f}}); + hGenHyperHelium4SigmaCounter->GetXaxis()->SetBinLabel(1, "H4S All"); + hGenHyperHelium4SigmaCounter->GetXaxis()->SetBinLabel(2, "Matter"); + hGenHyperHelium4SigmaCounter->GetXaxis()->SetBinLabel(3, "AntiMatter"); + hGenHyperHelium4SigmaCounter->GetXaxis()->SetBinLabel(4, "#alpha + #pi^{0}"); + hGenHyperHelium4SigmaCounter->GetXaxis()->SetBinLabel(5, "#bar{#alpha} + #pi^{0}"); + hGenHyperHelium4SigmaCounter->GetXaxis()->SetBinLabel(6, "t + p + #pi^{0}"); + hGenHyperHelium4SigmaCounter->GetXaxis()->SetBinLabel(7, "#bar{t} + #bar{p} + #pi^{0}"); + hGenHyperHelium4SigmaCounter->GetXaxis()->SetBinLabel(8, "t + n + #pi^{+}"); + hGenHyperHelium4SigmaCounter->GetXaxis()->SetBinLabel(9, "#bar{t} + #bar{n} + #pi^{+}"); + hGenHyperHelium4SigmaCounter->GetXaxis()->SetBinLabel(10, "Unexpected"); + + auto hEvtSelectedHyperHelium4SigmaCounter = genQAHist.add("hEvtSelectedHyperHelium4SigmaCounter", "", HistType::kTH1F, {{2, 0.f, 2.f}}); + hEvtSelectedHyperHelium4SigmaCounter->GetXaxis()->SetBinLabel(1, "Generated"); + hEvtSelectedHyperHelium4SigmaCounter->GetXaxis()->SetBinLabel(2, "Survived"); + + genQAHist.add("hGenHyperHelium4SigmaP", "", HistType::kTH1F, {ptAxis}); + genQAHist.add("hGenHyperHelium4SigmaPt", "", HistType::kTH1F, {ptAxis}); + genQAHist.add("hGenHyperHelium4SigmaCt", "", HistType::kTH1F, {ctAxis}); + genQAHist.add("hMcRecoInvMass", "", HistType::kTH1F, {invMassAxis}); + + // efficiency/criteria studies for tracks which are true candidates + hMotherCounter = recoQAHist.add("hMotherCounter", "", HistType::kTH1F, {{9, 0.f, 9.f}}); + hMotherCounter->GetXaxis()->SetBinLabel(1, "Generated"); + hMotherCounter->GetXaxis()->SetBinLabel(2, "Reconstructed"); + hMotherCounter->GetXaxis()->SetBinLabel(3, "eta"); + hMotherCounter->GetXaxis()->SetBinLabel(4, "has collision"); + hMotherCounter->GetXaxis()->SetBinLabel(5, "ITSonly"); + hMotherCounter->GetXaxis()->SetBinLabel(6, "ITS hits"); + hMotherCounter->GetXaxis()->SetBinLabel(7, "ITS IR"); + hMotherCounter->GetXaxis()->SetBinLabel(8, "ITS chi2"); + hMotherCounter->GetXaxis()->SetBinLabel(9, "pt"); + recoQAHist.add("hTrueMotherRVsDiffPt", ";#Delta p_{T} (GeV/#it{c});R (cm);", HistType::kTH2F, {diffPtAxis, radiusAxis}); + recoQAHist.add("hTrueMotherRVsDiffPz", ";#Delta p_{z} (GeV/#it{c});R (cm);", HistType::kTH2F, {diffPtAxis, radiusAxis}); + recoQAHist.add("hGoodMotherRVsDiffPt", ";#Delta p_{T} (GeV/#it{c});R (cm);", HistType::kTH2F, {diffPtAxis, radiusAxis}); + recoQAHist.add("hGoodMotherRVsDiffPz", ";#Delta p_{z} (GeV/#it{c});R (cm);", HistType::kTH2F, {diffPtAxis, radiusAxis}); + + hDauAlphaCounter = recoQAHist.add("hDauAlphaCounter", "", HistType::kTH1F, {{7, 0.f, 7.f}}); + hDauTritonCounter = recoQAHist.add("hDauTritonCounter", "", HistType::kTH1F, {{7, 0.f, 7.f}}); + hDauProtonCounter = recoQAHist.add("hDauProtonCounter", "", HistType::kTH1F, {{7, 0.f, 7.f}}); + hDauPionCounter = recoQAHist.add("hDauPionCounter", "", HistType::kTH1F, {{7, 0.f, 7.f}}); + + recoQAHist.add("hDauAlphaTPCNSigma", "", HistType::kTH2F, {rigidityAxis, nsigmaAxis}); + recoQAHist.add("hDauTritonTPCNSigma", "", HistType::kTH2F, {rigidityAxis, nsigmaAxis}); + recoQAHist.add("hDauProtonTPCNSigma", "", HistType::kTH2F, {rigidityAxis, nsigmaAxis}); + recoQAHist.add("hDauPionTPCNSigma", "", HistType::kTH2F, {rigidityAxis, nsigmaAxis}); } } - // Configurable eventSel8Cut{"eventSel8Cut", true, "flag to enable event sel8 selection"}; + Configurable skipRejectedEvents{"skipRejectedEvents", false, "Flag to skip events that fail event selection cuts"}; Configurable mcEventCut{"mcEventCut", true, "flag to enable mc event selection: kIsTriggerTVX and kNoTimeFrameBorder"}; Configurable eventPosZCut{"eventPosZCut", true, "flag to enable event posZ selection"}; Configurable maxPosZ{"maxPosZ", 10.f, "max pv posZ for event selection"}; + Configurable etaMax{"etaMax", 1., "eta cut for tracks"}; + Configurable minPtMoth{"minPtMoth", 0.5, "Minimum pT of the hypercandidate"}; + Configurable tpcPidNsigmaCut{"tpcPidNsigmaCut", 5, "tpcPidNsigmaCut"}; + Configurable nTPCClusMinDaug{"nTPCClusMinDaug", 80, "daug NTPC clusters cut"}; + Configurable itsMaxChi2{"itsMaxChi2", 36, "max chi2 for ITS"}; + Configurable minRatioTPCNCls{"minRatioTPCNCls", 0.8, "min ratio of TPC crossed rows to findable clusters"}; + Preslice permcCollision = o2::aod::mcparticle::mcCollisionId; + // construct index array from mcParticle to track std::vector mcPartIndices; + template void setTrackIDForMC(aod::McParticles const& particlesMC, TTrackTable const& tracks) { @@ -225,6 +395,82 @@ struct Hyperhelium4sigmaQa { } } + // qa for mother track selection + template + bool motherTrackCheck(const TTrack& track, const std::shared_ptr hist) + { + hist->Fill(1); + + if (std::abs(track.eta()) > etaMax) { + return false; + } + hist->Fill(2); + + if (!track.has_collision()) { + return false; + } + hist->Fill(3); + + if (!track.hasITS() || track.hasTPC() || track.hasTOF()) { + return false; + } + hist->Fill(4); + + if (track.itsNCls() >= kITSLayers - 1) { + return false; + } + hist->Fill(5); + + if (track.itsNClsInnerBarrel() != kITSInnerBarrelLayers) { + return false; + } + hist->Fill(6); + + if (track.itsChi2NCl() >= itsMaxChi2) { + return false; + } + hist->Fill(7); + + if (track.pt() <= minPtMoth) { + return false; + } + hist->Fill(8); + + return true; + } + + // qa for daughter track selection + template + void daughterTrackCheck(const TTrack& track, const std::shared_ptr hist, float tpcNSigma) + { + hist->Fill(1); + + if (std::abs(track.eta()) > etaMax) { + return; + } + hist->Fill(2); + + if (!track.hasITS() || !track.hasTPC()) { + return; + } + hist->Fill(3); + + if (track.itsNClsInnerBarrel() != 0 && track.itsNCls() > kITSInnerBarrelLayers && track.tpcNClsCrossedRows() <= minRatioTPCNCls * track.tpcNClsFindable() && track.tpcNClsFound() <= nTPCClusMinDaug) { + return; + } + hist->Fill(4); + + if (std::abs(tpcNSigma) > tpcPidNsigmaCut) { + return; + } + hist->Fill(5); + + if (track.hasTOF()) { + return; + } + hist->Fill(6); + } + void processData(o2::aod::Collisions const&) { // dummy process function; @@ -233,29 +479,34 @@ struct Hyperhelium4sigmaQa { void processMC(aod::McCollisions const& mcCollisions, aod::McParticles const& particlesMC, o2::soa::Join const& collisions, MCLabeledTracksIU const& tracks) { + + // check mcparticles setTrackIDForMC(particlesMC, tracks); std::vector selectedEvents(collisions.size()); + std::vector dauIDList; int nevts = 0; for (const auto& collision : collisions) { - registry.fill(HIST("hCollCounter"), 0.5); + genQAHist.fill(HIST("hCollCounter"), 0.5); if (mcEventCut && (!collision.selection_bit(aod::evsel::kIsTriggerTVX) || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder))) { continue; } if (eventPosZCut && std::abs(collision.posZ()) > maxPosZ) { // 10cm continue; } - registry.fill(HIST("hCollCounter"), 1.5); + genQAHist.fill(HIST("hCollCounter"), 1.5); selectedEvents[nevts++] = collision.mcCollision_as().globalIndex(); } selectedEvents.resize(nevts); for (const auto& mcCollision : mcCollisions) { - registry.fill(HIST("hMcCollCounter"), 0.5); + genQAHist.fill(HIST("hMcCollCounter"), 0.5); const auto evtReconstructedAndSelected = std::find(selectedEvents.begin(), selectedEvents.end(), mcCollision.globalIndex()) != selectedEvents.end(); if (evtReconstructedAndSelected) { // Check that the event is reconstructed and that the reconstructed events pass the selection - registry.fill(HIST("hMcCollCounter"), 1.5); + genQAHist.fill(HIST("hMcCollCounter"), 1.5); } else { - // continue; + if (skipRejectedEvents) { + continue; + } } const auto& dparticlesMC = particlesMC.sliceBy(permcCollision, mcCollision.globalIndex()); @@ -264,47 +515,55 @@ struct Hyperhelium4sigmaQa { bool isMatter; if (mcparticle.pdgCode() == o2::constants::physics::Pdg::kHyperHelium4Sigma) { - registry.fill(HIST("hGenHyperHelium4SigmaCounter"), 1.5); + genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), 1.5); isMatter = true; } else if (mcparticle.pdgCode() == -o2::constants::physics::Pdg::kHyperHelium4Sigma) { - registry.fill(HIST("hGenHyperHelium4SigmaCounter"), 2.5); + genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), 2.5); isMatter = false; } else { continue; } - registry.fill(HIST("hGenHyperHelium4SigmaCounter"), 0.5); - registry.fill(HIST("hEvtSelectedHyperHelium4SigmaCounter"), 0.5); + genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), 0.5); + genQAHist.fill(HIST("hEvtSelectedHyperHelium4SigmaCounter"), 0.5); if (evtReconstructedAndSelected) { - registry.fill(HIST("hEvtSelectedHyperHelium4SigmaCounter"), 1.5); + genQAHist.fill(HIST("hEvtSelectedHyperHelium4SigmaCounter"), 1.5); + } + + auto dChannel = getDecayChannelH4S(mcparticle, dauIDList); + if (dChannel == kNDecayChannel) { + genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), 9.5); + continue; } + // bool isAllDauReconstructed = mcPartIndices[dauIDList[0]] != -1 && (dChannel == k2body ? true : mcPartIndices[dauIDList[1]] != -1); + + // check for mother tracks + recoQAHist.fill(HIST("hMotherCounter"), 0); + double svPos[3] = {-999, -999, -999}; - double dauHelium4Mom[3] = {-999, -999, -999}; + double dauAlphaMom[3] = {-999, -999, -999}; double dauTritonMom[3] = {-999, -999, -999}; double dauProtonMom[3] = {-999, -999, -999}; double dauNeuteronMom[3] = {-999, -999, -999}; double dauChargedPionMom[3] = {-999, -999, -999}; double dauPion0Mom[3] = {-999, -999, -999}; - auto dChannel = getDecayChannelH4S(mcparticle); - if (dChannel == kNDecayChannel) { - registry.fill(HIST("hGenHyperHelium4SigmaCounter"), 9.5); - continue; - } for (const auto& mcparticleDaughter : mcparticle.daughters_as()) { if (std::abs(mcparticleDaughter.pdgCode()) == o2::constants::physics::Pdg::kAlpha) { - dauHelium4Mom[0] = mcparticleDaughter.px(); - dauHelium4Mom[1] = mcparticleDaughter.py(); - dauHelium4Mom[2] = mcparticleDaughter.pz(); + dauAlphaMom[0] = mcparticleDaughter.px(); + dauAlphaMom[1] = mcparticleDaughter.py(); + dauAlphaMom[2] = mcparticleDaughter.pz(); // get SV position for 2body decay svPos[0] = mcparticleDaughter.vx(); svPos[1] = mcparticleDaughter.vy(); svPos[2] = mcparticleDaughter.vz(); + recoQAHist.fill(HIST("hDauAlphaCounter"), 0); if (mcPartIndices[mcparticleDaughter.globalIndex()] != -1) { auto track = tracks.rawIteratorAt(mcPartIndices[mcparticleDaughter.globalIndex()]); - registry.fill(HIST("hDauHelium4TPCNSigma"), track.p() * track.sign(), track.tpcNSigmaAl()); + recoQAHist.fill(HIST("hDauAlphaTPCNSigma"), track.p() * track.sign(), track.tpcNSigmaAl()); + daughterTrackCheck(track, hDauAlphaCounter, track.tpcNSigmaAl()); } } else if (std::abs(mcparticleDaughter.pdgCode()) == o2::constants::physics::Pdg::kTriton) { dauTritonMom[0] = mcparticleDaughter.px(); @@ -316,18 +575,22 @@ struct Hyperhelium4sigmaQa { svPos[1] = mcparticleDaughter.vy(); svPos[2] = mcparticleDaughter.vz(); + recoQAHist.fill(HIST("hDauTritonCounter"), 0); if (mcPartIndices[mcparticleDaughter.globalIndex()] != -1) { auto track = tracks.rawIteratorAt(mcPartIndices[mcparticleDaughter.globalIndex()]); - registry.fill(HIST("hDauTritonTPCNSigma"), track.p() * track.sign(), track.tpcNSigmaTr()); + recoQAHist.fill(HIST("hDauTritonTPCNSigma"), track.p() * track.sign(), track.tpcNSigmaTr()); + daughterTrackCheck(track, hDauTritonCounter, track.tpcNSigmaTr()); } } else if (std::abs(mcparticleDaughter.pdgCode()) == PDG_t::kProton) { dauProtonMom[0] = mcparticleDaughter.px(); dauProtonMom[1] = mcparticleDaughter.py(); dauProtonMom[2] = mcparticleDaughter.pz(); + recoQAHist.fill(HIST("hDauProtonCounter"), 0); if (mcPartIndices[mcparticleDaughter.globalIndex()] != -1) { auto track = tracks.rawIteratorAt(mcPartIndices[mcparticleDaughter.globalIndex()]); - registry.fill(HIST("hDauProtonTPCNSigma"), track.p() * track.sign(), track.tpcNSigmaPr()); + recoQAHist.fill(HIST("hDauProtonTPCNSigma"), track.p() * track.sign(), track.tpcNSigmaPr()); + daughterTrackCheck(track, hDauProtonCounter, track.tpcNSigmaPr()); } } else if (std::abs(mcparticleDaughter.pdgCode()) == PDG_t::kNeutron) { dauNeuteronMom[0] = mcparticleDaughter.px(); @@ -337,6 +600,13 @@ struct Hyperhelium4sigmaQa { dauChargedPionMom[0] = mcparticleDaughter.px(); dauChargedPionMom[1] = mcparticleDaughter.py(); dauChargedPionMom[2] = mcparticleDaughter.pz(); + + recoQAHist.fill(HIST("hDauPionCounter"), 0); + if (mcPartIndices[mcparticleDaughter.globalIndex()] != -1) { + auto track = tracks.rawIteratorAt(mcPartIndices[mcparticleDaughter.globalIndex()]); + recoQAHist.fill(HIST("hDauPionTPCNSigma"), track.p() * track.sign(), track.tpcNSigmaPi()); + daughterTrackCheck(track, hDauPionCounter, track.tpcNSigmaPi()); + } } else if (mcparticleDaughter.pdgCode() == PDG_t::kPi0) { dauPion0Mom[0] = mcparticleDaughter.px(); dauPion0Mom[1] = mcparticleDaughter.py(); @@ -344,35 +614,47 @@ struct Hyperhelium4sigmaQa { } } - registry.fill(HIST("hGenHyperHelium4SigmaP"), mcparticle.p()); - registry.fill(HIST("hGenHyperHelium4SigmaPt"), mcparticle.pt()); + genQAHist.fill(HIST("hGenHyperHelium4SigmaP"), mcparticle.p()); + genQAHist.fill(HIST("hGenHyperHelium4SigmaPt"), mcparticle.pt()); double ct = RecoDecay::sqrtSumOfSquares(svPos[0] - mcparticle.vx(), svPos[1] - mcparticle.vy(), svPos[2] - mcparticle.vz()) * o2::constants::physics::MassHyperHelium4Sigma / mcparticle.p(); - registry.fill(HIST("hGenHyperHelium4SigmaCt"), ct); + genQAHist.fill(HIST("hGenHyperHelium4SigmaCt"), ct); + + if (mcPartIndices[mcparticle.globalIndex()] != -1) { + auto motherTrack = tracks.rawIteratorAt(mcPartIndices[mcparticle.globalIndex()]); + bool isGoodMother = motherTrackCheck(motherTrack, hMotherCounter); + double svR = RecoDecay::sqrtSumOfSquares(svPos[0], svPos[1]); + recoQAHist.fill(HIST("hTrueMotherRVsDiffPt"), mcparticle.pt() - 2 * motherTrack.pt(), svR); + recoQAHist.fill(HIST("hTrueMotherRVsDiffPz"), mcparticle.pz() - 2 * motherTrack.pz(), svR); + if (isGoodMother) { + recoQAHist.fill(HIST("hGoodMotherRVsDiffPt"), mcparticle.pt() - 2 * motherTrack.pt(), svR); + recoQAHist.fill(HIST("hGoodMotherRVsDiffPz"), mcparticle.pz() - 2 * motherTrack.pz(), svR); + } + } if (dChannel == k2body) { if (isMatter) { - registry.fill(HIST("hGenHyperHelium4SigmaCounter"), 3.5); + genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), 3.5); } else { - registry.fill(HIST("hGenHyperHelium4SigmaCounter"), 4.5); + genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), 4.5); } - double hyperHelium4SigmaMCMass = RecoDecay::m(std::array{std::array{dauHelium4Mom[0], dauHelium4Mom[1], dauHelium4Mom[2]}, std::array{dauPion0Mom[0], dauPion0Mom[1], dauPion0Mom[2]}}, std::array{o2::constants::physics::MassAlpha, o2::constants::physics::MassPi0}); - registry.fill(HIST("hMcRecoInvMass"), hyperHelium4SigmaMCMass); + double hyperHelium4SigmaMCMass = RecoDecay::m(std::array{std::array{dauAlphaMom[0], dauAlphaMom[1], dauAlphaMom[2]}, std::array{dauPion0Mom[0], dauPion0Mom[1], dauPion0Mom[2]}}, std::array{o2::constants::physics::MassAlpha, o2::constants::physics::MassPi0}); + genQAHist.fill(HIST("hMcRecoInvMass"), hyperHelium4SigmaMCMass); } else if (dChannel == k3body_p) { if (isMatter) { - registry.fill(HIST("hGenHyperHelium4SigmaCounter"), 5.5); + genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), 5.5); } else { - registry.fill(HIST("hGenHyperHelium4SigmaCounter"), 6.5); + genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), 6.5); } double hyperHelium4SigmaMCMass = RecoDecay::m(std::array{std::array{dauTritonMom[0], dauTritonMom[1], dauTritonMom[2]}, std::array{dauProtonMom[0], dauProtonMom[1], dauProtonMom[2]}, std::array{dauPion0Mom[0], dauPion0Mom[1], dauPion0Mom[2]}}, std::array{o2::constants::physics::MassTriton, o2::constants::physics::MassProton, o2::constants::physics::MassPi0}); - registry.fill(HIST("hMcRecoInvMass"), hyperHelium4SigmaMCMass); + genQAHist.fill(HIST("hMcRecoInvMass"), hyperHelium4SigmaMCMass); } else if (dChannel == k3body_n) { if (isMatter) { - registry.fill(HIST("hGenHyperHelium4SigmaCounter"), 7.5); + genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), 7.5); } else { - registry.fill(HIST("hGenHyperHelium4SigmaCounter"), 8.5); + genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), 8.5); } double hyperHelium4SigmaMCMass = RecoDecay::m(std::array{std::array{dauTritonMom[0], dauTritonMom[1], dauTritonMom[2]}, std::array{dauNeuteronMom[0], dauNeuteronMom[1], dauNeuteronMom[2]}, std::array{dauChargedPionMom[0], dauChargedPionMom[1], dauChargedPionMom[2]}}, std::array{o2::constants::physics::MassTriton, o2::constants::physics::MassNeutron, o2::constants::physics::MassPionCharged}); - registry.fill(HIST("hMcRecoInvMass"), hyperHelium4SigmaMCMass); + genQAHist.fill(HIST("hMcRecoInvMass"), hyperHelium4SigmaMCMass); } } } From 7dcff738a070e6d7d0c8953978773ff0878dc8e3 Mon Sep 17 00:00:00 2001 From: dajones2 <140733426+dajones2@users.noreply.github.com> Date: Tue, 20 May 2025 01:52:39 +0100 Subject: [PATCH 1332/1650] [PWGJE] Adding a histogram filled with inclusive jet constituents (#11228) --- PWGJE/Tasks/jetHadronRecoil.cxx | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/PWGJE/Tasks/jetHadronRecoil.cxx b/PWGJE/Tasks/jetHadronRecoil.cxx index 2a4c47c17b6..d7e4c619de6 100644 --- a/PWGJE/Tasks/jetHadronRecoil.cxx +++ b/PWGJE/Tasks/jetHadronRecoil.cxx @@ -41,7 +41,6 @@ #include "EventFiltering/filterTables.h" -#include "PWGJE/Core/FastJetUtilities.h" #include "PWGJE/DataModel/JetSubstructure.h" using namespace o2; @@ -122,6 +121,7 @@ struct JetHadronRecoil { {"hPtTrack", "Track p_{T};p_{T};entries", {HistType::kTH1F, {{200, 0, 200}}}}, {"hEtaTrack", "Track #eta;#eta;entries", {HistType::kTH1F, {{100, -1.0, 1.0}}}}, {"hPhiTrack", "Track #phi;#phi;entries", {HistType::kTH1F, {{100, 0.0, o2::constants::math::TwoPI}}}}, + {"hConstituents3D", "3D constituents histogram;p_{T};#eta;#phi", {HistType::kTH3F, {{200, 0, 200}, {100, -1.0, 1.0}, {100, 0.0, o2::constants::math::TwoPI}}}}, {"hReferencePtDPhi", "jet p_{T} vs DPhi;#Delta#phi;p_{T,jet}", {HistType::kTH2F, {{100, 0, o2::constants::math::TwoPI}, {500, -100, 400}}}}, {"hReferencePtDPhiShifts", "rho shifts;#Delta#phi;p_{T,jet};shifts", {HistType::kTH3F, {{100, 0, o2::constants::math::TwoPI}, {500, -100, 400}, {20, 0.0, 2.0}}}}, {"hSignalPtDPhi", "jet p_{T} vs DPhi;#Delta#phi;p_{T,jet}", {HistType::kTH2F, {{100, 0, o2::constants::math::TwoPI}, {500, -100, 400}}}}, @@ -246,13 +246,14 @@ struct JetHadronRecoil { } for (const auto& jet : jets) { + if (jet.pt() > pTHatMaxMCD * pTHat) { + continue; + } for (const auto& constituent : jet.template tracks_as()) { if (constituent.pt() > leadingPT) { leadingPT = constituent.pt(); } - } - if (jet.pt() > pTHatMaxMCD * pTHat) { - continue; + registry.fill(HIST("hConstituents3D"), constituent.pt(), constituent.eta(), constituent.phi()); } if (leadingPT > maxLeadingTrackPt) { continue; @@ -355,6 +356,9 @@ struct JetHadronRecoil { if (jet.pt() > pTHatMaxMCP * pTHat) { continue; } + for (const auto& constituent : jet.template tracks_as()) { + registry.fill(HIST("hConstituents3D"), constituent.pt(), constituent.eta(), constituent.phi()); + } registry.fill(HIST("hJetPt"), jet.pt(), weight); registry.fill(HIST("hJetEta"), jet.eta(), weight); registry.fill(HIST("hJetPhi"), jet.phi(), weight); @@ -371,10 +375,10 @@ struct JetHadronRecoil { registry.fill(HIST("hDeltaRSignalPart"), dR, weight); } registry.fill(HIST("hDeltaRpTDPhiSignalPart"), jet.pt(), dphi, dR, weight); - } - registry.fill(HIST("hSignalPtDPhi"), dphi, jet.pt(), weight); - if (std::abs(dphi - o2::constants::math::PI) < 0.6) { - registry.fill(HIST("hSignalPt"), jet.pt(), weight); + registry.fill(HIST("hSignalPtDPhi"), dphi, jet.pt(), weight); + if (std::abs(dphi - o2::constants::math::PI) < 0.6) { + registry.fill(HIST("hSignalPt"), jet.pt(), weight); + } } if (!isSigCol) { if (std::abs(dphi - o2::constants::math::PI) < 0.6) { @@ -382,10 +386,10 @@ struct JetHadronRecoil { registry.fill(HIST("hDeltaRPartReference"), dR, weight); } registry.fill(HIST("hDeltaRpTDPhiReferencePart"), jet.pt(), dphi, dR, weight); - } - registry.fill(HIST("hReferencePtDPhi"), dphi, jet.pt(), weight); - if (std::abs(dphi - o2::constants::math::PI) < 0.6) { - registry.fill(HIST("hReferencePt"), jet.pt(), weight); + registry.fill(HIST("hReferencePtDPhi"), dphi, jet.pt(), weight); + if (std::abs(dphi - o2::constants::math::PI) < 0.6) { + registry.fill(HIST("hReferencePt"), jet.pt(), weight); + } } } } From 88ff085c5a363391d995e75986a07cb304eb0314 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Tue, 20 May 2025 06:25:57 +0200 Subject: [PATCH 1333/1650] [PWGLF] Avoid repetition in event mixing (#11255) --- .../Tasks/Strangeness/taskLambdaSpinCorr.cxx | 265 ++++++------------ 1 file changed, 79 insertions(+), 186 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx index 78a01b9f9fb..7ac8d4681a3 100644 --- a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx +++ b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx @@ -240,6 +240,7 @@ struct LfTaskLambdaSpinCorr { auto particle1Dummy = ROOT::Math::PxPyPzMVector(particle1.Px(), particle1.Py(), particle1.Pz(), 1.115683); auto particle2Dummy = ROOT::Math::PxPyPzMVector(particle2.Px(), particle2.Py(), particle2.Pz(), 1.115683); auto pairDummy = particle1Dummy + particle2Dummy; + // auto pairParticle = particle1 + particle2; ROOT::Math::Boost boostPairToCM{pairDummy.BoostToCM()}; // boosting vector for pair CM @@ -430,7 +431,7 @@ struct LfTaskLambdaSpinCorr { // 2nd loop for combination of lambda lambda for (const auto& v02 : V0s) { - if (v02.v0Id() <= v0.v0Id()) { + if (v02.index() <= v0.index()) { continue; } auto [lambdaTag2, aLambdaTag2, isValid2] = getLambdaTags(v02, collision); @@ -506,14 +507,20 @@ struct LfTaskLambdaSpinCorr { auto groupV03 = V0s.sliceBy(tracksPerCollisionV0, collision2.globalIndex()); // for (auto& [t1, t2, t3] : soa::combinations(o2::soa::CombinationsFullIndexPolicy(groupV01, groupV02, groupV03))) { // LOGF(info, "Mixed event collisions: (%d, %d, %d)", t1.collisionId(),t2.collisionId(),t3.collisionId()); + auto maxV0Size = 1100; + if (groupV01.size() > maxV0Size || groupV02.size() > maxV0Size || groupV03.size() > maxV0Size) { + continue; + } + bool pairStatus[1150][1150] = {{false}}; for (auto& [t1, t2] : soa::combinations(o2::soa::CombinationsFullIndexPolicy(groupV01, groupV02))) { bool pairfound = false; - if (t2.v0Id() <= t1.v0Id()) { + if (t2.index() <= t1.index()) { continue; } if (t1.collisionId() != t2.collisionId()) { continue; } + auto [lambdaTag1, aLambdaTag1, isValid1] = getLambdaTags(t1, collision1); auto [lambdaTag2, aLambdaTag2, isValid2] = getLambdaTags(t2, collision1); if (!isValid1) { @@ -529,6 +536,10 @@ struct LfTaskLambdaSpinCorr { continue; } for (const auto& t3 : groupV03) { + if (pairStatus[t3.index()][t2.index()]) { + // LOGF(info, "repeat match found v0 id: (%d, %d)", t3.index(), t2.index()); + continue; + } if (t1.collisionId() == t3.collisionId()) { continue; } @@ -539,7 +550,6 @@ struct LfTaskLambdaSpinCorr { if (lambdaTag3 && aLambdaTag3) { continue; } - if (lambdaTag1 != lambdaTag3 || aLambdaTag1 != aLambdaTag3) { continue; } @@ -552,7 +562,6 @@ struct LfTaskLambdaSpinCorr { if (std::abs(t1.phi() - t3.phi()) > phiMix) { continue; } - if (lambdaTag2) { proton = ROOT::Math::PxPyPzMVector(t2.pxpos(), t2.pypos(), t2.pzpos(), o2::constants::physics::MassProton); antiPion = ROOT::Math::PxPyPzMVector(t2.pxneg(), t2.pyneg(), t2.pzneg(), o2::constants::physics::MassPionCharged); @@ -586,6 +595,8 @@ struct LfTaskLambdaSpinCorr { fillHistograms(0, 1, 1, 0, antiLambda, lambda2, antiProton, proton2, centrality, 2); } pairfound = true; + pairStatus[t3.index()][t2.index()] = true; + // LOGF(info, "v0 id: (%d, %d)", t3.index(), t2.index()); if (pairfound) { // LOGF(info, "Pair found"); break; @@ -596,206 +607,79 @@ struct LfTaskLambdaSpinCorr { } PROCESS_SWITCH(LfTaskLambdaSpinCorr, processME, "Process data ME", true); - using CollisionMCTrueTable = aod::McCollisions; - using TrackMCTrueTable = aod::McParticles; - - using CollisionMCRecTableCentFT0C = soa::SmallGroups>; - using TrackMCRecTable = soa::Join; - // using FilTrackMCRecTable = soa::Filtered; - using FilTrackMCRecTable = TrackMCRecTable; - Preslice perCollision = aod::track::collisionId; + using CollisionMCRecTableCentFT0C = soa::Join; + using TrackMCRecTable = soa::Join; using V0TrackCandidatesMC = soa::Join; - - void processMC(CollisionMCTrueTable::iterator const& /*TrueCollision*/, CollisionMCRecTableCentFT0C const& RecCollisions, TrackMCTrueTable const& GenParticles, FilTrackMCRecTable const& /*RecTracks*/, V0TrackCandidatesMC const& V0s) + void processMC(CollisionMCRecTableCentFT0C::iterator const& collision, TrackMCRecTable const& /*tracks*/, V0TrackCandidatesMC const& V0s) { - for (const auto& RecCollision : RecCollisions) { - if (!RecCollision.sel8()) { + // for (const auto& RecCollis : collision) { + if (!collision.sel8()) { + return; + } + if (std::abs(collision.posZ()) > cfgCutVertex) { + return; + } + auto centrality = collision.centFT0C(); + histos.fill(HIST("hCentrality"), centrality); + for (const auto& v0 : V0s) { + auto [lambdaTag, aLambdaTag, isValid] = getLambdaTagsMC(v0, collision); + if (!isValid) { continue; } - if (!RecCollision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !RecCollision.selection_bit(aod::evsel::kNoITSROFrameBorder)) { - // continue; + if (lambdaTag) { + proton = ROOT::Math::PxPyPzMVector(v0.pxpos(), v0.pypos(), v0.pzpos(), o2::constants::physics::MassProton); + antiPion = ROOT::Math::PxPyPzMVector(v0.pxneg(), v0.pyneg(), v0.pzneg(), o2::constants::physics::MassPionCharged); + lambda = proton + antiPion; } - if (std::abs(RecCollision.posZ()) > cfgCutVertex) { + if (aLambdaTag) { + antiProton = ROOT::Math::PxPyPzMVector(v0.pxneg(), v0.pyneg(), v0.pzneg(), o2::constants::physics::MassProton); + pion = ROOT::Math::PxPyPzMVector(v0.pxpos(), v0.pypos(), v0.pzpos(), o2::constants::physics::MassPionCharged); + antiLambda = antiProton + pion; + } + if (lambdaTag && aLambdaTag) { continue; } - auto centrality = RecCollision.centFT0C(); - histos.fill(HIST("hCentrality"), centrality); - for (const auto& v0 : V0s) { - auto [lambdaTag, aLambdaTag, isValid] = getLambdaTagsMC(v0, RecCollision); - if (!isValid) { + auto postrack1 = v0.template posTrack_as(); + auto negtrack1 = v0.template negTrack_as(); + // 2nd loop for combination of lambda lambda + for (const auto& v02 : V0s) { + if (v02.index() <= v0.index()) { continue; } - if (lambdaTag) { - proton = ROOT::Math::PxPyPzMVector(v0.pxpos(), v0.pypos(), v0.pzpos(), o2::constants::physics::MassProton); - antiPion = ROOT::Math::PxPyPzMVector(v0.pxneg(), v0.pyneg(), v0.pzneg(), o2::constants::physics::MassPionCharged); - lambda = proton + antiPion; - } - if (aLambdaTag) { - antiProton = ROOT::Math::PxPyPzMVector(v0.pxneg(), v0.pyneg(), v0.pzneg(), o2::constants::physics::MassProton); - pion = ROOT::Math::PxPyPzMVector(v0.pxpos(), v0.pypos(), v0.pzpos(), o2::constants::physics::MassPionCharged); - antiLambda = antiProton + pion; - } - if (lambdaTag && aLambdaTag) { + auto [lambdaTag2, aLambdaTag2, isValid2] = getLambdaTagsMC(v02, collision); + if (!isValid2) { continue; } - auto postrack1 = v0.template posTrack_as(); - auto negtrack1 = v0.template negTrack_as(); - // 2nd loop for combination of lambda lambda - for (const auto& v02 : V0s) { - if (v02.v0Id() <= v0.v0Id()) { - continue; - } - auto [lambdaTag2, aLambdaTag2, isValid2] = getLambdaTagsMC(v02, RecCollision); - if (!isValid2) { - continue; - } - if (lambdaTag2) { - proton2 = ROOT::Math::PxPyPzMVector(v02.pxpos(), v02.pypos(), v02.pzpos(), o2::constants::physics::MassProton); - antiPion2 = ROOT::Math::PxPyPzMVector(v02.pxneg(), v02.pyneg(), v02.pzneg(), o2::constants::physics::MassPionCharged); - lambda2 = proton2 + antiPion2; - } - if (aLambdaTag2) { - antiProton2 = ROOT::Math::PxPyPzMVector(v02.pxneg(), v02.pyneg(), v02.pzneg(), o2::constants::physics::MassProton); - pion2 = ROOT::Math::PxPyPzMVector(v02.pxpos(), v02.pypos(), v02.pzpos(), o2::constants::physics::MassPionCharged); - antiLambda2 = antiProton2 + pion2; - } - if (lambdaTag && aLambdaTag) { - continue; - } - auto postrack2 = v02.template posTrack_as(); - auto negtrack2 = v02.template negTrack_as(); - if (postrack1.globalIndex() == postrack2.globalIndex() || negtrack1.globalIndex() == negtrack2.globalIndex()) { - continue; // no shared decay products - } - if (lambdaTag && lambdaTag2) { - fillHistograms(1, 0, 1, 0, lambda, lambda2, proton, proton2, centrality, 0); - } - if (aLambdaTag && aLambdaTag2) { - fillHistograms(0, 1, 0, 1, antiLambda, antiLambda2, antiProton, antiProton2, centrality, 0); - } - if (lambdaTag && aLambdaTag2) { - fillHistograms(1, 0, 0, 1, lambda, antiLambda2, proton, antiProton2, centrality, 0); - } - if (aLambdaTag && lambdaTag2) { - fillHistograms(0, 1, 1, 0, antiLambda, lambda2, antiProton, proton2, centrality, 0); - } + if (lambdaTag2) { + proton2 = ROOT::Math::PxPyPzMVector(v02.pxpos(), v02.pypos(), v02.pzpos(), o2::constants::physics::MassProton); + antiPion2 = ROOT::Math::PxPyPzMVector(v02.pxneg(), v02.pyneg(), v02.pzneg(), o2::constants::physics::MassPionCharged); + lambda2 = proton2 + antiPion2; } - } - - //*******generated**************** - for (const auto& mcParticle : GenParticles) { - if (std::abs(mcParticle.y()) > confV0Rap) { - continue; + if (aLambdaTag2) { + antiProton2 = ROOT::Math::PxPyPzMVector(v02.pxneg(), v02.pyneg(), v02.pzneg(), o2::constants::physics::MassProton); + pion2 = ROOT::Math::PxPyPzMVector(v02.pxpos(), v02.pypos(), v02.pzpos(), o2::constants::physics::MassPionCharged); + antiLambda2 = antiProton2 + pion2; } - if (std::abs(mcParticle.pdgCode()) != PDG_t::kLambda0) { + if (lambdaTag && aLambdaTag) { continue; } - - int tagamc = 0; - int tagbmc = 0; - int taga2mc = 0; - int tagb2mc = 0; - - auto pdg1 = mcParticle.pdgCode(); - auto kDaughters = mcParticle.daughters_as(); - int daughsize = 2; - if (kDaughters.size() != daughsize) { - continue; + auto postrack2 = v02.template posTrack_as(); + auto negtrack2 = v02.template negTrack_as(); + if (postrack1.globalIndex() == postrack2.globalIndex() || negtrack1.globalIndex() == negtrack2.globalIndex()) { + continue; // no shared decay products } - - for (const auto& kCurrentDaughter : kDaughters) { - - if (std::abs(kCurrentDaughter.pdgCode()) != PDG_t::kProton && std::abs(kCurrentDaughter.pdgCode()) != PDG_t::kPiPlus) { - continue; - } - - if (kCurrentDaughter.pdgCode() == PDG_t::kProton) { - protonmc = ROOT::Math::PxPyPzMVector(kCurrentDaughter.px(), kCurrentDaughter.py(), kCurrentDaughter.pz(), o2::constants::physics::MassProton); - } - if (kCurrentDaughter.pdgCode() == PDG_t::kPiMinus) { - antiPionmc = ROOT::Math::PxPyPzMVector(kCurrentDaughter.px(), kCurrentDaughter.py(), kCurrentDaughter.pz(), o2::constants::physics::MassPionCharged); - } - - if (kCurrentDaughter.pdgCode() == PDG_t::kProtonBar) { - antiProtonmc = ROOT::Math::PxPyPzMVector(kCurrentDaughter.px(), kCurrentDaughter.py(), kCurrentDaughter.pz(), o2::constants::physics::MassProton); - } - if (kCurrentDaughter.pdgCode() == PDG_t::kPiPlus) { - pionmc = ROOT::Math::PxPyPzMVector(kCurrentDaughter.px(), kCurrentDaughter.py(), kCurrentDaughter.pz(), o2::constants::physics::MassPionCharged); - } + if (lambdaTag && lambdaTag2) { + fillHistograms(1, 0, 1, 0, lambda, lambda2, proton, proton2, centrality, 0); } - if (pdg1 == PDG_t::kLambda0) { - tagamc = 1; - lambdamc = protonmc + antiPionmc; + if (aLambdaTag && aLambdaTag2) { + fillHistograms(0, 1, 0, 1, antiLambda, antiLambda2, antiProton, antiProton2, centrality, 0); } - - if (pdg1 == PDG_t::kLambda0Bar) { - tagbmc = 1; - antiLambdamc = antiProtonmc + pionmc; + if (lambdaTag && aLambdaTag2) { + fillHistograms(1, 0, 0, 1, lambda, antiLambda2, proton, antiProton2, centrality, 0); } - - for (const auto& mcParticle2 : GenParticles) { - if (std::abs(mcParticle2.y()) > confV0Rap) { - continue; - } - if (std::abs(mcParticle2.pdgCode()) != PDG_t::kLambda0) { - continue; - } - if (mcParticle.globalIndex() >= mcParticle2.globalIndex()) { - continue; - } - - auto pdg2 = mcParticle2.pdgCode(); - auto kDaughters2 = mcParticle2.daughters_as(); - - if (kDaughters2.size() != daughsize) { - continue; - } - - for (const auto& kCurrentDaughter2 : kDaughters2) { - if (std::abs(kCurrentDaughter2.pdgCode()) != PDG_t::kProton && std::abs(kCurrentDaughter2.pdgCode()) != PDG_t::kPiPlus) { - continue; - } - - if (kCurrentDaughter2.pdgCode() == PDG_t::kProton) { - proton2mc = ROOT::Math::PxPyPzMVector(kCurrentDaughter2.px(), kCurrentDaughter2.py(), kCurrentDaughter2.pz(), o2::constants::physics::MassProton); - } - if (kCurrentDaughter2.pdgCode() == PDG_t::kPiMinus) { - antiPion2mc = ROOT::Math::PxPyPzMVector(kCurrentDaughter2.px(), kCurrentDaughter2.py(), kCurrentDaughter2.pz(), o2::constants::physics::MassPionCharged); - } - - if (kCurrentDaughter2.pdgCode() == PDG_t::kProtonBar) { - antiProton2mc = ROOT::Math::PxPyPzMVector(kCurrentDaughter2.px(), kCurrentDaughter2.py(), kCurrentDaughter2.pz(), o2::constants::physics::MassProton); - } - if (kCurrentDaughter2.pdgCode() == PDG_t::kPiPlus) { - pion2mc = ROOT::Math::PxPyPzMVector(kCurrentDaughter2.px(), kCurrentDaughter2.py(), kCurrentDaughter2.pz(), o2::constants::physics::MassPionCharged); - } - } - - if (pdg2 == PDG_t::kLambda0) { - taga2mc = 1; - lambda2mc = proton2mc + antiPion2mc; - } - - if (pdg2 == PDG_t::kLambda0Bar) { - tagb2mc = 1; - antiLambda2mc = antiProton2mc + pion2mc; - } - - if (tagamc && taga2mc) { - fillHistograms(tagamc, tagbmc, taga2mc, tagb2mc, lambdamc, lambda2mc, protonmc, proton2mc, centrality, 1); - } - if (tagamc && tagb2mc) { - fillHistograms(tagamc, tagbmc, taga2mc, tagb2mc, lambdamc, antiLambda2mc, protonmc, antiProton2mc, centrality, 1); - } - - if (tagbmc && taga2mc) { - fillHistograms(tagamc, tagbmc, taga2mc, tagb2mc, antiLambdamc, lambda2mc, antiProtonmc, proton2mc, centrality, 1); - } - - if (tagbmc && tagb2mc) { - fillHistograms(tagamc, tagbmc, taga2mc, tagb2mc, antiLambdamc, antiLambda2mc, antiProtonmc, antiProton2mc, centrality, 1); - } + if (aLambdaTag && lambdaTag2) { + fillHistograms(0, 1, 1, 0, antiLambda, lambda2, antiProton, proton2, centrality, 0); } } } @@ -827,9 +711,14 @@ struct LfTaskLambdaSpinCorr { auto groupV03 = V0s.sliceBy(tracksPerCollisionV0, collision2.globalIndex()); // for (auto& [t1, t2, t3] : soa::combinations(o2::soa::CombinationsFullIndexPolicy(groupV01, groupV02, groupV03))) { // LOGF(info, "Mixed event collisions: (%d, %d, %d)", t1.collisionId(),t2.collisionId(),t3.collisionId()); + auto maxV0Size = 1100; + if (groupV01.size() > maxV0Size || groupV02.size() > maxV0Size || groupV03.size() > maxV0Size) { + continue; + } + bool pairStatus[1150][1150] = {{false}}; for (auto& [t1, t2] : soa::combinations(o2::soa::CombinationsFullIndexPolicy(groupV01, groupV02))) { bool pairfound = false; - if (t2.v0Id() <= t1.v0Id()) { + if (t2.index() <= t1.index()) { continue; } if (t1.collisionId() != t2.collisionId()) { @@ -850,6 +739,10 @@ struct LfTaskLambdaSpinCorr { continue; } for (const auto& t3 : groupV03) { + if (pairStatus[t3.index()][t2.index()]) { + // LOGF(info, "repeat match found v0 id: (%d, %d)", t3.index(), t2.index()); + continue; + } if (t1.collisionId() == t3.collisionId()) { continue; } @@ -872,7 +765,6 @@ struct LfTaskLambdaSpinCorr { if (std::abs(t1.phi() - t3.phi()) > phiMix) { continue; } - if (lambdaTag2) { proton = ROOT::Math::PxPyPzMVector(t2.pxpos(), t2.pypos(), t2.pzpos(), o2::constants::physics::MassProton); antiPion = ROOT::Math::PxPyPzMVector(t2.pxneg(), t2.pyneg(), t2.pzneg(), o2::constants::physics::MassPionCharged); @@ -906,6 +798,7 @@ struct LfTaskLambdaSpinCorr { fillHistograms(0, 1, 1, 0, antiLambda, lambda2, antiProton, proton2, centrality, 2); } pairfound = true; + pairStatus[t3.index()][t2.index()] = true; if (pairfound) { // LOGF(info, "Pair found"); break; From 8c0aad51f6b685d625303bc816f533c034719628 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Tue, 20 May 2025 16:22:23 +0900 Subject: [PATCH 1334/1650] [Common,PWGEM/Dilepton] remove unnecessary tasks (#11253) --- Common/DataModel/CMakeLists.txt | 3 +- Common/DataModel/PropagatedFwdTrackTables.h | 85 --- Common/TableProducer/CMakeLists.txt | 5 - Common/TableProducer/fwdtrackPropagation.cxx | 422 ------------- PWGEM/Dilepton/DataModel/dileptonTables.h | 3 +- .../TableProducer/skimmerPrimaryMuon.cxx | 570 +++++++++++++----- PWGEM/Dilepton/Tasks/matchingMFT.cxx | 14 - 7 files changed, 406 insertions(+), 696 deletions(-) delete mode 100644 Common/DataModel/PropagatedFwdTrackTables.h delete mode 100644 Common/TableProducer/fwdtrackPropagation.cxx diff --git a/Common/DataModel/CMakeLists.txt b/Common/DataModel/CMakeLists.txt index 79e6cba8b5d..084222c9648 100644 --- a/Common/DataModel/CMakeLists.txt +++ b/Common/DataModel/CMakeLists.txt @@ -27,5 +27,4 @@ o2physics_add_header_only_library(DataModel MftmchMatchingML.h ZDCInterCalib.h EseTable.h - FwdTrackReAlignTables.h - PropagatedFwdTrackTables.h) + FwdTrackReAlignTables.h) diff --git a/Common/DataModel/PropagatedFwdTrackTables.h b/Common/DataModel/PropagatedFwdTrackTables.h deleted file mode 100644 index ab0b20b76cf..00000000000 --- a/Common/DataModel/PropagatedFwdTrackTables.h +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. - -/// \file PropagatedFwdTrackTables.h -/// \brief Table definitions for propagated forward tracks -/// \author Maurice Coquet -/// \author Luca Micheletti -/// \author Daiki Sekihata - -#ifndef COMMON_DATAMODEL_PROPAGATEDFWDTRACKTABLES_H_ -#define COMMON_DATAMODEL_PROPAGATEDFWDTRACKTABLES_H_ - -#include "Framework/AnalysisDataModel.h" -#include "TrackSelectionTables.h" - -namespace o2::aod -{ -namespace propfwdtrack -{ -DECLARE_SOA_INDEX_COLUMN(FwdTrack, fwdtrack); //! FwdTrack index -DECLARE_SOA_INDEX_COLUMN_FULL(MCHTrack, matchMCHTrack, int, FwdTracks, "_MatchMCHTrack"); //! Index of matched MCH track for GlobalMuonTracks and GlobalForwardTracks -DECLARE_SOA_COLUMN(CXXatDCA, cXXatDCA, float); //! DCAx resolution squared at DCA -DECLARE_SOA_COLUMN(CYYatDCA, cYYatDCA, float); //! DCAy resolution squared at DCA -DECLARE_SOA_COLUMN(CXYatDCA, cXYatDCA, float); //! correlation term of DCAx,y resolution at DCA -DECLARE_SOA_COLUMN(EtaMatchedMCHMID, etaMatchedMCHMID, float); //! eta of MCH-MID track in MFT-MCH-MID track at PV -DECLARE_SOA_COLUMN(PhiMatchedMCHMID, phiMatchedMCHMID, float); //! phi of MCH-MID track in MFT-MCH-MID track at PV -DECLARE_SOA_COLUMN(IsAssociatedToMPC, isAssociatedToMPC, bool); //! is assigned to the most probable collision (relevant to TTCA) -DECLARE_SOA_COLUMN(IsAmbiguous, isAmbiguous, bool); //! is ambiguous (relevant to TTCA) -} // namespace propfwdtrack - -DECLARE_SOA_TABLE_FULL(StoredPropagatedFwdTracks, "PropagatedFwdTracks", "AOD", "PROPFWDTRACK", - o2::soa::Index<>, fwdtrack::CollisionId, fwdtrack::TrackType, - fwdtrack::X, fwdtrack::Y, fwdtrack::Z, fwdtrack::Phi, fwdtrack::Tgl, - fwdtrack::Signed1Pt, fwdtrack::NClusters, fwdtrack::PDca, fwdtrack::RAtAbsorberEnd, - fwdtrack::Px, - fwdtrack::Py, - fwdtrack::Pz, - fwdtrack::Sign, - fwdtrack::Chi2, fwdtrack::Chi2MatchMCHMID, fwdtrack::Chi2MatchMCHMFT, - fwdtrack::MatchScoreMCHMFT, propfwdtrack::FwdTrackId, fwdtrack::MFTTrackId, propfwdtrack::MCHTrackId, - fwdtrack::MCHBitMap, fwdtrack::MIDBitMap, fwdtrack::MIDBoards, - fwdtrack::TrackTime, fwdtrack::TrackTimeRes, fwdtrack::FwdDcaX, fwdtrack::FwdDcaY, - propfwdtrack::CXXatDCA, propfwdtrack::CYYatDCA, propfwdtrack::CXYatDCA, - propfwdtrack::EtaMatchedMCHMID, propfwdtrack::PhiMatchedMCHMID, - propfwdtrack::IsAssociatedToMPC, propfwdtrack::IsAmbiguous, o2::soa::Marker<1>); - -DECLARE_SOA_TABLE_FULL(StoredPropagatedFwdTracksCov, "PropagatedFwdTracksCov", "AOD", "PROPFWDTRACKCOV", //! - fwdtrack::SigmaX, fwdtrack::SigmaY, fwdtrack::SigmaPhi, fwdtrack::SigmaTgl, fwdtrack::Sigma1Pt, - fwdtrack::RhoXY, fwdtrack::RhoPhiY, fwdtrack::RhoPhiX, fwdtrack::RhoTglX, fwdtrack::RhoTglY, - fwdtrack::RhoTglPhi, fwdtrack::Rho1PtX, fwdtrack::Rho1PtY, fwdtrack::Rho1PtPhi, fwdtrack::Rho1PtTgl, o2::soa::Marker<1>); - -// extended table with expression columns that can be used as arguments of dynamic columns -DECLARE_SOA_EXTENDED_TABLE_USER(PropagatedFwdTracks, StoredPropagatedFwdTracks, "PROPFWDTRACKEXT", //! - fwdtrack::Pt, - fwdtrack::Eta, - fwdtrack::P); - -// extended table with expression columns that can be used as arguments of dynamic columns -DECLARE_SOA_EXTENDED_TABLE_USER(PropagatedFwdTracksCov, StoredPropagatedFwdTracksCov, "PROPFWDTRACKCOVEXT", //! - fwdtrack::CXX, - fwdtrack::CXY, - fwdtrack::CYY, - fwdtrack::CPhiX, - fwdtrack::CPhiY, - fwdtrack::CPhiPhi, - fwdtrack::CTglX, - fwdtrack::CTglY, - fwdtrack::CTglPhi, - fwdtrack::CTglTgl, - fwdtrack::C1PtX, - fwdtrack::C1PtY, - fwdtrack::C1PtPhi, - fwdtrack::C1PtTgl, - fwdtrack::C1Pt21Pt2); -} // namespace o2::aod - -#endif // COMMON_DATAMODEL_PROPAGATEDFWDTRACKTABLES_H_ diff --git a/Common/TableProducer/CMakeLists.txt b/Common/TableProducer/CMakeLists.txt index 942b892bd56..042bd643d3e 100644 --- a/Common/TableProducer/CMakeLists.txt +++ b/Common/TableProducer/CMakeLists.txt @@ -150,8 +150,3 @@ o2physics_add_dpl_workflow(muon-realignment PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase O2::DetectorsCommonDataFormats O2::MathUtils O2::MCHTracking O2::DataFormatsMCH O2::GlobalTracking O2::MCHBase O2::MCHGeometryTransformer O2::CommonUtils COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(fwdtrack-propagation - SOURCES fwdtrackPropagation.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::GlobalTracking - COMPONENT_NAME Analysis) - diff --git a/Common/TableProducer/fwdtrackPropagation.cxx b/Common/TableProducer/fwdtrackPropagation.cxx deleted file mode 100644 index c7df8dd3ea5..00000000000 --- a/Common/TableProducer/fwdtrackPropagation.cxx +++ /dev/null @@ -1,422 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. - -/// \file fwdtrackPropagator.cxx -/// \brief Common task to produce propagated forward tracks -/// \author Maurice Coquet -/// \author Luca Micheletti -/// \author Daiki Sekihata - -#include -#include -#include - -#include "Framework/DataTypes.h" -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "TableHelper.h" -#include "CCDB/BasicCCDBManager.h" -#include "DataFormatsParameters/GRPMagField.h" -#include "TGeoGlobalMagField.h" -#include "Field/MagneticField.h" - -#include "DetectorsBase/Propagator.h" -#include "GlobalTracking/MatchGlobalFwd.h" -#include "MCHTracking/TrackExtrap.h" -#include "MCHTracking/TrackParam.h" -#include "ReconstructionDataFormats/TrackFwd.h" - -#include "Common/DataModel/CollisionAssociationTables.h" -#include "Common/DataModel/PropagatedFwdTrackTables.h" -#include "Common/Core/fwdtrackUtilities.h" - -using namespace o2; -using namespace o2::aod; -using namespace o2::soa; -using namespace o2::framework; -using namespace o2::framework::expressions; -using namespace o2::aod::fwdtrackutils; - -struct FwdTrackPropagation { - using MyFwdTracks = soa::Join; - - Produces propfwdtracks; - Produces propfwdtrackscov; - - Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; - Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; - Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; - Configurable fillQAHistograms{"fillQAHistograms", true, "flag to fill QA histograms"}; - Configurable minPt{"minPt", 0.2, "min pt for muon"}; - Configurable maxPt{"maxPt", 1e+10, "max pt for muon"}; - Configurable minEtaSA{"minEtaSA", -4.0, "min. eta acceptance for MCH-MID"}; - Configurable maxEtaSA{"maxEtaSA", -2.5, "max. eta acceptance for MCH-MID"}; - Configurable minEtaGL{"minEtaGL", -3.6, "min. eta acceptance for MFT-MCH-MID"}; - Configurable maxEtaGL{"maxEtaGL", -2.5, "max. eta acceptance for MFT-MCH-MID"}; - Configurable minRabsGL{"minRabsGL", 27.6, "min. R at absorber end for global muon (min. eta = -3.6)"}; // std::tan(2.f * std::atan(std::exp(- -3.6)) ) * -505. - Configurable minRabs{"minRabs", 17.6, "min. R at absorber end"}; - Configurable midRabs{"midRabs", 26.5, "middle R at absorber end for pDCA cut"}; - Configurable maxRabs{"maxRabs", 89.5, "max. R at absorber end"}; - Configurable maxDCAxy{"maxDCAxy", 1e+10, "max. DCAxy for global muons"}; - Configurable maxPDCAforLargeR{"maxPDCAforLargeR", 324.f, "max. pDCA for large R at absorber end"}; - Configurable maxPDCAforSmallR{"maxPDCAforSmallR", 594.f, "max. pDCA for small R at absorber end"}; - Configurable maxMatchingChi2MCHMFT{"maxMatchingChi2MCHMFT", 50.f, "max. chi2 for MCH-MFT matching"}; - Configurable maxChi2SA{"maxChi2SA", 1e+6, "max. chi2 for standalone muon"}; - Configurable maxChi2GL{"maxChi2GL", 50.f, "max. chi2 for global muon"}; - Configurable refitGlobalMuon{"refitGlobalMuon", true, "flag to refit global muon"}; - - HistogramRegistry fRegistry{"fRegistry"}; - static constexpr std::string_view muon_types[5] = {"MFTMCHMID/", "MFTMCHMIDOtherMatch/", "MFTMCH/", "MCHMID/", "MCH/"}; - - void init(o2::framework::InitContext&) - { - if (doprocessWithoutFTTCA && doprocessWithFTTCA) { - LOGF(fatal, "Cannot enable doprocessWithoutFTTCA and doprocessWithFTTCA at the same time. Please choose one."); - } - - ccdb->setURL(ccdburl); - ccdb->setCaching(true); - ccdb->setLocalObjectValidityChecking(); - ccdb->setFatalWhenNull(false); - ccdbApi.init(ccdburl); - - if (fillQAHistograms) { - addHistograms(); - } - } - - o2::ccdb::CcdbApi ccdbApi; - Service ccdb; - int mRunNumber = -1; - - template - void initCCDB(TBC const& bc) - { - if (mRunNumber == bc.runNumber()) { - return; - } - mRunNumber = bc.runNumber(); - LOGF(info, "mRunNumber = %d", mRunNumber); - std::map metadata; - auto soreor = o2::ccdb::BasicCCDBManager::getRunDuration(ccdbApi, mRunNumber); - auto ts = soreor.first; - auto grpmag = ccdbApi.retrieveFromTFileAny(grpmagPath, metadata, ts); - o2::base::Propagator::initFieldFromGRP(grpmag); - if (!o2::base::GeometryManager::isGeometryLoaded()) { - ccdb->get(geoPath); - } - o2::mch::TrackExtrap::setField(); - } - - void addHistograms() - { - auto hMuonType = fRegistry.add("hMuonType", "muon type", kTH1F, {{5, -0.5f, 4.5f}}, false); - hMuonType->GetXaxis()->SetBinLabel(1, "MFT-MCH-MID (global muon)"); - hMuonType->GetXaxis()->SetBinLabel(2, "MFT-MCH-MID (global muon other match)"); - hMuonType->GetXaxis()->SetBinLabel(3, "MFT-MCH"); - hMuonType->GetXaxis()->SetBinLabel(4, "MCH-MID"); - hMuonType->GetXaxis()->SetBinLabel(5, "MCH standalone"); - - fRegistry.add("MFTMCHMID/hPt", "pT;p_{T} (GeV/c)", kTH1F, {{100, 0.0f, 10}}, false); - fRegistry.add("MFTMCHMID/hRelDiffPt", "pT resolution;p_{T} (GeV/c);#Deltap_{T}/p_{T}", kTH2F, {{100, 0.0f, 10}, {200, 0, 0.2}}, false); - fRegistry.add("MFTMCHMID/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {60, -5.f, -2.f}}, false); - fRegistry.add("MFTMCHMID/hEtaPhi_MatchedMCHMID", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {60, -5.f, -2.f}}, false); - fRegistry.add("MFTMCHMID/hDiffCollId", "difference in collision index;collisionId_{TTCA} - collisionId_{MP}", kTH1F, {{41, -20.5, +20.5}}, false); - fRegistry.add("MFTMCHMID/hSign", "sign;sign", kTH1F, {{3, -1.5, +1.5}}, false); - fRegistry.add("MFTMCHMID/hNclusters", "Nclusters;Nclusters", kTH1F, {{21, -0.5f, 20.5}}, false); - fRegistry.add("MFTMCHMID/hNclustersMFT", "NclustersMFT;Nclusters MFT", kTH1F, {{11, -0.5f, 10.5}}, false); - fRegistry.add("MFTMCHMID/hRatAbsorberEnd", "R at absorber end;R at absorber end (cm)", kTH1F, {{100, 0.0f, 100}}, false); - fRegistry.add("MFTMCHMID/hPDCA_Rabs", "pDCA vs. Rabs;R at absorber end (cm);p #times DCA (GeV/c #upoint cm)", kTH2F, {{100, 0, 100}, {100, 0.0f, 1000}}, false); - fRegistry.add("MFTMCHMID/hChi2", "chi2;chi2", kTH1F, {{100, 0.0f, 100}}, false); - fRegistry.add("MFTMCHMID/hChi2MFT", "chi2 MFT;chi2 MFT", kTH1F, {{100, 0.0f, 100}}, false); - fRegistry.add("MFTMCHMID/hChi2MatchMCHMID", "chi2 match MCH-MID;chi2", kTH1F, {{100, 0.0f, 100}}, false); - fRegistry.add("MFTMCHMID/hChi2MatchMCHMFT", "chi2 match MCH-MFT;chi2", kTH1F, {{100, 0.0f, 100}}, false); - fRegistry.add("MFTMCHMID/hMatchScoreMCHMFT", "match score MCH-MFT;score", kTH1F, {{100, 0.0f, 100}}, false); - fRegistry.add("MFTMCHMID/hDCAxy2D", "DCA x vs. y;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -0.5, 0.5}, {200, -0.5, +0.5}}, false); - fRegistry.add("MFTMCHMID/hDCAxy2DinSigma", "DCA x vs. y in sigma;DCA_{x} (#sigma);DCA_{y} (#sigma)", kTH2F, {{200, -10, 10}, {200, -10, +10}}, false); - fRegistry.add("MFTMCHMID/hDCAxy", "DCAxy;DCA_{xy} (cm);", kTH1F, {{100, 0, 1}}, false); - fRegistry.add("MFTMCHMID/hDCAxyinSigma", "DCAxy in sigma;DCA_{xy} (#sigma);", kTH1F, {{100, 0, 10}}, false); - fRegistry.addClone("MFTMCHMID/", "MCHMID/"); - fRegistry.add("MFTMCHMID/hDCAxResolutionvsPt", "DCA_{x} vs. p_{T};p_{T} (GeV/c);DCA_{x} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 500}}, false); - fRegistry.add("MFTMCHMID/hDCAyResolutionvsPt", "DCA_{y} vs. p_{T};p_{T} (GeV/c);DCA_{y} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 500}}, false); - fRegistry.add("MCHMID/hDCAxResolutionvsPt", "DCA_{x} vs. p_{T};p_{T} (GeV/c);DCA_{x} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 5e+5}}, false); - fRegistry.add("MCHMID/hDCAyResolutionvsPt", "DCA_{y} vs. p_{T};p_{T} (GeV/c);DCA_{y} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 5e+5}}, false); - } - - bool isSelected(const float pt, const float eta, const float rAtAbsorberEnd, const float pDCA, const float chi2, const uint8_t trackType, const float dcaXY) - { - if (pt < minPt || maxPt < pt) { - return false; - } - if (rAtAbsorberEnd < minRabs || maxRabs < rAtAbsorberEnd) { - return false; - } - if (rAtAbsorberEnd < midRabs ? pDCA > maxPDCAforSmallR : pDCA > maxPDCAforLargeR) { - return false; - } - - if (trackType == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack)) { - if (eta < minEtaGL || maxEtaGL < eta) { - return false; - } - if (maxDCAxy < dcaXY) { - return false; - } - if (chi2 < 0.f || maxChi2GL < chi2) { - return false; - } - if (rAtAbsorberEnd < minRabsGL || maxRabs < rAtAbsorberEnd) { - return false; - } - } else if (trackType == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { - if (eta < minEtaSA || maxEtaSA < eta) { - return false; - } - if (chi2 < 0.f || maxChi2SA < chi2) { - return false; - } - } else { - return false; - } - - return true; - } - - template - void fillFwdTrackTable(TCollision const& collision, TFwdTrack fwdtrack, TFwdTracks const&, TMFTTracks const&, const bool isAmbiguous) - { - if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && (fwdtrack.chi2MatchMCHMFT() > maxMatchingChi2MCHMFT || fwdtrack.chi2() > maxChi2GL)) { - return; - } // Users have to decide the best match between MFT and MCH-MID at analysis level. The same global muon is repeatedly stored. - - if (fwdtrack.chi2MatchMCHMID() < 0.f) { // this should never happen. only for protection. - return; - } - - o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon(fwdtrack, collision, propagationPoint::kToVertex); - o2::dataformats::GlobalFwdTrack propmuonAtDCA = propagateMuon(fwdtrack, collision, propagationPoint::kToDCA); - - float pt = propmuonAtPV.getPt(); - float eta = propmuonAtPV.getEta(); - float phi = propmuonAtPV.getPhi(); - float tgl = propmuonAtPV.getTgl(); - o2::math_utils::bringTo02Pi(phi); - - float cXXatDCA = propmuonAtDCA.getSigma2X(); - float cYYatDCA = propmuonAtDCA.getSigma2Y(); - float cXYatDCA = propmuonAtDCA.getSigmaXY(); - - float dcaX = propmuonAtDCA.getX() - collision.posX(); - float dcaY = propmuonAtDCA.getY() - collision.posY(); - float rAtAbsorberEnd = fwdtrack.rAtAbsorberEnd(); // this works only for GlobalMuonTrack - float dcaXY = std::sqrt(dcaX * dcaX + dcaY * dcaY); - - float dFdx = 2.f * dcaX / dcaXY; - float dFdy = 2.f * dcaY / dcaXY; - float sigma_dcaXY = std::sqrt(cXXatDCA * dFdx * dFdx + cYYatDCA * dFdy * dFdy + 2.f * cXYatDCA * dFdx * dFdy); - - float pDCA = fwdtrack.p() * dcaXY; - int nClustersMFT = 0; - float etaMatchedMCHMID = propmuonAtPV.getEta(); - float phiMatchedMCHMID = propmuonAtPV.getPhi(); - o2::math_utils::bringTo02Pi(phiMatchedMCHMID); - float x = fwdtrack.x(); - float y = fwdtrack.y(); - float z = fwdtrack.z(); - float chi2mft = 0.f; - - if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) { - const auto& mchtrack = fwdtrack.template matchMCHTrack_as(); // MCH-MID - o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToVertex); - etaMatchedMCHMID = propmuonAtPV_Matched.getEta(); - phiMatchedMCHMID = propmuonAtPV_Matched.getPhi(); - o2::math_utils::bringTo02Pi(phiMatchedMCHMID); - o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToDCA); - float dcaX_Matched = propmuonAtDCA_Matched.getX() - collision.posX(); - float dcaY_Matched = propmuonAtDCA_Matched.getY() - collision.posY(); - float dcaXY_Matched = std::sqrt(dcaX_Matched * dcaX_Matched + dcaY_Matched * dcaY_Matched); - pDCA = mchtrack.p() * dcaXY_Matched; - - const auto& mfttrack = fwdtrack.template matchMFTTrack_as(); - nClustersMFT = mfttrack.nClusters(); - chi2mft = mfttrack.chi2(); - if (refitGlobalMuon) { - eta = mfttrack.eta(); - phi = mfttrack.phi(); - o2::math_utils::bringTo02Pi(phi); - pt = propmuonAtPV_Matched.getP() * std::sin(2.f * std::atan(std::exp(-eta))); - - x = mfttrack.x(); - y = mfttrack.y(); - z = mfttrack.z(); - tgl = mfttrack.tgl(); - } - } else if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) { - o2::dataformats::GlobalFwdTrack propmuonAtRabs = propagateMuon(fwdtrack, collision, propagationPoint::kToRabs); // this is necessary only for MuonStandaloneTrack - float xAbs = propmuonAtRabs.getX(); - float yAbs = propmuonAtRabs.getY(); - rAtAbsorberEnd = std::sqrt(xAbs * xAbs + yAbs * yAbs); // Redo propagation only for muon tracks // propagation of MFT tracks alredy done in reconstruction - } else { - return; - } - - if (!isSelected(pt, eta, rAtAbsorberEnd, pDCA, fwdtrack.chi2(), fwdtrack.trackType(), dcaXY)) { - return; - } - - const auto& fwdcov = propmuonAtPV.getCovariances(); // covatiant matrix at PV - const float sigX = std::sqrt(fwdcov(0, 0)); - const float sigY = std::sqrt(fwdcov(1, 1)); - const float sigPhi = std::sqrt(fwdcov(2, 2)); - const float sigTgl = std::sqrt(fwdcov(3, 3)); - const float sig1Pt = std::sqrt(fwdcov(4, 4)); - const float rhoXY = 128.f * fwdcov(0, 1) / (sigX * sigY); - const float rhoPhiX = 128.f * fwdcov(0, 2) / (sigPhi * sigX); - const float rhoPhiY = 128.f * fwdcov(1, 2) / (sigPhi * sigY); - const float rhoTglX = 128.f * fwdcov(0, 3) / (sigTgl * sigX); - const float rhoTglY = 128.f * fwdcov(1, 3) / (sigTgl * sigY); - const float rhoTglPhi = 128.f * fwdcov(2, 3) / (sigTgl * sigPhi); - const float rho1PtX = 128.f * fwdcov(0, 4) / (sig1Pt * sigX); - const float rho1PtY = 128.f * fwdcov(1, 4) / (sig1Pt * sigY); - const float rho1PtPhi = 128.f * fwdcov(2, 4) / (sig1Pt * sigPhi); - const float rho1PtTgl = 128.f * fwdcov(3, 4) / (sig1Pt * sigTgl); - - bool isAssociatedToMPC = fwdtrack.collisionId() == collision.globalIndex(); - // LOGF(info, "isAmbiguous = %d, isAssociatedToMPC = %d, fwdtrack.globalIndex() = %d, fwdtrack.collisionId() = %d, collision.globalIndex() = %d", isAmbiguous, isAssociatedToMPC, fwdtrack.globalIndex(), fwdtrack.collisionId(), collision.globalIndex()); - - propfwdtracks( - collision.globalIndex(), fwdtrack.trackType(), - x, y, z, phi, tgl, - fwdtrack.sign() / pt, fwdtrack.nClusters(), pDCA, rAtAbsorberEnd, - fwdtrack.chi2(), fwdtrack.chi2MatchMCHMID(), fwdtrack.chi2MatchMCHMFT(), - fwdtrack.matchScoreMCHMFT(), fwdtrack.globalIndex(), fwdtrack.matchMFTTrackId(), fwdtrack.matchMCHTrackId(), - fwdtrack.mchBitMap(), fwdtrack.midBitMap(), fwdtrack.midBoards(), fwdtrack.trackTime(), fwdtrack.trackTimeRes(), dcaX, dcaY, - cXXatDCA, cYYatDCA, cXYatDCA, etaMatchedMCHMID, phiMatchedMCHMID, isAssociatedToMPC, isAmbiguous); - - propfwdtrackscov( - sigX, sigY, sigPhi, sigTgl, sig1Pt, - rhoXY, rhoPhiX, rhoPhiY, rhoTglX, rhoTglY, - rhoTglPhi, rho1PtX, rho1PtY, rho1PtPhi, rho1PtTgl); - - if (fillQAHistograms) { - fRegistry.fill(HIST("hMuonType"), fwdtrack.trackType()); - if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) { - fRegistry.fill(HIST("MFTMCHMID/hPt"), pt); - fRegistry.fill(HIST("MFTMCHMID/hRelDiffPt"), pt, sig1Pt * pt); - fRegistry.fill(HIST("MFTMCHMID/hEtaPhi"), phi, eta); - fRegistry.fill(HIST("MFTMCHMID/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); - fRegistry.fill(HIST("MFTMCHMID/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); - fRegistry.fill(HIST("MFTMCHMID/hSign"), fwdtrack.sign()); - fRegistry.fill(HIST("MFTMCHMID/hNclusters"), fwdtrack.nClusters()); - fRegistry.fill(HIST("MFTMCHMID/hNclustersMFT"), nClustersMFT); - fRegistry.fill(HIST("MFTMCHMID/hPDCA_Rabs"), rAtAbsorberEnd, pDCA); - fRegistry.fill(HIST("MFTMCHMID/hRatAbsorberEnd"), rAtAbsorberEnd); - fRegistry.fill(HIST("MFTMCHMID/hChi2"), fwdtrack.chi2()); - fRegistry.fill(HIST("MFTMCHMID/hChi2MFT"), chi2mft); - fRegistry.fill(HIST("MFTMCHMID/hChi2MatchMCHMID"), fwdtrack.chi2MatchMCHMID()); - fRegistry.fill(HIST("MFTMCHMID/hChi2MatchMCHMFT"), fwdtrack.chi2MatchMCHMFT()); - fRegistry.fill(HIST("MFTMCHMID/hMatchScoreMCHMFT"), fwdtrack.matchScoreMCHMFT()); - fRegistry.fill(HIST("MFTMCHMID/hDCAxy2D"), dcaX, dcaY); - fRegistry.fill(HIST("MFTMCHMID/hDCAxy2DinSigma"), dcaX / std::sqrt(cXXatDCA), dcaY / std::sqrt(cYYatDCA)); - fRegistry.fill(HIST("MFTMCHMID/hDCAxy"), dcaXY); - fRegistry.fill(HIST("MFTMCHMID/hDCAxyinSigma"), dcaXY / sigma_dcaXY); - fRegistry.fill(HIST("MFTMCHMID/hDCAxResolutionvsPt"), pt, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um - fRegistry.fill(HIST("MFTMCHMID/hDCAyResolutionvsPt"), pt, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um - } else if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) { - fRegistry.fill(HIST("MCHMID/hPt"), pt); - fRegistry.fill(HIST("MCHMID/hRelDiffPt"), pt, sig1Pt * pt); - fRegistry.fill(HIST("MCHMID/hEtaPhi"), phi, eta); - fRegistry.fill(HIST("MCHMID/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); - fRegistry.fill(HIST("MCHMID/hDiffCollId"), collision.globalIndex() - fwdtrack.collisionId()); - fRegistry.fill(HIST("MCHMID/hSign"), fwdtrack.sign()); - fRegistry.fill(HIST("MCHMID/hNclusters"), fwdtrack.nClusters()); - fRegistry.fill(HIST("MCHMID/hNclustersMFT"), nClustersMFT); - fRegistry.fill(HIST("MCHMID/hPDCA_Rabs"), rAtAbsorberEnd, pDCA); - fRegistry.fill(HIST("MCHMID/hRatAbsorberEnd"), rAtAbsorberEnd); - fRegistry.fill(HIST("MCHMID/hChi2"), fwdtrack.chi2()); - fRegistry.fill(HIST("MCHMID/hChi2MFT"), chi2mft); - fRegistry.fill(HIST("MCHMID/hChi2MatchMCHMID"), fwdtrack.chi2MatchMCHMID()); - fRegistry.fill(HIST("MCHMID/hChi2MatchMCHMFT"), fwdtrack.chi2MatchMCHMFT()); - fRegistry.fill(HIST("MCHMID/hMatchScoreMCHMFT"), fwdtrack.matchScoreMCHMFT()); - fRegistry.fill(HIST("MCHMID/hDCAxy2D"), dcaX, dcaY); - fRegistry.fill(HIST("MCHMID/hDCAxy2DinSigma"), dcaX / std::sqrt(cXXatDCA), dcaY / std::sqrt(cYYatDCA)); - fRegistry.fill(HIST("MCHMID/hDCAxy"), dcaXY); - fRegistry.fill(HIST("MCHMID/hDCAxyinSigma"), dcaXY / sigma_dcaXY); - fRegistry.fill(HIST("MCHMID/hDCAxResolutionvsPt"), pt, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um - fRegistry.fill(HIST("MCHMID/hDCAyResolutionvsPt"), pt, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um - } - } - } - - SliceCache cache; - PresliceUnsorted perMFTTrack = o2::aod::fwdtrack::matchMFTTrackId; - Preslice perCollision = o2::aod::fwdtrack::collisionId; - // Preslice perCollisionMFT = o2::aod::fwdtrack::collisionId; - Preslice fwdtrackIndicesPerCollision = aod::track_association::collisionId; - PresliceUnsorted fwdtrackIndicesPerFwdTrack = aod::track_association::fwdtrackId; - - void processWithoutFTTCA(aod::Collisions const& collisions, MyFwdTracks const& fwdtracks, aod::MFTTracks const& mfttracks, aod::BCsWithTimestamps const&) - { - for (const auto& collision : collisions) { - const auto& bc = collision.template bc_as(); - initCCDB(bc); - - const auto& fwdtracks_per_coll = fwdtracks.sliceBy(perCollision, collision.globalIndex()); - for (const auto& fwdtrack : fwdtracks_per_coll) { - if (fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) { - continue; - } - fillFwdTrackTable(collision, fwdtrack, fwdtracks, mfttracks, false); - } // end of fwdtrack loop - } // end of collision loop - } - PROCESS_SWITCH(FwdTrackPropagation, processWithoutFTTCA, "process without FTTCA", true); - - void processWithFTTCA(aod::Collisions const& collisions, MyFwdTracks const& fwdtracks, aod::MFTTracks const& mfttracks, aod::BCsWithTimestamps const&, aod::FwdTrackAssoc const& fwdtrackIndices) - { - std::unordered_map mapAmb; // fwdtrack.globalIndex() -> bool isAmb; - for (const auto& fwdtrack : fwdtracks) { - const auto& fwdtrackIdsPerFwdTrack = fwdtrackIndices.sliceBy(fwdtrackIndicesPerFwdTrack, fwdtrack.globalIndex()); - mapAmb[fwdtrack.globalIndex()] = fwdtrackIdsPerFwdTrack.size() > 1; - // LOGF(info, "fwdtrack.globalIndex() = %d, ntimes = %d, isAmbiguous = %d", fwdtrack.globalIndex(), fwdtrackIdsPerFwdTrack.size(), mapAmb[fwdtrack.globalIndex()]); - } // end of fwdtrack loop - - for (const auto& collision : collisions) { - const auto& bc = collision.template bc_as(); - initCCDB(bc); - - const auto& fwdtrackIdsThisCollision = fwdtrackIndices.sliceBy(fwdtrackIndicesPerCollision, collision.globalIndex()); - for (const auto& fwdtrackId : fwdtrackIdsThisCollision) { - const auto& fwdtrack = fwdtrackId.template fwdtrack_as(); - if (fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) { - continue; - } - fillFwdTrackTable(collision, fwdtrack, fwdtracks, mfttracks, mapAmb[fwdtrack.globalIndex()]); - } // end of fwdtrack loop - } // end of collision loop - mapAmb.clear(); - } - PROCESS_SWITCH(FwdTrackPropagation, processWithFTTCA, "process with FTTCA", false); -}; - -// Extends the PropagatedFwdTracks table for expression columns -struct PropagatedFwdTrackSpawner { - Spawns propFwdTracks; - Spawns propFwdTracksCov; - void init(InitContext const&) {} -}; -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"fwdtrack-propagation"}), - adaptAnalysisTask(cfgc, TaskName{"propagated-fwdtrack-spawner"}), - }; -} diff --git a/PWGEM/Dilepton/DataModel/dileptonTables.h b/PWGEM/Dilepton/DataModel/dileptonTables.h index 58710293c0f..ac688a57b98 100644 --- a/PWGEM/Dilepton/DataModel/dileptonTables.h +++ b/PWGEM/Dilepton/DataModel/dileptonTables.h @@ -553,6 +553,7 @@ DECLARE_SOA_SELF_ARRAY_INDEX_COLUMN(AmbiguousMuons, ambiguousMuons); DECLARE_SOA_COLUMN(CXXatDCA, cXXatDCA, float); //! DCAx resolution squared at DCA DECLARE_SOA_COLUMN(CYYatDCA, cYYatDCA, float); //! DCAy resolution squared at DCA DECLARE_SOA_COLUMN(CXYatDCA, cXYatDCA, float); //! correlation term of DCAx,y resolution at DCA +DECLARE_SOA_COLUMN(PtMatchedMCHMID, ptMatchedMCHMID, float); //! pt of MCH-MID track in MFT-MCH-MID track at PV DECLARE_SOA_COLUMN(EtaMatchedMCHMID, etaMatchedMCHMID, float); //! eta of MCH-MID track in MFT-MCH-MID track at PV DECLARE_SOA_COLUMN(PhiMatchedMCHMID, phiMatchedMCHMID, float); //! phi of MCH-MID track in MFT-MCH-MID track at PV DECLARE_SOA_COLUMN(IsAssociatedToMPC, isAssociatedToMPC, bool); //! is associated to most probable collision @@ -590,7 +591,7 @@ DECLARE_SOA_TABLE(EMPrimaryMuons, "AOD", "EMPRIMARYMU", //! emprimarymuon::FwdTrackId, emprimarymuon::MFTTrackId, emprimarymuon::MCHTrackId, fwdtrack::TrackType, fwdtrack::Pt, fwdtrack::Eta, fwdtrack::Phi, emprimarymuon::Sign, fwdtrack::FwdDcaX, fwdtrack::FwdDcaY, emprimarymuon::CXXatDCA, emprimarymuon::CYYatDCA, emprimarymuon::CXYatDCA, - emprimarymuon::EtaMatchedMCHMID, emprimarymuon::PhiMatchedMCHMID, + emprimarymuon::PtMatchedMCHMID, emprimarymuon::EtaMatchedMCHMID, emprimarymuon::PhiMatchedMCHMID, // fwdtrack::X, fwdtrack::Y, fwdtrack::Z, fwdtrack::Tgl, fwdtrack::NClusters, fwdtrack::PDca, fwdtrack::RAtAbsorberEnd, diff --git a/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx b/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx index 705705bb3e4..de2c7eef858 100644 --- a/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx +++ b/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx @@ -16,6 +16,7 @@ #include #include #include +#include #include "Math/Vector4D.h" #include "Math/SMatrix.h" @@ -27,7 +28,6 @@ #include "CommonConstants/PhysicsConstants.h" #include "Common/DataModel/CollisionAssociationTables.h" #include "Common/Core/TableHelper.h" -#include "Common/DataModel/PropagatedFwdTrackTables.h" #include "CCDB/BasicCCDBManager.h" #include "DataFormatsParameters/GRPMagField.h" @@ -39,6 +39,7 @@ #include "MCHTracking/TrackExtrap.h" #include "MCHTracking/TrackParam.h" #include "ReconstructionDataFormats/TrackFwd.h" +#include "Common/Core/fwdtrackUtilities.h" #include "PWGEM/Dilepton/DataModel/dileptonTables.h" @@ -47,14 +48,12 @@ using namespace o2::soa; using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::constants::physics; +using namespace o2::aod::fwdtrackutils; struct skimmerPrimaryMuon { using MyCollisions = soa::Join; using MyCollisionsWithSWT = soa::Join; - using MyPropagatedFwdTracks = soa::Join; // muon tracks are repeated. i.e. not exclusive. - using MyPropagatedFwdTrack = MyPropagatedFwdTracks::iterator; - using MyFwdTracks = soa::Join; // muon tracks are repeated. i.e. not exclusive. using MyFwdTrack = MyFwdTracks::iterator; @@ -67,41 +66,45 @@ struct skimmerPrimaryMuon { Produces emprimarymuons; Produces emprimarymuonscov; - SliceCache cache; - Preslice perCollision = o2::aod::fwdtrack::collisionId; - Preslice perCollision_mft = o2::aod::fwdtrack::collisionId; - // Configurables - Configurable fillQAHistogram{"fillQAHistogram", false, "flag to fill QA histograms"}; - // Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; - // Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; - // Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; - // Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; - Configurable minpt{"minpt", 0.2, "min pt for muon"}; - Configurable mineta{"mineta", -4.0, "eta acceptance"}; - Configurable maxeta{"maxeta", -2.5, "eta acceptance"}; - Configurable mineta_mft{"mineta_mft", -3.6, "eta acceptance"}; - Configurable maxeta_mft{"maxeta_mft", -2.5, "eta acceptance"}; + Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; + Configurable fillQAHistograms{"fillQAHistograms", false, "flag to fill QA histograms"}; + Configurable minPt{"minPt", 0.2, "min pt for muon"}; + Configurable maxPt{"maxPt", 1e+10, "max pt for muon"}; + Configurable minEtaSA{"minEtaSA", -4.0, "min. eta acceptance for MCH-MID"}; + Configurable maxEtaSA{"maxEtaSA", -2.5, "max. eta acceptance for MCH-MID"}; + Configurable minEtaGL{"minEtaGL", -3.6, "min. eta acceptance for MFT-MCH-MID"}; + Configurable maxEtaGL{"maxEtaGL", -2.5, "max. eta acceptance for MFT-MCH-MID"}; + Configurable minRabsGL{"minRabsGL", 27.6, "min. R at absorber end for global muon (min. eta = -3.6)"}; // std::tan(2.f * std::atan(std::exp(- -3.6)) ) * -505. Configurable minRabs{"minRabs", 17.6, "min. R at absorber end"}; + Configurable midRabs{"midRabs", 26.5, "middle R at absorber end for pDCA cut"}; Configurable maxRabs{"maxRabs", 89.5, "max. R at absorber end"}; - - // o2::ccdb::CcdbApi ccdbApi; - // Service ccdb; + Configurable maxDCAxy{"maxDCAxy", 1e+10, "max. DCAxy for global muons"}; + Configurable maxPDCAforLargeR{"maxPDCAforLargeR", 324.f, "max. pDCA for large R at absorber end"}; + Configurable maxPDCAforSmallR{"maxPDCAforSmallR", 594.f, "max. pDCA for small R at absorber end"}; + Configurable maxMatchingChi2MCHMFT{"maxMatchingChi2MCHMFT", 50.f, "max. chi2 for MCH-MFT matching"}; + Configurable maxChi2SA{"maxChi2SA", 1e+6, "max. chi2 for standalone muon"}; + Configurable maxChi2GL{"maxChi2GL", 50.f, "max. chi2 for global muon"}; + Configurable refitGlobalMuon{"refitGlobalMuon", true, "flag to refit global muon"}; + + o2::ccdb::CcdbApi ccdbApi; + Service ccdb; int mRunNumber; - // o2::globaltracking::MatchGlobalFwd mMatching; HistogramRegistry fRegistry{"output", {}, OutputObjHandlingPolicy::AnalysisObject, false, false}; static constexpr std::string_view muon_types[5] = {"MFTMCHMID/", "MFTMCHMIDOtherMatch/", "MFTMCH/", "MCHMID/", "MCH/"}; void init(InitContext&) { - // ccdb->setURL(ccdburl); - // ccdb->setCaching(true); - // ccdb->setLocalObjectValidityChecking(); - // ccdb->setFatalWhenNull(false); - // ccdbApi.init(ccdburl); + ccdb->setURL(ccdburl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setFatalWhenNull(false); + ccdbApi.init(ccdburl); - if (fillQAHistogram) { + if (fillQAHistograms) { addHistograms(); } mRunNumber = 0; @@ -114,186 +117,419 @@ struct skimmerPrimaryMuon { } mRunNumber = bc.runNumber(); - // std::map metadata; - // auto soreor = o2::ccdb::BasicCCDBManager::getRunDuration(ccdbApi, mRunNumber); - // auto ts = soreor.first; - // auto grpmag = ccdbApi.retrieveFromTFileAny(grpmagPath, metadata, ts); - // o2::base::Propagator::initFieldFromGRP(grpmag); - // if (!o2::base::GeometryManager::isGeometryLoaded()) { - // ccdb->get(geoPath); - // } - // o2::mch::TrackExtrap::setField(); + std::map metadata; + auto soreor = o2::ccdb::BasicCCDBManager::getRunDuration(ccdbApi, mRunNumber); + auto ts = soreor.first; + auto grpmag = ccdbApi.retrieveFromTFileAny(grpmagPath, metadata, ts); + o2::base::Propagator::initFieldFromGRP(grpmag); + if (!o2::base::GeometryManager::isGeometryLoaded()) { + ccdb->get(geoPath); + } + o2::mch::TrackExtrap::setField(); } void addHistograms() { - // for track - auto hMuonType = fRegistry.add("Track/hMuonType", "muon type", kTH1F, {{5, -0.5f, 4.5f}}); + auto hMuonType = fRegistry.add("hMuonType", "muon type", kTH1F, {{5, -0.5f, 4.5f}}, false); hMuonType->GetXaxis()->SetBinLabel(1, "MFT-MCH-MID (global muon)"); hMuonType->GetXaxis()->SetBinLabel(2, "MFT-MCH-MID (global muon other match)"); hMuonType->GetXaxis()->SetBinLabel(3, "MFT-MCH"); hMuonType->GetXaxis()->SetBinLabel(4, "MCH-MID"); hMuonType->GetXaxis()->SetBinLabel(5, "MCH standalone"); - fRegistry.add("Track/MFTMCHMID/hPt", "pT;p_{T} (GeV/c)", kTH1F, {{1000, 0.0f, 10}}, false); - fRegistry.add("Track/MFTMCHMID/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{360, 0, 2 * M_PI}, {30, -5.0f, -2.0f}}, false); - fRegistry.add("Track/MFTMCHMID/hNclusters", "Nclusters;Nclusters", kTH1F, {{21, -0.5f, 20.5}}, false); - fRegistry.add("Track/MFTMCHMID/hNclustersMFT", "NclustersMFT;Nclusters MFT", kTH1F, {{11, -0.5f, 10.5}}, false); - fRegistry.add("Track/MFTMCHMID/hRatAbsorberEnd", "R at absorber end;R at absorber end (cm)", kTH1F, {{100, 0.0f, 100}}, false); - fRegistry.add("Track/MFTMCHMID/hPDCA", "pDCA;r at absorber end (cm);p #times DCA (GeV/c #upoint cm)", kTH2F, {{100, 0, 100}, {100, 0.0f, 1000}}, false); - fRegistry.add("Track/MFTMCHMID/hChi2", "chi2;chi2", kTH1F, {{100, 0.0f, 100}}, false); - fRegistry.add("Track/MFTMCHMID/hChi2MatchMCHMID", "chi2 match MCH-MID;chi2", kTH1F, {{100, 0.0f, 100}}, false); - fRegistry.add("Track/MFTMCHMID/hChi2MatchMCHMFT", "chi2 match MCH-MFT;chi2", kTH1F, {{100, 0.0f, 100}}, false); - fRegistry.add("Track/MFTMCHMID/hDCAxy2D", "DCA xy;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -10, 10}, {200, -10, +10}}, false); - fRegistry.add("Track/MFTMCHMID/hDCAxy2DinSigma", "DCA xy;DCA_{x} (#sigma);DCA_{y} (#sigma)", kTH2F, {{200, -10, 10}, {200, -10, +10}}, false); - fRegistry.add("Track/MFTMCHMID/hDCAxResolutionvsPt", "DCA_{x} vs. p_{T,#mu};p_{T,#mu} (GeV/c);DCA_{x} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {100, 0, 100}}, false); - fRegistry.add("Track/MFTMCHMID/hDCAyResolutionvsPt", "DCA_{y} vs. p_{T,#mu};p_{T,#mu} (GeV/c);DCA_{y} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {100, 0, 100}}, false); - fRegistry.addClone("Track/MFTMCHMID/", "Track/MCHMID/"); + fRegistry.add("MFTMCHMID/hPt", "pT;p_{T} (GeV/c)", kTH1F, {{100, 0.0f, 10}}, false); + fRegistry.add("MFTMCHMID/hEtaPhi", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {60, -5.f, -2.f}}, false); + fRegistry.add("MFTMCHMID/hEtaPhi_MatchedMCHMID", "#eta vs. #varphi;#varphi (rad.);#eta", kTH2F, {{180, 0, 2 * M_PI}, {60, -5.f, -2.f}}, false); + fRegistry.add("MFTMCHMID/hDeltaPt_Pt", "#Deltap_{T}/p_{T} vs. p_{T};p_{T}^{gl} (GeV/c);(p_{T}^{sa} - p_{T}^{gl})/p_{T}^{gl}", kTH2F, {{100, 0, 10}, {200, -0.5, +0.5}}, false); + fRegistry.add("MFTMCHMID/hDeltaEta_Pt", "#Delta#eta vs. p_{T};p_{T}^{gl} (GeV/c);#Delta#eta", kTH2F, {{100, 0, 10}, {200, -0.5, +0.5}}, false); + fRegistry.add("MFTMCHMID/hDeltaPhi_Pt", "#Delta#varphi vs. p_{T};p_{T}^{gl} (GeV/c);#Delta#varphi (rad.)", kTH2F, {{100, 0, 10}, {200, -0.5, +0.5}}, false); + fRegistry.add("MFTMCHMID/hSign", "sign;sign", kTH1F, {{3, -1.5, +1.5}}, false); + fRegistry.add("MFTMCHMID/hNclusters", "Nclusters;Nclusters", kTH1F, {{21, -0.5f, 20.5}}, false); + fRegistry.add("MFTMCHMID/hNclustersMFT", "NclustersMFT;Nclusters MFT", kTH1F, {{11, -0.5f, 10.5}}, false); + fRegistry.add("MFTMCHMID/hRatAbsorberEnd", "R at absorber end;R at absorber end (cm)", kTH1F, {{100, 0.0f, 100}}, false); + fRegistry.add("MFTMCHMID/hPDCA_Rabs", "pDCA vs. Rabs;R at absorber end (cm);p #times DCA (GeV/c #upoint cm)", kTH2F, {{100, 0, 100}, {100, 0.0f, 1000}}, false); + fRegistry.add("MFTMCHMID/hChi2", "chi2;chi2", kTH1F, {{100, 0.0f, 100}}, false); + fRegistry.add("MFTMCHMID/hChi2MFT", "chi2 MFT;chi2 MFT", kTH1F, {{100, 0.0f, 100}}, false); + fRegistry.add("MFTMCHMID/hChi2MatchMCHMID", "chi2 match MCH-MID;chi2", kTH1F, {{100, 0.0f, 100}}, false); + fRegistry.add("MFTMCHMID/hChi2MatchMCHMFT", "chi2 match MCH-MFT;chi2", kTH1F, {{100, 0.0f, 100}}, false); + fRegistry.add("MFTMCHMID/hMatchScoreMCHMFT", "match score MCH-MFT;score", kTH1F, {{100, 0.0f, 100}}, false); + fRegistry.add("MFTMCHMID/hDCAxy2D", "DCA x vs. y;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -0.5, 0.5}, {200, -0.5, +0.5}}, false); + fRegistry.add("MFTMCHMID/hDCAxy2DinSigma", "DCA x vs. y in sigma;DCA_{x} (#sigma);DCA_{y} (#sigma)", kTH2F, {{200, -10, 10}, {200, -10, +10}}, false); + fRegistry.add("MFTMCHMID/hDCAxy", "DCAxy;DCA_{xy} (cm);", kTH1F, {{100, 0, 1}}, false); + fRegistry.add("MFTMCHMID/hDCAxyinSigma", "DCAxy in sigma;DCA_{xy} (#sigma);", kTH1F, {{100, 0, 10}}, false); + fRegistry.addClone("MFTMCHMID/", "MCHMID/"); + fRegistry.add("MFTMCHMID/hDCAxResolutionvsPt", "DCA_{x} vs. p_{T};p_{T} (GeV/c);DCA_{x} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 500}}, false); + fRegistry.add("MFTMCHMID/hDCAyResolutionvsPt", "DCA_{y} vs. p_{T};p_{T} (GeV/c);DCA_{y} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 500}}, false); + fRegistry.add("MFTMCHMID/hDCAxyResolutionvsPt", "DCA_{xy} vs. p_{T};p_{T} (GeV/c);DCA_{y} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 500}}, false); + fRegistry.add("MCHMID/hDCAxResolutionvsPt", "DCA_{x} vs. p_{T};p_{T} (GeV/c);DCA_{x} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 5e+5}}, false); + fRegistry.add("MCHMID/hDCAyResolutionvsPt", "DCA_{y} vs. p_{T};p_{T} (GeV/c);DCA_{y} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 5e+5}}, false); + fRegistry.add("MCHMID/hDCAxyResolutionvsPt", "DCA_{xy} vs. p_{T};p_{T} (GeV/c);DCA_{y} resolution (#mum);", kTH2F, {{100, 0, 10.f}, {500, 0, 5e+5}}, false); } - template - void fillTrackHistogram(TTrack const& track) + bool isSelected(const float pt, const float eta, const float rAtAbsorberEnd, const float pDCA, const float chi2, const uint8_t trackType, const float dcaXY) { - fRegistry.fill(HIST("Track/hMuonType"), track.trackType()); - fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hPt"), track.pt()); - fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hEtaPhi"), track.phi(), track.eta()); - fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hNclusters"), track.nClusters()); - fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hPDCA"), track.rAtAbsorberEnd(), track.pDca()); - fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hRatAbsorberEnd"), track.rAtAbsorberEnd()); - fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hChi2"), track.chi2()); - fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hChi2MatchMCHMID"), track.chi2MatchMCHMID()); - fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hChi2MatchMCHMFT"), track.chi2MatchMCHMFT()); - fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hDCAxy2D"), track.fwdDcaX(), track.fwdDcaY()); - fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hDCAxy2DinSigma"), track.fwdDcaX() / std::sqrt(track.cXX()), track.fwdDcaY() / std::sqrt(track.cYY())); - fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hDCAxResolutionvsPt"), track.pt(), std::sqrt(track.cXXatDCA()) * 1e+4); // convert cm to um - fRegistry.fill(HIST("Track/") + HIST(muon_types[mu_id]) + HIST("hDCAyResolutionvsPt"), track.pt(), std::sqrt(track.cYYatDCA()) * 1e+4); // convert cm to um + if (pt < minPt || maxPt < pt) { + return false; + } + if (rAtAbsorberEnd < minRabs || maxRabs < rAtAbsorberEnd) { + return false; + } + if (rAtAbsorberEnd < midRabs ? pDCA > maxPDCAforSmallR : pDCA > maxPDCAforLargeR) { + return false; + } + + if (trackType == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack)) { + if (eta < minEtaGL || maxEtaGL < eta) { + return false; + } + if (maxDCAxy < dcaXY) { + return false; + } + if (chi2 < 0.f || maxChi2GL < chi2) { + return false; + } + if (rAtAbsorberEnd < minRabsGL || maxRabs < rAtAbsorberEnd) { + return false; + } + } else if (trackType == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { + if (eta < minEtaSA || maxEtaSA < eta) { + return false; + } + if (chi2 < 0.f || maxChi2SA < chi2) { + return false; + } + } else { + return false; + } + + return true; } - template - void run(TCollisions const& collisions, TBCs const&, TSAMuons const& saMuons, TGlobalMuons const& glMuons, TFwdTracks const&, TMFTTracks const&) + template + void fillFwdTrackTable(TCollision const& collision, TFwdTrack fwdtrack, TFwdTracks const&, TMFTTracks const&, const bool isAmbiguous) { - for (const auto& collision : collisions) { - auto bc = collision.template foundBC_as(); - initCCDB(bc); - if (!collision.isSelected()) { - continue; - } + if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && (fwdtrack.chi2MatchMCHMFT() > maxMatchingChi2MCHMFT || fwdtrack.chi2() > maxChi2GL)) { + return; + } // Users have to decide the best match between MFT and MCH-MID at analysis level. The same global muon is repeatedly stored. - if constexpr (isTriggerAnalysis) { - if (collision.swtaliastmp_raw() == 0) { - continue; - } + if (fwdtrack.chi2MatchMCHMID() < 0.f) { // this should never happen. only for protection. + return; + } + + o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon(fwdtrack, collision, propagationPoint::kToVertex); + o2::dataformats::GlobalFwdTrack propmuonAtDCA = propagateMuon(fwdtrack, collision, propagationPoint::kToDCA); + + float pt = propmuonAtPV.getPt(); + float eta = propmuonAtPV.getEta(); + float phi = propmuonAtPV.getPhi(); + o2::math_utils::bringTo02Pi(phi); + + float cXXatDCA = propmuonAtDCA.getSigma2X(); + float cYYatDCA = propmuonAtDCA.getSigma2Y(); + float cXYatDCA = propmuonAtDCA.getSigmaXY(); + + float dcaX = propmuonAtDCA.getX() - collision.posX(); + float dcaY = propmuonAtDCA.getY() - collision.posY(); + float dcaXY = std::sqrt(dcaX * dcaX + dcaY * dcaY); + float rAtAbsorberEnd = fwdtrack.rAtAbsorberEnd(); // this works only for GlobalMuonTrack + + float det = cXXatDCA * cYYatDCA - cXYatDCA * cXYatDCA; // determinanat + float dcaXYinSigma = 999.f; + if (det < 0) { + dcaXYinSigma = 999.f; + } else { + dcaXYinSigma = std::sqrt(std::fabs((dcaX * dcaX * cYYatDCA + dcaY * dcaY * cXXatDCA - 2.f * dcaX * dcaY * cXYatDCA) / det / 2.f)); // dca xy in sigma + } + float sigma_dcaXY = dcaXY / dcaXYinSigma; + + float pDCA = fwdtrack.p() * dcaXY; + int nClustersMFT = 0; + float ptMatchedMCHMID = propmuonAtPV.getPt(); + float etaMatchedMCHMID = propmuonAtPV.getEta(); + float phiMatchedMCHMID = propmuonAtPV.getPhi(); + o2::math_utils::bringTo02Pi(phiMatchedMCHMID); + // float x = fwdtrack.x(); + // float y = fwdtrack.y(); + // float z = fwdtrack.z(); + // float tgl = fwdtrack.tgl(); + float chi2mft = 0.f; + uint64_t mftClusterSizesAndTrackFlags = 0; + + if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) { + const auto& mchtrack = fwdtrack.template matchMCHTrack_as(); // MCH-MID + o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToVertex); + ptMatchedMCHMID = propmuonAtPV_Matched.getPt(); + etaMatchedMCHMID = propmuonAtPV_Matched.getEta(); + phiMatchedMCHMID = propmuonAtPV_Matched.getPhi(); + o2::math_utils::bringTo02Pi(phiMatchedMCHMID); + o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToDCA); + float dcaX_Matched = propmuonAtDCA_Matched.getX() - collision.posX(); + float dcaY_Matched = propmuonAtDCA_Matched.getY() - collision.posY(); + float dcaXY_Matched = std::sqrt(dcaX_Matched * dcaX_Matched + dcaY_Matched * dcaY_Matched); + pDCA = mchtrack.p() * dcaXY_Matched; + + const auto& mfttrack = fwdtrack.template matchMFTTrack_as(); + nClustersMFT = mfttrack.nClusters(); + mftClusterSizesAndTrackFlags = mfttrack.mftClusterSizesAndTrackFlags(); + chi2mft = mfttrack.chi2(); + if (refitGlobalMuon) { + eta = mfttrack.eta(); + phi = mfttrack.phi(); + o2::math_utils::bringTo02Pi(phi); + pt = propmuonAtPV_Matched.getP() * std::sin(2.f * std::atan(std::exp(-eta))); + + // x = mfttrack.x(); + // y = mfttrack.y(); + // z = mfttrack.z(); + // tgl = mfttrack.tgl(); } + } else if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) { + o2::dataformats::GlobalFwdTrack propmuonAtRabs = propagateMuon(fwdtrack, collision, propagationPoint::kToRabs); // this is necessary only for MuonStandaloneTrack + float xAbs = propmuonAtRabs.getX(); + float yAbs = propmuonAtRabs.getY(); + rAtAbsorberEnd = std::sqrt(xAbs * xAbs + yAbs * yAbs); // Redo propagation only for muon tracks // propagation of MFT tracks alredy done in reconstruction + } else { + return; + } - if constexpr (isMC) { - if (!collision.has_mcCollision()) { - continue; - } + if (!isSelected(pt, eta, rAtAbsorberEnd, pDCA, fwdtrack.chi2(), fwdtrack.trackType(), dcaXY)) { + return; + } + + float dpt = (ptMatchedMCHMID - pt) / pt; + float deta = etaMatchedMCHMID - eta; + float dphi = phiMatchedMCHMID - phi; + o2::math_utils::bringToPMPi(dphi); + + bool isAssociatedToMPC = fwdtrack.collisionId() == collision.globalIndex(); + // LOGF(info, "isAmbiguous = %d, isAssociatedToMPC = %d, fwdtrack.globalIndex() = %d, fwdtrack.collisionId() = %d, collision.globalIndex() = %d", isAmbiguous, isAssociatedToMPC, fwdtrack.globalIndex(), fwdtrack.collisionId(), collision.globalIndex()); + + emprimarymuons(collision.globalIndex(), fwdtrack.globalIndex(), fwdtrack.matchMFTTrackId(), fwdtrack.matchMCHTrackId(), fwdtrack.trackType(), + pt, eta, phi, fwdtrack.sign(), dcaX, dcaY, cXXatDCA, cYYatDCA, cXYatDCA, ptMatchedMCHMID, etaMatchedMCHMID, phiMatchedMCHMID, + // x, y, z, tgl, + fwdtrack.nClusters(), pDCA, rAtAbsorberEnd, fwdtrack.chi2(), fwdtrack.chi2MatchMCHMID(), fwdtrack.chi2MatchMCHMFT(), + fwdtrack.mchBitMap(), fwdtrack.midBitMap(), fwdtrack.midBoards(), mftClusterSizesAndTrackFlags, chi2mft, isAssociatedToMPC, isAmbiguous); + + const auto& fwdcov = propmuonAtPV.getCovariances(); // covatiant matrix at PV + emprimarymuonscov( + fwdcov(0, 0), + fwdcov(0, 1), fwdcov(1, 1), + fwdcov(2, 0), fwdcov(2, 1), fwdcov(2, 2), + fwdcov(3, 0), fwdcov(3, 1), fwdcov(3, 2), fwdcov(3, 3), + fwdcov(4, 0), fwdcov(4, 1), fwdcov(4, 2), fwdcov(4, 3), fwdcov(4, 4)); + + // See definition DataFormats/Reconstruction/include/ReconstructionDataFormats/TrackFwd.h + // Covariance matrix of track parameters, ordered as follows: + // + // + // + // + // + + if (fillQAHistograms) { + fRegistry.fill(HIST("hMuonType"), fwdtrack.trackType()); + if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) { + fRegistry.fill(HIST("MFTMCHMID/hPt"), pt); + fRegistry.fill(HIST("MFTMCHMID/hEtaPhi"), phi, eta); + fRegistry.fill(HIST("MFTMCHMID/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); + fRegistry.fill(HIST("MFTMCHMID/hDeltaPt_Pt"), pt, dpt); + fRegistry.fill(HIST("MFTMCHMID/hDeltaEta_Pt"), pt, deta); + fRegistry.fill(HIST("MFTMCHMID/hDeltaPhi_Pt"), pt, dphi); + fRegistry.fill(HIST("MFTMCHMID/hSign"), fwdtrack.sign()); + fRegistry.fill(HIST("MFTMCHMID/hNclusters"), fwdtrack.nClusters()); + fRegistry.fill(HIST("MFTMCHMID/hNclustersMFT"), nClustersMFT); + fRegistry.fill(HIST("MFTMCHMID/hPDCA_Rabs"), rAtAbsorberEnd, pDCA); + fRegistry.fill(HIST("MFTMCHMID/hRatAbsorberEnd"), rAtAbsorberEnd); + fRegistry.fill(HIST("MFTMCHMID/hChi2"), fwdtrack.chi2()); + fRegistry.fill(HIST("MFTMCHMID/hChi2MFT"), chi2mft); + fRegistry.fill(HIST("MFTMCHMID/hChi2MatchMCHMID"), fwdtrack.chi2MatchMCHMID()); + fRegistry.fill(HIST("MFTMCHMID/hChi2MatchMCHMFT"), fwdtrack.chi2MatchMCHMFT()); + fRegistry.fill(HIST("MFTMCHMID/hMatchScoreMCHMFT"), fwdtrack.matchScoreMCHMFT()); + fRegistry.fill(HIST("MFTMCHMID/hDCAxy2D"), dcaX, dcaY); + fRegistry.fill(HIST("MFTMCHMID/hDCAxy2DinSigma"), dcaX / std::sqrt(cXXatDCA), dcaY / std::sqrt(cYYatDCA)); + fRegistry.fill(HIST("MFTMCHMID/hDCAxy"), dcaXY); + fRegistry.fill(HIST("MFTMCHMID/hDCAxyinSigma"), dcaXYinSigma); + fRegistry.fill(HIST("MFTMCHMID/hDCAxResolutionvsPt"), pt, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/hDCAyResolutionvsPt"), pt, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um + fRegistry.fill(HIST("MFTMCHMID/hDCAxyResolutionvsPt"), pt, sigma_dcaXY * 1e+4); // convert cm to um + } else if (fwdtrack.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) { + fRegistry.fill(HIST("MCHMID/hPt"), pt); + fRegistry.fill(HIST("MCHMID/hEtaPhi"), phi, eta); + fRegistry.fill(HIST("MCHMID/hEtaPhi_MatchedMCHMID"), phiMatchedMCHMID, etaMatchedMCHMID); + fRegistry.fill(HIST("MCHMID/hDeltaPt_Pt"), pt, dpt); + fRegistry.fill(HIST("MCHMID/hDeltaEta_Pt"), pt, deta); + fRegistry.fill(HIST("MCHMID/hDeltaPhi_Pt"), pt, dphi); + fRegistry.fill(HIST("MCHMID/hSign"), fwdtrack.sign()); + fRegistry.fill(HIST("MCHMID/hNclusters"), fwdtrack.nClusters()); + fRegistry.fill(HIST("MCHMID/hNclustersMFT"), nClustersMFT); + fRegistry.fill(HIST("MCHMID/hPDCA_Rabs"), rAtAbsorberEnd, pDCA); + fRegistry.fill(HIST("MCHMID/hRatAbsorberEnd"), rAtAbsorberEnd); + fRegistry.fill(HIST("MCHMID/hChi2"), fwdtrack.chi2()); + fRegistry.fill(HIST("MCHMID/hChi2MFT"), chi2mft); + fRegistry.fill(HIST("MCHMID/hChi2MatchMCHMID"), fwdtrack.chi2MatchMCHMID()); + fRegistry.fill(HIST("MCHMID/hChi2MatchMCHMFT"), fwdtrack.chi2MatchMCHMFT()); + fRegistry.fill(HIST("MCHMID/hMatchScoreMCHMFT"), fwdtrack.matchScoreMCHMFT()); + fRegistry.fill(HIST("MCHMID/hDCAxy2D"), dcaX, dcaY); + fRegistry.fill(HIST("MCHMID/hDCAxy2DinSigma"), dcaX / std::sqrt(cXXatDCA), dcaY / std::sqrt(cYYatDCA)); + fRegistry.fill(HIST("MCHMID/hDCAxy"), dcaXY); + fRegistry.fill(HIST("MCHMID/hDCAxyinSigma"), dcaXYinSigma); + fRegistry.fill(HIST("MCHMID/hDCAxResolutionvsPt"), pt, std::sqrt(cXXatDCA) * 1e+4); // convert cm to um + fRegistry.fill(HIST("MCHMID/hDCAyResolutionvsPt"), pt, std::sqrt(cYYatDCA) * 1e+4); // convert cm to um + fRegistry.fill(HIST("MCHMID/hDCAxyResolutionvsPt"), pt, sigma_dcaXY * 1e+4); // convert cm to um } + } + } - auto sa_muons_per_coll = saMuons.sliceByCached(o2::aod::fwdtrack::collisionId, collision.globalIndex(), cache); - auto global_muons_per_coll = glMuons.sliceByCached(o2::aod::fwdtrack::collisionId, collision.globalIndex(), cache); + SliceCache cache; - for (const auto& muon : sa_muons_per_coll) { - if (fillQAHistogram) { - fillTrackHistogram<3>(muon); - } + PresliceUnsorted perMFTTrack = o2::aod::fwdtrack::matchMFTTrackId; + Preslice perCollision = o2::aod::fwdtrack::collisionId; + Preslice fwdtrackIndicesPerCollision = aod::track_association::collisionId; + PresliceUnsorted fwdtrackIndicesPerFwdTrack = aod::track_association::fwdtrackId; - const auto& fwdtrack = muon.template fwdtrack_as(); + void processRec_SA(MyCollisions const& collisions, MyFwdTracks const& fwdtracks, aod::MFTTracks const& mfttracks, aod::BCsWithTimestamps const&) + { + for (const auto& collision : collisions) { + const auto& bc = collision.template bc_as(); + initCCDB(bc); - if constexpr (isMC) { - if (!fwdtrack.has_mcParticle()) { - continue; - } - } - emprimarymuons(collision.globalIndex(), fwdtrack.globalIndex(), -1, -1, muon.trackType(), - muon.pt(), muon.eta(), muon.phi(), muon.sign(), muon.fwdDcaX(), muon.fwdDcaY(), muon.cXXatDCA(), muon.cYYatDCA(), muon.cXYatDCA(), muon.etaMatchedMCHMID(), muon.phiMatchedMCHMID(), - // muon.x(), muon.y(), muon.z(), muon.tgl(), - muon.nClusters(), muon.pDca(), muon.rAtAbsorberEnd(), muon.chi2(), muon.chi2MatchMCHMID(), muon.chi2MatchMCHMFT(), - muon.mchBitMap(), muon.midBitMap(), muon.midBoards(), 0, 999999.f, muon.isAssociatedToMPC(), muon.isAmbiguous()); - - emprimarymuonscov( - muon.cXX(), - muon.cXY(), - muon.cYY(), - muon.cPhiX(), - muon.cPhiY(), - muon.cPhiPhi(), - muon.cTglX(), - muon.cTglY(), - muon.cTglPhi(), - muon.cTglTgl(), - muon.c1PtX(), - muon.c1PtY(), - muon.c1PtPhi(), - muon.c1PtTgl(), - muon.c1Pt21Pt2()); - - } // end of standalone muon loop - for (const auto& muon : global_muons_per_coll) { - if (fillQAHistogram) { - fillTrackHistogram<0>(muon); + const auto& fwdtracks_per_coll = fwdtracks.sliceBy(perCollision, collision.globalIndex()); + for (const auto& fwdtrack : fwdtracks_per_coll) { + if (fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) { + continue; } + fillFwdTrackTable(collision, fwdtrack, fwdtracks, mfttracks, false); + } // end of fwdtrack loop + } // end of collision loop + } + PROCESS_SWITCH(skimmerPrimaryMuon, processRec_SA, "process reconstructed info", false); - const auto& fwdtrack = muon.template fwdtrack_as(); - const auto& mfttrack = muon.template matchMFTTrack_as(); - const auto& mchtrack = muon.template matchMCHTrack_as(); + void processRec_TTCA(MyCollisions const& collisions, MyFwdTracks const& fwdtracks, aod::MFTTracks const& mfttracks, aod::BCsWithTimestamps const&, aod::FwdTrackAssoc const& fwdtrackIndices) + { + std::unordered_map mapAmb; // fwdtrack.globalIndex() -> bool isAmb; + for (const auto& fwdtrack : fwdtracks) { + const auto& fwdtrackIdsPerFwdTrack = fwdtrackIndices.sliceBy(fwdtrackIndicesPerFwdTrack, fwdtrack.globalIndex()); + mapAmb[fwdtrack.globalIndex()] = fwdtrackIdsPerFwdTrack.size() > 1; + // LOGF(info, "fwdtrack.globalIndex() = %d, ntimes = %d, isAmbiguous = %d", fwdtrack.globalIndex(), fwdtrackIdsPerFwdTrack.size(), mapAmb[fwdtrack.globalIndex()]); + } // end of fwdtrack loop - if constexpr (isMC) { - if (!fwdtrack.has_mcParticle()) { - continue; - } - } + for (const auto& collision : collisions) { + const auto& bc = collision.template bc_as(); + initCCDB(bc); - emprimarymuons(collision.globalIndex(), fwdtrack.globalIndex(), mfttrack.globalIndex(), mchtrack.globalIndex(), muon.trackType(), - muon.pt(), muon.eta(), muon.phi(), muon.sign(), muon.fwdDcaX(), muon.fwdDcaY(), muon.cXXatDCA(), muon.cYYatDCA(), muon.cXYatDCA(), muon.etaMatchedMCHMID(), muon.phiMatchedMCHMID(), - // muon.x(), muon.y(), muon.z(), muon.tgl(), - muon.nClusters(), muon.pDca(), muon.rAtAbsorberEnd(), muon.chi2(), muon.chi2MatchMCHMID(), muon.chi2MatchMCHMFT(), - muon.mchBitMap(), muon.midBitMap(), muon.midBoards(), mfttrack.mftClusterSizesAndTrackFlags(), mfttrack.chi2(), muon.isAssociatedToMPC(), muon.isAmbiguous()); - - emprimarymuonscov( - muon.cXX(), - muon.cXY(), - muon.cYY(), - muon.cPhiX(), - muon.cPhiY(), - muon.cPhiPhi(), - muon.cTglX(), - muon.cTglY(), - muon.cTglPhi(), - muon.cTglTgl(), - muon.c1PtX(), - muon.c1PtY(), - muon.c1PtPhi(), - muon.c1PtTgl(), - muon.c1Pt21Pt2()); - - } // end of global muon loop + const auto& fwdtrackIdsThisCollision = fwdtrackIndices.sliceBy(fwdtrackIndicesPerCollision, collision.globalIndex()); + for (const auto& fwdtrackId : fwdtrackIdsThisCollision) { + const auto& fwdtrack = fwdtrackId.template fwdtrack_as(); + if (fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) { + continue; + } + fillFwdTrackTable(collision, fwdtrack, fwdtracks, mfttracks, mapAmb[fwdtrack.globalIndex()]); + } // end of fwdtrack loop } // end of collision loop + mapAmb.clear(); } + PROCESS_SWITCH(skimmerPrimaryMuon, processRec_TTCA, "process reconstructed info", false); - std::map, int> map_new_sa_muon_index; // new standalone muon index + void processRec_SA_SWT(MyCollisionsWithSWT const& collisions, MyFwdTracks const& fwdtracks, aod::MFTTracks const& mfttracks, aod::BCsWithTimestamps const&) + { + for (const auto& collision : collisions) { + const auto& bc = collision.template bc_as(); + initCCDB(bc); + if (collision.swtaliastmp_raw() == 0) { + continue; + } - Partition global_muons = o2::aod::fwdtrack::trackType == uint8_t(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack); // MFT-MCH-MID - Partition sa_muons = o2::aod::fwdtrack::trackType == uint8_t(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack); // MCH-MID + const auto& fwdtracks_per_coll = fwdtracks.sliceBy(perCollision, collision.globalIndex()); + for (const auto& fwdtrack : fwdtracks_per_coll) { + if (fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) { + continue; + } + fillFwdTrackTable(collision, fwdtrack, fwdtracks, mfttracks, false); + } // end of fwdtrack loop + } // end of collision loop + } + PROCESS_SWITCH(skimmerPrimaryMuon, processRec_SA_SWT, "process reconstructed info only with standalone", false); - void processRec(MyCollisions const& collisions, aod::BCsWithTimestamps const& bcs, MyPropagatedFwdTracks const&, MyFwdTracks const& fwdtracks, aod::MFTTracks const& mfttracks) + void processRec_TTCA_SWT(MyCollisionsWithSWT const& collisions, MyFwdTracks const& fwdtracks, aod::MFTTracks const& mfttracks, aod::BCsWithTimestamps const&, aod::FwdTrackAssoc const& fwdtrackIndices) { - run(collisions, bcs, sa_muons, global_muons, fwdtracks, mfttracks); + std::unordered_map mapAmb; // fwdtrack.globalIndex() -> bool isAmb; + for (const auto& fwdtrack : fwdtracks) { + const auto& fwdtrackIdsPerFwdTrack = fwdtrackIndices.sliceBy(fwdtrackIndicesPerFwdTrack, fwdtrack.globalIndex()); + mapAmb[fwdtrack.globalIndex()] = fwdtrackIdsPerFwdTrack.size() > 1; + // LOGF(info, "fwdtrack.globalIndex() = %d, ntimes = %d, isAmbiguous = %d", fwdtrack.globalIndex(), fwdtrackIdsPerFwdTrack.size(), mapAmb[fwdtrack.globalIndex()]); + } // end of fwdtrack loop + + for (const auto& collision : collisions) { + const auto& bc = collision.template bc_as(); + initCCDB(bc); + if (collision.swtaliastmp_raw() == 0) { + continue; + } + + const auto& fwdtrackIdsThisCollision = fwdtrackIndices.sliceBy(fwdtrackIndicesPerCollision, collision.globalIndex()); + for (const auto& fwdtrackId : fwdtrackIdsThisCollision) { + const auto& fwdtrack = fwdtrackId.template fwdtrack_as(); + if (fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) { + continue; + } + fillFwdTrackTable(collision, fwdtrack, fwdtracks, mfttracks, mapAmb[fwdtrack.globalIndex()]); + } // end of fwdtrack loop + } // end of collision loop + mapAmb.clear(); } - PROCESS_SWITCH(skimmerPrimaryMuon, processRec, "process reconstructed info", true); + PROCESS_SWITCH(skimmerPrimaryMuon, processRec_TTCA_SWT, "process reconstructed info", false); - void processRec_SWT(MyCollisionsWithSWT const& collisions, aod::BCsWithTimestamps const& bcs, MyPropagatedFwdTracks const&, MyFwdTracks const& fwdtracks, aod::MFTTracks const& mfttracks) + void processMC_SA(soa::Join const& collisions, MyFwdTracksMC const& fwdtracks, MFTTracksMC const& mfttracks, aod::BCsWithTimestamps const&) { - run(collisions, bcs, sa_muons, global_muons, fwdtracks, mfttracks); + for (const auto& collision : collisions) { + const auto& bc = collision.template bc_as(); + initCCDB(bc); + if (!collision.has_mcCollision()) { + continue; + } + + const auto& fwdtracks_per_coll = fwdtracks.sliceBy(perCollision, collision.globalIndex()); + for (const auto& fwdtrack : fwdtracks_per_coll) { + if (!fwdtrack.has_mcParticle()) { + continue; + } + if (fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) { + continue; + } + fillFwdTrackTable(collision, fwdtrack, fwdtracks, mfttracks, false); + } // end of fwdtrack loop + } // end of collision loop } - PROCESS_SWITCH(skimmerPrimaryMuon, processRec_SWT, "process reconstructed info only with standalone", false); + PROCESS_SWITCH(skimmerPrimaryMuon, processMC_SA, "process reconstructed and MC info", false); - void processMC(soa::Join const& collisions, aod::BCsWithTimestamps const& bcs, MyPropagatedFwdTracks const&, MyFwdTracksMC const& fwdtracks, MFTTracksMC const& mfttracks) + void processMC_TTCA(soa::Join const& collisions, MyFwdTracksMC const& fwdtracks, MFTTracksMC const& mfttracks, aod::BCsWithTimestamps const&, aod::FwdTrackAssoc const& fwdtrackIndices) { - run(collisions, bcs, sa_muons, global_muons, fwdtracks, mfttracks); + std::unordered_map mapAmb; // fwdtrack.globalIndex() -> bool isAmb; + for (const auto& fwdtrack : fwdtracks) { + const auto& fwdtrackIdsPerFwdTrack = fwdtrackIndices.sliceBy(fwdtrackIndicesPerFwdTrack, fwdtrack.globalIndex()); + mapAmb[fwdtrack.globalIndex()] = fwdtrackIdsPerFwdTrack.size() > 1; + // LOGF(info, "fwdtrack.globalIndex() = %d, ntimes = %d, isAmbiguous = %d", fwdtrack.globalIndex(), fwdtrackIdsPerFwdTrack.size(), mapAmb[fwdtrack.globalIndex()]); + } // end of fwdtrack loop + + for (const auto& collision : collisions) { + const auto& bc = collision.template bc_as(); + initCCDB(bc); + + const auto& fwdtrackIdsThisCollision = fwdtrackIndices.sliceBy(fwdtrackIndicesPerCollision, collision.globalIndex()); + for (const auto& fwdtrackId : fwdtrackIdsThisCollision) { + const auto& fwdtrack = fwdtrackId.template fwdtrack_as(); + if (fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) { + continue; + } + fillFwdTrackTable(collision, fwdtrack, fwdtracks, mfttracks, mapAmb[fwdtrack.globalIndex()]); + } // end of fwdtrack loop + } // end of collision loop + mapAmb.clear(); } - PROCESS_SWITCH(skimmerPrimaryMuon, processMC, "process reconstructed and MC info", false); + PROCESS_SWITCH(skimmerPrimaryMuon, processMC_TTCA, "process reconstructed and MC info", false); + + void processDummy(aod::Collisions const&) {} + PROCESS_SWITCH(skimmerPrimaryMuon, processDummy, "process dummy", true); }; struct associateAmbiguousMuon { Produces em_amb_muon_ids; diff --git a/PWGEM/Dilepton/Tasks/matchingMFT.cxx b/PWGEM/Dilepton/Tasks/matchingMFT.cxx index 9429b7b8063..0a9ee91a4c0 100644 --- a/PWGEM/Dilepton/Tasks/matchingMFT.cxx +++ b/PWGEM/Dilepton/Tasks/matchingMFT.cxx @@ -34,7 +34,6 @@ #include "ReconstructionDataFormats/TrackFwd.h" #include "Common/DataModel/CollisionAssociationTables.h" -#include "Common/DataModel/PropagatedFwdTrackTables.h" #include "Common/Core/fwdtrackUtilities.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Multiplicity.h" @@ -355,19 +354,6 @@ struct matchingMFT { } float sigma_dcaXY = dcaXY / dcaXYinSigma; - // o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToVertex); - // float ptMatchedMCHMID = propmuonAtPV_Matched.getPt(); - // float etaMatchedMCHMID = propmuonAtPV_Matched.getEta(); - // float phiMatchedMCHMID = propmuonAtPV_Matched.getPhi(); - // o2::math_utils::bringTo02Pi(phiMatchedMCHMID); - // float dpt = (ptMatchedMCHMID - pt) / pt; - // float deta = etaMatchedMCHMID - eta; - // float dphi = phiMatchedMCHMID - phi; - // o2::math_utils::bringToPMPi(dphi); - // if (std::sqrt(std::pow(deta / maxDEta, 2) + std::pow(dphi / maxDPhi, 2)) > 1.f || std::fabs(dpt) > maxRelDPt) { - // return; - // } - o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToDCA); float dcaX_Matched = propmuonAtDCA_Matched.getX() - collision.posX(); float dcaY_Matched = propmuonAtDCA_Matched.getY() - collision.posY(); From 9cb50c77dc54bff1e7472a5e7c9ae80e0e0444b8 Mon Sep 17 00:00:00 2001 From: omvazque Date: Tue, 20 May 2025 02:23:54 -0500 Subject: [PATCH 1335/1650] [PWGLF] CCDB: global call for fMeanNch and fSigmaNch (#11257) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 31 ++++++++++++-------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index 36a08f4a72f..53948f357af 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -156,6 +156,9 @@ struct UccZdc { HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; Service ccdb; + TF1* fMeanNch = nullptr; + TF1* fSigmaNch = nullptr; + void init(InitContext const&) { // define axes you want to use @@ -288,6 +291,21 @@ struct UccZdc { // This avoids that users can replace objects **while** a train is running int64_t now = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); ccdb->setCreatedNotAfter(now); + fMeanNch = ccdb->getForTimeStamp(paTHmeanNch.value, now); + fSigmaNch = ccdb->getForTimeStamp(paTHsigmaNch.value, now); + if (!fMeanNch) { + LOGF(fatal, "fMeanNch object not found!"); + } + if (!fSigmaNch) { + LOGF(fatal, "fSigmaNch object not found!"); + } + + LOG(info) << "\tnow=" << now; + LOG(info) << "\tapplyEff=" << applyEff.value; + LOG(info) << "\tpaTH=" << paTH.value; + LOG(info) << "\tuseMidRapNchSel=" << useMidRapNchSel.value; + LOG(info) << "\tpaTHmeanNch=" << paTHmeanNch.value; + LOG(info) << "\tpaTHsigmaNch=" << paTHsigmaNch.value; } template @@ -461,12 +479,6 @@ struct UccZdc { // Nch-based selection if (useMidRapNchSel) { - auto fMeanNch = ccdb->getForRun(paTHmeanNch.value, foundBC.runNumber()); - auto fSigmaNch = ccdb->getForRun(paTHsigmaNch.value, foundBC.runNumber()); - if (!fMeanNch || !fSigmaNch) { - return; - } - const double meanNch{fMeanNch->Eval(normT0M)}; const double sigmaNch{fSigmaNch->Eval(normT0M)}; const double nSigmaSelection{nSigmaNchCut * sigmaNch}; @@ -605,13 +617,8 @@ struct UccZdc { glbTracks++; } + // Nch-based selection if (useMidRapNchSel) { - auto fMeanNch = ccdb->getForRun(paTHmeanNch.value, foundBC.runNumber()); - auto fSigmaNch = ccdb->getForRun(paTHsigmaNch.value, foundBC.runNumber()); - if (!fMeanNch || !fSigmaNch) { - return; - } - const double meanNch{fMeanNch->Eval(normT0M)}; const double sigmaNch{fSigmaNch->Eval(normT0M)}; const double nSigmaSelection{nSigmaNchCut * sigmaNch}; From e07c94783b99af91a1e013c3d2cdba95f2acaa82 Mon Sep 17 00:00:00 2001 From: Oleksii Lubynets Date: Tue, 20 May 2025 10:05:57 +0200 Subject: [PATCH 1336/1650] [PWGHF] HF invariant mass fitter: code cleaning and minor enhancement (#11242) Co-authored-by: ALICE Action Bot --- PWGHF/D2H/Macros/HFInvMassFitter.cxx | 379 +++++++++++------- PWGHF/D2H/Macros/HFInvMassFitter.h | 68 ++-- PWGHF/D2H/Macros/config_massfitter.json | 259 ++++++------ PWGHF/D2H/Macros/runMassFitter.C | 508 ++++++++++++------------ 4 files changed, 634 insertions(+), 580 deletions(-) diff --git a/PWGHF/D2H/Macros/HFInvMassFitter.cxx b/PWGHF/D2H/Macros/HFInvMassFitter.cxx index 091b5a6f943..b29661d4b1b 100644 --- a/PWGHF/D2H/Macros/HFInvMassFitter.cxx +++ b/PWGHF/D2H/Macros/HFInvMassFitter.cxx @@ -19,17 +19,24 @@ #include "HFInvMassFitter.h" +#include +#include + #include -#include #include #include -#include #include #include #include +#include +#include +#include +#include +#include +#include +#include using namespace RooFit; -using namespace std; ClassImp(HFInvMassFitter); @@ -39,12 +46,11 @@ HFInvMassFitter::HFInvMassFitter() : TNamed(), mMinMass(0), mMaxMass(5), mTypeOfBkgPdf(Expo), - mMassParticle(1.864), + mMassParticle(TDatabasePDG::Instance()->GetParticle("D0")->Mass()), mTypeOfSgnPdf(SingleGaus), mTypeOfReflPdf(1), mMass(1.865), mSecMass(1.969), - mMassErr(0.), mSigmaSgn(0.012), mSecSigma(0.006), mNSigmaForSidebands(4.), @@ -94,76 +100,79 @@ HFInvMassFitter::HFInvMassFitter() : TNamed(), mReflOnlyFrame(0x0), mResidualFrame(0x0), mWorkspace(0x0), - mHistoTemplateRefl(0x0) + mHistoTemplateRefl(0x0), + mDrawBgPrefit(kFALSE), + mHighlightPeakRegion(kFALSE) { // default constructor } -HFInvMassFitter::HFInvMassFitter(const TH1F* histoToFit, Double_t minValue, Double_t maxValue, Int_t fitTypeBkg, Int_t fitTypeSgn) : TNamed(), - mHistoInvMass(0x0), - mFitOption("L,E"), - mMinMass(minValue), - mMaxMass(maxValue), - mTypeOfBkgPdf(fitTypeBkg), - mMassParticle(1.864), - mTypeOfSgnPdf(fitTypeSgn), - mTypeOfReflPdf(1), - mMass(1.865), - mSecMass(1.969), - mMassErr(0.), - mSigmaSgn(0.012), - mSecSigma(0.006), - mNSigmaForSidebands(3.), - mNSigmaForSgn(3.), - mSigmaSgnErr(0.), - mSigmaSgnDoubleGaus(0.012), - mFixedMean(kFALSE), - mBoundMean(kFALSE), - mBoundReflMean(kFALSE), - mRooMeanSgn(0x0), - mRooSigmaSgn(0x0), - mMassLowLimit(0), - mMassUpLimit(0), - mMassReflLowLimit(0), - mMassReflUpLimit(0), - mFixedSigma(kFALSE), - mFixedSigmaDoubleGaus(kFALSE), - mBoundSigma(kFALSE), - mSigmaValue(0.012), - mParamSgn(0.1), - mFracDoubleGaus(0.2), - mFixedRawYield(-1.), - mFixedFracDoubleGaus(kFALSE), - mRatioDoubleGausSigma(0.), - mFixedRatioDoubleGausSigma(kFALSE), - mReflOverSgn(0), - mEnableReflections(kFALSE), - mRawYield(0), - mRawYieldErr(0), - mBkgYield(0), - mBkgYieldErr(0), - mSignificance(0), - mSignificanceErr(0), - mChiSquareOverNdf(0), - mSgnPdf(0x0), - mBkgPdf(0x0), - mReflPdf(0x0), - mIntegralHisto(0), - mIntegralBkg(0), - mIntegralSgn(0), - mRooNSgn(0x0), - mRooNBkg(0x0), - mRooNRefl(0x0), - mTotalPdf(0x0), - mInvMassFrame(0x0), - mReflFrame(0x0), - mReflOnlyFrame(0x0), - mResidualFrame(0x0), - mWorkspace(0x0), - mHistoTemplateRefl(0x0) +HFInvMassFitter::HFInvMassFitter(const TH1* histoToFit, Double_t minValue, Double_t maxValue, Int_t fitTypeBkg, Int_t fitTypeSgn) : TNamed(), + mHistoInvMass(0x0), + mFitOption("L,E"), + mMinMass(minValue), + mMaxMass(maxValue), + mTypeOfBkgPdf(fitTypeBkg), + mMassParticle(TDatabasePDG::Instance()->GetParticle("D0")->Mass()), + mTypeOfSgnPdf(fitTypeSgn), + mTypeOfReflPdf(1), + mMass(1.865), + mSecMass(1.969), + mSigmaSgn(0.012), + mSecSigma(0.006), + mNSigmaForSidebands(3.), + mNSigmaForSgn(3.), + mSigmaSgnErr(0.), + mSigmaSgnDoubleGaus(0.012), + mFixedMean(kFALSE), + mBoundMean(kFALSE), + mBoundReflMean(kFALSE), + mRooMeanSgn(0x0), + mRooSigmaSgn(0x0), + mMassLowLimit(0), + mMassUpLimit(0), + mMassReflLowLimit(0), + mMassReflUpLimit(0), + mFixedSigma(kFALSE), + mFixedSigmaDoubleGaus(kFALSE), + mBoundSigma(kFALSE), + mSigmaValue(0.012), + mParamSgn(0.1), + mFracDoubleGaus(0.2), + mFixedRawYield(-1.), + mFixedFracDoubleGaus(kFALSE), + mRatioDoubleGausSigma(0.), + mFixedRatioDoubleGausSigma(kFALSE), + mReflOverSgn(0), + mEnableReflections(kFALSE), + mRawYield(0), + mRawYieldErr(0), + mBkgYield(0), + mBkgYieldErr(0), + mSignificance(0), + mSignificanceErr(0), + mChiSquareOverNdf(0), + mSgnPdf(0x0), + mBkgPdf(0x0), + mReflPdf(0x0), + mIntegralHisto(0), + mIntegralBkg(0), + mIntegralSgn(0), + mRooNSgn(0x0), + mRooNBkg(0x0), + mRooNRefl(0x0), + mTotalPdf(0x0), + mInvMassFrame(0x0), + mReflFrame(0x0), + mReflOnlyFrame(0x0), + mResidualFrame(0x0), + mWorkspace(0x0), + mHistoTemplateRefl(0x0), + mDrawBgPrefit(kFALSE), + mHighlightPeakRegion(kFALSE) { // standard constructor - mHistoInvMass = reinterpret_cast(histoToFit->Clone(histoToFit->GetTitle())); + mHistoInvMass = dynamic_cast(histoToFit->Clone(histoToFit->GetTitle())); mHistoInvMass->SetDirectory(0); } @@ -189,7 +198,7 @@ HFInvMassFitter::~HFInvMassFitter() delete mWorkspace; } -void HFInvMassFitter::doFit(Bool_t draw) +void HFInvMassFitter::doFit() { mIntegralHisto = mHistoInvMass->Integral(mHistoInvMass->FindBin(mMinMass), mHistoInvMass->FindBin(mMaxMass)); mWorkspace = new RooWorkspace("mWorkspace"); @@ -197,10 +206,10 @@ void HFInvMassFitter::doFit(Bool_t draw) RooRealVar* mass = mWorkspace->var("mass"); RooDataHist dataHistogram("dataHistogram", "data", *mass, Import(*mHistoInvMass)); - if (mTypeOfBkgPdf == 6) { // MC + if (mTypeOfBkgPdf == NoBkg) { // MC mass->setRange("signal", mMass - 3. * mSigmaSgn, mMass + 3. * mSigmaSgn); } else { - if (mTypeOfSgnPdf == 3) { // Second Peak fit range + if (mTypeOfSgnPdf == GausSec) { // Second Peak fit range mass->setRange("SBL", mMinMass, mMass - mNSigmaForSidebands * mSigmaSgn); mass->setRange("SBR", mMass + mNSigmaForSidebands * mSigmaSgn, mSecMass - mNSigmaForSidebands * mSecSigma); mass->setRange("SEC", mSecMass + mNSigmaForSidebands * mSecSigma, mMaxMass); @@ -221,8 +230,8 @@ void HFInvMassFitter::doFit(Bool_t draw) RooAbsPdf* bkgPdf = createBackgroundFitFunction(mWorkspace); // Create background pdf RooAbsPdf* sgnPdf = createSignalFitFunction(mWorkspace); // Create signal pdf - // fir MC or Data - if (mTypeOfBkgPdf == 6) { // MC + // fit MC or Data + if (mTypeOfBkgPdf == NoBkg) { // MC mRooNSgn = new RooRealVar("mRooNSig", "number of signal", 0.3 * mIntegralHisto, 0., 1.2 * mIntegralHisto); // signal yield mTotalPdf = new RooAddPdf("mMCFunc", "MC fit function", RooArgList(*sgnPdf), RooArgList(*mRooNSgn)); // create total pdf if (!strcmp(mFitOption.Data(), "Chi2")) { @@ -230,13 +239,13 @@ void HFInvMassFitter::doFit(Bool_t draw) } else { mTotalPdf->fitTo(dataHistogram, Range("signal")); } - RooAbsReal* signalIntergralMc = mTotalPdf->createIntegral(*mass, NormSet(*mass), Range("signal")); // sig yield from fit - mIntegralSgn = signalIntergralMc->getValV(); + RooAbsReal* signalIntegralMc = mTotalPdf->createIntegral(*mass, NormSet(*mass), Range("signal")); // sig yield from fit + mIntegralSgn = signalIntegralMc->getValV(); calculateSignal(mRawYield, mRawYieldErr); // calculate signal and signal error mTotalPdf->plotOn(mInvMassFrame, Name("Tot_c")); // plot total function } else { // data mBkgPdf = new RooAddPdf("mBkgPdf", "background fit function", RooArgList(*bkgPdf), RooArgList(*mRooNBkg)); - if (mTypeOfSgnPdf == 3) { // two peak fit + if (mTypeOfSgnPdf == GausSec) { // two peak fit if (!strcmp(mFitOption.Data(), "Chi2")) { mBkgPdf->chi2FitTo(dataHistogram, Range("SBL,SBR,SEC"), Save()); } else { @@ -249,13 +258,19 @@ void HFInvMassFitter::doFit(Bool_t draw) mBkgPdf->fitTo(dataHistogram, Range("SBL,SBR"), Save()); } } + RooAbsPdf* mBkgPdfPrefit{nullptr}; + if (mDrawBgPrefit) { + mBkgPdfPrefit = dynamic_cast(mBkgPdf->Clone()); + mBkgPdfPrefit->plotOn(mInvMassFrame, Range("full"), Name("Bkg_c_prefit"), LineColor(kGray)); + delete mBkgPdfPrefit; + } // estimate signal yield RooAbsReal* bkgIntegral = mBkgPdf->createIntegral(*mass, NormSet(*mass), Range("bkg")); // bkg integral - mIntegralBkg = bkgIntegral->getValV(); + mIntegralBkg = bkgIntegral->getValV(); // fraction of BG's integral in "bkg" range out of that in "full" range (which is 1 by construction). Not an absolute value. Double_t estimatedSignal; - checkForSignal(estimatedSignal); - calculateBackground(mBkgYield, mBkgYieldErr); + checkForSignal(estimatedSignal); // SIG's absolute integral in "bkg" range + calculateBackground(mBkgYield, mBkgYieldErr); // BG's absolute integral in "bkg" range mRooNSgn = new RooRealVar("mNSgn", "number of signal", 0.3 * estimatedSignal, 0., 1.2 * estimatedSignal); // estimated signal yield if (mFixedRawYield > 0) { @@ -309,15 +324,14 @@ void HFInvMassFitter::doFit(Bool_t draw) mTotalPdf->fitTo(dataHistogram); } plotBkg(mTotalPdf); - mTotalPdf->plotOn(mInvMassFrame, Components("mReflFuncDoubleGaus"), Name("refl_c"), LineColor(kGreen)); mTotalPdf->plotOn(mInvMassFrame, Name("Tot_c"), LineColor(kBlue)); - mChiSquareOverNdf = mInvMassFrame->chiSquare("Tot_c", "data_c"); // calculate refuced chi2 / DNF + mSgnPdf->plotOn(mInvMassFrame, Normalization(1.0, RooAbsReal::RelativeExpected), DrawOption("F"), FillColor(TColor::GetColorTransparent(kBlue, 0.2)), VLines()); + mChiSquareOverNdf = mInvMassFrame->chiSquare("Tot_c", "data_c"); // calculate reduced chi2 / DNF // plot residual distribution mResidualFrame = mass->frame(Title("Residual Distribution")); RooHist* residualHistogram = mInvMassFrame->residHist("data_c", "Bkg_c"); mResidualFrame->addPlotable(residualHistogram, "P"); mSgnPdf->plotOn(mResidualFrame, Normalization(1.0, RooAbsReal::RelativeExpected), LineColor(kBlue)); - mTotalPdf->plotOn(mResidualFrame, Components(*mSgnPdf), Normalization(1.0, RooAbsReal::RelativeExpected), LineColor(kBlue)); } mass->setRange("bkgForSignificance", mRooMeanSgn->getVal() - mNSigmaForSgn * mRooSigmaSgn->getVal(), mRooMeanSgn->getVal() + mNSigmaForSgn * mRooSigmaSgn->getVal()); bkgIntegral = mBkgPdf->createIntegral(*mass, NormSet(*mass), Range("bkgForSignificance")); @@ -327,51 +341,59 @@ void HFInvMassFitter::doFit(Bool_t draw) RooAbsReal* sgnIntegral = mSgnPdf->createIntegral(*mass, NormSet(*mass), Range("signal")); mIntegralSgn = sgnIntegral->getValV(); calculateSignal(mRawYield, mRawYieldErr); + countSignal(mRawYieldCounted, mRawYieldCountedErr); calculateSignificance(mSignificance, mSignificanceErr); } } -void HFInvMassFitter::fillWorkspace(RooWorkspace& workspace) +void HFInvMassFitter::fillWorkspace(RooWorkspace& workspace) const { // Declare observable variable - RooRealVar mass("mass", "mass", mMinMass, mMaxMass, "GeV/c"); + RooRealVar mass("mass", "mass", mMinMass, mMaxMass, "GeV/c^{2}"); // bkg expo RooRealVar tau("tau", "tau", -1, -5., 5.); RooAbsPdf* bkgFuncExpo = new RooExponential("bkgFuncExpo", "background fit function", mass, tau); workspace.import(*bkgFuncExpo); + delete bkgFuncExpo; // bkg poly1 - RooRealVar PolyParam0("PolyParam0", "Parameter of Poly function", 0.5, -5., 5.); - RooRealVar PolyParam1("PolyParam1", "Parameter of Poly function", 0.2, -5., 5.); - RooAbsPdf* bkgFuncPoly1 = new RooPolynomial("bkgFuncPoly1", "background fit function", mass, RooArgSet(PolyParam0, PolyParam1)); + RooRealVar polyParam0("polyParam0", "Parameter of Poly function", 0.5, -5., 5.); + RooRealVar polyParam1("polyParam1", "Parameter of Poly function", 0.2, -5., 5.); + RooAbsPdf* bkgFuncPoly1 = new RooPolynomial("bkgFuncPoly1", "background fit function", mass, RooArgSet(polyParam0, polyParam1)); workspace.import(*bkgFuncPoly1); + delete bkgFuncPoly1; // bkg poly2 - RooRealVar PolyParam2("PolyParam2", "Parameter of Poly function", 0.2, -5., 5.); - RooAbsPdf* bkgFuncPoly2 = new RooPolynomial("bkgFuncPoly2", "background fit function", mass, RooArgSet(PolyParam0, PolyParam1, PolyParam2)); + RooRealVar polyParam2("polyParam2", "Parameter of Poly function", 0.2, -5., 5.); + RooAbsPdf* bkgFuncPoly2 = new RooPolynomial("bkgFuncPoly2", "background fit function", mass, RooArgSet(polyParam0, polyParam1, polyParam2)); workspace.import(*bkgFuncPoly2); + delete bkgFuncPoly2; // bkg poly3 - RooRealVar PolyParam3("PolyParam3", "Parameter of Poly function", 0.2, -1., 1.); - RooAbsPdf* bkgFuncPoly3 = new RooPolynomial("bkgFuncPoly3", "background pdf", mass, RooArgSet(PolyParam0, PolyParam1, PolyParam2, PolyParam3)); + RooRealVar polyParam3("polyParam3", "Parameter of Poly function", 0.2, -1., 1.); + RooAbsPdf* bkgFuncPoly3 = new RooPolynomial("bkgFuncPoly3", "background pdf", mass, RooArgSet(polyParam0, polyParam1, polyParam2, polyParam3)); workspace.import(*bkgFuncPoly3); + delete bkgFuncPoly3; // bkg power law - RooRealVar PowParam1("PowParam1", "Parameter of Pow function", 0.13957); - RooRealVar PowParam2("PowParam2", "Parameter of Pow function", 1., -10, 10); - RooAbsPdf* bkgFuncPow = new RooGenericPdf("bkgFuncPow", "bkgFuncPow", "(mass-PowParam1)^PowParam2", RooArgSet(mass, PowParam1, PowParam2)); + RooRealVar powParam1("powParam1", "Parameter of Pow function", TDatabasePDG::Instance()->GetParticle("pi+")->Mass()); + RooRealVar powParam2("powParam2", "Parameter of Pow function", 1., -10, 10); + RooAbsPdf* bkgFuncPow = new RooGenericPdf("bkgFuncPow", "bkgFuncPow", "(mass-powParam1)^powParam2", RooArgSet(mass, powParam1, powParam2)); workspace.import(*bkgFuncPow); + delete bkgFuncPow; // pow * exp - RooRealVar PowExpoParam1("PowExpoParam1", "Parameter of PowExpo function", 1 / 2); - RooRealVar PowExpoParam2("PowExpoParam2", "Parameter of PowExpo function", 1, -10, 10); - RooRealVar massPi("massPi", "mass of pion", 0.13957); - RooFormulaVar PowExpoParam3("PowExpoParam3", "PowExpoParam1 + 1", RooArgList(PowExpoParam1)); - RooFormulaVar PowExpoParam4("PowExpoParam4", "1./PowExpoParam2", RooArgList(PowExpoParam2)); - RooAbsPdf* bkgFuncPowExpo = new RooGamma("bkgFuncPowExpo", "background pdf", mass, PowExpoParam3, PowExpoParam4, massPi); + RooRealVar powExpoParam1("powExpoParam1", "Parameter of PowExpo function", 1 / 2); + RooRealVar powExpoParam2("powExpoParam2", "Parameter of PowExpo function", 1, -10, 10); + RooRealVar massPi("massPi", "mass of pion", TDatabasePDG::Instance()->GetParticle("pi+")->Mass()); + RooFormulaVar powExpoParam3("powExpoParam3", "powExpoParam1 + 1", RooArgList(powExpoParam1)); + RooFormulaVar powExpoParam4("powExpoParam4", "1./powExpoParam2", RooArgList(powExpoParam2)); + RooAbsPdf* bkgFuncPowExpo = new RooGamma("bkgFuncPowExpo", "background pdf", mass, powExpoParam3, powExpoParam4, massPi); workspace.import(*bkgFuncPowExpo); + delete bkgFuncPowExpo; + // signal pdf - RooRealVar mean("mean", "mean for signal fit", mMass, 1.86, 1.87); + RooRealVar mean("mean", "mean for signal fit", mMass, 0, 5); if (mBoundMean) { mean.setMax(mMassUpLimit); mean.setMin(mMassLowLimit); } - // signal Guassian + // signal Gaussian if (mFixedMean) { mean.setVal(mMass); mean.setConstant(kTRUE); @@ -387,7 +409,8 @@ void HFInvMassFitter::fillWorkspace(RooWorkspace& workspace) } RooAbsPdf* sgnFuncGaus = new RooGaussian("sgnFuncGaus", "signal pdf", mass, mean, sigma); workspace.import(*sgnFuncGaus); - // signal double Gaussianaa + delete sgnFuncGaus; + // signal double Gaussian RooRealVar sigmaDoubleGaus("sigmaDoubleGaus", "sigma2Gaus", mSigmaSgn, mSigmaSgn - 0.01, mSigmaSgn + 0.01); if (mBoundSigma) { sigmaDoubleGaus.setMax(mSigmaSgn * (1 + mParamSgn)); @@ -410,6 +433,7 @@ void HFInvMassFitter::fillWorkspace(RooWorkspace& workspace) } RooAbsPdf* sgnFuncDoubleGaus = new RooAddPdf("sgnFuncDoubleGaus", "signal pdf", RooArgList(gaus1, gaus2), fracDoubleGaus); workspace.import(*sgnFuncDoubleGaus); + delete sgnFuncDoubleGaus; // double Gaussian ratio RooRealVar ratio("ratio", "ratio of sigma12", mRatioDoubleGausSigma, 0, 10); if (mFixedSigma) { @@ -434,6 +458,7 @@ void HFInvMassFitter::fillWorkspace(RooWorkspace& workspace) } RooAbsPdf* sgnFuncGausRatio = new RooAddPdf("sgnFuncGausRatio", "signal pdf", RooArgList(gausRatio1, gausRatio2), fracDoubleGausRatio); workspace.import(*sgnFuncGausRatio); + delete sgnFuncGausRatio; // double peak for Ds RooRealVar meanSec("meanSec", "mean for second peak fit", mSecMass, mMinMass, mMaxMass); RooRealVar sigmaSec("sigmaSec", "sigmaSec", mSecSigma, mSecSigma - 0.005, mSecSigma + 0.01); @@ -458,6 +483,7 @@ void HFInvMassFitter::fillWorkspace(RooWorkspace& workspace) RooRealVar fracSec("fracSec", "frac of two peak", 0.5, 0, 1.); RooAbsPdf* sgnFuncDoublePeak = new RooAddPdf("sgnFuncDoublePeak", "signal pdf", RooArgList(gausSec1, gausSec2), fracSec); workspace.import(*sgnFuncDoublePeak); + delete sgnFuncDoublePeak; // reflection Gaussian RooRealVar meanRefl("meanRefl", "mean for reflection", mMass, 0.0, mMass + 0.05); if (mBoundReflMean) { @@ -467,6 +493,7 @@ void HFInvMassFitter::fillWorkspace(RooWorkspace& workspace) RooRealVar sigmaRefl("sigmaRefl", "sigma for reflection", 0.012, 0, 0.25); RooAbsPdf* reflFuncGaus = new RooGaussian("reflFuncGaus", "reflection pdf", mass, meanRefl, sigmaRefl); workspace.import(*reflFuncGaus); + delete reflFuncGaus; // reflection double Gaussian RooRealVar meanReflDoubleGaus("meanReflDoubleGaus", "mean for reflection double gaussian", mMass, 0.0, mMass + 0.05); if (mBoundReflMean) { @@ -479,19 +506,22 @@ void HFInvMassFitter::fillWorkspace(RooWorkspace& workspace) RooRealVar fracRefl("fracRefl", "frac of two gauss", 0.5, 0, 1.); RooAbsPdf* reflFuncDoubleGaus = new RooAddPdf("reflFuncDoubleGaus", "reflection pdf", RooArgList(gausRefl1, gausRefl2), fracRefl); workspace.import(*reflFuncDoubleGaus); + delete reflFuncDoubleGaus; // reflection poly3 - RooRealVar PolyReflParam0("PolyReflParam0", "PolyReflParam0", 0.5, -1., 1.); - RooRealVar PolyReflParam1("PolyReflParam1", "PolyReflParam1", 0.2, -1., 1.); - RooRealVar PolyReflParam2("PolyReflParam2", "PolyReflParam2", 0.2, -1., 1.); - RooRealVar PolyReflParam3("PolyReflParam3", "PolyReflParam3", 0.2, -1., 1.); - RooAbsPdf* reflFuncPoly3 = new RooPolynomial("reflFuncPoly3", "reflection PDF", mass, RooArgSet(PolyReflParam0, PolyReflParam1, PolyReflParam2, PolyReflParam3)); + RooRealVar polyReflParam0("polyReflParam0", "polyReflParam0", 0.5, -1., 1.); + RooRealVar polyReflParam1("polyReflParam1", "polyReflParam1", 0.2, -1., 1.); + RooRealVar polyReflParam2("polyReflParam2", "polyReflParam2", 0.2, -1., 1.); + RooRealVar polyReflParam3("polyReflParam3", "polyReflParam3", 0.2, -1., 1.); + RooAbsPdf* reflFuncPoly3 = new RooPolynomial("reflFuncPoly3", "reflection PDF", mass, RooArgSet(polyReflParam0, polyReflParam1, polyReflParam2, polyReflParam3)); workspace.import(*reflFuncPoly3); + delete reflFuncPoly3; // reflection poly6 - RooRealVar PolyReflParam4("PolyReflParam4", "PolyReflParam4", 0.2, -1., 1.); - RooRealVar PolyReflParam5("PolyReflParam5", "PolyReflParam5", 0.2, -1., 1.); - RooRealVar PolyReflParam6("PolyReflParam6", "PolyReflParam6", 0.2, -1., 1.); - RooAbsPdf* reflFuncPoly6 = new RooPolynomial("reflFuncPoly6", "reflection pdf", mass, RooArgSet(PolyReflParam0, PolyReflParam1, PolyReflParam2, PolyReflParam3, PolyReflParam4, PolyReflParam5, PolyReflParam6)); + RooRealVar polyReflParam4("polyReflParam4", "polyReflParam4", 0.2, -1., 1.); + RooRealVar polyReflParam5("polyReflParam5", "polyReflParam5", 0.2, -1., 1.); + RooRealVar polyReflParam6("polyReflParam6", "polyReflParam6", 0.2, -1., 1.); + RooAbsPdf* reflFuncPoly6 = new RooPolynomial("reflFuncPoly6", "reflection pdf", mass, RooArgSet(polyReflParam0, polyReflParam1, polyReflParam2, polyReflParam3, polyReflParam4, polyReflParam5, polyReflParam6)); workspace.import(*reflFuncPoly6); + delete reflFuncPoly6; } // draw fit output void HFInvMassFitter::drawFit(TVirtualPad* pad, Int_t writeFitInfo) @@ -509,14 +539,15 @@ void HFInvMassFitter::drawFit(TVirtualPad* pad, Int_t writeFitInfo) textInfoRight->SetFillStyle(0); textInfoRight->SetTextColor(kBlue); textInfoLeft->AddText(Form("S = %.0f #pm %.0f ", mRawYield, mRawYieldErr)); - if (mTypeOfBkgPdf != 6) { + textInfoLeft->AddText(Form("S_{count} = %.0f #pm %.0f ", mRawYieldCounted, mRawYieldCountedErr)); + if (mTypeOfBkgPdf != NoBkg) { textInfoLeft->AddText(Form("B (%d#sigma) = %.0f #pm %.0f", mNSigmaForSidebands, mBkgYield, mBkgYieldErr)); textInfoLeft->AddText(Form("S/B (%d#sigma) = %.4g ", mNSigmaForSidebands, mRawYield / mBkgYield)); } if (mReflPdf) { textInfoLeft->AddText(Form("Refl/Sig = %.3f #pm %.3f ", mReflOverSgn, 0.0)); } - if (mTypeOfBkgPdf != 6) { + if (mTypeOfBkgPdf != NoBkg) { textInfoLeft->AddText(Form("Signif (%d#sigma) = %.1f #pm %.1f ", mNSigmaForSidebands, mSignificance, mSignificanceErr)); textInfoLeft->AddText(Form("#chi^{2} / ndf = %.3f", mChiSquareOverNdf)); } @@ -537,13 +568,14 @@ void HFInvMassFitter::drawFit(TVirtualPad* pad, Int_t writeFitInfo) mInvMassFrame->GetYaxis()->SetTitle(Form("%s", mHistoInvMass->GetYaxis()->GetTitle())); mInvMassFrame->GetXaxis()->SetTitle(Form("%s", mHistoInvMass->GetXaxis()->GetTitle())); mInvMassFrame->Draw(); + highlightPeakRegion(mInvMassFrame); if (mHistoTemplateRefl) { mReflFrame->Draw("same"); } } } -// draw redisual distribution on canvas +// draw residual distribution on canvas void HFInvMassFitter::drawResidual(TVirtualPad* pad) { pad->cd(); @@ -553,10 +585,33 @@ void HFInvMassFitter::drawResidual(TVirtualPad* pad) textInfo->SetFillStyle(0); textInfo->SetTextColor(kBlue); textInfo->AddText(Form("S = %.0f #pm %.0f ", mRawYield, mRawYieldErr)); + textInfo->AddText(Form("S_{count} = %.0f #pm %.0f ", mRawYieldCounted, mRawYieldCountedErr)); textInfo->AddText(Form("mean = %.3f #pm %.3f", mRooMeanSgn->getVal(), mRooMeanSgn->getError())); textInfo->AddText(Form("sigma = %.3f #pm %.3f", mRooSigmaSgn->getVal(), mRooSigmaSgn->getError())); mResidualFrame->addObject(textInfo); mResidualFrame->Draw(); + highlightPeakRegion(mResidualFrame); +} + +// draw peak region with vertical lines +void HFInvMassFitter::highlightPeakRegion(const RooPlot* plot, Color_t color, Width_t width, Style_t style) const +{ + if (!mHighlightPeakRegion) + return; + double yMin = plot->GetMinimum(); + double yMax = plot->GetMaximum(); + const Double_t mean = mRooMeanSgn->getVal(); + const Double_t sigma = mRooSigmaSgn->getVal(); + const Double_t minForSgn = mean - mNSigmaForSidebands * sigma; + const Double_t maxForSgn = mean + mNSigmaForSidebands * sigma; + TLine* leftLine = new TLine(minForSgn, yMin, minForSgn, yMax); + TLine* rightLine = new TLine(maxForSgn, yMin, maxForSgn, yMax); + for (const auto& line : std::array{leftLine, rightLine}) { + line->SetLineColor(color); + line->SetLineWidth(width); + line->SetLineStyle(style); + line->Draw(); + } } // draw reflection distribution on canvas @@ -567,6 +622,34 @@ void HFInvMassFitter::drawReflection(TVirtualPad* pad) mReflOnlyFrame->Draw(); } +// calculate signal yield via bin counting +void HFInvMassFitter::countSignal(Double_t& signal, Double_t& signalErr) const +{ + const Double_t mean = mRooMeanSgn->getVal(); + const Double_t sigma = mRooSigmaSgn->getVal(); + const Double_t minForSgn = mean - mNSigmaForSidebands * sigma; + const Double_t maxForSgn = mean + mNSigmaForSidebands * sigma; + const Int_t binForMinSgn = mHistoInvMass->FindBin(minForSgn); + const Int_t binForMaxSgn = mHistoInvMass->FindBin(maxForSgn); + const Double_t binForMinSgnUpperEdge = mHistoInvMass->GetBinLowEdge(binForMinSgn + 1); + const Double_t binForMaxSgnLowerEdge = mHistoInvMass->GetBinLowEdge(binForMaxSgn); + const Double_t binForMinSgnFraction = (binForMinSgnUpperEdge - minForSgn) / mHistoInvMass->GetBinWidth(binForMinSgn); + const Double_t binForMaxSgnFraction = (maxForSgn - binForMaxSgnLowerEdge) / mHistoInvMass->GetBinWidth(binForMaxSgn); + + Double_t sum = 0; + sum += mHistoInvMass->GetBinContent(binForMinSgn) * binForMinSgnFraction; + for (Int_t iBin = binForMinSgn + 1; iBin <= binForMaxSgn - 1; iBin++) { + sum += mHistoInvMass->GetBinContent(iBin); + } + sum += mHistoInvMass->GetBinContent(binForMaxSgn) * binForMaxSgnFraction; + + Double_t bkg, errBkg; + calculateBackground(bkg, errBkg); + + signal = sum - bkg; + signalErr = std::sqrt(sum + errBkg * errBkg); // sum error squared is equal to sum +} + // calculate signal yield void HFInvMassFitter::calculateSignal(Double_t& signal, Double_t& errSignal) const { @@ -595,7 +678,7 @@ void HFInvMassFitter::calculateSignificance(Double_t& significance, Double_t& er errSignificance = significance * std::sqrt((sgnErrSquare + bkgErrSquare) / (mNSigmaForSidebands * totalSgnBkg * totalSgnBkg) + (bkg / totalSgnBkg) * (sgnErrSquare / signal / signal)); } -// estimate Signnal +// estimate Signal void HFInvMassFitter::checkForSignal(Double_t& estimatedSignal) { Double_t minForSgn = mMass - 4 * mSigmaSgn; @@ -613,7 +696,7 @@ void HFInvMassFitter::checkForSignal(Double_t& estimatedSignal) } // Create Background Fit Function -RooAbsPdf* HFInvMassFitter::createBackgroundFitFunction(RooWorkspace* workspace) +RooAbsPdf* HFInvMassFitter::createBackgroundFitFunction(RooWorkspace* workspace) const { RooAbsPdf* bkgPdf; switch (mTypeOfBkgPdf) { @@ -677,7 +760,7 @@ RooAbsPdf* HFInvMassFitter::createSignalFitFunction(RooWorkspace* workspace) } // Create Reflection Fit Function -RooAbsPdf* HFInvMassFitter::createReflectionFitFunction(RooWorkspace* workspace) +RooAbsPdf* HFInvMassFitter::createReflectionFitFunction(RooWorkspace* workspace) const { RooAbsPdf* reflPdf; switch (mTypeOfReflPdf) { @@ -700,26 +783,26 @@ RooAbsPdf* HFInvMassFitter::createReflectionFitFunction(RooWorkspace* workspace) } // Plot Bkg components of fTotFunction -void HFInvMassFitter::plotBkg(RooAbsPdf* pdf) +void HFInvMassFitter::plotBkg(RooAbsPdf* pdf, Color_t color) { switch (mTypeOfBkgPdf) { case 0: - pdf->plotOn(mInvMassFrame, Components("bkgFuncExpo"), Name("Bkg_c"), LineColor(kRed)); + pdf->plotOn(mInvMassFrame, Components("bkgFuncExpo"), Name("Bkg_c"), LineColor(color)); break; case 1: - pdf->plotOn(mInvMassFrame, Components("bkgFuncPoly1"), Name("Bkg_c"), LineColor(kRed)); + pdf->plotOn(mInvMassFrame, Components("bkgFuncPoly1"), Name("Bkg_c"), LineColor(color)); break; case 2: - pdf->plotOn(mInvMassFrame, Components("bkgFuncPoly2"), Name("Bkg_c"), LineColor(kRed)); + pdf->plotOn(mInvMassFrame, Components("bkgFuncPoly2"), Name("Bkg_c"), LineColor(color)); break; case 3: - pdf->plotOn(mInvMassFrame, Components("bkgFuncPow"), Name("Bkg_c"), LineColor(kRed)); + pdf->plotOn(mInvMassFrame, Components("bkgFuncPow"), Name("Bkg_c"), LineColor(color)); break; case 4: - pdf->plotOn(mInvMassFrame, Components("bkgFuncPowExp"), Name("Bkg_c"), LineColor(kRed)); + pdf->plotOn(mInvMassFrame, Components("bkgFuncPowExp"), Name("Bkg_c"), LineColor(color)); break; case 5: - pdf->plotOn(mInvMassFrame, Components("bkgFuncPoly3"), Name("Bkg_c"), LineColor(kRed)); + pdf->plotOn(mInvMassFrame, Components("bkgFuncPoly3"), Name("Bkg_c"), LineColor(color)); break; case 6: break; @@ -774,30 +857,30 @@ void HFInvMassFitter::setReflFuncFixed() fracRefl->setConstant(kTRUE); } break; case 2: { - RooRealVar* PolyReflParam0 = mWorkspace->var("PolyReflParam0"); - RooRealVar* PolyReflParam1 = mWorkspace->var("PolyReflParam1"); - RooRealVar* PolyReflParam2 = mWorkspace->var("PolyReflParam2"); - RooRealVar* PolyReflParam3 = mWorkspace->var("PolyReflParam3"); - PolyReflParam0->setConstant(kTRUE); - PolyReflParam1->setConstant(kTRUE); - PolyReflParam2->setConstant(kTRUE); - PolyReflParam3->setConstant(kTRUE); + RooRealVar* polyReflParam0 = mWorkspace->var("polyReflParam0"); + RooRealVar* polyReflParam1 = mWorkspace->var("polyReflParam1"); + RooRealVar* polyReflParam2 = mWorkspace->var("polyReflParam2"); + RooRealVar* polyReflParam3 = mWorkspace->var("polyReflParam3"); + polyReflParam0->setConstant(kTRUE); + polyReflParam1->setConstant(kTRUE); + polyReflParam2->setConstant(kTRUE); + polyReflParam3->setConstant(kTRUE); } break; case 3: { - RooRealVar* PolyReflParam0 = mWorkspace->var("PolyReflParam0"); - RooRealVar* PolyReflParam1 = mWorkspace->var("PolyReflParam1"); - RooRealVar* PolyReflParam2 = mWorkspace->var("PolyReflParam2"); - RooRealVar* PolyReflParam3 = mWorkspace->var("PolyReflParam3"); - RooRealVar* PolyReflParam4 = mWorkspace->var("PolyReflParam4"); - RooRealVar* PolyReflParam5 = mWorkspace->var("PolyReflParam5"); - RooRealVar* PolyReflParam6 = mWorkspace->var("PolyReflParam6"); - PolyReflParam0->setConstant(kTRUE); - PolyReflParam1->setConstant(kTRUE); - PolyReflParam2->setConstant(kTRUE); - PolyReflParam3->setConstant(kTRUE); - PolyReflParam4->setConstant(kTRUE); - PolyReflParam5->setConstant(kTRUE); - PolyReflParam6->setConstant(kTRUE); + RooRealVar* polyReflParam0 = mWorkspace->var("polyReflParam0"); + RooRealVar* polyReflParam1 = mWorkspace->var("polyReflParam1"); + RooRealVar* polyReflParam2 = mWorkspace->var("polyReflParam2"); + RooRealVar* polyReflParam3 = mWorkspace->var("polyReflParam3"); + RooRealVar* polyReflParam4 = mWorkspace->var("polyReflParam4"); + RooRealVar* polyReflParam5 = mWorkspace->var("polyReflParam5"); + RooRealVar* polyReflParam6 = mWorkspace->var("polyReflParam6"); + polyReflParam0->setConstant(kTRUE); + polyReflParam1->setConstant(kTRUE); + polyReflParam2->setConstant(kTRUE); + polyReflParam3->setConstant(kTRUE); + polyReflParam4->setConstant(kTRUE); + polyReflParam5->setConstant(kTRUE); + polyReflParam6->setConstant(kTRUE); } break; default: break; diff --git a/PWGHF/D2H/Macros/HFInvMassFitter.h b/PWGHF/D2H/Macros/HFInvMassFitter.h index 410450de273..61c8b601179 100644 --- a/PWGHF/D2H/Macros/HFInvMassFitter.h +++ b/PWGHF/D2H/Macros/HFInvMassFitter.h @@ -20,27 +20,21 @@ #ifndef PWGHF_D2H_MACROS_HFINVMASSFITTER_H_ #define PWGHF_D2H_MACROS_HFINVMASSFITTER_H_ -#include // std::cout -#include // std::string +#include +#include +#include #include #include -#include #include #include #include #include -#include #include #include #include #include -using namespace RooFit; - -class TF1; -class TH1F; - class HFInvMassFitter : public TNamed { public: @@ -66,22 +60,22 @@ class HFInvMassFitter : public TNamed Poly6Refl = 3 }; HFInvMassFitter(); - HFInvMassFitter(const TH1F* histoToFit, Double_t minValue, Double_t maxValue, Int_t fitTypeBkg = Expo, Int_t fitTypeSgn = SingleGaus); + HFInvMassFitter(const TH1* histoToFit, Double_t minValue, Double_t maxValue, Int_t fitTypeBkg = Expo, Int_t fitTypeSgn = SingleGaus); ~HFInvMassFitter(); - void setHistogramForFit(const TH1F* histoToFit) + void setHistogramForFit(const TH1* histoToFit) { if (mHistoInvMass) { delete mHistoInvMass; } - mHistoInvMass = reinterpret_cast(histoToFit->Clone("mHistoInvMass")); + mHistoInvMass = static_cast(histoToFit->Clone("mHistoInvMass")); mHistoInvMass->SetDirectory(0); } void setUseLikelihoodFit() { mFitOption = "L,E"; } void setUseChi2Fit() { mFitOption = "Chi2"; } void setFitOption(TString opt) { mFitOption = opt.Data(); } - RooAbsPdf* createBackgroundFitFunction(RooWorkspace* w1); + RooAbsPdf* createBackgroundFitFunction(RooWorkspace* w1) const; RooAbsPdf* createSignalFitFunction(RooWorkspace* w1); - RooAbsPdf* createReflectionFitFunction(RooWorkspace* w1); + RooAbsPdf* createReflectionFitFunction(RooWorkspace* w1) const; void setFitRange(Double_t minValue, Double_t maxValue) { @@ -122,7 +116,7 @@ class HFInvMassFitter : public TNamed { if (mean < meanLowLimit || mean > meanUpLimit) { - std::cout << "Invalid Gaussian mean limmit!" << std::endl; + printf("Invalid Gaussian mean limit!\n"); } setInitialGaussianMean(mean); mMassLowLimit = meanLowLimit; @@ -133,7 +127,7 @@ class HFInvMassFitter : public TNamed { if (mean < meanLowLimit || mean > meanUpLimit) { - std::cout << "Invalid Gaussian mean limmit for reflection!" << std::endl; + printf("Invalid Gaussian mean limit for reflection!\n"); } setInitialGaussianMean(mean); mMassReflLowLimit = meanLowLimit; @@ -154,7 +148,7 @@ class HFInvMassFitter : public TNamed void setFixSecondGaussianSigma(Double_t sigma) { if (mTypeOfSgnPdf != DoubleGaus) { - std::cout << "Fit type should be 2Gaus!" << std::endl; + printf("Fit type should be 2Gaus!\n"); } setInitialSecondGaussianSigma(sigma); mFixedSigmaDoubleGaus = kTRUE; @@ -163,7 +157,7 @@ class HFInvMassFitter : public TNamed { if (mTypeOfSgnPdf != DoubleGaus && mTypeOfSgnPdf != DoubleGausSigmaRatioPar) { - std::cout << "Fit type should be 2Gaus or 2GausSigmaRatio!" << std::endl; + printf("Fit type should be 2Gaus or 2GausSigmaRatio!\n"); } setInitialFracDoubleGaus(frac); mFixedFracDoubleGaus = kTRUE; @@ -171,17 +165,17 @@ class HFInvMassFitter : public TNamed void setFixRatioToGausSigma(Double_t sigmaFrac) { if (mTypeOfSgnPdf != DoubleGausSigmaRatioPar) { - std::cout << "Fit type should be set to k2GausSigmaRatioPar!" << std::endl; + printf("Fit type should be set to k2GausSigmaRatioPar!\n"); } setInitialRatioDoubleGausSigma(sigmaFrac); mFixedRatioDoubleGausSigma = kTRUE; } void setFixSignalYield(Double_t yield) { mFixedRawYield = yield; } void setNumberOfSigmaForSidebands(Double_t numberOfSigma) { mNSigmaForSidebands = numberOfSigma; } - void plotBkg(RooAbsPdf* mFunc); + void plotBkg(RooAbsPdf* mFunc, Color_t color = kRed); void plotRefl(RooAbsPdf* mFunc); void setReflFuncFixed(); - void doFit(Bool_t draw = kTRUE); + void doFit(); void setInitialReflOverSgn(Double_t reflOverSgn) { mReflOverSgn = reflOverSgn; } void setFixReflOverSgn(Double_t reflOverSgn) { @@ -193,11 +187,15 @@ class HFInvMassFitter : public TNamed if (!histoRefl) { mEnableReflections = kFALSE; } - mHistoTemplateRefl = reinterpret_cast(histoRefl->Clone("mHistoTemplateRefl")); + mHistoTemplateRefl = static_cast(histoRefl->Clone("mHistoTemplateRefl")); } + void setDrawBgPrefit(Bool_t value = true) { mDrawBgPrefit = value; } + void setHighlightPeakRegion(Bool_t value = true) { mHighlightPeakRegion = value; } Double_t getChiSquareOverNDF() const { return mChiSquareOverNdf; } Double_t getRawYield() const { return mRawYield; } Double_t getRawYieldError() const { return mRawYieldErr; } + Double_t getRawYieldCounted() const { return mRawYieldCounted; } + Double_t getRawYieldCountedError() const { return mRawYieldCountedErr; } Double_t getBkgYield() const { return mBkgYield; } Double_t getBkgYieldError() const { return mBkgYieldErr; } Double_t getSignificance() const { return mSignificance; } @@ -215,6 +213,7 @@ class HFInvMassFitter : public TNamed } } void calculateSignal(Double_t& signal, Double_t& signalErr) const; + void countSignal(Double_t& signal, Double_t& signalErr) const; void calculateBackground(Double_t& bkg, Double_t& bkgErr) const; void calculateSignificance(Double_t& significance, Double_t& significanceErr) const; void checkForSignal(Double_t& estimatedSignal); @@ -225,9 +224,10 @@ class HFInvMassFitter : public TNamed private: HFInvMassFitter(const HFInvMassFitter& source); HFInvMassFitter& operator=(const HFInvMassFitter& source); - void fillWorkspace(RooWorkspace& w); + void fillWorkspace(RooWorkspace& w) const; + void highlightPeakRegion(const RooPlot* plot, Color_t color = kGray + 1, Width_t width = 1, Style_t style = 2) const; - TH1F* mHistoInvMass; // histogram to fit + TH1* mHistoInvMass; // histogram to fit TString mFitOption; Double_t mMinMass; // lower mass limit Double_t mMaxMass; // upper mass limit @@ -241,14 +241,13 @@ class HFInvMassFitter : public TNamed Double_t mMassReflLowLimit; /// lower limit of the allowed mass range for reflection Double_t mMassReflUpLimit; /// upper limit of the allowed mass range for reflection Double_t mSecMass; /// Second peak mean value - Double_t mMassErr; /// uncertainty on signal gaussian mean value Double_t mSigmaSgn; /// signal gaussian sigma Double_t mSecSigma; /// Second peak gaussian sigma Int_t mNSigmaForSidebands; /// number of sigmas to veto the signal peak Int_t mNSigmaForSgn; /// number of sigmas to veto the signal peak Double_t mSigmaSgnErr; /// uncertainty on signal gaussian sigma Double_t mSigmaSgnDoubleGaus; /// signal 2gaussian sigma - Double_t mFixedMean; /// switch for fix mean of gaussian + Bool_t mFixedMean; /// switch for fix mean of gaussian Bool_t mBoundMean; /// switch for bound mean of guassian Bool_t mBoundReflMean; /// switch for bound mean of guassian for reflection Bool_t mFixedSigma; /// fix sigma or not @@ -265,6 +264,8 @@ class HFInvMassFitter : public TNamed Bool_t mEnableReflections; /// flag use/not use reflections Double_t mRawYield; /// signal gaussian integral Double_t mRawYieldErr; /// err on signal gaussian integral + Double_t mRawYieldCounted; /// signal gaussian integral evaluated via bin counting + Double_t mRawYieldCountedErr; /// err on signal gaussian integral evaluated via bin counting Double_t mBkgYield; /// background Double_t mBkgYieldErr; /// err on background Double_t mSignificance; /// significance @@ -284,13 +285,14 @@ class HFInvMassFitter : public TNamed RooPlot* mReflFrame; /// reflection frame RooPlot* mReflOnlyFrame; /// reflection frame plot on reflection only RooPlot* mResidualFrame; /// residual frame - RooPlot* mResidualFrameForCalulation; - RooRealVar* mass; /// mass - RooWorkspace* mWorkspace; /// workspace - Double_t mIntegralHisto; /// integral of histogram to fit - Double_t mIntegralBkg; /// integral of background fit function - Double_t mIntegralSgn; /// integral of signal fit function - TH1F* mHistoTemplateRefl; /// reflection histogram + RooPlot* mResidualFrameForCalculation; + RooWorkspace* mWorkspace; /// workspace + Double_t mIntegralHisto; /// integral of histogram to fit + Double_t mIntegralBkg; /// integral of background fit function + Double_t mIntegralSgn; /// integral of signal fit function + TH1* mHistoTemplateRefl; /// reflection histogram + Bool_t mDrawBgPrefit; /// draw background after fitting the sidebands + Bool_t mHighlightPeakRegion; /// draw vertical lines showing the peak region (usually +- 3 sigma) ClassDef(HFInvMassFitter, 1); }; diff --git a/PWGHF/D2H/Macros/config_massfitter.json b/PWGHF/D2H/Macros/config_massfitter.json index 34404095510..3199b780f68 100644 --- a/PWGHF/D2H/Macros/config_massfitter.json +++ b/PWGHF/D2H/Macros/config_massfitter.json @@ -1,136 +1,127 @@ { - "IsMC": false, - "InFileName": "input file directory ", - "ReflFileName": "input reflection file directory", - "OutFileName": "output file directory", - "InputHistoName": [ - "name array of the input data histogram for fit", - "once the projection macro is ready", - "these names will no longer need to be input manually" - ], - "PromptHistoName": [ - "MC prompt histogram name array" - ], - "FDHistoName": [ - "MC FD histogram name array" - ], - "ReflHistoName": [ - "MC reflection histogram name array" - ], - "PromptSecPeakHistoName": [ - "MC prompt second peak histogram name array" - ], - "FDSecPeakHistoName": [ - "MC FD second peak histogram name array" - ], - "Particle": "D0", - "_Particles": [ - "Dplus", - "Ds", - "LcToPKPi", - "LcToPK0s", - "Dstar" - ], - "EnableRefl": true, - "FixSigma": false, - "SigmaFile": "", - "_SigmaFile": "fix sigma from file", - "FixSigmaManual": [ - 0.012, - 0.012, - 0.013, - 0.015, - 0.017, - 0.02 - ], - "_FixSigmaManual": "fix sigma mannually", - "FixMean": false, - "MeanFile": "", - "_MeanFile": "fix mean from file", - "PtMin": [ - 1.0, - 2.0, - 4.0, - 6.0, - 8.0, - 12.0 - ], - "PtMax": [ - 2.0, - 4.0, - 6.0, - 8.0, - 12.0, - 24.0 - ], - "MassMin": [ - 1.72, - 1.72, - 1.72, - 1.72, - 1.72, - 1.72 - ], - "MassMax": [ - 2.03, - 2.03, - 2.03, - 2.03, - 2.03, - 2.03 - ], - "Rebin": [ - 6, - 6, - 6, - 6, - 6, - 6 - ], - "InclSecPeak": false, - "SigmaSecPeak": "", - "SigmaFileSecPeak": "", - "SigmaMultFactorSecPeak": 1.0, - "FixSigmaToFirstPeak": false, - "UseLikelihood": true, - "_UseLikelihood": [ - "true: likelihood fit", - "false: chi2 fit" - ], - "BkgFunc": [ - 0, - 0, - 0, - 0, - 0, - 0 - ], - "_BkgFuncs": [ - "0 for Expo", - "1 for Poly1", - "2 for Poly2", - "3 for Pow", - "4 for PowEx", - "5 for Poly3", - "6 for NoBkg" - ], - "SgnFunc": [ - 0, - 0, - 0, - 0, - 0, - 0 - ], - "_SgnFuncs": [ - "0 for SingleGaus", - "1 for DoubleGaus", - "2 for DoubleGausSigmaRatioPar", - "3 for GausSec" - ], - "BoundMean": false, - "_BoundMean": [ - "false: Do not set limits on mean range", - "true: the mean is set to be between MassMin[i] and MassMax[i]" - ] + "IsMC": false, + "InFileName": "hMasses.root", + "_InFileName": "download example file here https://cernbox.cern.ch/s/uoWicuRAVGArDsV", + "ReflFileName": "", + "OutFileName": "mInvFits.root", + "InputHistoName": [ + "hMass_T_0.20_0.35", + "hMass_T_0.35_0.50", + "hMass_T_0.50_0.70", + "hMass_T_0.70_0.90", + "hMass_T_0.90_1.60" + ], + "PromptHistoName": [ + "MC prompt histogram name array" + ], + "FDHistoName": [ + "MC FD histogram name array" + ], + "ReflHistoName": [ + "MC reflection histogram name array" + ], + "PromptSecPeakHistoName": [ + "MC prompt second peak histogram name array" + ], + "FDSecPeakHistoName": [ + "MC FD second peak histogram name array" + ], + "Particle": "LcToPKPi", + "_Particles": [ + "Dplus", + "Ds", + "LcToPKPi", + "LcToPK0s", + "Dstar" + ], + "EnableRefl": false, + "FixSigma": false, + "SigmaFile": "", + "_SigmaFile": "fix sigma from file", + "FixSigmaManual": [ + 0, + 0, + 0, + 0, + 0 + ], + "_FixSigmaManual": "fix sigma manually", + "FixMean": false, + "MeanFile": "", + "_MeanFile": "fix mean from file", + "SliceVarName": "T", + "SliceVarUnit": "ps", + "_SliceVarName, _SliceVarUnit": "e.g. pT, GeV/c or something else depending on user's needs", + "SliceVarMin": [ + 0.2, + 0.35, + 0.5, + 0.7, + 0.9 + ], + "SliceVarMax": [ + 0.35, + 0.5, + 0.7, + 0.9, + 1.6 + ], + "MassMin": [ + 2.12, + 2.12, + 2.12, + 2.12, + 2.12 + ], + "MassMax": [ + 2.42, + 2.42, + 2.42, + 2.42, + 2.42 + ], + "Rebin": [ + 4, + 4, + 4, + 4, + 4 + ], + "InclSecPeak": false, + "UseLikelihood": false, + "_UseLikelihood": [ + "true: likelihood fit", + "false: chi2 fit" + ], + "BkgFunc": [ + 2, + 2, + 2, + 2, + 2 + ], + "_BkgFuncs": [ + "0 for Expo", + "1 for Poly1", + "2 for Poly2", + "3 for Pow", + "4 for PowEx", + "5 for Poly3", + "6 for NoBkg" + ], + "SgnFunc": [ + 0, + 0, + 0, + 0, + 0 + ], + "_SgnFuncs": [ + "0 for SingleGaus", + "1 for DoubleGaus", + "2 for DoubleGausSigmaRatioPar", + "3 for GausSec" + ], + "drawBgPrefit": true, + "highlightPeakRegion": true } diff --git a/PWGHF/D2H/Macros/runMassFitter.C b/PWGHF/D2H/Macros/runMassFitter.C index b5fc1fb9187..637171248cc 100644 --- a/PWGHF/D2H/Macros/runMassFitter.C +++ b/PWGHF/D2H/Macros/runMassFitter.C @@ -21,23 +21,24 @@ #include "HFInvMassFitter.h" -#include // std::cout -#include // std::string -#include // std::vector - -#include -#include - // if .h file not found, please include your local rapidjson/document.h and rapidjson/filereadstream.h here #include #include +#include // for fclose +#include +#include // std::string +#include // std::vector + +#include +#include +#include + #endif -using namespace std; using namespace rapidjson; -int runMassFitter(TString configFileName = "config_massfitter.json"); +int runMassFitter(const TString& configFileName = "config_massfitter.json"); template void readArray(const Value& jsonArray, std::vector& output) @@ -48,7 +49,7 @@ void readArray(const Value& jsonArray, std::vector& output) } } -void parseStringArray(const Value& jsonArray, std::vector& output) +void parseStringArray(const Value& jsonArray, std::vector& output) { size_t arrayLength = jsonArray.Size(); for (size_t i = 0; i < arrayLength; i++) { @@ -58,16 +59,15 @@ void parseStringArray(const Value& jsonArray, std::vector& output) } } -void divideCanvas(TCanvas* c, int nPtBins); -void setHistoStyle(TH1* histo, int color = kBlack, double markerSize = 1.); +void divideCanvas(TCanvas* c, int nSliceVarBins); +void setHistoStyle(TH1* histo, Color_t color = kBlack, Size_t markerSize = 1); -int runMassFitter(TString configFileName) +int runMassFitter(const TString& configFileName) { // load config FILE* configFile = fopen(configFileName.Data(), "r"); if (!configFile) { - cerr << "ERROR: Missing configuration json file: " << configFileName << endl; - return -1; + throw std::runtime_error("ERROR: Missing configuration json file: " + configFileName); } Document config; @@ -82,20 +82,22 @@ int runMassFitter(TString configFileName) TString outputFileName = config["OutFileName"].GetString(); TString particleName = config["Particle"].GetString(); - vector inputHistoName; - vector promptHistoName; - vector fdHistoName; - vector reflHistoName; - vector promptSecPeakHistoName; - vector fdSecPeakHistoName; - vector ptMin; - vector ptMax; - vector massMin; - vector massMax; - vector fixSigmaManual; - vector nRebin; - vector bkgFuncConfig; - vector sgnFuncConfig; + std::vector inputHistoName; + std::vector promptHistoName; + std::vector fdHistoName; + std::vector reflHistoName; + std::vector promptSecPeakHistoName; + std::vector fdSecPeakHistoName; + TString sliceVarName; + TString sliceVarUnit; + std::vector sliceVarMin; + std::vector sliceVarMax; + std::vector massMin; + std::vector massMax; + std::vector fixSigmaManual; + std::vector nRebin; + std::vector bkgFuncConfig; + std::vector sgnFuncConfig; const Value& inputHistoNameValue = config["InputHistoName"]; parseStringArray(inputHistoNameValue, inputHistoName); @@ -113,23 +115,25 @@ int runMassFitter(TString configFileName) parseStringArray(promptSecPeakHistoNameValue, promptSecPeakHistoName); const Value& fdSecPeakHistoNameValue = config["FDSecPeakHistoName"]; - parseStringArray(promptSecPeakHistoNameValue, promptSecPeakHistoName); + parseStringArray(fdSecPeakHistoNameValue, fdSecPeakHistoName); bool fixSigma = config["FixSigma"].GetBool(); - string sigmaFile = config["SigmaFile"].GetString(); - double sigmaMultFactor = - config["SigmaMultFactor"].GetDouble(); + std::string sigmaFile = config["SigmaFile"].GetString(); + bool fixMean = config["FixMean"].GetBool(); - string meanFile = config["MeanFile"].GetString(); + std::string meanFile = config["MeanFile"].GetString(); const Value& fixSigmaManualValue = config["FixSigmaManual"]; readArray(fixSigmaManualValue, fixSigmaManual); - const Value& ptMinValue = config["PtMin"]; - readArray(ptMinValue, ptMin); + sliceVarName = config["SliceVarName"].GetString(); + sliceVarUnit = config["SliceVarUnit"].GetString(); + + const Value& sliceVarMinValue = config["SliceVarMin"]; + readArray(sliceVarMinValue, sliceVarMin); - const Value& ptMaxValue = config["PtMax"]; - readArray(ptMaxValue, ptMax); + const Value& sliceVarMaxValue = config["SliceVarMax"]; + readArray(sliceVarMaxValue, sliceVarMax); const Value& massMinValue = config["MassMin"]; readArray(massMinValue, massMin); @@ -141,13 +145,6 @@ int runMassFitter(TString configFileName) readArray(rebinValue, nRebin); bool includeSecPeak = config["InclSecPeak"].GetBool(); - string sigmaSecPeak = config["SigmaSecPeak"].GetString(); - string sigmaFileSecPeak = - config["SigmaFileSecPeak"].GetString(); - double sigmaMultFactorSecPeak = - config["SigmaMultFactorSecPeak"].GetDouble(); - bool fixSigmaToFirstPeak = - config["FixSigmaToFirstPeak"].GetBool(); bool useLikelihood = config["UseLikelihood"].GetBool(); const Value& bkgFuncValue = config["BkgFunc"]; @@ -156,70 +153,53 @@ int runMassFitter(TString configFileName) const Value& sgnFuncValue = config["SgnFunc"]; readArray(sgnFuncValue, sgnFuncConfig); - bool fixSigmaRatio = config["FixSigmaRatio"].GetBool(); - TString sigmaRatioFile = config["SigmaRatioFile"].GetString(); - bool boundMean = config["BoundMean"].GetBool(); bool enableRefl = config["EnableRefl"].GetBool(); - const unsigned int nPtBins = ptMin.size(); - int bkgFunc[nPtBins], sgnFunc[nPtBins]; - double ptLimits[nPtBins + 1]; - - for (unsigned int iPt = 0; iPt < nPtBins; iPt++) { - ptLimits[iPt] = ptMin[iPt]; - ptLimits[iPt + 1] = ptMax[iPt]; - - if (bkgFuncConfig[iPt] == 0) { - bkgFunc[iPt] = HFInvMassFitter::Expo; - } else if (bkgFuncConfig[iPt] == 1) { - bkgFunc[iPt] = HFInvMassFitter::Poly1; - } else if (bkgFuncConfig[iPt] == 2) { - bkgFunc[iPt] = HFInvMassFitter::Poly2; - } else if (bkgFuncConfig[iPt] == 3) { - bkgFunc[iPt] = HFInvMassFitter::Pow; - } else if (bkgFuncConfig[iPt] == 4) { - bkgFunc[iPt] = HFInvMassFitter::PowExpo; - } else if (bkgFuncConfig[iPt] == 5) { - bkgFunc[iPt] = HFInvMassFitter::Poly3; - } else if (bkgFuncConfig[iPt] == 6) { - bkgFunc[iPt] = HFInvMassFitter::NoBkg; - } else { - cerr << "ERROR: only Expo, Poly1, Poly2, Pow and PowEx background " - "functions supported! Exit" - << endl; - return -1; + bool drawBgPrefit = config["drawBgPrefit"].GetBool(); + bool highlightPeakRegion = config["highlightPeakRegion"].GetBool(); + + const unsigned int nSliceVarBins = sliceVarMin.size(); + std::vector bkgFunc(nSliceVarBins); + std::vector sgnFunc(nSliceVarBins); + std::vector sliceVarLimits(nSliceVarBins + 1); + + for (unsigned int iSliceVar = 0; iSliceVar < nSliceVarBins; iSliceVar++) { + sliceVarLimits[iSliceVar] = sliceVarMin[iSliceVar]; + sliceVarLimits[iSliceVar + 1] = sliceVarMax[iSliceVar]; + + if (bkgFuncConfig[iSliceVar] < HFInvMassFitter::Expo || bkgFuncConfig[iSliceVar] > HFInvMassFitter::NoBkg) { + throw std::runtime_error("ERROR: only Expo, Poly1, Poly2, Pow and PowEx background functions supported! Exit"); } + bkgFunc[iSliceVar] = bkgFuncConfig[iSliceVar]; - if (sgnFuncConfig[iPt] == 0) { - sgnFunc[iPt] = HFInvMassFitter::SingleGaus; - } else if (sgnFuncConfig[iPt] == 1) { - sgnFunc[iPt] = HFInvMassFitter::DoubleGaus; - } else if (sgnFuncConfig[iPt] == 2) { - sgnFunc[iPt] = HFInvMassFitter::DoubleGausSigmaRatioPar; - } else { - cerr << "ERROR: only SingleGaus, DoubleGaus and DoubleGausSigmaRatioPar signal " - "functions supported! Exit" - << endl; - return -1; + if (sgnFuncConfig[iSliceVar] < HFInvMassFitter::SingleGaus || sgnFuncConfig[iSliceVar] > HFInvMassFitter::DoubleGausSigmaRatioPar) { + throw std::runtime_error("ERROR: only SingleGaus, DoubleGaus and DoubleGausSigmaRatioPar signal functions supported! Exit"); } + sgnFunc[iSliceVar] = sgnFuncConfig[iSliceVar]; } TString massAxisTitle = ""; + double massPDG; if (particleName == "Dplus") { massAxisTitle = "#it{M}(K#pi#pi) (GeV/#it{c}^{2})"; + massPDG = TDatabasePDG::Instance()->GetParticle("D+")->Mass(); } else if (particleName == "D0") { massAxisTitle = "#it{M}(K#pi) (GeV/#it{c}^{2})"; + massPDG = TDatabasePDG::Instance()->GetParticle("D0")->Mass(); } else if (particleName == "Ds") { massAxisTitle = "#it{M}(KK#pi) (GeV/#it{c}^{2})"; + massPDG = TDatabasePDG::Instance()->GetParticle("D_s+")->Mass(); } else if (particleName == "LcToPKPi") { massAxisTitle = "#it{M}(pK#pi) (GeV/#it{c}^{2})"; + massPDG = TDatabasePDG::Instance()->GetParticle("Lambda_c+")->Mass(); } else if (particleName == "LcToPK0s") { massAxisTitle = "#it{M}(pK^{0}_{s}) (GeV/#it{c}^{2})"; + massPDG = TDatabasePDG::Instance()->GetParticle("Lambda_c+")->Mass(); } else if (particleName == "Dstar") { massAxisTitle = "#it{M}(pi^{+}) (GeV/#it{c}^{2})"; + massPDG = TDatabasePDG::Instance()->GetParticle("D*+")->Mass(); } else { - cerr << "ERROR: only Dplus, D0, Ds, LcToPKPi, LcToPK0s and Dstar particles supported! Exit" << endl; - return -1; + throw std::runtime_error("ERROR: only Dplus, D0, Ds, LcToPKPi, LcToPK0s and Dstar particles supported! Exit"); } // load inv-mass histograms @@ -228,7 +208,7 @@ int runMassFitter(TString configFileName) return -1; } - TFile* inputFileRefl = NULL; + TFile* inputFileRefl = nullptr; if (enableRefl) { inputFileRefl = TFile::Open(reflFileName.Data()); if (!inputFileRefl || !inputFileRefl->IsOpen()) { @@ -236,110 +216,109 @@ int runMassFitter(TString configFileName) } } - TH1F* hMassSgn[nPtBins]; - TH1F* hMassRefl[nPtBins]; - TH1F* hMass[nPtBins]; + std::vector hMassSgn(nSliceVarBins); + std::vector hMassRefl(nSliceVarBins); + std::vector hMass(nSliceVarBins); - for (unsigned int iPt = 0; iPt < nPtBins; iPt++) { + for (unsigned int iSliceVar = 0; iSliceVar < nSliceVarBins; iSliceVar++) { if (!isMc) { - hMass[iPt] = static_cast(inputFile->Get(inputHistoName[iPt].data())); + hMass[iSliceVar] = inputFile->Get(inputHistoName[iSliceVar].data()); if (enableRefl) { - hMassRefl[iPt] = static_cast(inputFileRefl->Get(reflHistoName[iPt].data())); - hMassSgn[iPt] = static_cast(inputFileRefl->Get(fdHistoName[iPt].data())); - hMassSgn[iPt]->Add(static_cast(inputFileRefl->Get(promptHistoName[iPt].data()))); - if (!hMassRefl[iPt]) { - cerr << "ERROR: MC reflection histogram not found! Exit!" << endl; - return -1; + hMassRefl[iSliceVar] = inputFileRefl->Get(reflHistoName[iSliceVar].data()); + hMassSgn[iSliceVar] = inputFileRefl->Get(fdHistoName[iSliceVar].data()); + hMassSgn[iSliceVar]->Add(inputFileRefl->Get(promptHistoName[iSliceVar].data())); + if (!hMassRefl[iSliceVar]) { + throw std::runtime_error("ERROR: MC reflection histogram not found! Exit!"); } - if (!hMassSgn[iPt]) { - cerr << "ERROR: MC prompt or FD histogram not found! Exit!" << endl; - return -1; + if (!hMassSgn[iSliceVar]) { + throw std::runtime_error("ERROR: MC prompt or FD histogram not found! Exit!"); } } } else { - hMass[iPt] = static_cast(inputFile->Get(promptHistoName[iPt].data())); - hMass[iPt]->Add(static_cast(inputFile->Get(fdHistoName[iPt].data()))); + hMass[iSliceVar] = inputFile->Get(promptHistoName[iSliceVar].data()); + hMass[iSliceVar]->Add(inputFile->Get(fdHistoName[iSliceVar].data())); if (includeSecPeak) { - hMass[iPt]->Add(static_cast(inputFile->Get(promptSecPeakHistoName[iPt].data()))); - hMass[iPt]->Add(static_cast(inputFile->Get(fdSecPeakHistoName[iPt].data()))); + hMass[iSliceVar]->Add(inputFile->Get(promptSecPeakHistoName[iSliceVar].data())); + hMass[iSliceVar]->Add(inputFile->Get(fdSecPeakHistoName[iSliceVar].data())); } } - if (!hMass[iPt]) { - cerr << "ERROR: input histogram for fit not found! Exit!" << endl; - return -1; + if (!hMass[iSliceVar]) { + throw std::runtime_error("ERROR: input histogram for fit not found! Exit!"); } - hMass[iPt]->SetDirectory(0); + hMass[iSliceVar]->SetDirectory(nullptr); } inputFile->Close(); // define output histos - auto hRawYields = new TH1D("hRawYields", ";#it{p}_{T} (GeV/#it{c});raw yield", - nPtBins, ptLimits); + auto hRawYields = new TH1D("hRawYields", ";" + sliceVarName + "(" + sliceVarUnit + ");raw yield", + nSliceVarBins, sliceVarLimits.data()); + auto hRawYieldsCounted = new TH1D("hRawYieldsCounted", ";" + sliceVarName + "(" + sliceVarUnit + ");raw yield via bin count", + nSliceVarBins, sliceVarLimits.data()); auto hRawYieldsSigma = new TH1D( - "hRawYieldsSigma", ";#it{p}_{T} (GeV/#it{c});width (GeV/#it{c}^{2})", - nPtBins, ptLimits); + "hRawYieldsSigma", ";" + sliceVarName + "(" + sliceVarUnit + ");width (GeV/#it{c}^{2})", + nSliceVarBins, sliceVarLimits.data()); auto hRawYieldsSigmaRatio = new TH1D( "hRawYieldsSigmaRatio", - ";#it{p}_{T} (GeV/#it{c});ratio #sigma_{1}/#sigma_{2}", nPtBins, ptLimits); + ";" + sliceVarName + "(" + sliceVarUnit + ");ratio #sigma_{1}/#sigma_{2}", nSliceVarBins, sliceVarLimits.data()); auto hRawYieldsSigma2 = new TH1D( - "hRawYieldsSigma2", ";#it{p}_{T} (GeV/#it{c});width (GeV/#it{c}^{2})", - nPtBins, ptLimits); + "hRawYieldsSigma2", ";" + sliceVarName + "(" + sliceVarUnit + ");width (GeV/#it{c}^{2})", + nSliceVarBins, sliceVarLimits.data()); auto hRawYieldsMean = new TH1D( - "hRawYieldsMean", ";#it{p}_{T} (GeV/#it{c});mean (GeV/#it{c}^{2})", - nPtBins, ptLimits); + "hRawYieldsMean", ";" + sliceVarName + "(" + sliceVarUnit + ");mean (GeV/#it{c}^{2})", + nSliceVarBins, sliceVarLimits.data()); auto hRawYieldsFracGaus2 = new TH1D( "hRawYieldsFracGaus2", - ";#it{p}_{T} (GeV/#it{c});second-gaussian fraction", nPtBins, ptLimits); + ";" + sliceVarName + "(" + sliceVarUnit + ");second-gaussian fraction", nSliceVarBins, sliceVarLimits.data()); auto hRawYieldsSignificance = new TH1D( "hRawYieldsSignificance", - ";#it{p}_{T} (GeV/#it{c});significance (3#sigma)", nPtBins, ptLimits); + ";" + sliceVarName + "(" + sliceVarUnit + ");significance (3#sigma)", nSliceVarBins, sliceVarLimits.data()); auto hRawYieldsSgnOverBkg = - new TH1D("hRawYieldsSgnOverBkg", ";#it{p}_{T} (GeV/#it{c});S/B (3#sigma)", - nPtBins, ptLimits); + new TH1D("hRawYieldsSgnOverBkg", ";" + sliceVarName + "(" + sliceVarUnit + ");S/B (3#sigma)", + nSliceVarBins, sliceVarLimits.data()); auto hRawYieldsSignal = - new TH1D("hRawYieldsSignal", ";#it{p}_{T} (GeV/#it{c});Signal (3#sigma)", - nPtBins, ptLimits); + new TH1D("hRawYieldsSignal", ";" + sliceVarName + "(" + sliceVarUnit + ");Signal (3#sigma)", + nSliceVarBins, sliceVarLimits.data()); auto hRawYieldsBkg = - new TH1D("hRawYieldsBkg", ";#it{p}_{T} (GeV/#it{c});Background (3#sigma)", - nPtBins, ptLimits); + new TH1D("hRawYieldsBkg", ";" + sliceVarName + "(" + sliceVarUnit + ");Background (3#sigma)", + nSliceVarBins, sliceVarLimits.data()); auto hRawYieldsChiSquare = new TH1D("hRawYieldsChiSquare", - ";#it{p}_{T} (GeV/#it{c});#chi^{2}/#it{ndf}", nPtBins, ptLimits); + ";" + sliceVarName + "(" + sliceVarUnit + ");#chi^{2}/#it{ndf}", nSliceVarBins, sliceVarLimits.data()); auto hRawYieldsSecondPeak = new TH1D( - "hRawYieldsSecondPeak", ";#it{p}_{T} (GeV/#it{c});raw yield second peak", - nPtBins, ptLimits); + "hRawYieldsSecondPeak", ";" + sliceVarName + "(" + sliceVarUnit + ");raw yield second peak", + nSliceVarBins, sliceVarLimits.data()); auto hRawYieldsMeanSecondPeak = new TH1D("hRawYieldsMeanSecondPeak", - ";#it{p}_{T} (GeV/#it{c});mean second peak (GeV/#it{c}^{2})", - nPtBins, ptLimits); + ";" + sliceVarName + "(" + sliceVarUnit + ");mean second peak (GeV/#it{c}^{2})", + nSliceVarBins, sliceVarLimits.data()); auto hRawYieldsSigmaSecondPeak = new TH1D("hRawYieldsSigmaSecondPeak", - ";#it{p}_{T} (GeV/#it{c});width second peak (GeV/#it{c}^{2})", - nPtBins, ptLimits); + ";" + sliceVarName + "(" + sliceVarUnit + ");width second peak (GeV/#it{c}^{2})", + nSliceVarBins, sliceVarLimits.data()); auto hRawYieldsSignificanceSecondPeak = new TH1D("hRawYieldsSignificanceSecondPeak", - ";#it{p}_{T} (GeV/#it{c});signficance second peak (3#sigma)", - nPtBins, ptLimits); + ";" + sliceVarName + "(" + sliceVarUnit + ");signficance second peak (3#sigma)", + nSliceVarBins, sliceVarLimits.data()); auto hRawYieldsSigmaRatioSecondFirstPeak = new TH1D("hRawYieldsSigmaRatioSecondFirstPeak", - ";#it{p}_{T} (GeV/#it{c});width second peak / width first peak", - nPtBins, ptLimits); + ";" + sliceVarName + "(" + sliceVarUnit + ");width second peak / width first peak", + nSliceVarBins, sliceVarLimits.data()); auto hRawYieldsSoverBSecondPeak = new TH1D( "hRawYieldsSoverBSecondPeak", - ";#it{p}_{T} (GeV/#it{c});S/B second peak (3#sigma)", nPtBins, ptLimits); + ";" + sliceVarName + "(" + sliceVarUnit + ");S/B second peak (3#sigma)", nSliceVarBins, sliceVarLimits.data()); auto hRawYieldsSignalSecondPeak = new TH1D( "hRawYieldsSignalSecondPeak", - ";#it{p}_{T} (GeV/#it{c});Signal second peak (3#sigma)", nPtBins, ptLimits); + ";" + sliceVarName + "(" + sliceVarUnit + ");Signal second peak (3#sigma)", nSliceVarBins, sliceVarLimits.data()); auto hRawYieldsBkgSecondPeak = new TH1D("hRawYieldsBkgSecondPeak", - ";#it{p}_{T} (GeV/#it{c});Background second peak (3#sigma)", - nPtBins, ptLimits); + ";" + sliceVarName + "(" + sliceVarUnit + ");Background second peak (3#sigma)", + nSliceVarBins, sliceVarLimits.data()); auto hReflectionOverSignal = - new TH1D("hReflectionOverSignal", ";#it{p}_{T} (GeV/#it{c});Refl/Signal", - nPtBins, ptLimits); + new TH1D("hReflectionOverSignal", ";" + sliceVarName + "(" + sliceVarUnit + ");Refl/Signal", + nSliceVarBins, sliceVarLimits.data()); const Int_t nConfigsToSave = 6; - auto hFitConfig = new TH2F("hfitConfig", "Fit Configurations", nConfigsToSave, 0, 6, nPtBins, ptLimits); + auto hFitConfig = new TH2F("hfitConfig", "Fit Configurations", nConfigsToSave, 0, 6, nSliceVarBins, sliceVarLimits.data()); const char* hFitConfigXLabel[nConfigsToSave] = {"mass min", "mass max", "rebin num", "fix sigma", "bkg func", "sgn func"}; hFitConfig->SetStats(0); hFitConfig->LabelsDeflate("X"); @@ -350,6 +329,7 @@ int runMassFitter(TString configFileName) } setHistoStyle(hRawYields); + setHistoStyle(hRawYieldsCounted); setHistoStyle(hRawYieldsSigma); setHistoStyle(hRawYieldsSigma2); setHistoStyle(hRawYieldsMean); @@ -369,53 +349,55 @@ int runMassFitter(TString configFileName) setHistoStyle(hRawYieldsBkgSecondPeak, kRed + 1); setHistoStyle(hReflectionOverSignal, kRed + 1); - TH1D* hSigmaToFix = NULL; + TH1* hSigmaToFix = nullptr; if (fixSigma) { if (fixSigmaManual.empty()) { auto inputFileSigma = TFile::Open(sigmaFile.data()); if (!inputFileSigma) { return -2; } - hSigmaToFix = static_cast(inputFileSigma->Get("hRawYieldsSigma")); + hSigmaToFix = inputFileSigma->Get("hRawYieldsSigma"); hSigmaToFix->SetDirectory(0); - if (static_cast(hSigmaToFix->GetNbinsX()) != nPtBins) { - cout << "WARNING: Different number of bins for this analysis and histo for fix sigma!" << endl; + if (static_cast(hSigmaToFix->GetNbinsX()) != nSliceVarBins) { + printf("WARNING: Different number of bins for this analysis and histo for fix sigma!\n"); } inputFileSigma->Close(); } } - TH1D* hMeanToFix = NULL; + TH1* hMeanToFix = nullptr; if (fixMean) { auto inputFileMean = TFile::Open(meanFile.data()); if (!inputFileMean) { return -3; } - hMeanToFix = static_cast(inputFileMean->Get("hRawYieldsMean")); + hMeanToFix = inputFileMean->Get("hRawYieldsMean"); hMeanToFix->SetDirectory(0); - if (static_cast(hMeanToFix->GetNbinsX()) != nPtBins) { - cout << "WARNING: Different number of bins for this analysis and histo for fix mean" << endl; + if (static_cast(hMeanToFix->GetNbinsX()) != nSliceVarBins) { + printf("WARNING: Different number of bins for this analysis and histo for fix mean\n"); } inputFileMean->Close(); } // fit histograms - TH1F* hMassForFit[nPtBins]; - TH1F* hMassForRefl[nPtBins]; - TH1F* hMassForSgn[nPtBins]; + std::vector hMassForFit(nSliceVarBins); + std::vector hMassForRefl(nSliceVarBins); + std::vector hMassForSgn(nSliceVarBins); Int_t canvasSize[2] = {1920, 1080}; - if (nPtBins == 1) { + if (nSliceVarBins == 1) { canvasSize[0] = 500; canvasSize[1] = 500; } Int_t nCanvasesMax = 20; // do not put more than 20 bins per canvas to make them visible - const Int_t nCanvases = ceil((float)nPtBins / nCanvasesMax); - TCanvas *canvasMass[nCanvases], *canvasResiduals[nCanvases], *canvasRefl[nCanvases]; + const Int_t nCanvases = ceil(static_cast(nSliceVarBins) / nCanvasesMax); + std::vector canvasMass(nCanvases); + std::vector canvasResiduals(nCanvases); + std::vector canvasRefl(nCanvases); for (int iCanvas = 0; iCanvas < nCanvases; iCanvas++) { - int nPads = (nCanvases == 1) ? nPtBins : nCanvasesMax; + int nPads = (nCanvases == 1) ? nSliceVarBins : nCanvasesMax; canvasMass[iCanvas] = new TCanvas(Form("canvasMass%d", iCanvas), Form("canvasMass%d", iCanvas), canvasSize[0], canvasSize[1]); divideCanvas(canvasMass[iCanvas], nPads); @@ -428,37 +410,41 @@ int runMassFitter(TString configFileName) divideCanvas(canvasRefl[iCanvas], nPads); } - for (unsigned int iPt = 0; iPt < nPtBins; iPt++) { - Int_t iCanvas = floor((float)iPt / nCanvasesMax); + for (unsigned int iSliceVar = 0; iSliceVar < nSliceVarBins; iSliceVar++) { + Int_t iCanvas = floor(static_cast(iSliceVar) / nCanvasesMax); - hMassForFit[iPt] = reinterpret_cast(hMass[iPt]->Rebin(nRebin[iPt])); + hMassForFit[iSliceVar] = static_cast(hMass[iSliceVar]->Rebin(nRebin[iSliceVar])); TString ptTitle = - Form("%0.1f < #it{p}_{T} < %0.1f GeV/#it{c}", ptMin[iPt], ptMax[iPt]); - hMassForFit[iPt]->SetTitle(Form("%s;%s;Counts per %0.f MeV/#it{c}^{2}", - ptTitle.Data(), massAxisTitle.Data(), - hMassForFit[iPt]->GetBinWidth(1) * 1000)); - hMassForFit[iPt]->SetName(Form("MassForFit%d", iPt)); + Form("%0.2f < " + sliceVarName + " < %0.2f " + sliceVarUnit, sliceVarMin[iSliceVar], sliceVarMax[iSliceVar]); + hMassForFit[iSliceVar]->SetTitle(Form("%s;%s;Counts per %0.1f MeV/#it{c}^{2}", + ptTitle.Data(), massAxisTitle.Data(), + hMassForFit[iSliceVar]->GetBinWidth(1) * 1000)); + hMassForFit[iSliceVar]->SetName(Form("MassForFit%d", iSliceVar)); if (enableRefl) { - hMassForRefl[iPt] = - reinterpret_cast(hMassRefl[iPt]->Rebin(nRebin[iPt])); - hMassForSgn[iPt] = - reinterpret_cast(hMassSgn[iPt]->Rebin(nRebin[iPt])); + hMassForRefl[iSliceVar] = static_cast(hMassRefl[iSliceVar]->Rebin(nRebin[iSliceVar])); + hMassForSgn[iSliceVar] = static_cast(hMassSgn[iSliceVar]->Rebin(nRebin[iSliceVar])); } Double_t reflOverSgn = 0; double markerSize = 1.; - if (nPtBins > 15) { + constexpr int NSliceVarBinsLarge = 15; + if (nSliceVarBins > NSliceVarBinsLarge) { markerSize = 0.5; } if (isMc) { HFInvMassFitter* massFitter; - massFitter = new HFInvMassFitter(hMassForFit[iPt], massMin[iPt], massMax[iPt], HFInvMassFitter::NoBkg, sgnFunc[iPt]); - massFitter->doFit(false); - - if (nPtBins > 1) { - canvasMass[iCanvas]->cd(iPt - nCanvasesMax * iCanvas + 1); + massFitter = new HFInvMassFitter(hMassForFit[iSliceVar], massMin[iSliceVar], massMax[iSliceVar], HFInvMassFitter::NoBkg, sgnFunc[iSliceVar]); + massFitter->setDrawBgPrefit(drawBgPrefit); + massFitter->setHighlightPeakRegion(highlightPeakRegion); + massFitter->setInitialGaussianMean(massPDG); + massFitter->setParticlePdgMass(massPDG); + massFitter->setBoundGaussianMean(massPDG, 0.8 * massPDG, 1.2 * massPDG); + massFitter->doFit(); + + if (nSliceVarBins > 1) { + canvasMass[iCanvas]->cd(iSliceVar - nCanvasesMax * iCanvas + 1); } else { canvasMass[iCanvas]->cd(); } @@ -467,6 +453,8 @@ int runMassFitter(TString configFileName) Double_t rawYield = massFitter->getRawYield(); Double_t rawYieldErr = massFitter->getRawYieldError(); + Double_t rawYieldCounted = massFitter->getRawYieldCounted(); + Double_t rawYieldCountedErr = massFitter->getRawYieldCountedError(); Double_t sigma = massFitter->getSigma(); Double_t sigmaErr = massFitter->getSigmaUncertainty(); @@ -474,53 +462,60 @@ int runMassFitter(TString configFileName) Double_t meanErr = massFitter->getMeanUncertainty(); Double_t reducedChiSquare = massFitter->getChiSquareOverNDF(); - hRawYields->SetBinContent(iPt + 1, rawYield); - hRawYields->SetBinError(iPt + 1, rawYieldErr); - hRawYieldsSigma->SetBinContent(iPt + 1, sigma); - hRawYieldsSigma->SetBinError(iPt + 1, sigmaErr); - hRawYieldsMean->SetBinContent(iPt + 1, mean); - hRawYieldsMean->SetBinError(iPt + 1, meanErr); - hRawYieldsChiSquare->SetBinContent(iPt + 1, reducedChiSquare); - hRawYieldsChiSquare->SetBinError(iPt + 1, 0.); + hRawYields->SetBinContent(iSliceVar + 1, rawYield); + hRawYields->SetBinError(iSliceVar + 1, rawYieldErr); + hRawYieldsCounted->SetBinContent(iSliceVar + 1, rawYieldCounted); + hRawYieldsCounted->SetBinError(iSliceVar + 1, rawYieldCountedErr); + hRawYieldsSigma->SetBinContent(iSliceVar + 1, sigma); + hRawYieldsSigma->SetBinError(iSliceVar + 1, sigmaErr); + hRawYieldsMean->SetBinContent(iSliceVar + 1, mean); + hRawYieldsMean->SetBinError(iSliceVar + 1, meanErr); + hRawYieldsChiSquare->SetBinContent(iSliceVar + 1, reducedChiSquare); + hRawYieldsChiSquare->SetBinError(iSliceVar + 1, 0.); } else { HFInvMassFitter* massFitter; - massFitter = new HFInvMassFitter(hMassForFit[iPt], massMin[iPt], massMax[iPt], - bkgFunc[iPt], sgnFunc[iPt]); + massFitter = new HFInvMassFitter(hMassForFit[iSliceVar], massMin[iSliceVar], massMax[iSliceVar], + bkgFunc[iSliceVar], sgnFunc[iSliceVar]); + massFitter->setDrawBgPrefit(drawBgPrefit); + massFitter->setHighlightPeakRegion(highlightPeakRegion); + massFitter->setInitialGaussianMean(massPDG); + massFitter->setParticlePdgMass(massPDG); + massFitter->setBoundGaussianMean(massPDG, 0.8 * massPDG, 1.2 * massPDG); if (useLikelihood) { massFitter->setUseLikelihoodFit(); } if (fixMean) { - massFitter->setFixGaussianMean(hMeanToFix->GetBinContent(iPt + 1)); + massFitter->setFixGaussianMean(hMeanToFix->GetBinContent(iSliceVar + 1)); } if (fixSigma) { if (fixSigmaManual.empty()) { - massFitter->setFixGaussianSigma(hSigmaToFix->GetBinContent(iPt + 1)); - cout << "*****************************" - << "\n" - << "FIXED SIGMA: " << hSigmaToFix->GetBinContent(iPt + 1) << "\n" - << "*****************************" << endl; + massFitter->setFixGaussianSigma(hSigmaToFix->GetBinContent(iSliceVar + 1)); + printf("*****************************\n"); + printf("FIXED SIGMA: %f\n", hSigmaToFix->GetBinContent(iSliceVar + 1)); + printf("*****************************\n"); } else if (!fixSigmaManual.empty()) { - massFitter->setFixGaussianSigma(fixSigmaManual[iPt]); - cout << "*****************************" - << "\n" - << "FIXED SIGMA: " << fixSigmaManual[iPt] << "\n" - << "*****************************" << endl; + massFitter->setFixGaussianSigma(fixSigmaManual[iSliceVar]); + printf("*****************************\n"); + printf("FIXED SIGMA: %f\n", fixSigmaManual[iSliceVar]); + printf("*****************************\n"); } else { - cout << "WARNING: impossible to fix sigma! Wrong fix sigma file or value!" << endl; + printf("WARNING: impossible to fix sigma! Wrong fix sigma file or value!\n"); } } if (enableRefl) { - reflOverSgn = hMassForSgn[iPt]->Integral(hMassForSgn[iPt]->FindBin(massMin[iPt] * 1.0001), hMassForSgn[iPt]->FindBin(massMax[iPt] * 0.999)); - reflOverSgn = hMassForRefl[iPt]->Integral(hMassForRefl[iPt]->FindBin(massMin[iPt] * 1.0001), hMassForRefl[iPt]->FindBin(massMax[iPt] * 0.999)) / reflOverSgn; + reflOverSgn = hMassForSgn[iSliceVar]->Integral(hMassForSgn[iSliceVar]->FindBin(massMin[iSliceVar] * 1.0001), hMassForSgn[iSliceVar]->FindBin(massMax[iSliceVar] * 0.999)); + reflOverSgn = hMassForRefl[iSliceVar]->Integral(hMassForRefl[iSliceVar]->FindBin(massMin[iSliceVar] * 1.0001), hMassForRefl[iSliceVar]->FindBin(massMax[iSliceVar] * 0.999)) / reflOverSgn; massFitter->setFixReflOverSgn(reflOverSgn); - massFitter->setTemplateReflections(hMassRefl[iPt], HFInvMassFitter::DoubleGaus); + massFitter->setTemplateReflections(hMassRefl[iSliceVar], HFInvMassFitter::DoubleGaus); } - massFitter->doFit(false); + massFitter->doFit(); double rawYield = massFitter->getRawYield(); double rawYieldErr = massFitter->getRawYieldError(); + double rawYieldCounted = massFitter->getRawYieldCounted(); + double rawYieldCountedErr = massFitter->getRawYieldCountedError(); double sigma = massFitter->getSigma(); double sigmaErr = massFitter->getSigmaUncertainty(); double mean = massFitter->getMean(); @@ -531,29 +526,31 @@ int runMassFitter(TString configFileName) double bkg = massFitter->getBkgYield(); double bkgErr = massFitter->getBkgYieldError(); - hRawYields->SetBinContent(iPt + 1, rawYield); - hRawYields->SetBinError(iPt + 1, rawYieldErr); - hRawYieldsSigma->SetBinContent(iPt + 1, sigma); - hRawYieldsSigma->SetBinError(iPt + 1, sigmaErr); - hRawYieldsMean->SetBinContent(iPt + 1, mean); - hRawYieldsMean->SetBinError(iPt + 1, meanErr); - hRawYieldsSignificance->SetBinContent(iPt + 1, significance); - hRawYieldsSignificance->SetBinError(iPt + 1, significanceErr); - hRawYieldsSgnOverBkg->SetBinContent(iPt + 1, rawYield / bkg); - hRawYieldsSgnOverBkg->SetBinError(iPt + 1, rawYield / bkg * std::sqrt(rawYieldErr / rawYield * rawYieldErr / rawYield + bkgErr / bkg * bkgErr / bkg)); - hRawYieldsSignal->SetBinContent(iPt + 1, rawYield); - hRawYieldsSignal->SetBinError(iPt + 1, rawYieldErr); - hRawYieldsBkg->SetBinContent(iPt + 1, bkg); - hRawYieldsBkg->SetBinError(iPt + 1, bkgErr); - hRawYieldsChiSquare->SetBinContent(iPt + 1, reducedChiSquare); - hRawYieldsChiSquare->SetBinError(iPt + 1, 1.e-20); + hRawYields->SetBinContent(iSliceVar + 1, rawYield); + hRawYields->SetBinError(iSliceVar + 1, rawYieldErr); + hRawYieldsCounted->SetBinContent(iSliceVar + 1, rawYieldCounted); + hRawYieldsCounted->SetBinError(iSliceVar + 1, rawYieldCountedErr); + hRawYieldsSigma->SetBinContent(iSliceVar + 1, sigma); + hRawYieldsSigma->SetBinError(iSliceVar + 1, sigmaErr); + hRawYieldsMean->SetBinContent(iSliceVar + 1, mean); + hRawYieldsMean->SetBinError(iSliceVar + 1, meanErr); + hRawYieldsSignificance->SetBinContent(iSliceVar + 1, significance); + hRawYieldsSignificance->SetBinError(iSliceVar + 1, significanceErr); + hRawYieldsSgnOverBkg->SetBinContent(iSliceVar + 1, rawYield / bkg); + hRawYieldsSgnOverBkg->SetBinError(iSliceVar + 1, rawYield / bkg * std::sqrt(rawYieldErr / rawYield * rawYieldErr / rawYield + bkgErr / bkg * bkgErr / bkg)); + hRawYieldsSignal->SetBinContent(iSliceVar + 1, rawYield); + hRawYieldsSignal->SetBinError(iSliceVar + 1, rawYieldErr); + hRawYieldsBkg->SetBinContent(iSliceVar + 1, bkg); + hRawYieldsBkg->SetBinError(iSliceVar + 1, bkgErr); + hRawYieldsChiSquare->SetBinContent(iSliceVar + 1, reducedChiSquare); + hRawYieldsChiSquare->SetBinError(iSliceVar + 1, 1.e-20); if (enableRefl) { - hReflectionOverSignal->SetBinContent(iPt + 1, reflOverSgn); + hReflectionOverSignal->SetBinContent(iSliceVar + 1, reflOverSgn); } if (enableRefl) { - if (nPtBins > 1) { - canvasRefl[iCanvas]->cd(iPt - nCanvasesMax * iCanvas + 1); + if (nSliceVarBins > 1) { + canvasRefl[iCanvas]->cd(iSliceVar - nCanvasesMax * iCanvas + 1); } else { canvasRefl[iCanvas]->cd(); } @@ -562,8 +559,8 @@ int runMassFitter(TString configFileName) canvasRefl[iCanvas]->Update(); } - if (nPtBins > 1) { - canvasMass[iCanvas]->cd(iPt - nCanvasesMax * iCanvas + 1); + if (nSliceVarBins > 1) { + canvasMass[iCanvas]->cd(iSliceVar - nCanvasesMax * iCanvas + 1); } else { canvasMass[iCanvas]->cd(); } @@ -571,8 +568,8 @@ int runMassFitter(TString configFileName) canvasMass[iCanvas]->Modified(); canvasMass[iCanvas]->Update(); - if (nPtBins > 1) { - canvasResiduals[iCanvas]->cd(iPt - nCanvasesMax * iCanvas + 1); + if (nSliceVarBins > 1) { + canvasResiduals[iCanvas]->cd(iSliceVar - nCanvasesMax * iCanvas + 1); } else { canvasResiduals[iCanvas]->cd(); } @@ -581,18 +578,18 @@ int runMassFitter(TString configFileName) canvasResiduals[iCanvas]->Update(); } - hFitConfig->SetBinContent(1, iPt + 1, massMin[iPt]); - hFitConfig->SetBinContent(2, iPt + 1, massMax[iPt]); - hFitConfig->SetBinContent(3, iPt + 1, nRebin[iPt]); + hFitConfig->SetBinContent(1, iSliceVar + 1, massMin[iSliceVar]); + hFitConfig->SetBinContent(2, iSliceVar + 1, massMax[iSliceVar]); + hFitConfig->SetBinContent(3, iSliceVar + 1, nRebin[iSliceVar]); if (fixSigma) { if (fixSigmaManual.empty()) { - hFitConfig->SetBinContent(4, iPt + 1, hSigmaToFix->GetBinContent(iPt + 1)); + hFitConfig->SetBinContent(4, iSliceVar + 1, hSigmaToFix->GetBinContent(iSliceVar + 1)); } else { - hFitConfig->SetBinContent(4, iPt + 1, fixSigmaManual[iPt]); + hFitConfig->SetBinContent(4, iSliceVar + 1, fixSigmaManual[iSliceVar]); } } - hFitConfig->SetBinContent(5, iPt + 1, bkgFuncConfig[iPt]); - hFitConfig->SetBinContent(6, iPt + 1, sgnFuncConfig[iPt]); + hFitConfig->SetBinContent(5, iSliceVar + 1, bkgFuncConfig[iSliceVar]); + hFitConfig->SetBinContent(6, iSliceVar + 1, sgnFuncConfig[iSliceVar]); } // save output histograms @@ -605,10 +602,11 @@ int runMassFitter(TString configFileName) } } - for (unsigned int iPt = 0; iPt < nPtBins; iPt++) { - hMass[iPt]->Write(); + for (unsigned int iSliceVar = 0; iSliceVar < nSliceVarBins; iSliceVar++) { + hMass[iSliceVar]->Write(); } hRawYields->Write(); + hRawYieldsCounted->Write(); hRawYieldsSigma->Write(); hRawYieldsMean->Write(); hRawYieldsSignificance->Write(); @@ -654,7 +652,7 @@ int runMassFitter(TString configFileName) return 0; } -void setHistoStyle(TH1* histo, int color, double markerSize) +void setHistoStyle(TH1* histo, Color_t color, Size_t markerSize) { histo->SetStats(kFALSE); histo->SetMarkerSize(markerSize); @@ -664,33 +662,13 @@ void setHistoStyle(TH1* histo, int color, double markerSize) histo->SetLineColor(color); } -void divideCanvas(TCanvas* canvas, int nPtBins) +void divideCanvas(TCanvas* canvas, int nSliceVarBins) { - if (nPtBins < 2) { - canvas->cd(); - } else if (nPtBins == 2 || nPtBins == 3) { - canvas->Divide(nPtBins, 1); - } else if (nPtBins == 4 || nPtBins == 6 || nPtBins == 8) { - canvas->Divide(nPtBins / 2, 2); - } else if (nPtBins == 5 || nPtBins == 7) { - canvas->Divide((nPtBins + 1) / 2, 2); - } else if (nPtBins == 9 || nPtBins == 12 || nPtBins == 15) { - canvas->Divide(nPtBins / 3, 3); - } else if (nPtBins == 10 || nPtBins == 11) { - canvas->Divide(4, 3); - } else if (nPtBins == 13 || nPtBins == 14) { - canvas->Divide(5, 3); - } else if (nPtBins > 15 && nPtBins <= 20 && nPtBins % 4 == 0) { - canvas->Divide(nPtBins / 4, 4); - } else if (nPtBins > 15 && nPtBins <= 20 && nPtBins % 4 != 0) { - canvas->Divide(5, 4); - } else if (nPtBins == 21) { - canvas->Divide(7, 3); - } else if (nPtBins > 21 && nPtBins <= 25) { - canvas->Divide(5, 5); - } else if (nPtBins > 25 && nPtBins % 2 == 0) { - canvas->Divide(nPtBins / 2, 2); - } else { - canvas->Divide((nPtBins + 1) / 2, 2); + const int rectangularSideMin = std::floor(std::sqrt(nSliceVarBins)); + constexpr int RectangularSidesDiffMax = 2; + for (int rectangularSidesDiff = 0; rectangularSidesDiff < RectangularSidesDiffMax; ++rectangularSidesDiff) { + if (rectangularSideMin * (rectangularSideMin + rectangularSidesDiff) >= nSliceVarBins) { + canvas->Divide(rectangularSideMin + rectangularSidesDiff, rectangularSideMin); + } } } From 211092cb27976c08d07d00818b5319f1460fc453 Mon Sep 17 00:00:00 2001 From: Noor Koster <82090643+cnkoster@users.noreply.github.com> Date: Tue, 20 May 2025 13:07:33 +0200 Subject: [PATCH 1337/1650] [PWGCF] Add extra histos and clenup MC (#11208) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/TableProducer/zdcQVectors.cxx | 15 +- PWGCF/Flow/Tasks/flowSP.cxx | 231 ++++++++++++++--------- 2 files changed, 145 insertions(+), 101 deletions(-) diff --git a/PWGCF/Flow/TableProducer/zdcQVectors.cxx b/PWGCF/Flow/TableProducer/zdcQVectors.cxx index f0052000fe6..77f436b383e 100644 --- a/PWGCF/Flow/TableProducer/zdcQVectors.cxx +++ b/PWGCF/Flow/TableProducer/zdcQVectors.cxx @@ -120,12 +120,6 @@ struct ZdcQVectors { O2_DEFINE_CONFIGURABLE(cfgNGlobal, bool, false, "Set centrality estimator to cfgNGlobal"); O2_DEFINE_CONFIGURABLE(cfgVtxZ, float, 10.0f, "Accepted z-vertex range") - O2_DEFINE_CONFIGURABLE(cfgCutPtPOIMin, float, 0.2f, "Minimal.q pT for poi tracks") - O2_DEFINE_CONFIGURABLE(cfgCutPtPOIMax, float, 10.0f, "Maximal pT for poi tracks") - O2_DEFINE_CONFIGURABLE(cfgCutPtMin, float, 0.2f, "Minimal pT for ref tracks") - O2_DEFINE_CONFIGURABLE(cfgCutPtMax, float, 3.0f, "Maximal pT for ref tracks") - O2_DEFINE_CONFIGURABLE(cfgCutEta, float, 0.8f, "Eta range for tracks") - O2_DEFINE_CONFIGURABLE(cfgCutChi2prTPCcls, float, 2.5, "Chi2 per TPC clusters") O2_DEFINE_CONFIGURABLE(cfgMagField, float, 99999, "Configurable magnetic field; default CCDB will be queried") O2_DEFINE_CONFIGURABLE(cfgEnergyCal, std::string, "Users/c/ckoster/ZDC/LHC23_zzh_pass4/Energy", "ccdb path for energy calibration histos") O2_DEFINE_CONFIGURABLE(cfgMeanv, std::string, "Users/c/ckoster/ZDC/LHC23_zzh_pass4/vmean", "ccdb path for mean v histos") @@ -240,11 +234,13 @@ struct ZdcQVectors { registry.add("QA/ZNA_Energy", "ZNA_Energy", kTProfile, {{8, 0, 8}}); registry.add("QA/ZNC_Energy", "ZNC_Energy", kTProfile, {{8, 0, 8}}); + registry.add("QA/before/ZNA_pmC", "ZNA_pmC", kTProfile, {{1, 0, 1.}}); registry.add("QA/before/ZNA_pm1", "ZNA_pm1", kTProfile, {{1, 0, 1.}}); registry.add("QA/before/ZNA_pm2", "ZNA_pm2", kTProfile, {{1, 0, 1.}}); registry.add("QA/before/ZNA_pm3", "ZNA_pm3", kTProfile, {{1, 0, 1.}}); registry.add("QA/before/ZNA_pm4", "ZNA_pm4", kTProfile, {{1, 0, 1.}}); + registry.add("QA/before/ZNC_pmC", "ZNC_pmC", kTProfile, {{1, 0, 1.}}); registry.add("QA/before/ZNC_pm1", "ZNC_pm1", kTProfile, {{1, 0, 1.}}); registry.add("QA/before/ZNC_pm2", "ZNC_pm2", kTProfile, {{1, 0, 1.}}); registry.add("QA/before/ZNC_pm3", "ZNC_pm3", kTProfile, {{1, 0, 1.}}); @@ -539,7 +535,8 @@ struct ZdcQVectors { if (cfgNGlobal) cent = collision.centNGlobal(); - registry.fill(HIST("QA/centrality_before"), cent); + if (cfgFillCommonRegistry) + registry.fill(HIST("QA/centrality_before"), cent); if (!eventSelected(collision, cent)) { // event not selected @@ -672,16 +669,18 @@ struct ZdcQVectors { registry.fill(HIST("QA/ZNC_Energy"), bincenter, eZN[i + 4]); registry.fill(HIST("QA/ZNC_Energy"), bincenter + 4, e[i + 4]); + registry.get(HIST("QA/before/ZNA_pmC"))->Fill(Form("%d", runnumber), meanEZN[0]); registry.get(HIST("QA/before/ZNA_pm1"))->Fill(Form("%d", runnumber), eZN[0]); registry.get(HIST("QA/before/ZNA_pm2"))->Fill(Form("%d", runnumber), eZN[1]); registry.get(HIST("QA/before/ZNA_pm3"))->Fill(Form("%d", runnumber), eZN[2]); registry.get(HIST("QA/before/ZNA_pm4"))->Fill(Form("%d", runnumber), eZN[3]); + + registry.get(HIST("QA/before/ZNC_pmC"))->Fill(Form("%d", runnumber), meanEZN[5]); registry.get(HIST("QA/before/ZNC_pm1"))->Fill(Form("%d", runnumber), eZN[4]); registry.get(HIST("QA/before/ZNC_pm2"))->Fill(Form("%d", runnumber), eZN[5]); registry.get(HIST("QA/before/ZNC_pm3"))->Fill(Form("%d", runnumber), eZN[6]); registry.get(HIST("QA/before/ZNC_pm4"))->Fill(Form("%d", runnumber), eZN[7]); - registry.get(HIST("QA/after/ZNA_pm1"))->Fill(Form("%d", runnumber), e[0]); registry.get(HIST("QA/after/ZNA_pm2"))->Fill(Form("%d", runnumber), e[1]); registry.get(HIST("QA/after/ZNA_pm3"))->Fill(Form("%d", runnumber), e[2]); registry.get(HIST("QA/after/ZNA_pm4"))->Fill(Form("%d", runnumber), e[3]); diff --git a/PWGCF/Flow/Tasks/flowSP.cxx b/PWGCF/Flow/Tasks/flowSP.cxx index 0d524aadcdf..4b7df991de2 100644 --- a/PWGCF/Flow/Tasks/flowSP.cxx +++ b/PWGCF/Flow/Tasks/flowSP.cxx @@ -79,10 +79,10 @@ struct FlowSP { O2_DEFINE_CONFIGURABLE(cfgFillWeightsPOS, bool, false, "Fill NUA weights only for positive charges"); O2_DEFINE_CONFIGURABLE(cfgFillWeightsNEG, bool, false, "Fill NUA weights only for negative charges"); // Additional track Selections - O2_DEFINE_CONFIGURABLE(cfgTrackSelsUseAdditionalTrackCut, bool, true, "Bool to enable Additional Track Cut"); + O2_DEFINE_CONFIGURABLE(cfgTrackSelsUseAdditionalTrackCut, bool, false, "Bool to enable Additional Track Cut"); O2_DEFINE_CONFIGURABLE(cfgTrackSelsDoubleTrackFunction, bool, true, "Include track cut at low pt"); O2_DEFINE_CONFIGURABLE(cfgTrackSelsTrackCutSize, float, 0.06, "Spread of track cut"); - O2_DEFINE_CONFIGURABLE(cfgTrackSelsDoDCApt, bool, true, "Apply Pt dependent DCAz cut"); + O2_DEFINE_CONFIGURABLE(cfgTrackSelsDoDCApt, bool, false, "Apply Pt dependent DCAz cut"); O2_DEFINE_CONFIGURABLE(cfgTrackSelsDCApt1, float, 0.1, "DcaZ < a * b / pt^1.1 -> this sets a"); O2_DEFINE_CONFIGURABLE(cfgTrackSelsDCApt2, float, 0.035, "DcaZ < a * b / pt^1.1 -> this sets b"); // Additional event selections @@ -173,13 +173,14 @@ struct FlowSP { evSel_kNoCollInTimeRangeStandard, evSel_kIsVertexITSTPC, evSel_MultCuts, - evSel_CentCuts, evSel_kIsGoodITSLayersAll, evSel_isSelectedZDC, - nEventSelections + nEventSelections, + evSel_CentCuts }; enum TrackSelectionsUnFiltered { + trackSel_ZeroCharge, trackSel_Eta, trackSel_Pt, trackSel_DCAxy, @@ -188,7 +189,6 @@ struct FlowSP { trackSel_NCls, trackSel_FshCls, trackSel_TPCBoundary, - trackSel_ZeroCharge, trackSel_ParticleWeights, nTrackSelections }; @@ -210,7 +210,7 @@ struct FlowSP { }; static constexpr std::string_view Charge[] = {"incl/", "pos/", "neg/"}; - static constexpr std::string_view Time[] = {"before/", "after"}; + static constexpr std::string_view Time[] = {"before/", "after/"}; void init(InitContext const&) { @@ -285,16 +285,17 @@ struct FlowSP { if (doprocessData || doprocessMCReco) { // track QA for pos, neg, incl - registry.add("incl/QA/hPt", "", kTH1D, {axisPt}); - registry.add("incl/QA/hPhi", "", kTH1D, {axisPhi}); - registry.add("incl/QA/hPhiCorrected", "", kTH1D, {axisPhi}); - registry.add("incl/QA/hEta", "", kTH1D, {axisEta}); - registry.add("incl/QA/hPhi_Eta_vz", "", kTH3D, {axisPhi, axisEta, axisVz}); - registry.add("incl/QA/hDCAxy_pt", "", kTH2D, {axisPt, axisDCAxy}); - registry.add("incl/QA/hDCAz_pt", "", kTH2D, {axisPt, axisDCAz}); - registry.add("incl/QA/hSharedClusters_pt", "", {HistType::kTH2D, {axisPt, axisShCl}}); - registry.add("incl/QA/hCrossedRows_pt", "", {HistType::kTH2D, {axisPt, axisCl}}); - registry.add("incl/QA/hCrossedRows_vs_SharedClusters", "", {HistType::kTH2D, {axisCl, axisShCl}}); + registry.add("incl/QA/before/hPt", "", kTH1D, {axisPt}); + registry.add("incl/QA/before/hPhi", "", kTH1D, {axisPhi}); + registry.add("incl/QA/before/hEta", "", kTH1D, {axisEta}); + registry.add("incl/QA/before/hPhi_Eta_vz", "", kTH3D, {axisPhi, axisEta, axisVz}); + registry.add("incl/QA/before/hDCAxy_pt", "", kTH2D, {axisPt, axisDCAxy}); + registry.add("incl/QA/before/hDCAz_pt", "", kTH2D, {axisPt, axisDCAz}); + registry.add("incl/QA/before/hSharedClusters_pt", "", {HistType::kTH2D, {axisPt, axisShCl}}); + registry.add("incl/QA/before/hCrossedRows_pt", "", {HistType::kTH2D, {axisPt, axisCl}}); + registry.add("incl/QA/before/hCrossedRows_vs_SharedClusters", "", {HistType::kTH2D, {axisCl, axisShCl}}); + + registry.addClone("incl/QA/before/", "incl/QA/after/"); } } @@ -347,20 +348,22 @@ struct FlowSP { } if (cfgFillMixedHarmonics) { - registry.add("incl/vnAxCxUx_pt_MH", "", kTProfile, {axisPt}); - registry.add("incl/vnAxCyUx_pt_MH", "", kTProfile, {axisPt}); - registry.add("incl/vnAxCyUy_pt_MH", "", kTProfile, {axisPt}); - registry.add("incl/vnAyCxUy_pt_MH", "", kTProfile, {axisPt}); - - registry.add("incl/vnAxCxUx_cent_MH", "", kTProfile, {axisCent}); - registry.add("incl/vnAxCyUx_cent_MH", "", kTProfile, {axisCent}); - registry.add("incl/vnAxCyUy_cent_MH", "", kTProfile, {axisCent}); - registry.add("incl/vnAyCxUy_cent_MH", "", kTProfile, {axisCent}); - - registry.add("incl/vnAxCxUx_eta_MH", "", kTProfile, {axisEtaVn}); - registry.add("incl/vnAxCyUx_eta_MH", "", kTProfile, {axisEtaVn}); - registry.add("incl/vnAxCyUy_eta_MH", "", kTProfile, {axisEtaVn}); - registry.add("incl/vnAyCxUy_eta_MH", "", kTProfile, {axisEtaVn}); + registry.add("incl/v2/vnAxCxUx_pt_MH", "", kTProfile, {axisPt}); + registry.add("incl/v2/vnAxCyUx_pt_MH", "", kTProfile, {axisPt}); + registry.add("incl/v2/vnAxCyUy_pt_MH", "", kTProfile, {axisPt}); + registry.add("incl/v2/vnAyCxUy_pt_MH", "", kTProfile, {axisPt}); + + registry.add("incl/v2/vnAxCxUx_cent_MH", "", kTProfile, {axisCent}); + registry.add("incl/v2/vnAxCyUx_cent_MH", "", kTProfile, {axisCent}); + registry.add("incl/v2/vnAxCyUy_cent_MH", "", kTProfile, {axisCent}); + registry.add("incl/v2/vnAyCxUy_cent_MH", "", kTProfile, {axisCent}); + + registry.add("incl/v2/vnAxCxUx_eta_MH", "", kTProfile, {axisEtaVn}); + registry.add("incl/v2/vnAxCyUx_eta_MH", "", kTProfile, {axisEtaVn}); + registry.add("incl/v2/vnAxCyUy_eta_MH", "", kTProfile, {axisEtaVn}); + registry.add("incl/v2/vnAyCxUy_eta_MH", "", kTProfile, {axisEtaVn}); + + registry.addClone("incl/v2/", "incl/v3/"); } if (cfgFillEventPlane) { @@ -387,6 +390,8 @@ struct FlowSP { registry.add("QA/hSPplaneC", "hSPplaneC", kTH1D, {axisPhiPlane}); registry.add("QA/hSPplaneFull", "hSPplaneFull", kTH1D, {axisPhiPlane}); + registry.add("QA/hCentFull", " ; Centrality (%); ", {HistType::kTH1D, {axisCent}}); + registry.add("QA/hCosPhiACosPhiC", "hCosPhiACosPhiC; Centrality(%); #LT Cos(#Psi^{A})Cos(#Psi^{C})#GT", kTProfile, {axisCent}); registry.add("QA/hSinPhiASinPhiC", "hSinPhiASinPhiC; Centrality(%); #LT Sin(#Psi^{A})Sin(#Psi^{C})#GT", kTProfile, {axisCent}); registry.add("QA/hSinPhiACosPhiC", "hSinPhiACosPhiC; Centrality(%); #LT Sin(#Psi^{A})Cos(#Psi^{C})#GT", kTProfile, {axisCent}); @@ -441,9 +446,9 @@ struct FlowSP { registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_kNoCollInTimeRangeStandard + 1, "kNoCollInTimeRangeStandard"); registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_kIsVertexITSTPC + 1, "kIsVertexITSTPC"); registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_MultCuts + 1, "Mult cuts (Alex)"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_CentCuts + 1, "Cenrality range"); registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_kIsGoodITSLayersAll + 1, "kkIsGoodITSLayersAll"); registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_isSelectedZDC + 1, "isSelected"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_CentCuts + 1, "Cenrality range"); registry.add("hTrackCount", "Number of Tracks; Cut; #Tracks Passed Cut", {HistType::kTH1D, {{nTrackSelections, 0, nTrackSelections}}}); registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_Eta + 1, "Eta"); @@ -648,7 +653,7 @@ struct FlowSP { } template - bool eventSelected(TCollision collision, const int& multTrk, const float& centrality) + bool eventSelected(TCollision collision, const int& multTrk) { if (!collision.sel8()) return 0; @@ -731,10 +736,6 @@ struct FlowSP { registry.fill(HIST("hEventCount"), evSel_MultCuts); } - if (centrality > cfgCentMax || centrality < cfgCentMin) - return 0; - registry.fill(HIST("hEventCount"), evSel_CentCuts); - if (cfgEvSelsIsGoodITSLayersAll) { if (!collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { // New event selection bits to cut time intervals with dead ITS staves @@ -857,37 +858,37 @@ struct FlowSP { registry.fill(HIST(Charge[ct]) + HIST("vnC_pt"), track.pt(), (uy * qyC + ux * qxC) / std::sqrt(std::fabs(corrQQ)), wacc * weff); if (cfgFillMixedHarmonics) { - registry.fill(HIST(Charge[ct]) + HIST("vnAxCxUx_eta_MH"), track.eta(), (uxMH * qxA * qxC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUx_eta_MH"), track.eta(), (uxMH * qyA * qyC) / corrQQy, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUy_eta_MH"), track.eta(), (uyMH * qxA * qyC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAyCxUy_eta_MH"), track.eta(), (uyMH * qyA * qxC) / corrQQy, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("v2/vnAxCxUx_eta_MH"), track.eta(), (uxMH * qxA * qxC) / corrQQx, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("v2/vnAxCyUx_eta_MH"), track.eta(), (uxMH * qyA * qyC) / corrQQy, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("v2/vnAxCyUy_eta_MH"), track.eta(), (uyMH * qxA * qyC) / corrQQx, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("v2/vnAyCxUy_eta_MH"), track.eta(), (uyMH * qyA * qxC) / corrQQy, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAxCxUx_pt_MH"), track.pt(), (uxMH * qxA * qxC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUx_pt_MH"), track.pt(), (uxMH * qyA * qyC) / corrQQy, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUy_pt_MH"), track.pt(), (uyMH * qxA * qyC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAyCxUy_pt_MH"), track.pt(), (uyMH * qyA * qxC) / corrQQy, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("v2/vnAxCxUx_pt_MH"), track.pt(), (uxMH * qxA * qxC) / corrQQx, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("v2/vnAxCyUx_pt_MH"), track.pt(), (uxMH * qyA * qyC) / corrQQy, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("v2/vnAxCyUy_pt_MH"), track.pt(), (uyMH * qxA * qyC) / corrQQx, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("v2/vnAyCxUy_pt_MH"), track.pt(), (uyMH * qyA * qxC) / corrQQy, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAxCxUx_cent_MH"), centrality, (uxMH * qxA * qxC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUx_cent_MH"), centrality, (uxMH * qyA * qyC) / corrQQy, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUy_cent_MH"), centrality, (uyMH * qxA * qyC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAyCxUy_cent_MH"), centrality, (uyMH * qyA * qxC) / corrQQy, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("v2/vnAxCxUx_cent_MH"), centrality, (uxMH * qxA * qxC) / corrQQx, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("v2/vnAxCyUx_cent_MH"), centrality, (uxMH * qyA * qyC) / corrQQy, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("v2/vnAxCyUy_cent_MH"), centrality, (uyMH * qxA * qyC) / corrQQx, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("v2/vnAyCxUy_cent_MH"), centrality, (uyMH * qyA * qxC) / corrQQy, wacc * weff); // -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - registry.fill(HIST(Charge[ct]) + HIST("vnAxCxUx_eta_MH"), track.eta(), (uxMH2 * qxA * qxC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUx_eta_MH"), track.eta(), (uxMH2 * qyA * qyC) / corrQQy, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUy_eta_MH"), track.eta(), (uyMH2 * qxA * qyC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAyCxUy_eta_MH"), track.eta(), (uyMH2 * qyA * qxC) / corrQQy, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("v3/vnAxCxUx_eta_MH"), track.eta(), (uxMH2 * qxA * qxC) / corrQQx, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("v3/vnAxCyUx_eta_MH"), track.eta(), (uxMH2 * qyA * qyC) / corrQQy, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("v3/vnAxCyUy_eta_MH"), track.eta(), (uyMH2 * qxA * qyC) / corrQQx, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("v3/vnAyCxUy_eta_MH"), track.eta(), (uyMH2 * qyA * qxC) / corrQQy, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAxCxUx_pt_MH"), track.pt(), (uxMH2 * qxA * qxC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUx_pt_MH"), track.pt(), (uxMH2 * qyA * qyC) / corrQQy, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUy_pt_MH"), track.pt(), (uyMH2 * qxA * qyC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAyCxUy_pt_MH"), track.pt(), (uyMH2 * qyA * qxC) / corrQQy, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("v3/vnAxCxUx_pt_MH"), track.pt(), (uxMH2 * qxA * qxC) / corrQQx, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("v3/vnAxCyUx_pt_MH"), track.pt(), (uxMH2 * qyA * qyC) / corrQQy, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("v3/vnAxCyUy_pt_MH"), track.pt(), (uyMH2 * qxA * qyC) / corrQQx, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("v3/vnAyCxUy_pt_MH"), track.pt(), (uyMH2 * qyA * qxC) / corrQQy, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAxCxUx_cent_MH"), centrality, (uxMH2 * qxA * qxC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUx_cent_MH"), centrality, (uxMH2 * qyA * qyC) / corrQQy, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAxCyUy_cent_MH"), centrality, (uyMH2 * qxA * qyC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAyCxUy_cent_MH"), centrality, (uyMH2 * qyA * qxC) / corrQQy, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("v3/vnAxCxUx_cent_MH"), centrality, (uxMH2 * qxA * qxC) / corrQQx, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("v3/vnAxCyUx_cent_MH"), centrality, (uxMH2 * qyA * qyC) / corrQQy, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("v3/vnAxCyUy_cent_MH"), centrality, (uyMH2 * qxA * qyC) / corrQQx, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("v3/vnAyCxUy_cent_MH"), centrality, (uyMH2 * qyA * qxC) / corrQQy, wacc * weff); } if (cfgFillXandYterms) { @@ -947,19 +948,20 @@ struct FlowSP { } } - template + template inline void fillTrackQA(TrackObject track, double vz, float wacc = 1, float weff = 1) { - registry.fill(HIST(Charge[ct]) + HIST("QA/hPt"), track.pt()); - registry.fill(HIST(Charge[ct]) + HIST("QA/hPhi"), track.phi()); - registry.fill(HIST(Charge[ct]) + HIST("QA/hPhiCorrected"), track.phi(), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("QA/hEta"), track.eta()); - registry.fill(HIST(Charge[ct]) + HIST("QA/hPhi_Eta_vz"), track.phi(), track.eta(), vz); - registry.fill(HIST(Charge[ct]) + HIST("QA/hDCAxy_pt"), track.pt(), track.dcaXY()); - registry.fill(HIST(Charge[ct]) + HIST("QA/hDCAz_pt"), track.pt(), track.dcaZ()); - registry.fill(HIST(Charge[ct]) + HIST("QA/hSharedClusters_pt"), track.pt(), track.tpcFractionSharedCls()); - registry.fill(HIST(Charge[ct]) + HIST("QA/hCrossedRows_pt"), track.pt(), track.tpcNClsFound()); - registry.fill(HIST(Charge[ct]) + HIST("QA/hCrossedRows_vs_SharedClusters"), track.tpcNClsFound(), track.tpcFractionSharedCls()); + static constexpr std::string_view Time[] = {"before/", "after/"}; + + registry.fill(HIST(Charge[ct]) + HIST("QA/") + HIST(Time[ft]) + HIST("hPt"), track.pt(), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("QA/") + HIST(Time[ft]) + HIST("hPhi"), track.phi(), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("QA/") + HIST(Time[ft]) + HIST("hEta"), track.eta(), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("QA/") + HIST(Time[ft]) + HIST("hPhi_Eta_vz"), track.phi(), track.eta(), vz, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("QA/") + HIST(Time[ft]) + HIST("hDCAxy_pt"), track.pt(), track.dcaXY(), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("QA/") + HIST(Time[ft]) + HIST("hDCAz_pt"), track.pt(), track.dcaZ(), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("QA/") + HIST(Time[ft]) + HIST("hSharedClusters_pt"), track.pt(), track.tpcFractionSharedCls(), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("QA/") + HIST(Time[ft]) + HIST("hCrossedRows_pt"), track.pt(), track.tpcNClsFound(), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("QA/") + HIST(Time[ft]) + HIST("hCrossedRows_vs_SharedClusters"), track.tpcNClsFound(), track.tpcFractionSharedCls(), wacc * weff); } template @@ -999,6 +1001,18 @@ struct FlowSP { } } + template + inline void fillPrimaryHistos(McParticleObject mcparticle) + { + static constexpr std::string_view Time[] = {"/before", "/after"}; + + if (!mcparticle.isPhysicalPrimary()) { + registry.fill(HIST("trackMCReco") + HIST(Time[md]) + HIST("/hIsPhysicalPrimary"), 0); + } else { + registry.fill(HIST("trackMCReco") + HIST(Time[md]) + HIST("/hIsPhysicalPrimary"), 1); + } + } + void processData(UsedCollisions::iterator const& collision, aod::BCsWithTimestamps const&, UsedTracks const& tracks) { registry.fill(HIST("hEventCount"), evSel_FilteredEvent); @@ -1027,7 +1041,7 @@ struct FlowSP { if (cfgCentNGlobal) centrality = collision.centNGlobal(); - if (!eventSelected(collision, tracks.size(), centrality)) + if (!eventSelected(collision, tracks.size())) return; if (collision.isSelected()) { @@ -1047,8 +1061,7 @@ struct FlowSP { double psiFull = 1.0 * std::atan2(qyA + qyC, qxA + qxC); if (cfgFillQAHistos) { - fillEventQA(collision, tracks); - + registry.fill(HIST("QA/hCentFull"), centrality, 1); registry.fill(HIST("QA/hSPplaneA"), psiA, 1); registry.fill(HIST("QA/hSPplaneC"), psiC, 1); registry.fill(HIST("QA/hSPplaneFull"), psiFull, 1); @@ -1065,6 +1078,14 @@ struct FlowSP { registry.fill(HIST("QA/qAqCY"), centrality, qyA * qyC); } + if (centrality > cfgCentMax || centrality < cfgCentMin) + return; + + registry.fill(HIST("hEventCount"), evSel_CentCuts); + + if (cfgFillQAHistos) + fillEventQA(collision, tracks); + double corrQQ = 1., corrQQx = 1., corrQQy = 1.; // Load correlations and SP resolution needed for Scalar Product and event plane methods. @@ -1105,15 +1126,24 @@ struct FlowSP { float weffP = 1., waccP = 1.; float weffN = 1., waccN = 1.; - if (!trackSelected(track, field)) - continue; - if (track.sign() == 0.0) continue; registry.fill(HIST("hTrackCount"), trackSel_ZeroCharge); bool pos = (track.sign() > 0) ? true : false; + // Fill QA histograms before track selection + if (cfgFillQAHistos) { + fillTrackQA(track, vtxz); + if (pos) + fillTrackQA(track, vtxz); + else + fillTrackQA(track, vtxz); + } + + if (!trackSelected(track, field)) + continue; + // Fill NUA weights if (cfgFillWeights) { fWeights->fill(track.phi(), track.eta(), vtxz, track.pt(), centrality, 0); @@ -1161,20 +1191,23 @@ struct FlowSP { fillHistograms(track, wacc, weff, ux, uy, uxMH, uyMH, uxMH2, uyMH2, qxA, qyA, qxC, qyC, corrQQx, corrQQy, corrQQ, vnA, vnC, vnFull, centrality); if (cfgFillQAHistos) - fillTrackQA(track, vtxz, wacc, weff); + fillTrackQA(track, vtxz, wacc, weff); if (cfgFillChargeDependence) { if (pos) { fillHistograms(track, wacc, weff, ux, uy, uxMH, uyMH, uxMH2, uyMH2, qxA, qyA, qxC, qyC, corrQQx, corrQQy, corrQQ, vnA, vnC, vnFull, centrality); - fillTrackQA(track, vtxz, waccP, weffP); + if (cfgFillQAHistos) + fillTrackQA(track, vtxz, waccP, weffP); } else { fillHistograms(track, wacc, weff, ux, uy, uxMH, uyMH, uxMH2, uyMH2, qxA, qyA, qxC, qyC, corrQQx, corrQQy, corrQQ, vnA, vnC, vnFull, centrality); - fillTrackQA(track, vtxz, waccN, weffN); + if (cfgFillQAHistos) + fillTrackQA(track, vtxz, waccN, weffN); } } } // end of track loop } // end of collision isSelected loop } + PROCESS_SWITCH(FlowSP, processData, "Process analysis for non-derived data", true); void processMCReco(CC const& collision, aod::BCsWithTimestamps const&, TCs const& tracks, FilteredTCs const& filteredTracks, aod::McParticles const&) @@ -1197,9 +1230,14 @@ struct FlowSP { if (cfgFillQAHistos) fillEventQA(collision, tracks); - if (!eventSelected(collision, filteredTracks.size(), centrality)) + if (!eventSelected(collision, filteredTracks.size())) + return; + + if (centrality > cfgCentMax || centrality < cfgCentMin) return; + registry.fill(HIST("hEventCount"), evSel_CentCuts); + if (!collision.has_mcCollision()) { LOGF(info, "No mccollision found for this collision"); return; @@ -1220,12 +1258,8 @@ struct FlowSP { fillMCPtHistos(track, mcParticle.pdgCode()); - if (!mcParticle.isPhysicalPrimary()) { - registry.fill(HIST("trackMCReco/before/hIsPhysicalPrimary"), 0); - continue; - } else { - registry.fill(HIST("trackMCReco/before/hIsPhysicalPrimary"), 1); - } + if (cfgFillQAHistos) + fillTrackQA(track, vtxz); if (!trackSelected(track, field)) continue; @@ -1233,7 +1267,7 @@ struct FlowSP { fillMCPtHistos(track, mcParticle.pdgCode()); if (cfgFillQAHistos) - fillTrackQA(track, vtxz); + fillTrackQA(track, vtxz); } // end of track loop } @@ -1273,16 +1307,29 @@ struct FlowSP { centrality = col.centFV0A(); if (cfgCentNGlobal) centrality = col.centNGlobal(); - fillEventQA(col, trackSlice); + + if (cfgFillQAHistos) + fillEventQA(col, trackSlice); + if (trackSlice.size() < 1) { colSelected = false; continue; } - if (!eventSelected(col, filteredTrackSlice.size(), centrality)) { + if (!eventSelected(col, filteredTrackSlice.size())) { + colSelected = false; + continue; + } + + if (centrality > cfgCentMax || centrality < cfgCentMin) { colSelected = false; continue; } - fillEventQA(col, trackSlice); + registry.fill(HIST("hEventCount"), evSel_CentCuts); + + if (cfgFillQAHistos) + fillEventQA(col, trackSlice); + + } // leave reconstructed collision loop if (!colSelected) continue; @@ -1294,7 +1341,6 @@ struct FlowSP { continue; int charge = 0; - ; auto pdgCode = particle.pdgCode(); auto pdgInfo = pdg->GetParticle(pdgCode); @@ -1330,7 +1376,6 @@ struct FlowSP { registry.fill(HIST("trackMCGen/after/neg/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); } } - } } } PROCESS_SWITCH(FlowSP, processMCGen, "Process analysis for MC generated events", false); From 67a0c2c30c6041dc16ee18b4b22f8476505564f9 Mon Sep 17 00:00:00 2001 From: Bhagyarathi Sahoo Date: Tue, 20 May 2025 18:52:04 +0530 Subject: [PATCH 1338/1650] [PWGDQ] Adding 2-prong signal inside new processMCGen (#11210) Co-authored-by: ALICE Action Bot --- PWGDQ/Tasks/dqEfficiency_withAssoc.cxx | 40 +++++++++++++++++++------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx index 4a38eab9952..9630c8275b5 100644 --- a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx +++ b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx @@ -1252,7 +1252,7 @@ struct AnalysisSameEventPairing { Configurable recSignals{"cfgBarrelMCRecSignals", "", "Comma separated list of MC signals (reconstructed)"}; Configurable recSignalsJSON{"cfgMCRecSignalsJSON", "", "Comma separated list of MC signals (reconstructed) via JSON"}; Configurable skimSignalOnly{"cfgSkimSignalOnly", false, "Configurable to select only matched candidates"}; - Configurable runMCGenPair{"cfgRunMCGenPair", false, "Do pairing of true MC particles"}; + // Configurable runMCGenPair{"cfgRunMCGenPair", false, "Do pairing of true MC particles"}; } fConfigMC; struct : ConfigurableGroup { @@ -2050,9 +2050,9 @@ struct AnalysisSameEventPairing { runSameEventPairing(events, trackAssocsPerCollision, barrelAssocs, barrelTracks, mcEvents, mcTracks); runSameEventPairing(events, muonAssocsPerCollision, muonAssocs, muons, mcEvents, mcTracks); // Feature replaced by processMCGen - if (fConfigMC.runMCGenPair) { + /*if (fConfigMC.runMCGenPair) { runMCGen(mcEvents, mcTracks); - } + }*/ // runSameEventPairing(event, tracks, muons); } @@ -2062,9 +2062,9 @@ struct AnalysisSameEventPairing { { runSameEventPairing(events, trackAssocsPerCollision, barrelAssocs, barrelTracks, mcEvents, mcTracks); // Feature replaced by processMCGen - if (fConfigMC.runMCGenPair) { + /*if (fConfigMC.runMCGenPair) { runMCGen(mcEvents, mcTracks); - } + }*/ } void processBarrelOnlyWithCollSkimmed(MyEventsVtxCovSelected const& events, @@ -2073,9 +2073,9 @@ struct AnalysisSameEventPairing { { runSameEventPairing(events, trackAssocsPerCollision, barrelAssocs, barrelTracks, mcEvents, mcTracks); // Feature replaced by processMCGen - if (fConfigMC.runMCGenPair) { - runMCGen(mcEvents, mcTracks); - } + /* if (fConfigMC.runMCGenPair) { + runMCGen(mcEvents, mcTracks); + }*/ } void processMuonOnlySkimmed(MyEventsVtxCovSelected const& events, @@ -2083,9 +2083,9 @@ struct AnalysisSameEventPairing { { runSameEventPairing(events, muonAssocsPerCollision, muonAssocs, muons, mcEvents, mcTracks); // Feature replaced by processMCGen - if (fConfigMC.runMCGenPair) { - runMCGen(mcEvents, mcTracks); - } + /* if (fConfigMC.runMCGenPair) { + runMCGen(mcEvents, mcTracks); + }*/ } PresliceUnsorted perReducedMcGenEvent = aod::reducedtrackMC::reducedMCeventId; @@ -2126,6 +2126,24 @@ struct AnalysisSameEventPairing { } } } // end loop over reconstructed events + if (fHasTwoProngGenMCsignals) { + for (auto& [t1, t2] : combinations(mcTracks, mcTracks)) { + auto t1_raw = mcTracks.rawIteratorAt(t1.globalIndex()); + auto t2_raw = mcTracks.rawIteratorAt(t2.globalIndex()); + if (t1_raw.reducedMCeventId() == t2_raw.reducedMCeventId()) { + for (auto& sig : fGenMCSignals) { + if (sig->GetNProngs() != 2) { // NOTE: 2-prong signals required here + continue; + } + if (sig->CheckSignal(true, t1_raw, t2_raw)) { + // mcDecision |= (static_cast(1) << isig); + VarManager::FillPairMC(t1, t2); // NOTE: This feature will only work for muons + fHistMan->FillHistClass(Form("MCTruthGenPair_%s", sig->GetName()), VarManager::fgValues); + } + } + } + } + } } void processDummy(MyEvents&) From c11ccaf8fc35f213cf7232e8d853eec4306b8d9b Mon Sep 17 00:00:00 2001 From: Rashi gupta <167059733+rashigupt@users.noreply.github.com> Date: Tue, 20 May 2025 22:03:42 +0530 Subject: [PATCH 1339/1650] [PWGHF] Add configuration and electron hadron table (#10920) Co-authored-by: Rashi Gupta --- PWGHF/HFC/DataModel/CorrelationTables.h | 31 +++- .../TableProducer/correlatorHfeHadrons.cxx | 148 +++++++++++------- PWGHF/HFC/Tasks/taskCorrelationHfeHadrons.cxx | 32 ++-- PWGHF/HFL/DataModel/ElectronSelectionTable.h | 11 +- .../electronSelectionWithTpcEmcal.cxx | 134 ++++++++-------- 5 files changed, 208 insertions(+), 148 deletions(-) diff --git a/PWGHF/HFC/DataModel/CorrelationTables.h b/PWGHF/HFC/DataModel/CorrelationTables.h index 3dad5548b27..370f3738975 100644 --- a/PWGHF/HFC/DataModel/CorrelationTables.h +++ b/PWGHF/HFC/DataModel/CorrelationTables.h @@ -473,6 +473,29 @@ DECLARE_SOA_TABLE(DmesonSelection, "AOD", "DINCOLL", // Selection of D meson in aod::hf_selection_dmeson_collision::DmesonSel); // Note: definition of columns and tables for Electron Hadron correlation pairs +namespace hf_electron +{ +DECLARE_SOA_COLUMN(PhiElectron, phiElectron, float); //! Phi of electron +DECLARE_SOA_COLUMN(EtaElectron, etaElectron, float); //! Eta of electron +DECLARE_SOA_COLUMN(PtElectron, ptElectron, float); //! Transverse momentum of electron +DECLARE_SOA_COLUMN(NElectronsLS, nElectronsLS, int); //! number of like-sign +DECLARE_SOA_COLUMN(NElectronsUS, nElectronsUS, int); //! number of Unlike-sign +DECLARE_SOA_COLUMN(PoolBin, poolBin, int); //! Pool Bin of event defined using zvtx and multiplicit +DECLARE_SOA_COLUMN(GIndexCol, gIndexCol, int); //! Global index for the collision +DECLARE_SOA_COLUMN(TimeStamp, timeStamp, int64_t); //! Timestamp for the collision + +} // namespace hf_electron + +DECLARE_SOA_TABLE(HfElectron, "AOD", "HFELECTRON", //! Hf Electron properties + aod::hf_electron::PhiElectron, + aod::hf_electron::EtaElectron, + aod::hf_electron::PtElectron, + aod::hf_electron::NElectronsLS, + aod::hf_electron::NElectronsUS, + aod::hf_electron::PoolBin, + aod::hf_electron::GIndexCol, + aod::hf_electron::TimeStamp); + namespace hf_correlation_electron_hadron { DECLARE_SOA_COLUMN(DeltaPhi, deltaPhi, float); //! DeltaPhi between Electron and Hadrons @@ -480,8 +503,8 @@ DECLARE_SOA_COLUMN(DeltaEta, deltaEta, float); //! DeltaEta between Electron DECLARE_SOA_COLUMN(PtElectron, ptElectron, float); //! Transverse momentum of Electron DECLARE_SOA_COLUMN(PtHadron, ptHadron, float); //! Transverse momentum of Hadron; DECLARE_SOA_COLUMN(PoolBin, poolBin, int); //! Pool Bin of event defined using zvtx and multiplicity -DECLARE_SOA_COLUMN(IsLSEHCorr, isLSEHCorr, int); //! like sign Electron hadron coorelation -DECLARE_SOA_COLUMN(IsULSEHCorr, isULSEHCorr, int); //! unLike sign Electron hadron coorelation +DECLARE_SOA_COLUMN(NPairsLS, nPairsLS, int); //! number of like-sign electron-hadron pairs +DECLARE_SOA_COLUMN(NPairsUS, nPairsUS, int); //! number of unlike-sign electron-hadron pairs } // namespace hf_correlation_electron_hadron DECLARE_SOA_TABLE(HfEHadronPair, "AOD", "HFEHADRONPAIR", //! Hfe-Hadrons pairs Informations hf_correlation_electron_hadron::DeltaPhi, @@ -489,8 +512,8 @@ DECLARE_SOA_TABLE(HfEHadronPair, "AOD", "HFEHADRONPAIR", //! Hfe-Hadrons pairs I hf_correlation_electron_hadron::PtElectron, hf_correlation_electron_hadron::PtHadron, hf_correlation_electron_hadron::PoolBin, - hf_correlation_electron_hadron::IsLSEHCorr, - hf_correlation_electron_hadron::IsULSEHCorr); + hf_correlation_electron_hadron::NPairsLS, + hf_correlation_electron_hadron::NPairsUS); // Note: definition of columns and tables for Electron Hadron correlation pairs for MC Gen namespace hf_correlation_mcgenelectron_hadron diff --git a/PWGHF/HFC/TableProducer/correlatorHfeHadrons.cxx b/PWGHF/HFC/TableProducer/correlatorHfeHadrons.cxx index 2a463696be2..25b5d476269 100644 --- a/PWGHF/HFC/TableProducer/correlatorHfeHadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorHfeHadrons.cxx @@ -47,6 +47,8 @@ struct HfCorrelatorHfeHadrons { Produces entryElectronHadronPair; Produces entryElectronHadronPairmcGen; + Produces entryElectron; + Produces entryHadron; // Configurables // Event Selection Configurable zPvPosMax{"zPvPosMax", 10., "Maximum z of the primary vertex (cm)"}; @@ -78,37 +80,36 @@ struct HfCorrelatorHfeHadrons { ConfigurableAxis binsDeltaEta{"binsDeltaEta", {30, -1.8, 1.8}, "#it{#Delta#eta}"}; ConfigurableAxis binsDeltaPhi{"binsDeltaPhi", {32, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, "#it{#Delta#varphi}"}; - ConfigurableAxis binsP{"binsP", {50, 0.0, 50}, "#it{p_{T}}(GeV/#it{c})"}; - - HistogramConfigSpec hCorrelSpec{HistType::kTHnSparseD, {{binsP}, {binsP}, {binsDeltaPhi}, {binsDeltaEta}}}; + ConfigurableAxis binsPt{"binsPt", {50, 0.0, 50}, "#it{p_{T}}(GeV/#it{c})"}; + ConfigurableAxis binsPoolBin{"binsPoolBin", {9, 0., 9.}, "PoolBin"}; HistogramRegistry registry{ "registry", - {{"hInclusiveEHCorrel", "Sparse for Delta phi and Delta eta Inclusive Electron with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, - {"hLSEHCorrel", "Sparse for Delta phi and Delta eta Like sign Electron pair with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, - {"hULSEHCorrel", "Sparse for Delta phi and Delta eta UnLike sign Electron pair with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, - {"hMCgenNonHfEHCorrel", "Sparse for Delta phi and Delta eta Non Hf for McGen Inclusive Electron with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, - {"hMCgenInclusiveEHCorrl", "Sparse for Delta phi and Delta eta for McGen Electron pair with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, - {"hptElectron", "hptElectron", {HistType::kTH1F, {{binsP}}}}, - - {"hMixEventInclusiveEHCorrl", "Sparse for mix event Delta phi and Delta eta Inclusive Electron with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, - {"hMixEventLSEHCorrel", "Sparse for mix event Delta phi and Delta eta Like sign Electron pair with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, - {"hMixEventULSEHCorrel", "Sparse for mix event Delta phi and Delta eta Unlike sign Electron pair with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, - {"hMixEventMcGenInclusiveEHCorrl", "Sparse for mix event Delta phi and Delta eta Mc gen Inclusive Electron with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, - {"hMixEventMcGenNonHfEHCorrl", "Sparse for mix event Delta phi and Delta eta Mc gen Inclusive Electron with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}}}; + {}}; void init(InitContext&) { - registry.get(HIST("hInclusiveEHCorrel"))->Sumw2(); - registry.get(HIST("hLSEHCorrel"))->Sumw2(); - registry.get(HIST("hULSEHCorrel"))->Sumw2(); - registry.get(HIST("hMCgenInclusiveEHCorrl"))->Sumw2(); - registry.get(HIST("hMCgenNonHfEHCorrel"))->Sumw2(); - registry.get(HIST("hMixEventInclusiveEHCorrl"))->Sumw2(); - registry.get(HIST("hMixEventLSEHCorrel"))->Sumw2(); - registry.get(HIST("hMixEventULSEHCorrel"))->Sumw2(); - registry.get(HIST("hMixEventMcGenInclusiveEHCorrl"))->Sumw2(); - registry.get(HIST("hMixEventMcGenNonHfEHCorrl"))->Sumw2(); + AxisSpec axisDeltaEta = {binsDeltaEta, "#Delta #eta = #eta_{Electron}- #eta_{Hadron}"}; + AxisSpec axisDeltaPhi = {binsDeltaPhi, "#Delta #varphi = #varphi_{Electron}- #varphi_{Hadron}"}; + AxisSpec axisPt = {binsPt, "#it{p_{T}}(GeV/#it{c})"}; + AxisSpec axisPoolBin = {binsPoolBin, "PoolBin"}; + + registry.add("hInclusiveEHCorrel", "Sparse for Delta phi and Delta eta Inclusive Electron with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", {HistType::kTHnSparseF, {{axisPt}, {axisPt}, {axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hLSEHCorrel", "Sparse for Delta phi and Delta eta Like sign Electron pair with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", {HistType::kTHnSparseF, {{axisPt}, {axisPt}, {axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hULSEHCorrel", "Sparse for Delta phi and Delta eta UnLike sign Electron pair with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", {HistType::kTHnSparseF, {{axisPt}, {axisPt}, {axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hMCgenNonHfEHCorrel", "Sparse for Delta phi and Delta eta for McGen Non Hf Electron with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", {HistType::kTHnSparseF, {{axisPt}, {axisPt}, {axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hMCgenInclusiveEHCorrl", "Sparse for Delta phi and Delta eta for McGen Electron pair with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", {HistType::kTHnSparseF, {{axisPt}, {axisPt}, {axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hptElectron", "hptElectron", {HistType::kTH1D, {axisPt}}); + + registry.add("hMixEventInclusiveEHCorrl", "Sparse for mix event Delta phi and Delta eta Inclusive Electron with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", {HistType::kTHnSparseF, {{axisPt}, {axisPt}, {axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hMixEventLSEHCorrel", "Sparse for mix event Delta phi and Delta eta Like sign Electron pair with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", {HistType::kTHnSparseF, {{axisPt}, {axisPt}, {axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hMixEventULSEHCorrel", "Sparse for mix event Delta phi and Delta eta Unlike sign Electron pair with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", {HistType::kTHnSparseF, {{axisPt}, {axisPt}, {axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hMixEventMcGenInclusiveEHCorrl", "Sparse for mix event Delta phi and Delta eta Mc gen Inclusive Electron with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", {HistType::kTHnSparseF, {{axisPt}, {axisPt}, {axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hMixEventMcGenNonHfEHCorrl", "Sparse for mix event Delta phi and Delta eta Mc gen Non Hf Inclusive Electron with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", {HistType::kTHnSparseF, {{axisPt}, {axisPt}, {axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hElectronBin", "Electron bin", {HistType::kTH1D, {axisPoolBin}}); + registry.add("hLSElectronBin", "Electron bin", {HistType::kTH1D, {axisPoolBin}}); + registry.add("hULSElectronBin", "Electron bin", {HistType::kTH1D, {axisPoolBin}}); + registry.add("hTracksBin", "Particles associated pool bin", {HistType::kTH1D, {axisPoolBin}}); } // Associated Hadron Selection Cut @@ -132,18 +133,22 @@ struct HfCorrelatorHfeHadrons { } // Electron-hadron Correlation - template - void fillCorrelation(CollisionType const& collision, ElectronType const& electron, TracksType const& tracks) + template + void fillCorrelation(CollisionType const& collision, ElectronType const& electron, TracksType const& tracks, BcType const&) { if (!(isRun3 ? collision.sel8() : (collision.sel7() && collision.alias_bit(kINT7)))) return; int poolBin = corrBinning.getBin(std::make_tuple(collision.posZ(), collision.multFV0M())); + auto bc = collision.template bc_as(); + int gCollisionId = collision.globalIndex(); + int64_t timeStamp = bc.timestamp(); // Construct Deta Phi between electrons and hadrons double ptElectron = -999; double phiElectron = -999; double etaElectron = -999; + int nElectron = 0; for (const auto& eTrack : electron) { ptElectron = eTrack.ptTrack(); @@ -155,51 +160,76 @@ struct HfCorrelatorHfeHadrons { double ptHadron = -999; double etaHadron = -999; double phiHadron = -999; + if (!eTrack.isEmcal()) { continue; } registry.fill(HIST("hptElectron"), ptElectron); + int nElectronLS = 0; + int nElectronUS = 0; + if (eTrack.nElPairLS() > 0) { + for (int i = 0; i < eTrack.nElPairLS(); ++i) { - for (const auto& hTrack : tracks) { - if (hTrack.globalIndex() == eTrack.trackId()) { - continue; + ++nElectronLS; + registry.fill(HIST("hLSElectronBin"), poolBin); } + } + if (eTrack.nElPairUS() > 0) { + for (int i = 0; i < eTrack.nElPairUS(); ++i) { + ++nElectronUS; + registry.fill(HIST("hULSElectronBin"), poolBin); + } + } + + registry.fill(HIST("hElectronBin"), poolBin); + entryElectron(phiElectron, etaElectron, ptElectron, nElectronLS, nElectronUS, poolBin, gCollisionId, timeStamp); + + for (const auto& hTrack : tracks) { // Apply Hadron cut if (!selAssoHadron(hTrack)) { continue; } - - ptHadron = hTrack.pt(); - phiHadron = hTrack.phi(); - etaHadron = hTrack.eta(); + if (nElectron == 0) { + registry.fill(HIST("hTracksBin"), poolBin); + entryHadron(phiHadron, etaHadron, ptHadron, poolBin, gCollisionId, timeStamp); + } + if (hTrack.globalIndex() == eTrack.trackId()) { + continue; + } if (ptCondition && (ptElectron < ptHadron)) { continue; } + ptHadron = hTrack.pt(); + phiHadron = hTrack.phi(); + etaHadron = hTrack.eta(); deltaPhi = RecoDecay::constrainAngle(phiElectron - phiHadron, -o2::constants::math::PIHalf); deltaEta = etaElectron - etaHadron; registry.fill(HIST("hInclusiveEHCorrel"), ptElectron, ptHadron, deltaPhi, deltaEta); - int isLSElectroncorr = 0; - int isULSElectroncorr = 0; - if (eTrack.isLSElectron() > 0) { - for (int i = 0; i < eTrack.isLSElectron(); ++i) { + int nElHadLSCorr = 0; + int nElHadUSCorr = 0; + if (eTrack.nElPairLS() > 0) { + for (int i = 0; i < eTrack.nElPairLS(); ++i) { + + ++nElHadLSCorr; registry.fill(HIST("hLSEHCorrel"), ptElectron, ptHadron, deltaPhi, deltaEta); - ++isLSElectroncorr; } } - if (eTrack.isULSElectron() > 0) { - for (int i = 0; i < eTrack.isULSElectron(); ++i) { + if (eTrack.nElPairUS() > 0) { + for (int i = 0; i < eTrack.nElPairUS(); ++i) { registry.fill(HIST("hULSEHCorrel"), ptElectron, ptHadron, deltaPhi, deltaEta); - ++isULSElectroncorr; + ++nElHadUSCorr; } } - entryElectronHadronPair(deltaPhi, deltaEta, ptElectron, ptHadron, poolBin, isLSElectroncorr, isULSElectroncorr); - } - } + entryElectronHadronPair(deltaPhi, deltaEta, ptElectron, ptHadron, poolBin, nElHadLSCorr, nElHadUSCorr); + + } // end Hadron Track loop + nElectron++; + } // end Electron loop } // mix event electron-hadron correlation @@ -241,23 +271,23 @@ struct HfCorrelatorHfeHadrons { deltaEtaMix = etaElectronMix - etaHadronMix; registry.fill(HIST("hMixEventInclusiveEHCorrl"), ptElectronMix, ptHadronMix, deltaPhiMix, deltaEtaMix); - int isLSElectroncorr = 0; - int isULSElectroncorr = 0; - if (t1.isLSElectron() > 0) { - for (int i = 0; i < t1.isLSElectron(); ++i) { + int nElHadLSCorr = 0; + int nElHadUSCorr = 0; + if (t1.nElPairLS() > 0) { + for (int i = 0; i < t1.nElPairLS(); ++i) { registry.fill(HIST("hMixEventLSEHCorrel"), ptElectronMix, ptHadronMix, deltaPhiMix, deltaEtaMix); - ++isLSElectroncorr; + ++nElHadLSCorr; } } - if (t1.isULSElectron() > 0) { - for (int i = 0; i < t1.isULSElectron(); ++i) { + if (t1.nElPairUS() > 0) { + for (int i = 0; i < t1.nElPairUS(); ++i) { registry.fill(HIST("hMixEventULSEHCorrel"), ptElectronMix, ptHadronMix, deltaPhiMix, deltaEtaMix); - ++isULSElectroncorr; + ++nElHadUSCorr; } } - entryElectronHadronPair(deltaPhiMix, deltaEtaMix, ptElectronMix, ptHadronMix, poolBin, isLSElectroncorr, isULSElectroncorr); + entryElectronHadronPair(deltaPhiMix, deltaEtaMix, ptElectronMix, ptHadronMix, poolBin, nElHadLSCorr, nElHadUSCorr); } } @@ -265,12 +295,12 @@ struct HfCorrelatorHfeHadrons { void processData(TableCollision const& collision, aod::HfCorrSelEl const& electron, - TableTracks const& tracks) + TableTracks const& tracks, aod::BCsWithTimestamps const& bc) { - fillCorrelation(collision, electron, tracks); + fillCorrelation(collision, electron, tracks, bc); } - PROCESS_SWITCH(HfCorrelatorHfeHadrons, processData, "Process for Data", false); + PROCESS_SWITCH(HfCorrelatorHfeHadrons, processData, "Process for Data", true); // ======= Process starts for McRec, Same event ============ @@ -278,7 +308,7 @@ struct HfCorrelatorHfeHadrons { aod::HfCorrSelEl const& mcElectron, McTableTracks const& mcTracks) { - fillCorrelation(mcCollision, mcElectron, mcTracks); + fillCorrelation(mcCollision, mcElectron, mcTracks, 0); } PROCESS_SWITCH(HfCorrelatorHfeHadrons, processMcRec, "Process MC Reco mode", false); @@ -339,7 +369,7 @@ struct HfCorrelatorHfeHadrons { } } } - PROCESS_SWITCH(HfCorrelatorHfeHadrons, processMcGen, "Process MC Gen mode", true); + PROCESS_SWITCH(HfCorrelatorHfeHadrons, processMcGen, "Process MC Gen mode", false); // ====================== Implement Event mixing on Data =============================== // ====================== Implement Event mixing on Data =================================== diff --git a/PWGHF/HFC/Tasks/taskCorrelationHfeHadrons.cxx b/PWGHF/HFC/Tasks/taskCorrelationHfeHadrons.cxx index 44db8479632..94786e27372 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationHfeHadrons.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationHfeHadrons.cxx @@ -31,23 +31,25 @@ struct HfTaskCorrelationHfeHadrons { // Deltaphi binning Configurable nBinsDeltaPhi{"nBinsDeltaPhi", 32, "Bins for #Delta#varphi bins"}; - HistogramConfigSpec hCorrelSpec{HistType::kTHnSparseD, {{30, 0., 30.}, {20, 0., 20.}, {nBinsDeltaPhi, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {50, -1.8, 1.8}}}; + ConfigurableAxis binsDeltaEta{"binsDeltaEta", {30, -1.8, 1.8}, "#it{#Delta#eta}"}; + ConfigurableAxis binsDeltaPhi{"binsDeltaPhi", {32, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, "#it{#Delta#varphi}"}; + ConfigurableAxis binsPt{"binsPt", {50, 0.0, 50}, "#it{p_{T}}(GeV/#it{c})"}; HistogramRegistry registry{ "registry", - {{"hInclusiveEHCorrel", "Sparse for Delta phi and Delta eta Inclusive Electron with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, - {"hLikeSignEHCorrel", "Sparse for Delta phi and Delta eta Likesign Electronpair with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, - {"hUnLikeSignEHCorrel", "Sparse for Delta phi and Delta eta UnlikeSign Electron pair with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, - {"hMcGenInclusiveEHCorrel", "Sparse for Delta phi and Delta eta McGen Inclusive Electron with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}, - {"hMcGenNonHfEHCorrel", "Sparse for Delta phi and Delta eta McGen Non HF Electron with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", hCorrelSpec}}}; + {}}; void init(InitContext&) { - registry.get(HIST("hInclusiveEHCorrel"))->Sumw2(); - registry.get(HIST("hLikeSignEHCorrel"))->Sumw2(); - registry.get(HIST("hUnLikeSignEHCorrel"))->Sumw2(); - registry.get(HIST("hMcGenInclusiveEHCorrel"))->Sumw2(); - registry.get(HIST("hMcGenNonHfEHCorrel"))->Sumw2(); + AxisSpec axisDeltaEta = {binsDeltaEta, "#Delta #eta = #eta_{Electron}- #eta_{Hadron}"}; + AxisSpec axisDeltaPhi = {binsDeltaPhi, "#Delta #varphi = #varphi_{Electron}- #varphi_{Hadron}"}; + AxisSpec axisPt = {binsPt, "#it{p_{T}}(GeV/#it{c})"}; + + registry.add("hInclusiveEHCorrel", "Sparse for Delta phi and Delta eta Inclusive Electron with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", {HistType::kTHnSparseF, {{axisPt}, {axisPt}, {axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hLikeSignEHCorrel", "Sparse for Delta phi and Delta eta Like sign Electron pair with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", {HistType::kTHnSparseF, {{axisPt}, {axisPt}, {axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hUnLikeSignEHCorrel", "Sparse for Delta phi and Delta eta UnLike sign Electron pair with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", {HistType::kTHnSparseF, {{axisPt}, {axisPt}, {axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hMcGenInclusiveEHCorrel", "Sparse for Delta phi and Delta eta for McGen Inclusive Electron with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", {HistType::kTHnSparseF, {{axisPt}, {axisPt}, {axisDeltaPhi}, {axisDeltaEta}}}); + registry.add("hMcGenNonHfEHCorrel", "Sparse for Delta phi and Delta eta for McGen NonHeavy flavour Electron pair with Hadron;p_{T}^{e} (GeV#it{/c});p_{T}^{h} (GeV#it{/c});#Delta#varphi;#Delta#eta;", {HistType::kTHnSparseF, {{axisPt}, {axisPt}, {axisDeltaPhi}, {axisDeltaEta}}}); } // correlation for electron hadron @@ -66,14 +68,14 @@ struct HfTaskCorrelationHfeHadrons { ptHadron = pairEntry.ptHadron(); registry.fill(HIST("hInclusiveEHCorrel"), ptElectron, ptHadron, deltaPhi, deltaEta); - if (pairEntry.isLSEHCorr() > 0) { - for (int i = 0; i < pairEntry.isLSEHCorr(); ++i) { + if (pairEntry.nPairsLS() > 0) { + for (int i = 0; i < pairEntry.nPairsLS(); ++i) { registry.fill(HIST("hLikeSignEHCorrel"), ptElectron, ptHadron, deltaPhi, deltaEta); } } - if (pairEntry.isULSEHCorr() > 0) { - for (int i = 0; i < pairEntry.isULSEHCorr(); ++i) { + if (pairEntry.nPairsUS() > 0) { + for (int i = 0; i < pairEntry.nPairsLS(); ++i) { registry.fill(HIST("hUnlikeSignEHCorrel"), ptElectron, ptHadron, deltaPhi, deltaEta); } diff --git a/PWGHF/HFL/DataModel/ElectronSelectionTable.h b/PWGHF/HFL/DataModel/ElectronSelectionTable.h index 0afb342831a..e590ee1d94d 100644 --- a/PWGHF/HFL/DataModel/ElectronSelectionTable.h +++ b/PWGHF/HFL/DataModel/ElectronSelectionTable.h @@ -51,7 +51,6 @@ DECLARE_SOA_COLUMN(DeltaPhiMatch, deltaPhiMatch, float); //! dPhi matched track DECLARE_SOA_COLUMN(IsEmcal, isEmcal, bool); //! electron information with Emcal } // namespace hf_sel_electron DECLARE_SOA_TABLE(HfSelEl, "AOD", "HFSELEL", //! Electron Informations - o2::soa::Index<>, hf_sel_electron::CollisionId, hf_sel_electron::TrackId, hf_sel_electron::EtaTrack, @@ -83,13 +82,12 @@ DECLARE_SOA_COLUMN(PhiTrack, phiTrack, float); //! azimuth of th DECLARE_SOA_COLUMN(PtTrack, ptTrack, float); //! transverse momentum of the electron track DECLARE_SOA_COLUMN(TpcNSigmaElTrack, tpcNSigmaElTrack, float); //! tpcNSigma of the electron track(TPC PID) DECLARE_SOA_COLUMN(TofNSigmaElTrack, tofNSigmaElTrack, float); //! tofNSigma of the electron track(TOF PID) -DECLARE_SOA_COLUMN(IsLSElectron, isLSElectron, int); //! Like sign electron information -DECLARE_SOA_COLUMN(IsULSElectron, isULSElectron, int); //! Unlike sign electron information +DECLARE_SOA_COLUMN(NElPairLS, nElPairLS, int); //! Number of Like sign electron pair +DECLARE_SOA_COLUMN(NElPairUS, nElPairUS, int); //! Number of UnLike sign electron pair DECLARE_SOA_COLUMN(IsEmcal, isEmcal, bool); //! electron information } // namespace hf_corr_sel_electron DECLARE_SOA_TABLE(HfCorrSelEl, "AOD", "HfCORRSELEL", //! Electron Informations - o2::soa::Index<>, hf_corr_sel_electron::CollisionId, hf_corr_sel_electron::TrackId, hf_corr_sel_electron::EtaTrack, @@ -97,8 +95,8 @@ DECLARE_SOA_TABLE(HfCorrSelEl, "AOD", "HfCORRSELEL", //! Electron Informations hf_corr_sel_electron::PtTrack, hf_corr_sel_electron::TpcNSigmaElTrack, hf_corr_sel_electron::TofNSigmaElTrack, - hf_corr_sel_electron::IsLSElectron, - hf_corr_sel_electron::IsULSElectron, + hf_corr_sel_electron::NElPairLS, + hf_corr_sel_electron::NElPairUS, hf_corr_sel_electron::IsEmcal); // definition of columns and tables for Mc Gen HfElectron Selection @@ -114,7 +112,6 @@ DECLARE_SOA_COLUMN(IsNonHfeMc, isNonHfeMc, bool); //! Non-Heavy flavour elect } // namespace hf_mcgen_sel_electron DECLARE_SOA_TABLE(HfMcGenSelEl, "AOD", "HFMCGENSELEL", //! Electron Informations - o2::soa::Index<>, hf_mcgen_sel_electron::McCollisionId, hf_mcgen_sel_electron::TrackId, hf_mcgen_sel_electron::EtaTrackMc, diff --git a/PWGHF/HFL/TableProducer/electronSelectionWithTpcEmcal.cxx b/PWGHF/HFL/TableProducer/electronSelectionWithTpcEmcal.cxx index 971200a7105..ae8be97b6b9 100644 --- a/PWGHF/HFL/TableProducer/electronSelectionWithTpcEmcal.cxx +++ b/PWGHF/HFL/TableProducer/electronSelectionWithTpcEmcal.cxx @@ -50,6 +50,12 @@ struct HfElectronSelectionWithTpcEmcal { Produces electronSel; Produces hfElectronSelection; Produces hfGenElectronSel; + + enum EMCalRegion { + NoAcceptance = 0, + EMCalAcceptance = 1, + DCalAcceptance = 2 + }; // Configurables // EMCal Cluster information KFParticle kfNonHfe; @@ -137,64 +143,67 @@ struct HfElectronSelectionWithTpcEmcal { ConfigurableAxis binsDeltaPhi{"binsDeltaPhi", {20, -0.2, 0.2}, "Track Cluser Match #Delta #varphi"}; ConfigurableAxis binsMass{"binsMass", {100, 0.0, 2.0}, "Mass (GeV/#it{c}^{2}); entries"}; - HistogramConfigSpec hEmcClusterEnergySpec{HistType::kTH1F, {{binsEmcEnergy}}}; - HistogramConfigSpec hEmcClusterEtaPhiSpec{HistType::kTH2F, {{binsEta}, {binsPhi}}}; - HistogramConfigSpec hEmcClusterEnergyCellSpec{HistType::kTH2F, {{binsEmcEnergy}, {binsEmcClsNCells}}}; - HistogramConfigSpec hEmcClusterEnergyTimeSpec{HistType::kTH2F, {{binsEmcEnergy}, {binsEmcClsTime}}}; - - HistogramConfigSpec hDeltaPhiDeltaEtaEmcClusterTrackTime{HistType::kTH3F, {{binsDeltaEta}, {binsDeltaPhi}, {binsEmcClsTime}}}; - HistogramConfigSpec hAfterMatchEoPSigamSpec{HistType::kTHnSparseD, {{binsEoP}, {binsPt}, {binsnSigma}, {binsM02}, {binsM20}}}; - - HistogramConfigSpec hTrackEnergyLossSpec{HistType::kTH3F, {{binsdEdx}, {binsPt}, {binsPassEMcal}}}; - - HistogramConfigSpec hTracknSigmaSpec{HistType::kTH3F, {{binsnSigma}, {binsPt}, {binsPassEMcal}}}; - HistogramRegistry registry{ "registry", - {{"hNevents", "No of events", {HistType::kTH1F, {{3, 1, 4}}}}, - {"hZvertex", "z vertex", {HistType::kTH1F, {{binsPosZ}}}}, - {"hLikeMass", "Like mass", {HistType::kTH1F, {{binsMass}}}}, - {"hUnLikeMass", "unLike mass", {HistType::kTH1F, {{binsMass}}}}, - {"hLikeSignPt", "Like sign Momentum ", {HistType::kTH1F, {{binsPt}}}}, - {"hUnLikeSignPt", "UnLike sign Momentum", {HistType::kTH1F, {{binsPt}}}}, - {"hMcgenInElectron", "Mc Gen Inclusive Electron", {HistType::kTH1F, {{binsPt}}}}, - {"hMcgenAllNonHfeElectron", "Mc Gen All NonHf Electron", {HistType::kTH1F, {{binsPt}}}}, - {"hMcgenNonHfeElectron", "Mc Gen NonHf Electron with mother", {HistType::kTH1F, {{binsPt}}}}, - {"hPi0eEmbTrkPt", "Mc Gen Pi0 mother NonHf Electron", {HistType::kTH1F, {{binsPt}}}}, - - {"hEtaeEmbTrkPt", "Mc Gen Eta mother NonHf Electron", {HistType::kTH1F, {{binsPt}}}}, - {"hEmcClusterM02", "m02", {HistType::kTH1F, {{binsM02}}}}, - {"hEmcClusterM20", "m20", {HistType::kTH1F, {{binsM20}}}}, - {"hTrackEtaPhi", "TPC EtaPhi Info; #eta;#varphi;passEMcal;", {HistType::kTH3F, {{binsEta}, {binsPhi}, {binsPassEMcal}}}}, - {"hTrackEnergyLossVsP", " TPC Energy loss info vs P; dE/dx;#it{p} (GeV#it{/c});passEMcal;", hTrackEnergyLossSpec}, - {"hTrackEnergyLossVsPt", " TPC Energy loss info vs Pt; dE/dx;#it{p}_{T} (GeV#it{/c});passEMcal;", hTrackEnergyLossSpec}, - {"hTracknSigmaVsP", " TPC nSigma info vs P; n#sigma;#it{p} (GeV#it{/c});passEMcal;", hTracknSigmaSpec}, - {"hTracknSigmaVsPt", " TPC nSigma info vs Pt; n#sigma;#it{p}_{T} (GeV#it{/c});passEMcal;", hTracknSigmaSpec}, - {"hEmcClusterEnergy", "EMCal Cluster Info before match Energy; Energy (GeV)", hEmcClusterEnergySpec}, - {"hEmcClusterEtaPhi", "EMCal Cluster Info before match Eta and Phi; #eta;#varphi;", hEmcClusterEtaPhiSpec}, - {"hEmcClusterEnergyCell", "EMCal Cluster Info before match Energy vs nCells; Energy (GeV);ncell;", hEmcClusterEnergyCellSpec}, - {"hEmcClusterEnergyTime", "EMCal Cluster Info before match Energy vs time; Energy (GeV); sec;", hEmcClusterEnergyTimeSpec}, - {"hEmcClusterAfterMatchEnergy", "EMCal Cluster Info After match Energy; Energy (GeV)", hEmcClusterEnergySpec}, - {"hEmcClusterAfterMatchEtaPhi", "EMCal Cluster Info After match Eta and Phi; #eta;#varphi;", hEmcClusterEtaPhiSpec}, - {"hEmcClusterAfterMatchEnergyCells", "EMCal Cluster Info After match Energy vs nCells; Energy (GeV);ncell;", hEmcClusterEnergyCellSpec}, - {"hEmcClusterAfterMatchEnergyTime", "EMCal Cluster Info After match Energy vs time; Energy (GeV); sec;", hEmcClusterEnergyTimeSpec}, - - {"hAfterMatchSigmaVsEoP", "PID Info after match EoP vs Sigma ; E/P;#it{p}_{T} (GeV#it{/c});n#sigma; m02; m20;", hAfterMatchEoPSigamSpec}, - {"hAfterMatchEoPVsP", "PID Info after match EoP vs P; E/P;#it{p} (GeV#it{/c});", {HistType::kTH2F, {{binsEoP}, {binsPt}}}}, - {"hAfterMatchSigmaVsP", "PID Info after match Sigma vs Momentum ; n#sigma; #it{p} (GeV#it{/c}; ", {HistType::kTH2F, {{binsnSigma}, {binsPt}}}}, - {"hAfterMatchEtaPhi", "PID Info after match Eta vs Phi ; #eta; #varphi; ", {HistType::kTH2F, {{binsEta}, {binsPhi}}}}, - {"hAfterMatchEnergyLossVsP", "PID Info after match Energy loss info vs P ; dE/dx;#it{p} (GeV#it{/c});; ", {HistType::kTH2F, {{binsdEdx}, {binsPt}}}}, - {"hAfterMatchEnergyLossVsPt", "PID Info after match Energy loss info vs Pt ;dE/dx;#it{p}_{T} (GeV#it{/c}); ", {HistType::kTH2F, {{binsdEdx}, {binsPt}}}}, - - {"hAfterPIDEtaPhi", "PID Info after PID Cuts Eta vs Phi ; #eta; #varphi; ", {HistType::kTH2F, {{binsEta}, {binsPhi}}}}, - {"hEPRatioAfterPID", "E/P Ratio after PID Cuts apply only trackwodca filter", {HistType::kTH2F, {{binsPt}, {binsEmcEnergy}}}}, - {"hPIDAfterPIDCuts", "PID Info after PID cuts; E/P;#it{p}_{T} (GeV#it{/c});n#sigma;m02; m20;", hAfterMatchEoPSigamSpec}, - {"hEmcClsTrkEtaPhiDiffTime", "EmcClsTrkEtaPhiDiffTime;#Delta#eta;#Delta#varphi;Sec;", hDeltaPhiDeltaEtaEmcClusterTrackTime}}}; + {}}; void init(o2::framework::InitContext&) { - registry.get(HIST("hAfterMatchSigmaVsEoP"))->Sumw2(); - registry.get(HIST("hPIDAfterPIDCuts"))->Sumw2(); + AxisSpec axisPosZ = {binsPosZ, "Pos Z"}; + AxisSpec axisMass = {binsMass, "Mass (GeV/#it{c}^{2}); entries"}; + AxisSpec axisPt = {binsPt, "#it{p_{T}}(GeV/#it{c})"}; + AxisSpec axisEta = {binsEta, "#it{#eta}"}; + AxisSpec axisPhi = {binsPhi, "#it{#varphi}"}; + AxisSpec axisdEdx = {binsdEdx, "dE/dX"}; + AxisSpec axisnSigma = {binsnSigma, "it{#sigma_{TPC}}"}; + AxisSpec axisM02 = {binsM02, "M02; entries"}; + AxisSpec axisM20 = {binsM20, "M20; entries"}; + AxisSpec axisEoP = {binsEoP, "E/p"}; + AxisSpec axisEmcEnergy = {binsEmcEnergy, "Cluster Energy (GeV/#it{c}^{2})"}; + AxisSpec axisEmcClsNCells = {binsEmcClsNCells, "nCell"}; + AxisSpec axisEmcClsTime = {binsEmcClsTime, "Cluster Time"}; + AxisSpec axisPassEMcal = {binsPassEMcal, "Pass EMcal"}; + AxisSpec axisDeltaEta = {binsDeltaEta, "#Delta #eta = #eta_{trk}- #eta_{cluster}"}; + AxisSpec axisDeltaPhi = {binsDeltaPhi, "#Delta #varphi = #varphi_{trk}- #varphi_{cluster}"}; + + registry.add("hZvertex", "z vertex", {HistType::kTH1D, {axisPosZ}}); + registry.add("hNevents", "No of events", {HistType::kTH1D, {{3, 1, 4}}}); + registry.add("hLikeMass", "Like mass", {HistType::kTH1D, {{axisMass}}}); + registry.add("hUnLikeMass", "unLike mass", {HistType::kTH1D, {{axisMass}}}); + registry.add("hLikeSignPt", "Like sign Momentum ", {HistType::kTH1D, {{axisPt}}}); + registry.add("hUnLikeSignPt", "UnLike sign Momentum", {HistType::kTH1D, {{axisPt}}}); + registry.add("hMcgenInElectron", "Mc Gen Inclusive Electron", {HistType::kTH1D, {{axisPt}}}); + registry.add("hMcgenAllNonHfeElectron", "Mc Gen All NonHf Electron", {HistType::kTH1D, {{axisPt}}}); + registry.add("hMcgenNonHfeElectron", "Mc Gen NonHf Electron with mother", {HistType::kTH1D, {{axisPt}}}); + registry.add("hPi0eEmbTrkPt", "Mc Gen Pi0 mother NonHf Electron", {HistType::kTH1D, {{axisPt}}}); + + registry.add("hEtaeEmbTrkPt", "Mc Gen Eta mother NonHf Electron", {HistType::kTH1D, {{axisPt}}}); + registry.add("hEmcClusterM02", "m02", {HistType::kTH1D, {{axisM02}}}); + registry.add("hEmcClusterM20", "m20", {HistType::kTH1D, {{axisM20}}}); + registry.add("hTrackEtaPhi", "TPC EtaPhi Info; #eta;#varphi;passEMcal;", {HistType::kTH3F, {{axisEta}, {axisPhi}, {axisPassEMcal}}}); + registry.add("hTrackEnergyLossVsP", " TPC Energy loss info vs P; dE/dx;#it{p} (GeV#it{/c});passEMcal;", {HistType::kTH3F, {{axisdEdx}, {axisPt}, {axisPassEMcal}}}); + registry.add("hTrackEnergyLossVsPt", "TPC Energy loss info vs Pt; dE/dx;#it{p}_{T} (GeV#it{/c});passEMcal;", {HistType::kTH3F, {{axisdEdx}, {axisPt}, {axisPassEMcal}}}); + registry.add("hTracknSigmaVsP", " TPC nSigma info vs P; n#sigma;#it{p} (GeV#it{/c});passEMcal;", {HistType::kTH3F, {{axisnSigma}, {axisPt}, {axisPassEMcal}}}); + registry.add("hTracknSigmaVsPt", " TPC nSigma info vs Pt; n#sigma;#it{p}_{T} (GeV#it{/c});passEMcal;", {HistType::kTH3F, {{axisnSigma}, {axisPt}, {axisPassEMcal}}}); + registry.add("hEmcClusterEnergy", "EMCal Cluster Info before match Energy; Energy (GeV); entries;", {HistType::kTH1D, {{axisEmcEnergy}}}); + registry.add("hEmcClusterEtaPhi", "EMCal Cluster Info before match Eta and Phi; #eta;#varphi;", {HistType::kTH2F, {{axisEta}, {axisPhi}}}); + registry.add("hEmcClusterEnergyCell", "EMCal Cluster Info before match Energy vs nCells; Energy (GeV);ncell;", {HistType::kTH2F, {{axisEmcEnergy}, {axisEmcClsNCells}}}); + registry.add("hEmcClusterEnergyTime", "EMCal Cluster Info before match Energy vs time; Energy (GeV); sec;", {HistType::kTH2F, {{axisEmcEnergy}, {axisEmcClsTime}}}); + registry.add("hEmcClusterAfterMatchEnergy", "EMCal Cluster Info After match Energy; Energy (GeV); entries;", {HistType::kTH1D, {{axisEmcEnergy}}}); + registry.add("hEmcClusterAfterMatchEtaPhi", "EMCal Cluster Info After match Eta and Phi; #eta;#varphi;", {HistType::kTH2F, {{axisEta}, {axisPhi}}}); + registry.add("hEmcClusterAfterMatchEnergyCells", "EMCal Cluster Info After match Energy vs nCells; Energy (GeV);ncell;", {HistType::kTH2F, {{axisEmcEnergy}, {axisEmcClsNCells}}}); + registry.add("hEmcClusterAfterMatchEnergyTime", "EMCal Cluster Info After match Energy vs time; Energy (GeV); sec;", {HistType::kTH2F, {{axisEmcEnergy}, {axisEmcClsTime}}}); + registry.add("hAfterMatchSigmaVsEoP", "PID Info after match EoP vs Sigma ; E/P;#it{p}_{T} (GeV#it{/c});n#sigma; m02; m20;", {HistType::kTHnSparseF, {{axisEoP}, {axisPt}, {axisnSigma}, {axisM02}, {axisM20}}}); + registry.add("hAfterMatchEoPVsP", "PID Info after match EoP vs P; E/P;#it{p} (GeV#it{/c});", {HistType::kTH2F, {{axisEoP}, {axisPt}}}); + registry.add("hAfterMatchSigmaVsP", "PID Info after match Sigma vs Momentum ; n#sigma; #it{p} (GeV#it{/c}; ", {HistType::kTH2F, {{axisnSigma}, {axisPt}}}); + registry.add("hAfterMatchEtaPhi", "PID Info after match Eta vs Phi ; #eta; #varphi; ", {HistType::kTH2F, {{axisEta}, {axisPhi}}}); + registry.add("hAfterMatchEnergyLossVsP", "PID Info after match Energy loss info vs P ; dE/dx;#it{p} (GeV#it{/c});; ", {HistType::kTH2F, {{axisdEdx}, {axisPt}}}); + registry.add("hAfterMatchEnergyLossVsPt", "PID Info after match Energy loss info vs Pt ;dE/dx;#it{p}_{T} (GeV#it{/c}); ", {HistType::kTH2F, {{axisdEdx}, {axisPt}}}); + + registry.add("hAfterPIDEtaPhi", "PID Info after PID Cuts Eta vs Phi ; #eta; #varphi; ", {HistType::kTH2F, {{axisEta}, {axisPhi}}}); + registry.add("hEPRatioAfterPID", "E/P Ratio after PID Cuts apply only trackwodca filter", {HistType::kTH2F, {{axisPt}, {axisEmcEnergy}}}); + registry.add("hPIDAfterPIDCuts", "PID Info after PID cuts; E/P;#it{p}_{T} (GeV#it{/c});n#sigma;m02; m20;", {HistType::kTHnSparseF, {{binsEoP}, {binsPt}, {binsnSigma}, {binsM02}, {binsM20}}}); + registry.add("hEmcClsTrkEtaPhiDiffTime", "EmcClsTrkEtaPhiDiffTime;#Delta#eta;#Delta#varphi;Sec;", {HistType::kTH3F, {{binsDeltaEta}, {binsDeltaPhi}, {binsEmcClsTime}}}); } // Track Selection Cut template @@ -261,8 +270,8 @@ struct HfElectronSelectionWithTpcEmcal { template void nonHfe(ElectronType const& electron, TracksType const& tracks, bool isEMcal) { - int isLSElectronFound = 0; - int isULSElectronFound = 0; + int nElPairsLS = 0; + int nElPairsUS = 0; bool isLSElectron = false; bool isULSElectron = false; float invMassElectron = 0.; @@ -331,7 +340,7 @@ struct HfElectronSelectionWithTpcEmcal { // for like charge if (isLSElectron && (invMassElectron <= invariantMass)) { massLike = invMassElectron; - ++isLSElectronFound; + ++nElPairsLS; if (isEMcal) { registry.fill(HIST("hLikeSignPt"), electron.pt()); } @@ -339,14 +348,14 @@ struct HfElectronSelectionWithTpcEmcal { // for unlike charge if (isULSElectron && (invMassElectron <= invariantMass)) { massUnLike = invMassElectron; - ++isULSElectronFound; + ++nElPairsUS; if (isEMcal) { registry.fill(HIST("hUnLikeSignPt"), electron.pt()); } } } // Pass multiplicities and other required parameters for this electron - hfElectronSelection(electron.collisionId(), electron.globalIndex(), electron.eta(), electron.phi(), electron.pt(), electron.tpcNSigmaEl(), electron.tofNSigmaEl(), isLSElectronFound, isULSElectronFound, isEMcal); + hfElectronSelection(electron.collisionId(), electron.globalIndex(), electron.eta(), electron.phi(), electron.pt(), electron.tpcNSigmaEl(), electron.tofNSigmaEl(), nElPairsLS, nElPairsUS, isEMcal); } // Electron Identification template @@ -371,7 +380,7 @@ struct HfElectronSelectionWithTpcEmcal { registry.fill(HIST("hEmcClusterM20"), emcClusterBefore.m20()); } } - int passEMCal; + EMCalRegion passEMCal = NoAcceptance; float phiTrack = -999; float etaTrack = -999; float pTrack = -999; @@ -392,12 +401,11 @@ struct HfElectronSelectionWithTpcEmcal { if (!selTracks(track)) { continue; } - passEMCal = 0; - if ((phiTrack > phiTrackEMCalMin && phiTrack < phiTrackEMCalMax) && (etaTrack > etaTrackMin && etaTrack < etaTrackMax)) - passEMCal = 1; // EMcal acceptance passed + passEMCal = EMCalAcceptance; // EMcal acceptance passed if ((phiTrack > phiTrackDCalMin && phiTrack < phiTrackDCalMax) && ((etaTrack > etaTrackDCalPositiveMin && etaTrack < etaTrackDCalPositiveMax) || (etaTrack > etaTrackDCalNegativeMin && etaTrack < etaTrackDCalNegativeMax))) - passEMCal = 2; // Dcal acceptance passed + passEMCal = DCalAcceptance; // Dcal acceptance passed + if (fillTrackInfo) { registry.fill(HIST("hTrackEtaPhi"), etaTrack, phiTrack, passEMCal); // track etaphi infor after filter bit registry.fill(HIST("hTrackEnergyLossVsP"), track.tpcSignal(), pTrack, passEMCal); // track etaphi infor after filter bit From 6ce303ec87c652c216bae370322ac9fe96281bc8 Mon Sep 17 00:00:00 2001 From: Yash Patley <52608802+yashpatley@users.noreply.github.com> Date: Tue, 20 May 2025 22:48:51 +0530 Subject: [PATCH 1340/1650] [PWGCF] Update lambdaR2Correlation.cxx (#11260) Co-authored-by: Victor Gonzalez --- .../Tasks/lambdaR2Correlation.cxx | 202 +++++++----------- 1 file changed, 83 insertions(+), 119 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx index 76f6e4db283..e2778112fa8 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx @@ -148,7 +148,6 @@ enum TrackLabels { kPassV0DauTrackSel, kPassV0KinCuts, kPassV0TopoSel, - kAllV0SelPassed, kAllSelPassed, kNotPrimaryLambda, kNotSecondaryLambda, @@ -160,6 +159,10 @@ enum TrackLabels { kEffCorrPtRap, kEffCorrPtRapPhi, kNoEffCorr, + kPFCorrPt, + kPFCorrPtRap, + kPFCorrPtRapPhi, + kNoPFCorr, kGenTotAccLambda, kGenLambdaNoDau, kGenLambdaToPrPi @@ -260,18 +263,6 @@ struct LambdaTableProducer { Configurable cV0TypeSelFlag{"cV0TypeSelFlag", false, "V0 Type Selection Flag"}; Configurable cV0TypeSelection{"cV0TypeSelection", 1, "V0 Type Selection"}; - // Cascade V0 - Configurable cRemoveCascLambda{"cRemoveCascLambda", false, "Remove Cascade V0s"}; - Configurable cMinCascDcaPosToPV{"cMinCascDcaPosToPV", 0.03, "DCA Casc Pos To PV"}; - Configurable cMinCascDcaNegToPV{"cMinCascDcaNegToPV", 0.03, "DCA Casc Neg To PV"}; - Configurable cMinCascDcaBachToPV{"cMinCascDcaBachToPV", 0.03, "DCA Casc Bach To PV"}; - Configurable cMaxCascDcaDaughters{"cMaxCascDcaDaughters", 1.0, "DCA Casc Dau at Casc Decay Vtx"}; - Configurable cMinCascRadius{"cMinCascRadius", 0.4, "Casc Decay Radius"}; - Configurable cMinCascV0Radius{"cMinCascV0Radius", 0.9, "Casc V0 Decay Radius"}; - Configurable cMinCascCosPA{"cMinCascCosPA", 0.99, "Casc CosThetaPA"}; - Configurable cMinCascV0CosPA{"cMinCascV0CosPA", 0.99, "Casc V0 CosThetaPA"}; - Configurable cCascMassWindow{"cCascMassWindow", 0.005, "Casc Mass Window"}; - // V0s MC Configurable cHasMcFlag{"cHasMcFlag", true, "Has Mc Tag"}; Configurable cSelectTrueLambda{"cSelectTrueLambda", true, "Select True Lambda"}; @@ -289,9 +280,11 @@ struct LambdaTableProducer { Configurable cDoTrackMcMatching{"cDoTrackMcMatching", false, "Do Track Mc Matching Flag"}; // Efficiency Correction - Configurable cCorrectionFlag{"cCorrectionFlag", false, "Efficiency Correction Flag"}; - Configurable cCorrFactHist{"cCorrFactHist", 0, "Correction Factor Histogram"}; - Configurable cDoEtaCorr{"cDoEtaCorr", false, "Do Eta Corr"}; + Configurable cCorrectionFlag{"cCorrectionFlag", false, "Correction Flag"}; + Configurable cGetEffFact{"cGetEffFact", false, "Get Efficiency Factor Flag"}; + Configurable cGetPrimFrac{"cGetPrimFrac", false, "Get Primary Fraction Flag"}; + Configurable cCorrFactHist{"cCorrFactHist", 0, "Efficiency Factor Histogram"}; + Configurable cPrimFracHist{"cPrimFracHist", 0, "Primary Fraction Histogram"}; // CCDB Configurable cUrlCCDB{"cUrlCCDB", "http://ccdb-test.cern.ch:8080", "url of ccdb"}; @@ -310,6 +303,13 @@ struct LambdaTableProducer { {"hEffVsPtYPhiLambda", "hEffVsPtYPhiAntiLambda"}, {"hEffVsPtEtaPhiLambda", "hEffVsPtEtaPhiAntiLambda"}}; + // initialize corr_factor objects + std::vector> vPrimFracStrings = {{"hPrimFracVsPtLambda", "hPrimFracVsPtAntiLambda"}, + {"hPrimFracVsPtYLambda", "hPrimFracVsPtYAntiLambda"}, + {"hPrimFracVsPtEtaLambda", "hPrimFracVsPtEtaAntiLambda"}, + {"hPrimFracVsPtYPhiLambda", "hPrimFracVsPtYPhiAntiLambda"}, + {"hPrimFracVsPtEtaPhiLambda", "hPrimFracVsPtEtaPhiAntiLambda"}}; + // Initialize Global Variables float cent = 0.; @@ -321,7 +321,7 @@ struct LambdaTableProducer { // initialize axis specifications const AxisSpec axisCols(5, 0.5, 5.5, ""); - const AxisSpec axisTrks(25, 0.5, 25.5, ""); + const AxisSpec axisTrks(30, 0.5, 30.5, ""); const AxisSpec axisCent(100, 0, 100, "FT0M (%)"); const AxisSpec axisMult(10, 0, 10, "N_{#Lambda}"); const AxisSpec axisVz(220, -11, 11, "V_{z} (cm)"); @@ -349,8 +349,6 @@ struct LambdaTableProducer { const AxisSpec axisNsigma(401, -10.025, 10.025, {"n#sigma"}); const AxisSpec axisdEdx(360, 20, 200, "#frac{dE}{dx}"); - const AxisSpec axisCascMass{100, 1.28, 1.38, "M_{#Xi}"}; - // Create Histograms. // Event histograms histos.add("Events/h1f_collisions_info", "# of Collisions", kTH1F, {axisCols}); @@ -395,9 +393,6 @@ struct LambdaTableProducer { histos.add("QA/Lambda/h2f_pos_prong_tpc_nsigma_pi_vs_p", "TPC n#sigma Pos Prong", kTH2F, {axisMomPID, axisNsigma}); histos.add("QA/Lambda/h2f_neg_prong_tpc_nsigma_pi_vs_p", "TPC n#sigma Neg Prong", kTH2F, {axisMomPID, axisNsigma}); - histos.add("QA/Casc/hMassBeforeCuts", "Xi Mass", kTH1F, {axisCascMass}); - histos.add("QA/Casc/hMass", "Xi Mass", kTH1F, {axisCascMass}); - // Kinematic Histograms histos.add("McRec/Lambda/hPt", "Transverse Momentum", kTH1F, {axisV0Pt}); histos.add("McRec/Lambda/hEta", "Pseudorapidity", kTH1F, {axisV0Eta}); @@ -464,12 +459,15 @@ struct LambdaTableProducer { histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPassV0DauTrackSel, "kPassV0DauTrackSel"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPassV0KinCuts, "kPassV0KinCuts"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPassV0TopoSel, "kPassV0TopoSel"); - histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kAllV0SelPassed, "kAllV0SelPassed"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kAllSelPassed, "kAllSelPassed"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kEffCorrPt, "kEffCorrPt"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kEffCorrPtRap, "kEffCorrPtRap"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kEffCorrPtRapPhi, "kEffCorrPtRapPhi"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kNoEffCorr, "kNoEffCorr"); + histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPFCorrPt, "kPFCorrPt"); + histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPFCorrPtRap, "kPFCorrPtRap"); + histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPFCorrPtRapPhi, "kPFCorrPtRapPhi"); + histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kNoPFCorr, "kNoPFCorr"); } template @@ -809,57 +807,6 @@ struct LambdaTableProducer { return true; } - // Remove Lambda from Xi ---> Lambda Pi - template - bool removeCascLambda(C const& collision, V const& v0, X const& cascs, T const&) - { - // Loop over cascades - for (auto const& casc : cascs) { - // cascade daughters - auto cascposdau = casc.template posTrack_as(); - auto cascnegdau = casc.template negTrack_as(); - auto bachelor = casc.template bachelor_as(); - - // V0 daughters - auto v0posdau = v0.template posTrack_as(); - auto v0negdau = v0.template negTrack_as(); - - // topological selection - if (std::abs(casc.dcapostopv()) <= cMinCascDcaPosToPV || - std::abs(casc.dcanegtopv()) <= cMinCascDcaNegToPV || - std::abs(casc.dcabachtopv()) <= cMinCascDcaBachToPV || - casc.dcaV0daughters() >= cMaxV0DcaDaughters || - casc.dcacascdaughters() >= cMaxCascDcaDaughters || - casc.cascradius() <= cMinCascRadius || - casc.v0radius() <= cMinCascV0Radius || - casc.casccosPA(collision.posX(), collision.posY(), collision.posZ()) <= cMinCascCosPA || - casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ()) <= cMinCascV0CosPA || - std::abs(cascposdau.eta()) >= cTrackEtaCut || - std::abs(cascnegdau.eta()) >= cTrackEtaCut || - std::abs(bachelor.eta()) >= cTrackEtaCut) { - continue; - } - - histos.fill(HIST("QA/Casc/hMassBeforeCuts"), casc.mXi()); - - // apply mass window selection to Xi - if (std::abs(casc.mXi() - MassXiMinus) >= cCascMassWindow) { - continue; - } - - histos.fill(HIST("QA/Casc/hMass"), casc.mXi()); - - // Check if the daughters of cascades match with v0 daughters - // The "OR" Logic is Temperory, we can further see the effect of "AND" Logic - if (v0posdau.index() == cascposdau.index() || v0negdau.index() == cascnegdau.index()) { - return true; - } - } - - // No Lambda from Cascade - return false; - } - template bool getMcMatch(T const& vrec, T const& vgen) { @@ -899,7 +846,7 @@ struct LambdaTableProducer { template float getCorrectionFactors(V const& v0) { - // Check for efficiency correction flag and Rec/Gen Data + // Check for efficiency correction flag if (!cCorrectionFlag) { return 1.; } @@ -913,29 +860,56 @@ struct LambdaTableProducer { return 1.; } - // get ccdb object - TObject* obj = reinterpret_cast(ccdbObj->FindObject(Form("%s", vCorrFactStrings[cCorrFactHist][part].c_str()))); - TH1F* hist = reinterpret_cast(obj->Clone()); - float retVal = 0.; - float rap = (cDoEtaCorr) ? v0.eta() : v0.yLambda(); - - if (hist->GetDimension() == OneDimCorr) { - histos.fill(HIST("Tracks/h1f_tracks_info"), kEffCorrPt); - retVal = hist->GetBinContent(hist->FindBin(v0.pt())); - } else if (hist->GetDimension() == TwoDimCorr) { - histos.fill(HIST("Tracks/h1f_tracks_info"), kEffCorrPtRap); - retVal = hist->GetBinContent(hist->FindBin(v0.pt(), rap)); - } else if (hist->GetDimension() == ThreeDimCorr) { - histos.fill(HIST("Tracks/h1f_tracks_info"), kEffCorrPtRapPhi); - retVal = hist->GetBinContent(hist->FindBin(v0.pt(), rap, v0.phi())); - } else { - histos.fill(HIST("Tracks/h1f_tracks_info"), kNoEffCorr); - LOGF(warning, "CCDB OBJECT IS NOT A HISTOGRAM !!!"); - retVal = 1.; + // initialize efficiency factor and primary fraction values + float effFact = 1., primFrac = 1.; + float rap = (cDoEtaAnalysis) ? v0.eta() : v0.yLambda(); + + // Get Efficiency Factor + if (cGetEffFact) { + TObject* objEff = reinterpret_cast(ccdbObj->FindObject(Form("%s", vCorrFactStrings[cCorrFactHist][part].c_str()))); + TH1F* histEff = reinterpret_cast(objEff->Clone()); + if (histEff->GetDimension() == OneDimCorr) { + histos.fill(HIST("Tracks/h1f_tracks_info"), kEffCorrPt); + effFact = histEff->GetBinContent(histEff->FindBin(v0.pt())); + } else if (histEff->GetDimension() == TwoDimCorr) { + histos.fill(HIST("Tracks/h1f_tracks_info"), kEffCorrPtRap); + effFact = histEff->GetBinContent(histEff->FindBin(v0.pt(), rap)); + } else if (histEff->GetDimension() == ThreeDimCorr) { + histos.fill(HIST("Tracks/h1f_tracks_info"), kEffCorrPtRapPhi); + effFact = histEff->GetBinContent(histEff->FindBin(v0.pt(), rap, v0.phi())); + } else { + histos.fill(HIST("Tracks/h1f_tracks_info"), kNoEffCorr); + LOGF(warning, "CCDB OBJECT IS NOT A HISTOGRAM !!!"); + effFact = 1.; + } + delete objEff; + delete histEff; + } + + // Get Primary Fraction + // (The dimension of this could be different than efficiency because of large errors !!!) + if (cGetPrimFrac) { + TObject* objPrm = reinterpret_cast(ccdbObj->FindObject(Form("%s", vPrimFracStrings[cPrimFracHist][part].c_str()))); + TH1F* histPrm = reinterpret_cast(objPrm->Clone()); + if (histPrm->GetDimension() == OneDimCorr) { + histos.fill(HIST("Tracks/h1f_tracks_info"), kPFCorrPt); + primFrac = histPrm->GetBinContent(histPrm->FindBin(v0.pt())); + } else if (histPrm->GetDimension() == TwoDimCorr) { + histos.fill(HIST("Tracks/h1f_tracks_info"), kPFCorrPtRap); + primFrac = histPrm->GetBinContent(histPrm->FindBin(v0.pt(), rap)); + } else if (histPrm->GetDimension() == ThreeDimCorr) { + histos.fill(HIST("Tracks/h1f_tracks_info"), kPFCorrPtRapPhi); + primFrac = histPrm->GetBinContent(histPrm->FindBin(v0.pt(), rap, v0.phi())); + } else { + histos.fill(HIST("Tracks/h1f_tracks_info"), kNoPFCorr); + LOGF(warning, "CCDB OBJECT IS NOT A HISTOGRAM !!!"); + primFrac = 1.; + } + delete objPrm; + delete histPrm; } - delete hist; - return retVal; + return primFrac / effFact; } template @@ -1013,8 +987,8 @@ struct LambdaTableProducer { } // Reconstructed Level Tables - template - void fillLambdaRecoTables(C const& collision, V const& v0tracks, T const& tracks, X const& cascs) + template + void fillLambdaRecoTables(C const& collision, V const& v0tracks, T const& tracks) { // Total Collisions histos.fill(HIST("Events/h1f_collisions_info"), kTotCol); @@ -1036,7 +1010,6 @@ struct LambdaTableProducer { ParticleType v0Type = kLambda; float mass = 0., corr_fact = 1.; - // Loop Over V0s for (auto const& v0 : v0tracks) { // check for corresponding MCGen Particle if constexpr (dmc == kMC) { @@ -1059,13 +1032,6 @@ struct LambdaTableProducer { continue; } - histos.fill(HIST("Tracks/h1f_tracks_info"), kAllV0SelPassed); - - // Remove Lambda V0 coming from Xi -> Lambda Pi - if (cRemoveCascLambda && removeCascLambda(collision, v0, cascs, tracks)) { - continue; - } - histos.fill(HIST("Tracks/h1f_tracks_info"), kAllSelPassed); // we have v0 as lambda @@ -1223,8 +1189,8 @@ struct LambdaTableProducer { } } - template - void analyzeMcRecoGen(M const& mcCollision, C const& collisions, V const& V0s, T const& tracks, X const& cascs, P const& mcParticles) + template + void analyzeMcRecoGen(M const& mcCollision, C const& collisions, V const& V0s, T const& tracks, P const& mcParticles) { // Number of Rec Collisions Associated to the McGen Collision int nRecCols = collisions.size(); @@ -1251,7 +1217,7 @@ struct LambdaTableProducer { histos.fill(HIST("McGen/h2f_collision_posZ"), mcCollision.posZ(), collisions.begin().posZ()); histos.fill(HIST("McGen/h2f_collision_cent"), mcCollision.centFT0M(), cent); auto v0Tracks = V0s.sliceBy(perCollision, collisions.begin().globalIndex()); - fillLambdaRecoTables(collisions.begin(), v0Tracks, tracks, cascs); + fillLambdaRecoTables(collisions.begin(), v0Tracks, tracks); fillLambdaMcGenTables(mcCollision, mcParticles); } @@ -1260,42 +1226,40 @@ struct LambdaTableProducer { using CollisionsRun3 = soa::Join; using CollisionsRun2 = soa::Join; - using CascsTracks = aod::CascDataExt; using Tracks = soa::Join; using McV0Tracks = soa::Join; - using McCascTracks = soa::Join; using TracksMC = soa::Join; - void processDataRun3(CollisionsRun3::iterator const& collision, aod::V0Datas const& V0s, Tracks const& tracks, CascsTracks const& cascs) + void processDataRun3(CollisionsRun3::iterator const& collision, aod::V0Datas const& V0s, Tracks const& tracks) { - fillLambdaRecoTables(collision, V0s, tracks, cascs); + fillLambdaRecoTables(collision, V0s, tracks); } PROCESS_SWITCH(LambdaTableProducer, processDataRun3, "Process for Run3 DATA", true); - void processDataRun2(CollisionsRun2::iterator const& collision, aod::V0Datas const& V0s, Tracks const& tracks, CascsTracks const& cascs) + void processDataRun2(CollisionsRun2::iterator const& collision, aod::V0Datas const& V0s, Tracks const& tracks) { - fillLambdaRecoTables(collision, V0s, tracks, cascs); + fillLambdaRecoTables(collision, V0s, tracks); } PROCESS_SWITCH(LambdaTableProducer, processDataRun2, "Process for Run2 DATA", false); void processMCRun3(soa::Join::iterator const& mcCollision, soa::SmallGroups> const& collisions, - McV0Tracks const& V0s, TracksMC const& tracks, McCascTracks const& cascs, + McV0Tracks const& V0s, TracksMC const& tracks, aod::McParticles const& mcParticles) { - analyzeMcRecoGen(mcCollision, collisions, V0s, tracks, cascs, mcParticles); + analyzeMcRecoGen(mcCollision, collisions, V0s, tracks, mcParticles); } PROCESS_SWITCH(LambdaTableProducer, processMCRun3, "Process for Run3 MC RecoGen", false); void processMCRun2(soa::Join::iterator const& mcCollision, soa::SmallGroups> const& collisions, - McV0Tracks const& V0s, TracksMC const& tracks, McCascTracks const& cascs, + McV0Tracks const& V0s, TracksMC const& tracks, aod::McParticles const& mcParticles) { - analyzeMcRecoGen(mcCollision, collisions, V0s, tracks, cascs, mcParticles); + analyzeMcRecoGen(mcCollision, collisions, V0s, tracks, mcParticles); } PROCESS_SWITCH(LambdaTableProducer, processMCRun2, "Process for Run2 MC RecoGen", false); From 07565837de1920f33b6b95e519571891cb4f6bea Mon Sep 17 00:00:00 2001 From: Shirajum Monira <38348689+Eloviyo@users.noreply.github.com> Date: Tue, 20 May 2025 19:19:29 +0200 Subject: [PATCH 1341/1650] [PWGCF] fixed incorrect index and O2 linter warnings (#11266) Co-authored-by: Shirajum Monira --- PWGCF/TableProducer/filter2Prong.cxx | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/PWGCF/TableProducer/filter2Prong.cxx b/PWGCF/TableProducer/filter2Prong.cxx index 95a66b83e3e..25bee387660 100644 --- a/PWGCF/TableProducer/filter2Prong.cxx +++ b/PWGCF/TableProducer/filter2Prong.cxx @@ -81,15 +81,15 @@ struct Filter2Prong { return; // rejected collision if (cfgVerbosity > 0 && candidates.size() > 0) LOGF(info, "Candidates for collision: %lu, cfcollisions: %lu, CFTracks: %lu", candidates.size(), cfcollisions.size(), cftracks.size()); - for (auto& c : candidates) { + for (const auto& c : candidates) { int prongCFId[2] = {-1, -1}; - for (auto& cftrack : cftracks) { + for (const auto& cftrack : cftracks) { if (c.prong0Id() == cftrack.trackId()) { prongCFId[0] = cftrack.globalIndex(); break; } } - for (auto& cftrack : cftracks) { + for (const auto& cftrack : cftracks) { if (c.prong1Id() == cftrack.trackId()) { prongCFId[1] = cftrack.globalIndex(); break; @@ -106,10 +106,10 @@ struct Filter2Prong { prongCFId[0], prongCFId[1], c.pt(), c.eta(), c.phi(), hfHelper.invMassD0ToPiK(c), aod::cf2prongtrack::D0ToPiK); if constexpr (std::experimental::is_detected::value) { mlvecd.clear(); - for (float val : c.mlProbD0()) + for (const float val : c.mlProbD0()) mlvecd.push_back(val); mlvecdbar.clear(); - for (float val : c.mlProbD0bar()) + for (const float val : c.mlProbD0bar()) mlvecdbar.push_back(val); output2ProngTrackmls(cfcollisions.begin().globalIndex(), mlvecd, mlvecdbar); } @@ -120,10 +120,10 @@ struct Filter2Prong { prongCFId[0], prongCFId[1], c.pt(), c.eta(), c.phi(), hfHelper.invMassD0barToKPi(c), aod::cf2prongtrack::D0barToKPi); if constexpr (std::experimental::is_detected::value) { mlvecd.clear(); - for (float val : c.mlProbD0()) + for (const float val : c.mlProbD0()) mlvecd.push_back(val); mlvecdbar.clear(); - for (float val : c.mlProbD0bar()) + for (const float val : c.mlProbD0bar()) mlvecdbar.push_back(val); output2ProngTrackmls(cfcollisions.begin().globalIndex(), mlvecd, mlvecdbar); } @@ -146,7 +146,7 @@ struct Filter2Prong { void processMC(aod::McCollisions::iterator const&, aod::CFMcParticleRefs const& cfmcparticles, aod::McParticles const& mcparticles) { // The main filter outputs the primary MC particles. Here we just resolve the daughter indices that are needed for the efficiency matching. - for (auto& r : cfmcparticles) { + for (const auto& r : cfmcparticles) { const auto& mcParticle = mcparticles.iteratorAt(r.mcParticleId()); if (mcParticle.daughtersIds().size() != 2) { output2ProngMcParts(-1, -1); @@ -154,7 +154,7 @@ struct Filter2Prong { } int prongCFId[2] = {-1, -1}; for (uint i = 0; i < 2; ++i) { - for (auto& cfmcpart : cfmcparticles) { + for (const auto& cfmcpart : cfmcparticles) { if (mcParticle.daughtersIds()[i] == cfmcpart.mcParticleId()) { prongCFId[i] = cfmcpart.globalIndex(); break; @@ -172,16 +172,16 @@ struct Filter2Prong { { if (cfcollisions.size() <= 0 || cftracks.size() <= 0) return; // rejected collision - for (auto& cftrack1 : cftracks) { - auto p1 = tracks.iteratorAt(cftrack1.trackId()); + for (const auto& cftrack1 : cftracks) { + const auto& p1 = tracks.iteratorAt(cftrack1.trackId() - tracks.begin().globalIndex()); if (p1.sign() != 1) continue; if (sigmaFormula->Eval(o2::aod::pidutils::tpcNSigma(cfgImPart1PID, p1), o2::aod::pidutils::tofNSigma(cfgImPart1PID, p1)) <= 0.0f) continue; - for (auto& cftrack2 : cftracks) { + for (const auto& cftrack2 : cftracks) { if (cftrack2.globalIndex() == cftrack1.globalIndex()) continue; - auto p2 = tracks.iteratorAt(cftrack2.trackId()); + const auto& p2 = tracks.iteratorAt(cftrack2.trackId() - tracks.begin().globalIndex()); if (p2.sign() != -1) continue; if (sigmaFormula->Eval(o2::aod::pidutils::tpcNSigma(cfgImPart2PID, p2), o2::aod::pidutils::tofNSigma(cfgImPart2PID, p2)) <= 0.0f) From 9649521701644cccfb7e33a13dafbcf972e062aa Mon Sep 17 00:00:00 2001 From: dajones2 <140733426+dajones2@users.noreply.github.com> Date: Tue, 20 May 2025 21:23:26 +0100 Subject: [PATCH 1342/1650] [PWGJE] Adding a histogram for investigating TT outlier cuts (#11263) --- PWGJE/Tasks/jetHadronRecoil.cxx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/PWGJE/Tasks/jetHadronRecoil.cxx b/PWGJE/Tasks/jetHadronRecoil.cxx index d7e4c619de6..4d3b3a0773c 100644 --- a/PWGJE/Tasks/jetHadronRecoil.cxx +++ b/PWGJE/Tasks/jetHadronRecoil.cxx @@ -36,7 +36,6 @@ #include "PWGJE/Core/JetFinder.h" #include "PWGJE/Core/JetFindingUtilities.h" #include "PWGJE/DataModel/Jet.h" - #include "PWGJE/Core/JetDerivedDataUtilities.h" #include "EventFiltering/filterTables.h" @@ -128,7 +127,9 @@ struct JetHadronRecoil { {"hReferencePt", "jet p_{T};p_{T,jet};entries", {HistType::kTH1F, {{500, -100, 400}}}}, {"hSignalPt", "jet p_{T};p_{T,jet};entries", {HistType::kTH1F, {{500, -100, 400}}}}, {"hSignalTriggers", "trigger p_{T};p_{T,trig};entries", {HistType::kTH1F, {{150, 0, 150}}}}, + {"hSignalPtHard", "jet p_{T} vs #hat{p};p_{T,jet};#frac{p_{T,trig}}{#hat{p}}", {HistType::kTH2F, {{500, -100, 400}, {20, 0, 5}}}}, {"hReferenceTriggers", "trigger p_{T};p_{T,trig};entries", {HistType::kTH1F, {{150, 0, 150}}}}, + {"hReferencePtHard", "jet p_{T} vs #hat{p};p_{T,jet};#frac{p_{T,trig}}{#hat{p}}", {HistType::kTH2F, {{500, -100, 400}, {20, 0, 5}}}}, {"hSigEventTriggers", "N_{triggers};events", {HistType::kTH1F, {{10, 0, 10}}}}, {"hRefEventTriggers", "N_{triggers};events", {HistType::kTH1F, {{10, 0, 10}}}}, {"hJetPt", "jet p_{T};p_{T,jet};entries", {HistType::kTH1F, {{500, -100, 400}}}}, @@ -195,7 +196,9 @@ struct JetHadronRecoil { { bool isSigCol; std::vector phiTTAr; + std::vector ptTTAr; double phiTT = 0; + double ptTT = 0; int trigNumber = 0; int nTT = 0; double leadingPT = 0; @@ -214,11 +217,13 @@ struct JetHadronRecoil { } if (isSigCol && track.pt() < ptTTsigMax && track.pt() > ptTTsigMin) { phiTTAr.push_back(track.phi()); + ptTTAr.push_back(track.pt()); registry.fill(HIST("hSignalTriggers"), track.pt(), weight); nTT++; } if (!isSigCol && track.pt() < ptTTrefMax && track.pt() > ptTTrefMin) { phiTTAr.push_back(track.phi()); + ptTTAr.push_back(track.pt()); registry.fill(HIST("hReferenceTriggers"), track.pt(), weight); nTT++; } @@ -230,6 +235,7 @@ struct JetHadronRecoil { if (nTT > 0) { trigNumber = rand->Integer(nTT); phiTT = phiTTAr[trigNumber]; + ptTT = ptTTAr[trigNumber]; if (isSigCol) { registry.fill(HIST("hNtrig"), 1.5, weight); registry.fill(HIST("hSigEventTriggers"), nTT, weight); @@ -279,6 +285,7 @@ struct JetHadronRecoil { registry.fill(HIST("hSignalPtDPhi"), dphi, jet.pt() - (rho * jet.area()), weight); if (std::abs(dphi - o2::constants::math::PI) < 0.6) { registry.fill(HIST("hSignalPt"), jet.pt() - (rho * jet.area()), weight); + registry.fill(HIST("hSignalPtHard"), jet.pt() - (rho * jet.area()), ptTT / pTHat, weight); } } if (!isSigCol) { @@ -296,6 +303,7 @@ struct JetHadronRecoil { } if (std::abs(dphi - o2::constants::math::PI) < 0.6) { registry.fill(HIST("hReferencePt"), jet.pt() - (rhoReference * jet.area()), weight); + registry.fill(HIST("hReferencePtHard"), jet.pt() - (rhoReference * jet.area()), ptTT / pTHat, weight); } } } From bb160ad4148ede9a643e399a2cacd93024a34f17 Mon Sep 17 00:00:00 2001 From: mherzer <96999709+mherzer28@users.noreply.github.com> Date: Tue, 20 May 2025 23:59:54 +0200 Subject: [PATCH 1343/1650] [PWGLF] rigidity correction fix (#11259) Co-authored-by: ALICE Action Bot --- PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx | 40 +++++++++++---------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx b/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx index 76216fb0d0d..592c992f0ac 100644 --- a/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx +++ b/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx @@ -36,7 +36,6 @@ #include "ReconstructionDataFormats/PID.h" #include "ReconstructionDataFormats/Track.h" #include -#include namespace o2::aod { @@ -137,6 +136,7 @@ class Particle int charge; float resolution; std::vector betheParams; + static constexpr int kNumBetheParams = 5; Particle(const std::string name_, int pdgCode_, float mass_, int charge_, LabeledArray bethe) @@ -150,7 +150,7 @@ class Particle bethe.get(name, "resolution"); // Access the "resolution" parameter betheParams.clear(); - for (int i = 0; i < 5; ++i) { + for (int i = 0; i < kNumBetheParams; ++i) { betheParams.push_back(bethe.get(name, i)); } } @@ -327,7 +327,7 @@ struct TrHeAnalysis { track.rapidity(o2::track::PID::getMass2Z(o2::track::PID::Helium3)) < kinemOptions.yHighCut; histos.fill(HIST("histogram/cuts"), 0); - if (std::abs(track.tpcInnerParam()) < kinemOptions.pCut) { + if (std::abs(track.p()) < kinemOptions.pCut) { histos.fill(HIST("histogram/cuts"), 1); continue; } @@ -366,10 +366,10 @@ struct TrHeAnalysis { histos.fill(HIST("histogram/pT"), track.pt()); histos.fill(HIST("histogram/p"), track.p()); histos.fill(HIST("histogram/TPCsignVsTPCmomentum"), - track.tpcInnerParam() / (1.f * track.sign()), + getRigidity(track), track.tpcSignal()); histos.fill(HIST("histogram/TOFbetaVsP"), - track.p() / (1.f * track.sign()), track.beta()); + getRigidity(track), track.beta()); if (enableTr && trRapCut) { if (std::abs(getTPCnSigma(track, particles.at(0))) < nsigmaTPCvar.nsigmaTPCTr) { @@ -391,10 +391,10 @@ struct TrHeAnalysis { continue; } histos.fill(HIST("histogram/H3/H3-TPCsignVsTPCmomentum"), - track.tpcInnerParam() / (1.f * track.sign()), + getRigidity(track), track.tpcSignal()); histos.fill(HIST("histogram/H3/H3-TOFbetaVsP"), - track.p() / (1.f * track.sign()), track.beta()); + getRigidity(track), track.beta()); float tPt = track.pt(); float tEta = track.eta(); float tPhi = track.phi(); @@ -437,10 +437,10 @@ struct TrHeAnalysis { continue; } histos.fill(HIST("histogram/He/He-TPCsignVsTPCmomentum"), - track.tpcInnerParam() / (2.f * track.sign()), + getRigidity(track), track.tpcSignal()); histos.fill(HIST("histogram/He/He-TOFbetaVsP"), - track.p() / (2.f * track.sign()), track.beta()); + getRigidity(track), track.beta()); float tPt = track.pt(); float tEta = track.eta(); float tPhi = track.phi(); @@ -481,7 +481,7 @@ struct TrHeAnalysis { track.rapidity(o2::track::PID::getMass2Z(o2::track::PID::Helium3)) < kinemOptions.yHighCut; histos.fill(HIST("histogram/cuts"), 0); - if (std::abs(track.tpcInnerParam()) < kinemOptions.pCut) { + if (std::abs(track.p()) < kinemOptions.pCut) { histos.fill(HIST("histogram/cuts"), 1); continue; } @@ -520,7 +520,7 @@ struct TrHeAnalysis { histos.fill(HIST("histogram/pT"), track.pt()); histos.fill(HIST("histogram/p"), track.p()); histos.fill(HIST("histogram/TPCsignVsTPCmomentum"), - track.tpcInnerParam() / (1.f * track.sign()), + getRigidity(track) / (1.f * track.sign()), track.tpcSignal()); histos.fill(HIST("histogram/TOFbetaVsP"), track.p() / (1.f * track.sign()), track.beta()); @@ -544,7 +544,7 @@ struct TrHeAnalysis { continue; } histos.fill(HIST("histogram/H3/H3-TPCsignVsTPCmomentum"), - track.tpcInnerParam() / (1.f * track.sign()), + getRigidity(track) / (1.f * track.sign()), track.tpcSignal()); histos.fill(HIST("histogram/H3/H3-TOFbetaVsP"), track.p() / (1.f * track.sign()), track.beta()); @@ -589,10 +589,10 @@ struct TrHeAnalysis { continue; } histos.fill(HIST("histogram/He/He-TPCsignVsTPCmomentum"), - track.tpcInnerParam() / (2.f * track.sign()), + getRigidity(track), track.tpcSignal()); histos.fill(HIST("histogram/He/He-TOFbetaVsP"), - track.p() / (2.f * track.sign()), track.beta()); + getRigidity(track), track.beta()); float tPt = track.pt(); float tEta = track.eta(); float tPhi = track.phi(); @@ -625,7 +625,7 @@ struct TrHeAnalysis { template float getTPCnSigma(T const& track, Particle const& particle) { - const float rigidity = track.tpcInnerParam(); + const float rigidity = getRigidity(track); if (!track.hasTPC()) return -999; @@ -643,10 +643,14 @@ struct TrHeAnalysis { template float getMeanItsClsSize(T const& track) { + constexpr int kNumLayers = 8; + constexpr int kBitsPerLayer = 4; + constexpr int kBitMask = (1 << kBitsPerLayer) - 1; int sum = 0, n = 0; - for (int i = 0; i < 8; i++) { - sum += (track.itsClusterSizes() >> (4 * i) & 15); - if (track.itsClusterSizes() >> (4 * i) & 15) + for (int i = 0; i < kNumLayers; i++) { + int clsSize = (track.itsClusterSizes() >> (kBitsPerLayer * i)) & kBitMask; + sum += clsSize; + if (clsSize) n++; } return n > 0 ? static_cast(sum) / n : 0.f; From 6d9c8986b6d1d133a709006d4c6285f4e8c7ff10 Mon Sep 17 00:00:00 2001 From: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> Date: Wed, 21 May 2025 00:20:28 +0200 Subject: [PATCH 1344/1650] [PWGLF] Add TPC PID Vs mass correlation cuts + other fix in the strangenessbuilder (#11268) --- .../Strangeness/strangederivedbuilder.cxx | 12 +- .../Strangeness/strangenessbuilder.cxx | 138 +++++- .../derivedlambdakzeroanalysis.cxx | 452 +++++++++--------- 3 files changed, 373 insertions(+), 229 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx index f6ffacc7733..8140448576a 100644 --- a/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangederivedbuilder.cxx @@ -245,7 +245,8 @@ struct strangederivedbuilder { if (doprocessTrackExtrasV0sOnly + doprocessTrackExtras + doprocessTrackExtrasNoPID + - doprocessTrackExtrasMC > + doprocessTrackExtrasMC + + doprocessTrackExtrasMCNoPID > 1) { LOGF(fatal, "You have enabled more than one process function associated to TracksExtra. Please check your configuration! Aborting now."); } @@ -332,6 +333,9 @@ struct strangederivedbuilder { if (doprocessTrackExtrasMC) { LOGF(info, "TracksExtra processing type.......: V0s + cascades, Monte Carlo"); } + if (doprocessTrackExtrasMCNoPID) { + LOGF(info, "TracksExtra processing type.......: V0s + cascades, Monte Carlo"); + } LOGF(info, "====] cascade interlink processing [=============================="); if (doprocessCascadeInterlinkTracked) { LOGF(info, "Process cascade/tracked interlink.: yes"); @@ -836,6 +840,11 @@ struct strangederivedbuilder { fillTrackExtras(V0s, Cascades, KFCascades, TraCascades, tracksExtra); } + void processTrackExtrasMCNoPID(aod::V0Datas const& V0s, aod::CascDatas const& Cascades, aod::KFCascDatas const& KFCascades, aod::TraCascDatas const& TraCascades, soa::Join const& tracksExtra, aod::V0s const&) + { + fillTrackExtras(V0s, Cascades, KFCascades, TraCascades, tracksExtra); + } + void processStrangeMothers(soa::Join const& V0s, soa::Join const& Cascades, aod::McParticles const& mcParticles) { std::vector motherReference(mcParticles.size(), -1); // index -1: not used / no reference @@ -1108,6 +1117,7 @@ struct strangederivedbuilder { PROCESS_SWITCH(strangederivedbuilder, processTrackExtras, "Produce track extra information (V0s + casc)", true); PROCESS_SWITCH(strangederivedbuilder, processTrackExtrasNoPID, "Produce track extra information (V0s + casc), no PID", false); PROCESS_SWITCH(strangederivedbuilder, processTrackExtrasMC, "Produce track extra information (V0s + casc)", false); + PROCESS_SWITCH(strangederivedbuilder, processTrackExtrasMCNoPID, "Produce track extra information (V0s + casc), no PID", false); PROCESS_SWITCH(strangederivedbuilder, processStrangeMothers, "Produce tables with mother info for V0s + casc", true); PROCESS_SWITCH(strangederivedbuilder, processCascadeInterlinkTracked, "Produce tables interconnecting cascades", false); PROCESS_SWITCH(strangederivedbuilder, processCascadeInterlinkKF, "Produce tables interconnecting cascades", false); diff --git a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx index cea901b0fb2..db45cb6e5c8 100644 --- a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx @@ -138,12 +138,16 @@ static const int defaultParameters[nTablesConst][nParameters]{ // use parameters + cov mat non-propagated, aux info + (extension propagated) using FullTracksExt = soa::Join; using FullTracksExtIU = soa::Join; +using FullTracksExtWithPID = soa::Join; +using FullTracksExtIUWithPID = soa::Join; using FullTracksExtLabeled = soa::Join; using FullTracksExtLabeledIU = soa::Join; +using FullTracksExtLabeledWithPID = soa::Join; +using FullTracksExtLabeledIUWithPID = soa::Join; using TracksWithExtra = soa::Join; // For dE/dx association in pre-selection -using TracksExtraWithPID = soa::Join; +using TracksExtraWithPID = soa::Join; struct StrangenessBuilder { // helper object @@ -346,6 +350,46 @@ struct StrangenessBuilder { Configurable mc_findableDetachedCascade{"mc_findableDetachedCascade", false, "if true, generate findable cascades that have collisionId -1. Caution advised."}; } cascadeBuilderOpts; + static constexpr float defaultK0MassWindowParameters[1][4] = {{2.81882e-03, 1.14057e-03, 1.72138e-03, 5.00262e-01}}; + static constexpr float defaultLambdaWindowParameters[1][4] = {{1.17518e-03, 1.24099e-04, 5.47937e-03, 3.08009e-01}}; + static constexpr float defaultXiMassWindowParameters[1][4] = {{1.43210e-03, 2.03561e-04, 2.43187e-03, 7.99668e-01}}; + static constexpr float defaultOmMassWindowParameters[1][4] = {{1.43210e-03, 2.03561e-04, 2.43187e-03, 7.99668e-01}}; + // preselection options + struct : ConfigurableGroup { + std::string prefix = "preSelectOpts"; + Configurable preselectOnlyDesiredV0s{"preselectOnlyDesiredV0s", false, "preselect only V0s with compatible TPC PID and mass info"}; + Configurable preselectOnlyDesiredCascades{"preselectOnlyDesiredCascades", false, "preselect only Cascades with compatible TPC PID and mass info"}; + + // mass preselection options + Configurable massCutPhoton{"massCutPhoton", 0.3, "Photon max mass"}; + Configurable> massCutK0{"massCutK0", {defaultK0MassWindowParameters[0], 4, {"constant", "linear", "expoConstant", "expoRelax"}}, "mass parameters for K0"}; + Configurable> massCutLambda{"massCutLambda", {defaultLambdaWindowParameters[0], 4, {"constant", "linear", "expoConstant", "expoRelax"}}, "mass parameters for Lambda"}; + Configurable> massCutXi{"massCutXi", {defaultXiMassWindowParameters[0], 4, {"constant", "linear", "expoConstant", "expoRelax"}}, "mass parameters for Xi"}; + Configurable> massCutOm{"massCutOm", {defaultOmMassWindowParameters[0], 4, {"constant", "linear", "expoConstant", "expoRelax"}}, "mass parameters for Omega"}; + Configurable massWindownumberOfSigmas{"massWindownumberOfSigmas", 20, "number of sigmas around mass peaks to keep"}; + Configurable massWindowSafetyMargin{"massWindowSafetyMargin", 0.001, "Extra mass window safety margin (in GeV/c2)"}; + + // TPC PID preselection options + Configurable maxTPCpidNsigma{"maxTPCpidNsigma", 5.0, "Maximum TPC PID N sigma (in abs value)"}; + } preSelectOpts; + + float getMassSigmaK0Short(float pt) + { + return preSelectOpts.massCutK0->get("constant") + pt * preSelectOpts.massCutK0->get("linear") + preSelectOpts.massCutK0->get("expoConstant") * TMath::Exp(-pt / preSelectOpts.massCutK0->get("expoRelax")); + } + float getMassSigmaLambda(float pt) + { + return preSelectOpts.massCutLambda->get("constant") + pt * preSelectOpts.massCutLambda->get("linear") + preSelectOpts.massCutLambda->get("expoConstant") * TMath::Exp(-pt / preSelectOpts.massCutLambda->get("expoRelax")); + } + float getMassSigmaXi(float pt) + { + return preSelectOpts.massCutXi->get("constant") + pt * preSelectOpts.massCutXi->get("linear") + preSelectOpts.massCutXi->get("expoConstant") * TMath::Exp(-pt / preSelectOpts.massCutXi->get("expoRelax")); + } + float getMassSigmaOmega(float pt) + { + return preSelectOpts.massCutOm->get("constant") + pt * preSelectOpts.massCutOm->get("linear") + preSelectOpts.massCutOm->get("expoConstant") * TMath::Exp(-pt / preSelectOpts.massCutOm->get("expoRelax")); + } + o2::ccdb::CcdbApi ccdbApi; Service ccdb; @@ -1310,6 +1354,34 @@ struct StrangenessBuilder { products.v0dataLink(-1, -1); continue; } + if constexpr (requires { posTrack.tpcNSigmaEl(); }) { + if (preSelectOpts.preselectOnlyDesiredV0s) { + float lPt = RecoDecay::sqrtSumOfSquares( + straHelper.v0.positiveMomentum[0] + straHelper.v0.negativeMomentum[0], + straHelper.v0.positiveMomentum[1] + straHelper.v0.negativeMomentum[1]); + + if ( + !( // photon PID and mass selection + std::abs(posTrack.tpcNSigmaEl()) < preSelectOpts.maxTPCpidNsigma && + std::abs(negTrack.tpcNSigmaEl()) < preSelectOpts.maxTPCpidNsigma && + std::abs(straHelper.v0.massGamma) < preSelectOpts.massCutPhoton) && + !( // K0Short PID and mass selection + std::abs(posTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && + std::abs(negTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && + std::abs(straHelper.v0.massK0Short - o2::constants::physics::MassKaonNeutral) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaK0Short(lPt) + preSelectOpts.massWindowSafetyMargin) && + !( // Lambda PID and mass selection + std::abs(posTrack.tpcNSigmaPr()) < preSelectOpts.maxTPCpidNsigma && + std::abs(negTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && + std::abs(straHelper.v0.massLambda - o2::constants::physics::MassLambda) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaLambda(lPt) + preSelectOpts.massWindowSafetyMargin) && + !( // antiLambda PID and mass selection + std::abs(posTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && + std::abs(negTrack.tpcNSigmaPr()) < preSelectOpts.maxTPCpidNsigma && + std::abs(straHelper.v0.massAntiLambda - o2::constants::physics::MassLambda) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaLambda(lPt) + preSelectOpts.massWindowSafetyMargin)) { + products.v0dataLink(-1, -1); + continue; + } + } + } if (v0Map[iv0] == -1 && useV0BufferForCascades) { v0Map[iv0] = v0sFromCascades.size(); // provide actual valid index in buffer v0sFromCascades.push_back(straHelper.v0); @@ -1751,7 +1823,7 @@ struct StrangenessBuilder { // limited commodity, this isn't the default option. // check if cached - if not, skip - if (v0Map[cascade.v0Id] < 0) { + if (cascade.v0Id < 0 || v0Map[cascade.v0Id] < 0) { // this V0 hasn't been stored / cached products.cascdataLink(-1); interlinks.cascadeToCascCores.push_back(-1); @@ -1787,6 +1859,44 @@ struct StrangenessBuilder { } nCascades++; + if constexpr (requires { posTrack.tpcNSigmaEl(); }) { + if (preSelectOpts.preselectOnlyDesiredCascades) { + if ( + float lPt = RecoDecay::sqrtSumOfSquares( + straHelper.cascade.bachelorMomentum[0] + straHelper.cascade.positiveMomentum[0] + straHelper.cascade.negativeMomentum[0], + straHelper.cascade.bachelorMomentum[1] + straHelper.cascade.positiveMomentum[1] + straHelper.cascade.negativeMomentum[1]); + + !( // XiMinus PID and mass selection + straHelper.cascade.charge < 0 && + std::abs(posTrack.tpcNSigmaPr()) < preSelectOpts.maxTPCpidNsigma && + std::abs(negTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && + std::abs(bachTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && + std::abs(straHelper.cascade.massXi - o2::constants::physics::MassXiMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaXi(lPt) + preSelectOpts.massWindowSafetyMargin) && + !( // XiPlus PID and mass selection + straHelper.cascade.charge > 0 && + std::abs(posTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && + std::abs(negTrack.tpcNSigmaPr()) < preSelectOpts.maxTPCpidNsigma && + std::abs(bachTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && + std::abs(straHelper.cascade.massXi - o2::constants::physics::MassXiMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaXi(lPt) + preSelectOpts.massWindowSafetyMargin) && + !( // OmegaMinus PID and mass selection + straHelper.cascade.charge < 0 && + std::abs(posTrack.tpcNSigmaPr()) < preSelectOpts.maxTPCpidNsigma && + std::abs(negTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && + std::abs(bachTrack.tpcNSigmaKa()) < preSelectOpts.maxTPCpidNsigma && + std::abs(straHelper.cascade.massOmega - o2::constants::physics::MassOmegaMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaOmega(lPt) + preSelectOpts.massWindowSafetyMargin) && + !( // OmegaPlus PID and mass selection + straHelper.cascade.charge > 0 && + std::abs(posTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && + std::abs(negTrack.tpcNSigmaPr()) < preSelectOpts.maxTPCpidNsigma && + std::abs(bachTrack.tpcNSigmaKa()) < preSelectOpts.maxTPCpidNsigma && + std::abs(straHelper.cascade.massOmega - o2::constants::physics::MassOmegaMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaOmega(lPt) + preSelectOpts.massWindowSafetyMargin)) { + products.cascdataLink(-1); + interlinks.cascadeToCascCores.push_back(-1); + continue; + } + } + } + // generate analysis tables as required if (mEnabledTables[kCascIndices]) { products.cascidx(cascade.globalId, @@ -2342,10 +2452,34 @@ struct StrangenessBuilder { dataProcess(collisions, mccollisions, v0s, cascades, static_cast(nullptr), tracks, bcs, mcParticles); } + void processRealDataWithPID(soa::Join const& collisions, aod::V0s const& v0s, aod::Cascades const& cascades, aod::TrackedCascades const& trackedCascades, FullTracksExtIUWithPID const& tracks, aod::BCsWithTimestamps const& bcs) + { + dataProcess(collisions, static_cast(nullptr), v0s, cascades, trackedCascades, tracks, bcs, static_cast(nullptr)); + } + + void processRealDataRun2WithPID(soa::Join const& collisions, aod::V0s const& v0s, aod::Cascades const& cascades, FullTracksExtWithPID const& tracks, aod::BCsWithTimestamps const& bcs) + { + dataProcess(collisions, static_cast(nullptr), v0s, cascades, static_cast(nullptr), tracks, bcs, static_cast(nullptr)); + } + + void processMonteCarloWithPID(soa::Join const& collisions, aod::McCollisions const& mccollisions, aod::V0s const& v0s, aod::Cascades const& cascades, aod::TrackedCascades const& trackedCascades, FullTracksExtLabeledIUWithPID const& tracks, aod::BCsWithTimestamps const& bcs, aod::McParticles const& mcParticles) + { + dataProcess(collisions, mccollisions, v0s, cascades, trackedCascades, tracks, bcs, mcParticles); + } + + void processMonteCarloRun2WithPID(soa::Join const& collisions, aod::McCollisions const& mccollisions, aod::V0s const& v0s, aod::Cascades const& cascades, FullTracksExtLabeledWithPID const& tracks, aod::BCsWithTimestamps const& bcs, aod::McParticles const& mcParticles) + { + dataProcess(collisions, mccollisions, v0s, cascades, static_cast(nullptr), tracks, bcs, mcParticles); + } + PROCESS_SWITCH(StrangenessBuilder, processRealData, "process real data", true); PROCESS_SWITCH(StrangenessBuilder, processRealDataRun2, "process real data (Run 2)", false); PROCESS_SWITCH(StrangenessBuilder, processMonteCarlo, "process monte carlo", false); PROCESS_SWITCH(StrangenessBuilder, processMonteCarloRun2, "process monte carlo (Run 2)", false); + PROCESS_SWITCH(StrangenessBuilder, processRealDataWithPID, "process real data", false); + PROCESS_SWITCH(StrangenessBuilder, processRealDataRun2WithPID, "process real data (Run 2)", false); + PROCESS_SWITCH(StrangenessBuilder, processMonteCarloWithPID, "process monte carlo", false); + PROCESS_SWITCH(StrangenessBuilder, processMonteCarloRun2WithPID, "process monte carlo (Run 2)", false); }; // Extends the v0data table with expression columns diff --git a/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx b/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx index d8c3405c32f..544ed23807a 100644 --- a/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/derivedlambdakzeroanalysis.cxx @@ -38,7 +38,7 @@ #include #include -#include +#include #include #include #include @@ -554,7 +554,7 @@ struct derivedlambdakzeroanalysis { rctFlagsChecker.init(rctConfigurations.cfgRCTLabel.value, rctConfigurations.cfgCheckZDC, rctConfigurations.cfgTreatLimitedAcceptanceAsBad); // Event Counters - histos.add("hEventSelection", "hEventSelection", kTH1F, {{21, -0.5f, +20.5f}}); + histos.add("hEventSelection", "hEventSelection", kTH1D, {{21, -0.5f, +20.5f}}); if (isRun3) { histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(1, "All collisions"); histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(2, "sel8 cut"); @@ -605,30 +605,30 @@ struct derivedlambdakzeroanalysis { } } - histos.add("hEventCentrality", "hEventCentrality", kTH1F, {{101, 0.0f, 101.0f}}); - histos.add("hCentralityVsNch", "hCentralityVsNch", kTH2F, {{101, 0.0f, 101.0f}, axisNch}); + histos.add("hEventCentrality", "hEventCentrality", kTH1D, {{101, 0.0f, 101.0f}}); + histos.add("hCentralityVsNch", "hCentralityVsNch", kTH2D, {{101, 0.0f, 101.0f}, axisNch}); - histos.add("hEventPVz", "hEventPVz", kTH1F, {{100, -20.0f, +20.0f}}); - histos.add("hCentralityVsPVz", "hCentralityVsPVz", kTH2F, {{101, 0.0f, 101.0f}, {100, -20.0f, +20.0f}}); + histos.add("hEventPVz", "hEventPVz", kTH1D, {{100, -20.0f, +20.0f}}); + histos.add("hCentralityVsPVz", "hCentralityVsPVz", kTH2D, {{101, 0.0f, 101.0f}, {100, -20.0f, +20.0f}}); if (doprocessGeneratedRun3 || doprocessGeneratedRun2) { - histos.add("hEventPVzMC", "hEventPVzMC", kTH1F, {{100, -20.0f, +20.0f}}); - histos.add("hCentralityVsPVzMC", "hCentralityVsPVzMC", kTH2F, {{101, 0.0f, 101.0f}, {100, -20.0f, +20.0f}}); + histos.add("hEventPVzMC", "hEventPVzMC", kTH1D, {{100, -20.0f, +20.0f}}); + histos.add("hCentralityVsPVzMC", "hCentralityVsPVzMC", kTH2D, {{101, 0.0f, 101.0f}, {100, -20.0f, +20.0f}}); } - histos.add("hEventOccupancy", "hEventOccupancy", kTH1F, {axisOccupancy}); - histos.add("hCentralityVsOccupancy", "hCentralityVsOccupancy", kTH2F, {{101, 0.0f, 101.0f}, axisOccupancy}); + histos.add("hEventOccupancy", "hEventOccupancy", kTH1D, {axisOccupancy}); + histos.add("hCentralityVsOccupancy", "hCentralityVsOccupancy", kTH2D, {{101, 0.0f, 101.0f}, axisOccupancy}); - histos.add("hGapSide", "Gap side; Entries", kTH1F, {{5, -0.5, 4.5}}); - histos.add("hSelGapSide", "Selected gap side; Entries", kTH1F, {axisSelGap}); - histos.add("hEventCentralityVsSelGapSide", ";Centrality (%); Selected gap side", kTH2F, {{101, 0.0f, 101.0f}, axisSelGap}); + histos.add("hGapSide", "Gap side; Entries", kTH1D, {{5, -0.5, 4.5}}); + histos.add("hSelGapSide", "Selected gap side; Entries", kTH1D, {axisSelGap}); + histos.add("hEventCentralityVsSelGapSide", ";Centrality (%); Selected gap side", kTH2D, {{101, 0.0f, 101.0f}, axisSelGap}); - histos.add("hInteractionRate", "hInteractionRate", kTH1F, {axisIRBinning}); - histos.add("hCentralityVsInteractionRate", "hCentralityVsInteractionRate", kTH2F, {{101, 0.0f, 101.0f}, axisIRBinning}); + histos.add("hInteractionRate", "hInteractionRate", kTH1D, {axisIRBinning}); + histos.add("hCentralityVsInteractionRate", "hCentralityVsInteractionRate", kTH2D, {{101, 0.0f, 101.0f}, axisIRBinning}); - histos.add("hInteractionRateVsOccupancy", "hInteractionRateVsOccupancy", kTH2F, {axisIRBinning, axisOccupancy}); + histos.add("hInteractionRateVsOccupancy", "hInteractionRateVsOccupancy", kTH2D, {axisIRBinning, axisOccupancy}); // for QA and test purposes - auto hRawCentrality = histos.add("hRawCentrality", "hRawCentrality", kTH1F, {axisRawCentrality}); + auto hRawCentrality = histos.add("hRawCentrality", "hRawCentrality", kTH1D, {axisRawCentrality}); for (int ii = 1; ii < 101; ii++) { float value = 100.5f - static_cast(ii); @@ -641,297 +641,297 @@ struct derivedlambdakzeroanalysis { // histograms versus mass if (analyseK0Short) { - histos.add("h2dNbrOfK0ShortVsCentrality", "h2dNbrOfK0ShortVsCentrality", kTH2F, {axisCentrality, {10, -0.5f, 9.5f}}); - histos.add("h3dMassK0Short", "h3dMassK0Short", kTH3F, {axisCentrality, axisPt, axisK0Mass}); + histos.add("h2dNbrOfK0ShortVsCentrality", "h2dNbrOfK0ShortVsCentrality", kTH2D, {axisCentrality, {10, -0.5f, 9.5f}}); + histos.add("h3dMassK0Short", "h3dMassK0Short", kTH3D, {axisCentrality, axisPt, axisK0Mass}); // Non-UPC info - histos.add("h3dMassK0ShortHadronic", "h3dMassK0ShortHadronic", kTH3F, {axisCentrality, axisPt, axisK0Mass}); + histos.add("h3dMassK0ShortHadronic", "h3dMassK0ShortHadronic", kTH3D, {axisCentrality, axisPt, axisK0Mass}); // UPC info - histos.add("h3dMassK0ShortSGA", "h3dMassK0ShortSGA", kTH3F, {axisCentrality, axisPt, axisK0Mass}); - histos.add("h3dMassK0ShortSGC", "h3dMassK0ShortSGC", kTH3F, {axisCentrality, axisPt, axisK0Mass}); - histos.add("h3dMassK0ShortDG", "h3dMassK0ShortDG", kTH3F, {axisCentrality, axisPt, axisK0Mass}); + histos.add("h3dMassK0ShortSGA", "h3dMassK0ShortSGA", kTH3D, {axisCentrality, axisPt, axisK0Mass}); + histos.add("h3dMassK0ShortSGC", "h3dMassK0ShortSGC", kTH3D, {axisCentrality, axisPt, axisK0Mass}); + histos.add("h3dMassK0ShortDG", "h3dMassK0ShortDG", kTH3D, {axisCentrality, axisPt, axisK0Mass}); if (doTPCQA) { - histos.add("K0Short/h3dPosNsigmaTPC", "h3dPosNsigmaTPC", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); - histos.add("K0Short/h3dNegNsigmaTPC", "h3dNegNsigmaTPC", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); - histos.add("K0Short/h3dPosTPCsignal", "h3dPosTPCsignal", kTH3F, {axisCentrality, axisPtCoarse, axisTPCsignal}); - histos.add("K0Short/h3dNegTPCsignal", "h3dNegTPCsignal", kTH3F, {axisCentrality, axisPtCoarse, axisTPCsignal}); - histos.add("K0Short/h3dPosNsigmaTPCvsTrackPtot", "h3dPosNsigmaTPCvsTrackPtot", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); - histos.add("K0Short/h3dNegNsigmaTPCvsTrackPtot", "h3dNegNsigmaTPCvsTrackPtot", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); - histos.add("K0Short/h3dPosTPCsignalVsTrackPtot", "h3dPosTPCsignalVsTrackPtot", kTH3F, {axisCentrality, axisPtCoarse, axisTPCsignal}); - histos.add("K0Short/h3dNegTPCsignalVsTrackPtot", "h3dNegTPCsignalVsTrackPtot", kTH3F, {axisCentrality, axisPtCoarse, axisTPCsignal}); - histos.add("K0Short/h3dPosNsigmaTPCvsTrackPt", "h3dPosNsigmaTPCvsTrackPt", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); - histos.add("K0Short/h3dNegNsigmaTPCvsTrackPt", "h3dNegNsigmaTPCvsTrackPt", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); - histos.add("K0Short/h3dPosTPCsignalVsTrackPt", "h3dPosTPCsignalVsTrackPt", kTH3F, {axisCentrality, axisPtCoarse, axisTPCsignal}); - histos.add("K0Short/h3dNegTPCsignalVsTrackPt", "h3dNegTPCsignalVsTrackPt", kTH3F, {axisCentrality, axisPtCoarse, axisTPCsignal}); + histos.add("K0Short/h3dPosNsigmaTPC", "h3dPosNsigmaTPC", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); + histos.add("K0Short/h3dNegNsigmaTPC", "h3dNegNsigmaTPC", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); + histos.add("K0Short/h3dPosTPCsignal", "h3dPosTPCsignal", kTH3D, {axisCentrality, axisPtCoarse, axisTPCsignal}); + histos.add("K0Short/h3dNegTPCsignal", "h3dNegTPCsignal", kTH3D, {axisCentrality, axisPtCoarse, axisTPCsignal}); + histos.add("K0Short/h3dPosNsigmaTPCvsTrackPtot", "h3dPosNsigmaTPCvsTrackPtot", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); + histos.add("K0Short/h3dNegNsigmaTPCvsTrackPtot", "h3dNegNsigmaTPCvsTrackPtot", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); + histos.add("K0Short/h3dPosTPCsignalVsTrackPtot", "h3dPosTPCsignalVsTrackPtot", kTH3D, {axisCentrality, axisPtCoarse, axisTPCsignal}); + histos.add("K0Short/h3dNegTPCsignalVsTrackPtot", "h3dNegTPCsignalVsTrackPtot", kTH3D, {axisCentrality, axisPtCoarse, axisTPCsignal}); + histos.add("K0Short/h3dPosNsigmaTPCvsTrackPt", "h3dPosNsigmaTPCvsTrackPt", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); + histos.add("K0Short/h3dNegNsigmaTPCvsTrackPt", "h3dNegNsigmaTPCvsTrackPt", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); + histos.add("K0Short/h3dPosTPCsignalVsTrackPt", "h3dPosTPCsignalVsTrackPt", kTH3D, {axisCentrality, axisPtCoarse, axisTPCsignal}); + histos.add("K0Short/h3dNegTPCsignalVsTrackPt", "h3dNegTPCsignalVsTrackPt", kTH3D, {axisCentrality, axisPtCoarse, axisTPCsignal}); } if (doTOFQA) { - histos.add("K0Short/h3dPosNsigmaTOF", "h3dPosNsigmaTOF", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); - histos.add("K0Short/h3dNegNsigmaTOF", "h3dNegNsigmaTOF", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); - histos.add("K0Short/h3dPosTOFdeltaT", "h3dPosTOFdeltaT", kTH3F, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); - histos.add("K0Short/h3dNegTOFdeltaT", "h3dNegTOFdeltaT", kTH3F, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); - histos.add("K0Short/h3dPosNsigmaTOFvsTrackPtot", "h3dPosNsigmaTOFvsTrackPtot", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); - histos.add("K0Short/h3dNegNsigmaTOFvsTrackPtot", "h3dNegNsigmaTOFvsTrackPtot", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); - histos.add("K0Short/h3dPosTOFdeltaTvsTrackPtot", "h3dPosTOFdeltaTvsTrackPtot", kTH3F, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); - histos.add("K0Short/h3dNegTOFdeltaTvsTrackPtot", "h3dNegTOFdeltaTvsTrackPtot", kTH3F, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); - histos.add("K0Short/h3dPosNsigmaTOFvsTrackPt", "h3dPosNsigmaTOFvsTrackPt", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); - histos.add("K0Short/h3dNegNsigmaTOFvsTrackPt", "h3dNegNsigmaTOFvsTrackPt", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); - histos.add("K0Short/h3dPosTOFdeltaTvsTrackPt", "h3dPosTOFdeltaTvsTrackPt", kTH3F, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); - histos.add("K0Short/h3dNegTOFdeltaTvsTrackPt", "h3dNegTOFdeltaTvsTrackPt", kTH3F, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); + histos.add("K0Short/h3dPosNsigmaTOF", "h3dPosNsigmaTOF", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); + histos.add("K0Short/h3dNegNsigmaTOF", "h3dNegNsigmaTOF", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); + histos.add("K0Short/h3dPosTOFdeltaT", "h3dPosTOFdeltaT", kTH3D, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); + histos.add("K0Short/h3dNegTOFdeltaT", "h3dNegTOFdeltaT", kTH3D, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); + histos.add("K0Short/h3dPosNsigmaTOFvsTrackPtot", "h3dPosNsigmaTOFvsTrackPtot", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); + histos.add("K0Short/h3dNegNsigmaTOFvsTrackPtot", "h3dNegNsigmaTOFvsTrackPtot", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); + histos.add("K0Short/h3dPosTOFdeltaTvsTrackPtot", "h3dPosTOFdeltaTvsTrackPtot", kTH3D, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); + histos.add("K0Short/h3dNegTOFdeltaTvsTrackPtot", "h3dNegTOFdeltaTvsTrackPtot", kTH3D, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); + histos.add("K0Short/h3dPosNsigmaTOFvsTrackPt", "h3dPosNsigmaTOFvsTrackPt", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); + histos.add("K0Short/h3dNegNsigmaTOFvsTrackPt", "h3dNegNsigmaTOFvsTrackPt", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); + histos.add("K0Short/h3dPosTOFdeltaTvsTrackPt", "h3dPosTOFdeltaTvsTrackPt", kTH3D, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); + histos.add("K0Short/h3dNegTOFdeltaTvsTrackPt", "h3dNegTOFdeltaTvsTrackPt", kTH3D, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); } if (doCollisionAssociationQA) { - histos.add("K0Short/h2dPtVsNch", "h2dPtVsNch", kTH2F, {axisMonteCarloNch, axisPt}); - histos.add("K0Short/h2dPtVsNch_BadCollAssig", "h2dPtVsNch_BadCollAssig", kTH2F, {axisMonteCarloNch, axisPt}); + histos.add("K0Short/h2dPtVsNch", "h2dPtVsNch", kTH2D, {axisMonteCarloNch, axisPt}); + histos.add("K0Short/h2dPtVsNch_BadCollAssig", "h2dPtVsNch_BadCollAssig", kTH2D, {axisMonteCarloNch, axisPt}); } if (doDetectPropQA == 1) { - histos.add("K0Short/h6dDetectPropVsCentrality", "h6dDetectPropVsCentrality", kTHnF, {axisCentrality, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse}); - histos.add("K0Short/h4dPosDetectPropVsCentrality", "h4dPosDetectPropVsCentrality", kTHnF, {axisCentrality, axisDetMap, axisITScluMap, axisPtCoarse}); - histos.add("K0Short/h4dNegDetectPropVsCentrality", "h4dNegDetectPropVsCentrality", kTHnF, {axisCentrality, axisDetMap, axisITScluMap, axisPtCoarse}); + histos.add("K0Short/h6dDetectPropVsCentrality", "h6dDetectPropVsCentrality", kTHnD, {axisCentrality, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse}); + histos.add("K0Short/h4dPosDetectPropVsCentrality", "h4dPosDetectPropVsCentrality", kTHnD, {axisCentrality, axisDetMap, axisITScluMap, axisPtCoarse}); + histos.add("K0Short/h4dNegDetectPropVsCentrality", "h4dNegDetectPropVsCentrality", kTHnD, {axisCentrality, axisDetMap, axisITScluMap, axisPtCoarse}); } if (doDetectPropQA == 2) { - histos.add("K0Short/h7dDetectPropVsCentrality", "h7dDetectPropVsCentrality", kTHnF, {axisCentrality, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse, axisK0Mass}); - histos.add("K0Short/h5dPosDetectPropVsCentrality", "h5dPosDetectPropVsCentrality", kTHnF, {axisCentrality, axisDetMap, axisITScluMap, axisPtCoarse, axisK0Mass}); - histos.add("K0Short/h5dNegDetectPropVsCentrality", "h5dNegDetectPropVsCentrality", kTHnF, {axisCentrality, axisDetMap, axisITScluMap, axisPtCoarse, axisK0Mass}); + histos.add("K0Short/h7dDetectPropVsCentrality", "h7dDetectPropVsCentrality", kTHnD, {axisCentrality, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse, axisK0Mass}); + histos.add("K0Short/h5dPosDetectPropVsCentrality", "h5dPosDetectPropVsCentrality", kTHnD, {axisCentrality, axisDetMap, axisITScluMap, axisPtCoarse, axisK0Mass}); + histos.add("K0Short/h5dNegDetectPropVsCentrality", "h5dNegDetectPropVsCentrality", kTHnD, {axisCentrality, axisDetMap, axisITScluMap, axisPtCoarse, axisK0Mass}); } if (doDetectPropQA == 3) { - histos.add("K0Short/h3dITSchi2", "h3dMaxITSchi2", kTH3F, {axisCentrality, axisPtCoarse, axisITSchi2}); - histos.add("K0Short/h3dTPCchi2", "h3dMaxTPCchi2", kTH3F, {axisCentrality, axisPtCoarse, axisTPCchi2}); - histos.add("K0Short/h3dTPCFoundOverFindable", "h3dTPCFoundOverFindable", kTH3F, {axisCentrality, axisPtCoarse, axisTPCfoundOverFindable}); - histos.add("K0Short/h3dTPCrowsOverFindable", "h3dTPCrowsOverFindable", kTH3F, {axisCentrality, axisPtCoarse, axisTPCrowsOverFindable}); - histos.add("K0Short/h3dTPCsharedCls", "h3dTPCsharedCls", kTH3F, {axisCentrality, axisPtCoarse, axisTPCsharedClusters}); - histos.add("K0Short/h3dPositiveITSchi2", "h3dPositiveITSchi2", kTH3F, {axisCentrality, axisPtCoarse, axisITSchi2}); - histos.add("K0Short/h3dNegativeITSchi2", "h3dNegativeITSchi2", kTH3F, {axisCentrality, axisPtCoarse, axisITSchi2}); - histos.add("K0Short/h3dPositiveTPCchi2", "h3dPositiveTPCchi2", kTH3F, {axisCentrality, axisPtCoarse, axisTPCchi2}); - histos.add("K0Short/h3dNegativeTPCchi2", "h3dNegativeTPCchi2", kTH3F, {axisCentrality, axisPtCoarse, axisTPCchi2}); - histos.add("K0Short/h3dPositiveITSclusters", "h3dPositiveITSclusters", kTH3F, {axisCentrality, axisPtCoarse, axisITSclus}); - histos.add("K0Short/h3dNegativeITSclusters", "h3dNegativeITSclusters", kTH3F, {axisCentrality, axisPtCoarse, axisITSclus}); - histos.add("K0Short/h3dPositiveTPCcrossedRows", "h3dPositiveTPCcrossedRows", kTH3F, {axisCentrality, axisPtCoarse, axisTPCrows}); - histos.add("K0Short/h3dNegativeTPCcrossedRows", "h3dNegativeTPCcrossedRows", kTH3F, {axisCentrality, axisPtCoarse, axisTPCrows}); + histos.add("K0Short/h3dITSchi2", "h3dMaxITSchi2", kTH3D, {axisCentrality, axisPtCoarse, axisITSchi2}); + histos.add("K0Short/h3dTPCchi2", "h3dMaxTPCchi2", kTH3D, {axisCentrality, axisPtCoarse, axisTPCchi2}); + histos.add("K0Short/h3dTPCFoundOverFindable", "h3dTPCFoundOverFindable", kTH3D, {axisCentrality, axisPtCoarse, axisTPCfoundOverFindable}); + histos.add("K0Short/h3dTPCrowsOverFindable", "h3dTPCrowsOverFindable", kTH3D, {axisCentrality, axisPtCoarse, axisTPCrowsOverFindable}); + histos.add("K0Short/h3dTPCsharedCls", "h3dTPCsharedCls", kTH3D, {axisCentrality, axisPtCoarse, axisTPCsharedClusters}); + histos.add("K0Short/h3dPositiveITSchi2", "h3dPositiveITSchi2", kTH3D, {axisCentrality, axisPtCoarse, axisITSchi2}); + histos.add("K0Short/h3dNegativeITSchi2", "h3dNegativeITSchi2", kTH3D, {axisCentrality, axisPtCoarse, axisITSchi2}); + histos.add("K0Short/h3dPositiveTPCchi2", "h3dPositiveTPCchi2", kTH3D, {axisCentrality, axisPtCoarse, axisTPCchi2}); + histos.add("K0Short/h3dNegativeTPCchi2", "h3dNegativeTPCchi2", kTH3D, {axisCentrality, axisPtCoarse, axisTPCchi2}); + histos.add("K0Short/h3dPositiveITSclusters", "h3dPositiveITSclusters", kTH3D, {axisCentrality, axisPtCoarse, axisITSclus}); + histos.add("K0Short/h3dNegativeITSclusters", "h3dNegativeITSclusters", kTH3D, {axisCentrality, axisPtCoarse, axisITSclus}); + histos.add("K0Short/h3dPositiveTPCcrossedRows", "h3dPositiveTPCcrossedRows", kTH3D, {axisCentrality, axisPtCoarse, axisTPCrows}); + histos.add("K0Short/h3dNegativeTPCcrossedRows", "h3dNegativeTPCcrossedRows", kTH3D, {axisCentrality, axisPtCoarse, axisTPCrows}); } } if (analyseLambda) { - histos.add("h2dNbrOfLambdaVsCentrality", "h2dNbrOfLambdaVsCentrality", kTH2F, {axisCentrality, {10, -0.5f, 9.5f}}); - histos.add("h3dMassLambda", "h3dMassLambda", kTH3F, {axisCentrality, axisPt, axisLambdaMass}); + histos.add("h2dNbrOfLambdaVsCentrality", "h2dNbrOfLambdaVsCentrality", kTH2D, {axisCentrality, {10, -0.5f, 9.5f}}); + histos.add("h3dMassLambda", "h3dMassLambda", kTH3D, {axisCentrality, axisPt, axisLambdaMass}); // Non-UPC info - histos.add("h3dMassLambdaHadronic", "h3dMassLambdaHadronic", kTH3F, {axisCentrality, axisPt, axisLambdaMass}); + histos.add("h3dMassLambdaHadronic", "h3dMassLambdaHadronic", kTH3D, {axisCentrality, axisPt, axisLambdaMass}); // UPC info - histos.add("h3dMassLambdaSGA", "h3dMassLambdaSGA", kTH3F, {axisCentrality, axisPt, axisLambdaMass}); - histos.add("h3dMassLambdaSGC", "h3dMassLambdaSGC", kTH3F, {axisCentrality, axisPt, axisLambdaMass}); - histos.add("h3dMassLambdaDG", "h3dMassLambdaDG", kTH3F, {axisCentrality, axisPt, axisLambdaMass}); + histos.add("h3dMassLambdaSGA", "h3dMassLambdaSGA", kTH3D, {axisCentrality, axisPt, axisLambdaMass}); + histos.add("h3dMassLambdaSGC", "h3dMassLambdaSGC", kTH3D, {axisCentrality, axisPt, axisLambdaMass}); + histos.add("h3dMassLambdaDG", "h3dMassLambdaDG", kTH3D, {axisCentrality, axisPt, axisLambdaMass}); if (doTPCQA) { - histos.add("Lambda/h3dPosNsigmaTPC", "h3dPosNsigmaTPC", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); - histos.add("Lambda/h3dNegNsigmaTPC", "h3dNegNsigmaTPC", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); - histos.add("Lambda/h3dPosTPCsignal", "h3dPosTPCsignal", kTH3F, {axisCentrality, axisPtCoarse, axisTPCsignal}); - histos.add("Lambda/h3dNegTPCsignal", "h3dNegTPCsignal", kTH3F, {axisCentrality, axisPtCoarse, axisTPCsignal}); - histos.add("Lambda/h3dPosNsigmaTPCvsTrackPtot", "h3dPosNsigmaTPCvsTrackPtot", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); - histos.add("Lambda/h3dNegNsigmaTPCvsTrackPtot", "h3dNegNsigmaTPCvsTrackPtot", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); - histos.add("Lambda/h3dPosTPCsignalVsTrackPtot", "h3dPosTPCsignalVsTrackPtot", kTH3F, {axisCentrality, axisPtCoarse, axisTPCsignal}); - histos.add("Lambda/h3dNegTPCsignalVsTrackPtot", "h3dNegTPCsignalVsTrackPtot", kTH3F, {axisCentrality, axisPtCoarse, axisTPCsignal}); - histos.add("Lambda/h3dPosNsigmaTPCvsTrackPt", "h3dPosNsigmaTPCvsTrackPt", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); - histos.add("Lambda/h3dNegNsigmaTPCvsTrackPt", "h3dNegNsigmaTPCvsTrackPt", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); - histos.add("Lambda/h3dPosTPCsignalVsTrackPt", "h3dPosTPCsignalVsTrackPt", kTH3F, {axisCentrality, axisPtCoarse, axisTPCsignal}); - histos.add("Lambda/h3dNegTPCsignalVsTrackPt", "h3dNegTPCsignalVsTrackPt", kTH3F, {axisCentrality, axisPtCoarse, axisTPCsignal}); + histos.add("Lambda/h3dPosNsigmaTPC", "h3dPosNsigmaTPC", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); + histos.add("Lambda/h3dNegNsigmaTPC", "h3dNegNsigmaTPC", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); + histos.add("Lambda/h3dPosTPCsignal", "h3dPosTPCsignal", kTH3D, {axisCentrality, axisPtCoarse, axisTPCsignal}); + histos.add("Lambda/h3dNegTPCsignal", "h3dNegTPCsignal", kTH3D, {axisCentrality, axisPtCoarse, axisTPCsignal}); + histos.add("Lambda/h3dPosNsigmaTPCvsTrackPtot", "h3dPosNsigmaTPCvsTrackPtot", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); + histos.add("Lambda/h3dNegNsigmaTPCvsTrackPtot", "h3dNegNsigmaTPCvsTrackPtot", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); + histos.add("Lambda/h3dPosTPCsignalVsTrackPtot", "h3dPosTPCsignalVsTrackPtot", kTH3D, {axisCentrality, axisPtCoarse, axisTPCsignal}); + histos.add("Lambda/h3dNegTPCsignalVsTrackPtot", "h3dNegTPCsignalVsTrackPtot", kTH3D, {axisCentrality, axisPtCoarse, axisTPCsignal}); + histos.add("Lambda/h3dPosNsigmaTPCvsTrackPt", "h3dPosNsigmaTPCvsTrackPt", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); + histos.add("Lambda/h3dNegNsigmaTPCvsTrackPt", "h3dNegNsigmaTPCvsTrackPt", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); + histos.add("Lambda/h3dPosTPCsignalVsTrackPt", "h3dPosTPCsignalVsTrackPt", kTH3D, {axisCentrality, axisPtCoarse, axisTPCsignal}); + histos.add("Lambda/h3dNegTPCsignalVsTrackPt", "h3dNegTPCsignalVsTrackPt", kTH3D, {axisCentrality, axisPtCoarse, axisTPCsignal}); } if (doTOFQA) { - histos.add("Lambda/h3dPosNsigmaTOF", "h3dPosNsigmaTOF", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); - histos.add("Lambda/h3dNegNsigmaTOF", "h3dNegNsigmaTOF", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); - histos.add("Lambda/h3dPosTOFdeltaT", "h3dPosTOFdeltaT", kTH3F, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); - histos.add("Lambda/h3dNegTOFdeltaT", "h3dNegTOFdeltaT", kTH3F, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); - histos.add("Lambda/h3dPosNsigmaTOFvsTrackPtot", "h3dPosNsigmaTOFvsTrackPtot", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); - histos.add("Lambda/h3dNegNsigmaTOFvsTrackPtot", "h3dNegNsigmaTOFvsTrackPtot", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); - histos.add("Lambda/h3dPosTOFdeltaTvsTrackPtot", "h3dPosTOFdeltaTvsTrackPtot", kTH3F, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); - histos.add("Lambda/h3dNegTOFdeltaTvsTrackPtot", "h3dNegTOFdeltaTvsTrackPtot", kTH3F, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); - histos.add("Lambda/h3dPosNsigmaTOFvsTrackPt", "h3dPosNsigmaTOFvsTrackPt", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); - histos.add("Lambda/h3dNegNsigmaTOFvsTrackPt", "h3dNegNsigmaTOFvsTrackPt", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); - histos.add("Lambda/h3dPosTOFdeltaTvsTrackPt", "h3dPosTOFdeltaTvsTrackPt", kTH3F, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); - histos.add("Lambda/h3dNegTOFdeltaTvsTrackPt", "h3dNegTOFdeltaTvsTrackPt", kTH3F, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); + histos.add("Lambda/h3dPosNsigmaTOF", "h3dPosNsigmaTOF", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); + histos.add("Lambda/h3dNegNsigmaTOF", "h3dNegNsigmaTOF", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); + histos.add("Lambda/h3dPosTOFdeltaT", "h3dPosTOFdeltaT", kTH3D, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); + histos.add("Lambda/h3dNegTOFdeltaT", "h3dNegTOFdeltaT", kTH3D, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); + histos.add("Lambda/h3dPosNsigmaTOFvsTrackPtot", "h3dPosNsigmaTOFvsTrackPtot", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); + histos.add("Lambda/h3dNegNsigmaTOFvsTrackPtot", "h3dNegNsigmaTOFvsTrackPtot", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); + histos.add("Lambda/h3dPosTOFdeltaTvsTrackPtot", "h3dPosTOFdeltaTvsTrackPtot", kTH3D, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); + histos.add("Lambda/h3dNegTOFdeltaTvsTrackPtot", "h3dNegTOFdeltaTvsTrackPtot", kTH3D, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); + histos.add("Lambda/h3dPosNsigmaTOFvsTrackPt", "h3dPosNsigmaTOFvsTrackPt", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); + histos.add("Lambda/h3dNegNsigmaTOFvsTrackPt", "h3dNegNsigmaTOFvsTrackPt", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); + histos.add("Lambda/h3dPosTOFdeltaTvsTrackPt", "h3dPosTOFdeltaTvsTrackPt", kTH3D, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); + histos.add("Lambda/h3dNegTOFdeltaTvsTrackPt", "h3dNegTOFdeltaTvsTrackPt", kTH3D, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); } if (doCollisionAssociationQA) { - histos.add("Lambda/h2dPtVsNch", "h2dPtVsNch", kTH2F, {axisMonteCarloNch, axisPt}); - histos.add("Lambda/h2dPtVsNch_BadCollAssig", "h2dPtVsNch_BadCollAssig", kTH2F, {axisMonteCarloNch, axisPt}); + histos.add("Lambda/h2dPtVsNch", "h2dPtVsNch", kTH2D, {axisMonteCarloNch, axisPt}); + histos.add("Lambda/h2dPtVsNch_BadCollAssig", "h2dPtVsNch_BadCollAssig", kTH2D, {axisMonteCarloNch, axisPt}); } if (doDetectPropQA == 1) { - histos.add("Lambda/h6dDetectPropVsCentrality", "h6dDetectPropVsCentrality", kTHnF, {axisCentrality, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse}); - histos.add("Lambda/h4dPosDetectPropVsCentrality", "h4dPosDetectPropVsCentrality", kTHnF, {axisCentrality, axisDetMap, axisITScluMap, axisPtCoarse}); - histos.add("Lambda/h4dNegDetectPropVsCentrality", "h4dNegDetectPropVsCentrality", kTHnF, {axisCentrality, axisDetMap, axisITScluMap, axisPtCoarse}); + histos.add("Lambda/h6dDetectPropVsCentrality", "h6dDetectPropVsCentrality", kTHnD, {axisCentrality, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse}); + histos.add("Lambda/h4dPosDetectPropVsCentrality", "h4dPosDetectPropVsCentrality", kTHnD, {axisCentrality, axisDetMap, axisITScluMap, axisPtCoarse}); + histos.add("Lambda/h4dNegDetectPropVsCentrality", "h4dNegDetectPropVsCentrality", kTHnD, {axisCentrality, axisDetMap, axisITScluMap, axisPtCoarse}); } if (doDetectPropQA == 2) { - histos.add("Lambda/h7dDetectPropVsCentrality", "h7dDetectPropVsCentrality", kTHnF, {axisCentrality, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse, axisLambdaMass}); - histos.add("Lambda/h5dPosDetectPropVsCentrality", "h5dPosDetectPropVsCentrality", kTHnF, {axisCentrality, axisDetMap, axisITScluMap, axisPtCoarse, axisLambdaMass}); - histos.add("Lambda/h5dNegDetectPropVsCentrality", "h5dNegDetectPropVsCentrality", kTHnF, {axisCentrality, axisDetMap, axisITScluMap, axisPtCoarse, axisLambdaMass}); + histos.add("Lambda/h7dDetectPropVsCentrality", "h7dDetectPropVsCentrality", kTHnD, {axisCentrality, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse, axisLambdaMass}); + histos.add("Lambda/h5dPosDetectPropVsCentrality", "h5dPosDetectPropVsCentrality", kTHnD, {axisCentrality, axisDetMap, axisITScluMap, axisPtCoarse, axisLambdaMass}); + histos.add("Lambda/h5dNegDetectPropVsCentrality", "h5dNegDetectPropVsCentrality", kTHnD, {axisCentrality, axisDetMap, axisITScluMap, axisPtCoarse, axisLambdaMass}); } if (doDetectPropQA == 3) { - histos.add("Lambda/h3dITSchi2", "h3dMaxITSchi2", kTH3F, {axisCentrality, axisPtCoarse, axisITSchi2}); - histos.add("Lambda/h3dTPCchi2", "h3dMaxTPCchi2", kTH3F, {axisCentrality, axisPtCoarse, axisTPCchi2}); - histos.add("Lambda/h3dTPCFoundOverFindable", "h3dTPCFoundOverFindable", kTH3F, {axisCentrality, axisPtCoarse, axisTPCfoundOverFindable}); - histos.add("Lambda/h3dTPCrowsOverFindable", "h3dTPCrowsOverFindable", kTH3F, {axisCentrality, axisPtCoarse, axisTPCrowsOverFindable}); - histos.add("Lambda/h3dTPCsharedCls", "h3dTPCsharedCls", kTH3F, {axisCentrality, axisPtCoarse, axisTPCsharedClusters}); - histos.add("Lambda/h3dPositiveITSchi2", "h3dPositiveITSchi2", kTH3F, {axisCentrality, axisPtCoarse, axisITSchi2}); - histos.add("Lambda/h3dNegativeITSchi2", "h3dNegativeITSchi2", kTH3F, {axisCentrality, axisPtCoarse, axisITSchi2}); - histos.add("Lambda/h3dPositiveTPCchi2", "h3dPositiveTPCchi2", kTH3F, {axisCentrality, axisPtCoarse, axisTPCchi2}); - histos.add("Lambda/h3dNegativeTPCchi2", "h3dNegativeTPCchi2", kTH3F, {axisCentrality, axisPtCoarse, axisTPCchi2}); - histos.add("Lambda/h3dPositiveITSclusters", "h3dPositiveITSclusters", kTH3F, {axisCentrality, axisPtCoarse, axisITSclus}); - histos.add("Lambda/h3dNegativeITSclusters", "h3dNegativeITSclusters", kTH3F, {axisCentrality, axisPtCoarse, axisITSclus}); - histos.add("Lambda/h3dPositiveTPCcrossedRows", "h3dPositiveTPCcrossedRows", kTH3F, {axisCentrality, axisPtCoarse, axisTPCrows}); - histos.add("Lambda/h3dNegativeTPCcrossedRows", "h3dNegativeTPCcrossedRows", kTH3F, {axisCentrality, axisPtCoarse, axisTPCrows}); + histos.add("Lambda/h3dITSchi2", "h3dMaxITSchi2", kTH3D, {axisCentrality, axisPtCoarse, axisITSchi2}); + histos.add("Lambda/h3dTPCchi2", "h3dMaxTPCchi2", kTH3D, {axisCentrality, axisPtCoarse, axisTPCchi2}); + histos.add("Lambda/h3dTPCFoundOverFindable", "h3dTPCFoundOverFindable", kTH3D, {axisCentrality, axisPtCoarse, axisTPCfoundOverFindable}); + histos.add("Lambda/h3dTPCrowsOverFindable", "h3dTPCrowsOverFindable", kTH3D, {axisCentrality, axisPtCoarse, axisTPCrowsOverFindable}); + histos.add("Lambda/h3dTPCsharedCls", "h3dTPCsharedCls", kTH3D, {axisCentrality, axisPtCoarse, axisTPCsharedClusters}); + histos.add("Lambda/h3dPositiveITSchi2", "h3dPositiveITSchi2", kTH3D, {axisCentrality, axisPtCoarse, axisITSchi2}); + histos.add("Lambda/h3dNegativeITSchi2", "h3dNegativeITSchi2", kTH3D, {axisCentrality, axisPtCoarse, axisITSchi2}); + histos.add("Lambda/h3dPositiveTPCchi2", "h3dPositiveTPCchi2", kTH3D, {axisCentrality, axisPtCoarse, axisTPCchi2}); + histos.add("Lambda/h3dNegativeTPCchi2", "h3dNegativeTPCchi2", kTH3D, {axisCentrality, axisPtCoarse, axisTPCchi2}); + histos.add("Lambda/h3dPositiveITSclusters", "h3dPositiveITSclusters", kTH3D, {axisCentrality, axisPtCoarse, axisITSclus}); + histos.add("Lambda/h3dNegativeITSclusters", "h3dNegativeITSclusters", kTH3D, {axisCentrality, axisPtCoarse, axisITSclus}); + histos.add("Lambda/h3dPositiveTPCcrossedRows", "h3dPositiveTPCcrossedRows", kTH3D, {axisCentrality, axisPtCoarse, axisTPCrows}); + histos.add("Lambda/h3dNegativeTPCcrossedRows", "h3dNegativeTPCcrossedRows", kTH3D, {axisCentrality, axisPtCoarse, axisTPCrows}); } } if (analyseAntiLambda) { - histos.add("h2dNbrOfAntiLambdaVsCentrality", "h2dNbrOfAntiLambdaVsCentrality", kTH2F, {axisCentrality, {10, -0.5f, 9.5f}}); - histos.add("h3dMassAntiLambda", "h3dMassAntiLambda", kTH3F, {axisCentrality, axisPt, axisLambdaMass}); + histos.add("h2dNbrOfAntiLambdaVsCentrality", "h2dNbrOfAntiLambdaVsCentrality", kTH2D, {axisCentrality, {10, -0.5f, 9.5f}}); + histos.add("h3dMassAntiLambda", "h3dMassAntiLambda", kTH3D, {axisCentrality, axisPt, axisLambdaMass}); // Non-UPC info - histos.add("h3dMassAntiLambdaHadronic", "h3dMassAntiLambdaHadronic", kTH3F, {axisCentrality, axisPt, axisLambdaMass}); + histos.add("h3dMassAntiLambdaHadronic", "h3dMassAntiLambdaHadronic", kTH3D, {axisCentrality, axisPt, axisLambdaMass}); // UPC info - histos.add("h3dMassAntiLambdaSGA", "h3dMassAntiLambdaSGA", kTH3F, {axisCentrality, axisPt, axisLambdaMass}); - histos.add("h3dMassAntiLambdaSGC", "h3dMassAntiLambdaSGC", kTH3F, {axisCentrality, axisPt, axisLambdaMass}); - histos.add("h3dMassAntiLambdaDG", "h3dMassAntiLambdaDG", kTH3F, {axisCentrality, axisPt, axisLambdaMass}); + histos.add("h3dMassAntiLambdaSGA", "h3dMassAntiLambdaSGA", kTH3D, {axisCentrality, axisPt, axisLambdaMass}); + histos.add("h3dMassAntiLambdaSGC", "h3dMassAntiLambdaSGC", kTH3D, {axisCentrality, axisPt, axisLambdaMass}); + histos.add("h3dMassAntiLambdaDG", "h3dMassAntiLambdaDG", kTH3D, {axisCentrality, axisPt, axisLambdaMass}); if (doTPCQA) { - histos.add("AntiLambda/h3dPosNsigmaTPC", "h3dPosNsigmaTPC", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); - histos.add("AntiLambda/h3dNegNsigmaTPC", "h3dNegNsigmaTPC", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); - histos.add("AntiLambda/h3dPosTPCsignal", "h3dPosTPCsignal", kTH3F, {axisCentrality, axisPtCoarse, axisTPCsignal}); - histos.add("AntiLambda/h3dNegTPCsignal", "h3dNegTPCsignal", kTH3F, {axisCentrality, axisPtCoarse, axisTPCsignal}); - histos.add("AntiLambda/h3dPosNsigmaTPCvsTrackPtot", "h3dPosNsigmaTPCvsTrackPtot", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); - histos.add("AntiLambda/h3dNegNsigmaTPCvsTrackPtot", "h3dNegNsigmaTPCvsTrackPtot", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); - histos.add("AntiLambda/h3dPosTPCsignalVsTrackPtot", "h3dPosTPCsignalVsTrackPtot", kTH3F, {axisCentrality, axisPtCoarse, axisTPCsignal}); - histos.add("AntiLambda/h3dNegTPCsignalVsTrackPtot", "h3dNegTPCsignalVsTrackPtot", kTH3F, {axisCentrality, axisPtCoarse, axisTPCsignal}); - histos.add("AntiLambda/h3dPosNsigmaTPCvsTrackPt", "h3dPosNsigmaTPCvsTrackPt", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); - histos.add("AntiLambda/h3dNegNsigmaTPCvsTrackPt", "h3dNegNsigmaTPCvsTrackPt", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); - histos.add("AntiLambda/h3dPosTPCsignalVsTrackPt", "h3dPosTPCsignalVsTrackPt", kTH3F, {axisCentrality, axisPtCoarse, axisTPCsignal}); - histos.add("AntiLambda/h3dNegTPCsignalVsTrackPt", "h3dNegTPCsignalVsTrackPt", kTH3F, {axisCentrality, axisPtCoarse, axisTPCsignal}); + histos.add("AntiLambda/h3dPosNsigmaTPC", "h3dPosNsigmaTPC", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); + histos.add("AntiLambda/h3dNegNsigmaTPC", "h3dNegNsigmaTPC", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); + histos.add("AntiLambda/h3dPosTPCsignal", "h3dPosTPCsignal", kTH3D, {axisCentrality, axisPtCoarse, axisTPCsignal}); + histos.add("AntiLambda/h3dNegTPCsignal", "h3dNegTPCsignal", kTH3D, {axisCentrality, axisPtCoarse, axisTPCsignal}); + histos.add("AntiLambda/h3dPosNsigmaTPCvsTrackPtot", "h3dPosNsigmaTPCvsTrackPtot", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); + histos.add("AntiLambda/h3dNegNsigmaTPCvsTrackPtot", "h3dNegNsigmaTPCvsTrackPtot", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); + histos.add("AntiLambda/h3dPosTPCsignalVsTrackPtot", "h3dPosTPCsignalVsTrackPtot", kTH3D, {axisCentrality, axisPtCoarse, axisTPCsignal}); + histos.add("AntiLambda/h3dNegTPCsignalVsTrackPtot", "h3dNegTPCsignalVsTrackPtot", kTH3D, {axisCentrality, axisPtCoarse, axisTPCsignal}); + histos.add("AntiLambda/h3dPosNsigmaTPCvsTrackPt", "h3dPosNsigmaTPCvsTrackPt", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); + histos.add("AntiLambda/h3dNegNsigmaTPCvsTrackPt", "h3dNegNsigmaTPCvsTrackPt", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTPC}); + histos.add("AntiLambda/h3dPosTPCsignalVsTrackPt", "h3dPosTPCsignalVsTrackPt", kTH3D, {axisCentrality, axisPtCoarse, axisTPCsignal}); + histos.add("AntiLambda/h3dNegTPCsignalVsTrackPt", "h3dNegTPCsignalVsTrackPt", kTH3D, {axisCentrality, axisPtCoarse, axisTPCsignal}); } if (doTOFQA) { - histos.add("AntiLambda/h3dPosNsigmaTOF", "h3dPosNsigmaTOF", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); - histos.add("AntiLambda/h3dNegNsigmaTOF", "h3dNegNsigmaTOF", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); - histos.add("AntiLambda/h3dPosTOFdeltaT", "h3dPosTOFdeltaT", kTH3F, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); - histos.add("AntiLambda/h3dNegTOFdeltaT", "h3dNegTOFdeltaT", kTH3F, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); - histos.add("AntiLambda/h3dPosNsigmaTOFvsTrackPtot", "h3dPosNsigmaTOFvsTrackPtot", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); - histos.add("AntiLambda/h3dNegNsigmaTOFvsTrackPtot", "h3dNegNsigmaTOFvsTrackPtot", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); - histos.add("AntiLambda/h3dPosTOFdeltaTvsTrackPtot", "h3dPosTOFdeltaTvsTrackPtot", kTH3F, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); - histos.add("AntiLambda/h3dNegTOFdeltaTvsTrackPtot", "h3dNegTOFdeltaTvsTrackPtot", kTH3F, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); - histos.add("AntiLambda/h3dPosNsigmaTOFvsTrackPt", "h3dPosNsigmaTOFvsTrackPt", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); - histos.add("AntiLambda/h3dNegNsigmaTOFvsTrackPt", "h3dNegNsigmaTOFvsTrackPt", kTH3F, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); - histos.add("AntiLambda/h3dPosTOFdeltaTvsTrackPt", "h3dPosTOFdeltaTvsTrackPt", kTH3F, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); - histos.add("AntiLambda/h3dNegTOFdeltaTvsTrackPt", "h3dNegTOFdeltaTvsTrackPt", kTH3F, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); + histos.add("AntiLambda/h3dPosNsigmaTOF", "h3dPosNsigmaTOF", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); + histos.add("AntiLambda/h3dNegNsigmaTOF", "h3dNegNsigmaTOF", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); + histos.add("AntiLambda/h3dPosTOFdeltaT", "h3dPosTOFdeltaT", kTH3D, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); + histos.add("AntiLambda/h3dNegTOFdeltaT", "h3dNegTOFdeltaT", kTH3D, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); + histos.add("AntiLambda/h3dPosNsigmaTOFvsTrackPtot", "h3dPosNsigmaTOFvsTrackPtot", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); + histos.add("AntiLambda/h3dNegNsigmaTOFvsTrackPtot", "h3dNegNsigmaTOFvsTrackPtot", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); + histos.add("AntiLambda/h3dPosTOFdeltaTvsTrackPtot", "h3dPosTOFdeltaTvsTrackPtot", kTH3D, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); + histos.add("AntiLambda/h3dNegTOFdeltaTvsTrackPtot", "h3dNegTOFdeltaTvsTrackPtot", kTH3D, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); + histos.add("AntiLambda/h3dPosNsigmaTOFvsTrackPt", "h3dPosNsigmaTOFvsTrackPt", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); + histos.add("AntiLambda/h3dNegNsigmaTOFvsTrackPt", "h3dNegNsigmaTOFvsTrackPt", kTH3D, {axisCentrality, axisPtCoarse, axisNsigmaTOF}); + histos.add("AntiLambda/h3dPosTOFdeltaTvsTrackPt", "h3dPosTOFdeltaTvsTrackPt", kTH3D, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); + histos.add("AntiLambda/h3dNegTOFdeltaTvsTrackPt", "h3dNegTOFdeltaTvsTrackPt", kTH3D, {axisCentrality, axisPtCoarse, axisTOFdeltaT}); } if (doCollisionAssociationQA) { - histos.add("AntiLambda/h2dPtVsNch", "h2dPtVsNch", kTH2F, {axisMonteCarloNch, axisPt}); - histos.add("AntiLambda/h2dPtVsNch_BadCollAssig", "h2dPtVsNch_BadCollAssig", kTH2F, {axisMonteCarloNch, axisPt}); + histos.add("AntiLambda/h2dPtVsNch", "h2dPtVsNch", kTH2D, {axisMonteCarloNch, axisPt}); + histos.add("AntiLambda/h2dPtVsNch_BadCollAssig", "h2dPtVsNch_BadCollAssig", kTH2D, {axisMonteCarloNch, axisPt}); } if (doDetectPropQA == 1) { - histos.add("AntiLambda/h6dDetectPropVsCentrality", "h6dDetectPropVsCentrality", kTHnF, {axisCentrality, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse}); - histos.add("AntiLambda/h4dPosDetectPropVsCentrality", "h4dPosDetectPropVsCentrality", kTHnF, {axisCentrality, axisDetMap, axisITScluMap, axisPtCoarse}); - histos.add("AntiLambda/h4dNegDetectPropVsCentrality", "h4dNegDetectPropVsCentrality", kTHnF, {axisCentrality, axisDetMap, axisITScluMap, axisPtCoarse}); + histos.add("AntiLambda/h6dDetectPropVsCentrality", "h6dDetectPropVsCentrality", kTHnD, {axisCentrality, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse}); + histos.add("AntiLambda/h4dPosDetectPropVsCentrality", "h4dPosDetectPropVsCentrality", kTHnD, {axisCentrality, axisDetMap, axisITScluMap, axisPtCoarse}); + histos.add("AntiLambda/h4dNegDetectPropVsCentrality", "h4dNegDetectPropVsCentrality", kTHnD, {axisCentrality, axisDetMap, axisITScluMap, axisPtCoarse}); } if (doDetectPropQA == 2) { - histos.add("AntiLambda/h7dDetectPropVsCentrality", "h7dDetectPropVsCentrality", kTHnF, {axisCentrality, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse, axisLambdaMass}); - histos.add("AntiLambda/h5dPosDetectPropVsCentrality", "h5dPosDetectPropVsCentrality", kTHnF, {axisCentrality, axisDetMap, axisITScluMap, axisPtCoarse, axisLambdaMass}); - histos.add("AntiLambda/h5dNegDetectPropVsCentrality", "h5dNegDetectPropVsCentrality", kTHnF, {axisCentrality, axisDetMap, axisITScluMap, axisPtCoarse, axisLambdaMass}); + histos.add("AntiLambda/h7dDetectPropVsCentrality", "h7dDetectPropVsCentrality", kTHnD, {axisCentrality, axisDetMapCoarse, axisITScluMapCoarse, axisDetMapCoarse, axisITScluMapCoarse, axisPtCoarse, axisLambdaMass}); + histos.add("AntiLambda/h5dPosDetectPropVsCentrality", "h5dPosDetectPropVsCentrality", kTHnD, {axisCentrality, axisDetMap, axisITScluMap, axisPtCoarse, axisLambdaMass}); + histos.add("AntiLambda/h5dNegDetectPropVsCentrality", "h5dNegDetectPropVsCentrality", kTHnD, {axisCentrality, axisDetMap, axisITScluMap, axisPtCoarse, axisLambdaMass}); } if (doDetectPropQA == 3) { - histos.add("AntiLambda/h3dITSchi2", "h3dMaxITSchi2", kTH3F, {axisCentrality, axisPtCoarse, axisITSchi2}); - histos.add("AntiLambda/h3dTPCchi2", "h3dMaxTPCchi2", kTH3F, {axisCentrality, axisPtCoarse, axisTPCchi2}); - histos.add("AntiLambda/h3dTPCFoundOverFindable", "h3dTPCFoundOverFindable", kTH3F, {axisCentrality, axisPtCoarse, axisTPCfoundOverFindable}); - histos.add("AntiLambda/h3dTPCrowsOverFindable", "h3dTPCrowsOverFindable", kTH3F, {axisCentrality, axisPtCoarse, axisTPCrowsOverFindable}); - histos.add("AntiLambda/h3dTPCsharedCls", "h3dTPCsharedCls", kTH3F, {axisCentrality, axisPtCoarse, axisTPCsharedClusters}); - histos.add("AntiLambda/h3dPositiveITSchi2", "h3dPositiveITSchi2", kTH3F, {axisCentrality, axisPtCoarse, axisITSchi2}); - histos.add("AntiLambda/h3dNegativeITSchi2", "h3dNegativeITSchi2", kTH3F, {axisCentrality, axisPtCoarse, axisITSchi2}); - histos.add("AntiLambda/h3dPositiveTPCchi2", "h3dPositiveTPCchi2", kTH3F, {axisCentrality, axisPtCoarse, axisTPCchi2}); - histos.add("AntiLambda/h3dNegativeTPCchi2", "h3dNegativeTPCchi2", kTH3F, {axisCentrality, axisPtCoarse, axisTPCchi2}); - histos.add("AntiLambda/h3dPositiveITSclusters", "h3dPositiveITSclusters", kTH3F, {axisCentrality, axisPtCoarse, axisITSclus}); - histos.add("AntiLambda/h3dNegativeITSclusters", "h3dNegativeITSclusters", kTH3F, {axisCentrality, axisPtCoarse, axisITSclus}); - histos.add("AntiLambda/h3dPositiveTPCcrossedRows", "h3dPositiveTPCcrossedRows", kTH3F, {axisCentrality, axisPtCoarse, axisTPCrows}); - histos.add("AntiLambda/h3dNegativeTPCcrossedRows", "h3dNegativeTPCcrossedRows", kTH3F, {axisCentrality, axisPtCoarse, axisTPCrows}); + histos.add("AntiLambda/h3dITSchi2", "h3dMaxITSchi2", kTH3D, {axisCentrality, axisPtCoarse, axisITSchi2}); + histos.add("AntiLambda/h3dTPCchi2", "h3dMaxTPCchi2", kTH3D, {axisCentrality, axisPtCoarse, axisTPCchi2}); + histos.add("AntiLambda/h3dTPCFoundOverFindable", "h3dTPCFoundOverFindable", kTH3D, {axisCentrality, axisPtCoarse, axisTPCfoundOverFindable}); + histos.add("AntiLambda/h3dTPCrowsOverFindable", "h3dTPCrowsOverFindable", kTH3D, {axisCentrality, axisPtCoarse, axisTPCrowsOverFindable}); + histos.add("AntiLambda/h3dTPCsharedCls", "h3dTPCsharedCls", kTH3D, {axisCentrality, axisPtCoarse, axisTPCsharedClusters}); + histos.add("AntiLambda/h3dPositiveITSchi2", "h3dPositiveITSchi2", kTH3D, {axisCentrality, axisPtCoarse, axisITSchi2}); + histos.add("AntiLambda/h3dNegativeITSchi2", "h3dNegativeITSchi2", kTH3D, {axisCentrality, axisPtCoarse, axisITSchi2}); + histos.add("AntiLambda/h3dPositiveTPCchi2", "h3dPositiveTPCchi2", kTH3D, {axisCentrality, axisPtCoarse, axisTPCchi2}); + histos.add("AntiLambda/h3dNegativeTPCchi2", "h3dNegativeTPCchi2", kTH3D, {axisCentrality, axisPtCoarse, axisTPCchi2}); + histos.add("AntiLambda/h3dPositiveITSclusters", "h3dPositiveITSclusters", kTH3D, {axisCentrality, axisPtCoarse, axisITSclus}); + histos.add("AntiLambda/h3dNegativeITSclusters", "h3dNegativeITSclusters", kTH3D, {axisCentrality, axisPtCoarse, axisITSclus}); + histos.add("AntiLambda/h3dPositiveTPCcrossedRows", "h3dPositiveTPCcrossedRows", kTH3D, {axisCentrality, axisPtCoarse, axisTPCrows}); + histos.add("AntiLambda/h3dNegativeTPCcrossedRows", "h3dNegativeTPCcrossedRows", kTH3D, {axisCentrality, axisPtCoarse, axisTPCrows}); } } if (analyseLambda && calculateFeeddownMatrix && (doprocessMonteCarloRun3 || doprocessMonteCarloRun2)) - histos.add("h3dLambdaFeeddown", "h3dLambdaFeeddown", kTH3F, {axisCentrality, axisPt, axisPtXi}); + histos.add("h3dLambdaFeeddown", "h3dLambdaFeeddown", kTH3D, {axisCentrality, axisPt, axisPtXi}); if (analyseAntiLambda && calculateFeeddownMatrix && (doprocessMonteCarloRun3 || doprocessMonteCarloRun2)) - histos.add("h3dAntiLambdaFeeddown", "h3dAntiLambdaFeeddown", kTH3F, {axisCentrality, axisPt, axisPtXi}); + histos.add("h3dAntiLambdaFeeddown", "h3dAntiLambdaFeeddown", kTH3D, {axisCentrality, axisPt, axisPtXi}); // demo // fast - histos.add("hMassK0Short", "hMassK0Short", kTH1F, {axisK0Mass}); + histos.add("hMassK0Short", "hMassK0Short", kTH1D, {axisK0Mass}); // QA histograms if requested if (doCompleteTopoQA) { // initialize for K0short... if (analyseK0Short) { - histos.add("K0Short/h4dPosDCAToPV", "h4dPosDCAToPV", kTHnF, {axisCentrality, axisPtCoarse, axisK0Mass, axisDCAtoPV}); - histos.add("K0Short/h4dNegDCAToPV", "h4dNegDCAToPV", kTHnF, {axisCentrality, axisPtCoarse, axisK0Mass, axisDCAtoPV}); - histos.add("K0Short/h4dDCADaughters", "h4dDCADaughters", kTHnF, {axisCentrality, axisPtCoarse, axisK0Mass, axisDCAdau}); - histos.add("K0Short/h4dPointingAngle", "h4dPointingAngle", kTHnF, {axisCentrality, axisPtCoarse, axisK0Mass, axisPointingAngle}); - histos.add("K0Short/h4dV0Radius", "h4dV0Radius", kTHnF, {axisCentrality, axisPtCoarse, axisK0Mass, axisV0Radius}); - histos.add("K0Short/h4dV0PhiVsEta", "h4dV0PhiVsEta", kTHnF, {axisPtCoarse, axisK0Mass, axisPhi, axisEta}); + histos.add("K0Short/h4dPosDCAToPV", "h4dPosDCAToPV", kTHnD, {axisCentrality, axisPtCoarse, axisK0Mass, axisDCAtoPV}); + histos.add("K0Short/h4dNegDCAToPV", "h4dNegDCAToPV", kTHnD, {axisCentrality, axisPtCoarse, axisK0Mass, axisDCAtoPV}); + histos.add("K0Short/h4dDCADaughters", "h4dDCADaughters", kTHnD, {axisCentrality, axisPtCoarse, axisK0Mass, axisDCAdau}); + histos.add("K0Short/h4dPointingAngle", "h4dPointingAngle", kTHnD, {axisCentrality, axisPtCoarse, axisK0Mass, axisPointingAngle}); + histos.add("K0Short/h4dV0Radius", "h4dV0Radius", kTHnD, {axisCentrality, axisPtCoarse, axisK0Mass, axisV0Radius}); + histos.add("K0Short/h4dV0PhiVsEta", "h4dV0PhiVsEta", kTHnD, {axisPtCoarse, axisK0Mass, axisPhi, axisEta}); } if (analyseLambda) { - histos.add("Lambda/h4dPosDCAToPV", "h4dPosDCAToPV", kTHnF, {axisCentrality, axisPtCoarse, axisLambdaMass, axisDCAtoPV}); - histos.add("Lambda/h4dNegDCAToPV", "h4dNegDCAToPV", kTHnF, {axisCentrality, axisPtCoarse, axisLambdaMass, axisDCAtoPV}); - histos.add("Lambda/h4dDCADaughters", "h4dDCADaughters", kTHnF, {axisCentrality, axisPtCoarse, axisLambdaMass, axisDCAdau}); - histos.add("Lambda/h4dPointingAngle", "h4dPointingAngle", kTHnF, {axisCentrality, axisPtCoarse, axisLambdaMass, axisPointingAngle}); - histos.add("Lambda/h4dV0Radius", "h4dV0Radius", kTHnF, {axisCentrality, axisPtCoarse, axisLambdaMass, axisV0Radius}); - histos.add("Lambda/h4dV0PhiVsEta", "h4dV0PhiVsEta", kTHnF, {axisPtCoarse, axisK0Mass, axisPhi, axisEta}); + histos.add("Lambda/h4dPosDCAToPV", "h4dPosDCAToPV", kTHnD, {axisCentrality, axisPtCoarse, axisLambdaMass, axisDCAtoPV}); + histos.add("Lambda/h4dNegDCAToPV", "h4dNegDCAToPV", kTHnD, {axisCentrality, axisPtCoarse, axisLambdaMass, axisDCAtoPV}); + histos.add("Lambda/h4dDCADaughters", "h4dDCADaughters", kTHnD, {axisCentrality, axisPtCoarse, axisLambdaMass, axisDCAdau}); + histos.add("Lambda/h4dPointingAngle", "h4dPointingAngle", kTHnD, {axisCentrality, axisPtCoarse, axisLambdaMass, axisPointingAngle}); + histos.add("Lambda/h4dV0Radius", "h4dV0Radius", kTHnD, {axisCentrality, axisPtCoarse, axisLambdaMass, axisV0Radius}); + histos.add("Lambda/h4dV0PhiVsEta", "h4dV0PhiVsEta", kTHnD, {axisPtCoarse, axisK0Mass, axisPhi, axisEta}); } if (analyseAntiLambda) { - histos.add("AntiLambda/h4dPosDCAToPV", "h4dPosDCAToPV", kTHnF, {axisCentrality, axisPtCoarse, axisLambdaMass, axisDCAtoPV}); - histos.add("AntiLambda/h4dNegDCAToPV", "h4dNegDCAToPV", kTHnF, {axisCentrality, axisPtCoarse, axisLambdaMass, axisDCAtoPV}); - histos.add("AntiLambda/h4dDCADaughters", "h4dDCADaughters", kTHnF, {axisCentrality, axisPtCoarse, axisLambdaMass, axisDCAdau}); - histos.add("AntiLambda/h4dPointingAngle", "h4dPointingAngle", kTHnF, {axisCentrality, axisPtCoarse, axisLambdaMass, axisPointingAngle}); - histos.add("AntiLambda/h4dV0Radius", "h4dV0Radius", kTHnF, {axisCentrality, axisPtCoarse, axisLambdaMass, axisV0Radius}); - histos.add("AntiLambda/h4dV0PhiVsEta", "h4dV0PhiVsEta", kTHnF, {axisPtCoarse, axisK0Mass, axisPhi, axisEta}); + histos.add("AntiLambda/h4dPosDCAToPV", "h4dPosDCAToPV", kTHnD, {axisCentrality, axisPtCoarse, axisLambdaMass, axisDCAtoPV}); + histos.add("AntiLambda/h4dNegDCAToPV", "h4dNegDCAToPV", kTHnD, {axisCentrality, axisPtCoarse, axisLambdaMass, axisDCAtoPV}); + histos.add("AntiLambda/h4dDCADaughters", "h4dDCADaughters", kTHnD, {axisCentrality, axisPtCoarse, axisLambdaMass, axisDCAdau}); + histos.add("AntiLambda/h4dPointingAngle", "h4dPointingAngle", kTHnD, {axisCentrality, axisPtCoarse, axisLambdaMass, axisPointingAngle}); + histos.add("AntiLambda/h4dV0Radius", "h4dV0Radius", kTHnD, {axisCentrality, axisPtCoarse, axisLambdaMass, axisV0Radius}); + histos.add("AntiLambda/h4dV0PhiVsEta", "h4dV0PhiVsEta", kTHnD, {axisPtCoarse, axisK0Mass, axisPhi, axisEta}); } } if (doPlainTopoQA) { // All candidates received - histos.add("hPosDCAToPV", "hPosDCAToPV", kTH1F, {axisDCAtoPV}); - histos.add("hNegDCAToPV", "hNegDCAToPV", kTH1F, {axisDCAtoPV}); - histos.add("hDCADaughters", "hDCADaughters", kTH1F, {axisDCAdau}); - histos.add("hPointingAngle", "hPointingAngle", kTH1F, {axisPointingAngle}); - histos.add("hV0Radius", "hV0Radius", kTH1F, {axisV0Radius}); - histos.add("h2dPositiveITSvsTPCpts", "h2dPositiveITSvsTPCpts", kTH2F, {axisTPCrows, axisITSclus}); - histos.add("h2dNegativeITSvsTPCpts", "h2dNegativeITSvsTPCpts", kTH2F, {axisTPCrows, axisITSclus}); + histos.add("hPosDCAToPV", "hPosDCAToPV", kTH1D, {axisDCAtoPV}); + histos.add("hNegDCAToPV", "hNegDCAToPV", kTH1D, {axisDCAtoPV}); + histos.add("hDCADaughters", "hDCADaughters", kTH1D, {axisDCAdau}); + histos.add("hPointingAngle", "hPointingAngle", kTH1D, {axisPointingAngle}); + histos.add("hV0Radius", "hV0Radius", kTH1D, {axisV0Radius}); + histos.add("h2dPositiveITSvsTPCpts", "h2dPositiveITSvsTPCpts", kTH2D, {axisTPCrows, axisITSclus}); + histos.add("h2dNegativeITSvsTPCpts", "h2dNegativeITSvsTPCpts", kTH2D, {axisTPCrows, axisITSclus}); if (analyseK0Short) { - histos.add("K0Short/hPosDCAToPV", "hPosDCAToPV", kTH1F, {axisDCAtoPV}); - histos.add("K0Short/hNegDCAToPV", "hNegDCAToPV", kTH1F, {axisDCAtoPV}); - histos.add("K0Short/hDCADaughters", "hDCADaughters", kTH1F, {axisDCAdau}); - histos.add("K0Short/hPointingAngle", "hPointingAngle", kTH1F, {axisPointingAngle}); - histos.add("K0Short/hV0Radius", "hV0Radius", kTH1F, {axisV0Radius}); - histos.add("K0Short/h2dPositiveITSvsTPCpts", "h2dPositiveITSvsTPCpts", kTH2F, {axisTPCrows, axisITSclus}); - histos.add("K0Short/h2dNegativeITSvsTPCpts", "h2dNegativeITSvsTPCpts", kTH2F, {axisTPCrows, axisITSclus}); + histos.add("K0Short/hPosDCAToPV", "hPosDCAToPV", kTH1D, {axisDCAtoPV}); + histos.add("K0Short/hNegDCAToPV", "hNegDCAToPV", kTH1D, {axisDCAtoPV}); + histos.add("K0Short/hDCADaughters", "hDCADaughters", kTH1D, {axisDCAdau}); + histos.add("K0Short/hPointingAngle", "hPointingAngle", kTH1D, {axisPointingAngle}); + histos.add("K0Short/hV0Radius", "hV0Radius", kTH1D, {axisV0Radius}); + histos.add("K0Short/h2dPositiveITSvsTPCpts", "h2dPositiveITSvsTPCpts", kTH2D, {axisTPCrows, axisITSclus}); + histos.add("K0Short/h2dNegativeITSvsTPCpts", "h2dNegativeITSvsTPCpts", kTH2D, {axisTPCrows, axisITSclus}); } if (analyseLambda) { - histos.add("Lambda/hPosDCAToPV", "hPosDCAToPV", kTH1F, {axisDCAtoPV}); - histos.add("Lambda/hNegDCAToPV", "hNegDCAToPV", kTH1F, {axisDCAtoPV}); - histos.add("Lambda/hDCADaughters", "hDCADaughters", kTH1F, {axisDCAdau}); - histos.add("Lambda/hPointingAngle", "hPointingAngle", kTH1F, {axisPointingAngle}); - histos.add("Lambda/hV0Radius", "hV0Radius", kTH1F, {axisV0Radius}); - histos.add("Lambda/h2dPositiveITSvsTPCpts", "h2dPositiveITSvsTPCpts", kTH2F, {axisTPCrows, axisITSclus}); - histos.add("Lambda/h2dNegativeITSvsTPCpts", "h2dNegativeITSvsTPCpts", kTH2F, {axisTPCrows, axisITSclus}); + histos.add("Lambda/hPosDCAToPV", "hPosDCAToPV", kTH1D, {axisDCAtoPV}); + histos.add("Lambda/hNegDCAToPV", "hNegDCAToPV", kTH1D, {axisDCAtoPV}); + histos.add("Lambda/hDCADaughters", "hDCADaughters", kTH1D, {axisDCAdau}); + histos.add("Lambda/hPointingAngle", "hPointingAngle", kTH1D, {axisPointingAngle}); + histos.add("Lambda/hV0Radius", "hV0Radius", kTH1D, {axisV0Radius}); + histos.add("Lambda/h2dPositiveITSvsTPCpts", "h2dPositiveITSvsTPCpts", kTH2D, {axisTPCrows, axisITSclus}); + histos.add("Lambda/h2dNegativeITSvsTPCpts", "h2dNegativeITSvsTPCpts", kTH2D, {axisTPCrows, axisITSclus}); } if (analyseAntiLambda) { - histos.add("AntiLambda/hPosDCAToPV", "hPosDCAToPV", kTH1F, {axisDCAtoPV}); - histos.add("AntiLambda/hNegDCAToPV", "hNegDCAToPV", kTH1F, {axisDCAtoPV}); - histos.add("AntiLambda/hDCADaughters", "hDCADaughters", kTH1F, {axisDCAdau}); - histos.add("AntiLambda/hPointingAngle", "hPointingAngle", kTH1F, {axisPointingAngle}); - histos.add("AntiLambda/hV0Radius", "hV0Radius", kTH1F, {axisV0Radius}); - histos.add("AntiLambda/h2dPositiveITSvsTPCpts", "h2dPositiveITSvsTPCpts", kTH2F, {axisTPCrows, axisITSclus}); - histos.add("AntiLambda/h2dNegativeITSvsTPCpts", "h2dNegativeITSvsTPCpts", kTH2F, {axisTPCrows, axisITSclus}); + histos.add("AntiLambda/hPosDCAToPV", "hPosDCAToPV", kTH1D, {axisDCAtoPV}); + histos.add("AntiLambda/hNegDCAToPV", "hNegDCAToPV", kTH1D, {axisDCAtoPV}); + histos.add("AntiLambda/hDCADaughters", "hDCADaughters", kTH1D, {axisDCAdau}); + histos.add("AntiLambda/hPointingAngle", "hPointingAngle", kTH1D, {axisPointingAngle}); + histos.add("AntiLambda/hV0Radius", "hV0Radius", kTH1D, {axisV0Radius}); + histos.add("AntiLambda/h2dPositiveITSvsTPCpts", "h2dPositiveITSvsTPCpts", kTH2D, {axisTPCrows, axisITSclus}); + histos.add("AntiLambda/h2dNegativeITSvsTPCpts", "h2dNegativeITSvsTPCpts", kTH2D, {axisTPCrows, axisITSclus}); } } // Check if doing the right thing in AP space please - histos.add("GeneralQA/h2dArmenterosAll", "h2dArmenterosAll", kTH2F, {axisAPAlpha, axisAPQt}); - histos.add("GeneralQA/h2dArmenterosSelected", "h2dArmenterosSelected", kTH2F, {axisAPAlpha, axisAPQt}); + histos.add("GeneralQA/h2dArmenterosAll", "h2dArmenterosAll", kTH2D, {axisAPAlpha, axisAPQt}); + histos.add("GeneralQA/h2dArmenterosSelected", "h2dArmenterosSelected", kTH2D, {axisAPAlpha, axisAPQt}); // Creation of histograms: MC generated if ((doprocessGeneratedRun3 || doprocessGeneratedRun2)) { - histos.add("hGenEvents", "hGenEvents", kTH2F, {{axisNch}, {2, -0.5f, +1.5f}}); + histos.add("hGenEvents", "hGenEvents", kTH2D, {{axisNch}, {2, -0.5f, +1.5f}}); histos.get(HIST("hGenEvents"))->GetYaxis()->SetBinLabel(1, "All gen. events"); histos.get(HIST("hGenEvents"))->GetYaxis()->SetBinLabel(2, "Gen. with at least 1 rec. events"); - histos.add("hGenEventCentrality", "hGenEventCentrality", kTH1F, {{101, 0.0f, 101.0f}}); + histos.add("hGenEventCentrality", "hGenEventCentrality", kTH1D, {{101, 0.0f, 101.0f}}); - histos.add("hCentralityVsNcoll_beforeEvSel", "hCentralityVsNcoll_beforeEvSel", kTH2F, {axisCentrality, {50, -0.5f, 49.5f}}); - histos.add("hCentralityVsNcoll_afterEvSel", "hCentralityVsNcoll_afterEvSel", kTH2F, {axisCentrality, {50, -0.5f, 49.5f}}); + histos.add("hCentralityVsNcoll_beforeEvSel", "hCentralityVsNcoll_beforeEvSel", kTH2D, {axisCentrality, {50, -0.5f, 49.5f}}); + histos.add("hCentralityVsNcoll_afterEvSel", "hCentralityVsNcoll_afterEvSel", kTH2D, {axisCentrality, {50, -0.5f, 49.5f}}); - histos.add("hCentralityVsMultMC", "hCentralityVsMultMC", kTH2F, {{101, 0.0f, 101.0f}, axisNch}); + histos.add("hCentralityVsMultMC", "hCentralityVsMultMC", kTH2D, {{101, 0.0f, 101.0f}, axisNch}); histos.add("h2dGenK0Short", "h2dGenK0Short", kTH2D, {axisCentrality, axisPt}); histos.add("h2dGenLambda", "h2dGenLambda", kTH2D, {axisCentrality, axisPt}); From ec9d642ccc708e304d1200638de987426e34a114 Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Wed, 21 May 2025 06:32:11 +0800 Subject: [PATCH 1345/1650] [Trigger] feat(EventFiltering): Fix the task name for the HeavyNeutralMesonFilters (#11264) --- EventFiltering/filterTables.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EventFiltering/filterTables.h b/EventFiltering/filterTables.h index 7200c4f7347..b6994889446 100644 --- a/EventFiltering/filterTables.h +++ b/EventFiltering/filterTables.h @@ -368,7 +368,7 @@ using BCRange = BCRanges::iterator; constexpr int NumberOfFilters{14}; constexpr std::array AvailableFilters{"NucleiFilters", "DiffractionFilters", "DqFilters", "HfFilters", "CFFilters", "JetFilters", "JetHFFilters", "FullJetFilters", "StrangenessFilters", "MultFilters", "PhotonFilters", "F1ProtonFilters", "DoublePhiFilters", "HeavyNeutralMesonFilters"}; constexpr std::array FilterDescriptions{"NucleiFilters", "DiffFilters", "DqFilters", "HfFilters", "CFFilters", "JetFilters", "JetHFFilters", "FullJetFilters", "LFStrgFilters", "MultFilters", "PhotonFilters", "F1ProtonFilters", "LF2PhiFilters", "HNMesonFilters"}; -constexpr std::array FilteringTaskNames{"o2-analysis-nuclei-filter", "o2-analysis-diffraction-filter", "o2-analysis-dq-filter-pp-with-association", "o2-analysis-hf-filter", "o2-analysis-cf-filter", "o2-analysis-je-filter", "o2-analysis-je-hf-filter", "o2-analysis-fje-filter", "o2-analysis-lf-strangeness-filter", "o2-analysis-mult-filter", "o2-analysis-em-photon-filter", "o2-analysis-lf-f1proton-filter", "o2-analysis-lf-doublephi-filter", "o2-analysis-heavy-meson-filter"}; +constexpr std::array FilteringTaskNames{"o2-analysis-nuclei-filter", "o2-analysis-diffraction-filter", "o2-analysis-dq-filter-pp-with-association", "o2-analysis-hf-filter", "o2-analysis-cf-filter", "o2-analysis-je-filter", "o2-analysis-je-hf-filter", "o2-analysis-fje-filter", "o2-analysis-lf-strangeness-filter", "o2-analysis-mult-filter", "o2-analysis-em-photon-filter", "o2-analysis-lf-f1proton-filter", "o2-analysis-lf-doublephi-filter", "o2-analysis-heavy-neutral-meson-filter"}; constexpr o2::framework::pack FiltersPack; static_assert(o2::framework::pack_size(FiltersPack) == NumberOfFilters); From 0f6d128743fe4577028b62914e2c5d8c93d2c665 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Wed, 21 May 2025 00:53:41 +0200 Subject: [PATCH 1346/1650] [PWGHF] fix a small bug for the candidate and track loop in the Tcc tree creator (#11269) --- .../TableProducer/treeCreatorTccToD0D0Pi.cxx | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx b/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx index 3d03e442834..da825bcee19 100644 --- a/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx +++ b/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx @@ -313,30 +313,30 @@ struct HfTreeCreatorTccToD0D0Pi { { for (const auto& collision : collisions) { - auto bc = collision.template bc_as(); auto primaryVertex = getPrimaryVertex(collision); - if (runNumber != bc.runNumber()) { - LOG(info) << ">>>>>>>>>>>> Current run number: " << runNumber; - initCCDB(bc, runNumber, ccdb, isRun2 ? ccdbPathGrp : ccdbPathGrpMag, lut, isRun2); - bz = o2::base::Propagator::Instance()->getNominalBz(); - LOG(info) << ">>>>>>>>>>>> Magnetic field: " << bz; - } + auto bc = collision.template bc_as(); + fillEvent(collision, 0, bc.runNumber()); if (buildVertex) { + if (runNumber != bc.runNumber()) { + LOG(info) << ">>>>>>>>>>>> Current run number: " << runNumber; + initCCDB(bc, runNumber, ccdb, isRun2 ? ccdbPathGrp : ccdbPathGrpMag, lut, isRun2); + bz = o2::base::Propagator::Instance()->getNominalBz(); + LOG(info) << ">>>>>>>>>>>> Magnetic field: " << bz; + } dfTcc.setBz(bz); dfD1.setBz(bz); dfD2.setBz(bz); } - fillEvent(collision, 0, bc.runNumber()); auto thisCollId = collision.globalIndex(); auto candwD0ThisColl = candidates.sliceBy(candsD0PerCollisionWithMl, thisCollId); if (candwD0ThisColl.size() <= 1) continue; // only loop the collision that include at least 2 D candidates auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); - for (const auto& candidateD1 : candidates) { - for (auto candidateD2 = candidateD1 + 1; candidateD2 != candidates.end(); ++candidateD2) { - for (const auto& trackId : trackIndices) { + for (const auto& candidateD1 : candwD0ThisColl) { + for (auto candidateD2 = candidateD1 + 1; candidateD2 != candwD0ThisColl.end(); ++candidateD2) { + for (const auto& trackId : trackIdsThisCollision) { auto trackPion = trackId.template track_as(); if (usePionIsGlobalTrackWoDCA && !trackPion.isGlobalTrackWoDCA()) { From edfe5cb619e759fce279cb66c0b2e93d74105abe Mon Sep 17 00:00:00 2001 From: Preet-Bhanjan Date: Wed, 21 May 2025 03:33:30 +0200 Subject: [PATCH 1347/1650] [PWGCF] Modified method for flow container and correlator (#11267) Co-authored-by: Preet Pati --- PWGCF/Flow/Tasks/flowPbpbPikp.cxx | 199 +++++++++--------------------- 1 file changed, 60 insertions(+), 139 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowPbpbPikp.cxx b/PWGCF/Flow/Tasks/flowPbpbPikp.cxx index cdcf3b553c8..37b6cb674a1 100644 --- a/PWGCF/Flow/Tasks/flowPbpbPikp.cxx +++ b/PWGCF/Flow/Tasks/flowPbpbPikp.cxx @@ -46,6 +46,7 @@ #include "PWGCF/GenericFramework/Core/FlowContainer.h" #include "PWGCF/GenericFramework/Core/GFWWeights.h" #include "PWGCF/GenericFramework/Core/GFWWeightsList.h" +#include "PWGCF/GenericFramework/Core/GFWConfig.h" #include "ReconstructionDataFormats/Track.h" #include "ReconstructionDataFormats/PID.h" @@ -61,6 +62,14 @@ using namespace std; #define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable NAME{#NAME, DEFAULT, HELP}; +namespace o2::analysis::genericframework +{ +GFWRegions regions; +GFWCorrConfigs configs; +} // namespace o2::analysis::genericframework + +using namespace o2::analysis::genericframework; + struct FlowPbpbPikp { Service ccdb; Configurable noLaterThan{"noLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; @@ -100,8 +109,10 @@ struct FlowPbpbPikp { Configurable> cfgTrackDensityP1{"cfgTrackDensityP1", std::vector{-2.169488e-05, -2.191913e-05, -2.295484e-05, -2.556538e-05, -2.754463e-05, -2.816832e-05, -2.846502e-05, -2.843857e-05, -2.705974e-05, -2.477018e-05, -2.321730e-05, -2.203315e-05, -2.109474e-05}, "parameter 1 for track density efficiency correction"}; Configurable> cfgTofNsigmaCut{"cfgTofNsigmaCut", std::vector{1.5, 1.5, 1.5}, "TOF n-sigma cut for pions, kaons, protons"}; Configurable> cfgItsNsigmaCut{"cfgItsNsigmaCut", std::vector{3, 2.5, 2}, "ITS n-sigma cut for pions, kaons, protons"}; + Configurable> cfgUseEventCuts{"cfgUseEventCuts", std::vector{1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0}, "Switch for various event cuts [kNoTimeFrameBorder, kNoITSROFrameBorder, kNoSameBunchPileup, kIsGoodZvtxFT0vsPV, kNoCollInTimeRangeStandard, kIsGoodITSLayersAll, kNoCollInRofStandard, kNoHighMultCollInPrevRof, Occupancy, Multiplicity correlation, T0AV0A 3 sigma cut, kIsVertexITSTPC, kTVXinTRD]"}; - Configurable> cfgUseEventCuts{"cfgUseEventCuts", std::vector{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, "Switch for various event cuts [kNoTimeFrameBorder, kNoITSROFrameBorder, kNoSameBunchPileup, kIsGoodZvtxFT0vsPV, kNoCollInTimeRangeStandard, kIsGoodITSLayersAll, kNoCollInRofStandard, kNoHighMultCollInPrevRof, Occupancy, Multiplicity correlation, T0AV0A 3 sigma cut, kIsVertexITSTPC, kTVXinTRD]"}; + Configurable cfgRegions{"cfgRegions", {{"refN08", "refP08", "full", "poiN", "olN", "poiP", "olP", "poi", "ol", "poiNpi", "olNpi", "poiPpi", "olPpi", "poifullpi", "olfullpi", "poiNka", "olNka", "poiPka", "olPka", "poifullka", "olfullka", "poiNpr", "olNpr", "poiPpr", "olPpr", "poifullpr", "olfullpr"}, {-0.8, 0.4, -0.8, -0.8, -0.8, 0.4, 0.4, -0.8, -0.8, -0.8, -0.8, 0.4, 0.4, -0.8, -0.8, -0.8, -0.8, 0.4, 0.4, -0.8, -0.8, -0.8, -0.8, 0.4, 0.4, -0.8, -0.8}, {-0.4, 0.8, 0.8, -0.4, -0.4, 0.8, 0.8, 0.8, 0.8, -0.4, -0.4, 0.8, 0.8, 0.8, 0.8, -0.4, -0.4, 0.8, 0.8, 0.8, 0.8, -0.4, -0.4, 0.8, 0.8, 0.8, 0.8}, {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 128, 256, 128, 256, 128, 256, 2, 16, 2, 16, 2, 16, 4, 32, 4, 32, 4, 32, 8, 64, 8, 64, 8, 64}}, "Configurations for GFW regions"}; + Configurable cfgCorrConfig{"cfgCorrConfig", {{"full {2 -2}", "full {2 -2}", "full {2 -2}", "full {2 -2}", "refN08 {2} refP08 {-2}", "refN08 {2} refP08 {-2}", "refN08 {2} refP08 {-2}", "refN08 {2} refP08 {-2}", "refP08 {-2} refN08 {2}", "refP08 {-2} refN08 {2}", "refP08 {-2} refN08 {2}", "refP08 {-2} refN08 {2}", "full {2 2 -2 -2}", "full {2 2 -2 -2}", "full {2 2 -2 -2}", "full {2 2 -2 -2}", "poi full | ol {2 -2}", "poifullpi full | olfullpi {2 -2}", "poifullka full | olfullka {2 -2}", "poifullpr full | olfullpr {2 -2}", "poiN refN08 | olN {2} refP08 {-2}", "poiNpi refN08 | olNpi {2} refP08 {-2}", "poiNka refN08 | olNka {2} refP08 {-2}", "poiNpr refN08 | olNpr {2} refP08 {-2}", "poiP refP08 | olP {2} refN08 {-2}", "poiPpi refP08 | olPpi {2} refN08 {-2}", "poiPka refP08 | olPka {2} refN08 {-2}", "poiPpr refP08 | olPpr {2} refN08 {-2}", "poi full | ol {2 2 -2 -2}", "poifullpi full | olfullpi {2 2 -2 -2}", "poifullka full | olfullka {2 2 -2 -2}", "poifullpr full | olfullpr {2 2 -2 -2}", "refN08 {2 2} refP08 {-2 -2}", "refP08 {-2 -2} refN08 {2 2}", "poiNka refN08 | olNka {2 2} refP08 {-2 -2}", "poiPka refP08 | olPka {2 2} refN08 {-2 -2}"}, {"ChFull22", "PiFull22", "KaFull22", "PrFull22", "Ch08FGap22", "Pi08FGap22", "Ka08FGap22", "Pr08FGap22", "Ch08BGap22", "Pi08BGap22", "Ka08BGap22", "Pr08BGap22", "ChFull24", "PiFull24", "KaFull24", "PrFull24", "ChFull22", "PiFull22", "KaFull22", "PrFull22", "Ch08FGap22", "Pi08FGap22", "Ka08FGap22", "Pr08FGap22", "Ch08BGap22", "Pi08BGap22", "Ka08BGap22", "Pr08BGap22", "ChFull24", "PiFull24", "KaFull24", "PrFull24", "Ka08FGap24", "Ka08BGap24", "Ka08FGap24", "Ka08BGap24"}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1}}, "Configurations for each correlation to calculate"}; ConfigurableAxis axisVertex{"axisVertex", {20, -10, 10}, "vertex axis for histograms"}; ConfigurableAxis axisPhi{"axisPhi", {60, 0.0, constants::math::TwoPI}, "phi axis for histograms"}; @@ -156,7 +167,8 @@ struct FlowPbpbPikp { useTVXinTRD }; - std::vector eventCuts = cfgUseEventCuts; + std::vector fintEvCuts = cfgUseEventCuts; + std::vector eventCuts; int lastRunNumer = -1; std::vector runNumbers; @@ -185,6 +197,22 @@ struct FlowPbpbPikp { ccdb->setCaching(true); ccdb->setCreatedNotAfter(noLaterThan.value); + // Transforming event cuts from int to bool + for (int i = 0; i < static_cast(fintEvCuts.size()); i++) { + eventCuts.push_back(static_cast(fintEvCuts[i])); + } + + regions.SetNames(cfgRegions->GetNames()); + regions.SetEtaMin(cfgRegions->GetEtaMin()); + regions.SetEtaMax(cfgRegions->GetEtaMax()); + regions.SetpTDifs(cfgRegions->GetpTDifs()); + regions.SetBitmasks(cfgRegions->GetBitmasks()); + configs.SetCorrs(cfgCorrConfig->GetCorrs()); + configs.SetHeads(cfgCorrConfig->GetHeads()); + configs.SetpTDifs(cfgCorrConfig->GetpTDifs()); + regions.Print(); + configs.Print(); + histos.add("hVtxZ", "", {HistType::kTH1D, {axisVertex}}); histos.add("hMult", "", {HistType::kTH1D, {{3000, 0.5, 3000.5}}}); histos.add("hCent", "", {HistType::kTH1D, {{90, 0, 90}}}); @@ -272,150 +300,28 @@ struct FlowPbpbPikp { double* ptBins = &(axis.binEdges)[0]; fPtAxis = new TAxis(nPtBins, ptBins); + // Defining the regions + for (auto i(0); i < regions.GetSize(); ++i) { + fGFW->AddRegion(regions.GetNames()[i], regions.GetEtaMin()[i], regions.GetEtaMax()[i], (regions.GetpTDifs()[i]) ? nPtBins + 1 : 1, regions.GetBitmasks()[i]); + } + + // Defining the correlators + for (auto i = 0; i < configs.GetSize(); ++i) { + corrconfigs.push_back(fGFW->GetCorrelatorConfig(configs.GetCorrs()[i], configs.GetHeads()[i], configs.GetpTDifs()[i])); + } + if (corrconfigs.empty()) + LOGF(error, "Configuration contains vectors of different size - check the GFWCorrConfig configurable"); + fGFW->CreateRegions(); + + // Defining the flow container TObjArray* oba = new TObjArray(); - oba->Add(new TNamed("ChFull22", "ChFull22")); - for (int i = 0; i < fPtAxis->GetNbins(); i++) - oba->Add(new TNamed(Form("ChFull22_pt_%i", i + 1), "ChFull22_pTDiff")); - oba->Add(new TNamed("PiFull22", "PiFull22")); - for (int i = 0; i < fPtAxis->GetNbins(); i++) - oba->Add(new TNamed(Form("PiFull22_pt_%i", i + 1), "PiFull22_pTDiff")); - oba->Add(new TNamed("KaFull22", "KaFull22")); - for (int i = 0; i < fPtAxis->GetNbins(); i++) - oba->Add(new TNamed(Form("KaFull22_pt_%i", i + 1), "KaFull22_pTDiff")); - oba->Add(new TNamed("PrFull22", "PrFull22")); - for (int i = 0; i < fPtAxis->GetNbins(); i++) - oba->Add(new TNamed(Form("PrFull22_pt_%i", i + 1), "PrFull22_pTDiff")); - - oba->Add(new TNamed("Ch08FGap22", "Ch08FGap22")); - for (int i = 0; i < fPtAxis->GetNbins(); i++) - oba->Add(new TNamed(Form("Ch08FGap22_pt_%i", i + 1), "Ch08FGap22_pTDiff")); - oba->Add(new TNamed("Pi08FGap22", "Pi08FGap22")); - for (int i = 0; i < fPtAxis->GetNbins(); i++) - oba->Add(new TNamed(Form("Pi08FGap22_pt_%i", i + 1), "Pi08FGap22_pTDiff")); - oba->Add(new TNamed("Ka08FGap22", "Ka08FGap22")); - for (int i = 0; i < fPtAxis->GetNbins(); i++) - oba->Add(new TNamed(Form("Ka08FGap22_pt_%i", i + 1), "Ka08FGap22_pTDiff")); - oba->Add(new TNamed("Pr08FGap22", "Pr08FGap22")); - for (int i = 0; i < fPtAxis->GetNbins(); i++) - oba->Add(new TNamed(Form("Pr08FGap22_pt_%i", i + 1), "Pr08FGap22_pTDiff")); - - oba->Add(new TNamed("ChFull24", "ChFull24")); - for (int i = 0; i < fPtAxis->GetNbins(); i++) - oba->Add(new TNamed(Form("ChFull24_pt_%i", i + 1), "ChFull24_pTDiff")); - oba->Add(new TNamed("PiFull24", "PiFull24")); - for (int i = 0; i < fPtAxis->GetNbins(); i++) - oba->Add(new TNamed(Form("PiFull24_pt_%i", i + 1), "PiFull24_pTDiff")); - oba->Add(new TNamed("KaFull24", "KaFull24")); - for (int i = 0; i < fPtAxis->GetNbins(); i++) - oba->Add(new TNamed(Form("KaFull24_pt_%i", i + 1), "KaFull24_pTDiff")); - oba->Add(new TNamed("PrFull24", "PrFull24")); - for (int i = 0; i < fPtAxis->GetNbins(); i++) - oba->Add(new TNamed(Form("PrFull24_pt_%i", i + 1), "PrFull24_pTDiff")); - - oba->Add(new TNamed("Ch08BGap22", "Ch08BGap22")); - for (int i = 0; i < fPtAxis->GetNbins(); i++) - oba->Add(new TNamed(Form("Ch08BGap22_pt_%i", i + 1), "Ch08BGap22_pTDiff")); - oba->Add(new TNamed("Pi08BGap22", "Pi08BGap22")); - for (int i = 0; i < fPtAxis->GetNbins(); i++) - oba->Add(new TNamed(Form("Pi08BGap22_pt_%i", i + 1), "Pi08BGap22_pTDiff")); - oba->Add(new TNamed("Ka08BGap22", "Ka08BGap22")); - for (int i = 0; i < fPtAxis->GetNbins(); i++) - oba->Add(new TNamed(Form("Ka08BGap22_pt_%i", i + 1), "Ka08BGap22_pTDiff")); - oba->Add(new TNamed("Pr08BGap22", "Pr08BGap22")); - for (int i = 0; i < fPtAxis->GetNbins(); i++) - oba->Add(new TNamed(Form("Pr08BGap22_pt_%i", i + 1), "Pr08BGap22_pTDiff")); + addConfigObjectsToObjArray(oba, corrconfigs); fFC->SetName("FlowContainer"); fFC->SetXAxis(fPtAxis); fFC->Initialize(oba, axisMultiplicity, cfgNbootstrap); delete oba; - // reference particles - fGFW->AddRegion("refN08", -0.8, -0.4, 1, 1); - fGFW->AddRegion("refP08", 0.4, 0.8, 1, 1); - fGFW->AddRegion("full", -0.8, 0.8, 1, 1); - - // pt dependent charged particles - fGFW->AddRegion("poiN", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 128); // Negative poi eta range - fGFW->AddRegion("olN", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 256); // Negative overlap eta range - - fGFW->AddRegion("poiP", 0.4, 0.8, 1 + fPtAxis->GetNbins(), 128); // Positive poi eta range - fGFW->AddRegion("olP", 0.4, 0.8, 1 + fPtAxis->GetNbins(), 256); // Positive overlap eta range - - fGFW->AddRegion("poi", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 128); // Full poi eta range - fGFW->AddRegion("ol", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 256); // Full overlap eta range - - // pion - fGFW->AddRegion("poiNpi", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 2); // Negative poi eta range - fGFW->AddRegion("olNpi", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 16); // Negative overlap eta range - - fGFW->AddRegion("poiPpi", 0.4, 0.8, 1 + fPtAxis->GetNbins(), 2); // Positive poi eta range - fGFW->AddRegion("olPpi", 0.4, 0.8, 1 + fPtAxis->GetNbins(), 16); // Positive overlap eta range - - fGFW->AddRegion("poifullpi", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 2); // Full poi eta range - fGFW->AddRegion("olfullpi", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 16); // Full overlap eta range - - // kaon - fGFW->AddRegion("poiNk", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 4); // Negative poi eta range - fGFW->AddRegion("olNk", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 32); // Negative overlap eta range - - fGFW->AddRegion("poiPk", 0.4, 0.8, 1 + fPtAxis->GetNbins(), 4); // Positive poi eta range - fGFW->AddRegion("olPk", 0.4, 0.8, 1 + fPtAxis->GetNbins(), 32); // Positive overlap eta range - - fGFW->AddRegion("poifullk", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 4); // Full poi eta range - fGFW->AddRegion("olfullk", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 32); // Full overlap eta range - - // proton - fGFW->AddRegion("poiNpr", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 8); // Negative poi eta range - fGFW->AddRegion("olNpr", -0.8, -0.4, 1 + fPtAxis->GetNbins(), 64); // Negative overlap eta range - - fGFW->AddRegion("poiPpr", 0.4, 0.8, 1 + fPtAxis->GetNbins(), 8); // Positive poi eta range - fGFW->AddRegion("olPpr", 0.4, 0.8, 1 + fPtAxis->GetNbins(), 64); // Positive overlap eta range - - fGFW->AddRegion("poifullpr", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 8); // Full poi eta range - fGFW->AddRegion("olfullpr", -0.8, 0.8, 1 + fPtAxis->GetNbins(), 64); // Full overlap eta range - - // reference particles - corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {2 -2}", "ChFull22", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {2 -2}", "PiFull22", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {2 -2}", "KaFull22", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {2 -2}", "PrFull22", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Ch08FGap22", kFALSE)); // Forward correlations - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Pi08FGap22", kFALSE)); // Forward correlations - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Ka08FGap22", kFALSE)); // Forward correlations - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refN08 {2} refP08 {-2}", "Pr08FGap22", kFALSE)); // Forward correlations - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refP08 {-2} refN08 {2}", "Ch08BGap22", kFALSE)); // Backward correlations - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refP08 {-2} refN08 {2}", "Pi08BGap22", kFALSE)); // Backward correlations - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refP08 {-2} refN08 {2}", "Ka08BGap22", kFALSE)); // Backward correlations - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refP08 {-2} refN08 {2}", "Pr08BGap22", kFALSE)); // Backward correlations - corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {2 2 -2 -2}", "ChFull24", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {2 2 -2 -2}", "PiFull24", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {2 2 -2 -2}", "KaFull24", kFALSE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("full {2 2 -2 -2}", "PrFull24", kFALSE)); - - // pt differential pois - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poi full | ol {2 -2}", "ChFull22", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poifullpi full | olfullpi {2 -2}", "PiFull22", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poifullk full | olfullk {2 -2}", "KaFull22", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poifullpr full | olfullpr {2 -2}", "PrFull22", kTRUE)); - - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiN refN08 | olN {2} refP08 {-2}", "Ch08FGap22", kTRUE)); // Forward correlations - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNpi refN08 | olNpi {2} refP08 {-2}", "Pi08FGap22", kTRUE)); // Forward correlations - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNk refN08 | olNk {2} refP08 {-2}", "Ka08FGap22", kTRUE)); // Forward correlations - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiNpr refN08 | olNpr {2} refP08 {-2}", "Pr08FGap22", kTRUE)); // Forward correlations - - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiP refP08 | olP {2} refN08 {-2}", "Ch08BGap22", kTRUE)); // Backward correlations - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPpi refP08 | olPpi {2} refN08 {-2}", "Pi08BGap22", kTRUE)); // Backward correlations - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPk refP08 | olPk {2} refN08 {-2}", "Ka08BGap22", kTRUE)); // Backward correlations - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiPpr refP08 | olPpr {2} refN08 {-2}", "Pr08BGap22", kTRUE)); // Backward correlations - - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poi full | ol {2 2 -2 -2}", "ChFull24", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poifullpi full | olfullpi {2 2 -2 -2}", "PiFull24", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poifullk full | olfullk {2 2 -2 -2}", "KaFull24", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poifullpr full | olfullpr {2 2 -2 -2}", "PrFull24", kTRUE)); - - fGFW->CreateRegions(); - if (eventCuts[useMultCorrCut]) { fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x - 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); fMultPVCutLow->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); @@ -460,6 +366,21 @@ struct FlowPbpbPikp { PROTONS }; + void addConfigObjectsToObjArray(TObjArray* oba, const std::vector& configs) + { + for (auto it = configs.begin(); it != configs.end(); ++it) { + if (it->pTDif) { + std::string suffix = "_ptDiff"; + for (auto i = 0; i < fPtAxis->GetNbins(); ++i) { + std::string index = Form("_pt_%i", i + 1); + oba->Add(new TNamed(it->Head.c_str() + index, it->Head.c_str() + suffix)); + } + } else { + oba->Add(new TNamed(it->Head.c_str(), it->Head.c_str())); + } + } + } + template bool selectionTrack(const TTrack& track) { From ca1aa0d242f9162d8c8f8e95052be3524d4de920 Mon Sep 17 00:00:00 2001 From: omvazque Date: Tue, 20 May 2025 20:52:38 -0500 Subject: [PATCH 1348/1650] [PWGLF] Changed TF1 to TH1F in CCDB. Causing segmentation (#11265) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 97 ++++++++++++-------- 1 file changed, 60 insertions(+), 37 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index 53948f357af..aab3cdbc46e 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -102,7 +102,6 @@ struct UccZdc { Configurable maxEta{"maxEta", +0.8, "maximum eta"}; // Configurables, binning - Configurable nBinsAmpFV0{"nBinsAmpFV0", 100, "N bins FV0 amp"}; Configurable maxAmpFV0{"maxAmpFV0", 2000, "Max FV0 amp"}; Configurable nBinsAmpFT0{"nBinsAmpFT0", 100, "N bins FT0 amp"}; Configurable maxAmpFT0{"maxAmpFT0", 2500, "Max FT0 amp"}; @@ -156,9 +155,6 @@ struct UccZdc { HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; Service ccdb; - TF1* fMeanNch = nullptr; - TF1* fSigmaNch = nullptr; - void init(InitContext const&) { // define axes you want to use @@ -176,7 +172,7 @@ struct UccZdc { registry.add("NchUncorrected", ";#it{N}_{ch} (|#eta| < 0.8);Entries;", kTH1F, {{300, 0., 3000.}}); registry.add("hEventCounter", ";;Events", kTH1F, {axisEvent}); registry.add("ZNamp", ";ZNA+ZNC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); - registry.add("ExcludedEvtVsFT0M", ";T0A+T0C (#times 1/100, -3.3 < #eta < -2.1 and 3.5 < #eta < 4.9);Entries;", kTH1F, {{nBinsAmpFT0, 0., 3000.}}); + registry.add("ExcludedEvtVsFT0M", ";T0A+T0C (#times 1/100, -3.3 < #eta < -2.1 and 3.5 < #eta < 4.9);Entries;", kTH1F, {{nBinsAmpFT0, 0., maxAmpFT0}}); registry.add("ExcludedEvtVsNch", ";#it{N}_{ch} (|#eta|<0.8);Entries;", kTH1F, {{300, 0, 3000}}); registry.add("Nch", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);", kTH1F, {{nBinsNch, minNch, maxNch}}); registry.add("NchVsOneParCorr", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);#LT[#it{p}_{T}^{(1)}]#GT (GeV/#it{c})", kTProfile, {{nBinsNch, minNch, maxNch}}); @@ -257,16 +253,16 @@ struct UccZdc { if (doprocessQA) { registry.add("Debunch", ";t_{ZDC}-t_{ZDA};t_{ZDC}+t_{ZDA}", kTH2F, {{{nBinsTDC, minTdc, maxTdc}, {nBinsTDC, minTdc, maxTdc}}}); - registry.add("NchVsFT0M", ";T0A+T0C (#times 1/100, -3.3 < #eta < -2.1 and 3.5 < #eta < 4.9);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFT0, 0., 3000.}, {nBinsNch, minNch, maxNch}}}); - registry.add("NchVsFT0A", ";T0A (#times 1/100, 3.5 < #eta < 4.9);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsNch, minNch, maxNch}}}); - registry.add("NchVsFT0C", ";T0C (#times 1/100, -3.3 < #eta < -2.1);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFT0, 0., 950.}, {nBinsNch, minNch, maxNch}}}); - registry.add("NchVsFV0A", ";V0A (#times 1/100, 2.2 < #eta < 5);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFV0, 0., maxAmpFV0}, {nBinsNch, minNch, maxNch}}}); + registry.add("NchVsFT0M", ";T0A+T0C (#times 1/100, -3.3 < #eta < -2.1 and 3.5 < #eta < 4.9);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsNch, minNch, maxNch}}}); + registry.add("NchVsFT0A", ";T0A (#times 1/100, 3.5 < #eta < 4.9);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{80, 0., 1800.}, {nBinsNch, minNch, maxNch}}}); + registry.add("NchVsFT0C", ";T0C (#times 1/100, -3.3 < #eta < -2.1);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{80, 0., 600.}, {nBinsNch, minNch, maxNch}}}); + registry.add("NchVsFV0A", ";V0A (#times 1/100, 2.2 < #eta < 5);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{80, 0., maxAmpFV0}, {nBinsNch, minNch, maxNch}}}); registry.add("NchVsEt", ";#it{E}_{T} (|#eta|<0.8);#LTITS+TPC tracks#GT (|#eta|<0.8);", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsNch, minNch, maxNch}}}); registry.add("NchVsNPV", ";#it{N}_{PV} (|#eta|<1);ITS+TPC tracks (|#eta|<0.8);", kTH2F, {{{300, -0.5, 5999.5}, {nBinsNch, minNch, maxNch}}}); registry.add("NchVsITStracks", ";ITS tracks nCls >= 5;TITS+TPC tracks (|#eta|<0.8);", kTH2F, {{{300, -0.5, 5999.5}, {nBinsNch, minNch, maxNch}}}); - registry.add("ZNVsFT0A", ";T0A (#times 1/100);ZNA+ZNC;", kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsZDC, -0.5, maxZN}}}); - registry.add("ZNVsFT0C", ";T0C (#times 1/100);ZNA+ZNC;", kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsZDC, -0.5, maxZN}}}); - registry.add("ZNVsFT0M", ";T0A+T0C (#times 1/100);ZNA+ZNC;", kTH2F, {{{nBinsAmpFT0, 0., 3000.}, {nBinsZDC, -0.5, maxZN}}}); + registry.add("ZNVsFT0A", ";T0A (#times 1/100);ZNA+ZNC;", kTH2F, {{{80, 0., 1800.}, {nBinsZDC, -0.5, maxZN}}}); + registry.add("ZNVsFT0C", ";T0C (#times 1/100);ZNA+ZNC;", kTH2F, {{{80, 0., 600.}, {nBinsZDC, -0.5, maxZN}}}); + registry.add("ZNVsFT0M", ";T0A+T0C (#times 1/100);ZNA+ZNC;", kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsZDC, -0.5, maxZN}}}); registry.add("ZNAamp", ";ZNA;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); registry.add("ZPAamp", ";ZPA;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZP}}); registry.add("ZNCamp", ";ZNC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); @@ -282,6 +278,12 @@ struct UccZdc { registry.add("ZNDifVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA-ZNC;", kTH2F, {{{nBinsNch, minNch, maxNch}, {100, -50., 50.}}}); } + LOG(info) << "\tapplyEff=" << applyEff.value; + LOG(info) << "\tpaTH=" << paTH.value; + LOG(info) << "\tuseMidRapNchSel=" << useMidRapNchSel.value; + LOG(info) << "\tpaTHmeanNch=" << paTHmeanNch.value; + LOG(info) << "\tpaTHsigmaNch=" << paTHsigmaNch.value; + ccdb->setURL("http://alice-ccdb.cern.ch"); // Enabling object caching, otherwise each call goes to the CCDB server ccdb->setCaching(true); @@ -291,21 +293,6 @@ struct UccZdc { // This avoids that users can replace objects **while** a train is running int64_t now = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); ccdb->setCreatedNotAfter(now); - fMeanNch = ccdb->getForTimeStamp(paTHmeanNch.value, now); - fSigmaNch = ccdb->getForTimeStamp(paTHsigmaNch.value, now); - if (!fMeanNch) { - LOGF(fatal, "fMeanNch object not found!"); - } - if (!fSigmaNch) { - LOGF(fatal, "fSigmaNch object not found!"); - } - - LOG(info) << "\tnow=" << now; - LOG(info) << "\tapplyEff=" << applyEff.value; - LOG(info) << "\tpaTH=" << paTH.value; - LOG(info) << "\tuseMidRapNchSel=" << useMidRapNchSel.value; - LOG(info) << "\tpaTHmeanNch=" << paTHmeanNch.value; - LOG(info) << "\tpaTHsigmaNch=" << paTHsigmaNch.value; } template @@ -477,19 +464,37 @@ struct UccZdc { glbTracks++; } - // Nch-based selection + bool skipEvent{false}; if (useMidRapNchSel) { - const double meanNch{fMeanNch->Eval(normT0M)}; - const double sigmaNch{fSigmaNch->Eval(normT0M)}; + auto hMeanNch = ccdb->getForTimeStamp(paTHmeanNch.value, foundBC.timestamp()); + auto hSigmaNch = ccdb->getForTimeStamp(paTHsigmaNch.value, foundBC.timestamp()); + if (!hMeanNch) { + LOGF(info, "hMeanNch NOT LOADED!"); + return; + } + if (!hSigmaNch) { + LOGF(info, "hSigmaNch NOT LOADED!"); + return; + } + + const int binT0M{hMeanNch->FindBin(normT0M)}; + const double meanNch{hMeanNch->GetBinContent(binT0M)}; + const double sigmaNch{hSigmaNch->GetBinContent(binT0M)}; const double nSigmaSelection{nSigmaNchCut * sigmaNch}; const double diffMeanNch{meanNch - glbTracks}; + if (!(std::abs(diffMeanNch) < nSigmaSelection)) { registry.fill(HIST("ExcludedEvtVsFT0M"), normT0M); registry.fill(HIST("ExcludedEvtVsNch"), glbTracks); - return; + } else { + skipEvent = true; } } + if (!skipEvent) { + return; + } + float et = 0., meanpt = 0.; for (const auto& track : tracks) { // Track Selection @@ -617,21 +622,39 @@ struct UccZdc { glbTracks++; } - // Nch-based selection + bool skipEvent{false}; if (useMidRapNchSel) { - const double meanNch{fMeanNch->Eval(normT0M)}; - const double sigmaNch{fSigmaNch->Eval(normT0M)}; + auto hMeanNch = ccdb->getForTimeStamp(paTHmeanNch.value, foundBC.timestamp()); + auto hSigmaNch = ccdb->getForTimeStamp(paTHsigmaNch.value, foundBC.timestamp()); + if (!hMeanNch) { + LOGF(info, "hMeanNch NOT LOADED!"); + return; + } + if (!hSigmaNch) { + LOGF(info, "hSigmaNch NOT LOADED!"); + return; + } + + const int binT0M{hMeanNch->FindBin(normT0M)}; + const double meanNch{hMeanNch->GetBinContent(binT0M)}; + const double sigmaNch{hSigmaNch->GetBinContent(binT0M)}; const double nSigmaSelection{nSigmaNchCut * sigmaNch}; const double diffMeanNch{meanNch - glbTracks}; + if (!(std::abs(diffMeanNch) < nSigmaSelection)) { registry.fill(HIST("ExcludedEvtVsFT0M"), normT0M); registry.fill(HIST("ExcludedEvtVsNch"), glbTracks); - return; + } else { + skipEvent = true; } } - // auto efficiency = ccdb->getForTimeStamp(paTH.value, foundBC.timestamp()); - auto efficiency = ccdb->getForRun(paTH.value, foundBC.runNumber()); + if (!skipEvent) { + return; + } + + auto efficiency = ccdb->getForTimeStamp(paTH.value, foundBC.timestamp()); + // auto efficiency = ccdb->getForRun(paTH.value, foundBC.runNumber()); if (!efficiency) { return; } From c87676c4ac23205f0fa9d5345092616ac825e3ca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 May 2025 08:27:04 +0200 Subject: [PATCH 1349/1650] [Infrastructure] Bump oxsecurity/megalinter from 8.5.0 to 8.7.0 (#11078) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/mega-linter.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/mega-linter.yml b/.github/workflows/mega-linter.yml index 68302e1f873..b1bccfc61ca 100644 --- a/.github/workflows/mega-linter.yml +++ b/.github/workflows/mega-linter.yml @@ -38,7 +38,7 @@ jobs: id: ml # You can override MegaLinter flavor used to have faster performances # More info at https://megalinter.io/flavors/ - uses: oxsecurity/megalinter@v8.5.0 + uses: oxsecurity/megalinter@v8.7.0 env: # All available variables are described in documentation: # https://megalinter.io/configuration/ From b4a215e77c854d26c8573f567d84c987630a93e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Karpi=C5=84ski?= <40724893+davkk@users.noreply.github.com> Date: Wed, 21 May 2025 10:37:17 +0200 Subject: [PATCH 1350/1650] [PWGCF/FemtoUniverse] Efficiency correction in 3D (#11270) --- .../Core/FemtoUniverseEfficiencyCorrection.h | 188 +++++++++++--- .../Macros/calculateEfficiencyCorrection.cxx | 240 ++++++++++++++++++ .../femto_universe_efficiency_calculator.py | 0 ...emto_universe_efficiency_phi_calculator.py | 0 .../femtoUniverseProducerTask.cxx | 11 +- ...emtoUniversePairTaskTrackTrackExtended.cxx | 70 +++-- 6 files changed, 435 insertions(+), 74 deletions(-) create mode 100644 PWGCF/FemtoUniverse/Macros/calculateEfficiencyCorrection.cxx rename PWGCF/FemtoUniverse/{Scripts => Macros}/femto_universe_efficiency_calculator.py (100%) rename PWGCF/FemtoUniverse/{Scripts => Macros}/femto_universe_efficiency_phi_calculator.py (100%) diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCorrection.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCorrection.h index b866649ab04..b4a1ff97539 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCorrection.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCorrection.h @@ -16,15 +16,22 @@ #ifndef PWGCF_FEMTOUNIVERSE_CORE_FEMTOUNIVERSEEFFICIENCYCORRECTION_H_ #define PWGCF_FEMTOUNIVERSE_CORE_FEMTOUNIVERSEEFFICIENCYCORRECTION_H_ +#include +#include +#include +#include +#include + +#include +#include +#include + #include #include #include +#include -#include "Framework/Configurable.h" -#include "CCDB/BasicCCDBManager.h" -#include "TH1.h" -#include "TH2.h" -#include "TH3.h" +#include "PWGCF/FemtoUniverse/DataModel/FemtoDerived.h" namespace o2::analysis::femto_universe::efficiency_correction { @@ -34,30 +41,17 @@ enum ParticleNo : size_t { }; template -concept isOneOrTwo = T == ParticleNo::ONE || T == ParticleNo::TWO; - -template -consteval auto getHistDim() -> int -{ - if (std::is_same_v) - return 1; - else if (std::is_same_v) - return 2; - else if (std::is_same_v) - return 3; - else - return -1; -} +concept IsOneOrTwo = T == ParticleNo::ONE || T == ParticleNo::TWO; struct EffCorConfigurableGroup : framework::ConfigurableGroup { framework::Configurable confEffCorApply{"confEffCorApply", false, "[Efficiency Correction] Should apply efficiency corrections"}; + framework::Configurable confEffCorFillHist{"confEffCorFillHist", false, "[Efficiency Correction] Should fill histograms for efficiency corrections"}; framework::Configurable confEffCorCCDBUrl{"confEffCorCCDBUrl", "http://alice-ccdb.cern.ch", "[Efficiency Correction] CCDB URL to use"}; framework::Configurable confEffCorCCDBPath{"confEffCorCCDBPath", "", "[Efficiency Correction] CCDB path to histograms"}; framework::Configurable> confEffCorCCDBTimestamps{"confEffCorCCDBTimestamps", {}, "[Efficiency Correction] Timestamps of histograms in CCDB (0 can be used as a placeholder, e.g. when running subwagons)"}; + framework::Configurable confEffCorVariables{"confEffCorVariables", "pt", "[Efficiency Correction] Variables for efficiency correction histogram dimensions (available: 'pt'; 'pt,eta'; 'pt,mult'; 'pt,eta,mult')"}; }; -template - requires std::is_base_of_v class EfficiencyCorrection { public: @@ -65,8 +59,23 @@ class EfficiencyCorrection { } - auto init() -> void + auto init(framework::HistogramRegistry* registry, std::vector axisSpecs) -> void { + shouldFillHistograms = config->confEffCorFillHist; + + histRegistry = registry; + if (shouldFillHistograms) { + for (const auto& suffix : histSuffix) { + auto path = std::format("{}/{}", histDirectory, suffix); + registry->add((path + "/hMCTruth").c_str(), "MCTruth; #it{p}_{T} (GeV/#it{c}); #it{#eta}; Mult", framework::kTH3F, axisSpecs); + registry->add((path + "/hPrimary").c_str(), "Primary; #it{p}_{T} (GeV/#it{c}); #it{#eta}; Mult", framework::kTH3F, axisSpecs); + registry->add((path + "/hSecondary").c_str(), "Secondary; #it{p}_{T} (GeV/#it{c}); #it{#eta}; Mult", framework::kTH3F, axisSpecs); + registry->add((path + "/hMaterial").c_str(), "Material; #it{p}_{T} (GeV/#it{c}); #it{#eta}; Mult", framework::kTH3F, axisSpecs); + registry->add((path + "/hFake").c_str(), "Fake; #it{p}_{T} (GeV/#it{c}); #it{#eta}; Mult", framework::kTH3F, axisSpecs); + registry->add((path + "/hOther").c_str(), "Other; #it{p}_{T} (GeV/#it{c}); #it{#eta}; Mult", framework::kTH3F, axisSpecs); + } + } + ccdb.setURL(config->confEffCorCCDBUrl); ccdb.setLocalObjectValidityChecking(); ccdb.setFatalWhenNull(false); @@ -86,20 +95,123 @@ class EfficiencyCorrection continue; } - hLoaded[idx] = timestamp > 0 ? loadHistFromCCDB(timestamp) : nullptr; + if (timestamp > 0) { + switch (getDimensionFromVariables()) { + case 1: + hLoaded[idx] = loadHistFromCCDB(timestamp); + break; + case 2: + hLoaded[idx] = loadHistFromCCDB(timestamp); + break; + case 3: + hLoaded[idx] = loadHistFromCCDB(timestamp); + break; + default: + LOGF(fatal, notify("Unknown configuration for efficiency variables")); + break; + } + } else { + hLoaded[idx] = nullptr; + } } } } - template - requires(sizeof...(BinVars) == getHistDim()) - auto getWeight(ParticleNo partNo, const BinVars&... binVars) const -> float + template + requires IsOneOrTwo + void fillTruthHist(auto particle) + { + if (!shouldFillHistograms) { + return; + } + + histRegistry->fill(HIST(histDirectory) + HIST("/") + HIST(histSuffix[N - 1]) + HIST("/hMCTruth"), + particle.pt(), + particle.eta(), + particle.fdCollision().multV0M()); + } + + template + requires IsOneOrTwo + void fillRecoHist(auto particle, int particlePDG) + { + if (!shouldFillHistograms) { + return; + } + + if (!particle.has_fdMCParticle()) { + return; + } + + auto mcParticle = particle.fdMCParticle(); + + if (mcParticle.pdgMCTruth() == particlePDG) { + switch (mcParticle.partOriginMCTruth()) { + case (o2::aod::femtouniverse_mc_particle::kPrimary): + histRegistry->fill(HIST(histDirectory) + HIST("/") + HIST(histSuffix[N - 1]) + HIST("/hPrimary"), + mcParticle.pt(), + mcParticle.eta(), + particle.fdCollision().multV0M()); + break; + + case (o2::aod::femtouniverse_mc_particle::kDaughter): + case (o2::aod::femtouniverse_mc_particle::kDaughterLambda): + case (o2::aod::femtouniverse_mc_particle::kDaughterSigmaplus): + histRegistry->fill(HIST(histDirectory) + HIST("/") + HIST(histSuffix[N - 1]) + HIST("/hSecondary"), + mcParticle.pt(), + mcParticle.eta(), + particle.fdCollision().multV0M()); + break; + + case (o2::aod::femtouniverse_mc_particle::kMaterial): + histRegistry->fill(HIST(histDirectory) + HIST("/") + HIST(histSuffix[N - 1]) + HIST("/hMaterial"), + mcParticle.pt(), + mcParticle.eta(), + particle.fdCollision().multV0M()); + break; + + case (o2::aod::femtouniverse_mc_particle::kFake): + histRegistry->fill(HIST(histDirectory) + HIST("/") + HIST(histSuffix[N - 1]) + HIST("/hFake"), + mcParticle.pt(), + mcParticle.eta(), + particle.fdCollision().multV0M()); + break; + + default: + histRegistry->fill(HIST(histDirectory) + HIST("/") + HIST(histSuffix[N - 1]) + HIST("/hOther"), + mcParticle.pt(), + mcParticle.eta(), + particle.fdCollision().multV0M()); + break; + } + } + } + + auto getWeight(ParticleNo partNo, auto particle) -> float { auto weight = 1.0f; auto hWeights = hLoaded[partNo - 1]; if (shouldApplyCorrection && hWeights) { - auto bin = hWeights->FindBin(binVars...); + auto dim = static_cast(hWeights->GetDimension()); + if (dim != getDimensionFromVariables()) { + LOGF(fatal, notify("Histogram \"%s\" has wrong dimension %d != %d"), config->confEffCorCCDBPath.value, dim, config->confEffCorVariables.value.size()); + return weight; + } + + auto bin = -1; + if (config->confEffCorVariables.value == "pt") { + bin = hLoaded[partNo - 1]->FindBin(particle.pt()); + } else if (config->confEffCorVariables.value == "pt,eta") { + bin = hLoaded[partNo - 1]->FindBin(particle.pt(), particle.eta()); + } else if (config->confEffCorVariables.value == "pt,mult") { + bin = hLoaded[partNo - 1]->FindBin(particle.pt(), particle.fdCollision().multV0M()); + } else if (config->confEffCorVariables.value == "pt,eta,mult") { + bin = hLoaded[partNo - 1]->FindBin(particle.pt(), particle.eta(), particle.fdCollision().multV0M()); + } else { + LOGF(fatal, notify("Unknown configuration for efficiency variables")); + return weight; + } weight = hWeights->GetBinContent(bin); } @@ -112,7 +224,7 @@ class EfficiencyCorrection return fmt::format("[EFFICIENCY CORRECTION] {}", msg); } - static auto isHistEmpty(HistType* hist) -> bool + static auto isHistEmpty(TH1* hist) -> bool { if (!hist) { return true; @@ -125,9 +237,10 @@ class EfficiencyCorrection return true; } - auto loadHistFromCCDB(const int64_t timestamp) const -> HistType* + template + auto loadHistFromCCDB(const int64_t timestamp) const -> H* { - auto hWeights = ccdb.getForTimeStamp(config->confEffCorCCDBPath, timestamp); + auto hWeights = ccdb.getForTimeStamp(config->confEffCorCCDBPath, timestamp); if (!hWeights || hWeights->IsZombie()) { LOGF(error, notify("Could not load histogram \"%s/%ld\""), config->confEffCorCCDBPath.value, timestamp); return nullptr; @@ -141,12 +254,23 @@ class EfficiencyCorrection return hWeights; } + auto getDimensionFromVariables() -> size_t + { + auto parts = std::views::split(config->confEffCorVariables.value, ','); + return std::ranges::distance(parts); + } + EffCorConfigurableGroup* config{}; - bool shouldApplyCorrection = false; + bool shouldApplyCorrection{false}; + bool shouldFillHistograms{false}; o2::ccdb::BasicCCDBManager& ccdb{o2::ccdb::BasicCCDBManager::instance()}; - std::array hLoaded{}; + std::array hLoaded{}; + + framework::HistogramRegistry* histRegistry{}; + static constexpr std::string_view histDirectory{"EfficiencyCorrection"}; + static constexpr std::string_view histSuffix[2]{"one", "two"}; }; } // namespace o2::analysis::femto_universe::efficiency_correction diff --git a/PWGCF/FemtoUniverse/Macros/calculateEfficiencyCorrection.cxx b/PWGCF/FemtoUniverse/Macros/calculateEfficiencyCorrection.cxx new file mode 100644 index 00000000000..e99331231e2 --- /dev/null +++ b/PWGCF/FemtoUniverse/Macros/calculateEfficiencyCorrection.cxx @@ -0,0 +1,240 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file calculateEfficiencyCorrection.cxx +/// \brief Macro for calculating efficiency corrections based on 3D histograms +/// \author Dawid Karpiński, WUT Warsaw, dawid.karpinski@cern.ch + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include // NOLINT +#include +#include +#include + +namespace fs = std::filesystem; + +auto* getHistogram(TFile* file, const std::string& name) +{ + return dynamic_cast(file->Get(name.c_str())); +} + +auto* projectHistogram(TH3* hist, const std::string& projection) +{ + return hist->Project3D(projection.c_str()); +} + +template +H* cloneHistogram(H* hist, const std::string& name) +{ + return dynamic_cast(hist->Clone(name.c_str())); +} + +auto forEachBin(TH1* hist, auto func) -> void +{ + if (hist->GetDimension() == 1) { + for (auto x{1}; x <= hist->GetNbinsX(); ++x) { + func(x, 0, 0); + } + } else if (hist->GetDimension() == 2) { + for (auto x{1}; x <= hist->GetNbinsX(); ++x) { + for (auto y{1}; y <= hist->GetNbinsY(); ++y) { + func(x, y, 0); + } + } + } else if (hist->GetDimension() == 3) { + for (auto x{1}; x <= hist->GetNbinsX(); ++x) { + for (auto y{1}; y <= hist->GetNbinsY(); ++y) { + for (auto z{1}; z <= hist->GetNbinsZ(); ++z) { + func(x, y, z); + } + } + } + } else { + assert(false && "should not happen"); + } +} + +auto setAxisTitles(TH1* hist, const std::string& projection) -> void +{ + auto* xAxis{hist->GetXaxis()}; + auto* yAxis{hist->GetYaxis()}; + auto* zAxis{hist->GetZaxis()}; + + xAxis->SetTitle("#it{p}_{T} (GeV/#it{c})"); + + if (hist->GetDimension() == 2) { + if (projection == "yx") { + yAxis->SetTitle("#it{#eta}"); + } else if (projection == "zx") { + yAxis->SetTitle("mult"); + } + } else if (hist->GetDimension() == 3) { + yAxis->SetTitle("#it{#eta}"); + zAxis->SetTitle("mult"); + } +} + +auto calculateEfficiencyCorrection(const fs::path& resultsPath, const fs::path& histPath, const std::string& projection) -> void +{ + assert(!resultsPath.empty() && !histPath.empty()); + if (projection != "" && projection != "x" && projection != "yx" && projection != "zx") { + std::cerr << "Error: projection must be one of: x, yx, zx\n"; + std::exit(1); + return; + } + + auto isAlien{false}; + if (resultsPath.string().starts_with("alien://")) { + TGrid::Connect("alien://"); + isAlien = true; + } + + auto* resultFile{TFile::Open(resultsPath.c_str())}; + assert(resultFile != nullptr && !resultFile->IsZombie()); + + using namespace std::chrono; + auto now{duration_cast(system_clock::now().time_since_epoch()).count()}; + auto outputPath{isAlien ? std::filesystem::current_path() : resultsPath.parent_path()}; + outputPath /= std::format("{}-effcor-{}.root", resultsPath.stem().string(), now); + + auto* outputFile{TFile::Open(outputPath.c_str(), "RECREATE")}; + assert(outputFile != nullptr && !outputFile->IsZombie()); + + auto* histTruthBase{getHistogram(resultFile, histPath / "hMCTruth")}; + auto* histPrimaryBase{getHistogram(resultFile, histPath / "hPrimary")}; + auto* histSecondaryBase{getHistogram(resultFile, histPath / "hSecondary")}; + + assert(histTruthBase); + assert(histPrimaryBase); + assert(histSecondaryBase); + + TH1* histTruth{histTruthBase}; + TH1* histPrimary{histPrimaryBase}; + TH1* histSecondary{histSecondaryBase}; + + if (projection != "") { + histPrimary = projectHistogram(histPrimaryBase, projection); + histSecondary = projectHistogram(histSecondaryBase, projection); + histTruth = projectHistogram(histTruthBase, projection); + } + + auto* histTotal{cloneHistogram(histPrimary, "hTotal")}; + histTotal->Add(histSecondary); + + auto* histEfficiency{cloneHistogram(histPrimary, "hEfficiency")}; + histEfficiency->Reset(); + setAxisTitles(histEfficiency, projection); + + auto* histWeights{cloneHistogram(histPrimary, "hWeights")}; + histWeights->Reset(); + setAxisTitles(histWeights, projection); + + forEachBin(histPrimary, [&](int x, int y, int z) { + auto primVal{histPrimary->GetBinContent(x, y, z)}; + auto primErr{histPrimary->GetBinError(x, y, z)}; + + auto secVal{histSecondary->GetBinContent(x, y, z)}; + auto secErr{histSecondary->GetBinError(x, y, z)}; + + auto truthVal{histTruth->GetBinContent(x, y, z)}; + auto truthErr{histTruth->GetBinError(x, y, z)}; + + auto effVal{0.}; + auto effErr{0.}; + if (truthVal > 0) { + effVal = primVal / truthVal; + effErr = std::sqrt(std::pow(primErr / truthVal, 2) + std::pow((primVal * truthErr / std::pow(truthVal, 2)), 2)); + } + + histEfficiency->SetBinContent(x, y, z, effVal); + histEfficiency->SetBinError(x, y, z, effErr); + + auto totalVal{primVal + secVal}; + auto totalErr{std::hypot(primErr, secErr)}; + + auto contVal{0.}; + auto contErr{0.}; + if (totalVal > 0) { + contVal = secVal / totalVal; + contErr = std::sqrt(std::pow(secErr / totalVal, 2) + std::pow((secVal * totalErr / std::pow(totalVal, 2)), 2)); + } + + auto weightVal{0.}; + auto weightErr{0.}; + if (effVal > 0) { + weightVal = (1 - contVal) / effVal; + weightErr = std::sqrt(std::pow(contErr / effVal, 2) + std::pow((1 - contVal) * effErr / std::pow(effVal, 2), 2)); + } + + histWeights->SetBinContent(x, y, z, weightVal); + histWeights->SetBinError(x, y, z, weightErr); + }); + + outputFile->WriteTObject(histEfficiency); + outputFile->WriteTObject(histWeights); + + outputFile->Close(); + resultFile->Close(); +} + +auto printUsage(const char* name) -> void +{ + std::cerr << "Usage: " << name << "\n" + << " -f \n" + << " -d \n" + << " -p [optional, default: no projection, 3D histogram]\n" + << " Available projections:\n" + << " x - projection onto pT axis (1D histogram)\n" + << " yx - projection onto pT, eta (2D histogram)\n" + << " zx - projection onto pT, mult (2D histogram)\n"; +} + +int main(int argc, char** argv) +{ + std::string results{""}, hist{""}, proj{""}; + auto flag{0}; + + while ((flag = getopt(argc, argv, "f:d:p:")) != -1) { + switch (flag) { + case 'f': + results = optarg; + break; + case 'd': + hist = optarg; + break; + case 'p': + proj = optarg; + break; + default: + printUsage(argv[0]); + return 1; + } + } + + if (results.empty() || hist.empty()) { + printUsage(argv[0]); + return 1; + } + + calculateEfficiencyCorrection(results, hist, proj); + return 0; +} diff --git a/PWGCF/FemtoUniverse/Scripts/femto_universe_efficiency_calculator.py b/PWGCF/FemtoUniverse/Macros/femto_universe_efficiency_calculator.py similarity index 100% rename from PWGCF/FemtoUniverse/Scripts/femto_universe_efficiency_calculator.py rename to PWGCF/FemtoUniverse/Macros/femto_universe_efficiency_calculator.py diff --git a/PWGCF/FemtoUniverse/Scripts/femto_universe_efficiency_phi_calculator.py b/PWGCF/FemtoUniverse/Macros/femto_universe_efficiency_phi_calculator.py similarity index 100% rename from PWGCF/FemtoUniverse/Scripts/femto_universe_efficiency_phi_calculator.py rename to PWGCF/FemtoUniverse/Macros/femto_universe_efficiency_phi_calculator.py diff --git a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx index 93889d7d1ff..7eb268e3353 100644 --- a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx +++ b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx @@ -709,10 +709,11 @@ struct FemtoUniverseProducerTask { particleOrigin = aod::femtouniverse_mc_particle::ParticleOriginMCTruth::kPrimary; } else if (!motherparticlesMC.empty()) { auto motherparticleMC = motherparticlesMC.front(); - if (motherparticleMC.producedByGenerator()) + if (motherparticleMC.producedByGenerator()) { particleOrigin = checkDaughterType(fdparttype, motherparticleMC.pdgCode()); - } else { - particleOrigin = aod::femtouniverse_mc_particle::ParticleOriginMCTruth::kMaterial; + } else { + particleOrigin = aod::femtouniverse_mc_particle::ParticleOriginMCTruth::kMaterial; + } } } else { particleOrigin = aod::femtouniverse_mc_particle::ParticleOriginMCTruth::kFake; @@ -903,8 +904,8 @@ struct FemtoUniverseProducerTask { { for (const auto& c : col) { const auto vtxZ = c.posZ(); - float mult = 0; - int multNtr = 0; + float mult = confIsRun3 ? c.multFV0M() : 0.5 * (c.multFV0M()); + int multNtr = confIsRun3 ? c.multNTracksPV() : c.multTracklets(); if (std::abs(vtxZ) > confEvtZvtx) { continue; diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackExtended.cxx index 27e865ce552..b85e4832089 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackExtended.cxx @@ -105,7 +105,6 @@ struct FemtoUniversePairTaskTrackTrackExtended { /// Histogramming for particle 1 FemtoUniverseParticleHisto trackHistoPartOne; - FemtoUniverseParticleHisto hMCTruth1; /// Particle 2 Configurable confIsSame{"confIsSame", false, "Pairs of the same particle"}; @@ -129,7 +128,6 @@ struct FemtoUniversePairTaskTrackTrackExtended { /// Histogramming for particle 2 FemtoUniverseParticleHisto trackHistoPartTwo; - FemtoUniverseParticleHisto hMCTruth2; /// Histogramming for Event FemtoUniverseEventHisto eventHisto; @@ -176,9 +174,10 @@ struct FemtoUniversePairTaskTrackTrackExtended { HistogramRegistry qaRegistry{"TrackQA", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry resultRegistry{"Correlations", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry mixQaRegistry{"mixQaRegistry", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry effCorrRegistry{"EfficiencyCorrection", {}, OutputObjHandlingPolicy::AnalysisObject}; EffCorConfigurableGroup effCorConfGroup; - EfficiencyCorrection effCorrection{&effCorConfGroup}; + EfficiencyCorrection effCorrection{&effCorConfGroup}; /// @brief Counter for particle swapping int fNeventsProcessed = 0; @@ -322,18 +321,10 @@ struct FemtoUniversePairTaskTrackTrackExtended { void init(InitContext&) { - if (twotracksconfigs.confIsMC) { - hMCTruth1.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarPDGBins, false, trackonefilter.confPDGCodePartOne, false); - if (!confIsSame) { - hMCTruth2.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarPDGBins, false, tracktwofilter.confPDGCodePartTwo, false); - } - } - effCorrection.init(); - eventHisto.init(&qaRegistry); - trackHistoPartOne.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarBins, twotracksconfigs.confIsMC, trackonefilter.confPDGCodePartOne, true); // last true = isDebug + trackHistoPartOne.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarBins, twotracksconfigs.confIsMC, trackonefilter.confPDGCodePartOne, true, std::nullopt); // last true = isDebug if (!confIsSame) { - trackHistoPartTwo.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarBins, twotracksconfigs.confIsMC, tracktwofilter.confPDGCodePartTwo, true); // last true = isDebug + trackHistoPartTwo.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarBins, twotracksconfigs.confIsMC, tracktwofilter.confPDGCodePartTwo, true, std::nullopt); // last true = isDebug } mixQaRegistry.add("MixingQA/hSECollisionBins", ";bin;Entries", kTH1F, {{120, -0.5, 119.5}}); @@ -351,6 +342,14 @@ struct FemtoUniversePairTaskTrackTrackExtended { vPIDPartOne = trackonefilter.confPIDPartOne.value; vPIDPartTwo = tracktwofilter.confPIDPartTwo.value; kNsigma = twotracksconfigs.confTrkPIDnSigmaMax.value; + + effCorrection.init( + &effCorrRegistry, + { + static_cast(confTempFitVarpTBins), + {confEtaBins, -2, 2}, + confMultBins, + }); } template @@ -361,23 +360,12 @@ struct FemtoUniversePairTaskTrackTrackExtended { } template - requires isOneOrTwo - auto doMCTruth(FemtoUniverseParticleHisto hist, auto parts) -> void + requires IsOneOrTwo + auto doMCTruth(auto parts, int partPDG, int partCharge) -> void { - auto expectedPDG = 0; - auto expectedCharge = 0.0l; - - if constexpr (N == ParticleNo::ONE) { - expectedPDG = trackonefilter.confPDGCodePartOne; - expectedCharge = trackonefilter.confChargePart1; - } else if constexpr (N == ParticleNo::TWO) { - expectedPDG = tracktwofilter.confPDGCodePartTwo; - expectedCharge = tracktwofilter.confChargePart2; - } - for (const auto& particle : parts) { auto pdgCode = static_cast(particle.pidCut()); - if (pdgCode != expectedPDG) { + if (pdgCode != partPDG) { continue; } @@ -386,9 +374,11 @@ struct FemtoUniversePairTaskTrackTrackExtended { continue; } - if (sign(pdgParticle->Charge()) == sign(expectedCharge)) { - hist.template fillQA(particle); + if (sign(pdgParticle->Charge()) != sign(partCharge)) { + continue; } + + effCorrection.fillTruthHist(particle); } } @@ -432,6 +422,9 @@ struct FemtoUniversePairTaskTrackTrackExtended { } trackHistoPartOne.fillQA(part); + if constexpr (isMC) { + effCorrection.fillRecoHist(part, trackonefilter.confPDGCodePartOne); + } } if (!confIsSame) { @@ -456,6 +449,9 @@ struct FemtoUniversePairTaskTrackTrackExtended { } } trackHistoPartTwo.fillQA(part); + if constexpr (isMC) { + effCorrection.fillRecoHist(part, tracktwofilter.confPDGCodePartTwo); + } } /// Now build the combinations for non-identical particle pairs @@ -505,9 +501,9 @@ struct FemtoUniversePairTaskTrackTrackExtended { continue; } - float weight = effCorrection.getWeight(ParticleNo::ONE, p1.pt()); + float weight = effCorrection.getWeight(ParticleNo::ONE, p1); if (!confIsSame) { - weight *= effCorrection.getWeight(ParticleNo::TWO, p2.pt()); + weight *= effCorrection.getWeight(ParticleNo::TWO, p2); } if (swpart) @@ -566,9 +562,9 @@ struct FemtoUniversePairTaskTrackTrackExtended { continue; } - float weight = effCorrection.getWeight(ParticleNo::ONE, p1.pt()); + float weight = effCorrection.getWeight(ParticleNo::ONE, p1); if (!confIsSame) { - weight *= effCorrection.getWeight(ParticleNo::TWO, p2.pt()); + weight *= effCorrection.getWeight(ParticleNo::TWO, p2); } sameEventCont.setPair(p1, p2, multCol, twotracksconfigs.confUse3D, weight); @@ -602,11 +598,11 @@ struct FemtoUniversePairTaskTrackTrackExtended { fillCollision(col); auto groupMCTruth1 = partsOneMCTruth->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - doMCTruth<1>(hMCTruth1, groupMCTruth1); + doMCTruth(groupMCTruth1, trackonefilter.confPDGCodePartOne, trackonefilter.confChargePart1); if (!confIsSame) { auto groupMCTruth2 = partsTwoMCTruth->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - doMCTruth<2>(hMCTruth2, groupMCTruth2); + doMCTruth(groupMCTruth2, tracktwofilter.confPDGCodePartTwo, tracktwofilter.confChargePart2); } auto groupMCReco1 = partsOneMCReco->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); @@ -674,9 +670,9 @@ struct FemtoUniversePairTaskTrackTrackExtended { } } - float weight = effCorrection.getWeight(ParticleNo::ONE, p1.pt()); + float weight = effCorrection.getWeight(ParticleNo::ONE, p1); if (!confIsSame) { - weight *= effCorrection.getWeight(ParticleNo::TWO, p2.pt()); + weight *= effCorrection.getWeight(ParticleNo::TWO, p2); } if (swpart) From 5a21922fe03133b2cbfed2538edc54eae34150e3 Mon Sep 17 00:00:00 2001 From: Jaideep Tanwar <141036812+jtanwar2212@users.noreply.github.com> Date: Wed, 21 May 2025 14:57:46 +0530 Subject: [PATCH 1351/1650] [PWGLF] removed unassigned histograms (#11277) --- PWGLF/Tasks/Nuspex/CMakeLists.txt | 2 +- .../Tasks/Nuspex/{NucleiTPCPbPb.cxx => nucleitpcpbpb.cxx} | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) rename PWGLF/Tasks/Nuspex/{NucleiTPCPbPb.cxx => nucleitpcpbpb.cxx} (99%) diff --git a/PWGLF/Tasks/Nuspex/CMakeLists.txt b/PWGLF/Tasks/Nuspex/CMakeLists.txt index 5041673105f..b133fb12cd6 100644 --- a/PWGLF/Tasks/Nuspex/CMakeLists.txt +++ b/PWGLF/Tasks/Nuspex/CMakeLists.txt @@ -85,7 +85,7 @@ o2physics_add_dpl_workflow(spectra-tpc-tiny COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(nuclei-tpcspectra - SOURCES NucleiTPCPbPb.cxx + SOURCES nucleitpcpbpb.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) diff --git a/PWGLF/Tasks/Nuspex/NucleiTPCPbPb.cxx b/PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx similarity index 99% rename from PWGLF/Tasks/Nuspex/NucleiTPCPbPb.cxx rename to PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx index f4099c4b754..090f57589bc 100644 --- a/PWGLF/Tasks/Nuspex/NucleiTPCPbPb.cxx +++ b/PWGLF/Tasks/Nuspex/nucleitpcpbpb.cxx @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. /// -/// \file NucleiTPCPbPb.cxx +/// \file nucleitpcpbpb.cxx /// /// \brief This task use global tracks and used for primary selection analysis using TPC detector. /// It currently contemplates 6 particle types: @@ -174,7 +174,7 @@ struct NucleitpcPbPb { const AxisSpec axisdEdx{2000, 0, 2000, "d#it{E}/d#it{x}"}; const AxisSpec axisCent{100, 0, 100, "centrality"}; const AxisSpec axisVtxZ{100, -20, 20, "z"}; - const AxisSpec ptAxis{1000, 0, 20, "#it{p}_{T} (GeV/#it{c})"}; + const AxisSpec ptAxis{200, 0, 20, "#it{p}_{T} (GeV/#it{c})"}; const AxisSpec axiseta{100, -1, 1, "eta"}; const AxisSpec axisrapidity{100, -2, 2, "rapidity"}; const AxisSpec axismass{100, 0, 20, "mass^{2}"}; @@ -240,7 +240,8 @@ struct NucleitpcPbPb { continue; if (track.tpcNClsFound() < cfgTrackPIDsettings->get(i, "minTPCnCls") && cfgTPCNClsfoundRequire) continue; - if (((track.tpcNClsCrossedRows() < cfgTrackPIDsettings->get(i, "minTPCnClsCrossedRows")) || track.tpcNClsCrossedRows() < 0.8 * track.tpcNClsFindable()) && cfgTPCNClsCrossedRowsRequire) + double min_value = 0.8; + if (((track.tpcNClsCrossedRows() < cfgTrackPIDsettings->get(i, "minTPCnClsCrossedRows")) || track.tpcNClsCrossedRows() < min_value * track.tpcNClsFindable()) && cfgTPCNClsCrossedRowsRequire) continue; if (track.tpcChi2NCl() > cfgTrackPIDsettings->get(i, "maxTPCchi2") && cfgmaxTPCchi2Require) continue; @@ -360,7 +361,6 @@ struct NucleitpcPbPb { // histos.fill(HIST("histCentFT0A"), collision.centFT0A()); histos.fill(HIST("histCentFT0C"), collision.centFT0C()); histos.fill(HIST("histCentFT0M"), collision.centFT0M()); - histos.fill(HIST("histEvents"), collision.centFT0C(), occupancy); } primVtx.assign({collision.posX(), collision.posY(), collision.posZ()}); cents.assign({collision.centFT0A(), collision.centFT0C(), collision.centFT0M()}); From 21f629294194d69f76500046db4edd730e40f1fa Mon Sep 17 00:00:00 2001 From: Kai Cui <129373281+kcui1@users.noreply.github.com> Date: Wed, 21 May 2025 19:03:55 +0800 Subject: [PATCH 1352/1650] [PWGLF] Small bug fix for feed-down correction (#11271) --- .../Strangeness/hStrangeCorrelationFilter.cxx | 18 +- .../Tasks/Strangeness/hStrangeCorrelation.cxx | 232 ++++++++++-------- 2 files changed, 141 insertions(+), 109 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx b/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx index 7d73e7c9f07..6fdccd95a51 100644 --- a/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx +++ b/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx @@ -230,13 +230,17 @@ struct HStrangeCorrelationFilter { fOmegaMean->SetParameters(massParsOmegaMean->at(0), massParsOmegaMean->at(1), massParsOmegaMean->at(2), massParsOmegaMean->at(3)); fOmegaWidth->SetParameters(massParsOmegaWidth->at(0), massParsOmegaWidth->at(1), massParsOmegaWidth->at(2), massParsOmegaWidth->at(3)); - histos.add("h3dMassK0Short", "h3dMassK0Short", kTH3F, {axisPtQA, axisK0ShortMass, axisMult}); - histos.add("h3dMassLambda", "h3dMassLambda", kTH3F, {axisPtQA, axisLambdaMass, axisMult}); - histos.add("h3dMassAntiLambda", "h3dMassAntiLambda", kTH3F, {axisPtQA, axisLambdaMass, axisMult}); - histos.add("h3dMassXiMinus", "h3dMassXiMinus", kTH3F, {axisPtQA, axisXiMass, axisMult}); - histos.add("h3dMassXiPlus", "h3dMassXiPlus", kTH3F, {axisPtQA, axisXiMass, axisMult}); - histos.add("h3dMassOmegaMinus", "h3dMassOmegaMinus", kTH3F, {axisPtQA, axisOmegaMass, axisMult}); - histos.add("h3dMassOmegaPlus", "h3dMassOmegaPlus", kTH3F, {axisPtQA, axisOmegaMass, axisMult}); + if (doprocessV0s || doprocessV0sMC) { + histos.add("h3dMassK0Short", "h3dMassK0Short", kTH3F, {axisPtQA, axisK0ShortMass, axisMult}); + histos.add("h3dMassLambda", "h3dMassLambda", kTH3F, {axisPtQA, axisLambdaMass, axisMult}); + histos.add("h3dMassAntiLambda", "h3dMassAntiLambda", kTH3F, {axisPtQA, axisLambdaMass, axisMult}); + } + if (doprocessCascades || doprocessCascadesMC) { + histos.add("h3dMassXiMinus", "h3dMassXiMinus", kTH3F, {axisPtQA, axisXiMass, axisMult}); + histos.add("h3dMassXiPlus", "h3dMassXiPlus", kTH3F, {axisPtQA, axisXiMass, axisMult}); + histos.add("h3dMassOmegaMinus", "h3dMassOmegaMinus", kTH3F, {axisPtQA, axisOmegaMass, axisMult}); + histos.add("h3dMassOmegaPlus", "h3dMassOmegaPlus", kTH3F, {axisPtQA, axisOmegaMass, axisMult}); + } } void initCCDB(aod::BCsWithTimestamps::iterator const& bc) diff --git a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx index 4f37921e841..fb63f8b9c44 100644 --- a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx +++ b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx @@ -84,8 +84,11 @@ struct HStrangeCorrelation { Configurable doMCassociation{"doMCassociation", false, "fill everything only for MC associated"}; Configurable doTriggPhysicalPrimary{"doTriggPhysicalPrimary", false, "require physical primary for trigger particles"}; Configurable doAssocPhysicalPrimary{"doAssocPhysicalPrimary", false, "require physical primary for associated particles"}; + Configurable doAssocPhysicalPrimaryInGen{"doAssocPhysicalPrimaryInGen", false, "require physical primary for associated particles in Generated Partilces"}; Configurable doLambdaPrimary{"doLambdaPrimary", false, "do primary selection for lambda"}; Configurable doAutocorrelationRejection{"doAutocorrelationRejection", true, "reject pairs where trigger Id is the same as daughter particle Id"}; + Configurable doMixingQAandEventQA{"doMixingQAandEventQA", true, "if true, add EvnetQA and MixingQA hist to histos"}; + Configurable doITSClustersQA{"doITSClustersQA", true, "if true, add ITSCluster hist to histos"}; Configurable triggerBinToSelect{"triggerBinToSelect", 0, "trigger bin to select on if processSelectEventWithTrigger enabled"}; Configurable triggerParticleCharge{"triggerParticleCharge", 0, "For checks, if 0 all charged tracks, if -1 only neg., if 1 only positive"}; @@ -597,11 +600,11 @@ struct HStrangeCorrelation { histos.fill(HIST("sameEvent/LeftBg/") + HIST(kV0names[Index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); if (assocCandidate.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(Index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && !mixing && -massWindowConfigurations.maxPeakNSigma < assocCandidate.invMassNSigma(Index) && assocCandidate.invMassNSigma(Index) < +massWindowConfigurations.maxPeakNSigma) { histos.fill(HIST("sameEvent/Signal/") + HIST(kV0names[Index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); - if (std::abs(deltaphi) < 0.8) { + if (std::abs(deltaphi) < 0.8 && doITSClustersQA) { histos.fill(HIST("hITSClusters") + HIST(kV0names[Index]) + HIST("NegativeDaughterToward"), ptassoc, negtrack.itsNCls(), assoc.v0radius()); histos.fill(HIST("hITSClusters") + HIST(kV0names[Index]) + HIST("PositiveDaughterToward"), ptassoc, postrack.itsNCls(), assoc.v0radius()); } - if (std::abs(deltaphi) > 1 && std::abs(deltaphi) < 2) { + if (std::abs(deltaphi) > 1 && std::abs(deltaphi) < 2 && doITSClustersQA) { histos.fill(HIST("hITSClusters") + HIST(kV0names[Index]) + HIST("NegativeDaughterTransverse"), ptassoc, negtrack.itsNCls(), assoc.v0radius()); histos.fill(HIST("hITSClusters") + HIST(kV0names[Index]) + HIST("PositiveDaughterTransverse"), ptassoc, postrack.itsNCls(), assoc.v0radius()); } @@ -1015,47 +1018,59 @@ struct HStrangeCorrelation { const AxisSpec axisPtTriggerNDim{edgesPtTrigger, "#it{p}_{T}^{trigger} (GeV/c)"}; const AxisSpec axisVtxZNDim{edgesVtxZ, "vertex Z (cm)"}; const AxisSpec axisMultNDim{edgesMult, "mult percentile"}; - - // event selections in Pb-Pb - histos.add("hEventSelection", "hEventSelection", kTH1F, {{10, 0, 10}}); - TString eventSelLabel[] = {"all", "sel8", "kIsTriggerTVX", "PV_{z}", "kIsGoodITSLayersAll", "kIsGoodZvtxFT0vsPV", "OccupCut", "kNoITSROFrameBorder", "kNoSameBunchPileup ", " kNoCollInTimeRangeStandard"}; - for (int i = 1; i <= histos.get(HIST("hEventSelection"))->GetNbinsX(); i++) { - histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(i, eventSelLabel[i - 1]); + if (!doPPAnalysis) { + // event selections in Pb-Pb + histos.add("hEventSelection", "hEventSelection", kTH1F, {{10, 0, 10}}); + TString eventSelLabel[] = {"all", "sel8", "kIsTriggerTVX", "PV_{z}", "kIsGoodITSLayersAll", "kIsGoodZvtxFT0vsPV", "OccupCut", "kNoITSROFrameBorder", "kNoSameBunchPileup ", " kNoCollInTimeRangeStandard"}; + for (int i = 1; i <= histos.get(HIST("hEventSelection"))->GetNbinsX(); i++) { + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(i, eventSelLabel[i - 1]); + } } - // Some QA plots - histos.add("hGeneratedQAPtTrigger", "hGeneratedQAPtTrigger", kTH2F, {axisPtQA, {5, -0.5f, 4.5f}}); - histos.add("hGeneratedQAPtAssociatedK0", "hGeneratedQAPtAssociatedK0", kTH2F, {axisPtQA, {5, -0.5f, 4.5f}}); - histos.add("hClosureQAPtTrigger", "hClosureQAPtTrigger", kTH2F, {axisPtQA, {5, -0.5f, 4.5f}}); - histos.add("hClosureQAPtAssociatedK0", "hClosureQAPtAssociatedK0", kTH2F, {axisPtQA, {5, -0.5f, 4.5f}}); - - histos.add("hTriggerAllSelectedEtaVsPt", "hTriggerAllSelectedEtaVsPt", kTH3F, {axisPtQA, axisEta, axisMult}); - - histos.add("hClosureTestEventCounter", "hClosureTestEventCounter", kTH1F, {{10, 0, 10}}); - - histos.add("hNumberOfRejectedPairsHadron", "hNumberOfRejectedPairsHadron", kTH1F, {{1, 0, 1}}); - histos.add("hNumberOfRejectedPairsV0", "hNumberOfRejectedPairsV0", kTH1F, {{1, 0, 1}}); - histos.add("hNumberOfRejectedPairsCascades", "hNumberOfRejectedPairsCascades", kTH1F, {{1, 0, 1}}); - histos.add("hNumberOfRejectedPairsPion", "hNumberOfRejectedPairsPion", kTH1F, {{1, 0, 1}}); - - // mixing QA - histos.add("MixingQA/hSECollisionBins", ";bin;Entries", kTH1F, {{140, -0.5, 139.5}}); - histos.add("MixingQA/hMECollisionBins", ";bin;Entries", kTH1F, {{140, -0.5, 139.5}}); - histos.add("MixingQA/hMEpvz1", ";pvz;Entries", kTH1F, {{30, -15, 15}}); - histos.add("MixingQA/hMEpvz2", ";pvz;Entries", kTH1F, {{30, -15, 15}}); - - // Event QA - histos.add("EventQA/hMixingQA", "mixing QA", kTH1F, {{2, -0.5, 1.5}}); - histos.add("EventQA/hMult", "Multiplicity", kTH1F, {axisMult}); - histos.add("EventQA/hPvz", ";pvz;Entries", kTH1F, {{30, -15, 15}}); - histos.add("EventQA/hMultFT0vsTPC", ";centFT0M;multNTracksPVeta1", kTH2F, {{100, 0, 100}, {300, 0, 300}}); - - // QA and THn Histograms - histos.add("hTriggerPtResolution", ";p_{T}^{reconstructed} (GeV/c); p_{T}^{generated} (GeV/c)", kTH2F, {axisPtQA, axisPtQA}); - histos.add("hTriggerPrimaryEtaVsPt", "hTriggerPrimaryEtaVsPt", kTH3F, {axisPtQA, axisEta, axisMult}); - histos.add("hTrackEtaVsPtVsPhi", "hTrackEtaVsPtVsPhi", kTH3F, {axisPtQA, axisEta, axisPhi}); - histos.add("hAssocTrackEtaVsPtVsPhi", "hAssocTrackEtaVsPtVsPhi", kTH3F, {axisPtQA, axisEta, axisPhi}); - histos.add("hTrackAttempt", "Attempt", kTH3F, {axisPtQA, axisEta, axisPhi}); + if (doprocessMCGenerated) { + histos.add("hGeneratedQAPtTrigger", "hGeneratedQAPtTrigger", kTH2F, {axisPtQA, {5, -0.5f, 4.5f}}); + histos.add("hGeneratedQAPtAssociatedK0", "hGeneratedQAPtAssociatedK0", kTH2F, {axisPtQA, {5, -0.5f, 4.5f}}); + } + if (doprocessClosureTest) { + histos.add("hClosureQAPtTrigger", "hClosureQAPtTrigger", kTH2F, {axisPtQA, {5, -0.5f, 4.5f}}); + histos.add("hClosureQAPtAssociatedK0", "hClosureQAPtAssociatedK0", kTH2F, {axisPtQA, {5, -0.5f, 4.5f}}); + } + if (doprocessMCGenerated || doprocessClosureTest) { + histos.add("hClosureTestEventCounter", "hClosureTestEventCounter", kTH1F, {{10, 0, 10}}); + } + if (doprocessSameEventHV0s || doprocessSameEventHCascades || doprocessSameEventHPions || doprocessSameEventHHadrons) { + histos.add("hTriggerAllSelectedEtaVsPt", "hTriggerAllSelectedEtaVsPt", kTH3F, {axisPtQA, axisEta, axisMult}); + // QA and THn Histograms + histos.add("hTriggerPtResolution", ";p_{T}^{reconstructed} (GeV/c); p_{T}^{generated} (GeV/c)", kTH2F, {axisPtQA, axisPtQA}); + histos.add("hTriggerPrimaryEtaVsPt", "hTriggerPrimaryEtaVsPt", kTH3F, {axisPtQA, axisEta, axisMult}); + histos.add("hTrackEtaVsPtVsPhi", "hTrackEtaVsPtVsPhi", kTH3F, {axisPtQA, axisEta, axisPhi}); + histos.add("hAssocTrackEtaVsPtVsPhi", "hAssocTrackEtaVsPtVsPhi", kTH3F, {axisPtQA, axisEta, axisPhi}); + // histos.add("hTrackAttempt", "Attempt", kTH3F, {axisPtQA, axisEta, axisPhi}); + } + if (doprocessSameEventHPions || doprocessSameEventHHadrons || doprocessMixedEventHPions || doprocessMixedEventHHadrons) { + histos.add("hNumberOfRejectedPairsHadron", "hNumberOfRejectedPairsHadron", kTH1F, {{1, 0, 1}}); + histos.add("hNumberOfRejectedPairsPion", "hNumberOfRejectedPairsPion", kTH1F, {{1, 0, 1}}); + } + if (doprocessSameEventHV0s || doprocessMixedEventHV0s) { + histos.add("hNumberOfRejectedPairsV0", "hNumberOfRejectedPairsV0", kTH1F, {{1, 0, 1}}); + } + if (doprocessSameEventHCascades || doprocessMixedEventHCascades) { + histos.add("hNumberOfRejectedPairsCascades", "hNumberOfRejectedPairsCascades", kTH1F, {{1, 0, 1}}); + } + + if (doMixingQAandEventQA) { + // mixing QA + histos.add("MixingQA/hSECollisionBins", ";bin;Entries", kTH1F, {{140, -0.5, 139.5}}); + histos.add("MixingQA/hMECollisionBins", ";bin;Entries", kTH1F, {{140, -0.5, 139.5}}); + histos.add("MixingQA/hMEpvz1", ";pvz;Entries", kTH1F, {{30, -15, 15}}); + histos.add("MixingQA/hMEpvz2", ";pvz;Entries", kTH1F, {{30, -15, 15}}); + + // Event QA + histos.add("EventQA/hMixingQA", "mixing QA", kTH1F, {{2, -0.5, 1.5}}); + histos.add("EventQA/hMult", "Multiplicity", kTH1F, {axisMult}); + histos.add("EventQA/hPvz", ";pvz;Entries", kTH1F, {{30, -15, 15}}); + histos.add("EventQA/hMultFT0vsTPC", ";centFT0M;multNTracksPVeta1", kTH2F, {{100, 0, 100}, {300, 0, 300}}); + } bool hStrange = false; for (int i = 0; i < 9; i++) { @@ -1067,10 +1082,12 @@ struct HStrangeCorrelation { if (i < 7) { hStrange = true; histos.add(fmt::format("h{}EtaVsPtVsPhiBg", kParticlenames[i]).c_str(), "", kTH3F, {axisPtQA, axisEta, axisPhi}); - histos.add(fmt::format("hITSClusters{}NegativeDaughterToward", kParticlenames[i]).c_str(), "", kTH3F, {axisPtAssoc, {8, -0.5, 7.5}, {20, 0, 10}}); - histos.add(fmt::format("hITSClusters{}PositiveDaughterToward", kParticlenames[i]).c_str(), "", kTH3F, {axisPtAssoc, {8, -0.5, 7.5}, {20, 0, 10}}); - histos.add(fmt::format("hITSClusters{}NegativeDaughterTransverse", kParticlenames[i]).c_str(), "", kTH3F, {axisPtAssoc, {8, -0.5, 7.5}, {20, 0, 10}}); - histos.add(fmt::format("hITSClusters{}PositiveDaughterTransverse", kParticlenames[i]).c_str(), "", kTH3F, {axisPtAssoc, {8, -0.5, 7.5}, {20, 0, 10}}); + if (doITSClustersQA) { + histos.add(fmt::format("hITSClusters{}NegativeDaughterToward", kParticlenames[i]).c_str(), "", kTH3F, {axisPtAssoc, {8, -0.5, 7.5}, {20, 0, 10}}); + histos.add(fmt::format("hITSClusters{}PositiveDaughterToward", kParticlenames[i]).c_str(), "", kTH3F, {axisPtAssoc, {8, -0.5, 7.5}, {20, 0, 10}}); + histos.add(fmt::format("hITSClusters{}NegativeDaughterTransverse", kParticlenames[i]).c_str(), "", kTH3F, {axisPtAssoc, {8, -0.5, 7.5}, {20, 0, 10}}); + histos.add(fmt::format("hITSClusters{}PositiveDaughterTransverse", kParticlenames[i]).c_str(), "", kTH3F, {axisPtAssoc, {8, -0.5, 7.5}, {20, 0, 10}}); + } } } } @@ -1314,7 +1331,7 @@ struct HStrangeCorrelation { return; } // ________________________________________________ - if (!doprocessSameEventHCascades && !doprocessSameEventHV0s && !doprocessSameEventHPions) { + if (!doprocessSameEventHCascades && !doprocessSameEventHV0s && !doprocessSameEventHPions && doMixingQAandEventQA) { histos.fill(HIST("MixingQA/hSECollisionBins"), colBinning.getBin({collision.posZ(), collision.centFT0M()})); histos.fill(HIST("EventQA/hMult"), collision.centFT0M()); histos.fill(HIST("EventQA/hPvz"), collision.posZ()); @@ -1391,7 +1408,7 @@ struct HStrangeCorrelation { return; } // ________________________________________________ - if (!doprocessSameEventHCascades) { + if (!doprocessSameEventHCascades && doMixingQAandEventQA) { histos.fill(HIST("MixingQA/hSECollisionBins"), colBinning.getBin({collision.posZ(), cent})); histos.fill(HIST("EventQA/hMult"), cent); histos.fill(HIST("EventQA/hPvz"), collision.posZ()); @@ -1491,9 +1508,11 @@ struct HStrangeCorrelation { return; } // ________________________________________________ - histos.fill(HIST("MixingQA/hSECollisionBins"), colBinning.getBin({collision.posZ(), cent})); - histos.fill(HIST("EventQA/hMult"), cent); - histos.fill(HIST("EventQA/hPvz"), collision.posZ()); + if (doMixingQAandEventQA) { + histos.fill(HIST("MixingQA/hSECollisionBins"), colBinning.getBin({collision.posZ(), cent})); + histos.fill(HIST("EventQA/hMult"), cent); + histos.fill(HIST("EventQA/hPvz"), collision.posZ()); + } // Do basic QA if (applyEfficiencyCorrection) { auto bc = collision.bc_as(); @@ -1593,7 +1612,7 @@ struct HStrangeCorrelation { return; } // ________________________________________________ - if (!doprocessSameEventHCascades && !doprocessSameEventHV0s) { + if (!doprocessSameEventHCascades && !doprocessSameEventHV0s && doMixingQAandEventQA) { histos.fill(HIST("MixingQA/hSECollisionBins"), colBinning.getBin({collision.posZ(), collision.centFT0M()})); histos.fill(HIST("EventQA/hMult"), collision.centFT0M()); histos.fill(HIST("EventQA/hPvz"), collision.posZ()); @@ -1647,14 +1666,14 @@ struct HStrangeCorrelation { continue; if (collision2.centFT0M() > axisRanges[5][1] || collision2.centFT0M() < axisRanges[5][0]) continue; - - if (collision1.globalIndex() == collision2.globalIndex()) { - histos.fill(HIST("MixingQA/hMixingQA"), 0.0f); // same-collision pair counting + if (doMixingQAandEventQA) { + if (collision1.globalIndex() == collision2.globalIndex()) { + histos.fill(HIST("MixingQA/hMixingQA"), 0.0f); // same-collision pair counting + } + histos.fill(HIST("MixingQA/hMEpvz1"), collision1.posZ()); + histos.fill(HIST("MixingQA/hMEpvz2"), collision2.posZ()); + histos.fill(HIST("MixingQA/hMECollisionBins"), colBinning.getBin({collision1.posZ(), collision1.centFT0M()})); } - - histos.fill(HIST("MixingQA/hMEpvz1"), collision1.posZ()); - histos.fill(HIST("MixingQA/hMEpvz2"), collision2.posZ()); - histos.fill(HIST("MixingQA/hMECollisionBins"), colBinning.getBin({collision1.posZ(), collision1.centFT0M()})); // ________________________________________________ // Do slicing auto slicedTriggerTracks = triggerTracks.sliceBy(collisionSliceTracks, collision1.globalIndex()); @@ -1695,7 +1714,7 @@ struct HStrangeCorrelation { if (cent2 > axisRanges[5][1] || cent2 < axisRanges[5][0]) continue; - if (!doprocessMixedEventHCascades) { + if (!doprocessMixedEventHCascades && doMixingQAandEventQA) { if (collision1.globalIndex() == collision2.globalIndex()) { histos.fill(HIST("MixingQA/hMixingQA"), 0.0f); // same-collision pair counting } @@ -1741,14 +1760,14 @@ struct HStrangeCorrelation { continue; if (cent2 > axisRanges[5][1] || cent2 < axisRanges[5][0]) continue; - - if (collision1.globalIndex() == collision2.globalIndex()) { - histos.fill(HIST("MixingQA/hMixingQA"), 0.0f); // same-collision pair counting + if (doMixingQAandEventQA) { + if (collision1.globalIndex() == collision2.globalIndex()) { + histos.fill(HIST("MixingQA/hMixingQA"), 0.0f); // same-collision pair counting + } + histos.fill(HIST("MixingQA/hMEpvz1"), collision1.posZ()); + histos.fill(HIST("MixingQA/hMEpvz2"), collision2.posZ()); + histos.fill(HIST("MixingQA/hMECollisionBins"), colBinning.getBin({collision1.posZ(), cent1})); } - - histos.fill(HIST("MixingQA/hMEpvz1"), collision1.posZ()); - histos.fill(HIST("MixingQA/hMEpvz2"), collision2.posZ()); - histos.fill(HIST("MixingQA/hMECollisionBins"), colBinning.getBin({collision1.posZ(), cent1})); // ________________________________________________ // Do slicing auto slicedTriggerTracks = triggerTracks.sliceBy(collisionSliceTracks, collision1.globalIndex()); @@ -1783,14 +1802,14 @@ struct HStrangeCorrelation { continue; if (collision2.centFT0M() > axisRanges[5][1] || collision2.centFT0M() < axisRanges[5][0]) continue; - - if (collision1.globalIndex() == collision2.globalIndex()) { - histos.fill(HIST("MixingQA/hMixingQA"), 0.0f); // same-collision pair counting + if (doMixingQAandEventQA) { + if (collision1.globalIndex() == collision2.globalIndex()) { + histos.fill(HIST("MixingQA/hMixingQA"), 0.0f); // same-collision pair counting + } + histos.fill(HIST("MixingQA/hMEpvz1"), collision1.posZ()); + histos.fill(HIST("MixingQA/hMEpvz2"), collision2.posZ()); + histos.fill(HIST("MixingQA/hMECollisionBins"), colBinning.getBin({collision1.posZ(), collision1.centFT0M()})); } - - histos.fill(HIST("MixingQA/hMEpvz1"), collision1.posZ()); - histos.fill(HIST("MixingQA/hMEpvz2"), collision2.posZ()); - histos.fill(HIST("MixingQA/hMECollisionBins"), colBinning.getBin({collision1.posZ(), collision1.centFT0M()})); // ________________________________________________ // Do slicing auto slicedTriggerTracks = triggerTracks.sliceBy(collisionSliceTracks, collision1.globalIndex()); @@ -1825,7 +1844,7 @@ struct HStrangeCorrelation { } for (auto const& mcParticle : mcParticles) { - if (!mcParticle.isPhysicalPrimary()) + if (doAssocPhysicalPrimaryInGen && !mcParticle.isPhysicalPrimary()) continue; static_for<0, 7>([&](auto i) { constexpr int Index = i.value; @@ -1863,7 +1882,7 @@ struct HStrangeCorrelation { if (collisions.size() > 1) { for (auto const& mcParticle : mcParticles) { - if (!mcParticle.isPhysicalPrimary()) + if (doAssocPhysicalPrimaryInGen && !mcParticle.isPhysicalPrimary()) continue; if (std::abs(mcParticle.y()) > ySel) continue; @@ -1918,7 +1937,7 @@ struct HStrangeCorrelation { } for (auto const& mcParticle : mcParticles) { - if (!mcParticle.isPhysicalPrimary()) { + if (doAssocPhysicalPrimaryInGen && !mcParticle.isPhysicalPrimary()) { continue; } double geta = mcParticle.eta(); @@ -2168,37 +2187,46 @@ struct HStrangeCorrelation { int mcParticlePdg = v0mcParticle.pdgCode(); if (mcParticlePdg == PDG_t::kLambda0 && !v0mcParticle.isPhysicalPrimary()) { auto v0mothers = v0mcParticle.mothers_as(); - if (!v0mothers.empty()) { - auto& v0mcParticleMother = v0mothers.front(); // First mother - if (v0mcParticleMother.pdgCode() == PDG_t::kXiMinus) // Xi Minus Mother Matched - { - histos.fill(HIST("hLambdaXiMinusFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); - } - if (v0mcParticleMother.pdgCode() == o2::constants::physics::Pdg::kXi0) // Xi Zero Mother Matched - { - histos.fill(HIST("hLambdaXiZeroFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); - } - if (v0mcParticleMother.pdgCode() == PDG_t::kOmegaMinus) // Omega Mother Matched - { - histos.fill(HIST("hLambdaOmegaFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + if (v0mothers.size() == 1) { + for (const auto& v0mcParticleMother : v0mothers) { + // auto& v0mcParticleMother = v0mothers.front(); + if (std::abs(v0mcParticleMother.eta()) > etaSel) { + continue; + } + if (v0mcParticleMother.pdgCode() == PDG_t::kXiMinus) // Xi Minus Mother Matched + { + histos.fill(HIST("hLambdaXiMinusFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + } + if (v0mcParticleMother.pdgCode() == o2::constants::physics::Pdg::kXi0) // Xi Zero Mother Matched + { + histos.fill(HIST("hLambdaXiZeroFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + } + if (v0mcParticleMother.pdgCode() == PDG_t::kOmegaMinus) // Omega Mother Matched + { + histos.fill(HIST("hLambdaOmegaFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + } } } } if (mcParticlePdg == PDG_t::kLambda0Bar && !v0mcParticle.isPhysicalPrimary()) { auto v0mothers = v0mcParticle.mothers_as(); - if (!v0mothers.empty()) { - auto& v0mcParticleMother = v0mothers.front(); // First mother - if (v0mcParticleMother.pdgCode() == PDG_t::kXiPlusBar) // Xi Plus Mother Matched - { - histos.fill(HIST("hAntiLambdaXiPlusFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); - } - if (v0mcParticleMother.pdgCode() == -o2::constants::physics::Pdg::kXi0) // Anti Xi Zero Mother Matched - { - histos.fill(HIST("hAntiLambdaXiZeroFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); - } - if (v0mcParticleMother.pdgCode() == PDG_t::kOmegaPlusBar) // Omega Mother Matched - { - histos.fill(HIST("hAntiLambdaOmegaFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + if (v0mothers.size() == 1) { + for (const auto& v0mcParticleMother : v0mothers) { + if (std::abs(v0mcParticleMother.eta()) > etaSel) { + continue; + } + if (v0mcParticleMother.pdgCode() == PDG_t::kXiPlusBar) // Xi Plus Mother Matched + { + histos.fill(HIST("hAntiLambdaXiPlusFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + } + if (v0mcParticleMother.pdgCode() == -o2::constants::physics::Pdg::kXi0) // Anti Xi Zero Mother Matched + { + histos.fill(HIST("hAntiLambdaXiZeroFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + } + if (v0mcParticleMother.pdgCode() == PDG_t::kOmegaPlusBar) // Omega Mother Matched + { + histos.fill(HIST("hAntiLambdaOmegaFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + } } } } From d2006d930fde7b920e0f08d302706a123ce30dd5 Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Wed, 21 May 2025 19:30:05 +0800 Subject: [PATCH 1353/1650] [Trigger] Fix the Heavy Neutral Meson Filter description (#11275) --- EventFiltering/filterTables.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EventFiltering/filterTables.h b/EventFiltering/filterTables.h index b6994889446..1371d152e75 100644 --- a/EventFiltering/filterTables.h +++ b/EventFiltering/filterTables.h @@ -348,7 +348,7 @@ DECLARE_SOA_TABLE(PhotonFilters, "AOD", "PhotonFilters", //! using PhotonFilter = PhotonFilters::iterator; // heavy mesons -DECLARE_SOA_TABLE(HeavyNeutralMesonFilters, "AOD", "HeavyNeutralMesonFilters", //! +DECLARE_SOA_TABLE(HeavyNeutralMesonFilters, "AOD", "HNMesonFilters", //! filtering::OmegaP, filtering::OmegaPP, filtering::Omegad, filtering::EtaPrimeP, filtering::EtaPrimePP, filtering::EtaPrimed); From 03bb9e036d9a1525307555f7c6f454fe10d22a53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Wed, 21 May 2025 15:13:29 +0200 Subject: [PATCH 1354/1650] [PWGHF] align the table between reduced and not-reduced workflow for Lb (#11279) Co-authored-by: ALICE Action Bot --- PWGHF/D2H/DataModel/ReducedDataModel.h | 10 +-- .../candidateCreatorLbReduced.cxx | 4 +- .../candidateSelectorLbToLcPiReduced.cxx | 2 +- PWGHF/D2H/Tasks/taskLb.cxx | 80 ++++++++++++------- PWGHF/D2H/Tasks/taskLbReduced.cxx | 4 +- .../DataModel/CandidateReconstructionTables.h | 7 +- PWGHF/TableProducer/candidateCreatorLb.cxx | 22 ++--- .../candidateSelectorLbToLcPi.cxx | 8 -- 8 files changed, 74 insertions(+), 63 deletions(-) diff --git a/PWGHF/D2H/DataModel/ReducedDataModel.h b/PWGHF/D2H/DataModel/ReducedDataModel.h index c53be707ca6..79f5c804dde 100644 --- a/PWGHF/D2H/DataModel/ReducedDataModel.h +++ b/PWGHF/D2H/DataModel/ReducedDataModel.h @@ -506,15 +506,15 @@ using HfRedCandBs = soa::Join; namespace hf_cand_lb_reduced { -DECLARE_SOA_INDEX_COLUMN_FULL(Prong0Lc, prong0Lc, int, HfRed3Prongs, "_0"); //! Prong0 index -DECLARE_SOA_INDEX_COLUMN_FULL(Prong1Track, prong1Track, int, HfRedTrackBases, "_1"); //! Prong1 index +DECLARE_SOA_INDEX_COLUMN_FULL(Prong0, prong0, int, HfRed3Prongs, "_0"); //! Prong0 index +DECLARE_SOA_INDEX_COLUMN_FULL(Prong1, prong1, int, HfRedTrackBases, "_1"); //! Prong1 index DECLARE_SOA_COLUMN(Prong0MlScoreBkg, prong0MlScoreBkg, float); //! Bkg ML score of the Lc daughter DECLARE_SOA_COLUMN(Prong0MlScorePrompt, prong0MlScorePrompt, float); //! Prompt ML score of the Lc daughter DECLARE_SOA_COLUMN(Prong0MlScoreNonprompt, prong0MlScoreNonprompt, float); //! Nonprompt ML score of the Lc daughter } // namespace hf_cand_lb_reduced DECLARE_SOA_TABLE(HfRedLbProngs, "AOD", "HFREDLBPRONG", //! Table with Lb daughter indices - hf_cand_lb_reduced::Prong0LcId, hf_cand_lb_reduced::Prong1TrackId); + hf_cand_lb_reduced::Prong0Id, hf_cand_lb_reduced::Prong1Id); DECLARE_SOA_TABLE(HfRedLbLcMls, "AOD", "HFREDLBLCML", //! Table with ML scores for the Lc daughter hf_cand_lb_reduced::Prong0MlScoreBkg, @@ -796,8 +796,8 @@ DECLARE_SOA_COLUMN(PdgCodeProng3, pdgCodeProng3, int); //! Pdg code // table with results of reconstruction level MC matching DECLARE_SOA_TABLE(HfMcRecRedLcPis, "AOD", "HFMCRECREDLCPI", //! Table with reconstructed MC information on LcPi(<-Lb) pairs for reduced workflow - hf_cand_lb_reduced::Prong0LcId, - hf_cand_lb_reduced::Prong1TrackId, + hf_cand_lb_reduced::Prong0Id, + hf_cand_lb_reduced::Prong1Id, hf_cand_lb::FlagMcMatchRec, hf_cand_lb::FlagWrongCollision, hf_cand_lb::DebugMcRec, diff --git a/PWGHF/D2H/TableProducer/candidateCreatorLbReduced.cxx b/PWGHF/D2H/TableProducer/candidateCreatorLbReduced.cxx index 2c4917c1c94..9246748ab48 100644 --- a/PWGHF/D2H/TableProducer/candidateCreatorLbReduced.cxx +++ b/PWGHF/D2H/TableProducer/candidateCreatorLbReduced.cxx @@ -207,7 +207,7 @@ struct HfCandidateCreatorLbReduced { pVecLc[0], pVecLc[1], pVecLc[2], pVecPion[0], pVecPion[1], pVecPion[2], dcaLc.getY(), dcaPion.getY(), - std::sqrt(dcaLc.getSigmaY2()), std::sqrt(dcaPion.getSigmaY2()), candLc.globalIndex(), trackPion.globalIndex(), -999.); + std::sqrt(dcaLc.getSigmaY2()), std::sqrt(dcaPion.getSigmaY2())); rowCandidateProngs(candLc.globalIndex(), trackPion.globalIndex()); @@ -302,7 +302,7 @@ struct HfCandidateCreatorLbReducedExpressions { for (const auto& candLb : candsLb) { bool filledMcInfo{false}; for (const auto& rowLcPiMcRec : rowsLcPiMcRec) { - if ((rowLcPiMcRec.prong0LcId() != candLb.prong0LcId()) || (rowLcPiMcRec.prong1TrackId() != candLb.prong1TrackId())) { + if ((rowLcPiMcRec.prong0Id() != candLb.prong0Id()) || (rowLcPiMcRec.prong1Id() != candLb.prong1Id())) { continue; } rowLbMcRec(rowLcPiMcRec.flagMcMatchRec(), rowLcPiMcRec.flagWrongCollision(), rowLcPiMcRec.debugMcRec(), rowLcPiMcRec.ptMother()); diff --git a/PWGHF/D2H/TableProducer/candidateSelectorLbToLcPiReduced.cxx b/PWGHF/D2H/TableProducer/candidateSelectorLbToLcPiReduced.cxx index 11341a0266c..a4093a9340a 100644 --- a/PWGHF/D2H/TableProducer/candidateSelectorLbToLcPiReduced.cxx +++ b/PWGHF/D2H/TableProducer/candidateSelectorLbToLcPiReduced.cxx @@ -182,7 +182,7 @@ struct HfCandidateSelectorLbToLcPiReduced { } // track-level PID selection - auto trackPi = hfCandLb.template prong1Track_as(); + auto trackPi = hfCandLb.template prong1_as(); if (pionPidMethod == PidMethod::TpcOrTof || pionPidMethod == PidMethod::TpcAndTof) { int pidTrackPi{TrackSelectorPID::Status::NotApplicable}; if (pionPidMethod == PidMethod::TpcOrTof) { diff --git a/PWGHF/D2H/Tasks/taskLb.cxx b/PWGHF/D2H/Tasks/taskLb.cxx index a2c0723bd4f..e934a37b554 100644 --- a/PWGHF/D2H/Tasks/taskLb.cxx +++ b/PWGHF/D2H/Tasks/taskLb.cxx @@ -16,6 +16,8 @@ /// \author Martin Voelkl , University of Birmingham #include +#include +#include #include "CommonConstants/PhysicsConstants.h" #include "Framework/AnalysisTask.h" @@ -42,7 +44,7 @@ struct HfTaskLb { Configurable selectionFlagLb{"selectionFlagLb", 0, "Selection Flag for Lb"}; Configurable yCandGenMax{"yCandGenMax", 0.5, "max. gen particle rapidity"}; Configurable yCandRecoMax{"yCandRecoMax", 0.8, "max. cand. rapidity"}; - Configurable DCALengthParameter{"DCALengthParameter", 0.02, "decay length for DCA"}; + Configurable lengthDCAParameter{"lengthDCAParameter", 0.02, "decay length for DCA"}; Configurable minLikelihoodRatio{"minLikelihoodRatio", 10., "min. likelihood ratio for combined DCAs"}; Configurable minLikelihoodRatioLc{"minLikelihoodRatioLc", 10., "min. likelihood ratio for Lc cross check"}; Configurable mDiffKStar892Max{"mDiffKStar892Max", 0.0473, "Accepted range around KStar mass peak"}; @@ -57,12 +59,12 @@ struct HfTaskLb { HfHelper hfHelper; Service pdg; - Filter filterSelectCandidates = (aod::hf_sel_candidate_lb::isSelLbToLcPi >= selectionFlagLb); - using TracksWExt = soa::Join; using TracksWExtMc = soa::Join; - PresliceUnsorted McPartID = aod::mctracklabel::mcParticleId; + Filter filterSelectCandidates = (aod::hf_sel_candidate_lb::isSelLbToLcPi >= selectionFlagLb); + + PresliceUnsorted mcPartID = aod::mctracklabel::mcParticleId; bool passesImpactParameterResolution(float pT, float d0Resolution) { @@ -70,11 +72,11 @@ struct HfTaskLb { return (d0Resolution <= expectedResolution * 1.5); } // Compares to pT dependent cut on impact parameter resolution - float logLikelihoodRatioSingleTrackDCA(float DCA, float reso, float lengthParameter) + float logLikelihoodRatioSingleTrackDCA(float dca, float reso, float lengthParameter) { reso *= resoCorrectionFactor; // In case real resolution is worse - float numerator = 1. / lengthParameter * std::exp(-DCA / lengthParameter); - float denominator = (1. - largeLifetimeBG) * TMath::Gaus(DCA, 0., reso, true) + largeLifetimeBG / 0.2; // flat distribution to 2 mm + float numerator = 1. / lengthParameter * std::exp(-dca / lengthParameter); + float denominator = (1. - largeLifetimeBG) * TMath::Gaus(dca, 0., reso, true) + largeLifetimeBG / 0.2; // flat distribution to 2 mm return std::log(numerator / denominator); } // Creates the single track log likelihood assuming an exonential law for the secondaries @@ -172,6 +174,8 @@ struct HfTaskLb { { float massKStar892 = 0.892; float massDelta1232 = 1.232; + std::array dca = {0.f, 0.f, 0.f}; + std::array dcaResolution = {0.f, 0.f, 0.f}; for (const auto& candidateLc : candidatesLc) { if (!candidateLc.isSelLcToPKPi() && !candidateLc.isSelLcToPiKP()) @@ -194,12 +198,26 @@ struct HfTaskLb { continue; if (!passesImpactParameterResolution(track2.pt(), reso2)) continue; - float DCA0 = candidateLc.impactParameter0(); - float DCA1 = candidateLc.impactParameter1(); - float DCA2 = candidateLc.impactParameter2(); - if (DCA0 > maximumImpactParameterForLambdaCCrossChecks || DCA1 > maximumImpactParameterForLambdaCCrossChecks || DCA2 > maximumImpactParameterForLambdaCCrossChecks) + + dca = { + candidateLc.impactParameter0(), + candidateLc.impactParameter1(), + candidateLc.impactParameter2()}; + + bool exceedsMaxDca = std::any_of(dca.begin(), dca.end(), [&](float val) { + return val > maximumImpactParameterForLambdaCCrossChecks; + }); + + if (exceedsMaxDca) { continue; - float likelihoodRatio = logLikelihoodRatioSingleTrackDCA(DCA0, reso0, DCALengthParameter) + logLikelihoodRatioSingleTrackDCA(DCA1, reso1, DCALengthParameter) + logLikelihoodRatioSingleTrackDCA(DCA2, reso2, DCALengthParameter); + } + dcaResolution = {reso0, reso1, reso2}; + + float likelihoodRatio = 0.0f; + for (size_t i = 0; i < dca.size(); ++i) { + likelihoodRatio += logLikelihoodRatioSingleTrackDCA(dca[i], dcaResolution[i], lengthDCAParameter); + } + registry.get(HIST("hPtlogLikelihood"))->Fill(candidateLc.pt(), likelihoodRatio); if (likelihoodRatio < minLikelihoodRatioLc) continue; @@ -255,24 +273,31 @@ struct HfTaskLb { } // Lambda_c candidates loop for cross checks for (const auto& candidate : candidates) { - if (!(candidate.hfflag() & 1 << hf_cand_lb::DecayType::LbToLcPi)) { // This should never be true as the loop is over Lb candidates - continue; - } + if (yCandRecoMax >= 0. && std::abs(hfHelper.yLb(candidate)) > yCandRecoMax) { continue; } registry.get(HIST("hZVertex"))->Fill(collision.posZ()); auto candLc = candidate.prong0_as>(); - float d0resolution0 = candLc.errorImpactParameter0(); - float d0resolution1 = candLc.errorImpactParameter1(); - float d0resolution2 = candLc.errorImpactParameter2(); - float DCA0 = candLc.impactParameter0(); - float DCA1 = candLc.impactParameter1(); - float DCA2 = candLc.impactParameter2(); - float likelihoodRatio = logLikelihoodRatioSingleTrackDCA(DCA0, d0resolution0, DCALengthParameter) + logLikelihoodRatioSingleTrackDCA(DCA1, d0resolution1, DCALengthParameter) + logLikelihoodRatioSingleTrackDCA(DCA2, d0resolution2, DCALengthParameter); - if (likelihoodRatio < minLikelihoodRatio) + dca = { + candLc.impactParameter0(), + candLc.impactParameter1(), + candLc.impactParameter2()}; + + dcaResolution = { + candLc.errorImpactParameter0(), + candLc.errorImpactParameter1(), + candLc.errorImpactParameter2()}; + + float likelihoodRatio = 0.0f; + for (size_t i = 0; i < dca.size(); ++i) { + likelihoodRatio += logLikelihoodRatioSingleTrackDCA(dca[i], dcaResolution[i], lengthDCAParameter); + } + + if (likelihoodRatio < minLikelihoodRatio) { continue; // Larger likelihood means more likely to be signal + } float lbMass = hfHelper.invMassLbToLcPi(candidate); registry.get(HIST("hPtinvMassLb"))->Fill(candidate.pt(), lbMass); @@ -304,15 +329,14 @@ struct HfTaskLb { { // MC rec for (const auto& candidate : candidates) { - if (!(candidate.hfflag() & 1 << hf_cand_lb::DecayType::LbToLcPi)) { - continue; - } + if (yCandRecoMax >= 0. && std::abs(hfHelper.yLb(candidate)) > yCandRecoMax) { continue; } - auto candLc = candidate.prong0_as(); + auto candLc = candidate.prong0_as>(); + int flagMcMatchRecLb = std::abs(candidate.flagMcMatchRec()); - if (std::abs(candidate.flagMcMatchRec()) == 1 << hf_cand_lb::DecayType::LbToLcPi) { + if (TESTBIT(flagMcMatchRecLb, hf_cand_lb::DecayType::LbToLcPi)) { auto indexMother = RecoDecay::getMother(mcParticles, candidate.prong1_as().mcParticle_as>(), o2::constants::physics::Pdg::kLambdaB0, true); auto particleMother = mcParticles.rawIteratorAt(indexMother); diff --git a/PWGHF/D2H/Tasks/taskLbReduced.cxx b/PWGHF/D2H/Tasks/taskLbReduced.cxx index 12fec7cbbd8..6ca71f85a55 100644 --- a/PWGHF/D2H/Tasks/taskLbReduced.cxx +++ b/PWGHF/D2H/Tasks/taskLbReduced.cxx @@ -379,7 +379,7 @@ struct HfTaskLbReduced { { auto ptCandLb = candidate.pt(); auto invMassLb = hfHelper.invMassLbToLcPi(candidate); - auto candLc = candidate.template prong0Lc_as(); + auto candLc = candidate.template prong0_as(); auto ptLc = candidate.ptProng0(); auto invMassLc = candLc.invMassHypo0() > 0 ? candLc.invMassHypo0() : candLc.invMassHypo1(); // TODO: here we are assuming that only one of the two hypotheses is filled, to be checked @@ -538,7 +538,7 @@ struct HfTaskLbReduced { if constexpr (withLbMl) { candidateMlScoreSig = candidate.mlProbLbToLcPi(); } - auto prong1 = candidate.template prong1Track_as(); + auto prong1 = candidate.template prong1_as(); float ptMother = -1.; if constexpr (doMc) { diff --git a/PWGHF/DataModel/CandidateReconstructionTables.h b/PWGHF/DataModel/CandidateReconstructionTables.h index 71fdf92561b..41b5ccbf905 100644 --- a/PWGHF/DataModel/CandidateReconstructionTables.h +++ b/PWGHF/DataModel/CandidateReconstructionTables.h @@ -1931,8 +1931,6 @@ DECLARE_SOA_TABLE(HfCandLbBase, "AOD", "HFCANDLBBASE", hf_cand::PxProng1, hf_cand::PyProng1, hf_cand::PzProng1, hf_cand::ImpactParameter0, hf_cand::ImpactParameter1, hf_cand::ErrorImpactParameter0, hf_cand::ErrorImpactParameter1, - hf_cand_lb::Prong0Id, hf_track_index::Prong1Id, - hf_track_index::HFflag, /* dynamic columns */ hf_cand_2prong::M, hf_cand_2prong::M2, @@ -1958,7 +1956,10 @@ DECLARE_SOA_TABLE(HfCandLbBase, "AOD", "HFCANDLBBASE", DECLARE_SOA_EXTENDED_TABLE_USER(HfCandLbExt, HfCandLbBase, "HFCANDLBEXT", hf_cand_2prong::Px, hf_cand_2prong::Py, hf_cand_2prong::Pz); -using HfCandLb = HfCandLbExt; +DECLARE_SOA_TABLE(HfCandLbProngs, "AOD", "HFCANDLBPRONGS", + hf_cand_lb::Prong0Id, hf_track_index::Prong1Id); + +using HfCandLb = soa::Join; // table with results of reconstruction level MC matching DECLARE_SOA_TABLE(HfCandLbMcRec, "AOD", "HFCANDLBMCREC", //! diff --git a/PWGHF/TableProducer/candidateCreatorLb.cxx b/PWGHF/TableProducer/candidateCreatorLb.cxx index 44062fca4f5..49928fd70ad 100644 --- a/PWGHF/TableProducer/candidateCreatorLb.cxx +++ b/PWGHF/TableProducer/candidateCreatorLb.cxx @@ -43,7 +43,7 @@ using namespace o2::hf_trkcandsel; /// Reconstruction of Λb candidates struct HfCandidateCreatorLb { Produces rowCandidateBase; - + Produces rowCandidateProngs; // vertexing Configurable bz{"bz", 20., "magnetic field"}; Configurable propagateToPCA{"propagateToPCA", true, "create tracks version propagated to PCA"}; @@ -217,8 +217,6 @@ struct HfCandidateCreatorLb { auto errorDecayLength = std::sqrt(getRotatedCovMatrixXX(covMatrixPV, phi, theta) + getRotatedCovMatrixXX(covMatrixPCA, phi, theta)); auto errorDecayLengthXY = std::sqrt(getRotatedCovMatrixXX(covMatrixPV, phi, 0.) + getRotatedCovMatrixXX(covMatrixPCA, phi, 0.)); - int hfFlag = 1 << hf_cand_lb::DecayType::LbToLcPi; - // fill the candidate table for the Lb here: rowCandidateBase(collision.globalIndex(), collision.posX(), collision.posY(), collision.posZ(), @@ -228,10 +226,8 @@ struct HfCandidateCreatorLb { pvecLc[0], pvecLc[1], pvecLc[2], pvecPion[0], pvecPion[1], pvecPion[2], impactParameter0.getY(), impactParameter1.getY(), - std::sqrt(impactParameter0.getSigmaY2()), std::sqrt(impactParameter1.getSigmaY2()), - lcCand.globalIndex(), trackPion.globalIndex(), - hfFlag); - + std::sqrt(impactParameter0.getSigmaY2()), std::sqrt(impactParameter1.getSigmaY2())); + rowCandidateProngs(lcCand.globalIndex(), trackPion.globalIndex()); // calculate invariant mass auto arrayMomenta = std::array{pvecLc, pvecPion}; massLcPi = RecoDecay::m(std::move(arrayMomenta), std::array{massLc, massPi}); @@ -257,9 +253,10 @@ struct HfCandidateCreatorLbExpressions { /// @brief dummy process function, to be run on data void process(aod::Tracks const&) {} - void processMc(aod::HfCand3Prong const& lcCandidates, - aod::TracksWMc const& tracks, - aod::McParticles const& mcParticles) + void processMc(aod::HfCand3Prong const&, + aod::TracksWMc const&, + aod::McParticles const& mcParticles, + aod::HfCandLbProngs const& candsLb) { int indexRec = -1; int8_t sign = 0; @@ -267,11 +264,8 @@ struct HfCandidateCreatorLbExpressions { int8_t origin = 0; int8_t debug = 0; - rowCandidateLb->bindExternalIndices(&tracks); - rowCandidateLb->bindExternalIndices(&lcCandidates); - // Match reconstructed candidates. - for (const auto& candidate : *rowCandidateLb) { + for (const auto& candidate : candsLb) { flag = 0; origin = 0; debug = 0; diff --git a/PWGHF/TableProducer/candidateSelectorLbToLcPi.cxx b/PWGHF/TableProducer/candidateSelectorLbToLcPi.cxx index b1033c9555f..29ef2154d59 100644 --- a/PWGHF/TableProducer/candidateSelectorLbToLcPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorLbToLcPi.cxx @@ -164,14 +164,6 @@ struct HfCandidateSelectorLbToLcPi { for (const auto& hfCandLb : hfCandLbs) { // looping over Lb candidates int statusLb = 0; - - // check if flagged as Λb --> Λc+ π- - if (!(hfCandLb.hfflag() & 1 << hf_cand_lb::DecayType::LbToLcPi)) { - hfSelLbToLcPiCandidate(statusLb); - // LOGF(debug, "Lb candidate selection failed at hfflag check"); - continue; - } - // Lc is always index0 and pi is index1 by default // auto candLc = hfCandLb.prong0(); auto candLc = hfCandLb.prong0_as>(); From d3ce244864d1c0c81d516a50ab8f45bdeebd80a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Wed, 21 May 2025 15:49:16 +0200 Subject: [PATCH 1355/1650] [ALICE3] Move common track handling to header (#11276) --- ALICE3/Core/CMakeLists.txt | 7 +- ALICE3/Core/TrackUtilities.h | 107 +++++++++++++++++++ ALICE3/TableProducer/OTF/onTheFlyRichPid.cxx | 31 +----- ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx | 31 +----- ALICE3/TableProducer/OTF/onTheFlyTracker.cxx | 66 ++---------- 5 files changed, 123 insertions(+), 119 deletions(-) create mode 100644 ALICE3/Core/TrackUtilities.h diff --git a/ALICE3/Core/CMakeLists.txt b/ALICE3/Core/CMakeLists.txt index 788711ac277..a9fa83a37c6 100644 --- a/ALICE3/Core/CMakeLists.txt +++ b/ALICE3/Core/CMakeLists.txt @@ -12,16 +12,19 @@ o2physics_add_library(ALICE3Core SOURCES TOFResoALICE3.cxx DelphesO2TrackSmearer.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore) + PUBLIC_LINK_LIBRARIES O2::Framework + O2Physics::AnalysisCore) o2physics_target_root_dictionary(ALICE3Core HEADERS TOFResoALICE3.h + TrackUtilities.h DelphesO2TrackSmearer.h LINKDEF ALICE3CoreLinkDef.h) o2physics_add_library(FastTracker SOURCES FastTracker.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore) + PUBLIC_LINK_LIBRARIES O2::Framework + O2Physics::AnalysisCore) o2physics_target_root_dictionary(FastTracker HEADERS FastTracker.h diff --git a/ALICE3/Core/TrackUtilities.h b/ALICE3/Core/TrackUtilities.h new file mode 100644 index 00000000000..e4a1e159804 --- /dev/null +++ b/ALICE3/Core/TrackUtilities.h @@ -0,0 +1,107 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// +/// \file TrackUtilities.h +/// +/// \brief Set of utilities for the ALICE3 track handling +/// +/// \since May 21, 2025 +/// + +#ifndef ALICE3_CORE_TRACKUTILITIES_H_ +#define ALICE3_CORE_TRACKUTILITIES_H_ + +#include + +#include "ReconstructionDataFormats/Track.h" +#include "Framework/O2DatabasePDGPlugin.h" +#include "Framework/AnalysisHelpers.h" +#include "TLorentzVector.h" + +namespace o2::upgrade +{ + +/// Function to convert a TLorentzVector into a perfect Track +/// \param charge particle charge (integer) +/// \param particle the particle to convert (TLorentzVector) +/// \param productionVertex where the particle was produced +/// \param o2track the address of the resulting TrackParCov +void convertTLorentzVectorToO2Track(const int charge, + const TLorentzVector particle, + const std::vector productionVertex, + o2::track::TrackParCov& o2track) +{ + std::array params; + std::array covm = {0.}; + float s, c, x; + o2::math_utils::sincos(static_cast(particle.Phi()), s, c); + o2::math_utils::rotateZInv(static_cast(productionVertex[0]), static_cast(productionVertex[1]), x, params[0], s, c); + params[1] = static_cast(productionVertex[2]); + params[2] = 0.; // since alpha = phi + const auto theta = 2. * std::atan(std::exp(-particle.PseudoRapidity())); + params[3] = 1. / std::tan(theta); + params[4] = charge / particle.Pt(); + + // Initialize TrackParCov in-place + new (&o2track)(o2::track::TrackParCov)(x, particle.Phi(), params, covm); +} + +/// Function to convert a TLorentzVector into a perfect Track +/// \param pdgCode particle pdg +/// \param particle the particle to convert (TLorentzVector) +/// \param productionVertex where the particle was produced +/// \param o2track the address of the resulting TrackParCov +/// \param pdg the pdg service +void convertTLorentzVectorToO2Track(int pdgCode, + TLorentzVector particle, + std::vector productionVertex, + o2::track::TrackParCov& o2track, + const o2::framework::Service& pdg) +{ + const auto pdgInfo = pdg->GetParticle(pdgCode); + int charge = 0; + if (pdgInfo != nullptr) { + charge = pdgInfo->Charge() / 3; + } + convertTLorentzVectorToO2Track(charge, particle, productionVertex, o2track); +} + +/// Function to convert a McParticle into a perfect Track +/// \param particle the particle to convert (mcParticle) +/// \param o2track the address of the resulting TrackParCov +/// \param pdg the pdg service +template +void convertMCParticleToO2Track(McParticleType& particle, + o2::track::TrackParCov& o2track, + const o2::framework::Service& pdg) +{ + static TLorentzVector tlv; + tlv.SetPxPyPzE(particle.px(), particle.py(), particle.pz(), particle.e()); + tlv.SetXYZT(particle.vx(), particle.vy(), particle.vz(), particle.vt()); + convertTLorentzVectorToO2Track(particle.pdgCode(), tlv, {particle.vx(), particle.vy(), particle.vz()}, o2track, pdg); +} + +/// Function to convert a McParticle into a perfect Track +/// \param particle the particle to convert (mcParticle) +/// \param o2track the address of the resulting TrackParCov +/// \param pdg the pdg service +template +o2::track::TrackParCov convertMCParticleToO2Track(McParticleType& particle, + const o2::framework::Service& pdg) +{ + o2::track::TrackParCov o2track; + convertMCParticleToO2Track(particle, o2track, pdg); + return o2track; +} + +} // namespace o2::upgrade + +#endif // ALICE3_CORE_TRACKUTILITIES_H_ diff --git a/ALICE3/TableProducer/OTF/onTheFlyRichPid.cxx b/ALICE3/TableProducer/OTF/onTheFlyRichPid.cxx index 713b1ce1581..82816062390 100644 --- a/ALICE3/TableProducer/OTF/onTheFlyRichPid.cxx +++ b/ALICE3/TableProducer/OTF/onTheFlyRichPid.cxx @@ -47,6 +47,7 @@ #include "Framework/ASoAHelpers.h" #include "Common/DataModel/TrackSelectionTables.h" #include "Common/Core/trackUtilities.h" +#include "ALICE3/Core/TrackUtilities.h" #include "ReconstructionDataFormats/DCA.h" #include "DetectorsBase/Propagator.h" #include "DetectorsBase/GeometryManager.h" @@ -446,34 +447,6 @@ struct OnTheFlyRichPid { updateProjectiveParameters(); } - /// Function to convert a McParticle into a perfect Track - /// \param particle the particle to convert (mcParticle) - /// \param o2track the address of the resulting TrackParCov - template - o2::track::TrackParCov convertMCParticleToO2Track(McParticleType& particle) - { - // FIXME: this is a fundamentally important piece of code. - // It could be placed in a utility file instead of here. - auto pdgInfo = pdg->GetParticle(particle.pdgCode()); - int charge = 0; - if (pdgInfo != nullptr) { - charge = pdgInfo->Charge() / 3; - } - std::array params; - std::array covm = {0.}; - float s, c, x; - o2::math_utils::sincos(particle.phi(), s, c); - o2::math_utils::rotateZInv(particle.vx(), particle.vy(), x, params[0], s, c); - params[1] = particle.vz(); - params[2] = 0.; // since alpha = phi - auto theta = 2. * std::atan(std::exp(-particle.eta())); - params[3] = 1. / std::tan(theta); - params[4] = charge / particle.pt(); - - // Return TrackParCov - return o2::track::TrackParCov(x, particle.phi(), params, covm); - } - /// check if particle reaches radiator /// \param track the input track /// \param radius the radius of the layer you're calculating the length to @@ -778,7 +751,7 @@ struct OnTheFlyRichPid { continue; auto mcParticle = track.mcParticle(); - o2::track::TrackParCov o2track = convertMCParticleToO2Track(mcParticle); + o2::track::TrackParCov o2track = o2::upgrade::convertMCParticleToO2Track(mcParticle, pdg); // float xPv = error_value; if (o2track.propagateToDCA(mcPvVtx, dBz)) { diff --git a/ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx b/ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx index dfc90b4cf83..099e42ea1b7 100644 --- a/ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx +++ b/ALICE3/TableProducer/OTF/onTheFlyTofPid.cxx @@ -40,6 +40,7 @@ #include "Framework/ASoAHelpers.h" #include "Common/DataModel/TrackSelectionTables.h" #include "Common/Core/trackUtilities.h" +#include "ALICE3/Core/TrackUtilities.h" #include "ReconstructionDataFormats/DCA.h" #include "DetectorsBase/Propagator.h" #include "DetectorsBase/GeometryManager.h" @@ -252,34 +253,6 @@ struct OnTheFlyTofPid { } } - /// Function to convert a McParticle into a perfect Track - /// \param particle the particle to convert (mcParticle) - /// \param o2track the address of the resulting TrackParCov - template - o2::track::TrackParCov convertMCParticleToO2Track(McParticleType& particle) - { - // FIXME: this is a fundamentally important piece of code. - // It could be placed in a utility file instead of here. - auto pdgInfo = pdg->GetParticle(particle.pdgCode()); - int charge = 0; - if (pdgInfo != nullptr) { - charge = pdgInfo->Charge() / 3; - } - std::array params; - std::array covm = {0.}; - float s, c, x; - o2::math_utils::sincos(particle.phi(), s, c); - o2::math_utils::rotateZInv(particle.vx(), particle.vy(), x, params[0], s, c); - params[1] = particle.vz(); - params[2] = 0.; // since alpha = phi - auto theta = 2. * std::atan(std::exp(-particle.eta())); - params[3] = 1. / std::tan(theta); - params[4] = charge / particle.pt(); - - // Return TrackParCov - return o2::track::TrackParCov(x, particle.phi(), params, covm); - } - /// function to calculate track length of this track up to a certain radius /// \param track the input track /// \param radius the radius of the layer you're calculating the length to @@ -519,7 +492,7 @@ struct OnTheFlyTofPid { LOG(debug) << "Track without mcParticle found!"; } const auto& mcParticle = track.mcParticle(); - o2::track::TrackParCov o2track = convertMCParticleToO2Track(mcParticle); + o2::track::TrackParCov o2track = o2::upgrade::convertMCParticleToO2Track(mcParticle, pdg); float xPv = -100.f; static constexpr float kTrkXThreshold = -99.f; // Threshold to consider a good propagation of the track diff --git a/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx b/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx index 17d22988b71..4499613cd5f 100644 --- a/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx +++ b/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx @@ -61,6 +61,7 @@ #include "ALICE3/Core/DelphesO2TrackSmearer.h" #include "ALICE3/Core/FastTracker.h" #include "ALICE3/Core/DetLayer.h" +#include "ALICE3/Core/TrackUtilities.h" #include "ALICE3/DataModel/collisionAlice3.h" #include "ALICE3/DataModel/tracksAlice3.h" #include "ALICE3/DataModel/OTFStrangeness.h" @@ -275,7 +276,7 @@ struct OnTheFlyTracker { mapPdgLut.insert(std::make_pair(1000010030, lutTrChar)); mapPdgLut.insert(std::make_pair(1000020030, lutHe3Char)); } - for (auto e : mapPdgLut) { + for (const auto& e : mapPdgLut) { if (!mSmearer.loadTable(e.first, e.second)) { LOG(fatal) << "Having issue with loading the LUT " << e.first << " " << e.second; } @@ -493,59 +494,6 @@ struct OnTheFlyTracker { decayDaughters.push_back(*laDecay.GetDecay(1)); } - /// Function to convert a TLorentzVector into a perfect Track - /// \param pdgCode particle pdg - /// \param particle the particle to convert (TLorentzVector) - /// \param productionVertex where the particle was produced - /// \param o2track the address of the resulting TrackParCov - void convertTLorentzVectorToO2Track(int pdgCode, TLorentzVector particle, std::vector productionVertex, o2::track::TrackParCov& o2track) - { - auto pdgInfo = pdgDB->GetParticle(pdgCode); - int charge = 0; - if (pdgInfo != nullptr) { - charge = pdgInfo->Charge() / 3; - } - std::array params; - std::array covm = {0.}; - float s, c, x; - o2::math_utils::sincos(static_cast(particle.Phi()), s, c); - o2::math_utils::rotateZInv(static_cast(productionVertex[0]), static_cast(productionVertex[1]), x, params[0], s, c); - params[1] = static_cast(productionVertex[2]); - params[2] = 0; - auto theta = 2. * std::atan(std::exp(-particle.PseudoRapidity())); - params[3] = 1. / std::tan(theta); - params[4] = charge / particle.Pt(); - - // Initialize TrackParCov in-place - new (&o2track)(o2::track::TrackParCov)(x, particle.Phi(), params, covm); - } - - /// Function to convert a McParticle into a perfect Track - /// \param particle the particle to convert (mcParticle) - /// \param o2track the address of the resulting TrackParCov - template - void convertMCParticleToO2Track(McParticleType& particle, o2::track::TrackParCov& o2track) - { - auto pdgInfo = pdgDB->GetParticle(particle.pdgCode()); - int charge = 0; - if (pdgInfo != nullptr) { - charge = pdgInfo->Charge() / 3; - } - std::array params; - std::array covm = {0.}; - float s, c, x; - o2::math_utils::sincos(particle.phi(), s, c); - o2::math_utils::rotateZInv(particle.vx(), particle.vy(), x, params[0], s, c); - params[1] = particle.vz(); - params[2] = 0.; // since alpha = phi - auto theta = 2. * std::atan(std::exp(-particle.eta())); - params[3] = 1. / std::tan(theta); - params[4] = charge / particle.pt(); - - // Initialize TrackParCov in-place - new (&o2track)(o2::track::TrackParCov)(x, particle.phi(), params, covm); - } - float dNdEta = 0.f; // Charged particle multiplicity to use in the efficiency evaluation void process(aod::McCollision const& mcCollision, aod::McParticles const& mcParticles) { @@ -605,7 +553,7 @@ struct OnTheFlyTracker { if (cascadeDecaySettings.decayXi) { if (mcParticle.pdgCode() == 3312) { o2::track::TrackParCov xiTrackParCov; - convertMCParticleToO2Track(mcParticle, xiTrackParCov); + o2::upgrade::convertMCParticleToO2Track(mcParticle, xiTrackParCov, pdgDB); decayParticle(mcParticle, xiTrackParCov, decayProducts, xiDecayVertex, laDecayVertex); xiDecayRadius2D = sqrt(xiDecayVertex[0] * xiDecayVertex[0] + xiDecayVertex[1] * xiDecayVertex[1]); laDecayRadius2D = sqrt(laDecayVertex[0] * laDecayVertex[0] + laDecayVertex[1] * laDecayVertex[1]); @@ -653,7 +601,7 @@ struct OnTheFlyTracker { } o2::track::TrackParCov trackParCov; - convertMCParticleToO2Track(mcParticle, trackParCov); + o2::upgrade::convertMCParticleToO2Track(mcParticle, trackParCov, pdgDB); bool isDecayDaughter = false; if (mcParticle.getProcess() == 4) @@ -674,9 +622,9 @@ struct OnTheFlyTracker { continue; } - convertTLorentzVectorToO2Track(-211, decayProducts[0], xiDecayVertex, xiDaughterTrackParCovsPerfect[0]); - convertTLorentzVectorToO2Track(-211, decayProducts[1], laDecayVertex, xiDaughterTrackParCovsPerfect[1]); - convertTLorentzVectorToO2Track(2212, decayProducts[2], laDecayVertex, xiDaughterTrackParCovsPerfect[2]); + o2::upgrade::convertTLorentzVectorToO2Track(-211, decayProducts[0], xiDecayVertex, xiDaughterTrackParCovsPerfect[0], pdgDB); + o2::upgrade::convertTLorentzVectorToO2Track(-211, decayProducts[1], laDecayVertex, xiDaughterTrackParCovsPerfect[1], pdgDB); + o2::upgrade::convertTLorentzVectorToO2Track(2212, decayProducts[2], laDecayVertex, xiDaughterTrackParCovsPerfect[2], pdgDB); for (int i = 0; i < 3; i++) { isReco[i] = false; From 7bbec6d4e7ba2c57b548a43db140aa9806873cdc Mon Sep 17 00:00:00 2001 From: Kai Cui <129373281+kcui1@users.noreply.github.com> Date: Wed, 21 May 2025 23:24:23 +0800 Subject: [PATCH 1356/1650] [PWGLF] Add necessary hist to calculate efficiency for secondary lambda (#11282) --- .../Tasks/Strangeness/hStrangeCorrelation.cxx | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx index fb63f8b9c44..ab7c0d543bd 100644 --- a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx +++ b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx @@ -1131,6 +1131,10 @@ struct HStrangeCorrelation { histos.add(fmt::format("GeneratedWithPV/h{}_MidYVsMult", kParticlenames[i]).c_str(), "", kTH2F, {axisPtQA, axisMult}); histos.add(fmt::format("GeneratedWithPV/h{}_MidYVsMult_TwoPVsOrMore", kParticlenames[i]).c_str(), "", kTH2F, {axisPtQA, axisMult}); } + histos.add("GeneratedWithPV/hLambdaFromXiZero", "", kTH2F, {axisPtQA, axisEta}); + histos.add("GeneratedWithPV/hLambdaFromXiMinus", "", kTH2F, {axisPtQA, axisEta}); + histos.add("GeneratedWithPV/hAntiLambdaFromXiZero", "", kTH2F, {axisPtQA, axisEta}); + histos.add("GeneratedWithPV/hAntiLambdaFromXiPlus", "", kTH2F, {axisPtQA, axisEta}); } if (doprocessClosureTest) { for (int i = 0; i < 9; i++) { @@ -1148,6 +1152,10 @@ struct HStrangeCorrelation { histos.add("hAntiLambdaXiPlusFeeddownMatrix", "hAntiLambdaXiPlusFeeddownMatrix", kTH2F, {axisPtLambda, axisPtCascade}); histos.add("hAntiLambdaXiZeroFeeddownMatrix", "hAntiLambdaXiZeroFeeddownMatrix", kTH2F, {axisPtLambda, axisPtCascade}); histos.add("hAntiLambdaOmegaFeeddownMatrix", "hAntiLambdaOmegaFeeddownMatrix", kTH2F, {axisPtLambda, axisPtCascade}); + histos.add("hLambdaFromXiMinusEtaVsPtVsPhi", "hLambdaFromXiMinusEtaVsPtVsPhi", kTH3F, {axisPtQA, axisEta, axisPhi}); + histos.add("hLambdaFromXiZeroEtaVsPtVsPhi", "hLambdaFromXiZeroEtaVsPtVsPhi", kTH3F, {axisPtQA, axisEta, axisPhi}); + histos.add("hAntiLambdaFromXiPlusEtaVsPtVsPhi", "hAntiLambdaFromXiPlusEtaVsPtVsPhi", kTH3F, {axisPtQA, axisEta, axisPhi}); + histos.add("hAntiLambdaFromXiZeroEtaVsPtVsPhi", "hAntiLambdaFromXiZeroEtaVsPtVsPhi", kTH3F, {axisPtQA, axisEta, axisPhi}); } // visual inspection of sizes @@ -1944,6 +1952,47 @@ struct HStrangeCorrelation { double gpt = mcParticle.pt(); if (std::abs(mcParticle.pdgCode()) == PDG_t::kPiPlus || std::abs(mcParticle.pdgCode()) == PDG_t::kKPlus || std::abs(mcParticle.pdgCode()) == PDG_t::kProton || std::abs(mcParticle.pdgCode()) == PDG_t::kElectron || std::abs(mcParticle.pdgCode()) == PDG_t::kMuonMinus) histos.fill(HIST("GeneratedWithPV/hTrigger"), gpt, geta); + if (mcParticle.pdgCode() == PDG_t::kLambda0 && !doAssocPhysicalPrimaryInGen && !mcParticle.isPhysicalPrimary()) { + if (std::abs(geta) > etaSel) { + continue; + } + auto lamMothers = mcParticle.mothers_as(); + if (lamMothers.size() == 1) { + for (const auto& lamParticleMother : lamMothers) { + if (std::abs(lamParticleMother.eta()) > etaSel) { + continue; + } + if (lamParticleMother.pdgCode() == PDG_t::kXiMinus) // Xi Minus Mother Matched + { + histos.fill(HIST("GeneratedWithPV/hLambdaFromXiMinus"), gpt, geta); + } + if (lamParticleMother.pdgCode() == o2::constants::physics::Pdg::kXi0) // Xi Zero Mother Matched + { + histos.fill(HIST("GeneratedWithPV/hLambdaFromXiZero"), gpt, geta); + } + } + } + } + if (mcParticle.pdgCode() == PDG_t::kLambda0Bar && !doAssocPhysicalPrimaryInGen && !mcParticle.isPhysicalPrimary()) { + if (std::abs(geta) > etaSel) { + continue; + } + auto lamMothers = mcParticle.mothers_as(); + if (lamMothers.size() == 1) { + for (const auto& lamParticleMother : lamMothers) { + if (std::abs(lamParticleMother.eta()) > etaSel) { + continue; + } + if (lamParticleMother.pdgCode() == PDG_t::kXiPlusBar) { + histos.fill(HIST("GeneratedWithPV/hAntiLambdaFromXiPlus"), gpt, geta); + } + if (lamParticleMother.pdgCode() == -o2::constants::physics::Pdg::kXi0) // Xi Zero Mother Matched + { + histos.fill(HIST("GeneratedWithPV/hAntiLambdaFromXiZero"), gpt, geta); + } + } + } + } static_for<0, 7>([&](auto i) { constexpr int Index = i.value; if (i == 0 || i == 7) { @@ -2196,10 +2245,12 @@ struct HStrangeCorrelation { if (v0mcParticleMother.pdgCode() == PDG_t::kXiMinus) // Xi Minus Mother Matched { histos.fill(HIST("hLambdaXiMinusFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + histos.fill(HIST("hLambdaFromXiMinusEtaVsPtVsPhi"), v0mcParticle.pt(), v0mcParticle.eta(), v0mcParticle.phi()); } if (v0mcParticleMother.pdgCode() == o2::constants::physics::Pdg::kXi0) // Xi Zero Mother Matched { histos.fill(HIST("hLambdaXiZeroFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + histos.fill(HIST("hLambdaFromXiZeroEtaVsPtVsPhi"), v0mcParticle.pt(), v0mcParticle.eta(), v0mcParticle.phi()); } if (v0mcParticleMother.pdgCode() == PDG_t::kOmegaMinus) // Omega Mother Matched { @@ -2218,10 +2269,12 @@ struct HStrangeCorrelation { if (v0mcParticleMother.pdgCode() == PDG_t::kXiPlusBar) // Xi Plus Mother Matched { histos.fill(HIST("hAntiLambdaXiPlusFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + histos.fill(HIST("hAntiLambdaFromXiPlusEtaVsPtVsPhi"), v0mcParticle.pt(), v0mcParticle.eta(), v0mcParticle.phi()); } if (v0mcParticleMother.pdgCode() == -o2::constants::physics::Pdg::kXi0) // Anti Xi Zero Mother Matched { histos.fill(HIST("hAntiLambdaXiZeroFeeddownMatrix"), v0mcParticle.pt(), v0mcParticleMother.pt()); + histos.fill(HIST("hAntiLambdaFromXiZeroEtaVsPtVsPhi"), v0mcParticle.pt(), v0mcParticle.eta(), v0mcParticle.phi()); } if (v0mcParticleMother.pdgCode() == PDG_t::kOmegaPlusBar) // Omega Mother Matched { From 2be09270721415659b83c709c8b3a1abe86032e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Wed, 21 May 2025 19:15:12 +0200 Subject: [PATCH 1357/1650] [Infrastructure] MegaLinter: Configure cppcheck (#11280) --- .mega-linter.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.mega-linter.yml b/.mega-linter.yml index e45919ac05a..229198ab397 100644 --- a/.mega-linter.yml +++ b/.mega-linter.yml @@ -39,4 +39,5 @@ PYTHON_PYRIGHT_CONFIG_FILE: pyproject.toml PYTHON_RUFF_CONFIG_FILE: pyproject.toml CPP_CPPLINT_FILE_EXTENSIONS: [".C", ".c", ".c++", ".cc", ".cl", ".cpp", ".cu", ".cuh", ".cxx", ".cxx.in", ".h", ".h++", ".hh", ".h.in", ".hpp", ".hxx", ".inc", ".inl", ".macro"] CPP_CLANG_FORMAT_FILE_EXTENSIONS: [".C", ".c", ".c++", ".cc", ".cl", ".cpp", ".cu", ".cuh", ".cxx", ".cxx.in", ".h", ".h++", ".hh", ".h.in", ".hpp", ".hxx", ".inc", ".inl", ".macro"] +CPP_CPPCHECK_ARGUMENTS: --language=c++ --std=c++20 --check-level=exhaustive REPOSITORY_GITLEAKS_PR_COMMITS_SCAN: true From c1ea437bf85b087eb76443c687520e6e969234c5 Mon Sep 17 00:00:00 2001 From: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> Date: Wed, 21 May 2025 19:43:02 +0200 Subject: [PATCH 1358/1650] [PWGLF] Fix V0 deduplication in markV0sUsedInCascades (#11297) --- PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx index db45cb6e5c8..216595b766e 100644 --- a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx @@ -1256,8 +1256,13 @@ struct StrangenessBuilder { v0sFromCascades.clear(); v0Map.clear(); v0Map.resize(v0List.size(), -2); // marks not used + if (useV0BufferForCascades.value == false) { + return; // don't attempt to mark needlessly + } if (mEnabledTables[kStoredCascCores]) { for (const auto& cascade : cascadeList) { + if (cascade.v0Id < 0) + continue; if (v0Map[cascade.v0Id] == -2) { v0sUsedInCascades++; } From 1eee937d0dd73f18596253e81096a2605765d8c9 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Thu, 22 May 2025 03:28:13 +0900 Subject: [PATCH 1359/1650] [PWGEM/Dilepton] update treeCreatorElectronMLDDA.cxx (#11283) --- .../treeCreatorElectronMLDDA.cxx | 136 +++++++++--------- PWGEM/Dilepton/Tasks/taggingHFE.cxx | 2 +- 2 files changed, 73 insertions(+), 65 deletions(-) diff --git a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx index 6b39fd3f7b0..ab88e3a8091 100644 --- a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx +++ b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx @@ -53,7 +53,7 @@ using namespace o2::constants::physics; using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; -using MyTracks = soa::Join; using MyTrack = MyTracks::iterator; @@ -98,12 +98,6 @@ struct TreeCreatorElectronMLDDA { {"V0/hTOFbeta_P_Ka", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, {"V0/hTOFbeta_P_Pr", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, - {"V0/hITSClusterSize_P_El", "mean ITS cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, - {"V0/hITSClusterSize_P_Mu", "mean ITS cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, - {"V0/hITSClusterSize_P_Pi", "mean ITS cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, - {"V0/hITSClusterSize_P_Ka", "mean ITS cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, - {"V0/hITSClusterSize_P_Pr", "mean ITS cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, - // {"PrimaryTrack/hTPCdEdx_P", "TPC dEdx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, // {"PrimaryTrack/hTOFbeta_P", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, // {"PrimaryTrack/hITSClusterSize_P", "mean ITS cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, @@ -151,14 +145,17 @@ struct TreeCreatorElectronMLDDA { Configurable d_bz_input{"d_bz_input", -999, "bz field, -999 is automatic"}; Configurable useMatCorrType{"useMatCorrType", 0, "0: none, 1: TGeo, 2: LUT"}; - Configurable downscaling_track{"downscaling_track", 1e-4, "down scaling factor to store track"}; + Configurable downscaling_electron_primary{"downscaling_electron_primary", 1.1, "down scaling factor to store primary electron for validation"}; Configurable downscaling_electron{"downscaling_electron", 0.005, "down scaling factor to store electron"}; Configurable downscaling_pion{"downscaling_pion", 0.001, "down scaling factor to store pion"}; Configurable downscaling_kaon{"downscaling_kaon", 1.1, "down scaling factor to store kaon"}; - Configurable downscaling_proton{"downscaling_proton", 0.01, "down scaling factor to store proton"}; - Configurable store_v0photons{"store_v0photons", true, "create training data from v0 photons"}; - Configurable slope{"slope", 0.0185, "slope for m vs. phiv"}; - Configurable intercept{"intercept", -0.0380, "intercept for m vs. phiv"}; + Configurable downscaling_proton{"downscaling_proton", 0.005, "down scaling factor to store proton"}; + + Configurable max_pin_for_downscaling_electron_primary{"max_pin_for_downscaling_electron_primary", 0.0, "max pin to apply down scaling factor to store primary electron for validation"}; + Configurable max_pin_for_downscaling_electron{"max_pin_for_downscaling_electron", 2.0, "max pin to apply down scaling factor to store electron"}; + Configurable max_pin_for_downscaling_pion{"max_pin_for_downscaling_pion", 2.0, "max pin to apply down scaling factor to store pion"}; + Configurable max_pin_for_downscaling_kaon{"max_pin_for_downscaling_kaon", 0.0, "max pin to apply down scaling factor to store kaon"}; + Configurable max_pin_for_downscaling_proton{"max_pin_for_downscaling_proton", 2.0, "max pin to apply down scaling factor to store proton"}; struct : ConfigurableGroup { std::string prefix = "trackcut_group"; @@ -216,6 +213,11 @@ struct TreeCreatorElectronMLDDA { Configurable cfg_min_TOFNsigmaPr{"cfg_min_TOFNsigmaPr", -4, "min n sigma pr in TOF"}; Configurable cfg_max_TOFNsigmaPr{"cfg_max_TOFNsigmaPr", +4, "max n sigma pr in TOF"}; + Configurable cfg_min_TPCNsigmaEl_tight{"cfg_min_TPCNsigmaEl_tight", -2, "min n sigma e in TPC for pi0->eeg"}; + Configurable cfg_max_TPCNsigmaEl_tight{"cfg_max_TPCNsigmaEl_tight", +2, "max n sigma e in TPC for pi0->eeg"}; + Configurable cfg_min_TOFNsigmaEl_tight{"cfg_min_TOFNsigmaEl_tight", -2, "min n sigma e in TOF for pi0->eeg"}; + Configurable cfg_max_TOFNsigmaEl_tight{"cfg_max_TOFNsigmaEl_tight", +2, "max n sigma e in TOF for pi0->eeg"}; + Configurable cfg_min_TPCNsigmaPi_tight{"cfg_min_TPCNsigmaPi_tight", -2, "min n sigma pi in TPC for Lambda and cascade"}; Configurable cfg_max_TPCNsigmaPi_tight{"cfg_max_TPCNsigmaPi_tight", +2, "max n sigma pi in TPC for Lambda and cascade"}; Configurable cfg_min_TPCNsigmaPr_tight{"cfg_min_TPCNsigmaPr_tight", -2, "min n sigma pr in TPC for cascade"}; @@ -245,6 +247,14 @@ struct TreeCreatorElectronMLDDA { Configurable cfg_min_dcaxy_bachelor{"cfg_min_dcaxy_bachelor", 0.1, "min dca XY for bachelor in cm"}; } cascadecuts; + struct : ConfigurableGroup { + std::string prefix = "dalitzcut_group"; + Configurable cfg_min_mass_ee{"cfg_min_mass_ee", 0.000, "min mass for ee from pi0 dalitz decay in GeV/c2"}; + Configurable cfg_max_mass_ee{"cfg_max_mass_ee", 0.005, "max mass for ee from pi0 dalitz decay in GeV/c2"}; + Configurable cfg_min_phiv_ee{"cfg_min_phiv_ee", 0.0, "min phiv for ee from pi0 dalitz decay in rad."}; + Configurable cfg_max_phiv_ee{"cfg_max_phiv_ee", 2.0, "max phiv for ee from pi0 dalitz decay in rad."}; + } dalitzcuts; + int mRunNumber; float d_bz; Service ccdb; @@ -497,6 +507,14 @@ struct TreeCreatorElectronMLDDA { return is_Pr_TPC && is_Pr_TOF; } + template + bool isElectronTight(TTrack const& track) + { + bool is_El_TPC = v0cuts.cfg_min_TPCNsigmaEl_tight < track.tpcNSigmaEl() && track.tpcNSigmaEl() < v0cuts.cfg_max_TPCNsigmaEl_tight; + bool is_El_TOF = track.hasTOF() && (v0cuts.cfg_min_TOFNsigmaEl_tight < track.tofNSigmaEl() && track.tofNSigmaEl() < v0cuts.cfg_max_TOFNsigmaEl_tight); // TOFreq + return is_El_TPC && is_El_TOF; + } + template bool isPionTight(TTrack const& track) { @@ -576,6 +594,8 @@ struct TreeCreatorElectronMLDDA { continue; } + // LOGF(info, "v0.globalIndex() = %d, v0.collisionId() = %d, v0.posTrackId() = %d, v0.negTrackId() = %d", v0.globalIndex(), v0.collisionId(), v0.posTrackId(), v0.negTrackId()); + registry.fill(HIST("V0/hPCA"), v0.dcaV0daughters()); registry.fill(HIST("V0/hCosPA"), v0.v0cosPA()); registry.fill(HIST("V0/hAP"), v0.alpha(), v0.qtarm()); @@ -594,10 +614,10 @@ struct TreeCreatorElectronMLDDA { registry.fill(HIST("V0/hTOFbeta_P_Pi"), neg.p(), neg.beta()); registry.fill(HIST("V0/hTPCdEdx_P_Pi"), pos.p(), pos.tpcSignal()); registry.fill(HIST("V0/hTOFbeta_P_Pi"), pos.p(), pos.beta()); - if (dist01(engine) < downscaling_pion) { + if (dist01(engine) < downscaling_pion && pos.tpcInnerParam() < max_pin_for_downscaling_pion) { fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kPion), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } - if (dist01(engine) < downscaling_pion) { + if (dist01(engine) < downscaling_pion && neg.tpcInnerParam() < max_pin_for_downscaling_pion) { fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kPion), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } } @@ -605,7 +625,7 @@ struct TreeCreatorElectronMLDDA { if (isProton(pos) && isPionTight(neg)) { registry.fill(HIST("V0/hMassLambda"), v0.mLambda()); if (v0cuts.cfg_min_mass_lambda < v0.mLambda() && v0.mLambda() < v0cuts.cfg_max_mass_lambda) { - if (dist01(engine) < downscaling_proton) { + if (dist01(engine) < downscaling_proton && pos.tpcInnerParam() < max_pin_for_downscaling_proton) { fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kProton), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } registry.fill(HIST("V0/hTPCdEdx_P_Pr"), pos.p(), pos.tpcSignal()); @@ -615,22 +635,22 @@ struct TreeCreatorElectronMLDDA { if (isPionTight(pos) && isProton(neg)) { registry.fill(HIST("V0/hMassAntiLambda"), v0.mAntiLambda()); if (v0cuts.cfg_min_mass_lambda < v0.mAntiLambda() && v0.mAntiLambda() < v0cuts.cfg_max_mass_lambda) { - if (dist01(engine) < downscaling_proton) { + if (dist01(engine) < downscaling_proton && neg.tpcInnerParam() < max_pin_for_downscaling_proton) { fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kProton), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } registry.fill(HIST("V0/hTPCdEdx_P_Pr"), neg.p(), neg.tpcSignal()); registry.fill(HIST("V0/hTOFbeta_P_Pr"), neg.p(), neg.beta()); } } - if (isElectron(pos) && isElectron(neg) && store_v0photons) { - registry.fill(HIST("V0/hMassGamma"), v0.mGamma()); - registry.fill(HIST("V0/hXY_Gamma"), v0.x(), v0.y()); - registry.fill(HIST("V0/hMassGamma_Rxy"), v0.v0radius(), v0.mGamma()); + registry.fill(HIST("V0/hMassGamma"), v0.mGamma()); + registry.fill(HIST("V0/hXY_Gamma"), v0.x(), v0.y()); + registry.fill(HIST("V0/hMassGamma_Rxy"), v0.v0radius(), v0.mGamma()); + if (isElectron(pos) && isElectron(neg)) { if ((v0cuts.cfg_min_mass_photon < v0.mGamma() && v0.mGamma() < v0cuts.cfg_max_mass_photon)) { - if (dist01(engine) < downscaling_electron) { + if (dist01(engine) < downscaling_electron && pos.tpcInnerParam() < max_pin_for_downscaling_electron) { fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } - if (dist01(engine) < downscaling_electron) { + if (dist01(engine) < downscaling_electron && neg.tpcInnerParam() < max_pin_for_downscaling_electron) { fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } registry.fill(HIST("V0/hTPCdEdx_P_El"), neg.p(), neg.tpcSignal()); @@ -641,40 +661,6 @@ struct TreeCreatorElectronMLDDA { } } // end of v0 loop - if (!store_v0photons) { - auto posTracks_per_coll = posTracks->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); - auto negTracks_per_coll = negTracks->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); - for (const auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, negTracks_per_coll))) { - if (!isSelectedTrack(collision, pos) || !isSelectedTrack(collision, neg)) { - continue; - } - - if (!isElectron(pos) || !isElectron(neg)) { - continue; - } - - ROOT::Math::PtEtaPhiMVector v1(neg.pt(), neg.eta(), neg.phi(), o2::constants::physics::MassElectron); - ROOT::Math::PtEtaPhiMVector v2(pos.pt(), pos.eta(), pos.phi(), o2::constants::physics::MassElectron); - ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - float phiv = o2::aod::pwgem::dilepton::utils::pairutil::getPhivPair(pos.px(), pos.py(), pos.pz(), neg.px(), neg.py(), neg.pz(), pos.sign(), neg.sign(), d_bz); - registry.fill(HIST("hMvsPhiV"), phiv, v12.M()); - - if (v12.M() < slope * phiv + intercept) { // photon conversion is found. - registry.fill(HIST("V0/hTPCdEdx_P_El"), neg.p(), neg.tpcSignal()); - registry.fill(HIST("V0/hTOFbeta_P_El"), neg.p(), neg.beta()); - registry.fill(HIST("V0/hTPCdEdx_P_El"), pos.p(), pos.tpcSignal()); - registry.fill(HIST("V0/hTOFbeta_P_El"), pos.p(), pos.beta()); - - if (dist01(engine) < downscaling_electron) { - fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary), false); // secondary in primary electron candidates - } - if (dist01(engine) < downscaling_electron) { - fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary), false); // secondary in primary electron candidates - } - } - } // end of ULS pair loop - } - auto cascades_coll = cascades.sliceBy(perCollision_cascade, collision.globalIndex()); for (const auto& cascade : cascades_coll) { // Track casting @@ -755,23 +741,45 @@ struct TreeCreatorElectronMLDDA { if (cascadecuts.cfg_min_mass_Omega < cascade.mOmega() && cascade.mOmega() < cascadecuts.cfg_max_mass_Omega) { // select Omega candidates registry.fill(HIST("V0/hTPCdEdx_P_Ka"), bachelor.p(), bachelor.tpcSignal()); registry.fill(HIST("V0/hTOFbeta_P_Ka"), bachelor.p(), bachelor.beta()); - if (dist01(engine) < downscaling_kaon) { + if (dist01(engine) < downscaling_kaon && bachelor.tpcInnerParam() < max_pin_for_downscaling_kaon) { fillTrackTable(collision, bachelor, static_cast(o2::aod::pwgem::dilepton::PID_Label::kKaon), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary), false); } } } } // end of cascade loop - const auto& tracks_coll = tracks.sliceBy(perCollision_track, collision.globalIndex()); - for (const auto& track : tracks_coll) { - if (isSelectedTrack(collision, track) && (v0cuts.cfg_min_TPCNsigmaEl < track.tpcNSigmaEl() && track.tpcNSigmaEl() < v0cuts.cfg_max_TPCNsigmaEl)) { - if (dist01(engine) < downscaling_track) { - fillTrackTable(collision, track, static_cast(o2::aod::pwgem::dilepton::PID_Label::kUnDef), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary), true); - } + // for electron sample for validation + auto posTracks_per_coll = posTracks->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); + auto negTracks_per_coll = negTracks->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); + for (const auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, negTracks_per_coll))) { + if (!isSelectedTrack(collision, pos) || !isSelectedTrack(collision, neg)) { + continue; } - } // end of track loop + if (!isElectron(pos) || !isElectron(neg)) { + continue; + } + + ROOT::Math::PtEtaPhiMVector v1(neg.pt(), neg.eta(), neg.phi(), o2::constants::physics::MassElectron); + ROOT::Math::PtEtaPhiMVector v2(pos.pt(), pos.eta(), pos.phi(), o2::constants::physics::MassElectron); + ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; + float phiv = o2::aod::pwgem::dilepton::utils::pairutil::getPhivPair(pos.px(), pos.py(), pos.pz(), neg.px(), neg.py(), neg.pz(), pos.sign(), neg.sign(), d_bz); + registry.fill(HIST("hMvsPhiV"), phiv, v12.M()); + if ((dalitzcuts.cfg_min_mass_ee < v12.M() && v12.M() < dalitzcuts.cfg_max_mass_ee) && (dalitzcuts.cfg_min_phiv_ee < phiv && phiv < dalitzcuts.cfg_max_phiv_ee)) { // ee from pi0 dalitz decay is found. + if (isElectronTight(pos) && isElectron(neg)) { + if (dist01(engine) < downscaling_electron_primary && neg.tpcInnerParam() < max_pin_for_downscaling_electron_primary) { + fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary), true); // primary electron candidates + } + } + if (isElectron(pos) && isElectronTight(neg)) { + if (dist01(engine) < downscaling_electron_primary && pos.tpcInnerParam() < max_pin_for_downscaling_electron_primary) { + fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary), true); // primary electron candidates + } + } + } + } // end of ULS pair loop } // end of collision loop + stored_trackIds.clear(); stored_trackIds.shrink_to_fit(); } // end of process diff --git a/PWGEM/Dilepton/Tasks/taggingHFE.cxx b/PWGEM/Dilepton/Tasks/taggingHFE.cxx index 0b5cbf5e491..e876aa5e760 100644 --- a/PWGEM/Dilepton/Tasks/taggingHFE.cxx +++ b/PWGEM/Dilepton/Tasks/taggingHFE.cxx @@ -339,7 +339,7 @@ struct taggingHFE { fRegistry.addClone("Dpm/electron/", "Dpm/kaon/"); // D+ -> K- pi+ e+ nu, Br = 0.0402 | D+ -> anti-K*(892)0 e+ nu, Br = 0.0540 // D+ -> anti-K0S e+ nu, Br = 0.0872 fRegistry.addClone("Ds/electron/", "Ds/kaon/"); // Ds+ -> K0S e+ nu, Br = 0.0034 // Ds+ -> phi e+ nu, Br = 0.0239 - fRegistry.add("Generated/D0/prompt/hs", "#eta correlation from charm hadron;p_{T,e} (GeV/c);p_{T,K} (GeV/c);#eta_{e};#eta_{K};", kTHnSparseF, {{100, 0, 10}, {100, 0, 10}, {100, -5, +5}, {100, -5, 5}}, false); + fRegistry.add("Generated/D0/prompt/hs", "#eta correlation from charm hadron;p_{T,e} (GeV/c);p_{T,K} (GeV/c);#eta_{e};#eta_{K};", kTHnSparseF, {{100, 0, 10}, {100, 0, 10}, {200, -10, +10}, {200, -10, 10}}, false); fRegistry.addClone("Generated/D0/prompt/", "Generated/D0/nonprompt/"); } From ab0520075d939f100f8beb7c60f812921cc83080 Mon Sep 17 00:00:00 2001 From: omvazque Date: Wed, 21 May 2025 13:38:09 -0500 Subject: [PATCH 1360/1650] [PWGLF] Adds a ccdbNoLaterThan configurable (#11298) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index aab3cdbc46e..0aa0e4ff5a5 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -45,7 +45,6 @@ #include "ReconstructionDataFormats/GlobalTrackID.h" #include "ReconstructionDataFormats/Track.h" #include "TPDGCode.h" -#include "TF1.h" using namespace std; using namespace o2; @@ -123,6 +122,7 @@ struct UccZdc { Configurable paTH{"paTH", "Users/o/omvazque/TrackingEfficiency", "base path to the ccdb object"}; Configurable paTHmeanNch{"paTHmeanNch", "Users/o/omvazque/FitMeanNch_9May2025", "base path to the ccdb object"}; Configurable paTHsigmaNch{"paTHsigmaNch", "Users/o/omvazque/FitSigmaNch_9May2025", "base path to the ccdb object"}; + Configurable ccdbNoLaterThan{"ccdbNoLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; enum EvCutLabel { All = 1, @@ -278,6 +278,7 @@ struct UccZdc { registry.add("ZNDifVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA-ZNC;", kTH2F, {{{nBinsNch, minNch, maxNch}, {100, -50., 50.}}}); } + LOG(info) << "\tccdbNoLaterThan=" << ccdbNoLaterThan.value; LOG(info) << "\tapplyEff=" << applyEff.value; LOG(info) << "\tpaTH=" << paTH.value; LOG(info) << "\tuseMidRapNchSel=" << useMidRapNchSel.value; @@ -291,8 +292,7 @@ struct UccZdc { ccdb->setFatalWhenNull(false); // Not later than now, will be replaced by the value of the train creation // This avoids that users can replace objects **while** a train is running - int64_t now = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); - ccdb->setCreatedNotAfter(now); + ccdb->setCreatedNotAfter(ccdbNoLaterThan.value); } template From 37a63881d1aa21c5c19d9fe1317648cb17f2fcc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Wed, 21 May 2025 21:39:02 +0200 Subject: [PATCH 1361/1650] [ALICE3] Implement proto PID with tracking layers (#11278) --- ALICE3/DataModel/OTFPIDTrk.h | 90 +++++++++ ALICE3/TableProducer/OTF/CMakeLists.txt | 5 + .../TableProducer/OTF/onTheFlyTrackerPid.cxx | 175 ++++++++++++++++++ 3 files changed, 270 insertions(+) create mode 100644 ALICE3/DataModel/OTFPIDTrk.h create mode 100644 ALICE3/TableProducer/OTF/onTheFlyTrackerPid.cxx diff --git a/ALICE3/DataModel/OTFPIDTrk.h b/ALICE3/DataModel/OTFPIDTrk.h new file mode 100644 index 00000000000..b10923a892b --- /dev/null +++ b/ALICE3/DataModel/OTFPIDTrk.h @@ -0,0 +1,90 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// +/// \file OTFPIDTrk.h +/// \author Berkin Ulukutlu TUM +/// \author Henrik Fribert TUM +/// \author Nicolò Jacazio Università del Piemonte Orientale +/// \since May 22, 2025 +/// \brief Set of tables for the ALICE3 Trk PID information +/// + +#ifndef ALICE3_DATAMODEL_OTFPIDTRK_H_ +#define ALICE3_DATAMODEL_OTFPIDTRK_H_ + +// O2 includes +#include "Framework/AnalysisDataModel.h" + +namespace o2::aod +{ +namespace upgrade::trk +{ + +DECLARE_SOA_COLUMN(TimeOverThresholdBarrel, timeOverThresholdBarrel, float); //! Time over threshold for the barrel layers +DECLARE_SOA_COLUMN(ClusterSizeBarrel, clusterSizeBarrel, float); //! Cluster size for the barrel layers +DECLARE_SOA_COLUMN(TimeOverThresholdForward, timeOverThresholdForward, float); //! Time over threshold for the Forward layers +DECLARE_SOA_COLUMN(ClusterSizeForward, clusterSizeForward, float); //! Cluster size for the barrel layers + +DECLARE_SOA_COLUMN(NSigmaTrkEl, nSigmaEl, float); //! NSigma electron from the tracker layers +DECLARE_SOA_COLUMN(NSigmaTrkMu, nSigmaMu, float); //! NSigma muon from the tracker layers +DECLARE_SOA_COLUMN(NSigmaTrkPi, nSigmaPi, float); //! NSigma pion from the tracker layers +DECLARE_SOA_COLUMN(NSigmaTrkKa, nSigmaKa, float); //! NSigma kaon from the tracker layers +DECLARE_SOA_COLUMN(NSigmaTrkPr, nSigmaPr, float); //! NSigma proton from the tracker layers + +DECLARE_SOA_DYNAMIC_COLUMN(NSigmaTrk, nSigmaTrk, //! General function to get the nSigma for the tracker layers + [](const float el, + const float mu, + const float pi, + const float ka, + const float pr, + const int id) -> float { + switch (std::abs(id)) { + case 0: + return el; + case 1: + return mu; + case 2: + return pi; + case 3: + return ka; + case 4: + return pr; + default: + LOG(fatal) << "Unrecognized PDG code for InnerTOF"; + return 999.f; + } + }); + +} // namespace upgrade::trk + +DECLARE_SOA_TABLE(UpgradeTrkPidSignals, "AOD", "UPGRADETRKSIG", + upgrade::trk::TimeOverThresholdBarrel, + upgrade::trk::ClusterSizeBarrel); + +DECLARE_SOA_TABLE(UpgradeTrkPids, "AOD", "UPGRADETRKPID", + upgrade::trk::NSigmaTrkEl, + upgrade::trk::NSigmaTrkMu, + upgrade::trk::NSigmaTrkPi, + upgrade::trk::NSigmaTrkKa, + upgrade::trk::NSigmaTrkPr, + upgrade::trk::NSigmaTrk); + +using UpgradeTrkPidSignal = UpgradeTrkPidSignals::iterator; +using UpgradeTrkPid = UpgradeTrkPids::iterator; + +} // namespace o2::aod + +#endif // ALICE3_DATAMODEL_OTFPIDTRK_H_ diff --git a/ALICE3/TableProducer/OTF/CMakeLists.txt b/ALICE3/TableProducer/OTF/CMakeLists.txt index 10f68429680..a2cc6bd3d70 100644 --- a/ALICE3/TableProducer/OTF/CMakeLists.txt +++ b/ALICE3/TableProducer/OTF/CMakeLists.txt @@ -23,3 +23,8 @@ o2physics_add_dpl_workflow(onthefly-richpid SOURCES onTheFlyRichPid.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2::DetectorsBase O2Physics::AnalysisCore O2::ReconstructionDataFormats O2::DetectorsCommonDataFormats O2Physics::ALICE3Core COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(onthefly-trkpid + SOURCES onTheFlyTrackerPid.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2::DetectorsBase O2Physics::AnalysisCore O2::ReconstructionDataFormats O2::DetectorsCommonDataFormats O2Physics::ALICE3Core + COMPONENT_NAME Analysis) diff --git a/ALICE3/TableProducer/OTF/onTheFlyTrackerPid.cxx b/ALICE3/TableProducer/OTF/onTheFlyTrackerPid.cxx new file mode 100644 index 00000000000..42d2bcc5252 --- /dev/null +++ b/ALICE3/TableProducer/OTF/onTheFlyTrackerPid.cxx @@ -0,0 +1,175 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// +/// \file onTheFlyTrackerPid.cxx +/// +/// \brief This task produces the PID information that can be obtained from the tracker layers (i.e. cluster size and ToT). +/// It currently contemplates 5 particle types: electrons, muons, pions, kaons and protons. +/// +/// \author Berkin Ulukutlu TUM +/// \author Henrik Fribert TUM +/// \author Nicolò Jacazio Università del Piemonte Orientale +/// \since May 22, 2025 +/// + +#include +#include +#include +#include +#include + +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/runDataProcessing.h" +#include "Framework/RunningWorkflowInfo.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/O2DatabasePDGPlugin.h" +#include "Framework/ASoAHelpers.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/Core/trackUtilities.h" +#include "ALICE3/Core/TrackUtilities.h" +#include "ReconstructionDataFormats/DCA.h" +#include "DetectorsBase/Propagator.h" +#include "DetectorsBase/GeometryManager.h" +#include "CommonUtils/NameConf.h" +#include "CCDB/CcdbApi.h" +#include "CCDB/BasicCCDBManager.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "DataFormatsCalibration/MeanVertexObject.h" +#include "CommonConstants/GeomConstants.h" +#include "CommonConstants/PhysicsConstants.h" +#include "TRandom3.h" +#include "TF1.h" +#include "TH2F.h" +#include "TVector3.h" +#include "TString.h" +#include "ALICE3/DataModel/OTFRICH.h" +#include "DetectorsVertexing/HelixHelper.h" +#include "TableHelper.h" +#include "ALICE3/Core/DelphesO2TrackSmearer.h" +#include "ALICE3/DataModel/OTFPIDTrk.h" + +using namespace o2; +using namespace o2::framework; + +struct OnTheFlyTrackerPid { + Produces tableUpgradeTrkPidSignals; + Produces tableUpgradeTrkPids; + + // necessary for particle charges + Service pdg; + + static constexpr int kMaxBarrelLayers = 8; + static constexpr int kMaxForwardLayers = 9; + + struct : ConfigurableGroup { + Configurable efficiencyFormula{"efficiencyFormula", "1.0/(1.0+exp(-(x-0.01)/0.2))", "ROOT TF1 formula for efficiency"}; + Configurable landauFormula{"landauFormula", "TMath::Landau(x, 1, 1, true)", "ROOT TF1 formula for Landau distribution (e.g. ToT response)"}; + Configurable averageMethod{"averageMethod", 0, "Method to average the ToT and cluster size. 0: truncated mean"}; + } simConfig; + + TF1* mEfficiency = nullptr; + static constexpr int kEtaBins = 50; + static constexpr float kEtaMin = -2.5; + static constexpr float kEtaMax = 2.5; + static constexpr int kPtBins = 200; + static constexpr float kPtMin = 0.0; + static constexpr float kPtMax = 20.0; + + std::array, kEtaBins> mElossPi; + + void init(o2::framework::InitContext&) + { + + for (int i = 0; i < kEtaBins; i++) { + for (int j = 0; j < kPtBins; j++) { + mElossPi[i][j] = new TF1(Form("mElossPi_%d_%d", i, j), simConfig.landauFormula.value.c_str(), 0, 20); + } + } + mEfficiency = new TF1("mEfficiency", simConfig.efficiencyFormula.value.c_str(), 0, 20); + } + + void process(soa::Join::iterator const&, + soa::Join const& tracks, + aod::McParticles const&, + aod::McCollisions const&) + { + std::array timeOverThresholdBarrel; + std::array clusterSizeBarrel; + // std::array timeOverThresholdForward; + // std::array clusterSizeForward; + + auto noSignalTrack = [&]() { + tableUpgradeTrkPidSignals(0.f, 0.f); // no PID information + tableUpgradeTrkPids(0.f, 0.f, 0.f, 0.f, 0.f); // no PID information + }; + + for (const auto& track : tracks) { + if (!track.has_mcParticle()) { + noSignalTrack(); + continue; + } + const auto& mcParticle = track.mcParticle(); + const auto& pdgInfo = pdg->GetParticle(mcParticle.pdgCode()); + if (!pdgInfo) { + LOG(warning) << "PDG code " << mcParticle.pdgCode() << " not found in the database"; + noSignalTrack(); + continue; + } + const float pt = mcParticle.pt(); + const float eta = mcParticle.eta(); + + const int binnedPt = static_cast((pt - kPtMin) / kPtBins); + const int binnedEta = static_cast((eta - kEtaMin) / kEtaBins); + if (binnedPt < 0 || binnedPt >= kPtBins || binnedEta < 0 || binnedEta >= kEtaBins) { + noSignalTrack(); + continue; + } + for (int i = 0; i < kMaxBarrelLayers; i++) { + timeOverThresholdBarrel[i] = -1; + clusterSizeBarrel[i] = -1; + + // Check if layer is efficient + if (mEfficiency->Eval(pt) > gRandom->Uniform(0, 1)) { + timeOverThresholdBarrel[i] = mElossPi[binnedEta][binnedPt]->GetRandom(); // Simulate ToT + clusterSizeBarrel[i] = mElossPi[binnedEta][binnedPt]->GetRandom(); // Simulate cluster size + } + } + + // Now we do the average + switch (simConfig.averageMethod) { + case 0: { // truncated mean + float meanToT = 0; + float meanClusterSize = 0; + // Order them by ToT + std::sort(timeOverThresholdBarrel.begin(), timeOverThresholdBarrel.end()); + std::sort(clusterSizeBarrel.begin(), clusterSizeBarrel.end()); + static constexpr int kTruncatedMean = 5; + // Take the mean of the first 5 values + for (int i = 0; i < kTruncatedMean; i++) { + meanToT += timeOverThresholdBarrel[i]; + meanClusterSize += clusterSizeBarrel[i]; + } + meanToT /= kTruncatedMean; + meanClusterSize /= kTruncatedMean; + // Fill the table + tableUpgradeTrkPidSignals(meanToT, meanClusterSize); + } break; + + default: + LOG(fatal) << "Unknown average method " << simConfig.averageMethod; + break; + } + } + } +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From 54f86ee11abfe827996ee257ae11099031fb515a Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Thu, 22 May 2025 03:59:27 +0800 Subject: [PATCH 1362/1650] [PWGEM,Trigger] Do not skip any events in the output table of the HNMTriggers (#11287) --- EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx b/EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx index abfc9dec88f..6909d1561ee 100644 --- a/EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx +++ b/EventFiltering/PWGEM/HeavyNeutralMesonFilter.cxx @@ -453,16 +453,17 @@ struct HeavyNeutralMesonFilter { mHistManager.fill(HIST("Event/fZvtxBefore"), collision.posZ()); // Ensure evts are consistent with Sel8 and Vtx-z selection - if (!isSelectedEvent(collision)) + bool keepFemtoEvent[hnmtrigger::kNFemtoTriggers] = {false, false, false, false, false, false}; // Set based on number of found pairs (see above) - used to flag femto events + if (!isSelectedEvent(collision)) { + tags(keepFemtoEvent[hnmtrigger::kOmegaP], keepFemtoEvent[hnmtrigger::kPPOmega], keepFemtoEvent[hnmtrigger::kOmegaD], keepFemtoEvent[hnmtrigger::kEtaPrimeP], keepFemtoEvent[hnmtrigger::kPPEtaPrime], keepFemtoEvent[hnmtrigger::kEtaPrimeD]); return; - + } // QA accepted evts mHistManager.fill(HIST("Event/fMultiplicityAfter"), collision.multNTracksPV()); mHistManager.fill(HIST("Event/fZvtxAfter"), collision.posZ()); colContainsPCMOmega = colContainsEMCOmega = colContainsPCMEtaPrime = colContainsEMCEtaPrime = false; // Used by spectrum trigger to flag events with high-pT omega/eta' candidates int lowMomentumMultiplets[hnmtrigger::kNFemtoTriggers] = {0, 0, 0, 0, 0, 0}; // Number of found femto pairs/triplets for each femto trigger - bool keepFemtoEvent[hnmtrigger::kNFemtoTriggers] = {false, false, false, false, false, false}; // Set based on number of found pairs (see above) - used to flag femto events // clean vecs // HNM candidates From 7085b68dc5d0e0849ef5bd8b19972b302647f616 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Wed, 21 May 2025 22:22:36 +0200 Subject: [PATCH 1363/1650] [ALICE3] FastTracker update: streamline for LUT maker (#11285) --- ALICE3/Core/CMakeLists.txt | 2 ++ ALICE3/Core/DetLayer.cxx | 19 +++++++++++ ALICE3/Core/FastTracker.cxx | 65 ++++++++++++++++++++++--------------- ALICE3/Core/FastTracker.h | 24 +++++++++++++- 4 files changed, 82 insertions(+), 28 deletions(-) create mode 100644 ALICE3/Core/DetLayer.cxx diff --git a/ALICE3/Core/CMakeLists.txt b/ALICE3/Core/CMakeLists.txt index a9fa83a37c6..97718534a77 100644 --- a/ALICE3/Core/CMakeLists.txt +++ b/ALICE3/Core/CMakeLists.txt @@ -23,9 +23,11 @@ o2physics_target_root_dictionary(ALICE3Core o2physics_add_library(FastTracker SOURCES FastTracker.cxx + DetLayer.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore) o2physics_target_root_dictionary(FastTracker HEADERS FastTracker.h + DetLayer.h LINKDEF FastTrackerLinkDef.h) diff --git a/ALICE3/Core/DetLayer.cxx b/ALICE3/Core/DetLayer.cxx new file mode 100644 index 00000000000..392356b1e5a --- /dev/null +++ b/ALICE3/Core/DetLayer.cxx @@ -0,0 +1,19 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// +/// \file DetLayer.cxx +/// \author David Dobrigkeit Chinellato +/// \since 11/03/2021 +/// \brief Basic struct to hold information regarding a detector layer to be used in fast simulation +/// + +#include "DetLayer.h" diff --git a/ALICE3/Core/FastTracker.cxx b/ALICE3/Core/FastTracker.cxx index f41f5a8abf6..977d80ff547 100644 --- a/ALICE3/Core/FastTracker.cxx +++ b/ALICE3/Core/FastTracker.cxx @@ -60,7 +60,7 @@ void FastTracker::AddLayer(TString name, float r, float z, float x0, float xrho, layers.push_back(newLayer); } -DetLayer FastTracker::GetLayer(int layer, bool ignoreBarrelLayers) +DetLayer FastTracker::GetLayer(int layer, bool ignoreBarrelLayers) const { int layerIdx = layer; if (ignoreBarrelLayers) { @@ -74,6 +74,18 @@ DetLayer FastTracker::GetLayer(int layer, bool ignoreBarrelLayers) return layers[layerIdx]; } +int FastTracker::GetLayerIndex(std::string name) const +{ + int i = 0; + for (const auto& layer : layers) { + if (layer.name == name) { + return i; + } + i++; + } + return -1; +} + void FastTracker::Print() { // print out layer setup @@ -100,18 +112,18 @@ void FastTracker::AddSiliconALICE3v4(std::vector pixelResolution) float resRPhiOT = pixelResolution[2]; float resZOT = pixelResolution[3]; - layers.push_back(DetLayer{"bpipe0", 0.48, 250, 0.00042, 2.772e-02, 0.0f, 0.0f, 0.0f, 0}); // 150 mum Be - layers.push_back(DetLayer{"ddd0", 0.5, 250, x0IT, xrhoIB, resRPhiIT, resZIT, eff, 1}); - layers.push_back(DetLayer{"ddd1", 1.2, 250, x0IT, xrhoIB, resRPhiIT, resZIT, eff, 1}); - layers.push_back(DetLayer{"ddd2", 2.5, 250, x0IT, xrhoIB, resRPhiIT, resZIT, eff, 1}); - layers.push_back(DetLayer{"bpipe1", 5.7, 250, 0.0014, 9.24e-02, 0.0f, 0.0f, 0.0f, 0}); // 500 mum Be - layers.push_back(DetLayer{"ddd3", 7., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); - layers.push_back(DetLayer{"ddd4", 10., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); - layers.push_back(DetLayer{"ddd5", 13., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); - layers.push_back(DetLayer{"ddd6", 16., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); - layers.push_back(DetLayer{"ddd7", 25., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); - layers.push_back(DetLayer{"ddd8", 40., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); - layers.push_back(DetLayer{"ddd9", 45., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); + AddLayer("bpipe0", 0.48, 250, 0.00042, 2.772e-02, 0.0f, 0.0f, 0.0f, 0); // 150 mum Be + AddLayer("ddd0", 0.5, 250, x0IT, xrhoIB, resRPhiIT, resZIT, eff, 1); + AddLayer("ddd1", 1.2, 250, x0IT, xrhoIB, resRPhiIT, resZIT, eff, 1); + AddLayer("ddd2", 2.5, 250, x0IT, xrhoIB, resRPhiIT, resZIT, eff, 1); + AddLayer("bpipe1", 5.7, 250, 0.0014, 9.24e-02, 0.0f, 0.0f, 0.0f, 0); // 500 mum Be + AddLayer("ddd3", 7., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1); + AddLayer("ddd4", 10., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1); + AddLayer("ddd5", 13., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1); + AddLayer("ddd6", 16., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1); + AddLayer("ddd7", 25., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1); + AddLayer("ddd8", 40., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1); + AddLayer("ddd9", 45., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1); } void FastTracker::AddSiliconALICE3v2(std::vector pixelResolution) @@ -128,19 +140,19 @@ void FastTracker::AddSiliconALICE3v2(std::vector pixelResolution) float resRPhiOT = pixelResolution[2]; float resZOT = pixelResolution[3]; - layers.push_back(DetLayer{"bpipe0", 0.48, 250, 0.00042, 2.772e-02, 0.0f, 0.0f, 0.0f, 0}); // 150 mum Be - layers.push_back(DetLayer{"B00", 0.5, 250, x0IT, xrhoIB, resRPhiIT, resZIT, eff, 1}); - layers.push_back(DetLayer{"B01", 1.2, 250, x0IT, xrhoIB, resRPhiIT, resZIT, eff, 1}); - layers.push_back(DetLayer{"B02", 2.5, 250, x0IT, xrhoIB, resRPhiIT, resZIT, eff, 1}); - layers.push_back(DetLayer{"bpipe1", 3.7, 250, 0.0014, 9.24e-02, 0.0f, 0.0f, 0.0f, 0}); // 500 mum Be - layers.push_back(DetLayer{"B03", 3.75, 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); - layers.push_back(DetLayer{"B04", 7., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); - layers.push_back(DetLayer{"B05", 12., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); - layers.push_back(DetLayer{"B06", 20., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); - layers.push_back(DetLayer{"B07", 30., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); - layers.push_back(DetLayer{"B08", 45., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); - layers.push_back(DetLayer{"B09", 60., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); - layers.push_back(DetLayer{"B10", 80., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1}); + AddLayer("bpipe0", 0.48, 250, 0.00042, 2.772e-02, 0.0f, 0.0f, 0.0f, 0); // 150 mum Be + AddLayer("B00", 0.5, 250, x0IT, xrhoIB, resRPhiIT, resZIT, eff, 1); + AddLayer("B01", 1.2, 250, x0IT, xrhoIB, resRPhiIT, resZIT, eff, 1); + AddLayer("B02", 2.5, 250, x0IT, xrhoIB, resRPhiIT, resZIT, eff, 1); + AddLayer("bpipe1", 3.7, 250, 0.0014, 9.24e-02, 0.0f, 0.0f, 0.0f, 0); // 500 mum Be + AddLayer("B03", 3.75, 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1); + AddLayer("B04", 7., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1); + AddLayer("B05", 12., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1); + AddLayer("B06", 20., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1); + AddLayer("B07", 30., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1); + AddLayer("B08", 45., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1); + AddLayer("B09", 60., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1); + AddLayer("B10", 80., 250, x0OT, xrhoOT, resRPhiOT, resZOT, eff, 1); } void FastTracker::AddTPC(float phiResMean, float zResMean) @@ -333,7 +345,6 @@ int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackPa // was there a problem on this layer? if (!ok && il > 0) { // may fail to reach target layer due to the eloss float rad2 = inputTrack.getX() * inputTrack.getX() + inputTrack.getY() * inputTrack.getY(); - float fMinRadTrack = 132.; float maxR = layers[il - 1].r + kTrackingMargin * 2; float minRad = (fMinRadTrack > 0 && fMinRadTrack < maxR) ? fMinRadTrack : maxR; if (rad2 - minRad * minRad < kTrackingMargin * kTrackingMargin) { // check previously reached layer diff --git a/ALICE3/Core/FastTracker.h b/ALICE3/Core/FastTracker.h index 8508182fbf0..aad0c7d51b3 100644 --- a/ALICE3/Core/FastTracker.h +++ b/ALICE3/Core/FastTracker.h @@ -35,7 +35,8 @@ class FastTracker virtual ~FastTracker() {} void AddLayer(TString name, float r, float z, float x0, float xrho, float resRPhi = 0.0f, float resZ = 0.0f, float eff = 0.0f, int type = 0); - DetLayer GetLayer(const int layer, bool ignoreBarrelLayers = true); + DetLayer GetLayer(const int layer, bool ignoreBarrelLayers = true) const; + int GetLayerIndex(const std::string name) const; void AddSiliconALICE3v4(std::vector pixelResolution); void AddSiliconALICE3v2(std::vector pixelResolution); @@ -55,6 +56,15 @@ class FastTracker // Definition of detector layers std::vector layers; std::vector> hits; // bookkeep last added hits + void SetRadiationLength(const std::string layerName, float x0) { layers[GetLayerIndex(layerName)].x0 = x0; } + void SetRadius(const std::string layerName, float r) { layers[GetLayerIndex(layerName)].r = r; } + void SetResolutionRPhi(const std::string layerName, float resRPhi) { layers[GetLayerIndex(layerName)].resRPhi = resRPhi; } + void SetResolutionZ(const std::string layerName, float resZ) { layers[GetLayerIndex(layerName)].resZ = resZ; } + void SetResolution(const std::string layerName, float resRPhi, float resZ) + { + SetResolutionRPhi(layerName, resRPhi); + SetResolutionZ(layerName, resZ); + } // operational bool applyZacceptance; // check z acceptance or not @@ -75,6 +85,17 @@ class FastTracker float avgRapidity; float lhcUPCScale; float upcBackgroundMultiplier; + float fMinRadTrack = 132.; + + // Setters and getters + void SetIntegrationTime(float t) { integrationTime = t; } + void SetMaxRadiusOfSlowDetectors(float r) { maxRadiusSlowDet = r; } + void SetAvgRapidity(float y) { avgRapidity = y; } + void SetdNdEtaCent(float d) { dNdEtaCent = d; } + void SetLhcUPCscale(float s) { lhcUPCScale = s; } + void SetBField(float b) { magneticField = b; } + void SetMinRadTrack(float r) { fMinRadTrack = r; } + // void SetAtLeastHits(int n) { fMinRadTrack = n; } uint64_t covMatOK; // cov mat has negative eigenvals uint64_t covMatNotOK; // cov mat has negative eigenvals @@ -84,6 +105,7 @@ class FastTracker int nSiliconPoints; // silicon-based space points added to track int nGasPoints; // tpc-based space points added to track std::vector goodHitProbability; + float GetGoodHitProb(int layer) const { return goodHitProbability[layer]; } ClassDef(FastTracker, 1); }; From 25af186694b30ba040865ee2e70bd199ef78c275 Mon Sep 17 00:00:00 2001 From: Stefano Cannito <143754257+scannito@users.noreply.github.com> Date: Wed, 21 May 2025 23:05:19 +0200 Subject: [PATCH 1364/1650] [PWGLF] Added ITS-standalone tracks in dNdEta study with phi (#11291) --- PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx index 2bd9467879b..9dd9ea186c3 100644 --- a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx @@ -58,6 +58,7 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; +using namespace o2::aod::track; struct Phik0shortanalysis { // Histograms are defined with HistogramRegistry @@ -186,6 +187,11 @@ struct Phik0shortanalysis { double massK0S = o2::constants::physics::MassK0Short; double massLambda = o2::constants::physics::MassLambda0; + // Defining track flags + static constexpr TrackSelectionFlags::flagtype TrackSelectionITS = TrackSelectionFlags::kITSNCls | TrackSelectionFlags::kITSChi2NDF | TrackSelectionFlags::kITSHits; + static constexpr TrackSelectionFlags::flagtype TrackSelectionTPC = TrackSelectionFlags::kTPCNCls | TrackSelectionFlags::kTPCCrossedRowsOverNCls | TrackSelectionFlags::kTPCChi2NDF; + static constexpr TrackSelectionFlags::flagtype TrackSelectionDCA = TrackSelectionFlags::kDCAz | TrackSelectionFlags::kDCAxy; + // Defining filters for events (event selection) // Processed events will be already fulfilling the event selection requirements Filter eventFilter = (o2::aod::evsel::sel8 == true); @@ -194,8 +200,12 @@ struct Phik0shortanalysis { // Defining filters on V0s (cannot filter on dynamic columns) Filter preFilterV0 = (nabs(aod::v0data::dcapostopv) > v0Configs.v0SettingDCAPosToPV && nabs(aod::v0data::dcanegtopv) > v0Configs.v0SettingDCANegToPV && aod::v0data::dcaV0daughters < v0Configs.v0SettingDCAV0Dau); - // Defining filters on tracks (cannot filter on dynamic columns) - Filter trackFilter = requireGlobalTrackWoDCAInFilter(); + // Defining filters on tracks + Filter trackFilter = ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::ITS) && + ncheckbit(aod::track::trackCutFlag, TrackSelectionITS) && + ifnode(ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::TPC), ncheckbit(aod::track::trackCutFlag, TrackSelectionTPC), true) && + ncheckbit(aod::track::trackCutFlag, TrackSelectionDCA) && + ncheckbit(aod::track::trackCutFlag, TrackSelectionFlags::kInAcceptanceTracks); // Defining the type of the collisions for data and MC using SelCollisions = soa::Join; @@ -2278,6 +2288,7 @@ struct Phik0shortanalysis { return; float multiplicity = collision.centFT0M(); + dataEventHist.fill(HIST("hMultiplicityPercent"), multiplicity); for (const auto& track : filteredTracks) dataEventHist.fill(HIST("h2EtaDistribution"), multiplicity, track.eta()); @@ -2300,6 +2311,7 @@ struct Phik0shortanalysis { continue; float genmultiplicity = mcCollision.centFT0M(); + mcEventHist.fill(HIST("hRecMCGenMultiplicityPercent"), genmultiplicity); auto mcTracksThisColl = filteredMCTracks.sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); @@ -2336,6 +2348,7 @@ struct Phik0shortanalysis { } float genmultiplicity = mcCollision.centFT0M(); + mcEventHist.fill(HIST("hGenMCMultiplicityPercent"), genmultiplicity); for (const auto& mcParticle : mcParticles) { if (!mcParticle.isPhysicalPrimary() || std::abs(mcParticle.eta()) > trackConfigs.etaMax) From 1bc95c3968147e78bc0298be7432dd2cc8342429 Mon Sep 17 00:00:00 2001 From: Anantha Padmanabhan M Nair <82643666+ananthapadmanabhan18@users.noreply.github.com> Date: Thu, 22 May 2025 02:59:05 +0530 Subject: [PATCH 1365/1650] [PWGUD] Added occupancy cut (#11292) --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index 4a72438bcf1..238ecac1245 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -512,6 +512,7 @@ struct ExclusiveRhoTo4Pi { Configurable ft0aCut{"ft0aCut", 150., "FT0A threshold"}; Configurable ft0cCut{"ft0cCut", 50., "FT0C threshold"}; Configurable zdcCut{"zdcCut", 1., "ZDC threshold"}; + Configurable occupancyCut{"occupancyCut", 1000, "Occupancy Cut"}; Configurable pvCut{"pvCut", 1.0, "Use Only PV tracks"}; Configurable numPVContrib{"numPVContrib", 4, "Number of PV Contributors"}; @@ -545,8 +546,8 @@ struct ExclusiveRhoTo4Pi { histosData.add("GapSide", "Gap Side; Events", kTH1F, {{4, -1.5, 2.5}}); histosData.add("TrueGapSide", "Gap Side; Events", kTH1F, {{4, -1.5, 2.5}}); histosData.add("EventCounts", "Total Events; Events", kTH1F, {{10, 0, 10}}); - histosData.add("vertexZ", "Vertex Z; Vertex Z [cm]; Counts", kTH1F, {{1000, -20, 20}}); + histosData.add("occupancy", "Occupancy; Occupancy; Counts", kTH1F, {{1500, 0, 1500}}); histosData.add("dcaXY", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{10000, -5, 5}}); histosData.add("dcaZ", "dcaZ; dcaZ [cm]; Counts", kTH1F, {{10000, -10, 10}}); histosData.add("tpcChi2NCl", "TPC Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{200, 0, 200}}); @@ -676,6 +677,7 @@ struct ExclusiveRhoTo4Pi { // MC Reco Stuff histosMCreco.add("vertexZ", "Vertex Z; Vertex Z [cm]; Counts", kTH1F, {{1000, -20, 20}}); + histosMCreco.add("occupancy", "Occupancy; Occupancy; Counts", kTH1F, {{1500, 0, 1500}}); histosMCreco.add("dcaXY", "dcaXY; dcaXY [cm]; Counts", kTH1F, {{10000, -5, 5}}); histosMCreco.add("dcaZ", "dcaZ; dcaZ [cm]; Counts", kTH1F, {{10000, -10, 10}}); histosMCreco.add("tpcChi2NCl", "TPC Chi2/NCl; Chi2/NCl; Counts", kTH1F, {{200, 0, 200}}); @@ -835,8 +837,9 @@ struct ExclusiveRhoTo4Pi { Filter vertexCut = (nabs(o2::aod::collision::posZ) <= vZCut) && (o2::aod::collision::numContrib == numPVContrib); Filter fitcuts = o2::aod::udcollision::totalFV0AmplitudeA < fv0Cut && o2::aod::udcollision::totalFT0AmplitudeA < ft0aCut && o2::aod::udcollision::totalFT0AmplitudeC < ft0cCut; Filter zdcCuts = (o2::aod::udzdc::energyCommonZNA < zdcCut) && (o2::aod::udzdc::energyCommonZNC < zdcCut); + Filter occupCut = nabs(o2::aod::udcollision::occupancyInTime) < occupancyCut; using UDtracks = soa::Join; - using UDCollisions = soa::Filtered>; // + using UDCollisions = soa::Filtered>; // using UDCollision = UDCollisions::iterator; //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -851,6 +854,7 @@ struct ExclusiveRhoTo4Pi { histosData.fill(HIST("TrueGapSide"), truegapSide); histosData.fill(HIST("EventCounts"), 1); histosData.fill(HIST("vertexZ"), collision.posZ()); + histosData.fill(HIST("occupancy"), collision.occupancyInTime()); histosData.fill(HIST("V0A"), collision.totalFV0AmplitudeA()); histosData.fill(HIST("FT0A"), collision.totalFT0AmplitudeA()); histosData.fill(HIST("FT0C"), collision.totalFT0AmplitudeC()); @@ -1170,7 +1174,7 @@ struct ExclusiveRhoTo4Pi { PROCESS_SWITCH(ExclusiveRhoTo4Pi, processMCgen, "The Process for 4 Pion Analysis from MC Generation", false); // Begin of MC Reconstruction function----------------------------------------------------------------------------------------------------------------------------------------------- - using CollisionStuff = soa::Filtered>; + using CollisionStuff = soa::Filtered>; using CollisionTotal = CollisionStuff::iterator; using TrackStuff = soa::Join; @@ -1188,6 +1192,7 @@ struct ExclusiveRhoTo4Pi { histosMCreco.fill(HIST("TrueGapSide"), truegapSide); histosMCreco.fill(HIST("EventCounts"), 1); histosMCreco.fill(HIST("vertexZ"), collision.posZ()); + histosMCreco.fill(HIST("occupancy"), collision.occupancyInTime()); histosMCreco.fill(HIST("V0A"), collision.totalFV0AmplitudeA()); histosMCreco.fill(HIST("FT0A"), collision.totalFT0AmplitudeA()); histosMCreco.fill(HIST("FT0C"), collision.totalFT0AmplitudeC()); From eb24fbdabd6f48c212831b77cfeff6df4f12f67d Mon Sep 17 00:00:00 2001 From: dajones2 <140733426+dajones2@users.noreply.github.com> Date: Wed, 21 May 2025 23:58:56 +0100 Subject: [PATCH 1366/1650] [PWGJE] Adding inclusive jet 3D histograms (#11293) --- PWGJE/Tasks/jetHadronRecoil.cxx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/PWGJE/Tasks/jetHadronRecoil.cxx b/PWGJE/Tasks/jetHadronRecoil.cxx index 4d3b3a0773c..3d0e6f1bb59 100644 --- a/PWGJE/Tasks/jetHadronRecoil.cxx +++ b/PWGJE/Tasks/jetHadronRecoil.cxx @@ -135,6 +135,7 @@ struct JetHadronRecoil { {"hJetPt", "jet p_{T};p_{T,jet};entries", {HistType::kTH1F, {{500, -100, 400}}}}, {"hJetEta", "jet #eta;#eta_{jet};entries", {HistType::kTH1F, {{100, -1.0, 1.0}}}}, {"hJetPhi", "jet #phi;#phi_{jet};entries", {HistType::kTH1F, {{100, 0.0, o2::constants::math::TwoPI}}}}, + {"hJet3D", "3D jet distribution;p_{T};#eta;#phi", {HistType::kTH3F, {{500, -100, 400}, {100, -1.0, 1.0}, {100, 0.0, o2::constants::math::TwoPI}}}}, {"hPtPart", "Particle p_{T};p_{T};entries", {HistType::kTH1F, {{200, 0, 200}}}}, {"hEtaPart", "Particle #eta;#eta;entries", {HistType::kTH1F, {{100, -1.0, 1.0}}}}, {"hPhiPart", "Particle #phi;#phi;entries", {HistType::kTH1F, {{100, 0.0, o2::constants::math::TwoPI}}}}, @@ -267,6 +268,7 @@ struct JetHadronRecoil { registry.fill(HIST("hJetPt"), jet.pt() - (rho * jet.area()), weight); registry.fill(HIST("hJetEta"), jet.eta(), weight); registry.fill(HIST("hJetPhi"), jet.phi(), weight); + registry.fill(HIST("hJet3D"), jet.pt() - (rho * jet.area()), jet.eta(), jet.phi(), weight); double dR = getWTAaxisDifference(jet, jetsWTA, tracks); @@ -370,6 +372,7 @@ struct JetHadronRecoil { registry.fill(HIST("hJetPt"), jet.pt(), weight); registry.fill(HIST("hJetEta"), jet.eta(), weight); registry.fill(HIST("hJetPhi"), jet.phi(), weight); + registry.fill(HIST("hJet3D"), jet.pt(), jet.eta(), jet.phi(), weight); double dR = getWTAaxisDifference(jet, jetsWTA, particles); From 546c2c6831490846aa9a3d2597a595c7ca49eb20 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Thu, 22 May 2025 09:29:25 +0900 Subject: [PATCH 1367/1650] [PWGEM/Dilepton] fix in skimmerPrimaryMuon.cxx (#11294) --- PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx b/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx index de2c7eef858..439e324ab3c 100644 --- a/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx +++ b/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx @@ -514,10 +514,16 @@ struct skimmerPrimaryMuon { for (const auto& collision : collisions) { const auto& bc = collision.template bc_as(); initCCDB(bc); + if (!collision.has_mcCollision()) { + continue; + } const auto& fwdtrackIdsThisCollision = fwdtrackIndices.sliceBy(fwdtrackIndicesPerCollision, collision.globalIndex()); for (const auto& fwdtrackId : fwdtrackIdsThisCollision) { - const auto& fwdtrack = fwdtrackId.template fwdtrack_as(); + const auto& fwdtrack = fwdtrackId.template fwdtrack_as(); + if (!fwdtrack.has_mcParticle()) { + continue; + } if (fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) { continue; } From b603b6ce4e052762acbb669e96f341648a02bbda Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Thu, 22 May 2025 03:58:16 +0200 Subject: [PATCH 1368/1650] [PWGLF] Avoid common track sharing in mixed event pairing (#11295) --- PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx index 7ac8d4681a3..ad63fdfe27c 100644 --- a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx +++ b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx @@ -535,6 +535,13 @@ struct LfTaskLambdaSpinCorr { if (lambdaTag2 && aLambdaTag2) { continue; } + auto postrack1 = t1.template posTrack_as(); + auto negtrack1 = t1.template negTrack_as(); + auto postrack2 = t2.template posTrack_as(); + auto negtrack2 = t2.template negTrack_as(); + if (postrack1.globalIndex() == postrack2.globalIndex() || negtrack1.globalIndex() == negtrack2.globalIndex()) { + continue; + } for (const auto& t3 : groupV03) { if (pairStatus[t3.index()][t2.index()]) { // LOGF(info, "repeat match found v0 id: (%d, %d)", t3.index(), t2.index()); @@ -610,6 +617,7 @@ struct LfTaskLambdaSpinCorr { using CollisionMCRecTableCentFT0C = soa::Join; using TrackMCRecTable = soa::Join; using V0TrackCandidatesMC = soa::Join; + void processMC(CollisionMCRecTableCentFT0C::iterator const& collision, TrackMCRecTable const& /*tracks*/, V0TrackCandidatesMC const& V0s) { @@ -738,6 +746,13 @@ struct LfTaskLambdaSpinCorr { if (lambdaTag2 && aLambdaTag2) { continue; } + auto postrack1 = t1.template posTrack_as(); + auto negtrack1 = t1.template negTrack_as(); + auto postrack2 = t2.template posTrack_as(); + auto negtrack2 = t2.template negTrack_as(); + if (postrack1.globalIndex() == postrack2.globalIndex() || negtrack1.globalIndex() == negtrack2.globalIndex()) { + continue; + } for (const auto& t3 : groupV03) { if (pairStatus[t3.index()][t2.index()]) { // LOGF(info, "repeat match found v0 id: (%d, %d)", t3.index(), t2.index()); From 128001557b83813922f16d256352adc01e4403dd Mon Sep 17 00:00:00 2001 From: prottayCMT <61418725+prottayCMT@users.noreply.github.com> Date: Thu, 22 May 2025 06:03:52 +0200 Subject: [PATCH 1369/1650] [PWGLF] added RCT flag for calibration (#11296) Co-authored-by: Prottay Das --- PWGLF/TableProducer/Common/spvector.cxx | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/PWGLF/TableProducer/Common/spvector.cxx b/PWGLF/TableProducer/Common/spvector.cxx index abcca438cf8..64b86d3395d 100644 --- a/PWGLF/TableProducer/Common/spvector.cxx +++ b/PWGLF/TableProducer/Common/spvector.cxx @@ -67,6 +67,7 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::constants::physics; +using namespace o2::aod::rctsel; using BCsRun3 = soa::Join; @@ -187,9 +188,21 @@ struct spvector { return 1; } */ + + struct : ConfigurableGroup { + Configurable requireRCTFlagChecker{"requireRCTFlagChecker", true, "Check event quality in run condition table"}; + Configurable cfgEvtRCTFlagCheckerLabel{"cfgEvtRCTFlagCheckerLabel", "CBT_hadronPID", "Evt sel: RCT flag checker label"}; + Configurable cfgEvtRCTFlagCheckerZDCCheck{"cfgEvtRCTFlagCheckerZDCCheck", true, "Evt sel: RCT flag checker ZDC check"}; + Configurable cfgEvtRCTFlagCheckerLimitAcceptAsBad{"cfgEvtRCTFlagCheckerLimitAcceptAsBad", false, "Evt sel: RCT flag checker treat Limited Acceptance As Bad"}; + } rctCut; + + RCTFlagsChecker rctChecker; + void init(o2::framework::InitContext&) { + rctChecker.init(rctCut.cfgEvtRCTFlagCheckerLabel, rctCut.cfgEvtRCTFlagCheckerZDCCheck, rctCut.cfgEvtRCTFlagCheckerLimitAcceptAsBad); + AxisSpec channelZDCAxis = {8, 0.0, 8.0, "ZDC tower"}; AxisSpec qxZDCAxis = {QxyNbins, lbinQxy, hbinQxy, "Qx"}; AxisSpec phiAxis = {PhiNbins, -6.28, 6.28, "phi"}; @@ -440,6 +453,12 @@ struct spvector { return; } + if (rctCut.requireRCTFlagChecker && !rctChecker(collision)) { + triggerevent = false; + spcalibrationtable(triggerevent, currentRunNumber, centrality, vx, vy, vz, znaEnergycommon, zncEnergycommon, znaEnergy[0], znaEnergy[1], znaEnergy[2], znaEnergy[3], zncEnergy[0], zncEnergy[1], zncEnergy[2], zncEnergy[3], qxZDCA, qxZDCC, qyZDCA, qyZDCC, psiZDCC, psiZDCA); + return; + } + // if (collision.sel8() && centrality > cfgCutCentralityMin && centrality < cfgCutCentralityMax && TMath::Abs(vz) < cfgCutVertex && collision.has_foundFT0() && eventSelected(collision, centrality) && collision.selection_bit(aod::evsel::kNoTimeFrameBorder) && collision.selection_bit(aod::evsel::kNoITSROFrameBorder)) { if (collision.sel8() && centrality > cfgCutCentralityMin && centrality < cfgCutCentralityMax && TMath::Abs(vz) < cfgCutVertex && collision.has_foundFT0() && collision.selection_bit(aod::evsel::kNoTimeFrameBorder) && collision.selection_bit(aod::evsel::kNoITSROFrameBorder) && collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { triggerevent = true; From cd166e841913300bd7e457c5f845a994d5bcb853 Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Thu, 22 May 2025 06:47:19 +0200 Subject: [PATCH 1370/1650] [PWGLF] Add impact parameter as a variable to correlate predictions against (#11156) Co-authored-by: ALICE Builder --- PWGLF/Tasks/QC/mcParticlePrediction.cxx | 57 ++++++++++++++++++------- 1 file changed, 41 insertions(+), 16 deletions(-) diff --git a/PWGLF/Tasks/QC/mcParticlePrediction.cxx b/PWGLF/Tasks/QC/mcParticlePrediction.cxx index ba66cabe648..0c1fca899f3 100644 --- a/PWGLF/Tasks/QC/mcParticlePrediction.cxx +++ b/PWGLF/Tasks/QC/mcParticlePrediction.cxx @@ -63,7 +63,8 @@ struct Estimators { static constexpr estID V0A = 16; // (Run2) static constexpr estID V0C = 17; // (Run2) static constexpr estID V0AC = 18; // (Run2 V0M) - static constexpr estID nEstimators = 19; + static constexpr estID ImpactParameter = 19; // (Run2 V0M) + static constexpr estID nEstimators = 20; static constexpr const char* estimatorNames[nEstimators] = {"FT0A", "FT0C", @@ -83,7 +84,8 @@ struct Estimators { "ETA08", "V0A", "V0C", - "V0AC"}; + "V0AC", + "ImpactParameter"}; static std::vector arrayNames() { static std::vector names; @@ -115,13 +117,15 @@ static const int defaultEstimators[Estimators::nEstimators][nParameters]{{0}, / {0}, // ETA08 {0}, // V0A (Run2) {0}, // V0C (Run2) - {0}}; // V0AC (Run2 V0M) + {0}, // V0AC (Run2 V0M) + {0}}; // ImpactParamter // Histograms std::array, Estimators::nEstimators> hestimators; std::array, Estimators::nEstimators> hestimatorsVsITS; std::array, Estimators::nEstimators> hestimatorsVsETA05; std::array, Estimators::nEstimators> hestimatorsVsETA08; +std::array, Estimators::nEstimators> hestimatorsVsImpactParameter; std::array, Estimators::nEstimators> hestimatorsRecoEvGenVsReco; std::array, Estimators::nEstimators> hestimatorsRecoEvGenVsReco_BCMC; std::array, Estimators::nEstimators> hestimatorsRecoEvGenVsRecoITS; @@ -146,6 +150,7 @@ struct mcParticlePrediction { ConfigurableAxis binsVxy{"binsVxy", {100, -10, 10}, "Binning of the production vertex (x and y) axis"}; ConfigurableAxis binsVz{"binsVz", {100, -10, 10}, "Binning of the production vertex (z) axis"}; ConfigurableAxis binsPt{"binsPt", {100, 0, 10}, "Binning of the Pt axis"}; + ConfigurableAxis binsImpactParameter{"binsImpactParameter", {400, 0.0, 20.0}, "Binning of the impact parameter axis"}; ConfigurableAxis binsMultiplicity{"binsMultiplicity", {300, -0.5, 299.5}, "Binning of the Multiplicity axis"}; ConfigurableAxis binsMultiplicityReco{"binsMultiplicityReco", {1000, -0.5, -0.5 + 10000}, "Binning of the Multiplicity axis"}; Configurable> enabledSpecies{"enabledSpecies", @@ -169,6 +174,7 @@ struct mcParticlePrediction { Configurable enableVsITSHistograms{"enableVsITSHistograms", true, "Enables the correlation between ITS and other estimators"}; Configurable enableVsEta05Histograms{"enableVsEta05Histograms", true, "Enables the correlation between ETA05 and other estimators"}; Configurable enableVsEta08Histograms{"enableVsEta08Histograms", true, "Enables the correlation between ETA08 and other estimators"}; + Configurable enableVsImpactParameterHistograms{"enableVsImpactParameterHistograms", true, "Enables the correlation between impact parameter and other estimators"}; Service pdgDB; o2::pwglf::ParticleCounter mCounter; @@ -182,6 +188,7 @@ struct mcParticlePrediction { const AxisSpec axisVy{binsVxy, "Vy"}; const AxisSpec axisVz{binsVz, "Vz"}; const AxisSpec axisPt{binsPt, "#it{p}_{T} (GeV/#it{c})"}; + const AxisSpec axisImpactParameter{binsImpactParameter, "Impact parameter (fm)"}; const AxisSpec axisMultiplicity{binsMultiplicity, "Multiplicity (undefined)"}; const AxisSpec axisMultiplicityReco{binsMultiplicityReco, "Multiplicity Reco. (undefined)"}; const AxisSpec axisMultiplicityRecoITS{100, 0, 100, "Multiplicity Reco. ITSIB"}; @@ -258,30 +265,38 @@ struct mcParticlePrediction { if (!enabledEstimatorsArray[i]) { continue; } + AxisSpec axisThisEstimator = axisMultiplicity; + if (i == Estimators::ImpactParameter) { + axisThisEstimator = axisImpactParameter; + } const char* name = Estimators::estimatorNames[i]; - hestimators[i] = histos.add(Form("multiplicity/%s", name), name, kTH1D, {axisMultiplicity}); + hestimators[i] = histos.add(Form("multiplicity/%s", name), name, kTH1D, {axisThisEstimator}); hestimators[i]->GetXaxis()->SetTitle(Form("Multiplicity %s", name)); - auto make2DH = [&](const std::string& h, const char* ytitle) { + auto make2DH = [&](const std::string& h, const char* ytitle, bool isImpactParameterX = false, bool isImpactParameterY = false) { auto hist = histos.add(Form("%s%s", h.c_str(), name), name, kTH2D, - {axisMultiplicity, axisMultiplicity}); + {isImpactParameterX ? axisImpactParameter : axisMultiplicity, + isImpactParameterY ? axisImpactParameter : axisMultiplicity}); hist->GetXaxis()->SetTitle(Form("Multiplicity %s", name)); - hist->GetXaxis()->SetTitle(Form("Multiplicity %s", ytitle)); + hist->GetYaxis()->SetTitle(Form("Multiplicity %s", ytitle)); return hist; }; if (enableVsITSHistograms) { - hestimatorsVsITS[i] = make2DH("multiplicity/vsITS/", Estimators::estimatorNames[Estimators::ITSIB]); + hestimatorsVsITS[i] = make2DH("multiplicity/vsITS/", Estimators::estimatorNames[Estimators::ITSIB], (i == Estimators::ImpactParameter)); } if (enableVsEta05Histograms) { - hestimatorsVsETA05[i] = make2DH("multiplicity/vsETA05/", Estimators::estimatorNames[Estimators::ETA05]); + hestimatorsVsETA05[i] = make2DH("multiplicity/vsETA05/", Estimators::estimatorNames[Estimators::ETA05], (i == Estimators::ImpactParameter)); } if (enableVsEta08Histograms) { - hestimatorsVsETA08[i] = make2DH("multiplicity/vsETA08/", Estimators::estimatorNames[Estimators::ETA08]); + hestimatorsVsETA08[i] = make2DH("multiplicity/vsETA08/", Estimators::estimatorNames[Estimators::ETA08], (i == Estimators::ImpactParameter)); + } + if (enableVsImpactParameterHistograms) { + hestimatorsVsImpactParameter[i] = make2DH("multiplicity/vsImpactParameter/", Estimators::estimatorNames[Estimators::ImpactParameter], (i == Estimators::ImpactParameter), true); } - hvertexPosZ[i] = histos.add(Form("multiplicity/posZ/%s", name), name, kTH2D, {{200, -20, 20, "pos Z"}, axisMultiplicity}); + hvertexPosZ[i] = histos.add(Form("multiplicity/posZ/%s", name), name, kTH2D, {{200, -20, 20, "pos Z"}, axisThisEstimator}); hvertexPosZ[i]->GetYaxis()->SetTitle(Form("Multiplicity %s", name)); if (!doprocessReco) { // Reco events @@ -331,11 +346,15 @@ struct mcParticlePrediction { if (!enabledEstimatorsArray[j]) { continue; } + AxisSpec axisThisEstimator = axisMultiplicity; + if (j == Estimators::ImpactParameter) { + axisThisEstimator = axisImpactParameter; + } const char* name = Estimators::estimatorNames[j]; - hpt[j][i] = histosPt.add(Form("prediction/pt/%s/%s", name, PIDExtended::getName(i)), PIDExtended::getName(i), kTH2D, {axisPt, axisMultiplicity}); + hpt[j][i] = histosPt.add(Form("prediction/pt/%s/%s", name, PIDExtended::getName(i)), PIDExtended::getName(i), kTH2D, {axisPt, axisThisEstimator}); hpt[j][i]->GetYaxis()->SetTitle(Form("Multiplicity %s", name)); - hyield[j][i] = histosYield.add(Form("prediction/yield/%s/%s", name, PIDExtended::getName(i)), PIDExtended::getName(i), kTH1D, {axisMultiplicity}); + hyield[j][i] = histosYield.add(Form("prediction/yield/%s/%s", name, PIDExtended::getName(i)), PIDExtended::getName(i), kTH1D, {axisThisEstimator}); hyield[j][i]->GetYaxis()->SetTitle(Form("Multiplicity %s", name)); } } @@ -345,7 +364,7 @@ struct mcParticlePrediction { histosYield.print(); } - std::array genMult(const auto& mcParticles) + std::array genMult(const auto& mcCollision, const auto& mcParticles) { std::array nMult; if (enabledEstimatorsArray[Estimators::FT0A] || enabledEstimatorsArray[Estimators::FT0AC]) { @@ -402,6 +421,9 @@ struct mcParticlePrediction { nMult[Estimators::V0AC] = 0; } } + if (enabledEstimatorsArray[Estimators::ImpactParameter]) { + nMult[Estimators::ImpactParameter] = mcCollision.impactParameter(); + } return nMult; } @@ -419,7 +441,7 @@ struct mcParticlePrediction { } histos.fill(HIST("collisions/generated"), 2); - const std::array& nMult = genMult(mcParticles); + const std::array& nMult = genMult(mcCollision, mcParticles); for (int i = 0; i < Estimators::nEstimators; i++) { if (!enabledEstimatorsArray[i]) { @@ -436,6 +458,9 @@ struct mcParticlePrediction { if (enableVsEta08Histograms) { hestimatorsVsETA08[i]->Fill(nMult[i], nMult[Estimators::ETA08]); } + if (enableVsImpactParameterHistograms) { + hestimatorsVsImpactParameter[i]->Fill(nMult[i], nMult[Estimators::ImpactParameter]); + } hvertexPosZ[i]->Fill(mcCollision.posZ(), nMult[i]); } @@ -611,7 +636,7 @@ struct mcParticlePrediction { histos.fill(HIST("particles/FromCollVsFromCollBad"), particlesFromColl, particlesFromCollWrongBC); histos.fill(HIST("particles/FromCollBadOverFromCollVsVsFromMCColl"), 1.f * particlesFromCollWrongBC / particlesFromColl, particlesInCollision.size()); - const std::array& nMult = genMult(particlesInCollision); + const std::array& nMult = genMult(mcCollision, particlesInCollision); float nMultReco[Estimators::nEstimators]; nMultReco[Estimators::FT0A] = collision.multFT0A(); From 0f7f9e7d3a3e63ce874720622ce475094cd205c6 Mon Sep 17 00:00:00 2001 From: Victor Gonzalez Date: Thu, 22 May 2025 07:33:51 +0200 Subject: [PATCH 1371/1650] [PWGCF] DptDpt - Implementing `linter` recommendations (#11299) Co-authored-by: Victor --- PWGCF/TableProducer/dptDptFilter.cxx | 122 +++++++------ PWGCF/TableProducer/dptDptFilter.h | 30 ++-- PWGCF/Tasks/dptDptCorrelations.cxx | 164 +++++++++--------- PWGCF/Tasks/dptDptFilterQa.cxx | 3 +- PWGCF/Tasks/matchRecoGen.cxx | 7 +- .../Tasks/dptDptEfficiencyAndQc.cxx | 26 +-- 6 files changed, 186 insertions(+), 166 deletions(-) diff --git a/PWGCF/TableProducer/dptDptFilter.cxx b/PWGCF/TableProducer/dptDptFilter.cxx index 5f99e3ff1d7..30f55cf3c3f 100644 --- a/PWGCF/TableProducer/dptDptFilter.cxx +++ b/PWGCF/TableProducer/dptDptFilter.cxx @@ -210,6 +210,8 @@ struct Multiplicity { MultEst classestimator = kV0M; + static constexpr float kForMultiplicityPtLowLimit = 0.001f; + static constexpr float kForMultiplicityPtHighLimit = 50.0f; float multiplicityClass = -1.0; float multiplicity = 0.0; bool inelgth0 = false; @@ -277,16 +279,16 @@ struct Multiplicity { case kProton: /* not clear if we should use IsPhysicalPrimary here */ /* TODO: adapt to FT0M Run 3 and other estimators */ - if (0.001 < p.pt() && p.pt() < 50.0) { - if (p.eta() < 1.0 && -1.0 < p.eta()) { + if (kForMultiplicityPtLowLimit < p.pt() && p.pt() < kForMultiplicityPtHighLimit) { + if (p.eta() < 1.0f && -1.0f < p.eta()) { inelgth0 = true; } - addTo(p, v0am, 2.8, 5.1); - addTo(p, v0cm, -3.7, -1.7); - addTo(p, cl1m, -1.4, 1.4); - addTo(p, cl1EtaGapM, -1.4, -0.8); - addTo(p, cl1EtaGapM, 0.8, 1.4); - addTo(p, dNchdEta, -0.5, 0.5); + addTo(p, v0am, 2.8f, 5.1f); + addTo(p, v0cm, -3.7f, -1.7f); + addTo(p, cl1m, -1.4f, 1.4f); + addTo(p, cl1EtaGapM, -1.4f, -0.8f); + addTo(p, cl1EtaGapM, 0.8f, 1.4f); + addTo(p, dNchdEta, -0.5f, 0.5f); nPart++; } break; @@ -359,13 +361,13 @@ struct Multiplicity { struct DptDptFilter { struct : ConfigurableGroup { - Configurable cfgCCDBUrl{"input_ccdburl", "http://ccdb-test.cern.ch:8080", "The CCDB url for the input file"}; - Configurable cfgCCDBPathName{"input_ccdbpath", "", "The CCDB path for the input file. Default \"\", i.e. don't load from CCDB"}; - Configurable cfgCCDBDate{"input_ccdbdate", "20220307", "The CCDB date for the input file"}; - Configurable cfgCCDBPeriod{"input_ccdbperiod", "LHC22o", "The CCDB dataset period for the input file"}; + Configurable cfgCCDBUrl{"cfgCCDBUrl", "http://ccdb-test.cern.ch:8080", "The CCDB url for the input file"}; + Configurable cfgCCDBPathName{"cfgCCDBPathName", "", "The CCDB path for the input file. Default \"\", i.e. don't load from CCDB"}; + Configurable cfgCCDBDate{"cfgCCDBDate", "20220307", "The CCDB date for the input file"}; + Configurable cfgCCDBPeriod{"cfgCCDBPeriod", "LHC22o", "The CCDB dataset period for the input file"}; } cfginputfile; - Configurable cfgFullDerivedData{"fullderiveddata", false, "Produce the full derived data for external storage. Default false"}; - Configurable cfgCentMultEstimator{"centmultestimator", "V0M", "Centrality/multiplicity estimator detector: V0M,CL0,CL1,FV0A,FT0M,FT0A,FT0C,NTPV,NOCM: none. Default V0M"}; + Configurable cfgFullDerivedData{"cfgFullDerivedData", false, "Produce the full derived data for external storage. Default false"}; + Configurable cfgCentMultEstimator{"cfgCentMultEstimator", "V0M", "Centrality/multiplicity estimator detector: V0M,CL0,CL1,FV0A,FT0M,FT0A,FT0C,NTPV,NOCM: none. Default V0M"}; struct : ConfigurableGroup { std::string prefix = "cfgEventSelection"; @@ -379,11 +381,11 @@ struct DptDptFilter { Configurable cfgMaxOccupancy{"cfgMaxOccupancy", 1e6f, "Maximum allowed occupancy. Depends on the occupancy estimation"}; } cfgOccupancySelection; } cfgEventSelection; - Configurable cfgSystem{"syst", "PbPb", "System: pp, PbPb, Pbp, pPb, XeXe, ppRun3, PbPbRun3. Default PbPb"}; - Configurable cfgDataType{"datatype", "data", "Data type: data, datanoevsel, MC, FastMC, OnTheFlyMC. Default data"}; - Configurable cfgTriggSel{"triggsel", "MB", "Trigger selection: MB,VTXTOFMATCHED,VTXTRDMATCHED,VTXTRDTOFMATCHED,None. Default MB"}; - Configurable cfgCentSpec{"centralities", "00-10,10-20,20-30,30-40,40-50,50-60,60-70,70-80", "Centrality/multiplicity ranges in min-max separated by commas"}; - Configurable cfgOverallMinP{"overallminp", 0.0f, "The overall minimum momentum for the analysis. Default: 0.0"}; + Configurable cfgSystem{"cfgSystem", "PbPb", "System: pp, PbPb, Pbp, pPb, XeXe, ppRun3, PbPbRun3. Default PbPb"}; + Configurable cfgDataType{"cfgDataType", "data", "Data type: data, datanoevsel, MC, FastMC, OnTheFlyMC. Default data"}; + Configurable cfgTriggSel{"cfgTriggSel", "MB", "Trigger selection: MB,VTXTOFMATCHED,VTXTRDMATCHED,VTXTRDTOFMATCHED,None. Default MB"}; + Configurable cfgCentSpec{"cfgCentSpec", "00-10,10-20,20-30,30-40,40-50,50-60,60-70,70-80", "Centrality/multiplicity ranges in min-max separated by commas"}; + Configurable cfgOverallMinP{"cfgOverallMinP", 0.0f, "The overall minimum momentum for the analysis. Default: 0.0"}; struct : ConfigurableGroup { std::string prefix = "cfgTpcExclusion"; Configurable method{"method", 0, "The method for excluding tracks within the TPC. 0: no exclusion; 1: static; 2: dynamic. Default: 0"}; @@ -392,10 +394,10 @@ struct DptDptFilter { Configurable negativeLowCut{"negativeLowCut", "pi/9.0 - (0.0892/x + 0.0251)", "The lower cut function for negative tracks"}; Configurable negativeUpCut{"negativeUpCut", "pi/9 - (0.0787/x - 0.0236)", "The upper cut function for negative tracks"}; } cfgTpcExclusion; - Configurable cfgBinning{"binning", + Configurable cfgBinning{"cfgBinning", {28, -7.0, 7.0, 18, 0.2, 2.0, 16, -0.8, 0.8, 72, 0.5}, "triplets - nbins, min, max - for z_vtx, pT, eta and phi, binning plus bin fraction of phi origin shift"}; - Configurable cfgTraceCollId0{"tracecollid0", false, "Trace particles in collisions id 0. Default false"}; + Configurable cfgTraceCollId0{"cfgTraceCollId0", false, "Trace particles in collisions id 0. Default false"}; OutputObj fOutput{"DptDptFilterCollisionsInfo", OutputObjHandlingPolicy::AnalysisObject}; @@ -794,27 +796,27 @@ struct DptDptFilterTracks { std::string cfgCCDBDate{"20220307"}; std::string cfgCCDBPeriod{"LHC22o"}; - Configurable cfgOutDebugInfo{"outdebuginfo", false, "Out detailed debug information per track into a text file. Default false"}; - Configurable cfgFullDerivedData{"fullderiveddata", false, "Produce the full derived data for external storage. Default false"}; - Configurable cfgTrackType{"trktype", 4, "Type of selected tracks: 0 = no selection;1 = Run2 global tracks FB96;3 = Run3 tracks;4 = Run3 tracks MM sel;5 = Run2 TPC only tracks;7 = Run 3 TPC only tracks;30-33 = any/two on 3 ITS,any/all in 7 ITS;40-43 same as 30-33 w tighter DCAxy;50-53 w tighter pT DCAz. Default 4"}; - Configurable cfgOnlyInOneSide{"onlyinoneside", false, "select tracks that don't cross the TPC central membrane. Default false"}; - Configurable cfgTraceDCAOutliers{"trackdcaoutliers", {false, 0.0, 0.0}, "Track the generator level DCAxy outliers: false/true, low dcaxy, up dcaxy. Default {false,0.0,0.0}"}; - Configurable cfgTraceOutOfSpeciesParticles{"trackoutparticles", false, "Track the particles which are not e,mu,pi,K,p: false/true. Default false"}; - Configurable cfgRecoIdMethod{"recoidmethod", 0, "Method for identifying reconstructed tracks: 0 No PID, 1 PID, 2 mcparticle, 3 mcparticle only primaries, 4 mcparticle only sec, 5 mcparicle only sec from decays, 6 mcparticle only sec from material. Default 0"}; - Configurable cfgTuneTrackSelection{"tunetracksel", {}, "Track selection: {useit: true/false, tpccls-useit, tpcxrws-useit, tpcxrfc-useit, tpcshcls-useit, dcaxy-useit, dcaz-useit}. Default {false,0.70,false,0.8,false,0.4,false,2.4,false,3.2,false}"}; - Configurable cfgPionPIDSelection{"pipidsel", + Configurable cfgOutDebugInfo{"cfgOutDebugInfo", false, "Out detailed debug information per track into a text file. Default false"}; + Configurable cfgFullDerivedData{"cfgFullDerivedData", false, "Produce the full derived data for external storage. Default false"}; + Configurable cfgTrackType{"cfgTrackType", 4, "Type of selected tracks: 0 = no selection;1 = Run2 global tracks FB96;3 = Run3 tracks;4 = Run3 tracks MM sel;5 = Run2 TPC only tracks;7 = Run 3 TPC only tracks;30-33 = any/two on 3 ITS,any/all in 7 ITS;40-43 same as 30-33 w tighter DCAxy;50-53 w tighter pT DCAz. Default 4"}; + Configurable cfgOnlyInOneSide{"cfgOnlyInOneSide", false, "select tracks that don't cross the TPC central membrane. Default false"}; + Configurable cfgTraceDCAOutliers{"cfgTraceDCAOutliers", {false, 0.0, 0.0}, "Track the generator level DCAxy outliers: false/true, low dcaxy, up dcaxy. Default {false,0.0,0.0}"}; + Configurable cfgTraceOutOfSpeciesParticles{"cfgTraceOutOfSpeciesParticles", false, "Track the particles which are not e,mu,pi,K,p: false/true. Default false"}; + Configurable cfgRecoIdMethod{"cfgRecoIdMethod", 0, "Method for identifying reconstructed tracks: 0 No PID, 1 PID, 2 mcparticle, 3 mcparticle only primaries, 4 mcparticle only sec, 5 mcparicle only sec from decays, 6 mcparticle only sec from material. Default 0"}; + Configurable cfgTuneTrackSelection{"cfgTuneTrackSelection", {}, "Track selection: {useit: true/false, tpccls-useit, tpcxrws-useit, tpcxrfc-useit, tpcshcls-useit, dcaxy-useit, dcaz-useit}. Default {false,0.70,false,0.8,false,0.4,false,2.4,false,3.2,false}"}; + Configurable cfgPionPIDSelection{"cfgPionPIDSelection", {}, "PID criteria for pions"}; - Configurable cfgKaonPIDSelection{"kapidsel", + Configurable cfgKaonPIDSelection{"cfgKaonPIDSelection", {}, "PID criteria for kaons"}; - Configurable cfgProtonPIDSelection{"prpidsel", + Configurable cfgProtonPIDSelection{"cfgProtonPIDSelection", {}, "PID criteria for protons"}; - Configurable cfgElectronPIDSelection{"elpidsel", + Configurable cfgElectronPIDSelection{"cfgElectronPIDSelection", {}, "PID criteria for electrons"}; - Configurable cfgMuonPIDSelection{"mupidsel", + Configurable cfgMuonPIDSelection{"cfgMuonPIDSelection", {}, "PID criteria for muons"}; @@ -833,18 +835,18 @@ struct DptDptFilterTracks { /* update with the configurable values */ /* self configure the binning */ - getTaskOptionValue(initContext, "dpt-dpt-filter", "overallminp", overallminp, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mZVtxbins", zvtxbins, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mZVtxmin", zvtxlow, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mZVtxmax", zvtxup, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mPTbins", ptbins, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mPTmin", ptlow, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mPTmax", ptup, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mEtabins", etabins, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mEtamin", etalow, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mEtamax", etaup, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mPhibins", phibins, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mPhibinshift", phibinshift, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgOverallMinP", overallminp, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mZVtxbins", zvtxbins, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mZVtxmin", zvtxlow, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mZVtxmax", zvtxup, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mPTbins", ptbins, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mPTmin", ptlow, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mPTmax", ptup, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mEtabins", etabins, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mEtamin", etalow, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mEtamax", etaup, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mPhibins", phibins, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mPhibinshift", phibinshift, false); TpcExclusionMethod tpcExclude = kNOEXCLUSION; ///< exclude tracks within the TPC according to this method std::string pLowCut; @@ -861,10 +863,10 @@ struct DptDptFilterTracks { tpcExclude = static_cast(tmpTpcExclude); } /* self configure the CCDB access to the input file */ - getTaskOptionValue(initContext, "dpt-dpt-filter", "input_ccdburl", cfgCCDBUrl, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "input_ccdbpath", cfgCCDBPathName, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "input_ccdbdate", cfgCCDBDate, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "input_ccdbperiod", cfgCCDBPeriod, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgCCDBUrl", cfgCCDBUrl, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgCCDBPathName", cfgCCDBPathName, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgCCDBDate", cfgCCDBDate, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgCCDBPeriod", cfgCCDBPeriod, false); /* create the output list which will own the task histograms */ TList* fOutputList = new TList(); @@ -892,9 +894,9 @@ struct DptDptFilterTracks { /* self configure system type and data type */ /* if the system type is not known at this time, we have to put the initialization somewhere else */ std::string tmpstr; - getTaskOptionValue(initContext, "dpt-dpt-filter", "syst", tmpstr, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgSystem", tmpstr, false); fSystem = getSystemType(tmpstr); - getTaskOptionValue(initContext, "dpt-dpt-filter", "datatype", tmpstr, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgDataType", tmpstr, false); fDataType = getDataType(tmpstr); /* required ambiguous tracks checks? */ @@ -1536,8 +1538,14 @@ int8_t DptDptFilterTracks::selectTrack(TrackObject const& track) template int8_t DptDptFilterTracks::selectTrackAmbiguousCheck(CollisionObjects const& collisions, TrackObject const& track) { + enum AmbiguityTypes { + kNoAmbiguous = 0, /* no ambiguous track */ + kOnePossibilitySame = 1, /* the track is present in the collision association table but has the same associated collision so the track is not ambiguous */ + kOnePossibilityDifferent = 2, /* the track is present in the collision association table and has a diffetent collision associeted so the track is ambiguous */ + kMoreThanOnePossibility = 3 /* the track is associated to more than one collision in the collision association table so the track is ambiguous */ + }; bool ambiguoustrack = false; - int ambtracktype = 0; /* no ambiguous */ + AmbiguityTypes ambtracktype = kNoAmbiguous; std::vector zvertexes{}; /* ambiguous tracks checks if required */ if constexpr (has_type_v) { @@ -1547,17 +1555,17 @@ int8_t DptDptFilterTracks::selectTrackAmbiguousCheck(CollisionObjects const& col /* ambiguous track! */ ambiguoustrack = true; /* in principle we should not be here because the track is associated to two collisions at least */ - ambtracktype = 2; + ambtracktype = kOnePossibilityDifferent; zvertexes.push_back(collisions.iteratorAt(track.collisionId()).posZ()); zvertexes.push_back(collisions.iteratorAt(track.compatibleCollIds()[0]).posZ()); } else { /* we consider the track as no ambiguous */ - ambtracktype = 1; + ambtracktype = kOnePossibilitySame; } } else { /* ambiguous track! */ ambiguoustrack = true; - ambtracktype = 3; + ambtracktype = kMoreThanOnePossibility; /* the track is associated to more than one collision */ for (const auto& collIdx : track.compatibleCollIds()) { zvertexes.push_back(collisions.iteratorAt(collIdx).posZ()); @@ -1572,7 +1580,7 @@ int8_t DptDptFilterTracks::selectTrackAmbiguousCheck(CollisionObjects const& col fhAmbiguousTrackType->Fill(ambtracktype, multiplicityClass); fhAmbiguousTrackPt->Fill(track.pt(), multiplicityClass); fhAmbiguityDegree->Fill(zvertexes.size(), multiplicityClass); - if (ambtracktype == 2) { + if (ambtracktype == kOnePossibilityDifferent) { fhCompatibleCollisionsZVtxRms->Fill(-computeRMS(zvertexes), multiplicityClass); } else { fhCompatibleCollisionsZVtxRms->Fill(computeRMS(zvertexes), multiplicityClass); diff --git a/PWGCF/TableProducer/dptDptFilter.h b/PWGCF/TableProducer/dptDptFilter.h index 8638e56959e..18076266f1a 100644 --- a/PWGCF/TableProducer/dptDptFilter.h +++ b/PWGCF/TableProducer/dptDptFilter.h @@ -17,6 +17,8 @@ #define PWGCF_TABLEPRODUCER_DPTDPTFILTER_H_ #include +#include +#include #include #include #include @@ -208,6 +210,7 @@ bool onlyInOneSide = false; ///< select only tracks that don't cross the extern TpcExcludeTrack tpcExcluder; ///< the TPC excluder object instance /* selection criteria from PWGMM */ +static constexpr int kTrackTypePWGMM = 4; // default quality criteria for tracks with ITS contribution static constexpr o2::aod::track::TrackSelectionFlags::flagtype TrackSelectionITS = o2::aod::track::TrackSelectionFlags::kITSNCls | o2::aod::track::TrackSelectionFlags::kITSChi2NDF | @@ -888,6 +891,8 @@ inline bool triggerSelection(aod::McCollision const&) ////////////////////////////////////////////////////////////////////////////////// /// Multiplicity extraction ////////////////////////////////////////////////////////////////////////////////// +static constexpr float kValidPercentileLowLimit = 0.0f; +static constexpr float kValidPercentileUpLimit = 100.0f; /// \brief Extract the collision multiplicity from the event selection information template @@ -974,7 +979,7 @@ template inline bool centralitySelectionMult(CollisionObject collision, float& centmult) { float mult = getCentMultPercentile(collision); - if (mult < 100 && 0 < mult) { + if (mult < kValidPercentileUpLimit && kValidPercentileLowLimit < mult) { centmult = mult; collisionFlags.set(kCENTRALITYBIT); return true; @@ -1053,7 +1058,7 @@ inline bool centralitySelection inline bool centralitySelection(aod::McCollision const&, float& centmult) { - if (centmult < 100 && 0 < centmult) { + if (centmult < kValidPercentileUpLimit && kValidPercentileLowLimit < centmult) { return true; } else { return false; @@ -1291,12 +1296,14 @@ struct TpcExcludeTrack { } explicit TpcExcludeTrack(TpcExclusionMethod m) { + static constexpr float kDefaultPhiBinShift = 0.5f; + static constexpr int kDefaultNoOfPhiBins = 72; switch (m) { case kNOEXCLUSION: method = m; break; case kSTATIC: - if (phibinshift == 0.5f && phibins == 72) { + if (phibinshift == kDefaultPhiBinShift && phibins == kDefaultNoOfPhiBins) { method = m; } else { LOGF(fatal, "Static TPC exclusion method with bin shift: %.2f and number of bins %d. Please fix it", phibinshift, phibins); @@ -1376,7 +1383,7 @@ inline bool matchTrackType(TrackObject const& track) { using namespace o2::aod::track; - if (tracktype == 4) { + if (tracktype == kTrackTypePWGMM) { // under tests MM track selection // see: https://indico.cern.ch/event/1383788/contributions/5816953/attachments/2805905/4896281/TrackSel_GlobalTracks_vs_MMTrackSel.pdf // it should be equivalent to this @@ -1468,7 +1475,8 @@ void exploreMothers(ParticleObject& particle, MCCollisionObject& collision) inline float getCharge(float pdgCharge) { - float charge = (pdgCharge / 3 >= 1) ? 1.0 : ((pdgCharge / 3 <= -1) ? -1.0 : 0); + static constexpr int kNoOfBasicChargesPerUnitCharge = 3; + float charge = (pdgCharge / kNoOfBasicChargesPerUnitCharge >= 1) ? 1.0 : ((pdgCharge / kNoOfBasicChargesPerUnitCharge <= -1) ? -1.0 : 0); return charge; } @@ -1504,7 +1512,7 @@ inline bool acceptParticle(ParticleObject& particle, MCCollisionObject const&) ////////////////////////////////////////////////////////////////////////////////// struct PIDSpeciesSelection { - const std::vector pdgcodes = {11, 13, 211, 321, 2212}; + const std::vector pdgcodes = {kElectron, kMuonMinus, kPiPlus, kKPlus, kProton}; const std::vector spnames = {"e", "mu", "pi", "ka", "p"}; const std::vector sptitles = {"e", "#mu", "#pi", "K", "p"}; const std::vector spfnames = {"E", "Mu", "Pi", "Ka", "Pr"}; @@ -1614,8 +1622,8 @@ struct PIDSpeciesSelection { return false; } }; - auto awayFrom = [](auto& values, auto& mindet, auto& maxdet, uint8_t sp) { - for (int ix = 0; ix < 5; ix++) { + auto awayFrom = [&](auto& values, auto& mindet, auto& maxdet, uint8_t sp) { + for (size_t ix = 0; ix < pdgcodes.size(); ix++) { if (ix != sp) { if (mindet[ix] <= values[ix] && values[ix] < maxdet[ix]) { return false; @@ -1649,7 +1657,7 @@ struct PIDSpeciesSelection { } }; auto awayFromTPCTOF = [&](auto& config, uint8_t sp) { - for (uint8_t ix = 0; ix < 5; ++ix) { + for (uint8_t ix = 0; ix < pdgcodes.size(); ++ix) { if (ix != sp) { if (closeToTPCTOF(config, ix)) { return false; @@ -1827,7 +1835,7 @@ struct PIDSpeciesSelection { template int8_t whichTruthSecFromDecaySpecies(ParticleObject part) { - if (!(part.isPhysicalPrimary()) && (part.getProcess() == 4)) { + if (!(part.isPhysicalPrimary()) && (part.getProcess() == TMCProcess::kPDecay)) { return whichTruthSpecies(part); } else { return -127; @@ -1837,7 +1845,7 @@ struct PIDSpeciesSelection { template int8_t whichTruthSecFromMaterialSpecies(ParticleObject part) { - if (!(part.isPhysicalPrimary()) && (part.getProcess() != 4)) { + if (!(part.isPhysicalPrimary()) && (part.getProcess() != TMCProcess::kPDecay)) { return whichTruthSpecies(part); } else { return -127; diff --git a/PWGCF/Tasks/dptDptCorrelations.cxx b/PWGCF/Tasks/dptDptCorrelations.cxx index bdd119944c0..065e4be286f 100644 --- a/PWGCF/Tasks/dptDptCorrelations.cxx +++ b/PWGCF/Tasks/dptDptCorrelations.cxx @@ -32,6 +32,7 @@ #include "Common/Core/TrackSelection.h" #include "Common/Core/TableHelper.h" +#include "Common/Core/RecoDecay.h" #include "Common/DataModel/Centrality.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/TrackSelectionTables.h" @@ -67,12 +68,19 @@ float deltaphibinwidth = constants::math::TwoPI / deltaphibins; float deltaphilow = 0.0 - deltaphibinwidth / 2.0; float deltaphiup = constants::math::TwoPI - deltaphibinwidth / 2.0; -int nNoOfDimensions = 1; // number of dimensions for the NUA & NUE corrections -bool processpairs = false; // process pairs analysis -bool processmixedevents = false; // process mixed events -bool ptorder = false; // consider pt ordering -bool invmass = false; // produce the invariant mass histograms -bool corrana = false; // produce the correlation analysis histograms +enum HistoDimensions { + kNONE = 0, + k1D, + k2D, + k3D, + k4D +}; +HistoDimensions nNoOfDimensions = k1D; // number of dimensions for the NUA & NUE corrections +bool processpairs = false; // process pairs analysis +bool processmixedevents = false; // process mixed events +bool ptorder = false; // consider pt ordering +bool invmass = false; // produce the invariant mass histograms +bool corrana = false; // produce the correlation analysis histograms PairCuts fPairCuts; // pair suppression engine bool fUseConversionCuts = false; // suppress resonances and conversions @@ -85,7 +93,7 @@ std::vector> trackPairsNames; ///< the track pairs name } // namespace correlationstask // Task for building correlations -struct DptDptCorrelationsTask { +struct DptDptCorrelations { /* the data collecting engine */ template @@ -140,11 +148,7 @@ struct DptDptCorrelationsTask { { using namespace correlationstask; using namespace o2::analysis::dptdptfilter; - if (!(phi < phiup)) { - return phi - constants::math::TwoPI; - } else { - return phi; - } + return RecoDecay::constrainAngle(phi, philow); } /// \brief Returns the zero based bin index of the eta phi passed track @@ -226,7 +230,7 @@ struct DptDptCorrelationsTask { float value = deltaphilow + (deltaPhiIx + 0.5) * deltaphibinwidth; - return (value < (deltaphiup - constants::math::PI)) ? value : value - constants::math::TwoPI; + return RecoDecay::constrainAngle(value, deltaphilow - constants::math::PI); } /// \brief Returns the TH2 global bin for the differential histograms @@ -304,10 +308,10 @@ struct DptDptCorrelationsTask { for (uint i = 0; i < corrs.size(); ++i) { if (corrs[i] != nullptr) { if (nNoOfDimensions != corrs[i]->GetDimension()) { - LOGF(fatal, " Corrections received dimensions %d for track id %d different than expected %d", corrs[i]->GetDimension(), i, nNoOfDimensions); + LOGF(fatal, " Corrections received dimensions %d for track id %d different than expected %d", corrs[i]->GetDimension(), i, static_cast(nNoOfDimensions)); } else { LOGF(info, " Storing NUA&NUE corrections %s for track id %d with %d dimensions %s", - corrs[i] != nullptr ? corrs[i]->GetName() : "nullptr", i, nNoOfDimensions, corrs[i] != nullptr ? "yes" : "no"); + corrs[i] != nullptr ? corrs[i]->GetName() : "nullptr", i, static_cast(nNoOfDimensions), corrs[i] != nullptr ? "yes" : "no"); } } fhNuaNue[i] = corrs[i]; @@ -315,15 +319,15 @@ struct DptDptCorrelationsTask { int nbins = 0; double avg = 0.0; for (int ix = 0; ix < fhNuaNue[i]->GetNbinsX(); ++ix) { - if (nNoOfDimensions == 1) { + if (nNoOfDimensions == k1D) { nbins++; avg += fhNuaNue[i]->GetBinContent(ix + 1); } else { for (int iy = 0; iy < fhNuaNue[i]->GetNbinsY(); ++iy) { - if (nNoOfDimensions == 2) { + if (nNoOfDimensions == k2D) { nbins++; avg += fhNuaNue[i]->GetBinContent(ix + 1, iy + 1); - } else if (nNoOfDimensions == 3 || nNoOfDimensions == 4) { + } else if (nNoOfDimensions == k3D || nNoOfDimensions == k4D) { for (int iz = 0; iz < fhNuaNue[i]->GetNbinsZ(); ++iz) { nbins++; avg += fhNuaNue[i]->GetBinContent(ix + 1, iy + 1, iz + 1); @@ -348,18 +352,20 @@ struct DptDptCorrelationsTask { ccdbstored = true; } - template + template std::vector* getTrackCorrections(TrackListObject const& tracks, float zvtx) { + using namespace correlationstask; + std::vector* corr = new std::vector(tracks.size(), 1.0f); int index = 0; for (const auto& t : tracks) { if (fhNuaNue[t.trackacceptedid()] != nullptr) { - if constexpr (nDim == 1) { + if constexpr (nDim == k1D) { (*corr)[index] = fhNuaNue[t.trackacceptedid()]->GetBinContent(fhNuaNue[t.trackacceptedid()]->FindFixBin(t.pt())); - } else if constexpr (nDim == 2) { + } else if constexpr (nDim == k2D) { (*corr)[index] = fhNuaNue[t.trackacceptedid()]->GetBinContent(fhNuaNue[t.trackacceptedid()]->FindFixBin(t.eta(), t.pt())); - } else if constexpr (nDim == 3) { + } else if constexpr (nDim == k3D) { (*corr)[index] = fhNuaNue[t.trackacceptedid()]->GetBinContent(fhNuaNue[t.trackacceptedid()]->FindFixBin(zvtx, getEtaPhiIndex(t) + 0.5, t.pt())); } } @@ -373,14 +379,14 @@ struct DptDptCorrelationsTask { { using namespace correlationstask; - if (nNoOfDimensions == 1) { - return getTrackCorrections<1>(tracks, zvtx); - } else if (nNoOfDimensions == 2) { - return getTrackCorrections<2>(tracks, zvtx); - } else if (nNoOfDimensions == 3) { - return getTrackCorrections<3>(tracks, zvtx); + if (nNoOfDimensions == k1D) { + return getTrackCorrections(tracks, zvtx); + } else if (nNoOfDimensions == k2D) { + return getTrackCorrections(tracks, zvtx); + } else if (nNoOfDimensions == k3D) { + return getTrackCorrections(tracks, zvtx); } - return getTrackCorrections<4>(tracks, zvtx); + return getTrackCorrections(tracks, zvtx); } template @@ -507,12 +513,7 @@ struct DptDptCorrelationsTask { } float deltaeta = track1.eta() - track2.eta(); float deltaphi = track1.phi() - track2.phi(); - while (deltaphi >= deltaphiup) { - deltaphi -= constants::math::TwoPI; - } - while (deltaphi < deltaphilow) { - deltaphi += constants::math::TwoPI; - } + deltaphi = RecoDecay::constrainAngle(deltaphi, deltaphilow); if ((fUseConversionCuts && fPairCuts.conversionCuts(track1, track2)) || (fUseTwoTrackCut && fPairCuts.twoTrackCut(track1, track2, bfield))) { /* suppress the pair */ if constexpr (docorrelations) { @@ -908,17 +909,17 @@ struct DptDptCorrelationsTask { /* pair conversion suppression defaults */ static constexpr float kCfgPairCutDefaults[1][5] = {{-1, -1, -1, -1, -1}}; - Configurable> cfgPairCut{"paircut", {kCfgPairCutDefaults[0], 5, {"Photon", "K0", "Lambda", "Phi", "Rho"}}, "Conversion suppressions"}; + Configurable> cfgPairCut{"cfgPairCut", {kCfgPairCutDefaults[0], 5, {"Photon", "K0", "Lambda", "Phi", "Rho"}}, "Conversion suppressions"}; /* two tracks cut */ - Configurable cfgTwoTrackCut{"twotrackcut", -1, "Two-tracks cut: -1 = off; >0 otherwise distance value (suggested: 0.02"}; - Configurable cfgTwoTrackCutMinRadius{"twotrackcutminradius", 0.8f, "Two-tracks cut: radius in m from which two-tracks cut is applied"}; - - Configurable cfgSmallDCE{"smalldce", true, "Use small data collecting engine for singles processing, true = yes. Default = true"}; - Configurable cfgDoInvMass{"doinvmass", false, "Do the invariant mass analyis, true = yes. Default = false"}; - Configurable cfgDoCorrelations{"docorrelations", true, "Do the correlations analysis, true = yes. Default = true"}; - Configurable cfgProcessPairs{"processpairs", false, "Process pairs: false = no, just singles, true = yes, process pairs"}; - Configurable cfgProcessME{"processmixedevents", false, "Process mixed events: false = no, just same event, true = yes, also process mixed events"}; - Configurable cfgPtOrder{"ptorder", false, "enforce pT_1 < pT_2. Defalut: false"}; + Configurable cfgTwoTrackCut{"cfgTwoTrackCut", -1, "Two-tracks cut: -1 = off; >0 otherwise distance value (suggested: 0.02"}; + Configurable cfgTwoTrackCutMinRadius{"cfgTwoTrackCutMinRadius", 0.8f, "Two-tracks cut: radius in m from which two-tracks cut is applied"}; + + Configurable cfgSmallDCE{"cfgSmallDCE", true, "Use small data collecting engine for singles processing, true = yes. Default = true"}; + Configurable cfgDoInvMass{"cfgDoInvMass", false, "Do the invariant mass analyis, true = yes. Default = false"}; + Configurable cfgDoCorrelations{"cfgDoCorrelations", true, "Do the correlations analysis, true = yes. Default = true"}; + Configurable cfgProcessPairs{"cfgProcessPairs", false, "Process pairs: false = no, just singles, true = yes, process pairs"}; + Configurable cfgProcessME{"cfgProcessME", false, "Process mixed events: false = no, just same event, true = yes, also process mixed events"}; + Configurable cfgPtOrder{"cfgPtOrder", false, "enforce pT_1 < pT_2. Defalut: false"}; Configurable cfgNoOfDimensions{"cfgNoOfDimensions", 1, "Number of dimensions for the NUA&NUE corrections. Default 1"}; OutputObj fOutput{"DptDptCorrelationsData", OutputObjHandlingPolicy::AnalysisObject, OutputObjSourceType::OutputObjSource}; @@ -944,17 +945,17 @@ struct DptDptCorrelationsTask { } /* self configure the binning */ - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mZVtxbins", zvtxbins, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mZVtxmin", zvtxlow, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mZVtxmax", zvtxup, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mPTbins", ptbins, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mPTmin", ptlow, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mPTmax", ptup, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mEtabins", etabins, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mEtamin", etalow, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mEtamax", etaup, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mPhibins", phibins, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mPhibinshift", phibinshift, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mZVtxbins", zvtxbins, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mZVtxmin", zvtxlow, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mZVtxmax", zvtxup, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mPTbins", ptbins, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mPTmin", ptlow, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mPTmax", ptup, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mEtabins", etabins, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mEtamin", etalow, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mEtamax", etaup, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mPhibins", phibins, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mPhibinshift", phibinshift, false); philow = 0.0f; phiup = constants::math::TwoPI; processpairs = cfgProcessPairs.value; @@ -962,20 +963,20 @@ struct DptDptCorrelationsTask { ptorder = cfgPtOrder.value; invmass = cfgDoInvMass.value; corrana = cfgDoCorrelations.value; - nNoOfDimensions = cfgNoOfDimensions.value; + nNoOfDimensions = static_cast(cfgNoOfDimensions.value); /* self configure the CCDB access to the input file */ - getTaskOptionValue(initContext, "dpt-dpt-filter", "input_ccdburl", cfgCCDBUrl, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "input_ccdbpath", cfgCCDBPathName, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "input_ccdbdate", cfgCCDBDate, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "input_ccdbperiod", cfgCCDBPeriod, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgCCDBUrl", cfgCCDBUrl, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgCCDBPathName", cfgCCDBPathName, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgCCDBDate", cfgCCDBDate, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgCCDBPeriod", cfgCCDBPeriod, false); loadfromccdb = cfgCCDBPathName.length() > 0; /* update the potential binning change */ etabinwidth = (etaup - etalow) / static_cast(etabins); phibinwidth = (phiup - philow) / static_cast(phibins); - /* the differential bining */ + /* the differential binning */ deltaetabins = etabins * 2 - 1; deltaetalow = etalow - etaup, deltaetaup = etaup - etalow; deltaetabinwidth = (deltaetaup - deltaetalow) / static_cast(deltaetabins); @@ -1009,7 +1010,7 @@ struct DptDptCorrelationsTask { { /* self configure the desired species */ o2::analysis::dptdptfilter::PIDSpeciesSelection pidselector; - std::vector cfgnames = {"elpidsel", "mupidsel", "pipidsel", "kapidsel", "prpidsel"}; + std::vector cfgnames = {"cfgElectronPIDSelection", "cfgMuonPIDSelection", "cfgPionPIDSelection", "cfgKaonPIDSelection", "cfgProtonPIDSelection"}; std::vector spids = {0, 1, 2, 3, 4}; for (uint i = 0; i < cfgnames.size(); ++i) { auto includeIt = [&pidselector, &initContext](int spid, auto name) { @@ -1054,7 +1055,7 @@ struct DptDptCorrelationsTask { /* self configure the centrality/multiplicity ranges */ std::string centspec; - if (getTaskOptionValue(initContext, "dpt-dpt-filter", "centralities", centspec, false)) { + if (getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgCentSpec", centspec, false)) { LOGF(info, "Got the centralities specification: %s", centspec.c_str()); auto tokens = TString(centspec.c_str()).Tokenize(","); ncmranges = tokens->GetEntries(); @@ -1393,7 +1394,7 @@ struct DptDptCorrelationsTask { { processSame(collision, tracks, collision.bc_as().timestamp()); } - PROCESS_SWITCH(DptDptCorrelationsTask, processRecLevel, "Process reco level correlations", false); + PROCESS_SWITCH(DptDptCorrelations, processRecLevel, "Process reco level correlations", false); void processRecLevelCheck(aod::Collisions const& collisions, aod::Tracks const& tracks) { @@ -1420,7 +1421,7 @@ struct DptDptCorrelationsTask { LOGF(info, " First not assigned track index %d", firstNotAssignedIndex); LOGF(info, " Last not assigned track index %d", lastNotAssignedIndex); } - PROCESS_SWITCH(DptDptCorrelationsTask, processRecLevelCheck, "Process reco level checks", true); + PROCESS_SWITCH(DptDptCorrelations, processRecLevelCheck, "Process reco level checks", true); void processGenLevelCheck(aod::McCollisions const& mccollisions, aod::McParticles const& particles) { @@ -1447,7 +1448,7 @@ struct DptDptCorrelationsTask { LOGF(info, " First not assigned track index %d", firstNotAssignedIndex); LOGF(info, " Last not assigned track index %d", lastNotAssignedIndex); } - PROCESS_SWITCH(DptDptCorrelationsTask, processGenLevelCheck, "Process generator level checks", true); + PROCESS_SWITCH(DptDptCorrelations, processGenLevelCheck, "Process generator level checks", true); void processRecLevelNotStored( soa::Filtered>::iterator const& collision, @@ -1456,7 +1457,7 @@ struct DptDptCorrelationsTask { { processSame(collision, tracks, collision.bc_as().timestamp()); } - PROCESS_SWITCH(DptDptCorrelationsTask, processRecLevelNotStored, "Process reco level correlations for not stored derived data", true); + PROCESS_SWITCH(DptDptCorrelations, processRecLevelNotStored, "Process reco level correlations for not stored derived data", true); void processGenLevel( soa::Filtered::iterator const& collision, @@ -1464,7 +1465,7 @@ struct DptDptCorrelationsTask { { processSame(collision, tracks); } - PROCESS_SWITCH(DptDptCorrelationsTask, processGenLevel, "Process generator level correlations", false); + PROCESS_SWITCH(DptDptCorrelations, processGenLevel, "Process generator level correlations", false); void processGenLevelNotStored( soa::Filtered>::iterator const& collision, @@ -1472,7 +1473,7 @@ struct DptDptCorrelationsTask { { processSame(collision, particles); } - PROCESS_SWITCH(DptDptCorrelationsTask, processGenLevelNotStored, "Process generator level correlations for not stored derived data", false); + PROCESS_SWITCH(DptDptCorrelations, processGenLevelNotStored, "Process generator level correlations for not stored derived data", false); std::vector vtxBinsEdges{VARIABLE_WIDTH, -7.0f, -5.0f, -3.0f, -1.0f, 1.0f, 3.0f, 5.0f, 7.0f}; @@ -1480,6 +1481,7 @@ struct DptDptCorrelationsTask { SliceCache cache; using BinningZVtxMultRec = ColumnBinningPolicy; BinningZVtxMultRec bindingOnVtxAndMultRec{{vtxBinsEdges, multBinsEdges}, true}; // true is for 'ignore overflows' (true by default) + static constexpr int kNoOfLoggingCombinations = 10; void processRecLevelMixed(soa::Filtered const& collisions, aod::BCsWithTimestamps const&, soa::Filtered const& tracks) { @@ -1489,7 +1491,7 @@ struct DptDptCorrelationsTask { LOGF(DPTDPTLOGCOLLISIONS, "Received %d collisions", collisions.size()); int logcomb = 0; for (auto const& [collision1, tracks1, collision2, tracks2] : pairreco) { - if (logcomb < 10) { + if (logcomb < kNoOfLoggingCombinations) { LOGF(DPTDPTLOGCOLLISIONS, "Received collision pair: %ld (%f, %f): %s, %ld (%f, %f): %s", collision1.globalIndex(), collision1.posZ(), collision1.centmult(), collision1.collisionaccepted() ? "accepted" : "not accepted", collision2.globalIndex(), collision2.posZ(), collision2.centmult(), collision2.collisionaccepted() ? "accepted" : "not accepted"); @@ -1503,7 +1505,7 @@ struct DptDptCorrelationsTask { processMixed(collision1, tracks1, tracks2, collision1.bc_as().timestamp()); } } - PROCESS_SWITCH(DptDptCorrelationsTask, processRecLevelMixed, "Process reco level mixed events correlations", false); + PROCESS_SWITCH(DptDptCorrelations, processRecLevelMixed, "Process reco level mixed events correlations", false); void processRecLevelMixedNotStored( soa::Filtered> const& collisions, @@ -1524,7 +1526,7 @@ struct DptDptCorrelationsTask { LOGF(DPTDPTLOGCOLLISIONS, "Received %d collisions", collisions.size()); int logcomb = 0; for (auto const& [collision1, tracks1, collision2, tracks2] : pairreco) { - if (logcomb < 10) { + if (logcomb < kNoOfLoggingCombinations) { LOGF(DPTDPTLOGCOLLISIONS, "Received collision pair: %ld (%f, %f): %s, %ld (%f, %f): %s", collision1.globalIndex(), @@ -1555,7 +1557,7 @@ struct DptDptCorrelationsTask { collision1.bc_as().timestamp()); } } - PROCESS_SWITCH(DptDptCorrelationsTask, processRecLevelMixedNotStored, "Process reco level mixed events correlations for not stored derived data", false); + PROCESS_SWITCH(DptDptCorrelations, processRecLevelMixedNotStored, "Process reco level mixed events correlations for not stored derived data", false); using BinningZVtxMultGen = ColumnBinningPolicy; BinningZVtxMultGen bindingOnVtxAndMultGen{{vtxBinsEdges, multBinsEdges}, true}; // true is for 'ignore overflows' (true by default) @@ -1568,7 +1570,7 @@ struct DptDptCorrelationsTask { LOGF(DPTDPTLOGCOLLISIONS, "Received %d generated collisions", collisions.size()); int logcomb = 0; for (auto const& [collision1, tracks1, collision2, tracks2] : pairgen) { - if (logcomb < 10) { + if (logcomb < kNoOfLoggingCombinations) { LOGF(DPTDPTLOGCOLLISIONS, "Received generated collision pair: %ld (%f, %f): %s, %ld (%f, %f): %s", collision1.globalIndex(), collision1.posZ(), collision1.centmult(), collision1.collisionaccepted() ? "accepted" : "not accepted", collision2.globalIndex(), collision2.posZ(), collision2.centmult(), collision2.collisionaccepted() ? "accepted" : "not accepted"); @@ -1581,7 +1583,7 @@ struct DptDptCorrelationsTask { processMixed(collision1, tracks1, tracks2); } } - PROCESS_SWITCH(DptDptCorrelationsTask, processGenLevelMixed, "Process generator level mixed events correlations", false); + PROCESS_SWITCH(DptDptCorrelations, processGenLevelMixed, "Process generator level mixed events correlations", false); void processGenLevelMixedNotStored(soa::Filtered> const& collisions, soa::Filtered> const& tracks) { @@ -1599,7 +1601,7 @@ struct DptDptCorrelationsTask { LOGF(DPTDPTLOGCOLLISIONS, "Received %d generated collisions", collisions.size()); int logcomb = 0; for (auto const& [collision1, tracks1, collision2, tracks2] : pairgen) { - if (logcomb < 10) { + if (logcomb < kNoOfLoggingCombinations) { LOGF(DPTDPTLOGCOLLISIONS, "Received generated collision pair: %ld (%f, %f): %s, %ld (%f, %f): %s", collision1.globalIndex(), @@ -1626,7 +1628,7 @@ struct DptDptCorrelationsTask { processMixed(collision1, tracks1, tracks2); } } - PROCESS_SWITCH(DptDptCorrelationsTask, processGenLevelMixedNotStored, "Process generator level mixed events correlations for not stored derived data", false); + PROCESS_SWITCH(DptDptCorrelations, processGenLevelMixedNotStored, "Process generator level mixed events correlations for not stored derived data", false); /// cleans the output object when the task is not used void processCleaner(soa::Filtered const& colls) @@ -1634,13 +1636,13 @@ struct DptDptCorrelationsTask { LOGF(DPTDPTLOGCOLLISIONS, "Got %d new collisions", colls.size()); fOutput->Clear(); } - PROCESS_SWITCH(DptDptCorrelationsTask, processCleaner, "Cleaner process for not used output", false); + PROCESS_SWITCH(DptDptCorrelations, processCleaner, "Cleaner process for not used output", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { WorkflowSpec workflow{ - adaptAnalysisTask(cfgc, TaskName{"DptDptCorrelationsTaskRec"}, SetDefaultProcesses{{{"processRecLevel", true}, {"processRecLevelMixed", false}, {"processCleaner", false}}}), // o2-linter: disable=name/o2-task - adaptAnalysisTask(cfgc, TaskName{"DptDptCorrelationsTaskGen"}, SetDefaultProcesses{{{"processGenLevel", false}, {"processGenLevelMixed", false}, {"processCleaner", true}}})}; // o2-linter: disable=name/o2-task + adaptAnalysisTask(cfgc, TaskName{"DptDptCorrelationsRec"}, SetDefaultProcesses{{{"processRecLevel", true}, {"processRecLevelMixed", false}, {"processCleaner", false}}}), // o2-linter: disable=name/o2-task (It is adapted multiple times) + adaptAnalysisTask(cfgc, TaskName{"DptDptCorrelationsGen"}, SetDefaultProcesses{{{"processGenLevel", false}, {"processGenLevelMixed", false}, {"processCleaner", true}}})}; // o2-linter: disable=name/o2-task (It is adapted multiple times) return workflow; } diff --git a/PWGCF/Tasks/dptDptFilterQa.cxx b/PWGCF/Tasks/dptDptFilterQa.cxx index 97557016ffa..85dee751438 100644 --- a/PWGCF/Tasks/dptDptFilterQa.cxx +++ b/PWGCF/Tasks/dptDptFilterQa.cxx @@ -91,6 +91,7 @@ struct DptDptFilterQa { FilteredTracks const& tracks) { using namespace o2::analysis::dptdptfilterqa; + static constexpr int kNoOfIclusiveParticles = 2; /* number of inclusive charged particles, aka positive and negative */ if (collision.collisionaccepted() != uint8_t(true)) { histos.fill(HIST(Dirname[dir]) + HIST("SelectedEvents"), 0.5); @@ -103,7 +104,7 @@ struct DptDptFilterQa { int nTracksOneAndTwo = 0; int nTracksNone = 0; for (auto const& track : tracks) { - if (!(track.trackacceptedid() < 0) && !(track.trackacceptedid() < 2)) { + if (!(track.trackacceptedid() < 0) && !(track.trackacceptedid() < kNoOfIclusiveParticles)) { LOGF(fatal, "Task not prepared for identified particles"); } if (track.trackacceptedid() != 0 && track.trackacceptedid() != 1) { diff --git a/PWGCF/Tasks/matchRecoGen.cxx b/PWGCF/Tasks/matchRecoGen.cxx index 795a23e4152..57ab00301b7 100644 --- a/PWGCF/Tasks/matchRecoGen.cxx +++ b/PWGCF/Tasks/matchRecoGen.cxx @@ -69,7 +69,8 @@ struct MatchRecoGen { typedef enum { kBEFORE = 0, kAFTER } beforeafterselection; typedef enum { kPOSITIVE = 0, - kNEGATIVE } colllabelsign; + kNEGATIVE, + kNOOFCOLLSIGNS } colllabelsign; enum { kMATCH = 0, kDONTMATCH }; @@ -292,7 +293,7 @@ struct MatchRecoGen { using namespace o2::analysis::recogenmap; using namespace o2::analysis::dptdptfilter; - for (int i = 0; i < 2; ++i) { + for (int i = 0; i < kNOOFCOLLSIGNS; ++i) { mclabelpos[i].clear(); mclabelneg[i].clear(); mclabelpos[i].resize(mcParticles.size()); @@ -346,7 +347,7 @@ struct MatchRecoGen { using namespace o2::analysis::recogenmap; using namespace o2::analysis::dptdptfilter; - for (int i = 0; i < 2; ++i) { + for (int i = 0; i < kNOOFCOLLSIGNS; ++i) { mclabelpos[i].clear(); mclabelneg[i].clear(); mclabelpos[i].resize(mcParticles.size()); diff --git a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx index 6ef8f58b49b..0fdbca208bf 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/dptDptEfficiencyAndQc.cxx @@ -1067,20 +1067,20 @@ struct DptDptEfficiencyAndQc { /* Self configuration: requires dptdptfilter task in the workflow */ { /* the binning */ - getTaskOptionValue(initContext, "dpt-dpt-filter", "overallminp", overallminp, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mZVtxbins", zvtxbins, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mZVtxmin", zvtxlow, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mZVtxmax", zvtxup, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mPTbins", ptbins, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mPTmin", ptlow, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mPTmax", ptup, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mEtabins", etabins, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mEtamin", etalow, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mEtamax", etaup, false); - getTaskOptionValue(initContext, "dpt-dpt-filter", "binning.mPhibins", phibins, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgOverallMinP", overallminp, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mZVtxbins", zvtxbins, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mZVtxmin", zvtxlow, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mZVtxmax", zvtxup, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mPTbins", ptbins, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mPTmin", ptlow, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mPTmax", ptup, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mEtabins", etabins, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mEtamin", etalow, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mEtamax", etaup, false); + getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgBinning.mPhibins", phibins, false); /* configuring the involved species */ - std::vector cfgnames = {"elpidsel", "mupidsel", "pipidsel", "kapidsel", "prpidsel"}; + std::vector cfgnames = {"cfgElectronPIDSelection", "cfgMuonPIDSelection", "cfgPionPIDSelection", "cfgKaonPIDSelection", "cfgProtonPIDSelection"}; std::vector spids = {0, 1, 2, 3, 4}; for (uint i = 0; i < cfgnames.size(); ++i) { auto includeIt = [&initContext](int spid, auto name) { @@ -1116,7 +1116,7 @@ struct DptDptEfficiencyAndQc { /* create the data collecting engine instances according to the configured centrality/multiplicity ranges */ std::string centspec; - if (useCentrality.value && getTaskOptionValue(initContext, "dpt-dpt-filter", "centralities", centspec, false)) { + if (useCentrality.value && getTaskOptionValue(initContext, "dpt-dpt-filter", "cfgCentSpec", centspec, false)) { LOGF(info, "Got the centralities specification: %s", centspec.c_str()); auto tokens = TString(centspec.c_str()).Tokenize(","); ncmranges = tokens->GetEntries(); From e42874d02b478043c89a73f5c09de7f2d3bf2291 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Thu, 22 May 2025 18:05:40 +0900 Subject: [PATCH 1372/1650] [PWGEM/Dilepton] update treeCreatorElectronMLDDA.cxx (#11301) --- .../TableProducer/treeCreatorElectronMLDDA.cxx | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx index ab88e3a8091..178cc9748da 100644 --- a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx +++ b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx @@ -32,6 +32,7 @@ #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/PIDResponse.h" +#include "Common/CCDB/RCTSelectionFlags.h" #include "CommonConstants/PhysicsConstants.h" #include "DetectorsBase/Propagator.h" #include "DetectorsBase/GeometryManager.h" @@ -255,6 +256,12 @@ struct TreeCreatorElectronMLDDA { Configurable cfg_max_phiv_ee{"cfg_max_phiv_ee", 2.0, "max phiv for ee from pi0 dalitz decay in rad."}; } dalitzcuts; + // for RCT + Configurable cfgRequireGoodRCT{"cfgRequireGoodRCT", false, "require good detector flag in run condtion table"}; + Configurable cfgRCTLabel{"cfgRCTLabel", "CBT_hadronPID", "select 1 [CBT, CBT_hadron, CBT_muon_glo] see O2Physics/Common/CCDB/RCTSelectionFlags.h"}; + Configurable cfgCheckZDC{"cfgCheckZDC", false, "set ZDC flag for PbPb"}; + Configurable cfgTreatLimitedAcceptanceAsBad{"cfgTreatLimitedAcceptanceAsBad", false, "reject all events where the detectors relevant for the specified Runlist are flagged as LimitedAcceptance"}; + int mRunNumber; float d_bz; Service ccdb; @@ -263,6 +270,7 @@ struct TreeCreatorElectronMLDDA { const o2::dataformats::MeanVertexObject* mMeanVtx = nullptr; o2::base::MatLayerCylSet* lut = nullptr; o2::dataformats::DCA mDcaInfoCov; + o2::aod::rctsel::RCTFlagsChecker rctChecker; std::mt19937 engine; std::uniform_real_distribution dist01; @@ -277,6 +285,8 @@ struct TreeCreatorElectronMLDDA { ccdb->setLocalObjectValidityChecking(); ccdb->setFatalWhenNull(false); + rctChecker.init(cfgRCTLabel.value, cfgCheckZDC.value, cfgTreatLimitedAcceptanceAsBad.value); + if (useMatCorrType == 1) { LOGF(info, "TGeo correction requested, loading geometry"); if (!o2::base::GeometryManager::isGeometryLoaded()) { @@ -583,6 +593,11 @@ struct TreeCreatorElectronMLDDA { auto bc = collision.template foundBC_as(); initCCDB(bc); + if (cfgRequireGoodRCT && !rctChecker.checkTable(collision)) { + continue; + } + registry.fill(HIST("hEventCounter"), 2.0); // selected + auto v0s_coll = v0s.sliceBy(perCollision_v0, collision.globalIndex()); for (const auto& v0 : v0s_coll) { auto pos = v0.template posTrack_as(); From d07063481ecb6db46107b6b8fbc2c36a9ab8abc1 Mon Sep 17 00:00:00 2001 From: Shirajum Monira <38348689+Eloviyo@users.noreply.github.com> Date: Thu, 22 May 2025 11:22:51 +0200 Subject: [PATCH 1373/1650] [PWGCF] FemtoUniverse cascade task -- fixed cascade QA histogram and added TOF check for cascade-cascade (#11300) Co-authored-by: Shirajum Monira --- .../Core/FemtoUniverseParticleHisto.h | 8 ++-- ...toUniversePairTaskTrackCascadeExtended.cxx | 46 +++++++++++-------- 2 files changed, 31 insertions(+), 23 deletions(-) diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h index ff655e10f38..18f050b183f 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h @@ -117,8 +117,8 @@ class FemtoUniverseParticleHisto mHistogramRegistry->add((folderName + folderSuffix + "/hDecayVtxX").c_str(), "; #it{Vtx}_{x} (cm); Entries", kTH1F, {{2000, 0, 200}}); mHistogramRegistry->add((folderName + folderSuffix + "/hDecayVtxY").c_str(), "; #it{Vtx}_{y} (cm)); Entries", kTH1F, {{2000, 0, 200}}); mHistogramRegistry->add((folderName + folderSuffix + "/hDecayVtxZ").c_str(), "; #it{Vtx}_{z} (cm); Entries", kTH1F, {{2000, 0, 200}}); - mHistogramRegistry->add((folderName + folderSuffix + "/hInvMassCascade").c_str(), "; M_{Cascade}; Entries", kTH1F, {{2000, 1.f, 1.8f}}); - mHistogramRegistry->add((folderName + folderSuffix + "/hInvMassAntiCascade").c_str(), "; M_{AntiCascade}; Entries", kTH1F, {{2000, 1.f, 1.8f}}); + mHistogramRegistry->add((folderName + folderSuffix + "/hInvMassXi").c_str(), "; M_{Xi}; Entries", kTH1F, {{2000, 1.f, 1.8f}}); + mHistogramRegistry->add((folderName + folderSuffix + "/hInvMassOmega").c_str(), "; M_{Omega}; Entries", kTH1F, {{2000, 1.f, 1.8f}}); } } @@ -318,8 +318,8 @@ class FemtoUniverseParticleHisto mHistogramRegistry->fill(histFolder + HIST(o2::aod::femtouniverse_mc_particle::MCTypeName[mc]) + HIST("/hDecayVtxX"), part.decayVtxX()); mHistogramRegistry->fill(histFolder + HIST(o2::aod::femtouniverse_mc_particle::MCTypeName[mc]) + HIST("/hDecayVtxY"), part.decayVtxY()); mHistogramRegistry->fill(histFolder + HIST(o2::aod::femtouniverse_mc_particle::MCTypeName[mc]) + HIST("/hDecayVtxZ"), part.decayVtxZ()); - mHistogramRegistry->fill(histFolder + HIST(o2::aod::femtouniverse_mc_particle::MCTypeName[mc]) + HIST("/hInvMassCascade"), part.mLambda()); - mHistogramRegistry->fill(histFolder + HIST(o2::aod::femtouniverse_mc_particle::MCTypeName[mc]) + HIST("/hInvMassAntiCascade"), part.mAntiLambda()); + mHistogramRegistry->fill(histFolder + HIST(o2::aod::femtouniverse_mc_particle::MCTypeName[mc]) + HIST("/hInvMassXi"), part.mLambda()); + mHistogramRegistry->fill(histFolder + HIST(o2::aod::femtouniverse_mc_particle::MCTypeName[mc]) + HIST("/hInvMassOmega"), part.mAntiLambda()); } } diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx index 2d3ecde6f0e..95698459ffe 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx @@ -351,7 +351,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { } } PROCESS_SWITCH(femtoUniversePairTaskTrackCascadeExtended, processCascades, "Enable processing cascades", false); - /// track - cascade + /// track - cascade correlations void processSameEvent(const FilteredFDCollision& col, const FemtoFullParticles& parts) { auto groupPartsOne = partsOne->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); @@ -362,7 +362,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { const int multCol = confUseCent ? col.multV0M() : col.multNtr(); for (const auto& part : groupPartsTwo) { - if (!invMCascade(part.mLambda(), part.mAntiLambda(), confCascType1)) + if (!invMCascade(part.mLambda(), part.mAntiLambda(), confCascType1)) /// mLambda stores Xi mass, mAntiLambda stores Omega mass continue; cascQAHistos.fillQA(part); @@ -404,7 +404,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { } for (const auto& [p1, p2] : combinations(CombinationsFullIndexPolicy(groupPartsOne, groupPartsTwo))) { - // Cascade invariant mass cut + // Cascade inv mass cut (mLambda stores Xi mass, mAntiLambda stores Omega mass) if (!invMCascade(p2.mLambda(), p2.mAntiLambda(), confCascType1)) continue; // PID @@ -427,7 +427,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { } } PROCESS_SWITCH(femtoUniversePairTaskTrackCascadeExtended, processSameEvent, "Enable processing same event for track - cascade", false); - /// cascade - cascade + /// cascade - cascade correlations void processSameEventCasc(const FilteredFDCollision& col, const FemtoFullParticles& parts) { const auto& magFieldTesla = col.magField(); @@ -439,7 +439,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { const int multCol = confUseCent ? col.multV0M() : col.multNtr(); for (const auto& part : groupPartsTwo) { - if (!invMCascade(part.mLambda(), part.mAntiLambda(), confCascType1)) + if (!invMCascade(part.mLambda(), part.mAntiLambda(), confCascType1)) /// mLambda stores Xi mass, mAntiLambda stores Omega mass continue; cascQAHistos.fillQA(part); @@ -448,22 +448,24 @@ struct femtoUniversePairTaskTrackCascadeExtended { const auto& negChild = parts.iteratorAt(part.index() - 2); const auto& bachelor = parts.iteratorAt(part.index() - 1); /// Check daughters of first cascade - if (isParticleTPC(posChild, CascChildTable[confCascType1][0]) && isParticleTPC(negChild, CascChildTable[confCascType1][1]) && isParticleTPC(bachelor, CascChildTable[confCascType1][2])) { + if (!isParticleTPC(posChild, CascChildTable[confCascType1][0]) || !isParticleTPC(negChild, CascChildTable[confCascType1][1]) || !isParticleTPC(bachelor, CascChildTable[confCascType1][2])) + continue; + if (!isParticleTOF(posChild, CascChildTable[confCascType1][0]) || !isParticleTOF(negChild, CascChildTable[confCascType1][1]) || !isParticleTOF(bachelor, CascChildTable[confCascType1][2])) + continue; - posChildHistos.fillQA(posChild); - negChildHistos.fillQA(negChild); - bachHistos.fillQABase(bachelor, HIST("hBachelor")); - } + posChildHistos.fillQA(posChild); + negChildHistos.fillQA(negChild); + bachHistos.fillQABase(bachelor, HIST("hBachelor")); /// Check daughters of second cascade /*if (isParticleTPC(posChild, CascChildTable[confCascType2][0]) && isParticleTPC(negChild, CascChildTable[confCascType2][1]) && isParticleTPC(bachelor, CascChildTable[confCascType2][2])) { }*/ } auto pairDuplicateCheckFunc = [&](auto& p1, auto& p2) -> void { - // Cascade invariant mass cut for p1 + // Cascade inv mass cut for p1 (mLambda stores Xi mass, mAntiLambda stores Omega mass) if (!invMCascade(p1.mLambda(), p1.mAntiLambda(), confCascType1)) return; - // Cascade invariant mass cut for p2 + // Cascade inv mass cut for p2 if (!invMCascade(p2.mLambda(), p2.mAntiLambda(), confCascType2)) return; // track cleaning & checking for duplicate pairs @@ -477,10 +479,8 @@ struct femtoUniversePairTaskTrackCascadeExtended { auto pairProcessFunc = [&](auto& p1, auto& p2) -> void { if (cascDuplicates.contains(p1.globalIndex()) || cascDuplicates.contains(p2.globalIndex())) return; - // Cascade invariant mass cut for p1 if (!invMCascade(p1.mLambda(), p1.mAntiLambda(), confCascType1)) return; - // Cascade invariant mass cut for p2 if (!invMCascade(p2.mLambda(), p2.mAntiLambda(), confCascType2)) return; if (confIsCPR.value) { @@ -494,12 +494,16 @@ struct femtoUniversePairTaskTrackCascadeExtended { /// Child particles must pass this condition to be selected if (!isParticleTPC(posChild1, CascChildTable[confCascType1][0]) || !isParticleTPC(negChild1, CascChildTable[confCascType1][1]) || !isParticleTPC(bachelor1, CascChildTable[confCascType1][2])) return; + if (!isParticleTOF(posChild1, CascChildTable[confCascType1][0]) || !isParticleTOF(negChild1, CascChildTable[confCascType1][1]) || !isParticleTOF(bachelor1, CascChildTable[confCascType1][2])) + return; const auto& posChild2 = parts.iteratorAt(p2.index() - 3); const auto& negChild2 = parts.iteratorAt(p2.index() - 2); const auto& bachelor2 = parts.iteratorAt(p2.index() - 1); /// Child particles must pass this condition to be selected if (!isParticleTPC(posChild2, CascChildTable[confCascType2][0]) || !isParticleTPC(negChild2, CascChildTable[confCascType2][1]) || !isParticleTPC(bachelor2, CascChildTable[confCascType2][2])) return; + if (!isParticleTOF(posChild2, CascChildTable[confCascType2][0]) || !isParticleTOF(negChild2, CascChildTable[confCascType2][1]) || !isParticleTOF(bachelor2, CascChildTable[confCascType2][2])) + return; sameEventCont.setPair(p1, p2, multCol, confUse3D, 1.0f); }; @@ -523,7 +527,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { } } PROCESS_SWITCH(femtoUniversePairTaskTrackCascadeExtended, processSameEventCasc, "Enable processing same event for cascade - cascade", false); - /// track - cascade + /// track - cascade correlations void processMixedEvent(const FilteredFDCollisions& cols, const FemtoFullParticles& parts) { ColumnBinningPolicy colBinning{{confVtxBins, confMultBins}, true}; @@ -541,7 +545,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { continue; } for (const auto& [p1, p2] : combinations(CombinationsFullIndexPolicy(groupPartsOne, groupPartsTwo))) { - // Cascade invariant mass cut + // Cascade inv mass cut (mLambda stores Xi mass, mAntiLambda stores Omega mass) if (!invMCascade(p2.mLambda(), p2.mAntiLambda(), confCascType1)) continue; // PID @@ -567,7 +571,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { } } PROCESS_SWITCH(femtoUniversePairTaskTrackCascadeExtended, processMixedEvent, "Enable processing mixed event for track - cascade", false); - /// cascade - cascade + /// cascade - cascade correlations void processMixedEventCasc(const FilteredFDCollisions& cols, const FemtoFullParticles& parts) { ColumnBinningPolicy colBinning{{confVtxBins, confMultBins}, true}; @@ -585,10 +589,10 @@ struct femtoUniversePairTaskTrackCascadeExtended { continue; } for (const auto& [p1, p2] : combinations(CombinationsFullIndexPolicy(groupPartsOne, groupPartsTwo))) { - // Cascade invariant mass cut for p1 + // Cascade inv mass cut for p1 (mLambda stores Xi mass, mAntiLambda stores Omega mass) if (!invMCascade(p1.mLambda(), p1.mAntiLambda(), confCascType1)) continue; - // Cascade invariant mass cut for p2 + // Cascade inv mass cut for p2 if (!invMCascade(p2.mLambda(), p2.mAntiLambda(), confCascType2)) continue; @@ -598,12 +602,16 @@ struct femtoUniversePairTaskTrackCascadeExtended { /// Child particles must pass this condition to be selected if (!isParticleTPC(posChild1, CascChildTable[confCascType1][0]) || !isParticleTPC(negChild1, CascChildTable[confCascType1][1]) || !isParticleTPC(bachelor1, CascChildTable[confCascType1][2])) return; + if (!isParticleTOF(posChild1, CascChildTable[confCascType1][0]) || !isParticleTOF(negChild1, CascChildTable[confCascType1][1]) || !isParticleTOF(bachelor1, CascChildTable[confCascType1][2])) + return; const auto& posChild2 = parts.iteratorAt(p2.index() - 3); const auto& negChild2 = parts.iteratorAt(p2.index() - 2); const auto& bachelor2 = parts.iteratorAt(p2.index() - 1); /// Child particles must pass this condition to be selected if (!isParticleTPC(posChild2, CascChildTable[confCascType2][0]) || !isParticleTPC(negChild2, CascChildTable[confCascType2][1]) || !isParticleTPC(bachelor2, CascChildTable[confCascType2][2])) return; + if (!isParticleTOF(posChild2, CascChildTable[confCascType2][0]) || !isParticleTOF(negChild2, CascChildTable[confCascType2][1]) || !isParticleTOF(bachelor2, CascChildTable[confCascType2][2])) + return; // track cleaning if (!pairCleanerCasc.isCleanPair(p1, p2, parts)) { continue; From da27bf037eec0675758ea141f6cda10a24ea3c6d Mon Sep 17 00:00:00 2001 From: Andrea Giovanni Riffero Date: Thu, 22 May 2025 16:04:54 +0200 Subject: [PATCH 1374/1650] [PWGUD] Update FwdMuonsUPC (#11284) Co-authored-by: ariffero Co-authored-by: ALICE Action Bot --- PWGUD/Tasks/FwdMuonsUPC.cxx | 178 ++++++++++++++++++++++++------------ 1 file changed, 119 insertions(+), 59 deletions(-) diff --git a/PWGUD/Tasks/FwdMuonsUPC.cxx b/PWGUD/Tasks/FwdMuonsUPC.cxx index b35a2d8167c..0c4b3d81e3b 100644 --- a/PWGUD/Tasks/FwdMuonsUPC.cxx +++ b/PWGUD/Tasks/FwdMuonsUPC.cxx @@ -56,6 +56,7 @@ DECLARE_SOA_COLUMN(Pzp, pzp, float); DECLARE_SOA_COLUMN(Ptp, ptp, float); DECLARE_SOA_COLUMN(Etap, etap, float); DECLARE_SOA_COLUMN(Phip, phip, float); +DECLARE_SOA_COLUMN(TrackTypep, trackTypep, int); DECLARE_SOA_COLUMN(EnergyN, energyN, float); DECLARE_SOA_COLUMN(Pxn, pxn, float); DECLARE_SOA_COLUMN(Pyn, pyn, float); @@ -63,6 +64,7 @@ DECLARE_SOA_COLUMN(Pzn, pzn, float); DECLARE_SOA_COLUMN(Ptn, ptn, float); DECLARE_SOA_COLUMN(Etan, etan, float); DECLARE_SOA_COLUMN(Phin, phin, float); +DECLARE_SOA_COLUMN(TrackTypen, trackTypen, int); // zn DECLARE_SOA_COLUMN(Tzna, tzna, float); DECLARE_SOA_COLUMN(Ezna, ezna, float); @@ -77,8 +79,8 @@ DECLARE_SOA_TABLE(DiMu, "AOD", "DIMU", dimu::RunNumber, dimu::M, dimu::Energy, dimu::Px, dimu::Py, dimu::Pz, dimu::Pt, dimu::Rap, dimu::Phi, dimu::PhiAv, dimu::PhiCh, - dimu::EnergyP, dimu::Pxp, dimu::Pyp, dimu::Pzp, dimu::Ptp, dimu::Etap, dimu::Phip, - dimu::EnergyN, dimu::Pxn, dimu::Pyn, dimu::Pzn, dimu::Ptn, dimu::Etan, dimu::Phin, + dimu::EnergyP, dimu::Pxp, dimu::Pyp, dimu::Pzp, dimu::Ptp, dimu::Etap, dimu::Phip, dimu::TrackTypep, + dimu::EnergyN, dimu::Pxn, dimu::Pyn, dimu::Pzn, dimu::Ptn, dimu::Etan, dimu::Phin, dimu::TrackTypen, dimu::Tzna, dimu::Ezna, dimu::Tznc, dimu::Eznc, dimu::Nclass); } // namespace o2::aod @@ -86,28 +88,28 @@ DECLARE_SOA_TABLE(DiMu, "AOD", "DIMU", namespace gendimu { // dimuon -DECLARE_SOA_COLUMN(M, m, float); -DECLARE_SOA_COLUMN(Pt, pt, float); -DECLARE_SOA_COLUMN(Rap, rap, float); -DECLARE_SOA_COLUMN(Phi, phi, float); -DECLARE_SOA_COLUMN(PhiAv, phiAv, float); -DECLARE_SOA_COLUMN(PhiCh, phiCh, float); +DECLARE_SOA_COLUMN(GenM, genM, float); +DECLARE_SOA_COLUMN(GenPt, genPt, float); +DECLARE_SOA_COLUMN(GenRap, genRap, float); +DECLARE_SOA_COLUMN(GenPhi, genPhi, float); +DECLARE_SOA_COLUMN(GenPhiAv, genPhiAv, float); +DECLARE_SOA_COLUMN(GenPhiCh, genPhiCh, float); // tracks positive (p) and negative (n) -DECLARE_SOA_COLUMN(Ptp, ptp, float); -DECLARE_SOA_COLUMN(Etap, etap, float); -DECLARE_SOA_COLUMN(Phip, phip, float); -DECLARE_SOA_COLUMN(Ptn, ptn, float); -DECLARE_SOA_COLUMN(Etan, etan, float); -DECLARE_SOA_COLUMN(Phin, phin, float); +DECLARE_SOA_COLUMN(GenPtp, genPtp, float); +DECLARE_SOA_COLUMN(GenEtap, genEtap, float); +DECLARE_SOA_COLUMN(GenPhip, genPhip, float); +DECLARE_SOA_COLUMN(GenPtn, genPtn, float); +DECLARE_SOA_COLUMN(GenEtan, genEtan, float); +DECLARE_SOA_COLUMN(GenPhin, genPhin, float); } // namespace gendimu namespace o2::aod { DECLARE_SOA_TABLE(GenDimu, "AOD", "GENDIMU", - gendimu::M, gendimu::Pt, gendimu::Rap, gendimu::Phi, - gendimu::PhiAv, gendimu::PhiCh, - gendimu::Ptp, gendimu::Etap, gendimu::Phip, - gendimu::Ptn, gendimu::Etan, gendimu::Phin); + gendimu::GenM, gendimu::GenPt, gendimu::GenRap, gendimu::GenPhi, + gendimu::GenPhiAv, gendimu::GenPhiCh, + gendimu::GenPtp, gendimu::GenEtap, gendimu::GenPhip, + gendimu::GenPtn, gendimu::GenEtan, gendimu::GenPhin); } // namespace o2::aod // for saving tree with info on reco MC @@ -125,9 +127,11 @@ DECLARE_SOA_COLUMN(PhiCh, phiCh, float); DECLARE_SOA_COLUMN(Ptp, ptp, float); DECLARE_SOA_COLUMN(Etap, etap, float); DECLARE_SOA_COLUMN(Phip, phip, float); +DECLARE_SOA_COLUMN(TrackTypep, trackTypep, int); DECLARE_SOA_COLUMN(Ptn, ptn, float); DECLARE_SOA_COLUMN(Etan, etan, float); DECLARE_SOA_COLUMN(Phin, phin, float); +DECLARE_SOA_COLUMN(TrackTypen, trackTypen, int); // gen info dimuon DECLARE_SOA_COLUMN(GenPt, genPt, float); DECLARE_SOA_COLUMN(GenRap, genRap, float); @@ -147,8 +151,8 @@ DECLARE_SOA_TABLE(RecoDimu, "AOD", "RECODIMU", recodimu::RunNumber, recodimu::M, recodimu::Pt, recodimu::Rap, recodimu::Phi, recodimu::PhiAv, recodimu::PhiCh, - recodimu::Ptp, recodimu::Etap, recodimu::Phip, - recodimu::Ptn, recodimu::Etan, recodimu::Phin, + recodimu::Ptp, recodimu::Etap, recodimu::Phip, recodimu::TrackTypep, + recodimu::Ptn, recodimu::Etan, recodimu::Phin, recodimu::TrackTypen, recodimu::GenPt, recodimu::GenRap, recodimu::GenPhi, recodimu::GenPtp, recodimu::GenEtap, recodimu::GenPhip, recodimu::GenPtn, recodimu::GenEtan, recodimu::GenPhin); @@ -164,10 +168,18 @@ const float kRAbsMid = 26.5; const float kRAbsMax = 89.5; const float kPDca1 = 200.; const float kPDca2 = 200.; -const float kEtaMin = -4.0; -const float kEtaMax = -2.5; +float kEtaMin = -4.0; +float kEtaMax = -2.5; const float kPtMin = 0.; +const float kMaxAmpV0A = 100.; +const int kReqMatchMIDTracks = 2; +const int kReqMatchMFTTracks = 2; +const int kMaxChi2MFTMatch = 30; +const float kMaxZDCTime = 2.; +const float kMaxZDCTimeHisto = 10.; +const int kMuonPDG = 13; + struct FwdMuonsUPC { // a pdg object @@ -227,6 +239,10 @@ struct FwdMuonsUPC { Configurable nBinsZDCen{"nBinsZDCen", 200, "N bins in ZN energy"}; Configurable lowEnZN{"lowEnZN", -50., "lower limit in ZN energy histo"}; Configurable highEnZN{"highEnZN", 250., "upper limit in ZN energy histo"}; + // my track type + // 0 = MCH-MID-MFT + // 1 = MCH-MID + Configurable myTrackType{"myTrackType", 3, "My track type"}; void init(InitContext&) { @@ -237,9 +253,19 @@ struct FwdMuonsUPC { 0.60, 0.70, 0.80, 0.90, 1.00, 1.20, 1.40, 1.60, 1.80, 2.00, 2.50, 3.00, 3.50}; + std::vector ptFitBinningHalfWidth = { + 0.00, 0.005, 0.01, 0.015, 0.02, 0.025, 0.03, 0.035, 0.04, 0.045, 0.05, + 0.055, 0.06, 0.065, 0.07, 0.075, 0.08, 0.085, 0.09, 0.095, 0.10, + 0.105, 0.11, 0.115, 0.12, 0.125, 0.13, 0.135, 0.14, 0.145, 0.15, + 0.1625, 0.175, 0.1875, 0.20, 0.225, 0.25, 0.275, 0.30, 0.35, 0.40, + 0.45, 0.50, 0.55, 0.60, 0.65, 0.70, 0.75, 0.80, 0.85, 0.90, 0.95, 1.00, + 1.10, 1.20, 1.30, 1.40, 1.50, 1.60, 1.70, 1.80, 1.90, 2.00, 2.25, + 2.50, 2.75, 3.00, 3.25, 3.50}; + // axis const AxisSpec axisPt{nBinsPt, lowPt, highPt, "#it{p}_{T} GeV/#it{c}"}; const AxisSpec axisPtFit = {ptFitBinning, "#it{p}_{T} (GeV/c)"}; + const AxisSpec axisPtFit2 = {ptFitBinningHalfWidth, "#it{p}_{T} (GeV/c)"}; const AxisSpec axisMass{nBinsMass, lowMass, highMass, "m_{#mu#mu} GeV/#it{c}^{2}"}; const AxisSpec axisEta{nBinsEta, lowEta, highEta, "#eta"}; const AxisSpec axisRapidity{nBinsRapidity, lowRapidity, highRapidity, "Rapidity"}; @@ -256,6 +282,7 @@ struct FwdMuonsUPC { registry.add("hMass", "Invariant mass of muon pairs;;#counts", kTH1D, {axisMass}); registry.add("hPt", "Transverse momentum of muon pairs;;#counts", kTH1D, {axisPt}); registry.add("hPtFit", "Transverse momentum of muon pairs;;#counts", kTH1D, {axisPtFit}); + registry.add("hPtFit2", "Transverse momentum of muon pairs;;#counts", kTH1D, {axisPtFit2}); registry.add("hEta", "Pseudorapidty of muon pairs;;#counts", kTH1D, {axisEta}); registry.add("hRapidity", "Rapidty of muon pairs;;#counts", kTH1D, {axisRapidity}); registry.add("hPhi", "#varphi of muon pairs;;#counts", kTH1D, {axisPhi}); @@ -314,6 +341,7 @@ struct FwdMuonsUPC { mcRecoRegistry.add("hMass", "Invariant mass of muon pairs;;#counts", kTH1D, {axisMass}); mcRecoRegistry.add("hPt", "Transverse momentum of muon pairs;;#counts", kTH1D, {axisPt}); mcRecoRegistry.add("hPtFit", "Transverse momentum of muon pairs;;#counts", kTH1D, {axisPtFit}); + mcRecoRegistry.add("hPtFit2", "Transverse momentum of muon pairs;;#counts", kTH1D, {axisPtFit2}); mcRecoRegistry.add("hEta", "Pseudorapidty of muon pairs;;#counts", kTH1D, {axisEta}); mcRecoRegistry.add("hRapidity", "Rapidty of muon pairs;;#counts", kTH1D, {axisRapidity}); mcRecoRegistry.add("hPhi", "#varphi of muon pairs;;#counts", kTH1D, {axisPhi}); @@ -442,7 +470,7 @@ struct FwdMuonsUPC { float rAbs = fwdTrack.rAtAbsorberEnd(); float pDca = fwdTrack.pDca(); TLorentzVector p; - auto mMu = particleMass(13); + auto mMu = particleMass(kMuonPDG); p.SetXYZM(fwdTrack.px(), fwdTrack.py(), fwdTrack.pz(), mMu); float eta = p.Eta(); float pt = p.Pt(); @@ -462,18 +490,18 @@ struct FwdMuonsUPC { // function to compute phi for azimuth anisotropy void computePhiAnis(TLorentzVector p1, TLorentzVector p2, int sign1, float& phiAverage, float& phiCharge) { - TLorentzVector tSum, tDiffAv, tDiffCh; tSum = p1 + p2; + float halfUnity = 0.5; if (sign1 > 0) { tDiffCh = p1 - p2; - if (gRandom->Rndm() > 0.5) + if (gRandom->Rndm() > halfUnity) tDiffAv = p1 - p2; else tDiffAv = p2 - p1; } else { tDiffCh = p2 - p1; - if (gRandom->Rndm() > 0.5) + if (gRandom->Rndm() > halfUnity) tDiffAv = p2 - p1; else tDiffAv = p1 - p2; @@ -498,7 +526,7 @@ struct FwdMuonsUPC { const auto& ampsRelBCsV0A = cand.ampRelBCsV0A(); for (unsigned int i = 0; i < ampsV0A.size(); ++i) { if (std::abs(ampsRelBCsV0A[i]) <= 1) { - if (ampsV0A[i] > 100.) + if (ampsV0A[i] > kMaxAmpV0A) return; } } @@ -509,24 +537,39 @@ struct FwdMuonsUPC { return; } - // track selection - if (!isMuonSelected(*tr1)) - return; - if (!isMuonSelected(*tr2)) - return; - // MCH-MID match selection int nMIDs = 0; if (tr1.chi2MatchMCHMID() > 0) nMIDs++; if (tr2.chi2MatchMCHMID() > 0) nMIDs++; - if (nMIDs != 2) + if (nMIDs != kReqMatchMIDTracks) + return; + + // MFT-MID match selection (if MFT is requested by the trackType) + if (myTrackType == 0) { + // if MFT is requested check that the tracks is inside the MFT acceptance + kEtaMin = -3.6; + kEtaMax = -2.5; + + int nMFT = 0; + if (tr1.chi2MatchMCHMFT() > 0 && tr1.chi2MatchMCHMFT() < kMaxChi2MFTMatch) + nMFT++; + if (tr2.chi2MatchMCHMFT() > 0 && tr2.chi2MatchMCHMFT() < kMaxChi2MFTMatch) + nMFT++; + if (nMFT != kReqMatchMFTTracks) + return; + } + + // track selection + if (!isMuonSelected(*tr1)) + return; + if (!isMuonSelected(*tr2)) return; // form Lorentz vectors TLorentzVector p1, p2; - auto mMu = particleMass(13); + auto mMu = particleMass(kMuonPDG); p1.SetXYZM(tr1.px(), tr1.py(), tr1.pz(), mMu); p2.SetXYZM(tr2.px(), tr2.py(), tr2.pz(), mMu); TLorentzVector p = p1 + p2; @@ -554,9 +597,9 @@ struct FwdMuonsUPC { computePhiAnis(p1, p2, tr1.sign(), phiAverage, phiCharge); // zdc info - if (std::abs(zdc.timeA) < 10) + if (std::abs(zdc.timeA) < kMaxZDCTimeHisto) registry.fill(HIST("hTimeZNA"), zdc.timeA); - if (std::abs(zdc.timeC) < 10) + if (std::abs(zdc.timeC) < kMaxZDCTimeHisto) registry.fill(HIST("hTimeZNC"), zdc.timeC); registry.fill(HIST("hEnergyZN"), zdc.enA, zdc.enC); @@ -565,9 +608,9 @@ struct FwdMuonsUPC { bool neutronC = false; int znClass = -1; - if (std::abs(zdc.timeA) < 2) + if (std::abs(zdc.timeA) < kMaxZDCTime) neutronA = true; - if (std::abs(zdc.timeC) < 2) + if (std::abs(zdc.timeC) < kMaxZDCTime) neutronC = true; if (std::isinf(zdc.timeC)) @@ -615,6 +658,7 @@ struct FwdMuonsUPC { registry.fill(HIST("hMass"), p.M()); registry.fill(HIST("hPt"), p.Pt()); registry.fill(HIST("hPtFit"), p.Pt()); + registry.fill(HIST("hPtFit2"), p.Pt()); registry.fill(HIST("hEta"), p.Eta()); registry.fill(HIST("hRapidity"), p.Rapidity()); registry.fill(HIST("hPhi"), p.Phi()); @@ -628,15 +672,15 @@ struct FwdMuonsUPC { dimuSel(cand.runNumber(), p.M(), p.E(), p.Px(), p.Py(), p.Pz(), p.Pt(), p.Rapidity(), p.Phi(), phiAverage, phiCharge, - p1.E(), p1.Px(), p1.Py(), p1.Pz(), p1.Pt(), p1.PseudoRapidity(), p1.Phi(), - p2.E(), p2.Px(), p2.Py(), p2.Pz(), p2.Pt(), p2.PseudoRapidity(), p2.Phi(), + p1.E(), p1.Px(), p1.Py(), p1.Pz(), p1.Pt(), p1.PseudoRapidity(), p1.Phi(), static_cast(myTrackType), + p2.E(), p2.Px(), p2.Py(), p2.Pz(), p2.Pt(), p2.PseudoRapidity(), p2.Phi(), static_cast(myTrackType), zdc.timeA, zdc.enA, zdc.timeC, zdc.enC, znClass); } else { dimuSel(cand.runNumber(), p.M(), p.E(), p.Px(), p.Py(), p.Pz(), p.Pt(), p.Rapidity(), p.Phi(), phiAverage, phiCharge, - p2.E(), p2.Px(), p2.Py(), p2.Pz(), p2.Pt(), p2.PseudoRapidity(), p2.Phi(), - p1.E(), p1.Px(), p1.Py(), p1.Pz(), p1.Pt(), p1.PseudoRapidity(), p1.Phi(), + p2.E(), p2.Px(), p2.Py(), p2.Pz(), p2.Pt(), p2.PseudoRapidity(), p2.Phi(), static_cast(myTrackType), + p1.E(), p1.Px(), p1.Py(), p1.Pz(), p1.Pt(), p1.PseudoRapidity(), p1.Phi(), static_cast(myTrackType), zdc.timeA, zdc.enA, zdc.timeC, zdc.enC, znClass); } } @@ -648,12 +692,12 @@ struct FwdMuonsUPC { { // check that all pairs are mu+mu- - if (std::abs(McPart1.pdgCode()) != 13 && std::abs(McPart2.pdgCode()) != 13) + if (std::abs(McPart1.pdgCode()) != kMuonPDG && std::abs(McPart2.pdgCode()) != kMuonPDG) LOGF(debug, "PDG codes: %d | %d", McPart1.pdgCode(), McPart2.pdgCode()); // create Lorentz vectors TLorentzVector p1, p2; - auto mMu = particleMass(13); + auto mMu = particleMass(kMuonPDG); p1.SetXYZM(McPart1.px(), McPart1.py(), McPart1.pz(), mMu); p2.SetXYZM(McPart2.px(), McPart2.py(), McPart2.pz(), mMu); TLorentzVector p = p1 + p2; @@ -717,7 +761,7 @@ struct FwdMuonsUPC { { // check that all pairs are mu+mu- - if (std::abs(McPart1.pdgCode()) != 13 && std::abs(McPart2.pdgCode()) != 13) + if (std::abs(McPart1.pdgCode()) != kMuonPDG && std::abs(McPart2.pdgCode()) != kMuonPDG) LOGF(debug, "PDG codes: %d | %d", McPart1.pdgCode(), McPart2.pdgCode()); // V0 selection @@ -725,7 +769,7 @@ struct FwdMuonsUPC { const auto& ampsRelBCsV0A = cand.ampRelBCsV0A(); for (unsigned int i = 0; i < ampsV0A.size(); ++i) { if (std::abs(ampsRelBCsV0A[i]) <= 1) { - if (ampsV0A[i] > 100.) + if (ampsV0A[i] > kMaxAmpV0A) return; } } @@ -736,24 +780,39 @@ struct FwdMuonsUPC { return; } - // track selection - if (!isMuonSelected(*tr1)) - return; - if (!isMuonSelected(*tr2)) - return; - // MCH-MID match selection int nMIDs = 0; if (tr1.chi2MatchMCHMID() > 0) nMIDs++; if (tr2.chi2MatchMCHMID() > 0) nMIDs++; - if (nMIDs != 2) + if (nMIDs != kReqMatchMIDTracks) + return; + + // MFT-MID match selection (if MFT is requested by the trackType) + if (myTrackType == 0) { + // if MFT is requested check that the tracks is inside the MFT acceptance + kEtaMin = -3.6; + kEtaMax = -2.5; + + int nMFT = 0; + if (tr1.chi2MatchMCHMFT() > 0 && tr1.chi2MatchMCHMFT() < kMaxChi2MFTMatch) + nMFT++; + if (tr2.chi2MatchMCHMFT() > 0 && tr2.chi2MatchMCHMFT() < kMaxChi2MFTMatch) + nMFT++; + if (nMFT != kReqMatchMFTTracks) + return; + } + + // track selection + if (!isMuonSelected(*tr1)) + return; + if (!isMuonSelected(*tr2)) return; // form Lorentz vectors TLorentzVector p1, p2; - auto mMu = particleMass(13); + auto mMu = particleMass(kMuonPDG); p1.SetXYZM(tr1.px(), tr1.py(), tr1.pz(), mMu); p2.SetXYZM(tr2.px(), tr2.py(), tr2.pz(), mMu); TLorentzVector p = p1 + p2; @@ -812,6 +871,7 @@ struct FwdMuonsUPC { mcRecoRegistry.fill(HIST("hMass"), p.M()); mcRecoRegistry.fill(HIST("hPt"), p.Pt()); mcRecoRegistry.fill(HIST("hPtFit"), p.Pt()); + mcRecoRegistry.fill(HIST("hPtFit2"), p.Pt()); mcRecoRegistry.fill(HIST("hEta"), p.Eta()); mcRecoRegistry.fill(HIST("hRapidity"), p.Rapidity()); mcRecoRegistry.fill(HIST("hPhi"), p.Phi()); @@ -845,8 +905,8 @@ struct FwdMuonsUPC { dimuReco(cand.runNumber(), p.M(), p.Pt(), p.Rapidity(), p.Phi(), phiAverage, phiCharge, - p1.Pt(), p1.PseudoRapidity(), p1.Phi(), - p2.Pt(), p2.PseudoRapidity(), p2.Phi(), + p1.Pt(), p1.PseudoRapidity(), p1.Phi(), static_cast(myTrackType), + p2.Pt(), p2.PseudoRapidity(), p2.Phi(), static_cast(myTrackType), // gen info pMc.Pt(), pMc.Rapidity(), pMc.Phi(), p1Mc.Pt(), p1Mc.PseudoRapidity(), p1Mc.Phi(), @@ -855,8 +915,8 @@ struct FwdMuonsUPC { dimuReco(cand.runNumber(), p.M(), p.Pt(), p.Rapidity(), p.Phi(), phiAverage, phiCharge, - p2.Pt(), p2.PseudoRapidity(), p2.Phi(), - p1.Pt(), p1.PseudoRapidity(), p1.Phi(), + p2.Pt(), p2.PseudoRapidity(), p2.Phi(), static_cast(myTrackType), + p1.Pt(), p1.PseudoRapidity(), p1.Phi(), static_cast(myTrackType), // gen info pMc.Pt(), pMc.Rapidity(), pMc.Phi(), p2Mc.Pt(), p2Mc.PseudoRapidity(), p2Mc.Phi(), From c9e077b5d0156d3491d13424a04f5e07c68cdc62 Mon Sep 17 00:00:00 2001 From: AlexianL <123153896+AlexianL@users.noreply.github.com> Date: Thu, 22 May 2025 16:20:00 +0200 Subject: [PATCH 1375/1650] [PWGHF] taskFlow.cxx: change in histograms, change in MFT track selection, new process functions for MC (#11230) --- PWGHF/HFC/Tasks/taskFlow.cxx | 714 +++++++++++++++++++++++------------ 1 file changed, 467 insertions(+), 247 deletions(-) diff --git a/PWGHF/HFC/Tasks/taskFlow.cxx b/PWGHF/HFC/Tasks/taskFlow.cxx index 9050b5ac4f2..840357b0b3e 100644 --- a/PWGHF/HFC/Tasks/taskFlow.cxx +++ b/PWGHF/HFC/Tasks/taskFlow.cxx @@ -35,20 +35,26 @@ #include "Framework/StepTHn.h" #include "ReconstructionDataFormats/GlobalTrackID.h" +#include "Common/DataModel/CollisionAssociationTables.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/TrackSelectionTables.h" #include "CommonConstants/MathConstants.h" +#include "PWGMM/Mult/DataModel/Index.h" +#include "PWGMM/Mult/DataModel/bestCollisionTable.h" + #include "PWGCF/Core/CorrelationContainer.h" #include "PWGCF/Core/PairCuts.h" #include "PWGHF/Core/HfHelper.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" +#include "PWGHF/Utils/utilsPid.h" using namespace o2; using namespace o2::analysis; +using namespace o2::aod::pid_tpc_tof_utils; using namespace o2::constants::math; using namespace o2::framework; using namespace o2::framework::expressions; @@ -56,6 +62,9 @@ using namespace o2::framework::expressions; struct HfTaskFlow { // configurables for processing options + + Configurable centralityBinsForMc{"centralityBinsForMc", false, "false = OFF, true = ON for data like multiplicity/centrality bins for MC steps"}; + Configurable mftMaxDCAxy{"mftMaxDCAxy", 2.0f, "Cut on dcaXY for MFT tracks"}; Configurable doReferenceFlow{"doReferenceFlow", false, "Flag to know if reference flow should be done"}; Configurable processRun2{"processRun2", false, "Flag to run on Run 2 data"}; Configurable processRun3{"processRun3", true, "Flag to run on Run 3 data"}; @@ -68,19 +77,23 @@ struct HfTaskFlow { Configurable ptTpcTrackMin{"ptTpcTrackMin", 0.5f, "min. pT of TPC tracks"}; // configurables for HF candidates Configurable etaCandidateMax{"etaCandidateMax", 0.8f, "max. eta of HF candidate"}; - Configurable selectionFlagD0{"selectionFlagD0", 1, "Selection Flag for D0"}; - Configurable selectionFlagD0bar{"selectionFlagD0bar", 1, "Selection Flag for D0bar"}; - Configurable selectionFlagLcToPKPi{"selectionFlagLcToPKPi", 1, "Selection Flag for LambdaC"}; - Configurable selectionFlagLcToPiKP{"selectionFlagLcToPiKP", 1, "Selection Flag for LambdaC bar"}; - Configurable> binsPt{"binsPt", std::vector{hf_cuts_d0_to_pi_k::vecBinsPt}, "pT bin limits"}; - // configurables for MFT tracks - Configurable etaMftTrackMax{"etaMftTrackMax", 0, "Maximum value for the eta of MFT tracks"}; - Configurable etaMftTrackMin{"etaMftTrackMin", -5, "Minimum value for the eta of MFT tracks"}; + Configurable selectionFlagHf{"selectionFlagHf", 1, "Selection Flag for Hf candidates"}; + // Configurable selectionFlagD0{"selectionFlagD0", 1, "Selection Flag for D0"}; + // Configurable selectionFlagD0bar{"selectionFlagD0bar", 1, "Selection Flag for D0bar"}; + // Configurable selectionFlagLcToPKPi{"selectionFlagLcToPKPi", 1, "Selection Flag for LambdaC"}; + // Configurable selectionFlagLcToPiKP{"selectionFlagLcToPiKP", 1, "Selection Flag for LambdaC bar"}; + // configurables for MFT tracks + Configurable etaMftTrackMax{"etaMftTrackMax", -2.4f, "Maximum value for the eta of MFT tracks"}; + Configurable etaMftTrackMin{"etaMftTrackMin", -3.36f, "Minimum value for the eta of MFT tracks"}; + Configurable> mcTriggerPdgs{"mcTriggerPdgs", {421, -421}, "MC PDG codes to use exclusively as trigger particles. D0= +-421, Lc = +-4122"}; Configurable nClustersMftTrack{"nClustersMftTrack", 5, "Minimum number of clusters for the reconstruction of MFT tracks"}; + Configurable yCandGenMax{"yCandGenMax", 0.5, "max. gen particle rapidity"}; + Configurable yCandRecoMax{"yCandRecoMax", 0.8, "max. cand. rapidity"}; HfHelper hfHelper; SliceCache cache; Service pdg; + std::vector hfIndexCache; // ========================= // using declarations : DATA @@ -89,23 +102,28 @@ struct HfTaskFlow { using FilteredCollisionsWSelMult = soa::Filtered>; using HfCandidatesSelD0 = soa::Filtered>; using HfCandidatesSelLc = soa::Filtered>; - using TracksWDcaSel = soa::Filtered>; + // using FilteredMftTracksWColls = soa::Filtered>; + using FilteredMftTracksWColls = soa::Filtered; + using FilteredTracksWDcaSel = soa::Filtered>; // ========================= - // using declarations : MC + // using declarations : MONTE CARLO // ========================= // Even add McCollisions in the join ? // Kata adds subscribes to it but do not add it in the join - // using FilteredCollisionsWSelMultMC = soa::Filtered>; - using FilteredCollisionsWSelMultMC = soa::Filtered>; - using FilteredMcCollisions = soa::Filtered>; - using FilteredMcParticles = soa::Filtered; - using TracksWDcaSelMC = soa::Filtered>; + // using FilteredCollisionsWSelMultMcLabels = soa::Filtered>; - // Remnants, need Katarina's info - // using FilteredCollisionsWDcaSelMcLabels = soa::Filtered>; - // using FilteredTracksWDcaSelMcLabels = soa::Filtered>; + using FilteredCollisionsWSelMultMcLabels = soa::Filtered>; + using FilteredMcCollisions = soa::Filtered>; + using HfCandidatesSelD0McRec = soa::Join; + using HfCandidatesSelLcMcRec = soa::Join; + using McParticles = aod::McParticles; + using McParticles2ProngMatched = soa::Join; + using McParticles3ProngMatched = soa::Join; + // using FilteredMftTracksWCollsMcLabels = soa::Filtered>; + using FilteredMftTracksWCollsMcLabels = soa::Filtered>; + using FilteredTracksWDcaSelMC = soa::Filtered>; // ========================= // Filters & partitions : DATA @@ -113,11 +131,11 @@ struct HfTaskFlow { // HF candidate filter // TODO: use Partition instead of filter - Filter candidateFilterD0 = (aod::hf_sel_candidate_d0::isSelD0 >= selectionFlagD0) || - (aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlagD0bar); + Filter candidateFilterD0 = (aod::hf_sel_candidate_d0::isSelD0 >= selectionFlagHf) || + (aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlagHf); - Filter candidateFilterLc = (aod::hf_sel_candidate_lc::isSelLcToPKPi >= selectionFlagLcToPKPi) || - (aod::hf_sel_candidate_lc::isSelLcToPiKP >= selectionFlagLcToPiKP); + Filter candidateFilterLc = (aod::hf_sel_candidate_lc::isSelLcToPKPi >= selectionFlagHf) || + (aod::hf_sel_candidate_lc::isSelLcToPiKP >= selectionFlagHf); // Collision filters // FIXME: The filter is applied also on the candidates! Beware! @@ -127,49 +145,73 @@ struct HfTaskFlow { (aod::track::pt > ptTpcTrackMin) && requireGlobalTrackWoPtEtaInFilter(); + Filter mftTrackEtaFilter = (aod::fwdtrack::eta < etaMftTrackMax) && + (aod::fwdtrack::eta > etaMftTrackMin); + + Filter mftTrackCollisionIdFilter = (aod::fwdtrack::bestCollisionId >= 0); + + Filter mftTrackDcaFilter = (nabs(aod::fwdtrack::bestDCAXY) < mftMaxDCAxy); + // ========================= // Filters & partitions : MC // ========================= + Filter candidateFilterD0Mc = (aod::hf_sel_candidate_d0::isRecoHfFlag >= selectionFlagHf) || + (aod::hf_sel_candidate_d0::isRecoHfFlag >= selectionFlagHf); + + Filter candidateFilterLcMc = (aod::hf_sel_candidate_lc::isSelLcToPKPi >= selectionFlagHf) || + (aod::hf_sel_candidate_lc::isSelLcToPiKP >= selectionFlagHf); + // From Katarina's code, but not sure if I use it Filter mcCollisionFilter = nabs(aod::mccollision::posZ) < zVertexMax; - // From Katarina's code - Filter mcParticlesFilter = (nabs(aod::mcparticle::eta) < etaTpcTrackMax) && - (aod::mcparticle::pt > ptTpcTrackMin); //&& - //(aod::mcparticle::sign != 0) + // Filter mcParticlesFilter = (nabs(aod::mcparticle::eta) < etaTpcTrackMax) && + // (aod::mcparticle::pt > ptTpcTrackMin); + + // I didn't manage to make partitions work with my mixed event, as I am pair my tracks BEFORE looping over collisions + // I am thus not able to group tracks with sliceBy and can't use this method + // For now I am fine as I am doing only TPC-MFT correlations and using only McParticles with MFT acceptance + // However at some point I will have to use tracks from the other side (FV0, FT0-A) and I will have to do something about it + // TO-DO : either change how I do mixed event, or implement isAcceptedTpcMcParticle, isAcceptedMftMcParticle + // Partition mcParticlesMft = (aod::mcparticle::eta > etaMftTrackMin) && (aod::mcparticle::eta < etaMftTrackMax); + // Partition mcParticlesTpc = (nabs(aod::mcparticle::eta) < etaTpcTrackMax) && + // (aod::mcparticle::pt > ptTpcTrackMin); // ========================= // Preslice : DATA // ========================= - Preslice dataPerCol = aod::track::collisionId; + // Preslice dataPerCol = aod::track::collisionId; // ========================= // Preslice : MC // ========================= - Preslice mcTruthPerCol = aod::mcparticle::mcCollisionId; - // Do I have to adapt this preslice to MC ? How does it work exactly ? - // Preslice mcRecPerCol = aod::track::collisionId; + Preslice mftTracksPerCollision = aod::fwdtrack::collisionId; + // Preslice d0CandidatesPerCollision = aod::hf_cand::collisionId; + // Preslice mcPerCol = aod::mcparticle::mcCollisionId; + // PresliceUnsorted collisionsMcLabelPerMcCollision = aod::mccollisionlabel::mcCollisionId; // configurables for containers - ConfigurableAxis axisVertex{"axisVertex", {14, -7, 7}, "vertex axis for histograms"}; - ConfigurableAxis axisDeltaPhi{"axisDeltaPhi", {72, -PIHalf, PIHalf * 3}, "delta phi axis for histograms"}; - ConfigurableAxis axisDeltaEta{"axisDeltaEta", {48, -2.4, 2.4}, "delta eta axis for histograms"}; - ConfigurableAxis axisPt{"axisPt", {72, 0, 36}, "pt axis for histograms"}; - ConfigurableAxis axisPtTrigger{"axisPtTrigger", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 8.0}, "pt trigger axis for histograms"}; - ConfigurableAxis axisPtAssoc{"axisPtAssoc", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0}, "pt associated axis for histograms"}; - ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 100.1}, "multiplicity axis for histograms"}; - ConfigurableAxis axisVertexEfficiency{"axisVertexEfficiency", {10, -10, 10}, "vertex axis for efficiency histograms"}; - ConfigurableAxis axisEtaEfficiency{"axisEtaEfficiency", {20, -1.0, 1.0}, "eta axis for efficiency histograms"}; - ConfigurableAxis axisPtEfficiency{"axisPtEfficiency", {VARIABLE_WIDTH, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0}, "pt axis for efficiency histograms"}; // TODO: flow of HF will need to be done vs. invariant mass, in the signal and side-band regions // either 1) add invariant mass axis or 2) define several containers for different inv. mass regions // Note: don't forget to check inv. mass separately for D0 and D0bar candidate ConfigurableAxis axisMass{"axisMass", {120, 1.5848, 2.1848}, "axis of invariant mass of candidates"}; - ConfigurableAxis binsMixingVertex{"binsMixingVertex", {14, -7, 7}, "vertex bins for event mixing"}; ConfigurableAxis binsMixingMultiplicity{"binsMixingMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 100.1}, "multiplicity bins for event mixing"}; + ConfigurableAxis binsMixingVertex{"binsMixingVertex", {14, -7, 7}, "vertex bins for event mixing"}; + ConfigurableAxis axisEtaEfficiency{"axisEtaEfficiency", {20, -1.0, 1.0}, "eta axis for efficiency histograms"}; + ConfigurableAxis axisEtaMft{"axisEtaMft", {48, -4, -2}, "eta axis for MFT histograms"}; + ConfigurableAxis axisEtaTpc{"axisEtaTpc", {48, -1, 1}, "eta axis for TPC histograms"}; + ConfigurableAxis axisDeltaPhi{"axisDeltaPhi", {72, -PIHalf, PIHalf * 3}, "delta phi axis for histograms"}; + ConfigurableAxis axisDeltaEta{"axisDeltaEta", {48, -2.4, 2.4}, "delta eta axis for histograms"}; + ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 100.1}, "multiplicity axis for histograms"}; + ConfigurableAxis axisPhi{"axisPhi", {72, 0, TwoPI}, "phi axis for histograms"}; + ConfigurableAxis axisPt{"axisPt", {72, 0, 36}, "pt axis for histograms"}; + ConfigurableAxis axisPtAssoc{"axisPtAssoc", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0}, "pt associated axis for histograms"}; + ConfigurableAxis axisPtEfficiency{"axisPtEfficiency", {VARIABLE_WIDTH, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0}, "pt axis for efficiency histograms"}; + ConfigurableAxis axisPtTrigger{"axisPtTrigger", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 8.0}, "pt trigger axis for histograms"}; + ConfigurableAxis axisVertex{"axisVertex", {14, -7, 7}, "vertex axis for histograms"}; + ConfigurableAxis axisVertexEfficiency{"axisVertexEfficiency", {10, -10, 10}, "vertex axis for efficiency histograms"}; HistogramRegistry registry{"registry"}; @@ -180,8 +222,8 @@ struct HfTaskFlow { OutputObj mixedEventHf{"mixedEventHf"}; // Correlation containers used for Monte-Carlo - // OutputObj sameTPCTPCChChMC{"sameTPCTPCChChMC"}; - // OutputObj mixedTPCTPCChChMC{"mixedTPCTPCChChMC"}; + OutputObj sameEventHfMc{"sameEventHfMc"}; + OutputObj mixedEventHfMc{"mixedEventHfMc"}; // ========================= // init() @@ -216,14 +258,13 @@ struct HfTaskFlow { // DATA : associated particles histograms for TPC-TPC h-h same event registry.add("Data/TpcTpc/HadronHadron/SameEvent/hPt", "pT", {HistType::kTH1F, {axisPt}}); - registry.add("Data/TpcTpc/HadronHadron/SameEvent/hEta", "eta", {HistType::kTH1F, {axisDeltaEta}}); - registry.add("Data/TpcTpc/HadronHadron/SameEvent/hPhi", "phi", {HistType::kTH1F, {axisDeltaPhi}}); - registry.add("Data/TpcTpc/HadronHadron/SameEvent/hYields", "multiplicity vs pT vs eta", {HistType::kTH3F, {axisMultiplicity, axisPt, axisDeltaEta}}); - registry.add("Data/TpcTpc/HadronHadron/SameEvent/hEtaPhi", "multiplicity vs eta vs phi", {HistType::kTH3F, {axisMultiplicity, axisDeltaEta, axisDeltaPhi}}); - // registry.add("Data/TpcTpc/HadronHadron/SameEvent/hNtracks", "hNtracks", {HistType::kTH1F, {{500, 0, 500}}}); + registry.add("Data/TpcTpc/HadronHadron/SameEvent/hEta", "eta", {HistType::kTH1F, {axisEtaTpc}}); + registry.add("Data/TpcTpc/HadronHadron/SameEvent/hPhi", "phi", {HistType::kTH1F, {axisPhi}}); + registry.add("Data/TpcTpc/HadronHadron/SameEvent/hYields", "multiplicity vs pT vs eta", {HistType::kTH3F, {axisMultiplicity, axisPt, axisEtaTpc}}); + registry.add("Data/TpcTpc/HadronHadron/SameEvent/hEtaPhi", "multiplicity vs eta vs phi", {HistType::kTH3F, {axisMultiplicity, axisEtaTpc, axisPhi}}); // Katarina had this : - registry.add("Data/TpcTpc/HadronHadron/SameEvent/hVzEta", "eta vs. Vz", {HistType::kTH2F, {axisDeltaEta, axisVertex}}); + registry.add("Data/TpcTpc/HadronHadron/SameEvent/hVzEta", "eta vs. Vz", {HistType::kTH2F, {axisEtaTpc, axisVertex}}); // DATA : event mixing histograms for TPC-TPC h-h mixed event registry.add("Data/TpcTpc/HadronHadron/MixedEvent/hEventCountMixing", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); @@ -234,45 +275,45 @@ struct HfTaskFlow { // DATA : event histograms for TPC-TPC HF-h same event registry.add("Data/TpcTpc/HfHadron/SameEvent/hPt", "pT", {HistType::kTH1F, {axisPt}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/hEta", "eta", {HistType::kTH1F, {axisDeltaEta}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/hPhi", "phi", {HistType::kTH1F, {axisDeltaPhi}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/hYields", "multiplicity vs pT vs eta", {HistType::kTH3F, {axisMultiplicity, axisPt, axisDeltaEta}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/hEtaPhi", "multiplicity vs eta vs phi", {HistType::kTH3F, {axisMultiplicity, axisDeltaEta, axisDeltaPhi}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/hEta", "eta", {HistType::kTH1F, {axisEtaTpc}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/hPhi", "phi", {HistType::kTH1F, {axisPhi}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/hYields", "multiplicity vs pT vs eta", {HistType::kTH3F, {axisMultiplicity, axisPt, axisEtaTpc}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/hEtaPhi", "multiplicity vs eta vs phi", {HistType::kTH3F, {axisMultiplicity, axisEtaTpc, axisPhi}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hEventCountSame", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hEta", "eta", {HistType::kTH1F, {axisDeltaEta}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hPhi", "phi", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hEta", "eta", {HistType::kTH1F, {axisEtaTpc}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hPhi", "phi", {HistType::kTH1F, {axisPhi}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hMultiplicity", "multiplicity;multiplicity;entries", {HistType::kTH1F, {axisMultiplicity}}); registry.add("Data/TpcTpc/HfHadron/MixedEvent/hEventCountHFMixing", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); // DATA : trigger particles (candidates) histograms for TPC-TPC D0-h same event - auto vbins = (std::vector)binsPt; registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hPtCandidate", "2-prong candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hPtProng0", "2-prong candidates;prong 0 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hPtProng1", "2-prong candidates;prong 1 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hMassVsPt", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisMass, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hMassVsPt", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisMass, axisPt}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hMassVsPtVsMult", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2}); p_{T}; multiplicity", {HistType::kTH3F, {axisMass, axisPt, axisMultiplicity}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hMass", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH1F, {axisMass}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hEtaCandVsPt", "2-prong candidates;candidate #it{#eta};entries", {HistType::kTH2F, {axisDeltaEta, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hSelectionStatus", "2-prong candidates;selection status;entries", {HistType::kTH2F, {{5, -0.5, 4.5}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hEtaCandVsPt", "2-prong candidates;candidate #it{#eta};entries", {HistType::kTH2F, {axisEtaTpc, axisPt}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/2Prong/hSelectionStatus", "2-prong candidates;selection status;entries", {HistType::kTH2F, {{5, -0.5, 4.5}, axisPt}}); // ========================= // DATA : histograms for TPC-TPC HF-h case for 3PRONG // =================== registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hEventCountSame", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hMassVsPt", "3-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisMass, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hMassVsPt", "3-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisMass, axisPt}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hMass", "3-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH1F, {axisMass}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hMassVsPtVsMult", "3-prong candidates;inv. mass (p K #pi) (GeV/#it{c}^{2}); p_{T}; multiplicity", {HistType::kTH3F, {axisMass, {vbins, "#it{p}_{T} (GeV/#it{c})"}, axisMultiplicity}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hMassVsPtVsMult", "3-prong candidates;inv. mass (p K #pi) (GeV/#it{c}^{2}); p_{T}; multiplicity", {HistType::kTH3F, {axisMass, axisPt, axisMultiplicity}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hMultiplicity", "multiplicity;multiplicity;entries", {HistType::kTH1F, {axisMultiplicity}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPt", "3-prong candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPtProng0", "3-prong candidates;prong 0 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPtProng1", "3-prong candidates;prong 1 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPtProng2", "3-prong candidates;prong 2 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hEta", "3-prong candidates;#it{#eta};entries", {HistType::kTH1F, {axisDeltaEta}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPhi", "3-prong candidates;#it{#Phi};entries", {HistType::kTH1F, {axisDeltaPhi}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hEtaVsPt", "3-prong candidates;candidate #it{#eta};entries", {HistType::kTH2F, {axisDeltaEta, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPhiVsPt", "3-prong candidates;candidate #it{#Phi};entries", {HistType::kTH2F, {axisDeltaPhi, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hSelectionStatus", "3-prong candidates;selection status;entries", {HistType::kTH2F, {{5, -0.5, 4.5}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hEta", "3-prong candidates;#it{#eta};entries", {HistType::kTH1F, {axisEtaTpc}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPhi", "3-prong candidates;#it{#Phi};entries", {HistType::kTH1F, {axisPhi}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hEtaVsPt", "3-prong candidates;candidate #it{#eta};entries", {HistType::kTH2F, {axisEtaTpc, axisPt}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPhiVsPt", "3-prong candidates;candidate #it{#Phi};entries", {HistType::kTH2F, {axisPhi, axisPt}}); + registry.add("Data/TpcTpc/HfHadron/SameEvent/3Prong/hSelectionStatus", "3-prong candidates;selection status;entries", {HistType::kTH2F, {{5, -0.5, 4.5}, axisPt}}); // ========================= // DATA : histograms for TPC-MFT h-h case @@ -280,19 +321,19 @@ struct HfTaskFlow { // DATA : trigger particles (TPC tracks) histograms for TPC-MFT h-h same event registry.add("Data/TpcMft/HadronHadron/SameEvent/hEventCountSame", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); - registry.add("Data/TpcMft/HadronHadron/SameEvent/hEtaPhiTPC", "multiplicity vs eta vs phi in TPC", {HistType::kTH3F, {axisMultiplicity, axisDeltaEta, axisDeltaPhi}}); - registry.add("Data/TpcMft/HadronHadron/SameEvent/hEtaTPC", "etaTPC", {HistType::kTH1F, {axisDeltaEta}}); - registry.add("Data/TpcMft/HadronHadron/SameEvent/hPhiTPC", "phiTPC", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("Data/TpcMft/HadronHadron/SameEvent/hEtaPhiTPC", "multiplicity vs eta vs phi in TPC", {HistType::kTH3F, {axisMultiplicity, axisEtaTpc, axisPhi}}); + registry.add("Data/TpcMft/HadronHadron/SameEvent/hEtaTPC", "etaTPC", {HistType::kTH1F, {axisEtaTpc}}); + registry.add("Data/TpcMft/HadronHadron/SameEvent/hPhiTPC", "phiTPC", {HistType::kTH1F, {axisPhi}}); registry.add("Data/TpcMft/HadronHadron/SameEvent/hPtTPC", "pT", {HistType::kTH1F, {axisPt}}); - registry.add("Data/TpcMft/HadronHadron/SameEvent/hYieldsTPC", "multiplicity vs pT vs eta", {HistType::kTH3F, {axisMultiplicity, axisPt, axisDeltaEta}}); + registry.add("Data/TpcMft/HadronHadron/SameEvent/hYieldsTPC", "multiplicity vs pT vs eta", {HistType::kTH3F, {axisMultiplicity, axisPt, axisEtaTpc}}); registry.add("Data/TpcMft/HadronHadron/SameEvent/hMultiplicityTPC", "multiplicity;multiplicity;entries", {HistType::kTH1F, {axisMultiplicity}}); // DATA : associated particles (MFT tracks) histograms for TPC-MFT h-h same event - registry.add("Data/TpcMft/HadronHadron/SameEvent/hEtaPhiMFT", "multiplicity vs eta vs phi in MFT", {HistType::kTH3F, {axisMultiplicity, axisDeltaEta, axisDeltaPhi}}); - registry.add("Data/TpcMft/HadronHadron/SameEvent/hEtaMFT", "etaMFT", {HistType::kTH1F, {axisDeltaEta}}); - registry.add("Data/TpcMft/HadronHadron/SameEvent/hPhiMFT", "phiMFT", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("Data/TpcMft/HadronHadron/SameEvent/hEtaPhiMFT", "multiplicity vs eta vs phi in MFT", {HistType::kTH3F, {axisMultiplicity, axisEtaMft, axisPhi}}); + registry.add("Data/TpcMft/HadronHadron/SameEvent/hEtaMFT", "etaMFT", {HistType::kTH1F, {axisEtaMft}}); + registry.add("Data/TpcMft/HadronHadron/SameEvent/hPhiMFT", "phiMFT", {HistType::kTH1F, {axisPhi}}); registry.add("Data/TpcMft/HadronHadron/SameEvent/hPtMFT", "pT", {HistType::kTH1F, {axisPt}}); - registry.add("Data/TpcMft/HadronHadron/SameEvent/hYieldsMFT", "multiplicity vs pT vs eta", {HistType::kTH3F, {axisMultiplicity, axisPt, axisDeltaEta}}); + registry.add("Data/TpcMft/HadronHadron/SameEvent/hYieldsMFT", "multiplicity vs pT vs eta", {HistType::kTH3F, {axisMultiplicity, axisPt, axisEtaMft}}); // DATA : histograms for TPC-MFT h-h event mixing for events QA registry.add("Data/TpcMft/HadronHadron/MixedEvent/hEventCountMixing", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); @@ -303,27 +344,28 @@ struct HfTaskFlow { // DATA : trigger particles (candidates) histograms for TPC-MFT HF-h same event registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hEventCountSame", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hEtaPhiCandidate", "multiplicity vs eta vs phi in TPC", {HistType::kTH3F, {axisMultiplicity, axisDeltaEta, axisDeltaPhi}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hEtaCandidate", "etaTPC", {HistType::kTH1F, {axisDeltaEta}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hPhiCandidate", "phiTPC", {HistType::kTH1F, {axisDeltaPhi}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hYieldsCandidate", "multiplicity vs pT vs eta", {HistType::kTH3F, {axisMultiplicity, axisPt, axisDeltaEta}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hEtaPhiCandidate", "multiplicity vs eta vs phi in TPC", {HistType::kTH3F, {axisMultiplicity, axisEtaMft, axisPhi}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hEtaCandidate", "etaTPC", {HistType::kTH1F, {axisEtaMft}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hPhiCandidate", "phiTPC", {HistType::kTH1F, {axisPhi}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hYieldsCandidate", "multiplicity vs pT vs eta", {HistType::kTH3F, {axisMultiplicity, axisPt, axisEtaMft}}); registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hMultiplicityCandidate", "multiplicity;multiplicity;entries", {HistType::kTH1F, {axisMultiplicity}}); // DATA : trigger particles (candidates) histograms for TPC-MFT HF-h same event registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hPtCandidate", "2-prong candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hPtProng0", "2-prong candidates;prong 0 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hPtProng1", "2-prong candidates;prong 1 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hMassVsPt", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisMass, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hMassVsPt", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisMass, axisPt}}); registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hMass", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH1F, {axisMass}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hEtaCandVsPt", "2-prong candidates;candidate #it{#eta};entries", {HistType::kTH2F, {axisDeltaEta, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hSelectionStatus", "2-prong candidates;selection status;entries", {HistType::kTH2F, {{5, -0.5, 4.5}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hMassVsPtVsMult", "2-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2}); p_{T}; multiplicity", {HistType::kTH3F, {axisMass, axisPt, axisMultiplicity}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hEtaCandVsPt", "2-prong candidates;candidate #it{#eta};entries", {HistType::kTH2F, {axisEtaMft, axisPt}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/2Prong/hSelectionStatus", "2-prong candidates;selection status;entries", {HistType::kTH2F, {{5, -0.5, 4.5}, axisPt}}); // DATA : associated particles (MFT tracks) histograms for TPC-MFT h-h same event - registry.add("Data/TpcMft/HfHadron/SameEvent/hEtaPhiMFT", "multiplicity vs eta vs phi in MFT", {HistType::kTH3F, {axisMultiplicity, axisDeltaEta, axisDeltaPhi}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/hEtaMFT", "etaMFT", {HistType::kTH1F, {axisDeltaEta}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/hPhiMFT", "phiMFT", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/hEtaPhiMFT", "multiplicity vs eta vs phi in MFT", {HistType::kTH3F, {axisMultiplicity, axisEtaMft, axisPhi}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/hEtaMFT", "etaMFT", {HistType::kTH1F, {axisEtaMft}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/hPhiMFT", "phiMFT", {HistType::kTH1F, {axisPhi}}); registry.add("Data/TpcMft/HfHadron/SameEvent/hPtMFT", "pT", {HistType::kTH1F, {axisPt}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/hYieldsMFT", "multiplicity vs pT vs eta", {HistType::kTH3F, {axisMultiplicity, axisPt, axisDeltaEta}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/hYieldsMFT", "multiplicity vs pT vs eta", {HistType::kTH3F, {axisMultiplicity, axisPt, axisEtaMft}}); // DATA : histograms for TPC-MFT h-h event mixing for events QA registry.add("Data/TpcMft/HfHadron/MixedEvent/hEventCountMixing", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); @@ -333,21 +375,21 @@ struct HfTaskFlow { // ========================= registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hEventCountSame", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hYieldsCandidate", "multiplicity vs pT vs eta", {HistType::kTH3F, {axisMultiplicity, axisPt, axisDeltaEta}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hYieldsCandidate", "multiplicity vs pT vs eta", {HistType::kTH3F, {axisMultiplicity, axisPt, axisEtaMft}}); registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hMultiplicityCandidate", "multiplicity;multiplicity;entries", {HistType::kTH1F, {axisMultiplicity}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hEtaPhiCandidate", "multiplicity vs eta vs phi in TPC", {HistType::kTH3F, {axisMultiplicity, axisDeltaEta, axisDeltaPhi}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hMassVsPt", "3-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisMass, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hEtaPhiCandidate", "multiplicity vs eta vs phi in TPC", {HistType::kTH3F, {axisMultiplicity, axisEtaMft, axisPhi}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hMassVsPt", "3-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisMass, axisPt}}); registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hMass", "3-prong candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH1F, {axisMass}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hMassVsPtVsMult", "3-prong candidates;inv. mass (p K #pi) (GeV/#it{c}^{2}); p_{T}; multiplicity", {HistType::kTH3F, {axisMass, {vbins, "#it{p}_{T} (GeV/#it{c})"}, axisMultiplicity}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hMassVsPtVsMult", "3-prong candidates;inv. mass (p K #pi) (GeV/#it{c}^{2}); p_{T}; multiplicity", {HistType::kTH3F, {axisMass, axisPt, axisMultiplicity}}); registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hPt", "3-prong candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hPtProng0", "3-prong candidates;prong 0 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hPtProng1", "3-prong candidates;prong 1 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hPtProng2", "3-prong candidates;prong 2 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hEta", "3-prong candidates;#it{#eta};entries", {HistType::kTH1F, {axisDeltaEta}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hPhi", "3-prong candidates;#it{#Phi};entries", {HistType::kTH1F, {axisDeltaPhi}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hEtaVsPt", "3-prong candidates;candidate #it{#eta};entries", {HistType::kTH2F, {axisDeltaEta, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hPhiVsPt", "3-prong candidates;candidate #it{#Phi};entries", {HistType::kTH2F, {axisDeltaPhi, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); - registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hSelectionStatus", "3-prong candidates;selection status;entries", {HistType::kTH2F, {{5, -0.5, 4.5}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hEta", "3-prong candidates;#it{#eta};entries", {HistType::kTH1F, {axisEtaMft}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hPhi", "3-prong candidates;#it{#Phi};entries", {HistType::kTH1F, {axisPhi}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hEtaVsPt", "3-prong candidates;candidate #it{#eta};entries", {HistType::kTH2F, {axisEtaMft, axisPt}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hPhiVsPt", "3-prong candidates;candidate #it{#Phi};entries", {HistType::kTH2F, {axisPhi, axisPt}}); + registry.add("Data/TpcMft/HfHadron/SameEvent/3Prong/hSelectionStatus", "3-prong candidates;selection status;entries", {HistType::kTH2F, {{5, -0.5, 4.5}, axisPt}}); // ========================= // MC : histograms for TPC-TPC h-h case @@ -362,18 +404,18 @@ struct HfTaskFlow { registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hMultiplicityPrimary", "hMultiplicityPrimary", {HistType::kTH1F, {axisMultiplicity}}); // histograms for MC associated particles registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hPt", "pT", {HistType::kTH1F, {axisPt}}); - registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hEta", "eta", {HistType::kTH1F, {axisDeltaEta}}); - registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hPhi", "phi", {HistType::kTH1F, {axisDeltaPhi}}); - registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hYields", "multiplicity vs pT vs eta", {HistType::kTH3F, {axisMultiplicity, axisPt, axisDeltaEta}}); - registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hEtaPhi", "multiplicity vs eta vs phi", {HistType::kTH3F, {axisMultiplicity, axisDeltaEta, axisDeltaPhi}}); + registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hEta", "eta", {HistType::kTH1F, {axisEtaTpc}}); + registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hPhi", "phi", {HistType::kTH1F, {axisPhi}}); + registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hYields", "multiplicity vs pT vs eta", {HistType::kTH3F, {axisMultiplicity, axisPt, axisEtaTpc}}); + registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hEtaPhi", "multiplicity vs eta vs phi", {HistType::kTH3F, {axisMultiplicity, axisEtaTpc, axisPhi}}); registry.add("MC/Rec/TpcTpc/HadronHadron/SameEvent/hNtracks", "hNtracks", {HistType::kTH1F, {axisMultiplicity}}); // histograms for MC particles in event mixing registry.add("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hEventCountMixing", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); registry.add("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hMultiplicityMixing", "hMultiplicityMixing", {HistType::kTH1F, {axisMultiplicity}}); registry.add("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hVtxZMixing", "hVtxZMixing", {HistType::kTH1F, {axisVertex}}); registry.add("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hPtMixing", "pT", {HistType::kTH1F, {axisPt}}); - registry.add("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hEtaMixing", "eta", {HistType::kTH1F, {axisDeltaEta}}); - registry.add("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hPhiMixing", "phi", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hEtaMixing", "eta", {HistType::kTH1F, {axisEtaTpc}}); + registry.add("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hPhiMixing", "phi", {HistType::kTH1F, {axisPhi}}); registry.add("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hNtracksMixing", "hNtracksMixing", {HistType::kTH1F, {axisMultiplicity}}); // MC Truth @@ -385,18 +427,18 @@ struct HfTaskFlow { registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hMultiplicityPrimary", "hMultiplicityPrimary", {HistType::kTH1F, {axisMultiplicity}}); // histograms for MC associated particles registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hPt", "pT", {HistType::kTH1F, {axisPt}}); - registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hEta", "eta", {HistType::kTH1F, {axisDeltaEta}}); - registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hPhi", "phi", {HistType::kTH1F, {axisDeltaPhi}}); - registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hYields", "multiplicity vs pT vs eta", {HistType::kTH3F, {axisMultiplicity, axisPt, axisDeltaEta}}); - registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hEtaPhi", "multiplicity vs eta vs phi", {HistType::kTH3F, {axisMultiplicity, axisDeltaEta, axisDeltaPhi}}); + registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hEta", "eta", {HistType::kTH1F, {axisEtaTpc}}); + registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hPhi", "phi", {HistType::kTH1F, {axisPhi}}); + registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hYields", "multiplicity vs pT vs eta", {HistType::kTH3F, {axisMultiplicity, axisPt, axisEtaTpc}}); + registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hEtaPhi", "multiplicity vs eta vs phi", {HistType::kTH3F, {axisMultiplicity, axisEtaTpc, axisPhi}}); registry.add("MC/Gen/TpcTpc/HadronHadron/SameEvent/hNtracks", "hNtracks", {HistType::kTH1F, {axisMultiplicity}}); // histograms for MC particles in event mixing registry.add("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hEventCountMixing", "bin", {HistType::kTH1F, {{nBinsMix + 2, -2.5, -0.5 + nBinsMix, "bin"}}}); registry.add("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hMultiplicityMixing", "hMultiplicityMixing", {HistType::kTH1F, {axisMultiplicity}}); registry.add("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hVtxZMixing", "hVtxZMixing", {HistType::kTH1F, {axisVertex}}); registry.add("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hPtMixing", "pT", {HistType::kTH1F, {axisPt}}); - registry.add("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hEtaMixing", "eta", {HistType::kTH1F, {axisDeltaEta}}); - registry.add("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hPhiMixing", "phi", {HistType::kTH1F, {axisDeltaPhi}}); + registry.add("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hEtaMixing", "eta", {HistType::kTH1F, {axisEtaTpc}}); + registry.add("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hPhiMixing", "phi", {HistType::kTH1F, {axisPhi}}); registry.add("MC/Gen/TpcTpc/HadronHadron/MixedEvent/hNtracksMixing", "hNtracksMixing", {HistType::kTH1F, {axisMultiplicity}}); // ========================= @@ -421,8 +463,8 @@ struct HfTaskFlow { mixedEventHf.setObject(new CorrelationContainer("mixedEventHf", "mixedEventHf", corrAxis, effAxis, userAxis)); // initialization of correlation containes for monte-carlo - // sameTPCTPCChChMC.setObject(new CorrelationContainer("sameTPCTPCChChMC", "sameTPCTPCChChMC", corrAxis, effAxis, {})); - // mixedTPCTPCChChMC.setObject(new CorrelationContainer("mixedTPCTPCChChMC", "mixedTPCTPCChChMC", corrAxis, effAxis, {})); + sameEventHfMc.setObject(new CorrelationContainer("sameEventHfMc", "sameEventHfMc", corrAxis, effAxis, userAxis)); + mixedEventHfMc.setObject(new CorrelationContainer("mixedEventHfMc", "mixedEventHfMc", corrAxis, effAxis, userAxis)); } // End of init() function // ========================= @@ -454,7 +496,7 @@ struct HfTaskFlow { template void fillTpcTpcChChSameEventQaMc(float multiplicity, TTrack const& track) { - if constexpr (std::is_same_v) { // if MC Rec + if constexpr (std::is_same_v) { // if MC Rec registry.fill(HIST("MC/Rec/TpcTpc/HadronHadron/SameEvent/hPt"), track.pt()); registry.fill(HIST("MC/Rec/TpcTpc/HadronHadron/SameEvent/hEta"), track.eta()); registry.fill(HIST("MC/Rec/TpcTpc/HadronHadron/SameEvent/hPhi"), track.phi()); @@ -517,25 +559,27 @@ struct HfTaskFlow { { float phi = candidate.phi(); o2::math_utils::bringTo02Pi(phi); - + auto eta = candidate.eta(); auto pt = candidate.pt(); - if (candidate.isSelD0() >= selectionFlagD0) { + if (candidate.isSelD0() >= selectionFlagHf) { + registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hMassVsPtVsMult"), hfHelper.invMassD0ToPiK(candidate), pt, multiplicity); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hMassVsPt"), hfHelper.invMassD0ToPiK(candidate), pt); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hMass"), hfHelper.invMassD0ToPiK(candidate)); } - if (candidate.isSelD0bar() >= selectionFlagD0bar) { + if (candidate.isSelD0bar() >= selectionFlagHf) { + registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hMassVsPtVsMult"), hfHelper.invMassD0barToKPi(candidate), pt, multiplicity); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hMassVsPt"), hfHelper.invMassD0barToKPi(candidate), pt); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hMass"), hfHelper.invMassD0barToKPi(candidate)); } registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hMultiplicity"), multiplicity); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hEta"), candidate.eta()); + registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hEta"), eta); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hPhi"), phi); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hPtCandidate"), pt); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hPtProng0"), candidate.ptProng0()); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hPtProng1"), candidate.ptProng1()); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hEtaCandVsPt"), candidate.eta(), pt); + registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hEtaCandVsPt"), eta, pt); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/2Prong/hSelectionStatus"), candidate.isSelD0() + (candidate.isSelD0bar() * 2), pt); } @@ -551,13 +595,14 @@ struct HfTaskFlow { auto ptProng0 = candidate.ptProng0(); auto ptProng1 = candidate.ptProng1(); auto ptProng2 = candidate.ptProng2(); + auto eta = candidate.eta(); - if (candidate.isSelLcToPKPi() >= selectionFlagLcToPKPi) { + if (candidate.isSelLcToPKPi() >= selectionFlagHf) { registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hMass"), hfHelper.invMassLcToPKPi(candidate)); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hMassVsPtVsMult"), hfHelper.invMassLcToPKPi(candidate), pt, multiplicity); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hMassVsPt"), hfHelper.invMassLcToPKPi(candidate), pt); } - if (candidate.isSelLcToPiKP() >= selectionFlagLcToPiKP) { + if (candidate.isSelLcToPiKP() >= selectionFlagHf) { registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hMass"), hfHelper.invMassLcToPiKP(candidate)); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hMassVsPtVsMult"), hfHelper.invMassLcToPiKP(candidate), pt, multiplicity); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hMassVsPt"), hfHelper.invMassLcToPiKP(candidate), pt); @@ -568,8 +613,8 @@ struct HfTaskFlow { registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPtProng0"), ptProng0); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPtProng1"), ptProng1); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPtProng2"), ptProng2); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hEta"), candidate.eta()); - registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hEtaVsPt"), candidate.eta(), pt); + registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hEta"), eta); + registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hEtaVsPt"), eta, pt); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPhi"), phi); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hPhiVsPt"), phi, pt); registry.fill(HIST("Data/TpcTpc/HfHadron/SameEvent/3Prong/hSelectionStatus"), candidate.isSelLcToPKPi(), pt); @@ -585,11 +630,13 @@ struct HfTaskFlow { auto pt = candidate.pt(); o2::math_utils::bringTo02Pi(phi); - if (candidate.isSelD0() >= selectionFlagD0) { + if (candidate.isSelD0() >= selectionFlagHf) { + registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/2Prong/hMassVsPtVsMult"), hfHelper.invMassD0ToPiK(candidate), pt, multiplicity); registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/2Prong/hMassVsPt"), hfHelper.invMassD0ToPiK(candidate), pt); registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/2Prong/hMass"), hfHelper.invMassD0ToPiK(candidate)); } - if (candidate.isSelD0bar() >= selectionFlagD0bar) { + if (candidate.isSelD0bar() >= selectionFlagHf) { + registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/2Prong/hMassVsPtVsMult"), hfHelper.invMassD0barToKPi(candidate), pt, multiplicity); registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/2Prong/hMassVsPt"), hfHelper.invMassD0barToKPi(candidate), pt); registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/2Prong/hMass"), hfHelper.invMassD0barToKPi(candidate)); } @@ -619,12 +666,12 @@ struct HfTaskFlow { float phi = candidate.phi(); o2::math_utils::bringTo02Pi(phi); - if (candidate.isSelLcToPKPi() >= selectionFlagLcToPKPi) { + if (candidate.isSelLcToPKPi() >= selectionFlagHf) { registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hMass"), hfHelper.invMassLcToPKPi(candidate)); registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hMassVsPtVsMult"), hfHelper.invMassLcToPKPi(candidate), pt, multiplicity); registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hMassVsPt"), hfHelper.invMassLcToPKPi(candidate), pt); } - if (candidate.isSelLcToPiKP() >= selectionFlagLcToPiKP) { + if (candidate.isSelLcToPiKP() >= selectionFlagHf) { registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hMass"), hfHelper.invMassLcToPiKP(candidate)); registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hMassVsPtVsMult"), hfHelper.invMassLcToPiKP(candidate), pt, multiplicity); registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hMassVsPt"), hfHelper.invMassLcToPiKP(candidate), pt); @@ -645,6 +692,24 @@ struct HfTaskFlow { registry.fill(HIST("Data/TpcMft/HfHadron/SameEvent/3Prong/hSelectionStatus"), candidate.isSelLcToPiKP(), pt); } + // ========================= + // Helper functions + // ========================= + + HfProngSpecies getSpecies(int pdgCode) + { + switch (std::abs(pdgCode)) { + case PDG_t::kPiPlus: // positive or negative pion + return HfProngSpecies::Pion; + case PDG_t::kKPlus: // positive or negative kaon + return HfProngSpecies::Kaon; + case PDG_t::kProton: // proton or proton bar + return HfProngSpecies::Proton; + default: // NOTE. The efficiency histogram is hardcoded to contain 4 species. Anything special will have the last slot. + return HfProngSpecies::NHfProngSpecies; + } + } + // ========================= // Cuts with functions // ========================= @@ -683,14 +748,21 @@ struct HfTaskFlow { if (etaCandidateMax >= 0. && std::abs(etaCandidate) > etaCandidateMax) { return false; } + if (yCandRecoMax >= 0. && std::abs(hfHelper.yLc(candidate)) > yCandRecoMax) { + return false; + } return true; } else { // For now, that means we do D0 + // Doesn't this exclude D0bar ? if (!(candidate.hfflag() & 1 << aod::hf_cand_2prong::DecayType::D0ToPiK)) { return false; } if (etaCandidateMax >= 0. && std::abs(etaCandidate) > etaCandidateMax) { return false; } + if (yCandRecoMax >= 0. && std::abs(hfHelper.yD0(candidate)) > yCandRecoMax) { + return false; + } return true; } } @@ -702,9 +774,9 @@ struct HfTaskFlow { bool isAcceptedMftTrack(TTrack const& mftTrack) { // cut on the eta of MFT tracks - if (mftTrack.eta() > etaMftTrackMax || mftTrack.eta() < etaMftTrackMin) { - return false; - } + // if (mftTrack.eta() > etaMftTrackMax || mftTrack.eta() < etaMftTrackMin) { + // return false; + // } // cut on the number of clusters of the reconstructed MFT track if (mftTrack.nClusters() < nClustersMftTrack) { @@ -715,30 +787,89 @@ struct HfTaskFlow { } // I am not sure if to template McParticles is useful, I'll address this when doing the MC Gen case of HF-h correlations - template - bool isMcParticleSelected(TMcParticles& mcParticles) + template + bool isAcceptedMcCandidate(TMcTrack& mcCandidate) + { + auto etaCandidate = mcCandidate.eta(); + + if constexpr (std::is_same_v) { // For now, that means we do D0 + if (std::abs(mcCandidate.flagMcMatchGen()) == 1 << aod::hf_cand_2prong::DecayType::D0ToPiK) { + + if (etaCandidateMax >= 0. && std::abs(etaCandidate) > etaCandidateMax) { + return false; + } + + if (yCandGenMax >= 0. && std::abs(RecoDecay::y(mcCandidate.pVector(), o2::constants::physics::MassD0)) > yCandGenMax) { + return false; + } + + // Later on, if I want to add prompt/non-prompt selection, below is how to select prompt only + // if (!(particle.originMcGen() == RecoDecay::OriginType::Prompt)){ + // return false; + // } + } + } else { // For now, that means we do LambdaC + if (std::abs(mcCandidate.flagMcMatchGen()) == 1 << aod::hf_cand_3prong::DecayType::LcToPKPi) { + + if (etaCandidateMax >= 0. && std::abs(etaCandidate) > etaCandidateMax) { + return false; + } + + if (yCandGenMax >= 0. && std::abs(RecoDecay::y(mcCandidate.pVector(), o2::constants::physics::MassLambdaCPlus)) > yCandGenMax) { + return false; + } + + // Later on, if I want to add prompt/non-prompt selection, below is how to select prompt only + // if (!(particle.originMcGen() == RecoDecay::OriginType::Prompt)){ + // return false; + // } + } + } + + return true; + } + + // I am not sure if to template McParticles is useful, I'll address this when doing the MC Gen case of HF-h correlations + template + bool isAcceptedMftMcParticle(TMcParticle& mcParticle) { // remove MC particles with charge = 0 - TParticlePDG* pdgparticle = pdg->GetParticle(mcParticles.pdgCode()); + TParticlePDG* pdgparticle = pdg->GetParticle(mcParticle.pdgCode()); if (pdgparticle != nullptr) { if (pdgparticle->Charge() == 0) { return false; } } + /* // MC particle has to be primary if constexpr (step <= CorrelationContainer::kCFStepAnaTopology) { - return mcParticles.isPhysicalPrimary(); + return mcParticle.isPhysicalPrimary(); } - return true; + */ + + if (mcParticle.eta() > etaMftTrackMax || mcParticle.eta() < etaMftTrackMin) { + return false; + } + + // return true; + return mcParticle.isPhysicalPrimary(); } - // ========================= + // =============================================================================================================================================================================== + // =============================================================================================================================================================================== // Correlation functions - // ========================= + // =============================================================================================================================================================================== + // =============================================================================================================================================================================== + + // =============================================================================================================================================================================== + // fillCorrelations + // =============================================================================================================================================================================== template - void fillCorrelations(TTarget target, TTracksTrig const& tracks1, TTracksAssoc const& tracks2, float multiplicity, float posZ, bool sameEvent) + void fillCorrelations(TTarget target, + TTracksTrig const& tracks1, TTracksAssoc const& tracks2, + float multiplicity, float posZ, bool sameEvent) { auto triggerWeight = 1; auto associatedWeight = 1; @@ -747,6 +878,9 @@ struct HfTaskFlow { // I fill it only for the first trigger track of the collision auto loopCounter = 0; + // + // TRIGGER PARTICLE + // for (const auto& track1 : tracks1) { loopCounter++; @@ -764,7 +898,7 @@ struct HfTaskFlow { bool fillingHFcontainer = false; double invmass = 0; if constexpr (std::is_same_v || std::is_same_v) { - // TODO: Check how to put this into a Filter + // TODO: Check how to put this into a Filter -> Pretty sure it cannot be a filter if (!isAcceptedCandidate(track1)) { continue; } @@ -778,15 +912,20 @@ struct HfTaskFlow { } } - // From Katarina's code - // in case of MC-generated, do additional selection on MCparticles : charge and isPhysicalPrimary - // if (processMc) { - // NOTE : this version with FilteredMcParticles is only for MC truth - if constexpr (std::is_same_v || std::is_same_v) { - if (!isMcParticleSelected(track1)) { + // Selections for MC GENERATED + if constexpr (std::is_same_v || std::is_same_v) { + // TODO: Check how to put this into a Filter -> Pretty sure it cannot be a filter + if (!isAcceptedMcCandidate(track1)) { continue; } - // TO-DO : add other if constexpr conditions when I will have more MC cases + fillingHFcontainer = true; + if constexpr (std::is_same_v) { // If D0 + invmass = o2::constants::physics::MassD0; + // Should add D0 bar ? + } else { // If Lc + invmass = o2::constants::physics::MassLambdaCPlus; + // Should add Lc bar ? (maybe not its the same mass right ?) + } } // fill single-track distributions @@ -798,9 +937,9 @@ struct HfTaskFlow { // FILL QA PLOTS for trigger particle if (sameEvent) { - if (processMc == false) { // If DATA - if constexpr (!std::is_same_v) { // IF TPC-TPC case - if constexpr (std::is_same_v) { // IF D0 CASE -> TPC-TPC D0-h + if (processMc == false) { // If DATA + if constexpr (!std::is_same_v) { // IF TPC-TPC case + if constexpr (std::is_same_v) { // IF D0 CASE -> TPC-TPC D0-h fillTpcTpcD0CandidateQa(multiplicity, track1); } else if constexpr (std::is_same_v) { // IF LC CASE -> TPC-TPC Lc-h fillTpcTpcLcCandidateQa(multiplicity, track1); @@ -817,17 +956,20 @@ struct HfTaskFlow { } // end of if condition for TPC-TPC or TPC-MFT case } // Maybe I won't need it for MC (first files are way lighter in MC, but also I need to loop over all tracks in MC GEN) - } else { // If MC (add cases later) - if constexpr (!std::is_same_v) { // IF TPC-TPC case + } else { // If MC (add cases later) + if constexpr (!std::is_same_v) { // IF TPC-TPC case fillTpcTpcChChSameEventQaMc(multiplicity, track1); } } } + // + // ASSOCIATED PARTICLE + // for (const auto& track2 : tracks2) { // apply cuts for MFT tracks - if constexpr (std::is_same_v) { + if constexpr (std::is_same_v) { if (!isAcceptedMftTrack(track2)) { continue; } @@ -843,8 +985,8 @@ struct HfTaskFlow { // in case of HF-h correlations, remove candidate daughters from the pool of associated hadrons // with which the candidate is being correlated (will not have to do it for TPC-MFT case) - if constexpr (!std::is_same_v) { // if NOT TPC-MFT case -> TPC-TPC case - if constexpr (std::is_same_v) { // Remove the 2 prong daughters + if constexpr (!std::is_same_v) { // if NOT TPC-MFT case -> TPC-TPC case + if constexpr (std::is_same_v) { // Remove the 2 prong daughters if ((track1.prong0Id() == track2.globalIndex()) || (track1.prong1Id() == track2.globalIndex())) { continue; } @@ -858,11 +1000,10 @@ struct HfTaskFlow { // in case of MC-generated, do additional selection on MCparticles : charge and isPhysicalPrimary // if (processMc) { - if constexpr (std::is_same_v || std::is_same_v) { - if (!isMcParticleSelected(track2)) { + if constexpr (std::is_same_v || std::is_same_v) { + if (!isAcceptedMftMcParticle(track2)) { continue; } - // Note : no need for HF if condition as this will always be normal track, but maybe for MFT } float eta2 = track2.eta(); @@ -890,8 +1031,8 @@ struct HfTaskFlow { // FILL QA PLOTS for associated particle if (sameEvent && (loopCounter == 1)) { // if constexpr (std::is_same_v) { // If DATA - if constexpr (!std::is_same_v) { // IF TPC-TPC case - if constexpr (std::is_same_v) { // IF D0 CASE -> TPC-TPC D0-h + if constexpr (!std::is_same_v) { // IF TPC-TPC case + if constexpr (std::is_same_v) { // IF D0 CASE -> TPC-TPC D0-h fillTpcTpcHfChSameEventQa(multiplicity, track2); } else if constexpr (std::is_same_v) { // IF LC CASE -> TPC-TPC Lc-h fillTpcTpcHfChSameEventQa(multiplicity, track2); @@ -915,8 +1056,15 @@ struct HfTaskFlow { } // end of loop over tracks 1 } + // =============================================================================================================================================================================== + // mixCollisions for RECONSTRUCTED events + // =============================================================================================================================================================================== + template - void mixCollisions(TCollisions const& collisions, TTracksTrig const& tracks1, TTracksAssoc const& tracks2, TLambda getPartsSize, OutputObj& corrContainer) + void mixCollisions(TCollisions const& collisions, + TTracksTrig const& tracks1, TTracksAssoc const& tracks2, + TLambda getPartsSize, + OutputObj& corrContainer) { // The first one that I call "Data" should work for data and mc rec using BinningTypeData = FlexibleBinningPolicy, aod::collision::PosZ, decltype(getPartsSize)>; @@ -941,10 +1089,10 @@ struct HfTaskFlow { const auto multiplicityTracks1 = getPartsSize(collision1); - if constexpr (std::is_same_v) { // If MC + if constexpr (std::is_same_v) { // If MC registry.fill(HIST("MC/Rec/TpcTpc/HadronHadron/MixedEvent/hEventCountMixing"), bin); } else { // If not MC - if constexpr (std::is_same_v) { // IF TPC-MFT case + if constexpr (std::is_same_v) { // IF TPC-MFT case if constexpr (std::is_same_v || std::is_same_v) { // IF HF-h case -> TPC-MFT HF-h registry.fill(HIST("Data/TpcMft/HfHadron/MixedEvent/hEventCountMixing"), bin); } else { // IF h-h case -> TPC-MFT h-h case @@ -964,24 +1112,27 @@ struct HfTaskFlow { } } - // template - // void mixCollisions(FilteredCollisionsWSelMult const& collisions, TTracksTrig const& tracks1, TTracksAssoc const& tracks2, TLambda getPartsSize, OutputObj& corrContainer) - template - void mixCollisionsMcTruth(TCollisions const& collisions, TTracksTrig const& tracks1, TTracksAssoc const& tracks2, TLambda getPartsSize, OutputObj& corrContainer) + // =============================================================================================================================================================================== + // mixCollisions for GENERATED events + // =============================================================================================================================================================================== + + template + void mixCollisionsMcTruth(TMcCollisions const& mcCollisions, + TTracksTrig const& tracks1, TTracksAssoc const& tracks2, + TLambda getPartsSize, OutputObj& corrContainer) { using BinningTypeMcTruth = FlexibleBinningPolicy, aod::mccollision::PosZ, decltype(getPartsSize)>; - BinningTypeMcTruth binningWithTracksSize{{getPartsSize}, {axisVertex, axisMultiplicity}, true}; + BinningTypeMcTruth binningWithTracksSize{{getPartsSize}, {binsMixingVertex, binsMixingMultiplicity}, true}; auto tracksTuple = std::make_tuple(tracks1, tracks2); - Pair pair{binningWithTracksSize, nMixedEvents, -1, collisions, tracksTuple, &cache}; + Pair pair{binningWithTracksSize, nMixedEvents, -1, mcCollisions, tracksTuple, &cache}; for (const auto& [collision1, tracks1, collision2, tracks2] : pair) { - auto binningValues = binningWithTracksSize.getBinningValues(collision1, collisions); + auto binningValues = binningWithTracksSize.getBinningValues(collision1, mcCollisions); int bin = binningWithTracksSize.getBin(binningValues); - const auto multiplicity = tracks2.size(); // get multiplicity of charged hadrons, which is used for slicing in mixing - // const auto vz = collision1.posZ(); + const auto multiplicity = getPartsSize(collision1); // get multiplicity of charged hadrons, which is used for slicing in mixing // TO BE DONE : ADD ONE MORE IF CONDITION TO FILL THE MC CASE // TODO : FILL NEW PLOTS FOR MCTRUTH ONLY @@ -992,12 +1143,22 @@ struct HfTaskFlow { } } + // =================================================================================================================================================================================================================================================================== + // =================================================================================================================================================================================================================================================================== + // SAME EVENT PROCESS FUNCTIONS + // =================================================================================================================================================================================================================================================================== + // =================================================================================================================================================================================================================================================================== + + // =================================================================================================================================================================================================================================================================== + // DATA + // =================================================================================================================================================================================================================================================================== + // ===================================== // DATA : process same event correlations: TPC-TPC h-h case // ===================================== void processSameTpcTpcChCh(FilteredCollisionsWSelMult::iterator const& collision, - TracksWDcaSel const& tracks) + FilteredTracksWDcaSel const& tracks) { if (!(isAcceptedCollision(collision, true))) { return; @@ -1008,7 +1169,6 @@ struct HfTaskFlow { // options are ran at the same time // temporary solution, since other correlation options always have to be ran with h-h, too // TODO: rewrite it in a more intelligent way - // const auto multiplicity = tracks.size(); const auto multiplicity = collision.multNTracksPV(); registry.fill(HIST("Data/TpcTpc/HadronHadron/SameEvent/hMultiplicity"), multiplicity); registry.fill(HIST("Data/TpcTpc/HadronHadron/SameEvent/hVtxZ"), collision.posZ()); @@ -1029,7 +1189,7 @@ struct HfTaskFlow { // ===================================== void processSameTpcTpcD0Ch(FilteredCollisionsWSelMult::iterator const& collision, - TracksWDcaSel const& tracks, + FilteredTracksWDcaSel const& tracks, HfCandidatesSelD0 const& candidates) { auto fillEventSelectionPlots = true; @@ -1058,7 +1218,7 @@ struct HfTaskFlow { // ===================================== void processSameTpcTpcLcCh(FilteredCollisionsWSelMult::iterator const& collision, - TracksWDcaSel const& tracks, + FilteredTracksWDcaSel const& tracks, HfCandidatesSelLc const& candidates) { auto fillEventSelectionPlots = true; @@ -1087,8 +1247,8 @@ struct HfTaskFlow { // ===================================== void processSameTpcMftChCh(FilteredCollisionsWSelMult::iterator const& collision, - TracksWDcaSel const& tracks, - aod::MFTTracks const& mftTracks) + FilteredTracksWDcaSel const& tracks, + FilteredMftTracksWColls const& mftTracks) { if (!(isAcceptedCollision(collision, true))) { return; @@ -1111,8 +1271,8 @@ struct HfTaskFlow { void processSameTpcMftD0Ch(FilteredCollisionsWSelMult::iterator const& collision, HfCandidatesSelD0 const& candidates, - TracksWDcaSel const& /*tracks*/, - aod::MFTTracks const& mftTracks) + FilteredTracksWDcaSel const& /*tracks*/, + FilteredMftTracksWColls const& mftTracks) { auto fillEventSelectionPlots = true; @@ -1141,8 +1301,8 @@ struct HfTaskFlow { void processSameTpcMftLcCh(FilteredCollisionsWSelMult::iterator const& collision, HfCandidatesSelLc const& candidates, - TracksWDcaSel const& /*tracks*/, - aod::MFTTracks const& mftTracks) + FilteredTracksWDcaSel const& /*tracks*/, + FilteredMftTracksWColls const& mftTracks) { auto fillEventSelectionPlots = true; @@ -1165,53 +1325,64 @@ struct HfTaskFlow { } PROCESS_SWITCH(HfTaskFlow, processSameTpcMftLcCh, "DATA : Process same-event correlations for TPC-MFT Lc-h case", false); + // =================================================================================================================================================================================================================================================================== + // MONTE-CARLO + // =================================================================================================================================================================================================================================================================== + // ===================================== - // MONTE-CARLO : process same event correlations: TPC-TPC h-h case + // MONTE-CARLO GENERATED : process same event correlations : TPC-MFT D0-ch. part. case // ===================================== - // Katarina's version = MC Truth - void processSameTpcTpcChChmcGEN(FilteredMcCollisions::iterator const& mcCollision, - FilteredMcParticles const& mcParticles) + void processSameTpcMftD0ChMcGen(FilteredMcCollisions::iterator const& mcCollision, + McParticles2ProngMatched const& mcParticles2Prong, + McParticles const& mcParticles) { + const auto multiplicity = mcCollision.multMCPVz(); - // Not sure why to use this - // if (collisions.size() == 0) { - // return; - //} + BinningPolicyBase<2> baseBinning{{axisVertex, axisMultiplicity}, true}; + // int bin = baseBinning.getBin(std::make_tuple(mcCollision.posZ(), multiplicity)); + // registry.fill(HIST("MC/Gen/TpcMft/HfHadron/SameEvent/2Prong/hEventCountSame"), bin); - // if (!collision.has_mcCollision()) { - // LOGF(info, "No MC collision for this collision, skip..."); - // return; - // } + sameEventHfMc->fillEvent(multiplicity, CorrelationContainer::kCFStepAll); + fillCorrelations(sameEventHfMc, mcParticles2Prong, mcParticles, multiplicity, mcCollision.posZ(), true); + } + PROCESS_SWITCH(HfTaskFlow, processSameTpcMftD0ChMcGen, "MONTE-CARLO : Process same-event correlations for TPC-MFT D0-h case", false); - // TODO : check if I have to get my multiplicity based on multNTracksPV or mcParticles.size() - // const auto multiplicity = mcParticles.size(); // Note: these are all MC particles after selection (not only primary) + // ===================================== + // MONTE-CARLO GENERATED : process same event correlations : TPC-MFT Lc-ch. part. case + // ===================================== + + void processSameTpcMftLcChMcGen(FilteredMcCollisions::iterator const& mcCollision, + McParticles3ProngMatched const& mcParticles3Prong, + McParticles const& mcParticles) + { const auto multiplicity = mcCollision.multMCPVz(); - registry.fill(HIST("MC/Gen/TpcTpc/HadronHadron/SameEvent/hMultiplicity"), multiplicity); - registry.fill(HIST("MC/Gen/TpcTpc/HadronHadron/SameEvent/hVtxZ"), mcCollision.posZ()); - - // fill correlations for all MC collisions - // In Katka's code, the first time doing this does not fill the histograms, right now will be filled two times.. - // auto multPrimaryCharge0 = fillTpcTpcChChSameEventQaMc(multiplicity, mcParticles); - sameEvent->fillEvent(multiplicity, CorrelationContainer::kCFStepAll); - fillCorrelations(sameEvent, mcParticles, mcParticles, multiplicity, mcCollision.posZ(), true); - - // TO-DO : fill correlation container for MC collisions that have a reconstructed collision - // got rid of the second const auto for multPrimaryCharge0 - // This line below for sure induce that some plots are filled two times - // multPrimaryCharge0 = fillTpcTpcChChSameEventQaMc(multiplicity, mcParticles); - // sameTPCTPCChChMC->fillEvent(multPrimaryCharge0, CorrelationContainer::kCFStepVertex); - // fillCorrelations(sameTPCTPCChChMC, mcParticles, mcParticles, multPrimaryCharge0, mcCollision.posZ(), true); + + BinningPolicyBase<2> baseBinning{{axisVertex, axisMultiplicity}, true}; + // int bin = baseBinning.getBin(std::make_tuple(mcCollision.posZ(), multiplicity)); + // registry.fill(HIST("MC/Gen/TpcMft/HfHadron/SameEvent/2Prong/hEventCountSame"), bin); + + sameEventHfMc->fillEvent(multiplicity, CorrelationContainer::kCFStepAll); + fillCorrelations(sameEventHfMc, mcParticles3Prong, mcParticles, multiplicity, mcCollision.posZ(), true); } - PROCESS_SWITCH(HfTaskFlow, processSameTpcTpcChChmcGEN, "MONTE-CARLO : Process same-event correlations for TPC-TPC h-h case", false); + PROCESS_SWITCH(HfTaskFlow, processSameTpcMftLcChMcGen, "MONTE-CARLO : Process same-event correlations for TPC-MFT Lc-h case", false); + + // =================================================================================================================================================================================================================================================================== + // =================================================================================================================================================================================================================================================================== + // MIXED EVENT PROCESS FUNCTIONS + // =================================================================================================================================================================================================================================================================== + // =================================================================================================================================================================================================================================================================== + + // =================================================================================================================================================================================================================================================================== + // DATA + // =================================================================================================================================================================================================================================================================== // ===================================== // DATA : process mixed event correlations:TPC-TPC h-h case // ===================================== - // TO BECOME DATA & MC REC ? void processMixedTpcTpcChCh(FilteredCollisionsWSelMult const& collisions, - TracksWDcaSel const& tracks) + FilteredTracksWDcaSel const& tracks) { // we want to group collisions based on charged-track multiplicity // auto getTracksSize = [&tracks, this](FilteredCollisionsWSelMult::iterator const& col) { @@ -1235,10 +1406,9 @@ struct HfTaskFlow { // ===================================== void processMixedTpcTpcD0Ch(FilteredCollisionsWSelMult const& collisions, - TracksWDcaSel const& tracks, + FilteredTracksWDcaSel const& tracks, HfCandidatesSelD0 const& candidates) { - // we want to group collisions based on charged-track multiplicity auto getMultiplicity = [](FilteredCollisionsWSelMult::iterator const& collision) { auto multiplicity = collision.numContrib(); return multiplicity; @@ -1253,18 +1423,15 @@ struct HfTaskFlow { // ===================================== void processMixedTpcTpcLcCh(FilteredCollisionsWSelMult const& collisions, - TracksWDcaSel const& tracks, + FilteredTracksWDcaSel const& tracks, HfCandidatesSelLc const& candidates) { - // we want to group collisions based on charged-track multiplicity - auto getTracksSize = [&tracks, this](FilteredCollisionsWSelMult::iterator const& col) { - // Still o2::aod::track::collisionId with HF ??? -> I don't think so - auto associatedTracks = tracks.sliceByCached(o2::aod::track::collisionId, col.globalIndex(), this->cache); - auto size = associatedTracks.size(); - return size; + auto getMultiplicity = [](FilteredCollisionsWSelMult::iterator const& collision) { + auto multiplicity = collision.numContrib(); + return multiplicity; }; - mixCollisions(collisions, candidates, tracks, getTracksSize, mixedEventHf); + mixCollisions(collisions, candidates, tracks, getMultiplicity, mixedEventHf); } PROCESS_SWITCH(HfTaskFlow, processMixedTpcTpcLcCh, "DATA : Process mixed-event correlations for TPC-TPC Lc-h case", false); @@ -1273,16 +1440,9 @@ struct HfTaskFlow { // ===================================== void processMixedTpcMftChCh(FilteredCollisionsWSelMult const& collisions, - TracksWDcaSel const& tracks, - aod::MFTTracks const& mftTracks) + FilteredTracksWDcaSel const& tracks, + FilteredMftTracksWColls const& mftTracks) { - // we want to group collisions based on charged-track multiplicity - // auto getTracksSize = [&tracks, this](FilteredCollisionsWSelMult::iterator const& col) { - // auto associatedTracks = tracks.sliceByCached(o2::aod::track::collisionId, col.globalIndex(), this->cache); - // auto size = associatedTracks.size(); - // return size; - // }; - auto getMultiplicity = [](FilteredCollisionsWSelMult::iterator const& collision) { auto multiplicity = collision.numContrib(); return multiplicity; @@ -1298,10 +1458,9 @@ struct HfTaskFlow { void processMixedTpcMftD0Ch(FilteredCollisionsWSelMult const& collisions, HfCandidatesSelD0 const& candidates, - aod::MFTTracks const& mftTracks, - TracksWDcaSel const& /*tracks*/) + FilteredMftTracksWColls const& mftTracks, + FilteredTracksWDcaSel const& /*tracks*/) { - // we want to group collisions based on charged-track multiplicity auto getMultiplicity = [](FilteredCollisionsWSelMult::iterator const& collision) { auto multiplicity = collision.numContrib(); return multiplicity; @@ -1317,10 +1476,8 @@ struct HfTaskFlow { void processMixedTpcMftLcCh(FilteredCollisionsWSelMult const& collisions, HfCandidatesSelLc const& candidates, - aod::MFTTracks const& mftTracks) + FilteredMftTracksWColls const& mftTracks) { - - // we want to group collisions based on charged-track multiplicity auto getMultiplicity = [](FilteredCollisionsWSelMult::iterator const& collision) { auto multiplicity = collision.numContrib(); return multiplicity; @@ -1330,33 +1487,96 @@ struct HfTaskFlow { } PROCESS_SWITCH(HfTaskFlow, processMixedTpcMftLcCh, "DATA : Process mixed-event correlations for TPC-MFT Lc-h case", false); + // =================================================================================================================================================================================================================================================================== + // MONTE-CARLO + // =================================================================================================================================================================================================================================================================== + // ===================================== - // MONTE-CARLO : process mixed event correlations: TPC-TPC h-h case + // MONTE-CARLO GENERATED : process mixed event correlations: TPC-MFT D0-ch. part. case // ===================================== - // MC gen - void processMixedTpcTpcChChmcGEN(FilteredMcCollisions const& mcCollisions, - FilteredMcParticles const& mcParticles) + void processMixedTpcMftD0ChMcGen(FilteredMcCollisions const& mcCollisions, + McParticles2ProngMatched const& mcParticles2Prong, + McParticles const& mcParticles) { - // use normal index instead of globalIndex for MixedEvent ?? + auto getMultiplicity = [](FilteredMcCollisions::iterator const& mcCollision) { + auto multiplicity = mcCollision.multMCPVz(); + return multiplicity; + }; - // we want to group collisions based on charged-track multiplicity - // auto getTracksSize = [&mcParticles, this](FilteredMcCollisions::iterator const& mcCol) { - // auto associatedTracks = mcParticles.sliceByCached(o2::aod::mcparticle::mcCollisionId, mcCol.globalIndex(), this->cache); // it's cached, so slicing/grouping happens only once - // auto size = associatedTracks.size(); - // return size; - //}; + mixCollisionsMcTruth(mcCollisions, mcParticles2Prong, mcParticles, getMultiplicity, mixedEventHfMc); + } + PROCESS_SWITCH(HfTaskFlow, processMixedTpcMftD0ChMcGen, "MONTE-CARLO : Process mixed-event correlations for TPC-MFT D0-h case", false); + + // ===================================== + // MONTE-CARLO GENERATED : process mixed event correlations: TPC-MFT Lc-ch. part. case + // ===================================== + void processMixedTpcMftLcChMcGen(FilteredMcCollisions const& mcCollisions, + McParticles3ProngMatched const& mcParticles3Prong, + McParticles const& mcParticles) + { auto getMultiplicity = [](FilteredMcCollisions::iterator const& mcCollision) { auto multiplicity = mcCollision.multMCPVz(); return multiplicity; }; - mixCollisionsMcTruth(mcCollisions, mcParticles, mcParticles, getMultiplicity, mixedEvent); + mixCollisionsMcTruth(mcCollisions, mcParticles3Prong, mcParticles, getMultiplicity, mixedEventHfMc); + } + PROCESS_SWITCH(HfTaskFlow, processMixedTpcMftLcChMcGen, "MONTE-CARLO : Process mixed-event correlations for TPC-MFT D0-h case", false); + + // =================================================================================================================================================================================================================================================================== + // =================================================================================================================================================================================================================================================================== + // EFFICIENCIES PROCESS FUNCTIONS + // =================================================================================================================================================================================================================================================================== + // =================================================================================================================================================================================================================================================================== + + // NOTE SmallGroups includes soa::Filtered always -> in the smallGroups there is the equivalent of FilteredCollisionsWSelMultMcLabels + void processMcEfficiencyMft(FilteredMcCollisions::iterator const& mcCollision, + McParticles const& mcParticles, + soa::SmallGroups> const& collisionsMcLabels, + FilteredMftTracksWCollsMcLabels const& mftTTracksMcLabels) + { + LOGF(info, "MC collision at vtx-z = %f with %d mc particles and %d reconstructed collisions", mcCollision.posZ(), mcParticles.size(), collisionsMcLabels.size()); + + auto multiplicity = mcCollision.multMCPVz(); + if (centralityBinsForMc) { + if (collisionsMcLabels.size() == 0) { + return; + } + for (const auto& collision : collisionsMcLabels) { + multiplicity = collision.multNTracksPV(); + } + } - // TO-DO : mixed event for particles that have a reconstructed collision kCFStepVertex + // Primaries + for (const auto& mcParticle : mcParticles) { + if (!isAcceptedMftMcParticle(mcParticle)) { + sameEventHf->getTrackHistEfficiency()->Fill(CorrelationContainer::MC, mcParticle.eta(), mcParticle.pt(), getSpecies(mcParticle.pdgCode()), multiplicity, mcCollision.posZ()); + } + } + for (const auto& collision : collisionsMcLabels) { + auto groupedMftTTracksMcLabels = mftTTracksMcLabels.sliceBy(mftTracksPerCollision, collision.globalIndex()); + LOGF(info, " Reconstructed collision at vtx-z = %f", collision.posZ()); + LOGF(info, " which has %d mft tracks", groupedMftTTracksMcLabels.size()); + + for (const auto& mftTrack : groupedMftTTracksMcLabels) { + if (mftTrack.has_mcParticle()) { + const auto& mcParticle = mftTrack.mcParticle(); + if (!isAcceptedMftMcParticle(mcParticle)) { + sameEventHf->getTrackHistEfficiency()->Fill(CorrelationContainer::RecoPrimaries, mcParticle.eta(), mcParticle.pt(), getSpecies(mcParticle.pdgCode()), multiplicity, mcCollision.posZ()); + } + sameEventHf->getTrackHistEfficiency()->Fill(CorrelationContainer::RecoAll, mcParticle.eta(), mcParticle.pt(), getSpecies(mcParticle.pdgCode()), multiplicity, mcCollision.posZ()); + } else { + // fake track + // In the MFT the measurement of pT is not precise + sameEventHf->getTrackHistEfficiency()->Fill(CorrelationContainer::Fake, mftTrack.eta(), mftTrack.pt(), 0, multiplicity, mcCollision.posZ()); + } + } + } } - PROCESS_SWITCH(HfTaskFlow, processMixedTpcTpcChChmcGEN, "MONTE-CARLO : Process mixed-event correlations for TPC-TPC h-h case", false); + PROCESS_SWITCH(HfTaskFlow, processMcEfficiencyMft, "MONTE-CARLO : Extract efficiencies for MFT tracks", false); + }; // End of struct WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 49f01eeef88b8acaa084d3ac74295f8fb093a884 Mon Sep 17 00:00:00 2001 From: Gianni Shigeru Setoue Liveraro <81832939+gianniliveraro@users.noreply.github.com> Date: Thu, 22 May 2025 11:33:21 -0300 Subject: [PATCH 1376/1650] [PWGLF] Function to process generated V0s in sigma0 tasks + minor fixes (#11216) Co-authored-by: ALICE Action Bot --- PWGLF/DataModel/LFSigmaTables.h | 4 +- .../Strangeness/sigma0builder.cxx | 261 ++++++++++++++++-- PWGLF/Tasks/Strangeness/sigmaanalysis.cxx | 23 +- 3 files changed, 246 insertions(+), 42 deletions(-) diff --git a/PWGLF/DataModel/LFSigmaTables.h b/PWGLF/DataModel/LFSigmaTables.h index 0980b6891ad..bd808cef106 100644 --- a/PWGLF/DataModel/LFSigmaTables.h +++ b/PWGLF/DataModel/LFSigmaTables.h @@ -36,7 +36,6 @@ DECLARE_SOA_COLUMN(SigmaOPAngle, sigmaOPAngle, float); DECLARE_SOA_COLUMN(SigmaCentrality, sigmaCentrality, float); DECLARE_SOA_COLUMN(SigmaRunNumber, sigmaRunNumber, int); DECLARE_SOA_COLUMN(SigmaTimestamp, sigmaTimestamp, uint64_t); -DECLARE_SOA_COLUMN(SigmaIR, sigmaIR, float); } // namespace sigma0Core @@ -47,8 +46,7 @@ DECLARE_SOA_TABLE(Sigma0Cores, "AOD", "SIGMA0CORES", sigma0Core::SigmaOPAngle, sigma0Core::SigmaCentrality, sigma0Core::SigmaRunNumber, - sigma0Core::SigmaTimestamp, - sigma0Core::SigmaIR); + sigma0Core::SigmaTimestamp); // For Photon extra info namespace sigmaPhotonExtra diff --git a/PWGLF/TableProducer/Strangeness/sigma0builder.cxx b/PWGLF/TableProducer/Strangeness/sigma0builder.cxx index d633b5b7566..89e121dbe1f 100644 --- a/PWGLF/TableProducer/Strangeness/sigma0builder.cxx +++ b/PWGLF/TableProducer/Strangeness/sigma0builder.cxx @@ -73,6 +73,7 @@ struct sigma0builder { // For manual sliceBy Preslice perCollisionMCDerived = o2::aod::v0data::straCollisionId; Preslice perCollisionSTDDerived = o2::aod::v0data::straCollisionId; + PresliceUnsorted> perMcCollision = aod::v0data::straMCCollisionId; // pack track quality but separte also afterburner // dynamic range: 0-31 @@ -115,10 +116,17 @@ struct sigma0builder { Configurable requireINEL0{"requireINEL0", false, "require INEL>0 event selection"}; Configurable requireINEL1{"requireINEL1", false, "require INEL>1 event selection"}; Configurable maxZVtxPosition{"maxZVtxPosition", 10., "max Z vtx position"}; + Configurable useEvtSelInDenomEff{"useEvtSelInDenomEff", false, "Consider event selections in the recoed <-> gen collision association for the denominator (or numerator) of the acc. x eff. (or signal loss)?"}; + Configurable applyZVtxSelOnMCPV{"applyZVtxSelOnMCPV", false, "Apply Z-vtx cut on the PV of the generated collision?"}; Configurable useFT0CbasedOccupancy{"useFT0CbasedOccupancy", false, "Use sum of FT0-C amplitudes for estimating occupancy? (if not, use track-based definition)"}; // fast check on occupancy Configurable minOccupancy{"minOccupancy", -1, "minimum occupancy from neighbouring collisions"}; Configurable maxOccupancy{"maxOccupancy", -1, "maximum occupancy from neighbouring collisions"}; + + // fast check on interaction rate + Configurable minIR{"minIR", -1, "minimum IR collisions"}; + Configurable maxIR{"maxIR", -1, "maximum IR collisions"}; + } eventSelections; // For ML Selection @@ -129,6 +137,8 @@ struct sigma0builder { // For standard approach: //// Lambda criteria: + Configurable V0Rapidity{"V0Rapidity", 0.8, "v0 rapidity"}; + Configurable LambdaDauPseudoRap{"LambdaDauPseudoRap", 1.5, "Max pseudorapidity of daughter tracks"}; Configurable LambdaMinDCANegToPv{"LambdaMinDCANegToPv", 0.0, "min DCA Neg To PV (cm)"}; Configurable LambdaMinDCAPosToPv{"LambdaMinDCAPosToPv", 0.0, "min DCA Pos To PV (cm)"}; @@ -189,7 +199,7 @@ struct sigma0builder { ConfigurableAxis axisPA{"axisPA", {100, 0.0f, 1}, "Pointing angle"}; ConfigurableAxis axisRapidity{"axisRapidity", {100, -2.0f, 2.0f}, "Rapidity"}; ConfigurableAxis axisCandSel{"axisCandSel", {7, 0.5f, +7.5f}, "Candidate Selection"}; - ConfigurableAxis axisMonteCarloNch{"axisMonteCarloNch", {300, 0.0f, 3000.0f}, "N_{ch} MC"}; + ConfigurableAxis axisNch{"axisNch", {300, 0.0f, 3000.0f}, "N_{ch}"}; ConfigurableAxis axisIRBinning{"axisIRBinning", {150, 0, 1500}, "Binning for the interaction rate (kHz)"}; int nSigmaCandidates = 0; @@ -201,7 +211,7 @@ struct sigma0builder { ccdb->setFatalWhenNull(false); // Event Counters - histos.add("hEventSelection", "hEventSelection", kTH1D, {{19, -0.5f, +18.5f}}); + histos.add("hEventSelection", "hEventSelection", kTH1D, {{21, -0.5f, +20.5f}}); histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(1, "All collisions"); histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(2, "sel8 cut"); histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(3, "kIsTriggerTVX"); @@ -225,13 +235,15 @@ struct sigma0builder { histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(17, "Below min occup."); histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(18, "Above max occup."); } + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(19, "Below min IR"); + histos.get(HIST("hEventSelection"))->GetXaxis()->SetBinLabel(20, "Above max IR"); histos.add("hEventCentrality", "hEventCentrality", kTH1D, {axisCentrality}); histos.add("PhotonSel/hSelectionStatistics", "hSelectionStatistics", kTH1D, {axisCandSel}); histos.get(HIST("PhotonSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(1, "No Sel"); histos.get(HIST("PhotonSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(2, "Photon Mass Cut"); - histos.get(HIST("PhotonSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(3, "Photon DauEta Cut"); + histos.get(HIST("PhotonSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(3, "Photon Eta/Y Cut"); histos.get(HIST("PhotonSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(4, "Photon DCAToPV Cut"); histos.get(HIST("PhotonSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(5, "Photon DCADau Cut"); histos.get(HIST("PhotonSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(6, "Photon Radius Cut"); @@ -239,6 +251,7 @@ struct sigma0builder { histos.add("PhotonSel/hPhotonMass", "hPhotonMass", kTH1F, {axisPhotonMass}); histos.add("PhotonSel/hPhotonNegEta", "hPhotonNegEta", kTH1F, {axisRapidity}); histos.add("PhotonSel/hPhotonPosEta", "hPhotonPosEta", kTH1F, {axisRapidity}); + histos.add("PhotonSel/hPhotonY", "hPhotonY", kTH1F, {axisRapidity}); histos.add("PhotonSel/hPhotonDCANegToPV", "hPhotonDCANegToPV", kTH1F, {axisDCAtoPV}); histos.add("PhotonSel/hPhotonDCAPosToPV", "hPhotonDCAPosToPV", kTH1F, {axisDCAtoPV}); histos.add("PhotonSel/hPhotonDCADau", "hPhotonDCADau", kTH1F, {axisDCAdau}); @@ -247,7 +260,7 @@ struct sigma0builder { histos.add("LambdaSel/hSelectionStatistics", "hSelectionStatistics", kTH1D, {axisCandSel}); histos.get(HIST("LambdaSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(1, "No Sel"); histos.get(HIST("LambdaSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(2, "Lambda Mass Cut"); - histos.get(HIST("LambdaSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(3, "Lambda DauEta Cut"); + histos.get(HIST("LambdaSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(3, "Lambda Eta/Y Cut"); histos.get(HIST("LambdaSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(4, "Lambda DCAToPV Cut"); histos.get(HIST("LambdaSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(5, "Lambda Radius Cut"); histos.get(HIST("LambdaSel/hSelectionStatistics"))->GetXaxis()->SetBinLabel(6, "Lambda DCADau Cut"); @@ -256,6 +269,7 @@ struct sigma0builder { histos.add("LambdaSel/hAntiLambdaMass", "hAntiLambdaMass", kTH1F, {axisLambdaMass}); histos.add("LambdaSel/hLambdaNegEta", "hLambdaNegEta", kTH1F, {axisRapidity}); histos.add("LambdaSel/hLambdaPosEta", "hLambdaPosEta", kTH1F, {axisRapidity}); + histos.add("LambdaSel/hLambdaY", "hLambdaY", kTH1F, {axisRapidity}); histos.add("LambdaSel/hLambdaDCANegToPV", "hLambdaDCANegToPV", kTH1F, {axisDCAtoPV}); histos.add("LambdaSel/hLambdaDCAPosToPV", "hLambdaDCAPosToPV", kTH1F, {axisDCAtoPV}); histos.add("LambdaSel/hLambdaDCADau", "hLambdaDCADau", kTH1F, {axisDCAdau}); @@ -339,8 +353,32 @@ struct sigma0builder { histos.add("Pi0QA/h2dPtVsMassPi0AfterSel_Candidates", "h2dPtVsMassPi0AfterSel_Candidates", kTH2D, {axisPt, axisPi0Mass}); } - if (doprocessGeneratedCollRun3) - histos.add("Gen/hNEventsNch", "hNEventsNch", kTH1D, {axisMonteCarloNch}); + if (doprocessGeneratedRun3) { + + histos.add("Gen/hGenEvents", "hGenEvents", kTH2F, {{axisNch}, {2, -0.5f, +1.5f}}); + histos.get(HIST("Gen/hGenEvents"))->GetYaxis()->SetBinLabel(1, "All gen. events"); + histos.get(HIST("Gen/hGenEvents"))->GetYaxis()->SetBinLabel(2, "Gen. with at least 1 rec. events"); + + histos.add("Gen/hGenEventCentrality", "hGenEventCentrality", kTH1F, {{101, 0.0f, 101.0f}}); + histos.add("Gen/hCentralityVsNcoll_beforeEvSel", "hCentralityVsNcoll_beforeEvSel", kTH2F, {axisCentrality, {50, -0.5f, 49.5f}}); + histos.add("Gen/hCentralityVsNcoll_afterEvSel", "hCentralityVsNcoll_afterEvSel", kTH2F, {axisCentrality, {50, -0.5f, 49.5f}}); + histos.add("Gen/hCentralityVsMultMC", "hCentralityVsMultMC", kTH2F, {{101, 0.0f, 101.0f}, axisNch}); + histos.add("Gen/h2dGenGamma", "h2dGenGamma", kTH2D, {axisCentrality, axisPt}); + histos.add("Gen/h2dGenLambda", "h2dGenLambda", kTH2D, {axisCentrality, axisPt}); + histos.add("Gen/h2dGenAntiLambda", "h2dGenAntiLambda", kTH2D, {axisCentrality, axisPt}); + histos.add("Gen/h2dGenGammaVsMultMC_RecoedEvt", "h2dGenGammaVsMultMC_RecoedEvt", kTH2D, {axisNch, axisPt}); + histos.add("Gen/h2dGenLambdaVsMultMC_RecoedEvt", "h2dGenLambdaVsMultMC_RecoedEvt", kTH2D, {axisNch, axisPt}); + histos.add("Gen/h2dGenAntiLambdaVsMultMC_RecoedEvt", "h2dGenAntiLambdaVsMultMC_RecoedEvt", kTH2D, {axisNch, axisPt}); + histos.add("Gen/h2dGenGammaVsMultMC", "h2dGenGammaVsMultMC", kTH2D, {axisNch, axisPt}); + histos.add("Gen/h2dGenLambdaVsMultMC", "h2dGenLambdaVsMultMC", kTH2D, {axisNch, axisPt}); + histos.add("Gen/h2dGenAntiLambdaVsMultMC", "h2dGenAntiLambdaVsMultMC", kTH2D, {axisNch, axisPt}); + histos.add("Gen/hEventPVzMC", "hEventPVzMC", kTH1F, {{100, -20.0f, +20.0f}}); + histos.add("Gen/hCentralityVsPVzMC", "hCentralityVsPVzMC", kTH2F, {{101, 0.0f, 101.0f}, {100, -20.0f, +20.0f}}); + + auto hPrimaryV0s = histos.add("Gen/hPrimaryV0s", "hPrimaryV0s", kTH1D, {{2, -0.5f, 1.5f}}); + hPrimaryV0s->GetXaxis()->SetBinLabel(1, "All V0s"); + hPrimaryV0s->GetXaxis()->SetBinLabel(2, "Primary V0s"); + } } template @@ -448,6 +486,20 @@ struct sigma0builder { if (fillHists) histos.fill(HIST("hEventSelection"), 17 /* Above max occupancy */); } + // Fetch interaction rate only if required (in order to limit ccdb calls) + double interactionRate = (eventSelections.minIR >= 0 || eventSelections.maxIR >= 0) ? rateFetcher.fetch(ccdb.service, collision.timestamp(), collision.runNumber(), irSource, fIRCrashOnNull) * 1.e-3 : -1; + if (eventSelections.minIR >= 0 && interactionRate < eventSelections.minIR) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 18 /* Below min IR */); + + if (eventSelections.maxIR >= 0 && interactionRate > eventSelections.maxIR) { + return false; + } + if (fillHists) + histos.fill(HIST("hEventSelection"), 19 /* Above max IR */); + return true; } @@ -481,7 +533,7 @@ struct sigma0builder { } template - void analyzeV0CollAssoc(TCollision const& collision, TV0Object const& fullv0s, std::vector selV0Indices, float IR) + void analyzeV0CollAssoc(TCollision const& collision, TV0Object const& fullv0s, std::vector selV0Indices, float IR, bool isPhotonAnalysis) { auto v0MCCollision = collision.template straMCCollision_as>(); @@ -492,8 +544,9 @@ struct sigma0builder { float V0MCpT = RecoDecay::pt(array{v0MC.pxMC(), v0MC.pyMC()}); float V0PA = TMath::ACos(v0.v0cosPA()); bool fIsV0CorrectlyAssigned = (v0MC.straMCCollisionId() == v0MCCollision.globalIndex()); + bool isPrimary = v0MC.isPhysicalPrimary(); - if (v0MC.pdgCode() == 22) { // True Gamma + if ((v0MC.pdgCode() == 22) && isPhotonAnalysis && isPrimary) { // True Gamma histos.fill(HIST("V0AssoQA/h2dIRVsPt_TrueGamma"), IR, V0MCpT); histos.fill(HIST("V0AssoQA/h3dPAVsIRVsPt_TrueGamma"), V0PA, IR, V0MCpT); @@ -502,7 +555,7 @@ struct sigma0builder { histos.fill(HIST("V0AssoQA/h3dPAVsIRVsPt_TrueGamma_BadCollAssig"), V0PA, IR, V0MCpT); } } - if (v0MC.pdgCode() == 3122) { // True Lambda + if ((v0MC.pdgCode() == 3122) && !isPhotonAnalysis && isPrimary) { // True Lambda histos.fill(HIST("V0AssoQA/h2dIRVsPt_TrueLambda"), IR, V0MCpT); histos.fill(HIST("V0AssoQA/h3dPAVsIRVsPt_TrueLambda"), V0PA, IR, V0MCpT); @@ -513,6 +566,171 @@ struct sigma0builder { } } } + + // ______________________________________________________ + // Simulated processing + // Return the list of indices to the recoed collision associated to a given MC collision. + template + std::vector getListOfRecoCollIndices(TMCollisions const& mcCollisions, TCollisions const& collisions) + { + std::vector listBestCollisionIdx(mcCollisions.size()); + for (auto const& mcCollision : mcCollisions) { + auto groupedCollisions = collisions.sliceBy(perMcCollision, mcCollision.globalIndex()); + int biggestNContribs = -1; + int bestCollisionIndex = -1; + for (auto const& collision : groupedCollisions) { + // consider event selections in the recoed <-> gen collision association, for the denominator (or numerator) of the efficiency (or signal loss)? + if (eventSelections.useEvtSelInDenomEff) { + if (!IsEventAccepted(collision, false)) { + continue; + } + } + // Find the collision with the biggest nbr of PV contributors + // Follows what was done here: https://github.com/AliceO2Group/O2Physics/blob/master/Common/TableProducer/mcCollsExtra.cxx#L93 + if (biggestNContribs < collision.multPVTotalContributors()) { + biggestNContribs = collision.multPVTotalContributors(); + bestCollisionIndex = collision.globalIndex(); + } + } + listBestCollisionIdx[mcCollision.globalIndex()] = bestCollisionIndex; + } + return listBestCollisionIdx; + } + + // ______________________________________________________ + // Simulated processing + // Fill generated event information (for event loss/splitting estimation) + template + void fillGeneratedEventProperties(TMCCollisions const& mcCollisions, TCollisions const& collisions) + { + std::vector listBestCollisionIdx(mcCollisions.size()); + for (auto const& mcCollision : mcCollisions) { + // Apply selections on MC collisions + if (eventSelections.applyZVtxSelOnMCPV && std::abs(mcCollision.posZ()) > eventSelections.maxZVtxPosition) { + continue; + } + if (doPPAnalysis) { // we are in pp + if (eventSelections.requireINEL0 && mcCollision.multMCNParticlesEta10() < 1) { + continue; + } + + if (eventSelections.requireINEL1 && mcCollision.multMCNParticlesEta10() < 2) { + continue; + } + } + + histos.fill(HIST("Gen/hGenEvents"), mcCollision.multMCNParticlesEta05(), 0 /* all gen. events*/); + + auto groupedCollisions = collisions.sliceBy(perMcCollision, mcCollision.globalIndex()); + // Check if there is at least one of the reconstructed collisions associated to this MC collision + // If so, we consider it + bool atLeastOne = false; + int biggestNContribs = -1; + float centrality = 100.5f; + int nCollisions = 0; + for (auto const& collision : groupedCollisions) { + + if (!IsEventAccepted(collision, false)) { + continue; + } + + if (biggestNContribs < collision.multPVTotalContributors()) { + biggestNContribs = collision.multPVTotalContributors(); + centrality = doPPAnalysis ? collision.centFT0M() : collision.centFT0C(); + } + + nCollisions++; + atLeastOne = true; + } + + histos.fill(HIST("Gen/hCentralityVsNcoll_beforeEvSel"), centrality, groupedCollisions.size()); + histos.fill(HIST("Gen/hCentralityVsNcoll_afterEvSel"), centrality, nCollisions); + histos.fill(HIST("Gen/hCentralityVsMultMC"), centrality, mcCollision.multMCNParticlesEta05()); + histos.fill(HIST("Gen/hCentralityVsPVzMC"), centrality, mcCollision.posZ()); + histos.fill(HIST("Gen/hEventPVzMC"), mcCollision.posZ()); + + if (atLeastOne) { + histos.fill(HIST("Gen/hGenEvents"), mcCollision.multMCNParticlesEta05(), 1 /* at least 1 rec. event*/); + histos.fill(HIST("Gen/hGenEventCentrality"), centrality); + } + } + return; + } + + // ______________________________________________________ + // Simulated processing (subscribes to MC information too) + template + void analyzeGeneratedV0s(TMCCollisions const& mcCollisions, TV0MCs const& V0MCCores, TCollisions const& collisions) + { + fillGeneratedEventProperties(mcCollisions, collisions); + std::vector listBestCollisionIdx = getListOfRecoCollIndices(mcCollisions, collisions); + for (auto const& v0MC : V0MCCores) { + if (!v0MC.has_straMCCollision()) + continue; + + histos.fill(HIST("Gen/hPrimaryV0s"), 0); + if (!v0MC.isPhysicalPrimary()) + continue; + + histos.fill(HIST("Gen/hPrimaryV0s"), 1); + + // TODO: get generated sigma0s + + float ptmc = v0MC.ptMC(); + float ymc = 1e3; + if (v0MC.pdgCode() == 22) + ymc = RecoDecay::y(std::array{v0MC.pxMC(), v0MC.pyMC(), v0MC.pzMC()}, o2::constants::physics::MassGamma); + + else if (std::abs(v0MC.pdgCode()) == 3122) + ymc = v0MC.rapidityMC(1); + + if (std::abs(ymc) > V0Rapidity) + continue; + + auto mcCollision = v0MC.template straMCCollision_as>(); + if (eventSelections.applyZVtxSelOnMCPV && std::abs(mcCollision.posZ()) > eventSelections.maxZVtxPosition) { + continue; + } + if (doPPAnalysis) { // we are in pp + if (eventSelections.requireINEL0 && mcCollision.multMCNParticlesEta10() < 1) { + continue; + } + + if (eventSelections.requireINEL1 && mcCollision.multMCNParticlesEta10() < 2) { + continue; + } + } + + float centrality = 100.5f; + if (listBestCollisionIdx[mcCollision.globalIndex()] > -1) { + auto collision = collisions.iteratorAt(listBestCollisionIdx[mcCollision.globalIndex()]); + centrality = doPPAnalysis ? collision.centFT0M() : collision.centFT0C(); + + if (v0MC.pdgCode() == 22) { + histos.fill(HIST("Gen/h2dGenGammaVsMultMC_RecoedEvt"), mcCollision.multMCNParticlesEta05(), ptmc); + } + if (v0MC.pdgCode() == 3122) { + histos.fill(HIST("Gen/h2dGenLambdaVsMultMC_RecoedEvt"), mcCollision.multMCNParticlesEta05(), ptmc); + } + if (v0MC.pdgCode() == -3122) { + histos.fill(HIST("Gen/h2dGenAntiLambdaVsMultMC_RecoedEvt"), mcCollision.multMCNParticlesEta05(), ptmc); + } + } + if (v0MC.pdgCode() == 22) { + histos.fill(HIST("Gen/h2dGenGamma"), centrality, ptmc); + histos.fill(HIST("Gen/h2dGenGammaVsMultMC"), mcCollision.multMCNParticlesEta05(), ptmc); + } + if (v0MC.pdgCode() == 3122) { + histos.fill(HIST("Gen/h2dGenLambda"), centrality, ptmc); + histos.fill(HIST("Gen/h2dGenLambdaVsMultMC"), mcCollision.multMCNParticlesEta05(), ptmc); + } + if (v0MC.pdgCode() == -3122) { + histos.fill(HIST("Gen/h2dGenAntiLambda"), centrality, ptmc); + histos.fill(HIST("Gen/h2dGenAntiLambdaVsMultMC"), mcCollision.multMCNParticlesEta05(), ptmc); + } + } + } + template void runPi0QA(TV0Object const& gamma1, TV0Object const& gamma2) { @@ -629,10 +847,12 @@ struct sigma0builder { histos.fill(HIST("PhotonSel/hPhotonMass"), gamma.mGamma()); if ((gamma.mGamma() < 0) || (gamma.mGamma() > PhotonMaxMass)) return false; + float PhotonY = RecoDecay::y(std::array{gamma.px(), gamma.py(), gamma.pz()}, o2::constants::physics::MassGamma); histos.fill(HIST("PhotonSel/hPhotonNegEta"), gamma.negativeeta()); histos.fill(HIST("PhotonSel/hPhotonPosEta"), gamma.positiveeta()); + histos.fill(HIST("PhotonSel/hPhotonY"), PhotonY); histos.fill(HIST("PhotonSel/hSelectionStatistics"), 2.); - if ((TMath::Abs(gamma.negativeeta()) > PhotonMaxDauPseudoRap) || (TMath::Abs(gamma.positiveeta()) > PhotonMaxDauPseudoRap)) + if ((TMath::Abs(PhotonY) > V0Rapidity) || (TMath::Abs(gamma.negativeeta()) > PhotonMaxDauPseudoRap) || (TMath::Abs(gamma.positiveeta()) > PhotonMaxDauPseudoRap)) return false; histos.fill(HIST("PhotonSel/hPhotonDCANegToPV"), TMath::Abs(gamma.dcanegtopv())); histos.fill(HIST("PhotonSel/hPhotonDCAPosToPV"), TMath::Abs(gamma.dcapostopv())); @@ -672,8 +892,9 @@ struct sigma0builder { return false; histos.fill(HIST("LambdaSel/hLambdaNegEta"), lambda.negativeeta()); histos.fill(HIST("LambdaSel/hLambdaPosEta"), lambda.positiveeta()); + histos.fill(HIST("LambdaSel/hLambdaY"), lambda.yLambda()); histos.fill(HIST("LambdaSel/hSelectionStatistics"), 2.); - if ((TMath::Abs(lambda.negativeeta()) > LambdaDauPseudoRap) || (TMath::Abs(lambda.positiveeta()) > LambdaDauPseudoRap)) + if ((TMath::Abs(lambda.yLambda()) > V0Rapidity) || (TMath::Abs(lambda.negativeeta()) > LambdaDauPseudoRap) || (TMath::Abs(lambda.positiveeta()) > LambdaDauPseudoRap)) return false; histos.fill(HIST("LambdaSel/hLambdaDCANegToPV"), lambda.dcanegtopv()); histos.fill(HIST("LambdaSel/hLambdaDCAPosToPV"), lambda.dcapostopv()); @@ -870,16 +1091,12 @@ struct sigma0builder { float fSigmaMass = RecoDecay::m(arrMom, std::array{o2::constants::physics::MassPhoton, o2::constants::physics::MassLambda0}); float fSigmaRap = RecoDecay::y(std::array{gamma.px() + lambda.px(), gamma.py() + lambda.py(), gamma.pz() + lambda.pz()}, o2::constants::physics::MassSigma0); float fSigmaOPAngle = v1.Angle(v2); - float fSigmaCentrality = coll.centFT0C(); + float fSigmaCentrality = doPPAnalysis ? coll.centFT0M() : coll.centFT0C(); uint64_t fSigmaTimeStamp = coll.timestamp(); int fSigmaRunNumber = coll.runNumber(); - float fSigmaIR = -1; - - if (fGetIR) - fSigmaIR = rateFetcher.fetch(ccdb.service, coll.timestamp(), coll.runNumber(), irSource, fIRCrashOnNull) * 1.e-3; // Filling TTree for ML analysis - sigma0cores(fSigmapT, fSigmaMass, fSigmaRap, fSigmaOPAngle, fSigmaCentrality, fSigmaRunNumber, fSigmaTimeStamp, fSigmaIR); + sigma0cores(fSigmapT, fSigmaMass, fSigmaRap, fSigmaOPAngle, fSigmaCentrality, fSigmaRunNumber, fSigmaTimeStamp); sigmaPhotonExtras(fPhotonPt, fPhotonMass, fPhotonQt, fPhotonAlpha, fPhotonRadius, fPhotonCosPA, fPhotonDCADau, fPhotonDCANegPV, fPhotonDCAPosPV, fPhotonZconv, @@ -980,8 +1197,8 @@ struct sigma0builder { //_______________________________________________ // Wrongly collision association study if (doAssocStudy && fhasMCColl) { - analyzeV0CollAssoc(coll, fullV0s, bestGammasArray, interactionRate); // Gamma - analyzeV0CollAssoc(coll, fullV0s, bestLambdasArray, interactionRate); // Lambda + analyzeV0CollAssoc(coll, fullV0s, bestGammasArray, interactionRate, true); // Gamma + analyzeV0CollAssoc(coll, fullV0s, bestLambdasArray, interactionRate, false); // Lambda } //_______________________________________________ @@ -1172,14 +1389,14 @@ struct sigma0builder { } // Simulated processing in Run 3 (subscribes to MC information too) - void processGeneratedCollRun3(soa::Join::iterator const& mcCollision) + void processGeneratedRun3(soa::Join const& mcCollisions, soa::Join const& V0MCCores, soa::Join const& collisions) { - histos.fill(HIST("Gen/hNEventsNch"), mcCollision.multMCNParticlesEta05()); + analyzeGeneratedV0s(mcCollisions, V0MCCores, collisions); } PROCESS_SWITCH(sigma0builder, processMonteCarlo, "process as if MC data", false); PROCESS_SWITCH(sigma0builder, processRealData, "process as if real data", true); - PROCESS_SWITCH(sigma0builder, processGeneratedCollRun3, "process generated MC collisions", false); + PROCESS_SWITCH(sigma0builder, processGeneratedRun3, "process generated MC collisions", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) diff --git a/PWGLF/Tasks/Strangeness/sigmaanalysis.cxx b/PWGLF/Tasks/Strangeness/sigmaanalysis.cxx index 2e88ccc50b4..c01a0a71cae 100644 --- a/PWGLF/Tasks/Strangeness/sigmaanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/sigmaanalysis.cxx @@ -75,11 +75,6 @@ struct sigmaanalysis { Configurable fillBkgQAhistos{"fillBkgQAhistos", false, "if true, fill MC QA histograms for Bkg study. Only works with MC."}; Configurable fillpTResoQAhistos{"fillpTResoQAhistos", false, "if true, fill MC QA histograms for pT resolution study. Only works with MC."}; - // Interaction rate selection: - Configurable fGetIR{"fGetIR", false, "Flag to retrieve the IR info."}; - Configurable minIR{"minIR", -1, "Min Interaction Rate (kHz). Leave -1 if no selection desired."}; - Configurable maxIR{"maxIR", -1, "Max Interaction Rate (kHz). Leave -1 if no selection desired."}; - // Analysis strategy: Configurable fUseMLSel{"fUseMLSel", false, "Flag to use ML selection. If False, the standard selection is applied."}; Configurable fselLambdaTPCPID{"fselLambdaTPCPID", true, "Flag to select lambda-like candidates using TPC NSigma."}; @@ -273,10 +268,9 @@ struct sigmaanalysis { histos.add(histodir + "/MC/Photon/h2dNegTPCNSigmaEl", "h2dNegTPCNSigmaEl", kTH2F, {axisPt, axisTPCNSigma}); histos.add(histodir + "/MC/Photon/h2dPosTPCNSigmaPi", "h2dPosTPCNSigmaPi", kTH2F, {axisPt, axisTPCNSigma}); histos.add(histodir + "/MC/Photon/h2dNegTPCNSigmaPi", "h2dNegTPCNSigmaPi", kTH2F, {axisPt, axisTPCNSigma}); - histos.add(histodir + "/MC/Photon/h2dIRVsPt", "h2dIRVsPt", kTH2F, {axisIRBinning, axisPt}); - histos.add(histodir + "/MC/Photon/h3dPAVsIRVsPt", "h3dPAVsIRVsPt", kTH3F, {axisPA, axisIRBinning, axisPt}); - histos.add(histodir + "/MC/Photon/h2dIRVsPt_BadCollAssig", "h2dIRVsPt_BadCollAssig", kTH2F, {axisIRBinning, axisPt}); - histos.add(histodir + "/MC/Photon/h3dPAVsIRVsPt_BadCollAssig", "h3dPAVsIRVsPt_BadCollAssig", kTH3F, {axisPA, axisIRBinning, axisPt}); + histos.add(histodir + "/MC/Photon/h2dPAVsPt", "h2dPAVsPt", kTH2F, {axisPA, axisPt}); + histos.add(histodir + "/MC/Photon/hPt_BadCollAssig", "hPt_BadCollAssig", kTH1F, {axisPt}); + histos.add(histodir + "/MC/Photon/h2dPAVsPt_BadCollAssig", "h2dPAVsPt_BadCollAssig", kTH2F, {axisPA, axisPt}); histos.add(histodir + "/MC/Lambda/hV0ToCollAssoc", "hV0ToCollAssoc", kTH1F, {{2, 0.0f, 2.0f}}); histos.add(histodir + "/MC/Lambda/hPt", "hPt", kTH1F, {axisPt}); @@ -585,12 +579,11 @@ struct sigmaanalysis { histos.fill(HIST(MainDir[mode]) + HIST("/MC/Photon/h2dPosTPCNSigmaPi"), sigma.photonPosPt(), sigma.photonPosTPCNSigmaPi()); histos.fill(HIST(MainDir[mode]) + HIST("/MC/Photon/h2dNegTPCNSigmaPi"), sigma.photonNegPt(), sigma.photonNegTPCNSigmaPi()); - histos.fill(HIST(MainDir[mode]) + HIST("/MC/Photon/h2dIRVsPt"), sigma.sigmaIR(), sigma.photonMCPt()); - histos.fill(HIST(MainDir[mode]) + HIST("/MC/Photon/h3dPAVsIRVsPt"), TMath::ACos(sigma.photonCosPA()), sigma.sigmaIR(), sigma.photonMCPt()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/Photon/h2dPAVsPt"), TMath::ACos(sigma.photonCosPA()), sigma.photonMCPt()); if (!sigma.photonIsCorrectlyAssoc()) { - histos.fill(HIST(MainDir[mode]) + HIST("/MC/Photon/h2dIRVsPt_BadCollAssig"), sigma.sigmaIR(), sigma.photonMCPt()); - histos.fill(HIST(MainDir[mode]) + HIST("/MC/Photon/h3dPAVsIRVsPt_BadCollAssig"), TMath::ACos(sigma.photonCosPA()), sigma.sigmaIR(), sigma.photonMCPt()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/Photon/hPt_BadCollAssig"), sigma.photonMCPt()); + histos.fill(HIST(MainDir[mode]) + HIST("/MC/Photon/h2dPAVsPt_BadCollAssig"), TMath::ACos(sigma.photonCosPA()), sigma.photonMCPt()); } } @@ -864,10 +857,6 @@ struct sigmaanalysis { template bool processSigmaCandidate(TV0Object const& cand) { - // Optionally Select on Interaction Rate - if (fGetIR && (maxIR != -1) && (minIR != -1) && ((cand.sigmaIR() <= minIR) || (cand.sigmaIR() >= maxIR))) { - return false; - } // Do ML analysis if (fUseMLSel) { From 80c46fce0324877b00372b5257d5db4f75c1383e Mon Sep 17 00:00:00 2001 From: EmilGorm <50658075+EmilGorm@users.noreply.github.com> Date: Thu, 22 May 2025 19:08:04 +0200 Subject: [PATCH 1377/1650] [PWGCF] fixed initialisation for on-the-fly (#11304) Co-authored-by: ALICE Action Bot --- PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx b/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx index 9f419324209..4378565008e 100644 --- a/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx +++ b/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx @@ -115,7 +115,7 @@ struct FlowGenericFramework { Configurable> cfgTrackDensityP0{"cfgTrackDensityP0", std::vector{0.7217476707, 0.7384792571, 0.7542625668, 0.7640680200, 0.7701951667, 0.7755299053, 0.7805901710, 0.7849446786, 0.7957356586, 0.8113039262, 0.8211968966, 0.8280558878, 0.8329342135}, "parameter 0 for track density efficiency correction"}; Configurable> cfgTrackDensityP1{"cfgTrackDensityP1", std::vector{-2.169488e-05, -2.191913e-05, -2.295484e-05, -2.556538e-05, -2.754463e-05, -2.816832e-05, -2.846502e-05, -2.843857e-05, -2.705974e-05, -2.477018e-05, -2.321730e-05, -2.203315e-05, -2.109474e-05}, "parameter 1 for track density efficiency correction"}; - Configurable cfgGFWBinning{"cfgGFWBinning", {40, 16, 72, 300, 0, 3000, 0.2, 10.0, 0.2, 3.0, {0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.2, 2.4, 2.6, 2.8, 3, 3.5, 4, 5, 6, 8, 10}, {0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90}}, "Configuration for binning"}; + Configurable cfgGFWBinning{"cfgGFWBinning", {40, 16, 72, 300, 0, 3000, 0.2, 10.0, 0.2, 3.0, {0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.25, 1.5, 1.75, 2, 2.25, 2.5, 2.75, 3, 3.25, 3.5, 3.75, 4, 4.5, 5, 5.5, 6, 7, 8, 9, 10}, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90}}, "Configuration for binning"}; Configurable cfgRegions{"cfgRegions", {{"refN", "refP", "refFull"}, {-0.8, 0.4, -0.8}, {-0.4, 0.8, 0.8}, {0, 0, 0}, {1, 1, 1}}, "Configurations for GFW regions"}; Configurable cfgCorrConfig{"cfgCorrConfig", {{"refP {2} refN {-2}", "refP {3} refN {-3}", "refP {4} refN {-4}", "refFull {2 -2}", "refFull {2 2 -2 -2}"}, {"ChGap22", "ChGap32", "ChGap42", "ChFull22", "ChFull24"}, {0, 0, 0, 0, 0}, {15, 1, 1, 0, 0}}, "Configurations for each correlation to calculate"}; @@ -261,6 +261,7 @@ struct FlowGenericFramework { nchbinning.push_back(nchskip * i + o2::analysis::gfw::nchlow + 0.5); } AxisSpec nchAxis = {nchbinning, "N_{ch}"}; + AxisSpec bAxis = {200, 0, 20, "#it{b}"}; AxisSpec t0cAxis = {70, 0, 70000, "N_{ch} (T0C)"}; AxisSpec t0aAxis = {200, 0, 200, "N_{ch}"}; AxisSpec multpvAxis = {4000, 0, 4000, "N_{ch} (PV)"}; @@ -277,10 +278,11 @@ struct FlowGenericFramework { int ptbins = o2::analysis::gfw::ptbinning.size() - 1; fPtAxis = new TAxis(ptbins, &o2::analysis::gfw::ptbinning[0]); - if (doprocessMCGen) { + if (doprocessMCGen || doprocessOnTheFly) { registry.add("MCGen/before/pt_gen", "", {HistType::kTH1D, {ptAxis}}); registry.add("MCGen/before/phi_eta_vtxZ_gen", "", {HistType::kTH3D, {phiAxis, etaAxis, vtxAxis}}); registry.addClone("MCGen/before/", "MCGen/after/"); + registry.add("MCGen/impactParameter", "", {HistType::kTH2D, {{bAxis, nchAxis}}}); } if (doprocessMCReco || doprocessData || doprocessRun2) { registry.add("trackQA/before/phi_eta_vtxZ", "", {HistType::kTH3D, {phiAxis, etaAxis, vtxAxis}}); @@ -349,7 +351,7 @@ struct FlowGenericFramework { fFC->SetXAxis(fPtAxis); fFC->Initialize(oba, multAxis, cfgNbootstrap); } - if (doprocessMCGen) { + if (doprocessMCGen || doprocessOnTheFly) { fFCgen->SetName("FlowContainer_gen"); fFCgen->SetXAxis(fPtAxis); fFCgen->Initialize(oba, multAxis, cfgNbootstrap); @@ -988,6 +990,7 @@ struct FlowGenericFramework { o2::framework::expressions::Filter collisionFilter = nabs(aod::collision::posZ) < cfgVtxZ; o2::framework::expressions::Filter trackFilter = nabs(aod::track::eta) < cfgEta && aod::track::pt > cfgPtmin&& aod::track::pt < cfgPtmax && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && nabs(aod::track::dcaXY) < cfgDCAxy&& nabs(aod::track::dcaZ) < cfgDCAz; + using GFWTracks = soa::Filtered>; void processData(soa::Filtered>::iterator const& collision, aod::BCsWithTimestamps const&, GFWTracks const& tracks) @@ -1101,6 +1104,7 @@ struct FlowGenericFramework { { float centrality = -1; int run = 0; + registry.fill(HIST("MCGen/impactParamter"), mcCollision.impactParameter(), mcParticles.size()); processCollision(mcCollision, mcParticles, centrality, run); } PROCESS_SWITCH(FlowGenericFramework, processOnTheFly, "Process analysis for MC on-the-fly generated events", false); From c9982e40997b71c91d67eed41cbb05ca394d8542 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Thu, 22 May 2025 19:55:48 +0200 Subject: [PATCH 1378/1650] [Infrastructure] MegaLinter: Configure cppcheck (#11305) --- .mega-linter.yml | 2 +- cppcheck_config | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 cppcheck_config diff --git a/.mega-linter.yml b/.mega-linter.yml index 229198ab397..f0e21bd5c23 100644 --- a/.mega-linter.yml +++ b/.mega-linter.yml @@ -39,5 +39,5 @@ PYTHON_PYRIGHT_CONFIG_FILE: pyproject.toml PYTHON_RUFF_CONFIG_FILE: pyproject.toml CPP_CPPLINT_FILE_EXTENSIONS: [".C", ".c", ".c++", ".cc", ".cl", ".cpp", ".cu", ".cuh", ".cxx", ".cxx.in", ".h", ".h++", ".hh", ".h.in", ".hpp", ".hxx", ".inc", ".inl", ".macro"] CPP_CLANG_FORMAT_FILE_EXTENSIONS: [".C", ".c", ".c++", ".cc", ".cl", ".cpp", ".cu", ".cuh", ".cxx", ".cxx.in", ".h", ".h++", ".hh", ".h.in", ".hpp", ".hxx", ".inc", ".inl", ".macro"] -CPP_CPPCHECK_ARGUMENTS: --language=c++ --std=c++20 --check-level=exhaustive +CPP_CPPCHECK_ARGUMENTS: --language=c++ --std=c++20 --check-level=exhaustive --suppressions-list=cppcheck_config REPOSITORY_GITLEAKS_PR_COMMITS_SCAN: true diff --git a/cppcheck_config b/cppcheck_config new file mode 100644 index 00000000000..1ca9f8a8952 --- /dev/null +++ b/cppcheck_config @@ -0,0 +1,2 @@ +syntaxError +unknownMacro From ba48d8317ad2ec0d5e51cef10bbf7d470aa4f00e Mon Sep 17 00:00:00 2001 From: Ida Storehaug <38440296+torkjellsdatter@users.noreply.github.com> Date: Thu, 22 May 2025 20:38:33 +0200 Subject: [PATCH 1379/1650] [PWGDQ] tableReader_withAssoc: added log messages to intialization to debug HL issue (#11308) Co-authored-by: Ida Torkjellsdatter Storehaug Co-authored-by: ALICE Action Bot --- PWGDQ/Tasks/tableReader_withAssoc.cxx | 28 +++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/PWGDQ/Tasks/tableReader_withAssoc.cxx b/PWGDQ/Tasks/tableReader_withAssoc.cxx index 2f3c3933bde..a58b23fac02 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.cxx +++ b/PWGDQ/Tasks/tableReader_withAssoc.cxx @@ -231,6 +231,7 @@ void PrintBitMap(TMap map, int nbits) // Analysis task that produces event decisions (analysis cut, in bunch pileup and split collision check) and the Hash table used in event mixing struct AnalysisEventSelection { + Produces eventSel; Produces hash; OutputObj fOutputList{"output"}; @@ -267,6 +268,8 @@ struct AnalysisEventSelection { void init(o2::framework::InitContext& context) { + LOG(info) << "Starting initialization of AnalysisEventSelection (idstoreh)"; + bool isAnyProcessEnabled = context.mOptions.get("processSkimmed") || context.mOptions.get("processSkimmedWithZdc") || context.mOptions.get("processSkimmedWithMultExtra") || context.mOptions.get("processSkimmedWithMultExtraZdc"); bool isDummyEnabled = context.mOptions.get("processDummy"); @@ -331,6 +334,7 @@ struct AnalysisEventSelection { fCCDB->setLocalObjectValidityChecking(); fCCDB->setCreatedNotAfter(fConfigNoLaterThan.value); fCCDBApi.init(fConfigCcdbUrl.value); + LOG(info) << "Initialization of AnalysisEventSelection finished (idstoreh)"; } template @@ -551,6 +555,7 @@ struct AnalysisTrackSelection { void init(o2::framework::InitContext& context) { + LOG(info) << "Starting initialization of AnalysisTrackSelection (idstoreh)"; if (context.mOptions.get("processDummy")) { return; } @@ -600,6 +605,7 @@ struct AnalysisTrackSelection { fCCDB->setLocalObjectValidityChecking(); fCCDB->setCreatedNotAfter(fConfigNoLaterThan.value); fCCDBApi.init(fConfigCcdbUrl.value); + LOG(info) << "Initialization of AnalysisTrackSelection finished (idstoreh)"; } template @@ -796,6 +802,7 @@ struct AnalysisMuonSelection { void init(o2::framework::InitContext& context) { + LOG(info) << "Starting initialization of AnalysisMuonSelection (idstoreh)"; if (context.mOptions.get("processDummy")) { return; } @@ -847,6 +854,7 @@ struct AnalysisMuonSelection { if (!o2::base::GeometryManager::isGeometryLoaded()) { fCCDB->get(fConfigGeoPath); } + LOG(info) << "Initialization of AnalysisMuonSelection finished (idstoreh)"; } template @@ -997,6 +1005,7 @@ struct AnalysisPrefilterSelection { void init(o2::framework::InitContext& context) { + LOG(info) << "Starting initialization of AnalysisPrefilterSelection (idstoreh)"; if (context.mOptions.get("processDummy")) { return; } @@ -1070,6 +1079,7 @@ struct AnalysisPrefilterSelection { VarManager::SetUseVars(AnalysisCut::fgUsedVars); // provide the list of required variables so that VarManager knows what to fill VarManager::SetupTwoProngDCAFitter(5.0f, true, 200.0f, 4.0f, 1.0e-3f, 0.9f, true); // TODO: get these parameters from Configurables // VarManager::SetupTwoProngFwdDCAFitter(5.0f, true, 200.0f, 1.0e-3f, 0.9f, true); + LOG(info) << "Initialization of AnalysisPrefilterSelection finished (idstoreh)"; } template @@ -1247,6 +1257,7 @@ struct AnalysisSameEventPairing { void init(o2::framework::InitContext& context) { + LOG(info) << "Starting initialization of AnalysisSameEventPairing (idstoreh)"; fEnableBarrelHistos = context.mOptions.get("processAllSkimmed") || context.mOptions.get("processBarrelOnlySkimmed") || context.mOptions.get("processBarrelOnlyWithCollSkimmed") || context.mOptions.get("processBarrelOnlySkimmedNoCov") || context.mOptions.get("processBarrelOnlySkimmedNoCovWithMultExtra"); fEnableBarrelMixingHistos = context.mOptions.get("processMixingAllSkimmed") || context.mOptions.get("processMixingBarrelSkimmed"); fEnableMuonHistos = context.mOptions.get("processAllSkimmed") || context.mOptions.get("processMuonOnlySkimmed") || context.mOptions.get("processMuonOnlySkimmedMultExtra") || context.mOptions.get("processMixingMuonSkimmed"); @@ -1344,6 +1355,7 @@ struct AnalysisSameEventPairing { } } } + LOG(info) << "Initialization of AnalysisSameEventPairing 1 (idstoreh)"; // get the muon track selection cuts getTaskOptionValue(context, "analysis-muon-selection", "cfgMuonCuts", tempCuts, false); @@ -1425,6 +1437,8 @@ struct AnalysisSameEventPairing { } } + LOG(info) << "Initialization of AnalysisSameEventPairing 2 (idstoreh)"; + fCurrentRun = 0; fCCDB->setURL(fConfigCCDB.url.value); @@ -1486,6 +1500,7 @@ struct AnalysisSameEventPairing { VarManager::SetUseVars(fHistMan->GetUsedVars()); // provide the list of required variables so that VarManager knows what to fill fOutputList.setObject(fHistMan->GetMainHistogramList()); } + LOG(info) << "Finished initialization of AnalysisSameEventPairing (idstoreh)"; } void initParamsFromCCDB(uint64_t timestamp, int runNumber, bool withTwoProngFitter = true) @@ -2214,6 +2229,7 @@ struct AnalysisAsymmetricPairing { void init(o2::framework::InitContext& context) { + LOG(info) << "Initialization of AnalysisAsymmetricPairing started (idstoreh)"; if (context.mOptions.get("processDummy")) { return; } @@ -2442,6 +2458,7 @@ struct AnalysisAsymmetricPairing { dqhistograms::AddHistogramsFromJSON(fHistMan, fConfigAddJSONHistograms.value.c_str()); // ad-hoc histograms via JSON VarManager::SetUseVars(fHistMan->GetUsedVars()); // provide the list of required variables so that VarManager knows what to fill fOutputList.setObject(fHistMan->GetMainHistogramList()); + LOG(info) << "Initialization of AnalysisAsymmetricPairing finished (idstoreh)"; } void initParamsFromCCDB(uint64_t timestamp, bool isTriplets) @@ -2919,6 +2936,7 @@ struct AnalysisDileptonTrack { void init(o2::framework::InitContext& context) { + LOG(info) << "Initialization of AnalysisDileptonTrack started (idstoreh)"; bool isBarrel = context.mOptions.get("processBarrelSkimmed"); bool isBarrelME = context.mOptions.get("processBarrelMixedEvent"); bool isBarrelAsymmetric = context.mOptions.get("processDstarToD0Pi"); @@ -2944,6 +2962,7 @@ struct AnalysisDileptonTrack { // For each track/muon selection used to produce dileptons, create a separate histogram directory using the // name of the track/muon cut. + LOG(info) << "Initialization of AnalysisDileptonTrack 1 (idstoreh)"; if (isBarrel || isMuon || isBarrelAsymmetric) { // Get the list of single track and muon cuts computed in the dedicated tasks upstream // We need this to know the order in which they were computed, and also to make sure that in this task we do not ask @@ -2982,7 +3001,7 @@ struct AnalysisDileptonTrack { for (int icut = 0; icut < cfgTrackSelection_objArrayTrackCuts->GetEntries(); icut++) { fTrackCutNames.push_back(cfgTrackSelection_objArrayTrackCuts->At(icut)->GetName()); } - + LOG(info) << "Initialization of AnalysisDileptonTrack 2 (idstoreh)"; // get the list of associated track cuts to be combined with the dileptons and // check that these were computed upstream and create a bit mask TObjArray* cfgDileptonTrack_objArrayTrackCuts = nullptr; @@ -3022,7 +3041,7 @@ struct AnalysisDileptonTrack { getTaskOptionValue(context, "analysis-asymmetric-pairing", "cfgPairCuts", cfgPairing_PairCuts, false); getTaskOptionValue(context, "analysis-asymmetric-pairing", "cfgCommonTrackCuts", cfgPairing_CommonTrackCuts, false); } - + LOG(info) << "Initialization of AnalysisDileptonTrack 3 (idstoreh)"; if (cfgPairing_TrackCuts.empty()) { LOG(fatal) << "There are no dilepton cuts specified in the upstream in the same-event-pairing or asymmetric-pairing"; } @@ -3041,7 +3060,7 @@ struct AnalysisDileptonTrack { } } } // end if (common cuts) - + LOG(info) << "Initialization of AnalysisDileptonTrack 4 (idstoreh)"; // Get also the pair cuts specified via the JSON parameters if (isBarrelAsymmetric) { getTaskOptionValue(context, "analysis-asymmetric-pairing", "cfgPairCutsJSON", cfgPairing_PairCutsJSON, false); @@ -3068,7 +3087,7 @@ struct AnalysisDileptonTrack { } else { fNLegCuts = fNCuts; } - + LOG(info) << "Initialization of AnalysisDileptonTrack 5 (idstoreh)"; // loop over single lepton cuts for (int icut = 0; icut < fNLegCuts; ++icut) { @@ -3133,6 +3152,7 @@ struct AnalysisDileptonTrack { VarManager::SetUseVars(fHistMan->GetUsedVars()); fOutputList.setObject(fHistMan->GetMainHistogramList()); + LOG(info) << "Initialization of AnalysisDileptonTrack finished (idstoreh)"; } // init parameters from CCDB From 223088f967ade268dce88f94f754110bdddf9e33 Mon Sep 17 00:00:00 2001 From: hernasab Date: Thu, 22 May 2025 14:28:51 -0500 Subject: [PATCH 1380/1650] [PWGCF] added histos (#11318) Co-authored-by: Sabrina Hernandez --- PWGCF/Flow/Tasks/flowZdcTask.cxx | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowZdcTask.cxx b/PWGCF/Flow/Tasks/flowZdcTask.cxx index 342208a8dfc..5ae64c9ff39 100644 --- a/PWGCF/Flow/Tasks/flowZdcTask.cxx +++ b/PWGCF/Flow/Tasks/flowZdcTask.cxx @@ -86,6 +86,7 @@ struct FlowZdcTask { Configurable nBinsTDC{"nBinsTDC", 150, "nbinsTDC"}; Configurable minTdc{"minTdc", -15.0, "minimum TDC"}; Configurable maxTdc{"maxTdc", 15.0, "maximum TDC"}; + Configurable cfgCollisionEnergy{"cfgCollisionEnergy", 2.68, "cfgCollisionEnergy"}; // event selection Configurable isNoCollInTimeRangeStrict{"isNoCollInTimeRangeStrict", true, "isNoCollInTimeRangeStrict?"}; Configurable isNoCollInTimeRangeStandard{"isNoCollInTimeRangeStandard", false, "isNoCollInTimeRangeStandard?"}; @@ -304,6 +305,10 @@ struct FlowZdcTask { histos.add("ZPAVsZPC", ";ZPC;ZPA;", kTH2F, {{{100, -0.5, maxZp}, {100, -0.5, maxZp}}}); histos.add("ZNAVsZPA", ";ZPA;ZNA;", kTH2F, {{{20, -0.5, maxZp}, {30, -0.5, maxZn}}}); histos.add("ZNCVsZPC", ";ZPC;ZNC;", kTH2F, {{{20, -0.5, maxZp}, {30, -0.5, maxZn}}}); + histos.add("ZNASector", ";ZNA;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZn}}); + histos.add("ZPASector", ";ZPA;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZp}}); + histos.add("ZNCSector", ";ZNC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZn}}); + histos.add("ZPCSector", ";ZPC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZp}}); histos.add("ZNCcvsZNCsum", ";ZNC common;ZNC sum towers;", kTH2F, {{{30, -0.5, maxZn}, {30, -0.5, maxZn}}}); histos.add("ZNAcvsZNAsum", ";ZNA common;ZNA sum towers;", kTH2F, {{{30, -0.5, maxZn}, {30, -0.5, maxZn}}}); histos.add("ZPCcvsZPCsum", ";ZPC common;ZPC sum towers;", kTH2F, {{{30, -0.5, maxZp}, {30, -0.5, maxZp}}}); @@ -474,10 +479,10 @@ struct FlowZdcTask { histos.fill(HIST("hEventCounter"), EvCutLabel::Zem); } - float znA = zdc.amplitudeZNA() / 2.68; - float znC = zdc.amplitudeZNC() / 2.68; - float zpA = zdc.amplitudeZPA() / 2.68; - float zpC = zdc.amplitudeZPC() / 2.68; + float znA = zdc.amplitudeZNA() / cfgCollisionEnergy; + float znC = zdc.amplitudeZNC() / cfgCollisionEnergy; + float zpA = zdc.amplitudeZPA() / cfgCollisionEnergy; + float zpC = zdc.amplitudeZPC() / cfgCollisionEnergy; float tZEM1{zdc.timeZEM1()}; float tZEM2{zdc.timeZEM2()}; @@ -514,6 +519,10 @@ struct FlowZdcTask { histos.fill(HIST("ZNC"), znC); histos.fill(HIST("ZPA"), zpA); histos.fill(HIST("ZPC"), zpC); + histos.fill(HIST("ZNASector"), sumZNA); + histos.fill(HIST("ZNCSector"), sumZNC); + histos.fill(HIST("ZPASector"), sumZPA); + histos.fill(HIST("ZPCSector"), sumZPC); histos.fill(HIST("ZN"), znA + znC); histos.fill(HIST("ZNAVsZNC"), znC, znA); histos.fill(HIST("ZNAVsZPA"), zpA, znA); From 6f8bda28f77e9f6895fa4b5502d303572cbdb9cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Thu, 22 May 2025 22:07:57 +0200 Subject: [PATCH 1381/1650] [Common] Fix bugs found by cppcheck and cpplint (#11310) --- Common/Tasks/trackqa.cxx | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/Common/Tasks/trackqa.cxx b/Common/Tasks/trackqa.cxx index 7f5498e5a2a..d10d42af8da 100644 --- a/Common/Tasks/trackqa.cxx +++ b/Common/Tasks/trackqa.cxx @@ -13,6 +13,9 @@ // Task producing basic tracking qa histograms // +#include // std::swap +#include + #include "Framework/AnalysisDataModel.h" #include "Framework/AnalysisTask.h" #include "Framework/HistogramRegistry.h" @@ -101,7 +104,7 @@ struct TrackQa { histos.fill(HIST("TrackPar/signed1Pt"), track.signed1Pt()); histos.fill(HIST("TrackPar/snp"), track.snp()); histos.fill(HIST("TrackPar/tgl"), track.tgl()); - for (unsigned int i = 0; i < 64; i++) { + for (unsigned int i = 0; i < 32; i++) { if (track.flags() & (1 << i)) { histos.fill(HIST("TrackPar/flags"), i); } @@ -161,13 +164,13 @@ struct TrackQaMc { HistogramRegistry resolution{"Resolution", {}, OutputObjHandlingPolicy::QAObject}; - void init(o2::framework::InitContext&){ - - }; - - void process(soa::Join::iterator const&){ + void init(o2::framework::InitContext&) + { + } - }; + void process(soa::Join::iterator const&) + { + } }; //**************************************************************************************** From bff333dd66ea3d1e9d1673eae1a47cf735342ac3 Mon Sep 17 00:00:00 2001 From: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> Date: Thu, 22 May 2025 23:44:58 +0200 Subject: [PATCH 1382/1650] [PWGLF] Add option to select only physical primary MC V0s (if not associated to a recoed one) (#11320) --- PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx index 216595b766e..f2cf77403be 100644 --- a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx @@ -308,6 +308,7 @@ struct StrangenessBuilder { Configurable mc_populateV0MCCoresAsymmetric{"mc_populateV0MCCoresAsymmetric", true, "populate V0MCCores table for derived data analysis, create V0Cores -> V0MCCores interlink. Saves only labeled V0s."}; Configurable mc_treatPiToMuDecays{"mc_treatPiToMuDecays", true, "if true, will correctly capture pi -> mu and V0 label will still point to originating V0 decay in those cases. Nota bene: prong info will still be for the muon!"}; Configurable mc_rapidityWindow{"mc_rapidityWindow", 0.5, "rapidity window to save non-recoed candidates"}; + Configurable mc_keepOnlyPhysicalPrimary{"mc_keepOnlyPhysicalPrimary", false, "Keep only physical primary generated V0s if not recoed"}; Configurable mc_addGeneratedK0Short{"mc_addGeneratedK0Short", true, "add V0MCCore entry for generated, not-recoed K0Short"}; Configurable mc_addGeneratedLambda{"mc_addGeneratedLambda", true, "add V0MCCore entry for generated, not-recoed Lambda"}; Configurable mc_addGeneratedAntiLambda{"mc_addGeneratedAntiLambda", true, "add V0MCCore entry for generated, not-recoed AntiLambda"}; @@ -347,6 +348,7 @@ struct StrangenessBuilder { Configurable mc_addGeneratedOmegaPlus{"mc_addGeneratedOmegaPlus", true, "add CascMCCore entry for generated, not-recoed OmegaPlus"}; Configurable mc_treatPiToMuDecays{"mc_treatPiToMuDecays", true, "if true, will correctly capture pi -> mu and V0 label will still point to originating V0 decay in those cases. Nota bene: prong info will still be for the muon!"}; Configurable mc_rapidityWindow{"mc_rapidityWindow", 0.5, "rapidity window to save non-recoed candidates"}; + Configurable mc_keepOnlyPhysicalPrimary{"mc_keepOnlyPhysicalPrimary", false, "Keep only physical primary generated cascades if not recoed"}; Configurable mc_findableDetachedCascade{"mc_findableDetachedCascade", false, "if true, generate findable cascades that have collisionId -1. Caution advised."}; } cascadeBuilderOpts; @@ -1612,6 +1614,9 @@ struct StrangenessBuilder { if (std::fabs(mcParticle.y()) > v0BuilderOpts.mc_rapidityWindow) continue; // skip outside midrapidity + if (v0BuilderOpts.mc_keepOnlyPhysicalPrimary && !mcParticle.isPhysicalPrimary()) + continue; // skip secondary MC V0s + if ( (v0BuilderOpts.mc_addGeneratedK0Short && mcParticle.pdgCode() == 310) || (v0BuilderOpts.mc_addGeneratedLambda && mcParticle.pdgCode() == 3122) || @@ -2079,6 +2084,9 @@ struct StrangenessBuilder { if (std::fabs(mcParticle.y()) > cascadeBuilderOpts.mc_rapidityWindow) continue; // skip outside midrapidity + if (cascadeBuilderOpts.mc_keepOnlyPhysicalPrimary && !mcParticle.isPhysicalPrimary()) + continue; // skip secondary MC cascades + if ( (cascadeBuilderOpts.mc_addGeneratedXiMinus && mcParticle.pdgCode() == 3312) || (cascadeBuilderOpts.mc_addGeneratedXiPlus && mcParticle.pdgCode() == -3312) || From 771355c97ad1322243b73384d8834856ff01a459 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Fri, 23 May 2025 03:55:23 +0200 Subject: [PATCH 1383/1650] =?UTF-8?q?[PWGLF]=20Add=20new=20mix=20event=20p?= =?UTF-8?q?rocess=20function=20to=20check=20biases=20in=20phi=20meson=20fl?= =?UTF-8?q?ow=20=E2=80=A6=20(#11317)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PWGLF/Tasks/Resonances/phipbpb.cxx | 117 +++++++++++++++++++++++++++-- 1 file changed, 112 insertions(+), 5 deletions(-) diff --git a/PWGLF/Tasks/Resonances/phipbpb.cxx b/PWGLF/Tasks/Resonances/phipbpb.cxx index c842017274d..7ab2dd9aa39 100644 --- a/PWGLF/Tasks/Resonances/phipbpb.cxx +++ b/PWGLF/Tasks/Resonances/phipbpb.cxx @@ -216,6 +216,7 @@ struct phipbpb { histos.add("hSparseV2SameEventCosDeltaPhi", "hSparseV2SameEventCosDeltaPhi", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); histos.add("hSparseV2MixedEventCosDeltaPhi", "hSparseV2MixedEventCosDeltaPhi", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); + histos.add("hSparseV2MixEPAngleCosDeltaPhi", "hSparseV2MixEPAngleCosDeltaPhi", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); histos.add("hSparseV2SameEventCos2DeltaPhi", "hSparseV2SameEventCos2DeltaPhi", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); histos.add("hSparseV2MixedEventCos2DeltaPhi", "hSparseV2MixedEventCos2DeltaPhi", HistType::kTHnSparseD, {thnAxisInvMass, thnAxisPt, thnAxisV2, thnAxisCentrality}); @@ -461,7 +462,8 @@ struct phipbpb { ConfigurableAxis axisEPAngle{"axisEPAngle", {6, -TMath::Pi() / 2, TMath::Pi() / 2}, "event plane angle"}; ConfigurableAxis axisOccup{"axisOccup", {20, -0.5, 40000.0}, "occupancy axis"}; - using BinningTypeVertexContributor = ColumnBinningPolicy; + // using BinningTypeVertexContributor = ColumnBinningPolicy; + using BinningTypeVertexContributor = ColumnBinningPolicy; ROOT::Math::PxPyPzMVector PhiMesonMother, KaonPlus, KaonMinus, fourVecDauCM; ROOT::Math::XYZVector threeVecDauCM, threeVecDauCMXY, eventplaneVec, eventplaneVecNorm, beamvector; int currentRunNumber = -999; @@ -711,10 +713,115 @@ struct phipbpb { } } PROCESS_SWITCH(phipbpb, processSameEvent, "Process Same event", true); + + BinningTypeVertexContributor binningOnEPAngle{{axisVertex, axisMultiplicityClass, axisEPAngle}, true}; + Preslice tracksPerCollision = aod::track::collisionId; + void processMEAcc(EventCandidates const& collisions, TrackCandidates const& tracks) + { + for (auto& [collision1, collision2] : selfCombinations(binningOnEPAngle, cfgNoMixedEvents, -1, collisions, collisions)) { + + if (!collision1.sel8() || !collision1.triggereventep() || !collision1.selection_bit(aod::evsel::kNoSameBunchPileup)) { + continue; + } + if (!collision2.sel8() || !collision2.triggereventep() || !collision2.selection_bit(aod::evsel::kNoSameBunchPileup)) { + continue; + } + int occupancy1 = collision1.trackOccupancyInTimeRange(); + int occupancy2 = collision2.trackOccupancyInTimeRange(); + if (occupancy1 > cfgCutOccupancy) { + continue; + } + if (occupancy2 > cfgCutOccupancy) { + continue; + } + if (additionalEvsel && !collision1.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + continue; + } + if (additionalEvsel && !collision2.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + continue; + } + if (additionalEvselITS && !collision1.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + continue; + } + if (additionalEvselITS && !collision2.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + continue; + } + auto centrality = collision1.centFT0C(); + auto psiFT0C = collision1.psiFT0C(); + auto QFT0C = collision1.qFT0C(); + o2::aod::ITSResponse itsResponse; + auto grouptrack1 = tracks.sliceBy(tracksPerCollision, collision2.globalIndex()); + auto grouptrack2 = tracks.sliceBy(tracksPerCollision, collision2.globalIndex()); + for (auto& [t1, t2] : soa::combinations(o2::soa::CombinationsFullIndexPolicy(grouptrack1, grouptrack2))) { + if (t2.index() <= t1.index()) { + continue; + } + if (t1.sign() * t2.sign() > 0) { + continue; + } + if (!selectionTrack(t1)) { + continue; + } + if (ispTdepPID && !isTOFOnly && !selectionPIDpTdependent(t1)) { + continue; + } + if (!ispTdepPID && !isTOFOnly && !selectionPID(t1)) { + continue; + } + if (isTOFOnly && !selectionPID2(t1)) { + continue; + } + if (useGlobalTrack && t1.p() < 1.0 && !(itsResponse.nSigmaITS(t1) > -2.5 && itsResponse.nSigmaITS(t1) < 2.5)) { + continue; + } + + if (!selectionTrack(t2)) { + continue; + } + if (ispTdepPID && !isTOFOnly && !selectionPIDpTdependent(t2)) { + continue; + } + if (!ispTdepPID && !isTOFOnly && !selectionPID(t2)) { + continue; + } + if (isTOFOnly && !selectionPID2(t2)) { + continue; + } + if (useGlobalTrack && t2.p() < 1.0 && !(itsResponse.nSigmaITS(t2) > -2.5 && itsResponse.nSigmaITS(t2) < 2.5)) { + continue; + } + + if (!selectionPair(t1, t2)) { + continue; + } + if (removefaketrak && isFakeKaon(t1)) { + continue; + } + if (removefaketrak && isFakeKaon(t2)) { + continue; + } + + KaonPlus = ROOT::Math::PxPyPzMVector(t1.px(), t1.py(), t1.pz(), massKa); + KaonMinus = ROOT::Math::PxPyPzMVector(t2.px(), t2.py(), t2.pz(), massKa); + PhiMesonMother = KaonPlus + KaonMinus; + auto phiminuspsi = GetPhiInRange(PhiMesonMother.Phi() - psiFT0C); + auto v2 = TMath::Cos(2.0 * phiminuspsi); + if (TMath::Abs(PhiMesonMother.Rapidity()) > confRapidity) { + continue; + } + if (useSP) { + histos.fill(HIST("hSparseV2MixEPAngleCosDeltaPhi"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2 * QFT0C, centrality); + } else { + histos.fill(HIST("hSparseV2MixEPAngleCosDeltaPhi"), PhiMesonMother.M(), PhiMesonMother.Pt(), v2, centrality); + } + } + } + } + PROCESS_SWITCH(phipbpb, processMEAcc, "Process ME Acceptance", true); void processMixedEventOpti(EventCandidates const& collisions, TrackCandidates const& tracks) { auto tracksTuple = std::make_tuple(tracks); - BinningTypeVertexContributor binningOnPositions{{axisVertex, axisMultiplicityClass, axisOccup}, true}; + BinningTypeVertexContributor binningOnPositions{{axisVertex, axisMultiplicityClass, axisEPAngle}, true}; SameKindPair pair{binningOnPositions, cfgNoMixedEvents, -1, collisions, tracksTuple, &cache}; for (auto& [collision1, tracks1, collision2, tracks2] : pair) { // if (!collision1.sel8() || !collision1.triggereventep() || !collision1.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision1.selection_bit(aod::evsel::kNoITSROFrameBorder) || !collision1.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision1.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV) || !collision1.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { @@ -729,9 +836,9 @@ struct phipbpb { if (!collision2.sel8() || !collision2.triggereventep() || !collision2.selection_bit(aod::evsel::kNoSameBunchPileup)) { continue; } - if (collision1.bcId() == collision2.bcId()) { - continue; - } + // if (collision1.bcId() == collision2.bcId()) { + // continue; + // } o2::aod::ITSResponse itsResponse; int occupancy1 = collision1.trackOccupancyInTimeRange(); int occupancy2 = collision2.trackOccupancyInTimeRange(); From cbb891bb7511966cf60d7d9280ecdb18b1a6f455 Mon Sep 17 00:00:00 2001 From: Giulio Eulisse <10544+ktf@users.noreply.github.com> Date: Fri, 23 May 2025 09:15:06 +0200 Subject: [PATCH 1384/1650] [Common,PWGCF,PWGDQ,PWGEM,PWGHF,PWGJE,PWGLF,Trigger,Tutorial] Fix all copyright statements, excluding the change from the git blame. (#11319) --- .git-blame-ignore-revs | 0 Common/TableProducer/mftmchMatchingML.cxx | 2 +- EventFiltering/PWGCF/CFFilterQA.cxx | 2 +- PWGCF/DataModel/FemtoDerived.h | 2 +- PWGCF/Femto/CMakeLists.txt | 2 +- PWGCF/Femto/TableProducer/CMakeLists.txt | 2 +- PWGCF/FemtoDream/CMakeLists.txt | 2 +- PWGCF/FemtoDream/Core/CMakeLists.txt | 2 +- PWGCF/FemtoDream/Core/femtoDreamCascadeSelection.h | 2 +- PWGCF/FemtoDream/Core/femtoDreamCollisionSelection.h | 2 +- PWGCF/FemtoDream/Core/femtoDreamContainer.h | 2 +- PWGCF/FemtoDream/Core/femtoDreamContainerThreeBody.h | 2 +- PWGCF/FemtoDream/Core/femtoDreamDetaDphiStar.h | 2 +- PWGCF/FemtoDream/Core/femtoDreamEventHisto.h | 2 +- PWGCF/FemtoDream/Core/femtoDreamMath.h | 2 +- PWGCF/FemtoDream/Core/femtoDreamObjectSelection.h | 2 +- PWGCF/FemtoDream/Core/femtoDreamPairCleaner.h | 2 +- PWGCF/FemtoDream/Core/femtoDreamParticleHisto.h | 2 +- PWGCF/FemtoDream/Core/femtoDreamSelection.h | 2 +- PWGCF/FemtoDream/Core/femtoDreamTrackSelection.h | 2 +- PWGCF/FemtoDream/Core/femtoDreamUtils.h | 2 +- PWGCF/FemtoDream/Core/femtoDreamV0Selection.h | 2 +- PWGCF/FemtoDream/DataModel/CMakeLists.txt | 2 +- .../FemtoDream/TableProducer/femtoDreamProducerReducedTask.cxx | 2 +- PWGCF/FemtoDream/TableProducer/femtoDreamProducerTask.cxx | 2 +- .../TableProducer/femtoDreamProducerTaskForSpecificAnalysis.cxx | 2 +- .../TableProducer/femtoDreamProducerTaskWithCascades.cxx | 2 +- PWGCF/FemtoDream/Tasks/CMakeLists.txt | 2 +- PWGCF/FemtoDream/Tasks/femtoDreamCollisionMasker.cxx | 2 +- PWGCF/FemtoDream/Tasks/femtoDreamDebugCascade.cxx | 2 +- PWGCF/FemtoDream/Tasks/femtoDreamDebugTrack.cxx | 2 +- PWGCF/FemtoDream/Tasks/femtoDreamDebugV0.cxx | 2 +- PWGCF/FemtoDream/Tasks/femtoDreamHashTask.cxx | 2 +- PWGCF/FemtoDream/Tasks/femtoDreamPairTaskTrackCascade.cxx | 2 +- PWGCF/FemtoDream/Tasks/femtoDreamPairTaskTrackTrack.cxx | 2 +- PWGCF/FemtoDream/Tasks/femtoDreamPairTaskTrackV0.cxx | 2 +- PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackTrack.cxx | 2 +- PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackV0.cxx | 2 +- PWGCF/FemtoDream/Utils/CMakeLists.txt | 2 +- PWGCF/FemtoDream/Utils/femtoDreamCutCulator.cxx | 2 +- PWGCF/FemtoDream/Utils/femtoDreamCutCulator.h | 2 +- PWGCF/FemtoUniverse/Core/FemtoUniverse3DContainer.h | 2 +- PWGCF/FemtoUniverse/Core/FemtoUniverseAngularContainer.h | 2 +- PWGCF/FemtoUniverse/Core/FemtoUniverseCascadeSelection.h | 2 +- PWGCF/FemtoUniverse/Core/FemtoUniverseCollisionSelection.h | 2 +- PWGCF/FemtoUniverse/Core/FemtoUniverseContainer.h | 2 +- PWGCF/FemtoUniverse/Core/FemtoUniverseCutculator.h | 2 +- PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h | 2 +- PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCalculator.h | 2 +- PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCorrection.h | 2 +- PWGCF/FemtoUniverse/Core/FemtoUniverseEventHisto.h | 2 +- PWGCF/FemtoUniverse/Core/FemtoUniverseFemtoContainer.h | 2 +- PWGCF/FemtoUniverse/Core/FemtoUniverseMath.h | 2 +- PWGCF/FemtoUniverse/Core/FemtoUniverseObjectSelection.h | 2 +- PWGCF/FemtoUniverse/Core/FemtoUniversePairCleaner.h | 2 +- PWGCF/FemtoUniverse/Core/FemtoUniversePairSHCentMultKt.h | 2 +- PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h | 2 +- PWGCF/FemtoUniverse/Core/FemtoUniversePhiSelection.h | 2 +- PWGCF/FemtoUniverse/Core/FemtoUniverseSHContainer.h | 2 +- PWGCF/FemtoUniverse/Core/FemtoUniverseSelection.h | 2 +- PWGCF/FemtoUniverse/Core/FemtoUniverseSoftPionRemoval.h | 2 +- PWGCF/FemtoUniverse/Core/FemtoUniverseSpherHarMath.h | 2 +- PWGCF/FemtoUniverse/Core/FemtoUniverseTrackSelection.h | 2 +- PWGCF/FemtoUniverse/Core/FemtoUniverseV0Selection.h | 2 +- PWGCF/FemtoUniverse/Core/femtoUtils.h | 2 +- PWGCF/FemtoUniverse/DataModel/FemtoDerived.h | 2 +- .../TableProducer/femtoUniverseProducerMCTruthTask.cxx | 2 +- .../TableProducer/femtoUniverseProducerReducedTask.cxx | 2 +- PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx | 2 +- .../TableProducer/femtoUniverseProducerTaskV0Only.cxx | 2 +- PWGCF/FemtoUniverse/Tasks/femtoUniverseCutCulator.cxx | 2 +- PWGCF/FemtoUniverse/Tasks/femtoUniverseDebugTrack.cxx | 2 +- PWGCF/FemtoUniverse/Tasks/femtoUniverseDebugV0.cxx | 2 +- PWGCF/FemtoUniverse/Tasks/femtoUniverseEfficiencyBase.cxx | 2 +- PWGCF/FemtoUniverse/Tasks/femtoUniverseHashTask.cxx | 2 +- .../Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx | 2 +- PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx | 2 +- PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackNucleus.cxx | 2 +- PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx | 2 +- PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack.cxx | 2 +- .../Tasks/femtoUniversePairTaskTrackTrack3DMultKtExtended.cxx | 2 +- .../Tasks/femtoUniversePairTaskTrackTrackExtended.cxx | 2 +- PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackMC.cxx | 2 +- .../Tasks/femtoUniversePairTaskTrackTrackMcTruth.cxx | 2 +- .../Tasks/femtoUniversePairTaskTrackTrackMultKtExtended.cxx | 2 +- .../femtoUniversePairTaskTrackTrackSpherHarMultKtExtended.cxx | 2 +- .../Tasks/femtoUniversePairTaskTrackV0Extended.cxx | 2 +- PWGDQ/Tasks/MIDefficiency.cxx | 2 +- PWGDQ/Tasks/taskFwdTrackPid.cxx | 2 +- PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx | 2 +- PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx | 2 +- PWGEM/PhotonMeson/Tasks/emcalQC.cxx | 2 +- PWGEM/PhotonMeson/Tasks/mcGeneratorStudies.cxx | 2 +- PWGEM/PhotonMeson/Utils/ClusterHistograms.h | 2 +- PWGHF/HFC/TableProducer/femtoDreamProducer.cxx | 2 +- PWGHF/HFC/Tasks/taskCharmHadronsFemtoDream.cxx | 2 +- PWGHF/TableProducer/treeCreatorDsToKKPi.cxx | 2 +- PWGJE/DataModel/EMCALMatchedCollisions.h | 2 +- PWGJE/Tasks/emcVertexSelectionQA.cxx | 2 +- PWGJE/Tasks/emcalPi0EnergyScaleCalib.cxx | 2 +- PWGJE/Tasks/hfFragmentationFunction.cxx | 2 +- PWGJE/Tasks/mcGeneratorStudies.cxx | 2 +- PWGLF/Tasks/GlobalEventProperties/dndeta-mft-pp.cxx | 2 +- PWGLF/Tasks/Resonances/phianalysisTHnSparse.cxx | 2 +- PWGLF/Tasks/Strangeness/hyperon-reco-test.cxx | 2 +- PWGLF/Utils/rsnOutput.h | 2 +- PWGMM/Mult/Tasks/dndeta-mft.cxx | 2 +- PWGMM/Mult/Tasks/flattenicty-chrg.cxx | 2 +- Tutorials/ML/applyMlSelection.cxx | 2 +- Tutorials/ML/run_applyMlSelection.sh | 2 +- Tutorials/PWGEM/pcm/CMakeLists.txt | 2 +- Tutorials/PWGEM/pcm/pcmtutorial.cxx | 2 +- 112 files changed, 111 insertions(+), 111 deletions(-) create mode 100644 .git-blame-ignore-revs diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/Common/TableProducer/mftmchMatchingML.cxx b/Common/TableProducer/mftmchMatchingML.cxx index fba6c1464eb..4c813316275 100644 --- a/Common/TableProducer/mftmchMatchingML.cxx +++ b/Common/TableProducer/mftmchMatchingML.cxx @@ -1,4 +1,4 @@ -// Copyright 2020-2022 CERN and copyright holders of ALICE O2. +// Copyright 2020-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/EventFiltering/PWGCF/CFFilterQA.cxx b/EventFiltering/PWGCF/CFFilterQA.cxx index 70e80b74e78..372b3387dc1 100644 --- a/EventFiltering/PWGCF/CFFilterQA.cxx +++ b/EventFiltering/PWGCF/CFFilterQA.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/DataModel/FemtoDerived.h b/PWGCF/DataModel/FemtoDerived.h index 046d4c0a94f..4caf0166303 100644 --- a/PWGCF/DataModel/FemtoDerived.h +++ b/PWGCF/DataModel/FemtoDerived.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/Femto/CMakeLists.txt b/PWGCF/Femto/CMakeLists.txt index 80706fd8f1f..3b94846cb86 100644 --- a/PWGCF/Femto/CMakeLists.txt +++ b/PWGCF/Femto/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright 2019-2024 CERN and copyright holders of ALICE O2. +# Copyright 2019-2025 CERN and copyright holders of ALICE O2. # See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. # All rights not expressly granted are reserved. # diff --git a/PWGCF/Femto/TableProducer/CMakeLists.txt b/PWGCF/Femto/TableProducer/CMakeLists.txt index 2510c3afd9a..10a75557174 100644 --- a/PWGCF/Femto/TableProducer/CMakeLists.txt +++ b/PWGCF/Femto/TableProducer/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright 2019-2024 CERN and copyright holders of ALICE O2. +# Copyright 2019-2025 CERN and copyright holders of ALICE O2. # See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. # All rights not expressly granted are reserved. # diff --git a/PWGCF/FemtoDream/CMakeLists.txt b/PWGCF/FemtoDream/CMakeLists.txt index d9a4175dd3a..549fb52a6f6 100644 --- a/PWGCF/FemtoDream/CMakeLists.txt +++ b/PWGCF/FemtoDream/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright 2019-2024 CERN and copyright holders of ALICE O2. +# Copyright 2019-2025 CERN and copyright holders of ALICE O2. # See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. # All rights not expressly granted are reserved. # diff --git a/PWGCF/FemtoDream/Core/CMakeLists.txt b/PWGCF/FemtoDream/Core/CMakeLists.txt index 4c182222bf2..da01f4ab983 100644 --- a/PWGCF/FemtoDream/Core/CMakeLists.txt +++ b/PWGCF/FemtoDream/Core/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright 2019-2024 CERN and copyright holders of ALICE O2. +# Copyright 2019-2025 CERN and copyright holders of ALICE O2. # See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. # All rights not expressly granted are reserved. # diff --git a/PWGCF/FemtoDream/Core/femtoDreamCascadeSelection.h b/PWGCF/FemtoDream/Core/femtoDreamCascadeSelection.h index bc9289dc03a..2a07c851d09 100644 --- a/PWGCF/FemtoDream/Core/femtoDreamCascadeSelection.h +++ b/PWGCF/FemtoDream/Core/femtoDreamCascadeSelection.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/Core/femtoDreamCollisionSelection.h b/PWGCF/FemtoDream/Core/femtoDreamCollisionSelection.h index ef647b69f52..8fe58ce9d7b 100644 --- a/PWGCF/FemtoDream/Core/femtoDreamCollisionSelection.h +++ b/PWGCF/FemtoDream/Core/femtoDreamCollisionSelection.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/Core/femtoDreamContainer.h b/PWGCF/FemtoDream/Core/femtoDreamContainer.h index 8a9038e6198..5e0222a4f07 100644 --- a/PWGCF/FemtoDream/Core/femtoDreamContainer.h +++ b/PWGCF/FemtoDream/Core/femtoDreamContainer.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/Core/femtoDreamContainerThreeBody.h b/PWGCF/FemtoDream/Core/femtoDreamContainerThreeBody.h index b1c2c322cd8..a6c60793060 100644 --- a/PWGCF/FemtoDream/Core/femtoDreamContainerThreeBody.h +++ b/PWGCF/FemtoDream/Core/femtoDreamContainerThreeBody.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/Core/femtoDreamDetaDphiStar.h b/PWGCF/FemtoDream/Core/femtoDreamDetaDphiStar.h index d8711b6fbc5..58dc6c9ded4 100644 --- a/PWGCF/FemtoDream/Core/femtoDreamDetaDphiStar.h +++ b/PWGCF/FemtoDream/Core/femtoDreamDetaDphiStar.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/Core/femtoDreamEventHisto.h b/PWGCF/FemtoDream/Core/femtoDreamEventHisto.h index 4f70555a849..2d668d15c58 100644 --- a/PWGCF/FemtoDream/Core/femtoDreamEventHisto.h +++ b/PWGCF/FemtoDream/Core/femtoDreamEventHisto.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/Core/femtoDreamMath.h b/PWGCF/FemtoDream/Core/femtoDreamMath.h index bb3c37b284b..aba07f96c9c 100644 --- a/PWGCF/FemtoDream/Core/femtoDreamMath.h +++ b/PWGCF/FemtoDream/Core/femtoDreamMath.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/Core/femtoDreamObjectSelection.h b/PWGCF/FemtoDream/Core/femtoDreamObjectSelection.h index 21440f35414..d01ce564f66 100644 --- a/PWGCF/FemtoDream/Core/femtoDreamObjectSelection.h +++ b/PWGCF/FemtoDream/Core/femtoDreamObjectSelection.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/Core/femtoDreamPairCleaner.h b/PWGCF/FemtoDream/Core/femtoDreamPairCleaner.h index 5243f562fbe..3b248657b1f 100644 --- a/PWGCF/FemtoDream/Core/femtoDreamPairCleaner.h +++ b/PWGCF/FemtoDream/Core/femtoDreamPairCleaner.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/Core/femtoDreamParticleHisto.h b/PWGCF/FemtoDream/Core/femtoDreamParticleHisto.h index 244466d2cb2..4148e8b3efc 100644 --- a/PWGCF/FemtoDream/Core/femtoDreamParticleHisto.h +++ b/PWGCF/FemtoDream/Core/femtoDreamParticleHisto.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/Core/femtoDreamSelection.h b/PWGCF/FemtoDream/Core/femtoDreamSelection.h index 1260f358830..0e3592bf650 100644 --- a/PWGCF/FemtoDream/Core/femtoDreamSelection.h +++ b/PWGCF/FemtoDream/Core/femtoDreamSelection.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/Core/femtoDreamTrackSelection.h b/PWGCF/FemtoDream/Core/femtoDreamTrackSelection.h index f1006504d0c..9cab0f9e78b 100644 --- a/PWGCF/FemtoDream/Core/femtoDreamTrackSelection.h +++ b/PWGCF/FemtoDream/Core/femtoDreamTrackSelection.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/Core/femtoDreamUtils.h b/PWGCF/FemtoDream/Core/femtoDreamUtils.h index b170985233f..c5db8dcc70e 100644 --- a/PWGCF/FemtoDream/Core/femtoDreamUtils.h +++ b/PWGCF/FemtoDream/Core/femtoDreamUtils.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/Core/femtoDreamV0Selection.h b/PWGCF/FemtoDream/Core/femtoDreamV0Selection.h index af9290d51ad..40158105a5b 100644 --- a/PWGCF/FemtoDream/Core/femtoDreamV0Selection.h +++ b/PWGCF/FemtoDream/Core/femtoDreamV0Selection.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/DataModel/CMakeLists.txt b/PWGCF/FemtoDream/DataModel/CMakeLists.txt index 4c182222bf2..da01f4ab983 100644 --- a/PWGCF/FemtoDream/DataModel/CMakeLists.txt +++ b/PWGCF/FemtoDream/DataModel/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright 2019-2024 CERN and copyright holders of ALICE O2. +# Copyright 2019-2025 CERN and copyright holders of ALICE O2. # See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. # All rights not expressly granted are reserved. # diff --git a/PWGCF/FemtoDream/TableProducer/femtoDreamProducerReducedTask.cxx b/PWGCF/FemtoDream/TableProducer/femtoDreamProducerReducedTask.cxx index 621b2693ff9..a879a18517f 100644 --- a/PWGCF/FemtoDream/TableProducer/femtoDreamProducerReducedTask.cxx +++ b/PWGCF/FemtoDream/TableProducer/femtoDreamProducerReducedTask.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/TableProducer/femtoDreamProducerTask.cxx b/PWGCF/FemtoDream/TableProducer/femtoDreamProducerTask.cxx index 6a80a9d2caa..7272382f357 100644 --- a/PWGCF/FemtoDream/TableProducer/femtoDreamProducerTask.cxx +++ b/PWGCF/FemtoDream/TableProducer/femtoDreamProducerTask.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/TableProducer/femtoDreamProducerTaskForSpecificAnalysis.cxx b/PWGCF/FemtoDream/TableProducer/femtoDreamProducerTaskForSpecificAnalysis.cxx index 10e4c5c5254..9e7a30a9719 100644 --- a/PWGCF/FemtoDream/TableProducer/femtoDreamProducerTaskForSpecificAnalysis.cxx +++ b/PWGCF/FemtoDream/TableProducer/femtoDreamProducerTaskForSpecificAnalysis.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/TableProducer/femtoDreamProducerTaskWithCascades.cxx b/PWGCF/FemtoDream/TableProducer/femtoDreamProducerTaskWithCascades.cxx index 34702c55d83..a7e02ec87e6 100644 --- a/PWGCF/FemtoDream/TableProducer/femtoDreamProducerTaskWithCascades.cxx +++ b/PWGCF/FemtoDream/TableProducer/femtoDreamProducerTaskWithCascades.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/Tasks/CMakeLists.txt b/PWGCF/FemtoDream/Tasks/CMakeLists.txt index b0175157386..ecc4f689ae0 100644 --- a/PWGCF/FemtoDream/Tasks/CMakeLists.txt +++ b/PWGCF/FemtoDream/Tasks/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright 2019-2024 CERN and copyright holders of ALICE O2. +# Copyright 2019-2025 CERN and copyright holders of ALICE O2. # See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. # All rights not expressly granted are reserved. # diff --git a/PWGCF/FemtoDream/Tasks/femtoDreamCollisionMasker.cxx b/PWGCF/FemtoDream/Tasks/femtoDreamCollisionMasker.cxx index 218c69d9699..1ca9d808073 100644 --- a/PWGCF/FemtoDream/Tasks/femtoDreamCollisionMasker.cxx +++ b/PWGCF/FemtoDream/Tasks/femtoDreamCollisionMasker.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2023 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/Tasks/femtoDreamDebugCascade.cxx b/PWGCF/FemtoDream/Tasks/femtoDreamDebugCascade.cxx index dd49096907e..54324361ec0 100644 --- a/PWGCF/FemtoDream/Tasks/femtoDreamDebugCascade.cxx +++ b/PWGCF/FemtoDream/Tasks/femtoDreamDebugCascade.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/Tasks/femtoDreamDebugTrack.cxx b/PWGCF/FemtoDream/Tasks/femtoDreamDebugTrack.cxx index eb19d28486d..68fab988fb9 100644 --- a/PWGCF/FemtoDream/Tasks/femtoDreamDebugTrack.cxx +++ b/PWGCF/FemtoDream/Tasks/femtoDreamDebugTrack.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/Tasks/femtoDreamDebugV0.cxx b/PWGCF/FemtoDream/Tasks/femtoDreamDebugV0.cxx index c20d2b2a445..91010d4368e 100644 --- a/PWGCF/FemtoDream/Tasks/femtoDreamDebugV0.cxx +++ b/PWGCF/FemtoDream/Tasks/femtoDreamDebugV0.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/Tasks/femtoDreamHashTask.cxx b/PWGCF/FemtoDream/Tasks/femtoDreamHashTask.cxx index 78fe8c1cce4..fe0aa6c0e3d 100644 --- a/PWGCF/FemtoDream/Tasks/femtoDreamHashTask.cxx +++ b/PWGCF/FemtoDream/Tasks/femtoDreamHashTask.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/Tasks/femtoDreamPairTaskTrackCascade.cxx b/PWGCF/FemtoDream/Tasks/femtoDreamPairTaskTrackCascade.cxx index c632d4648c8..05696761afa 100644 --- a/PWGCF/FemtoDream/Tasks/femtoDreamPairTaskTrackCascade.cxx +++ b/PWGCF/FemtoDream/Tasks/femtoDreamPairTaskTrackCascade.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/Tasks/femtoDreamPairTaskTrackTrack.cxx b/PWGCF/FemtoDream/Tasks/femtoDreamPairTaskTrackTrack.cxx index 5cfd8664985..9f080fd2dd0 100644 --- a/PWGCF/FemtoDream/Tasks/femtoDreamPairTaskTrackTrack.cxx +++ b/PWGCF/FemtoDream/Tasks/femtoDreamPairTaskTrackTrack.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/Tasks/femtoDreamPairTaskTrackV0.cxx b/PWGCF/FemtoDream/Tasks/femtoDreamPairTaskTrackV0.cxx index fccbb1716a8..7798f3d59c8 100644 --- a/PWGCF/FemtoDream/Tasks/femtoDreamPairTaskTrackV0.cxx +++ b/PWGCF/FemtoDream/Tasks/femtoDreamPairTaskTrackV0.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackTrack.cxx b/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackTrack.cxx index 226eaa5c8fb..899de5659b1 100644 --- a/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackTrack.cxx +++ b/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackTrack.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackV0.cxx b/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackV0.cxx index 224515339c9..136b8f9d5ff 100644 --- a/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackV0.cxx +++ b/PWGCF/FemtoDream/Tasks/femtoDreamTripletTaskTrackTrackV0.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/Utils/CMakeLists.txt b/PWGCF/FemtoDream/Utils/CMakeLists.txt index 11e95315fba..a7e29b7839a 100644 --- a/PWGCF/FemtoDream/Utils/CMakeLists.txt +++ b/PWGCF/FemtoDream/Utils/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright 2019-2024 CERN and copyright holders of ALICE O2. +# Copyright 2019-2025 CERN and copyright holders of ALICE O2. # See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. # All rights not expressly granted are reserved. # diff --git a/PWGCF/FemtoDream/Utils/femtoDreamCutCulator.cxx b/PWGCF/FemtoDream/Utils/femtoDreamCutCulator.cxx index 5794f81d7d9..d6aa862851f 100644 --- a/PWGCF/FemtoDream/Utils/femtoDreamCutCulator.cxx +++ b/PWGCF/FemtoDream/Utils/femtoDreamCutCulator.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoDream/Utils/femtoDreamCutCulator.h b/PWGCF/FemtoDream/Utils/femtoDreamCutCulator.h index f36fd80481a..f54a9ff62a4 100644 --- a/PWGCF/FemtoDream/Utils/femtoDreamCutCulator.h +++ b/PWGCF/FemtoDream/Utils/femtoDreamCutCulator.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverse3DContainer.h b/PWGCF/FemtoUniverse/Core/FemtoUniverse3DContainer.h index 9d5eee9d2f5..864487cdcb0 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverse3DContainer.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverse3DContainer.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseAngularContainer.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseAngularContainer.h index 4d1f65c59fe..4d267fb67d3 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseAngularContainer.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseAngularContainer.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseCascadeSelection.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseCascadeSelection.h index c0dd3ad308d..3a389da705e 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseCascadeSelection.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseCascadeSelection.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseCollisionSelection.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseCollisionSelection.h index fc33b37ad9a..633bba05760 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseCollisionSelection.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseCollisionSelection.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseContainer.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseContainer.h index 67dce9fc125..04478ec7e0f 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseContainer.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseContainer.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseCutculator.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseCutculator.h index 863ecee389d..40b7c425e5c 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseCutculator.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseCutculator.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h index 792db50bd26..b13e0e61a5c 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCalculator.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCalculator.h index 186173ba615..a96b70180aa 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCalculator.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCalculator.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCorrection.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCorrection.h index b4a1ff97539..a26b6cbc966 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCorrection.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCorrection.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseEventHisto.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseEventHisto.h index 36e81e81e76..03d4b5b1fb4 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseEventHisto.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseEventHisto.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseFemtoContainer.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseFemtoContainer.h index e973cadee90..4719561ccf6 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseFemtoContainer.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseFemtoContainer.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseMath.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseMath.h index 556f075d819..a55c896fb6b 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseMath.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseMath.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseObjectSelection.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseObjectSelection.h index 18281ac198b..07491f92c8f 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseObjectSelection.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseObjectSelection.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniversePairCleaner.h b/PWGCF/FemtoUniverse/Core/FemtoUniversePairCleaner.h index 6b73b56466d..b6a54f60b71 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniversePairCleaner.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniversePairCleaner.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniversePairSHCentMultKt.h b/PWGCF/FemtoUniverse/Core/FemtoUniversePairSHCentMultKt.h index 404fb540745..ea8626cbe32 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniversePairSHCentMultKt.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniversePairSHCentMultKt.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h index 18f050b183f..865efa0f36d 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniversePhiSelection.h b/PWGCF/FemtoUniverse/Core/FemtoUniversePhiSelection.h index 80bf1797414..0ee0bfe4162 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniversePhiSelection.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniversePhiSelection.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseSHContainer.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseSHContainer.h index e4a0b9d11bd..558874133cb 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseSHContainer.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseSHContainer.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseSelection.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseSelection.h index ac49b2d6f42..63d9646cdde 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseSelection.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseSelection.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseSoftPionRemoval.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseSoftPionRemoval.h index ac374c05074..9631b5b3377 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseSoftPionRemoval.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseSoftPionRemoval.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseSpherHarMath.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseSpherHarMath.h index bb0e8bdaf22..d92560ceb72 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseSpherHarMath.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseSpherHarMath.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseTrackSelection.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseTrackSelection.h index b94a8f85650..75276f24a6d 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseTrackSelection.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseTrackSelection.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseV0Selection.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseV0Selection.h index aa2aad31d23..805da180cc3 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseV0Selection.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseV0Selection.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Core/femtoUtils.h b/PWGCF/FemtoUniverse/Core/femtoUtils.h index 080315a594f..70a02e98b8c 100644 --- a/PWGCF/FemtoUniverse/Core/femtoUtils.h +++ b/PWGCF/FemtoUniverse/Core/femtoUtils.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/DataModel/FemtoDerived.h b/PWGCF/FemtoUniverse/DataModel/FemtoDerived.h index 05962d8cab9..9a191441f1e 100644 --- a/PWGCF/FemtoUniverse/DataModel/FemtoDerived.h +++ b/PWGCF/FemtoUniverse/DataModel/FemtoDerived.h @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerMCTruthTask.cxx b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerMCTruthTask.cxx index 1b8ba74d889..8152aee0d5e 100644 --- a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerMCTruthTask.cxx +++ b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerMCTruthTask.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerReducedTask.cxx b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerReducedTask.cxx index 3b5de3fcaa1..4ae5b3b01f2 100644 --- a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerReducedTask.cxx +++ b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerReducedTask.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx index 7eb268e3353..00ed3161ce7 100644 --- a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx +++ b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTaskV0Only.cxx b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTaskV0Only.cxx index cbb9e02b81a..968d3fab7ba 100644 --- a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTaskV0Only.cxx +++ b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTaskV0Only.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniverseCutCulator.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniverseCutCulator.cxx index 45edb854cc2..6e5af4e8d52 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniverseCutCulator.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniverseCutCulator.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniverseDebugTrack.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniverseDebugTrack.cxx index 0e07e4f4b03..984ab7d973e 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniverseDebugTrack.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniverseDebugTrack.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniverseDebugV0.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniverseDebugV0.cxx index 219c43472dd..955af5a6876 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniverseDebugV0.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniverseDebugV0.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniverseEfficiencyBase.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniverseEfficiencyBase.cxx index 490540b9dea..92e42134f0a 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniverseEfficiencyBase.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniverseEfficiencyBase.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniverseHashTask.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniverseHashTask.cxx index 7f30fda061f..6f7a7d5db2b 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniverseHashTask.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniverseHashTask.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx index 95698459ffe..180207b2e5a 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx index 909b0ec06bc..c1a5d44174d 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackNucleus.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackNucleus.cxx index 2fc7a7cf2fa..f5fe1dc91a4 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackNucleus.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackNucleus.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx index 7dd0de272fe..851c329d992 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackPhi.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack.cxx index 8bb56e9d53a..f4eb45752dc 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack3DMultKtExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack3DMultKtExtended.cxx index 066469bd0e9..f5c6242f456 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack3DMultKtExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrack3DMultKtExtended.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackExtended.cxx index b85e4832089..852fb802d68 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackExtended.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackMC.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackMC.cxx index 09386709a01..5b74f18a31e 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackMC.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackMC.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackMcTruth.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackMcTruth.cxx index 91da795ca2f..d74b76ab237 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackMcTruth.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackMcTruth.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackMultKtExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackMultKtExtended.cxx index 9d862855874..76487c59269 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackMultKtExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackMultKtExtended.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackSpherHarMultKtExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackSpherHarMultKtExtended.cxx index 0c5a91e1115..28d1295c124 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackSpherHarMultKtExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackSpherHarMultKtExtended.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx index 2cf45ce0475..cd8506ced21 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackV0Extended.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGDQ/Tasks/MIDefficiency.cxx b/PWGDQ/Tasks/MIDefficiency.cxx index 13377e5cc5c..3dcbcc4d595 100644 --- a/PWGDQ/Tasks/MIDefficiency.cxx +++ b/PWGDQ/Tasks/MIDefficiency.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2024 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGDQ/Tasks/taskFwdTrackPid.cxx b/PWGDQ/Tasks/taskFwdTrackPid.cxx index 7fb6e8e3310..cbe6e233630 100644 --- a/PWGDQ/Tasks/taskFwdTrackPid.cxx +++ b/PWGDQ/Tasks/taskFwdTrackPid.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2024 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx b/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx index 7c98bd33d95..f6299d4f056 100644 --- a/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx +++ b/PWGEM/PhotonMeson/TableProducer/photonconversionbuilder.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2023 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx b/PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx index b5bbd127f1d..ec420371e54 100644 --- a/PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx +++ b/PWGEM/PhotonMeson/Tasks/emcalBcWisePi0.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2024 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGEM/PhotonMeson/Tasks/emcalQC.cxx b/PWGEM/PhotonMeson/Tasks/emcalQC.cxx index efb18ea36a3..4173c26eccf 100644 --- a/PWGEM/PhotonMeson/Tasks/emcalQC.cxx +++ b/PWGEM/PhotonMeson/Tasks/emcalQC.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2024 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGEM/PhotonMeson/Tasks/mcGeneratorStudies.cxx b/PWGEM/PhotonMeson/Tasks/mcGeneratorStudies.cxx index 41546b0a77d..889858359ed 100644 --- a/PWGEM/PhotonMeson/Tasks/mcGeneratorStudies.cxx +++ b/PWGEM/PhotonMeson/Tasks/mcGeneratorStudies.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2024 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGEM/PhotonMeson/Utils/ClusterHistograms.h b/PWGEM/PhotonMeson/Utils/ClusterHistograms.h index 677dfa00902..bb1a641bbfe 100644 --- a/PWGEM/PhotonMeson/Utils/ClusterHistograms.h +++ b/PWGEM/PhotonMeson/Utils/ClusterHistograms.h @@ -1,4 +1,4 @@ -// Copyright 2019-2024 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx b/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx index cff8724c88d..16a32177afd 100644 --- a/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx +++ b/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGHF/HFC/Tasks/taskCharmHadronsFemtoDream.cxx b/PWGHF/HFC/Tasks/taskCharmHadronsFemtoDream.cxx index e922abade2f..b8a0005e6ac 100644 --- a/PWGHF/HFC/Tasks/taskCharmHadronsFemtoDream.cxx +++ b/PWGHF/HFC/Tasks/taskCharmHadronsFemtoDream.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGHF/TableProducer/treeCreatorDsToKKPi.cxx b/PWGHF/TableProducer/treeCreatorDsToKKPi.cxx index e83bf6f75a0..cf2f595f44b 100644 --- a/PWGHF/TableProducer/treeCreatorDsToKKPi.cxx +++ b/PWGHF/TableProducer/treeCreatorDsToKKPi.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2023 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGJE/DataModel/EMCALMatchedCollisions.h b/PWGJE/DataModel/EMCALMatchedCollisions.h index 8550bf2fe45..4acaad9dbed 100644 --- a/PWGJE/DataModel/EMCALMatchedCollisions.h +++ b/PWGJE/DataModel/EMCALMatchedCollisions.h @@ -1,4 +1,4 @@ -// Copyright 2019-2023 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGJE/Tasks/emcVertexSelectionQA.cxx b/PWGJE/Tasks/emcVertexSelectionQA.cxx index 4a803adc24f..1ec997d4edd 100644 --- a/PWGJE/Tasks/emcVertexSelectionQA.cxx +++ b/PWGJE/Tasks/emcVertexSelectionQA.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2024 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGJE/Tasks/emcalPi0EnergyScaleCalib.cxx b/PWGJE/Tasks/emcalPi0EnergyScaleCalib.cxx index 610e890cf20..bb1abd5a986 100644 --- a/PWGJE/Tasks/emcalPi0EnergyScaleCalib.cxx +++ b/PWGJE/Tasks/emcalPi0EnergyScaleCalib.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2024 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGJE/Tasks/hfFragmentationFunction.cxx b/PWGJE/Tasks/hfFragmentationFunction.cxx index 667baf91bf0..9100e78391a 100644 --- a/PWGJE/Tasks/hfFragmentationFunction.cxx +++ b/PWGJE/Tasks/hfFragmentationFunction.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2024 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGJE/Tasks/mcGeneratorStudies.cxx b/PWGJE/Tasks/mcGeneratorStudies.cxx index bef48af81a8..53d9ef15ef0 100644 --- a/PWGJE/Tasks/mcGeneratorStudies.cxx +++ b/PWGJE/Tasks/mcGeneratorStudies.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2024 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGLF/Tasks/GlobalEventProperties/dndeta-mft-pp.cxx b/PWGLF/Tasks/GlobalEventProperties/dndeta-mft-pp.cxx index c16b10edadd..452a040d92f 100644 --- a/PWGLF/Tasks/GlobalEventProperties/dndeta-mft-pp.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/dndeta-mft-pp.cxx @@ -1,4 +1,4 @@ -// Copyright 2020-2022 CERN and copyright holders of ALICE O2. +// Copyright 2020-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGLF/Tasks/Resonances/phianalysisTHnSparse.cxx b/PWGLF/Tasks/Resonances/phianalysisTHnSparse.cxx index b01295ac422..f9fa43c1d7f 100644 --- a/PWGLF/Tasks/Resonances/phianalysisTHnSparse.cxx +++ b/PWGLF/Tasks/Resonances/phianalysisTHnSparse.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2024 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGLF/Tasks/Strangeness/hyperon-reco-test.cxx b/PWGLF/Tasks/Strangeness/hyperon-reco-test.cxx index da2a9b0bd0b..5605730d709 100644 --- a/PWGLF/Tasks/Strangeness/hyperon-reco-test.cxx +++ b/PWGLF/Tasks/Strangeness/hyperon-reco-test.cxx @@ -1,4 +1,4 @@ -// Copyright 2020-2022 CERN and copyright holders of ALICE O2. +// Copyright 2020-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGLF/Utils/rsnOutput.h b/PWGLF/Utils/rsnOutput.h index e9ccc1c3ddb..592eaef40cc 100644 --- a/PWGLF/Utils/rsnOutput.h +++ b/PWGLF/Utils/rsnOutput.h @@ -1,4 +1,4 @@ -// Copyright 2019-2024 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGMM/Mult/Tasks/dndeta-mft.cxx b/PWGMM/Mult/Tasks/dndeta-mft.cxx index 7d52a606226..f70cc1d638a 100644 --- a/PWGMM/Mult/Tasks/dndeta-mft.cxx +++ b/PWGMM/Mult/Tasks/dndeta-mft.cxx @@ -1,4 +1,4 @@ -// Copyright 2020-2022 CERN and copyright holders of ALICE O2. +// Copyright 2020-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/PWGMM/Mult/Tasks/flattenicty-chrg.cxx b/PWGMM/Mult/Tasks/flattenicty-chrg.cxx index 75f628f613a..fbfa4ab578d 100644 --- a/PWGMM/Mult/Tasks/flattenicty-chrg.cxx +++ b/PWGMM/Mult/Tasks/flattenicty-chrg.cxx @@ -1,4 +1,4 @@ -// Copyright 2020-2022 CERN and copyright holders of ALICE O2. +// Copyright 2020-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/Tutorials/ML/applyMlSelection.cxx b/Tutorials/ML/applyMlSelection.cxx index dcbfb0f80e9..4ca579acc44 100644 --- a/Tutorials/ML/applyMlSelection.cxx +++ b/Tutorials/ML/applyMlSelection.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2023 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // diff --git a/Tutorials/ML/run_applyMlSelection.sh b/Tutorials/ML/run_applyMlSelection.sh index fe85f857771..8df339186ff 100755 --- a/Tutorials/ML/run_applyMlSelection.sh +++ b/Tutorials/ML/run_applyMlSelection.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2019-2023 CERN and copyright holders of ALICE O2. +# Copyright 2019-2025 CERN and copyright holders of ALICE O2. # See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. # All rights not expressly granted are reserved. # diff --git a/Tutorials/PWGEM/pcm/CMakeLists.txt b/Tutorials/PWGEM/pcm/CMakeLists.txt index e2863ae717b..72b4616ef2d 100644 --- a/Tutorials/PWGEM/pcm/CMakeLists.txt +++ b/Tutorials/PWGEM/pcm/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright 2019-2023 CERN and copyright holders of ALICE O2. +# Copyright 2019-2025 CERN and copyright holders of ALICE O2. # See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. # All rights not expressly granted are reserved. # diff --git a/Tutorials/PWGEM/pcm/pcmtutorial.cxx b/Tutorials/PWGEM/pcm/pcmtutorial.cxx index 1550f30ebeb..c10b4251991 100644 --- a/Tutorials/PWGEM/pcm/pcmtutorial.cxx +++ b/Tutorials/PWGEM/pcm/pcmtutorial.cxx @@ -1,4 +1,4 @@ -// Copyright 2019-2023 CERN and copyright holders of ALICE O2. +// Copyright 2019-2025 CERN and copyright holders of ALICE O2. // See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // From 2407c30c27dc175e4381693c9c111d3c8de3437c Mon Sep 17 00:00:00 2001 From: yhambard <127940767+yhambard@users.noreply.github.com> Date: Fri, 23 May 2025 11:28:51 +0300 Subject: [PATCH 1385/1650] [PWGEM] phosElId.cxx code refactored (#11256) --- PWGEM/Tasks/phosElId.cxx | 582 +++++++++++++++++++-------------------- 1 file changed, 290 insertions(+), 292 deletions(-) diff --git a/PWGEM/Tasks/phosElId.cxx b/PWGEM/Tasks/phosElId.cxx index 50e091a69e0..a3e401e2175 100644 --- a/PWGEM/Tasks/phosElId.cxx +++ b/PWGEM/Tasks/phosElId.cxx @@ -873,7 +873,7 @@ struct TpcElIdMassSpectrum { EtaMax{"EtaMax", {0.8f}, "eta ranges"}, PtMin{"PtMin", {0.2f}, "pt min"}, PtMax{"PtMax", {20.f}, "pt max"}, - MassSpectraJpsiMin{"MassSpectraJpsiMin", {2.5f}, "mass spectra min for Jpsi region"}, + MassSpectraJpsiMin{"MassSpectraJpsiMin", {0.5f}, "mass spectra min for Jpsi region"}, MassSpectraJpsiMax{"MassSpectraJpsiMax", {3.5f}, "mass spcetra max for Jpsi region"}, MassSpectraChicMin{"MassSpectraChicMin", {3.f}, "mass spectra min Chic region"}, MassSpectraChicMax{"MassSpectraChicMax", {4.f}, "mass spcetra max Chic region"}, @@ -900,11 +900,10 @@ struct TpcElIdMassSpectrum { PhosRangeEta{"PhosRangeEta", {0.12f}, "Phos range definition plus minus eta"}, PhosRangePhiMin{"PhosRangePhiMin", {230.f}, "Phos range angle phi min"}, PhosRangePhiMax{"PhosRangePhiMax", {330.f}, "Phos range angle phi max"}, - eeMassMin{"eeMassMin", {2.9f}, "J/psi(e+e-) Mass corridor lower limit"}, - eeMassMax{"eeMassMax", {3.3f}, "J/psi(e+e-) Mass corridor upper limit"}, + eeMassMin{"eeMassMin", {2.9f}, "J/psi(e+e-) Mass corridor lower limit (for Chic selection)"}, + eeMassMax{"eeMassMax", {3.3f}, "J/psi(e+e-) Mass corridor upper limit (for Chic selection)"}, JpsiMass{"JpsiMass", {3.097f}, "J/psi Mass constant"}, - mMassSpectrumLowerCutoff{"mMassSpectrumLowerCutoff", {0.01f}, "Used to exclude 0+0 masses"}, - mLowMassRegionUpperThreshold{"mLowMassRegionUpperThreshold", {1.75f}, "Arbitrary upper limit for low mass region"}; + mMassSpectrumLowerCutoff{"mMassSpectrumLowerCutoff", {0.01f}, "Used to exclude 0+0 masses"}; Configurable mEvSelTrig{"mEvSelTrig", kTVXinPHOS, "Select events with this trigger"}, CentBinning{"CentBinning", 10, "Binning for centrality"}, @@ -913,22 +912,8 @@ struct TpcElIdMassSpectrum { EnergyBinning{"EnergyBinning", 100, "Binning for energy"}, mMinCluNcell{"minCluNcell", 3, "min cells in cluster"}; - Filter ptFilter = (aod::track::pt > PtMin) && (aod::track::pt < PtMax), - etaFilter = nabs(aod::track::eta) < EtaMax, - dcaxyFilter = nabs(aod::track::dcaXY) < DCAxyMax, - dcazFilter = nabs(aod::track::dcaZ) < DCAzMax, - itschi2filter = aod::track::itsChi2NCl < ITSchi2Max, - tpcchi2filter = aod::track::tpcChi2NCl < TPCchi2Max, - mapfilter = (aod::track::itsClusterMap & uint8_t(1)) > 0; - - Filter tpctofEl = ((aod::pidtpc::tpcNSigmaEl > TPCNSigmaElMin) && (aod::pidtpc::tpcNSigmaEl < TPCNSigmaElMax)) || - ((aod::pidtof::tofNSigmaEl > TOFNSigmaElMin) && (aod::pidtof::tofNSigmaEl < TOFNSigmaElMax)), - tpcPiRej = (aod::pidtpc::tpcNSigmaPi < TPCNSigmaPiMin) || (aod::pidtpc::tpcNSigmaPi > TPCNSigmaPiMax), - tpcKaRej = (aod::pidtpc::tpcNSigmaKa < TPCNSigmaKaMin) || (aod::pidtpc::tpcNSigmaKa > TPCNSigmaPrMax), - tpcPrRej = (aod::pidtpc::tpcNSigmaPr < TPCNSigmaPrMin) || (aod::pidtpc::tpcNSigmaPr > TPCNSigmaPrMax); - Service ccdb; - double bz{0.}; // magnetic field + double bz{0.}; int runNumber{0}; HistogramRegistry mHistManager{"tpcElIdHistograms"}; @@ -947,7 +932,6 @@ struct TpcElIdMassSpectrum { axisVTrackZ{400, -20., 20., "track vertex z (cm)", "track vertex z (cm)"}, axisE{EnergyBinning, 0, 10, "E (GeV)", "E (GeV)"}, axisMassSpectrum{MassBinning, MassSpectraJpsiMin, MassSpectraJpsiMax, "M (GeV/c^{2})", "Mass e^{+}e^{-} (GeV/c^{2})"}, - axisMassSpectrumlmee{MassBinning, 0.4, 1.2, "M (GeV/c^{2})", "Mass e^{+}e^{-} (GeV/c^{2})"}, axisMassSpectrumChiC{MassBinning, MassSpectraChicMin, MassSpectraChicMax, "M (GeV/c^{2})", "Mass e^{+}e^{-}#gamma (GeV/c^{2})"}, axisMassSpectrumChiCNoJpsiErrors{MassBinning, MassSpectraChicMin, MassSpectraChicMax, "M (GeV/c^{2})", "Mass e^{+}e^{-}#gamma - Mass e^{+}e^{-} + Mass J/#psi (GeV/c^{2})"}, axisMassSpectrumgammagamma{MassBinning, 0, 0.3, "M (GeV/c^{2})", "Mass #gamma#gamma (GeV/c^{2})"}, @@ -1008,13 +992,6 @@ struct TpcElIdMassSpectrum { mHistManager.add("TPCeff/h_eh_mp_mass_spectra_v_pt_v_cent", "Mass e^{#pm}h^{#mp} vs momentum e^{#pm}h^{#mp}", HistType::kTH3F, {axisMassSpectrum, axisPtProbe, axisCent}); mHistManager.add("TPCeff/h_ee_mp_mass_spectra_v_pt_v_cent", "Mass e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}", HistType::kTH3F, {axisMassSpectrum, axisPtProbe, axisCent}); - mHistManager.add("TPCeff/lmee/h_eh_pp_mass_spectra_v_pt_v_cent", "Low mass region e^{+}h^{+} vs momentum e^{+}h^{+}", HistType::kTH3F, {axisMassSpectrumlmee, axisPtProbe, axisCent}); - mHistManager.add("TPCeff/lmee/h_ee_pp_mass_spectra_v_pt_v_cent", "Low mass region e^{+}e^{+} vs momentum e^{+}e^{+}", HistType::kTH3F, {axisMassSpectrumlmee, axisPtProbe, axisCent}); - mHistManager.add("TPCeff/lmee/h_eh_mm_mass_spectra_v_pt_v_cent", "Low mass region e^{-}h^{-} vs momentum e^{-}h^{-}", HistType::kTH3F, {axisMassSpectrumlmee, axisPtProbe, axisCent}); - mHistManager.add("TPCeff/lmee/h_ee_mm_mass_spectra_v_pt_v_cent", "Low mass region e^{-}e^{-} vs momentum e^{-}e^{-}", HistType::kTH3F, {axisMassSpectrumlmee, axisPtProbe, axisCent}); - mHistManager.add("TPCeff/lmee/h_eh_mp_mass_spectra_v_pt_v_cent", "Low mass region e^{#pm}h^{#mp} vs momentum e^{#pm}h^{#mp}", HistType::kTH3F, {axisMassSpectrumlmee, axisPtProbe, axisCent}); - mHistManager.add("TPCeff/lmee/h_ee_mp_mass_spectra_v_pt_v_cent", "Low mass region e^{#pm}e^{#mp} vs momentum e^{#pm}e^{#mp}", HistType::kTH3F, {axisMassSpectrumlmee, axisPtProbe, axisCent}); - mHistManager.add("hTrackVX", "Track vertex coordinate X", HistType::kTH1F, {axisVTrackX}); mHistManager.add("hTrackVY", "Track vertex coordinate Y", HistType::kTH1F, {axisVTrackY}); mHistManager.add("hTrackVZ", "Track vertex coordinate Z", HistType::kTH1F, {axisVTrackZ}); @@ -1027,10 +1004,10 @@ struct TpcElIdMassSpectrum { mHistManager.add("hTrackEta", "Track eta", HistType::kTH1F, {axisEta}); mHistManager.add("hTrackEta_Cut", "Track eta after cut", HistType::kTH1F, {axisEta}); } + void process(SelCollisions::iterator const& collision, aod::CaloClusters const& clusters, MyTracks const& tracks, - soa::Filtered const& filteredTracks, o2::aod::PHOSMatchindexTable const& matches, aod::BCsWithTimestamps const&) { @@ -1072,301 +1049,329 @@ struct TpcElIdMassSpectrum { } mHistManager.fill(HIST("eventCounter"), 0.5); mHistManager.fill(HIST("centCounter"), cent); - if (!collision.alias_bit(mEvSelTrig)) - return; - mHistManager.fill(HIST("eventCounter"), 1.5); + if (collision.alias_bit(mEvSelTrig)) { + mHistManager.fill(HIST("eventCounter"), 1.5); + } if (isSel8) { if (!collision.sel8()) return; mHistManager.fill(HIST("eventCounter"), 2.5); } - for (auto const& [track1, track2] : combinations(CombinationsStrictlyUpperIndexPolicy(filteredTracks, filteredTracks))) { - if (!track1.has_collision() || !track1.hasTPC()) - continue; - if (!track2.has_collision() || !track2.hasTPC()) - continue; - if (track1.collisionId() != track2.collisionId()) - continue; - if (!((track1.itsClusterMap() & uint8_t(1)) > 0) || !((track2.itsClusterMap() & uint8_t(1)) > 0)) - continue; - if (track1.itsNCls() < ITSnclsMin || track2.itsNCls() < ITSnclsMin) - continue; - if (track1.itsNCls() > ITSnclsMax || track2.itsNCls() > ITSnclsMax) - continue; - if (track1.tpcNClsFound() < TPCnclsMin || track2.tpcNClsFound() < TPCnclsMin) - continue; - if (track1.tpcNClsFound() > TPCnclsMax || track2.tpcNClsFound() > TPCnclsMax) - continue; - if (track1.tpcNClsCrossedRows() < TPCnclsCRMin || track2.tpcNClsCrossedRows() < TPCnclsCRMin) - continue; - if (track1.tpcNClsCrossedRows() > TPCnclsCRMax || track2.tpcNClsCrossedRows() > TPCnclsCRMax) + auto isGoodElectronForSignal = [&](const MyTracks::iterator& track) -> bool { + if (!track.has_collision() || !track.hasTPC()) + return false; + if (track.pt() <= PtMin || track.pt() >= PtMax) + return false; + if (std::fabs(track.eta()) >= EtaMax) + return false; + if (std::fabs(track.dcaXY()) >= DCAxyMax) + return false; + if (std::fabs(track.dcaZ()) >= DCAzMax) + return false; + if (track.itsChi2NCl() >= ITSchi2Max) + return false; + if (track.tpcChi2NCl() >= TPCchi2Max) + return false; + if (!((track.itsClusterMap() & uint8_t(1)) > 0)) + return false; + if (track.itsNCls() < ITSnclsMin || track.itsNCls() > ITSnclsMax) + return false; + if (track.tpcNClsFound() < TPCnclsMin || track.tpcNClsFound() > TPCnclsMax) + return false; + if (track.tpcNClsCrossedRows() < TPCnclsCRMin || track.tpcNClsCrossedRows() > TPCnclsCRMax) + return false; + + bool isTPCElectron = (track.tpcNSigmaEl() > TPCNSigmaElMin) && (track.tpcNSigmaEl() < TPCNSigmaElMax); + bool isTOFElectron = (track.tofNSigmaEl() > TOFNSigmaElMin) && (track.tofNSigmaEl() < TOFNSigmaElMax); + if (!isTPCElectron && !isTOFElectron) + return false; + + bool isPion = (track.tpcNSigmaPi() >= TPCNSigmaPiMin && track.tpcNSigmaPi() <= TPCNSigmaPiMax); + bool isKaon = (track.tpcNSigmaKa() >= TPCNSigmaKaMin && track.tpcNSigmaKa() <= TPCNSigmaKaMax); + bool isProton = (track.tpcNSigmaPr() >= TPCNSigmaPrMin && track.tpcNSigmaPr() <= TPCNSigmaPrMax); + if (isPion || isKaon || isProton) + return false; + return true; + }; + + auto isGoodTagElectron = [&](const MyTracks::iterator& track) -> bool { + if (!track.has_collision() || !track.hasTPC()) + return false; + if (!((track.itsClusterMap() & uint8_t(1)) > 0)) + return false; + if (track.itsChi2NCl() > ITSchi2Max || track.tpcChi2NCl() > TPCchi2Max) + return false; + if (track.itsNCls() < ITSnclsMin || track.itsNCls() > ITSnclsMax) + return false; + if (track.tpcNClsFound() < TPCnclsMin || track.tpcNClsFound() > TPCnclsMax) + return false; + if (track.tpcNClsCrossedRows() < TPCnclsCRMin || track.tpcNClsCrossedRows() > TPCnclsCRMax) + return false; + if (std::fabs(track.eta()) >= EtaMax) + return false; + if (std::fabs(track.dcaXY()) >= DCAxyMax) + return false; + if (std::fabs(track.dcaZ()) >= DCAzMax) + return false; + + bool isTPCElectron = (track.tpcNSigmaEl() > TPCNSigmaElMin) && (track.tpcNSigmaEl() < TPCNSigmaElMax); + bool isTOFElectron = (track.tofNSigmaEl() > TOFNSigmaElMin) && (track.tofNSigmaEl() < TOFNSigmaElMax); + if (!isTPCElectron && !isTOFElectron) + return false; + + bool isPionSignal = (track.tpcNSigmaPi() >= TPCNSigmaPiMin && track.tpcNSigmaPi() <= TPCNSigmaPiMax); + bool isKaonSignal = (track.tpcNSigmaKa() >= TPCNSigmaKaMin && track.tpcNSigmaKa() <= TPCNSigmaKaMax); + bool isProtonSignal = (track.tpcNSigmaPr() >= TPCNSigmaPrMin && track.tpcNSigmaPr() <= TPCNSigmaPrMax); + if (isPionSignal || isKaonSignal || isProtonSignal) + return false; + return true; + }; + + auto isGoodProbeBaseTrack = [&](const MyTracks::iterator& track) -> bool { + if (!track.has_collision() || !track.hasTPC()) + return false; + if (!((track.itsClusterMap() & uint8_t(1)) > 0)) + return false; + if (track.itsChi2NCl() > ITSchi2Max || track.tpcChi2NCl() > TPCchi2Max) + return false; + if (track.itsNCls() < ITSnclsMin || track.itsNCls() > ITSnclsMax) + return false; + if (track.tpcNClsFound() < TPCnclsMin || track.tpcNClsFound() > TPCnclsMax) + return false; + if (track.tpcNClsCrossedRows() < TPCnclsCRMin || track.tpcNClsCrossedRows() > TPCnclsCRMax) + return false; + if (std::fabs(track.dcaXY()) > DCAxyMax || std::fabs(track.dcaZ()) > DCAzMax) + return false; + if (std::fabs(track.eta()) >= EtaMax) + return false; + return true; + }; + + auto isProbeIdentifiedAsElectron = [&](const MyTracks::iterator& track) -> bool { + if (!track.hasTPC()) + return false; + bool isTPCElectron = (track.tpcNSigmaEl() > TPCNSigmaElMin) && (track.tpcNSigmaEl() < TPCNSigmaElMax); + bool isTOFElectron = (track.tofNSigmaEl() > TOFNSigmaElMin) && (track.tofNSigmaEl() < TOFNSigmaElMax); + if (!isTPCElectron && !isTOFElectron) + return false; + + bool isPionSignal = (track.tpcNSigmaPi() >= TPCNSigmaPiMin && track.tpcNSigmaPi() <= TPCNSigmaPiMax); + bool isKaonSignal = (track.tpcNSigmaKa() >= TPCNSigmaKaMin && track.tpcNSigmaKa() <= TPCNSigmaKaMax); + bool isProtonSignal = (track.tpcNSigmaPr() >= TPCNSigmaPrMin && track.tpcNSigmaPr() <= TPCNSigmaPrMax); + if (isPionSignal || isKaonSignal || isProtonSignal) + return false; + return true; + }; + + for (auto const& [track1_iterator, track2_iterator] : combinations(CombinationsStrictlyUpperIndexPolicy(tracks, tracks))) { + if (track1_iterator.collisionId() != track2_iterator.collisionId()) { continue; + } + + bool track1IsSignalE = isGoodElectronForSignal(track1_iterator); + bool track2IsSignalE = isGoodElectronForSignal(track2_iterator); - ROOT::Math::LorentzVector> fourVectorP1, fourVectorP2; - fourVectorP1.SetPxPyPzE(track1.px(), track1.py(), track1.pz(), track1.energy(0)); - fourVectorP2.SetPxPyPzE(track2.px(), track2.py(), track2.pz(), track2.energy(0)); + if (track1IsSignalE && track2IsSignalE) { + ROOT::Math::LorentzVector> fourVectorP1, fourVectorP2; + fourVectorP1.SetPxPyPzE(track1_iterator.px(), track1_iterator.py(), track1_iterator.pz(), track1_iterator.energy(0)); + fourVectorP2.SetPxPyPzE(track2_iterator.px(), track2_iterator.py(), track2_iterator.pz(), track2_iterator.energy(0)); - bool inPhosEtaRange1 = std::fabs(track1.eta()) < PhosRangeEta; - bool inPhosEtaRange2 = std::fabs(track2.eta()) < PhosRangeEta; - bool inPhosPhiRange1 = (track1.phi() * TMath::RadToDeg() > PhosRangePhiMin && track1.phi() * TMath::RadToDeg() < PhosRangePhiMax); - bool inPhosPhiRange2 = (track2.phi() * TMath::RadToDeg() > PhosRangePhiMin && track2.phi() * TMath::RadToDeg() < PhosRangePhiMax); - bool inPhosRange = (inPhosEtaRange1 && inPhosPhiRange1) || (inPhosEtaRange2 && inPhosPhiRange2); - bool posTrack = track1.sign() * bz > 0; + bool inPhosEtaRange1 = std::fabs(track1_iterator.eta()) < PhosRangeEta; + bool inPhosEtaRange2 = std::fabs(track2_iterator.eta()) < PhosRangeEta; + bool inPhosPhiRange1 = (track1_iterator.phi() * TMath::RadToDeg() > PhosRangePhiMin && track1_iterator.phi() * TMath::RadToDeg() < PhosRangePhiMax); + bool inPhosPhiRange2 = (track2_iterator.phi() * TMath::RadToDeg() > PhosRangePhiMin && track2_iterator.phi() * TMath::RadToDeg() < PhosRangePhiMax); + bool inPhosRange = (inPhosEtaRange1 && inPhosPhiRange1) || (inPhosEtaRange2 && inPhosPhiRange2); - double pairMass = (fourVectorP1 + fourVectorP2).M(), pairPt = (fourVectorP1 + fourVectorP2).Pt(); + double pairMass = (fourVectorP1 + fourVectorP2).M(), pairPt = (fourVectorP1 + fourVectorP2).Pt(); - if (track1.sign() == track2.sign()) { - if (posTrack) { - mHistManager.fill(HIST("TPCee/h_MS_pp_v_pt_v_cent"), pairMass, pairPt, cent); - if (collision.alias_bit(mEvSelTrig)) - mHistManager.fill(HIST("TPCee/h_MS_pp_kTVXinPHOS_v_pt_v_cent"), pairMass, pairPt, cent); - if (inPhosRange) { - mHistManager.fill(HIST("TPCee/h_MS_pp_phosRange_v_pt_v_cent"), pairMass, pairPt, cent); + if (track1_iterator.sign() == track2_iterator.sign()) { + bool track1IsPositive = track1_iterator.sign() * bz > 0; + if (track1IsPositive) { + mHistManager.fill(HIST("TPCee/h_MS_pp_v_pt_v_cent"), pairMass, pairPt, cent); if (collision.alias_bit(mEvSelTrig)) - mHistManager.fill(HIST("TPCee/h_MS_pp_phosRange_kTVXinPHOS_v_pt_v_cent"), pairMass, pairPt, cent); + mHistManager.fill(HIST("TPCee/h_MS_pp_kTVXinPHOS_v_pt_v_cent"), pairMass, pairPt, cent); + if (inPhosRange) { + mHistManager.fill(HIST("TPCee/h_MS_pp_phosRange_v_pt_v_cent"), pairMass, pairPt, cent); + if (collision.alias_bit(mEvSelTrig)) + mHistManager.fill(HIST("TPCee/h_MS_pp_phosRange_kTVXinPHOS_v_pt_v_cent"), pairMass, pairPt, cent); + } + } else { + mHistManager.fill(HIST("TPCee/h_MS_mm_v_pt_v_cent"), pairMass, pairPt, cent); + if (collision.alias_bit(mEvSelTrig)) + mHistManager.fill(HIST("TPCee/h_MS_mm_kTVXinPHOS_v_pt_v_cent"), pairMass, pairPt, cent); + if (inPhosRange) { + mHistManager.fill(HIST("TPCee/h_MS_mm_phosRange_v_pt_v_cent"), pairMass, pairPt, cent); + if (collision.alias_bit(mEvSelTrig)) + mHistManager.fill(HIST("TPCee/h_MS_mm_phosRange_kTVXinPHOS_v_pt_v_cent"), pairMass, pairPt, cent); + } } } else { - mHistManager.fill(HIST("TPCee/h_MS_mm_v_pt_v_cent"), pairMass, pairPt, cent); + mHistManager.fill(HIST("TPCee/h_MS_mp_v_pt_v_cent"), pairMass, pairPt, cent); if (collision.alias_bit(mEvSelTrig)) - mHistManager.fill(HIST("TPCee/h_MS_mm_kTVXinPHOS_v_pt_v_cent"), pairMass, pairPt, cent); + mHistManager.fill(HIST("TPCee/h_MS_mp_kTVXinPHOS_v_pt_v_cent"), pairMass, pairPt, cent); if (inPhosRange) { - mHistManager.fill(HIST("TPCee/h_MS_mm_phosRange_v_pt_v_cent"), pairMass, pairPt, cent); + mHistManager.fill(HIST("TPCee/h_MS_mp_phosRange_v_pt_v_cent"), pairMass, pairPt, cent); if (collision.alias_bit(mEvSelTrig)) - mHistManager.fill(HIST("TPCee/h_MS_mm_phosRange_kTVXinPHOS_v_pt_v_cent"), pairMass, pairPt, cent); + mHistManager.fill(HIST("TPCee/h_MS_mp_phosRange_kTVXinPHOS_v_pt_v_cent"), pairMass, pairPt, cent); } - } - } else { - mHistManager.fill(HIST("TPCee/h_MS_mp_v_pt_v_cent"), pairMass, pairPt, cent); - if (collision.alias_bit(mEvSelTrig)) - mHistManager.fill(HIST("TPCee/h_MS_mp_kTVXinPHOS_v_pt_v_cent"), pairMass, pairPt, cent); - if (inPhosRange) { - mHistManager.fill(HIST("TPCee/h_MS_mp_phosRange_v_pt_v_cent"), pairMass, pairPt, cent); - if (collision.alias_bit(mEvSelTrig)) - mHistManager.fill(HIST("TPCee/h_MS_mp_phosRange_kTVXinPHOS_v_pt_v_cent"), pairMass, pairPt, cent); - } - - if (collision.alias_bit(mEvSelTrig) && clusters.size() != 0) { - for (auto const& gamma : clusters) { - float cluE = gamma.e(); - - if (cluE < mMinCluE || cluE > mMaxCluE || - gamma.ncell() < mMinCluNcell || - gamma.time() > mMaxCluTime || gamma.time() < mMinCluTime) - continue; - bool matchFlag = 0, - isJpsi = 0, - // isNotMIP = cluE > mCutMIPCluE, - isDispOK = testLambda(cluE, gamma.m02(), gamma.m20()); - - if (pairMass > eeMassMin && pairMass < eeMassMax) - isJpsi = 1; - - for (auto const& match : matches) { - if (gamma.index() == match.caloClusterId()) { - matchFlag = 1; - break; + if (collision.alias_bit(mEvSelTrig) && clusters.size() != 0) { + for (auto const& gamma : clusters) { + float cluE = gamma.e(); + if (cluE < mMinCluE || cluE > mMaxCluE || gamma.ncell() < mMinCluNcell || gamma.time() > mMaxCluTime || gamma.time() < mMinCluTime) + continue; + bool matchFlag = false; + bool isJpsi = (pairMass > eeMassMin && pairMass < eeMassMax); + bool isDispOK = testLambda(cluE, gamma.m02(), gamma.m20()); + for (auto const& match : matches) { + if (gamma.index() == match.caloClusterId()) { + matchFlag = true; + break; + } } - } - - ROOT::Math::LorentzVector> fourVectorP3; - fourVectorP3.SetPxPyPzE(gamma.px(), gamma.py(), gamma.pz(), cluE); - double tripletMass = (fourVectorP1 + fourVectorP2 + fourVectorP3).M(), tripletPt = (fourVectorP1 + fourVectorP2 + fourVectorP3).Pt(), tripletMinusPairPlusJpsiMass = tripletMass - pairMass + JpsiMass; - - mHistManager.fill(HIST("TPCeePhosGamma/h_MS_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("TPCeePhosGamma/h_minusee_MS_v_3pt_v_cent"), tripletMinusPairPlusJpsiMass, tripletPt, cent); - - mHistManager.fill(HIST("TPCeePhosGamma/h_MS_v_cluE_v_cent"), tripletMass, cluE, cent); - mHistManager.fill(HIST("TPCeePhosGamma/h_minusee_MS_v_cluE_v_cent"), tripletMinusPairPlusJpsiMass, cluE, cent); - - if (!matchFlag) { - mHistManager.fill(HIST("TPCeePhosGamma/h_MS_noMatches_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("TPCeePhosGamma/h_minusee_MS_noMatches_v_3pt_v_cent"), tripletMinusPairPlusJpsiMass, tripletPt, cent); - if (isJpsi) { - mHistManager.fill(HIST("TPCeePhosGamma/h_MS_noMatches_aroundJpsi_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("TPCeePhosGamma/h_minusee_MS_noMatches_aroundJpsi_v_3pt_v_cent"), tripletMinusPairPlusJpsiMass, tripletPt, cent); + ROOT::Math::LorentzVector> fourVectorP3; + fourVectorP3.SetPxPyPzE(gamma.px(), gamma.py(), gamma.pz(), cluE); + double tripletMass = (fourVectorP1 + fourVectorP2 + fourVectorP3).M(); + double tripletPt = (fourVectorP1 + fourVectorP2 + fourVectorP3).Pt(); + double tripletMinusPairPlusJpsiMass = tripletMass - pairMass + JpsiMass; + + mHistManager.fill(HIST("TPCeePhosGamma/h_MS_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("TPCeePhosGamma/h_minusee_MS_v_3pt_v_cent"), tripletMinusPairPlusJpsiMass, tripletPt, cent); + mHistManager.fill(HIST("TPCeePhosGamma/h_MS_v_cluE_v_cent"), tripletMass, cluE, cent); + mHistManager.fill(HIST("TPCeePhosGamma/h_minusee_MS_v_cluE_v_cent"), tripletMinusPairPlusJpsiMass, cluE, cent); + + if (!matchFlag) { + mHistManager.fill(HIST("TPCeePhosGamma/h_MS_noMatches_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("TPCeePhosGamma/h_minusee_MS_noMatches_v_3pt_v_cent"), tripletMinusPairPlusJpsiMass, tripletPt, cent); + if (isJpsi) { + mHistManager.fill(HIST("TPCeePhosGamma/h_MS_noMatches_aroundJpsi_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("TPCeePhosGamma/h_minusee_MS_noMatches_aroundJpsi_v_3pt_v_cent"), tripletMinusPairPlusJpsiMass, tripletPt, cent); + if (isDispOK) { + mHistManager.fill(HIST("TPCeePhosGamma/h_MS_noMatches_aroundJpsi_DispOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("TPCeePhosGamma/h_minusee_MS_noMatches_aroundJpsi_DispOK_v_3pt_v_cent"), tripletMinusPairPlusJpsiMass, tripletPt, cent); + } + } if (isDispOK) { - mHistManager.fill(HIST("TPCeePhosGamma/h_MS_noMatches_aroundJpsi_DispOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("TPCeePhosGamma/h_minusee_MS_noMatches_aroundJpsi_DispOK_v_3pt_v_cent"), tripletMinusPairPlusJpsiMass, tripletPt, cent); + mHistManager.fill(HIST("TPCeePhosGamma/h_MS_noMatches_DispOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("TPCeePhosGamma/h_minusee_MS_noMatches_DispOK_v_3pt_v_cent"), tripletMinusPairPlusJpsiMass, tripletPt, cent); } } + if (isJpsi) { + mHistManager.fill(HIST("TPCeePhosGamma/h_MS_aroundJpsi_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("TPCeePhosGamma/h_minusee_MS_aroundJpsi_v_3pt_v_cent"), tripletMinusPairPlusJpsiMass, tripletPt, cent); + } if (isDispOK) { - mHistManager.fill(HIST("TPCeePhosGamma/h_MS_noMatches_DispOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("TPCeePhosGamma/h_minusee_MS_noMatches_DispOK_v_3pt_v_cent"), tripletMinusPairPlusJpsiMass, tripletPt, cent); + mHistManager.fill(HIST("TPCeePhosGamma/h_MS_DispOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); + mHistManager.fill(HIST("TPCeePhosGamma/h_minusee_MS_DispOK_v_3pt_v_cent"), tripletMinusPairPlusJpsiMass, tripletPt, cent); } } - if (isJpsi) { - mHistManager.fill(HIST("TPCeePhosGamma/h_MS_aroundJpsi_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("TPCeePhosGamma/h_minusee_MS_aroundJpsi_v_3pt_v_cent"), tripletMinusPairPlusJpsiMass, tripletPt, cent); - } - if (isDispOK) { - mHistManager.fill(HIST("TPCeePhosGamma/h_MS_DispOK_v_3pt_v_cent"), tripletMass, tripletPt, cent); - mHistManager.fill(HIST("TPCeePhosGamma/h_minusee_MS_DispOK_v_3pt_v_cent"), tripletMinusPairPlusJpsiMass, tripletPt, cent); - } } } } - } - // tag-n-probe method for TPC identification efficiency calculations - for (auto const& track1 : tracks) { - if (!track1.has_collision() || !track1.hasTPC()) - continue; - if (!((track1.itsClusterMap() & uint8_t(1)) > 0)) - continue; - if (track1.itsChi2NCl() > ITSchi2Max || track1.tpcChi2NCl() > TPCchi2Max) - continue; - if (track1.itsNCls() < ITSnclsMin || track1.itsNCls() > ITSnclsMax) - continue; - if (track1.tpcNClsFound() < TPCnclsMin || track1.tpcNClsFound() > TPCnclsMax) - continue; - if (track1.tpcNClsCrossedRows() < TPCnclsCRMin || track1.tpcNClsCrossedRows() > TPCnclsCRMax) - continue; - bool isElectron1 = false; - if (track1.hasTPC()) { - float nsigmaTPCEl = track1.tpcNSigmaEl(); - float nsigmaTOFEl = track1.tofNSigmaEl(); - bool isTPCElectron1 = nsigmaTPCEl > TPCNSigmaElMin && nsigmaTPCEl < TPCNSigmaElMax; - bool isTOFElectron1 = nsigmaTOFEl > TOFNSigmaElMin && nsigmaTOFEl < TOFNSigmaElMax; - isElectron1 = isTPCElectron1 || isTOFElectron1; - - float nsigmaTPCPi = track1.tpcNSigmaPi(); - float nsigmaTPCKa = track1.tpcNSigmaKa(); - float nsigmaTPCPr = track1.tpcNSigmaPr(); - bool isPion = nsigmaTPCPi > TPCNSigmaPiMin && nsigmaTPCPi < TPCNSigmaPiMax; - bool isKaon = nsigmaTPCKa > TPCNSigmaKaMin && nsigmaTPCKa < TPCNSigmaKaMax; - bool isProton = nsigmaTPCPr > TPCNSigmaPrMin && nsigmaTPCPr < TPCNSigmaPrMax; - if (isElectron1 && !(isPion || isKaon || isProton)) - isElectron1 = true; - } - if (isElectron1) { - bool posTrack = track1.sign() * bz > 0; - for (auto const& track2 : tracks) { - if (!track2.has_collision() || !track2.hasTPC()) - continue; - if (!((track2.itsClusterMap() & uint8_t(1)) > 0)) - continue; - if (track1.collisionId() != track2.collisionId()) - continue; - if (track2.itsChi2NCl() > ITSchi2Max || track2.tpcChi2NCl() > TPCchi2Max) - continue; - if (track2.itsNCls() < ITSnclsMin || track2.itsNCls() > ITSnclsMax) - continue; - if (track2.tpcNClsFound() < TPCnclsMin || track2.tpcNClsFound() > TPCnclsMax) - continue; - if (track2.tpcNClsCrossedRows() < TPCnclsCRMin || track2.tpcNClsCrossedRows() > TPCnclsCRMax) - continue; - bool isElectron2 = false; - if (track2.hasTPC()) { - float nsigmaTPCEl = track2.tpcNSigmaEl(); - float nsigmaTOFEl = track2.tofNSigmaEl(); - bool isTPCElectron2 = nsigmaTPCEl > TPCNSigmaElMin && nsigmaTPCEl < TPCNSigmaElMax; - bool isTOFElectron2 = nsigmaTOFEl > TOFNSigmaElMin && nsigmaTOFEl < TOFNSigmaElMax; - isElectron2 = isTPCElectron2 || isTOFElectron2; - - float nsigmaTPCPi = track2.tpcNSigmaPi(); - float nsigmaTPCKa = track2.tpcNSigmaKa(); - float nsigmaTPCPr = track2.tpcNSigmaPr(); - bool isPion = nsigmaTPCPi > TPCNSigmaPiMin && nsigmaTPCPi < TPCNSigmaPiMax; - bool isKaon = nsigmaTPCKa > TPCNSigmaKaMin && nsigmaTPCKa < TPCNSigmaKaMax; - bool isProton = nsigmaTPCPr > TPCNSigmaPrMin && nsigmaTPCPr < TPCNSigmaPrMax; - if (isElectron2 && !(isPion || isKaon || isProton)) - isElectron2 = true; - } - float mass2Tracks = 0, momProbeTrack = track2.pt(); - ROOT::Math::LorentzVector> fourVectorP1, fourVectorP2; - fourVectorP1.SetPxPyPzE(track1.px(), track1.py(), track1.pz(), track1.energy(0)); - fourVectorP2.SetPxPyPzE(track2.px(), track2.py(), track2.pz(), track2.energy(0)); - mass2Tracks = (fourVectorP1 + fourVectorP2).M(); - if (mass2Tracks < mLowMassRegionUpperThreshold) { - if (track1.sign() == track2.sign()) { - if (posTrack) { - mHistManager.fill(HIST("TPCeff/lmee/h_eh_pp_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); - if (isElectron2) { - mHistManager.fill(HIST("TPCeff/lmee/h_ee_pp_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); - } - } else { - mHistManager.fill(HIST("TPCeff/lmee/h_eh_mm_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); - if (isElectron2) { - mHistManager.fill(HIST("TPCeff/lmee/h_ee_mm_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); - } - } + if (isGoodTagElectron(track1_iterator) && isGoodProbeBaseTrack(track2_iterator)) { + ROOT::Math::LorentzVector> pTag1, pProbe2; + pTag1.SetPxPyPzE(track1_iterator.px(), track1_iterator.py(), track1_iterator.pz(), track1_iterator.energy(0)); + pProbe2.SetPxPyPzE(track2_iterator.px(), track2_iterator.py(), track2_iterator.pz(), track2_iterator.energy(0)); + float massTag1Probe2 = (pTag1 + pProbe2).M(); + float ptProbe2 = track2_iterator.pt(); + bool tag1IsPositive = track1_iterator.sign() * bz > 0; + + if (track1_iterator.sign() == track2_iterator.sign()) { + if (tag1IsPositive) { + mHistManager.fill(HIST("TPCeff/h_eh_pp_mass_spectra_v_pt_v_cent"), massTag1Probe2, ptProbe2, cent); + } else { + mHistManager.fill(HIST("TPCeff/h_eh_mm_mass_spectra_v_pt_v_cent"), massTag1Probe2, ptProbe2, cent); + } + } else { + mHistManager.fill(HIST("TPCeff/h_eh_mp_mass_spectra_v_pt_v_cent"), massTag1Probe2, ptProbe2, cent); + } + if (isProbeIdentifiedAsElectron(track2_iterator)) { + if (track1_iterator.sign() == track2_iterator.sign()) { + if (tag1IsPositive) { + mHistManager.fill(HIST("TPCeff/h_ee_pp_mass_spectra_v_pt_v_cent"), massTag1Probe2, ptProbe2, cent); } else { - mHistManager.fill(HIST("TPCeff/lmee/h_eh_mp_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); - if (isElectron2) { - mHistManager.fill(HIST("TPCeff/lmee/h_ee_mp_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); - } + mHistManager.fill(HIST("TPCeff/h_ee_mm_mass_spectra_v_pt_v_cent"), massTag1Probe2, ptProbe2, cent); } } else { - if (track1.sign() == track2.sign()) { - if (posTrack) { - mHistManager.fill(HIST("TPCeff/h_eh_pp_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); - if (isElectron2) { - mHistManager.fill(HIST("TPCeff/h_ee_pp_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); - } - } else { - mHistManager.fill(HIST("TPCeff/h_eh_mm_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); - if (isElectron2) { - mHistManager.fill(HIST("TPCeff/h_ee_mm_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); - } - } + mHistManager.fill(HIST("TPCeff/h_ee_mp_mass_spectra_v_pt_v_cent"), massTag1Probe2, ptProbe2, cent); + } + } + } + + if (isGoodTagElectron(track2_iterator) && isGoodProbeBaseTrack(track1_iterator)) { + ROOT::Math::LorentzVector> pTag2, pProbe1; + pTag2.SetPxPyPzE(track2_iterator.px(), track2_iterator.py(), track2_iterator.pz(), track2_iterator.energy(0)); + pProbe1.SetPxPyPzE(track1_iterator.px(), track1_iterator.py(), track1_iterator.pz(), track1_iterator.energy(0)); + float massTag2Probe1 = (pTag2 + pProbe1).M(); + float ptProbe1 = track1_iterator.pt(); + bool tag2IsPositive = track2_iterator.sign() * bz > 0; + + if (track2_iterator.sign() == track1_iterator.sign()) { + if (tag2IsPositive) { + mHistManager.fill(HIST("TPCeff/h_eh_pp_mass_spectra_v_pt_v_cent"), massTag2Probe1, ptProbe1, cent); + } else { + mHistManager.fill(HIST("TPCeff/h_eh_mm_mass_spectra_v_pt_v_cent"), massTag2Probe1, ptProbe1, cent); + } + } else { + mHistManager.fill(HIST("TPCeff/h_eh_mp_mass_spectra_v_pt_v_cent"), massTag2Probe1, ptProbe1, cent); + } + if (isProbeIdentifiedAsElectron(track1_iterator)) { + if (track2_iterator.sign() == track1_iterator.sign()) { + if (tag2IsPositive) { + mHistManager.fill(HIST("TPCeff/h_ee_pp_mass_spectra_v_pt_v_cent"), massTag2Probe1, ptProbe1, cent); } else { - mHistManager.fill(HIST("TPCeff/h_eh_mp_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); - if (isElectron2) { - mHistManager.fill(HIST("TPCeff/h_ee_mp_mass_spectra_v_pt_v_cent"), mass2Tracks, momProbeTrack, cent); - } + mHistManager.fill(HIST("TPCeff/h_ee_mm_mass_spectra_v_pt_v_cent"), massTag2Probe1, ptProbe1, cent); } + } else { + mHistManager.fill(HIST("TPCeff/h_ee_mp_mass_spectra_v_pt_v_cent"), massTag2Probe1, ptProbe1, cent); } } } - } // end of double loop + } for (auto const& gamma1 : clusters) { float cluE1 = gamma1.e(); - - if (cluE1 < mMinCluE || cluE1 > mMaxCluE || - gamma1.ncell() < mMinCluNcell || - gamma1.time() > mMaxCluTime || gamma1.time() < mMinCluTime) + if (cluE1 < mMinCluE || cluE1 > mMaxCluE || gamma1.ncell() < mMinCluNcell || gamma1.time() > mMaxCluTime || gamma1.time() < mMinCluTime) continue; - - bool matchFlag1 = 0, matchFlag2 = 0; + bool matchFlag1 = false; if (!testLambda(cluE1, gamma1.m02(), gamma1.m20())) continue; - for (auto const& match : matches) { if (gamma1.index() == match.caloClusterId()) { - matchFlag1 = 1; + matchFlag1 = true; break; } } for (auto const& gamma2 : clusters) { + if (gamma1.index() >= gamma2.index()) + continue; float cluE2 = gamma2.e(); - - if (cluE2 < mMinCluE || cluE2 > mMaxCluE || - gamma2.ncell() < mMinCluNcell || - gamma2.time() > mMaxCluTime || gamma2.time() < mMinCluTime) + if (cluE2 < mMinCluE || cluE2 > mMaxCluE || gamma2.ncell() < mMinCluNcell || gamma2.time() > mMaxCluTime || gamma2.time() < mMinCluTime) continue; - - if (!testLambda(cluE2, gamma1.m02(), gamma1.m20())) + if (!testLambda(cluE2, gamma2.m02(), gamma2.m20())) continue; - + bool matchFlag2 = false; for (auto const& match : matches) { if (gamma2.index() == match.caloClusterId()) { - matchFlag2 = 1; + matchFlag2 = true; break; } } - ROOT::Math::LorentzVector> fourVectorP1, fourVectorP2; - fourVectorP1.SetPxPyPzE(gamma1.px(), gamma1.py(), gamma1.pz(), gamma1.e()); - fourVectorP2.SetPxPyPzE(gamma2.px(), gamma2.py(), gamma2.pz(), gamma2.e()); - double pairMass = (fourVectorP1 + fourVectorP2).M(), pairPt = (fourVectorP1 + fourVectorP2).Pt(); - if (pairMass < mMassSpectrumLowerCutoff) + ROOT::Math::LorentzVector> fourVectorG1, fourVectorG2; + fourVectorG1.SetPxPyPzE(gamma1.px(), gamma1.py(), gamma1.pz(), cluE1); + fourVectorG2.SetPxPyPzE(gamma2.px(), gamma2.py(), gamma2.pz(), cluE2); + double pairMassGG = (fourVectorG1 + fourVectorG2).M(); + double pairPtGG = (fourVectorG1 + fourVectorG2).Pt(); + + if (pairMassGG < mMassSpectrumLowerCutoff) continue; - mHistManager.fill(HIST("twoPhoton/MS_noCuts"), pairMass, pairPt, cent); + + mHistManager.fill(HIST("twoPhoton/MS_noCuts"), pairMassGG, pairPtGG, cent); if (matchFlag1 || matchFlag2) continue; - mHistManager.fill(HIST("twoPhoton/MS_noMatches"), pairMass, pairPt, cent); + mHistManager.fill(HIST("twoPhoton/MS_noMatches"), pairMassGG, pairPtGG, cent); } } @@ -1378,39 +1383,32 @@ struct TpcElIdMassSpectrum { mHistManager.fill(HIST("hTrackVZ"), track.z()); mHistManager.fill(HIST("hTPCspectra"), track.pt(), track.tpcSignal()); } - for (auto const& track : filteredTracks) { - if (!track.has_collision() || !track.hasTPC()) - continue; - if (track.itsChi2NCl() > ITSchi2Max || track.tpcChi2NCl() > TPCchi2Max) - continue; - if (track.itsNCls() < ITSnclsMin || track.itsNCls() > ITSnclsMax || !((track.itsClusterMap() & uint8_t(1)) > 0)) - continue; - if (track.tpcNClsFound() < TPCnclsMin || track.tpcNClsFound() > TPCnclsMax) - continue; - if (track.tpcNClsCrossedRows() < TPCnclsCRMin || track.tpcNClsCrossedRows() > TPCnclsCRMax) - continue; - mHistManager.fill(HIST("hTPCspectra_isElectronRej"), track.pt(), track.tpcSignal()); - mHistManager.fill(HIST("hTrackPt_Cut"), track.pt()); - mHistManager.fill(HIST("hTrackEta_Cut"), track.eta()); - mHistManager.fill(HIST("hTrackVX_Cut"), track.x()); - mHistManager.fill(HIST("hTrackVY_Cut"), track.y()); - mHistManager.fill(HIST("hTrackVZ_Cut"), track.z()); + + for (auto const& track : tracks) { + if (isGoodElectronForSignal(track)) { + mHistManager.fill(HIST("hTPCspectra_isElectronRej"), track.pt(), track.tpcSignal()); + mHistManager.fill(HIST("hTrackPt_Cut"), track.pt()); + mHistManager.fill(HIST("hTrackEta_Cut"), track.eta()); + mHistManager.fill(HIST("hTrackVX_Cut"), track.x()); + mHistManager.fill(HIST("hTrackVY_Cut"), track.y()); + mHistManager.fill(HIST("hTrackVZ_Cut"), track.z()); + } } } - //_____________________________________________________________________________ + bool testLambda(float pt, float l1, float l2) { - // Parameterization for full dispersion - float l2Mean = 1.53126 + 9.50835e+06 / (1. + 1.08728e+07 * pt + 1.73420e+06 * pt * pt); - float l1Mean = 1.12365 + 0.123770 * std::exp(-pt * 0.246551) + 5.30000e-03 * pt; - float l2Sigma = 6.48260e-02 + 7.60261e+10 / (1. + 1.53012e+11 * pt + 5.01265e+05 * pt * pt) + 9.00000e-03 * pt; - float l1Sigma = 4.44719e-04 + 6.99839e-01 / (1. + 1.22497e+00 * pt + 6.78604e-07 * pt * pt) + 9.00000e-03 * pt; - float c = -0.35 - 0.550 * std::exp(-0.390730 * pt); - - return 0.5 * (l1 - l1Mean) * (l1 - l1Mean) / l1Sigma / l1Sigma + - 0.5 * (l2 - l2Mean) * (l2 - l2Mean) / l2Sigma / l2Sigma + - 0.5 * c * (l1 - l1Mean) * (l2 - l2Mean) / l1Sigma / l2Sigma < - 4.; + float l2Mean = 1.53126f + 9.50835e+06f / (1.f + 1.08728e+07f * pt + 1.73420e+06f * pt * pt); + float l1Mean = 1.12365f + 0.123770f * std::exp(-pt * 0.246551f) + 5.30000e-03f * pt; + float l2Sigma = 6.48260e-02f + 7.60261e+10f / (1.f + 1.53012e+11f * pt + 5.01265e+05f * pt * pt) + 9.00000e-03f * pt; + float l1Sigma = 4.44719e-04f + 6.99839e-01f / (1.f + 1.22497e+00f * pt + 6.78604e-07f * pt * pt) + 9.00000e-03f * pt; + float c = -0.35f - 0.550f * std::exp(-0.390730f * pt); + if (l1Sigma == 0.f || l2Sigma == 0.f) + return false; + return 0.5f * (l1 - l1Mean) * (l1 - l1Mean) / (l1Sigma * l1Sigma) + + 0.5f * (l2 - l2Mean) * (l2 - l2Mean) / (l2Sigma * l2Sigma) + + 0.5f * c * (l1 - l1Mean) * (l2 - l2Mean) / (l1Sigma * l2Sigma) < + 4.f; } }; From de109b6a08b78d2a3501dbcd9cd47e6c26336266 Mon Sep 17 00:00:00 2001 From: ldellost <47105254+DelloStritto@users.noreply.github.com> Date: Fri, 23 May 2025 11:33:06 +0200 Subject: [PATCH 1386/1650] [PWGHF] Add rapidity cut and prompt and non-prompt efficiency in the LcPK0s task (#11315) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Luigi Dello Stritto Co-authored-by: Vít Kučera --- PWGHF/D2H/Tasks/taskLcToK0sP.cxx | 34 ++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskLcToK0sP.cxx b/PWGHF/D2H/Tasks/taskLcToK0sP.cxx index 6df67174cfd..3c373a59f72 100644 --- a/PWGHF/D2H/Tasks/taskLcToK0sP.cxx +++ b/PWGHF/D2H/Tasks/taskLcToK0sP.cxx @@ -37,14 +37,16 @@ struct HfTaskLcToK0sP { Configurable selectionFlagLcToK0sP{"selectionFlagLcToK0sP", 1, "Selection Flag for Lc"}; Configurable selectionFlagLcbarToK0sP{"selectionFlagLcbarToK0sP", 1, "Selection Flag for Lcbar"}; Configurable etaCandMax{"etaCandMax", -1., "max. cand. pseudorapidity"}; + Configurable yCandGenMax{"yCandGenMax", 0.5, "max. gen particle rapidity"}; + Configurable yCandRecoMax{"yCandRecoMax", 0.8, "max. cand. rapidity"}; Configurable> binsPt{"binsPt", std::vector{hf_cuts_lc_to_k0s_p::vecBinsPt}, "pT bin limits"}; HfHelper hfHelper; - Filter filterSelectCandidates = (aod::hf_sel_candidate_lc_to_k0s_p::isSelLcToK0sP >= selectionFlagLcToK0sP || aod::hf_sel_candidate_lc_to_k0s_p::isSelLcToK0sP >= selectionFlagLcbarToK0sP); - using TracksWPid = soa::Join; + Filter filterSelectCandidates = (aod::hf_sel_candidate_lc_to_k0s_p::isSelLcToK0sP >= selectionFlagLcToK0sP || aod::hf_sel_candidate_lc_to_k0s_p::isSelLcToK0sP >= selectionFlagLcbarToK0sP); + HistogramRegistry registry{"registry"}; void init(InitContext& context) @@ -129,6 +131,8 @@ struct HfTaskLcToK0sP { // add MC histograms if (context.mOptions.get("processMc")) { registry.add("MC/Rec/hPtCandRecSig", "cascade candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); + registry.add("MC/Rec/hPtCandRecSigPrompt", "cascade candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); + registry.add("MC/Rec/hPtCandRecSigNonPrompt", "cascade candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); registry.add("MC/Rec/hPtCandRecBg", "cascade candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); registry.add("MC/Rec/hEtaCandRecSig", "cascade candidates;candidate #it{#eta};entries", {HistType::kTH1F, {axisEta}}); registry.add("MC/Rec/hEtaCandVsPtCandRecSig", "cascade candidates;candidate #it{#eta};p_{T}", {HistType::kTH2F, {axisEta, axisBinsPt}}); @@ -139,6 +143,8 @@ struct HfTaskLcToK0sP { registry.add("MC/Rec/hPhiCandRecBg", "cascade candidates;candidate #it{#phi};entries", {HistType::kTH1F, {axisPhi}}); registry.add("MC/Rec/hPhiCandVsPtCandRecBg", "cascade candidates;candidate #it{#phi};p_{T}", {HistType::kTH2F, {axisPhi, axisBinsPt}}); registry.add("MC/Gen/hPtCandGen", "cascade candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); + registry.add("MC/Gen/hPtCandGenPrompt", "cascade candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); + registry.add("MC/Gen/hPtCandGenNonPrompt", "cascade candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPt}}); registry.add("MC/Gen/hEtaCandGen", "cascade candidates;candidate #it{#eta};entries", {HistType::kTH1F, {axisEta}}); registry.add("MC/Gen/hEtaCandVsPtCandGen", "cascade candidates;candidate #it{#eta};p_{T}", {HistType::kTH2F, {axisEta, axisBinsPt}}); registry.add("MC/Gen/hPhiCandGen", "cascade candidates;candidate #it{#phi};entries", {HistType::kTH1F, {axisPhi}}); @@ -261,6 +267,10 @@ struct HfTaskLcToK0sP { continue; } + if (yCandRecoMax >= 0. && std::abs(hfHelper.yLc(candidate)) > yCandRecoMax) { + continue; + } + auto ptCand = candidate.pt(); auto eta = candidate.eta(); auto phi = candidate.phi(); @@ -364,6 +374,10 @@ struct HfTaskLcToK0sP { continue; } + if (yCandRecoMax >= 0. && std::abs(hfHelper.yLc(candidate)) > yCandRecoMax) { + continue; + } + auto ptCand = candidate.pt(); auto eta = candidate.eta(); auto phi = candidate.phi(); @@ -396,6 +410,11 @@ struct HfTaskLcToK0sP { auto pBach = bach.p(); if (std::abs(candidate.flagMcMatchRec()) == 1) { + if (candidate.originMcRec() == RecoDecay::OriginType::Prompt) { + registry.fill(HIST("MC/Rec/hPtCandRecSigPrompt"), ptCand); + } else if (candidate.originMcRec() == RecoDecay::OriginType::NonPrompt) { + registry.fill(HIST("MC/Rec/hPtCandRecSigNonPrompt"), ptCand); + } registry.fill(HIST("MC/Rec/hPtCandRecSig"), ptCand); registry.fill(HIST("MC/Rec/hEtaCandRecSig"), eta); registry.fill(HIST("MC/Rec/hEtaCandVsPtCandRecSig"), eta, ptCand); @@ -522,6 +541,11 @@ struct HfTaskLcToK0sP { } if (std::abs(particle.flagMcMatchGen()) == 1) { + + auto yGen = RecoDecay::y(particle.pVector(), o2::constants::physics::MassLambdaCPlus); + if (yCandGenMax >= 0. && std::abs(yGen) > yCandGenMax) { + continue; + } auto ptCand = particle.pt(); auto eta = particle.eta(); auto phi = particle.phi(); @@ -530,6 +554,12 @@ struct HfTaskLcToK0sP { registry.fill(HIST("MC/Gen/hEtaCandVsPtCandGen"), eta, ptCand); registry.fill(HIST("MC/Gen/hPhiCandGen"), phi); registry.fill(HIST("MC/Gen/hPhiCandVsPtCandGen"), phi, ptCand); + + if (particle.originMcGen() == RecoDecay::OriginType::Prompt) { + registry.fill(HIST("MC/Gen/hPtCandGenPrompt"), ptCand); + } else if (particle.originMcGen() == RecoDecay::OriginType::NonPrompt) { + registry.fill(HIST("MC/Gen/hPtCandGenNonPrompt"), ptCand); + } } } } From 10e6085eaf4dd32a4f768b752a7d44807d0cdfa5 Mon Sep 17 00:00:00 2001 From: EmilGorm <50658075+EmilGorm@users.noreply.github.com> Date: Fri, 23 May 2025 12:04:43 +0200 Subject: [PATCH 1387/1650] [PWGCF] fix typo in registry (#11324) Co-authored-by: ALICE Action Bot --- PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx b/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx index 4378565008e..43bd99639ba 100644 --- a/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx +++ b/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx @@ -1104,7 +1104,7 @@ struct FlowGenericFramework { { float centrality = -1; int run = 0; - registry.fill(HIST("MCGen/impactParamter"), mcCollision.impactParameter(), mcParticles.size()); + registry.fill(HIST("MCGen/impactParameter"), mcCollision.impactParameter(), mcParticles.size()); processCollision(mcCollision, mcParticles, centrality, run); } PROCESS_SWITCH(FlowGenericFramework, processOnTheFly, "Process analysis for MC on-the-fly generated events", false); From df1bafa487f110c8d2678bc8cc74e0ebca8c510f Mon Sep 17 00:00:00 2001 From: JStaa <39123272+JStaa@users.noreply.github.com> Date: Fri, 23 May 2025 15:06:14 +0200 Subject: [PATCH 1388/1650] [PWGCF] Fixed the implementation of the additional event filters (#11328) Co-authored-by: ALICE Action Bot --- .../Tasks/threeParticleCorrelations.cxx | 440 +++++++++++------- 1 file changed, 279 insertions(+), 161 deletions(-) diff --git a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx index 8ad7f7db394..d5522e7e27a 100644 --- a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx +++ b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx @@ -93,12 +93,14 @@ struct ThreeParticleCorrelations { using MyFilteredMCGenCollision = MyFilteredMCGenCollisions::iterator; using MyFilteredMCParticles = soa::Filtered; using MyFilteredMCRecCollision = soa::Filtered>::iterator; + using MyFilteredMCV0s = soa::Filtered>; using MyFilteredMCTracks = soa::Filtered>; // Partitions - Partition mcParticles = aod::mcparticle::pt > trackPtMin&& aod::mcparticle::pt < trackPtMax; + Partition mcTracks = aod::mcparticle::pt > trackPtMin&& aod::mcparticle::pt < trackPtMax; + Partition mcV0s = aod::mcparticle::pt > v0PtMin&& aod::mcparticle::pt < v0PtMax&& nabs(aod::mcparticle::eta) < v0EtaMax; Partition mcTriggers = ((aod::mcparticle::pdgCode == static_cast(kLambda0) || aod::mcparticle::pdgCode == static_cast(kLambda0Bar)) && aod::mcparticle::pt > v0PtMin && aod::mcparticle::pt < v0PtMax && nabs(aod::mcparticle::eta) < v0EtaMax); Partition mcAssociates = (((aod::mcparticle::pdgCode == static_cast(kPiPlus) || aod::mcparticle::pdgCode == static_cast(kPiMinus)) && aod::mcparticle::pt > pionPtMin && aod::mcparticle::pt < pionPtMax) || @@ -143,28 +145,35 @@ struct ThreeParticleCorrelations { // Histograms axes const AxisSpec centralityAxis{confCentBins}; const AxisSpec zvtxAxis{confZvtxBins}; - const AxisSpec phiAxis{36, (-1. / 2) * constants::math::PI, (3. / 2) * constants::math::PI}; - const AxisSpec etaAxis{32, -1.52, 1.52}; + const AxisSpec dPhiAxis{36, (-1. / 2) * constants::math::PI, (3. / 2) * constants::math::PI}; + const AxisSpec dEtaAxis{32, -1.52, 1.52}; const AxisSpec v0PtAxis{114, 0.6, 12}; + const AxisSpec v0EtaAxis{36, -0.72, 0.72}; const AxisSpec trackPtAxis{28, 0.2, 3}; const AxisSpec trackEtaAxis{32, -0.8, 0.8}; const AxisSpec lambdaInvMassAxis{100, 1.08, 1.16}; // QA & PID - rQARegistry.add("hTrackPt", "hTrackPt", {HistType::kTH1D, {{100, 0, 4}}}); - rQARegistry.add("hTrackEta", "hTrackEta", {HistType::kTH1D, {{100, -1, 1}}}); - rQARegistry.add("hTrackPhi", "hTrackPhi", {HistType::kTH1D, {{100, (-1. / 2) * constants::math::PI, (5. / 2) * constants::math::PI}}}); + rQARegistry.add("hNEvents", "hNEvents", {HistType::kTH1D, {{3, 0, 3}}}); + rQARegistry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(1, "All"); + rQARegistry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(2, "kNoSameBunchPileup"); + rQARegistry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(3, "kIsGoodZvtxFT0vsPV"); + rQARegistry.add("hEventCentrality", "hEventCentrality", {HistType::kTH1D, {{centralityAxis}}}); rQARegistry.add("hEventCentrality_MC", "hEventCentrality_MC", {HistType::kTH1D, {{centralityAxis}}}); rQARegistry.add("hEventZvtx", "hEventZvtx", {HistType::kTH1D, {{zvtxAxis}}}); + rQARegistry.add("hTrackPt", "hTrackPt", {HistType::kTH1D, {{100, 0, 4}}}); + rQARegistry.add("hTrackEta", "hTrackEta", {HistType::kTH1D, {{100, -1, 1}}}); + rQARegistry.add("hTrackPhi", "hTrackPhi", {HistType::kTH1D, {{100, (-1. / 2) * constants::math::PI, (5. / 2) * constants::math::PI}}}); - rQARegistry.add("hPtPion", "hPtPion", {HistType::kTH1D, {{trackPtAxis}}}); - rQARegistry.add("hPtKaon", "hPtKaon", {HistType::kTH1D, {{trackPtAxis}}}); - rQARegistry.add("hPtProton", "hPtProton", {HistType::kTH1D, {{trackPtAxis}}}); - rQARegistry.add("hPtV0", "hPtV0", {HistType::kTH1D, {{v0PtAxis}}}); - rQARegistry.add("hPtPion_MC", "hPtPion_MC", {HistType::kTH1D, {{trackPtAxis}}}); - rQARegistry.add("hPtKaon_MC", "hPtKaon_MC", {HistType::kTH1D, {{trackPtAxis}}}); - rQARegistry.add("hPtProton_MC", "hPtProton_MC", {HistType::kTH1D, {{trackPtAxis}}}); + rQARegistry.add("hPtPion", "hPtPion", {HistType::kTH2D, {{trackPtAxis}, {centralityAxis}}}); + rQARegistry.add("hPtKaon", "hPtKaon", {HistType::kTH2D, {{trackPtAxis}, {centralityAxis}}}); + rQARegistry.add("hPtProton", "hPtProton", {HistType::kTH2D, {{trackPtAxis}, {centralityAxis}}}); + rQARegistry.add("hPtV0", "hPtV0", {HistType::kTH2D, {{v0PtAxis}, {centralityAxis}}}); + rQARegistry.add("hPtPion_MC", "hPtPion_MC", {HistType::kTH2D, {{trackPtAxis}, {centralityAxis}}}); + rQARegistry.add("hPtKaon_MC", "hPtKaon_MC", {HistType::kTH2D, {{trackPtAxis}, {centralityAxis}}}); + rQARegistry.add("hPtProton_MC", "hPtProton_MC", {HistType::kTH2D, {{trackPtAxis}, {centralityAxis}}}); + rQARegistry.add("hPtV0_MC", "hPtV0_MC", {HistType::kTH2D, {{v0PtAxis}, {centralityAxis}}}); rQARegistry.add("hdEdx", "hdEdx", {HistType::kTH2D, {{56, 0.2, 3.0}, {180, 20, 200}}}); rQARegistry.add("hdEdxPion", "hdEdxPion", {HistType::kTH2D, {{56, 0.2, 3.0}, {180, 20, 200}}}); @@ -185,6 +194,8 @@ struct ThreeParticleCorrelations { rQARegistry.add("hInvMassLambda", "hInvMassLambda", {HistType::kTH3D, {{lambdaInvMassAxis}, {v0PtAxis}, {centralityAxis}}}); rQARegistry.add("hInvMassAntiLambda", "hInvMassAntiLambda", {HistType::kTH3D, {{lambdaInvMassAxis}, {v0PtAxis}, {centralityAxis}}}); rQARegistry.add("hNLambdas", "hNLambdas", {HistType::kTH3D, {{2, -2, 2}, {v0PtAxis}, {centralityAxis}}}); + rQARegistry.add("hInvMassLambda_MC", "hInvMassLambda_MC", {HistType::kTH3D, {{lambdaInvMassAxis}, {v0PtAxis}, {centralityAxis}}}); + rQARegistry.add("hInvMassAntiLambda_MC", "hInvMassAntiLambda_MC", {HistType::kTH3D, {{lambdaInvMassAxis}, {v0PtAxis}, {centralityAxis}}}); // PhiStar rPhiStarRegistry.add("hSEProtonPreCut_OS", "hSEProtonPreCut_OS", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); @@ -204,6 +215,8 @@ struct ThreeParticleCorrelations { rMCRegistry.add("hGenKaonN", "hGenKaonN", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); rMCRegistry.add("hGenProtonP", "hGenProtonP", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); rMCRegistry.add("hGenProtonN", "hGenProtonN", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hGenLambdaP", "hGenLambdaP", {HistType::kTH3D, {{v0PtAxis}, {v0EtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hGenLambdaN", "hGenLambdaN", {HistType::kTH3D, {{v0PtAxis}, {v0EtaAxis}, {centralityAxis}}}); rMCRegistry.add("hReconstructed", "hReconstructed", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); rMCRegistry.add("hRecPionP", "hRecPionP", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); rMCRegistry.add("hRecPionN", "hRecPionN", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); @@ -211,6 +224,8 @@ struct ThreeParticleCorrelations { rMCRegistry.add("hRecKaonN", "hRecKaonN", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); rMCRegistry.add("hRecProtonP", "hRecProtonP", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); rMCRegistry.add("hRecProtonN", "hRecProtonN", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hRecLambdaP", "hRecLambdaP", {HistType::kTH3D, {{v0PtAxis}, {v0EtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hRecLambdaN", "hRecLambdaN", {HistType::kTH3D, {{v0PtAxis}, {v0EtaAxis}, {centralityAxis}}}); rMCRegistry.add("hIdentified", "hIdentified", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); rMCRegistry.add("hPIDPionP", "hPIDPionP", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); rMCRegistry.add("hPIDPionN", "hPIDPionN", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); @@ -218,6 +233,10 @@ struct ThreeParticleCorrelations { rMCRegistry.add("hPIDKaonN", "hPIDKaonN", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); rMCRegistry.add("hPIDProtonP", "hPIDProtonP", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); rMCRegistry.add("hPIDProtonN", "hPIDProtonN", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hPIDLambdaP_SGNL", "hPIDLambdaP_SGNL", {HistType::kTH3D, {{v0PtAxis}, {v0EtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hPIDLambdaP_SB", "hPIDLambdaP_SB", {HistType::kTH3D, {{v0PtAxis}, {v0EtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hPIDLambdaN_SGNL", "hPIDLambdaN_SGNL", {HistType::kTH3D, {{v0PtAxis}, {v0EtaAxis}, {centralityAxis}}}); + rMCRegistry.add("hPIDLambdaN_SB", "hPIDLambdaN_SB", {HistType::kTH3D, {{v0PtAxis}, {v0EtaAxis}, {centralityAxis}}}); // Purity rMCRegistry.add("hSelectPionP", "hSelectPionP", {HistType::kTH1D, {trackPtAxis}}); @@ -234,39 +253,39 @@ struct ThreeParticleCorrelations { rMCRegistry.add("hTrueSelectProtonN", "hTrueSelectProtonN", {HistType::kTH1D, {trackPtAxis}}); // Correlations - rSECorrRegistry.add("hSameLambdaPion_SGNL", "Same-event #Lambda - #pi correlator (SGNL region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rSECorrRegistry.add("hSameLambdaPion_SB", "Same-event #Lambda - #pi correlator (SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rSECorrRegistry.add("hSameLambdaKaon_SGNL", "Same-event #Lambda - K correlator (SGNL region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rSECorrRegistry.add("hSameLambdaKaon_SB", "Same-event #Lambda - K correlator (SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rSECorrRegistry.add("hSameLambdaProton_SGNL", "Same-event #Lambda - p correlator (SGNL region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rSECorrRegistry.add("hSameLambdaProton_SB", "Same-event #Lambda - p correlator (SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rSECorrRegistry.add("hSameLambdaPion_MC", "Same-event #Lambda - #pi correlator (MC)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rSECorrRegistry.add("hSameLambdaKaon_MC", "Same-event #Lambda - K correlator (MC)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rSECorrRegistry.add("hSameLambdaProton_MC", "Same-event #Lambda - p correlator (MC)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - - rSECorrRegistry.add("hSameLambdaPion_leftSB", "Same-event #Lambda - #pi correlator (Left SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rSECorrRegistry.add("hSameLambdaPion_rightSB", "Same-event #Lambda - #pi correlator (Right SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rSECorrRegistry.add("hSameLambdaKaon_leftSB", "Same-event #Lambda - K correlator (Left SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rSECorrRegistry.add("hSameLambdaKaon_rightSB", "Same-event #Lambda - K correlator (Right SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rSECorrRegistry.add("hSameLambdaProton_leftSB", "Same-event #Lambda - p correlator (Left SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rSECorrRegistry.add("hSameLambdaProton_rightSB", "Same-event #Lambda - p correlator (Right SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - - rMECorrRegistry.add("hMixLambdaPion_SGNL", "Mixed-event #Lambda - #pi correlator (SGNL region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rMECorrRegistry.add("hMixLambdaPion_SB", "Mixed-event #Lambda - #pi correlator (SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rMECorrRegistry.add("hMixLambdaKaon_SGNL", "Mixed-event #Lambda - K correlator (SGNL region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rMECorrRegistry.add("hMixLambdaKaon_SB", "Mixed-event #Lambda - K correlator (SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rMECorrRegistry.add("hMixLambdaProton_SGNL", "Mixed-event #Lambda - p correlator (SGNL region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rMECorrRegistry.add("hMixLambdaProton_SB", "Mixed-event #Lambda - p correlator (SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rMECorrRegistry.add("hMixLambdaPion_MC", "Mixed-event #Lambda - #pi correlator (MC)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rMECorrRegistry.add("hMixLambdaKaon_MC", "Mixed-event #Lambda - K correlator (MC)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rMECorrRegistry.add("hMixLambdaProton_MC", "Mixed-event #Lambda - p correlator (MC)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - - rMECorrRegistry.add("hMixLambdaPion_leftSB", "Mixed-event #Lambda - #pi correlator (Left SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rMECorrRegistry.add("hMixLambdaPion_rightSB", "Mixed-event #Lambda - #pi correlator (Right SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rMECorrRegistry.add("hMixLambdaKaon_leftSB", "Mixed-event #Lambda - K correlator (Left SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rMECorrRegistry.add("hMixLambdaKaon_rightSB", "Mixed-event #Lambda - K correlator (Right SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rMECorrRegistry.add("hMixLambdaProton_leftSB", "Mixed-event #Lambda - p correlator (Left SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); - rMECorrRegistry.add("hMixLambdaProton_rightSB", "Mixed-event #Lambda - p correlator (Right SB region)", {HistType::kTHnSparseF, {{phiAxis}, {etaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaPion_SGNL", "Same-event #Lambda - #pi correlator (SGNL region)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaPion_SB", "Same-event #Lambda - #pi correlator (SB region)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaKaon_SGNL", "Same-event #Lambda - K correlator (SGNL region)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaKaon_SB", "Same-event #Lambda - K correlator (SB region)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaProton_SGNL", "Same-event #Lambda - p correlator (SGNL region)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaProton_SB", "Same-event #Lambda - p correlator (SB region)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaPion_MC", "Same-event #Lambda - #pi correlator (MC)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaKaon_MC", "Same-event #Lambda - K correlator (MC)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaProton_MC", "Same-event #Lambda - p correlator (MC)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + + rSECorrRegistry.add("hSameLambdaPion_leftSB", "Same-event #Lambda - #pi correlator (Left SB region)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaPion_rightSB", "Same-event #Lambda - #pi correlator (Right SB region)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaKaon_leftSB", "Same-event #Lambda - K correlator (Left SB region)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaKaon_rightSB", "Same-event #Lambda - K correlator (Right SB region)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaProton_leftSB", "Same-event #Lambda - p correlator (Left SB region)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rSECorrRegistry.add("hSameLambdaProton_rightSB", "Same-event #Lambda - p correlator (Right SB region)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + + rMECorrRegistry.add("hMixLambdaPion_SGNL", "Mixed-event #Lambda - #pi correlator (SGNL region)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaPion_SB", "Mixed-event #Lambda - #pi correlator (SB region)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaKaon_SGNL", "Mixed-event #Lambda - K correlator (SGNL region)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaKaon_SB", "Mixed-event #Lambda - K correlator (SB region)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaProton_SGNL", "Mixed-event #Lambda - p correlator (SGNL region)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaProton_SB", "Mixed-event #Lambda - p correlator (SB region)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaPion_MC", "Mixed-event #Lambda - #pi correlator (MC)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaKaon_MC", "Mixed-event #Lambda - K correlator (MC)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaProton_MC", "Mixed-event #Lambda - p correlator (MC)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + + rMECorrRegistry.add("hMixLambdaPion_leftSB", "Mixed-event #Lambda - #pi correlator (Left SB region)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaPion_rightSB", "Mixed-event #Lambda - #pi correlator (Right SB region)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaKaon_leftSB", "Mixed-event #Lambda - K correlator (Left SB region)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaKaon_rightSB", "Mixed-event #Lambda - K correlator (Right SB region)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaProton_leftSB", "Mixed-event #Lambda - p correlator (Left SB region)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); + rMECorrRegistry.add("hMixLambdaProton_rightSB", "Mixed-event #Lambda - p correlator (Right SB region)", {HistType::kTHnSparseF, {{dPhiAxis}, {dEtaAxis}, {centralityAxis}, {zvtxAxis}, {2, -2, 2}, {2, -2, 2}}}); ccdb->setURL("http://alice-ccdb.cern.ch"); ccdb->setCaching(true); @@ -284,6 +303,10 @@ struct ThreeParticleCorrelations { void processSame(MyFilteredCollision const& collision, MyFilteredV0s const& v0s, MyFilteredTracks const& tracks, aod::BCsWithTimestamps const&) { + if (!acceptEvent(collision, true)) { + return; + } + auto bc = collision.bc_as(); auto bField = getMagneticField(bc.timestamp()); rQARegistry.fill(HIST("hEventCentrality"), collision.centFT0C()); @@ -308,15 +331,15 @@ struct ThreeParticleCorrelations { rQARegistry.fill(HIST("hdEdx"), track.pt(), track.tpcSignal()); rQARegistry.fill(HIST("hBeta"), track.pt(), track.beta()); if (assocPID[0] == pionID) { // Pions - rQARegistry.fill(HIST("hPtPion"), track.pt(), 1. / trackEff(hEffPions, track)); + rQARegistry.fill(HIST("hPtPion"), track.pt(), collision.centFT0C(), 1. / trackEff(hEffPions, track)); rQARegistry.fill(HIST("hdEdxPion"), track.pt(), track.tpcSignal()); rQARegistry.fill(HIST("hBetaPion"), track.pt(), track.beta()); } else if (assocPID[0] == kaonID) { // Kaons - rQARegistry.fill(HIST("hPtKaon"), track.pt(), 1. / trackEff(hEffKaons, track)); + rQARegistry.fill(HIST("hPtKaon"), track.pt(), collision.centFT0C(), 1. / trackEff(hEffKaons, track)); rQARegistry.fill(HIST("hdEdxKaon"), track.pt(), track.tpcSignal()); rQARegistry.fill(HIST("hBetaKaon"), track.pt(), track.beta()); } else if (assocPID[0] == protonID) { // Protons - rQARegistry.fill(HIST("hPtProton"), track.pt(), 1. / trackEff(hEffProtons, track)); + rQARegistry.fill(HIST("hPtProton"), track.pt(), collision.centFT0C(), 1. / trackEff(hEffProtons, track)); rQARegistry.fill(HIST("hdEdxProton"), track.pt(), track.tpcSignal()); rQARegistry.fill(HIST("hBetaProton"), track.pt(), track.beta()); } @@ -326,9 +349,9 @@ struct ThreeParticleCorrelations { // Start of the Same-Event correlations for (const auto& trigger : v0s) { - if (v0Filters(trigger)) { + if (v0Filters(trigger, false)) { - rQARegistry.fill(HIST("hPtV0"), trigger.pt()); + rQARegistry.fill(HIST("hPtV0"), trigger.pt(), collision.centFT0C()); triggSign = v0Sign(trigger); if (triggSign == 1) { candMass = trigger.mLambda(); @@ -358,25 +381,25 @@ struct ThreeParticleCorrelations { } else if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { if (assocPID[0] == pionID) { // Pions rSECorrRegistry.fill(HIST("hSameLambdaPion_SB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate)); - if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass < MassLambda0 + 4 * dGaussSigma) { + if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass < MassLambda0 - 4 * dGaussSigma) { rSECorrRegistry.fill(HIST("hSameLambdaPion_leftSB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate)); - } else if (candMass > MassLambda0 - 4 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { + } else if (candMass > MassLambda0 + 4 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { rSECorrRegistry.fill(HIST("hSameLambdaPion_rightSB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate)); } } else if (assocPID[0] == kaonID) { // Kaons rSECorrRegistry.fill(HIST("hSameLambdaKaon_SB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate)); - if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass < MassLambda0 + 4 * dGaussSigma) { + if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass < MassLambda0 - 4 * dGaussSigma) { rSECorrRegistry.fill(HIST("hSameLambdaKaon_leftSB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate)); - } else if (candMass > MassLambda0 - 4 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { + } else if (candMass > MassLambda0 + 4 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { rSECorrRegistry.fill(HIST("hSameLambdaKaon_rightSB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate)); } } else if (assocPID[0] == protonID) { // Protons rSECorrRegistry.fill(HIST("hSameLambdaProton_SB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate)); - if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass < MassLambda0 + 4 * dGaussSigma) { + if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass < MassLambda0 - 4 * dGaussSigma) { rSECorrRegistry.fill(HIST("hSameLambdaProton_leftSB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate)); - } else if (candMass > MassLambda0 - 4 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { + } else if (candMass > MassLambda0 + 4 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { rSECorrRegistry.fill(HIST("hSameLambdaProton_rightSB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate)); } } @@ -395,10 +418,14 @@ struct ThreeParticleCorrelations { // Start of the Mixed-Event correlations for (const auto& [coll_1, v0_1, coll_2, track_2] : pairData) { + if (!acceptEvent(coll_1, false) || !acceptEvent(coll_2, false)) { + return; + } + auto bc = coll_1.bc_as(); auto bField = getMagneticField(bc.timestamp()); for (const auto& [trigger, associate] : soa::combinations(soa::CombinationsFullIndexPolicy(v0_1, track_2))) { - if (v0Filters(trigger) && trackFilters(associate)) { + if (v0Filters(trigger, false) && trackFilters(associate)) { if (radialDistanceFilter(trigger, associate, bField, true) && fakeV0Filter(trigger, associate)) { triggSign = v0Sign(trigger); @@ -424,25 +451,25 @@ struct ThreeParticleCorrelations { } else if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { if (assocPID[0] == pionID) { // Pions rMECorrRegistry.fill(HIST("hMixLambdaPion_SB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate)); - if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass < MassLambda0 + 4 * dGaussSigma) { + if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass < MassLambda0 - 4 * dGaussSigma) { rMECorrRegistry.fill(HIST("hMixLambdaPion_leftSB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate)); - } else if (candMass > MassLambda0 - 4 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { + } else if (candMass > MassLambda0 + 4 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { rMECorrRegistry.fill(HIST("hMixLambdaPion_rightSB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate)); } } else if (assocPID[0] == kaonID) { // Kaons rMECorrRegistry.fill(HIST("hMixLambdaKaon_SB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate)); - if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass < MassLambda0 + 4 * dGaussSigma) { + if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass < MassLambda0 - 4 * dGaussSigma) { rMECorrRegistry.fill(HIST("hMixLambdaKaon_leftSB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate)); - } else if (candMass > MassLambda0 - 4 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { + } else if (candMass > MassLambda0 + 4 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { rMECorrRegistry.fill(HIST("hMixLambdaKaon_rightSB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate)); } } else if (assocPID[0] == protonID) { // Protons rMECorrRegistry.fill(HIST("hMixLambdaProton_SB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate)); - if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass < MassLambda0 + 4 * dGaussSigma) { + if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass < MassLambda0 - 4 * dGaussSigma) { rMECorrRegistry.fill(HIST("hMixLambdaProton_leftSB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate)); - } else if (candMass > MassLambda0 - 4 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { + } else if (candMass > MassLambda0 + 4 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { rMECorrRegistry.fill(HIST("hMixLambdaProton_rightSB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate)); } } @@ -466,11 +493,11 @@ struct ThreeParticleCorrelations { if (track.isPhysicalPrimary()) { if (std::abs(track.pdgCode()) == kPiPlus) { // Pions - rQARegistry.fill(HIST("hPtPion_MC"), track.pt()); + rQARegistry.fill(HIST("hPtPion_MC"), track.pt(), collision.bestCollisionCentFT0C()); } else if (std::abs(track.pdgCode()) == kKPlus) { // Kaons - rQARegistry.fill(HIST("hPtKaon_MC"), track.pt()); + rQARegistry.fill(HIST("hPtKaon_MC"), track.pt(), collision.bestCollisionCentFT0C()); } else if (std::abs(track.pdgCode()) == kProton) { // Protons - rQARegistry.fill(HIST("hPtProton_MC"), track.pt()); + rQARegistry.fill(HIST("hPtProton_MC"), track.pt(), collision.bestCollisionCentFT0C()); } } } @@ -480,6 +507,7 @@ struct ThreeParticleCorrelations { for (const auto& trigger : groupMCTriggers) { if (trigger.isPhysicalPrimary()) { + rQARegistry.fill(HIST("hPtV0_MC"), trigger.pt(), collision.bestCollisionCentFT0C()); if (trigger.pdgCode() > 0) { triggSign = 1; } else if (trigger.pdgCode() < 0) { @@ -554,13 +582,14 @@ struct ThreeParticleCorrelations { void processMCGen(MyFilteredMCGenCollision const& collision, MyFilteredMCParticles const&) { - auto groupMCParticles = mcParticles->sliceByCached(aod::mcparticle::mcCollisionId, collision.globalIndex(), cache); + auto groupMCTracks = mcTracks->sliceByCached(aod::mcparticle::mcCollisionId, collision.globalIndex(), cache); + auto groupMCV0s = mcV0s->sliceByCached(aod::mcparticle::mcCollisionId, collision.globalIndex(), cache); // Start of the Monte-Carlo generated QA - for (const auto& particle : groupMCParticles) { + for (const auto& particle : groupMCTracks) { if (particle.isPhysicalPrimary()) { - // Efficiency - Generated + // Track efficiency - Generated rMCRegistry.fill(HIST("hGenerated"), particle.pt(), particle.eta(), collision.bestCollisionCentFT0C()); if (particle.pdgCode() == kPiPlus) { // Pos pions rMCRegistry.fill(HIST("hGenPionP"), particle.pt(), particle.eta(), collision.bestCollisionCentFT0C()); @@ -577,95 +606,145 @@ struct ThreeParticleCorrelations { } } } + + for (const auto& particle : groupMCV0s) { + if (particle.isPhysicalPrimary()) { + + // V0 efficiency - Generated + if (particle.pdgCode() == kLambda0) { // Lambdas + rMCRegistry.fill(HIST("hGenLambdaP"), particle.pt(), particle.eta(), collision.bestCollisionCentFT0C()); + } else if (particle.pdgCode() == kLambda0Bar) { // AntiLambdas + rMCRegistry.fill(HIST("hGenLambdaN"), particle.pt(), particle.eta(), collision.bestCollisionCentFT0C()); + } + } + } // End of the Monte-Carlo generated QA } - void processMCRec(MyFilteredMCRecCollision const& collision, MyFilteredMCTracks const& tracks, aod::McCollisions const&, aod::McParticles const&) + void processMCRec(MyFilteredMCRecCollision const& collision, MyFilteredMCV0s const& v0s, MyFilteredMCTracks const& tracks, aod::McCollisions const&, aod::McParticles const&) { - if (!collision.has_mcCollision()) { + if (!acceptEvent(collision, false) || !collision.has_mcCollision()) { return; } // Start of the Monte-Carlo reconstructed QA for (const auto& track : tracks) { + if (!track.has_mcParticle()) { continue; } - auto particle = track.mcParticle(); - if (particle.isPhysicalPrimary()) { - // Efficiency - Reconstructed - rMCRegistry.fill(HIST("hReconstructed"), track.pt(), track.eta(), collision.centFT0C()); - if (particle.pdgCode() == kPiPlus) { // Pos pions - rMCRegistry.fill(HIST("hRecPionP"), track.pt(), track.eta(), collision.centFT0C()); - } else if (particle.pdgCode() == kPiMinus) { // Neg pions - rMCRegistry.fill(HIST("hRecPionN"), track.pt(), track.eta(), collision.centFT0C()); - } else if (particle.pdgCode() == kKPlus) { // Pos kaons - rMCRegistry.fill(HIST("hRecKaonP"), track.pt(), track.eta(), collision.centFT0C()); - } else if (particle.pdgCode() == kKMinus) { // Neg kaons - rMCRegistry.fill(HIST("hRecKaonN"), track.pt(), track.eta(), collision.centFT0C()); - } else if (particle.pdgCode() == kProton) { // Pos protons - rMCRegistry.fill(HIST("hRecProtonP"), track.pt(), track.eta(), collision.centFT0C()); - } else if (particle.pdgCode() == kProtonBar) { // Neg protons - rMCRegistry.fill(HIST("hRecProtonN"), track.pt(), track.eta(), collision.centFT0C()); + // Track efficiency - Reconstructed + rMCRegistry.fill(HIST("hReconstructed"), track.pt(), track.eta(), collision.centFT0C()); + if (particle.pdgCode() == kPiPlus) { // Pos pions + rMCRegistry.fill(HIST("hRecPionP"), track.pt(), track.eta(), collision.centFT0C()); + } else if (particle.pdgCode() == kPiMinus) { // Neg pions + rMCRegistry.fill(HIST("hRecPionN"), track.pt(), track.eta(), collision.centFT0C()); + } else if (particle.pdgCode() == kKPlus) { // Pos kaons + rMCRegistry.fill(HIST("hRecKaonP"), track.pt(), track.eta(), collision.centFT0C()); + } else if (particle.pdgCode() == kKMinus) { // Neg kaons + rMCRegistry.fill(HIST("hRecKaonN"), track.pt(), track.eta(), collision.centFT0C()); + } else if (particle.pdgCode() == kProton) { // Pos protons + rMCRegistry.fill(HIST("hRecProtonP"), track.pt(), track.eta(), collision.centFT0C()); + } else if (particle.pdgCode() == kProtonBar) { // Neg protons + rMCRegistry.fill(HIST("hRecProtonN"), track.pt(), track.eta(), collision.centFT0C()); + } + + if (trackFilters(track)) { + + // Track efficiency - Reconstructed & PID filters applied + assocPID = trackPID(track); + rMCRegistry.fill(HIST("hIdentified"), track.pt(), track.eta(), collision.centFT0C()); + if (assocPID[0] == pionID && track.sign() > 0) { // Pos pions + rMCRegistry.fill(HIST("hPIDPionP"), track.pt(), track.eta(), collision.centFT0C()); + } else if (assocPID[0] == pionID && track.sign() < 0) { // Neg pions + rMCRegistry.fill(HIST("hPIDPionN"), track.pt(), track.eta(), collision.centFT0C()); + } else if (assocPID[0] == kaonID && track.sign() > 0) { // Pos kaons + rMCRegistry.fill(HIST("hPIDKaonP"), track.pt(), track.eta(), collision.centFT0C()); + } else if (assocPID[0] == kaonID && track.sign() < 0) { // Neg kaons + rMCRegistry.fill(HIST("hPIDKaonN"), track.pt(), track.eta(), collision.centFT0C()); + } else if (assocPID[0] == protonID && track.sign() > 0) { // Pos protons + rMCRegistry.fill(HIST("hPIDProtonP"), track.pt(), track.eta(), collision.centFT0C()); + } else if (assocPID[0] == protonID && track.sign() < 0) { // Neg protons + rMCRegistry.fill(HIST("hPIDProtonN"), track.pt(), track.eta(), collision.centFT0C()); } - if (trackFilters(track)) { - - // Efficiency - Reconstructed & PID filters applied - rMCRegistry.fill(HIST("hIdentified"), track.pt(), track.eta(), collision.centFT0C()); - if (particle.pdgCode() == kPiPlus) { // Pos pions - rMCRegistry.fill(HIST("hPIDPionP"), track.pt(), track.eta(), collision.centFT0C()); - } else if (particle.pdgCode() == kPiMinus) { // Neg pions - rMCRegistry.fill(HIST("hPIDPionN"), track.pt(), track.eta(), collision.centFT0C()); - } else if (particle.pdgCode() == kKPlus) { // Pos kaons - rMCRegistry.fill(HIST("hPIDKaonP"), track.pt(), track.eta(), collision.centFT0C()); - } else if (particle.pdgCode() == kKMinus) { // Neg kaons - rMCRegistry.fill(HIST("hPIDKaonN"), track.pt(), track.eta(), collision.centFT0C()); - } else if (particle.pdgCode() == kProton) { // Pos protons - rMCRegistry.fill(HIST("hPIDProtonP"), track.pt(), track.eta(), collision.centFT0C()); - } else if (particle.pdgCode() == kProtonBar) { // Neg protons - rMCRegistry.fill(HIST("hPIDProtonN"), track.pt(), track.eta(), collision.centFT0C()); + // Purity (PID) + if (track.sign() > 0) { // Positive tracks + if (assocPID[0] == pionID) { // Pions + rMCRegistry.fill(HIST("hSelectPionP"), track.pt()); + if (particle.pdgCode() == kPiPlus) { + rMCRegistry.fill(HIST("hTrueSelectPionP"), track.pt()); + } + } else if (assocPID[0] == kaonID) { // Kaons + rMCRegistry.fill(HIST("hSelectKaonP"), track.pt()); + if (particle.pdgCode() == kKPlus) { + rMCRegistry.fill(HIST("hTrueSelectKaonP"), track.pt()); + } + } else if (assocPID[0] == protonID) { // Protons + rMCRegistry.fill(HIST("hSelectProtonP"), track.pt()); + if (particle.pdgCode() == kProton) { + rMCRegistry.fill(HIST("hTrueSelectProtonP"), track.pt()); + } + } + } else if (track.sign() < 0) { // Negative tracks + if (assocPID[0] == pionID) { // Pions + rMCRegistry.fill(HIST("hSelectPionN"), track.pt()); + if (particle.pdgCode() == kPiMinus) { + rMCRegistry.fill(HIST("hTrueSelectPionN"), track.pt()); + } + } else if (assocPID[0] == kaonID) { // Kaons + rMCRegistry.fill(HIST("hSelectKaonN"), track.pt()); + if (particle.pdgCode() == kKMinus) { + rMCRegistry.fill(HIST("hTrueSelectKaonN"), track.pt()); + } + } else if (assocPID[0] == protonID) { // Protons + rMCRegistry.fill(HIST("hSelectProtonN"), track.pt()); + if (particle.pdgCode() == kProtonBar) { + rMCRegistry.fill(HIST("hTrueSelectProtonN"), track.pt()); + } } + } + } + } - // Purity (PID) - assocPID = trackPID(track); + for (const auto& v0 : v0s) { - if (track.sign() > 0) { // Positive tracks - if (assocPID[0] == pionID) { // Pions - rMCRegistry.fill(HIST("hSelectPionP"), track.pt()); - if (particle.pdgCode() == kPiPlus) { - rMCRegistry.fill(HIST("hTrueSelectPionP"), track.pt()); - } - } else if (assocPID[0] == kaonID) { // Kaons - rMCRegistry.fill(HIST("hSelectKaonP"), track.pt()); - if (particle.pdgCode() == kKPlus) { - rMCRegistry.fill(HIST("hTrueSelectKaonP"), track.pt()); - } - } else if (assocPID[0] == protonID) { // Protons - rMCRegistry.fill(HIST("hSelectProtonP"), track.pt()); - if (particle.pdgCode() == kProton) { - rMCRegistry.fill(HIST("hTrueSelectProtonP"), track.pt()); - } + if (!v0.has_mcParticle()) { + continue; + } + auto particle = v0.mcParticle(); + + if (particle.isPhysicalPrimary()) { + + // V0 efficiency - Reconstructed + if (particle.pdgCode() == kLambda0) { // Lambdas + rMCRegistry.fill(HIST("hRecLambdaP"), v0.pt(), v0.eta(), collision.centFT0C()); + } else if (particle.pdgCode() == kLambda0Bar) { // AntiLambdas + rMCRegistry.fill(HIST("hRecLambdaN"), v0.pt(), v0.eta(), collision.centFT0C()); + } + + if (v0Filters(v0, true)) { + + // V0 efficiency - Reconstructed + if (v0Sign(v0) == 1) { // Lambdas + candMass = v0.mLambda(); + rQARegistry.fill(HIST("hInvMassLambda_MC"), v0.mLambda(), v0.pt(), collision.centFT0C()); + if (candMass >= MassLambda0 - 4 * dGaussSigma && candMass <= MassLambda0 + 4 * dGaussSigma) { + rMCRegistry.fill(HIST("hPIDLambdaP_SGNL"), v0.pt(), v0.eta(), collision.centFT0C()); + } else if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { + rMCRegistry.fill(HIST("hPIDLambdaP_SB"), v0.pt(), v0.eta(), collision.centFT0C()); } - } else if (track.sign() < 0) { // Negative tracks - if (assocPID[0] == pionID) { // Pions - rMCRegistry.fill(HIST("hSelectPionN"), track.pt()); - if (particle.pdgCode() == kPiMinus) { - rMCRegistry.fill(HIST("hTrueSelectPionN"), track.pt()); - } - } else if (assocPID[0] == kaonID) { // Kaons - rMCRegistry.fill(HIST("hSelectKaonN"), track.pt()); - if (particle.pdgCode() == kKMinus) { - rMCRegistry.fill(HIST("hTrueSelectKaonN"), track.pt()); - } - } else if (assocPID[0] == protonID) { // Protons - rMCRegistry.fill(HIST("hSelectProtonN"), track.pt()); - if (particle.pdgCode() == kProtonBar) { - rMCRegistry.fill(HIST("hTrueSelectProtonN"), track.pt()); - } + + } else if (v0Sign(v0) == -1) { // AntiLambdas + candMass = v0.mAntiLambda(); + rQARegistry.fill(HIST("hInvMassAntiLambda_MC"), v0.mAntiLambda(), v0.pt(), collision.centFT0C()); + if (candMass >= MassLambda0 - 4 * dGaussSigma && candMass <= MassLambda0 + 4 * dGaussSigma) { + rMCRegistry.fill(HIST("hPIDLambdaN_SGNL"), v0.pt(), v0.eta(), collision.centFT0C()); + } else if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { + rMCRegistry.fill(HIST("hPIDLambdaN_SB"), v0.pt(), v0.eta(), collision.centFT0C()); } } } @@ -762,19 +841,58 @@ struct ThreeParticleCorrelations { //========================================================================================================================================================================================================================================================================== + template + bool acceptEvent(const CollCand& collision, bool FillHist) // Event filter + { + + if (FillHist) { + rQARegistry.fill(HIST("hNEvents"), 0.5); + } + + if (!collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { // kNoSameBunchPileup + return false; + } + if (FillHist) { + rQARegistry.fill(HIST("hNEvents"), 1.5); + } + + if (!collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { // kIsGoodZvtxFT0vsPV + return false; + } + if (FillHist) { + rQARegistry.fill(HIST("hNEvents"), 2.5); + } + + return true; + } + template - bool v0Filters(const V0Cand& v0) + bool v0Filters(const V0Cand& v0, bool MCRec) // V0 filter { - if (v0Sign(v0) == 1) { - const auto& posDaughter = v0.template posTrack_as(); - if (std::abs(posDaughter.tpcNSigmaPr()) > nSigma4) { - return kFALSE; + if (!MCRec) { // Data + if (v0Sign(v0) == 1) { + const auto& posDaughter = v0.template posTrack_as(); + if (std::abs(posDaughter.tpcNSigmaPr()) > nSigma4) { + return kFALSE; + } + } else if (v0Sign(v0) == -1) { + const auto& negDaughter = v0.template negTrack_as(); + if (std::abs(negDaughter.tpcNSigmaPr()) > nSigma4) { + return kFALSE; + } } - } else if (v0Sign(v0) == -1) { - const auto& negDaughter = v0.template negTrack_as(); - if (std::abs(negDaughter.tpcNSigmaPr()) > nSigma4) { - return kFALSE; + } else { // MC Reconstructed + if (v0Sign(v0) == 1) { + const auto& posDaughter = v0.template posTrack_as(); + if (std::abs(posDaughter.tpcNSigmaPr()) > nSigma4) { + return kFALSE; + } + } else if (v0Sign(v0) == -1) { + const auto& negDaughter = v0.template negTrack_as(); + if (std::abs(negDaughter.tpcNSigmaPr()) > nSigma4) { + return kFALSE; + } } } @@ -782,7 +900,7 @@ struct ThreeParticleCorrelations { } template - bool trackFilters(const TrackCand& track) + bool trackFilters(const TrackCand& track) // Track filter { if (!track.hasTOF()) { @@ -854,7 +972,7 @@ struct ThreeParticleCorrelations { } template - bool correlationFilters(const V0Cand& v0, const TrackCand& track) + bool correlationFilters(const V0Cand& v0, const TrackCand& track) // Correlation filter { if (track.globalIndex() == v0.posTrackId() || track.globalIndex() == v0.negTrackId()) { @@ -933,17 +1051,17 @@ struct ThreeParticleCorrelations { dPhiStar = RecoDecay::constrainAngle(dPhi + std::asin(phaseProton * r) - std::asin(phaseTrack * r), -constants::math::PIHalf); if (r == rMin) { - if (!Mix) { // Same-event - if (v0Sign(v0) * track.sign() == -1) { // OS + if (!Mix) { // Same-event + if (proton.sign() * track.sign() == -1) { // OS (Electric charge) rPhiStarRegistry.fill(HIST("hSEProtonPreCut_OS"), dPhiStar, dEta); - } else if (v0Sign(v0) * track.sign() == 1) { // SS + } else if (proton.sign() * track.sign() == 1) { // SS (Electric charge) rPhiStarRegistry.fill(HIST("hSEProtonPreCut_SS"), dPhiStar, dEta); } - } else { // Mixed-event - if (v0Sign(v0) * track.sign() == -1) { // OS + } else { // Mixed-event + if (proton.sign() * track.sign() == -1) { // OS (Electric charge) rPhiStarRegistry.fill(HIST("hMEProtonPreCut_OS"), dPhiStar, dEta); - } else if (v0Sign(v0) * track.sign() == 1) { // SS + } else if (proton.sign() * track.sign() == 1) { // SS (Electric charge) rPhiStarRegistry.fill(HIST("hMEProtonPreCut_SS"), dPhiStar, dEta); } } @@ -954,17 +1072,17 @@ struct ThreeParticleCorrelations { } if (r == rMin) { - if (!Mix) { // Same-event - if (v0Sign(v0) * track.sign() == -1) { // OS + if (!Mix) { // Same-event + if (proton.sign() * track.sign() == -1) { // OS (Electric charge) rPhiStarRegistry.fill(HIST("hSEProtonPostCut_OS"), dPhiStar, dEta); - } else if (v0Sign(v0) * track.sign() == 1) { // SS + } else if (proton.sign() * track.sign() == 1) { // SS (Electric charge) rPhiStarRegistry.fill(HIST("hSEProtonPostCut_SS"), dPhiStar, dEta); } - } else { // Mixed-event - if (v0Sign(v0) * track.sign() == -1) { // OS + } else { // Mixed-event + if (proton.sign() * track.sign() == -1) { // OS (Electric charge) rPhiStarRegistry.fill(HIST("hMEProtonPostCut_OS"), dPhiStar, dEta); - } else if (v0Sign(v0) * track.sign() == 1) { // SS + } else if (proton.sign() * track.sign() == 1) { // SS (Electric charge) rPhiStarRegistry.fill(HIST("hMEProtonPostCut_SS"), dPhiStar, dEta); } } From 19b6b1c71fcfaa9ac2763d66ea4236fb0d03721c Mon Sep 17 00:00:00 2001 From: ypwangg <142303052+ypwangg@users.noreply.github.com> Date: Fri, 23 May 2025 21:09:00 +0800 Subject: [PATCH 1389/1650] [PWGDQ] changed a signal name (#11321) --- PWGDQ/Core/MCSignalLibrary.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGDQ/Core/MCSignalLibrary.cxx b/PWGDQ/Core/MCSignalLibrary.cxx index 53bff5b2b3d..584d3d8e7e1 100644 --- a/PWGDQ/Core/MCSignalLibrary.cxx +++ b/PWGDQ/Core/MCSignalLibrary.cxx @@ -1774,7 +1774,7 @@ MCSignal* o2::aod::dqmcsignals::GetMCSignal(const char* name) return signal; } - if (!nameStr.compare("eFromPsi2S")) { + if (!nameStr.compare("eFromJpsiFromPsi2S")) { MCProng prong(3, {11, 443, 100443}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}); signal = new MCSignal(name, "Electron from Jpsi from Psi2S", {prong}, {1}); return signal; From c49cb3622376ca842edc496c75b63894dc6d7315 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Fri, 23 May 2025 16:17:25 +0200 Subject: [PATCH 1390/1650] [PWGJE] Fix bugs found by cppcheck (#11309) --- PWGJE/Core/JetTaggingUtilities.h | 2 +- PWGJE/Tasks/trackJetQA.cxx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGJE/Core/JetTaggingUtilities.h b/PWGJE/Core/JetTaggingUtilities.h index 2f3d9a67d11..ab399bb852d 100644 --- a/PWGJE/Core/JetTaggingUtilities.h +++ b/PWGJE/Core/JetTaggingUtilities.h @@ -350,7 +350,7 @@ int jetOrigin(T const& jet, U const& particles, float dRMax = 0.25) typename U::iterator parton1; typename U::iterator parton2; for (auto const& particle : particles) { - if (std::abs(particle.getGenStatusCode() == 23)) { + if (std::abs(particle.getGenStatusCode()) == 23) { if (!firstPartonFound) { parton1 = particle; firstPartonFound = true; diff --git a/PWGJE/Tasks/trackJetQA.cxx b/PWGJE/Tasks/trackJetQA.cxx index a66bc0e8c0d..f0549a0a0e3 100644 --- a/PWGJE/Tasks/trackJetQA.cxx +++ b/PWGJE/Tasks/trackJetQA.cxx @@ -272,7 +272,7 @@ struct TrackJetQa { histos.fill(HIST("TrackPar/signed1Pt"), track.pt(), track.sigma1Pt() * track.pt(), track.signed1Pt(), collision.centFT0A(), collision.centFT0C()); histos.fill(HIST("TrackPar/snp"), track.pt(), track.sigma1Pt() * track.pt(), track.snp(), collision.centFT0A(), collision.centFT0C()); histos.fill(HIST("TrackPar/tgl"), track.pt(), track.sigma1Pt() * track.pt(), track.tgl(), collision.centFT0A(), collision.centFT0C()); - for (unsigned int i = 0; i < 64; i++) { + for (unsigned int i = 0; i < 32; i++) { if (track.flags() & (1 << i)) { histos.fill(HIST("TrackPar/flags"), track.pt(), track.sigma1Pt() * track.pt(), i); } From e34a7b85ff56427213e238067765b6b5d2a3055e Mon Sep 17 00:00:00 2001 From: prottayCMT <61418725+prottayCMT@users.noreply.github.com> Date: Fri, 23 May 2025 17:25:03 +0200 Subject: [PATCH 1391/1650] [PWGLF] added another step correction for pass5 (#11326) Co-authored-by: Prottay Das --- PWGLF/TableProducer/Common/spvector.cxx | 112 ++++++++++++++---------- 1 file changed, 68 insertions(+), 44 deletions(-) diff --git a/PWGLF/TableProducer/Common/spvector.cxx b/PWGLF/TableProducer/Common/spvector.cxx index 64b86d3395d..99a54d63c64 100644 --- a/PWGLF/TableProducer/Common/spvector.cxx +++ b/PWGLF/TableProducer/Common/spvector.cxx @@ -89,35 +89,39 @@ struct spvector { Configurable cfgCutVertex{"cfgCutVertex", 10.0f, "Accepted z-vertex range"}; Configurable cfgCutCentralityMax{"cfgCutCentralityMax", 80.0f, "Centrality cut Max"}; Configurable cfgCutCentralityMin{"cfgCutCentralityMin", 0.0f, "Centrality cut Min"}; + Configurable additionalEvSel{"additionalEvSel", false, "additionalEvSel"}; + + struct : ConfigurableGroup { + Configurable QxyNbins{"QxyNbins", 100, "Number of bins in QxQy histograms"}; + Configurable PhiNbins{"PhiNbins", 100, "Number of bins in phi histogram"}; + Configurable lbinQxy{"lbinQxy", -5.0, "lower bin value in QxQy histograms"}; + Configurable hbinQxy{"hbinQxy", 5.0, "higher bin value in QxQy histograms"}; + Configurable VxNbins{"VxNbins", 25, "Number of bins in Vx histograms"}; + Configurable lbinVx{"lbinVx", -0.05, "lower bin value in Vx histograms"}; + Configurable hbinVx{"hbinVx", 0.0, "higher bin value in Vx histograms"}; + Configurable VyNbins{"VyNbins", 25, "Number of bins in Vy histograms"}; + Configurable lbinVy{"lbinVy", -0.02, "lower bin value in Vy histograms"}; + Configurable hbinVy{"hbinVy", 0.02, "higher bin value in Vy histograms"}; + Configurable VzNbins{"VzNbins", 20, "Number of bins in Vz histograms"}; + Configurable lbinVz{"lbinVz", -10.0, "lower bin value in Vz histograms"}; + Configurable hbinVz{"hbinVz", 10.0, "higher bin value in Vz histograms"}; + Configurable CentNbins{"CentNbins", 16, "Number of bins in cent histograms"}; + Configurable lbinCent{"lbinCent", 0.0, "lower bin value in cent histograms"}; + Configurable hbinCent{"hbinCent", 80.0, "higher bin value in cent histograms"}; + Configurable VxfineNbins{"VxfineNbins", 25, "Number of bins in Vx fine histograms"}; + Configurable lfinebinVx{"lfinebinVx", -0.05, "lower bin value in Vx fine histograms"}; + Configurable hfinebinVx{"hfinebinVx", 0.0, "higher bin value in Vx fine histograms"}; + Configurable VyfineNbins{"VyfineNbins", 25, "Number of bins in Vy fine histograms"}; + Configurable lfinebinVy{"lfinebinVy", -0.02, "lower bin value in Vy fine histograms"}; + Configurable hfinebinVy{"hfinebinVy", 0.02, "higher bin value in Vy fine histograms"}; + Configurable VzfineNbins{"VzfineNbins", 20, "Number of bins in Vz fine histograms"}; + Configurable lfinebinVz{"lfinebinVz", -10.0, "lower bin value in Vz fine histograms"}; + Configurable hfinebinVz{"hfinebinVz", 10.0, "higher bin value in Vz fine histograms"}; + Configurable CentfineNbins{"CentfineNbins", 16, "Number of bins in cent fine histograms"}; + Configurable lfinebinCent{"lfinebinCent", 0.0, "lower bin value in cent fine histograms"}; + Configurable hfinebinCent{"hfinebinCent", 80.0, "higher bin value in cent fine histograms"}; + } configbins; - Configurable QxyNbins{"QxyNbins", 100, "Number of bins in QxQy histograms"}; - Configurable PhiNbins{"PhiNbins", 100, "Number of bins in phi histogram"}; - Configurable lbinQxy{"lbinQxy", -5.0, "lower bin value in QxQy histograms"}; - Configurable hbinQxy{"hbinQxy", 5.0, "higher bin value in QxQy histograms"}; - Configurable VxNbins{"VxNbins", 25, "Number of bins in Vx histograms"}; - Configurable lbinVx{"lbinVx", -0.05, "lower bin value in Vx histograms"}; - Configurable hbinVx{"hbinVx", 0.0, "higher bin value in Vx histograms"}; - Configurable VyNbins{"VyNbins", 25, "Number of bins in Vy histograms"}; - Configurable lbinVy{"lbinVy", -0.02, "lower bin value in Vy histograms"}; - Configurable hbinVy{"hbinVy", 0.02, "higher bin value in Vy histograms"}; - Configurable VzNbins{"VzNbins", 20, "Number of bins in Vz histograms"}; - Configurable lbinVz{"lbinVz", -10.0, "lower bin value in Vz histograms"}; - Configurable hbinVz{"hbinVz", 10.0, "higher bin value in Vz histograms"}; - Configurable CentNbins{"CentNbins", 16, "Number of bins in cent histograms"}; - Configurable lbinCent{"lbinCent", 0.0, "lower bin value in cent histograms"}; - Configurable hbinCent{"hbinCent", 80.0, "higher bin value in cent histograms"}; - Configurable VxfineNbins{"VxfineNbins", 25, "Number of bins in Vx fine histograms"}; - Configurable lfinebinVx{"lfinebinVx", -0.05, "lower bin value in Vx fine histograms"}; - Configurable hfinebinVx{"hfinebinVx", 0.0, "higher bin value in Vx fine histograms"}; - Configurable VyfineNbins{"VyfineNbins", 25, "Number of bins in Vy fine histograms"}; - Configurable lfinebinVy{"lfinebinVy", -0.02, "lower bin value in Vy fine histograms"}; - Configurable hfinebinVy{"hfinebinVy", 0.02, "higher bin value in Vy fine histograms"}; - Configurable VzfineNbins{"VzfineNbins", 20, "Number of bins in Vz fine histograms"}; - Configurable lfinebinVz{"lfinebinVz", -10.0, "lower bin value in Vz fine histograms"}; - Configurable hfinebinVz{"hfinebinVz", 10.0, "higher bin value in Vz fine histograms"}; - Configurable CentfineNbins{"CentfineNbins", 16, "Number of bins in cent fine histograms"}; - Configurable lfinebinCent{"lfinebinCent", 0.0, "lower bin value in cent fine histograms"}; - Configurable hfinebinCent{"hfinebinCent", 80.0, "higher bin value in cent fine histograms"}; Configurable useShift{"useShift", false, "shift histograms"}; Configurable ispolarization{"ispolarization", false, "Flag to check polarization"}; Configurable followpub{"followpub", true, "flag to use alphaZDC"}; @@ -134,6 +138,7 @@ struct spvector { Configurable coarse5{"coarse5", false, "RE5"}; Configurable fine5{"fine5", false, "REfine5"}; Configurable coarse6{"coarse6", false, "RE6"}; + Configurable fine6{"fine6", false, "REfine6"}; Configurable useRecentereSp{"useRecentereSp", false, "use Recentering with Sparse or THn"}; Configurable useRecenterefineSp{"useRecenterefineSp", false, "use fine Recentering with THn"}; Configurable ConfGainPath{"ConfGainPath", "Users/p/prottay/My/Object/NewPbPbpass4_10092024/gaincallib", "Path to gain calibration"}; @@ -164,6 +169,10 @@ struct spvector { Configurable ConfRecenterevxSp5{"ConfRecenterevxSp5", "Users/p/prottay/My/Object/Testingwithsparse/NewPbPbpass4_17092024/recenter", "Sparse or THn Path for vx recentere5"}; Configurable ConfRecenterevySp5{"ConfRecenterevySp5", "Users/p/prottay/My/Object/Testingwithsparse/NewPbPbpass4_17092024/recenter", "Sparse or THn Path for vy recentere5"}; Configurable ConfRecenterevzSp5{"ConfRecenterevzSp5", "Users/p/prottay/My/Object/Testingwithsparse/NewPbPbpass4_17092024/recenter", "Sparse or THn Path for vz recentere5"}; + Configurable ConfRecenterecentSp6{"ConfRecenterecentSp6", "Users/p/prottay/My/Object/Testingwithsparse/NewPbPbpass4_17092024/recenter", "Sparse or THn Path for cent recentere6"}; + Configurable ConfRecenterevxSp6{"ConfRecenterevxSp6", "Users/p/prottay/My/Object/Testingwithsparse/NewPbPbpass4_17092024/recenter", "Sparse or THn Path for vx recentere6"}; + Configurable ConfRecenterevySp6{"ConfRecenterevySp6", "Users/p/prottay/My/Object/Testingwithsparse/NewPbPbpass4_17092024/recenter", "Sparse or THn Path for vy recentere6"}; + Configurable ConfRecenterevzSp6{"ConfRecenterevzSp6", "Users/p/prottay/My/Object/Testingwithsparse/NewPbPbpass4_17092024/recenter", "Sparse or THn Path for vz recentere6"}; Configurable ConfShiftC{"ConfShiftC", "Users/p/prottay/My/Object/Testinglocaltree/shiftcallib2", "Path to shift C"}; Configurable ConfShiftA{"ConfShiftA", "Users/p/prottay/My/Object/Testinglocaltree/shiftcallib2", "Path to shift A"}; @@ -204,16 +213,16 @@ struct spvector { rctChecker.init(rctCut.cfgEvtRCTFlagCheckerLabel, rctCut.cfgEvtRCTFlagCheckerZDCCheck, rctCut.cfgEvtRCTFlagCheckerLimitAcceptAsBad); AxisSpec channelZDCAxis = {8, 0.0, 8.0, "ZDC tower"}; - AxisSpec qxZDCAxis = {QxyNbins, lbinQxy, hbinQxy, "Qx"}; - AxisSpec phiAxis = {PhiNbins, -6.28, 6.28, "phi"}; - AxisSpec vzAxis = {VzNbins, lbinVz, hbinVz, "vz"}; - AxisSpec vxAxis = {VxNbins, lbinVx, hbinVx, "vx"}; - AxisSpec vyAxis = {VyNbins, lbinVy, hbinVy, "vy"}; - AxisSpec centAxis = {CentNbins, lbinCent, hbinCent, "V0M (%)"}; - AxisSpec vzfineAxis = {VzfineNbins, lfinebinVz, hfinebinVz, "vzfine"}; - AxisSpec vxfineAxis = {VxfineNbins, lfinebinVx, hfinebinVx, "vxfine"}; - AxisSpec vyfineAxis = {VyfineNbins, lfinebinVy, hfinebinVy, "vyfine"}; - AxisSpec centfineAxis = {CentfineNbins, lfinebinCent, hfinebinCent, "V0M (%) fine"}; + AxisSpec qxZDCAxis = {configbins.QxyNbins, configbins.lbinQxy, configbins.hbinQxy, "Qx"}; + AxisSpec phiAxis = {configbins.PhiNbins, -6.28, 6.28, "phi"}; + AxisSpec vzAxis = {configbins.VzNbins, configbins.lbinVz, configbins.hbinVz, "vz"}; + AxisSpec vxAxis = {configbins.VxNbins, configbins.lbinVx, configbins.hbinVx, "vx"}; + AxisSpec vyAxis = {configbins.VyNbins, configbins.lbinVy, configbins.hbinVy, "vy"}; + AxisSpec centAxis = {configbins.CentNbins, configbins.lbinCent, configbins.hbinCent, "V0M (%)"}; + AxisSpec vzfineAxis = {configbins.VzfineNbins, configbins.lfinebinVz, configbins.hfinebinVz, "vzfine"}; + AxisSpec vxfineAxis = {configbins.VxfineNbins, configbins.lfinebinVx, configbins.hfinebinVx, "vxfine"}; + AxisSpec vyfineAxis = {configbins.VyfineNbins, configbins.lfinebinVy, configbins.hfinebinVy, "vyfine"}; + AxisSpec centfineAxis = {configbins.CentfineNbins, configbins.lfinebinCent, configbins.hfinebinCent, "V0M (%) fine"}; AxisSpec shiftAxis = {10, 0, 10, "shift"}; AxisSpec basisAxis = {2, 0, 2, "basis"}; AxisSpec VxyAxis = {2, 0, 2, "Vxy"}; @@ -292,10 +301,10 @@ struct spvector { TH2F* hrecenterevySp; TH2F* hrecenterevzSp;*/ std::array hrecentereSpA; // Array of 6 histograms - std::array hrecenterecentSpA; // Array of 5 histograms - std::array hrecenterevxSpA; // Array of 5 histograms - std::array hrecenterevySpA; // Array of 5 histograms - std::array hrecenterevzSpA; // Array of 5 histograms + std::array hrecenterecentSpA; // Array of 5 histograms + std::array hrecenterevxSpA; // Array of 5 histograms + std::array hrecenterevySpA; // Array of 5 histograms + std::array hrecenterevzSpA; // Array of 5 histograms TProfile3D* shiftprofileA; TProfile3D* shiftprofileC; @@ -459,8 +468,13 @@ struct spvector { return; } - // if (collision.sel8() && centrality > cfgCutCentralityMin && centrality < cfgCutCentralityMax && TMath::Abs(vz) < cfgCutVertex && collision.has_foundFT0() && eventSelected(collision, centrality) && collision.selection_bit(aod::evsel::kNoTimeFrameBorder) && collision.selection_bit(aod::evsel::kNoITSROFrameBorder)) { - if (collision.sel8() && centrality > cfgCutCentralityMin && centrality < cfgCutCentralityMax && TMath::Abs(vz) < cfgCutVertex && collision.has_foundFT0() && collision.selection_bit(aod::evsel::kNoTimeFrameBorder) && collision.selection_bit(aod::evsel::kNoITSROFrameBorder) && collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { + if (additionalEvSel && (!collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { + triggerevent = false; + spcalibrationtable(triggerevent, currentRunNumber, centrality, vx, vy, vz, znaEnergycommon, zncEnergycommon, znaEnergy[0], znaEnergy[1], znaEnergy[2], znaEnergy[3], zncEnergy[0], zncEnergy[1], zncEnergy[2], zncEnergy[3], qxZDCA, qxZDCC, qyZDCA, qyZDCC, psiZDCC, psiZDCA); + return; + } + + if (collision.sel8() && centrality > cfgCutCentralityMin && centrality < cfgCutCentralityMax && TMath::Abs(vz) < cfgCutVertex && collision.has_foundFT0() && collision.selection_bit(aod::evsel::kNoTimeFrameBorder) && collision.selection_bit(aod::evsel::kNoITSROFrameBorder)) { triggerevent = true; if (useGainCallib && (currentRunNumber != lastRunNumber)) { gainprofile = ccdb->getForTimeStamp(ConfGainPath.value, bc.timestamp()); @@ -645,6 +659,16 @@ struct spvector { res = Correctcoarse(hrecentereSpA[5], centrality, vx, vy, vz, qxZDCA, qyZDCA, qxZDCC, qyZDCC); } + if (fine6) { + if (useRecenterefineSp && (currentRunNumber != lastRunNumber)) { + hrecenterecentSpA[5] = ccdb->getForTimeStamp(ConfRecenterecentSp6.value, bc.timestamp()); + hrecenterevxSpA[5] = ccdb->getForTimeStamp(ConfRecenterevxSp6.value, bc.timestamp()); + hrecenterevySpA[5] = ccdb->getForTimeStamp(ConfRecenterevySp6.value, bc.timestamp()); + hrecenterevzSpA[5] = ccdb->getForTimeStamp(ConfRecenterevzSp6.value, bc.timestamp()); + } + resfine = Correctfine(hrecenterecentSpA[5], hrecenterevxSpA[5], hrecenterevySpA[5], hrecenterevzSpA[5], centrality, vx, vy, vz, qxZDCA, qyZDCA, qxZDCC, qyZDCC); + } + if (res == 0 && resfine == 0 && check == 0) { LOG(info) << "Histograms are null"; } From decbfd6481f3ceb5ca7dd0a553fed35974d53571 Mon Sep 17 00:00:00 2001 From: Jesper Gumprecht <113693781+jesgum@users.noreply.github.com> Date: Fri, 23 May 2025 17:58:20 +0200 Subject: [PATCH 1392/1650] [ALICE3] Save additional daughter information in otf multi-charm task (#11335) --- ALICE3/TableProducer/alice3-multicharm.cxx | 25 +++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/ALICE3/TableProducer/alice3-multicharm.cxx b/ALICE3/TableProducer/alice3-multicharm.cxx index e0e83458d0e..74948cfdf11 100644 --- a/ALICE3/TableProducer/alice3-multicharm.cxx +++ b/ALICE3/TableProducer/alice3-multicharm.cxx @@ -131,6 +131,8 @@ struct alice3multicharm { ConfigurableAxis axisDecayLength{"axisDecayLength", {2000, 0, 2000}, "Decay lenght (#mum)"}; ConfigurableAxis axisTOFTrack{"axisTOFTrack", {1000, 0, 5000}, "TOF track time"}; + ConfigurableAxis axisPiMass{"axisPiMass", {200, 0.089f, 0.189f}, "Pi Inv Mass (GeV/c^{2})"}; + ConfigurableAxis axisPrMass{"axisPrMass", {200, 0.838f, 1.038f}, "Pr Inv Mass (GeV/c^{2})"}; ConfigurableAxis axisXiMass{"axisXiMass", {200, 1.221f, 1.421f}, "Xi Inv Mass (GeV/c^{2})"}; ConfigurableAxis axisXiCMass{"axisXiCMass", {200, 2.368f, 2.568f}, "XiC Inv Mass (GeV/c^{2})"}; ConfigurableAxis axisXiCCMass{"axisXiCCMass", {200, 3.521f, 3.721f}, "XiCC Inv Mass (GeV/c^{2})"}; @@ -412,7 +414,15 @@ struct alice3multicharm { histos.add("hEtaXiCC", "hEtaXiCC", kTH1D, {axisEta}); histos.add("hPtXiCC", "hPtXiCC", kTH1D, {axisPt}); - histos.add("h3dMassXiCC", "h3dMassXiCC", kTH3D, {axisPt, axisEta, axisXiCCMass}); + histos.add("h3dXicc", "h3dXicc", kTH3D, {axisPt, axisEta, axisXiCCMass}); + histos.add("h3dXic", "h3dXic", kTH3D, {axisPt, axisEta, axisXiCMass}); + histos.add("h3dXi", "h3dXi", kTH3D, {axisPt, axisEta, axisXiMass}); + histos.add("h3dPicc", "h3dPicc", kTH3D, {axisPt, axisEta, axisPiMass}); + histos.add("h3dPi1c", "h3dPi1c", kTH3D, {axisPt, axisEta, axisPiMass}); + histos.add("h3dPi2c", "h3dPi2c", kTH3D, {axisPt, axisEta, axisPiMass}); + histos.add("h3dBach", "h3dBach", kTH3D, {axisPt, axisEta, axisPiMass}); + histos.add("h3dPos", "h3dPos", kTH3D, {axisPt, axisEta, axisPrMass}); + histos.add("h3dNeg", "h3dNeg", kTH3D, {axisPt, axisEta, axisPiMass}); histos.add("hDCAXiCDaughters", "hDCAXiCDaughters", kTH1D, {axisDCAXiCDaughters}); histos.add("hDCAXiCCDaughters", "hDCAXiCCDaughters", kTH1D, {axisDCAXiCCDaughters}); @@ -516,6 +526,11 @@ struct alice3multicharm { auto piFromLa = xiCand.negTrack_as(); // de-reference neg track auto prFromLa = xiCand.posTrack_as(); // de-reference pos track + histos.fill(HIST("h3dXi"), xi.pt(), xi.eta(), xiCand.mXi()); + histos.fill(HIST("h3dBach"), piFromXi.pt(), piFromXi.eta(), o2::constants::physics::MassPionCharged); + histos.fill(HIST("h3dNeg"), piFromLa.pt(), piFromLa.eta(), o2::constants::physics::MassPionCharged); + histos.fill(HIST("h3dPos"), prFromLa.pt(), prFromLa.eta(), o2::constants::physics::MassProton); + if (!bitcheck(xi.decayMap(), kTrueXiFromXiC)) continue; @@ -543,6 +558,7 @@ struct alice3multicharm { if (pi1cTOFDiffInner > piFromXiC_tofDiffInner) continue; // did not arrive at expected time + histos.fill(HIST("h3dPi1c"), pi1c.pt(), pi1c.eta(), o2::constants::physics::MassPionCharged); histos.fill(HIST("hInnerTOFTrackTimeRecoPi1c"), pi1cTOFDiffInner); // second pion from XiC decay for starts here for (auto const& pi2c : tracksPiFromXiCgrouped) { @@ -564,6 +580,8 @@ struct alice3multicharm { continue; // did not arrive at expected time histos.fill(HIST("hInnerTOFTrackTimeRecoPi2c"), pi2cTOFDiffInner); + histos.fill(HIST("h3dPi2c"), pi2c.pt(), pi2c.eta(), o2::constants::physics::MassPionCharged); + // if I am here, it means this is a triplet to be considered for XiC vertexing. // will now attempt to build a three-body decay candidate with these three track rows. @@ -613,7 +631,7 @@ struct alice3multicharm { histos.fill(HIST("hDCAxyXiC"), std::fabs(xicdcaXY * 1e+4)); histos.fill(HIST("hDCAzXiC"), std::fabs(xicdcaZ * 1e+4)); histos.fill(HIST("hMassXiC"), thisXiCcandidate.mass); - + histos.fill(HIST("h3dXic"), thisXiCcandidate.pt, thisXiCcandidate.eta, thisXiCcandidate.mass); // attempt XiCC finding uint32_t nCombinationsCC = 0; for (auto const& picc : tracksPiFromXiCCgrouped) { @@ -633,6 +651,7 @@ struct alice3multicharm { continue; // did not arrive at expected time histos.fill(HIST("hInnerTOFTrackTimeRecoPicc"), piccTOFDiffInner); + histos.fill(HIST("h3dPicc"), picc.pt(), picc.eta(), o2::constants::physics::MassPionCharged); o2::track::TrackParCov piccTrack = getTrackParCov(picc); nCombinationsCC++; @@ -710,7 +729,7 @@ struct alice3multicharm { histos.fill(HIST("hMassXiCC"), thisXiCCcandidate.mass); histos.fill(HIST("hPtXiCC"), thisXiCCcandidate.pt); histos.fill(HIST("hEtaXiCC"), thisXiCCcandidate.eta); - histos.fill(HIST("h3dMassXiCC"), thisXiCCcandidate.pt, thisXiCCcandidate.eta, thisXiCCcandidate.mass); + histos.fill(HIST("h3dXicc"), thisXiCCcandidate.pt, thisXiCCcandidate.eta, thisXiCCcandidate.mass); // produce multi-charm table for posterior analysis if (fillDerivedTable) { From c360675074954549c92048424e506c0cbfd626f9 Mon Sep 17 00:00:00 2001 From: Stefano Cannito <143754257+scannito@users.noreply.github.com> Date: Fri, 23 May 2025 18:24:26 +0200 Subject: [PATCH 1393/1650] [PWGLF] Fixed issue with filter in MCReco in dN/deta with phi (#11332) --- .../Tasks/Strangeness/phik0shortanalysis.cxx | 40 +++++++++---------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx index 9dd9ea186c3..cbc97acf8b8 100644 --- a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx @@ -2296,35 +2296,31 @@ struct Phik0shortanalysis { PROCESS_SWITCH(Phik0shortanalysis, processdNdetaWPhiData, "Process function for dN/deta values in Data", false); - void processdNdetaWPhiMCReco(SimCollisions const& collisions, FilteredMCTracks const& filteredMCTracks, MCCollisions const&, aod::McParticles const& mcParticles) + void processdNdetaWPhiMCReco(SimCollisions::iterator const& collision, FilteredMCTracks const& filteredMCTracks, MCCollisions const&, aod::McParticles const& mcParticles) { - for (const auto& collision : collisions) { - if (!acceptEventQA(collision, true)) - continue; - if (!collision.has_mcCollision()) - continue; - const auto& mcCollision = collision.mcCollision_as(); - - auto mcParticlesThisColl = mcParticles.sliceByCached(aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); + if (!acceptEventQA(collision, true)) + return; + if (!collision.has_mcCollision()) + return; + const auto& mcCollision = collision.mcCollision_as(); - if (!eventHasMCPhi(mcParticlesThisColl)) - continue; + auto mcParticlesThisColl = mcParticles.sliceByCached(aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), cache); - float genmultiplicity = mcCollision.centFT0M(); - mcEventHist.fill(HIST("hRecMCGenMultiplicityPercent"), genmultiplicity); + if (!eventHasMCPhi(mcParticlesThisColl)) + return; - auto mcTracksThisColl = filteredMCTracks.sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); + float genmultiplicity = mcCollision.centFT0M(); + mcEventHist.fill(HIST("hRecMCGenMultiplicityPercent"), genmultiplicity); - for (const auto& track : mcTracksThisColl) { - if (!track.has_mcParticle()) - continue; + for (const auto& track : filteredMCTracks) { + if (!track.has_mcParticle()) + continue; - auto mcTrack = track.mcParticle_as(); - if (!mcTrack.isPhysicalPrimary() || std::abs(mcTrack.eta()) > trackConfigs.etaMax) - continue; + auto mcTrack = track.mcParticle_as(); + if (!mcTrack.isPhysicalPrimary() || std::abs(mcTrack.eta()) > trackConfigs.etaMax) + continue; - mcEventHist.fill(HIST("h2RecMCEtaDistribution"), genmultiplicity, mcTrack.eta()); - } + mcEventHist.fill(HIST("h2RecMCEtaDistribution"), genmultiplicity, mcTrack.eta()); } } From ad59bdfeec46ec78a98659f6f690977585bb709e Mon Sep 17 00:00:00 2001 From: Preet-Bhanjan Date: Fri, 23 May 2025 18:52:19 +0200 Subject: [PATCH 1394/1650] [PWGCF] Fixed a bug in cfgCorrConfig (#11336) Co-authored-by: Preet Pati --- PWGCF/Flow/Tasks/flowPbpbPikp.cxx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/PWGCF/Flow/Tasks/flowPbpbPikp.cxx b/PWGCF/Flow/Tasks/flowPbpbPikp.cxx index 37b6cb674a1..dfcf5fb42fc 100644 --- a/PWGCF/Flow/Tasks/flowPbpbPikp.cxx +++ b/PWGCF/Flow/Tasks/flowPbpbPikp.cxx @@ -112,7 +112,7 @@ struct FlowPbpbPikp { Configurable> cfgUseEventCuts{"cfgUseEventCuts", std::vector{1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0}, "Switch for various event cuts [kNoTimeFrameBorder, kNoITSROFrameBorder, kNoSameBunchPileup, kIsGoodZvtxFT0vsPV, kNoCollInTimeRangeStandard, kIsGoodITSLayersAll, kNoCollInRofStandard, kNoHighMultCollInPrevRof, Occupancy, Multiplicity correlation, T0AV0A 3 sigma cut, kIsVertexITSTPC, kTVXinTRD]"}; Configurable cfgRegions{"cfgRegions", {{"refN08", "refP08", "full", "poiN", "olN", "poiP", "olP", "poi", "ol", "poiNpi", "olNpi", "poiPpi", "olPpi", "poifullpi", "olfullpi", "poiNka", "olNka", "poiPka", "olPka", "poifullka", "olfullka", "poiNpr", "olNpr", "poiPpr", "olPpr", "poifullpr", "olfullpr"}, {-0.8, 0.4, -0.8, -0.8, -0.8, 0.4, 0.4, -0.8, -0.8, -0.8, -0.8, 0.4, 0.4, -0.8, -0.8, -0.8, -0.8, 0.4, 0.4, -0.8, -0.8, -0.8, -0.8, 0.4, 0.4, -0.8, -0.8}, {-0.4, 0.8, 0.8, -0.4, -0.4, 0.8, 0.8, 0.8, 0.8, -0.4, -0.4, 0.8, 0.8, 0.8, 0.8, -0.4, -0.4, 0.8, 0.8, 0.8, 0.8, -0.4, -0.4, 0.8, 0.8, 0.8, 0.8}, {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 128, 256, 128, 256, 128, 256, 2, 16, 2, 16, 2, 16, 4, 32, 4, 32, 4, 32, 8, 64, 8, 64, 8, 64}}, "Configurations for GFW regions"}; - Configurable cfgCorrConfig{"cfgCorrConfig", {{"full {2 -2}", "full {2 -2}", "full {2 -2}", "full {2 -2}", "refN08 {2} refP08 {-2}", "refN08 {2} refP08 {-2}", "refN08 {2} refP08 {-2}", "refN08 {2} refP08 {-2}", "refP08 {-2} refN08 {2}", "refP08 {-2} refN08 {2}", "refP08 {-2} refN08 {2}", "refP08 {-2} refN08 {2}", "full {2 2 -2 -2}", "full {2 2 -2 -2}", "full {2 2 -2 -2}", "full {2 2 -2 -2}", "poi full | ol {2 -2}", "poifullpi full | olfullpi {2 -2}", "poifullka full | olfullka {2 -2}", "poifullpr full | olfullpr {2 -2}", "poiN refN08 | olN {2} refP08 {-2}", "poiNpi refN08 | olNpi {2} refP08 {-2}", "poiNka refN08 | olNka {2} refP08 {-2}", "poiNpr refN08 | olNpr {2} refP08 {-2}", "poiP refP08 | olP {2} refN08 {-2}", "poiPpi refP08 | olPpi {2} refN08 {-2}", "poiPka refP08 | olPka {2} refN08 {-2}", "poiPpr refP08 | olPpr {2} refN08 {-2}", "poi full | ol {2 2 -2 -2}", "poifullpi full | olfullpi {2 2 -2 -2}", "poifullka full | olfullka {2 2 -2 -2}", "poifullpr full | olfullpr {2 2 -2 -2}", "refN08 {2 2} refP08 {-2 -2}", "refP08 {-2 -2} refN08 {2 2}", "poiNka refN08 | olNka {2 2} refP08 {-2 -2}", "poiPka refP08 | olPka {2 2} refN08 {-2 -2}"}, {"ChFull22", "PiFull22", "KaFull22", "PrFull22", "Ch08FGap22", "Pi08FGap22", "Ka08FGap22", "Pr08FGap22", "Ch08BGap22", "Pi08BGap22", "Ka08BGap22", "Pr08BGap22", "ChFull24", "PiFull24", "KaFull24", "PrFull24", "ChFull22", "PiFull22", "KaFull22", "PrFull22", "Ch08FGap22", "Pi08FGap22", "Ka08FGap22", "Pr08FGap22", "Ch08BGap22", "Pi08BGap22", "Ka08BGap22", "Pr08BGap22", "ChFull24", "PiFull24", "KaFull24", "PrFull24", "Ka08FGap24", "Ka08BGap24", "Ka08FGap24", "Ka08BGap24"}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1}}, "Configurations for each correlation to calculate"}; + Configurable cfgCorrConfig{"cfgCorrConfig", {{"full {2 -2}", "full {2 -2}", "full {2 -2}", "full {2 -2}", "refN08 {2} refP08 {-2}", "refN08 {2} refP08 {-2}", "refN08 {2} refP08 {-2}", "refN08 {2} refP08 {-2}", "refP08 {-2} refN08 {2}", "refP08 {-2} refN08 {2}", "refP08 {-2} refN08 {2}", "refP08 {-2} refN08 {2}", "full {2 2 -2 -2}", "full {2 2 -2 -2}", "full {2 2 -2 -2}", "full {2 2 -2 -2}", "poi full | ol {2 -2}", "poifullpi full | olfullpi {2 -2}", "poifullka full | olfullka {2 -2}", "poifullpr full | olfullpr {2 -2}", "poiN refN08 | olN {2} refP08 {-2}", "poiNpi refN08 | olNpi {2} refP08 {-2}", "poiNka refN08 | olNka {2} refP08 {-2}", "poiNpr refN08 | olNpr {2} refP08 {-2}", "poiP refP08 | olP {2} refN08 {-2}", "poiPpi refP08 | olPpi {2} refN08 {-2}", "poiPka refP08 | olPka {2} refN08 {-2}", "poiPpr refP08 | olPpr {2} refN08 {-2}", "poi full | ol {2 2 -2 -2}", "poifullpi full | olfullpi {2 2 -2 -2}", "poifullka full | olfullka {2 2 -2 -2}", "poifullpr full | olfullpr {2 2 -2 -2}", "refN08 {2 2} refP08 {-2 -2}", "refP08 {-2 -2} refN08 {2 2}", "poiNka refN08 | olNka {2 2} refP08 {-2 -2}", "poiPka refP08 | olPka {2 2} refN08 {-2 -2}"}, {"ChFull22", "PiFull22", "KaFull22", "PrFull22", "Ch08FGap22", "Pi08FGap22", "Ka08FGap22", "Pr08FGap22", "Ch08BGap22", "Pi08BGap22", "Ka08BGap22", "Pr08BGap22", "ChFull24", "PiFull24", "KaFull24", "PrFull24", "ChFull22", "PiFull22", "KaFull22", "PrFull22", "Ch08FGap22", "Pi08FGap22", "Ka08FGap22", "Pr08FGap22", "Ch08BGap22", "Pi08BGap22", "Ka08BGap22", "Pr08BGap22", "ChFull24", "PiFull24", "KaFull24", "PrFull24", "Ka08FGap24", "Ka08BGap24", "Ka08FGap24", "Ka08BGap24"}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, "Configurations for each correlation to calculate"}; ConfigurableAxis axisVertex{"axisVertex", {20, -10, 10}, "vertex axis for histograms"}; ConfigurableAxis axisPhi{"axisPhi", {60, 0.0, constants::math::TwoPI}, "phi axis for histograms"}; @@ -202,6 +202,7 @@ struct FlowPbpbPikp { eventCuts.push_back(static_cast(fintEvCuts[i])); } + LOGF(info, "flowGenericFramework::init()"); regions.SetNames(cfgRegions->GetNames()); regions.SetEtaMin(cfgRegions->GetEtaMin()); regions.SetEtaMax(cfgRegions->GetEtaMax()); @@ -210,6 +211,7 @@ struct FlowPbpbPikp { configs.SetCorrs(cfgCorrConfig->GetCorrs()); configs.SetHeads(cfgCorrConfig->GetHeads()); configs.SetpTDifs(cfgCorrConfig->GetpTDifs()); + configs.SetpTCorrMasks(cfgCorrConfig->GetpTCorrMasks()); regions.Print(); configs.Print(); From 24e3e3632650b06f0abbc0ce332ba394080d3df6 Mon Sep 17 00:00:00 2001 From: altsybee Date: Fri, 23 May 2025 20:39:59 +0200 Subject: [PATCH 1395/1650] [DPG] add tpcNCls vs_centr vs_occup histograms (#11339) --- DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx | 26 ++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx b/DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx index e3160ab87ac..c6dbbe1a17a 100644 --- a/DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx +++ b/DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx @@ -181,6 +181,15 @@ struct DetectorOccupancyQaTask { histos.add("dEdx_vs_centr_vs_occup_narrow_p_win_pos_FractionPIDclsInRange", "dE/dx", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, axisOccupancyForDeDxStudies, axisDeDx}); histos.add("dEdx_vs_centr_vs_occup_narrow_p_win_neg_FractionPIDclsInRange", "dE/dx", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, axisOccupancyForDeDxStudies, axisDeDx}); + AxisSpec axisNTPCcls{160, 0, 160, "n TPC clusters"}; + histos.add("tpcNClsFound_vs_centr_vs_occup", "", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, axisOccupancyForDeDxStudies, axisNTPCcls}); + histos.add("tpcNClsFindable_vs_centr_vs_occup", "", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, axisOccupancyForDeDxStudies, axisNTPCcls}); + histos.add("tpcNClsShared_vs_centr_vs_occup", "", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, axisOccupancyForDeDxStudies, axisNTPCcls}); + histos.add("tpcNClsShared_vs_centr_vs_occup_Aside", "", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, axisOccupancyForDeDxStudies, axisNTPCcls}); + histos.add("tpcNClsShared_vs_centr_vs_occup_Cside", "", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, axisOccupancyForDeDxStudies, axisNTPCcls}); + histos.add("tpcNClsShared_vs_centr_vs_occup_pos", "", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, axisOccupancyForDeDxStudies, axisNTPCcls}); + histos.add("tpcNClsShared_vs_centr_vs_occup_neg", "", kTH3F, {{20, 0, 4000, "nITStrk cls567"}, axisOccupancyForDeDxStudies, axisNTPCcls}); + AxisSpec axisFractionNclsFindableMinusPID{110, -1.1, 1.1, "TPC nClsFindableMinusPID / nClsFindable"}; histos.add("fraction_tpcNClsFindableMinusPID_vs_occup", "", kTH2D, {axisOccupancyForDeDxStudies, axisFractionNclsFindableMinusPID}); histos.add("fraction_tpcNClsFindableMinusPID_vs_occup_peripheralByV0A", "", kTH2D, {axisOccupancyForDeDxStudies, axisFractionNclsFindableMinusPID}); @@ -1003,6 +1012,23 @@ struct DetectorOccupancyQaTask { if (fractionTPCcls >= 0 && fractionTPCcls < 0.8) histos.fill(HIST("dEdx_vs_centr_vs_occup_narrow_p_win_neg_FractionPIDclsInRange"), nPV, occupancy, track.tpcSignal()); } + + // nTPCcls vs nITStr vs occup + histos.fill(HIST("tpcNClsFound_vs_centr_vs_occup"), nPV, occupancy, track.tpcNClsFound()); + histos.fill(HIST("tpcNClsFindable_vs_centr_vs_occup"), nPV, occupancy, track.tpcNClsFindable()); + histos.fill(HIST("tpcNClsShared_vs_centr_vs_occup"), nPV, occupancy, track.tpcNClsShared()); + + // nTPCsharedCls for A and C separately + if (track.tgl() > 0.) // A side + histos.fill(HIST("tpcNClsShared_vs_centr_vs_occup_Aside"), nPV, occupancy, track.tpcNClsShared()); + else // C side + histos.fill(HIST("tpcNClsShared_vs_centr_vs_occup_Cside"), nPV, occupancy, track.tpcNClsShared()); + + // nTPCsharedCls for pos and neg + if (signedP > 0) + histos.fill(HIST("tpcNClsShared_vs_centr_vs_occup_pos"), nPV, occupancy, track.tpcNClsShared()); + else + histos.fill(HIST("tpcNClsShared_vs_centr_vs_occup_neg"), nPV, occupancy, track.tpcNClsShared()); } } } From 319cc9c3765af5d17e306fc568c6b20c8bbc02c1 Mon Sep 17 00:00:00 2001 From: Fabio Colamaria Date: Fri, 23 May 2025 21:22:52 +0200 Subject: [PATCH 1396/1650] [ALICE3] First development of DDbar correlations for usage with OTF sims (#11312) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: fcolamar Co-authored-by: Nicolò Jacazio --- ALICE3/DataModel/A3DecayFinderTables.h | 59 +++ ALICE3/TableProducer/CMakeLists.txt | 5 + .../TableProducer/alice3-correlatorDDbar.cxx | 315 +++++++++++++ ALICE3/TableProducer/alice3-decayfinder.cxx | 77 +++- ALICE3/Tasks/CMakeLists.txt | 5 + ALICE3/Tasks/alice3-taskcorrelationDDbar.cxx | 433 ++++++++++++++++++ 6 files changed, 886 insertions(+), 8 deletions(-) create mode 100644 ALICE3/TableProducer/alice3-correlatorDDbar.cxx create mode 100644 ALICE3/Tasks/alice3-taskcorrelationDDbar.cxx diff --git a/ALICE3/DataModel/A3DecayFinderTables.h b/ALICE3/DataModel/A3DecayFinderTables.h index 05eb5ad9307..55229bbb5d4 100644 --- a/ALICE3/DataModel/A3DecayFinderTables.h +++ b/ALICE3/DataModel/A3DecayFinderTables.h @@ -20,6 +20,7 @@ // O2 includes #include "Framework/AnalysisDataModel.h" +#include "Common/Core/RecoDecay.h" enum a3selectionBit : uint32_t { kDCAxy = 0, kInnerTOFPion, @@ -59,6 +60,64 @@ DECLARE_SOA_TABLE(Alice3DecayMaps, "AOD", "ALICE3DECAYMAPS", using Alice3DecayMap = Alice3DecayMaps::iterator; +namespace a3D0meson +{ +DECLARE_SOA_INDEX_COLUMN(Collision, collision); //! +DECLARE_SOA_COLUMN(PxProng0, pxProng0, float); //! positive track +DECLARE_SOA_COLUMN(PyProng0, pyProng0, float); //! +DECLARE_SOA_COLUMN(PzProng0, pzProng0, float); //! +DECLARE_SOA_COLUMN(PxProng1, pxProng1, float); //! negative track +DECLARE_SOA_COLUMN(PyProng1, pyProng1, float); //! +DECLARE_SOA_COLUMN(PzProng1, pzProng1, float); //! +DECLARE_SOA_DYNAMIC_COLUMN(PtProng0, ptProng0, //! + [](float px, float py) -> float { return RecoDecay::pt(px, py); }); +DECLARE_SOA_DYNAMIC_COLUMN(PtProng1, ptProng1, //! + [](float px, float py) -> float { return RecoDecay::pt(px, py); }); +DECLARE_SOA_EXPRESSION_COLUMN(Px, px, //! + float, 1.f * aod::a3D0meson::pxProng0 + 1.f * aod::a3D0meson::pxProng1); +DECLARE_SOA_EXPRESSION_COLUMN(Py, py, //! + float, 1.f * aod::a3D0meson::pyProng0 + 1.f * aod::a3D0meson::pyProng1); +DECLARE_SOA_EXPRESSION_COLUMN(Pz, pz, //! + float, 1.f * aod::a3D0meson::pzProng0 + 1.f * aod::a3D0meson::pzProng1); +DECLARE_SOA_COLUMN(Pt, pt, float); //! +DECLARE_SOA_COLUMN(M, m, float); //! +DECLARE_SOA_DYNAMIC_COLUMN(E, e, //! + [](float px, float py, float pz, double m) -> float { return RecoDecay::e(px, py, pz, m); }); +DECLARE_SOA_COLUMN(Eta, eta, float); //! +DECLARE_SOA_COLUMN(Phi, phi, float); //! +DECLARE_SOA_COLUMN(Y, y, float); +} // namespace a3D0meson +DECLARE_SOA_TABLE(Alice3D0Meson, "AOD", "ALICE3D0MESON", //! + o2::soa::Index<>, + a3D0meson::CollisionId, + a3D0meson::PxProng0, a3D0meson::PyProng0, a3D0meson::PzProng0, // positive track + a3D0meson::PxProng1, a3D0meson::PyProng1, a3D0meson::PzProng1, // negative track + a3D0meson::PtProng0, + a3D0meson::PtProng1, + a3D0meson::Px, a3D0meson::Py, a3D0meson::Pz, + a3D0meson::Pt, + a3D0meson::M, + a3D0meson::E, + a3D0meson::Eta, + a3D0meson::Phi, + a3D0meson::Y); + +namespace a3D0Selection +{ +DECLARE_SOA_COLUMN(IsSelD0, isSelD0, int); //! +DECLARE_SOA_COLUMN(IsSelD0bar, isSelD0bar, int); //! +} // namespace a3D0Selection +DECLARE_SOA_TABLE(Alice3D0Sel, "AOD", "ALICE3D0SEL", //! + a3D0Selection::IsSelD0, + a3D0Selection::IsSelD0bar); + +namespace a3D0MCTruth +{ +DECLARE_SOA_COLUMN(McTruthInfo, mcTruthInfo, int); //! 0 for bkg, 1 for true D0, 2 for true D0bar +} // namespace a3D0MCTruth +DECLARE_SOA_TABLE(Alice3D0MCTruth, "AOD", "ALICE3D0MCTRUTH", //! + a3D0MCTruth::McTruthInfo); //! + } // namespace o2::aod #endif // ALICE3_DATAMODEL_A3DECAYFINDERTABLES_H_ diff --git a/ALICE3/TableProducer/CMakeLists.txt b/ALICE3/TableProducer/CMakeLists.txt index 9c3d710d358..8548ecd9897 100644 --- a/ALICE3/TableProducer/CMakeLists.txt +++ b/ALICE3/TableProducer/CMakeLists.txt @@ -45,3 +45,8 @@ o2physics_add_dpl_workflow(alice3-multicharm SOURCES alice3-multicharm.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DCAFitter COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(alice3-correlatorddbar + SOURCES alice3-correlatorDDbar.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DCAFitter + COMPONENT_NAME Analysis) diff --git a/ALICE3/TableProducer/alice3-correlatorDDbar.cxx b/ALICE3/TableProducer/alice3-correlatorDDbar.cxx new file mode 100644 index 00000000000..ad224442717 --- /dev/null +++ b/ALICE3/TableProducer/alice3-correlatorDDbar.cxx @@ -0,0 +1,315 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file alice3-correlatorDDbar.cxx +/// \brief D0-D0bar correlator task - data-like and MC-reco analysis performance on ALICE 3 detector. +/// +/// \author Fabio Colamaria , INFN Bari + +#include + +#include "CommonConstants/PhysicsConstants.h" +#include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/runDataProcessing.h" + +#include "Common/Core/TrackSelection.h" +#include "Common/DataModel/TrackSelectionTables.h" + +#include "ALICE3/DataModel/A3DecayFinderTables.h" + +#include "PWGHF/Core/HfHelper.h" +#include "PWGHF/HFC/DataModel/CorrelationTables.h" +// #include "PWGHF/DataModel/CandidateReconstructionTables.h" +// #include "PWGHF/DataModel/CandidateSelectionTables.h" + +using namespace o2; +using namespace o2::analysis; +using namespace o2::constants::physics; +using namespace o2::framework; +using namespace o2::framework::expressions; + +/// +/// Returns deltaPhi value in range [-pi/2., 3.*pi/2], typically used for correlation studies +/// +double getDeltaPhi(double phiD, double phiDbar) +{ + return RecoDecay::constrainAngle(phiDbar - phiD, -o2::constants::math::PIHalf); +} + +/// definition of variables for D0D0bar pairs vs eta acceptance studies (hDDbarVsEtaCut, in data-like, MC-reco and MC-kine tasks) +const double maxEtaCut = 5.; +const double ptThresholdForMaxEtaCut = 10.; +const double incrementEtaCut = 0.1; +const double incrementPtThreshold = 0.5; +const double epsilon = 1E-5; + +const int npTBinsMassAndEfficiency = o2::analysis::hf_cuts_d0_to_pi_k::NBinsPt; +const double efficiencyDmesonDefault[npTBinsMassAndEfficiency] = {}; +auto efficiencyDmeson_v = std::vector{efficiencyDmesonDefault, efficiencyDmesonDefault + npTBinsMassAndEfficiency}; + +// histogram binning definition +const int massAxisBins = 120; +const double massAxisMin = 1.5848; +const double massAxisMax = 2.1848; +const int phiAxisBins = 32; +const double phiAxisMin = 0.; +const double phiAxisMax = o2::constants::math::TwoPI; +const int yAxisBins = 100; +const double yAxisMin = -5.; +const double yAxisMax = 5.; +const int ptDAxisBins = 180; +const double ptDAxisMin = 0.; +const double ptDAxisMax = 36.; + +struct alice3correlatorddbar { + SliceCache cache; + Preslice perCol = aod::a3D0meson::collisionId; + Produces entryD0D0barPair; + Produces entryD0D0barRecoInfo; + + Configurable selectionFlagD0{"selectionFlagD0", 1, "Selection Flag for D0"}; + Configurable selectionFlagD0bar{"selectionFlagD0bar", 1, "Selection Flag for D0bar"}; + Configurable applyEfficiency{"applyEfficiency", 1, "Flag for applying D-meson efficiency weights"}; + Configurable yCandMax{"yCandMax", 999., "max. cand. rapidity"}; + Configurable ptCandMin{"ptCandMin", -1., "min. cand. pT"}; + Configurable> binsPt{"binsPt", std::vector{o2::analysis::hf_cuts_d0_to_pi_k::vecBinsPt}, "pT bin limits for candidate mass plots and efficiency"}; + Configurable> efficiencyD{"efficiencyD", std::vector{efficiencyDmeson_v}, "Efficiency values for D0 meson"}; + + // HfHelper hfHelper; //not needed for now + + Partition> selectedCandidates = aod::a3D0meson::y > -yCandMax&& aod::a3D0meson::y ptCandMin && (aod::a3D0Selection::isSelD0 >= selectionFlagD0 || aod::a3D0Selection::isSelD0bar >= selectionFlagD0bar); + Partition> selectedCandidatesMC = aod::a3D0meson::y > -yCandMax&& aod::a3D0meson::y ptCandMin && (aod::a3D0Selection::isSelD0 >= selectionFlagD0 || aod::a3D0Selection::isSelD0bar >= selectionFlagD0bar); + + HistogramRegistry registry{ + "registry", + // NOTE: use hMassD0 for trigger normalisation (S*0.955), and hMass2DCorrelationPairs (in final task) for 2D-sideband-subtraction purposes + {{"hPtCand", "D0,D0bar candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{ptDAxisBins, ptDAxisMin, ptDAxisMax}}}}, + {"hPtProng0", "D0,D0bar candidates;prong 0 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{ptDAxisBins, ptDAxisMin, ptDAxisMax}}}}, + {"hPtProng1", "D0,D0bar candidates;prong 1 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{ptDAxisBins, ptDAxisMin, ptDAxisMax}}}}, + {"hSelectionStatus", "D0,D0bar candidates;selection status;entries", {HistType::kTH1F, {{4, -0.5, 3.5}}}}, + {"hEta", "D0,D0bar candidates;candidate #it{#eta};entries", {HistType::kTH1F, {{yAxisBins, yAxisMin, yAxisMax}}}}, + {"hPhi", "D0,D0bar candidates;candidate #it{#varphi};entries", {HistType::kTH1F, {{phiAxisBins, phiAxisMin, phiAxisMax}}}}, + {"hY", "D0,D0bar candidates;candidate #it{y};entries", {HistType::kTH1F, {{yAxisBins, yAxisMin, yAxisMax}}}}, + {"hDDbarVsEtaCut", "D0,D0bar pairs vs #eta cut;#eta_{max};candidates #it{p}_{T} threshold (GeV/#it{c});entries", {HistType::kTH2F, {{static_cast(maxEtaCut / incrementEtaCut), 0., maxEtaCut}, {static_cast(ptThresholdForMaxEtaCut / incrementPtThreshold), 0., ptThresholdForMaxEtaCut}}}}, + {"hPtCandMCRec", "D0,D0bar candidates - MC reco;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{ptDAxisBins, ptDAxisMin, ptDAxisMax}}}}, + {"hPtProng0MCRec", "D0,D0bar candidates - MC reco;prong 0 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{ptDAxisBins, ptDAxisMin, ptDAxisMax}}}}, + {"hPtProng1MCRec", "D0,D0bar candidates - MC reco;prong 1 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {{ptDAxisBins, ptDAxisMin, ptDAxisMax}}}}, + {"hSelectionStatusMCRec", "D0,D0bar candidates - MC reco;selection status;entries", {HistType::kTH1F, {{4, -0.5, 3.5}}}}, + {"hEtaMCRec", "D0,D0bar candidates - MC reco;candidate #it{#eta};entries", {HistType::kTH1F, {{yAxisBins, yAxisMin, yAxisMax}}}}, + {"hPhiMCRec", "D0,D0bar candidates - MC reco;candidate #it{#varphi};entries", {HistType::kTH1F, {{phiAxisBins, phiAxisMin, phiAxisMax}}}}, + {"hYMCRec", "D0,D0bar candidates - MC reco;candidate #it{y};entries", {HistType::kTH1F, {{yAxisBins, yAxisMin, yAxisMax}}}}}}; + + void init(InitContext&) + { + auto vbins = (std::vector)binsPt; + registry.add("hMass", "D0,D0bar candidates;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{massAxisBins, massAxisMin, massAxisMax}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("hMassD0", "D0,D0bar candidates;inv. mass D0 only (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{massAxisBins, massAxisMin, massAxisMax}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("hMassD0bar", "D0,D0bar candidates;inv. mass D0bar only (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{massAxisBins, massAxisMin, massAxisMax}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("hMassD0MCRecSig", "D0 signal candidates - MC reco;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{massAxisBins, massAxisMin, massAxisMax}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("hMassD0MCRecRefl", "D0 reflection candidates - MC reco;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{massAxisBins, massAxisMin, massAxisMax}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("hMassD0MCRecBkg", "D0 background candidates - MC reco;inv. mass (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{massAxisBins, massAxisMin, massAxisMax}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("hMassD0barMCRecSig", "D0bar signal candidates - MC reco;inv. mass D0bar only (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{massAxisBins, massAxisMin, massAxisMax}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("hMassD0barMCRecRefl", "D0bar reflection candidates - MC reco;inv. mass D0bar only (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{massAxisBins, massAxisMin, massAxisMax}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("hMassD0barMCRecBkg", "D0bar background candidates - MC reco;inv. mass D0bar only (#pi K) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{massAxisBins, massAxisMin, massAxisMax}, {vbins, "#it{p}_{T} (GeV/#it{c})"}}}); + } + + /// D0-D0bar correlation pair builder - for real data and data-like analysis (i.e. reco-level w/o matching request via MC truth) + void processData(aod::Collision const& collision, + soa::Join const&) + { + auto selectedCandidatesGrouped = selectedCandidates->sliceByCached(aod::a3D0meson::collisionId, collision.globalIndex(), cache); + + for (const auto& candidate1 : selectedCandidatesGrouped) { // loop over reconstructed and selected D0 and D0bar (together, to fill mass plots first) + double efficiencyWeight = 1.; + if (applyEfficiency) { + efficiencyWeight = 1. / efficiencyD->at(o2::analysis::findBin(binsPt, candidate1.pt())); + } + + // fill invariant mass plots and generic info from all D0/D0bar candidates + if (candidate1.isSelD0() >= selectionFlagD0) { + registry.fill(HIST("hMass"), candidate1.m(), candidate1.pt(), efficiencyWeight); + registry.fill(HIST("hMassD0"), candidate1.m(), candidate1.pt(), efficiencyWeight); + } + if (candidate1.isSelD0bar() >= selectionFlagD0bar) { + registry.fill(HIST("hMass"), candidate1.m(), candidate1.pt(), efficiencyWeight); + registry.fill(HIST("hMassD0bar"), candidate1.m(), candidate1.pt(), efficiencyWeight); + } + registry.fill(HIST("hPtCand"), candidate1.pt()); + registry.fill(HIST("hPtProng0"), candidate1.ptProng0()); + registry.fill(HIST("hPtProng1"), candidate1.ptProng1()); + registry.fill(HIST("hEta"), candidate1.eta()); + registry.fill(HIST("hPhi"), candidate1.phi()); + registry.fill(HIST("hY"), candidate1.y()); + registry.fill(HIST("hSelectionStatus"), candidate1.isSelD0() + (candidate1.isSelD0bar() * 2)); + + // D-Dbar correlation dedicated section + + // if the candidate is a D0, search for D0bar and evaluate correlations + if (candidate1.isSelD0() < selectionFlagD0) { + continue; + } + for (const auto& candidate2 : selectedCandidatesGrouped) { + if (candidate2.isSelD0bar() < selectionFlagD0bar) { // keep only D0bar candidates passing the selection + continue; + } + // excluding trigger self-correlations (possible in case of both mass hypotheses accepted) + if (candidate1.mRowIndex == candidate2.mRowIndex) { // this by definition should never happen, since each candidate is either D0 or D0bar + continue; + } + if ((candidate1.pt() - candidate2.pt()) < 1e-5 && (candidate1.eta() - candidate2.eta()) < 1e-5 && (candidate1.phi() - candidate2.phi()) < 1e-5) { // revised, temporary condition to avoid self-correlations (the best would be check the daughterIDs, but we don't store them at the moment) + continue; + } + entryD0D0barPair(getDeltaPhi(candidate2.phi(), candidate1.phi()), + candidate2.eta() - candidate1.eta(), + candidate1.pt(), + candidate2.pt()); + entryD0D0barRecoInfo(candidate1.m(), // mD0 + candidate2.m(), // mD0bar + 0); + double etaCut = 0.; + double ptCut = 0.; + do { // fill pairs vs etaCut plot + ptCut = 0.; + etaCut += incrementEtaCut; + do { // fill pairs vs etaCut plot + if (std::abs(candidate1.eta()) < etaCut && std::abs(candidate2.eta()) < etaCut && candidate1.pt() > ptCut && candidate2.pt() > ptCut) { + registry.fill(HIST("hDDbarVsEtaCut"), etaCut - epsilon, ptCut + epsilon); + } + ptCut += incrementPtThreshold; + } while (ptCut < ptThresholdForMaxEtaCut - epsilon); + } while (etaCut < maxEtaCut - epsilon); + // note: candidates selected as both D0 and D0bar are used, and considered in both situation (but not auto-correlated): reflections could play a relevant role. + // another, more restrictive, option, could be to consider only candidates selected with a single option (D0 xor D0bar) + + } // end inner loop (Dbars) + + } // end outer loop + } + + PROCESS_SWITCH(alice3correlatorddbar, processData, "Process data", true); + + /// D0-D0bar correlation pair builder - for MC reco-level analysis (candidates matched to true signal only, but also the various bkg sources are studied) + void processMcRec(aod::Collision const& collision, + soa::Join const&) + { + auto selectedCandidatesGroupedMC = selectedCandidatesMC->sliceByCached(aod::a3D0meson::collisionId, collision.globalIndex(), cache); + + // MC reco level + bool flagD0Signal = false; + bool flagD0Reflection = false; + bool flagD0barSignal = false; + bool flagD0barReflection = false; + for (const auto& candidate1 : selectedCandidatesGroupedMC) { + double efficiencyWeight = 1.; + if (applyEfficiency) { + efficiencyWeight = 1. / efficiencyD->at(o2::analysis::findBin(binsPt, candidate1.pt())); + } + + if (candidate1.mcTruthInfo()) { // 1 or 2, i.e. true D0 or D0bar + // fill per-candidate distributions from D0/D0bar true candidates + registry.fill(HIST("hPtCandMCRec"), candidate1.pt()); + registry.fill(HIST("hPtProng0MCRec"), candidate1.ptProng0()); + registry.fill(HIST("hPtProng1MCRec"), candidate1.ptProng1()); + registry.fill(HIST("hEtaMCRec"), candidate1.eta()); + registry.fill(HIST("hPhiMCRec"), candidate1.phi()); + registry.fill(HIST("hYMCRec"), candidate1.y()); + registry.fill(HIST("hSelectionStatusMCRec"), candidate1.isSelD0() + (candidate1.isSelD0bar() * 2)); + } + // fill invariant mass plots from D0/D0bar signal and background candidates + if (candidate1.isSelD0() >= selectionFlagD0) { // only reco as D0 + if (candidate1.mcTruthInfo() == 1) { // also matched as D0 + registry.fill(HIST("hMassD0MCRecSig"), candidate1.m(), candidate1.pt(), efficiencyWeight); // here m is univoque, since a given candidate passes the selection with only a single mass option + } else if (candidate1.mcTruthInfo() == 2) { + registry.fill(HIST("hMassD0MCRecRefl"), candidate1.m(), candidate1.pt(), efficiencyWeight); + } else { + registry.fill(HIST("hMassD0MCRecBkg"), candidate1.m(), candidate1.pt(), efficiencyWeight); + } + } + if (candidate1.isSelD0bar() >= selectionFlagD0bar) { // only reco as D0bar + if (candidate1.mcTruthInfo() == 2) { // also matched as D0bar + registry.fill(HIST("hMassD0barMCRecSig"), candidate1.m(), candidate1.pt(), efficiencyWeight); // here m is univoque, since a given candidate passes the selection with only a single mass option + } else if (candidate1.mcTruthInfo() == 1) { + registry.fill(HIST("hMassD0barMCRecRefl"), candidate1.m(), candidate1.pt(), efficiencyWeight); + } else { + registry.fill(HIST("hMassD0barMCRecBkg"), candidate1.m(), candidate1.pt(), efficiencyWeight); + } + } + + // D-Dbar correlation dedicated section + // if the candidate is selected ad D0, search for D0bar and evaluate correlations + if (candidate1.isSelD0() < selectionFlagD0) { // discard candidates not selected as D0 in outer loop + continue; + } + + flagD0Signal = candidate1.mcTruthInfo() == 1; // flagD0Signal 'true' if candidate1 matched to D0 (particle) + flagD0Reflection = candidate1.mcTruthInfo() == 2; // flagD0Reflection 'true' if candidate1, selected as D0 (particle), is matched to D0bar (antiparticle) + + for (const auto& candidate2 : selectedCandidatesGroupedMC) { + if (candidate2.isSelD0bar() < selectionFlagD0bar) { // discard candidates not selected as D0bar in inner loop + continue; + } + flagD0barSignal = candidate2.mcTruthInfo() == 2; // flagD0barSignal 'true' if candidate2 matched to D0bar (antiparticle) + flagD0barReflection = candidate2.mcTruthInfo() == 1; // flagD0barReflection 'true' if candidate2, selected as D0bar (antiparticle), is matched to D0 (particle) + + // Excluding trigger self-correlations (possible in case of both mass hypotheses of the same real particle, reconstructed as candidate1 for D0 and candidate2 for D0bar) + if (candidate1.mRowIndex == candidate2.mRowIndex) { // this by definition should never happen, since each candidate is either D0 or D0bar + continue; + } + if ((candidate1.pt() - candidate2.pt()) < 1e-5 && (candidate1.eta() - candidate2.eta()) < 1e-5 && (candidate1.phi() - candidate2.phi()) < 1e-5) { // revised, temporary condition to avoid self-correlations (the best would be check the daughterIDs, but we don't store them at the moment) + continue; + } + // choice of options (D0/D0bar signal/bkg) + int pairSignalStatus = 0; // 0 = bkg/bkg, 1 = bkg/ref, 2 = bkg/sig, 3 = ref/bkg, 4 = ref/ref, 5 = ref/sig, 6 = sig/bkg, 7 = sig/ref, 8 = sig/sig + if (flagD0Signal) { + pairSignalStatus += 6; + } + if (flagD0Reflection) { + pairSignalStatus += 3; + } + if (flagD0barSignal) { + pairSignalStatus += 2; + } + if (flagD0barReflection) { + pairSignalStatus += 1; + } + entryD0D0barPair(getDeltaPhi(candidate2.phi(), candidate1.phi()), + candidate2.eta() - candidate1.eta(), + candidate1.pt(), + candidate2.pt()); + entryD0D0barRecoInfo(candidate1.m(), // mD0 + candidate2.m(), // mD0bar + pairSignalStatus); + double etaCut = 0.; + double ptCut = 0.; + do { // fill pairs vs etaCut plot + ptCut = 0.; + etaCut += incrementEtaCut; + do { // fill pairs vs etaCut plot + if (std::abs(candidate1.eta()) < etaCut && std::abs(candidate2.eta()) < etaCut && candidate1.pt() > ptCut && candidate2.pt() > ptCut) { + registry.fill(HIST("hDDbarVsEtaCut"), etaCut - epsilon, ptCut + epsilon); + } + ptCut += incrementPtThreshold; + } while (ptCut < ptThresholdForMaxEtaCut - epsilon); + } while (etaCut < maxEtaCut - epsilon); + } // end inner loop (Dbars) + + } // end outer loop + } + + PROCESS_SWITCH(alice3correlatorddbar, processMcRec, "Process MC Reco mode", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc)}; +} diff --git a/ALICE3/TableProducer/alice3-decayfinder.cxx b/ALICE3/TableProducer/alice3-decayfinder.cxx index ae0ea6b5e20..b0aeba5272d 100644 --- a/ALICE3/TableProducer/alice3-decayfinder.cxx +++ b/ALICE3/TableProducer/alice3-decayfinder.cxx @@ -49,6 +49,7 @@ using namespace o2; using namespace o2::framework; +using namespace o2::constants::physics; using namespace o2::framework::expressions; using std::array; @@ -68,6 +69,10 @@ using alice3tracks = soa::Join candidateD0meson; // contains D0 and D0bar selected candidates (separated, i.e. each row with a single mass hypothesis) + Produces selectionOutcome; // flags for isSelD0 and isSelD0bar + Produces mcTruthOutcome; // contains MC truth info (is true D0, true D0bar, or bkg) + // Operation and minimisation criteria Configurable magneticField{"magneticField", 20.0f, "Magnetic field (in kilogauss)"}; Configurable doDCAplotsD{"doDCAplotsD", true, "do daughter prong DCA plots for D mesons"}; @@ -160,23 +165,29 @@ struct alice3decayFinder { float mass; std::array posSV; std::array P; + std::array Pdaug; // positive track + std::array Ndaug; // negative track float pt; + float phi; float eta; + float y; float cosPA; float cosPAxy; float cosThetaStar; float normalizedDecayLength; + int mcTruth; // 0 = bkg, 1 = D0, 2 = D0bar } dmeson; struct { float dcaDau; float mass; float pt; + float phi; float eta; } lcbaryon; template - bool buildDecayCandidateTwoBody(TTrackType const& posTrackRow, TTrackType const& negTrackRow, float posMass, float negMass) + bool buildDecayCandidateTwoBody(TTrackType const& posTrackRow, TTrackType const& negTrackRow, float posMass, float negMass, aod::McParticles const& mcParticles) { o2::track::TrackParCov posTrack = getTrackParCov(posTrackRow); o2::track::TrackParCov negTrack = getTrackParCov(negTrackRow); @@ -201,11 +212,19 @@ struct alice3decayFinder { posTrack.getPxPyPzGlo(posP); negTrack.getPxPyPzGlo(negP); dmeson.dcaDau = TMath::Sqrt(fitter.getChi2AtPCACandidate()); - - // return mass + dmeson.Pdaug[0] = posP[0]; + dmeson.Pdaug[1] = posP[1]; + dmeson.Pdaug[2] = posP[2]; + dmeson.Ndaug[0] = negP[0]; + dmeson.Ndaug[1] = negP[1]; + dmeson.Ndaug[2] = negP[2]; + + // return mass and kinematic variables dmeson.mass = RecoDecay::m(array{array{posP[0], posP[1], posP[2]}, array{negP[0], negP[1], negP[2]}}, array{posMass, negMass}); dmeson.pt = std::hypot(posP[0] + negP[0], posP[1] + negP[1]); + dmeson.phi = RecoDecay::phi(array{posP[0] + negP[0], posP[1] + negP[1]}); dmeson.eta = RecoDecay::eta(array{posP[0] + negP[0], posP[1] + negP[1], posP[2] + negP[2]}); + dmeson.y = RecoDecay::y(std::array{posP[0] + negP[0], posP[1] + negP[1], posP[2] + negP[2]}, dmeson.mass); const auto posSV = fitter.getPCACandidate(); dmeson.posSV[0] = posSV[0]; dmeson.posSV[1] = posSV[1]; @@ -213,6 +232,21 @@ struct alice3decayFinder { o2::track::TrackParCov parentTrack = fitter.createParentTrackParCov(); parentTrack.getPxPyPzGlo(dmeson.P); dmeson.cosThetaStar = RecoDecay::cosThetaStar(std::array{std::array{posP[0], posP[1], posP[2]}, std::array{negP[0], negP[1], negP[2]}}, std::array{posMass, negMass}, dmeson.mass, 0); + + // MC truth check + int indexRec = -1; + int8_t sign = 0; + auto arrayDaughters = std::array{posTrackRow, negTrackRow}; + indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, Pdg::kD0, std::array{+kPiPlus, -kKPlus}, true, &sign); + if (indexRec < 0) { + dmeson.mcTruth = 0; // bkg + } else { + if (sign > 0) { + dmeson.mcTruth = 1; // D0 + } else { + dmeson.mcTruth = 2; // D0bar + } + } return true; } @@ -253,6 +287,7 @@ struct alice3decayFinder { // return mass lcbaryon.mass = RecoDecay::m(array{array{P0[0], P0[1], P0[2]}, array{P1[0], P1[1], P1[2]}, array{P2[0], P2[1], P2[2]}}, array{p0mass, p1mass, p2mass}); lcbaryon.pt = std::hypot(P0[0] + P1[0] + P2[0], P0[1] + P1[1] + P2[1]); + lcbaryon.phi = RecoDecay::phi(array{P0[0] + P1[0] + P2[0], P0[1] + P1[1] + P2[1]}); lcbaryon.eta = RecoDecay::eta(array{P0[0] + P1[0] + P2[0], P0[1] + P1[1] + P2[1], P0[2] + P1[2] + P2[2]}); return true; } @@ -369,7 +404,7 @@ struct alice3decayFinder { } //*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+* - void processFindDmesons(aod::Collision const& collision, alice3tracks const&, aod::McParticles const&) + void processFindDmesons(aod::Collision const& collision, alice3tracks const&, aod::McParticles const& mcParticles) { // group with this collision auto tracksPiPlusFromDgrouped = tracksPiPlusFromD->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); @@ -388,12 +423,12 @@ struct alice3decayFinder { histos.fill(HIST("h2dDCAxyVsPtKaMinusFromD"), track.pt(), track.dcaXY() * 1e+4); } - // D mesons + // D0 mesons for (auto const& posTrackRow : tracksPiPlusFromDgrouped) { for (auto const& negTrackRow : tracksKaMinusFromDgrouped) { if (mcSameMotherCheck && !checkSameMother(posTrackRow, negTrackRow)) continue; - if (!buildDecayCandidateTwoBody(posTrackRow, negTrackRow, o2::constants::physics::MassPionCharged, o2::constants::physics::MassKaonCharged)) + if (!buildDecayCandidateTwoBody(posTrackRow, negTrackRow, o2::constants::physics::MassPionCharged, o2::constants::physics::MassKaonCharged, mcParticles)) continue; dmeson.cosPA = RecoDecay::cpa(std::array{collision.posX(), collision.posY(), collision.posZ()}, std::array{dmeson.posSV[0], dmeson.posSV[1], dmeson.posSV[2]}, std::array{dmeson.P[0], dmeson.P[1], dmeson.P[2]}); @@ -433,14 +468,27 @@ struct alice3decayFinder { histos.fill(HIST("hDCADDaughters"), dmeson.dcaDau * 1e+4); histos.fill(HIST("hMassD"), dmeson.mass); histos.fill(HIST("h3dRecD"), dmeson.pt, dmeson.eta, dmeson.mass); + + // store D0 in output table + candidateD0meson(collision.globalIndex(), + dmeson.Pdaug[0], dmeson.Pdaug[1], dmeson.Pdaug[2], + dmeson.Ndaug[0], dmeson.Ndaug[1], dmeson.Ndaug[2], + dmeson.P[0], dmeson.P[1], dmeson.P[2], + dmeson.pt, + dmeson.mass, + dmeson.eta, + dmeson.phi, + dmeson.y); + selectionOutcome(1, 0); // isSelD0 true, isSelD0bar false + mcTruthOutcome(dmeson.mcTruth); } } - // D mesons + // D0bar mesons for (auto const& posTrackRow : tracksKaPlusFromDgrouped) { for (auto const& negTrackRow : tracksPiMinusFromDgrouped) { if (mcSameMotherCheck && !checkSameMother(posTrackRow, negTrackRow)) continue; - if (!buildDecayCandidateTwoBody(posTrackRow, negTrackRow, o2::constants::physics::MassKaonCharged, o2::constants::physics::MassPionCharged)) + if (!buildDecayCandidateTwoBody(posTrackRow, negTrackRow, o2::constants::physics::MassKaonCharged, o2::constants::physics::MassPionCharged, mcParticles)) continue; dmeson.cosPA = RecoDecay::cpa(std::array{collision.posX(), collision.posY(), collision.posZ()}, std::array{dmeson.posSV[0], dmeson.posSV[1], dmeson.posSV[2]}, std::array{dmeson.P[0], dmeson.P[1], dmeson.P[2]}); @@ -480,6 +528,19 @@ struct alice3decayFinder { histos.fill(HIST("hDCADbarDaughters"), dmeson.dcaDau * 1e+4); histos.fill(HIST("hMassDbar"), dmeson.mass); histos.fill(HIST("h3dRecDbar"), dmeson.pt, dmeson.eta, dmeson.mass); + + // store D0bar in output table + candidateD0meson(collision.globalIndex(), + dmeson.Pdaug[0], dmeson.Pdaug[1], dmeson.Pdaug[2], + dmeson.Ndaug[0], dmeson.Ndaug[1], dmeson.Ndaug[2], + dmeson.P[0], dmeson.P[1], dmeson.P[2], + dmeson.pt, + dmeson.mass, + dmeson.eta, + dmeson.phi, + dmeson.y); + selectionOutcome(0, 1); // isSelD0 true, isSelD0bar false + mcTruthOutcome(dmeson.mcTruth); } } } diff --git a/ALICE3/Tasks/CMakeLists.txt b/ALICE3/Tasks/CMakeLists.txt index 36a9d8d58e8..0b2e9972aa5 100644 --- a/ALICE3/Tasks/CMakeLists.txt +++ b/ALICE3/Tasks/CMakeLists.txt @@ -48,3 +48,8 @@ o2physics_add_dpl_workflow(alice3-dilepton SOURCES alice3-dilepton.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::FrameworkPhysicsSupport COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(alice3-taskcorrelationddbar + SOURCES alice3-taskcorrelationDDbar.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) \ No newline at end of file diff --git a/ALICE3/Tasks/alice3-taskcorrelationDDbar.cxx b/ALICE3/Tasks/alice3-taskcorrelationDDbar.cxx new file mode 100644 index 00000000000..66f641302ee --- /dev/null +++ b/ALICE3/Tasks/alice3-taskcorrelationDDbar.cxx @@ -0,0 +1,433 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file taskCorrelationDDbar.cxx +/// \brief D0-D0bar correlation analysis task - data-like and MC-reco analysis performance on ALICE 3 detector. +/// +/// \author Fabio Colamaria , INFN Bari + +#include + +#include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/runDataProcessing.h" + +#include "PWGHF/Utils/utilsAnalysis.h" +#include "PWGHF/HFC/DataModel/CorrelationTables.h" +// #include "PWGHF/DataModel/CandidateReconstructionTables.h" +// #include "PWGHF/DataModel/CandidateSelectionTables.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +namespace o2::aod +{ +using DDbarPairFull = soa::Join; +} // namespace o2::aod + +/// +/// Returns deltaPhi value in range [-pi/2., 3.*pi/2], typically used for correlation studies +/// +double getDeltaPhi(double phiD, double phiDbar) +{ + return RecoDecay::constrainAngle(phiDbar - phiD, -o2::constants::math::PIHalf); +} + +/// +/// Returns phi of candidate/particle evaluated from x and y components of segment connecting primary and secondary vertices +/// +double evaluatePhiByVertex(double xVertex1, double xVertex2, double yVertex1, double yVertex2) +{ + return RecoDecay::phi(xVertex2 - xVertex1, yVertex2 - yVertex1); +} + +// string definitions, used for histogram axis labels +const TString stringPtD = "#it{p}_{T}^{D} (GeV/#it{c});"; +const TString stringPtDbar = "#it{p}_{T}^{Dbar} (GeV/#it{c});"; +const TString stringDeltaPt = "#it{p}_{T}^{Dbar}-#it{p}_{T}^{D} (GeV/#it{c});"; +const TString stringDeltaPtMaxMin = "#it{p}_{T}^{max}-#it{p}_{T}^{min} (GeV/#it{c});"; +const TString stringDeltaEta = "#it{#eta}^{Dbar}-#it{#eta}^{D};"; +const TString stringDeltaPhi = "#it{#varphi}^{Dbar}-#it{#varphi}^{D} (rad);"; +const TString stringDDbar = "D,Dbar candidates "; +const TString stringSignal = "signal region;"; +const TString stringSideband = "sidebands;"; +const TString stringMCParticles = "MC gen - D,Dbar particles;"; +const TString stringMCReco = "MC reco - D,Dbar candidates "; + +// definition of vectors for standard ptbin and invariant mass configurables +const int npTBinsCorrelations = 8; +const double pTBinsCorrelations[npTBinsCorrelations + 1] = {0., 2., 4., 6., 8., 12., 16., 24., 99.}; +auto pTBinsCorrelations_v = std::vector{pTBinsCorrelations, pTBinsCorrelations + npTBinsCorrelations + 1}; +const double signalRegionInnerDefault[npTBinsCorrelations] = {1.810, 1.810, 1.810, 1.810, 1.810, 1.810, 1.810, 1.810}; +const double signalRegionOuterDefault[npTBinsCorrelations] = {1.922, 1.922, 1.922, 1.922, 1.922, 1.922, 1.922, 1.922}; +const double sidebandLeftInnerDefault[npTBinsCorrelations] = {1.642, 1.642, 1.642, 1.642, 1.642, 1.642, 1.642, 1.642}; +const double sidebandLeftOuterDefault[npTBinsCorrelations] = {1.754, 1.754, 1.754, 1.754, 1.754, 1.754, 1.754, 1.754}; +const double sidebandRightInnerDefault[npTBinsCorrelations] = {1.978, 1.978, 1.978, 1.978, 1.978, 1.978, 1.978, 1.978}; +const double sidebandRightOuterDefault[npTBinsCorrelations] = {2.090, 2.090, 2.090, 2.090, 2.090, 2.090, 2.090, 2.090}; +auto signalRegionInner_v = std::vector{signalRegionInnerDefault, signalRegionInnerDefault + npTBinsCorrelations}; +auto signalRegionOuter_v = std::vector{signalRegionOuterDefault, signalRegionOuterDefault + npTBinsCorrelations}; +auto sidebandLeftInner_v = std::vector{sidebandLeftInnerDefault, sidebandLeftInnerDefault + npTBinsCorrelations}; +auto sidebandLeftOuter_v = std::vector{sidebandLeftOuterDefault, sidebandLeftOuterDefault + npTBinsCorrelations}; +auto sidebandRightInner_v = std::vector{sidebandRightInnerDefault, sidebandRightInnerDefault + npTBinsCorrelations}; +auto sidebandRightOuter_v = std::vector{sidebandRightOuterDefault, sidebandRightOuterDefault + npTBinsCorrelations}; +const int npTBinsEfficiency = o2::analysis::hf_cuts_d0_to_pi_k::NBinsPt; +const double efficiencyDmesonDefault[npTBinsEfficiency] = {}; +auto efficiencyDmeson_v = std::vector{efficiencyDmesonDefault, efficiencyDmesonDefault + npTBinsEfficiency}; + +struct alice3taskcorrelationddbar { + Configurable applyEfficiency{"applyEfficiency", 1, "Flag for applying efficiency weights"}; + // pT ranges for correlation plots: the default values are those embedded in hf_cuts_d0_to_pi_k (i.e. the mass pT bins), but can be redefined via json files + Configurable> binsPtCorrelations{"binsPtCorrelations", std::vector{pTBinsCorrelations_v}, "pT bin limits for correlation plots"}; + // pT bins for effiencies: same as above + Configurable> binsPtEfficiency{"binsPtEfficiency", std::vector{o2::analysis::hf_cuts_d0_to_pi_k::vecBinsPt}, "pT bin limits for efficiency"}; + // signal and sideband region edges, to be defined via json file (initialised to empty) + Configurable> signalRegionInner{"signalRegionInner", std::vector{signalRegionInner_v}, "Inner values of signal region vs pT"}; + Configurable> signalRegionOuter{"signalRegionOuter", std::vector{signalRegionOuter_v}, "Outer values of signal region vs pT"}; + Configurable> sidebandLeftInner{"sidebandLeftInner", std::vector{sidebandLeftInner_v}, "Inner values of left sideband vs pT"}; + Configurable> sidebandLeftOuter{"sidebandLeftOuter", std::vector{sidebandLeftOuter_v}, "Outer values of left sideband vs pT"}; + Configurable> sidebandRightInner{"sidebandRightInner", std::vector{sidebandRightInner_v}, "Inner values of right sideband vs pT"}; + Configurable> sidebandRightOuter{"sidebandRightOuter", std::vector{sidebandRightOuter_v}, "Outer values of right sideband vs pT"}; + Configurable> efficiencyD{"efficiencyD", std::vector{efficiencyDmeson_v}, "Efficiency values for D meson specie under study"}; + + HistogramRegistry registry{ + "registry", + // NOTE: use hMassD0 (from correlator task) for normalisation, and hMass2DCorrelationPairs for 2D-sideband-subtraction purposes + {{"hMass2DCorrelationPairs", stringDDbar + "2D;inv. mass D (GeV/#it{c}^{2});inv. mass Dbar (GeV/#it{c}^{2});" + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{200, 1.6, 2.1}, {200, 1.6, 2.1}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hDeltaEtaPtIntSignalRegion", stringDDbar + stringSignal + stringDeltaEta + "entries", {HistType::kTH1F, {{200, -10., 10.}}}}, + {"hDeltaPhiPtIntSignalRegion", stringDDbar + stringSignal + stringDeltaPhi + "entries", {HistType::kTH1F, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}}}}, + {"hCorrel2DPtIntSignalRegion", stringDDbar + stringSignal + stringDeltaPhi + stringDeltaEta + "entries", {HistType::kTH2F, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {200, -10., 10.}}}}, + {"hCorrel2DVsPtSignalRegion", stringDDbar + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {120, -6., 6.}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hDeltaPtDDbarSignalRegion", stringDDbar + stringSignal + stringDeltaPt + "entries", {HistType::kTH1F, {{144, -36., 36.}}}}, + {"hDeltaPtMaxMinSignalRegion", stringDDbar + stringSignal + stringDeltaPtMaxMin + "entries", {HistType::kTH1F, {{72, 0., 36.}}}}, + {"hDeltaEtaPtIntSidebands", stringDDbar + stringSideband + stringDeltaEta + "entries", {HistType::kTH1F, {{200, -10., 10.}}}}, + {"hDeltaPhiPtIntSidebands", stringDDbar + stringSideband + stringDeltaPhi + "entries", {HistType::kTH1F, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}}}}, + {"hCorrel2DPtIntSidebands", stringDDbar + stringSideband + stringDeltaPhi + stringDeltaEta + "entries", {HistType::kTH2F, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {200, -10., 10.}}}}, + {"hCorrel2DVsPtSidebands", stringDDbar + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {120, -6., 6.}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hDeltaPtDDbarSidebands", stringDDbar + stringSideband + stringDeltaPt + "entries", {HistType::kTH1F, {{144, -36., 36.}}}}, + {"hDeltaPtMaxMinSidebands", stringDDbar + stringSideband + stringDeltaPtMaxMin + "entries", {HistType::kTH1F, {{72, 0., 36.}}}}, + {"hMass2DCorrelationPairsMCRecBkgBkg", stringDDbar + "2D BkgBkg - MC reco;inv. mass D (GeV/#it{c}^{2});inv. mass Dbar (GeV/#it{c}^{2});" + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{200, 1.6, 2.1}, {200, 1.6, 2.1}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hMass2DCorrelationPairsMCRecBkgRef", stringDDbar + "2D BkgRef - MC reco;inv. mass D (GeV/#it{c}^{2});inv. mass Dbar (GeV/#it{c}^{2});" + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{200, 1.6, 2.1}, {200, 1.6, 2.1}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hMass2DCorrelationPairsMCRecBkgSig", stringDDbar + "2D BkgSig - MC reco;inv. mass D (GeV/#it{c}^{2});inv. mass Dbar (GeV/#it{c}^{2});" + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{200, 1.6, 2.1}, {200, 1.6, 2.1}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hMass2DCorrelationPairsMCRecRefBkg", stringDDbar + "2D RefBkg - MC reco;inv. mass D (GeV/#it{c}^{2});inv. mass Dbar (GeV/#it{c}^{2});" + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{200, 1.6, 2.1}, {200, 1.6, 2.1}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hMass2DCorrelationPairsMCRecRefRef", stringDDbar + "2D RefRef - MC reco;inv. mass D (GeV/#it{c}^{2});inv. mass Dbar (GeV/#it{c}^{2});" + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{200, 1.6, 2.1}, {200, 1.6, 2.1}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hMass2DCorrelationPairsMCRecRefSig", stringDDbar + "2D RefSig - MC reco;inv. mass D (GeV/#it{c}^{2});inv. mass Dbar (GeV/#it{c}^{2});" + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{200, 1.6, 2.1}, {200, 1.6, 2.1}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hMass2DCorrelationPairsMCRecSigBkg", stringDDbar + "2D SigBkg - MC reco;inv. mass D (GeV/#it{c}^{2});inv. mass Dbar (GeV/#it{c}^{2});" + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{200, 1.6, 2.1}, {200, 1.6, 2.1}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hMass2DCorrelationPairsMCRecSigRef", stringDDbar + "2D SigRef - MC reco;inv. mass D (GeV/#it{c}^{2});inv. mass Dbar (GeV/#it{c}^{2});" + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{200, 1.6, 2.1}, {200, 1.6, 2.1}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hMass2DCorrelationPairsMCRecSigSig", stringDDbar + "2D SigSig - MC reco;inv. mass D (GeV/#it{c}^{2});inv. mass Dbar (GeV/#it{c}^{2});" + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{200, 1.6, 2.1}, {200, 1.6, 2.1}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hDeltaEtaPtIntSignalRegionMCRec", stringMCReco + stringSignal + stringDeltaEta + "entries", {HistType::kTH1F, {{200, -10., 10.}}}}, + {"hDeltaPhiPtIntSignalRegionMCRec", stringMCReco + stringSignal + stringDeltaPhi + "entries", {HistType::kTH1F, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}}}}, + {"hCorrel2DPtIntSignalRegionMCRec", stringMCReco + stringSignal + stringDeltaPhi + stringDeltaEta + "entries", {HistType::kTH2F, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {200, -10., 10.}}}}, + {"hDeltaPtDDbarSignalRegionMCRec", stringMCReco + stringSignal + stringDeltaPt + "entries", {HistType::kTH1F, {{144, -36., 36.}}}}, + {"hDeltaPtMaxMinSignalRegionMCRec", stringMCReco + stringSignal + stringDeltaPtMaxMin + "entries", {HistType::kTH1F, {{72, 0., 36.}}}}, + {"hCorrel2DVsPtSignalRegionMCRecBkgBkg", stringMCReco + "BkgBkg" + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {120, -6., 6.}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hCorrel2DVsPtSignalRegionMCRecBkgRef", stringMCReco + "BkgRef" + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {120, -6., 6.}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hCorrel2DVsPtSignalRegionMCRecBkgSig", stringMCReco + "BkgSig" + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {120, -6., 6.}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hCorrel2DVsPtSignalRegionMCRecRefBkg", stringMCReco + "RefBkg" + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {120, -6., 6.}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hCorrel2DVsPtSignalRegionMCRecRefRef", stringMCReco + "RefRef" + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {120, -6., 6.}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hCorrel2DVsPtSignalRegionMCRecRefSig", stringMCReco + "RefSig" + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {120, -6., 6.}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hCorrel2DVsPtSignalRegionMCRecSigBkg", stringMCReco + "SigBkg" + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {120, -6., 6.}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hCorrel2DVsPtSignalRegionMCRecSigRef", stringMCReco + "SigRef" + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {120, -6., 6.}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hCorrel2DVsPtSignalRegionMCRecSigSig", stringMCReco + "SigSig" + stringSignal + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {120, -6., 6.}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hDeltaEtaPtIntSidebandsMCRec", stringMCReco + stringSideband + stringDeltaEta + "entries", {HistType::kTH1F, {{200, -10., 10.}}}}, + {"hDeltaPhiPtIntSidebandsMCRec", stringMCReco + stringSideband + stringDeltaPhi + "entries", {HistType::kTH1F, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}}}}, + {"hCorrel2DPtIntSidebandsMCRec", stringMCReco + stringSideband + stringDeltaPhi + stringDeltaEta + "entries", {HistType::kTH2F, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {200, -10., 10.}}}}, + {"hDeltaPtDDbarSidebandsMCRec", stringMCReco + stringSideband + stringDeltaPt + "entries", {HistType::kTH1F, {{144, -36., 36.}}}}, + {"hDeltaPtMaxMinSidebandsMCRec", stringMCReco + stringSideband + stringDeltaPtMaxMin + "entries", {HistType::kTH1F, {{72, 0., 36.}}}}, + {"hCorrel2DVsPtSidebandsMCRecBkgBkg", stringMCReco + "BkgBkg" + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {120, -6., 6.}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hCorrel2DVsPtSidebandsMCRecBkgRef", stringMCReco + "BkgRef" + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {120, -6., 6.}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hCorrel2DVsPtSidebandsMCRecBkgSig", stringMCReco + "BkgSig" + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {120, -6., 6.}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hCorrel2DVsPtSidebandsMCRecRefBkg", stringMCReco + "RefBkg" + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {120, -6., 6.}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hCorrel2DVsPtSidebandsMCRecRefRef", stringMCReco + "RefRef" + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {120, -6., 6.}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hCorrel2DVsPtSidebandsMCRecRefSig", stringMCReco + "RefSig" + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {120, -6., 6.}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hCorrel2DVsPtSidebandsMCRecSigBkg", stringMCReco + "SigBkg" + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {120, -6., 6.}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hCorrel2DVsPtSidebandsMCRecSigRef", stringMCReco + "SigRef" + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {120, -6., 6.}, {10, 0., 10.}, {10, 0., 10.}}}}, // note: axes 3 and 4 (the pT) are updated in the init() + {"hCorrel2DVsPtSidebandsMCRecSigSig", stringMCReco + "SigSig" + stringSideband + stringDeltaPhi + stringDeltaEta + stringPtD + stringPtDbar + "entries", {HistType::kTHnSparseD, {{64, -o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf}, {120, -6., 6.}, {10, 0., 10.}, {10, 0., 10.}}}}}}; // note: axes 3 and 4 (the pT) are updated in the init() + + void init(InitContext&) + { + // redefinition of pT axes for THnSparse holding correlation entries + int nBinspTaxis = binsPtCorrelations->size() - 1; + const double* valuespTaxis = binsPtCorrelations->data(); + + for (int i = 2; i <= 3; i++) { + registry.get(HIST("hMass2DCorrelationPairs"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hCorrel2DVsPtSignalRegion"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hCorrel2DVsPtSidebands"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hMass2DCorrelationPairs"))->Sumw2(); + registry.get(HIST("hCorrel2DVsPtSignalRegion"))->Sumw2(); + registry.get(HIST("hCorrel2DVsPtSidebands"))->Sumw2(); + registry.get(HIST("hMass2DCorrelationPairsMCRecBkgBkg"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hMass2DCorrelationPairsMCRecBkgRef"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hMass2DCorrelationPairsMCRecBkgSig"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hMass2DCorrelationPairsMCRecRefBkg"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hMass2DCorrelationPairsMCRecRefRef"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hMass2DCorrelationPairsMCRecRefSig"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hMass2DCorrelationPairsMCRecSigBkg"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hMass2DCorrelationPairsMCRecSigRef"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hMass2DCorrelationPairsMCRecSigSig"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecBkgBkg"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecBkgRef"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecBkgSig"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecRefBkg"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecRefRef"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecRefSig"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecSigBkg"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecSigRef"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecSigSig"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hCorrel2DVsPtSidebandsMCRecBkgBkg"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hCorrel2DVsPtSidebandsMCRecBkgRef"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hCorrel2DVsPtSidebandsMCRecBkgSig"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hCorrel2DVsPtSidebandsMCRecRefBkg"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hCorrel2DVsPtSidebandsMCRecRefRef"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hCorrel2DVsPtSidebandsMCRecRefSig"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hCorrel2DVsPtSidebandsMCRecSigBkg"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hCorrel2DVsPtSidebandsMCRecSigRef"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hCorrel2DVsPtSidebandsMCRecSigSig"))->GetAxis(i)->Set(nBinspTaxis, valuespTaxis); + registry.get(HIST("hMass2DCorrelationPairsMCRecBkgBkg"))->Sumw2(); + registry.get(HIST("hMass2DCorrelationPairsMCRecBkgRef"))->Sumw2(); + registry.get(HIST("hMass2DCorrelationPairsMCRecBkgSig"))->Sumw2(); + registry.get(HIST("hMass2DCorrelationPairsMCRecRefBkg"))->Sumw2(); + registry.get(HIST("hMass2DCorrelationPairsMCRecRefRef"))->Sumw2(); + registry.get(HIST("hMass2DCorrelationPairsMCRecRefSig"))->Sumw2(); + registry.get(HIST("hMass2DCorrelationPairsMCRecSigBkg"))->Sumw2(); + registry.get(HIST("hMass2DCorrelationPairsMCRecSigRef"))->Sumw2(); + registry.get(HIST("hMass2DCorrelationPairsMCRecSigSig"))->Sumw2(); + registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecBkgBkg"))->Sumw2(); + registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecBkgRef"))->Sumw2(); + registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecBkgSig"))->Sumw2(); + registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecRefBkg"))->Sumw2(); + registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecRefRef"))->Sumw2(); + registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecRefSig"))->Sumw2(); + registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecSigBkg"))->Sumw2(); + registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecSigRef"))->Sumw2(); + registry.get(HIST("hCorrel2DVsPtSignalRegionMCRecSigSig"))->Sumw2(); + registry.get(HIST("hCorrel2DVsPtSidebandsMCRecBkgBkg"))->Sumw2(); + registry.get(HIST("hCorrel2DVsPtSidebandsMCRecBkgRef"))->Sumw2(); + registry.get(HIST("hCorrel2DVsPtSidebandsMCRecBkgSig"))->Sumw2(); + registry.get(HIST("hCorrel2DVsPtSidebandsMCRecRefBkg"))->Sumw2(); + registry.get(HIST("hCorrel2DVsPtSidebandsMCRecRefRef"))->Sumw2(); + registry.get(HIST("hCorrel2DVsPtSidebandsMCRecRefSig"))->Sumw2(); + registry.get(HIST("hCorrel2DVsPtSidebandsMCRecSigBkg"))->Sumw2(); + registry.get(HIST("hCorrel2DVsPtSidebandsMCRecSigRef"))->Sumw2(); + registry.get(HIST("hCorrel2DVsPtSidebandsMCRecSigSig"))->Sumw2(); + } + } + + /// D-Dbar correlation pair filling task, from pair tables - for real data and data-like analysis (i.e. reco-level w/o matching request via MC truth) + /// Works on both USL and LS analyses pair tables + void processData(aod::DDbarPairFull const& pairEntries) + { + for (const auto& pairEntry : pairEntries) { + // define variables for widely used quantities + double deltaPhi = pairEntry.deltaPhi(); + double deltaEta = pairEntry.deltaEta(); + double ptD = pairEntry.ptD(); + double ptDbar = pairEntry.ptDbar(); + double massD = pairEntry.mD(); + double massDbar = pairEntry.mDbar(); + + int pTBinD = o2::analysis::findBin(binsPtCorrelations, ptD); + int pTBinDbar = o2::analysis::findBin(binsPtCorrelations, ptDbar); + + double efficiencyWeight = 1.; + if (applyEfficiency) { + efficiencyWeight = 1. / (efficiencyD->at(o2::analysis::findBin(binsPtEfficiency, ptD)) * efficiencyD->at(o2::analysis::findBin(binsPtEfficiency, ptDbar))); + } + + // fill 2D invariant mass plots + registry.fill(HIST("hMass2DCorrelationPairs"), massD, massDbar, ptD, ptDbar, efficiencyWeight); + + // reject entries outside pT ranges of interest + if (pTBinD == -1 || pTBinDbar == -1) { // at least one particle outside accepted pT range + continue; + } + + // check if correlation entry belongs to signal region, sidebands or is outside both, and fill correlation plots + if (massD > signalRegionInner->at(pTBinD) && massD < signalRegionOuter->at(pTBinD) && massDbar > signalRegionInner->at(pTBinDbar) && massDbar < signalRegionOuter->at(pTBinDbar)) { + // in signal region + registry.fill(HIST("hCorrel2DVsPtSignalRegion"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); + registry.fill(HIST("hCorrel2DPtIntSignalRegion"), deltaPhi, deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSignalRegion"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSignalRegion"), deltaPhi, efficiencyWeight); + registry.fill(HIST("hDeltaPtDDbarSignalRegion"), ptDbar - ptD, efficiencyWeight); + registry.fill(HIST("hDeltaPtMaxMinSignalRegion"), std::abs(ptDbar - ptD), efficiencyWeight); + } + + if ((massD > sidebandLeftInner->at(pTBinD) && massD < sidebandLeftOuter->at(pTBinD) && massDbar > sidebandLeftInner->at(pTBinDbar) && massDbar < sidebandRightOuter->at(pTBinDbar)) || + (massD > sidebandRightInner->at(pTBinD) && massD < sidebandRightOuter->at(pTBinD) && massDbar > sidebandLeftInner->at(pTBinDbar) && massDbar < sidebandRightOuter->at(pTBinDbar)) || + (massD > sidebandLeftInner->at(pTBinD) && massD < sidebandRightOuter->at(pTBinD) && massDbar > sidebandLeftInner->at(pTBinDbar) && massDbar < sidebandLeftOuter->at(pTBinDbar)) || + (massD > sidebandLeftInner->at(pTBinD) && massD < sidebandRightOuter->at(pTBinD) && massDbar > sidebandRightInner->at(pTBinDbar) && massDbar < sidebandRightOuter->at(pTBinDbar))) { + // in sideband region + registry.fill(HIST("hCorrel2DVsPtSidebands"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); + registry.fill(HIST("hCorrel2DPtIntSidebands"), deltaPhi, deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSidebands"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSidebands"), deltaPhi, efficiencyWeight); + registry.fill(HIST("hDeltaPtDDbarSidebands"), ptDbar - ptD, efficiencyWeight); + registry.fill(HIST("hDeltaPtMaxMinSidebands"), std::abs(ptDbar - ptD), efficiencyWeight); + } + } // end loop + } + + PROCESS_SWITCH(alice3taskcorrelationddbar, processData, "Process data", true); + + /// D-Dbar correlation pair filling task, from pair tables - for MC reco-level analysis (candidates matched to true signal only, but also bkg sources are studied) + /// Works on both USL and LS analyses pair tables + void processMcRec(aod::DDbarPairFull const& pairEntries) + { + for (const auto& pairEntry : pairEntries) { + // define variables for widely used quantities + double deltaPhi = pairEntry.deltaPhi(); + double deltaEta = pairEntry.deltaEta(); + double ptD = pairEntry.ptD(); + double ptDbar = pairEntry.ptDbar(); + double massD = pairEntry.mD(); + double massDbar = pairEntry.mDbar(); + + int pTBinD = o2::analysis::findBin(binsPtCorrelations, ptD); + int pTBinDbar = o2::analysis::findBin(binsPtCorrelations, ptDbar); + + double efficiencyWeight = 1.; + if (applyEfficiency) { + efficiencyWeight = 1. / (efficiencyD->at(o2::analysis::findBin(binsPtEfficiency, ptD)) * efficiencyD->at(o2::analysis::findBin(binsPtEfficiency, ptDbar))); + } + + // fill 2D invariant mass plots + switch (pairEntry.signalStatus()) { + case 0: // D Bkg, Dbar Bkg + registry.fill(HIST("hMass2DCorrelationPairsMCRecBkgBkg"), massD, massDbar, ptD, ptDbar, efficiencyWeight); + break; + case 1: // D Bkg, Dbar Ref + registry.fill(HIST("hMass2DCorrelationPairsMCRecBkgRef"), massD, massDbar, ptD, ptDbar, efficiencyWeight); + break; + case 2: // D Bkg, Dbar Sig + registry.fill(HIST("hMass2DCorrelationPairsMCRecBkgSig"), massD, massDbar, ptD, ptDbar, efficiencyWeight); + break; + case 3: // D Ref, Dbar Bkg + registry.fill(HIST("hMass2DCorrelationPairsMCRecRefBkg"), massD, massDbar, ptD, ptDbar, efficiencyWeight); + break; + case 4: // D Ref, Dbar Ref + registry.fill(HIST("hMass2DCorrelationPairsMCRecRefRef"), massD, massDbar, ptD, ptDbar, efficiencyWeight); + break; + case 5: // D Ref, Dbar Sig + registry.fill(HIST("hMass2DCorrelationPairsMCRecRefSig"), massD, massDbar, ptD, ptDbar, efficiencyWeight); + break; + case 6: // D Sig, Dbar Bkg + registry.fill(HIST("hMass2DCorrelationPairsMCRecSigBkg"), massD, massDbar, ptD, ptDbar, efficiencyWeight); + break; + case 7: // D Sig, Dbar Ref + registry.fill(HIST("hMass2DCorrelationPairsMCRecSigRef"), massD, massDbar, ptD, ptDbar, efficiencyWeight); + break; + case 8: // D Sig, Dbar Sig + registry.fill(HIST("hMass2DCorrelationPairsMCRecSigSig"), massD, massDbar, ptD, ptDbar, efficiencyWeight); + break; + default: // should not happen for MC reco + break; + } + + // reject entries outside pT ranges of interest + if (pTBinD == -1 || pTBinDbar == -1) { // at least one particle outside accepted pT range + continue; + } + + // check if correlation entry belongs to signal region, sidebands or is outside both, and fill correlation plots + if (massD > signalRegionInner->at(pTBinD) && massD < signalRegionOuter->at(pTBinD) && massDbar > signalRegionInner->at(pTBinDbar) && massDbar < signalRegionOuter->at(pTBinDbar)) { + // in signal region + registry.fill(HIST("hCorrel2DPtIntSignalRegionMCRec"), deltaPhi, deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSignalRegionMCRec"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSignalRegionMCRec"), deltaPhi, efficiencyWeight); + registry.fill(HIST("hDeltaPtDDbarSignalRegionMCRec"), ptDbar - ptD, efficiencyWeight); + registry.fill(HIST("hDeltaPtMaxMinSignalRegionMCRec"), std::abs(ptDbar - ptD), efficiencyWeight); + switch (pairEntry.signalStatus()) { + case 0: // D Bkg, Dbar Bkg + registry.fill(HIST("hCorrel2DVsPtSignalRegionMCRecBkgBkg"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); + break; + case 1: // D Bkg, Dbar Ref + registry.fill(HIST("hCorrel2DVsPtSignalRegionMCRecBkgRef"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); + break; + case 2: // D Bkg, Dbar Sig + registry.fill(HIST("hCorrel2DVsPtSignalRegionMCRecBkgSig"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); + break; + case 3: // D Ref, Dbar Bkg + registry.fill(HIST("hCorrel2DVsPtSignalRegionMCRecRefBkg"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); + break; + case 4: // D Ref, Dbar Ref + registry.fill(HIST("hCorrel2DVsPtSignalRegionMCRecRefRef"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); + break; + case 5: // D Ref, Dbar Sig + registry.fill(HIST("hCorrel2DVsPtSignalRegionMCRecRefSig"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); + break; + case 6: // D Sig, Dbar Bkg + registry.fill(HIST("hCorrel2DVsPtSignalRegionMCRecSigBkg"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); + break; + case 7: // D Sig, Dbar Ref + registry.fill(HIST("hCorrel2DVsPtSignalRegionMCRecSigRef"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); + break; + case 8: // D Sig, Dbar Sig + registry.fill(HIST("hCorrel2DVsPtSignalRegionMCRecSigSig"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); + break; + default: // should not happen for MC reco + break; + } + } + + if ((massD > sidebandLeftInner->at(pTBinD) && massD < sidebandLeftOuter->at(pTBinD) && massDbar > sidebandLeftInner->at(pTBinDbar) && massDbar < sidebandRightOuter->at(pTBinDbar)) || + (massD > sidebandRightInner->at(pTBinD) && massD < sidebandRightOuter->at(pTBinD) && massDbar > sidebandLeftInner->at(pTBinDbar) && massDbar < sidebandRightOuter->at(pTBinDbar)) || + (massD > sidebandLeftInner->at(pTBinD) && massD < sidebandRightOuter->at(pTBinD) && massDbar > sidebandLeftInner->at(pTBinDbar) && massDbar < sidebandLeftOuter->at(pTBinDbar)) || + (massD > sidebandLeftInner->at(pTBinD) && massD < sidebandRightOuter->at(pTBinD) && massDbar > sidebandRightInner->at(pTBinDbar) && massDbar < sidebandRightOuter->at(pTBinDbar))) { + // in sideband region + registry.fill(HIST("hCorrel2DPtIntSidebandsMCRec"), deltaPhi, deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSidebandsMCRec"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSidebandsMCRec"), deltaPhi, efficiencyWeight); + registry.fill(HIST("hDeltaPtDDbarSidebandsMCRec"), ptDbar - ptD, efficiencyWeight); + registry.fill(HIST("hDeltaPtMaxMinSidebandsMCRec"), std::abs(ptDbar - ptD), efficiencyWeight); + switch (pairEntry.signalStatus()) { + case 0: // D Bkg, Dbar Bkg + registry.fill(HIST("hCorrel2DVsPtSidebandsMCRecBkgBkg"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); + break; + case 1: // D Bkg, Dbar Ref + registry.fill(HIST("hCorrel2DVsPtSidebandsMCRecBkgRef"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); + break; + case 2: // D Bkg, Dbar Sig + registry.fill(HIST("hCorrel2DVsPtSidebandsMCRecBkgSig"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); + break; + case 3: // D Ref, Dbar Bkg + registry.fill(HIST("hCorrel2DVsPtSidebandsMCRecRefBkg"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); + break; + case 4: // D Ref, Dbar Ref + registry.fill(HIST("hCorrel2DVsPtSidebandsMCRecRefRef"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); + break; + case 5: // D Ref, Dbar Sig + registry.fill(HIST("hCorrel2DVsPtSidebandsMCRecRefSig"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); + break; + case 6: // D Sig, Dbar Bkg + registry.fill(HIST("hCorrel2DVsPtSidebandsMCRecSigBkg"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); + break; + case 7: // D Sig, Dbar Ref + registry.fill(HIST("hCorrel2DVsPtSidebandsMCRecSigRef"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); + break; + case 8: // D Sig, Dbar Sig + registry.fill(HIST("hCorrel2DVsPtSidebandsMCRecSigSig"), deltaPhi, deltaEta, ptD, ptDbar, efficiencyWeight); + break; + default: // should not happen for MC reco + break; + } + } + } // end loop + } + + PROCESS_SWITCH(alice3taskcorrelationddbar, processMcRec, "Process MC Reco mode", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} From e46977579b3e31bc35b1e3fae0154f8276cc71f4 Mon Sep 17 00:00:00 2001 From: abmodak <67369858+abmodak@users.noreply.github.com> Date: Fri, 23 May 2025 22:52:30 +0200 Subject: [PATCH 1397/1650] [PWGCF] Add long range correlations analysis task (#11329) Co-authored-by: ALICE Action Bot --- .../Tasks/CMakeLists.txt | 5 + .../Tasks/longrangeCorrelation.cxx | 353 ++++++++++++++++++ 2 files changed, 358 insertions(+) create mode 100644 PWGCF/TwoParticleCorrelations/Tasks/longrangeCorrelation.cxx diff --git a/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt b/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt index de8948f260d..d150b6954db 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt +++ b/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt @@ -63,6 +63,11 @@ o2physics_add_dpl_workflow(di-hadron-cor PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(longrange-correlation + SOURCES longrangeCorrelation.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore + COMPONENT_NAME Analysis) + diff --git a/PWGCF/TwoParticleCorrelations/Tasks/longrangeCorrelation.cxx b/PWGCF/TwoParticleCorrelations/Tasks/longrangeCorrelation.cxx new file mode 100644 index 00000000000..5fb1bc8e1c8 --- /dev/null +++ b/PWGCF/TwoParticleCorrelations/Tasks/longrangeCorrelation.cxx @@ -0,0 +1,353 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// +/// \file longrangeCorrelation.cxx +/// +/// \brief task for long range correlation analysis +/// \author Abhi Modak (abhi.modak@cern.ch) and Debojit sarkar (debojit.sarkar@cern.ch) +/// \since April 22, 2025 + +#include +#include +#include +#include +#include +#include +#include + +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/runDataProcessing.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/StepTHn.h" +#include "ReconstructionDataFormats/Track.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/Core/trackUtilities.h" +#include "CommonConstants/PhysicsConstants.h" +#include "Common/Core/TrackSelection.h" +#include "Framework/ASoAHelpers.h" +#include "Common/DataModel/FT0Corrected.h" +#include "Common/Core/RecoDecay.h" +#include "CommonConstants/MathConstants.h" +#include "FT0Base/Geometry.h" +#include "FV0Base/Geometry.h" +#include "PWGCF/DataModel/CorrelationsDerived.h" +#include "Common/DataModel/CollisionAssociationTables.h" +#include "PWGCF/Core/CorrelationContainer.h" +#include "PWGCF/Core/PairCuts.h" + +#include "CCDB/CcdbApi.h" +#include "CCDB/BasicCCDBManager.h" +#include "DetectorsCommonDataFormats/AlignParam.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::aod::track; +using namespace o2::aod::evsel; +using namespace o2::constants::math; + +static constexpr TrackSelectionFlags::flagtype TrackSelectionIts = + TrackSelectionFlags::kITSNCls | TrackSelectionFlags::kITSChi2NDF | + TrackSelectionFlags::kITSHits; +static constexpr TrackSelectionFlags::flagtype TrackSelectionTpc = + TrackSelectionFlags::kTPCNCls | + TrackSelectionFlags::kTPCCrossedRowsOverNCls | + TrackSelectionFlags::kTPCChi2NDF; +static constexpr TrackSelectionFlags::flagtype TrackSelectionDca = + TrackSelectionFlags::kDCAz | TrackSelectionFlags::kDCAxy; +static constexpr TrackSelectionFlags::flagtype TrackSelectionDcaxyOnly = + TrackSelectionFlags::kDCAxy; + +AxisSpec axisEvent{10, 0.5, 9.5, "#Event", "EventAxis"}; +AxisSpec amplitudeFT0{5000, 0, 10000, "FT0 amplitude"}; +AxisSpec channelFT0Axis{96, 0.0, 96.0, "FT0 channel"}; + +struct LongrangeCorrelation { + + struct : ConfigurableGroup { + Configurable cfgURL{"cfgURL", "http://alice-ccdb.cern.ch", "Address of the CCDB to browse"}; + Configurable noLaterThan{"noLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "Latest acceptable timestamp of creation for the object"}; + } cfgCcdbParam; + + SliceCache cache; + Service ccdb; + o2::ccdb::CcdbApi ccdbApi; + std::vector* offsetFT0; + HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + Configurable cfgVtxCut{"cfgVtxCut", 10.0f, "Vertex Z range to consider"}; + Configurable cfgEtaCut{"cfgEtaCut", 1.0f, "Eta range to consider"}; + Configurable dcaZ{"dcaZ", 0.2f, "Custom DCA Z cut (ignored if negative)"}; + Configurable cfgPtCutMin{"cfgPtCutMin", 0.2f, "minimum accepted track pT"}; + Configurable cfgPtCutMax{"cfgPtCutMax", 10.0f, "maximum accepted track pT"}; + Configurable mixingParameter{"mixingParameter", 5, "how many events are mixed"}; + Configurable cfgMinMult{"cfgMinMult", 0, "Minimum multiplicity for collision"}; + Configurable cfgMaxMult{"cfgMaxMult", 10, "Maximum multiplicity for collision"}; + Configurable cfgSampleSize{"cfgSampleSize", 10, "Sample size for mixed event"}; + ConfigurableAxis axisDeltaPhi{"axisDeltaPhi", {72, -PIHalf, PIHalf * 3}, "delta phi axis for histograms"}; + ConfigurableAxis axisDeltaEta{"axisDeltaEta", {40, -6, -2}, "delta eta axis for histograms"}; + ConfigurableAxis axisPtTrigger{"axisPtTrigger", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt trigger axis for histograms"}; + ConfigurableAxis axisPtAssoc{"axisPtAssoc", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt associated axis for histograms"}; + ConfigurableAxis axisMultME{"axisMultME", {VARIABLE_WIDTH, 0, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100}, "Mixing bins - multiplicity"}; + ConfigurableAxis axisVtxZME{"axisVtxZME", {VARIABLE_WIDTH, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "Mixing bins - z-vertex"}; + ConfigurableAxis axisVertexEfficiency{"axisVertexEfficiency", {10, -10, 10}, "vertex axis for efficiency histograms"}; + ConfigurableAxis axisEtaEfficiency{"axisEtaEfficiency", {20, -1.0, 1.0}, "eta axis for efficiency histograms"}; + ConfigurableAxis axisPtEfficiency{"axisPtEfficiency", {VARIABLE_WIDTH, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0}, "pt axis for efficiency histograms"}; + ConfigurableAxis axisVtxZ{"axisVtxZ", {40, -20, 20}, "vertex axis"}; + ConfigurableAxis axisPhi{"axisPhi", {96, 0, TwoPI}, "#phi axis"}; + ConfigurableAxis axisEtaTrig{"axisEtaTrig", {40, -1., 1.}, "#eta trig axis"}; + ConfigurableAxis axisEtaAssoc{"axisEtaAssoc", {96, 3.5, 4.9}, "#eta assoc axis"}; + ConfigurableAxis axisSample{"axisSample", {cfgSampleSize, 0, cfgSampleSize}, "sample axis for histograms"}; + ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100}, "multiplicity / centrality axis for histograms"}; + + using CollTable = soa::Join; + using TrksTable = soa::Filtered>; + Preslice perCollision = aod::track::collisionId; + + OutputObj same{Form("sameEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult))}; + OutputObj mixed{Form("mixedEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult))}; + + void init(InitContext const&) + { + ccdb->setURL(cfgCcdbParam.cfgURL); + ccdbApi.init("http://alice-ccdb.cern.ch"); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setCreatedNotAfter(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); + LOGF(info, "Getting alignment offsets from the CCDB..."); + offsetFT0 = ccdb->getForTimeStamp>("FT0/Calib/Align", cfgCcdbParam.noLaterThan.value); + LOGF(info, "Offset for FT0A: x = %.3f y = %.3f z = %.3f\n", (*offsetFT0)[0].getX(), (*offsetFT0)[0].getY(), (*offsetFT0)[0].getZ()); + LOGF(info, "Offset for FT0C: x = %.3f y = %.3f z = %.3f\n", (*offsetFT0)[1].getX(), (*offsetFT0)[1].getY(), (*offsetFT0)[1].getZ()); + + // QA histos + histos.add("QA/EventHist", "events", kTH1F, {axisEvent}, false); + histos.add("QA/VtxZHist", "v_{z} (cm)", kTH1F, {axisVtxZ}, false); + histos.add("QA/hMEpvz1", ";pvz;Entries", kTH1F, {{30, -15, 15}}); + histos.add("QA/hMEpvz2", ";pvz;Entries", kTH1F, {{30, -15, 15}}); + histos.add("QA/hMixingQA", "events", kTH1F, {axisEvent}, false); + + auto hstat = histos.get(HIST("QA/EventHist")); + auto* x = hstat->GetXaxis(); + x->SetBinLabel(1, "All events"); + x->SetBinLabel(2, "sel8"); + x->SetBinLabel(3, "|vz|<10"); + + histos.add("SE/hMult", "event multiplicity", kTH1D, {axisMultiplicity}); + histos.add("SE/Trig_etavsphi", ";#eta;#phi", kTH2D, {axisPhi, axisEtaTrig}); + histos.add("SE/Trig_eta", "#eta", kTH1D, {axisEtaTrig}); + histos.add("SE/Trig_phi", "#eta", kTH1D, {axisPhi}); + histos.add("SE/Trig_pt", "p_{T}", kTH1D, {axisPtTrigger}); + histos.add("SE/hMult_used", "event multiplicity", kTH1F, {axisMultiplicity}); + histos.add("SE/Trig_hist", "trig hist", kTHnSparseF, {axisSample, axisVtxZ, axisPtTrigger}); + histos.add("SE/FT0Amp", "ftoamult", kTH2D, {channelFT0Axis, amplitudeFT0}); + histos.add("SE/FT0Aeta", "ft0a;#eta", kTH1D, {axisEtaAssoc}); + histos.add("SE/FT0Aphi", "ft0a;#phi", kTH1D, {axisPhi}); + histos.add("SE/FT0Aetavsphi", ";ft0a;#eta;#phi", kTH2D, {axisPhi, axisEtaAssoc}); + histos.add("SE/deltaEta_deltaPhi", ";#delta#eta;#delta#phi", kTH2D, {axisDeltaPhi, axisDeltaEta}); + + histos.add("ME/hMult", "event multiplicity", kTH1D, {axisMultiplicity}); + histos.add("ME/Trig_etavsphi", ";#eta;#phi", kTH2D, {axisPhi, axisEtaTrig}); + histos.add("ME/Trig_eta", "#eta", kTH1D, {axisEtaTrig}); + histos.add("ME/Trig_phi", "#eta", kTH1D, {axisPhi}); + histos.add("ME/Trig_pt", "p_{T}", kTH1D, {axisPtTrigger}); + histos.add("ME/FT0Amp", "ftoamult", kTH2D, {channelFT0Axis, amplitudeFT0}); + histos.add("ME/FT0Aeta", "ft0a;#eta", kTH1D, {axisEtaAssoc}); + histos.add("ME/FT0Aphi", "ft0a;#phi", kTH1D, {axisPhi}); + histos.add("ME/FT0Aetavsphi", ";ft0a;#eta;#phi", kTH2D, {axisPhi, axisEtaAssoc}); + histos.add("ME/deltaEta_deltaPhi", ";#delta#eta;#delta#phi", kTH2D, {axisDeltaPhi, axisDeltaEta}); + + std::vector corrAxis = {{axisSample, "Sample"}, + {axisVtxZ, "z-vtx (cm)"}, + {axisPtTrigger, "p_{T} (GeV/c)"}, + {axisPtAssoc, "p_{T} (GeV/c)"}, + {axisDeltaPhi, "#Delta#varphi (rad)"}, + {axisDeltaEta, "#Delta#eta"}}; + std::vector effAxis = {{axisVertexEfficiency, "z-vtx (cm)"}, + {axisPtEfficiency, "p_{T} (GeV/c)"}, + {axisEtaEfficiency, "#eta"}}; + + std::vector userAxis; + + same.setObject(new CorrelationContainer(Form("sameEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult)), Form("sameEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult)), corrAxis, effAxis, userAxis)); + mixed.setObject(new CorrelationContainer(Form("mixedEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult)), Form("mixedEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult)), corrAxis, effAxis, userAxis)); + } + + double getPhiFT0(int chno, double offsetX, double offsetY) + { + o2::ft0::Geometry ft0Det; + ft0Det.calculateChannelCenter(); + auto chPos = ft0Det.getChannelCenter(chno); + return RecoDecay::phi(chPos.X() + offsetX, chPos.Y() + offsetY); + } + + double getEtaFT0(int chno, double offsetX, double offsetY, double offsetZ) + { + o2::ft0::Geometry ft0Det; + ft0Det.calculateChannelCenter(); + auto chPos = ft0Det.getChannelCenter(chno); + auto x = chPos.X() + offsetX; + auto y = chPos.Y() + offsetY; + auto z = chPos.Z() + offsetZ; + auto r = std::sqrt(x * x + y * y); + auto theta = std::atan2(r, z); + return -std::log(std::tan(0.5 * theta)); + } + + Filter fTrackSelectionITS = ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::ITS) && + ncheckbit(aod::track::trackCutFlag, TrackSelectionIts); + Filter fTrackSelectionTPC = ifnode(ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::TPC), + ncheckbit(aod::track::trackCutFlag, TrackSelectionTpc), true); + Filter fTrackSelectionDCA = ifnode(dcaZ.node() > 0.f, nabs(aod::track::dcaZ) <= dcaZ && ncheckbit(aod::track::trackCutFlag, TrackSelectionDcaxyOnly), + ncheckbit(aod::track::trackCutFlag, TrackSelectionDca)); + Filter fTracksEta = nabs(aod::track::eta) < cfgEtaCut; + Filter fTracksPt = (aod::track::pt > cfgPtCutMin) && (aod::track::pt < cfgPtCutMax); + + template + bool isEventSelected(CheckCol const& col) + { + histos.fill(HIST("QA/EventHist"), 1); + if (!col.sel8()) { + return false; + } + histos.fill(HIST("QA/EventHist"), 2); + if (std::abs(col.posZ()) >= cfgVtxCut) { + return false; + } + histos.fill(HIST("QA/EventHist"), 3); + histos.fill(HIST("QA/VtxZHist"), col.posZ()); + return true; + } + + template + void fillYield(TTracks tracks, bool mixing) + { + if (mixing) { + histos.fill(HIST("ME/hMult"), tracks.size()); + for (auto const& triggerTrack : tracks) { + histos.fill(HIST("ME/Trig_etavsphi"), triggerTrack.phi(), triggerTrack.eta()); + histos.fill(HIST("ME/Trig_eta"), triggerTrack.eta()); + histos.fill(HIST("ME/Trig_phi"), triggerTrack.phi()); + histos.fill(HIST("ME/Trig_pt"), triggerTrack.pt()); + } + } else { + histos.fill(HIST("SE/hMult"), tracks.size()); + for (auto const& triggerTrack : tracks) { + histos.fill(HIST("SE/Trig_etavsphi"), triggerTrack.phi(), triggerTrack.eta()); + histos.fill(HIST("SE/Trig_eta"), triggerTrack.eta()); + histos.fill(HIST("SE/Trig_phi"), triggerTrack.phi()); + histos.fill(HIST("SE/Trig_pt"), triggerTrack.pt()); + } + } + } + + template + void fillCorrelation(TTarget target, TTriggers const& triggers, TFT0s const& ft0, bool mixing, float vz) + { + int fSampleIndex = gRandom->Uniform(0, cfgSampleSize); + if (!mixing) + histos.fill(HIST("SE/hMult_used"), triggers.size()); + for (auto const& triggerTrack : triggers) { + if (!mixing) + histos.fill(HIST("SE/Trig_hist"), fSampleIndex, vz, triggerTrack.pt()); + + auto offsetFT0Ax = (*offsetFT0)[0].getX(); + auto offsetFT0Ay = (*offsetFT0)[0].getY(); + auto offsetFT0Az = (*offsetFT0)[0].getZ(); + for (std::size_t iChA = 0; iChA < ft0.channelA().size(); iChA++) { + auto chanelid = ft0.channelA()[iChA]; + float ampl = ft0.amplitudeA()[iChA]; + if (ampl <= 0) + continue; + if (mixing) + histos.fill(HIST("ME/FT0Amp"), chanelid, ampl); + else + histos.fill(HIST("SE/FT0Amp"), chanelid, ampl); + + auto phiA = getPhiFT0(chanelid, offsetFT0Ax, offsetFT0Ay); + auto etaA = getEtaFT0(chanelid, offsetFT0Ax, offsetFT0Ay, offsetFT0Az); + + if (mixing) { + histos.fill(HIST("ME/FT0Aeta"), etaA); + histos.fill(HIST("ME/FT0Aphi"), phiA); + histos.fill(HIST("ME/FT0Aetavsphi"), phiA, etaA); + } else { + histos.fill(HIST("SE/FT0Aeta"), etaA); + histos.fill(HIST("SE/FT0Aphi"), phiA); + histos.fill(HIST("SE/FT0Aetavsphi"), phiA, etaA); + } + float deltaPhi = RecoDecay::constrainAngle(triggerTrack.phi() - phiA, -PIHalf); + float deltaEta = triggerTrack.eta() - etaA; + if (mixing) + histos.fill(HIST("ME/deltaEta_deltaPhi"), deltaPhi, deltaEta); + else + histos.fill(HIST("SE/deltaEta_deltaPhi"), deltaPhi, deltaEta); + target->getPairHist()->Fill(step, fSampleIndex, vz, triggerTrack.pt(), triggerTrack.pt(), deltaPhi, deltaEta); + } // associated ft0 tracks + } // trigger tracks + } // fillCorrelation + + void processSE(CollTable::iterator const& col, aod::FT0s const&, TrksTable const& tracks) + { + if (!isEventSelected(col)) { + return; + } + if (col.has_foundFT0()) { + fillYield(tracks, false); + const auto& ft0 = col.foundFT0(); + if (tracks.size() < cfgMinMult || tracks.size() >= cfgMaxMult) { + return; + } + fillCorrelation(same, tracks, ft0, false, col.posZ()); + } + } // same event + + void processME(CollTable const& col, aod::FT0s const&, TrksTable const& tracks) + { + auto getTracksSize = [&tracks, this](CollTable::iterator const& collision) { + auto associatedTracks = tracks.sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), this->cache); + return associatedTracks.size(); + }; + using MixedBinning = FlexibleBinningPolicy, aod::collision::PosZ, decltype(getTracksSize)>; + MixedBinning binningOnVtxAndMult{{getTracksSize}, {axisVtxZME, axisMultME}, true}; + for (auto const& [col1, col2] : soa::selfCombinations(binningOnVtxAndMult, mixingParameter, -1, col, col)) { + if (!isEventSelected(col1) || !isEventSelected(col2)) { + continue; + } + if (col1.globalIndex() == col2.globalIndex()) { + histos.fill(HIST("QA/hMixingQA"), 1.0); // same-collision pair counting + continue; + } + if (col1.has_foundFT0() && col2.has_foundFT0()) { + histos.fill(HIST("QA/hMEpvz1"), col1.posZ()); + histos.fill(HIST("QA/hMEpvz2"), col2.posZ()); + auto slicedTriggerTracks = tracks.sliceBy(perCollision, col1.globalIndex()); + fillYield(slicedTriggerTracks, true); + const auto& ft0 = col2.foundFT0(); + if (slicedTriggerTracks.size() < cfgMinMult || slicedTriggerTracks.size() >= cfgMaxMult) { + continue; + } + fillCorrelation(mixed, slicedTriggerTracks, ft0, true, col1.posZ()); + } + } + } // mixed event + + PROCESS_SWITCH(LongrangeCorrelation, processSE, "process same event", false); + PROCESS_SWITCH(LongrangeCorrelation, processME, "process mixed event", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} From 5f1ddc7bfd68c14be806fa25f1bb4392632ce72f Mon Sep 17 00:00:00 2001 From: Rik Spijkers <78484875+rspijkers@users.noreply.github.com> Date: Sat, 24 May 2025 00:25:08 +0200 Subject: [PATCH 1398/1650] [PWGLF] add eta and primary cut to mc closure (#11337) --- .../Tasks/Strangeness/cascadecorrelations.cxx | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx b/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx index 5c07269caed..8461e713543 100644 --- a/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx +++ b/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx @@ -521,6 +521,11 @@ struct CascadeCorrelations { {"MC/hGenMultNoReco", "hGenMultNoReco", {HistType::kTH1I, {{100, 0, 100, "Number of generated charged primaries"}}}}, {"MC/hGenMultOneReco", "hGenMultOneReco", {HistType::kTH1I, {{100, 0, 100, "Number of generated charged primaries"}}}}, {"MC/hSplitEvents", "hSplitEvents", {HistType::kTH1I, {{10, 0, 10, "Number of rec. events per gen event"}}}}, + + // debug + {"MC/hPhi", "hPhi", {HistType::kTH1F, {{180, 0, TwoPI}}}}, + {"MC/hEta", "hEta", {HistType::kTH1F, {{100, -2, 2}}}}, + {"MC/hRapidity", "hRapidity", {HistType::kTH1F, {{100, -2, 2}}}}, }, }; @@ -924,7 +929,8 @@ struct CascadeCorrelations { } // collisions } // process mixed events - Filter genCascadesFilter = nabs(aod::mcparticle::pdgCode) == 3312; + Configurable etaGenCascades{"etaGenCascades", 0.8, "min/max of eta for generated cascades"}; + Filter genCascadesFilter = (nabs(aod::mcparticle::pdgCode) == 3312 && nabs(aod::mcparticle::eta) < etaGenCascades); void processMC(aod::McCollision const&, soa::SmallGroups> const& collisions, soa::Filtered const& genCascades, aod::McParticles const& mcParticles) { @@ -947,6 +953,15 @@ struct CascadeCorrelations { return; } + // QA + for (auto& casc : genCascades) { + if (!casc.isPhysicalPrimary()) + continue; + registry.fill(HIST("MC/hPhi"), casc.phi()); + registry.fill(HIST("MC/hEta"), casc.eta()); + registry.fill(HIST("MC/hRapidity"), casc.y()); + } + for (auto& [c0, c1] : combinations(genCascades, genCascades)) { // combinations automatically applies strictly upper in case of 2 identical tables // Define the trigger as the particle with the highest pT. As we can't swap the cascade tables themselves, we swap the addresses and later dereference them auto* triggerAddress = &c0; @@ -959,6 +974,9 @@ struct CascadeCorrelations { double dphi = RecoDecay::constrainAngle(trigger.phi() - assoc.phi(), -PIHalf); + if (!trigger.isPhysicalPrimary() || !assoc.isPhysicalPrimary()) + continue; // require the cascades to be primaries + if (trigger.pdgCode() < 0) { // anti-trigg --> Plus if (assoc.pdgCode() < 0) { // anti-assoc --> Plus registry.fill(HIST("MC/hMCPlusPlus"), dphi, trigger.y() - assoc.y(), trigger.pt(), assoc.pt(), vtxz, FT0mult); From 888bb31f19d7dbb23ef75c0e8d696c18e714d849 Mon Sep 17 00:00:00 2001 From: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> Date: Sat, 24 May 2025 03:31:24 +0200 Subject: [PATCH 1399/1650] [PWGLF] Add lifetime preselection + QA histogram in strangenessbuilder (#11340) --- .../Strangeness/strangenessbuilder.cxx | 241 ++++++++++++++---- 1 file changed, 195 insertions(+), 46 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx index f2cf77403be..ecc0136a438 100644 --- a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx @@ -149,6 +149,9 @@ using TracksWithExtra = soa::Join; // For dE/dx association in pre-selection using TracksExtraWithPID = soa::Join; +// simple checkers, but ensure 8 bit integers +#define BITSET(var, nbit) ((var) |= (static_cast(1) << static_cast(nbit))) + struct StrangenessBuilder { // helper object o2::pwglf::strangenessBuilderHelper straHelper; @@ -193,6 +196,16 @@ struct StrangenessBuilder { kCascFoundTags, nTables }; + enum V0PreSelection : uint8_t { selGamma = 0, + selK0Short, + selLambda, + selAntiLambda }; + + enum CascPreSelection : uint8_t { selXiMinus = 0, + selXiPlus, + selOmegaMinus, + selOmegaPlus }; + struct : ProducesGroup { //__________________________________________________ // V0 tables @@ -356,12 +369,24 @@ struct StrangenessBuilder { static constexpr float defaultLambdaWindowParameters[1][4] = {{1.17518e-03, 1.24099e-04, 5.47937e-03, 3.08009e-01}}; static constexpr float defaultXiMassWindowParameters[1][4] = {{1.43210e-03, 2.03561e-04, 2.43187e-03, 7.99668e-01}}; static constexpr float defaultOmMassWindowParameters[1][4] = {{1.43210e-03, 2.03561e-04, 2.43187e-03, 7.99668e-01}}; + + static constexpr float defaultLifetimeCuts[1][4] = {{20, 60, 40, 20}}; + // preselection options struct : ConfigurableGroup { std::string prefix = "preSelectOpts"; Configurable preselectOnlyDesiredV0s{"preselectOnlyDesiredV0s", false, "preselect only V0s with compatible TPC PID and mass info"}; Configurable preselectOnlyDesiredCascades{"preselectOnlyDesiredCascades", false, "preselect only Cascades with compatible TPC PID and mass info"}; + // lifetime preselection options + // apply lifetime cuts to V0 and cascade candidates + // unit of measurement: centimeters + // lifetime of K0Short ~2.6844 cm, no feeddown and plenty to cut + // lifetime of Lambda ~7.9 cm but keep in mind feeddown from cascades + // lifetime of Xi ~4.91 cm + // lifetime of Omega ~2.461 cm + Configurable> lifetimeCut{"lifetimeCut", {defaultLifetimeCuts[0], 4, {"lifetimeCutK0S", "lifetimeCutLambda", "lifetimeCutXi", "lifetimeCutOmega"}}, "Lifetime cut for V0s and cascades (cm)"}; + // mass preselection options Configurable massCutPhoton{"massCutPhoton", 0.3, "Photon max mass"}; Configurable> massCutK0{"massCutK0", {defaultK0MassWindowParameters[0], 4, {"constant", "linear", "expoConstant", "expoRelax"}}, "mass parameters for K0"}; @@ -514,6 +539,46 @@ struct StrangenessBuilder { hDeduplicationStatistics->GetXaxis()->SetBinLabel(2, "Deduplicated V0s"); } + if (preSelectOpts.preselectOnlyDesiredV0s.value == true) { + auto hPreselectionV0s = histos.add("hPreselectionV0s", "hPreselectionV0s", kTH1D, {{16, -0.5f, 15.5f}}); + hPreselectionV0s->GetXaxis()->SetBinLabel(1, "Not preselected"); + hPreselectionV0s->GetXaxis()->SetBinLabel(2, "#gamma"); + hPreselectionV0s->GetXaxis()->SetBinLabel(3, "K^{0}_{S}"); + hPreselectionV0s->GetXaxis()->SetBinLabel(4, "#gamma, K^{0}_{S}"); + hPreselectionV0s->GetXaxis()->SetBinLabel(5, "#Lambda"); + hPreselectionV0s->GetXaxis()->SetBinLabel(6, "#gamma, #Lambda"); + hPreselectionV0s->GetXaxis()->SetBinLabel(7, "K^{0}_{S}, #Lambda"); + hPreselectionV0s->GetXaxis()->SetBinLabel(8, "#gamma, K^{0}_{S}, #Lambda"); + hPreselectionV0s->GetXaxis()->SetBinLabel(9, "#bar{#Lambda}"); + hPreselectionV0s->GetXaxis()->SetBinLabel(10, "#gamma, #bar{#Lambda}"); + hPreselectionV0s->GetXaxis()->SetBinLabel(11, "K^{0}_{S}, #bar{#Lambda}"); + hPreselectionV0s->GetXaxis()->SetBinLabel(12, "#gamma, K^{0}_{S}, #bar{#Lambda}"); + hPreselectionV0s->GetXaxis()->SetBinLabel(13, "#Lambda, #bar{#Lambda}"); + hPreselectionV0s->GetXaxis()->SetBinLabel(14, "#gamma, #Lambda, #bar{#Lambda}"); + hPreselectionV0s->GetXaxis()->SetBinLabel(15, "K^{0}_{S}, #Lambda, #bar{#Lambda}"); + hPreselectionV0s->GetXaxis()->SetBinLabel(16, "#gamma, K^{0}_{S}, #Lambda, #bar{#Lambda}"); + } + + if (preSelectOpts.preselectOnlyDesiredCascades.value == true) { + auto hPreselectionCascades = histos.add("hPreselectionCascades", "hPreselectionCascades", kTH1D, {{16, -0.5f, 15.5f}}); + hPreselectionCascades->GetXaxis()->SetBinLabel(1, "Not preselected"); + hPreselectionCascades->GetXaxis()->SetBinLabel(2, "#Xi^{-}"); + hPreselectionCascades->GetXaxis()->SetBinLabel(3, "#Xi^{+}"); + hPreselectionCascades->GetXaxis()->SetBinLabel(4, "#Xi^{-}, #Xi^{+}"); + hPreselectionCascades->GetXaxis()->SetBinLabel(5, "#Omega^{-}"); + hPreselectionCascades->GetXaxis()->SetBinLabel(6, "#Xi^{-}, #Omega^{-}"); + hPreselectionCascades->GetXaxis()->SetBinLabel(7, "#Xi^{+}, #Omega^{-}"); + hPreselectionCascades->GetXaxis()->SetBinLabel(8, "#Xi^{-}, #Xi^{+}, #Omega^{-}"); + hPreselectionCascades->GetXaxis()->SetBinLabel(9, "#Omega^{+}"); + hPreselectionCascades->GetXaxis()->SetBinLabel(10, "#Xi^{-}, #Omega^{+}"); + hPreselectionCascades->GetXaxis()->SetBinLabel(11, "#Xi^{+}, #Omega^{+}"); + hPreselectionCascades->GetXaxis()->SetBinLabel(12, "#Xi^{-}, #Xi^{+}, #Omega^{+}"); + hPreselectionCascades->GetXaxis()->SetBinLabel(13, "#Omega^{-}, #Omega^{+}"); + hPreselectionCascades->GetXaxis()->SetBinLabel(14, "#Xi^{-}, #Omega^{-}, #Omega^{+}"); + hPreselectionCascades->GetXaxis()->SetBinLabel(15, "#Xi^{+}, #Omega^{-}, #Omega^{+}"); + hPreselectionCascades->GetXaxis()->SetBinLabel(16, "#Xi^{-}, #Xi^{+}, #Omega^{-}, #Omega^{+}"); + } + if (mc_findableMode.value > 0) { // save statistics of findable candidate processing auto hFindable = histos.add("hFindableStatistics", "hFindableStatistics", kTH1D, {{6, -0.5f, 5.5f}}); @@ -648,6 +713,11 @@ struct StrangenessBuilder { straHelper.cascadeselections.maxDaughterEta = cascadeBuilderOpts.maxDaughterEta; } + bool verifyMask(uint8_t bitmap, uint8_t mask) + { + return (bitmap & mask) == mask; + } + // for sorting template std::vector sort_indices(const std::vector& v, bool doSorting = false) @@ -1367,23 +1437,55 @@ struct StrangenessBuilder { straHelper.v0.positiveMomentum[0] + straHelper.v0.negativeMomentum[0], straHelper.v0.positiveMomentum[1] + straHelper.v0.negativeMomentum[1]); - if ( - !( // photon PID and mass selection - std::abs(posTrack.tpcNSigmaEl()) < preSelectOpts.maxTPCpidNsigma && - std::abs(negTrack.tpcNSigmaEl()) < preSelectOpts.maxTPCpidNsigma && - std::abs(straHelper.v0.massGamma) < preSelectOpts.massCutPhoton) && - !( // K0Short PID and mass selection - std::abs(posTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && - std::abs(negTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && - std::abs(straHelper.v0.massK0Short - o2::constants::physics::MassKaonNeutral) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaK0Short(lPt) + preSelectOpts.massWindowSafetyMargin) && - !( // Lambda PID and mass selection - std::abs(posTrack.tpcNSigmaPr()) < preSelectOpts.maxTPCpidNsigma && - std::abs(negTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && - std::abs(straHelper.v0.massLambda - o2::constants::physics::MassLambda) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaLambda(lPt) + preSelectOpts.massWindowSafetyMargin) && - !( // antiLambda PID and mass selection - std::abs(posTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && - std::abs(negTrack.tpcNSigmaPr()) < preSelectOpts.maxTPCpidNsigma && - std::abs(straHelper.v0.massAntiLambda - o2::constants::physics::MassLambda) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaLambda(lPt) + preSelectOpts.massWindowSafetyMargin)) { + float lPtot = RecoDecay::sqrtSumOfSquares( + straHelper.v0.positiveMomentum[0] + straHelper.v0.negativeMomentum[0], + straHelper.v0.positiveMomentum[1] + straHelper.v0.negativeMomentum[1], + straHelper.v0.positiveMomentum[2] + straHelper.v0.negativeMomentum[2]); + + float lLengthTraveled = RecoDecay::sqrtSumOfSquares( + straHelper.v0.position[0] - pvX, + straHelper.v0.position[1] - pvY, + straHelper.v0.position[2] - pvZ); + + uint8_t maskV0Preselection = 0; + + if ( // photon PID, mass, lifetime selection + std::abs(posTrack.tpcNSigmaEl()) < preSelectOpts.maxTPCpidNsigma && + std::abs(negTrack.tpcNSigmaEl()) < preSelectOpts.maxTPCpidNsigma && + std::abs(straHelper.v0.massGamma) < preSelectOpts.massCutPhoton) { + BITSET(maskV0Preselection, selGamma); + } + + if ( // K0Short PID, mass, lifetime selection + std::abs(posTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && + std::abs(negTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && + o2::constants::physics::MassKaonNeutral * lLengthTraveled / (lPtot + 1e-13) < preSelectOpts.lifetimeCut->get("lifetimeCutK0S") && + std::abs(straHelper.v0.massK0Short - o2::constants::physics::MassKaonNeutral) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaK0Short(lPt) + preSelectOpts.massWindowSafetyMargin) { + BITSET(maskV0Preselection, selK0Short); + } + + if ( // Lambda PID, mass, lifetime selection + std::abs(posTrack.tpcNSigmaPr()) < preSelectOpts.maxTPCpidNsigma && + std::abs(negTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && + o2::constants::physics::MassLambda * lLengthTraveled / (lPtot + 1e-13) < preSelectOpts.lifetimeCut->get("lifetimeCutLambda") && + std::abs(straHelper.v0.massLambda - o2::constants::physics::MassLambda) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaLambda(lPt) + preSelectOpts.massWindowSafetyMargin) { + BITSET(maskV0Preselection, selLambda); + } + + if ( // antiLambda PID, mass, lifetime selection + std::abs(posTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && + std::abs(negTrack.tpcNSigmaPr()) < preSelectOpts.maxTPCpidNsigma && + o2::constants::physics::MassLambda * lLengthTraveled / (lPtot + 1e-13) < preSelectOpts.lifetimeCut->get("lifetimeCutLambda") && + std::abs(straHelper.v0.massAntiLambda - o2::constants::physics::MassLambda) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaLambda(lPt) + preSelectOpts.massWindowSafetyMargin) { + BITSET(maskV0Preselection, selAntiLambda); + } + + histos.fill(HIST("hPreselectionV0s"), maskV0Preselection); + + if (!verifyMask(maskV0Preselection, selGamma) && + !verifyMask(maskV0Preselection, selK0Short) && + !verifyMask(maskV0Preselection, selLambda) && + !verifyMask(maskV0Preselection, selAntiLambda)) { products.v0dataLink(-1, -1); continue; } @@ -1871,35 +1973,82 @@ struct StrangenessBuilder { if constexpr (requires { posTrack.tpcNSigmaEl(); }) { if (preSelectOpts.preselectOnlyDesiredCascades) { - if ( - float lPt = RecoDecay::sqrtSumOfSquares( - straHelper.cascade.bachelorMomentum[0] + straHelper.cascade.positiveMomentum[0] + straHelper.cascade.negativeMomentum[0], - straHelper.cascade.bachelorMomentum[1] + straHelper.cascade.positiveMomentum[1] + straHelper.cascade.negativeMomentum[1]); - - !( // XiMinus PID and mass selection - straHelper.cascade.charge < 0 && - std::abs(posTrack.tpcNSigmaPr()) < preSelectOpts.maxTPCpidNsigma && - std::abs(negTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && - std::abs(bachTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && - std::abs(straHelper.cascade.massXi - o2::constants::physics::MassXiMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaXi(lPt) + preSelectOpts.massWindowSafetyMargin) && - !( // XiPlus PID and mass selection - straHelper.cascade.charge > 0 && - std::abs(posTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && - std::abs(negTrack.tpcNSigmaPr()) < preSelectOpts.maxTPCpidNsigma && - std::abs(bachTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && - std::abs(straHelper.cascade.massXi - o2::constants::physics::MassXiMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaXi(lPt) + preSelectOpts.massWindowSafetyMargin) && - !( // OmegaMinus PID and mass selection - straHelper.cascade.charge < 0 && - std::abs(posTrack.tpcNSigmaPr()) < preSelectOpts.maxTPCpidNsigma && - std::abs(negTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && - std::abs(bachTrack.tpcNSigmaKa()) < preSelectOpts.maxTPCpidNsigma && - std::abs(straHelper.cascade.massOmega - o2::constants::physics::MassOmegaMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaOmega(lPt) + preSelectOpts.massWindowSafetyMargin) && - !( // OmegaPlus PID and mass selection - straHelper.cascade.charge > 0 && - std::abs(posTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && - std::abs(negTrack.tpcNSigmaPr()) < preSelectOpts.maxTPCpidNsigma && - std::abs(bachTrack.tpcNSigmaKa()) < preSelectOpts.maxTPCpidNsigma && - std::abs(straHelper.cascade.massOmega - o2::constants::physics::MassOmegaMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaOmega(lPt) + preSelectOpts.massWindowSafetyMargin)) { + float lPt = RecoDecay::sqrtSumOfSquares( + straHelper.cascade.bachelorMomentum[0] + straHelper.cascade.positiveMomentum[0] + straHelper.cascade.negativeMomentum[0], + straHelper.cascade.bachelorMomentum[1] + straHelper.cascade.positiveMomentum[1] + straHelper.cascade.negativeMomentum[1]); + + float lPtot = RecoDecay::sqrtSumOfSquares( + straHelper.cascade.bachelorMomentum[0] + straHelper.cascade.positiveMomentum[0] + straHelper.cascade.negativeMomentum[0], + straHelper.cascade.bachelorMomentum[1] + straHelper.cascade.positiveMomentum[1] + straHelper.cascade.negativeMomentum[1], + straHelper.cascade.bachelorMomentum[2] + straHelper.cascade.positiveMomentum[2] + straHelper.cascade.negativeMomentum[2]); + + float lV0Ptot = RecoDecay::sqrtSumOfSquares( + straHelper.cascade.positiveMomentum[0] + straHelper.cascade.negativeMomentum[0], + straHelper.cascade.positiveMomentum[1] + straHelper.cascade.negativeMomentum[1], + straHelper.cascade.positiveMomentum[2] + straHelper.cascade.negativeMomentum[2]); + + float lLengthTraveled = RecoDecay::sqrtSumOfSquares( + straHelper.cascade.cascadePosition[0] - pvX, + straHelper.cascade.cascadePosition[1] - pvY, + straHelper.cascade.cascadePosition[2] - pvZ); + + float lV0LengthTraveled = RecoDecay::sqrtSumOfSquares( + straHelper.cascade.v0Position[0] - straHelper.cascade.cascadePosition[0], + straHelper.cascade.v0Position[1] - straHelper.cascade.cascadePosition[1], + straHelper.cascade.v0Position[2] - straHelper.cascade.cascadePosition[2]); + + uint8_t maskCascadePreselection = 0; + + if ( // XiMinus PID and mass selection + straHelper.cascade.charge < 0 && + std::abs(posTrack.tpcNSigmaPr()) < preSelectOpts.maxTPCpidNsigma && + std::abs(negTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && + std::abs(bachTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && + o2::constants::physics::MassLambda * lV0LengthTraveled / (lV0Ptot + 1e-13) < preSelectOpts.lifetimeCut->get("lifetimeCutLambda") && + o2::constants::physics::MassXiMinus * lLengthTraveled / (lPtot + 1e-13) < preSelectOpts.lifetimeCut->get("lifetimeCutXi") && + std::abs(straHelper.cascade.massXi - o2::constants::physics::MassXiMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaXi(lPt) + preSelectOpts.massWindowSafetyMargin) { + BITSET(maskCascadePreselection, selXiMinus); + } + + if ( // XiPlus PID and mass selection + straHelper.cascade.charge > 0 && + std::abs(posTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && + std::abs(negTrack.tpcNSigmaPr()) < preSelectOpts.maxTPCpidNsigma && + std::abs(bachTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && + o2::constants::physics::MassLambda * lV0LengthTraveled / (lV0Ptot + 1e-13) < preSelectOpts.lifetimeCut->get("lifetimeCutLambda") && + o2::constants::physics::MassXiMinus * lLengthTraveled / (lPtot + 1e-13) < preSelectOpts.lifetimeCut->get("lifetimeCutXi") && + std::abs(straHelper.cascade.massXi - o2::constants::physics::MassXiMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaXi(lPt) + preSelectOpts.massWindowSafetyMargin) { + BITSET(maskCascadePreselection, selXiPlus); + } + + if ( // OmegaMinus PID and mass selection + straHelper.cascade.charge < 0 && + std::abs(posTrack.tpcNSigmaPr()) < preSelectOpts.maxTPCpidNsigma && + std::abs(negTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && + std::abs(bachTrack.tpcNSigmaKa()) < preSelectOpts.maxTPCpidNsigma && + o2::constants::physics::MassLambda * lV0LengthTraveled / (lV0Ptot + 1e-13) < preSelectOpts.lifetimeCut->get("lifetimeCutLambda") && + o2::constants::physics::MassOmegaMinus * lLengthTraveled / (lPtot + 1e-13) < preSelectOpts.lifetimeCut->get("lifetimeCutOmega") && + std::abs(straHelper.cascade.massOmega - o2::constants::physics::MassOmegaMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaOmega(lPt) + preSelectOpts.massWindowSafetyMargin) { + BITSET(maskCascadePreselection, selOmegaMinus); + } + + if ( // OmegaPlus PID and mass selection + straHelper.cascade.charge > 0 && + std::abs(posTrack.tpcNSigmaPi()) < preSelectOpts.maxTPCpidNsigma && + std::abs(negTrack.tpcNSigmaPr()) < preSelectOpts.maxTPCpidNsigma && + std::abs(bachTrack.tpcNSigmaKa()) < preSelectOpts.maxTPCpidNsigma && + o2::constants::physics::MassLambda * lV0LengthTraveled / (lV0Ptot + 1e-13) < preSelectOpts.lifetimeCut->get("lifetimeCutLambda") && + o2::constants::physics::MassOmegaMinus * lLengthTraveled / (lPtot + 1e-13) < preSelectOpts.lifetimeCut->get("lifetimeCutOmega") && + std::abs(straHelper.cascade.massOmega - o2::constants::physics::MassOmegaMinus) < preSelectOpts.massWindownumberOfSigmas * getMassSigmaOmega(lPt) + preSelectOpts.massWindowSafetyMargin) { + BITSET(maskCascadePreselection, selOmegaPlus); + } + + histos.fill(HIST("hPreselectionCascades"), maskCascadePreselection); + + if (!verifyMask(maskCascadePreselection, selXiMinus) && + !verifyMask(maskCascadePreselection, selXiPlus) && + !verifyMask(maskCascadePreselection, selOmegaMinus) && + !verifyMask(maskCascadePreselection, selOmegaPlus)) { products.cascdataLink(-1); interlinks.cascadeToCascCores.push_back(-1); continue; From cec6a4e685a5ffe643b6271b9137b4c6c4411fd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Sat, 24 May 2025 09:08:50 +0200 Subject: [PATCH 1400/1650] [ALICE3] A3 FastTracker: updated data member protection (#11307) --- ALICE3/Core/FastTracker.cxx | 5 +- ALICE3/Core/FastTracker.h | 71 ++++++++++++++------ ALICE3/TableProducer/OTF/CMakeLists.txt | 2 +- ALICE3/TableProducer/OTF/onTheFlyTracker.cxx | 20 +++--- 4 files changed, 64 insertions(+), 34 deletions(-) diff --git a/ALICE3/Core/FastTracker.cxx b/ALICE3/Core/FastTracker.cxx index 977d80ff547..6b22461c187 100644 --- a/ALICE3/Core/FastTracker.cxx +++ b/ALICE3/Core/FastTracker.cxx @@ -10,6 +10,7 @@ // or submit itself to any jurisdiction. #include +#include #include "TMath.h" #include "TMatrixD.h" #include "TRandom.h" @@ -214,7 +215,7 @@ float FastTracker::Dist(float z, float r) if (i == nSteps - 1) index = 1; z0 = -4 * sigmaD + i * dz0; - dist += index * (dz0 / 3.) * (1 / o2::math_utils::sqrt(o2::constants::math::TwoPI) / sigmaD) * exp(-z0 * z0 / 2. / sigmaD / sigmaD) * (1 / o2::math_utils::sqrt((z - z0) * (z - z0) + r * r)); + dist += index * (dz0 / 3.) * (1 / o2::math_utils::sqrt(o2::constants::math::TwoPI) / sigmaD) * std::exp(-z0 * z0 / 2. / sigmaD / sigmaD) * (1 / o2::math_utils::sqrt((z - z0) * (z - z0) + r * r)); if (index != 4) index = 4; else @@ -295,7 +296,7 @@ float FastTracker::ProbGoodChiSqHit(float radius, float searchRadiusRPhi, float // function to provide a reconstructed track from a perfect input track // returns number of intercepts (generic for now) -int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackParCov& outputTrack, float nch) +int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackParCov& outputTrack, const float nch) { hits.clear(); nIntercepts = 0; diff --git a/ALICE3/Core/FastTracker.h b/ALICE3/Core/FastTracker.h index aad0c7d51b3..f88b6c5ae85 100644 --- a/ALICE3/Core/FastTracker.h +++ b/ALICE3/Core/FastTracker.h @@ -14,6 +14,7 @@ #include // not a system header but megalinter thinks so #include +#include #include "DetLayer.h" #include "ReconstructionDataFormats/Track.h" @@ -34,16 +35,38 @@ class FastTracker FastTracker(); virtual ~FastTracker() {} + // Layer and layer configuration void AddLayer(TString name, float r, float z, float x0, float xrho, float resRPhi = 0.0f, float resZ = 0.0f, float eff = 0.0f, int type = 0); DetLayer GetLayer(const int layer, bool ignoreBarrelLayers = true) const; int GetLayerIndex(const std::string name) const; + void SetRadiationLength(const std::string layerName, float x0) { layers[GetLayerIndex(layerName)].x0 = x0; } + void SetRadius(const std::string layerName, float r) { layers[GetLayerIndex(layerName)].r = r; } + void SetResolutionRPhi(const std::string layerName, float resRPhi) { layers[GetLayerIndex(layerName)].resRPhi = resRPhi; } + void SetResolutionZ(const std::string layerName, float resZ) { layers[GetLayerIndex(layerName)].resZ = resZ; } + void SetResolution(const std::string layerName, float resRPhi, float resZ) + { + SetResolutionRPhi(layerName, resRPhi); + SetResolutionZ(layerName, resZ); + } void AddSiliconALICE3v4(std::vector pixelResolution); void AddSiliconALICE3v2(std::vector pixelResolution); void AddTPC(float phiResMean, float zResMean); void Print(); - int FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackParCov& outputTrack, float nch); + + /** + * @brief Performs fast tracking on the input track parameters. + * + * Propagates the given input track through the detector layers, applying + * relevant corrections and updates, and stores the result in outputTrack. + * + * @param inputTrack The input track parameters and covariance (const, by value). + * @param outputTrack Reference to the output track parameters and covariance, to be filled. + * @param nch Charged particle multiplicity (used for hit density calculations). + * @return int i.e. number of intercepts (implementation-defined). + */ + int FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackParCov& outputTrack, const float nch); // For efficiency calculation float Dist(float z, float radius); @@ -53,18 +76,35 @@ class FastTracker float HitDensity(float radius); float ProbGoodChiSqHit(float radius, float searchRadiusRPhi, float searchRadiusZ); + // Setters and getters for configuration + void SetIntegrationTime(float t) { integrationTime = t; } + void SetMaxRadiusOfSlowDetectors(float r) { maxRadiusSlowDet = r; } + void SetAvgRapidity(float y) { avgRapidity = y; } + void SetdNdEtaCent(float d) { dNdEtaCent = d; } + void SetLhcUPCscale(float s) { lhcUPCScale = s; } + void SetBField(float b) { magneticField = b; } + void SetMinRadTrack(float r) { fMinRadTrack = r; } + void SetMagneticField(float b) { magneticField = b; } + void SetApplyZacceptance(bool b) { applyZacceptance = b; } + void SetApplyMSCorrection(bool b) { applyMSCorrection = b; } + void SetApplyElossCorrection(bool b) { applyElossCorrection = b; } + + // Getters for the last track + int GetNIntercepts() const { return nIntercepts; } + int GetNSiliconPoints() const { return nSiliconPoints; } + int GetNGasPoints() const { return nGasPoints; } + float GetGoodHitProb(int layer) const { return goodHitProbability[layer]; } + std::size_t GetNHits() const { return hits.size(); } + float GetHitX(const int i) const { return hits[i][0]; } + float GetHitY(const int i) const { return hits[i][1]; } + float GetHitZ(const int i) const { return hits[i][2]; } + uint64_t GetCovMatOK() const { return covMatOK; } + uint64_t GetCovMatNotOK() const { return covMatNotOK; } + + private: // Definition of detector layers std::vector layers; std::vector> hits; // bookkeep last added hits - void SetRadiationLength(const std::string layerName, float x0) { layers[GetLayerIndex(layerName)].x0 = x0; } - void SetRadius(const std::string layerName, float r) { layers[GetLayerIndex(layerName)].r = r; } - void SetResolutionRPhi(const std::string layerName, float resRPhi) { layers[GetLayerIndex(layerName)].resRPhi = resRPhi; } - void SetResolutionZ(const std::string layerName, float resZ) { layers[GetLayerIndex(layerName)].resZ = resZ; } - void SetResolution(const std::string layerName, float resRPhi, float resZ) - { - SetResolutionRPhi(layerName, resRPhi); - SetResolutionZ(layerName, resZ); - } // operational bool applyZacceptance; // check z acceptance or not @@ -87,16 +127,6 @@ class FastTracker float upcBackgroundMultiplier; float fMinRadTrack = 132.; - // Setters and getters - void SetIntegrationTime(float t) { integrationTime = t; } - void SetMaxRadiusOfSlowDetectors(float r) { maxRadiusSlowDet = r; } - void SetAvgRapidity(float y) { avgRapidity = y; } - void SetdNdEtaCent(float d) { dNdEtaCent = d; } - void SetLhcUPCscale(float s) { lhcUPCScale = s; } - void SetBField(float b) { magneticField = b; } - void SetMinRadTrack(float r) { fMinRadTrack = r; } - // void SetAtLeastHits(int n) { fMinRadTrack = n; } - uint64_t covMatOK; // cov mat has negative eigenvals uint64_t covMatNotOK; // cov mat has negative eigenvals @@ -105,7 +135,6 @@ class FastTracker int nSiliconPoints; // silicon-based space points added to track int nGasPoints; // tpc-based space points added to track std::vector goodHitProbability; - float GetGoodHitProb(int layer) const { return goodHitProbability[layer]; } ClassDef(FastTracker, 1); }; diff --git a/ALICE3/TableProducer/OTF/CMakeLists.txt b/ALICE3/TableProducer/OTF/CMakeLists.txt index a2cc6bd3d70..69a4d2ec722 100644 --- a/ALICE3/TableProducer/OTF/CMakeLists.txt +++ b/ALICE3/TableProducer/OTF/CMakeLists.txt @@ -24,7 +24,7 @@ o2physics_add_dpl_workflow(onthefly-richpid PUBLIC_LINK_LIBRARIES O2::Framework O2::DetectorsBase O2Physics::AnalysisCore O2::ReconstructionDataFormats O2::DetectorsCommonDataFormats O2Physics::ALICE3Core COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(onthefly-trkpid +o2physics_add_dpl_workflow(on-the-fly-tracker-pid SOURCES onTheFlyTrackerPid.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2::DetectorsBase O2Physics::AnalysisCore O2::ReconstructionDataFormats O2::DetectorsCommonDataFormats O2Physics::ALICE3Core COMPONENT_NAME Analysis) diff --git a/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx b/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx index 4499613cd5f..989295f8c54 100644 --- a/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx +++ b/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx @@ -423,10 +423,10 @@ struct OnTheFlyTracker { rand.SetSeed(seed); // configure FastTracker - fastTracker.magneticField = magneticField; - fastTracker.applyZacceptance = fastTrackerSettings.applyZacceptance; - fastTracker.applyMSCorrection = fastTrackerSettings.applyMSCorrection; - fastTracker.applyElossCorrection = fastTrackerSettings.applyElossCorrection; + fastTracker.SetMagneticField(magneticField); + fastTracker.SetApplyZacceptance(fastTrackerSettings.applyZacceptance); + fastTracker.SetApplyMSCorrection(fastTrackerSettings.applyMSCorrection); + fastTracker.SetApplyElossCorrection(fastTrackerSettings.applyElossCorrection); if (fastTrackerSettings.alice3detector == 0) { fastTracker.AddSiliconALICE3v2(fastTrackerSettings.pixelRes); @@ -633,8 +633,8 @@ struct OnTheFlyTracker { nTPCHits[i] = 0; if (enableSecondarySmearing) { nHits[i] = fastTracker.FastTrack(xiDaughterTrackParCovsPerfect[i], xiDaughterTrackParCovsTracked[i], dNdEta); - nSiliconHits[i] = fastTracker.nSiliconPoints; - nTPCHits[i] = fastTracker.nGasPoints; + nSiliconHits[i] = fastTracker.GetNSiliconPoints(); + nTPCHits[i] = fastTracker.GetNGasPoints(); if (nHits[i] < 0) { // QA histos.fill(HIST("hFastTrackerQA"), o2::math_utils::abs(nHits[i])); @@ -645,8 +645,8 @@ struct OnTheFlyTracker { } else { continue; // extra sure } - for (uint32_t ih = 0; ih < fastTracker.hits.size(); ih++) { - histos.fill(HIST("hFastTrackerHits"), fastTracker.hits[ih][2], std::hypot(fastTracker.hits[ih][0], fastTracker.hits[ih][1])); + for (uint32_t ih = 0; ih < fastTracker.GetNHits(); ih++) { + histos.fill(HIST("hFastTrackerHits"), fastTracker.GetHitZ(ih), std::hypot(fastTracker.GetHitX(ih), fastTracker.GetHitY(ih))); } } else { isReco[i] = true; @@ -1116,8 +1116,8 @@ struct OnTheFlyTracker { } // do bookkeeping of fastTracker tracking - histos.fill(HIST("hCovMatOK"), 0.0f, fastTracker.covMatNotOK); - histos.fill(HIST("hCovMatOK"), 1.0f, fastTracker.covMatOK); + histos.fill(HIST("hCovMatOK"), 0.0f, fastTracker.GetCovMatNotOK()); + histos.fill(HIST("hCovMatOK"), 1.0f, fastTracker.GetCovMatOK()); } // end process }; From 8cb8a332d2aa2bf1b5cfaa8313bd332cd7530be9 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Sat, 24 May 2025 17:31:06 +0900 Subject: [PATCH 1401/1650] [PWGEM/Dilepton] fix in treeCreatorElectronMLDDA.cxx (#11344) --- .../TableProducer/treeCreatorElectronMLDDA.cxx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx index 178cc9748da..09746721858 100644 --- a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx +++ b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx @@ -629,10 +629,10 @@ struct TreeCreatorElectronMLDDA { registry.fill(HIST("V0/hTOFbeta_P_Pi"), neg.p(), neg.beta()); registry.fill(HIST("V0/hTPCdEdx_P_Pi"), pos.p(), pos.tpcSignal()); registry.fill(HIST("V0/hTOFbeta_P_Pi"), pos.p(), pos.beta()); - if (dist01(engine) < downscaling_pion && pos.tpcInnerParam() < max_pin_for_downscaling_pion) { + if (dist01(engine) < downscaling_pion || pos.tpcInnerParam() < max_pin_for_downscaling_pion) { fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kPion), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } - if (dist01(engine) < downscaling_pion && neg.tpcInnerParam() < max_pin_for_downscaling_pion) { + if (dist01(engine) < downscaling_pion || neg.tpcInnerParam() < max_pin_for_downscaling_pion) { fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kPion), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } } @@ -640,7 +640,7 @@ struct TreeCreatorElectronMLDDA { if (isProton(pos) && isPionTight(neg)) { registry.fill(HIST("V0/hMassLambda"), v0.mLambda()); if (v0cuts.cfg_min_mass_lambda < v0.mLambda() && v0.mLambda() < v0cuts.cfg_max_mass_lambda) { - if (dist01(engine) < downscaling_proton && pos.tpcInnerParam() < max_pin_for_downscaling_proton) { + if (dist01(engine) < downscaling_proton || pos.tpcInnerParam() < max_pin_for_downscaling_proton) { fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kProton), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } registry.fill(HIST("V0/hTPCdEdx_P_Pr"), pos.p(), pos.tpcSignal()); @@ -650,7 +650,7 @@ struct TreeCreatorElectronMLDDA { if (isPionTight(pos) && isProton(neg)) { registry.fill(HIST("V0/hMassAntiLambda"), v0.mAntiLambda()); if (v0cuts.cfg_min_mass_lambda < v0.mAntiLambda() && v0.mAntiLambda() < v0cuts.cfg_max_mass_lambda) { - if (dist01(engine) < downscaling_proton && neg.tpcInnerParam() < max_pin_for_downscaling_proton) { + if (dist01(engine) < downscaling_proton || neg.tpcInnerParam() < max_pin_for_downscaling_proton) { fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kProton), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } registry.fill(HIST("V0/hTPCdEdx_P_Pr"), neg.p(), neg.tpcSignal()); @@ -662,10 +662,10 @@ struct TreeCreatorElectronMLDDA { registry.fill(HIST("V0/hMassGamma_Rxy"), v0.v0radius(), v0.mGamma()); if (isElectron(pos) && isElectron(neg)) { if ((v0cuts.cfg_min_mass_photon < v0.mGamma() && v0.mGamma() < v0cuts.cfg_max_mass_photon)) { - if (dist01(engine) < downscaling_electron && pos.tpcInnerParam() < max_pin_for_downscaling_electron) { + if (dist01(engine) < downscaling_electron || pos.tpcInnerParam() < max_pin_for_downscaling_electron) { fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } - if (dist01(engine) < downscaling_electron && neg.tpcInnerParam() < max_pin_for_downscaling_electron) { + if (dist01(engine) < downscaling_electron || neg.tpcInnerParam() < max_pin_for_downscaling_electron) { fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } registry.fill(HIST("V0/hTPCdEdx_P_El"), neg.p(), neg.tpcSignal()); @@ -756,7 +756,7 @@ struct TreeCreatorElectronMLDDA { if (cascadecuts.cfg_min_mass_Omega < cascade.mOmega() && cascade.mOmega() < cascadecuts.cfg_max_mass_Omega) { // select Omega candidates registry.fill(HIST("V0/hTPCdEdx_P_Ka"), bachelor.p(), bachelor.tpcSignal()); registry.fill(HIST("V0/hTOFbeta_P_Ka"), bachelor.p(), bachelor.beta()); - if (dist01(engine) < downscaling_kaon && bachelor.tpcInnerParam() < max_pin_for_downscaling_kaon) { + if (dist01(engine) < downscaling_kaon || bachelor.tpcInnerParam() < max_pin_for_downscaling_kaon) { fillTrackTable(collision, bachelor, static_cast(o2::aod::pwgem::dilepton::PID_Label::kKaon), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary), false); } } @@ -782,12 +782,12 @@ struct TreeCreatorElectronMLDDA { if ((dalitzcuts.cfg_min_mass_ee < v12.M() && v12.M() < dalitzcuts.cfg_max_mass_ee) && (dalitzcuts.cfg_min_phiv_ee < phiv && phiv < dalitzcuts.cfg_max_phiv_ee)) { // ee from pi0 dalitz decay is found. if (isElectronTight(pos) && isElectron(neg)) { - if (dist01(engine) < downscaling_electron_primary && neg.tpcInnerParam() < max_pin_for_downscaling_electron_primary) { + if (dist01(engine) < downscaling_electron_primary || neg.tpcInnerParam() < max_pin_for_downscaling_electron_primary) { fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary), true); // primary electron candidates } } if (isElectron(pos) && isElectronTight(neg)) { - if (dist01(engine) < downscaling_electron_primary && pos.tpcInnerParam() < max_pin_for_downscaling_electron_primary) { + if (dist01(engine) < downscaling_electron_primary || pos.tpcInnerParam() < max_pin_for_downscaling_electron_primary) { fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary), true); // primary electron candidates } } From 8e5635838e71c3c52d2cd7d5e45acf2edaf172b1 Mon Sep 17 00:00:00 2001 From: Shirajum Monira <38348689+Eloviyo@users.noreply.github.com> Date: Sat, 24 May 2025 13:57:45 +0200 Subject: [PATCH 1402/1650] [PWGCF] FemtoUniverse cascade task -- implemented same sign CPR option for cascade daughters (#11330) Co-authored-by: Shirajum Monira --- PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h | 6 +++++- .../Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx | 3 ++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h index b13e0e61a5c..0a06b3513e8 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h @@ -47,7 +47,7 @@ class FemtoUniverseDetaDphiStar /// Destructor virtual ~FemtoUniverseDetaDphiStar() = default; /// Initialization of the histograms and setting required values - void init(HistogramRegistry* registry, HistogramRegistry* registryQA, float ldeltaphistarcutmin, float ldeltaphistarcutmax, float ldeltaetacutmin, float ldeltaetacutmax, float lchosenradii, bool lplotForEveryRadii, float lPhiMassMin = 1.014, float lPhiMassMax = 1.026) + void init(HistogramRegistry* registry, HistogramRegistry* registryQA, float ldeltaphistarcutmin, float ldeltaphistarcutmax, float ldeltaetacutmin, float ldeltaetacutmax, float lchosenradii, bool lplotForEveryRadii, float lPhiMassMin = 1.014, float lPhiMassMax = 1.026, bool lisSameSignCPR = false) { chosenRadii = lchosenradii; cutDeltaPhiStarMax = ldeltaphistarcutmax; @@ -59,6 +59,7 @@ class FemtoUniverseDetaDphiStar mHistogramRegistryQA = registryQA; cutPhiInvMassLow = lPhiMassMin; cutPhiInvMassHigh = lPhiMassMax; + isSameSignCPR = lisSameSignCPR; if constexpr (kPartOneType == o2::aod::femtouniverseparticle::ParticleType::kTrack && kPartTwoType == o2::aod::femtouniverseparticle::ParticleType::kTrack) { std::string dirName = static_cast(DirNames[0]); @@ -275,6 +276,8 @@ class FemtoUniverseDetaDphiStar auto indexOfDaughterpart2 = (ChosenEventType == femto_universe_container::EventType::mixed ? part2.globalIndex() : part2.index()) + CascChildTable[i][1]; auto daughterpart1 = particles.begin() + indexOfDaughterpart1; auto daughterpart2 = particles.begin() + indexOfDaughterpart2; + if (isSameSignCPR && (daughterpart1.sign() != daughterpart2.sign())) + continue; auto deta = daughterpart1.eta() - daughterpart2.eta(); auto dphiAvg = averagePhiStar(*daughterpart1, *daughterpart2, i); if (ChosenEventType == femto_universe_container::EventType::same) { @@ -462,6 +465,7 @@ class FemtoUniverseDetaDphiStar bool plotForEveryRadii = false; float cutPhiInvMassLow; float cutPhiInvMassHigh; + bool isSameSignCPR = false; std::array, 2>, 7> histdetadpisame{}; std::array, 2>, 7> histdetadpimixed{}; diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx index 180207b2e5a..e4ebe2db60a 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx @@ -73,6 +73,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { Configurable confCPRdeltaEtaCutMin{"confCPRdeltaEtaCutMin", 0.0, "Delta Eta min cut for Close Pair Rejection"}; Configurable confCPRPlotPerRadii{"confCPRPlotPerRadii", false, "Plot CPR per radii"}; Configurable confCPRChosenRadii{"confCPRChosenRadii", 0.0, "Delta Eta cut for Close Pair Rejection"}; + Configurable confIsSameSignCPR{"confIsSameSignCPR", false, "Close Pair Rejection for same sign children of cascades"}; Configurable confChargePart1{"confChargePart1", 1, "sign of particle 1"}; Configurable confHPtPart1{"confHPtPart1", 4.0f, "higher limit for pt of particle 1"}; Configurable confLPtPart1{"confLPtPart1", 0.5f, "lower limit for pt of particle 1"}; @@ -285,7 +286,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { mixedEventCont.init(&resultRegistry, confkstarBins, confMultBins, confkTBins, confmTBins, confMultBins3D, confmTBins3D, confEtaBins, confPhiBins, confIsMC, confUse3D); pairCleaner.init(&qaRegistry); if (confIsCPR.value) { - pairCloseRejection.init(&resultRegistry, &qaRegistry, confCPRdeltaPhiCutMin.value, confCPRdeltaPhiCutMax.value, confCPRdeltaEtaCutMin.value, confCPRdeltaEtaCutMax.value, confCPRChosenRadii.value, confCPRPlotPerRadii.value); + pairCloseRejection.init(&resultRegistry, &qaRegistry, confCPRdeltaPhiCutMin.value, confCPRdeltaPhiCutMax.value, confCPRdeltaEtaCutMin.value, confCPRdeltaEtaCutMax.value, confCPRChosenRadii.value, confCPRPlotPerRadii.value, 0, 0, confIsSameSignCPR.value); } } From 44971fd9d821950dbdeb19d98c42a14976d78604 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Sat, 24 May 2025 23:16:10 +0900 Subject: [PATCH 1403/1650] [PWGEM/Dilepton] fix treeCreatorElectronMLDDA.cxx again (#11345) --- .../treeCreatorElectronMLDDA.cxx | 49 +++++-------------- 1 file changed, 12 insertions(+), 37 deletions(-) diff --git a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx index 09746721858..a202ad331c9 100644 --- a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx +++ b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx @@ -60,14 +60,6 @@ using MyTracks = soa::Join emprimarytracks; // flat table containing collision + track information @@ -83,8 +75,8 @@ struct TreeCreatorElectronMLDDA { {"V0/hPCA", "V0 distance between 2 legs", {HistType::kTH1F, {{200, 0.f, 2.f}}}}, {"V0/hMassGamma", "V0 mass gamma", {HistType::kTH1F, {{100, 0, 0.1}}}}, {"V0/hMassK0Short", "V0 mass K0S", {HistType::kTH1F, {{200, 0.4, 0.6}}}}, - {"V0/hMassLambda", "V0 mass Lambda", {HistType::kTH1F, {{100, 1.05, 1.15}}}}, - {"V0/hMassAntiLambda", "V0 mass AntiLambda", {HistType::kTH1F, {{100, 1.05, 1.15}}}}, + {"V0/hMassLambda", "V0 mass Lambda", {HistType::kTH1F, {{100, 1.08, 1.18}}}}, + {"V0/hMassAntiLambda", "V0 mass AntiLambda", {HistType::kTH1F, {{100, 1.08, 1.18}}}}, {"hMvsPhiV", "mee vs. phiv", {HistType::kTH2F, {{72, 0, M_PI}, {100, 0, 0.1}}}}, {"V0/hTPCdEdx_P_El", "TPC dEdx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, @@ -99,20 +91,6 @@ struct TreeCreatorElectronMLDDA { {"V0/hTOFbeta_P_Ka", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, {"V0/hTOFbeta_P_Pr", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, - // {"PrimaryTrack/hTPCdEdx_P", "TPC dEdx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, - // {"PrimaryTrack/hTOFbeta_P", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, - // {"PrimaryTrack/hITSClusterSize_P", "mean ITS cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, - // {"PrimaryTrack/hTPCNsigmaEl_P", "TPC n#sigma_{e} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{e}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - // {"PrimaryTrack/hTPCNsigmaMu_P", "TPC n#sigma_{#mu} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{#mu}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - // {"PrimaryTrack/hTPCNsigmaPi_P", "TPC n#sigma_{#pi} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{#pi}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - // {"PrimaryTrack/hTPCNsigmaKa_P", "TPC n#sigma_{K} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{K}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - // {"PrimaryTrack/hTPCNsigmaPr_P", "TPC n#sigma_{p} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{p}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - // {"PrimaryTrack/hTOFNsigmaEl_P", "TOF n#sigma_{e} vs. p;p^{ITS-TOF} (GeV/c);n #sigma_{e}^{TOF}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - // {"PrimaryTrack/hTOFNsigmaMu_P", "TOF n#sigma_{#mu} vs. p;p^{ITS-TOF} (GeV/c);n #sigma_{#mu}^{TOF}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - // {"PrimaryTrack/hTOFNsigmaPi_P", "TOF n#sigma_{#pi} vs. p;p^{ITS-TOF} (GeV/c);n #sigma_{#pi}^{TOF}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - // {"PrimaryTrack/hTOFNsigmaKa_P", "TOF n#sigma_{K} vs. p;p^{ITS-TOF} (GeV/c);n #sigma_{K}^{TOF}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - // {"PrimaryTrack/hTOFNsigmaPr_P", "TOF n#sigma_{p} vs. p;p^{ITS-TOF} (GeV/c);n #sigma_{p}^{TOF}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, - {"Cascade/hRxy_Xi", "R_{xy} of cascade vs. mass;m_{#Lambda#pi};R_{xy} (cm)", {HistType::kTH2F, {{200, 1.2, 1.4}, {200, 0, 20.f}}}}, {"Cascade/hRxy_Omega", "R_{xy} of cascade vs. mass;m_{#LambdaK};R_{xy} (cm)", {HistType::kTH2F, {{200, 1.6, 1.8}, {200, 0, 20.f}}}}, {"Cascade/hCTau_Xi", "c#tau vs. mass;m_{#Lambda#pi};c#tau (cm)", {HistType::kTH2F, {{200, 1.2, 1.4}, {200, 0, 20.f}}}}, @@ -121,8 +99,7 @@ struct TreeCreatorElectronMLDDA { {"Cascade/hV0PCA", "V0 distance between 2 legs", {HistType::kTH1F, {{200, 0.f, 2.f}}}}, {"Cascade/hCosPA", "cascade cosine of pointing angle", {HistType::kTH1F, {{100, 0.99, 1.f}}}}, {"Cascade/hPCA", "cascade distance between 2 legs", {HistType::kTH1F, {{200, 0.f, 2.f}}}}, - {"Cascade/hMassLambda", "V0 mass Lambda in cascade", {HistType::kTH1F, {{100, 1.05, 1.15}}}}, - {"Cascade/hMassAntiLambda", "V0 mass AntiLambda in cascade", {HistType::kTH1F, {{100, 1.05, 1.15}}}}, + {"Cascade/hMassLambda", "V0 mass Lambda in cascade", {HistType::kTH1F, {{100, 1.08, 1.18}}}}, {"Cascade/hMassXi", "cascade mass #Xi", {HistType::kTH1F, {{200, 1.2, 1.4}}}}, {"Cascade/hMassOmega", "cascade mass #Omega", {HistType::kTH1F, {{200, 1.6, 1.8}}}}, {"Cascade/hMassPt_Xi", "cascade mass #Xi^{#pm};m_{#Lambda#pi} (GeV/c^{2});p_{T,#Lambda#pi} (GeV/c)", {HistType::kTH2F, {{200, 1.2, 1.4}, {100, 0, 10}}}}, @@ -132,8 +109,6 @@ struct TreeCreatorElectronMLDDA { }, }; - // Configurables - // CCDB options Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; @@ -629,10 +604,10 @@ struct TreeCreatorElectronMLDDA { registry.fill(HIST("V0/hTOFbeta_P_Pi"), neg.p(), neg.beta()); registry.fill(HIST("V0/hTPCdEdx_P_Pi"), pos.p(), pos.tpcSignal()); registry.fill(HIST("V0/hTOFbeta_P_Pi"), pos.p(), pos.beta()); - if (dist01(engine) < downscaling_pion || pos.tpcInnerParam() < max_pin_for_downscaling_pion) { + if (dist01(engine) < downscaling_pion || pos.tpcInnerParam() > max_pin_for_downscaling_pion) { fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kPion), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } - if (dist01(engine) < downscaling_pion || neg.tpcInnerParam() < max_pin_for_downscaling_pion) { + if (dist01(engine) < downscaling_pion || neg.tpcInnerParam() > max_pin_for_downscaling_pion) { fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kPion), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } } @@ -640,7 +615,7 @@ struct TreeCreatorElectronMLDDA { if (isProton(pos) && isPionTight(neg)) { registry.fill(HIST("V0/hMassLambda"), v0.mLambda()); if (v0cuts.cfg_min_mass_lambda < v0.mLambda() && v0.mLambda() < v0cuts.cfg_max_mass_lambda) { - if (dist01(engine) < downscaling_proton || pos.tpcInnerParam() < max_pin_for_downscaling_proton) { + if (dist01(engine) < downscaling_proton || pos.tpcInnerParam() > max_pin_for_downscaling_proton) { fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kProton), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } registry.fill(HIST("V0/hTPCdEdx_P_Pr"), pos.p(), pos.tpcSignal()); @@ -650,7 +625,7 @@ struct TreeCreatorElectronMLDDA { if (isPionTight(pos) && isProton(neg)) { registry.fill(HIST("V0/hMassAntiLambda"), v0.mAntiLambda()); if (v0cuts.cfg_min_mass_lambda < v0.mAntiLambda() && v0.mAntiLambda() < v0cuts.cfg_max_mass_lambda) { - if (dist01(engine) < downscaling_proton || neg.tpcInnerParam() < max_pin_for_downscaling_proton) { + if (dist01(engine) < downscaling_proton || neg.tpcInnerParam() > max_pin_for_downscaling_proton) { fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kProton), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } registry.fill(HIST("V0/hTPCdEdx_P_Pr"), neg.p(), neg.tpcSignal()); @@ -662,10 +637,10 @@ struct TreeCreatorElectronMLDDA { registry.fill(HIST("V0/hMassGamma_Rxy"), v0.v0radius(), v0.mGamma()); if (isElectron(pos) && isElectron(neg)) { if ((v0cuts.cfg_min_mass_photon < v0.mGamma() && v0.mGamma() < v0cuts.cfg_max_mass_photon)) { - if (dist01(engine) < downscaling_electron || pos.tpcInnerParam() < max_pin_for_downscaling_electron) { + if (dist01(engine) < downscaling_electron || pos.tpcInnerParam() > max_pin_for_downscaling_electron) { fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } - if (dist01(engine) < downscaling_electron || neg.tpcInnerParam() < max_pin_for_downscaling_electron) { + if (dist01(engine) < downscaling_electron || neg.tpcInnerParam() > max_pin_for_downscaling_electron) { fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } registry.fill(HIST("V0/hTPCdEdx_P_El"), neg.p(), neg.tpcSignal()); @@ -756,7 +731,7 @@ struct TreeCreatorElectronMLDDA { if (cascadecuts.cfg_min_mass_Omega < cascade.mOmega() && cascade.mOmega() < cascadecuts.cfg_max_mass_Omega) { // select Omega candidates registry.fill(HIST("V0/hTPCdEdx_P_Ka"), bachelor.p(), bachelor.tpcSignal()); registry.fill(HIST("V0/hTOFbeta_P_Ka"), bachelor.p(), bachelor.beta()); - if (dist01(engine) < downscaling_kaon || bachelor.tpcInnerParam() < max_pin_for_downscaling_kaon) { + if (dist01(engine) < downscaling_kaon || bachelor.tpcInnerParam() > max_pin_for_downscaling_kaon) { fillTrackTable(collision, bachelor, static_cast(o2::aod::pwgem::dilepton::PID_Label::kKaon), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary), false); } } @@ -782,12 +757,12 @@ struct TreeCreatorElectronMLDDA { if ((dalitzcuts.cfg_min_mass_ee < v12.M() && v12.M() < dalitzcuts.cfg_max_mass_ee) && (dalitzcuts.cfg_min_phiv_ee < phiv && phiv < dalitzcuts.cfg_max_phiv_ee)) { // ee from pi0 dalitz decay is found. if (isElectronTight(pos) && isElectron(neg)) { - if (dist01(engine) < downscaling_electron_primary || neg.tpcInnerParam() < max_pin_for_downscaling_electron_primary) { + if (dist01(engine) < downscaling_electron_primary || neg.tpcInnerParam() > max_pin_for_downscaling_electron_primary) { fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary), true); // primary electron candidates } } if (isElectron(pos) && isElectronTight(neg)) { - if (dist01(engine) < downscaling_electron_primary || pos.tpcInnerParam() < max_pin_for_downscaling_electron_primary) { + if (dist01(engine) < downscaling_electron_primary || pos.tpcInnerParam() > max_pin_for_downscaling_electron_primary) { fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary), true); // primary electron candidates } } From 0ecfb75a54e0bbf497931ede3248935de4767b21 Mon Sep 17 00:00:00 2001 From: yuanzhe <90246048+wang-yuanzhe@users.noreply.github.com> Date: Sat, 24 May 2025 17:25:58 +0200 Subject: [PATCH 1404/1650] [PWGLF] Add derivated table for hyperhelium4sigma analysis (#11338) --- PWGLF/DataModel/LFHyperhelium4sigmaTables.h | 93 ++++ PWGLF/TableProducer/Nuspex/CMakeLists.txt | 5 + .../Nuspex/hyperhelium4sigmaRecoTask.cxx} | 420 ++++++++++++------ PWGLF/Tasks/Nuspex/CMakeLists.txt | 5 - 4 files changed, 378 insertions(+), 145 deletions(-) create mode 100644 PWGLF/DataModel/LFHyperhelium4sigmaTables.h rename PWGLF/{Tasks/Nuspex/hyperhelium4sigmaAnalysis.cxx => TableProducer/Nuspex/hyperhelium4sigmaRecoTask.cxx} (61%) diff --git a/PWGLF/DataModel/LFHyperhelium4sigmaTables.h b/PWGLF/DataModel/LFHyperhelium4sigmaTables.h new file mode 100644 index 00000000000..71e04a281cf --- /dev/null +++ b/PWGLF/DataModel/LFHyperhelium4sigmaTables.h @@ -0,0 +1,93 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +// +/// \file LFHyperhelium4sigmaTables.h +/// \brief Slim hyperhelium4sigma tables +/// \author Yuanzhe Wang + +#include "Framework/AnalysisDataModel.h" +#include "Framework/ASoAHelpers.h" + +#ifndef PWGLF_DATAMODEL_LFHYPERHELIUM4SIGMATABLES_H_ +#define PWGLF_DATAMODEL_LFHYPERHELIUM4SIGMATABLES_H_ + +namespace o2::aod +{ + +namespace he4scand +{ +DECLARE_SOA_COLUMN(XPrimVtx, xPrimVtx, float); // Primary vertex of the candidate (x direction) +DECLARE_SOA_COLUMN(YPrimVtx, yPrimVtx, float); // Primary vertex of the candidate (y direction) +DECLARE_SOA_COLUMN(ZPrimVtx, zPrimVtx, float); // Primary vertex of the candidate (z direction) +DECLARE_SOA_COLUMN(XDecVtx, xDecVtx, float); // Decay vertex of the candidate (x direction) +DECLARE_SOA_COLUMN(YDecVtx, yDecVtx, float); // Decay vertex of the candidate (y direction) +DECLARE_SOA_COLUMN(ZDecVtx, zDecVtx, float); // Decay vertex of the candidate (z direction) +DECLARE_SOA_COLUMN(PxMoth, pxMoth, float); //! Px of the mother track at the decay vertex +DECLARE_SOA_COLUMN(PyMoth, pyMoth, float); //! Py of the mother track at the decay vertex +DECLARE_SOA_COLUMN(PzMoth, pzMoth, float); //! Pz of the mother track at the decay vertex +DECLARE_SOA_COLUMN(PxAlpha, pxAlpha, float); //! Px of the daughter alpha track at the decay vertex +DECLARE_SOA_COLUMN(PyAlpha, pyAlpha, float); //! Py of the daughter alpha track at the decay vertex +DECLARE_SOA_COLUMN(PzAlpha, pzAlpha, float); //! Pz of the daughter alpha track at the decay vertex +DECLARE_SOA_COLUMN(IsMatter, isMatter, bool); // bool: true for matter +DECLARE_SOA_COLUMN(DcaMothPv, dcaMothPv, float); //! DCA of the mother to the primary vertex +DECLARE_SOA_COLUMN(DcaAlphaPv, dcaAlphaPv, float); //! DCA of the daughter kink to the primary vertex +DECLARE_SOA_COLUMN(DcaKinkTopo, dcaKinkTopo, float); //! DCA of the kink topology +DECLARE_SOA_COLUMN(ItsChi2Moth, itsChi2Moth, float); // ITS chi2 of the mother track +DECLARE_SOA_COLUMN(ItsClusterSizesMoth, itsClusterSizesMoth, uint32_t); // ITS cluster size of the mother track +DECLARE_SOA_COLUMN(ItsClusterSizesAlpha, itsClusterSizesAlpha, uint32_t); // ITS cluster size of the daughter alpha track +DECLARE_SOA_COLUMN(NSigmaTPCAlpha, nSigmaTPCAlpha, float); // Number of tpc sigmas of the daughter alpha track + +DECLARE_SOA_COLUMN(IsSignal, isSignal, bool); // bool: true for hyperhelium4signal +DECLARE_SOA_COLUMN(IsSignalReco, isSignalReco, bool); // bool: true if the signal is reconstructed +DECLARE_SOA_COLUMN(IsCollReco, isCollReco, bool); // bool: true if the collision is reconstructed +DECLARE_SOA_COLUMN(IsSurvEvSelection, isSurvEvSelection, bool); // bool: true for the collision passed the event selection +DECLARE_SOA_COLUMN(TrueXDecVtx, trueXDecVtx, float); // true x decay vertex +DECLARE_SOA_COLUMN(TrueYDecVtx, trueYDecVtx, float); // true y decay vertex +DECLARE_SOA_COLUMN(TrueZDecVtx, trueZDecVtx, float); // true z decay vertex +DECLARE_SOA_COLUMN(GenPxMoth, genPxMoth, float); // Generated px of the mother track +DECLARE_SOA_COLUMN(GenPyMoth, genPyMoth, float); // Generated py of the mother track +DECLARE_SOA_COLUMN(GenPzMoth, genPzMoth, float); // Generated pz of the mother track +DECLARE_SOA_COLUMN(GenPxAlpha, genPxAlpha, float); // true px of the daughter alpha track +DECLARE_SOA_COLUMN(GenPyAlpha, genPyAlpha, float); // true py of the daughter alpha track +DECLARE_SOA_COLUMN(GenPzAlpha, genPzAlpha, float); // true pz of the daughter alpha track +DECLARE_SOA_COLUMN(IsMothReco, isMothReco, bool); // bool: true if the mother track is reconstructed +DECLARE_SOA_COLUMN(RecoPtMoth, recoPtMoth, float); // reconstructed pt of the mother track +DECLARE_SOA_COLUMN(RecoPzMoth, recoPzMoth, float); // reconstructed pz of the mother track +} // namespace he4scand + +DECLARE_SOA_TABLE(He4S2BCands, "AOD", "HE4S2BCANDS", + o2::soa::Index<>, + he4scand::XPrimVtx, he4scand::YPrimVtx, he4scand::ZPrimVtx, + he4scand::XDecVtx, he4scand::YDecVtx, he4scand::ZDecVtx, + he4scand::IsMatter, he4scand::PxMoth, he4scand::PyMoth, he4scand::PzMoth, + he4scand::PxAlpha, he4scand::PyAlpha, he4scand::PzAlpha, + he4scand::DcaMothPv, he4scand::DcaAlphaPv, he4scand::DcaKinkTopo, + he4scand::ItsChi2Moth, he4scand::ItsClusterSizesMoth, he4scand::ItsClusterSizesAlpha, + he4scand::NSigmaTPCAlpha); + +DECLARE_SOA_TABLE(MCHe4S2BCands, "AOD", "MCHE4S2BCANDS", + o2::soa::Index<>, + he4scand::XPrimVtx, he4scand::YPrimVtx, he4scand::ZPrimVtx, + he4scand::XDecVtx, he4scand::YDecVtx, he4scand::ZDecVtx, + he4scand::IsMatter, he4scand::PxMoth, he4scand::PyMoth, he4scand::PzMoth, + he4scand::PxAlpha, he4scand::PyAlpha, he4scand::PzAlpha, + he4scand::DcaMothPv, he4scand::DcaAlphaPv, he4scand::DcaKinkTopo, + he4scand::ItsChi2Moth, he4scand::ItsClusterSizesMoth, he4scand::ItsClusterSizesAlpha, + he4scand::NSigmaTPCAlpha, + he4scand::IsSignal, he4scand::IsSignalReco, he4scand::IsCollReco, he4scand::IsSurvEvSelection, + he4scand::TrueXDecVtx, he4scand::TrueYDecVtx, he4scand::TrueZDecVtx, + he4scand::GenPxMoth, he4scand::GenPyMoth, he4scand::GenPzMoth, + he4scand::GenPxAlpha, he4scand::GenPyAlpha, he4scand::GenPzAlpha, + he4scand::IsMothReco, he4scand::RecoPtMoth, he4scand::RecoPzMoth); + +} // namespace o2::aod + +#endif // PWGLF_DATAMODEL_LFHYPERHELIUM4SIGMATABLES_H_ diff --git a/PWGLF/TableProducer/Nuspex/CMakeLists.txt b/PWGLF/TableProducer/Nuspex/CMakeLists.txt index e8ec0868378..f8f62f22925 100644 --- a/PWGLF/TableProducer/Nuspex/CMakeLists.txt +++ b/PWGLF/TableProducer/Nuspex/CMakeLists.txt @@ -108,3 +108,8 @@ o2physics_add_dpl_workflow(nuclei-flow-trees SOURCES nucleiFlowTree.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DetectorsBase O2Physics::EventFilteringUtils COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(hyperhelium4sigma-reco-task + SOURCES hyperhelium4sigmaRecoTask.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) diff --git a/PWGLF/Tasks/Nuspex/hyperhelium4sigmaAnalysis.cxx b/PWGLF/TableProducer/Nuspex/hyperhelium4sigmaRecoTask.cxx similarity index 61% rename from PWGLF/Tasks/Nuspex/hyperhelium4sigmaAnalysis.cxx rename to PWGLF/TableProducer/Nuspex/hyperhelium4sigmaRecoTask.cxx index 22ee0a41d0f..567211b67b6 100644 --- a/PWGLF/Tasks/Nuspex/hyperhelium4sigmaAnalysis.cxx +++ b/PWGLF/TableProducer/Nuspex/hyperhelium4sigmaRecoTask.cxx @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. // -/// \file hyperhelium4sigmaAnalysis.cxx +/// \file hyperhelium4sigmaRecoTask.cxx /// \brief QA and analysis task for hyper-helium4sigma (He4S) /// \author Yuanzhe Wang @@ -26,12 +26,14 @@ #include "Common/DataModel/PIDResponse.h" #include "CommonConstants/PhysicsConstants.h" #include "PWGLF/DataModel/LFKinkDecayTables.h" +#include "PWGLF/DataModel/LFHyperhelium4sigmaTables.h" using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; using CollisionsFull = soa::Join; +using MCLabeledCollisionsFull = soa::Join; using FullTracksExtIU = soa::Join; using MCLabeledTracksIU = soa::Join; @@ -47,7 +49,8 @@ std::shared_ptr hDauProtonCounter; std::shared_ptr hDauPionCounter; } // namespace -//-------------------------------Check the decay channel of H4S------------------------------- +//-------------------------------------------------------------- +// Check the decay channel of hyperhelium4sigma enum Channel { k2body = 0, // helium4, pion0 k3body_p, // triton, proton, pion0 @@ -56,7 +59,7 @@ enum Channel { }; template -Channel getDecayChannelH4S(TMCParticle const& particle, std::vector& list) +Channel getDecayChannelHe4S(TMCParticle const& particle, std::vector& list) { if (std::abs(particle.pdgCode()) != o2::constants::physics::Pdg::kHyperHelium4Sigma) { return kNDecayChannel; @@ -69,7 +72,6 @@ Channel getDecayChannelH4S(TMCParticle const& particle, std::vector& list) bool haveAlpha = false, haveTriton = false, haveProton = false, haveNeuteron = false; bool haveAntiAlpha = false, haveAntiTriton = false, haveAntiProton = false, haveAntiNeuteron = false; bool havePionPlus = false, havePionMinus = false, havePion0 = false; - auto daughters = particle.template daughters_as(); for (const auto& mcDaughter : particle.template daughters_as()) { if (mcDaughter.pdgCode() == o2::constants::physics::Pdg::kAlpha) { haveAlpha = true; @@ -129,30 +131,78 @@ Channel getDecayChannelH4S(TMCParticle const& particle, std::vector& list) } //-------------------------------------------------------------- -// check if the mcparticle is daughter of hyperhelium4sigma -template -bool isDaughterTrack(TMCParticle const& mcparticle, int pdgcode = o2::constants::physics::Pdg::kHyperHelium4Sigma) +// construct index array from mcParticle to track +template +void setTrackIDForMC(std::vector& mcPartIndices, aod::McParticles const& particlesMC, TTrackTable const& tracks) { - if (!mcparticle.has_mothers()) { - return false; - } - for (const auto& particleMother : mcparticle.template mothers_as()) { - if (std::abs(particleMother.pdgCode()) == pdgcode) { - return true; + mcPartIndices.clear(); + mcPartIndices.resize(particlesMC.size()); + std::fill(mcPartIndices.begin(), mcPartIndices.end(), -1); + for (const auto& track : tracks) { + if (track.has_mcParticle()) { + auto mcparticle = track.template mcParticle_as(); + if (mcPartIndices[mcparticle.globalIndex()] == -1) { + mcPartIndices[mcparticle.globalIndex()] = track.globalIndex(); + } else { + auto candTrack = tracks.rawIteratorAt(mcPartIndices[mcparticle.globalIndex()]); + // Use the track which has innest information (also best quality? + if (track.x() < candTrack.x()) { + mcPartIndices[mcparticle.globalIndex()] = track.globalIndex(); + } + } } } - return false; } +//-------------------------------------------------------------- +struct Hyphe4sCandidate { + + bool isMatter = false; + + std::array primVtx = {0.0f, 0.0f, 0.0f}; + std::array decVtx = {0.0f, 0.0f, 0.0f}; + std::array momMoth = {0.0f, 0.0f, 0.0f}; + std::array momDaug = {0.0f, 0.0f, 0.0f}; + + float dcaXYMothPv = -999.f; + float dcaXYDauPv = -999.f; + float dcaKinkTopo = -999.f; + + float chi2ITSMoth = 0.0f; + uint32_t itsClusterSizeMoth = 0u; + uint32_t itsClusterSizeDau = 0u; + float nSigmaTPCDau = -999.f; + + // mc information + bool isSignal = false; + bool isSignalReco = false; + bool isCollReco = false; + bool isSurvEvSelection = false; + + std::array trueDecVtx = {0.0f, 0.0f, 0.0f}; + std::array gMomMoth = {0.0f, 0.0f, 0.0f}; + std::array gMomDau = {0.0f, 0.0f, 0.0f}; + + bool isMothReco = false; + float ptMoth = -999.f; + float pzMoth = -999.f; +}; + //-------------------------------------------------------------- // analysis task for hyperhelium4sigma 2-body decay -struct Hyperhelium4sigmaAnalysis { +struct Hyperhelium4sigmaRecoTask { + + Produces outputDataTable; + Produces outputMCTable; + + std::vector mcHe4sIndices; + // Histograms are defined with HistogramRegistry HistogramRegistry registry{"registry", {}}; // Configurable for event selection Configurable doEventCut{"doEventCut", true, "Apply event selection"}; - Configurable cutzvertex{"cutzvertex", 10.0f, "Accepted z-vertex range (cm)"}; + Configurable maxZVertex{"maxZVertex", 10.0f, "Accepted z-vertex range (cm)"}; Configurable cutNSigmaAl{"cutNSigmaAl", 5, "NSigmaTPCAlpha"}; void init(InitContext const&) @@ -165,30 +215,80 @@ struct Hyperhelium4sigmaAnalysis { registry.add("hEventCounter", "hEventCounter", HistType::kTH1F, {{2, 0, 2}}); registry.add("hVertexZCollision", "hVertexZCollision", HistType::kTH1F, {vertexZAxis}); + registry.add("hCandidateCounter", "hCandidateCounter", HistType::kTH1F, {{3, 0, 3}}); - if (doprocessData == true) { - registry.add("hCandidateCounter", "hCandidateCounter", HistType::kTH1F, {{3, 0, 3}}); - } + registry.add("h2MassHyperhelium4sigmaPt", "h2MassHyperhelium4sigmaPt", HistType::kTH2F, {{ptAxis, massAxis}}); + registry.add("h2NSigmaAlPt", "h2NSigmaAlPt", HistType::kTH2F, {{ptAxis, nSigmaAxis}}); if (doprocessMC == true) { - registry.add("hCandidateCounter", "hCandidateCounter", HistType::kTH1F, {{6, 0, 6}}); registry.add("hDiffSVx", ";;#Delta x (cm)", HistType::kTH1F, {{200, -10, 10}}); registry.add("hDiffSVy", ";;#Delta y (cm)", HistType::kTH1F, {{200, -10, 10}}); registry.add("hDiffSVz", ";;#Delta z (cm)", HistType::kTH1F, {{200, -10, 10}}); registry.add("hDiffDauPx", ";#Delta p_{x} (GeV/#it{c}); ", HistType::kTH1D, {{200, -10, 10}}); registry.add("hDiffDauPy", ";#Delta p_{y} (GeV/#it{c}); ", HistType::kTH1D, {{200, -10, 10}}); registry.add("hDiffDauPz", ";#Delta p_{z} (GeV/#it{c}); ", HistType::kTH1D, {{200, -10, 10}}); + registry.add("h2TrueSignalMassPt", "h2TrueSignalMassPt", HistType::kTH2F, {{ptAxis, massAxis}}); + registry.add("h2TrueSignalNSigmaAlPt", "h2TrueSignalNSigmaAlPt", HistType::kTH2F, {{ptAxis, nSigmaAxis}}); } + } - registry.add("h2MassHyperhelium4sigmaPt", "h2MassHyperhelium4sigmaPt", HistType::kTH2F, {{ptAxis, massAxis}}); - registry.add("h2NSigmaAlPt", "h2NSigmaAlPt", HistType::kTH2F, {{ptAxis, nSigmaAxis}}); + template + void fillCandidate(Hyphe4sCandidate& hyphe4sCand, TCollision const& collision, TKindCandidate const& kinkCand, TTrack const& trackMoth, TTrack const& trackDau) + { + hyphe4sCand.isMatter = kinkCand.mothSign() > 0; + hyphe4sCand.primVtx[0] = collision.posX(); + hyphe4sCand.primVtx[1] = collision.posY(); + hyphe4sCand.primVtx[2] = collision.posZ(); + hyphe4sCand.decVtx[0] = kinkCand.xDecVtx(); + hyphe4sCand.decVtx[1] = kinkCand.yDecVtx(); + hyphe4sCand.decVtx[2] = kinkCand.zDecVtx(); + + hyphe4sCand.momMoth[0] = kinkCand.pxMoth(); + hyphe4sCand.momMoth[1] = kinkCand.pyMoth(); + hyphe4sCand.momMoth[2] = kinkCand.pzMoth(); + hyphe4sCand.momDaug[0] = kinkCand.pxDaug(); + hyphe4sCand.momDaug[1] = kinkCand.pyDaug(); + hyphe4sCand.momDaug[2] = kinkCand.pzDaug(); + + hyphe4sCand.dcaXYMothPv = kinkCand.dcaMothPv(); + hyphe4sCand.dcaXYDauPv = kinkCand.dcaDaugPv(); + hyphe4sCand.dcaKinkTopo = kinkCand.dcaKinkTopo(); + + fillCandidateRecoMoth(hyphe4sCand, trackMoth); + + hyphe4sCand.itsClusterSizeDau = trackDau.itsClusterSizes(); + hyphe4sCand.nSigmaTPCDau = trackDau.tpcNSigmaAl(); + } + + template + void fillCandidateRecoMoth(Hyphe4sCandidate& hyphe4sCand, TTrack const& trackMoth) + { + hyphe4sCand.isMothReco = true; + hyphe4sCand.chi2ITSMoth = trackMoth.itsChi2NCl(); + hyphe4sCand.itsClusterSizeMoth = trackMoth.itsClusterSizes(); + hyphe4sCand.ptMoth = trackMoth.pt(); + hyphe4sCand.pzMoth = trackMoth.pz(); + } + + template + void fillCandidateMCInfo(Hyphe4sCandidate& hyphe4sCand, TMCParticle const& mcMothTrack, TMCParticle const& mcDauTrack) + { + hyphe4sCand.trueDecVtx[0] = mcDauTrack.vx(); + hyphe4sCand.trueDecVtx[1] = mcDauTrack.vy(); + hyphe4sCand.trueDecVtx[2] = mcDauTrack.vz(); + hyphe4sCand.gMomMoth[0] = mcMothTrack.px(); + hyphe4sCand.gMomMoth[1] = mcMothTrack.py(); + hyphe4sCand.gMomMoth[2] = mcMothTrack.pz(); + hyphe4sCand.gMomDau[0] = mcDauTrack.px(); + hyphe4sCand.gMomDau[1] = mcDauTrack.py(); + hyphe4sCand.gMomDau[2] = mcDauTrack.pz(); } void processData(CollisionsFull const& collisions, aod::KinkCands const& KinkCands, FullTracksExtIU const&) { for (const auto& collision : collisions) { registry.fill(HIST("hEventCounter"), 0); - if (doEventCut && (std::abs(collision.posZ()) > cutzvertex || !collision.sel8())) { + if (doEventCut && (std::abs(collision.posZ()) > maxZVertex || !collision.sel8())) { continue; } registry.fill(HIST("hEventCounter"), 1); @@ -198,7 +298,7 @@ struct Hyperhelium4sigmaAnalysis { for (const auto& kinkCand : KinkCands) { registry.fill(HIST("hCandidateCounter"), 0); auto collision = kinkCand.collision_as(); - if (doEventCut && (std::abs(collision.posZ()) > cutzvertex || !collision.sel8())) { + if (doEventCut && (std::abs(collision.posZ()) > maxZVertex || !collision.sel8())) { continue; } registry.fill(HIST("hCandidateCounter"), 1); @@ -211,68 +311,140 @@ struct Hyperhelium4sigmaAnalysis { registry.fill(HIST("hCandidateCounter"), 2); registry.fill(HIST("h2MassHyperhelium4sigmaPt"), kinkCand.mothSign() * kinkCand.ptMoth(), invMass); registry.fill(HIST("h2NSigmaAlPt"), kinkCand.mothSign() * kinkCand.ptDaug(), dauTrack.tpcNSigmaAl()); + + auto motherTrack = kinkCand.trackMoth_as(); + Hyphe4sCandidate hyphe4sCand; + fillCandidate(hyphe4sCand, collision, kinkCand, motherTrack, dauTrack); + + outputDataTable( + hyphe4sCand.primVtx[0], hyphe4sCand.primVtx[1], hyphe4sCand.primVtx[2], + hyphe4sCand.decVtx[0], hyphe4sCand.decVtx[1], hyphe4sCand.decVtx[2], + hyphe4sCand.isMatter, hyphe4sCand.momMoth[0], hyphe4sCand.momMoth[1], hyphe4sCand.momMoth[2], + hyphe4sCand.momDaug[0], hyphe4sCand.momDaug[1], hyphe4sCand.momDaug[2], + hyphe4sCand.dcaXYMothPv, hyphe4sCand.dcaXYDauPv, hyphe4sCand.dcaKinkTopo, + hyphe4sCand.chi2ITSMoth, hyphe4sCand.itsClusterSizeMoth, hyphe4sCand.itsClusterSizeDau, + hyphe4sCand.nSigmaTPCDau); } } - PROCESS_SWITCH(Hyperhelium4sigmaAnalysis, processData, "process data", true); + PROCESS_SWITCH(Hyperhelium4sigmaRecoTask, processData, "process data", true); - void processMC(CollisionsFull const& collisions, aod::KinkCands const& KinkCands, MCLabeledTracksIU const&, aod::McParticles const&) + void processMC(MCLabeledCollisionsFull const& collisions, aod::KinkCands const& KinkCands, MCLabeledTracksIU const& tracks, aod::McParticles const& particlesMC, aod::McCollisions const& mcCollisions) { - std::vector dauIDList; + mcHe4sIndices.clear(); + std::vector mcPartIndices; + setTrackIDForMC(mcPartIndices, particlesMC, tracks); + std::vector isReconstructedMCCollisions(mcCollisions.size(), false); + std::vector isSelectedMCCollisions(mcCollisions.size(), false); + std::vector isGoodCollisions(collisions.size(), false); + std::vector dauIDList(3, -1); for (const auto& collision : collisions) { + isReconstructedMCCollisions[collision.mcCollisionId()] = true; registry.fill(HIST("hEventCounter"), 0); - if (doEventCut && (!collision.selection_bit(aod::evsel::kIsTriggerTVX) || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || std::abs(collision.posZ()) > cutzvertex)) { + if (doEventCut && (!collision.selection_bit(aod::evsel::kIsTriggerTVX) || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || std::abs(collision.posZ()) > maxZVertex)) { continue; } registry.fill(HIST("hEventCounter"), 1); registry.fill(HIST("hVertexZCollision"), collision.posZ()); + isSelectedMCCollisions[collision.mcCollisionId()] = true; + isGoodCollisions[collision.globalIndex()] = true; } for (const auto& kinkCand : KinkCands) { registry.fill(HIST("hCandidateCounter"), 0); - auto collision = kinkCand.collision_as(); - if (doEventCut && (!collision.selection_bit(aod::evsel::kIsTriggerTVX) || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || std::abs(collision.posZ()) > cutzvertex)) { + auto collision = kinkCand.collision_as(); + if (!isGoodCollisions[collision.globalIndex()]) { continue; } registry.fill(HIST("hCandidateCounter"), 1); - auto motherTrack = kinkCand.trackMoth_as(); auto dauTrack = kinkCand.trackDaug_as(); - if (!motherTrack.has_mcParticle() || !dauTrack.has_mcParticle()) { + if (std::abs(dauTrack.tpcNSigmaAl()) > cutNSigmaAl) { continue; } + float invMass = RecoDecay::m(std::array{std::array{kinkCand.pxDaug(), kinkCand.pyDaug(), kinkCand.pzDaug()}, std::array{kinkCand.pxDaugNeut(), kinkCand.pyDaugNeut(), kinkCand.pzDaugNeut()}}, std::array{o2::constants::physics::MassAlpha, o2::constants::physics::MassPi0}); registry.fill(HIST("hCandidateCounter"), 2); + registry.fill(HIST("h2MassHyperhelium4sigmaPt"), kinkCand.mothSign() * kinkCand.ptMoth(), invMass); + registry.fill(HIST("h2NSigmaAlPt"), kinkCand.mothSign() * kinkCand.ptDaug(), dauTrack.tpcNSigmaAl()); + + auto motherTrack = kinkCand.trackMoth_as(); + Hyphe4sCandidate hyphe4sCand; + fillCandidate(hyphe4sCand, collision, kinkCand, motherTrack, dauTrack); + + // qa for true signal + if (motherTrack.has_mcParticle() && dauTrack.has_mcParticle()) { + auto mcMotherTrack = motherTrack.mcParticle_as(); + auto mcDauTrack = dauTrack.mcParticle_as(); + auto dChannel = getDecayChannelHe4S(mcMotherTrack, dauIDList); + if (dChannel == k2body && dauIDList[0] == mcDauTrack.globalIndex()) { + registry.fill(HIST("hDiffSVx"), kinkCand.xDecVtx() - mcDauTrack.vx()); + registry.fill(HIST("hDiffSVy"), kinkCand.yDecVtx() - mcDauTrack.vy()); + registry.fill(HIST("hDiffSVz"), kinkCand.zDecVtx() - mcDauTrack.vz()); + registry.fill(HIST("hDiffDauPx"), kinkCand.pxDaug() - mcDauTrack.px()); + registry.fill(HIST("hDiffDauPy"), kinkCand.pyDaug() - mcDauTrack.py()); + registry.fill(HIST("hDiffDauPz"), kinkCand.pzDaug() - mcDauTrack.pz()); + registry.fill(HIST("h2TrueSignalMassPt"), kinkCand.mothSign() * kinkCand.ptMoth(), invMass); + registry.fill(HIST("h2TrueSignalNSigmaAlPt"), kinkCand.mothSign() * kinkCand.ptDaug(), dauTrack.tpcNSigmaAl()); + + hyphe4sCand.isSignal = true; + hyphe4sCand.isSignalReco = true; + hyphe4sCand.isCollReco = true; + hyphe4sCand.isSurvEvSelection = true; + fillCandidateMCInfo(hyphe4sCand, mcMotherTrack, mcDauTrack); + mcHe4sIndices.push_back(mcMotherTrack.globalIndex()); + } + } - auto mcMotherTrack = motherTrack.mcParticle_as(); - auto mcDauTrack = dauTrack.mcParticle_as(); - auto dChannel = getDecayChannelH4S(mcMotherTrack, dauIDList); + outputMCTable( + hyphe4sCand.primVtx[0], hyphe4sCand.primVtx[1], hyphe4sCand.primVtx[2], + hyphe4sCand.decVtx[0], hyphe4sCand.decVtx[1], hyphe4sCand.decVtx[2], + hyphe4sCand.isMatter, hyphe4sCand.momMoth[0], hyphe4sCand.momMoth[1], hyphe4sCand.momMoth[2], + hyphe4sCand.momDaug[0], hyphe4sCand.momDaug[1], hyphe4sCand.momDaug[2], + hyphe4sCand.dcaXYMothPv, hyphe4sCand.dcaXYDauPv, hyphe4sCand.dcaKinkTopo, + hyphe4sCand.chi2ITSMoth, hyphe4sCand.itsClusterSizeMoth, hyphe4sCand.itsClusterSizeDau, + hyphe4sCand.nSigmaTPCDau, + hyphe4sCand.isSignal, hyphe4sCand.isSignalReco, hyphe4sCand.isCollReco, hyphe4sCand.isSurvEvSelection, + hyphe4sCand.trueDecVtx[0], hyphe4sCand.trueDecVtx[1], hyphe4sCand.trueDecVtx[2], + hyphe4sCand.gMomMoth[0], hyphe4sCand.gMomMoth[1], hyphe4sCand.gMomMoth[2], + hyphe4sCand.gMomDau[0], hyphe4sCand.gMomDau[1], hyphe4sCand.gMomDau[2], + hyphe4sCand.isMothReco, hyphe4sCand.ptMoth, hyphe4sCand.pzMoth); + } + + // fill hyperhelium4sigma signals which are not reconstructed + for (auto const& mcparticle : particlesMC) { + auto dChannel = getDecayChannelHe4S(mcparticle, dauIDList); if (dChannel != k2body) { continue; } - registry.fill(HIST("hCandidateCounter"), 3); - - if (dauIDList[0] != mcDauTrack.globalIndex()) { + if (std::find(mcHe4sIndices.begin(), mcHe4sIndices.end(), mcparticle.globalIndex()) != mcHe4sIndices.end()) { continue; } - registry.fill(HIST("hCandidateCounter"), 4); - if (std::abs(dauTrack.tpcNSigmaAl()) > cutNSigmaAl) { - continue; + Hyphe4sCandidate hyphe4sCand; + auto mcDauTrack = particlesMC.rawIteratorAt(dauIDList[0]); + fillCandidateMCInfo(hyphe4sCand, mcparticle, mcDauTrack); + + if (mcPartIndices[mcparticle.globalIndex()] != -1) { + auto mothTrack = tracks.rawIteratorAt(mcPartIndices[mcparticle.globalIndex()]); + fillCandidateRecoMoth(hyphe4sCand, mothTrack); } - registry.fill(HIST("hCandidateCounter"), 5); - float invMass = RecoDecay::m(std::array{std::array{kinkCand.pxDaug(), kinkCand.pyDaug(), kinkCand.pzDaug()}, std::array{kinkCand.pxDaugNeut(), kinkCand.pyDaugNeut(), kinkCand.pzDaugNeut()}}, std::array{o2::constants::physics::MassAlpha, o2::constants::physics::MassPi0}); - registry.fill(HIST("hDiffSVx"), kinkCand.xDecVtx() - mcDauTrack.vx()); - registry.fill(HIST("hDiffSVy"), kinkCand.yDecVtx() - mcDauTrack.vy()); - registry.fill(HIST("hDiffSVz"), kinkCand.zDecVtx() - mcDauTrack.vz()); - registry.fill(HIST("hDiffDauPx"), kinkCand.pxDaug() - mcDauTrack.px()); - registry.fill(HIST("hDiffDauPy"), kinkCand.pyDaug() - mcDauTrack.py()); - registry.fill(HIST("hDiffDauPz"), kinkCand.pzDaug() - mcDauTrack.pz()); - registry.fill(HIST("h2MassHyperhelium4sigmaPt"), kinkCand.mothSign() * kinkCand.ptMoth(), invMass); - registry.fill(HIST("h2NSigmaAlPt"), kinkCand.mothSign() * kinkCand.ptDaug(), dauTrack.tpcNSigmaAl()); + outputMCTable( + -1, -1, -1, + -1, -1, -1, + -1, -1, -1, -1, + -1, -1, -1, + -1, -1, -1, + -1, -1, -1, + -1, + true, false, isReconstructedMCCollisions[mcparticle.mcCollisionId()], isSelectedMCCollisions[mcparticle.mcCollisionId()], + hyphe4sCand.trueDecVtx[0], hyphe4sCand.trueDecVtx[1], hyphe4sCand.trueDecVtx[2], + hyphe4sCand.gMomMoth[0], hyphe4sCand.gMomMoth[1], hyphe4sCand.gMomMoth[2], + hyphe4sCand.gMomDau[0], hyphe4sCand.gMomDau[1], hyphe4sCand.gMomDau[2], + hyphe4sCand.isMothReco, hyphe4sCand.ptMoth, hyphe4sCand.pzMoth); } } - PROCESS_SWITCH(Hyperhelium4sigmaAnalysis, processMC, "process MC", false); + PROCESS_SWITCH(Hyperhelium4sigmaRecoTask, processMC, "process MC", false); }; //-------------------------------------------------------------- @@ -298,6 +470,7 @@ struct Hyperhelium4sigmaQa { const AxisSpec nsigmaAxis{nsigmaBins, "TPC n#sigma"}; const AxisSpec invMassAxis{invMassBins, "Inv Mass (GeV/#it{c}^{2})"}; const AxisSpec diffPtAxis{200, -10.f, 10.f, "#Delta p_{T} (GeV/#it{c})"}; + const AxisSpec diffPzAxis{200, -10.f, 10.f, "#Delta p_{z} (GeV/#it{c})"}; const AxisSpec radiusAxis{radiusBins, "R (cm)"}; auto hCollCounter = genQAHist.add("hCollCounter", "hCollCounter", HistType::kTH1F, {{2, 0.0f, 2.0f}}); @@ -307,8 +480,8 @@ struct Hyperhelium4sigmaQa { hMcCollCounter->GetXaxis()->SetBinLabel(1, "MC Collisions"); hMcCollCounter->GetXaxis()->SetBinLabel(2, "Reconstructed"); - auto hGenHyperHelium4SigmaCounter = genQAHist.add("hGenHyperHelium4SigmaCounter", "", HistType::kTH1F, {{10, 0.f, 10.f}}); - hGenHyperHelium4SigmaCounter->GetXaxis()->SetBinLabel(1, "H4S All"); + auto hGenHyperHelium4SigmaCounter = genQAHist.add("hGenHyperHelium4SigmaCounter", "", HistType::kTH1F, {{11, 0.f, 11.f}}); + hGenHyperHelium4SigmaCounter->GetXaxis()->SetBinLabel(1, "He4S All"); hGenHyperHelium4SigmaCounter->GetXaxis()->SetBinLabel(2, "Matter"); hGenHyperHelium4SigmaCounter->GetXaxis()->SetBinLabel(3, "AntiMatter"); hGenHyperHelium4SigmaCounter->GetXaxis()->SetBinLabel(4, "#alpha + #pi^{0}"); @@ -317,7 +490,8 @@ struct Hyperhelium4sigmaQa { hGenHyperHelium4SigmaCounter->GetXaxis()->SetBinLabel(7, "#bar{t} + #bar{p} + #pi^{0}"); hGenHyperHelium4SigmaCounter->GetXaxis()->SetBinLabel(8, "t + n + #pi^{+}"); hGenHyperHelium4SigmaCounter->GetXaxis()->SetBinLabel(9, "#bar{t} + #bar{n} + #pi^{+}"); - hGenHyperHelium4SigmaCounter->GetXaxis()->SetBinLabel(10, "Unexpected"); + hGenHyperHelium4SigmaCounter->GetXaxis()->SetBinLabel(10, "Tracks found"); + hGenHyperHelium4SigmaCounter->GetXaxis()->SetBinLabel(11, "Unexpected"); auto hEvtSelectedHyperHelium4SigmaCounter = genQAHist.add("hEvtSelectedHyperHelium4SigmaCounter", "", HistType::kTH1F, {{2, 0.f, 2.f}}); hEvtSelectedHyperHelium4SigmaCounter->GetXaxis()->SetBinLabel(1, "Generated"); @@ -340,9 +514,9 @@ struct Hyperhelium4sigmaQa { hMotherCounter->GetXaxis()->SetBinLabel(8, "ITS chi2"); hMotherCounter->GetXaxis()->SetBinLabel(9, "pt"); recoQAHist.add("hTrueMotherRVsDiffPt", ";#Delta p_{T} (GeV/#it{c});R (cm);", HistType::kTH2F, {diffPtAxis, radiusAxis}); - recoQAHist.add("hTrueMotherRVsDiffPz", ";#Delta p_{z} (GeV/#it{c});R (cm);", HistType::kTH2F, {diffPtAxis, radiusAxis}); + recoQAHist.add("hTrueMotherRVsDiffPz", ";#Delta p_{z} (GeV/#it{c});R (cm);", HistType::kTH2F, {diffPzAxis, radiusAxis}); recoQAHist.add("hGoodMotherRVsDiffPt", ";#Delta p_{T} (GeV/#it{c});R (cm);", HistType::kTH2F, {diffPtAxis, radiusAxis}); - recoQAHist.add("hGoodMotherRVsDiffPz", ";#Delta p_{z} (GeV/#it{c});R (cm);", HistType::kTH2F, {diffPtAxis, radiusAxis}); + recoQAHist.add("hGoodMotherRVsDiffPz", ";#Delta p_{z} (GeV/#it{c});R (cm);", HistType::kTH2F, {diffPzAxis, radiusAxis}); hDauAlphaCounter = recoQAHist.add("hDauAlphaCounter", "", HistType::kTH1F, {{7, 0.f, 7.f}}); hDauTritonCounter = recoQAHist.add("hDauTritonCounter", "", HistType::kTH1F, {{7, 0.f, 7.f}}); @@ -357,12 +531,11 @@ struct Hyperhelium4sigmaQa { } Configurable skipRejectedEvents{"skipRejectedEvents", false, "Flag to skip events that fail event selection cuts"}; - Configurable mcEventCut{"mcEventCut", true, "flag to enable mc event selection: kIsTriggerTVX and kNoTimeFrameBorder"}; - Configurable eventPosZCut{"eventPosZCut", true, "flag to enable event posZ selection"}; - Configurable maxPosZ{"maxPosZ", 10.f, "max pv posZ for event selection"}; + Configurable doEventCut{"doEventCut", true, "Apply event selection"}; + Configurable maxZVertex{"maxZVertex", 10.0f, "Accepted z-vertex range (cm)"}; Configurable etaMax{"etaMax", 1., "eta cut for tracks"}; - Configurable minPtMoth{"minPtMoth", 0.5, "Minimum pT of the hypercandidate"}; + Configurable minPtMoth{"minPtMoth", 0.25, "Minimum pT/z of the hyperhelium4sigma candidate"}; Configurable tpcPidNsigmaCut{"tpcPidNsigmaCut", 5, "tpcPidNsigmaCut"}; Configurable nTPCClusMinDaug{"nTPCClusMinDaug", 80, "daug NTPC clusters cut"}; Configurable itsMaxChi2{"itsMaxChi2", 36, "max chi2 for ITS"}; @@ -370,31 +543,6 @@ struct Hyperhelium4sigmaQa { Preslice permcCollision = o2::aod::mcparticle::mcCollisionId; - // construct index array from mcParticle to track - std::vector mcPartIndices; - - template - void setTrackIDForMC(aod::McParticles const& particlesMC, TTrackTable const& tracks) - { - mcPartIndices.clear(); - mcPartIndices.resize(particlesMC.size()); - std::fill(mcPartIndices.begin(), mcPartIndices.end(), -1); - for (const auto& track : tracks) { - if (track.has_mcParticle()) { - auto mcparticle = track.template mcParticle_as(); - if (mcPartIndices[mcparticle.globalIndex()] == -1) { - mcPartIndices[mcparticle.globalIndex()] = track.globalIndex(); - } else { - auto candTrack = tracks.rawIteratorAt(mcPartIndices[mcparticle.globalIndex()]); - // Use the track which has innest information (also best quality? - if (track.x() < candTrack.x()) { - mcPartIndices[mcparticle.globalIndex()] = track.globalIndex(); - } - } - } - } - } - // qa for mother track selection template bool motherTrackCheck(const TTrack& track, const std::shared_ptr hist) @@ -479,29 +627,22 @@ struct Hyperhelium4sigmaQa { void processMC(aod::McCollisions const& mcCollisions, aod::McParticles const& particlesMC, o2::soa::Join const& collisions, MCLabeledTracksIU const& tracks) { - - // check mcparticles - setTrackIDForMC(particlesMC, tracks); - std::vector selectedEvents(collisions.size()); - std::vector dauIDList; - int nevts = 0; + std::vector mcPartIndices; + setTrackIDForMC(mcPartIndices, particlesMC, tracks); + std::vector isSelectedMCCollisions(mcCollisions.size(), false); + std::vector dauIDList(3, -1); for (const auto& collision : collisions) { genQAHist.fill(HIST("hCollCounter"), 0.5); - if (mcEventCut && (!collision.selection_bit(aod::evsel::kIsTriggerTVX) || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder))) { - continue; - } - if (eventPosZCut && std::abs(collision.posZ()) > maxPosZ) { // 10cm + if (doEventCut && (!collision.selection_bit(aod::evsel::kIsTriggerTVX) || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || std::abs(collision.posZ()) > maxZVertex)) { continue; } genQAHist.fill(HIST("hCollCounter"), 1.5); - selectedEvents[nevts++] = collision.mcCollision_as().globalIndex(); + isSelectedMCCollisions[collision.mcCollisionId()] = true; } - selectedEvents.resize(nevts); for (const auto& mcCollision : mcCollisions) { genQAHist.fill(HIST("hMcCollCounter"), 0.5); - const auto evtReconstructedAndSelected = std::find(selectedEvents.begin(), selectedEvents.end(), mcCollision.globalIndex()) != selectedEvents.end(); - if (evtReconstructedAndSelected) { // Check that the event is reconstructed and that the reconstructed events pass the selection + if (isSelectedMCCollisions[mcCollision.globalIndex()]) { // Check that the event is reconstructed and that the reconstructed events pass the selection genQAHist.fill(HIST("hMcCollCounter"), 1.5); } else { if (skipRejectedEvents) { @@ -526,28 +667,26 @@ struct Hyperhelium4sigmaQa { genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), 0.5); genQAHist.fill(HIST("hEvtSelectedHyperHelium4SigmaCounter"), 0.5); - if (evtReconstructedAndSelected) { + if (isSelectedMCCollisions[mcCollision.globalIndex()]) { genQAHist.fill(HIST("hEvtSelectedHyperHelium4SigmaCounter"), 1.5); } - auto dChannel = getDecayChannelH4S(mcparticle, dauIDList); + auto dChannel = getDecayChannelHe4S(mcparticle, dauIDList); if (dChannel == kNDecayChannel) { - genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), 9.5); + genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), 10.5); continue; } - // bool isAllDauReconstructed = mcPartIndices[dauIDList[0]] != -1 && (dChannel == k2body ? true : mcPartIndices[dauIDList[1]] != -1); - - // check for mother tracks + // qa for mother tracks recoQAHist.fill(HIST("hMotherCounter"), 0); - double svPos[3] = {-999, -999, -999}; - double dauAlphaMom[3] = {-999, -999, -999}; - double dauTritonMom[3] = {-999, -999, -999}; - double dauProtonMom[3] = {-999, -999, -999}; - double dauNeuteronMom[3] = {-999, -999, -999}; - double dauChargedPionMom[3] = {-999, -999, -999}; - double dauPion0Mom[3] = {-999, -999, -999}; + float svPos[3] = {-999, -999, -999}; + float dauAlphaMom[3] = {-999, -999, -999}; + float dauTritonMom[3] = {-999, -999, -999}; + float dauProtonMom[3] = {-999, -999, -999}; + float dauNeuteronMom[3] = {-999, -999, -999}; + float dauChargedPionMom[3] = {-999, -999, -999}; + float dauPion0Mom[3] = {-999, -999, -999}; for (const auto& mcparticleDaughter : mcparticle.daughters_as()) { if (std::abs(mcparticleDaughter.pdgCode()) == o2::constants::physics::Pdg::kAlpha) { dauAlphaMom[0] = mcparticleDaughter.px(); @@ -562,8 +701,10 @@ struct Hyperhelium4sigmaQa { recoQAHist.fill(HIST("hDauAlphaCounter"), 0); if (mcPartIndices[mcparticleDaughter.globalIndex()] != -1) { auto track = tracks.rawIteratorAt(mcPartIndices[mcparticleDaughter.globalIndex()]); - recoQAHist.fill(HIST("hDauAlphaTPCNSigma"), track.p() * track.sign(), track.tpcNSigmaAl()); - daughterTrackCheck(track, hDauAlphaCounter, track.tpcNSigmaAl()); + if (track.hasTPC()) { + recoQAHist.fill(HIST("hDauAlphaTPCNSigma"), track.p() * track.sign(), track.tpcNSigmaAl()); + daughterTrackCheck(track, hDauAlphaCounter, track.tpcNSigmaAl()); + } } } else if (std::abs(mcparticleDaughter.pdgCode()) == o2::constants::physics::Pdg::kTriton) { dauTritonMom[0] = mcparticleDaughter.px(); @@ -578,8 +719,10 @@ struct Hyperhelium4sigmaQa { recoQAHist.fill(HIST("hDauTritonCounter"), 0); if (mcPartIndices[mcparticleDaughter.globalIndex()] != -1) { auto track = tracks.rawIteratorAt(mcPartIndices[mcparticleDaughter.globalIndex()]); - recoQAHist.fill(HIST("hDauTritonTPCNSigma"), track.p() * track.sign(), track.tpcNSigmaTr()); - daughterTrackCheck(track, hDauTritonCounter, track.tpcNSigmaTr()); + if (track.hasTPC()) { + recoQAHist.fill(HIST("hDauTritonTPCNSigma"), track.p() * track.sign(), track.tpcNSigmaTr()); + daughterTrackCheck(track, hDauTritonCounter, track.tpcNSigmaTr()); + } } } else if (std::abs(mcparticleDaughter.pdgCode()) == PDG_t::kProton) { dauProtonMom[0] = mcparticleDaughter.px(); @@ -589,8 +732,10 @@ struct Hyperhelium4sigmaQa { recoQAHist.fill(HIST("hDauProtonCounter"), 0); if (mcPartIndices[mcparticleDaughter.globalIndex()] != -1) { auto track = tracks.rawIteratorAt(mcPartIndices[mcparticleDaughter.globalIndex()]); - recoQAHist.fill(HIST("hDauProtonTPCNSigma"), track.p() * track.sign(), track.tpcNSigmaPr()); - daughterTrackCheck(track, hDauProtonCounter, track.tpcNSigmaPr()); + if (track.hasTPC()) { + recoQAHist.fill(HIST("hDauProtonTPCNSigma"), track.p() * track.sign(), track.tpcNSigmaPr()); + daughterTrackCheck(track, hDauProtonCounter, track.tpcNSigmaPr()); + } } } else if (std::abs(mcparticleDaughter.pdgCode()) == PDG_t::kNeutron) { dauNeuteronMom[0] = mcparticleDaughter.px(); @@ -616,44 +761,39 @@ struct Hyperhelium4sigmaQa { genQAHist.fill(HIST("hGenHyperHelium4SigmaP"), mcparticle.p()); genQAHist.fill(HIST("hGenHyperHelium4SigmaPt"), mcparticle.pt()); - double ct = RecoDecay::sqrtSumOfSquares(svPos[0] - mcparticle.vx(), svPos[1] - mcparticle.vy(), svPos[2] - mcparticle.vz()) * o2::constants::physics::MassHyperHelium4Sigma / mcparticle.p(); + float ct = RecoDecay::sqrtSumOfSquares(svPos[0] - mcparticle.vx(), svPos[1] - mcparticle.vy(), svPos[2] - mcparticle.vz()) * o2::constants::physics::MassHyperHelium4Sigma / mcparticle.p(); genQAHist.fill(HIST("hGenHyperHelium4SigmaCt"), ct); + // qa if mother track is reconstructed if (mcPartIndices[mcparticle.globalIndex()] != -1) { auto motherTrack = tracks.rawIteratorAt(mcPartIndices[mcparticle.globalIndex()]); bool isGoodMother = motherTrackCheck(motherTrack, hMotherCounter); - double svR = RecoDecay::sqrtSumOfSquares(svPos[0], svPos[1]); + float svR = RecoDecay::sqrtSumOfSquares(svPos[0], svPos[1]); recoQAHist.fill(HIST("hTrueMotherRVsDiffPt"), mcparticle.pt() - 2 * motherTrack.pt(), svR); recoQAHist.fill(HIST("hTrueMotherRVsDiffPz"), mcparticle.pz() - 2 * motherTrack.pz(), svR); if (isGoodMother) { recoQAHist.fill(HIST("hGoodMotherRVsDiffPt"), mcparticle.pt() - 2 * motherTrack.pt(), svR); recoQAHist.fill(HIST("hGoodMotherRVsDiffPz"), mcparticle.pz() - 2 * motherTrack.pz(), svR); } + // fill qahist if charged daughters are also reconstructed + bool isDauReconstructed = mcPartIndices[dauIDList[0]] != -1 && (dChannel == k2body ? true : mcPartIndices[dauIDList[1]] != -1); + if (isDauReconstructed) { + genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), 9.5); + } } + // qa for branching ratios and invariant mass if (dChannel == k2body) { - if (isMatter) { - genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), 3.5); - } else { - genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), 4.5); - } - double hyperHelium4SigmaMCMass = RecoDecay::m(std::array{std::array{dauAlphaMom[0], dauAlphaMom[1], dauAlphaMom[2]}, std::array{dauPion0Mom[0], dauPion0Mom[1], dauPion0Mom[2]}}, std::array{o2::constants::physics::MassAlpha, o2::constants::physics::MassPi0}); + genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), isMatter ? 3.5 : 4.5); + float hyperHelium4SigmaMCMass = RecoDecay::m(std::array{std::array{dauAlphaMom[0], dauAlphaMom[1], dauAlphaMom[2]}, std::array{dauPion0Mom[0], dauPion0Mom[1], dauPion0Mom[2]}}, std::array{o2::constants::physics::MassAlpha, o2::constants::physics::MassPi0}); genQAHist.fill(HIST("hMcRecoInvMass"), hyperHelium4SigmaMCMass); } else if (dChannel == k3body_p) { - if (isMatter) { - genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), 5.5); - } else { - genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), 6.5); - } - double hyperHelium4SigmaMCMass = RecoDecay::m(std::array{std::array{dauTritonMom[0], dauTritonMom[1], dauTritonMom[2]}, std::array{dauProtonMom[0], dauProtonMom[1], dauProtonMom[2]}, std::array{dauPion0Mom[0], dauPion0Mom[1], dauPion0Mom[2]}}, std::array{o2::constants::physics::MassTriton, o2::constants::physics::MassProton, o2::constants::physics::MassPi0}); + genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), isMatter ? 5.5 : 6.5); + float hyperHelium4SigmaMCMass = RecoDecay::m(std::array{std::array{dauTritonMom[0], dauTritonMom[1], dauTritonMom[2]}, std::array{dauProtonMom[0], dauProtonMom[1], dauProtonMom[2]}, std::array{dauPion0Mom[0], dauPion0Mom[1], dauPion0Mom[2]}}, std::array{o2::constants::physics::MassTriton, o2::constants::physics::MassProton, o2::constants::physics::MassPi0}); genQAHist.fill(HIST("hMcRecoInvMass"), hyperHelium4SigmaMCMass); } else if (dChannel == k3body_n) { - if (isMatter) { - genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), 7.5); - } else { - genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), 8.5); - } - double hyperHelium4SigmaMCMass = RecoDecay::m(std::array{std::array{dauTritonMom[0], dauTritonMom[1], dauTritonMom[2]}, std::array{dauNeuteronMom[0], dauNeuteronMom[1], dauNeuteronMom[2]}, std::array{dauChargedPionMom[0], dauChargedPionMom[1], dauChargedPionMom[2]}}, std::array{o2::constants::physics::MassTriton, o2::constants::physics::MassNeutron, o2::constants::physics::MassPionCharged}); + genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), isMatter ? 7.5 : 8.5); + float hyperHelium4SigmaMCMass = RecoDecay::m(std::array{std::array{dauTritonMom[0], dauTritonMom[1], dauTritonMom[2]}, std::array{dauNeuteronMom[0], dauNeuteronMom[1], dauNeuteronMom[2]}, std::array{dauChargedPionMom[0], dauChargedPionMom[1], dauChargedPionMom[2]}}, std::array{o2::constants::physics::MassTriton, o2::constants::physics::MassNeutron, o2::constants::physics::MassPionCharged}); genQAHist.fill(HIST("hMcRecoInvMass"), hyperHelium4SigmaMCMass); } } @@ -665,7 +805,7 @@ struct Hyperhelium4sigmaQa { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc), adaptAnalysisTask(cfgc), }; } diff --git a/PWGLF/Tasks/Nuspex/CMakeLists.txt b/PWGLF/Tasks/Nuspex/CMakeLists.txt index b133fb12cd6..3493f5fbd6f 100644 --- a/PWGLF/Tasks/Nuspex/CMakeLists.txt +++ b/PWGLF/Tasks/Nuspex/CMakeLists.txt @@ -149,11 +149,6 @@ o2physics_add_dpl_workflow(nuclei-from-hypertriton-map PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(hyperhelium4sigma-analysis - SOURCES hyperhelium4sigmaAnalysis.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore - COMPONENT_NAME Analysis) - if(FastJet_FOUND) o2physics_add_dpl_workflow(angular-correlations-in-jets SOURCES angularCorrelationsInJets.cxx From c425e5556c017df3a2e6dacaf396763bdc8c128b Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Sun, 25 May 2025 00:47:17 +0200 Subject: [PATCH 1405/1650] [Common] track propagation test with modular approach (#11343) Co-authored-by: ALICE Builder --- .../TableProducer/trackPropagationTester.cxx | 312 ++---------------- Common/Tools/StandardCCDBLoader.h | 106 ++++++ Common/Tools/TrackPropagationModule.h | 260 +++++++++++++++ 3 files changed, 401 insertions(+), 277 deletions(-) create mode 100644 Common/Tools/StandardCCDBLoader.h create mode 100644 Common/Tools/TrackPropagationModule.h diff --git a/Common/TableProducer/trackPropagationTester.cxx b/Common/TableProducer/trackPropagationTester.cxx index 3787c19ee19..303e9e078b9 100644 --- a/Common/TableProducer/trackPropagationTester.cxx +++ b/Common/TableProducer/trackPropagationTester.cxx @@ -9,12 +9,19 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +/// \file trackPropagationTester.cxx +/// \brief testing ground for track propagation +/// \author ALICE + +//=============================================================== +// +// Experimental version of the track propagation task +// this utilizes an analysis task module that can be employed elsewhere +// and allows for the re-utilization of a material LUT // -// Task to add a table of track parameters propagated to the primary vertex +// candidate approach for core service approach // -// FIXME: THIS IS AN EXPERIMENTAL TASK, MEANT ONLY FOR EXPLORATORY PURPOSES. -// FIXME: PLEASE ONLY USE IT WITH EXTREME CARE. IF IN DOUBT, STICK WITH THE DEFAULT -// FIXME: TRACKPROPAGATION +//=============================================================== #include "Framework/AnalysisDataModel.h" #include "Framework/AnalysisTask.h" @@ -30,10 +37,10 @@ #include "DataFormatsParameters/GRPMagField.h" #include "CCDB/BasicCCDBManager.h" #include "Framework/HistogramRegistry.h" -#include "Framework/runDataProcessing.h" #include "DataFormatsCalibration/MeanVertexObject.h" #include "CommonConstants/GeomConstants.h" -#include "trackSelectionRequest.h" +#include "Common/Tools/TrackPropagationModule.h" +#include "Common/Tools/StandardCCDBLoader.h" // The Run 3 AO2D stores the tracks at the point of innermost update. For a track with ITS this is the innermost (or second innermost) // ITS layer. For a track without ITS, this is the TPC inner wall or for loopers in the TPC even a radius beyond that. @@ -48,294 +55,45 @@ using namespace o2::framework; // using namespace o2::framework::expressions; struct TrackPropagationTester { - Produces tracksParPropagated; - Produces tracksParExtensionPropagated; - - Produces tracksParCovPropagated; - Produces tracksParCovExtensionPropagated; - - Produces tracksDCA; + o2::common::StandardCCDBLoaderConfigurables standardCCDBLoaderConfigurables; + o2::common::TrackPropagationProducts trackPropagationProducts; + o2::common::TrackPropagationConfigurables trackPropagationConfigurables; + // CCDB boilerplate declarations + o2::framework::Configurable ccdburl{"ccdburl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Service ccdb; - HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; - - bool fillTracksDCA = false; - int runNumber = -1; - - o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT; - - const o2::dataformats::MeanVertexObject* mVtx = nullptr; - o2::parameters::GRPMagField* grpmag = nullptr; - o2::base::MatLayerCylSet* lut = nullptr; + o2::common::StandardCCDBLoader ccdbLoader; + o2::common::TrackPropagationModule trackPropagation; - // Track selection object in this scope: not necessarily a configurable - trackSelectionRequest trackSels; - // Configurable based on a struct - // Configurable trackSels{"trackSels", {}, "track selections"}; - - Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; - Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; - Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; - Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; - Configurable mVtxPath{"mVtxPath", "GLO/Calib/MeanVertex", "Path of the mean vertex file"}; - Configurable minPropagationRadius{"minPropagationDistance", o2::constants::geom::XTPCInnerRef + 0.1, "Only tracks which are at a smaller radius will be propagated, defaults to TPC inner wall"}; - - // Configurables regarding what to propagate - // FIXME: This is dangerous and error prone for general purpose use. It is meant ONLY for testing. - Configurable propagateUnassociated{"propagateUnassociated", false, "propagate tracks with no collision assoc"}; - Configurable propagateTPConly{"propagateTPConly", false, "propagate tracks with only TPC (no ITS, TRD, TOF)"}; - Configurable minTPCClusters{"minTPCClusters", 70, "min number of TPC clusters to propagate"}; - Configurable maxPropagStep{"maxPropagStep", 2.0, "max propag step"}; // to be checked systematically - // use auto-detect configuration - Configurable d_UseAutodetectMode{"d_UseAutodetectMode", false, "Autodetect requested track criteria"}; - - bool hasEnding(std::string const& fullString, std::string const& ending) - { - if (fullString.length() >= ending.length()) { - return (0 == fullString.compare(fullString.length() - ending.length(), ending.length(), ending)); - } else { - return false; - } - } + HistogramRegistry registry{"registry"}; void init(o2::framework::InitContext& initContext) { - const AxisSpec axisX{(int)4, 0.0f, +4.0f, "Track counter"}; - histos.add("hTrackCounter", "hTrackCounter", kTH1F, {axisX}); - - if (doprocessCovariance == true && doprocessStandard == true) { - LOGF(fatal, "Cannot enable processStandard and processCovariance at the same time. Please choose one."); - } - - // Checking if the tables are requested in the workflow and enabling them - auto& workflows = initContext.services().get(); - for (DeviceSpec const& device : workflows.devices) { - for (auto const& input : device.inputs) { - if (input.matcher.binding == "TracksDCA") { - fillTracksDCA = true; - } - } - } - - ccdb->setURL(ccdburl); + // CCDB boilerplate init ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); + ccdb->setURL(ccdburl.value); - lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get(lutPath)); - - if (d_UseAutodetectMode) { - LOGF(info, "*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*"); - LOGF(info, " Track propagator self-configuration"); - LOGF(info, "*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*"); - trackSels.SetTightSelections(); // Only loosen from this point forward - for (DeviceSpec const& device : workflows.devices) { - // Loop over options to find track selection - for (auto const& option : device.options) { - if (hasEnding(option.name, ".requireTPC")) { - bool lVal = option.defaultValue.get(); - LOGF(info, "Device %s, request TPC: %i", device.name, lVal); - if (trackSels.getRequireTPC() == false) - trackSels.setRequireTPC(lVal); - } - if (hasEnding(option.name, ".minTPCclusters")) { - int lVal = option.defaultValue.get(); - LOGF(info, "Device %s, min TPC clusters: %i", device.name, lVal); - if (trackSels.getMinTPCClusters() > lVal) - trackSels.setMinTPCClusters(lVal); - } - if (hasEnding(option.name, ".minTPCcrossedrows")) { - int lVal = option.defaultValue.get(); - LOGF(info, "Device %s, min TPC crossed rows: %i", device.name, lVal); - if (trackSels.getMinTPCCrossedRows() > lVal) - trackSels.setMinTPCCrossedRows(lVal); - } - if (hasEnding(option.name, ".minTPCcrossedrowsoverfindable")) { - float lVal = option.defaultValue.get(); - LOGF(info, "Device %s, min TPC crossed rows over findable: %.3f", device.name, lVal); - if (trackSels.getMinTPCCrossedRowsOverFindable() > lVal) - trackSels.setMinTPCCrossedRowsOverFindable(lVal); - } - if (hasEnding(option.name, ".requireITS")) { - bool lVal = option.defaultValue.get(); - LOGF(info, "Device %s, request ITS: %i", device.name, lVal); - if (trackSels.getRequireITS() == false) - trackSels.setRequireITS(lVal); - } - if (hasEnding(option.name, ".minITSclusters")) { - int lVal = option.defaultValue.get(); - LOGF(info, "Device %s, minimum ITS clusters: %i", device.name, lVal); - if (trackSels.getMinITSClusters() > lVal) - trackSels.setMinITSClusters(lVal); - } - if (hasEnding(option.name, ".maxITSChi2percluster")) { - float lVal = option.defaultValue.get(); - LOGF(info, "Device %s, max ITS chi2/clu: %.3f", device.name, lVal); - if (trackSels.getMaxITSChi2PerCluster() < lVal) - trackSels.setMaxITSChi2PerCluster(lVal); - } - } - } - LOGF(info, "-+*> Automatic self-config ended. Final settings:"); - trackSels.PrintSelections(); - } - } - - void initCCDB(aod::BCsWithTimestamps::iterator const& bc) - { - if (runNumber == bc.runNumber()) { - return; - } - grpmag = ccdb->getForTimeStamp(grpmagPath, bc.timestamp()); - LOG(info) << "Setting magnetic field to current " << grpmag->getL3Current() << " A for run " << bc.runNumber() << " from its GRPMagField CCDB object"; - o2::base::Propagator::initFieldFromGRP(grpmag); - o2::base::Propagator::Instance()->setMatLUT(lut); - if (propagateUnassociated) - mVtx = ccdb->getForTimeStamp(mVtxPath, bc.timestamp()); - runNumber = bc.runNumber(); + // task-specific + trackPropagation.init(trackPropagationConfigurables, registry, initContext); } - template - void FillTracksPar(TTrack& track, aod::track::TrackTypeEnum trackType, TTrackPar& trackPar) + void processReal(soa::Join const& tracks, aod::Collisions const&, aod::BCs const& bcs) { - tracksParPropagated(track.collisionId(), trackType, trackPar.getX(), trackPar.getAlpha(), trackPar.getY(), trackPar.getZ(), trackPar.getSnp(), trackPar.getTgl(), trackPar.getQ2Pt()); - tracksParExtensionPropagated(trackPar.getPt(), trackPar.getP(), trackPar.getEta(), trackPar.getPhi()); + // task-specific + ccdbLoader.initCCDBfromBCs(standardCCDBLoaderConfigurables, ccdb, bcs); + trackPropagation.fillTrackTables(trackPropagationConfigurables, ccdbLoader, tracks, trackPropagationProducts, registry); } + PROCESS_SWITCH(TrackPropagationTester, processReal, "Process Real Data", true); - void processStandard(soa::Join const& tracks, aod::Collisions const&, aod::BCsWithTimestamps const& bcs) + // ----------------------- + void processMc(soa::Join const& tracks, aod::McParticles const&, aod::Collisions const&, aod::BCs const& bcs) { - if (bcs.size() == 0) { - return; - } - initCCDB(bcs.begin()); - - std::array dcaInfo; - - int lNAll = 0; - int lNaccTPC = 0; - int lNaccNotTPCOnly = 0; - int lNPropagated = 0; - bool passTPCclu = kFALSE; - bool passNotTPCOnly = kFALSE; - - for (auto& track : tracks) { - // Selection criteria - passTPCclu = kFALSE; - passNotTPCOnly = kFALSE; - lNAll++; - if (track.tpcNClsFound() >= minTPCClusters) { - passTPCclu = kTRUE; - lNaccTPC++; - } - if ((track.hasTPC() && !track.hasITS() && !track.hasTRD() && !track.hasTOF()) || propagateTPConly) { - passNotTPCOnly = kTRUE; - lNaccNotTPCOnly++; - } - - dcaInfo[0] = 999; - dcaInfo[1] = 999; - aod::track::TrackTypeEnum trackType = (aod::track::TrackTypeEnum)track.trackType(); - auto trackPar = getTrackPar(track); - // Only propagate tracks which have passed the innermost wall of the TPC (e.g. skipping loopers etc). Others fill unpropagated. - if (track.trackType() == aod::track::TrackIU && track.x() < minPropagationRadius && passTPCclu && passNotTPCOnly) { - if (track.has_collision()) { - auto const& collision = track.collision(); - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackPar, maxPropagStep, matCorr, &dcaInfo); - trackType = aod::track::Track; - lNPropagated++; - } else { - if (propagateUnassociated) { - o2::base::Propagator::Instance()->propagateToDCABxByBz({mVtx->getX(), mVtx->getY(), mVtx->getZ()}, trackPar, maxPropagStep, matCorr, &dcaInfo); - trackType = aod::track::Track; - lNPropagated++; - } - } - } - FillTracksPar(track, trackType, trackPar); - if (fillTracksDCA) { - tracksDCA(dcaInfo[0], dcaInfo[1]); - } - } - // Fill only per table (not per track). ROOT FindBin is slow - histos.fill(HIST("hTrackCounter"), 0.5, lNAll); - histos.fill(HIST("hTrackCounter"), 1.5, lNaccTPC); - histos.fill(HIST("hTrackCounter"), 2.5, lNaccNotTPCOnly); - histos.fill(HIST("hTrackCounter"), 3.5, lNPropagated); - } - PROCESS_SWITCH(TrackPropagationTester, processStandard, "Process without covariance", true); - - void processCovariance(soa::Join const& tracks, aod::Collisions const&, aod::BCsWithTimestamps const& bcs) - { - if (bcs.size() == 0) { - return; - } - initCCDB(bcs.begin()); - - o2::dataformats::DCA dcaInfoCov; - o2::dataformats::VertexBase vtx; - - int lNAll = 0; - int lNaccTPC = 0; - int lNaccNotTPCOnly = 0; - int lNPropagated = 0; - bool passTPCclu = kFALSE; - bool passNotTPCOnly = kFALSE; - - for (auto& track : tracks) { - // Selection criteria - passTPCclu = kFALSE; - passNotTPCOnly = kFALSE; - lNAll++; - if (track.tpcNClsFound() >= minTPCClusters) { - passTPCclu = kTRUE; - lNaccTPC++; - } - if ((track.hasTPC() && !track.hasITS() && !track.hasTRD() && !track.hasTOF()) || propagateTPConly) { - passNotTPCOnly = kTRUE; - lNaccNotTPCOnly++; - } - - dcaInfoCov.set(999, 999, 999, 999, 999); - auto trackParCov = getTrackParCov(track); - aod::track::TrackTypeEnum trackType = (aod::track::TrackTypeEnum)track.trackType(); - // Only propagate tracks which have passed the innermost wall of the TPC (e.g. skipping loopers etc). Others fill unpropagated. - if (track.trackType() == aod::track::TrackIU && track.x() < minPropagationRadius && passTPCclu && passNotTPCOnly) { - if (track.has_collision()) { - auto const& collision = track.collision(); - vtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); - vtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); - o2::base::Propagator::Instance()->propagateToDCABxByBz(vtx, trackParCov, maxPropagStep, matCorr, &dcaInfoCov); - trackType = aod::track::Track; - lNPropagated++; - } else { - if (propagateUnassociated) { - vtx.setPos({mVtx->getX(), mVtx->getY(), mVtx->getZ()}); - vtx.setCov(mVtx->getSigmaX() * mVtx->getSigmaX(), 0.0f, mVtx->getSigmaY() * mVtx->getSigmaY(), 0.0f, 0.0f, mVtx->getSigmaZ() * mVtx->getSigmaZ()); - o2::base::Propagator::Instance()->propagateToDCABxByBz(vtx, trackParCov, maxPropagStep, matCorr, &dcaInfoCov); - trackType = aod::track::Track; - lNPropagated++; - } - } - } - FillTracksPar(track, trackType, trackParCov); - if (fillTracksDCA) { - tracksDCA(dcaInfoCov.getY(), dcaInfoCov.getZ()); - } - // TODO do we keep the rho as 0? Also the sigma's are duplicated information - tracksParCovPropagated(std::sqrt(trackParCov.getSigmaY2()), std::sqrt(trackParCov.getSigmaZ2()), std::sqrt(trackParCov.getSigmaSnp2()), - std::sqrt(trackParCov.getSigmaTgl2()), std::sqrt(trackParCov.getSigma1Pt2()), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - tracksParCovExtensionPropagated(trackParCov.getSigmaY2(), trackParCov.getSigmaZY(), trackParCov.getSigmaZ2(), trackParCov.getSigmaSnpY(), - trackParCov.getSigmaSnpZ(), trackParCov.getSigmaSnp2(), trackParCov.getSigmaTglY(), trackParCov.getSigmaTglZ(), trackParCov.getSigmaTglSnp(), - trackParCov.getSigmaTgl2(), trackParCov.getSigma1PtY(), trackParCov.getSigma1PtZ(), trackParCov.getSigma1PtSnp(), trackParCov.getSigma1PtTgl(), - trackParCov.getSigma1Pt2()); - } - // Fill only per table (not per track). ROOT FindBin is slow - histos.fill(HIST("hTrackCounter"), 0.5, lNAll); - histos.fill(HIST("hTrackCounter"), 1.5, lNaccTPC); - histos.fill(HIST("hTrackCounter"), 2.5, lNaccNotTPCOnly); - histos.fill(HIST("hTrackCounter"), 3.5, lNPropagated); + ccdbLoader.initCCDBfromBCs(standardCCDBLoaderConfigurables, ccdb, bcs); + trackPropagation.fillTrackTables(trackPropagationConfigurables, ccdbLoader, tracks, trackPropagationProducts, registry); } - PROCESS_SWITCH(TrackPropagationTester, processCovariance, "Process with covariance", false); + PROCESS_SWITCH(TrackPropagationTester, processMc, "Process Monte Carlo", false); }; //**************************************************************************************** diff --git a/Common/Tools/StandardCCDBLoader.h b/Common/Tools/StandardCCDBLoader.h new file mode 100644 index 00000000000..6ba4c9be9a1 --- /dev/null +++ b/Common/Tools/StandardCCDBLoader.h @@ -0,0 +1,106 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file StandardCCDBLoader.cxx +/// \brief A simple object to handle ccdb queries +/// \author ALICE + +#ifndef COMMON_TOOLS_STANDARDCCDBLOADER_H_ +#define COMMON_TOOLS_STANDARDCCDBLOADER_H_ + +#include +#include +#include +#include +#include "Framework/AnalysisDataModel.h" + +//__________________________________________ +// Standard class to load stuff +// such as matLUT, B and mean Vertex +// partial requests possible. + +namespace o2 +{ +namespace common +{ + +// ConfigurableGroup with locations +struct StandardCCDBLoaderConfigurables : o2::framework::ConfigurableGroup { + std::string prefix = "ccdb"; + o2::framework::Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + o2::framework::Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; + o2::framework::Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + o2::framework::Configurable mVtxPath{"mVtxPath", "GLO/Calib/MeanVertex", "Path of the mean vertex file"}; +}; + +class StandardCCDBLoader +{ + public: + StandardCCDBLoader() + { + // constructor - null pointers + mMeanVtx = nullptr; + grpmag = nullptr; + lut = nullptr; + }; + + // commonly needed objects + const o2::dataformats::MeanVertexObject* mMeanVtx = nullptr; + o2::parameters::GRPMagField* grpmag = nullptr; + o2::base::MatLayerCylSet* lut = nullptr; + int runNumber = -1; + + template + void initCCDBfromBCs(TConfigurableGroup const& cGroup, TCCDB& ccdb, TBCs& bcs, bool getMeanVertex = true) + { + // instant load from BCs table. Bonus: protect also against empty bcs + if (bcs.size() == 0) { + return; + } + auto bc = bcs.begin(); + initCCDB(cGroup, ccdb, bc.runNumber(), getMeanVertex); + } + + template + void initCCDB(TConfigurableGroup const& cGroup, TCCDB& ccdb, int currentRunNumber, bool getMeanVertex = true) + { + if (runNumber == currentRunNumber) { + return; + } + + // load matLUT for this timestamp + if (!lut) { + LOG(info) << "Loading material look-up table for timestamp: " << currentRunNumber; + lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->template getForRun(cGroup.lutPath.value, currentRunNumber)); + } else { + LOG(info) << "Material look-up table already in place. Not reloading."; + } + + grpmag = ccdb->template getForRun(cGroup.grpmagPath.value, currentRunNumber); + LOG(info) << "Setting global propagator magnetic field to current " << grpmag->getL3Current() << " A for run " << currentRunNumber << " from its GRPMagField CCDB object"; + o2::base::Propagator::initFieldFromGRP(grpmag); + LOG(info) << "Setting global propagator material propagation LUT"; + o2::base::Propagator::Instance()->setMatLUT(lut); + if (getMeanVertex) { + // only try this if explicitly requested + mMeanVtx = ccdb->template getForRun(cGroup.mVtxPath.value, currentRunNumber); + } else { + mMeanVtx = nullptr; + } + + runNumber = currentRunNumber; + } +}; + +} // namespace common +} // namespace o2 + +#endif // COMMON_TOOLS_STANDARDCCDBLOADER_H_ diff --git a/Common/Tools/TrackPropagationModule.h b/Common/Tools/TrackPropagationModule.h new file mode 100644 index 00000000000..2939e995117 --- /dev/null +++ b/Common/Tools/TrackPropagationModule.h @@ -0,0 +1,260 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file TrackPropagationModule.h +/// \brief track propagation module functionality to be used in tasks +/// \author ALICE + +#ifndef COMMON_TOOLS_TRACKPROPAGATIONMODULE_H_ +#define COMMON_TOOLS_TRACKPROPAGATIONMODULE_H_ + +#include +#include +#include +#include +#include +#include "Framework/AnalysisDataModel.h" +#include "Framework/Configurable.h" +#include "Framework/HistogramSpec.h" +#include "Common/Tools/TrackTuner.h" +#include "TableHelper.h" + +//__________________________________________ +// track propagation module +// +// this class is capable of performing the usual track propagation +// and table creation it is a demonstration of core service +// plug-in functionality that could be used to reduce the number of +// heavyweight (e.g. mat-LUT-using, propagating) core services to +// reduce overhead and make it easier to pipeline / parallelize +// bottlenecks in core services + +namespace o2 +{ +namespace common +{ + +struct TrackPropagationProducts : o2::framework::ProducesGroup { + o2::framework::Produces tracksParPropagated; + o2::framework::Produces tracksParExtensionPropagated; + o2::framework::Produces tracksParCovPropagated; + o2::framework::Produces tracksParCovExtensionPropagated; + o2::framework::Produces tracksDCA; + o2::framework::Produces tracksDCACov; + o2::framework::Produces tunertable; +}; + +struct TrackPropagationConfigurables : o2::framework::ConfigurableGroup { + std::string prefix = "trackPropagation"; + o2::framework::Configurable minPropagationRadius{"minPropagationDistance", o2::constants::geom::XTPCInnerRef + 0.1, "Only tracks which are at a smaller radius will be propagated, defaults to TPC inner wall"}; + // for TrackTuner only (MC smearing) + o2::framework::Configurable useTrackTuner{"useTrackTuner", false, "Apply track tuner corrections to MC"}; + o2::framework::Configurable useTrkPid{"useTrkPid", false, "use pid in tracking"}; + o2::framework::Configurable fillTrackTunerTable{"fillTrackTunerTable", false, "flag to fill track tuner table"}; + o2::framework::Configurable trackTunerConfigSource{"trackTunerConfigSource", aod::track_tuner::InputString, "1: input string; 2: TrackTuner Configurables"}; + o2::framework::Configurable trackTunerParams{"trackTunerParams", "debugInfo=0|updateTrackDCAs=1|updateTrackCovMat=1|updateCurvature=0|updateCurvatureIU=0|updatePulls=0|isInputFileFromCCDB=1|pathInputFile=Users/m/mfaggin/test/inputsTrackTuner/PbPb2022|nameInputFile=trackTuner_DataLHC22sPass5_McLHC22l1b2_run529397.root|pathFileQoverPt=Users/h/hsharma/qOverPtGraphs|nameFileQoverPt=D0sigma_Data_removal_itstps_MC_LHC22b1b.root|usePvRefitCorrections=0|qOverPtMC=-1.|qOverPtData=-1.", "TrackTuner parameter initialization (format: =|=)"}; + o2::framework::ConfigurableAxis axisPtQA{"axisPtQA", {o2::framework::VARIABLE_WIDTH, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.2f, 2.4f, 2.6f, 2.8f, 3.0f, 3.2f, 3.4f, 3.6f, 3.8f, 4.0f, 4.4f, 4.8f, 5.2f, 5.6f, 6.0f, 6.5f, 7.0f, 7.5f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 17.0f, 19.0f, 21.0f, 23.0f, 25.0f, 30.0f, 35.0f, 40.0f, 50.0f}, "pt axis for QA histograms"}; +}; + +class TrackPropagationModule +{ + public: + TrackPropagationModule() + { + // constructor + } + + // controls behaviour + bool fillTracksCov = false; + bool fillTracksDCA = false; + bool fillTracksDCACov = false; + o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT; + + // pointers to objs needed for operation + std::shared_ptr trackTunedTracks; + TrackTuner trackTunerObj; + + // Running variables + std::array mDcaInfo; + o2::dataformats::DCA mDcaInfoCov; + o2::dataformats::VertexBase mVtx; + o2::track::TrackParametrization mTrackPar; + o2::track::TrackParametrizationWithError mTrackParCov; + + template + void init(TConfigurableGroup const& cGroup, THistoRegistry& registry, TInitContext& initContext) + { + // Checking if the tables are requested in the workflow and enabling them + fillTracksCov = isTableRequiredInWorkflow(initContext, "TracksCov"); + fillTracksDCA = isTableRequiredInWorkflow(initContext, "TracksDCA"); + fillTracksDCACov = isTableRequiredInWorkflow(initContext, "TracksDCACov"); + + /// TrackTuner initialization + if (cGroup.useTrackTuner.value) { + std::string outputStringParams = ""; + switch (cGroup.trackTunerConfigSource.value) { + case o2::aod::track_tuner::InputString: + outputStringParams = trackTunerObj.configParams(cGroup.trackTunerParams.value); + break; + case o2::aod::track_tuner::Configurables: + outputStringParams = trackTunerObj.configParams(); + break; + + default: + LOG(fatal) << "TrackTuner configuration source not defined. Fix it! (Supported options: input string (1); Configurables (2))"; + break; + } + + trackTunerObj.getDcaGraphs(); + } + + trackTunedTracks = registry.template add("trackTunedTracks", "trackTunedTracks", o2::framework::kTH1D, {{1, 0.5f, 1.5f}}); + + // Histograms for track tuner + o2::framework::AxisSpec axisBinsDCA = {600, -0.15f, 0.15f, "#it{dca}_{xy} (cm)"}; + registry.template add("hDCAxyVsPtRec", "hDCAxyVsPtRec", o2::framework::kTH2F, {axisBinsDCA, cGroup.axisPtQA}); + registry.template add("hDCAxyVsPtMC", "hDCAxyVsPtMC", o2::framework::kTH2F, {axisBinsDCA, cGroup.axisPtQA}); + registry.template add("hDCAzVsPtRec", "hDCAzVsPtRec", o2::framework::kTH2F, {axisBinsDCA, cGroup.axisPtQA}); + registry.template add("hDCAzVsPtMC", "hDCAzVsPtMC", o2::framework::kTH2F, {axisBinsDCA, cGroup.axisPtQA}); + } + + template + void fillTrackTables(TConfigurableGroup const& cGroup, TCCDBLoader const& ccdbLoader, TTracks const& tracks, TOutputGroup& cursors, THistoRegistry& registry) + { + if (fillTracksCov) { + cursors.tracksParCovPropagated.reserve(tracks.size()); + cursors.tracksParCovExtensionPropagated.reserve(tracks.size()); + if (fillTracksDCACov) { + cursors.tracksDCACov.reserve(tracks.size()); + } + } else { + cursors.tracksParPropagated.reserve(tracks.size()); + cursors.tracksParExtensionPropagated.reserve(tracks.size()); + if (fillTracksDCA) { + cursors.tracksDCA.reserve(tracks.size()); + } + } + + for (const auto& track : tracks) { + if (fillTracksCov) { + if (fillTracksDCA || fillTracksDCACov) { + mDcaInfoCov.set(999, 999, 999, 999, 999); + } + setTrackParCov(track, mTrackParCov); + if (cGroup.useTrkPid.value) { + mTrackParCov.setPID(track.pidForTracking()); + } + } else { + if (fillTracksDCA) { + mDcaInfo[0] = 999; + mDcaInfo[1] = 999; + } + setTrackPar(track, mTrackPar); + if (cGroup.useTrkPid.value) { + mTrackPar.setPID(track.pidForTracking()); + } + } + // auto trackParCov = getTrackParCov(track); + o2::aod::track::TrackTypeEnum trackType = (o2::aod::track::TrackTypeEnum)track.trackType(); + // std::array trackPxPyPz; + // std::array trackPxPyPzTuned = {0.0, 0.0, 0.0}; + double q2OverPtNew = -9999.; + // Only propagate tracks which have passed the innermost wall of the TPC (e.g. skipping loopers etc). Others fill unpropagated. + if (track.trackType() == o2::aod::track::TrackIU && track.x() < cGroup.minPropagationRadius.value) { + if (fillTracksCov) { + if constexpr (isMc) { // checking MC and fillCovMat block begins + // bool hasMcParticle = track.has_mcParticle(); + if (cGroup.useTrackTuner) { + trackTunedTracks->Fill(1); // all tracks + bool hasMcParticle = track.has_mcParticle(); + if (hasMcParticle) { + auto mcParticle = track.mcParticle(); + trackTunerObj.tuneTrackParams(mcParticle, mTrackParCov, matCorr, &mDcaInfoCov, trackTunedTracks); + q2OverPtNew = mTrackParCov.getQ2Pt(); + } + } + } // MC and fillCovMat block ends + } + bool isPropagationOK = true; + + if (track.has_collision()) { + auto const& collision = track.collision(); + if (fillTracksCov) { + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + isPropagationOK = o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, mTrackParCov, 2.f, matCorr, &mDcaInfoCov); + } else { + isPropagationOK = o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, mTrackPar, 2.f, matCorr, &mDcaInfo); + } + } else { + if (fillTracksCov) { + mVtx.setPos({ccdbLoader.mMeanVtx->getX(), ccdbLoader.mMeanVtx->getY(), ccdbLoader.mMeanVtx->getZ()}); + mVtx.setCov(ccdbLoader.mMeanVtx->getSigmaX() * ccdbLoader.mMeanVtx->getSigmaX(), 0.0f, ccdbLoader.mMeanVtx->getSigmaY() * ccdbLoader.mMeanVtx->getSigmaY(), 0.0f, 0.0f, ccdbLoader.mMeanVtx->getSigmaZ() * ccdbLoader.mMeanVtx->getSigmaZ()); + isPropagationOK = o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, mTrackParCov, 2.f, matCorr, &mDcaInfoCov); + } else { + isPropagationOK = o2::base::Propagator::Instance()->propagateToDCABxByBz({ccdbLoader.mMeanVtx->getX(), ccdbLoader.mMeanVtx->getY(), ccdbLoader.mMeanVtx->getZ()}, mTrackPar, 2.f, matCorr, &mDcaInfo); + } + } + if (isPropagationOK) { + trackType = o2::aod::track::Track; + } + // filling some QA histograms for track tuner test purpose + if (fillTracksCov) { + if constexpr (isMc) { // checking MC and fillCovMat block begins + if (track.has_mcParticle() && isPropagationOK) { + auto mcParticle1 = track.mcParticle(); + // && abs(mcParticle1.pdgCode())==211 + if (mcParticle1.isPhysicalPrimary()) { + registry.fill(HIST("hDCAxyVsPtRec"), mDcaInfoCov.getY(), mTrackParCov.getPt()); + registry.fill(HIST("hDCAxyVsPtMC"), mDcaInfoCov.getY(), mcParticle1.pt()); + registry.fill(HIST("hDCAzVsPtRec"), mDcaInfoCov.getZ(), mTrackParCov.getPt()); + registry.fill(HIST("hDCAzVsPtMC"), mDcaInfoCov.getZ(), mcParticle1.pt()); + } + } + } // MC and fillCovMat block ends + } + } + // Filling modified Q/Pt values at IU/production point by track tuner in track tuner table + if (cGroup.useTrackTuner.value && cGroup.fillTrackTunerTable.value) { + cursors.tunertable(q2OverPtNew); + } + // LOG(info) << " trackPropagation (this value filled in tuner table)--> " << q2OverPtNew; + if (fillTracksCov) { + cursors.tracksParPropagated(track.collisionId(), trackType, mTrackParCov.getX(), mTrackParCov.getAlpha(), mTrackParCov.getY(), mTrackParCov.getZ(), mTrackParCov.getSnp(), mTrackParCov.getTgl(), mTrackParCov.getQ2Pt()); + cursors.tracksParExtensionPropagated(mTrackParCov.getPt(), mTrackParCov.getP(), mTrackParCov.getEta(), mTrackParCov.getPhi()); + // TODO do we keep the rho as 0? Also the sigma's are duplicated information + cursors.tracksParCovPropagated(std::sqrt(mTrackParCov.getSigmaY2()), std::sqrt(mTrackParCov.getSigmaZ2()), std::sqrt(mTrackParCov.getSigmaSnp2()), + std::sqrt(mTrackParCov.getSigmaTgl2()), std::sqrt(mTrackParCov.getSigma1Pt2()), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + cursors.tracksParCovExtensionPropagated(mTrackParCov.getSigmaY2(), mTrackParCov.getSigmaZY(), mTrackParCov.getSigmaZ2(), mTrackParCov.getSigmaSnpY(), + mTrackParCov.getSigmaSnpZ(), mTrackParCov.getSigmaSnp2(), mTrackParCov.getSigmaTglY(), mTrackParCov.getSigmaTglZ(), mTrackParCov.getSigmaTglSnp(), + mTrackParCov.getSigmaTgl2(), mTrackParCov.getSigma1PtY(), mTrackParCov.getSigma1PtZ(), mTrackParCov.getSigma1PtSnp(), mTrackParCov.getSigma1PtTgl(), + mTrackParCov.getSigma1Pt2()); + if (fillTracksDCA) { + cursors.tracksDCA(mDcaInfoCov.getY(), mDcaInfoCov.getZ()); + } + if (fillTracksDCACov) { + cursors.tracksDCACov(mDcaInfoCov.getSigmaY2(), mDcaInfoCov.getSigmaZ2()); + } + } else { + cursors.tracksParPropagated(track.collisionId(), trackType, mTrackPar.getX(), mTrackPar.getAlpha(), mTrackPar.getY(), mTrackPar.getZ(), mTrackPar.getSnp(), mTrackPar.getTgl(), mTrackPar.getQ2Pt()); + cursors.tracksParExtensionPropagated(mTrackPar.getPt(), mTrackPar.getP(), mTrackPar.getEta(), mTrackPar.getPhi()); + if (fillTracksDCA) { + cursors.tracksDCA(mDcaInfo[0], mDcaInfo[1]); + } + } + } + } +}; + +} // namespace common +} // namespace o2 + +#endif // COMMON_TOOLS_TRACKPROPAGATIONMODULE_H_ From ced2f52f670f2cd4fd56ce68df54af703b487196 Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Sun, 25 May 2025 05:14:34 +0200 Subject: [PATCH 1406/1650] [Common] minor fix: add .value in track propag module (#11346) --- Common/Tools/TrackPropagationModule.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Common/Tools/TrackPropagationModule.h b/Common/Tools/TrackPropagationModule.h index 2939e995117..1c4b5c34ecf 100644 --- a/Common/Tools/TrackPropagationModule.h +++ b/Common/Tools/TrackPropagationModule.h @@ -172,7 +172,7 @@ class TrackPropagationModule if (fillTracksCov) { if constexpr (isMc) { // checking MC and fillCovMat block begins // bool hasMcParticle = track.has_mcParticle(); - if (cGroup.useTrackTuner) { + if (cGroup.useTrackTuner.value) { trackTunedTracks->Fill(1); // all tracks bool hasMcParticle = track.has_mcParticle(); if (hasMcParticle) { From d850902d0d5f6b41b76076305ce3a9dfd1679f88 Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Sun, 25 May 2025 07:02:48 +0200 Subject: [PATCH 1407/1650] [Common] Adjustment for fused trackprop + strabuilder (#11348) --- Common/TableProducer/trackPropagationTester.cxx | 8 ++++---- Common/Tools/TrackPropagationModule.h | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Common/TableProducer/trackPropagationTester.cxx b/Common/TableProducer/trackPropagationTester.cxx index 303e9e078b9..694ff77d3c0 100644 --- a/Common/TableProducer/trackPropagationTester.cxx +++ b/Common/TableProducer/trackPropagationTester.cxx @@ -79,19 +79,19 @@ struct TrackPropagationTester { trackPropagation.init(trackPropagationConfigurables, registry, initContext); } - void processReal(soa::Join const& tracks, aod::Collisions const&, aod::BCs const& bcs) + void processReal(aod::Collisions const& collisions, soa::Join const& tracks, aod::Collisions const&, aod::BCs const& bcs) { // task-specific ccdbLoader.initCCDBfromBCs(standardCCDBLoaderConfigurables, ccdb, bcs); - trackPropagation.fillTrackTables(trackPropagationConfigurables, ccdbLoader, tracks, trackPropagationProducts, registry); + trackPropagation.fillTrackTables(trackPropagationConfigurables, ccdbLoader, collisions, tracks, trackPropagationProducts, registry); } PROCESS_SWITCH(TrackPropagationTester, processReal, "Process Real Data", true); // ----------------------- - void processMc(soa::Join const& tracks, aod::McParticles const&, aod::Collisions const&, aod::BCs const& bcs) + void processMc(aod::Collisions const& collisions, soa::Join const& tracks, aod::McParticles const&, aod::Collisions const&, aod::BCs const& bcs) { ccdbLoader.initCCDBfromBCs(standardCCDBLoaderConfigurables, ccdb, bcs); - trackPropagation.fillTrackTables(trackPropagationConfigurables, ccdbLoader, tracks, trackPropagationProducts, registry); + trackPropagation.fillTrackTables(trackPropagationConfigurables, ccdbLoader, collisions, tracks, trackPropagationProducts, registry); } PROCESS_SWITCH(TrackPropagationTester, processMc, "Process Monte Carlo", false); }; diff --git a/Common/Tools/TrackPropagationModule.h b/Common/Tools/TrackPropagationModule.h index 1c4b5c34ecf..fb957a87b9d 100644 --- a/Common/Tools/TrackPropagationModule.h +++ b/Common/Tools/TrackPropagationModule.h @@ -126,8 +126,8 @@ class TrackPropagationModule registry.template add("hDCAzVsPtMC", "hDCAzVsPtMC", o2::framework::kTH2F, {axisBinsDCA, cGroup.axisPtQA}); } - template - void fillTrackTables(TConfigurableGroup const& cGroup, TCCDBLoader const& ccdbLoader, TTracks const& tracks, TOutputGroup& cursors, THistoRegistry& registry) + template + void fillTrackTables(TConfigurableGroup const& cGroup, TCCDBLoader const& ccdbLoader, TCollisions const& collisions, TTracks const& tracks, TOutputGroup& cursors, THistoRegistry& registry) { if (fillTracksCov) { cursors.tracksParCovPropagated.reserve(tracks.size()); @@ -186,7 +186,7 @@ class TrackPropagationModule bool isPropagationOK = true; if (track.has_collision()) { - auto const& collision = track.collision(); + auto const& collision = collisions.rawIteratorAt(track.collisionId()); if (fillTracksCov) { mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); From a6d2baf6b221be9ea020ad74eefc31f2f423f962 Mon Sep 17 00:00:00 2001 From: Fabrizio Date: Mon, 26 May 2025 03:35:50 +0800 Subject: [PATCH 1408/1650] [PWGHF,Trigger] Revert to symmetric NsigmaDe cut for charm femto trigger (#11353) --- EventFiltering/PWGHF/HFFilterHelpers.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/EventFiltering/PWGHF/HFFilterHelpers.h b/EventFiltering/PWGHF/HFFilterHelpers.h index 6135e0a715d..8e3dae4451d 100644 --- a/EventFiltering/PWGHF/HFFilterHelpers.h +++ b/EventFiltering/PWGHF/HFFilterHelpers.h @@ -278,7 +278,7 @@ constexpr float massJPsi = o2::constants::physics::MassJPsi; static const o2::framework::AxisSpec ptAxis{50, 0.f, 50.f}; static const o2::framework::AxisSpec pAxis{50, 0.f, 10.f}; -static const o2::framework::AxisSpec kstarAxis{100, 0.f, 1.f}; +static const o2::framework::AxisSpec kstarAxis{200, 0.f, 2.f}; static const o2::framework::AxisSpec etaAxis{30, -1.5f, 1.5f}; static const o2::framework::AxisSpec nSigmaAxis{100, -10.f, 10.f}; static const o2::framework::AxisSpec alphaAxis{100, -1.f, 1.f}; @@ -958,11 +958,11 @@ inline bool HfFilterHelper::isSelectedTrack4Femto(const T1& track, const T2& tra // Apply different PID strategy in different pt range // one side selection only if (pt <= ptThresholdPidStrategy) { - if (NSigmaTPC < -nSigmaCuts[0] || NSigmaITS < -nSigmaCuts[3]) { // Use TPC and ITS below the threshold, NSigmaITS for deuteron with a lower limit + if (std::fabs(NSigmaTPC) > nSigmaCuts[0] || NSigmaITS < -nSigmaCuts[3]) { // Use TPC and ITS below the threshold, NSigmaITS for deuteron with a lower limit return false; } } else { - if (NSigmaTOF < -nSigmaCuts[1] || NSigmaTPC < -nSigmaCuts[0]) { // Use combined TPC and TOF above the threshold + if (std::fabs(NSigmaTOF) > nSigmaCuts[1] || std::fabs(NSigmaTPC) > nSigmaCuts[0]) { // Use combined TPC and TOF above the threshold return false; } } @@ -970,7 +970,7 @@ inline bool HfFilterHelper::isSelectedTrack4Femto(const T1& track, const T2& tra if (activateQA > 1) { hTPCPID->Fill(track.p(), NSigmaTPC); - if ((forceTof || track.hasTOF())) { + if ((!forceTof || track.hasTOF())) { if (trackSpecies == kProtonForFemto) hTOFPID->Fill(track.p(), NSigmaTOF); else if (trackSpecies == kDeuteronForFemto && pt > ptThresholdPidStrategy) From ccc5f551a5c30bee2a781a0b00b529a08c460650 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Mon, 26 May 2025 14:38:41 +0900 Subject: [PATCH 1409/1650] [PWGEM/Dilepton] fix collision selection in skimmerPrimaryMuon.cxx (#11354) --- .../TableProducer/skimmerPrimaryMuon.cxx | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx b/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx index 439e324ab3c..2558b46cb3a 100644 --- a/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx +++ b/PWGEM/Dilepton/TableProducer/skimmerPrimaryMuon.cxx @@ -393,6 +393,10 @@ struct skimmerPrimaryMuon { const auto& bc = collision.template bc_as(); initCCDB(bc); + if (!collision.isSelected()) { + continue; + } + const auto& fwdtracks_per_coll = fwdtracks.sliceBy(perCollision, collision.globalIndex()); for (const auto& fwdtrack : fwdtracks_per_coll) { if (fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack && fwdtrack.trackType() != o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) { @@ -417,6 +421,10 @@ struct skimmerPrimaryMuon { const auto& bc = collision.template bc_as(); initCCDB(bc); + if (!collision.isSelected()) { + continue; + } + const auto& fwdtrackIdsThisCollision = fwdtrackIndices.sliceBy(fwdtrackIndicesPerCollision, collision.globalIndex()); for (const auto& fwdtrackId : fwdtrackIdsThisCollision) { const auto& fwdtrack = fwdtrackId.template fwdtrack_as(); @@ -435,6 +443,11 @@ struct skimmerPrimaryMuon { for (const auto& collision : collisions) { const auto& bc = collision.template bc_as(); initCCDB(bc); + + if (!collision.isSelected()) { + continue; + } + if (collision.swtaliastmp_raw() == 0) { continue; } @@ -462,6 +475,9 @@ struct skimmerPrimaryMuon { for (const auto& collision : collisions) { const auto& bc = collision.template bc_as(); initCCDB(bc); + if (!collision.isSelected()) { + continue; + } if (collision.swtaliastmp_raw() == 0) { continue; } @@ -484,6 +500,9 @@ struct skimmerPrimaryMuon { for (const auto& collision : collisions) { const auto& bc = collision.template bc_as(); initCCDB(bc); + if (!collision.isSelected()) { + continue; + } if (!collision.has_mcCollision()) { continue; } @@ -514,6 +533,9 @@ struct skimmerPrimaryMuon { for (const auto& collision : collisions) { const auto& bc = collision.template bc_as(); initCCDB(bc); + if (!collision.isSelected()) { + continue; + } if (!collision.has_mcCollision()) { continue; } From 40d78c4e501efacec927415a11d0bb11e4bc4f2a Mon Sep 17 00:00:00 2001 From: MaolinZH <109225729+MaolinZH@users.noreply.github.com> Date: Mon, 26 May 2025 10:35:10 +0200 Subject: [PATCH 1410/1650] [PWGDQ] remove the kPhyiscalPrimay restriction for muon from various sources in MCSignals (#11316) --- PWGDQ/Core/CutsLibrary.cxx | 11 +++++++++++ PWGDQ/Core/HistogramsLibrary.cxx | 9 +++++---- PWGDQ/Core/MCSignalLibrary.cxx | 12 +----------- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/PWGDQ/Core/CutsLibrary.cxx b/PWGDQ/Core/CutsLibrary.cxx index ff2cfe9298d..03d978bcb22 100644 --- a/PWGDQ/Core/CutsLibrary.cxx +++ b/PWGDQ/Core/CutsLibrary.cxx @@ -3188,6 +3188,17 @@ AnalysisCompositeCut* o2::aod::dqcuts::GetCompositeCut(const char* cutName) return cut; } + if (!nameStr.compare("muonQualityCutsMUONStandalone")) { + cut->AddCut(GetAnalysisCut("matchedMchMid")); + cut->AddCut(GetAnalysisCut("muonQualityCuts")); + return cut; + } + + if (!nameStr.compare("muonQualityCutsGlobal")) { + cut->AddCut(GetAnalysisCut("matchedGlobal")); + cut->AddCut(GetAnalysisCut("muonQualityCuts")); + return cut; + } // ----------------------------------------------------------- // Pair cuts if (!nameStr.compare("pairNoCut")) { diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index b13a55d026a..b65c12de647 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -565,10 +565,11 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "TPCnSigKa_Corr_pIN", "TPC n-#sigma(K) Corr. vs pIN", false, 100, 0.0, 10.0, VarManager::kPin, 100, -5.0, 5.0, VarManager::kTPCnSigmaKa_Corr); hm->AddHistogram(histClass, "TPCnSigPr_Corr_pIN", "TPC n-#sigma(p) Corr. vs pIN", false, 100, 0.0, 10.0, VarManager::kPin, 100, -5.0, 5.0, VarManager::kTPCnSigmaPr_Corr); } - if (subGroupStr.Contains("tpcpid_nsigel")) { - hm->AddHistogram(histClass, "TPCnSigEl_TPCnSigPi", "TPC n-#sigma(e) . vs TPC n-#sigma(#pi)", false, 100, -5.0, 5.0, VarManager::kTPCnSigmaEl, 100, -5.0, 5.0, VarManager::kTPCnSigmaPi); - hm->AddHistogram(histClass, "TPCnSigEl_TPCnSigKa", "TPC n-#sigma(e) . vs TPC n-#sigma(K)", false, 100, -5.0, 5.0, VarManager::kTPCnSigmaEl, 100, -5.0, 5.0, VarManager::kTPCnSigmaKa); - hm->AddHistogram(histClass, "TPCnSigEl_TPCnSigPr", "TPC n-#sigma(e) . vs TPC n-#sigma(p)", false, 100, -5.0, 5.0, VarManager::kTPCnSigmaEl, 100, -5.0, 5.0, VarManager::kTPCnSigmaPr); + if (subGroupStr.Contains("tpcpidvspt")) { + hm->AddHistogram(histClass, "TPCnSigEl_Pt", "TPC n-#sigma(e). vs Pt", false, 200, 0.0, 20.0, VarManager::kPt, 100, -5.0, 5.0, VarManager::kTPCnSigmaEl); + hm->AddHistogram(histClass, "TPCnSigPi_Pt", "TPC n-#sigma(#pi). vs Pt", false, 200, 0.0, 20.0, VarManager::kPt, 100, -5.0, 5.0, VarManager::kTPCnSigmaPi); + hm->AddHistogram(histClass, "TPCnSigKa_Pt", "TPC n-#sigma(K). vs Pt", false, 200, 0.0, 20.0, VarManager::kPt, 100, -5.0, 5.0, VarManager::kTPCnSigmaKa); + hm->AddHistogram(histClass, "TPCnSigPr_Pt", "TPC n-#sigma(p). vs Pt", false, 200, 0.0, 20.0, VarManager::kPt, 100, -5.0, 5.0, VarManager::kTPCnSigmaPr); } } } diff --git a/PWGDQ/Core/MCSignalLibrary.cxx b/PWGDQ/Core/MCSignalLibrary.cxx index 584d3d8e7e1..4486a7c8ea9 100644 --- a/PWGDQ/Core/MCSignalLibrary.cxx +++ b/PWGDQ/Core/MCSignalLibrary.cxx @@ -610,19 +610,16 @@ MCSignal* o2::aod::dqmcsignals::GetMCSignal(const char* name) } if (!nameStr.compare("eFromPromptLM")) { MCProng prong(2, {11, 101}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}, false, {502, 402}, {true, true}); - prong.SetSourceBit(0, MCProng::kPhysicalPrimary); signal = new MCSignal(name, "Electrons from light mesons without B/D in decay history", {prong}, {-1}); return signal; } if (!nameStr.compare("eFromHbtoLM")) { MCProng prong(2, {11, 101}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}, false, {502}, {false}); - prong.SetSourceBit(0, MCProng::kPhysicalPrimary); signal = new MCSignal(name, "Electrons from light mesons with B hadron in decay history", {prong}, {-1}); return signal; } if (!nameStr.compare("eFromHctoLM")) { MCProng prong(2, {11, 101, 402}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}, false, {502}, {true}); - prong.SetSourceBit(0, MCProng::kPhysicalPrimary); signal = new MCSignal(name, "Electrons from light mesons from D hadron decays and no B in decay history", {prong}, {-1}); return signal; } @@ -655,44 +652,37 @@ MCSignal* o2::aod::dqmcsignals::GetMCSignal(const char* name) } if (!nameStr.compare("muFromHb")) { MCProng prong(2, {13, 502}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}); - prong.SetSourceBit(0, MCProng::kPhysicalPrimary); signal = new MCSignal(name, "muons from b->mu", {prong}, {-1}); return signal; } if (!nameStr.compare("muFromPromptHc")) { MCProng prong(2, {13, 402}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}, false, {502}, {true}); - prong.SetSourceBit(0, MCProng::kPhysicalPrimary); signal = new MCSignal(name, "muons from c->mu, without beauty in decay history", {prong}, {-1}); return signal; } if (!nameStr.compare("muFromHbtoHc")) { MCProng prong(3, {13, 402, 502}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}); - prong.SetSourceBit(0, MCProng::kPhysicalPrimary); signal = new MCSignal(name, "muons from b->c->mu", {prong}, {-1}); return signal; } if (!nameStr.compare("secondaryMuon")) { - MCProng prong(1); - prong.SetPDGcode(0, 13, true); + MCProng prong(1, {13}, {true}, {false}, {0}, {0}, {false}); prong.SetSourceBit(0, MCProng::kProducedInTransport); signal = new MCSignal(name, "muons produced during transport in detector", {prong}, {-1}); return signal; } if (!nameStr.compare("muFromPromptLM")) { MCProng prong(2, {13, 101}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}, false, {502, 402}, {true, true}); - prong.SetSourceBit(0, MCProng::kPhysicalPrimary); signal = new MCSignal(name, "muons from light mesons without B/D in decay history", {prong}, {-1}); return signal; } if (!nameStr.compare("muFromHbtoLM")) { MCProng prong(2, {13, 101}, {true, true}, {false, false}, {0, 0}, {0, 0}, {false, false}, false, {502}, {false}); - prong.SetSourceBit(0, MCProng::kPhysicalPrimary); signal = new MCSignal(name, "muons from light mesons with B hadron in decay history", {prong}, {-1}); return signal; } if (!nameStr.compare("muFromHctoLM")) { MCProng prong(2, {13, 101, 402}, {true, true, true}, {false, false, false}, {0, 0, 0}, {0, 0, 0}, {false, false, false}, false, {502}, {true}); - prong.SetSourceBit(0, MCProng::kPhysicalPrimary); signal = new MCSignal(name, "muons from light mesons from D hadron decays and no B in decay history", {prong}, {-1}); return signal; } From f80132c9ccc155dae54b925997aa313efe84c899 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Mon, 26 May 2025 14:01:54 +0200 Subject: [PATCH 1411/1650] [DPG] Fix bug found by cppcheck (#11311) --- DPG/Tasks/AOTTrack/qaEventTrack.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DPG/Tasks/AOTTrack/qaEventTrack.cxx b/DPG/Tasks/AOTTrack/qaEventTrack.cxx index ffb64e1f9c2..847ec4f0388 100644 --- a/DPG/Tasks/AOTTrack/qaEventTrack.cxx +++ b/DPG/Tasks/AOTTrack/qaEventTrack.cxx @@ -1562,7 +1562,7 @@ void qaEventTrack::fillRecoHistogramsGroupedTracks(const C& collision, const T& histos.fill(HIST("Tracks/signed1Pt"), track.signed1Pt()); histos.fill(HIST("Tracks/snp"), track.snp()); histos.fill(HIST("Tracks/tgl"), track.tgl()); - for (unsigned int i = 0; i < 64; i++) { + for (unsigned int i = 0; i < 32; i++) { if (track.flags() & (1 << i)) { histos.fill(HIST("Tracks/flags"), i); } From 7124fdab3f7831e15acddfc057ab1a379d419677 Mon Sep 17 00:00:00 2001 From: Paola Vargas Torres <88360333+PaolaVT@users.noreply.github.com> Date: Mon, 26 May 2025 07:02:40 -0600 Subject: [PATCH 1412/1650] [PWGLF] The histogram p vs pT was added (#11355) --- PWGMM/UE/Tasks/dedxAnalysis.cxx | 81 +++++++++++++++++++++------------ 1 file changed, 52 insertions(+), 29 deletions(-) diff --git a/PWGMM/UE/Tasks/dedxAnalysis.cxx b/PWGMM/UE/Tasks/dedxAnalysis.cxx index 5bf47f2021b..fb4200bbaaa 100644 --- a/PWGMM/UE/Tasks/dedxAnalysis.cxx +++ b/PWGMM/UE/Tasks/dedxAnalysis.cxx @@ -49,6 +49,18 @@ struct DedxAnalysis { OutputObjHandlingPolicy::AnalysisObject, true, true}; + // Constant values + static constexpr int kEtaIntervals = 8; + static constexpr int kParticlesType = 4; + float tpcCut = 0.6; + float centMin = 0.0; + float centMax = 100.0; + float pionMin = 0.35; + float pionMax = 0.45; + float elTofCut = 0.1; + float pionTofCut = 1.0; + float invMassCut = 0.01; + float invMassCutGamma = 0.0015; // Configurable Parameters // Tracks cuts @@ -84,9 +96,9 @@ struct DedxAnalysis { "Maximum Mass Gamma"}; Configurable calibrationMode{"calibrationMode", false, "calibration mode"}; // Histograms names - static constexpr std::string_view kDedxvsMomentumPos[4] = {"dEdx_vs_Momentum_all_Pos", "dEdx_vs_Momentum_Pi_v0_Pos", "dEdx_vs_Momentum_Pr_v0_Pos", "dEdx_vs_Momentum_El_v0_Pos"}; - static constexpr std::string_view kDedxvsMomentumNeg[4] = {"dEdx_vs_Momentum_all_Neg", "dEdx_vs_Momentum_Pi_v0_Neg", "dEdx_vs_Momentum_Pr_v0_Neg", "dEdx_vs_Momentum_El_v0_Neg"}; - static constexpr double EtaCut[9] = {-0.8, -0.6, -0.4, -0.2, 0.0, 0.2, 0.4, 0.6, 0.8}; + static constexpr std::string_view kDedxvsMomentumPos[kParticlesType] = {"dEdx_vs_Momentum_all_Pos", "dEdx_vs_Momentum_Pi_v0_Pos", "dEdx_vs_Momentum_Pr_v0_Pos", "dEdx_vs_Momentum_El_v0_Pos"}; + static constexpr std::string_view kDedxvsMomentumNeg[kParticlesType] = {"dEdx_vs_Momentum_all_Neg", "dEdx_vs_Momentum_Pi_v0_Neg", "dEdx_vs_Momentum_Pr_v0_Neg", "dEdx_vs_Momentum_El_v0_Neg"}; + static constexpr double EtaCut[kEtaIntervals + 1] = {-0.8, -0.6, -0.4, -0.2, 0.0, 0.2, 0.4, 0.6, 0.8}; Configurable> calibrationFactorNeg{"calibrationFactorNeg", {50.4011, 50.4764, 50.186, 49.2955, 48.8222, 49.4273, 49.9292, 50.0556}, "negative calibration factors"}; Configurable> calibrationFactorPos{"calibrationFactorPos", {50.5157, 50.6359, 50.3198, 49.3345, 48.9197, 49.4931, 50.0188, 50.1406}, "positive calibration factors"}; ConfigurableAxis binP{"binP", {VARIABLE_WIDTH, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 18.0, 20.0}, ""}; @@ -113,7 +125,8 @@ struct DedxAnalysis { void init(InitContext const&) { - AxisSpec dedxAxis{100, 0.0, 100.0, "dE/dx MIP (a. u.)"}; + AxisSpec dedxAxis{100, 0.0, 100.0, "dE/dx (a. u.)"}; + AxisSpec ptAxis = {binP, "pT (GeV/c)"}; AxisSpec etaAxis{8, -0.8, 0.8, "#eta"}; AxisSpec pAxis = {binP, "#it{p}/Z (GeV/c)"}; if (calibrationMode) { @@ -167,8 +180,16 @@ struct DedxAnalysis { "hdEdx_vs_eta_vs_p_Pos_calibrated_TOF", "dE/dx", HistType::kTH3F, {{etaAxis}, {dedxAxis}, {pAxis}}); + // pt vs p + registryDeDx.add( + "hp_vs_pt_all_Neg", "p_vs_pT", HistType::kTH2F, + {{ptAxis}, {pAxis}}); + registryDeDx.add( + "hp_vs_pt_all_Pos", "p_vs_pT", HistType::kTH2F, + {{ptAxis}, {pAxis}}); + // De/Dx for ch and v0 particles - for (int i = 0; i < 4; ++i) { + for (int i = 0; i < kParticlesType; ++i) { registryDeDx.add(kDedxvsMomentumPos[i].data(), "dE/dx", HistType::kTH3F, {{pAxis}, {dedxAxis}, {etaAxis}}); registryDeDx.add(kDedxvsMomentumNeg[i].data(), "dE/dx", HistType::kTH3F, @@ -235,14 +256,14 @@ struct DedxAnalysis { if (!passedSingleTrackSelection(ntrack, collision)) return false; - if (ptrack.tpcInnerParam() > 0.6) { + if (ptrack.tpcInnerParam() > tpcCut) { if (!ptrack.hasTOF()) return false; if (std::abs(ptrack.tofNSigmaPi()) > nsigmaTOFmax) return false; } - if (ntrack.tpcInnerParam() > 0.6) { + if (ntrack.tpcInnerParam() > tpcCut) { if (!ntrack.hasTOF()) return false; if (std::abs(ntrack.tofNSigmaPi()) > nsigmaTOFmax) @@ -267,14 +288,14 @@ struct DedxAnalysis { if (!passedSingleTrackSelection(ntrack, collision)) return false; - if (ptrack.tpcInnerParam() > 0.6) { + if (ptrack.tpcInnerParam() > tpcCut) { if (!ptrack.hasTOF()) return false; if (std::abs(ptrack.tofNSigmaPr()) > nsigmaTOFmax) return false; } - if (ntrack.tpcInnerParam() > 0.6) { + if (ntrack.tpcInnerParam() > tpcCut) { if (!ntrack.hasTOF()) return false; if (std::abs(ntrack.tofNSigmaPi()) > nsigmaTOFmax) @@ -300,14 +321,14 @@ struct DedxAnalysis { if (!passedSingleTrackSelection(ntrack, collision)) return false; - if (ptrack.tpcInnerParam() > 0.6) { + if (ptrack.tpcInnerParam() > tpcCut) { if (!ptrack.hasTOF()) return false; if (std::abs(ptrack.tofNSigmaPi()) > nsigmaTOFmax) return false; } - if (ntrack.tpcInnerParam() > 0.6) { + if (ntrack.tpcInnerParam() > tpcCut) { if (!ntrack.hasTOF()) return false; if (std::abs(ntrack.tofNSigmaPr()) > nsigmaTOFmax) @@ -332,14 +353,14 @@ struct DedxAnalysis { if (!passedSingleTrackSelection(ntrack, collision)) return false; - if (ptrack.tpcInnerParam() > 0.6) { + if (ptrack.tpcInnerParam() > tpcCut) { if (!ptrack.hasTOF()) return false; if (std::abs(ptrack.tofNSigmaEl()) > nsigmaTOFmax) return false; } - if (ntrack.tpcInnerParam() > 0.6) { + if (ntrack.tpcInnerParam() > tpcCut) { if (!ntrack.hasTOF()) return false; if (std::abs(ntrack.tofNSigmaEl()) > nsigmaTOFmax) @@ -366,7 +387,7 @@ struct DedxAnalysis { // Centrality float centrality = collision.centFT0C(); - if (centrality < 0.0 || centrality > 100.0) + if (centrality < centMin || centrality > centMax) centrality = 1.0; // Kaons @@ -382,7 +403,7 @@ struct DedxAnalysis { float signedP = trk.sign() * trk.tpcInnerParam(); // MIP calibration for pions - if (trk.tpcInnerParam() >= 0.35 && trk.tpcInnerParam() <= 0.45) { + if (trk.tpcInnerParam() >= pionMin && trk.tpcInnerParam() <= pionMax) { if (calibrationMode) { if (signedP < 0) { registryDeDx.fill(HIST("hdEdx_vs_eta_Neg_Pi"), trk.eta(), trk.tpcSignal()); @@ -391,7 +412,7 @@ struct DedxAnalysis { } } else { - for (int i = 0; i < 8; ++i) { + for (int i = 0; i < kEtaIntervals; ++i) { if (trk.eta() > EtaCut[i] && trk.eta() < EtaCut[i + 1]) { if (signedP < 0) { registryDeDx.fill(HIST("hdEdx_vs_eta_Neg_calibrated_Pi"), trk.eta(), trk.tpcSignal() * 50 / calibrationFactorNeg->at(i)); @@ -409,7 +430,7 @@ struct DedxAnalysis { registryDeDx.fill(HIST("hbeta_vs_p_Pos"), signedP, trk.beta()); } // Electrons from TOF - if (std::abs(trk.beta() - 1) < 0.1) { // beta cut + if (std::abs(trk.beta() - 1) < elTofCut) { // beta cut if (calibrationMode) { if (signedP < 0) { registryDeDx.fill(HIST("hdEdx_vs_eta_vs_p_Neg_El"), trk.eta(), trk.tpcSignal(), std::abs(signedP)); @@ -417,7 +438,7 @@ struct DedxAnalysis { registryDeDx.fill(HIST("hdEdx_vs_eta_vs_p_Pos_El"), trk.eta(), trk.tpcSignal(), signedP); } } else { - for (int i = 0; i < 8; ++i) { + for (int i = 0; i < kEtaIntervals; ++i) { if (trk.eta() > EtaCut[i] && trk.eta() < EtaCut[i + 1]) { if (signedP < 0) { registryDeDx.fill(HIST("hdEdx_vs_eta_vs_p_Neg_calibrated_El"), trk.eta(), trk.tpcSignal() * 50 / calibrationFactorNeg->at(i), std::abs(signedP)); @@ -429,7 +450,7 @@ struct DedxAnalysis { } } // pions from TOF - if (trk.beta() > 1. && trk.beta() < 1.05) { // beta cut + if (trk.beta() > pionTofCut && trk.beta() < pionTofCut + 0.05) { // beta cut if (calibrationMode) { if (signedP < 0) { registryDeDx.fill(HIST("hdEdx_vs_eta_vs_p_Neg_TOF"), trk.eta(), trk.tpcSignal(), std::abs(signedP)); @@ -437,7 +458,7 @@ struct DedxAnalysis { registryDeDx.fill(HIST("hdEdx_vs_eta_vs_p_Pos_TOF"), trk.eta(), trk.tpcSignal(), signedP); } } else { - for (int i = 0; i < 8; ++i) { + for (int i = 0; i < kEtaIntervals; ++i) { if (trk.eta() > EtaCut[i] && trk.eta() < EtaCut[i + 1]) { if (signedP < 0) { registryDeDx.fill(HIST("hdEdx_vs_eta_vs_p_Neg_calibrated_TOF"), trk.eta(), trk.tpcSignal() * 50 / calibrationFactorNeg->at(i), std::abs(signedP)); @@ -452,12 +473,14 @@ struct DedxAnalysis { registryDeDx.fill(HIST("hdEdx_vs_phi"), trk.phi(), trk.tpcSignal()); if (!calibrationMode) { - for (int i = 0; i < 8; ++i) { + for (int i = 0; i < kEtaIntervals; ++i) { if (trk.eta() > EtaCut[i] && trk.eta() < EtaCut[i + 1]) { if (signedP > 0) { registryDeDx.fill(HIST(kDedxvsMomentumPos[0]), signedP, trk.tpcSignal() * 50 / calibrationFactorPos->at(i), trk.eta()); + registryDeDx.fill(HIST("hp_vs_pt_all_Pos"), trk.pt(), signedP); } else { registryDeDx.fill(HIST(kDedxvsMomentumNeg[0]), std::abs(signedP), trk.tpcSignal() * 50 / calibrationFactorNeg->at(i), trk.eta()); + registryDeDx.fill(HIST("hp_vs_pt_all_Neg"), trk.pt(), std::abs(signedP)); } } } @@ -506,11 +529,11 @@ struct DedxAnalysis { float invMass = std::sqrt((eNegPi + ePosPi) * (eNegPi + ePosPi) - ((pxNeg + pxPos) * (pxNeg + pxPos) + (pyNeg + pyPos) * (pyNeg + pyPos) + (pzNeg + pzPos) * (pzNeg + pzPos))); - if (std::abs(invMass - MassK0Short) > 0.01) { + if (std::abs(invMass - MassK0Short) > invMassCut) { continue; } - for (int i = 0; i < 8; ++i) { + for (int i = 0; i < kEtaIntervals; ++i) { if (negTrack.eta() > EtaCut[i] && negTrack.eta() < EtaCut[i + 1]) { registryDeDx.fill(HIST(kDedxvsMomentumNeg[1]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactorNeg->at(i), negTrack.eta()); } @@ -528,11 +551,11 @@ struct DedxAnalysis { float invMass = std::sqrt((eNegPi + ePosPr) * (eNegPi + ePosPr) - ((pxNeg + pxPos) * (pxNeg + pxPos) + (pyNeg + pyPos) * (pyNeg + pyPos) + (pzNeg + pzPos) * (pzNeg + pzPos))); - if (std::abs(invMass - MassLambda) > 0.01) { + if (std::abs(invMass - MassLambda) > invMassCut) { continue; } - for (int i = 0; i < 8; ++i) { + for (int i = 0; i < kEtaIntervals; ++i) { if (negTrack.eta() > EtaCut[i] && negTrack.eta() < EtaCut[i + 1]) { registryDeDx.fill(HIST(kDedxvsMomentumNeg[1]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactorNeg->at(i), negTrack.eta()); } @@ -550,11 +573,11 @@ struct DedxAnalysis { float invMass = std::sqrt((eNegPr + ePosPi) * (eNegPr + ePosPi) - ((pxNeg + pxPos) * (pxNeg + pxPos) + (pyNeg + pyPos) * (pyNeg + pyPos) + (pzNeg + pzPos) * (pzNeg + pzPos))); - if (std::abs(invMass - MassLambda) > 0.01) { + if (std::abs(invMass - MassLambda) > invMassCut) { continue; } - for (int i = 0; i < 8; ++i) { + for (int i = 0; i < kEtaIntervals; ++i) { if (negTrack.eta() > EtaCut[i] && negTrack.eta() < EtaCut[i + 1]) { registryDeDx.fill(HIST(kDedxvsMomentumNeg[2]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactorNeg->at(i), negTrack.eta()); } @@ -572,11 +595,11 @@ struct DedxAnalysis { float invMass = std::sqrt((eNegEl + ePosEl) * (eNegEl + ePosEl) - ((pxNeg + pxPos) * (pxNeg + pxPos) + (pyNeg + pyPos) * (pyNeg + pyPos) + (pzNeg + pzPos) * (pzNeg + pzPos))); - if (std::abs(invMass - gammaMass) > 0.0015) { + if (std::abs(invMass - gammaMass) > invMassCutGamma) { continue; } - for (int i = 0; i < 8; ++i) { + for (int i = 0; i < kEtaIntervals; ++i) { if (negTrack.eta() > EtaCut[i] && negTrack.eta() < EtaCut[i + 1]) { registryDeDx.fill(HIST(kDedxvsMomentumNeg[3]), std::abs(signedPneg), negTrack.tpcSignal() * 50 / calibrationFactorNeg->at(i), negTrack.eta()); } From 192a6f1800372e521b444b9ab526336d228140df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Mon, 26 May 2025 16:37:21 +0200 Subject: [PATCH 1413/1650] [ALICE3] Include What You Use (#11361) --- ALICE3/TableProducer/alice3-correlatorDDbar.cxx | 1 + ALICE3/Tasks/alice3-taskcorrelationDDbar.cxx | 1 + 2 files changed, 2 insertions(+) diff --git a/ALICE3/TableProducer/alice3-correlatorDDbar.cxx b/ALICE3/TableProducer/alice3-correlatorDDbar.cxx index ad224442717..6c270dc1cd5 100644 --- a/ALICE3/TableProducer/alice3-correlatorDDbar.cxx +++ b/ALICE3/TableProducer/alice3-correlatorDDbar.cxx @@ -27,6 +27,7 @@ #include "ALICE3/DataModel/A3DecayFinderTables.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/HFC/DataModel/CorrelationTables.h" // #include "PWGHF/DataModel/CandidateReconstructionTables.h" // #include "PWGHF/DataModel/CandidateSelectionTables.h" diff --git a/ALICE3/Tasks/alice3-taskcorrelationDDbar.cxx b/ALICE3/Tasks/alice3-taskcorrelationDDbar.cxx index 66f641302ee..b6c8058f747 100644 --- a/ALICE3/Tasks/alice3-taskcorrelationDDbar.cxx +++ b/ALICE3/Tasks/alice3-taskcorrelationDDbar.cxx @@ -20,6 +20,7 @@ #include "Framework/HistogramRegistry.h" #include "Framework/runDataProcessing.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/Utils/utilsAnalysis.h" #include "PWGHF/HFC/DataModel/CorrelationTables.h" // #include "PWGHF/DataModel/CandidateReconstructionTables.h" From cc6c4cd091b31ff9c3df44ff8867862929470ed5 Mon Sep 17 00:00:00 2001 From: mherzer <96999709+mherzer28@users.noreply.github.com> Date: Mon, 26 May 2025 17:43:29 +0200 Subject: [PATCH 1414/1650] [PWGLF] rigidity & linter fix (#11351) Co-authored-by: ALICE Action Bot --- PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx | 43 ++++++++++++--------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx b/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx index 592c992f0ac..e3c2dd88225 100644 --- a/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx +++ b/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx @@ -136,7 +136,7 @@ class Particle int charge; float resolution; std::vector betheParams; - static constexpr int kNumBetheParams = 5; + static constexpr int NNumBetheParams = 5; Particle(const std::string name_, int pdgCode_, float mass_, int charge_, LabeledArray bethe) @@ -150,7 +150,7 @@ class Particle bethe.get(name, "resolution"); // Access the "resolution" parameter betheParams.clear(); - for (int i = 0; i < kNumBetheParams; ++i) { + for (int i = 0; i < NNumBetheParams; ++i) { betheParams.push_back(bethe.get(name, i)); } } @@ -366,10 +366,11 @@ struct TrHeAnalysis { histos.fill(HIST("histogram/pT"), track.pt()); histos.fill(HIST("histogram/p"), track.p()); histos.fill(HIST("histogram/TPCsignVsTPCmomentum"), - getRigidity(track), + getRigidity(track) * track.sign(), track.tpcSignal()); histos.fill(HIST("histogram/TOFbetaVsP"), - getRigidity(track), track.beta()); + getRigidity(track) * track.sign(), + track.beta()); if (enableTr && trRapCut) { if (std::abs(getTPCnSigma(track, particles.at(0))) < nsigmaTPCvar.nsigmaTPCTr) { @@ -391,10 +392,11 @@ struct TrHeAnalysis { continue; } histos.fill(HIST("histogram/H3/H3-TPCsignVsTPCmomentum"), - getRigidity(track), + getRigidity(track) * track.sign(), track.tpcSignal()); histos.fill(HIST("histogram/H3/H3-TOFbetaVsP"), - getRigidity(track), track.beta()); + getRigidity(track) * track.sign(), + track.beta()); float tPt = track.pt(); float tEta = track.eta(); float tPhi = track.phi(); @@ -437,10 +439,11 @@ struct TrHeAnalysis { continue; } histos.fill(HIST("histogram/He/He-TPCsignVsTPCmomentum"), - getRigidity(track), + getRigidity(track) * track.sign(), track.tpcSignal()); histos.fill(HIST("histogram/He/He-TOFbetaVsP"), - getRigidity(track), track.beta()); + getRigidity(track) * track.sign(), + track.beta()); float tPt = track.pt(); float tEta = track.eta(); float tPhi = track.phi(); @@ -520,10 +523,10 @@ struct TrHeAnalysis { histos.fill(HIST("histogram/pT"), track.pt()); histos.fill(HIST("histogram/p"), track.p()); histos.fill(HIST("histogram/TPCsignVsTPCmomentum"), - getRigidity(track) / (1.f * track.sign()), + getRigidity(track) * (1.f * track.sign()), track.tpcSignal()); histos.fill(HIST("histogram/TOFbetaVsP"), - track.p() / (1.f * track.sign()), track.beta()); + track.p() * (1.f * track.sign()), track.beta()); if (enableTr && trRapCut) { if (std::abs(track.tpcNSigmaTr()) < nsigmaTPCvar.nsigmaTPCTr) { if (track.itsChi2NCl() > cfgCutMaxChi2ItsH3) { @@ -544,10 +547,11 @@ struct TrHeAnalysis { continue; } histos.fill(HIST("histogram/H3/H3-TPCsignVsTPCmomentum"), - getRigidity(track) / (1.f * track.sign()), + getRigidity(track) * (1.f * track.sign()), track.tpcSignal()); histos.fill(HIST("histogram/H3/H3-TOFbetaVsP"), - track.p() / (1.f * track.sign()), track.beta()); + track.p() * (1.f * track.sign()), + track.beta()); float tPt = track.pt(); float tEta = track.eta(); float tPhi = track.phi(); @@ -589,10 +593,11 @@ struct TrHeAnalysis { continue; } histos.fill(HIST("histogram/He/He-TPCsignVsTPCmomentum"), - getRigidity(track), + getRigidity(track) * track.sign(), track.tpcSignal()); histos.fill(HIST("histogram/He/He-TOFbetaVsP"), - getRigidity(track), track.beta()); + getRigidity(track) * track.sign(), + track.beta()); float tPt = track.pt(); float tEta = track.eta(); float tPhi = track.phi(); @@ -643,12 +648,12 @@ struct TrHeAnalysis { template float getMeanItsClsSize(T const& track) { - constexpr int kNumLayers = 8; - constexpr int kBitsPerLayer = 4; - constexpr int kBitMask = (1 << kBitsPerLayer) - 1; + constexpr int NNumLayers = 8; + constexpr int NBitsPerLayer = 4; + constexpr int NBitMask = (1 << NBitsPerLayer) - 1; int sum = 0, n = 0; - for (int i = 0; i < kNumLayers; i++) { - int clsSize = (track.itsClusterSizes() >> (kBitsPerLayer * i)) & kBitMask; + for (int i = 0; i < NNumLayers; i++) { + int clsSize = (track.itsClusterSizes() >> (NBitsPerLayer * i)) & NBitMask; sum += clsSize; if (clsSize) n++; From 50176dcc7af4190aa698b5c00e429fce56944183 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Mon, 26 May 2025 18:04:26 +0200 Subject: [PATCH 1415/1650] [PWGHF,Trigger] fix a small bug for combine pid (#11363) --- EventFiltering/PWGHF/HFFilterHelpers.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EventFiltering/PWGHF/HFFilterHelpers.h b/EventFiltering/PWGHF/HFFilterHelpers.h index 8e3dae4451d..60e3179f5a8 100644 --- a/EventFiltering/PWGHF/HFFilterHelpers.h +++ b/EventFiltering/PWGHF/HFFilterHelpers.h @@ -962,7 +962,7 @@ inline bool HfFilterHelper::isSelectedTrack4Femto(const T1& track, const T2& tra return false; } } else { - if (std::fabs(NSigmaTOF) > nSigmaCuts[1] || std::fabs(NSigmaTPC) > nSigmaCuts[0]) { // Use combined TPC and TOF above the threshold + if (NSigma > nSigmaCuts[2]) { // Use combined TPC and TOF above the threshold return false; } } From 35f2b5197d842dfaaa8ba55303dd6d2ca6390628 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Mon, 26 May 2025 18:23:50 +0200 Subject: [PATCH 1416/1650] [PWGCF] Include What You Use (#11359) --- PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx index c1a5d44174d..3e68a275452 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackD0.cxx @@ -19,6 +19,7 @@ #include #include + #include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" #include "Framework/HistogramRegistry.h" @@ -27,6 +28,7 @@ #include "Framework/StepTHn.h" #include "Framework/O2DatabasePDGPlugin.h" #include "ReconstructionDataFormats/PID.h" + #include "Common/DataModel/PIDResponse.h" #include "Common/Core/RecoDecay.h" @@ -43,6 +45,7 @@ #include "PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCalculator.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" From b506809e509efebf311ff0725ec6332159dd0810 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Tue, 27 May 2025 03:38:16 +0900 Subject: [PATCH 1417/1650] [PWGEM/Dilepton] update treeCreatorElectronMLDDA.cxx (#11364) --- PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx index a202ad331c9..a24b62374f8 100644 --- a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx +++ b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx @@ -132,6 +132,7 @@ struct TreeCreatorElectronMLDDA { Configurable max_pin_for_downscaling_pion{"max_pin_for_downscaling_pion", 2.0, "max pin to apply down scaling factor to store pion"}; Configurable max_pin_for_downscaling_kaon{"max_pin_for_downscaling_kaon", 0.0, "max pin to apply down scaling factor to store kaon"}; Configurable max_pin_for_downscaling_proton{"max_pin_for_downscaling_proton", 2.0, "max pin to apply down scaling factor to store proton"}; + Configurable store_ele_band_only{"store_ele_band_only", false, "flag to store tracks around electron band only to reduce output size"}; struct : ConfigurableGroup { std::string prefix = "trackcut_group"; @@ -228,7 +229,7 @@ struct TreeCreatorElectronMLDDA { Configurable cfg_min_mass_ee{"cfg_min_mass_ee", 0.000, "min mass for ee from pi0 dalitz decay in GeV/c2"}; Configurable cfg_max_mass_ee{"cfg_max_mass_ee", 0.005, "max mass for ee from pi0 dalitz decay in GeV/c2"}; Configurable cfg_min_phiv_ee{"cfg_min_phiv_ee", 0.0, "min phiv for ee from pi0 dalitz decay in rad."}; - Configurable cfg_max_phiv_ee{"cfg_max_phiv_ee", 2.0, "max phiv for ee from pi0 dalitz decay in rad."}; + Configurable cfg_max_phiv_ee{"cfg_max_phiv_ee", M_PI / 2, "max phiv for ee from pi0 dalitz decay in rad."}; } dalitzcuts; // for RCT @@ -519,6 +520,10 @@ struct TreeCreatorElectronMLDDA { template void fillTrackTable(TCollision const& collision, TTrack const& track, const int pidlabel, const int tracktype, const bool isForValidation) { + if (store_ele_band_only && !isElectron(track)) { + return; + } + if (std::find(stored_trackIds.begin(), stored_trackIds.end(), track.globalIndex()) == stored_trackIds.end()) { mDcaInfoCov.set(999, 999, 999, 999, 999); auto track_par_cov_recalc = getTrackParCov(track); From df2f28ccb882ece5e04776fd3ccd2f10e5e42087 Mon Sep 17 00:00:00 2001 From: JStaa <39123272+JStaa@users.noreply.github.com> Date: Mon, 26 May 2025 21:36:29 +0200 Subject: [PATCH 1418/1650] [PWGCF] Changed the efficiency histograms from 2D to 3D (#11367) --- .../Tasks/threeParticleCorrelations.cxx | 76 +++++++++---------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx index d5522e7e27a..cb57211fcaf 100644 --- a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx +++ b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx @@ -126,9 +126,9 @@ struct ThreeParticleCorrelations { Configurable confRDSwitch{"confRDSwitch", true, "Switch for the radialDistanceFilter function"}; // Efficiency histograms - TH2D** hEffPions = new TH2D*[2]; - TH2D** hEffKaons = new TH2D*[2]; - TH2D** hEffProtons = new TH2D*[2]; + TH3D** hEffPions = new TH3D*[2]; + TH3D** hEffKaons = new TH3D*[2]; + TH3D** hEffProtons = new TH3D*[2]; // Correlation variables int triggSign, assocSign; @@ -290,12 +290,12 @@ struct ThreeParticleCorrelations { ccdb->setURL("http://alice-ccdb.cern.ch"); ccdb->setCaching(true); TList* efficiencyList = ccdb->getForTimeStamp("Users/j/jstaa/Efficiency/ChargedParticles", 1); - hEffPions[0] = static_cast(efficiencyList->FindObject("hEfficiencyPionP")); - hEffPions[1] = static_cast(efficiencyList->FindObject("hEfficiencyPionN")); - hEffKaons[0] = static_cast(efficiencyList->FindObject("hEfficiencyKaonP")); - hEffKaons[1] = static_cast(efficiencyList->FindObject("hEfficiencyKaonN")); - hEffProtons[0] = static_cast(efficiencyList->FindObject("hEfficiencyProtonP")); - hEffProtons[1] = static_cast(efficiencyList->FindObject("hEfficiencyProtonN")); + hEffPions[0] = static_cast(efficiencyList->FindObject("hEfficiencyPionP")); + hEffPions[1] = static_cast(efficiencyList->FindObject("hEfficiencyPionN")); + hEffKaons[0] = static_cast(efficiencyList->FindObject("hEfficiencyKaonP")); + hEffKaons[1] = static_cast(efficiencyList->FindObject("hEfficiencyKaonN")); + hEffProtons[0] = static_cast(efficiencyList->FindObject("hEfficiencyProtonP")); + hEffProtons[1] = static_cast(efficiencyList->FindObject("hEfficiencyProtonN")); } //========================================================================================================================================================================================================================================================================== @@ -331,15 +331,15 @@ struct ThreeParticleCorrelations { rQARegistry.fill(HIST("hdEdx"), track.pt(), track.tpcSignal()); rQARegistry.fill(HIST("hBeta"), track.pt(), track.beta()); if (assocPID[0] == pionID) { // Pions - rQARegistry.fill(HIST("hPtPion"), track.pt(), collision.centFT0C(), 1. / trackEff(hEffPions, track)); + rQARegistry.fill(HIST("hPtPion"), track.pt(), collision.centFT0C(), 1. / trackEff(hEffPions, track, collision.centFT0C())); rQARegistry.fill(HIST("hdEdxPion"), track.pt(), track.tpcSignal()); rQARegistry.fill(HIST("hBetaPion"), track.pt(), track.beta()); } else if (assocPID[0] == kaonID) { // Kaons - rQARegistry.fill(HIST("hPtKaon"), track.pt(), collision.centFT0C(), 1. / trackEff(hEffKaons, track)); + rQARegistry.fill(HIST("hPtKaon"), track.pt(), collision.centFT0C(), 1. / trackEff(hEffKaons, track, collision.centFT0C())); rQARegistry.fill(HIST("hdEdxKaon"), track.pt(), track.tpcSignal()); rQARegistry.fill(HIST("hBetaKaon"), track.pt(), track.beta()); } else if (assocPID[0] == protonID) { // Protons - rQARegistry.fill(HIST("hPtProton"), track.pt(), collision.centFT0C(), 1. / trackEff(hEffProtons, track)); + rQARegistry.fill(HIST("hPtProton"), track.pt(), collision.centFT0C(), 1. / trackEff(hEffProtons, track, collision.centFT0C())); rQARegistry.fill(HIST("hdEdxProton"), track.pt(), track.tpcSignal()); rQARegistry.fill(HIST("hBetaProton"), track.pt(), track.beta()); } @@ -371,36 +371,36 @@ struct ThreeParticleCorrelations { if (candMass >= MassLambda0 - 4 * dGaussSigma && candMass <= MassLambda0 + 4 * dGaussSigma) { if (assocPID[0] == pionID) { // Pions - rSECorrRegistry.fill(HIST("hSameLambdaPion_SGNL"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate)); + rSECorrRegistry.fill(HIST("hSameLambdaPion_SGNL"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate, collision.centFT0C())); } else if (assocPID[0] == kaonID) { // Kaons - rSECorrRegistry.fill(HIST("hSameLambdaKaon_SGNL"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate)); + rSECorrRegistry.fill(HIST("hSameLambdaKaon_SGNL"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate, collision.centFT0C())); } else if (assocPID[0] == protonID) { // Protons - rSECorrRegistry.fill(HIST("hSameLambdaProton_SGNL"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate)); + rSECorrRegistry.fill(HIST("hSameLambdaProton_SGNL"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate, collision.centFT0C())); } } else if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { if (assocPID[0] == pionID) { // Pions - rSECorrRegistry.fill(HIST("hSameLambdaPion_SB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate)); + rSECorrRegistry.fill(HIST("hSameLambdaPion_SB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate, collision.centFT0C())); if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass < MassLambda0 - 4 * dGaussSigma) { - rSECorrRegistry.fill(HIST("hSameLambdaPion_leftSB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate)); + rSECorrRegistry.fill(HIST("hSameLambdaPion_leftSB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate, collision.centFT0C())); } else if (candMass > MassLambda0 + 4 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { - rSECorrRegistry.fill(HIST("hSameLambdaPion_rightSB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate)); + rSECorrRegistry.fill(HIST("hSameLambdaPion_rightSB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate, collision.centFT0C())); } } else if (assocPID[0] == kaonID) { // Kaons - rSECorrRegistry.fill(HIST("hSameLambdaKaon_SB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate)); + rSECorrRegistry.fill(HIST("hSameLambdaKaon_SB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate, collision.centFT0C())); if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass < MassLambda0 - 4 * dGaussSigma) { - rSECorrRegistry.fill(HIST("hSameLambdaKaon_leftSB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate)); + rSECorrRegistry.fill(HIST("hSameLambdaKaon_leftSB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate, collision.centFT0C())); } else if (candMass > MassLambda0 + 4 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { - rSECorrRegistry.fill(HIST("hSameLambdaKaon_rightSB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate)); + rSECorrRegistry.fill(HIST("hSameLambdaKaon_rightSB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate, collision.centFT0C())); } } else if (assocPID[0] == protonID) { // Protons - rSECorrRegistry.fill(HIST("hSameLambdaProton_SB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate)); + rSECorrRegistry.fill(HIST("hSameLambdaProton_SB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate, collision.centFT0C())); if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass < MassLambda0 - 4 * dGaussSigma) { - rSECorrRegistry.fill(HIST("hSameLambdaProton_leftSB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate)); + rSECorrRegistry.fill(HIST("hSameLambdaProton_leftSB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate, collision.centFT0C())); } else if (candMass > MassLambda0 + 4 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { - rSECorrRegistry.fill(HIST("hSameLambdaProton_rightSB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate)); + rSECorrRegistry.fill(HIST("hSameLambdaProton_rightSB"), deltaPhi, deltaEta, collision.centFT0C(), collision.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate, collision.centFT0C())); } } } @@ -441,36 +441,36 @@ struct ThreeParticleCorrelations { if (candMass >= MassLambda0 - 4 * dGaussSigma && candMass <= MassLambda0 + 4 * dGaussSigma) { if (assocPID[0] == pionID) { // Pions - rMECorrRegistry.fill(HIST("hMixLambdaPion_SGNL"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate)); + rMECorrRegistry.fill(HIST("hMixLambdaPion_SGNL"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate, coll_1.centFT0C())); } else if (assocPID[0] == kaonID) { // Kaons - rMECorrRegistry.fill(HIST("hMixLambdaKaon_SGNL"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate)); + rMECorrRegistry.fill(HIST("hMixLambdaKaon_SGNL"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate, coll_1.centFT0C())); } else if (assocPID[0] == protonID) { // Protons - rMECorrRegistry.fill(HIST("hMixLambdaProton_SGNL"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate)); + rMECorrRegistry.fill(HIST("hMixLambdaProton_SGNL"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate, coll_1.centFT0C())); } } else if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { if (assocPID[0] == pionID) { // Pions - rMECorrRegistry.fill(HIST("hMixLambdaPion_SB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate)); + rMECorrRegistry.fill(HIST("hMixLambdaPion_SB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate, coll_1.centFT0C())); if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass < MassLambda0 - 4 * dGaussSigma) { - rMECorrRegistry.fill(HIST("hMixLambdaPion_leftSB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate)); + rMECorrRegistry.fill(HIST("hMixLambdaPion_leftSB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate, coll_1.centFT0C())); } else if (candMass > MassLambda0 + 4 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { - rMECorrRegistry.fill(HIST("hMixLambdaPion_rightSB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate)); + rMECorrRegistry.fill(HIST("hMixLambdaPion_rightSB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffPions, associate, coll_1.centFT0C())); } } else if (assocPID[0] == kaonID) { // Kaons - rMECorrRegistry.fill(HIST("hMixLambdaKaon_SB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate)); + rMECorrRegistry.fill(HIST("hMixLambdaKaon_SB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate, coll_1.centFT0C())); if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass < MassLambda0 - 4 * dGaussSigma) { - rMECorrRegistry.fill(HIST("hMixLambdaKaon_leftSB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate)); + rMECorrRegistry.fill(HIST("hMixLambdaKaon_leftSB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate, coll_1.centFT0C())); } else if (candMass > MassLambda0 + 4 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { - rMECorrRegistry.fill(HIST("hMixLambdaKaon_rightSB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate)); + rMECorrRegistry.fill(HIST("hMixLambdaKaon_rightSB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffKaons, associate, coll_1.centFT0C())); } } else if (assocPID[0] == protonID) { // Protons - rMECorrRegistry.fill(HIST("hMixLambdaProton_SB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate)); + rMECorrRegistry.fill(HIST("hMixLambdaProton_SB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate, coll_1.centFT0C())); if (candMass >= MassLambda0 - 8 * dGaussSigma && candMass < MassLambda0 - 4 * dGaussSigma) { - rMECorrRegistry.fill(HIST("hMixLambdaProton_leftSB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate)); + rMECorrRegistry.fill(HIST("hMixLambdaProton_leftSB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate, coll_1.centFT0C())); } else if (candMass > MassLambda0 + 4 * dGaussSigma && candMass <= MassLambda0 + 8 * dGaussSigma) { - rMECorrRegistry.fill(HIST("hMixLambdaProton_rightSB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate)); + rMECorrRegistry.fill(HIST("hMixLambdaProton_rightSB"), deltaPhi, deltaEta, coll_1.centFT0C(), coll_1.posZ(), triggSign, associate.sign(), 1. / trackEff(hEffProtons, associate, coll_1.centFT0C())); } } } @@ -778,7 +778,7 @@ struct ThreeParticleCorrelations { } template - double trackEff(TH2D** efficiencies, const TrackCand& track) + double trackEff(TH3D** efficiencies, const TrackCand& track, double centrality) { int index = -999; @@ -788,7 +788,7 @@ struct ThreeParticleCorrelations { index = 1; } - double efficiency = efficiencies[index]->GetBinContent(efficiencies[index]->FindBin(track.pt(), track.eta())); + double efficiency = efficiencies[index]->GetBinContent(efficiencies[index]->FindBin(track.pt(), track.eta(), centrality)); if (efficiency > 0) { return efficiency; } else { From 08679d07de49c308cc728a71b5f9e444ea7a3292 Mon Sep 17 00:00:00 2001 From: Noor Koster <82090643+cnkoster@users.noreply.github.com> Date: Mon, 26 May 2025 21:47:10 +0200 Subject: [PATCH 1419/1650] [PWGCF] Add first PID steps and add centrality dimension to analysis histos (#11362) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/TableProducer/zdcQVectors.cxx | 2 - PWGCF/Flow/Tasks/flowSP.cxx | 898 ++++++++++++++--------- 2 files changed, 545 insertions(+), 355 deletions(-) diff --git a/PWGCF/Flow/TableProducer/zdcQVectors.cxx b/PWGCF/Flow/TableProducer/zdcQVectors.cxx index 77f436b383e..f8ba2cbb0b7 100644 --- a/PWGCF/Flow/TableProducer/zdcQVectors.cxx +++ b/PWGCF/Flow/TableProducer/zdcQVectors.cxx @@ -429,8 +429,6 @@ struct ZdcQVectors { cal.atStep = 5; cal.atIteration = 5; } - } else { - LOGF(info, "No ccdb path given for calibration histos. Do not recenter."); } } diff --git a/PWGCF/Flow/Tasks/flowSP.cxx b/PWGCF/Flow/Tasks/flowSP.cxx index 4b7df991de2..05ff0d67522 100644 --- a/PWGCF/Flow/Tasks/flowSP.cxx +++ b/PWGCF/Flow/Tasks/flowSP.cxx @@ -21,6 +21,7 @@ #include #include #include +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -35,6 +36,7 @@ #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/Centrality.h" #include "Common/Core/RecoDecay.h" +#include "Common/DataModel/PIDResponse.h" #include "PWGCF/DataModel/SPTableZDC.h" #include "GFWWeights.h" @@ -50,12 +52,18 @@ using namespace o2::framework::expressions; struct FlowSP { // QA Plots - O2_DEFINE_CONFIGURABLE(cfgFillQAHistos, bool, true, "Fill histograms for event and track QA"); + O2_DEFINE_CONFIGURABLE(cfgFillEventQA, bool, true, "Fill histograms for event QA"); + O2_DEFINE_CONFIGURABLE(cfgFillTrackQA, bool, true, "Fill histograms for track QA"); + O2_DEFINE_CONFIGURABLE(cfgFillPIDQA, bool, true, "Fill histograms for PID QA"); + O2_DEFINE_CONFIGURABLE(cfgFillEventPlaneQA, bool, true, "Fill histograms for Event Plane QA"); + O2_DEFINE_CONFIGURABLE(cfgFillGeneralV1Histos, bool, true, "Fill histograms for vn analysis"); + O2_DEFINE_CONFIGURABLE(cfgFillQABefore, bool, true, "Fill QA histograms before cuts, only for processData"); // Flags to make and fill histograms O2_DEFINE_CONFIGURABLE(cfgFillMixedHarmonics, bool, true, "Flag to make and fill histos for mixed harmonics"); O2_DEFINE_CONFIGURABLE(cfgFillEventPlane, bool, true, "Flag to make and fill histos with Event Plane"); O2_DEFINE_CONFIGURABLE(cfgFillXandYterms, bool, true, "Flag to make and fill histos for with separate x and y terms for SPM"); O2_DEFINE_CONFIGURABLE(cfgFillChargeDependence, bool, true, "Flag to make and fill histos for charge dependent flow"); + O2_DEFINE_CONFIGURABLE(cfgFillPID, bool, true, "Flag to make and fill histos for PID flow"); // Centrality Estimators -> standard is FT0C O2_DEFINE_CONFIGURABLE(cfgCentFT0Cvariant1, bool, false, "Set centrality estimator to cfgCentFT0Cvariant1"); O2_DEFINE_CONFIGURABLE(cfgCentFT0M, bool, false, "Set centrality estimator to cfgCentFT0M"); @@ -71,23 +79,21 @@ struct FlowSP { O2_DEFINE_CONFIGURABLE(cfgTrackSelsEta, float, 0.8, "eta cut"); O2_DEFINE_CONFIGURABLE(cfgEvSelsVtxZ, float, 10, "vertex cut (cm)"); O2_DEFINE_CONFIGURABLE(cfgMagField, float, 99999, "Configurable magnetic field;default CCDB will be queried"); - O2_DEFINE_CONFIGURABLE(cfgCentMin, float, 0, "Minimum cenrality for selected events"); O2_DEFINE_CONFIGURABLE(cfgCentMax, float, 90, "Maximum cenrality for selected events"); // NUA and NUE weights O2_DEFINE_CONFIGURABLE(cfgFillWeights, bool, true, "Fill NUA weights"); - O2_DEFINE_CONFIGURABLE(cfgFillWeightsPOS, bool, false, "Fill NUA weights only for positive charges"); - O2_DEFINE_CONFIGURABLE(cfgFillWeightsNEG, bool, false, "Fill NUA weights only for negative charges"); + O2_DEFINE_CONFIGURABLE(cfgFillWeightsPOS, bool, true, "Fill NUA weights only for positive charges"); + O2_DEFINE_CONFIGURABLE(cfgFillWeightsNEG, bool, true, "Fill NUA weights only for negative charges"); // Additional track Selections O2_DEFINE_CONFIGURABLE(cfgTrackSelsUseAdditionalTrackCut, bool, false, "Bool to enable Additional Track Cut"); - O2_DEFINE_CONFIGURABLE(cfgTrackSelsDoubleTrackFunction, bool, true, "Include track cut at low pt"); - O2_DEFINE_CONFIGURABLE(cfgTrackSelsTrackCutSize, float, 0.06, "Spread of track cut"); O2_DEFINE_CONFIGURABLE(cfgTrackSelsDoDCApt, bool, false, "Apply Pt dependent DCAz cut"); O2_DEFINE_CONFIGURABLE(cfgTrackSelsDCApt1, float, 0.1, "DcaZ < a * b / pt^1.1 -> this sets a"); O2_DEFINE_CONFIGURABLE(cfgTrackSelsDCApt2, float, 0.035, "DcaZ < a * b / pt^1.1 -> this sets b"); + O2_DEFINE_CONFIGURABLE(cfgTrackSelsPIDNsigma, float, 2.0, "nSigma cut for PID"); // Additional event selections O2_DEFINE_CONFIGURABLE(cfgEvSelsUseAdditionalEventCut, bool, true, "Bool to enable Additional Event Cut"); - O2_DEFINE_CONFIGURABLE(cfgEvSelsnSigmaMultCuts, int, 1, "Sigma cut on Additional event cut: 1 (default), 2 or 3 sigma available"); + O2_DEFINE_CONFIGURABLE(cfgEvSelsnSigmaMultCuts, int, 3, "Sigma cut on Additional event cut: 1, 2 or 3 (default) sigma available"); O2_DEFINE_CONFIGURABLE(cfgEvSelsManualEventParameters, bool, false, "Use manual event parameters for the pile up fits. Needed for Cent estimaters other than FT0C"); O2_DEFINE_CONFIGURABLE(cfgEvSelsMultPv, std::vector, {}, "Multiplicity cuts for PV first 5 parameters cutLOW last 5 cutHIGH"); O2_DEFINE_CONFIGURABLE(cfgEvSelsMult, std::vector, {}, "Multiplicity cuts for T0C first 5 parameters cutLOW last 5 cutHIGH"); @@ -108,12 +114,15 @@ struct FlowSP { O2_DEFINE_CONFIGURABLE(cfgCCDBdir_SP, std::string, "", "ccdb dir for average event plane resolution in 1% centrality bins"); O2_DEFINE_CONFIGURABLE(cfgCCDB_NUA, std::string, "", "ccdb dir for NUA corrections"); O2_DEFINE_CONFIGURABLE(cfgCCDB_NUE, std::string, "", "ccdb dir for NUE corrections"); + O2_DEFINE_CONFIGURABLE(cfgCCDBdir_centrality, std::string, "", "ccdb dir for Centrality corrections"); + // Confogirable axis + ConfigurableAxis axisCentrality{"axisCentrality", {10, 0, 100}, "Centrality bins for vn "}; Filter collisionFilter = nabs(aod::collision::posZ) < cfgEvSelsVtxZ; Filter trackFilter = nabs(aod::track::eta) < cfgTrackSelsEta && aod::track::pt > cfgTrackSelsPtmin&& aod::track::pt < cfgTrackSelsPtmax && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && nabs(aod::track::dcaXY) < cfgTrackSelsDCAxy&& nabs(aod::track::dcaZ) < cfgTrackSelsDCAz; Filter trackFilterMC = nabs(aod::mcparticle::eta) < cfgTrackSelsEta && aod::mcparticle::pt > cfgTrackSelsPtmin&& aod::mcparticle::pt < cfgTrackSelsPtmax; using UsedCollisions = soa::Filtered>; - using UsedTracks = soa::Filtered>; + using UsedTracks = soa::Filtered>; // For MC Reco and Gen using CCs = soa::Filtered>; @@ -143,8 +152,11 @@ struct FlowSP { TProfile* hcorrQQx = nullptr; TProfile* hcorrQQy = nullptr; TProfile* hEvPlaneRes = nullptr; + TH1D* hCentrality = nullptr; + bool clQQ = false; bool clEvPlaneRes = false; + bool clCentrality = false; } cfg; @@ -179,7 +191,7 @@ struct FlowSP { evSel_CentCuts }; - enum TrackSelectionsUnFiltered { + enum TrackSelections { trackSel_ZeroCharge, trackSel_Eta, trackSel_Pt, @@ -209,7 +221,15 @@ struct FlowSP { kReco }; + enum ParticleType { + kUnidentified, + kPion, + kKaon, + kProton + }; + static constexpr std::string_view Charge[] = {"incl/", "pos/", "neg/"}; + static constexpr std::string_view Species[] = {"", "pion/", "kaon/", "proton/"}; static constexpr std::string_view Time[] = {"before/", "after/"}; void init(InitContext const&) @@ -238,14 +258,43 @@ struct FlowSP { AxisSpec axisT0a = {70, 0, 200000, "N_{ch} (T0A)"}; AxisSpec axisV0a = {70, 0, 200000, "N_{ch} (V0A)"}; AxisSpec axisMultpv = {40, 0, 4000, "N_{ch} (PV)"}; - AxisSpec axisShCl = {100, 0, 1, "Fraction shared cl. TPC"}; - AxisSpec axisCl = {100, 0, 160, "Number of cl. TPC"}; + AxisSpec axisShCl = {40, 0, 1, "Fraction shared cl. TPC"}; + AxisSpec axisCl = {80, 0, 160, "Number of cl. TPC"}; + AxisSpec axisNsigma = {100, -10, 10, "Nsigma for TPC and TOF"}; + AxisSpec axisdEdx = {300, 0, 300, "dEdx for PID"}; + AxisSpec axisBeta = {150, 0, 1.5, "Beta for PID"}; std::vector ptbinning = {0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.2, 2.4, 2.6, 2.8, 3, 3.5, 4, 5, 6, 8, 10}; AxisSpec axisPt = {ptbinning, "#it{p}_{T} GeV/#it{c}"}; int ptbins = ptbinning.size() - 1; + registry.add("hEventCount", "Number of Event; Cut; #Events Passed Cut", {HistType::kTH1D, {{nEventSelections, 0, nEventSelections}}}); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_FilteredEvent + 1, "Filtered event"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_sel8 + 1, "Sel8"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_occupancy + 1, "kOccupancy"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_kTVXinTRD + 1, "kTVXinTRD"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_kNoSameBunchPileup + 1, "kNoSameBunchPileup"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_kIsGoodZvtxFT0vsPV + 1, "kIsGoodZvtxFT0vsPV"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_kNoCollInTimeRangeStandard + 1, "kNoCollInTimeRangeStandard"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_kIsVertexITSTPC + 1, "kIsVertexITSTPC"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_MultCuts + 1, "Mult cuts (Alex)"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_kIsGoodITSLayersAll + 1, "kkIsGoodITSLayersAll"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_isSelectedZDC + 1, "isSelected"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_CentCuts + 1, "Cenrality range"); + + registry.add("hTrackCount", "Number of Tracks; Cut; #Tracks Passed Cut", {HistType::kTH1D, {{nTrackSelections, 0, nTrackSelections}}}); + registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_Eta + 1, "Eta"); + registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_Pt + 1, "Pt"); + registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_DCAxy + 1, "DCAxy"); + registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_DCAz + 1, "DCAz"); + registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_GlobalTracks + 1, "GlobalTracks"); + registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_NCls + 1, "nClusters TPC"); + registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_FshCls + 1, "Frac. sh. Cls TPC"); + registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_TPCBoundary + 1, "TPC Boundary"); + registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_ZeroCharge + 1, "Only charged"); + registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_ParticleWeights + 1, "Apply weights"); + if (cfgFillWeights) { fWeights->setPtBins(ptbins, &ptbinning[0]); fWeights->init(true, false); @@ -257,47 +306,68 @@ struct FlowSP { fWeightsNEG->init(true, false); } - if (doprocessData || doprocessMCReco || doprocessMCGen) { - if (cfgFillQAHistos) { - registry.add("QA/after/hCentFT0C", " ; Cent FT0C (%); ", {HistType::kTH1D, {axisCent}}); - registry.add("QA/after/hCentFT0M", "; Cent FT0M (%); ", {HistType::kTH1D, {axisCent}}); - registry.add("QA/after/hCentFV0A", "; Cent FV0A (%); ", {HistType::kTH1D, {axisCent}}); - registry.add("QA/after/hCentNGlobal", "; Cent NGlobal (%); ", {HistType::kTH1D, {axisCent}}); + if (cfgFillEventQA) { + registry.add("QA/after/hCentFT0C", " ; Cent FT0C (%); ", {HistType::kTH1D, {axisCent}}); + registry.add("QA/after/hCentFT0M", "; Cent FT0M (%); ", {HistType::kTH1D, {axisCent}}); + registry.add("QA/after/hCentFV0A", "; Cent FV0A (%); ", {HistType::kTH1D, {axisCent}}); + registry.add("QA/after/hCentNGlobal", "; Cent NGlobal (%); ", {HistType::kTH1D, {axisCent}}); + registry.add("QA/after/globalTracks_centT0C", "", {HistType::kTH2D, {axisCent, axisNch}}); + registry.add("QA/after/globalTracks_centNGlobal", "", {HistType::kTH2D, {axisCent, axisNch}}); + registry.add("QA/after/PVTracks_centT0C", "", {HistType::kTH2D, {axisCent, axisMultpv}}); + registry.add("QA/after/PVTracks_centNGlobal", "", {HistType::kTH2D, {axisCent, axisMultpv}}); + registry.add("QA/after/globalTracks_PVTracks", "", {HistType::kTH2D, {axisMultpv, axisNch}}); + registry.add("QA/after/globalTracks_multT0A", "", {HistType::kTH2D, {axisT0a, axisNch}}); + registry.add("QA/after/globalTracks_multV0A", "", {HistType::kTH2D, {axisV0a, axisNch}}); + registry.add("QA/after/multV0A_multT0A", "", {HistType::kTH2D, {axisT0a, axisV0a}}); + registry.add("QA/after/multT0C_centT0C", "", {HistType::kTH2D, {axisCent, axisT0c}}); + registry.add("QA/after/CentFT0C_vs_CentFT0Cvariant1", " ; Cent FT0C (%); Cent FT0Cvariant1 (%) ", {HistType::kTH2D, {axisCent, axisCent}}); + registry.add("QA/after/CentFT0C_vs_CentFT0M", " ; Cent FT0C (%); Cent FT0M (%) ", {HistType::kTH2D, {axisCent, axisCent}}); + registry.add("QA/after/CentFT0C_vs_CentFV0A", " ; Cent FT0C (%); Cent FV0A (%) ", {HistType::kTH2D, {axisCent, axisCent}}); + registry.add("QA/after/CentFT0C_vs_CentNGlobal", " ; Cent FT0C (%); Cent NGlobal (%) ", {HistType::kTH2D, {axisCent, axisCent}}); + } - registry.add("QA/after/pt_phi", "", {HistType::kTH2D, {axisPt, axisPhiMod}}); - registry.add("QA/after/hPt_inclusive", "", {HistType::kTH1D, {axisPt}}); - registry.add("QA/after/hPt_positive", "", {HistType::kTH1D, {axisPt}}); - registry.add("QA/after/hPt_negative", "", {HistType::kTH1D, {axisPt}}); - registry.add("QA/after/globalTracks_centT0C", "", {HistType::kTH2D, {axisCent, axisNch}}); - registry.add("QA/after/globalTracks_centNGlobal", "", {HistType::kTH2D, {axisCent, axisNch}}); - registry.add("QA/after/PVTracks_centT0C", "", {HistType::kTH2D, {axisCent, axisMultpv}}); - registry.add("QA/after/PVTracks_centNGlobal", "", {HistType::kTH2D, {axisCent, axisMultpv}}); - registry.add("QA/after/globalTracks_PVTracks", "", {HistType::kTH2D, {axisMultpv, axisNch}}); - registry.add("QA/after/globalTracks_multT0A", "", {HistType::kTH2D, {axisT0a, axisNch}}); - registry.add("QA/after/globalTracks_multV0A", "", {HistType::kTH2D, {axisV0a, axisNch}}); - registry.add("QA/after/multV0A_multT0A", "", {HistType::kTH2D, {axisT0a, axisV0a}}); - registry.add("QA/after/multT0C_centT0C", "", {HistType::kTH2D, {axisCent, axisT0c}}); - - registry.add("QA/after/CentFT0C_vs_CentFT0Cvariant1", " ; Cent FT0C (%); Cent FT0Cvariant1 (%) ", {HistType::kTH2D, {axisCent, axisCent}}); - registry.add("QA/after/CentFT0C_vs_CentFT0M", " ; Cent FT0C (%); Cent FT0M (%) ", {HistType::kTH2D, {axisCent, axisCent}}); - registry.add("QA/after/CentFT0C_vs_CentFV0A", " ; Cent FT0C (%); Cent FV0A (%) ", {HistType::kTH2D, {axisCent, axisCent}}); - registry.add("QA/after/CentFT0C_vs_CentNGlobal", " ; Cent FT0C (%); Cent NGlobal (%) ", {HistType::kTH2D, {axisCent, axisCent}}); - - if (doprocessData || doprocessMCReco) { - // track QA for pos, neg, incl - registry.add("incl/QA/before/hPt", "", kTH1D, {axisPt}); - registry.add("incl/QA/before/hPhi", "", kTH1D, {axisPhi}); - registry.add("incl/QA/before/hEta", "", kTH1D, {axisEta}); - registry.add("incl/QA/before/hPhi_Eta_vz", "", kTH3D, {axisPhi, axisEta, axisVz}); - registry.add("incl/QA/before/hDCAxy_pt", "", kTH2D, {axisPt, axisDCAxy}); - registry.add("incl/QA/before/hDCAz_pt", "", kTH2D, {axisPt, axisDCAz}); - registry.add("incl/QA/before/hSharedClusters_pt", "", {HistType::kTH2D, {axisPt, axisShCl}}); - registry.add("incl/QA/before/hCrossedRows_pt", "", {HistType::kTH2D, {axisPt, axisCl}}); - registry.add("incl/QA/before/hCrossedRows_vs_SharedClusters", "", {HistType::kTH2D, {axisCl, axisShCl}}); - - registry.addClone("incl/QA/before/", "incl/QA/after/"); + if (doprocessData || doprocessMCReco) { + // track QA for pos, neg, incl + if (cfgFillPIDQA) { + registry.add("hPIDcounts", "", kTH2D, {{{4, 0, 4}, axisPt}}); + registry.get(HIST("hPIDcounts"))->GetXaxis()->SetBinLabel(1, "UFO"); + registry.get(HIST("hPIDcounts"))->GetXaxis()->SetBinLabel(2, "Pion"); + registry.get(HIST("hPIDcounts"))->GetXaxis()->SetBinLabel(3, "Kaon"); + registry.get(HIST("hPIDcounts"))->GetXaxis()->SetBinLabel(4, "Proton"); + + registry.add("incl/QA/after/hdEdxTPC_pt", "", {HistType::kTH2D, {axisPt, axisdEdx}}); + registry.add("incl/QA/after/hBetaTOF_pt", "", {HistType::kTH2D, {axisPt, axisBeta}}); + registry.add("incl/pion/QA/after/hNsigmaTPC_pt", "", {HistType::kTH2D, {axisPt, axisNsigma}}); + registry.add("incl/pion/QA/after/hNsigmaTOF_pt", "", {HistType::kTH2D, {axisPt, axisNsigma}}); + + if (cfgFillTrackQA) { + registry.add("incl/pion/QA/after/hPt", "", kTH1D, {axisPt}); + registry.add("incl/pion/QA/after/hPhi", "", kTH1D, {axisPhi}); + registry.add("incl/pion/QA/after/hEta", "", kTH1D, {axisEta}); + registry.add("incl/pion/QA/after/hPhi_Eta_vz", "", kTH3D, {axisPhi, axisEta, axisVz}); + registry.add("incl/pion/QA/after/hDCAxy_pt", "", kTH2D, {axisPt, axisDCAxy}); + registry.add("incl/pion/QA/after/hDCAz_pt", "", kTH2D, {axisPt, axisDCAz}); + registry.add("incl/pion/QA/after/hSharedClusters_pt", "", {HistType::kTH2D, {axisPt, axisShCl}}); + registry.add("incl/pion/QA/after/hCrossedRows_pt", "", {HistType::kTH2D, {axisPt, axisCl}}); + registry.add("incl/pion/QA/after/hCrossedRows_vs_SharedClusters", "", {HistType::kTH2D, {axisCl, axisShCl}}); } + if (cfgFillQABefore) + registry.addClone("incl/pion/QA/after/", "incl/pion/QA/before/"); + } + if (cfgFillTrackQA) { + registry.add("QA/after/pt_phi", "", {HistType::kTH2D, {axisPt, axisPhiMod}}); + registry.add("incl/QA/after/hPt", "", kTH1D, {axisPt}); + registry.add("incl/QA/after/hPhi", "", kTH1D, {axisPhi}); + registry.add("incl/QA/after/hEta", "", kTH1D, {axisEta}); + registry.add("incl/QA/after/hPhi_Eta_vz", "", kTH3D, {axisPhi, axisEta, axisVz}); + registry.add("incl/QA/after/hDCAxy_pt", "", kTH2D, {axisPt, axisDCAxy}); + registry.add("incl/QA/after/hDCAz_pt", "", kTH2D, {axisPt, axisDCAz}); + registry.add("incl/QA/after/hSharedClusters_pt", "", {HistType::kTH2D, {axisPt, axisShCl}}); + registry.add("incl/QA/after/hCrossedRows_pt", "", {HistType::kTH2D, {axisPt, axisCl}}); + registry.add("incl/QA/after/hCrossedRows_vs_SharedClusters", "", {HistType::kTH2D, {axisCl, axisShCl}}); } + if (cfgFillQABefore && (cfgFillTrackQA || cfgFillPIDQA)) + registry.addClone("incl/QA/after/", "incl/QA/before/"); if (doprocessMCReco) { registry.add("trackMCReco/after/hIsPhysicalPrimary", "", {HistType::kTH1D, {{2, 0, 2}}}); @@ -305,163 +375,166 @@ struct FlowSP { registry.add("trackMCReco/hTrackSize_Filtered", "", {HistType::kTH1D, {{100, 0, 20000}}}); registry.get(HIST("trackMCReco/after/hIsPhysicalPrimary"))->GetXaxis()->SetBinLabel(1, "Secondary"); registry.get(HIST("trackMCReco/after/hIsPhysicalPrimary"))->GetXaxis()->SetBinLabel(2, "Primary"); - registry.add("trackMCReco/after/incl/hPt_hadron", "", {HistType::kTH1D, {axisPt}}); registry.add("trackMCReco/after/incl/hPt_proton", "", {HistType::kTH1D, {axisPt}}); registry.add("trackMCReco/after/incl/hPt_pion", "", {HistType::kTH1D, {axisPt}}); registry.add("trackMCReco/after/incl/hPt_kaon", "", {HistType::kTH1D, {axisPt}}); - - registry.addClone("trackMCReco/after/incl/", "trackMCReco/after/pos/"); - registry.addClone("trackMCReco/after/incl/", "trackMCReco/after/neg/"); - + registry.addClone("trackMCReco/after/incl/", "trackMCReco/before/pos/"); + registry.addClone("trackMCReco/after/incl/", "trackMCReco/before/neg/"); registry.addClone("trackMCReco/after/", "trackMCReco/before/"); } - if (doprocessData) { - // track properties per centrality and per eta, pt bin - registry.add("incl/vnC_eta", "", kTProfile, {axisEtaVn}); - registry.add("incl/vnA_eta", "", kTProfile, {axisEtaVn}); - - registry.add("incl/vnC_pt", "", kTProfile, {axisPt}); - registry.add("incl/vnA_pt", "", kTProfile, {axisPt}); - registry.add("incl/vnC_pt_odd", "", kTProfile, {axisPt}); - registry.add("incl/vnA_pt_odd", "", kTProfile, {axisPt}); - - registry.add("incl/vnC_cent_minEta", "", kTProfile, {axisCent}); - registry.add("incl/vnA_cent_minEta", "", kTProfile, {axisCent}); - registry.add("incl/vnC_cent_plusEta", "", kTProfile, {axisCent}); - registry.add("incl/vnA_cent_plusEta", "", kTProfile, {axisCent}); - + if (cfgFillGeneralV1Histos) { + // track properties per centrality and per eta, pt bin + registry.add("incl/vnC_eta", "", kTProfile2D, {axisEtaVn, axisCentrality}); + registry.add("incl/vnA_eta", "", kTProfile2D, {axisEtaVn, axisCentrality}); + registry.add("incl/vnC_pt", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/vnA_pt", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/vnC_pt_odd", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/vnA_pt_odd", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/vnC_cent_minEta", "", kTProfile, {axisCent}); + registry.add("incl/vnA_cent_minEta", "", kTProfile, {axisCent}); + registry.add("incl/vnC_cent_plusEta", "", kTProfile, {axisCent}); + registry.add("incl/vnA_cent_plusEta", "", kTProfile, {axisCent}); + } + if (cfgFillPID) { + registry.add("incl/pion/vnC_eta", "", kTProfile2D, {axisEtaVn, axisCentrality}); + registry.add("incl/pion/vnA_eta", "", kTProfile2D, {axisEtaVn, axisCentrality}); + registry.add("incl/pion/vnC_pt", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/pion/vnA_pt", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/pion/vnC_pt_odd", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/pion/vnA_pt_odd", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/pion/vnC_cent_minEta", "", kTProfile, {axisCent}); + registry.add("incl/pion/vnA_cent_minEta", "", kTProfile, {axisCent}); + registry.add("incl/pion/vnC_cent_plusEta", "", kTProfile, {axisCent}); + registry.add("incl/pion/vnA_cent_plusEta", "", kTProfile, {axisCent}); + } if (cfgFillXandYterms) { - registry.add("incl/vnAx_eta", "", kTProfile, {axisEtaVn}); - registry.add("incl/vnAy_eta", "", kTProfile, {axisEtaVn}); - registry.add("incl/vnCx_eta", "", kTProfile, {axisEtaVn}); - registry.add("incl/vnCy_eta", "", kTProfile, {axisEtaVn}); - registry.add("incl/vnAx_pt", "", kTProfile, {axisPt}); - registry.add("incl/vnAy_pt", "", kTProfile, {axisPt}); - registry.add("incl/vnCx_pt", "", kTProfile, {axisPt}); - registry.add("incl/vnCy_pt", "", kTProfile, {axisPt}); - registry.add("incl/vnCx_pt_odd", "", kTProfile, {axisPt}); - registry.add("incl/vnAx_pt_odd", "", kTProfile, {axisPt}); - registry.add("incl/vnCy_pt_odd", "", kTProfile, {axisPt}); - registry.add("incl/vnAy_pt_odd", "", kTProfile, {axisPt}); + registry.add("incl/vnAx_eta", "", kTProfile2D, {axisEtaVn, axisCentrality}); + registry.add("incl/vnAy_eta", "", kTProfile2D, {axisEtaVn, axisCentrality}); + registry.add("incl/vnCx_eta", "", kTProfile2D, {axisEtaVn, axisCentrality}); + registry.add("incl/vnCy_eta", "", kTProfile2D, {axisEtaVn, axisCentrality}); + registry.add("incl/vnAx_pt", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/vnAy_pt", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/vnCx_pt", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/vnCy_pt", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/vnCx_pt_odd", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/vnAx_pt_odd", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/vnCy_pt_odd", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/vnAy_pt_odd", "", kTProfile2D, {axisPt, axisCentrality}); + if (cfgFillPID) { + registry.add("incl/pion/vnAx_eta", "", kTProfile2D, {axisEtaVn, axisCentrality}); + registry.add("incl/pion/vnAy_eta", "", kTProfile2D, {axisEtaVn, axisCentrality}); + registry.add("incl/pion/vnCx_eta", "", kTProfile2D, {axisEtaVn, axisCentrality}); + registry.add("incl/pion/vnCy_eta", "", kTProfile2D, {axisEtaVn, axisCentrality}); + registry.add("incl/pion/vnAx_pt", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/pion/vnAy_pt", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/pion/vnCx_pt", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/pion/vnCy_pt", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/pion/vnCx_pt_odd", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/pion/vnAx_pt_odd", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/pion/vnCy_pt_odd", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/pion/vnAy_pt_odd", "", kTProfile2D, {axisPt, axisCentrality}); + } } - if (cfgFillMixedHarmonics) { - registry.add("incl/v2/vnAxCxUx_pt_MH", "", kTProfile, {axisPt}); - registry.add("incl/v2/vnAxCyUx_pt_MH", "", kTProfile, {axisPt}); - registry.add("incl/v2/vnAxCyUy_pt_MH", "", kTProfile, {axisPt}); - registry.add("incl/v2/vnAyCxUy_pt_MH", "", kTProfile, {axisPt}); - + registry.add("incl/v2/vnAxCxUx_pt_MH", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/v2/vnAxCyUx_pt_MH", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/v2/vnAxCyUy_pt_MH", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/v2/vnAyCxUy_pt_MH", "", kTProfile2D, {axisPt, axisCentrality}); registry.add("incl/v2/vnAxCxUx_cent_MH", "", kTProfile, {axisCent}); registry.add("incl/v2/vnAxCyUx_cent_MH", "", kTProfile, {axisCent}); registry.add("incl/v2/vnAxCyUy_cent_MH", "", kTProfile, {axisCent}); registry.add("incl/v2/vnAyCxUy_cent_MH", "", kTProfile, {axisCent}); - - registry.add("incl/v2/vnAxCxUx_eta_MH", "", kTProfile, {axisEtaVn}); - registry.add("incl/v2/vnAxCyUx_eta_MH", "", kTProfile, {axisEtaVn}); - registry.add("incl/v2/vnAxCyUy_eta_MH", "", kTProfile, {axisEtaVn}); - registry.add("incl/v2/vnAyCxUy_eta_MH", "", kTProfile, {axisEtaVn}); - + registry.add("incl/v2/vnAxCxUx_eta_MH", "", kTProfile2D, {axisEtaVn, axisCentrality}); + registry.add("incl/v2/vnAxCyUx_eta_MH", "", kTProfile2D, {axisEtaVn, axisCentrality}); + registry.add("incl/v2/vnAxCyUy_eta_MH", "", kTProfile2D, {axisEtaVn, axisCentrality}); + registry.add("incl/v2/vnAyCxUy_eta_MH", "", kTProfile2D, {axisEtaVn, axisCentrality}); registry.addClone("incl/v2/", "incl/v3/"); + if (cfgFillPID) { + registry.add("incl/pion/v2/vnAxCxUx_pt_MH", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/pion/v2/vnAxCyUx_pt_MH", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/pion/v2/vnAxCyUy_pt_MH", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/pion/v2/vnAyCxUy_pt_MH", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/pion/v2/vnAxCxUx_cent_MH", "", kTProfile, {axisCent}); + registry.add("incl/pion/v2/vnAxCyUx_cent_MH", "", kTProfile, {axisCent}); + registry.add("incl/pion/v2/vnAxCyUy_cent_MH", "", kTProfile, {axisCent}); + registry.add("incl/pion/v2/vnAyCxUy_cent_MH", "", kTProfile, {axisCent}); + registry.add("incl/pion/v2/vnAxCxUx_eta_MH", "", kTProfile2D, {axisEtaVn, axisCentrality}); + registry.add("incl/pion/v2/vnAxCyUx_eta_MH", "", kTProfile2D, {axisEtaVn, axisCentrality}); + registry.add("incl/pion/v2/vnAxCyUy_eta_MH", "", kTProfile2D, {axisEtaVn, axisCentrality}); + registry.add("incl/pion/v2/vnAyCxUy_eta_MH", "", kTProfile2D, {axisEtaVn, axisCentrality}); + registry.addClone("incl/pion/v2/", "incl/pion/v3/"); + } } - if (cfgFillEventPlane) { registry.add("incl/vnA_cent_EP", "", kTProfile, {axisCent}); registry.add("incl/vnC_cent_EP", "", kTProfile, {axisCent}); registry.add("incl/vnFull_cent_EP", "", kTProfile, {axisCent}); - registry.add("incl/vnA_pt_EP", "", kTProfile, {axisPt}); - registry.add("incl/vnC_pt_EP", "", kTProfile, {axisPt}); - registry.add("incl/vnFull_pt_EP", "", kTProfile, {axisPt}); - registry.add("incl/vnA_eta_EP", "", kTProfile, {axisEtaVn}); - registry.add("incl/vnC_eta_EP", "", kTProfile, {axisEtaVn}); - registry.add("incl/vnFull_eta_EP", "", kTProfile, {axisEtaVn}); + registry.add("incl/vnA_pt_EP", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/vnC_pt_EP", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/vnFull_pt_EP", "", kTProfile2D, {axisPt, axisCentrality}); + registry.add("incl/vnA_eta_EP", "", kTProfile2D, {axisEtaVn, axisCentrality}); + registry.add("incl/vnC_eta_EP", "", kTProfile2D, {axisEtaVn, axisCentrality}); + registry.add("incl/vnFull_eta_EP", "", kTProfile2D, {axisEtaVn, axisCentrality}); } - - if (cfgFillQAHistos) { - registry.add("QA/qAqCX", "", kTProfile, {axisCent}); - registry.add("QA/qAqCY", "", kTProfile, {axisCent}); - registry.add("QA/qAqCXY", "", kTProfile, {axisCent}); - registry.add("QA/qAXqCY", "", kTProfile, {axisCent}); - registry.add("QA/qAYqCX", "", kTProfile, {axisCent}); - registry.add("QA/qAXYqCXY", "", kTProfile, {axisCent}); - + if (cfgFillEventPlaneQA) { registry.add("QA/hSPplaneA", "hSPplaneA", kTH1D, {axisPhiPlane}); registry.add("QA/hSPplaneC", "hSPplaneC", kTH1D, {axisPhiPlane}); registry.add("QA/hSPplaneFull", "hSPplaneFull", kTH1D, {axisPhiPlane}); - - registry.add("QA/hCentFull", " ; Centrality (%); ", {HistType::kTH1D, {axisCent}}); - registry.add("QA/hCosPhiACosPhiC", "hCosPhiACosPhiC; Centrality(%); #LT Cos(#Psi^{A})Cos(#Psi^{C})#GT", kTProfile, {axisCent}); registry.add("QA/hSinPhiASinPhiC", "hSinPhiASinPhiC; Centrality(%); #LT Sin(#Psi^{A})Sin(#Psi^{C})#GT", kTProfile, {axisCent}); registry.add("QA/hSinPhiACosPhiC", "hSinPhiACosPhiC; Centrality(%); #LT Sin(#Psi^{A})Cos(#Psi^{C})#GT", kTProfile, {axisCent}); registry.add("QA/hCosPhiASinsPhiC", "hCosPhiASinsPhiC; Centrality(%); #LT Cos(#Psi^{A})Sin(#Psi^{C})#GT", kTProfile, {axisCent}); registry.add("QA/hFullEvPlaneRes", "hFullEvPlaneRes; Centrality(%); -#LT Cos(#Psi^{A} - #Psi^{C})#GT ", kTProfile, {axisCent}); - registry.add("QA/after/PsiA_vs_Cent", "", {HistType::kTH2D, {axisPhiPlane, axisCent}}); registry.add("QA/after/PsiC_vs_Cent", "", {HistType::kTH2D, {axisPhiPlane, axisCent}}); registry.add("QA/after/PsiFull_vs_Cent", "", {HistType::kTH2D, {axisPhiPlane, axisCent}}); - registry.add("QA/after/PsiA_vs_Vx", "", {HistType::kTH2D, {axisPhiPlane, axisVx}}); registry.add("QA/after/PsiC_vs_Vx", "", {HistType::kTH2D, {axisPhiPlane, axisVx}}); registry.add("QA/after/PsiFull_vs_Vx", "", {HistType::kTH2D, {axisPhiPlane, axisVx}}); - registry.add("QA/after/PsiA_vs_Vy", "", {HistType::kTH2D, {axisPhiPlane, axisVy}}); registry.add("QA/after/PsiC_vs_Vy", "", {HistType::kTH2D, {axisPhiPlane, axisVy}}); registry.add("QA/after/PsiFull_vs_Vy", "", {HistType::kTH2D, {axisPhiPlane, axisVy}}); - registry.add("QA/after/PsiA_vs_Vz", "", {HistType::kTH2D, {axisPhiPlane, axisVz}}); registry.add("QA/after/PsiC_vs_Vz", "", {HistType::kTH2D, {axisPhiPlane, axisVz}}); registry.add("QA/after/PsiFull_vs_Vz", "", {HistType::kTH2D, {axisPhiPlane, axisVz}}); } + if (cfgFillEventQA) { + registry.add("QA/qAqCX", "", kTProfile, {axisCent}); + registry.add("QA/qAqCY", "", kTProfile, {axisCent}); + registry.add("QA/qAqCXY", "", kTProfile, {axisCent}); + registry.add("QA/qAXqCY", "", kTProfile, {axisCent}); + registry.add("QA/qAYqCX", "", kTProfile, {axisCent}); + registry.add("QA/qAXYqCXY", "", kTProfile, {axisCent}); + registry.add("QA/hCentFull", " ; Centrality (%); ", {HistType::kTH1D, {axisCent}}); + } + } // end of doprocessData + if (cfgFillQABefore && (cfgFillEventQA || cfgFillPIDQA)) + registry.addClone("QA/after/", "QA/before/"); + + if (cfgFillPID || cfgFillPIDQA) { + registry.addClone("incl/pion/", "incl/kaon/"); + registry.addClone("incl/pion/", "incl/proton/"); + registry.addClone("incl/pion/", "incl/unidentified/"); } - - registry.addClone("QA/after/", "QA/before/"); - - if (cfgFillChargeDependence) { + if (cfgFillChargeDependence || cfgFillPIDQA) { registry.addClone("incl/", "pos/"); registry.addClone("incl/", "neg/"); } - } - - if (doprocessMCGen) { + } else if (doprocessMCGen) { registry.add("trackMCGen/nCollReconstructedPerMcCollision", "", {HistType::kTH1D, {{10, -5, 5}}}); - registry.add("trackMCGen/before/incl/hPt_hadron", "", {HistType::kTH1D, {axisPt}}); - registry.add("trackMCGen/before/incl/hPt_proton", "", {HistType::kTH1D, {axisPt}}); - registry.add("trackMCGen/before/incl/hPt_pion", "", {HistType::kTH1D, {axisPt}}); - registry.add("trackMCGen/before/incl/hPt_kaon", "", {HistType::kTH1D, {axisPt}}); - registry.add("trackMCGen/before/incl/phi_eta_vtxZ_gen", "", {HistType::kTH3D, {axisPhi, axisEta, axisVz}}); - registry.addClone("trackMCGen/before/incl/", "trackMCGen/before/pos/"); - registry.addClone("trackMCGen/before/incl/", "trackMCGen/before/neg/"); - registry.addClone("trackMCGen/before/", "trackMCGen/after/"); + registry.add("trackMCGen/after/incl/hPt_hadron", "", {HistType::kTH1D, {axisPt}}); + registry.add("trackMCGen/after/incl/hPt_proton", "", {HistType::kTH1D, {axisPt}}); + registry.add("trackMCGen/after/incl/hPt_pion", "", {HistType::kTH1D, {axisPt}}); + registry.add("trackMCGen/after/incl/hPt_kaon", "", {HistType::kTH1D, {axisPt}}); + registry.add("trackMCGen/after/incl/phi_eta_vtxZ_gen", "", {HistType::kTH3D, {axisPhi, axisEta, axisVz}}); + registry.addClone("trackMCGen/after/incl/", "trackMCGen/before/pos/"); + registry.addClone("trackMCGen/after/incl/", "trackMCGen/before/neg/"); + if (cfgFillQABefore) + registry.addClone("trackMCGen/after/", "trackMCGen/before/"); } - registry.add("hEventCount", "Number of Event; Cut; #Events Passed Cut", {HistType::kTH1D, {{nEventSelections, 0, nEventSelections}}}); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_FilteredEvent + 1, "Filtered event"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_sel8 + 1, "Sel8"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_occupancy + 1, "kOccupancy"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_kTVXinTRD + 1, "kTVXinTRD"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_kNoSameBunchPileup + 1, "kNoSameBunchPileup"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_kIsGoodZvtxFT0vsPV + 1, "kIsGoodZvtxFT0vsPV"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_kNoCollInTimeRangeStandard + 1, "kNoCollInTimeRangeStandard"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_kIsVertexITSTPC + 1, "kIsVertexITSTPC"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_MultCuts + 1, "Mult cuts (Alex)"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_kIsGoodITSLayersAll + 1, "kkIsGoodITSLayersAll"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_isSelectedZDC + 1, "isSelected"); - registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_CentCuts + 1, "Cenrality range"); - - registry.add("hTrackCount", "Number of Tracks; Cut; #Tracks Passed Cut", {HistType::kTH1D, {{nTrackSelections, 0, nTrackSelections}}}); - registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_Eta + 1, "Eta"); - registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_Pt + 1, "Pt"); - registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_DCAxy + 1, "DCAxy"); - registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_DCAz + 1, "DCAz"); - registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_GlobalTracks + 1, "GlobalTracks"); - registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_NCls + 1, "nClusters TPC"); - registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_FshCls + 1, "Frac. sh. Cls TPC"); - registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_TPCBoundary + 1, "TPC Boundary"); - registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_ZeroCharge + 1, "Only charged"); - registry.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(trackSel_ParticleWeights + 1, "Apply weights"); - if (cfgEvSelsUseAdditionalEventCut) { int twoSigma = 2; @@ -575,6 +648,55 @@ struct FlowSP { fPhiCutLow = new TF1("fPhiCutLow", "0.06/x+pi/18.0-0.06", 0, 100); fPhiCutHigh = new TF1("fPhiCutHigh", "0.1/x+pi/18.0+0.06", 0, 100); } + } // end of init + + template + int getTrackPID(TrackObject track) + { + + float usedNSigmaPi = -1; + float usedNSigmaKa = -1; + float usedNSigmaPr = -1; + + if (track.hasTOF() && track.hasTPC()) { + usedNSigmaPi = std::hypot(track.tofNSigmaPi(), track.tpcNSigmaPi()); + usedNSigmaKa = std::hypot(track.tofNSigmaKa(), track.tpcNSigmaKa()); + usedNSigmaPr = std::hypot(track.tofNSigmaPr(), track.tpcNSigmaPr()); + } else if (track.hasTOF()) { + usedNSigmaPi = track.tofNSigmaPi(); + usedNSigmaKa = track.tofNSigmaKa(); + usedNSigmaPr = track.tofNSigmaPr(); + } else if (track.hasTPC()) { + usedNSigmaPi = track.tpcNSigmaPi(); + usedNSigmaKa = track.tpcNSigmaKa(); + usedNSigmaPr = track.tpcNSigmaPr(); + } else { + return kUnidentified; // No PID information available + } + + std::unordered_map usedNSigma = {{usedNSigmaPi, kPion}, {usedNSigmaKa, kKaon}, {usedNSigmaPr, kProton}}; + + int nIdentified = 0; + int valPID = 0; + + for (const auto& nsigma : usedNSigma) { + if (std::abs(nsigma.first) < cfgTrackSelsPIDNsigma) { + valPID = nsigma.second; + nIdentified++; + } + } + + if (nIdentified == 0) { + // LOGF(warning, "No PID match found for |nSigma| < %.2f", cfgTrackSelsPIDNsigma); + return kUnidentified; // No PID match found + } else if (nIdentified == 1) { + return valPID; + } else { + // LOGF(warning, "Track identified as %i particles for |nSigma| < %.2f", nIdentified, cfgTrackSelsPIDNsigma); + return kUnidentified; // Multiple PID matches found + } + + return -1; } int getMagneticField(uint64_t timestamp) @@ -793,175 +915,206 @@ struct FlowSP { phimodn += o2::constants::math::PI / 18.0; // to center gap in the middle phimodn = fmod(phimodn, o2::constants::math::PI / 9.0); - if (cfgFillQAHistos) + if (cfgFillTrackQA) registry.fill(HIST("QA/before/pt_phi"), track.pt(), phimodn); if (cfgTrackSelsUseAdditionalTrackCut) { if (phimodn < fPhiCutHigh->Eval(track.pt()) && phimodn > fPhiCutLow->Eval(track.pt())) return false; // reject track } - if (cfgFillQAHistos) + if (cfgFillTrackQA) registry.fill(HIST("QA/after/pt_phi"), track.pt(), phimodn); registry.fill(HIST("hTrackCount"), trackSel_TPCBoundary); return true; } template - inline void fillEventQA(CollisionObject collision, TracksObject tracks) + inline void fillEventQA(CollisionObject collision, TracksObject tracks, double centWeight = 1.0) { + if (!cfgFillEventQA) + return; + static constexpr std::string_view Time[] = {"before", "after"}; - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hCentFT0C"), collision.centFT0C()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hCentNGlobal"), collision.centNGlobal()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hCentFT0M"), collision.centFT0M()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hCentFV0A"), collision.centFV0A()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/globalTracks_centT0C"), collision.centFT0C(), tracks.size()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/PVTracks_centT0C"), collision.centFT0C(), collision.multNTracksPV()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/globalTracks_PVTracks"), collision.multNTracksPV(), tracks.size()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/globalTracks_multT0A"), collision.multFT0A(), tracks.size()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/globalTracks_multV0A"), collision.multFV0A(), tracks.size()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/multV0A_multT0A"), collision.multFT0A(), collision.multFV0A()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/multT0C_centT0C"), collision.centFT0C(), collision.multFT0C()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/CentFT0C_vs_CentFT0Cvariant1"), collision.centFT0C(), collision.centFT0CVariant1()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/CentFT0C_vs_CentFT0M"), collision.centFT0C(), collision.centFT0M()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/CentFT0C_vs_CentFV0A"), collision.centFT0C(), collision.centFV0A()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/CentFT0C_vs_CentNGlobal"), collision.centFT0C(), collision.centNGlobal()); - - if constexpr (framework::has_type_v) { - double psiA = 1.0 * std::atan2(collision.qyA(), collision.qxA()); - double psiC = 1.0 * std::atan2(collision.qyC(), collision.qxC()); - double psiFull = 1.0 * std::atan2(collision.qyA() + collision.qyC(), collision.qxA() + collision.qxC()); - - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/PsiA_vs_Cent"), psiA, collision.centFT0C()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/PsiC_vs_Cent"), psiC, collision.centFT0C()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/PsiFull_vs_Cent"), psiFull, collision.centFT0C()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/PsiA_vs_Vx"), psiA, collision.vx()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/PsiC_vs_Vx"), psiC, collision.vx()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/PsiFull_vs_Vx"), psiFull, collision.vx()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/PsiA_vs_Vy"), psiA, collision.vy()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/PsiC_vs_Vy"), psiC, collision.vy()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/PsiFull_vs_Vy"), psiFull, collision.vy()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/PsiA_vs_Vz"), psiA, collision.posZ()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/PsiC_vs_Vz"), psiC, collision.posZ()); - registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/PsiFull_vs_Vz"), psiFull, collision.posZ()); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hCentFT0C"), collision.centFT0C(), centWeight); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hCentNGlobal"), collision.centNGlobal(), centWeight); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hCentFT0M"), collision.centFT0M(), centWeight); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/hCentFV0A"), collision.centFV0A(), centWeight); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/globalTracks_centT0C"), collision.centFT0C(), tracks.size(), centWeight); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/PVTracks_centT0C"), collision.centFT0C(), collision.multNTracksPV(), centWeight); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/globalTracks_PVTracks"), collision.multNTracksPV(), tracks.size(), centWeight); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/globalTracks_multT0A"), collision.multFT0A(), tracks.size(), centWeight); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/globalTracks_multV0A"), collision.multFV0A(), tracks.size(), centWeight); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/multV0A_multT0A"), collision.multFT0A(), collision.multFV0A(), centWeight); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/multT0C_centT0C"), collision.centFT0C(), collision.multFT0C(), centWeight); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/CentFT0C_vs_CentFT0Cvariant1"), collision.centFT0C(), collision.centFT0CVariant1(), centWeight); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/CentFT0C_vs_CentFT0M"), collision.centFT0C(), collision.centFT0M(), centWeight); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/CentFT0C_vs_CentFV0A"), collision.centFT0C(), collision.centFV0A(), centWeight); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/CentFT0C_vs_CentNGlobal"), collision.centFT0C(), collision.centNGlobal(), centWeight); + + if (cfgFillEventPlaneQA) { + if constexpr (framework::has_type_v) { + double psiA = 1.0 * std::atan2(collision.qyA(), collision.qxA()); + double psiC = 1.0 * std::atan2(collision.qyC(), collision.qxC()); + double psiFull = 1.0 * std::atan2(collision.qyA() + collision.qyC(), collision.qxA() + collision.qxC()); + + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/PsiA_vs_Cent"), psiA, collision.centFT0C(), centWeight); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/PsiC_vs_Cent"), psiC, collision.centFT0C(), centWeight); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/PsiFull_vs_Cent"), psiFull, collision.centFT0C(), centWeight); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/PsiA_vs_Vx"), psiA, collision.vx(), centWeight); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/PsiC_vs_Vx"), psiC, collision.vx(), centWeight); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/PsiFull_vs_Vx"), psiFull, collision.vx(), centWeight); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/PsiA_vs_Vy"), psiA, collision.vy(), centWeight); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/PsiC_vs_Vy"), psiC, collision.vy(), centWeight); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/PsiFull_vs_Vy"), psiFull, collision.vy(), centWeight); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/PsiA_vs_Vz"), psiA, collision.posZ(), centWeight); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/PsiC_vs_Vz"), psiC, collision.posZ(), centWeight); + registry.fill(HIST("QA/") + HIST(Time[ft]) + HIST("/PsiFull_vs_Vz"), psiFull, collision.posZ(), centWeight); + } } return; } - template - inline void fillHistograms(TrackObject track, float wacc, float weff, double ux, double uy, double uxMH, double uyMH, double uxMH2, double uyMH2, double qxA, double qyA, double qxC, double qyC, double corrQQx, double corrQQy, double corrQQ, double vnA, double vnC, double vnFull, double centrality) + template + inline void fillHistograms(TrackObject track, float wacc, float weff, double centWeight, double ux, double uy, double uxMH, double uyMH, double uxMH2, double uyMH2, double qxA, double qyA, double qxC, double qyC, double corrQQx, double corrQQy, double corrQQ, double vnA, double vnC, double vnFull, double centrality) { - registry.fill(HIST(Charge[ct]) + HIST("vnA_eta"), track.eta(), (uy * qyA + ux * qxA) / std::sqrt(std::fabs(corrQQ)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnC_eta"), track.eta(), (uy * qyC + ux * qxC) / std::sqrt(std::fabs(corrQQ)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnA_pt"), track.pt(), (uy * qyA + ux * qxA) / std::sqrt(std::fabs(corrQQ)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnC_pt"), track.pt(), (uy * qyC + ux * qxC) / std::sqrt(std::fabs(corrQQ)), wacc * weff); + double weight = wacc * weff * centWeight; + + if (cfgFillGeneralV1Histos) { + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnA_eta"), track.eta(), centrality, (uy * qyA + ux * qxA) / std::sqrt(std::fabs(corrQQ)), weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnC_eta"), track.eta(), centrality, (uy * qyC + ux * qxC) / std::sqrt(std::fabs(corrQQ)), weight); + + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnA_pt"), track.pt(), centrality, (uy * qyA + ux * qxA) / std::sqrt(std::fabs(corrQQ)), weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnC_pt"), track.pt(), centrality, (uy * qyC + ux * qxC) / std::sqrt(std::fabs(corrQQ)), weight); + } if (cfgFillMixedHarmonics) { - registry.fill(HIST(Charge[ct]) + HIST("v2/vnAxCxUx_eta_MH"), track.eta(), (uxMH * qxA * qxC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("v2/vnAxCyUx_eta_MH"), track.eta(), (uxMH * qyA * qyC) / corrQQy, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("v2/vnAxCyUy_eta_MH"), track.eta(), (uyMH * qxA * qyC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("v2/vnAyCxUy_eta_MH"), track.eta(), (uyMH * qyA * qxC) / corrQQy, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("v2/vnAxCxUx_eta_MH"), track.eta(), centrality, (uxMH * qxA * qxC) / corrQQx, weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("v2/vnAxCyUx_eta_MH"), track.eta(), centrality, (uxMH * qyA * qyC) / corrQQy, weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("v2/vnAxCyUy_eta_MH"), track.eta(), centrality, (uyMH * qxA * qyC) / corrQQx, weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("v2/vnAyCxUy_eta_MH"), track.eta(), centrality, (uyMH * qyA * qxC) / corrQQy, weight); - registry.fill(HIST(Charge[ct]) + HIST("v2/vnAxCxUx_pt_MH"), track.pt(), (uxMH * qxA * qxC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("v2/vnAxCyUx_pt_MH"), track.pt(), (uxMH * qyA * qyC) / corrQQy, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("v2/vnAxCyUy_pt_MH"), track.pt(), (uyMH * qxA * qyC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("v2/vnAyCxUy_pt_MH"), track.pt(), (uyMH * qyA * qxC) / corrQQy, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("v2/vnAxCxUx_pt_MH"), track.pt(), centrality, (uxMH * qxA * qxC) / corrQQx, weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("v2/vnAxCyUx_pt_MH"), track.pt(), centrality, (uxMH * qyA * qyC) / corrQQy, weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("v2/vnAxCyUy_pt_MH"), track.pt(), centrality, (uyMH * qxA * qyC) / corrQQx, weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("v2/vnAyCxUy_pt_MH"), track.pt(), centrality, (uyMH * qyA * qxC) / corrQQy, weight); - registry.fill(HIST(Charge[ct]) + HIST("v2/vnAxCxUx_cent_MH"), centrality, (uxMH * qxA * qxC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("v2/vnAxCyUx_cent_MH"), centrality, (uxMH * qyA * qyC) / corrQQy, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("v2/vnAxCyUy_cent_MH"), centrality, (uyMH * qxA * qyC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("v2/vnAyCxUy_cent_MH"), centrality, (uyMH * qyA * qxC) / corrQQy, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("v2/vnAxCxUx_cent_MH"), centrality, (uxMH * qxA * qxC) / corrQQx, weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("v2/vnAxCyUx_cent_MH"), centrality, (uxMH * qyA * qyC) / corrQQy, weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("v2/vnAxCyUy_cent_MH"), centrality, (uyMH * qxA * qyC) / corrQQx, weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("v2/vnAyCxUy_cent_MH"), centrality, (uyMH * qyA * qxC) / corrQQy, weight); // -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - registry.fill(HIST(Charge[ct]) + HIST("v3/vnAxCxUx_eta_MH"), track.eta(), (uxMH2 * qxA * qxC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("v3/vnAxCyUx_eta_MH"), track.eta(), (uxMH2 * qyA * qyC) / corrQQy, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("v3/vnAxCyUy_eta_MH"), track.eta(), (uyMH2 * qxA * qyC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("v3/vnAyCxUy_eta_MH"), track.eta(), (uyMH2 * qyA * qxC) / corrQQy, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("v3/vnAxCxUx_eta_MH"), track.eta(), centrality, (uxMH2 * qxA * qxC) / corrQQx, weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("v3/vnAxCyUx_eta_MH"), track.eta(), centrality, (uxMH2 * qyA * qyC) / corrQQy, weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("v3/vnAxCyUy_eta_MH"), track.eta(), centrality, (uyMH2 * qxA * qyC) / corrQQx, weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("v3/vnAyCxUy_eta_MH"), track.eta(), centrality, (uyMH2 * qyA * qxC) / corrQQy, weight); - registry.fill(HIST(Charge[ct]) + HIST("v3/vnAxCxUx_pt_MH"), track.pt(), (uxMH2 * qxA * qxC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("v3/vnAxCyUx_pt_MH"), track.pt(), (uxMH2 * qyA * qyC) / corrQQy, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("v3/vnAxCyUy_pt_MH"), track.pt(), (uyMH2 * qxA * qyC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("v3/vnAyCxUy_pt_MH"), track.pt(), (uyMH2 * qyA * qxC) / corrQQy, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("v3/vnAxCxUx_pt_MH"), track.pt(), centrality, (uxMH2 * qxA * qxC) / corrQQx, weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("v3/vnAxCyUx_pt_MH"), track.pt(), centrality, (uxMH2 * qyA * qyC) / corrQQy, weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("v3/vnAxCyUy_pt_MH"), track.pt(), centrality, (uyMH2 * qxA * qyC) / corrQQx, weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("v3/vnAyCxUy_pt_MH"), track.pt(), centrality, (uyMH2 * qyA * qxC) / corrQQy, weight); - registry.fill(HIST(Charge[ct]) + HIST("v3/vnAxCxUx_cent_MH"), centrality, (uxMH2 * qxA * qxC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("v3/vnAxCyUx_cent_MH"), centrality, (uxMH2 * qyA * qyC) / corrQQy, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("v3/vnAxCyUy_cent_MH"), centrality, (uyMH2 * qxA * qyC) / corrQQx, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("v3/vnAyCxUy_cent_MH"), centrality, (uyMH2 * qyA * qxC) / corrQQy, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("v3/vnAxCxUx_cent_MH"), centrality, (uxMH2 * qxA * qxC) / corrQQx, weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("v3/vnAxCyUx_cent_MH"), centrality, (uxMH2 * qyA * qyC) / corrQQy, weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("v3/vnAxCyUy_cent_MH"), centrality, (uyMH2 * qxA * qyC) / corrQQx, weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("v3/vnAyCxUy_cent_MH"), centrality, (uyMH2 * qyA * qxC) / corrQQy, weight); } if (cfgFillXandYterms) { - registry.fill(HIST(Charge[ct]) + HIST("vnAx_eta"), track.eta(), (ux * qxA) / std::sqrt(std::fabs(corrQQx)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAy_eta"), track.eta(), (uy * qyA) / std::sqrt(std::fabs(corrQQy)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnCx_eta"), track.eta(), (ux * qxC) / std::sqrt(std::fabs(corrQQx)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnCy_eta"), track.eta(), (uy * qyC) / std::sqrt(std::fabs(corrQQy)), wacc * weff); - - registry.fill(HIST(Charge[ct]) + HIST("vnAx_pt"), track.pt(), (ux * qxA) / std::sqrt(std::fabs(corrQQx)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAy_pt"), track.pt(), (uy * qyA) / std::sqrt(std::fabs(corrQQy)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnCx_pt"), track.pt(), (ux * qxC) / std::sqrt(std::fabs(corrQQx)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnCy_pt"), track.pt(), (uy * qyC) / std::sqrt(std::fabs(corrQQy)), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnAx_eta"), track.eta(), centrality, (ux * qxA) / std::sqrt(std::fabs(corrQQx)), weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnAy_eta"), track.eta(), centrality, (uy * qyA) / std::sqrt(std::fabs(corrQQy)), weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnCx_eta"), track.eta(), centrality, (ux * qxC) / std::sqrt(std::fabs(corrQQx)), weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnCy_eta"), track.eta(), centrality, (uy * qyC) / std::sqrt(std::fabs(corrQQy)), weight); + + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnAx_pt"), track.pt(), centrality, (ux * qxA) / std::sqrt(std::fabs(corrQQx)), weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnAy_pt"), track.pt(), centrality, (uy * qyA) / std::sqrt(std::fabs(corrQQy)), weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnCx_pt"), track.pt(), centrality, (ux * qxC) / std::sqrt(std::fabs(corrQQx)), weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnCy_pt"), track.pt(), centrality, (uy * qyC) / std::sqrt(std::fabs(corrQQy)), weight); } if (cfgFillEventPlane) { - registry.fill(HIST(Charge[ct]) + HIST("vnA_eta_EP"), track.eta(), vnA, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnC_eta_EP"), track.eta(), vnC, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnFull_eta_EP"), track.eta(), vnFull, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnA_eta_EP"), track.eta(), centrality, vnA, weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnC_eta_EP"), track.eta(), centrality, vnC, weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnFull_eta_EP"), track.eta(), centrality, vnFull, weight); - registry.fill(HIST(Charge[ct]) + HIST("vnA_pt_EP"), track.pt(), vnA, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnC_pt_EP"), track.pt(), vnC, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnFull_pt_EP"), track.pt(), vnFull, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnA_pt_EP"), track.pt(), centrality, vnA, weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnC_pt_EP"), track.pt(), centrality, vnC, weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnFull_pt_EP"), track.pt(), centrality, vnFull, weight); - registry.fill(HIST(Charge[ct]) + HIST("vnA_cent_EP"), centrality, vnA, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnC_cent_EP"), centrality, vnC, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnFull_cent_EP"), centrality, vnFull, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnA_cent_EP"), centrality, vnA, weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnC_cent_EP"), centrality, vnC, weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnFull_cent_EP"), centrality, vnFull, weight); } // For integrated v1 take only tracks from eta>0. // Following https://arxiv.org/pdf/1306.4145 - if (track.eta() < 0 && cfgHarm == 1) { - registry.fill(HIST(Charge[ct]) + HIST("vnA_cent_minEta"), centrality, -1.0 * (uy * qyA + ux * qxA) / std::sqrt(std::fabs(corrQQ)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnC_cent_minEta"), centrality, -1.0 * (uy * qyC + ux * qxC) / std::sqrt(std::fabs(corrQQ)), wacc * weff); - - registry.fill(HIST(Charge[ct]) + HIST("vnA_pt_odd"), track.pt(), -1.0 * (uy * qyA + ux * qxA) / std::sqrt(std::fabs(corrQQ)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnC_pt_odd"), track.pt(), -1.0 * (uy * qyC + ux * qxC) / std::sqrt(std::fabs(corrQQ)), wacc * weff); - - if (cfgFillXandYterms) { - registry.fill(HIST(Charge[ct]) + HIST("vnAx_pt_odd"), track.pt(), -1.0 * (ux * qxA) / std::sqrt(std::fabs(corrQQx)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAy_pt_odd"), track.pt(), -1.0 * (uy * qyA) / std::sqrt(std::fabs(corrQQy)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnCx_pt_odd"), track.pt(), -1.0 * (ux * qxC) / std::sqrt(std::fabs(corrQQx)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnCy_pt_odd"), track.pt(), -1.0 * (uy * qyC) / std::sqrt(std::fabs(corrQQy)), wacc * weff); - } - } else { - registry.fill(HIST(Charge[ct]) + HIST("vnA_cent_plusEta"), centrality, (uy * qyA + ux * qxA) / std::sqrt(std::fabs(corrQQ)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnC_cent_plusEta"), centrality, (uy * qyC + ux * qxC) / std::sqrt(std::fabs(corrQQ)), wacc * weff); + if (cfgFillGeneralV1Histos) { + if (track.eta() < 0 && cfgHarm == 1) { + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnA_cent_minEta"), centrality, -1.0 * (uy * qyA + ux * qxA) / std::sqrt(std::fabs(corrQQ)), weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnC_cent_minEta"), centrality, -1.0 * (uy * qyC + ux * qxC) / std::sqrt(std::fabs(corrQQ)), weight); - registry.fill(HIST(Charge[ct]) + HIST("vnA_pt_odd"), track.pt(), (uy * qyA + ux * qxA) / std::sqrt(std::fabs(corrQQ)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnC_pt_odd"), track.pt(), (uy * qyC + ux * qxC) / std::sqrt(std::fabs(corrQQ)), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnA_pt_odd"), track.pt(), centrality, -1.0 * (uy * qyA + ux * qxA) / std::sqrt(std::fabs(corrQQ)), weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnC_pt_odd"), track.pt(), centrality, -1.0 * (uy * qyC + ux * qxC) / std::sqrt(std::fabs(corrQQ)), weight); - if (cfgFillXandYterms) { - registry.fill(HIST(Charge[ct]) + HIST("vnAx_pt_odd"), track.pt(), (ux * qxA) / std::sqrt(std::fabs(corrQQx)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnAy_pt_odd"), track.pt(), (uy * qyA) / std::sqrt(std::fabs(corrQQy)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnCx_pt_odd"), track.pt(), (ux * qxC) / std::sqrt(std::fabs(corrQQx)), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("vnCy_pt_odd"), track.pt(), (uy * qyC) / std::sqrt(std::fabs(corrQQy)), wacc * weff); + if (cfgFillXandYterms) { + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnAx_pt_odd"), track.pt(), centrality, -1.0 * (ux * qxA) / std::sqrt(std::fabs(corrQQx)), weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnAy_pt_odd"), track.pt(), centrality, -1.0 * (uy * qyA) / std::sqrt(std::fabs(corrQQy)), weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnCx_pt_odd"), track.pt(), centrality, -1.0 * (ux * qxC) / std::sqrt(std::fabs(corrQQx)), weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnCy_pt_odd"), track.pt(), centrality, -1.0 * (uy * qyC) / std::sqrt(std::fabs(corrQQy)), weight); + } + } else { + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnA_cent_plusEta"), centrality, (uy * qyA + ux * qxA) / std::sqrt(std::fabs(corrQQ)), weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnC_cent_plusEta"), centrality, (uy * qyC + ux * qxC) / std::sqrt(std::fabs(corrQQ)), weight); + + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnA_pt_odd"), track.pt(), centrality, (uy * qyA + ux * qxA) / std::sqrt(std::fabs(corrQQ)), weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnC_pt_odd"), track.pt(), centrality, (uy * qyC + ux * qxC) / std::sqrt(std::fabs(corrQQ)), weight); + + if (cfgFillXandYterms) { + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnAx_pt_odd"), track.pt(), centrality, (ux * qxA) / std::sqrt(std::fabs(corrQQx)), weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnAy_pt_odd"), track.pt(), centrality, (uy * qyA) / std::sqrt(std::fabs(corrQQy)), weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnCx_pt_odd"), track.pt(), centrality, (ux * qxC) / std::sqrt(std::fabs(corrQQx)), weight); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("vnCy_pt_odd"), track.pt(), centrality, (uy * qyC) / std::sqrt(std::fabs(corrQQy)), weight); + } } } } - template + template inline void fillTrackQA(TrackObject track, double vz, float wacc = 1, float weff = 1) { + if (!cfgFillTrackQA) + return; + static constexpr std::string_view Time[] = {"before/", "after/"}; + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("QA/") + HIST(Time[ft]) + HIST("hPt"), track.pt(), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("QA/") + HIST(Time[ft]) + HIST("hPhi"), track.phi(), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("QA/") + HIST(Time[ft]) + HIST("hEta"), track.eta(), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("QA/") + HIST(Time[ft]) + HIST("hPhi_Eta_vz"), track.phi(), track.eta(), vz, wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("QA/") + HIST(Time[ft]) + HIST("hDCAxy_pt"), track.pt(), track.dcaXY(), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("QA/") + HIST(Time[ft]) + HIST("hDCAz_pt"), track.pt(), track.dcaZ(), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("QA/") + HIST(Time[ft]) + HIST("hSharedClusters_pt"), track.pt(), track.tpcFractionSharedCls(), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("QA/") + HIST(Time[ft]) + HIST("hCrossedRows_pt"), track.pt(), track.tpcNClsFound(), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST(Species[pt]) + HIST("QA/") + HIST(Time[ft]) + HIST("hCrossedRows_vs_SharedClusters"), track.tpcNClsFound(), track.tpcFractionSharedCls(), wacc * weff); + } + + template + inline void fillPIDQA(TrackObject track) + { + if (!cfgFillPIDQA) + return; - registry.fill(HIST(Charge[ct]) + HIST("QA/") + HIST(Time[ft]) + HIST("hPt"), track.pt(), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("QA/") + HIST(Time[ft]) + HIST("hPhi"), track.phi(), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("QA/") + HIST(Time[ft]) + HIST("hEta"), track.eta(), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("QA/") + HIST(Time[ft]) + HIST("hPhi_Eta_vz"), track.phi(), track.eta(), vz, wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("QA/") + HIST(Time[ft]) + HIST("hDCAxy_pt"), track.pt(), track.dcaXY(), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("QA/") + HIST(Time[ft]) + HIST("hDCAz_pt"), track.pt(), track.dcaZ(), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("QA/") + HIST(Time[ft]) + HIST("hSharedClusters_pt"), track.pt(), track.tpcFractionSharedCls(), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("QA/") + HIST(Time[ft]) + HIST("hCrossedRows_pt"), track.pt(), track.tpcNClsFound(), wacc * weff); - registry.fill(HIST(Charge[ct]) + HIST("QA/") + HIST(Time[ft]) + HIST("hCrossedRows_vs_SharedClusters"), track.tpcNClsFound(), track.tpcFractionSharedCls(), wacc * weff); + registry.fill(HIST(Charge[ct]) + HIST("pion/") + HIST("QA/") + HIST(Time[ft]) + HIST("hNsigmaTOF_pt"), track.pt(), track.tofNSigmaPi()); + registry.fill(HIST(Charge[ct]) + HIST("pion/") + HIST("QA/") + HIST(Time[ft]) + HIST("hNsigmaTPC_pt"), track.pt(), track.tpcNSigmaPi()); + registry.fill(HIST(Charge[ct]) + HIST("kaon/") + HIST("QA/") + HIST(Time[ft]) + HIST("hNsigmaTOF_pt"), track.pt(), track.tofNSigmaKa()); + registry.fill(HIST(Charge[ct]) + HIST("kaon/") + HIST("QA/") + HIST(Time[ft]) + HIST("hNsigmaTPC_pt"), track.pt(), track.tpcNSigmaKa()); + registry.fill(HIST(Charge[ct]) + HIST("proton/") + HIST("QA/") + HIST(Time[ft]) + HIST("hNsigmaTOF_pt"), track.pt(), track.tofNSigmaPr()); + registry.fill(HIST(Charge[ct]) + HIST("proton/") + HIST("QA/") + HIST(Time[ft]) + HIST("hNsigmaTPC_pt"), track.pt(), track.tpcNSigmaPr()); + + registry.fill(HIST(Charge[ct]) + HIST("QA/") + HIST(Time[ft]) + HIST("hdEdxTPC_pt"), track.pt(), track.tpcSignal()); + registry.fill(HIST(Charge[ct]) + HIST("QA/") + HIST(Time[ft]) + HIST("hBetaTOF_pt"), track.pt(), track.beta()); } template @@ -1013,6 +1166,20 @@ struct FlowSP { } } + template + void fillAllQA(TrackObject track, double vtxz, bool pos) + { + fillTrackQA(track, vtxz); + fillPIDQA(track); + if (pos) { + fillTrackQA(track, vtxz); + fillPIDQA(track); + } else { + fillTrackQA(track, vtxz); + fillPIDQA(track); + } + } + void processData(UsedCollisions::iterator const& collision, aod::BCsWithTimestamps const&, UsedTracks const& tracks) { registry.fill(HIST("hEventCount"), evSel_FilteredEvent); @@ -1023,9 +1190,11 @@ struct FlowSP { if (bc.runNumber() != cfg.lastRunNumber) { // load corrections again for new run! cfg.correctionsLoaded = false; + cfg.clCentrality = false; cfg.lastRunNumber = bc.runNumber(); } - if (cfgFillQAHistos) + + if (cfgFillQABefore) fillEventQA(collision, tracks); loadCorrections(bc.timestamp()); @@ -1060,8 +1229,16 @@ struct FlowSP { // https://twiki.cern.ch/twiki/pub/ALICE/DirectedFlowAnalysisNote/vn_ZDC_ALICE_INT_NOTE_version02.pdf double psiFull = 1.0 * std::atan2(qyA + qyC, qxA + qxC); - if (cfgFillQAHistos) { + if (cfgFillEventQA) { registry.fill(HIST("QA/hCentFull"), centrality, 1); + registry.fill(HIST("QA/qAqCXY"), centrality, qxA * qxC + qyA * qyC); + registry.fill(HIST("QA/qAXqCY"), centrality, qxA * qyC); + registry.fill(HIST("QA/qAYqCX"), centrality, qyA * qxC); + registry.fill(HIST("QA/qAXYqCXY"), centrality, qyA * qxC + qxA * qyC); + registry.fill(HIST("QA/qAqCX"), centrality, qxA * qxC); + registry.fill(HIST("QA/qAqCY"), centrality, qyA * qyC); + } + if (cfgFillEventPlaneQA) { registry.fill(HIST("QA/hSPplaneA"), psiA, 1); registry.fill(HIST("QA/hSPplaneC"), psiC, 1); registry.fill(HIST("QA/hSPplaneFull"), psiFull, 1); @@ -1070,12 +1247,6 @@ struct FlowSP { registry.fill(HIST("QA/hSinPhiACosPhiC"), centrality, std::sin(psiA) * std::cos(psiC)); registry.fill(HIST("QA/hCosPhiASinsPhiC"), centrality, std::cos(psiA) * std::sin(psiC)); registry.fill(HIST("QA/hFullEvPlaneRes"), centrality, -1 * std::cos(psiA - psiC)); - registry.fill(HIST("QA/qAqCXY"), centrality, qxA * qxC + qyA * qyC); - registry.fill(HIST("QA/qAXqCY"), centrality, qxA * qyC); - registry.fill(HIST("QA/qAYqCX"), centrality, qyA * qxC); - registry.fill(HIST("QA/qAXYqCXY"), centrality, qyA * qxC + qxA * qyC); - registry.fill(HIST("QA/qAqCX"), centrality, qxA * qxC); - registry.fill(HIST("QA/qAqCY"), centrality, qyA * qyC); } if (centrality > cfgCentMax || centrality < cfgCentMin) @@ -1083,14 +1254,10 @@ struct FlowSP { registry.fill(HIST("hEventCount"), evSel_CentCuts); - if (cfgFillQAHistos) - fillEventQA(collision, tracks); - - double corrQQ = 1., corrQQx = 1., corrQQy = 1.; - // Load correlations and SP resolution needed for Scalar Product and event plane methods. // Only load once! // If not loaded set to 1 + double corrQQ = 1., corrQQx = 1., corrQQy = 1.; if (cfgCCDBdir_QQ.value.empty() == false) { if (!cfg.clQQ) { TList* hcorrList = ccdb->getForTimeStamp(cfgCCDBdir_QQ.value, bc.timestamp()); @@ -1116,11 +1283,25 @@ struct FlowSP { evPlaneRes = std::sqrt(evPlaneRes); } + double centWeight = 1.0; + if (cfgCCDBdir_centrality.value.empty() == false) { + if (!cfg.clCentrality) { + cfg.hCentrality = ccdb->getForTimeStamp(cfgCCDBdir_centrality.value, bc.timestamp()); + cfg.clCentrality = true; + } + centWeight = cfg.hCentrality->GetBinContent(cfg.hCentrality->FindBin(centrality)); + if (centWeight < 0) + LOGF(fatal, "Centrality weight cannot be negative.. abort for (%.2f)", centrality); + } + + fillEventQA(collision, tracks, centWeight); + for (const auto& track : tracks) { - if (cfgFillQAHistos) - registry.fill(HIST("QA/before/hPt_inclusive"), track.pt()); - // registry.fill(HIST("hTrackCount"), trackSel_FilteredTracks); + int trackPID = (cfgFillPID || cfgFillPIDQA) ? getTrackPID(track) : kUnidentified; + + if (cfgFillPIDQA) + registry.fill(HIST("hPIDcounts"), trackPID, track.pt()); float weff = 1., wacc = 1.; float weffP = 1., waccP = 1.; @@ -1132,18 +1313,41 @@ struct FlowSP { registry.fill(HIST("hTrackCount"), trackSel_ZeroCharge); bool pos = (track.sign() > 0) ? true : false; - // Fill QA histograms before track selection - if (cfgFillQAHistos) { - fillTrackQA(track, vtxz); - if (pos) - fillTrackQA(track, vtxz); - else - fillTrackQA(track, vtxz); + if (cfgFillQABefore) { + switch (trackPID) { + case kUnidentified: + fillAllQA(track, vtxz, pos); + break; + case kPion: + fillAllQA(track, vtxz, pos); + break; + case kKaon: + fillAllQA(track, vtxz, pos); + break; + case kProton: + fillAllQA(track, vtxz, pos); + break; + } } if (!trackSelected(track, field)) continue; + switch (trackPID) { + case kUnidentified: + fillAllQA(track, vtxz, pos); + break; + case kPion: + fillAllQA(track, vtxz, pos); + break; + case kKaon: + fillAllQA(track, vtxz, pos); + break; + case kProton: + fillAllQA(track, vtxz, pos); + break; + } + // Fill NUA weights if (cfgFillWeights) { fWeights->fill(track.phi(), track.eta(), vtxz, track.pt(), centrality, 0); @@ -1167,10 +1371,7 @@ struct FlowSP { registry.fill(HIST("hTrackCount"), trackSel_ParticleWeights); - if (cfgFillQAHistos) - registry.fill(HIST("QA/after/hPt_inclusive"), track.pt(), wacc * weff); - - // // constrain angle to 0 -> [0,0+2pi] + // constrain angle to 0 -> [0,0+2pi] auto phi = RecoDecay::constrainAngle(track.phi(), 0); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1188,20 +1389,16 @@ struct FlowSP { double vnC = std::cos(cfgHarm * (phi - psiC)) / evPlaneRes; double vnFull = std::cos(cfgHarm * (phi - psiFull)) / evPlaneRes; - fillHistograms(track, wacc, weff, ux, uy, uxMH, uyMH, uxMH2, uyMH2, qxA, qyA, qxC, qyC, corrQQx, corrQQy, corrQQ, vnA, vnC, vnFull, centrality); - - if (cfgFillQAHistos) - fillTrackQA(track, vtxz, wacc, weff); + fillHistograms(track, wacc, weff, centWeight, ux, uy, uxMH, uyMH, uxMH2, uyMH2, qxA, qyA, qxC, qyC, corrQQx, corrQQy, corrQQ, vnA, vnC, vnFull, centrality); + fillTrackQA(track, vtxz, wacc, weff); if (cfgFillChargeDependence) { if (pos) { - fillHistograms(track, wacc, weff, ux, uy, uxMH, uyMH, uxMH2, uyMH2, qxA, qyA, qxC, qyC, corrQQx, corrQQy, corrQQ, vnA, vnC, vnFull, centrality); - if (cfgFillQAHistos) - fillTrackQA(track, vtxz, waccP, weffP); + fillHistograms(track, waccP, weffP, centWeight, ux, uy, uxMH, uyMH, uxMH2, uyMH2, qxA, qyA, qxC, qyC, corrQQx, corrQQy, corrQQ, vnA, vnC, vnFull, centrality); + fillTrackQA(track, vtxz, waccP, weffP); } else { - fillHistograms(track, wacc, weff, ux, uy, uxMH, uyMH, uxMH2, uyMH2, qxA, qyA, qxC, qyC, corrQQx, corrQQy, corrQQ, vnA, vnC, vnFull, centrality); - if (cfgFillQAHistos) - fillTrackQA(track, vtxz, waccN, weffN); + fillHistograms(track, waccN, weffN, centWeight, ux, uy, uxMH, uyMH, uxMH2, uyMH2, qxA, qyA, qxC, qyC, corrQQx, corrQQy, corrQQ, vnA, vnC, vnFull, centrality); + fillTrackQA(track, vtxz, waccN, weffN); } } } // end of track loop @@ -1227,7 +1424,7 @@ struct FlowSP { if (cfgCentNGlobal) centrality = collision.centNGlobal(); - if (cfgFillQAHistos) + if (cfgFillQABefore) fillEventQA(collision, tracks); if (!eventSelected(collision, filteredTracks.size())) @@ -1243,8 +1440,7 @@ struct FlowSP { return; } - if (cfgFillQAHistos) - fillEventQA(collision, tracks); + fillEventQA(collision, tracks); // LOGF(info, "Size of tracks: %i", tracks.size()); registry.fill(HIST("trackMCReco/hTrackSize_unFiltered"), tracks.size()); @@ -1258,16 +1454,14 @@ struct FlowSP { fillMCPtHistos(track, mcParticle.pdgCode()); - if (cfgFillQAHistos) - fillTrackQA(track, vtxz); + fillTrackQA(track, vtxz); if (!trackSelected(track, field)) continue; fillMCPtHistos(track, mcParticle.pdgCode()); - if (cfgFillQAHistos) - fillTrackQA(track, vtxz); + fillTrackQA(track, vtxz); } // end of track loop } @@ -1308,8 +1502,7 @@ struct FlowSP { if (cfgCentNGlobal) centrality = col.centNGlobal(); - if (cfgFillQAHistos) - fillEventQA(col, trackSlice); + fillEventQA(col, trackSlice); if (trackSlice.size() < 1) { colSelected = false; @@ -1326,56 +1519,55 @@ struct FlowSP { } registry.fill(HIST("hEventCount"), evSel_CentCuts); - if (cfgFillQAHistos) - fillEventQA(col, trackSlice); + fillEventQA(col, trackSlice); } // leave reconstructed collision loop - if (!colSelected) - continue; + if (!colSelected) + continue; - float vtxz = mcCollision.posZ(); + float vtxz = mcCollision.posZ(); - for (const auto& particle : partSlice) { - if (!particle.isPhysicalPrimary()) - continue; + for (const auto& particle : partSlice) { + if (!particle.isPhysicalPrimary()) + continue; - int charge = 0; + int charge = 0; - auto pdgCode = particle.pdgCode(); - auto pdgInfo = pdg->GetParticle(pdgCode); - if (pdgInfo != nullptr) { - charge = pdgInfo->Charge(); - } + auto pdgCode = particle.pdgCode(); + auto pdgInfo = pdg->GetParticle(pdgCode); + if (pdgInfo != nullptr) { + charge = pdgInfo->Charge(); + } - if (std::fabs(charge) < 1) - continue; + if (std::fabs(charge) < 1) + continue; - bool pos = (charge > 0) ? true : false; + bool pos = (charge > 0) ? true : false; - fillMCPtHistos(particle, pdgCode); + fillMCPtHistos(particle, pdgCode); - registry.fill(HIST("trackMCGen/before/incl/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); + registry.fill(HIST("trackMCGen/before/incl/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); - if (pos) { - registry.fill(HIST("trackMCGen/before/pos/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); - } else { - registry.fill(HIST("trackMCGen/before/neg/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); - } + if (pos) { + registry.fill(HIST("trackMCGen/before/pos/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); + } else { + registry.fill(HIST("trackMCGen/before/neg/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); + } - if (particle.eta() < -cfgTrackSelsEta || particle.eta() > cfgTrackSelsEta || particle.pt() < cfgTrackSelsPtmin || particle.pt() > cfgTrackSelsPtmax) - continue; + if (particle.eta() < -cfgTrackSelsEta || particle.eta() > cfgTrackSelsEta || particle.pt() < cfgTrackSelsPtmin || particle.pt() > cfgTrackSelsPtmax) + continue; - fillMCPtHistos(particle, pdgCode); + fillMCPtHistos(particle, pdgCode); - registry.fill(HIST("trackMCGen/after/incl/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); + registry.fill(HIST("trackMCGen/after/incl/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); - if (pos) { - registry.fill(HIST("trackMCGen/after/pos/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); - } else { - registry.fill(HIST("trackMCGen/after/neg/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); - } + if (pos) { + registry.fill(HIST("trackMCGen/after/pos/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); + } else { + registry.fill(HIST("trackMCGen/after/neg/phi_eta_vtxZ_gen"), particle.phi(), particle.eta(), vtxz); } + } } } PROCESS_SWITCH(FlowSP, processMCGen, "Process analysis for MC generated events", false); From 57eb8628a32ec9f01d0611b75300c4a8b835ddd6 Mon Sep 17 00:00:00 2001 From: Yash Patley <52608802+yashpatley@users.noreply.github.com> Date: Tue, 27 May 2025 01:20:13 +0530 Subject: [PATCH 1420/1650] [PWGCF] Update lambdaR2Correlation.cxx (#11352) --- .../Tasks/lambdaR2Correlation.cxx | 293 +++++++++++------- 1 file changed, 189 insertions(+), 104 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx index e2778112fa8..1e212aacf95 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx @@ -34,6 +34,7 @@ using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::constants::physics; using namespace o2::constants::math; +// using namespace o2::ml; namespace o2::aod { @@ -74,6 +75,12 @@ DECLARE_SOA_COLUMN(NegTrackId, negTrackId, int64_t); DECLARE_SOA_COLUMN(V0Type, v0Type, int8_t); DECLARE_SOA_COLUMN(CosPA, cosPA, float); DECLARE_SOA_COLUMN(DcaDau, dcaDau, float); +DECLARE_SOA_COLUMN(DcaPion, dcaPion, float); +DECLARE_SOA_COLUMN(DcaProton, dcaProton, float); +DECLARE_SOA_COLUMN(DcaLambda, dcaLambda, float); +DECLARE_SOA_COLUMN(DecayLength, decayLength, float); +DECLARE_SOA_COLUMN(RXY, rXY, float); +DECLARE_SOA_COLUMN(V0PrmScd, v0PrmScd, int8_t); DECLARE_SOA_COLUMN(CorrFact, corrFact, float); } // namespace lambdatrack DECLARE_SOA_TABLE(LambdaTracks, "AOD", "LAMBDATRACKS", o2::soa::Index<>, @@ -91,6 +98,12 @@ DECLARE_SOA_TABLE(LambdaTracks, "AOD", "LAMBDATRACKS", o2::soa::Index<>, lambdatrack::V0Type, lambdatrack::CosPA, lambdatrack::DcaDau, + lambdatrack::DcaPion, + lambdatrack::DcaProton, + lambdatrack::DcaLambda, + lambdatrack::DecayLength, + lambdatrack::RXY, + lambdatrack::V0PrmScd, lambdatrack::CorrFact); using LambdaTrack = LambdaTracks::iterator; @@ -126,6 +139,7 @@ DECLARE_SOA_TABLE(LambdaMcGenTracks, "AOD", "LMCGENTRACKS", o2::soa::Index<>, lambdatrack::V0Type, lambdatrack::CosPA, lambdatrack::DcaDau, + lambdatrack::V0PrmScd, lambdatrack::CorrFact); using LambdaMcGenTrack = LambdaMcGenTracks::iterator; @@ -205,6 +219,18 @@ enum CorrHistDim { ThreeDimCorr }; +enum PrmScdType { + kPrimary = 0, + kSecondary +}; + +enum PrmScdPairType { + kPP = 0, + kPS, + kSP, + kSS +}; + struct LambdaTableProducer { Produces lambdaCollisionTable; @@ -266,9 +292,7 @@ struct LambdaTableProducer { // V0s MC Configurable cHasMcFlag{"cHasMcFlag", true, "Has Mc Tag"}; Configurable cSelectTrueLambda{"cSelectTrueLambda", true, "Select True Lambda"}; - Configurable cSelectPrimaryV0{"cSelectPrimaryV0", true, "Select Primary V0"}; - Configurable cRecPrimaryLambda{"cRecPrimaryLambda", true, "Primary Reconstructed Lambda"}; - Configurable cRecSecondaryLambda{"cRecSecondaryLambda", false, "Secondary Reconstructed Lambda"}; + Configurable cSelMCPSV0{"cSelMCPSV0", true, "Select Primary/Secondary V0"}; Configurable cCheckRecoDauFlag{"cCheckRecoDauFlag", true, "Check for reco daughter PID"}; Configurable cGenPrimaryLambda{"cGenPrimaryLambda", true, "Primary Generated Lambda"}; Configurable cGenSecondaryLambda{"cGenSecondaryLambda", false, "Secondary Generated Lambda"}; @@ -312,6 +336,7 @@ struct LambdaTableProducer { // Initialize Global Variables float cent = 0.; + bool bSecondaryLambdaFlag = false; void init(InitContext const&) { @@ -319,6 +344,9 @@ struct LambdaTableProducer { ccdb->setURL(cUrlCCDB.value); ccdb->setCaching(true); + // Set ONNX Model + // network.initModel(cMLModelPathCCDB.value, true) + // initialize axis specifications const AxisSpec axisCols(5, 0.5, 5.5, ""); const AxisSpec axisTrks(30, 0.5, 30.5, ""); @@ -739,20 +767,19 @@ struct LambdaTableProducer { } template - bool selPrimaryV0(V const& v0) + PrmScdType isPrimaryV0(V const& v0) { auto mcpart = v0.template mcParticle_as(); - // check for primary/secondary lambda - if (cRecPrimaryLambda && !mcpart.isPhysicalPrimary()) { + // check for secondary lambda + if (!mcpart.isPhysicalPrimary()) { histos.fill(HIST("Tracks/h1f_tracks_info"), kNotPrimaryLambda); - return false; - } else if (cRecSecondaryLambda && mcpart.isPhysicalPrimary()) { - histos.fill(HIST("Tracks/h1f_tracks_info"), kNotSecondaryLambda); - return false; + bSecondaryLambdaFlag = true; + return kSecondary; } - return true; + histos.fill(HIST("Tracks/h1f_tracks_info"), kNotSecondaryLambda); + return kPrimary; } template @@ -793,7 +820,7 @@ struct LambdaTableProducer { } // get information about secondary lambdas - if (cRecSecondaryLambda) { + if (bSecondaryLambdaFlag) { auto lambdaMothers = mcpart.template mothers_as(); if (std::abs(lambdaMothers[0].pdgCode()) == kSigmaMinus || std::abs(lambdaMothers[0].pdgCode()) == kSigma0 || std::abs(lambdaMothers[0].pdgCode()) == kSigmaPlus) { histos.fill(HIST("Tracks/h2f_lambda_from_sigma"), mcpart.pdgCode(), mcpart.pt()); @@ -882,7 +909,6 @@ struct LambdaTableProducer { LOGF(warning, "CCDB OBJECT IS NOT A HISTOGRAM !!!"); effFact = 1.; } - delete objEff; delete histEff; } @@ -905,7 +931,6 @@ struct LambdaTableProducer { LOGF(warning, "CCDB OBJECT IS NOT A HISTOGRAM !!!"); primFrac = 1.; } - delete objPrm; delete histPrm; } @@ -1008,7 +1033,9 @@ struct LambdaTableProducer { // initialize v0track objects ParticleType v0Type = kLambda; - float mass = 0., corr_fact = 1.; + PrmScdType v0PrmScdType = kPrimary; + float mass = 0., ctau = 0., corr_fact = 1.; + float dcapiontopv = 0., dcaprotontopv = 0.; for (auto const& v0 : v0tracks) { // check for corresponding MCGen Particle @@ -1032,14 +1059,30 @@ struct LambdaTableProducer { continue; } + // Get Lambda DcaDauToPV, decay length and mass + if (v0Type == kLambda) { + dcapiontopv = v0.dcanegtopv(); + dcaprotontopv = v0.dcapostopv(); + } else { + dcapiontopv = v0.dcapostopv(); + dcaprotontopv = v0.dcanegtopv(); + } + ctau = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * MassLambda0; + mass = (v0Type == kLambda) ? v0.mLambda() : v0.mAntiLambda(); + + // Machine-Learning Model (To be implemented in future...) + // std::vector modelInput = {v0.pt(), v0.yLambda(), v0.phi(), mass, v0.v0cosPA(), v0.dcaV0daughters(), dcapiontopv, dcaprotontopv, v0.dcav0topv(), ctau, v0.v0radius()} + // float* modelOutput = network.evalModel(modelInput); + histos.fill(HIST("Tracks/h1f_tracks_info"), kAllSelPassed); // we have v0 as lambda // do MC analysis if constexpr (dmc == kMC) { histos.fill(HIST("Tracks/h2f_tracks_pid_before_sel"), v0.mcParticle().pdgCode(), v0.pt()); - if (cSelectPrimaryV0 && !selPrimaryV0(v0)) { // check for Primary V0 - continue; + + if (cSelMCPSV0) { // Get Primary/Secondary Lambda + v0PrmScdType = isPrimaryV0(v0); } if (cSelectTrueLambda && !selTrueMcRecLambda(v0, tracks)) { // check for true Lambda/Anti-Lambda continue; @@ -1047,21 +1090,22 @@ struct LambdaTableProducer { if (cDoTrackMcMatching && !passMcMatching(v0)) { // Do Mc Matching continue; } + // Fill MC Matching Histos (MC Matching Cuts to be implemented soon...) if (v0Type == kLambda) { fillMCMatchingHistos(v0); } else { fillMCMatchingHistos(v0); } + histos.fill(HIST("Tracks/h1f_tracks_info"), kPassTrueLambdaSel); histos.fill(HIST("Tracks/h2f_tracks_pid_after_sel"), v0.mcParticle().pdgCode(), v0.pt()); } histos.fill(HIST("Tracks/h2f_armpod_after_sel"), v0.alpha(), v0.qtarm()); - // get correction factors and mass + // get correction factors corr_fact = (v0Type == kLambda) ? getCorrectionFactors(v0) : getCorrectionFactors(v0); - mass = (v0Type == kLambda) ? v0.mLambda() : v0.mAntiLambda(); // fill lambda qa if (v0Type == kLambda) { @@ -1078,7 +1122,8 @@ struct LambdaTableProducer { lambdaTrackTable(lambdaCollisionTable.lastIndex(), v0.px(), v0.py(), v0.pz(), v0.pt(), v0.eta(), v0.phi(), v0.yLambda(), mass, v0.template posTrack_as().index(), v0.template negTrack_as().index(), - (int8_t)v0Type, v0.v0cosPA(), v0.dcaV0daughters(), corr_fact); + (int8_t)v0Type, v0.v0cosPA(), v0.dcaV0daughters(), dcapiontopv, dcaprotontopv, v0.dcav0topv(), ctau, + v0.v0radius(), v0PrmScdType, corr_fact); } } @@ -1091,6 +1136,7 @@ struct LambdaTableProducer { // initialize track objects ParticleType v0Type = kLambda; + PrmScdType v0PrmScdType = kPrimary; float rap = 0.; for (auto const& mcpart : mcParticles) { @@ -1104,10 +1150,10 @@ struct LambdaTableProducer { } // check for Primary Lambda/AntiLambda - if (cGenPrimaryLambda && !mcpart.isPhysicalPrimary()) { - continue; - } else if (cGenSecondaryLambda && mcpart.isPhysicalPrimary()) { - continue; + if (mcpart.isPhysicalPrimary()) { + v0PrmScdType = kPrimary; + } else { + v0PrmScdType = kSecondary; } // Decide Eta/Rap @@ -1185,7 +1231,7 @@ struct LambdaTableProducer { // Fill Lambda McGen Table lambdaMCGenTrackTable(lambdaMCGenCollisionTable.lastIndex(), mcpart.px(), mcpart.py(), mcpart.pz(), mcpart.pt(), mcpart.eta(), mcpart.phi(), mcpart.y(), RecoDecay::m(mcpart.p(), mcpart.e()), - daughterIDs[0], daughterIDs[1], (int8_t)v0Type, -999., -999., 1.); + daughterIDs[0], daughterIDs[1], (int8_t)v0Type, -999., -999., v0PrmScdType, 1.); } } @@ -1497,57 +1543,65 @@ struct LambdaR2Correlation { // Efficiency Histograms // Single Particle Efficiencies - histos.add("Reco/Efficiency/h1f_n1_pt_LaP", "#rho_{1}^{#Lambda}", kTH1F, {axisEfPt}); - histos.add("Reco/Efficiency/h1f_n1_pt_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH1F, {axisEfPt}); - histos.add("Reco/Efficiency/h3f_n1_ptetaphi_LaP", "#rho_{1}^{#Lambda}", kTH3F, {axisEfPt, axisEfEta, axisEfPhi}); - histos.add("Reco/Efficiency/h3f_n1_ptetaphi_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH3F, {axisEfPt, axisEfEta, axisEfPhi}); - histos.add("Reco/Efficiency/h3f_n1_ptrapphi_LaP", "#rho_{1}^{#Lambda}", kTH3F, {axisEfPt, axisEfRap, axisEfPhi}); - histos.add("Reco/Efficiency/h3f_n1_ptrapphi_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH3F, {axisEfPt, axisEfRap, axisEfPhi}); + histos.add("Reco/Primary/Efficiency/h1f_n1_pt_LaP", "#rho_{1}^{#Lambda}", kTH1F, {axisEfPt}); + histos.add("Reco/Primary/Efficiency/h1f_n1_pt_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH1F, {axisEfPt}); + histos.add("Reco/Primary/Efficiency/h3f_n1_ptetaphi_LaP", "#rho_{1}^{#Lambda}", kTH3F, {axisEfPt, axisEfEta, axisEfPhi}); + histos.add("Reco/Primary/Efficiency/h3f_n1_ptetaphi_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH3F, {axisEfPt, axisEfEta, axisEfPhi}); + histos.add("Reco/Primary/Efficiency/h3f_n1_ptrapphi_LaP", "#rho_{1}^{#Lambda}", kTH3F, {axisEfPt, axisEfRap, axisEfPhi}); + histos.add("Reco/Primary/Efficiency/h3f_n1_ptrapphi_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH3F, {axisEfPt, axisEfRap, axisEfPhi}); // Single and Two Particle Densities // 1D Histograms - histos.add("Reco/h1d_n1_mass_LaP", "#rho_{1}^{#Lambda}", kTH1D, {axisMass}); - histos.add("Reco/h1d_n1_mass_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH1D, {axisMass}); - histos.add("Reco/h1d_n1_pt_LaP", "#rho_{1}^{#Lambda}", kTH1D, {axisPt}); - histos.add("Reco/h1d_n1_pt_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH1D, {axisPt}); - histos.add("Reco/h1d_n1_eta_LaP", "#rho_{1}^{#Lambda}", kTH1D, {axisEta}); - histos.add("Reco/h1d_n1_eta_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH1D, {axisEta}); - histos.add("Reco/h1d_n1_rap_LaP", "#rho_{1}^{#Lambda}", kTH1D, {axisRap}); - histos.add("Reco/h1d_n1_rap_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH1D, {axisRap}); - histos.add("Reco/h1d_n1_phi_LaP", "#rho_{1}^{#Lambda}", kTH1D, {axisPhi}); - histos.add("Reco/h1d_n1_phi_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH1D, {axisPhi}); + histos.add("Reco/Primary/h1d_n1_mass_LaP", "#rho_{1}^{#Lambda}", kTH1D, {axisMass}); + histos.add("Reco/Primary/h1d_n1_mass_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH1D, {axisMass}); + histos.add("Reco/Primary/h1d_n1_pt_LaP", "#rho_{1}^{#Lambda}", kTH1D, {axisPt}); + histos.add("Reco/Primary/h1d_n1_pt_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH1D, {axisPt}); + histos.add("Reco/Primary/h1d_n1_eta_LaP", "#rho_{1}^{#Lambda}", kTH1D, {axisEta}); + histos.add("Reco/Primary/h1d_n1_eta_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH1D, {axisEta}); + histos.add("Reco/Primary/h1d_n1_rap_LaP", "#rho_{1}^{#Lambda}", kTH1D, {axisRap}); + histos.add("Reco/Primary/h1d_n1_rap_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH1D, {axisRap}); + histos.add("Reco/Primary/h1d_n1_phi_LaP", "#rho_{1}^{#Lambda}", kTH1D, {axisPhi}); + histos.add("Reco/Primary/h1d_n1_phi_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH1D, {axisPhi}); // rho1 for R2 RapPhi - histos.add("Reco/h2d_n1_rapphi_LaP", "#rho_{1}^{#Lambda}", kTH2D, {axisRap, axisPhi}); - histos.add("Reco/h2d_n1_rapphi_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH2D, {axisRap, axisPhi}); + histos.add("Reco/Primary/h2d_n1_rapphi_LaP", "#rho_{1}^{#Lambda}", kTH2D, {axisRap, axisPhi}); + histos.add("Reco/Primary/h2d_n1_rapphi_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH2D, {axisRap, axisPhi}); // rho1 for Q_{inv} - histos.add("Reco/h2d_n1_pteta_LaP", "#rho_{1}^{#Lambda}", kTH2D, {axisPt, axisEta}); - histos.add("Reco/h2d_n1_pteta_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH2D, {axisPt, axisEta}); + histos.add("Reco/Primary/h2d_n1_pteta_LaP", "#rho_{1}^{#Lambda}", kTH2D, {axisPt, axisEta}); + histos.add("Reco/Primary/h2d_n1_pteta_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH2D, {axisPt, axisEta}); + + // Clone Singles Histogram + histos.addClone("Reco/Primary/", "Reco/Secondary/"); // rho2 for numerator of R2 - histos.add("Reco/h2d_n2_ptpt_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisPt, axisPt}); - histos.add("Reco/h2d_n2_ptpt_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisPt, axisPt}); - histos.add("Reco/h2d_n2_ptpt_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisPt, axisPt}); - histos.add("Reco/h2d_n2_etaeta_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisEta, axisEta}); - histos.add("Reco/h2d_n2_etaeta_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisEta, axisEta}); - histos.add("Reco/h2d_n2_etaeta_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisEta, axisEta}); - histos.add("Reco/h2d_n2_raprap_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisRap, axisRap}); - histos.add("Reco/h2d_n2_raprap_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisRap, axisRap}); - histos.add("Reco/h2d_n2_raprap_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisRap, axisRap}); - histos.add("Reco/h2d_n2_phiphi_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisPhi, axisPhi}); - histos.add("Reco/h2d_n2_phiphi_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisPhi, axisPhi}); - histos.add("Reco/h2d_n2_phiphi_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisPhi, axisPhi}); + histos.add("Reco/PP/h2d_n2_ptpt_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisPt, axisPt}); + histos.add("Reco/PP/h2d_n2_ptpt_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisPt, axisPt}); + histos.add("Reco/PP/h2d_n2_ptpt_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisPt, axisPt}); + histos.add("Reco/PP/h2d_n2_etaeta_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisEta, axisEta}); + histos.add("Reco/PP/h2d_n2_etaeta_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisEta, axisEta}); + histos.add("Reco/PP/h2d_n2_etaeta_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisEta, axisEta}); + histos.add("Reco/PP/h2d_n2_raprap_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisRap, axisRap}); + histos.add("Reco/PP/h2d_n2_raprap_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisRap, axisRap}); + histos.add("Reco/PP/h2d_n2_raprap_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisRap, axisRap}); + histos.add("Reco/PP/h2d_n2_phiphi_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisPhi, axisPhi}); + histos.add("Reco/PP/h2d_n2_phiphi_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisPhi, axisPhi}); + histos.add("Reco/PP/h2d_n2_phiphi_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisPhi, axisPhi}); // rho2 for R2 Rap1Phi1Rap2Phi2 - histos.add("Reco/h2d_n2_rapphi_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisRapPhi, axisRapPhi}); - histos.add("Reco/h2d_n2_rapphi_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisRapPhi, axisRapPhi}); - histos.add("Reco/h2d_n2_rapphi_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisRapPhi, axisRapPhi}); + histos.add("Reco/PP/h2d_n2_rapphi_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisRapPhi, axisRapPhi}); + histos.add("Reco/PP/h2d_n2_rapphi_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisRapPhi, axisRapPhi}); + histos.add("Reco/PP/h2d_n2_rapphi_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisRapPhi, axisRapPhi}); // rho2 for R2 Qinv - histos.add("Reco/h1d_n2_qinv_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH1D, {axisQinv}); - histos.add("Reco/h1d_n2_qinv_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH1D, {axisQinv}); - histos.add("Reco/h1d_n2_qinv_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH1D, {axisQinv}); + histos.add("Reco/PP/h1d_n2_qinv_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH1D, {axisQinv}); + histos.add("Reco/PP/h1d_n2_qinv_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH1D, {axisQinv}); + histos.add("Reco/PP/h1d_n2_qinv_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH1D, {axisQinv}); + + // Clone Pairs Histograms + histos.addClone("Reco/PP/", "Reco/PS/"); + histos.addClone("Reco/PP/", "Reco/SP/"); + histos.addClone("Reco/PP/", "Reco/SS/"); // MCGen if (doprocessMCGen) { @@ -1556,10 +1610,11 @@ struct LambdaR2Correlation { } } - template + template void fillPairHistos(U& p1, U& p2) { static constexpr std::string_view SubDirRecGen[] = {"Reco/", "McGen/"}; + static constexpr std::string_view SubDirPrmScd[] = {"PP/", "PS/", "SP/", "SS/"}; static constexpr std::string_view SubDirHist[] = {"LaP_LaM", "LaP_LaP", "LaM_LaM"}; float rap1 = (cDoEtaAnalysis) ? p1.eta() : p1.rap(); @@ -1574,30 +1629,31 @@ struct LambdaR2Correlation { float corfac = p1.corrFact() * p2.corrFact(); // fill rho2 histograms - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n2_ptpt_") + HIST(SubDirHist[part_pair]), p1.pt(), p2.pt(), corfac); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n2_etaeta_") + HIST(SubDirHist[part_pair]), p1.eta(), p2.eta(), corfac); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n2_raprap_") + HIST(SubDirHist[part_pair]), p1.rap(), p2.rap(), corfac); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n2_phiphi_") + HIST(SubDirHist[part_pair]), p1.phi(), p2.phi(), corfac); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[psp]) + HIST("h2d_n2_ptpt_") + HIST(SubDirHist[part_pair]), p1.pt(), p2.pt(), corfac); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[psp]) + HIST("h2d_n2_etaeta_") + HIST(SubDirHist[part_pair]), p1.eta(), p2.eta(), corfac); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[psp]) + HIST("h2d_n2_raprap_") + HIST(SubDirHist[part_pair]), p1.rap(), p2.rap(), corfac); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[psp]) + HIST("h2d_n2_phiphi_") + HIST(SubDirHist[part_pair]), p1.phi(), p2.phi(), corfac); if (rapbin1 >= 0 && rapbin2 >= 0 && phibin1 >= 0 && phibin2 >= 0 && rapbin1 < nrapbins && rapbin2 < nrapbins && phibin1 < nphibins && phibin2 < nphibins) { int rapphix = rapbin1 * nphibins + phibin1; int rapphiy = rapbin2 * nphibins + phibin2; - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n2_rapphi_") + HIST(SubDirHist[part_pair]), rapphix + 0.5, rapphiy + 0.5, corfac); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[psp]) + HIST("h2d_n2_rapphi_") + HIST(SubDirHist[part_pair]), rapphix + 0.5, rapphiy + 0.5, corfac); } // qinv histograms q = RecoDecay::p((p1.px() - p2.px()), (p1.py() - p2.py()), (p1.pz() - p2.pz())); e = RecoDecay::e(p1.px(), p1.py(), p1.pz(), MassLambda0) - RecoDecay::e(p2.px(), p2.py(), p2.pz(), MassLambda0); qinv = std::sqrt(-RecoDecay::m2(q, e)); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h1d_n2_qinv_") + HIST(SubDirHist[part_pair]), qinv, corfac); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[psp]) + HIST("h1d_n2_qinv_") + HIST(SubDirHist[part_pair]), qinv, corfac); } - template + template void analyzeSingles(T const& tracks) { static constexpr std::string_view SubDirRecGen[] = {"Reco/", "McGen/"}; + static constexpr std::string_view SubDirPrmScd[] = {"Primary/", "Secondary/"}; static constexpr std::string_view SubDirHist[] = {"LaP", "LaM"}; int ntrk = 0; @@ -1607,22 +1663,22 @@ struct LambdaR2Correlation { ++ntrk; // Efficiency Plots - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("Efficiency/h1f_n1_pt_") + HIST(SubDirHist[part]), track.pt()); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("Efficiency/h3f_n1_ptetaphi_") + HIST(SubDirHist[part]), track.pt(), track.eta(), track.phi()); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("Efficiency/h3f_n1_ptrapphi_") + HIST(SubDirHist[part]), track.pt(), track.rap(), track.phi()); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("Efficiency/h1f_n1_pt_") + HIST(SubDirHist[part]), track.pt()); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("Efficiency/h3f_n1_ptetaphi_") + HIST(SubDirHist[part]), track.pt(), track.eta(), track.phi()); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("Efficiency/h3f_n1_ptrapphi_") + HIST(SubDirHist[part]), track.pt(), track.rap(), track.phi()); // QA Plots - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h1d_n1_mass_") + HIST(SubDirHist[part]), track.mass()); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h1d_n1_pt_") + HIST(SubDirHist[part]), track.pt(), track.corrFact()); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h1d_n1_eta_") + HIST(SubDirHist[part]), track.eta(), track.corrFact()); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h1d_n1_phi_") + HIST(SubDirHist[part]), track.phi(), track.corrFact()); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h1d_n1_rap_") + HIST(SubDirHist[part]), track.rap(), track.corrFact()); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("h1d_n1_mass_") + HIST(SubDirHist[part]), track.mass()); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("h1d_n1_pt_") + HIST(SubDirHist[part]), track.pt(), track.corrFact()); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("h1d_n1_eta_") + HIST(SubDirHist[part]), track.eta(), track.corrFact()); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("h1d_n1_phi_") + HIST(SubDirHist[part]), track.phi(), track.corrFact()); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("h1d_n1_rap_") + HIST(SubDirHist[part]), track.rap(), track.corrFact()); // Rho1 for N1RapPhi - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n1_rapphi_") + HIST(SubDirHist[part]), track.rap(), track.phi(), track.corrFact()); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("h2d_n1_rapphi_") + HIST(SubDirHist[part]), track.rap(), track.phi(), track.corrFact()); // Rho1 for Q_{inv} Bkg Estimation - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST("h2d_n1_pteta_") + HIST(SubDirHist[part]), track.pt(), track.eta(), track.corrFact()); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("h2d_n1_pteta_") + HIST(SubDirHist[part]), track.pt(), track.eta(), track.corrFact()); } // fill multiplicity histograms @@ -1635,7 +1691,7 @@ struct LambdaR2Correlation { } } - template + template void analyzePairs(T const& trks_1, T const& trks_2) { for (auto const& trk_1 : trks_1) { @@ -1644,7 +1700,7 @@ struct LambdaR2Correlation { if (samelambda && ((trk_1.index() == trk_2.index()))) { continue; } - fillPairHistos(trk_1, trk_2); + fillPairHistos(trk_1, trk_2); } } } @@ -1653,22 +1709,37 @@ struct LambdaR2Correlation { using LambdaTracks = soa::Join; SliceCache cache; - Partition partLambdaTracks = (aod::lambdatrack::v0Type == (int8_t)kLambda) && (aod::lambdatrackext::trueLambdaFlag == true); - Partition partAntiLambdaTracks = (aod::lambdatrack::v0Type == (int8_t)kAntiLambda) && (aod::lambdatrackext::trueLambdaFlag == true); + Partition partPrimLambdaTracks = (aod::lambdatrack::v0Type == (int8_t)kLambda) && (aod::lambdatrackext::trueLambdaFlag == true) && (aod::lambdatrack::v0PrmScd == (int8_t)kPrimary); + Partition partPrimAntiLambdaTracks = (aod::lambdatrack::v0Type == (int8_t)kAntiLambda) && (aod::lambdatrackext::trueLambdaFlag == true) && (aod::lambdatrack::v0PrmScd == (int8_t)kPrimary); + Partition partSecdLambdaTracks = (aod::lambdatrack::v0Type == (int8_t)kLambda) && (aod::lambdatrackext::trueLambdaFlag == true) && (aod::lambdatrack::v0PrmScd == (int8_t)kSecondary); + Partition partSecdAntiLambdaTracks = (aod::lambdatrack::v0Type == (int8_t)kAntiLambda) && (aod::lambdatrackext::trueLambdaFlag == true) && (aod::lambdatrack::v0PrmScd == (int8_t)kSecondary); void processDataReco(LambdaCollisions::iterator const& collision, LambdaTracks const&) { histos.fill(HIST("Event/Reco/h1f_collision_posz"), collision.posZ()); histos.fill(HIST("Event/Reco/h1f_ft0m_mult_percentile"), collision.cent()); - auto lambdaTracks = partLambdaTracks->sliceByCached(aod::lambdatrack::lambdaCollisionId, collision.globalIndex(), cache); - auto antiLambdaTracks = partAntiLambdaTracks->sliceByCached(aod::lambdatrack::lambdaCollisionId, collision.globalIndex(), cache); - - analyzeSingles(lambdaTracks); - analyzeSingles(antiLambdaTracks); - analyzePairs(lambdaTracks, antiLambdaTracks); - analyzePairs(lambdaTracks, lambdaTracks); - analyzePairs(antiLambdaTracks, antiLambdaTracks); + auto lambdaPrimTracks = partPrimLambdaTracks->sliceByCached(aod::lambdatrack::lambdaCollisionId, collision.globalIndex(), cache); + auto antiLambdaPrimTracks = partPrimAntiLambdaTracks->sliceByCached(aod::lambdatrack::lambdaCollisionId, collision.globalIndex(), cache); + auto lambdaSecdTracks = partSecdLambdaTracks->sliceByCached(aod::lambdatrack::lambdaCollisionId, collision.globalIndex(), cache); + auto antiLambdaSecdTracks = partSecdAntiLambdaTracks->sliceByCached(aod::lambdatrack::lambdaCollisionId, collision.globalIndex(), cache); + + analyzeSingles(lambdaPrimTracks); + analyzeSingles(antiLambdaPrimTracks); + analyzeSingles(lambdaSecdTracks); + analyzeSingles(antiLambdaSecdTracks); + analyzePairs(lambdaPrimTracks, antiLambdaPrimTracks); + analyzePairs(lambdaPrimTracks, lambdaPrimTracks); + analyzePairs(antiLambdaPrimTracks, antiLambdaPrimTracks); + analyzePairs(lambdaPrimTracks, antiLambdaSecdTracks); + analyzePairs(lambdaPrimTracks, lambdaSecdTracks); + analyzePairs(antiLambdaPrimTracks, antiLambdaSecdTracks); + analyzePairs(lambdaSecdTracks, antiLambdaPrimTracks); + analyzePairs(lambdaSecdTracks, lambdaPrimTracks); + analyzePairs(antiLambdaSecdTracks, antiLambdaPrimTracks); + analyzePairs(lambdaSecdTracks, antiLambdaSecdTracks); + analyzePairs(lambdaSecdTracks, lambdaSecdTracks); + analyzePairs(antiLambdaSecdTracks, antiLambdaSecdTracks); } PROCESS_SWITCH(LambdaR2Correlation, processDataReco, "Process for Data and MCReco", true); @@ -1677,23 +1748,37 @@ struct LambdaR2Correlation { using LambdaMcGenTracks = aod::LambdaMcGenTracks; SliceCache cachemc; - Partition partLambdaMcGenTracks = aod::lambdatrack::v0Type == (int8_t)kLambda; - Partition partAntiLambdaMcGenTracks = aod::lambdatrack::v0Type == (int8_t)kAntiLambda; + Partition partMcPrimLambdaTracks = (aod::lambdatrack::v0Type == (int8_t)kLambda) && (aod::lambdatrack::v0PrmScd == (int8_t)kPrimary); + Partition partMcPrimAntiLambdaTracks = (aod::lambdatrack::v0Type == (int8_t)kAntiLambda) && (aod::lambdatrack::v0PrmScd == (int8_t)kPrimary); + Partition partMcSecdLambdaTracks = (aod::lambdatrack::v0Type == (int8_t)kLambda) && (aod::lambdatrack::v0PrmScd == (int8_t)kSecondary); + Partition partMcSecdAntiLambdaTracks = (aod::lambdatrack::v0Type == (int8_t)kAntiLambda) && (aod::lambdatrack::v0PrmScd == (int8_t)kSecondary); void processMCGen(LambdaMcGenCollisions::iterator const& mcgencol, LambdaMcGenTracks const&) { histos.fill(HIST("Event/McGen/h1f_collision_posz"), mcgencol.posZ()); histos.fill(HIST("Event/McGen/h1f_ft0m_mult_percentile"), mcgencol.cent()); - auto lambdaMcGenTracks = partLambdaMcGenTracks->sliceByCached(aod::lambdamcgentrack::lambdaMcGenCollisionId, mcgencol.globalIndex(), cachemc); - auto antiLambdaMcGenTracks = partAntiLambdaMcGenTracks->sliceByCached(aod::lambdamcgentrack::lambdaMcGenCollisionId, mcgencol.globalIndex(), cachemc); - - analyzeSingles(lambdaMcGenTracks); - analyzeSingles(antiLambdaMcGenTracks); - - analyzePairs(lambdaMcGenTracks, antiLambdaMcGenTracks); - analyzePairs(lambdaMcGenTracks, lambdaMcGenTracks); - analyzePairs(antiLambdaMcGenTracks, antiLambdaMcGenTracks); + auto lambdaPrimTracks = partMcPrimLambdaTracks->sliceByCached(aod::lambdamcgentrack::lambdaMcGenCollisionId, mcgencol.globalIndex(), cachemc); + auto antiLambdaPrimTracks = partMcPrimAntiLambdaTracks->sliceByCached(aod::lambdamcgentrack::lambdaMcGenCollisionId, mcgencol.globalIndex(), cachemc); + auto lambdaSecdTracks = partMcSecdLambdaTracks->sliceByCached(aod::lambdamcgentrack::lambdaMcGenCollisionId, mcgencol.globalIndex(), cachemc); + auto antiLambdaSecdTracks = partMcSecdAntiLambdaTracks->sliceByCached(aod::lambdamcgentrack::lambdaMcGenCollisionId, mcgencol.globalIndex(), cachemc); + + analyzeSingles(lambdaPrimTracks); + analyzeSingles(antiLambdaPrimTracks); + analyzeSingles(lambdaSecdTracks); + analyzeSingles(antiLambdaSecdTracks); + analyzePairs(lambdaPrimTracks, antiLambdaPrimTracks); + analyzePairs(lambdaPrimTracks, lambdaPrimTracks); + analyzePairs(antiLambdaPrimTracks, antiLambdaPrimTracks); + analyzePairs(lambdaPrimTracks, antiLambdaSecdTracks); + analyzePairs(lambdaPrimTracks, lambdaSecdTracks); + analyzePairs(antiLambdaPrimTracks, antiLambdaSecdTracks); + analyzePairs(lambdaSecdTracks, antiLambdaPrimTracks); + analyzePairs(lambdaSecdTracks, lambdaPrimTracks); + analyzePairs(antiLambdaSecdTracks, antiLambdaPrimTracks); + analyzePairs(lambdaSecdTracks, antiLambdaSecdTracks); + analyzePairs(lambdaSecdTracks, lambdaSecdTracks); + analyzePairs(antiLambdaSecdTracks, antiLambdaSecdTracks); } PROCESS_SWITCH(LambdaR2Correlation, processMCGen, "Process for MC Generated", false); From ed69f9881bd427114bcb4dca0c95b825c7565d24 Mon Sep 17 00:00:00 2001 From: glromane <95305986+glromane@users.noreply.github.com> Date: Mon, 26 May 2025 22:06:39 +0200 Subject: [PATCH 1421/1650] [PWGCF] fix TPD radius oprion for 2trck cuts (#11365) --- PWGCF/Femto3D/Core/femto3dPairTask.h | 11 ++++++----- PWGCF/Femto3D/Tasks/femto3dPairTask.cxx | 19 ++++++++++--------- PWGCF/Femto3D/Tasks/femto3dPairTaskMC.cxx | 9 +++++---- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/PWGCF/Femto3D/Core/femto3dPairTask.h b/PWGCF/Femto3D/Core/femto3dPairTask.h index 5627215ea55..db5949f4ae0 100755 --- a/PWGCF/Femto3D/Core/femto3dPairTask.h +++ b/PWGCF/Femto3D/Core/femto3dPairTask.h @@ -222,10 +222,12 @@ class FemtoPair } float GetPhiStarDiff(const float& radius = 1.2) const { - if (_first != NULL && _second != NULL) - return _first->phiStar(_magfield1, radius) - _second->phiStar(_magfield2, radius); - else + if (_first != NULL && _second != NULL) { + float dphi = _first->phiStar(_magfield1, radius) - _second->phiStar(_magfield2, radius); + return std::fabs(dphi) > o2::constants::math::PI ? (1.0 - 2.0 * o2::constants::math::PI / std::fabs(dphi)) * dphi : dphi; + } else { return 1000; + } } float GetAvgPhiStarDiff() const; @@ -327,8 +329,7 @@ float FemtoPair::GetAvgPhiStarDiff() const float res = 0.0; for (const auto& radius : TPCradii) { - const float dphi = GetPhiStarDiff(radius); - res += std::fabs(dphi) > o2::constants::math::PI ? (1.0 - 2.0 * o2::constants::math::PI / std::fabs(dphi)) * dphi : dphi; + res += GetPhiStarDiff(radius); } return res / TPCradii.size(); diff --git a/PWGCF/Femto3D/Tasks/femto3dPairTask.cxx b/PWGCF/Femto3D/Tasks/femto3dPairTask.cxx index bc91f8a25c2..83aa740795c 100644 --- a/PWGCF/Femto3D/Tasks/femto3dPairTask.cxx +++ b/PWGCF/Femto3D/Tasks/femto3dPairTask.cxx @@ -90,9 +90,10 @@ struct FemtoCorrelations { Configurable _particlePDGtoReject{"particlePDGtoRejectFromSecond", 0, "applied only if the particles are non-identical and only to the second particle in the pair!!!"}; Configurable> _rejectWithinNsigmaTOF{"rejectWithinNsigmaTOF", std::vector{-0.0f, 0.0f}, "TOF rejection Nsigma range for the particle specified with PDG to be rejected"}; + Configurable _dPhiMode{"dPhiMode", 0, "Flag to choose how to calc. dphi*: 0 - at a fixed TPC radius; 1 - average over different TPC radii;"}; + Configurable _radiusTPC{"radiusTPC", 1.2, "TPC radius to calculate phi_star for"}; Configurable _deta{"deta", 0.01, "minimum allowed defference in eta between two tracks in a pair"}; Configurable _dphi{"dphi", 0.01, "minimum allowed defference in phi_star between two tracks in a pair"}; - // Configurable _radiusTPC{"radiusTPC", 1.2, "TPC radius to calculate phi_star for"}; Configurable _avgSepTPC{"avgSepTPC", 10, "average sep. (cm) in TPC"}; Configurable _vertexNbinsToMix{"vertexNbinsToMix", 10, "Number of vertexZ bins for the mixing"}; @@ -310,15 +311,15 @@ struct FemtoCorrelations { LOGF(fatal, "kTbin value obtained for a pair exceeds the configured number of kT bins (3D)"); if (_fillDetaDphi % 2 == 0) - DoubleTrack_SE_histos_BC[multBin][kTbin]->Fill(Pair->GetAvgPhiStarDiff(), Pair->GetEtaDiff()); + DoubleTrack_SE_histos_BC[multBin][kTbin]->Fill(_dPhiMode.value == 0 ? Pair->GetPhiStarDiff(_radiusTPC) : Pair->GetAvgPhiStarDiff(), Pair->GetEtaDiff()); - if (_deta > 0 && _dphi > 0 && Pair->IsClosePair(_deta, _dphi)) + if (_deta > 0 && _dphi > 0 && (_dPhiMode.value == 0 ? Pair->IsClosePair(_deta, _dphi, _radiusTPC) : Pair->IsClosePair(_deta, _dphi))) continue; if (_avgSepTPC > 0 && Pair->IsClosePair(_avgSepTPC)) continue; if (_fillDetaDphi > 0) - DoubleTrack_SE_histos_AC[multBin][kTbin]->Fill(Pair->GetAvgPhiStarDiff(), Pair->GetEtaDiff()); + DoubleTrack_SE_histos_AC[multBin][kTbin]->Fill(_dPhiMode.value == 0 ? Pair->GetPhiStarDiff(_radiusTPC) : Pair->GetAvgPhiStarDiff(), Pair->GetEtaDiff()); kThistos[multBin][kTbin]->Fill(pair_kT); mThistos[multBin][kTbin]->Fill(Pair->GetMt()); // test @@ -359,21 +360,21 @@ struct FemtoCorrelations { if (_fillDetaDphi % 2 == 0) { if (!SE_or_ME) - DoubleTrack_SE_histos_BC[multBin][kTbin]->Fill(Pair->GetAvgPhiStarDiff(), Pair->GetEtaDiff()); + DoubleTrack_SE_histos_BC[multBin][kTbin]->Fill(_dPhiMode.value == 0 ? Pair->GetPhiStarDiff(_radiusTPC) : Pair->GetAvgPhiStarDiff(), Pair->GetEtaDiff()); else - DoubleTrack_ME_histos_BC[multBin][kTbin]->Fill(Pair->GetAvgPhiStarDiff(), Pair->GetEtaDiff()); + DoubleTrack_ME_histos_BC[multBin][kTbin]->Fill(_dPhiMode.value == 0 ? Pair->GetPhiStarDiff(_radiusTPC) : Pair->GetAvgPhiStarDiff(), Pair->GetEtaDiff()); } - if (_deta > 0 && _dphi > 0 && Pair->IsClosePair(_deta, _dphi)) + if (_deta > 0 && _dphi > 0 && (_dPhiMode.value == 0 ? Pair->IsClosePair(_deta, _dphi, _radiusTPC) : Pair->IsClosePair(_deta, _dphi))) continue; if (_avgSepTPC > 0 && Pair->IsClosePair(_avgSepTPC)) continue; if (_fillDetaDphi > 0) { if (!SE_or_ME) - DoubleTrack_SE_histos_AC[multBin][kTbin]->Fill(Pair->GetAvgPhiStarDiff(), Pair->GetEtaDiff()); + DoubleTrack_SE_histos_AC[multBin][kTbin]->Fill(_dPhiMode.value == 0 ? Pair->GetPhiStarDiff(_radiusTPC) : Pair->GetAvgPhiStarDiff(), Pair->GetEtaDiff()); else - DoubleTrack_ME_histos_AC[multBin][kTbin]->Fill(Pair->GetAvgPhiStarDiff(), Pair->GetEtaDiff()); + DoubleTrack_ME_histos_AC[multBin][kTbin]->Fill(_dPhiMode.value == 0 ? Pair->GetPhiStarDiff(_radiusTPC) : Pair->GetAvgPhiStarDiff(), Pair->GetEtaDiff()); } if (!SE_or_ME) { diff --git a/PWGCF/Femto3D/Tasks/femto3dPairTaskMC.cxx b/PWGCF/Femto3D/Tasks/femto3dPairTaskMC.cxx index be66280928e..b776d34e629 100644 --- a/PWGCF/Femto3D/Tasks/femto3dPairTaskMC.cxx +++ b/PWGCF/Femto3D/Tasks/femto3dPairTaskMC.cxx @@ -86,7 +86,8 @@ struct FemtoCorrelationsMC { Configurable _particlePDGtoReject{"particlePDGtoRejectFromSecond", 0, "applied only if the particles are non-identical and only to the second particle in the pair!!!"}; Configurable> _rejectWithinNsigmaTOF{"rejectWithinNsigmaTOF", std::vector{-0.0f, 0.0f}, "TOF rejection Nsigma range for the particle specified with PDG to be rejected"}; - // Configurable _radiusTPC{"radiusTPC", 1.2, "TPC radius to calculate phi_star for"}; + Configurable _dPhiMode{"dPhiMode", 0, "Flag to choose how to calc. dphi*: 0 - at a fixed TPC radius; 1 - average over different TPC radii;"}; + Configurable _radiusTPC{"radiusTPC", 1.2, "TPC radius to calculate phi_star for"}; Configurable _vertexNbinsToMix{"vertexNbinsToMix", 10, "Number of vertexZ bins for the mixing"}; Configurable> _centBins{"multBins", std::vector{0.0f, 100.0f}, "multiplicity percentile/centrality binning (min:0, max:100)"}; @@ -257,7 +258,7 @@ struct FemtoCorrelationsMC { LOGF(fatal, "kTbin value obtained for a pair exceeds the configured number of kT bins"); kThistos[centBin][kTbin]->Fill(pair_kT); - DoubleTrack_SE_histos[centBin][kTbin]->Fill(Pair->GetAvgPhiStarDiff(), Pair->GetEtaDiff()); + DoubleTrack_SE_histos[centBin][kTbin]->Fill(_dPhiMode.value == 0 ? Pair->GetPhiStarDiff(_radiusTPC) : Pair->GetAvgPhiStarDiff(), Pair->GetEtaDiff()); AvgSep_SE_histos[centBin][kTbin]->Fill(Pair->GetAvgSep()); Pair->ResetPair(); } @@ -281,7 +282,7 @@ struct FemtoCorrelationsMC { LOGF(fatal, "kTbin value obtained for a pair exceeds the configured number of kT bins"); kThistos[centBin][kTbin]->Fill(pair_kT); - DoubleTrack_SE_histos[centBin][kTbin]->Fill(Pair->GetAvgPhiStarDiff(), Pair->GetEtaDiff()); + DoubleTrack_SE_histos[centBin][kTbin]->Fill(_dPhiMode.value == 0 ? Pair->GetPhiStarDiff(_radiusTPC) : Pair->GetAvgPhiStarDiff(), Pair->GetEtaDiff()); AvgSep_SE_histos[centBin][kTbin]->Fill(Pair->GetAvgSep()); Pair->ResetPair(); } @@ -304,7 +305,7 @@ struct FemtoCorrelationsMC { if (kTbin > Resolution_histos[centBin].size() || kTbin > DoubleTrack_ME_histos[centBin].size()) LOGF(fatal, "kTbin value obtained for a pair exceeds the configured number of kT bins"); - DoubleTrack_ME_histos[centBin][kTbin]->Fill(Pair->GetAvgPhiStarDiff(), Pair->GetEtaDiff()); + DoubleTrack_ME_histos[centBin][kTbin]->Fill(_dPhiMode.value == 0 ? Pair->GetPhiStarDiff(_radiusTPC) : Pair->GetAvgPhiStarDiff(), Pair->GetEtaDiff()); AvgSep_ME_histos[centBin][kTbin]->Fill(Pair->GetAvgSep()); if (abs(ii->pdgCode()) != _particlePDG_1.value || abs(iii->pdgCode()) != _particlePDG_2.value) From 53e8af6ee6d4493558da476a803aca37c6d0cdd0 Mon Sep 17 00:00:00 2001 From: Rahul Verma <110929992+rahulverma012@users.noreply.github.com> Date: Tue, 27 May 2025 02:03:09 +0530 Subject: [PATCH 1422/1650] [Common] Update in occupancy Table producer task : producer task split into multiple process functions for better performance (#11322) Co-authored-by: Anton Alkin --- Common/DataModel/OccupancyTables.h | 392 ++- .../TableProducer/occupancyTableProducer.cxx | 2987 +++++++++++------ 2 files changed, 2172 insertions(+), 1207 deletions(-) diff --git a/Common/DataModel/OccupancyTables.h b/Common/DataModel/OccupancyTables.h index e8f33b90990..4828183a269 100644 --- a/Common/DataModel/OccupancyTables.h +++ b/Common/DataModel/OccupancyTables.h @@ -97,16 +97,31 @@ DECLARE_SOA_COLUMN(MeanOccRobustMultExtraTableUnfm80, meanOccRobustMultExtraTabl } // namespace occp DECLARE_SOA_TABLE(OccsBCsList, "AOD", "OCCSBCSLIST", o2::soa::Index<>, o2::aod::occp::TfId, o2::aod::occp::BcsInTFList); -DECLARE_SOA_TABLE(OccsDet, "AOD", "OCCSDET", o2::soa::Index<>, - o2::aod::occp::OccPrimUnfm80, +// 1 +DECLARE_SOA_TABLE(OccsPrim, "AOD", "OCCSPRIM", o2::soa::Index<>, + o2::aod::occp::OccPrimUnfm80); +DECLARE_SOA_TABLE(OccsMeanPrim, "AOD", "OCCSMEANPRIM", o2::soa::Index<>, + o2::aod::occp::MeanOccPrimUnfm80); +// 2 +DECLARE_SOA_TABLE(OccsT0V0, "AOD", "OCCST0V0", o2::soa::Index<>, o2::aod::occp::OccFV0AUnfm80, o2::aod::occp::OccFV0CUnfm80, o2::aod::occp::OccFT0AUnfm80, - o2::aod::occp::OccFT0CUnfm80, + o2::aod::occp::OccFT0CUnfm80); +DECLARE_SOA_TABLE(OccsMeanT0V0, "AOD", "OCCSMEANT0V0", o2::soa::Index<>, + o2::aod::occp::MeanOccFV0AUnfm80, + o2::aod::occp::MeanOccFV0CUnfm80, + o2::aod::occp::MeanOccFT0AUnfm80, + o2::aod::occp::MeanOccFT0CUnfm80); +// 3 +DECLARE_SOA_TABLE(OccsFDD, "AOD", "OCCSFDD", o2::soa::Index<>, o2::aod::occp::OccFDDAUnfm80, o2::aod::occp::OccFDDCUnfm80); - -DECLARE_SOA_TABLE(OccsTrackMult, "AOD", "OCCSTRACKMULT", o2::soa::Index<>, +DECLARE_SOA_TABLE(OccsMeanFDD, "AOD", "OCCSMEANFDD", o2::soa::Index<>, + o2::aod::occp::MeanOccFDDAUnfm80, + o2::aod::occp::MeanOccFDDCUnfm80); +// 4 +DECLARE_SOA_TABLE(OccsNTrackDet, "AOD", "OCCSNTRACKDET", o2::soa::Index<>, o2::aod::occp::OccNTrackITSUnfm80, o2::aod::occp::OccNTrackTPCUnfm80, o2::aod::occp::OccNTrackTRDUnfm80, @@ -117,33 +132,7 @@ DECLARE_SOA_TABLE(OccsTrackMult, "AOD", "OCCSTRACKMULT", o2::soa::Index<>, o2::aod::occp::OccNTrackITSTPCUnfm80, o2::aod::occp::OccNTrackITSTPCAUnfm80, o2::aod::occp::OccNTrackITSTPCCUnfm80); - -DECLARE_SOA_TABLE(OccsMultExtra, "AOD", "OCCSMULTEXTRA", o2::soa::Index<>, - o2::aod::occp::OccMultNTracksHasITSUnfm80, - o2::aod::occp::OccMultNTracksHasTPCUnfm80, - o2::aod::occp::OccMultNTracksHasTOFUnfm80, - o2::aod::occp::OccMultNTracksHasTRDUnfm80, - o2::aod::occp::OccMultNTracksITSOnlyUnfm80, - o2::aod::occp::OccMultNTracksTPCOnlyUnfm80, - o2::aod::occp::OccMultNTracksITSTPCUnfm80, - o2::aod::occp::OccMultAllTracksTPCOnlyUnfm80); - -DECLARE_SOA_TABLE(OccsRobust, "AOD", "OCCSROBUST", o2::soa::Index<>, - o2::aod::occp::OccRobustT0V0PrimUnfm80, - o2::aod::occp::OccRobustFDDT0V0PrimUnfm80, - o2::aod::occp::OccRobustNtrackDetUnfm80, - o2::aod::occp::OccRobustMultExtraTableUnfm80); - -DECLARE_SOA_TABLE(OccsMeanDet, "AOD", "OCCSMEANDET", o2::soa::Index<>, - o2::aod::occp::MeanOccPrimUnfm80, - o2::aod::occp::MeanOccFV0AUnfm80, - o2::aod::occp::MeanOccFV0CUnfm80, - o2::aod::occp::MeanOccFT0AUnfm80, - o2::aod::occp::MeanOccFT0CUnfm80, - o2::aod::occp::MeanOccFDDAUnfm80, - o2::aod::occp::MeanOccFDDCUnfm80); - -DECLARE_SOA_TABLE(OccsMeanTrkMult, "AOD", "OCCSMEANTRKMULT", o2::soa::Index<>, +DECLARE_SOA_TABLE(OccsMeanNTrkDet, "AOD", "OCCSMEANNTRKDET", o2::soa::Index<>, o2::aod::occp::MeanOccNTrackITSUnfm80, o2::aod::occp::MeanOccNTrackTPCUnfm80, o2::aod::occp::MeanOccNTrackTRDUnfm80, @@ -154,7 +143,16 @@ DECLARE_SOA_TABLE(OccsMeanTrkMult, "AOD", "OCCSMEANTRKMULT", o2::soa::Index<>, o2::aod::occp::MeanOccNTrackITSTPCUnfm80, o2::aod::occp::MeanOccNTrackITSTPCAUnfm80, o2::aod::occp::MeanOccNTrackITSTPCCUnfm80); - +// 5 +DECLARE_SOA_TABLE(OccsMultExtra, "AOD", "OCCSMULTEXTRA", o2::soa::Index<>, + o2::aod::occp::OccMultNTracksHasITSUnfm80, + o2::aod::occp::OccMultNTracksHasTPCUnfm80, + o2::aod::occp::OccMultNTracksHasTOFUnfm80, + o2::aod::occp::OccMultNTracksHasTRDUnfm80, + o2::aod::occp::OccMultNTracksITSOnlyUnfm80, + o2::aod::occp::OccMultNTracksTPCOnlyUnfm80, + o2::aod::occp::OccMultNTracksITSTPCUnfm80, + o2::aod::occp::OccMultAllTracksTPCOnlyUnfm80); DECLARE_SOA_TABLE(OccsMnMultExtra, "AOD", "OCCSMNMULTEXTRA", o2::soa::Index<>, o2::aod::occp::MeanOccMultNTracksHasITSUnfm80, o2::aod::occp::MeanOccMultNTracksHasTPCUnfm80, @@ -165,10 +163,26 @@ DECLARE_SOA_TABLE(OccsMnMultExtra, "AOD", "OCCSMNMULTEXTRA", o2::soa::Index<>, o2::aod::occp::MeanOccMultNTracksITSTPCUnfm80, o2::aod::occp::MeanOccMultAllTracksTPCOnlyUnfm80); -DECLARE_SOA_TABLE(OccsMeanRobust, "AOD", "OCCSMEANROBUST", o2::soa::Index<>, - o2::aod::occp::MeanOccRobustT0V0PrimUnfm80, - o2::aod::occp::MeanOccRobustFDDT0V0PrimUnfm80, - o2::aod::occp::MeanOccRobustNtrackDetUnfm80, +// Robust Occupancies +// 1 +DECLARE_SOA_TABLE(ORT0V0Prim, "AOD", "ORT0V0Prim", o2::soa::Index<>, + o2::aod::occp::OccRobustT0V0PrimUnfm80); +DECLARE_SOA_TABLE(OMRT0V0Prim, "AOD", "OMRT0V0PRIM", o2::soa::Index<>, + o2::aod::occp::MeanOccRobustT0V0PrimUnfm80); +// 2 +DECLARE_SOA_TABLE(ORFDDT0V0Prim, "AOD", "ORFDDT0V0PRIM", o2::soa::Index<>, + o2::aod::occp::OccRobustFDDT0V0PrimUnfm80); +DECLARE_SOA_TABLE(OMRFDDT0V0Prim, "AOD", "OMRFDDT0V0PRIM", o2::soa::Index<>, + o2::aod::occp::MeanOccRobustFDDT0V0PrimUnfm80); +// 3 +DECLARE_SOA_TABLE(ORNtrackDet, "AOD", "ORNTRACKDET", o2::soa::Index<>, + o2::aod::occp::OccRobustNtrackDetUnfm80); +DECLARE_SOA_TABLE(OMRNtrackDet, "AOD", "OMRNTRACKDET", o2::soa::Index<>, + o2::aod::occp::MeanOccRobustNtrackDetUnfm80); +// 4 +DECLARE_SOA_TABLE(ORMultExtra, "AOD", "ORMULTEXTRA", o2::soa::Index<>, + o2::aod::occp::OccRobustMultExtraTableUnfm80); +DECLARE_SOA_TABLE(OMRMultExtra, "AOD", "OMRMULTEXTRA", o2::soa::Index<>, o2::aod::occp::MeanOccRobustMultExtraTableUnfm80); using Occs = aod::OccsBCsList; @@ -176,7 +190,7 @@ using Occ = Occs::iterator; namespace occidx { -DECLARE_SOA_INDEX_COLUMN(BC, bc); // Iterator is passed here in index column +DECLARE_SOA_INDEX_COLUMN(BC, bc); // o2-linter: disable=name/o2-column (BC is an acronym already defined in data model) // Iterator is passed here in index column DECLARE_SOA_INDEX_COLUMN(Occ, occ); DECLARE_SOA_COLUMN(TfId, tfId, int); DECLARE_SOA_COLUMN(BcInTF, bcInTF, int); @@ -195,151 +209,173 @@ namespace trackmeanocc { DECLARE_SOA_INDEX_COLUMN(Track, track); -DECLARE_SOA_COLUMN(MeanOccPrimUnfm80, meanOccPrimUnfm80, float); -DECLARE_SOA_COLUMN(MeanOccFV0AUnfm80, meanOccFV0AUnfm80, float); -DECLARE_SOA_COLUMN(MeanOccFV0CUnfm80, meanOccFV0CUnfm80, float); -DECLARE_SOA_COLUMN(MeanOccFT0AUnfm80, meanOccFT0AUnfm80, float); -DECLARE_SOA_COLUMN(MeanOccFT0CUnfm80, meanOccFT0CUnfm80, float); -DECLARE_SOA_COLUMN(MeanOccFDDAUnfm80, meanOccFDDAUnfm80, float); -DECLARE_SOA_COLUMN(MeanOccFDDCUnfm80, meanOccFDDCUnfm80, float); - -DECLARE_SOA_COLUMN(MeanOccNTrackITSUnfm80, meanOccNTrackITSUnfm80, float); -DECLARE_SOA_COLUMN(MeanOccNTrackTPCUnfm80, meanOccNTrackTPCUnfm80, float); -DECLARE_SOA_COLUMN(MeanOccNTrackTRDUnfm80, meanOccNTrackTRDUnfm80, float); -DECLARE_SOA_COLUMN(MeanOccNTrackTOFUnfm80, meanOccNTrackTOFUnfm80, float); -DECLARE_SOA_COLUMN(MeanOccNTrackSizeUnfm80, meanOccNTrackSizeUnfm80, float); -DECLARE_SOA_COLUMN(MeanOccNTrackTPCAUnfm80, meanOccNTrackTPCAUnfm80, float); -DECLARE_SOA_COLUMN(MeanOccNTrackTPCCUnfm80, meanOccNTrackTPCCUnfm80, float); -DECLARE_SOA_COLUMN(MeanOccNTrackITSTPCUnfm80, meanOccNTrackITSTPCUnfm80, float); -DECLARE_SOA_COLUMN(MeanOccNTrackITSTPCAUnfm80, meanOccNTrackITSTPCAUnfm80, float); -DECLARE_SOA_COLUMN(MeanOccNTrackITSTPCCUnfm80, meanOccNTrackITSTPCCUnfm80, float); - -DECLARE_SOA_COLUMN(MeanOccMultNTracksHasITSUnfm80, meanOccMultNTracksHasITSUnfm80, float); -DECLARE_SOA_COLUMN(MeanOccMultNTracksHasTPCUnfm80, meanOccMultNTracksHasTPCUnfm80, float); -DECLARE_SOA_COLUMN(MeanOccMultNTracksHasTOFUnfm80, meanOccMultNTracksHasTOFUnfm80, float); -DECLARE_SOA_COLUMN(MeanOccMultNTracksHasTRDUnfm80, meanOccMultNTracksHasTRDUnfm80, float); -DECLARE_SOA_COLUMN(MeanOccMultNTracksITSOnlyUnfm80, meanOccMultNTracksITSOnlyUnfm80, float); -DECLARE_SOA_COLUMN(MeanOccMultNTracksTPCOnlyUnfm80, meanOccMultNTracksTPCOnlyUnfm80, float); -DECLARE_SOA_COLUMN(MeanOccMultNTracksITSTPCUnfm80, meanOccMultNTracksITSTPCUnfm80, float); -DECLARE_SOA_COLUMN(MeanOccMultAllTracksTPCOnlyUnfm80, meanOccMultAllTracksTPCOnlyUnfm80, float); - -DECLARE_SOA_COLUMN(MeanOccRobustT0V0PrimUnfm80, meanOccRobustT0V0PrimUnfm80, float); -DECLARE_SOA_COLUMN(MeanOccRobustFDDT0V0PrimUnfm80, meanOccRobustFDDT0V0PrimUnfm80, float); -DECLARE_SOA_COLUMN(MeanOccRobustNtrackDetUnfm80, meanOccRobustNtrackDetUnfm80, float); -DECLARE_SOA_COLUMN(MeanOccRobustMultExtraTableUnfm80, meanOccRobustMultExtraTableUnfm80, float); - -DECLARE_SOA_COLUMN(WeightMeanOccPrimUnfm80, weightMeanOccPrimUnfm80, float); -DECLARE_SOA_COLUMN(WeightMeanOccFV0AUnfm80, weightMeanOccFV0AUnfm80, float); -DECLARE_SOA_COLUMN(WeightMeanOccFV0CUnfm80, weightMeanOccFV0CUnfm80, float); -DECLARE_SOA_COLUMN(WeightMeanOccFT0AUnfm80, weightMeanOccFT0AUnfm80, float); -DECLARE_SOA_COLUMN(WeightMeanOccFT0CUnfm80, weightMeanOccFT0CUnfm80, float); -DECLARE_SOA_COLUMN(WeightMeanOccFDDAUnfm80, weightMeanOccFDDAUnfm80, float); -DECLARE_SOA_COLUMN(WeightMeanOccFDDCUnfm80, weightMeanOccFDDCUnfm80, float); - -DECLARE_SOA_COLUMN(WeightMeanOccNTrackITSUnfm80, weightMeanOccNTrackITSUnfm80, float); -DECLARE_SOA_COLUMN(WeightMeanOccNTrackTPCUnfm80, weightMeanOccNTrackTPCUnfm80, float); -DECLARE_SOA_COLUMN(WeightMeanOccNTrackTRDUnfm80, weightMeanOccNTrackTRDUnfm80, float); -DECLARE_SOA_COLUMN(WeightMeanOccNTrackTOFUnfm80, weightMeanOccNTrackTOFUnfm80, float); -DECLARE_SOA_COLUMN(WeightMeanOccNTrackSizeUnfm80, weightMeanOccNTrackSizeUnfm80, float); -DECLARE_SOA_COLUMN(WeightMeanOccNTrackTPCAUnfm80, weightMeanOccNTrackTPCAUnfm80, float); -DECLARE_SOA_COLUMN(WeightMeanOccNTrackTPCCUnfm80, weightMeanOccNTrackTPCCUnfm80, float); -DECLARE_SOA_COLUMN(WeightMeanOccNTrackITSTPCUnfm80, weightMeanOccNTrackITSTPCUnfm80, float); -DECLARE_SOA_COLUMN(WeightMeanOccNTrackITSTPCAUnfm80, weightMeanOccNTrackITSTPCAUnfm80, float); -DECLARE_SOA_COLUMN(WeightMeanOccNTrackITSTPCCUnfm80, weightMeanOccNTrackITSTPCCUnfm80, float); - -DECLARE_SOA_COLUMN(WeightMeanOccMultNTracksHasITSUnfm80, weightMeanOccMultNTracksHasITSUnfm80, float); -DECLARE_SOA_COLUMN(WeightMeanOccMultNTracksHasTPCUnfm80, weightMeanOccMultNTracksHasTPCUnfm80, float); -DECLARE_SOA_COLUMN(WeightMeanOccMultNTracksHasTOFUnfm80, weightMeanOccMultNTracksHasTOFUnfm80, float); -DECLARE_SOA_COLUMN(WeightMeanOccMultNTracksHasTRDUnfm80, weightMeanOccMultNTracksHasTRDUnfm80, float); -DECLARE_SOA_COLUMN(WeightMeanOccMultNTracksITSOnlyUnfm80, weightMeanOccMultNTracksITSOnlyUnfm80, float); -DECLARE_SOA_COLUMN(WeightMeanOccMultNTracksTPCOnlyUnfm80, weightMeanOccMultNTracksTPCOnlyUnfm80, float); -DECLARE_SOA_COLUMN(WeightMeanOccMultNTracksITSTPCUnfm80, weightMeanOccMultNTracksITSTPCUnfm80, float); -DECLARE_SOA_COLUMN(WeightMeanOccMultAllTracksTPCOnlyUnfm80, weightMeanOccMultAllTracksTPCOnlyUnfm80, float); - -DECLARE_SOA_COLUMN(WeightMeanOccRobustT0V0PrimUnfm80, weightMeanOccRobustT0V0PrimUnfm80, float); -DECLARE_SOA_COLUMN(WeightMeanOccRobustFDDT0V0PrimUnfm80, weightMeanOccRobustFDDT0V0PrimUnfm80, float); -DECLARE_SOA_COLUMN(WeightMeanOccRobustNtrackDetUnfm80, weightMeanOccRobustNtrackDetUnfm80, float); -DECLARE_SOA_COLUMN(WeightMeanOccRobustMultExtraTableUnfm80, weightMeanOccRobustMultExtraTableUnfm80, float); +DECLARE_SOA_COLUMN(TmoPrimUnfm80, tmoPrimUnfm80, float); +DECLARE_SOA_COLUMN(TmoFV0AUnfm80, tmoFV0AUnfm80, float); +DECLARE_SOA_COLUMN(TmoFV0CUnfm80, tmoFV0CUnfm80, float); +DECLARE_SOA_COLUMN(TmoFT0AUnfm80, tmoFT0AUnfm80, float); +DECLARE_SOA_COLUMN(TmoFT0CUnfm80, tmoFT0CUnfm80, float); +DECLARE_SOA_COLUMN(TmoFDDAUnfm80, tmoFDDAUnfm80, float); +DECLARE_SOA_COLUMN(TmoFDDCUnfm80, tmoFDDCUnfm80, float); + +DECLARE_SOA_COLUMN(TmoNTrackITSUnfm80, tmoNTrackITSUnfm80, float); +DECLARE_SOA_COLUMN(TmoNTrackTPCUnfm80, tmoNTrackTPCUnfm80, float); +DECLARE_SOA_COLUMN(TmoNTrackTRDUnfm80, tmoNTrackTRDUnfm80, float); +DECLARE_SOA_COLUMN(TmoNTrackTOFUnfm80, tmoNTrackTOFUnfm80, float); +DECLARE_SOA_COLUMN(TmoNTrackSizeUnfm80, tmoNTrackSizeUnfm80, float); +DECLARE_SOA_COLUMN(TmoNTrackTPCAUnfm80, tmoNTrackTPCAUnfm80, float); +DECLARE_SOA_COLUMN(TmoNTrackTPCCUnfm80, tmoNTrackTPCCUnfm80, float); +DECLARE_SOA_COLUMN(TmoNTrackITSTPCUnfm80, tmoNTrackITSTPCUnfm80, float); +DECLARE_SOA_COLUMN(TmoNTrackITSTPCAUnfm80, tmoNTrackITSTPCAUnfm80, float); +DECLARE_SOA_COLUMN(TmoNTrackITSTPCCUnfm80, tmoNTrackITSTPCCUnfm80, float); + +DECLARE_SOA_COLUMN(TmoMultNTracksHasITSUnfm80, tmoMultNTracksHasITSUnfm80, float); +DECLARE_SOA_COLUMN(TmoMultNTracksHasTPCUnfm80, tmoMultNTracksHasTPCUnfm80, float); +DECLARE_SOA_COLUMN(TmoMultNTracksHasTOFUnfm80, tmoMultNTracksHasTOFUnfm80, float); +DECLARE_SOA_COLUMN(TmoMultNTracksHasTRDUnfm80, tmoMultNTracksHasTRDUnfm80, float); +DECLARE_SOA_COLUMN(TmoMultNTracksITSOnlyUnfm80, tmoMultNTracksITSOnlyUnfm80, float); +DECLARE_SOA_COLUMN(TmoMultNTracksTPCOnlyUnfm80, tmoMultNTracksTPCOnlyUnfm80, float); +DECLARE_SOA_COLUMN(TmoMultNTracksITSTPCUnfm80, tmoMultNTracksITSTPCUnfm80, float); +DECLARE_SOA_COLUMN(TmoMultAllTracksTPCOnlyUnfm80, tmoMultAllTracksTPCOnlyUnfm80, float); + +DECLARE_SOA_COLUMN(TmoRobustT0V0PrimUnfm80, tmoRobustT0V0PrimUnfm80, float); +DECLARE_SOA_COLUMN(TmoRobustFDDT0V0PrimUnfm80, tmoRobustFDDT0V0PrimUnfm80, float); +DECLARE_SOA_COLUMN(TmoRobustNtrackDetUnfm80, tmoRobustNtrackDetUnfm80, float); +DECLARE_SOA_COLUMN(TmoRobustMultExtraTableUnfm80, tmoRobustMultExtraTableUnfm80, float); + +DECLARE_SOA_COLUMN(TwmoPrimUnfm80, twmoPrimUnfm80, float); +DECLARE_SOA_COLUMN(TwmoFV0AUnfm80, twmoFV0AUnfm80, float); +DECLARE_SOA_COLUMN(TwmoFV0CUnfm80, twmoFV0CUnfm80, float); +DECLARE_SOA_COLUMN(TwmoFT0AUnfm80, twmoFT0AUnfm80, float); +DECLARE_SOA_COLUMN(TwmoFT0CUnfm80, twmoFT0CUnfm80, float); +DECLARE_SOA_COLUMN(TwmoFDDAUnfm80, twmoFDDAUnfm80, float); +DECLARE_SOA_COLUMN(TwmoFDDCUnfm80, twmoFDDCUnfm80, float); + +DECLARE_SOA_COLUMN(TwmoNTrackITSUnfm80, twmoNTrackITSUnfm80, float); +DECLARE_SOA_COLUMN(TwmoNTrackTPCUnfm80, twmoNTrackTPCUnfm80, float); +DECLARE_SOA_COLUMN(TwmoNTrackTRDUnfm80, twmoNTrackTRDUnfm80, float); +DECLARE_SOA_COLUMN(TwmoNTrackTOFUnfm80, twmoNTrackTOFUnfm80, float); +DECLARE_SOA_COLUMN(TwmoNTrackSizeUnfm80, twmoNTrackSizeUnfm80, float); +DECLARE_SOA_COLUMN(TwmoNTrackTPCAUnfm80, twmoNTrackTPCAUnfm80, float); +DECLARE_SOA_COLUMN(TwmoNTrackTPCCUnfm80, twmoNTrackTPCCUnfm80, float); +DECLARE_SOA_COLUMN(TwmoNTrackITSTPCUnfm80, twmoNTrackITSTPCUnfm80, float); +DECLARE_SOA_COLUMN(TwmoNTrackITSTPCAUnfm80, twmoNTrackITSTPCAUnfm80, float); +DECLARE_SOA_COLUMN(TwmoNTrackITSTPCCUnfm80, twmoNTrackITSTPCCUnfm80, float); + +DECLARE_SOA_COLUMN(TwmoMultNTracksHasITSUnfm80, twmoMultNTracksHasITSUnfm80, float); +DECLARE_SOA_COLUMN(TwmoMultNTracksHasTPCUnfm80, twmoMultNTracksHasTPCUnfm80, float); +DECLARE_SOA_COLUMN(TwmoMultNTracksHasTOFUnfm80, twmoMultNTracksHasTOFUnfm80, float); +DECLARE_SOA_COLUMN(TwmoMultNTracksHasTRDUnfm80, twmoMultNTracksHasTRDUnfm80, float); +DECLARE_SOA_COLUMN(TwmoMultNTracksITSOnlyUnfm80, twmoMultNTracksITSOnlyUnfm80, float); +DECLARE_SOA_COLUMN(TwmoMultNTracksTPCOnlyUnfm80, twmoMultNTracksTPCOnlyUnfm80, float); +DECLARE_SOA_COLUMN(TwmoMultNTracksITSTPCUnfm80, twmoMultNTracksITSTPCUnfm80, float); +DECLARE_SOA_COLUMN(TwmoMultAllTracksTPCOnlyUnfm80, twmoMultAllTracksTPCOnlyUnfm80, float); + +DECLARE_SOA_COLUMN(TwmoRobustT0V0PrimUnfm80, twmoRobustT0V0PrimUnfm80, float); +DECLARE_SOA_COLUMN(TwmoRobustFDDT0V0PrimUnfm80, twmoRobustFDDT0V0PrimUnfm80, float); +DECLARE_SOA_COLUMN(TwmoRobustNtrackDetUnfm80, twmoRobustNtrackDetUnfm80, float); +DECLARE_SOA_COLUMN(TwmoRobustMultExtraTableUnfm80, twmoRobustMultExtraTableUnfm80, float); } // namespace trackmeanocc // Tracks // using Tracks = aod::Tracks; // DECLARE_SOA_INDEX_TABLE_USER(TrackMeanOccs0, Tracks, "TRACKMEANOCCS0", o2::aod::trackmeanocc::TrackId); -DECLARE_SOA_TABLE(TrackMeanOccs0, "AOD", "TRACKMEANOCCS0", o2::aod::trackmeanocc::TrackId); - -DECLARE_SOA_TABLE(TrackMeanOccs1, "AOD", "TRACKMEANOCCS1", o2::soa::Index<>, // TrackMeanOccDet - o2::aod::trackmeanocc::MeanOccPrimUnfm80, - o2::aod::trackmeanocc::MeanOccFV0AUnfm80, - o2::aod::trackmeanocc::MeanOccFV0CUnfm80, - o2::aod::trackmeanocc::MeanOccFT0AUnfm80, - o2::aod::trackmeanocc::MeanOccFT0CUnfm80, - o2::aod::trackmeanocc::MeanOccFDDAUnfm80, - o2::aod::trackmeanocc::MeanOccFDDCUnfm80); - -DECLARE_SOA_TABLE(TrackMeanOccs2, "AOD", "TRACKMEANOCCS2", o2::soa::Index<>, // TrackMeanOccTrackMult - o2::aod::trackmeanocc::MeanOccNTrackITSUnfm80, - o2::aod::trackmeanocc::MeanOccNTrackTPCUnfm80, - o2::aod::trackmeanocc::MeanOccNTrackTRDUnfm80, - o2::aod::trackmeanocc::MeanOccNTrackTOFUnfm80, - o2::aod::trackmeanocc::MeanOccNTrackSizeUnfm80, - o2::aod::trackmeanocc::MeanOccNTrackTPCAUnfm80, - o2::aod::trackmeanocc::MeanOccNTrackTPCCUnfm80, - o2::aod::trackmeanocc::MeanOccNTrackITSTPCUnfm80, - o2::aod::trackmeanocc::MeanOccNTrackITSTPCAUnfm80, - o2::aod::trackmeanocc::MeanOccNTrackITSTPCCUnfm80); - -DECLARE_SOA_TABLE(TrackMeanOccs3, "AOD", "TRACKMEANOCCS3", o2::soa::Index<>, // TrackMeanOccMultExtra - o2::aod::trackmeanocc::MeanOccMultNTracksHasITSUnfm80, - o2::aod::trackmeanocc::MeanOccMultNTracksHasTPCUnfm80, - o2::aod::trackmeanocc::MeanOccMultNTracksHasTOFUnfm80, - o2::aod::trackmeanocc::MeanOccMultNTracksHasTRDUnfm80, - o2::aod::trackmeanocc::MeanOccMultNTracksITSOnlyUnfm80, - o2::aod::trackmeanocc::MeanOccMultNTracksTPCOnlyUnfm80, - o2::aod::trackmeanocc::MeanOccMultNTracksITSTPCUnfm80, - o2::aod::trackmeanocc::MeanOccMultAllTracksTPCOnlyUnfm80); - -DECLARE_SOA_TABLE(TrackMeanOccs4, "AOD", "TRACKMEANOCCS4", o2::soa::Index<>, // TrackMeanOccRobus - o2::aod::trackmeanocc::MeanOccRobustT0V0PrimUnfm80, - o2::aod::trackmeanocc::MeanOccRobustFDDT0V0PrimUnfm80, - o2::aod::trackmeanocc::MeanOccRobustNtrackDetUnfm80, - o2::aod::trackmeanocc::MeanOccRobustMultExtraTableUnfm80); - -DECLARE_SOA_TABLE(TrackMeanOccs5, "AOD", "TRACKMEANOCCS5", o2::soa::Index<>, // TrackWieghtMeanOccDet - o2::aod::trackmeanocc::WeightMeanOccPrimUnfm80, - o2::aod::trackmeanocc::WeightMeanOccFV0AUnfm80, - o2::aod::trackmeanocc::WeightMeanOccFV0CUnfm80, - o2::aod::trackmeanocc::WeightMeanOccFT0AUnfm80, - o2::aod::trackmeanocc::WeightMeanOccFT0CUnfm80, - o2::aod::trackmeanocc::WeightMeanOccFDDAUnfm80, - o2::aod::trackmeanocc::WeightMeanOccFDDCUnfm80); - -DECLARE_SOA_TABLE(TrackMeanOccs6, "AOD", "TRACKMEANOCCS6", o2::soa::Index<>, // TrackWieghtMeanOccMult - o2::aod::trackmeanocc::WeightMeanOccNTrackITSUnfm80, - o2::aod::trackmeanocc::WeightMeanOccNTrackTPCUnfm80, - o2::aod::trackmeanocc::WeightMeanOccNTrackTRDUnfm80, - o2::aod::trackmeanocc::WeightMeanOccNTrackTOFUnfm80, - o2::aod::trackmeanocc::WeightMeanOccNTrackSizeUnfm80, - o2::aod::trackmeanocc::WeightMeanOccNTrackTPCAUnfm80, - o2::aod::trackmeanocc::WeightMeanOccNTrackTPCCUnfm80, - o2::aod::trackmeanocc::WeightMeanOccNTrackITSTPCUnfm80, - o2::aod::trackmeanocc::WeightMeanOccNTrackITSTPCAUnfm80, - o2::aod::trackmeanocc::WeightMeanOccNTrackITSTPCCUnfm80) - -DECLARE_SOA_TABLE(TrackMeanOccs7, "AOD", "TRACKMEANOCCS7", o2::soa::Index<>, // TrackWeightMeanOccMultExtra - o2::aod::trackmeanocc::WeightMeanOccMultNTracksHasITSUnfm80, - o2::aod::trackmeanocc::WeightMeanOccMultNTracksHasTPCUnfm80, - o2::aod::trackmeanocc::WeightMeanOccMultNTracksHasTOFUnfm80, - o2::aod::trackmeanocc::WeightMeanOccMultNTracksHasTRDUnfm80, - o2::aod::trackmeanocc::WeightMeanOccMultNTracksITSOnlyUnfm80, - o2::aod::trackmeanocc::WeightMeanOccMultNTracksTPCOnlyUnfm80, - o2::aod::trackmeanocc::WeightMeanOccMultNTracksITSTPCUnfm80, - o2::aod::trackmeanocc::WeightMeanOccMultAllTracksTPCOnlyUnfm80); - -DECLARE_SOA_TABLE(TrackMeanOccs8, "AOD", "TRACKMEANOCCS8", o2::soa::Index<>, // TrackWieghtMeanOccRboust - o2::aod::trackmeanocc::WeightMeanOccRobustT0V0PrimUnfm80, - o2::aod::trackmeanocc::WeightMeanOccRobustFDDT0V0PrimUnfm80, - o2::aod::trackmeanocc::WeightMeanOccRobustNtrackDetUnfm80, - o2::aod::trackmeanocc::WeightMeanOccRobustMultExtraTableUnfm80); + +DECLARE_SOA_TABLE(TmoTrackId, "AOD", "TMOTRACKID", o2::aod::trackmeanocc::TrackId); + +DECLARE_SOA_TABLE(TmoPrim, "AOD", "TMOPRIM", o2::soa::Index<>, // TrackMeanOccDet + o2::aod::trackmeanocc::TmoPrimUnfm80); + +DECLARE_SOA_TABLE(TmoT0V0, "AOD", "TMOT0V0", o2::soa::Index<>, // TrackMeanOccDet + o2::aod::trackmeanocc::TmoFV0AUnfm80, + o2::aod::trackmeanocc::TmoFV0CUnfm80, + o2::aod::trackmeanocc::TmoFT0AUnfm80, + o2::aod::trackmeanocc::TmoFT0CUnfm80); + +DECLARE_SOA_TABLE(TmoFDD, "AOD", "TMOFDD", o2::soa::Index<>, // TrackMeanOccDet + o2::aod::trackmeanocc::TmoFDDAUnfm80, + o2::aod::trackmeanocc::TmoFDDCUnfm80); + +DECLARE_SOA_TABLE(TmoNTrackDet, "AOD", "TMONTRACKDET", o2::soa::Index<>, // TrackMeanOccNtrackDet + o2::aod::trackmeanocc::TmoNTrackITSUnfm80, + o2::aod::trackmeanocc::TmoNTrackTPCUnfm80, + o2::aod::trackmeanocc::TmoNTrackTRDUnfm80, + o2::aod::trackmeanocc::TmoNTrackTOFUnfm80, + o2::aod::trackmeanocc::TmoNTrackSizeUnfm80, + o2::aod::trackmeanocc::TmoNTrackTPCAUnfm80, + o2::aod::trackmeanocc::TmoNTrackTPCCUnfm80, + o2::aod::trackmeanocc::TmoNTrackITSTPCUnfm80, + o2::aod::trackmeanocc::TmoNTrackITSTPCAUnfm80, + o2::aod::trackmeanocc::TmoNTrackITSTPCCUnfm80); + +DECLARE_SOA_TABLE(TmoMultExtra, "AOD", "TMOMULTEXTRA", o2::soa::Index<>, // TrackMeanOccMultExtra + o2::aod::trackmeanocc::TmoMultNTracksHasITSUnfm80, + o2::aod::trackmeanocc::TmoMultNTracksHasTPCUnfm80, + o2::aod::trackmeanocc::TmoMultNTracksHasTOFUnfm80, + o2::aod::trackmeanocc::TmoMultNTracksHasTRDUnfm80, + o2::aod::trackmeanocc::TmoMultNTracksITSOnlyUnfm80, + o2::aod::trackmeanocc::TmoMultNTracksTPCOnlyUnfm80, + o2::aod::trackmeanocc::TmoMultNTracksITSTPCUnfm80, + o2::aod::trackmeanocc::TmoMultAllTracksTPCOnlyUnfm80); + +DECLARE_SOA_TABLE(TmoRT0V0Prim, "AOD", "TMORT0V0PRIM", o2::soa::Index<>, + o2::aod::trackmeanocc::TmoRobustT0V0PrimUnfm80); + +DECLARE_SOA_TABLE(TmoRFDDT0V0Prim, "AOD", "TMORFDDT0V0PRIM", o2::soa::Index<>, + o2::aod::trackmeanocc::TmoRobustFDDT0V0PrimUnfm80); + +DECLARE_SOA_TABLE(TmoRNtrackDet, "AOD", "TMORNTRACKDET", o2::soa::Index<>, + o2::aod::trackmeanocc::TmoRobustNtrackDetUnfm80); + +DECLARE_SOA_TABLE(TmoRMultExtra, "AOD", "TMORMULTEXTRA", o2::soa::Index<>, + o2::aod::trackmeanocc::TmoRobustMultExtraTableUnfm80); + +DECLARE_SOA_TABLE(TwmoPrim, "AOD", "TWMOPRIM", o2::soa::Index<>, // WeightTrackMeanOcc + o2::aod::trackmeanocc::TwmoPrimUnfm80); + +DECLARE_SOA_TABLE(TwmoT0V0, "AOD", "TWMOT0V0", o2::soa::Index<>, // WeightTrackMeanOccDet + o2::aod::trackmeanocc::TwmoFV0AUnfm80, + o2::aod::trackmeanocc::TwmoFV0CUnfm80, + o2::aod::trackmeanocc::TwmoFT0AUnfm80, + o2::aod::trackmeanocc::TwmoFT0CUnfm80); + +DECLARE_SOA_TABLE(TwmoFDD, "AOD", "TWMOFDD", o2::soa::Index<>, // WeightTrackMeanOccDet + o2::aod::trackmeanocc::TwmoFDDAUnfm80, + o2::aod::trackmeanocc::TwmoFDDCUnfm80); + +DECLARE_SOA_TABLE(TwmoNTrackDet, "AOD", "TWMONTRACKDET", o2::soa::Index<>, // WeightTrackMeanOccTrackMult + o2::aod::trackmeanocc::TwmoNTrackITSUnfm80, + o2::aod::trackmeanocc::TwmoNTrackTPCUnfm80, + o2::aod::trackmeanocc::TwmoNTrackTRDUnfm80, + o2::aod::trackmeanocc::TwmoNTrackTOFUnfm80, + o2::aod::trackmeanocc::TwmoNTrackSizeUnfm80, + o2::aod::trackmeanocc::TwmoNTrackTPCAUnfm80, + o2::aod::trackmeanocc::TwmoNTrackTPCCUnfm80, + o2::aod::trackmeanocc::TwmoNTrackITSTPCUnfm80, + o2::aod::trackmeanocc::TwmoNTrackITSTPCAUnfm80, + o2::aod::trackmeanocc::TwmoNTrackITSTPCCUnfm80); + +DECLARE_SOA_TABLE(TwmoMultExtra, "AOD", "TWMOMULTEXTRA", o2::soa::Index<>, // WeightTrackMeanOccMultExtra + o2::aod::trackmeanocc::TwmoMultNTracksHasITSUnfm80, + o2::aod::trackmeanocc::TwmoMultNTracksHasTPCUnfm80, + o2::aod::trackmeanocc::TwmoMultNTracksHasTOFUnfm80, + o2::aod::trackmeanocc::TwmoMultNTracksHasTRDUnfm80, + o2::aod::trackmeanocc::TwmoMultNTracksITSOnlyUnfm80, + o2::aod::trackmeanocc::TwmoMultNTracksTPCOnlyUnfm80, + o2::aod::trackmeanocc::TwmoMultNTracksITSTPCUnfm80, + o2::aod::trackmeanocc::TwmoMultAllTracksTPCOnlyUnfm80); + +DECLARE_SOA_TABLE(TwmoRT0V0Prim, "AOD", "TWMORT0V0PRIM", o2::soa::Index<>, + o2::aod::trackmeanocc::TwmoRobustT0V0PrimUnfm80); + +DECLARE_SOA_TABLE(TwmoRFDDT0V0Pri, "AOD", "TWMORFDDT0V0PRI", o2::soa::Index<>, + o2::aod::trackmeanocc::TwmoRobustFDDT0V0PrimUnfm80); + +DECLARE_SOA_TABLE(TwmoRNtrackDet, "AOD", "TWMORNTRACKDET", o2::soa::Index<>, + o2::aod::trackmeanocc::TwmoRobustNtrackDetUnfm80); + +DECLARE_SOA_TABLE(TwmoRMultExtra, "AOD", "TWMORMULTEXTRA", o2::soa::Index<>, + o2::aod::trackmeanocc::TwmoRobustMultExtraTableUnfm80); + } // namespace o2::aod #endif // COMMON_DATAMODEL_OCCUPANCYTABLES_H_ diff --git a/Common/TableProducer/occupancyTableProducer.cxx b/Common/TableProducer/occupancyTableProducer.cxx index ce56bfda149..2e4a01ddbb1 100644 --- a/Common/TableProducer/occupancyTableProducer.cxx +++ b/Common/TableProducer/occupancyTableProducer.cxx @@ -19,6 +19,7 @@ #include #include #include +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -48,80 +49,100 @@ int32_t nBCsPerOrbit = o2::constants::lhc::LHCMaxBunches; // const int nBCinTFgrp80 = 1425; // nOrbitsPerTF = run < 534133 ? 128 : 32; // for 128 => nBCsPerTF = 456192 , for 32 => nBCsPerTF = 114048 -const int nBCinTF = 114048; /// CCDB value // to be obtained from CCDB in future +// const int nBCinTF = 114048; /// CCDB value // to be obtained from CCDB in future const int nBCinDrift = 114048 / 32; /// to get from ccdb in future -const int arraySize = 10; // Max no timeframes that can be present in a dataframe struct OccupancyTableProducer { Service ccdb; // declare production of tables - Produces genOccIndexTable; Produces genBCTFinfoTable; + // 0 + Produces genOccIndexTable; Produces genOccsBCsList; - - Produces genOccsDet; - Produces genOccsTrackMult; + // 1 + Produces genOccsPrim; + Produces genOccsMeanPrim; + // 2 + Produces genOccsT0V0; + Produces genOccsMeanT0V0; + ; + Produces genORT0V0Prim; + Produces genOccsMeanRobustT0V0Prim; + // 3 + Produces genOccsFDD; + Produces genOccsMeanFDD; + Produces genORFDDT0V0Prim; + Produces genOccsMeanRobustFDDT0V0Prim; + // 4 + Produces genOccsNTrackDet; + Produces genOccsMeanNTrkDet; + Produces genORNtrackDet; + Produces genOccsMeanRobustNtrackDet; + // 5 Produces genOccsMultExtra; - Produces genOccsRobust; - - Produces genOccsMeanDet; - Produces genOccsMeanTrkMult; Produces genOccsMnMultExtra; - Produces genOccsMeanRobust; + Produces genORMultExtra; + Produces genOccsMeanRobustMultExtraTable; Configurable customOrbitOffset{"customOrbitOffset", 0, "customOrbitOffset for MC"}; - Configurable grouping{"grouping", 80, "grouping of BCs"}; + Configurable bcGrouping{"bcGrouping", 80, "bcGrouping of BCs"}; + Configurable nBCinTF{"nBCinTF", 114048, "nBCinTF"}; + Configurable occVecArraySize{"occVecArraySize", 10, "occVecArraySize"}; - Configurable buildOccIndexTable{"buildOccIndexTable", true, "builder of table OccIndexTable"}; - Configurable buildBCTFinfoTable{"buildBCTFinfoTable", true, "builder of table BCTFinfoTable"}; - Configurable buildOccsBCsList{"buildOccsBCsList", true, "builder of table OccsBCsList"}; + Configurable cfgNOrbitsPerTF0RunValue{"cfgNOrbitsPerTF0RunValue", 534133, "cfgNOrbitsPerTF0RunValue"}; + Configurable cfgNOrbitsPerTF1TrueValue{"cfgNOrbitsPerTF1TrueValue", 128, "cfgNOrbitsPerTF1TrueValue"}; + Configurable cfgNOrbitsPerTF2FalseValue{"cfgNOrbitsPerTF2FalseValue", 32, "ccfgNOrbitsPerTF2FalseValue"}; - Configurable buildOccsDet{"buildOccsDet", true, "builder of table OccsDet"}; - Configurable buildOccsTrackMult{"buildOccsTrackMult", true, "builder of table OccsTrackMult"}; - Configurable buildOccsMultExtra{"buildOccsMultExtra", true, "builder of table OccsMultExtra"}; - Configurable buildOccsRobust{"buildOccsRobust", true, "builder of table OccsRobust"}; - - Configurable buildOccsMeanDet{"buildOccsMeanDet", true, "builder of table OccsMeanDet"}; - Configurable buildOccsMeanTrkMult{"buildOccsMeanTrkMult", true, "builder of table OccsMeanTrkMult"}; - Configurable buildOccsMnMultExtra{"buildOccsMnMultExtra", true, "builder of table OccsMnMultExtra"}; - Configurable buildOccsMeanRobust{"buildOccsMeanRobust", true, "builder of table OccsMeanRobust"}; + // declare production of tables + Configurable buildOnlyOccsPrim{"buildOnlyOccsPrim", true, "builder of table OccsPrim"}; + Configurable buildOnlyOccsT0V0Prim{"buildOnlyOccsT0V0Prim", true, "builder of table OccsT0V0Prim"}; + Configurable buildOnlyOccsFDDT0V0Prim{"buildOnlyOccsFDDT0V0Prim", true, "builder of table OccsFDDT0V0Prim"}; + Configurable buildOnlyOccsNtrackDet{"buildOnlyOccsNtrackDet", true, "builder of table OccsNtrackDet"}; + Configurable buildOnlyOccsMultExtra{"buildOnlyOccsMultExtra", true, "builder of table OccsMultExtra"}; + Configurable buildFullOccTableProducer{"buildFullOccTableProducer", true, "builder of all Occupancy Tables"}; + + Configurable buildFlag00OccTable{"buildFlag00OccTable", true, "switch of table Occ Table"}; + Configurable buildFlag01OccMeanTable{"buildFlag01OccMeanTable", true, "switch of table Occ MeanTable"}; + Configurable buildFlag02OccRobustTable{"buildFlag02OccRobustTable", true, "switch of table Occ RobustTable"}; + Configurable buildFlag03OccMeanRobustTable{"buildFlag03OccMeanRobustTable", true, "switch of table Occ MeanRobustTable"}; // Histogram registry; HistogramRegistry recoEvent{"recoEvent", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry occupancyQA{"occupancyQA", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; - // Data Structures for Occupancy estimation - std::array tfList; - std::array, arraySize> bcTFMap; - std::array, arraySize> occPrimUnfm80; - std::array, arraySize> occFV0AUnfm80; - std::array, arraySize> occFV0CUnfm80; - std::array, arraySize> occFT0AUnfm80; - std::array, arraySize> occFT0CUnfm80; - std::array, arraySize> occFDDAUnfm80; - std::array, arraySize> occFDDCUnfm80; - - std::array, arraySize> occNTrackITSUnfm80; - std::array, arraySize> occNTrackTPCUnfm80; - std::array, arraySize> occNTrackTRDUnfm80; - std::array, arraySize> occNTrackTOFUnfm80; - std::array, arraySize> occNTrackSizeUnfm80; - std::array, arraySize> occNTrackTPCAUnfm80; - std::array, arraySize> occNTrackTPCCUnfm80; - std::array, arraySize> occNTrackITSTPCUnfm80; - std::array, arraySize> occNTrackITSTPCAUnfm80; - std::array, arraySize> occNTrackITSTPCCUnfm80; - - std::array, arraySize> occMultNTracksHasITSUnfm80; - std::array, arraySize> occMultNTracksHasTPCUnfm80; - std::array, arraySize> occMultNTracksHasTOFUnfm80; - std::array, arraySize> occMultNTracksHasTRDUnfm80; - std::array, arraySize> occMultNTracksITSOnlyUnfm80; - std::array, arraySize> occMultNTracksTPCOnlyUnfm80; - std::array, arraySize> occMultNTracksITSTPCUnfm80; - std::array, arraySize> occMultAllTracksTPCOnlyUnfm80; + std::vector tfList; + std::vector> bcTFMap; + + std::vector> occPrimUnfm80; + std::vector> occFV0AUnfm80; + std::vector> occFV0CUnfm80; + std::vector> occFT0AUnfm80; + std::vector> occFT0CUnfm80; + + std::vector> occFDDAUnfm80; + std::vector> occFDDCUnfm80; + + std::vector> occNTrackITSUnfm80; + std::vector> occNTrackTPCUnfm80; + std::vector> occNTrackTRDUnfm80; + std::vector> occNTrackTOFUnfm80; + std::vector> occNTrackSizeUnfm80; + std::vector> occNTrackTPCAUnfm80; + std::vector> occNTrackTPCCUnfm80; + std::vector> occNTrackITSTPCUnfm80; + std::vector> occNTrackITSTPCAUnfm80; + std::vector> occNTrackITSTPCCUnfm80; + + std::vector> occMultNTracksHasITSUnfm80; + std::vector> occMultNTracksHasTPCUnfm80; + std::vector> occMultNTracksHasTOFUnfm80; + std::vector> occMultNTracksHasTRDUnfm80; + std::vector> occMultNTracksITSOnlyUnfm80; + std::vector> occMultNTracksTPCOnlyUnfm80; + std::vector> occMultNTracksITSTPCUnfm80; + std::vector> occMultAllTracksTPCOnlyUnfm80; std::vector vecRobustOccT0V0PrimUnfm80; std::vector vecRobustOccFDDT0V0PrimUnfm80; @@ -132,49 +153,114 @@ struct OccupancyTableProducer { std::vector> vecRobustOccNtrackDetUnfm80medianPosVec; std::vector> vecRobustOccmultTableUnfm80medianPosVec; + std::vector processStatus; + Configurable processStatusSize{"processStatusSize", 10, "processStatusSize"}; void init(InitContext const&) { - // Set size of the vectors - for (int i = 0; i < arraySize; i++) { - bcTFMap[i].resize(nBCinTF / 80); - occPrimUnfm80[i].resize(nBCinTF / 80); - occFV0AUnfm80[i].resize(nBCinTF / 80); - occFV0CUnfm80[i].resize(nBCinTF / 80); - occFT0AUnfm80[i].resize(nBCinTF / 80); - occFT0CUnfm80[i].resize(nBCinTF / 80); - occFDDAUnfm80[i].resize(nBCinTF / 80); - occFDDCUnfm80[i].resize(nBCinTF / 80); - - occNTrackITSUnfm80[i].resize(nBCinTF / 80); - occNTrackTPCUnfm80[i].resize(nBCinTF / 80); - occNTrackTRDUnfm80[i].resize(nBCinTF / 80); - occNTrackTOFUnfm80[i].resize(nBCinTF / 80); - occNTrackSizeUnfm80[i].resize(nBCinTF / 80); - occNTrackTPCAUnfm80[i].resize(nBCinTF / 80); - occNTrackTPCCUnfm80[i].resize(nBCinTF / 80); - occNTrackITSTPCUnfm80[i].resize(nBCinTF / 80); - occNTrackITSTPCAUnfm80[i].resize(nBCinTF / 80); - occNTrackITSTPCCUnfm80[i].resize(nBCinTF / 80); - - occMultNTracksHasITSUnfm80[i].resize(nBCinTF / 80); - occMultNTracksHasTPCUnfm80[i].resize(nBCinTF / 80); - occMultNTracksHasTOFUnfm80[i].resize(nBCinTF / 80); - occMultNTracksHasTRDUnfm80[i].resize(nBCinTF / 80); - occMultNTracksITSOnlyUnfm80[i].resize(nBCinTF / 80); - occMultNTracksTPCOnlyUnfm80[i].resize(nBCinTF / 80); - occMultNTracksITSTPCUnfm80[i].resize(nBCinTF / 80); - occMultAllTracksTPCOnlyUnfm80[i].resize(nBCinTF / 80); - } - - vecRobustOccT0V0PrimUnfm80.resize(nBCinTF / 80); - vecRobustOccFDDT0V0PrimUnfm80.resize(nBCinTF / 80); - vecRobustOccNtrackDetUnfm80.resize(nBCinTF / 80); - vecRobustOccmultTableUnfm80.resize(nBCinTF / 80); - - vecRobustOccT0V0PrimUnfm80medianPosVec.resize(nBCinTF / 80); // Median => one for odd and two for even entries - vecRobustOccFDDT0V0PrimUnfm80medianPosVec.resize(nBCinTF / 80); - vecRobustOccNtrackDetUnfm80medianPosVec.resize(nBCinTF / 80); - vecRobustOccmultTableUnfm80medianPosVec.resize(nBCinTF / 80); + processStatus.resize(processStatusSize); + for (uint i = 0; i < processStatusSize; i++) { + processStatus[i] = false; + } + + // outer vector resized at runtime + tfList.resize(occVecArraySize); + bcTFMap.resize(occVecArraySize); + + if (buildFullOccTableProducer || buildOnlyOccsPrim || buildOnlyOccsT0V0Prim || buildOnlyOccsFDDT0V0Prim || buildOnlyOccsNtrackDet || buildOnlyOccsMultExtra) { + occPrimUnfm80.resize(occVecArraySize); + } + if (buildFullOccTableProducer || buildOnlyOccsT0V0Prim || buildOnlyOccsFDDT0V0Prim) { + occFV0AUnfm80.resize(occVecArraySize); + occFV0CUnfm80.resize(occVecArraySize); + occFT0AUnfm80.resize(occVecArraySize); + occFT0CUnfm80.resize(occVecArraySize); + } + if (buildFullOccTableProducer || buildOnlyOccsFDDT0V0Prim) { + occFDDAUnfm80.resize(occVecArraySize); + occFDDCUnfm80.resize(occVecArraySize); + } + if (buildFullOccTableProducer || buildOnlyOccsNtrackDet) { + occNTrackITSUnfm80.resize(occVecArraySize); + occNTrackTPCUnfm80.resize(occVecArraySize); + occNTrackTRDUnfm80.resize(occVecArraySize); + occNTrackTOFUnfm80.resize(occVecArraySize); + occNTrackSizeUnfm80.resize(occVecArraySize); + occNTrackTPCAUnfm80.resize(occVecArraySize); + occNTrackTPCCUnfm80.resize(occVecArraySize); + occNTrackITSTPCAUnfm80.resize(occVecArraySize); + occNTrackITSTPCCUnfm80.resize(occVecArraySize); + } + if (buildFullOccTableProducer || buildOnlyOccsNtrackDet || buildOnlyOccsMultExtra) { + occNTrackITSTPCUnfm80.resize(occVecArraySize); + } + if (buildFullOccTableProducer || buildOnlyOccsMultExtra) { + occMultNTracksHasITSUnfm80.resize(occVecArraySize); + occMultNTracksHasTPCUnfm80.resize(occVecArraySize); + occMultNTracksHasTOFUnfm80.resize(occVecArraySize); + occMultNTracksHasTRDUnfm80.resize(occVecArraySize); + occMultNTracksITSOnlyUnfm80.resize(occVecArraySize); + occMultNTracksTPCOnlyUnfm80.resize(occVecArraySize); + occMultNTracksITSTPCUnfm80.resize(occVecArraySize); + occMultAllTracksTPCOnlyUnfm80.resize(occVecArraySize); + } + + for (int i = 0; i < occVecArraySize; i++) { + bcTFMap[i].resize(nBCinTF / bcGrouping); + if (buildFullOccTableProducer || buildOnlyOccsPrim || buildOnlyOccsT0V0Prim || buildOnlyOccsFDDT0V0Prim || buildOnlyOccsNtrackDet || buildOnlyOccsMultExtra) { + occPrimUnfm80[i].resize(nBCinTF / bcGrouping); + } + if (buildFullOccTableProducer || buildOnlyOccsT0V0Prim || buildOnlyOccsFDDT0V0Prim) { + occFV0AUnfm80[i].resize(nBCinTF / bcGrouping); + occFV0CUnfm80[i].resize(nBCinTF / bcGrouping); + occFT0AUnfm80[i].resize(nBCinTF / bcGrouping); + occFT0CUnfm80[i].resize(nBCinTF / bcGrouping); + } + if (buildFullOccTableProducer || buildOnlyOccsFDDT0V0Prim) { + occFDDAUnfm80[i].resize(nBCinTF / bcGrouping); + occFDDCUnfm80[i].resize(nBCinTF / bcGrouping); + } + if (buildFullOccTableProducer || buildOnlyOccsNtrackDet) { + occNTrackITSUnfm80[i].resize(nBCinTF / bcGrouping); + occNTrackTPCUnfm80[i].resize(nBCinTF / bcGrouping); + occNTrackTRDUnfm80[i].resize(nBCinTF / bcGrouping); + occNTrackTOFUnfm80[i].resize(nBCinTF / bcGrouping); + occNTrackSizeUnfm80[i].resize(nBCinTF / bcGrouping); + occNTrackTPCAUnfm80[i].resize(nBCinTF / bcGrouping); + occNTrackTPCCUnfm80[i].resize(nBCinTF / bcGrouping); + occNTrackITSTPCAUnfm80[i].resize(nBCinTF / bcGrouping); + occNTrackITSTPCCUnfm80[i].resize(nBCinTF / bcGrouping); + } + if (buildFullOccTableProducer || buildOnlyOccsNtrackDet || buildOnlyOccsMultExtra) { + occNTrackITSTPCUnfm80[i].resize(nBCinTF / bcGrouping); + } + if (buildFullOccTableProducer || buildOnlyOccsMultExtra) { + occMultNTracksHasITSUnfm80[i].resize(nBCinTF / bcGrouping); + occMultNTracksHasTPCUnfm80[i].resize(nBCinTF / bcGrouping); + occMultNTracksHasTOFUnfm80[i].resize(nBCinTF / bcGrouping); + occMultNTracksHasTRDUnfm80[i].resize(nBCinTF / bcGrouping); + occMultNTracksITSOnlyUnfm80[i].resize(nBCinTF / bcGrouping); + occMultNTracksTPCOnlyUnfm80[i].resize(nBCinTF / bcGrouping); + occMultNTracksITSTPCUnfm80[i].resize(nBCinTF / bcGrouping); + occMultAllTracksTPCOnlyUnfm80[i].resize(nBCinTF / bcGrouping); + } + } + + if (buildFullOccTableProducer || buildOnlyOccsT0V0Prim || buildFlag02OccRobustTable || buildFlag03OccMeanRobustTable) { + vecRobustOccT0V0PrimUnfm80.resize(nBCinTF / bcGrouping); + vecRobustOccT0V0PrimUnfm80medianPosVec.resize(nBCinTF / bcGrouping); // Median => one for odd and two for even entries + } + if (buildFullOccTableProducer || buildOnlyOccsFDDT0V0Prim || buildFlag02OccRobustTable || buildFlag03OccMeanRobustTable) { + vecRobustOccFDDT0V0PrimUnfm80.resize(nBCinTF / bcGrouping); + vecRobustOccFDDT0V0PrimUnfm80medianPosVec.resize(nBCinTF / bcGrouping); + } + if (buildFullOccTableProducer || buildOnlyOccsNtrackDet || buildFlag02OccRobustTable || buildFlag03OccMeanRobustTable) { + vecRobustOccNtrackDetUnfm80.resize(nBCinTF / bcGrouping); + vecRobustOccNtrackDetUnfm80medianPosVec.resize(nBCinTF / bcGrouping); + } + if (buildFullOccTableProducer || buildOnlyOccsMultExtra || buildFlag02OccRobustTable || buildFlag03OccMeanRobustTable) { + vecRobustOccmultTableUnfm80.resize(nBCinTF / bcGrouping); + vecRobustOccmultTableUnfm80medianPosVec.resize(nBCinTF / bcGrouping); + } // Getting Info from CCDB, to be implemented Later recoEvent.add("h_nBCinTF", "h_nBCinTF(to check nBCinTF)", {HistType::kTH1F, {{100, 114040, 114060}}}); // 114048 @@ -183,8 +269,13 @@ struct OccupancyTableProducer { recoEvent.add("h_RO_FDDT0V0PrimUnfm80", "h_RO_FDDT0V0PrimUnfm80:median contributors", {HistType::kTH1F, {{12 * 2, -1, 11}}}); recoEvent.add("h_RO_NtrackDetUnfm80", "h_RO_NtrackDetITS/TPC/TRD/TOF_80:median contributors", {HistType::kTH1F, {{12 * 2, -1, 11}}}); recoEvent.add("h_RO_multTableUnfm80", "h_RO_multTableExtra_80:median contributors", {HistType::kTH1F, {{12 * 2, -1, 11}}}); + occupancyQA.add("h_TF_in_DataFrame", "h_TF_in_DataFrame", kTH1F, {{50, -1, 49}}); + occupancyQA.add("h_DFcount_Lvl0", "h_DFcount_Lvl0", kTH1F, {{1, 0, 1}}); + occupancyQA.add("h_DFcount_Lvl1", "h_DFcount_Lvl1", kTH1F, {{1, 0, 1}}); + occupancyQA.add("h_DFcount_Lvl2", "h_DFcount_Lvl2", kTH1F, {{1, 0, 1}}); recoEvent.print(); + occupancyQA.print(); } void normalizeVector(std::vector& OriginalVec, const float& scaleFactor) @@ -218,8 +309,9 @@ struct OccupancyTableProducer { }); double median; + int two = 2; // Find the median - if (n % 2 == 0) { + if (n % two == 0) { median = (data[(n - 1) / 2][0] + data[(n - 1) / 2 + 1][0]) / 2; medianPosVec[i][0] = static_cast(data[(n - 1) / 2][1] + 0.001); medianPosVec[i][1] = static_cast(data[(n - 1) / 2 + 1][1] + 0.001); @@ -238,7 +330,7 @@ struct OccupancyTableProducer { int64_t tsSOR = runDuration.first; auto ctpx = ccdb->getForTimeStamp>("CTP/Calib/OrbitReset", tsSOR); int64_t tsOrbitReset = (*ctpx)[0]; - uint32_t nOrbitsPerTF = run < 534133 ? 128 : 32; + uint32_t nOrbitsPerTF = run < cfgNOrbitsPerTF0RunValue ? cfgNOrbitsPerTF1TrueValue : cfgNOrbitsPerTF2FalseValue; int64_t orbitSOR = (tsSOR * 1000 - tsOrbitReset) / o2::constants::lhc::LHCOrbitMUS; orbitSOR = orbitSOR / nOrbitsPerTF * nOrbitsPerTF; bcSOR = orbitSOR * nBCsPerOrbit + customOrbitOffset * nBCsPerOrbit; // customOrbitOffset is a configurable @@ -259,8 +351,7 @@ struct OccupancyTableProducer { bcInTF = (bc.globalBC() - bcSOR) % nBCsPerTF; } - using MyCollisions = soa::Join; - using MyTracks = soa::Join; + using MyTracks = aod::Tracks; Preslice tracksPerCollisionPreslice = o2::aod::track::collisionId; @@ -273,72 +364,149 @@ struct OccupancyTableProducer { uint tfCounted = 0; int tfIDX = 0; int lastRun = -999; + //_________________________Full Exection Function_______________________________________________________________________________________ + + enum ProcessTags { + kProcessOnlyBCTFinfoTable = 0, + kProcessOnlyOccPrim, + kProcessOnlyOccT0V0Prim, + kProcessOnlyOccFDDT0V0Prim, + kProcessOnlyOccNtrackDet, + kProcessOnlyOccMultExtra, + kProcessFullOccTableProducer + }; - // Process the Data - void process(o2::aod::BCsWithTimestamps const& BCs, MyCollisions const& collisions, MyTracks const& tracks) // aod::TracksQA const& tracksQA, o2::aod::Origins const& Origins //tables only used during debugging - { - // dfCount++;LOG(info) << "DEBUG 1 :: df_" << dfCount ;//<< " :: DF_" << Origins.begin().dataframeID() << " :: collisions.size() = " << collisions.size() << " :: tracks.size() = " << tracks.size() << " :: tracksQA.size() = " << tracksQA.size() << " :: BCs.size() = " << BCs.size(); + static constexpr std::string_view ProcessNames[]{ + "processOnlyBCTFinfoTable", + "processOnlyOccPrimUnfm", + "processOnlyOccT0V0PrimUnfm", + "processOnlyOccFDDT0V0PrimUnfm", + "processOnlyOccNtrackDet", + "processOnlyOccMultExtra", + "processFullOccTableProduer"}; + + enum FillMode { + checkTableMode = 0, + doNotFill, + fillOccTable, + fillMeanOccTable, + fillOccRobustTable, + fillOccMeanRobustTable + }; + template + void executeCollisionCheckAndBCprocessing(B const& BCs, C const& collisions, bool& collisionsSizeIsZero) + { if (collisions.size() == 0) { for (const auto& BC : BCs) { // For BCs and OccIndexTable to have same size for joining getTimingInfo(BC, lastRun, nBCsPerTF, bcSOR, time, tfIdThis, bcInTF); - genOccIndexTable(BC.globalIndex(), -999); // BCId, OccId genBCTFinfoTable(tfIdThis, bcInTF); + genOccIndexTable(BC.globalIndex(), -999); // BCId, OccId + } + collisionsSizeIsZero = true; + } + } + + int processTimeCounter = 0; + template + void executeOccProducerProcessing(B const& BCs, C const& collisions, T const& tracks) + { + if (tableMode == checkTableMode) { + if (buildFlag00OccTable) { + executeOccProducerProcessing(BCs, collisions, tracks); + } else { + executeOccProducerProcessing(BCs, collisions, tracks); } + } + if constexpr (tableMode == checkTableMode) { + return; + } + + if (meanTableMode == checkTableMode) { + if (buildFlag01OccMeanTable) { + executeOccProducerProcessing(BCs, collisions, tracks); + } else { + executeOccProducerProcessing(BCs, collisions, tracks); + } + } + if constexpr (meanTableMode == checkTableMode) { return; } - // Initialisze the vectors components to zero - tfIDX = 0; - tfCounted = 0; - for (int i = 0; i < arraySize; i++) { - tfList[i] = -1; - bcTFMap[i].clear(); // list of BCs used in one time frame; - std::fill(occPrimUnfm80[i].begin(), occPrimUnfm80[i].end(), 0.); - std::fill(occFV0AUnfm80[i].begin(), occFV0AUnfm80[i].end(), 0.); - std::fill(occFV0CUnfm80[i].begin(), occFV0CUnfm80[i].end(), 0.); - std::fill(occFT0AUnfm80[i].begin(), occFT0AUnfm80[i].end(), 0.); - std::fill(occFT0CUnfm80[i].begin(), occFT0CUnfm80[i].end(), 0.); - std::fill(occFDDAUnfm80[i].begin(), occFDDAUnfm80[i].end(), 0.); - std::fill(occFDDCUnfm80[i].begin(), occFDDCUnfm80[i].end(), 0.); - - std::fill(occNTrackITSUnfm80[i].begin(), occNTrackITSUnfm80[i].end(), 0.); - std::fill(occNTrackTPCUnfm80[i].begin(), occNTrackTPCUnfm80[i].end(), 0.); - std::fill(occNTrackTRDUnfm80[i].begin(), occNTrackTRDUnfm80[i].end(), 0.); - std::fill(occNTrackTOFUnfm80[i].begin(), occNTrackTOFUnfm80[i].end(), 0.); - std::fill(occNTrackSizeUnfm80[i].begin(), occNTrackSizeUnfm80[i].end(), 0.); - std::fill(occNTrackTPCAUnfm80[i].begin(), occNTrackTPCAUnfm80[i].end(), 0.); - std::fill(occNTrackTPCCUnfm80[i].begin(), occNTrackTPCCUnfm80[i].end(), 0.); - std::fill(occNTrackITSTPCUnfm80[i].begin(), occNTrackITSTPCUnfm80[i].end(), 0.); - std::fill(occNTrackITSTPCAUnfm80[i].begin(), occNTrackITSTPCAUnfm80[i].end(), 0.); - std::fill(occNTrackITSTPCCUnfm80[i].begin(), occNTrackITSTPCCUnfm80[i].end(), 0.); - - std::fill(occMultNTracksHasITSUnfm80[i].begin(), occMultNTracksHasITSUnfm80[i].end(), 0.); - std::fill(occMultNTracksHasTPCUnfm80[i].begin(), occMultNTracksHasTPCUnfm80[i].end(), 0.); - std::fill(occMultNTracksHasTOFUnfm80[i].begin(), occMultNTracksHasTOFUnfm80[i].end(), 0.); - std::fill(occMultNTracksHasTRDUnfm80[i].begin(), occMultNTracksHasTRDUnfm80[i].end(), 0.); - std::fill(occMultNTracksITSOnlyUnfm80[i].begin(), occMultNTracksITSOnlyUnfm80[i].end(), 0.); - std::fill(occMultNTracksTPCOnlyUnfm80[i].begin(), occMultNTracksTPCOnlyUnfm80[i].end(), 0.); - std::fill(occMultNTracksITSTPCUnfm80[i].begin(), occMultNTracksITSTPCUnfm80[i].end(), 0.); - std::fill(occMultAllTracksTPCOnlyUnfm80[i].begin(), occMultAllTracksTPCOnlyUnfm80[i].end(), 0.); - } - - std::vector tfIDList; - for (const auto& collision : collisions) { - const auto& bc = collision.bc_as(); - getTimingInfo(bc, lastRun, nBCsPerTF, bcSOR, time, tfIdThis, bcInTF); - - recoEvent.fill(HIST("h_nBCinTF"), nBCsPerTF); - recoEvent.fill(HIST("h_bcInTF"), bcInTF); - - if (nBCsPerTF > nBCinTF) { - LOG(error) << "DEBUG :: FATAL ERROR :: nBCsPerTF > nBCinTF i.e " << nBCsPerTF << " > " << nBCinTF << " will cause crash in further process"; - return; + if (robustTableMode == checkTableMode) { + if (buildFlag02OccRobustTable) { + executeOccProducerProcessing(BCs, collisions, tracks); + } else { + executeOccProducerProcessing(BCs, collisions, tracks); + } + } + if constexpr (robustTableMode == checkTableMode) { + return; + } + + if (meanRobustTableMode == checkTableMode) { + if (buildFlag03OccMeanRobustTable) { + executeOccProducerProcessing(BCs, collisions, tracks); + } else { + executeOccProducerProcessing(BCs, collisions, tracks); } + } + if constexpr (meanRobustTableMode == checkTableMode) { + return; + } + + if constexpr (tableMode == checkTableMode || meanTableMode == checkTableMode || robustTableMode == checkTableMode || meanRobustTableMode == checkTableMode) { + return; + } else { + + occupancyQA.fill(HIST("h_DFcount_Lvl2"), 0.5); - const uint64_t collIdx = collision.globalIndex(); - const auto tracksTablePerColl = tracks.sliceBy(tracksPerCollisionPreslice, collIdx); + // Initialisze the vectors components to zero + tfIDX = 0; + tfCounted = 0; + for (int i = 0; i < occVecArraySize; i++) { + tfList[i] = -1; + bcTFMap[i].clear(); // list of BCs used in one time frame; + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccPrim || processMode == kProcessOnlyOccT0V0Prim || processMode == kProcessOnlyOccFDDT0V0Prim || processMode == kProcessOnlyOccNtrackDet || processMode == kProcessOnlyOccMultExtra) { + std::fill(occPrimUnfm80[i].begin(), occPrimUnfm80[i].end(), 0.); + } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccT0V0Prim || processMode == kProcessOnlyOccFDDT0V0Prim) { + std::fill(occFV0AUnfm80[i].begin(), occFV0AUnfm80[i].end(), 0.); + std::fill(occFV0CUnfm80[i].begin(), occFV0CUnfm80[i].end(), 0.); + std::fill(occFT0AUnfm80[i].begin(), occFT0AUnfm80[i].end(), 0.); + std::fill(occFT0CUnfm80[i].begin(), occFT0CUnfm80[i].end(), 0.); + } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccFDDT0V0Prim) { + std::fill(occFDDAUnfm80[i].begin(), occFDDAUnfm80[i].end(), 0.); + std::fill(occFDDCUnfm80[i].begin(), occFDDCUnfm80[i].end(), 0.); + } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccNtrackDet) { + std::fill(occNTrackITSUnfm80[i].begin(), occNTrackITSUnfm80[i].end(), 0.); + std::fill(occNTrackTPCUnfm80[i].begin(), occNTrackTPCUnfm80[i].end(), 0.); + std::fill(occNTrackTRDUnfm80[i].begin(), occNTrackTRDUnfm80[i].end(), 0.); + std::fill(occNTrackTOFUnfm80[i].begin(), occNTrackTOFUnfm80[i].end(), 0.); + std::fill(occNTrackSizeUnfm80[i].begin(), occNTrackSizeUnfm80[i].end(), 0.); + std::fill(occNTrackTPCAUnfm80[i].begin(), occNTrackTPCAUnfm80[i].end(), 0.); + std::fill(occNTrackTPCCUnfm80[i].begin(), occNTrackTPCCUnfm80[i].end(), 0.); + std::fill(occNTrackITSTPCAUnfm80[i].begin(), occNTrackITSTPCAUnfm80[i].end(), 0.); + std::fill(occNTrackITSTPCCUnfm80[i].begin(), occNTrackITSTPCCUnfm80[i].end(), 0.); + } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccNtrackDet || processMode == kProcessOnlyOccMultExtra) { + std::fill(occNTrackITSTPCUnfm80[i].begin(), occNTrackITSTPCUnfm80[i].end(), 0.); + } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccMultExtra) { + std::fill(occMultNTracksHasITSUnfm80[i].begin(), occMultNTracksHasITSUnfm80[i].end(), 0.); + std::fill(occMultNTracksHasTPCUnfm80[i].begin(), occMultNTracksHasTPCUnfm80[i].end(), 0.); + std::fill(occMultNTracksHasTOFUnfm80[i].begin(), occMultNTracksHasTOFUnfm80[i].end(), 0.); + std::fill(occMultNTracksHasTRDUnfm80[i].begin(), occMultNTracksHasTRDUnfm80[i].end(), 0.); + std::fill(occMultNTracksITSOnlyUnfm80[i].begin(), occMultNTracksITSOnlyUnfm80[i].end(), 0.); + std::fill(occMultNTracksTPCOnlyUnfm80[i].begin(), occMultNTracksTPCOnlyUnfm80[i].end(), 0.); + std::fill(occMultNTracksITSTPCUnfm80[i].begin(), occMultNTracksITSTPCUnfm80[i].end(), 0.); + std::fill(occMultAllTracksTPCOnlyUnfm80[i].begin(), occMultAllTracksTPCOnlyUnfm80[i].end(), 0.); + } + } + std::vector tfIDList; int nTrackITS = 0; int nTrackTPC = 0; int nTrackTRD = 0; @@ -348,380 +516,719 @@ struct OccupancyTableProducer { int nTrackITSTPCA = 0; int nTrackITSTPCC = 0; - for (const auto& track : tracksTablePerColl) { - if (track.hasITS()) { - nTrackITS++; - } // Flag to check if track has a ITS match - if (track.hasTPC()) { - nTrackTPC++; - if (track.eta() <= 0.0) { - nTrackTPCA++; // includes tracks at eta zero as well. - } else { - nTrackTPCC++; + ushort fNumContrib = 0; + + float fMultFV0A = -99999, fMultFV0C = -99999; + float fMultFT0A = -99999, fMultFT0C = -99999; + float fMultFDDA = -99999, fMultFDDC = -99999; + + int fNTrackITS = -9999; + int fNTrackTPC = -9999; + int fNTrackTRD = -9999; + int fNTrackTOF = -9999; + int fNTrackTPCA = -9999; + int fNTrackTPCC = -9999; + int fNTrackSize = -9999; + int fNTrackITSTPC = -9999; + int fNTrackITSTPCA = -9999; + int fNTrackITSTPCC = -9999; + + decltype(&occPrimUnfm80[0]) tfOccPrimUnfm80 = nullptr; + decltype(&occFV0AUnfm80[0]) tfOccFV0AUnfm80 = nullptr; + decltype(&occFV0CUnfm80[0]) tfOccFV0CUnfm80 = nullptr; + decltype(&occFT0AUnfm80[0]) tfOccFT0AUnfm80 = nullptr; + decltype(&occFT0CUnfm80[0]) tfOccFT0CUnfm80 = nullptr; + + decltype(&occFDDAUnfm80[0]) tfOccFDDAUnfm80 = nullptr; + decltype(&occFDDCUnfm80[0]) tfOccFDDCUnfm80 = nullptr; + + decltype(&occNTrackITSTPCUnfm80[0]) tfOccNTrackITSTPCUnfm80 = nullptr; + + decltype(&occNTrackITSUnfm80[0]) tfOccNTrackITSUnfm80 = nullptr; + decltype(&occNTrackTPCUnfm80[0]) tfOccNTrackTPCUnfm80 = nullptr; + decltype(&occNTrackTRDUnfm80[0]) tfOccNTrackTRDUnfm80 = nullptr; + decltype(&occNTrackTOFUnfm80[0]) tfOccNTrackTOFUnfm80 = nullptr; + decltype(&occNTrackSizeUnfm80[0]) tfOccNTrackSizeUnfm80 = nullptr; + decltype(&occNTrackTPCAUnfm80[0]) tfOccNTrackTPCAUnfm80 = nullptr; + decltype(&occNTrackTPCCUnfm80[0]) tfOccNTrackTPCCUnfm80 = nullptr; + decltype(&occNTrackITSTPCAUnfm80[0]) tfOccNTrackITSTPCAUnfm80 = nullptr; + decltype(&occNTrackITSTPCCUnfm80[0]) tfOccNTrackITSTPCCUnfm80 = nullptr; + + decltype(&occMultNTracksHasITSUnfm80[0]) tfOccMultNTracksHasITSUnfm80 = nullptr; + decltype(&occMultNTracksHasTPCUnfm80[0]) tfOccMultNTracksHasTPCUnfm80 = nullptr; + decltype(&occMultNTracksHasTOFUnfm80[0]) tfOccMultNTracksHasTOFUnfm80 = nullptr; + decltype(&occMultNTracksHasTRDUnfm80[0]) tfOccMultNTracksHasTRDUnfm80 = nullptr; + decltype(&occMultNTracksITSOnlyUnfm80[0]) tfOccMultNTracksITSOnlyUnfm80 = nullptr; + decltype(&occMultNTracksTPCOnlyUnfm80[0]) tfOccMultNTracksTPCOnlyUnfm80 = nullptr; + decltype(&occMultNTracksITSTPCUnfm80[0]) tfOccMultNTracksITSTPCUnfm80 = nullptr; + decltype(&occMultAllTracksTPCOnlyUnfm80[0]) tfOccMultAllTracksTPCOnlyUnfm80 = nullptr; + + for (const auto& collision : collisions) { + const auto& bc = collision.template bc_as(); + getTimingInfo(bc, lastRun, nBCsPerTF, bcSOR, time, tfIdThis, bcInTF); + + recoEvent.fill(HIST("h_nBCinTF"), nBCsPerTF); + recoEvent.fill(HIST("h_bcInTF"), bcInTF); + + if (nBCsPerTF > nBCinTF) { + LOG(error) << "DEBUG :: FATAL ERROR :: nBCsPerTF > nBCinTF i.e " << nBCsPerTF << " > " << nBCinTF << " will cause crash in further process"; + } + + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccNtrackDet) { + const uint64_t collIdx = collision.globalIndex(); + const auto tracksTablePerColl = tracks.sliceBy(tracksPerCollisionPreslice, collIdx); + + fNTrackSize = tracksTablePerColl.size(); + + nTrackITS = 0; + nTrackTPC = 0; + nTrackTRD = 0; + nTrackTOF = 0; + nTrackTPCA = 0; + nTrackTPCC = 0; + nTrackITSTPCA = 0; + nTrackITSTPCC = 0; + for (const auto& track : tracksTablePerColl) { + if (track.hasITS()) { + nTrackITS++; + } // Flag to check if track has a ITS match + if (track.hasTPC()) { + nTrackTPC++; + if (track.eta() <= 0.0) { + nTrackTPCA++; // includes tracks at eta zero as well. + } else { + nTrackTPCC++; + } + } // Flag to check if track has a TPC match + if (track.hasTRD()) { + nTrackTRD++; + } // Flag to check if track has a TRD match + if (track.hasTOF()) { + nTrackTOF++; + } // Flag to check if track has a TOF measurement + if (track.hasITS() && track.hasTPC()) { + if (track.eta() <= 0.0) { + nTrackITSTPCA++; // includes tracks at eta zero as well. + } else { + nTrackITSTPCC++; + } + } + } // track loop + } + // if (collision.multNTracksTPCOnly() != 0) { + // LOG(error) << "DEBUG :: ERROR = multNTracksTPCOnly != 0" << collision.multNTracksTPCOnly(); + // return; + // } + // if (collision.multAllTracksITSTPC() != nTrackITSTPC) { + // LOG(error) << "DEBUG :: ERROR :: 10 multAllTracksITSTPC :: " << collision.multAllTracksITSTPC() << " != " << nTrackITSTPC; + // return; + // } + + tfIDList.push_back(tfIdThis); + + if (tfList[tfIDX] != tfIdThis) { + if (tfCounted != 0) { + tfIDX++; + } // + tfList[tfIDX] = tfIdThis; + tfCounted++; + } + + bcTFMap[tfIDX].push_back(bc.globalIndex()); + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccPrim || processMode == kProcessOnlyOccT0V0Prim || processMode == kProcessOnlyOccFDDT0V0Prim || processMode == kProcessOnlyOccNtrackDet || processMode == kProcessOnlyOccMultExtra) { + tfOccPrimUnfm80 = &occPrimUnfm80[tfIDX]; + } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccT0V0Prim || processMode == kProcessOnlyOccFDDT0V0Prim) { + tfOccFV0AUnfm80 = &occFV0AUnfm80[tfIDX]; + tfOccFV0CUnfm80 = &occFV0CUnfm80[tfIDX]; + tfOccFT0AUnfm80 = &occFT0AUnfm80[tfIDX]; + tfOccFT0CUnfm80 = &occFT0CUnfm80[tfIDX]; + } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccFDDT0V0Prim) { + tfOccFDDAUnfm80 = &occFDDAUnfm80[tfIDX]; + tfOccFDDCUnfm80 = &occFDDCUnfm80[tfIDX]; + } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccNtrackDet) { + tfOccNTrackITSUnfm80 = &occNTrackITSUnfm80[tfIDX]; + tfOccNTrackTPCUnfm80 = &occNTrackTPCUnfm80[tfIDX]; + tfOccNTrackTRDUnfm80 = &occNTrackTRDUnfm80[tfIDX]; + tfOccNTrackTOFUnfm80 = &occNTrackTOFUnfm80[tfIDX]; + tfOccNTrackSizeUnfm80 = &occNTrackSizeUnfm80[tfIDX]; + tfOccNTrackTPCAUnfm80 = &occNTrackTPCAUnfm80[tfIDX]; + tfOccNTrackTPCCUnfm80 = &occNTrackTPCCUnfm80[tfIDX]; + tfOccNTrackITSTPCAUnfm80 = &occNTrackITSTPCAUnfm80[tfIDX]; + tfOccNTrackITSTPCCUnfm80 = &occNTrackITSTPCCUnfm80[tfIDX]; + } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccNtrackDet || processMode == kProcessOnlyOccMultExtra) { + tfOccNTrackITSTPCUnfm80 = &occNTrackITSTPCUnfm80[tfIDX]; + } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccMultExtra) { + tfOccMultNTracksHasITSUnfm80 = &occMultNTracksHasITSUnfm80[tfIDX]; + tfOccMultNTracksHasTPCUnfm80 = &occMultNTracksHasTPCUnfm80[tfIDX]; + tfOccMultNTracksHasTOFUnfm80 = &occMultNTracksHasTOFUnfm80[tfIDX]; + tfOccMultNTracksHasTRDUnfm80 = &occMultNTracksHasTRDUnfm80[tfIDX]; + tfOccMultNTracksITSOnlyUnfm80 = &occMultNTracksITSOnlyUnfm80[tfIDX]; + tfOccMultNTracksTPCOnlyUnfm80 = &occMultNTracksTPCOnlyUnfm80[tfIDX]; + tfOccMultNTracksITSTPCUnfm80 = &occMultNTracksITSTPCUnfm80[tfIDX]; + tfOccMultAllTracksTPCOnlyUnfm80 = &occMultAllTracksTPCOnlyUnfm80[tfIDX]; + } + + // current collision bin in 80/160 bcGrouping. + int bin80Zero = bcInTF / bcGrouping; + // int bin160_0=bcInTF/160; + + // float fbin80Zero =float(bcInTF)/80; + // float fbin160_0=float(bcInTF)/160; + + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccPrim || processMode == kProcessOnlyOccT0V0Prim || processMode == kProcessOnlyOccFDDT0V0Prim || processMode == kProcessOnlyOccNtrackDet || processMode == kProcessOnlyOccMultExtra) { + fNumContrib = collision.numContrib(); // only aod::Collisions will be needed + } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccT0V0Prim || processMode == kProcessOnlyOccFDDT0V0Prim) { + fMultFV0A = collision.multFV0A(); + fMultFV0C = collision.multFV0C(); // o2::aod::Mults will be needed + fMultFT0A = collision.multFT0A(); + fMultFT0C = collision.multFT0C(); + } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccFDDT0V0Prim) { + fMultFDDA = collision.multFDDA(); + fMultFDDC = collision.multFDDC(); + } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccNtrackDet) { + fNTrackITS = nTrackITS; + fNTrackTPC = nTrackTPC; + fNTrackTRD = nTrackTRD; + fNTrackTOF = nTrackTOF; + fNTrackTPCA = nTrackTPCA; + fNTrackTPCC = nTrackTPCC; + fNTrackITSTPC = collision.multAllTracksITSTPC(); + fNTrackITSTPCA = nTrackITSTPCA; + fNTrackITSTPCC = nTrackITSTPCC; + } + // Processing for bcGrouping of 80 BCs + for (int deltaBin = 0; deltaBin < nBCinDrift / bcGrouping; deltaBin++) { + + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccPrim || processMode == kProcessOnlyOccT0V0Prim || processMode == kProcessOnlyOccFDDT0V0Prim || processMode == kProcessOnlyOccNtrackDet || processMode == kProcessOnlyOccMultExtra) { + (*tfOccPrimUnfm80)[(bin80Zero + deltaBin) % (nBCinTF / bcGrouping)] += fNumContrib * 1; + } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccT0V0Prim || processMode == kProcessOnlyOccFDDT0V0Prim) { + (*tfOccFV0AUnfm80)[(bin80Zero + deltaBin) % (nBCinTF / bcGrouping)] += fMultFV0A * 1; + (*tfOccFV0CUnfm80)[(bin80Zero + deltaBin) % (nBCinTF / bcGrouping)] += fMultFV0C * 1; + (*tfOccFT0AUnfm80)[(bin80Zero + deltaBin) % (nBCinTF / bcGrouping)] += fMultFT0A * 1; + (*tfOccFT0CUnfm80)[(bin80Zero + deltaBin) % (nBCinTF / bcGrouping)] += fMultFT0C * 1; + } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccFDDT0V0Prim) { + (*tfOccFDDAUnfm80)[(bin80Zero + deltaBin) % (nBCinTF / bcGrouping)] += fMultFDDA * 1; + (*tfOccFDDCUnfm80)[(bin80Zero + deltaBin) % (nBCinTF / bcGrouping)] += fMultFDDC * 1; + } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccNtrackDet) { + (*tfOccNTrackITSUnfm80)[(bin80Zero + deltaBin) % (nBCinTF / bcGrouping)] += fNTrackITS * 1; + (*tfOccNTrackTPCUnfm80)[(bin80Zero + deltaBin) % (nBCinTF / bcGrouping)] += fNTrackTPC * 1; + (*tfOccNTrackTRDUnfm80)[(bin80Zero + deltaBin) % (nBCinTF / bcGrouping)] += fNTrackTRD * 1; + (*tfOccNTrackTOFUnfm80)[(bin80Zero + deltaBin) % (nBCinTF / bcGrouping)] += fNTrackTOF * 1; + (*tfOccNTrackSizeUnfm80)[(bin80Zero + deltaBin) % (nBCinTF / bcGrouping)] += fNTrackSize * 1; + (*tfOccNTrackTPCAUnfm80)[(bin80Zero + deltaBin) % (nBCinTF / bcGrouping)] += fNTrackTPCA * 1; + (*tfOccNTrackTPCCUnfm80)[(bin80Zero + deltaBin) % (nBCinTF / bcGrouping)] += fNTrackTPCC * 1; + (*tfOccNTrackITSTPCAUnfm80)[(bin80Zero + deltaBin) % (nBCinTF / bcGrouping)] += fNTrackITSTPCA * 1; + (*tfOccNTrackITSTPCCUnfm80)[(bin80Zero + deltaBin) % (nBCinTF / bcGrouping)] += fNTrackITSTPCC * 1; } - } // Flag to check if track has a TPC match - if (track.hasTRD()) { - nTrackTRD++; - } // Flag to check if track has a TRD match - if (track.hasTOF()) { - nTrackTOF++; - } // Flag to check if track has a TOF measurement - if (track.hasITS() && track.hasTPC()) { - if (track.eta() <= 0.0) { - nTrackITSTPCA++; // includes tracks at eta zero as well. - } else { - nTrackITSTPCC++; + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccNtrackDet || processMode == kProcessOnlyOccMultExtra) { + (*tfOccNTrackITSTPCUnfm80)[(bin80Zero + deltaBin) % (nBCinTF / bcGrouping)] += fNTrackITSTPC * 1; + } + + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccMultExtra) { + (*tfOccMultNTracksHasITSUnfm80)[(bin80Zero + deltaBin) % (nBCinTF / bcGrouping)] += collision.multNTracksHasITS() * 1; + (*tfOccMultNTracksHasTPCUnfm80)[(bin80Zero + deltaBin) % (nBCinTF / bcGrouping)] += collision.multNTracksHasTPC() * 1; + (*tfOccMultNTracksHasTOFUnfm80)[(bin80Zero + deltaBin) % (nBCinTF / bcGrouping)] += collision.multNTracksHasTOF() * 1; + (*tfOccMultNTracksHasTRDUnfm80)[(bin80Zero + deltaBin) % (nBCinTF / bcGrouping)] += collision.multNTracksHasTRD() * 1; + (*tfOccMultNTracksITSOnlyUnfm80)[(bin80Zero + deltaBin) % (nBCinTF / bcGrouping)] += collision.multNTracksITSOnly() * 1; + (*tfOccMultNTracksTPCOnlyUnfm80)[(bin80Zero + deltaBin) % (nBCinTF / bcGrouping)] += collision.multNTracksTPCOnly() * 1; + (*tfOccMultNTracksITSTPCUnfm80)[(bin80Zero + deltaBin) % (nBCinTF / bcGrouping)] += collision.multNTracksITSTPC() * 1; + (*tfOccMultAllTracksTPCOnlyUnfm80)[(bin80Zero + deltaBin) % (nBCinTF / bcGrouping)] += collision.multAllTracksTPCOnly() * 1; } } - } // track loop - - // if (collision.multNTracksTPCOnly() != 0) { - // LOG(error) << "DEBUG :: ERROR = multNTracksTPCOnly != 0" << collision.multNTracksTPCOnly(); - // return; - // } - // if (collision.multAllTracksITSTPC() != nTrackITSTPC) { - // LOG(error) << "DEBUG :: ERROR :: 10 multAllTracksITSTPC :: " << collision.multAllTracksITSTPC() << " != " << nTrackITSTPC; - // return; - // } - - tfIDList.push_back(tfIdThis); - - if (tfList[tfIDX] != tfIdThis) { - if (tfCounted != 0) { - tfIDX++; - } // - tfList[tfIDX] = tfIdThis; - tfCounted++; } + // collision Loop is over - bcTFMap[tfIDX].push_back(bc.globalIndex()); - auto& tfOccPrimUnfm80 = occPrimUnfm80[tfIDX]; - auto& tfOccFV0AUnfm80 = occFV0AUnfm80[tfIDX]; - auto& tfOccFV0CUnfm80 = occFV0CUnfm80[tfIDX]; - auto& tfOccFT0AUnfm80 = occFT0AUnfm80[tfIDX]; - auto& tfOccFT0CUnfm80 = occFT0CUnfm80[tfIDX]; - auto& tfOccFDDAUnfm80 = occFDDAUnfm80[tfIDX]; - auto& tfOccFDDCUnfm80 = occFDDCUnfm80[tfIDX]; - - auto& tfOccNTrackITSUnfm80 = occNTrackITSUnfm80[tfIDX]; - auto& tfOccNTrackTPCUnfm80 = occNTrackTPCUnfm80[tfIDX]; - auto& tfOccNTrackTRDUnfm80 = occNTrackTRDUnfm80[tfIDX]; - auto& tfOccNTrackTOFUnfm80 = occNTrackTOFUnfm80[tfIDX]; - auto& tfOccNTrackSizeUnfm80 = occNTrackSizeUnfm80[tfIDX]; - auto& tfOccNTrackTPCAUnfm80 = occNTrackTPCAUnfm80[tfIDX]; - auto& tfOccNTrackTPCCUnfm80 = occNTrackTPCCUnfm80[tfIDX]; - auto& tfOccNTrackITSTPCUnfm80 = occNTrackITSTPCUnfm80[tfIDX]; - auto& tfOccNTrackITSTPCAUnfm80 = occNTrackITSTPCAUnfm80[tfIDX]; - auto& tfOccNTrackITSTPCCUnfm80 = occNTrackITSTPCCUnfm80[tfIDX]; - - auto& tfOccMultNTracksHasITSUnfm80 = occMultNTracksHasITSUnfm80[tfIDX]; - auto& tfOccMultNTracksHasTPCUnfm80 = occMultNTracksHasTPCUnfm80[tfIDX]; - auto& tfOccMultNTracksHasTOFUnfm80 = occMultNTracksHasTOFUnfm80[tfIDX]; - auto& tfOccMultNTracksHasTRDUnfm80 = occMultNTracksHasTRDUnfm80[tfIDX]; - auto& tfOccMultNTracksITSOnlyUnfm80 = occMultNTracksITSOnlyUnfm80[tfIDX]; - auto& tfOccMultNTracksTPCOnlyUnfm80 = occMultNTracksTPCOnlyUnfm80[tfIDX]; - auto& tfOccMultNTracksITSTPCUnfm80 = occMultNTracksITSTPCUnfm80[tfIDX]; - auto& tfOccMultAllTracksTPCOnlyUnfm80 = occMultAllTracksTPCOnlyUnfm80[tfIDX]; - - // current collision bin in 80/160 grouping. - int bin80Zero = bcInTF / 80; - // int bin160_0=bcInTF/160; - - // float fbin80Zero =float(bcInTF)/80; - // float fbin160_0=float(bcInTF)/160; - - ushort fNumContrib = collision.numContrib(); - float fMultFV0A = collision.multFV0A(), fMultFV0C = collision.multFV0C(); - float fMultFT0A = collision.multFT0A(), fMultFT0C = collision.multFT0C(); - float fMultFDDA = collision.multFDDA(), fMultFDDC = collision.multFDDC(); - int fNTrackITS = nTrackITS; - int fNTrackTPC = nTrackTPC, fNTrackTRD = nTrackTRD; - int fNTrackTOF = nTrackTOF; - int fNTrackTPCA = nTrackTPCA, fNTrackTPCC = nTrackTPCC; - int fNTrackITSTPC = collision.multAllTracksITSTPC(), fNTrackSize = tracksTablePerColl.size(); - int fNTrackITSTPCA = nTrackITSTPCA, fNTrackITSTPCC = nTrackITSTPCC; - - // Processing for grouping of 80 BCs - for (int deltaBin = 0; deltaBin < nBCinDrift / 80; deltaBin++) { - tfOccPrimUnfm80[(bin80Zero + deltaBin) % (nBCinTF / 80)] += fNumContrib * 1; - tfOccFV0AUnfm80[(bin80Zero + deltaBin) % (nBCinTF / 80)] += fMultFV0A * 1; - tfOccFV0CUnfm80[(bin80Zero + deltaBin) % (nBCinTF / 80)] += fMultFV0C * 1; - tfOccFT0AUnfm80[(bin80Zero + deltaBin) % (nBCinTF / 80)] += fMultFT0A * 1; - tfOccFT0CUnfm80[(bin80Zero + deltaBin) % (nBCinTF / 80)] += fMultFT0C * 1; - tfOccFDDAUnfm80[(bin80Zero + deltaBin) % (nBCinTF / 80)] += fMultFDDA * 1; - tfOccFDDCUnfm80[(bin80Zero + deltaBin) % (nBCinTF / 80)] += fMultFDDC * 1; - - tfOccNTrackITSUnfm80[(bin80Zero + deltaBin) % (nBCinTF / 80)] += fNTrackITS * 1; - tfOccNTrackTPCUnfm80[(bin80Zero + deltaBin) % (nBCinTF / 80)] += fNTrackTPC * 1; - tfOccNTrackTRDUnfm80[(bin80Zero + deltaBin) % (nBCinTF / 80)] += fNTrackTRD * 1; - tfOccNTrackTOFUnfm80[(bin80Zero + deltaBin) % (nBCinTF / 80)] += fNTrackTOF * 1; - tfOccNTrackSizeUnfm80[(bin80Zero + deltaBin) % (nBCinTF / 80)] += fNTrackSize * 1; - tfOccNTrackTPCAUnfm80[(bin80Zero + deltaBin) % (nBCinTF / 80)] += fNTrackTPCA * 1; - tfOccNTrackTPCCUnfm80[(bin80Zero + deltaBin) % (nBCinTF / 80)] += fNTrackTPCC * 1; - tfOccNTrackITSTPCUnfm80[(bin80Zero + deltaBin) % (nBCinTF / 80)] += fNTrackITSTPC * 1; - tfOccNTrackITSTPCAUnfm80[(bin80Zero + deltaBin) % (nBCinTF / 80)] += fNTrackITSTPCA * 1; - tfOccNTrackITSTPCCUnfm80[(bin80Zero + deltaBin) % (nBCinTF / 80)] += fNTrackITSTPCC * 1; - - tfOccMultNTracksHasITSUnfm80[(bin80Zero + deltaBin) % (nBCinTF / 80)] += collision.multNTracksHasITS() * 1; - tfOccMultNTracksHasTPCUnfm80[(bin80Zero + deltaBin) % (nBCinTF / 80)] += collision.multNTracksHasTPC() * 1; - tfOccMultNTracksHasTOFUnfm80[(bin80Zero + deltaBin) % (nBCinTF / 80)] += collision.multNTracksHasTOF() * 1; - tfOccMultNTracksHasTRDUnfm80[(bin80Zero + deltaBin) % (nBCinTF / 80)] += collision.multNTracksHasTRD() * 1; - tfOccMultNTracksITSOnlyUnfm80[(bin80Zero + deltaBin) % (nBCinTF / 80)] += collision.multNTracksITSOnly() * 1; - tfOccMultNTracksTPCOnlyUnfm80[(bin80Zero + deltaBin) % (nBCinTF / 80)] += collision.multNTracksTPCOnly() * 1; - tfOccMultNTracksITSTPCUnfm80[(bin80Zero + deltaBin) % (nBCinTF / 80)] += collision.multNTracksITSTPC() * 1; - tfOccMultAllTracksTPCOnlyUnfm80[(bin80Zero + deltaBin) % (nBCinTF / 80)] += collision.multAllTracksTPCOnly() * 1; - } - } - // collision Loop is over + occupancyQA.fill(HIST("h_TF_in_DataFrame"), tfCounted); - std::vector sortedTfIDList = tfIDList; - std::sort(sortedTfIDList.begin(), sortedTfIDList.end()); - auto last = std::unique(sortedTfIDList.begin(), sortedTfIDList.end()); - sortedTfIDList.erase(last, sortedTfIDList.end()); + std::vector sortedTfIDList = tfIDList; + std::sort(sortedTfIDList.begin(), sortedTfIDList.end()); + auto last = std::unique(sortedTfIDList.begin(), sortedTfIDList.end()); + sortedTfIDList.erase(last, sortedTfIDList.end()); - if (tfCounted != sortedTfIDList.size()) { - LOG(error) << "DEBUG :: Number mismatch for tf counted and filled :: " << tfCounted << " != " << sortedTfIDList.size(); - } + if (tfCounted != sortedTfIDList.size()) { + LOG(error) << "DEBUG :: Number mismatch for tf counted and filled :: " << tfCounted << " != " << sortedTfIDList.size(); + } - int totalBCcountSize = 0; - for (int i = 0; i < arraySize; i++) { - totalBCcountSize += bcTFMap[i].size(); - // check if the BCs are already sorted or not - if (!std::is_sorted(bcTFMap[i].begin(), bcTFMap[i].end())) { - LOG(debug) << "DEBUG :: ERROR :: BCs are not sorted"; + int totalBCcountSize = 0; + for (int i = 0; i < occVecArraySize; i++) { + totalBCcountSize += bcTFMap[i].size(); + // check if the BCs are already sorted or not + if (!std::is_sorted(bcTFMap[i].begin(), bcTFMap[i].end())) { + LOG(debug) << "DEBUG :: ERROR :: BCs are not sorted"; + } } - } - // - if (totalBCcountSize != collisions.size()) { - LOG(debug) << "DEBUG :: ERROR :: filled TF list and collision size mismatch :: filledTF_Size = " << totalBCcountSize << " != " << collisions.size() << " = collisions.size()"; - } - - // Fill the Producers - for (uint i = 0; i < tfCounted; i++) { - - auto& vecOccPrimUnfm80 = occPrimUnfm80[i]; - auto& vecOccFV0AUnfm80 = occFV0AUnfm80[i]; - auto& vecOccFV0CUnfm80 = occFV0CUnfm80[i]; - auto& vecOccFT0AUnfm80 = occFT0AUnfm80[i]; - auto& vecOccFT0CUnfm80 = occFT0CUnfm80[i]; - auto& vecOccFDDAUnfm80 = occFDDAUnfm80[i]; - auto& vecOccFDDCUnfm80 = occFDDCUnfm80[i]; - - auto& vecOccNTrackITSUnfm80 = occNTrackITSUnfm80[i]; - auto& vecOccNTrackTPCUnfm80 = occNTrackTPCUnfm80[i]; - auto& vecOccNTrackTRDUnfm80 = occNTrackTRDUnfm80[i]; - auto& vecOccNTrackTOFUnfm80 = occNTrackTOFUnfm80[i]; - auto& vecOccNTrackSizeUnfm80 = occNTrackSizeUnfm80[i]; - auto& vecOccNTrackTPCAUnfm80 = occNTrackTPCAUnfm80[i]; - auto& vecOccNTrackTPCCUnfm80 = occNTrackTPCCUnfm80[i]; - auto& vecOccNTrackITSTPCUnfm80 = occNTrackITSTPCUnfm80[i]; - auto& vecOccNTrackITSTPCAUnfm80 = occNTrackITSTPCAUnfm80[i]; - auto& vecOccNTrackITSTPCCUnfm80 = occNTrackITSTPCCUnfm80[i]; - - auto& vecOccMultNTracksHasITSUnfm80 = occMultNTracksHasITSUnfm80[i]; - auto& vecOccMultNTracksHasTPCUnfm80 = occMultNTracksHasTPCUnfm80[i]; - auto& vecOccMultNTracksHasTOFUnfm80 = occMultNTracksHasTOFUnfm80[i]; - auto& vecOccMultNTracksHasTRDUnfm80 = occMultNTracksHasTRDUnfm80[i]; - auto& vecOccMultNTracksITSOnlyUnfm80 = occMultNTracksITSOnlyUnfm80[i]; - auto& vecOccMultNTracksTPCOnlyUnfm80 = occMultNTracksTPCOnlyUnfm80[i]; - auto& vecOccMultNTracksITSTPCUnfm80 = occMultNTracksITSTPCUnfm80[i]; - auto& vecOccMultAllTracksTPCOnlyUnfm80 = occMultAllTracksTPCOnlyUnfm80[i]; - - float meanOccPrimUnfm80 = TMath::Mean(vecOccPrimUnfm80.size(), vecOccPrimUnfm80.data()); - float meanOccFV0AUnfm80 = TMath::Mean(vecOccFV0AUnfm80.size(), vecOccFV0AUnfm80.data()); - float meanOccFV0CUnfm80 = TMath::Mean(vecOccFV0CUnfm80.size(), vecOccFV0CUnfm80.data()); - float meanOccFT0AUnfm80 = TMath::Mean(vecOccFT0AUnfm80.size(), vecOccFT0AUnfm80.data()); - float meanOccFT0CUnfm80 = TMath::Mean(vecOccFT0CUnfm80.size(), vecOccFT0CUnfm80.data()); - float meanOccFDDAUnfm80 = TMath::Mean(vecOccFDDAUnfm80.size(), vecOccFDDAUnfm80.data()); - float meanOccFDDCUnfm80 = TMath::Mean(vecOccFDDCUnfm80.size(), vecOccFDDCUnfm80.data()); - - float meanOccNTrackITSUnfm80 = TMath::Mean(vecOccNTrackITSUnfm80.size(), vecOccNTrackITSUnfm80.data()); - float meanOccNTrackTPCUnfm80 = TMath::Mean(vecOccNTrackTPCUnfm80.size(), vecOccNTrackTPCUnfm80.data()); - float meanOccNTrackTRDUnfm80 = TMath::Mean(vecOccNTrackTRDUnfm80.size(), vecOccNTrackTRDUnfm80.data()); - float meanOccNTrackTOFUnfm80 = TMath::Mean(vecOccNTrackTOFUnfm80.size(), vecOccNTrackTOFUnfm80.data()); - float meanOccNTrackSizeUnfm80 = TMath::Mean(vecOccNTrackSizeUnfm80.size(), vecOccNTrackSizeUnfm80.data()); - float meanOccNTrackTPCAUnfm80 = TMath::Mean(vecOccNTrackTPCAUnfm80.size(), vecOccNTrackTPCAUnfm80.data()); - float meanOccNTrackTPCCUnfm80 = TMath::Mean(vecOccNTrackTPCCUnfm80.size(), vecOccNTrackTPCCUnfm80.data()); - float meanOccNTrackITSTPCUnfm80 = TMath::Mean(vecOccNTrackITSTPCUnfm80.size(), vecOccNTrackITSTPCUnfm80.data()); - float meanOccNTrackITSTPCAUnfm80 = TMath::Mean(vecOccNTrackITSTPCAUnfm80.size(), vecOccNTrackITSTPCAUnfm80.data()); - float meanOccNTrackITSTPCCUnfm80 = TMath::Mean(vecOccNTrackITSTPCCUnfm80.size(), vecOccNTrackITSTPCCUnfm80.data()); - - float meanOccMultNTracksHasITSUnfm80 = TMath::Mean(vecOccMultNTracksHasITSUnfm80.size(), vecOccMultNTracksHasITSUnfm80.data()); - float meanOccMultNTracksHasTPCUnfm80 = TMath::Mean(vecOccMultNTracksHasTPCUnfm80.size(), vecOccMultNTracksHasTPCUnfm80.data()); - float meanOccMultNTracksHasTOFUnfm80 = TMath::Mean(vecOccMultNTracksHasTOFUnfm80.size(), vecOccMultNTracksHasTOFUnfm80.data()); - float meanOccMultNTracksHasTRDUnfm80 = TMath::Mean(vecOccMultNTracksHasTRDUnfm80.size(), vecOccMultNTracksHasTRDUnfm80.data()); - float meanOccMultNTracksITSOnlyUnfm80 = TMath::Mean(vecOccMultNTracksITSOnlyUnfm80.size(), vecOccMultNTracksITSOnlyUnfm80.data()); - float meanOccMultNTracksTPCOnlyUnfm80 = TMath::Mean(vecOccMultNTracksTPCOnlyUnfm80.size(), vecOccMultNTracksTPCOnlyUnfm80.data()); - float meanOccMultNTracksITSTPCUnfm80 = TMath::Mean(vecOccMultNTracksITSTPCUnfm80.size(), vecOccMultNTracksITSTPCUnfm80.data()); - float meanOccMultAllTracksTPCOnlyUnfm80 = TMath::Mean(vecOccMultAllTracksTPCOnlyUnfm80.size(), vecOccMultAllTracksTPCOnlyUnfm80.data()); - - // Normalise the original vectors - normalizeVector(vecOccPrimUnfm80, meanOccPrimUnfm80 / meanOccPrimUnfm80); - normalizeVector(vecOccFV0AUnfm80, meanOccPrimUnfm80 / meanOccFV0AUnfm80); - normalizeVector(vecOccFV0CUnfm80, meanOccPrimUnfm80 / meanOccFV0CUnfm80); - normalizeVector(vecOccFT0AUnfm80, meanOccPrimUnfm80 / meanOccFT0AUnfm80); - normalizeVector(vecOccFT0CUnfm80, meanOccPrimUnfm80 / meanOccFT0CUnfm80); - normalizeVector(vecOccFDDAUnfm80, meanOccPrimUnfm80 / meanOccFDDAUnfm80); - normalizeVector(vecOccFDDCUnfm80, meanOccPrimUnfm80 / meanOccFDDCUnfm80); - - normalizeVector(vecOccNTrackITSUnfm80, meanOccPrimUnfm80 / meanOccNTrackITSUnfm80); - normalizeVector(vecOccNTrackTPCUnfm80, meanOccPrimUnfm80 / meanOccNTrackTPCUnfm80); - normalizeVector(vecOccNTrackTRDUnfm80, meanOccPrimUnfm80 / meanOccNTrackTRDUnfm80); - normalizeVector(vecOccNTrackTOFUnfm80, meanOccPrimUnfm80 / meanOccNTrackTOFUnfm80); - normalizeVector(vecOccNTrackSizeUnfm80, meanOccPrimUnfm80 / meanOccNTrackSizeUnfm80); - normalizeVector(vecOccNTrackTPCAUnfm80, meanOccPrimUnfm80 / meanOccNTrackTPCAUnfm80); - normalizeVector(vecOccNTrackTPCCUnfm80, meanOccPrimUnfm80 / meanOccNTrackTPCCUnfm80); - normalizeVector(vecOccNTrackITSTPCUnfm80, meanOccPrimUnfm80 / meanOccNTrackITSTPCUnfm80); - normalizeVector(vecOccNTrackITSTPCAUnfm80, meanOccPrimUnfm80 / meanOccNTrackITSTPCAUnfm80); - normalizeVector(vecOccNTrackITSTPCCUnfm80, meanOccPrimUnfm80 / meanOccNTrackITSTPCCUnfm80); - - normalizeVector(vecOccMultNTracksHasITSUnfm80, meanOccPrimUnfm80 / meanOccMultNTracksHasITSUnfm80); - normalizeVector(vecOccMultNTracksHasTPCUnfm80, meanOccPrimUnfm80 / meanOccMultNTracksHasTPCUnfm80); - normalizeVector(vecOccMultNTracksHasTOFUnfm80, meanOccPrimUnfm80 / meanOccMultNTracksHasTOFUnfm80); - normalizeVector(vecOccMultNTracksHasTRDUnfm80, meanOccPrimUnfm80 / meanOccMultNTracksHasTRDUnfm80); - normalizeVector(vecOccMultNTracksITSOnlyUnfm80, meanOccPrimUnfm80 / meanOccMultNTracksITSOnlyUnfm80); - normalizeVector(vecOccMultNTracksTPCOnlyUnfm80, meanOccPrimUnfm80 / meanOccMultNTracksTPCOnlyUnfm80); - normalizeVector(vecOccMultNTracksITSTPCUnfm80, meanOccPrimUnfm80 / meanOccMultNTracksITSTPCUnfm80); - normalizeVector(vecOccMultAllTracksTPCOnlyUnfm80, meanOccPrimUnfm80 / meanOccMultAllTracksTPCOnlyUnfm80); - - // Find Robust estimators - // T0A, T0C, V0A, Prim - getMedianOccVect(vecRobustOccT0V0PrimUnfm80, vecRobustOccT0V0PrimUnfm80medianPosVec, - vecOccPrimUnfm80, vecOccFV0AUnfm80, vecOccFT0AUnfm80, vecOccFT0CUnfm80); - - // T0A, T0C, V0A, FDD, Prim - getMedianOccVect(vecRobustOccFDDT0V0PrimUnfm80, vecRobustOccFDDT0V0PrimUnfm80medianPosVec, - vecOccPrimUnfm80, vecOccFV0AUnfm80, vecOccFT0AUnfm80, vecOccFT0CUnfm80, vecOccFDDAUnfm80, vecOccFDDCUnfm80); - - // NTrackDet - getMedianOccVect(vecRobustOccNtrackDetUnfm80, vecRobustOccNtrackDetUnfm80medianPosVec, - vecOccNTrackITSUnfm80, vecOccNTrackTPCUnfm80, vecOccNTrackTRDUnfm80, vecOccNTrackTOFUnfm80); - - // multExtraTable - getMedianOccVect(vecRobustOccmultTableUnfm80, vecRobustOccmultTableUnfm80medianPosVec, - vecOccPrimUnfm80, vecOccMultNTracksHasITSUnfm80, vecOccMultNTracksHasTPCUnfm80, - vecOccMultNTracksHasTOFUnfm80, vecOccMultNTracksHasTRDUnfm80, vecOccMultNTracksITSOnlyUnfm80, - vecOccMultNTracksTPCOnlyUnfm80, vecOccMultNTracksITSTPCUnfm80, vecOccMultAllTracksTPCOnlyUnfm80, - vecOccNTrackITSTPCUnfm80); - - for (const auto& vec : vecRobustOccT0V0PrimUnfm80medianPosVec) { - recoEvent.fill(HIST("h_RO_T0V0PrimUnfm80"), vec[0]); - recoEvent.fill(HIST("h_RO_T0V0PrimUnfm80"), vec[1]); + // + if (totalBCcountSize != collisions.size()) { + LOG(debug) << "DEBUG :: ERROR :: filled TF list and collision size mismatch :: filledTF_Size = " << totalBCcountSize << " != " << collisions.size() << " = collisions.size()"; } - for (const auto& vec : vecRobustOccFDDT0V0PrimUnfm80medianPosVec) { - recoEvent.fill(HIST("h_RO_FDDT0V0PrimUnfm80"), vec[0]); - recoEvent.fill(HIST("h_RO_FDDT0V0PrimUnfm80"), vec[1]); - } + // Fill the Producers + for (uint i = 0; i < tfCounted; i++) { - for (const auto& vec : vecRobustOccNtrackDetUnfm80medianPosVec) { - recoEvent.fill(HIST("h_RO_NtrackDetUnfm80"), vec[0]); - recoEvent.fill(HIST("h_RO_NtrackDetUnfm80"), vec[1]); - } + genOccsBCsList(tfList[i], bcTFMap[i]); - for (const auto& vec : vecRobustOccmultTableUnfm80medianPosVec) { - recoEvent.fill(HIST("h_RO_multTableUnfm80"), vec[0]); - recoEvent.fill(HIST("h_RO_multTableUnfm80"), vec[1]); - } + auto& vecOccPrimUnfm80 = occPrimUnfm80[i]; + float meanOccPrimUnfm80 = TMath::Mean(vecOccPrimUnfm80.size(), vecOccPrimUnfm80.data()); + normalizeVector(vecOccPrimUnfm80, meanOccPrimUnfm80 / meanOccPrimUnfm80); - genOccsBCsList(tfList[i], bcTFMap[i]); + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccPrim || processMode == kProcessOnlyOccT0V0Prim || processMode == kProcessOnlyOccFDDT0V0Prim || processMode == kProcessOnlyOccNtrackDet || processMode == kProcessOnlyOccMultExtra) { + if constexpr (tableMode == fillOccTable) { + genOccsPrim(vecOccPrimUnfm80); + } + if constexpr (meanTableMode == fillMeanOccTable) { + genOccsMeanPrim(meanOccPrimUnfm80); + } + } - if (buildOccsDet) { - genOccsDet(vecOccPrimUnfm80, - vecOccFV0AUnfm80, vecOccFV0CUnfm80, - vecOccFT0AUnfm80, vecOccFT0CUnfm80, - vecOccFDDAUnfm80, vecOccFDDCUnfm80); - } - if (buildOccsTrackMult) { - genOccsTrackMult(vecOccNTrackITSUnfm80, vecOccNTrackTPCUnfm80, - vecOccNTrackTRDUnfm80, vecOccNTrackTOFUnfm80, - vecOccNTrackSizeUnfm80, vecOccNTrackTPCAUnfm80, - vecOccNTrackTPCCUnfm80, vecOccNTrackITSTPCUnfm80, - vecOccNTrackITSTPCAUnfm80, vecOccNTrackITSTPCCUnfm80); - } - if (buildOccsMultExtra) { - genOccsMultExtra(vecOccMultNTracksHasITSUnfm80, vecOccMultNTracksHasTPCUnfm80, - vecOccMultNTracksHasTOFUnfm80, vecOccMultNTracksHasTRDUnfm80, - vecOccMultNTracksITSOnlyUnfm80, vecOccMultNTracksTPCOnlyUnfm80, - vecOccMultNTracksITSTPCUnfm80, vecOccMultAllTracksTPCOnlyUnfm80); - } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccT0V0Prim || processMode == kProcessOnlyOccFDDT0V0Prim) { + auto& vecOccFV0AUnfm80 = occFV0AUnfm80[i]; + auto& vecOccFV0CUnfm80 = occFV0CUnfm80[i]; + auto& vecOccFT0AUnfm80 = occFT0AUnfm80[i]; + auto& vecOccFT0CUnfm80 = occFT0CUnfm80[i]; + + float meanOccFV0AUnfm80 = TMath::Mean(vecOccFV0AUnfm80.size(), vecOccFV0AUnfm80.data()); + float meanOccFV0CUnfm80 = TMath::Mean(vecOccFV0CUnfm80.size(), vecOccFV0CUnfm80.data()); + float meanOccFT0AUnfm80 = TMath::Mean(vecOccFT0AUnfm80.size(), vecOccFT0AUnfm80.data()); + float meanOccFT0CUnfm80 = TMath::Mean(vecOccFT0CUnfm80.size(), vecOccFT0CUnfm80.data()); + + // Normalise the original vectors + normalizeVector(vecOccFV0AUnfm80, meanOccPrimUnfm80 / meanOccFV0AUnfm80); + normalizeVector(vecOccFV0CUnfm80, meanOccPrimUnfm80 / meanOccFV0CUnfm80); + normalizeVector(vecOccFT0AUnfm80, meanOccPrimUnfm80 / meanOccFT0AUnfm80); + normalizeVector(vecOccFT0CUnfm80, meanOccPrimUnfm80 / meanOccFT0CUnfm80); + + // Find Robust estimators + // T0A, T0C, V0A, Prim + if constexpr (robustTableMode == fillOccRobustTable || meanRobustTableMode == fillOccMeanRobustTable) { + getMedianOccVect(vecRobustOccT0V0PrimUnfm80, vecRobustOccT0V0PrimUnfm80medianPosVec, + vecOccPrimUnfm80, vecOccFV0AUnfm80, vecOccFT0AUnfm80, vecOccFT0CUnfm80); + for (const auto& vec : vecRobustOccT0V0PrimUnfm80medianPosVec) { + recoEvent.fill(HIST("h_RO_T0V0PrimUnfm80"), vec[0]); + recoEvent.fill(HIST("h_RO_T0V0PrimUnfm80"), vec[1]); + } + } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccT0V0Prim || processMode == kProcessOnlyOccFDDT0V0Prim) { + if constexpr (tableMode == fillOccTable) { + genOccsT0V0(vecOccFV0AUnfm80, vecOccFV0CUnfm80, vecOccFT0AUnfm80, vecOccFT0CUnfm80); + } + if constexpr (meanTableMode == fillMeanOccTable) { + genOccsMeanT0V0(meanOccFV0AUnfm80, meanOccFV0CUnfm80, meanOccFT0AUnfm80, meanOccFT0CUnfm80); + } + if constexpr (robustTableMode == fillOccRobustTable) { + genORT0V0Prim(vecRobustOccT0V0PrimUnfm80); + } + if constexpr (meanRobustTableMode == fillOccMeanRobustTable) { + genOccsMeanRobustT0V0Prim(TMath::Mean(vecRobustOccT0V0PrimUnfm80.size(), vecRobustOccT0V0PrimUnfm80.data())); + } + + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccFDDT0V0Prim) { + auto& vecOccFDDAUnfm80 = occFDDAUnfm80[i]; + auto& vecOccFDDCUnfm80 = occFDDCUnfm80[i]; + float meanOccFDDAUnfm80 = TMath::Mean(vecOccFDDAUnfm80.size(), vecOccFDDAUnfm80.data()); + float meanOccFDDCUnfm80 = TMath::Mean(vecOccFDDCUnfm80.size(), vecOccFDDCUnfm80.data()); + normalizeVector(vecOccFDDAUnfm80, meanOccPrimUnfm80 / meanOccFDDAUnfm80); + normalizeVector(vecOccFDDCUnfm80, meanOccPrimUnfm80 / meanOccFDDCUnfm80); + + // T0A, T0C, V0A, FDD, Prim + if constexpr (robustTableMode == fillOccRobustTable || meanRobustTableMode == fillOccMeanRobustTable) { + getMedianOccVect(vecRobustOccFDDT0V0PrimUnfm80, vecRobustOccFDDT0V0PrimUnfm80medianPosVec, + vecOccPrimUnfm80, vecOccFV0AUnfm80, vecOccFT0AUnfm80, vecOccFT0CUnfm80, vecOccFDDAUnfm80, vecOccFDDCUnfm80); + for (const auto& vec : vecRobustOccFDDT0V0PrimUnfm80medianPosVec) { + recoEvent.fill(HIST("h_RO_FDDT0V0PrimUnfm80"), vec[0]); + recoEvent.fill(HIST("h_RO_FDDT0V0PrimUnfm80"), vec[1]); + } + + if constexpr (tableMode == fillOccTable) { + genOccsFDD(vecOccFDDAUnfm80, vecOccFDDCUnfm80); + } + if constexpr (meanTableMode == fillMeanOccTable) { + genOccsMeanFDD(meanOccFDDAUnfm80, meanOccFDDCUnfm80); + } + if constexpr (robustTableMode == fillOccRobustTable) { + genORFDDT0V0Prim(vecRobustOccFDDT0V0PrimUnfm80); + } + if constexpr (meanRobustTableMode == fillOccMeanRobustTable) { + genOccsMeanRobustFDDT0V0Prim(TMath::Mean(vecRobustOccFDDT0V0PrimUnfm80.size(), vecRobustOccFDDT0V0PrimUnfm80.data())); + } + } + } // Block for FDDT0V0Prim + } // For T0V0Prim only and FDDT0V0Prim + } // Detector Occupancy block + + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccNtrackDet) { + // NTrackDet + auto& vecOccNTrackITSUnfm80 = occNTrackITSUnfm80[i]; + auto& vecOccNTrackTPCUnfm80 = occNTrackTPCUnfm80[i]; + auto& vecOccNTrackTRDUnfm80 = occNTrackTRDUnfm80[i]; + auto& vecOccNTrackTOFUnfm80 = occNTrackTOFUnfm80[i]; + auto& vecOccNTrackSizeUnfm80 = occNTrackSizeUnfm80[i]; + auto& vecOccNTrackTPCAUnfm80 = occNTrackTPCAUnfm80[i]; + auto& vecOccNTrackTPCCUnfm80 = occNTrackTPCCUnfm80[i]; + auto& vecOccNTrackITSTPCUnfm80 = occNTrackITSTPCUnfm80[i]; + auto& vecOccNTrackITSTPCAUnfm80 = occNTrackITSTPCAUnfm80[i]; + auto& vecOccNTrackITSTPCCUnfm80 = occNTrackITSTPCCUnfm80[i]; + float meanOccNTrackITSUnfm80 = TMath::Mean(vecOccNTrackITSUnfm80.size(), vecOccNTrackITSUnfm80.data()); + float meanOccNTrackTPCUnfm80 = TMath::Mean(vecOccNTrackTPCUnfm80.size(), vecOccNTrackTPCUnfm80.data()); + float meanOccNTrackTRDUnfm80 = TMath::Mean(vecOccNTrackTRDUnfm80.size(), vecOccNTrackTRDUnfm80.data()); + float meanOccNTrackTOFUnfm80 = TMath::Mean(vecOccNTrackTOFUnfm80.size(), vecOccNTrackTOFUnfm80.data()); + float meanOccNTrackSizeUnfm80 = TMath::Mean(vecOccNTrackSizeUnfm80.size(), vecOccNTrackSizeUnfm80.data()); + float meanOccNTrackTPCAUnfm80 = TMath::Mean(vecOccNTrackTPCAUnfm80.size(), vecOccNTrackTPCAUnfm80.data()); + float meanOccNTrackTPCCUnfm80 = TMath::Mean(vecOccNTrackTPCCUnfm80.size(), vecOccNTrackTPCCUnfm80.data()); + float meanOccNTrackITSTPCUnfm80 = TMath::Mean(vecOccNTrackITSTPCUnfm80.size(), vecOccNTrackITSTPCUnfm80.data()); + float meanOccNTrackITSTPCAUnfm80 = TMath::Mean(vecOccNTrackITSTPCAUnfm80.size(), vecOccNTrackITSTPCAUnfm80.data()); + float meanOccNTrackITSTPCCUnfm80 = TMath::Mean(vecOccNTrackITSTPCCUnfm80.size(), vecOccNTrackITSTPCCUnfm80.data()); + + normalizeVector(vecOccNTrackITSUnfm80, meanOccPrimUnfm80 / meanOccNTrackITSUnfm80); + normalizeVector(vecOccNTrackTPCUnfm80, meanOccPrimUnfm80 / meanOccNTrackTPCUnfm80); + normalizeVector(vecOccNTrackTRDUnfm80, meanOccPrimUnfm80 / meanOccNTrackTRDUnfm80); + normalizeVector(vecOccNTrackTOFUnfm80, meanOccPrimUnfm80 / meanOccNTrackTOFUnfm80); + normalizeVector(vecOccNTrackSizeUnfm80, meanOccPrimUnfm80 / meanOccNTrackSizeUnfm80); + normalizeVector(vecOccNTrackTPCAUnfm80, meanOccPrimUnfm80 / meanOccNTrackTPCAUnfm80); + normalizeVector(vecOccNTrackTPCCUnfm80, meanOccPrimUnfm80 / meanOccNTrackTPCCUnfm80); + normalizeVector(vecOccNTrackITSTPCUnfm80, meanOccPrimUnfm80 / meanOccNTrackITSTPCUnfm80); + normalizeVector(vecOccNTrackITSTPCAUnfm80, meanOccPrimUnfm80 / meanOccNTrackITSTPCAUnfm80); + normalizeVector(vecOccNTrackITSTPCCUnfm80, meanOccPrimUnfm80 / meanOccNTrackITSTPCCUnfm80); + + if constexpr (robustTableMode == fillOccRobustTable || meanRobustTableMode == fillOccMeanRobustTable) { + getMedianOccVect(vecRobustOccNtrackDetUnfm80, vecRobustOccNtrackDetUnfm80medianPosVec, + vecOccNTrackITSUnfm80, vecOccNTrackTPCUnfm80, vecOccNTrackTRDUnfm80, vecOccNTrackTOFUnfm80); + for (const auto& vec : vecRobustOccNtrackDetUnfm80medianPosVec) { + recoEvent.fill(HIST("h_RO_NtrackDetUnfm80"), vec[0]); + recoEvent.fill(HIST("h_RO_NtrackDetUnfm80"), vec[1]); + } + } - if (buildOccsRobust) { - genOccsRobust(vecRobustOccT0V0PrimUnfm80, vecRobustOccFDDT0V0PrimUnfm80, vecRobustOccNtrackDetUnfm80, vecRobustOccmultTableUnfm80); - } - if (buildOccsMeanDet) { - genOccsMeanDet(meanOccPrimUnfm80, - meanOccFV0AUnfm80, meanOccFV0CUnfm80, - meanOccFT0AUnfm80, meanOccFT0CUnfm80, - meanOccFDDAUnfm80, meanOccFDDCUnfm80); - } + if constexpr (tableMode == fillOccTable) { + genOccsNTrackDet(vecOccNTrackITSUnfm80, vecOccNTrackTPCUnfm80, + vecOccNTrackTRDUnfm80, vecOccNTrackTOFUnfm80, + vecOccNTrackSizeUnfm80, vecOccNTrackTPCAUnfm80, + vecOccNTrackTPCCUnfm80, vecOccNTrackITSTPCUnfm80, + vecOccNTrackITSTPCAUnfm80, vecOccNTrackITSTPCCUnfm80); + } + if constexpr (meanTableMode == fillMeanOccTable) { + genOccsMeanNTrkDet(meanOccNTrackITSUnfm80, meanOccNTrackTPCUnfm80, + meanOccNTrackTRDUnfm80, meanOccNTrackTOFUnfm80, + meanOccNTrackSizeUnfm80, meanOccNTrackTPCAUnfm80, + meanOccNTrackTPCCUnfm80, meanOccNTrackITSTPCUnfm80, + meanOccNTrackITSTPCAUnfm80, meanOccNTrackITSTPCCUnfm80); + } + if constexpr (robustTableMode == fillOccRobustTable) { + genORNtrackDet(vecRobustOccNtrackDetUnfm80); + } + if constexpr (meanRobustTableMode == fillOccMeanRobustTable) { + genOccsMeanRobustNtrackDet(TMath::Mean(vecRobustOccNtrackDetUnfm80.size(), vecRobustOccNtrackDetUnfm80.data())); + } + } + + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccMultExtra) { + auto& vecOccNTrackITSTPCUnfm80 = occNTrackITSTPCUnfm80[i]; + float meanOccNTrackITSTPCUnfm80 = TMath::Mean(vecOccNTrackITSTPCUnfm80.size(), vecOccNTrackITSTPCUnfm80.data()); + normalizeVector(vecOccNTrackITSTPCUnfm80, meanOccPrimUnfm80 / meanOccNTrackITSTPCUnfm80); + + auto& vecOccMultNTracksHasITSUnfm80 = occMultNTracksHasITSUnfm80[i]; + auto& vecOccMultNTracksHasTPCUnfm80 = occMultNTracksHasTPCUnfm80[i]; + auto& vecOccMultNTracksHasTOFUnfm80 = occMultNTracksHasTOFUnfm80[i]; + auto& vecOccMultNTracksHasTRDUnfm80 = occMultNTracksHasTRDUnfm80[i]; + auto& vecOccMultNTracksITSOnlyUnfm80 = occMultNTracksITSOnlyUnfm80[i]; + auto& vecOccMultNTracksTPCOnlyUnfm80 = occMultNTracksTPCOnlyUnfm80[i]; + auto& vecOccMultNTracksITSTPCUnfm80 = occMultNTracksITSTPCUnfm80[i]; + auto& vecOccMultAllTracksTPCOnlyUnfm80 = occMultAllTracksTPCOnlyUnfm80[i]; + float meanOccMultNTracksHasITSUnfm80 = TMath::Mean(vecOccMultNTracksHasITSUnfm80.size(), vecOccMultNTracksHasITSUnfm80.data()); + float meanOccMultNTracksHasTPCUnfm80 = TMath::Mean(vecOccMultNTracksHasTPCUnfm80.size(), vecOccMultNTracksHasTPCUnfm80.data()); + float meanOccMultNTracksHasTOFUnfm80 = TMath::Mean(vecOccMultNTracksHasTOFUnfm80.size(), vecOccMultNTracksHasTOFUnfm80.data()); + float meanOccMultNTracksHasTRDUnfm80 = TMath::Mean(vecOccMultNTracksHasTRDUnfm80.size(), vecOccMultNTracksHasTRDUnfm80.data()); + float meanOccMultNTracksITSOnlyUnfm80 = TMath::Mean(vecOccMultNTracksITSOnlyUnfm80.size(), vecOccMultNTracksITSOnlyUnfm80.data()); + float meanOccMultNTracksTPCOnlyUnfm80 = TMath::Mean(vecOccMultNTracksTPCOnlyUnfm80.size(), vecOccMultNTracksTPCOnlyUnfm80.data()); + float meanOccMultNTracksITSTPCUnfm80 = TMath::Mean(vecOccMultNTracksITSTPCUnfm80.size(), vecOccMultNTracksITSTPCUnfm80.data()); + float meanOccMultAllTracksTPCOnlyUnfm80 = TMath::Mean(vecOccMultAllTracksTPCOnlyUnfm80.size(), vecOccMultAllTracksTPCOnlyUnfm80.data()); + // multExtraTable + normalizeVector(vecOccMultNTracksHasITSUnfm80, meanOccPrimUnfm80 / meanOccMultNTracksHasITSUnfm80); + normalizeVector(vecOccMultNTracksHasTPCUnfm80, meanOccPrimUnfm80 / meanOccMultNTracksHasTPCUnfm80); + normalizeVector(vecOccMultNTracksHasTOFUnfm80, meanOccPrimUnfm80 / meanOccMultNTracksHasTOFUnfm80); + normalizeVector(vecOccMultNTracksHasTRDUnfm80, meanOccPrimUnfm80 / meanOccMultNTracksHasTRDUnfm80); + normalizeVector(vecOccMultNTracksITSOnlyUnfm80, meanOccPrimUnfm80 / meanOccMultNTracksITSOnlyUnfm80); + normalizeVector(vecOccMultNTracksTPCOnlyUnfm80, meanOccPrimUnfm80 / meanOccMultNTracksTPCOnlyUnfm80); + normalizeVector(vecOccMultNTracksITSTPCUnfm80, meanOccPrimUnfm80 / meanOccMultNTracksITSTPCUnfm80); + normalizeVector(vecOccMultAllTracksTPCOnlyUnfm80, meanOccPrimUnfm80 / meanOccMultAllTracksTPCOnlyUnfm80); + + if constexpr (robustTableMode == fillOccRobustTable || meanRobustTableMode == fillOccMeanRobustTable) { + getMedianOccVect(vecRobustOccmultTableUnfm80, vecRobustOccmultTableUnfm80medianPosVec, + vecOccPrimUnfm80, vecOccMultNTracksHasITSUnfm80, vecOccMultNTracksHasTPCUnfm80, + vecOccMultNTracksHasTOFUnfm80, vecOccMultNTracksHasTRDUnfm80, vecOccMultNTracksITSOnlyUnfm80, + vecOccMultNTracksTPCOnlyUnfm80, vecOccMultNTracksITSTPCUnfm80, vecOccMultAllTracksTPCOnlyUnfm80, + vecOccNTrackITSTPCUnfm80); + for (const auto& vec : vecRobustOccmultTableUnfm80medianPosVec) { + recoEvent.fill(HIST("h_RO_multTableUnfm80"), vec[0]); + recoEvent.fill(HIST("h_RO_multTableUnfm80"), vec[1]); + } + } - if (buildOccsMeanTrkMult) { - genOccsMeanTrkMult(meanOccNTrackITSUnfm80, - meanOccNTrackTPCUnfm80, - meanOccNTrackTRDUnfm80, - meanOccNTrackTOFUnfm80, - meanOccNTrackSizeUnfm80, - meanOccNTrackTPCAUnfm80, - meanOccNTrackTPCCUnfm80, - meanOccNTrackITSTPCUnfm80, - meanOccNTrackITSTPCAUnfm80, - meanOccNTrackITSTPCCUnfm80); + if constexpr (tableMode == fillOccTable) { + genOccsMultExtra(vecOccMultNTracksHasITSUnfm80, vecOccMultNTracksHasTPCUnfm80, + vecOccMultNTracksHasTOFUnfm80, vecOccMultNTracksHasTRDUnfm80, + vecOccMultNTracksITSOnlyUnfm80, vecOccMultNTracksTPCOnlyUnfm80, + vecOccMultNTracksITSTPCUnfm80, vecOccMultAllTracksTPCOnlyUnfm80); + } + if constexpr (meanTableMode == fillMeanOccTable) { + genOccsMnMultExtra(meanOccMultNTracksHasITSUnfm80, meanOccMultNTracksHasTPCUnfm80, + meanOccMultNTracksHasTOFUnfm80, meanOccMultNTracksHasTRDUnfm80, + meanOccMultNTracksITSOnlyUnfm80, meanOccMultNTracksTPCOnlyUnfm80, + meanOccMultNTracksITSTPCUnfm80, meanOccMultAllTracksTPCOnlyUnfm80); + } + if constexpr (robustTableMode == fillOccRobustTable) { + genORMultExtra(vecRobustOccmultTableUnfm80); + } + if constexpr (meanRobustTableMode == fillOccMeanRobustTable) { + genOccsMeanRobustMultExtraTable(TMath::Mean(vecRobustOccmultTableUnfm80.size(), vecRobustOccmultTableUnfm80.data())); + } + } } - if (buildOccsMnMultExtra) { - genOccsMnMultExtra(meanOccMultNTracksHasITSUnfm80, meanOccMultNTracksHasTPCUnfm80, - meanOccMultNTracksHasTOFUnfm80, meanOccMultNTracksHasTRDUnfm80, - meanOccMultNTracksITSOnlyUnfm80, meanOccMultNTracksTPCOnlyUnfm80, - meanOccMultNTracksITSTPCUnfm80, meanOccMultAllTracksTPCOnlyUnfm80); + // Create a BC index table. + int64_t occIDX = -1; + int idx = -1; + for (auto const& bc : BCs) { + idx = -1; + getTimingInfo(bc, lastRun, nBCsPerTF, bcSOR, time, tfIdThis, bcInTF); + + auto idxIt = std::find(tfList.begin(), tfList.end(), tfIdThis); + if (idxIt != tfList.end()) { + idx = std::distance(tfList.begin(), idxIt); + } else { + LOG(error) << "DEBUG :: SEVERE :: BC Timeframe not in the list"; + } + + auto it = std::find(bcTFMap[idx].begin(), bcTFMap[idx].end(), bc.globalIndex()); // will find the iterator where object is placed. + if (it != bcTFMap[idx].end()) { + occIDX = idx; // Element is in the vector + } else { + occIDX = -1; // Element is not in the vector + } + + genBCTFinfoTable(tfIdThis, bcInTF); + genOccIndexTable(bc.globalIndex(), occIDX); // BCId, OccId } + } // else block for constexpr + } - if (buildOccsMeanRobust) { - genOccsMeanRobust( - TMath::Mean(vecRobustOccT0V0PrimUnfm80.size(), vecRobustOccT0V0PrimUnfm80.data()), - TMath::Mean(vecRobustOccFDDT0V0PrimUnfm80.size(), vecRobustOccFDDT0V0PrimUnfm80.data()), - TMath::Mean(vecRobustOccNtrackDetUnfm80.size(), vecRobustOccNtrackDetUnfm80.data()), - TMath::Mean(vecRobustOccmultTableUnfm80.size(), vecRobustOccmultTableUnfm80.data())); + void checkAllProcessFunctionStatus(std::vector const& processStatusVector, bool& singleProcessOn) + { + int nProcessOn = 0; + const uint size = processStatusVector.size(); + for (uint i = 0; i < size; i++) { + if (processStatusVector[i]) { + nProcessOn++; } } - // Create a BC index table. - int64_t occIDX = -1; - int idx = -1; - for (auto const& bc : BCs) { - idx = -1; - getTimingInfo(bc, lastRun, nBCsPerTF, bcSOR, time, tfIdThis, bcInTF); - - auto idxIt = std::find(tfList.begin(), tfList.end(), tfIdThis); - if (idxIt != tfList.end()) { - idx = std::distance(tfList.begin(), idxIt); - } else { - LOG(error) << "DEBUG :: SEVERE :: BC Timeframe not in the list"; + if (nProcessOn > 1) { + singleProcessOn = false; + std::ostringstream warningLine; + warningLine << "DEBUG :: More than one track-mean-occ-table-producer process function is on :: "; + for (uint i = 0; i < size; i++) { + if (processStatusVector[i]) { + warningLine << std::string(ProcessNames[processStatusVector[i]]) << " == true :: "; + } } + LOG(error) << warningLine.str(); + } // check nProcess + } - auto it = std::find(bcTFMap[idx].begin(), bcTFMap[idx].end(), bc.globalIndex()); // will find the iterator where object is placed. - if (it != bcTFMap[idx].end()) { - occIDX = idx; // Element is in the vector - } else { - occIDX = -1; // Element is not in the vector - } + //________________________________________End of Exection Function_________________________________________________________________________ + + void processOnlyBCTFinfoTable(o2::aod::BCsWithTimestamps const& BCs) + { + occupancyQA.fill(HIST("h_DFcount_Lvl0"), 0.5); + processStatus[kProcessOnlyBCTFinfoTable] = true; + bool singleProcessOn = true; + checkAllProcessFunctionStatus(processStatus, singleProcessOn); + if (!singleProcessOn) { + return; + } - genOccIndexTable(bc.globalIndex(), occIDX); // BCId, OccId + for (const auto& BC : BCs) { + getTimingInfo(BC, lastRun, nBCsPerTF, bcSOR, time, tfIdThis, bcInTF); genBCTFinfoTable(tfIdThis, bcInTF); } + occupancyQA.fill(HIST("h_DFcount_Lvl1"), 0.5); + } + PROCESS_SWITCH(OccupancyTableProducer, processOnlyBCTFinfoTable, "processOnlyBCTFinfoTable", true); + + // // Process the Data + void processOnlyOccPrimUnfm(o2::aod::BCsWithTimestamps const& BCs, aod::Collisions const& collisions) + { + occupancyQA.fill(HIST("h_DFcount_Lvl0"), 0.5); + if (!buildOnlyOccsPrim) { + LOG(error) << " DEBUG :: ERROR ERROR ERROR :: buildOnlyOccsPrim == false"; + } + processStatus[kProcessOnlyOccPrim] = true; + bool singleProcessOn = true; + checkAllProcessFunctionStatus(processStatus, singleProcessOn); + if (!singleProcessOn) { + return; + } + + bool collisionsSizeIsZero = false; + executeCollisionCheckAndBCprocessing(BCs, collisions, collisionsSizeIsZero); + if (collisionsSizeIsZero) { + return; + } + executeOccProducerProcessing(BCs, collisions, nullptr); + occupancyQA.fill(HIST("h_DFcount_Lvl1"), 0.5); + } + PROCESS_SWITCH(OccupancyTableProducer, processOnlyOccPrimUnfm, "processOnlyOccPrimUnfm", false); + + void processOnlyOccT0V0PrimUnfm(o2::aod::BCsWithTimestamps const& BCs, soa::Join const& collisions) + { + occupancyQA.fill(HIST("h_DFcount_Lvl0"), 0.5); + if (!buildOnlyOccsT0V0Prim) { + LOG(error) << " DEBUG :: ERROR ERROR ERROR :: buildOnlyOccsT0V0Prim == false"; + } + processStatus[kProcessOnlyOccT0V0Prim] = true; + bool singleProcessOn = true; + checkAllProcessFunctionStatus(processStatus, singleProcessOn); + if (!singleProcessOn) { + return; + } + + bool collisionsSizeIsZero = false; + executeCollisionCheckAndBCprocessing(BCs, collisions, collisionsSizeIsZero); + if (collisionsSizeIsZero) { + return; + } + executeOccProducerProcessing(BCs, collisions, nullptr); + occupancyQA.fill(HIST("h_DFcount_Lvl1"), 0.5); + } + PROCESS_SWITCH(OccupancyTableProducer, processOnlyOccT0V0PrimUnfm, "processOnlyOccT0V0PrimUnfm", false); + + void processOnlyOccFDDT0V0PrimUnfm(o2::aod::BCsWithTimestamps const& BCs, soa::Join const& collisions) + { + occupancyQA.fill(HIST("h_DFcount_Lvl0"), 0.5); + if (!buildOnlyOccsFDDT0V0Prim) { + LOG(error) << " DEBUG :: ERROR ERROR ERROR :: buildOnlyOccsFDDT0V0Prim == false"; + } + processStatus[kProcessOnlyOccFDDT0V0Prim] = true; + bool singleProcessOn = true; + checkAllProcessFunctionStatus(processStatus, singleProcessOn); + if (!singleProcessOn) { + return; + } + + bool collisionsSizeIsZero = false; + executeCollisionCheckAndBCprocessing(BCs, collisions, collisionsSizeIsZero); + if (collisionsSizeIsZero) { + return; + } + executeOccProducerProcessing(BCs, collisions, nullptr); + occupancyQA.fill(HIST("h_DFcount_Lvl1"), 0.5); + } + PROCESS_SWITCH(OccupancyTableProducer, processOnlyOccFDDT0V0PrimUnfm, "processOnlyOccFDDT0V0PrimUnfm", false); + + void processOnlyOccNtrackDet(o2::aod::BCsWithTimestamps const& BCs, soa::Join const& collisions, soa::Join const& tracks) + { + occupancyQA.fill(HIST("h_DFcount_Lvl0"), 0.5); + if (!buildOnlyOccsNtrackDet) { + LOG(error) << " DEBUG :: ERROR ERROR ERROR :: buildOnlyOccsNtrackDet == false"; + } + processStatus[kProcessOnlyOccNtrackDet] = true; + bool singleProcessOn = true; + checkAllProcessFunctionStatus(processStatus, singleProcessOn); + if (!singleProcessOn) { + return; + } + + bool collisionsSizeIsZero = false; + executeCollisionCheckAndBCprocessing(BCs, collisions, collisionsSizeIsZero); + if (collisionsSizeIsZero) { + return; + } + executeOccProducerProcessing(BCs, collisions, tracks); + occupancyQA.fill(HIST("h_DFcount_Lvl1"), 0.5); + } + PROCESS_SWITCH(OccupancyTableProducer, processOnlyOccNtrackDet, "processOnlyOccNtrackDet", false); + + void processOnlyOccMultExtra(o2::aod::BCsWithTimestamps const& BCs, soa::Join const& collisions) + { + occupancyQA.fill(HIST("h_DFcount_Lvl0"), 0.5); + if (!buildOnlyOccsMultExtra) { + LOG(error) << " DEBUG :: ERROR ERROR ERROR :: buildOnlyOccsMultExtra == false"; + } + processStatus[kProcessOnlyOccMultExtra] = true; + bool singleProcessOn = true; + checkAllProcessFunctionStatus(processStatus, singleProcessOn); + if (!singleProcessOn) { + return; + } + + bool collisionsSizeIsZero = false; + executeCollisionCheckAndBCprocessing(BCs, collisions, collisionsSizeIsZero); + if (collisionsSizeIsZero) { + return; + } + executeOccProducerProcessing(BCs, collisions, nullptr); + occupancyQA.fill(HIST("h_DFcount_Lvl1"), 0.5); + } + PROCESS_SWITCH(OccupancyTableProducer, processOnlyOccMultExtra, "processOnlyOccMultExtra", false); + + void processFullOccTableProduer(o2::aod::BCsWithTimestamps const& BCs, soa::Join const& collisions, soa::Join const& tracks) + { + occupancyQA.fill(HIST("h_DFcount_Lvl0"), 0.5); + if (!buildFullOccTableProducer) { + LOG(error) << " DEBUG :: ERROR ERROR ERROR :: buildFullOccTableProducer == false"; + } + processStatus[kProcessFullOccTableProducer] = true; + bool singleProcessOn = true; + checkAllProcessFunctionStatus(processStatus, singleProcessOn); + if (!singleProcessOn) { + return; + } + + bool collisionsSizeIsZero = false; + executeCollisionCheckAndBCprocessing(BCs, collisions, collisionsSizeIsZero); + if (collisionsSizeIsZero) { + return; + } + executeOccProducerProcessing(BCs, collisions, tracks); + occupancyQA.fill(HIST("h_DFcount_Lvl1"), 0.5); } // Process function ends + PROCESS_SWITCH(OccupancyTableProducer, processFullOccTableProduer, "processFullOccTableProduer", false); }; struct TrackMeanOccTableProducer { - Produces genTrackMeanOccs0; - Produces genTrackMeanOccs1; - Produces genTrackMeanOccs2; - Produces genTrackMeanOccs3; - Produces genTrackMeanOccs4; - Produces genTrackMeanOccs5; - Produces genTrackMeanOccs6; - Produces genTrackMeanOccs7; - Produces genTrackMeanOccs8; + + // //declare production of tables + Produces genTmoTrackId; + + Produces genTmoPrim; + Produces genTmoT0V0; + Produces genTmoFDD; + Produces genTmoNTrackDet; + Produces genTmoMultExtra; + Produces genTmoRT0V0Prim; + Produces genTmoRFDDT0V0Prim; + Produces genTmoRNtrackDet; + Produces genTmoRMultExtra; + + Produces genTwmoPrim; + Produces genTwmoT0V0; + Produces genTwmoFDD; + Produces genTwmoNTrackDet; + Produces genTwmoMultExtra; + Produces genTwmoRT0V0Prim; + Produces genTwmoRFDDT0V0Pri; + Produces genTwmoRNtrackDet; + Produces genTwmoRMultExtra; Service ccdb; @@ -729,25 +1236,40 @@ struct TrackMeanOccTableProducer { // Configurables Configurable customOrbitOffset{"customOrbitOffset", 0, "customOrbitOffset for MC"}; + Configurable bcGrouping{"bcGrouping", 80, "bcGrouping of BCs"}; + Configurable nBCinTF{"nBCinTF", 114048, "nBCinTF"}; + + Configurable cfgNOrbitsPerTF0RunValue{"cfgNOrbitsPerTF0RunValue", 534133, "cfgNOrbitsPerTF0RunValue"}; + Configurable cfgNOrbitsPerTF1TrueValue{"cfgNOrbitsPerTF1TrueValue", 128, "cfgNOrbitsPerTF1TrueValue"}; + Configurable cfgNOrbitsPerTF2FalseValue{"cfgNOrbitsPerTF2FalseValue", 32, "ccfgNOrbitsPerTF2FalseValue"}; - Configurable buildTrackMeanOccs1{"buildTrackMeanOccs1", true, "builder TrackMeanOccs1"}; - Configurable buildTrackMeanOccs2{"buildTrackMeanOccs2", true, "builder TrackMeanOccs2"}; - Configurable buildTrackMeanOccs3{"buildTrackMeanOccs3", true, "builder TrackMeanOccs3"}; - Configurable buildTrackMeanOccs4{"buildTrackMeanOccs4", true, "builder TrackMeanOccs4"}; - Configurable buildTrackMeanOccs5{"buildTrackMeanOccs5", true, "builder TrackMeanOccs5"}; - Configurable buildTrackMeanOccs6{"buildTrackMeanOccs6", true, "builder TrackMeanOccs6"}; - Configurable buildTrackMeanOccs7{"buildTrackMeanOccs7", true, "builder TrackMeanOccs7"}; - Configurable buildTrackMeanOccs8{"buildTrackMeanOccs8", true, "builder TrackMeanOccs8"}; + Configurable buildOnlyOccsPrim{"buildOnlyOccsPrim", true, "builder of table OccsPrim"}; + Configurable buildOnlyOccsT0V0{"buildOnlyOccsT0V0", true, "builder of table OccsT0V0Prim"}; + Configurable buildOnlyOccsFDD{"buildOnlyOccsFDD", true, "builder of table OccsFDDT0V0Prim"}; + Configurable buildOnlyOccsNtrackDet{"buildOnlyOccsNtrackDet", true, "builder of table OccsNtrackDet"}; + Configurable buildOnlyOccsMultExtra{"buildOnlyOccsMultExtra", true, "builder of table OccsMultExtra"}; - Configurable fillQA1{"fillQA1", false, "fill QA LOG Ratios"}; - Configurable fillQA2{"fillQA2", false, "fill QA condition dependent QAs"}; + Configurable buildOnlyOccsRobustT0V0Prim{"buildOnlyOccsRobustT0V0Prim", true, "build buildOnlyOccsRobustT0V0Prim"}; + Configurable buildOnlyOccsRobustFDDT0V0Prim{"buildOnlyOccsRobustFDDT0V0Prim", true, "build buildOnlyOccsRobustFDDT0V0Prim"}; + Configurable buildOnlyOccsRobustNtrackDet{"buildOnlyOccsRobustNtrackDet", true, "build buildOnlyOccsRobustNtrackDet"}; + Configurable buildOnlyOccsRobustMultExtra{"buildOnlyOccsRobustMultExtra", true, "build buildOnlyOccsRobustMultExtra"}; + + Configurable buildFullOccTableProducer{"buildFullOccTableProducer", true, "builder of all Occupancy Tables"}; + + Configurable buildFlag00MeanTable{"buildFlag00MeanTable", true, "build Flag00MeanTable"}; + Configurable buildFlag01WeightMeanTable{"buildFlag01WeightMeanTable", true, "build Flag01WeightMeanTable"}; + + Configurable fillQA1{"fillQA1", true, "fill QA LOG Ratios"}; + Configurable fillQA2{"fillQA2", true, "fill QA condition dependent QAs"}; // vectors to be used for occupancy estimation std::vector occPrimUnfm80; + std::vector occFV0AUnfm80; std::vector occFV0CUnfm80; std::vector occFT0AUnfm80; std::vector occFT0CUnfm80; + std::vector occFDDAUnfm80; std::vector occFDDCUnfm80; @@ -776,41 +1298,68 @@ struct TrackMeanOccTableProducer { std::vector occRobustNtrackDetUnfm80; std::vector occRobustMultTableUnfm80; + std::vector processStatus; + std::vector processInThisBlock; void init(InitContext const&) { // CCDB related part to be added later - occPrimUnfm80.resize(nBCinTF / 80); - occFV0AUnfm80.resize(nBCinTF / 80); - occFV0CUnfm80.resize(nBCinTF / 80); - occFT0AUnfm80.resize(nBCinTF / 80); - occFT0CUnfm80.resize(nBCinTF / 80); - occFDDAUnfm80.resize(nBCinTF / 80); - occFDDCUnfm80.resize(nBCinTF / 80); - - occNTrackITSUnfm80.resize(nBCinTF / 80); - occNTrackTPCUnfm80.resize(nBCinTF / 80); - occNTrackTRDUnfm80.resize(nBCinTF / 80); - occNTrackTOFUnfm80.resize(nBCinTF / 80); - occNTrackSizeUnfm80.resize(nBCinTF / 80); - occNTrackTPCAUnfm80.resize(nBCinTF / 80); - occNTrackTPCCUnfm80.resize(nBCinTF / 80); - occNTrackITSTPCUnfm80.resize(nBCinTF / 80); - occNTrackITSTPCAUnfm80.resize(nBCinTF / 80); - occNTrackITSTPCCUnfm80.resize(nBCinTF / 80); - - occMultNTracksHasITSUnfm80.resize(nBCinTF / 80); - occMultNTracksHasTPCUnfm80.resize(nBCinTF / 80); - occMultNTracksHasTOFUnfm80.resize(nBCinTF / 80); - occMultNTracksHasTRDUnfm80.resize(nBCinTF / 80); - occMultNTracksITSOnlyUnfm80.resize(nBCinTF / 80); - occMultNTracksTPCOnlyUnfm80.resize(nBCinTF / 80); - occMultNTracksITSTPCUnfm80.resize(nBCinTF / 80); - occMultAllTracksTPCOnlyUnfm80.resize(nBCinTF / 80); - - occRobustT0V0PrimUnfm80.resize(nBCinTF / 80); - occRobustFDDT0V0PrimUnfm80.resize(nBCinTF / 80); - occRobustNtrackDetUnfm80.resize(nBCinTF / 80); - occRobustMultTableUnfm80.resize(nBCinTF / 80); + processStatus.resize(11); + processInThisBlock.resize(11); + + for (uint i = 0; i < processStatus.size(); i++) { + processStatus[i] = false; + processInThisBlock[i] = false; + } + + if (buildFullOccTableProducer || buildOnlyOccsPrim) { + occPrimUnfm80.resize(nBCinTF / bcGrouping); + } + if (buildFullOccTableProducer || buildOnlyOccsT0V0) { + occFV0AUnfm80.resize(nBCinTF / bcGrouping); + occFV0CUnfm80.resize(nBCinTF / bcGrouping); + occFT0AUnfm80.resize(nBCinTF / bcGrouping); + occFT0CUnfm80.resize(nBCinTF / bcGrouping); + } + if (buildFullOccTableProducer || buildOnlyOccsFDD) { + occFDDAUnfm80.resize(nBCinTF / bcGrouping); + occFDDCUnfm80.resize(nBCinTF / bcGrouping); + } + if (buildFullOccTableProducer || buildOnlyOccsNtrackDet) { + occNTrackITSUnfm80.resize(nBCinTF / bcGrouping); + occNTrackTPCUnfm80.resize(nBCinTF / bcGrouping); + occNTrackTRDUnfm80.resize(nBCinTF / bcGrouping); + occNTrackTOFUnfm80.resize(nBCinTF / bcGrouping); + occNTrackSizeUnfm80.resize(nBCinTF / bcGrouping); + occNTrackTPCAUnfm80.resize(nBCinTF / bcGrouping); + occNTrackTPCCUnfm80.resize(nBCinTF / bcGrouping); + occNTrackITSTPCUnfm80.resize(nBCinTF / bcGrouping); + occNTrackITSTPCAUnfm80.resize(nBCinTF / bcGrouping); + occNTrackITSTPCCUnfm80.resize(nBCinTF / bcGrouping); + } + + if (buildFullOccTableProducer || buildOnlyOccsMultExtra) { + occMultNTracksHasITSUnfm80.resize(nBCinTF / bcGrouping); + occMultNTracksHasTPCUnfm80.resize(nBCinTF / bcGrouping); + occMultNTracksHasTOFUnfm80.resize(nBCinTF / bcGrouping); + occMultNTracksHasTRDUnfm80.resize(nBCinTF / bcGrouping); + occMultNTracksITSOnlyUnfm80.resize(nBCinTF / bcGrouping); + occMultNTracksTPCOnlyUnfm80.resize(nBCinTF / bcGrouping); + occMultNTracksITSTPCUnfm80.resize(nBCinTF / bcGrouping); + occMultAllTracksTPCOnlyUnfm80.resize(nBCinTF / bcGrouping); + } + + if (buildFullOccTableProducer || buildOnlyOccsRobustT0V0Prim || fillQA1 || fillQA2) { + occRobustT0V0PrimUnfm80.resize(nBCinTF / bcGrouping); + } + if (buildFullOccTableProducer || buildOnlyOccsRobustFDDT0V0Prim) { + occRobustFDDT0V0PrimUnfm80.resize(nBCinTF / bcGrouping); + } + if (buildFullOccTableProducer || buildOnlyOccsRobustNtrackDet) { + occRobustNtrackDetUnfm80.resize(nBCinTF / bcGrouping); + } + if (buildFullOccTableProducer || buildOnlyOccsRobustMultExtra) { + occRobustMultTableUnfm80.resize(nBCinTF / bcGrouping); + } const AxisSpec axisQA1 = {500, 0, 50000}; const AxisSpec axisQA2 = {200, -2, 2}; @@ -930,6 +1479,11 @@ struct TrackMeanOccTableProducer { occupancyQA.addClone("occTrackQA/Condition1/", "occTrackQA/Condition3/"); occupancyQA.addClone("occTrackQA/Condition1/", "occTrackQA/Condition4/"); } + + occupancyQA.add("h_DFcount_Lvl0", "h_DFcount_Lvl0", kTH1F, {{13, -1, 12}}); + occupancyQA.add("h_DFcount_Lvl1", "h_DFcount_Lvl1", kTH1F, {{13, -1, 12}}); + occupancyQA.add("h_DFcount_Lvl2", "h_DFcount_Lvl2", kTH1F, {{13, -1, 12}}); + occupancyQA.print(); } @@ -1031,7 +1585,7 @@ struct TrackMeanOccTableProducer { int64_t tsSOR = runDuration.first; auto ctpx = ccdb->getForTimeStamp>("CTP/Calib/OrbitReset", tsSOR); int64_t tsOrbitReset = (*ctpx)[0]; - uint32_t nOrbitsPerTF = run < 534133 ? 128 : 32; + uint32_t nOrbitsPerTF = run < cfgNOrbitsPerTF0RunValue ? cfgNOrbitsPerTF1TrueValue : cfgNOrbitsPerTF2FalseValue; int64_t orbitSOR = (tsSOR * 1000 - tsOrbitReset) / o2::constants::lhc::LHCOrbitMUS; orbitSOR = orbitSOR / nOrbitsPerTF * nOrbitsPerTF; bcSOR = orbitSOR * nBCsPerOrbit + customOrbitOffset * nBCsPerOrbit; // customOrbitOffset is a configurable @@ -1120,16 +1674,17 @@ struct TrackMeanOccTableProducer { if (fillQA1) { occupancyQA.fill(HIST("occTrackQA/LogRatio/") + HIST(OccDire[occRobustMode]) + HIST(OccDire[occMode]) + HIST(OccNames[occName]), std::log(std::abs(occValue / occRobustValue))); if (fillQA2) { - if (std::abs(std::log(occValue / occRobustValue)) < 2) { // conditional filling start + int two = 2, twenty = 20, fifty = 50, twoHundred = 200; + if (std::abs(std::log(occValue / occRobustValue)) < two) { // conditional filling start occupancyQA.fill(HIST("occTrackQA/Condition1/") + HIST(OccDire[occRobustMode]) + HIST(OccDire[occMode]) + HIST(OccNames[occName]), (std::log(occValue / occRobustValue)) * std::sqrt(occValue + occRobustValue)); - if (std::abs(occRobustValue + occValue) > 200) { + if (std::abs(occRobustValue + occValue) > twoHundred) { occupancyQA.fill(HIST("occTrackQA/Condition4/") + HIST(OccDire[occRobustMode]) + HIST(OccDire[occMode]) + HIST(OccNames[occName]), (std::log(occValue / occRobustValue)) * std::sqrt(occValue + occRobustValue)); occupancyQA.fill(HIST("occTrackQA/Condition3/") + HIST(OccDire[occRobustMode]) + HIST(OccDire[occMode]) + HIST(OccNames[occName]), (std::log(occValue / occRobustValue)) * std::sqrt(occValue + occRobustValue)); occupancyQA.fill(HIST("occTrackQA/Condition2/") + HIST(OccDire[occRobustMode]) + HIST(OccDire[occMode]) + HIST(OccNames[occName]), (std::log(occValue / occRobustValue)) * std::sqrt(occValue + occRobustValue)); - } else if (std::abs(occRobustValue + occValue) > 50) { + } else if (std::abs(occRobustValue + occValue) > fifty) { occupancyQA.fill(HIST("occTrackQA/Condition3/") + HIST(OccDire[occRobustMode]) + HIST(OccDire[occMode]) + HIST(OccNames[occName]), (std::log(occValue / occRobustValue)) * std::sqrt(occValue + occRobustValue)); occupancyQA.fill(HIST("occTrackQA/Condition2/") + HIST(OccDire[occRobustMode]) + HIST(OccDire[occMode]) + HIST(OccNames[occName]), (std::log(occValue / occRobustValue)) * std::sqrt(occValue + occRobustValue)); - } else if (std::abs(occRobustValue + occValue) > 20) { + } else if (std::abs(occRobustValue + occValue) > twenty) { occupancyQA.fill(HIST("occTrackQA/Condition2/") + HIST(OccDire[occRobustMode]) + HIST(OccDire[occMode]) + HIST(OccNames[occName]), (std::log(occValue / occRobustValue)) * std::sqrt(occValue + occRobustValue)); } } // conditional filling end @@ -1137,15 +1692,7 @@ struct TrackMeanOccTableProducer { } } - using MyCollisions = soa::Join; - using MyTracks = soa::Join; using MyTracksQA = aod::TracksQA_002; - using MyBCTable = soa::Join; - - using MyOccsDet = soa::Join; - using MyOccsTrackMult = soa::Join; - using MyOccsMultExtra = soa::Join; - using MyOccsRobust = soa::Join; // Process the Data int dfCount = 0; @@ -1157,520 +1704,902 @@ struct TrackMeanOccTableProducer { int64_t tfIdThis = -1; int bcInTF = -1; - void process(MyBCTable const& BCs, MyCollisions const& collisions, MyTracks const& tracks, MyTracksQA const& tracksQA, - // o2::aod::AmbiguousTracks const& ambgTracks, o2::aod::Origins const& Origins, aod::OccsBCsList const& occsBCsList, //tables only used during debugging - MyOccsDet const& occsDet, MyOccsTrackMult const& occsTrackMult, - MyOccsMultExtra const& occsMultExtra, MyOccsRobust const& occsRobust) + enum ProcessTags { + kProcessNothing = 0, + kProcessOnlyOccPrim, + kProcessOnlyOccT0V0, + kProcessOnlyOccFDD, + kProcessOnlyOccNtrackDet, + kProcessOnlyOccMultExtra, + kProcessOnlyRobustT0V0Prim, + kProcessOnlyRobustFDDT0V0Prim, + kProcessOnlyRobustNtrackDet, + kProcessOnlyRobustMultExtra, + kProcessFullOccTableProducer + }; + + enum FillMode { + checkTableMode = 0, + checkQAMode, + doNotFill, + fillOccRobustT0V0dependentQA, + fillMeanOccTable, + fillWeightMeanOccTable + }; + + template + void executeTrackOccProducerProcessing(B const& BCs, C const& collisions, T const& tracks, U const& tracksQA, O const& occsRobustT0V0Prim, V const& occs, bool const& executeInThisBlock) { - // dfCount++;LOG(info) << "DEBUG 2 :: df_" << dfCount ;//<< " :: DF_" << Origins.begin().dataframeID() << " :: collisions.size() = " << collisions.size() << " :: tracks.size() = " << tracks.size() << " :: tracksQA.size() = " << tracksQA.size() - // << " :: MyBCTable.size() = " << BCs.size() - // << " :: occsBCsList.size() = " <(BCs, collisions, tracks, tracksQA, occsRobustT0V0Prim, occs, executeInThisBlock); + } else { + executeTrackOccProducerProcessing(BCs, collisions, tracks, tracksQA, occsRobustT0V0Prim, occs, executeInThisBlock); } + } + if constexpr (meanTableMode == checkTableMode) { + return; + } - // Checking out of the range errors - if (trackQA.trackId() < 0 || tracks.size() <= trackQA.trackId()) { - LOG(error) << "DEBUG :: ERROR :: trackQA has index out of scope :: trackQA.trackId() = " << trackQA.trackId() << " :: track.collisionId() = " << track.collisionId() << " :: track.signed1Pt() = " << track.signed1Pt(); - } - if (!hasCollision && !isAmbgTrack) { - LOG(error) << "DEBUG :: ERROR :: A track with no collsiion and is not Ambiguous"; - } - if (hasCollision && isAmbgTrack) { - LOG(error) << "DEBUG :: ERROR :: A track has collision and is also ambiguous"; + if (weightMeanTableMode == checkTableMode) { + if (buildFlag01WeightMeanTable) { + executeTrackOccProducerProcessing(BCs, collisions, tracks, tracksQA, occsRobustT0V0Prim, occs, executeInThisBlock); + } else { + executeTrackOccProducerProcessing(BCs, collisions, tracks, tracksQA, occsRobustT0V0Prim, occs, executeInThisBlock); } + } + if constexpr (weightMeanTableMode == checkTableMode) { + return; + } - if (hasCollision) { - lastTrackHadCollision = true; + if (qaMode == checkQAMode) { + if (fillQA1 || fillQA2) { + if (occsRobustT0V0Prim.size() == 0) { + LOG(error) << "DEBUG :: ERROR ERROR ERROR :: OccsRobustT0V0Prim.size() == 0 :: Check \"occupancy-table-producer\" for \"buildOnlyOccsT0V0Prim == true\" & \"processOnlyOccT0V0PrimUnfm == true\""; + return; + } + executeTrackOccProducerProcessing(BCs, collisions, tracks, tracksQA, occsRobustT0V0Prim, occs, executeInThisBlock); + } else { + executeTrackOccProducerProcessing(BCs, collisions, tracks, tracksQA, occsRobustT0V0Prim, occs, executeInThisBlock); } - doCollisionUpdate = false; // default is false; - doAmbgUpdate = false; - if (hasCollision) { - if (lastTrackHadCollision) { - if (collision.globalIndex() == oldCollisionIndex) { // if collisions are same - doCollisionUpdate = false; - } else { // if collisions are different + } + if constexpr (qaMode == checkQAMode) { + return; + } + + // BCs.bindExternalIndices(&occsDet); + // BCs.bindExternalIndices(&occsNTrackDet); + // BCs.bindExternalIndices(&occsRobust); + + if constexpr (meanTableMode == checkTableMode || weightMeanTableMode == checkTableMode || qaMode == checkQAMode) { + return; + } else { + occupancyQA.fill(HIST("h_DFcount_Lvl2"), processMode); + + auto bc = BCs.begin(); + + int64_t oldTFid = -1; + + int64_t oldCollisionIndex = -100; + bool hasCollision = false; + bool isAmbgTrack = false; + bool lastTrackHadCollision = false; + bool doCollisionUpdate = false; + bool doAmbgUpdate = false; + + double rBegin = 90., rEnd = 245.; + double zBegin; // collision.posZ() + track.tgl()*rBegin; + double zEnd; // collision.posZ() + track.tgl()*rEnd; + double vdrift = 2.64; + + double dTbegin; // ((250.- TMath::Abs(zBegin))/vdrift)/0.025;//bin + double dTend; // ((250.- TMath::Abs(zEnd))/vdrift)/0.025; //bin + + double bcBegin; // tGlobalBC + dTbegin; + double bcEnd; // tGlobalBC + dTend ; + + int binBCbegin; + int binBCend; + + float meanOccPrimUnfm80 = 0; + float meanOccFV0AUnfm80 = 0; + float meanOccFV0CUnfm80 = 0; + float meanOccFT0AUnfm80 = 0; + float meanOccFT0CUnfm80 = 0; + float meanOccFDDAUnfm80 = 0; + float meanOccFDDCUnfm80 = 0; + + float meanOccNTrackITSUnfm80 = 0; + float meanOccNTrackTPCUnfm80 = 0; + float meanOccNTrackTRDUnfm80 = 0; + float meanOccNTrackTOFUnfm80 = 0; + float meanOccNTrackSizeUnfm80 = 0; + float meanOccNTrackTPCAUnfm80 = 0; + float meanOccNTrackTPCCUnfm80 = 0; + float meanOccNTrackITSTPCUnfm80 = 0; + float meanOccNTrackITSTPCAUnfm80 = 0; + float meanOccNTrackITSTPCCUnfm80 = 0; + + float meanOccMultNTracksHasITSUnfm80 = 0; + float meanOccMultNTracksHasTPCUnfm80 = 0; + float meanOccMultNTracksHasTOFUnfm80 = 0; + float meanOccMultNTracksHasTRDUnfm80 = 0; + float meanOccMultNTracksITSOnlyUnfm80 = 0; + float meanOccMultNTracksTPCOnlyUnfm80 = 0; + float meanOccMultNTracksITSTPCUnfm80 = 0; + float meanOccMultAllTracksTPCOnlyUnfm80 = 0; + + float meanOccRobustT0V0PrimUnfm80 = 0; + float meanOccRobustFDDT0V0PrimUnfm80 = 0; + float meanOccRobustNtrackDetUnfm80 = 0; + float meanOccRobustMultTableUnfm80 = 0; + + float weightMeanOccPrimUnfm80 = 0; + float weightMeanOccFV0AUnfm80 = 0; + float weightMeanOccFV0CUnfm80 = 0; + float weightMeanOccFT0AUnfm80 = 0; + float weightMeanOccFT0CUnfm80 = 0; + float weightMeanOccFDDAUnfm80 = 0; + float weightMeanOccFDDCUnfm80 = 0; + + float weightMeanOccNTrackITSUnfm80 = 0; + float weightMeanOccNTrackTPCUnfm80 = 0; + float weightMeanOccNTrackTRDUnfm80 = 0; + float weightMeanOccNTrackTOFUnfm80 = 0; + float weightMeanOccNTrackSizeUnfm80 = 0; + float weightMeanOccNTrackTPCAUnfm80 = 0; + float weightMeanOccNTrackTPCCUnfm80 = 0; + float weightMeanOccNTrackITSTPCUnfm80 = 0; + float weightMeanOccNTrackITSTPCAUnfm80 = 0; + float weightMeanOccNTrackITSTPCCUnfm80 = 0; + + float weightMeanOccMultNTracksHasITSUnfm80 = 0; + float weightMeanOccMultNTracksHasTPCUnfm80 = 0; + float weightMeanOccMultNTracksHasTOFUnfm80 = 0; + float weightMeanOccMultNTracksHasTRDUnfm80 = 0; + float weightMeanOccMultNTracksITSOnlyUnfm80 = 0; + float weightMeanOccMultNTracksTPCOnlyUnfm80 = 0; + float weightMeanOccMultNTracksITSTPCUnfm80 = 0; + float weightMeanOccMultAllTracksTPCOnlyUnfm80 = 0; + + float weightMeanOccRobustT0V0PrimUnfm80 = 0; + float weightMeanOccRobustFDDT0V0PrimUnfm80 = 0; + float weightMeanOccRobustNtrackDetUnfm80 = 0; + float weightMeanOccRobustMultTableUnfm80 = 0; + + for (const auto& trackQA : tracksQA) { + auto const& track = trackQA.template track_as(); + auto collision = collisions.begin(); + + hasCollision = false; + isAmbgTrack = false; + + if (track.collisionId() >= 0) { // track has collision + collision = track.template collision_as(); // It will build but crash while running for tracks with track.collisionId()= -1;//ambg tracks/orphan tracks + if (track.collisionId() != collision.globalIndex()) { + LOG(error) << "DEBUG :: ERROR :: track collId and collID Mismatch"; + } + hasCollision = true; + } else { // track is ambiguous/orphan + isAmbgTrack = true; + } + + // Checking out of the range errors + if (trackQA.trackId() < 0 || tracks.size() <= trackQA.trackId()) { + LOG(error) << "DEBUG :: ERROR :: trackQA has index out of scope :: trackQA.trackId() = " << trackQA.trackId() << " :: track.collisionId() = " << track.collisionId() << " :: track.signed1Pt() = " << track.signed1Pt(); + } + if (!hasCollision && !isAmbgTrack) { + LOG(error) << "DEBUG :: ERROR :: A track with no collsiion and is not Ambiguous"; + } + if (hasCollision && isAmbgTrack) { + LOG(error) << "DEBUG :: ERROR :: A track has collision and is also ambiguous"; + } + + if (hasCollision) { + lastTrackHadCollision = true; + } + doCollisionUpdate = false; // default is false; + doAmbgUpdate = false; + if (hasCollision) { + if (lastTrackHadCollision) { + if (collision.globalIndex() == oldCollisionIndex) { // if collisions are same + doCollisionUpdate = false; + } else { // if collisions are different + doCollisionUpdate = true; + } + } else { // LastTrackWasAmbiguous doCollisionUpdate = true; } - } else { // LastTrackWasAmbiguous - doCollisionUpdate = true; + } else if (isAmbgTrack) { + doAmbgUpdate = true; + // To be updated later + // if(LastTrackIsAmbg){ + // if( haveSameInfo ) { doAmbgUpdate = false;} + // else { doAmbgUpdate = true; } + // } + // else { doAmbgUpdate = true;} //Last track had Collisions } - } else if (isAmbgTrack) { - doAmbgUpdate = true; - // To be updated later - // if(LastTrackIsAmbg){ - // if( haveSameInfo ) { doAmbgUpdate = false;} - // else { doAmbgUpdate = true; } - // } - // else { doAmbgUpdate = true;} //Last track had Collisions - } - if (doAmbgUpdate) { // sKipping ambiguous tracks for now, will be updated in future - continue; - } - if (doCollisionUpdate || doAmbgUpdate) { // collision.globalIndex() != oldCollisionIndex){ //don't update if info is same as old collision - if (doCollisionUpdate) { - oldCollisionIndex = collision.globalIndex(); - bc = collision.bc_as(); + if (doAmbgUpdate) { // sKipping ambiguous tracks for now, will be updated in future + continue; } - if (doAmbgUpdate) { - // to be updated later - // bc = collisions.iteratorAt(2).bc_as(); - // bc = ambgTracks.iteratorAt(0).bc_as(); + if (doCollisionUpdate || doAmbgUpdate) { // collision.globalIndex() != oldCollisionIndex){ //don't update if info is same as old collision + if (doCollisionUpdate) { + oldCollisionIndex = collision.globalIndex(); + bc = collision.template bc_as(); + } + if (doAmbgUpdate) { + // to be updated later + // bc = collisions.iteratorAt(2).bc_as(); + // bc = ambgTracks.iteratorAt(0).bc_as(); + } + // LOG(info)<<" What happens in the case when the collision id is = -1 and it tries to obtain bc" + getTimingInfo(bc, lastRun, nBCsPerTF, bcSOR, time, tfIdThis, bcInTF); + } + + if (tfIdThis != oldTFid) { + oldTFid = tfIdThis; + auto occsList = occs.iteratorAt(bc.occId()); + + if constexpr (qaMode == fillOccRobustT0V0dependentQA) { + std::copy(occsRobustT0V0Prim.iteratorAt(bc.occId()).occRobustT0V0PrimUnfm80().begin(), occsRobustT0V0Prim.iteratorAt(bc.occId()).occRobustT0V0PrimUnfm80().end(), occRobustT0V0PrimUnfm80.begin()); + } + + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccPrim) { + std::copy(occsList.occPrimUnfm80().begin(), occsList.occPrimUnfm80().end(), occPrimUnfm80.begin()); + } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccT0V0) { + std::copy(occsList.occFV0AUnfm80().begin(), occsList.occFV0AUnfm80().end(), occFV0AUnfm80.begin()); + std::copy(occsList.occFV0CUnfm80().begin(), occsList.occFV0CUnfm80().end(), occFV0CUnfm80.begin()); + std::copy(occsList.occFT0AUnfm80().begin(), occsList.occFT0AUnfm80().end(), occFT0AUnfm80.begin()); + std::copy(occsList.occFT0CUnfm80().begin(), occsList.occFT0CUnfm80().end(), occFT0CUnfm80.begin()); + } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccFDD) { + std::copy(occsList.occFDDAUnfm80().begin(), occsList.occFDDAUnfm80().end(), occFDDAUnfm80.begin()); + std::copy(occsList.occFDDCUnfm80().begin(), occsList.occFDDCUnfm80().end(), occFDDCUnfm80.begin()); + } + + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccNtrackDet) { + std::copy(occsList.occNTrackITSUnfm80().begin(), occsList.occNTrackITSUnfm80().end(), occNTrackITSUnfm80.begin()); + std::copy(occsList.occNTrackTPCUnfm80().begin(), occsList.occNTrackTPCUnfm80().end(), occNTrackTPCUnfm80.begin()); + std::copy(occsList.occNTrackTRDUnfm80().begin(), occsList.occNTrackTRDUnfm80().end(), occNTrackTRDUnfm80.begin()); + std::copy(occsList.occNTrackTOFUnfm80().begin(), occsList.occNTrackTOFUnfm80().end(), occNTrackTOFUnfm80.begin()); + std::copy(occsList.occNTrackSizeUnfm80().begin(), occsList.occNTrackSizeUnfm80().end(), occNTrackSizeUnfm80.begin()); + std::copy(occsList.occNTrackTPCAUnfm80().begin(), occsList.occNTrackTPCAUnfm80().end(), occNTrackTPCAUnfm80.begin()); + std::copy(occsList.occNTrackTPCCUnfm80().begin(), occsList.occNTrackTPCCUnfm80().end(), occNTrackTPCCUnfm80.begin()); + std::copy(occsList.occNTrackITSTPCUnfm80().begin(), occsList.occNTrackITSTPCUnfm80().end(), occNTrackITSTPCUnfm80.begin()); + std::copy(occsList.occNTrackITSTPCAUnfm80().begin(), occsList.occNTrackITSTPCAUnfm80().end(), occNTrackITSTPCAUnfm80.begin()); + std::copy(occsList.occNTrackITSTPCCUnfm80().begin(), occsList.occNTrackITSTPCCUnfm80().end(), occNTrackITSTPCCUnfm80.begin()); + } + + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccMultExtra) { + std::copy(occsList.occMultNTracksHasITSUnfm80().begin(), occsList.occMultNTracksHasITSUnfm80().end(), occMultNTracksHasITSUnfm80.begin()); + std::copy(occsList.occMultNTracksHasTPCUnfm80().begin(), occsList.occMultNTracksHasTPCUnfm80().end(), occMultNTracksHasTPCUnfm80.begin()); + std::copy(occsList.occMultNTracksHasTOFUnfm80().begin(), occsList.occMultNTracksHasTOFUnfm80().end(), occMultNTracksHasTOFUnfm80.begin()); + std::copy(occsList.occMultNTracksHasTRDUnfm80().begin(), occsList.occMultNTracksHasTRDUnfm80().end(), occMultNTracksHasTRDUnfm80.begin()); + std::copy(occsList.occMultNTracksITSOnlyUnfm80().begin(), occsList.occMultNTracksITSOnlyUnfm80().end(), occMultNTracksITSOnlyUnfm80.begin()); + std::copy(occsList.occMultNTracksTPCOnlyUnfm80().begin(), occsList.occMultNTracksTPCOnlyUnfm80().end(), occMultNTracksTPCOnlyUnfm80.begin()); + std::copy(occsList.occMultNTracksITSTPCUnfm80().begin(), occsList.occMultNTracksITSTPCUnfm80().end(), occMultNTracksITSTPCUnfm80.begin()); + std::copy(occsList.occMultAllTracksTPCOnlyUnfm80().begin(), occsList.occMultAllTracksTPCOnlyUnfm80().end(), occMultAllTracksTPCOnlyUnfm80.begin()); + } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyRobustT0V0Prim) { + std::copy(occsList.occRobustT0V0PrimUnfm80().begin(), occsList.occRobustT0V0PrimUnfm80().end(), occRobustT0V0PrimUnfm80.begin()); + } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyRobustFDDT0V0Prim) { + std::copy(occsList.occRobustFDDT0V0PrimUnfm80().begin(), occsList.occRobustFDDT0V0PrimUnfm80().end(), occRobustFDDT0V0PrimUnfm80.begin()); + } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyRobustNtrackDet) { + std::copy(occsList.occRobustNtrackDetUnfm80().begin(), occsList.occRobustNtrackDetUnfm80().end(), occRobustNtrackDetUnfm80.begin()); + } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyRobustMultExtra) { + std::copy(occsList.occRobustMultExtraTableUnfm80().begin(), occsList.occRobustMultExtraTableUnfm80().end(), occRobustMultTableUnfm80.begin()); + } } - // LOG(info)<<" What happens in the case when the collision id is = -1 and it tries to obtain bc" - getTimingInfo(bc, lastRun, nBCsPerTF, bcSOR, time, tfIdThis, bcInTF); - } - if (tfIdThis != oldTFid) { - oldTFid = tfIdThis; - // auto OccList = Occs.iteratorAt(bc.occId()); - if (buildTrackMeanOccs1 || buildTrackMeanOccs5) { - auto listOccsDet = occsDet.iteratorAt(bc.occId()); - std::copy(listOccsDet.occPrimUnfm80().begin(), listOccsDet.occPrimUnfm80().end(), occPrimUnfm80.begin()); - std::copy(listOccsDet.occFV0AUnfm80().begin(), listOccsDet.occFV0AUnfm80().end(), occFV0AUnfm80.begin()); - std::copy(listOccsDet.occFV0CUnfm80().begin(), listOccsDet.occFV0CUnfm80().end(), occFV0CUnfm80.begin()); - std::copy(listOccsDet.occFT0AUnfm80().begin(), listOccsDet.occFT0AUnfm80().end(), occFT0AUnfm80.begin()); - std::copy(listOccsDet.occFT0CUnfm80().begin(), listOccsDet.occFT0CUnfm80().end(), occFT0CUnfm80.begin()); - std::copy(listOccsDet.occFDDAUnfm80().begin(), listOccsDet.occFDDAUnfm80().end(), occFDDAUnfm80.begin()); - std::copy(listOccsDet.occFDDCUnfm80().begin(), listOccsDet.occFDDCUnfm80().end(), occFDDCUnfm80.begin()); + // Timebc = TGlobalBC+ΔTdrift + // ΔTdrift=((250(cm)-abs(z))/vdrift) + // vdrift=2.64 cm/μs + // z=zv+tgl*Radius + + rBegin = 90., rEnd = 245.; // in cm + zBegin = collision.posZ() + track.tgl() * rBegin; // in cm + zEnd = collision.posZ() + track.tgl() * rEnd; // in cm + vdrift = 2.64; // cm/μs + float length = 250.0; + // clip the result at 250 + if (zBegin > length) { + zBegin = 250; + } else if (zBegin < -length) { + zBegin = -250; } - if (buildTrackMeanOccs2 || buildTrackMeanOccs6) { - auto listOccsTrackMult = occsTrackMult.iteratorAt(bc.occId()); - ; - std::copy(listOccsTrackMult.occNTrackITSUnfm80().begin(), listOccsTrackMult.occNTrackITSUnfm80().end(), occNTrackITSUnfm80.begin()); - std::copy(listOccsTrackMult.occNTrackTPCUnfm80().begin(), listOccsTrackMult.occNTrackTPCUnfm80().end(), occNTrackTPCUnfm80.begin()); - std::copy(listOccsTrackMult.occNTrackTRDUnfm80().begin(), listOccsTrackMult.occNTrackTRDUnfm80().end(), occNTrackTRDUnfm80.begin()); - std::copy(listOccsTrackMult.occNTrackTOFUnfm80().begin(), listOccsTrackMult.occNTrackTOFUnfm80().end(), occNTrackTOFUnfm80.begin()); - std::copy(listOccsTrackMult.occNTrackSizeUnfm80().begin(), listOccsTrackMult.occNTrackSizeUnfm80().end(), occNTrackSizeUnfm80.begin()); - std::copy(listOccsTrackMult.occNTrackTPCAUnfm80().begin(), listOccsTrackMult.occNTrackTPCAUnfm80().end(), occNTrackTPCAUnfm80.begin()); - std::copy(listOccsTrackMult.occNTrackTPCCUnfm80().begin(), listOccsTrackMult.occNTrackTPCCUnfm80().end(), occNTrackTPCCUnfm80.begin()); - std::copy(listOccsTrackMult.occNTrackITSTPCUnfm80().begin(), listOccsTrackMult.occNTrackITSTPCUnfm80().end(), occNTrackITSTPCUnfm80.begin()); - std::copy(listOccsTrackMult.occNTrackITSTPCAUnfm80().begin(), listOccsTrackMult.occNTrackITSTPCAUnfm80().end(), occNTrackITSTPCAUnfm80.begin()); - std::copy(listOccsTrackMult.occNTrackITSTPCCUnfm80().begin(), listOccsTrackMult.occNTrackITSTPCCUnfm80().end(), occNTrackITSTPCCUnfm80.begin()); + if (zEnd > length) { + zEnd = 250; + } else if (zEnd < -length) { + zEnd = -250; } - if (buildTrackMeanOccs3 || buildTrackMeanOccs7) { - auto listOccsMultExtra = occsMultExtra.iteratorAt(bc.occId()); - ; - std::copy(listOccsMultExtra.occMultNTracksHasITSUnfm80().begin(), listOccsMultExtra.occMultNTracksHasITSUnfm80().end(), occMultNTracksHasITSUnfm80.begin()); - std::copy(listOccsMultExtra.occMultNTracksHasTPCUnfm80().begin(), listOccsMultExtra.occMultNTracksHasTPCUnfm80().end(), occMultNTracksHasTPCUnfm80.begin()); - std::copy(listOccsMultExtra.occMultNTracksHasTOFUnfm80().begin(), listOccsMultExtra.occMultNTracksHasTOFUnfm80().end(), occMultNTracksHasTOFUnfm80.begin()); - std::copy(listOccsMultExtra.occMultNTracksHasTRDUnfm80().begin(), listOccsMultExtra.occMultNTracksHasTRDUnfm80().end(), occMultNTracksHasTRDUnfm80.begin()); - std::copy(listOccsMultExtra.occMultNTracksITSOnlyUnfm80().begin(), listOccsMultExtra.occMultNTracksITSOnlyUnfm80().end(), occMultNTracksITSOnlyUnfm80.begin()); - std::copy(listOccsMultExtra.occMultNTracksTPCOnlyUnfm80().begin(), listOccsMultExtra.occMultNTracksTPCOnlyUnfm80().end(), occMultNTracksTPCOnlyUnfm80.begin()); - std::copy(listOccsMultExtra.occMultNTracksITSTPCUnfm80().begin(), listOccsMultExtra.occMultNTracksITSTPCUnfm80().end(), occMultNTracksITSTPCUnfm80.begin()); - std::copy(listOccsMultExtra.occMultAllTracksTPCOnlyUnfm80().begin(), listOccsMultExtra.occMultAllTracksTPCOnlyUnfm80().end(), occMultAllTracksTPCOnlyUnfm80.begin()); + dTbegin = ((length - std::abs(zBegin)) / vdrift) / 0.025; + dTend = ((length - std::abs(zEnd)) / vdrift) / 0.025; + + bcBegin = bcInTF + dTbegin; + bcEnd = bcInTF + dTend; + + binBCbegin = bcBegin / 80; + binBCend = bcEnd / 80; + + // If multiple process are on, fill this table only once + if (executeInThisBlock) { + genTmoTrackId(track.globalIndex()); } - auto listOccsRobust = occsRobust.iteratorAt(bc.occId()); - std::copy(listOccsRobust.occRobustT0V0PrimUnfm80().begin(), listOccsRobust.occRobustT0V0PrimUnfm80().end(), occRobustT0V0PrimUnfm80.begin()); - if (buildTrackMeanOccs4 || buildTrackMeanOccs8) { - std::copy(listOccsRobust.occRobustFDDT0V0PrimUnfm80().begin(), listOccsRobust.occRobustFDDT0V0PrimUnfm80().end(), occRobustFDDT0V0PrimUnfm80.begin()); - std::copy(listOccsRobust.occRobustNtrackDetUnfm80().begin(), listOccsRobust.occRobustNtrackDetUnfm80().end(), occRobustNtrackDetUnfm80.begin()); - std::copy(listOccsRobust.occRobustMultExtraTableUnfm80().begin(), listOccsRobust.occRobustMultExtraTableUnfm80().end(), occRobustMultTableUnfm80.begin()); + if constexpr (qaMode == fillOccRobustT0V0dependentQA) { + if constexpr (meanTableMode == fillMeanOccTable) { + meanOccRobustT0V0PrimUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occRobustT0V0PrimUnfm80); + } + if constexpr (weightMeanTableMode == fillWeightMeanOccTable) { + weightMeanOccRobustT0V0PrimUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occRobustT0V0PrimUnfm80); + } } - } - // Timebc = TGlobalBC+ΔTdrift - // ΔTdrift=((250(cm)-abs(z))/vdrift) - // vdrift=2.64 cm/μs - // z=zv+tgl*Radius - - rBegin = 90., rEnd = 245.; // in cm - zBegin = collision.posZ() + track.tgl() * rBegin; // in cm - zEnd = collision.posZ() + track.tgl() * rEnd; // in cm - vdrift = 2.64; // cm/μs - - // clip the result at 250 - if (zBegin > 250) { - zBegin = 250; - } else if (zBegin < -250) { - zBegin = -250; - } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccPrim) { + if constexpr (meanTableMode == fillMeanOccTable) { + meanOccPrimUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occPrimUnfm80); + genTmoPrim(meanOccPrimUnfm80); + fillQAInfo(meanOccPrimUnfm80, meanOccRobustT0V0PrimUnfm80); + } + if constexpr (weightMeanTableMode == fillWeightMeanOccTable) { + weightMeanOccPrimUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occPrimUnfm80); + genTwmoPrim(weightMeanOccPrimUnfm80); + fillQAInfo(weightMeanOccPrimUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccPrimUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + } + } - if (zEnd > 250) { - zEnd = 250; - } else if (zEnd < -250) { - zEnd = -250; - } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccT0V0) { + if constexpr (meanTableMode == fillMeanOccTable) { + meanOccFV0AUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occFV0AUnfm80); + meanOccFV0CUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occFV0CUnfm80); + meanOccFT0AUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occFT0AUnfm80); + meanOccFT0CUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occFT0CUnfm80); + genTmoT0V0(meanOccFV0AUnfm80, + meanOccFV0CUnfm80, + meanOccFT0AUnfm80, + meanOccFT0CUnfm80); + fillQAInfo(meanOccFV0AUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccFV0CUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccFT0AUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccFT0CUnfm80, meanOccRobustT0V0PrimUnfm80); + } + if constexpr (weightMeanTableMode == fillWeightMeanOccTable) { + weightMeanOccFV0AUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occFV0AUnfm80); + weightMeanOccFV0CUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occFV0CUnfm80); + weightMeanOccFT0AUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occFT0AUnfm80); + weightMeanOccFT0CUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occFT0CUnfm80); + genTwmoT0V0(weightMeanOccFV0AUnfm80, + weightMeanOccFV0CUnfm80, + weightMeanOccFT0AUnfm80, + weightMeanOccFT0CUnfm80); + fillQAInfo(weightMeanOccFV0AUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccFV0CUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccFT0AUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccFT0CUnfm80, meanOccRobustT0V0PrimUnfm80); + + fillQAInfo(weightMeanOccFV0AUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccFV0CUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccFT0AUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccFT0CUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + } + } - dTbegin = ((250. - std::abs(zBegin)) / vdrift) / 0.025; - dTend = ((250. - std::abs(zEnd)) / vdrift) / 0.025; - - bcBegin = bcInTF + dTbegin; - bcEnd = bcInTF + dTend; - - binBCbegin = bcBegin / 80; - binBCend = bcEnd / 80; - - genTrackMeanOccs0(track.globalIndex()); - - meanOccRobustT0V0PrimUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occRobustT0V0PrimUnfm80); - weightMeanOccRobustT0V0PrimUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occRobustT0V0PrimUnfm80); - - if (buildTrackMeanOccs1) { - meanOccPrimUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occPrimUnfm80); - meanOccFV0AUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occFV0AUnfm80); - meanOccFV0CUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occFV0CUnfm80); - meanOccFT0AUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occFT0AUnfm80); - meanOccFT0CUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occFT0CUnfm80); - meanOccFDDAUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occFDDAUnfm80); - meanOccFDDCUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occFDDCUnfm80); - - genTrackMeanOccs1(meanOccPrimUnfm80, - meanOccFV0AUnfm80, - meanOccFV0CUnfm80, - meanOccFT0AUnfm80, - meanOccFT0CUnfm80, - meanOccFDDAUnfm80, - meanOccFDDCUnfm80); - - fillQAInfo(meanOccPrimUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(meanOccFV0AUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(meanOccFV0CUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(meanOccFT0AUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(meanOccFT0CUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(meanOccFDDAUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(meanOccFDDCUnfm80, meanOccRobustT0V0PrimUnfm80); - } - if (buildTrackMeanOccs2) { - meanOccNTrackITSUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackITSUnfm80); - meanOccNTrackTPCUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackTPCUnfm80); - meanOccNTrackTRDUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackTRDUnfm80); - meanOccNTrackTOFUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackTOFUnfm80); - meanOccNTrackSizeUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackSizeUnfm80); - meanOccNTrackTPCAUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackTPCAUnfm80); - meanOccNTrackTPCCUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackTPCCUnfm80); - meanOccNTrackITSTPCUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackITSTPCUnfm80); - meanOccNTrackITSTPCAUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackITSTPCAUnfm80); - meanOccNTrackITSTPCCUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackITSTPCCUnfm80); - - genTrackMeanOccs2(meanOccNTrackITSUnfm80, - meanOccNTrackTPCUnfm80, - meanOccNTrackTRDUnfm80, - meanOccNTrackTOFUnfm80, - meanOccNTrackSizeUnfm80, - meanOccNTrackTPCAUnfm80, - meanOccNTrackTPCCUnfm80, - meanOccNTrackITSTPCUnfm80, - meanOccNTrackITSTPCAUnfm80, - meanOccNTrackITSTPCCUnfm80); - - fillQAInfo(meanOccNTrackITSUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(meanOccNTrackTPCUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(meanOccNTrackTRDUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(meanOccNTrackTOFUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(meanOccNTrackSizeUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(meanOccNTrackTPCAUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(meanOccNTrackTPCCUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(meanOccNTrackITSTPCUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(meanOccNTrackITSTPCAUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(meanOccNTrackITSTPCCUnfm80, meanOccRobustT0V0PrimUnfm80); - } - if (buildTrackMeanOccs3) { - meanOccMultNTracksHasITSUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasITSUnfm80); - meanOccMultNTracksHasTPCUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasTPCUnfm80); - meanOccMultNTracksHasTOFUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasTOFUnfm80); - meanOccMultNTracksHasTRDUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasTRDUnfm80); - meanOccMultNTracksITSOnlyUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occMultNTracksITSOnlyUnfm80); - meanOccMultNTracksTPCOnlyUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occMultNTracksTPCOnlyUnfm80); - meanOccMultNTracksITSTPCUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occMultNTracksITSTPCUnfm80); - meanOccMultAllTracksTPCOnlyUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occMultAllTracksTPCOnlyUnfm80); - - genTrackMeanOccs3(meanOccMultNTracksHasITSUnfm80, - meanOccMultNTracksHasTPCUnfm80, - meanOccMultNTracksHasTOFUnfm80, - meanOccMultNTracksHasTRDUnfm80, - meanOccMultNTracksITSOnlyUnfm80, - meanOccMultNTracksTPCOnlyUnfm80, - meanOccMultNTracksITSTPCUnfm80, - meanOccMultAllTracksTPCOnlyUnfm80); - - fillQAInfo(meanOccMultNTracksHasITSUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(meanOccMultNTracksHasTPCUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(meanOccMultNTracksHasTOFUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(meanOccMultNTracksHasTRDUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(meanOccMultNTracksITSOnlyUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(meanOccMultNTracksTPCOnlyUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(meanOccMultNTracksITSTPCUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(meanOccMultAllTracksTPCOnlyUnfm80, meanOccRobustT0V0PrimUnfm80); - } - if (buildTrackMeanOccs4) { - meanOccRobustFDDT0V0PrimUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occRobustFDDT0V0PrimUnfm80); - meanOccRobustNtrackDetUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occRobustNtrackDetUnfm80); - meanOccRobustMultTableUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occRobustMultTableUnfm80); - - genTrackMeanOccs4(meanOccRobustT0V0PrimUnfm80, - meanOccRobustFDDT0V0PrimUnfm80, - meanOccRobustNtrackDetUnfm80, - meanOccRobustMultTableUnfm80); - - fillQAInfo(meanOccRobustT0V0PrimUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(meanOccRobustFDDT0V0PrimUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(meanOccRobustNtrackDetUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(meanOccRobustMultTableUnfm80, meanOccRobustT0V0PrimUnfm80); - } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccFDD) { + if constexpr (meanTableMode == fillMeanOccTable) { + meanOccFDDAUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occFDDAUnfm80); + meanOccFDDCUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occFDDCUnfm80); + genTmoFDD(meanOccFDDAUnfm80, + meanOccFDDCUnfm80); + fillQAInfo(meanOccFDDAUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccFDDCUnfm80, meanOccRobustT0V0PrimUnfm80); + } + if constexpr (weightMeanTableMode == fillWeightMeanOccTable) { + weightMeanOccFDDAUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occFDDAUnfm80); + weightMeanOccFDDCUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occFDDCUnfm80); + genTwmoFDD(weightMeanOccFDDAUnfm80, + weightMeanOccFDDCUnfm80); + fillQAInfo(weightMeanOccFDDAUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccFDDCUnfm80, meanOccRobustT0V0PrimUnfm80); + + fillQAInfo(weightMeanOccFDDAUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccFDDCUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + } + } - if (buildTrackMeanOccs5) { - weightMeanOccPrimUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occPrimUnfm80); - weightMeanOccFV0AUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occFV0AUnfm80); - weightMeanOccFV0CUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occFV0CUnfm80); - weightMeanOccFT0AUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occFT0AUnfm80); - weightMeanOccFT0CUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occFT0CUnfm80); - weightMeanOccFDDAUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occFDDAUnfm80); - weightMeanOccFDDCUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occFDDCUnfm80); - - genTrackMeanOccs5(weightMeanOccPrimUnfm80, - weightMeanOccFV0AUnfm80, - weightMeanOccFV0CUnfm80, - weightMeanOccFT0AUnfm80, - weightMeanOccFT0CUnfm80, - weightMeanOccFDDAUnfm80, - weightMeanOccFDDCUnfm80); - - fillQAInfo(weightMeanOccPrimUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccFV0AUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccFV0CUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccFT0AUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccFT0CUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccFDDAUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccFDDCUnfm80, meanOccRobustT0V0PrimUnfm80); - - fillQAInfo(weightMeanOccPrimUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccFV0AUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccFV0CUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccFT0AUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccFT0CUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccFDDAUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccFDDCUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccNtrackDet) { + if constexpr (meanTableMode == fillMeanOccTable) { + meanOccNTrackITSUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackITSUnfm80); + meanOccNTrackTPCUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackTPCUnfm80); + meanOccNTrackTRDUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackTRDUnfm80); + meanOccNTrackTOFUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackTOFUnfm80); + meanOccNTrackSizeUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackSizeUnfm80); + meanOccNTrackTPCAUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackTPCAUnfm80); + meanOccNTrackTPCCUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackTPCCUnfm80); + meanOccNTrackITSTPCUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackITSTPCUnfm80); + meanOccNTrackITSTPCAUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackITSTPCAUnfm80); + meanOccNTrackITSTPCCUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occNTrackITSTPCCUnfm80); + genTmoNTrackDet(meanOccNTrackITSUnfm80, + meanOccNTrackTPCUnfm80, + meanOccNTrackTRDUnfm80, + meanOccNTrackTOFUnfm80, + meanOccNTrackSizeUnfm80, + meanOccNTrackTPCAUnfm80, + meanOccNTrackTPCCUnfm80, + meanOccNTrackITSTPCUnfm80, + meanOccNTrackITSTPCAUnfm80, + meanOccNTrackITSTPCCUnfm80); + fillQAInfo(meanOccNTrackITSUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccNTrackTPCUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccNTrackTRDUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccNTrackTOFUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccNTrackSizeUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccNTrackTPCAUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccNTrackTPCCUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccNTrackITSTPCUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccNTrackITSTPCAUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccNTrackITSTPCCUnfm80, meanOccRobustT0V0PrimUnfm80); + } + if constexpr (weightMeanTableMode == fillWeightMeanOccTable) { + weightMeanOccNTrackITSUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackITSUnfm80); + weightMeanOccNTrackTPCUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackTPCUnfm80); + weightMeanOccNTrackTRDUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackTRDUnfm80); + weightMeanOccNTrackTOFUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackTOFUnfm80); + weightMeanOccNTrackSizeUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackSizeUnfm80); + weightMeanOccNTrackTPCAUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackTPCAUnfm80); + weightMeanOccNTrackTPCCUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackTPCCUnfm80); + weightMeanOccNTrackITSTPCUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackITSTPCUnfm80); + weightMeanOccNTrackITSTPCAUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackITSTPCAUnfm80); + weightMeanOccNTrackITSTPCCUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackITSTPCCUnfm80); + + genTwmoNTrackDet(weightMeanOccNTrackITSUnfm80, + weightMeanOccNTrackTPCUnfm80, + weightMeanOccNTrackTRDUnfm80, + weightMeanOccNTrackTOFUnfm80, + weightMeanOccNTrackSizeUnfm80, + weightMeanOccNTrackTPCAUnfm80, + weightMeanOccNTrackTPCCUnfm80, + weightMeanOccNTrackITSTPCUnfm80, + weightMeanOccNTrackITSTPCAUnfm80, + weightMeanOccNTrackITSTPCCUnfm80); + + fillQAInfo(weightMeanOccNTrackITSUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackTPCUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackTRDUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackTOFUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackSizeUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackTPCAUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackTPCCUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackITSTPCUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackITSTPCAUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackITSTPCCUnfm80, meanOccRobustT0V0PrimUnfm80); + + fillQAInfo(weightMeanOccNTrackITSUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackTPCUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackTRDUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackTOFUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackSizeUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackTPCAUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackTPCCUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackITSTPCUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackITSTPCAUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccNTrackITSTPCCUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + } + } - if (buildTrackMeanOccs6) { - weightMeanOccNTrackITSUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackITSUnfm80); - weightMeanOccNTrackTPCUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackTPCUnfm80); - weightMeanOccNTrackTRDUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackTRDUnfm80); - weightMeanOccNTrackTOFUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackTOFUnfm80); - weightMeanOccNTrackSizeUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackSizeUnfm80); - weightMeanOccNTrackTPCAUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackTPCAUnfm80); - weightMeanOccNTrackTPCCUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackTPCCUnfm80); - weightMeanOccNTrackITSTPCUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackITSTPCUnfm80); - weightMeanOccNTrackITSTPCAUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackITSTPCAUnfm80); - weightMeanOccNTrackITSTPCCUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occNTrackITSTPCCUnfm80); - - genTrackMeanOccs6(weightMeanOccNTrackITSUnfm80, - weightMeanOccNTrackTPCUnfm80, - weightMeanOccNTrackTRDUnfm80, - weightMeanOccNTrackTOFUnfm80, - weightMeanOccNTrackSizeUnfm80, - weightMeanOccNTrackTPCAUnfm80, - weightMeanOccNTrackTPCCUnfm80, - weightMeanOccNTrackITSTPCUnfm80, - weightMeanOccNTrackITSTPCAUnfm80, - weightMeanOccNTrackITSTPCCUnfm80); - - fillQAInfo(weightMeanOccNTrackITSUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccNTrackTPCUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccNTrackTRDUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccNTrackTOFUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccNTrackSizeUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccNTrackTPCAUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccNTrackTPCCUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccNTrackITSTPCUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccNTrackITSTPCAUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccNTrackITSTPCCUnfm80, meanOccRobustT0V0PrimUnfm80); - - fillQAInfo(weightMeanOccNTrackITSUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccNTrackTPCUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccNTrackTRDUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccNTrackTOFUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccNTrackSizeUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccNTrackTPCAUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccNTrackTPCCUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccNTrackITSTPCUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccNTrackITSTPCAUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccNTrackITSTPCCUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyOccMultExtra) { + if constexpr (meanTableMode == fillMeanOccTable) { + meanOccMultNTracksHasITSUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasITSUnfm80); + meanOccMultNTracksHasTPCUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasTPCUnfm80); + meanOccMultNTracksHasTOFUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasTOFUnfm80); + meanOccMultNTracksHasTRDUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasTRDUnfm80); + meanOccMultNTracksITSOnlyUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occMultNTracksITSOnlyUnfm80); + meanOccMultNTracksTPCOnlyUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occMultNTracksTPCOnlyUnfm80); + meanOccMultNTracksITSTPCUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occMultNTracksITSTPCUnfm80); + meanOccMultAllTracksTPCOnlyUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occMultAllTracksTPCOnlyUnfm80); + genTmoMultExtra(meanOccMultNTracksHasITSUnfm80, + meanOccMultNTracksHasTPCUnfm80, + meanOccMultNTracksHasTOFUnfm80, + meanOccMultNTracksHasTRDUnfm80, + meanOccMultNTracksITSOnlyUnfm80, + meanOccMultNTracksTPCOnlyUnfm80, + meanOccMultNTracksITSTPCUnfm80, + meanOccMultAllTracksTPCOnlyUnfm80); + fillQAInfo(meanOccMultNTracksHasITSUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccMultNTracksHasTPCUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccMultNTracksHasTOFUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccMultNTracksHasTRDUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccMultNTracksITSOnlyUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccMultNTracksTPCOnlyUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccMultNTracksITSTPCUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccMultAllTracksTPCOnlyUnfm80, meanOccRobustT0V0PrimUnfm80); + } + if constexpr (weightMeanTableMode == fillWeightMeanOccTable) { + weightMeanOccMultNTracksHasITSUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasITSUnfm80); + weightMeanOccMultNTracksHasTPCUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasTPCUnfm80); + weightMeanOccMultNTracksHasTOFUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasTOFUnfm80); + weightMeanOccMultNTracksHasTRDUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasTRDUnfm80); + weightMeanOccMultNTracksITSOnlyUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksITSOnlyUnfm80); + weightMeanOccMultNTracksTPCOnlyUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksTPCOnlyUnfm80); + weightMeanOccMultNTracksITSTPCUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksITSTPCUnfm80); + weightMeanOccMultAllTracksTPCOnlyUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occMultAllTracksTPCOnlyUnfm80); + + genTwmoMultExtra(weightMeanOccMultNTracksHasITSUnfm80, + weightMeanOccMultNTracksHasTPCUnfm80, + weightMeanOccMultNTracksHasTOFUnfm80, + weightMeanOccMultNTracksHasTRDUnfm80, + weightMeanOccMultNTracksITSOnlyUnfm80, + weightMeanOccMultNTracksTPCOnlyUnfm80, + weightMeanOccMultNTracksITSTPCUnfm80, + weightMeanOccMultAllTracksTPCOnlyUnfm80); + + fillQAInfo(weightMeanOccMultNTracksHasITSUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultNTracksHasTPCUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultNTracksHasTOFUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultNTracksHasTRDUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultNTracksITSOnlyUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultNTracksTPCOnlyUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultNTracksITSTPCUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultAllTracksTPCOnlyUnfm80, meanOccRobustT0V0PrimUnfm80); + + fillQAInfo(weightMeanOccMultNTracksHasITSUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultNTracksHasTPCUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultNTracksHasTOFUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultNTracksHasTRDUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultNTracksITSOnlyUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultNTracksTPCOnlyUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultNTracksITSTPCUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccMultAllTracksTPCOnlyUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + } + } - if (buildTrackMeanOccs7) { - weightMeanOccMultNTracksHasITSUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasITSUnfm80); - weightMeanOccMultNTracksHasTPCUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasTPCUnfm80); - weightMeanOccMultNTracksHasTOFUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasTOFUnfm80); - weightMeanOccMultNTracksHasTRDUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksHasTRDUnfm80); - weightMeanOccMultNTracksITSOnlyUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksITSOnlyUnfm80); - weightMeanOccMultNTracksTPCOnlyUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksTPCOnlyUnfm80); - weightMeanOccMultNTracksITSTPCUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occMultNTracksITSTPCUnfm80); - weightMeanOccMultAllTracksTPCOnlyUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occMultAllTracksTPCOnlyUnfm80); - - genTrackMeanOccs7(weightMeanOccMultNTracksHasITSUnfm80, - weightMeanOccMultNTracksHasTPCUnfm80, - weightMeanOccMultNTracksHasTOFUnfm80, - weightMeanOccMultNTracksHasTRDUnfm80, - weightMeanOccMultNTracksITSOnlyUnfm80, - weightMeanOccMultNTracksTPCOnlyUnfm80, - weightMeanOccMultNTracksITSTPCUnfm80, - weightMeanOccMultAllTracksTPCOnlyUnfm80); - - fillQAInfo(weightMeanOccMultNTracksHasITSUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccMultNTracksHasTPCUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccMultNTracksHasTOFUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccMultNTracksHasTRDUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccMultNTracksITSOnlyUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccMultNTracksTPCOnlyUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccMultNTracksITSTPCUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccMultAllTracksTPCOnlyUnfm80, meanOccRobustT0V0PrimUnfm80); - - fillQAInfo(weightMeanOccMultNTracksHasITSUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccMultNTracksHasTPCUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccMultNTracksHasTOFUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccMultNTracksHasTRDUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccMultNTracksITSOnlyUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccMultNTracksTPCOnlyUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccMultNTracksITSTPCUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccMultAllTracksTPCOnlyUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - } + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyRobustT0V0Prim) { + if constexpr (meanTableMode == fillMeanOccTable) { + meanOccRobustT0V0PrimUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occRobustT0V0PrimUnfm80); + genTmoRT0V0Prim(meanOccRobustT0V0PrimUnfm80); + fillQAInfo(meanOccRobustT0V0PrimUnfm80, meanOccRobustT0V0PrimUnfm80); + } + if constexpr (weightMeanTableMode == fillWeightMeanOccTable) { + weightMeanOccRobustT0V0PrimUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occRobustT0V0PrimUnfm80); + genTwmoRT0V0Prim(weightMeanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccRobustT0V0PrimUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccRobustT0V0PrimUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + } + } + + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyRobustFDDT0V0Prim) { + if constexpr (meanTableMode == fillMeanOccTable) { + meanOccRobustFDDT0V0PrimUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occRobustFDDT0V0PrimUnfm80); + genTmoRFDDT0V0Prim(meanOccRobustFDDT0V0PrimUnfm80); + fillQAInfo(meanOccRobustFDDT0V0PrimUnfm80, meanOccRobustT0V0PrimUnfm80); + } + if constexpr (weightMeanTableMode == fillWeightMeanOccTable) { + weightMeanOccRobustFDDT0V0PrimUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occRobustFDDT0V0PrimUnfm80); + genTwmoRFDDT0V0Pri(weightMeanOccRobustFDDT0V0PrimUnfm80); + fillQAInfo(weightMeanOccRobustFDDT0V0PrimUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccRobustFDDT0V0PrimUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + } + } + + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyRobustNtrackDet) { + if constexpr (meanTableMode == fillMeanOccTable) { + meanOccRobustNtrackDetUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occRobustNtrackDetUnfm80); + genTmoRNtrackDet(meanOccRobustNtrackDetUnfm80); + fillQAInfo(meanOccRobustNtrackDetUnfm80, meanOccRobustT0V0PrimUnfm80); + } + if constexpr (weightMeanTableMode == fillWeightMeanOccTable) { + weightMeanOccRobustNtrackDetUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occRobustNtrackDetUnfm80); + genTwmoRNtrackDet(weightMeanOccRobustNtrackDetUnfm80); + fillQAInfo(weightMeanOccRobustNtrackDetUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccRobustNtrackDetUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + } + } + + if constexpr (processMode == kProcessFullOccTableProducer || processMode == kProcessOnlyRobustMultExtra) { + if constexpr (meanTableMode == fillMeanOccTable) { + meanOccRobustMultTableUnfm80 = getMeanOccupancy(binBCbegin, binBCend, occRobustMultTableUnfm80); + genTmoRMultExtra(meanOccRobustMultTableUnfm80); + fillQAInfo(meanOccRobustMultTableUnfm80, meanOccRobustT0V0PrimUnfm80); + } + if constexpr (weightMeanTableMode == fillWeightMeanOccTable) { + weightMeanOccRobustMultTableUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occRobustMultTableUnfm80); + genTwmoRMultExtra(weightMeanOccRobustMultTableUnfm80); + fillQAInfo(weightMeanOccRobustMultTableUnfm80, meanOccRobustT0V0PrimUnfm80); + fillQAInfo(weightMeanOccRobustMultTableUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + } + } + } // end of trackQA loop + } // end of else block of constexpr + } - if (buildTrackMeanOccs8) { - weightMeanOccRobustFDDT0V0PrimUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occRobustFDDT0V0PrimUnfm80); - weightMeanOccRobustNtrackDetUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occRobustNtrackDetUnfm80); - weightMeanOccRobustMultTableUnfm80 = getWeightedMeanOccupancy(binBCbegin, binBCend, occRobustMultTableUnfm80); - - genTrackMeanOccs8(weightMeanOccRobustT0V0PrimUnfm80, - weightMeanOccRobustFDDT0V0PrimUnfm80, - weightMeanOccRobustNtrackDetUnfm80, - weightMeanOccRobustMultTableUnfm80); - - fillQAInfo(weightMeanOccRobustT0V0PrimUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccRobustFDDT0V0PrimUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccRobustNtrackDetUnfm80, meanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccRobustMultTableUnfm80, meanOccRobustT0V0PrimUnfm80); - - fillQAInfo(weightMeanOccRobustT0V0PrimUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccRobustFDDT0V0PrimUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccRobustNtrackDetUnfm80, weightMeanOccRobustT0V0PrimUnfm80); - fillQAInfo(weightMeanOccRobustMultTableUnfm80, weightMeanOccRobustT0V0PrimUnfm80); + void checkAllProcessFunctionStatus(std::vector const& processStatusVector, bool& singleProcessOn) + { + int nProcessOn = 0; + const uint size = processStatusVector.size(); + for (uint i = 0; i < size; i++) { + if (processStatusVector[i]) { + nProcessOn++; } - } // end of trackQA loop + } + if (nProcessOn > 1) { + singleProcessOn = false; + } // check nProcess + } + + //_________________________________Process Functions start from here______________________________________________________________________________________ + void processNothing(aod::Collisions const&) + { + occupancyQA.fill(HIST("h_DFcount_Lvl0"), kProcessNothing); + return; + occupancyQA.fill(HIST("h_DFcount_Lvl1"), kProcessNothing); + } + PROCESS_SWITCH(TrackMeanOccTableProducer, processNothing, "process Nothing From Track Mean Occ Table Producer", true); + + void processOnlyOccPrim(soa::Join const& BCs, aod::Collisions const& collisions, aod::Tracks const& tracks, MyTracksQA const& tracksQA, aod::ORT0V0Prim const& occsRobustT0V0Prim, aod::OccsPrim const& occs) + { + processStatus[kProcessOnlyOccPrim] = true; + bool singleProcessOn = true; + checkAllProcessFunctionStatus(processStatus, singleProcessOn); + if (singleProcessOn) { + processInThisBlock[kProcessOnlyOccPrim] = true; + } + occupancyQA.fill(HIST("h_DFcount_Lvl0"), kProcessOnlyOccPrim); + if (collisions.size() == 0) { + return; + } + if (!buildOnlyOccsPrim && !buildFullOccTableProducer) { + LOG(error) << "DEBUG :: ERROR ERROR ERROR :: buildOnlyOccsPrim == false"; + return; + } + if (occs.size() == 0) { + LOG(error) << "DEBUG :: ERROR ERROR ERROR :: OccsPrim.size() == 0 :: Check \"occupancy-table-producer\" for \"buildOnlyOccsPrim == true\" & \"processOnlyOccPrimUnfm == true\""; + return; + } + executeTrackOccProducerProcessing(BCs, collisions, tracks, tracksQA, occsRobustT0V0Prim, occs, processInThisBlock[kProcessOnlyOccPrim]); + occupancyQA.fill(HIST("h_DFcount_Lvl1"), kProcessOnlyOccPrim); + } + PROCESS_SWITCH(TrackMeanOccTableProducer, processOnlyOccPrim, "processOnlyOccPrim", false); + + void processOnlyOccT0V0(soa::Join const& BCs, aod::Collisions const& collisions, aod::Tracks const& tracks, MyTracksQA const& tracksQA, aod::ORT0V0Prim const& occsRobustT0V0Prim, aod::OccsT0V0 const& occs) + { + processStatus[kProcessOnlyOccT0V0] = true; + bool singleProcessOn = true; + checkAllProcessFunctionStatus(processStatus, singleProcessOn); + if (singleProcessOn) { + processInThisBlock[kProcessOnlyOccT0V0] = true; + } + occupancyQA.fill(HIST("h_DFcount_Lvl0"), kProcessOnlyOccT0V0); + if (collisions.size() == 0) { + return; + } + if (!buildOnlyOccsT0V0 && !buildFullOccTableProducer) { + LOG(error) << "DEBUG :: ERROR ERROR ERROR :: buildOnlyOccsT0V0 == false"; + return; + } + if (occs.size() == 0) { + LOG(error) << "DEBUG :: ERROR ERROR ERROR :: OccsT0V0.size() == 0 :: Check \"occupancy-table-producer\" for \"buildOnlyOccsT0V0Prim == true\" & \"processOnlyOccT0V0PrimUnfm == true\""; + return; + } + executeTrackOccProducerProcessing(BCs, collisions, tracks, tracksQA, occsRobustT0V0Prim, occs, processInThisBlock[kProcessOnlyOccT0V0]); + occupancyQA.fill(HIST("h_DFcount_Lvl1"), kProcessOnlyOccT0V0); + } + PROCESS_SWITCH(TrackMeanOccTableProducer, processOnlyOccT0V0, "processOnlyOccT0V0", false); + + void processOnlyOccFDD(soa::Join const& BCs, aod::Collisions const& collisions, aod::Tracks const& tracks, MyTracksQA const& tracksQA, aod::ORT0V0Prim const& occsRobustT0V0Prim, aod::OccsFDD const& occs) + { + processStatus[kProcessOnlyOccFDD] = true; + bool singleProcessOn = true; + checkAllProcessFunctionStatus(processStatus, singleProcessOn); + if (singleProcessOn) { + processInThisBlock[kProcessOnlyOccFDD] = true; + } + occupancyQA.fill(HIST("h_DFcount_Lvl0"), kProcessOnlyOccFDD); + if (collisions.size() == 0) { + return; + } + if (!buildOnlyOccsFDD && !buildFullOccTableProducer) { + LOG(error) << "DEBUG :: ERROR ERROR ERROR :: buildOnlyOccsFDD == false"; + return; + } + if (occs.size() == 0) { + LOG(error) << "DEBUG :: ERROR ERROR ERROR :: OccsFDD.size() == 0 :: Check \"occupancy-table-producer\" for \"buildOnlyOccsFDDT0V0Prim == true\" & \"processOnlyOccFDDT0V0PrimUnfm == true\""; + return; + } + executeTrackOccProducerProcessing(BCs, collisions, tracks, tracksQA, occsRobustT0V0Prim, occs, processInThisBlock[kProcessOnlyOccFDD]); + occupancyQA.fill(HIST("h_DFcount_Lvl1"), kProcessOnlyOccFDD); + } + PROCESS_SWITCH(TrackMeanOccTableProducer, processOnlyOccFDD, "processOnlyOccFDD", false); + + void processOnlyOccNtrackDet(soa::Join const& BCs, aod::Collisions const& collisions, aod::Tracks const& tracks, MyTracksQA const& tracksQA, aod::ORT0V0Prim const& occsRobustT0V0Prim, aod::OccsNTrackDet const& occs) + { + processStatus[kProcessOnlyOccNtrackDet] = true; + bool singleProcessOn = true; + checkAllProcessFunctionStatus(processStatus, singleProcessOn); + if (singleProcessOn) { + processInThisBlock[kProcessOnlyOccNtrackDet] = true; + } + occupancyQA.fill(HIST("h_DFcount_Lvl0"), kProcessOnlyOccNtrackDet); + if (collisions.size() == 0) { + return; + } + if (!buildOnlyOccsNtrackDet && !buildFullOccTableProducer) { + LOG(error) << "DEBUG :: ERROR ERROR ERROR :: buildOnlyOccsNtrackDet == false"; + return; + } + if (occs.size() == 0) { + LOG(error) << "DEBUG :: ERROR ERROR ERROR :: OccsNtrackDet.size() == 0 :: Check \"occupancy-table-producer\" for \"buildOnlyOccsNtrackDet == true\" & \"processOnlyOccNtrackDet == true\""; + return; + } + executeTrackOccProducerProcessing(BCs, collisions, tracks, tracksQA, occsRobustT0V0Prim, occs, processInThisBlock[kProcessOnlyOccNtrackDet]); + occupancyQA.fill(HIST("h_DFcount_Lvl1"), kProcessOnlyOccNtrackDet); + } + PROCESS_SWITCH(TrackMeanOccTableProducer, processOnlyOccNtrackDet, "processOnlyOccNtrackDet", false); + + void processOnlyOccMultExtra(soa::Join const& BCs, aod::Collisions const& collisions, aod::Tracks const& tracks, MyTracksQA const& tracksQA, aod::ORT0V0Prim const& occsRobustT0V0Prim, aod::OccsMultExtra const& occs) + { + processStatus[kProcessOnlyOccMultExtra] = true; + bool singleProcessOn = true; + checkAllProcessFunctionStatus(processStatus, singleProcessOn); + if (singleProcessOn) { + processInThisBlock[kProcessOnlyOccMultExtra] = true; + } + occupancyQA.fill(HIST("h_DFcount_Lvl0"), kProcessOnlyOccMultExtra); + if (collisions.size() == 0) { + return; + } + if (!buildOnlyOccsMultExtra && !buildFullOccTableProducer) { + LOG(error) << "DEBUG :: ERROR ERROR ERROR :: buildOnlyOccsMultExtra == false"; + return; + } + if (occs.size() == 0) { + LOG(error) << "DEBUG :: ERROR ERROR ERROR :: OccsMultExtra.size() == 0 :: Check \"occupancy-table-producer\" for \"buildOnlyOccsMultExtra == true\" & \"processOnlyOccMultExtra == true\""; + return; + } + executeTrackOccProducerProcessing(BCs, collisions, tracks, tracksQA, occsRobustT0V0Prim, occs, processInThisBlock[kProcessOnlyOccMultExtra]); + occupancyQA.fill(HIST("h_DFcount_Lvl1"), kProcessOnlyOccMultExtra); + } + PROCESS_SWITCH(TrackMeanOccTableProducer, processOnlyOccMultExtra, "processOnlyOccMultExtra", false); + + void processOnlyRobustT0V0Prim(soa::Join const& BCs, aod::Collisions const& collisions, aod::Tracks const& tracks, MyTracksQA const& tracksQA, aod::ORT0V0Prim const& occsRobustT0V0Prim) + { + processStatus[kProcessOnlyRobustT0V0Prim] = true; + bool singleProcessOn = true; + checkAllProcessFunctionStatus(processStatus, singleProcessOn); + if (singleProcessOn) { + processInThisBlock[kProcessOnlyRobustT0V0Prim] = true; + } + occupancyQA.fill(HIST("h_DFcount_Lvl0"), kProcessOnlyRobustT0V0Prim); + if (collisions.size() == 0) { + return; + } + if (!buildOnlyOccsRobustT0V0Prim && !buildFullOccTableProducer) { + LOG(error) << "DEBUG :: ERROR ERROR ERROR :: buildOnlyOccsRobustT0V0Prim == false"; + return; + } + if (occsRobustT0V0Prim.size() == 0) { + LOG(error) << "DEBUG :: ERROR ERROR ERROR :: OccsRobustT0V0Prim.size() == 0 :: Check \"occupancy-table-producer\" for \"buildOnlyOccsT0V0Prim == true\" & \"processOnlyOccT0V0PrimUnfm == true\""; + return; + } + executeTrackOccProducerProcessing(BCs, collisions, tracks, tracksQA, occsRobustT0V0Prim, occsRobustT0V0Prim, processInThisBlock[kProcessOnlyRobustT0V0Prim]); + occupancyQA.fill(HIST("h_DFcount_Lvl1"), kProcessOnlyRobustT0V0Prim); + } + PROCESS_SWITCH(TrackMeanOccTableProducer, processOnlyRobustT0V0Prim, "processOnlyRobustT0V0Prim", false); + + void processOnlyRobustFDDT0V0Prim(soa::Join const& BCs, aod::Collisions const& collisions, aod::Tracks const& tracks, MyTracksQA const& tracksQA, aod::ORT0V0Prim const& occsRobustT0V0Prim, aod::ORFDDT0V0Prim const& occs) + { + processStatus[kProcessOnlyRobustFDDT0V0Prim] = true; + bool singleProcessOn = true; + checkAllProcessFunctionStatus(processStatus, singleProcessOn); + if (singleProcessOn) { + processInThisBlock[kProcessOnlyRobustFDDT0V0Prim] = true; + } + occupancyQA.fill(HIST("h_DFcount_Lvl0"), kProcessOnlyRobustFDDT0V0Prim); + if (collisions.size() == 0) { + return; + } + if (!buildOnlyOccsRobustFDDT0V0Prim && !buildFullOccTableProducer) { + LOG(error) << "DEBUG :: ERROR ERROR ERROR :: buildOnlyOccsRobustFDDT0V0Prim == false"; + return; + } + if (occs.size() == 0) { + LOG(error) << "DEBUG :: ERROR ERROR ERROR :: OccsRobustFDDT0V0Prim.size() == 0 :: Check \"occupancy-table-producer\" for \"buildOnlyOccsFDDT0V0Prim == true\" & \"processOnlyOccFDDT0V0PrimUnfm == true\""; + return; + } + executeTrackOccProducerProcessing(BCs, collisions, tracks, tracksQA, occsRobustT0V0Prim, occs, processInThisBlock[kProcessOnlyRobustFDDT0V0Prim]); + occupancyQA.fill(HIST("h_DFcount_Lvl1"), kProcessOnlyRobustFDDT0V0Prim); + } + PROCESS_SWITCH(TrackMeanOccTableProducer, processOnlyRobustFDDT0V0Prim, "processOnlyRobustFDDT0V0Prim", false); + + void processOnlyRobustNtrackDet(soa::Join const& BCs, aod::Collisions const& collisions, aod::Tracks const& tracks, MyTracksQA const& tracksQA, aod::ORT0V0Prim const& occsRobustT0V0Prim, aod::ORNtrackDet const& occs) + { + processStatus[kProcessOnlyRobustNtrackDet] = true; + bool singleProcessOn = true; + checkAllProcessFunctionStatus(processStatus, singleProcessOn); + if (singleProcessOn) { + processInThisBlock[kProcessOnlyRobustNtrackDet] = true; + } + occupancyQA.fill(HIST("h_DFcount_Lvl0"), kProcessOnlyRobustNtrackDet); + if (collisions.size() == 0) { + return; + } + if (!buildOnlyOccsRobustNtrackDet && !buildFullOccTableProducer) { + LOG(error) << "DEBUG :: ERROR ERROR ERROR :: buildOnlyOccsRobustNtrackDet == false"; + return; + } + if (occs.size() == 0) { + LOG(error) << "DEBUG :: ERROR ERROR ERROR :: OccsRobustNtrackDet.size() == 0 :: Check \"occupancy-table-producer\" for \"buildOnlyOccsNtrackDet == true\" & \"processOnlyOccNtrackDet == true\""; + return; + } + executeTrackOccProducerProcessing(BCs, collisions, tracks, tracksQA, occsRobustT0V0Prim, occs, processInThisBlock[kProcessOnlyRobustNtrackDet]); + occupancyQA.fill(HIST("h_DFcount_Lvl1"), kProcessOnlyRobustNtrackDet); + } + PROCESS_SWITCH(TrackMeanOccTableProducer, processOnlyRobustNtrackDet, "processOnlyRobustNtrackDet", false); + + void processOnlyRobustMultExtra(soa::Join const& BCs, aod::Collisions const& collisions, aod::Tracks const& tracks, MyTracksQA const& tracksQA, aod::ORT0V0Prim const& occsRobustT0V0Prim, aod::ORMultExtra const& occs) + { + processStatus[kProcessOnlyRobustMultExtra] = true; + bool singleProcessOn = true; + checkAllProcessFunctionStatus(processStatus, singleProcessOn); + if (singleProcessOn) { + processInThisBlock[kProcessOnlyRobustMultExtra] = true; + } + occupancyQA.fill(HIST("h_DFcount_Lvl0"), kProcessOnlyRobustMultExtra); + if (collisions.size() == 0) { + return; + } + if (!buildOnlyOccsRobustMultExtra && !buildFullOccTableProducer) { + LOG(error) << "DEBUG :: ERROR ERROR ERROR :: buildOnlyOccsRobustMultExtra == false"; + return; + } + if (occs.size() == 0) { + LOG(error) << "DEBUG :: ERROR ERROR ERROR :: OccsRobustMultExtra.size() == 0 :: Check \"occupancy-table-producer\" for \"buildOnlyOccsMultExtra == true\" & \"processOnlyOccMultExtra == true\""; + return; + } + executeTrackOccProducerProcessing(BCs, collisions, tracks, tracksQA, occsRobustT0V0Prim, occs, processInThisBlock[kProcessOnlyRobustMultExtra]); + occupancyQA.fill(HIST("h_DFcount_Lvl1"), kProcessOnlyRobustMultExtra); + } + PROCESS_SWITCH(TrackMeanOccTableProducer, processOnlyRobustMultExtra, "processOnlyRobustMultExtra", false); + + using JoinedOccTables = soa::Join; + void processFullOccTableProduer(soa::Join const& BCs, aod::Collisions const& collisions, aod::Tracks const& tracks, MyTracksQA const& tracksQA, aod::ORT0V0Prim const& occsRobustT0V0Prim, JoinedOccTables const& occs) + { + processStatus[kProcessFullOccTableProducer] = true; + bool singleProcessOn = true; + checkAllProcessFunctionStatus(processStatus, singleProcessOn); + if (singleProcessOn) { + processInThisBlock[kProcessFullOccTableProducer] = true; + } + if (!singleProcessOn) { + LOG(error) << "More than one process functions are on in track-mean-occ-table-producer"; + return; + } + occupancyQA.fill(HIST("h_DFcount_Lvl0"), kProcessFullOccTableProducer); + if (collisions.size() == 0) { + return; + } + if (!buildFullOccTableProducer) { + LOG(error) << "DEBUG :: ERROR ERROR ERROR :: buildFullOccTableProducer == false"; + return; + } + if (occs.size() == 0) { + LOG(error) << "DEBUG :: ERROR ERROR ERROR :: Full Occ Table Join size is 0 :: Check \"occupancy-table-producer\" for \"buildFullOccTableProducer == true\" & \"processFullOccTableProduer == true\""; + return; + } + executeTrackOccProducerProcessing(BCs, collisions, tracks, tracksQA, occsRobustT0V0Prim, occs, processInThisBlock[kProcessFullOccTableProducer]); + occupancyQA.fill(HIST("h_DFcount_Lvl1"), kProcessFullOccTableProducer); } // Process function ends + PROCESS_SWITCH(TrackMeanOccTableProducer, processFullOccTableProduer, "processFullOccTableProduer", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From a3cda88378e2bcf79b10797a94b56fb4accf7221 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Mon, 26 May 2025 23:37:33 +0200 Subject: [PATCH 1423/1650] [PWGLF] Add RCT flag for event selection (#11370) --- .../Tasks/Strangeness/taskLambdaSpinCorr.cxx | 77 +++++++++++++++++-- 1 file changed, 70 insertions(+), 7 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx index ad63fdfe27c..2b900fe82d6 100644 --- a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx +++ b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx @@ -16,6 +16,7 @@ #include #include +#include #include "Math/Vector3D.h" #include "Math/Vector4D.h" #include "Math/GenVector/Boost.h" @@ -45,11 +46,20 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; using std::array; +using namespace o2::aod::rctsel; struct LfTaskLambdaSpinCorr { Service ccdb; + + struct : ConfigurableGroup { + Configurable requireRCTFlagChecker{"requireRCTFlagChecker", true, "Check event quality in run condition table"}; + Configurable cfgEvtRCTFlagCheckerLabel{"cfgEvtRCTFlagCheckerLabel", "CBT_hadronPID", "Evt sel: RCT flag checker label"}; + Configurable cfgEvtRCTFlagCheckerZDCCheck{"cfgEvtRCTFlagCheckerZDCCheck", false, "Evt sel: RCT flag checker ZDC check"}; + Configurable cfgEvtRCTFlagCheckerLimitAcceptAsBad{"cfgEvtRCTFlagCheckerLimitAcceptAsBad", true, "Evt sel: RCT flag checker treat Limited Acceptance As Bad"}; + } rctCut; // mixing + Configurable cfgCutOccupancy{"cfgCutOccupancy", 2000, "Occupancy cut"}; ConfigurableAxis axisVertex{"axisVertex", {5, -10, 10}, "vertex axis for bin"}; ConfigurableAxis axisMultiplicityClass{"axisMultiplicityClass", {8, 0, 80}, "multiplicity percentile for bin"}; Configurable nMix{"nMix", 5, "number of event mixing"}; @@ -59,6 +69,8 @@ struct LfTaskLambdaSpinCorr { // fill output Configurable additionalEvSel{"additionalEvSel", false, "additionalEvSel"}; Configurable additionalEvSel3{"additionalEvSel3", false, "additionalEvSel3"}; + Configurable additionalEvSel4{"additionalEvSel4", false, "additionalEvSel4"}; + Configurable additionalEvSel5{"additionalEvSel5", false, "additionalEvSel5"}; Configurable fillGEN{"fillGEN", false, "filling generated histograms"}; Configurable fillQA{"fillQA", false, "filling QA histograms"}; @@ -103,14 +115,14 @@ struct LfTaskLambdaSpinCorr { ConfigurableAxis configthnAxisPol{"configthnAxisPol", {VARIABLE_WIDTH, -1.0, -0.6, -0.2, 0, 0.2, 0.4, 0.8}, "Pol"}; HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; - + RCTFlagsChecker rctChecker; void init(o2::framework::InitContext&) { + rctChecker.init(rctCut.cfgEvtRCTFlagCheckerLabel, rctCut.cfgEvtRCTFlagCheckerZDCCheck, rctCut.cfgEvtRCTFlagCheckerLimitAcceptAsBad); AxisSpec thnAxisInvMass{iMNbins, lbinIM, hbinIM, "#it{M} (GeV/#it{c}^{2})"}; AxisSpec thnAxisInvMasspair{iMNbinspair, lbinIMpair, hbinIMpair, "#it{M} (GeV/#it{c}^{2})"}; - + histos.add("hEvtSelInfo", "hEvtSelInfo", kTH1F, {{10, 0, 10.0}}); histos.add("hCentrality", "Centrality distribution", kTH1F, {{configcentAxis}}); - histos.add("hSparseLambdaLambda", "hSparseLambdaLambda", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); histos.add("hSparseLambdaAntiLambda", "hSparseLambdaAntiLambda", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); histos.add("hSparseAntiLambdaAntiLambda", "hSparseAntiLambdaAntiLambda", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); @@ -237,8 +249,10 @@ struct LfTaskLambdaSpinCorr { double centrality, int datatype) { - auto particle1Dummy = ROOT::Math::PxPyPzMVector(particle1.Px(), particle1.Py(), particle1.Pz(), 1.115683); - auto particle2Dummy = ROOT::Math::PxPyPzMVector(particle2.Px(), particle2.Py(), particle2.Pz(), 1.115683); + // auto particle1Dummy = ROOT::Math::PxPyPzMVector(particle1.Px(), particle1.Py(), particle1.Pz(), 1.115683); + // auto particle2Dummy = ROOT::Math::PxPyPzMVector(particle2.Px(), particle2.Py(), particle2.Pz(), 1.115683); + auto particle1Dummy = ROOT::Math::PxPyPzMVector(particle1.Px(), particle1.Py(), particle1.Pz(), particle1.M()); + auto particle2Dummy = ROOT::Math::PxPyPzMVector(particle2.Px(), particle2.Py(), particle2.Pz(), particle2.M()); auto pairDummy = particle1Dummy + particle2Dummy; // auto pairParticle = particle1 + particle2; @@ -395,17 +409,37 @@ struct LfTaskLambdaSpinCorr { void processData(EventCandidates::iterator const& collision, AllTrackCandidates const& /*tracks*/, ResoV0s const& V0s) { + histos.fill(HIST("hEvtSelInfo"), 0.5); + if (rctCut.requireRCTFlagChecker && !rctChecker(collision)) { + return; + } + histos.fill(HIST("hEvtSelInfo"), 1.5); if (!collision.sel8()) { return; } + histos.fill(HIST("hEvtSelInfo"), 2.5); auto centrality = collision.centFT0C(); + int occupancy = collision.trackOccupancyInTimeRange(); if (additionalEvSel && (!collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { return; } - + histos.fill(HIST("hEvtSelInfo"), 3.5); if (additionalEvSel3 && (!collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(aod::evsel::kNoITSROFrameBorder))) { return; } + histos.fill(HIST("hEvtSelInfo"), 4.5); + if (additionalEvSel4 && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + return; + } + histos.fill(HIST("hEvtSelInfo"), 5.5); + if (additionalEvSel5 && !collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + return; + } + histos.fill(HIST("hEvtSelInfo"), 6.5); + if (occupancy > cfgCutOccupancy) { + return; + } + histos.fill(HIST("hEvtSelInfo"), 7.5); histos.fill(HIST("hCentrality"), centrality); for (const auto& v0 : V0s) { auto [lambdaTag, aLambdaTag, isValid] = getLambdaTags(v0, collision); @@ -482,6 +516,14 @@ struct LfTaskLambdaSpinCorr { { for (auto& [collision1, collision2] : selfCombinations(colBinning, nMix, -1, collisions, collisions)) { // LOGF(info, "Mixed event collisions: (%d, %d)", collision1.index(), collision2.index()); + if (rctCut.requireRCTFlagChecker && !rctChecker(collision1)) { + continue; + } + if (rctCut.requireRCTFlagChecker && !rctChecker(collision2)) { + continue; + } + int occupancy1 = collision1.trackOccupancyInTimeRange(); + int occupancy2 = collision2.trackOccupancyInTimeRange(); if (collision1.index() == collision2.index()) { continue; @@ -492,15 +534,36 @@ struct LfTaskLambdaSpinCorr { if (additionalEvSel && (!collision1.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision1.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { continue; } - if (additionalEvSel3 && (!collision1.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision1.selection_bit(aod::evsel::kNoITSROFrameBorder))) { + if (occupancy1 > cfgCutOccupancy) { continue; } if (additionalEvSel && (!collision2.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision2.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { continue; } + if (occupancy2 > cfgCutOccupancy) { + continue; + } + + if (additionalEvSel3 && (!collision1.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision1.selection_bit(aod::evsel::kNoITSROFrameBorder))) { + continue; + } + if (additionalEvSel4 && !collision1.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + continue; + } + if (additionalEvSel5 && !collision1.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + continue; + } + if (additionalEvSel3 && (!collision2.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision2.selection_bit(aod::evsel::kNoITSROFrameBorder))) { continue; } + if (additionalEvSel4 && !collision2.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + continue; + } + if (additionalEvSel5 && !collision2.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + continue; + } + auto centrality = collision1.centFT0C(); auto groupV01 = V0s.sliceBy(tracksPerCollisionV0, collision1.globalIndex()); auto groupV02 = V0s.sliceBy(tracksPerCollisionV0, collision1.globalIndex()); From 861019b92543686a7318dbc14ea85d807e4c1fd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Tue, 27 May 2025 00:35:28 +0200 Subject: [PATCH 1424/1650] [PWGHF,Trigger] Add track quality selection in HF filter (#11371) --- EventFiltering/PWGHF/HFFilter.cxx | 3 +- EventFiltering/PWGHF/HFFilterHelpers.h | 60 +++++++++++++++++++++++--- 2 files changed, 55 insertions(+), 8 deletions(-) diff --git a/EventFiltering/PWGHF/HFFilter.cxx b/EventFiltering/PWGHF/HFFilter.cxx index 6a9112c8c85..de20c259253 100644 --- a/EventFiltering/PWGHF/HFFilter.cxx +++ b/EventFiltering/PWGHF/HFFilter.cxx @@ -76,7 +76,7 @@ struct HfFilter { // Main struct for HF triggers Configurable> nSigmaPidCuts{"nSigmaPidCuts", {cutsNsigma[0], 4, 8, labelsRowsNsigma, labelsColumnsNsigma}, "Nsigma cuts for ITS/TPC/TOF PID (except for V0 and cascades)"}; // min and max pts for tracks and bachelors (except for V0 and cascades) Configurable> ptCuts{"ptCuts", {cutsPt[0], 2, 10, labelsRowsCutsPt, labelsColumnsCutsPt}, "minimum and maximum pT for bachelor tracks (except for V0 and cascades)"}; - + Configurable> trackQaulityCuts{"trackQaulityCuts", {cutsTrackQuality[0], 2, 7, labelsColumnsPtThresholdsForFemto, labelsColumnsTrackQuality}, "Track quality cuts for proton and deuteron)"}; // parameters for high-pT triggers Configurable> ptThresholds{"ptThresholds", {cutsHighPtThresholds[0], 1, 2, labelsEmpty, labelsColumnsHighPtThresholds}, "pT treshold for high pT charm hadron candidates for kHighPt triggers in GeV/c"}; @@ -215,6 +215,7 @@ struct HfFilter { // Main struct for HF triggers helper.setCutsBtoJPsi(cutsBtoHadrons.cutsBtoJPsiX); helper.setNsigmaProtonCutsForFemto(std::array{nSigmaPidCuts->get(0u, 3u), nSigmaPidCuts->get(1u, 3u), nSigmaPidCuts->get(2u, 3u), nSigmaPidCuts->get(3u, 3u)}); helper.setNsigmaDeuteronCutsForFemto(std::array{nSigmaPidCuts->get(0u, 6u), nSigmaPidCuts->get(1u, 6u), nSigmaPidCuts->get(2u, 6u), nSigmaPidCuts->get(3u, 6u)}); + helper.setDeuteronTrackSelectionForFemto(trackQaulityCuts->get(1u, 0u), trackQaulityCuts->get(1u, 1u), trackQaulityCuts->get(1u, 2u), trackQaulityCuts->get(1u, 3u), trackQaulityCuts->get(1u, 4u), trackQaulityCuts->get(1u, 5u), trackQaulityCuts->get(1u, 6u)); helper.setNsigmaProtonCutsForCharmBaryons(nSigmaPidCuts->get(0u, 0u), nSigmaPidCuts->get(1u, 0u)); helper.setNsigmaPionKaonCutsForDzero(nSigmaPidCuts->get(0u, 1u), nSigmaPidCuts->get(1u, 1u)); helper.setNsigmaKaonCutsFor3Prongs(nSigmaPidCuts->get(0u, 2u), nSigmaPidCuts->get(1u, 2u)); diff --git a/EventFiltering/PWGHF/HFFilterHelpers.h b/EventFiltering/PWGHF/HFFilterHelpers.h index 60e3179f5a8..5d4fa4fa1b6 100644 --- a/EventFiltering/PWGHF/HFFilterHelpers.h +++ b/EventFiltering/PWGHF/HFFilterHelpers.h @@ -313,6 +313,11 @@ constexpr float cutsNsigma[4][8] = { static const std::vector labelsColumnsNsigma = {"PrFromLc", "PiKaFromDZero", "KaFrom3Prong", "PrForFemto", "PiKaFromCharmBaryon", "SoftKaonFromXicResoToSigmaC", "DeForFemto", "KaPrFromBeautyToJPsi"}; static const std::vector labelsRowsNsigma = {"TPC", "TOF", "Comb", "ITS"}; +// track cut +constexpr float cutsTrackQuality[2][7] = {{0., 0., 0., 999., 999., 0., 0.}, + {90, 80, 0.83, 160., 1., 5., 0.}}; +static const std::vector labelsColumnsTrackQuality = {"minTpcCluster", "minTpcRow", "minTpcCrossedOverFound", "maxTpcShared", "maxTpcFracShared", "minItsCluster", "minItsIbCluster"}; + // high pt constexpr float cutsHighPtThresholds[1][2] = {{8., 8.}}; // 2-prongs, 3-prongs static const std::vector labelsColumnsHighPtThresholds = {"2Prongs", "3Prongs"}; @@ -489,6 +494,18 @@ class HfFilterHelper void setNsigmaProtonCutsForFemto(std::array nSigmaCuts) { mNSigmaPrCutsForFemto = nSigmaCuts; } void setNsigmaDeuteronCutsForFemto(std::array nSigmaCuts) { mNSigmaDeCutsForFemto = nSigmaCuts; } + + void setDeuteronTrackSelectionForFemto(float minTpcCluster, float minTpcRow, float minTpcCrossedOverFound, float maxTpcShared, float maxTpcFracShared, float minItsCluster, float minItsIbCluster) + { + mMinTpcCluster = minTpcCluster; + mMinTpcRow = minTpcRow; + mMinTpcCrossedOverFound = minTpcCrossedOverFound; + mMaxTpcShared = maxTpcShared; + mMaxTpcFracShared = maxTpcFracShared; + mMinItsCluster = minItsCluster; + mMinItsIbCluster = minItsIbCluster; + } + void setNsigmaProtonCutsForCharmBaryons(float nSigmaTpc, float nSigmaTof) { mNSigmaTpcPrCutForCharmBaryons = nSigmaTpc; @@ -754,7 +771,13 @@ class HfFilterHelper std::array mCosPaMinXiBach{-2.f, -2.f}; // minimum cosine of pointing angle for XiBachelor candidates std::array, kNBeautyParticles> mCutsBhad{}; // selections for B-hadron candidates (DeltaMass, CPA, DecayLength, ImpactParameterProduct) o2::framework::LabeledArray mCutsBhadToJPsi{}; // selections for B->JPsi candidates (PtMinMu, DeltaMass, CPA, DecayLength) - + float mMinTpcCluster{90.}; // Minimum number of TPC clusters required on a track + float mMinTpcRow{80.}; // Minimum number of TPC rows (pad rows) traversed by the track + float mMinTpcCrossedOverFound{0.83}; // Minimum ratio of crossed TPC rows over findable clusters + float mMaxTpcShared{160.}; // Maximum allowed number of shared TPC clusters between tracks + float mMaxTpcFracShared{1.}; // Maximum allowed fraction of shared TPC clusters relative to total clusters + float mMinItsCluster{1.}; // Minimum required number of ITS clusters + float mMinItsIbCluster{1.}; // Minimum required number of ITS clusters for IB // PID recalibrations int mTpcPidCalibrationOption{0}; // Option for TPC PID calibration (0 -> AO2D, 1 -> postcalibrations, 2 -> alternative bethe bloch parametrisation) std::array mHistMapPiPrKaDe{}; // Map for TPC PID postcalibrations for pions, kaon, protons and deuterons @@ -941,9 +964,9 @@ inline bool HfFilterHelper::isSelectedTrack4Femto(const T1& track, const T2& tra } float NSigma = std::sqrt(NSigmaTPC * NSigmaTPC + NSigmaTOF * NSigmaTOF); - + float momentum = track.p(); if (trackSpecies == kProtonForFemto) { - if (pt <= ptThresholdPidStrategy) { + if (momentum <= ptThresholdPidStrategy) { if (NSigma > nSigmaCuts[2]) { return false; } @@ -955,9 +978,32 @@ inline bool HfFilterHelper::isSelectedTrack4Femto(const T1& track, const T2& tra } // For deuterons: Determine whether to apply TOF based on pt threshold if (trackSpecies == kDeuteronForFemto) { + + if (track.tpcNClsFound() < mMinTpcCluster) { + return false; + } + if (track.tpcNClsCrossedRows() < mMinTpcRow) { + return false; + } + if (track.tpcCrossedRowsOverFindableCls() < mMinTpcCrossedOverFound) { + return false; + } + if (track.tpcNClsShared() > mMaxTpcShared) { + return false; + } + if (track.tpcFractionSharedCls() > mMaxTpcFracShared) { + return false; + } + if (track.itsNCls() < mMinItsCluster) { + return false; + } + if (track.itsNClsInnerBarrel() < mMinItsIbCluster) { + return false; + } + // Apply different PID strategy in different pt range // one side selection only - if (pt <= ptThresholdPidStrategy) { + if (momentum <= ptThresholdPidStrategy) { if (std::fabs(NSigmaTPC) > nSigmaCuts[0] || NSigmaITS < -nSigmaCuts[3]) { // Use TPC and ITS below the threshold, NSigmaITS for deuteron with a lower limit return false; } @@ -972,9 +1018,9 @@ inline bool HfFilterHelper::isSelectedTrack4Femto(const T1& track, const T2& tra hTPCPID->Fill(track.p(), NSigmaTPC); if ((!forceTof || track.hasTOF())) { if (trackSpecies == kProtonForFemto) - hTOFPID->Fill(track.p(), NSigmaTOF); - else if (trackSpecies == kDeuteronForFemto && pt > ptThresholdPidStrategy) - hTOFPID->Fill(track.p(), NSigmaTOF); + hTOFPID->Fill(momentum, NSigmaTOF); + else if (trackSpecies == kDeuteronForFemto && momentum > ptThresholdPidStrategy) + hTOFPID->Fill(momentum, NSigmaTOF); } } From 1ad1217aa70de0d6d80b7ac18b261d42a1f7a07a Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Tue, 27 May 2025 12:15:28 +0800 Subject: [PATCH 1425/1650] [PWGCF] add event/track selections, read NUA/NUE (#11349) --- .../Tasks/CMakeLists.txt | 6 +- .../Tasks/diHadronCor.cxx | 216 +++++++++++++++++- 2 files changed, 215 insertions(+), 7 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt b/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt index d150b6954db..83526365550 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt +++ b/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt @@ -60,14 +60,10 @@ o2physics_add_dpl_workflow(neutron-proton-corr-zdc o2physics_add_dpl_workflow(di-hadron-cor SOURCES diHadronCor.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore O2Physics::AnalysisCCDB O2Physics::GFWCore COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(longrange-correlation SOURCES longrangeCorrelation.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore COMPONENT_NAME Analysis) - - - - diff --git a/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx b/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx index 186ae77640a..05fea7fd4ab 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx @@ -16,6 +16,7 @@ #include #include "TRandom3.h" +#include "TF1.h" #include #include @@ -37,6 +38,10 @@ #include "Common/DataModel/CollisionAssociationTables.h" #include "PWGCF/Core/CorrelationContainer.h" #include "PWGCF/Core/PairCuts.h" +#include "PWGCF/GenericFramework/Core/GFWPowerArray.h" +#include "PWGCF/GenericFramework/Core/GFW.h" +#include "PWGCF/GenericFramework/Core/GFWCumulant.h" +#include "PWGCF/GenericFramework/Core/GFWWeights.h" #include "DataFormatsParameters/GRPObject.h" #include "DataFormatsParameters/GRPMagField.h" @@ -64,6 +69,10 @@ struct DiHadronCor { O2_DEFINE_CONFIGURABLE(cfgCutPtMin, float, 0.2f, "minimum accepted track pT") O2_DEFINE_CONFIGURABLE(cfgCutPtMax, float, 10.0f, "maximum accepted track pT") O2_DEFINE_CONFIGURABLE(cfgCutEta, float, 0.8f, "Eta cut") + O2_DEFINE_CONFIGURABLE(cfgCutChi2prTPCcls, float, 2.5f, "max chi2 per TPC clusters") + O2_DEFINE_CONFIGURABLE(cfgCutTPCclu, float, 70.0f, "minimum TPC clusters") + O2_DEFINE_CONFIGURABLE(cfgCutITSclu, float, 5.0f, "minimum ITS clusters") + O2_DEFINE_CONFIGURABLE(cfgCutDCAz, float, 2.0f, "max DCA to vertex z") O2_DEFINE_CONFIGURABLE(cfgCutMerging, float, 0.0, "Merging cut on track merge") O2_DEFINE_CONFIGURABLE(cfgSelCollByNch, bool, true, "Select collisions by Nch or centrality") O2_DEFINE_CONFIGURABLE(cfgCutMultMin, int, 0, "Minimum multiplicity for collision") @@ -77,6 +86,20 @@ struct DiHadronCor { O2_DEFINE_CONFIGURABLE(cfgCentEstimator, int, 0, "0:FT0C; 1:FT0CVariant1; 2:FT0M; 3:FT0A") O2_DEFINE_CONFIGURABLE(cfgCentFT0CMin, float, 0.0f, "Minimum centrality (FT0C) to cut events in filter") O2_DEFINE_CONFIGURABLE(cfgCentFT0CMax, float, 100.0f, "Maximum centrality (FT0C) to cut events in filter") + O2_DEFINE_CONFIGURABLE(cfgUseAdditionalEventCut, bool, false, "Use additional event cut on mult correlations") + O2_DEFINE_CONFIGURABLE(cfgUseTentativeEventCounter, bool, false, "After sel8(), count events regardless of real event selection") + O2_DEFINE_CONFIGURABLE(cfgEvSelkNoSameBunchPileup, bool, false, "rejects collisions which are associated with the same found-by-T0 bunch crossing") + O2_DEFINE_CONFIGURABLE(cfgEvSelkIsGoodZvtxFT0vsPV, bool, false, "removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference, use this cut at low multiplicities with caution") + O2_DEFINE_CONFIGURABLE(cfgEvSelkNoCollInTimeRangeStandard, bool, false, "no collisions in specified time range") + O2_DEFINE_CONFIGURABLE(cfgEvSelkIsGoodITSLayersAll, bool, true, "cut time intervals with dead ITS staves") + O2_DEFINE_CONFIGURABLE(cfgEvSelkNoCollInRofStandard, bool, false, "no other collisions in this Readout Frame with per-collision multiplicity above threshold") + O2_DEFINE_CONFIGURABLE(cfgEvSelkNoHighMultCollInPrevRof, bool, false, "veto an event if FT0C amplitude in previous ITS ROF is above threshold") + O2_DEFINE_CONFIGURABLE(cfgEvSelMultCorrelation, bool, true, "Multiplicity correlation cut") + O2_DEFINE_CONFIGURABLE(cfgEvSelV0AT0ACut, bool, true, "V0A T0A 5 sigma cut") + O2_DEFINE_CONFIGURABLE(cfgEvSelOccupancy, bool, true, "Occupancy cut") + O2_DEFINE_CONFIGURABLE(cfgCutOccupancyHigh, int, 2000, "High cut on TPC occupancy") + O2_DEFINE_CONFIGURABLE(cfgCutOccupancyLow, int, 0, "Low cut on TPC occupancy") + O2_DEFINE_CONFIGURABLE(cfgEfficiency, std::string, "", "CCDB path to efficiency object") SliceCache cache; SliceCache cacheNch; @@ -99,7 +122,13 @@ struct DiHadronCor { // make the filters and cuts. Filter collisionFilter = (nabs(aod::collision::posZ) < cfgCutVtxZ) && (aod::evsel::sel8) == true && (aod::cent::centFT0C > cfgCentFT0CMin) && (aod::cent::centFT0C < cfgCentFT0CMax); - Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)); + Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls) && (nabs(aod::track::dcaZ) < cfgCutDCAz); + + // Corrections + TH1D* mEfficiency = nullptr; + GFWWeights* mAcceptance = nullptr; + TObjArray* mAcceptanceList = nullptr; + bool correctionsLoaded = false; // Define the outputs OutputObj same{"sameEvent"}; @@ -121,6 +150,15 @@ struct DiHadronCor { MixedEvent = 3 }; + // Additional Event selection cuts - Copy from flowGenericFramework.cxx + TF1* fMultPVCutLow = nullptr; + TF1* fMultPVCutHigh = nullptr; + TF1* fMultCutLow = nullptr; + TF1* fMultCutHigh = nullptr; + TF1* fMultMultPVCut = nullptr; + TF1* fT0AV0AMean = nullptr; + TF1* fT0AV0ASigma = nullptr; + using AodCollisions = soa::Filtered>; // aod::CentFT0Cs using AodTracks = soa::Filtered>; @@ -138,12 +176,56 @@ struct DiHadronCor { LOGF(info, "Starting init"); + // Event Counter + registry.add("hEventCountSpecific", "Number of Event;; Count", {HistType::kTH1D, {{10, 0, 10}}}); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(1, "after sel8"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(2, "kNoSameBunchPileup"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(3, "kIsGoodZvtxFT0vsPV"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(4, "kNoCollInTimeRangeStandard"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(5, "kIsGoodITSLayersAll"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(6, "kNoCollInRofStandard"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(7, "kNoHighMultCollInPrevRof"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(8, "occupancy"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(9, "MultCorrelation"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(10, "cfgEvSelV0AT0ACut"); + if (cfgUseTentativeEventCounter) { + registry.add("hEventCountTentative", "Number of Event;; Count", {HistType::kTH1D, {{10, 0, 10}}}); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(1, "after sel8"); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(2, "kNoSameBunchPileup"); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(3, "kIsGoodZvtxFT0vsPV"); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(4, "kNoCollInTimeRangeStandard"); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(5, "kIsGoodITSLayersAll"); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(6, "kNoCollInRofStandard"); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(7, "kNoHighMultCollInPrevRof"); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(8, "occupancy"); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(9, "MultCorrelation"); + registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(10, "cfgEvSelV0AT0ACut"); + } + + if (cfgUseAdditionalEventCut) { + fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x - 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); + fMultPVCutLow->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); + fMultPVCutHigh = new TF1("fMultPVCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x + 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); + fMultPVCutHigh->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); + + fMultCutLow = new TF1("fMultCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x - 2.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); + fMultCutLow->SetParameters(1654.46, -47.2379, 0.449833, -0.0014125, 150.773, -3.67334, 0.0530503, -0.000614061, 3.15956e-06); + fMultCutHigh = new TF1("fMultCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x + 3.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); + fMultCutHigh->SetParameters(1654.46, -47.2379, 0.449833, -0.0014125, 150.773, -3.67334, 0.0530503, -0.000614061, 3.15956e-06); + + fT0AV0AMean = new TF1("fT0AV0AMean", "[0]+[1]*x", 0, 200000); + fT0AV0AMean->SetParameters(-1601.0581, 9.417652e-01); + fT0AV0ASigma = new TF1("fT0AV0ASigma", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 200000); + fT0AV0ASigma->SetParameters(463.4144, 6.796509e-02, -9.097136e-07, 7.971088e-12, -2.600581e-17); + } + // Make histograms to check the distributions after cuts registry.add("deltaEta_deltaPhi_same", "", {HistType::kTH2D, {axisDeltaPhi, axisDeltaEta}}); // check to see the delta eta and delta phi distribution registry.add("deltaEta_deltaPhi_mixed", "", {HistType::kTH2D, {axisDeltaPhi, axisDeltaEta}}); registry.add("Phi", "Phi", {HistType::kTH1D, {axisPhi}}); registry.add("Eta", "Eta", {HistType::kTH1D, {axisEta}}); registry.add("pT", "pT", {HistType::kTH1D, {axisPtTrigger}}); + registry.add("pTCorrected", "pTCorrected", {HistType::kTH1D, {axisPtTrigger}}); registry.add("Nch", "N_{ch}", {HistType::kTH1D, {axisMultiplicity}}); registry.add("Nch_used", "N_{ch}", {HistType::kTH1D, {axisMultiplicity}}); // histogram to see how many events are in the same and mixed event std::string hCentTitle = "Centrality distribution, Estimator " + std::to_string(cfgCentEstimator); @@ -210,6 +292,39 @@ struct DiHadronCor { return cent; } + template + bool trackSelected(TTrack track) + { + return ((track.tpcNClsFound() >= cfgCutTPCclu) && (track.itsNCls() >= cfgCutITSclu)); + } + + void loadCorrections(uint64_t timestamp) + { + if (correctionsLoaded) + return; + if (cfgEfficiency.value.empty() == false) { + mEfficiency = ccdb->getForTimeStamp(cfgEfficiency, timestamp); + if (mEfficiency == nullptr) { + LOGF(fatal, "Could not load efficiency histogram for trigger particles from %s", cfgEfficiency.value.c_str()); + } + LOGF(info, "Loaded efficiency histogram from %s (%p)", cfgEfficiency.value.c_str(), (void*)mEfficiency); + } + correctionsLoaded = true; + } + + bool setCurrentParticleWeights(float& weight_nue, float pt) + { + float eff = 1.; + if (mEfficiency) + eff = mEfficiency->GetBinContent(mEfficiency->FindBin(pt)); + else + eff = 1.0; + if (eff == 0) + return false; + weight_nue = 1. / eff; + return true; + } + // fill multiple histograms template void fillYield(TCollision collision, TTracks tracks) // function to fill the yield and etaphi histograms. @@ -220,10 +335,16 @@ struct DiHadronCor { registry.fill(HIST("Nch"), tracks.size()); registry.fill(HIST("zVtx"), collision.posZ()); + float weff1 = 1; for (auto const& track1 : tracks) { + if (!trackSelected(track1)) + continue; + if (!setCurrentParticleWeights(weff1, track1.pt())) + continue; registry.fill(HIST("Phi"), RecoDecay::constrainAngle(track1.phi(), 0.0)); registry.fill(HIST("Eta"), track1.eta()); registry.fill(HIST("pT"), track1.pt()); + registry.fill(HIST("pTCorrected"), track1.pt(), weff1); } } @@ -263,15 +384,26 @@ struct DiHadronCor { int fSampleIndex = gRandom->Uniform(0, cfgSampleSize); + float weff1 = 1; + float weff2 = 1; // loop over all tracks for (auto const& track1 : tracks1) { + if (!trackSelected(track1)) + continue; + if (!setCurrentParticleWeights(weff1, track1.pt())) + continue; if (system == SameEvent) { registry.fill(HIST("Trig_hist"), fSampleIndex, posZ, track1.pt()); } for (auto const& track2 : tracks2) { + if (!trackSelected(track2)) + continue; + if (!setCurrentParticleWeights(weff2, track2.pt())) + continue; + if (track1.pt() <= track2.pt()) continue; // skip if the trigger pt is less than the associate pt @@ -314,15 +446,90 @@ struct DiHadronCor { } } + template + bool eventSelected(TCollision collision, const int multTrk, const float centrality, const bool fillCounter) + { + registry.fill(HIST("hEventCountSpecific"), 0.5); + if (cfgEvSelkNoSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { + // rejects collisions which are associated with the same "found-by-T0" bunch crossing + // https://indico.cern.ch/event/1396220/#1-event-selection-with-its-rof + return 0; + } + if (fillCounter && cfgEvSelkNoSameBunchPileup) + registry.fill(HIST("hEventCountSpecific"), 1.5); + if (cfgEvSelkIsGoodZvtxFT0vsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { + // removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference + // use this cut at low multiplicities with caution + return 0; + } + if (fillCounter && cfgEvSelkIsGoodZvtxFT0vsPV) + registry.fill(HIST("hEventCountSpecific"), 2.5); + if (cfgEvSelkNoCollInTimeRangeStandard && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + // no collisions in specified time range + return 0; + } + if (fillCounter && cfgEvSelkNoCollInTimeRangeStandard) + registry.fill(HIST("hEventCountSpecific"), 3.5); + if (cfgEvSelkIsGoodITSLayersAll && !collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + // from Jan 9 2025 AOT meeting + // cut time intervals with dead ITS staves + return 0; + } + if (fillCounter && cfgEvSelkIsGoodITSLayersAll) + registry.fill(HIST("hEventCountSpecific"), 4.5); + if (cfgEvSelkNoCollInRofStandard && !collision.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { + // no other collisions in this Readout Frame with per-collision multiplicity above threshold + return 0; + } + if (fillCounter && cfgEvSelkNoCollInRofStandard) + registry.fill(HIST("hEventCountSpecific"), 5.5); + if (cfgEvSelkNoHighMultCollInPrevRof && !collision.selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof)) { + // veto an event if FT0C amplitude in previous ITS ROF is above threshold + return 0; + } + if (fillCounter && cfgEvSelkNoHighMultCollInPrevRof) + registry.fill(HIST("hEventCountSpecific"), 6.5); + auto occupancy = collision.trackOccupancyInTimeRange(); + if (cfgEvSelOccupancy && (occupancy < cfgCutOccupancyLow || occupancy > cfgCutOccupancyHigh)) + return 0; + if (fillCounter && cfgEvSelOccupancy) + registry.fill(HIST("hEventCountSpecific"), 7.5); + + auto multNTracksPV = collision.multNTracksPV(); + if (cfgEvSelMultCorrelation) { + if (multNTracksPV < fMultPVCutLow->Eval(centrality)) + return 0; + if (multNTracksPV > fMultPVCutHigh->Eval(centrality)) + return 0; + if (multTrk < fMultCutLow->Eval(centrality)) + return 0; + if (multTrk > fMultCutHigh->Eval(centrality)) + return 0; + } + if (fillCounter && cfgEvSelMultCorrelation) + registry.fill(HIST("hEventCountSpecific"), 8.5); + + // V0A T0A 5 sigma cut + if (cfgEvSelV0AT0ACut && (std::fabs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > 5 * fT0AV0ASigma->Eval(collision.multFT0A()))) + return 0; + if (fillCounter && cfgEvSelV0AT0ACut) + registry.fill(HIST("hEventCountSpecific"), 9.5); + + return 1; + } + void processSame(AodCollisions::iterator const& collision, AodTracks const& tracks, aod::BCsWithTimestamps const&) { auto bc = collision.bc_as(); + float cent = getCentrality(collision); + if (cfgUseAdditionalEventCut && !eventSelected(collision, tracks.size(), cent, true)) + return; registry.fill(HIST("eventcount"), SameEvent); // because its same event i put it in the 1 bin + loadCorrections(bc.timestamp()); fillYield(collision, tracks); - float cent = getCentrality(collision); if (cfgSelCollByNch && (tracks.size() < cfgCutMultMin || tracks.size() >= cfgCutMultMax)) { return; @@ -354,6 +561,7 @@ struct DiHadronCor { for (auto const& [collision1, tracks1, collision2, tracks2] : pair) { registry.fill(HIST("eventcount"), MixedEvent); // fill the mixed event in the 3 bin auto bc = collision1.bc_as(); + loadCorrections(bc.timestamp()); if (cfgSelCollByNch && (tracks1.size() < cfgCutMultMin || tracks1.size() >= cfgCutMultMax)) continue; @@ -363,6 +571,10 @@ struct DiHadronCor { float cent1 = getCentrality(collision1); float cent2 = getCentrality(collision2); + if (cfgUseAdditionalEventCut && !eventSelected(collision1, tracks1.size(), cent1, false)) + continue; + if (cfgUseAdditionalEventCut && !eventSelected(collision2, tracks2.size(), cent2, false)) + continue; if (!cfgSelCollByNch && (cent1 < cfgCutCentMin || cent1 >= cfgCutCentMax)) continue; From 281975b292e9e373d2da7768156c6fb1d4627886 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Karpi=C5=84ski?= <40724893+davkk@users.noreply.github.com> Date: Tue, 27 May 2025 08:55:41 +0200 Subject: [PATCH 1426/1650] [PWGCF/FemtoUniverse] Fix dangling pointer when loading histograms from CCDB (#11369) --- .../Core/FemtoUniverseEfficiencyCorrection.h | 36 ++++++++++++------- .../Macros/calculateEfficiencyCorrection.cxx | 8 +++++ 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCorrection.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCorrection.h index a26b6cbc966..9936a5430d6 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCorrection.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseEfficiencyCorrection.h @@ -110,8 +110,6 @@ class EfficiencyCorrection LOGF(fatal, notify("Unknown configuration for efficiency variables")); break; } - } else { - hLoaded[idx] = nullptr; } } } @@ -201,17 +199,18 @@ class EfficiencyCorrection auto bin = -1; if (config->confEffCorVariables.value == "pt") { - bin = hLoaded[partNo - 1]->FindBin(particle.pt()); + bin = hWeights->FindBin(particle.pt()); } else if (config->confEffCorVariables.value == "pt,eta") { - bin = hLoaded[partNo - 1]->FindBin(particle.pt(), particle.eta()); + bin = hWeights->FindBin(particle.pt(), particle.eta()); } else if (config->confEffCorVariables.value == "pt,mult") { - bin = hLoaded[partNo - 1]->FindBin(particle.pt(), particle.fdCollision().multV0M()); + bin = hWeights->FindBin(particle.pt(), particle.fdCollision().multV0M()); } else if (config->confEffCorVariables.value == "pt,eta,mult") { - bin = hLoaded[partNo - 1]->FindBin(particle.pt(), particle.eta(), particle.fdCollision().multV0M()); + bin = hWeights->FindBin(particle.pt(), particle.eta(), particle.fdCollision().multV0M()); } else { LOGF(fatal, notify("Unknown configuration for efficiency variables")); return weight; } + weight = hWeights->GetBinContent(bin); } @@ -229,11 +228,21 @@ class EfficiencyCorrection if (!hist) { return true; } - for (auto idx = 0; idx <= hist->GetNbinsX() + 1; idx++) { - if (hist->GetBinContent(idx) > 0) { - return false; + + const int nBinsX = hist->GetNbinsX() + 2; + const int nBinsY = hist->GetNbinsY() + 2; + const int nBinsZ = hist->GetNbinsZ() + 2; + + for (int x = 0; x < nBinsX; ++x) { + for (int y = 0; y < nBinsY; ++y) { + for (int z = 0; z < nBinsZ; ++z) { + if (hist->GetBinContent(x, y, z) != 0) { + return false; + } + } } } + return true; } @@ -247,11 +256,14 @@ class EfficiencyCorrection } if (isHistEmpty(hWeights)) { - LOGF(warn, notify("Histogram \"%s/%ld\" has been loaded, but it is empty"), config->confEffCorCCDBUrl.value, timestamp); + LOGF(warn, notify("Histogram \"%s/%ld\" has been loaded, but it is empty"), config->confEffCorCCDBPath.value, timestamp); } + auto clonedHist = static_cast(hWeights->Clone()); + clonedHist->SetDirectory(nullptr); + LOGF(info, notify("Successfully loaded %ld"), timestamp); - return hWeights; + return clonedHist; } auto getDimensionFromVariables() -> size_t @@ -266,7 +278,7 @@ class EfficiencyCorrection bool shouldFillHistograms{false}; o2::ccdb::BasicCCDBManager& ccdb{o2::ccdb::BasicCCDBManager::instance()}; - std::array hLoaded{}; + std::array hLoaded{nullptr, nullptr}; framework::HistogramRegistry* histRegistry{}; static constexpr std::string_view histDirectory{"EfficiencyCorrection"}; diff --git a/PWGCF/FemtoUniverse/Macros/calculateEfficiencyCorrection.cxx b/PWGCF/FemtoUniverse/Macros/calculateEfficiencyCorrection.cxx index e99331231e2..3880661d9f7 100644 --- a/PWGCF/FemtoUniverse/Macros/calculateEfficiencyCorrection.cxx +++ b/PWGCF/FemtoUniverse/Macros/calculateEfficiencyCorrection.cxx @@ -148,6 +148,10 @@ auto calculateEfficiencyCorrection(const fs::path& resultsPath, const fs::path& histWeights->Reset(); setAxisTitles(histWeights, projection); + auto* histCont{cloneHistogram(histPrimary, "hCont")}; + histCont->Reset(); + setAxisTitles(histCont, projection); + forEachBin(histPrimary, [&](int x, int y, int z) { auto primVal{histPrimary->GetBinContent(x, y, z)}; auto primErr{histPrimary->GetBinError(x, y, z)}; @@ -178,6 +182,9 @@ auto calculateEfficiencyCorrection(const fs::path& resultsPath, const fs::path& contErr = std::sqrt(std::pow(secErr / totalVal, 2) + std::pow((secVal * totalErr / std::pow(totalVal, 2)), 2)); } + histCont->SetBinContent(x, y, z, contVal); + histCont->SetBinError(x, y, z, contErr); + auto weightVal{0.}; auto weightErr{0.}; if (effVal > 0) { @@ -190,6 +197,7 @@ auto calculateEfficiencyCorrection(const fs::path& resultsPath, const fs::path& }); outputFile->WriteTObject(histEfficiency); + outputFile->WriteTObject(histCont); outputFile->WriteTObject(histWeights); outputFile->Close(); From 65bba2b5c759a769c083d139e8bc1749bc182244 Mon Sep 17 00:00:00 2001 From: Evgeny Kryshen Date: Tue, 27 May 2025 10:36:01 +0300 Subject: [PATCH 1427/1650] [Common] Isolated lumi calculation in a dedicated task (#11327) --- Common/TableProducer/eventSelection.cxx | 407 +++++++++++++++++++----- 1 file changed, 328 insertions(+), 79 deletions(-) diff --git a/Common/TableProducer/eventSelection.cxx b/Common/TableProducer/eventSelection.cxx index 1418e42604f..c0d5fc2bb37 100644 --- a/Common/TableProducer/eventSelection.cxx +++ b/Common/TableProducer/eventSelection.cxx @@ -17,6 +17,7 @@ #include #include #include +#include #include "Framework/ConfigParamSpec.h" #include "Framework/runDataProcessing.h" @@ -37,6 +38,8 @@ #include "DataFormatsITSMFT/NoiseMap.h" // missing include in TimeDeadMap.h #include "DataFormatsITSMFT/TimeDeadMap.h" #include "ITSMFTReconstruction/ChipMappingITS.h" +#include "DataFormatsCTP/Configuration.h" +#include "DataFormatsCTP/Scalers.h" #include "TH1D.h" @@ -80,7 +83,6 @@ struct BcSelectionTask { int mITSROFrameEndBorderMargin = 20; // default value int mTimeFrameStartBorderMargin = 300; // default value int mTimeFrameEndBorderMargin = 4000; // default value - bool isPP = 1; // default value TriggerAliases* aliases = nullptr; EventSelectionParams* par = nullptr; std::map* mapRCT = nullptr; @@ -97,7 +99,7 @@ struct BcSelectionTask { if (metadataInfo.isRun3()) { doprocessRun3.value = true; } else { - doprocessRun2.value = false; + doprocessRun2.value = true; } } @@ -105,24 +107,7 @@ struct BcSelectionTask { ccdb->setURL("http://alice-ccdb.cern.ch"); ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); - - histos.add("hCounterTVX", "", kTH1D, {{1, 0., 1.}}); - histos.add("hCounterTCE", "", kTH1D, {{1, 0., 1.}}); - histos.add("hCounterZEM", "", kTH1D, {{1, 0., 1.}}); - histos.add("hCounterZNC", "", kTH1D, {{1, 0., 1.}}); - histos.add("hCounterTVXafterBCcuts", "", kTH1D, {{1, 0., 1.}}); - histos.add("hCounterTCEafterBCcuts", "", kTH1D, {{1, 0., 1.}}); - histos.add("hCounterZEMafterBCcuts", "", kTH1D, {{1, 0., 1.}}); - histos.add("hCounterZNCafterBCcuts", "", kTH1D, {{1, 0., 1.}}); histos.add("hCounterInvalidBCTimestamp", "", kTH1D, {{1, 0., 1.}}); - histos.add("hLumiTVX", ";;Luminosity, 1/#mub", kTH1D, {{1, 0., 1.}}); - histos.add("hLumiTCE", ";;Luminosity, 1/#mub", kTH1D, {{1, 0., 1.}}); - histos.add("hLumiZEM", ";;Luminosity, 1/#mub", kTH1D, {{1, 0., 1.}}); - histos.add("hLumiZNC", ";;Luminosity, 1/#mub", kTH1D, {{1, 0., 1.}}); - histos.add("hLumiTVXafterBCcuts", ";;Luminosity, 1/#mub", kTH1D, {{1, 0., 1.}}); - histos.add("hLumiTCEafterBCcuts", ";;Luminosity, 1/#mub", kTH1D, {{1, 0., 1.}}); - histos.add("hLumiZEMafterBCcuts", ";;Luminosity, 1/#mub", kTH1D, {{1, 0., 1.}}); - histos.add("hLumiZNCafterBCcuts", ";;Luminosity, 1/#mub", kTH1D, {{1, 0., 1.}}); } void processRun2( @@ -303,11 +288,7 @@ struct BcSelectionTask { rofLength = alppar->roFrameLengthInBC; // Trigger aliases aliases = ccdb->getForTimeStamp("EventSelection/TriggerAliases", ts); - // Collision system info - auto grplhcif = ccdb->getForTimeStamp("GLO/Config/GRPLHCIF", ts); - int beamZ1 = grplhcif->getBeamZ(o2::constants::lhc::BeamA); - int beamZ2 = grplhcif->getBeamZ(o2::constants::lhc::BeamC); - isPP = beamZ1 == 1 && beamZ2 == 1; + // prepare map of inactive chips auto itsDeadMap = ccdb->getForTimeStamp("ITS/Calib/TimeDeadMap", ts); auto itsDeadMapOrbits = itsDeadMap->getEvolvingMapKeys(); // roughly every second, ~350 TFs = 350x32 orbits @@ -335,12 +316,13 @@ struct BcSelectionTask { std::map metadata; metadata["run"] = Form("%d", run); ccdb->setFatalWhenNull(0); - mapRCT = ccdb->getSpecific>("Users/j/jian/RCT", ts, metadata); + mapRCT = ccdb->getSpecific>("RCT/Flags/RunFlags", ts, metadata); ccdb->setFatalWhenNull(1); if (mapRCT == nullptr) { LOGP(info, "rct object missing... inserting dummy rct flags"); mapRCT = new std::map; - mapRCT->insert(std::pair(sorTimestamp, 0)); + uint32_t dummyValue = 1 << 31; // setting bit 31 to indicate that rct object is missing + mapRCT->insert(std::pair(sorTimestamp, dummyValue)); } } @@ -490,58 +472,7 @@ struct BcSelectionTask { int32_t foundZDC = bc.has_zdc() ? bc.zdc().globalIndex() : -1; LOGP(debug, "foundFT0={}", foundFT0); - // Temporary workaround to get visible cross section. TODO: store run-by-run visible cross sections in CCDB const char* srun = Form("%d", run); - - bool injectionEnergy = (run >= 500000 && run <= 520099) || (run >= 534133 && run <= 534468); // o2-linter: disable=magic-number (TODO extract from ccdb) - // Cross sections in ub. Using dummy -1 if lumi estimator is not reliable - float csTVX = isPP ? (injectionEnergy ? 0.0355e6 : 0.0594e6) : -1.; - float csTCE = isPP ? -1. : 10.36e6; - float csZEM = isPP ? -1. : 415.2e6; // see AN: https://alice-notes.web.cern.ch/node/1515 - float csZNC = isPP ? -1. : 214.5e6; // see AN: https://alice-notes.web.cern.ch/node/1515 - if (run > 543437 && run < 543514) { // o2-linter: disable=magic-number (TODO store and extract cross sections from ccdb) - csTCE = 8.3e6; - } - if (run >= 543514) { // o2-linter: disable=magic-number (TODO store and extract cross sections from ccdb) - csTCE = 4.10e6; // see AN: https://alice-notes.web.cern.ch/node/1515 - } - - // Fill TVX (T0 vertex) counters - if (TESTBIT(selection, kIsTriggerTVX)) { - histos.get(HIST("hCounterTVX"))->Fill(srun, 1); - histos.get(HIST("hLumiTVX"))->Fill(srun, 1. / csTVX); - if (TESTBIT(selection, kNoITSROFrameBorder) && TESTBIT(selection, kNoTimeFrameBorder)) { - histos.get(HIST("hCounterTVXafterBCcuts"))->Fill(srun, 1); - histos.get(HIST("hLumiTVXafterBCcuts"))->Fill(srun, 1. / csTVX); - } - } - // Fill counters and lumi histograms for Pb-Pb lumi monitoring - // TODO: introduce pileup correction - if (bc.has_ft0() ? (TESTBIT(selection, kIsTriggerTVX) && TESTBIT(bc.ft0().triggerMask(), o2::ft0::Triggers::bitCen)) : 0) { - histos.get(HIST("hCounterTCE"))->Fill(srun, 1); - histos.get(HIST("hLumiTCE"))->Fill(srun, 1. / csTCE); - if (TESTBIT(selection, kNoITSROFrameBorder) && TESTBIT(selection, kNoTimeFrameBorder)) { - histos.get(HIST("hCounterTCEafterBCcuts"))->Fill(srun, 1); - histos.get(HIST("hLumiTCEafterBCcuts"))->Fill(srun, 1. / csTCE); - } - } - if (TESTBIT(selection, kIsBBZNA) || TESTBIT(selection, kIsBBZNC)) { - histos.get(HIST("hCounterZEM"))->Fill(srun, 1); - histos.get(HIST("hLumiZEM"))->Fill(srun, 1. / csZEM); - if (TESTBIT(selection, kNoITSROFrameBorder) && TESTBIT(selection, kNoTimeFrameBorder)) { - histos.get(HIST("hCounterZEMafterBCcuts"))->Fill(srun, 1); - histos.get(HIST("hLumiZEMafterBCcuts"))->Fill(srun, 1. / csZEM); - } - } - if (TESTBIT(selection, kIsBBZNC)) { - histos.get(HIST("hCounterZNC"))->Fill(srun, 1); - histos.get(HIST("hLumiZNC"))->Fill(srun, 1. / csZNC); - if (TESTBIT(selection, kNoITSROFrameBorder) && TESTBIT(selection, kNoTimeFrameBorder)) { - histos.get(HIST("hCounterZNCafterBCcuts"))->Fill(srun, 1); - histos.get(HIST("hLumiZNCafterBCcuts"))->Fill(srun, 1. / csZNC); - } - } - if (bc.timestamp() < sorTimestamp || bc.timestamp() > eorTimestamp) { histos.get(HIST("hCounterInvalidBCTimestamp"))->Fill(srun, 1); if (confCheckRunDurationLimits.value) { @@ -652,7 +583,7 @@ struct EventSelectionTask { if (metadataInfo.isRun3()) { doprocessRun3.value = true; } else { - doprocessRun2.value = false; + doprocessRun2.value = true; } } if (isMC == -1) { @@ -1229,6 +1160,323 @@ struct EventSelectionTask { PROCESS_SWITCH(EventSelectionTask, processRun3, "Process Run3 event selection", false); }; +struct LumiTask { + Service ccdb; + HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + + int lastRun = -1; // last run number (needed to access ccdb only if run!=lastRun) + float csTVX = -1; // dummy -1 for the visible TVX cross section (in ub) used in lumi accounting + float csTCE = -1; // dummy -1 for the visible TCE cross section (in ub) used in lumi accounting + float csZEM = -1; // dummy -1 for the visible ZEM cross section (in ub) used in lumi accounting + float csZNC = -1; // dummy -1 for the visible ZNC cross section (in ub) used in lumi accounting + + std::vector mOrbits; + std::vector mPileupCorrectionTVX; + std::vector mPileupCorrectionTCE; + std::vector mPileupCorrectionZEM; + std::vector mPileupCorrectionZNC; + + int64_t minOrbitInRange = std::numeric_limits::max(); + int64_t maxOrbitInRange = 0; + uint32_t currentOrbitIndex = 0; + std::bitset bcPatternB; // bc pattern of colliding bunches + std::vector mRCTFlagsCheckers; + + void init(InitContext&) + { + if (metadataInfo.isFullyDefined() && !doprocessRun3 && !doprocessRun3) { // Check if the metadata is initialized (only if not forced from the workflow configuration) + LOG(info) << "Autosetting the processing mode (Run2 or Run3) based on metadata"; + if (metadataInfo.isRun3()) { + doprocessRun3.value = true; + } else { + doprocessRun2.value = true; + } + } + + histos.add("hCounterTVX", "", kTH1D, {{1, 0., 1.}}); + histos.add("hCounterTCE", "", kTH1D, {{1, 0., 1.}}); + histos.add("hCounterZEM", "", kTH1D, {{1, 0., 1.}}); + histos.add("hCounterZNC", "", kTH1D, {{1, 0., 1.}}); + histos.add("hCounterTVXafterBCcuts", "", kTH1D, {{1, 0., 1.}}); + histos.add("hCounterTCEafterBCcuts", "", kTH1D, {{1, 0., 1.}}); + histos.add("hCounterZEMafterBCcuts", "", kTH1D, {{1, 0., 1.}}); + histos.add("hCounterZNCafterBCcuts", "", kTH1D, {{1, 0., 1.}}); + histos.add("hLumiTVX", ";;Luminosity, 1/#mub", kTH1D, {{1, 0., 1.}}); + histos.add("hLumiTCE", ";;Luminosity, 1/#mub", kTH1D, {{1, 0., 1.}}); + histos.add("hLumiZEM", ";;Luminosity, 1/#mub", kTH1D, {{1, 0., 1.}}); + histos.add("hLumiZNC", ";;Luminosity, 1/#mub", kTH1D, {{1, 0., 1.}}); + histos.add("hLumiTVXafterBCcuts", ";;Luminosity, 1/#mub", kTH1D, {{1, 0., 1.}}); + histos.add("hLumiTCEafterBCcuts", ";;Luminosity, 1/#mub", kTH1D, {{1, 0., 1.}}); + histos.add("hLumiZEMafterBCcuts", ";;Luminosity, 1/#mub", kTH1D, {{1, 0., 1.}}); + histos.add("hLumiZNCafterBCcuts", ";;Luminosity, 1/#mub", kTH1D, {{1, 0., 1.}}); + + const int nLists = 6; + TString rctListNames[] = {"CBT", "CBT_hadronPID", "CBT_electronPID", "CBT_calo", "CBT_muon", "CBT_muon_glo"}; + histos.add("hLumiTVXafterBCcutsRCT", ";;Luminosity, 1/#mub", kTH2D, {{1, 0., 1.}, {4 * nLists, -0.5, 4. * nLists - 0.5}}); + histos.add("hLumiTCEafterBCcutsRCT", ";;Luminosity, 1/#mub", kTH2D, {{1, 0., 1.}, {4 * nLists, -0.5, 4. * nLists - 0.5}}); + histos.add("hLumiZEMafterBCcutsRCT", ";;Luminosity, 1/#mub", kTH2D, {{1, 0., 1.}, {4 * nLists, -0.5, 4. * nLists - 0.5}}); + histos.add("hLumiZNCafterBCcutsRCT", ";;Luminosity, 1/#mub", kTH2D, {{1, 0., 1.}, {4 * nLists, -0.5, 4. * nLists - 0.5}}); + + for (int i = 0; i < nLists; i++) { + const auto& rctListName = rctListNames[i]; + mRCTFlagsCheckers.emplace_back(rctListName.Data(), false, false); // disable zdc check, disable lim. acc. check + mRCTFlagsCheckers.emplace_back(rctListName.Data(), false, true); // disable zdc check, enable lim. acc. check + mRCTFlagsCheckers.emplace_back(rctListName.Data(), true, false); // enable zdc check, disable lim. acc. check + mRCTFlagsCheckers.emplace_back(rctListName.Data(), true, true); // enable zdc check, enable lim. acc. check + histos.get(HIST("hLumiTVXafterBCcutsRCT"))->GetYaxis()->SetBinLabel(4 * i + 1, rctListName.Data()); + histos.get(HIST("hLumiTCEafterBCcutsRCT"))->GetYaxis()->SetBinLabel(4 * i + 1, rctListName.Data()); + histos.get(HIST("hLumiZEMafterBCcutsRCT"))->GetYaxis()->SetBinLabel(4 * i + 1, rctListName.Data()); + histos.get(HIST("hLumiZNCafterBCcutsRCT"))->GetYaxis()->SetBinLabel(4 * i + 1, rctListName.Data()); + histos.get(HIST("hLumiTVXafterBCcutsRCT"))->GetYaxis()->SetBinLabel(4 * i + 2, (rctListName + "_fullacc").Data()); + histos.get(HIST("hLumiTCEafterBCcutsRCT"))->GetYaxis()->SetBinLabel(4 * i + 2, (rctListName + "_fullacc").Data()); + histos.get(HIST("hLumiZEMafterBCcutsRCT"))->GetYaxis()->SetBinLabel(4 * i + 2, (rctListName + "_fullacc").Data()); + histos.get(HIST("hLumiZNCafterBCcutsRCT"))->GetYaxis()->SetBinLabel(4 * i + 2, (rctListName + "_fullacc").Data()); + histos.get(HIST("hLumiTVXafterBCcutsRCT"))->GetYaxis()->SetBinLabel(4 * i + 3, (rctListName + "_zdc").Data()); + histos.get(HIST("hLumiTCEafterBCcutsRCT"))->GetYaxis()->SetBinLabel(4 * i + 3, (rctListName + "_zdc").Data()); + histos.get(HIST("hLumiZEMafterBCcutsRCT"))->GetYaxis()->SetBinLabel(4 * i + 3, (rctListName + "_zdc").Data()); + histos.get(HIST("hLumiZNCafterBCcutsRCT"))->GetYaxis()->SetBinLabel(4 * i + 3, (rctListName + "_zdc").Data()); + histos.get(HIST("hLumiTVXafterBCcutsRCT"))->GetYaxis()->SetBinLabel(4 * i + 4, (rctListName + "_zdc" + "_fullacc").Data()); + histos.get(HIST("hLumiTCEafterBCcutsRCT"))->GetYaxis()->SetBinLabel(4 * i + 4, (rctListName + "_zdc" + "_fullacc").Data()); + histos.get(HIST("hLumiZEMafterBCcutsRCT"))->GetYaxis()->SetBinLabel(4 * i + 4, (rctListName + "_zdc" + "_fullacc").Data()); + histos.get(HIST("hLumiZNCafterBCcutsRCT"))->GetYaxis()->SetBinLabel(4 * i + 4, (rctListName + "_zdc" + "_fullacc").Data()); + } + } + + void processRun2(aod::BCs const&) + { + LOGP(debug, "Dummy process function for Run 2"); + } + + PROCESS_SWITCH(LumiTask, processRun2, "Process Run2 lumi task", false); + + void processRun3(BCsWithBcSelsRun3 const& bcs, aod::FT0s const&) + { + if (bcs.size() == 0) + return; + int run = bcs.iteratorAt(0).runNumber(); + if (run < 500000) // o2-linter: disable=magic-number (skip for unanchored MCs) + return; + if (run != lastRun && run >= 520259) { // o2-linter: disable=magic-number (scalers available for runs above 520120) + lastRun = run; + int64_t ts = bcs.iteratorAt(0).timestamp(); + + // getting GRP LHCIF object to extract colliding system, energy and colliding bc pattern + auto grplhcif = ccdb->getForTimeStamp("GLO/Config/GRPLHCIF", ts); + int beamZ1 = grplhcif->getBeamZ(constants::lhc::BeamA); + int beamZ2 = grplhcif->getBeamZ(constants::lhc::BeamC); + float sqrts = grplhcif->getSqrtS(); + int nCollidingBCs = grplhcif->getBunchFilling().getNBunches(); + bcPatternB = grplhcif->getBunchFilling().getBCPattern(); + + // visible cross sections in ub. Using dummy -1 if lumi estimator is not reliable for this colliding system + csTVX = -1; + csTCE = -1; + csZEM = -1; + csZNC = -1; + // Temporary workaround to get visible cross section. TODO: store run-by-run visible cross sections in CCDB + if (beamZ1 == 1 && beamZ2 == 1) { + if (std::fabs(sqrts - 900.) < 20.) { // o2-linter: disable=magic-number (TODO store and extract cross sections from ccdb) + csTVX = 0.0357e6; // ub + } else if (std::fabs(sqrts - 5360.) < 20.) { // pp-ref // o2-linter: disable=magic-number (TODO store and extract cross sections from ccdb) + csTVX = 0.0503e6; // ub + } else if (std::fabs(sqrts - 13600.) < 20.) { // o2-linter: disable=magic-number (TODO store and extract cross sections from ccdb) + csTVX = 0.0594e6; // ub + } else { + LOGP(warn, "Cross section for pp @ {} GeV is not defined", sqrts); + } + } else if (beamZ1 == 82 && beamZ2 == 82) { // o2-linter: disable=magic-number (PbPb colliding system) + // see AN: https://alice-notes.web.cern.ch/node/1515 + if (std::fabs(sqrts - 5360) < 20) { // o2-linter: disable=magic-number (TODO store and extract cross sections from ccdb) + csZNC = 214.5e6; // ub + csZEM = 415.2e6; // ub + csTCE = 10.36e6; // ub + if (run > 543437 && run < 543514) { // o2-linter: disable=magic-number (TODO store and extract cross sections from ccdb) + csTCE = 8.3e6; // ub + } else if (run >= 543514 && run < 545367) { // o2-linter: disable=magic-number (TODO store and extract cross sections from ccdb) + csTCE = 4.10e6; // ub + } else if (run >= 559544) { // o2-linter: disable=magic-number (TODO store and extract cross sections from ccdb) + csTCE = 3.86e6; // ub + } + } else { + LOGP(warn, "Cross section for PbPb @ {} GeV is not defined", sqrts); + } + } else { + LOGP(warn, "Cross section for z={} + z={} @ {} GeV is not defined", beamZ1, beamZ2, sqrts); + } + // getting CTP config to extract lumi class indices (used for rate fetching and pileup correction) + std::map metadata; + metadata["runNumber"] = std::to_string(run); + auto config = ccdb->getSpecific("CTP/Config/Config", ts, metadata); + auto classes = config->getCTPClasses(); + TString lumiClassNameZNC = "C1ZNC-B-NOPF-CRU"; + TString lumiClassNameTCE = "CMTVXTCE-B-NOPF-CRU"; + TString lumiClassNameTVX1 = "MINBIAS_TVX"; // run >= 534467 + TString lumiClassNameTVX2 = "MINBIAS_TVX_NOMASK"; // run >= 534468 + TString lumiClassNameTVX3 = "CMTVX-NONE-NOPF-CRU"; // run >= 534996 + TString lumiClassNameTVX4 = "CMTVX-B-NOPF-CRU"; // run >= 543437 + + // find class indices + int classIdZNC = -1; + int classIdTCE = -1; + int classIdTVX = -1; + for (unsigned int i = 0; i < classes.size(); i++) { + TString clname = classes[i].name; + clname.ToUpper(); + // using position (i) in the vector of classes instead of classes[i].getIndex() + // due to bug or inconsistencies in scaler record and class indices + if (clname == lumiClassNameZNC) + classIdZNC = i; + if (clname == lumiClassNameTCE) + classIdTCE = i; + if (clname == lumiClassNameTVX4 || clname == lumiClassNameTVX3 || clname == lumiClassNameTVX2 || clname == lumiClassNameTVX1) + classIdTVX = i; + } + + // extract trigger counts from CTP scalers + auto scalers = ccdb->getSpecific("CTP/Calib/Scalers", ts, metadata); + scalers->convertRawToO2(); + std::vector mCounterTVX; + std::vector mCounterTCE; + std::vector mCounterZNC; + std::vector mCounterZEM; + mOrbits.clear(); + for (const auto& record : scalers->getScalerRecordO2()) { + mOrbits.push_back(record.intRecord.orbit); + mCounterTVX.push_back(classIdTVX >= 0 ? record.scalers[classIdTVX].lmBefore : 0); + mCounterTCE.push_back(classIdTCE >= 0 ? record.scalers[classIdTCE].lmBefore : 0); + if (run >= 543437 && run < 544448) { // o2-linter: disable=magic-number (ZNC class not defined for this run range) + mCounterZNC.push_back(record.scalersInps[25]); // see ZNC=1ZNC input index in https://indico.cern.ch/event/1153630/contributions/4844362/ + } else { + mCounterZNC.push_back(classIdZNC >= 0 ? record.scalers[classIdZNC].l1Before : 0); + } + // ZEM class not defined, using inputs instead + mCounterZEM.push_back(record.scalersInps[24]); // see ZEM=1ZED input index in https://indico.cern.ch/event/1153630/contributions/4844362/ + } + + // calculate pileup corrections + mPileupCorrectionTVX.clear(); + mPileupCorrectionTCE.clear(); + mPileupCorrectionZEM.clear(); + mPileupCorrectionZNC.clear(); + for (uint32_t i = 0; i < mOrbits.size() - 1; i++) { + int64_t nOrbits = mOrbits[i + 1] - mOrbits[i]; + if (nOrbits <= 0 || nCollidingBCs == 0) + continue; + double perBcRateTVX = static_cast(mCounterTVX[i + 1] - mCounterTVX[i]) / nOrbits / nCollidingBCs; + double perBcRateTCE = static_cast(mCounterTCE[i + 1] - mCounterTCE[i]) / nOrbits / nCollidingBCs; + double perBcRateZNC = static_cast(mCounterZNC[i + 1] - mCounterZNC[i]) / nOrbits / nCollidingBCs; + double perBcRateZEM = static_cast(mCounterZEM[i + 1] - mCounterZEM[i]) / nOrbits / nCollidingBCs; + double muTVX = (perBcRateTVX < 1 && perBcRateTVX > 1e-10) ? -std::log(1 - perBcRateTVX) : 0; + double muTCE = (perBcRateTCE < 1 && perBcRateTCE > 1e-10) ? -std::log(1 - perBcRateTCE) : 0; + double muZNC = (perBcRateZNC < 1 && perBcRateZNC > 1e-10) ? -std::log(1 - perBcRateZNC) : 0; + double muZEM = (perBcRateZEM < 1 && perBcRateZEM > 1e-10) ? -std::log(1 - perBcRateZEM) : 0; + LOGP(debug, "orbit={} muTVX={} muTCE={} muZNC={} muZEM={}", mOrbits[i], muTVX, muTCE, muZNC, muZEM); + mPileupCorrectionTVX.push_back(muTVX > 1e-10 ? muTVX / (1 - std::exp(-muTVX)) : 1); + mPileupCorrectionTCE.push_back(muTCE > 1e-10 ? muTCE / (1 - std::exp(-muTCE)) : 1); + mPileupCorrectionZNC.push_back(muZNC > 1e-10 ? muZNC / (1 - std::exp(-muZNC)) : 1); + mPileupCorrectionZEM.push_back(muZEM > 1e-10 ? muZEM / (1 - std::exp(-muZEM)) : 1); + } + // filling last orbit range using previous orbit range + mPileupCorrectionTVX.push_back(mPileupCorrectionTVX.back()); + mPileupCorrectionTCE.push_back(mPileupCorrectionTCE.back()); + mPileupCorrectionZNC.push_back(mPileupCorrectionZNC.back()); + mPileupCorrectionZEM.push_back(mPileupCorrectionZEM.back()); + } // access ccdb once per run + + const char* srun = Form("%d", run); + + for (const auto& bc : bcs) { + auto& selection = bc.selection_raw(); + if (bcPatternB[bc.globalBC() % nBCsPerOrbit] == 0) // skip non-colliding bcs + continue; + + bool noBorder = TESTBIT(selection, kNoTimeFrameBorder) && TESTBIT(selection, kNoITSROFrameBorder); + bool isTriggerTVX = TESTBIT(selection, kIsTriggerTVX); + bool isTriggerTCE = bc.has_ft0() ? (TESTBIT(selection, kIsTriggerTVX) && TESTBIT(bc.ft0().triggerMask(), o2::ft0::Triggers::bitCen)) : 0; + bool isTriggerZNA = TESTBIT(selection, kIsBBZNA); + bool isTriggerZNC = TESTBIT(selection, kIsBBZNC); + bool isTriggerZEM = isTriggerZNA || isTriggerZNC; + + // determine pileup correction + int64_t orbit = bc.globalBC() / nBCsPerOrbit; + if ((orbit < minOrbitInRange || orbit > maxOrbitInRange) && mOrbits.size() > 1) { + auto it = std::lower_bound(mOrbits.begin(), mOrbits.end(), orbit); + uint32_t nextOrbitIndex = std::distance(mOrbits.begin(), it); + if (nextOrbitIndex == 0) // if orbit is below stored scaler orbits + nextOrbitIndex = 1; + else if (nextOrbitIndex == mOrbits.size()) // if orbit is above stored scaler orbits + nextOrbitIndex = mOrbits.size() - 1; + currentOrbitIndex = nextOrbitIndex - 1; + minOrbitInRange = mOrbits[currentOrbitIndex]; + maxOrbitInRange = mOrbits[nextOrbitIndex]; + } + double pileupCorrectionTVX = currentOrbitIndex < mPileupCorrectionTVX.size() ? mPileupCorrectionTVX[currentOrbitIndex] : 1.; + double pileupCorrectionTCE = currentOrbitIndex < mPileupCorrectionTCE.size() ? mPileupCorrectionTCE[currentOrbitIndex] : 1.; + double pileupCorrectionZNC = currentOrbitIndex < mPileupCorrectionZNC.size() ? mPileupCorrectionZNC[currentOrbitIndex] : 1.; + double pileupCorrectionZEM = currentOrbitIndex < mPileupCorrectionZEM.size() ? mPileupCorrectionZEM[currentOrbitIndex] : 1.; + + double lumiTVX = 1. / csTVX * pileupCorrectionTVX; + double lumiTCE = 1. / csTCE * pileupCorrectionTCE; + double lumiZNC = 1. / csZNC * pileupCorrectionZNC; + double lumiZEM = 1. / csZEM * pileupCorrectionZEM; + + if (isTriggerTVX) { + histos.get(HIST("hCounterTVX"))->Fill(srun, 1); + histos.get(HIST("hLumiTVX"))->Fill(srun, lumiTVX); + if (noBorder) { + histos.get(HIST("hCounterTVXafterBCcuts"))->Fill(srun, 1); + histos.get(HIST("hLumiTVXafterBCcuts"))->Fill(srun, lumiTVX); + for (size_t i = 0; i < mRCTFlagsCheckers.size(); i++) { + if (mRCTFlagsCheckers[i](bc)) + histos.get(HIST("hLumiTVXafterBCcutsRCT"))->Fill(srun, i, lumiTVX); + } + } + } + + if (isTriggerTCE) { + histos.get(HIST("hCounterTCE"))->Fill(srun, 1); + histos.get(HIST("hLumiTCE"))->Fill(srun, lumiTCE); + if (noBorder) { + histos.get(HIST("hCounterTCEafterBCcuts"))->Fill(srun, 1); + histos.get(HIST("hLumiTCEafterBCcuts"))->Fill(srun, lumiTCE); + for (size_t i = 0; i < mRCTFlagsCheckers.size(); i++) { + if (mRCTFlagsCheckers[i](bc)) + histos.get(HIST("hLumiTCEafterBCcutsRCT"))->Fill(srun, i, lumiTCE); + } + } + } + + if (isTriggerZEM) { + histos.get(HIST("hCounterZEM"))->Fill(srun, 1); + histos.get(HIST("hLumiZEM"))->Fill(srun, lumiZEM); + if (noBorder) { + histos.get(HIST("hCounterZEMafterBCcuts"))->Fill(srun, 1); + histos.get(HIST("hLumiZEMafterBCcuts"))->Fill(srun, lumiZEM); + for (size_t i = 0; i < mRCTFlagsCheckers.size(); i++) { + if (mRCTFlagsCheckers[i](bc)) + histos.get(HIST("hLumiZEMafterBCcutsRCT"))->Fill(srun, i, lumiZEM); + } + } + } + + if (isTriggerZNC) { + histos.get(HIST("hCounterZNC"))->Fill(srun, 1); + histos.get(HIST("hLumiZNC"))->Fill(srun, lumiZNC); + if (noBorder) { + histos.get(HIST("hCounterZNCafterBCcuts"))->Fill(srun, 1); + histos.get(HIST("hLumiZNCafterBCcuts"))->Fill(srun, lumiZNC); + for (size_t i = 0; i < mRCTFlagsCheckers.size(); i++) { + if (mRCTFlagsCheckers[i](bc)) + histos.get(HIST("hLumiZNCafterBCcutsRCT"))->Fill(srun, i, lumiZNC); + } + } + } + + } // bcs + } // process + PROCESS_SWITCH(LumiTask, processRun3, "Process Run3 lumi task", false); +}; + WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { // Parse the metadata @@ -1236,5 +1484,6 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) return WorkflowSpec{ adaptAnalysisTask(cfgc), - adaptAnalysisTask(cfgc)}; + adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc)}; } From 7d0df82ffc73ebaa94a5302a7f3a038cc795c05c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Tue, 27 May 2025 10:16:42 +0200 Subject: [PATCH 1428/1650] [PWGHF,Trigger] Include What You Use (#11360) --- EventFiltering/PWGHF/HFFilter.cxx | 4 +++- EventFiltering/PWGHF/HFFilterCharmHadronSignals.cxx | 2 ++ EventFiltering/PWGHF/HFFilterHelpers.h | 3 +++ EventFiltering/PWGHF/HFFilterPrepareMLSamples.cxx | 2 ++ 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/EventFiltering/PWGHF/HFFilter.cxx b/EventFiltering/PWGHF/HFFilter.cxx index de20c259253..4c0d2d891de 100644 --- a/EventFiltering/PWGHF/HFFilter.cxx +++ b/EventFiltering/PWGHF/HFFilter.cxx @@ -45,13 +45,15 @@ #include "Common/DataModel/CollisionAssociationTables.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/PIDResponseITS.h" + #include "PWGEM/PhotonMeson/DataModel/gammaTables.h" + #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" +#include "PWGHF/Utils/utilsTrkCandHf.h" #include "EventFiltering/filterTables.h" #include "EventFiltering/PWGHF/HFFilterHelpers.h" -#include "PWGHF/Utils/utilsTrkCandHf.h" using namespace o2; using namespace o2::soa; diff --git a/EventFiltering/PWGHF/HFFilterCharmHadronSignals.cxx b/EventFiltering/PWGHF/HFFilterCharmHadronSignals.cxx index e3a9cf8044a..ab46a5e2504 100644 --- a/EventFiltering/PWGHF/HFFilterCharmHadronSignals.cxx +++ b/EventFiltering/PWGHF/HFFilterCharmHadronSignals.cxx @@ -32,6 +32,8 @@ #include "Common/DataModel/CollisionAssociationTables.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Multiplicity.h" + +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" diff --git a/EventFiltering/PWGHF/HFFilterHelpers.h b/EventFiltering/PWGHF/HFFilterHelpers.h index 5d4fa4fa1b6..72b2f71cae4 100644 --- a/EventFiltering/PWGHF/HFFilterHelpers.h +++ b/EventFiltering/PWGHF/HFFilterHelpers.h @@ -51,8 +51,11 @@ #include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" + +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" + #include "EventFiltering/filterTables.h" namespace o2::aod diff --git a/EventFiltering/PWGHF/HFFilterPrepareMLSamples.cxx b/EventFiltering/PWGHF/HFFilterPrepareMLSamples.cxx index 39e903e9f60..2a5dda41464 100644 --- a/EventFiltering/PWGHF/HFFilterPrepareMLSamples.cxx +++ b/EventFiltering/PWGHF/HFFilterPrepareMLSamples.cxx @@ -38,6 +38,8 @@ #include "Framework/runDataProcessing.h" #include "Common/Core/trackUtilities.h" + +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" From 83ed814dce72e4abdb54a3c6715c4fbd6ef11f5e Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Tue, 27 May 2025 12:34:31 +0200 Subject: [PATCH 1429/1650] [Infrastructure] Update CODEOWNERS (#11373) --- CODEOWNERS | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index 1c6a87f8878..43f250fdd0b 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -51,10 +51,10 @@ /PWGLF/TableProducer/Strangeness @alibuild @sustripathy @skundu692 @ercolessi @romainschotter # PWG-MM -/PWGMM @alibuild @sustripathy @skundu692 @aalkin -/PWGMM/Mult @alibuild @sustripathy @skundu692 @aalkin @aortizve @ddobrigk @gbencedi -/PWGMM/Lumi @alibuild @aalkin -/PWGMM/UE @alibuild @aalkin @aortizve +/PWGMM @alibuild @sustripathy @skundu692 @aalkin @jgcn +/PWGMM/Mult @alibuild @sustripathy @skundu692 @aalkin @aortizve @ddobrigk @gbencedi @jgcn +/PWGMM/Lumi @alibuild @aalkin @jgcn +/PWGMM/UE @alibuild @aalkin @aortizve @jgcn /PWGUD @alibuild @pbuehler @abylinkin @rolavick /PWGJE @alibuild @lhavener @maoyx @nzardosh @fjonasALICE @mfasDa @mhemmer-cern From 1b711782d3f92dbe7fd8dd59cd13f2f92fbd65de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Tue, 27 May 2025 14:04:25 +0200 Subject: [PATCH 1430/1650] [ALICE3] A3 OTF: add LUT maker with FastTracker (#11341) --- ALICE3/Core/CMakeLists.txt | 5 +- ALICE3/Core/DelphesO2LutWriter.cxx | 433 +++++++++++++++++++++++++++++ ALICE3/Core/DelphesO2LutWriter.h | 68 +++++ ALICE3/Core/FastTrackerLinkDef.h | 1 + 4 files changed, 506 insertions(+), 1 deletion(-) create mode 100644 ALICE3/Core/DelphesO2LutWriter.cxx create mode 100644 ALICE3/Core/DelphesO2LutWriter.h diff --git a/ALICE3/Core/CMakeLists.txt b/ALICE3/Core/CMakeLists.txt index 97718534a77..285c1624853 100644 --- a/ALICE3/Core/CMakeLists.txt +++ b/ALICE3/Core/CMakeLists.txt @@ -24,10 +24,13 @@ o2physics_target_root_dictionary(ALICE3Core o2physics_add_library(FastTracker SOURCES FastTracker.cxx DetLayer.cxx + DelphesO2LutWriter.cxx PUBLIC_LINK_LIBRARIES O2::Framework - O2Physics::AnalysisCore) + O2Physics::AnalysisCore + O2Physics::ALICE3Core) o2physics_target_root_dictionary(FastTracker HEADERS FastTracker.h DetLayer.h + DelphesO2LutWriter.h LINKDEF FastTrackerLinkDef.h) diff --git a/ALICE3/Core/DelphesO2LutWriter.cxx b/ALICE3/Core/DelphesO2LutWriter.cxx new file mode 100644 index 00000000000..6f079c7ece1 --- /dev/null +++ b/ALICE3/Core/DelphesO2LutWriter.cxx @@ -0,0 +1,433 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// +/// @file DelphesO2LutWriter.cxx +/// @brief Porting to O2Physics of DelphesO2 code. +/// Minimal changes have been made to the original code for adaptation purposes, formatting and commented parts have been considered. +/// Relevant sources: +/// DelphesO2/src/lutWrite.cc https://github.com/AliceO2Group/DelphesO2/blob/master/src/lutWrite.cc +/// @author: Roberto Preghenella +/// @email: preghenella@bo.infn.it +/// + +#include + +#include "ALICE3/Core/DelphesO2TrackSmearer.h" +#include "ALICE3/Core/DelphesO2LutWriter.h" +#include "iostream" +#include "TMatrixD.h" +#include "TVectorD.h" +#include "TMatrixDSymEigen.h" +#include "TDatabasePDG.h" +#include "TLorentzVector.h" +#include "ALICE3/Core/FastTracker.h" +#include "ALICE3/Core/TrackUtilities.h" + +// #define USE_FWD_PARAM +#ifdef USE_FWD_PARAM +#include "fwdRes.C" +#endif + +namespace o2::fastsim +{ + +void DelphesO2LutWriter::printLutWriterConfiguration() +{ + std::cout << " --- Printing configuration of LUT writer --- " << std::endl; + std::cout << " -> etaMaxBarrel = " << etaMaxBarrel << std::endl; + std::cout << " -> usePara = " << usePara << std::endl; + std::cout << " -> useDipole = " << useDipole << std::endl; + std::cout << " -> useFlatDipole = " << useFlatDipole << std::endl; +} + +bool DelphesO2LutWriter::fatSolve(lutEntry_t& lutEntry, + float pt, + float eta, + const float mass, + int itof, + int otof, + int q) +{ + lutEntry.valid = false; + + static TLorentzVector tlv; + tlv.SetPtEtaPhiM(pt, eta, 0., mass); + o2::track::TrackParCov trkIn; + o2::upgrade::convertTLorentzVectorToO2Track(q, tlv, {0., 0., 0.}, trkIn); + + o2::track::TrackParCov trkOut; + if (fat.FastTrack(trkIn, trkOut, 1) < 0) { + Printf(" --- fatSolve: FastTrack failed --- \n"); + tlv.Print(); + return false; + } + lutEntry.valid = true; + lutEntry.itof = fat.GetGoodHitProb(itof); + lutEntry.otof = fat.GetGoodHitProb(otof); + for (int i = 0; i < 15; ++i) + lutEntry.covm[i] = trkOut.getCov()[i]; + + // define the efficiency + auto totfake = 0.; + lutEntry.eff = 1.; + for (int i = 1; i < 20; ++i) { + auto igoodhit = fat.GetGoodHitProb(i); + if (igoodhit <= 0. || i == itof || i == otof) + continue; + lutEntry.eff *= igoodhit; + auto pairfake = 0.; + for (int j = i + 1; j < 20; ++j) { + auto jgoodhit = fat.GetGoodHitProb(j); + if (jgoodhit <= 0. || j == itof || j == otof) + continue; + pairfake = (1. - igoodhit) * (1. - jgoodhit); + break; + } + totfake += pairfake; + } + lutEntry.eff2 = (1. - totfake); + + return true; +} + +#ifdef USE_FWD_PARAM +bool DelphesO2LutWriter::fwdSolve(float* covm, float pt, float eta, float mass) +{ + if (fwdRes(covm, pt, eta, mass) < 0) + return false; + return true; +} +#else +bool DelphesO2LutWriter::fwdSolve(float*, float, float, float) +{ + return false; +} +#endif + +bool DelphesO2LutWriter::fwdPara(lutEntry_t& lutEntry, float pt, float eta, float mass, float Bfield) +{ + lutEntry.valid = false; + + // parametrised forward response; interpolates between FAT at eta = 1.75 and a fixed parametrisation at eta = 4; only diagonal elements + if (std::fabs(eta) < etaMaxBarrel || std::fabs(eta) > 4) + return false; + + if (!fatSolve(lutEntry, pt, etaMaxBarrel, mass)) + return false; + float covmbarrel[15] = {0}; + for (int i = 0; i < 15; ++i) { + covmbarrel[i] = lutEntry.covm[i]; + } + + // parametrisation at eta = 4 + const double beta = 1. / std::sqrt(1 + mass * mass / pt / pt / std::cosh(eta) / std::cosh(eta)); + const float dca_pos = 2.5e-4 / std::sqrt(3); // 2.5 micron/sqrt(3) + const float r0 = 0.5; // layer 0 radius [cm] + const float r1 = 1.3; + const float r2 = 2.5; + const float x0layer = 0.001; // material budget (rad length) per layer + const double sigma_alpha = 0.0136 / beta / pt * std::sqrt(x0layer * std::cosh(eta)) * (1 + 0.038 * std::log(x0layer * std::cosh(eta))); + const double dcaxy_ms = sigma_alpha * r0 * std::sqrt(1 + r1 * r1 / (r2 - r0) / (r2 - r0)); + const double dcaxy2 = dca_pos * dca_pos + dcaxy_ms * dcaxy_ms; + + const double dcaz_ms = sigma_alpha * r0 * std::cosh(eta); + const double dcaz2 = dca_pos * dca_pos + dcaz_ms * dcaz_ms; + + const float Leta = 2.8 / sinh(eta) - 0.01 * r0; // m + const double relmomres_pos = 10e-6 * pt / 0.3 / Bfield / Leta / Leta * std::sqrt(720. / 15.); + + const float relmomres_barrel = std::sqrt(covmbarrel[14]) * pt; + const float Router = 1; // m + const float relmomres_pos_barrel = 10e-6 * pt / 0.3 / Bfield / Router / Router / std::sqrt(720. / 15.); + const float relmomres_MS_barrel = std::sqrt(relmomres_barrel * relmomres_barrel - relmomres_pos_barrel * relmomres_pos_barrel); + + // interpolate MS contrib (rel resolution 0.4 at eta = 4) + const float relmomres_MS_eta4 = 0.4 / beta * 0.5 / Bfield; + const float relmomres_MS = relmomres_MS_eta4 * pow(relmomres_MS_eta4 / relmomres_MS_barrel, (std::fabs(eta) - 4.) / (4. - etaMaxBarrel)); + const float momres_tot = pt * std::sqrt(relmomres_pos * relmomres_pos + relmomres_MS * relmomres_MS); // total absolute mom reso + + // Fill cov matrix diag + for (int i = 0; i < 15; ++i) + lutEntry.covm[i] = 0; + + lutEntry.covm[0] = covmbarrel[0]; + if (dcaxy2 > lutEntry.covm[0]) + lutEntry.covm[0] = dcaxy2; + lutEntry.covm[2] = covmbarrel[2]; + if (dcaz2 > lutEntry.covm[2]) + lutEntry.covm[2] = dcaz2; + lutEntry.covm[5] = covmbarrel[5]; // sigma^2 sin(phi) + lutEntry.covm[9] = covmbarrel[9]; // sigma^2 tanl + lutEntry.covm[14] = momres_tot * momres_tot / pt / pt / pt / pt; // sigma^2 1/pt + // Check that all numbers are numbers + for (int i = 0; i < 15; ++i) { + if (std::isnan(lutEntry.covm[i])) { + Printf(" --- lutEntry.covm[%d] is NaN", i); + return false; + } + } + return true; +} + +void DelphesO2LutWriter::lutWrite(const char* filename, int pdg, float field, int itof, int otof) +{ + + if (useFlatDipole && useDipole) { + Printf("Both dipole and dipole flat flags are on, please use only one of them"); + return; + } + + // output file + std::ofstream lutFile(filename, std::ofstream::binary); + if (!lutFile.is_open()) { + Printf("Did not manage to open output file!!"); + return; + } + + // write header + lutHeader_t lutHeader; + // pid + lutHeader.pdg = pdg; + lutHeader.mass = TDatabasePDG::Instance()->GetParticle(pdg)->Mass(); + const int q = std::abs(TDatabasePDG::Instance()->GetParticle(pdg)->Charge()) / 3; + if (q <= 0) { + Printf("Negative or null charge (%f) for pdg code %i. Fix the charge!", TDatabasePDG::Instance()->GetParticle(pdg)->Charge(), pdg); + return; + } + lutHeader.field = field; + // nch + lutHeader.nchmap.log = true; + lutHeader.nchmap.nbins = 20; + lutHeader.nchmap.min = 0.5; + lutHeader.nchmap.max = 3.5; + // radius + lutHeader.radmap.log = false; + lutHeader.radmap.nbins = 1; + lutHeader.radmap.min = 0.; + lutHeader.radmap.max = 100.; + // eta + lutHeader.etamap.log = false; + lutHeader.etamap.nbins = 80; + lutHeader.etamap.min = -4.; + lutHeader.etamap.max = 4.; + // pt + lutHeader.ptmap.log = true; + lutHeader.ptmap.nbins = 200; + lutHeader.ptmap.min = -2; + lutHeader.ptmap.max = 2.; + lutFile.write(reinterpret_cast(&lutHeader), sizeof(lutHeader)); + + // entries + const int nnch = lutHeader.nchmap.nbins; + const int nrad = lutHeader.radmap.nbins; + const int neta = lutHeader.etamap.nbins; + const int npt = lutHeader.ptmap.nbins; + lutEntry_t lutEntry; + + // write entries + for (int inch = 0; inch < nnch; ++inch) { + Printf(" --- writing nch = %d/%d", inch, nnch); + auto nch = lutHeader.nchmap.eval(inch); + lutEntry.nch = nch; + fat.SetdNdEtaCent(nch); + for (int irad = 0; irad < nrad; ++irad) { + Printf(" --- writing irad = %d/%d", irad, nrad); + for (int ieta = 0; ieta < neta; ++ieta) { + Printf(" --- writing ieta = %d/%d", ieta, neta); + auto eta = lutHeader.etamap.eval(ieta); + lutEntry.eta = lutHeader.etamap.eval(ieta); + for (int ipt = 0; ipt < npt; ++ipt) { + Printf(" --- writing ipt = %d/%d", ipt, npt); + lutEntry.pt = lutHeader.ptmap.eval(ipt); + lutEntry.valid = true; + if (std::fabs(eta) <= etaMaxBarrel) { // full lever arm ends at etaMaxBarrel + Printf("Solving in the barrel"); + // printf(" --- fatSolve: pt = %f, eta = %f, mass = %f, field=%f \n", lutEntry.pt, lutEntry.eta, lutHeader.mass, lutHeader.field); + if (!fatSolve(lutEntry, lutEntry.pt, lutEntry.eta, lutHeader.mass, itof, otof, q)) { + // printf(" --- fatSolve: error \n"); + lutEntry.valid = false; + lutEntry.eff = 0.; + lutEntry.eff2 = 0.; + for (int i = 0; i < 15; ++i) { + lutEntry.covm[i] = 0.; + } + } + } else { + Printf("Solving outside the barrel"); + // printf(" --- fwdSolve: pt = %f, eta = %f, mass = %f, field=%f \n", lutEntry.pt, lutEntry.eta, lutHeader.mass, lutHeader.field); + lutEntry.eff = 1.; + lutEntry.eff2 = 1.; + bool retval = true; + if (useFlatDipole) { // Using the parametrization at the border of the barrel + retval = fatSolve(lutEntry, lutEntry.pt, etaMaxBarrel, lutHeader.mass, itof, otof, q); + } else if (usePara) { + retval = fwdPara(lutEntry, lutEntry.pt, lutEntry.eta, lutHeader.mass, field); + } else { + retval = fwdSolve(lutEntry.covm, lutEntry.pt, lutEntry.eta, lutHeader.mass); + } + if (useDipole) { // Using the parametrization at the border of the barrel only for efficiency and momentum resolution + lutEntry_t lutEntryBarrel; + retval = fatSolve(lutEntryBarrel, lutEntry.pt, etaMaxBarrel, lutHeader.mass, itof, otof, q); + lutEntry.valid = lutEntryBarrel.valid; + lutEntry.covm[14] = lutEntryBarrel.covm[14]; + lutEntry.eff = lutEntryBarrel.eff; + lutEntry.eff2 = lutEntryBarrel.eff2; + } + if (!retval) { + printf(" --- fwdSolve: error \n"); + lutEntry.valid = false; + for (int i = 0; i < 15; ++i) { + lutEntry.covm[i] = 0.; + } + } + } + Printf("Diagonalizing"); + diagonalise(lutEntry); + Printf("Writing"); + lutFile.write(reinterpret_cast(&lutEntry), sizeof(lutEntry_t)); + } + } + } + } + lutFile.close(); +} + +void DelphesO2LutWriter::diagonalise(lutEntry_t& lutEntry) +{ + TMatrixDSym m(5); + for (int i = 0, k = 0; i < 5; ++i) { + for (int j = 0; j < i + 1; ++j, ++k) { + m(i, j) = lutEntry.covm[k]; + m(j, i) = lutEntry.covm[k]; + } + } + + m.Print(); + TMatrixDSymEigen eigen(m); + // eigenvalues vector + TVectorD eigenVal = eigen.GetEigenValues(); + for (int i = 0; i < 5; ++i) + lutEntry.eigval[i] = eigenVal[i]; + // eigenvectors matrix + TMatrixD eigenVec = eigen.GetEigenVectors(); + for (int i = 0; i < 5; ++i) + for (int j = 0; j < 5; ++j) + lutEntry.eigvec[i][j] = eigenVec[i][j]; + // inverse eigenvectors matrix + eigenVec.Invert(); + for (int i = 0; i < 5; ++i) + for (int j = 0; j < 5; ++j) + lutEntry.eiginv[i][j] = eigenVec[i][j]; +} + +TGraph* DelphesO2LutWriter::lutRead(const char* filename, int pdg, int what, int vs, float nch, float radius, float eta, float pt) +{ + static const int kNch = 0; + static const int kEta = 1; + static const int kPt = 2; + + static const int kEfficiency = 0; + static const int kEfficiency2 = 1; + static const int kEfficiencyInnerTOF = 2; + static const int kEfficiencyOuterTOF = 3; + static const int kPtResolution = 4; + static const int kRPhiResolution = 5; + static const int kZResolution = 6; + + o2::delphes::DelphesO2TrackSmearer smearer; + smearer.loadTable(pdg, filename); + auto lutHeader = smearer.getLUTHeader(pdg); + map_t lutMap; + switch (vs) { + case kNch: + lutMap = lutHeader->nchmap; + break; + case kEta: + lutMap = lutHeader->etamap; + break; + case kPt: + lutMap = lutHeader->ptmap; + break; + } + auto nbins = lutMap.nbins; + auto g = new TGraph(); + + bool canBeInvalid = true; + for (int i = 0; i < nbins; ++i) { + switch (vs) { + case kNch: + nch = lutMap.eval(i); + break; + case kEta: + eta = lutMap.eval(i); + break; + case kPt: + pt = lutMap.eval(i); + break; + } + float eff = 0.; + auto lutEntry = smearer.getLUTEntry(pdg, nch, radius, eta, pt, eff); + if (!lutEntry->valid || lutEntry->eff == 0.) { + if (!canBeInvalid) { + Printf(" --- warning: it cannot be invalid"); + } + continue; + } + canBeInvalid = false; + + double cen = 0.; + switch (vs) { + case kNch: + cen = lutEntry->nch; + break; + case kEta: + cen = lutEntry->eta; + break; + case kPt: + cen = lutEntry->pt; + break; + } + double val = 0.; + switch (what) { + case kEfficiency: + val = lutEntry->eff * 100.; // efficiency (%) + break; + case kEfficiency2: + val = lutEntry->eff2 * 100.; // efficiency (%) + break; + case kEfficiencyInnerTOF: + val = lutEntry->itof * 100.; // efficiency (%) + break; + case kEfficiencyOuterTOF: + val = lutEntry->otof * 100.; // efficiency (%) + break; + case kPtResolution: + val = sqrt(lutEntry->covm[14]) * lutEntry->pt * 100.; // pt resolution (%) + break; + case kRPhiResolution: + val = sqrt(lutEntry->covm[0]) * 1.e4; // rphi resolution (um) + break; + case kZResolution: + val = sqrt(lutEntry->covm[1]) * 1.e4; // z resolution (um) + break; + default: + Printf(" --- error: unknown what %d", what); + break; + } + g->AddPoint(cen, val); + } + + return g; +} +} // namespace o2::fastsim + +ClassImp(o2::fastsim::DelphesO2LutWriter); diff --git a/ALICE3/Core/DelphesO2LutWriter.h b/ALICE3/Core/DelphesO2LutWriter.h new file mode 100644 index 00000000000..e4b979a46cd --- /dev/null +++ b/ALICE3/Core/DelphesO2LutWriter.h @@ -0,0 +1,68 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// +/// @file DelphesO2LutWriter.h +/// @brief Porting to O2Physics of DelphesO2 code. +/// Minimal changes have been made to the original code for adaptation purposes, formatting and commented parts have been considered. +/// Relevant sources: +/// DelphesO2/src/lutWrite.cc https://github.com/AliceO2Group/DelphesO2/blob/master/src/lutWrite.cc +/// @author: Roberto Preghenella +/// @email: preghenella@bo.infn.it +/// + +#ifndef ALICE3_CORE_DELPHESO2LUTWRITER_H_ +#define ALICE3_CORE_DELPHESO2LUTWRITER_H_ + +#include "ALICE3/Core/DelphesO2TrackSmearer.h" +#include "ALICE3/Core/FastTracker.h" +#include "TGraph.h" + +namespace o2::fastsim +{ +class DelphesO2LutWriter +{ + public: + DelphesO2LutWriter() = default; + virtual ~DelphesO2LutWriter() = default; + + o2::fastsim::FastTracker fat; + void diagonalise(lutEntry_t& lutEntry); + float etaMaxBarrel = 1.75f; + bool usePara = true; // use fwd parameterisation + bool useDipole = false; // use dipole i.e. flat parametrization for efficiency and momentum resolution + bool useFlatDipole = false; // use dipole i.e. flat parametrization outside of the barrel + + int mAtLeastHits = 4; + int mAtLeastCorr = 4; + int mAtLeastFake = 0; + void SetAtLeastHits(int n) { mAtLeastHits = n; } + void SetAtLeastCorr(int n) { mAtLeastCorr = n; } + void SetAtLeastFake(int n) { mAtLeastFake = n; } + + void printLutWriterConfiguration(); + bool fatSolve(lutEntry_t& lutEntry, + float pt = 0.1, + float eta = 0.0, + const float mass = 0.13957000, + int itof = 0, + int otof = 0, + int q = 1); + bool fwdSolve(float* covm, float pt = 0.1, float eta = 0.0, float mass = 0.13957000); + bool fwdPara(lutEntry_t& lutEntry, float pt = 0.1, float eta = 0.0, float mass = 0.13957000, float Bfield = 0.5); + void lutWrite(const char* filename = "lutCovm.dat", int pdg = 211, float field = 0.2, int itof = 0, int otof = 0); + TGraph* lutRead(const char* filename, int pdg, int what, int vs, float nch = 0., float radius = 0., float eta = 0., float pt = 0.); + + ClassDef(DelphesO2LutWriter, 1); +}; +} // namespace o2::fastsim + +#endif // ALICE3_CORE_DELPHESO2LUTWRITER_H_ diff --git a/ALICE3/Core/FastTrackerLinkDef.h b/ALICE3/Core/FastTrackerLinkDef.h index a69755b7e92..a5441d81cde 100644 --- a/ALICE3/Core/FastTrackerLinkDef.h +++ b/ALICE3/Core/FastTrackerLinkDef.h @@ -17,5 +17,6 @@ #pragma link off all functions; #pragma link C++ class o2::fastsim::FastTracker + ; +#pragma link C++ class o2::fastsim::DelphesO2LutWriter + ; #endif // ALICE3_CORE_FASTTRACKERLINKDEF_H_ From f8eb4164eca358f627d94bc06c11afd1a004e705 Mon Sep 17 00:00:00 2001 From: Jesper Gumprecht <113693781+jesgum@users.noreply.github.com> Date: Tue, 27 May 2025 15:22:30 +0200 Subject: [PATCH 1431/1650] [ALICE3] fix convertion to o2track (#11376) --- ALICE3/Core/TrackUtilities.h | 1 - 1 file changed, 1 deletion(-) diff --git a/ALICE3/Core/TrackUtilities.h b/ALICE3/Core/TrackUtilities.h index e4a1e159804..3650d500aaf 100644 --- a/ALICE3/Core/TrackUtilities.h +++ b/ALICE3/Core/TrackUtilities.h @@ -85,7 +85,6 @@ void convertMCParticleToO2Track(McParticleType& particle, { static TLorentzVector tlv; tlv.SetPxPyPzE(particle.px(), particle.py(), particle.pz(), particle.e()); - tlv.SetXYZT(particle.vx(), particle.vy(), particle.vz(), particle.vt()); convertTLorentzVectorToO2Track(particle.pdgCode(), tlv, {particle.vx(), particle.vy(), particle.vz()}, o2track, pdg); } From d9dfa37d091a835d9e00fce1a137735e844b70b1 Mon Sep 17 00:00:00 2001 From: Zhenjun Xiong <108917659+zjxiongOvO@users.noreply.github.com> Date: Tue, 27 May 2025 15:37:53 +0200 Subject: [PATCH 1432/1650] [PWGDQ] Updated the definition of polarization variables (#11375) --- PWGDQ/Core/HistogramsLibrary.cxx | 36 +++- PWGDQ/Core/VarManager.cxx | 52 +++-- PWGDQ/Core/VarManager.h | 334 +++++++++++++++++++++++-------- 3 files changed, 320 insertions(+), 102 deletions(-) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index b65c12de647..96227af31ce 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -972,14 +972,34 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "VtxZ_VtxNcontribReal", "VtxZ vs VtxNcontribReal", false, 240, -12.0, 12.0, VarManager::kVtxZ, 200, 0, 200.0, VarManager::kVtxNcontribReal); } if (subGroupStr.Contains("polarization")) { - hm->AddHistogram(histClass, "cosThetaHE", "", false, 100, -1., 1., VarManager::kCosThetaHE); - hm->AddHistogram(histClass, "cosThetaCS", "", false, 100, -1., 1., VarManager::kCosThetaCS); - hm->AddHistogram(histClass, "PhiHE", "", false, 100, -o2::constants::math::PI, o2::constants::math::PI, VarManager::kPhiHE); - hm->AddHistogram(histClass, "PhiCS", "", false, 100, -o2::constants::math::PI, o2::constants::math::PI, VarManager::kPhiCS); - hm->AddHistogram(histClass, "Mass_Pt_cosThetaHE", "", false, 100, 1.0, 5.0, VarManager::kMass, 250, 0.0, 25.0, VarManager::kPt, 40, -1., 1., VarManager::kCosThetaHE); - hm->AddHistogram(histClass, "Mass_Pt_cosThetaCS", "", false, 100, 1.0, 5.0, VarManager::kMass, 250, 0.0, 25.0, VarManager::kPt, 40, -1., 1., VarManager::kCosThetaCS); - hm->AddHistogram(histClass, "Mass_Pt_PhiHE", "", false, 100, 1.0, 5.0, VarManager::kMass, 250, 0.0, 25.0, VarManager::kPt, 40, -o2::constants::math::PI, o2::constants::math::PI, VarManager::kPhiHE); - hm->AddHistogram(histClass, "Mass_Pt_PhiCS", "", false, 100, 1.0, 5.0, VarManager::kMass, 250, 0.0, 25.0, VarManager::kPt, 40, -o2::constants::math::PI, o2::constants::math::PI, VarManager::kPhiCS); + if (subGroupStr.Contains("helicity")) { + hm->AddHistogram(histClass, "cosThetaHE", "", false, 100, -1., 1., VarManager::kCosThetaHE); + hm->AddHistogram(histClass, "phiHE", "", false, 100, 0, 2 * o2::constants::math::PI, VarManager::kPhiHE); + hm->AddHistogram(histClass, "phitildeHE", "", false, 100, 0, 2 * o2::constants::math::PI, VarManager::kPhiTildeHE); + hm->AddHistogram(histClass, "Mass_Pt_CosThetaHE", "", false, 100, 1.0, 5.0, VarManager::kMass, 40, 0.0, 20.0, VarManager::kPt, 20, -1., 1., VarManager::kCosThetaHE); + hm->AddHistogram(histClass, "Mass_Pt_PhiHE", "", false, 100, 1.0, 5.0, VarManager::kMass, 40, 0.0, 20.0, VarManager::kPt, 20, 0., 2 * o2::constants::math::PI, VarManager::kPhiHE); + hm->AddHistogram(histClass, "Mass_Pt_PhiTildeHE", "", false, 100, 1.0, 5.0, VarManager::kMass, 40, 0.0, 20.0, VarManager::kPt, 20, 0., 2 * o2::constants::math::PI, VarManager::kPhiTildeHE); + } + if (subGroupStr.Contains("collins-soper")) { + hm->AddHistogram(histClass, "cosThetaCS", "", false, 100, -1., 1., VarManager::kCosThetaCS); + hm->AddHistogram(histClass, "phiCS", "", false, 100, 0, 2 * o2::constants::math::PI, VarManager::kPhiCS); + hm->AddHistogram(histClass, "phitildeCS", "", false, 100, 0, 2 * o2::constants::math::PI, VarManager::kPhiTildeCS); + hm->AddHistogram(histClass, "Mass_Pt_CosThetaCS", "", false, 100, 1.0, 5.0, VarManager::kMass, 40, 0.0, 20.0, VarManager::kPt, 20, -1., 1., VarManager::kCosThetaCS); + hm->AddHistogram(histClass, "Mass_Pt_PhiCS", "", false, 100, 1.0, 5.0, VarManager::kMass, 40, 0.0, 20.0, VarManager::kPt, 20, 0., 2 * o2::constants::math::PI, VarManager::kPhiCS); + hm->AddHistogram(histClass, "Mass_Pt_PhiTildeCS", "", false, 100, 1.0, 5.0, VarManager::kMass, 40, 0.0, 20.0, VarManager::kPt, 20, 0., 2 * o2::constants::math::PI, VarManager::kPhiTildeCS); + } + if (subGroupStr.Contains("production")) { + hm->AddHistogram(histClass, "cosThetaPP", "", false, 100, -1., 1., VarManager::kCosThetaPP); + hm->AddHistogram(histClass, "phiPP", "", false, 100, 0, 2 * o2::constants::math::PI, VarManager::kPhiPP); + hm->AddHistogram(histClass, "phitildePP", "", false, 100, 0, 2 * o2::constants::math::PI, VarManager::kPhiTildePP); + hm->AddHistogram(histClass, "Mass_Pt_CosThetaPP", "", false, 100, 1.0, 5.0, VarManager::kMass, 40, 0.0, 20.0, VarManager::kPt, 20, -1., 1., VarManager::kCosThetaPP); + hm->AddHistogram(histClass, "Mass_Pt_PhiPP", "", false, 100, 1.0, 5.0, VarManager::kMass, 40, 0.0, 20.0, VarManager::kPt, 20, 0., 2 * o2::constants::math::PI, VarManager::kPhiPP); + hm->AddHistogram(histClass, "Mass_Pt_PhiTildePP", "", false, 100, 1.0, 5.0, VarManager::kMass, 40, 0.0, 20.0, VarManager::kPt, 20, 0., 2 * o2::constants::math::PI, VarManager::kPhiTildePP); + } + if (subGroupStr.Contains("random")) { + hm->AddHistogram(histClass, "cosThetaRM", "", false, 100, -1., 1., VarManager::kCosThetaRM); + hm->AddHistogram(histClass, "Mass_Pt_CosThetaRM", "", false, 200, 1.0, 5.0, VarManager::kMass, 40, 0.0, 20.0, VarManager::kPt, 20, -1., 1., VarManager::kCosThetaRM); + } } if (subGroupStr.Contains("upsilon")) { hm->AddHistogram(histClass, "MassUpsilon_Pt", "", false, 500, 7.0, 12.0, VarManager::kMass, 400, 0.0, 40.0, VarManager::kPt); diff --git a/PWGDQ/Core/VarManager.cxx b/PWGDQ/Core/VarManager.cxx index dc3c963be43..503101d303f 100644 --- a/PWGDQ/Core/VarManager.cxx +++ b/PWGDQ/Core/VarManager.cxx @@ -542,18 +542,26 @@ void VarManager::SetDefaultVarNames() fgVariableUnits[kMCVy] = "cm"; // TODO: check the unit fgVariableNames[kMCVz] = "MC vz"; fgVariableUnits[kMCVz] = "cm"; // TODO: check the unit - fgVariableNames[kMCCosThetaHE] = "cos#it{#theta}^{MC}_{HE}"; + fgVariableNames[kMCCosThetaHE] = "MC cos(#theta_{HE})"; fgVariableUnits[kMCCosThetaHE] = ""; - fgVariableNames[kMCPhiHE] = "#varphi^{MC}_{HE}"; - fgVariableUnits[kMCPhiHE] = "rad."; - fgVariableNames[kMCCosThetaCS] = "cos#it{#theta}^{MC}_{CS}"; + fgVariableNames[kMCPhiHE] = "MC #varphi_{HE}"; + fgVariableUnits[kMCPhiHE] = "rad"; + fgVariableNames[kMCPhiTildeHE] = "MC #tilde{#varphi}_{HE}"; + fgVariableUnits[kMCPhiTildeHE] = "rad"; + fgVariableNames[kMCCosThetaCS] = "MC cos(#theta_{CS})"; fgVariableUnits[kMCCosThetaCS] = ""; - fgVariableNames[kMCPhiCS] = "#varphi^{MC}_{CS}"; - fgVariableUnits[kMCPhiCS] = "rad."; - fgVariableNames[kMCCosThetaPP] = "cos#it{#theta}^{MC}_{PP}"; + fgVariableNames[kMCPhiCS] = "MC #varphi_{CS}"; + fgVariableUnits[kMCPhiCS] = "rad"; + fgVariableNames[kMCPhiTildeCS] = "MC #tilde{#varphi}_{CS}"; + fgVariableUnits[kMCPhiTildeCS] = "rad"; + fgVariableNames[kMCCosThetaPP] = "MC cos(#theta_{PP})"; fgVariableUnits[kMCCosThetaPP] = ""; - fgVariableNames[kMCPhiPP] = "#varphi^{MC}_{PP}"; - fgVariableUnits[kMCPhiPP] = "rad."; + fgVariableNames[kMCPhiPP] = "MC #varphi_{PP}"; + fgVariableUnits[kMCPhiPP] = "rad"; + fgVariableNames[kMCPhiTildePP] = "MC #tilde{#varphi}_{PP}"; + fgVariableUnits[kMCPhiTildePP] = "rad"; + fgVariableNames[kMCCosThetaRM] = "MC cos(#theta_{RM})"; + fgVariableUnits[kMCCosThetaRM] = ""; fgVariableNames[kCandidateId] = ""; fgVariableUnits[kCandidateId] = ""; fgVariableNames[kPairType] = "Pair type"; @@ -934,18 +942,26 @@ void VarManager::SetDefaultVarNames() fgVariableUnits[kDeltaPhi] = "rad."; fgVariableNames[kDeltaPhiSym] = "#Delta#phi"; fgVariableUnits[kDeltaPhiSym] = "rad."; - fgVariableNames[kCosThetaHE] = "cos#it{#theta}_{HE}"; + fgVariableNames[kCosThetaHE] = "cos#it{#theta}"; fgVariableUnits[kCosThetaHE] = ""; fgVariableNames[kPhiHE] = "#varphi_{HE}"; fgVariableUnits[kPhiHE] = "rad."; + fgVariableNames[kPhiTildeHE] = "#tilde{#varphi}_{HE}"; + fgVariableUnits[kPhiTildeHE] = "rad."; fgVariableNames[kCosThetaCS] = "cos#it{#theta}_{CS}"; fgVariableUnits[kCosThetaCS] = ""; fgVariableNames[kPhiCS] = "#varphi_{CS}"; fgVariableUnits[kPhiCS] = "rad."; + fgVariableNames[kPhiTildeCS] = "#tilde{#varphi}_{CS}"; + fgVariableUnits[kPhiTildeCS] = "rad."; fgVariableNames[kCosThetaPP] = "cos#it{#theta}_{PP}"; fgVariableUnits[kCosThetaPP] = ""; fgVariableNames[kPhiPP] = "#varphi_{PP}"; fgVariableUnits[kPhiPP] = "rad."; + fgVariableNames[kPhiTildePP] = "#tilde{#varphi}_{PP}"; + fgVariableUnits[kPhiTildePP] = "rad."; + fgVariableNames[kCosThetaRM] = "cos#it{#theta}_{RM}"; + fgVariableUnits[kCosThetaRM] = ""; fgVariableNames[kCosPhiVP] = "cos#it{#varphi}_{VP}"; fgVariableUnits[kCosPhiVP] = ""; fgVariableNames[kPhiVP] = "#varphi_{VP} - #Psi_{2}"; @@ -1462,11 +1478,15 @@ void VarManager::SetDefaultVarNames() fgVarNamesMap["kMCEta"] = kMCEta; fgVarNamesMap["kMCY"] = kMCY; fgVarNamesMap["kMCCosThetaHE"] = kMCCosThetaHE; - fgVarNamesMap["kMCCosThetaCS"] = kMCCosThetaCS; - fgVarNamesMap["kMCCosThetaPP"] = kMCCosThetaPP; fgVarNamesMap["kMCPhiHE"] = kMCPhiHE; + fgVarNamesMap["kMCPhiTildeHE"] = kMCPhiTildeHE; + fgVarNamesMap["kMCCosThetaCS"] = kMCCosThetaCS; fgVarNamesMap["kMCPhiCS"] = kMCPhiCS; + fgVarNamesMap["kMCPhiTildeCS"] = kMCPhiTildeCS; + fgVarNamesMap["kMCCosThetaPP"] = kMCCosThetaPP; fgVarNamesMap["kMCPhiPP"] = kMCPhiPP; + fgVarNamesMap["kMCPhiTildePP"] = kMCPhiTildePP; + fgVarNamesMap["kMCCosThetaRM"] = kMCCosThetaRM; fgVarNamesMap["kMCParticleGeneratorId"] = kMCParticleGeneratorId; fgVarNamesMap["kNMCParticleVariables"] = kNMCParticleVariables; fgVarNamesMap["kMCMotherPdgCode"] = kMCMotherPdgCode; @@ -1496,11 +1516,15 @@ void VarManager::SetDefaultVarNames() fgVarNamesMap["kVertexingProcCode"] = kVertexingProcCode; fgVarNamesMap["kVertexingChi2PCA"] = kVertexingChi2PCA; fgVarNamesMap["kCosThetaHE"] = kCosThetaHE; - fgVarNamesMap["kCosThetaCS"] = kCosThetaCS; - fgVarNamesMap["kCosThetaPP"] = kCosThetaPP; fgVarNamesMap["kPhiHE"] = kPhiHE; + fgVarNamesMap["kPhiTildeHE"] = kPhiTildeHE; + fgVarNamesMap["kCosThetaCS"] = kCosThetaCS; fgVarNamesMap["kPhiCS"] = kPhiCS; + fgVarNamesMap["kPhiTildeCS"] = kPhiTildeCS; + fgVarNamesMap["kCosThetaPP"] = kCosThetaPP; fgVarNamesMap["kPhiPP"] = kPhiPP; + fgVarNamesMap["kPhiTildePP"] = kPhiTildePP; + fgVarNamesMap["kCosThetaRM"] = kCosThetaRM; fgVarNamesMap["kCosPhiVP"] = kCosPhiVP; fgVarNamesMap["kPhiVP"] = kPhiVP; fgVarNamesMap["kDeltaPhiPair2"] = kDeltaPhiPair2; diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index b1e18ab7635..1da8fa30562 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -621,11 +621,15 @@ class VarManager : public TObject // MC pair variables kMCCosThetaHE, - kMCCosThetaCS, - kMCCosThetaPP, kMCPhiHE, + kMCPhiTildeHE, + kMCCosThetaCS, kMCPhiCS, + kMCPhiTildeCS, + kMCCosThetaPP, kMCPhiPP, + kMCPhiTildePP, + kMCCosThetaRM, // Pair variables kCandidateId, @@ -654,11 +658,15 @@ class VarManager : public TObject kVertexingProcCode, kVertexingChi2PCA, kCosThetaHE, - kCosThetaCS, - kCosThetaPP, kPhiHE, + kPhiTildeHE, + kCosThetaCS, kPhiCS, + kPhiTildeCS, + kCosThetaPP, kPhiPP, + kPhiTildePP, + kCosThetaRM, kCosPhiVP, kPhiVP, kDeltaPhiPair2, @@ -2814,53 +2822,128 @@ void VarManager::FillPair(T1 const& t1, T2 const& t2, float* values) } } - // TO DO: get the correct values from CCDB - double BeamMomentum = TMath::Sqrt(fgCenterOfMassEnergy * fgCenterOfMassEnergy / 4 - fgMassofCollidingParticle * fgMassofCollidingParticle); // GeV - ROOT::Math::PxPyPzEVector Beam1(0., 0., -BeamMomentum, fgCenterOfMassEnergy / 2); - ROOT::Math::PxPyPzEVector Beam2(0., 0., BeamMomentum, fgCenterOfMassEnergy / 2); - - // Boost to center of mass frame - ROOT::Math::Boost boostv12{v12.BoostToCM()}; - ROOT::Math::XYZVectorF v1_CM{(boostv12(v1).Vect()).Unit()}; - ROOT::Math::XYZVectorF v2_CM{(boostv12(v2).Vect()).Unit()}; - ROOT::Math::XYZVectorF Beam1_CM{(boostv12(Beam1).Vect()).Unit()}; - ROOT::Math::XYZVectorF Beam2_CM{(boostv12(Beam2).Vect()).Unit()}; - - // Helicity frame - ROOT::Math::XYZVectorF zaxis_HE{(v12.Vect()).Unit()}; - ROOT::Math::XYZVectorF yaxis_HE{(Beam1_CM.Cross(Beam2_CM)).Unit()}; - ROOT::Math::XYZVectorF xaxis_HE{(yaxis_HE.Cross(zaxis_HE)).Unit()}; - - // Collins-Soper frame - ROOT::Math::XYZVectorF zaxis_CS{((Beam1_CM.Unit() - Beam2_CM.Unit()).Unit())}; - ROOT::Math::XYZVectorF yaxis_CS{(Beam1_CM.Cross(Beam2_CM)).Unit()}; - ROOT::Math::XYZVectorF xaxis_CS{(yaxis_CS.Cross(zaxis_CS)).Unit()}; - - // Production frame - ROOT::Math::XYZVector normalVec = ROOT::Math::XYZVector(v12.Py(), -v12.Px(), 0.f); - - if (fgUsedVars[kCosThetaHE]) { - values[kCosThetaHE] = (t1.sign() > 0 ? zaxis_HE.Dot(v1_CM) : zaxis_HE.Dot(v2_CM)); - } - - if (fgUsedVars[kPhiHE]) { - values[kPhiHE] = (t1.sign() > 0 ? TMath::ATan2(yaxis_HE.Dot(v1_CM), xaxis_HE.Dot(v1_CM)) : TMath::ATan2(yaxis_HE.Dot(v2_CM), xaxis_HE.Dot(v2_CM))); - } - - if (fgUsedVars[kCosThetaCS]) { - values[kCosThetaCS] = (t1.sign() > 0 ? zaxis_CS.Dot(v1_CM) : zaxis_CS.Dot(v2_CM)); - } + // polarization parameters + bool useHE = fgUsedVars[kCosThetaHE] || fgUsedVars[kPhiHE]; // helicity frame + bool useCS = fgUsedVars[kCosThetaCS] || fgUsedVars[kPhiCS]; // Collins-Soper frame + bool usePP = fgUsedVars[kCosThetaPP]; // production plane frame + bool useRM = fgUsedVars[kCosThetaRM]; // Random frame + + if (useHE || useCS || usePP || useRM) { + // TO DO: get the correct values from CCDB + double BeamMomentum = TMath::Sqrt(fgCenterOfMassEnergy * fgCenterOfMassEnergy / 4 - fgMassofCollidingParticle * fgMassofCollidingParticle); // GeV + ROOT::Math::PxPyPzEVector Beam1(0., 0., -BeamMomentum, fgCenterOfMassEnergy / 2); + ROOT::Math::PxPyPzEVector Beam2(0., 0., BeamMomentum, fgCenterOfMassEnergy / 2); + + ROOT::Math::Boost boostv12{v12.BoostToCM()}; + ROOT::Math::XYZVectorF v1_CM{(boostv12(v1).Vect()).Unit()}; + ROOT::Math::XYZVectorF v2_CM{(boostv12(v2).Vect()).Unit()}; + ROOT::Math::XYZVectorF Beam1_CM{(boostv12(Beam1).Vect()).Unit()}; + ROOT::Math::XYZVectorF Beam2_CM{(boostv12(Beam2).Vect()).Unit()}; + + // using positive sign convention for the first track + ROOT::Math::XYZVectorF v_CM = (t1.sign() > 0 ? v1_CM : v2_CM); + + if (useHE) { + ROOT::Math::XYZVectorF zaxis_HE{(v12.Vect()).Unit()}; + ROOT::Math::XYZVectorF yaxis_HE{(Beam1_CM.Cross(Beam2_CM)).Unit()}; + ROOT::Math::XYZVectorF xaxis_HE{(yaxis_HE.Cross(zaxis_HE)).Unit()}; + if (fgUsedVars[kCosThetaHE]) + values[kCosThetaHE] = zaxis_HE.Dot(v_CM); + if (fgUsedVars[kPhiHE]) { + values[kPhiHE] = TMath::ATan2(yaxis_HE.Dot(v_CM), xaxis_HE.Dot(v_CM)); + if (values[kPhiHE] < 0) { + values[kPhiHE] += 2 * TMath::Pi(); // ensure phi is in [0, 2pi] + } + } + if (fgUsedVars[kPhiTildeHE]) { + if (fgUsedVars[kCosThetaHE] && fgUsedVars[kPhiHE]) { + if (values[kCosThetaHE] > 0) { + values[kPhiTildeHE] = values[kPhiHE] - 0.25 * TMath::Pi(); // phi_tilde = phi - pi/4 + if (values[kPhiTildeHE] < 0) { + values[kPhiTildeHE] += 2 * TMath::Pi(); // ensure phi_tilde is in [0, 2pi] + } + } else { + values[kPhiTildeHE] = values[kPhiHE] - 0.75 * TMath::Pi(); // phi_tilde = phi - 3pi/4 + if (values[kPhiTildeHE] < 0) { + values[kPhiTildeHE] += 2 * TMath::Pi(); // ensure phi_tilde is in [0, 2pi] + } + } + } else { + values[kPhiTildeHE] = -999; // not computable + } + } + } - if (fgUsedVars[kPhiCS]) { - values[kPhiCS] = (t1.sign() > 0 ? TMath::ATan2(yaxis_CS.Dot(v1_CM), xaxis_CS.Dot(v1_CM)) : TMath::ATan2(yaxis_CS.Dot(v2_CM), xaxis_CS.Dot(v2_CM))); - } + if (useCS) { + ROOT::Math::XYZVectorF zaxis_CS{(Beam1_CM - Beam2_CM).Unit()}; + ROOT::Math::XYZVectorF yaxis_CS{(Beam1_CM.Cross(Beam2_CM)).Unit()}; + ROOT::Math::XYZVectorF xaxis_CS{(yaxis_CS.Cross(zaxis_CS)).Unit()}; + if (fgUsedVars[kCosThetaCS]) + values[kCosThetaCS] = zaxis_CS.Dot(v_CM); + if (fgUsedVars[kPhiCS]) { + values[kPhiCS] = TMath::ATan2(yaxis_CS.Dot(v_CM), xaxis_CS.Dot(v_CM)); + if (values[kPhiCS] < 0) { + values[kPhiCS] += 2 * TMath::Pi(); // ensure phi is in [0, 2pi] + } + } + if (fgUsedVars[kPhiTildeCS]) { + if (fgUsedVars[kCosThetaCS] && fgUsedVars[kPhiCS]) { + if (values[kCosThetaCS] > 0) { + values[kPhiTildeCS] = values[kPhiCS] - 0.25 * TMath::Pi(); // phi_tilde = phi - pi/4 + if (values[kPhiTildeCS] < 0) { + values[kPhiTildeCS] += 2 * TMath::Pi(); // ensure phi_tilde is in [0, 2pi] + } + } else { + values[kPhiTildeCS] = values[kPhiCS] - 0.75 * TMath::Pi(); // phi_tilde = phi - 3pi/4 + if (values[kPhiTildeCS] < 0) { + values[kPhiTildeCS] += 2 * TMath::Pi(); // ensure phi_tilde is in [0, 2pi] + } + } + } else { + values[kPhiTildeCS] = -999; // not computable + } + } + } - if (fgUsedVars[kCosThetaPP]) { - values[kCosThetaPP] = (t1.sign() > 0 ? normalVec.Dot(v1_CM) : normalVec.Dot(v2_CM)); - } + if (usePP) { + ROOT::Math::XYZVector zaxis_PP = ROOT::Math::XYZVector(v12.Py(), -v12.Px(), 0.f); + ROOT::Math::XYZVector yaxis_PP{(v12.Vect()).Unit()}; + ROOT::Math::XYZVector xaxis_PP{(yaxis_PP.Cross(zaxis_PP)).Unit()}; + if (fgUsedVars[kCosThetaPP]) { + values[kCosThetaPP] = zaxis_PP.Dot(v_CM); + } + if (fgUsedVars[kPhiPP]) { + values[kPhiPP] = TMath::ATan2(yaxis_PP.Dot(v_CM), xaxis_PP.Dot(v_CM)); + if (values[kPhiPP] < 0) { + values[kPhiPP] += 2 * TMath::Pi(); // ensure phi is in [0, 2pi] + } + } + if (fgUsedVars[kPhiTildePP]) { + if (fgUsedVars[kCosThetaPP] && fgUsedVars[kPhiPP]) { + if (values[kCosThetaPP] > 0) { + values[kPhiTildePP] = values[kPhiPP] - 0.25 * TMath::Pi(); // phi_tilde = phi - pi/4 + if (values[kPhiTildePP] < 0) { + values[kPhiTildePP] += 2 * TMath::Pi(); // ensure phi_tilde is in [0, 2pi] + } + } else { + values[kPhiTildePP] = values[kPhiPP] - 0.75 * TMath::Pi(); // phi_tilde = phi - 3pi/4 + if (values[kPhiTildePP] < 0) { + values[kPhiTildePP] += 2 * TMath::Pi(); // ensure phi_tilde is in [0, 2pi] + } + } + } else { + values[kPhiTildePP] = -999; // not computable + } + } + } - if (fgUsedVars[kPhiPP]) { - values[kPhiPP] = (t1.sign() > 0 ? TMath::ATan2((normalVec.Dot(v1_CM)), zaxis_HE.Dot(v1_CM)) : TMath::ATan2((normalVec.Dot(v2_CM)), zaxis_HE.Dot(v2_CM))); + if (useRM) { + double randomCostheta = gRandom->Uniform(-1., 1.); + double randomPhi = gRandom->Uniform(0., 2. * TMath::Pi()); + ROOT::Math::XYZVectorF zaxis_RM(randomCostheta, std::sqrt(1 - randomCostheta * randomCostheta) * std::cos(randomPhi), std::sqrt(1 - randomCostheta * randomCostheta) * std::sin(randomPhi)); + if (fgUsedVars[kCosThetaRM]) + values[kCosThetaRM] = zaxis_RM.Dot(v_CM); + } } if constexpr ((pairType == kDecayToEE) && ((fillMap & TrackCov) > 0 || (fillMap & ReducedTrackBarrelCov) > 0)) { @@ -3253,38 +3336,129 @@ void VarManager::FillPairMC(T1 const& t1, T2 const& t2, float* values) values[kMCEta] = v12.Eta(); values[kMCPhi] = v12.Phi(); values[kMCY] = -v12.Rapidity(); - double BeamMomentum = TMath::Sqrt(fgCenterOfMassEnergy * fgCenterOfMassEnergy / 4 - fgMassofCollidingParticle * fgMassofCollidingParticle); // GeV - ROOT::Math::PxPyPzEVector Beam1(0., 0., -BeamMomentum, fgCenterOfMassEnergy / 2); - ROOT::Math::PxPyPzEVector Beam2(0., 0., BeamMomentum, fgCenterOfMassEnergy / 2); - - // Boost to center of mass frame - ROOT::Math::Boost boostv12{v12.BoostToCM()}; - ROOT::Math::XYZVectorF v1_CM{(boostv12(v1).Vect()).Unit()}; - ROOT::Math::XYZVectorF v2_CM{(boostv12(v2).Vect()).Unit()}; - ROOT::Math::XYZVectorF Beam1_CM{(boostv12(Beam1).Vect()).Unit()}; - ROOT::Math::XYZVectorF Beam2_CM{(boostv12(Beam2).Vect()).Unit()}; - - if (fgUsedVars[kMCCosThetaHE] || fgUsedVars[kMCPhiHE]) { - ROOT::Math::XYZVectorF zaxis_HE{(v12.Vect()).Unit()}; - ROOT::Math::XYZVectorF yaxis_HE{(Beam1_CM.Cross(Beam2_CM)).Unit()}; - ROOT::Math::XYZVectorF xaxis_HE{(yaxis_HE.Cross(zaxis_HE)).Unit()}; - values[kMCCosThetaHE] = (t1.pdgCode() < 0 ? zaxis_HE.Dot(v1_CM) : zaxis_HE.Dot(v2_CM)); - values[kMCPhiHE] = (t1.pdgCode() < 0 ? TMath::ATan2(yaxis_HE.Dot(v1_CM), xaxis_HE.Dot(v1_CM)) : TMath::ATan2(yaxis_HE.Dot(v2_CM), xaxis_HE.Dot(v2_CM))); - } - - if (fgUsedVars[kMCCosThetaCS] || fgUsedVars[kMCPhiCS]) { - ROOT::Math::XYZVectorF zaxis_CS{((Beam1_CM.Unit() - Beam2_CM.Unit()).Unit())}; - ROOT::Math::XYZVectorF yaxis_CS{(Beam1_CM.Cross(Beam2_CM)).Unit()}; - ROOT::Math::XYZVectorF xaxis_CS{(yaxis_CS.Cross(zaxis_CS)).Unit()}; - values[kMCCosThetaCS] = (t1.pdgCode() < 0 ? zaxis_CS.Dot(v1_CM) : zaxis_CS.Dot(v2_CM)); - values[kMCPhiCS] = (t1.pdgCode() < 0 ? TMath::ATan2(yaxis_CS.Dot(v1_CM), xaxis_CS.Dot(v1_CM)) : TMath::ATan2(yaxis_CS.Dot(v2_CM), xaxis_CS.Dot(v2_CM))); - } - - if (fgUsedVars[kMCCosThetaPP] || fgUsedVars[kMCPhiPP]) { - ROOT::Math::XYZVectorF zaxis_HE{(v12.Vect()).Unit()}; - ROOT::Math::XYZVector normalVec = ROOT::Math::XYZVector(v12.Py(), -v12.Px(), 0.f); - values[kMCCosThetaPP] = (t1.pdgCode() < 0 ? normalVec.Dot(v1_CM) : normalVec.Dot(v2_CM)); - values[kMCPhiPP] = (t1.pdgCode() < 0 ? TMath::ATan2((normalVec.Dot(v1_CM)), zaxis_HE.Dot(v1_CM)) : TMath::ATan2((normalVec.Dot(v2_CM)), zaxis_HE.Dot(v2_CM))); + + // polarization parameters + bool useHE = fgUsedVars[kMCCosThetaHE] || fgUsedVars[kMCPhiHE]; // helicity frame + bool useCS = fgUsedVars[kMCCosThetaCS] || fgUsedVars[kMCPhiCS]; // Collins-Soper frame + bool usePP = fgUsedVars[kMCCosThetaPP]; // production plane frame + bool useRM = fgUsedVars[kMCCosThetaRM]; // Random frame + + if (useHE || useCS || usePP || useRM) { + // TO DO: get the correct values from CCDB + double BeamMomentum = TMath::Sqrt(fgCenterOfMassEnergy * fgCenterOfMassEnergy / 4 - fgMassofCollidingParticle * fgMassofCollidingParticle); // GeV + ROOT::Math::PxPyPzEVector Beam1(0., 0., -BeamMomentum, fgCenterOfMassEnergy / 2); + ROOT::Math::PxPyPzEVector Beam2(0., 0., BeamMomentum, fgCenterOfMassEnergy / 2); + + ROOT::Math::Boost boostv12{v12.BoostToCM()}; + ROOT::Math::XYZVectorF v1_CM{(boostv12(v1).Vect()).Unit()}; + ROOT::Math::XYZVectorF v2_CM{(boostv12(v2).Vect()).Unit()}; + ROOT::Math::XYZVectorF Beam1_CM{(boostv12(Beam1).Vect()).Unit()}; + ROOT::Math::XYZVectorF Beam2_CM{(boostv12(Beam2).Vect()).Unit()}; + + // using positive sign convention for the first track + ROOT::Math::XYZVectorF v_CM = (t1.pdgCode() > 0 ? v1_CM : v2_CM); + + if (useHE) { + ROOT::Math::XYZVectorF zaxis_HE{(v12.Vect()).Unit()}; + ROOT::Math::XYZVectorF yaxis_HE{(Beam1_CM.Cross(Beam2_CM)).Unit()}; + ROOT::Math::XYZVectorF xaxis_HE{(yaxis_HE.Cross(zaxis_HE)).Unit()}; + if (fgUsedVars[kMCCosThetaHE]) + values[kMCCosThetaHE] = zaxis_HE.Dot(v_CM); + if (fgUsedVars[kMCPhiHE]) { + values[kMCPhiHE] = TMath::ATan2(yaxis_HE.Dot(v_CM), xaxis_HE.Dot(v_CM)); + if (values[kMCPhiHE] < 0) { + values[kMCPhiHE] += 2 * TMath::Pi(); // ensure phi is in [0, 2pi] + } + } + if (fgUsedVars[kMCPhiTildeHE]) { + if (fgUsedVars[kMCCosThetaHE] && fgUsedVars[kMCPhiHE]) { + if (values[kMCCosThetaHE] > 0) { + values[kMCPhiTildeHE] = values[kMCPhiHE] - 0.25 * TMath::Pi(); // phi_tilde = phi - pi/4 + if (values[kMCPhiTildeHE] < 0) { + values[kMCPhiTildeHE] += 2 * TMath::Pi(); // ensure phi_tilde is in [0, 2pi] + } + } else { + values[kMCPhiTildeHE] = values[kMCPhiHE] - 0.75 * TMath::Pi(); // phi_tilde = phi - 3pi/4 + if (values[kMCPhiTildeHE] < 0) { + values[kMCPhiTildeHE] += 2 * TMath::Pi(); // ensure phi_tilde is in [0, 2pi] + } + } + } else { + values[kMCPhiTildeHE] = -999; // not computable + } + } + } + + if (useCS) { + ROOT::Math::XYZVectorF zaxis_CS{(Beam1_CM - Beam2_CM).Unit()}; + ROOT::Math::XYZVectorF yaxis_CS{(Beam1_CM.Cross(Beam2_CM)).Unit()}; + ROOT::Math::XYZVectorF xaxis_CS{(yaxis_CS.Cross(zaxis_CS)).Unit()}; + if (fgUsedVars[kMCCosThetaCS]) + values[kMCCosThetaCS] = zaxis_CS.Dot(v_CM); + if (fgUsedVars[kMCPhiCS]) { + values[kMCPhiCS] = TMath::ATan2(yaxis_CS.Dot(v_CM), xaxis_CS.Dot(v_CM)); + if (values[kMCPhiCS] < 0) { + values[kMCPhiCS] += 2 * TMath::Pi(); // ensure phi is in [0, 2pi] + } + } + if (fgUsedVars[kMCPhiTildeCS]) { + if (fgUsedVars[kMCCosThetaCS] && fgUsedVars[kMCPhiCS]) { + if (values[kMCCosThetaCS] > 0) { + values[kMCPhiTildeCS] = values[kMCPhiCS] - 0.25 * TMath::Pi(); // phi_tilde = phi - pi/4 + if (values[kMCPhiTildeCS] < 0) { + values[kMCPhiTildeCS] += 2 * TMath::Pi(); // ensure phi_tilde is in [0, 2pi] + } + } else { + values[kMCPhiTildeCS] = values[kMCPhiCS] - 0.75 * TMath::Pi(); // phi_tilde = phi - 3pi/4 + if (values[kMCPhiTildeCS] < 0) { + values[kMCPhiTildeCS] += 2 * TMath::Pi(); // ensure phi_tilde is in [0, 2pi] + } + } + } else { + values[kMCPhiTildeCS] = -999; // not computable + } + } + } + + if (usePP) { + ROOT::Math::XYZVector zaxis_PP = ROOT::Math::XYZVector(v12.Py(), -v12.Px(), 0.f); + ROOT::Math::XYZVector yaxis_PP{v12.Vect().Unit()}; + ROOT::Math::XYZVector xaxis_PP{(yaxis_PP.Cross(zaxis_PP)).Unit()}; + if (fgUsedVars[kMCCosThetaPP]) { + values[kMCCosThetaPP] = zaxis_PP.Dot(v_CM); + } + if (fgUsedVars[kMCPhiPP]) { + values[kMCPhiPP] = TMath::ATan2(yaxis_PP.Dot(v_CM), xaxis_PP.Dot(v_CM)); + if (values[kMCPhiPP] < 0) { + values[kMCPhiPP] += 2 * TMath::Pi(); // ensure phi is in [0, 2pi] + } + } + if (fgUsedVars[kMCPhiTildePP]) { + if (fgUsedVars[kMCCosThetaPP] && fgUsedVars[kMCPhiPP]) { + if (values[kMCCosThetaPP] > 0) { + values[kMCPhiTildePP] = values[kMCPhiPP] - 0.25 * TMath::Pi(); // phi_tilde = phi - pi/4 + if (values[kMCPhiTildePP] < 0) { + values[kMCPhiTildePP] += 2 * TMath::Pi(); // ensure phi_tilde is in [0, 2pi] + } + } else { + values[kMCPhiTildePP] = values[kMCPhiPP] - 0.75 * TMath::Pi(); // phi_tilde = phi - 3pi/4 + if (values[kMCPhiTildePP] < 0) { + values[kMCPhiTildePP] += 2 * TMath::Pi(); // ensure phi_tilde is in [0, 2pi] + } + } + } else { + values[kMCPhiTildePP] = -999; // not computable + } + } + } + + if (useRM) { + double randomCostheta = gRandom->Uniform(-1., 1.); + double randomPhi = gRandom->Uniform(0., 2. * TMath::Pi()); + ROOT::Math::XYZVectorF zaxis_RM(randomCostheta, std::sqrt(1 - randomCostheta * randomCostheta) * std::cos(randomPhi), std::sqrt(1 - randomCostheta * randomCostheta) * std::sin(randomPhi)); + if (fgUsedVars[kMCCosThetaRM]) + values[kMCCosThetaRM] = zaxis_RM.Dot(v_CM); + } } } From 366a27c5c006f6e31b7321ff2182e07484a182d7 Mon Sep 17 00:00:00 2001 From: Marvin Hemmer <53471402+mhemmer-cern@users.noreply.github.com> Date: Tue, 27 May 2025 16:22:21 +0200 Subject: [PATCH 1433/1650] =?UTF-8?q?[PWGJE,EMCAL-670]=20emcalCorrectionTa?= =?UTF-8?q?sk:=20remove=20std::optional=20function=20=E2=80=A6=20(#11303)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PWGJE/TableProducer/emcalCorrectionTask.cxx | 54 +++++++++++++-------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/PWGJE/TableProducer/emcalCorrectionTask.cxx b/PWGJE/TableProducer/emcalCorrectionTask.cxx index bf72e3275d6..4239a23e311 100644 --- a/PWGJE/TableProducer/emcalCorrectionTask.cxx +++ b/PWGJE/TableProducer/emcalCorrectionTask.cxx @@ -342,7 +342,7 @@ struct EmcalCorrectionTask { // Store the clusters in the table where a matching collision could // be identified. - fillClusterTable(col, vertexPos, iClusterizer, cellIndicesBC, indexMapPair, trackGlobalIndex); + fillClusterTable(col, vertexPos, iClusterizer, cellIndicesBC, &indexMapPair, &trackGlobalIndex); } else { mHistManager.fill(HIST("hBCMatchErrors"), 2); } @@ -470,7 +470,7 @@ struct EmcalCorrectionTask { // Store the clusters in the table where a matching collision could // be identified. - fillClusterTable(col, vertexPos, iClusterizer, cellIndicesBC, indexMapPair, trackGlobalIndex); + fillClusterTable(col, vertexPos, iClusterizer, cellIndicesBC, &indexMapPair, &trackGlobalIndex); } else { mHistManager.fill(HIST("hBCMatchErrors"), 2); } @@ -598,7 +598,7 @@ struct EmcalCorrectionTask { } PROCESS_SWITCH(EmcalCorrectionTask, processStandalone, "run stand alone analysis", false); - void cellsToCluster(size_t iClusterizer, const gsl::span cellsBC, std::optional> cellLabels = std::nullopt) + void cellsToCluster(size_t iClusterizer, const gsl::span cellsBC, gsl::span cellLabels = {}) { mClusterizers.at(iClusterizer)->findClusters(cellsBC); @@ -614,10 +614,10 @@ struct EmcalCorrectionTask { mClusterFactories.reset(); // in preparation for future O2 changes // mClusterFactories.setClusterizerSettings(mClusterDefinitions.at(iClusterizer).minCellEnergy, mClusterDefinitions.at(iClusterizer).timeMin, mClusterDefinitions.at(iClusterizer).timeMax, mClusterDefinitions.at(iClusterizer).recalcShowerShape5x5); - if (cellLabels) { - mClusterFactories.setContainer(*emcalClusters, cellsBC, *emcalClustersInputIndices, cellLabels); - } else { + if (cellLabels.empty()) { mClusterFactories.setContainer(*emcalClusters, cellsBC, *emcalClustersInputIndices); + } else { + mClusterFactories.setContainer(*emcalClusters, cellsBC, *emcalClustersInputIndices, cellLabels); } LOG(debug) << "Cluster factory set up."; @@ -634,24 +634,33 @@ struct EmcalCorrectionTask { } template - void fillClusterTable(Collision const& col, math_utils::Point3D const& vertexPos, size_t iClusterizer, const gsl::span cellIndicesBC, std::optional>, std::vector>>> const& indexMapPair = std::nullopt, std::optional> const& trackGlobalIndex = std::nullopt) + void fillClusterTable(Collision const& col, math_utils::Point3D const& vertexPos, size_t iClusterizer, const gsl::span cellIndicesBC, const std::tuple>, std::vector>>* indexMapPair = nullptr, const std::vector* trackGlobalIndex = nullptr) { + // average number of cells per cluster, only used the reseve a reasonable amount for the clustercells table + const size_t NAvgNcells = 3; // we found a collision, put the clusters into the none ambiguous table clusters.reserve(mAnalysisClusters.size()); - if (mClusterLabels.size() > 0) { + if (!mClusterLabels.empty()) { mcclusters.reserve(mClusterLabels.size()); } + clustercells.reserve(mAnalysisClusters.size() * NAvgNcells); + + // get the clusterType once + const auto clusterType = static_cast(mClusterDefinitions[iClusterizer]); + int cellindex = -1; unsigned int iCluster = 0; + float energy = 0.f; for (const auto& cluster : mAnalysisClusters) { + energy = cluster.E(); // Determine the cluster eta, phi, correcting for the vertex position. auto pos = cluster.getGlobalPosition(); pos = pos - vertexPos; // Normalize the vector and rescale by energy. - pos *= (cluster.E() / std::sqrt(pos.Mag2())); + pos *= (energy / std::sqrt(pos.Mag2())); // Correct for nonlinear behaviour - float nonlinCorrEnergy = cluster.E(); + float nonlinCorrEnergy = energy; if (!disableNonLin) { try { nonlinCorrEnergy = mNonlinearityHandler.getCorrectedClusterEnergy(cluster); @@ -662,19 +671,18 @@ struct EmcalCorrectionTask { // save to table LOG(debug) << "Writing cluster definition " - << static_cast(mClusterDefinitions.at(iClusterizer)) + << clusterType << " to table."; mHistManager.fill(HIST("hClusterType"), 1); - clusters(col, cluster.getID(), nonlinCorrEnergy, cluster.getCoreEnergy(), cluster.E(), + clusters(col, cluster.getID(), nonlinCorrEnergy, cluster.getCoreEnergy(), energy, pos.Eta(), TVector2::Phi_0_2pi(pos.Phi()), cluster.getM02(), cluster.getM20(), cluster.getNCells(), cluster.getClusterTime(), cluster.getIsExotic(), cluster.getDistanceToBadChannel(), cluster.getNExMax(), - static_cast(mClusterDefinitions.at(iClusterizer))); - if (mClusterLabels.size() > 0) { + clusterType); + if (!mClusterLabels.empty()) { mcclusters(mClusterLabels[iCluster].getLabels(), mClusterLabels[iCluster].getEnergyFractions()); } - clustercells.reserve(cluster.getNCells()); // loop over cells in cluster and save to table for (int ncell = 0; ncell < cluster.getNCells(); ncell++) { cellindex = cluster.getCellIndex(ncell); @@ -682,7 +690,7 @@ struct EmcalCorrectionTask { clustercells(clusters.lastIndex(), cellIndicesBC[cellindex]); } // end of cells of cluser loop // fill histograms - mHistManager.fill(HIST("hClusterE"), cluster.E()); + mHistManager.fill(HIST("hClusterE"), energy); mHistManager.fill(HIST("hClusterNLM"), cluster.getNExMax()); mHistManager.fill(HIST("hClusterTime"), cluster.getClusterTime()); mHistManager.fill(HIST("hClusterEtaPhi"), pos.Eta(), TVector2::Phi_0_2pi(pos.Phi())); @@ -701,20 +709,25 @@ struct EmcalCorrectionTask { template void fillAmbigousClusterTable(BC const& bc, size_t iClusterizer, const gsl::span cellIndicesBC, bool hasCollision) { + // average number of cells per cluster, only used the reseve a reasonable amount for the clustercells table + const size_t NAvgNcells = 3; int cellindex = -1; clustersAmbiguous.reserve(mAnalysisClusters.size()); if (mClusterLabels.size() > 0) { mcclustersAmbiguous.reserve(mClusterLabels.size()); } + clustercellsambiguous.reserve(mAnalysisClusters.size() * NAvgNcells); unsigned int iCluster = 0; + float energy = 0.f; for (const auto& cluster : mAnalysisClusters) { + energy = cluster.E(); auto pos = cluster.getGlobalPosition(); pos = pos - math_utils::Point3D{0., 0., 0.}; // Normalize the vector and rescale by energy. - pos *= (cluster.E() / std::sqrt(pos.Mag2())); + pos *= (energy / std::sqrt(pos.Mag2())); // Correct for nonlinear behaviour - float nonlinCorrEnergy = cluster.E(); + float nonlinCorrEnergy = energy; try { nonlinCorrEnergy = mNonlinearityHandler.getCorrectedClusterEnergy(cluster); } catch (o2::emcal::NonlinearityHandler::UninitException& e) { @@ -723,14 +736,14 @@ struct EmcalCorrectionTask { // We have our necessary properties. Now we store outputs - // LOG(debug) << "Cluster E: " << cluster.E(); + // LOG(debug) << "Cluster E: " << energy; if (!hasCollision) { mHistManager.fill(HIST("hClusterType"), 0); } else { mHistManager.fill(HIST("hClusterType"), 2); } clustersAmbiguous( - bc, cluster.getID(), nonlinCorrEnergy, cluster.getCoreEnergy(), cluster.E(), + bc, cluster.getID(), nonlinCorrEnergy, cluster.getCoreEnergy(), energy, pos.Eta(), TVector2::Phi_0_2pi(pos.Phi()), cluster.getM02(), cluster.getM20(), cluster.getNCells(), cluster.getClusterTime(), cluster.getIsExotic(), cluster.getDistanceToBadChannel(), @@ -738,7 +751,6 @@ struct EmcalCorrectionTask { if (mClusterLabels.size() > 0) { mcclustersAmbiguous(mClusterLabels[iCluster].getLabels(), mClusterLabels[iCluster].getEnergyFractions()); } - clustercellsambiguous.reserve(cluster.getNCells()); for (int ncell = 0; ncell < cluster.getNCells(); ncell++) { cellindex = cluster.getCellIndex(ncell); clustercellsambiguous(clustersAmbiguous.lastIndex(), From b327db429799a73595facf6d4d5359b869b435a5 Mon Sep 17 00:00:00 2001 From: Florian Jonas Date: Tue, 27 May 2025 16:24:26 +0200 Subject: [PATCH 1434/1650] [PWGJE] additional EMCal time calibration (fix) (#11325) Co-authored-by: ALICE Action Bot --- PWGJE/TableProducer/emcalCorrectionTask.cxx | 43 +++++++++++++++++++-- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/PWGJE/TableProducer/emcalCorrectionTask.cxx b/PWGJE/TableProducer/emcalCorrectionTask.cxx index 4239a23e311..c2389d10b02 100644 --- a/PWGJE/TableProducer/emcalCorrectionTask.cxx +++ b/PWGJE/TableProducer/emcalCorrectionTask.cxx @@ -126,6 +126,11 @@ struct EmcalCorrectionTask { // EMCal geometry o2::emcal::Geometry* geometry; + std::vector> mExtraTimeShiftRunRanges; + + // Current run number + int runNumber{0}; + void init(InitContext const&) { LOG(debug) << "Start init!"; @@ -250,6 +255,16 @@ struct EmcalCorrectionTask { mHistManager.add("hContributors", "hContributors;contributor per cell hit;#it{counts}", O2HistType::kTH1I, {{20, 0, 20}}); mHistManager.add("hMCParticleEnergy", "hMCParticleEnergy;#it{E} (GeV/#it{c});#it{counts}", O2HistType::kTH1F, {energyAxis}); } + + // For some runs, LG cells require an extra time shift of 2 * 8.8ns due to problems in the time calibration + // Affected run ranges (inclusive) are initialised here (min,max) + mExtraTimeShiftRunRanges.emplace_back(535365, 535645); // LHC23g-LHC23h + mExtraTimeShiftRunRanges.emplace_back(535725, 536126); // LHC23h-LHC23l + mExtraTimeShiftRunRanges.emplace_back(536199, 536202); // LHC23l-LHC23m + mExtraTimeShiftRunRanges.emplace_back(536239, 536346); // LHC23m-LHC23n + mExtraTimeShiftRunRanges.emplace_back(536565, 536590); // Commisioning-LHC23r + mExtraTimeShiftRunRanges.emplace_back(542280, 543854); // LHC23zv-LHC23zy + mExtraTimeShiftRunRanges.emplace_back(559544, 559856); // PbPb 2024 } // void process(aod::Collision const& collision, soa::Filtered const& fullTracks, aod::Calos const& cells) @@ -268,6 +283,10 @@ struct EmcalCorrectionTask { std::unordered_map numberCellsInBC; // Number of cells mapped to the global BC index of all BCs to check whether EMCal was readout for (const auto& bc : bcs) { LOG(debug) << "Next BC"; + + // get run number + runNumber = bc.runNumber(); + // Convert aod::Calo to o2::emcal::Cell which can be used with the clusterizer. // In particular, we need to filter only EMCAL cells. @@ -297,7 +316,7 @@ struct EmcalCorrectionTask { } cellsBC.emplace_back(cell.cellNumber(), amplitude, - cell.time() + getCellTimeShift(cell.cellNumber(), amplitude, o2::emcal::intToChannelType(cell.cellType())), + cell.time() + getCellTimeShift(cell.cellNumber(), amplitude, o2::emcal::intToChannelType(cell.cellType()), runNumber), o2::emcal::intToChannelType(cell.cellType())); cellIndicesBC.emplace_back(cell.globalIndex()); } @@ -396,6 +415,9 @@ struct EmcalCorrectionTask { // Convert aod::Calo to o2::emcal::Cell which can be used with the clusterizer. // In particular, we need to filter only EMCAL cells. + // get run number + runNumber = bc.runNumber(); + // Get the collisions matched to the BC using foundBCId of the collision auto collisionsInFoundBC = collisions.sliceBy(collisionsPerFoundBC, bc.globalIndex()); auto cellsInBC = cells.sliceBy(mcCellsPerFoundBC, bc.globalIndex()); @@ -425,7 +447,7 @@ struct EmcalCorrectionTask { } cellsBC.emplace_back(cell.cellNumber(), amplitude, - cell.time() + getCellTimeShift(cell.cellNumber(), amplitude, o2::emcal::intToChannelType(cell.cellType())), + cell.time() + getCellTimeShift(cell.cellNumber(), amplitude, o2::emcal::intToChannelType(cell.cellType()), runNumber), o2::emcal::intToChannelType(cell.cellType())); cellIndicesBC.emplace_back(cell.globalIndex()); cellLabels.emplace_back(cell.mcParticleIds(), cell.amplitudeA()); @@ -514,6 +536,7 @@ struct EmcalCorrectionTask { int previousCollisionId = 0; // Collision ID of the last unique BC. Needed to skip unordered collisions to ensure ordered collisionIds in the cluster table int nBCsProcessed = 0; int nCellsProcessed = 0; + for (const auto& bc : bcs) { LOG(debug) << "Next BC"; // Convert aod::Calo to o2::emcal::Cell which can be used with the clusterizer. @@ -521,6 +544,10 @@ struct EmcalCorrectionTask { // Get the collisions matched to the BC using global bc index of the collision // since we do not have event selection available here! + + // get run number + runNumber = bc.runNumber(); + auto collisionsInBC = collisions.sliceBy(collisionsPerBC, bc.globalIndex()); auto cellsInBC = cells.sliceBy(cellsPerFoundBC, bc.globalIndex()); @@ -536,7 +563,7 @@ struct EmcalCorrectionTask { for (const auto& cell : cellsInBC) { cellsBC.emplace_back(cell.cellNumber(), cell.amplitude(), - cell.time() + getCellTimeShift(cell.cellNumber(), cell.amplitude(), o2::emcal::intToChannelType(cell.cellType())), + cell.time() + getCellTimeShift(cell.cellNumber(), cell.amplitude(), o2::emcal::intToChannelType(cell.cellType()), runNumber), o2::emcal::intToChannelType(cell.cellType())); cellIndicesBC.emplace_back(cell.globalIndex()); } @@ -885,7 +912,7 @@ struct EmcalCorrectionTask { // Apply shift of the cell time in data and MC // In MC this has to be done to shift the cell time, which is not calibrated to 0 due to the flight time of the particles to the EMCal surface (~15ns) // In data this is done to correct for the time walk effect - float getCellTimeShift(const int16_t cellID, const float cellEnergy, const emcal::ChannelType_t cellType) + float getCellTimeShift(const int16_t cellID, const float cellEnergy, const emcal::ChannelType_t cellType, const int runNumber) { if (!applyCellTimeCorrection) { return 0.f; @@ -921,6 +948,14 @@ struct EmcalCorrectionTask { else // Very high energy regime timeshift = 1.9; // Parameters extracted from LHC24aj (pp), but also usable for other periods } + // Temporary extra shift for bug in time calibraiton of apass4 Pb-Pb 2024, requires pos shift of 2*8.8 ns for low gain cells + if (cellType == emcal::ChannelType_t::LOW_GAIN) { + for (const auto& range : mExtraTimeShiftRunRanges) { + if (runNumber >= range.first && runNumber <= range.second) { + timeshift += 2 * 8.8; + } + } + } LOG(debug) << "Shift the cell time by " << timeshift << " + " << timesmear << " ns"; } return timeshift + timesmear; From 42ec5a79276141bfcedaf4721bf30ebdd080bc15 Mon Sep 17 00:00:00 2001 From: altsybee Date: Tue, 27 May 2025 17:07:12 +0200 Subject: [PATCH 1435/1650] [Common] configurable to set NumberOfOrbitsPerTF manually (e.g. for MC PbPb) (#11378) --- Common/TableProducer/eventSelection.cxx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Common/TableProducer/eventSelection.cxx b/Common/TableProducer/eventSelection.cxx index c0d5fc2bb37..e2aa27f6efe 100644 --- a/Common/TableProducer/eventSelection.cxx +++ b/Common/TableProducer/eventSelection.cxx @@ -69,6 +69,7 @@ struct BcSelectionTask { Configurable confTimeFrameEndBorderMargin{"TimeFrameEndBorderMargin", -1, "Number of bcs to cut at the end of the Time Frame. Take from CCDB if -1"}; // o2-linter: disable=name/configurable (temporary fix) Configurable confCheckRunDurationLimits{"checkRunDurationLimits", false, "Check if the BCs are within the run duration limits"}; // o2-linter: disable=name/configurable (temporary fix) Configurable> maxInactiveChipsPerLayer{"maxInactiveChipsPerLayer", {8, 8, 8, 111, 111, 195, 195}, "Maximum allowed number of inactive ITS chips per layer"}; + Configurable confNumberOfOrbitsPerTF{"NumberOfOrbitsPerTF", -1, "Number of orbits per Time Frame. Take from CCDB if -1"}; // o2-linter: disable=name/configurable (temporary fix) int lastRun = -1; int64_t lastTF = -1; @@ -271,7 +272,7 @@ struct BcSelectionTask { // first bc of the first orbit bcSOR = runInfo.orbitSOR * nBCsPerOrbit; // duration of TF in bcs - nBCsPerTF = runInfo.orbitsPerTF * nBCsPerOrbit; + nBCsPerTF = confNumberOfOrbitsPerTF < 0 ? runInfo.orbitsPerTF * nBCsPerOrbit : confNumberOfOrbitsPerTF * nBCsPerOrbit; } // timestamp of the middle of the run used to access run-wise CCDB entries @@ -506,6 +507,7 @@ struct EventSelectionTask { Configurable confFT0CamplCutVetoOnCollInROF{"FT0CamplPerCollCutVetoOnCollInROF", 5000, "Max allowed FT0C amplitude for each nearby collision inside this ITS ROF"}; // o2-linter: disable=name/configurable (temporary fix) Configurable confEpsilonVzDiffVetoInROF{"EpsilonVzDiffVetoInROF", 0.3, "Minumum distance to nearby collisions along z inside this ITS ROF, cm"}; // o2-linter: disable=name/configurable (temporary fix) Configurable confUseWeightsForOccupancyVariable{"UseWeightsForOccupancyEstimator", 1, "Use or not the delta-time weights for the occupancy estimator"}; // o2-linter: disable=name/configurable (temporary fix) + Configurable confNumberOfOrbitsPerTF{"NumberOfOrbitsPerTF", -1, "Number of orbits per Time Frame. Take from CCDB if -1"}; // o2-linter: disable=name/configurable (temporary fix) Partition tracklets = (aod::track::trackType == static_cast(o2::aod::track::TrackTypeEnum::Run2Tracklet)); @@ -697,7 +699,7 @@ struct EventSelectionTask { // first bc of the first orbit bcSOR = runInfo.orbitSOR * nBCsPerOrbit; // duration of TF in bcs - nBCsPerTF = runInfo.orbitsPerTF * nBCsPerOrbit; + nBCsPerTF = confNumberOfOrbitsPerTF < 0 ? runInfo.orbitsPerTF * nBCsPerOrbit : confNumberOfOrbitsPerTF * nBCsPerOrbit; // colliding bc pattern int64_t ts = bcs.iteratorAt(0).timestamp(); auto grplhcif = ccdb->getForTimeStamp("GLO/Config/GRPLHCIF", ts); From 8664a053cc49271cc7adc0e04ba432da9e00481d Mon Sep 17 00:00:00 2001 From: Md Samsul Islam <56156956+mislam17@users.noreply.github.com> Date: Tue, 27 May 2025 23:01:38 +0530 Subject: [PATCH 1436/1650] [PWGHF] addition of task: single muon as a function of multiplicity (#10435) --- PWGHF/HFL/Tasks/CMakeLists.txt | 5 + PWGHF/HFL/Tasks/taskSingleMuonMult.cxx | 265 +++++++++++++++++++++++++ 2 files changed, 270 insertions(+) create mode 100644 PWGHF/HFL/Tasks/taskSingleMuonMult.cxx diff --git a/PWGHF/HFL/Tasks/CMakeLists.txt b/PWGHF/HFL/Tasks/CMakeLists.txt index 275bd761534..7c87297ca23 100644 --- a/PWGHF/HFL/Tasks/CMakeLists.txt +++ b/PWGHF/HFL/Tasks/CMakeLists.txt @@ -24,6 +24,11 @@ o2physics_add_dpl_workflow(task-single-muon PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(task-single-muon-mult + SOURCES taskSingleMuonMult.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(task-single-muon-reader SOURCES taskSingleMuonReader.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::PWGDQCore diff --git a/PWGHF/HFL/Tasks/taskSingleMuonMult.cxx b/PWGHF/HFL/Tasks/taskSingleMuonMult.cxx new file mode 100644 index 00000000000..48cc13b74c4 --- /dev/null +++ b/PWGHF/HFL/Tasks/taskSingleMuonMult.cxx @@ -0,0 +1,265 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file taskSingleMuonMult.cxx +/// \brief Task used to study the Open heavy flavour decay muon production as a function of multiplicity. +/// \author Md Samsul Islam , IITB + +#include + +#include "CommonConstants/MathConstants.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/runDataProcessing.h" +#include "ReconstructionDataFormats/TrackFwd.h" + +#include "Common/Core/TrackSelection.h" +#include "Common/Core/trackUtilities.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/TrackSelectionTables.h" + +using namespace o2; +using namespace o2::aod; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::aod::fwdtrack; + +struct HfTaskSingleMuonMult { + + // enum for event selection bins + enum EventSelection { + AllEvents = 0, + Sel8, + VtxZAfterSel, + NEventSelection + }; + + // enum for muon track selection bins + enum MuonSelection { + NoCut = 0, + EtaCut, + RAbsorbCut, + PDcaCut, + Chi2Cut, + NMuonSelection + }; + + Configurable zVtxMax{"zVtxMax", 10., "maxium z of primary vertex [cm]"}; + Configurable ptTrackMin{"ptTrackMin", 0.15, "minimum pt of tracks"}; + Configurable etaTrackMax{"etaTrackMax", 0.8, "maximum pseudorapidity of tracks"}; + Configurable etaMin{"etaMin", -3.6, "minimum pseudorapidity"}; + Configurable etaMax{"etaMax", -2.5, "maximum pseudorapidity"}; + Configurable pDcaMin{"pDcaMin", 324., "p*DCA value for small RAbsorb"}; + Configurable pDcaMax{"pDcaMax", 594., "p*DCA value for large RAbsorb"}; + Configurable rAbsorbMin{"rAbsorbMin", 17.6, "R at absorber end minimum value"}; + Configurable rAbsorbMax{"rAbsorbMax", 89.5, "R at absorber end maximum value"}; + Configurable rAbsorbMid{"rAbsorbMid", 26.5, "R at absorber end split point for different p*DCA selections"}; + Configurable reduceOrphMft{"reduceOrphMft", true, "reduce orphan MFT tracks"}; + + using MyCollisions = soa::Join; + using MyMuons = soa::Join; + using MyMcMuons = soa::Join; + using MyTracks = soa::Filtered>; + + // Filter Global Track for Multiplicty + Filter trackFilter = ((nabs(aod::track::eta) < etaTrackMax) && (aod::track::pt > ptTrackMin)); + + // Number the types of muon tracks + static constexpr uint8_t NTrackTypes{ForwardTrackTypeEnum::MCHStandaloneTrack + 1}; + + HistogramRegistry registry{"registry"}; + + void init(InitContext&) + { + AxisSpec axisCent = {101, -0.5, 100.5, "centrality"}; + AxisSpec axisEvent{NEventSelection, 0, NEventSelection, "Event Selection"}; + AxisSpec axisVtxZ{80, -20., 20., "#it{z}_{vtx} (cm)"}; + AxisSpec axisMuon{NMuonSelection, 0, NMuonSelection, "Muon Selection"}; + AxisSpec axisNCh{500, 0.5, 500.5, "#it{N}_{ch}"}; + AxisSpec axisNMu{20, -0.5, 19.5, "#it{N}_{#mu}"}; + AxisSpec axisPt{1000, 0., 500., "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec axisEta{250, -5., 5., "#it{#eta}"}; + AxisSpec axisTheta{500, 170., 180., "#it{#theta}"}; + AxisSpec axisRAbsorb{1000, 0., 100., "#it{R}_{Absorb} (cm)"}; + AxisSpec axisDCA{500, 0., 5., "#it{DCA}_{xy} (cm)"}; + AxisSpec axisChi2MatchMCHMFT{1000, 0., 1000., "MCH-MFT matching #chi^{2}"}; + AxisSpec axisSign{5, -2.5, 2.5, "Charge"}; + AxisSpec axisPDca{100000, 0, 100000, "#it{p} #times DCA (GeV/#it{c} * cm)"}; + AxisSpec axisDCAx{1000, -5., 5., "#it{DCA}_{x or y} (cm)"}; + AxisSpec axisEtaDif{200, -2., 2., "#it{#eta} diff"}; + AxisSpec axisDeltaPt{10000, -50, 50, "#Delta #it{p}_{T} (GeV/#it{c})"}; + AxisSpec axisTrackType{8, -1.5, 6.5, "TrackType"}; + AxisSpec axisPtDif{200, -2., 2., "#it{p}_{T} diff (GeV/#it{c})"}; + + registry.add("hCentrality", "Centrality Percentile", {HistType::kTH1F, {axisCent}}); + registry.add("hEventSel", " Number of Events", {HistType::kTH1F, {axisEvent}}); + registry.add("hNch", "Charged Particle Multiplicity", {HistType::kTH1F, {axisNCh}}); + registry.add("hVtxZBeforeSel", "Z-vertex distribution before zVtx Cut", {HistType::kTH1F, {axisVtxZ}}); + registry.add("hVtxZAfterSel", "Z-vertex distribution after zVtx Cut", {HistType::kTH1F, {axisVtxZ}}); + + registry.add("hMuonSel", "Selection of muon tracks at various kinematic cuts", {HistType::kTH1F, {axisMuon}}); + registry.add("hMuBeforeMatchMFT", "Muon information before any Kinemeatic cuts applied", {HistType::kTHnSparseF, {axisCent, axisNCh, axisPt, axisEta, axisTheta, axisRAbsorb, axisDCA, axisPDca, axisChi2MatchMCHMFT, axisTrackType}, 10}); + registry.add("hMuBeforeAccCuts", "Muon information before applying Acceptance cuts", {HistType::kTHnSparseF, {axisCent, axisNCh, axisPt, axisEta, axisTheta, axisRAbsorb, axisDCA, axisPDca, axisChi2MatchMCHMFT, axisTrackType}, 10}); + registry.add("h3DCABeforeAccCuts", "DCAx,DCAy,DCAz information before Acceptance cuts", {HistType::kTH3F, {axisDCAx, axisDCAx, axisTrackType}}); + registry.add("hMuDeltaPtBeforeAccCuts", "Muon information with DeltaPt before applying Acceptance cuts", {HistType::kTHnSparseF, {axisCent, axisNCh, axisPt, axisEta, axisTheta, axisRAbsorb, axisDCA, axisPDca, axisChi2MatchMCHMFT, axisDeltaPt}, 10}); + registry.add("hMuAfterEtaCuts", "Muon information after applying Eta cuts", {HistType::kTHnSparseF, {axisCent, axisNCh, axisPt, axisEta, axisTheta, axisRAbsorb, axisDCA, axisPDca, axisChi2MatchMCHMFT, axisTrackType}, 10}); + registry.add("hMuAfterRAbsorbCuts", "Muon information after applying RAbsorb cuts", {HistType::kTHnSparseF, {axisCent, axisNCh, axisPt, axisEta, axisTheta, axisRAbsorb, axisDCA, axisPDca, axisChi2MatchMCHMFT, axisTrackType}, 10}); + registry.add("hMuAfterPdcaCuts", "Muon information after applying Pdca cuts", {HistType::kTHnSparseF, {axisCent, axisNCh, axisPt, axisEta, axisTheta, axisRAbsorb, axisDCA, axisPDca, axisChi2MatchMCHMFT, axisTrackType}, 10}); + registry.add("hMuAfterAccCuts", "Muon information after applying all Kinematic cuts", {HistType::kTHnSparseF, {axisCent, axisNCh, axisPt, axisEta, axisTheta, axisRAbsorb, axisDCA, axisPDca, axisChi2MatchMCHMFT, axisTrackType}, 10}); + registry.add("h3DCAAfterAccCuts", "DCAx,DCAy,DCAz information after Acceptance cuts", {HistType::kTH3F, {axisDCAx, axisDCAx, axisTrackType}}); + registry.add("hMuDeltaPtAfterAccCuts", "Muon information with DeltaPt after applying Acceptance cuts", {HistType::kTHnSparseF, {axisCent, axisNCh, axisPt, axisEta, axisTheta, axisRAbsorb, axisDCA, axisPDca, axisChi2MatchMCHMFT, axisDeltaPt}, 10}); + + registry.add("hTHnTrk", "Muon information with multiplicity", {HistType::kTHnSparseF, {axisCent, axisNCh, axisPt, axisEta, axisSign}, 5}); + registry.add("h3MultNchNmu", "Number of muons and multiplicity", {HistType::kTH3F, {axisCent, axisNCh, axisNMu}}); + registry.add("hMultNchNmuTrackType", "Number of muons with different types and multiplicity", {HistType::kTHnSparseF, {axisCent, axisNCh, axisNMu, axisTrackType}, 4}); + + auto hEvstat = registry.get(HIST("hEventSel")); + auto* xEv = hEvstat->GetXaxis(); + xEv->SetBinLabel(AllEvents + 1, "All events"); + xEv->SetBinLabel(Sel8 + 1, "sel8"); + xEv->SetBinLabel(VtxZAfterSel + 1, "VtxZAfterSel"); + + auto hMustat = registry.get(HIST("hMuonSel")); + auto* xMu = hMustat->GetXaxis(); + xMu->SetBinLabel(NoCut + 1, "noCut"); + xMu->SetBinLabel(EtaCut + 1, "etaCut"); + xMu->SetBinLabel(RAbsorbCut + 1, "RAbsorbCut"); + xMu->SetBinLabel(PDcaCut + 1, "pDcaCut"); + xMu->SetBinLabel(Chi2Cut + 1, "chi2Cut"); + } + + void process(MyCollisions::iterator const& collision, + MyTracks const& tracks, + MyMuons const& muons) + { + registry.fill(HIST("hEventSel"), AllEvents); + + if (!collision.sel8()) { + return; + } + registry.fill(HIST("hEventSel"), Sel8); + registry.fill(HIST("hVtxZBeforeSel"), collision.posZ()); + + if (std::abs(collision.posZ()) > zVtxMax) { + return; + } + registry.fill(HIST("hEventSel"), VtxZAfterSel); + registry.fill(HIST("hVtxZAfterSel"), collision.posZ()); + + // T0M centrality + const auto cent = collision.centFT0M(); + registry.fill(HIST("hCentrality"), cent); + + // Charged particles + for (const auto& track : tracks) { + if (!track.isGlobalTrack()) { + continue; + } + } + + auto nCh{tracks.size()}; + if (nCh < 1) { + return; + } + registry.fill(HIST("hNch"), nCh); + + for (const auto& track : tracks) { + registry.fill(HIST("hTHnTrk"), cent, nCh, track.pt(), track.eta(), track.sign()); + } + + // muons per event + int nMu{0}; + int nMuType[NTrackTypes] = {0}; + + for (const auto& muon : muons) { + const auto pt{muon.pt()}, eta{muon.eta()}, theta{90.0f - ((std::atan(muon.tgl())) * constants::math::Rad2Deg)}, pDca{muon.pDca()}, rAbsorb{muon.rAtAbsorberEnd()}, chi2{muon.chi2MatchMCHMFT()}; + const auto dcaXY{RecoDecay::sqrtSumOfSquares(muon.fwdDcaX(), muon.fwdDcaY())}; + const auto muTrackType{muon.trackType()}; + + registry.fill(HIST("hMuBeforeMatchMFT"), cent, nCh, pt, eta, theta, rAbsorb, dcaXY, pDca, chi2, muTrackType); + + // histograms before the acceptance cuts + registry.fill(HIST("hMuonSel"), NoCut); + registry.fill(HIST("hMuBeforeAccCuts"), cent, nCh, pt, eta, theta, rAbsorb, dcaXY, pDca, chi2, muTrackType); + registry.fill(HIST("h3DCABeforeAccCuts"), muon.fwdDcaX(), muon.fwdDcaY(), muTrackType); + + if (muon.has_matchMCHTrack()) { + auto muonType3 = muon.template matchMCHTrack_as(); + auto dpt = muonType3.pt() - pt; + if (muTrackType == ForwardTrackTypeEnum::GlobalMuonTrack) { + registry.fill(HIST("hMuDeltaPtBeforeAccCuts"), cent, nCh, pt, eta, theta, rAbsorb, dcaXY, pDca, chi2, dpt); + } + } + + // Apply various standard muon acceptance cuts + // eta cuts + if ((eta >= etaMax) || (eta < etaMin)) { + continue; + } + registry.fill(HIST("hMuonSel"), EtaCut); + registry.fill(HIST("hMuAfterEtaCuts"), cent, nCh, pt, eta, theta, rAbsorb, dcaXY, pDca, chi2, muTrackType); + + // Rabsorb cuts + if ((rAbsorb < rAbsorbMin) || (rAbsorb >= rAbsorbMax)) { + continue; + } + registry.fill(HIST("hMuonSel"), RAbsorbCut); + registry.fill(HIST("hMuAfterRAbsorbCuts"), cent, nCh, pt, eta, theta, rAbsorb, dcaXY, pDca, chi2, muTrackType); + + if ((rAbsorb < rAbsorbMid) && (pDca >= pDcaMin)) { + continue; + } + if ((rAbsorb >= rAbsorbMid) && (pDca >= pDcaMax)) { + continue; + } + registry.fill(HIST("hMuonSel"), PDcaCut); + registry.fill(HIST("hMuAfterPdcaCuts"), cent, nCh, pt, eta, theta, rAbsorb, dcaXY, pDca, chi2, muTrackType); + + // MCH-MFT matching chi2 + if (muon.chi2() >= 1e6) { + continue; + } + registry.fill(HIST("hMuonSel"), Chi2Cut); + + // histograms after acceptance cuts + registry.fill(HIST("hMuAfterAccCuts"), cent, nCh, pt, eta, theta, rAbsorb, dcaXY, pDca, chi2, muTrackType); + registry.fill(HIST("h3DCAAfterAccCuts"), muon.fwdDcaX(), muon.fwdDcaY(), muTrackType); + nMu++; + nMuType[muTrackType]++; + + if (muon.has_matchMCHTrack()) { + auto muonType3 = muon.template matchMCHTrack_as(); + auto dpt = muonType3.pt() - pt; + + if (muTrackType == ForwardTrackTypeEnum::GlobalMuonTrack) { + registry.fill(HIST("hMuDeltaPtAfterAccCuts"), cent, nCh, pt, eta, theta, rAbsorb, dcaXY, pDca, chi2, dpt); + } + } + } + + registry.fill(HIST("h3MultNchNmu"), cent, nCh, nMu); + + // Fill number of muons of various types with multiplicity + for (auto indexType{0u}; indexType < NTrackTypes; ++indexType) { + if (nMuType[indexType] > 0) { + registry.fill(HIST("hMultNchNmuTrackType"), cent, nCh, nMuType[indexType], indexType); + } + } + } +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} From f94bff1a29c8fa693c261278f8609a11df7ab19c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Tue, 27 May 2025 20:10:10 +0200 Subject: [PATCH 1437/1650] [ALICE3] A3: add qa tasks (#11377) --- ALICE3/Tasks/CMakeLists.txt | 12 ++- ALICE3/Tasks/alice3Efficiency.cxx | 103 ++++++++++++++++++++++++ ALICE3/Tasks/alice3SeparationPower.cxx | 106 +++++++++++++++++++++++++ 3 files changed, 220 insertions(+), 1 deletion(-) create mode 100644 ALICE3/Tasks/alice3Efficiency.cxx create mode 100644 ALICE3/Tasks/alice3SeparationPower.cxx diff --git a/ALICE3/Tasks/CMakeLists.txt b/ALICE3/Tasks/CMakeLists.txt index 0b2e9972aa5..ddf9008e667 100644 --- a/ALICE3/Tasks/CMakeLists.txt +++ b/ALICE3/Tasks/CMakeLists.txt @@ -39,6 +39,11 @@ o2physics_add_dpl_workflow(alice3-pid-ftof-qa PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(alice3-pid-separation-power + SOURCES alice3SeparationPower.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(alice3-cdeuteron SOURCES alice3-cdeuteron.cxx PUBLIC_LINK_LIBRARIES O2::DCAFitter O2Physics::AnalysisCore @@ -52,4 +57,9 @@ o2physics_add_dpl_workflow(alice3-dilepton o2physics_add_dpl_workflow(alice3-taskcorrelationddbar SOURCES alice3-taskcorrelationDDbar.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore - COMPONENT_NAME Analysis) \ No newline at end of file + COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(alice3-efficiency + SOURCES alice3Efficiency.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) diff --git a/ALICE3/Tasks/alice3Efficiency.cxx b/ALICE3/Tasks/alice3Efficiency.cxx new file mode 100644 index 00000000000..7741ea24696 --- /dev/null +++ b/ALICE3/Tasks/alice3Efficiency.cxx @@ -0,0 +1,103 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// +/// \file alice3Efficiency.cxx +/// +/// \brief This task produces the efficiency +/// +/// \author Nicolò Jacazio, Universita del Piemonte Orientale (IT) +/// \since May 27, 2025 +/// + +#include +#include + +#include "Framework/AnalysisTask.h" +#include "Framework/runDataProcessing.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/ConfigParamRegistry.h" +#include "TEfficiency.h" +#include "THashList.h" + +using namespace o2; +using namespace o2::framework; +std::map effVsPt; +std::map effVsEta; + +struct alice3Efficiency { + Configurable> pdgCodes{"pdgCodes", {211}, "List of PDG codes to consider for efficiency calculation"}; + OutputObj outList{"output"}; + Configurable> etaRange{"etaRange", {-5.f, 5.f}, "Eta range for efficiency calculation"}; + void init(o2::framework::InitContext&) + { + outList.setObject(new THashList); + auto createEff = [&](const char* baseName, const char* axisTitle, int pdg, int nBins, double min, double max) { + auto eff = new TEfficiency(Form("%s_pdg%d", baseName, pdg), + Form("Efficiency for PDG %d; %s; Efficiency", pdg, axisTitle), + nBins, min, max); + outList->Add(eff); + return eff; + }; + for (auto pdg : pdgCodes.value) { + effVsPt[pdg] = createEff("efficiency", "p_{T} (GeV/c)", pdg, 100, 0, 10); + effVsEta[pdg] = createEff("efficiency_eta", "#eta", pdg, 100, -5, 5); + } + } + + void process(soa::Join const& tracks, + aod::McParticles const& mcParticles) + { + std::map> pdgIndices; + + // Lambda function to select particles after all cuts + auto isParticleSelected = [&](const o2::aod::McParticle& p) { + if (!p.isPhysicalPrimary()) { + return false; + } + if (p.eta() < etaRange.value.first) { + return false; + } + if (p.eta() > etaRange.value.second) { + return false; + } + return true; + }; + for (const auto& track : tracks) { + if (!track.has_mcParticle()) { + continue; + } + const auto& mcParticle = track.mcParticle(); + if (!isParticleSelected(mcParticle)) { + continue; + } + pdgIndices[mcParticle.pdgCode()].push_back(mcParticle.globalIndex()); + } + + for (auto& mc : mcParticles) { + if (effVsPt.find(mc.pdgCode()) == effVsPt.end()) { + continue; + } + if (!isParticleSelected(mc)) { + continue; + } + std::vector& indices = pdgIndices[mc.pdgCode()]; + // Fill efficiency histogram + const bool found = std::find(indices.begin(), indices.end(), mc.globalIndex()) != indices.end(); + effVsPt[mc.pdgCode()]->Fill(found, mc.pt()); + effVsEta[mc.pdgCode()]->Fill(found, mc.eta()); + } + } +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& ctx) +{ + return WorkflowSpec{adaptAnalysisTask(ctx)}; +} diff --git a/ALICE3/Tasks/alice3SeparationPower.cxx b/ALICE3/Tasks/alice3SeparationPower.cxx new file mode 100644 index 00000000000..ae5b52d0692 --- /dev/null +++ b/ALICE3/Tasks/alice3SeparationPower.cxx @@ -0,0 +1,106 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// +/// \file alice3SeparationPower.cxx +/// +/// \brief This task produces the separation power of the ALICE3 detector +/// +/// \author Nicolò Jacazio, Universita del Piemonte Orientale (IT) +/// \since May 13, 2025 +/// + +#include +#include +#include +#include + +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/runDataProcessing.h" +#include "Framework/RunningWorkflowInfo.h" +#include "Framework/HistogramRegistry.h" +#include "TProfile2D.h" +#include "THashList.h" +#include "ALICE3/DataModel/OTFTOF.h" +#include "ALICE3/DataModel/OTFRICH.h" + +using namespace o2; +using namespace o2::framework; + +std::array separationInnerTOF; +std::array separationOuterTOF; +std::array separationRICH; +struct alice3SeparationPower { + + ConfigurableAxis etaAxis{"etaAxis", {100, -1.f, 1.f}, "Binning in eta"}; + HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + OutputObj listSeparation{"separationPower"}; + void init(o2::framework::InitContext&) + { + listSeparation.setObject(new THashList); + for (int i = 0; i < 5; i++) { + auto createEfficiency = [&](const char* name, const char* title) { + TProfile2D* eff = new TProfile2D(Form("%s_%d", name, i), + Form("%s_%d;%s", title, i, "#it{p}_{T} (GeV/#it{c});#it{#eta}"), + 100, 0.f, 10.f, + 100, 0.f, 10.f); + listSeparation->Add(eff); + return eff; + }; + separationInnerTOF[i] = createEfficiency("separationInnerTOF", "separationInnerTOF"); + separationOuterTOF[i] = createEfficiency("separationOuterTOF", "separationOuterTOF"); + separationRICH[i] = createEfficiency("separationRICH", "separationRICH"); + } + } + + void process(soa::Join::iterator const& /*collision*/, + soa::Join const& tracks, + aod::McParticles const&, + aod::McCollisions const&) + { + for (const auto& track : tracks) { + if (!track.has_mcParticle()) { + continue; + } + // Check that all the nsigmas are numbers (sanity check) + for (int i = 0; i < 5; i++) { + if (std::isnan(track.nSigmaInnerTOF(i)) || std::isnan(track.nSigmaOuterTOF(i))) { + LOG(fatal) << "Unrecognized nsigma for " << i << " " << track.nSigmaInnerTOF(i) << " " << track.nSigmaOuterTOF(i); + } + } + + const auto& mcParticle = track.mcParticle(); + // Separation electron pion + switch (std::abs(mcParticle.pdgCode())) { + { + case 211: // electron-pion separation + separationInnerTOF[0]->Fill(track.pt(), track.eta(), track.nSigmaInnerTOF(0)); + separationOuterTOF[0]->Fill(track.pt(), track.eta(), track.nSigmaOuterTOF(0)); + // separationRICH[0]->Fill(track.pt(), track.eta(), track.nSigmaElectronRich() ); + break; + case 321: // pion-kaon separation + separationInnerTOF[1]->Fill(track.pt(), track.eta(), track.nSigmaInnerTOF(1)); + separationOuterTOF[1]->Fill(track.pt(), track.eta(), track.nSigmaInnerTOF(1)); + // separationRICH[1]->Fill(track.pt(), track.eta(), track.nSigmaPionRich() ); + break; + case 2212: // kaon-proton separation + separationInnerTOF[2]->Fill(track.pt(), track.eta(), track.nSigmaInnerTOF(2)); + separationOuterTOF[2]->Fill(track.pt(), track.eta(), track.nSigmaInnerTOF(2)); + // separationRICH[2]->Fill((track.nSigmaKaonRich() > 3.f), track.pt(), track.eta()); + default: + break; + } + } + } + } +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From c8b478ff5e692fa9636ab8a8cd8968cbb7f62a2a Mon Sep 17 00:00:00 2001 From: ariedel-cern <85537041+ariedel-cern@users.noreply.github.com> Date: Tue, 27 May 2025 21:04:50 +0200 Subject: [PATCH 1438/1650] [Trigger,PWGCF] Fix histogram filling/naming (#11366) --- EventFiltering/PWGCF/CFFilterAll.cxx | 684 +++++++++++++-------------- 1 file changed, 342 insertions(+), 342 deletions(-) diff --git a/EventFiltering/PWGCF/CFFilterAll.cxx b/EventFiltering/PWGCF/CFFilterAll.cxx index 4df821ec669..589228edc5f 100644 --- a/EventFiltering/PWGCF/CFFilterAll.cxx +++ b/EventFiltering/PWGCF/CFFilterAll.cxx @@ -115,13 +115,13 @@ const uint32_t nLimitNames = 2; const float limitTable[nLimitNames][nFilterNames]{ {0.6f, 0.6f, 0.6f, 0.6f, 0.6f, 0.6f, 0.5f, 0.5f, 0.5f, 0.5f}, - {1.2f, 1.2f, 1.2f, 1.2f, 1.2f, 1.2f, 1.0f, 1.0f, 1.0f, 1.0f}}; + {1.4f, 1.4f, 1.4f, 1.4f, 1.4f, 1.4f, 1.0f, 1.0f, 1.0f, 1.0f}}; using FullCollisions = soa::Join; using FullCollision = FullCollisions::iterator; using FullTracks = soa::Join zvtx{"zvtx", 12.f, "Max. z-Vertex (cm)"}; + Configurable zvtx{"zvtx", 10.f, "Max. z-Vertex (cm)"}; Configurable eventSel{"eventSel", true, "Use sel8"}; } EventSelection; @@ -287,9 +287,9 @@ struct CFFilterAll { ConfigurableAxis transRad{"transRad", {100, 0, 100}, "Binning Transverse Radius"}; ConfigurableAxis decayVtx{"decayVtx", {100, 0, 100}, "Binning Decay Vertex"}; - ConfigurableAxis invMassPhi{"invMassPhi", {700, 0.8, 1.5}, "Binning Invariant Mass Phi"}; + ConfigurableAxis invMassPhi{"invMassPhi", {600, 0.7, 1.3}, "Binning Invariant Mass Phi"}; - ConfigurableAxis invMassRho{"invMassRho", {600, 0.6, 1.2}, "Binning Invariant Mass Rho"}; + ConfigurableAxis invMassRho{"invMassRho", {600, 0.47, 1.07}, "Binning Invariant Mass Rho"}; ConfigurableAxis q3{"q3", {300, 0, 3}, "Binning Decay Q3"}; ConfigurableAxis kstar{"kstar", {300, 0, 3}, "Binning Decay Kstar"}; @@ -298,8 +298,8 @@ struct CFFilterAll { // define histogram registry // because we have so many histograms, we need to have 2 registries - HistogramRegistry registryParticleQA{"ParticleQA", {}, OutputObjHandlingPolicy::AnalysisObject}; - HistogramRegistry registryTriggerQA{"TriggerQA", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry registryParticleQA{"ParticleQA", {}, OutputObjHandlingPolicy::AnalysisObject}; // for particle histograms + HistogramRegistry registryTriggerQA{"TriggerQA", {}, OutputObjHandlingPolicy::AnalysisObject}; // for trigger histograms // helper object flor building lambdas o2::pwglf::strangenessBuilderHelper mStraHelper; @@ -654,7 +654,7 @@ struct CFFilterAll { registryParticleQA.add("TrackQA/After/AntiDeuteron/fNsigmaIts", "NSigmaITS;p (GeV/c);n#sigma_{ITS}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); registryParticleQA.add("TrackQA/After/AntiDeuteron/fNsigmaTpc", "NSigmaTPC;p (GeV/c);n#sigma_{TPC}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); registryParticleQA.add("TrackQA/After/AntiDeuteron/fNsigmaTof", "NSigmaTOF;p (GeV/c);n#sigma_{TOF}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); - registryParticleQA.add("TrackQA/After/AntiDeuteron/fNsigmaTpcTof", "NSigmaTPCTOF;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigma}}); + registryParticleQA.add("TrackQA/After/AntiDeuteron/fNsigmaTpcTof", "NSigmaTPCTOF;p (GeV/c);n#sigma_{comb}", {HistType::kTH2F, {Binning.momentum, Binning.nsigmaComb}}); registryParticleQA.add("TrackQA/After/AntiDeuteron/fItsSignal", "ITS Signal;p (GeV/c); (cm)", {HistType::kTH2F, {Binning.momentum, Binning.itsSignal}}); registryParticleQA.add("TrackQA/After/AntiDeuteron/fTpcSignal", "TPC Signal;p (GeV/c);TPC Signal", {HistType::kTH2F, {Binning.momentum, Binning.tpcSignal}}); @@ -779,248 +779,248 @@ struct CFFilterAll { registryTriggerQA.add("PPP/all/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); registryTriggerQA.add("PPP/all/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); registryTriggerQA.add("PPP/all/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); - registryTriggerQA.add("PPP/all/fProtonPtVsQ3", "Proton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registryTriggerQA.add("PPP/all/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PPP/all/fProtonQ3VsPt", "Q_{3} vs Proton p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); + registryTriggerQA.add("PPP/all/fAntiProtonQ3VsPt", "Q_{3} vs AntiProton p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); registryTriggerQA.add("PPP/loose/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("PPP/loose/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); registryTriggerQA.add("PPP/loose/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); registryTriggerQA.add("PPP/loose/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); - registryTriggerQA.add("PPP/loose/fProtonPtVsQ3", "Proton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registryTriggerQA.add("PPP/loose/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PPP/loose/fProtonQ3VsPt", "Q_{3} vs Proton p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); + registryTriggerQA.add("PPP/loose/fAntiProtonQ3VsPt", "Q_{3} vs AntiProton p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); registryTriggerQA.add("PPP/tight/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("PPP/tight/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); registryTriggerQA.add("PPP/tight/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); registryTriggerQA.add("PPP/tight/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); - registryTriggerQA.add("PPP/tight/fProtonPtVsQ3", "Proton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registryTriggerQA.add("PPP/tight/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PPP/tight/fProtonQ3VsPt", "Q_{3} vs Proton p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); + registryTriggerQA.add("PPP/tight/fAntiProtonQ3VsPt", "Q_{3} vs AntiProton p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); // for ppl registryTriggerQA.add("PPL/all/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("PPL/all/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); registryTriggerQA.add("PPL/all/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); registryTriggerQA.add("PPL/all/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); - registryTriggerQA.add("PPL/all/fProtonPtVsQ3", "Proton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registryTriggerQA.add("PPL/all/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registryTriggerQA.add("PPL/all/fLambdaPtVsQ3", "Lambda p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registryTriggerQA.add("PPL/all/fAntiLambdaPtVsQ3", "AntiLambda p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PPL/all/fProtonQ3VsPt", "Q_{3} vs Proton p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); + registryTriggerQA.add("PPL/all/fAntiProtonQ3VsPt", "Q_{3} vs AntiProton p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); + registryTriggerQA.add("PPL/all/fLambdaQ3VsPt", "Q_{3} vs Lambda p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); + registryTriggerQA.add("PPL/all/fAntiLambdaQ3VsPt", "Q_{3} vs AntiLambda p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); registryTriggerQA.add("PPL/loose/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("PPL/loose/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); registryTriggerQA.add("PPL/loose/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); registryTriggerQA.add("PPL/loose/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); - registryTriggerQA.add("PPL/loose/fProtonPtVsQ3", "Proton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registryTriggerQA.add("PPL/loose/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registryTriggerQA.add("PPL/loose/fLambdaPtVsQ3", "Lambda p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registryTriggerQA.add("PPL/loose/fAntiLambdaPtVsQ3", "AntiLambda p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PPL/loose/fProtonQ3VsPt", "Q_{3} vs Proton p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); + registryTriggerQA.add("PPL/loose/fAntiProtonQ3VsPt", "Q_{3} vs AntiProton p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); + registryTriggerQA.add("PPL/loose/fLambdaQ3VsPt", "Q_{3} vs Lambda p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); + registryTriggerQA.add("PPL/loose/fAntiLambdaQ3VsPt", "Q_{3} vs AntiLambda p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); registryTriggerQA.add("PPL/tight/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("PPL/tight/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); registryTriggerQA.add("PPL/tight/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); registryTriggerQA.add("PPL/tight/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); - registryTriggerQA.add("PPL/tight/fProtonPtVsQ3", "Proton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registryTriggerQA.add("PPL/tight/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registryTriggerQA.add("PPL/tight/fLambdaPtVsQ3", "Lambda p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registryTriggerQA.add("PPL/tight/fAntiLambdaPtVsQ3", "AntiLambda p_{T} vs Q_{3};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PPL/tight/fProtonQ3VsPt", "Q_{3} vs Proton p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); + registryTriggerQA.add("PPL/tight/fAntiProtonQ3VsPt", "Q_{3} vs AntiProton p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); + registryTriggerQA.add("PPL/tight/fLambdaQ3VsPt", "Q_{3} vs Lambda p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); + registryTriggerQA.add("PPL/tight/fAntiLambdaQ3VsPt", "Q_{3} vs AntiLambda p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); // for pll registryTriggerQA.add("PLL/all/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("PLL/all/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); registryTriggerQA.add("PLL/all/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); registryTriggerQA.add("PLL/all/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); - registryTriggerQA.add("PLL/all/fProtonPtVsQ3", "Proton p_{T}Q3 vs pT", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registryTriggerQA.add("PLL/all/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registryTriggerQA.add("PLL/all/fLambdaPtVsQ3", "Lambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registryTriggerQA.add("PLL/all/fAntiLambdaPtVsQ3", "AntiLambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PLL/all/fProtonQ3VsPt", "Q_{3} vs Proton p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); + registryTriggerQA.add("PLL/all/fAntiProtonQ3VsPt", "Q3 vs AntiProton p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); + registryTriggerQA.add("PLL/all/fLambdaQ3VsPt", "Q3 vs Lambda p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); + registryTriggerQA.add("PLL/all/fAntiLambdaQ3VsPt", "Q3 vs AntiLambda p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); registryTriggerQA.add("PLL/loose/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("PLL/loose/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); registryTriggerQA.add("PLL/loose/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); registryTriggerQA.add("PLL/loose/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); - registryTriggerQA.add("PLL/loose/fProtonPtVsQ3", "Proton p_{T}Q3 vs pT", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registryTriggerQA.add("PLL/loose/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registryTriggerQA.add("PLL/loose/fLambdaPtVsQ3", "Lambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registryTriggerQA.add("PLL/loose/fAntiLambdaPtVsQ3", "AntiLambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PLL/loose/fProtonQ3VsPt", "Q3 vs pT vs Proton p;Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); + registryTriggerQA.add("PLL/loose/fAntiProtonQ3VsPt", "Q3 vs AntiProton p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); + registryTriggerQA.add("PLL/loose/fLambdaQ3VsPt", "Q3 vs Lambda p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); + registryTriggerQA.add("PLL/loose/fAntiLambdaQ3VsPt", "Q3 vs AntiLambda p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); registryTriggerQA.add("PLL/tight/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("PLL/tight/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); registryTriggerQA.add("PLL/tight/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); registryTriggerQA.add("PLL/tight/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); - registryTriggerQA.add("PLL/tight/fProtonPtVsQ3", "Proton p_{T}Q3 vs pT", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registryTriggerQA.add("PLL/tight/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registryTriggerQA.add("PLL/tight/fLambdaPtVsQ3", "Lambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registryTriggerQA.add("PLL/tight/fAntiLambdaPtVsQ3", "AntiLambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("PLL/tight/fProtonQ3VsPt", "Q3 vs pT vs Proton p;Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); + registryTriggerQA.add("PLL/tight/fAntiProtonQ3VsPt", "Q3 vs AntiProton p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); + registryTriggerQA.add("PLL/tight/fLambdaQ3VsPt", "Q3 vs Lambda p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); + registryTriggerQA.add("PLL/tight/fAntiLambdaQ3VsPt", "Q3 vs AntiLambda p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); // for lll registryTriggerQA.add("LLL/all/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("LLL/all/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); registryTriggerQA.add("LLL/all/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); registryTriggerQA.add("LLL/all/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); - registryTriggerQA.add("LLL/all/fLambdaPtVsQ3", "Lambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registryTriggerQA.add("LLL/all/fAntiLambdaPtVsQ3", "AntiLambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("LLL/all/fLambdaQ3VsPt", "Q3 vs Lambda p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); + registryTriggerQA.add("LLL/all/fAntiLambdaQ3VsPt", "Q3 vs AntiLambda p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); registryTriggerQA.add("LLL/loose/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("LLL/loose/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); registryTriggerQA.add("LLL/loose/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); registryTriggerQA.add("LLL/loose/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); - registryTriggerQA.add("LLL/loose/fLambdaPtVsQ3", "Lambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registryTriggerQA.add("LLL/loose/fAntiLambdaPtVsQ3", "AntiLambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("LLL/loose/fLambdaQ3VsPt", "Q3 vs Lambda p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); + registryTriggerQA.add("LLL/loose/fAntiLambdaQ3VsPt", "Q3 vs AntiLambda p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); registryTriggerQA.add("LLL/tight/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("LLL/tight/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); registryTriggerQA.add("LLL/tight/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); registryTriggerQA.add("LLL/tight/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); - registryTriggerQA.add("LLL/tight/fLambdaPtVsQ3", "Lambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); - registryTriggerQA.add("LLL/tight/fAntiLambdaPtVsQ3", "AntiLambda p_{T} vs Q3", {HistType::kTH2F, {Binning.momentum, Binning.q3}}); + registryTriggerQA.add("LLL/tight/fLambdaQ3VsPt", "Q3 vs Lambda p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); + registryTriggerQA.add("LLL/tight/fAntiLambdaQ3VsPt", "Q3 vs AntiLambda p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.q3, Binning.momentum}}); // for ppPhi registryTriggerQA.add("PPPhi/all/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("PPPhi/all/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); registryTriggerQA.add("PPPhi/all/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); registryTriggerQA.add("PPPhi/all/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); - registryTriggerQA.add("PPPhi/all/fProtonPtVsQ3", "Proton p_{T} vs Q_{3}", HistType::kTH2F, {Binning.momentum, Binning.q3}); - registryTriggerQA.add("PPPhi/all/fAntiProtonPtVsQ3", "AntiLambda p_{T} vs Q3", HistType::kTH2F, {Binning.momentum, Binning.q3}); - registryTriggerQA.add("PPPhi/all/fPhiPtVsQ3", "#phi p_{T} vs Q_{3};p_{T} (GeV/c); Q_{3} (GeV/c)", HistType::kTH2F, {Binning.momentum, Binning.q3}); - registryTriggerQA.add("PPPhi/all/fPhiInvMassVsQ3", "#phi mass vs Q_{3};M_{K^{+}K^{-}} (GeV/c^{2});Q_{3} (GeV/c)", HistType::kTH2F, {Binning.invMassPhi, Binning.q3}); + registryTriggerQA.add("PPPhi/all/fProtonQ3VsPt", "Q_{3} vs Proton p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", HistType::kTH2F, {Binning.q3, Binning.momentum}); + registryTriggerQA.add("PPPhi/all/fAntiProtonQ3VsPt", "Q3 vs AntiLambda p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", HistType::kTH2F, {Binning.q3, Binning.momentum}); + registryTriggerQA.add("PPPhi/all/fPhiQ3VsPt", "Q_{3} vs #phi p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", HistType::kTH2F, {Binning.q3, Binning.momentum}); + registryTriggerQA.add("PPPhi/all/fPhiQ3VsInvMass", "Q_{3} vs #phi mass;Q_{3} (GeV/c);M_{K^{+}K^{-}} (GeV/c^{2})", HistType::kTH2F, {Binning.q3, Binning.invMassPhi}); registryTriggerQA.add("PPPhi/loose/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("PPPhi/loose/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); registryTriggerQA.add("PPPhi/loose/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); registryTriggerQA.add("PPPhi/loose/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); - registryTriggerQA.add("PPPhi/loose/fProtonPtVsQ3", "Proton p_{T} vs Q_{3}", HistType::kTH2F, {Binning.momentum, Binning.q3}); - registryTriggerQA.add("PPPhi/loose/fAntiProtonPtVsQ3", "AntiLambda p_{T} vs Q3", HistType::kTH2F, {Binning.momentum, Binning.q3}); - registryTriggerQA.add("PPPhi/loose/fPhiPtVsQ3", "#phi p_{T} vs Q_{3};p_{T} (GeV/c); Q_{3} (GeV/c)", HistType::kTH2F, {Binning.momentum, Binning.q3}); - registryTriggerQA.add("PPPhi/loose/fPhiInvMassVsQ3", "#phi mass vs Q_{3};M_{K^{+}K^{-}} (GeV/c^{2});Q_{3} (GeV/c)", HistType::kTH2F, {Binning.invMassPhi, Binning.q3}); + registryTriggerQA.add("PPPhi/loose/fProtonQ3VsPt", "Q_{3} vs Proton p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", HistType::kTH2F, {Binning.q3, Binning.momentum}); + registryTriggerQA.add("PPPhi/loose/fAntiProtonQ3VsPt", "Q3 vs AntiLambda p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", HistType::kTH2F, {Binning.q3, Binning.momentum}); + registryTriggerQA.add("PPPhi/loose/fPhiQ3VsPt", "Q_{3} vs #phi p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", HistType::kTH2F, {Binning.q3, Binning.momentum}); + registryTriggerQA.add("PPPhi/loose/fPhiQ3VsInvMass", "Q_{3} vs #phi mass;Q_{3} (GeV/c);M_{K^{+}K^{-}} (GeV/c^{2})", HistType::kTH2F, {Binning.q3, Binning.invMassPhi}); registryTriggerQA.add("PPPhi/tight/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("PPPhi/tight/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); registryTriggerQA.add("PPPhi/tight/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); registryTriggerQA.add("PPPhi/tight/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);Entries", HistType::kTH1F, {Binning.q3}); - registryTriggerQA.add("PPPhi/tight/fProtonPtVsQ3", "Proton p_{T} vs Q_{3}", HistType::kTH2F, {Binning.momentum, Binning.q3}); - registryTriggerQA.add("PPPhi/tight/fAntiProtonPtVsQ3", "AntiLambda p_{T} vs Q3", HistType::kTH2F, {Binning.momentum, Binning.q3}); - registryTriggerQA.add("PPPhi/tight/fPhiPtVsQ3", "#phi p_{T} vs Q_{3};p_{T} (GeV/c); Q_{3} (GeV/c)", HistType::kTH2F, {Binning.momentum, Binning.q3}); - registryTriggerQA.add("PPPhi/tight/fPhiInvMassVsQ3", "#phi mass vs Q_{3};M_{K^{+}K^{-}} (GeV/c^{2});Q_{3} (GeV/c)", HistType::kTH2F, {Binning.invMassPhi, Binning.q3}); + registryTriggerQA.add("PPPhi/tight/fProtonQ3VsPt", "Q_{3} vs Proton p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", HistType::kTH2F, {Binning.q3, Binning.momentum}); + registryTriggerQA.add("PPPhi/tight/fAntiProtonQ3VsPt", "Q3 vs AntiLambda p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", HistType::kTH2F, {Binning.q3, Binning.momentum}); + registryTriggerQA.add("PPPhi/tight/fPhiQ3VsPt", "Q_{3} vs #phi p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", HistType::kTH2F, {Binning.q3, Binning.momentum}); + registryTriggerQA.add("PPPhi/tight/fPhiQ3VsInvMass", "Q_{3} vs #phi mass;Q_{3} (GeV/c);M_{K^{+}K^{-}} (GeV/c^{2})", HistType::kTH2F, {Binning.q3, Binning.invMassPhi}); // for ppRho registryTriggerQA.add("PPRho/all/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("PPRho/all/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); registryTriggerQA.add("PPRho/all/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); registryTriggerQA.add("PPRho/all/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); - registryTriggerQA.add("PPRho/all/fProtonPtVsQ3", "Proton p_{T} vs Q3", HistType::kTH2F, {Binning.momentum, Binning.q3}); - registryTriggerQA.add("PPRho/all/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q3", HistType::kTH2F, {Binning.momentum, Binning.q3}); - registryTriggerQA.add("PPRho/all/fRhoPtVsQ3", "#rho p_{T} vs Q3;Q_{3} (GeV/c);SE", HistType::kTH2F, {Binning.momentum, Binning.q3}); - registryTriggerQA.add("PPRho/all/fRhoInvMassVsQ3", "#rho mass vs Q_{3};M_{#pi^{+}#pi^{-}} (GeV/c^{2});Q_{3} (GeV/c)", HistType::kTH2F, {Binning.invMassRho, Binning.q3}); + registryTriggerQA.add("PPRho/all/fProtonQ3VsPt", "Q3 vs Proton p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", HistType::kTH2F, {Binning.q3, Binning.momentum}); + registryTriggerQA.add("PPRho/all/fAntiProtonQ3VsPt", "Q3 vs AntiProton p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", HistType::kTH2F, {Binning.q3, Binning.momentum}); + registryTriggerQA.add("PPRho/all/fRhoQ3VsPt", "Q3 vs #rho p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", HistType::kTH2F, {Binning.q3, Binning.momentum}); + registryTriggerQA.add("PPRho/all/fRhoQ3VsInvMass", "Q_{3} vs #rho mass;Q_{3} (GeV/c);M_{#pi^{+}#pi^{-}} (GeV/c^{2})", HistType::kTH2F, {Binning.q3, Binning.invMassRho}); registryTriggerQA.add("PPRho/loose/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("PPRho/loose/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); registryTriggerQA.add("PPRho/loose/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); registryTriggerQA.add("PPRho/loose/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); - registryTriggerQA.add("PPRho/loose/fProtonPtVsQ3", "Proton p_{T} vs Q3", HistType::kTH2F, {Binning.momentum, Binning.q3}); - registryTriggerQA.add("PPRho/loose/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q3", HistType::kTH2F, {Binning.momentum, Binning.q3}); - registryTriggerQA.add("PPRho/loose/fRhoPtVsQ3", "#rho p_{T} vs Q3;Q_{3} (GeV/c);SE", HistType::kTH2F, {Binning.momentum, Binning.q3}); - registryTriggerQA.add("PPRho/loose/fRhoInvMassVsQ3", "#rho mass vs Q_{3};M_{#pi^{+}#pi^{-}} (GeV/c^{2});Q_{3} (GeV/c)", HistType::kTH2F, {Binning.invMassRho, Binning.q3}); + registryTriggerQA.add("PPRho/loose/fProtonQ3VsPt", "Q3 vs Proton p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", HistType::kTH2F, {Binning.q3, Binning.momentum}); + registryTriggerQA.add("PPRho/loose/fAntiProtonQ3VsPt", "Q3 vs AntiProton p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", HistType::kTH2F, {Binning.q3, Binning.momentum}); + registryTriggerQA.add("PPRho/loose/fRhoQ3VsPt", "Q3 vs #rho p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", HistType::kTH2F, {Binning.q3, Binning.momentum}); + registryTriggerQA.add("PPRho/loose/fRhoQ3VsInvMass", "Q_{3} vs #rho mass;Q_{3} (GeV/c);M_{#pi^{+}#pi^{-}} (GeV/c^{2})", HistType::kTH2F, {Binning.q3, Binning.invMassRho}); registryTriggerQA.add("PPRho/tight/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("PPRho/tight/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); registryTriggerQA.add("PPRho/tight/fSE_particle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); registryTriggerQA.add("PPRho/tight/fSE_antiparticle", "Same Event distribution;Q_{3} (GeV/c);SE", HistType::kTH1F, {Binning.q3}); - registryTriggerQA.add("PPRho/tight/fProtonPtVsQ3", "Proton p_{T} vs Q3", HistType::kTH2F, {Binning.momentum, Binning.q3}); - registryTriggerQA.add("PPRho/tight/fAntiProtonPtVsQ3", "AntiProton p_{T} vs Q3", HistType::kTH2F, {Binning.momentum, Binning.q3}); - registryTriggerQA.add("PPRho/tight/fRhoPtVsQ3", "#rho p_{T} vs Q3;Q_{3} (GeV/c);SE", HistType::kTH2F, {Binning.momentum, Binning.q3}); - registryTriggerQA.add("PPRho/tight/fRhoInvMassVsQ3", "#rho mass vs Q_{3};M_{#pi^{+}#pi^{-}} (GeV/c^{2});Q_{3} (GeV/c)", HistType::kTH2F, {Binning.invMassRho, Binning.q3}); + registryTriggerQA.add("PPRho/tight/fProtonQ3VsPt", "Q3 vs Proton p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", HistType::kTH2F, {Binning.q3, Binning.momentum}); + registryTriggerQA.add("PPRho/tight/fAntiProtonQ3VsPt", "Q3 vs AntiProton p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", HistType::kTH2F, {Binning.q3, Binning.momentum}); + registryTriggerQA.add("PPRho/tight/fRhoQ3VsPt", "Q3 vs #rho p_{T};Q_{3} (GeV/c);p_{T} (GeV/c)", HistType::kTH2F, {Binning.q3, Binning.momentum}); + registryTriggerQA.add("PPRho/tight/fRhoQ3VsInvMass", "Q_{3} vs #rho mass;Q_{3} (GeV/c);M_{#pi^{+}#pi^{-}} (GeV/c^{2})", HistType::kTH2F, {Binning.q3, Binning.invMassRho}); // for pd registryTriggerQA.add("PD/all/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("PD/all/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); - registryTriggerQA.add("PD/all/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registryTriggerQA.add("PD/all/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registryTriggerQA.add("PD/all/fProtonPtVskstar", "Proton p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("PD/all/fAntiProtonPtVskstar", "AntiProton p_{T} vs k^{*};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("PD/all/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("PD/all/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("PD/all/fSE_particle", "Same Event distribution;k* (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("PD/all/fSE_antiparticle", "Same Event distribution;k* (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("PD/all/fProtonKstarVsPt", "k* vs Proton p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("PD/all/fAntiProtonKstarVsPt", "k* vs AntiProton p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("PD/all/fDeuteronKstarVsPt", "k* vs Deuteron p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("PD/all/fAntiDeuteronKstarVsPt", "k* vs AntiDeuteron p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); registryTriggerQA.add("PD/loose/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("PD/loose/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); - registryTriggerQA.add("PD/loose/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registryTriggerQA.add("PD/loose/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registryTriggerQA.add("PD/loose/fProtonPtVskstar", "Proton p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("PD/loose/fAntiProtonPtVskstar", "AntiProton p_{T} vs k^{*};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("PD/loose/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("PD/loose/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("PD/loose/fSE_particle", "Same Event distribution;k* (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("PD/loose/fSE_antiparticle", "Same Event distribution;k* (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("PD/loose/fProtonKstarVsPt", "k* vs Proton p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("PD/loose/fAntiProtonKstarVsPt", "k* vs AntiProton p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("PD/loose/fDeuteronKstarVsPt", "k* Deuteron p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("PD/loose/fAntiDeuteronKstarVsPt", "k* vs AntiDeuteron p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); registryTriggerQA.add("PD/tight/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("PD/tight/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); - registryTriggerQA.add("PD/tight/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registryTriggerQA.add("PD/tight/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registryTriggerQA.add("PD/tight/fProtonPtVskstar", "Proton p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("PD/tight/fAntiProtonPtVskstar", "AntiProton p_{T} vs k^{*};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("PD/tight/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("PD/tight/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("PD/tight/fSE_particle", "Same Event distribution;k* (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("PD/tight/fSE_antiparticle", "Same Event distribution;k* (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("PD/tight/fProtonKstarVsPt", "k* vs Proton p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("PD/tight/fAntiProtonKstarVsPt", "k* vs AntiProton p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("PD/tight/fDeuteronKstarVsPt", "k* vs Deuteron p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("PD/tight/fAntiDeuteronKstarVsPt", "k* vs AntiDeuteron p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); // for ld registryTriggerQA.add("LD/all/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("LD/all/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); - registryTriggerQA.add("LD/all/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registryTriggerQA.add("LD/all/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registryTriggerQA.add("LD/all/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("LD/all/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("LD/all/fLambdaPtVskstar", "Lambda p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("LD/all/fAntiLambdaPtVskstar", "AntiLambda p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("LD/all/fSE_particle", "Same Event distribution;k* (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("LD/all/fSE_antiparticle", "Same Event distribution;k* (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("LD/all/fDeuteronKstarVsPt", "k* vs Deuteron p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("LD/all/fAntiDeuteronKstarVsPt", "k* vs AntiDeuteron p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("LD/all/fLambdaKstarVsPt", "k* vs Lambda p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("LD/all/fAntiLambdaKstarVsPt", "k* vs AntiLambda p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); registryTriggerQA.add("LD/loose/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("LD/loose/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); - registryTriggerQA.add("LD/loose/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registryTriggerQA.add("LD/loose/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registryTriggerQA.add("LD/loose/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("LD/loose/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("LD/loose/fLambdaPtVskstar", "Lambda p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("LD/loose/fAntiLambdaPtVskstar", "AntiLambda p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("LD/loose/fSE_particle", "Same Event distribution;k* (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("LD/loose/fSE_antiparticle", "Same Event distribution;k* (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("LD/loose/fDeuteronKstarVsPt", "k* vs Deuteron p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("LD/loose/fAntiDeuteronKstarVsPt", "k* vs AntiDeuteron p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("LD/loose/fLambdaKstarVsPt", "k* vs Lambda p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("LD/loose/fAntiLambdaKstarVsPt", "k* vs AntiLambda p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); registryTriggerQA.add("LD/tight/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("LD/tight/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); - registryTriggerQA.add("LD/tight/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registryTriggerQA.add("LD/tight/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registryTriggerQA.add("LD/tight/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("LD/tight/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};Q_{3} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("LD/tight/fLambdaPtVskstar", "Lambda p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("LD/tight/fAntiLambdaPtVskstar", "AntiLambda p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); + registryTriggerQA.add("LD/tight/fSE_particle", "Same Event distribution;k* (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("LD/tight/fSE_antiparticle", "Same Event distribution;k* (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("LD/tight/fDeuteronKstarVsPt", "k* vs Deuteron p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("LD/tight/fAntiDeuteronKstarVsPt", "k* vs AntiDeuteron p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("LD/tight/fLambdaKstarVsPt", "k* vs Lambda p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("LD/tight/fAntiLambdaKstarVsPt", "k* vs AntiLambda p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); // for phid registryTriggerQA.add("PhiD/all/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("PhiD/all/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); - registryTriggerQA.add("PhiD/all/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registryTriggerQA.add("PhiD/all/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registryTriggerQA.add("PhiD/all/fPhiPtVskstar", "Phi p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("PhiD/all/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("PhiD/all/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("PhiD/all/fPhiInvMassVskstar", "#phi mass vs k^{*};M_{K^{+}K^{-}} (GeV/c^{2});k^{*} (GeV/c)", HistType::kTH2F, {Binning.invMassRho, Binning.kstar}); + registryTriggerQA.add("PhiD/all/fSE_particle", "Same Event distribution;k* (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("PhiD/all/fSE_antiparticle", "Same Event distribution;k* (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("PhiD/all/fPhiKstarVsPt", "k* vs Phi p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("PhiD/all/fDeuteronKstarVsPt", "k* vs Deuteron p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("PhiD/all/fAntiDeuteronKstarVsPt", "k* vs AntiDeuteron p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("PhiD/all/fPhiKstarVsInvMass", "k* vs #phi mass;k* (GeV/c);M_{K^{+}K^{-}} (GeV/c^{2});", HistType::kTH2F, {Binning.kstar, Binning.invMassPhi}); registryTriggerQA.add("PhiD/loose/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("PhiD/loose/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); - registryTriggerQA.add("PhiD/loose/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registryTriggerQA.add("PhiD/loose/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registryTriggerQA.add("PhiD/loose/fPhiPtVskstar", "Phi p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("PhiD/loose/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("PhiD/loose/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("PhiD/loose/fPhiInvMassVskstar", "#phi mass vs k^{*};M_{K^{+}K^{-}} (GeV/c^{2});k^{*} (GeV/c)", HistType::kTH2F, {Binning.invMassRho, Binning.kstar}); + registryTriggerQA.add("PhiD/loose/fSE_particle", "Same Event distribution;k* (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("PhiD/loose/fSE_antiparticle", "Same Event distribution;k* (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("PhiD/loose/fPhiKstarVsPt", "k* vs Phi p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("PhiD/loose/fDeuteronKstarVsPt", "k* vs Deuteron p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("PhiD/loose/fAntiDeuteronKstarVsPt", "k* vs AntiDeuteron p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("PhiD/loose/fPhiKstarVsInvMass", "k* vs #phi mass;k* (GeV/c);M_{K^{+}K^{-}} (GeV/c^{2})", HistType::kTH2F, {Binning.kstar, Binning.invMassPhi}); registryTriggerQA.add("PhiD/tight/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("PhiD/tight/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); - registryTriggerQA.add("PhiD/tight/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registryTriggerQA.add("PhiD/tight/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registryTriggerQA.add("PhiD/tight/fPhiPtVskstar", "Phi p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("PhiD/tight/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("PhiD/tight/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("PhiD/tight/fPhiInvMassVskstar", "#phi mass vs k^{*};M_{K^{+}K^{-}} (GeV/c^{2});k^{*} (GeV/c)", HistType::kTH2F, {Binning.invMassRho, Binning.kstar}); + registryTriggerQA.add("PhiD/tight/fSE_particle", "Same Event distribution;k* (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("PhiD/tight/fSE_antiparticle", "Same Event distribution;k* (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("PhiD/tight/fPhiKstarVsPt", "k* vs Phi p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("PhiD/tight/fDeuteronKstarVsPt", "k* vs Deuteron p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("PhiD/tight/fAntiDeuteronKstarVsPt", "k* vs AntiDeuteron p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("PhiD/tight/fPhiKstarVsInvMass", "k* vs #phi mass;k* (GeV/c);M_{K^{+}K^{-}} (GeV/c^{2})", HistType::kTH2F, {Binning.kstar, Binning.invMassPhi}); // for rhod registryTriggerQA.add("RhoD/all/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("RhoD/all/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); - registryTriggerQA.add("RhoD/all/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registryTriggerQA.add("RhoD/all/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registryTriggerQA.add("RhoD/all/fRhoPtVskstar", "Rho p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("RhoD/all/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("RhoD/all/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("RhoD/all/fRhoInvMassVskstar", "#rho mass vs k^{*};M_{#pi^{+}#pi^{-}} (GeV/c^{2});k^{*} (GeV/c)", HistType::kTH2F, {Binning.invMassRho, Binning.kstar}); + registryTriggerQA.add("RhoD/all/fSE_particle", "Same Event distribution;k* (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("RhoD/all/fSE_antiparticle", "Same Event distribution;k* (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("RhoD/all/fRhoKstarVsPt", "k* vs Rho p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("RhoD/all/fDeuteronKstarVsPt", "k* vs Deuteron p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("RhoD/all/fAntiDeuteronKstarVsPt", "k* vs AntiDeuteron p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("RhoD/all/fRhoKstarVsInvMass", "k* vs #rho mass;k* (GeV/c);M_{#pi^{+}#pi^{-}} (GeV/c^{2})", HistType::kTH2F, {Binning.kstar, Binning.invMassRho}); registryTriggerQA.add("RhoD/loose/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("RhoD/loose/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); - registryTriggerQA.add("RhoD/loose/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registryTriggerQA.add("RhoD/loose/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registryTriggerQA.add("RhoD/loose/fRhoPtVskstar", "Rho p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("RhoD/loose/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("RhoD/loose/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("RhoD/loose/fRhoInvMassVskstar", "#rho mass vs k^{*};M_{#pi^{+}#pi^{-}} (GeV/c^{2});k^{*} (GeV/c)", HistType::kTH2F, {Binning.invMassRho, Binning.kstar}); + registryTriggerQA.add("RhoD/loose/fSE_particle", "Same Event distribution;k* (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("RhoD/loose/fSE_antiparticle", "Same Event distribution;k* (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("RhoD/loose/fRhoKstarVsPt", "k* vs Rho p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("RhoD/loose/fDeuteronKstarVsPt", "k* vs Deuteron p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("RhoD/loose/fAntiDeuteronKstarVsPt", "k* vs AntiDeuteron p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("RhoD/loose/fRhoKstarVsInvMass", "k* vs #rho mass;k* (GeV/c);M_{#pi^{+}#pi^{-}} (GeV/c^{2})", HistType::kTH2F, {Binning.kstar, Binning.invMassRho}); registryTriggerQA.add("RhoD/tight/fMultiplicity", "Multiplicity;Mult;Entries", HistType::kTH1F, {Binning.multiplicity}); registryTriggerQA.add("RhoD/tight/fZvtx", "Zvtx;Z_{vtx};Entries", HistType::kTH1F, {Binning.zvtx}); - registryTriggerQA.add("RhoD/tight/fSE_particle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registryTriggerQA.add("RhoD/tight/fSE_antiparticle", "Same Event distribution;k^{*} (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); - registryTriggerQA.add("RhoD/tight/fRhoPtVskstar", "Rho p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("RhoD/tight/fDeuteronPtVskstar", "Deuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("RhoD/tight/fAntiDeuteronPtVskstar", "AntiDeuteron p_{T} vs k^{*};k^{*} (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.momentum, Binning.kstar}}); - registryTriggerQA.add("RhoD/tight/fRhoInvMassVskstar", "#rho mass vs k^{*};M_{#pi^{+}#pi^{-}} (GeV/c^{2});k^{*} (GeV/c)", HistType::kTH2F, {Binning.invMassRho, Binning.kstar}); + registryTriggerQA.add("RhoD/tight/fSE_particle", "Same Event distribution;k* (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("RhoD/tight/fSE_antiparticle", "Same Event distribution;k* (GeV/c);Entries", HistType::kTH1F, {Binning.kstar}); + registryTriggerQA.add("RhoD/tight/fRhoKstarVsPt", "k* vs Rho p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("RhoD/tight/fDeuteronKstarVsPt", "k* vs Deuteron p_{T};k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("RhoD/tight/fAntiDeuteronKstarVsPt", "AntiDeuteron p_{T} vs k*;k* (GeV/c);p_{T} (GeV/c)", {HistType::kTH2F, {Binning.kstar, Binning.momentum}}); + registryTriggerQA.add("RhoD/tight/fRhoKstarVsInvMass", "k* vs #rho mass;k* (GeV/c);M_{#pi^{+}#pi^{-}} (GeV/c^{2})", HistType::kTH2F, {Binning.kstar, Binning.invMassRho}); } void initCCDB(int run) @@ -1122,19 +1122,19 @@ struct CFFilterAll { if (trackName == std::string("Pion")) { nsigmaITS = track.itsNSigmaPi(); nsigmaTPC = track.tpcNSigmaPi(); - nsigmaTPCTOF = RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPi(), track.tofNSigmaPi()); + nsigmaTPCTOF = std::hypot(track.tpcNSigmaPi(), track.tofNSigmaPi()); } else if (trackName == std::string("Kaon")) { nsigmaITS = track.itsNSigmaKa(); nsigmaTPC = track.tpcNSigmaKa(); - nsigmaTPCTOF = RecoDecay::sqrtSumOfSquares(track.tpcNSigmaKa(), track.tofNSigmaKa()); + nsigmaTPCTOF = std::hypot(track.tpcNSigmaKa(), track.tofNSigmaKa()); } else if (trackName == std::string("Proton")) { nsigmaITS = track.itsNSigmaPr(); nsigmaTPC = track.tpcNSigmaPr(); - nsigmaTPCTOF = RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPr(), track.tofNSigmaPr()); + nsigmaTPCTOF = std::hypot(track.tpcNSigmaPr(), track.tofNSigmaPr()); } else if (trackName == std::string("Deuteron")) { nsigmaITS = track.itsNSigmaDe(); nsigmaTPC = track.tpcNSigmaDe(); - nsigmaTPCTOF = RecoDecay::sqrtSumOfSquares(track.tpcNSigmaDe(), track.tofNSigmaDe()); + nsigmaTPCTOF = std::hypot(track.tpcNSigmaDe(), track.tofNSigmaDe()); } else { LOG(fatal) << "Unsupported track type"; } @@ -1343,22 +1343,22 @@ struct CFFilterAll { registryParticleQA.fill(HIST("TrackQA/Before/Pion/fNsigmaITS"), track.p(), track.itsNSigmaPi()); registryParticleQA.fill(HIST("TrackQA/Before/Pion/fNsigmaTPC"), track.p(), track.tpcNSigmaPi()); registryParticleQA.fill(HIST("TrackQA/Before/Pion/fNsigmaTOF"), track.p(), track.tofNSigmaPi()); - registryParticleQA.fill(HIST("TrackQA/Before/Pion/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPi(), track.tofNSigmaPi())); + registryParticleQA.fill(HIST("TrackQA/Before/Pion/fNsigmaTPCTOF"), track.p(), std::hypot(track.tpcNSigmaPi(), track.tofNSigmaPi())); registryParticleQA.fill(HIST("TrackQA/Before/Kaon/fNsigmaITS"), track.p(), track.itsNSigmaKa()); registryParticleQA.fill(HIST("TrackQA/Before/Kaon/fNsigmaTPC"), track.p(), track.tpcNSigmaKa()); registryParticleQA.fill(HIST("TrackQA/Before/Kaon/fNsigmaTOF"), track.p(), track.tofNSigmaKa()); - registryParticleQA.fill(HIST("TrackQA/Before/Kaon/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaKa(), track.tofNSigmaKa())); + registryParticleQA.fill(HIST("TrackQA/Before/Kaon/fNsigmaTPCTOF"), track.p(), std::hypot(track.tpcNSigmaKa(), track.tofNSigmaKa())); registryParticleQA.fill(HIST("TrackQA/Before/Proton/fNsigmaITS"), track.p(), track.itsNSigmaPr()); registryParticleQA.fill(HIST("TrackQA/Before/Proton/fNsigmaTPC"), track.p(), track.tpcNSigmaPr()); registryParticleQA.fill(HIST("TrackQA/Before/Proton/fNsigmaTOF"), track.p(), track.tofNSigmaPr()); - registryParticleQA.fill(HIST("TrackQA/Before/Proton/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPr(), track.tofNSigmaPr())); + registryParticleQA.fill(HIST("TrackQA/Before/Proton/fNsigmaTPCTOF"), track.p(), std::hypot(track.tpcNSigmaPr(), track.tofNSigmaPr())); registryParticleQA.fill(HIST("TrackQA/Before/Deuteron/fNsigmaITS"), track.p(), track.itsNSigmaDe()); registryParticleQA.fill(HIST("TrackQA/Before/Deuteron/fNsigmaTPC"), track.p(), track.tpcNSigmaDe()); registryParticleQA.fill(HIST("TrackQA/Before/Deuteron/fNsigmaTOF"), track.p(), track.tofNSigmaDe()); - registryParticleQA.fill(HIST("TrackQA/Before/Deuteron/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaDe(), track.tofNSigmaDe())); + registryParticleQA.fill(HIST("TrackQA/Before/Deuteron/fNsigmaTPCTOF"), track.p(), std::hypot(track.tpcNSigmaDe(), track.tofNSigmaDe())); if (checkTrack(track, std::string("Pion")) && checkTrackPid(track, std::string("Pion"))) { vecPion.emplace_back(track.pt(), track.eta(), track.phi(), o2::constants::physics::MassPionCharged); @@ -1373,7 +1373,7 @@ struct CFFilterAll { registryParticleQA.fill(HIST("TrackQA/After/Pion/fNsigmaIts"), track.p(), track.itsNSigmaPi()); registryParticleQA.fill(HIST("TrackQA/After/Pion/fNsigmaTpc"), track.p(), track.tpcNSigmaPi()); registryParticleQA.fill(HIST("TrackQA/After/Pion/fNsigmaTof"), track.p(), track.tofNSigmaPi()); - registryParticleQA.fill(HIST("TrackQA/After/Pion/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPi(), track.tofNSigmaPi())); + registryParticleQA.fill(HIST("TrackQA/After/Pion/fNsigmaTpcTof"), track.p(), std::hypot(track.tpcNSigmaPi(), track.tofNSigmaPi())); registryParticleQA.fill(HIST("TrackQA/After/Pion/fItsSignal"), track.p(), itsSignal(track)); registryParticleQA.fill(HIST("TrackQA/After/Pion/fTpcSignal"), track.p(), track.tpcSignal()); @@ -1407,7 +1407,7 @@ struct CFFilterAll { registryParticleQA.fill(HIST("TrackQA/After/Kaon/fNsigmaIts"), track.p(), track.itsNSigmaKa()); registryParticleQA.fill(HIST("TrackQA/After/Kaon/fNsigmaTpc"), track.p(), track.tpcNSigmaKa()); registryParticleQA.fill(HIST("TrackQA/After/Kaon/fNsigmaTof"), track.p(), track.tofNSigmaKa()); - registryParticleQA.fill(HIST("TrackQA/After/Kaon/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaKa(), track.tofNSigmaKa())); + registryParticleQA.fill(HIST("TrackQA/After/Kaon/fNsigmaTpcTof"), track.p(), std::hypot(track.tpcNSigmaKa(), track.tofNSigmaKa())); registryParticleQA.fill(HIST("TrackQA/After/Kaon/fItsSignal"), track.p(), itsSignal(track)); registryParticleQA.fill(HIST("TrackQA/After/Kaon/fTpcSignal"), track.p(), track.tpcSignal()); @@ -1441,7 +1441,7 @@ struct CFFilterAll { registryParticleQA.fill(HIST("TrackQA/After/Proton/fNsigmaIts"), track.p(), track.itsNSigmaPr()); registryParticleQA.fill(HIST("TrackQA/After/Proton/fNsigmaTpc"), track.p(), track.tpcNSigmaPr()); registryParticleQA.fill(HIST("TrackQA/After/Proton/fNsigmaTof"), track.p(), track.tofNSigmaPr()); - registryParticleQA.fill(HIST("TrackQA/After/Proton/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPr(), track.tofNSigmaPr())); + registryParticleQA.fill(HIST("TrackQA/After/Proton/fNsigmaTpcTof"), track.p(), std::hypot(track.tpcNSigmaPr(), track.tofNSigmaPr())); registryParticleQA.fill(HIST("TrackQA/After/Proton/fItsSignal"), track.p(), itsSignal(track)); registryParticleQA.fill(HIST("TrackQA/After/Proton/fTpcSignal"), track.p(), track.tpcSignal()); @@ -1475,7 +1475,7 @@ struct CFFilterAll { registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fNsigmaIts"), track.p(), track.itsNSigmaDe()); registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fNsigmaTpc"), track.p(), track.tpcNSigmaDe()); registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fNsigmaTof"), track.p(), track.tofNSigmaDe()); - registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaDe(), track.tofNSigmaDe())); + registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fNsigmaTpcTof"), track.p(), std::hypot(track.tpcNSigmaDe(), track.tofNSigmaDe())); registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fItsSignal"), track.p(), itsSignal(track)); registryParticleQA.fill(HIST("TrackQA/After/Deuteron/fTpcSignal"), track.p(), track.tpcSignal()); @@ -1509,22 +1509,22 @@ struct CFFilterAll { registryParticleQA.fill(HIST("TrackQA/Before/AntiPion/fNsigmaITS"), track.p(), track.itsNSigmaPi()); registryParticleQA.fill(HIST("TrackQA/Before/AntiPion/fNsigmaTPC"), track.p(), track.tpcNSigmaPi()); registryParticleQA.fill(HIST("TrackQA/Before/AntiPion/fNsigmaTOF"), track.p(), track.tofNSigmaPi()); - registryParticleQA.fill(HIST("TrackQA/Before/AntiPion/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPi(), track.tofNSigmaPi())); + registryParticleQA.fill(HIST("TrackQA/Before/AntiPion/fNsigmaTPCTOF"), track.p(), std::hypot(track.tpcNSigmaPi(), track.tofNSigmaPi())); registryParticleQA.fill(HIST("TrackQA/Before/AntiKaon/fNsigmaITS"), track.p(), track.itsNSigmaKa()); registryParticleQA.fill(HIST("TrackQA/Before/AntiKaon/fNsigmaTPC"), track.p(), track.tpcNSigmaKa()); registryParticleQA.fill(HIST("TrackQA/Before/AntiKaon/fNsigmaTOF"), track.p(), track.tofNSigmaKa()); - registryParticleQA.fill(HIST("TrackQA/Before/AntiKaon/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaKa(), track.tofNSigmaKa())); + registryParticleQA.fill(HIST("TrackQA/Before/AntiKaon/fNsigmaTPCTOF"), track.p(), std::hypot(track.tpcNSigmaKa(), track.tofNSigmaKa())); registryParticleQA.fill(HIST("TrackQA/Before/AntiProton/fNsigmaITS"), track.p(), track.itsNSigmaPr()); registryParticleQA.fill(HIST("TrackQA/Before/AntiProton/fNsigmaTPC"), track.p(), track.tpcNSigmaPr()); registryParticleQA.fill(HIST("TrackQA/Before/AntiProton/fNsigmaTOF"), track.p(), track.tofNSigmaPr()); - registryParticleQA.fill(HIST("TrackQA/Before/AntiProton/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPr(), track.tofNSigmaPr())); + registryParticleQA.fill(HIST("TrackQA/Before/AntiProton/fNsigmaTPCTOF"), track.p(), std::hypot(track.tpcNSigmaPr(), track.tofNSigmaPr())); registryParticleQA.fill(HIST("TrackQA/Before/AntiDeuteron/fNsigmaITS"), track.p(), track.itsNSigmaDe()); registryParticleQA.fill(HIST("TrackQA/Before/AntiDeuteron/fNsigmaTPC"), track.p(), track.tpcNSigmaDe()); registryParticleQA.fill(HIST("TrackQA/Before/AntiDeuteron/fNsigmaTOF"), track.p(), track.tofNSigmaDe()); - registryParticleQA.fill(HIST("TrackQA/Before/AntiDeuteron/fNsigmaTPCTOF"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaDe(), track.tofNSigmaDe())); + registryParticleQA.fill(HIST("TrackQA/Before/AntiDeuteron/fNsigmaTPCTOF"), track.p(), std::hypot(track.tpcNSigmaDe(), track.tofNSigmaDe())); if (checkTrack(track, std::string("Pion")) && checkTrackPid(track, std::string("Pion"))) { vecAntiPion.emplace_back(track.pt(), track.eta(), track.phi(), o2::constants::physics::MassPionCharged); @@ -1539,7 +1539,7 @@ struct CFFilterAll { registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fNsigmaIts"), track.p(), track.itsNSigmaPi()); registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fNsigmaTpc"), track.p(), track.tpcNSigmaPi()); registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fNsigmaTof"), track.p(), track.tofNSigmaPi()); - registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPi(), track.tofNSigmaPi())); + registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fNsigmaTpcTof"), track.p(), std::hypot(track.tpcNSigmaPi(), track.tofNSigmaPi())); registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fItsSignal"), track.p(), itsSignal(track)); registryParticleQA.fill(HIST("TrackQA/After/AntiPion/fTpcSignal"), track.p(), track.tpcSignal()); @@ -1573,7 +1573,7 @@ struct CFFilterAll { registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fNsigmaIts"), track.p(), track.itsNSigmaKa()); registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fNsigmaTpc"), track.p(), track.tpcNSigmaKa()); registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fNsigmaTof"), track.p(), track.tofNSigmaKa()); - registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaKa(), track.tofNSigmaKa())); + registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fNsigmaTpcTof"), track.p(), std::hypot(track.tpcNSigmaKa(), track.tofNSigmaKa())); registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fItsSignal"), track.p(), itsSignal(track)); registryParticleQA.fill(HIST("TrackQA/After/AntiKaon/fTpcSignal"), track.p(), track.tpcSignal()); @@ -1607,7 +1607,7 @@ struct CFFilterAll { registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fNsigmaIts"), track.p(), track.itsNSigmaPr()); registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fNsigmaTpc"), track.p(), track.tpcNSigmaPr()); registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fNsigmaTof"), track.p(), track.tofNSigmaPr()); - registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaPr(), track.tofNSigmaPr())); + registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fNsigmaTpcTof"), track.p(), std::hypot(track.tpcNSigmaPr(), track.tofNSigmaPr())); registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fItsSignal"), track.p(), itsSignal(track)); registryParticleQA.fill(HIST("TrackQA/After/AntiProton/fTpcSignal"), track.p(), track.tpcSignal()); @@ -1641,7 +1641,7 @@ struct CFFilterAll { registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fNsigmaIts"), track.p(), track.itsNSigmaDe()); registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fNsigmaTpc"), track.p(), track.tpcNSigmaDe()); registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fNsigmaTof"), track.p(), track.tofNSigmaDe()); - registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fNsigmaTpcTof"), track.p(), RecoDecay::sqrtSumOfSquares(track.tpcNSigmaDe(), track.tofNSigmaDe())); + registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fNsigmaTpcTof"), track.p(), std::hypot(track.tpcNSigmaDe(), track.tofNSigmaDe())); registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fItsSignal"), track.p(), itsSignal(track)); registryParticleQA.fill(HIST("TrackQA/After/AntiDeuteron/fTpcSignal"), track.p(), track.tpcSignal()); @@ -1677,7 +1677,7 @@ struct CFFilterAll { continue; } - float lambdaPt = RecoDecay::sqrtSumOfSquares(mStraHelper.v0.momentum[0], mStraHelper.v0.momentum[1]); + float lambdaPt = std::hypot(mStraHelper.v0.momentum[0], mStraHelper.v0.momentum[1]); float lambdaPos = std::hypot(mStraHelper.v0.position[0] - col.posX(), mStraHelper.v0.position[1] - col.posY(), mStraHelper.v0.position[2] - col.posZ()); float lambdaRadius = std::hypot(mStraHelper.v0.position[0], mStraHelper.v0.position[1]); float lambdaEta = RecoDecay::eta(std::array{mStraHelper.v0.momentum[0], mStraHelper.v0.momentum[1], mStraHelper.v0.momentum[2]}); @@ -1844,25 +1844,25 @@ struct CFFilterAll { registryTriggerQA.fill(HIST("PPP/all/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PPP/all/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PPP/all/fSE_particle"), q3); - registryTriggerQA.fill(HIST("PPP/all/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); - registryTriggerQA.fill(HIST("PPP/all/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); - registryTriggerQA.fill(HIST("PPP/all/fProtonPtVsQ3"), vecProton.at(p3).Pt(), q3); + registryTriggerQA.fill(HIST("PPP/all/fProtonQ3VsPt"), q3, vecProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PPP/all/fProtonQ3VsPt"), q3, vecProton.at(p2).Pt()); + registryTriggerQA.fill(HIST("PPP/all/fProtonQ3VsPt"), q3, vecProton.at(p3).Pt()); if (q3 < TriggerSelections.limits->get("Loose Limit", "PPP")) { signalLooseLimit[cf_trigger::kPPP] += 1; registryTriggerQA.fill(HIST("PPP/loose/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PPP/loose/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PPP/loose/fSE_particle"), q3); - registryTriggerQA.fill(HIST("PPP/loose/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); - registryTriggerQA.fill(HIST("PPP/loose/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); - registryTriggerQA.fill(HIST("PPP/loose/fProtonPtVsQ3"), vecProton.at(p3).Pt(), q3); + registryTriggerQA.fill(HIST("PPP/loose/fProtonQ3VsPt"), q3, vecProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PPP/loose/fProtonQ3VsPt"), q3, vecProton.at(p2).Pt()); + registryTriggerQA.fill(HIST("PPP/loose/fProtonQ3VsPt"), q3, vecProton.at(p3).Pt()); if (q3 < TriggerSelections.limits->get("Tight Limit", "PPP")) { signalTightLimit[cf_trigger::kPPP] += 1; registryTriggerQA.fill(HIST("PPP/tight/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PPP/tight/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PPP/tight/fSE_particle"), q3); - registryTriggerQA.fill(HIST("PPP/tight/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); - registryTriggerQA.fill(HIST("PPP/tight/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); - registryTriggerQA.fill(HIST("PPP/tight/fProtonPtVsQ3"), vecProton.at(p3).Pt(), q3); + registryTriggerQA.fill(HIST("PPP/tight/fProtonQ3VsPt"), q3, vecProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PPP/tight/fProtonQ3VsPt"), q3, vecProton.at(p2).Pt()); + registryTriggerQA.fill(HIST("PPP/tight/fProtonQ3VsPt"), q3, vecProton.at(p3).Pt()); } } } @@ -1875,25 +1875,25 @@ struct CFFilterAll { registryTriggerQA.fill(HIST("PPP/all/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PPP/all/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PPP/all/fSE_antiparticle"), q3); - registryTriggerQA.fill(HIST("PPP/all/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); - registryTriggerQA.fill(HIST("PPP/all/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); - registryTriggerQA.fill(HIST("PPP/all/fAntiProtonPtVsQ3"), vecAntiProton.at(p3).Pt(), q3); + registryTriggerQA.fill(HIST("PPP/all/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PPP/all/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p2).Pt()); + registryTriggerQA.fill(HIST("PPP/all/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p3).Pt()); if (q3 < TriggerSelections.limits->get("Loose Limit", "PPP")) { signalLooseLimit[cf_trigger::kPPP] += 1; registryTriggerQA.fill(HIST("PPP/loose/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PPP/loose/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PPP/loose/fSE_antiparticle"), q3); - registryTriggerQA.fill(HIST("PPP/loose/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); - registryTriggerQA.fill(HIST("PPP/loose/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); - registryTriggerQA.fill(HIST("PPP/loose/fAntiProtonPtVsQ3"), vecAntiProton.at(p3).Pt(), q3); + registryTriggerQA.fill(HIST("PPP/loose/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PPP/loose/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p2).Pt()); + registryTriggerQA.fill(HIST("PPP/loose/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p3).Pt()); if (q3 < TriggerSelections.limits->get("Tight Limit", "PPP")) { signalTightLimit[cf_trigger::kPPP] += 1; registryTriggerQA.fill(HIST("PPP/tight/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PPP/tight/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PPP/tight/fSE_antiparticle"), q3); - registryTriggerQA.fill(HIST("PPP/tight/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); - registryTriggerQA.fill(HIST("PPP/tight/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); - registryTriggerQA.fill(HIST("PPP/tight/fAntiProtonPtVsQ3"), vecAntiProton.at(p3).Pt(), q3); + registryTriggerQA.fill(HIST("PPP/tight/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PPP/tight/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p2).Pt()); + registryTriggerQA.fill(HIST("PPP/tight/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p3).Pt()); } } } @@ -1912,25 +1912,25 @@ struct CFFilterAll { registryTriggerQA.fill(HIST("PPL/all/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PPL/all/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PPL/all/fSE_particle"), q3); - registryTriggerQA.fill(HIST("PPL/all/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); - registryTriggerQA.fill(HIST("PPL/all/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); - registryTriggerQA.fill(HIST("PPL/all/fLambdaPtVsQ3"), vecLambda.at(l1).Pt(), q3); + registryTriggerQA.fill(HIST("PPL/all/fProtonQ3VsPt"), q3, vecProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PPL/all/fProtonQ3VsPt"), q3, vecProton.at(p2).Pt()); + registryTriggerQA.fill(HIST("PPL/all/fLambdaQ3VsPt"), q3, vecLambda.at(l1).Pt()); if (q3 < TriggerSelections.limits->get("Loose Limit", "PPL")) { signalLooseLimit[cf_trigger::kPPL] += 1; registryTriggerQA.fill(HIST("PPL/loose/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PPL/loose/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PPL/loose/fSE_particle"), q3); - registryTriggerQA.fill(HIST("PPL/loose/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); - registryTriggerQA.fill(HIST("PPL/loose/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); - registryTriggerQA.fill(HIST("PPL/loose/fLambdaPtVsQ3"), vecLambda.at(l1).Pt(), q3); + registryTriggerQA.fill(HIST("PPL/loose/fProtonQ3VsPt"), q3, vecProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PPL/loose/fProtonQ3VsPt"), q3, vecProton.at(p2).Pt()); + registryTriggerQA.fill(HIST("PPL/loose/fLambdaQ3VsPt"), q3, vecLambda.at(l1).Pt()); if (q3 < TriggerSelections.limits->get("Tight Limit", "PPL")) { signalTightLimit[cf_trigger::kPPL] += 1; registryTriggerQA.fill(HIST("PPL/tight/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PPL/tight/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PPL/tight/fSE_particle"), q3); - registryTriggerQA.fill(HIST("PPL/tight/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); - registryTriggerQA.fill(HIST("PPL/tight/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); - registryTriggerQA.fill(HIST("PPL/tight/fLambdaPtVsQ3"), vecLambda.at(l1).Pt(), q3); + registryTriggerQA.fill(HIST("PPL/tight/fProtonQ3VsPt"), q3, vecProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PPL/tight/fProtonQ3VsPt"), q3, vecProton.at(p2).Pt()); + registryTriggerQA.fill(HIST("PPL/tight/fLambdaQ3VsPt"), q3, vecLambda.at(l1).Pt()); } } } @@ -1945,26 +1945,26 @@ struct CFFilterAll { q3 = getQ3(vecAntiProton.at(p1), vecAntiProton.at(p2), vecAntiLambda.at(l1)); registryTriggerQA.fill(HIST("PPL/all/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PPL/all/fZvtx"), col.posZ()); - registryTriggerQA.fill(HIST("PPL/all/fSE_particle"), q3); - registryTriggerQA.fill(HIST("PPL/all/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); - registryTriggerQA.fill(HIST("PPL/all/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); - registryTriggerQA.fill(HIST("PPL/all/fAntiLambdaPtVsQ3"), vecAntiLambda.at(l1).Pt(), q3); + registryTriggerQA.fill(HIST("PPL/all/fSE_antiparticle"), q3); + registryTriggerQA.fill(HIST("PPL/all/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PPL/all/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p2).Pt()); + registryTriggerQA.fill(HIST("PPL/all/fAntiLambdaQ3VsPt"), q3, vecAntiLambda.at(l1).Pt()); if (q3 < TriggerSelections.limits->get("Loose Limit", "PPL")) { signalLooseLimit[cf_trigger::kPPL] += 1; registryTriggerQA.fill(HIST("PPL/loose/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PPL/loose/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PPL/loose/fSE_antiparticle"), q3); - registryTriggerQA.fill(HIST("PPL/loose/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); - registryTriggerQA.fill(HIST("PPL/loose/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); - registryTriggerQA.fill(HIST("PPL/loose/fAntiLambdaPtVsQ3"), vecAntiLambda.at(l1).Pt(), q3); + registryTriggerQA.fill(HIST("PPL/loose/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PPL/loose/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p2).Pt()); + registryTriggerQA.fill(HIST("PPL/loose/fAntiLambdaQ3VsPt"), q3, vecAntiLambda.at(l1).Pt()); if (q3 < TriggerSelections.limits->get("Tight Limit", "PPL")) { signalTightLimit[cf_trigger::kPPL] += 1; registryTriggerQA.fill(HIST("PPL/tight/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PPL/tight/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PPL/tight/fSE_antiparticle"), q3); - registryTriggerQA.fill(HIST("PPL/tight/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); - registryTriggerQA.fill(HIST("PPL/tight/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); - registryTriggerQA.fill(HIST("PPL/tight/fAntiLambdaPtVsQ3"), vecAntiLambda.at(l1).Pt(), q3); + registryTriggerQA.fill(HIST("PPL/tight/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PPL/tight/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p2).Pt()); + registryTriggerQA.fill(HIST("PPL/tight/fAntiLambdaQ3VsPt"), q3, vecAntiLambda.at(l1).Pt()); } } } @@ -1986,25 +1986,25 @@ struct CFFilterAll { registryTriggerQA.fill(HIST("PLL/all/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PLL/all/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PLL/all/fSE_particle"), q3); - registryTriggerQA.fill(HIST("PLL/all/fLambdaPtVsQ3"), vecLambda.at(l1).Pt(), q3); - registryTriggerQA.fill(HIST("PLL/all/fLambdaPtVsQ3"), vecLambda.at(l2).Pt(), q3); - registryTriggerQA.fill(HIST("PLL/all/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PLL/all/fLambdaQ3VsPt"), q3, vecLambda.at(l1).Pt()); + registryTriggerQA.fill(HIST("PLL/all/fLambdaQ3VsPt"), q3, vecLambda.at(l2).Pt()); + registryTriggerQA.fill(HIST("PLL/all/fProtonQ3VsPt"), q3, vecProton.at(p1).Pt()); if (q3 < TriggerSelections.limits->get("Loose Limit", "PLL")) { signalLooseLimit[cf_trigger::kPLL] += 1; registryTriggerQA.fill(HIST("PLL/loose/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PLL/loose/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PLL/loose/fSE_particle"), q3); - registryTriggerQA.fill(HIST("PLL/loose/fLambdaPtVsQ3"), vecLambda.at(l1).Pt(), q3); - registryTriggerQA.fill(HIST("PLL/loose/fLambdaPtVsQ3"), vecLambda.at(l2).Pt(), q3); - registryTriggerQA.fill(HIST("PLL/loose/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PLL/loose/fLambdaQ3VsPt"), q3, vecLambda.at(l1).Pt()); + registryTriggerQA.fill(HIST("PLL/loose/fLambdaQ3VsPt"), q3, vecLambda.at(l2).Pt()); + registryTriggerQA.fill(HIST("PLL/loose/fProtonQ3VsPt"), q3, vecProton.at(p1).Pt()); if (q3 < TriggerSelections.limits->get("Tight Limit", "PLL")) { signalTightLimit[cf_trigger::kPLL] += 1; registryTriggerQA.fill(HIST("PLL/tight/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PLL/tight/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PLL/tight/fSE_particle"), q3); - registryTriggerQA.fill(HIST("PLL/tight/fLambdaPtVsQ3"), vecLambda.at(l1).Pt(), q3); - registryTriggerQA.fill(HIST("PLL/tight/fLambdaPtVsQ3"), vecLambda.at(l2).Pt(), q3); - registryTriggerQA.fill(HIST("PLL/tight/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PLL/tight/fLambdaQ3VsPt"), q3, vecLambda.at(l1).Pt()); + registryTriggerQA.fill(HIST("PLL/tight/fLambdaQ3VsPt"), q3, vecLambda.at(l2).Pt()); + registryTriggerQA.fill(HIST("PLL/tight/fProtonQ3VsPt"), q3, vecProton.at(p1).Pt()); } } } @@ -2023,25 +2023,25 @@ struct CFFilterAll { registryTriggerQA.fill(HIST("PLL/all/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PLL/all/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PLL/all/fSE_antiparticle"), q3); - registryTriggerQA.fill(HIST("PLL/all/fAntiLambdaPtVsQ3"), vecAntiLambda.at(l1).Pt(), q3); - registryTriggerQA.fill(HIST("PLL/all/fAntiLambdaPtVsQ3"), vecAntiLambda.at(l2).Pt(), q3); - registryTriggerQA.fill(HIST("PLL/all/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PLL/all/fAntiLambdaQ3VsPt"), q3, vecAntiLambda.at(l1).Pt()); + registryTriggerQA.fill(HIST("PLL/all/fAntiLambdaQ3VsPt"), q3, vecAntiLambda.at(l2).Pt()); + registryTriggerQA.fill(HIST("PLL/all/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p1).Pt()); if (q3 < TriggerSelections.limits->get("Loose Limit", "PLL")) { signalLooseLimit[cf_trigger::kPLL] += 1; registryTriggerQA.fill(HIST("PLL/loose/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PLL/loose/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PLL/loose/fSE_antiparticle"), q3); - registryTriggerQA.fill(HIST("PLL/loose/fAntiLambdaPtVsQ3"), vecAntiLambda.at(l1).Pt(), q3); - registryTriggerQA.fill(HIST("PLL/loose/fAntiLambdaPtVsQ3"), vecAntiLambda.at(l2).Pt(), q3); - registryTriggerQA.fill(HIST("PLL/loose/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PLL/loose/fAntiLambdaQ3VsPt"), q3, vecAntiLambda.at(l1).Pt()); + registryTriggerQA.fill(HIST("PLL/loose/fAntiLambdaQ3VsPt"), q3, vecAntiLambda.at(l2).Pt()); + registryTriggerQA.fill(HIST("PLL/loose/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p1).Pt()); if (q3 < TriggerSelections.limits->get("Tight Limit", "PLL")) { signalTightLimit[cf_trigger::kPLL] += 1; registryTriggerQA.fill(HIST("PLL/tight/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PLL/tight/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PLL/tight/fSE_antiparticle"), q3); - registryTriggerQA.fill(HIST("PLL/tight/fAntiLambdaPtVsQ3"), vecAntiLambda.at(l1).Pt(), q3); - registryTriggerQA.fill(HIST("PLL/tight/fAntiLambdaPtVsQ3"), vecAntiLambda.at(l2).Pt(), q3); - registryTriggerQA.fill(HIST("PLL/tight/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); + registryTriggerQA.fill(HIST("PLL/tight/fAntiLambdaQ3VsPt"), q3, vecAntiLambda.at(l1).Pt()); + registryTriggerQA.fill(HIST("PLL/tight/fAntiLambdaQ3VsPt"), q3, vecAntiLambda.at(l2).Pt()); + registryTriggerQA.fill(HIST("PLL/tight/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p1).Pt()); } } } @@ -2062,25 +2062,25 @@ struct CFFilterAll { registryTriggerQA.fill(HIST("LLL/all/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("LLL/all/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("LLL/all/fSE_particle"), q3); - registryTriggerQA.fill(HIST("LLL/all/fLambdaPtVsQ3"), vecLambda.at(l1).Pt(), q3); - registryTriggerQA.fill(HIST("LLL/all/fLambdaPtVsQ3"), vecLambda.at(l2).Pt(), q3); - registryTriggerQA.fill(HIST("LLL/all/fLambdaPtVsQ3"), vecLambda.at(l3).Pt(), q3); + registryTriggerQA.fill(HIST("LLL/all/fLambdaQ3VsPt"), q3, vecLambda.at(l1).Pt()); + registryTriggerQA.fill(HIST("LLL/all/fLambdaQ3VsPt"), q3, vecLambda.at(l2).Pt()); + registryTriggerQA.fill(HIST("LLL/all/fLambdaQ3VsPt"), q3, vecLambda.at(l3).Pt()); if (q3 < TriggerSelections.limits->get("Loose Limit", "LLL")) { signalLooseLimit[cf_trigger::kLLL] += 1; registryTriggerQA.fill(HIST("LLL/loose/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("LLL/loose/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("LLL/loose/fSE_particle"), q3); - registryTriggerQA.fill(HIST("LLL/loose/fLambdaPtVsQ3"), vecLambda.at(l1).Pt(), q3); - registryTriggerQA.fill(HIST("LLL/loose/fLambdaPtVsQ3"), vecLambda.at(l2).Pt(), q3); - registryTriggerQA.fill(HIST("LLL/loose/fLambdaPtVsQ3"), vecLambda.at(l3).Pt(), q3); + registryTriggerQA.fill(HIST("LLL/loose/fLambdaQ3VsPt"), q3, vecLambda.at(l1).Pt()); + registryTriggerQA.fill(HIST("LLL/loose/fLambdaQ3VsPt"), q3, vecLambda.at(l2).Pt()); + registryTriggerQA.fill(HIST("LLL/loose/fLambdaQ3VsPt"), q3, vecLambda.at(l3).Pt()); if (q3 < TriggerSelections.limits->get("Tight Limit", "LLL")) { signalTightLimit[cf_trigger::kLLL] += 1; registryTriggerQA.fill(HIST("LLL/tight/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("LLL/tight/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("LLL/tight/fSE_particle"), q3); - registryTriggerQA.fill(HIST("LLL/tight/fLambdaPtVsQ3"), vecLambda.at(l1).Pt(), q3); - registryTriggerQA.fill(HIST("LLL/tight/fLambdaPtVsQ3"), vecLambda.at(l2).Pt(), q3); - registryTriggerQA.fill(HIST("LLL/tight/fLambdaPtVsQ3"), vecLambda.at(l3).Pt(), q3); + registryTriggerQA.fill(HIST("LLL/tight/fLambdaQ3VsPt"), q3, vecLambda.at(l1).Pt()); + registryTriggerQA.fill(HIST("LLL/tight/fLambdaQ3VsPt"), q3, vecLambda.at(l2).Pt()); + registryTriggerQA.fill(HIST("LLL/tight/fLambdaQ3VsPt"), q3, vecLambda.at(l3).Pt()); } } } @@ -2098,25 +2098,25 @@ struct CFFilterAll { registryTriggerQA.fill(HIST("LLL/all/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("LLL/all/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("LLL/all/fSE_antiparticle"), q3); - registryTriggerQA.fill(HIST("LLL/all/fLambdaPtVsQ3"), vecAntiLambda.at(l1).Pt(), q3); - registryTriggerQA.fill(HIST("LLL/all/fLambdaPtVsQ3"), vecAntiLambda.at(l2).Pt(), q3); - registryTriggerQA.fill(HIST("LLL/all/fLambdaPtVsQ3"), vecAntiLambda.at(l3).Pt(), q3); + registryTriggerQA.fill(HIST("LLL/all/fLambdaQ3VsPt"), q3, vecAntiLambda.at(l1).Pt()); + registryTriggerQA.fill(HIST("LLL/all/fLambdaQ3VsPt"), q3, vecAntiLambda.at(l2).Pt()); + registryTriggerQA.fill(HIST("LLL/all/fLambdaQ3VsPt"), q3, vecAntiLambda.at(l3).Pt()); if (q3 < TriggerSelections.limits->get("Loose Limit", "LLL")) { signalLooseLimit[cf_trigger::kLLL] += 1; registryTriggerQA.fill(HIST("LLL/loose/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("LLL/loose/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("LLL/loose/fSE_antiparticle"), q3); - registryTriggerQA.fill(HIST("LLL/loose/fLambdaPtVsQ3"), vecAntiLambda.at(l1).Pt(), q3); - registryTriggerQA.fill(HIST("LLL/loose/fLambdaPtVsQ3"), vecAntiLambda.at(l2).Pt(), q3); - registryTriggerQA.fill(HIST("LLL/loose/fLambdaPtVsQ3"), vecAntiLambda.at(l3).Pt(), q3); + registryTriggerQA.fill(HIST("LLL/loose/fLambdaQ3VsPt"), q3, vecAntiLambda.at(l1).Pt()); + registryTriggerQA.fill(HIST("LLL/loose/fLambdaQ3VsPt"), q3, vecAntiLambda.at(l2).Pt()); + registryTriggerQA.fill(HIST("LLL/loose/fLambdaQ3VsPt"), q3, vecAntiLambda.at(l3).Pt()); if (q3 < TriggerSelections.limits->get("Tight Limit", "LLL")) { signalTightLimit[cf_trigger::kLLL] += 1; registryTriggerQA.fill(HIST("LLL/tight/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("LLL/tight/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("LLL/tight/fSE_antiparticle"), q3); - registryTriggerQA.fill(HIST("LLL/tight/fLambdaPtVsQ3"), vecAntiLambda.at(l1).Pt(), q3); - registryTriggerQA.fill(HIST("LLL/tight/fLambdaPtVsQ3"), vecAntiLambda.at(l2).Pt(), q3); - registryTriggerQA.fill(HIST("LLL/tight/fLambdaPtVsQ3"), vecAntiLambda.at(l3).Pt(), q3); + registryTriggerQA.fill(HIST("LLL/tight/fLambdaQ3VsPt"), q3, vecAntiLambda.at(l1).Pt()); + registryTriggerQA.fill(HIST("LLL/tight/fLambdaQ3VsPt"), q3, vecAntiLambda.at(l2).Pt()); + registryTriggerQA.fill(HIST("LLL/tight/fLambdaQ3VsPt"), q3, vecAntiLambda.at(l3).Pt()); } } } @@ -2135,29 +2135,29 @@ struct CFFilterAll { registryTriggerQA.fill(HIST("PPPhi/all/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PPPhi/all/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PPPhi/all/fSE_particle"), q3); - registryTriggerQA.fill(HIST("PPPhi/all/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); - registryTriggerQA.fill(HIST("PPPhi/all/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); - registryTriggerQA.fill(HIST("PPPhi/all/fPhiPtVsQ3"), vecPhi.at(phi1).Pt(), q3); - registryTriggerQA.fill(HIST("PPPhi/all/fPhiInvMassVsQ3"), vecPhi.at(phi1).M(), q3); + registryTriggerQA.fill(HIST("PPPhi/all/fProtonQ3VsPt"), q3, vecProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PPPhi/all/fProtonQ3VsPt"), q3, vecProton.at(p2).Pt()); + registryTriggerQA.fill(HIST("PPPhi/all/fPhiQ3VsPt"), q3, vecPhi.at(phi1).Pt()); + registryTriggerQA.fill(HIST("PPPhi/all/fPhiQ3VsInvMass"), q3, vecPhi.at(phi1).M()); if (q3 < TriggerSelections.limits->get("Loose Limit", "PPPhi")) { signalLooseLimit[cf_trigger::kPPPhi] += 1; registryTriggerQA.fill(HIST("PPPhi/loose/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PPPhi/loose/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PPPhi/loose/fSE_particle"), q3); - registryTriggerQA.fill(HIST("PPPhi/loose/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); - registryTriggerQA.fill(HIST("PPPhi/loose/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); - registryTriggerQA.fill(HIST("PPPhi/loose/fPhiPtVsQ3"), vecPhi.at(phi1).Pt(), q3); - registryTriggerQA.fill(HIST("PPPhi/loose/fPhiInvMassVsQ3"), vecPhi.at(phi1).M(), q3); + registryTriggerQA.fill(HIST("PPPhi/loose/fProtonQ3VsPt"), q3, vecProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PPPhi/loose/fProtonQ3VsPt"), q3, vecProton.at(p2).Pt()); + registryTriggerQA.fill(HIST("PPPhi/loose/fPhiQ3VsPt"), q3, vecPhi.at(phi1).Pt()); + registryTriggerQA.fill(HIST("PPPhi/loose/fPhiQ3VsInvMass"), q3, vecPhi.at(phi1).M()); if (q3 < TriggerSelections.limits->get("Tight Limit", "PPPhi") && vecPhi.at(phi1).M() > PhiSelections.tightInvMassLow.value && vecPhi.at(phi1).M() < PhiSelections.tightInvMassUp.value) { signalTightLimit[cf_trigger::kPPPhi] += 1; registryTriggerQA.fill(HIST("PPPhi/tight/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PPPhi/tight/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PPPhi/tight/fSE_particle"), q3); - registryTriggerQA.fill(HIST("PPPhi/tight/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); - registryTriggerQA.fill(HIST("PPPhi/tight/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); - registryTriggerQA.fill(HIST("PPPhi/tight/fPhiPtVsQ3"), vecPhi.at(phi1).Pt(), q3); - registryTriggerQA.fill(HIST("PPPhi/tight/fPhiInvMassVsQ3"), vecPhi.at(phi1).M(), q3); + registryTriggerQA.fill(HIST("PPPhi/tight/fProtonQ3VsPt"), q3, vecProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PPPhi/tight/fProtonQ3VsPt"), q3, vecProton.at(p2).Pt()); + registryTriggerQA.fill(HIST("PPPhi/tight/fPhiQ3VsPt"), q3, vecPhi.at(phi1).Pt()); + registryTriggerQA.fill(HIST("PPPhi/tight/fPhiQ3VsInvMass"), q3, vecPhi.at(phi1).M()); } } } @@ -2173,29 +2173,29 @@ struct CFFilterAll { registryTriggerQA.fill(HIST("PPPhi/all/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PPPhi/all/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PPPhi/all/fSE_antiparticle"), q3); - registryTriggerQA.fill(HIST("PPPhi/all/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); - registryTriggerQA.fill(HIST("PPPhi/all/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); - registryTriggerQA.fill(HIST("PPPhi/all/fPhiPtVsQ3"), vecPhi.at(phi1).Pt(), q3); - registryTriggerQA.fill(HIST("PPPhi/all/fPhiInvMassVsQ3"), vecPhi.at(phi1).M(), q3); + registryTriggerQA.fill(HIST("PPPhi/all/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PPPhi/all/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p2).Pt()); + registryTriggerQA.fill(HIST("PPPhi/all/fPhiQ3VsPt"), q3, vecPhi.at(phi1).Pt()); + registryTriggerQA.fill(HIST("PPPhi/all/fPhiQ3VsInvMass"), q3, vecPhi.at(phi1).M()); if (q3 < TriggerSelections.limits->get("Loose Limit", "PPPhi")) { signalLooseLimit[cf_trigger::kPPPhi] += 1; registryTriggerQA.fill(HIST("PPPhi/loose/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PPPhi/loose/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PPPhi/loose/fSE_antiparticle"), q3); - registryTriggerQA.fill(HIST("PPPhi/loose/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); - registryTriggerQA.fill(HIST("PPPhi/loose/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); - registryTriggerQA.fill(HIST("PPPhi/loose/fPhiPtVsQ3"), vecPhi.at(phi1).Pt(), q3); - registryTriggerQA.fill(HIST("PPPhi/loose/fPhiInvMassVsQ3"), vecPhi.at(phi1).M(), q3); + registryTriggerQA.fill(HIST("PPPhi/loose/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PPPhi/loose/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p2).Pt()); + registryTriggerQA.fill(HIST("PPPhi/loose/fPhiQ3VsPt"), q3, vecPhi.at(phi1).Pt()); + registryTriggerQA.fill(HIST("PPPhi/loose/fPhiQ3VsInvMass"), q3, vecPhi.at(phi1).M()); if (q3 < TriggerSelections.limits->get("Tight Limit", "PPPhi") && vecPhi.at(phi1).M() > PhiSelections.tightInvMassLow.value && vecPhi.at(phi1).M() < PhiSelections.tightInvMassUp.value) { signalTightLimit[cf_trigger::kPPPhi] += 1; registryTriggerQA.fill(HIST("PPPhi/tight/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PPPhi/tight/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PPPhi/tight/fSE_antiparticle"), q3); - registryTriggerQA.fill(HIST("PPPhi/tight/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); - registryTriggerQA.fill(HIST("PPPhi/tight/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); - registryTriggerQA.fill(HIST("PPPhi/tight/fPhiPtVsQ3"), vecPhi.at(phi1).Pt(), q3); - registryTriggerQA.fill(HIST("PPPhi/tight/fPhiInvMassVsQ3"), vecPhi.at(phi1).M(), q3); + registryTriggerQA.fill(HIST("PPPhi/tight/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PPPhi/tight/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p2).Pt()); + registryTriggerQA.fill(HIST("PPPhi/tight/fPhiQ3VsPt"), q3, vecPhi.at(phi1).Pt()); + registryTriggerQA.fill(HIST("PPPhi/tight/fPhiQ3VsInvMass"), q3, vecPhi.at(phi1).M()); } } } @@ -2214,29 +2214,29 @@ struct CFFilterAll { registryTriggerQA.fill(HIST("PPRho/all/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PPRho/all/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PPRho/all/fSE_particle"), q3); - registryTriggerQA.fill(HIST("PPRho/all/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); - registryTriggerQA.fill(HIST("PPRho/all/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); - registryTriggerQA.fill(HIST("PPRho/all/fRhoPtVsQ3"), vecRho.at(r1).Pt(), q3); - registryTriggerQA.fill(HIST("PPRho/all/fRhoInvMassVsQ3"), vecRho.at(r1).M(), q3); + registryTriggerQA.fill(HIST("PPRho/all/fProtonQ3VsPt"), q3, vecProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PPRho/all/fProtonQ3VsPt"), q3, vecProton.at(p2).Pt()); + registryTriggerQA.fill(HIST("PPRho/all/fRhoQ3VsPt"), q3, vecRho.at(r1).Pt()); + registryTriggerQA.fill(HIST("PPRho/all/fRhoQ3VsInvMass"), q3, vecRho.at(r1).M()); if (q3 < TriggerSelections.limits->get("Loose Limit", "PPRho")) { signalLooseLimit[cf_trigger::kPPRho] += 1; registryTriggerQA.fill(HIST("PPRho/loose/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PPRho/loose/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PPRho/loose/fSE_particle"), q3); - registryTriggerQA.fill(HIST("PPRho/loose/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); - registryTriggerQA.fill(HIST("PPRho/loose/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); - registryTriggerQA.fill(HIST("PPRho/loose/fRhoPtVsQ3"), vecRho.at(r1).Pt(), q3); - registryTriggerQA.fill(HIST("PPRho/loose/fRhoInvMassVsQ3"), vecRho.at(r1).M(), q3); + registryTriggerQA.fill(HIST("PPRho/loose/fProtonQ3VsPt"), q3, vecProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PPRho/loose/fProtonQ3VsPt"), q3, vecProton.at(p2).Pt()); + registryTriggerQA.fill(HIST("PPRho/loose/fRhoQ3VsPt"), q3, vecRho.at(r1).Pt()); + registryTriggerQA.fill(HIST("PPRho/loose/fRhoQ3VsInvMass"), q3, vecRho.at(r1).M()); if (q3 < TriggerSelections.limits->get("Tight Limit", "PPRho") && vecRho.at(r1).M() > RhoSelections.tightInvMassLow.value && vecRho.at(r1).M() < RhoSelections.tightInvMassUp.value) { signalTightLimit[cf_trigger::kPPRho] += 1; registryTriggerQA.fill(HIST("PPRho/tight/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PPRho/tight/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PPRho/tight/fSE_particle"), q3); - registryTriggerQA.fill(HIST("PPRho/tight/fProtonPtVsQ3"), vecProton.at(p1).Pt(), q3); - registryTriggerQA.fill(HIST("PPRho/tight/fProtonPtVsQ3"), vecProton.at(p2).Pt(), q3); - registryTriggerQA.fill(HIST("PPRho/tight/fRhoPtVsQ3"), vecRho.at(r1).Pt(), q3); - registryTriggerQA.fill(HIST("PPRho/tight/fRhoInvMassVsQ3"), vecRho.at(r1).M(), q3); + registryTriggerQA.fill(HIST("PPRho/tight/fProtonQ3VsPt"), q3, vecProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PPRho/tight/fProtonQ3VsPt"), q3, vecProton.at(p2).Pt()); + registryTriggerQA.fill(HIST("PPRho/tight/fRhoQ3VsPt"), q3, vecRho.at(r1).Pt()); + registryTriggerQA.fill(HIST("PPRho/tight/fRhoQ3VsInvMass"), q3, vecRho.at(r1).M()); } } } @@ -2252,29 +2252,29 @@ struct CFFilterAll { registryTriggerQA.fill(HIST("PPRho/all/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PPRho/all/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PPRho/all/fSE_antiparticle"), q3); - registryTriggerQA.fill(HIST("PPRho/all/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); - registryTriggerQA.fill(HIST("PPRho/all/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); - registryTriggerQA.fill(HIST("PPRho/all/fRhoPtVsQ3"), vecRho.at(r1).Pt(), q3); - registryTriggerQA.fill(HIST("PPRho/all/fRhoInvMassVsQ3"), vecRho.at(r1).M(), q3); + registryTriggerQA.fill(HIST("PPRho/all/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PPRho/all/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p2).Pt()); + registryTriggerQA.fill(HIST("PPRho/all/fRhoQ3VsPt"), q3, vecRho.at(r1).Pt()); + registryTriggerQA.fill(HIST("PPRho/all/fRhoQ3VsInvMass"), q3, vecRho.at(r1).M()); if (q3 < TriggerSelections.limits->get("Loose Limit", "PPRho")) { signalLooseLimit[cf_trigger::kPPRho] += 1; registryTriggerQA.fill(HIST("PPRho/loose/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PPRho/loose/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PPRho/loose/fSE_antiparticle"), q3); - registryTriggerQA.fill(HIST("PPRho/loose/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); - registryTriggerQA.fill(HIST("PPRho/loose/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); - registryTriggerQA.fill(HIST("PPRho/loose/fRhoPtVsQ3"), vecRho.at(r1).Pt(), q3); - registryTriggerQA.fill(HIST("PPRho/loose/fRhoInvMassVsQ3"), vecRho.at(r1).M(), q3); + registryTriggerQA.fill(HIST("PPRho/loose/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PPRho/loose/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p2).Pt()); + registryTriggerQA.fill(HIST("PPRho/loose/fRhoQ3VsPt"), q3, vecRho.at(r1).Pt()); + registryTriggerQA.fill(HIST("PPRho/loose/fRhoQ3VsInvMass"), q3, vecRho.at(r1).M()); if (q3 < TriggerSelections.limits->get("Tight Limit", "PPRho") && vecRho.at(r1).M() > RhoSelections.tightInvMassLow.value && vecRho.at(r1).M() < RhoSelections.tightInvMassUp.value) { signalTightLimit[cf_trigger::kPPRho] += 1; registryTriggerQA.fill(HIST("PPRho/tight/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PPRho/tight/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PPRho/tight/fSE_antiparticle"), q3); - registryTriggerQA.fill(HIST("PPRho/tight/fAntiProtonPtVsQ3"), vecAntiProton.at(p1).Pt(), q3); - registryTriggerQA.fill(HIST("PPRho/tight/fAntiProtonPtVsQ3"), vecAntiProton.at(p2).Pt(), q3); - registryTriggerQA.fill(HIST("PPRho/tight/fRhoPtVsQ3"), vecRho.at(r1).Pt(), q3); - registryTriggerQA.fill(HIST("PPRho/tight/fRhoInvMassVsQ3"), vecRho.at(r1).M(), q3); + registryTriggerQA.fill(HIST("PPRho/tight/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PPRho/tight/fAntiProtonQ3VsPt"), q3, vecAntiProton.at(p2).Pt()); + registryTriggerQA.fill(HIST("PPRho/tight/fRhoQ3VsPt"), q3, vecRho.at(r1).Pt()); + registryTriggerQA.fill(HIST("PPRho/tight/fRhoQ3VsInvMass"), q3, vecRho.at(r1).M()); } } } @@ -2292,22 +2292,22 @@ struct CFFilterAll { registryTriggerQA.fill(HIST("PD/all/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PD/all/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PD/all/fSE_particle"), kstar); - registryTriggerQA.fill(HIST("PD/all/fProtonPtVskstar"), vecProton.at(p1).Pt(), kstar); - registryTriggerQA.fill(HIST("PD/all/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("PD/all/fProtonKstarVsPt"), kstar, vecProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PD/all/fDeuteronKstarVsPt"), kstar, vecDeuteron.at(d1).Pt()); if (kstar < TriggerSelections.limits->get("Loose Limit", "PD")) { signalLooseLimit[cf_trigger::kPD] += 1; registryTriggerQA.fill(HIST("PD/loose/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PD/loose/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PD/loose/fSE_particle"), kstar); - registryTriggerQA.fill(HIST("PD/loose/fProtonPtVskstar"), vecProton.at(p1).Pt(), kstar); - registryTriggerQA.fill(HIST("PD/loose/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("PD/loose/fProtonKstarVsPt"), kstar, vecProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PD/loose/fDeuteronKstarVsPt"), kstar, vecDeuteron.at(d1).Pt()); if (kstar < TriggerSelections.limits->get("Tight Limit", "PD")) { signalTightLimit[cf_trigger::kPD] += 1; registryTriggerQA.fill(HIST("PD/tight/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PD/tight/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PD/tight/fSE_particle"), kstar); - registryTriggerQA.fill(HIST("PD/tight/fProtonPtVskstar"), vecProton.at(p1).Pt(), kstar); - registryTriggerQA.fill(HIST("PD/tight/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("PD/tight/fProtonKstarVsPt"), kstar, vecProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PD/tight/fDeuteronKstarVsPt"), kstar, vecDeuteron.at(d1).Pt()); } } } @@ -2321,22 +2321,22 @@ struct CFFilterAll { registryTriggerQA.fill(HIST("PD/all/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PD/all/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PD/all/fSE_antiparticle"), kstar); - registryTriggerQA.fill(HIST("PD/all/fAntiProtonPtVskstar"), vecAntiProton.at(p1).Pt(), kstar); - registryTriggerQA.fill(HIST("PD/all/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("PD/all/fAntiProtonKstarVsPt"), kstar, vecAntiProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PD/all/fAntiDeuteronKstarVsPt"), kstar, vecAntiDeuteron.at(d1).Pt()); if (kstar < TriggerSelections.limits->get("Loose Limit", "PD")) { signalLooseLimit[cf_trigger::kPD] += 1; registryTriggerQA.fill(HIST("PD/loose/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PD/loose/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PD/loose/fSE_antiparticle"), kstar); - registryTriggerQA.fill(HIST("PD/loose/fAntiProtonPtVskstar"), vecAntiProton.at(p1).Pt(), kstar); - registryTriggerQA.fill(HIST("PD/loose/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("PD/loose/fAntiProtonKstarVsPt"), kstar, vecAntiProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PD/loose/fAntiDeuteronKstarVsPt"), kstar, vecAntiDeuteron.at(d1).Pt()); if (kstar < TriggerSelections.limits->get("Tight Limit", "PD")) { signalTightLimit[cf_trigger::kPD] += 1; registryTriggerQA.fill(HIST("PD/tight/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PD/tight/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PD/tight/fSE_antiparticle"), kstar); - registryTriggerQA.fill(HIST("PD/tight/fAntiProtonPtVskstar"), vecAntiProton.at(p1).Pt(), kstar); - registryTriggerQA.fill(HIST("PD/tight/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("PD/tight/fAntiProtonKstarVsPt"), kstar, vecAntiProton.at(p1).Pt()); + registryTriggerQA.fill(HIST("PD/tight/fAntiDeuteronKstarVsPt"), kstar, vecAntiDeuteron.at(d1).Pt()); } } } @@ -2353,22 +2353,22 @@ struct CFFilterAll { registryTriggerQA.fill(HIST("LD/all/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("LD/all/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("LD/all/fSE_particle"), kstar); - registryTriggerQA.fill(HIST("LD/all/fLambdaPtVskstar"), vecLambda.at(l1).Pt(), kstar); - registryTriggerQA.fill(HIST("LD/all/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("LD/all/fLambdaKstarVsPt"), kstar, vecLambda.at(l1).Pt()); + registryTriggerQA.fill(HIST("LD/all/fDeuteronKstarVsPt"), kstar, vecDeuteron.at(d1).Pt()); if (kstar < TriggerSelections.limits->get("Loose Limit", "LD")) { signalLooseLimit[cf_trigger::kLD] += 1; registryTriggerQA.fill(HIST("LD/loose/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("LD/loose/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("LD/loose/fSE_particle"), kstar); - registryTriggerQA.fill(HIST("LD/loose/fLambdaPtVskstar"), vecLambda.at(l1).Pt(), kstar); - registryTriggerQA.fill(HIST("LD/loose/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("LD/loose/fLambdaKstarVsPt"), kstar, vecLambda.at(l1).Pt()); + registryTriggerQA.fill(HIST("LD/loose/fDeuteronKstarVsPt"), kstar, vecDeuteron.at(d1).Pt()); if (kstar < TriggerSelections.limits->get("Tight Limit", "LD")) { signalTightLimit[cf_trigger::kLD] += 1; registryTriggerQA.fill(HIST("LD/tight/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("LD/tight/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("LD/tight/fSE_particle"), kstar); - registryTriggerQA.fill(HIST("LD/tight/fLambdaPtVskstar"), vecLambda.at(l1).Pt(), kstar); - registryTriggerQA.fill(HIST("LD/tight/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("LD/tight/fLambdaKstarVsPt"), kstar, vecLambda.at(l1).Pt()); + registryTriggerQA.fill(HIST("LD/tight/fDeuteronKstarVsPt"), kstar, vecDeuteron.at(d1).Pt()); } } } @@ -2382,22 +2382,22 @@ struct CFFilterAll { registryTriggerQA.fill(HIST("LD/all/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("LD/all/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("LD/all/fSE_antiparticle"), kstar); - registryTriggerQA.fill(HIST("LD/all/fAntiLambdaPtVskstar"), vecAntiLambda.at(l1).Pt(), kstar); - registryTriggerQA.fill(HIST("LD/all/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("LD/all/fAntiLambdaKstarVsPt"), kstar, vecAntiLambda.at(l1).Pt()); + registryTriggerQA.fill(HIST("LD/all/fAntiDeuteronKstarVsPt"), kstar, vecAntiDeuteron.at(d1).Pt()); if (kstar < TriggerSelections.limits->get("Loose Limit", "LD")) { signalLooseLimit[cf_trigger::kLD] += 1; registryTriggerQA.fill(HIST("LD/loose/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("LD/loose/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("LD/loose/fSE_antiparticle"), kstar); - registryTriggerQA.fill(HIST("LD/loose/fAntiLambdaPtVskstar"), vecAntiLambda.at(l1).Pt(), kstar); - registryTriggerQA.fill(HIST("LD/loose/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("LD/loose/fAntiLambdaKstarVsPt"), kstar, vecAntiLambda.at(l1).Pt()); + registryTriggerQA.fill(HIST("LD/loose/fAntiDeuteronKstarVsPt"), kstar, vecAntiDeuteron.at(d1).Pt()); if (kstar < TriggerSelections.limits->get("Tight Limit", "LD")) { signalTightLimit[cf_trigger::kLD] += 1; registryTriggerQA.fill(HIST("LD/tight/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("LD/tight/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("LD/tight/fSE_antiparticle"), kstar); - registryTriggerQA.fill(HIST("LD/tight/fAntiLambdaPtVskstar"), vecAntiLambda.at(l1).Pt(), kstar); - registryTriggerQA.fill(HIST("LD/tight/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); + registryTriggerQA.fill(HIST("LD/tight/fAntiLambdaKstarVsPt"), kstar, vecAntiLambda.at(l1).Pt()); + registryTriggerQA.fill(HIST("LD/tight/fAntiDeuteronKstarVsPt"), kstar, vecAntiDeuteron.at(d1).Pt()); } } } @@ -2414,26 +2414,26 @@ struct CFFilterAll { registryTriggerQA.fill(HIST("PhiD/all/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PhiD/all/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PhiD/all/fSE_particle"), kstar); - registryTriggerQA.fill(HIST("PhiD/all/fPhiPtVskstar"), vecPhi.at(phi1).Pt(), kstar); - registryTriggerQA.fill(HIST("PhiD/all/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); - registryTriggerQA.fill(HIST("PhiD/all/fPhiInvMassVskstar"), vecPhi.at(phi1).M(), kstar); + registryTriggerQA.fill(HIST("PhiD/all/fPhiKstarVsPt"), kstar, vecPhi.at(phi1).Pt()); + registryTriggerQA.fill(HIST("PhiD/all/fDeuteronKstarVsPt"), kstar, vecDeuteron.at(d1).Pt()); + registryTriggerQA.fill(HIST("PhiD/all/fPhiKstarVsInvMass"), kstar, vecPhi.at(phi1).M()); if (kstar < TriggerSelections.limits->get("Loose Limit", "PhiD")) { signalLooseLimit[cf_trigger::kPhiD] += 1; registryTriggerQA.fill(HIST("PhiD/loose/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PhiD/loose/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PhiD/loose/fSE_particle"), kstar); - registryTriggerQA.fill(HIST("PhiD/loose/fPhiPtVskstar"), vecPhi.at(phi1).Pt(), kstar); - registryTriggerQA.fill(HIST("PhiD/loose/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); - registryTriggerQA.fill(HIST("PhiD/loose/fPhiInvMassVskstar"), vecPhi.at(phi1).M(), kstar); + registryTriggerQA.fill(HIST("PhiD/loose/fPhiKstarVsPt"), kstar, vecPhi.at(phi1).Pt()); + registryTriggerQA.fill(HIST("PhiD/loose/fDeuteronKstarVsPt"), kstar, vecDeuteron.at(d1).Pt()); + registryTriggerQA.fill(HIST("PhiD/loose/fPhiKstarVsInvMass"), kstar, vecPhi.at(phi1).M()); if (kstar < TriggerSelections.limits->get("Tight Limit", "PhiD") && vecPhi.at(phi1).M() > PhiSelections.tightInvMassLow.value && vecPhi.at(phi1).M() < PhiSelections.tightInvMassUp.value) { signalTightLimit[cf_trigger::kPhiD] += 1; registryTriggerQA.fill(HIST("PhiD/tight/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PhiD/tight/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PhiD/tight/fSE_particle"), kstar); - registryTriggerQA.fill(HIST("PhiD/tight/fPhiPtVskstar"), vecPhi.at(phi1).Pt(), kstar); - registryTriggerQA.fill(HIST("PhiD/tight/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); - registryTriggerQA.fill(HIST("PhiD/tight/fPhiInvMassVskstar"), vecPhi.at(phi1).M(), kstar); + registryTriggerQA.fill(HIST("PhiD/tight/fPhiKstarVsPt"), kstar, vecPhi.at(phi1).Pt()); + registryTriggerQA.fill(HIST("PhiD/tight/fDeuteronKstarVsPt"), kstar, vecDeuteron.at(d1).Pt()); + registryTriggerQA.fill(HIST("PhiD/tight/fPhiKstarVsInvMass"), kstar, vecPhi.at(phi1).M()); } } } @@ -2447,26 +2447,26 @@ struct CFFilterAll { registryTriggerQA.fill(HIST("PhiD/all/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PhiD/all/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PhiD/all/fSE_antiparticle"), kstar); - registryTriggerQA.fill(HIST("PhiD/all/fPhiPtVskstar"), vecPhi.at(phi1).Pt(), kstar); - registryTriggerQA.fill(HIST("PhiD/all/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); - registryTriggerQA.fill(HIST("PhiD/all/fPhiInvMassVskstar"), vecPhi.at(phi1).M(), kstar); + registryTriggerQA.fill(HIST("PhiD/all/fPhiKstarVsPt"), kstar, vecPhi.at(phi1).Pt()); + registryTriggerQA.fill(HIST("PhiD/all/fAntiDeuteronKstarVsPt"), kstar, vecAntiDeuteron.at(d1).Pt()); + registryTriggerQA.fill(HIST("PhiD/all/fPhiKstarVsInvMass"), kstar, vecPhi.at(phi1).M()); if (kstar < TriggerSelections.limits->get("Loose Limit", "PhiD")) { signalLooseLimit[cf_trigger::kPhiD] += 1; registryTriggerQA.fill(HIST("PhiD/loose/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PhiD/loose/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PhiD/loose/fSE_antiparticle"), kstar); - registryTriggerQA.fill(HIST("PhiD/loose/fPhiPtVskstar"), vecPhi.at(phi1).Pt(), kstar); - registryTriggerQA.fill(HIST("PhiD/loose/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); - registryTriggerQA.fill(HIST("PhiD/loose/fPhiInvMassVskstar"), vecPhi.at(phi1).M(), kstar); + registryTriggerQA.fill(HIST("PhiD/loose/fPhiKstarVsPt"), kstar, vecPhi.at(phi1).Pt()); + registryTriggerQA.fill(HIST("PhiD/loose/fAntiDeuteronKstarVsPt"), kstar, vecAntiDeuteron.at(d1).Pt()); + registryTriggerQA.fill(HIST("PhiD/loose/fPhiKstarVsInvMass"), kstar, vecPhi.at(phi1).M()); if (kstar < TriggerSelections.limits->get("Tight Limit", "PhiD") && vecPhi.at(phi1).M() > PhiSelections.tightInvMassLow.value && vecPhi.at(phi1).M() < PhiSelections.tightInvMassUp.value) { signalTightLimit[cf_trigger::kPhiD] += 1; registryTriggerQA.fill(HIST("PhiD/tight/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("PhiD/tight/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("PhiD/tight/fSE_antiparticle"), kstar); - registryTriggerQA.fill(HIST("PhiD/tight/fPhiPtVskstar"), vecPhi.at(phi1).Pt(), kstar); - registryTriggerQA.fill(HIST("PhiD/tight/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); - registryTriggerQA.fill(HIST("PhiD/tight/fPhiInvMassVskstar"), vecPhi.at(phi1).M(), kstar); + registryTriggerQA.fill(HIST("PhiD/tight/fPhiKstarVsPt"), kstar, vecPhi.at(phi1).Pt()); + registryTriggerQA.fill(HIST("PhiD/tight/fAntiDeuteronKstarVsPt"), kstar, vecAntiDeuteron.at(d1).Pt()); + registryTriggerQA.fill(HIST("PhiD/tight/fPhiKstarVsInvMass"), kstar, vecPhi.at(phi1).M()); } } } @@ -2483,26 +2483,26 @@ struct CFFilterAll { registryTriggerQA.fill(HIST("RhoD/all/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("RhoD/all/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("RhoD/all/fSE_particle"), kstar); - registryTriggerQA.fill(HIST("RhoD/all/fRhoPtVskstar"), vecRho.at(r1).Pt(), kstar); - registryTriggerQA.fill(HIST("RhoD/all/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); - registryTriggerQA.fill(HIST("RhoD/all/fRhoInvMassVskstar"), vecRho.at(r1).M(), kstar); + registryTriggerQA.fill(HIST("RhoD/all/fRhoKstarVsPt"), kstar, vecRho.at(r1).Pt()); + registryTriggerQA.fill(HIST("RhoD/all/fDeuteronKstarVsPt"), kstar, vecDeuteron.at(d1).Pt()); + registryTriggerQA.fill(HIST("RhoD/all/fRhoKstarVsInvMass"), kstar, vecRho.at(r1).M()); if (kstar < TriggerSelections.limits->get("Loose Limit", "RhoD")) { signalLooseLimit[cf_trigger::kRhoD] += 1; registryTriggerQA.fill(HIST("RhoD/loose/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("RhoD/loose/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("RhoD/loose/fSE_particle"), kstar); - registryTriggerQA.fill(HIST("RhoD/loose/fRhoPtVskstar"), vecRho.at(r1).Pt(), kstar); - registryTriggerQA.fill(HIST("RhoD/loose/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); - registryTriggerQA.fill(HIST("RhoD/loose/fRhoInvMassVskstar"), vecRho.at(r1).M(), kstar); + registryTriggerQA.fill(HIST("RhoD/loose/fRhoKstarVsPt"), kstar, vecRho.at(r1).Pt()); + registryTriggerQA.fill(HIST("RhoD/loose/fDeuteronKstarVsPt"), kstar, vecDeuteron.at(d1).Pt()); + registryTriggerQA.fill(HIST("RhoD/loose/fRhoKstarVsInvMass"), kstar, vecRho.at(r1).M()); if (kstar < TriggerSelections.limits->get("Tight Limit", "RhoD") && vecRho.at(r1).M() > RhoSelections.tightInvMassLow.value && vecRho.at(r1).M() < RhoSelections.tightInvMassUp.value) { signalTightLimit[cf_trigger::kRhoD] += 1; registryTriggerQA.fill(HIST("RhoD/tight/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("RhoD/tight/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("RhoD/tight/fSE_particle"), kstar); - registryTriggerQA.fill(HIST("RhoD/tight/fRhoPtVskstar"), vecRho.at(r1).Pt(), kstar); - registryTriggerQA.fill(HIST("RhoD/tight/fDeuteronPtVskstar"), vecDeuteron.at(d1).Pt(), kstar); - registryTriggerQA.fill(HIST("RhoD/tight/fRhoInvMassVskstar"), vecRho.at(r1).M(), kstar); + registryTriggerQA.fill(HIST("RhoD/tight/fRhoKstarVsPt"), kstar, vecRho.at(r1).Pt()); + registryTriggerQA.fill(HIST("RhoD/tight/fDeuteronKstarVsPt"), kstar, vecDeuteron.at(d1).Pt()); + registryTriggerQA.fill(HIST("RhoD/tight/fRhoKstarVsInvMass"), kstar, vecRho.at(r1).M()); } } } @@ -2516,26 +2516,26 @@ struct CFFilterAll { registryTriggerQA.fill(HIST("RhoD/all/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("RhoD/all/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("RhoD/all/fSE_antiparticle"), kstar); - registryTriggerQA.fill(HIST("RhoD/all/fRhoPtVskstar"), vecRho.at(r1).Pt(), kstar); - registryTriggerQA.fill(HIST("RhoD/all/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); - registryTriggerQA.fill(HIST("RhoD/all/fRhoInvMassVskstar"), vecRho.at(r1).M(), kstar); + registryTriggerQA.fill(HIST("RhoD/all/fRhoKstarVsPt"), kstar, vecRho.at(r1).Pt()); + registryTriggerQA.fill(HIST("RhoD/all/fAntiDeuteronKstarVsPt"), kstar, vecAntiDeuteron.at(d1).Pt()); + registryTriggerQA.fill(HIST("RhoD/all/fRhoKstarVsInvMass"), kstar, vecRho.at(r1).M()); if (kstar < TriggerSelections.limits->get("Loose Limit", "RhoD")) { signalLooseLimit[cf_trigger::kRhoD] += 1; registryTriggerQA.fill(HIST("RhoD/loose/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("RhoD/loose/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("RhoD/loose/fSE_antiparticle"), kstar); - registryTriggerQA.fill(HIST("RhoD/loose/fRhoPtVskstar"), vecRho.at(r1).Pt(), kstar); - registryTriggerQA.fill(HIST("RhoD/loose/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); - registryTriggerQA.fill(HIST("RhoD/loose/fRhoInvMassVskstar"), vecRho.at(r1).M(), kstar); + registryTriggerQA.fill(HIST("RhoD/loose/fRhoKstarVsPt"), kstar, vecRho.at(r1).Pt()); + registryTriggerQA.fill(HIST("RhoD/loose/fAntiDeuteronKstarVsPt"), kstar, vecAntiDeuteron.at(d1).Pt()); + registryTriggerQA.fill(HIST("RhoD/loose/fRhoKstarVsInvMass"), kstar, vecRho.at(r1).M()); if (kstar < TriggerSelections.limits->get("Tight Limit", "RhoD") && vecRho.at(r1).M() > RhoSelections.tightInvMassLow.value && vecRho.at(r1).M() < RhoSelections.tightInvMassUp.value) { signalTightLimit[cf_trigger::kRhoD] += 1; registryTriggerQA.fill(HIST("RhoD/tight/fMultiplicity"), col.multNTracksPV()); registryTriggerQA.fill(HIST("RhoD/tight/fZvtx"), col.posZ()); registryTriggerQA.fill(HIST("RhoD/tight/fSE_antiparticle"), kstar); - registryTriggerQA.fill(HIST("RhoD/tight/fRhoPtVskstar"), vecRho.at(r1).Pt(), kstar); - registryTriggerQA.fill(HIST("RhoD/tight/fAntiDeuteronPtVskstar"), vecAntiDeuteron.at(d1).Pt(), kstar); - registryTriggerQA.fill(HIST("RhoD/tight/fRhoInvMassVskstar"), vecRho.at(r1).M(), kstar); + registryTriggerQA.fill(HIST("RhoD/tight/fRhoKstarVsPt"), kstar, vecRho.at(r1).Pt()); + registryTriggerQA.fill(HIST("RhoD/tight/fAntiDeuteronKstarVsPt"), kstar, vecAntiDeuteron.at(d1).Pt()); + registryTriggerQA.fill(HIST("RhoD/tight/fRhoKstarVsInvMass"), kstar, vecRho.at(r1).M()); } } } From cad058aaca6e7f3c8ea704bd7d99c31c2456417e Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Wed, 28 May 2025 14:04:55 +0900 Subject: [PATCH 1439/1650] [PWGEM/Dilepton] update associateMCinfoDilepton.cxx (#11386) --- PWGEM/Dilepton/DataModel/dileptonTables.h | 41 +++++++++++++++++++ .../TableProducer/associateMCinfoDilepton.cxx | 24 +++++++++-- 2 files changed, 61 insertions(+), 4 deletions(-) diff --git a/PWGEM/Dilepton/DataModel/dileptonTables.h b/PWGEM/Dilepton/DataModel/dileptonTables.h index ac688a57b98..244d5ada6cc 100644 --- a/PWGEM/Dilepton/DataModel/dileptonTables.h +++ b/PWGEM/Dilepton/DataModel/dileptonTables.h @@ -641,6 +641,47 @@ DECLARE_SOA_TABLE(EMGlobalMuonSelfIds, "AOD", "EMGLMUSELFID", emprimarymuon::Glo // iterators using EMGlobalMuonSelfId = EMGlobalMuonSelfIds::iterator; +// Dummy data for MC +namespace emdummydata +{ +DECLARE_SOA_COLUMN(A, a, float); +DECLARE_SOA_COLUMN(B, b, float); +DECLARE_SOA_COLUMN(C, c, float); +DECLARE_SOA_COLUMN(D, d, float); +DECLARE_SOA_COLUMN(E, e, float); +DECLARE_SOA_COLUMN(F, f, float); +DECLARE_SOA_COLUMN(G, g, float); +DECLARE_SOA_COLUMN(H, h, float); +DECLARE_SOA_COLUMN(I, i, float); +DECLARE_SOA_COLUMN(J, j, float); +DECLARE_SOA_COLUMN(K, k, float); +DECLARE_SOA_COLUMN(L, l, float); +DECLARE_SOA_COLUMN(M, m, float); +DECLARE_SOA_COLUMN(N, n, float); +DECLARE_SOA_COLUMN(O, o, float); +DECLARE_SOA_COLUMN(P, p, float); +DECLARE_SOA_COLUMN(Q, q, float); +DECLARE_SOA_COLUMN(R, r, float); +DECLARE_SOA_COLUMN(S, s, float); +DECLARE_SOA_COLUMN(T, t, float); +DECLARE_SOA_COLUMN(U, u, float); +DECLARE_SOA_COLUMN(V, v, float); +DECLARE_SOA_COLUMN(W, w, float); +DECLARE_SOA_COLUMN(X, x, float); +DECLARE_SOA_COLUMN(Y, y, float); +DECLARE_SOA_COLUMN(Z, z, float); +} // namespace emdummydata +DECLARE_SOA_TABLE(EMDummyDatas, "AOD", "EMDUMMYDATA", + o2::soa::Index<>, + emdummydata::A, emdummydata::B, emdummydata::C, emdummydata::D, emdummydata::E, + emdummydata::F, emdummydata::G, emdummydata::H, emdummydata::I, emdummydata::J, + emdummydata::K, emdummydata::L, emdummydata::M, emdummydata::N, emdummydata::O, + emdummydata::P, emdummydata::Q, emdummydata::R, emdummydata::S, emdummydata::T, + emdummydata::U, emdummydata::V, emdummydata::W, emdummydata::X, emdummydata::Y, + emdummydata::Z); + +// iterators +using EMDummyData = EMDummyDatas::iterator; } // namespace o2::aod #endif // PWGEM_DILEPTON_DATAMODEL_DILEPTONTABLES_H_ diff --git a/PWGEM/Dilepton/TableProducer/associateMCinfoDilepton.cxx b/PWGEM/Dilepton/TableProducer/associateMCinfoDilepton.cxx index fcccd1cf9c0..bdca5c93802 100644 --- a/PWGEM/Dilepton/TableProducer/associateMCinfoDilepton.cxx +++ b/PWGEM/Dilepton/TableProducer/associateMCinfoDilepton.cxx @@ -33,10 +33,6 @@ using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::soa; -using MyCollisionsMC = soa::Join; -using TracksMC = soa::Join; -using FwdTracksMC = soa::Join; - struct AssociateMCInfoDilepton { enum SubSystem { kElectron = 0x1, @@ -44,6 +40,10 @@ struct AssociateMCInfoDilepton { kPCM = 0x4, }; + using MyCollisionsMC = soa::Join; + using TracksMC = soa::Join; + using FwdTracksMC = soa::Join; + Produces mcevents; Produces mceventlabels; Produces emmcparticles; @@ -51,7 +51,9 @@ struct AssociateMCInfoDilepton { Produces v0legmclabels; Produces emprimaryelectronmclabels; Produces emprimarymuonmclabels; + Produces emdummydata; + Configurable n_dummy_loop{"n_dummy_loop", 0, "for loop runs over n times"}; Configurable down_scaling_omega{"down_scaling_omega", 1.1, "down scaling factor to store omega"}; Configurable down_scaling_phi{"down_scaling_phi", 1.1, "down scaling factor to store phi"}; Configurable min_eta_gen_primary{"min_eta_gen_primary", -1.5, "min rapidity Y to store generated information"}; // smearing is applied at analysis stage. set wider value. @@ -642,6 +644,19 @@ struct AssociateMCInfoDilepton { skimmingMC(collisions, bcs, mccollisions, mcTracks, o2tracks, nullptr, v0photons, v0legs, nullptr, nullptr); } + void processGenDummy(MyCollisionsMC const&) + { + for (int i = 0; i < n_dummy_loop; i++) { + emdummydata( + 0.f, 0.f, 0.f, 0.f, 0.f, + 0.f, 0.f, 0.f, 0.f, 0.f, + 0.f, 0.f, 0.f, 0.f, 0.f, + 0.f, 0.f, 0.f, 0.f, 0.f, + 0.f, 0.f, 0.f, 0.f, 0.f, + 0.f); + } + } + void processDummy(MyCollisionsMC const&) {} PROCESS_SWITCH(AssociateMCInfoDilepton, processMC_Electron, "create em mc event table for Electron", false); @@ -650,6 +665,7 @@ struct AssociateMCInfoDilepton { PROCESS_SWITCH(AssociateMCInfoDilepton, processMC_Electron_FwdMuon_PCM, "create em mc event table for PCM, Electron, FwdMuon", false); PROCESS_SWITCH(AssociateMCInfoDilepton, processMC_Electron_PCM, "create em mc event table for PCM, Electron", false); PROCESS_SWITCH(AssociateMCInfoDilepton, processMC_PCM, "create em mc event table for PCM", false); + PROCESS_SWITCH(AssociateMCInfoDilepton, processGenDummy, "produce dummy data", false); PROCESS_SWITCH(AssociateMCInfoDilepton, processDummy, "processDummy", true); }; From 5e28fd173aa4cd1d5d3c412bddc5d1dc1b3cffcb Mon Sep 17 00:00:00 2001 From: Kangkan Goswami Date: Wed, 28 May 2025 17:44:14 +0530 Subject: [PATCH 1440/1650] [PWGDQ] Including a histogram for low mass polarization in Production frame (#11387) --- PWGDQ/Core/HistogramsLibrary.cxx | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 96227af31ce..91e5264c969 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -1249,6 +1249,18 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "Mass_Pt_cosThetaPP_phiPP", "", 4, varspTPP, binspT, xminpT, xmaxpT, 0, -1, kFALSE); hm->AddHistogram(histClass, "Mass_y_cosThetaPP_phiPP", "", 4, varsrapPP, binsy, xminy, xmaxy, 0, -1, kFALSE); } + if (subGroupStr.Contains("dimuon-polarization-lowmass-pp")) { + int varspTPP[4] = {VarManager::kMass, VarManager::kPt, VarManager::kCosThetaPP, VarManager::kPhiPP}; + int varsrapPP[4] = {VarManager::kMass, VarManager::kRap, VarManager::kCosThetaPP, VarManager::kPhiPP}; + int binspT[4] = {100, 20, 20, 20}; + int binsy[4] = {100, 10, 20, 20}; + double xminpT[4] = {0.2, 0., -1., -3.14}; + double xmaxpT[4] = {1.5, 20., 1., +3.14}; + double xminy[4] = {0.2, 2.5, -1., -3.14}; + double xmaxy[4] = {1.5, 4.0, 1., +3.14}; + hm->AddHistogram(histClass, "Mass_Pt_cosThetaPP_phiPP", "", 4, varspTPP, binspT, xminpT, xmaxpT, 0, -1, kFALSE); + hm->AddHistogram(histClass, "Mass_y_cosThetaPP_phiPP", "", 4, varsrapPP, binsy, xminy, xmaxy, 0, -1, kFALSE); + } if (subGroupStr.Contains("upsilon-polarization-he")) { int varspTHE[4] = {VarManager::kMass, VarManager::kPt, VarManager::kCosThetaHE, VarManager::kPhiHE}; int varsrapHE[4] = {VarManager::kMass, VarManager::kRap, VarManager::kCosThetaHE, VarManager::kPhiHE}; From 80b85ea2099fe7ad58a48152ba73aad67758e0f1 Mon Sep 17 00:00:00 2001 From: Evgeny Kryshen Date: Wed, 28 May 2025 16:09:59 +0300 Subject: [PATCH 1441/1650] [Common] check if input scalers are available (#11391) --- Common/TableProducer/eventSelection.cxx | 45 ++++++------------------- 1 file changed, 10 insertions(+), 35 deletions(-) diff --git a/Common/TableProducer/eventSelection.cxx b/Common/TableProducer/eventSelection.cxx index e2aa27f6efe..b06e98b84c5 100644 --- a/Common/TableProducer/eventSelection.cxx +++ b/Common/TableProducer/eventSelection.cxx @@ -95,15 +95,6 @@ struct BcSelectionTask { bool isGoodITSLayersAll = true; // default value void init(InitContext&) { - if (metadataInfo.isFullyDefined() && !doprocessRun2 && !doprocessRun3) { // Check if the metadata is initialized (only if not forced from the workflow configuration) - LOG(info) << "Autosetting the processing mode (Run2 or Run3) based on metadata"; - if (metadataInfo.isRun3()) { - doprocessRun3.value = true; - } else { - doprocessRun2.value = true; - } - } - // ccdb->setURL("http://ccdb-test.cern.ch:8080"); ccdb->setURL("http://alice-ccdb.cern.ch"); ccdb->setCaching(true); @@ -580,14 +571,6 @@ struct EventSelectionTask { void init(InitContext&) { if (metadataInfo.isFullyDefined()) { // Check if the metadata is initialized (only if not forced from the workflow configuration) - if (!doprocessRun2 && !doprocessRun3) { - LOG(info) << "Autosetting the processing mode (Run2 or Run3) based on metadata"; - if (metadataInfo.isRun3()) { - doprocessRun3.value = true; - } else { - doprocessRun2.value = true; - } - } if (isMC == -1) { LOG(info) << "Autosetting the MC mode based on metadata"; if (metadataInfo.isMC()) { @@ -1186,15 +1169,6 @@ struct LumiTask { void init(InitContext&) { - if (metadataInfo.isFullyDefined() && !doprocessRun3 && !doprocessRun3) { // Check if the metadata is initialized (only if not forced from the workflow configuration) - LOG(info) << "Autosetting the processing mode (Run2 or Run3) based on metadata"; - if (metadataInfo.isRun3()) { - doprocessRun3.value = true; - } else { - doprocessRun2.value = true; - } - } - histos.add("hCounterTVX", "", kTH1D, {{1, 0., 1.}}); histos.add("hCounterTCE", "", kTH1D, {{1, 0., 1.}}); histos.add("hCounterZEM", "", kTH1D, {{1, 0., 1.}}); @@ -1277,12 +1251,12 @@ struct LumiTask { csZNC = -1; // Temporary workaround to get visible cross section. TODO: store run-by-run visible cross sections in CCDB if (beamZ1 == 1 && beamZ2 == 1) { - if (std::fabs(sqrts - 900.) < 20.) { // o2-linter: disable=magic-number (TODO store and extract cross sections from ccdb) - csTVX = 0.0357e6; // ub - } else if (std::fabs(sqrts - 5360.) < 20.) { // pp-ref // o2-linter: disable=magic-number (TODO store and extract cross sections from ccdb) - csTVX = 0.0503e6; // ub - } else if (std::fabs(sqrts - 13600.) < 20.) { // o2-linter: disable=magic-number (TODO store and extract cross sections from ccdb) - csTVX = 0.0594e6; // ub + if (std::fabs(sqrts - 900.) < 100.) { // o2-linter: disable=magic-number (TODO store and extract cross sections from ccdb) + csTVX = 0.0357e6; // ub + } else if (std::fabs(sqrts - 5360.) < 100.) { // pp-ref // o2-linter: disable=magic-number (TODO store and extract cross sections from ccdb) + csTVX = 0.0503e6; // ub + } else if (std::fabs(sqrts - 13600.) < 300.) { // o2-linter: disable=magic-number (TODO store and extract cross sections from ccdb) + csTVX = 0.0594e6; // ub } else { LOGP(warn, "Cross section for pp @ {} GeV is not defined", sqrts); } @@ -1346,13 +1320,14 @@ struct LumiTask { mOrbits.push_back(record.intRecord.orbit); mCounterTVX.push_back(classIdTVX >= 0 ? record.scalers[classIdTVX].lmBefore : 0); mCounterTCE.push_back(classIdTCE >= 0 ? record.scalers[classIdTCE].lmBefore : 0); - if (run >= 543437 && run < 544448) { // o2-linter: disable=magic-number (ZNC class not defined for this run range) - mCounterZNC.push_back(record.scalersInps[25]); // see ZNC=1ZNC input index in https://indico.cern.ch/event/1153630/contributions/4844362/ + if (run >= 543437 && run < 544448 && record.scalersInps.size() >= 26) { // o2-linter: disable=magic-number (ZNC class not defined for this run range) + mCounterZNC.push_back(record.scalersInps[25]); // see ZNC=1ZNC input index in https://indico.cern.ch/event/1153630/contributions/4844362/ } else { mCounterZNC.push_back(classIdZNC >= 0 ? record.scalers[classIdZNC].l1Before : 0); } // ZEM class not defined, using inputs instead - mCounterZEM.push_back(record.scalersInps[24]); // see ZEM=1ZED input index in https://indico.cern.ch/event/1153630/contributions/4844362/ + uint32_t indexZEM = 24; // see ZEM=1ZED input index in https://indico.cern.ch/event/1153630/contributions/4844362/ + mCounterZEM.push_back(record.scalersInps.size() >= indexZEM + 1 ? record.scalersInps[indexZEM] : 0); } // calculate pileup corrections From 5a2a7527a30e41358849feeb1b65e4119eb0fb2d Mon Sep 17 00:00:00 2001 From: Stefano Cannito <143754257+scannito@users.noreply.github.com> Date: Wed, 28 May 2025 17:22:33 +0200 Subject: [PATCH 1442/1650] [PWGLF] Investigating efficiencies with phi (#11394) --- .../Tasks/Strangeness/phik0shortanalysis.cxx | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx index cbc97acf8b8..c09b05ba107 100644 --- a/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/phik0shortanalysis.cxx @@ -311,11 +311,13 @@ struct Phik0shortanalysis { mcEventHist.add("hGenMCVertexZ", "hGenMCVertexZ", kTH1F, {vertexZAxis}); mcEventHist.add("hGenMCMultiplicityPercent", "GenMC Multiplicity Percentile", kTH1F, {binnedmultAxis}); + mcEventHist.add("hGenMCAssocRecoMultiplicityPercent", "GenMC AssocReco Multiplicity Percentile", kTH1F, {binnedmultAxis}); // Eta distribution for dN/deta values estimation in MC mcEventHist.add("h2RecMCEtaDistribution", "Eta vs multiplicity in MCReco", kTH2F, {binnedmultAxis, etaAxis}); mcEventHist.add("h2GenMCEtaDistribution", "Eta vs multiplicity in MCGen", kTH2F, {binnedmultAxis, etaAxis}); mcEventHist.add("h2GenMCEtaDistributionAssocReco", "Eta vs multiplicity in MCGen Assoc Reco", kTH2F, {binnedmultAxis, etaAxis}); + mcEventHist.add("h2GenMCEtaDistributionAssocReco2", "Eta vs multiplicity in MCGen Assoc Reco", kTH2F, {binnedmultAxis, etaAxis}); // Phi topological/PID cuts dataPhiHist.add("h2DauTracksPhiDCAxyPreCutData", "Dcaxy distribution vs pt before DCAxy cut", kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); @@ -2322,6 +2324,19 @@ struct Phik0shortanalysis { mcEventHist.fill(HIST("h2RecMCEtaDistribution"), genmultiplicity, mcTrack.eta()); } + + for (const auto& mcParticle : mcParticlesThisColl) { + if (!mcParticle.isPhysicalPrimary() || std::abs(mcParticle.eta()) > trackConfigs.etaMax) + continue; + + auto pdgTrack = pdgDB->GetParticle(mcParticle.pdgCode()); + if (pdgTrack == nullptr) + continue; + if (pdgTrack->Charge() == trackConfigs.cfgCutCharge) + continue; + + mcEventHist.fill(HIST("h2GenMCEtaDistributionAssocReco"), genmultiplicity, mcParticle.eta()); + } } PROCESS_SWITCH(Phik0shortanalysis, processdNdetaWPhiMCReco, "Process function for dN/deta values in MCReco", false); @@ -2345,6 +2360,8 @@ struct Phik0shortanalysis { float genmultiplicity = mcCollision.centFT0M(); mcEventHist.fill(HIST("hGenMCMultiplicityPercent"), genmultiplicity); + if (isAssocColl) + mcEventHist.fill(HIST("hGenMCAssocRecoMultiplicityPercent"), genmultiplicity); for (const auto& mcParticle : mcParticles) { if (!mcParticle.isPhysicalPrimary() || std::abs(mcParticle.eta()) > trackConfigs.etaMax) @@ -2358,7 +2375,7 @@ struct Phik0shortanalysis { mcEventHist.fill(HIST("h2GenMCEtaDistribution"), genmultiplicity, mcParticle.eta()); if (isAssocColl) - mcEventHist.fill(HIST("h2GenMCEtaDistributionAssocReco"), genmultiplicity, mcParticle.eta()); + mcEventHist.fill(HIST("h2GenMCEtaDistributionAssocReco2"), genmultiplicity, mcParticle.eta()); } } From d95cd2eb94af2d036e6335a201b83320bfa4084e Mon Sep 17 00:00:00 2001 From: suyoupeng <109774812+15071832337@users.noreply.github.com> Date: Thu, 29 May 2025 00:08:04 +0800 Subject: [PATCH 1443/1650] [PWGLF] Lambda local polarization induced by jet in pp collision 13.6 TeV (#11392) --- .../Strangeness/lambdaJetpolarization.cxx | 67 ++++++++++++++++++- 1 file changed, 64 insertions(+), 3 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx b/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx index 93c0b4381dc..b8af09b9c20 100644 --- a/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx +++ b/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx @@ -27,6 +27,7 @@ #include #include #include +#include "TProfile2D.h" #include "PWGLF/DataModel/lambdaJetpolarization.h" #include @@ -59,7 +60,6 @@ struct LfMyV0s { Configurable etaMin{"etaMin", -0.9f, "eta min"}; Configurable etaMax{"etaMax", +0.9f, "eta max"}; Configurable deltaEtaEdge{"deltaEtaEdge", 0.00, "eta gap from the edge"}; - Configurable minJetPt{"minJetPt", 10.0, "Minimum pt of the jet"}; // track parameters Configurable minITSnCls{"minITSnCls", 4.0f, "min number of ITS clusters"}; Configurable minTPCnClsFound{"minTPCnClsFound", 80.0f, "min number of found TPC clusters"}; @@ -113,6 +113,8 @@ struct LfMyV0s { Configurable v0accLambda{"v0accLambda", 0.075, "V0 acc Lambda"}; Configurable ifinitpasslambda{"ifinitpasslambda", 1, "ifinitpasslambda"}; Configurable ifpasslambda{"passedLambdaSelection", 0, "passedLambdaSelection"}; + Configurable paramArmenterosCut{"paramArmenterosCut", 0.2, "parameter Armenteros Cut"}; + Configurable doArmenterosCut{"doArmenterosCut", 0, "do Armenteros Cut"}; // Jet background subtraction JetBkgSubUtils backgroundSub; @@ -131,6 +133,8 @@ struct LfMyV0s { const AxisSpec ptAxis{100, 0.0f, 10.0f, "#it{p}_{T} (GeV/#it{c})"}; const AxisSpec invMassLambdaAxis{200, 1.09, 1.14, "m_{p#pi} (GeV/#it{c}^{2})"}; + ConfigurableAxis TProfile2DaxisPt{"#it{p}_{T} (GeV/#it{c})", {VARIABLE_WIDTH, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.2, 3.7, 4.2, 5, 6, 8, 10, 12}, "pt axis for histograms"}; + registry.add("hMassLambda", "hMassLambda", {HistType::kTH1F, {{200, 0.9f, 1.2f}}}); registry.add("V0pTInLab", "V0pTInLab", kTH1F, {axisPT}); registry.add("hMassVsPtLambda", "hMassVsPtLambda", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {200, 1.016f, 1.216f}}}); @@ -245,6 +249,17 @@ struct LfMyV0s { registryData.add("hLambdaPhiandSinPhi", "hLambdaPhiandSinPhi", kTH2F, {{200, -TMath::Pi() / 2, TMath::Pi() / 2}, {200, -1, 1}}); registryData.add("V0LambdaprotonPhi", "V0LambdaprotonPhi", {HistType::kTH1F, {{200, -TMath::Pi() / 2, TMath::Pi() / 2}}}); + registryData.add("profileAntiLambda", "Invariant Mass vs sin(phi)", {HistType::kTProfile, {{200, 0.9, 1.2}}}); + registryData.add("hAntiLambdamassandSinPhi", "hAntiLambdaPhiandSinPhi", kTH2F, {{200, -TMath::Pi() / 2, TMath::Pi() / 2}, {200, -1, 1}}); + + registryData.add("TProfile2DLambdaPtMassSinPhi", "", kTProfile2D, {invMassLambdaAxis, TProfile2DaxisPt}); + registryData.add("TProfile2DAntiLambdaPtMassSinPhi", "", kTProfile2D, {invMassLambdaAxis, TProfile2DaxisPt}); + registryData.add("TProfile2DLambdaPtMassSintheta", "", kTProfile2D, {invMassLambdaAxis, TProfile2DaxisPt}); + registryData.add("TProfile2DAntiLambdaPtMassSintheta", "", kTProfile2D, {invMassLambdaAxis, TProfile2DaxisPt}); + + registryData.add("TProfile2DLambdaPtMassCosSquareTheta", "", kTProfile2D, {invMassLambdaAxis, TProfile2DaxisPt}); + registryData.add("TProfile2DAntiLambdaPtMassCosSquareTheta", "", kTProfile2D, {invMassLambdaAxis, TProfile2DaxisPt}); + registryData.add("hNEvents", "hNEvents", {HistType::kTH1I, {{10, 0.f, 10.f}}}); registryData.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(1, "all"); registryData.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(2, "sel8"); @@ -655,6 +670,9 @@ struct LfMyV0s { if (TMath::Abs(v0.mLambda() - o2::constants::physics::MassLambda0) > v0accLambda) { return false; } + if (doArmenterosCut && v0.qtarm() > (paramArmenterosCut * std::abs(v0.alpha()))) + return false; + return true; } @@ -723,6 +741,8 @@ struct LfMyV0s { if (TMath::Abs(v0.mAntiLambda() - o2::constants::physics::MassLambda0) > v0accLambda) { return false; } + if (doArmenterosCut && v0.qtarm() > (paramArmenterosCut * std::abs(v0.alpha()))) + return false; return true; } @@ -890,6 +910,7 @@ struct LfMyV0s { registryData.fill(HIST("number_of_events_vsmultiplicity"), multiplicity); // v0 loop int V0Numbers = 0; + int AntiV0Numbers = 0; for (const auto& v0 : fullV0s) { const auto& pos = v0.posTrack_as(); const auto& neg = v0.negTrack_as(); @@ -899,6 +920,7 @@ struct LfMyV0s { registryData.fill(HIST("LambdaPtMass"), v0.pt(), v0.mLambda()); } if (passedAntiLambdaSelection(v0, pos, neg)) { + AntiV0Numbers = AntiV0Numbers + 1; registryData.fill(HIST("AntiLambdaPtMass"), v0.pt(), v0.mAntiLambda()); } } @@ -913,6 +935,7 @@ struct LfMyV0s { return; } double protonsinPhiInJetV0frame = 0; + double AntiprotonsinPhiInJetV0frame = 0; cout << maxJetpx << endl; for (const auto& candidate : fullV0s) { const auto& pos = candidate.posTrack_as(); @@ -982,7 +1005,7 @@ struct LfMyV0s { double protonPinJetV0 = sqrt(protonInJetV0(1, 0) * protonInJetV0(1, 0) + protonInJetV0(2, 0) * protonInJetV0(2, 0) + protonInJetV0(3, 0) * protonInJetV0(3, 0)); double protonPtinJetV0 = sqrt(protonInJetV0(1, 0) * protonInJetV0(1, 0) + protonInJetV0(2, 0) * protonInJetV0(2, 0)); - double protonCosThetainJetV0 = protonInV0(3, 0) / protonPinJetV0; + double protonCosThetainJetV0 = protonInJetV0(3, 0) / protonPinJetV0; double protonSinThetainJetV0 = protonPtinJetV0 / protonPinJetV0; double protonthetainJetV0 = TMath::ASin(protonSinThetainJetV0); registryV0Data.fill(HIST("hprotoncosthetainJetV0"), protonCosThetainJetV0); @@ -997,6 +1020,41 @@ struct LfMyV0s { registryV0Data.fill(HIST("AverageSinthetainJetV0"), candidate.mLambda(), protonSinThetainJetV0); registryV0Data.fill(HIST("AverageCosSquarethetainJetV0"), candidate.mLambda(), protonCosThetainJetV0 * protonCosThetainJetV0); protonsinPhiInJetV0frame = protonsinPhiInJetV0frame + protonInJetV0(2, 0) / sqrt(protonInJetV0(1, 0) * protonInJetV0(1, 0) + protonInJetV0(2, 0) * protonInJetV0(2, 0)); + + registryData.fill(HIST("TProfile2DLambdaPtMassSinPhi"), candidate.mLambda(), candidate.pt(), protonInJetV0(2, 0) / sqrt(protonInJetV0(1, 0) * protonInJetV0(1, 0) + protonInJetV0(2, 0) * protonInJetV0(2, 0))); + registryData.fill(HIST("TProfile2DLambdaPtMassSintheta"), candidate.mLambda(), candidate.pt(), protonSinThetainJetV0); + registryData.fill(HIST("TProfile2DLambdaPtMassCosSquareTheta"), candidate.mLambda(), candidate.pt(), protonCosThetainJetV0 * protonCosThetainJetV0); + } + if (passedAntiLambdaSelection(candidate, pos, neg)) { + double PAntiLambda = sqrt(candidate.px() * candidate.px() + candidate.py() * candidate.py() + candidate.pz() * candidate.pz()); + double EAntiLambda = sqrt(candidate.mAntiLambda() * candidate.mAntiLambda() + PAntiLambda * PAntiLambda); + double AntiprotonE = sqrt(massPr * massPr + neg.px() * neg.px() + neg.py() * neg.py() + neg.pz() * neg.pz()); + TMatrixD pLabAntiV0(4, 1); + pLabAntiV0(0, 0) = EAntiLambda; + pLabAntiV0(1, 0) = candidate.px(); + pLabAntiV0(2, 0) = candidate.py(); + pLabAntiV0(3, 0) = candidate.pz(); + + TMatrixD AntilambdaInJet(4, 1); + AntilambdaInJet = MyTMatrixTranslationToJet(maxJetpx, maxJetpy, maxJetpz, candidate.px(), candidate.py(), candidate.pz()) * pLabAntiV0; + + TMatrixD pLabAntiproton(4, 1); + pLabAntiproton(0, 0) = AntiprotonE; + pLabAntiproton(1, 0) = neg.px(); + pLabAntiproton(2, 0) = neg.py(); + pLabAntiproton(3, 0) = neg.pz(); + TMatrixD AntiprotonInJetV0(4, 1); + AntiprotonInJetV0 = LorentzTransInV0frame(EAntiLambda, AntilambdaInJet(1, 0), AntilambdaInJet(2, 0), AntilambdaInJet(3, 0)) * MyTMatrixTranslationToJet(maxJetpx, maxJetpy, maxJetpz, candidate.px(), candidate.py(), candidate.pz()) * pLabAntiproton; + AntiprotonsinPhiInJetV0frame = AntiprotonsinPhiInJetV0frame + AntiprotonInJetV0(2, 0) / sqrt(AntiprotonInJetV0(1, 0) * AntiprotonInJetV0(1, 0) + AntiprotonInJetV0(2, 0) * AntiprotonInJetV0(2, 0)); + registryData.fill(HIST("TProfile2DAntiLambdaPtMassSinPhi"), candidate.mAntiLambda(), candidate.pt(), AntiprotonInJetV0(2, 0) / sqrt(AntiprotonInJetV0(1, 0) * AntiprotonInJetV0(1, 0) + AntiprotonInJetV0(2, 0) * AntiprotonInJetV0(2, 0))); + TMatrixD AntiprotonInV0(4, 1); + AntiprotonInV0 = LorentzTransInV0frame(EAntiLambda, candidate.px(), candidate.py(), candidate.pz()) * pLabAntiproton; + double AntiprotonPinJetV0 = sqrt(AntiprotonInJetV0(1, 0) * AntiprotonInJetV0(1, 0) + AntiprotonInJetV0(2, 0) * AntiprotonInJetV0(2, 0) + AntiprotonInJetV0(3, 0) * AntiprotonInJetV0(3, 0)); + double AntiprotonPtinJetV0 = sqrt(AntiprotonInJetV0(1, 0) * AntiprotonInJetV0(1, 0) + AntiprotonInJetV0(2, 0) * AntiprotonInJetV0(2, 0)); + double AntiprotonCosThetainJetV0 = AntiprotonInJetV0(3, 0) / AntiprotonPinJetV0; + double AntiprotonSinThetainJetV0 = AntiprotonPtinJetV0 / AntiprotonPinJetV0; + registryData.fill(HIST("TProfile2DAntiLambdaPtMassSintheta"), candidate.mAntiLambda(), candidate.pt(), AntiprotonSinThetainJetV0); + registryData.fill(HIST("TProfile2DAntiLambdaPtMassCosSquareTheta"), candidate.mAntiLambda(), candidate.pt(), AntiprotonCosThetainJetV0 * AntiprotonCosThetainJetV0); } } @@ -1009,6 +1067,10 @@ struct LfMyV0s { registryData.fill(HIST("V0LambdaprotonPhi"), TMath::ASin(protonsinPhiInJetV0frame / V0Numbers)); registryData.fill(HIST("profileLambda"), candidate.mLambda(), protonsinPhiInJetV0frame / V0Numbers); } + if (passedAntiLambdaSelection(candidate, pos, neg)) { + registryData.fill(HIST("hAntiLambdamassandSinPhi"), candidate.mAntiLambda(), AntiprotonsinPhiInJetV0frame / AntiV0Numbers); + registryData.fill(HIST("profileAntiLambda"), candidate.mAntiLambda(), AntiprotonsinPhiInJetV0frame / AntiV0Numbers); + } } } PROCESS_SWITCH(LfMyV0s, processData, "processData", true); @@ -1019,7 +1081,6 @@ struct LfMyV0s { if (!AcceptEvent(collision)) { return; } - registryData.fill(HIST("hNEvents"), 8.5); int V0NumbersPerEvent = 0; int V0NumbersPerEventsel = 0; From 0ef4b48e9b94c968105f1e20586d117bede7a3b7 Mon Sep 17 00:00:00 2001 From: Yash Patley <52608802+yashpatley@users.noreply.github.com> Date: Thu, 29 May 2025 01:48:07 +0530 Subject: [PATCH 1444/1650] [PWGCF] Update lambdaR2Correlation.cxx (#11393) --- .../Tasks/lambdaR2Correlation.cxx | 276 +++++++++--------- 1 file changed, 132 insertions(+), 144 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx index 1e212aacf95..1d3ce7815ef 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx @@ -34,7 +34,6 @@ using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::constants::physics; using namespace o2::constants::math; -// using namespace o2::ml; namespace o2::aod { @@ -171,12 +170,14 @@ enum TrackLabels { kPassTrueLambdaSel, kEffCorrPt, kEffCorrPtRap, - kEffCorrPtRapPhi, + kEffCorrPtRapCent, kNoEffCorr, kPFCorrPt, - kPFCorrPtRap, - kPFCorrPtRapPhi, + kPFCorrPtCent, + kPFCorrPtCentPhi, kNoPFCorr, + kCorrFact, + kErrCorrFact, kGenTotAccLambda, kGenLambdaNoDau, kGenLambdaToPrPi @@ -321,18 +322,14 @@ struct LambdaTableProducer { HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; // initialize corr_factor objects - std::vector> vCorrFactStrings = {{"hEffVsPtLambda", "hEffVsPtAntiLambda"}, - {"hEffVsPtYLambda", "hEffVsPtYAntiLambda"}, - {"hEffVsPtEtaLambda", "hEffVsPtEtaAntiLambda"}, - {"hEffVsPtYPhiLambda", "hEffVsPtYPhiAntiLambda"}, - {"hEffVsPtEtaPhiLambda", "hEffVsPtEtaPhiAntiLambda"}}; + std::vector> vCorrFactStrings = {{"hEffVsPtCentLambda", "hEffVsPtCentAntiLambda"}, + {"hEffVsPtYCentLambda", "hEffVsPtYCentAntiLambda"}, + {"hEffVsPtEtaCentLambda", "hEffVsPtEtaCentAntiLambda"}}; // initialize corr_factor objects - std::vector> vPrimFracStrings = {{"hPrimFracVsPtLambda", "hPrimFracVsPtAntiLambda"}, - {"hPrimFracVsPtYLambda", "hPrimFracVsPtYAntiLambda"}, - {"hPrimFracVsPtEtaLambda", "hPrimFracVsPtEtaAntiLambda"}, - {"hPrimFracVsPtYPhiLambda", "hPrimFracVsPtYPhiAntiLambda"}, - {"hPrimFracVsPtEtaPhiLambda", "hPrimFracVsPtEtaPhiAntiLambda"}}; + std::vector> vPrimFracStrings = {{"hPrimFracVsPtCentLambda", "hPrimFracVsPtCentAntiLambda"}, + {"hPrimFracVsPtYCentLambda", "hPrimFracVsPtYCentAntiLambda"}, + {"hPrimFracVsPtEtaCentLambda", "hPrimFracVsPtEtaCentAntiLambda"}}; // Initialize Global Variables float cent = 0.; @@ -490,12 +487,14 @@ struct LambdaTableProducer { histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kAllSelPassed, "kAllSelPassed"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kEffCorrPt, "kEffCorrPt"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kEffCorrPtRap, "kEffCorrPtRap"); - histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kEffCorrPtRapPhi, "kEffCorrPtRapPhi"); + histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kEffCorrPtRapCent, "kEffCorrPtRapCent"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kNoEffCorr, "kNoEffCorr"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPFCorrPt, "kPFCorrPt"); - histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPFCorrPtRap, "kPFCorrPtRap"); - histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPFCorrPtRapPhi, "kPFCorrPtRapPhi"); + histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPFCorrPtCent, "kPFCorrPtCent"); + histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPFCorrPtCentPhi, "kPFCorrPtCentPhi"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kNoPFCorr, "kNoPFCorr"); + histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kCorrFact, "kCorrFact"); + histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kErrCorrFact, "kErrCorrFact"); } template @@ -895,15 +894,9 @@ struct LambdaTableProducer { if (cGetEffFact) { TObject* objEff = reinterpret_cast(ccdbObj->FindObject(Form("%s", vCorrFactStrings[cCorrFactHist][part].c_str()))); TH1F* histEff = reinterpret_cast(objEff->Clone()); - if (histEff->GetDimension() == OneDimCorr) { - histos.fill(HIST("Tracks/h1f_tracks_info"), kEffCorrPt); - effFact = histEff->GetBinContent(histEff->FindBin(v0.pt())); - } else if (histEff->GetDimension() == TwoDimCorr) { - histos.fill(HIST("Tracks/h1f_tracks_info"), kEffCorrPtRap); - effFact = histEff->GetBinContent(histEff->FindBin(v0.pt(), rap)); - } else if (histEff->GetDimension() == ThreeDimCorr) { - histos.fill(HIST("Tracks/h1f_tracks_info"), kEffCorrPtRapPhi); - effFact = histEff->GetBinContent(histEff->FindBin(v0.pt(), rap, v0.phi())); + if (histEff->GetDimension() == ThreeDimCorr) { + histos.fill(HIST("Tracks/h1f_tracks_info"), kEffCorrPtRapCent); + effFact = histEff->GetBinContent(histEff->FindBin(cent, v0.pt(), rap)); } else { histos.fill(HIST("Tracks/h1f_tracks_info"), kNoEffCorr); LOGF(warning, "CCDB OBJECT IS NOT A HISTOGRAM !!!"); @@ -917,15 +910,9 @@ struct LambdaTableProducer { if (cGetPrimFrac) { TObject* objPrm = reinterpret_cast(ccdbObj->FindObject(Form("%s", vPrimFracStrings[cPrimFracHist][part].c_str()))); TH1F* histPrm = reinterpret_cast(objPrm->Clone()); - if (histPrm->GetDimension() == OneDimCorr) { - histos.fill(HIST("Tracks/h1f_tracks_info"), kPFCorrPt); - primFrac = histPrm->GetBinContent(histPrm->FindBin(v0.pt())); - } else if (histPrm->GetDimension() == TwoDimCorr) { - histos.fill(HIST("Tracks/h1f_tracks_info"), kPFCorrPtRap); - primFrac = histPrm->GetBinContent(histPrm->FindBin(v0.pt(), rap)); - } else if (histPrm->GetDimension() == ThreeDimCorr) { - histos.fill(HIST("Tracks/h1f_tracks_info"), kPFCorrPtRapPhi); - primFrac = histPrm->GetBinContent(histPrm->FindBin(v0.pt(), rap, v0.phi())); + if (histPrm->GetDimension() == TwoDimCorr) { + histos.fill(HIST("Tracks/h1f_tracks_info"), kPFCorrPtCent); + primFrac = histPrm->GetBinContent(histPrm->FindBin(cent, v0.pt())); } else { histos.fill(HIST("Tracks/h1f_tracks_info"), kNoPFCorr); LOGF(warning, "CCDB OBJECT IS NOT A HISTOGRAM !!!"); @@ -934,7 +921,13 @@ struct LambdaTableProducer { delete histPrm; } - return primFrac / effFact; + if (effFact != 0) { + histos.fill(HIST("Tracks/h1f_tracks_info"), kCorrFact); + return primFrac / effFact; + } + + histos.fill(HIST("Tracks/h1f_tracks_info"), kErrCorrFact); + return 1.; } template @@ -1070,10 +1063,6 @@ struct LambdaTableProducer { ctau = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * MassLambda0; mass = (v0Type == kLambda) ? v0.mLambda() : v0.mAntiLambda(); - // Machine-Learning Model (To be implemented in future...) - // std::vector modelInput = {v0.pt(), v0.yLambda(), v0.phi(), mass, v0.v0cosPA(), v0.dcaV0daughters(), dcapiontopv, dcaprotontopv, v0.dcav0topv(), ctau, v0.v0radius()} - // float* modelOutput = network.evalModel(modelInput); - histos.fill(HIST("Tracks/h1f_tracks_info"), kAllSelPassed); // we have v0 as lambda @@ -1132,7 +1121,7 @@ struct LambdaTableProducer { void fillLambdaMcGenTables(C const& mcCollision, M const& mcParticles) { // Fill McGen Collision Table - lambdaMCGenCollisionTable(mcCollision.centFT0M(), mcCollision.posX(), mcCollision.posY(), mcCollision.posZ()); + lambdaMCGenCollisionTable(cent, mcCollision.posX(), mcCollision.posY(), mcCollision.posZ()); // initialize track objects ParticleType v0Type = kLambda; @@ -1261,7 +1250,6 @@ struct LambdaTableProducer { } histos.fill(HIST("McGen/h1f_collisions_info"), kPassSelCol); histos.fill(HIST("McGen/h2f_collision_posZ"), mcCollision.posZ(), collisions.begin().posZ()); - histos.fill(HIST("McGen/h2f_collision_cent"), mcCollision.centFT0M(), cent); auto v0Tracks = V0s.sliceBy(perCollision, collisions.begin().globalIndex()); fillLambdaRecoTables(collisions.begin(), v0Tracks, tracks); fillLambdaMcGenTables(mcCollision, mcParticles); @@ -1290,7 +1278,7 @@ struct LambdaTableProducer { PROCESS_SWITCH(LambdaTableProducer, processDataRun2, "Process for Run2 DATA", false); - void processMCRun3(soa::Join::iterator const& mcCollision, + void processMCRun3(aod::McCollisions::iterator const& mcCollision, soa::SmallGroups> const& collisions, McV0Tracks const& V0s, TracksMC const& tracks, aod::McParticles const& mcParticles) @@ -1300,7 +1288,7 @@ struct LambdaTableProducer { PROCESS_SWITCH(LambdaTableProducer, processMCRun3, "Process for Run3 MC RecoGen", false); - void processMCRun2(soa::Join::iterator const& mcCollision, + void processMCRun2(aod::McCollisions::iterator const& mcCollision, soa::SmallGroups> const& collisions, McV0Tracks const& V0s, TracksMC const& tracks, aod::McParticles const& mcParticles) @@ -1475,19 +1463,22 @@ struct LambdaTracksExtProducer { }; struct LambdaR2Correlation { - // Global Configurables - Configurable cNPtBins{"cNPtBins", 10, "N pT Bins"}; + Configurable cNPtBins{"cNPtBins", 34, "N pT Bins"}; Configurable cMinPt{"cMinPt", 0.8, "pT Min"}; - Configurable cMaxPt{"cMaxPt", 2.8, "pT Max"}; - Configurable cNRapBins{"cNRapBins", 12, "N Rapidity Bins"}; - Configurable cMinRap{"cMinRap", -0.6, "Minimum Rapidity"}; - Configurable cMaxRap{"cMaxRap", 0.6, "Maximum Rapidity"}; + Configurable cMaxPt{"cMaxPt", 4.2, "pT Max"}; + Configurable cNRapBins{"cNRapBins", 20, "N Rapidity Bins"}; + Configurable cMinRap{"cMinRap", -0.5, "Minimum Rapidity"}; + Configurable cMaxRap{"cMaxRap", 0.5, "Maximum Rapidity"}; Configurable cNPhiBins{"cNPhiBins", 36, "N Phi Bins"}; + Configurable cAnaPairs{"cAnaPairs", true, "Analyze Pairs Flag (Not required for efficiency computation)"}; // Eta/Rap Analysis Configurable cDoEtaAnalysis{"cDoEtaAnalysis", false, "Eta/Rap Analysis Flag"}; + // Centrality Axis + ConfigurableAxis cMultBins{"cMultBins", {VARIABLE_WIDTH, 0.0f, 10.0f, 30.0f, 50.f, 80.0f, 100.f}, "Variable Mult-Bins"}; + // Histogram Registry. HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -1501,6 +1492,7 @@ struct LambdaR2Correlation { float rapbinwidth = 0.; float phibinwidth = 0.; float q = 0., e = 0., qinv = 0.; + float cent = 0.; void init(InitContext const&) { @@ -1519,7 +1511,7 @@ struct LambdaR2Correlation { const AxisSpec axisCheck(1, 0, 1, ""); const AxisSpec axisPosZ(220, -11, 11, "V_{z} (cm)"); - const AxisSpec axisCent(105, 0, 105, "FT0M (%)"); + const AxisSpec axisCent(cMultBins, "FT0M (%)"); const AxisSpec axisMult(10, 0, 10, "N_{#Lambda}"); const AxisSpec axisMass(100, 1.06, 1.16, "M_{#Lambda} (GeV/#it{c}^{2})"); const AxisSpec axisPt(cNPtBins, cMinPt, cMaxPt, "p_{T} (GeV/#it{c})"); @@ -1529,11 +1521,6 @@ struct LambdaR2Correlation { const AxisSpec axisRapPhi(knrapphibins, kminrapphi, kmaxrapphi, "y #varphi"); const AxisSpec axisQinv(100, 0, 10, "q_{inv} (GeV/#it{c})"); - const AxisSpec axisEfPt(cNPtBins, cMinPt, cMaxPt, "p_{T}"); - const AxisSpec axisEfEta(cNRapBins, cMinRap, cMaxRap, "#eta"); - const AxisSpec axisEfRap(cNRapBins, cMinRap, cMaxRap, "y"); - const AxisSpec axisEfPhi(cNPhiBins, 0., TwoPI, "#varphi"); - // Create Histograms. // Event histos.add("Event/Reco/h1f_collision_posz", "V_{Z} Distribution", kTH1F, {axisPosZ}); @@ -1543,65 +1530,59 @@ struct LambdaR2Correlation { // Efficiency Histograms // Single Particle Efficiencies - histos.add("Reco/Primary/Efficiency/h1f_n1_pt_LaP", "#rho_{1}^{#Lambda}", kTH1F, {axisEfPt}); - histos.add("Reco/Primary/Efficiency/h1f_n1_pt_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH1F, {axisEfPt}); - histos.add("Reco/Primary/Efficiency/h3f_n1_ptetaphi_LaP", "#rho_{1}^{#Lambda}", kTH3F, {axisEfPt, axisEfEta, axisEfPhi}); - histos.add("Reco/Primary/Efficiency/h3f_n1_ptetaphi_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH3F, {axisEfPt, axisEfEta, axisEfPhi}); - histos.add("Reco/Primary/Efficiency/h3f_n1_ptrapphi_LaP", "#rho_{1}^{#Lambda}", kTH3F, {axisEfPt, axisEfRap, axisEfPhi}); - histos.add("Reco/Primary/Efficiency/h3f_n1_ptrapphi_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH3F, {axisEfPt, axisEfRap, axisEfPhi}); + histos.add("Reco/Primary/Efficiency/h2f_n1_centpt_LaP", "#rho_{1}^{#Lambda}", kTH2F, {axisCent, axisPt}); + histos.add("Reco/Primary/Efficiency/h2f_n1_centpt_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH2F, {axisCent, axisPt}); + histos.add("Reco/Primary/Efficiency/h3f_n1_centpteta_LaP", "#rho_{1}^{#Lambda}", kTH3F, {axisCent, axisPt, axisEta}); + histos.add("Reco/Primary/Efficiency/h3f_n1_centpteta_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH3F, {axisCent, axisPt, axisEta}); + histos.add("Reco/Primary/Efficiency/h3f_n1_centptrap_LaP", "#rho_{1}^{#Lambda}", kTH3F, {axisCent, axisPt, axisRap}); + histos.add("Reco/Primary/Efficiency/h3f_n1_centptrap_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH3F, {axisCent, axisPt, axisRap}); // Single and Two Particle Densities // 1D Histograms - histos.add("Reco/Primary/h1d_n1_mass_LaP", "#rho_{1}^{#Lambda}", kTH1D, {axisMass}); - histos.add("Reco/Primary/h1d_n1_mass_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH1D, {axisMass}); - histos.add("Reco/Primary/h1d_n1_pt_LaP", "#rho_{1}^{#Lambda}", kTH1D, {axisPt}); - histos.add("Reco/Primary/h1d_n1_pt_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH1D, {axisPt}); - histos.add("Reco/Primary/h1d_n1_eta_LaP", "#rho_{1}^{#Lambda}", kTH1D, {axisEta}); - histos.add("Reco/Primary/h1d_n1_eta_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH1D, {axisEta}); - histos.add("Reco/Primary/h1d_n1_rap_LaP", "#rho_{1}^{#Lambda}", kTH1D, {axisRap}); - histos.add("Reco/Primary/h1d_n1_rap_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH1D, {axisRap}); - histos.add("Reco/Primary/h1d_n1_phi_LaP", "#rho_{1}^{#Lambda}", kTH1D, {axisPhi}); - histos.add("Reco/Primary/h1d_n1_phi_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH1D, {axisPhi}); + histos.add("Reco/Primary/h2f_n1_pt_LaP", "#rho_{1}^{#Lambda}", kTH2F, {axisCent, axisPt}); + histos.add("Reco/Primary/h2f_n1_pt_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH2F, {axisCent, axisPt}); + histos.add("Reco/Primary/h2f_n1_eta_LaP", "#rho_{1}^{#Lambda}", kTH2F, {axisCent, axisEta}); + histos.add("Reco/Primary/h2f_n1_eta_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH2F, {axisCent, axisEta}); + histos.add("Reco/Primary/h2f_n1_rap_LaP", "#rho_{1}^{#Lambda}", kTH2F, {axisCent, axisRap}); + histos.add("Reco/Primary/h2f_n1_rap_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH2F, {axisCent, axisRap}); + histos.add("Reco/Primary/h2f_n1_phi_LaP", "#rho_{1}^{#Lambda}", kTH2F, {axisCent, axisPhi}); + histos.add("Reco/Primary/h2f_n1_phi_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH2F, {axisCent, axisPhi}); // rho1 for R2 RapPhi - histos.add("Reco/Primary/h2d_n1_rapphi_LaP", "#rho_{1}^{#Lambda}", kTH2D, {axisRap, axisPhi}); - histos.add("Reco/Primary/h2d_n1_rapphi_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH2D, {axisRap, axisPhi}); + histos.add("Reco/Primary/h3f_n1_rapphi_LaP", "#rho_{1}^{#Lambda}", kTH3F, {axisCent, axisRap, axisPhi}); + histos.add("Reco/Primary/h3f_n1_rapphi_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH3F, {axisCent, axisRap, axisPhi}); // rho1 for Q_{inv} - histos.add("Reco/Primary/h2d_n1_pteta_LaP", "#rho_{1}^{#Lambda}", kTH2D, {axisPt, axisEta}); - histos.add("Reco/Primary/h2d_n1_pteta_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH2D, {axisPt, axisEta}); + histos.add("Reco/Primary/h3f_n1_pteta_LaP", "#rho_{1}^{#Lambda}", kTH3F, {axisCent, axisPt, axisEta}); + histos.add("Reco/Primary/h3f_n1_pteta_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH3F, {axisCent, axisPt, axisEta}); // Clone Singles Histogram histos.addClone("Reco/Primary/", "Reco/Secondary/"); - // rho2 for numerator of R2 - histos.add("Reco/PP/h2d_n2_ptpt_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisPt, axisPt}); - histos.add("Reco/PP/h2d_n2_ptpt_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisPt, axisPt}); - histos.add("Reco/PP/h2d_n2_ptpt_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisPt, axisPt}); - histos.add("Reco/PP/h2d_n2_etaeta_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisEta, axisEta}); - histos.add("Reco/PP/h2d_n2_etaeta_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisEta, axisEta}); - histos.add("Reco/PP/h2d_n2_etaeta_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisEta, axisEta}); - histos.add("Reco/PP/h2d_n2_raprap_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisRap, axisRap}); - histos.add("Reco/PP/h2d_n2_raprap_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisRap, axisRap}); - histos.add("Reco/PP/h2d_n2_raprap_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisRap, axisRap}); - histos.add("Reco/PP/h2d_n2_phiphi_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisPhi, axisPhi}); - histos.add("Reco/PP/h2d_n2_phiphi_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisPhi, axisPhi}); - histos.add("Reco/PP/h2d_n2_phiphi_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisPhi, axisPhi}); - - // rho2 for R2 Rap1Phi1Rap2Phi2 - histos.add("Reco/PP/h2d_n2_rapphi_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2D, {axisRapPhi, axisRapPhi}); - histos.add("Reco/PP/h2d_n2_rapphi_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2D, {axisRapPhi, axisRapPhi}); - histos.add("Reco/PP/h2d_n2_rapphi_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2D, {axisRapPhi, axisRapPhi}); - - // rho2 for R2 Qinv - histos.add("Reco/PP/h1d_n2_qinv_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH1D, {axisQinv}); - histos.add("Reco/PP/h1d_n2_qinv_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH1D, {axisQinv}); - histos.add("Reco/PP/h1d_n2_qinv_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH1D, {axisQinv}); - - // Clone Pairs Histograms - histos.addClone("Reco/PP/", "Reco/PS/"); - histos.addClone("Reco/PP/", "Reco/SP/"); - histos.addClone("Reco/PP/", "Reco/SS/"); + if (cAnaPairs) { + // rho2 for numerator of R2 + histos.add("Reco/PP/h3f_n2_raprap_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH3F, {axisCent, axisRap, axisRap}); + histos.add("Reco/PP/h3f_n2_raprap_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH3F, {axisCent, axisRap, axisRap}); + histos.add("Reco/PP/h3f_n2_raprap_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH3F, {axisCent, axisRap, axisRap}); + histos.add("Reco/PP/h3f_n2_phiphi_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH3F, {axisCent, axisPhi, axisPhi}); + histos.add("Reco/PP/h3f_n2_phiphi_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH3F, {axisCent, axisPhi, axisPhi}); + histos.add("Reco/PP/h3f_n2_phiphi_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH3F, {axisCent, axisPhi, axisPhi}); + + // rho2 for R2 Rap1Phi1Rap2Phi2 + histos.add("Reco/PP/h3f_n2_rapphi_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH3F, {axisCent, axisRapPhi, axisRapPhi}); + histos.add("Reco/PP/h3f_n2_rapphi_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH3F, {axisCent, axisRapPhi, axisRapPhi}); + histos.add("Reco/PP/h3f_n2_rapphi_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH3F, {axisCent, axisRapPhi, axisRapPhi}); + + // rho2 for R2 Qinv + histos.add("Reco/PP/h2f_n2_qinv_LaP_LaM", "#rho_{2}^{#Lambda#bar{#Lambda}}", kTH2F, {axisCent, axisQinv}); + histos.add("Reco/PP/h2f_n2_qinv_LaP_LaP", "#rho_{2}^{#Lambda#Lambda}", kTH2F, {axisCent, axisQinv}); + histos.add("Reco/PP/h2f_n2_qinv_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2F, {axisCent, axisQinv}); + + // Clone Pairs Histograms + histos.addClone("Reco/PP/", "Reco/PS/"); + histos.addClone("Reco/PP/", "Reco/SP/"); + histos.addClone("Reco/PP/", "Reco/SS/"); + } // MCGen if (doprocessMCGen) { @@ -1629,24 +1610,22 @@ struct LambdaR2Correlation { float corfac = p1.corrFact() * p2.corrFact(); // fill rho2 histograms - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[psp]) + HIST("h2d_n2_ptpt_") + HIST(SubDirHist[part_pair]), p1.pt(), p2.pt(), corfac); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[psp]) + HIST("h2d_n2_etaeta_") + HIST(SubDirHist[part_pair]), p1.eta(), p2.eta(), corfac); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[psp]) + HIST("h2d_n2_raprap_") + HIST(SubDirHist[part_pair]), p1.rap(), p2.rap(), corfac); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[psp]) + HIST("h2d_n2_phiphi_") + HIST(SubDirHist[part_pair]), p1.phi(), p2.phi(), corfac); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[psp]) + HIST("h3f_n2_raprap_") + HIST(SubDirHist[part_pair]), cent, rap1, rap2, corfac); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[psp]) + HIST("h3f_n2_phiphi_") + HIST(SubDirHist[part_pair]), cent, p1.phi(), p2.phi(), corfac); if (rapbin1 >= 0 && rapbin2 >= 0 && phibin1 >= 0 && phibin2 >= 0 && rapbin1 < nrapbins && rapbin2 < nrapbins && phibin1 < nphibins && phibin2 < nphibins) { int rapphix = rapbin1 * nphibins + phibin1; int rapphiy = rapbin2 * nphibins + phibin2; - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[psp]) + HIST("h2d_n2_rapphi_") + HIST(SubDirHist[part_pair]), rapphix + 0.5, rapphiy + 0.5, corfac); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[psp]) + HIST("h3f_n2_rapphi_") + HIST(SubDirHist[part_pair]), cent, rapphix + 0.5, rapphiy + 0.5, corfac); } // qinv histograms q = RecoDecay::p((p1.px() - p2.px()), (p1.py() - p2.py()), (p1.pz() - p2.pz())); e = RecoDecay::e(p1.px(), p1.py(), p1.pz(), MassLambda0) - RecoDecay::e(p2.px(), p2.py(), p2.pz(), MassLambda0); qinv = std::sqrt(-RecoDecay::m2(q, e)); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[psp]) + HIST("h1d_n2_qinv_") + HIST(SubDirHist[part_pair]), qinv, corfac); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[psp]) + HIST("h2f_n2_qinv_") + HIST(SubDirHist[part_pair]), cent, qinv, corfac); } template @@ -1663,22 +1642,21 @@ struct LambdaR2Correlation { ++ntrk; // Efficiency Plots - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("Efficiency/h1f_n1_pt_") + HIST(SubDirHist[part]), track.pt()); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("Efficiency/h3f_n1_ptetaphi_") + HIST(SubDirHist[part]), track.pt(), track.eta(), track.phi()); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("Efficiency/h3f_n1_ptrapphi_") + HIST(SubDirHist[part]), track.pt(), track.rap(), track.phi()); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("Efficiency/h2f_n1_centpt_") + HIST(SubDirHist[part]), cent, track.pt()); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("Efficiency/h3f_n1_centpteta_") + HIST(SubDirHist[part]), cent, track.pt(), track.eta()); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("Efficiency/h3f_n1_centptrap_") + HIST(SubDirHist[part]), cent, track.pt(), track.rap()); // QA Plots - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("h1d_n1_mass_") + HIST(SubDirHist[part]), track.mass()); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("h1d_n1_pt_") + HIST(SubDirHist[part]), track.pt(), track.corrFact()); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("h1d_n1_eta_") + HIST(SubDirHist[part]), track.eta(), track.corrFact()); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("h1d_n1_phi_") + HIST(SubDirHist[part]), track.phi(), track.corrFact()); - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("h1d_n1_rap_") + HIST(SubDirHist[part]), track.rap(), track.corrFact()); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("h2f_n1_pt_") + HIST(SubDirHist[part]), cent, track.pt(), track.corrFact()); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("h2f_n1_eta_") + HIST(SubDirHist[part]), cent, track.eta(), track.corrFact()); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("h2f_n1_phi_") + HIST(SubDirHist[part]), cent, track.phi(), track.corrFact()); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("h2f_n1_rap_") + HIST(SubDirHist[part]), cent, track.rap(), track.corrFact()); // Rho1 for N1RapPhi - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("h2d_n1_rapphi_") + HIST(SubDirHist[part]), track.rap(), track.phi(), track.corrFact()); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("h3f_n1_rapphi_") + HIST(SubDirHist[part]), cent, track.rap(), track.phi(), track.corrFact()); // Rho1 for Q_{inv} Bkg Estimation - histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("h2d_n1_pteta_") + HIST(SubDirHist[part]), track.pt(), track.eta(), track.corrFact()); + histos.fill(HIST(SubDirRecGen[rec_gen]) + HIST(SubDirPrmScd[pst]) + HIST("h3f_n1_pteta_") + HIST(SubDirHist[part]), cent, track.pt(), track.eta(), track.corrFact()); } // fill multiplicity histograms @@ -1719,6 +1697,8 @@ struct LambdaR2Correlation { histos.fill(HIST("Event/Reco/h1f_collision_posz"), collision.posZ()); histos.fill(HIST("Event/Reco/h1f_ft0m_mult_percentile"), collision.cent()); + cent = collision.cent(); + auto lambdaPrimTracks = partPrimLambdaTracks->sliceByCached(aod::lambdatrack::lambdaCollisionId, collision.globalIndex(), cache); auto antiLambdaPrimTracks = partPrimAntiLambdaTracks->sliceByCached(aod::lambdatrack::lambdaCollisionId, collision.globalIndex(), cache); auto lambdaSecdTracks = partSecdLambdaTracks->sliceByCached(aod::lambdatrack::lambdaCollisionId, collision.globalIndex(), cache); @@ -1728,18 +1708,21 @@ struct LambdaR2Correlation { analyzeSingles(antiLambdaPrimTracks); analyzeSingles(lambdaSecdTracks); analyzeSingles(antiLambdaSecdTracks); - analyzePairs(lambdaPrimTracks, antiLambdaPrimTracks); - analyzePairs(lambdaPrimTracks, lambdaPrimTracks); - analyzePairs(antiLambdaPrimTracks, antiLambdaPrimTracks); - analyzePairs(lambdaPrimTracks, antiLambdaSecdTracks); - analyzePairs(lambdaPrimTracks, lambdaSecdTracks); - analyzePairs(antiLambdaPrimTracks, antiLambdaSecdTracks); - analyzePairs(lambdaSecdTracks, antiLambdaPrimTracks); - analyzePairs(lambdaSecdTracks, lambdaPrimTracks); - analyzePairs(antiLambdaSecdTracks, antiLambdaPrimTracks); - analyzePairs(lambdaSecdTracks, antiLambdaSecdTracks); - analyzePairs(lambdaSecdTracks, lambdaSecdTracks); - analyzePairs(antiLambdaSecdTracks, antiLambdaSecdTracks); + + if (cAnaPairs) { + analyzePairs(lambdaPrimTracks, antiLambdaPrimTracks); + analyzePairs(lambdaPrimTracks, lambdaPrimTracks); + analyzePairs(antiLambdaPrimTracks, antiLambdaPrimTracks); + analyzePairs(lambdaPrimTracks, antiLambdaSecdTracks); + analyzePairs(lambdaPrimTracks, lambdaSecdTracks); + analyzePairs(antiLambdaPrimTracks, antiLambdaSecdTracks); + analyzePairs(lambdaSecdTracks, antiLambdaPrimTracks); + analyzePairs(lambdaSecdTracks, lambdaPrimTracks); + analyzePairs(antiLambdaSecdTracks, antiLambdaPrimTracks); + analyzePairs(lambdaSecdTracks, antiLambdaSecdTracks); + analyzePairs(lambdaSecdTracks, lambdaSecdTracks); + analyzePairs(antiLambdaSecdTracks, antiLambdaSecdTracks); + } } PROCESS_SWITCH(LambdaR2Correlation, processDataReco, "Process for Data and MCReco", true); @@ -1758,6 +1741,8 @@ struct LambdaR2Correlation { histos.fill(HIST("Event/McGen/h1f_collision_posz"), mcgencol.posZ()); histos.fill(HIST("Event/McGen/h1f_ft0m_mult_percentile"), mcgencol.cent()); + cent = mcgencol.cent(); + auto lambdaPrimTracks = partMcPrimLambdaTracks->sliceByCached(aod::lambdamcgentrack::lambdaMcGenCollisionId, mcgencol.globalIndex(), cachemc); auto antiLambdaPrimTracks = partMcPrimAntiLambdaTracks->sliceByCached(aod::lambdamcgentrack::lambdaMcGenCollisionId, mcgencol.globalIndex(), cachemc); auto lambdaSecdTracks = partMcSecdLambdaTracks->sliceByCached(aod::lambdamcgentrack::lambdaMcGenCollisionId, mcgencol.globalIndex(), cachemc); @@ -1767,18 +1752,21 @@ struct LambdaR2Correlation { analyzeSingles(antiLambdaPrimTracks); analyzeSingles(lambdaSecdTracks); analyzeSingles(antiLambdaSecdTracks); - analyzePairs(lambdaPrimTracks, antiLambdaPrimTracks); - analyzePairs(lambdaPrimTracks, lambdaPrimTracks); - analyzePairs(antiLambdaPrimTracks, antiLambdaPrimTracks); - analyzePairs(lambdaPrimTracks, antiLambdaSecdTracks); - analyzePairs(lambdaPrimTracks, lambdaSecdTracks); - analyzePairs(antiLambdaPrimTracks, antiLambdaSecdTracks); - analyzePairs(lambdaSecdTracks, antiLambdaPrimTracks); - analyzePairs(lambdaSecdTracks, lambdaPrimTracks); - analyzePairs(antiLambdaSecdTracks, antiLambdaPrimTracks); - analyzePairs(lambdaSecdTracks, antiLambdaSecdTracks); - analyzePairs(lambdaSecdTracks, lambdaSecdTracks); - analyzePairs(antiLambdaSecdTracks, antiLambdaSecdTracks); + + if (cAnaPairs) { + analyzePairs(lambdaPrimTracks, antiLambdaPrimTracks); + analyzePairs(lambdaPrimTracks, lambdaPrimTracks); + analyzePairs(antiLambdaPrimTracks, antiLambdaPrimTracks); + analyzePairs(lambdaPrimTracks, antiLambdaSecdTracks); + analyzePairs(lambdaPrimTracks, lambdaSecdTracks); + analyzePairs(antiLambdaPrimTracks, antiLambdaSecdTracks); + analyzePairs(lambdaSecdTracks, antiLambdaPrimTracks); + analyzePairs(lambdaSecdTracks, lambdaPrimTracks); + analyzePairs(antiLambdaSecdTracks, antiLambdaPrimTracks); + analyzePairs(lambdaSecdTracks, antiLambdaSecdTracks); + analyzePairs(lambdaSecdTracks, lambdaSecdTracks); + analyzePairs(antiLambdaSecdTracks, antiLambdaSecdTracks); + } } PROCESS_SWITCH(LambdaR2Correlation, processMCGen, "Process for MC Generated", false); From ee07caa17fe6805fba57e29ac3e0397de1f43e43 Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Thu, 29 May 2025 05:22:59 +0800 Subject: [PATCH 1445/1650] [PWGCF] fix filter declaration (#11396) --- PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx b/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx index 05fea7fd4ab..dbe6d1d4b79 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx @@ -160,7 +160,7 @@ struct DiHadronCor { TF1* fT0AV0ASigma = nullptr; using AodCollisions = soa::Filtered>; // aod::CentFT0Cs - using AodTracks = soa::Filtered>; + using AodTracks = soa::Filtered>; void init(InitContext&) { From ee17c5f19b4231354bbf212404637eb487739a42 Mon Sep 17 00:00:00 2001 From: Francesco Mazzaschi <43742195+fmazzasc@users.noreply.github.com> Date: Thu, 29 May 2025 10:36:38 +0200 Subject: [PATCH 1446/1650] [PWGLF] Add non-prompt info for MC gen loop (#11374) Co-authored-by: Francesco Mazzaschi --- PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx index 57796ba11af..ecc24c0519b 100644 --- a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx +++ b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx @@ -1013,7 +1013,17 @@ struct nucleiSpectra { if (!isReconstructed[index] && (cfgTreeConfig->get(iS, 0u) || cfgTreeConfig->get(iS, 1u))) { float absDecL = computeAbsoDecL(particle); - nucleiTableMC(999., 999., 999., 0., 0., 999., 999., 999., -1, -1, -1, -1, flags, 0, 0, 0, 0, 0, 0, particle.pt(), particle.eta(), particle.phi(), particle.pdgCode(), 0, goodCollisions[particle.mcCollisionId()], absDecL); + int motherPdgCode = 0; + if (particle.has_mothers()) { + for (auto& motherparticle : particle.mothers_as()) { + if (std::find(nuclei::hfMothCodes.begin(), nuclei::hfMothCodes.end(), std::abs(motherparticle.pdgCode())) != nuclei::hfMothCodes.end()) { + flags |= kIsSecondaryFromWeakDecay; + motherPdgCode = motherparticle.pdgCode(); + break; + } + } + } + nucleiTableMC(999., 999., 999., 0., 0., 999., 999., 999., -1, -1, -1, -1, flags, 0, 0, 0, 0, 0, 0, particle.pt(), particle.eta(), particle.phi(), particle.pdgCode(), motherPdgCode, goodCollisions[particle.mcCollisionId()], absDecL); } break; } From 6c748f5d1a530b7debee7d594ccbdfdc0468f7c6 Mon Sep 17 00:00:00 2001 From: Fabio Colamaria Date: Thu, 29 May 2025 12:24:15 +0200 Subject: [PATCH 1447/1650] [ALICE3] Updates to decay finder for integration with DDbar correlations (#11380) Co-authored-by: fcolamar Co-authored-by: ALICE Action Bot --- ALICE3/TableProducer/alice3-decayfinder.cxx | 231 +++++++++++++++++--- 1 file changed, 195 insertions(+), 36 deletions(-) diff --git a/ALICE3/TableProducer/alice3-decayfinder.cxx b/ALICE3/TableProducer/alice3-decayfinder.cxx index b0aeba5272d..1c5d74e4e8d 100644 --- a/ALICE3/TableProducer/alice3-decayfinder.cxx +++ b/ALICE3/TableProducer/alice3-decayfinder.cxx @@ -85,14 +85,23 @@ struct alice3decayFinder { Configurable kaFromD_dcaXYconstant{"kaFromD_dcaXYconstant", -1.0f, "[0] in |DCAxy| > [0]+[1]/pT"}; Configurable kaFromD_dcaXYpTdep{"kaFromD_dcaXYpTdep", 0.0, "[1] in |DCAxy| > [0]+[1]/pT"}; - Configurable DCosPA{"DCosPA", 0.99, " Cos of pointing angle: pt < 3 GeV"}; - Configurable DCosPAHighPt{"DCosPAHighPt", 0.995, " Cos of pointing angle: 3 GeV < pt"}; - Configurable DCosPAxy{"DCosPAxy", 0.99, " Cos of pointing angle xy: pt < 3 GeV"}; - Configurable DCosPAxyHighPt{"DCosPAxyHighPt", 0.995, " Cos of pointing angle xy: 3 GeV < pt"}; - Configurable DCosThetaStarLowPt{"DCosThetaStarLowPt", 0.8, "Cos theta; pt < 9"}; - Configurable DCosThetaStarHighPt{"DCosThetaStarHighPt", 0.9, "Cos theta; 9 < pt < 16"}; - Configurable DCosThetaStarVHighPt{"DCosThetaStarVHighPt", 1.0, "Cos theta; 16 < pt"}; - Configurable DDauDecayLength{"DDauDecayLength", 3, "|Normalized dau decay length| > [0]"}; + Configurable DCosPA{"DCosPA", 0.99, " Cos of pointing angle: low pt"}; + Configurable DCosPAHighPt{"DCosPAHighPt", 0.995, " Cos of pointing angle: high pt"}; + Configurable DCosPAxy{"DCosPAxy", 0.99, " Cos of pointing angle xy: low pt"}; + Configurable DCosPAxyHighPt{"DCosPAxyHighPt", 0.995, " Cos of pointing angle xy: DCosPAxyHighPt pt"}; + Configurable DCosThetaStarLowPt{"DCosThetaStarLowPt", 0.8, "Cos theta; low pt"}; + Configurable DCosThetaStarHighPt{"DCosThetaStarHighPt", 0.9, "Cos theta; high pt"}; + Configurable DCosThetaStarVHighPt{"DCosThetaStarVHighPt", 1.0, "Cos theta; very high pt"}; + Configurable DMinDecayLength{"DMinDecayLength", 0., "Minimum D decay length (3D)"}; + Configurable DMaxDecayLength{"DMaxDecayLength", 10., "Maximum D decay length (3D)"}; + Configurable DMinDecayLengthXY{"DMinDecayLengthXY", 0., "Minimum D decay length (xy)"}; + Configurable DMaxDecayLengthXY{"DMaxDecayLengthXY", 10., "Maximum D decay length (xy)"}; + Configurable DNormDecayLength{"DNormDecayLength", 3, "Minimum normalized decay length"}; + Configurable minPtPi{"minPtPi", 0., "Minimum pT of daughter pion track"}; + Configurable minPtK{"minPtK", 0., "Minimum pT of daughter kaon track"}; + Configurable maxImpParPi{"maxImpParPi", 1., "Maximum impact paramter of daughter pion track"}; + Configurable maxImpParK{"maxImpParK", 1., "Maximum impact paramter of daughter kaon track"}; + Configurable maxImpParProduct{"maxImpParProduct", 0., "Maximum daughter impact paramter product"}; Configurable piFromLc_dcaXYconstant{"piFromLc_dcaXYconstant", -1.0f, "[0] in |DCAxy| > [0]+[1]/pT"}; Configurable piFromLc_dcaXYpTdep{"piFromLc_dcaXYpTdep", 0.0, "[1] in |DCAxy| > [0]+[1]/pT"}; @@ -101,7 +110,11 @@ struct alice3decayFinder { Configurable prFromLc_dcaXYconstant{"prFromLc_dcaXYconstant", -1.0f, "[0] in |DCAxy| > [0]+[1]/pT"}; Configurable prFromLc_dcaXYpTdep{"prFromLc_dcaXYpTdep", 0.0, "[1] in |DCAxy| > [0]+[1]/pT"}; + Configurable lowPtDLimit{"lowPtDLimit", 3.5, "Upper boundary of low pT D range, for topological selection (GeV/c)"}; + Configurable highPtDLimit{"highPtDLimit", 16, "Upper boundary of high pT D range, for topological selection (GeV/c)"}; + ConfigurableAxis axisEta{"axisEta", {8, -4.0f, +4.0f}, "#eta"}; + ConfigurableAxis axisY{"axisY", {12, -6.0f, +6.0f}, "y"}; ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.2f, 2.4f, 2.6f, 2.8f, 3.0f, 3.2f, 3.4f, 3.6f, 3.8f, 4.0f, 4.4f, 4.8f, 5.2f, 5.6f, 6.0f, 6.5f, 7.0f, 7.5f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 17.0f, 19.0f, 21.0f, 23.0f, 25.0f, 30.0f, 35.0f, 40.0f, 50.0f}, "pt axis for QA histograms"}; ConfigurableAxis axisDCA{"axisDCA", {200, -100, 100}, "DCA (#mum)"}; ConfigurableAxis axisDCADaughters{"axisDCADaughters", {200, 0, 100}, "DCA (#mum)"}; @@ -168,6 +181,8 @@ struct alice3decayFinder { std::array Pdaug; // positive track std::array Ndaug; // negative track float pt; + float ptdaugPos; + float ptdaugNeg; float phi; float eta; float y; @@ -222,6 +237,8 @@ struct alice3decayFinder { // return mass and kinematic variables dmeson.mass = RecoDecay::m(array{array{posP[0], posP[1], posP[2]}, array{negP[0], negP[1], negP[2]}}, array{posMass, negMass}); dmeson.pt = std::hypot(posP[0] + negP[0], posP[1] + negP[1]); + dmeson.ptdaugPos = std::hypot(posP[0], posP[1]); + dmeson.ptdaugNeg = std::hypot(negP[0], negP[1]); dmeson.phi = RecoDecay::phi(array{posP[0] + negP[0], posP[1] + negP[1]}); dmeson.eta = RecoDecay::eta(array{posP[0] + negP[0], posP[1] + negP[1], posP[2] + negP[2]}); dmeson.y = RecoDecay::y(std::array{posP[0] + negP[0], posP[1] + negP[1], posP[2] + negP[2]}, dmeson.mass); @@ -343,20 +360,52 @@ struct alice3decayFinder { if (doprocessFindDmesons) { histos.add("h2dGenD", "h2dGenD", kTH2F, {axisPt, axisEta}); histos.add("h2dGenDbar", "h2dGenDbar", kTH2F, {axisPt, axisEta}); - histos.add("h3dRecD", "h2dRecD", kTH3F, {axisPt, axisEta, axisDMass}); - histos.add("h3dRecDbar", "h2dRecDbar", kTH3F, {axisPt, axisEta, axisDMass}); + histos.add("h3dRecD", "h3dRecD", kTH3F, {axisPt, axisEta, axisDMass}); + histos.add("h3dRecDSig", "h3dRecDSig", kTH3F, {axisPt, axisEta, axisDMass}); + histos.add("h3dRecDRefl", "h3dRecDRefl", kTH3F, {axisPt, axisEta, axisDMass}); + histos.add("h3dRecDBkg", "h3dRecDBkg", kTH3F, {axisPt, axisEta, axisDMass}); + histos.add("h3dRecDbar", "h3dRecDbar", kTH3F, {axisPt, axisEta, axisDMass}); + histos.add("h3dRecDbarSig", "h3dRecDbarSig", kTH3F, {axisPt, axisEta, axisDMass}); + histos.add("h3dRecDbarRefl", "h3dRecDbarRefl", kTH3F, {axisPt, axisEta, axisDMass}); + histos.add("h3dRecDbarBkg", "h3dRecDbarBkg", kTH3F, {axisPt, axisEta, axisDMass}); + + histos.add("hDGenForEfficiency", "hDGenForEfficiency", kTH2F, {axisPt, axisY}); // 2D vs pT, Y, filling generated D0 and D0bar + histos.add("hDRecForEfficiency", "hDRecForEfficiency", kTH2F, {axisPt, axisY}); // 2D vs pT, Y, filling reconstructed D0 and D0bar with correct MC matching histos.add("hMassD", "hMassD", kTH1F, {axisDMass}); + histos.add("hMassDSig", "hMassDSig", kTH1F, {axisDMass}); + histos.add("hMassDRefl", "hMassDRefl", kTH1F, {axisDMass}); + histos.add("hMassDBkg", "hMassDBkg", kTH1F, {axisDMass}); histos.add("hMassDbar", "hMassDbar", kTH1F, {axisDMass}); + histos.add("hMassDbarSig", "hMassDbarSig", kTH1F, {axisDMass}); + histos.add("hMassDbarRefl", "hMassDbarRefl", kTH1F, {axisDMass}); + histos.add("hMassDbarBkg", "hMassDbarBkg", kTH1F, {axisDMass}); - histos.add("hDCosPA", "hDCosPA", kTH1F, {{200, 0, 1}}); - histos.add("hDCosPAxy", "hDCosPAxy", kTH1F, {{200, 0, 1}}); + histos.add("hDCosPA", "hDCosPA", kTH1F, {{800, -1, 1}}); + histos.add("hDCosPAxy", "hDCosPAxy", kTH1F, {{800, -1, 1}}); histos.add("hDCosThetaStar", "hDCosThetaStar", kTH1F, {{200, -1, 1}}); - histos.add("hDDauDecayLength", "hDDauDecayLength", kTH1F, {{100, 0, 10}}); + histos.add("hDDecayLength", "hDDecayLength", kTH1F, {{100, 0, 0.5}}); + histos.add("hDDecayLengthXY", "hDDecayLengthXY", kTH1F, {{100, 0, 0.5}}); + histos.add("hDNormDecayLength", "hDNormDecayLength", kTH1F, {{100, 0, 10}}); + histos.add("hImpParPi", "hImpParPi", kTH1F, {{200, -0.4, 0.4}}); + histos.add("hImpParK", "hImpParK", kTH1F, {{200, -0.4, 0.4}}); + histos.add("hImpParProduct", "hImpParProduct", kTH1F, {{200, -0.04, 0.04}}); + + histos.add("hDCosPA_Selected", "hDCosPA_Selected", kTH1F, {{800, -1, 1}}); + histos.add("hDCosPAxy_Selected", "hDCosPAxy_Selected", kTH1F, {{800, -1, 1}}); + histos.add("hDCosThetaStar_Selected", "hDCosThetaStar_Selected", kTH1F, {{200, -1, 1}}); + histos.add("hDDecayLength_Selected", "hDDecayLength_Selected", kTH1F, {{100, 0, 0.5}}); + histos.add("hDDecayLengthXY_Selected", "hDDecayLengthXY_Selected", kTH1F, {{100, 0, 0.5}}); + histos.add("hDNormDecayLength_Selected", "hDNormDecayLength_Selected", kTH1F, {{100, 0, 10}}); + histos.add("hImpParPi_Selected", "hImpParPi_Selected", kTH1F, {{200, -0.4, 0.4}}); + histos.add("hImpParK_Selected", "hImpParK_Selected", kTH1F, {{200, -0.4, 0.4}}); + histos.add("hImpParProduct_Selected", "hImpParProduct_Selected", kTH1F, {{200, -0.04, 0.04}}); if (doDCAplotsD) { histos.add("hDCADDaughters", "hDCADDaughters", kTH1D, {axisDCADaughters}); - histos.add("hDCADbarDaughters", "hDCADbarDaughters", kTH1D, {axisDCA}); + histos.add("hDCADbarDaughters", "hDCADbarDaughters", kTH1D, {axisDCADaughters}); + histos.add("hDCADDaughters_Selected", "hDCADDaughters", kTH1D, {axisDCADaughters}); + histos.add("hDCADbarDaughters_Selected", "hDCADbarDaughters", kTH1D, {axisDCADaughters}); histos.add("h2dDCAxyVsPtPiPlusFromD", "h2dDCAxyVsPtPiPlusFromD", kTH2F, {axisPt, axisDCA}); histos.add("h2dDCAxyVsPtPiMinusFromD", "h2dDCAxyVsPtPiMinusFromD", kTH2F, {axisPt, axisDCA}); histos.add("h2dDCAxyVsPtKaPlusFromD", "h2dDCAxyVsPtKaPlusFromD", kTH2F, {axisPt, axisDCA}); @@ -390,10 +439,14 @@ struct alice3decayFinder { { // no grouping for MC particles -> as intended if (doprocessFindDmesons) { - for (auto const& mcParticle : trueD) + for (auto const& mcParticle : trueD) { histos.fill(HIST("h2dGenD"), mcParticle.pt(), mcParticle.eta()); - for (auto const& mcParticle : trueDbar) + histos.fill(HIST("hDGenForEfficiency"), mcParticle.pt(), mcParticle.y()); // in common for D and Dbar + } + for (auto const& mcParticle : trueDbar) { histos.fill(HIST("h2dGenDbar"), mcParticle.pt(), mcParticle.eta()); + histos.fill(HIST("hDGenForEfficiency"), mcParticle.pt(), mcParticle.y()); // in common for D and Dbar + } } if (doprocessFindLcBaryons) { for (auto const& mcParticle : trueLc) @@ -437,37 +490,89 @@ struct alice3decayFinder { const float dmesonCtau = 0.012301; dmeson.normalizedDecayLength = ((dmeson.mass * std::fabs(std::hypot(collision.posX(), collision.posY(), collision.posZ()) - std::hypot(dmeson.posSV[0], dmeson.posSV[1], dmeson.posSV[2]))) / std::hypot(dmeson.P[0], dmeson.P[1], dmeson.P[2])) / dmesonCtau; + auto impParXY_daugPos = RecoDecay::impParXY(std::array{collision.posX(), collision.posY(), collision.posZ()}, std::array{dmeson.posSV[0], dmeson.posSV[1], dmeson.posSV[2]}, std::array{dmeson.Pdaug[0], dmeson.Pdaug[1], dmeson.Pdaug[2]}); + auto impParXY_daugNeg = RecoDecay::impParXY(std::array{collision.posX(), collision.posY(), collision.posZ()}, std::array{dmeson.posSV[0], dmeson.posSV[1], dmeson.posSV[2]}, std::array{dmeson.Ndaug[0], dmeson.Ndaug[1], dmeson.Ndaug[2]}); + auto decayLength = std::hypot(collision.posX() - dmeson.posSV[0], collision.posY() - dmeson.posSV[1], collision.posZ() - dmeson.posSV[2]); + auto decayLengthXY = std::hypot(collision.posX() - dmeson.posSV[0], collision.posY() - dmeson.posSV[1]); + + // fill plots of topological variables before topological selection histos.fill(HIST("hDCosPA"), dmeson.cosPA); histos.fill(HIST("hDCosPAxy"), dmeson.cosPAxy); histos.fill(HIST("hDCosThetaStar"), dmeson.cosThetaStar); - histos.fill(HIST("hDDauDecayLength"), dmeson.normalizedDecayLength); + histos.fill(HIST("hDDecayLength"), decayLength); + histos.fill(HIST("hDDecayLengthXY"), decayLengthXY); + histos.fill(HIST("hDNormDecayLength"), dmeson.normalizedDecayLength); + histos.fill(HIST("hDCADDaughters"), dmeson.dcaDau * 1e+4); + histos.fill(HIST("hImpParPi"), impParXY_daugPos); + histos.fill(HIST("hImpParK"), impParXY_daugNeg); + histos.fill(HIST("hImpParProduct"), impParXY_daugPos * impParXY_daugNeg); if (dmeson.dcaDau > dcaDaughtersSelection) continue; - if (dmeson.pt <= 3 && dmeson.cosPA < DCosPA) + if (dmeson.pt <= lowPtDLimit && dmeson.cosPA < DCosPA) continue; - else if (dmeson.pt > 3 && dmeson.cosPA < DCosPAHighPt) + else if (dmeson.pt > lowPtDLimit && dmeson.cosPA < DCosPAHighPt) continue; - if (dmeson.pt <= 3 && dmeson.cosPAxy < DCosPAxy) + if (dmeson.pt <= lowPtDLimit && dmeson.cosPAxy < DCosPAxy) continue; - else if (dmeson.pt > 3 && dmeson.cosPAxy < DCosPAxyHighPt) + else if (dmeson.pt > lowPtDLimit && dmeson.cosPAxy < DCosPAxyHighPt) continue; - if (dmeson.pt <= 9 && std::fabs(dmeson.cosThetaStar) > DCosThetaStarLowPt) + if (dmeson.pt <= lowPtDLimit && std::fabs(dmeson.cosThetaStar) > DCosThetaStarLowPt) continue; - else if (dmeson.pt <= 16 && std::fabs(dmeson.cosThetaStar) > DCosThetaStarHighPt) + else if (dmeson.pt <= highPtDLimit && std::fabs(dmeson.cosThetaStar) > DCosThetaStarHighPt) continue; - else if (dmeson.pt > 16 && std::fabs(dmeson.cosThetaStar) > DCosThetaStarVHighPt) + else if (dmeson.pt > highPtDLimit && std::fabs(dmeson.cosThetaStar) > DCosThetaStarVHighPt) continue; - if (dmeson.normalizedDecayLength > DDauDecayLength) + if (dmeson.normalizedDecayLength > DNormDecayLength) continue; - histos.fill(HIST("hDCADDaughters"), dmeson.dcaDau * 1e+4); + if (dmeson.ptdaugPos < minPtPi) // track1 (positive) is the pion + continue; + if (dmeson.ptdaugNeg < minPtK) // track2 (negative) is the kaon + continue; + + if (impParXY_daugPos > maxImpParPi) + continue; + if (impParXY_daugNeg > maxImpParK) + continue; + if (impParXY_daugPos * impParXY_daugNeg > maxImpParProduct) + continue; + + if (decayLength < DMinDecayLength || decayLength > DMaxDecayLength) + continue; + if (decayLengthXY < DMinDecayLengthXY || decayLengthXY > DMaxDecayLengthXY) + continue; + + // fill plots of topological variables after topological selection + histos.fill(HIST("hDCosPA_Selected"), dmeson.cosPA); + histos.fill(HIST("hDCosPAxy_Selected"), dmeson.cosPAxy); + histos.fill(HIST("hDCosThetaStar_Selected"), dmeson.cosThetaStar); + histos.fill(HIST("hDDecayLength_Selected"), decayLength); + histos.fill(HIST("hDDecayLengthXY_Selected"), decayLengthXY); + histos.fill(HIST("hDNormDecayLength_Selected"), dmeson.normalizedDecayLength); + histos.fill(HIST("hDCADDaughters_Selected"), dmeson.dcaDau * 1e+4); + histos.fill(HIST("hImpParPi_Selected"), impParXY_daugPos); + histos.fill(HIST("hImpParK_Selected"), impParXY_daugNeg); + histos.fill(HIST("hImpParProduct_Selected"), impParXY_daugPos * impParXY_daugNeg); + + // filling of mass plots for selected candidates histos.fill(HIST("hMassD"), dmeson.mass); histos.fill(HIST("h3dRecD"), dmeson.pt, dmeson.eta, dmeson.mass); + if (dmeson.mcTruth == 1) { // true D0 meson, reco as D0 (= correct matching) + histos.fill(HIST("h3dRecDSig"), dmeson.pt, dmeson.eta, dmeson.mass); + histos.fill(HIST("hMassDSig"), dmeson.mass); + histos.fill(HIST("hDRecForEfficiency"), dmeson.pt, dmeson.y); // for efficiency + } else if (dmeson.mcTruth == 2) { // true D0bar meson, reco as D0 (= reflection) + histos.fill(HIST("hMassDRefl"), dmeson.mass); + histos.fill(HIST("h3dRecDRefl"), dmeson.pt, dmeson.eta, dmeson.mass); + } else { // background, reco as D0 + histos.fill(HIST("hMassDBkg"), dmeson.mass); + histos.fill(HIST("h3dRecDBkg"), dmeson.pt, dmeson.eta, dmeson.mass); + } // store D0 in output table candidateD0meson(collision.globalIndex(), @@ -497,37 +602,91 @@ struct alice3decayFinder { const float dmesonCtau = 0.012301; dmeson.normalizedDecayLength = ((dmeson.mass * std::fabs(std::hypot(collision.posX(), collision.posY(), collision.posZ()) - std::hypot(dmeson.posSV[0], dmeson.posSV[1], dmeson.posSV[2]))) / std::hypot(dmeson.P[0], dmeson.P[1], dmeson.P[2])) / dmesonCtau; + auto impParXY_daugPos = RecoDecay::impParXY(std::array{collision.posX(), collision.posY(), collision.posZ()}, std::array{dmeson.posSV[0], dmeson.posSV[1], dmeson.posSV[2]}, std::array{dmeson.Pdaug[0], dmeson.Pdaug[1], dmeson.Pdaug[2]}); + auto impParXY_daugNeg = RecoDecay::impParXY(std::array{collision.posX(), collision.posY(), collision.posZ()}, std::array{dmeson.posSV[0], dmeson.posSV[1], dmeson.posSV[2]}, std::array{dmeson.Ndaug[0], dmeson.Ndaug[1], dmeson.Ndaug[2]}); + auto decayLength = std::hypot(collision.posX() - dmeson.posSV[0], collision.posY() - dmeson.posSV[1], collision.posZ() - dmeson.posSV[2]); + auto decayLengthXY = std::hypot(collision.posX() - dmeson.posSV[0], collision.posY() - dmeson.posSV[1]); + + // fill plots of topological variables before topological selection histos.fill(HIST("hDCosPA"), dmeson.cosPA); histos.fill(HIST("hDCosPAxy"), dmeson.cosPAxy); histos.fill(HIST("hDCosThetaStar"), dmeson.cosThetaStar); - histos.fill(HIST("hDDauDecayLength"), dmeson.normalizedDecayLength); + histos.fill(HIST("hDDecayLength"), decayLength); + histos.fill(HIST("hDDecayLengthXY"), decayLengthXY); + histos.fill(HIST("hDNormDecayLength"), dmeson.normalizedDecayLength); + histos.fill(HIST("hImpParPi"), impParXY_daugNeg); + histos.fill(HIST("hImpParK"), impParXY_daugPos); + histos.fill(HIST("hImpParProduct"), impParXY_daugPos * impParXY_daugNeg); + if (doDCAplotsD) + histos.fill(HIST("hDCADbarDaughters"), dmeson.dcaDau * 1e+4); if (dmeson.dcaDau > dcaDaughtersSelection) continue; - if (dmeson.pt <= 3 && dmeson.cosPA < DCosPA) + if (dmeson.pt <= lowPtDLimit && dmeson.cosPA < DCosPA) + continue; + else if (dmeson.pt > lowPtDLimit && dmeson.cosPA < DCosPAHighPt) + continue; + + if (dmeson.pt <= lowPtDLimit && dmeson.cosPAxy < DCosPAxy) + continue; + else if (dmeson.pt > lowPtDLimit && dmeson.cosPAxy < DCosPAxyHighPt) + continue; + + if (dmeson.pt <= highPtDLimit && std::fabs(dmeson.cosThetaStar) > DCosThetaStarLowPt) continue; - else if (dmeson.pt > 3 && dmeson.cosPA < DCosPAHighPt) + else if (dmeson.pt <= highPtDLimit && std::fabs(dmeson.cosThetaStar) > DCosThetaStarHighPt) + continue; + else if (dmeson.pt > highPtDLimit && std::fabs(dmeson.cosThetaStar) > DCosThetaStarVHighPt) continue; - if (dmeson.pt <= 3 && dmeson.cosPAxy < DCosPAxy) + if (dmeson.normalizedDecayLength > DNormDecayLength) continue; - else if (dmeson.pt > 3 && dmeson.cosPAxy < DCosPAxyHighPt) + + if (dmeson.ptdaugPos < minPtK) // track1 is the kaon + continue; + if (dmeson.ptdaugNeg < minPtPi) // track2 is the pion continue; - if (dmeson.pt <= 9 && std::fabs(dmeson.cosThetaStar) > DCosThetaStarLowPt) + if (impParXY_daugPos > maxImpParK) continue; - else if (dmeson.pt <= 16 && std::fabs(dmeson.cosThetaStar) > DCosThetaStarHighPt) + if (impParXY_daugNeg > maxImpParPi) continue; - else if (dmeson.pt > 16 && std::fabs(dmeson.cosThetaStar) > DCosThetaStarVHighPt) + if (impParXY_daugPos * impParXY_daugNeg > maxImpParProduct) continue; - if (dmeson.normalizedDecayLength > DDauDecayLength) + if (decayLength < DMinDecayLength || decayLength > DMaxDecayLength) + continue; + if (decayLengthXY < DMinDecayLengthXY || decayLengthXY > DMaxDecayLengthXY) continue; - histos.fill(HIST("hDCADbarDaughters"), dmeson.dcaDau * 1e+4); + // fill plots of topological variables after topological selection + histos.fill(HIST("hDCosPA_Selected"), dmeson.cosPA); + histos.fill(HIST("hDCosPAxy_Selected"), dmeson.cosPAxy); + histos.fill(HIST("hDCosThetaStar_Selected"), dmeson.cosThetaStar); + histos.fill(HIST("hDDecayLength_Selected"), decayLength); + histos.fill(HIST("hDDecayLengthXY_Selected"), decayLengthXY); + histos.fill(HIST("hDNormDecayLength_Selected"), dmeson.normalizedDecayLength); + histos.fill(HIST("hImpParK_Selected"), impParXY_daugPos); + histos.fill(HIST("hImpParPi_Selected"), impParXY_daugNeg); + histos.fill(HIST("hImpParProduct_Selected"), impParXY_daugPos * impParXY_daugNeg); + if (doDCAplotsD) + histos.fill(HIST("hDCADbarDaughters_Selected"), dmeson.dcaDau * 1e+4); + + // filling of mass plots for selected candidates histos.fill(HIST("hMassDbar"), dmeson.mass); histos.fill(HIST("h3dRecDbar"), dmeson.pt, dmeson.eta, dmeson.mass); + if (dmeson.mcTruth == 2) { // true D0bar meson, reco as D0bar (= correct matching) + histos.fill(HIST("h3dRecDbarSig"), dmeson.pt, dmeson.eta, dmeson.mass); + histos.fill(HIST("hMassDbarSig"), dmeson.mass); + histos.fill(HIST("hDRecForEfficiency"), dmeson.pt, dmeson.y); // for efficiency + } else if (dmeson.mcTruth == 1) { // true D0 meson, reco as D0bar (= reflection) + histos.fill(HIST("hMassDbarRefl"), dmeson.mass); + histos.fill(HIST("h3dRecDbarRefl"), dmeson.pt, dmeson.eta, dmeson.mass); + } else { // background, reco as D0 + histos.fill(HIST("hMassDbarBkg"), dmeson.mass); + histos.fill(HIST("h3dRecDbarBkg"), dmeson.pt, dmeson.eta, dmeson.mass); + } // store D0bar in output table candidateD0meson(collision.globalIndex(), From 178cace0cdf96c94ab8dc3b666a3db3b2d2069d9 Mon Sep 17 00:00:00 2001 From: sashingo Date: Thu, 29 May 2025 19:34:31 +0900 Subject: [PATCH 1448/1650] [PWGHF] AddedTHnSparse for isolate electron study (#11334) --- PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx | 44 ++++++++++++++--------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx b/PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx index b86e10b98e4..df04cf96cd2 100644 --- a/PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx +++ b/PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx @@ -81,6 +81,10 @@ struct HfTaskElectronWeakBoson { Configurable energyIsolationMax{"energyIsolationMax", 0.1, "isolation cut on energy"}; Configurable trackIsolationMax{"trackIsolationMax", 3, "Maximum number of tracks in isolation cone"}; + // flag for THn + Configurable isTHnElectron{"isTHnElectron", true, "Enables THn for electrons"}; + Configurable ptTHnThresh{"ptTHnThresh", 5.0, "Threshold for THn make"}; + // Skimmed dataset processing configurations Configurable cfgSkimmedProcessing{"cfgSkimmedProcessing", true, "Enables processing of skimmed datasets"}; Configurable cfgTriggerName{"cfgTriggerName", "fGammaHighPtEMCAL", "Trigger of interest (comma separated for multiple)"}; @@ -193,18 +197,19 @@ struct HfTaskElectronWeakBoson { registry.add("hIsolationTrack", "Isolation Track", kTH2F, {{axisE}, {axisIsoTrack}}); registry.add("hInvMassZeeLs", "invariant mass for Z LS pair", kTH2F, {{axisPt}, {axisInvMassZ}}); registry.add("hInvMassZeeUls", "invariant mass for Z ULS pair", kTH2F, {{axisPt}, {axisInvMassZ}}); + registry.add("hTHnElectrons", "electron info", HistType::kTHnSparseF, {axisPt, axisNsigma, axisM02, axisM02, axisEop, axisIsoEnergy}); // hisotgram for EMCal trigger registry.add("hEMCalTrigger", "EMCal trigger", kTH1F, {axisTrigger}); } - bool isIsolatedCluster(const o2::aod::EMCALCluster& cluster, - const SelectedClusters& clusters) + double calIsolatedCluster(const o2::aod::EMCALCluster& cluster, + const SelectedClusters& clusters) { - float energySum = 0.0; - float isoEnergy = 10.0; - float etaAssCluster = cluster.eta(); - float phiAssCluster = cluster.phi(); + double energySum = 0.0; + double isoEnergy = 10.0; + double etaAssCluster = cluster.eta(); + double phiAssCluster = cluster.phi(); for (const auto& associateCluster : clusters) { // Calculate angular distances @@ -229,9 +234,9 @@ struct HfTaskElectronWeakBoson { registry.fill(HIST("hIsolationEnergy"), cluster.energy(), isoEnergy); - return (isoEnergy < energyIsolationMax); + return (isoEnergy); } - bool isIsolatedTrack(double etaEle, + int calIsolatedTrack(double etaEle, double phiEle, float ptEle, TrackEle const& tracks) @@ -256,7 +261,7 @@ struct HfTaskElectronWeakBoson { registry.fill(HIST("hIsolationTrack"), ptEle, trackCount); - return (trackCount <= trackIsolationMax); + return (trackCount); } void process(soa::Filtered::iterator const& collision, @@ -375,8 +380,6 @@ struct HfTaskElectronWeakBoson { for (const auto& match : tracksofcluster) { if (match.emcalcluster_as().time() < timeEmcMin || match.emcalcluster_as().time() > timeEmcMax) continue; - if (match.emcalcluster_as().m02() < m02Min || match.emcalcluster_as().m02() > m02Max) - continue; float m20Emc = match.emcalcluster_as().m20(); float m02Emc = match.emcalcluster_as().m02(); @@ -413,17 +416,26 @@ struct HfTaskElectronWeakBoson { double eop = energyEmc / match.track_as().p(); + double isoEnergy = calIsolatedCluster(cluster, emcClusters); + + int trackCount = calIsolatedTrack(track.phi(), track.eta(), track.pt(), tracks); + + if (match.track_as().pt() > ptTHnThresh && isTHnElectron) { + registry.fill(HIST("hTHnElectrons"), match.track_as().pt(), match.track_as().tpcNSigmaEl(), m02Emc, m20Emc, eop, isoEnergy); + } // LOG(info) << "E/p" << eop; registry.fill(HIST("hEopNsigTPC"), match.track_as().tpcNSigmaEl(), eop); registry.fill(HIST("hM02"), match.track_as().tpcNSigmaEl(), m02Emc); registry.fill(HIST("hM20"), match.track_as().tpcNSigmaEl(), m20Emc); + if (match.emcalcluster_as().m02() < m02Min || match.emcalcluster_as().m02() > m02Max) + continue; + if (match.track_as().tpcNSigmaEl() > nsigTpcMin && match.track_as().tpcNSigmaEl() < nsigTpcMax) { registry.fill(HIST("hEop"), match.track_as().pt(), eop); - - if (eop > eopMin && eop < eopMax) { - isIsolated = isIsolatedCluster(cluster, emcClusters); - isIsolatedTr = isIsolatedTrack(track.phi(), track.eta(), track.pt(), tracks); - } + if (eop > eopMin && eop < eopMax && isoEnergy < energyIsolationMax) + isIsolated = true; + if (eop > eopMin && eop < eopMax && trackCount < trackIsolationMax) + isIsolatedTr = true; if (isIsolated) { registry.fill(HIST("hEopIsolation"), match.track_as().pt(), eop); From d8439ec7753b30f05cbfc27acdfdbe44093c1567 Mon Sep 17 00:00:00 2001 From: yhambard <127940767+yhambard@users.noreply.github.com> Date: Thu, 29 May 2025 15:56:49 +0300 Subject: [PATCH 1449/1650] [PWGEM] phosElId dispersion calculation fix (#11372) --- PWGEM/Tasks/phosElId.cxx | 124 +++++++++++++++++++++++---------------- 1 file changed, 75 insertions(+), 49 deletions(-) diff --git a/PWGEM/Tasks/phosElId.cxx b/PWGEM/Tasks/phosElId.cxx index a3e401e2175..23e09da288f 100644 --- a/PWGEM/Tasks/phosElId.cxx +++ b/PWGEM/Tasks/phosElId.cxx @@ -81,6 +81,30 @@ enum CentEstimators { FV0A, FDDM, NTPV }; +bool testLambda(float pt, float l1, float l2, float cutThreshold, bool useNegativeCrossTerm) +{ + float l2Mean = 1.53126f + 9.50835e+06f / (1.f + 1.08728e+07f * pt + 1.73420e+06f * pt * pt); + float l1Mean = 1.12365f + 0.123770f * std::exp(-pt * 0.246551f) + 5.30000e-03f * pt; + float l2Sigma = 6.48260e-02f + 7.60261e+10f / (1.f + 1.53012e+11f * pt + 5.01265e+05f * pt * pt) + 9.00000e-03f * pt; + float l1Sigma = 4.44719e-04f + 6.99839e-01f / (1.f + 1.22497e+00f * pt + 6.78604e-07f * pt * pt) + 9.00000e-03f * pt; + float c = -0.35f - 0.550f * std::exp(-0.390730f * pt); + if (l1Sigma == 0.f || l2Sigma == 0.f) + return false; + + float term1 = 0.5f * (l1 - l1Mean) * (l1 - l1Mean) / (l1Sigma * l1Sigma); + float term2 = 0.5f * (l2 - l2Mean) * (l2 - l2Mean) / (l2Sigma * l2Sigma); + float crossTerm = 0.5f * c * (l1 - l1Mean) * (l2 - l2Mean) / (l1Sigma * l2Sigma); + + float rSquared; + if (useNegativeCrossTerm) { + rSquared = term1 + term2 - crossTerm; + } else { + rSquared = term1 + term2 + crossTerm; + } + + return rSquared < cutThreshold; +} + struct PhosElId { Produces phosMatch; @@ -89,7 +113,10 @@ struct PhosElId { using MyTracks = soa::Join; - Configurable isSel8{"isSel8", 1, "check if event is Single Event Latch-up 8"}; + Configurable isSel8{"isSel8", 1, "check if event is Single Event Latch-up 8"}, + mSwapM20M02ForTestLambda{"mSwapM20M02ForTestLambda", false, "Swap m20 and m02 arguments for testLambda (false for note's correct order, true for swapped/original incorrect order)"}, + mUseNegativeCrossTerm{"mUseNegativeCrossTerm", true, "Use negative sign for the cross-term in testLambda (true for analysis note version, false for old version)"}; + Configurable mColMaxZ{"mColMaxZ", 10.f, "maximum z accepted in analysis"}, mMinCluE{"mMinCluE", 0.3, "Minimum cluster energy for analysis"}, mMinCluTime{"minCluTime", -25.e-9, "Min. cluster time"}, @@ -125,7 +152,8 @@ struct PhosElId { TPCNSigmaKaMax{"TPCNSigmaKaMax", {4.f}, "max TPC nsigma kaon for exclusion"}, TOFNSigmaElMin{"TOFNSigmaElMin", {-3.f}, "min TOF nsigma e for inclusion"}, TOFNSigmaElMax{"TOFNSigmaElMax", {3.f}, "max TOF nsigma e for inclusion"}, - NsigmaTrackMatch{"NsigmaTrackMatch", {2.f}, "PHOS Track Matching Nsigma for inclusion"}; + NsigmaTrackMatch{"NsigmaTrackMatch", {2.f}, "PHOS Track Matching Nsigma for inclusion"}, + mShowerShapeCutValue{"mShowerShapeCutValue", 4.f, "Cut threshold for testLambda shower shape"}; Configurable mEvSelTrig{"mEvSelTrig", kTVXinPHOS, "Select events with this trigger"}, mAmountOfModules{"mAmountOfModules", 4, "amount of modules for PHOS"}, @@ -371,7 +399,11 @@ struct PhosElId { clu.time() > mMaxCluTime || clu.time() < mMinCluTime) continue; - bool isDispOK = testLambda(cluE, clu.m02(), clu.m20()); + bool isDispOK = false; + if (mSwapM20M02ForTestLambda) + isDispOK = testLambda(cluE, clu.m02(), clu.m20(), mShowerShapeCutValue, mUseNegativeCrossTerm); + else + isDispOK = testLambda(cluE, clu.m20(), clu.m02(), mShowerShapeCutValue, mUseNegativeCrossTerm); float posX = clu.x(), posZ = clu.z(), dX = trackX - posX, dZ = trackZ - posZ, Ep = cluE / trackMom; mHistManager.fill(HIST("coordinateMatching/hdZpmod"), dZ, trackPT, module); @@ -446,6 +478,11 @@ struct PhosElId { for (auto const& clu : clusters) { double cluE = clu.e(), cluTime = clu.time(); int mod = clu.mod(); + bool isDispOK = false; + if (mSwapM20M02ForTestLambda) + isDispOK = testLambda(cluE, clu.m02(), clu.m20(), mShowerShapeCutValue, mUseNegativeCrossTerm); + else + isDispOK = testLambda(cluE, clu.m20(), clu.m02(), mShowerShapeCutValue, mUseNegativeCrossTerm); if (cluE > mMinCluE) { mHistManager.fill(HIST("clusterSpectra/hCluE_mod_energy_cut"), cluE, mod); mHistManager.fill(HIST("clusterSpectra/hCluE_v_mod_v_time"), cluE, cluTime * 1e9, mod); @@ -455,7 +492,7 @@ struct PhosElId { mHistManager.fill(HIST("clusterSpectra/hCluE_mod_cell_cut"), cluE, mod); mHistManager.fill(HIST("coordinateMatching/hCluXZ_mod"), clu.x(), clu.z(), mod); mHistManager.fill(HIST("clusterSpectra/hCluE_ncells_mod"), cluE, clu.ncell(), mod); - if (testLambda(cluE, clu.m02(), clu.m20())) + if (isDispOK) mHistManager.fill(HIST("clusterSpectra/hCluE_mod_disp"), cluE, mod); } } @@ -482,7 +519,7 @@ struct PhosElId { mHistManager.fill(HIST("singleLoop/trackdist/clusterSpectra/hCluE_v_pt_Nsigma"), cluE, matchedTrack.pt(), mod); mHistManager.fill(HIST("singleLoop/trackdist/energyMomentumRatio/hEp_v_pt_Nsigma"), cluE / matchedTrack.p(), matchedTrack.pt(), mod); mHistManager.fill(HIST("singleLoop/trackdist/energyMomentumRatio/hEp_v_E_Nsigma"), cluE / matchedTrack.p(), cluE, mod); - if (testLambda(cluE, clu.m02(), clu.m20())) { + if (isDispOK) { mHistManager.fill(HIST("singleLoop/trackdist/clusterSpectra/hCluE_v_pt_Nsigma_disp"), cluE, matchedTrack.pt(), mod); mHistManager.fill(HIST("singleLoop/trackdist/energyMomentumRatio/hEp_v_pt_Nsigma_disp"), cluE / matchedTrack.p(), matchedTrack.pt(), mod); mHistManager.fill(HIST("singleLoop/trackdist/energyMomentumRatio/hEp_v_E_Nsigma_disp"), cluE / matchedTrack.p(), cluE, mod); @@ -505,13 +542,13 @@ struct PhosElId { isElectron = true; } if (isElectron) { - mHistManager.fill(HIST("singleLoop/trackdist/clusterSpectra/hCluE_v_pt_Nsigma_TPC"), cluE, matchedTrack.pt(), mod); - mHistManager.fill(HIST("singleLoop/trackdist/energyMomentumRatio/hEp_v_pt_Nsigma_TPC"), cluE / matchedTrack.p(), matchedTrack.pt(), mod); - mHistManager.fill(HIST("singleLoop/trackdist/energyMomentumRatio/hEp_v_E_Nsigma_TPC"), cluE / matchedTrack.p(), cluE, mod); - if (testLambda(cluE, clu.m02(), clu.m20())) { - mHistManager.fill(HIST("singleLoop/trackdist/clusterSpectra/hCluE_v_pt_Nsigma_disp_TPC"), cluE, matchedTrack.pt(), mod); - mHistManager.fill(HIST("singleLoop/trackdist/energyMomentumRatio/hEp_v_pt_Nsigma_disp_TPC"), cluE / matchedTrack.p(), matchedTrack.pt(), mod); - mHistManager.fill(HIST("singleLoop/trackdist/energyMomentumRatio/hEp_v_E_Nsigma_disp_TPC"), cluE / matchedTrack.p(), cluE, mod); + mHistManager.fill(HIST("singleLoop/trackdist/clusterSpectra/hCluE_v_pt_Nsigma_TPCel"), cluE, matchedTrack.pt(), mod); + mHistManager.fill(HIST("singleLoop/trackdist/energyMomentumRatio/hEp_v_pt_Nsigma_TPCel"), cluE / matchedTrack.p(), matchedTrack.pt(), mod); + mHistManager.fill(HIST("singleLoop/trackdist/energyMomentumRatio/hEp_v_E_Nsigma_TPCel"), cluE / matchedTrack.p(), cluE, mod); + if (isDispOK) { + mHistManager.fill(HIST("singleLoop/trackdist/clusterSpectra/hCluE_v_pt_Nsigma_disp_TPCel"), cluE, matchedTrack.pt(), mod); + mHistManager.fill(HIST("singleLoop/trackdist/energyMomentumRatio/hEp_v_pt_Nsigma_disp_TPCel"), cluE / matchedTrack.p(), matchedTrack.pt(), mod); + mHistManager.fill(HIST("singleLoop/trackdist/energyMomentumRatio/hEp_v_E_Nsigma_disp_TPCel"), cluE / matchedTrack.p(), cluE, mod); } } } // end of cluster loop @@ -593,21 +630,6 @@ struct PhosElId { trackZ = posL[1]; return true; } - //_____________________________________________________________________________ - bool testLambda(float pt, float l1, float l2) - { - // Parameterization for full dispersion - float l2Mean = 1.53126 + 9.50835e+06 / (1. + 1.08728e+07 * pt + 1.73420e+06 * pt * pt); - float l1Mean = 1.12365 + 0.123770 * std::exp(-pt * 0.246551) + 5.30000e-03 * pt; - float l2Sigma = 6.48260e-02 + 7.60261e+10 / (1. + 1.53012e+11 * pt + 5.01265e+05 * pt * pt) + 9.00000e-03 * pt; - float l1Sigma = 4.44719e-04 + 6.99839e-01 / (1. + 1.22497e+00 * pt + 6.78604e-07 * pt * pt) + 9.00000e-03 * pt; - float c = -0.35 - 0.550 * std::exp(-0.390730 * pt); - - return 0.5 * (l1 - l1Mean) * (l1 - l1Mean) / l1Sigma / l1Sigma + - 0.5 * (l2 - l2Mean) * (l2 - l2Mean) / l2Sigma / l2Sigma + - 0.5 * c * (l1 - l1Mean) * (l2 - l2Mean) / l1Sigma / l2Sigma < - 4.; - } }; struct MassSpectra { @@ -863,7 +885,10 @@ struct TpcElIdMassSpectrum { using MyTracks = soa::Join; - Configurable isSel8{"isSel8", 1, "check if event is Single Event Latch-up 8"}; + Configurable isSel8{"isSel8", 1, "check if event is Single Event Latch-up 8"}, + mSwapM20M02ForTestLambda{"mSwapM20M02ForTestLambda", false, "Swap m20 and m02 arguments for testLambda (false for note's correct order, true for swapped/original incorrect order)"}, + mUseNegativeCrossTerm{"mUseNegativeCrossTerm", true, "Use negative sign for the cross-term in testLambda (true for analysis note version, false for old version)"}; + Configurable mColMaxZ{"mColMaxZ", 10.f, "maximum z accepted in analysis"}, mMinCluE{"mMinCluE", 0.1, "Minimum cluster energy for photons in the analysis"}, mCutMIPCluE{"mCutMIPCluE", 0.3, "Min cluster energy to reject MIPs in the analysis"}, @@ -903,7 +928,8 @@ struct TpcElIdMassSpectrum { eeMassMin{"eeMassMin", {2.9f}, "J/psi(e+e-) Mass corridor lower limit (for Chic selection)"}, eeMassMax{"eeMassMax", {3.3f}, "J/psi(e+e-) Mass corridor upper limit (for Chic selection)"}, JpsiMass{"JpsiMass", {3.097f}, "J/psi Mass constant"}, - mMassSpectrumLowerCutoff{"mMassSpectrumLowerCutoff", {0.01f}, "Used to exclude 0+0 masses"}; + mMassSpectrumLowerCutoff{"mMassSpectrumLowerCutoff", {0.01f}, "Used to exclude 0+0 masses"}, + mShowerShapeCutValue{"mShowerShapeCutValue", 4.f, "Cut threshold for testLambda shower shape"}; Configurable mEvSelTrig{"mEvSelTrig", kTVXinPHOS, "Select events with this trigger"}, CentBinning{"CentBinning", 10, "Binning for centrality"}, @@ -1223,7 +1249,11 @@ struct TpcElIdMassSpectrum { continue; bool matchFlag = false; bool isJpsi = (pairMass > eeMassMin && pairMass < eeMassMax); - bool isDispOK = testLambda(cluE, gamma.m02(), gamma.m20()); + bool isDispOK = false; + if (mSwapM20M02ForTestLambda) + isDispOK = testLambda(cluE, gamma.m02(), gamma.m20(), mShowerShapeCutValue, mUseNegativeCrossTerm); + else + isDispOK = testLambda(cluE, gamma.m20(), gamma.m02(), mShowerShapeCutValue, mUseNegativeCrossTerm); for (auto const& match : matches) { if (gamma.index() == match.caloClusterId()) { matchFlag = true; @@ -1333,10 +1363,16 @@ struct TpcElIdMassSpectrum { for (auto const& gamma1 : clusters) { float cluE1 = gamma1.e(); - if (cluE1 < mMinCluE || cluE1 > mMaxCluE || gamma1.ncell() < mMinCluNcell || gamma1.time() > mMaxCluTime || gamma1.time() < mMinCluTime) + if (cluE1 < mMinCluE || gamma1.ncell() < mMinCluNcell || gamma1.time() > mMaxCluTime || gamma1.time() < mMinCluTime) continue; bool matchFlag1 = false; - if (!testLambda(cluE1, gamma1.m02(), gamma1.m20())) + + bool isDispOKClu1 = false; + if (mSwapM20M02ForTestLambda) + isDispOKClu1 = testLambda(cluE1, gamma1.m02(), gamma1.m20(), mShowerShapeCutValue, mUseNegativeCrossTerm); + else + isDispOKClu1 = testLambda(cluE1, gamma1.m20(), gamma1.m02(), mShowerShapeCutValue, mUseNegativeCrossTerm); + if (!isDispOKClu1) continue; for (auto const& match : matches) { if (gamma1.index() == match.caloClusterId()) { @@ -1348,9 +1384,14 @@ struct TpcElIdMassSpectrum { if (gamma1.index() >= gamma2.index()) continue; float cluE2 = gamma2.e(); - if (cluE2 < mMinCluE || cluE2 > mMaxCluE || gamma2.ncell() < mMinCluNcell || gamma2.time() > mMaxCluTime || gamma2.time() < mMinCluTime) + if (cluE2 < mMinCluE || gamma2.ncell() < mMinCluNcell || gamma2.time() > mMaxCluTime || gamma2.time() < mMinCluTime) continue; - if (!testLambda(cluE2, gamma2.m02(), gamma2.m20())) + bool isDispOKClu2 = false; + if (mSwapM20M02ForTestLambda) + isDispOKClu2 = testLambda(cluE2, gamma2.m02(), gamma2.m20(), mShowerShapeCutValue, mUseNegativeCrossTerm); + else + isDispOKClu2 = testLambda(cluE2, gamma2.m20(), gamma2.m02(), mShowerShapeCutValue, mUseNegativeCrossTerm); + if (!isDispOKClu2) continue; bool matchFlag2 = false; for (auto const& match : matches) { @@ -1395,21 +1436,6 @@ struct TpcElIdMassSpectrum { } } } - - bool testLambda(float pt, float l1, float l2) - { - float l2Mean = 1.53126f + 9.50835e+06f / (1.f + 1.08728e+07f * pt + 1.73420e+06f * pt * pt); - float l1Mean = 1.12365f + 0.123770f * std::exp(-pt * 0.246551f) + 5.30000e-03f * pt; - float l2Sigma = 6.48260e-02f + 7.60261e+10f / (1.f + 1.53012e+11f * pt + 5.01265e+05f * pt * pt) + 9.00000e-03f * pt; - float l1Sigma = 4.44719e-04f + 6.99839e-01f / (1.f + 1.22497e+00f * pt + 6.78604e-07f * pt * pt) + 9.00000e-03f * pt; - float c = -0.35f - 0.550f * std::exp(-0.390730f * pt); - if (l1Sigma == 0.f || l2Sigma == 0.f) - return false; - return 0.5f * (l1 - l1Mean) * (l1 - l1Mean) / (l1Sigma * l1Sigma) + - 0.5f * (l2 - l2Mean) * (l2 - l2Mean) / (l2Sigma * l2Sigma) + - 0.5f * c * (l1 - l1Mean) * (l2 - l2Mean) / (l1Sigma * l2Sigma) < - 4.f; - } }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 0463d722cedd6965f911b36e12ef0392ac8fca65 Mon Sep 17 00:00:00 2001 From: suyoupeng <109774812+15071832337@users.noreply.github.com> Date: Thu, 29 May 2025 21:56:00 +0800 Subject: [PATCH 1450/1650] [PWGLF] Lambda local polarization induced by jet in pp collision 13.6 TeV (#11402) --- PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx b/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx index b8af09b9c20..df00f0dafe2 100644 --- a/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx +++ b/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx @@ -216,6 +216,7 @@ struct LfMyV0s { registryData.add("AntiLambdaPtMass", "AntiLambdaPtMass", HistType::kTH2F, {ptAxis, invMassLambdaAxis}); registryData.add("hMassLambda", "hMassLambda", {HistType::kTH1F, {{200, 0.9f, 1.2f}}}); + registryData.add("hMassAntiLambda", "hMassAntiLambda", {HistType::kTH1F, {{200, 0.9f, 1.2f}}}); registryData.add("V0pTInLab", "V0pTInLab", kTH1F, {axisPT}); registryData.add("V0pxInLab", "V0pxInLab", kTH1F, {axisPx}); @@ -1022,10 +1023,11 @@ struct LfMyV0s { protonsinPhiInJetV0frame = protonsinPhiInJetV0frame + protonInJetV0(2, 0) / sqrt(protonInJetV0(1, 0) * protonInJetV0(1, 0) + protonInJetV0(2, 0) * protonInJetV0(2, 0)); registryData.fill(HIST("TProfile2DLambdaPtMassSinPhi"), candidate.mLambda(), candidate.pt(), protonInJetV0(2, 0) / sqrt(protonInJetV0(1, 0) * protonInJetV0(1, 0) + protonInJetV0(2, 0) * protonInJetV0(2, 0))); - registryData.fill(HIST("TProfile2DLambdaPtMassSintheta"), candidate.mLambda(), candidate.pt(), protonSinThetainJetV0); - registryData.fill(HIST("TProfile2DLambdaPtMassCosSquareTheta"), candidate.mLambda(), candidate.pt(), protonCosThetainJetV0 * protonCosThetainJetV0); + registryData.fill(HIST("TProfile2DLambdaPtMassSintheta"), candidate.mLambda(), candidate.pt(), (4.0 / TMath::Pi()) * protonSinThetainJetV0); + registryData.fill(HIST("TProfile2DLambdaPtMassCosSquareTheta"), candidate.mLambda(), candidate.pt(), protonCosThetainJetV0 * protonCosThetainJetV0 / 3.0); } if (passedAntiLambdaSelection(candidate, pos, neg)) { + registryData.fill(HIST("hMassAntiLambda"), candidate.mAntiLambda()); double PAntiLambda = sqrt(candidate.px() * candidate.px() + candidate.py() * candidate.py() + candidate.pz() * candidate.pz()); double EAntiLambda = sqrt(candidate.mAntiLambda() * candidate.mAntiLambda() + PAntiLambda * PAntiLambda); double AntiprotonE = sqrt(massPr * massPr + neg.px() * neg.px() + neg.py() * neg.py() + neg.pz() * neg.pz()); @@ -1046,15 +1048,15 @@ struct LfMyV0s { TMatrixD AntiprotonInJetV0(4, 1); AntiprotonInJetV0 = LorentzTransInV0frame(EAntiLambda, AntilambdaInJet(1, 0), AntilambdaInJet(2, 0), AntilambdaInJet(3, 0)) * MyTMatrixTranslationToJet(maxJetpx, maxJetpy, maxJetpz, candidate.px(), candidate.py(), candidate.pz()) * pLabAntiproton; AntiprotonsinPhiInJetV0frame = AntiprotonsinPhiInJetV0frame + AntiprotonInJetV0(2, 0) / sqrt(AntiprotonInJetV0(1, 0) * AntiprotonInJetV0(1, 0) + AntiprotonInJetV0(2, 0) * AntiprotonInJetV0(2, 0)); - registryData.fill(HIST("TProfile2DAntiLambdaPtMassSinPhi"), candidate.mAntiLambda(), candidate.pt(), AntiprotonInJetV0(2, 0) / sqrt(AntiprotonInJetV0(1, 0) * AntiprotonInJetV0(1, 0) + AntiprotonInJetV0(2, 0) * AntiprotonInJetV0(2, 0))); TMatrixD AntiprotonInV0(4, 1); AntiprotonInV0 = LorentzTransInV0frame(EAntiLambda, candidate.px(), candidate.py(), candidate.pz()) * pLabAntiproton; double AntiprotonPinJetV0 = sqrt(AntiprotonInJetV0(1, 0) * AntiprotonInJetV0(1, 0) + AntiprotonInJetV0(2, 0) * AntiprotonInJetV0(2, 0) + AntiprotonInJetV0(3, 0) * AntiprotonInJetV0(3, 0)); double AntiprotonPtinJetV0 = sqrt(AntiprotonInJetV0(1, 0) * AntiprotonInJetV0(1, 0) + AntiprotonInJetV0(2, 0) * AntiprotonInJetV0(2, 0)); double AntiprotonCosThetainJetV0 = AntiprotonInJetV0(3, 0) / AntiprotonPinJetV0; double AntiprotonSinThetainJetV0 = AntiprotonPtinJetV0 / AntiprotonPinJetV0; - registryData.fill(HIST("TProfile2DAntiLambdaPtMassSintheta"), candidate.mAntiLambda(), candidate.pt(), AntiprotonSinThetainJetV0); - registryData.fill(HIST("TProfile2DAntiLambdaPtMassCosSquareTheta"), candidate.mAntiLambda(), candidate.pt(), AntiprotonCosThetainJetV0 * AntiprotonCosThetainJetV0); + registryData.fill(HIST("TProfile2DAntiLambdaPtMassSinPhi"), candidate.mAntiLambda(), candidate.pt(), AntiprotonInJetV0(2, 0) / sqrt(AntiprotonInJetV0(1, 0) * AntiprotonInJetV0(1, 0) + AntiprotonInJetV0(2, 0) * AntiprotonInJetV0(2, 0))); + registryData.fill(HIST("TProfile2DAntiLambdaPtMassSintheta"), candidate.mAntiLambda(), candidate.pt(), (4.0 / TMath::Pi()) * AntiprotonSinThetainJetV0); + registryData.fill(HIST("TProfile2DAntiLambdaPtMassCosSquareTheta"), candidate.mAntiLambda(), candidate.pt(), AntiprotonCosThetainJetV0 * AntiprotonCosThetainJetV0 / 3.0); } } From ab6aaa3f498206a94e1e7158d80690c09f28b5ae Mon Sep 17 00:00:00 2001 From: FDUEnrich <23210190047@m.fudan.edu.cn> Date: Fri, 30 May 2025 14:28:59 +0800 Subject: [PATCH 1451/1650] [PWGHF] Fix vector error in candidateSelectorOmegac0ToOmegaPi.cxx (#11286) Co-authored-by: ALICE Action Bot --- PWGHF/DataModel/CandidateSelectionTables.h | 3 +- .../candidateSelectorOmegac0ToOmegaPi.cxx | 6 +-- .../treeCreatorOmegac0ToOmegaPi.cxx | 41 +------------------ 3 files changed, 4 insertions(+), 46 deletions(-) diff --git a/PWGHF/DataModel/CandidateSelectionTables.h b/PWGHF/DataModel/CandidateSelectionTables.h index ca58828bc0c..eaca829eeec 100644 --- a/PWGHF/DataModel/CandidateSelectionTables.h +++ b/PWGHF/DataModel/CandidateSelectionTables.h @@ -393,13 +393,12 @@ DECLARE_SOA_COLUMN(PidTpcInfoStored, pidTpcInfoStored, int); DECLARE_SOA_COLUMN(PidTofInfoStored, pidTofInfoStored, int); // Machine learning column for omegac0 to omega pi DECLARE_SOA_COLUMN(MlProbOmegac, mlProbOmegac, std::vector); -DECLARE_SOA_COLUMN(MlValueOmegac, mlValueOmegac, float); } // namespace hf_sel_toomegapi DECLARE_SOA_TABLE(HfSelToOmegaPi, "AOD", "HFSELTOOMEPI", hf_sel_toomegapi::StatusPidLambda, hf_sel_toomegapi::StatusPidCascade, hf_sel_toomegapi::StatusPidCharmBaryon, hf_sel_toomegapi::StatusInvMassLambda, hf_sel_toomegapi::StatusInvMassCascade, hf_sel_toomegapi::StatusInvMassCharmBaryon, - hf_sel_toomegapi::ResultSelections, hf_sel_toomegapi::PidTpcInfoStored, hf_sel_toomegapi::PidTofInfoStored, hf_sel_toomegapi::MlValueOmegac, + hf_sel_toomegapi::ResultSelections, hf_sel_toomegapi::PidTpcInfoStored, hf_sel_toomegapi::PidTofInfoStored, hf_sel_toomegapi::TpcNSigmaPiFromCharmBaryon, hf_sel_toomegapi::TpcNSigmaKaFromCasc, hf_sel_toomegapi::TpcNSigmaPiFromLambda, hf_sel_toomegapi::TpcNSigmaPrFromLambda, hf_sel_toomegapi::TofNSigmaPiFromCharmBaryon, hf_sel_toomegapi::TofNSigmaKaFromCasc, hf_sel_toomegapi::TofNSigmaPiFromLambda, hf_sel_toomegapi::TofNSigmaPrFromLambda); diff --git a/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx b/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx index 14ca3d917d0..7ef19ae4032 100644 --- a/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx @@ -354,7 +354,7 @@ struct HfCandidateSelectorToOmegaPi { // pt-dependent selection if (!selectionTopol(candidate)) { resultSelections = false; - hfSelToOmegaPi(statusPidLambda, statusPidCascade, statusPidCharmBaryon, statusInvMassLambda, statusInvMassCascade, statusInvMassCharmBaryon, resultSelections, infoTpcStored, infoTofStored, outputMlOmegac[0], + hfSelToOmegaPi(statusPidLambda, statusPidCascade, statusPidCharmBaryon, statusInvMassLambda, statusInvMassCascade, statusInvMassCharmBaryon, resultSelections, infoTpcStored, infoTofStored, trackPiFromCharm.tpcNSigmaPi(), trackKaFromCasc.tpcNSigmaKa(), trackPiFromLam.tpcNSigmaPi(), trackPrFromLam.tpcNSigmaPr(), trackPiFromCharm.tofNSigmaPi(), trackKaFromCasc.tofNSigmaKa(), trackPiFromLam.tofNSigmaPi(), trackPrFromLam.tofNSigmaPr()); if constexpr (ConstructMethod == hf_cand_casc_lf::ConstructMethod::KfParticle) { @@ -746,14 +746,12 @@ struct HfCandidateSelectorToOmegaPi { isSelectedMlOmegac = hfMlResponse.isSelectedMl(inputFeaturesOmegaC, ptCand, outputMlOmegac); if (isSelectedMlOmegac) { registry.fill(HIST("hBDTScoreTest1"), outputMlOmegac[0]); - } else { - resultSelections = false; } hfMlSelToOmegaPi(outputMlOmegac); } } - hfSelToOmegaPi(statusPidLambda, statusPidCascade, statusPidCharmBaryon, statusInvMassLambda, statusInvMassCascade, statusInvMassCharmBaryon, resultSelections, infoTpcStored, infoTofStored, outputMlOmegac[0], + hfSelToOmegaPi(statusPidLambda, statusPidCascade, statusPidCharmBaryon, statusInvMassLambda, statusInvMassCascade, statusInvMassCharmBaryon, resultSelections, infoTpcStored, infoTofStored, trackPiFromCharm.tpcNSigmaPi(), trackKaFromCasc.tpcNSigmaKa(), trackPiFromLam.tpcNSigmaPi(), trackPrFromLam.tpcNSigmaPr(), trackPiFromCharm.tofNSigmaPi(), trackKaFromCasc.tofNSigmaKa(), trackPiFromLam.tofNSigmaPi(), trackPrFromLam.tofNSigmaPr()); diff --git a/PWGHF/TableProducer/treeCreatorOmegac0ToOmegaPi.cxx b/PWGHF/TableProducer/treeCreatorOmegac0ToOmegaPi.cxx index 3c5491e0dae..a1b8a2b3706 100644 --- a/PWGHF/TableProducer/treeCreatorOmegac0ToOmegaPi.cxx +++ b/PWGHF/TableProducer/treeCreatorOmegac0ToOmegaPi.cxx @@ -152,7 +152,6 @@ DECLARE_SOA_COLUMN(OmegacChi2OverNdf, omegacChi2OverNdf, float); DECLARE_SOA_COLUMN(MassV0Chi2OverNdf, massV0Chi2OverNdf, float); DECLARE_SOA_COLUMN(MassCascChi2OverNdf, massCascChi2OverNdf, float); DECLARE_SOA_COLUMN(CascRejectInvmass, cascRejectInvmass, float); -DECLARE_SOA_COLUMN(OutputMlOmegac, outputMlOmegac, float); } // namespace full DECLARE_SOA_TABLE(HfToOmegaPiEvs, "AOD", "HFTOOMEPIEV", @@ -200,7 +199,7 @@ DECLARE_SOA_TABLE(HfKfOmegacFulls, "AOD", "HFKFOMEGACFULL", full::V0Ndf, full::CascNdf, full::OmegacNdf, full::MassV0Ndf, full::MassCascNdf, full::V0Chi2OverNdf, full::CascChi2OverNdf, full::OmegacChi2OverNdf, - full::MassV0Chi2OverNdf, full::MassCascChi2OverNdf, full::CascRejectInvmass, full::OutputMlOmegac, + full::MassV0Chi2OverNdf, full::MassCascChi2OverNdf, full::CascRejectInvmass, full::FlagMcMatchRec, full::OriginRec, full::CollisionMatched, hf_track_index::HFflag); DECLARE_SOA_TABLE(HfKfOmegacLites, "AOD", "HFKFOMEGACLITE", @@ -216,9 +215,6 @@ DECLARE_SOA_TABLE(HfKfOmegacLites, "AOD", "HFKFOMEGACLITE", full::V0Chi2OverNdf, full::CascChi2OverNdf, full::OmegacChi2OverNdf, full::CascRejectInvmass, full::FlagMcMatchRec, full::OriginRec, full::CollisionMatched, hf_track_index::HFflag); - -DECLARE_SOA_TABLE(HfKfOmegacMl, "AOD", "HFKFOMEGACML", - full::InvMassCharmBaryon, full::KfptOmegac, full::KfptPiFromOmegac, full::OutputMlOmegac, full::FlagMcMatchRec, full::OriginRec, full::CollisionMatched, hf_track_index::HFflag); } // namespace o2::aod /// Writes the full information in an output TTree @@ -227,7 +223,6 @@ struct HfTreeCreatorOmegac0ToOmegaPi { Produces rowCandidateLite; Produces rowKfCandidateFull; Produces rowKfCandidateLite; - Produces rowKfCandidateMl; Produces rowEv; Configurable zPvCut{"zPvCut", 10., "Cut on absolute value of primary vertex z coordinate"}; @@ -387,7 +382,6 @@ struct HfTreeCreatorOmegac0ToOmegaPi { candidate.massV0Chi2OverNdf(), candidate.massCascChi2OverNdf(), candidate.cascRejectInvmass(), - candidate.mlValueOmegac(), flagMc, originMc, collisionMatched, @@ -438,23 +432,6 @@ struct HfTreeCreatorOmegac0ToOmegaPi { } } // fillKfCandidateLite end - template - void fillKfCandidateMl(const T& candidate, int8_t flagMc, int8_t originMc, bool collisionMatched) - { - if (candidate.resultSelections() && candidate.statusPidCharmBaryon() && candidate.statusInvMassLambda() && candidate.statusInvMassCascade() && candidate.statusInvMassCharmBaryon()) { - - rowKfCandidateMl( - candidate.invMassCharmBaryon(), - candidate.kfptOmegac(), - candidate.kfptPiFromOmegac(), - candidate.mlValueOmegac(), - flagMc, - originMc, - collisionMatched, - candidate.hfflag()); - } - } // fillCandidateMl end - void processDataLite(Colls const& collisions, Tracks const&, soa::Filtered> const& candidates) { @@ -504,22 +481,6 @@ struct HfTreeCreatorOmegac0ToOmegaPi { } PROCESS_SWITCH(HfTreeCreatorOmegac0ToOmegaPi, processKfDataLite, "Process KF data Lite", false); - void processKfCandidateMl(Colls const& collisions, Tracks const&, CandKfSel const& candidates) - { - // Filling event properties - rowEv.reserve(collisions.size()); - for (const auto& collision : collisions) { - fillEvent(collision, zPvCut); - } - - // Filling candidate properties - rowKfCandidateFull.reserve(candidates.size()); - for (const auto& candidate : candidates) { - fillKfCandidateMl(candidate, -7, RecoDecay::OriginType::None, false); - } - } - PROCESS_SWITCH(HfTreeCreatorOmegac0ToOmegaPi, processKfCandidateMl, "Process KF data ML", true); - void processMcLite(Colls const& collisions, Tracks const&, soa::Filtered> const& candidates) { From 69f856e44dc59fd806fcc47406a48ced94d96184 Mon Sep 17 00:00:00 2001 From: suyoupeng <109774812+15071832337@users.noreply.github.com> Date: Fri, 30 May 2025 16:48:31 +0800 Subject: [PATCH 1452/1650] [PWGLF] Lambda local polarization induced by jet in pp collision 13.6 TeV (#11410) --- .../Tasks/Strangeness/lambdaJetpolarization.cxx | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx b/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx index df00f0dafe2..6fa6c332398 100644 --- a/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx +++ b/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx @@ -134,6 +134,7 @@ struct LfMyV0s { const AxisSpec invMassLambdaAxis{200, 1.09, 1.14, "m_{p#pi} (GeV/#it{c}^{2})"}; ConfigurableAxis TProfile2DaxisPt{"#it{p}_{T} (GeV/#it{c})", {VARIABLE_WIDTH, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.2, 3.7, 4.2, 5, 6, 8, 10, 12}, "pt axis for histograms"}; + ConfigurableAxis TProfile2DaxisMass{"Mass p#pi (GeV/#it{c^{2}})", {VARIABLE_WIDTH, 1.10068, 1.10668, 1.11068, 1.11268, 1.11368, 1.11468, 1.11568, 1.11668, 1.11768, 1.11868, 1.12068, 1.12468, 1.13068}, "Mass axis for histograms"}; registry.add("hMassLambda", "hMassLambda", {HistType::kTH1F, {{200, 0.9f, 1.2f}}}); registry.add("V0pTInLab", "V0pTInLab", kTH1F, {axisPT}); @@ -253,13 +254,13 @@ struct LfMyV0s { registryData.add("profileAntiLambda", "Invariant Mass vs sin(phi)", {HistType::kTProfile, {{200, 0.9, 1.2}}}); registryData.add("hAntiLambdamassandSinPhi", "hAntiLambdaPhiandSinPhi", kTH2F, {{200, -TMath::Pi() / 2, TMath::Pi() / 2}, {200, -1, 1}}); - registryData.add("TProfile2DLambdaPtMassSinPhi", "", kTProfile2D, {invMassLambdaAxis, TProfile2DaxisPt}); - registryData.add("TProfile2DAntiLambdaPtMassSinPhi", "", kTProfile2D, {invMassLambdaAxis, TProfile2DaxisPt}); - registryData.add("TProfile2DLambdaPtMassSintheta", "", kTProfile2D, {invMassLambdaAxis, TProfile2DaxisPt}); - registryData.add("TProfile2DAntiLambdaPtMassSintheta", "", kTProfile2D, {invMassLambdaAxis, TProfile2DaxisPt}); + registryData.add("TProfile2DLambdaPtMassSinPhi", "", kTProfile2D, {TProfile2DaxisMass, TProfile2DaxisPt}); + registryData.add("TProfile2DAntiLambdaPtMassSinPhi", "", kTProfile2D, {TProfile2DaxisMass, TProfile2DaxisPt}); + registryData.add("TProfile2DLambdaPtMassSintheta", "", kTProfile2D, {TProfile2DaxisMass, TProfile2DaxisPt}); + registryData.add("TProfile2DAntiLambdaPtMassSintheta", "", kTProfile2D, {TProfile2DaxisMass, TProfile2DaxisPt}); - registryData.add("TProfile2DLambdaPtMassCosSquareTheta", "", kTProfile2D, {invMassLambdaAxis, TProfile2DaxisPt}); - registryData.add("TProfile2DAntiLambdaPtMassCosSquareTheta", "", kTProfile2D, {invMassLambdaAxis, TProfile2DaxisPt}); + registryData.add("TProfile2DLambdaPtMassCosSquareTheta", "", kTProfile2D, {TProfile2DaxisMass, TProfile2DaxisPt}); + registryData.add("TProfile2DAntiLambdaPtMassCosSquareTheta", "", kTProfile2D, {TProfile2DaxisMass, TProfile2DaxisPt}); registryData.add("hNEvents", "hNEvents", {HistType::kTH1I, {{10, 0.f, 10.f}}}); registryData.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(1, "all"); @@ -1024,7 +1025,7 @@ struct LfMyV0s { registryData.fill(HIST("TProfile2DLambdaPtMassSinPhi"), candidate.mLambda(), candidate.pt(), protonInJetV0(2, 0) / sqrt(protonInJetV0(1, 0) * protonInJetV0(1, 0) + protonInJetV0(2, 0) * protonInJetV0(2, 0))); registryData.fill(HIST("TProfile2DLambdaPtMassSintheta"), candidate.mLambda(), candidate.pt(), (4.0 / TMath::Pi()) * protonSinThetainJetV0); - registryData.fill(HIST("TProfile2DLambdaPtMassCosSquareTheta"), candidate.mLambda(), candidate.pt(), protonCosThetainJetV0 * protonCosThetainJetV0 / 3.0); + registryData.fill(HIST("TProfile2DLambdaPtMassCosSquareTheta"), candidate.mLambda(), candidate.pt(), 3.0 * protonCosThetainJetV0 * protonCosThetainJetV0); } if (passedAntiLambdaSelection(candidate, pos, neg)) { registryData.fill(HIST("hMassAntiLambda"), candidate.mAntiLambda()); @@ -1056,7 +1057,7 @@ struct LfMyV0s { double AntiprotonSinThetainJetV0 = AntiprotonPtinJetV0 / AntiprotonPinJetV0; registryData.fill(HIST("TProfile2DAntiLambdaPtMassSinPhi"), candidate.mAntiLambda(), candidate.pt(), AntiprotonInJetV0(2, 0) / sqrt(AntiprotonInJetV0(1, 0) * AntiprotonInJetV0(1, 0) + AntiprotonInJetV0(2, 0) * AntiprotonInJetV0(2, 0))); registryData.fill(HIST("TProfile2DAntiLambdaPtMassSintheta"), candidate.mAntiLambda(), candidate.pt(), (4.0 / TMath::Pi()) * AntiprotonSinThetainJetV0); - registryData.fill(HIST("TProfile2DAntiLambdaPtMassCosSquareTheta"), candidate.mAntiLambda(), candidate.pt(), AntiprotonCosThetainJetV0 * AntiprotonCosThetainJetV0 / 3.0); + registryData.fill(HIST("TProfile2DAntiLambdaPtMassCosSquareTheta"), candidate.mAntiLambda(), candidate.pt(), 3.0 * AntiprotonCosThetainJetV0 * AntiprotonCosThetainJetV0); } } From 17dfa6045ecf1ff33a9d9b2e14ba5e90ca3aac2a Mon Sep 17 00:00:00 2001 From: EmilGorm <50658075+EmilGorm@users.noreply.github.com> Date: Fri, 30 May 2025 11:01:04 +0200 Subject: [PATCH 1453/1650] [PWGCF] add configurable mult cut (#11379) --- .../Tasks/flowGenericFramework.cxx | 73 ++++++++++++++----- 1 file changed, 56 insertions(+), 17 deletions(-) diff --git a/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx b/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx index 43bd99639ba..c7d268057e4 100644 --- a/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx +++ b/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx @@ -75,6 +75,8 @@ std::vector centbinning(90); int nBootstrap = 10; GFWRegions regions; GFWCorrConfigs configs; +std::vector multGlobalCorrCutPars; +std::vector multPVCorrCutPars; } // namespace o2::analysis::gfw struct FlowGenericFramework { @@ -92,9 +94,12 @@ struct FlowGenericFramework { O2_DEFINE_CONFIGURABLE(cfgUseGapMethod, bool, false, "Use gap method in vn-pt calculations") O2_DEFINE_CONFIGURABLE(cfgEfficiency, std::string, "", "CCDB path to efficiency object") O2_DEFINE_CONFIGURABLE(cfgAcceptance, std::string, "", "CCDB path to acceptance object") - O2_DEFINE_CONFIGURABLE(cfgDCAxy, float, 0.2, "Cut on DCA in the transverse direction (cm)"); + O2_DEFINE_CONFIGURABLE(cfgDCAxyNSigma, float, 7, "Cut on number of sigma deviations from expected DCA in the transverse direction"); O2_DEFINE_CONFIGURABLE(cfgDCAz, float, 2, "Cut on DCA in the longitudinal direction (cm)"); - O2_DEFINE_CONFIGURABLE(cfgNcls, float, 70, "Cut on number of TPC clusters found"); + O2_DEFINE_CONFIGURABLE(cfgNTPCCls, float, 70, "Cut on number of TPC clusters found"); + O2_DEFINE_CONFIGURABLE(cfgMinNITSCls, float, 5, "Cut on minimum number of ITS clusters found"); + O2_DEFINE_CONFIGURABLE(cfgChi2PrITSCls, float, 36, "Cut on chi^2 per ITS clusters found"); + O2_DEFINE_CONFIGURABLE(cfgChi2PrTPCCls, float, 2.5, "Cut on chi^2 per TPC clusters found"); O2_DEFINE_CONFIGURABLE(cfgPtmin, float, 0.2, "minimum pt (GeV/c)"); O2_DEFINE_CONFIGURABLE(cfgPtmax, float, 10, "maximum pt (GeV/c)"); O2_DEFINE_CONFIGURABLE(cfgEta, float, 0.8, "eta cut"); @@ -114,6 +119,10 @@ struct FlowGenericFramework { O2_DEFINE_CONFIGURABLE(cfgUseDensityDependentCorrection, bool, false, "Use density dependent efficiency correction based on Run 2 measurements"); Configurable> cfgTrackDensityP0{"cfgTrackDensityP0", std::vector{0.7217476707, 0.7384792571, 0.7542625668, 0.7640680200, 0.7701951667, 0.7755299053, 0.7805901710, 0.7849446786, 0.7957356586, 0.8113039262, 0.8211968966, 0.8280558878, 0.8329342135}, "parameter 0 for track density efficiency correction"}; Configurable> cfgTrackDensityP1{"cfgTrackDensityP1", std::vector{-2.169488e-05, -2.191913e-05, -2.295484e-05, -2.556538e-05, -2.754463e-05, -2.816832e-05, -2.846502e-05, -2.843857e-05, -2.705974e-05, -2.477018e-05, -2.321730e-05, -2.203315e-05, -2.109474e-05}, "parameter 1 for track density efficiency correction"}; + Configurable> cfgMultGlobalCutPars{"cfgMultGlobalCutPars", std::vector{2272.16, -76.6932, 1.01204, -0.00631545, 1.59868e-05, 136.336, -4.97006, 0.121199, -0.0015921, 7.66197e-06}, "Global multiplicity cut parameter values"}; + Configurable> cfgMultPVCutPars{"cfgMultPVCutPars", std::vector{3074.43, -106.192, 1.46176, -0.00968364, 2.61923e-05, 182.128, -7.43492, 0.193901, -0.00256715, 1.22594e-05}, "PV multiplicity cut parameter values"}; + O2_DEFINE_CONFIGURABLE(cfgMultCorrHighCutFunction, std::string, "[0] + [1]*x + [2]*x*x + [3]*x*x*x + [4]*x*x*x*x + 3.*([5] + [6]*x + [7]*x*x + [8]*x*x*x + [9]*x*x*x*x)", "Functional for multiplicity correlation cut"); + O2_DEFINE_CONFIGURABLE(cfgMultCorrLowCutFunction, std::string, "[0] + [1]*x + [2]*x*x + [3]*x*x*x + [4]*x*x*x*x - 3.*([5] + [6]*x + [7]*x*x + [8]*x*x*x + [9]*x*x*x*x)", "Functional for multiplicity correlation cut"); Configurable cfgGFWBinning{"cfgGFWBinning", {40, 16, 72, 300, 0, 3000, 0.2, 10.0, 0.2, 3.0, {0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.25, 1.5, 1.75, 2, 2.25, 2.5, 2.75, 3, 3.25, 3.5, 3.75, 4, 4.5, 5, 5.5, 6, 7, 8, 9, 10}, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90}}, "Configuration for binning"}; Configurable cfgRegions{"cfgRegions", {{"refN", "refP", "refFull"}, {-0.8, 0.4, -0.8}, {-0.4, 0.8, 0.8}, {0, 0, 0}, {1, 1, 1}}, "Configurations for GFW regions"}; @@ -161,7 +170,8 @@ struct FlowGenericFramework { kCentFT0C = 0, kCentFT0CVariant1, kCentFT0M, - kCentFV0A + kCentFV0A, + kCentNTPV }; // Define global variables @@ -231,6 +241,8 @@ struct FlowGenericFramework { o2::analysis::gfw::nchup = cfgGFWBinning->GetNchMax(); o2::analysis::gfw::centbinning = cfgGFWBinning->GetCentBinning(); cfgGFWBinning->Print(); + o2::analysis::gfw::multGlobalCorrCutPars = cfgMultGlobalCutPars; + o2::analysis::gfw::multPVCorrCutPars = cfgMultPVCutPars; AxisSpec phiAxis = {o2::analysis::gfw::phibins, o2::analysis::gfw::philow, o2::analysis::gfw::phiup, "#phi"}; AxisSpec etaAxis = {o2::analysis::gfw::etabins, -cfgEta, cfgEta, "#eta"}; @@ -250,6 +262,9 @@ struct FlowGenericFramework { case kCentFV0A: sCentralityEstimator = "FV0A"; break; + case kCentNTPV: + sCentralityEstimator = "NTPV"; + break; default: sCentralityEstimator = "FT0C"; } @@ -265,7 +280,8 @@ struct FlowGenericFramework { AxisSpec t0cAxis = {70, 0, 70000, "N_{ch} (T0C)"}; AxisSpec t0aAxis = {200, 0, 200, "N_{ch}"}; AxisSpec multpvAxis = {4000, 0, 4000, "N_{ch} (PV)"}; - AxisSpec multAxis = (cfgUseNch) ? nchAxis : centAxis; + AxisSpec multAxis = (doprocessOnTheFly && !cfgUseNch) ? bAxis : (cfgUseNch) ? nchAxis + : centAxis; AxisSpec dcaZAXis = {200, -2, 2, "DCA_{z} (cm)"}; AxisSpec dcaXYAXis = {200, -1, 1, "DCA_{xy} (cm)"}; ccdb->setURL("http://alice-ccdb.cern.ch"); @@ -362,15 +378,24 @@ struct FlowGenericFramework { fFCpt->initialise(multAxis, cfgMpar, o2::analysis::gfw::configs, cfgNbootstrap); // Event selection - Alex if (cfgUseAdditionalEventCut) { - fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x - 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); - fMultPVCutLow->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); - fMultPVCutHigh = new TF1("fMultPVCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x + 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); - fMultPVCutHigh->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); - - fMultCutLow = new TF1("fMultCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x - 2.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); - fMultCutLow->SetParameters(1654.46, -47.2379, 0.449833, -0.0014125, 150.773, -3.67334, 0.0530503, -0.000614061, 3.15956e-06); - fMultCutHigh = new TF1("fMultCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x + 3.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); - fMultCutHigh->SetParameters(1654.46, -47.2379, 0.449833, -0.0014125, 150.773, -3.67334, 0.0530503, -0.000614061, 3.15956e-06); + fMultPVCutLow = new TF1("fMultPVCutLow", cfgMultCorrLowCutFunction->c_str(), 0, 100); + fMultPVCutLow->SetParameters(&(o2::analysis::gfw::multPVCorrCutPars[0])); + fMultPVCutHigh = new TF1("fMultPVCutHigh", cfgMultCorrHighCutFunction->c_str(), 0, 100); + fMultPVCutHigh->SetParameters(&(o2::analysis::gfw::multPVCorrCutPars[0])); + fMultCutLow = new TF1("fMultCutLow", cfgMultCorrLowCutFunction->c_str(), 0, 100); + fMultCutLow->SetParameters(&(o2::analysis::gfw::multGlobalCorrCutPars[0])); + fMultCutHigh = new TF1("fMultCutHigh", cfgMultCorrHighCutFunction->c_str(), 0, 100); + fMultCutHigh->SetParameters(&(o2::analysis::gfw::multGlobalCorrCutPars[0])); + /* + fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x - 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); + fMultPVCutLow->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); + fMultPVCutHigh = new TF1("fMultPVCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x + 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); + fMultPVCutHigh->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); + + fMultCutLow = new TF1("fMultCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x - 2.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); + fMultCutLow->SetParameters(1654.46, -47.2379, 0.449833, -0.0014125, 150.773, -3.67334, 0.0530503, -0.000614061, 3.15956e-06); + fMultCutHigh = new TF1("fMultCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x + 3.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); + fMultCutHigh->SetParameters(1654.46, -47.2379, 0.449833, -0.0014125, 150.773, -3.67334, 0.0530503, -0.000614061, 3.15956e-06); */ } if (cfgUseDensityDependentCorrection) { std::vector pTEffBins = {0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.4, 1.8, 2.2, 2.6, 3.0}; @@ -600,6 +625,13 @@ struct FlowGenericFramework { return 1; } + template + bool trackSelected(TTrack track) + { + if (cfgDCAxyNSigma && (std::fabs(track.dcaXY()) > cfgDCAxyNSigma / 7. * (0.0105f + 0.0035f / track.pt()))) + return false; + return ((track.tpcNClsFound() >= cfgNTPCCls) && (track.itsNCls() >= cfgMinNITSCls)); + } enum DataType { kReco, kGen @@ -797,7 +829,10 @@ struct FlowGenericFramework { if (cfgFillQA) fillTrackQA(track, vtxz); - if (mcParticle.eta() < o2::analysis::gfw::etalow || mcParticle.eta() > o2::analysis::gfw::etaup || mcParticle.pt() < o2::analysis::gfw::ptlow || mcParticle.pt() > o2::analysis::gfw::ptup || track.tpcNClsFound() < cfgNcls) + if (mcParticle.eta() < o2::analysis::gfw::etalow || mcParticle.eta() > o2::analysis::gfw::etaup || mcParticle.pt() < o2::analysis::gfw::ptlow || mcParticle.pt() > o2::analysis::gfw::ptup) + return; + + if (!trackSelected(track)) return; int pidIndex = 0; @@ -852,7 +887,8 @@ struct FlowGenericFramework { } else { if (cfgFillQA) fillTrackQA(track, vtxz); - if (track.tpcNClsFound() < cfgNcls) + + if (!trackSelected(track)) return; int pidIndex = 0; @@ -989,11 +1025,11 @@ struct FlowGenericFramework { } o2::framework::expressions::Filter collisionFilter = nabs(aod::collision::posZ) < cfgVtxZ; - o2::framework::expressions::Filter trackFilter = nabs(aod::track::eta) < cfgEta && aod::track::pt > cfgPtmin&& aod::track::pt < cfgPtmax && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && nabs(aod::track::dcaXY) < cfgDCAxy&& nabs(aod::track::dcaZ) < cfgDCAz; + o2::framework::expressions::Filter trackFilter = nabs(aod::track::eta) < cfgEta && aod::track::pt > cfgPtmin&& aod::track::pt < cfgPtmax && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::itsChi2NCl < cfgChi2PrITSCls) && (aod::track::tpcChi2NCl < cfgChi2PrTPCCls) && nabs(aod::track::dcaZ) < cfgDCAz; using GFWTracks = soa::Filtered>; - void processData(soa::Filtered>::iterator const& collision, aod::BCsWithTimestamps const&, GFWTracks const& tracks) + void processData(soa::Filtered>::iterator const& collision, aod::BCsWithTimestamps const&, GFWTracks const& tracks) { auto bc = collision.bc_as(); int run = bc.runNumber(); @@ -1044,6 +1080,9 @@ struct FlowGenericFramework { case kCentFV0A: centrality = collision.centFV0A(); break; + case kCentNTPV: + centrality = collision.centNTPV(); + break; default: centrality = collision.centFT0C(); } From 8fb60fc3056be0efd36a2dd019e6519f3888a1b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Fri, 30 May 2025 12:06:33 +0200 Subject: [PATCH 1454/1650] [PWGJE] Include What You Use (#11358) --- PWGJE/JetFinders/jetFinder.cxx | 27 ++++++++++++++++++++++++--- PWGJE/JetFinders/jetFinderHF.cxx | 30 +++++++++++++++++++++++------- PWGJE/JetFinders/jetFinderV0.cxx | 27 ++++++++++++++++++++------- 3 files changed, 67 insertions(+), 17 deletions(-) diff --git a/PWGJE/JetFinders/jetFinder.cxx b/PWGJE/JetFinders/jetFinder.cxx index 4482509804b..9d0ff6789b3 100644 --- a/PWGJE/JetFinders/jetFinder.cxx +++ b/PWGJE/JetFinders/jetFinder.cxx @@ -15,14 +15,35 @@ /// \author Jochen Klein /// \author Raymond Ehlers , ORNL +#include +#include +#include +#include +#include +#include +#include +#include +#include // IWYU pragma: keep (needed in tasks) + +#include +#include #include -#include "PWGJE/Core/JetFindingUtilities.h" +#include +#include + +#include +#include + #include "PWGJE/Core/JetDerivedDataUtilities.h" -#include "Framework/runDataProcessing.h" +#include "PWGJE/Core/JetFinder.h" +#include "PWGJE/Core/JetFindingUtilities.h" +#include "PWGJE/DataModel/EMCALClusterDefinition.h" +#include "PWGJE/DataModel/EMCALClusters.h" +#include "PWGJE/DataModel/Jet.h" +#include "PWGJE/DataModel/JetReducedData.h" using namespace o2; -using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/PWGJE/JetFinders/jetFinderHF.cxx b/PWGJE/JetFinders/jetFinderHF.cxx index 9b435cf93a0..68a874e2955 100644 --- a/PWGJE/JetFinders/jetFinderHF.cxx +++ b/PWGJE/JetFinders/jetFinderHF.cxx @@ -14,22 +14,38 @@ /// \author Nima Zardoshti /// \author Jochen Klein +#include +#include +#include +#include +#include +#include +#include +#include +#include // IWYU pragma: keep (needed in tasks) + +#include #include -#include "CommonConstants/PhysicsConstants.h" +#include +#include + +#include +#include -#include "PWGJE/Core/JetFindingUtilities.h" #include "PWGJE/Core/JetDerivedDataUtilities.h" -#include "Common/Core/RecoDecay.h" +#include "PWGJE/Core/JetFinder.h" +#include "PWGJE/Core/JetFindingUtilities.h" +#include "PWGJE/DataModel/EMCALClusterDefinition.h" +#include "PWGJE/DataModel/EMCALClusters.h" +#include "PWGJE/DataModel/Jet.h" +#include "PWGJE/DataModel/JetReducedData.h" +#include "PWGJE/DataModel/JetSubtraction.h" using namespace o2; -using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; -// NB: runDataProcessing.h must be included after customize! -#include "Framework/runDataProcessing.h" - template struct JetFinderHFTask { Produces jetsTable; diff --git a/PWGJE/JetFinders/jetFinderV0.cxx b/PWGJE/JetFinders/jetFinderV0.cxx index cdb827783ac..560968ce0fd 100644 --- a/PWGJE/JetFinders/jetFinderV0.cxx +++ b/PWGJE/JetFinders/jetFinderV0.cxx @@ -13,22 +13,35 @@ // /// \author Nima Zardoshti +#include +#include +#include +#include +#include +#include +#include +#include +#include // IWYU pragma: keep (needed in tasks) + +#include #include -#include "CommonConstants/PhysicsConstants.h" +#include +#include + +#include +#include -#include "PWGJE/Core/JetFindingUtilities.h" #include "PWGJE/Core/JetDerivedDataUtilities.h" -#include "Common/Core/RecoDecay.h" +#include "PWGJE/Core/JetFinder.h" +#include "PWGJE/Core/JetFindingUtilities.h" +#include "PWGJE/DataModel/Jet.h" +#include "PWGJE/DataModel/JetReducedData.h" using namespace o2; -using namespace o2::analysis; using namespace o2::framework; using namespace o2::framework::expressions; -// NB: runDataProcessing.h must be included after customize! -#include "Framework/runDataProcessing.h" - template struct JetFinderV0Task { From 641d089f976c86a6d1a91b75d88b300d70491e5b Mon Sep 17 00:00:00 2001 From: aimeric-landou <46970521+aimeric-landou@users.noreply.github.com> Date: Fri, 30 May 2025 12:13:09 +0200 Subject: [PATCH 1455/1650] [PWGJE] trackEfficiency: weights in eff. plots, ptHat cuts (#11220) --- PWGJE/Tasks/trackEfficiency.cxx | 402 ++++++++++++++++++++++++++------ 1 file changed, 325 insertions(+), 77 deletions(-) diff --git a/PWGJE/Tasks/trackEfficiency.cxx b/PWGJE/Tasks/trackEfficiency.cxx index b9fde50abde..a591c32f958 100644 --- a/PWGJE/Tasks/trackEfficiency.cxx +++ b/PWGJE/Tasks/trackEfficiency.cxx @@ -9,9 +9,9 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -// track efficiency task (global tracks) -// +/// \file trackEfficiency.cxx /// \author Aimeric Landou +/// \brief task that creates the histograms necessary for computation of efficiency and purity functions in offline postprocess macros; also can make mcparticle and track QC histograms #include #include @@ -43,7 +43,7 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; -struct TrackEfficiencyJets { +struct TrackEfficiency { Service pdg; using JetParticlesWithOriginal = soa::Join; @@ -76,18 +76,31 @@ struct TrackEfficiencyJets { Configurable> centralityBinning{"centralityBinning", {0., 10., 50., 70.}, "binning of centrality histograms"}; Configurable intRateNBins{"intRateNBins", 50, "number of bins for interaction rate axis"}; Configurable intRateMax{"intRateMax", 50000.0, "maximum value of interaction rate axis"}; + Configurable phiEffNBins{"phiEffNBins", 200, "number of bins for phi axis in efficiency plots"}; + Configurable etaEffNBins{"etaEffNBins", 200, "number of bins for eta axis in efficiency plots"}; + + Configurable ptHatMin{"ptHatMin", 5, "min pT hat of collisions"}; + Configurable ptHatMax{"ptHatMax", 300, "max pT hat of collisions"}; + Configurable pTHatExponent{"pTHatExponent", 6.0, "exponent of the event weight for the calculation of pTHat"}; std::vector eventSelectionBits; int trackSelection = -1; + enum AcceptSplitCollisionsOptions { + NonSplitOnly = 0, + SplitOkCheckAnyAssocColl, // 1 + SplitOkCheckFirstAssocCollOnly // 2 + }; + bool isChargedParticle(int code) { + const float chargeUnit = 3.; auto p = pdg->GetParticle(code); auto charge = 0.; if (p != nullptr) { charge = p->Charge(); } - return std::abs(charge) >= 3.; + return std::abs(charge) >= chargeUnit; } template @@ -123,10 +136,14 @@ struct TrackEfficiencyJets { void init(o2::framework::InitContext&) { + if (!(acceptSplitCollisions == NonSplitOnly || acceptSplitCollisions == SplitOkCheckAnyAssocColl || acceptSplitCollisions == SplitOkCheckFirstAssocCollOnly)) { + LOGF(fatal, "Configurable acceptSplitCollisions has wrong input value; stopping workflow"); + } + eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast(eventSelections)); trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast(trackSelections)); - if (doprocessEFficiencyPurity) { + if (doprocessEFficiencyPurity || doprocessEFficiencyPurityWeighted) { registry.add("hMcCollCutsCounts", "McColl cuts count checks", {HistType::kTH1F, {{10, 0., 10.}}}); registry.get(HIST("hMcCollCutsCounts"))->GetXaxis()->SetBinLabel(1, "allMcColl"); @@ -135,6 +152,7 @@ struct TrackEfficiencyJets { registry.get(HIST("hMcCollCutsCounts"))->GetXaxis()->SetBinLabel(4, "splitColl"); registry.get(HIST("hMcCollCutsCounts"))->GetXaxis()->SetBinLabel(5, "recoCollEvtSel"); registry.get(HIST("hMcCollCutsCounts"))->GetXaxis()->SetBinLabel(6, "centralityCut"); + registry.get(HIST("hMcCollCutsCounts"))->GetXaxis()->SetBinLabel(7, "ptHatCut"); registry.add("hMcPartCutsCounts", "McPart cuts count checks", {HistType::kTH1F, {{10, 0., 10.}}}); registry.get(HIST("hMcPartCutsCounts"))->GetXaxis()->SetBinLabel(1, "allPartsInSelMcColl"); @@ -149,46 +167,46 @@ struct TrackEfficiencyJets { registry.get(HIST("hTrackCutsCounts"))->GetXaxis()->SetBinLabel(4, "mcPartIsPrimary"); registry.get(HIST("hTrackCutsCounts"))->GetXaxis()->SetBinLabel(5, "etaAcc"); // not actually applied here but it will give an idea of what will be done in the post processing - AxisSpec ptAxis_eff = {nBinsLowPt, 0., 10., "#it{p}_{T} (GeV/#it{c})"}; - AxisSpec ptAxisHigh_eff = {18, 10., 100., "#it{p}_{T} (GeV/#it{c})"}; - AxisSpec etaAxis_eff = {100, -1.0, 1.0, "#eta"}; - AxisSpec phiAxis_eff = {200, -1.0, 7., "#phi"}; + AxisSpec ptAxisEff = {nBinsLowPt, 0., 10., "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec ptAxisHighEff = {18, 10., 100., "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec etaAxisEff = {etaEffNBins, -1.0, 1.0, "#eta"}; + AxisSpec phiAxisEff = {phiEffNBins, -1.0, 7., "#phi"}; // ptAxisLow - registry.add("h3_particle_pt_particle_eta_particle_phi_mcpartofinterest", "#it{p}_{T, mcpart} (GeV/#it{c}); #eta_{mcpart}; #phi_{mcpart}", {HistType::kTH3F, {ptAxis_eff, etaAxis_eff, phiAxis_eff}}); - registry.add("h3_particle_pt_particle_eta_particle_phi_mcpart_nonprimary", "#it{p}_{T, mcpart} (GeV/#it{c}); #eta_{mcpart}; #phi_{mcpart}", {HistType::kTH3F, {ptAxis_eff, etaAxis_eff, phiAxis_eff}}); + registry.add("h3_particle_pt_particle_eta_particle_phi_mcpartofinterest", "#it{p}_{T, mcpart} (GeV/#it{c}); #eta_{mcpart}; #phi_{mcpart}", {HistType::kTH3F, {ptAxisEff, etaAxisEff, phiAxisEff}}); + registry.add("h3_particle_pt_particle_eta_particle_phi_mcpart_nonprimary", "#it{p}_{T, mcpart} (GeV/#it{c}); #eta_{mcpart}; #phi_{mcpart}", {HistType::kTH3F, {ptAxisEff, etaAxisEff, phiAxisEff}}); - registry.add("h3_track_pt_track_eta_track_phi_nonassociatedtrack", "#it{p}_{T, track} (GeV/#it{c}); #eta_{track}; #phi_{track}", {HistType::kTH3F, {ptAxis_eff, etaAxis_eff, phiAxis_eff}}); - registry.add("h3_track_pt_track_eta_track_phi_associatedtrack_primary", "#it{p}_{T, track} (GeV/#it{c}); #eta_{track}; #phi_{track}", {HistType::kTH3F, {ptAxis_eff, etaAxis_eff, phiAxis_eff}}); - registry.add("h3_track_pt_track_eta_track_phi_associatedtrack_nonprimary", "#it{p}_{T, track} (GeV/#it{c}); #eta_{track}; #phi_{track}", {HistType::kTH3F, {ptAxis_eff, etaAxis_eff, phiAxis_eff}}); - registry.add("h3_track_pt_track_eta_track_phi_associatedtrack_split_primary", "#it{p}_{T, track} (GeV/#it{c}); #eta_{track}; #phi_{track}", {HistType::kTH3F, {ptAxis_eff, etaAxis_eff, phiAxis_eff}}); - registry.add("h3_track_pt_track_eta_track_phi_associatedtrack_split_nonprimary", "#it{p}_{T, track} (GeV/#it{c}); #eta_{track}; #phi_{track}", {HistType::kTH3F, {ptAxis_eff, etaAxis_eff, phiAxis_eff}}); + registry.add("h3_track_pt_track_eta_track_phi_nonassociatedtrack", "#it{p}_{T, track} (GeV/#it{c}); #eta_{track}; #phi_{track}", {HistType::kTH3F, {ptAxisEff, etaAxisEff, phiAxisEff}}); + registry.add("h3_track_pt_track_eta_track_phi_associatedtrack_primary", "#it{p}_{T, track} (GeV/#it{c}); #eta_{track}; #phi_{track}", {HistType::kTH3F, {ptAxisEff, etaAxisEff, phiAxisEff}}); + registry.add("h3_track_pt_track_eta_track_phi_associatedtrack_nonprimary", "#it{p}_{T, track} (GeV/#it{c}); #eta_{track}; #phi_{track}", {HistType::kTH3F, {ptAxisEff, etaAxisEff, phiAxisEff}}); + registry.add("h3_track_pt_track_eta_track_phi_associatedtrack_split_primary", "#it{p}_{T, track} (GeV/#it{c}); #eta_{track}; #phi_{track}", {HistType::kTH3F, {ptAxisEff, etaAxisEff, phiAxisEff}}); + registry.add("h3_track_pt_track_eta_track_phi_associatedtrack_split_nonprimary", "#it{p}_{T, track} (GeV/#it{c}); #eta_{track}; #phi_{track}", {HistType::kTH3F, {ptAxisEff, etaAxisEff, phiAxisEff}}); - registry.add("h3_particle_pt_particle_eta_particle_phi_associatedtrack_primary", "#it{p}_{T, mcpart} (GeV/#it{c}); #eta_{mcpart}; #phi_{mcpart}", {HistType::kTH3F, {ptAxis_eff, etaAxis_eff, phiAxis_eff}}); - registry.add("h3_particle_pt_particle_eta_particle_phi_associatedtrack_nonprimary", "#it{p}_{T, mcpart} (GeV/#it{c}); #eta_{mcpart}; #phi_{mcpart}", {HistType::kTH3F, {ptAxis_eff, etaAxis_eff, phiAxis_eff}}); - registry.add("h3_particle_pt_particle_eta_particle_phi_associatedtrack_split_primary", "#it{p}_{T, mcpart} (GeV/#it{c}); #eta_{mcpart}; #phi_{mcpart}", {HistType::kTH3F, {ptAxis_eff, etaAxis_eff, phiAxis_eff}}); - registry.add("h3_particle_pt_particle_eta_particle_phi_associatedtrack_split_nonprimary", "#it{p}_{T, mcpart} (GeV/#it{c}); #eta_{mcpart}; #phi_{mcpart}", {HistType::kTH3F, {ptAxis_eff, etaAxis_eff, phiAxis_eff}}); + registry.add("h3_particle_pt_particle_eta_particle_phi_associatedtrack_primary", "#it{p}_{T, mcpart} (GeV/#it{c}); #eta_{mcpart}; #phi_{mcpart}", {HistType::kTH3F, {ptAxisEff, etaAxisEff, phiAxisEff}}); + registry.add("h3_particle_pt_particle_eta_particle_phi_associatedtrack_nonprimary", "#it{p}_{T, mcpart} (GeV/#it{c}); #eta_{mcpart}; #phi_{mcpart}", {HistType::kTH3F, {ptAxisEff, etaAxisEff, phiAxisEff}}); + registry.add("h3_particle_pt_particle_eta_particle_phi_associatedtrack_split_primary", "#it{p}_{T, mcpart} (GeV/#it{c}); #eta_{mcpart}; #phi_{mcpart}", {HistType::kTH3F, {ptAxisEff, etaAxisEff, phiAxisEff}}); + registry.add("h3_particle_pt_particle_eta_particle_phi_associatedtrack_split_nonprimary", "#it{p}_{T, mcpart} (GeV/#it{c}); #eta_{mcpart}; #phi_{mcpart}", {HistType::kTH3F, {ptAxisEff, etaAxisEff, phiAxisEff}}); - registry.add("h2_particle_pt_track_pt_residual_associatedtrack_primary", "(#it{p}_{T, mcpart} - #it{p}_{T, track}) / #it{p}_{T, mcpart}; #it{p}_{T, mcpart} (GeV/#it{c})", {HistType::kTH2F, {ptAxis_eff, {200, -1., 1.}}}); + registry.add("h2_particle_pt_track_pt_residual_associatedtrack_primary", "(#it{p}_{T, mcpart} - #it{p}_{T, track}) / #it{p}_{T, mcpart}; #it{p}_{T, mcpart} (GeV/#it{c})", {HistType::kTH2F, {ptAxisEff, {200, -1., 1.}}}); // ptAxisHigh - registry.add("h3_particle_pt_high_particle_eta_particle_phi_mcpartofinterest", "#it{p}_{T, mcpart} (GeV/#it{c}); #eta_{mcpart}; #phi_{mcpart}", {HistType::kTH3F, {ptAxisHigh_eff, etaAxis_eff, phiAxis_eff}}); + registry.add("h3_particle_pt_high_particle_eta_particle_phi_mcpartofinterest", "#it{p}_{T, mcpart} (GeV/#it{c}); #eta_{mcpart}; #phi_{mcpart}", {HistType::kTH3F, {ptAxisHighEff, etaAxisEff, phiAxisEff}}); - registry.add("h3_track_pt_high_track_eta_track_phi_nonassociatedtrack", "#it{p}_{T, track} (GeV/#it{c}); #eta_{track}; #phi_{track}", {HistType::kTH3F, {ptAxisHigh_eff, etaAxis_eff, phiAxis_eff}}); - registry.add("h3_track_pt_high_track_eta_track_phi_associatedtrack_primary", "#it{p}_{T, track} (GeV/#it{c}); #eta_{track}; #phi_{track}", {HistType::kTH3F, {ptAxisHigh_eff, etaAxis_eff, phiAxis_eff}}); - registry.add("h3_track_pt_high_track_eta_track_phi_associatedtrack_nonprimary", "#it{p}_{T, track} (GeV/#it{c}); #eta_{track}; #phi_{track}", {HistType::kTH3F, {ptAxisHigh_eff, etaAxis_eff, phiAxis_eff}}); - registry.add("h3_track_pt_high_track_eta_track_phi_associatedtrack_split_primary", "#it{p}_{T, track} (GeV/#it{c}); #eta_{track}; #phi_{track}", {HistType::kTH3F, {ptAxisHigh_eff, etaAxis_eff, phiAxis_eff}}); - registry.add("h3_track_pt_high_track_eta_track_phi_associatedtrack_split_nonprimary", "#it{p}_{T, track} (GeV/#it{c}); #eta_{track}; #phi_{track}", {HistType::kTH3F, {ptAxisHigh_eff, etaAxis_eff, phiAxis_eff}}); + registry.add("h3_track_pt_high_track_eta_track_phi_nonassociatedtrack", "#it{p}_{T, track} (GeV/#it{c}); #eta_{track}; #phi_{track}", {HistType::kTH3F, {ptAxisHighEff, etaAxisEff, phiAxisEff}}); + registry.add("h3_track_pt_high_track_eta_track_phi_associatedtrack_primary", "#it{p}_{T, track} (GeV/#it{c}); #eta_{track}; #phi_{track}", {HistType::kTH3F, {ptAxisHighEff, etaAxisEff, phiAxisEff}}); + registry.add("h3_track_pt_high_track_eta_track_phi_associatedtrack_nonprimary", "#it{p}_{T, track} (GeV/#it{c}); #eta_{track}; #phi_{track}", {HistType::kTH3F, {ptAxisHighEff, etaAxisEff, phiAxisEff}}); + registry.add("h3_track_pt_high_track_eta_track_phi_associatedtrack_split_primary", "#it{p}_{T, track} (GeV/#it{c}); #eta_{track}; #phi_{track}", {HistType::kTH3F, {ptAxisHighEff, etaAxisEff, phiAxisEff}}); + registry.add("h3_track_pt_high_track_eta_track_phi_associatedtrack_split_nonprimary", "#it{p}_{T, track} (GeV/#it{c}); #eta_{track}; #phi_{track}", {HistType::kTH3F, {ptAxisHighEff, etaAxisEff, phiAxisEff}}); - registry.add("h3_particle_pt_high_particle_eta_particle_phi_associatedtrack_primary", "#it{p}_{T, mcpart} (GeV/#it{c}); #eta_{mcpart}; #phi_{mcpart}", {HistType::kTH3F, {ptAxisHigh_eff, etaAxis_eff, phiAxis_eff}}); - registry.add("h3_particle_pt_high_particle_eta_particle_phi_associatedtrack_nonprimary", "#it{p}_{T, mcpart} (GeV/#it{c}); #eta_{mcpart}; #phi_{mcpart}", {HistType::kTH3F, {ptAxisHigh_eff, etaAxis_eff, phiAxis_eff}}); - registry.add("h3_particle_pt_high_particle_eta_particle_phi_associatedtrack_split_primary", "#it{p}_{T, mcpart} (GeV/#it{c}); #eta_{mcpart}; #phi_{mcpart}", {HistType::kTH3F, {ptAxisHigh_eff, etaAxis_eff, phiAxis_eff}}); - registry.add("h3_particle_pt_high_particle_eta_particle_phi_associatedtrack_split_nonprimary", "#it{p}_{T, mcpart} (GeV/#it{c}); #eta_{mcpart}; #phi_{mcpart}", {HistType::kTH3F, {ptAxisHigh_eff, etaAxis_eff, phiAxis_eff}}); + registry.add("h3_particle_pt_high_particle_eta_particle_phi_associatedtrack_primary", "#it{p}_{T, mcpart} (GeV/#it{c}); #eta_{mcpart}; #phi_{mcpart}", {HistType::kTH3F, {ptAxisHighEff, etaAxisEff, phiAxisEff}}); + registry.add("h3_particle_pt_high_particle_eta_particle_phi_associatedtrack_nonprimary", "#it{p}_{T, mcpart} (GeV/#it{c}); #eta_{mcpart}; #phi_{mcpart}", {HistType::kTH3F, {ptAxisHighEff, etaAxisEff, phiAxisEff}}); + registry.add("h3_particle_pt_high_particle_eta_particle_phi_associatedtrack_split_primary", "#it{p}_{T, mcpart} (GeV/#it{c}); #eta_{mcpart}; #phi_{mcpart}", {HistType::kTH3F, {ptAxisHighEff, etaAxisEff, phiAxisEff}}); + registry.add("h3_particle_pt_high_particle_eta_particle_phi_associatedtrack_split_nonprimary", "#it{p}_{T, mcpart} (GeV/#it{c}); #eta_{mcpart}; #phi_{mcpart}", {HistType::kTH3F, {ptAxisHighEff, etaAxisEff, phiAxisEff}}); - registry.add("h2_particle_pt_high_track_pt_high_residual_associatedtrack_primary", "(#it{p}_{T, mcpart} - #it{p}_{T, track}) / #it{p}_{T, mcpart}; #it{p}_{T, mcpart} (GeV/#it{c})", {HistType::kTH2F, {ptAxisHigh_eff, {200, -1., 1.}}}); + registry.add("h2_particle_pt_high_track_pt_high_residual_associatedtrack_primary", "(#it{p}_{T, mcpart} - #it{p}_{T, track}) / #it{p}_{T, mcpart}; #it{p}_{T, mcpart} (GeV/#it{c})", {HistType::kTH2F, {ptAxisHighEff, {200, -1., 1.}}}); } - if (doprocessTracks || doprocessTracksWeighted) { + if (doprocessTracks || doprocessTracksMc || doprocessTracksMcWeighted) { AxisSpec centAxis = {centralityBinning, "centrality (%)"}; AxisSpec intRateAxis = {intRateNBins, 0., intRateMax, "int. rate (kHz)"}; registry.add("h2_centrality_track_pt", "centrality vs track pT; centrality; #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {centAxis, {200, 0., 200.}}}); @@ -200,6 +218,9 @@ struct TrackEfficiencyJets { registry.add("h2_track_pt_track_sigma1overpt", "#sigma(1/#it{p}_{T}); #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {{100, 0., 10.}, {1000, 0.0, 10.0}}}); registry.add("h2_track_pt_high_track_sigma1overpt", "#sigma(1/#it{p}_{T}); #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {{90, 10., 100.}, {1000, 0.0, 10.0}}}); registry.add("h3_intrate_centrality_track_pt", "interaction rate vs centrality vs track pT; int. rate; centrality; #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH3F, {intRateAxis, centAxis, {200, 0., 200.}}}); + + registry.add("h_collisions", "event status;event status;entries", {HistType::kTH1F, {{4, 0.0, 4.0}}}); + registry.add("h2_centrality_collisions", "centrality vs collisions; centrality; collisions", {HistType::kTH2F, {centAxis, {4, 0.0, 4.0}}}); } if (doprocessParticles || doprocessParticlesWeighted) { @@ -210,20 +231,16 @@ struct TrackEfficiencyJets { registry.add("h2_centrality_particle_phi", "centrality vs particle #varphi; centrality; #varphi_{part}", {HistType::kTH2F, {centAxis, {160, -1.0, 7.}}}); registry.add("h2_centrality_particle_energy", "centrality vs particle energy; centrality; Energy GeV", {HistType::kTH2F, {centAxis, {100, 0.0, 100.0}}}); registry.add("h3_intrate_centrality_particle_pt", "interaction rate vs centrality vs particle pT; int. rate; centrality; #it{p}_{T,part} (GeV/#it{c})", {HistType::kTH3F, {intRateAxis, centAxis, {200, 0., 200.}}}); + + registry.add("h_mccollisions", "event status;event status;entries", {HistType::kTH1F, {{4, 0.0, 4.0}}}); + registry.add("h2_centrality_mccollisions", "centrality vs mccollisions; centrality; collisions", {HistType::kTH2F, {centAxis, {4, 0.0, 4.0}}}); } - if (doprocessTracks || doprocessTracksWeighted) { + if (doprocessTracksMc || doprocessTracksMcWeighted) { AxisSpec centAxis = {centralityBinning, "centrality (%)"}; - registry.add("h_collisions", "event status;event status;entries", {HistType::kTH1F, {{4, 0.0, 4.0}}}); registry.add("h_fakecollisions", "event status;event status;entries", {HistType::kTH1F, {{4, 0.0, 4.0}}}); - registry.add("h2_centrality_collisions", "centrality vs collisions; centrality; collisions", {HistType::kTH2F, {centAxis, {4, 0.0, 4.0}}}); - } - if (doprocessParticles || doprocessParticlesWeighted) { - AxisSpec centAxis = {centralityBinning, "centrality (%)"}; - registry.add("h_mccollisions", "event status;event status;entries", {HistType::kTH1F, {{4, 0.0, 4.0}}}); - registry.add("h2_centrality_mccollisions", "centrality vs mccollisions; centrality; collisions", {HistType::kTH2F, {centAxis, {4, 0.0, 4.0}}}); } - if (doprocessTracksWeighted) { + if (doprocessTracksMcWeighted) { registry.add("h_collisions_weighted", "event status;event status;entries", {HistType::kTH1F, {{4, 0.0, 4.0}}}); } if (doprocessParticlesWeighted) { @@ -251,7 +268,7 @@ struct TrackEfficiencyJets { registry.fill(HIST("hMcCollCutsCounts"), 0.5); // all mcCollisions - if (!(abs(mcCollision.posZ()) < vertexZCut)) { + if (!(std::abs(mcCollision.posZ()) < vertexZCut)) { return; } registry.fill(HIST("hMcCollCutsCounts"), 1.5); // mcCollision.posZ() condition @@ -261,22 +278,22 @@ struct TrackEfficiencyJets { } registry.fill(HIST("hMcCollCutsCounts"), 2.5); // mcCollisions with at least one reconstructed collision - if (acceptSplitCollisions == 0 && collisions.size() > 1) { + if (acceptSplitCollisions == NonSplitOnly && collisions.size() > 1) { return; } registry.fill(HIST("hMcCollCutsCounts"), 3.5); // split mcCollisions condition bool hasSel8Coll = false; bool centralityCheck = false; - if (acceptSplitCollisions == 2) { // check only that the first reconstructed collision passes the check + if (acceptSplitCollisions == SplitOkCheckFirstAssocCollOnly || acceptSplitCollisions == NonSplitOnly) { // check only that the first reconstructed collision passes the check (for the NonSplitOnly case, there's only one associated collision) if (jetderiveddatautilities::selectCollision(collisions.begin(), eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split hasSel8Coll = true; } if (!checkCentrality || ((centralityMin < collisions.begin().centrality()) && (collisions.begin().centrality() < centralityMax))) { // effect unclear if mcColl is split centralityCheck = true; } - } else { // check that at least one of the reconstructed collisions passes the checks - for (auto& collision : collisions) { + } else if (acceptSplitCollisions == SplitOkCheckAnyAssocColl) { // check that at least one of the reconstructed collisions passes the checks + for (auto const& collision : collisions) { if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split hasSel8Coll = true; } @@ -295,7 +312,13 @@ struct TrackEfficiencyJets { } registry.fill(HIST("hMcCollCutsCounts"), 5.5); // at least one of the reconstructed collisions associated with this mcCollision is selected with regard to centrality - for (auto& jMcParticle : jMcParticles) { + float pTHat = 10. / (std::pow(mcCollision.weight(), 1.0 / pTHatExponent)); + if (pTHat < ptHatMin || pTHat > ptHatMax) { // only allows mcCollisions with weight in between min and max + return; + } + registry.fill(HIST("hMcCollCutsCounts"), 6.5); // ptHat condition + + for (auto const& jMcParticle : jMcParticles) { registry.fill(HIST("hMcPartCutsCounts"), 0.5); // allPartsInSelMcColl if (!isChargedParticle(jMcParticle.pdgCode())) { @@ -314,7 +337,7 @@ struct TrackEfficiencyJets { registry.fill(HIST("h3_particle_pt_high_particle_eta_particle_phi_mcpartofinterest"), jMcParticle.pt(), jMcParticle.eta(), jMcParticle.phi()); - if ((abs(jMcParticle.eta()) < trackEtaAcceptanceCountQA)) { // removed from actual cuts for now because all the histograms have an eta axis + if ((std::abs(jMcParticle.eta()) < trackEtaAcceptanceCountQA)) { // removed from actual cuts for now because all the histograms have an eta axis registry.fill(HIST("hMcPartCutsCounts"), 3.5); // etaAccept // not actually applied here but it will give an idea of what will be done in the post processing } } @@ -322,18 +345,18 @@ struct TrackEfficiencyJets { std::vector seenMcParticlesVector; // is reset every mc collision int splitCollCounter = 0; - for (auto& collision : collisions) { + for (auto const& collision : collisions) { splitCollCounter++; - if (acceptSplitCollisions == 2 && splitCollCounter > 1) { + if (acceptSplitCollisions == SplitOkCheckFirstAssocCollOnly && splitCollCounter > 1) { return; } - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents) || !(abs(collision.posZ()) < vertexZCut)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents) || !(std::abs(collision.posZ()) < vertexZCut)) { continue; } auto collTracks = jetTracks.sliceBy(tracksPerJCollision, collision.globalIndex()); - for (auto& track : collTracks) { + for (auto const& track : collTracks) { registry.fill(HIST("hTrackCutsCounts"), 0.5); if (!(jetderiveddatautilities::selectTrack(track, trackSelection) && jetderiveddatautilities::selectTrackDcaZ(track, trackDcaZmax))) { // if track selection is uniformTrack, dcaZ cuts need to be added as they aren't in the selection so that they can be studied here @@ -390,13 +413,180 @@ struct TrackEfficiencyJets { seenMcParticlesVector.push_back(jMcParticleFromTrack.globalIndex()); } - if (abs(jMcParticleFromTrack.eta()) < trackEtaAcceptanceCountQA) { // not actually applied here but it will give an idea of what will be done in the post processing + if (std::abs(jMcParticleFromTrack.eta()) < trackEtaAcceptanceCountQA) { // not actually applied here but it will give an idea of what will be done in the post processing registry.fill(HIST("hTrackCutsCounts"), 4.5); } } } } - PROCESS_SWITCH(TrackEfficiencyJets, processEFficiencyPurity, "Histograms for efficiency and purity quantities", true); + PROCESS_SWITCH(TrackEfficiency, processEFficiencyPurity, "Histograms for efficiency and purity quantities", true); + + void processEFficiencyPurityWeighted(aod::JetMcCollision const& mcCollision, + soa::SmallGroups const& collisions, // smallgroups gives only the collisions associated to the current mccollision, thanks to the mccollisionlabel pre-integrated in jetcollisionsmcd + soa::Join const& jetTracks, + JetParticlesWithOriginal const& jMcParticles) + { + // missing: + // * constexpr auto hasCentrality = CollisionMCRecTableCentFT0C::template contains(); + // if constexpr (hasCentrality) { + // * dividing in centrality bins + // I should maybe introduce the sel8 cuts on the collisoins (reco, but what about mccoll? maybe not htat way included in efficiency) + + registry.fill(HIST("hMcCollCutsCounts"), 0.5); // all mcCollisions + + if (!(std::abs(mcCollision.posZ()) < vertexZCut)) { + return; + } + registry.fill(HIST("hMcCollCutsCounts"), 1.5); // mcCollision.posZ() condition + + if (collisions.size() < 1) { + return; + } + registry.fill(HIST("hMcCollCutsCounts"), 2.5); // mcCollisions with at least one reconstructed collision + + if (acceptSplitCollisions == NonSplitOnly && collisions.size() > 1) { + return; + } + registry.fill(HIST("hMcCollCutsCounts"), 3.5); // split mcCollisions condition + + bool hasSel8Coll = false; + bool centralityCheck = false; + if (acceptSplitCollisions == SplitOkCheckFirstAssocCollOnly || acceptSplitCollisions == NonSplitOnly) { // check only that the first reconstructed collision passes the check (for the NonSplitOnly case, there's only one associated collision) + if (jetderiveddatautilities::selectCollision(collisions.begin(), eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split + hasSel8Coll = true; + } + if (!checkCentrality || ((centralityMin < collisions.begin().centrality()) && (collisions.begin().centrality() < centralityMax))) { // effect unclear if mcColl is split + centralityCheck = true; + } + } else if (acceptSplitCollisions == SplitOkCheckAnyAssocColl) { // check that at least one of the reconstructed collisions passes the checks + for (auto const& collision : collisions) { + if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split + hasSel8Coll = true; + } + if (!checkCentrality || ((centralityMin < collision.centrality()) && (collision.centrality() < centralityMax))) { // effect unclear if mcColl is split + centralityCheck = true; + } + } + } + if (!hasSel8Coll) { + return; + } + registry.fill(HIST("hMcCollCutsCounts"), 4.5); // at least one of the reconstructed collisions associated with this mcCollision is selected + + if (!centralityCheck) { + return; + } + registry.fill(HIST("hMcCollCutsCounts"), 5.5); // at least one of the reconstructed collisions associated with this mcCollision is selected with regard to centrality + + float eventWeight = mcCollision.weight(); + float pTHat = 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); + if (pTHat < ptHatMin || pTHat > ptHatMax) { // only allows mcCollisions with weight in between min and max + return; + } + registry.fill(HIST("hMcCollCutsCounts"), 6.5); // ptHat condition + + for (auto const& jMcParticle : jMcParticles) { + registry.fill(HIST("hMcPartCutsCounts"), 0.5); // allPartsInSelMcColl + + if (!isChargedParticle(jMcParticle.pdgCode())) { + continue; + } + registry.fill(HIST("hMcPartCutsCounts"), 1.5); // isCharged + + registry.fill(HIST("h3_particle_pt_particle_eta_particle_phi_mcpart_nonprimary"), jMcParticle.pt(), jMcParticle.eta(), jMcParticle.phi(), eventWeight); + + if (checkPrimaryPart && !jMcParticle.isPhysicalPrimary()) { // global tracks should be mostly primaries + continue; + } + registry.fill(HIST("hMcPartCutsCounts"), 2.5); // isPrimary + + registry.fill(HIST("h3_particle_pt_particle_eta_particle_phi_mcpartofinterest"), jMcParticle.pt(), jMcParticle.eta(), jMcParticle.phi(), eventWeight); + + registry.fill(HIST("h3_particle_pt_high_particle_eta_particle_phi_mcpartofinterest"), jMcParticle.pt(), jMcParticle.eta(), jMcParticle.phi(), eventWeight); + + if ((std::abs(jMcParticle.eta()) < trackEtaAcceptanceCountQA)) { // removed from actual cuts for now because all the histograms have an eta axis + registry.fill(HIST("hMcPartCutsCounts"), 3.5); // etaAccept // not actually applied here but it will give an idea of what will be done in the post processing + } + } + + std::vector seenMcParticlesVector; // is reset every mc collision + + int splitCollCounter = 0; + for (auto const& collision : collisions) { + splitCollCounter++; + if (acceptSplitCollisions == SplitOkCheckFirstAssocCollOnly && splitCollCounter > 1) { + return; + } + + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents) || !(std::abs(collision.posZ()) < vertexZCut)) { + continue; + } + + auto collTracks = jetTracks.sliceBy(tracksPerJCollision, collision.globalIndex()); + for (auto const& track : collTracks) { + registry.fill(HIST("hTrackCutsCounts"), 0.5); + + if (!(jetderiveddatautilities::selectTrack(track, trackSelection) && jetderiveddatautilities::selectTrackDcaZ(track, trackDcaZmax))) { // if track selection is uniformTrack, dcaZ cuts need to be added as they aren't in the selection so that they can be studied here + continue; + } + registry.fill(HIST("hTrackCutsCounts"), 1.5); + + if (!track.has_mcParticle()) { + registry.fill(HIST("h3_track_pt_track_eta_track_phi_nonassociatedtrack"), track.pt(), track.eta(), track.phi(), eventWeight); + + registry.fill(HIST("h3_track_pt_high_track_eta_track_phi_nonassociatedtrack"), track.pt(), track.eta(), track.phi(), eventWeight); + continue; + } + registry.fill(HIST("hTrackCutsCounts"), 2.5); + + auto jMcParticleFromTrack = track.mcParticle_as(); + if (!jMcParticleFromTrack.isPhysicalPrimary()) { + registry.fill(HIST("h3_track_pt_track_eta_track_phi_associatedtrack_nonprimary"), track.pt(), track.eta(), track.phi(), eventWeight); + registry.fill(HIST("h3_particle_pt_particle_eta_particle_phi_associatedtrack_nonprimary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), eventWeight); + + registry.fill(HIST("h3_track_pt_high_track_eta_track_phi_associatedtrack_nonprimary"), track.pt(), track.eta(), track.phi(), eventWeight); + registry.fill(HIST("h3_particle_pt_high_particle_eta_particle_phi_associatedtrack_nonprimary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), eventWeight); + + if (std::find(seenMcParticlesVector.begin(), seenMcParticlesVector.end(), jMcParticleFromTrack.globalIndex()) != seenMcParticlesVector.end()) { + registry.fill(HIST("h3_track_pt_track_eta_track_phi_associatedtrack_split_nonprimary"), track.pt(), track.eta(), track.phi(), eventWeight); + registry.fill(HIST("h3_particle_pt_particle_eta_particle_phi_associatedtrack_split_nonprimary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), eventWeight); + + registry.fill(HIST("h3_track_pt_high_track_eta_track_phi_associatedtrack_split_nonprimary"), track.pt(), track.eta(), track.phi(), eventWeight); + registry.fill(HIST("h3_particle_pt_high_particle_eta_particle_phi_associatedtrack_split_nonprimary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), eventWeight); + } else { + seenMcParticlesVector.push_back(jMcParticleFromTrack.globalIndex()); + } + + continue; + } + + registry.fill(HIST("hTrackCutsCounts"), 3.5); + + registry.fill(HIST("h3_track_pt_track_eta_track_phi_associatedtrack_primary"), track.pt(), track.eta(), track.phi(), eventWeight); + registry.fill(HIST("h3_particle_pt_particle_eta_particle_phi_associatedtrack_primary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), eventWeight); + registry.fill(HIST("h2_particle_pt_track_pt_residual_associatedtrack_primary"), jMcParticleFromTrack.pt(), (jMcParticleFromTrack.pt() - track.pt()) / jMcParticleFromTrack.pt(), eventWeight); + + registry.fill(HIST("h3_track_pt_high_track_eta_track_phi_associatedtrack_primary"), track.pt(), track.eta(), track.phi(), eventWeight); + registry.fill(HIST("h3_particle_pt_high_particle_eta_particle_phi_associatedtrack_primary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), eventWeight); + registry.fill(HIST("h2_particle_pt_high_track_pt_high_residual_associatedtrack_primary"), jMcParticleFromTrack.pt(), (jMcParticleFromTrack.pt() - track.pt()) / jMcParticleFromTrack.pt(), eventWeight); + + if (std::find(seenMcParticlesVector.begin(), seenMcParticlesVector.end(), jMcParticleFromTrack.globalIndex()) != seenMcParticlesVector.end()) { + registry.fill(HIST("h3_track_pt_track_eta_track_phi_associatedtrack_split_primary"), track.pt(), track.eta(), track.phi(), eventWeight); + registry.fill(HIST("h3_particle_pt_particle_eta_particle_phi_associatedtrack_split_primary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), eventWeight); + + registry.fill(HIST("h3_track_pt_high_track_eta_track_phi_associatedtrack_split_primary"), track.pt(), track.eta(), track.phi(), eventWeight); + registry.fill(HIST("h3_particle_pt_high_particle_eta_particle_phi_associatedtrack_split_primary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), eventWeight); + } else { + seenMcParticlesVector.push_back(jMcParticleFromTrack.globalIndex()); + } + + if (std::abs(jMcParticleFromTrack.eta()) < trackEtaAcceptanceCountQA) { // not actually applied here but it will give an idea of what will be done in the post processing + registry.fill(HIST("hTrackCutsCounts"), 4.5); + } + } + } + } + PROCESS_SWITCH(TrackEfficiency, processEFficiencyPurityWeighted, "Histograms for efficiency and purity quantities for weighted simulations", false); void processTracks(soa::Filtered::iterator const& collision, soa::Filtered> const& tracks) @@ -413,13 +603,46 @@ struct TrackEfficiencyJets { } registry.fill(HIST("h_collisions"), 2.5); registry.fill(HIST("h2_centrality_collisions"), collision.centrality(), 2.5); + + fillTrackHistograms(collision, tracks); + } + PROCESS_SWITCH(TrackEfficiency, processTracks, "QA for charged tracks in data", false); + + void processTracksMc(soa::Join::iterator const& collision, + aod::JetMcCollisions const&, + soa::Filtered> const& tracks) + { + if (!collision.has_mcCollision()) { // the collision is fake and has no associated mc coll; skip as .mccollision() cannot be called + registry.fill(HIST("h_fakecollisions"), 0.5); + return; + } + registry.fill(HIST("h_collisions"), 0.5); + registry.fill(HIST("h2_centrality_collisions"), collision.centrality(), 0.5); + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { + return; + } + registry.fill(HIST("h_collisions"), 1.5); + registry.fill(HIST("h2_centrality_collisions"), collision.centrality(), 1.5); + if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { + return; + } + registry.fill(HIST("h_collisions"), 2.5); + registry.fill(HIST("h2_centrality_collisions"), collision.centrality(), 2.5); + + float pTHat = 10. / (std::pow(collision.mcCollision().weight(), 1.0 / pTHatExponent)); + if (pTHat < ptHatMin || pTHat > ptHatMax) { // only allows mcCollisions with weight in between min and max + return; + } + registry.fill(HIST("h_collisions"), 3.5); + registry.fill(HIST("h2_centrality_collisions"), collision.centrality(), 3.5); + fillTrackHistograms(collision, tracks); } - PROCESS_SWITCH(TrackEfficiencyJets, processTracks, "QA for charged tracks", false); + PROCESS_SWITCH(TrackEfficiency, processTracksMc, "QA for charged tracks in MC without weights", false); - void processTracksWeighted(soa::Join::iterator const& collision, - aod::JetMcCollisions const&, - soa::Filtered> const& tracks) + void processTracksMcWeighted(soa::Join::iterator const& collision, + aod::JetMcCollisions const&, + soa::Filtered> const& tracks) { if (!collision.has_mcCollision()) { // the collision is fake and has no associated mc coll; skip as .mccollision() cannot be called registry.fill(HIST("h_fakecollisions"), 0.5); @@ -438,9 +661,17 @@ struct TrackEfficiencyJets { } registry.fill(HIST("h_collisions"), 2.5); registry.fill(HIST("h_collisions_weighted"), 2.5, eventWeight); + + float pTHat = 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); + if (pTHat < ptHatMin || pTHat > ptHatMax) { // only allows mcCollisions with weight in between min and max + return; + } + registry.fill(HIST("h_collisions"), 3.5); + registry.fill(HIST("h2_centrality_collisions"), collision.centrality(), 3.5); + fillTrackHistograms(collision, tracks, eventWeight); } - PROCESS_SWITCH(TrackEfficiencyJets, processTracksWeighted, "QA for charged tracks weighted", false); + PROCESS_SWITCH(TrackEfficiency, processTracksMcWeighted, "QA for charged tracks in weighted MC", false); void processParticles(aod::JetMcCollision const& mcCollision, soa::SmallGroups const& collisions, @@ -449,27 +680,34 @@ struct TrackEfficiencyJets { registry.fill(HIST("h_mccollisions"), 0.5); registry.fill(HIST("h2_centrality_mccollisions"), collisions.begin().centrality(), 0.5); - if (!(abs(mcCollision.posZ()) < vertexZCut)) { + if (!(std::abs(mcCollision.posZ()) < vertexZCut)) { return; } if (collisions.size() < 1) { return; } - if (acceptSplitCollisions == 0 && collisions.size() > 1) { + if (acceptSplitCollisions == NonSplitOnly && collisions.size() > 1) { return; } + float pTHat = 10. / (std::pow(mcCollision.weight(), 1.0 / pTHatExponent)); + if (pTHat < ptHatMin || pTHat > ptHatMax) { // only allows mcCollisions with weight in between min and max + return; + } + registry.fill(HIST("h_mccollisions"), 1.5); + registry.fill(HIST("h2_centrality_mccollisions"), collisions.begin().centrality(), 1.5); + bool hasSel8Coll = false; bool centralityCheck = false; - if (acceptSplitCollisions == 2) { // check only that the first reconstructed collision passes the check + if (acceptSplitCollisions == SplitOkCheckFirstAssocCollOnly || acceptSplitCollisions == NonSplitOnly) { // check only that the first reconstructed collision passes the check (for the NonSplitOnly case, there's only one associated collision) if (jetderiveddatautilities::selectCollision(collisions.begin(), eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split hasSel8Coll = true; } if (!checkCentrality || ((centralityMin < collisions.begin().centrality()) && (collisions.begin().centrality() < centralityMax))) { // effect unclear if mcColl is split centralityCheck = true; } - } else { // check that at least one of the reconstructed collisions passes the checks - for (auto& collision : collisions) { + } else if (acceptSplitCollisions == SplitOkCheckAnyAssocColl) { // check that at least one of the reconstructed collisions passes the checks + for (auto const& collision : collisions) { if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split hasSel8Coll = true; } @@ -484,12 +722,12 @@ struct TrackEfficiencyJets { if (!centralityCheck) { return; } + registry.fill(HIST("h_mccollisions"), 2.5); + registry.fill(HIST("h2_centrality_mccollisions"), collisions.begin().centrality(), 2.5); - registry.fill(HIST("h_mccollisions"), 1.5); - registry.fill(HIST("h2_centrality_mccollisions"), collisions.begin().centrality(), 1.5); fillParticlesHistograms(collisions.begin(), mcparticles); } - PROCESS_SWITCH(TrackEfficiencyJets, processParticles, "QA for charged particles", false); + PROCESS_SWITCH(TrackEfficiency, processParticles, "QA for charged particles", false); void processParticlesWeighted(aod::JetMcCollision const& mcCollision, soa::SmallGroups const& collisions, @@ -503,27 +741,34 @@ struct TrackEfficiencyJets { registry.fill(HIST("h_mccollisions"), 0.5); registry.fill(HIST("h_mccollisions_weighted"), 0.5, eventWeight); - if (!(abs(mcCollision.posZ()) < vertexZCut)) { + if (!(std::abs(mcCollision.posZ()) < vertexZCut)) { return; } if (collisions.size() < 1) { return; } - if (acceptSplitCollisions == 0 && collisions.size() > 1) { + if (acceptSplitCollisions == NonSplitOnly && collisions.size() > 1) { return; } + float pTHat = 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); + if (pTHat < ptHatMin || pTHat > ptHatMax) { // only allows mcCollisions with weight in between min and max + return; + } + registry.fill(HIST("h_mccollisions"), 1.5); + registry.fill(HIST("h_mccollisions_weighted"), 1.5, eventWeight); + bool hasSel8Coll = false; bool centralityCheck = false; - if (acceptSplitCollisions == 2) { // check only that the first reconstructed collision passes the check + if (acceptSplitCollisions == SplitOkCheckFirstAssocCollOnly || acceptSplitCollisions == NonSplitOnly) { // check only that the first reconstructed collision passes the check (for the NonSplitOnly case, there's only one associated collision) if (jetderiveddatautilities::selectCollision(collisions.begin(), eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split hasSel8Coll = true; } if (!checkCentrality || ((centralityMin < collisions.begin().centrality()) && (collisions.begin().centrality() < centralityMax))) { // effect unclear if mcColl is split centralityCheck = true; } - } else { // check that at least one of the reconstructed collisions passes the checks - for (auto& collision : collisions) { + } else if (acceptSplitCollisions == SplitOkCheckAnyAssocColl) { // check that at least one of the reconstructed collisions passes the checks + for (auto const& collision : collisions) { if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split hasSel8Coll = true; } @@ -538,12 +783,15 @@ struct TrackEfficiencyJets { if (!centralityCheck) { return; } + registry.fill(HIST("h_mccollisions"), 2.5); + registry.fill(HIST("h_mccollisions_weighted"), 2.5, eventWeight); - registry.fill(HIST("h_mccollisions"), 1.5); - registry.fill(HIST("h_mccollisions_weighted"), 1.5, eventWeight); fillParticlesHistograms(collisions.begin(), mcparticles, eventWeight); } - PROCESS_SWITCH(TrackEfficiencyJets, processParticlesWeighted, "QA for charged particles weighted", false); + PROCESS_SWITCH(TrackEfficiency, processParticlesWeighted, "QA for charged particles weighted", false); }; -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc, TaskName{"track-efficiency"})}; } +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} From b8d4e04a7ea349016dc0c9bfe6e600af229a46ea Mon Sep 17 00:00:00 2001 From: Dongguk Kim <157434406+DonggukKim0@users.noreply.github.com> Date: Fri, 30 May 2025 19:13:22 +0900 Subject: [PATCH 1456/1650] [PWGJE] update dijetFinderQA.cxx (#11302) --- PWGJE/Tasks/dijetFinderQA.cxx | 216 ++++++++++++++++++++++++++-------- 1 file changed, 164 insertions(+), 52 deletions(-) diff --git a/PWGJE/Tasks/dijetFinderQA.cxx b/PWGJE/Tasks/dijetFinderQA.cxx index 0250a405537..d2697e614bf 100644 --- a/PWGJE/Tasks/dijetFinderQA.cxx +++ b/PWGJE/Tasks/dijetFinderQA.cxx @@ -52,6 +52,7 @@ struct DijetFinderQATask { Configurable centralityMax{"centralityMax", 999.0, "maximum centrality"}; Configurable eventSelections{"eventSelections", "sel8", "choose event selection"}; Configurable vertexZCut{"vertexZCut", 10.0f, "Accepted z-vertex range"}; + Configurable checkMcCollisionIsMatched{"checkMcCollisionIsMatched", false, "0: count whole MCcollisions, 1: select MCcollisions which only have their correspond collisions"}; Configurable trackSelections{"trackSelections", "globalTracks", "set track selections"}; Configurable trackPtMin{"trackPtMin", 0.15, "minimum pT acceptance for tracks"}; Configurable trackPtMax{"trackPtMax", 1000.0, "maximum pT acceptance for tracks"}; @@ -73,6 +74,28 @@ struct DijetFinderQATask { std::vector dijetMassBins; + void labelCollisionHistograms(HistogramRegistry& registry) + { + if (doprocessDijetMCP) { + auto hColCounter_MCP = registry.get(HIST("hColCounter_MCP")); + hColCounter_MCP->GetXaxis()->SetBinLabel(1, "AllMcCollisions"); + hColCounter_MCP->GetXaxis()->SetBinLabel(2, "McCollisionsWithVertexZ"); + hColCounter_MCP->GetXaxis()->SetBinLabel(3, "MatchedMcCollisions"); + } + if (doprocessDijetMCD) { + auto hColCounter_MCD = registry.get(HIST("hColCounter_MCD")); + hColCounter_MCD->GetXaxis()->SetBinLabel(1, "AllDetCollisions"); + hColCounter_MCD->GetXaxis()->SetBinLabel(2, "DetCollisionsWithVertexZ"); + hColCounter_MCD->GetXaxis()->SetBinLabel(3, "AcceptedDetCollisions"); + } + if (doprocessDijetData) { + auto hColCounter_Data = registry.get(HIST("hColCounter_Data")); + hColCounter_Data->GetXaxis()->SetBinLabel(1, "AllDataCollisions"); + hColCounter_Data->GetXaxis()->SetBinLabel(2, "DataCollisionsWithVertexZ"); + hColCounter_Data->GetXaxis()->SetBinLabel(3, "AcceptedDataCollisions"); + } + } + void init(o2::framework::InitContext&) { eventSelection = jetderiveddatautilities::initialiseEventSelectionBits(static_cast(eventSelections)); @@ -86,32 +109,33 @@ struct DijetFinderQATask { } AxisSpec dijetMassAxis = {dijetMassBins, "M_{jj} (GeV/#it{c}^2)"}; - AxisSpec eventCountAxis = {{0.5, 1.5}, "events"}; if (doprocessDijetMCP) { registry.add("h_part_dijet_mass", "Dijet invariant mass;;entries", {HistType::kTH1F, {dijetMassAxis}}); - registry.add("hColCounterFinal_MCP", "Event count;;entries", {HistType::kTH1F, {eventCountAxis}}); + registry.add("hColCounter_MCP", "event status; event status;entries", {HistType::kTH1F, {{10, 0., 10.0}}}); } if (doprocessDijetMCD) { registry.add("h_detec_dijet_mass", "Dijet invariant mass;;entries", {HistType::kTH1F, {dijetMassAxis}}); - registry.add("hColCounterFinal_MCD", "Event count;;entries", {HistType::kTH1F, {eventCountAxis}}); + registry.add("hColCounter_MCD", "event status; event status;entries", {HistType::kTH1F, {{10, 0., 10.0}}}); + // registry.add("hColCounter_MCD", "Event count;;entries", {HistType::kTH1F, {eventCountAxis}}); } if (doprocessDijetData) { registry.add("h_data_dijet_mass", "Dijet invariant mass;;entries", {HistType::kTH1F, {dijetMassAxis}}); - registry.add("hColCounterFinal_Data", "Event count;;entries", {HistType::kTH1F, {eventCountAxis}}); + registry.add("hColCounter_Data", "event status; event status;entries", {HistType::kTH1F, {{10, 0., 10.0}}}); + // registry.add("hColCounter_Data", "Event count;;entries", {HistType::kTH1F, {eventCountAxis}}); } - if (doprocessDijetMCMatched) { + if (doprocessDijetMCPMCDMatched) { registry.add("h_matched_dijet_mass", "M_{jj matched};M_{jj part}; M_{jj det}", {HistType::kTH2F, {dijetMassAxis, dijetMassAxis}}); } + + labelCollisionHistograms(registry); } /****************************************************************************************************************************************************************/ Filter trackCuts = (aod::jtrack::pt >= trackPtMin && aod::jtrack::pt < trackPtMax && aod::jtrack::eta > trackEtaMin && aod::jtrack::eta < trackEtaMax); - Filter eventCuts = (nabs(aod::jcollision::posZ) < vertexZCut && aod::jcollision::centrality >= centralityMin && aod::jcollision::centrality < centralityMax); - Filter mcCollisionsFilter = nabs(aod::jmccollision::posZ) < vertexZCut; Filter jetCuts = aod::jet::pt > jetPtMin&& aod::jet::r == nround(jetR.node() * 100.0f); /****************************************************************************************************************************************************************/ @@ -170,7 +194,7 @@ struct DijetFinderQATask { } template - void fillMassHistogramsMCMatched(T const& mass_P, T const& mass_D) + void fillMassHistogramsMCPMCDMatched(T const& mass_P, T const& mass_D) { registry.fill(HIST("h_matched_dijet_mass"), mass_P, mass_D); } @@ -180,25 +204,44 @@ struct DijetFinderQATask { } PROCESS_SWITCH(DijetFinderQATask, processDummy, "dummy", false); - void processDijetMCP(soa::Filtered::iterator const&, soa::Filtered const& jets, soa::SmallGroups const& collisions) + void processDijetMCP(aod::JetMcCollisions::iterator const& mccollision, + soa::Filtered> const& jets, + soa::SmallGroups const& collisions) { - if (collisions.size() == 0) { + registry.fill(HIST("hColCounter_MCP"), 0.5); + if (fabs(mccollision.posZ()) > vertexZCut) { return; } - for (auto& collision : collisions) { - if (fabs(collision.posZ()) > vertexZCut || !jetderiveddatautilities::selectCollision(collision, eventSelection)) + registry.fill(HIST("hColCounter_MCP"), 1.5); + if (checkMcCollisionIsMatched) { + if (collisions.size() == 0) { return; + } + for (auto& collision : collisions) { + if (fabs(collision.posZ()) > vertexZCut || !jetderiveddatautilities::selectCollision(collision, eventSelection)) { + return; + } + } + registry.fill(HIST("hColCounter_MCP"), 2.5); } - registry.fill(HIST("hColCounterFinal_MCP"), 1); - std::vector> jetPtcuts; for (auto& jet : jets) { + if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + if (!isAcceptedJet(jet)) { + continue; + } + if (jet.pt() < setJetPtCut) { + continue; + } jetPtcuts.push_back({jet.pt(), jet.eta(), jet.phi()}); } if (jetPtcuts.size() >= 2) { auto& leading_jet = jetPtcuts[0]; + bool found_pair = false; for (size_t i = 1; i < jetPtcuts.size() && !found_pair; i++) { @@ -219,21 +262,36 @@ struct DijetFinderQATask { } PROCESS_SWITCH(DijetFinderQATask, processDijetMCP, "QA for invariant mass of dijet in particle level MC", false); - void processDijetMCD(soa::Filtered::iterator const& collision, soa::Filtered const& jets) + void processDijetMCD(aod::JetCollisions::iterator const& collision, + soa::Filtered> const& jets) { + registry.fill(HIST("hColCounter_MCD"), 0.5); + if (fabs(collision.posZ()) > vertexZCut) { + return; + } + registry.fill(HIST("hColCounter_MCD"), 1.5); if (!jetderiveddatautilities::selectCollision(collision, eventSelection)) { return; } - - registry.fill(HIST("hColCounterFinal_MCD"), 1); + registry.fill(HIST("hColCounter_MCD"), 2.5); std::vector> jetPtcuts; for (auto& jet : jets) { + if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + if (!isAcceptedJet(jet)) { + continue; + } + if (jet.pt() < setJetPtCut) { + continue; + } jetPtcuts.push_back({jet.pt(), jet.eta(), jet.phi()}); } if (jetPtcuts.size() >= 2) { auto& leading_jet = jetPtcuts[0]; + bool found_pair = false; for (size_t i = 1; i < jetPtcuts.size() && !found_pair; i++) { @@ -254,22 +312,36 @@ struct DijetFinderQATask { } PROCESS_SWITCH(DijetFinderQATask, processDijetMCD, "QA for invariant mass of dijet in detector level MC", false); - void processDijetData(soa::Filtered::iterator const& collision, soa::Filtered const& jets) + void processDijetData(aod::JetCollisions::iterator const& collision, + soa::Filtered> const& jets) { + registry.fill(HIST("hColCounter_Data"), 0.5); + if (fabs(collision.posZ()) > vertexZCut) { + return; + } + registry.fill(HIST("hColCounter_Data"), 1.5); if (!jetderiveddatautilities::selectCollision(collision, eventSelection)) { return; } - - // Fill event count histogram - registry.fill(HIST("hColCounterFinal_Data"), 1); + registry.fill(HIST("hColCounter_Data"), 2.5); std::vector> jetPtcuts; for (auto& jet : jets) { + if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + if (!isAcceptedJet(jet)) { + continue; + } + if (jet.pt() < setJetPtCut) { + continue; + } jetPtcuts.push_back({jet.pt(), jet.eta(), jet.phi()}); } if (jetPtcuts.size() >= 2) { auto& leading_jet = jetPtcuts[0]; + bool found_pair = false; for (size_t i = 1; i < jetPtcuts.size() && !found_pair; i++) { @@ -290,11 +362,22 @@ struct DijetFinderQATask { } PROCESS_SWITCH(DijetFinderQATask, processDijetData, "QA for invariant mass of dijet in data", false); - using JetMCPTable = soa::Filtered>; - void processDijetMCMatched(soa::Filtered::iterator const& collision, - soa::Filtered> const& mcdjets, - JetMCPTable const&, aod::JetTracks const&, aod::JetParticles const&) + using JetMCPTable = soa::Filtered>; + using JetMCDTable = soa::Filtered>; + + void processDijetMCPMCDMatched(aod::JetCollisionsMCD::iterator const& collision, + JetMCDTable const& mcdjets, + JetMCPTable const&, + aod::JetTracks const&, + aod::JetParticles const&) { + if (fabs(collision.posZ()) > vertexZCut) { + return; + } if (!jetderiveddatautilities::selectCollision(collision, eventSelection)) { return; } @@ -302,14 +385,29 @@ struct DijetFinderQATask { std::vector> jetPtcuts_D; std::vector> jetPtcuts_P; - for (auto& jet : mcdjets) { - if (jet.has_matchedJetGeo()) { - for (auto& matchedJet : jet.template matchedJetPt_as()) { - if (matchedJet.pt() > setJetPtCut) { - jetPtcuts_D.push_back({jet.pt(), jet.eta(), jet.phi()}); - jetPtcuts_P.push_back({matchedJet.pt(), matchedJet.eta(), matchedJet.phi()}); - break; + for (auto& mcdjet : mcdjets) { + if (!jetfindingutilities::isInEtaAcceptance(mcdjet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + if (!isAcceptedJet(mcdjet)) { + continue; + } + if (mcdjet.pt() < setJetPtCut) { + continue; + } + if (mcdjet.has_matchedJetGeo()) { + for (auto& matchedjet : mcdjet.template matchedJetPt_as()) { + if (matchedjet.pt() < setJetPtCut) { + continue; + } + if (!jetfindingutilities::isInEtaAcceptance(matchedjet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + if (!isAcceptedJet(matchedjet)) { + continue; } + jetPtcuts_D.push_back({mcdjet.pt(), mcdjet.eta(), mcdjet.phi()}); + jetPtcuts_P.push_back({matchedjet.pt(), matchedjet.eta(), matchedjet.phi()}); } } } @@ -317,34 +415,48 @@ struct DijetFinderQATask { if (jetPtcuts_D.size() >= 2 && jetPtcuts_P.size() >= 2) { auto& leading_jet_D = jetPtcuts_D[0]; auto& leading_jet_P = jetPtcuts_P[0]; - bool found_pair = false; - for (size_t i = 1; i < jetPtcuts_D.size() && !found_pair; i++) { - auto& candidate_jet_D = jetPtcuts_D[i]; - auto& candidate_jet_P = jetPtcuts_P[i]; + std::array candidate_jet_D{}; + std::array candidate_jet_P{}; - Double_t dphi_D = fabs(leading_jet_D[2] - candidate_jet_D[2]); - Double_t deta_D = fabs(leading_jet_D[1] - candidate_jet_D[1]); - Double_t dphi_P = fabs(leading_jet_P[2] - candidate_jet_P[2]); - Double_t deta_P = fabs(leading_jet_P[1] - candidate_jet_P[1]); - Double_t condition = fabs(dphi_D - M_PI); + auto dphi_D = 0.; + auto dphi_P = 0.; - if (condition < setPhiCut * M_PI) { - double pt1_D = leading_jet_D[0]; - double pt2_D = candidate_jet_D[0]; - double dijet_mass_D = sqrt(2 * pt1_D * pt2_D * (cosh(deta_D) - cos(dphi_D))); - - double pt1_P = leading_jet_P[0]; - double pt2_P = candidate_jet_P[0]; - double dijet_mass_P = sqrt(2 * pt1_P * pt2_P * (cosh(deta_P) - cos(dphi_P))); + bool found_pair_MCD = false; + bool found_pair_MCP = false; - fillMassHistogramsMCMatched(dijet_mass_P, dijet_mass_D); - found_pair = true; + for (size_t i = 1; i < jetPtcuts_D.size() && !found_pair_MCD; i++) { + candidate_jet_D = jetPtcuts_D[i]; + dphi_D = fabs(leading_jet_D[2] - candidate_jet_D[2]); + Double_t condition = fabs(dphi_D - M_PI); + if (condition > setPhiCut * M_PI) { + continue; + } + found_pair_MCD = true; + } + for (size_t i = 1; i < jetPtcuts_P.size() && !found_pair_MCP; i++) { + candidate_jet_P = jetPtcuts_P[i]; + dphi_P = fabs(leading_jet_P[2] - candidate_jet_P[2]); + Double_t condition = fabs(dphi_P - M_PI); + if (condition > setPhiCut * M_PI) { + continue; } + found_pair_MCP = true; + } + if (found_pair_MCD && found_pair_MCP) { + Double_t deta_D = fabs(leading_jet_D[1] - candidate_jet_D[1]); + Double_t deta_P = fabs(leading_jet_P[1] - candidate_jet_P[1]); + double pt1_D = leading_jet_D[0]; + double pt2_D = candidate_jet_D[0]; + double pt1_P = leading_jet_P[0]; + double pt2_P = candidate_jet_P[0]; + double dijet_mass_D = sqrt(2 * pt1_D * pt2_D * (cosh(deta_D) - cos(dphi_D))); + double dijet_mass_P = sqrt(2 * pt1_P * pt2_P * (cosh(deta_P) - cos(dphi_P))); + fillMassHistogramsMCPMCDMatched(dijet_mass_P, dijet_mass_D); } } } - PROCESS_SWITCH(DijetFinderQATask, processDijetMCMatched, "QA for invariant mass of dijet in mcmactched", false); + PROCESS_SWITCH(DijetFinderQATask, processDijetMCPMCDMatched, "QA for invariant mass of dijet in mcmactched", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 882526f9bea8fa93620c12f35643d40bc1fbd21a Mon Sep 17 00:00:00 2001 From: hernasab Date: Fri, 30 May 2025 05:24:49 -0500 Subject: [PATCH 1457/1650] [PWGCF] added new histos (#11383) Co-authored-by: Sabrina Hernandez --- PWGCF/Flow/Tasks/flowZdcTask.cxx | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowZdcTask.cxx b/PWGCF/Flow/Tasks/flowZdcTask.cxx index 5ae64c9ff39..3bad6691449 100644 --- a/PWGCF/Flow/Tasks/flowZdcTask.cxx +++ b/PWGCF/Flow/Tasks/flowZdcTask.cxx @@ -322,6 +322,7 @@ struct FlowZdcTask { histos.add("ZEM2Vstdc", ";t_{ZEM2};ZEM2;", kTH2F, {{{30, -15., 15.}, {30, -0.5, 2000.5}}}); histos.add("debunch", ";t_{ZDC}-t_{ZDA};t_{ZDC}+t_{ZDA}", kTH2F, {{{nBinsTDC, minTdc, maxTdc}, {nBinsTDC, minTdc, maxTdc}}}); + histos.add("Nch", "Nch", kTH1F, {{nBinsNch, minNch, maxNch}}); histos.add("NchVsFT0C", ";T0C (#times 1/100, -3.3 < #eta < -2.1);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFT0, 0., 950.}, {nBinsNch, minNch, maxNch}}}); histos.add("NchVsFT0M", ";T0A+T0C (#times 1/100, -3.3 < #eta < -2.1 and 3.5 < #eta < 4.9);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFT0, 0., 3000.}, {nBinsNch, minNch, maxNch}}}); histos.add("NchVsFT0A", ";T0A (#times 1/100, 3.5 < #eta < 4.9);#it{N}_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsNch, minNch, maxNch}}}); @@ -501,28 +502,28 @@ struct FlowZdcTask { } // Track Selection if (track.isGlobalTrack()) { - glbTracks++; - meanpt += track.pt(); - et += std::sqrt(std::pow(track.pt(), 2.) + std::pow(o2::constants::physics::MassPionCharged, 2.)); + continue; } + glbTracks++; } histos.fill(HIST("zPos"), collision.posZ()); histos.fill(HIST("T0Ccent"), collision.centFT0C()); - histos.fill(HIST("ZNCcvsZNCsum"), sumZNC / 2.81, zdc.energyCommonZNC() / 2.81); - histos.fill(HIST("ZNAcvsZNAsum"), sumZNA / 2.81, zdc.energyCommonZNA() / 2.81); - histos.fill(HIST("ZPCcvsZPCsum"), sumZPC / 2.81, zdc.energyCommonZPC() / 2.81); - histos.fill(HIST("ZPAcvsZPAsum"), sumZPA / 2.81, zdc.energyCommonZPA() / 2.81); + histos.fill(HIST("ZNCcvsZNCsum"), sumZNC / cfgCollisionEnergy, zdc.energyCommonZNC() / cfgCollisionEnergy); + histos.fill(HIST("ZNAcvsZNAsum"), sumZNA / cfgCollisionEnergy, zdc.energyCommonZNA() / cfgCollisionEnergy); + histos.fill(HIST("ZPCcvsZPCsum"), sumZPC / cfgCollisionEnergy, zdc.energyCommonZPC() / cfgCollisionEnergy); + histos.fill(HIST("ZPAcvsZPAsum"), sumZPA / cfgCollisionEnergy, zdc.energyCommonZPA() / cfgCollisionEnergy); + histos.fill(HIST("Nch"), glbTracks); histos.fill(HIST("ZNA"), znA); histos.fill(HIST("ZNC"), znC); histos.fill(HIST("ZPA"), zpA); histos.fill(HIST("ZPC"), zpC); - histos.fill(HIST("ZNASector"), sumZNA); - histos.fill(HIST("ZNCSector"), sumZNC); - histos.fill(HIST("ZPASector"), sumZPA); - histos.fill(HIST("ZPCSector"), sumZPC); + histos.fill(HIST("ZNASector"), sumZNA / cfgCollisionEnergy); + histos.fill(HIST("ZNCSector"), sumZNC / cfgCollisionEnergy); + histos.fill(HIST("ZPASector"), sumZPA / cfgCollisionEnergy); + histos.fill(HIST("ZPCSector"), sumZPC / cfgCollisionEnergy); histos.fill(HIST("ZN"), znA + znC); histos.fill(HIST("ZNAVsZNC"), znC, znA); histos.fill(HIST("ZNAVsZPA"), zpA, znA); From f71f17246dcd092801c3cd43224e58c17a4ef0c5 Mon Sep 17 00:00:00 2001 From: mherzer <96999709+mherzer28@users.noreply.github.com> Date: Fri, 30 May 2025 12:49:27 +0200 Subject: [PATCH 1458/1650] [PWGLF] mass and bethe bloch calculation (#11385) --- PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx | 61 ++++++++++++++------- 1 file changed, 41 insertions(+), 20 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx b/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx index e3c2dd88225..a33295b6021 100644 --- a/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx +++ b/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx @@ -110,13 +110,14 @@ static const std::vector particlePdgCodes{ static const std::vector particleMasses{ o2::constants::physics::MassTriton, o2::constants::physics::MassHelium3}; static const std::vector particleCharge{1, 2}; +static const std::vector particleChargeFactor{2.3, 2.55}; static const std::vector betheBlochParNames{ "p0", "p1", "p2", "p3", "p4", "resolution"}; constexpr float betheBlochDefault[nParticles][nBetheParams]{ - {0.313129, 181.664226, 2779397163087.684082, 2.130773, 29.609643, - 0.09}, // triton - {70.584685, 3.196364, 0.133878, 2.731736, 1.675617, 0.09}}; // Helion - + {0.248753, 3.58634, 0.0167065, 2.29194, 0.774344, + 0.07}, // triton + {0.0274556, 18.3054, 3.99987e-05, 3.17219, 11.1775, + 0.07}}; // Helion } // namespace using namespace o2; using namespace o2::framework; @@ -135,16 +136,18 @@ class Particle float mass; int charge; float resolution; + float chargeFactor; std::vector betheParams; static constexpr int NNumBetheParams = 5; Particle(const std::string name_, int pdgCode_, float mass_, int charge_, - LabeledArray bethe) + LabeledArray bethe, float chargeFactor_) { name = TString(name_); pdgCode = pdgCode_; mass = mass_; charge = charge_; + chargeFactor = chargeFactor_; resolution = bethe.get(name, "resolution"); // Access the "resolution" parameter @@ -213,7 +216,7 @@ struct TrHeAnalysis { Configurable cfgCutMaxTofMassH3{"cfgCutMaxTofMassH3", 3.32f, "Maximum TOF mass H3"}; // Set the kinematic and PID cuts for tracks struct : ConfigurableGroup { - Configurable pCut{"pCut", 0.3f, "Value of the p selection for spectra (default 0.3)"}; + Configurable pCut{"pCut", 0.6f, "Value of the p selection for spectra (default 0.3)"}; Configurable etaCut{"etaCut", 0.8f, "Value of the eta selection for spectra (default 0.8)"}; Configurable yLowCut{"yLowCut", -1.0f, "Value of the low rapidity selection for spectra (default -1.0)"}; Configurable yHighCut{"yHighCut", 1.0f, "Value of the high rapidity selection for spectra (default 1.0)"}; @@ -294,7 +297,7 @@ struct TrHeAnalysis { for (int i = 0; i < nParticles; i++) { particles.push_back(Particle(particleNames.at(i), particlePdgCodes.at(i), particleMasses.at(i), particleCharge.at(i), - cfgBetheBlochParams)); + cfgBetheBlochParams, particleChargeFactor.at(i))); } } void process(soa::Join::iterator const& event, @@ -387,7 +390,7 @@ struct TrHeAnalysis { histos.fill(HIST("histogram/cuts"), 12); continue; } - if (track.mass() < cfgCutMinTofMassH3 || track.mass() > cfgCutMaxTofMassH3) { + if (getMass(track) < cfgCutMinTofMassH3 || getMass(track) > cfgCutMaxTofMassH3) { histos.fill(HIST("histogram/cuts"), 13); continue; } @@ -402,8 +405,8 @@ struct TrHeAnalysis { float tPhi = track.phi(); int8_t tCharge = track.sign(); float tH3DeDx = track.tpcSignal(); - float tnSigmaTpc = track.tpcNSigmaTr(); - float tTofSignalH3 = track.mass(); + float tnSigmaTpc = getTPCnSigma(track, particles.at(0)); + float tTofSignalH3 = getMass(track); float tDcaXY = track.dcaXY(); float tDcaZ = track.dcaZ(); float tSigmaYX = track.sigmaY(); @@ -449,8 +452,8 @@ struct TrHeAnalysis { float tPhi = track.phi(); int8_t tCharge = 2.f * track.sign(); float tHeDeDx = track.tpcSignal(); - float tnSigmaTpc = track.tpcNSigmaHe(); - float tTofSignalHe = track.mass(); + float tnSigmaTpc = getTPCnSigma(track, particles.at(1)); + float tTofSignalHe = getMass(track); float tDcaXY = track.dcaXY(); float tDcaZ = track.dcaZ(); float tSigmaYX = track.sigmaY(); @@ -542,7 +545,7 @@ struct TrHeAnalysis { histos.fill(HIST("histogram/cuts"), 12); continue; } - if (track.mass() < cfgCutMinTofMassH3 || track.mass() > cfgCutMaxTofMassH3) { + if (getMass(track) < cfgCutMinTofMassH3 || getMass(track) > cfgCutMaxTofMassH3) { histos.fill(HIST("histogram/cuts"), 13); continue; } @@ -558,7 +561,7 @@ struct TrHeAnalysis { int8_t tCharge = track.sign(); float tH3DeDx = track.tpcSignal(); float tnSigmaTpc = track.tpcNSigmaTr(); - float tTofSignalH3 = track.mass(); + float tTofSignalH3 = getMass(track); float tDcaXY = track.dcaXY(); float tDcaZ = track.dcaZ(); float tSigmaYX = track.sigmaY(); @@ -604,7 +607,7 @@ struct TrHeAnalysis { int8_t tCharge = 2.f * track.sign(); float tHeDeDx = track.tpcSignal(); float tnSigmaTpc = track.tpcNSigmaHe(); - float tTofSignalHe = track.mass(); + float tTofSignalHe = getMass(track); float tDcaXY = track.dcaXY(); float tDcaZ = track.dcaZ(); float tSigmaYX = track.sigmaY(); @@ -634,17 +637,26 @@ struct TrHeAnalysis { if (!track.hasTPC()) return -999; - float expBethe{tpc::BetheBlochAleph( - static_cast(particle.charge * rigidity / particle.mass), - particle.betheParams[0], particle.betheParams[1], - particle.betheParams[2], particle.betheParams[3], - particle.betheParams[4])}; + float expBethe{betheBlochAleph(particle, rigidity)}; float expSigma{expBethe * particle.resolution}; float sigmaTPC = static_cast((track.tpcSignal() - expBethe) / expSigma); return sigmaTPC; } + template + float betheBlochAleph(Particle const& particle, T const& rigidity) + { + double bg = particle.charge * rigidity / particle.mass; + double beta = bg / std::sqrt(1. + bg * bg); + double aa = std::pow(beta, particle.betheParams[3]); + double bb = std::pow(1. / bg, particle.betheParams[4]); + if ((particle.betheParams[2] + bb) <= 0) + return 0; + bb = std::log(particle.betheParams[2] + bb); + return std::pow(particle.charge, particle.chargeFactor) * 50 * (particle.betheParams[1] - aa - bb) * particle.betheParams[0] / aa; + } + template float getMeanItsClsSize(T const& track) { @@ -668,6 +680,15 @@ struct TrHeAnalysis { bool hePID = track.pidForTracking() == o2::track::PID::Helium3 || track.pidForTracking() == o2::track::PID::Alpha; return hePID ? track.tpcInnerParam() / 2 : track.tpcInnerParam(); } + template + float getMass(T const& track) + { + const float beta = track.beta(); + const float rigidity = getRigidity(track); + float gamma = 1 / std::sqrt(1 - beta * beta); + float mass = (rigidity / std::sqrt(gamma * gamma - 1)); + return mass; + } }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 32588722368c8722f64e8b342c34f4c7a6e7e60b Mon Sep 17 00:00:00 2001 From: Ionut Cristian Arsene Date: Fri, 30 May 2025 13:13:57 +0200 Subject: [PATCH 1459/1650] [PWGDQ] Small updated of the DQ filter dielectron cuts (#11389) Co-authored-by: Ionut Cristian Arsene --- PWGDQ/Core/CutsLibrary.cxx | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/PWGDQ/Core/CutsLibrary.cxx b/PWGDQ/Core/CutsLibrary.cxx index 03d978bcb22..bf4a0025ba3 100644 --- a/PWGDQ/Core/CutsLibrary.cxx +++ b/PWGDQ/Core/CutsLibrary.cxx @@ -59,8 +59,8 @@ AnalysisCompositeCut* o2::aod::dqcuts::GetCompositeCut(const char* cutName) AnalysisCut* qualityCuts = new AnalysisCut("qualityCuts", "quality cuts"); qualityCuts->AddCut(VarManager::kIsITSibAny, 0.5, 1.5); - qualityCuts->AddCut(VarManager::kTPCchi2, 0.0, 5.0); - qualityCuts->AddCut(VarManager::kTPCncls, 60, 161.); + qualityCuts->AddCut(VarManager::kTPCchi2, 0.0, 4.0); + qualityCuts->AddCut(VarManager::kTPCncls, 70, 161.); qualityCuts->AddCut(VarManager::kTrackDCAz, -0.5, 0.5); AnalysisCut* pidCuts = new AnalysisCut("pidCuts", "pid cuts"); @@ -82,8 +82,8 @@ AnalysisCompositeCut* o2::aod::dqcuts::GetCompositeCut(const char* cutName) AnalysisCut* qualityCuts = new AnalysisCut("qualityCuts", "quality cuts"); qualityCuts->AddCut(VarManager::kIsITSibAny, 0.5, 1.5); - qualityCuts->AddCut(VarManager::kTPCchi2, 0.0, 5.0); - qualityCuts->AddCut(VarManager::kTPCncls, 60, 161.); + qualityCuts->AddCut(VarManager::kTPCchi2, 0.0, 4.0); + qualityCuts->AddCut(VarManager::kTPCncls, 70, 161.); qualityCuts->AddCut(VarManager::kTrackDCAz, -0.5, 0.5); AnalysisCut* pidCuts = new AnalysisCut("pidCuts", "pid cuts"); @@ -105,8 +105,8 @@ AnalysisCompositeCut* o2::aod::dqcuts::GetCompositeCut(const char* cutName) AnalysisCut* qualityCuts = new AnalysisCut("qualityCuts", "quality cuts"); qualityCuts->AddCut(VarManager::kIsITSibAny, 0.5, 1.5); - qualityCuts->AddCut(VarManager::kTPCchi2, 0.0, 5.0); - qualityCuts->AddCut(VarManager::kTPCncls, 60, 161.); + qualityCuts->AddCut(VarManager::kTPCchi2, 0.0, 4.0); + qualityCuts->AddCut(VarManager::kTPCncls, 70, 161.); qualityCuts->AddCut(VarManager::kTrackDCAz, -0.5, 0.5); AnalysisCut* pidCuts = new AnalysisCut("pidCuts", "pid cuts"); @@ -127,8 +127,8 @@ AnalysisCompositeCut* o2::aod::dqcuts::GetCompositeCut(const char* cutName) AnalysisCut* qualityCuts = new AnalysisCut("qualityCuts", "quality cuts"); qualityCuts->AddCut(VarManager::kIsITSibAny, 0.5, 1.5); - qualityCuts->AddCut(VarManager::kTPCchi2, 0.0, 5.0); - qualityCuts->AddCut(VarManager::kTPCncls, 60, 161.); + qualityCuts->AddCut(VarManager::kTPCchi2, 0.0, 4.0); + qualityCuts->AddCut(VarManager::kTPCncls, 70, 161.); qualityCuts->AddCut(VarManager::kTrackDCAz, -0.5, 0.5); AnalysisCut* pidCuts = new AnalysisCut("pidCuts", "pid cuts"); @@ -150,8 +150,8 @@ AnalysisCompositeCut* o2::aod::dqcuts::GetCompositeCut(const char* cutName) AnalysisCut* qualityCuts = new AnalysisCut("qualityCuts", "quality cuts"); qualityCuts->AddCut(VarManager::kIsITSibAny, 0.5, 1.5); - qualityCuts->AddCut(VarManager::kTPCchi2, 0.0, 5.0); - qualityCuts->AddCut(VarManager::kTPCncls, 60, 161.); + qualityCuts->AddCut(VarManager::kTPCchi2, 0.0, 4.0); + qualityCuts->AddCut(VarManager::kTPCncls, 70, 161.); qualityCuts->AddCut(VarManager::kTrackDCAz, -0.5, 0.5); AnalysisCut* pidCuts = new AnalysisCut("pidCuts", "pid cuts"); From f95dbd6cad5562e012c2c5c8a6ad105cbc107112 Mon Sep 17 00:00:00 2001 From: Peter Stratmann <80676312+pestratm@users.noreply.github.com> Date: Fri, 30 May 2025 13:38:15 +0200 Subject: [PATCH 1460/1650] [PWGJE] Modify cuts for mother hadrons and decay photons (#11116) --- PWGJE/Tasks/hadronPhotonCorrelation.cxx | 275 ++++++++++++++++-------- 1 file changed, 182 insertions(+), 93 deletions(-) diff --git a/PWGJE/Tasks/hadronPhotonCorrelation.cxx b/PWGJE/Tasks/hadronPhotonCorrelation.cxx index 4681a8d586f..70850130b5c 100644 --- a/PWGJE/Tasks/hadronPhotonCorrelation.cxx +++ b/PWGJE/Tasks/hadronPhotonCorrelation.cxx @@ -63,13 +63,21 @@ struct HadronPhotonCorrelation { Configurable eventSelections{"eventSelections", "sel8", "choose event selection"}; Configurable trackSelections{"trackSelections", "globalTracks", "set track selections"}; + Configurable subGeneratorIdSelections{"subGeneratorIdSelections", -1, "set sub generator id"}; - Configurable etaMax{"etaMax", 0.8, "maximum eta cut"}; + Configurable tpcNClsCrossedRows{"tpcNClsCrossedRows", 70, "tpcNClsCrossedRows"}; + Configurable tpcCrossedRowsOverFindableCls{"tpcCrossedRowsOverFindableCls", 0.8, "tpcCrossedRowsOverFindableCls"}; + Configurable tpcNSigmaPi{"tpcNSigmaPi", 2., "tpcNSigmaPi"}; - AxisSpec axisPhi = {72, 0., TwoPI, "#phi"}; // Axis for phi distribution - AxisSpec axisDeltaPhi = {72, -PIHalf, 3 * PIHalf, "#Delta #phi"}; // Axis for Delta phi in correlations - AxisSpec axisEta = {40, -.8, .8, "#eta"}; // Axis for eta distribution - AxisSpec axisDeltaEta = {80, -1.6, 1.6, "#Delta #eta"}; // Axis for Delta eta in correlations + const int pidCodeHadronCut = 100; + + Configurable etaMaxTrig{"etaMaxTrig", 0.8, "maximum eta cut for triggers"}; + Configurable etaMaxAssoc{"etaMaxAssoc", 0.8, "maximum eta cut for associateds"}; + Configurable etaBinsTrig{"etaBinsTrig", 40, "number of eta bins for triggers"}; + Configurable etaBinsAssoc{"etaBinsAssoc", 40, "number of eta bins for associateds"}; + Configurable phiBins{"phiBins", 72, "number of phi bins"}; + + AxisSpec axisEventStats = {3, -.5, 2.5, "Stats"}; ConfigurableAxis axisPtTrig = {"axisPtTrig", {VARIABLE_WIDTH, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 9.0f, 11.0f, 15.0f, 20.0f}, @@ -77,13 +85,12 @@ struct HadronPhotonCorrelation { ConfigurableAxis axisPtAssoc = {"axisPtAssoc", {VARIABLE_WIDTH, 0.2, 0.5, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 9.0f, 11.0f, 15.0f}, - "p_{T, assoc} [GeV]"}; // Axis for associated particle pt distribution - AxisSpec axisDeltaPt = {200, 0., 1.2, "#Delta p_T"}; // Axis for pt ratio between neutral hadrons and decay photons - AxisSpec axisPid = {9, -3.5, 5.5, "pid"}; // Axis for PID of neutral hadrons - AxisSpec axisMult = {100, 0., 99., "N_{ch}"}; // Axis for mutplipicity - AxisSpec axisAlpha = {100, 0., 1., "alpha"}; // Axis for decay photon pt assymetry - - AxisSpec axisDeltaRDecay = {100, 0., 0.8, "#Delta R"}; // Axis for Delta R = sqrt(Delta eta^2 + Delta phi^2) between neutral hadrons and decay photons + "p_{T, assoc} [GeV]"}; // Axis for associated particle pt distribution + ConfigurableAxis axisDeltaPt = {"axisDeltaPt", {200, 0., 1.2}, "#Delta p_T"}; // Axis for pt ratio between neutral hadrons and decay photons + AxisSpec axisPid = {10, -3.5, 6.5, "pid"}; // Axis for PID of neutral hadrons + ConfigurableAxis axisMult = {"axisMult", {100, 0., 99.}, "N_{ch}"}; // Axis for mutplipicity + AxisSpec axisAlpha = {100, 0., 1., "alpha"}; // Axis for decay photon pt assymetry + ConfigurableAxis axisDeltaRDecay = {"axisDeltaRDecay", {400, 0., 3.2}, "#Delta R"}; // Axis for Delta R = sqrt(Delta eta^2 + Delta phi^2) between neutral hadrons and decay photons float ptMinTrig; float ptMaxTrig; @@ -98,7 +105,9 @@ struct HadronPhotonCorrelation { {"eta", 2}, // eta {"eta'", 3}, // eta' {"phi", 4}, // phi - {"omega", 5}}; // omega + {"omega", 5}, // omega + {"Sigma0", 6}, // Sigma + {"Sigma0_bar", 6}}; Service pdg; @@ -112,56 +121,66 @@ struct HadronPhotonCorrelation { ptMinAssoc = axisPtAssoc->at(1); ptMaxAssoc = axisPtAssoc->back(); + AxisSpec axisPhi = {phiBins, 0., TwoPI, "#phi"}; // Axis for phi distribution + AxisSpec axisDeltaPhi = {phiBins, -PIHalf, 3 * PIHalf, "#Delta #phi"}; // Axis for Delta phi in correlations + AxisSpec axisEtaTrig = {etaBinsTrig, -etaMaxTrig, etaMaxTrig, "#eta"}; // Axis for eta distribution + AxisSpec axisEtaAssoc = {etaBinsAssoc, -etaMaxAssoc, etaMaxAssoc, "#eta"}; // Axis for eta distribution + AxisSpec axisDeltaEta = {etaBinsTrig + etaBinsAssoc, -(etaMaxTrig + etaMaxAssoc), etaMaxTrig + etaMaxAssoc, "#Delta #eta"}; // Axis for Delta eta in correlations + eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast(eventSelections)); trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast(trackSelections)); // Generated histograms + registry.add("generated/events/hEventStats", "Event statistics", kTH1F, {axisEventStats}); + // Triggers registry.add("generated/triggers/hTrigMultGen", "Generated Trigger Multiplicity", kTH1F, {axisMult}); - registry.add("generated/triggers/hTrigSpectrumGen", "Generated Trigger Spectrum", kTHnSparseF, {axisPtTrig, axisEta, axisPhi}); + registry.add("generated/triggers/hTrigSpectrumGen", "Generated Trigger Spectrum", kTHnSparseF, {axisPtTrig, axisEtaTrig, axisPhi}); // Hadrons registry.add("generated/hadrons/hHadronCorrelGen", "Generated Trigger-Hadron Correlation", kTHnSparseF, {axisPtTrig, axisPtAssoc, axisDeltaEta, axisDeltaPhi}); registry.add("generated/hadrons/hHadronMultGen", "Generated Hadron Multiplicity", kTH1F, {axisMult}); - registry.add("generated/hadrons/hHadronSpectrumGen", "Generated Hadron Spectrum", kTHnSparseF, {axisPtAssoc, axisEta, axisPhi}); + registry.add("generated/hadrons/hHadronSpectrumGen", "Generated Hadron Spectrum", kTHnSparseF, {axisPtAssoc, axisEtaAssoc, axisPhi}); // Photons registry.add("generated/photons/hPhotonCorrelGen", "Generated Trigger-Photon Correlation", kTHnSparseF, {axisPtTrig, axisPtAssoc, axisDeltaEta, axisDeltaPhi, axisPid}); registry.add("generated/photons/hPhotonMultGen", "Generated Photon Multiplicity", kTH1F, {axisMult}); - registry.add("generated/photons/hPhotonSpectrumGen", "Generated Photon Spectrum", kTHnSparseF, {axisPtAssoc, axisEta, axisPhi, axisPid}); + registry.add("generated/photons/hPhotonSpectrumGen", "Generated Photon Spectrum", kTHnSparseF, {axisPtAssoc, axisEtaAssoc, axisPhi, axisPid}); // Charged pions registry.add("generated/charged/hPionCorrelGen", "Generated Trigger-Pion Correlation", kTHnSparseF, {axisPtTrig, axisPtAssoc, axisDeltaEta, axisDeltaPhi}); registry.add("generated/charged/hPionMultGen", "Generated Pion Multiplicity", kTH1F, {axisMult}); - registry.add("generated/charged/hPionSpectrumGen", "Generated Pion Spectrum", kTHnSparseF, {axisPtAssoc, axisEta, axisPhi}); + registry.add("generated/charged/hPionSpectrumGen", "Generated Pion Spectrum", kTHnSparseF, {axisPtAssoc, axisEtaAssoc, axisPhi}); ////Neutral particles registry.add("generated/neutral/hNeutralCorrelGen", "Generated Trigger-Neutral Hadron Correlation", kTHnSparseF, {axisPtTrig, axisPtAssoc, axisDeltaEta, axisDeltaPhi, axisPid}); registry.add("generated/neutral/hNeutralMultGen", "Generated Neutral Hadron Multiplicity", kTH1F, {axisMult}); - registry.add("generated/neutral/hNeutralSpectrumGen", "Generated Neutral Hadron Spectrum", kTHnSparseF, {axisPtAssoc, axisEta, axisPhi, axisPid}); // Particle ID of neutral hadrons + registry.add("generated/neutral/hNeutralSpectrumGen", "Generated Neutral Hadron Spectrum", kTHnSparseF, {axisPtAssoc, axisEtaAssoc, axisPhi, axisPid}); registry.add("generated/neutral/hNeutralDecayGen", "Generated Neutral Hadron-Decay Photon Correlation", kTHnSparseF, {axisPtAssoc, axisDeltaPt, axisDeltaRDecay, axisAlpha, axisPid}); // Correlation with decay photons // Reconstructed histograms + registry.add("reconstructed/events/hEventStats", "Event statistics", kTH1F, {axisEventStats}); + // Triggers registry.add("reconstructed/triggers/hTrigMultReco", "Reconstructed Trigger Multiplicity", kTH1F, {axisMult}); - registry.add("reconstructed/triggers/hTrigSpectrumReco", "Reconstructed Trigger Spectrum", kTHnSparseF, {axisPtTrig, axisEta, axisPhi}); + registry.add("reconstructed/triggers/hTrigSpectrumReco", "Reconstructed Trigger Spectrum", kTHnSparseF, {axisPtTrig, axisEtaTrig, axisPhi}); // Hadrons registry.add("reconstructed/hadrons/hHadronCorrelReco", "Reconstructed Trigger-Hadron Correlation", kTHnSparseF, {axisPtTrig, axisPtAssoc, axisDeltaEta, axisDeltaPhi}); registry.add("reconstructed/hadrons/hHadronMultReco", "Reconstructed Hadron Multiplicity", kTH1F, {axisMult}); - registry.add("reconstructed/hadrons/hHadronSpectrumReco", "Reconstructed Hadron Spectrum", kTHnSparseF, {axisPtAssoc, axisEta, axisPhi}); + registry.add("reconstructed/hadrons/hHadronSpectrumReco", "Reconstructed Hadron Spectrum", kTHnSparseF, {axisPtAssoc, axisEtaAssoc, axisPhi}); registry.add("reconstructed/hadrons/hHadronPtPrimReco", "Reconstructed Primaries Spectrum", kTH1F, {axisPtAssoc}); // Primary hadron spectrum registry.add("reconstructed/hadrons/hHadronPtSecReco", "Reconstructed Secondaries Spectrum", kTH1F, {axisPtAssoc}); // Secondary hadron spectrum // Photons registry.add("reconstructed/photons/hPhotonCorrelReco", "Reconstructed Trigger-Photon Correlation", kTHnSparseF, {axisPtTrig, axisPtAssoc, axisDeltaEta, axisDeltaPhi}); registry.add("reconstructed/photons/hPhotonMultReco", "Reconstructed Photon Multiplicity", kTH1F, {axisMult}); - registry.add("reconstructed/photons/hPhotonSpectrumReco", "Reconstructed Photon Spectrum", kTHnSparseF, {axisPtAssoc, axisEta, axisPhi}); + registry.add("reconstructed/photons/hPhotonSpectrumReco", "Reconstructed Photon Spectrum", kTHnSparseF, {axisPtAssoc, axisEtaAssoc, axisPhi}); // Charged Pions registry.add("reconstructed/charged/hPionCorrelReco", "Reconstructed Trigger-Pion Correlation", kTHnSparseF, {axisPtTrig, axisPtAssoc, axisDeltaEta, axisDeltaPhi}); registry.add("reconstructed/charged/hPionMultReco", "Reconstructed Pion Multiplicity", kTH1F, {axisMult}); - registry.add("reconstructed/charged/hPionSpectrumReco", "Reconstructed Pion Spectrum", kTHnSparseF, {axisPtAssoc, axisEta, axisPhi}); + registry.add("reconstructed/charged/hPionSpectrumReco", "Reconstructed Pion Spectrum", kTHnSparseF, {axisPtAssoc, axisEtaAssoc, axisPhi}); } // To check if object has has_mcParticle() (i.e. is MC Track or data track) @@ -185,7 +204,7 @@ struct HadronPhotonCorrelation { } } - if (std::abs(track.eta()) > etaMax) { + if (std::abs(track.eta()) > etaMaxAssoc) { return false; } @@ -205,7 +224,11 @@ struct HadronPhotonCorrelation { return false; } - if (std::abs(particle.eta()) > etaMax) { + if (particle.getGenStatusCode() == -1) { + return false; + } + + if (std::abs(particle.eta()) > etaMaxAssoc) { return false; } @@ -227,7 +250,7 @@ struct HadronPhotonCorrelation { } } - if (std::abs(track.eta()) > etaMax) { + if (std::abs(track.eta()) > etaMaxTrig) { return false; } @@ -251,7 +274,7 @@ struct HadronPhotonCorrelation { return false; } - if (std::abs(particle.eta()) > etaMax) { + if (std::abs(particle.eta()) > etaMaxTrig) { return false; } @@ -286,17 +309,49 @@ struct HadronPhotonCorrelation { return false; } - if (track.tpcNClsCrossedRows() < 70) { + if (track.tpcNClsCrossedRows() < tpcNClsCrossedRows) { return false; } - if (track.tpcCrossedRowsOverFindableCls() < 0.8) { + if (track.tpcCrossedRowsOverFindableCls() < tpcCrossedRowsOverFindableCls) { return false; } return true; } + /**************************************************************************************************** + ************************************************ EVENTS ******************************************** + ****************************************************************************************************/ + + void processEventsMCGen(JetMcCollision const& collision) + { + if (collision.subGeneratorId() != subGeneratorIdSelections) { + return; + } + + registry.fill(HIST("generated/events/hEventStats"), 0); + registry.fill(HIST("generated/events/hEventStats"), 1, collision.weight()); + registry.fill(HIST("generated/events/hEventStats"), 2, collision.xsectGen()); + } + PROCESS_SWITCH(HadronPhotonCorrelation, processEventsMCGen, "event stats MC gen", true); + + void processEventsMCReco(JetCollisionMCD const& collision, + JetMcCollisions const&) + { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, false)) { + return; + } + if (collision.subGeneratorId() != subGeneratorIdSelections) { + return; + } + + registry.fill(HIST("reconstructed/events/hEventStats"), 0); + registry.fill(HIST("reconstructed/events/hEventStats"), 1, collision.mcCollision().weight()); + registry.fill(HIST("reconstructed/events/hEventStats"), 2, collision.mcCollision().xsectGen()); + } + PROCESS_SWITCH(HadronPhotonCorrelation, processEventsMCReco, "event stats MC reco", true); + /**************************************************************************************************** ************************************************ TRIGGER ******************************************** ****************************************************************************************************/ @@ -329,11 +384,15 @@ struct HadronPhotonCorrelation { /*********************************************** MC ************************************************/ - void processTrigsMCReco(JetCollision const& collision, + void processTrigsMCReco(JetCollisionMCD const& collision, + JetMcCollisions const&, Join const& tracks, JetParticles const&) { - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, false)) { + return; + } + if (collision.subGeneratorId() != subGeneratorIdSelections) { return; } @@ -346,26 +405,29 @@ struct HadronPhotonCorrelation { if (!initTrig(track)) { continue; } - registry.fill(HIST("reconstructed/triggers/hTrigSpectrumReco"), track.pt(), track.eta(), track.phi()); + registry.fill(HIST("reconstructed/triggers/hTrigSpectrumReco"), track.pt(), track.eta(), track.phi(), collision.mcCollision().weight()); nTrigs++; } - registry.fill(HIST("reconstructed/triggers/hTrigMultReco"), nTrigs); + registry.fill(HIST("reconstructed/triggers/hTrigMultReco"), nTrigs, collision.mcCollision().weight()); } PROCESS_SWITCH(HadronPhotonCorrelation, processTrigsMCReco, "trigger particle mc properties", true); - void processTrigsMCGen(JetMcCollision const&, + void processTrigsMCGen(JetMcCollision const& collision, JetParticles const& particles) { + if (collision.subGeneratorId() != subGeneratorIdSelections) { + return; + } int nTrigs = 0; for (const auto& particle : particles) { if (!initTrigParticle(particle)) { continue; } - registry.fill(HIST("generated/triggers/hTrigSpectrumGen"), particle.pt(), particle.eta(), particle.phi()); + registry.fill(HIST("generated/triggers/hTrigSpectrumGen"), particle.pt(), particle.eta(), particle.phi(), collision.weight()); nTrigs++; } - registry.fill(HIST("generated/triggers/hTrigMultGen"), nTrigs); + registry.fill(HIST("generated/triggers/hTrigMultGen"), nTrigs, collision.weight()); } PROCESS_SWITCH(HadronPhotonCorrelation, processTrigsMCGen, "trigger particle mc properties", true); @@ -402,8 +464,8 @@ struct HadronPhotonCorrelation { if (!initTrig(track)) { continue; } - float dphi = RecoDecay::constrainAngle(track.phi() - v0.phi(), -PIHalf); - registry.fill(HIST("reconstructed/photons/hPhotonCorrelReco"), track.pt(), v0.pt(), track.eta() - v0.eta(), dphi); + float dphi = RecoDecay::constrainAngle(v0.phi() - track.phi(), -PIHalf); + registry.fill(HIST("reconstructed/photons/hPhotonCorrelReco"), track.pt(), v0.pt(), v0.eta() - track.eta(), dphi); } } registry.fill(HIST("reconstructed/photons/hPhotonMultReco"), nPhotons); @@ -413,14 +475,17 @@ struct HadronPhotonCorrelation { /*********************************************** MC ************************************************/ using MyTracksMC = soa::Join; - void processPhotonCorrelationsMCReco(Join::iterator const& collision_reco, + void processPhotonCorrelationsMCReco(Join::iterator const& collision_reco, JetMcCollisions const&, JetTracks const& tracks_reco, JetParticles const&, MyTracksMC const&, V0Datas const& v0s) { - if (!jetderiveddatautilities::selectCollision(collision_reco, eventSelectionBits)) { + if (!jetderiveddatautilities::selectCollision(collision_reco, eventSelectionBits, false)) { + return; + } + if (collision_reco.mcCollision().subGeneratorId() != subGeneratorIdSelections) { return; } @@ -431,7 +496,7 @@ struct HadronPhotonCorrelation { if (!initV0(v0)) { continue; } - registry.fill(HIST("reconstructed/photons/hPhotonSpectrumReco"), v0.pt(), v0.eta(), v0.phi()); + registry.fill(HIST("reconstructed/photons/hPhotonSpectrumReco"), v0.pt(), v0.eta(), v0.phi(), collision_reco.mcCollision().weight()); nPhotons++; for (const auto& track : tracks_reco) { @@ -442,17 +507,21 @@ struct HadronPhotonCorrelation { if (!initTrig(track)) { continue; } - float dphi = RecoDecay::constrainAngle(track.phi() - v0.phi(), -PIHalf); - registry.fill(HIST("reconstructed/photons/hPhotonCorrelReco"), track.pt(), v0.pt(), track.eta() - v0.eta(), dphi); + float dphi = RecoDecay::constrainAngle(v0.phi() - track.phi(), -PIHalf); + registry.fill(HIST("reconstructed/photons/hPhotonCorrelReco"), track.pt(), v0.pt(), v0.eta() - track.eta(), dphi, collision_reco.mcCollision().weight()); } } - registry.fill(HIST("reconstructed/photons/hPhotonMultReco"), nPhotons); + registry.fill(HIST("reconstructed/photons/hPhotonMultReco"), nPhotons, collision_reco.mcCollision().weight()); } PROCESS_SWITCH(HadronPhotonCorrelation, processPhotonCorrelationsMCReco, "hadron-photon correlation", true); - void processPhotonCorrelationsMCGen(JetMcCollision const&, + void processPhotonCorrelationsMCGen(JetMcCollision const& collision, JetParticles const& tracks_true) { + if (collision.subGeneratorId() != subGeneratorIdSelections) { + return; + } + int nPhotons = 0; for (const auto& track_assoc : tracks_true) { if (!initParticle(track_assoc, false)) { @@ -474,8 +543,9 @@ struct HadronPhotonCorrelation { } auto pdgMother = pdg->GetParticle(mother.pdgCode()); - if (!pdgMother) + if (!pdgMother) { continue; + } int photonGeneration; switch (std::abs(origPhoton.getGenStatusCode())) { case 23: // prompt direct photons @@ -496,7 +566,7 @@ struct HadronPhotonCorrelation { break; } - registry.fill(HIST("generated/photons/hPhotonSpectrumGen"), track_assoc.pt(), track_assoc.eta(), track_assoc.phi(), photonGeneration); + registry.fill(HIST("generated/photons/hPhotonSpectrumGen"), track_assoc.pt(), track_assoc.eta(), track_assoc.phi(), photonGeneration, collision.weight()); nPhotons++; @@ -507,12 +577,12 @@ struct HadronPhotonCorrelation { if (!initParticle(track_assoc)) { continue; } - float dphi = RecoDecay::constrainAngle(track_trig.phi() - track_assoc.phi(), -PIHalf); - registry.fill(HIST("generated/photons/hPhotonCorrelGen"), track_trig.pt(), track_assoc.pt(), track_trig.eta() - track_assoc.eta(), dphi, photonGeneration); + float dphi = RecoDecay::constrainAngle(track_assoc.phi() - track_trig.phi(), -PIHalf); + registry.fill(HIST("generated/photons/hPhotonCorrelGen"), track_trig.pt(), track_assoc.pt(), track_assoc.eta() - track_trig.eta(), dphi, photonGeneration, collision.weight()); } } - registry.fill(HIST("generated/photons/hPhotonMultGen"), nPhotons); + registry.fill(HIST("generated/photons/hPhotonMultGen"), nPhotons, collision.weight()); } PROCESS_SWITCH(HadronPhotonCorrelation, processPhotonCorrelationsMCGen, "mc hadron-photon correlation", true); @@ -550,8 +620,8 @@ struct HadronPhotonCorrelation { if (!initTrig(track_trig)) { continue; } - float dphi = RecoDecay::constrainAngle(track_trig.phi() - track_assoc.phi(), -PIHalf); - registry.fill(HIST("reconstructed/hadrons/hadrons/hHadronCorrelReco"), track_trig.pt(), track_assoc.pt(), track_trig.eta() - track_assoc.eta(), dphi); + float dphi = RecoDecay::constrainAngle(track_assoc.phi() - track_trig.phi(), -PIHalf); + registry.fill(HIST("reconstructed/hadrons/hadrons/hHadronCorrelReco"), track_trig.pt(), track_assoc.pt(), track_assoc.eta() - track_trig.eta(), dphi); } } registry.fill(HIST("reconstructed/hadrons/hHadronMultReco"), nHadrons); @@ -560,9 +630,13 @@ struct HadronPhotonCorrelation { /*********************************************** MC ************************************************/ - void processHadronCorrelationsMCGen(JetMcCollision const&, + void processHadronCorrelationsMCGen(JetMcCollision const& collision, JetParticles const& tracks_true) { + if (collision.subGeneratorId() != subGeneratorIdSelections) { + return; + } + int nHadrons = 0; for (const auto& track_assoc : tracks_true) { if (!initParticle(track_assoc)) { @@ -572,11 +646,11 @@ struct HadronPhotonCorrelation { if (!pdgParticle || pdgParticle->Charge() == 0.) { continue; } - if (std::abs(track_assoc.pdgCode()) < 100) { + if (std::abs(track_assoc.pdgCode()) < pidCodeHadronCut) { continue; } - registry.fill(HIST("generated/hadrons/hHadronSpectrumGen"), track_assoc.pt(), track_assoc.eta(), track_assoc.phi()); + registry.fill(HIST("generated/hadrons/hHadronSpectrumGen"), track_assoc.pt(), track_assoc.eta(), track_assoc.phi(), collision.weight()); nHadrons++; for (const auto& track_trig : tracks_true) { @@ -586,21 +660,24 @@ struct HadronPhotonCorrelation { if (track_trig == track_assoc) { continue; } - float dphi = RecoDecay::constrainAngle(track_trig.phi() - track_assoc.phi(), -PIHalf); + float dphi = RecoDecay::constrainAngle(track_assoc.phi() - track_trig.phi(), -PIHalf); - registry.fill(HIST("generated/hadrons/hHadronCorrelGen"), track_trig.pt(), track_assoc.pt(), track_trig.eta() - track_assoc.eta(), dphi); + registry.fill(HIST("generated/hadrons/hHadronCorrelGen"), track_trig.pt(), track_assoc.pt(), track_assoc.eta() - track_trig.eta(), dphi, collision.weight()); } } - registry.fill(HIST("generated/hadrons/hHadronMultGen"), nHadrons); + registry.fill(HIST("generated/hadrons/hHadronMultGen"), nHadrons, collision.weight()); } PROCESS_SWITCH(HadronPhotonCorrelation, processHadronCorrelationsMCGen, "mc hadron-hadron correlation", true); - void processHadronCorrelationsMCReco(Join::iterator const& collision_reco, + void processHadronCorrelationsMCReco(JetCollisionMCD const& collision_reco, JetMcCollisions const&, - Join const& tracks_reco, + JetTracksMCD const& tracks_reco, JetParticles const&) { - if (!jetderiveddatautilities::selectCollision(collision_reco, eventSelectionBits)) { + if (!jetderiveddatautilities::selectCollision(collision_reco, eventSelectionBits, false)) { + return; + } + if (collision_reco.mcCollision().subGeneratorId() != subGeneratorIdSelections) { return; } @@ -618,16 +695,16 @@ struct HadronPhotonCorrelation { if (!pdgParticle || pdgParticle->Charge() == 0.) { continue; } - if (std::abs(particle.pdgCode()) < 100) { + if (std::abs(particle.pdgCode()) < pidCodeHadronCut) { continue; } - registry.fill(HIST("reconstructed/hadrons/hHadronSpectrumReco"), track_assoc.pt(), track_assoc.eta(), track_assoc.phi()); + registry.fill(HIST("reconstructed/hadrons/hHadronSpectrumReco"), track_assoc.pt(), track_assoc.eta(), track_assoc.phi(), collision_reco.mcCollision().weight()); if (particle.isPhysicalPrimary()) { - registry.fill(HIST("reconstructed/hadrons/hHadronPtPrimReco"), track_assoc.pt()); + registry.fill(HIST("reconstructed/hadrons/hHadronPtPrimReco"), track_assoc.pt(), collision_reco.mcCollision().weight()); } else { - registry.fill(HIST("reconstructed/hadrons/hHadronPtSecReco"), track_assoc.pt()); + registry.fill(HIST("reconstructed/hadrons/hHadronPtSecReco"), track_assoc.pt(), collision_reco.mcCollision().weight()); } nHadrons++; @@ -641,12 +718,12 @@ struct HadronPhotonCorrelation { if (!initTrig(track_trig)) { continue; } - float dphi = RecoDecay::constrainAngle(track_trig.phi() - track_assoc.phi(), -PIHalf); + float dphi = RecoDecay::constrainAngle(track_assoc.phi() - track_trig.phi(), -PIHalf); - registry.fill(HIST("reconstructed/hadrons/hHadronCorrelReco"), track_trig.pt(), track_assoc.pt(), track_trig.eta() - track_assoc.eta(), dphi); + registry.fill(HIST("reconstructed/hadrons/hHadronCorrelReco"), track_trig.pt(), track_assoc.pt(), track_assoc.eta() - track_trig.eta(), dphi, collision_reco.mcCollision().weight()); } } - registry.fill(HIST("reconstructed/hadrons/hHadronMultReco"), nHadrons); + registry.fill(HIST("reconstructed/hadrons/hHadronMultReco"), nHadrons, collision_reco.mcCollision().weight()); } PROCESS_SWITCH(HadronPhotonCorrelation, processHadronCorrelationsMCReco, "mc hadron-hadron correlation", true); @@ -671,7 +748,7 @@ struct HadronPhotonCorrelation { if (!initTrack(track_assoc)) { continue; } - if (std::abs(track_assoc.tpcNSigmaPi()) > 2) { + if (std::abs(track_assoc.tpcNSigmaPi()) > tpcNSigmaPi) { continue; } // remove non-pions registry.fill(HIST("reconstructed/charged/hPionSpectrumReco"), track_assoc.pt(), track_assoc.eta(), track_assoc.phi()); @@ -687,8 +764,8 @@ struct HadronPhotonCorrelation { if (!initTrig(track_trig)) { continue; } - float dphi = RecoDecay::constrainAngle(track_trig.phi() - track_assoc.phi(), -PIHalf); - registry.fill(HIST("reconstructed/charged/hPionCorrelReco"), track_trig.pt(), track_assoc.pt(), track_trig.eta() - track_assoc.eta(), dphi); + float dphi = RecoDecay::constrainAngle(track_assoc.phi() - track_trig.phi(), -PIHalf); + registry.fill(HIST("reconstructed/charged/hPionCorrelReco"), track_trig.pt(), track_assoc.pt(), track_assoc.eta() - track_trig.eta(), dphi); } } registry.fill(HIST("reconstructed/charged/hPionMultReco"), nPions); @@ -697,9 +774,13 @@ struct HadronPhotonCorrelation { /*********************************************** MC ************************************************/ - void processPionCorrelationsMCGen(JetMcCollision const&, + void processPionCorrelationsMCGen(JetMcCollision const& collision, JetParticles const& tracks_true) { + if (collision.subGeneratorId() != subGeneratorIdSelections) { + return; + } + int nPions = 0; for (const auto& track_assoc : tracks_true) { if (!initParticle(track_assoc)) { @@ -709,7 +790,7 @@ struct HadronPhotonCorrelation { continue; } - registry.fill(HIST("generated/charged/hPionSpectrumGen"), track_assoc.pt(), track_assoc.eta(), track_assoc.phi()); + registry.fill(HIST("generated/charged/hPionSpectrumGen"), track_assoc.pt(), track_assoc.eta(), track_assoc.phi(), collision.weight()); nPions++; for (const auto& track_trig : tracks_true) { @@ -719,21 +800,24 @@ struct HadronPhotonCorrelation { if (track_trig == track_assoc) { continue; } - float dphi = RecoDecay::constrainAngle(track_trig.phi() - track_assoc.phi(), -PIHalf); + float dphi = RecoDecay::constrainAngle(track_assoc.phi() - track_trig.phi(), -PIHalf); - registry.fill(HIST("generated/charged/hPionCorrelGen"), track_trig.pt(), track_assoc.pt(), track_trig.eta() - track_assoc.eta(), dphi); + registry.fill(HIST("generated/charged/hPionCorrelGen"), track_trig.pt(), track_assoc.pt(), track_assoc.eta() - track_trig.eta(), dphi, collision.weight()); } } - registry.fill(HIST("generated/charged/hPionMultGen"), nPions); + registry.fill(HIST("generated/charged/hPionMultGen"), nPions, collision.weight()); } PROCESS_SWITCH(HadronPhotonCorrelation, processPionCorrelationsMCGen, "mc hadron-pion correlation", true); - void processPionCorrelationsMCReco(Join::iterator const& collision_reco, + void processPionCorrelationsMCReco(JetCollisionMCD const& collision_reco, JetMcCollisions const&, - Join const& tracks_reco, + JetTracksMCD const& tracks_reco, JetParticles const&) { - if (!jetderiveddatautilities::selectCollision(collision_reco, eventSelectionBits)) { + if (!jetderiveddatautilities::selectCollision(collision_reco, eventSelectionBits, false)) { + return; + } + if (collision_reco.mcCollision().subGeneratorId() != subGeneratorIdSelections) { return; } @@ -750,7 +834,7 @@ struct HadronPhotonCorrelation { continue; } - registry.fill(HIST("reconstructed/charged/hPionSpectrumReco"), track_assoc.pt(), track_assoc.eta(), track_assoc.phi()); + registry.fill(HIST("reconstructed/charged/hPionSpectrumReco"), track_assoc.pt(), track_assoc.eta(), track_assoc.phi(), collision_reco.mcCollision().weight()); nPions++; for (const auto& track_trig : tracks_reco) { @@ -764,11 +848,11 @@ struct HadronPhotonCorrelation { if (!initTrig(track_trig)) { continue; } - float dphi = RecoDecay::constrainAngle(track_trig.phi() - track_assoc.phi(), -PIHalf); - registry.fill(HIST("reconstructed/charged/hPionCorrelReco"), track_trig.pt(), track_assoc.pt(), track_trig.eta() - track_assoc.eta(), dphi); + float dphi = RecoDecay::constrainAngle(track_assoc.phi() - track_trig.phi(), -PIHalf); + registry.fill(HIST("reconstructed/charged/hPionCorrelReco"), track_trig.pt(), track_assoc.pt(), track_assoc.eta() - track_trig.eta(), dphi, collision_reco.mcCollision().weight()); } } - registry.fill(HIST("reconstructed/charged/hPionMultReco"), nPions); + registry.fill(HIST("reconstructed/charged/hPionMultReco"), nPions, collision_reco.mcCollision().weight()); } PROCESS_SWITCH(HadronPhotonCorrelation, processPionCorrelationsMCReco, "mc hadron-pion correlation", true); @@ -778,9 +862,13 @@ struct HadronPhotonCorrelation { /*********************************************** MC ************************************************/ - void processNeutralCorrelationsMCGen(JetMcCollision const&, + void processNeutralCorrelationsMCGen(JetMcCollision const& collision, JetParticles const& tracks_true) { + if (collision.subGeneratorId() != subGeneratorIdSelections) { + return; + } + int nNeutrals = 0; for (const auto& track_assoc : tracks_true) { if (!initParticle(track_assoc, false)) { @@ -793,16 +881,17 @@ struct HadronPhotonCorrelation { if (pdgParticle->Charge() != 0.) { continue; } // remove charged particles - if (track_assoc.pdgCode() < 100 || (PDG_t)track_assoc.pdgCode() == kNeutron) { + if (track_assoc.pdgCode() < pidCodeHadronCut || (PDG_t)track_assoc.pdgCode() == kNeutron) { continue; } // remove non-hadrons and neutrons - registry.fill(HIST("generated/neutral/hNeutralSpectrumGen"), track_assoc.pt(), track_assoc.eta(), track_assoc.phi(), pidCodes[pdgParticle->GetName()]); + registry.fill(HIST("generated/neutral/hNeutralSpectrumGen"), track_assoc.pt(), track_assoc.eta(), track_assoc.phi(), pidCodes[pdgParticle->GetName()], collision.weight()); nNeutrals++; // Get correlations between neutral hadrons and their respective decay photons auto daughters = track_assoc.daughters_as(); double alpha = -1; - if (daughters.size() == 2) { + int nPhotonsPionDecay = 2; + if (daughters.size() == nPhotonsPionDecay) { auto daughter = daughters.begin(); double pt1 = daughter.pt(); ++daughter; @@ -811,18 +900,18 @@ struct HadronPhotonCorrelation { } for (const auto& daughter : daughters) { - if ((PDG_t)std::abs(daughter.pdgCode()) != kGamma) - continue; - if (!initParticle(daughter, false)) + if ((PDG_t)std::abs(daughter.pdgCode()) != kGamma) { continue; - if (!daughter.isPhysicalPrimary() && daughter.getGenStatusCode() == -1) + } + if (!daughter.isPhysicalPrimary() && daughter.getGenStatusCode() == -1) { continue; + } double deltaPt = daughter.pt() / track_assoc.pt(); double deltaEta = daughter.eta() - track_assoc.eta(); double deltaPhi = RecoDecay::constrainAngle(daughter.phi() - track_assoc.phi(), -PIHalf); double deltaR = std::sqrt(deltaEta * deltaEta + deltaPhi * deltaPhi); - registry.fill(HIST("generated/neutral/hNeutralDecayGen"), track_assoc.pt(), deltaPt, deltaR, alpha, pidCodes[pdgParticle->GetName()]); + registry.fill(HIST("generated/neutral/hNeutralDecayGen"), track_assoc.pt(), deltaPt, deltaR, alpha, pidCodes[pdgParticle->GetName()], collision.weight()); } // Get correlations between triggers and neutral hadrons @@ -831,10 +920,10 @@ struct HadronPhotonCorrelation { continue; } float dphi = RecoDecay::constrainAngle(track_assoc.phi() - track_trig.phi(), -PIHalf); - registry.fill(HIST("generated/neutral/hNeutralCorrelGen"), track_trig.pt(), track_assoc.pt(), track_assoc.eta() - track_trig.eta(), dphi, pidCodes[pdgParticle->GetName()]); + registry.fill(HIST("generated/neutral/hNeutralCorrelGen"), track_trig.pt(), track_assoc.pt(), track_assoc.eta() - track_trig.eta(), dphi, pidCodes[pdgParticle->GetName()], collision.weight()); } } - registry.fill(HIST("generated/neutral/hNeutralMultGen"), nNeutrals); + registry.fill(HIST("generated/neutral/hNeutralMultGen"), nNeutrals, collision.weight()); } PROCESS_SWITCH(HadronPhotonCorrelation, processNeutralCorrelationsMCGen, "mc hadron-pion correlation", true); }; From 6d322290cba68ea8b918c7513e0fddaaaa51c9e2 Mon Sep 17 00:00:00 2001 From: Debadatta3337 Date: Fri, 30 May 2025 17:32:53 +0530 Subject: [PATCH 1461/1650] [PWGDQ] Updated CutsLibrery.cxx macro (#11397) Co-authored-by: Debadatta3337 --- PWGDQ/Core/CutsLibrary.cxx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/PWGDQ/Core/CutsLibrary.cxx b/PWGDQ/Core/CutsLibrary.cxx index bf4a0025ba3..c73c301a262 100644 --- a/PWGDQ/Core/CutsLibrary.cxx +++ b/PWGDQ/Core/CutsLibrary.cxx @@ -4009,6 +4009,16 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) return cut; } + if (!nameStr.compare("eventStandardSel8multAnalysis")) { + cut->AddCut(VarManager::kVtxZ, -10.0, 10.0); + cut->AddCut(VarManager::kIsSel8, 0.5, 1.5); + cut->AddCut(VarManager::kIsNoTFBorder, 0.5, 1.5); + cut->AddCut(VarManager::kIsNoITSROFBorder, 0.5, 1.5); + cut->AddCut(VarManager::kIsNoSameBunch, 0.5, 1.5); + cut->AddCut(VarManager::kIsVertexITSTPC, 0.5, 1.5); + return cut; + } + if (!nameStr.compare("eventStandardSel8VtxQuality1")) { // kIsSel8 = kIsTriggerTVX && kNoITSROFrameBorder && kNoTimeFrameBorder cut->AddCut(VarManager::kVtxZ, -10.0, 10.0); cut->AddCut(VarManager::kIsSel8, 0.5, 1.5); From 2924e24eee94b6c4565776fbc36af3a0c856d7a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josu=C3=A9=20Mart=C3=ADnez=20Garc=C3=ADa?= Date: Fri, 30 May 2025 06:27:19 -0600 Subject: [PATCH 1462/1650] [PWGUD] Adding correlation study (#11333) --- PWGUD/Core/UPCPairCuts.h | 346 +++++++++++++++++++ PWGUD/Tasks/CMakeLists.txt | 2 +- PWGUD/Tasks/upcPhotonuclearAnalysisJMG.cxx | 382 +++++++++++++++------ 3 files changed, 615 insertions(+), 115 deletions(-) create mode 100644 PWGUD/Core/UPCPairCuts.h diff --git a/PWGUD/Core/UPCPairCuts.h b/PWGUD/Core/UPCPairCuts.h new file mode 100644 index 00000000000..6b0e37adca0 --- /dev/null +++ b/PWGUD/Core/UPCPairCuts.h @@ -0,0 +1,346 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \brief Functions which cut on particle pairs (decays, conversions, two-track cuts) adapted for data from UD tables +/// Based on the code "PWGCF/Core/PairCuts.h" made by Jan Fiete Grosse-Oetringhaus +/// Author: + +#ifndef PWGUD_CORE_UPCPAIRCUTS_H_ +#define PWGUD_CORE_UPCPAIRCUTS_H_ + +#include + +#include "Framework/Logger.h" +#include "Framework/HistogramRegistry.h" +#include "CommonConstants/MathConstants.h" +#include "CommonConstants/PhysicsConstants.h" + +#include "PWGUD/Core/UPCTauCentralBarrelHelperRL.h" + +using namespace o2; +using namespace o2::framework; +using namespace constants::math; + +class UPCPairCuts +{ + public: + enum Particle { Photon = 0, + K0, + Lambda, + Phi, + Rho, + ParticlesLastEntry }; + + void setHistogramRegistry(HistogramRegistry* registry) { histogramRegistry = registry; } + + void setPairCut(Particle particle, float cut) + { + LOGF(info, "Enabled pair cut for %d with value %f", static_cast(particle), cut); + mCuts[particle] = cut; + if (histogramRegistry != nullptr && histogramRegistry->contains(HIST("ControlConvResonances")) == false) { + histogramRegistry->add("ControlConvResonances", "", {HistType::kTH2F, {{6, -0.5, 5.5, "id"}, {500, -0.5, 0.5, "delta mass"}}}); + } + } + + void setTwoTrackCuts(float distance = 0.02f, float radius = 0.8f) + { + LOGF(info, "Enabled two-track cut with distance %f and radius %f", distance, radius); + mTwoTrackDistance = distance; + mTwoTrackRadius = radius; + + if (histogramRegistry != nullptr && histogramRegistry->contains(HIST("TwoTrackDistancePt_0")) == false) { + histogramRegistry->add("TwoTrackDistancePt_0", "", {HistType::kTH3F, {{100, -0.15, 0.15, "#Delta#eta"}, {100, -0.05, 0.05, "#Delta#varphi^{*}_{min}"}, {20, 0, 10, "#Delta p_{T}"}}}); + histogramRegistry->addClone("TwoTrackDistancePt_0", "TwoTrackDistancePt_1"); + } + } + + template + bool conversionCuts(T const& track1, T const& track2); + + template + bool twoTrackCut(T const& track1, T const& track2); + + protected: + float mCuts[ParticlesLastEntry] = {-1}; + float mTwoTrackDistance = -1; // distance below which the pair is flagged as to be removed + float mTwoTrackRadius = 0.8f; // radius at which the two track cuts are applied + int magField = 5; // magField: B field in kG + + HistogramRegistry* histogramRegistry = nullptr; // if set, control histograms are stored here + + template + bool conversionCut(T const& track1, T const& track2, Particle conv, double cut); + + template + double getInvMassSquared(T const& track1, double m0_1, T const& track2, double m0_2); + + template + double getInvMassSquaredFast(T const& track1, double m0_1, T const& track2, double m0_2); + + template + float getDPhiStar(T const& track1, T const& track2, float radius, int magField); +}; + +template +bool UPCPairCuts::conversionCuts(T const& track1, T const& track2) +{ + // skip if like sign + if (track1.sign() * track2.sign() > 0) { + return false; + } + + for (int i = 0; i < static_cast(ParticlesLastEntry); i++) { + Particle particle = static_cast(i); + if (mCuts[i] > 0) { + if (conversionCut(track1, track2, particle, mCuts[i])) { + return true; + } + if (particle == Lambda) { + if (conversionCut(track2, track1, particle, mCuts[i])) { + return true; + } + } + } + } + + return false; +} + +template +bool UPCPairCuts::twoTrackCut(T const& track1, T const& track2) +{ + // the variables & cut have been developed in Run 1 by the CF - HBT group + // + // Parameters: + // magField: B field in kG + + auto deta = eta(track1.px(), track1.py(), track1.pz()) - eta(track2.px(), track2.py(), track2.pz()); + + // optimization + if (std::fabs(deta) < mTwoTrackDistance * 2.5 * 3) { + // check first boundaries to see if is worth to loop and find the minimum + float dphistar1 = getDPhiStar(track1, track2, mTwoTrackRadius, magField); + float dphistar2 = getDPhiStar(track1, track2, 2.5, magField); + + const float kLimit = mTwoTrackDistance * 3; + + if (std::fabs(dphistar1) < kLimit || std::fabs(dphistar2) < kLimit || dphistar1 * dphistar2 < 0) { + float dphistarminabs = 1e5; + float dphistarmin = 1e5; + for (Double_t rad = mTwoTrackRadius; rad < 2.51; rad += 0.01) { + float dphistar = getDPhiStar(track1, track2, rad, magField); + + float dphistarabs = std::fabs(dphistar); + + if (dphistarabs < dphistarminabs) { + dphistarmin = dphistar; + dphistarminabs = dphistarabs; + } + } + + if (histogramRegistry != nullptr) { + histogramRegistry->fill(HIST("TwoTrackDistancePt_0"), deta, dphistarmin, std::fabs(track1.pt() - track2.pt())); + } + + if (dphistarminabs < mTwoTrackDistance && std::fabs(deta) < mTwoTrackDistance) { + // LOGF(debug, "Removed track pair %ld %ld with %f %f %f %f %d %f %f %d %d", track1.index(), track2.index(), deta, dphistarminabs, track1.phi2(), track1.pt(), track1.sign(), track2.phi2(), track2.pt(), track2.sign(), magField); + return true; + } + + if (histogramRegistry != nullptr) { + histogramRegistry->fill(HIST("TwoTrackDistancePt_1"), deta, dphistarmin, std::fabs(track1.pt() - track2.pt())); + } + } + } + + return false; +} + +template +bool UPCPairCuts::conversionCut(T const& track1, T const& track2, Particle conv, double cut) +{ + // LOGF(info, "pt is %f %f", track1.pt(), track2.pt()); + + if (cut < 0) { + return false; + } + + double massD1, massD2, massM; + + switch (conv) { + case Photon: + massD1 = o2::constants::physics::MassElectron; + massD2 = o2::constants::physics::MassElectron; + massM = 0; + break; + case K0: + massD1 = o2::constants::physics::MassPiPlus; + massD2 = o2::constants::physics::MassPiPlus; + massM = o2::constants::physics::MassK0; + break; + case Lambda: + massD1 = o2::constants::physics::MassProton; + massD2 = o2::constants::physics::MassPiPlus; + massM = o2::constants::physics::MassLambda0; + break; + case Phi: + massD1 = o2::constants::physics::MassKPlus; + massD2 = o2::constants::physics::MassKPlus; + massM = o2::constants::physics::MassPhi; + break; + case Rho: + massD1 = o2::constants::physics::MassPiPlus; + massD2 = o2::constants::physics::MassPiPlus; + massM = 0.770; + break; + default: + LOGF(fatal, "Particle now known"); + return false; + break; + } + + auto massC = getInvMassSquaredFast(track1, massD1, track2, massD2); + + if (std::fabs(massC - massM * massM) > cut * 5) { + return false; + } + + massC = getInvMassSquared(track1, massD1, track2, massD2); + + if (histogramRegistry != nullptr) { + histogramRegistry->fill(HIST("ControlConvResonances"), static_cast(conv), massC - massM * massM); + } + + if (massC > (massM - cut) * (massM - cut) && massC < (massM + cut) * (massM + cut)) { + return true; + } + + return false; +} + +template +double UPCPairCuts::getInvMassSquared(T const& track1, double m0_1, T const& track2, double m0_2) +{ + // calculate inv mass squared + // same can be achieved, but with more computing time with + /*TLorentzVector photon, p1, p2; + p1.SetPtEtaPhiM(triggerParticle->Pt(), triggerEta, triggerParticle->Phi(), 0.510e-3); + p2.SetPtEtaPhiM(particle->Pt(), eta[j], particle->Phi(), 0.510e-3); + photon = p1+p2; + photon.M()*/ + + float tantheta1 = 1e10; + + if (eta(track1.px(), track1.py(), track1.pz()) < -1e-10 || eta(track1.px(), track1.py(), track1.pz()) > 1e-10) { + float expTmp = std::exp(-eta(track1.px(), track1.py(), track1.pz())); + tantheta1 = 2.0 * expTmp / (1.0 - expTmp * expTmp); + } + + float tantheta2 = 1e10; + if (eta(track2.px(), track2.py(), track2.pz()) < -1e-10 || eta(track2.px(), track2.py(), track2.pz()) > 1e-10) { + float expTmp = std::exp(-eta(track2.px(), track2.py(), track2.pz())); + tantheta2 = 2.0 * expTmp / (1.0 - expTmp * expTmp); + } + + float e1squ = m0_1 * m0_1 + track1.pt() * track1.pt() * (1.0 + 1.0 / tantheta1 / tantheta1); + float e2squ = m0_2 * m0_2 + track2.pt() * track2.pt() * (1.0 + 1.0 / tantheta2 / tantheta2); + + float mass2 = m0_1 * m0_1 + m0_2 * m0_2 + 2 * (std::sqrt(e1squ * e2squ) - (track1.pt() * track2.pt() * (std::cos(phi(track1.px(), track1.py()) - phi(track2.px(), track2.py())) + 1.0 / tantheta1 / tantheta2))); + + // LOGF(debug, "%f %f %f %f %f %f %f %f %f", pt1, eta1, phi1, pt2, eta2, phi2, m0_1, m0_2, mass2); + + return mass2; +} + +template +double UPCPairCuts::getInvMassSquaredFast(T const& track1, double m0_1, T const& track2, double m0_2) +{ + // calculate inv mass squared approximately + + const float eta1 = eta(track1.px(), track1.py(), track1.pz()); + const float eta2 = eta(track2.px(), track2.py(), track2.pz()); + const float phi1 = phi(track1.px(), track1.py()); + const float phi2 = phi(track2.px(), track2.py()); + const float pt1 = track1.pt(); + const float pt2 = track2.pt(); + + float tantheta1 = 1e10f; + + if (eta1 < -1e-10f || eta1 > 1e-10f) { + float expTmp = 1.0f - eta1 + eta1 * eta1 / 2.0f - eta1 * eta1 * eta1 / 6.0f + eta1 * eta1 * eta1 * eta1 / 24.0f; + tantheta1 = 2.0f * expTmp / (1.0f - expTmp * expTmp); + } + + float tantheta2 = 1e10f; + if (eta2 < -1e-10f || eta2 > 1e-10f) { + float expTmp = 1.0f - eta2 + eta2 * eta2 / 2.0f - eta2 * eta2 * eta2 / 6.0f + eta2 * eta2 * eta2 * eta2 / 24.0f; + tantheta2 = 2.0f * expTmp / (1.0f - expTmp * expTmp); + } + + float e1squ = m0_1 * m0_1 + pt1 * pt1 * (1.0f + 1.0f / tantheta1 / tantheta1); + float e2squ = m0_2 * m0_2 + pt2 * pt2 * (1.0f + 1.0f / tantheta2 / tantheta2); + + // fold onto 0...pi + float deltaPhi = std::fabs(phi1 - phi2); + while (deltaPhi > TwoPI) { + deltaPhi -= TwoPI; + } + if (deltaPhi > PI) { + deltaPhi = TwoPI - deltaPhi; + } + + float cosDeltaPhi = 0; + if (deltaPhi < PI / 3.0f) { + cosDeltaPhi = 1.0 - deltaPhi * deltaPhi / 2 + deltaPhi * deltaPhi * deltaPhi * deltaPhi / 24; + } else if (deltaPhi < 2.0f * PI / 3.0f) { + cosDeltaPhi = -(deltaPhi - PI / 2) + 1.0 / 6 * std::pow((deltaPhi - PI / 2), 3); + } else { + cosDeltaPhi = -1.0f + 1.0f / 2.0f * (deltaPhi - PI) * (deltaPhi - PI) - 1.0f / 24.0f * std::pow(deltaPhi - PI, 4.0f); + } + + double mass2 = m0_1 * m0_1 + m0_2 * m0_2 + 2.0f * (std::sqrt(e1squ * e2squ) - (pt1 * pt2 * (cosDeltaPhi + 1.0f / tantheta1 / tantheta2))); + + // LOGF(debug, "%f %f %f %f %f %f %f %f %f", pt1, eta1, phi1, pt2, eta2, phi2, m0_1, m0_2, mass2); + + return mass2; +} + +template +float UPCPairCuts::getDPhiStar(T const& track1, T const& track2, float radius, int magField) +{ + // + // calculates dphistar + // + + auto phi1 = phi(track1.px(), track1.py()); + auto pt1 = track1.pt(); + auto charge1 = track1.sign(); + + auto phi2 = phi(track2.px(), track2.py()); + auto pt2 = track2.pt(); + auto charge2 = track2.sign(); + + float dphistar = phi1 - phi2 - charge1 * std::asin(0.015 * magField * radius / pt1) + charge2 * std::asin(0.015 * magField * radius / pt2); + + if (dphistar > PI) { + dphistar = TwoPI - dphistar; + } + if (dphistar < -PI) { + dphistar = -TwoPI - dphistar; + } + if (dphistar > PI) { // might look funny but is needed + dphistar = TwoPI - dphistar; + } + + return dphistar; +} + +#endif // PWGUD_CORE_UPCPAIRCUTS_H_ diff --git a/PWGUD/Tasks/CMakeLists.txt b/PWGUD/Tasks/CMakeLists.txt index 2f78f0629b4..a193e46587e 100644 --- a/PWGUD/Tasks/CMakeLists.txt +++ b/PWGUD/Tasks/CMakeLists.txt @@ -146,7 +146,7 @@ o2physics_add_dpl_workflow(exclusive-phi o2physics_add_dpl_workflow(upc-photonuclear-jmg SOURCES upcPhotonuclearAnalysisJMG.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::ReconstructionDataFormats O2::DetectorsBase O2::DetectorsCommonDataFormats + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore O2::ReconstructionDataFormats O2::DetectorsBase O2::DetectorsCommonDataFormats COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(exclusive-two-protons diff --git a/PWGUD/Tasks/upcPhotonuclearAnalysisJMG.cxx b/PWGUD/Tasks/upcPhotonuclearAnalysisJMG.cxx index 81834492eca..995e04a8335 100644 --- a/PWGUD/Tasks/upcPhotonuclearAnalysisJMG.cxx +++ b/PWGUD/Tasks/upcPhotonuclearAnalysisJMG.cxx @@ -11,10 +11,17 @@ /// /// \brief /// \author Josué Martínez García, josuem@cern.ch +/// \file upcPhotonuclearAnalysisJMG.cxx + +#include #include "Framework/AnalysisDataModel.h" #include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" +#include "CCDB/BasicCCDBManager.h" +#include "Framework/StepTHn.h" +#include "CommonConstants/MathConstants.h" +#include #include "Common/CCDB/EventSelectionParams.h" #include "Common/Core/TrackSelection.h" @@ -22,38 +29,66 @@ #include "Common/Core/trackUtilities.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/TrackSelectionTables.h" +#include "PWGCF/Core/CorrelationContainer.h" +#include "DataFormatsParameters/GRPObject.h" #include "PWGUD/DataModel/UDTables.h" +#include "PWGUD/Core/UPCPairCuts.h" #include "PWGUD/Core/UPCTauCentralBarrelHelperRL.h" using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; +using namespace constants::math; +namespace o2::aod +{ +namespace tree +{ +DECLARE_SOA_COLUMN(PtSideA, ptSideA, std::vector); +DECLARE_SOA_COLUMN(RapSideA, rapSideA, std::vector); +DECLARE_SOA_COLUMN(PhiSideA, phiSideA, std::vector); +DECLARE_SOA_COLUMN(PtSideC, ptSideC, std::vector); +DECLARE_SOA_COLUMN(RapSideC, rapSideC, std::vector); +DECLARE_SOA_COLUMN(PhiSideC, phiSideC, std::vector); +DECLARE_SOA_COLUMN(NchSideA, nchSideA, int); +DECLARE_SOA_COLUMN(MultiplicitySideA, multiplicitySideA, int); +DECLARE_SOA_COLUMN(NchSideC, nchSideC, int); +DECLARE_SOA_COLUMN(MultiplicitySideC, multiplicitySideC, int); +} // namespace tree +DECLARE_SOA_TABLE(TREE, "AOD", "Tree", + tree::PtSideA, + tree::RapSideA, + tree::PhiSideA, + tree::PtSideC, + tree::RapSideC, + tree::PhiSideC, + tree::NchSideA, + tree::MultiplicitySideA, + tree::NchSideC, + tree::MultiplicitySideC); +} // namespace o2::aod + +static constexpr float CFGPairCutDefaults[1][5] = {{-1, -1, -1, -1, -1}}; struct upcPhotonuclearAnalysisJMG { + Produces tree; HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; // Declare configurables on events/collisions - Configurable cutMyPosZMin{"cutMyPosZMin", -10., {"My collision cut"}}; - Configurable cutMyPosZMax{"cutMyPosZMax", 10., {"My collision cut"}}; - Configurable cutMyTimeZNA{"cutMyTimeZNA", 2., {"My collision cut"}}; - Configurable cutMyTimeZNC{"cutMyTimeZNC", 2., {"My collision cut"}}; + Configurable myZVtxCut{"myZVtxCut", 10., {"My collision cut"}}; + Configurable myTimeZNACut{"myTimeZNACut", 2., {"My collision cut"}}; + Configurable myTimeZNCCut{"myTimeZNCCut", 2., {"My collision cut"}}; // Declare configurables on side A gap Configurable cutAGapMyEnergyZNAMax{"cutAGapMyEnergyZNAMax", 0., {"My collision cut. A Gap"}}; - Configurable cutAGapMyAmplitudeFT0AMax{"cutAGapMyAmplitudeFT0AMax", 200., {"My collision cut. A Gap"}}; + // Configurable cutAGapMyAmplitudeFT0AMax{"cutAGapMyAmplitudeFT0AMax", 200., {"My collision cut. A Gap"}}; Configurable cutAGapMyEnergyZNCMin{"cutAGapMyEnergyZNCMin", 1., {"My collision cut. A Gap"}}; - Configurable cutAGapMyAmplitudeFT0CMin{"cutAGapMyAmplitudeFT0CMin", 0., {"My collision cut. A Gap"}}; + // Configurable cutAGapMyAmplitudeFT0CMin{"cutAGapMyAmplitudeFT0CMin", 0., {"My collision cut. A Gap"}}; // Declare configurables on side C gap Configurable cutCGapMyEnergyZNAMin{"cutCGapMyEnergyZNAMin", 1., {"My collision cut. C Gap"}}; - Configurable cutCGapMyAmplitudeFT0AMin{"cutCGapMyAmplitudeFT0AMin", 0., {"My collision cut. A Gap"}}; + // Configurable cutCGapMyAmplitudeFT0AMin{"cutCGapMyAmplitudeFT0AMin", 0., {"My collision cut. A Gap"}}; Configurable cutCGapMyEnergyZNCMax{"cutCGapMyEnergyZNCMax", 0., {"My collision cut. C Gap"}}; - Configurable cutCGapMyAmplitudeFT0CMax{"cutCGapMyAmplitudeFT0CMax", 200., {"My collision cut. A Gap"}}; - // Declare configurables on both side gap - Configurable cutBothGapMyEnergyZNAMax{"cutBothGapMyEnergyZNAMax", 0., {"My collision cut. Both Gap"}}; - Configurable cutBothGapMyAmplitudeFT0AMax{"cutBothGapMyAmplitudeFT0AMax", 200., {"My collision cut. A Gap"}}; - Configurable cutBothGapMyEnergyZNCMax{"cutBothGapMyEnergyZNCMax", 0., {"My collision cut. Both Gap"}}; - Configurable cutBothGapMyAmplitudeFT0CMax{"cutBothGapMyAmplitudeFT0CMax", 200., {"My collision cut. A Gap"}}; + // Configurable cutCGapMyAmplitudeFT0CMax{"cutCGapMyAmplitudeFT0CMax", 200., {"My collision cut. A Gap"}}; // Declare configurables on tracks Configurable cutMyptMin{"cutMyptMin", 0.15, {"My Track cut"}}; Configurable cutMyptMax{"cutMyptMax", 10., {"My Track cut"}}; @@ -72,10 +107,35 @@ struct upcPhotonuclearAnalysisJMG { Configurable cutMyTPCNClsCrossedRowsOverNClsFindableMin{"cutMyTPCNClsCrossedRowsOverNClsFindableMin", 0.8f, {"My Track cut"}}; Configurable cutMyTPCNClsOverFindableNClsMin{"cutMyTPCNClsOverFindableNClsMin", 0.5f, {"My Track cut"}}; Configurable cutMyTPCChi2NclMax{"cutMyTPCChi2NclMax", 4.f, {"My Track cut"}}; + Configurable> cfgPairCut{"cfgPairCut", + {CFGPairCutDefaults[0], + 5, + {"Photon", "K0", "Lambda", "Phi", "Rho"}}, + "Pair cuts on various particles"}; + Configurable cfgTwoTrackCut{"cfgTwoTrackCut", -1, {"Two track cut"}}; + ConfigurableAxis axisVertex{"axisVertex", {10, -10, 10}, "vertex axis for histograms"}; + ConfigurableAxis axisDeltaPhi{"axisDeltaPhi", {72, -constants::math::PIHalf, constants::math::PIHalf * 3}, "delta phi axis for histograms"}; + ConfigurableAxis axisDeltaEta{"axisDeltaEta", {40, -2, 2}, "delta eta axis for histograms"}; + ConfigurableAxis axisPtTrigger{"axisPtTrigger", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt trigger axis for histograms"}; + ConfigurableAxis axisPtAssoc{"axisPtAssoc", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0}, "pt associated axis for histograms"}; + ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110.1}, "multiplicity / multiplicity axis for histograms"}; + ConfigurableAxis axisVertexEfficiency{"axisVertexEfficiency", {10, -10, 10}, "vertex axis for efficiency histograms"}; + ConfigurableAxis axisEtaEfficiency{"axisEtaEfficiency", {20, -1.0, 1.0}, "eta axis for efficiency histograms"}; + ConfigurableAxis axisPtEfficiency{"axisPtEfficiency", {VARIABLE_WIDTH, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0}, "pt axis for efficiency histograms"}; + + Filter collisionZVtxFilter = nabs(aod::collision::posZ) < myZVtxCut; + Filter collisionZNTimeFilter = nabs(aod::udzdc::timeZNA) < myTimeZNACut && nabs(aod::udzdc::timeZNC) < myTimeZNCCut; - using FullSGUDCollision = soa::Join::iterator; + using FullSGUDCollision = soa::Filtered>; using FullUDTracks = soa::Join; + // Output definitions + OutputObj same{"sameEvent"}; + OutputObj mixed{"mixedEvent"}; + + UPCPairCuts mPairCuts; + bool doPairCuts = false; + void init(InitContext const&) { const AxisSpec axisCollision{4, -0.5, 3.5}; @@ -83,9 +143,9 @@ struct upcPhotonuclearAnalysisJMG { const AxisSpec axisPt{402, -0.05, 20.05}; const AxisSpec axisP{402, -10.05, 10.05}; const AxisSpec axisTPCSignal{802, -0.05, 400.05}; - const AxisSpec axisPhi{64, -2 * o2::constants::math::PI, 2 * o2::constants::math::PI}; + const AxisSpec axisPhi{64, -2 * PI, 2 * PI}; const AxisSpec axisEta{50, -1.2, 1.2}; - const AxisSpec axisNch{101, -0.5, 100.5}; + const AxisSpec axisNch{201, -0.5, 200.5}; const AxisSpec axisZNEnergy{1002, -0.5, 500.5}; const AxisSpec axisZNTime{21, -10.5, 10.5}; const AxisSpec axisFT0Amplitud{201, -0.5, 200.5}; @@ -93,6 +153,21 @@ struct upcPhotonuclearAnalysisJMG { const AxisSpec axisChi2NCls{100, 0, 50}; const AxisSpec axisTPCNClsCrossedRowsMin{100, -0.05, 2.05}; + histos.add("yields", "multiplicity vs pT vs eta", {HistType::kTH3F, {{100, 0, 100, "multiplicity"}, {40, 0, 20, "p_{T}"}, {100, -2, 2, "#eta"}}}); + histos.add("etaphi", "multiplicity vs eta vs phi", {HistType::kTH3F, {{100, 0, 100, "multiplicity"}, {100, -2, 2, "#eta"}, {200, 0, 2 * PI, "#varphi"}}}); + + const int maxMixBin = axisMultiplicity->size() * axisVertex->size(); + histos.add("eventcount", "bin", {HistType::kTH1F, {{maxMixBin + 2, -2.5, -0.5 + maxMixBin, "bin"}}}); + mPairCuts.setHistogramRegistry(&histos); + if (cfgPairCut->get("Photon") > 0 || cfgPairCut->get("K0") > 0 || cfgPairCut->get("Lambda") > 0 || + cfgPairCut->get("Phi") > 0 || cfgPairCut->get("Rho") > 0) { + mPairCuts.setPairCut(UPCPairCuts::Photon, cfgPairCut->get("Photon")); + mPairCuts.setPairCut(UPCPairCuts::K0, cfgPairCut->get("K0")); + mPairCuts.setPairCut(UPCPairCuts::Lambda, cfgPairCut->get("Lambda")); + mPairCuts.setPairCut(UPCPairCuts::Phi, cfgPairCut->get("Phi")); + mPairCuts.setPairCut(UPCPairCuts::Rho, cfgPairCut->get("Rho")); + doPairCuts = true; + } histos.add("Events/hCountCollisions", "0 total - 1 side A - 2 side C - 3 both side; Number of analysed collision; counts", kTH1F, {axisCollision}); // histos to selection gap in side A @@ -112,8 +187,9 @@ struct upcPhotonuclearAnalysisJMG { histos.add("Tracks/SGsideA/hTrackTPCChi2NCls", "#it{N Clusters Chi2 TPC} distribution; #it{N Clusters Chi2 TPC}; counts", kTH1F, {axisChi2NCls}); histos.add("Tracks/SGsideA/hTrackITSNClsTPCCls", "#it{ITS Clusters vs TPC Clusters}; #it{TPC Clusters}; #it{ITS Clusters}", kTH2F, {axisNCls, axisNCls}); - histos.add("Events/SGsideA/hTrackZVtx", "vertex in z; z (cm); counts", kTH1F, {axisZvtx}); + histos.add("Events/SGsideA/hZVtx", "vertex in z; z (cm); counts", kTH1F, {axisZvtx}); histos.add("Events/SGsideA/hNch", "#it{Charged Tracks Multiplicity} distribution; #it{Charged Tracks Multiplicity}; counts", kTH1F, {axisNch}); + histos.add("Events/SGsideA/hMultiplicity", "#it{Multiplicity} distribution; #it{Multiplicity}; counts", kTH1F, {axisNch}); histos.add("Events/SGsideA/hPtVSNch", "#it{ #LT p_{T} #GT } vs #it{Charged Tracks Multiplicity}; #it{Charged Tracks Multiplicity}; #it{ #LT p_{T} #GT }", kTH2F, {axisNch, axisPt}); histos.add("Events/SGsideA/hEnergyZNA", "Energy in side A distribution; Energy in side A; counts", kTH1F, {axisZNEnergy}); histos.add("Events/SGsideA/hEnergyZNC", "Energy in side C distribution; Energy in side C; counts", kTH1F, {axisZNEnergy}); @@ -141,8 +217,9 @@ struct upcPhotonuclearAnalysisJMG { histos.add("Tracks/SGsideC/hTrackTPCChi2NCls", "#it{N Clusters Chi2 TPC} distribution; #it{N Clusters Chi2 TPC}; counts", kTH1F, {axisChi2NCls}); histos.add("Tracks/SGsideC/hTrackITSNClsTPCCls", "#it{ITS Clusters vs TPC Clusters}; #it{TPC Clusters}; #it{ITS Clusters}", kTH2F, {axisNCls, axisNCls}); - histos.add("Events/SGsideC/hTrackZVtx", "vertex in z; z (cm); counts", kTH1F, {axisZvtx}); + histos.add("Events/SGsideC/hZVtx", "vertex in z; z (cm); counts", kTH1F, {axisZvtx}); histos.add("Events/SGsideC/hNch", "#it{Charged Tracks Multiplicity} distribution; #it{Charged Tracks Multiplicity}; counts", kTH1F, {axisNch}); + histos.add("Events/SGsideC/hMultiplicity", "#it{Multiplicity} distribution; #it{Multiplicity}; counts", kTH1F, {axisNch}); histos.add("Events/SGsideC/hPtVSNch", "#it{ #LT p_{T} #GT } vs #it{Charged Tracks Multiplicity}; #it{Charged Tracks Multiplicity}; #it{ #LT p_{T} #GT }", kTH2F, {axisNch, axisPt}); histos.add("Events/SGsideC/hEnergyZNA", "Energy in side A distribution; Energy in side A; counts", kTH1F, {axisZNEnergy}); histos.add("Events/SGsideC/hEnergyZNC", "Energy in side C distribution; Energy in side C; counts", kTH1F, {axisZNEnergy}); @@ -153,43 +230,35 @@ struct upcPhotonuclearAnalysisJMG { histos.add("Events/SGsideC/hAmplitudFT0A", "Amplitud in side A distribution; Amplitud in side A; counts", kTH1F, {axisFT0Amplitud}); histos.add("Events/SGsideC/hAmplitudFT0C", "Amplitud in side C distribution; Amplitud in side C; counts", kTH1F, {axisFT0Amplitud}); - // histos to selection gap in both sides - histos.add("Tracks/SGsideBoth/hTrackPt", "#it{p_{T}} distribution; #it{p_{T}}; counts", kTH1F, {axisPt}); - histos.add("Tracks/SGsideBoth/hTrackPhi", "#it{#phi} distribution; #it{#phi}; counts", kTH1F, {axisPhi}); - histos.add("Tracks/SGsideBoth/hTrackEta", "#it{#eta} distribution; #it{#eta}; counts", kTH1F, {axisEta}); - histos.add("Tracks/SGsideBoth/hTrackTPCSignnalP", "#it{TPC dE/dx vs p}; #it{p*charge}; #it{TPC dE/dx}", kTH2F, {axisP, axisTPCSignal}); - histos.add("Tracks/SGsideBoth/hTrackITSNCls", "#it{N Clusters ITS} distribution; #it{N Clusters ITS}; counts", kTH1F, {axisNCls}); - histos.add("Tracks/SGsideBoth/hTrackITSChi2NCls", "#it{N Clusters Chi2 ITS} distribution; #it{N Clusters Chi2 ITS}; counts", kTH1F, {axisChi2NCls}); - histos.add("Tracks/SGsideBoth/hTrackNClsCrossedRowsOverNCls", "#it{NClsCrossedRows/FindableNCls} distribution in TPC; #it{NClsCrossedRows/FindableNCls}; counts", kTH1F, {axisTPCNClsCrossedRowsMin}); - histos.add("Tracks/SGsideBoth/hTrackTPCNClsCrossedRows", "#it{Number of crossed TPC Rows} distribution; #it{Number of crossed TPC Rows}; counts", kTH1F, {axisNCls}); - histos.add("Tracks/SGsideBoth/hTrackTPCNClsFindable", "#it{Findable TPC clusters for this track} distribution; #it{Findable TPC clusters for this track}; counts", kTH1F, {axisNCls}); - histos.add("Tracks/SGsideBoth/hTrackTPCChi2NCls", "#it{N Clusters Chi2 TPC} distribution; #it{N Clusters Chi2 TPC}; counts", kTH1F, {axisChi2NCls}); - histos.add("Tracks/SGsideBoth/hTrackITSNClsTPCCls", "#it{ITS Clusters vs TPC Clusters}; #it{TPC Clusters}; #it{ITS Clusters}", kTH2F, {axisNCls, axisNCls}); - - histos.add("Events/SGsideBoth/hTrackZVtx", "vertex in z; z (cm); counts", kTH1F, {axisZvtx}); - histos.add("Events/SGsideBoth/hNch", "#it{Charged Tracks Multiplicity} distribution; #it{Charged Tracks Multiplicity}; counts", kTH1F, {axisNch}); - histos.add("Events/SGsideBoth/hPtVSNch", "#it{ #LT p_{T} #GT } vs #it{Charged Tracks Multiplicity}; #it{Charged Tracks Multiplicity}; #it{ #LT p_{T} #GT }", kTH2F, {axisNch, axisPt}); - histos.add("Events/SGsideBoth/hEnergyZNA", "Energy in side A distribution; Energy in side A; counts", kTH1F, {axisZNEnergy}); - histos.add("Events/SGsideBoth/hEnergyZNC", "Energy in side C distribution; Energy in side C; counts", kTH1F, {axisZNEnergy}); - histos.add("Events/SGsideBoth/hEnergyRelationSides", "Energy in side A vs energy in side C; Energy in side A; Energy in side C", kTH2F, {axisZNEnergy, axisZNEnergy}); - histos.add("Events/SGsideBoth/hTimeZNA", "Time in side A distribution; Time in side A; counts", kTH1F, {axisZNTime}); - histos.add("Events/SGsideBoth/hTimeZNC", "Time in side C distribution; Time in side C; counts", kTH1F, {axisZNTime}); - histos.add("Events/SGsideBoth/hTimeRelationSides", "Time in side A vs time in side C; Time in side A; Time in side C", kTH2F, {axisZNTime, axisZNTime}); - histos.add("Events/SGsideBoth/hAmplitudFT0A", "Amplitud in side A distribution; Amplitud in side A; counts", kTH1F, {axisFT0Amplitud}); - histos.add("Events/SGsideBoth/hAmplitudFT0C", "Amplitud in side C distribution; Amplitud in side C; counts", kTH1F, {axisFT0Amplitud}); + std::vector corrAxis = {{axisDeltaEta, "#Delta#eta"}, + {axisPtAssoc, "p_{T} (GeV/c)"}, + {axisPtTrigger, "p_{T} (GeV/c)"}, + {axisMultiplicity, "multiplicity / multiplicity"}, + {axisDeltaPhi, "#Delta#varphi (rad)"}, + {axisVertex, "z-vtx (cm)"}}; + std::vector effAxis = {{axisEtaEfficiency, "#eta"}, + {axisEtaEfficiency, "#eta"}, + {axisPtEfficiency, "p_{T} (GeV/c)"}, + {axisVertexEfficiency, "z-vtx (cm)"}}; + same.setObject(new CorrelationContainer("sameEvent", "sameEvent", corrAxis, effAxis, {})); + mixed.setObject(new CorrelationContainer("mixedEvent", "mixedEvent", corrAxis, effAxis, {})); } - template - bool isGlobalCollisionCut(C const& collision) - { - if (collision.posZ() < cutMyPosZMin || cutMyPosZMax < collision.posZ()) { - return false; - } - if ((std::abs(collision.timeZNA()) < cutMyTimeZNA && std::abs(collision.timeZNC()) < cutMyTimeZNC) == false) { - return false; - } - return true; - } + std::vector vtxBinsEdges{VARIABLE_WIDTH, -10.0f, -7.0f, -5.0f, -2.0f, 0.0f, 2.0f, 5.0f, 7.0f, 10.0f}; + std::vector multBinsEdges{VARIABLE_WIDTH, 0.0f, 50.0f, 400.0f}; + SliceCache cache; + + // Binning only on PosZ without multiplicity + using BinningType = ColumnBinningPolicy; + BinningType bindingOnVtx{{vtxBinsEdges}, true}; + SameKindPair pairs{bindingOnVtx, 5, -1, &cache}; + + // ColumnBinningPolicy bindingOnVtx{{vtxBinsEdges, multBinsEdges}, true}; + + // SameKindPair, + // FullUDTracks, + // ColumnBinningPolicy> + // pair{bindingOnVtx, 5, -1, &cache}; template bool isCollisionCutSG(CSG const& collision, int SideGap) @@ -199,25 +268,17 @@ struct upcPhotonuclearAnalysisJMG { if ((collision.energyCommonZNA() < cutAGapMyEnergyZNAMax && collision.energyCommonZNC() >= cutAGapMyEnergyZNCMin) == false) { // 0n - A side && Xn - C Side return false; } - if ((collision.totalFT0AmplitudeA() < cutAGapMyAmplitudeFT0AMax && collision.totalFT0AmplitudeC() >= cutAGapMyAmplitudeFT0CMin) == false) { - return false; - } + // if ((collision.totalFT0AmplitudeA() < cutAGapMyAmplitudeFT0AMax && collision.totalFT0AmplitudeC() >= cutAGapMyAmplitudeFT0CMin) == false) { + // return false; + // } break; case 1: // Gap in C side if ((collision.energyCommonZNA() >= cutCGapMyEnergyZNAMin && collision.energyCommonZNC() < cutCGapMyEnergyZNCMax) == false) { // Xn - A side && 0n - C Side return false; } - if ((collision.totalFT0AmplitudeA() >= cutCGapMyAmplitudeFT0AMin && collision.totalFT0AmplitudeC() < cutCGapMyAmplitudeFT0CMax) == false) { - return false; - } - break; - case 2: // Gap in Both Sides - if ((collision.energyCommonZNA() < cutBothGapMyEnergyZNAMax && collision.energyCommonZNC() < cutBothGapMyEnergyZNCMax) == false) { // 0n - A side && 0n - C Side - return false; - } - if ((collision.totalFT0AmplitudeA() < cutBothGapMyAmplitudeFT0AMax && collision.totalFT0AmplitudeC() < cutBothGapMyAmplitudeFT0CMax) == false) { - return false; - } + // if ((collision.totalFT0AmplitudeA() >= cutCGapMyAmplitudeFT0AMin && collision.totalFT0AmplitudeC() < cutCGapMyAmplitudeFT0CMax) == false) { + // return false; + // } break; } return true; @@ -281,19 +342,67 @@ struct upcPhotonuclearAnalysisJMG { return true; } - void processSG(FullSGUDCollision const& reconstructedCollision, FullUDTracks const& reconstructedTracks) + template + void fillQAUD(const TTracks tracks) + { + for (auto& track : tracks) { + histos.fill(HIST("yields"), tracks.size(), track.pt(), eta(track.px(), track.py(), track.pz())); + histos.fill(HIST("etaphi"), tracks.size(), eta(track.px(), track.py(), track.pz()), phi(track.px(), track.py())); + } + } + + template + bool fillCollisionUD(TTarget target, float multiplicity) + { + target->fillEvent(multiplicity, CorrelationContainer::kCFStepAll); + target->fillEvent(multiplicity, CorrelationContainer::kCFStepReconstructed); + return true; + } + + template + void fillCorrelationsUD(TTarget target, const TTracks tracks1, const TTracks tracks2, float multiplicity, float posZ) + { + multiplicity = tracks1.size(); + for (auto& track1 : tracks1) { + if (isTrackCut(track1) == false) { + continue; + } + target->getTriggerHist()->Fill(CorrelationContainer::kCFStepReconstructed, track1.pt(), multiplicity, posZ, 1.0); + for (auto& track2 : tracks2) { + if (track1 == track2) { + continue; + } + if (isTrackCut(track2) == false) { + continue; + } + if (doPairCuts && mPairCuts.conversionCuts(track1, track2)) { + continue; + } + float deltaPhi = phi(track1.px(), track1.py()) - phi(track2.px(), track2.py()); + if (deltaPhi > 1.5f * PI) { + deltaPhi -= TwoPI; + } + if (deltaPhi < -PIHalf) { + deltaPhi += TwoPI; + } + target->getPairHist()->Fill(CorrelationContainer::kCFStepReconstructed, eta(track1.px(), track1.py(), track1.pz()) - eta(track2.px(), track2.py(), track2.pz()), track2.pt(), track1.pt(), multiplicity, deltaPhi, posZ, 1.0); + } + } + } + + void processSG(FullSGUDCollision::iterator const& reconstructedCollision, FullUDTracks const& reconstructedTracks) { histos.fill(HIST("Events/hCountCollisions"), 0); - int SGside = reconstructedCollision.gapSide(); + int sgSide = reconstructedCollision.gapSide(); int nTracksCharged = 0; float sumPt = 0; + std::vector vTrackPtSideA, vTrackEtaSideA, vTrackPhiSideA; + std::vector vTrackPtSideC, vTrackEtaSideC, vTrackPhiSideC; + int nTracksChargedSideA(-222), nTracksChargedSideC(-222); + int multiplicitySideA(-222), multiplicitySideC(-222); - if (isGlobalCollisionCut(reconstructedCollision) == false) { - return; - } - - switch (SGside) { - case 0: // for side A + switch (sgSide) { + case 0: // gap for side A if (isCollisionCutSG(reconstructedCollision, 0) == false) { return; } @@ -304,7 +413,7 @@ struct upcPhotonuclearAnalysisJMG { histos.fill(HIST("Events/SGsideA/hTimeZNA"), reconstructedCollision.timeZNA()); histos.fill(HIST("Events/SGsideA/hTimeZNC"), reconstructedCollision.timeZNC()); histos.fill(HIST("Events/SGsideA/hTimeRelationSides"), reconstructedCollision.timeZNA(), reconstructedCollision.timeZNC()); - histos.fill(HIST("Events/SGsideA/hTrackZVtx"), reconstructedCollision.posZ()); + histos.fill(HIST("Events/SGsideA/hZVtx"), reconstructedCollision.posZ()); histos.fill(HIST("Events/SGsideA/hAmplitudFT0A"), reconstructedCollision.totalFT0AmplitudeA()); histos.fill(HIST("Events/SGsideA/hAmplitudFT0C"), reconstructedCollision.totalFT0AmplitudeC()); for (auto& track : reconstructedTracks) { @@ -318,6 +427,9 @@ struct upcPhotonuclearAnalysisJMG { histos.fill(HIST("Tracks/SGsideA/hTrackPhi"), phi(track.px(), track.py())); histos.fill(HIST("Tracks/SGsideA/hTrackEta"), eta(track.px(), track.py(), track.pz())); histos.fill(HIST("Tracks/SGsideA/hTrackTPCSignnalP"), momentum(track.px(), track.py(), track.pz()) * track.sign(), track.tpcSignal()); + vTrackPtSideA.push_back(track.pt()); + vTrackEtaSideA.push_back(eta(track.px(), track.py(), track.pz())); + vTrackPhiSideA.push_back(phi(track.px(), track.py())); histos.fill(HIST("Tracks/SGsideA/hTrackITSNCls"), track.itsNCls()); histos.fill(HIST("Tracks/SGsideA/hTrackITSChi2NCls"), track.itsChi2NCl()); @@ -333,10 +445,13 @@ struct upcPhotonuclearAnalysisJMG { } } histos.fill(HIST("Events/SGsideA/hNch"), nTracksCharged); + histos.fill(HIST("Events/SGsideA/hMultiplicity"), reconstructedTracks.size()); histos.fill(HIST("Events/SGsideA/hPtVSNch"), nTracksCharged, (sumPt / nTracksCharged)); + nTracksChargedSideA = nTracksCharged; + multiplicitySideA = reconstructedTracks.size(); nTracksCharged = sumPt = 0; break; - case 1: // for side C + case 1: // gap for side C if (isCollisionCutSG(reconstructedCollision, 1) == false) { return; } @@ -347,7 +462,7 @@ struct upcPhotonuclearAnalysisJMG { histos.fill(HIST("Events/SGsideC/hTimeZNA"), reconstructedCollision.timeZNA()); histos.fill(HIST("Events/SGsideC/hTimeZNC"), reconstructedCollision.timeZNC()); histos.fill(HIST("Events/SGsideC/hTimeRelationSides"), reconstructedCollision.timeZNA(), reconstructedCollision.timeZNC()); - histos.fill(HIST("Events/SGsideC/hTrackZVtx"), reconstructedCollision.posZ()); + histos.fill(HIST("Events/SGsideC/hZVtx"), reconstructedCollision.posZ()); histos.fill(HIST("Events/SGsideC/hAmplitudFT0A"), reconstructedCollision.totalFT0AmplitudeA()); histos.fill(HIST("Events/SGsideC/hAmplitudFT0C"), reconstructedCollision.totalFT0AmplitudeC()); for (auto& track : reconstructedTracks) { @@ -361,6 +476,9 @@ struct upcPhotonuclearAnalysisJMG { histos.fill(HIST("Tracks/SGsideC/hTrackPhi"), phi(track.px(), track.py())); histos.fill(HIST("Tracks/SGsideC/hTrackEta"), eta(track.px(), track.py(), track.pz())); histos.fill(HIST("Tracks/SGsideC/hTrackTPCSignnalP"), momentum(track.px(), track.py(), track.pz()) * track.sign(), track.tpcSignal()); + vTrackPtSideC.push_back(track.pt()); + vTrackEtaSideC.push_back(eta(track.px(), track.py(), track.pz())); + vTrackPhiSideC.push_back(phi(track.px(), track.py())); histos.fill(HIST("Tracks/SGsideC/hTrackITSNCls"), track.itsNCls()); histos.fill(HIST("Tracks/SGsideC/hTrackITSChi2NCls"), track.itsChi2NCl()); @@ -376,54 +494,90 @@ struct upcPhotonuclearAnalysisJMG { } } histos.fill(HIST("Events/SGsideC/hNch"), nTracksCharged); + histos.fill(HIST("Events/SGsideC/hMultiplicity"), reconstructedTracks.size()); histos.fill(HIST("Events/SGsideC/hPtVSNch"), nTracksCharged, (sumPt / nTracksCharged)); + nTracksChargedSideC = nTracksCharged; + multiplicitySideC = reconstructedTracks.size(); nTracksCharged = sumPt = 0; break; - case 2: // for both sides - if (isCollisionCutSG(reconstructedCollision, 2) == false) { + default: + return; + break; + } + tree(vTrackPtSideA, vTrackEtaSideA, vTrackPhiSideA, vTrackPtSideC, vTrackEtaSideC, vTrackPhiSideC, nTracksChargedSideA, multiplicitySideA, nTracksChargedSideC, multiplicitySideC); + // nTracksChargedSideA = nTracksChargedSideC = multiplicitySideA = multiplicitySideC = 0; + } + PROCESS_SWITCH(upcPhotonuclearAnalysisJMG, processSG, "Process in UD tables", true); + + void processSame(FullSGUDCollision::iterator const& reconstructedCollision, FullUDTracks const& reconstructedTracks) + { + int sgSide = reconstructedCollision.gapSide(); + + float multiplicity = reconstructedTracks.size(); + switch (sgSide) { + case 0: // gap for side A + if (isCollisionCutSG(reconstructedCollision, 0) == false) { return; } - histos.fill(HIST("Events/hCountCollisions"), 3); - histos.fill(HIST("Events/SGsideBoth/hEnergyZNA"), reconstructedCollision.energyCommonZNA()); - histos.fill(HIST("Events/SGsideBoth/hEnergyZNC"), reconstructedCollision.energyCommonZNC()); - histos.fill(HIST("Events/SGsideBoth/hEnergyRelationSides"), reconstructedCollision.energyCommonZNA(), reconstructedCollision.energyCommonZNC()); - histos.fill(HIST("Events/SGsideBoth/hTimeZNA"), reconstructedCollision.timeZNA()); - histos.fill(HIST("Events/SGsideBoth/hTimeZNC"), reconstructedCollision.timeZNC()); - histos.fill(HIST("Events/SGsideBoth/hTimeRelationSides"), reconstructedCollision.timeZNA(), reconstructedCollision.timeZNC()); - histos.fill(HIST("Events/SGsideBoth/hTrackZVtx"), reconstructedCollision.posZ()); - histos.fill(HIST("Events/SGsideBoth/hAmplitudFT0A"), reconstructedCollision.totalFT0AmplitudeA()); - histos.fill(HIST("Events/SGsideBoth/hAmplitudFT0C"), reconstructedCollision.totalFT0AmplitudeC()); - for (auto& track : reconstructedTracks) { - if (track.sign() == 1 || track.sign() == -1) { - if (isTrackCut(track) == false) { - continue; - } - nTracksCharged++; - sumPt += track.pt(); - histos.fill(HIST("Tracks/SGsideBoth/hTrackPt"), track.pt()); - histos.fill(HIST("Tracks/SGsideBoth/hTrackPhi"), phi(track.px(), track.py())); - histos.fill(HIST("Tracks/SGsideBoth/hTrackEta"), eta(track.px(), track.py(), track.pz())); - histos.fill(HIST("Tracks/SGsideBoth/hTrackTPCSignnalP"), momentum(track.px(), track.py(), track.pz()) * track.sign(), track.tpcSignal()); - - histos.fill(HIST("Tracks/SGsideBoth/hTrackITSNCls"), track.itsNCls()); - histos.fill(HIST("Tracks/SGsideBoth/hTrackITSChi2NCls"), track.itsChi2NCl()); - histos.fill(HIST("Tracks/SGsideBoth/hTrackNClsCrossedRowsOverNCls"), (static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable()))); - histos.fill(HIST("Tracks/SGsideBoth/hTrackTPCNClsCrossedRows"), track.tpcNClsCrossedRows()); - histos.fill(HIST("Tracks/SGsideBoth/hTrackTPCNClsFindable"), track.tpcNClsFindable()); - histos.fill(HIST("Tracks/SGsideBoth/hTrackTPCChi2NCls"), track.tpcChi2NCl()); - histos.fill(HIST("Tracks/SGsideBoth/hTrackITSNClsTPCCls"), track.tpcNClsFindable() - track.tpcNClsFindableMinusFound(), track.itsNCls()); - } + if (fillCollisionUD(same, multiplicity) == false) { + return; } - histos.fill(HIST("Events/SGsideBoth/hNch"), nTracksCharged); - histos.fill(HIST("Events/SGsideBoth/hPtVSNch"), nTracksCharged, (sumPt / nTracksCharged)); - nTracksCharged = sumPt = 0; + LOGF(info, "Filling same events"); + histos.fill(HIST("eventcount"), -2); + fillQAUD(reconstructedTracks); + fillCorrelationsUD(same, reconstructedTracks, reconstructedTracks, multiplicity, reconstructedCollision.posZ()); + break; + case 1: // gap for side C + // if (isCollisionCutSG(reconstructedCollision, 1) == false) { + // return; + // } break; default: return; break; } } - PROCESS_SWITCH(upcPhotonuclearAnalysisJMG, processSG, "Process in UD tables", true); + + PROCESS_SWITCH(upcPhotonuclearAnalysisJMG, processSame, "Process same event", true); + + void processMixed(FullSGUDCollision::iterator const& reconstructedCollision) + { + int sgSide = reconstructedCollision.gapSide(); + // int sgSide = 0; + + for (auto& [collision1, tracks1, collision2, tracks2] : pairs) { + if (collision1.size() == 0 || collision2.size() == 0) { + LOGF(info, "One or both collisions are empty."); + continue; + } + float multiplicity = tracks1.size(); + LOGF(info, "Filling mixed events"); + switch (sgSide) { + case 0: // gap for side A + if (isCollisionCutSG(reconstructedCollision, 0) == false) { + return; + } + if (fillCollisionUD(mixed, multiplicity) == false) { + return; + } + // LOGF(info, ">>> Bin of collision: ", bindingOnVtx.getBin({collision1.posZ()})); + // histos.fill(HIST("eventcount"), bindingOnVtx.getBin({collision1.posZ(), collision1.totalFT0AmplitudeC()})); + histos.fill(HIST("eventcount"), bindingOnVtx.getBin({collision1.posZ()})); + fillCorrelationsUD(mixed, tracks1, tracks2, multiplicity, collision1.posZ()); + break; + case 1: // gap for side C + // if (isCollisionCutSG(reconstructedCollision, 1) == false) { + // return; + // } + break; + default: + return; + break; + } + } + } + + PROCESS_SWITCH(upcPhotonuclearAnalysisJMG, processMixed, "Process mixed events", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From ab109a43e4c774f6788e4860c750acbefb1a4d48 Mon Sep 17 00:00:00 2001 From: Gyula Bencedi Date: Fri, 30 May 2025 14:51:44 +0200 Subject: [PATCH 1463/1650] [Infrastructure] Adding Omar Vazquez as code owner for PWGLF PAG-GEP (#11400) --- CODEOWNERS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index 43f250fdd0b..3891598e0e8 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -41,8 +41,8 @@ /PWGHF @alibuild @vkucera @fcolamar @fgrosa @fcatalan92 @mfaggin @mmazzilli @deepathoms @NicoleBastid @hahassan7 @jpxrk @apalasciano @zhangbiao-phy @gluparel # PWG-LF /PWGLF @alibuild @sustripathy @skundu692 -/PWGLF/Tasks/GlobalEventProperties @alibuild @sustripathy @skundu692 @gbencedi @abmodak -/PWGLF/TableProducer/GlobalEventProperties @alibuild @sustripathy @skundu692 @gbencedi @abmodak +/PWGLF/Tasks/GlobalEventProperties @alibuild @sustripathy @skundu692 @gbencedi @abmodak @omvazque +/PWGLF/TableProducer/GlobalEventProperties @alibuild @sustripathy @skundu692 @gbencedi @abmodak @omvazque /PWGLF/Tasks/Nuspex @alibuild @sustripathy @skundu692 @fmazzasc @chiarapinto @maciacco /PWGLF/TableProducer/Nuspex @alibuild @sustripathy @skundu692 @fmazzasc @chiarapinto @maciacco /PWGLF/Tasks/Resonances @alibuild @sustripathy @skundu692 @dmallick2 @smaff92 From 40bbefcec409b50ac03d197817b83fb7a6c7fe2e Mon Sep 17 00:00:00 2001 From: Anisa Khatun Date: Fri, 30 May 2025 15:19:29 +0200 Subject: [PATCH 1464/1650] [PWGUD] Task update for potential memory leak (#11407) Co-authored-by: akhatun --- PWGUD/AQC/udQC.cxx | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/PWGUD/AQC/udQC.cxx b/PWGUD/AQC/udQC.cxx index b3bc5198a0f..ddaf01338df 100644 --- a/PWGUD/AQC/udQC.cxx +++ b/PWGUD/AQC/udQC.cxx @@ -14,6 +14,7 @@ /// \author Paul Buehler, paul.buehler@oeaw.ac.at /// \since 04.05.2023 +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" @@ -191,8 +192,13 @@ struct UDQC { aod::Zdcs& zdcs, aod::Calos& calos, aod::V0s const& v0s, aod::Cascades const& cascades) { - LOGF(debug, " Start %i", abcrs.size()); + // LOGF(debug, " Start %i", abcrs.size()); + + if (!tracks.size()) + return; + if (collision.numContrib() < 1) + return; bool isDGcandidate = true; registry.get(HIST("collisions/Stat"))->Fill(0., isDGcandidate * 1.); @@ -248,7 +254,7 @@ struct UDQC { if (track.tpcSignal() > maxdEdxTPC) { maxdEdxTPC = track.tpcSignal(); - LOGF(debug, " New maxdEdx TPC %f", maxdEdxTPC); + // LOGF(debug, " New maxdEdx TPC %f", maxdEdxTPC); } // TOF hit? @@ -256,7 +262,7 @@ struct UDQC { registry.get(HIST("tracks/dEdxTOF"))->Fill(track.p() / track.sign(), track.beta()); if (track.tofSignal() > maxdEdxTOF) { maxdEdxTOF = track.tofSignal(); - LOGF(debug, " New maxdEdx TOF %f", maxdEdxTOF); + // LOGF(debug, " New maxdEdx TOF %f", maxdEdxTOF); } // No vertex track with TOF hit? @@ -281,7 +287,7 @@ struct UDQC { if (collision.numContrib() > 0) { rgtrwTOF /= collision.numContrib(); } - LOGF(debug, " PV tracks with TOF: %f [1]", rgtrwTOF); + // LOGF(debug, " PV tracks with TOF: %f [1]", rgtrwTOF); registry.get(HIST("collisions/tResvsrTOFTracks"))->Fill(collision.collisionTimeRes(), rgtrwTOF); registry.get(HIST("collisions/tResvsTOFTrkNoPV"))->Fill(collision.collisionTimeRes(), norgtrwTOF); @@ -429,7 +435,7 @@ struct UDQC { } // define Lorentz vector to create invariant mass lvtmp.SetPtEtaPhiM(track.pt(), track.eta(), track.phi(), mass2Use); - LOGF(debug, "mass %f track pt %f/%f eta %f/%f", mass2Use, track.pt(), lvtmp.Perp(), track.eta(), lvtmp.Eta()); + // LOGF(debug, "mass %f track pt %f/%f eta %f/%f", mass2Use, track.pt(), lvtmp.Perp(), track.eta(), lvtmp.Eta()); if (track.pt() <= diffCuts.minPt() || track.pt() >= diffCuts.maxPt()) { goodpts = false; } @@ -521,7 +527,7 @@ struct UDQC { registry.get(HIST("DG/etaminus"))->Fill(track.eta(), track.phi()); } - LOGF(debug, "dEdx TPC %f TOF %i %f", track.tpcSignal(), track.hasTOF(), track.hasTOF() ? track.tofSignal() : 0.); + // LOGF(debug, "dEdx TPC %f TOF %i %f", track.tpcSignal(), track.hasTOF(), track.hasTOF() ? track.tofSignal() : 0.); if (collision.numContrib() == 2) { registry.get(HIST("DG/dEdxTPC"))->Fill(track.tpcInnerParam() / track.sign(), track.tpcSignal()); registry.get(HIST("DG/trkDCAxy"))->Fill(track.dcaXY()); @@ -562,7 +568,7 @@ struct UDQC { void processCleanFIT1(CC const& collision, BCs const& bct0s, aod::FT0s const& /*ft0s*/, aod::FV0As const& /*fv0as*/, aod::FDDs const& /*fdds*/) { - LOGF(debug, "(); @@ -677,7 +683,7 @@ struct UDQC { // ............................................................................................................... void processFV0(aod::FV0As const& fv0s, BCs const&) { - LOGF(info, " %d", fv0s.size()); + // LOGF(info, " %d", fv0s.size()); if (fv0s.size() <= 0) { return; } @@ -695,7 +701,7 @@ struct UDQC { // ............................................................................................................... void processFT0(aod::FT0s const& ft0s, aod::FT0sCorrected const& ft0scorr, BCs const&) { - LOGF(debug, " %d", ft0s.size()); + // LOGF(debug, " %d", ft0s.size()); for (auto const& collision : ft0scorr) { if (collision.t0ACorrectedValid()) { @@ -729,7 +735,7 @@ struct UDQC { // ............................................................................................................... void processFDD(aod::FDDs const& fdds, BCs const&) { - LOGF(debug, " %d", fdds.size()); + // LOGF(debug, " %d", fdds.size()); for (auto fdd : fdds) { @@ -751,7 +757,7 @@ struct UDQC { // ............................................................................................................... void processZDC(aod::Zdc const& zdc) { - LOGF(debug, " %d", zdc.size()); + // LOGF(debug, " %d", zdc.size()); // Zdc energies registry.get(HIST("ZdcEnergies"))->Fill(0., zdc.energyZEM1()); From 138dcb857c1240a58c5c1c007d2755d1b17d95dd Mon Sep 17 00:00:00 2001 From: Francesco Mazzaschi <43742195+fmazzasc@users.noreply.github.com> Date: Fri, 30 May 2025 15:43:33 +0200 Subject: [PATCH 1465/1650] [PWGLF] Store also secondaries for MC generated particles (#11408) Co-authored-by: Francesco Mazzaschi --- PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx | 2 -- 1 file changed, 2 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx index ecc24c0519b..2494942e9c3 100644 --- a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx +++ b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx @@ -1007,8 +1007,6 @@ struct nucleiSpectra { if (particle.y() > cfgCutRapidityMin && particle.y() < cfgCutRapidityMax) { nuclei::hGenNuclei[iS][particle.pdgCode() < 0]->Fill(1., particle.pt()); } - } else { - continue; /// for not-reconstructed particles we store only the primaries } if (!isReconstructed[index] && (cfgTreeConfig->get(iS, 0u) || cfgTreeConfig->get(iS, 1u))) { From 71396479324826142ba1f695165d508c9cea551d Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Fri, 30 May 2025 23:07:46 +0900 Subject: [PATCH 1466/1650] [PWGEM/Dilepton] update createResolutionMap.cxx (#11409) --- PWGEM/Dilepton/Tasks/createResolutionMap.cxx | 292 +++++++++++-------- 1 file changed, 176 insertions(+), 116 deletions(-) diff --git a/PWGEM/Dilepton/Tasks/createResolutionMap.cxx b/PWGEM/Dilepton/Tasks/createResolutionMap.cxx index 8070c41ac61..6613f88127d 100644 --- a/PWGEM/Dilepton/Tasks/createResolutionMap.cxx +++ b/PWGEM/Dilepton/Tasks/createResolutionMap.cxx @@ -32,6 +32,7 @@ #include "Common/DataModel/Centrality.h" #include "Common/DataModel/CollisionAssociationTables.h" #include "Common/Core/trackUtilities.h" +#include "Common/CCDB/RCTSelectionFlags.h" #include "CCDB/BasicCCDBManager.h" #include "DataFormatsParameters/GRPMagField.h" @@ -45,6 +46,7 @@ #include "MCHTracking/TrackParam.h" #include "ReconstructionDataFormats/TrackFwd.h" #include "PWGEM/Dilepton/Utils/MCUtilities.h" +#include "Common/Core/fwdtrackUtilities.h" using namespace o2; using namespace o2::framework; @@ -52,17 +54,9 @@ using namespace o2::framework::expressions; using namespace o2::aod; using namespace o2::soa; using namespace o2::aod::pwgem::dilepton::utils::mcutil; +using namespace o2::aod::fwdtrackutils; struct CreateResolutionMap { - // Index used to set different options for Muon propagation - enum class MuonExtrapolation : int { - kToVertex = 0, // propagtion to vertex by default - kToDCA = 1, - kToRabs = 2, - }; - using SMatrix55 = ROOT::Math::SMatrix>; - using SMatrix5 = ROOT::Math::SVector; - Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; @@ -87,8 +81,15 @@ struct CreateResolutionMap { ConfigurableAxis ConfPhiGenBins{"ConfPhiGenBins", {72, 0, 2.f * M_PI}, "gen. eta bins at forward rapidity for output histograms"}; ConfigurableAxis ConfRelDeltaPtBins{"ConfRelDeltaPtBins", {200, -1.f, +1.f}, "rel. dpt for output histograms"}; - ConfigurableAxis ConfDeltaEtaBins{"ConfDeltaEtaBins", {100, -0.1f, +0.1f}, "deta bins for output histograms"}; - ConfigurableAxis ConfDeltaPhiBins{"ConfDeltaPhiBins", {100, -0.1f, +0.1f}, "dphi bins for output histograms"}; + ConfigurableAxis ConfDeltaEtaBins{"ConfDeltaEtaBins", {200, -0.5f, +0.5f}, "deta bins for output histograms"}; + ConfigurableAxis ConfDeltaPhiBins{"ConfDeltaPhiBins", {200, -0.5f, +0.5f}, "dphi bins for output histograms"}; + + Configurable cfgRequireGoodRCT{"cfgRequireGoodRCT", false, "require good detector flag in run condtion table"}; + Configurable cfgRCTLabelCB{"cfgRCTLabelCB", "CBT_hadronPID", "select 1 [CBT, CBT_hadron] see O2Physics/Common/CCDB/RCTSelectionFlags.h"}; + Configurable cfgRCTLabelFWDSA{"cfgRCTLabelFWDSA", "CBT_muon", "select 1 [CBT_muon] see O2Physics/Common/CCDB/RCTSelectionFlags.h"}; + Configurable cfgRCTLabelFWDGL{"cfgRCTLabelFWDGL", "CBT_muon_glo", "select 1 [CBT_muon_glo] see O2Physics/Common/CCDB/RCTSelectionFlags.h"}; + Configurable cfgCheckZDC{"cfgCheckZDC", false, "set ZDC flag for PbPb"}; + Configurable cfgTreatLimitedAcceptanceAsBad{"cfgTreatLimitedAcceptanceAsBad", false, "reject all events where the detectors relevant for the specified Runlist are flagged as LimitedAcceptance"}; struct : ConfigurableGroup { std::string prefix = "eventcut_group"; @@ -119,40 +120,55 @@ struct CreateResolutionMap { Configurable cfg_min_pt_track{"cfg_min_pt_track", 0.01, "min pT for single track"}; Configurable cfg_min_eta_track{"cfg_min_eta_track", -1.5, "min eta for single track"}; Configurable cfg_max_eta_track{"cfg_max_eta_track", +1.5, "max eta for single track"}; - Configurable cfg_min_ncluster_tpc{"cfg_min_ncluster_tpc", 90, "min ncluster tpc"}; + Configurable cfg_min_ncluster_tpc{"cfg_min_ncluster_tpc", 0, "min ncluster tpc"}; Configurable cfg_min_ncluster_its{"cfg_min_ncluster_its", 5, "min ncluster its"}; Configurable cfg_min_ncluster_itsib{"cfg_min_ncluster_itsib", 1, "min ncluster itsib"}; - Configurable cfg_min_ncrossedrows{"cfg_min_ncrossedrows", 0, "min ncrossed rows"}; + Configurable cfg_min_ncrossedrows{"cfg_min_ncrossedrows", 80, "min ncrossed rows"}; Configurable cfg_max_chi2tpc{"cfg_max_chi2tpc", 4.0, "max chi2/NclsTPC"}; Configurable cfg_max_chi2its{"cfg_max_chi2its", 5.0, "max chi2/NclsITS"}; Configurable cfg_min_tpc_cr_findable_ratio{"cfg_min_tpc_cr_findable_ratio", 0.8, "min. TPC Ncr/Nf ratio"}; Configurable cfg_max_frac_shared_clusters_tpc{"cfg_max_frac_shared_clusters_tpc", 999.f, "max fraction of shared clusters in TPC"}; - Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 0.2, "max dca XY for single track in cm"}; - Configurable cfg_max_dcaz{"cfg_max_dcaz", 0.2, "max dca Z for single track in cm"}; + Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 1.0, "max dca XY for single track in cm"}; + Configurable cfg_max_dcaz{"cfg_max_dcaz", 1.0, "max dca Z for single track in cm"}; Configurable cfg_require_itsib_1st{"cfg_require_itsib_1st", false, "flag to require ITS ib 1st hit"}; } electroncuts; struct : ConfigurableGroup { std::string prefix = "muoncut_group"; - Configurable cfg_track_type{"cfg_track_type", 3, "muon track type [0: MFT-MCH-MID, 3: MCH-MID]"}; Configurable cfg_min_pt_track{"cfg_min_pt_track", 0.01, "min pT for single track"}; - Configurable cfg_min_eta_track{"cfg_min_eta_track", -5.5, "min eta for single track"}; - Configurable cfg_max_eta_track{"cfg_max_eta_track", -1.5, "max eta for single track"}; + Configurable cfg_min_eta_track_sa{"cfg_min_eta_track_sa", -5.5, "min eta for standalone muon track"}; + Configurable cfg_max_eta_track_sa{"cfg_max_eta_track_sa", -1.5, "max eta for standalone muon track"}; + Configurable cfg_min_eta_track_gl{"cfg_min_eta_track_gl", -5.5, "min eta for global muon track"}; + Configurable cfg_max_eta_track_gl{"cfg_max_eta_track_gl", -1.5, "max eta for global muon track"}; Configurable cfg_min_ncluster_mft{"cfg_min_ncluster_mft", 5, "min ncluster MFT"}; Configurable cfg_min_ncluster_mch{"cfg_min_ncluster_mch", 5, "min ncluster MCH"}; - Configurable cfg_max_chi2{"cfg_max_chi2", 1e+10, "max chi2/NclsTPC"}; - Configurable cfg_max_matching_chi2_mftmch{"cfg_max_matching_chi2_mftmch", 1e+10, "max chi2 for MFT-MCH matching"}; + Configurable cfg_max_chi2_sa{"cfg_max_chi2_sa", 1e+10, "max chi2 for standalone muon track"}; + Configurable cfg_max_chi2_gl{"cfg_max_chi2_gl", 40, "max chi2 for standalone muon track"}; + Configurable cfg_max_matching_chi2_mftmch{"cfg_max_matching_chi2_mftmch", 40, "max chi2 for MFT-MCH matching"}; Configurable cfg_max_matching_chi2_mchmid{"cfg_max_matching_chi2_mchmid", 1e+10, "max chi2 for MCH-MID matching"}; - Configurable cfg_max_dcaxy{"cfg_max_dcaxy", 1e+10, "max dca XY for single track in cm"}; - Configurable cfg_min_rabs{"cfg_min_rabs", 17.6, "min Radius at the absorber end"}; - Configurable cfg_max_rabs{"cfg_max_rabs", 89.5, "max Radius at the absorber end"}; + Configurable cfg_max_dcaxy_gl{"cfg_max_dcaxy_gl", 0.1, "max dca XY for single track in cm"}; + Configurable cfg_min_rabs_sa{"cfg_min_rabs_sa", 17.6, "min Radius at the absorber end for standalone muon track"}; + Configurable cfg_max_rabs_sa{"cfg_max_rabs_sa", 89.5, "max Radius at the absorber end for standalone muon track"}; + Configurable cfg_min_rabs_gl{"cfg_min_rabs_gl", 27.6, "min Radius at the absorber end for global muon track"}; + Configurable cfg_max_rabs_gl{"cfg_max_rabs_gl", 89.5, "max Radius at the absorber end for global muon track"}; + Configurable cfg_mid_rabs{"cfg_mid_rabs", 26.5, "middle R at absorber end for pDCA cut"}; + Configurable cfg_max_pdca_forLargeR{"cfg_max_pdca_forLargeR", 324.f, "max. pDCA for large R at absorber end"}; + Configurable cfg_max_pdca_forSmallR{"cfg_max_pdca_forSmallR", 594.f, "max. pDCA for small R at absorber end"}; + Configurable cfg_min_nclusters_MFT{"cfg_min_nclusters_MFT", 5, "min nclusters MFT"}; + Configurable cfg_min_nclusters_MCH{"min_min_nclusters_MCH", 5, "min nclusters MCH"}; + Configurable cfg_max_reldpt{"cfg_max_reldpt", 1e+10f, "max. relative dpt between MFT-MCH-MID and MCH-MID"}; + Configurable cfg_max_deta{"cfg_max_deta", 1e+10f, "max. deta between MFT-MCH-MID and MCH-MID"}; + Configurable cfg_max_dphi{"cfg_max_dphi", 1e+10f, "max. dphi between MFT-MCH-MID and MCH-MID"}; + Configurable refitGlobalMuon{"refitGlobalMuon", true, "flag to refit global muon"}; } muoncuts; HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject}; + o2::aod::rctsel::RCTFlagsChecker rctCheckerCB; + o2::aod::rctsel::RCTFlagsChecker rctCheckerFWDSA; + o2::aod::rctsel::RCTFlagsChecker rctCheckerFWDGL; o2::ccdb::CcdbApi ccdbApi; Service ccdb; - o2::globaltracking::MatchGlobalFwd mMatching; int mRunNumber = 0; float d_bz; // o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; @@ -176,6 +192,9 @@ struct CreateResolutionMap { ccdb->setLocalObjectValidityChecking(); ccdb->setFatalWhenNull(false); ccdbApi.init(ccdburl); + rctCheckerCB.init(cfgRCTLabelCB.value, cfgCheckZDC.value, cfgTreatLimitedAcceptanceAsBad.value); + rctCheckerFWDSA.init(cfgRCTLabelFWDSA.value, cfgCheckZDC.value, cfgTreatLimitedAcceptanceAsBad.value); + rctCheckerFWDGL.init(cfgRCTLabelFWDGL.value, cfgCheckZDC.value, cfgTreatLimitedAcceptanceAsBad.value); mRunNumber = 0; d_bz = 0; @@ -194,7 +213,7 @@ struct CreateResolutionMap { registry.add("Event/Muon/hImpPar_Centrality", "true imapact parameter vs. estimated centrality;impact parameter (fm);centrality (%)", kTH2F, {{200, 0, 20}, {110, 0, 110}}, true); registry.add("Electron/hPt", "rec. p_{T,l};p_{T,l} (GeV/c)", kTH1F, {{1000, 0, 10}}, false); - registry.add("Electron/hEtaPhi", "rec. #eta vs. #varphi;#varphi_{l} (rad.);#eta_{l}", kTH2F, {{90, 0, 2 * M_PI}, {80, -2, +2}}, false); + registry.add("Electron/hEtaPhi", "rec. #eta vs. #varphi;#varphi_{l} (rad.);#eta_{l}", kTH2F, {{90, 0, 2 * M_PI}, {100, -5, +5}}, false); registry.add("Electron/Ptgen_RelDeltaPt", "resolution", kTH2F, {{axis_pt_gen}, {axis_dpt}}, true); registry.add("Electron/Ptgen_DeltaEta", "resolution", kTH2F, {{axis_pt_gen}, {axis_deta}}, true); registry.add("Electron/Ptgen_DeltaPhi_Pos", "resolution", kTH2F, {{axis_pt_gen}, {axis_dphi}}, true); @@ -429,57 +448,6 @@ struct CreateResolutionMap { return true; } - template - o2::dataformats::GlobalFwdTrack PropagateMuon(T const& muon, C const& collision, const CreateResolutionMap::MuonExtrapolation endPoint) - { - double chi2 = muon.chi2(); - SMatrix5 tpars(muon.x(), muon.y(), muon.phi(), muon.tgl(), muon.signed1Pt()); - std::vector v1{muon.cXX(), muon.cXY(), muon.cYY(), muon.cPhiX(), muon.cPhiY(), - muon.cPhiPhi(), muon.cTglX(), muon.cTglY(), muon.cTglPhi(), muon.cTglTgl(), - muon.c1PtX(), muon.c1PtY(), muon.c1PtPhi(), muon.c1PtTgl(), muon.c1Pt21Pt2()}; - SMatrix55 tcovs(v1.begin(), v1.end()); - o2::track::TrackParCovFwd fwdtrack{muon.z(), tpars, tcovs, chi2}; - o2::dataformats::GlobalFwdTrack propmuon; - - if (static_cast(muon.trackType()) > 2) { // MCH-MID or MCH standalone - o2::dataformats::GlobalFwdTrack track; - track.setParameters(tpars); - track.setZ(fwdtrack.getZ()); - track.setCovariances(tcovs); - auto mchTrack = mMatching.FwdtoMCH(track); - - if (endPoint == CreateResolutionMap::MuonExtrapolation::kToVertex) { - o2::mch::TrackExtrap::extrapToVertex(mchTrack, collision.posX(), collision.posY(), collision.posZ(), collision.covXX(), collision.covYY()); - } - if (endPoint == CreateResolutionMap::MuonExtrapolation::kToDCA) { - o2::mch::TrackExtrap::extrapToVertexWithoutBranson(mchTrack, collision.posZ()); - } - if (endPoint == CreateResolutionMap::MuonExtrapolation::kToRabs) { - o2::mch::TrackExtrap::extrapToZ(mchTrack, -505.); - } - - auto proptrack = mMatching.MCHtoFwd(mchTrack); - propmuon.setParameters(proptrack.getParameters()); - propmuon.setZ(proptrack.getZ()); - propmuon.setCovariances(proptrack.getCovariances()); - } else if (static_cast(muon.trackType()) < 2) { // MFT-MCH-MID - double centerMFT[3] = {0, 0, -61.4}; - o2::field::MagneticField* field = static_cast(TGeoGlobalMagField::Instance()->GetField()); - auto Bz = field->getBz(centerMFT); // Get field at centre of MFT - auto geoMan = o2::base::GeometryManager::meanMaterialBudget(muon.x(), muon.y(), muon.z(), collision.posX(), collision.posY(), collision.posZ()); - auto x2x0 = static_cast(geoMan.meanX2X0); - fwdtrack.propagateToVtxhelixWithMCS(collision.posZ(), {collision.posX(), collision.posY()}, {collision.covXX(), collision.covYY()}, Bz, x2x0); - propmuon.setParameters(fwdtrack.getParameters()); - propmuon.setZ(fwdtrack.getZ()); - propmuon.setCovariances(fwdtrack.getCovariances()); - } - - v1.clear(); - v1.shrink_to_fit(); - - return propmuon; - } - template void fillMuon(TCollision const& collision, TMuon const& muon, const float centrality) { @@ -494,55 +462,99 @@ struct CreateResolutionMap { return; } - o2::dataformats::GlobalFwdTrack propmuonAtPV = PropagateMuon(muon, collision, CreateResolutionMap::MuonExtrapolation::kToVertex); + if (muon.chi2MatchMCHMID() < 0.f) { // this should never happen. only for protection. + return; + } + o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon(muon, collision, propagationPoint::kToVertex); + o2::dataformats::GlobalFwdTrack propmuonAtDCA = propagateMuon(muon, collision, propagationPoint::kToDCA); + float pt = propmuonAtPV.getPt(); float eta = propmuonAtPV.getEta(); float phi = propmuonAtPV.getPhi(); + o2::math_utils::bringTo02Pi(phi); - if (pt < muoncuts.cfg_min_pt_track) { - return; - } + float dcaX = propmuonAtDCA.getX() - collision.posX(); + float dcaY = propmuonAtDCA.getY() - collision.posY(); + float dcaXY = std::sqrt(dcaX * dcaX + dcaY * dcaY); + + float rAtAbsorberEnd = muon.rAtAbsorberEnd(); // this works only for GlobalMuonTrack + float pDCA = muon.p() * dcaXY; + int nClustersMFT = 0; + float ptMatchedMCHMID = propmuonAtPV.getPt(); + float etaMatchedMCHMID = propmuonAtPV.getEta(); + float phiMatchedMCHMID = propmuonAtPV.getPhi(); + o2::math_utils::bringTo02Pi(phiMatchedMCHMID); + + if (muon.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) { + // mcparticle for global MFT-MCH-MID is identical to mcparticle of MCH-MID track. If not, mismatch. + const auto& mchtrack = muon.template matchMCHTrack_as(); // MCH-MID + const auto& mfttrack = muon.template matchMFTTrack_as(); // MFTsa + if (!mchtrack.has_mcParticle() || !mfttrack.has_mcParticle()) { + return; + } + auto mcparticle_MCHMID = mchtrack.template mcParticle_as(); + auto mcparticle_MFT = mfttrack.template mcParticle_as(); + if (mcparticle.globalIndex() != mcparticle_MCHMID.globalIndex()) { // this should not happen. this is only for protection. + return; + } + if (cfg_reject_fake_match_mft_mch && mcparticle.globalIndex() != mcparticle_MFT.globalIndex()) { // evaluate mismatch + return; + } - if (eta < muoncuts.cfg_min_eta_track || muoncuts.cfg_max_eta_track < eta) { - return; - } + o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToVertex); + ptMatchedMCHMID = propmuonAtPV_Matched.getPt(); + etaMatchedMCHMID = propmuonAtPV_Matched.getEta(); + phiMatchedMCHMID = propmuonAtPV_Matched.getPhi(); + o2::math_utils::bringTo02Pi(phiMatchedMCHMID); + o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = propagateMuon(mchtrack, collision, propagationPoint::kToDCA); + float dcaX_Matched = propmuonAtDCA_Matched.getX() - collision.posX(); + float dcaY_Matched = propmuonAtDCA_Matched.getY() - collision.posY(); + float dcaXY_Matched = std::sqrt(dcaX_Matched * dcaX_Matched + dcaY_Matched * dcaY_Matched); + pDCA = mchtrack.p() * dcaXY_Matched; + nClustersMFT = mfttrack.nClusters(); + + if (nClustersMFT < muoncuts.cfg_min_ncluster_mft) { + return; + } + if (muon.chi2MatchMCHMFT() > muoncuts.cfg_max_matching_chi2_mftmch) { + return; + } + if (muoncuts.refitGlobalMuon) { + eta = mfttrack.eta(); + phi = mfttrack.phi(); + o2::math_utils::bringTo02Pi(phi); + pt = propmuonAtPV_Matched.getP() * std::sin(2.f * std::atan(std::exp(-eta))); + } - o2::math_utils::bringTo02Pi(phi); - if (phi < 0.f || 2.f * M_PI < phi) { - return; - } + float dpt = (ptMatchedMCHMID - pt) / pt; + float deta = etaMatchedMCHMID - eta; + float dphi = phiMatchedMCHMID - phi; + o2::math_utils::bringToPMPi(dphi); + if (std::sqrt(std::pow(deta / muoncuts.cfg_max_deta, 2) + std::pow(dphi / muoncuts.cfg_max_dphi, 2)) > 1.f || std::fabs(dpt) > muoncuts.cfg_max_reldpt) { + return; + } - float rAtAbsorberEnd = muon.rAtAbsorberEnd(); - if (muon.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { - o2::dataformats::GlobalFwdTrack propmuonAtRabs = PropagateMuon(muon, collision, CreateResolutionMap::MuonExtrapolation::kToRabs); + } else if (muon.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) { + o2::dataformats::GlobalFwdTrack propmuonAtRabs = propagateMuon(muon, collision, propagationPoint::kToRabs); // this is necessary only for MuonStandaloneTrack float xAbs = propmuonAtRabs.getX(); float yAbs = propmuonAtRabs.getY(); rAtAbsorberEnd = std::sqrt(xAbs * xAbs + yAbs * yAbs); // Redo propagation only for muon tracks // propagation of MFT tracks alredy done in reconstruction - } - - if (rAtAbsorberEnd < muoncuts.cfg_min_rabs || muoncuts.cfg_max_rabs < rAtAbsorberEnd) { - return; - } - - if (rAtAbsorberEnd < 26.5) { - if (muon.pDca() > 594.f) { - return; - } } else { - if (muon.pDca() > 324.f) { - return; - } + return; } - if (muon.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) && muon.chi2MatchMCHMFT() > muoncuts.cfg_max_matching_chi2_mftmch) { + if (muon.nClusters() < muoncuts.cfg_min_ncluster_mch) { return; } - if (cfg_reject_fake_match_mft_mch && muon.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) && o2::aod::pwgem::dilepton::utils::mcutil::hasFakeMatchMFTMCH(muon)) { + if (!isSelectedMuon(pt, eta, rAtAbsorberEnd, pDCA, muon.chi2(), muon.trackType(), dcaXY)) { return; } if (muon.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { + if (cfgRequireGoodRCT && !rctCheckerFWDSA.checkTable(collision)) { + return; + } registry.fill(HIST("StandaloneMuon/hPt"), pt); registry.fill(HIST("StandaloneMuon/hEtaPhi"), phi, eta); registry.fill(HIST("StandaloneMuon/hs_reso"), centrality, mcparticle.pt(), mcparticle.eta(), mcparticle.phi(), -mcparticle.pdgCode() / 13, (mcparticle.pt() - pt) / mcparticle.pt(), mcparticle.eta() - eta, mcparticle.phi() - phi); @@ -554,6 +566,9 @@ struct CreateResolutionMap { registry.fill(HIST("StandaloneMuon/Ptgen_DeltaPhi_Neg"), mcparticle.pt(), mcparticle.phi() - phi); } } else if (muon.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack)) { + if (cfgRequireGoodRCT && !rctCheckerFWDGL.checkTable(collision)) { + return; + } registry.fill(HIST("GlobalMuon/hPt"), pt); registry.fill(HIST("GlobalMuon/hEtaPhi"), phi, eta); registry.fill(HIST("GlobalMuon/hs_reso"), centrality, mcparticle.pt(), mcparticle.eta(), mcparticle.phi(), -mcparticle.pdgCode() / 13, (mcparticle.pt() - pt) / mcparticle.pt(), mcparticle.eta() - eta, mcparticle.phi() - phi); @@ -568,6 +583,45 @@ struct CreateResolutionMap { return; } + bool isSelectedMuon(const float pt, const float eta, const float rAtAbsorberEnd, const float pDCA, const float chi2, const uint8_t trackType, const float dcaXY) + { + if (pt < muoncuts.cfg_min_pt_track) { + return false; + } + if (rAtAbsorberEnd < muoncuts.cfg_min_rabs_sa || muoncuts.cfg_max_rabs_sa < rAtAbsorberEnd) { + return false; + } + if (rAtAbsorberEnd < muoncuts.cfg_mid_rabs ? pDCA > muoncuts.cfg_max_pdca_forSmallR : pDCA > muoncuts.cfg_max_pdca_forLargeR) { + return false; + } + + if (trackType == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack)) { + if (eta < muoncuts.cfg_min_eta_track_gl || muoncuts.cfg_max_eta_track_gl < eta) { + return false; + } + if (muoncuts.cfg_max_dcaxy_gl < dcaXY) { + return false; + } + if (chi2 < 0.f || muoncuts.cfg_max_chi2_gl < chi2) { + return false; + } + if (rAtAbsorberEnd < muoncuts.cfg_min_rabs_gl || muoncuts.cfg_max_rabs_gl < rAtAbsorberEnd) { + return false; + } + } else if (trackType == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) { + if (eta < muoncuts.cfg_min_eta_track_sa || muoncuts.cfg_max_eta_track_sa < eta) { + return false; + } + if (chi2 < 0.f || muoncuts.cfg_max_chi2_sa < chi2) { + return false; + } + } else { + return false; + } + + return true; + } + SliceCache cache; Preslice perCollision_mid = o2::aod::track::collisionId; Preslice perCollision_fwd = o2::aod::fwdtrack::collisionId; @@ -581,9 +635,15 @@ struct CreateResolutionMap { using MyFwdTracks = soa::Join; using MyFwdTrack = MyFwdTracks::iterator; + using MyMFTTracks = soa::Join; + using MyMFTTrack = MyMFTTracks::iterator; + template void fillElectron(TCollision const& collision, TTrack const& track, const float centrality) { + if (cfgRequireGoodRCT && !rctCheckerCB.checkTable(collision)) { + return; + } auto mcparticle = track.template mcParticle_as(); if (std::abs(mcparticle.pdgCode()) != 11 || !(mcparticle.isPhysicalPrimary() || mcparticle.producedByGenerator())) { @@ -628,7 +688,7 @@ struct CreateResolutionMap { void processElectronSA(MyCollisions const& collisions, aod::BCsWithTimestamps const&, MyTracks const& tracks, aod::McCollisions const&, aod::McParticles const&) { - for (auto& collision : collisions) { + for (const auto& collision : collisions) { auto bc = collision.template foundBC_as(); initCCDB(bc); @@ -649,7 +709,7 @@ struct CreateResolutionMap { registry.fill(HIST("Event/Electron/hImpPar_Centrality"), mccollision.impactParameter(), centrality); auto tracks_per_coll = tracks.sliceBy(perCollision_mid, collision.globalIndex()); - for (auto& track : tracks_per_coll) { + for (const auto& track : tracks_per_coll) { if (!track.has_mcParticle()) { continue; } @@ -662,7 +722,7 @@ struct CreateResolutionMap { Preslice trackIndicesPerCollision = aod::track_association::collisionId; void processElectronTTCA(MyCollisions const& collisions, aod::BCsWithTimestamps const&, MyTracks const&, aod::TrackAssoc const& trackIndices, aod::McCollisions const&, aod::McParticles const&) { - for (auto& collision : collisions) { + for (const auto& collision : collisions) { auto bc = collision.template foundBC_as(); initCCDB(bc); @@ -683,7 +743,7 @@ struct CreateResolutionMap { registry.fill(HIST("Event/Electron/hImpPar_Centrality"), mccollision.impactParameter(), centrality); auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, collision.globalIndex()); - for (auto& trackId : trackIdsThisCollision) { + for (const auto& trackId : trackIdsThisCollision) { auto track = trackId.template track_as(); if (!track.has_mcParticle()) { continue; @@ -697,9 +757,9 @@ struct CreateResolutionMap { Partition sa_muons = o2::aod::fwdtrack::trackType == uint8_t(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack); // MCH-MID Partition global_muons = o2::aod::fwdtrack::trackType == uint8_t(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack); // MFT-MCH-MID - void processMuonSA(MyCollisions const& collisions, aod::BCsWithTimestamps const&, MyFwdTracks const&, aod::McCollisions const&, aod::McParticles const&) + void processMuonSA(MyCollisions const& collisions, aod::BCsWithTimestamps const&, MyFwdTracks const&, MyMFTTracks const&, aod::McCollisions const&, aod::McParticles const&) { - for (auto& collision : collisions) { + for (const auto& collision : collisions) { auto bc = collision.template foundBC_as(); initCCDB(bc); @@ -722,14 +782,14 @@ struct CreateResolutionMap { auto sa_muons_per_coll = sa_muons->sliceByCached(o2::aod::fwdtrack::collisionId, collision.globalIndex(), cache); auto global_muons_per_coll = global_muons->sliceByCached(o2::aod::fwdtrack::collisionId, collision.globalIndex(), cache); - for (auto& muon : sa_muons_per_coll) { + for (const auto& muon : sa_muons_per_coll) { if (!muon.has_mcParticle()) { continue; } fillMuon(collision, muon, centrality); } // end of standalone muon loop - for (auto& muon : global_muons_per_coll) { + for (const auto& muon : global_muons_per_coll) { if (!muon.has_mcParticle()) { continue; } @@ -741,9 +801,9 @@ struct CreateResolutionMap { PROCESS_SWITCH(CreateResolutionMap, processMuonSA, "create resolution map for muon at forward rapidity", true); Preslice fwdtrackIndicesPerCollision = aod::track_association::collisionId; - void processMuonTTCA(MyCollisions const& collisions, aod::BCsWithTimestamps const&, MyFwdTracks const&, aod::FwdTrackAssoc const& fwdtrackIndices, aod::McCollisions const&, aod::McParticles const&) + void processMuonTTCA(MyCollisions const& collisions, aod::BCsWithTimestamps const&, MyFwdTracks const&, MyMFTTracks const&, aod::FwdTrackAssoc const& fwdtrackIndices, aod::McCollisions const&, aod::McParticles const&) { - for (auto& collision : collisions) { + for (const auto& collision : collisions) { auto bc = collision.template foundBC_as(); initCCDB(bc); @@ -764,7 +824,7 @@ struct CreateResolutionMap { registry.fill(HIST("Event/Muon/hImpPar_Centrality"), mccollision.impactParameter(), centrality); auto fwdtrackIdsThisCollision = fwdtrackIndices.sliceBy(fwdtrackIndicesPerCollision, collision.globalIndex()); - for (auto& fwdtrackId : fwdtrackIdsThisCollision) { + for (const auto& fwdtrackId : fwdtrackIdsThisCollision) { auto muon = fwdtrackId.template fwdtrack_as(); if (!muon.has_mcParticle()) { continue; From 80ea82ad88cfb13ff991974e081bac4c72fec9fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Fri, 30 May 2025 16:31:56 +0200 Subject: [PATCH 1467/1650] [PWGHF] Include What You Use: Make headers self-contained (#11357) --- PWGHF/Core/CentralityEstimation.h | 17 ++++----- PWGHF/Core/HfHelper.h | 12 ++++--- PWGHF/D2H/DataModel/ReducedDataModel.h | 22 +++++++----- PWGHF/D2H/Macros/HFInvMassFitter.cxx | 35 +++++++++++++------ PWGHF/D2H/Macros/HFInvMassFitter.h | 14 ++++---- .../candidateCreatorCharmResoReduced.cxx | 1 - .../dataCreatorCharmHadPiReduced.cxx | 5 +-- PWGHF/D2H/Tasks/taskCharmResoReduced.cxx | 1 + PWGHF/D2H/Tasks/taskD0.cxx | 3 +- PWGHF/D2H/Tasks/taskDplus.cxx | 3 +- PWGHF/D2H/Tasks/taskLc.cxx | 3 +- PWGHF/D2H/Tasks/taskLcToK0sP.cxx | 1 + PWGHF/D2H/Tasks/taskSigmacToCascade.cxx | 1 + PWGHF/D2H/Tasks/taskXic.cxx | 1 + PWGHF/D2H/Tasks/taskXicc.cxx | 5 +-- PWGHF/D2H/Utils/utilsRedDataFormat.h | 7 +++- .../DataModel/CandidateReconstructionTables.h | 16 ++++----- PWGHF/DataModel/CandidateSelectionTables.h | 8 ++--- PWGHF/DataModel/DerivedTables.h | 12 +++---- PWGHF/HFC/DataModel/CorrelationTables.h | 9 +++-- PWGHF/HFC/DataModel/DMesonPairsTables.h | 5 +-- .../DataModel/DerivedDataCorrelationTables.h | 2 +- PWGHF/HFC/Macros/DhCorrelationExtraction.h | 26 ++++++-------- PWGHF/HFC/Macros/DhCorrelationFitter.h | 7 ++-- PWGHF/HFC/TableProducer/correlatorD0D0bar.cxx | 1 + .../correlatorD0D0barBarrelFullPid.cxx | 1 + .../HFC/TableProducer/correlatorD0Hadrons.cxx | 1 + .../TableProducer/correlatorDMesonPairs.cxx | 1 + .../TableProducer/correlatorDplusDminus.cxx | 1 + .../TableProducer/correlatorDplusHadrons.cxx | 1 + .../HFC/TableProducer/correlatorDsHadrons.cxx | 1 + .../correlatorDsHadronsReduced.cxx | 1 + .../HFC/TableProducer/correlatorLcHadrons.cxx | 3 +- PWGHF/HFC/Tasks/taskCorrelationD0Hadrons.cxx | 1 + PWGHF/HFC/Tasks/taskCorrelationDDbar.cxx | 1 + .../HFC/Tasks/taskCorrelationDplusHadrons.cxx | 3 ++ PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx | 1 + PWGHF/HFC/Tasks/taskCorrelationLcHadrons.cxx | 2 ++ PWGHF/HFC/Utils/utilsCorrelations.h | 11 ++++-- PWGHF/HFL/DataModel/ElectronSelectionTable.h | 5 ++- .../TableProducer/candidateCreator2Prong.cxx | 5 ++- .../TableProducer/candidateCreator3Prong.cxx | 3 ++ PWGHF/TableProducer/candidateCreatorB0.cxx | 3 +- PWGHF/TableProducer/candidateCreatorBplus.cxx | 3 +- PWGHF/TableProducer/candidateCreatorBs.cxx | 1 + .../TableProducer/candidateCreatorCascade.cxx | 3 ++ PWGHF/TableProducer/candidateCreatorDstar.cxx | 6 +++- PWGHF/TableProducer/candidateCreatorMcGen.cxx | 1 - .../candidateCreatorSigmac0plusplus.cxx | 1 + ...candidateCreatorSigmac0plusplusCascade.cxx | 1 + .../candidateCreatorXic0Omegac0.cxx | 1 + .../candidateCreatorXicToXiPiPi.cxx | 2 +- PWGHF/TableProducer/candidateSelectorD0.cxx | 1 + .../candidateSelectorDplusToPiKPi.cxx | 1 + .../candidateSelectorDsToKKPi.cxx | 1 + .../candidateSelectorDstarToD0Pi.cxx | 1 + .../candidateSelectorLcToK0sP.cxx | 1 + .../candidateSelectorOmegac0ToOmegaPi.cxx | 2 +- .../candidateSelectorXiccToPKPiPi.cxx | 1 + PWGHF/TableProducer/trackIndexSkimCreator.cxx | 1 + PWGHF/Tasks/taskMcEfficiencyToXiPi.cxx | 3 +- PWGHF/Tasks/taskMcValidation.cxx | 3 ++ PWGHF/Utils/utilsAnalysis.h | 11 +++--- PWGHF/Utils/utilsBfieldCCDB.h | 16 ++++++--- PWGHF/Utils/utilsDerivedData.h | 15 ++++---- PWGHF/Utils/utilsEvSelHf.h | 21 +++++++---- PWGHF/Utils/utilsMcGen.h | 9 +++-- PWGHF/Utils/utilsPid.h | 7 ++++ PWGHF/Utils/utilsTrkCandHf.h | 6 +++- 69 files changed, 245 insertions(+), 136 deletions(-) diff --git a/PWGHF/Core/CentralityEstimation.h b/PWGHF/Core/CentralityEstimation.h index 203cc4680c8..e575e11aa57 100644 --- a/PWGHF/Core/CentralityEstimation.h +++ b/PWGHF/Core/CentralityEstimation.h @@ -16,6 +16,8 @@ #ifndef PWGHF_CORE_CENTRALITYESTIMATION_H_ #define PWGHF_CORE_CENTRALITYESTIMATION_H_ +#include + namespace o2::hf_centrality { // centrality selection estimators @@ -30,32 +32,27 @@ enum CentralityEstimator { }; template -concept hasFT0ACent = requires(T collision) -{ +concept hasFT0ACent = requires(T collision) { collision.centFT0A(); }; template -concept hasFT0CCent = requires(T collision) -{ +concept hasFT0CCent = requires(T collision) { collision.centFT0C(); }; template -concept hasFT0MCent = requires(T collision) -{ +concept hasFT0MCent = requires(T collision) { collision.centFT0M(); }; template -concept hasFV0ACent = requires(T collision) -{ +concept hasFV0ACent = requires(T collision) { collision.centFV0A(); }; template -concept hasNTracksPVCent = requires(T collision) -{ +concept hasNTracksPVCent = requires(T collision) { collision.centNTPV(); }; diff --git a/PWGHF/Core/HfHelper.h b/PWGHF/Core/HfHelper.h index 929fd2ba256..3f991854956 100644 --- a/PWGHF/Core/HfHelper.h +++ b/PWGHF/Core/HfHelper.h @@ -17,13 +17,15 @@ #ifndef PWGHF_CORE_HFHELPER_H_ #define PWGHF_CORE_HFHELPER_H_ -#include +#include +#include // IWYU pragma: keep (do not replace with Math/Vector4Dfwd.h) -#include "Math/GenVector/Boost.h" -#include "Math/Vector4D.h" -#include +#include +#include -#include "CommonConstants/PhysicsConstants.h" +#include +#include +#include #include "Common/Core/RecoDecay.h" #include "Common/Core/TrackSelectorPID.h" diff --git a/PWGHF/D2H/DataModel/ReducedDataModel.h b/PWGHF/D2H/DataModel/ReducedDataModel.h index 79f5c804dde..eaa6b97cca4 100644 --- a/PWGHF/D2H/DataModel/ReducedDataModel.h +++ b/PWGHF/D2H/DataModel/ReducedDataModel.h @@ -23,13 +23,19 @@ #ifndef PWGHF_D2H_DATAMODEL_REDUCEDDATAMODEL_H_ #define PWGHF_D2H_DATAMODEL_REDUCEDDATAMODEL_H_ +#include +#include + +#include "CommonConstants/PhysicsConstants.h" #include "Framework/AnalysisDataModel.h" #include "Framework/ASoA.h" -#include "ReconstructionDataFormats/Track.h" -#include "ReconstructionDataFormats/Vertex.h" #include "Common/Core/RecoDecay.h" -#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/PIDResponseTOF.h" +#include "Common/DataModel/PIDResponseTPC.h" +#include "Common/DataModel/Qvectors.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/Utils/utilsPid.h" @@ -506,11 +512,11 @@ using HfRedCandBs = soa::Join; namespace hf_cand_lb_reduced { -DECLARE_SOA_INDEX_COLUMN_FULL(Prong0, prong0, int, HfRed3Prongs, "_0"); //! Prong0 index -DECLARE_SOA_INDEX_COLUMN_FULL(Prong1, prong1, int, HfRedTrackBases, "_1"); //! Prong1 index -DECLARE_SOA_COLUMN(Prong0MlScoreBkg, prong0MlScoreBkg, float); //! Bkg ML score of the Lc daughter -DECLARE_SOA_COLUMN(Prong0MlScorePrompt, prong0MlScorePrompt, float); //! Prompt ML score of the Lc daughter -DECLARE_SOA_COLUMN(Prong0MlScoreNonprompt, prong0MlScoreNonprompt, float); //! Nonprompt ML score of the Lc daughter +DECLARE_SOA_INDEX_COLUMN_FULL(Prong0, prong0, int, HfRed3Prongs, "_0"); //! Prong0 index +DECLARE_SOA_INDEX_COLUMN_FULL(Prong1, prong1, int, HfRedTrackBases, "_1"); //! Prong1 index +DECLARE_SOA_COLUMN(Prong0MlScoreBkg, prong0MlScoreBkg, float); //! Bkg ML score of the Lc daughter +DECLARE_SOA_COLUMN(Prong0MlScorePrompt, prong0MlScorePrompt, float); //! Prompt ML score of the Lc daughter +DECLARE_SOA_COLUMN(Prong0MlScoreNonprompt, prong0MlScoreNonprompt, float); //! Nonprompt ML score of the Lc daughter } // namespace hf_cand_lb_reduced DECLARE_SOA_TABLE(HfRedLbProngs, "AOD", "HFREDLBPRONG", //! Table with Lb daughter indices diff --git a/PWGHF/D2H/Macros/HFInvMassFitter.cxx b/PWGHF/D2H/Macros/HFInvMassFitter.cxx index b29661d4b1b..255de80a079 100644 --- a/PWGHF/D2H/Macros/HFInvMassFitter.cxx +++ b/PWGHF/D2H/Macros/HFInvMassFitter.cxx @@ -19,22 +19,35 @@ #include "HFInvMassFitter.h" -#include -#include - -#include -#include #include -#include -#include #include #include +#include +#include #include -#include -#include #include -#include -#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include using namespace RooFit; diff --git a/PWGHF/D2H/Macros/HFInvMassFitter.h b/PWGHF/D2H/Macros/HFInvMassFitter.h index 61c8b601179..8a236412a13 100644 --- a/PWGHF/D2H/Macros/HFInvMassFitter.h +++ b/PWGHF/D2H/Macros/HFInvMassFitter.h @@ -20,20 +20,18 @@ #ifndef PWGHF_D2H_MACROS_HFINVMASSFITTER_H_ #define PWGHF_D2H_MACROS_HFINVMASSFITTER_H_ -#include - #include #include #include -#include -#include +#include +#include + #include -#include #include #include -#include -#include -#include +#include + +#include class HFInvMassFitter : public TNamed { diff --git a/PWGHF/D2H/TableProducer/candidateCreatorCharmResoReduced.cxx b/PWGHF/D2H/TableProducer/candidateCreatorCharmResoReduced.cxx index 8b83e3bf349..1055c891092 100644 --- a/PWGHF/D2H/TableProducer/candidateCreatorCharmResoReduced.cxx +++ b/PWGHF/D2H/TableProducer/candidateCreatorCharmResoReduced.cxx @@ -24,7 +24,6 @@ #include "Common/Core/trackUtilities.h" #include "Common/DataModel/CollisionAssociationTables.h" -#include "EventFiltering/PWGHF/HFFilterHelpers.h" #include "PWGHF/D2H/DataModel/ReducedDataModel.h" #include "PWGHF/D2H/Core/SelectorCutsRedDataFormat.h" diff --git a/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx b/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx index 8eac85d1878..d03f8d9eda0 100644 --- a/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx +++ b/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx @@ -37,13 +37,14 @@ #include "Common/DataModel/Qvectors.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" +#include "PWGHF/D2H/DataModel/ReducedDataModel.h" +#include "PWGHF/D2H/Utils/utilsRedDataFormat.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/Utils/utilsBfieldCCDB.h" #include "PWGHF/Utils/utilsEvSelHf.h" -#include "PWGHF/D2H/DataModel/ReducedDataModel.h" #include "PWGHF/Utils/utilsTrkCandHf.h" -#include "PWGHF/D2H/Utils/utilsRedDataFormat.h" using namespace o2; using namespace o2::analysis; diff --git a/PWGHF/D2H/Tasks/taskCharmResoReduced.cxx b/PWGHF/D2H/Tasks/taskCharmResoReduced.cxx index 078be76881c..37aef67937a 100644 --- a/PWGHF/D2H/Tasks/taskCharmResoReduced.cxx +++ b/PWGHF/D2H/Tasks/taskCharmResoReduced.cxx @@ -22,6 +22,7 @@ #include "Common/Core/RecoDecay.h" // #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/D2H/DataModel/ReducedDataModel.h" using namespace o2; diff --git a/PWGHF/D2H/Tasks/taskD0.cxx b/PWGHF/D2H/Tasks/taskD0.cxx index 0db5a832135..b650e5bd4f0 100644 --- a/PWGHF/D2H/Tasks/taskD0.cxx +++ b/PWGHF/D2H/Tasks/taskD0.cxx @@ -25,10 +25,11 @@ #include "PWGHF/Core/CentralityEstimation.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" -#include "PWGHF/Utils/utilsEvSelHf.h" #include "PWGHF/Utils/utilsAnalysis.h" +#include "PWGHF/Utils/utilsEvSelHf.h" using namespace o2; using namespace o2::analysis; diff --git a/PWGHF/D2H/Tasks/taskDplus.cxx b/PWGHF/D2H/Tasks/taskDplus.cxx index e67ec0dfa69..ccbb6a2bd90 100644 --- a/PWGHF/D2H/Tasks/taskDplus.cxx +++ b/PWGHF/D2H/Tasks/taskDplus.cxx @@ -26,10 +26,11 @@ #include "PWGHF/Core/CentralityEstimation.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" -#include "PWGHF/Utils/utilsEvSelHf.h" #include "PWGHF/Utils/utilsAnalysis.h" +#include "PWGHF/Utils/utilsEvSelHf.h" using namespace o2; using namespace o2::analysis; diff --git a/PWGHF/D2H/Tasks/taskLc.cxx b/PWGHF/D2H/Tasks/taskLc.cxx index be75dc055bf..eca9a4a2672 100644 --- a/PWGHF/D2H/Tasks/taskLc.cxx +++ b/PWGHF/D2H/Tasks/taskLc.cxx @@ -25,8 +25,9 @@ #include "Framework/HistogramRegistry.h" #include "Framework/runDataProcessing.h" -#include "PWGHF/Core/HfHelper.h" #include "PWGHF/Core/CentralityEstimation.h" +#include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/Utils/utilsEvSelHf.h" diff --git a/PWGHF/D2H/Tasks/taskLcToK0sP.cxx b/PWGHF/D2H/Tasks/taskLcToK0sP.cxx index 3c373a59f72..5b379e9e759 100644 --- a/PWGHF/D2H/Tasks/taskLcToK0sP.cxx +++ b/PWGHF/D2H/Tasks/taskLcToK0sP.cxx @@ -24,6 +24,7 @@ #include "Framework/runDataProcessing.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" diff --git a/PWGHF/D2H/Tasks/taskSigmacToCascade.cxx b/PWGHF/D2H/Tasks/taskSigmacToCascade.cxx index 279c9322b0e..dbdd51410ce 100644 --- a/PWGHF/D2H/Tasks/taskSigmacToCascade.cxx +++ b/PWGHF/D2H/Tasks/taskSigmacToCascade.cxx @@ -26,6 +26,7 @@ #include "Common/Core/TrackSelectionDefaults.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" diff --git a/PWGHF/D2H/Tasks/taskXic.cxx b/PWGHF/D2H/Tasks/taskXic.cxx index 00b513cd1a4..d2dc111d826 100644 --- a/PWGHF/D2H/Tasks/taskXic.cxx +++ b/PWGHF/D2H/Tasks/taskXic.cxx @@ -28,6 +28,7 @@ #include "Framework/runDataProcessing.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" diff --git a/PWGHF/D2H/Tasks/taskXicc.cxx b/PWGHF/D2H/Tasks/taskXicc.cxx index 9e9f4999f80..1e49bb8649b 100644 --- a/PWGHF/D2H/Tasks/taskXicc.cxx +++ b/PWGHF/D2H/Tasks/taskXicc.cxx @@ -23,6 +23,7 @@ #include "Framework/HistogramRegistry.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" @@ -275,8 +276,8 @@ struct HfTaskXiccMc { registry.fill(HIST("hPtvsEtavsYGen"), particle.pt(), particle.eta(), RecoDecay::y(particle.pVector(), o2::constants::physics::MassXiCCPlusPlus)); } } // end of loop of MC particles - } // end of process function -}; // end of struct + } // end of process function +}; // end of struct WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { diff --git a/PWGHF/D2H/Utils/utilsRedDataFormat.h b/PWGHF/D2H/Utils/utilsRedDataFormat.h index 9740e55d372..a083e9713b2 100644 --- a/PWGHF/D2H/Utils/utilsRedDataFormat.h +++ b/PWGHF/D2H/Utils/utilsRedDataFormat.h @@ -16,9 +16,14 @@ #ifndef PWGHF_D2H_UTILS_UTILSREDDATAFORMAT_H_ #define PWGHF_D2H_UTILS_UTILSREDDATAFORMAT_H_ -#include "Framework/HistogramRegistry.h" +#include + +#include #include "CCDB/BasicCCDBManager.h" +#include "Framework/AnalysisHelpers.h" +#include "Framework/HistogramRegistry.h" + #include "PWGHF/Core/CentralityEstimation.h" #include "PWGHF/Utils/utilsEvSelHf.h" diff --git a/PWGHF/DataModel/CandidateReconstructionTables.h b/PWGHF/DataModel/CandidateReconstructionTables.h index 41b5ccbf905..1f4e94b0e83 100644 --- a/PWGHF/DataModel/CandidateReconstructionTables.h +++ b/PWGHF/DataModel/CandidateReconstructionTables.h @@ -18,22 +18,22 @@ #ifndef PWGHF_DATAMODEL_CANDIDATERECONSTRUCTIONTABLES_H_ #define PWGHF_DATAMODEL_CANDIDATERECONSTRUCTIONTABLES_H_ -#include - -#include "Math/GenVector/Boost.h" -#include "Math/Vector4D.h" +#include +#include +#include -#include "CommonConstants/PhysicsConstants.h" -#include "Framework/AnalysisDataModel.h" +#include +#include +#include #include "ALICE3/DataModel/ECAL.h" #include "Common/Core/RecoDecay.h" -#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/PIDResponseTOF.h" +#include "Common/DataModel/PIDResponseTPC.h" #include "Common/DataModel/TrackSelectionTables.h" #include "PWGLF/DataModel/LFStrangenessTables.h" -#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/Utils/utilsPid.h" namespace o2::aod diff --git a/PWGHF/DataModel/CandidateSelectionTables.h b/PWGHF/DataModel/CandidateSelectionTables.h index eaca829eeec..5aa0068f80d 100644 --- a/PWGHF/DataModel/CandidateSelectionTables.h +++ b/PWGHF/DataModel/CandidateSelectionTables.h @@ -17,13 +17,9 @@ #ifndef PWGHF_DATAMODEL_CANDIDATESELECTIONTABLES_H_ #define PWGHF_DATAMODEL_CANDIDATESELECTIONTABLES_H_ -#include - -#include "Common/Core/RecoDecay.h" -#include "Common/Core/TrackSelectorPID.h" +#include -#include "PWGHF/Core/SelectorCuts.h" -#include "PWGHF/DataModel/CandidateReconstructionTables.h" +#include namespace o2::aod { diff --git a/PWGHF/DataModel/DerivedTables.h b/PWGHF/DataModel/DerivedTables.h index 77f5f848ce2..337abce14e0 100644 --- a/PWGHF/DataModel/DerivedTables.h +++ b/PWGHF/DataModel/DerivedTables.h @@ -16,17 +16,17 @@ #ifndef PWGHF_DATAMODEL_DERIVEDTABLES_H_ #define PWGHF_DATAMODEL_DERIVEDTABLES_H_ -#include +#include +#include -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoA.h" +#include +#include +#include #include "Common/Core/RecoDecay.h" - -#include "PWGLF/DataModel/mcCentrality.h" +#include "Common/DataModel/Centrality.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" -#include "PWGHF/DataModel/CandidateSelectionTables.h" namespace o2::aod { diff --git a/PWGHF/HFC/DataModel/CorrelationTables.h b/PWGHF/HFC/DataModel/CorrelationTables.h index 370f3738975..3dc9e765ecb 100644 --- a/PWGHF/HFC/DataModel/CorrelationTables.h +++ b/PWGHF/HFC/DataModel/CorrelationTables.h @@ -16,12 +16,15 @@ #ifndef PWGHF_HFC_DATAMODEL_CORRELATIONTABLES_H_ #define PWGHF_HFC_DATAMODEL_CORRELATIONTABLES_H_ -#include "CommonConstants/PhysicsConstants.h" -#include "Framework/AnalysisDataModel.h" +#include +#include // NOLINT +#include + +#include #include "Common/Core/RecoDecay.h" -#include "PWGHF/DataModel/CandidateReconstructionTables.h" +#include "PWGHF/DataModel/CandidateReconstructionTables.h" // NOLINT namespace o2::aod { diff --git a/PWGHF/HFC/DataModel/DMesonPairsTables.h b/PWGHF/HFC/DataModel/DMesonPairsTables.h index 9ba4d72c78b..35e12760919 100644 --- a/PWGHF/HFC/DataModel/DMesonPairsTables.h +++ b/PWGHF/HFC/DataModel/DMesonPairsTables.h @@ -17,9 +17,10 @@ #ifndef PWGHF_HFC_DATAMODEL_DMESONPAIRSTABLES_H_ #define PWGHF_HFC_DATAMODEL_DMESONPAIRSTABLES_H_ -#include +#include -#include "Framework/AnalysisDataModel.h" +#include +#include namespace o2::aod { diff --git a/PWGHF/HFC/DataModel/DerivedDataCorrelationTables.h b/PWGHF/HFC/DataModel/DerivedDataCorrelationTables.h index 9e99e6ab011..b9425517913 100644 --- a/PWGHF/HFC/DataModel/DerivedDataCorrelationTables.h +++ b/PWGHF/HFC/DataModel/DerivedDataCorrelationTables.h @@ -16,7 +16,7 @@ #ifndef PWGHF_HFC_DATAMODEL_DERIVEDDATACORRELATIONTABLES_H_ #define PWGHF_HFC_DATAMODEL_DERIVEDDATACORRELATIONTABLES_H_ -#include "Framework/AnalysisDataModel.h" +#include namespace o2::aod { diff --git a/PWGHF/HFC/Macros/DhCorrelationExtraction.h b/PWGHF/HFC/Macros/DhCorrelationExtraction.h index a659724594b..73b07c61e83 100644 --- a/PWGHF/HFC/Macros/DhCorrelationExtraction.h +++ b/PWGHF/HFC/Macros/DhCorrelationExtraction.h @@ -17,22 +17,16 @@ #ifndef PWGHF_HFC_MACROS_DHCORRELATIONEXTRACTION_H_ #define PWGHF_HFC_MACROS_DHCORRELATIONEXTRACTION_H_ -#include -#include "TObject.h" -#include "TMath.h" -#include "TFile.h" -#include "TDirectoryFile.h" -#include "TList.h" -#include "TCanvas.h" -#include "TPaveText.h" -#include "TLegend.h" -#include "TSystem.h" -#include "TH1D.h" -#include "TH2D.h" -#include "TH3D.h" -#include "TF1.h" -#include "THnSparse.h" -#include "TVector.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include class DhCorrelationExtraction : public TObject { diff --git a/PWGHF/HFC/Macros/DhCorrelationFitter.h b/PWGHF/HFC/Macros/DhCorrelationFitter.h index 3832b67b645..a4bdf3c3bb1 100644 --- a/PWGHF/HFC/Macros/DhCorrelationFitter.h +++ b/PWGHF/HFC/Macros/DhCorrelationFitter.h @@ -19,10 +19,9 @@ #include -#include -#include -#include -#include +#include +#include +#include class DhCorrelationFitter { diff --git a/PWGHF/HFC/TableProducer/correlatorD0D0bar.cxx b/PWGHF/HFC/TableProducer/correlatorD0D0bar.cxx index 294e34db2c7..cffe8b898c2 100644 --- a/PWGHF/HFC/TableProducer/correlatorD0D0bar.cxx +++ b/PWGHF/HFC/TableProducer/correlatorD0D0bar.cxx @@ -25,6 +25,7 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/HFC/DataModel/CorrelationTables.h" diff --git a/PWGHF/HFC/TableProducer/correlatorD0D0barBarrelFullPid.cxx b/PWGHF/HFC/TableProducer/correlatorD0D0barBarrelFullPid.cxx index f92f8150abc..9e090a49c57 100644 --- a/PWGHF/HFC/TableProducer/correlatorD0D0barBarrelFullPid.cxx +++ b/PWGHF/HFC/TableProducer/correlatorD0D0barBarrelFullPid.cxx @@ -25,6 +25,7 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/HFC/DataModel/CorrelationTables.h" diff --git a/PWGHF/HFC/TableProducer/correlatorD0Hadrons.cxx b/PWGHF/HFC/TableProducer/correlatorD0Hadrons.cxx index 7b6517f29dc..f2a7afc6bdc 100644 --- a/PWGHF/HFC/TableProducer/correlatorD0Hadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorD0Hadrons.cxx @@ -29,6 +29,7 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/HFC/DataModel/CorrelationTables.h" diff --git a/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx b/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx index ef5791fadc8..ee0ab36ce91 100644 --- a/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDMesonPairs.cxx @@ -27,6 +27,7 @@ #include "PWGHF/Core/HfHelper.h" #include "PWGHF/Core/HfMlResponse.h" #include "PWGHF/Core/HfMlResponseD0ToKPi.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/HFC/DataModel/DMesonPairsTables.h" diff --git a/PWGHF/HFC/TableProducer/correlatorDplusDminus.cxx b/PWGHF/HFC/TableProducer/correlatorDplusDminus.cxx index 2871d9f9793..e6f40634641 100644 --- a/PWGHF/HFC/TableProducer/correlatorDplusDminus.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDplusDminus.cxx @@ -25,6 +25,7 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/HFC/DataModel/CorrelationTables.h" diff --git a/PWGHF/HFC/TableProducer/correlatorDplusHadrons.cxx b/PWGHF/HFC/TableProducer/correlatorDplusHadrons.cxx index d6c50370ed5..d40daca5410 100644 --- a/PWGHF/HFC/TableProducer/correlatorDplusHadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDplusHadrons.cxx @@ -27,6 +27,7 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/HFC/DataModel/CorrelationTables.h" diff --git a/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx b/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx index 50881aad9d2..3ba26af40a6 100644 --- a/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx @@ -28,6 +28,7 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/HFC/DataModel/CorrelationTables.h" diff --git a/PWGHF/HFC/TableProducer/correlatorDsHadronsReduced.cxx b/PWGHF/HFC/TableProducer/correlatorDsHadronsReduced.cxx index 31fd99530c2..d005659cc69 100644 --- a/PWGHF/HFC/TableProducer/correlatorDsHadronsReduced.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDsHadronsReduced.cxx @@ -20,6 +20,7 @@ #include "Framework/HistogramRegistry.h" #include "Framework/runDataProcessing.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/HFC/DataModel/CorrelationTables.h" #include "PWGHF/HFC/DataModel/DerivedDataCorrelationTables.h" diff --git a/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx b/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx index 506f98073ef..f8dd07c5fc4 100644 --- a/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx @@ -32,6 +32,7 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/HFC/DataModel/CorrelationTables.h" @@ -530,7 +531,7 @@ struct HfCorrelatorLcHadrons { } auto trackPos1 = candidate.template prong0_as(); // positive daughter (negative for the antiparticles) auto trackPos2 = candidate.template prong2_as(); - int8_t chargeLc = trackPos1.sign(); // charge of 1st prong will be the charge of Lc candidate + int8_t chargeLc = trackPos1.sign(); // charge of 1st prong will be the charge of Lc candidate isLcSignal = TESTBIT(std::abs(candidate.flagMcMatchRec()), aod::hf_cand_3prong::DecayType::LcToPKPi); isLcPrompt = candidate.originMcRec() == RecoDecay::OriginType::Prompt; isLcNonPrompt = candidate.originMcRec() == RecoDecay::OriginType::NonPrompt; diff --git a/PWGHF/HFC/Tasks/taskCorrelationD0Hadrons.cxx b/PWGHF/HFC/Tasks/taskCorrelationD0Hadrons.cxx index 2112aa91566..93c0fecd90d 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationD0Hadrons.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationD0Hadrons.cxx @@ -23,6 +23,7 @@ #include "Framework/runDataProcessing.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/Utils/utilsAnalysis.h" diff --git a/PWGHF/HFC/Tasks/taskCorrelationDDbar.cxx b/PWGHF/HFC/Tasks/taskCorrelationDDbar.cxx index b45ce1b4a63..f7b50def0a4 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationDDbar.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationDDbar.cxx @@ -20,6 +20,7 @@ #include "Framework/HistogramRegistry.h" #include "Framework/runDataProcessing.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/Utils/utilsAnalysis.h" diff --git a/PWGHF/HFC/Tasks/taskCorrelationDplusHadrons.cxx b/PWGHF/HFC/Tasks/taskCorrelationDplusHadrons.cxx index 73d703ffde1..43398e86043 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationDplusHadrons.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationDplusHadrons.cxx @@ -12,15 +12,18 @@ /// \file taskCorrelationDplusHadrons.cxx /// \brief D+-Hadrons azimuthal correlations analysis task - data-like, MC-reco and MC-Gen analyses /// \author Shyam Kumar + #include // std::shared_ptr #include #include + #include "CCDB/BasicCCDBManager.h" #include "Framework/AnalysisTask.h" #include "Framework/HistogramRegistry.h" #include "Framework/runDataProcessing.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/Utils/utilsAnalysis.h" diff --git a/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx b/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx index fc4c059c61b..f70f05b0691 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx @@ -24,6 +24,7 @@ #include "Framework/runDataProcessing.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/Utils/utilsAnalysis.h" diff --git a/PWGHF/HFC/Tasks/taskCorrelationLcHadrons.cxx b/PWGHF/HFC/Tasks/taskCorrelationLcHadrons.cxx index 2c7e3dd3e80..2d123acde31 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationLcHadrons.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationLcHadrons.cxx @@ -17,12 +17,14 @@ #include // std::shared_ptr #include #include + #include "CCDB/BasicCCDBManager.h" #include "Framework/AnalysisTask.h" #include "Framework/HistogramRegistry.h" #include "Framework/runDataProcessing.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/Utils/utilsAnalysis.h" diff --git a/PWGHF/HFC/Utils/utilsCorrelations.h b/PWGHF/HFC/Utils/utilsCorrelations.h index a38e36f7fc1..90f7b8524d9 100644 --- a/PWGHF/HFC/Utils/utilsCorrelations.h +++ b/PWGHF/HFC/Utils/utilsCorrelations.h @@ -16,10 +16,17 @@ #ifndef PWGHF_HFC_UTILS_UTILSCORRELATIONS_H_ #define PWGHF_HFC_UTILS_UTILSCORRELATIONS_H_ -#include #include -#include "CommonConstants/PhysicsConstants.h" +#include + +#include +#include + +#include "CommonConstants/MathConstants.h" + +#include "Common/DataModel/PIDResponseTPC.h" +#include "Common/DataModel/PIDResponseTOF.h" namespace o2::analysis::hf_correlations { diff --git a/PWGHF/HFL/DataModel/ElectronSelectionTable.h b/PWGHF/HFL/DataModel/ElectronSelectionTable.h index e590ee1d94d..477011950e2 100644 --- a/PWGHF/HFL/DataModel/ElectronSelectionTable.h +++ b/PWGHF/HFL/DataModel/ElectronSelectionTable.h @@ -18,7 +18,10 @@ #ifndef PWGHF_HFL_DATAMODEL_ELECTRONSELECTIONTABLE_H_ #define PWGHF_HFL_DATAMODEL_ELECTRONSELECTIONTABLE_H_ -#include "Framework/AnalysisDataModel.h" +#include // NOLINT +#include + +#include namespace o2::aod { diff --git a/PWGHF/TableProducer/candidateCreator2Prong.cxx b/PWGHF/TableProducer/candidateCreator2Prong.cxx index 66e11d2559d..d551922b7d5 100644 --- a/PWGHF/TableProducer/candidateCreator2Prong.cxx +++ b/PWGHF/TableProducer/candidateCreator2Prong.cxx @@ -43,13 +43,16 @@ #include "Common/Core/trackUtilities.h" #include "Tools/KFparticle/KFUtilities.h" +#include "PWGLF/DataModel/mcCentrality.h" + #include "PWGHF/Core/CentralityEstimation.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/Utils/utilsBfieldCCDB.h" #include "PWGHF/Utils/utilsEvSelHf.h" +#include "PWGHF/Utils/utilsMcGen.h" #include "PWGHF/Utils/utilsPid.h" #include "PWGHF/Utils/utilsTrkCandHf.h" -#include "PWGHF/Utils/utilsMcGen.h" using namespace o2; using namespace o2::analysis; diff --git a/PWGHF/TableProducer/candidateCreator3Prong.cxx b/PWGHF/TableProducer/candidateCreator3Prong.cxx index 426c42c5771..d8f5963b301 100644 --- a/PWGHF/TableProducer/candidateCreator3Prong.cxx +++ b/PWGHF/TableProducer/candidateCreator3Prong.cxx @@ -43,7 +43,10 @@ #include "Common/Core/trackUtilities.h" #include "Tools/KFparticle/KFUtilities.h" +#include "PWGLF/DataModel/mcCentrality.h" + #include "PWGHF/Core/CentralityEstimation.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/Utils/utilsBfieldCCDB.h" #include "PWGHF/Utils/utilsEvSelHf.h" diff --git a/PWGHF/TableProducer/candidateCreatorB0.cxx b/PWGHF/TableProducer/candidateCreatorB0.cxx index 6caca925a2d..b60e5e63a72 100644 --- a/PWGHF/TableProducer/candidateCreatorB0.cxx +++ b/PWGHF/TableProducer/candidateCreatorB0.cxx @@ -30,11 +30,12 @@ #include "Common/DataModel/CollisionAssociationTables.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/Utils/utilsBfieldCCDB.h" -#include "PWGHF/Utils/utilsTrkCandHf.h" #include "PWGHF/Utils/utilsMcGen.h" +#include "PWGHF/Utils/utilsTrkCandHf.h" using namespace o2; using namespace o2::analysis; diff --git a/PWGHF/TableProducer/candidateCreatorBplus.cxx b/PWGHF/TableProducer/candidateCreatorBplus.cxx index f1d306cad12..fea1a2778b4 100644 --- a/PWGHF/TableProducer/candidateCreatorBplus.cxx +++ b/PWGHF/TableProducer/candidateCreatorBplus.cxx @@ -33,11 +33,12 @@ #include "Common/DataModel/CollisionAssociationTables.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/Utils/utilsBfieldCCDB.h" -#include "PWGHF/Utils/utilsTrkCandHf.h" #include "PWGHF/Utils/utilsMcGen.h" +#include "PWGHF/Utils/utilsTrkCandHf.h" using namespace o2; using namespace o2::analysis; diff --git a/PWGHF/TableProducer/candidateCreatorBs.cxx b/PWGHF/TableProducer/candidateCreatorBs.cxx index 5ce38797762..4f8128e474b 100644 --- a/PWGHF/TableProducer/candidateCreatorBs.cxx +++ b/PWGHF/TableProducer/candidateCreatorBs.cxx @@ -30,6 +30,7 @@ #include "Common/DataModel/CollisionAssociationTables.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/Utils/utilsBfieldCCDB.h" diff --git a/PWGHF/TableProducer/candidateCreatorCascade.cxx b/PWGHF/TableProducer/candidateCreatorCascade.cxx index 25c7a343849..04faa873da7 100644 --- a/PWGHF/TableProducer/candidateCreatorCascade.cxx +++ b/PWGHF/TableProducer/candidateCreatorCascade.cxx @@ -33,7 +33,10 @@ #include "Common/Core/trackUtilities.h" +#include "PWGLF/DataModel/mcCentrality.h" + #include "PWGHF/Core/CentralityEstimation.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/Utils/utilsBfieldCCDB.h" #include "PWGHF/Utils/utilsEvSelHf.h" diff --git a/PWGHF/TableProducer/candidateCreatorDstar.cxx b/PWGHF/TableProducer/candidateCreatorDstar.cxx index 146c0b94ee7..b5b67db87ab 100644 --- a/PWGHF/TableProducer/candidateCreatorDstar.cxx +++ b/PWGHF/TableProducer/candidateCreatorDstar.cxx @@ -15,7 +15,8 @@ /// \author Vít Kučera , CERN /// \author Deependra Sharma , IITB /// \author Fabrizio Grosa , CERN -// std + +// C++ #include #include #include @@ -30,8 +31,11 @@ #include "Framework/RunningWorkflowInfo.h" // O2Physics #include "Common/Core/trackUtilities.h" +// PWGLF +#include "PWGLF/DataModel/mcCentrality.h" // PWGHF #include "PWGHF/Core/CentralityEstimation.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/Utils/utilsBfieldCCDB.h" #include "PWGHF/Utils/utilsEvSelHf.h" diff --git a/PWGHF/TableProducer/candidateCreatorMcGen.cxx b/PWGHF/TableProducer/candidateCreatorMcGen.cxx index c27a2f8b734..3c5f7a2c3c1 100644 --- a/PWGHF/TableProducer/candidateCreatorMcGen.cxx +++ b/PWGHF/TableProducer/candidateCreatorMcGen.cxx @@ -30,7 +30,6 @@ #include "PWGHF/Utils/utilsMcGen.h" using namespace o2; -using namespace o2::analysis; using namespace o2::framework; /// Reconstruction of heavy-flavour 2-prong decay candidates diff --git a/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx b/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx index b87c879d7e8..8ab7e92d5ce 100644 --- a/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx +++ b/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx @@ -36,6 +36,7 @@ #include "Common/Core/TrackSelectionDefaults.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/Utils/utilsBfieldCCDB.h" // for dca recalculation diff --git a/PWGHF/TableProducer/candidateCreatorSigmac0plusplusCascade.cxx b/PWGHF/TableProducer/candidateCreatorSigmac0plusplusCascade.cxx index 857e8b68bf9..ee784c35fae 100644 --- a/PWGHF/TableProducer/candidateCreatorSigmac0plusplusCascade.cxx +++ b/PWGHF/TableProducer/candidateCreatorSigmac0plusplusCascade.cxx @@ -26,6 +26,7 @@ #include "Common/Core/TrackSelectionDefaults.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" diff --git a/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx b/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx index b8d114a6583..e3ba8f255dc 100644 --- a/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx +++ b/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx @@ -54,6 +54,7 @@ #include "Tools/KFparticle/KFUtilities.h" #include "PWGLF/DataModel/LFStrangenessTables.h" +#include "PWGLF/DataModel/mcCentrality.h" #include "PWGHF/Core/CentralityEstimation.h" #include "PWGHF/Core/SelectorCuts.h" diff --git a/PWGHF/TableProducer/candidateCreatorXicToXiPiPi.cxx b/PWGHF/TableProducer/candidateCreatorXicToXiPiPi.cxx index b5709e5a778..69fea11d5c9 100644 --- a/PWGHF/TableProducer/candidateCreatorXicToXiPiPi.cxx +++ b/PWGHF/TableProducer/candidateCreatorXicToXiPiPi.cxx @@ -47,13 +47,13 @@ #include "Tools/KFparticle/KFUtilities.h" #include "PWGLF/DataModel/LFStrangenessTables.h" +#include "PWGLF/DataModel/mcCentrality.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/Utils/utilsBfieldCCDB.h" #include "PWGHF/Utils/utilsEvSelHf.h" using namespace o2; -using namespace o2::analysis; using namespace o2::constants::physics; using namespace o2::framework; using namespace o2::hf_evsel; diff --git a/PWGHF/TableProducer/candidateSelectorD0.cxx b/PWGHF/TableProducer/candidateSelectorD0.cxx index eda8561c6b3..ae0102b33fe 100644 --- a/PWGHF/TableProducer/candidateSelectorD0.cxx +++ b/PWGHF/TableProducer/candidateSelectorD0.cxx @@ -27,6 +27,7 @@ #include "PWGHF/Core/HfHelper.h" #include "PWGHF/Core/HfMlResponse.h" #include "PWGHF/Core/HfMlResponseD0ToKPi.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/Utils/utilsAnalysis.h" diff --git a/PWGHF/TableProducer/candidateSelectorDplusToPiKPi.cxx b/PWGHF/TableProducer/candidateSelectorDplusToPiKPi.cxx index 3efd7990991..5aa753b28d1 100644 --- a/PWGHF/TableProducer/candidateSelectorDplusToPiKPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorDplusToPiKPi.cxx @@ -26,6 +26,7 @@ #include "PWGHF/Core/HfHelper.h" #include "PWGHF/Core/HfMlResponseDplusToPiKPi.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/Utils/utilsAnalysis.h" diff --git a/PWGHF/TableProducer/candidateSelectorDsToKKPi.cxx b/PWGHF/TableProducer/candidateSelectorDsToKKPi.cxx index b1aad60b510..9196ce735de 100644 --- a/PWGHF/TableProducer/candidateSelectorDsToKKPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorDsToKKPi.cxx @@ -26,6 +26,7 @@ #include "PWGHF/Core/HfHelper.h" #include "PWGHF/Core/HfMlResponseDsToKKPi.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/Utils/utilsAnalysis.h" diff --git a/PWGHF/TableProducer/candidateSelectorDstarToD0Pi.cxx b/PWGHF/TableProducer/candidateSelectorDstarToD0Pi.cxx index d8b729dc748..cb058a18f6b 100644 --- a/PWGHF/TableProducer/candidateSelectorDstarToD0Pi.cxx +++ b/PWGHF/TableProducer/candidateSelectorDstarToD0Pi.cxx @@ -30,6 +30,7 @@ // PWGHF #include "PWGHF/Core/HfHelper.h" #include "PWGHF/Core/HfMlResponseDstarToD0Pi.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/Utils/utilsAnalysis.h" diff --git a/PWGHF/TableProducer/candidateSelectorLcToK0sP.cxx b/PWGHF/TableProducer/candidateSelectorLcToK0sP.cxx index 7095fc2b8a1..53df1ed2dfe 100644 --- a/PWGHF/TableProducer/candidateSelectorLcToK0sP.cxx +++ b/PWGHF/TableProducer/candidateSelectorLcToK0sP.cxx @@ -29,6 +29,7 @@ #include "PWGHF/Core/HfHelper.h" #include "PWGHF/Core/HfMlResponse.h" #include "PWGHF/Core/HfMlResponseLcToK0sP.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" diff --git a/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx b/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx index 7ef19ae4032..24cb43ca348 100644 --- a/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorOmegac0ToOmegaPi.cxx @@ -28,7 +28,7 @@ #include "PWGHF/Core/HfMlResponse.h" #include "PWGHF/Core/HfMlResponseOmegacToOmegaPi.h" - +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/Utils/utilsAnalysis.h" diff --git a/PWGHF/TableProducer/candidateSelectorXiccToPKPiPi.cxx b/PWGHF/TableProducer/candidateSelectorXiccToPKPiPi.cxx index 28e0035f39c..578cb27876d 100644 --- a/PWGHF/TableProducer/candidateSelectorXiccToPKPiPi.cxx +++ b/PWGHF/TableProducer/candidateSelectorXiccToPKPiPi.cxx @@ -23,6 +23,7 @@ #include "Common/Core/TrackSelectorPID.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" diff --git a/PWGHF/TableProducer/trackIndexSkimCreator.cxx b/PWGHF/TableProducer/trackIndexSkimCreator.cxx index c84a0c11c10..0f98525ceb1 100644 --- a/PWGHF/TableProducer/trackIndexSkimCreator.cxx +++ b/PWGHF/TableProducer/trackIndexSkimCreator.cxx @@ -50,6 +50,7 @@ #include "PWGLF/DataModel/LFStrangenessTables.h" #include "PWGHF/Core/CentralityEstimation.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/Utils/utilsAnalysis.h" #include "PWGHF/Utils/utilsBfieldCCDB.h" diff --git a/PWGHF/Tasks/taskMcEfficiencyToXiPi.cxx b/PWGHF/Tasks/taskMcEfficiencyToXiPi.cxx index 1d1f6a1af22..01cac4a9028 100644 --- a/PWGHF/Tasks/taskMcEfficiencyToXiPi.cxx +++ b/PWGHF/Tasks/taskMcEfficiencyToXiPi.cxx @@ -26,6 +26,7 @@ #include "Common/Core/RecoDecay.h" #include "Common/DataModel/TrackSelectionTables.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" @@ -370,7 +371,7 @@ struct HfTaskMcEfficiencyToXiPi { } } // close loop mcParticles - } // close candidateMcLoop + } // close candidateMcLoop // process functions void processXic0(Xic0CandidateInfo const& candidates, diff --git a/PWGHF/Tasks/taskMcValidation.cxx b/PWGHF/Tasks/taskMcValidation.cxx index b1dc03cdbb2..eea7aa4c4ab 100644 --- a/PWGHF/Tasks/taskMcValidation.cxx +++ b/PWGHF/Tasks/taskMcValidation.cxx @@ -32,7 +32,10 @@ #include "CCDB/BasicCCDBManager.h" #include "Common/DataModel/CollisionAssociationTables.h" +#include "PWGLF/DataModel/mcCentrality.h" + #include "PWGHF/Core/CentralityEstimation.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/Utils/utilsEvSelHf.h" diff --git a/PWGHF/Utils/utilsAnalysis.h b/PWGHF/Utils/utilsAnalysis.h index ec59ec55bf0..7a2c2f45d0a 100644 --- a/PWGHF/Utils/utilsAnalysis.h +++ b/PWGHF/Utils/utilsAnalysis.h @@ -17,11 +17,14 @@ #ifndef PWGHF_UTILS_UTILSANALYSIS_H_ #define PWGHF_UTILS_UTILSANALYSIS_H_ -#include // std::upper_bound -#include // std::distance -#include //std::string +#include +#include +#include -#include "CommonConstants/PhysicsConstants.h" +#include // std::upper_bound +#include +#include // std::distance +#include //std::string namespace o2::analysis { diff --git a/PWGHF/Utils/utilsBfieldCCDB.h b/PWGHF/Utils/utilsBfieldCCDB.h index 8e61485ae53..583e25fd01c 100644 --- a/PWGHF/Utils/utilsBfieldCCDB.h +++ b/PWGHF/Utils/utilsBfieldCCDB.h @@ -16,11 +16,16 @@ #ifndef PWGHF_UTILS_UTILSBFIELDCCDB_H_ #define PWGHF_UTILS_UTILSBFIELDCCDB_H_ -#include // std::string +#include + +#include +#include +#include +#include +#include +#include -#include "CCDB/BasicCCDBManager.h" -#include "DataFormatsParameters/GRPMagField.h" -#include "DataFormatsParameters/GRPObject.h" +#include // std::string /// \brief Sets up the grp object for magnetic field (w/o matCorr for propagation) /// \param bc is the bunch crossing @@ -29,7 +34,8 @@ /// \param ccdbPathGrp is the path where the GRP oject is stored /// \param lut is a pointer to the o2::base::MatLayerCylSet object /// \param isRun2 tells whether we are analysing Run2 converted data or not (different GRP object type) -void initCCDB(o2::aod::BCsWithTimestamps::iterator const& bc, int& mRunNumber, +template +void initCCDB(TBc const& bc, int& mRunNumber, o2::framework::Service const& ccdb, std::string const& ccdbPathGrp, o2::base::MatLayerCylSet* lut, bool isRun2) { diff --git a/PWGHF/Utils/utilsDerivedData.h b/PWGHF/Utils/utilsDerivedData.h index c5eb6cc3b89..23c08d3ac3c 100644 --- a/PWGHF/Utils/utilsDerivedData.h +++ b/PWGHF/Utils/utilsDerivedData.h @@ -16,19 +16,18 @@ #ifndef PWGHF_UTILS_UTILSDERIVEDDATA_H_ #define PWGHF_UTILS_UTILSDERIVEDDATA_H_ -#include -#include +#include -#include "fairlogger/Logger.h" +#include +#include +#include -#include "Framework/AnalysisHelpers.h" -#include "Framework/Configurable.h" -#include "Framework/ASoA.h" +#include +#include +#include #include "Common/Core/RecoDecay.h" -#include "PWGHF/DataModel/DerivedTables.h" - // Macro to store nSigma for prong _id_ with PID hypothesis _hyp_ in an array #define GET_N_SIGMA_PRONG(_array_, _candidate_, _id_, _hyp_) \ _array_[0] = _candidate_.nSigTpc##_hyp_##_id_(); \ diff --git a/PWGHF/Utils/utilsEvSelHf.h b/PWGHF/Utils/utilsEvSelHf.h index 4103cd517de..5d57ffb5eff 100644 --- a/PWGHF/Utils/utilsEvSelHf.h +++ b/PWGHF/Utils/utilsEvSelHf.h @@ -18,19 +18,28 @@ #ifndef PWGHF_UTILS_UTILSEVSELHF_H_ #define PWGHF_UTILS_UTILSEVSELHF_H_ +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include #include // std::shared_ptr #include // std::string -#include "Framework/Configurable.h" -#include "Framework/HistogramRegistry.h" -#include "Framework/HistogramSpec.h" -#include "Framework/OutputObjHeader.h" - #include "Common/CCDB/EventSelectionParams.h" #include "Common/CCDB/RCTSelectionFlags.h" #include "EventFiltering/Zorro.h" #include "EventFiltering/ZorroSummary.h" -#include "PWGLF/DataModel/mcCentrality.h" + #include "PWGHF/Core/CentralityEstimation.h" namespace o2::hf_occupancy diff --git a/PWGHF/Utils/utilsMcGen.h b/PWGHF/Utils/utilsMcGen.h index 863d7041102..bc0380bd198 100644 --- a/PWGHF/Utils/utilsMcGen.h +++ b/PWGHF/Utils/utilsMcGen.h @@ -17,11 +17,14 @@ #ifndef PWGHF_UTILS_UTILSMCGEN_H_ #define PWGHF_UTILS_UTILSMCGEN_H_ -#include - +#include #include -#include "CommonConstants/PhysicsConstants.h" +#include + +#include +#include +#include #include "Common/Core/RecoDecay.h" diff --git a/PWGHF/Utils/utilsPid.h b/PWGHF/Utils/utilsPid.h index 1ea021c096a..3289e60c737 100644 --- a/PWGHF/Utils/utilsPid.h +++ b/PWGHF/Utils/utilsPid.h @@ -17,6 +17,13 @@ #ifndef PWGHF_UTILS_UTILSPID_H_ #define PWGHF_UTILS_UTILSPID_H_ +#include + +#include + +#include "Common/DataModel/PIDResponseTOF.h" +#include "Common/DataModel/PIDResponseTPC.h" + namespace o2::aod::pid_tpc_tof_utils { /// @brief Species of HF-candidate daughter tracks diff --git a/PWGHF/Utils/utilsTrkCandHf.h b/PWGHF/Utils/utilsTrkCandHf.h index a1d1b41c10f..94fa2084370 100644 --- a/PWGHF/Utils/utilsTrkCandHf.h +++ b/PWGHF/Utils/utilsTrkCandHf.h @@ -16,7 +16,11 @@ #ifndef PWGHF_UTILS_UTILSTRKCANDHF_H_ #define PWGHF_UTILS_UTILSTRKCANDHF_H_ -#include "Framework/HistogramSpec.h" +#include + +#include + +#include namespace o2::hf_trkcandsel { From bca1addc279a9565ca5b2d646aaed4988ceedca7 Mon Sep 17 00:00:00 2001 From: yuanzhe <90246048+wang-yuanzhe@users.noreply.github.com> Date: Fri, 30 May 2025 19:53:20 +0200 Subject: [PATCH 1468/1650] [PWGLF] Add qa for mother track reconstruction (#11416) --- .../Nuspex/hyperhelium4sigmaRecoTask.cxx | 289 ++++++++++++++---- 1 file changed, 230 insertions(+), 59 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/hyperhelium4sigmaRecoTask.cxx b/PWGLF/TableProducer/Nuspex/hyperhelium4sigmaRecoTask.cxx index 567211b67b6..9f700dd8405 100644 --- a/PWGLF/TableProducer/Nuspex/hyperhelium4sigmaRecoTask.cxx +++ b/PWGLF/TableProducer/Nuspex/hyperhelium4sigmaRecoTask.cxx @@ -13,8 +13,10 @@ /// \brief QA and analysis task for hyper-helium4sigma (He4S) /// \author Yuanzhe Wang -#include #include +#include +#include +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -22,12 +24,19 @@ #include "Framework/ASoAHelpers.h" #include "ReconstructionDataFormats/Track.h" #include "Common/Core/RecoDecay.h" +#include "Common/Core/trackUtilities.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/PIDResponse.h" #include "CommonConstants/PhysicsConstants.h" #include "PWGLF/DataModel/LFKinkDecayTables.h" #include "PWGLF/DataModel/LFHyperhelium4sigmaTables.h" +#include "DetectorsBase/Propagator.h" +#include "DetectorsBase/GeometryManager.h" +#include "DataFormatsParameters/GRPObject.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "CCDB/BasicCCDBManager.h" + using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; @@ -39,10 +48,13 @@ using MCLabeledTracksIU = soa::Join; namespace { +constexpr float BzLowerLimit = -990.f; +constexpr std::array LayerRadii{2.33959f, 3.14076f, 3.91924f, 19.6213f, 24.5597f, 34.388f, 39.3329f}; constexpr int kITSLayers = 7; constexpr int kITSInnerBarrelLayers = 3; // constexpr int kITSOuterBarrelLayers = 4; std::shared_ptr hMotherCounter; +std::shared_ptr hMother2BCounter; std::shared_ptr hDauAlphaCounter; std::shared_ptr hDauTritonCounter; std::shared_ptr hDauProtonCounter; @@ -130,6 +142,19 @@ Channel getDecayChannelHe4S(TMCParticle const& particle, std::vector& list) return kNDecayChannel; } +//-------------------------------------------------------------- +// Extract track parameters from a mcparticle, use global coordinates as the local one +template +o2::track::TrackParametrization getTrackParFromMC(const T& mcparticle) +{ + int sign = mcparticle.pdgCode() > 0 ? 1 : -1; // ok for hyperhelium4sigma + TrackPrecision snp = mcparticle.py() / (mcparticle.pt() + 1.e-10f); + TrackPrecision tgl = mcparticle.pz() / (mcparticle.pt() + 1.e-10f); + std::array arraypar = {mcparticle.vy(), mcparticle.vz(), snp, + tgl, 2 * sign / (mcparticle.pt() + 1.e-10f)}; + return o2::track::TrackParametrization(mcparticle.vx(), 0, std::move(arraypar)); +} + //-------------------------------------------------------------- // construct index array from mcParticle to track template @@ -195,6 +220,9 @@ struct Hyperhelium4sigmaRecoTask { Produces outputDataTable; Produces outputMCTable; + Service ccdb; + o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; + std::vector mcHe4sIndices; // Histograms are defined with HistogramRegistry @@ -205,6 +233,18 @@ struct Hyperhelium4sigmaRecoTask { Configurable maxZVertex{"maxZVertex", 10.0f, "Accepted z-vertex range (cm)"}; Configurable cutNSigmaAl{"cutNSigmaAl", 5, "NSigmaTPCAlpha"}; + // CCDB options + Configurable inputBz{"inputBz", -999, "bz field, -999 is automatic"}; + Configurable ccdbPath{"ccdbPath", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; + Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; + Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; + + int mRunNumber; + float mBz; + o2::base::MatLayerCylSet* lut = nullptr; + void init(InitContext const&) { // Axes @@ -212,24 +252,77 @@ struct Hyperhelium4sigmaRecoTask { const AxisSpec ptAxis{50, -10, 10, "#it{p}_{T} (GeV/#it{c})"}; const AxisSpec nSigmaAxis{120, -6.f, 6.f, "n#sigma_{#alpha}"}; const AxisSpec massAxis{100, 3.85, 4.25, "m (GeV/#it{c}^{2})"}; + const AxisSpec diffPtAxis{200, -10.f, 10.f, "#Delta p_{T} (GeV/#it{c})"}; + const AxisSpec diffPzAxis{200, -10.f, 10.f, "#Delta p_{z} (GeV/#it{c})"}; + const AxisSpec radiusAxis{40, 0.f, 40.f, "R (cm)"}; registry.add("hEventCounter", "hEventCounter", HistType::kTH1F, {{2, 0, 2}}); registry.add("hVertexZCollision", "hVertexZCollision", HistType::kTH1F, {vertexZAxis}); registry.add("hCandidateCounter", "hCandidateCounter", HistType::kTH1F, {{3, 0, 3}}); - registry.add("h2MassHyperhelium4sigmaPt", "h2MassHyperhelium4sigmaPt", HistType::kTH2F, {{ptAxis, massAxis}}); - registry.add("h2NSigmaAlPt", "h2NSigmaAlPt", HistType::kTH2F, {{ptAxis, nSigmaAxis}}); - if (doprocessMC == true) { - registry.add("hDiffSVx", ";;#Delta x (cm)", HistType::kTH1F, {{200, -10, 10}}); - registry.add("hDiffSVy", ";;#Delta y (cm)", HistType::kTH1F, {{200, -10, 10}}); - registry.add("hDiffSVz", ";;#Delta z (cm)", HistType::kTH1F, {{200, -10, 10}}); + registry.add("hTrueCandidateCounter", "hTrueCandidateCounter", HistType::kTH1F, {{3, 0, 3}}); + registry.add("hDiffSVx", ";#Delta x (cm);", HistType::kTH1F, {{200, -10, 10}}); + registry.add("hDiffSVy", ";#Delta y (cm);", HistType::kTH1F, {{200, -10, 10}}); + registry.add("hDiffSVz", ";#Delta z (cm);", HistType::kTH1F, {{200, -10, 10}}); + registry.add("h2TrueMotherDiffPtVsRecSVR", ";Reconstruced SV R (cm);#Delta p_{T} (GeV/#it{c});", HistType::kTH2F, {radiusAxis, diffPtAxis}); + registry.add("h2TrueMotherDiffPzVsRecSVR", ";Reconstruced SV R (cm);#Delta p_{z} (GeV/#it{c});", HistType::kTH2F, {radiusAxis, diffPzAxis}); registry.add("hDiffDauPx", ";#Delta p_{x} (GeV/#it{c}); ", HistType::kTH1D, {{200, -10, 10}}); registry.add("hDiffDauPy", ";#Delta p_{y} (GeV/#it{c}); ", HistType::kTH1D, {{200, -10, 10}}); registry.add("hDiffDauPz", ";#Delta p_{z} (GeV/#it{c}); ", HistType::kTH1D, {{200, -10, 10}}); registry.add("h2TrueSignalMassPt", "h2TrueSignalMassPt", HistType::kTH2F, {{ptAxis, massAxis}}); registry.add("h2TrueSignalNSigmaAlPt", "h2TrueSignalNSigmaAlPt", HistType::kTH2F, {{ptAxis, nSigmaAxis}}); + + registry.add("hDCAXYMothToRecSV", "hDCAXYMothToRecSV", HistType::kTH1F, {{200, -10, 10}}); + registry.add("hDCAZMothToRecSV", "hDCAZMothToRecSV", HistType::kTH1F, {{200, -10, 10}}); + } + + registry.add("h2MassHyperhelium4sigmaPt", "h2MassHyperhelium4sigmaPt", HistType::kTH2F, {{ptAxis, massAxis}}); + registry.add("h2NSigmaAlPt", "h2NSigmaAlPt", HistType::kTH2F, {{ptAxis, nSigmaAxis}}); + + ccdb->setURL(ccdbPath); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setFatalWhenNull(false); + lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get(lutPath)); + } + + void initCCDB(aod::BCsWithTimestamps::iterator const& bc) + { + if (mRunNumber == bc.runNumber()) { + return; + } + auto timestamp = bc.timestamp(); + + o2::parameters::GRPObject* grpo = ccdb->getForTimeStamp(grpPath, timestamp); + o2::parameters::GRPMagField* grpmag = 0x0; + if (grpo) { + o2::base::Propagator::initFieldFromGRP(grpo); + if (inputBz < BzLowerLimit) { + // Fetch magnetic field from ccdb for current collision + mBz = grpo->getNominalL3Field(); + LOG(info) << "Retrieved GRP for timestamp " << timestamp << " with magnetic field of " << mBz << " kZG"; + } else { + mBz = inputBz; + } + } else { + grpmag = ccdb->getForTimeStamp(grpmagPath, timestamp); + if (!grpmag) { + LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for timestamp " << timestamp; + } + o2::base::Propagator::initFieldFromGRP(grpmag); + if (inputBz < BzLowerLimit) { + // Fetch magnetic field from ccdb for current collision + mBz = std::lround(5.f * grpmag->getL3Current() / 30000.f); + LOG(info) << "Retrieved GRP for timestamp " << timestamp << " with magnetic field of " << mBz << " kZG"; + } else { + mBz = inputBz; + } } + + mRunNumber = bc.runNumber(); + o2::base::Propagator::Instance()->setMatLUT(lut); + LOG(info) << "Task initialized for run " << mRunNumber << " with magnetic field " << mBz << " kZG"; } template @@ -328,7 +421,7 @@ struct Hyperhelium4sigmaRecoTask { } PROCESS_SWITCH(Hyperhelium4sigmaRecoTask, processData, "process data", true); - void processMC(MCLabeledCollisionsFull const& collisions, aod::KinkCands const& KinkCands, MCLabeledTracksIU const& tracks, aod::McParticles const& particlesMC, aod::McCollisions const& mcCollisions) + void processMC(MCLabeledCollisionsFull const& collisions, aod::KinkCands const& KinkCands, MCLabeledTracksIU const& tracks, aod::McParticles const& particlesMC, aod::McCollisions const& mcCollisions, aod::BCsWithTimestamps const&) { mcHe4sIndices.clear(); std::vector mcPartIndices; @@ -351,48 +444,76 @@ struct Hyperhelium4sigmaRecoTask { } for (const auto& kinkCand : KinkCands) { + auto motherTrack = kinkCand.trackMoth_as(); + auto dauTrack = kinkCand.trackDaug_as(); + + bool isTrueSignal = false; + if (motherTrack.has_mcParticle() && dauTrack.has_mcParticle()) { + auto mcMotherTrack = motherTrack.mcParticle_as(); + auto mcDauTrack = dauTrack.mcParticle_as(); + auto dChannel = getDecayChannelHe4S(mcMotherTrack, dauIDList); + if (dChannel == k2body && dauIDList[0] == mcDauTrack.globalIndex()) { + isTrueSignal = true; + } + } + registry.fill(HIST("hCandidateCounter"), 0); + if (isTrueSignal) { + registry.fill(HIST("hTrueCandidateCounter"), 0); + } auto collision = kinkCand.collision_as(); if (!isGoodCollisions[collision.globalIndex()]) { continue; } registry.fill(HIST("hCandidateCounter"), 1); + if (isTrueSignal) { + registry.fill(HIST("hTrueCandidateCounter"), 1); + } - auto dauTrack = kinkCand.trackDaug_as(); if (std::abs(dauTrack.tpcNSigmaAl()) > cutNSigmaAl) { continue; } float invMass = RecoDecay::m(std::array{std::array{kinkCand.pxDaug(), kinkCand.pyDaug(), kinkCand.pzDaug()}, std::array{kinkCand.pxDaugNeut(), kinkCand.pyDaugNeut(), kinkCand.pzDaugNeut()}}, std::array{o2::constants::physics::MassAlpha, o2::constants::physics::MassPi0}); registry.fill(HIST("hCandidateCounter"), 2); + if (isTrueSignal) { + registry.fill(HIST("hTrueCandidateCounter"), 2); + } registry.fill(HIST("h2MassHyperhelium4sigmaPt"), kinkCand.mothSign() * kinkCand.ptMoth(), invMass); registry.fill(HIST("h2NSigmaAlPt"), kinkCand.mothSign() * kinkCand.ptDaug(), dauTrack.tpcNSigmaAl()); - auto motherTrack = kinkCand.trackMoth_as(); Hyphe4sCandidate hyphe4sCand; fillCandidate(hyphe4sCand, collision, kinkCand, motherTrack, dauTrack); // qa for true signal - if (motherTrack.has_mcParticle() && dauTrack.has_mcParticle()) { + if (isTrueSignal) { auto mcMotherTrack = motherTrack.mcParticle_as(); auto mcDauTrack = dauTrack.mcParticle_as(); - auto dChannel = getDecayChannelHe4S(mcMotherTrack, dauIDList); - if (dChannel == k2body && dauIDList[0] == mcDauTrack.globalIndex()) { - registry.fill(HIST("hDiffSVx"), kinkCand.xDecVtx() - mcDauTrack.vx()); - registry.fill(HIST("hDiffSVy"), kinkCand.yDecVtx() - mcDauTrack.vy()); - registry.fill(HIST("hDiffSVz"), kinkCand.zDecVtx() - mcDauTrack.vz()); - registry.fill(HIST("hDiffDauPx"), kinkCand.pxDaug() - mcDauTrack.px()); - registry.fill(HIST("hDiffDauPy"), kinkCand.pyDaug() - mcDauTrack.py()); - registry.fill(HIST("hDiffDauPz"), kinkCand.pzDaug() - mcDauTrack.pz()); - registry.fill(HIST("h2TrueSignalMassPt"), kinkCand.mothSign() * kinkCand.ptMoth(), invMass); - registry.fill(HIST("h2TrueSignalNSigmaAlPt"), kinkCand.mothSign() * kinkCand.ptDaug(), dauTrack.tpcNSigmaAl()); - - hyphe4sCand.isSignal = true; - hyphe4sCand.isSignalReco = true; - hyphe4sCand.isCollReco = true; - hyphe4sCand.isSurvEvSelection = true; - fillCandidateMCInfo(hyphe4sCand, mcMotherTrack, mcDauTrack); - mcHe4sIndices.push_back(mcMotherTrack.globalIndex()); - } + float recSVR = std::sqrt(kinkCand.xDecVtx() * kinkCand.xDecVtx() + kinkCand.yDecVtx() * kinkCand.yDecVtx()); + registry.fill(HIST("hDiffSVx"), kinkCand.xDecVtx() - mcDauTrack.vx()); + registry.fill(HIST("hDiffSVy"), kinkCand.yDecVtx() - mcDauTrack.vy()); + registry.fill(HIST("hDiffSVz"), kinkCand.zDecVtx() - mcDauTrack.vz()); + registry.fill(HIST("h2TrueMotherDiffPtVsRecSVR"), recSVR, mcMotherTrack.pt() - kinkCand.ptMoth()); + registry.fill(HIST("h2TrueMotherDiffPzVsRecSVR"), recSVR, mcMotherTrack.pz() - kinkCand.pzMoth()); + registry.fill(HIST("hDiffDauPx"), kinkCand.pxDaug() - mcDauTrack.px()); + registry.fill(HIST("hDiffDauPy"), kinkCand.pyDaug() - mcDauTrack.py()); + registry.fill(HIST("hDiffDauPz"), kinkCand.pzDaug() - mcDauTrack.pz()); + registry.fill(HIST("h2TrueSignalMassPt"), kinkCand.mothSign() * kinkCand.ptMoth(), invMass); + registry.fill(HIST("h2TrueSignalNSigmaAlPt"), kinkCand.mothSign() * kinkCand.ptDaug(), dauTrack.tpcNSigmaAl()); + + hyphe4sCand.isSignal = true; + hyphe4sCand.isSignalReco = true; + hyphe4sCand.isCollReco = true; + hyphe4sCand.isSurvEvSelection = true; + fillCandidateMCInfo(hyphe4sCand, mcMotherTrack, mcDauTrack); + mcHe4sIndices.push_back(mcMotherTrack.globalIndex()); + + auto bc = collision.bc_as(); + initCCDB(bc); + std::array dcaInfo; + auto mcMotherTrackPar = getTrackParFromMC(mcMotherTrack); + o2::base::Propagator::Instance()->propagateToDCABxByBz({kinkCand.xDecVtx(), kinkCand.yDecVtx(), kinkCand.zDecVtx()}, mcMotherTrackPar, 2.f, matCorr, &dcaInfo); + registry.fill(HIST("hDCAXYMothToRecSV"), dcaInfo[0]); + registry.fill(HIST("hDCAZMothToRecSV"), dcaInfo[1]); } outputMCTable( @@ -471,7 +592,8 @@ struct Hyperhelium4sigmaQa { const AxisSpec invMassAxis{invMassBins, "Inv Mass (GeV/#it{c}^{2})"}; const AxisSpec diffPtAxis{200, -10.f, 10.f, "#Delta p_{T} (GeV/#it{c})"}; const AxisSpec diffPzAxis{200, -10.f, 10.f, "#Delta p_{z} (GeV/#it{c})"}; - const AxisSpec radiusAxis{radiusBins, "R (cm)"}; + const AxisSpec itsRadiusAxis{radiusBins, "ITS R (cm)"}; + const AxisSpec svRadiuAxis{radiusBins, "Decay Vertex R (cm)"}; auto hCollCounter = genQAHist.add("hCollCounter", "hCollCounter", HistType::kTH1F, {{2, 0.0f, 2.0f}}); hCollCounter->GetXaxis()->SetBinLabel(1, "Reconstructed Collisions"); @@ -504,24 +626,44 @@ struct Hyperhelium4sigmaQa { // efficiency/criteria studies for tracks which are true candidates hMotherCounter = recoQAHist.add("hMotherCounter", "", HistType::kTH1F, {{9, 0.f, 9.f}}); - hMotherCounter->GetXaxis()->SetBinLabel(1, "Generated"); - hMotherCounter->GetXaxis()->SetBinLabel(2, "Reconstructed"); - hMotherCounter->GetXaxis()->SetBinLabel(3, "eta"); - hMotherCounter->GetXaxis()->SetBinLabel(4, "has collision"); - hMotherCounter->GetXaxis()->SetBinLabel(5, "ITSonly"); - hMotherCounter->GetXaxis()->SetBinLabel(6, "ITS hits"); - hMotherCounter->GetXaxis()->SetBinLabel(7, "ITS IR"); - hMotherCounter->GetXaxis()->SetBinLabel(8, "ITS chi2"); - hMotherCounter->GetXaxis()->SetBinLabel(9, "pt"); - recoQAHist.add("hTrueMotherRVsDiffPt", ";#Delta p_{T} (GeV/#it{c});R (cm);", HistType::kTH2F, {diffPtAxis, radiusAxis}); - recoQAHist.add("hTrueMotherRVsDiffPz", ";#Delta p_{z} (GeV/#it{c});R (cm);", HistType::kTH2F, {diffPzAxis, radiusAxis}); - recoQAHist.add("hGoodMotherRVsDiffPt", ";#Delta p_{T} (GeV/#it{c});R (cm);", HistType::kTH2F, {diffPtAxis, radiusAxis}); - recoQAHist.add("hGoodMotherRVsDiffPz", ";#Delta p_{z} (GeV/#it{c});R (cm);", HistType::kTH2F, {diffPzAxis, radiusAxis}); + hMother2BCounter = recoQAHist.add("hMother2BCounter", "", HistType::kTH1F, {{9, 0.f, 9.f}}); + for (const auto& hist : {hMotherCounter, hMother2BCounter}) { + hist->GetXaxis()->SetBinLabel(1, "Generated"); + hist->GetXaxis()->SetBinLabel(2, "Reconstructed"); + hist->GetXaxis()->SetBinLabel(3, "eta"); + hist->GetXaxis()->SetBinLabel(4, "has collision"); + hist->GetXaxis()->SetBinLabel(5, "ITSonly"); + hist->GetXaxis()->SetBinLabel(6, "ITS hits"); + hist->GetXaxis()->SetBinLabel(7, "ITS IR"); + hist->GetXaxis()->SetBinLabel(8, "ITS chi2"); + hist->GetXaxis()->SetBinLabel(9, "pt"); + } + recoQAHist.add("h2TrueMotherSVRVsRLastITS", ";ITS R (cm); Decay Vertex R (cm);", HistType::kTH2F, {itsRadiusAxis, svRadiuAxis}); + recoQAHist.add("h2GoodMotherSVRVsRLastITS", ";ITS R (cm); Decay Vertex R (cm);", HistType::kTH2F, {itsRadiusAxis, svRadiuAxis}); + recoQAHist.add("h2TrueMotherDiffPtVsDiffR", ";#Delta R (cm);#Delta p_{T} (GeV/#it{c});", HistType::kTH2F, {{80, -40.f, 40.f}, diffPtAxis}); + recoQAHist.add("h2GoodMotherDiffPtVsDiffR", ";#Delta R (cm);#Delta p_{T} (GeV/#it{c});", HistType::kTH2F, {{80, -40.f, 40.f}, diffPtAxis}); + recoQAHist.add("h2TrueMotherDiffPtVsTrueSVR", ";Decay Vertex R (cm);#Delta p_{T} (GeV/#it{c});", HistType::kTH2F, {svRadiuAxis, diffPtAxis}); + recoQAHist.add("h2TrueMotherDiffPzVsTrueSVR", ";Decay Vertex R (cm);#Delta p_{z} (GeV/#it{c});", HistType::kTH2F, {svRadiuAxis, diffPzAxis}); + recoQAHist.add("h2GoodMotherDiffPtVsTrueSVR", ";Decay Vertex R (cm);#Delta p_{T} (GeV/#it{c});", HistType::kTH2F, {svRadiuAxis, diffPtAxis}); + recoQAHist.add("h2GoodMotherDiffPzVsTrueSVR", ";Decay Vertex R (cm);#Delta p_{z} (GeV/#it{c});", HistType::kTH2F, {svRadiuAxis, diffPzAxis}); + recoQAHist.add("h2TrueMotherDiffPtVsRLastITS", ";ITS R (cm);#Delta p_{T} (GeV/#it{c});", HistType::kTH2F, {itsRadiusAxis, diffPtAxis}); + recoQAHist.add("h2TrueMotherDiffPzVsRLastITS", ";ITS R (cm);#Delta p_{z} (GeV/#it{c});", HistType::kTH2F, {itsRadiusAxis, diffPzAxis}); + recoQAHist.add("h2GoodMotherDiffPtVsRLastITS", ";ITS R (cm);#Delta p_{T} (GeV/#it{c});", HistType::kTH2F, {itsRadiusAxis, diffPtAxis}); + recoQAHist.add("h2GoodMotherDiffPzVsRLastITS", ";ITS R (cm);#Delta p_{z} (GeV/#it{c});", HistType::kTH2F, {itsRadiusAxis, diffPzAxis}); hDauAlphaCounter = recoQAHist.add("hDauAlphaCounter", "", HistType::kTH1F, {{7, 0.f, 7.f}}); hDauTritonCounter = recoQAHist.add("hDauTritonCounter", "", HistType::kTH1F, {{7, 0.f, 7.f}}); hDauProtonCounter = recoQAHist.add("hDauProtonCounter", "", HistType::kTH1F, {{7, 0.f, 7.f}}); hDauPionCounter = recoQAHist.add("hDauPionCounter", "", HistType::kTH1F, {{7, 0.f, 7.f}}); + for (const auto& hist : {hDauAlphaCounter, hDauTritonCounter, hDauProtonCounter, hDauPionCounter}) { + hist->GetXaxis()->SetBinLabel(1, "Generated"); + hist->GetXaxis()->SetBinLabel(2, "Reconstructed"); + hist->GetXaxis()->SetBinLabel(3, "eta"); + hist->GetXaxis()->SetBinLabel(4, "has ITS && TPC"); + hist->GetXaxis()->SetBinLabel(5, "ITS quality"); + hist->GetXaxis()->SetBinLabel(6, "TPC n#sigma"); + hist->GetXaxis()->SetBinLabel(7, "has TOF"); + } recoQAHist.add("hDauAlphaTPCNSigma", "", HistType::kTH2F, {rigidityAxis, nsigmaAxis}); recoQAHist.add("hDauTritonTPCNSigma", "", HistType::kTH2F, {rigidityAxis, nsigmaAxis}); @@ -533,9 +675,10 @@ struct Hyperhelium4sigmaQa { Configurable skipRejectedEvents{"skipRejectedEvents", false, "Flag to skip events that fail event selection cuts"}; Configurable doEventCut{"doEventCut", true, "Apply event selection"}; Configurable maxZVertex{"maxZVertex", 10.0f, "Accepted z-vertex range (cm)"}; + Configurable only2BodyDecay{"only2BodyDecay", true, "Only consider 2-body decays for hyperhelium4sigma"}; Configurable etaMax{"etaMax", 1., "eta cut for tracks"}; - Configurable minPtMoth{"minPtMoth", 0.25, "Minimum pT/z of the hyperhelium4sigma candidate"}; + Configurable minPtMoth{"minPtMoth", 0.5, "Minimum pT/z of the hyperhelium4sigma candidate"}; Configurable tpcPidNsigmaCut{"tpcPidNsigmaCut", 5, "tpcPidNsigmaCut"}; Configurable nTPCClusMinDaug{"nTPCClusMinDaug", 80, "daug NTPC clusters cut"}; Configurable itsMaxChi2{"itsMaxChi2", 36, "max chi2 for ITS"}; @@ -656,21 +799,13 @@ struct Hyperhelium4sigmaQa { bool isMatter; if (mcparticle.pdgCode() == o2::constants::physics::Pdg::kHyperHelium4Sigma) { - genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), 1.5); isMatter = true; } else if (mcparticle.pdgCode() == -o2::constants::physics::Pdg::kHyperHelium4Sigma) { - genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), 2.5); isMatter = false; } else { continue; } - genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), 0.5); - genQAHist.fill(HIST("hEvtSelectedHyperHelium4SigmaCounter"), 0.5); - if (isSelectedMCCollisions[mcCollision.globalIndex()]) { - genQAHist.fill(HIST("hEvtSelectedHyperHelium4SigmaCounter"), 1.5); - } - auto dChannel = getDecayChannelHe4S(mcparticle, dauIDList); if (dChannel == kNDecayChannel) { genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), 10.5); @@ -678,8 +813,22 @@ struct Hyperhelium4sigmaQa { } // qa for mother tracks + if (dChannel == k2body) { + recoQAHist.fill(HIST("hMother2BCounter"), 0); + } else { + if (only2BodyDecay) { + continue; // skip 3-body decays + } + } recoQAHist.fill(HIST("hMotherCounter"), 0); + genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), 0.5); + genQAHist.fill(HIST("hGenHyperHelium4SigmaCounter"), isMatter ? 1.5 : 2.5); + genQAHist.fill(HIST("hEvtSelectedHyperHelium4SigmaCounter"), 0.5); + if (isSelectedMCCollisions[mcCollision.globalIndex()]) { + genQAHist.fill(HIST("hEvtSelectedHyperHelium4SigmaCounter"), 1.5); + } + float svPos[3] = {-999, -999, -999}; float dauAlphaMom[3] = {-999, -999, -999}; float dauTritonMom[3] = {-999, -999, -999}; @@ -701,9 +850,9 @@ struct Hyperhelium4sigmaQa { recoQAHist.fill(HIST("hDauAlphaCounter"), 0); if (mcPartIndices[mcparticleDaughter.globalIndex()] != -1) { auto track = tracks.rawIteratorAt(mcPartIndices[mcparticleDaughter.globalIndex()]); + daughterTrackCheck(track, hDauAlphaCounter, track.tpcNSigmaAl()); if (track.hasTPC()) { recoQAHist.fill(HIST("hDauAlphaTPCNSigma"), track.p() * track.sign(), track.tpcNSigmaAl()); - daughterTrackCheck(track, hDauAlphaCounter, track.tpcNSigmaAl()); } } } else if (std::abs(mcparticleDaughter.pdgCode()) == o2::constants::physics::Pdg::kTriton) { @@ -719,9 +868,9 @@ struct Hyperhelium4sigmaQa { recoQAHist.fill(HIST("hDauTritonCounter"), 0); if (mcPartIndices[mcparticleDaughter.globalIndex()] != -1) { auto track = tracks.rawIteratorAt(mcPartIndices[mcparticleDaughter.globalIndex()]); + daughterTrackCheck(track, hDauTritonCounter, track.tpcNSigmaTr()); if (track.hasTPC()) { recoQAHist.fill(HIST("hDauTritonTPCNSigma"), track.p() * track.sign(), track.tpcNSigmaTr()); - daughterTrackCheck(track, hDauTritonCounter, track.tpcNSigmaTr()); } } } else if (std::abs(mcparticleDaughter.pdgCode()) == PDG_t::kProton) { @@ -732,9 +881,9 @@ struct Hyperhelium4sigmaQa { recoQAHist.fill(HIST("hDauProtonCounter"), 0); if (mcPartIndices[mcparticleDaughter.globalIndex()] != -1) { auto track = tracks.rawIteratorAt(mcPartIndices[mcparticleDaughter.globalIndex()]); + daughterTrackCheck(track, hDauProtonCounter, track.tpcNSigmaPr()); if (track.hasTPC()) { recoQAHist.fill(HIST("hDauProtonTPCNSigma"), track.p() * track.sign(), track.tpcNSigmaPr()); - daughterTrackCheck(track, hDauProtonCounter, track.tpcNSigmaPr()); } } } else if (std::abs(mcparticleDaughter.pdgCode()) == PDG_t::kNeutron) { @@ -768,12 +917,34 @@ struct Hyperhelium4sigmaQa { if (mcPartIndices[mcparticle.globalIndex()] != -1) { auto motherTrack = tracks.rawIteratorAt(mcPartIndices[mcparticle.globalIndex()]); bool isGoodMother = motherTrackCheck(motherTrack, hMotherCounter); + if (dChannel == k2body) { + motherTrackCheck(motherTrack, hMother2BCounter); + } float svR = RecoDecay::sqrtSumOfSquares(svPos[0], svPos[1]); - recoQAHist.fill(HIST("hTrueMotherRVsDiffPt"), mcparticle.pt() - 2 * motherTrack.pt(), svR); - recoQAHist.fill(HIST("hTrueMotherRVsDiffPz"), mcparticle.pz() - 2 * motherTrack.pz(), svR); + float diffpt = mcparticle.pt() - 2 * motherTrack.pt(); + float diffpz = mcparticle.pz() - 2 * motherTrack.pz(); + + int lastITSLayerMoth = 0; + for (int i = 6; i >= 0; i--) { + if ((motherTrack.itsClusterSizes() >> (i * 4)) & 0xf) { + lastITSLayerMoth = i; + break; + } + } + float motherR = LayerRadii[lastITSLayerMoth]; + recoQAHist.fill(HIST("h2TrueMotherSVRVsRLastITS"), motherR, svR); + recoQAHist.fill(HIST("h2TrueMotherDiffPtVsDiffR"), svR - motherR, diffpt); + recoQAHist.fill(HIST("h2TrueMotherDiffPtVsTrueSVR"), svR, diffpt); + recoQAHist.fill(HIST("h2TrueMotherDiffPzVsTrueSVR"), svR, diffpz); + recoQAHist.fill(HIST("h2TrueMotherDiffPtVsRLastITS"), motherR, diffpt); + recoQAHist.fill(HIST("h2TrueMotherDiffPzVsRLastITS"), motherR, diffpz); if (isGoodMother) { - recoQAHist.fill(HIST("hGoodMotherRVsDiffPt"), mcparticle.pt() - 2 * motherTrack.pt(), svR); - recoQAHist.fill(HIST("hGoodMotherRVsDiffPz"), mcparticle.pz() - 2 * motherTrack.pz(), svR); + recoQAHist.fill(HIST("h2GoodMotherSVRVsRLastITS"), motherR, svR); + recoQAHist.fill(HIST("h2GoodMotherDiffPtVsDiffR"), svR - motherR, diffpt); + recoQAHist.fill(HIST("h2GoodMotherDiffPtVsTrueSVR"), svR, diffpt); + recoQAHist.fill(HIST("h2GoodMotherDiffPzVsTrueSVR"), svR, diffpz); + recoQAHist.fill(HIST("h2GoodMotherDiffPtVsRLastITS"), motherR, diffpt); + recoQAHist.fill(HIST("h2GoodMotherDiffPzVsRLastITS"), motherR, diffpz); } // fill qahist if charged daughters are also reconstructed bool isDauReconstructed = mcPartIndices[dauIDList[0]] != -1 && (dChannel == k2body ? true : mcPartIndices[dauIDList[1]] != -1); From 2ff9597f58538599c3b197e952a1fc8c2f43e5b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Fri, 30 May 2025 21:57:03 +0200 Subject: [PATCH 1469/1650] [Infrastructure] Bump pre-commit hooks (#11399) --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index dd9ef707b95..ebff84266f2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,10 +7,10 @@ repos: - id: trailing-whitespace - id: end-of-file-fixer - repo: https://github.com/pre-commit/mirrors-clang-format - rev: v18.1.3 # clang-format version + rev: v20.1.5 # clang-format version hooks: - id: clang-format - repo: https://github.com/cpplint/cpplint - rev: 2.0.0 + rev: 2.0.2 hooks: - id: cpplint From 11b60a1030a77cdb3c8a8165792b92978aa9c9da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Fri, 30 May 2025 21:57:55 +0200 Subject: [PATCH 1470/1650] O2 linter: Improve search patterns (#11398) --- Scripts/o2_linter.py | 153 +++++++++++++++++++------------------------ 1 file changed, 68 insertions(+), 85 deletions(-) diff --git a/Scripts/o2_linter.py b/Scripts/o2_linter.py index f5e8ce8c3e2..af7de5f101b 100644 --- a/Scripts/o2_linter.py +++ b/Scripts/o2_linter.py @@ -47,33 +47,39 @@ class Severity(Enum): class Reference(Enum): - O2 = 1 - ISO_CPP = 2 - LLVM = 3 - GOOGLE = 4 - LINTER = 5 - PWG_HF = 6 - PY_ZEN = 7 - PY_PEP8 = 8 + ISO_CPP = 1 + LLVM = 2 + GOOGLE = 3 + PY_ZEN = 4 + PY_PEP8 = 5 + O2 = 6 + PWG_HF = 7 + LINTER_1 = 8 + LINTER_2 = 9 references_list: "list[tuple[Reference, str, str]]" = [ - (Reference.O2, "ALICE O2 Coding Guidelines", "https://github.com/AliceO2Group/CodingGuidelines"), (Reference.ISO_CPP, "C++ Core Guidelines", "https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines"), (Reference.LLVM, "LLVM Coding Standards", "https://llvm.org/docs/CodingStandards.html"), (Reference.GOOGLE, "Google C++ Style Guide", "https://google.github.io/styleguide/cppguide.html"), + (Reference.PY_ZEN, "The Zen of Python", "https://peps.python.org/pep-0020/"), + (Reference.PY_PEP8, "Style Guide for Python Code", "https://peps.python.org/pep-0008/"), + (Reference.O2, "ALICE O2 Coding Guidelines", "https://github.com/AliceO2Group/CodingGuidelines"), + ( + Reference.PWG_HF, + "PWG-HF guidelines", + "https://aliceo2group.github.io/analysis-framework/docs/advanced-specifics/pwghf.html#contribute", + ), ( - Reference.LINTER, + Reference.LINTER_1, "Proposal of the O2 linter", "https://indico.cern.ch/event/1482467/#29-development-of-the-o2-linte", ), ( - Reference.PWG_HF, - "PWG-HF guidelines", - "https://aliceo2group.github.io/analysis-framework/docs/advanced-specifics/pwghf.html#contribute", + Reference.LINTER_2, + "Update of the O2 linter", + "https://indico.cern.ch/event/1513748/#29-o2-linter-development", ), - (Reference.PY_ZEN, "The Zen of Python", "https://peps.python.org/pep-0020/"), - (Reference.PY_PEP8, "Style Guide for Python Code", "https://peps.python.org/pep-0008/"), ] references: "dict[Reference, dict]" = {name: {"title": title, "url": url} for name, title, url in references_list} @@ -312,7 +318,7 @@ class TestIoStream(TestSpec): name = "include-iostream" message = "Do not include iostream. Use O2 logging instead." rationale = "Performance. Avoid injection of static constructors. Consistent logging." - references = [Reference.LLVM, Reference.LINTER] + references = [Reference.LLVM, Reference.LINTER_1] suffixes = [".h", ".cxx"] def test_line(self, line: str) -> bool: @@ -327,7 +333,7 @@ class TestUsingStd(TestSpec): name = "import-std-name" message = "Do not import names from the std namespace in headers." rationale = "Code safety. Avoid namespace pollution with common names." - references = [Reference.LINTER] + references = [Reference.LINTER_1] suffixes = [".h"] def test_line(self, line: str) -> bool: @@ -342,7 +348,7 @@ class TestUsingDirective(TestSpec): name = "using-directive" message = "Do not put using directives at global scope in headers." rationale = "Code safety. Avoid namespace pollution." - references = [Reference.O2, Reference.ISO_CPP, Reference.LLVM, Reference.GOOGLE, Reference.LINTER] + references = [Reference.O2, Reference.ISO_CPP, Reference.LLVM, Reference.GOOGLE, Reference.LINTER_1] suffixes = [".h"] def test_line(self, line: str) -> bool: @@ -357,7 +363,7 @@ class TestStdPrefix(TestSpec): name = "std-prefix" message = "Use std:: prefix for names from the std namespace." rationale = "Code clarity, safety and portability. Avoid ambiguity (e.g. abs)." - references = [Reference.LLVM, Reference.LINTER] + references = [Reference.LLVM, Reference.LINTER_1] suffixes = [".h", ".cxx", ".C"] prefix_bad = r"[^\w:\.\"]" patterns = [ @@ -401,7 +407,7 @@ class TestRootEntity(TestSpec): name = "root/entity" message = "Replace ROOT entities with equivalents from standard C++ or from O2." rationale = "Code simplicity and maintainability. O2 is not a ROOT code." - references = [Reference.ISO_CPP, Reference.LINTER, Reference.PY_ZEN] + references = [Reference.ISO_CPP, Reference.LINTER_1, Reference.PY_ZEN] suffixes = [".h", ".cxx"] def file_matches(self, path: str) -> bool: @@ -427,7 +433,7 @@ class TestRootLorentzVector(TestSpec): "Use std::array with RecoDecay methods or the ROOT::Math::LorentzVector template instead." ) rationale = "Performance. Use up-to-date tools." - references = [] + references = [Reference.LINTER_2] suffixes = [".h", ".cxx"] def test_line(self, line: str) -> bool: @@ -443,7 +449,7 @@ class TestPi(TestSpec): name = "external-pi" message = "Use the PI constant (and its multiples and fractions) defined in o2::constants::math." rationale = "Code maintainability." - references = [Reference.LINTER, Reference.PY_ZEN] + references = [Reference.LINTER_1, Reference.PY_ZEN] suffixes = [".h", ".cxx"] def file_matches(self, path: str) -> bool: @@ -463,7 +469,7 @@ class TestTwoPiAddSubtract(TestSpec): name = "two-pi-add-subtract" message = "Use RecoDecay::constrainAngle to restrict angle to a given range." rationale = "Code maintainability and safety. Use existing tools." - references = [Reference.ISO_CPP, Reference.LINTER, Reference.PY_ZEN] + references = [Reference.ISO_CPP, Reference.LINTER_1, Reference.PY_ZEN] suffixes = [".h", ".cxx"] def test_line(self, line: str) -> bool: @@ -484,7 +490,7 @@ class TestPiMultipleFraction(TestSpec): name = "pi-multiple-fraction" message = "Use multiples/fractions of PI defined in o2::constants::math." rationale = "Code maintainability." - references = [Reference.LINTER, Reference.PY_ZEN] + references = [Reference.LINTER_1, Reference.PY_ZEN] suffixes = [".h", ".cxx"] def test_line(self, line: str) -> bool: @@ -507,7 +513,7 @@ class TestPdgDatabase(TestSpec): "Use o2::constants::physics::Mass... or Service instead." ) rationale = "Performance." - references = [Reference.LINTER] + references = [Reference.LINTER_1] suffixes = [".h", ".cxx"] def file_matches(self, path: str) -> bool: @@ -526,7 +532,7 @@ class TestPdgExplicitCode(TestSpec): name = "pdg/explicit-code" message = "Avoid hard-coded PDG codes. Use named values from PDG_t or o2::constants::physics::Pdg instead." rationale = "Code comprehensibility, readability, maintainability and safety." - references = [Reference.O2, Reference.ISO_CPP, Reference.LINTER] + references = [Reference.O2, Reference.ISO_CPP, Reference.LINTER_1] suffixes = [".h", ".cxx", ".C"] def test_line(self, line: str) -> bool: @@ -549,7 +555,7 @@ class TestPdgExplicitMass(TestSpec): name = "pdg/explicit-mass" message = "Avoid hard-coded particle masses. Use o2::constants::physics::Mass... instead." rationale = "Code comprehensibility, readability, maintainability and safety." - references = [Reference.O2, Reference.ISO_CPP, Reference.LINTER] + references = [Reference.O2, Reference.ISO_CPP, Reference.LINTER_2] suffixes = [".h", ".cxx"] masses: "list[str]" = [] # list of mass values to detect @@ -593,7 +599,7 @@ class TestPdgKnownMass(TestSpec): name = "pdg/known-mass" message = "Use o2::constants::physics::Mass... instead of calling a database method for a known PDG code." rationale = "Performance." - references = [Reference.LINTER] + references = [Reference.LINTER_1] suffixes = [".h", ".cxx", ".C"] def test_line(self, line: str) -> bool: @@ -612,7 +618,7 @@ class TestLogging(TestSpec): name = "logging" message = "Use O2 logging (LOG, LOGF, LOGP)." rationale = "Logs easy to read and process." - references = [Reference.LINTER] + references = [Reference.LINTER_1] suffixes = [".h", ".cxx"] def file_matches(self, path: str) -> bool: @@ -653,7 +659,7 @@ class TestConstRefInSubscription(TestSpec): name = "const-ref-in-process" message = "Use constant references for table subscriptions in process functions." rationale = "Performance, code comprehensibility and safety." - references = [Reference.O2, Reference.ISO_CPP, Reference.LINTER] + references = [Reference.O2, Reference.ISO_CPP, Reference.LINTER_1] suffixes = [".cxx"] per_line = False @@ -731,7 +737,7 @@ class TestWorkflowOptions(TestSpec): "Use process function switches or metadata instead." ) rationale = "Not supported on AliHyperloop." - references = [Reference.LINTER] + references = [Reference.LINTER_1] suffixes = [".cxx"] per_line = False @@ -767,10 +773,10 @@ class TestMagicNumber(TestSpec): name = "magic-number" message = "Avoid magic numbers in expressions. Assign the value to a clearly named variable or constant." rationale = "Code comprehensibility, maintainability and safety." - references = [Reference.O2, Reference.ISO_CPP] + references = [Reference.O2, Reference.ISO_CPP, Reference.LINTER_2] suffixes = [".h", ".cxx", ".C"] pattern_compare = r"([<>]=?|[!=]=)" - pattern_number = r"[\+-]?([\d\.]+)f?" + pattern_number = r"[\+-]?([\d\.]+(e[\+-]?\d+)?)f?" def test_line(self, line: str) -> bool: if is_comment_cpp(line): @@ -779,7 +785,7 @@ def test_line(self, line: str) -> bool: iterators = re.finditer( rf" {self.pattern_compare} {self.pattern_number}|\W{self.pattern_number} {self.pattern_compare} ", line ) - matches = [(it.start(), it.group(2), it.group(3)) for it in iterators] + matches = [(it.start(), it.group(2), it.group(4)) for it in iterators] if not matches: return True # Ignore matches inside strings. @@ -805,7 +811,7 @@ class TestDocumentationFile(TestSpec): name = "doc/file" message = "Provide mandatory file documentation." rationale = "Code comprehensibility. Collaboration." - references = [Reference.O2, Reference.LINTER] + references = [Reference.O2, Reference.LINTER_1] suffixes = [".h", ".cxx", ".C"] per_line = False @@ -849,7 +855,7 @@ def test_file(self, path: str, content) -> bool: # Reference: https://rawgit.com/AliceO2Group/CodingGuidelines/master/naming_formatting.html rationale_names = "Code readability, comprehensibility and searchability." -references_names = [Reference.O2, Reference.LINTER] +references_names = [Reference.O2, Reference.LINTER_1] class TestNameFunctionVariable(TestSpec): @@ -989,29 +995,23 @@ class TestNameConstant(TestSpec): references = references_names suffixes = [".h", ".cxx", ".C"] + def __init__(self) -> None: + super().__init__() + keyword = r"(.+ )" # e.g. "static " + type_val = r"([\w:<>+\-*\/, ]+ )" # value type e.g. "std::array " + prefix = r"(\w+::)" # prefix with namespace or class, e.g. "MyClass::" + name_val = r"(\w+)" # name of the constant + array = r"(\[.*\])" # array declaration: "[...]" + assignment = r"( =|\(\d|{)" # value assignment, e.g. " = 2", " = expression", "(2)", "{2}", "{{...}}" + self.pattern = re.compile(rf"{keyword}?constexpr {type_val}?{prefix}*{name_val}{array}?{assignment}") + def test_line(self, line: str) -> bool: if is_comment_cpp(line): return True line = remove_comment_cpp(line) - words = line.split() - if "constexpr" not in words or "=" not in words: + if not (match := self.pattern.match(line)): return True - # Extract constant name. - words = words[: words.index("=")] # keep only words before "=" - constant_name = words[-1] # last word before "=" - if ( - constant_name.endswith("]") and "[" not in constant_name - ): # it's an array and we do not have the name before "[" here - opens_brackets = ["[" in w for w in words] - if not any(opens_brackets): # The opening "[" is not on this line. We have to give up. - return True - constant_name = words[opens_brackets.index(True)] # the name is in the first element with "[" - if "[" in constant_name: # Remove brackets for arrays. - constant_name = constant_name[: constant_name.index("[")] - if "::" in constant_name: # Remove the class prefix for methods. - constant_name = constant_name.split("::")[-1] - if "#" in constant_name: # Remove "#" for strings in macros. - constant_name = constant_name[: constant_name.index("#")] + constant_name = match.group(4) # The actual test comes here. if constant_name.startswith("k") and len(constant_name) > 1: # exception for special constants constant_name = constant_name[1:] # test the name without "k" @@ -1149,15 +1149,10 @@ class TestNameUpperCamelCase(TestSpec): def test_line(self, line: str) -> bool: if is_comment_cpp(line): return True - if not line.startswith(f"{self.keyword} "): + if not (match := re.match(rf"{self.keyword}( (class|struct))? (\w+)", line)): return True # Extract object name. - words = line.split() - if not words[1].isalnum(): # "struct : ...", "enum { ..." - return True - object_name = words[1] - if object_name in ("class", "struct") and len(words) > 2: # enum class ... or enum struct - object_name = words[2] + object_name = match.group(3) # The actual test comes here. return is_upper_camel_case(object_name) @@ -1216,7 +1211,7 @@ class TestNameFilePython(TestSpec): name = "name/file-python" message = "Use snake_case for names of Python files." rationale = rationale_names - references = [Reference.LINTER, Reference.PY_PEP8] + references = [Reference.LINTER_1, Reference.PY_PEP8] suffixes = [".py", ".ipynb"] per_line = False @@ -1278,7 +1273,7 @@ class TestNameTask(TestSpec): name = "name/o2-task" message = "Specify task name only when it cannot be derived from the struct name. Only append to the default name." rationale = f"{rationale_names} Correspondence struct ↔ device." - references = [Reference.LINTER] + references = [Reference.LINTER_1] suffixes = [".cxx"] per_line = False @@ -1423,7 +1418,7 @@ class TestNameFileWorkflow(TestSpec): '(Class implementation files should be in "Core" directories.)' ) rationale = f"{rationale_names} Correspondence file ↔ struct." - references = [Reference.LINTER] + references = [Reference.LINTER_1] suffixes = [".cxx"] per_line = False @@ -1466,7 +1461,7 @@ class TestNameConfigurable(TestSpec): "for the struct member as for the JSON string. (Declare the type and names on the same line.)" ) rationale = f"{rationale_names} Correspondence C++ code ↔ JSON." - references = [Reference.O2, Reference.LINTER] + references = [Reference.O2, Reference.LINTER_1] suffixes = [".h", ".cxx"] def file_matches(self, path: str) -> bool: @@ -1475,33 +1470,21 @@ def file_matches(self, path: str) -> bool: def test_line(self, line: str) -> bool: if is_comment_cpp(line): return True - if not line.startswith("Configurable"): - return True + if not (match := re.match(r"((o2::)?framework::)?Configurable(\w+|<.+>) (\w+)( = )?{([^,{]+),", line)): + return not re.match(r"((o2::)?framework::)?Configurable", line) # Extract Configurable name. - words = line.split() - if len(words) < 2: - return False - if len(words) > 2 and words[2] == "=": # expecting Configurable... nameCpp = {"nameJson", - name_cpp = words[1] # nameCpp - name_json = words[3][1:] # expecting "nameJson", - else: - names = words[1].split("{") # expecting Configurable... nameCpp{"nameJson", - if len(names) < 2: - return False - name_cpp = names[0] # nameCpp - name_json = names[1] # expecting "nameJson", - if not name_json: - return False + name_cpp = match.group(4) # nameCpp + name_json = match.group(6) # expecting "nameJson" if name_json[0] != '"': # JSON name is not a literal string. return True - name_json = name_json.strip('",') # expecting nameJson + name_json = name_json[1:-1] # Strip away quotation marks. # The actual test comes here. return is_lower_camel_case(name_cpp) and name_cpp == name_json # PWG-HF -references_hf = [Reference.LINTER, Reference.PWG_HF] +references_hf = [Reference.LINTER_1, Reference.PWG_HF] class TestHfNameStructClass(TestSpec): @@ -1747,7 +1730,7 @@ def main(): ref_names = [] for test in tests: if any(n > 0 for n in (test.n_issues, test.n_disabled, test.n_tolerated, n_files_bad[test.name])): - ref_ids = [ref.value for ref in test.references] + ref_ids = sorted(ref.value for ref in test.references) ref_names += test.references print( f"{test.name}{' ' * (len_max - len(test.name))}\t{test.n_issues}\t{test.n_tolerated}" @@ -1802,7 +1785,7 @@ def main(): print("Skipping writing in GITHUB_OUTPUT.") # Print tips. - print("\nTip: You can run the O2 linter locally with: python3 Scripts/o2_linter.py ") + print("\nTip: You can run the O2 linter locally from the O2Physics directory with: python3 Scripts/o2_linter.py ") if not passed: sys.exit(1) From 0654b385270ccc774c855d936d144159d18f9ed5 Mon Sep 17 00:00:00 2001 From: dajones2 <140733426+dajones2@users.noreply.github.com> Date: Fri, 30 May 2025 21:02:45 +0100 Subject: [PATCH 1471/1650] [PWGJE] Adding track outlier QA histogram (#11411) --- PWGJE/Tasks/jetHadronRecoil.cxx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PWGJE/Tasks/jetHadronRecoil.cxx b/PWGJE/Tasks/jetHadronRecoil.cxx index 3d0e6f1bb59..8391cf041b7 100644 --- a/PWGJE/Tasks/jetHadronRecoil.cxx +++ b/PWGJE/Tasks/jetHadronRecoil.cxx @@ -120,6 +120,7 @@ struct JetHadronRecoil { {"hPtTrack", "Track p_{T};p_{T};entries", {HistType::kTH1F, {{200, 0, 200}}}}, {"hEtaTrack", "Track #eta;#eta;entries", {HistType::kTH1F, {{100, -1.0, 1.0}}}}, {"hPhiTrack", "Track #phi;#phi;entries", {HistType::kTH1F, {{100, 0.0, o2::constants::math::TwoPI}}}}, + {"hPtTrackPtHard", "Track p_{T} vs #hat{p};p_{T};#frac{p_{T}}{#hat{p}}", {HistType::kTH2F, {{200, 0, 200}, {20, 0, 5}}}}, {"hConstituents3D", "3D constituents histogram;p_{T};#eta;#phi", {HistType::kTH3F, {{200, 0, 200}, {100, -1.0, 1.0}, {100, 0.0, o2::constants::math::TwoPI}}}}, {"hReferencePtDPhi", "jet p_{T} vs DPhi;#Delta#phi;p_{T,jet}", {HistType::kTH2F, {{100, 0, o2::constants::math::TwoPI}, {500, -100, 400}}}}, {"hReferencePtDPhiShifts", "rho shifts;#Delta#phi;p_{T,jet};shifts", {HistType::kTH3F, {{100, 0, o2::constants::math::TwoPI}, {500, -100, 400}, {20, 0.0, 2.0}}}}, @@ -231,6 +232,7 @@ struct JetHadronRecoil { registry.fill(HIST("hPtTrack"), track.pt(), weight); registry.fill(HIST("hEtaTrack"), track.eta(), weight); registry.fill(HIST("hPhiTrack"), track.phi(), weight); + registry.fill(HIST("hPtTrackPtHard"), track.pt(), track.pt() / pTHat); } if (nTT > 0) { From 349ccb6ff50d81364ba9013b7e67ddd313781f87 Mon Sep 17 00:00:00 2001 From: JStaa <39123272+JStaa@users.noreply.github.com> Date: Fri, 30 May 2025 22:52:34 +0200 Subject: [PATCH 1472/1650] [PWGCF] Added a check on MC Rec collisions corresponding to MC Gen collisions (#11412) Co-authored-by: ALICE Action Bot --- .../Tasks/threeParticleCorrelations.cxx | 49 ++++++++++++++++--- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx index cb57211fcaf..1a41054441f 100644 --- a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx +++ b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx @@ -88,11 +88,14 @@ struct ThreeParticleCorrelations { aod::pidTPCPi, aod::pidTPCKa, aod::pidTPCPr, aod::pidTOFFullPi, aod::pidTOFFullKa, aod::pidTOFFullPr, aod::pidTOFbeta>>; - // Table aliases - MC + // Table aliases - MC Gen using MyFilteredMCGenCollisions = soa::Filtered>; using MyFilteredMCGenCollision = MyFilteredMCGenCollisions::iterator; using MyFilteredMCParticles = soa::Filtered; - using MyFilteredMCRecCollision = soa::Filtered>::iterator; + + // Table aliases - MC Rec + using MCRecCollisions = soa::Join; + using MyFilteredMCRecCollisions = soa::Filtered; using MyFilteredMCV0s = soa::Filtered>; using MyFilteredMCTracks = soa::Filtered perCol = aod::mcparticle::mcCollisionId; + PresliceUnsorted perMCCol = aod::mccollisionlabel::mcCollisionId; ConfigurableAxis confCentBins{"confCentBins", {VARIABLE_WIDTH, 0.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f}, "ME Centrality binning"}; ConfigurableAxis confZvtxBins{"confZvtxBins", {VARIABLE_WIDTH, -7.0f, -5.0f, -3.0f, -1.0f, 0.0f, 1.0f, 3.0f, 5.0f, 7.0f}, "ME Zvtx binning"}; @@ -417,7 +421,6 @@ struct ThreeParticleCorrelations { // Start of the Mixed-Event correlations for (const auto& [coll_1, v0_1, coll_2, track_2] : pairData) { - if (!acceptEvent(coll_1, false) || !acceptEvent(coll_2, false)) { return; } @@ -481,9 +484,17 @@ struct ThreeParticleCorrelations { // End of the Mixed-Event Correlations } - void processMCSame(MyFilteredMCGenCollision const& collision, MyFilteredMCParticles const&) + void processMCSame(MyFilteredMCGenCollision const& collision, MyFilteredMCParticles const&, soa::SmallGroups const& recCollisions) { + if (recCollisions.size() == 1) { + for (const auto& recCollision : recCollisions) { + if (!acceptEvent(recCollision, false)) { + return; + } + } + } + rQARegistry.fill(HIST("hEventCentrality_MC"), collision.bestCollisionCentFT0C()); auto groupMCTriggers = mcTriggers->sliceByCached(aod::mcparticle::mcCollisionId, collision.globalIndex(), cache); auto groupMCAssociates = mcAssociates->sliceByCached(aod::mcparticle::mcCollisionId, collision.globalIndex(), cache); @@ -541,14 +552,28 @@ struct ThreeParticleCorrelations { // End of the MC Same-Event Correlations } - void processMCMixed(MyFilteredMCGenCollisions const&, MyFilteredMCParticles const&) + void processMCMixed(MyFilteredMCGenCollisions const&, MyFilteredMCParticles const&, MyFilteredMCRecCollisions const& recCollisions) { // Start of the MC Mixed-events Correlations for (const auto& [coll_1, v0_1, coll_2, particle_2] : pairMC) { + auto recCollsA1 = recCollisions.sliceBy(perMCCol, coll_1.globalIndex()); + auto recCollsA2 = recCollisions.sliceBy(perMCCol, coll_2.globalIndex()); + if (recCollsA1.size() == 1 && recCollsA2.size() == 1) { + for (const auto& recColl_1 : recCollsA1) { + if (!acceptEvent(recColl_1, false)) { + return; + } + } + for (const auto& recColl_2 : recCollsA2) { + if (!acceptEvent(recColl_2, false)) { + return; + } + } + } + auto groupMCTriggers = mcTriggers->sliceByCached(aod::mcparticle::mcCollisionId, coll_1.globalIndex(), cache); auto groupMCAssociates = mcAssociates->sliceByCached(aod::mcparticle::mcCollisionId, coll_2.globalIndex(), cache); - for (const auto& [trigger, associate] : soa::combinations(soa::CombinationsFullIndexPolicy(groupMCTriggers, groupMCAssociates))) { if (trigger.isPhysicalPrimary() && associate.isPhysicalPrimary()) { @@ -579,9 +604,17 @@ struct ThreeParticleCorrelations { // End of the MC Mixed-events Correlations } - void processMCGen(MyFilteredMCGenCollision const& collision, MyFilteredMCParticles const&) + void processMCGen(MyFilteredMCGenCollision const& collision, MyFilteredMCParticles const&, soa::SmallGroups const& recCollisions) { + if (recCollisions.size() == 1) { + for (const auto& recCollision : recCollisions) { + if (!acceptEvent(recCollision, false)) { + return; + } + } + } + auto groupMCTracks = mcTracks->sliceByCached(aod::mcparticle::mcCollisionId, collision.globalIndex(), cache); auto groupMCV0s = mcV0s->sliceByCached(aod::mcparticle::mcCollisionId, collision.globalIndex(), cache); @@ -621,7 +654,7 @@ struct ThreeParticleCorrelations { // End of the Monte-Carlo generated QA } - void processMCRec(MyFilteredMCRecCollision const& collision, MyFilteredMCV0s const& v0s, MyFilteredMCTracks const& tracks, aod::McCollisions const&, aod::McParticles const&) + void processMCRec(MyFilteredMCRecCollisions::iterator const& collision, MyFilteredMCV0s const& v0s, MyFilteredMCTracks const& tracks, aod::McCollisions const&, aod::McParticles const&) { if (!acceptEvent(collision, false) || !collision.has_mcCollision()) { From 7ab1a12fdf37cd969bd1b5351a2e8063af60096f Mon Sep 17 00:00:00 2001 From: Yash Patley <52608802+yashpatley@users.noreply.github.com> Date: Sat, 31 May 2025 02:25:42 +0530 Subject: [PATCH 1473/1650] [PWGCF] Update lambdaR2Correlation.cxx (#11419) --- .../Tasks/lambdaR2Correlation.cxx | 153 +++++------------- 1 file changed, 36 insertions(+), 117 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx index 1d3ce7815ef..01befb49204 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx @@ -71,14 +71,9 @@ DECLARE_SOA_COLUMN(Rap, rap, float); DECLARE_SOA_COLUMN(Mass, mass, float); DECLARE_SOA_COLUMN(PosTrackId, posTrackId, int64_t); DECLARE_SOA_COLUMN(NegTrackId, negTrackId, int64_t); -DECLARE_SOA_COLUMN(V0Type, v0Type, int8_t); DECLARE_SOA_COLUMN(CosPA, cosPA, float); DECLARE_SOA_COLUMN(DcaDau, dcaDau, float); -DECLARE_SOA_COLUMN(DcaPion, dcaPion, float); -DECLARE_SOA_COLUMN(DcaProton, dcaProton, float); -DECLARE_SOA_COLUMN(DcaLambda, dcaLambda, float); -DECLARE_SOA_COLUMN(DecayLength, decayLength, float); -DECLARE_SOA_COLUMN(RXY, rXY, float); +DECLARE_SOA_COLUMN(V0Type, v0Type, int8_t); DECLARE_SOA_COLUMN(V0PrmScd, v0PrmScd, int8_t); DECLARE_SOA_COLUMN(CorrFact, corrFact, float); } // namespace lambdatrack @@ -94,14 +89,9 @@ DECLARE_SOA_TABLE(LambdaTracks, "AOD", "LAMBDATRACKS", o2::soa::Index<>, lambdatrack::Mass, lambdatrack::PosTrackId, lambdatrack::NegTrackId, - lambdatrack::V0Type, lambdatrack::CosPA, lambdatrack::DcaDau, - lambdatrack::DcaPion, - lambdatrack::DcaProton, - lambdatrack::DcaLambda, - lambdatrack::DecayLength, - lambdatrack::RXY, + lambdatrack::V0Type, lambdatrack::V0PrmScd, lambdatrack::CorrFact); using LambdaTrack = LambdaTracks::iterator; @@ -168,13 +158,11 @@ enum TrackLabels { kLambdaNotPrPiMinus, kAntiLambdaNotAntiPrPiPlus, kPassTrueLambdaSel, - kEffCorrPt, - kEffCorrPtRap, + kEffCorrPtCent, kEffCorrPtRapCent, kNoEffCorr, - kPFCorrPt, kPFCorrPtCent, - kPFCorrPtCentPhi, + kPFCorrPtRapCent, kNoPFCorr, kCorrFact, kErrCorrFact, @@ -298,11 +286,7 @@ struct LambdaTableProducer { Configurable cGenPrimaryLambda{"cGenPrimaryLambda", true, "Primary Generated Lambda"}; Configurable cGenSecondaryLambda{"cGenSecondaryLambda", false, "Secondary Generated Lambda"}; Configurable cGenDecayChannel{"cGenDecayChannel", true, "Gen Level Decay Channel Flag"}; - - // Mc Matching - Configurable cSelMcMatchValue{"cSelMcMatchValue", 0.4, "Mc Matching Percentage"}; - Configurable cDoEventMcMatching{"cDoEventMcMatching", true, "Do Event Mc Matching Flag"}; - Configurable cDoTrackMcMatching{"cDoTrackMcMatching", false, "Do Track Mc Matching Flag"}; + Configurable cRecoMomResoFlag{"cRecoMomResoFlag", false, "Check effect of momentum space smearing on balance function"}; // Efficiency Correction Configurable cCorrectionFlag{"cCorrectionFlag", false, "Correction Flag"}; @@ -333,6 +317,7 @@ struct LambdaTableProducer { // Initialize Global Variables float cent = 0.; + float pt = 0., eta = 0., rap = 0., phi = 0.; bool bSecondaryLambdaFlag = false; void init(InitContext const&) @@ -341,9 +326,6 @@ struct LambdaTableProducer { ccdb->setURL(cUrlCCDB.value); ccdb->setCaching(true); - // Set ONNX Model - // network.initModel(cMLModelPathCCDB.value, true) - // initialize axis specifications const AxisSpec axisCols(5, 0.5, 5.5, ""); const AxisSpec axisTrks(30, 0.5, 30.5, ""); @@ -397,11 +379,6 @@ struct LambdaTableProducer { histos.add("QA/Lambda/h1f_V0_ctau", "V_{0} c#tau", kTH1F, {axisCTau}); histos.add("QA/Lambda/h1f_V0_gctau", "V_{0} #gammac#tau", kTH1F, {axisGCTau}); - histos.add("QA/Lambda/h2f_V0_ptpt", "Rec vs Truth p_{T}", kTH2F, {axisV0Pt, axisV0Pt}); - histos.add("QA/Lambda/h2f_V0_etaeta", "Rec vs Truth #eta", kTH2F, {axisV0Eta, axisV0Eta}); - histos.add("QA/Lambda/h2f_V0_raprap", "Rec vs Truth y", kTH2F, {axisV0Rap, axisV0Rap}); - histos.add("QA/Lambda/h2f_V0_phiphi", "Rec vs Truth #phi", kTH2F, {axisV0Phi, axisV0Phi}); - histos.add("QA/Lambda/h1f_pos_prong_pt", "Pos-Prong p_{T}", kTH1F, {axisTrackPt}); histos.add("QA/Lambda/h1f_neg_prong_pt", "Neg-Prong p_{T}", kTH1F, {axisTrackPt}); histos.add("QA/Lambda/h1f_pos_prong_eta", "Pos-Prong #eta-distribution", kTH1F, {axisV0Eta}); @@ -485,13 +462,11 @@ struct LambdaTableProducer { histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPassV0KinCuts, "kPassV0KinCuts"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPassV0TopoSel, "kPassV0TopoSel"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kAllSelPassed, "kAllSelPassed"); - histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kEffCorrPt, "kEffCorrPt"); - histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kEffCorrPtRap, "kEffCorrPtRap"); + histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kEffCorrPtCent, "kEffCorrPtCent"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kEffCorrPtRapCent, "kEffCorrPtRapCent"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kNoEffCorr, "kNoEffCorr"); - histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPFCorrPt, "kPFCorrPt"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPFCorrPtCent, "kPFCorrPtCent"); - histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPFCorrPtCentPhi, "kPFCorrPtCentPhi"); + histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPFCorrPtRapCent, "kPFCorrPtRapCent"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kNoPFCorr, "kNoPFCorr"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kCorrFact, "kCorrFact"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kErrCorrFact, "kErrCorrFact"); @@ -833,42 +808,6 @@ struct LambdaTableProducer { return true; } - template - bool getMcMatch(T const& vrec, T const& vgen) - { - float v = std::abs(1. - (vgen / vrec)); - - if (v >= cSelMcMatchValue) { - return false; - } - - return true; - } - - template - bool passMcMatching(V const& v0) - { - auto mcpart = v0.template mcParticle_as(); - - if (!getMcMatch(v0.pt(), mcpart.pt())) { - return false; - } - - if (!getMcMatch(v0.eta(), mcpart.eta())) { - return false; - } - - if (!getMcMatch(v0.yLambda(), mcpart.y())) { - return false; - } - - if (!getMcMatch(v0.phi(), mcpart.phi())) { - return false; - } - - return true; - } - template float getCorrectionFactors(V const& v0) { @@ -894,7 +833,10 @@ struct LambdaTableProducer { if (cGetEffFact) { TObject* objEff = reinterpret_cast(ccdbObj->FindObject(Form("%s", vCorrFactStrings[cCorrFactHist][part].c_str()))); TH1F* histEff = reinterpret_cast(objEff->Clone()); - if (histEff->GetDimension() == ThreeDimCorr) { + if (histEff->GetDimension() == TwoDimCorr) { + histos.fill(HIST("Tracks/h1f_tracks_info"), kEffCorrPtCent); + effFact = histEff->GetBinContent(histEff->FindBin(cent, v0.pt())); + } else if (histEff->GetDimension() == ThreeDimCorr) { histos.fill(HIST("Tracks/h1f_tracks_info"), kEffCorrPtRapCent); effFact = histEff->GetBinContent(histEff->FindBin(cent, v0.pt(), rap)); } else { @@ -930,18 +872,6 @@ struct LambdaTableProducer { return 1.; } - template - void fillMCMatchingHistos(V const& v0) - { - static constexpr std::string_view SubDir[] = {"QA/Lambda/", "QA/AntiLambda/"}; - auto mcpart = v0.template mcParticle_as(); - - histos.fill(HIST(SubDir[part]) + HIST("h2f_V0_ptpt"), v0.pt(), mcpart.pt()); - histos.fill(HIST(SubDir[part]) + HIST("h2f_V0_etaeta"), v0.eta(), mcpart.eta()); - histos.fill(HIST(SubDir[part]) + HIST("h2f_V0_raprap"), v0.yLambda(), mcpart.y()); - histos.fill(HIST(SubDir[part]) + HIST("h2f_V0_phiphi"), v0.phi(), mcpart.phi()); - } - template void fillLambdaQAHistos(C const& col, V const& v0, T const&) { @@ -1027,8 +957,7 @@ struct LambdaTableProducer { // initialize v0track objects ParticleType v0Type = kLambda; PrmScdType v0PrmScdType = kPrimary; - float mass = 0., ctau = 0., corr_fact = 1.; - float dcapiontopv = 0., dcaprotontopv = 0.; + float mass = 0., corr_fact = 1.; for (auto const& v0 : v0tracks) { // check for corresponding MCGen Particle @@ -1052,20 +981,16 @@ struct LambdaTableProducer { continue; } - // Get Lambda DcaDauToPV, decay length and mass - if (v0Type == kLambda) { - dcapiontopv = v0.dcanegtopv(); - dcaprotontopv = v0.dcapostopv(); - } else { - dcapiontopv = v0.dcapostopv(); - dcaprotontopv = v0.dcanegtopv(); - } - ctau = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * MassLambda0; - mass = (v0Type == kLambda) ? v0.mLambda() : v0.mAntiLambda(); - + // we have v0 as lambda histos.fill(HIST("Tracks/h1f_tracks_info"), kAllSelPassed); - // we have v0 as lambda + // Get Lambda mass and kinematic variables + mass = (v0Type == kLambda) ? v0.mLambda() : v0.mAntiLambda(); + pt = v0.pt(); + eta = v0.eta(); + rap = v0.yLambda(); + phi = v0.phi(); + // do MC analysis if constexpr (dmc == kMC) { histos.fill(HIST("Tracks/h2f_tracks_pid_before_sel"), v0.mcParticle().pdgCode(), v0.pt()); @@ -1076,19 +1001,22 @@ struct LambdaTableProducer { if (cSelectTrueLambda && !selTrueMcRecLambda(v0, tracks)) { // check for true Lambda/Anti-Lambda continue; } - if (cDoTrackMcMatching && !passMcMatching(v0)) { // Do Mc Matching - continue; - } - - // Fill MC Matching Histos (MC Matching Cuts to be implemented soon...) - if (v0Type == kLambda) { - fillMCMatchingHistos(v0); - } else { - fillMCMatchingHistos(v0); - } histos.fill(HIST("Tracks/h1f_tracks_info"), kPassTrueLambdaSel); histos.fill(HIST("Tracks/h2f_tracks_pid_after_sel"), v0.mcParticle().pdgCode(), v0.pt()); + + if (cRecoMomResoFlag) { + auto mc = v0.template mcParticle_as(); + pt = mc.pt(); + eta = mc.eta(); + rap = mc.y(); + phi = mc.phi(); + float y = (cDoEtaAnalysis) ? eta : rap; + // apply kinematic selection (On Truth) + if (!kinCutSelection(pt, std::abs(y), cMinV0Pt, cMaxV0Pt, cMaxV0Rap)) { + continue; + } + } } histos.fill(HIST("Tracks/h2f_armpod_after_sel"), v0.alpha(), v0.qtarm()); @@ -1109,10 +1037,8 @@ struct LambdaTableProducer { // Fill Lambda/AntiLambda Table lambdaTrackTable(lambdaCollisionTable.lastIndex(), v0.px(), v0.py(), v0.pz(), - v0.pt(), v0.eta(), v0.phi(), v0.yLambda(), mass, - v0.template posTrack_as().index(), v0.template negTrack_as().index(), - (int8_t)v0Type, v0.v0cosPA(), v0.dcaV0daughters(), dcapiontopv, dcaprotontopv, v0.dcav0topv(), ctau, - v0.v0radius(), v0PrmScdType, corr_fact); + pt, eta, phi, rap, mass, v0.template posTrack_as().index(), v0.template negTrack_as().index(), + v0.v0cosPA(), v0.dcaV0daughters(), (int8_t)v0Type, v0PrmScdType, corr_fact); } } @@ -1241,13 +1167,6 @@ struct LambdaTableProducer { if (!collisions.begin().has_mcCollision() || !selCollision(collisions.begin()) || collisions.begin().mcCollisionId() != mcCollision.globalIndex()) { return; } - // MC Matching - if (cDoEventMcMatching) { - // Vz Matching - if (!getMcMatch(collisions.begin().posZ(), mcCollision.posZ())) { - return; - } - } histos.fill(HIST("McGen/h1f_collisions_info"), kPassSelCol); histos.fill(HIST("McGen/h2f_collision_posZ"), mcCollision.posZ(), collisions.begin().posZ()); auto v0Tracks = V0s.sliceBy(perCollision, collisions.begin().globalIndex()); From e8c1d1d9ffe7724177e7f0b9843ad05fd0e38f3b Mon Sep 17 00:00:00 2001 From: chengtt0406 <39661669+chengtt0406@users.noreply.github.com> Date: Sat, 31 May 2025 05:35:40 +0800 Subject: [PATCH 1474/1650] [PWGHF] treeCreatorOmegacSt: Add new decay channel (Omega Kaon) and MC source flag (#11356) --- PWGHF/TableProducer/treeCreatorOmegacSt.cxx | 268 ++++++++++++++------ 1 file changed, 189 insertions(+), 79 deletions(-) diff --git a/PWGHF/TableProducer/treeCreatorOmegacSt.cxx b/PWGHF/TableProducer/treeCreatorOmegacSt.cxx index 2203536b195..5792492c39c 100644 --- a/PWGHF/TableProducer/treeCreatorOmegacSt.cxx +++ b/PWGHF/TableProducer/treeCreatorOmegacSt.cxx @@ -9,14 +9,16 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file taskOmegacSt.cxx -/// \brief Task to reconstruct Ωc from strangeness-tracked Ω and pion +/// \file treeCreatorOmegacSt.cxx +/// \brief Task to reconstruct Ωc from strangeness-tracked Ω and pion/kaon /// /// \author Jochen Klein +/// \author Tiantian Cheng #include #include #include +#include #include @@ -45,6 +47,7 @@ #include "PWGLF/DataModel/LFStrangenessTables.h" #include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/Utils/utilsTrkCandHf.h" +#include "PWGHF/DataModel/CandidateReconstructionTables.h" using namespace o2; using namespace o2::framework; @@ -67,6 +70,8 @@ DECLARE_SOA_COLUMN(DecayLengthCharmedBaryon, decayLengthCharmedBaryon, float); DECLARE_SOA_COLUMN(DecayLengthXYCharmedBaryon, decayLengthXYCharmedBaryon, float); DECLARE_SOA_COLUMN(DecayLengthCasc, decayLengthCasc, float); DECLARE_SOA_COLUMN(DecayLengthXYCasc, decayLengthXYCasc, float); +DECLARE_SOA_COLUMN(OriginGen, originGen, int); +DECLARE_SOA_COLUMN(DecayChannel, decayChannel, int); } // namespace hf_st_charmed_baryon_gen DECLARE_SOA_TABLE(HfStChBarGens, "AOD", "HFSTCHBARGEN", @@ -81,9 +86,11 @@ DECLARE_SOA_TABLE(HfStChBarGens, "AOD", "HFSTCHBARGEN", hf_st_charmed_baryon_gen::DecayLengthCharmedBaryon, hf_st_charmed_baryon_gen::DecayLengthXYCharmedBaryon, hf_st_charmed_baryon_gen::DecayLengthCasc, - hf_st_charmed_baryon_gen::DecayLengthXYCasc); + hf_st_charmed_baryon_gen::DecayLengthXYCasc, + hf_st_charmed_baryon_gen::OriginGen, + hf_st_charmed_baryon_gen::DecayChannel); -// CharmedBaryon -> Casc + Pion +// CharmedBaryon -> Casc + Pion/Kaon // -> Lambda + BachPi/BachKa // -> Pr + Pi namespace hf_st_charmed_baryon @@ -93,6 +100,8 @@ DECLARE_SOA_COLUMN(MassXi, massXi, float); DECLARE_SOA_COLUMN(MassLambda, massLambda, float); DECLARE_SOA_COLUMN(NSigmaTpcPion, nSigmaTpcPion, float); DECLARE_SOA_COLUMN(NSigmaTofPion, nSigmaTofPion, float); +DECLARE_SOA_COLUMN(NSigmaTpcKaon, nSigmaTpcKaon, float); +DECLARE_SOA_COLUMN(NSigmaTofKaon, nSigmaTofKaon, float); DECLARE_SOA_COLUMN(NSigmaTpcV0Pr, nSigmaTpcV0Pr, float); DECLARE_SOA_COLUMN(NSigmaTofV0Pr, nSigmaTofV0Pr, float); DECLARE_SOA_COLUMN(NSigmaTpcV0Pi, nSigmaTpcV0Pi, float); @@ -105,11 +114,11 @@ DECLARE_SOA_COLUMN(PxCasc, pxCasc, float); DECLARE_SOA_COLUMN(PyCasc, pyCasc, float); DECLARE_SOA_COLUMN(PzCasc, pzCasc, float); DECLARE_SOA_COLUMN(IsPositiveCasc, isPositiveCasc, bool); -DECLARE_SOA_COLUMN(PxPion, pxPion, float); -DECLARE_SOA_COLUMN(PyPion, pyPion, float); -DECLARE_SOA_COLUMN(PzPion, pzPion, float); -DECLARE_SOA_COLUMN(IsPositivePion, isPositivePion, bool); -DECLARE_SOA_COLUMN(ITSClusterMapPion, itsClusterMapPion, uint8_t); +DECLARE_SOA_COLUMN(PxPionOrKaon, pxPionOrKaon, float); +DECLARE_SOA_COLUMN(PyPionOrKaon, pyPionOrKaon, float); +DECLARE_SOA_COLUMN(PzPionOrKaon, pzPionOrKaon, float); +DECLARE_SOA_COLUMN(IsPositivePionOrKaon, isPositivePionOrKaon, bool); +DECLARE_SOA_COLUMN(ItsClusterMapPionOrKaon, itsClusterMapPionOrKaon, uint8_t); DECLARE_SOA_COLUMN(CpaCharmedBaryon, cpaCharmedBaryon, float); DECLARE_SOA_COLUMN(CpaXYCharmedBaryon, cpaXYCharmedBaryon, float); DECLARE_SOA_COLUMN(CpaCasc, cpaCasc, float); @@ -118,10 +127,10 @@ DECLARE_SOA_COLUMN(DcaXYCasc, dcaXYCasc, float); DECLARE_SOA_COLUMN(DcaXYUncCasc, dcaXYUncCasc, float); DECLARE_SOA_COLUMN(DcaZCasc, dcaZCasc, float); DECLARE_SOA_COLUMN(DcaZUncCasc, dcaZUncCasc, float); -DECLARE_SOA_COLUMN(DcaXYPion, dcaXYPion, float); -DECLARE_SOA_COLUMN(DcaXYUncPion, dcaXYUncPion, float); -DECLARE_SOA_COLUMN(DcaZPion, dcaZPion, float); -DECLARE_SOA_COLUMN(DcaZUncPion, dcaZUncPion, float); +DECLARE_SOA_COLUMN(DcaXYPionOrKaon, dcaXYPionOrKaon, float); +DECLARE_SOA_COLUMN(DcaXYUncPionOrKaon, dcaXYUncPionOrKaon, float); +DECLARE_SOA_COLUMN(DcaZPionOrKaon, dcaZPionOrKaon, float); +DECLARE_SOA_COLUMN(DcaZUncPionOrKaon, dcaZUncPionOrKaon, float); DECLARE_SOA_COLUMN(DcaXYPr, dcaXYPr, float); DECLARE_SOA_COLUMN(DcaZPr, dcaZPr, float); DECLARE_SOA_COLUMN(DcaXYKa, dcaXYKa, float); @@ -137,7 +146,8 @@ DECLARE_SOA_COLUMN(DecayLengthXYCharmedBaryonUntracked, decayLengthXYCharmedBary DECLARE_SOA_COLUMN(DecayLengthCasc, decayLengthCasc, float); DECLARE_SOA_COLUMN(DecayLengthXYCasc, decayLengthXYCasc, float); DECLARE_SOA_INDEX_COLUMN_FULL(MotherCasc, motherCasc, int, HfStChBarGens, "_Casc"); -DECLARE_SOA_INDEX_COLUMN_FULL(MotherPion, motherPion, int, HfStChBarGens, "_Pion"); +DECLARE_SOA_INDEX_COLUMN_FULL(MotherPionOrKaon, motherPionOrKaon, int, HfStChBarGens, "_PionOrKaon"); +DECLARE_SOA_COLUMN(OriginRec, originRec, int); } // namespace hf_st_charmed_baryon DECLARE_SOA_TABLE(HfStChBars, "AOD", "HFSTCHBAR", @@ -146,6 +156,8 @@ DECLARE_SOA_TABLE(HfStChBars, "AOD", "HFSTCHBAR", hf_st_charmed_baryon::MassLambda, hf_st_charmed_baryon::NSigmaTpcPion, hf_st_charmed_baryon::NSigmaTofPion, + hf_st_charmed_baryon::NSigmaTpcKaon, + hf_st_charmed_baryon::NSigmaTofKaon, hf_st_charmed_baryon::NSigmaTpcV0Pr, hf_st_charmed_baryon::NSigmaTofV0Pr, hf_st_charmed_baryon::NSigmaTpcV0Pi, @@ -158,11 +170,11 @@ DECLARE_SOA_TABLE(HfStChBars, "AOD", "HFSTCHBAR", hf_st_charmed_baryon::PyCasc, hf_st_charmed_baryon::PzCasc, hf_st_charmed_baryon::IsPositiveCasc, - hf_st_charmed_baryon::PxPion, - hf_st_charmed_baryon::PyPion, - hf_st_charmed_baryon::PzPion, - hf_st_charmed_baryon::IsPositivePion, - hf_st_charmed_baryon::ITSClusterMapPion, + hf_st_charmed_baryon::PxPionOrKaon, + hf_st_charmed_baryon::PyPionOrKaon, + hf_st_charmed_baryon::PzPionOrKaon, + hf_st_charmed_baryon::IsPositivePionOrKaon, + hf_st_charmed_baryon::ItsClusterMapPionOrKaon, hf_st_charmed_baryon::CpaCharmedBaryon, hf_st_charmed_baryon::CpaXYCharmedBaryon, hf_st_charmed_baryon::CpaCasc, @@ -171,10 +183,10 @@ DECLARE_SOA_TABLE(HfStChBars, "AOD", "HFSTCHBAR", hf_st_charmed_baryon::DcaXYUncCasc, hf_st_charmed_baryon::DcaZCasc, hf_st_charmed_baryon::DcaZUncCasc, - hf_st_charmed_baryon::DcaXYPion, - hf_st_charmed_baryon::DcaXYUncPion, - hf_st_charmed_baryon::DcaZPion, - hf_st_charmed_baryon::DcaZUncPion, + hf_st_charmed_baryon::DcaXYPionOrKaon, + hf_st_charmed_baryon::DcaXYUncPionOrKaon, + hf_st_charmed_baryon::DcaZPionOrKaon, + hf_st_charmed_baryon::DcaZUncPionOrKaon, hf_st_charmed_baryon::DcaXYPr, hf_st_charmed_baryon::DcaZPr, hf_st_charmed_baryon::DcaXYKa, @@ -190,16 +202,14 @@ DECLARE_SOA_TABLE(HfStChBars, "AOD", "HFSTCHBAR", hf_st_charmed_baryon::DecayLengthCasc, hf_st_charmed_baryon::DecayLengthXYCasc, hf_st_charmed_baryon::MotherCascId, - hf_st_charmed_baryon::MotherPionId); + hf_st_charmed_baryon::MotherPionOrKaonId, + hf_st_charmed_baryon::OriginRec); } // namespace o2::aod struct HfTreeCreatorOmegacSt { Produces outputTable; Produces outputTableGen; - Zorro zorro; - OutputObj zorroSummary{"zorroSummary"}; - Configurable materialCorrectionType{"materialCorrectionType", static_cast(o2::base::Propagator::MatCorrType::USEMatCorrLUT), "Type of material correction"}; Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Configurable grpMagPath{"grpMagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; @@ -213,8 +223,8 @@ struct HfTreeCreatorOmegacSt { Configurable minParamChange{"minParamChange", 1.e-3, "stop iterations if largest change of any X is smaller than this"}; Configurable minRelChi2Change{"minRelChi2Change", 0.9, "stop iterations if chi2/chi2old > this"}; Configurable minNoClsTrackedCascade{"minNoClsTrackedCascade", 70, "Minimum number of clusters required for daughters of tracked cascades"}; - Configurable minNoClsTrackedPion{"minNoClsTrackedPion", 70, "Minimum number of clusters required for associated pions"}; - Configurable filterCollisions{"filterCollisions", 8, "0: no filtering; 8: sel8"}; + Configurable minNoClsTrackedPionOrKaon{"minNoClsTrackedPionOrKaon", 70, "Minimum number of clusters required for associated pions/kaons"}; + Configurable useSel8Trigger{"useSel8Trigger", true, "filter collisions on sel 8 trigger"}; Configurable massWindowTrackedOmega{"massWindowTrackedOmega", 0.05, "Inv. mass window for tracked Omega"}; Configurable massWindowXiExclTrackedOmega{"massWindowXiExclTrackedOmega", 0.005, "Inv. mass window for exclusion of Xi for tracked Omega-"}; Configurable massWindowTrackedXi{"massWindowTrackedXi", 0., "Inv. mass window for tracked Xi"}; @@ -227,8 +237,14 @@ struct HfTreeCreatorOmegacSt { Configurable maxNSigmaV0Pr{"maxNSigmaV0Pr", 5., "Max Nsigma for proton from V0 from tracked cascade"}; Configurable maxNSigmaV0Pi{"maxNSigmaV0Pi", 5., "Max Nsigma for pion from V0 from tracked cascade"}; Configurable maxNSigmaPion{"maxNSigmaPion", 5., "Max Nsigma for pion to be paired with Omega"}; + Configurable maxNSigmaKaon{"maxNSigmaKaon", 5., "Max Nsigma for kaon to be paired with Omega"}; Configurable bzOnly{"bzOnly", true, "Use B_z instead of full field map"}; + const int itsNClsMin = 4; + const float tpcNclsFindableFraction = 0.8; + const float tpcChi2NclMax = 4.; + const float itsChi2NclMax = 36.; + SliceCache cache; Service ccdb; o2::vertexing::DCAFitterN<2> df2; @@ -241,14 +257,13 @@ struct HfTreeCreatorOmegacSt { using TracksExt = soa::Join; using TracksExtMc = soa::Join; - Filter collisionFilter = (filterCollisions.node() == 0) || - (filterCollisions.node() == 8 && o2::aod::evsel::sel8 == true); + Filter collisionFilter = (useSel8Trigger.node() == false) || (o2::aod::evsel::sel8 == true); // Preslice perCol = aod::track::collisionId; PresliceUnsorted trackIndicesPerCollision = aod::track_association::collisionId; PresliceUnsorted assignedTrackedCascadesPerCollision = aod::track::collisionId; - std::shared_ptr hCandidatesPrPi, hCandidatesV0Pi, hCandidatesCascPi; + std::shared_ptr hCandidatesPrPi, hCandidatesV0Pi, hCandidatesCascPiOrK; HistogramRegistry registry{ "registry", { @@ -267,14 +282,19 @@ struct HfTreeCreatorOmegacSt { {"hDecayLengthScaledId", "Decay length * M/p (true #Omega_{c});L (#mum / #it{c})", {HistType::kTH1D, {{200, 0., 500.}}}}, {"hDecayLengthScaledGen", "Decay length * M/p (MC id);L (#mum / #it{c})", {HistType::kTH1D, {{200, 0., 500.}}}}, {"hDecayLengthScaledMc", "Decay length * M/p (MC);L (#mum / #it{c})", {HistType::kTH1D, {{200, 0., 500.}}}}, - {"hMassOmegac", "inv. mass #Omega + #pi;inv. mass (GeV/#it{c}^{2})", {HistType::kTH1D, {{400, 1.5, 3.}}}}, - {"hMassOmegacVsPt", "inv. mass #Omega + #pi;inv. mass (GeV/#it{c}^{2});p_{T} (GeV/#it{c})", {HistType::kTH2D, {{400, 1.5, 3.}, {10, 0., 10.}}}}, + {"hMassOmegaPi", "inv. mass #Omega + #pi;inv. mass (GeV/#it{c}^{2})", {HistType::kTH1D, {{400, 1.5, 3.}}}}, + {"hMassOmegaPiVsPt", "inv. mass #Omega + #pi;inv. mass (GeV/#it{c}^{2});p_{T} (GeV/#it{c})", {HistType::kTH2D, {{400, 1.5, 3.}, {10, 0., 10.}}}}, + {"hMassOmegaK", "inv. mass #Omega + K;inv. mass (GeV/#it{c}^{2})", {HistType::kTH1D, {{400, 1.5, 3.}}}}, + {"hMassOmegaKVsPt", "inv. mass #Omega + K;inv. mass (GeV/#it{c}^{2});p_{T} (GeV/#it{c})", {HistType::kTH2D, {{400, 1.5, 3.}, {10, 0., 10.}}}}, {"hMassOmegacId", "inv. mass #Omega + #pi (MC ID);inv. mass (GeV/#it{c}^{2})", {HistType::kTH1D, {{400, 1.5, 3.}}}}, {"hMassOmegacGen", "inv. mass #Omega + #pi (from MC);inv. mass (GeV/#it{c}^{2})", {HistType::kTH1D, {{400, 1.5, 3.}}}}, {"hPtVsMassOmega", "#Omega mass;p_{T} (GeV/#it{c});m (GeV/#it{c}^3)", {HistType::kTH2D, {{200, 0., 10.}, {1000, 1., 3.}}}}, {"hDeltaPtVsPt", "Delta pt;p_{T} (GeV/#it{c});#Delta p_{T} / p_{T}", {HistType::kTH2D, {{200, 0., 10.}, {200, -1., 1.}}}}, }}; + Zorro zorro; + OutputObj zorroSummary{"zorroSummary"}; + void init(InitContext const&) { df2.setPropagateToPCA(propToDCA); @@ -297,15 +317,27 @@ struct HfTreeCreatorOmegacSt { /// candidate monitoring hCandidatesPrPi = registry.add("hCandidatesPrPi", "Pr-Pi candidates counter", {HistType::kTH1D, {axisCands}}); hCandidatesV0Pi = registry.add("hCandidatesV0Pi", "V0-Pi candidates counter", {HistType::kTH1D, {axisCands}}); - hCandidatesCascPi = registry.add("hCandidatesCascPi", "Casc-Pi candidates counter", {HistType::kTH1D, {axisCands}}); + hCandidatesCascPiOrK = registry.add("hCandidatesCascPiOrK", "Casc-Pi/K candidates counter", {HistType::kTH1D, {axisCands}}); setLabelHistoCands(hCandidatesPrPi); setLabelHistoCands(hCandidatesV0Pi); - setLabelHistoCands(hCandidatesCascPi); + setLabelHistoCands(hCandidatesCascPiOrK); } // processMC: loop over MC objects // processData: loop over reconstructed objects, no MC information // processGen: loop over reconstructed objects, use MC information (mutually exclusive? combine?) + int indexRec = -1; + int indexRecCharmBaryon = -1; + int8_t sign = -9; + int8_t signCasc = -9; + int8_t signV0 = -9; + int8_t origin = 0; // to be used for prompt/non prompt + int8_t nPiToMuV0{0}, nPiToMuCasc{0}, nPiToMuOmegac0{0}; + int8_t nKaToPiCasc{0}, nKaToPiOmegac0{0}; + std::vector idxBhadMothers{}; + int decayChannel = -1; // flag for different decay channels + bool isMatched = false; + static constexpr std::size_t NDaughters{2u}; void processMc(aod::McCollisions const&, aod::McParticles const& mcParticles) @@ -316,9 +348,10 @@ struct HfTreeCreatorOmegacSt { const bool isXiC = std::abs(mcParticle.pdgCode()) == constants::physics::Pdg::kXiC0; if (isOmegaC || isXiC) { const auto daughters = mcParticle.daughters_as(); - if (daughters.size() == 2) { + if (daughters.size() == NDaughters) { int idxPionDaughter = -1; int idxCascDaughter = -1; + int idxKaonDaughter = -1; const auto daughters = mcParticle.daughters_as(); for (const auto& daughter : daughters) { if (idxCascDaughter < 0 && (std::abs(daughter.pdgCode()) == (isOmegaC ? kOmegaMinus : kXiMinus))) { @@ -327,8 +360,22 @@ struct HfTreeCreatorOmegacSt { if (idxPionDaughter < 0 && (std::abs(daughter.pdgCode()) == kPiPlus)) { idxPionDaughter = daughter.globalIndex(); } + if (idxKaonDaughter < 0 && (std::abs(daughter.pdgCode()) == kKPlus)) { + idxKaonDaughter = daughter.globalIndex(); + } + } + if (idxPionDaughter >= 0 && idxCascDaughter >= 0) { + decayChannel = o2::aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaPi; // OmegaC -> Omega + Pi + } else if (idxKaonDaughter >= 0 && idxCascDaughter >= 0) { + decayChannel = o2::aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaK; // OmegaC -> Omega + K + } else { + LOG(warning) << "Decay channel not recognized!"; } - if ((idxPionDaughter >= 0) && (idxCascDaughter >= 0)) { + if (decayChannel != -1) { + int idxDaughter = (decayChannel == o2::aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaPi) ? idxPionDaughter : idxKaonDaughter; + auto particle = mcParticles.rawIteratorAt(idxDaughter); + origin = RecoDecay::getCharmHadronOrigin(mcParticles, particle, false, &idxBhadMothers); + const auto& cascDaughter = mcParticles.iteratorAt(idxCascDaughter); const auto& mcColl = mcParticle.mcCollision(); std::array primaryVertexPosGen = {mcColl.posX(), mcColl.posY(), mcColl.posZ()}; @@ -356,7 +403,9 @@ struct HfTreeCreatorOmegacSt { decayLengthGen, decayLengthXYGen, decayLengthCascGen, - decayLengthXYCascGen); + decayLengthXYCascGen, + origin, + decayChannel); mapMcPartToGenTable[mcParticle.globalIndex()] = outputTableGen.lastIndex(); } } @@ -368,7 +417,8 @@ struct HfTreeCreatorOmegacSt { template void fillTable(Collisions const& collisions, aod::AssignedTrackedCascades const& trackedCascades, - aod::TrackAssoc const& trackIndices) + aod::TrackAssoc const& trackIndices, + std::optional> mcParticles = std::nullopt) { const auto matCorr = static_cast(materialCorrectionType.value); @@ -454,8 +504,8 @@ struct HfTreeCreatorOmegacSt { } hCandidatesPrPi->Fill(SVFitting::FitOk); - std::array massesV0Daughters{o2::constants::physics::MassProton, o2::constants::physics::MassPiMinus}; - std::array, 2> momentaV0Daughters; + std::array massesV0Daughters{o2::constants::physics::MassProton, o2::constants::physics::MassPiMinus}; + std::array, NDaughters> momentaV0Daughters; o2::track::TrackPar trackParV0Pr = df2.getTrackParamAtPCA(0); trackParV0Pr.getPxPyPzGlo(momentaV0Daughters[0]); o2::track::TrackPar trackParV0Pi = df2.getTrackParamAtPCA(1); @@ -480,7 +530,7 @@ struct HfTreeCreatorOmegacSt { const auto decayLengthCascXY = RecoDecay::distanceXY(secondaryVertex, primaryVertexPos); o2::track::TrackPar trackParV0 = df2.getTrackParamAtPCA(0); o2::track::TrackPar trackParBachelor = df2.getTrackParamAtPCA(1); - std::array, 2> momentaCascDaughters; + std::array, NDaughters> momentaCascDaughters; trackParV0.getPxPyPzGlo(momentaCascDaughters[0]); trackParBachelor.getPxPyPzGlo(momentaCascDaughters[1]); o2::track::TrackParCov trackParCovCascUntracked = df2.createParentTrackParCov(0); @@ -489,9 +539,9 @@ struct HfTreeCreatorOmegacSt { const auto cpaCasc = RecoDecay::cpa(primaryVertexPos, df2.getPCACandidate(), pCasc); const auto cpaXYCasc = RecoDecay::cpaXY(primaryVertexPos, df2.getPCACandidate(), pCasc); - std::array massesXiDaughters = {o2::constants::physics::MassLambda0, o2::constants::physics::MassPiPlus}; + std::array massesXiDaughters = {o2::constants::physics::MassLambda0, o2::constants::physics::MassPiPlus}; const auto massXi = RecoDecay::m(momentaCascDaughters, massesXiDaughters); - std::array massesOmegaDaughters = {o2::constants::physics::MassLambda0, o2::constants::physics::MassKPlus}; + std::array massesOmegaDaughters = {o2::constants::physics::MassLambda0, o2::constants::physics::MassKPlus}; const auto massOmega = RecoDecay::m(momentaCascDaughters, massesOmegaDaughters); registry.fill(HIST("hDca"), std::sqrt(impactParameterCasc.getR2())); @@ -508,9 +558,11 @@ struct HfTreeCreatorOmegacSt { if (((std::abs(bachelor.tpcNSigmaKa()) < maxNSigmaBachelor) || (std::abs(bachelor.tpcNSigmaPi()) < maxNSigmaBachelor)) && (std::abs(v0TrackPr.tpcNSigmaPr()) < maxNSigmaV0Pr) && (std::abs(v0TrackPi.tpcNSigmaPi()) < maxNSigmaV0Pi)) { - std::array massesOmegacDaughters{o2::constants::physics::MassOmegaMinus, o2::constants::physics::MassPiPlus}; - std::array massesXicDaughters{o2::constants::physics::MassXiMinus, o2::constants::physics::MassPiPlus}; - std::array, 2> momenta; + + std::array massesOmegacToOmegaPi{o2::constants::physics::MassOmegaMinus, o2::constants::physics::MassPiPlus}; + std::array massesOmegacToOmegaK{o2::constants::physics::MassOmegaMinus, o2::constants::physics::MassKPlus}; + std::array massesXicDaughters{o2::constants::physics::MassXiMinus, o2::constants::physics::MassPiPlus}; + std::array, NDaughters> momenta; auto trackParCovPr = getTrackParCov(v0TrackPr); auto trackParCovKa = getTrackParCov(v0TrackPi); @@ -528,21 +580,21 @@ struct HfTreeCreatorOmegacSt { o2::base::Propagator::Instance()->propagateToDCABxByBz(primaryVertex, trackParCovPi, 2.f, matCorr, &impactParameterPi); } - for (auto trackId : groupedTrackIds) { + for (const auto& trackId : groupedTrackIds) { const auto track = trackId.template track_as(); if (track.globalIndex() == v0TrackPr.globalIndex() || track.globalIndex() == v0TrackPi.globalIndex() || track.globalIndex() == bachelor.globalIndex()) { continue; } - if ((track.itsNCls() >= 4) && - (track.tpcNClsFound() >= minNoClsTrackedPion) && - (track.tpcNClsCrossedRows() >= minNoClsTrackedPion) && - (track.tpcNClsCrossedRows() >= 0.8 * track.tpcNClsFindable()) && - (track.tpcChi2NCl() <= 4.f) && - (track.itsChi2NCl() <= 36.f) && - (std::abs(track.tpcNSigmaPi()) < maxNSigmaPion)) { - LOGF(debug, " .. combining with pion candidate %d", track.globalIndex()); + if ((track.itsNCls() >= itsNClsMin) && + (track.tpcNClsFound() >= minNoClsTrackedPionOrKaon) && + (track.tpcNClsCrossedRows() >= minNoClsTrackedPionOrKaon) && + (track.tpcNClsCrossedRows() >= tpcNclsFindableFraction * track.tpcNClsFindable()) && + (track.tpcChi2NCl() <= tpcChi2NclMax) && + (track.itsChi2NCl() <= itsChi2NclMax) && + (std::abs(track.tpcNSigmaPi()) < maxNSigmaPion || std::abs(track.tpcNSigmaKa()) < maxNSigmaKaon)) { + LOGF(debug, " .. combining with pion/kaon candidate %d", track.globalIndex()); int trackMotherId = -1; if constexpr (std::is_same::value) { if (track.has_mcParticle() && track.mcParticle().has_mothers()) { @@ -552,24 +604,24 @@ struct HfTreeCreatorOmegacSt { } } auto trackParCovCasc = getTrackParCov(trackCasc); - auto trackParCovPion = getTrackParCov(track); + auto trackParCovPionOrKaon = getTrackParCov(track); o2::dataformats::DCA impactParameterPion; if (bzOnly) { - o2::base::Propagator::Instance()->propagateToDCA(primaryVertex, trackParCovPion, bz, 2.f, matCorr, &impactParameterPion); + o2::base::Propagator::Instance()->propagateToDCA(primaryVertex, trackParCovPionOrKaon, bz, 2.f, matCorr, &impactParameterPion); } else { - o2::base::Propagator::Instance()->propagateToDCABxByBz(primaryVertex, trackParCovPion, 2.f, matCorr, &impactParameterPion); + o2::base::Propagator::Instance()->propagateToDCABxByBz(primaryVertex, trackParCovPionOrKaon, 2.f, matCorr, &impactParameterPion); } - hCandidatesCascPi->Fill(SVFitting::BeforeFit); + hCandidatesCascPiOrK->Fill(SVFitting::BeforeFit); try { auto decayLengthUntracked = -1.; auto decayLengthXYUntracked = -1.; - if (df2.process(trackParCovCascUntracked, trackParCovPion)) { + if (df2.process(trackParCovCascUntracked, trackParCovPionOrKaon)) { const auto& secondaryVertexUntracked = df2.getPCACandidate(); decayLengthUntracked = RecoDecay::distance(secondaryVertexUntracked, primaryVertexPos); decayLengthXYUntracked = RecoDecay::distanceXY(secondaryVertexUntracked, primaryVertexPos); } - if (df2.process(trackParCovCasc, trackParCovPion)) { + if (df2.process(trackParCovCasc, trackParCovPionOrKaon)) { const auto& secondaryVertex = df2.getPCACandidate(); const auto decayLength = RecoDecay::distance(secondaryVertex, primaryVertexPos); const auto decayLengthXY = RecoDecay::distanceXY(secondaryVertex, primaryVertexPos); @@ -581,12 +633,67 @@ struct HfTreeCreatorOmegacSt { df2.getTrackParamAtPCA(0).getPxPyPzGlo(momenta[0]); df2.getTrackParamAtPCA(1).getPxPyPzGlo(momenta[1]); - const auto massOmegaC = RecoDecay::m(momenta, massesOmegacDaughters); + const auto massOmegaPi = RecoDecay::m(momenta, massesOmegacToOmegaPi); + const auto massOmegaK = RecoDecay::m(momenta, massesOmegacToOmegaK); const auto massXiC = RecoDecay::m(momenta, massesXicDaughters); - registry.fill(HIST("hMassOmegac"), massOmegaC); - registry.fill(HIST("hMassOmegacVsPt"), massOmegaC, RecoDecay::pt(momenta[0], momenta[1])); + registry.fill(HIST("hMassOmegaPi"), massOmegaPi); + registry.fill(HIST("hMassOmegaPiVsPt"), massOmegaPi, RecoDecay::pt(momenta[0], momenta[1])); + registry.fill(HIST("hMassOmegaK"), massOmegaK); + registry.fill(HIST("hMassOmegaKVsPt"), massOmegaK, RecoDecay::pt(momenta[0], momenta[1])); + + //--- do the MC Rec match + if (mcParticles) { + auto arrayDaughters = std::array{ + trackId.template track_as(), // bachelor <- charm baryon + casc.bachelor_as(), // bachelor <- cascade + v0.posTrack_as(), // p <- lambda + v0.negTrack_as()}; // pi <- lambda + + auto arrayDaughtersCasc = std::array{ + casc.bachelor_as(), // bachelor <- cascade + v0.posTrack_as(), // p <- lambda + v0.negTrack_as()}; // pi <- lambda + auto arrayDaughtersV0 = std::array{ + v0.posTrack_as(), // p <- lambda + v0.negTrack_as()}; // pi <- lambda + + if (decayChannel == o2::aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaPi) { + // Match Omegac0 → Omega- + Pi+ + indexRec = RecoDecay::getMatchedMCRec(mcParticles->get(), arrayDaughters, o2::constants::physics::kOmegaC0, + std::array{+kPiPlus, +kKMinus, +kProton, +kPiMinus}, true, &sign, 3, &nPiToMuOmegac0, &nKaToPiOmegac0); + } else if (decayChannel == o2::aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaK) { + // Match Omegac0 → Omega- + K+ + indexRec = RecoDecay::getMatchedMCRec(mcParticles->get(), arrayDaughters, o2::constants::physics::kOmegaC0, + std::array{+kKPlus, +kKMinus, +kProton, +kPiMinus}, true, &sign, 3, &nPiToMuOmegac0, &nKaToPiOmegac0); + } + indexRecCharmBaryon = indexRec; + if (indexRec > -1) { + // Omega- → K pi p (Cascade match) + indexRec = RecoDecay::getMatchedMCRec(mcParticles->get(), arrayDaughtersCasc, +kOmegaMinus, std::array{+kKMinus, +kProton, +kPiMinus}, true, &signCasc, 2, &nPiToMuCasc, &nKaToPiCasc); + if (indexRec > -1) { + // Lambda → p pi (Lambda match) + indexRec = RecoDecay::getMatchedMCRec(mcParticles->get(), arrayDaughtersV0, +kLambda0, std::array{+kProton, +kPiMinus}, true, &signV0, 1, &nPiToMuV0); + if (decayChannel == o2::aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaPi) { + if (nPiToMuOmegac0 >= 1 && nKaToPiOmegac0 == 0) { + isMatched = true; + } else if (nPiToMuOmegac0 == 0 && nKaToPiOmegac0 == 0) { + isMatched = true; + } + } else if (decayChannel == o2::aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaK) { + if (nPiToMuOmegac0 == 0 && nKaToPiOmegac0 == 0) { + isMatched = true; + } + } + } + } + if (isMatched) { + auto particle = mcParticles->get().rawIteratorAt(indexRecCharmBaryon); + origin = RecoDecay::getCharmHadronOrigin(mcParticles->get(), particle, false, &idxBhadMothers); + } + } - if ((std::abs(massOmegaC - o2::constants::physics::MassOmegaC0) < massWindowOmegaC) || + if ((std::abs(massOmegaK - o2::constants::physics::MassOmegaC0) < massWindowOmegaC) || + (std::abs(massOmegaPi - o2::constants::physics::MassOmegaC0) < massWindowOmegaC) || (std::abs(massXiC - o2::constants::physics::MassXiC0) < massWindowXiC)) { registry.fill(HIST("hDecayLength"), decayLength * 1e4); registry.fill(HIST("hDecayLengthScaled"), decayLength * o2::constants::physics::MassOmegaC0 / RecoDecay::p(momenta[0], momenta[1]) * 1e4); @@ -595,6 +702,8 @@ struct HfTreeCreatorOmegacSt { massV0, track.tpcNSigmaPi(), track.tofNSigmaPi(), + track.tpcNSigmaKa(), + track.tofNSigmaKa(), v0TrackPr.tpcNSigmaPr(), v0TrackPr.tofNSigmaPr(), v0TrackPi.tpcNSigmaPi(), @@ -607,7 +716,7 @@ struct HfTreeCreatorOmegacSt { momenta[0][1], momenta[0][2], trackCasc.sign() > 0 ? true : false, - momenta[1][0], // pion momentum + momenta[1][0], // pion/kaon momentum momenta[1][1], momenta[1][2], track.sign() > 0 ? true : false, @@ -639,17 +748,18 @@ struct HfTreeCreatorOmegacSt { decayLengthCasc, decayLengthCascXY, trackCascMotherId, - trackMotherId); + trackMotherId, + origin); } } else { continue; } } catch (const std::runtime_error& error) { - LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN for Casc-Pi cannot work, skipping the candidate."; - hCandidatesCascPi->Fill(SVFitting::Fail); + LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN for Casc-Pi/K cannot work, skipping the candidate."; + hCandidatesCascPiOrK->Fill(SVFitting::Fail); continue; } - hCandidatesCascPi->Fill(SVFitting::FitOk); + hCandidatesCascPiOrK->Fill(SVFitting::FitOk); } } } @@ -678,10 +788,10 @@ struct HfTreeCreatorOmegacSt { aod::V0s const&, // TracksExt const& tracks, // TODO: should be TracksExtMc TracksExtMc const&, - aod::McParticles const&, + aod::McParticles const& mcParticles, aod::BCsWithTimestamps const&) { - fillTable(collisions, trackedCascades, trackIndices); + fillTable(collisions, trackedCascades, trackIndices, mcParticles); } PROCESS_SWITCH(HfTreeCreatorOmegacSt, processMcRec, "Process MC reco", true); @@ -747,8 +857,8 @@ struct HfTreeCreatorOmegacSt { LOG(debug) << "cascade with PDG code: " << pdgCode; if (std::abs(pdgCode) == kOmegaMinus) { LOG(debug) << "found Omega, looking for pions"; - std::array masses{o2::constants::physics::MassOmegaMinus, o2::constants::physics::MassPiPlus}; - std::array, 2> momenta; + std::array masses{o2::constants::physics::MassOmegaMinus, o2::constants::physics::MassPiPlus}; + std::array, NDaughters> momenta; std::array primaryVertexPos = {primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ()}; const auto& mcColl = mother.mcCollision(); std::array primaryVertexPosGen = {mcColl.posX(), mcColl.posY(), mcColl.posZ()}; @@ -773,7 +883,7 @@ struct HfTreeCreatorOmegacSt { registry.fill(HIST("hDeltaPtVsPt"), mcpart.pt(), (trackParCovPion.getPt() - mcpart.pt()) / mcpart.pt()); registry.fill(HIST("hMassOmegacId"), RecoDecay::m(momenta, masses)); - hCandidatesCascPi->Fill(SVFitting::BeforeFit); + hCandidatesCascPiOrK->Fill(SVFitting::BeforeFit); try { if (df2.process(trackParCovCasc, trackParCovPion)) { const auto& secondaryVertex = df2.getPCACandidate(); @@ -794,11 +904,11 @@ struct HfTreeCreatorOmegacSt { } } } - hCandidatesCascPi->Fill(SVFitting::FitOk); + hCandidatesCascPiOrK->Fill(SVFitting::FitOk); } } catch (const std::runtime_error& error) { LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN for Casc-Pi cannot work, skipping the candidate."; - hCandidatesCascPi->Fill(SVFitting::Fail); + hCandidatesCascPiOrK->Fill(SVFitting::Fail); continue; } From 5a62f20ed603fc60eb23d68e14395759157a63c8 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Sat, 31 May 2025 20:11:38 +0200 Subject: [PATCH 1475/1650] [PWGLF] Add new histogram and selection for mixed event (#11422) --- .../Tasks/Strangeness/taskLambdaSpinCorr.cxx | 72 ++++++++++++++----- 1 file changed, 55 insertions(+), 17 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx index 2b900fe82d6..4c5cc44de14 100644 --- a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx +++ b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx @@ -17,6 +17,8 @@ #include #include #include +#include +#include "Math/Vector2D.h" #include "Math/Vector3D.h" #include "Math/Vector4D.h" #include "Math/GenVector/Boost.h" @@ -59,6 +61,8 @@ struct LfTaskLambdaSpinCorr { Configurable cfgEvtRCTFlagCheckerLimitAcceptAsBad{"cfgEvtRCTFlagCheckerLimitAcceptAsBad", true, "Evt sel: RCT flag checker treat Limited Acceptance As Bad"}; } rctCut; // mixing + Configurable mixingCombination{"mixingCombination", 1, "mixing Combination"}; + Configurable mixingEvSel{"mixingEvSel", false, "mixingEvSel"}; Configurable cfgCutOccupancy{"cfgCutOccupancy", 2000, "Occupancy cut"}; ConfigurableAxis axisVertex{"axisVertex", {5, -10, 10}, "vertex axis for bin"}; ConfigurableAxis axisMultiplicityClass{"axisMultiplicityClass", {8, 0, 80}, "multiplicity percentile for bin"}; @@ -122,6 +126,9 @@ struct LfTaskLambdaSpinCorr { AxisSpec thnAxisInvMass{iMNbins, lbinIM, hbinIM, "#it{M} (GeV/#it{c}^{2})"}; AxisSpec thnAxisInvMasspair{iMNbinspair, lbinIMpair, hbinIMpair, "#it{M} (GeV/#it{c}^{2})"}; histos.add("hEvtSelInfo", "hEvtSelInfo", kTH1F, {{10, 0, 10.0}}); + histos.add("hPtDiff", "hPtDiff", kTH1F, {{1000, 0, 100.0}}); + histos.add("hRDiff", "hRDiff", kTH1F, {{640, 0, 16.0}}); + histos.add("hv0Mult", "hv0Mult", kTH1F, {{10001, -0.5, 10000.5}}); histos.add("hCentrality", "Centrality distribution", kTH1F, {{configcentAxis}}); histos.add("hSparseLambdaLambda", "hSparseLambdaLambda", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); histos.add("hSparseLambdaAntiLambda", "hSparseLambdaAntiLambda", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); @@ -550,7 +557,7 @@ struct LfTaskLambdaSpinCorr { if (additionalEvSel4 && !collision1.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { continue; } - if (additionalEvSel5 && !collision1.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + if (mixingEvSel && additionalEvSel5 && !collision1.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { continue; } @@ -560,7 +567,7 @@ struct LfTaskLambdaSpinCorr { if (additionalEvSel4 && !collision2.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { continue; } - if (additionalEvSel5 && !collision2.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + if (mixingEvSel && additionalEvSel5 && !collision2.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { continue; } @@ -570,11 +577,17 @@ struct LfTaskLambdaSpinCorr { auto groupV03 = V0s.sliceBy(tracksPerCollisionV0, collision2.globalIndex()); // for (auto& [t1, t2, t3] : soa::combinations(o2::soa::CombinationsFullIndexPolicy(groupV01, groupV02, groupV03))) { // LOGF(info, "Mixed event collisions: (%d, %d, %d)", t1.collisionId(),t2.collisionId(),t3.collisionId()); - auto maxV0Size = 1100; - if (groupV01.size() > maxV0Size || groupV02.size() > maxV0Size || groupV03.size() > maxV0Size) { - continue; - } - bool pairStatus[1150][1150] = {{false}}; + + // auto maxV0Size = 1400; + // if (groupV01.size() > maxV0Size || groupV02.size() > maxV0Size || groupV03.size() > maxV0Size) { + // continue; + // } + // bool pairStatus[1500][1500] = {{false}}; + + size_t rows = groupV03.size() + 20; + size_t cols = groupV01.size() + 20; + std::vector> pairStatus(rows, std::vector(cols, false)); + histos.fill(HIST("hv0Mult"), groupV01.size()); for (auto& [t1, t2] : soa::combinations(o2::soa::CombinationsFullIndexPolicy(groupV01, groupV02))) { bool pairfound = false; if (t2.index() <= t1.index()) { @@ -605,9 +618,14 @@ struct LfTaskLambdaSpinCorr { if (postrack1.globalIndex() == postrack2.globalIndex() || negtrack1.globalIndex() == negtrack2.globalIndex()) { continue; } + auto samePairSumPt = t1.pt() + t2.pt(); + auto samePairR = TMath::Sqrt(TMath::Power(t1.phi() - t2.phi(), 2.0) + TMath::Power(t1.eta() - t2.eta(), 2.0)); for (const auto& t3 : groupV03) { + // if (pairStatus[t3.index()][t2.index()]) { + // LOGF(info, "repeat match found v0 id: (%d, %d)", t3.index(), t2.index()); + // continue; + // } if (pairStatus[t3.index()][t2.index()]) { - // LOGF(info, "repeat match found v0 id: (%d, %d)", t3.index(), t2.index()); continue; } if (t1.collisionId() == t3.collisionId()) { @@ -623,13 +641,33 @@ struct LfTaskLambdaSpinCorr { if (lambdaTag1 != lambdaTag3 || aLambdaTag1 != aLambdaTag3) { continue; } - if (std::abs(t1.pt() - t3.pt()) > ptMix) { + // if (std::abs(t1.pt() - t3.pt()) > ptMix) { + // continue; + // } + // if (std::abs(t1.eta() - t3.eta()) > etaMix) { + // continue; + // } + // if (std::abs(t1.phi() - t3.phi()) > phiMix) { + // continue; + // } + auto mixPairSumPt = t3.pt() + t2.pt(); + auto mixPairR = TMath::Sqrt(TMath::Power(t3.phi() - t2.phi(), 2.0) + TMath::Power(t3.eta() - t2.eta(), 2.0)); + histos.fill(HIST("hPtDiff"), TMath::Abs(mixPairSumPt - samePairSumPt)); + histos.fill(HIST("hRDiff"), TMath::Abs(mixPairR - samePairR)); + if (mixingCombination == 0 && std::abs(t1.pt() - t3.pt()) > ptMix) { continue; } - if (std::abs(t1.eta() - t3.eta()) > etaMix) { + if (mixingCombination == 0 && std::abs(t1.eta() - t3.eta()) > etaMix) { continue; } - if (std::abs(t1.phi() - t3.phi()) > phiMix) { + if (mixingCombination == 0 && std::abs(t1.phi() - t3.phi()) > phiMix) { + continue; + } + + if (mixingCombination == 1 && std::abs(mixPairSumPt - samePairSumPt) > ptMix) { + continue; + } + if (mixingCombination == 1 && std::abs(mixPairR - samePairR) > etaMix) { continue; } if (lambdaTag2) { @@ -654,17 +692,17 @@ struct LfTaskLambdaSpinCorr { } if (lambdaTag2 && lambdaTag3) { fillHistograms(1, 0, 1, 0, lambda, lambda2, proton, proton2, centrality, 2); - } - if (aLambdaTag2 && aLambdaTag3) { + } else if (aLambdaTag2 && aLambdaTag3) { fillHistograms(0, 1, 0, 1, antiLambda, antiLambda2, antiProton, antiProton2, centrality, 2); - } - if (lambdaTag2 && aLambdaTag3) { + } else if (lambdaTag2 && aLambdaTag3) { fillHistograms(1, 0, 0, 1, lambda, antiLambda2, proton, antiProton2, centrality, 2); - } - if (aLambdaTag2 && lambdaTag3) { + } else if (aLambdaTag2 && lambdaTag3) { fillHistograms(0, 1, 1, 0, antiLambda, lambda2, antiProton, proton2, centrality, 2); + } else { + continue; } pairfound = true; + // pairStatus[t3.index()][t2.index()] = true; pairStatus[t3.index()][t2.index()] = true; // LOGF(info, "v0 id: (%d, %d)", t3.index(), t2.index()); if (pairfound) { From 341f94168126c8d79e7038e78011442a95f70795 Mon Sep 17 00:00:00 2001 From: Lars <146946151+ljoergen@users.noreply.github.com> Date: Sun, 1 Jun 2025 14:52:16 +0200 Subject: [PATCH 1476/1650] [PWGLF] angularCorrelationsInJets.cxx: added comments and UE correlations (#11425) Co-authored-by: ALICE Action Bot --- .../Nuspex/angularCorrelationsInJets.cxx | 296 ++++++++++++++---- 1 file changed, 233 insertions(+), 63 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx b/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx index 98ee6bfa968..20e1604e206 100644 --- a/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx +++ b/PWGLF/Tasks/Nuspex/angularCorrelationsInJets.cxx @@ -19,6 +19,7 @@ #include #include #include +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" @@ -66,7 +67,9 @@ struct AngularCorrelationsInJets { Configurable dopipiCorrelations{"dopipiCorrelations", false, "measure correlations for pi+-p+, pi--pi-"}; Configurable doJetCorrelations{"doJetCorrelations", false, "measure correlations for all particles inside jets"}; Configurable doFullCorrelations{"doFullCorrelations", false, "measure correlations for all particles in an event"}; + Configurable doUECorrelations{"doUECorrelations", false, "measure correlations for p-p, pbar-pbar in cone perp. to jet"}; Configurable measureKaons{"measureKaons", false, "measure correlations for K-K"}; + Configurable useBkgEstimateForUE{"useBkgEstimateForUE", false, "use bkg density for anti-kt-style clustering in UE"}; Configurable rejectEvents{"rejectEvents", false, "reject some events"}; Configurable rejectionPercentage{"rejectionPercentage", 3, "percentage of events to reject"}; @@ -120,7 +123,6 @@ struct AngularCorrelationsInJets { // QC Configurables Configurable zVtx{"zVtx", 10.0, "max zVertex"}; - Configurable rMax{"rMax", 0.3, "Maximum radius for jet and UE regions"}; Service ccdb; int mRunNumber; @@ -136,7 +138,7 @@ struct AngularCorrelationsInJets { using BCsWithRun2Info = soa::Join; using McCollisions = soa::Join; - Filter prelimTrackCuts = (aod::track::itsChi2NCl < maxChi2ITS && + Filter prelimTrackCuts = (aod::track::itsChi2NCl < maxChi2ITS && // some of the track cuts already as filter aod::track::tpcChi2NCl < maxChi2TPC && nabs(aod::track::dcaXY) < maxDCAxy && nabs(aod::track::dcaZ) < maxDCAz && @@ -147,7 +149,7 @@ struct AngularCorrelationsInJets { Preslice perCollisionMcTracksRun2 = o2::aod::track::collisionId; Preslice perCollisionMcTracksRun3 = o2::aod::track::collisionId; - AxisSpecs axisSpecs; + AxisSpecs axisSpecs; // struct for axis specs because at one point there were too many variables for the compiler HistogramRegistry registryData{"data", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; HistogramRegistry registryMC{"MC", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; @@ -158,7 +160,7 @@ struct AngularCorrelationsInJets { void init(o2::framework::InitContext&) { - mRunNumber = 0; + mRunNumber = 0; // this block is a remnant from the run2 code adapted here ccdb->setURL("http://alice-ccdb.cern.ch"); ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); @@ -220,6 +222,21 @@ struct AngularCorrelationsInJets { registryData.add("deltaPhiEtaMEProtonAntiproton", "#Delta#varphi vs #Delta#eta of proton-antiproton in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); } + if (doUECorrelations) { + registryData.add("deltaPhiSEProtonUE", "#Delta#varphi of UE protons in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiMEProtonUE", "#Delta#varphi of UE protons in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiEtaSEProtonUE", "#Delta#varphi vs #Delta#eta of UE protons in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaMEProtonUE", "#Delta#varphi vs #Delta#eta of UE protons in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiSEAntiprotonUE", "#Delta#varphi of UE antiprotons in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiMEAntiprotonUE", "#Delta#varphi of UE antiprotons in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiEtaSEAntiprotonUE", "#Delta#varphi vs #Delta#eta of UE antiprotons in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaMEAntiprotonUE", "#Delta#varphi vs #Delta#eta of UE antiprotons in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiSEPionUE", "#Delta#varphi of UE pions in same event", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiMEPionUE", "#Delta#varphi of UE pions in mixed events", HistType::kTH1D, {axisSpecs.angDistPhiAxis}); + registryData.add("deltaPhiEtaSEPionUE", "#Delta#varphi vs #Delta#eta of UE pions in same event", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + registryData.add("deltaPhiEtaMEPionUE", "#Delta#varphi vs #Delta#eta of UE pions in mixed events", HistType::kTH2D, {axisSpecs.angDistPhiAxis, axisSpecs.angDistEtaAxis}); + } + if (doprocessMCRun2 || doprocessMCRun3 || doppCorrelations || doapapCorrelations || dopapCorrelations) { registryData.add("ptJetProton", "p_{T} of protons", HistType::kTH1D, {axisSpecs.ptAxisPos}); registryData.add("dcaZJetProton", "DCA_{z} of high purity protons", HistType::kTH2F, {axisSpecs.ptAxisPos, axisSpecs.dcazAxis}); @@ -297,18 +314,25 @@ struct AngularCorrelationsInJets { registryQC.add("deltaJetPt", "deltaJetPt", HistType::kTH1F, {{200, -2, 2, "#Delta#it{p}_{T} (GeV/#it{c})"}}); registryQC.add("nParticlesClusteredInJet", "nParticlesClusteredInJet", HistType::kTH1F, {{50, 0, 50, "#it{N}_{ch}"}}); registryQC.add("ptParticlesClusteredInJet", "ptParticlesClusteredInJet", HistType::kTH1F, {{200, 0, 10, "#it{p}_{T} (GeV/#it{c})"}}); + + registryQC.add("whichUECone", "whichUECone", HistType::kTH1D, {{2, 0, 2, "UE cone"}}); } } + // create track buffers outside processes so the tracks can be stored independently of events for mixed-event distributions std::vector> fBufferProton; std::vector> fBufferAntiproton; std::vector> fBufferPiPlus; std::vector> fBufferPiMinus; std::vector> fBufferJet; std::vector> fBufferFull; + std::vector> fBufferProtonsUE; + std::vector> fBufferAntiprotonsUE; + std::vector> fBufferPiPlusUE; + std::vector> fBufferPiMinusUE; template - void initCCDB(Bc const& bc) + void initCCDB(Bc const& bc) // remnant from run2 code { if (mRunNumber == bc.runNumber()) { return; @@ -397,8 +421,9 @@ struct AngularCorrelationsInJets { return true; } + // reject any track that has TPC nsigma < 3 for more than 1 species to avoid ambiguity (not really suitable for the low statistics in jets, thus optional) template - bool singleSpeciesTPCNSigma(T const& track) // reject any track that has TPC nsigma < 3 for more than 1 species + bool singleSpeciesTPCNSigma(T const& track) { if (useRejectionCut && (track.tpcNSigmaStoreEl() < nsigmaRejection || track.tpcNSigmaStoreMu() < nsigmaRejection || track.tpcNSigmaPi() < nsigmaRejection || track.tpcNSigmaKa() < nsigmaRejection || track.tpcNSigmaStoreTr() < nsigmaRejection || track.tpcNSigmaStoreAl() < nsigmaRejection || track.tpcNSigmaDe() < nsigmaRejection || track.tpcNSigmaHe() < nsigmaRejection)) return false; @@ -426,6 +451,7 @@ struct AngularCorrelationsInJets { double midPt = 1.5; double highPt = 3.0; + // set max nsigma depending on pt range double maxTPCnsigma = protonTPCnsigma; double maxTOFnsigma = protonTOFnsigma; if (pt > midPt) { @@ -437,6 +463,7 @@ struct AngularCorrelationsInJets { maxTOFnsigma = protonTOFnsigma - 2; } + // only TPC below 0.7 GeV registryData.fill(HIST("tpcNSigmaProton"), track.pt(), track.tpcNSigmaPr()); if (pt < protonTPCTOFpT && (std::abs(track.tpcNSigmaPr()) > maxTPCnsigma)) return false; @@ -447,10 +474,11 @@ struct AngularCorrelationsInJets { tofNSigma = track.tofNSigmaPr(); } + // require TOF as well above 0.7 GeV if (pt > protonTPCTOFpT && ((std::abs(tofNSigma) > maxTOFnsigma) || std::abs(track.tpcNSigmaPr()) > maxTPCnsigma)) return false; - if (useRejectionCut && !singleSpeciesTPCNSigma(track)) + if (useRejectionCut && !singleSpeciesTPCNSigma(track)) // useRejectionCut false by default return false; return true; @@ -477,6 +505,7 @@ struct AngularCorrelationsInJets { double midPt = 1.5; double highPt = 3.0; + // set max nsigma depending on pt range double maxTPCnsigma = antiprotonTPCnsigma; double maxTOFnsigma = antiprotonTOFnsigma; if (pt > midPt) { @@ -488,6 +517,7 @@ struct AngularCorrelationsInJets { maxTOFnsigma = antiprotonTOFnsigma - 2; } + // only TPC below 0.7 GeV registryData.fill(HIST("tpcNSigmaAntiproton"), track.pt(), track.tpcNSigmaPr()); if (pt < antiprotonTPCTOFpT && (std::abs(track.tpcNSigmaPr()) > maxTPCnsigma)) return false; @@ -498,6 +528,7 @@ struct AngularCorrelationsInJets { tofNSigma = track.tofNSigmaPr(); } + // require TOF as well above 0.7 GeV if (pt > antiprotonTPCTOFpT && ((std::abs(tofNSigma) > maxTOFnsigma) || std::abs(track.tpcNSigmaPr()) > maxTPCnsigma)) return false; @@ -510,6 +541,7 @@ struct AngularCorrelationsInJets { template bool isPion(const T& track) { + // looser cuts because it's pions and also because the results aren't used in ToMCCA // DCA if (std::abs(track.dcaXY()) > pionDCAxy) return false; @@ -537,6 +569,7 @@ struct AngularCorrelationsInJets { template bool isKaon(const T& track) { + // looser cuts because this was just for the particle-jet pt correlations // DCA if (std::abs(track.dcaXY()) > kaonDCAxy) return false; @@ -563,11 +596,11 @@ struct AngularCorrelationsInJets { void setTrackBuffer(const auto& tempBuffer, auto& buffer) // refresh track buffer { - for (const auto& pair : tempBuffer) { + for (const auto& pair : tempBuffer) { // loop over angles we collected during same-event correlations if (static_cast(buffer.size()) == trackBufferSize) { - buffer.insert(buffer.begin(), pair); - buffer.resize(trackBufferSize); - } else if (static_cast(buffer.size()) < trackBufferSize) { + buffer.insert(buffer.begin(), pair); // insert angles at the beginning + buffer.resize(trackBufferSize); // trim at the end, down to buffer size + } else if (static_cast(buffer.size()) < trackBufferSize) { // buffer not full yet buffer.emplace_back(pair); } } @@ -587,6 +620,8 @@ struct AngularCorrelationsInJets { continue; } + // deltaPhi = (difference track 1 to jet axis 1) - (difference track 2 to jet axis 2) + // overlay jet axes from different events to pretend tracks are from same jet double phiToAxis = RecoDecay::constrainAngle(track.phi() - jetAxis.Phi(), 0); double etaToAxis = track.eta() - jetAxis.Eta(); double deltaPhi = RecoDecay::constrainAngle(phiToAxis - buffer.at(i).first, -constants::math::PIHalf); @@ -617,6 +652,18 @@ struct AngularCorrelationsInJets { registryData.fill(HIST("deltaPhiMEProtonAntiproton"), deltaPhi); registryData.fill(HIST("deltaPhiEtaMEProtonAntiproton"), deltaPhi, deltaEta); break; + case 5: + registryData.fill(HIST("deltaPhiMEProtonUE"), deltaPhi); + registryData.fill(HIST("deltaPhiEtaMEProtonUE"), deltaPhi, deltaEta); + break; + case 6: + registryData.fill(HIST("deltaPhiMEAntiprotonUE"), deltaPhi); + registryData.fill(HIST("deltaPhiEtaMEAntiprotonUE"), deltaPhi, deltaEta); + break; + case 7: + registryData.fill(HIST("deltaPhiMEPionUE"), deltaPhi); + registryData.fill(HIST("deltaPhiEtaMEPionUE"), deltaPhi, deltaEta); + break; } } // for (int i = 0; i < static_cast(buffer.size()); i++) } @@ -625,16 +672,16 @@ struct AngularCorrelationsInJets { { if (std::isnan(jetAxis.Phi())) return; - for (int i = 0; i < static_cast(particleVector.size()); i++) { + for (int i = 0; i < static_cast(particleVector.size()); i++) { // loop over SE tracks if (std::isnan(particleVector.at(i).phi())) continue; - double phiToAxis = RecoDecay::constrainAngle(particleVector.at(i).phi() - jetAxis.Phi(), 0); + double phiToAxis = RecoDecay::constrainAngle(particleVector.at(i).phi() - jetAxis.Phi(), 0); // for use in ME function double etaToAxis = particleVector.at(i).eta() - jetAxis.Eta(); if (std::abs(particleVector.at(i).phi()) > constants::math::TwoPI) { registryData.fill(HIST("trackProtocol"), 11); // # tracks failed with phi > 2 pi continue; } - for (int j = i + 1; j < static_cast(particleVector.size()); j++) { + for (int j = i + 1; j < static_cast(particleVector.size()); j++) { // loop over remaining SE tracks if ((j == static_cast(particleVector.size())) || std::isnan(particleVector.at(j).phi())) continue; if (std::abs(particleVector.at(j).phi()) > constants::math::TwoPI) { @@ -642,7 +689,7 @@ struct AngularCorrelationsInJets { continue; } - double deltaPhi = RecoDecay::constrainAngle(particleVector.at(i).phi() - particleVector.at(j).phi(), -constants::math::PIHalf); + double deltaPhi = RecoDecay::constrainAngle(particleVector.at(i).phi() - particleVector.at(j).phi(), -constants::math::PIHalf); // dPhi in [-pi/2, 3pi/2] double deltaEta = particleVector.at(i).eta() - particleVector.at(j).eta(); switch (particleType) { case -1: @@ -665,14 +712,26 @@ struct AngularCorrelationsInJets { registryData.fill(HIST("deltaPhiSEPion"), deltaPhi); registryData.fill(HIST("deltaPhiEtaSEPion"), deltaPhi, deltaEta); break; + case 5: + registryData.fill(HIST("deltaPhiSEProtonUE"), deltaPhi); + registryData.fill(HIST("deltaPhiEtaSEProtonUE"), deltaPhi, deltaEta); + break; + case 6: + registryData.fill(HIST("deltaPhiSEAntiprotonUE"), deltaPhi); + registryData.fill(HIST("deltaPhiEtaSEAntiprotonUE"), deltaPhi, deltaEta); + break; + case 7: + registryData.fill(HIST("deltaPhiSEPionUE"), deltaPhi); + registryData.fill(HIST("deltaPhiEtaSEPionUE"), deltaPhi, deltaEta); + break; } - } - fillMixedEventDeltas(particleVector.at(i), buffer, particleType, jetAxis); - tempBuffer.emplace_back(std::make_pair(phiToAxis, etaToAxis)); - } + } // for (int j = i + 1; j < static_cast(particleVector.size()); j++) + fillMixedEventDeltas(particleVector.at(i), buffer, particleType, jetAxis); // do ME distribution of current track vs all tracks in buffer + tempBuffer.emplace_back(std::make_pair(phiToAxis, etaToAxis)); // use pair to maintain phi-eta correlation + } // for (int i = 0; i < static_cast(particleVector.size()); i++) } - void doCorrelationsAnti(const auto& particleVector, const auto& particleVectorAnti, const auto& bufferAnti, auto& tempBuffer, const TVector3 jetAxis) // correlations between particle/antiparticle + void doCorrelationsAnti(const auto& particleVector, const auto& particleVectorAnti, const auto& bufferAnti, auto& tempBuffer, const TVector3 jetAxis) // correlations between proton/antiproton - same story as doCorrelations but different track vectors are correlated { if (std::isnan(jetAxis.Phi())) return; @@ -704,24 +763,6 @@ struct AngularCorrelationsInJets { } } - double getDeltaPhi(double a1, double a2) - { - double failedPhi = -999; - if (std::isnan(a1) || std::isnan(a2) || a1 == failedPhi || a2 == failedPhi) - return -999; - double deltaPhi(0); - double phi1 = RecoDecay::constrainAngle(a1, 0); - double phi2 = RecoDecay::constrainAngle(a2, 0); - double diff = std::abs(phi1 - phi2); - - if (diff <= constants::math::PI) - deltaPhi = diff; - if (diff > constants::math::PI) - deltaPhi = constants::math::TwoPI - diff; - - return deltaPhi; - } - void getPerpendicularAxis(TVector3 p, TVector3& u, double sign) { // Initialization @@ -776,9 +817,9 @@ struct AngularCorrelationsInJets { fastjet::PseudoJet subtractedJetPerp(0., 0., 0., 0.); subtractedJetPerp = bkgSub.doRhoAreaSub(jet, rhoPerp, rhoMPerp); - if (subtractedJetPerp.pt() < minJetPt) // cut on jet w/o bkg + if (subtractedJetPerp.pt() < minJetPt) // cut on jet without bkg return jetCounter; - if ((std::fabs(jet.eta()) + jetR) > (maxEta - deltaEtaEdge)) + if ((std::fabs(jet.eta()) + jetR) > (maxEta - deltaEtaEdge)) // keep jet away from acceptance edge return jetCounter; registryData.fill(HIST("ptTotalSubJetPerp"), subtractedJetPerp.pt()); registryQC.fill(HIST("rhoEstimatePerp"), jet.pt(), rhoPerp); @@ -800,13 +841,13 @@ struct AngularCorrelationsInJets { registryData.fill(HIST("numPartInJet"), jet.constituents().size()); TVector3 pJet(0., 0., 0.); - pJet.SetXYZ(jet.px(), jet.py(), jet.pz()); + pJet.SetXYZ(jet.px(), jet.py(), jet.pz()); // create jet axis - if (outputQC) { + if (outputQC) { // for comparison with antinucleiInJets registryQC.fill(HIST("jetBkgDeltaPt"), jetBkgDeltaPt); registryQC.fill(HIST("jetPtVsNumPart"), jet.pt(), jet.constituents().size()); - double maxRadius = 0; + double maxRadius = 0; // get max distance of a jet track to jet axis for (const auto& constituent : constituents) { registryData.fill(HIST("ptJetParticle"), constituent.pt()); registryQC.fill(HIST("phiJet"), constituent.phi()); @@ -840,28 +881,28 @@ struct AngularCorrelationsInJets { for (const auto& [index, track] : particles) { TVector3 particleDir(track.px(), track.py(), track.pz()); double deltaEtaJet = particleDir.Eta() - pJet.Eta(); - double deltaPhiJet = getDeltaPhi(particleDir.Phi(), pJet.Phi()); + double deltaPhiJet = RecoDecay::constrainAngle(particleDir.Phi() - pJet.Phi(), -constants::math::PI); double deltaRJet = std::abs(deltaEtaJet * deltaEtaJet + deltaPhiJet * deltaPhiJet); double deltaEtaUE1 = particleDir.Eta() - ueAxis1.Eta(); - double deltaPhiUE1 = getDeltaPhi(particleDir.Phi(), ueAxis1.Phi()); + double deltaPhiUE1 = RecoDecay::constrainAngle(particleDir.Phi() - ueAxis1.Phi(), -constants::math::PI); double deltaRUE1 = std::abs(deltaEtaUE1 * deltaEtaUE1 + deltaPhiUE1 * deltaPhiUE1); double deltaEtaUE2 = particleDir.Eta() - ueAxis2.Eta(); - double deltaPhiUE2 = getDeltaPhi(particleDir.Phi(), ueAxis2.Phi()); + double deltaPhiUE2 = RecoDecay::constrainAngle(particleDir.Phi() - ueAxis2.Phi(), -constants::math::PI); double deltaRUE2 = std::abs(deltaEtaUE2 * deltaEtaUE2 + deltaPhiUE2 * deltaPhiUE2); double failedPhi = -999; - if (deltaRJet < rMax) { + if (deltaRJet < jetR) { if (deltaPhiJet != failedPhi) registryQC.fill(HIST("deltaEtadeltaPhiJet"), deltaEtaJet, deltaPhiJet); nchJetPlusUE++; ptJetPlusUE = ptJetPlusUE + track.pt(); } - if (deltaRUE1 < rMax) { + if (deltaRUE1 < jetR) { if (deltaPhiUE1 != failedPhi) registryQC.fill(HIST("deltaEtadeltaPhiUE"), deltaEtaUE1, deltaPhiUE1); nchUE++; ptUE = ptUE + track.pt(); } - if (deltaRUE2 < rMax) { + if (deltaRUE2 < jetR) { if (deltaPhiUE2 != failedPhi) registryQC.fill(HIST("deltaEtadeltaPhiUE"), deltaEtaUE2, deltaPhiUE2); nchUE++; @@ -903,10 +944,10 @@ struct AngularCorrelationsInJets { fTempBufferAntiproton.clear(); fTempBufferJet.clear(); - for (const auto& pseudoParticle : constituents) { // analyse jet constituents - this is where the magic happens + for (const auto& pseudoParticle : constituents) { // analyse jet constituents registryData.fill(HIST("trackProtocol"), 2); int id = pseudoParticle.user_index(); - const auto& jetParticle = particles.at(id); + const auto& jetParticle = particles.at(id); // get track for corresponding PseudoJet index if (!selectTrack(jetParticle)) continue; jetAll.emplace_back(jetParticle); @@ -916,10 +957,11 @@ struct AngularCorrelationsInJets { registryData.fill(HIST("tofSignal"), jetParticle.pt() * jetParticle.sign(), jetParticle.beta()); } if (outputQC) { - double ptDiff = pseudoParticle.pt() - jetParticle.pt(); + double ptDiff = pseudoParticle.pt() - jetParticle.pt(); // track recovery from PseudoJet index working properly if this is close to 0 registryQC.fill(HIST("ptDiff"), ptDiff); } + // gather proton/antiproton/pion/kaon in respective vectors if ((doppCorrelations || dopapCorrelations) && isProton(jetParticle)) { registryData.fill(HIST("trackProtocol"), 3); // # high purity protons registryData.fill(HIST("ptJetProton"), jetParticle.pt()); @@ -949,16 +991,17 @@ struct AngularCorrelationsInJets { } } // for (const auto& pseudoParticle : constituents) - if (doJetCorrelations && jetAll.size() > 1) { // general correlation function + if (doJetCorrelations && jetAll.size() > 1) { // correlation of all jet particles doCorrelations(jetAll, fBufferJet, fTempBufferJet, 0, pJet); setTrackBuffer(fTempBufferJet, fBufferJet); } if (dopapCorrelations && (jetProtons.size() > 0) && (jetAntiprotons.size() > 0)) { doCorrelationsAnti(jetProtons, jetAntiprotons, fBufferAntiproton, fTempBufferProton, pJet); - doCorrelationsAnti(jetAntiprotons, jetProtons, fBufferProton, fTempBufferAntiproton, pJet); // divide SE distributions by 2 in post + doCorrelationsAnti(jetAntiprotons, jetProtons, fBufferProton, fTempBufferAntiproton, pJet); // don't worry about dividing result by 2, the factor will drop out in correlation function } int minNumPartForCorrelations = 2; + // need at least 2 tracks in any one list if ((static_cast(jetProtons.size()) < minNumPartForCorrelations) && (static_cast(jetAntiprotons.size()) < minNumPartForCorrelations) && (static_cast(jetPiPlus.size()) < minNumPartForCorrelations) && (static_cast(jetPiMinus.size()) < minNumPartForCorrelations)) return jetCounter; registryData.fill(HIST("eventProtocol"), 6); @@ -990,11 +1033,19 @@ struct AngularCorrelationsInJets { std::vector jetPiPlus; std::vector jetPiMinus; std::vector jetAll; + std::vector protonsUE; + std::vector antiprotonsUE; + std::vector piPlusUE; + std::vector piMinusUE; jetProtons.clear(); jetAntiprotons.clear(); jetPiPlus.clear(); jetPiMinus.clear(); jetAll.clear(); + protonsUE.clear(); + antiprotonsUE.clear(); + piPlusUE.clear(); + piMinusUE.clear(); std::vector> fTempBufferFull; fTempBufferFull.clear(); std::vector jetInput; // input for jet finder @@ -1002,8 +1053,8 @@ struct AngularCorrelationsInJets { std::vector particlesForCF; // particles for full event angular correlations jetInput.clear(); particles.clear(); - int index = 0; - int jetCounter = 0; + int index = 0; // index attached to input PseudoJets + int jetCounter = 0; // how many actual jets in the event for (const auto& track : tracks) { registryData.fill(HIST("trackProtocol"), 0); // # all tracks @@ -1058,15 +1109,134 @@ struct AngularCorrelationsInJets { auto [rhoPerp, rhoMPerp] = bkgSub.estimateRhoPerpCone(jetInput, jets); for (const auto& jet : jets) { + // this is where the magic happens jetCounter = analyseJet(jetCounter, jet, particles, jetProtons, jetAntiprotons, jetPiPlus, jetPiMinus, jetAll, rhoPerp, rhoMPerp); } registryData.fill(HIST("numJetsInEvent"), jetCounter); - TVector3 hardestJetAxis(jets.at(0).px(), jets.at(0).py(), jets.at(0).pz()); // for full event, use hardest jet as orientation + TVector3 hardestJetAxis(jets.at(0).px(), jets.at(0).py(), jets.at(0).pz()); // for full event and UE, use hardest jet as orientation doCorrelations(particlesForCF, fBufferFull, fTempBufferFull, -1, hardestJetAxis); setTrackBuffer(fTempBufferFull, fBufferFull); + + if (!doUECorrelations) + return; + + // UE correlations + TVector3 ueAxis1(0.0, 0.0, 0.0); + TVector3 ueAxis2(0.0, 0.0, 0.0); + getPerpendicularAxis(hardestJetAxis, ueAxis1, +1.0); + getPerpendicularAxis(hardestJetAxis, ueAxis2, -1.0); + + // untested so far, and the method may need to be rethought, this is the best I could think of + // useBkgEstimateForUE == true tries to somewhat imitate a seeded anti-kt algorithm centred around the perp cone axis + // useBkgEstimateForUE == false simply collects all tracks geometrically, with a hard cut at R + for (const auto& track : tracks) { // try for first cone + double uePt = rhoPerp * constants::math::PI * jetR * jetR; // pt = rho_bkg * area + double trackPt = track.pt(); + if (isProton(track)) { + double geometricDelta = (std::pow(track.phi() - ueAxis1.Phi(), 2) + std::pow(track.eta() - ueAxis1.Eta(), 2)) / (jetR * jetR); + double dij = useBkgEstimateForUE ? std::min(1 / (trackPt * trackPt), 1 / (uePt * uePt)) * geometricDelta : geometricDelta; + double diB = useBkgEstimateForUE ? 1 / (uePt * uePt) : 1; + if (dij < diB) { + protonsUE.emplace_back(track); + if (outputQC) + registryQC.fill(HIST("whichUECone"), 1); // see if track ends up in cone 1 or 2 + } + } else if (isAntiproton(track)) { + double geometricDelta = (std::pow(track.phi() - ueAxis1.Phi(), 2) + std::pow(track.eta() - ueAxis1.Eta(), 2)) / (jetR * jetR); + double dij = useBkgEstimateForUE ? std::min(1 / (trackPt * trackPt), 1 / (uePt * uePt)) * geometricDelta : geometricDelta; + double diB = useBkgEstimateForUE ? 1 / (uePt * uePt) : 1; + if (dij < diB) { + antiprotonsUE.emplace_back(track); + if (outputQC) + registryQC.fill(HIST("whichUECone"), 1); + } + } else if (isPion(track)) { + double geometricDelta = (std::pow(track.phi() - ueAxis1.Phi(), 2) + std::pow(track.eta() - ueAxis1.Eta(), 2)) / (jetR * jetR); + double dij = useBkgEstimateForUE ? std::min(1 / (trackPt * trackPt), 1 / (uePt * uePt)) * geometricDelta : geometricDelta; + double diB = useBkgEstimateForUE ? 1 / (uePt * uePt) : 1; + if (dij < diB) { + track.sign() > 0 ? piPlusUE.emplace_back(track) : piMinusUE.emplace_back(track); + if (outputQC) + registryQC.fill(HIST("whichUECone"), 1); + } + } + } // for (const auto& track : tracks) + + std::vector> fTempBufferProtonUE; + std::vector> fTempBufferAntiprotonUE; + std::vector> fTempBufferPiPlusUE; + std::vector> fTempBufferPiMinusUE; + + doCorrelations(protonsUE, fBufferProtonsUE, fTempBufferProtonUE, 5, ueAxis1); + setTrackBuffer(fTempBufferProtonUE, fBufferProtonsUE); + + doCorrelations(antiprotonsUE, fBufferAntiprotonsUE, fTempBufferAntiprotonUE, 6, ueAxis1); + setTrackBuffer(fTempBufferProtonUE, fBufferAntiprotonsUE); + + doCorrelations(piPlusUE, fBufferPiPlusUE, fTempBufferPiPlusUE, 7, ueAxis1); + setTrackBuffer(fTempBufferProtonUE, fBufferPiPlusUE); + + doCorrelations(piMinusUE, fBufferPiMinusUE, fTempBufferPiMinusUE, 7, ueAxis1); + setTrackBuffer(fTempBufferProtonUE, fBufferPiMinusUE); + + fTempBufferProtonUE.clear(); + fTempBufferAntiprotonUE.clear(); + fTempBufferPiPlusUE.clear(); + fTempBufferPiMinusUE.clear(); + fBufferProtonsUE.clear(); + fBufferAntiprotonsUE.clear(); + fBufferPiPlusUE.clear(); + fBufferPiMinusUE.clear(); + + for (const auto& track : tracks) { // try for second cone + double uePt = rhoPerp * constants::math::PI * jetR * jetR; // pt = rho_bkg * area + double trackPt = track.pt(); + if (isProton(track)) { + double geometricDelta = (std::pow(track.phi() - ueAxis2.Phi(), 2) + std::pow(track.eta() - ueAxis2.Eta(), 2)) / (jetR * jetR); + double dij = useBkgEstimateForUE ? std::min(1 / (trackPt * trackPt), 1 / (uePt * uePt)) * geometricDelta : geometricDelta; + double diB = useBkgEstimateForUE ? 1 / (uePt * uePt) : 1; + if (dij < diB) { + protonsUE.emplace_back(track); + if (outputQC) + registryQC.fill(HIST("whichUECone"), 2); // see if track ends up in cone 1 or 2 + } + } else if (isAntiproton(track)) { + double geometricDelta = (std::pow(track.phi() - ueAxis2.Phi(), 2) + std::pow(track.eta() - ueAxis2.Eta(), 2)) / (jetR * jetR); + double dij = useBkgEstimateForUE ? std::min(1 / (trackPt * trackPt), 1 / (uePt * uePt)) * geometricDelta : geometricDelta; + double diB = useBkgEstimateForUE ? 1 / (uePt * uePt) : 1; + if (dij < diB) { + antiprotonsUE.emplace_back(track); + if (outputQC) + registryQC.fill(HIST("whichUECone"), 2); + } + } else if (isPion(track)) { + double geometricDelta = (std::pow(track.phi() - ueAxis2.Phi(), 2) + std::pow(track.eta() - ueAxis2.Eta(), 2)) / (jetR * jetR); + double dij = useBkgEstimateForUE ? std::min(1 / (trackPt * trackPt), 1 / (uePt * uePt)) * geometricDelta : geometricDelta; + double diB = useBkgEstimateForUE ? 1 / (uePt * uePt) : 1; + if (dij < diB) { + track.sign() > 0 ? piPlusUE.emplace_back(track) : piMinusUE.emplace_back(track); + if (outputQC) + registryQC.fill(HIST("whichUECone"), 2); + } + } + } // for (const auto& track : tracks) + + doCorrelations(protonsUE, fBufferProtonsUE, fTempBufferProtonUE, 5, ueAxis2); + setTrackBuffer(fTempBufferProtonUE, fBufferProtonsUE); + + doCorrelations(antiprotonsUE, fBufferAntiprotonsUE, fTempBufferAntiprotonUE, 6, ueAxis2); + setTrackBuffer(fTempBufferProtonUE, fBufferAntiprotonsUE); + + doCorrelations(piPlusUE, fBufferPiPlusUE, fTempBufferPiPlusUE, 7, ueAxis2); + setTrackBuffer(fTempBufferProtonUE, fBufferPiPlusUE); + + doCorrelations(piMinusUE, fBufferPiMinusUE, fTempBufferPiMinusUE, 7, ueAxis2); + setTrackBuffer(fTempBufferProtonUE, fBufferPiMinusUE); } + // this may need to be reworked, it hasn't really been tested yet + // so far it does almost the same as fillHistograms without correlations but including MCgen tracks template void fillHistogramsMC(U const& tracks) { @@ -1176,27 +1346,27 @@ struct AngularCorrelationsInJets { for (const auto& [index, track] : particles) { TVector3 particleDir(track.px(), track.py(), track.pz()); double deltaEtaJet = particleDir.Eta() - pJet.Eta(); - double deltaPhiJet = getDeltaPhi(particleDir.Phi(), pJet.Phi()); + double deltaPhiJet = RecoDecay::constrainAngle(particleDir.Phi() - pJet.Phi(), -constants::math::PI); double deltaRJet = std::abs(deltaEtaJet * deltaEtaJet + deltaPhiJet * deltaPhiJet); double deltaEtaUE1 = particleDir.Eta() - ueAxis1.Eta(); - double deltaPhiUE1 = getDeltaPhi(particleDir.Phi(), ueAxis1.Phi()); + double deltaPhiUE1 = RecoDecay::constrainAngle(particleDir.Phi() - ueAxis1.Phi(), -constants::math::PI); double deltaRUE1 = std::abs(deltaEtaUE1 * deltaEtaUE1 + deltaPhiUE1 * deltaPhiUE1); double deltaEtaUE2 = particleDir.Eta() - ueAxis2.Eta(); - double deltaPhiUE2 = getDeltaPhi(particleDir.Phi(), ueAxis2.Phi()); + double deltaPhiUE2 = RecoDecay::constrainAngle(particleDir.Phi() - ueAxis2.Phi(), -constants::math::PI); double deltaRUE2 = std::abs(deltaEtaUE2 * deltaEtaUE2 + deltaPhiUE2 * deltaPhiUE2); double failedPhi = -999; - if (deltaRJet < rMax) { + if (deltaRJet < jetR) { if (deltaPhiJet != failedPhi) registryQC.fill(HIST("deltaEtadeltaPhiJet"), deltaEtaJet, deltaPhiJet); nchJetPlusUE++; } - if (deltaRUE1 < rMax) { + if (deltaRUE1 < jetR) { if (deltaPhiUE1 != failedPhi) registryQC.fill(HIST("deltaEtadeltaPhiUE"), deltaEtaUE1, deltaPhiUE1); nchUE++; } - if (deltaRUE2 < rMax) { + if (deltaRUE2 < jetR) { if (deltaPhiUE2 != failedPhi) registryQC.fill(HIST("deltaEtadeltaPhiUE"), deltaEtaUE2, deltaPhiUE2); nchUE++; From 745be1b84f36e7f4c61c472e5b6b8223bbf620cb Mon Sep 17 00:00:00 2001 From: Mario Ciacco Date: Sun, 1 Jun 2025 16:49:05 +0200 Subject: [PATCH 1477/1650] [PWGLF] Remove outdated code (antidLambdaEbye.cxx and ebyeMult.cxx) (#11426) --- PWGLF/Tasks/Nuspex/CMakeLists.txt | 10 - PWGLF/Tasks/Nuspex/antidLambdaEbye.cxx | 1241 ------------------------ PWGLF/Tasks/Nuspex/ebyeMult.cxx | 584 ----------- 3 files changed, 1835 deletions(-) delete mode 100644 PWGLF/Tasks/Nuspex/antidLambdaEbye.cxx delete mode 100644 PWGLF/Tasks/Nuspex/ebyeMult.cxx diff --git a/PWGLF/Tasks/Nuspex/CMakeLists.txt b/PWGLF/Tasks/Nuspex/CMakeLists.txt index 3493f5fbd6f..b2af549c871 100644 --- a/PWGLF/Tasks/Nuspex/CMakeLists.txt +++ b/PWGLF/Tasks/Nuspex/CMakeLists.txt @@ -49,11 +49,6 @@ o2physics_add_dpl_workflow(hyhefour-analysis PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(antid-lambda-ebye - SOURCES antidLambdaEbye.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore - COMPONENT_NAME Analysis) - o2physics_add_dpl_workflow(mc-spectra-efficiency SOURCES mcspectraefficiency.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore @@ -139,11 +134,6 @@ o2physics_add_dpl_workflow(nuclei-toward-transv PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(ebye-mult - SOURCES ebyeMult.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore - COMPONENT_NAME Analysis) - o2physics_add_dpl_workflow(nuclei-from-hypertriton-map SOURCES nucleiFromHypertritonMap.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore diff --git a/PWGLF/Tasks/Nuspex/antidLambdaEbye.cxx b/PWGLF/Tasks/Nuspex/antidLambdaEbye.cxx deleted file mode 100644 index baa91ce1b27..00000000000 --- a/PWGLF/Tasks/Nuspex/antidLambdaEbye.cxx +++ /dev/null @@ -1,1241 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. - -#include -#include -#include - -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoAHelpers.h" -#include "ReconstructionDataFormats/Track.h" -#include "Common/DataModel/TrackSelectionTables.h" -#include "Common/DataModel/Centrality.h" -#include "Common/DataModel/Multiplicity.h" -#include "Common/Core/RecoDecay.h" -#include "Common/Core/trackUtilities.h" -#include "Common/DataModel/EventSelection.h" -#include "PWGLF/DataModel/LFStrangenessTables.h" -#include "DetectorsBase/Propagator.h" -#include "DetectorsBase/GeometryManager.h" -#include "DataFormatsParameters/GRPObject.h" -#include "DataFormatsParameters/GRPMagField.h" -#include "CCDB/BasicCCDBManager.h" -#include "DataFormatsTPC/BetheBlochAleph.h" -#include "Common/Core/PID/PIDTOF.h" -#include "Common/TableProducer/PID/pidTOFBase.h" - -#include "Common/Core/PID/TPCPIDResponse.h" -#include "Common/DataModel/PIDResponse.h" -#include "DCAFitter/DCAFitterN.h" - -#include "TDatabasePDG.h" - -using namespace o2; -using namespace o2::framework; -using namespace o2::framework::expressions; - -using TracksFull = soa::Join; -using TracksFullIU = soa::Join; -using BCsWithRun2Info = soa::Join; - -namespace -{ -constexpr int kNpart = 2; -constexpr double betheBlochDefault[kNpart][6]{{-1.e32, -1.e32, -1.e32, -1.e32, -1.e32, -1.e32}, {-1.e32, -1.e32, -1.e32, -1.e32, -1.e32, -1.e32}}; -constexpr double estimatorsCorrelationCoef[2]{-0.669108, 1.04489}; -constexpr double estimatorsSigmaPars[4]{0.933321, 0.0416976, -0.000936344, 8.92179e-06}; -constexpr double deltaEstimatorNsigma[2]{5.5, 5.}; -constexpr double partMass[kNpart]{o2::constants::physics::MassProton, o2::constants::physics::MassDeuteron}; -constexpr double partPdg[kNpart]{2212, o2::constants::physics::kDeuteron}; -static const std::vector betheBlochParNames{"p0", "p1", "p2", "p3", "p4", "resolution"}; -static const std::vector particleNamesBB{"p", "d"}; -std::array, kNpart> tempTracks; -std::shared_ptr tempAntiLambda; -std::shared_ptr tempLambda; -std::shared_ptr nAntid; -std::shared_ptr nAntip; -std::shared_ptr nAntiL; -std::shared_ptr nL; -std::shared_ptr nSqAntid; -std::shared_ptr nSqAntip; -std::shared_ptr nSqAntiL; -std::shared_ptr nSqL; -std::shared_ptr nAntipAntid; -std::shared_ptr nLantiL; -std::shared_ptr nLantid; -std::shared_ptr nAntiLantid; -std::shared_ptr nGenAntid; -std::shared_ptr nGenAntip; -std::shared_ptr nGenAntiL; -std::shared_ptr nGenL; -std::shared_ptr nGenSqAntid; -std::shared_ptr nGenSqAntip; -std::shared_ptr nGenSqAntiL; -std::shared_ptr nGenSqL; -std::shared_ptr nGenAntipAntid; -std::shared_ptr nGenLantiL; -std::shared_ptr nGenLantid; -std::shared_ptr nGenAntiLantid; -std::array, kNpart> recTracks; -std::array, kNpart> recAntiTracks; -std::array, kNpart> genTracks; -std::array, kNpart> genAntiTracks; -std::array, kNpart> tpcNsigma; -std::array, kNpart> tpcNsigmaGlo; -std::array, kNpart> tofMass; -std::array, kNpart> tofSignal; -std::array, kNpart> tofSignal_glo; -void momTotXYZ(std::array& momA, std::array const& momB, std::array const& momC) -{ - for (int i = 0; i < 3; ++i) { - momA[i] = momB[i] + momC[i]; - } -} -float invMass2Body(std::array const& momA, std::array const& momB, std::array const& momC, float const& massB, float const& massC) -{ - float p2B = momB[0] * momB[0] + momB[1] * momB[1] + momB[2] * momB[2]; - float p2C = momC[0] * momC[0] + momC[1] * momC[1] + momC[2] * momC[2]; - float eB = std::sqrt(p2B + massB * massB); - float eC = std::sqrt(p2C + massC * massC); - float eA = eB + eC; - float massA = std::sqrt(eA * eA - momA[0] * momA[0] - momA[1] * momA[1] - momA[2] * momA[2]); - return massA; -} -float alphaAP(std::array const& momA, std::array const& momB, std::array const& momC) -{ - float momTot = std::sqrt(std::pow(momA[0], 2.) + std::pow(momA[1], 2.) + std::pow(momA[2], 2.)); - float lQlPos = (momB[0] * momA[0] + momB[1] * momA[1] + momB[2] * momA[2]) / momTot; - float lQlNeg = (momC[0] * momA[0] + momC[1] * momA[1] + momC[2] * momA[2]) / momTot; - return (lQlPos - lQlNeg) / (lQlPos + lQlNeg); -} -float etaFromMom(std::array const& momA, std::array const& momB) -{ - if (std::sqrt((1.f * momA[0] + 1.f * momB[0]) * (1.f * momA[0] + 1.f * momB[0]) + - (1.f * momA[1] + 1.f * momB[1]) * (1.f * momA[1] + 1.f * momB[1]) + - (1.f * momA[2] + 1.f * momB[2]) * (1.f * momA[2] + 1.f * momB[2])) - - (1.f * momA[2] + 1.f * momB[2]) < - static_cast(1e-7)) { - if ((1.f * momA[2] + 1.f * momB[2]) < 0.f) - return -100.f; - return 100.f; - } - return 0.5f * std::log((std::sqrt((1.f * momA[0] + 1.f * momB[0]) * (1.f * momA[0] + 1.f * momB[0]) + - (1.f * momA[1] + 1.f * momB[1]) * (1.f * momA[1] + 1.f * momB[1]) + - (1.f * momA[2] + 1.f * momB[2]) * (1.f * momA[2] + 1.f * momB[2])) + - (1.f * momA[2] + 1.f * momB[2])) / - (std::sqrt((1.f * momA[0] + 1.f * momB[0]) * (1.f * momA[0] + 1.f * momB[0]) + - (1.f * momA[1] + 1.f * momB[1]) * (1.f * momA[1] + 1.f * momB[1]) + - (1.f * momA[2] + 1.f * momB[2]) * (1.f * momA[2] + 1.f * momB[2])) - - (1.f * momA[2] + 1.f * momB[2]))); -} -float CalculateDCAStraightToPV(float X, float Y, float Z, float Px, float Py, float Pz, float pvX, float pvY, float pvZ) -{ - return std::sqrt((std::pow((pvY - Y) * Pz - (pvZ - Z) * Py, 2) + std::pow((pvX - X) * Pz - (pvZ - Z) * Px, 2) + std::pow((pvX - X) * Py - (pvY - Y) * Px, 2)) / (Px * Px + Py * Py + Pz * Pz)); -} -} // namespace - -struct CandidateV0 { - float pt; - float eta; - float mass; - float cpa; - float dcav0daugh; - float dcav0pv; - int64_t globalIndexPos = -999; - int64_t globalIndexNeg = -999; -}; - -struct CandidateTrack { - float pt; - float eta; - int64_t globalIndex = -999; -}; - -struct antidLambdaEbye { - std::mt19937 gen32; - std::vector candidateV0s; - std::array, 2> candidateTracks; - Service ccdb; - o2::vertexing::DCAFitterN<2> fitter; - - int nSubsamples; - int mRunNumber; - float d_bz; - // o2::base::MatLayerCylSet* lut = nullptr; - - ConfigurableAxis centAxis{"centAxis", {106, 0, 106}, "binning for the centrality"}; - ConfigurableAxis subsampleAxis{"subsampleAxis", {30, 0, 30}, "binning of the subsample axis"}; - ConfigurableAxis deltaEtaAxis{"deltaEtaAxis", {4, 0, 0.8}, "binning of the delta eta axis"}; - ConfigurableAxis ptAntidAxis{"ptAntidAxis", {VARIABLE_WIDTH, 0.7f, 0.8f, 0.9f, 1.0f, 1.2f, 1.4f, 1.6f, 1.8f}, "binning of the antideuteron pT axis (GeV/c)"}; - ConfigurableAxis ptAntipAxis{"ptAntipAxis", {VARIABLE_WIDTH, 0.4f, 0.6f, 0.7f, 0.8f, 0.9f}, "binning of the antiproton pT axis (GeV/c)"}; - ConfigurableAxis ptLambdaAxis{"ptLambdaAxis", {VARIABLE_WIDTH, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.2f, 2.4f, 2.6f, 2.8f, 3.0f}, "binning of the (anti)lambda pT axis (GeV/c)"}; - - ConfigurableAxis zVtxAxis{"zVtxBins", {100, -20.f, 20.f}, "Binning for the vertex z in cm"}; - ConfigurableAxis multAxis{"multAxis", {100, 0, 10000}, "Binning for the multiplicity axis"}; - ConfigurableAxis multFt0Axis{"multFt0Axis", {100, 0, 100000}, "Binning for the ft0 multiplicity axis"}; - ConfigurableAxis nGenRecAxis{"nGenRecAxis", {20, 0, 20}, "binning for the number of reconstructed or generated candidates per event"}; - - // binning of (anti)lambda QA histograms - ConfigurableAxis massLambdaAxis{"massLambdaAxis", {400, o2::constants::physics::MassLambda0 - 0.03f, o2::constants::physics::MassLambda0 + 0.03f}, "binning for the lambda invariant-mass"}; - ConfigurableAxis cosPaAxis{"cosPaAxis", {1e3, 0.95f, 1.00f}, "binning for the cosPa axis"}; - ConfigurableAxis radiusAxis{"radiusAxis", {1e3, 0.f, 100.f}, "binning for the radius axis"}; - ConfigurableAxis dcaV0daughAxis{"dcaV0daughAxis", {2e2, 0.f, 2.f}, "binning for the dca of V0 daughters"}; - ConfigurableAxis dcaDaughPvAxis{"dcaDaughPvAxis", {1e3, -10.f, 10.f}, "binning for the dca of positive daughter to PV"}; - - // binning of deuteron QA histograms - ConfigurableAxis tpcNsigmaAxis{"tpcNsigmaAxis", {100, -5.f, 5.f}, "tpc nsigma axis"}; - ConfigurableAxis tofMassAxis{"tofMassAxis", {1000, 0., 3.f}, "tof mass axis"}; - ConfigurableAxis momAxis{"momAxis", {60., 0.f, 3.f}, "momentum axis binning"}; - ConfigurableAxis momAxisFine{"momAxisFine", {5.e2, 0.f, 5.f}, "momentum axis binning"}; - ConfigurableAxis momResAxis{"momResAxis", {1.e2, -1.f, 1.f}, "momentum resolution binning"}; - ConfigurableAxis tpcAxis{"tpcAxis", {4.e2, 0.f, 4.e3f}, "tpc signal axis binning"}; - ConfigurableAxis tofAxis{"tofAxis", {1.e3, 0.f, 1.f}, "tof signal axis binning"}; - ConfigurableAxis tpcClsAxis{"tpcClsAxis", {160, 0.f, 160.f}, "tpc n clusters binning"}; - - struct : ConfigurableGroup { - Configurable cfgMaterialCorrection{"cfgMaterialCorrection", static_cast(o2::base::Propagator::MatCorrType::USEMatCorrNONE), "Type of material correction"}; - Configurable> cfgBetheBlochParams{"cfgBetheBlochParams", {betheBlochDefault[0], 2, 6, particleNamesBB, betheBlochParNames}, "TPC Bethe-Bloch parameterisation for deuteron"}; - Configurable zVtxMax{"zVtxMax", 10.0f, "maximum z position of the primary vertex"}; - Configurable etaMax{"etaMax", 0.8f, "maximum eta"}; - Configurable etaMaxV0dau{"etaMaxV0dau", 0.8f, "maximum eta V0 daughters"}; - - Configurable fillOnlySignal{"fillOnlySignal", false, "fill histograms only for true signal candidates (MC)"}; - - Configurable kINT7Intervals{"kINT7Intervals", false, "toggle kINT7 trigger selection in the 10-30% and 50-90% centrality intervals (2018 Pb-Pb)"}; - Configurable kUseTPCPileUpCut{"kUseTPCPileUpCut", false, "toggle strong correlation cuts (Run 2)"}; - Configurable kUseEstimatorsCorrelationCut{"kUseEstimatorsCorrelationCut", false, "toggle cut on the correlation between centrality estimators (2018 Pb-Pb)"}; - - Configurable antidPtMin{"antidPtMin", 0.8f, "minimum antideuteron pT (GeV/c)"}; - Configurable antidPtTof{"antidPtTof", 1.0f, "antideuteron pT to switch to TOF pid (GeV/c) "}; - Configurable antidPtMax{"antidPtMax", 1.8f, "maximum antideuteron pT (GeV/c)"}; - - Configurable antipPtMin{"antipPtMin", 0.4f, "minimum antiproton pT (GeV/c)"}; - Configurable antipPtTof{"antipPtTof", 0.6f, "antiproton pT to switch to TOF pid (GeV/c) "}; - Configurable antipPtMax{"antipPtMax", 0.9f, "maximum antiproton pT (GeV/c)"}; - - Configurable lambdaPtMin{"lambdaPtMin", 0.5f, "minimum (anti)lambda pT (GeV/c)"}; - Configurable lambdaPtMax{"lambdaPtMax", 3.0f, "maximum (anti)lambda pT (GeV/c)"}; - - Configurable trackNcrossedRows{"trackNcrossedRows", 70, "Minimum number of crossed TPC rows"}; - Configurable trackNclusItsCut{"trackNclusITScut", 5, "Minimum number of ITS clusters"}; - Configurable trackNclusTpcCut{"trackNclusTPCcut", 70, "Minimum number of TPC clusters"}; - Configurable trackDcaCut{"trackDcaCut", 0.1f, "DCA antid to PV"}; - - Configurable v0trackNcrossedRows{"v0trackNcrossedRows", 70, "Minimum number of crossed TPC rows for V0 daughter"}; - Configurable v0trackNclusItsCut{"v0trackNclusITScut", 1, "Minimum number of ITS clusters for V0 daughter"}; - Configurable v0trackNclusTpcCut{"v0trackNclusTPCcut", 70, "Minimum number of TPC clusters for V0 daughter"}; - Configurable v0trackNsharedClusTpc{"v0trackNsharedClusTpc", 10, "Maximum number of shared TPC clusters for V0 daughter"}; - Configurable v0requireITSrefit{"v0requireITSrefit", false, "require ITS refit for V0 daughter"}; - Configurable vetoMassK0Short{"vetoMassK0Short", -999.f, "veto for V0 compatible with K0s mass"}; - Configurable v0radiusMax{"v0radiusMax", 100.f, "maximum V0 radius eccepted"}; - - Configurable antidNsigmaTpcCutLow{"antidNsigmaTpcCutLow", 4.f, "TPC PID cut low"}; - Configurable antidNsigmaTpcCutUp{"antidNsigmaTpcCutUp", 4.f, "TPC PID cut up"}; - Configurable antidNsigmaTofCut{"antidNsigmaTofCut", 4.f, "TOF PID cut"}; - Configurable antidTpcInnerParamMax{"tpcInnerParamMax", 0.6f, "(temporary) tpc inner param cut"}; - Configurable antidTofMassMax{"tofMassMax", 0.3f, "(temporary) tof mass cut"}; - - Configurable antipNsigmaTpcCutLow{"antipNsigmaTpcCutLow", 4.f, "TPC PID cut low"}; - Configurable antipNsigmaTpcCutUp{"antipNsigmaTpcCutUp", 4.f, "TPC PID cut up"}; - Configurable antipNsigmaTofCut{"antipNsigmaTofCut", 4.f, "TOF PID cut"}; - Configurable antipTpcInnerParamMax{"antipTpcInnerParamMax", 0.6f, "(temporary) tpc inner param cut"}; - Configurable antipTofMassMax{"antipTofMassMax", 0.3f, "(temporary) tof mass cut"}; - Configurable tofMassMaxQA{"tofMassMaxQA", 0.6f, "(temporary) tof mass cut (for QA histograms)"}; - - Configurable v0setting_dcav0dau{"v0setting_dcav0dau", 1, "DCA V0 Daughters"}; - Configurable v0setting_dcav0pv{"v0setting_dcav0pv", 1, "DCA V0 to Pv"}; - Configurable v0setting_dcadaughtopv{"v0setting_dcadaughtopv", 0.1f, "DCA Pos To PV"}; - Configurable v0setting_cospa{"v0setting_cospa", 0.98, "V0 CosPA"}; - Configurable v0setting_radius{"v0setting_radius", 0.5f, "v0radius"}; - Configurable v0setting_lifetime{"v0setting_lifetime", 40.f, "v0 lifetime cut"}; - Configurable v0setting_nsigmatpc{"v0setting_nsigmatpc", 4.f, "nsigmatpc"}; - Configurable lambdaMassCut{"lambdaMassCut", 0.005f, "maximum deviation from PDG mass"}; - Configurable lambdaMassCutQA{"lambdaMassCutQA", 0.02f, "maximum deviation from PDG mass (for QA histograms)"}; - - Configurable antidItsClsSizeCut{"antidItsClsSizeCut", 2.f, "cluster size cut for antideuterons"}; - Configurable antidPtItsClsSizeCut{"antidPtItsClsSizeCut", 1.f, "pt for cluster size cut for antideuterons"}; - } config; - - std::array ptMin; - std::array ptTof; - std::array ptMax; - std::array nSigmaTpcCutLow; - std::array nSigmaTpcCutUp; - std::array nSigmaTofCut; - std::array tpcInnerParamMax; - std::array tofMassMax; - - HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; - HistogramRegistry tempHistos{"tempHistos", {}, OutputObjHandlingPolicy::TransientObject}; - - Preslice perCollisionTracksFull = o2::aod::track::collisionId; - Preslice perCollisionTracksFullIU = o2::aod::track::collisionId; - Preslice perCollisionV0 = o2::aod::v0::collisionId; - Preslice perCollisionMcParts = o2::aod::mcparticle::mcCollisionId; - - template - bool selectV0Daughter(T const& track) - { - if (std::abs(track.eta()) > config.etaMaxV0dau) { - return false; - } - if (track.itsNCls() < config.v0trackNclusItsCut || - track.tpcNClsFound() < config.v0trackNclusTpcCut || - track.tpcNClsCrossedRows() < config.v0trackNclusTpcCut || - track.tpcNClsCrossedRows() < 0.8 * track.tpcNClsFindable() || - track.tpcNClsShared() > config.v0trackNsharedClusTpc) { - return false; - } - if (doprocessRun2 || doprocessMcRun2) { - if (!(track.trackType() & o2::aod::track::Run2Track) || - !(track.flags() & o2::aod::track::TPCrefit)) { - return false; - } - if (config.v0requireITSrefit && !(track.flags() & o2::aod::track::ITSrefit)) { - return false; - } - } - return true; - } - - template - bool selectTrack(T const& track) - { - if (std::abs(track.eta()) > config.etaMax) { - return false; - } - if (!(track.itsClusterMap() & 0x01) && !(track.itsClusterMap() & 0x02)) { - return false; - } - if (track.itsNCls() < config.trackNclusItsCut || - track.tpcNClsFound() < config.trackNclusTpcCut || - track.tpcNClsCrossedRows() < config.trackNcrossedRows || - track.tpcNClsCrossedRows() < 0.8 * track.tpcNClsFindable() || - track.tpcChi2NCl() > 4.f || - track.itsChi2NCl() > 36.f) { - return false; - } - if (doprocessRun2 || doprocessMcRun2) { - if (!(track.trackType() & o2::aod::track::Run2Track) || - !(track.flags() & o2::aod::track::TPCrefit) || - !(track.flags() & o2::aod::track::ITSrefit)) { - return false; - } - } - return true; - } - - template - float getITSClSize(T const& track) - { - float sum{0.f}; - for (int iL{0}; iL < 6; ++iL) { - sum += (track.itsClusterSizes() >> (iL * 4)) & 0xf; - } - return sum / track.itsNCls(); - } - - void fillHistoN(std::shared_ptr hFull, std::shared_ptr const& hTmp, int const subsample, int const centrality) - { - for (int iEta{1}; iEta < hTmp->GetNbinsX() + 1; ++iEta) { - for (int iPt{1}; iPt < hTmp->GetNbinsY() + 1; ++iPt) { - auto eta = hTmp->GetXaxis()->GetBinCenter(iEta); - auto pt = hTmp->GetYaxis()->GetBinCenter(iPt); - auto num = hTmp->Integral(1, iEta, iPt, iPt); - - hFull->Fill(subsample, centrality, eta, pt, num); - } - } - } - - void fillHistoN(std::shared_ptr hFull, std::shared_ptr const& hTmpA, std::shared_ptr const& hTmpB, int const subsample, int const centrality) - { - for (int iEta{1}; iEta < hTmpA->GetNbinsX() + 1; ++iEta) { - auto eta = hTmpA->GetXaxis()->GetBinCenter(iEta); - for (int iPtA{1}; iPtA < hTmpA->GetNbinsY() + 1; ++iPtA) { - for (int iPtB{1}; iPtB < hTmpB->GetNbinsY() + 1; ++iPtB) { - auto ptA = hTmpA->GetYaxis()->GetBinCenter(iPtA); - auto ptB = hTmpB->GetYaxis()->GetBinCenter(iPtB); - auto numA = hTmpA->Integral(1, iEta, iPtA, iPtA); - auto numB = hTmpB->Integral(1, iEta, iPtB, iPtB); - - hFull->Fill(subsample, centrality, eta, ptA, ptB, numA * numB); - } - } - } - } - - template - void initCCDB(Bc const& bc) - { - if (mRunNumber == bc.runNumber()) { - return; - } - - auto timestamp = bc.timestamp(); - o2::parameters::GRPObject* grpo = 0x0; - o2::parameters::GRPMagField* grpmag = 0x0; - if (doprocessRun2 || doprocessMcRun2) { - auto grpPath{"GLO/GRP/GRP"}; - grpo = ccdb->getForTimeStamp("GLO/GRP/GRP", timestamp); - if (!grpo) { - LOG(fatal) << "Got nullptr from CCDB for path " << grpPath << " of object GRPObject for timestamp " << timestamp; - } - o2::base::Propagator::initFieldFromGRP(grpo); - } else { - auto grpmagPath{"GLO/Config/GRPMagField"}; - grpmag = ccdb->getForTimeStamp("GLO/Config/GRPMagField", timestamp); - if (!grpmag) { - LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField for timestamp " << timestamp; - } - o2::base::Propagator::initFieldFromGRP(grpmag); - } - // Fetch magnetic field from ccdb for current collision - d_bz = o2::base::Propagator::Instance()->getNominalBz(); - LOG(info) << "Retrieved GRP for timestamp " << timestamp << " with magnetic field of " << d_bz << " kG"; - mRunNumber = bc.runNumber(); - fitter.setBz(d_bz); - - // o2::base::Propagator::Instance()->setMatLUT(lut); - } - - void init(o2::framework::InitContext&) - { - - mRunNumber = 0; - d_bz = 0; - - ccdb->setURL("http://alice-ccdb.cern.ch"); - ccdb->setCaching(true); - ccdb->setLocalObjectValidityChecking(); - ccdb->setFatalWhenNull(false); - // lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get("GLO/Param/MatLUT")); - - fitter.setPropagateToPCA(true); - fitter.setMaxR(200.); - fitter.setMinParamChange(1e-3); - fitter.setMinRelChi2Change(0.9); - fitter.setMaxDZIni(4); - fitter.setMaxDXYIni(1); - fitter.setMaxChi2(1e9); - fitter.setUseAbsDCA(true); - fitter.setWeightedFinalPCA(false); - int mat{static_cast(config.cfgMaterialCorrection)}; - fitter.setMatCorrType(static_cast(mat)); - - uint32_t randomSeed = static_cast(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); - gen32.seed(randomSeed); - - histos.add("QA/zVtx", ";#it{z}_{vtx} (cm);Entries", HistType::kTH1F, {zVtxAxis}); - - auto hNev = histos.add("nEv", ";Subsample;Centrality (%);", HistType::kTHnSparseD, {subsampleAxis, centAxis}); - nSubsamples = hNev->GetAxis(0)->GetNbins(); - - histos.add("QA/nRecPerEvAntid", ";Centrality (%);#it{N}_{#bar{d}};#it{N}_{ev}", HistType::kTH2D, {centAxis, nGenRecAxis}); - histos.add("QA/nRecPerEvAntip", ";Centrality (%);#it{N}_{#bar{p}};#it{N}_{ev}", HistType::kTH2D, {centAxis, nGenRecAxis}); - histos.add("QA/nRecPerEvAntiL", ";Centrality (%);#it{N}_{#bar{#Lambda}};#it{N}_{ev}", HistType::kTH2D, {centAxis, nGenRecAxis}); - histos.add("QA/nRecPerEvL", ";Centrality (%);#it{N}_{#Lambda};#it{N}_{ev}", HistType::kTH2D, {centAxis, nGenRecAxis}); - histos.add("QA/nTrklCorrelation", ";Tracklets |#eta| > 0.6; Tracklets |#eta| < 0.6", HistType::kTH2D, {{201, -0.5, 200.5}, {201, -0.5, 200.5}}); - histos.add("QA/TrklEta", ";Tracklets #eta; Entries", HistType::kTH1D, {{100, -3., 3.}}); - - nAntid = histos.add("nAntid", ";Subsample;Centrality (%);#Delta#eta;#it{p}_{T}(#bar{d}) (GeV/#it{c});", HistType::kTHnSparseD, {subsampleAxis, centAxis, deltaEtaAxis, ptAntidAxis}); - nAntip = histos.add("nAntip", ";Subsample;Centrality (%);#Delta#eta;#it{p}_{T}(#bar{p}) (GeV/#it{c});", HistType::kTHnSparseD, {subsampleAxis, centAxis, deltaEtaAxis, ptAntipAxis}); - nAntiL = histos.add("nAntiL", ";Subsample;Centrality (%);#Delta#eta;#it{p}_{T}(#bar{#Lambda}) (GeV/#it{c});", HistType::kTHnSparseD, {subsampleAxis, centAxis, deltaEtaAxis, ptLambdaAxis}); - nL = histos.add("nL", ";Subsample;Centrality (%);#Delta#eta;#it{p}_{T}(#Lambda) (GeV/#it{c});", HistType::kTHnSparseD, {subsampleAxis, centAxis, deltaEtaAxis, ptLambdaAxis}); - - nSqAntid = histos.add("nSqAntid", ";Subsample;Centrality (%);#Delta#eta;#it{p}_{T}(#bar{d}) (GeV/#it{c});#it{p}_{T}(#bar{d}) (GeV/#it{c});", HistType::kTHnSparseD, {subsampleAxis, centAxis, deltaEtaAxis, ptAntidAxis, ptAntidAxis}); - nSqAntip = histos.add("nSqAntip", ";Subsample;Centrality (%);#Delta#eta;#it{p}_{T}(#bar{p}) (GeV/#it{c});#it{p}_{T}(#bar{p}) (GeV/#it{c});", HistType::kTHnSparseD, {subsampleAxis, centAxis, deltaEtaAxis, ptAntipAxis, ptAntipAxis}); - nSqAntiL = histos.add("nSqAntiL", ";Subsample;Centrality (%);#Delta#eta;#it{p}_{T}(#bar{#Lambda}) (GeV/#it{c});#it{p}_{T}(#bar{#Lambda}) (GeV/#it{c});", HistType::kTHnSparseD, {subsampleAxis, centAxis, deltaEtaAxis, ptLambdaAxis, ptLambdaAxis}); - nSqL = histos.add("nSqL", ";Subsample;Centrality (%);#Delta#eta;#it{p}_{T}(#Lambda) (GeV/#it{c});#it{p}_{T}(#Lambda) (GeV/#it{c});", HistType::kTHnSparseD, {subsampleAxis, centAxis, deltaEtaAxis, ptLambdaAxis, ptLambdaAxis}); - - nAntipAntid = histos.add("nAntipAntid", ";Subsample;Centrality (%);#Delta#eta;#it{p}_{T}(#bar{p}) (GeV/#it{c});#it{p}_{T}(#bar{d}) (GeV/#it{c});", HistType::kTHnSparseD, {subsampleAxis, centAxis, deltaEtaAxis, ptAntipAxis, ptAntidAxis}); - nLantiL = histos.add("nLantiL", ";Subsample;Centrality (%);#Delta#eta;#it{p}_{T}(#Lambda) (GeV/#it{c});#it{p}_{T}(#bar{#Lambda}) (GeV/#it{c});", HistType::kTHnSparseD, {subsampleAxis, centAxis, deltaEtaAxis, ptLambdaAxis, ptLambdaAxis}); - nLantid = histos.add("nLantid", ";Subsample;Centrality (%);#Delta#eta;#it{p}_{T}(#Lambda) (GeV/#it{c});#it{p}_{T}(#bar{d}) (GeV/#it{c});", HistType::kTHnSparseD, {subsampleAxis, centAxis, deltaEtaAxis, ptLambdaAxis, ptAntidAxis}); - nAntiLantid = histos.add("nAntiLantid", ";Subsample;Centrality (%);#Delta#eta;#it{p}_{T}(#bar{#Lambda}) (GeV/#it{c});#it{p}_{T}(#bar{d}) (GeV/#it{c});", HistType::kTHnSparseD, {subsampleAxis, centAxis, deltaEtaAxis, ptLambdaAxis, ptAntidAxis}); - - // mc generated - nGenAntid = histos.add("nGenAntid", ";Subsample;Centrality (%);#Delta#eta;#it{p}_{T}(#bar{d}) (GeV/#it{c});", HistType::kTHnSparseD, {subsampleAxis, centAxis, deltaEtaAxis, ptAntidAxis}); - nGenAntip = histos.add("nGenAntip", ";Subsample;Centrality (%);#Delta#eta;#it{p}_{T}(#bar{p}) (GeV/#it{c});", HistType::kTHnSparseD, {subsampleAxis, centAxis, deltaEtaAxis, ptAntipAxis}); - nGenAntiL = histos.add("nGenAntiL", ";Subsample;Centrality (%);#Delta#eta;#it{p}_{T}(#bar{#Lambda}) (GeV/#it{c});", HistType::kTHnSparseD, {subsampleAxis, centAxis, deltaEtaAxis, ptLambdaAxis}); - nGenL = histos.add("nGenL", ";Subsample;Centrality (%);#Delta#eta;#it{p}_{T}(#Lambda) (GeV/#it{c});", HistType::kTHnSparseD, {subsampleAxis, centAxis, deltaEtaAxis, ptLambdaAxis}); - - nGenSqAntid = histos.add("nGenSqAntid", ";Subsample;Centrality (%);#Delta#eta;#it{p}_{T}(#bar{d}) (GeV/#it{c});#it{p}_{T}(#bar{d}) (GeV/#it{c});", HistType::kTHnSparseD, {subsampleAxis, centAxis, deltaEtaAxis, ptAntidAxis, ptAntidAxis}); - nGenSqAntip = histos.add("nGenSqAntip", ";Subsample;Centrality (%);#Delta#eta;#it{p}_{T}(#bar{p}) (GeV/#it{c});#it{p}_{T}(#bar{p}) (GeV/#it{c});", HistType::kTHnSparseD, {subsampleAxis, centAxis, deltaEtaAxis, ptAntipAxis, ptAntipAxis}); - nGenSqAntiL = histos.add("nGenSqAntiL", ";Subsample;Centrality (%);#Delta#eta;#it{p}_{T}(#bar{#Lambda}) (GeV/#it{c});#it{p}_{T}(#bar{#Lambda}) (GeV/#it{c});", HistType::kTHnSparseD, {subsampleAxis, centAxis, deltaEtaAxis, ptLambdaAxis, ptLambdaAxis}); - nGenSqL = histos.add("nGenSqL", ";Subsample;Centrality (%);#Delta#eta;#it{p}_{T}(#Lambda) (GeV/#it{c});#it{p}_{T}(#Lambda) (GeV/#it{c});", HistType::kTHnSparseD, {subsampleAxis, centAxis, deltaEtaAxis, ptLambdaAxis, ptLambdaAxis}); - - nGenAntipAntid = histos.add("nGenAntipAntid", ";Subsample;Centrality (%);#Delta#eta;#it{p}_{T}(#bar{p}) (GeV/#it{c});#it{p}_{T}(#bar{d}) (GeV/#it{c});", HistType::kTHnSparseD, {subsampleAxis, centAxis, deltaEtaAxis, ptAntipAxis, ptAntidAxis}); - nGenLantiL = histos.add("nGenLantiL", ";Subsample;Centrality (%);#Delta#eta;#it{p}_{T}(#Lambda) (GeV/#it{c});#it{p}_{T}(#bar{#Lambda}) (GeV/#it{c});", HistType::kTHnSparseD, {subsampleAxis, centAxis, deltaEtaAxis, ptLambdaAxis, ptLambdaAxis}); - nGenLantid = histos.add("nGenLantid", ";Subsample;Centrality (%);#Delta#eta;#it{p}_{T}(#Lambda) (GeV/#it{c});#it{p}_{T}(#bar{d}) (GeV/#it{c});", HistType::kTHnSparseD, {subsampleAxis, centAxis, deltaEtaAxis, ptLambdaAxis, ptAntidAxis}); - nGenAntiLantid = histos.add("nGenAntiLantid", ";Subsample;Centrality (%);#Delta#eta;#it{p}_{T}(#bar{#Lambda}) (GeV/#it{c});#it{p}_{T}(#bar{d}) (GeV/#it{c});", HistType::kTHnSparseD, {subsampleAxis, centAxis, deltaEtaAxis, ptLambdaAxis, ptAntidAxis}); - - // event QA - if (doprocessRun3) { - histos.add("QA/PvMultVsCent", ";Centrality T0C (%);#it{N}_{PV contributors};", HistType::kTH2F, {centAxis, multAxis}); - histos.add("QA/MultVsCent", ";Centrality T0C (%);Multiplicity T0C;", HistType::kTH2F, {centAxis, multFt0Axis}); - } else if (doprocessRun2) { - histos.add("QA/V0MvsCL0", ";Centrality CL0 (%);Centrality V0M (%)", HistType::kTH2F, {centAxis, centAxis}); - histos.add("QA/trackletsVsV0M", ";Centrality CL0 (%);Centrality V0M (%)", HistType::kTH2F, {centAxis, multAxis}); - } - - // v0 QA - histos.add("QA/massLambda", ";Centrality (%);#it{p}_{T} (GeV/#it{c});#it{M}(p + #pi^{-}) (GeV/#it{c}^{2});Entries", HistType::kTH3F, {centAxis, momAxis, massLambdaAxis}); - histos.add("QA/cosPa", ";cosPa;Entries", HistType::kTH1F, {cosPaAxis}); - histos.add("QA/cosPaSig", ";cosPa;Entries", HistType::kTH1F, {cosPaAxis}); - histos.add("QA/cosPaBkg", ";cosPa;Entries", HistType::kTH1F, {cosPaAxis}); - histos.add("QA/dcaV0daughSig", ";dcaV0daugh;Entries", HistType::kTH1F, {dcaV0daughAxis}); - histos.add("QA/dcaV0daughBkg", ";dcaV0daugh;Entries", HistType::kTH1F, {dcaV0daughAxis}); - histos.add("QA/dcaV0PvSig", ";dcaV0Pv;Entries", HistType::kTH1F, {dcaV0daughAxis}); - histos.add("QA/dcaV0PvBkg", ";dcaV0Pv;Entries", HistType::kTH1F, {dcaV0daughAxis}); - histos.add("QA/cosPaDcaV0daughSig", ";cosPa;dcaV0daugh", HistType::kTH2F, {cosPaAxis, dcaV0daughAxis}); - histos.add("QA/cosPaDcaV0daughBkg", ";cosPa;dcaV0daugh", HistType::kTH2F, {cosPaAxis, dcaV0daughAxis}); - histos.add("QA/massLambdaEvRej", ";Centrality (%);#it{p}_{T} (GeV/#it{c});#it{M}(p + #pi^{-}) (GeV/#it{c}^{2});Entries", HistType::kTH3F, {centAxis, momAxis, massLambdaAxis}); - histos.add("QA/massLambdaEvRejSig", ";Centrality (%);#it{p}_{T} (GeV/#it{c});#it{M}(p + #pi^{-}) (GeV/#it{c}^{2});Entries", HistType::kTH3F, {centAxis, momAxis, massLambdaAxis}); - histos.add("QA/massLambdaEvRejBkg", ";Centrality (%);#it{p}_{T} (GeV/#it{c});#it{M}(p + #pi^{-}) (GeV/#it{c}^{2});Entries", HistType::kTH3F, {centAxis, momAxis, massLambdaAxis}); - histos.add("QA/radius", ";radius;Entries", HistType::kTH1F, {radiusAxis}); - histos.add("QA/dcaV0daugh", ";dcaV0daugh;Entries", HistType::kTH1F, {dcaV0daughAxis}); - histos.add("QA/dcaV0Pv", ";dcaV0Pv;Entries", HistType::kTH1F, {dcaV0daughAxis}); - histos.add("QA/dcaPosPv", ";dcaPosPv;Entries", HistType::kTH1F, {dcaDaughPvAxis}); - histos.add("QA/dcaNegPv", ";dcaNegPv;Entries", HistType::kTH1F, {dcaDaughPvAxis}); - histos.add("QA/cosPaBeforeCut", ";cosPa;Entries", HistType::kTH1F, {cosPaAxis}); - histos.add("QA/radiusBeforeCut", ";radius;Entries", HistType::kTH1F, {radiusAxis}); - histos.add("QA/dcaV0daughBeforeCut", ";dcaV0daugh;Entries", HistType::kTH1F, {dcaV0daughAxis}); - histos.add("QA/dcaV0PvBeforeCut", ";dcaV0Pv;Entries", HistType::kTH1F, {dcaV0daughAxis}); - - // d QA - histos.add("QA/dcaPv", ";#it{p}_{T} (GeV/#it{c});dcaPv;Entries", HistType::kTH2F, {momAxis, dcaDaughPvAxis}); - histos.add("QA/nClsTPC", ";tpcCls;Entries", HistType::kTH1F, {tpcClsAxis}); - histos.add("QA/nCrossedRowsTPC", ";nCrossedRowsTPC;Entries", HistType::kTH1F, {tpcClsAxis}); - histos.add("QA/dcaPvBefore", ";#it{p}_{T} (GeV/#it{c});dcaPv;Entries", HistType::kTH2F, {momAxis, dcaDaughPvAxis}); - histos.add("QA/nClsTPCBeforeCut", ";tpcCls;Entries", HistType::kTH1F, {tpcClsAxis}); - histos.add("QA/nCrossedRowsTPCBeforeCut", ";nCrossedRowsTPC;Entries", HistType::kTH1F, {tpcClsAxis}); - - // antid and antip QA - histos.add("QA/tpcSignal", ";#it{p}_{TPC} (GeV/#it{c});d#it{E}/d#it{x}_{TPC} (a.u.)", HistType::kTH2F, {momAxisFine, tpcAxis}); - histos.add("QA/tpcSignal_glo", ";#it{p}_{glo} (GeV/#it{c});d#it{E}/d#it{x}_{TPC} (a.u.);", HistType::kTH2F, {momAxisFine, tpcAxis}); - - tpcNsigma[0] = histos.add("QA/tpcNsigma_p", ";#it{p}_{TPC} (GeV/#it{c});n#sigma_{TPC} (a.u.)", HistType::kTH2F, {momAxis, tpcNsigmaAxis}); - tpcNsigmaGlo[0] = histos.add("QA/tpcNsigmaGlo_p", ";Centrality (%);#it{p}_{T} (GeV/#it{c});n#sigma_{TPC} (a.u.)", HistType::kTH3F, {centAxis, momAxis, tpcNsigmaAxis}); - tofMass[0] = histos.add("QA/tofMass_p", ";Centrality (%);#it{p}_{T} (GeV/#it{c});Mass (GeV/#it{c}^{2});Entries", HistType::kTH3F, {centAxis, momAxis, tofMassAxis}); - tofSignal[0] = histos.add("QA/tofSignal_p", ";#it{p}_{TPC} (GeV/#it{c});#beta_{TOF}", HistType::kTH2F, {momAxisFine, tofAxis}); - tofSignal_glo[0] = histos.add("QA/tofSignal_glo_p", ";#it{p}_{T} (GeV/#it{c});#beta_{TOF}", HistType::kTH2F, {momAxisFine, tofAxis}); - - tpcNsigma[1] = histos.add("QA/tpcNsigma_d", ";#it{p}_{TPC} (GeV/#it{c});n#sigma_{TPC} (a.u.)", HistType::kTH2F, {momAxis, tpcNsigmaAxis}); - tpcNsigmaGlo[1] = histos.add("QA/tpcNsigmaGlo_d", ";Centrality (%);#it{p}_{T} (GeV/#it{c});n#sigma_{TPC} (a.u.)", HistType::kTH3F, {centAxis, momAxis, tpcNsigmaAxis}); - tofMass[1] = histos.add("QA/tofMass_d", ";Centrality (%);#it{p}_{T} (GeV/#it{c});Mass (GeV/#it{c}^{2});Entries", HistType::kTH3F, {centAxis, momAxis, tofMassAxis}); - tofSignal[1] = histos.add("QA/tofSignal_d", ";#it{p}_{TPC} (GeV/#it{c});#beta_{TOF}", HistType::kTH2F, {momAxisFine, tofAxis}); - tofSignal_glo[1] = histos.add("QA/tofSignal_glo_d", ";#it{p}_{T} (GeV/#it{c});#beta_{TOF}", HistType::kTH2F, {momAxisFine, tofAxis}); - - // mc histograms - if (doprocessMcRun3 || doprocessMcRun2) { - histos.add("recL", ";Centrality (%); #it{p}_{T} (GeV/#it{c});#Delta#eta", HistType::kTH3D, {centAxis, ptLambdaAxis, deltaEtaAxis}); - histos.add("recAntiL", ";Centrality (%); #it{p}_{T} (GeV/#it{c});#Delta#eta", HistType::kTH3D, {centAxis, ptLambdaAxis, deltaEtaAxis}); - recTracks[0] = histos.add("recP", ";Centrality (%); #it{p}_{T} (GeV/#it{c});#Delta#eta", HistType::kTH3D, {centAxis, ptAntipAxis, deltaEtaAxis}); - recTracks[1] = histos.add("recD", ";Centrality (%); #it{p}_{T} (GeV/#it{c});#Delta#eta", HistType::kTH3D, {centAxis, ptAntidAxis, deltaEtaAxis}); - recAntiTracks[0] = histos.add("recAntip", ";Centrality (%); #it{p}_{T} (GeV/#it{c});#Delta#eta", HistType::kTH3D, {centAxis, ptAntipAxis, deltaEtaAxis}); - recAntiTracks[1] = histos.add("recAntid", ";Centrality (%); #it{p}_{T} (GeV/#it{c});#Delta#eta", HistType::kTH3D, {centAxis, ptAntidAxis, deltaEtaAxis}); - histos.add("genL", ";Centrality (%); #it{p}_{T} (GeV/#it{c});#Delta#eta", HistType::kTH3D, {centAxis, ptLambdaAxis, deltaEtaAxis}); - histos.add("genAntiL", ";Centrality (%); #it{p}_{T} (GeV/#it{c});#Delta#eta", HistType::kTH3D, {centAxis, ptLambdaAxis, deltaEtaAxis}); - genTracks[0] = histos.add("genP", ";Centrality (%); #it{p}_{T} (GeV/#it{c});#Delta#eta", HistType::kTH3D, {centAxis, ptAntipAxis, deltaEtaAxis}); - genTracks[1] = histos.add("genD", ";Centrality (%); #it{p}_{T} (GeV/#it{c});#Delta#eta", HistType::kTH3D, {centAxis, ptAntidAxis, deltaEtaAxis}); - genAntiTracks[0] = histos.add("genAntip", ";Centrality (%); #it{p}_{T} (GeV/#it{c});#Delta#eta", HistType::kTH3D, {centAxis, ptAntipAxis, deltaEtaAxis}); - genAntiTracks[1] = histos.add("genAntid", ";Centrality (%); #it{p}_{T} (GeV/#it{c});#Delta#eta", HistType::kTH3D, {centAxis, ptAntidAxis, deltaEtaAxis}); - } - - // temporary histograms - tempTracks[0] = tempHistos.add("tempAntip", ";#Delta#eta;#it{p}_{T} (GeV/#it{c})", HistType::kTH2D, {deltaEtaAxis, ptAntipAxis}); - tempTracks[1] = tempHistos.add("tempAntid", ";#Delta#eta;#it{p}_{T} (GeV/#it{c})", HistType::kTH2D, {deltaEtaAxis, ptAntidAxis}); - tempLambda = tempHistos.add("tempLambda", ";#Delta#eta;#it{p}_{T} (GeV/#it{c})", HistType::kTH2D, {deltaEtaAxis, ptLambdaAxis}); - tempAntiLambda = tempHistos.add("tempAntiLambda", ";#Delta#eta;#it{p}_{T} (GeV/#it{c})", HistType::kTH2D, {deltaEtaAxis, ptLambdaAxis}); - - ptMin = std::array{config.antipPtMin, config.antidPtMin}; - ptMax = std::array{config.antipPtMax, config.antidPtMax}; - ptTof = std::array{config.antipPtTof, config.antidPtTof}; - - nSigmaTpcCutLow = std::array{config.antipNsigmaTpcCutLow, config.antidNsigmaTpcCutLow}; - nSigmaTpcCutUp = std::array{config.antipNsigmaTpcCutUp, config.antidNsigmaTpcCutUp}; - nSigmaTofCut = std::array{config.antipNsigmaTofCut, config.antidNsigmaTofCut}; - tpcInnerParamMax = std::array{config.antipTpcInnerParamMax, config.antidTpcInnerParamMax}; - tofMassMax = std::array{config.antipTofMassMax, config.antidTofMassMax}; - } - - template - int fillRecoEvent(C const& collision, T const& tracksAll, aod::V0s const& V0s, float const& centrality) - { - auto tracks = (doprocessRun3 || doprocessMcRun3) ? tracksAll.sliceBy(perCollisionTracksFullIU, collision.globalIndex()) : tracksAll.sliceBy(perCollisionTracksFull, collision.globalIndex()); - candidateTracks[0].clear(); - candidateTracks[1].clear(); - candidateV0s.clear(); - - tempTracks[0]->Reset(); - tempTracks[1]->Reset(); - tempLambda->Reset(); - tempAntiLambda->Reset(); - auto rnd = static_cast(gen32()) / static_cast(gen32.max()); - auto subsample = static_cast(rnd * nSubsamples); - - std::array dcaInfo; - int nTracklets[2]{0, 0}; - for (const auto& track : tracks) { - - histos.fill(HIST("QA/nClsTPCBeforeCut"), track.tpcNClsFound()); - histos.fill(HIST("QA/nCrossedRowsTPCBeforeCut"), track.tpcNClsCrossedRows()); - - if (track.trackType() == 255 && std::abs(track.eta()) < 1.2) { // tracklet - nTracklets[std::abs(track.eta()) < 0.6]++; - histos.fill(HIST("QA/TrklEta"), track.eta()); - } - - if (!selectTrack(track)) { - continue; - } - - if (track.sign() > 0.) { - continue; - } - - auto trackParCov = getTrackParCov(track); - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParCov, 2.f, fitter.getMatCorrType(), &dcaInfo); - auto dca = std::hypot(dcaInfo[0], dcaInfo[1]); - auto trackPt = trackParCov.getPt(); - auto trackEta = trackParCov.getEta(); - histos.fill(HIST("QA/dcaPvBefore"), trackPt, dca); - if (dca > config.trackDcaCut) { - continue; - } - histos.fill(HIST("QA/dcaPv"), trackPt, dca); - - histos.fill(HIST("QA/nClsTPC"), track.tpcNClsFound()); - histos.fill(HIST("QA/nCrossedRowsTPC"), track.tpcNClsCrossedRows()); - histos.fill(HIST("QA/tpcSignal"), track.tpcInnerParam(), track.tpcSignal()); - histos.fill(HIST("QA/tpcSignal_glo"), track.p(), track.tpcSignal()); - - for (int iP{0}; iP < kNpart; ++iP) { - if (trackPt < ptMin[iP] || trackPt > ptMax[iP]) { - continue; - } - - if (doprocessRun3 || doprocessMcRun3) { - float cosL = 1 / std::sqrt(1.f + track.tgl() * track.tgl()); - if (iP && getITSClSize(track) * cosL < config.antidItsClsSizeCut && trackPt < config.antidPtItsClsSizeCut) { - continue; - } - } - - double expBethe{tpc::BetheBlochAleph(static_cast(track.tpcInnerParam() / partMass[iP]), config.cfgBetheBlochParams->get(iP, "p0"), config.cfgBetheBlochParams->get(iP, "p1"), config.cfgBetheBlochParams->get(iP, "p2"), config.cfgBetheBlochParams->get(iP, "p3"), config.cfgBetheBlochParams->get(iP, "p4"))}; - double expSigma{expBethe * config.cfgBetheBlochParams->get(iP, "resolution")}; - auto nSigmaTPC = static_cast((track.tpcSignal() - expBethe) / expSigma); - - float beta{track.hasTOF() ? track.length() / (track.tofSignal() - track.tofEvTime()) * o2::constants::physics::invLightSpeedCm2PS : -999.f}; - beta = std::min(1.f - 1.e-6f, std::max(1.e-4f, beta)); - float mass{track.tpcInnerParam() * std::sqrt(1.f / (beta * beta) - 1.f)}; - bool hasTof = track.hasTOF() && track.tofChi2() < 3; - - if (trackPt <= ptTof[iP] || (trackPt > ptTof[iP] && hasTof && std::abs(mass - partMass[iP]) < config.tofMassMaxQA)) { // for QA histograms - tpcNsigmaGlo[iP]->Fill(centrality, trackPt, nSigmaTPC); - if (nSigmaTPC > nSigmaTpcCutLow[iP] && nSigmaTPC < nSigmaTpcCutUp[iP]) { - tofMass[iP]->Fill(centrality, trackPt, mass); - } - } - - if (nSigmaTPC < nSigmaTpcCutLow[iP] || nSigmaTPC > nSigmaTpcCutUp[iP]) { - continue; - } - - tpcNsigma[iP]->Fill(track.tpcInnerParam(), nSigmaTPC); - if (trackPt > ptTof[iP] && hasTof) { - tofSignal_glo[iP]->Fill(track.p(), beta); - tofSignal[iP]->Fill(track.tpcInnerParam(), beta); - } - - // temporary cut to reject fake matches (run 3) - if (track.tpcInnerParam() < tpcInnerParamMax[iP]) { - continue; - } - if (trackPt > ptTof[iP] && !hasTof) { - continue; - } - - if (trackPt <= ptTof[iP] || (trackPt > ptTof[iP] && hasTof && std::abs(mass - partMass[iP]) < tofMassMax[iP])) { - tempTracks[iP]->Fill(std::abs(trackEta), trackPt); - CandidateTrack candTrack; - candTrack.pt = trackPt; - candTrack.eta = trackEta; - candTrack.globalIndex = track.globalIndex(); - candidateTracks[iP].push_back(candTrack); - } - } - } - histos.fill(HIST("QA/nTrklCorrelation"), nTracklets[0], nTracklets[1]); - - std::vector trkId; - for (const auto& v0 : V0s) { - auto posTrack = v0.posTrack_as(); - auto negTrack = v0.negTrack_as(); - - bool posSelect = selectV0Daughter(posTrack); - bool negSelect = selectV0Daughter(negTrack); - if (!posSelect || !negSelect) - continue; - - if (doprocessRun2 || doprocessMcRun2) { - bool checkPosPileUp = posTrack.hasTOF() || (posTrack.flags() & o2::aod::track::ITSrefit); - bool checkNegPileUp = negTrack.hasTOF() || (negTrack.flags() & o2::aod::track::ITSrefit); - if (!checkPosPileUp && !checkNegPileUp) { - continue; - } - } - - auto posTrackCov = getTrackParCov(posTrack); - auto negTrackCov = getTrackParCov(negTrack); - - int nCand = 0; - try { - nCand = fitter.process(posTrackCov, negTrackCov); - } catch (...) { - LOG(error) << "Exception caught in DCA fitter process call!"; - continue; - } - if (nCand == 0) { - continue; - } - - auto& posPropTrack = fitter.getTrack(0); - auto& negPropTrack = fitter.getTrack(1); - - std::array momPos; - std::array momNeg; - std::array momV0; - posPropTrack.getPxPyPzGlo(momPos); - negPropTrack.getPxPyPzGlo(momNeg); - momTotXYZ(momV0, momPos, momNeg); - - auto ptV0 = std::hypot(momV0[0], momV0[1]); - if (ptV0 < config.lambdaPtMin || ptV0 > config.lambdaPtMax) { - continue; - } - - auto etaV0 = etaFromMom(momPos, momNeg); - if (std::abs(etaV0) > config.etaMax) { - continue; - } - - auto alpha = alphaAP(momV0, momPos, momNeg); - bool matter = alpha > 0; - auto massPos = matter ? o2::constants::physics::MassProton : o2::constants::physics::MassPionCharged; - auto massNeg = matter ? o2::constants::physics::MassPionCharged : o2::constants::physics::MassProton; - auto mLambda = invMass2Body(momV0, momPos, momNeg, massPos, massNeg); - auto mK0Short = invMass2Body(momV0, momPos, momNeg, o2::constants::physics::MassPionCharged, o2::constants::physics::MassPionCharged); - - // pid selections - double expBethePos{tpc::BetheBlochAleph(static_cast(posTrack.tpcInnerParam() / massPos), config.cfgBetheBlochParams->get("p0"), config.cfgBetheBlochParams->get("p1"), config.cfgBetheBlochParams->get("p2"), config.cfgBetheBlochParams->get("p3"), config.cfgBetheBlochParams->get("p4"))}; - double expSigmaPos{expBethePos * config.cfgBetheBlochParams->get("resolution")}; - auto nSigmaTPCPos = static_cast((posTrack.tpcSignal() - expBethePos) / expSigmaPos); - double expBetheNeg{tpc::BetheBlochAleph(static_cast(negTrack.tpcInnerParam() / massNeg), config.cfgBetheBlochParams->get("p0"), config.cfgBetheBlochParams->get("p1"), config.cfgBetheBlochParams->get("p2"), config.cfgBetheBlochParams->get("p3"), config.cfgBetheBlochParams->get("p4"))}; - double expSigmaNeg{expBetheNeg * config.cfgBetheBlochParams->get("resolution")}; - auto nSigmaTPCNeg = static_cast((negTrack.tpcSignal() - expBetheNeg) / expSigmaNeg); - - if (std::abs(nSigmaTPCPos) > config.v0setting_nsigmatpc || std::abs(nSigmaTPCNeg) > config.v0setting_nsigmatpc) { - continue; - } - - // veto on K0s mass - if (std::abs(mK0Short - o2::constants::physics::MassK0Short) < config.vetoMassK0Short) { - continue; - } - - float dcaV0dau = std::sqrt(fitter.getChi2AtPCACandidate()); - histos.fill(HIST("QA/dcaV0daughBeforeCut"), dcaV0dau); - if (dcaV0dau > config.v0setting_dcav0dau) { - continue; - } - - std::array primVtx = {collision.posX(), collision.posY(), collision.posZ()}; - const auto& vtx = fitter.getPCACandidate(); - - float radiusV0 = std::hypot(vtx[0], vtx[1]); - histos.fill(HIST("QA/radiusBeforeCut"), radiusV0); - if (radiusV0 < config.v0setting_radius || radiusV0 > config.v0radiusMax) { - continue; - } - - float dcaV0Pv = CalculateDCAStraightToPV( - vtx[0], vtx[1], vtx[2], - momPos[0] + momNeg[0], - momPos[1] + momNeg[1], - momPos[2] + momNeg[2], - collision.posX(), collision.posY(), collision.posZ()); - histos.fill(HIST("QA/dcaV0PvBeforeCut"), dcaV0Pv); - if (std::abs(dcaV0Pv) > config.v0setting_dcav0pv) { - continue; - } - - double cosPA = RecoDecay::cpa(primVtx, vtx, momV0); - histos.fill(HIST("QA/cosPaBeforeCut"), cosPA); - if (cosPA < config.v0setting_cospa) { - continue; - } - - auto ptotal = RecoDecay::sqrtSumOfSquares(momV0[0], momV0[1], momV0[2]); - auto lengthTraveled = RecoDecay::sqrtSumOfSquares(vtx[0] - primVtx[0], vtx[1] - primVtx[1], vtx[2] - primVtx[2]); - float ML2P_Lambda = o2::constants::physics::MassLambda * lengthTraveled / ptotal; - if (ML2P_Lambda > config.v0setting_lifetime) { - continue; - } - - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, posTrackCov, 2.f, fitter.getMatCorrType(), &dcaInfo); - auto posDcaToPv = std::hypot(dcaInfo[0], dcaInfo[1]); - if (posDcaToPv < config.v0setting_dcadaughtopv && std::abs(dcaInfo[0]) < config.v0setting_dcadaughtopv) { - continue; - } - - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, negTrackCov, 2.f, fitter.getMatCorrType(), &dcaInfo); - auto negDcaToPv = std::hypot(dcaInfo[0], dcaInfo[1]); - if (negDcaToPv < config.v0setting_dcadaughtopv && std::abs(dcaInfo[0]) < config.v0setting_dcadaughtopv) { - continue; - } - - if (std::abs(mLambda - o2::constants::physics::MassLambda0) > config.lambdaMassCutQA) { // for QA histograms - continue; - } - histos.fill(HIST("QA/massLambda"), centrality, ptV0, mLambda); - - if (std::abs(mLambda - o2::constants::physics::MassLambda0) > config.lambdaMassCut) { - continue; - } - histos.fill(HIST("QA/cosPa"), cosPA); - histos.fill(HIST("QA/radius"), radiusV0); - histos.fill(HIST("QA/dcaV0daugh"), dcaV0dau); - histos.fill(HIST("QA/dcaPosPv"), posDcaToPv); - histos.fill(HIST("QA/dcaNegPv"), negDcaToPv); - histos.fill(HIST("QA/dcaV0Pv"), dcaV0Pv); - - if (matter) { - tempHistos.fill(HIST("tempLambda"), std::abs(etaV0), ptV0); - } else { - tempHistos.fill(HIST("tempAntiLambda"), std::abs(etaV0), ptV0); - } - - trkId.emplace_back(posTrack.globalIndex()); - trkId.emplace_back(negTrack.globalIndex()); - - CandidateV0 candV0; - candV0.pt = ptV0; - candV0.eta = etaV0; - candV0.mass = mLambda; - candV0.cpa = cosPA; - candV0.dcav0daugh = dcaV0dau; - candV0.dcav0pv = dcaV0Pv; - candV0.globalIndexPos = posTrack.globalIndex(); - candV0.globalIndexNeg = negTrack.globalIndex(); - candidateV0s.push_back(candV0); - } - - // reject events having multiple v0s from same tracks (TODO: also across collisions?) - std::sort(trkId.begin(), trkId.end()); - if ((std::adjacent_find(trkId.begin(), trkId.end()) != trkId.end()) && config.fillOnlySignal) { - candidateV0s.clear(); - - CandidateV0 candV0; - candV0.pt = -999.f; - candV0.eta = -999.f; - candV0.globalIndexPos = -999; - candV0.globalIndexNeg = -999; - candidateV0s.push_back(candV0); - return -1; - } - for (auto& candidateV0 : candidateV0s) { - histos.fill(HIST("QA/massLambdaEvRej"), centrality, candidateV0.pt, candidateV0.mass); - } - - histos.fill(HIST("nEv"), subsample, centrality); - - if ((doprocessMcRun3 || doprocessMcRun2) && config.fillOnlySignal) - return subsample; - - fillHistoN(nAntip, tempTracks[0], subsample, centrality); - fillHistoN(nAntid, tempTracks[1], subsample, centrality); - fillHistoN(nAntiL, tempAntiLambda, subsample, centrality); - fillHistoN(nL, tempLambda, subsample, centrality); - - fillHistoN(nSqAntip, tempTracks[0], tempTracks[0], subsample, centrality); - fillHistoN(nSqAntid, tempTracks[1], tempTracks[1], subsample, centrality); - fillHistoN(nSqAntiL, tempAntiLambda, tempAntiLambda, subsample, centrality); - fillHistoN(nSqL, tempLambda, tempLambda, subsample, centrality); - - fillHistoN(nAntipAntid, tempTracks[0], tempTracks[1], subsample, centrality); - fillHistoN(nLantid, tempLambda, tempTracks[1], subsample, centrality); - fillHistoN(nLantiL, tempLambda, tempAntiLambda, subsample, centrality); - fillHistoN(nAntiLantid, tempAntiLambda, tempTracks[1], subsample, centrality); - - histos.fill(HIST("QA/nRecPerEvAntip"), centrality, tempTracks[0]->GetEntries()); - histos.fill(HIST("QA/nRecPerEvAntid"), centrality, tempTracks[1]->GetEntries()); - histos.fill(HIST("QA/nRecPerEvAntiL"), centrality, tempAntiLambda->GetEntries()); - histos.fill(HIST("QA/nRecPerEvL"), centrality, tempLambda->GetEntries()); - - return 0; - } - - template - void fillMcEvent(C const& collision, T const& tracks, aod::V0s const& V0s, float const& centrality, aod::McParticles const&, aod::McTrackLabels const& mcLabels) - { - int subsample = fillRecoEvent(collision, tracks, V0s, centrality); - if (candidateV0s.size() == 1 && candidateV0s[0].pt < -998.f && candidateV0s[0].eta < -998.f && candidateV0s[0].globalIndexPos == -999 && candidateV0s[0].globalIndexPos == -999) { - return; - } - - if (config.fillOnlySignal) { - tempTracks[0]->Reset(); - tempTracks[1]->Reset(); - tempLambda->Reset(); - tempAntiLambda->Reset(); - } - - for (int iP{0}; iP < kNpart; ++iP) { - for (auto& candidateTrack : candidateTracks[iP]) { - auto mcLab = mcLabels.rawIteratorAt(candidateTrack.globalIndex); - if (mcLab.has_mcParticle()) { - auto mcTrack = mcLab.template mcParticle_as(); - if (std::abs(mcTrack.pdgCode()) != partPdg[iP]) - continue; - if (((mcTrack.flags() & 0x8) && doprocessMcRun2) || (mcTrack.flags() & 0x2) || (mcTrack.flags() & 0x1)) - continue; - if (!mcTrack.isPhysicalPrimary()) - continue; - if (mcTrack.pdgCode() > 0) { - recTracks[iP]->Fill(centrality, candidateTrack.pt, std::abs(candidateTrack.eta)); - } else { - recAntiTracks[iP]->Fill(centrality, candidateTrack.pt, std::abs(candidateTrack.eta)); - if (config.fillOnlySignal) - tempTracks[iP]->Fill(std::abs(candidateTrack.eta), candidateTrack.pt); - } - } - } - } - for (auto& candidateV0 : candidateV0s) { - auto mcLabPos = mcLabels.rawIteratorAt(candidateV0.globalIndexPos); - auto mcLabNeg = mcLabels.rawIteratorAt(candidateV0.globalIndexNeg); - - if (mcLabPos.has_mcParticle() && mcLabNeg.has_mcParticle()) { - auto mcTrackPos = mcLabPos.template mcParticle_as(); - auto mcTrackNeg = mcLabNeg.template mcParticle_as(); - if (mcTrackPos.has_mothers() && mcTrackNeg.has_mothers()) { - for (auto& negMother : mcTrackNeg.template mothers_as()) { - for (auto& posMother : mcTrackPos.template mothers_as()) { - if (posMother.globalIndex() != negMother.globalIndex()) - continue; - if (!((mcTrackPos.pdgCode() == 2212 && mcTrackNeg.pdgCode() == -211) || (mcTrackPos.pdgCode() == 211 && mcTrackNeg.pdgCode() == -2212))) - continue; - if (std::abs(posMother.pdgCode()) != 3122) { - histos.fill(HIST("QA/cosPaBkg"), candidateV0.cpa); - histos.fill(HIST("QA/dcaV0daughBkg"), candidateV0.dcav0daugh); - histos.fill(HIST("QA/dcaV0PvBkg"), candidateV0.dcav0pv); - histos.fill(HIST("QA/cosPaDcaV0daughBkg"), candidateV0.cpa, candidateV0.dcav0daugh); - histos.fill(HIST("QA/massLambdaEvRejBkg"), centrality, candidateV0.pt, candidateV0.mass); - continue; - } - if (!posMother.isPhysicalPrimary() && !posMother.has_mothers()) - continue; - if (((posMother.flags() & 0x8) && doprocessMcRun2) || (posMother.flags() & 0x2) || (posMother.flags() & 0x1)) - continue; - histos.fill(HIST("QA/cosPaSig"), candidateV0.cpa); - histos.fill(HIST("QA/dcaV0daughSig"), candidateV0.dcav0daugh); - histos.fill(HIST("QA/dcaV0PvSig"), candidateV0.dcav0pv); - histos.fill(HIST("QA/cosPaDcaV0daughSig"), candidateV0.cpa, candidateV0.dcav0daugh); - histos.fill(HIST("QA/massLambdaEvRejSig"), centrality, candidateV0.pt, candidateV0.mass); - if (posMother.pdgCode() > 0) { - histos.fill(HIST("recL"), centrality, candidateV0.pt, std::abs(candidateV0.eta)); - if (config.fillOnlySignal) - tempLambda->Fill(std::abs(candidateV0.eta), candidateV0.pt); - } else { - histos.fill(HIST("recAntiL"), centrality, candidateV0.pt, std::abs(candidateV0.eta)); - if (config.fillOnlySignal) - tempAntiLambda->Fill(std::abs(candidateV0.eta), candidateV0.pt); - } - } - } - } - } - } - - if (config.fillOnlySignal) { - fillHistoN(nAntip, tempTracks[0], subsample, centrality); - fillHistoN(nAntid, tempTracks[1], subsample, centrality); - fillHistoN(nAntiL, tempAntiLambda, subsample, centrality); - fillHistoN(nL, tempLambda, subsample, centrality); - - fillHistoN(nSqAntip, tempTracks[0], tempTracks[0], subsample, centrality); - fillHistoN(nSqAntid, tempTracks[1], tempTracks[1], subsample, centrality); - fillHistoN(nSqAntiL, tempAntiLambda, tempAntiLambda, subsample, centrality); - fillHistoN(nSqL, tempLambda, tempLambda, subsample, centrality); - - fillHistoN(nAntipAntid, tempTracks[0], tempTracks[1], subsample, centrality); - fillHistoN(nLantid, tempLambda, tempTracks[1], subsample, centrality); - fillHistoN(nLantiL, tempLambda, tempAntiLambda, subsample, centrality); - fillHistoN(nAntiLantid, tempAntiLambda, tempTracks[1], subsample, centrality); - - histos.fill(HIST("QA/nRecPerEvAntip"), centrality, tempTracks[0]->GetEntries()); - histos.fill(HIST("QA/nRecPerEvAntid"), centrality, tempTracks[1]->GetEntries()); - histos.fill(HIST("QA/nRecPerEvAntiL"), centrality, tempAntiLambda->GetEntries()); - histos.fill(HIST("QA/nRecPerEvL"), centrality, tempLambda->GetEntries()); - } - } - - void fillMcGen(aod::McParticles const& mcParticles, aod::McTrackLabels const& /*mcLab*/, std::vector> const& goodCollisions) - { - for (uint64_t iC{0}; iC < goodCollisions.size(); ++iC) { - if (goodCollisions[iC].first == false) { - continue; - } - - tempTracks[0]->Reset(); - tempTracks[1]->Reset(); - tempLambda->Reset(); - tempAntiLambda->Reset(); - - auto centrality = goodCollisions[iC].second; - auto rnd = static_cast(gen32()) / static_cast(gen32.max()); - auto subsample = static_cast(rnd * nSubsamples); - auto mcParticles_thisCollision = mcParticles.sliceBy(perCollisionMcParts, iC); - for (auto& mcPart : mcParticles_thisCollision) { - auto genEta = mcPart.eta(); - if (std::abs(genEta) > config.etaMax) { - continue; - } - if (((mcPart.flags() & 0x8) && doprocessMcRun2) || (mcPart.flags() & 0x2) || (mcPart.flags() & 0x1)) - continue; - auto pdgCode = mcPart.pdgCode(); - if (std::abs(pdgCode) == 3122) { - if (!mcPart.isPhysicalPrimary() && !mcPart.has_mothers()) - continue; - bool foundPr = false; - for (auto& mcDaught : mcPart.daughters_as()) { - if (std::abs(mcDaught.pdgCode()) == 2212) { - foundPr = true; - break; - } - } - if (!foundPr) { - continue; - } - auto genPt = std::hypot(mcPart.px(), mcPart.py()); - - if (pdgCode > 0) { - histos.fill(HIST("genL"), centrality, genPt, std::abs(genEta)); - tempHistos.fill(HIST("tempLambda"), std::abs(genEta), genPt); - } else { - histos.fill(HIST("genAntiL"), centrality, genPt, std::abs(genEta)); - tempHistos.fill(HIST("tempAntiLambda"), std::abs(genEta), genPt); - } - } else if (std::abs(pdgCode) == partPdg[0] || std::abs(pdgCode) == partPdg[1]) { - int iP = 1; - if (std::abs(pdgCode) == partPdg[0]) { - iP = 0; - } - if (!mcPart.isPhysicalPrimary() && !mcPart.has_mothers()) - continue; - auto genPt = std::hypot(mcPart.px(), mcPart.py()); - if (pdgCode > 0) { - genTracks[iP]->Fill(centrality, genPt, std::abs(genEta)); - } else { - genAntiTracks[iP]->Fill(centrality, genPt, std::abs(genEta)); - tempTracks[iP]->Fill(std::abs(genEta), genPt); - } - } - } - - fillHistoN(nGenAntip, tempTracks[0], subsample, centrality); - fillHistoN(nGenAntid, tempTracks[1], subsample, centrality); - fillHistoN(nGenAntiL, tempAntiLambda, subsample, centrality); - fillHistoN(nGenL, tempLambda, subsample, centrality); - - fillHistoN(nGenSqAntip, tempTracks[0], tempTracks[0], subsample, centrality); - fillHistoN(nGenSqAntid, tempTracks[1], tempTracks[1], subsample, centrality); - fillHistoN(nGenSqAntiL, tempAntiLambda, tempAntiLambda, subsample, centrality); - fillHistoN(nGenSqL, tempLambda, tempLambda, subsample, centrality); - - fillHistoN(nGenAntipAntid, tempTracks[0], tempTracks[1], subsample, centrality); - fillHistoN(nGenLantid, tempLambda, tempTracks[1], subsample, centrality); - fillHistoN(nGenLantiL, tempLambda, tempAntiLambda, subsample, centrality); - fillHistoN(nGenAntiLantid, tempAntiLambda, tempTracks[1], subsample, centrality); - } - } - - void processRun3(soa::Join const& collisions, TracksFullIU const& tracks, aod::V0s const& V0s, aod::BCsWithTimestamps const&) - { - for (const auto& collision : collisions) { - auto bc = collision.bc_as(); - initCCDB(bc); - - if (!collision.sel8()) - continue; - - if (std::abs(collision.posZ()) > config.zVtxMax) - continue; - - if (!collision.selection_bit(aod::evsel::kNoITSROFrameBorder)) - continue; - - if (!collision.selection_bit(aod::evsel::kNoTimeFrameBorder)) - continue; - - if (!collision.selection_bit(aod::evsel::kNoSameBunchPileup)) - continue; - - if (!collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) - continue; - - histos.fill(HIST("QA/zVtx"), collision.posZ()); - - const uint64_t collIdx = collision.globalIndex(); - auto V0Table_thisCollision = V0s.sliceBy(perCollisionV0, collIdx); - V0Table_thisCollision.bindExternalIndices(&tracks); - - auto multiplicity = collision.multFT0C(); - auto centrality = collision.centFT0C(); - fillRecoEvent(collision, tracks, V0Table_thisCollision, centrality); - - histos.fill(HIST("QA/PvMultVsCent"), centrality, collision.numContrib()); - histos.fill(HIST("QA/MultVsCent"), centrality, multiplicity); - } - } - PROCESS_SWITCH(antidLambdaEbye, processRun3, "process (Run 3)", false); - - void processRun2(soa::Join const& collisions, TracksFull const& tracks, aod::V0s const& V0s, BCsWithRun2Info const&) - { - for (const auto& collision : collisions) { - auto bc = collision.bc_as(); - initCCDB(bc); - - if (std::abs(collision.posZ()) > config.zVtxMax) - continue; - - if (!(bc.eventCuts() & BIT(aod::Run2EventCuts::kAliEventCutsAccepted))) - continue; - - if (config.kUseTPCPileUpCut && !(bc.eventCuts() & BIT(aod::Run2EventCuts::kTPCPileUp))) - continue; - - auto centrality = collision.centRun2V0M(); - if (!(collision.sel7() && collision.alias_bit(kINT7)) && (!config.kINT7Intervals || (config.kINT7Intervals && ((centrality >= 10 && centrality < 30) || centrality > 50)))) - continue; - - auto centralityCl0 = collision.centRun2CL0(); - if (config.kUseEstimatorsCorrelationCut) { - const auto& x = centralityCl0; - const double center = estimatorsCorrelationCoef[0] + estimatorsCorrelationCoef[1] * x; - const double sigma = estimatorsSigmaPars[0] + estimatorsSigmaPars[1] * x + estimatorsSigmaPars[2] * std::pow(x, 2) + estimatorsSigmaPars[3] * std::pow(x, 3); - if (centrality < center - deltaEstimatorNsigma[0] * sigma || centrality > center + deltaEstimatorNsigma[1] * sigma) { - continue; - } - } - - histos.fill(HIST("QA/zVtx"), collision.posZ()); - - const uint64_t collIdx = collision.globalIndex(); - auto V0Table_thisCollision = V0s.sliceBy(perCollisionV0, collIdx); - V0Table_thisCollision.bindExternalIndices(&tracks); - - auto multTracklets = collision.multTracklets(); - fillRecoEvent(collision, tracks, V0Table_thisCollision, centrality); - - histos.fill(HIST("QA/V0MvsCL0"), centralityCl0, centrality); - histos.fill(HIST("QA/trackletsVsV0M"), centrality, multTracklets); - } - } - PROCESS_SWITCH(antidLambdaEbye, processRun2, "process (Run 2)", false); - - void processMcRun3(soa::Join const& collisions, aod::McCollisions const& mcCollisions, TracksFullIU const& tracks, aod::V0s const& V0s, aod::McParticles const& mcParticles, aod::McTrackLabels const& mcLab, aod::BCsWithTimestamps const&) - { - std::vector> goodCollisions(mcCollisions.size(), std::make_pair(false, -999.)); - for (auto& collision : collisions) { - auto bc = collision.bc_as(); - initCCDB(bc); - - if (!collision.sel8()) - continue; - - if (!collision.selection_bit(aod::evsel::kNoITSROFrameBorder)) - continue; - - if (!collision.selection_bit(aod::evsel::kNoTimeFrameBorder)) - continue; - - if (!collision.selection_bit(aod::evsel::kNoSameBunchPileup)) - continue; - - if (!collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) - continue; - - if (std::abs(collision.posZ()) > config.zVtxMax) - continue; - - auto centrality = collision.centFT0C(); - goodCollisions[collision.mcCollisionId()].first = true; - goodCollisions[collision.mcCollisionId()].second = centrality; - - histos.fill(HIST("QA/zVtx"), collision.posZ()); - - const uint64_t collIdx = collision.globalIndex(); - auto V0Table_thisCollision = V0s.sliceBy(perCollisionV0, collIdx); - V0Table_thisCollision.bindExternalIndices(&tracks); - - fillMcEvent(collision, tracks, V0Table_thisCollision, centrality, mcParticles, mcLab); - if (candidateV0s.size() == 1 && candidateV0s[0].pt < -998.f && candidateV0s[0].eta < -998.f && candidateV0s[0].globalIndexPos == -999 && candidateV0s[0].globalIndexPos == -999) { - goodCollisions[collision.mcCollisionId()].first = false; - } - } - - fillMcGen(mcParticles, mcLab, goodCollisions); - } - PROCESS_SWITCH(antidLambdaEbye, processMcRun3, "process MC (Run 3)", false); - - void processMcRun2(soa::Join const& collisions, aod::McCollisions const& mcCollisions, TracksFull const& tracks, aod::V0s const& V0s, aod::McParticles const& mcParticles, aod::McTrackLabels const& mcLab, BCsWithRun2Info const&) - { - std::vector> goodCollisions(mcCollisions.size(), std::make_pair(false, -999.)); - for (auto& collision : collisions) { - auto bc = collision.bc_as(); - initCCDB(bc); - - if (std::abs(collision.posZ()) > config.zVtxMax) - continue; - - if (!(bc.eventCuts() & BIT(aod::Run2EventCuts::kAliEventCutsAccepted))) - continue; - - auto centrality = collision.centRun2V0M(); - goodCollisions[collision.mcCollisionId()].first = true; - goodCollisions[collision.mcCollisionId()].second = centrality; - - histos.fill(HIST("QA/zVtx"), collision.posZ()); - - const uint64_t collIdx = collision.globalIndex(); - auto V0Table_thisCollision = V0s.sliceBy(perCollisionV0, collIdx); - V0Table_thisCollision.bindExternalIndices(&tracks); - - fillMcEvent(collision, tracks, V0Table_thisCollision, centrality, mcParticles, mcLab); - if (candidateV0s.size() == 1 && candidateV0s[0].pt < -998.f && candidateV0s[0].eta < -998.f && candidateV0s[0].globalIndexPos == -999 && candidateV0s[0].globalIndexPos == -999) { - goodCollisions[collision.mcCollisionId()].first = false; - } - } - - fillMcGen(mcParticles, mcLab, goodCollisions); - } - PROCESS_SWITCH(antidLambdaEbye, processMcRun2, "process MC (Run 2)", false); -}; - -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - return WorkflowSpec{ - adaptAnalysisTask(cfgc)}; -} diff --git a/PWGLF/Tasks/Nuspex/ebyeMult.cxx b/PWGLF/Tasks/Nuspex/ebyeMult.cxx deleted file mode 100644 index 63002a0ec31..00000000000 --- a/PWGLF/Tasks/Nuspex/ebyeMult.cxx +++ /dev/null @@ -1,584 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. - -/// \file ebyeMult.cxx -/// \brief task to carry out multiplicity measurements for lf ebye analyses -/// \author Mario Ciacco - -#include -#include -#include - -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoAHelpers.h" -#include "ReconstructionDataFormats/Track.h" -#include "Common/DataModel/TrackSelectionTables.h" -#include "Common/DataModel/Centrality.h" -// #include "Common/DataModel/Multiplicity.h" -#include "Common/Core/trackUtilities.h" -#include "Common/DataModel/EventSelection.h" -#include "DetectorsBase/Propagator.h" -#include "DetectorsBase/GeometryManager.h" -#include "DataFormatsParameters/GRPObject.h" -#include "DataFormatsParameters/GRPMagField.h" -#include "CCDB/BasicCCDBManager.h" - -#include "TFormula.h" - -using namespace o2; -using namespace o2::framework; -using namespace o2::framework::expressions; - -using TracksFull = soa::Join; -using BCsWithRun2Info = soa::Join; - -namespace -{ -constexpr float dcaSels[3]{10., 10., 10.}; -static const std::vector dcaSelsNames{"dcaxy", "dcaz", "dca"}; -static const std::vector particleName{"tracks"}; -} // namespace - -struct CandidateTrack { - float pt = -999.f; - float eta = -999.f; - float dcapv = 0; - float dcaxypv = 0; - float dcazpv = 0; - float genpt = -999.f; - float geneta = -999.f; - int pdgcode = -999; - bool isreco = 0; - int64_t mcIndex = -999; - int64_t globalIndex = -999; -}; - -struct CandidateEvent { - int nTrkRec = -1; - int nTklRec = -1; -}; - -struct TagRun2V0MCalibration { - bool mCalibrationStored = false; - TH1* mhVtxAmpCorrV0A = nullptr; - TH1* mhVtxAmpCorrV0C = nullptr; - TH1* mhMultSelCalib = nullptr; - float mMCScalePars[6] = {0.0}; - TFormula* mMCScale = nullptr; -} Run2V0MInfo; - -enum PartTypes { - kPi = 0, - kKa = 1, - kPr = 2, - kEl = 3, - kMu = 4, - kSig = 5, - kXi = 6, - kOm = 7, - kOther = 8 -}; - -struct EbyeMult { - std::vector candidateTracks; - Service ccdb; - CandidateEvent candidateEvent; - - int mRunNumber; - float dBz; - uint8_t nTrackletsColl; - - ConfigurableAxis centAxis{"centAxis", {106, 0, 106}, "binning for the centrality"}; - ConfigurableAxis zVtxAxis{"zVtxAxis", {100, -20.f, 20.f}, "Binning for the vertex z in cm"}; - ConfigurableAxis multAxis{"multAxis", {100, 0.f, 100.f}, "Binning for the multiplicity axis"}; - ConfigurableAxis multFt0Axis{"multFt0Axis", {100, 0.f, 100.f}, "Binning for the ft0 multiplicity axis"}; - Configurable genName{"genName", "", "Genearator name: HIJING, PYTHIA8, ... Default: \"\""}; - - Configurable zVtxMax{"zVtxMax", 10.0f, "maximum z position of the primary vertex"}; - Configurable etaMax{"etaMax", 0.8f, "maximum eta"}; - - Configurable ptMin{"ptMin", 0.05f, "minimum pT (GeV/c)"}; - Configurable ptMax{"ptMax", 10.f, "maximum pT (GeV/c)"}; - - Configurable trackNcrossedRows{"trackNcrossedRows", 70, "Minimum number of crossed TPC rows"}; - Configurable trackNclusITScut{"trackNclusITScut", 2, "Minimum number of ITS clusters"}; - Configurable trackNclusTPCcut{"trackNclusTPCcut", 60, "Minimum number of TPC clusters"}; - Configurable trackChi2Cut{"trackChi2Cut", 4.f, "Maximum chi2/ncls in TPC"}; - Configurable> cfgDcaSels{"cfgDcaSels", {dcaSels, 1, 3, particleName, dcaSelsNames}, "DCA selections"}; - - HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; - - Preslice perCollisionTracksFull = o2::aod::track::collisionId; - Preslice perCollisionMcParts = o2::aod::mcparticle::mcCollisionId; - - // TODO: add function to extract the particle type based on the pdg code - int getPartType(int const pdgCode) - { - switch (std::abs(pdgCode)) { - case 211: - return PartTypes::kPi; - case 321: - return PartTypes::kKa; - case 2212: - return PartTypes::kPr; - case 11: - return PartTypes::kEl; - case 13: - return PartTypes::kMu; - case 3222: - return PartTypes::kSig; - case 3112: - return PartTypes::kSig; - case 3312: - return PartTypes::kXi; - case 3334: - return PartTypes::kOm; - default: - return PartTypes::kOther; - } - } - - template - bool selectTrack(T const& track) - { - if (std::abs(track.eta()) > etaMax) { - return false; - } - if (!(track.itsClusterMap() & 0x01) && !(track.itsClusterMap() & 0x02)) { - return false; - } - if (track.itsNCls() < trackNclusITScut || - track.tpcNClsFound() < trackNclusTPCcut || - track.tpcNClsCrossedRows() < trackNcrossedRows || - track.tpcNClsCrossedRows() < 0.8 * track.tpcNClsFindable() || - track.tpcChi2NCl() > trackChi2Cut || - track.itsChi2NCl() > 36.f) { - return false; - } - if (doprocessRun2 || doprocessMcRun2) { - if (!(track.trackType() & o2::aod::track::Run2Track) || - !(track.flags() & o2::aod::track::TPCrefit) || - !(track.flags() & o2::aod::track::ITSrefit)) { - return false; - } - } - return true; - } - - template - void initCCDB(Bc const& bc) - { - if (mRunNumber == bc.runNumber()) { - return; - } - - auto timestamp = bc.timestamp(); - o2::parameters::GRPObject* grpo = 0x0; - o2::parameters::GRPMagField* grpmag = 0x0; - if (doprocessRun2 || doprocessMcRun2) { - auto grpPath{"GLO/GRP/GRP"}; - grpo = ccdb->getForTimeStamp("GLO/GRP/GRP", timestamp); - if (!grpo) { - LOG(fatal) << "Got nullptr from CCDB for path " << grpPath << " of object GRPObject for timestamp " << timestamp; - } - o2::base::Propagator::initFieldFromGRP(grpo); - TList* callst = ccdb->getForTimeStamp("Centrality/Estimators", bc.timestamp()); - auto getccdb = [callst](const char* ccdbhname) { - TH1* h = reinterpret_cast(callst->FindObject(ccdbhname)); - return h; - }; - auto getformulaccdb = [callst](const char* ccdbhname) { - TFormula* f = reinterpret_cast(callst->FindObject(ccdbhname)); - return f; - }; - Run2V0MInfo.mhVtxAmpCorrV0A = getccdb("hVtx_fAmplitude_V0A_Normalized"); - Run2V0MInfo.mhVtxAmpCorrV0C = getccdb("hVtx_fAmplitude_V0C_Normalized"); - Run2V0MInfo.mhMultSelCalib = getccdb("hMultSelCalib_V0M"); - Run2V0MInfo.mMCScale = getformulaccdb(TString::Format("%s-V0M", genName->c_str()).Data()); - if ((Run2V0MInfo.mhVtxAmpCorrV0A != nullptr) && (Run2V0MInfo.mhVtxAmpCorrV0C != nullptr) && (Run2V0MInfo.mhMultSelCalib != nullptr)) { - if (genName->length() != 0) { - if (Run2V0MInfo.mMCScale != nullptr) { - for (int ixpar = 0; ixpar < 6; ++ixpar) { - Run2V0MInfo.mMCScalePars[ixpar] = Run2V0MInfo.mMCScale->GetParameter(ixpar); - } - } else { - LOGF(fatal, "MC Scale information from V0M for run %d not available", bc.runNumber()); - } - } - Run2V0MInfo.mCalibrationStored = true; - } else { - LOGF(fatal, "Calibration information from V0M for run %d corrupted", bc.runNumber()); - } - } else { - auto grpmagPath{"GLO/Config/GRPMagField"}; - grpmag = ccdb->getForTimeStamp("GLO/Config/GRPMagField", timestamp); - if (!grpmag) { - LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField for timestamp " << timestamp; - } - o2::base::Propagator::initFieldFromGRP(grpmag); - } - // Fetch magnetic field from ccdb for current collision - dBz = o2::base::Propagator::Instance()->getNominalBz(); - LOG(info) << "Retrieved GRP for timestamp " << timestamp << " with magnetic field of " << dBz << " kG"; - mRunNumber = bc.runNumber(); - } - - float getV0M(int64_t const id, float const zvtx, aod::FV0As const& fv0as, aod::FV0Cs const& fv0cs) - { - auto fv0a = fv0as.rawIteratorAt(id); - auto fv0c = fv0cs.rawIteratorAt(id); - float multFV0A = 0; - float multFV0C = 0; - for (float const& amplitude : fv0a.amplitude()) { - multFV0A += amplitude; - } - - for (float const& amplitude : fv0c.amplitude()) { - multFV0C += amplitude; - } - - float v0m = -1; - auto scaleMC = [](float x, float pars[6]) { - return std::pow(((pars[0] + pars[1] * std::pow(x, pars[2])) - pars[3]) / pars[4], 1.0f / pars[5]); - }; - - if (Run2V0MInfo.mMCScale != nullptr) { - float multFV0M = multFV0A + multFV0C; - v0m = scaleMC(multFV0M, Run2V0MInfo.mMCScalePars); - LOGF(debug, "Unscaled v0m: %f, scaled v0m: %f", multFV0M, v0m); - } else { - v0m = multFV0A * Run2V0MInfo.mhVtxAmpCorrV0A->GetBinContent(Run2V0MInfo.mhVtxAmpCorrV0A->FindFixBin(zvtx)) + - multFV0C * Run2V0MInfo.mhVtxAmpCorrV0C->GetBinContent(Run2V0MInfo.mhVtxAmpCorrV0C->FindFixBin(zvtx)); - } - return v0m; - } - - void init(o2::framework::InitContext&) - { - - mRunNumber = 0; - dBz = 0; - - ccdb->setURL("http://alice-ccdb.cern.ch"); - ccdb->setCaching(true); - ccdb->setLocalObjectValidityChecking(); - ccdb->setFatalWhenNull(false); - - // event QA - histos.add("QA/zVtx", ";#it{z}_{vtx} (cm);Entries", HistType::kTH1F, {zVtxAxis}); - histos.add("QA/V0MvsCL0", ";Centrality CL0 (%);Centrality V0M (%)", HistType::kTH2F, {centAxis, centAxis}); - histos.add("QA/trackletsVsV0M", ";Centrality CL0 (%);Centrality V0M (%)", HistType::kTH2F, {centAxis, multAxis}); - histos.add("QA/nTrklCorrelation", ";Tracklets |#eta| > 0.7; Tracklets |#eta| < 0.6", HistType::kTH2D, {{201, -0.5, 200.5}, {201, -0.5, 200.5}}); - histos.add("QA/nV0MCorrelation", ";V0M Multiplicity (%); Tracklets |#eta| < 0.6", HistType::kTH2D, {multAxis, {201, -0.5, 200.5}}); - histos.add("QA/TrklEta", ";Tracklets #eta; Entries", HistType::kTH1D, {{100, -3., 3.}}); - - // rec tracks - histos.add("RecTracks", ";Tracklets |#eta| > 0.7;#it{p}_{T} (GeV/#it{c});DCA_{#it{xy}} (cm)", HistType::kTH3D, {{201, -0.5, 200.5}, {100, -5., 5.}, {200, -1., 1.}}); - histos.add("RecTracksV0M", ";V0M Multiplicity (%);#it{p}_{T} (GeV/#it{c});DCA_{#it{xy}} (cm)", HistType::kTH3D, {multAxis, {100, -5., 5.}, {200, -1., 1.}}); - - // rec tracks and tracklets distribution - histos.add("TracksDistr", ";Tracklets |#eta| > 0.7;#it{N}_{trk}", HistType::kTH2D, {{201, -0.5, 200.5}, {201, -0.5, 200.5}}); - histos.add("TrackletsDistr", ";Tracklets |#eta| > 0.7;#it{N}_{tkl}", HistType::kTH2D, {{201, -0.5, 200.5}, {201, -0.5, 200.5}}); - - histos.add("TracksDistrV0M", ";V0M Multiplicity (%);#it{N}_{trk}", HistType::kTH2D, {multAxis, {201, -0.5, 200.5}}); - histos.add("TrackletsDistrV0M", ";V0M Multiplicity (%);#it{N}_{tkl}", HistType::kTH2D, {multAxis, {201, -0.5, 200.5}}); - - if (doprocessMcRun2) { - // rec & gen particles (per species) - histos.add("RecPart", ";Tracklets |#eta| > 0.7;#it{p}_{T} (GeV/#it{c});Species", HistType::kTH3D, {{201, -0.5, 200.5}, {100, -5., 5.}, {10, 0, 10}}); - histos.add("GenPart", ";Tracklets |#eta| > 0.7;#it{p}_{T} (GeV/#it{c});Species", HistType::kTH3D, {{201, -0.5, 200.5}, {100, -5., 5.}, {10, 0, 10}}); - - histos.add("RecPartV0M", ";V0M Multiplicity (%);#it{p}_{T} (GeV/#it{c});Species", HistType::kTH3D, {multAxis, {100, -5., 5.}, {10, 0, 10}}); - histos.add("GenPartV0M", ";V0M Multiplicity (%);#it{p}_{T} (GeV/#it{c});Species", HistType::kTH3D, {multAxis, {100, -5., 5.}, {10, 0, 10}}); - - // dca_xy templates - histos.add("PrimTracks", ";Tracklets |#eta| > 0.7;#it{p}_{T} (GeV/#it{c});DCA_{#it{xy}} (cm)", HistType::kTH3D, {{201, -0.5, 200.5}, {100, -5., 5.}, {200, -1., 1.}}); - histos.add("SecWDTracks", ";Tracklets |#eta| > 0.7;#it{p}_{T} (GeV/#it{c});DCA_{#it{xy}} (cm)", HistType::kTH3D, {{201, -0.5, 200.5}, {100, -5., 5.}, {200, -1., 1.}}); - histos.add("SecTracks", ";Tracklets |#eta| > 0.7;#it{p}_{T} (GeV/#it{c});DCA_{#it{xy}} (cm)", HistType::kTH3D, {{201, -0.5, 200.5}, {100, -5., 5.}, {200, -1., 1.}}); - - histos.add("PrimTracksV0M", ";V0M Multiplicity (%);#it{p}_{T} (GeV/#it{c});DCA_{#it{xy}} (cm)", HistType::kTH3D, {multAxis, {100, -5., 5.}, {200, -1., 1.}}); - histos.add("SecWDTracksV0M", ";V0M Multiplicity (%);#it{p}_{T} (GeV/#it{c});DCA_{#it{xy}} (cm)", HistType::kTH3D, {multAxis, {100, -5., 5.}, {200, -1., 1.}}); - histos.add("SecTracksV0M", ";V0M Multiplicity (%);#it{p}_{T} (GeV/#it{c});DCA_{#it{xy}} (cm)", HistType::kTH3D, {multAxis, {100, -5., 5.}, {200, -1., 1.}}); - - // response - histos.add("GenRecTracks", ";Tracklets |#eta| > 0.7;#it{N}_{trk};#it{N}_{gen}", HistType::kTH3D, {{201, -0.5, 200.5}, {201, -0.5, 200.5}, {201, -0.5, 200.5}}); - histos.add("GenRecTracklets", ";Tracklets |#eta| > 0.7;#it{N}_{tkl};#it{N}_{gen}", HistType::kTH3D, {{201, -0.5, 200.5}, {201, -0.5, 200.5}, {201, -0.5, 200.5}}); - - histos.add("GenRecTracksV0M", ";V0M Multiplicity (%);#it{N}_{trk};#it{N}_{gen}", HistType::kTH3D, {multAxis, {201, -0.5, 200.5}, {201, -0.5, 200.5}}); - histos.add("GenRecTrackletsV0M", ";V0M Multiplicity (%);#it{N}_{tkl};#it{N}_{gen}", HistType::kTH3D, {multAxis, {201, -0.5, 200.5}, {201, -0.5, 200.5}}); - } - - // histograms for the evaluation of trigger efficiency - histos.add("GenINELgtZERO", ";#it{N}_{gen}", HistType::kTH1D, {multAxis}); - histos.add("RecINELgtZERO", ";#it{N}_{gen}", HistType::kTH1D, {multAxis}); - } - - template - void fillRecoEvent(C const& collision, T const& tracksAll, float const& centrality) - { - auto tracks = tracksAll.sliceBy(perCollisionTracksFull, collision.globalIndex()); - candidateTracks.clear(); - - std::array dcaInfo; - int nTracklets[2]{0, 0}; - int nTracks{0}; - for (const auto& track : tracks) { - - if (track.trackType() == 255 && std::abs(track.eta()) < 1.2) { // tracklet - if (std::abs(track.eta()) < 0.6) - nTracklets[0]++; - else if (std::abs(track.eta()) > 0.7) - nTracklets[1]++; - } - - if (!selectTrack(track)) { - continue; - } - - auto trackParCov = getTrackParCov(track); - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParCov, 2.f, o2::base::Propagator::MatCorrType::USEMatCorrNONE, &dcaInfo); - auto dca = std::hypot(dcaInfo[0], dcaInfo[1]); - auto trackPt = trackParCov.getPt(); - auto trackEta = trackParCov.getEta(); - if (dca > cfgDcaSels->get("dca")) { // dca - continue; - } - if (std::abs(dcaInfo[1]) > cfgDcaSels->get("dcaz")) { // dcaz - continue; - } - - CandidateTrack candTrack; - candTrack.pt = track.sign() > 0. ? trackPt : -trackPt; - if (trackPt < ptMin || trackPt > ptMax) - continue; - candTrack.eta = trackEta; - candTrack.dcapv = dca; - candTrack.dcaxypv = dcaInfo[0]; - candTrack.dcazpv = dcaInfo[1]; - candTrack.globalIndex = track.globalIndex(); - candidateTracks.push_back(candTrack); - - if (std::abs(dcaInfo[0]) < cfgDcaSels->get("dcaxy")) { // dcaxy TODO: add pt dependent dcaxy cut - ++nTracks; - } - } - - histos.fill(HIST("QA/nTrklCorrelation"), nTracklets[1], nTracklets[0]); - histos.fill(HIST("QA/nV0MCorrelation"), centrality, nTracklets[0]); - nTrackletsColl = nTracklets[1]; - - candidateEvent.nTklRec = nTracklets[0]; - histos.fill(HIST("TracksDistr"), nTracklets[1], nTracks); - histos.fill(HIST("TrackletsDistr"), nTracklets[1], nTracklets[0]); - histos.fill(HIST("TracksDistrV0M"), centrality, nTracks); - histos.fill(HIST("TrackletsDistrV0M"), centrality, nTracklets[0]); - } - - template - void fillMcEvent(C const& collision, T const& tracks, float const& centrality, aod::McParticles const&, aod::McTrackLabels const& mcLabels) - { - fillRecoEvent(collision, tracks, centrality); - - int nTracks{0}; - for (int iT{0}; iT < static_cast(candidateTracks.size()); ++iT) { - candidateTracks[iT].isreco = true; - - auto mcLab = mcLabels.rawIteratorAt(candidateTracks[iT].globalIndex); - if (mcLab.has_mcParticle()) { - auto mcTrack = mcLab.template mcParticle_as(); - if (((mcTrack.flags() & 0x8) && (doprocessMcRun2)) || (mcTrack.flags() & 0x2) || (mcTrack.flags() & 0x1)) - continue; - if (!mcTrack.isPhysicalPrimary()) { - if (mcTrack.has_mothers()) { // sec WD - histos.fill(HIST("SecWDTracks"), nTrackletsColl, candidateTracks[iT].pt, candidateTracks[iT].dcaxypv); - histos.fill(HIST("SecWDTracksV0M"), centrality, candidateTracks[iT].pt, candidateTracks[iT].dcaxypv); - } else { // from material - histos.fill(HIST("SecTracks"), nTrackletsColl, candidateTracks[iT].pt, candidateTracks[iT].dcaxypv); - histos.fill(HIST("SecTracksV0M"), centrality, candidateTracks[iT].pt, candidateTracks[iT].dcaxypv); - } - } - if (std::abs(candidateTracks[iT].dcaxypv) > cfgDcaSels->get("dcaxy")) { // TODO: add pt dependent cut - ++nTracks; - } - - if (mcTrack.isPhysicalPrimary()) { // primary - histos.fill(HIST("PrimTracks"), nTrackletsColl, candidateTracks[iT].pt, candidateTracks[iT].dcaxypv); - histos.fill(HIST("PrimTracksV0M"), centrality, candidateTracks[iT].pt, candidateTracks[iT].dcaxypv); - } - - if (std::abs(candidateTracks[iT].dcaxypv) > cfgDcaSels->get("dcaxy")) - continue; - int partType = getPartType(mcTrack.pdgCode()); - if (mcTrack.isPhysicalPrimary()) { // primary - histos.fill(HIST("RecPart"), nTrackletsColl, candidateTracks[iT].pt, partType); - histos.fill(HIST("RecPartV0M"), centrality, candidateTracks[iT].pt, partType); - } - auto genPt = std::hypot(mcTrack.px(), mcTrack.py()); - candidateTracks[iT].pdgcode = mcTrack.pdgCode(); - candidateTracks[iT].genpt = genPt; - candidateTracks[iT].geneta = mcTrack.eta(); - candidateTracks[iT].mcIndex = mcTrack.globalIndex(); - } - } - candidateEvent.nTrkRec = nTracks; - } - - void fillMcGen(aod::McParticles const& mcParticles, aod::McTrackLabels const& /*mcLab*/, uint64_t const& collisionId, float const& centrality) - { - int nParticles = 0; - auto mcParticlesThisCollision = mcParticles.sliceBy(perCollisionMcParts, collisionId); - for (auto const& mcPart : mcParticlesThisCollision) { - auto genEta = mcPart.eta(); - if (std::abs(genEta) > etaMax) { - continue; - } - if (((mcPart.flags() & 0x8) && (doprocessMcRun2)) || (mcPart.flags() & 0x2) || (mcPart.flags() & 0x1)) - continue; - if (!mcPart.isPhysicalPrimary() /* && !mcPart.has_mothers() */) - continue; - auto genPt = std::hypot(mcPart.px(), mcPart.py()); - if (genPt < ptMin || genPt > ptMax) - continue; - CandidateTrack candTrack; - candTrack.genpt = genPt; - candTrack.geneta = mcPart.eta(); - candTrack.pdgcode = mcPart.pdgCode(); - - int partType = getPartType(mcPart.pdgCode()); - if (partType < PartTypes::kOther) { - ++nParticles; - } - histos.fill(HIST("GenPart"), nTrackletsColl, mcPart.pdgCode() > 0 ? genPt : -genPt, partType); - histos.fill(HIST("GenPartV0M"), centrality, mcPart.pdgCode() > 0 ? genPt : -genPt, partType); - - auto it = find_if(candidateTracks.begin(), candidateTracks.end(), [&](CandidateTrack trk) { return trk.mcIndex == mcPart.globalIndex(); }); - if (it != candidateTracks.end()) { - continue; - } else { - candidateTracks.emplace_back(candTrack); - } - } - histos.fill(HIST("RecINELgtZERO"), nParticles); - histos.fill(HIST("GenRecTracks"), nTrackletsColl, candidateEvent.nTrkRec, nParticles); - histos.fill(HIST("GenRecTracklets"), nTrackletsColl, candidateEvent.nTklRec, nParticles); - histos.fill(HIST("GenRecTracksV0M"), centrality, candidateEvent.nTrkRec, nParticles); - histos.fill(HIST("GenRecTrackletsV0M"), centrality, candidateEvent.nTklRec, nParticles); - } - - template - int genMultINELgtZERO(C const& collision, P const& particles) - { - if (std::abs(collision.posZ()) > zVtxMax) - return -1; - - int nParticles = 0; - int partInAcc = 0; - auto particlesThisCollision = particles.sliceBy(perCollisionMcParts, collision.globalIndex()); - for (auto const& particle : particlesThisCollision) { - if (((particle.flags() & 0x8) && (doprocessMcRun2)) || (particle.flags() & 0x2) || (particle.flags() & 0x1)) - continue; - if (!particle.isPhysicalPrimary() /* && !particle.has_mothers() */) - continue; - auto pt = std::hypot(particle.px(), particle.py()); - if (pt < ptMin || pt > ptMax) - continue; - - int partType = getPartType(particle.pdgCode()); - if (partType < PartTypes::kOther) { - if (std::abs(particle.eta()) < etaMax) - ++nParticles; - if (std::abs(particle.eta()) < 1.f) { - ++partInAcc; - } - } - } - if (partInAcc >= 0) - return nParticles; - return -1; - } - - void processRun2(soa::Join const& collisions, TracksFull const& tracks, aod::FV0As const& fv0as, aod::FV0Cs const& fv0cs, BCsWithRun2Info const&) - { - - for (const auto& collision : collisions) { - auto bc = collision.bc_as(); - initCCDB(bc); - - if (std::abs(collision.posZ()) > zVtxMax) - continue; - - if (!collision.alias_bit(kINT7)) - continue; - - if (!(bc.eventCuts() & BIT(aod::Run2EventCuts::kAliEventCutsAccepted))) - continue; - - if (!(bc.eventCuts() & BIT(aod::Run2EventCuts::kINELgtZERO))) - continue; - - float v0m = getV0M(bc.globalIndex(), collision.posZ(), fv0as, fv0cs); - float cV0M = Run2V0MInfo.mhMultSelCalib->GetBinContent(Run2V0MInfo.mhMultSelCalib->FindFixBin(v0m)); - - histos.fill(HIST("QA/zVtx"), collision.posZ()); - - fillRecoEvent(collision, tracks, cV0M); - - for (auto const& t : candidateTracks) { - histos.fill(HIST("RecTracks"), nTrackletsColl, t.pt, t.dcaxypv); - histos.fill(HIST("RecTracksV0M"), cV0M, t.pt, t.dcaxypv); - } - } - } - PROCESS_SWITCH(EbyeMult, processRun2, "process (Run 2)", false); - - void processMcRun2(soa::Join const& collisions, aod::McCollisions const& mcCollisions, TracksFull const& tracks, aod::FV0As const& fv0as, aod::FV0Cs const& fv0cs, aod::McParticles const& mcParticles, aod::McTrackLabels const& mcLab, BCsWithRun2Info const&) - { - - for (const auto& collision : collisions) { // TODO: fill numerator for trigger efficiency - auto bc = collision.bc_as(); - initCCDB(bc); - - if (std::abs(collision.posZ()) > zVtxMax) - continue; - - if (!(bc.eventCuts() & BIT(aod::Run2EventCuts::kAliEventCutsAccepted))) - continue; - - if (!(bc.eventCuts() & BIT(aod::Run2EventCuts::kINELgtZERO))) - continue; - - float v0m = getV0M(bc.globalIndex(), collision.posZ(), fv0as, fv0cs); - float cV0M = Run2V0MInfo.mhMultSelCalib->GetBinContent(Run2V0MInfo.mhMultSelCalib->FindFixBin(v0m)); - - histos.fill(HIST("QA/zVtx"), collision.posZ()); - - fillMcEvent(collision, tracks, cV0M, mcParticles, mcLab); - fillMcGen(mcParticles, mcLab, collision.mcCollisionId(), cV0M); - } - - // search generated INEL > 0 (one charged particle in |eta| < 1) - for (const auto& mcCollision : mcCollisions) { - int mult = genMultINELgtZERO(mcCollision, mcParticles); - if (mult >= 0) { - histos.fill(HIST("GenINELgtZERO"), mult); - } - } - } - PROCESS_SWITCH(EbyeMult, processMcRun2, "process mc (Run 2)", false); -}; - -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - return WorkflowSpec{ - adaptAnalysisTask(cfgc)}; -} From 15638259e1bdc0a0b2fc2d8f56826c1630c148d4 Mon Sep 17 00:00:00 2001 From: Mario Ciacco Date: Sun, 1 Jun 2025 18:56:22 +0200 Subject: [PATCH 1478/1650] [PWGLF] reset previous configurable name for compatibility with workflows (#11428) --- PWGLF/TableProducer/Nuspex/ebyeMaker.cxx | 32 ++++++++++++------------ 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/ebyeMaker.cxx b/PWGLF/TableProducer/Nuspex/ebyeMaker.cxx index be6be00f699..ae78ecdb735 100644 --- a/PWGLF/TableProducer/Nuspex/ebyeMaker.cxx +++ b/PWGLF/TableProducer/Nuspex/ebyeMaker.cxx @@ -231,7 +231,7 @@ struct EbyeMaker { Configurable> cfgBetheBlochParamsITS{"cfgBetheBlochParamsITS", {betheBlochDefaultITS, 1, 6, particleName, betheBlochParNames}, "ITS Bethe-Bloch parameterisation for deuteron"}; ConfigurableAxis centAxis{"centAxis", {106, 0, 106}, "binning for the centrality"}; - ConfigurableAxis zVtxAxis{"zVtxAxis", {100, -20.f, 20.f}, "Binning for the vertex z in cm"}; + ConfigurableAxis zVtxAxis{"zVtxBins", {100, -20.f, 20.f}, "Binning for the vertex z in cm"}; ConfigurableAxis multAxis{"multAxis", {100, 0, 10000}, "Binning for the multiplicity axis"}; ConfigurableAxis multFt0Axis{"multFt0Axis", {100, 0, 100000}, "Binning for the ft0 multiplicity axis"}; @@ -239,7 +239,7 @@ struct EbyeMaker { ConfigurableAxis massLambdaAxis{"massLambdaAxis", {400, o2::constants::physics::MassLambda0 - 0.03f, o2::constants::physics::MassLambda0 + 0.03f}, "binning for the lambda invariant-mass"}; // binning of PID QA histograms - ConfigurableAxis momAxis{"momAxis", {5.e2, 0.f, 5.f}, "momentum axis binning"}; + ConfigurableAxis momAxis{"momAxisFine", {5.e2, 0.f, 5.f}, "momentum axis binning"}; ConfigurableAxis tpcAxis{"tpcAxis", {4.e2, 0.f, 4.e3f}, "tpc signal axis binning"}; ConfigurableAxis tofMassAxis{"tofMassAxis", {1000, 0., 3.f}, "tof mass axis"}; @@ -249,7 +249,7 @@ struct EbyeMaker { Configurable outerPIDMin{"outerPIDMin", -4.f, "minimum outer PID"}; Configurable storeTracksNum{"storeTracksNum", false, "store the number of tracks instead of tracklets"}; - Configurable genName{"genName", "", "Genearator name: HIJING, PYTHIA8, ... Default: \"\""}; + Configurable genName{"genname", "", "Genearator name: HIJING, PYTHIA8, ... Default: \"\""}; Configurable triggerCut{"triggerCut", 0x0, "trigger cut to select"}; Configurable kINT7Intervals{"kINT7Intervals", false, "toggle kINT7 trigger selection in the 10-30% and 50-90% centrality intervals (2018 Pb-Pb)"}; @@ -268,14 +268,14 @@ struct EbyeMaker { Configurable lambdaPtMax{"lambdaPtMax", 4.f, "maximum (anti)lambda pT (GeV/c)"}; Configurable trackNcrossedRows{"trackNcrossedRows", 70, "Minimum number of crossed TPC rows"}; - Configurable trackNclusItsCut{"trackNclusItsCut", 2, "Minimum number of ITS clusters"}; - Configurable trackNclusTpcCut{"trackNclusTpcCut", 60, "Minimum number of TPC clusters"}; + Configurable trackNclusItsCut{"trackNclusITScut", 2, "Minimum number of ITS clusters"}; + Configurable trackNclusTpcCut{"trackNclusTPCcut", 60, "Minimum number of TPC clusters"}; Configurable trackChi2Cut{"trackChi2Cut", 4.f, "Maximum chi2/ncls in TPC"}; Configurable> cfgDcaSels{"cfgDcaSels", {dcaSels, 1, 3, particleName, dcaSelsNames}, "DCA selections"}; Configurable v0trackNcrossedRows{"v0trackNcrossedRows", 100, "Minimum number of crossed TPC rows for V0 daughter"}; - Configurable v0trackNclusItsCut{"v0trackNclusItsCut", 0, "Minimum number of ITS clusters for V0 daughter"}; - Configurable v0trackNclusTpcCut{"v0trackNclusTpcCut", 100, "Minimum number of TPC clusters for V0 daughter"}; + Configurable v0trackNclusItsCut{"v0trackNclusITScut", 0, "Minimum number of ITS clusters for V0 daughter"}; + Configurable v0trackNclusTpcCut{"v0trackNclusTPCcut", 100, "Minimum number of TPC clusters for V0 daughter"}; Configurable v0trackNsharedClusTpc{"v0trackNsharedClusTpc", 5, "Maximum number of shared TPC clusters for V0 daughter"}; Configurable v0requireITSrefit{"v0requireITSrefit", false, "require ITS refit for V0 daughter"}; Configurable vetoMassK0Short{"vetoMassK0Short", 0.01f, "veto for V0 compatible with K0s mass"}; @@ -283,8 +283,8 @@ struct EbyeMaker { Configurable antidNsigmaTpcCutLow{"antidNsigmaTpcCutLow", -4.f, "TPC PID cut low"}; Configurable antidNsigmaTpcCutUp{"antidNsigmaTpcCutUp", 4.f, "TPC PID cut up"}; - Configurable antidTpcInnerParamMax{"antidTpcInnerParamMax", 0.f, "(temporary) tpc inner param cut"}; - Configurable antidTofMassMax{"antidTofMassMax", 0.3f, "(temporary) tof mass cut"}; + Configurable antidTpcInnerParamMax{"tpcInnerParamMax", 0.f, "(temporary) tpc inner param cut"}; + Configurable antidTofMassMax{"tofMassMax", 0.3f, "(temporary) tof mass cut"}; Configurable antipNsigmaTpcCutLow{"antipNsigmaTpcCutLow", -4.f, "TPC PID cut low"}; Configurable antipNsigmaTpcCutUp{"antipNsigmaTpcCutUp", 4.f, "TPC PID cut up"}; @@ -292,13 +292,13 @@ struct EbyeMaker { Configurable antipTofMassMax{"antipTofMassMax", 0.3f, "(temporary) tof mass cut"}; Configurable tofMassMaxQA{"tofMassMaxQA", 0.6f, "(temporary) tof mass cut (for QA histograms)"}; - Configurable v0settingDcaV0Dau{"v0settingDcaV0Dau", 0.5f, "DCA V0 Daughters"}; - Configurable v0settingDcaV0Pv{"v0settingDcaV0Pv", 1.f, "DCA V0 to Pv"}; - Configurable v0settingDcaDaughToPv{"v0settingDcaDaughToPv", 0.1f, "DCA Pos To PV"}; - Configurable v0settingCosPa{"v0settingCosPa", 0.99f, "V0 CosPA"}; - Configurable v0settingRadius{"v0settingRadius", 5.f, "v0radius"}; - Configurable v0settingLifetime{"v0settingLifetime", 40.f, "v0 lifetime cut"}; - Configurable v0settingNSigmaTpc{"v0settingNSigmaTpc", 4.f, "nsigmatpc"}; + Configurable v0settingDcaV0Dau{"v0setting_dcav0dau", 0.5f, "DCA V0 Daughters"}; + Configurable v0settingDcaV0Pv{"v0setting_dcav0pv", 1.f, "DCA V0 to Pv"}; + Configurable v0settingDcaDaughToPv{"v0setting_dcadaughtopv", 0.1f, "DCA Pos To PV"}; + Configurable v0settingCosPa{"v0setting_cospa", 0.99f, "V0 CosPA"}; + Configurable v0settingRadius{"v0setting_radius", 5.f, "v0radius"}; + Configurable v0settingLifetime{"v0setting_lifetime", 40.f, "v0 lifetime cut"}; + Configurable v0settingNSigmaTpc{"v0setting_nsigmatpc", 4.f, "nsigmatpc"}; Configurable lambdaMassCut{"lambdaMassCut", 0.02f, "maximum deviation from PDG mass (for QA histograms)"}; Configurable constDCASel{"constDCASel", true, "use DCA selections independent of pt"}; From 0cd30e6c288345a94a8c502572e733d6e2caf4c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BiaoZhang=20=28=E5=BC=A0=E5=BD=AA=29?= <52267892+zhangbiao-phy@users.noreply.github.com> Date: Sun, 1 Jun 2025 20:32:54 +0200 Subject: [PATCH 1479/1650] [PWGHF] refine and add a new simple table for DD pairs (#11424) --- .../TableProducer/treeCreatorTccToD0D0Pi.cxx | 328 +++++++++++------- 1 file changed, 210 insertions(+), 118 deletions(-) diff --git a/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx b/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx index da825bcee19..84f32851aeb 100644 --- a/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx +++ b/PWGHF/TableProducer/treeCreatorTccToD0D0Pi.cxx @@ -111,6 +111,8 @@ DECLARE_SOA_COLUMN(CentOfCand, centOfCand, float); // Events DECLARE_SOA_COLUMN(IsEventReject, isEventReject, int); DECLARE_SOA_COLUMN(RunNumber, runNumber, int); +DECLARE_SOA_COLUMN(GIndexCol, gIndexCol, int); //! Global index for the collisionAdd commentMore actions +DECLARE_SOA_COLUMN(TimeStamp, timeStamp, int64_t); //! Timestamp for the collision } // namespace full DECLARE_SOA_TABLE(HfCandTccLites, "AOD", "HFCANDTCCLITE", @@ -135,7 +137,6 @@ DECLARE_SOA_TABLE(HfCandTccLites, "AOD", "HFCANDTCCLITE", full::MD2, full::DeltaMD1, full::DeltaMD2, - full::MDD, full::MDPi1, full::MDPi2, full::MDDPi, @@ -165,7 +166,34 @@ DECLARE_SOA_TABLE(HfCandTccLites, "AOD", "HFCANDTCCLITE", full::NITSClsSoftPi, full::NTPCClsCrossedRowsSoftPi, full::NTPCChi2NClSoftPi, - full::CentOfCand); + full::CentOfCand, + full::GIndexCol, + full::TimeStamp); + +DECLARE_SOA_TABLE(HfCandDDPairs, "AOD", "HFCANDDDPAIR", + full::PxProng0D1, + full::PxProng1D1, + full::PyProng0D1, + full::PyProng1D1, + full::PzProng0D1, + full::PzProng1D1, + full::PxProng0D2, + full::PxProng1D2, + full::PyProng0D2, + full::PyProng1D2, + full::PzProng0D2, + full::PzProng1D2, + full::SelFlagD1, + full::SelFlagD2, + full::EtaD1, + full::EtaD2, + full::PhiD1, + full::PhiD2, + full::MlScoreD1, + full::MlScoreD2, + full::CentOfCand, + full::GIndexCol, + full::TimeStamp); DECLARE_SOA_TABLE(HfCandTccFullEvs, "AOD", "HFCANDTCCFULLEV", full::CollisionId, @@ -180,6 +208,7 @@ DECLARE_SOA_TABLE(HfCandTccFullEvs, "AOD", "HFCANDTCCFULLEV", /// Writes the full information in an output TTree struct HfTreeCreatorTccToD0D0Pi { Produces rowCandidateLite; + Produces rowCandidateDDPair; Produces rowCandidateFullEvents; Configurable ptMinSoftPion{"ptMinSoftPion", 0.0, "Min pt for the soft pion"}; @@ -208,6 +237,7 @@ struct HfTreeCreatorTccToD0D0Pi { Configurable ccdbPathGrpMag{"ccdbPathGrpMag", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object (Run 3)"}; o2::vertexing::DCAFitterN<3> dfTcc; // Tcc vertex fitter + o2::vertexing::DCAFitterN<2> dfDD; // DD pair vertex fitter o2::vertexing::DCAFitterN<2> dfD1; // 2-prong vertex fitter (to rebuild D01 vertex) o2::vertexing::DCAFitterN<2> dfD2; // 2-prong vertex fitter (to rebuild D02 vertex) @@ -232,7 +262,7 @@ struct HfTreeCreatorTccToD0D0Pi { Preslice candsD0PerCollisionWithMl = aod::track_association::collisionId; Preslice trackIndicesPerCollision = aod::track_association::collisionId; // Partition candidatesMlAll = aod::hf_sel_candidate_d0::isSelD0 >= 0; - std::shared_ptr hCandidatesD1, hCandidatesD2, hCandidatesTcc; + std::shared_ptr hCandidatesD1, hCandidatesD2, hCandidatesTcc, hCandidatesDD; HistogramRegistry registry{"registry"}; OutputObj hCovPVXX{TH1F("hCovPVXX", "Tcc candidates;XX element of cov. matrix of prim. vtx. position (cm^{2});entries", 100, 0., 1.e-4)}; OutputObj hCovSVXX{TH1F("hCovSVXX", "Tcc candidates;XX element of cov. matrix of sec. vtx. position (cm^{2});entries", 100, 0., 0.2)}; @@ -260,6 +290,14 @@ struct HfTreeCreatorTccToD0D0Pi { dfD2.setUseAbsDCA(useAbsDCA); dfD2.setWeightedFinalPCA(useWeightedFinalPCA); + dfDD.setPropagateToPCA(propagateToPCA); + dfDD.setMaxR(maxR); + dfDD.setMaxDZIni(maxDZIni); + dfDD.setMinParamChange(minParamChange); + dfDD.setMinRelChi2Change(minRelChi2Change); + dfDD.setUseAbsDCA(useAbsDCA); + dfDD.setWeightedFinalPCA(useWeightedFinalPCA); + dfTcc.setPropagateToPCA(propagateToPCA); dfTcc.setMaxR(maxR); dfTcc.setMaxDZIni(maxDZIni); @@ -277,9 +315,12 @@ struct HfTreeCreatorTccToD0D0Pi { hCandidatesD1 = registry.add("hCandidatesD1", "D1 candidate counter", {HistType::kTH1D, {axisCands}}); hCandidatesD2 = registry.add("hCandidatesD2", "D2 candidate counter", {HistType::kTH1D, {axisCands}}); hCandidatesTcc = registry.add("hCandidatesTcc", "Tcc candidate counter", {HistType::kTH1D, {axisCands}}); + hCandidatesDD = registry.add("hCandidatesDD", "DD pair candidate counter", {HistType::kTH1D, {axisCands}}); + setLabelHistoCands(hCandidatesD1); setLabelHistoCands(hCandidatesD2); setLabelHistoCands(hCandidatesTcc); + setLabelHistoCands(hCandidatesDD); } } @@ -316,7 +357,7 @@ struct HfTreeCreatorTccToD0D0Pi { auto primaryVertex = getPrimaryVertex(collision); auto bc = collision.template bc_as(); fillEvent(collision, 0, bc.runNumber()); - + int64_t timeStamp = bc.timestamp(); if (buildVertex) { if (runNumber != bc.runNumber()) { LOG(info) << ">>>>>>>>>>>> Current run number: " << runNumber; @@ -325,9 +366,13 @@ struct HfTreeCreatorTccToD0D0Pi { LOG(info) << ">>>>>>>>>>>> Magnetic field: " << bz; } dfTcc.setBz(bz); + dfDD.setBz(bz); dfD1.setBz(bz); dfD2.setBz(bz); } + + o2::dataformats::V0 trackD1; + o2::dataformats::V0 trackD2; auto thisCollId = collision.globalIndex(); auto candwD0ThisColl = candidates.sliceBy(candsD0PerCollisionWithMl, thisCollId); if (candwD0ThisColl.size() <= 1) @@ -335,7 +380,165 @@ struct HfTreeCreatorTccToD0D0Pi { auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); for (const auto& candidateD1 : candwD0ThisColl) { + + auto trackD1Prong0 = tracks.rawIteratorAt(candidateD1.prong0Id()); // positive daughter for D1 + auto trackD1Prong1 = tracks.rawIteratorAt(candidateD1.prong1Id()); // negative daughter for D1 + std::array pVecD1Prong0{trackD1Prong0.pVector()}; + std::array pVecD1Prong1{trackD1Prong1.pVector()}; + std::array pVecD1 = RecoDecay::pVec(pVecD1Prong0, pVecD1Prong1); + for (auto candidateD2 = candidateD1 + 1; candidateD2 != candwD0ThisColl.end(); ++candidateD2) { + // avoid shared tracks + if ( + (candidateD1.prong0Id() == candidateD2.prong0Id()) || + (candidateD1.prong0Id() == candidateD2.prong1Id()) || + (candidateD1.prong1Id() == candidateD2.prong0Id()) || + (candidateD1.prong1Id() == candidateD2.prong1Id())) { + continue; + } + + auto trackD2Prong0 = tracks.rawIteratorAt(candidateD2.prong0Id()); // positive daughter for D2 + auto trackD2Prong1 = tracks.rawIteratorAt(candidateD2.prong1Id()); // negative daughter for D2 + std::array pVecD2Prong0{trackD2Prong0.pVector()}; + std::array pVecD2Prong1{trackD2Prong1.pVector()}; + std::array pVecD2 = RecoDecay::pVec(pVecD2Prong0, pVecD2Prong1); + + if (buildVertex) { + auto trackParVarD1Prong0 = getTrackParCov(trackD1Prong0); + auto trackParVarD1Prong1 = getTrackParCov(trackD1Prong1); + auto dca0D1 = o2::dataformats::DCA(trackD1Prong0.dcaXY(), trackD1Prong0.dcaZ(), trackD1Prong0.cYY(), trackD1Prong0.cZY(), trackD1Prong0.cZZ()); + auto dca1D1 = o2::dataformats::DCA(trackD1Prong1.dcaXY(), trackD1Prong1.dcaZ(), trackD1Prong1.cYY(), trackD1Prong1.cZY(), trackD1Prong1.cZZ()); + + // repropagate tracks to this collision if needed + if (trackD1Prong0.collisionId() != thisCollId) { + trackParVarD1Prong0.propagateToDCA(primaryVertex, bz, &dca0D1); + } + + if (trackD1Prong1.collisionId() != thisCollId) { + trackParVarD1Prong1.propagateToDCA(primaryVertex, bz, &dca1D1); + } + // reconstruct the 2-prong secondary vertex + hCandidatesD1->Fill(SVFitting::BeforeFit); + try { + if (dfD1.process(trackParVarD1Prong0, trackParVarD1Prong1) == 0) { + continue; + } + } catch (const std::runtime_error& error) { + LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN for first D0 cannot work, skipping the candidate."; + hCandidatesD1->Fill(SVFitting::Fail); + continue; + } + hCandidatesD1->Fill(SVFitting::FitOk); + const auto& vertexD1 = dfD1.getPCACandidatePos(); + trackParVarD1Prong0.propagateTo(vertexD1[0], bz); + trackParVarD1Prong1.propagateTo(vertexD1[0], bz); + + // build a D1 neutral track + trackD1 = o2::dataformats::V0(vertexD1, pVecD1, dfD1.calcPCACovMatrixFlat(), trackParVarD1Prong0, trackParVarD1Prong1); + + auto trackParVarD2Prong0 = getTrackParCov(trackD2Prong0); + auto trackParVarD2Prong1 = getTrackParCov(trackD2Prong1); + auto dca0D2 = o2::dataformats::DCA(trackD2Prong0.dcaXY(), trackD2Prong0.dcaZ(), trackD2Prong0.cYY(), trackD2Prong0.cZY(), trackD2Prong0.cZZ()); + auto dca1D2 = o2::dataformats::DCA(trackD2Prong1.dcaXY(), trackD2Prong1.dcaZ(), trackD2Prong1.cYY(), trackD2Prong1.cZY(), trackD2Prong1.cZZ()); + + // repropagate tracks to this collision if needed + if (trackD2Prong0.collisionId() != thisCollId) { + trackParVarD2Prong0.propagateToDCA(primaryVertex, bz, &dca0D2); + } + if (trackD2Prong1.collisionId() != thisCollId) { + trackParVarD2Prong1.propagateToDCA(primaryVertex, bz, &dca1D2); + } + + // reconstruct the 2-prong secondary vertex + hCandidatesD2->Fill(SVFitting::BeforeFit); + try { + if (dfD2.process(trackParVarD2Prong0, trackParVarD2Prong1) == 0) { + continue; + } + } catch (const std::runtime_error& error) { + LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN for second D0 cannot work, skipping the candidate."; + hCandidatesD2->Fill(SVFitting::Fail); + continue; + } + + hCandidatesD2->Fill(SVFitting::FitOk); + const auto& vertexD2 = dfD2.getPCACandidatePos(); + trackParVarD2Prong0.propagateTo(vertexD2[0], bz); + trackParVarD2Prong1.propagateTo(vertexD2[0], bz); + // build a D2 neutral track + trackD2 = o2::dataformats::V0(vertexD2, pVecD2, dfD2.calcPCACovMatrixFlat(), trackParVarD2Prong0, trackParVarD2Prong1); + + hCandidatesDD->Fill(SVFitting::BeforeFit); + try { + if (dfDD.process(trackD1, trackD2) == 0) { + continue; + } + } catch (const std::runtime_error& error) { + LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN for DD cannot work, skipping the candidate."; + hCandidatesDD->Fill(SVFitting::Fail); + continue; + } + hCandidatesDD->Fill(SVFitting::FitOk); + } + + int candFlagD1 = -999; + int candFlagD2 = -999; + float cent = evaluateCentralityColl(collision); + float massD01 = -999; + float massD02 = -999; + std::vector mlScoresD1; + std::vector mlScoresD2; + + if (candidateD1.isSelD0()) { + candFlagD1 = (candidateD1.isSelD0bar()) ? 3 : 1; + std::copy(candidateD1.mlProbD0().begin(), candidateD1.mlProbD0().end(), std::back_inserter(mlScoresD1)); + massD01 = hfHelper.invMassD0ToPiK(candidateD1); + } + if (candidateD1.isSelD0bar() && !candidateD1.isSelD0()) { + candFlagD1 = 2; + std::copy(candidateD1.mlProbD0bar().begin(), candidateD1.mlProbD0bar().end(), std::back_inserter(mlScoresD1)); + massD01 = hfHelper.invMassD0barToKPi(candidateD1); + } + + if (candidateD2.isSelD0()) { + candFlagD2 = (candidateD2.isSelD0bar()) ? 3 : 1; + std::copy(candidateD2.mlProbD0().begin(), candidateD2.mlProbD0().end(), std::back_inserter(mlScoresD2)); + massD02 = hfHelper.invMassD0ToPiK(candidateD2); + } + if (candidateD2.isSelD0bar() && !candidateD2.isSelD0()) { + candFlagD2 = 2; + std::copy(candidateD2.mlProbD0bar().begin(), candidateD2.mlProbD0bar().end(), std::back_inserter(mlScoresD2)); + massD02 = hfHelper.invMassD0barToKPi(candidateD2); + } + + // const auto massD0D0Pair = RecoDecay::m(std::array{pVecD1, pVecD2}, std::array{MassD0, MassD0}); + + rowCandidateDDPair( + candidateD1.pxProng0(), + candidateD1.pxProng1(), + candidateD1.pyProng0(), + candidateD1.pyProng1(), + candidateD1.pzProng0(), + candidateD1.pzProng1(), + candidateD2.pxProng0(), + candidateD2.pxProng1(), + candidateD2.pyProng0(), + candidateD2.pyProng1(), + candidateD2.pzProng0(), + candidateD2.pzProng1(), + candFlagD1, + candFlagD2, + candidateD1.eta(), + candidateD2.eta(), + candidateD1.phi(), + candidateD2.phi(), + mlScoresD1[0], + mlScoresD2[0], + cent, + collision.globalIndex(), + timeStamp); + + // start to add the track of softpi to reconstruct Tcc for (const auto& trackId : trackIdsThisCollision) { auto trackPion = trackId.template track_as(); @@ -351,10 +554,6 @@ struct HfTreeCreatorTccToD0D0Pi { } // avoid shared tracks if ( - (candidateD1.prong0Id() == candidateD2.prong0Id()) || - (candidateD1.prong0Id() == candidateD2.prong1Id()) || - (candidateD1.prong1Id() == candidateD2.prong0Id()) || - (candidateD1.prong1Id() == candidateD2.prong1Id()) || (candidateD1.prong0Id() == trackPion.globalIndex()) || (candidateD1.prong1Id() == trackPion.globalIndex()) || (candidateD2.prong0Id() == trackPion.globalIndex()) || @@ -362,91 +561,14 @@ struct HfTreeCreatorTccToD0D0Pi { continue; } - auto trackD1Prong0 = tracks.rawIteratorAt(candidateD1.prong0Id()); // positive daughter for D1 - auto trackD1Prong1 = tracks.rawIteratorAt(candidateD1.prong1Id()); // negative daughter for D1 - auto trackD2Prong0 = tracks.rawIteratorAt(candidateD2.prong0Id()); // positive daughter for D2 - auto trackD2Prong1 = tracks.rawIteratorAt(candidateD2.prong1Id()); // negative daughter for D2 - - std::array pVecD1Prong0{trackD1Prong0.pVector()}; - std::array pVecD1Prong1{trackD1Prong1.pVector()}; - std::array pVecD2Prong0{trackD2Prong0.pVector()}; - std::array pVecD2Prong1{trackD2Prong1.pVector()}; std::array pVecSoftPi = {trackPion.pVector()}; - // Get D momentum - std::array pVecD1 = RecoDecay::pVec(pVecD1Prong0, pVecD1Prong1); - std::array pVecD2 = RecoDecay::pVec(pVecD2Prong0, pVecD2Prong1); float impactParameterYD1 = -999.f; float impactParameterYD2 = -999.f; float impactParameterYSoftPi = -999.f; float chi2PCA = -999.f; if (buildVertex) { - auto trackParVarD1Prong0 = getTrackParCov(trackD1Prong0); - auto trackParVarD1Prong1 = getTrackParCov(trackD1Prong1); - auto dca0D1 = o2::dataformats::DCA(trackD1Prong0.dcaXY(), trackD1Prong0.dcaZ(), trackD1Prong0.cYY(), trackD1Prong0.cZY(), trackD1Prong0.cZZ()); - auto dca1D1 = o2::dataformats::DCA(trackD1Prong1.dcaXY(), trackD1Prong1.dcaZ(), trackD1Prong1.cYY(), trackD1Prong1.cZY(), trackD1Prong1.cZZ()); - - // repropagate tracks to this collision if needed - if (trackD1Prong0.collisionId() != thisCollId) { - trackParVarD1Prong0.propagateToDCA(primaryVertex, bz, &dca0D1); - } - - if (trackD1Prong1.collisionId() != thisCollId) { - trackParVarD1Prong1.propagateToDCA(primaryVertex, bz, &dca1D1); - } - // reconstruct the 2-prong secondary vertex - hCandidatesD1->Fill(SVFitting::BeforeFit); - try { - if (dfD1.process(trackParVarD1Prong0, trackParVarD1Prong1) == 0) { - continue; - } - } catch (const std::runtime_error& error) { - LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN for first D0 cannot work, skipping the candidate."; - hCandidatesD1->Fill(SVFitting::Fail); - continue; - } - hCandidatesD1->Fill(SVFitting::FitOk); - const auto& vertexD1 = dfD1.getPCACandidatePos(); - trackParVarD1Prong0.propagateTo(vertexD1[0], bz); - trackParVarD1Prong1.propagateTo(vertexD1[0], bz); - - // build a D1 neutral track - auto trackD1 = o2::dataformats::V0(vertexD1, pVecD1, dfD1.calcPCACovMatrixFlat(), trackParVarD1Prong0, trackParVarD1Prong1); - - auto trackParVarD2Prong0 = getTrackParCov(trackD2Prong0); - auto trackParVarD2Prong1 = getTrackParCov(trackD2Prong1); - auto dca0D2 = o2::dataformats::DCA(trackD2Prong0.dcaXY(), trackD2Prong0.dcaZ(), trackD2Prong0.cYY(), trackD2Prong0.cZY(), trackD2Prong0.cZZ()); - auto dca1D2 = o2::dataformats::DCA(trackD2Prong1.dcaXY(), trackD2Prong1.dcaZ(), trackD2Prong1.cYY(), trackD2Prong1.cZY(), trackD2Prong1.cZZ()); - - // repropagate tracks to this collision if needed - if (trackD2Prong0.collisionId() != thisCollId) { - trackParVarD2Prong0.propagateToDCA(primaryVertex, bz, &dca0D2); - } - if (trackD2Prong1.collisionId() != thisCollId) { - trackParVarD2Prong1.propagateToDCA(primaryVertex, bz, &dca1D2); - } - - // reconstruct the 2-prong secondary vertex - hCandidatesD2->Fill(SVFitting::BeforeFit); - try { - if (dfD2.process(trackParVarD2Prong0, trackParVarD2Prong1) == 0) { - continue; - } - } catch (const std::runtime_error& error) { - LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN for second D0 cannot work, skipping the candidate."; - hCandidatesD2->Fill(SVFitting::Fail); - continue; - } - - hCandidatesD2->Fill(SVFitting::FitOk); - const auto& vertexD2 = dfD2.getPCACandidatePos(); - trackParVarD2Prong0.propagateTo(vertexD2[0], bz); - trackParVarD2Prong1.propagateTo(vertexD2[0], bz); - // build a D2 neutral track - auto trackD2 = o2::dataformats::V0(vertexD2, pVecD2, dfD2.calcPCACovMatrixFlat(), trackParVarD2Prong0, trackParVarD2Prong1); - auto trackParCovPi = getTrackParCov(trackPion); - // find the DCA between the D01, D02 and the bachelor track, for Tcc hCandidatesTcc->Fill(SVFitting::BeforeFit); try { @@ -488,38 +610,8 @@ struct HfTreeCreatorTccToD0D0Pi { // Retrieve properties of the two D0 candidates float yD1 = hfHelper.yD0(candidateD1); float yD2 = hfHelper.yD0(candidateD2); - float massD01 = -999; - float massD02 = -999; float deltaMassD01 = -999; float deltaMassD02 = -999; - int candFlagD1 = -999; - int candFlagD2 = -999; - float cent = evaluateCentralityColl(collision); - - std::vector mlScoresD1; - std::vector mlScoresD2; - - if (candidateD1.isSelD0()) { - candFlagD1 = (candidateD1.isSelD0bar()) ? 3 : 1; - std::copy(candidateD1.mlProbD0().begin(), candidateD1.mlProbD0().end(), std::back_inserter(mlScoresD1)); - massD01 = hfHelper.invMassD0ToPiK(candidateD1); - } - if (candidateD1.isSelD0bar() && !candidateD1.isSelD0()) { - candFlagD1 = 2; - std::copy(candidateD1.mlProbD0bar().begin(), candidateD1.mlProbD0bar().end(), std::back_inserter(mlScoresD1)); - massD01 = hfHelper.invMassD0barToKPi(candidateD1); - } - - if (candidateD2.isSelD0()) { - candFlagD2 = (candidateD2.isSelD0bar()) ? 3 : 1; - std::copy(candidateD2.mlProbD0().begin(), candidateD2.mlProbD0().end(), std::back_inserter(mlScoresD2)); - massD02 = hfHelper.invMassD0ToPiK(candidateD2); - } - if (candidateD2.isSelD0bar() && !candidateD2.isSelD0()) { - candFlagD2 = 2; - std::copy(candidateD2.mlProbD0bar().begin(), candidateD2.mlProbD0bar().end(), std::back_inserter(mlScoresD2)); - massD02 = hfHelper.invMassD0barToKPi(candidateD2); - } std::array massD1Daus{MassPiPlus, MassKPlus}; std::array massD2Daus{MassPiPlus, MassKPlus}; @@ -539,7 +631,6 @@ struct HfTreeCreatorTccToD0D0Pi { auto arrayMomentaDDpi = std::array{pVecD1, pVecD2, pVecSoftPi}; const auto massD0D0Pi = RecoDecay::m(std::move(arrayMomentaDDpi), std::array{MassD0, MassD0, MassPiPlus}); const auto deltaMassD0D0Pi = massD0D0Pi - (massD01 + massD02); - const auto massD0D0Pair = RecoDecay::m(std::array{pVecD1, pVecD2}, std::array{MassD0, MassD0}); deltaMassD01 = massKpipi1 - massD01; deltaMassD02 = massKpipi2 - massD02; @@ -570,7 +661,6 @@ struct HfTreeCreatorTccToD0D0Pi { massD02, deltaMassD01, deltaMassD02, - massD0D0Pair, massKpipi1, massKpipi2, massD0D0Pi, @@ -600,7 +690,9 @@ struct HfTreeCreatorTccToD0D0Pi { trackPion.itsNCls(), trackPion.tpcNClsCrossedRows(), trackPion.tpcChi2NCl(), - cent); + cent, + collision.globalIndex(), + timeStamp); } // end of loop track } // end of loop second D0 } // end of loop first D0 From 161108ec2ad72f9120156ceed82a3465741b64da Mon Sep 17 00:00:00 2001 From: JStaa <39123272+JStaa@users.noreply.github.com> Date: Sun, 1 Jun 2025 21:29:55 +0200 Subject: [PATCH 1480/1650] [PWGCF] Splitted RD same-sign correlations into postive and negative (#11427) Co-authored-by: ALICE Action Bot --- .../Tasks/threeParticleCorrelations.cxx | 47 +++++++++++++++---- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx index 1a41054441f..99cf6e75c69 100644 --- a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx +++ b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx @@ -49,7 +49,7 @@ struct ThreeParticleCorrelations { float pionPtMin = 0.3, pionPtMax = 2.3, kaonPtMin = 0.5, kaonPtMax = 2.5, protonPtMin = 0.5, protonPtMax = 2.5; float pionPtMid = 1.5, kaonPtMid1 = 1.5, kaonPtMid2 = 2.0, protonPtMid = 0.7; - float dEtaMin = 0.02, dPhiStarMin = 0.1; + float dEtaMin = 0.05, dPhiStarMin = 0.11; float rMin = 0.8, rMax = 2.5; // Lambda invariant mass fit @@ -202,14 +202,23 @@ struct ThreeParticleCorrelations { rQARegistry.add("hInvMassAntiLambda_MC", "hInvMassAntiLambda_MC", {HistType::kTH3D, {{lambdaInvMassAxis}, {v0PtAxis}, {centralityAxis}}}); // PhiStar - rPhiStarRegistry.add("hSEProtonPreCut_OS", "hSEProtonPreCut_OS", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); - rPhiStarRegistry.add("hSEProtonPreCut_SS", "hSEProtonPreCut_SS", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); - rPhiStarRegistry.add("hSEProtonPostCut_OS", "hSEProtonPostCut_OS", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); - rPhiStarRegistry.add("hSEProtonPostCut_SS", "hSEProtonPostCut_SS", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); - rPhiStarRegistry.add("hMEProtonPreCut_OS", "hMEProtonPreCut_OS", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); - rPhiStarRegistry.add("hMEProtonPreCut_SS", "hMEProtonPreCut_SS", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); - rPhiStarRegistry.add("hMEProtonPostCut_OS", "hMEProtonPostCut_OS", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); - rPhiStarRegistry.add("hMEProtonPostCut_SS", "hMEProtonPostCut_SS", {HistType::kTH2D, {{80, -0.2, 0.2}, {40, -0.1, 0.1}}}); + rPhiStarRegistry.add("hSEProtonPreCut_OS", "hSEProtonPreCut_OS", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); + rPhiStarRegistry.add("hSEProtonPreCut_SS", "hSEProtonPreCut_SS", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); + rPhiStarRegistry.add("hSEProtonPreCut_SSP", "hSEProtonPreCut_SSP", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); + rPhiStarRegistry.add("hSEProtonPreCut_SSN", "hSEProtonPreCut_SSN", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); + rPhiStarRegistry.add("hSEProtonPostCut_OS", "hSEProtonPostCut_OS", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); + rPhiStarRegistry.add("hSEProtonPostCut_SS", "hSEProtonPostCut_SS", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); + rPhiStarRegistry.add("hSEProtonPostCut_SSP", "hSEProtonPostCut_SSP", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); + rPhiStarRegistry.add("hSEProtonPostCut_SSN", "hSEProtonPostCut_SSN", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); + + rPhiStarRegistry.add("hMEProtonPreCut_OS", "hMEProtonPreCut_OS", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); + rPhiStarRegistry.add("hMEProtonPreCut_SS", "hMEProtonPreCut_SS", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); + rPhiStarRegistry.add("hMEProtonPreCut_SSP", "hMEProtonPreCut_SSP", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); + rPhiStarRegistry.add("hMEProtonPreCut_SSN", "hMEProtonPreCut_SSN", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); + rPhiStarRegistry.add("hMEProtonPostCut_OS", "hMEProtonPostCut_OS", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); + rPhiStarRegistry.add("hMEProtonPostCut_SS", "hMEProtonPostCut_SS", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); + rPhiStarRegistry.add("hMEProtonPostCut_SSP", "hMEProtonPostCut_SSP", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); + rPhiStarRegistry.add("hMEProtonPostCut_SSN", "hMEProtonPostCut_SSN", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); // Efficiency rMCRegistry.add("hGenerated", "hGenerated", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); @@ -1089,6 +1098,11 @@ struct ThreeParticleCorrelations { rPhiStarRegistry.fill(HIST("hSEProtonPreCut_OS"), dPhiStar, dEta); } else if (proton.sign() * track.sign() == 1) { // SS (Electric charge) rPhiStarRegistry.fill(HIST("hSEProtonPreCut_SS"), dPhiStar, dEta); + if (proton.sign() == 1) { // Positive + rPhiStarRegistry.fill(HIST("hSEProtonPreCut_SSP"), dPhiStar, dEta); + } else if (proton.sign() == -1) { // Negative + rPhiStarRegistry.fill(HIST("hSEProtonPreCut_SSN"), dPhiStar, dEta); + } } } else { // Mixed-event @@ -1096,6 +1110,11 @@ struct ThreeParticleCorrelations { rPhiStarRegistry.fill(HIST("hMEProtonPreCut_OS"), dPhiStar, dEta); } else if (proton.sign() * track.sign() == 1) { // SS (Electric charge) rPhiStarRegistry.fill(HIST("hMEProtonPreCut_SS"), dPhiStar, dEta); + if (proton.sign() == 1) { // Positive + rPhiStarRegistry.fill(HIST("hMEProtonPreCut_SSP"), dPhiStar, dEta); + } else if (proton.sign() == -1) { // Negative + rPhiStarRegistry.fill(HIST("hMEProtonPreCut_SSN"), dPhiStar, dEta); + } } } } @@ -1110,6 +1129,11 @@ struct ThreeParticleCorrelations { rPhiStarRegistry.fill(HIST("hSEProtonPostCut_OS"), dPhiStar, dEta); } else if (proton.sign() * track.sign() == 1) { // SS (Electric charge) rPhiStarRegistry.fill(HIST("hSEProtonPostCut_SS"), dPhiStar, dEta); + if (proton.sign() == 1) { // Positive + rPhiStarRegistry.fill(HIST("hSEProtonPostCut_SSP"), dPhiStar, dEta); + } else if (proton.sign() == -1) { // Negative + rPhiStarRegistry.fill(HIST("hSEProtonPostCut_SSN"), dPhiStar, dEta); + } } } else { // Mixed-event @@ -1117,6 +1141,11 @@ struct ThreeParticleCorrelations { rPhiStarRegistry.fill(HIST("hMEProtonPostCut_OS"), dPhiStar, dEta); } else if (proton.sign() * track.sign() == 1) { // SS (Electric charge) rPhiStarRegistry.fill(HIST("hMEProtonPostCut_SS"), dPhiStar, dEta); + if (proton.sign() == 1) { // Positive + rPhiStarRegistry.fill(HIST("hMEProtonPostCut_SSP"), dPhiStar, dEta); + } else if (proton.sign() == -1) { // Negative + rPhiStarRegistry.fill(HIST("hMEProtonPostCut_SSN"), dPhiStar, dEta); + } } } } From baaeebf40946c25c4f6c30c5ad46a83286e46378 Mon Sep 17 00:00:00 2001 From: omvazque Date: Sun, 1 Jun 2025 17:43:49 -0500 Subject: [PATCH 1481/1650] [PWGLF] Additional histograms to calculate ZP over ZN v3 (#11430) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 84 +++++++++++++------- 1 file changed, 55 insertions(+), 29 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index 0aa0e4ff5a5..5bbfb186eb2 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -65,8 +65,8 @@ using SimTracks = soa::Join isNoCollInTimeRangeStrict{"isNoCollInTimeRangeStrict", true, "use isNoCollInTimeRangeStrict?"}; @@ -101,13 +101,19 @@ struct UccZdc { Configurable maxEta{"maxEta", +0.8, "maximum eta"}; // Configurables, binning + Configurable nBinsITSTrack{"nBinsITSTrack", 2000, "N bins ITS tracks"}; + Configurable minITSTrack{"minITSTrack", 0., "Min ITS tracks"}; + Configurable maxITSTrack{"maxITSTrack", 6000., "Min ITS tracks"}; Configurable maxAmpFV0{"maxAmpFV0", 2000, "Max FV0 amp"}; Configurable nBinsAmpFT0{"nBinsAmpFT0", 100, "N bins FT0 amp"}; + Configurable nBinsAmpFT0Fine{"nBinsAmpFT0Fine", 1000, "N bins FT0 amp"}; Configurable maxAmpFT0{"maxAmpFT0", 2500, "Max FT0 amp"}; Configurable nBinsNch{"nBinsNch", 2501, "N bins Nch (|eta|<0.8)"}; + Configurable nBinsNchFine{"nBinsNchFine", 3000, "N bins Nch (|eta|<0.8)"}; Configurable minNch{"minNch", 0, "Min Nch (|eta|<0.8)"}; - Configurable maxNch{"maxNch", 2500, "Max Nch (|eta|<0.8)"}; - Configurable nBinsZDC{"nBinsZDC", 400, "N bins ZDC"}; + Configurable maxNch{"maxNch", 3000, "Max Nch (|eta|<0.8)"}; + Configurable nBinsZN{"nBinsZN", 400, "N bins ZN"}; + Configurable nBinsZP{"nBinsZP", 160, "N bins ZP"}; Configurable minZN{"minZN", 0, "Min ZN signal"}; Configurable maxZN{"maxZN", 150, "Max ZN signal"}; Configurable maxZP{"maxZP", 60, "Max ZP signal"}; @@ -171,7 +177,7 @@ struct UccZdc { registry.add("T0Ccent", ";;Entries", kTH1F, {axisCent}); registry.add("NchUncorrected", ";#it{N}_{ch} (|#eta| < 0.8);Entries;", kTH1F, {{300, 0., 3000.}}); registry.add("hEventCounter", ";;Events", kTH1F, {axisEvent}); - registry.add("ZNamp", ";ZNA+ZNC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); + registry.add("ZNamp", ";ZNA+ZNC;Entries;", kTH1F, {{nBinsZN, -0.5, maxZN}}); registry.add("ExcludedEvtVsFT0M", ";T0A+T0C (#times 1/100, -3.3 < #eta < -2.1 and 3.5 < #eta < 4.9);Entries;", kTH1F, {{nBinsAmpFT0, 0., maxAmpFT0}}); registry.add("ExcludedEvtVsNch", ";#it{N}_{ch} (|#eta|<0.8);Entries;", kTH1F, {{300, 0, 3000}}); registry.add("Nch", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);", kTH1F, {{nBinsNch, minNch, maxNch}}); @@ -202,11 +208,17 @@ struct UccZdc { x->SetBinLabel(17, "Within ZEM cut?"); if (doprocessZdcCollAss) { - registry.add("NchVsPt", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);;", kTH2F, {{{nBinsNch, minNch, maxNch}, {axisPt}}}); - registry.add("NchVsOneParCorrVsZN", ";#it{N}_{ch} (|#eta| < 0.8, Corrected); ZNA+ZNC; #LT[#it{p}_{T}^{(1)}]#GT", kTProfile2D, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, -0.5, maxZN}}}); - registry.add("NchVsTwoParCorrVsZN", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);ZNA+ZNC;#LT[#it{p}_{T}^{(2)}]#GT", kTProfile2D, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, -0.5, maxZN}}}); - registry.add("NchVsThreeParCorrVsZN", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);ZNA+ZNC;#LT[#it{p}_{T}^{(3)}]#GT", kTProfile2D, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, -0.5, maxZN}}}); - registry.add("NchVsFourParCorrVsZN", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);ZNA+ZNC;#LT[#it{p}_{T}^{(4)}]#GT", kTProfile2D, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, -0.5, maxZN}}}); + registry.add("NchVsZN", ";#it{N}_{ch} (|#eta| < 0.8); ZNA+ZNC;", kTH2F, {{{nBinsNchFine, minNch, maxNch}, {nBinsZN, -0.5, maxZN}}}); + registry.add("NchVsZP", ";#it{N}_{ch} (|#eta| < 0.8); ZPA+ZPC;", kTH2F, {{{nBinsNchFine, minNch, maxNch}, {nBinsZP, -0.5, maxZP}}}); + registry.add("NITSTacksVsZN", ";ITS tracks; ZNA+ZNC;", kTH2F, {{{nBinsITSTrack, minITSTrack, maxITSTrack}, {nBinsZN, -0.5, maxZN}}}); + registry.add("NITSTacksVsZP", ";ITS tracks; ZPA+ZPC;", kTH2F, {{{nBinsITSTrack, minITSTrack, maxITSTrack}, {nBinsZP, -0.5, maxZP}}}); + registry.add("T0MVsZN", ";T0A+T0C amp (#times 1/100); ZNA+ZNC;", kTH2F, {{{nBinsAmpFT0Fine, 0., maxAmpFT0}, {nBinsZN, -0.5, maxZN}}}); + registry.add("T0MVsZP", ";T0A+T0C amp (#times 1/100); ZPA+ZPC;", kTH2F, {{{nBinsAmpFT0Fine, 0., maxAmpFT0}, {nBinsZP, -0.5, maxZP}}}); + registry.add("NchVsZNVsPt", ";#it{N}_{ch} (|#eta| < 0.8); ZNA+ZNC;#it{p}_{T} (GeV/#it{c})", kTH3F, {{{nBinsNch, minNch, maxNch}, {nBinsZN, -0.5, maxZN}, {axisPt}}}); + registry.add("NchVsOneParCorrVsZN", ";#it{N}_{ch} (|#eta| < 0.8, Corrected); ZNA+ZNC; #LT[#it{p}_{T}^{(1)}]#G (GeV/#it{c})T", kTProfile2D, {{{nBinsNch, minNch, maxNch}, {nBinsZN, -0.5, maxZN}}}); + registry.add("NchVsTwoParCorrVsZN", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);ZNA+ZNC;#LT[#it{p}_{T}^{(2)}]#GT", kTProfile2D, {{{nBinsNch, minNch, maxNch}, {nBinsZN, -0.5, maxZN}}}); + registry.add("NchVsThreeParCorrVsZN", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);ZNA+ZNC;#LT[#it{p}_{T}^{(3)}]#GT", kTProfile2D, {{{nBinsNch, minNch, maxNch}, {nBinsZN, -0.5, maxZN}}}); + registry.add("NchVsFourParCorrVsZN", ";#it{N}_{ch} (|#eta| < 0.8, Corrected);ZNA+ZNC;#LT[#it{p}_{T}^{(4)}]#GT", kTProfile2D, {{{nBinsNch, minNch, maxNch}, {nBinsZN, -0.5, maxZN}}}); } if (doprocessMCclosure) { @@ -260,21 +272,21 @@ struct UccZdc { registry.add("NchVsEt", ";#it{E}_{T} (|#eta|<0.8);#LTITS+TPC tracks#GT (|#eta|<0.8);", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsNch, minNch, maxNch}}}); registry.add("NchVsNPV", ";#it{N}_{PV} (|#eta|<1);ITS+TPC tracks (|#eta|<0.8);", kTH2F, {{{300, -0.5, 5999.5}, {nBinsNch, minNch, maxNch}}}); registry.add("NchVsITStracks", ";ITS tracks nCls >= 5;TITS+TPC tracks (|#eta|<0.8);", kTH2F, {{{300, -0.5, 5999.5}, {nBinsNch, minNch, maxNch}}}); - registry.add("ZNVsFT0A", ";T0A (#times 1/100);ZNA+ZNC;", kTH2F, {{{80, 0., 1800.}, {nBinsZDC, -0.5, maxZN}}}); - registry.add("ZNVsFT0C", ";T0C (#times 1/100);ZNA+ZNC;", kTH2F, {{{80, 0., 600.}, {nBinsZDC, -0.5, maxZN}}}); - registry.add("ZNVsFT0M", ";T0A+T0C (#times 1/100);ZNA+ZNC;", kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsZDC, -0.5, maxZN}}}); - registry.add("ZNAamp", ";ZNA;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); - registry.add("ZPAamp", ";ZPA;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZP}}); - registry.add("ZNCamp", ";ZNC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZN}}); - registry.add("ZPCamp", ";ZPC;Entries;", kTH1F, {{nBinsZDC, -0.5, maxZP}}); + registry.add("ZNVsFT0A", ";T0A (#times 1/100);ZNA+ZNC;", kTH2F, {{{80, 0., 1800.}, {nBinsZN, -0.5, maxZN}}}); + registry.add("ZNVsFT0C", ";T0C (#times 1/100);ZNA+ZNC;", kTH2F, {{{80, 0., 600.}, {nBinsZN, -0.5, maxZN}}}); + registry.add("ZNVsFT0M", ";T0A+T0C (#times 1/100);ZNA+ZNC;", kTH2F, {{{nBinsAmpFT0, 0., maxAmpFT0}, {nBinsZN, -0.5, maxZN}}}); + registry.add("ZNAamp", ";ZNA;Entries;", kTH1F, {{nBinsZN, -0.5, maxZN}}); + registry.add("ZPAamp", ";ZPA;Entries;", kTH1F, {{nBinsZP, -0.5, maxZP}}); + registry.add("ZNCamp", ";ZNC;Entries;", kTH1F, {{nBinsZN, -0.5, maxZN}}); + registry.add("ZPCamp", ";ZPC;Entries;", kTH1F, {{nBinsZP, -0.5, maxZP}}); registry.add("ZNAVsZNC", ";ZNC;ZNA", kTH2F, {{{30, -0.5, maxZN}, {30, -0.5, maxZN}}}); registry.add("ZPAVsZPC", ";ZPC;ZPA;", kTH2F, {{{100, -0.5, maxZP}, {100, -0.5, maxZP}}}); registry.add("ZNAVsZPA", ";ZPA;ZNA;", kTH2F, {{{20, -0.5, maxZP}, {30, -0.5, maxZN}}}); registry.add("ZNCVsZPC", ";ZPC;ZNC;", kTH2F, {{{20, -0.5, maxZP}, {30, -0.5, maxZN}}}); registry.add("ZNVsZEM", ";ZEM;ZNA+ZNC;", kTH2F, {{{60, -0.5, maxZEM}, {60, -0.5, maxZN}}}); - registry.add("ZNCVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNC;", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, minZN, maxZN}}}); - registry.add("ZNAVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA;", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, minZN, maxZN}}}); - registry.add("ZNVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA+ZNC;", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, minZN, maxZN}}}); + registry.add("ZNCVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNC;", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsZN, minZN, maxZN}}}); + registry.add("ZNAVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA;", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsZN, minZN, maxZN}}}); + registry.add("ZNVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA+ZNC;", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsZN, minZN, maxZN}}}); registry.add("ZNDifVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA-ZNC;", kTH2F, {{{nBinsNch, minNch, maxNch}, {100, -50., 50.}}}); } @@ -429,10 +441,10 @@ struct UccZdc { float tZPC{zdc.timeZPC()}; float tZDCdif{tZNC + tZPC - tZNA - tZPA}; float tZDCsum{tZNC + tZPC + tZNA + tZPA}; - znA /= collEnergy; - znC /= collEnergy; - zpA /= collEnergy; - zpC /= collEnergy; + znA /= kCollEnergy; + znC /= kCollEnergy; + zpA /= kCollEnergy; + zpC /= kCollEnergy; float sumZNs{znA + znC}; float sumZEMs{aZEM1 + aZEM2}; @@ -576,6 +588,8 @@ struct UccZdc { const double normT0M{(aT0A + aT0C) / 100.}; float znA{foundBC.zdc().amplitudeZNA()}; float znC{foundBC.zdc().amplitudeZNC()}; + float zpA{foundBC.zdc().amplitudeZPA()}; + float zpC{foundBC.zdc().amplitudeZPC()}; float aZEM1{foundBC.zdc().amplitudeZEM1()}; float aZEM2{foundBC.zdc().amplitudeZEM2()}; float tZNA{foundBC.zdc().timeZNA()}; @@ -584,9 +598,12 @@ struct UccZdc { float tZPC{foundBC.zdc().timeZPC()}; float tZDCdif{tZNC + tZPC - tZNA - tZPA}; float tZDCsum{tZNC + tZPC + tZNA + tZPA}; - znA /= collEnergy; - znC /= collEnergy; + znA /= kCollEnergy; + znC /= kCollEnergy; + zpA /= kCollEnergy; + zpC /= kCollEnergy; float sumZNs{znA + znC}; + float sumZPs{zpA + zpC}; float sumZEMs{aZEM1 + aZEM2}; // TDC cut @@ -609,9 +626,12 @@ struct UccZdc { registry.fill(HIST("T0Ccent"), collision.centFT0C()); // Nch-based selection - int glbTracks{0}; + int itsTracks = 0, glbTracks = 0; for (const auto& track : tracks) { // Track Selection + if (track.hasITS()) { + itsTracks++; + } if (!track.isGlobalTrack()) { continue; } @@ -693,7 +713,7 @@ struct UccZdc { if (!track.isGlobalTrack()) { continue; } - registry.fill(HIST("NchVsPt"), w1, track.pt()); + registry.fill(HIST("NchVsZNVsPt"), w1, sumZNs, track.pt()); } // EbE one-particle pT correlation @@ -716,6 +736,12 @@ struct UccZdc { registry.fill(HIST("Nch"), w1); registry.fill(HIST("ZNamp"), sumZNs); + registry.fill(HIST("NchVsZN"), w1, sumZNs); + registry.fill(HIST("NchVsZP"), w1, sumZPs); + registry.fill(HIST("NITSTacksVsZN"), itsTracks, sumZNs); + registry.fill(HIST("NITSTacksVsZP"), itsTracks, sumZPs); + registry.fill(HIST("T0MVsZN"), normT0M, sumZNs); + registry.fill(HIST("T0MVsZP"), normT0M, sumZPs); registry.fill(HIST("NchUncorrected"), glbTracks); registry.fill(HIST("NchVsOneParCorr"), w1, oneParCorr, w1); registry.fill(HIST("NchVsOneParCorrVsZN"), w1, sumZNs, oneParCorr, w1); @@ -760,7 +786,7 @@ struct UccZdc { registry.fill(HIST("T0Ccent"), cent); // Half of the statistics for MC closure - if (rndNum >= zEro && rndNum < evtFracMCcl) { + if (rndNum >= kZero && rndNum < evtFracMCcl) { registry.fill(HIST("EvtsDivided"), 0); // To use run-by-run efficiency From 4abefad42244305117b44a629547bc9be3afdf0b Mon Sep 17 00:00:00 2001 From: Paola Vargas Torres <88360333+PaolaVT@users.noreply.github.com> Date: Sun, 1 Jun 2025 19:25:36 -0600 Subject: [PATCH 1482/1650] [PWGLF] Additional cuts were added (#11429) --- PWGMM/UE/Tasks/dedxAnalysis.cxx | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/PWGMM/UE/Tasks/dedxAnalysis.cxx b/PWGMM/UE/Tasks/dedxAnalysis.cxx index fb4200bbaaa..0336638dade 100644 --- a/PWGMM/UE/Tasks/dedxAnalysis.cxx +++ b/PWGMM/UE/Tasks/dedxAnalysis.cxx @@ -20,7 +20,6 @@ #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/PIDResponse.h" #include "Common/DataModel/TrackSelectionTables.h" -#include "Common/DataModel/Centrality.h" #include "Common/DataModel/Multiplicity.h" #include "Framework/ASoAHelpers.h" #include "Framework/AnalysisDataModel.h" @@ -38,7 +37,7 @@ using PIDTracks = soa::Join< aod::Tracks, aod::TracksExtra, aod::TrackSelectionExtension, aod::TracksDCA, aod::TrackSelection, aod::pidTOFFullPi, aod::pidTOFFullPr, aod::pidTOFFullEl, aod::pidTOFbeta>; -using SelectedCollisions = soa::Join; +using SelectedCollisions = soa::Join; struct DedxAnalysis { @@ -53,8 +52,6 @@ struct DedxAnalysis { static constexpr int kEtaIntervals = 8; static constexpr int kParticlesType = 4; float tpcCut = 0.6; - float centMin = 0.0; - float centMax = 100.0; float pionMin = 0.35; float pionMax = 0.45; float elTofCut = 0.1; @@ -71,6 +68,8 @@ struct DedxAnalysis { "max chi2 per cluster TPC"}; Configurable maxChi2ITS{"maxChi2ITS", 36.0f, "max chi2 per cluster ITS"}; + Configurable maxZDistanceToIP{"maxZDistanceToIP", 10.0f, + "max z distance to IP"}; Configurable etaMin{"etaMin", -0.8f, "etaMin"}; Configurable etaMax{"etaMax", +0.8f, "etaMax"}; Configurable minNCrossedRowsOverFindableClustersTPC{"minNCrossedRowsOverFindableClustersTPC", 0.8f, "Additional cut on the minimum value of the ratio between crossed rows and findable clusters in the TPC"}; @@ -95,6 +94,7 @@ struct DedxAnalysis { Configurable maxMassGamma{"maxMassGamma", 0.002022f, "Maximum Mass Gamma"}; Configurable calibrationMode{"calibrationMode", false, "calibration mode"}; + Configurable additionalCuts{"additionalCuts", false, "additional cuts"}; // Histograms names static constexpr std::string_view kDedxvsMomentumPos[kParticlesType] = {"dEdx_vs_Momentum_all_Pos", "dEdx_vs_Momentum_Pi_v0_Pos", "dEdx_vs_Momentum_Pr_v0_Pos", "dEdx_vs_Momentum_El_v0_Pos"}; static constexpr std::string_view kDedxvsMomentumNeg[kParticlesType] = {"dEdx_vs_Momentum_all_Neg", "dEdx_vs_Momentum_Pi_v0_Neg", "dEdx_vs_Momentum_Pr_v0_Neg", "dEdx_vs_Momentum_El_v0_Neg"}; @@ -117,6 +117,7 @@ struct DedxAnalysis { selectedTracks.SetMaxChi2PerClusterITS(maxChi2ITS); selectedTracks.SetMaxDcaXYPtDep([](float pt) { return 0.0105f + 0.0350f / std::pow(pt, 1.1f); }); selectedTracks.SetMaxDcaZ(maxDCAz); + selectedTracks.SetRequireGoldenChi2(true); return selectedTracks; } @@ -382,14 +383,23 @@ struct DedxAnalysis { if (!collision.sel8()) return; + if (additionalCuts) { + if (!collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) + return; + + if (!collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) + return; + + if (std::abs(collision.posZ()) >= maxZDistanceToIP) + return; + + if (!collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) + return; + } + // Event Counter registryDeDx.fill(HIST("histRecVtxZData"), collision.posZ()); - // Centrality - float centrality = collision.centFT0C(); - if (centrality < centMin || centrality > centMax) - centrality = 1.0; - // Kaons for (const auto& trk : tracks) { From 335dcdc999f371f3141628555ef52f50f99320b3 Mon Sep 17 00:00:00 2001 From: Rik Spijkers <78484875+rspijkers@users.noreply.github.com> Date: Mon, 2 Jun 2025 11:36:57 +0200 Subject: [PATCH 1483/1650] [PWGLF] add isPhysiscalPrimary option (#11432) --- PWGLF/Tasks/Strangeness/cascadeanalysisMC.cxx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/PWGLF/Tasks/Strangeness/cascadeanalysisMC.cxx b/PWGLF/Tasks/Strangeness/cascadeanalysisMC.cxx index b9f32b8600c..a1947c8b6b5 100644 --- a/PWGLF/Tasks/Strangeness/cascadeanalysisMC.cxx +++ b/PWGLF/Tasks/Strangeness/cascadeanalysisMC.cxx @@ -80,6 +80,7 @@ struct cascadeGenerated { Configurable nPtBins{"nPtBins", 200, "number of pT bins"}; Configurable rapidityCut{"rapidityCut", 0.5, "max (absolute) rapidity of generated cascade"}; Configurable nRapidityBins{"nRapidityBins", 200, "number of pT bins"}; + Configurable requirePhysicalPrimary{"requirePhysicalPrimary", false, "require the generated cascade to be a physical primary"}; void init(InitContext const&) { @@ -108,6 +109,8 @@ struct cascadeGenerated { for (auto& particle : mcparts) { if (TMath::Abs(particle.y()) > rapidityCut) continue; + if (requirePhysicalPrimary && !particle.isPhysicalPrimary()) + continue; if (particle.pdgCode() == 3312) { registry.fill(HIST("hPtXiMinus"), particle.pt()); registry.fill(HIST("h2DXiMinus"), particle.pt(), particle.y()); From 5c8c89b2565128a5b8bd5a53c630e7468b84a19f Mon Sep 17 00:00:00 2001 From: Fabio Colamaria Date: Mon, 2 Jun 2025 12:06:47 +0200 Subject: [PATCH 1484/1650] [ALICE3] Further refinements to decay finder code (#11413) Co-authored-by: fcolamar --- ALICE3/TableProducer/alice3-decayfinder.cxx | 98 +++++++++++++++++++-- 1 file changed, 91 insertions(+), 7 deletions(-) diff --git a/ALICE3/TableProducer/alice3-decayfinder.cxx b/ALICE3/TableProducer/alice3-decayfinder.cxx index 1c5d74e4e8d..73eb406295f 100644 --- a/ALICE3/TableProducer/alice3-decayfinder.cxx +++ b/ALICE3/TableProducer/alice3-decayfinder.cxx @@ -77,6 +77,7 @@ struct alice3decayFinder { Configurable magneticField{"magneticField", 20.0f, "Magnetic field (in kilogauss)"}; Configurable doDCAplotsD{"doDCAplotsD", true, "do daughter prong DCA plots for D mesons"}; Configurable doDCAplotsLc{"doDCAplotsLc", true, "do daughter prong DCA plots for Lc baryons"}; + Configurable doTopoPlotsForSAndB{"doTopoPlotsForSAndB", true, "do topological variable distributions for S and B separately"}; Configurable mcSameMotherCheck{"mcSameMotherCheck", true, "check if tracks come from the same MC mother"}; Configurable dcaDaughtersSelection{"dcaDaughtersSelection", 1000.0f, "DCA between daughters (cm)"}; @@ -92,11 +93,13 @@ struct alice3decayFinder { Configurable DCosThetaStarLowPt{"DCosThetaStarLowPt", 0.8, "Cos theta; low pt"}; Configurable DCosThetaStarHighPt{"DCosThetaStarHighPt", 0.9, "Cos theta; high pt"}; Configurable DCosThetaStarVHighPt{"DCosThetaStarVHighPt", 1.0, "Cos theta; very high pt"}; + Configurable DDecayLengthSquaredCut{"DDecayLengthSquaredCut", 0., "Flat component of squared decay length cut (only for LoI legacy)"}; Configurable DMinDecayLength{"DMinDecayLength", 0., "Minimum D decay length (3D)"}; Configurable DMaxDecayLength{"DMaxDecayLength", 10., "Maximum D decay length (3D)"}; Configurable DMinDecayLengthXY{"DMinDecayLengthXY", 0., "Minimum D decay length (xy)"}; Configurable DMaxDecayLengthXY{"DMaxDecayLengthXY", 10., "Maximum D decay length (xy)"}; - Configurable DNormDecayLength{"DNormDecayLength", 3, "Minimum normalized decay length"}; + Configurable DMinNormDecayLength{"DMinNormDecayLength", 3, "Minimum normalized decay length"}; + Configurable DMaxNormDecayLength{"DMaxNormDecayLength", 3, "Maximum normalized decay length"}; Configurable minPtPi{"minPtPi", 0., "Minimum pT of daughter pion track"}; Configurable minPtK{"minPtK", 0., "Minimum pT of daughter kaon track"}; Configurable maxImpParPi{"maxImpParPi", 1., "Maximum impact paramter of daughter pion track"}; @@ -389,7 +392,7 @@ struct alice3decayFinder { histos.add("hDNormDecayLength", "hDNormDecayLength", kTH1F, {{100, 0, 10}}); histos.add("hImpParPi", "hImpParPi", kTH1F, {{200, -0.4, 0.4}}); histos.add("hImpParK", "hImpParK", kTH1F, {{200, -0.4, 0.4}}); - histos.add("hImpParProduct", "hImpParProduct", kTH1F, {{200, -0.04, 0.04}}); + histos.add("hImpParProduct", "hImpParProduct", kTH1F, {{400, -0.04, 0.04}}); histos.add("hDCosPA_Selected", "hDCosPA_Selected", kTH1F, {{800, -1, 1}}); histos.add("hDCosPAxy_Selected", "hDCosPAxy_Selected", kTH1F, {{800, -1, 1}}); @@ -399,7 +402,28 @@ struct alice3decayFinder { histos.add("hDNormDecayLength_Selected", "hDNormDecayLength_Selected", kTH1F, {{100, 0, 10}}); histos.add("hImpParPi_Selected", "hImpParPi_Selected", kTH1F, {{200, -0.4, 0.4}}); histos.add("hImpParK_Selected", "hImpParK_Selected", kTH1F, {{200, -0.4, 0.4}}); - histos.add("hImpParProduct_Selected", "hImpParProduct_Selected", kTH1F, {{200, -0.04, 0.04}}); + histos.add("hImpParProduct_Selected", "hImpParProduct_Selected", kTH1F, {{400, -0.04, 0.04}}); + + if (doTopoPlotsForSAndB) { + histos.add("hDCosPA_Signal", "hDCosPA_Signal", kTH1F, {{800, -1, 1}}); + histos.add("hDCosPAxy_Signal", "hDCosPAxy_Signal", kTH1F, {{800, -1, 1}}); + histos.add("hDCosThetaStar_Signal", "hDCosThetaStar_Signal", kTH1F, {{200, -1, 1}}); + histos.add("hDDecayLength_Signal", "hDDecayLength_Signal", kTH1F, {{100, 0, 0.5}}); + histos.add("hDDecayLengthXY_Signal", "hDDecayLengthXY_Signal", kTH1F, {{100, 0, 0.5}}); + histos.add("hDNormDecayLength_Signal", "hDNormDecayLength_Signal", kTH1F, {{100, 0, 10}}); + histos.add("hImpParPi_Signal", "hImpParPi_Signal", kTH1F, {{200, -0.4, 0.4}}); + histos.add("hImpParK_Signal", "hImpParK_Signal", kTH1F, {{200, -0.4, 0.4}}); + histos.add("hImpParProduct_Signal", "hImpParProduct_Signal", kTH1F, {{400, -0.04, 0.04}}); + histos.add("hDCosPA_Bkg", "hDCosPA_Bkg", kTH1F, {{800, -1, 1}}); + histos.add("hDCosPAxy_Bkg", "hDCosPAxy_Bkg", kTH1F, {{800, -1, 1}}); + histos.add("hDCosThetaStar_Bkg", "hDCosThetaStar_Bkg", kTH1F, {{200, -1, 1}}); + histos.add("hDDecayLength_Bkg", "hDDecayLength_Bkg", kTH1F, {{100, 0, 0.5}}); + histos.add("hDDecayLengthXY_Bkg", "hDDecayLengthXY_Bkg", kTH1F, {{100, 0, 0.5}}); + histos.add("hDNormDecayLength_Bkg", "hDNormDecayLength_Bkg", kTH1F, {{100, 0, 10}}); + histos.add("hImpParPi_Bkg", "hImpParPi_Bkg", kTH1F, {{200, -0.4, 0.4}}); + histos.add("hImpParK_Bkg", "hImpParK_Bkg", kTH1F, {{200, -0.4, 0.4}}); + histos.add("hImpParProduct_Bkg", "hImpParProduct_Bkg", kTH1F, {{400, -0.04, 0.04}}); + } if (doDCAplotsD) { histos.add("hDCADDaughters", "hDCADDaughters", kTH1D, {axisDCADaughters}); @@ -502,10 +526,37 @@ struct alice3decayFinder { histos.fill(HIST("hDDecayLength"), decayLength); histos.fill(HIST("hDDecayLengthXY"), decayLengthXY); histos.fill(HIST("hDNormDecayLength"), dmeson.normalizedDecayLength); - histos.fill(HIST("hDCADDaughters"), dmeson.dcaDau * 1e+4); histos.fill(HIST("hImpParPi"), impParXY_daugPos); histos.fill(HIST("hImpParK"), impParXY_daugNeg); histos.fill(HIST("hImpParProduct"), impParXY_daugPos * impParXY_daugNeg); + if (doDCAplotsD) + histos.fill(HIST("hDCADDaughters"), dmeson.dcaDau * 1e+4); + + if (doTopoPlotsForSAndB) { // fill plots of topological variables for S and B separately (reflections not considered here) + histos.fill(HIST("hDCosPA_Signal"), dmeson.cosPA); + histos.fill(HIST("hDCosPAxy_Signal"), dmeson.cosPAxy); + histos.fill(HIST("hDCosThetaStar_Signal"), dmeson.cosThetaStar); + histos.fill(HIST("hDDecayLength_Signal"), decayLength); + histos.fill(HIST("hDDecayLengthXY_Signal"), decayLengthXY); + histos.fill(HIST("hDNormDecayLength_Signal"), dmeson.normalizedDecayLength); + histos.fill(HIST("hImpParPi_Signal"), impParXY_daugPos); + histos.fill(HIST("hImpParK_Signal"), impParXY_daugNeg); + histos.fill(HIST("hImpParProduct_Signal"), impParXY_daugPos * impParXY_daugNeg); + histos.fill(HIST("hDCosPA_Bkg"), dmeson.cosPA); + histos.fill(HIST("hDCosPAxy_Bkg"), dmeson.cosPAxy); + histos.fill(HIST("hDCosThetaStar_Bkg"), dmeson.cosThetaStar); + histos.fill(HIST("hDDecayLength_Bkg"), decayLength); + histos.fill(HIST("hDDecayLengthXY_Bkg"), decayLengthXY); + histos.fill(HIST("hDNormDecayLength_Bkg"), dmeson.normalizedDecayLength); + histos.fill(HIST("hDCADDaughters_Bkg"), dmeson.dcaDau * 1e+4); + histos.fill(HIST("hImpParPi_Bkg"), impParXY_daugPos); + histos.fill(HIST("hImpParK_Bkg"), impParXY_daugNeg); + histos.fill(HIST("hImpParProduct_Bkg"), impParXY_daugPos * impParXY_daugNeg); + if (doDCAplotsD) { + histos.fill(HIST("hDCADDaughters_Signal"), dmeson.dcaDau * 1e+4); + histos.fill(HIST("hDCADDaughters_Bkg"), dmeson.dcaDau * 1e+4); + } + } if (dmeson.dcaDau > dcaDaughtersSelection) continue; @@ -527,7 +578,7 @@ struct alice3decayFinder { else if (dmeson.pt > highPtDLimit && std::fabs(dmeson.cosThetaStar) > DCosThetaStarVHighPt) continue; - if (dmeson.normalizedDecayLength > DNormDecayLength) + if (dmeson.normalizedDecayLength < DMinNormDecayLength || dmeson.normalizedDecayLength > DMaxNormDecayLength) continue; if (dmeson.ptdaugPos < minPtPi) // track1 (positive) is the pion @@ -546,6 +597,9 @@ struct alice3decayFinder { continue; if (decayLengthXY < DMinDecayLengthXY || decayLengthXY > DMaxDecayLengthXY) continue; + auto decayLengthSquaredCut = std::min((std::hypot(dmeson.P[0], dmeson.P[1], dmeson.P[2]) * 0.0066) + 0.01, (double)DDecayLengthSquaredCut); + if (decayLength * decayLength < decayLengthSquaredCut * decayLengthSquaredCut) + continue; // fill plots of topological variables after topological selection histos.fill(HIST("hDCosPA_Selected"), dmeson.cosPA); @@ -554,10 +608,11 @@ struct alice3decayFinder { histos.fill(HIST("hDDecayLength_Selected"), decayLength); histos.fill(HIST("hDDecayLengthXY_Selected"), decayLengthXY); histos.fill(HIST("hDNormDecayLength_Selected"), dmeson.normalizedDecayLength); - histos.fill(HIST("hDCADDaughters_Selected"), dmeson.dcaDau * 1e+4); histos.fill(HIST("hImpParPi_Selected"), impParXY_daugPos); histos.fill(HIST("hImpParK_Selected"), impParXY_daugNeg); histos.fill(HIST("hImpParProduct_Selected"), impParXY_daugPos * impParXY_daugNeg); + if (doDCAplotsD) + histos.fill(HIST("hDCADDaughters_Selected"), dmeson.dcaDau * 1e+4); // filling of mass plots for selected candidates histos.fill(HIST("hMassD"), dmeson.mass); @@ -620,6 +675,32 @@ struct alice3decayFinder { if (doDCAplotsD) histos.fill(HIST("hDCADbarDaughters"), dmeson.dcaDau * 1e+4); + if (doTopoPlotsForSAndB) { // fill plots of topological variables for S and B separately (reflections not considered here) + histos.fill(HIST("hDCosPA_Signal"), dmeson.cosPA); + histos.fill(HIST("hDCosPAxy_Signal"), dmeson.cosPAxy); + histos.fill(HIST("hDCosThetaStar_Signal"), dmeson.cosThetaStar); + histos.fill(HIST("hDDecayLength_Signal"), decayLength); + histos.fill(HIST("hDDecayLengthXY_Signal"), decayLengthXY); + histos.fill(HIST("hDNormDecayLength_Signal"), dmeson.normalizedDecayLength); + histos.fill(HIST("hImpParPi_Signal"), impParXY_daugNeg); + histos.fill(HIST("hImpParK_Signal"), impParXY_daugPos); + histos.fill(HIST("hImpParProduct_Signal"), impParXY_daugPos * impParXY_daugNeg); + histos.fill(HIST("hDCosPA_Bkg"), dmeson.cosPA); + histos.fill(HIST("hDCosPAxy_Bkg"), dmeson.cosPAxy); + histos.fill(HIST("hDCosThetaStar_Bkg"), dmeson.cosThetaStar); + histos.fill(HIST("hDDecayLength_Bkg"), decayLength); + histos.fill(HIST("hDDecayLengthXY_Bkg"), decayLengthXY); + histos.fill(HIST("hDNormDecayLength_Bkg"), dmeson.normalizedDecayLength); + histos.fill(HIST("hDCADDaughters_Bkg"), dmeson.dcaDau * 1e+4); + histos.fill(HIST("hImpParPi_Bkg"), impParXY_daugNeg); + histos.fill(HIST("hImpParK_Bkg"), impParXY_daugPos); + histos.fill(HIST("hImpParProduct_Bkg"), impParXY_daugPos * impParXY_daugNeg); + if (doDCAplotsD) { + histos.fill(HIST("hDCADDaughters_Signal"), dmeson.dcaDau * 1e+4); + histos.fill(HIST("hDCADDaughters_Bkg"), dmeson.dcaDau * 1e+4); + } + } + if (dmeson.dcaDau > dcaDaughtersSelection) continue; @@ -640,7 +721,7 @@ struct alice3decayFinder { else if (dmeson.pt > highPtDLimit && std::fabs(dmeson.cosThetaStar) > DCosThetaStarVHighPt) continue; - if (dmeson.normalizedDecayLength > DNormDecayLength) + if (dmeson.normalizedDecayLength < DMinNormDecayLength || dmeson.normalizedDecayLength > DMaxNormDecayLength) continue; if (dmeson.ptdaugPos < minPtK) // track1 is the kaon @@ -659,6 +740,9 @@ struct alice3decayFinder { continue; if (decayLengthXY < DMinDecayLengthXY || decayLengthXY > DMaxDecayLengthXY) continue; + auto decayLengthSquaredCut = std::min((std::hypot(dmeson.P[0], dmeson.P[1], dmeson.P[2]) * 0.0066) + 0.01, (double)DDecayLengthSquaredCut); + if (decayLength * decayLength < decayLengthSquaredCut * decayLengthSquaredCut) + continue; // fill plots of topological variables after topological selection histos.fill(HIST("hDCosPA_Selected"), dmeson.cosPA); From f5656d610a8054461f8ca1a7b1a1460a79d7da49 Mon Sep 17 00:00:00 2001 From: Marvin Hemmer <53471402+mhemmer-cern@users.noreply.github.com> Date: Mon, 2 Jun 2025 16:37:53 +0200 Subject: [PATCH 1485/1650] [PWGJE,EMCAL-734] Add some QA histograms to correction task (#11415) --- PWGJE/TableProducer/emcalCorrectionTask.cxx | 41 +++++++++++++++------ PWGJE/Tasks/emcClusterMonitor.cxx | 36 +++++++++--------- 2 files changed, 47 insertions(+), 30 deletions(-) diff --git a/PWGJE/TableProducer/emcalCorrectionTask.cxx b/PWGJE/TableProducer/emcalCorrectionTask.cxx index c2389d10b02..76877211c83 100644 --- a/PWGJE/TableProducer/emcalCorrectionTask.cxx +++ b/PWGJE/TableProducer/emcalCorrectionTask.cxx @@ -97,6 +97,7 @@ struct EmcalCorrectionTask { Configurable isMC{"isMC", false, "States if run over MC"}; Configurable applyCellTimeCorrection{"applyCellTimeCorrection", true, "apply a correction to the cell time for data and MC: Shift both average cell times to 0 and smear MC time distribution to fit data better. For MC requires isMC to be true"}; Configurable trackMinPt{"trackMinPt", 0.3, "Minimum pT for tracks to perform track matching, to reduce computing time. Tracks below a certain pT will be loopers anyway."}; + Configurable fillQA{"fillQA", false, "Switch to turn on QA histograms."}; // Require EMCAL cells (CALO type 1) Filter emccellfilter = aod::calo::caloType == selectedCellType; @@ -206,22 +207,26 @@ struct EmcalCorrectionTask { // Setup QA hists. // NOTE: This is not comprehensive. using O2HistType = o2::framework::HistType; - o2::framework::AxisSpec energyAxis{200, 0., 100., "E (GeV)"}, - timeAxis{300, -100, 200., "t (ns)"}, - etaAxis{160, -0.8, 0.8, "#eta"}, - phiAxis{72, 0, 2 * 3.14159, "phi"}, - nlmAxis{50, -0.5, 49.5, "NLM"}; - mHistManager.add("hCellE", "hCellE", O2HistType::kTH1F, {energyAxis}); + o2::framework::AxisSpec energyAxis{200, 0., 100., "#it{E} (GeV)"}, + timeAxis{300, -100, 200., "#it{t} (ns)"}, + etaAxis{160, -0.8, 0.8, "#it{#eta}"}, + phiAxis{72, 0, 2 * 3.14159, "#it{#varphi} (rad)"}, + nlmAxis{50, -0.5, 49.5, "NLM"}, + fCrossAxis{100, 0., 1., "F_{+}"}, + sigmaLongAxis{100, 0., 1.0, "#sigma^{2}_{long}"}, + sigmaShortAxis{100, 0., 1.0, "#sigma^{2}_{short}"}, + nCellAxis{60, -0.5, 59.5, "#it{n}_{cells}"}; + mHistManager.add("hCellE", "hCellE", O2HistType::kTH1D, {energyAxis}); mHistManager.add("hCellTowerID", "hCellTowerID", O2HistType::kTH1D, {{20000, 0, 20000}}); mHistManager.add("hCellEtaPhi", "hCellEtaPhi", O2HistType::kTH2F, {etaAxis, phiAxis}); mHistManager.add("hHGCellTimeEnergy", "hCellTime", O2HistType::kTH2F, {{300, -30, 30}, cellEnergyBins}); // Cell time vs energy for high gain cells (low energies) mHistManager.add("hLGCellTimeEnergy", "hCellTime", O2HistType::kTH2F, {{300, -30, 30}, cellEnergyBins}); // Cell time vs energy for low gain cells (high energies) // NOTE: Reversed column and row because it's more natural for presentation. mHistManager.add("hCellRowCol", "hCellRowCol;Column;Row", O2HistType::kTH2D, {{96, -0.5, 95.5}, {208, -0.5, 207.5}}); - mHistManager.add("hClusterE", "hClusterE", O2HistType::kTH1F, {energyAxis}); - mHistManager.add("hClusterNLM", "hClusterNLM", O2HistType::kTH1F, {nlmAxis}); + mHistManager.add("hClusterE", "hClusterE", O2HistType::kTH1D, {energyAxis}); + mHistManager.add("hClusterNLM", "hClusterNLM", O2HistType::kTH1D, {nlmAxis}); mHistManager.add("hClusterEtaPhi", "hClusterEtaPhi", O2HistType::kTH2F, {etaAxis, phiAxis}); - mHistManager.add("hClusterTime", "hClusterTime", O2HistType::kTH1F, {timeAxis}); + mHistManager.add("hClusterTime", "hClusterTime", O2HistType::kTH1D, {timeAxis}); mHistManager.add("hGlobalTrackEtaPhi", "hGlobalTrackEtaPhi", O2HistType::kTH2F, {etaAxis, phiAxis}); mHistManager.add("hGlobalTrackMult", "hGlobalTrackMult", O2HistType::kTH1D, {{200, -0.5, 199.5, "N_{trk}"}}); mHistManager.add("hCollisionType", "hCollisionType;;#it{count}", O2HistType::kTH1D, {{3, -0.5, 2.5}}); @@ -251,9 +256,15 @@ struct EmcalCorrectionTask { hBC->GetXaxis()->SetBinLabel(6, "no EMCal cells and with collision"); hBC->GetXaxis()->SetBinLabel(7, "no EMCal cells and mult. collisions"); hBC->GetXaxis()->SetBinLabel(8, "all BC"); - if (isMC) { - mHistManager.add("hContributors", "hContributors;contributor per cell hit;#it{counts}", O2HistType::kTH1I, {{20, 0, 20}}); - mHistManager.add("hMCParticleEnergy", "hMCParticleEnergy;#it{E} (GeV/#it{c});#it{counts}", O2HistType::kTH1F, {energyAxis}); + if (isMC.value) { + mHistManager.add("hContributors", "hContributors;contributor per cell hit;#it{counts}", O2HistType::kTH1D, {{20, 0, 20}}); + mHistManager.add("hMCParticleEnergy", "hMCParticleEnergy;#it{E} (GeV/#it{c});#it{counts}", O2HistType::kTH1D, {energyAxis}); + } + if (fillQA.value) { + mHistManager.add("hClusterNCellE", "hClusterNCellE", O2HistType::kTH2D, {energyAxis, nCellAxis}); + mHistManager.add("hClusterFCrossE", "hClusterFCrossE", O2HistType::kTH2D, {energyAxis, fCrossAxis}); + mHistManager.add("hClusterFCrossSigmaLongE", "hClusterFCrossSigmaLongE", O2HistType::kTH3F, {energyAxis, fCrossAxis, sigmaLongAxis}); + mHistManager.add("hClusterFCrossSigmaShortE", "hClusterFCrossSigmaShortE", O2HistType::kTH3F, {energyAxis, fCrossAxis, sigmaShortAxis}); } // For some runs, LG cells require an extra time shift of 2 * 8.8ns due to problems in the time calibration @@ -721,6 +732,12 @@ struct EmcalCorrectionTask { mHistManager.fill(HIST("hClusterNLM"), cluster.getNExMax()); mHistManager.fill(HIST("hClusterTime"), cluster.getClusterTime()); mHistManager.fill(HIST("hClusterEtaPhi"), pos.Eta(), TVector2::Phi_0_2pi(pos.Phi())); + if (fillQA.value) { + mHistManager.fill(HIST("hClusterNCellE"), cluster.E(), cluster.getNCells()); + mHistManager.fill(HIST("hClusterFCrossE"), cluster.E(), cluster.getFCross()); + mHistManager.fill(HIST("hClusterFCrossSigmaLongE"), cluster.E(), cluster.getFCross(), cluster.getM02()); + mHistManager.fill(HIST("hClusterFCrossSigmaShortE"), cluster.E(), cluster.getFCross(), cluster.getM20()); + } if (indexMapPair && trackGlobalIndex) { for (unsigned int iTrack = 0; iTrack < std::get<0>(*indexMapPair)[iCluster].size(); iTrack++) { if (std::get<0>(*indexMapPair)[iCluster][iTrack] >= 0) { diff --git a/PWGJE/Tasks/emcClusterMonitor.cxx b/PWGJE/Tasks/emcClusterMonitor.cxx index 9db525fe409..37ee979cc67 100644 --- a/PWGJE/Tasks/emcClusterMonitor.cxx +++ b/PWGJE/Tasks/emcClusterMonitor.cxx @@ -100,31 +100,31 @@ struct ClusterMonitor { const AxisSpec thAxisCellTimeMean{1500, -600, 900, "#LT#it{t}_{cell}#GT (ns)"}; // event properties - mHistManager.add("eventsAll", "Number of events", o2HistType::kTH1F, {{1, 0.5, 1.5}}); - mHistManager.add("eventsSelected", "Number of events", o2HistType::kTH1F, {{1, 0.5, 1.5}}); - mHistManager.add("eventBCAll", "Bunch crossing ID of event (all events)", o2HistType::kTH1F, {bcAxis}); - mHistManager.add("eventBCSelected", "Bunch crossing ID of event (selected events)", o2HistType::kTH1F, {bcAxis}); - mHistManager.add("eventVertexZAll", "z-vertex of event (all events)", o2HistType::kTH1F, {{200, -20, 20}}); - mHistManager.add("eventVertexZSelected", "z-vertex of event (selected events)", o2HistType::kTH1F, {{200, -20, 20}}); - mHistManager.add("numberOfClustersEvents", "number of clusters per event (selected events)", o2HistType::kTH1F, {numberClustersAxis}); - mHistManager.add("numberOfClustersBC", "number of clusters per bunch crossing (ambiguous BCs)", o2HistType::kTH1F, {numberClustersAxis}); - mHistManager.add("numberOfClustersEventsRejected", "number of clusters per event (rejected events)", o2HistType::kTH1F, {numberClustersAxis}); + mHistManager.add("eventsAll", "Number of events", o2HistType::kTH1D, {{1, 0.5, 1.5}}); + mHistManager.add("eventsSelected", "Number of events", o2HistType::kTH1D, {{1, 0.5, 1.5}}); + mHistManager.add("eventBCAll", "Bunch crossing ID of event (all events)", o2HistType::kTH1D, {bcAxis}); + mHistManager.add("eventBCSelected", "Bunch crossing ID of event (selected events)", o2HistType::kTH1D, {bcAxis}); + mHistManager.add("eventVertexZAll", "z-vertex of event (all events)", o2HistType::kTH1D, {{200, -20, 20}}); + mHistManager.add("eventVertexZSelected", "z-vertex of event (selected events)", o2HistType::kTH1D, {{200, -20, 20}}); + mHistManager.add("numberOfClustersEvents", "number of clusters per event (selected events)", o2HistType::kTH1D, {numberClustersAxis}); + mHistManager.add("numberOfClustersBC", "number of clusters per bunch crossing (ambiguous BCs)", o2HistType::kTH1D, {numberClustersAxis}); + mHistManager.add("numberOfClustersEventsRejected", "number of clusters per event (rejected events)", o2HistType::kTH1D, {numberClustersAxis}); mHistManager.add("numberOfClustersSMEvents", "number of clusters per supermodule per event (selected events)", o2HistType::kTH2F, {numberClustersAxis, {20, -0.5, 19.5, "SupermoduleID"}}); mHistManager.add("numberOfClustersSMBC", "number of clusters per supermodule per bunch crossing (ambiguous BCs)", o2HistType::kTH2F, {numberClustersAxis, {20, -0.5, 19.5, "SupermoduleID"}}); // cluster properties (matched clusters) - mHistManager.add("clusterE", "Energy of cluster", o2HistType::kTH1F, {energyAxis}); - mHistManager.add("clusterEMatched", "Energy of cluster (with match)", o2HistType::kTH1F, {energyAxis}); + mHistManager.add("clusterE", "Energy of cluster", o2HistType::kTH1D, {energyAxis}); + mHistManager.add("clusterEMatched", "Energy of cluster (with match)", o2HistType::kTH1D, {energyAxis}); mHistManager.add("clusterESupermodule", "Energy of the cluster vs. supermoduleID", o2HistType::kTH2F, {energyAxis, supermoduleAxis}); - mHistManager.add("clusterE_SimpleBinning", "Energy of cluster", o2HistType::kTH1F, {{2000, 0, 200}}); + mHistManager.add("clusterE_SimpleBinning", "Energy of cluster", o2HistType::kTH1D, {{2000, 0, 200}}); mHistManager.add("clusterEtaPhi", "Eta and phi of cluster", o2HistType::kTH2F, {{100, -1, 1}, {100, 0, 2 * TMath::Pi()}}); - mHistManager.add("clusterM02", "M02 of cluster", o2HistType::kTH1F, {{400, 0, 5}}); - mHistManager.add("clusterM20", "M20 of cluster", o2HistType::kTH1F, {{400, 0, 2.5}}); - mHistManager.add("clusterNLM", "Number of local maxima of cluster", o2HistType::kTH1I, {{10, 0, 10}}); - mHistManager.add("clusterNCells", "Number of cells in cluster", o2HistType::kTH1I, {{50, 0, 50}}); - mHistManager.add("clusterDistanceToBadChannel", "Distance to bad channel", o2HistType::kTH1F, {{100, 0, 100}}); + mHistManager.add("clusterM02", "M02 of cluster", o2HistType::kTH1D, {{400, 0, 5}}); + mHistManager.add("clusterM20", "M20 of cluster", o2HistType::kTH1D, {{400, 0, 2.5}}); + mHistManager.add("clusterNLM", "Number of local maxima of cluster", o2HistType::kTH1D, {{10, 0, 10}}); + mHistManager.add("clusterNCells", "Number of cells in cluster", o2HistType::kTH1D, {{50, 0, 50}}); + mHistManager.add("clusterDistanceToBadChannel", "Distance to bad channel", o2HistType::kTH1D, {{100, 0, 100}}); mHistManager.add("clusterTimeVsE", "Cluster time vs energy", o2HistType::kTH2F, {timeAxis, energyAxis}); - mHistManager.add("clusterAmpFractionLeadingCell", "Fraction of energy in leading cell", o2HistType::kTH1F, {{100, 0, 1}}); + mHistManager.add("clusterAmpFractionLeadingCell", "Fraction of energy in leading cell", o2HistType::kTH1D, {{100, 0, 1}}); mHistManager.add("clusterCellTimeDiff", "Cell time difference in clusters", o2HistType::kTH1D, {thAxisCellTimeDiff}); mHistManager.add("clusterCellTimeMean", "Mean cell time per cluster", o2HistType::kTH1D, {thAxisCellTimeMean}); From 751871e8fcb3bae061eec2cb4f535e39b3429bcd Mon Sep 17 00:00:00 2001 From: dajones2 <140733426+dajones2@users.noreply.github.com> Date: Mon, 2 Jun 2025 15:43:24 +0100 Subject: [PATCH 1486/1650] [PWGJE] Adding outlier cut histograms for triggers (#11423) --- PWGJE/Tasks/jetHadronRecoil.cxx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/PWGJE/Tasks/jetHadronRecoil.cxx b/PWGJE/Tasks/jetHadronRecoil.cxx index 8391cf041b7..357e973efe2 100644 --- a/PWGJE/Tasks/jetHadronRecoil.cxx +++ b/PWGJE/Tasks/jetHadronRecoil.cxx @@ -116,6 +116,8 @@ struct JetHadronRecoil { HistogramRegistry registry{"registry", {{"hNtrig", "number of triggers;trigger type;entries", {HistType::kTH1F, {{2, 0, 2}}}}, + {"hSignalTriggersPtHard", "Signal triggers vs PtHard", {HistType::kTH1F, {{20, 0, 5}}}}, + {"hReferenceTriggersPtHard", "Reference triggers vs PtHard", {HistType::kTH1F, {{20, 0, 5}}}}, {"hZvtxSelected", "Z vertex position;Z_{vtx};entries", {HistType::kTH1F, {{80, -20, 20}}}}, {"hPtTrack", "Track p_{T};p_{T};entries", {HistType::kTH1F, {{200, 0, 200}}}}, {"hEtaTrack", "Track #eta;#eta;entries", {HistType::kTH1F, {{100, -1.0, 1.0}}}}, @@ -243,6 +245,7 @@ struct JetHadronRecoil { registry.fill(HIST("hNtrig"), 1.5, weight); registry.fill(HIST("hSigEventTriggers"), nTT, weight); registry.fill(HIST("hRhoSignal"), rho, weight); + registry.fill(HIST("hSignalTriggersPtHard"), ptTT / pTHat, weight); } if (!isSigCol) { registry.fill(HIST("hNtrig"), 0.5, weight); @@ -251,6 +254,7 @@ struct JetHadronRecoil { for (double shift = 0.0; shift <= 2.0; shift += 0.1) { registry.fill(HIST("hRhoReferenceShift"), rho + shift, shift, weight); } + registry.fill(HIST("hReferenceTriggersPtHard"), ptTT / pTHat, weight); } } From 0a4dc854ad666aaa86c73b20abb40274094ee51b Mon Sep 17 00:00:00 2001 From: mhartung71 <50153519+mhartung71@users.noreply.github.com> Date: Mon, 2 Jun 2025 18:19:18 +0200 Subject: [PATCH 1487/1650] [PWGLF] PID updated (#11403) --- PWGLF/DataModel/LFHypernucleiKfTables.h | 14 +- PWGLF/TableProducer/Nuspex/hypKfRecoTask.cxx | 414 +++++++++++------- .../TableProducer/Nuspex/hypKfTreeCreator.cxx | 100 +++-- 3 files changed, 329 insertions(+), 199 deletions(-) diff --git a/PWGLF/DataModel/LFHypernucleiKfTables.h b/PWGLF/DataModel/LFHypernucleiKfTables.h index 98f8076b2f6..0e2424f3bb5 100644 --- a/PWGLF/DataModel/LFHypernucleiKfTables.h +++ b/PWGLF/DataModel/LFHypernucleiKfTables.h @@ -45,6 +45,7 @@ DECLARE_SOA_COLUMN(Svx, svx, float); //! DECLARE_SOA_COLUMN(Svy, svy, float); //! DECLARE_SOA_COLUMN(Svz, svz, float); //! DECLARE_SOA_COLUMN(Occupancy, occupancy, int); //! +DECLARE_SOA_COLUMN(RunNumber, runNumber, int); //! DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, [](float px, float py) { return RecoDecay::pt(std::array{px, py}); }); DECLARE_SOA_DYNAMIC_COLUMN(Y, y, [](float E, float pz) { return 0.5 * std::log((E + pz) / (E - pz)); }); DECLARE_SOA_DYNAMIC_COLUMN(Mass, mass, [](float E, float px, float py, float pz) { return std::sqrt(E * E - px * px - py * py - pz * pz); }); @@ -80,7 +81,8 @@ DECLARE_SOA_TABLE(HypKfColls, "AOD", "HYPKFCOLL", cent::CentFT0A, cent::CentFT0C, cent::CentFT0M, - hykfmc::Occupancy); + hykfmc::Occupancy, + hykfmc::RunNumber); using HypKfColl = HypKfColls::iterator; namespace hykftrk @@ -102,14 +104,14 @@ DECLARE_SOA_DYNAMIC_COLUMN(Y, y, [](float pt, float eta, float mass) { return st DECLARE_SOA_DYNAMIC_COLUMN(Lambda, lambda, [](float eta) { return 1. / std::cosh(eta); }); DECLARE_SOA_DYNAMIC_COLUMN(ItsNcluster, itsNcluster, [](uint32_t itsClusterSizes) { uint8_t n = 0; - for (uint8_t i = 0; i < 7; i++) { + for (uint8_t i = 0; i < 0x08; i++) { if (itsClusterSizes >> (4 * i) & 15) n++; } return n; }); DECLARE_SOA_DYNAMIC_COLUMN(ItsFirstLayer, itsFirstLayer, [](uint32_t itsClusterSizes) { - for (int i = 0; i < 8; i++) { + for (int i = 0; i < 0x08; i++) { if (itsClusterSizes >> (4 * i) & 15) return i; } @@ -117,7 +119,7 @@ DECLARE_SOA_DYNAMIC_COLUMN(ItsFirstLayer, itsFirstLayer, [](uint32_t itsClusterS }); DECLARE_SOA_DYNAMIC_COLUMN(ItsMeanClsSize, itsMeanClsSize, [](uint32_t itsClusterSizes) { int sum = 0, n = 0; - for (int i = 0; i < 8; i++) { + for (int i = 0; i < 0x08; i++) { sum += (itsClusterSizes >> (4 * i) & 15); if (itsClusterSizes >> (4 * i) & 15) n++; @@ -194,9 +196,9 @@ DECLARE_SOA_DYNAMIC_COLUMN(Eta, eta, [](float px, float py, float pz) { return R DECLARE_SOA_DYNAMIC_COLUMN(Phi, phi, [](float px, float py) { return RecoDecay::phi(std::array{px, py}); }); DECLARE_SOA_DYNAMIC_COLUMN(P, p, [](float px, float py, float pz) { return RecoDecay::p(px, py, pz); }); // DECLARE_SOA_DYNAMIC_COLUMN(Y, y, [](float px, float py, float pz, float mass) { return RecoDecay::y(std::array{px, py, pz}, mass); }); -DECLARE_SOA_DYNAMIC_COLUMN(McTrue, mcTrue, [](int hypKfMcPartId) { return hypKfMcPartId > 0; }); +DECLARE_SOA_DYNAMIC_COLUMN(McTrue, mcTrue, [](int hypKfMcPartId) { return hypKfMcPartId >= 0; }); DECLARE_SOA_DYNAMIC_COLUMN(IsMatter, isMatter, [](int8_t species) { return species > 0; }); -DECLARE_SOA_DYNAMIC_COLUMN(Cascade, cascade, [](int hypDaughter) { return hypDaughter > 0; }); +DECLARE_SOA_DYNAMIC_COLUMN(Cascade, cascade, [](int hypDaughter) { return hypDaughter >= 0; }); } // namespace hykfhyp DECLARE_SOA_TABLE(HypKfHypNucs, "AOD", "HYPKFHYPNUC", diff --git a/PWGLF/TableProducer/Nuspex/hypKfRecoTask.cxx b/PWGLF/TableProducer/Nuspex/hypKfRecoTask.cxx index 68e334f5766..d06405f1a32 100644 --- a/PWGLF/TableProducer/Nuspex/hypKfRecoTask.cxx +++ b/PWGLF/TableProducer/Nuspex/hypKfRecoTask.cxx @@ -16,6 +16,7 @@ #include #include #include +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" @@ -39,10 +40,14 @@ #include "PWGLF/DataModel/LFHypernucleiKfTables.h" #include "TRandom3.h" #include "Common/DataModel/CollisionAssociationTables.h" +#include "Common/TableProducer/PID/pidTPCBase.h" +#include "Common/DataModel/PIDResponseTPC.h" +#include "ReconstructionDataFormats/PID.h" +#include "MetadataHelper.h" // KFParticle #ifndef HomogeneousField -#define HomogeneousField // o2-linter: disable=[name/macro] +#define HomogeneousField // o2-linter: disable=name/macro (Name is defined in KFParticle package) #endif #include "KFParticle.h" #include "KFPTrack.h" @@ -54,10 +59,11 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; -using CollisionsFull = soa::Join; +using CollisionsFull = soa::Join; using CollisionsFullMC = soa::Join; -using TracksFull = soa::Join; +using TracksFull = soa::Join; +MetadataHelper metadataInfo; // Metadata helper //---------------------------------------------------------------------------------------------------------------- namespace @@ -148,7 +154,7 @@ static const std::vector cascadeNames{"4LLH->4LHe+pi", "4XHe->4LHe+ constexpr int cascadeEnabled[nCascades][1]{{0}, {0}, {0}, {0}, {0}, {0}}; constexpr int cascadePdgCodes[nCascades][1]{ {1020010040}, - {1120010040}, + {1120020040}, {0}, {0}, {0}, @@ -167,33 +173,32 @@ constexpr double preSelectionsCascades[nCascades][nSelCas]{ {0.00, 9.90, 0, 100, -1., 100., 10., 10.}, {0.00, 9.90, 0, 100, -1., 100., 10., 10.}, {0.00, 9.90, 0, 100, -1., 100., 10., 10.}}; - //---------------------------------------------------------------------------------------------------------------- struct DaughterParticle { TString name; int pdgCode, charge; double mass, resolution; - std::vector betheParams; + std::array betheParams; bool active; DaughterParticle(std::string name_, int pdgCode_, double mass_, int charge_, LabeledArray bethe) : name(name_), pdgCode(pdgCode_), charge(charge_), mass(mass_), active(false) { resolution = bethe.get(name, "resolution"); - betheParams.clear(); - for (unsigned int i = 0; i < 5; i++) - betheParams.push_back(bethe.get(name, i)); + for (unsigned int i = 0; i < betheParams.size(); i++) + betheParams[i] = bethe.get(name, i); } + int getCentralPIDIndex() { return getPIDIndex(pdgCode); } }; // struct DaughterParticle struct HyperNucleus { TString name; int pdgCode; - bool active; + bool active, savePrimary; std::vector daughters, daughterTrackSigns; - HyperNucleus(std::string name_, int pdgCode_, bool active_, std::vector daughters_, std::vector daughterTrackSigns_) : pdgCode(pdgCode_), active(active_) + HyperNucleus(std::string name_, int pdgCode_, bool active_, std::vector daughters_, std::vector daughterTrackSigns_) : pdgCode(pdgCode_), active(active_), savePrimary(active_) { init(name_, daughters_, daughterTrackSigns_); } - HyperNucleus(std::string name_, int pdgCode_, bool active_, int hypDaughter, std::vector daughters_, std::vector daughterTrackSigns_) : pdgCode(pdgCode_), active(active_) + HyperNucleus(std::string name_, int pdgCode_, bool active_, int hypDaughter, std::vector daughters_, std::vector daughterTrackSigns_) : pdgCode(pdgCode_), active(active_), savePrimary(active_) { daughters.push_back(hypDaughter); init(name_, daughters_, daughterTrackSigns_); @@ -213,16 +218,22 @@ struct HyperNucleus { struct DaughterKf { int64_t daughterTrackId; - int hypNucId; + int species, hypNucId; KFParticle daughterKfp; - float dcaToPv, dcaToPvXY, dcaToPvZ; - DaughterKf(int64_t daughterTrackId_, KFParticle daughterKfp_, std::vector vtx) : daughterTrackId(daughterTrackId_), hypNucId(-1), daughterKfp(daughterKfp_) + float dcaToPv, dcaToPvXY, dcaToPvZ, tpcNsigma, tpcNsigmaNLP, tpcNsigmaNHP; + bool active; + std::vector vtx; + DaughterKf(int species_, int64_t daughterTrackId_, std::vector vtx_, float tpcNsigma_, float tpcNsigmaNLP_, float tpcNsigmaNHP_) : daughterTrackId(daughterTrackId_), species(species_), hypNucId(-1), tpcNsigma(tpcNsigma_), tpcNsigmaNLP(tpcNsigmaNLP_), tpcNsigmaNHP(tpcNsigmaNHP_), vtx(vtx_) {} + DaughterKf(int species_, KFParticle daughterKfp_, int hypNucId_) : daughterTrackId(-999), species(species_), hypNucId(hypNucId_), daughterKfp(daughterKfp_), dcaToPv(-999), dcaToPvXY(-999), dcaToPvZ(-999) {} + void addKfp(KFParticle daughterKfp_) { + daughterKfp = daughterKfp_; dcaToPvXY = daughterKfp.GetDistanceFromVertexXY(&vtx[0]); dcaToPv = daughterKfp.GetDistanceFromVertex(&vtx[0]); dcaToPvZ = std::sqrt(dcaToPv * dcaToPv - dcaToPvXY * dcaToPvXY); } - DaughterKf(KFParticle daughterKfp_, int hypNucId_) : daughterTrackId(-999), hypNucId(hypNucId_), daughterKfp(daughterKfp_), dcaToPv(-999), dcaToPvXY(-999), dcaToPvZ(-999) {} + + bool isTrack() { return daughterTrackId >= 0; } }; // struct DaughterKf struct HyperNucCandidate { @@ -325,7 +336,7 @@ struct HyperNucCandidate { } void calcDcaToVtx(KFPVertex& vtx) { - if (devToPvXY != 999) + if (devToPvXY != 999) // o2-linter: disable=magic-number (To be checked) return; devToPvXY = kfp.GetDeviationFromVertexXY(vtx); dcaToPvXY = kfp.GetDistanceFromVertexXY(vtx); @@ -338,11 +349,23 @@ struct HyperNucCandidate { dcaToVtxZ = getDcaMotherToVtxZ(cand.recoSV); } float getSubDaughterMass(int d1, int d2) + { + return calcSubDaughterMass(daughters.at(d1)->daughterKfp, daughters.at(d2)->daughterKfp); + } + float getSubDaughterMassCascade(int d1, int d2) + { + if (!isCascade()) { + LOGF(warning, "Primary hypernucleus has no hypernucleus daughter!"); + return -999; + } + return calcSubDaughterMass(daughters.at(d1)->daughterKfp, hypNucDaughter->daughters.at(d2)->daughterKfp); + } + float calcSubDaughterMass(KFParticle d1, KFParticle d2) { KFParticle subDaughter; subDaughter.SetConstructMethod(2); - subDaughter.AddDaughter(daughters.at(d1)->daughterKfp); - subDaughter.AddDaughter(daughters.at(d2)->daughterKfp); + subDaughter.AddDaughter(d1); + subDaughter.AddDaughter(d2); subDaughter.TransportToDecayVertex(); return subDaughter.GetMass(); } @@ -363,6 +386,14 @@ struct IndexPairs { } return false; } + bool hasIndex(int64_t a) + { + for (const auto& pair : pairs) { + if (pair.first == a) + return true; + } + return false; + } }; // struct IndexPairs struct McCollInfo { @@ -419,6 +450,12 @@ struct HypKfRecoTask { Configurable> cfgPreSelectionsSecondaries{"cfgPreSelectionsSecondaries", {preSelectionsSecondaries[0], nHyperNuclei, nSelSec, hyperNucNames, preSelectionSecNames}, "selection criteria for secondary hypernuclei"}; Configurable> cfgPreSelectionsCascades{"cfgPreSelectionsCascades", {preSelectionsCascades[0], nCascades, nSelCas, cascadeNames, preSelectionCascadeNames}, "selection criteria for cascade hypernuclei"}; + // TPC PID Response + bool usePidResponse; + o2::pid::tpc::Response* response; + std::map metadata; + std::array betheParams; + // CCDB Service ccdb; Configurable bField{"bField", -999, "bz field, -999 is automatic"}; @@ -427,10 +464,10 @@ struct HypKfRecoTask { Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; - Configurable pidPath{"pidPath", "", "Path to the PID response object"}; + Configurable pidPath{"pidPath", "Analysis/PID/TPC/Response", "Path to the PID response object"}; + std::vector activePdgs; std::vector daughterParticles; - std::vector> foundDaughters; std::vector> foundDaughterKfs, hypNucDaughterKfs; std::vector> singleHyperNucCandidates, cascadeHyperNucCandidates; std::vector singleHyperNuclei, cascadeHyperNuclei; @@ -438,7 +475,7 @@ struct HypKfRecoTask { std::vector mcCollInfos; IndexPairs trackIndices, mcPartIndices; KFPVertex kfPrimVtx; - bool collHasCandidate, collHasMcTrueCandidate, collPassedEvSel, activeCascade; + bool collHasCandidate, collHasMcTrueCandidate, collPassedEvSel, activeCascade, isMC; int64_t mcCollTableIndex; int mRunNumber, occupancy; float dBz; @@ -447,6 +484,7 @@ struct HypKfRecoTask { void init(InitContext const&) { + isMC = false; mRunNumber = 0; dBz = 0; rand.SetSeed(0); @@ -456,18 +494,37 @@ struct HypKfRecoTask { ccdb->setLocalObjectValidityChecking(); ccdb->setFatalWhenNull(false); - for (int i = 0; i < nDaughterParticles; i++) { // create daughterparticles + usePidResponse = false; + for (unsigned int i = 0; i < nDaughterParticles; i++) { // create daughterparticles daughterParticles.push_back(DaughterParticle(particleNames.at(i), particlePdgCodes.at(i), particleMasses.at(i), particleCharge.at(i), cfgBetheBlochParams)); + if (cfgTrackPIDsettings->get(i, "useBBparams") == 2 || cfgTrackPIDsettings->get(i, "useBBparams") == 0) // o2-linter: disable=magic-number (To be checked) + usePidResponse = true; } + for (unsigned int i = 0; i < nHyperNuclei; i++) { // create hypernuclei - singleHyperNuclei.push_back(HyperNucleus(hyperNucNames.at(i), cfgHyperNucPdg->get(i, 0u), cfgHyperNucsActive->get(i, 0u), getDaughterVec(i, cfgHyperNucDaughters), getDaughterSignVec(i, cfgHyperNucSigns))); + auto active = cfgHyperNucsActive->get(i, 0u); + auto pdg = cfgHyperNucPdg->get(i, 0u); + singleHyperNuclei.push_back(HyperNucleus(hyperNucNames.at(i), pdg, active, getDaughterVec(i, cfgHyperNucDaughters), getDaughterSignVec(i, cfgHyperNucSigns))); + if (active) + activePdgs.push_back(pdg); } + activeCascade = false; for (unsigned int i = 0; i < nCascades; i++) { // create cascades - cascadeHyperNuclei.push_back(HyperNucleus(cascadeNames.at(i), cfgCascadesPdg->get(i, 0u), cfgCascadesActive->get(i, 0u), getHypDaughterVec(i, cfgCascadeHypDaughter), getDaughterVec(i, cfgCascadeDaughters), getDaughterSignVec(i, cfgCascadeSigns))); - if (cfgCascadesActive->get(i, 0u)) + auto active = cfgCascadesActive->get(i, 0u); + auto pdg = cfgCascadesPdg->get(i, 0u); + auto hypDaughter = getHypDaughterVec(i, cfgCascadeHypDaughter); + cascadeHyperNuclei.push_back(HyperNucleus(cascadeNames.at(i), pdg, active, hypDaughter, getDaughterVec(i, cfgCascadeDaughters), getDaughterSignVec(i, cfgCascadeSigns))); + if (active) { + activePdgs.push_back(pdg); + if (!singleHyperNuclei.at(hypDaughter).active) { + singleHyperNuclei.at(hypDaughter).active = true; + activePdgs.push_back(singleHyperNuclei.at(hypDaughter).pdgCode); + } activeCascade = true; + } } + // define histogram axes const AxisSpec axisMagField{10, -10., 10., "magnetic field"}; const AxisSpec axisNev{3, 0., 3., "Number of events"}; @@ -506,7 +563,7 @@ struct HypKfRecoTask { } //---------------------------------------------------------------------------------------------------------------- - void findDaughterParticles(aod::TrackAssoc const& tracksByColl, TracksFull const& tracks) + void findDaughterParticles(aod::TrackAssoc const& tracksByColl, TracksFull const& tracks, CollisionsFull::iterator const& coll) { // track loop, store daughter candidates in std::vector for (const auto& trackId : tracksByColl) { @@ -525,63 +582,69 @@ struct HypKfRecoTask { continue; if (track.itsChi2NCl() > cfgTrackPIDsettings->get(i, "maxITSchi2")) continue; - if (std::abs(getTPCnSigma(track, daughterParticles.at(i))) > cfgTrackPIDsettings->get(i, "maxTPCnSigma")) + if (getRigidity(track) < cfgTrackPIDsettings->get(i, "minRigidity") || getRigidity(track) > cfgTrackPIDsettings->get(i, "maxRigidity")) + continue; + float tpcNsigma = getTPCnSigma(track, coll, daughterParticles.at(i)); + if (std::abs(tpcNsigma) > cfgTrackPIDsettings->get(i, "maxTPCnSigma")) continue; filldedx(track, i); if (getMeanItsClsSize(track) < cfgTrackPIDsettings->get(i, "minITSclsSize")) continue; if (getMeanItsClsSize(track) > cfgTrackPIDsettings->get(i, "maxITSclsSize")) continue; - if (getRigidity(track) < cfgTrackPIDsettings->get(i, "minRigidity") || getRigidity(track) > cfgTrackPIDsettings->get(i, "maxRigidity")) - continue; if (cfgTrackPIDsettings->get(i, "TOFrequiredabove") >= 0 && getRigidity(track) > cfgTrackPIDsettings->get(i, "TOFrequiredabove") && (track.mass() < cfgTrackPIDsettings->get(i, "minTOFmass") || track.mass() > cfgTrackPIDsettings->get(i, "maxTOFmass"))) continue; - foundDaughters.at(i).push_back(track.globalIndex()); + float tpcNsigmaNHP = (i == kAlpha ? -999 : getTPCnSigma(track, coll, daughterParticles.at(i + 1))); + float tpcNsigmaNLP = (i == kPion ? 999 : getTPCnSigma(track, coll, daughterParticles.at(i - 1))); + foundDaughterKfs.at(i).push_back(DaughterKf(i, track.globalIndex(), primVtx, tpcNsigma, tpcNsigmaNLP, tpcNsigmaNHP)); } } // track loop } - //---------------------------------------------------------------------------------------------------------------- - void checkMCTrueTracks(aod::McTrackLabels const& trackLabels, aod::McParticles const&) + + void checkMCTrueTracks(aod::McTrackLabels const& trackLabels, aod::McParticles const&, TracksFull const& tracks, CollisionsFull::iterator const& coll) { - std::vector activePdgs; - std::vector*> hypNucVectors = {&singleHyperNuclei, &cascadeHyperNuclei}; - for (int vec = 0; vec < 2; vec++) { - for (size_t hyperNucIter = 0; hyperNucIter < hypNucVectors.at(vec)->size(); hyperNucIter++) { - HyperNucleus* hyperNuc = &(hypNucVectors.at(vec)->at(hyperNucIter)); - if (!hyperNuc->active) - continue; - activePdgs.push_back(std::abs(hyperNuc->pdgCode)); - } - } for (int i = 0; i < nDaughterParticles; i++) { - auto& daughterVec = foundDaughters.at(i); + auto& daughterVec = foundDaughterKfs.at(i); if (!daughterVec.size()) continue; for (auto it = daughterVec.end() - 1; it >= daughterVec.begin(); it--) { - const auto& mcLab = trackLabels.rawIteratorAt(*it); + const auto& mcLab = trackLabels.rawIteratorAt(it->daughterTrackId); if (!mcLab.has_mcParticle()) { daughterVec.erase(it); continue; } const auto& mcPart = mcLab.mcParticle_as(); - if (std::abs(mcPart.pdgCode()) != daughterParticles.at(i).pdgCode) { - daughterVec.erase(it); - continue; - } - if (!mcPart.has_mothers()) { - daughterVec.erase(it); - continue; - } - bool isDaughter = false; - for (const auto& mother : mcPart.mothers_as()) { - if (std::find(activePdgs.begin(), activePdgs.end(), std::abs(mother.pdgCode())) != activePdgs.end()) { - isDaughter = true; + if (cfgSaveOnlyMcTrue) { + if (std::abs(mcPart.pdgCode()) != daughterParticles.at(i).pdgCode) { + daughterVec.erase(it); + continue; + } + if (!mcPart.has_mothers()) { + daughterVec.erase(it); + continue; + } + bool isDaughter = false; + for (const auto& mother : mcPart.mothers_as()) { + if (std::find(activePdgs.begin(), activePdgs.end(), std::abs(mother.pdgCode())) != activePdgs.end()) { + isDaughter = true; + } + } + if (!isDaughter) { + daughterVec.erase(it); + continue; } } - if (!isDaughter) { - daughterVec.erase(it); - continue; + if (cfgTrackPIDsettings->get(i, "useBBparams") == 0) { + const auto& trk = tracks.rawIteratorAt(it->daughterTrackId); + const auto tpcNsigmaMC = getTPCnSigmaMC(trk, coll, daughterParticles.at(i), daughterParticles.at(i)); + if (std::abs(tpcNsigmaMC) <= cfgTrackPIDsettings->get(i, "maxTPCnSigma")) { + it->tpcNsigma = tpcNsigmaMC; + it->tpcNsigmaNHP = (i == kAlpha ? -999 : getTPCnSigmaMC(trk, coll, daughterParticles.at(i), daughterParticles.at(i + 1))); + it->tpcNsigmaNLP = (i == kPion ? 999 : getTPCnSigmaMC(trk, coll, daughterParticles.at(i), daughterParticles.at(i - 1))); + } else { + daughterVec.erase(it); + } } } } @@ -589,33 +652,42 @@ struct HypKfRecoTask { //---------------------------------------------------------------------------------------------------------------- void createKFDaughters(TracksFull const& tracks) { + for (size_t daughterCount = 0; daughterCount < daughterParticles.size(); daughterCount++) { + daughterParticles.at(daughterCount).active = false; + } std::vector*> hypNucVectors = {&singleHyperNuclei, &cascadeHyperNuclei}; - for (size_t vec = 0; vec < 2; vec++) { + bool singleHypNucActive = false; + for (size_t vec = 0; vec < hypNucVectors.size(); vec++) { for (const auto& hyperNuc : *(hypNucVectors.at(vec))) { if (!hyperNuc.active) continue; for (size_t i = vec; i < hyperNuc.daughters.size(); i++) { - if (foundDaughters.at(hyperNuc.daughters.at(i)).size() > 0) + if (foundDaughterKfs.at(hyperNuc.daughters.at(i)).size() > 0) daughterParticles.at(hyperNuc.daughters.at(i)).active = true; else break; + if (i == hyperNuc.daughters.size() - 1) + singleHypNucActive = true; } } + if (!singleHypNucActive) + break; } + for (size_t daughterCount = 0; daughterCount < daughterParticles.size(); daughterCount++) { const auto& daughterParticle = daughterParticles.at(daughterCount); - if (!daughterParticle.active) + if (!daughterParticle.active) { + foundDaughterKfs.at(daughterCount).clear(); continue; + } const auto& daughterMass = daughterParticle.mass; const auto& daughterCharge = daughterParticle.charge; - for (const auto& daughterId : foundDaughters.at(daughterCount)) { - const auto& daughterTrack = tracks.rawIteratorAt(daughterId); - DaughterKf daughter(daughterId, createKFParticle(daughterTrack, daughterMass, daughterCharge), primVtx); - if (std::abs(daughter.dcaToPvXY) < cfgTrackPIDsettings->get(daughterCount, "minDcaToPvXY")) - continue; - if (std::abs(daughter.dcaToPvZ) < cfgTrackPIDsettings->get(daughterCount, "minDcaToPvZ")) - continue; - foundDaughterKfs.at(daughterCount).push_back(daughter); + auto& daughterVec = foundDaughterKfs.at(daughterCount); + for (auto it = daughterVec.end() - 1; it >= daughterVec.begin(); it--) { + const auto& daughterTrack = tracks.rawIteratorAt(it->daughterTrackId); + it->addKfp(createKFParticle(daughterTrack, daughterMass, daughterCharge)); + if (std::abs(it->dcaToPvXY) < cfgTrackPIDsettings->get(daughterCount, "minDcaToPvXY") || std::abs(it->dcaToPvZ) < cfgTrackPIDsettings->get(daughterCount, "minDcaToPvZ")) + daughterVec.erase(it); } } } @@ -685,7 +757,7 @@ struct HypKfRecoTask { candidate.calcDcaToVtx(kfPrimVtx); candidate.isSecondaryCandidate = true; } - if (candidate.isPrimaryCandidate || candidate.isSecondaryCandidate) + if ((candidate.isPrimaryCandidate && hyperNuc->savePrimary) || (candidate.isSecondaryCandidate && activeCascade)) singleHyperNucCandidates.at(hyperNucIter).push_back(candidate); } } @@ -711,7 +783,7 @@ struct HypKfRecoTask { for (int64_t i = 0; i < static_cast(nHypNucDaughters); i++) { if (singleHyperNucCandidates.at(hyperNuc->daughters.at(0)).at(i).isSecondaryCandidate) { auto hypNucDaughter = &(singleHyperNucCandidates.at(hyperNuc->daughters.at(0)).at(i)); - hypNucDaughterKfs.at(hyperNucIter).push_back(DaughterKf(hypNucDaughter->kfp, i)); + hypNucDaughterKfs.at(hyperNucIter).push_back(DaughterKf(hyperNuc->daughters.at(0), hypNucDaughter->kfp, i)); } } int nCombinations = hypNucDaughterKfs.at(hyperNucIter).size(); @@ -796,9 +868,8 @@ struct HypKfRecoTask { HyperNucleus* hyperNuc = &(hypNucVectors.at(vec)->at(hyperNucIter)); if (!hyperNuc->active) continue; - for (auto& hypCand : candidateVector->at(hyperNucIter)) { // o2-linter: disable=[const-ref-in-for-loop] + for (auto& hypCand : candidateVector->at(hyperNucIter)) { // o2-linter: disable=[const-ref-in-for-loop] (Object is non const and modified in loop) std::vector motherIds; - int daughterCount = 0; if (hypCand.isCascade()) { if (!hypCand.hypNucDaughter->mcTrue) continue; @@ -811,16 +882,15 @@ struct HypKfRecoTask { break; } } - daughterCount++; } for (const auto& daughter : hypCand.daughters) { - if (daughter->daughterTrackId < 0) + if (!daughter->isTrack()) continue; const auto& mcLab = trackLabels.rawIteratorAt(daughter->daughterTrackId); if (!mcLab.has_mcParticle()) continue; const auto& mcPart = mcLab.mcParticle_as(); - if (std::abs(mcPart.pdgCode()) != daughterParticles.at(hyperNuc->daughters.at(daughterCount++)).pdgCode) + if (std::abs(mcPart.pdgCode()) != daughterParticles.at(daughter->species).pdgCode) continue; if (!mcPart.has_mothers()) continue; @@ -840,6 +910,8 @@ struct HypKfRecoTask { for (auto iter = motherIds.begin(); iter != motherIds.end() - 1; iter++) if (*iter != *(iter + 1)) hypCand.mcTrue = false; + if (!mcPartIndices.hasIndex(motherIds.front())) + hypCand.mcTrue = false; if (hypCand.mcTrue) { hypCand.mcParticleId = motherIds.front(); collHasMcTrueCandidate = true; @@ -858,49 +930,39 @@ struct HypKfRecoTask { outputCollisionTable( collPassedEvSel, mcCollTableIndex, primVtx.at(0), primVtx.at(1), primVtx.at(2), - cents.at(0), cents.at(1), cents.at(2), occupancy); + cents.at(0), cents.at(1), cents.at(2), occupancy, mRunNumber); std::vector*> hypNucVectors = {&singleHyperNuclei, &cascadeHyperNuclei}; std::vector>*> candidateVectors = {&singleHyperNucCandidates, &cascadeHyperNucCandidates}; - for (int vec = 0; vec < 2; vec++) { + for (unsigned int vec = 0; vec < candidateVectors.size(); vec++) { auto candidateVector = candidateVectors.at(vec); for (size_t hyperNucIter = 0; hyperNucIter < hypNucVectors.at(vec)->size(); hyperNucIter++) { HyperNucleus* hyperNuc = &(hypNucVectors.at(vec)->at(hyperNucIter)); if (!hyperNuc->active) continue; - for (auto& hypCand : candidateVector->at(hyperNucIter)) { // o2-linter: disable=[const-ref-in-for-loop] + for (auto& hypCand : candidateVector->at(hyperNucIter)) { // o2-linter: disable=const-ref-in-for-loop (Object is non const and modified in loop) if (!hypCand.isPrimaryCandidate && !hypCand.isUsedSecondary && !hypCand.isCascade()) continue; if (saveOnlyMcTrue && !hypCand.mcTrue && !hypCand.isCascade()) continue; hInvMass[vec * nHyperNuclei + hyperNucIter]->Fill(hypCand.mass); std::vector vecDaugtherTracks, vecAddons, vecSubDaughters; - int daughterCount = 0; for (const auto& daughter : hypCand.daughters) { - const auto& daughterTrackId = daughter->daughterTrackId; - if (daughterTrackId < 0) + if (!daughter->isTrack()) continue; + const auto& daughterTrackId = daughter->daughterTrackId; int trackTableId; if (!trackIndices.getIndex(daughterTrackId, trackTableId)) { - auto daught = hyperNuc->daughters.at(daughterCount); const auto& track = tracks.rawIteratorAt(daughterTrackId); outputTrackTable( - hyperNuc->daughters.at(daughterCount) * track.sign(), - track.pt(), track.eta(), track.phi(), - daughter->dcaToPvXY, daughter->dcaToPvZ, - track.tpcNClsFound(), track.tpcChi2NCl(), - track.itsClusterSizes(), track.itsChi2NCl(), - getRigidity(track), track.tpcSignal(), getTPCnSigma(track, daughterParticles.at(daught)), - daught == kAlpha ? -999 : getTPCnSigma(track, daughterParticles.at(daught + 1)), - daught == kPion ? 999 : getTPCnSigma(track, daughterParticles.at(daught - 1)), - track.mass(), - track.isPVContributor()); + daughter->species * track.sign(), track.pt(), track.eta(), track.phi(), daughter->dcaToPvXY, daughter->dcaToPvZ, track.tpcNClsFound(), track.tpcChi2NCl(), + track.itsClusterSizes(), track.itsChi2NCl(), getRigidity(track), track.tpcSignal(), daughter->tpcNsigma, daughter->tpcNsigmaNHP, daughter->tpcNsigmaNLP, + track.mass(), track.isPVContributor()); trackTableId = outputTrackTable.lastIndex(); trackIndices.add(daughterTrackId, trackTableId); } vecDaugtherTracks.push_back(trackTableId); - daughterCount++; } for (int i = 0; i < hypCand.getNdaughters(); i++) { std::vector& posMom = hypCand.daughterPosMoms.at(i); @@ -908,7 +970,7 @@ struct HypKfRecoTask { posMom.at(0), posMom.at(1), posMom.at(2), posMom.at(3), posMom.at(4), posMom.at(5)); vecAddons.push_back(outputDaughterAddonTable.lastIndex()); } - if (hypCand.getNdaughters() > 2) { + if (hypCand.getNdaughters() > 2) { // o2-linter: disable=magic-number (To be checked) for (int i = 0; i < hypCand.getNdaughters(); i++) { for (int j = i + 1; j < hypCand.getNdaughters(); j++) { outputSubDaughterTable(hypCand.getSubDaughterMass(i, j)); @@ -916,18 +978,23 @@ struct HypKfRecoTask { } } } + if (hypCand.isCascade()) { + for (int i = 1; i < hypCand.getNdaughters(); i++) { + for (int j = 0; j < hypCand.hypNucDaughter->getNdaughters(); j++) { + outputSubDaughterTable(hypCand.getSubDaughterMassCascade(i, j)); + vecSubDaughters.push_back(outputSubDaughterTable.lastIndex()); + } + } + } hypCand.kfp.TransportToDecayVertex(); int mcPartTableId; outputHypNucTable( mcPartIndices.getIndex(hypCand.mcParticleId, mcPartTableId) ? mcPartTableId : -1, outputCollisionTable.lastIndex(), vecDaugtherTracks, vecAddons, hypCand.getDaughterTableId(), vecSubDaughters, - (vec * nHyperNuclei + hyperNucIter + 1) * hypCand.getSign(), - hypCand.isPrimaryCandidate, hypCand.mass, - hypCand.px, hypCand.py, hypCand.pz, - hypCand.dcaToPvXY, hypCand.dcaToPvZ, hypCand.devToPvXY, - hypCand.dcaToVtxXY, hypCand.dcaToVtxZ, hypCand.chi2, - hypCand.recoSV.at(0), hypCand.recoSV.at(1), hypCand.recoSV.at(2)); + (vec * nHyperNuclei + hyperNucIter + 1) * hypCand.getSign(), hypCand.isPrimaryCandidate, hypCand.mass, + hypCand.px, hypCand.py, hypCand.pz, hypCand.dcaToPvXY, hypCand.dcaToPvZ, hypCand.devToPvXY, + hypCand.dcaToVtxXY, hypCand.dcaToVtxZ, hypCand.chi2, hypCand.recoSV.at(0), hypCand.recoSV.at(1), hypCand.recoSV.at(2)); hypCand.tableId = outputHypNucTable.lastIndex(); } } @@ -935,21 +1002,23 @@ struct HypKfRecoTask { } //---------------------------------------------------------------------------------------------------------------- - void processMC(CollisionsFullMC const& collisions, aod::McCollisions const& mcColls, TracksFull const& tracks, aod::BCsWithTimestamps const&, aod::McParticles const& particlesMC, aod::McTrackLabels const& trackLabelsMC, aod::McCollisionLabels const& collLabels, aod::TrackAssoc const& tracksColl) + void processMC(CollisionsFullMC const& collisions, aod::McCollisions const& mcColls, TracksFull const& tracks, aod::BCsWithTimestamps const&, aod::McParticles const& particlesMC, aod::McTrackLabels const& trackLabelsMC, aod::McCollisionLabels const& collLabels, aod::TrackAssoc const& tracksColl, CollisionsFull const& colls) { - + isMC = true; mcCollInfos.clear(); mcCollInfos.resize(mcColls.size()); mcPartIndices.clear(); for (const auto& collision : collisions) { if (!collision.has_mcCollision()) continue; - if (collision.sel8() && std::abs(collision.posZ()) < 10) + if (collision.sel8() && std::abs(collision.posZ()) < 10) // o2-linter: disable=magic-number (To be checked) mcCollInfos.at(collision.mcCollisionId()).passedEvSel = true; } std::vector*> hypNucVectors = {&singleHyperNuclei, &cascadeHyperNuclei}; for (const auto& mcPart : particlesMC) { - for (int vec = 0; vec < 2; vec++) { + if (!mcCollInfos.at(mcPart.mcCollisionId()).passedEvSel) + continue; + for (unsigned int vec = 0; vec < hypNucVectors.size(); vec++) { for (size_t hyperNucIter = 0; hyperNucIter < hypNucVectors.at(vec)->size(); hyperNucIter++) { HyperNucleus* hyperNuc = &(hypNucVectors.at(vec)->at(hyperNucIter)); if (!hyperNuc->active) @@ -958,11 +1027,7 @@ struct HypKfRecoTask { continue; bool isDecayMode = false; float svx, svy, svz; - int daughterPdg; - if (vec == 0) - daughterPdg = daughterParticles.at(hyperNuc->daughters.at(0)).pdgCode; - else - daughterPdg = singleHyperNuclei.at(hyperNuc->daughters.at(0)).pdgCode; + int daughterPdg = vec ? singleHyperNuclei.at(hyperNuc->daughters.at(0)).pdgCode : daughterParticles.at(hyperNuc->daughters.at(0)).pdgCode; for (const auto& mcDaught : mcPart.daughters_as()) { if (std::abs(mcDaught.pdgCode()) == daughterPdg) { isDecayMode = true; @@ -999,11 +1064,14 @@ struct HypKfRecoTask { auto bc = collision.bc_as(); initCCDB(bc); initCollision(collision); + if (!collision.has_mcCollision() || !mcCollInfos.at(collision.mcCollisionId()).passedEvSel) + continue; + const uint64_t collIdx = collision.globalIndex(); auto tracksByColl = tracksColl.sliceBy(perCollision, collIdx); - findDaughterParticles(tracksByColl, tracks); - if (cfgSaveOnlyMcTrue) - checkMCTrueTracks(trackLabelsMC, particlesMC); + findDaughterParticles(tracksByColl, tracks, colls.rawIteratorAt(collision.globalIndex())); + if (cfgSaveOnlyMcTrue || usePidResponse) + checkMCTrueTracks(trackLabelsMC, particlesMC, tracks, colls.rawIteratorAt(collision.globalIndex())); createKFDaughters(tracks); createKFHypernuclei(tracks); createMCinfo(trackLabelsMC, collLabels, particlesMC, mcColls); @@ -1015,16 +1083,13 @@ struct HypKfRecoTask { if (cfgSaveOnlyMcTrue && !collHasMcTrueCandidate) continue; - mcCollTableIndex = -1; - if (collision.has_mcCollision()) { - mcCollTableIndex = mcCollInfos.at(collision.mcCollisionId()).tableIndex; - if (mcCollTableIndex < 0) { - outputMcCollisionTable( - mcCollInfos.at(collision.mcCollisionId()).passedEvSel, - collision.mcCollision().posX(), collision.mcCollision().posY(), collision.mcCollision().posZ()); - mcCollTableIndex = outputMcCollisionTable.lastIndex(); - mcCollInfos.at(collision.mcCollisionId()).tableIndex = mcCollTableIndex; - } + mcCollTableIndex = mcCollInfos.at(collision.mcCollisionId()).tableIndex; + if (mcCollTableIndex < 0) { + outputMcCollisionTable( + mcCollInfos.at(collision.mcCollisionId()).passedEvSel, + collision.mcCollision().posX(), collision.mcCollision().posY(), collision.mcCollision().posZ()); + mcCollTableIndex = outputMcCollisionTable.lastIndex(); + mcCollInfos.at(collision.mcCollisionId()).tableIndex = mcCollTableIndex; } fillTree(tracks, cfgSaveOnlyMcTrue); } @@ -1042,7 +1107,7 @@ struct HypKfRecoTask { continue; const uint64_t collIdx = collision.globalIndex(); auto tracksByColl = tracksColl.sliceBy(perCollision, collIdx); - findDaughterParticles(tracksByColl, tracks); + findDaughterParticles(tracksByColl, tracks, collision); createKFDaughters(tracks); createKFHypernuclei(tracks); createKFCascades(tracks); @@ -1065,7 +1130,7 @@ struct HypKfRecoTask { o2::parameters::GRPMagField* grpmag = 0x0; if (grpo) { o2::base::Propagator::initFieldFromGRP(grpo); - if (bField < -990) { + if (bField < -990) { // o2-linter: disable=magic-number (To be checked) // Fetch magnetic field from ccdb for current collision dBz = grpo->getNominalL3Field(); LOG(info) << "Retrieved GRP for timestamp " << run3grpTimestamp << " with magnetic field of " << dBz << " kZG"; @@ -1078,7 +1143,7 @@ struct HypKfRecoTask { LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for timestamp " << run3grpTimestamp; } o2::base::Propagator::initFieldFromGRP(grpmag); - if (bField < -990) { + if (bField < -990) { // o2-linter: disable=magic-number (To be checked) // Fetch magnetic field from ccdb for current collision dBz = std::lround(5.f * grpmag->getL3Current() / 30000.f); LOG(info) << "Retrieved GRP for timestamp " << run3grpTimestamp << " with magnetic field of " << dBz << " kZG"; @@ -1088,13 +1153,35 @@ struct HypKfRecoTask { } mRunNumber = bc.runNumber(); KFParticle::SetField(dBz); + + // PID response + if (!usePidResponse) + return; + if (metadataInfo.isFullyDefined()) { + metadata["RecoPassName"] = metadataInfo.get("RecoPassName"); + LOGP(info, "Automatically setting reco pass for TPC Response to {} from AO2D", metadata["RecoPassName"]); + } else { + LOG(info) << "Setting reco pass for TPC response to default name"; + metadata["RecoPassName"] = "apass5"; + } + const std::string path = pidPath.value; + ccdb->setTimestamp(run3grpTimestamp); + response = ccdb->getSpecific(path, run3grpTimestamp, metadata); + if (!response) { + LOGF(warning, "Unable to find TPC parametrisation for specified pass name - falling back to latest object"); + response = ccdb->getForTimeStamp(path, run3grpTimestamp); + if (!response) { + LOGF(fatal, "Unable to find any TPC object corresponding to timestamp {}!", run3grpTimestamp); + } + } + LOG(info) << "Successfully retrieved TPC PID object from CCDB for timestamp " << run3grpTimestamp << ", recoPass " << metadata["RecoPassName"]; + response->PrintAll(); + betheParams = response->GetBetheBlochParams(); } //---------------------------------------------------------------------------------------------------------------- template void initCollision(const T& collision) { - foundDaughters.clear(); - foundDaughters.resize(nDaughterParticles); foundDaughterKfs.clear(); foundDaughterKfs.resize(nDaughterParticles); hypNucDaughterKfs.clear(); @@ -1108,7 +1195,7 @@ struct HypKfRecoTask { collHasMcTrueCandidate = false; histos.fill(HIST("histMagField"), dBz); histos.fill(HIST("histNev"), 0.5); - collPassedEvSel = collision.sel8() && std::abs(collision.posZ()) < 10; + collPassedEvSel = collision.sel8() && std::abs(collision.posZ()) < 10; // o2-linter: disable=magic-number (To be checked) occupancy = collision.trackOccupancyInTimeRange(); if (collPassedEvSel) { histos.fill(HIST("histNev"), 1.5); @@ -1129,45 +1216,63 @@ struct HypKfRecoTask { { const float rigidity = getRigidity(track); hDeDx[2 * species]->Fill(track.sign() * rigidity, track.tpcSignal()); - if (track.tpcNClsFound() < 100 || track.itsNCls() < 2) + if (track.tpcNClsFound() < 100 || track.itsNCls() < 2) // o2-linter: disable=magic-number (To be checked) return; hDeDx[2 * species + 1]->Fill(track.sign() * rigidity, track.tpcSignal()); } //---------------------------------------------------------------------------------------------------------------- - template - float getTPCnSigma(T const& track, DaughterParticle const& particle) + template + float getTPCnSigma(T const& track, C const& coll, DaughterParticle& particle) { const float rigidity = getRigidity(track); if (!track.hasTPC()) return -999; + float mMip = 1, chargeFactor = 1; + float* parBB; - if (particle.name == "pion" && cfgTrackPIDsettings->get("pion", "useBBparams") < 1) - return cfgTrackPIDsettings->get("pion", "useBBparams") == 0 ? track.tpcNSigmaPi() : 0; - if (particle.name == "proton" && cfgTrackPIDsettings->get("proton", "useBBparams") < 1) - return cfgTrackPIDsettings->get("proton", "useBBparams") == 0 ? track.tpcNSigmaPr() : 0; - if (particle.name == "deuteron" && cfgTrackPIDsettings->get("deuteron", "useBBparams") < 1) - return cfgTrackPIDsettings->get("deuteron", "useBBparams") == 0 ? track.tpcNSigmaDe() : 0; - if (particle.name == "triton" && cfgTrackPIDsettings->get("triton", "useBBparams") < 1) - return cfgTrackPIDsettings->get("triton", "useBBparams") == 0 ? track.tpcNSigmaTr() : 0; - if (particle.name == "helion" && cfgTrackPIDsettings->get("helion", "useBBparams") < 1) - return cfgTrackPIDsettings->get("helion", "useBBparams") == 0 ? track.tpcNSigmaHe() : 0; - if (particle.name == "alpha" && cfgTrackPIDsettings->get("alpha", "useBBparams") < 1) - return cfgTrackPIDsettings->get("alpha", "useBBparams") == 0 ? track.tpcNSigmaAl() : 0; - - double expBethe{tpc::BetheBlochAleph(static_cast(particle.charge * rigidity / particle.mass), particle.betheParams[0], particle.betheParams[1], particle.betheParams[2], particle.betheParams[3], particle.betheParams[4])}; + switch (static_cast(cfgTrackPIDsettings->get(particle.name, "useBBparams"))) { + case -1: + return 0; + case 0: + return isMC ? 0 : response->GetNumberOfSigma(coll, track, particle.getCentralPIDIndex()); + case 1: + parBB = &particle.betheParams[0]; + break; + case 2: + mMip = response->GetMIP(); + chargeFactor = std::pow(particle.charge, response->GetChargeFactor()); + parBB = &betheParams[0]; + break; + default: + return -999; + } + double expBethe{mMip * chargeFactor * o2::tpc::BetheBlochAleph(static_cast(particle.charge * rigidity / particle.mass), parBB[0], parBB[1], parBB[2], parBB[3], parBB[4])}; double expSigma{expBethe * particle.resolution}; float sigmaTPC = static_cast((track.tpcSignal() - expBethe) / expSigma); return sigmaTPC; } //---------------------------------------------------------------------------------------------------------------- + + template + float getTPCnSigmaMC(T const& trk, C const& coll, DaughterParticle& particle1, DaughterParticle& particle2) + { + const float pidval1 = particle1.getCentralPIDIndex(); + const float pidval2 = particle2.getCentralPIDIndex(); + const auto expSignal = response->GetExpectedSignal(trk, pidval2); + const auto expSigma = response->GetExpectedSigma(coll, trk, pidval2); + const auto mcTunedTPCSignal = gRandom->Gaus(expSignal, expSigma); + return response->GetNumberOfSigmaMCTuned(coll, trk, pidval1, mcTunedTPCSignal); + } + //---------------------------------------------------------------------------------------------------------------- + template float getMeanItsClsSize(T const& track) { int sum = 0, n = 0; - for (int i = 0; i < 8; i++) { - sum += (track.itsClusterSizes() >> (4 * i) & 15); - if (track.itsClusterSizes() >> (4 * i) & 15) + for (int i = 0; i < 0x08; i++) { + sum += (track.itsClusterSizes() >> (0x04 * i) & 0x0f); + if (track.itsClusterSizes() >> (0x04 * i) & 0x0f) n++; } return n > 0 ? static_cast(sum) / n : 0.f; @@ -1192,7 +1297,7 @@ struct HypKfRecoTask { trackparCov.getXYZGlo(fP); trackparCov.getPxPyPzGlo(fM); float fPM[6]; - for (int i = 0; i < 3; i++) { + for (int i = 0; i < 0x03; i++) { fPM[i] = fP[i]; fPM[i + 3] = fM[i] * std::abs(charge); } @@ -1228,7 +1333,7 @@ struct HypKfRecoTask { std::vector getDaughterVec(unsigned int hypNuc, LabeledArray cfg) { std::vector vec; - for (unsigned int i = 0; i < 4; i++) { + for (unsigned int i = 0; i < 0x04; i++) { std::string daughter = cfg.get(hypNuc, i); if (std::find(particleNames.begin(), particleNames.end(), daughter) == particleNames.end()) break; @@ -1241,7 +1346,7 @@ struct HypKfRecoTask { std::vector getDaughterSignVec(unsigned int hypNuc, LabeledArray cfg) { std::vector vec; - for (unsigned int i = 0; i < 4; i++) { + for (unsigned int i = 0; i < 0x04; i++) { std::string sign = cfg.get(hypNuc, i); if (sign != "+" && sign != "-") break; @@ -1256,6 +1361,7 @@ struct HypKfRecoTask { //---------------------------------------------------------------------------------------------------------------- WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { + metadataInfo.initMetadata(cfgc); // Parse AO2D metadata return WorkflowSpec{ adaptAnalysisTask(cfgc)}; } diff --git a/PWGLF/TableProducer/Nuspex/hypKfTreeCreator.cxx b/PWGLF/TableProducer/Nuspex/hypKfTreeCreator.cxx index da8316e3c8d..246a67f57d6 100644 --- a/PWGLF/TableProducer/Nuspex/hypKfTreeCreator.cxx +++ b/PWGLF/TableProducer/Nuspex/hypKfTreeCreator.cxx @@ -56,15 +56,15 @@ struct TrackProperties { }; struct HyperNucleus { - HyperNucleus() : pdgCode(0), isReconstructed(0), globalIndex(0), species(0), isPrimaryCandidate(0), isMatter(0), passedEvSel(0), isMatterMC(0), passedEvSelMC(0), isPhysicalPrimary(0), collisionMcTrue(0), mass(0), y(0), pt(0), ct(0), yGen(0), ptGen(0), ctGen(0), cpaPvGen(0), cpaPv(0), cpaSv(0), maxDcaTracks(0), maxDcaTracksSv(0), dcaToPvXY(0), dcaToPvZ(0), dcaToVtxXY(0), dcaToVtxZ(0), devToPvXY(0), chi2(0), pvx(0), pvy(0), pvz(0), svx(0), svy(0), svz(0), px(0), py(0), pz(0), pvxGen(0), pvyGen(0), pvzGen(0), svxGen(0), svyGen(0), svzGen(0), pxGen(0), pyGen(0), pzGen(0), nSingleDaughters(0), nCascadeDaughters(0), mcTrue(0), mcTrueVtx(0), mcPhysicalPrimary(0), hypNucDaughter(0) {} + HyperNucleus() : pdgCode(0), isReconstructed(0), globalIndex(0), species(0), speciesMC(0), isPrimaryCandidate(0), isMatter(0), isCascade(0), isCascadeMC(0), passedEvSel(0), isMatterMC(0), passedEvSelMC(0), isPhysicalPrimary(0), collisionMcTrue(0), mass(0), y(0), pt(0), ct(0), yGen(0), ptGen(0), ctGen(0), cpaPvGen(0), cpaPv(0), cpaSv(0), maxDcaTracks(0), maxDcaTracksSv(0), dcaToPvXY(0), dcaToPvZ(0), dcaToVtxXY(0), dcaToVtxZ(0), devToPvXY(0), chi2(0), pvx(0), pvy(0), pvz(0), svx(0), svy(0), svz(0), px(0), py(0), pz(0), pvxGen(0), pvyGen(0), pvzGen(0), svxGen(0), svyGen(0), svzGen(0), pxGen(0), pyGen(0), pzGen(0), nSingleDaughters(0), nCascadeDaughters(0), mcTrue(0), mcTrueVtx(0), mcPhysicalPrimary(0), hypNucDaughter(0) {} int pdgCode, isReconstructed, globalIndex; - uint8_t species; - bool isPrimaryCandidate, isMatter, passedEvSel, isMatterMC, passedEvSelMC, isPhysicalPrimary, collisionMcTrue; + uint8_t species, speciesMC; + bool isPrimaryCandidate, isMatter, isCascade, isCascadeMC, passedEvSel, isMatterMC, passedEvSelMC, isPhysicalPrimary, collisionMcTrue; float mass, y, pt, ct, yGen, ptGen, ctGen, cpaPvGen, cpaPv, cpaSv, maxDcaTracks, maxDcaTracksSv; float dcaToPvXY, dcaToPvZ, dcaToVtxXY, dcaToVtxZ, devToPvXY, chi2; float pvx, pvy, pvz, svx, svy, svz, px, py, pz; float pvxGen, pvyGen, pvzGen, svxGen, svyGen, svzGen, pxGen, pyGen, pzGen; - int nSingleDaughters, nCascadeDaughters, cent, occu; + int nSingleDaughters, nCascadeDaughters, cent, occu, runNumber; bool mcTrue, mcTrueVtx, mcPhysicalPrimary; std::vector daughterTracks; std::vector subDaughterMassVec; @@ -110,10 +110,12 @@ DECLARE_SOA_COLUMN(TvyGen, tvyGen, float); DECLARE_SOA_COLUMN(TvzGen, tvzGen, float); DECLARE_SOA_COLUMN(Centrality, centrality, int); DECLARE_SOA_COLUMN(Occupancy, occupancy, int); +DECLARE_SOA_COLUMN(RunNumber, runNumber, int); DECLARE_SOA_COLUMN(PassedEvSelMC, passedEvSelMC, bool); +DECLARE_SOA_COLUMN(SpeciesMC, speciesMC, int8_t); //! DECLARE_SOA_COLUMN(IsMatter, isMatter, bool); DECLARE_SOA_COLUMN(IsMatterGen, isMatterGen, bool); -DECLARE_SOA_COLUMN(IsReconstructed, isReconstructed, bool); +DECLARE_SOA_COLUMN(IsReconstructed, isReconstructed, int); DECLARE_SOA_COLUMN(CollMcTrue, collMcTrue, bool); DECLARE_SOA_COLUMN(D1X, d1X, float); DECLARE_SOA_COLUMN(D1Y, d1Y, float); @@ -263,15 +265,18 @@ DECLARE_SOA_COLUMN(Sd3IsPvContributor, sd3IsPvContributor, bool); DECLARE_SOA_COLUMN(Sd1sd2Mass, sd1sd2Mass, float); DECLARE_SOA_COLUMN(Sd1sd3Mass, sd1sd3Mass, float); DECLARE_SOA_COLUMN(Sd2sd3Mass, sd2sd3Mass, float); +DECLARE_SOA_COLUMN(D1sd1Mass, d1sd1Mass, float); +DECLARE_SOA_COLUMN(D1sd2Mass, d1sd2Mass, float); +DECLARE_SOA_COLUMN(D1sd3Mass, d1sd3Mass, float); } // namespace hypkftree -#define HYPKFGENBASE mcparticle::PdgCode, hypkftree::IsMatterGen, hypkftree::IsReconstructed, hykfmc::IsPhysicalPrimary, hypkftree::PassedEvSelMC, hypkftree::YGen, hypkftree::PtGen, hypkftree::CtGen +#define HYPKFGENBASE hypkftree::SpeciesMC, mcparticle::PdgCode, hypkftree::IsMatterGen, hypkftree::IsReconstructed, hykfmc::IsPhysicalPrimary, hypkftree::PassedEvSelMC, hypkftree::YGen, hypkftree::PtGen, hypkftree::CtGen #define HYPKFGENEXT hypkftree::CpaPvGen, hypkftree::PxGen, hypkftree::PyGen, hypkftree::PzGen, hypkftree::PvxGen, hypkftree::PvyGen, hypkftree::PvzGen, hypkftree::SvxGen, hypkftree::SvyGen, hypkftree::SvzGen #define HYPKFGENCAS hypkftree::TvxGen, hypkftree::TvyGen, hypkftree::TvzGen -#define HYPKFHYPNUC hykfmc::Species, hypkftree::IsMatter, hypkftree::Centrality, hypkftree::Occupancy, hykfmccoll::PassedEvSel, hykfhyp::Mass, hypkftree::Y, track::Pt, hypkftree::Ct, hypkftree::CosPa, hypkftree::DcaTracks, hypkftree::DcaTrackSv, hykfhyp::DcaToPvXY, hykfhyp::DcaToPvZ, hykfhyp::DevToPvXY, hykfhyp::Chi2, hypkftree::Pvx, hypkftree::Pvy, hypkftree::Pvz, hykfmc::Svx, hykfmc::Svy, hykfmc::Svz, hykfhyp::Px, hykfhyp::Py, hykfhyp::Pz, hypkftree::CollMcTrue +#define HYPKFHYPNUC hykfmc::Species, hypkftree::IsMatter, hypkftree::Centrality, hypkftree::Occupancy, hypkftree::RunNumber, hykfmccoll::PassedEvSel, hykfhyp::Mass, hypkftree::Y, track::Pt, hypkftree::Ct, hypkftree::CosPa, hypkftree::DcaTracks, hypkftree::DcaTrackSv, hykfhyp::DcaToPvXY, hykfhyp::DcaToPvZ, hykfhyp::DevToPvXY, hykfhyp::Chi2, hypkftree::Pvx, hypkftree::Pvy, hypkftree::Pvz, hykfmc::Svx, hykfmc::Svy, hykfmc::Svz, hykfhyp::Px, hykfhyp::Py, hykfhyp::Pz, hypkftree::CollMcTrue #define HYPKFHYPNUCMC hypkftree::McTrue, hykfmc::IsPhysicalPrimary @@ -291,6 +296,7 @@ DECLARE_SOA_COLUMN(Sd2sd3Mass, sd2sd3Mass, float); #define HYPKFSDMASS hypkftree::D1d2Mass, hypkftree::D1d3Mass, hypkftree::D2d3Mass #define HYPKFSSDMASS hypkftree::Sd1sd2Mass, hypkftree::Sd1sd3Mass, hypkftree::Sd2sd3Mass +#define HYPKFCSDMASS hypkftree::D1sd1Mass, hypkftree::D1sd2Mass, hypkftree::D1sd3Mass DECLARE_SOA_TABLE(HypKfGens, "AOD", "HYPKFGEN", HYPKFGENBASE); using HypKfGen = HypKfGens::iterator; @@ -307,10 +313,10 @@ using HypKfSingleThreeBodyCandidate = HypKfSingleThreeBodyCandidates::iterator; DECLARE_SOA_TABLE(HypKfMcSingleThreeBodyCandidates, "AOD", "HYPKFMCCAND3", HYPKFGENBASE, HYPKFGENEXT, HYPKFHYPNUC, HYPKFD1, HYPKFD2, HYPKFD3, HYPKFSDMASS); using HypKfMcSingleThreeBodyCandidate = HypKfMcSingleThreeBodyCandidates::iterator; -DECLARE_SOA_TABLE(HypKfCascadeTwoThreeCandidates, "AOD", "HYPKFCAND23", HYPKFHYPNUC, HYPKFHYPNUCMC, HYPKFD0, HYPKFD1, HYPKFSD1, HYPKFSD2, HYPKFSD3, HYPKFSSDMASS); +DECLARE_SOA_TABLE(HypKfCascadeTwoThreeCandidates, "AOD", "HYPKFCAND23", HYPKFHYPNUC, HYPKFHYPNUCMC, HYPKFD0, HYPKFD1, HYPKFSD1, HYPKFSD2, HYPKFSD3, HYPKFSSDMASS, HYPKFCSDMASS); using HypKfCascadeTwoThreeCandidate = HypKfCascadeTwoThreeCandidates::iterator; -DECLARE_SOA_TABLE(HypKfMcCascadeTwoThreeCandidates, "AOD", "HYPKFMCCAND23", HYPKFGENBASE, HYPKFGENEXT, HYPKFHYPNUC, HYPKFD0, HYPKFD1, HYPKFSD1, HYPKFSD2, HYPKFSD3, HYPKFSSDMASS); +DECLARE_SOA_TABLE(HypKfMcCascadeTwoThreeCandidates, "AOD", "HYPKFMCCAND23", HYPKFGENBASE, HYPKFGENEXT, HYPKFHYPNUC, HYPKFD0, HYPKFD1, HYPKFSD1, HYPKFSD2, HYPKFSD3, HYPKFSSDMASS, HYPKFCSDMASS); using HypKfMcCascadeTwoThreeCandidate = HypKfMcCascadeTwoThreeCandidates::iterator; DECLARE_SOA_TABLE(HypKfCascadeThreeTwoCandidates, "AOD", "HYPKFCAND32", HYPKFHYPNUC, HYPKFHYPNUCMC, HYPKFD0, HYPKFD1, HYPKFD2, HYPKFSDMASS, HYPKFSD1, HYPKFSD2); @@ -376,22 +382,22 @@ struct HypKfTreeCreator { { if (isMC && cfgMCGenerated) outputMcGenTable( - cand.pdgCode, cand.isMatterMC, cand.isReconstructed, cand.isPhysicalPrimary, cand.passedEvSelMC, cand.yGen, cand.ptGen, cand.ctGen); + cand.speciesMC, cand.pdgCode, cand.isMatterMC, cand.isReconstructed, cand.isPhysicalPrimary, cand.passedEvSelMC, cand.yGen, cand.ptGen, cand.ctGen); if (!cand.isReconstructed) { cand.daughterTracks.resize(4); cand.subDaughterMassVec.resize(4); hypDaughter.daughterTracks.resize(4); - hypDaughter.subDaughterMassVec.resize(4); + hypDaughter.subDaughterMassVec.resize(8); } - if (cfgNprimDaughters == 2 && cfgNsecDaughters == 0) { + if (cfgNprimDaughters == 2 && cfgNsecDaughters == 0) { // o2-linter: disable=magic-number (To be checked) const auto& d1 = cand.daughterTracks.at(0); const auto& d2 = cand.daughterTracks.at(1); if (!isMC || (isMC && cfgMCReconstructed && cand.isReconstructed)) outputTableTwo( - cand.species, cand.isMatter, cand.cent, cand.occu, cand.passedEvSel, cand.mass, cand.y, cand.pt, cand.ct, cand.cpaPv, cand.maxDcaTracks, cand.maxDcaTracksSv, cand.dcaToPvXY, - cand.dcaToPvZ, cand.devToPvXY, cand.chi2, cand.pvx, cand.pvy, cand.pvz, cand.svx, cand.svy, cand.svz, cand.px, cand.py, cand.pz, cand.collisionMcTrue, + cand.species, cand.isMatter, cand.cent, cand.occu, cand.runNumber, cand.passedEvSel, cand.mass, cand.y, cand.pt, cand.ct, cand.cpaPv, cand.maxDcaTracks, cand.maxDcaTracksSv, + cand.dcaToPvXY, cand.dcaToPvZ, cand.devToPvXY, cand.chi2, cand.pvx, cand.pvy, cand.pvz, cand.svx, cand.svy, cand.svz, cand.px, cand.py, cand.pz, cand.collisionMcTrue, cand.mcTrue, cand.mcPhysicalPrimary, d1.x, d1.y, d1.z, d1.px, d1.py, d1.pz, d1.tpcNcls, d1.tpcChi2, d1.itsNcls, d1.itsChi2, d1.itsMeanClsSizeL, d1.rigidity, d1.tpcSignal, d1.tpcNsigma, d1.tpcNsigmaNhp, d1.tpcNsigmaNlp, d1.tofMass, d1.dcaXY, d1.dcaZ, d1.isPvContributor, @@ -399,24 +405,24 @@ struct HypKfTreeCreator { d2.rigidity, d2.tpcSignal, d2.tpcNsigma, d2.tpcNsigmaNhp, d2.tpcNsigmaNlp, d2.tofMass, d2.dcaXY, d2.dcaZ, d2.isPvContributor); if (isMC && cfgMCCombined) outputTableMcTwo( - cand.pdgCode, cand.isMatterMC, cand.isReconstructed, cand.isPhysicalPrimary, cand.passedEvSelMC, cand.yGen, cand.ptGen, cand.ctGen, + cand.speciesMC, cand.pdgCode, cand.isMatterMC, cand.isReconstructed, cand.isPhysicalPrimary, cand.passedEvSelMC, cand.yGen, cand.ptGen, cand.ctGen, cand.cpaPvGen, cand.pxGen, cand.pyGen, cand.pzGen, cand.pvxGen, cand.pvyGen, cand.pvzGen, cand.svxGen, cand.svyGen, cand.svzGen, - cand.species, cand.isMatter, cand.cent, cand.occu, cand.passedEvSel, cand.mass, cand.y, cand.pt, cand.ct, cand.cpaPv, cand.maxDcaTracks, cand.maxDcaTracksSv, - cand.dcaToPvXY, cand.dcaToPvZ, cand.devToPvXY, + cand.species, cand.isMatter, cand.cent, cand.occu, cand.runNumber, cand.passedEvSel, cand.mass, cand.y, cand.pt, cand.ct, cand.cpaPv, cand.maxDcaTracks, + cand.maxDcaTracksSv, cand.dcaToPvXY, cand.dcaToPvZ, cand.devToPvXY, cand.chi2, cand.pvx, cand.pvy, cand.pvz, cand.svx, cand.svy, cand.svz, cand.px, cand.py, cand.pz, cand.collisionMcTrue, d1.x, d1.y, d1.z, d1.px, d1.py, d1.pz, d1.tpcNcls, d1.tpcChi2, d1.itsNcls, d1.itsChi2, d1.itsMeanClsSizeL, d1.rigidity, d1.tpcSignal, d1.tpcNsigma, d1.tpcNsigmaNhp, d1.tpcNsigmaNlp, d1.tofMass, d1.dcaXY, d1.dcaZ, d1.isPvContributor, d2.x, d2.y, d2.z, d2.px, d2.py, d2.pz, d2.tpcNcls, d2.tpcChi2, d2.itsNcls, d2.itsChi2, d2.itsMeanClsSizeL, d2.rigidity, d2.tpcSignal, d2.tpcNsigma, d2.tpcNsigmaNhp, d2.tpcNsigmaNlp, d2.tofMass, d2.dcaXY, d2.dcaZ, d2.isPvContributor); } - if (cand.isPrimaryCandidate && ((cfgNprimDaughters == 3 && cfgNsecDaughters == 0) || (cfgNsecDaughters == 3 && cfgSpecies == 0))) { + if (((!isMC && cand.isPrimaryCandidate) || (isMC && cand.isPhysicalPrimary)) && ((cfgNprimDaughters == 3 && cfgNsecDaughters == 0) || (cfgNsecDaughters == 3 && cfgSpecies == 0))) { // o2-linter: disable=magic-number (To be checked) const auto& d1 = cand.daughterTracks.at(0); const auto& d2 = cand.daughterTracks.at(1); const auto& d3 = cand.daughterTracks.at(2); if (!isMC || (isMC && cfgMCReconstructed && cand.isReconstructed)) outputTableThree( - cand.species, cand.isMatter, cand.cent, cand.occu, cand.passedEvSel, cand.mass, cand.y, cand.pt, cand.ct, cand.cpaPv, cand.maxDcaTracks, cand.maxDcaTracksSv, cand.dcaToPvXY, - cand.dcaToPvZ, cand.devToPvXY, cand.chi2, cand.pvx, cand.pvy, cand.pvz, cand.svx, cand.svy, cand.svz, cand.px, cand.py, cand.pz, cand.collisionMcTrue, + cand.species, cand.isMatter, cand.cent, cand.occu, cand.runNumber, cand.passedEvSel, cand.mass, cand.y, cand.pt, cand.ct, cand.cpaPv, cand.maxDcaTracks, cand.maxDcaTracksSv, + cand.dcaToPvXY, cand.dcaToPvZ, cand.devToPvXY, cand.chi2, cand.pvx, cand.pvy, cand.pvz, cand.svx, cand.svy, cand.svz, cand.px, cand.py, cand.pz, cand.collisionMcTrue, cand.mcTrue, cand.mcPhysicalPrimary, d1.x, d1.y, d1.z, d1.px, d1.py, d1.pz, d1.tpcNcls, d1.tpcChi2, d1.itsNcls, d1.itsChi2, d1.itsMeanClsSizeL, d1.rigidity, d1.tpcSignal, d1.tpcNsigma, d1.tpcNsigmaNhp, d1.tpcNsigmaNlp, d1.tofMass, d1.dcaXY, d1.dcaZ, d1.isPvContributor, @@ -427,10 +433,10 @@ struct HypKfTreeCreator { d1.subMass, d2.subMass, d3.subMass); if (isMC && cfgMCCombined) outputTableMcThree( - cand.pdgCode, cand.isMatterMC, cand.isReconstructed, cand.isPhysicalPrimary, cand.passedEvSelMC, cand.yGen, cand.ptGen, cand.ctGen, + cand.speciesMC, cand.pdgCode, cand.isMatterMC, cand.isReconstructed, cand.isPhysicalPrimary, cand.passedEvSelMC, cand.yGen, cand.ptGen, cand.ctGen, cand.cpaPvGen, cand.pxGen, cand.pyGen, cand.pzGen, cand.pvxGen, cand.pvyGen, cand.pvzGen, cand.svxGen, cand.svyGen, cand.svzGen, - cand.species, cand.isMatter, cand.cent, cand.occu, cand.passedEvSel, cand.mass, cand.y, cand.pt, cand.ct, cand.cpaPv, cand.maxDcaTracks, cand.maxDcaTracksSv, - cand.dcaToPvXY, cand.dcaToPvZ, cand.devToPvXY, cand.chi2, cand.pvx, cand.pvy, cand.pvz, cand.svx, cand.svy, cand.svz, cand.px, cand.py, + cand.species, cand.isMatter, cand.cent, cand.occu, cand.runNumber, cand.passedEvSel, cand.mass, cand.y, cand.pt, cand.ct, cand.cpaPv, cand.maxDcaTracks, + cand.maxDcaTracksSv, cand.dcaToPvXY, cand.dcaToPvZ, cand.devToPvXY, cand.chi2, cand.pvx, cand.pvy, cand.pvz, cand.svx, cand.svy, cand.svz, cand.px, cand.py, cand.pz, cand.collisionMcTrue, d1.x, d1.y, d1.z, d1.px, d1.py, d1.pz, d1.tpcNcls, d1.tpcChi2, d1.itsNcls, d1.itsChi2, d1.itsMeanClsSizeL, d1.rigidity, d1.tpcSignal, d1.tpcNsigma, d1.tpcNsigmaNhp, d1.tpcNsigmaNlp, d1.tofMass, d1.dcaXY, d1.dcaZ, d1.isPvContributor, @@ -440,7 +446,9 @@ struct HypKfTreeCreator { d3.rigidity, d3.tpcSignal, d3.tpcNsigma, d3.tpcNsigmaNhp, d3.tpcNsigmaNlp, d3.tofMass, d3.dcaXY, d3.dcaZ, d3.isPvContributor, d1.subMass, d2.subMass, d3.subMass); } - if (cfgNprimDaughters == 2 && cfgNsecDaughters == 3) { + if ((!isMC && !cand.isCascade) || (isMC && !cand.isCascadeMC)) + return; + if (cfgNprimDaughters == 2 && cfgNsecDaughters == 3) { // o2-linter: disable=magic-number (To be checked) const auto& d0 = cand.daughterTracks.at(0); const auto& d1 = cand.daughterTracks.at(1); const auto& sd1 = hypDaughter.daughterTracks.at(0); @@ -448,8 +456,8 @@ struct HypKfTreeCreator { const auto& sd3 = hypDaughter.daughterTracks.at(2); if (!isMC || (isMC && cfgMCReconstructed && cand.isReconstructed)) outputTableTwoThree( - cand.species, cand.isMatter, cand.cent, cand.occu, cand.passedEvSel, cand.mass, cand.y, cand.pt, cand.ct, cand.cpaPv, cand.maxDcaTracks, cand.maxDcaTracksSv, cand.dcaToPvXY, - cand.dcaToPvZ, cand.devToPvXY, cand.chi2, cand.pvx, cand.pvy, cand.pvz, cand.svx, cand.svy, cand.svz, cand.px, cand.py, cand.pz, cand.collisionMcTrue, + cand.species, cand.isMatter, cand.cent, cand.occu, cand.runNumber, cand.passedEvSel, cand.mass, cand.y, cand.pt, cand.ct, cand.cpaPv, cand.maxDcaTracks, cand.maxDcaTracksSv, + cand.dcaToPvXY, cand.dcaToPvZ, cand.devToPvXY, cand.chi2, cand.pvx, cand.pvy, cand.pvz, cand.svx, cand.svy, cand.svz, cand.px, cand.py, cand.pz, cand.collisionMcTrue, cand.mcTrue, cand.mcPhysicalPrimary, hypDaughter.svx, hypDaughter.svy, hypDaughter.svz, d0.x, d0.y, d0.z, d0.px, d0.py, d0.pz, hypDaughter.mass, hypDaughter.ct, hypDaughter.cpaPv, hypDaughter.maxDcaTracks, hypDaughter.dcaToPvXY, hypDaughter.dcaToPvZ, hypDaughter.dcaToVtxXY, hypDaughter.dcaToVtxZ, hypDaughter.chi2, @@ -461,13 +469,13 @@ struct HypKfTreeCreator { sd2.rigidity, sd2.tpcSignal, sd2.tpcNsigma, sd2.tpcNsigmaNhp, sd2.tpcNsigmaNlp, sd2.tofMass, sd2.dcaXY, sd2.dcaZ, sd2.isPvContributor, sd3.x, sd3.y, sd3.z, sd3.px, sd3.py, sd3.pz, sd3.tpcNcls, sd3.tpcChi2, sd3.itsNcls, sd3.itsChi2, sd3.itsMeanClsSizeL, sd3.rigidity, sd3.tpcSignal, sd3.tpcNsigma, sd3.tpcNsigmaNhp, sd3.tpcNsigmaNlp, sd3.tofMass, sd3.dcaXY, sd3.dcaZ, sd3.isPvContributor, - sd1.subMass, sd2.subMass, sd3.subMass); + sd1.subMass, sd2.subMass, sd3.subMass, cand.subDaughterMassVec.at(0), cand.subDaughterMassVec.at(1), cand.subDaughterMassVec.at(2)); if (isMC && cfgMCCombined) outputTableMcTwoThree( - cand.pdgCode, cand.isMatterMC, cand.isReconstructed, cand.isPhysicalPrimary, cand.passedEvSelMC, cand.yGen, cand.ptGen, cand.ctGen, + cand.speciesMC, cand.pdgCode, cand.isMatterMC, cand.isReconstructed, cand.isPhysicalPrimary, cand.passedEvSelMC, cand.yGen, cand.ptGen, cand.ctGen, cand.cpaPvGen, cand.pxGen, cand.pyGen, cand.pzGen, cand.pvxGen, cand.pvyGen, cand.pvzGen, cand.svxGen, cand.svyGen, cand.svzGen, - cand.species, cand.isMatter, cand.cent, cand.occu, cand.passedEvSel, cand.mass, cand.y, cand.pt, cand.ct, cand.cpaPv, cand.maxDcaTracks, cand.maxDcaTracksSv, cand.dcaToPvXY, - cand.dcaToPvZ, cand.devToPvXY, + cand.species, cand.isMatter, cand.cent, cand.occu, cand.runNumber, cand.passedEvSel, cand.mass, cand.y, cand.pt, cand.ct, cand.cpaPv, cand.maxDcaTracks, cand.maxDcaTracksSv, + cand.dcaToPvXY, cand.dcaToPvZ, cand.devToPvXY, cand.chi2, cand.pvx, cand.pvy, cand.pvz, cand.svx, cand.svy, cand.svz, cand.px, cand.py, cand.pz, cand.collisionMcTrue, hypDaughter.svx, hypDaughter.svy, hypDaughter.svz, d0.x, d0.y, d0.z, d0.px, d0.py, d0.pz, hypDaughter.mass, hypDaughter.ct, hypDaughter.cpaPv, hypDaughter.maxDcaTracks, hypDaughter.dcaToPvXY, hypDaughter.dcaToPvZ, hypDaughter.dcaToVtxXY, hypDaughter.dcaToVtxZ, hypDaughter.chi2, @@ -479,9 +487,9 @@ struct HypKfTreeCreator { sd2.rigidity, sd2.tpcSignal, sd2.tpcNsigma, sd2.tpcNsigmaNhp, sd2.tpcNsigmaNlp, sd2.tofMass, sd2.dcaXY, sd2.dcaZ, sd2.isPvContributor, sd3.x, sd3.y, sd3.z, sd3.px, sd3.py, sd3.pz, sd3.tpcNcls, sd3.tpcChi2, sd3.itsNcls, sd3.itsChi2, sd3.itsMeanClsSizeL, sd3.rigidity, sd3.tpcSignal, sd3.tpcNsigma, sd3.tpcNsigmaNhp, sd3.tpcNsigmaNlp, sd3.tofMass, sd3.dcaXY, sd3.dcaZ, sd3.isPvContributor, - sd1.subMass, sd2.subMass, sd3.subMass); + sd1.subMass, sd2.subMass, sd3.subMass, cand.subDaughterMassVec.at(0), cand.subDaughterMassVec.at(1), cand.subDaughterMassVec.at(2)); } - if (cfgNprimDaughters == 3 && cfgNsecDaughters == 1) { + if (cfgNprimDaughters == 3 && cfgNsecDaughters == 1) { // o2-linter: disable=magic-number (To be checked) const auto& d0 = cand.daughterTracks.at(0); const auto& d1 = cand.daughterTracks.at(1); const auto& d2 = cand.daughterTracks.at(2); @@ -489,8 +497,8 @@ struct HypKfTreeCreator { const auto& sd2 = hypDaughter.daughterTracks.at(1); if (!isMC || (isMC && cfgMCReconstructed && cand.isReconstructed)) outputTableThreeTwo( - cand.species, cand.isMatter, cand.cent, cand.occu, cand.passedEvSel, cand.mass, cand.y, cand.pt, cand.ct, cand.cpaPv, cand.maxDcaTracks, cand.maxDcaTracksSv, cand.dcaToPvXY, - cand.dcaToPvZ, cand.devToPvXY, cand.chi2, cand.pvx, cand.pvy, cand.pvz, cand.svx, cand.svy, cand.svz, cand.px, cand.py, cand.pz, cand.collisionMcTrue, + cand.species, cand.isMatter, cand.cent, cand.occu, cand.runNumber, cand.passedEvSel, cand.mass, cand.y, cand.pt, cand.ct, cand.cpaPv, cand.maxDcaTracks, cand.maxDcaTracksSv, + cand.dcaToPvXY, cand.dcaToPvZ, cand.devToPvXY, cand.chi2, cand.pvx, cand.pvy, cand.pvz, cand.svx, cand.svy, cand.svz, cand.px, cand.py, cand.pz, cand.collisionMcTrue, cand.mcTrue, cand.mcPhysicalPrimary, hypDaughter.svx, hypDaughter.svy, hypDaughter.svz, d0.x, d0.y, d0.z, d0.px, d0.py, d0.pz, hypDaughter.mass, hypDaughter.ct, hypDaughter.cpaPv, hypDaughter.maxDcaTracks, hypDaughter.dcaToPvXY, hypDaughter.dcaToPvZ, hypDaughter.dcaToVtxXY, hypDaughter.dcaToVtxZ, hypDaughter.chi2, d1.x, d1.y, d1.z, d1.px, d1.py, d1.pz, d1.tpcNcls, d1.tpcChi2, d1.itsNcls, d1.itsChi2, d1.itsMeanClsSizeL, @@ -504,10 +512,10 @@ struct HypKfTreeCreator { sd2.rigidity, sd2.tpcSignal, sd2.tpcNsigma, sd2.tpcNsigmaNhp, sd2.tpcNsigmaNlp, sd2.tofMass, sd2.dcaXY, sd2.dcaZ, sd2.isPvContributor); if (isMC && cfgMCCombined) outputTableMcThreeTwo( - cand.pdgCode, cand.isMatterMC, cand.isReconstructed, cand.isPhysicalPrimary, cand.passedEvSelMC, cand.yGen, cand.ptGen, cand.ctGen, + cand.speciesMC, cand.pdgCode, cand.isMatterMC, cand.isReconstructed, cand.isPhysicalPrimary, cand.passedEvSelMC, cand.yGen, cand.ptGen, cand.ctGen, cand.cpaPvGen, cand.pxGen, cand.pyGen, cand.pzGen, cand.pvxGen, cand.pvyGen, cand.pvzGen, cand.svxGen, cand.svyGen, cand.svzGen, - cand.species, cand.isMatter, cand.cent, cand.occu, cand.passedEvSel, cand.mass, cand.y, cand.pt, cand.ct, cand.cpaPv, cand.maxDcaTracks, cand.maxDcaTracksSv, cand.dcaToPvXY, - cand.dcaToPvZ, cand.devToPvXY, cand.chi2, cand.pvx, cand.pvy, cand.pvz, cand.svx, cand.svy, cand.svz, cand.px, cand.py, cand.pz, cand.collisionMcTrue, + cand.species, cand.isMatter, cand.cent, cand.occu, cand.runNumber, cand.passedEvSel, cand.mass, cand.y, cand.pt, cand.ct, cand.cpaPv, cand.maxDcaTracks, cand.maxDcaTracksSv, + cand.dcaToPvXY, cand.dcaToPvZ, cand.devToPvXY, cand.chi2, cand.pvx, cand.pvy, cand.pvz, cand.svx, cand.svy, cand.svz, cand.px, cand.py, cand.pz, cand.collisionMcTrue, hypDaughter.svx, hypDaughter.svy, hypDaughter.svz, d0.x, d0.y, d0.z, d0.px, d0.py, d0.pz, hypDaughter.mass, hypDaughter.ct, hypDaughter.cpaPv, hypDaughter.maxDcaTracks, hypDaughter.dcaToPvXY, hypDaughter.dcaToPvZ, hypDaughter.dcaToVtxXY, hypDaughter.dcaToVtxZ, hypDaughter.chi2, d1.x, d1.y, d1.z, d1.px, d1.py, d1.pz, d1.tpcNcls, d1.tpcChi2, d1.itsNcls, d1.itsChi2, d1.itsMeanClsSizeL, @@ -547,8 +555,11 @@ struct HypKfTreeCreator { cand.species = std::abs(hypNuc.species()); cand.isPrimaryCandidate = hypNuc.primary(); cand.isMatter = hypNuc.isMatter(); + cand.mcTrue = hypNuc.mcTrue(); + cand.isCascade = cand.species > 10; // o2-linter: disable=magic-number (To be checked) cand.cent = coll.centFT0C(); cand.occu = coll.occupancy(); + cand.runNumber = coll.runNumber(); cand.passedEvSel = coll.passedEvSel(); cand.mass = hypNuc.mass(); cand.y = hypNuc.y(); @@ -601,11 +612,19 @@ struct HypKfTreeCreator { cand.daughterTracks.at(trackCount).z = addOn.z(); cand.daughterTracks.at(trackCount).px = addOn.px(); cand.daughterTracks.at(trackCount).py = addOn.py(); - cand.daughterTracks.at(trackCount).pz = addOn.py(); + cand.daughterTracks.at(trackCount).pz = addOn.pz(); trackCount++; } + + if (cand.isCascade) { + auto subDaughters = hypNuc.hypKfSubD_as(); + for (const auto& subDaughter : subDaughters) { + cand.subDaughterMassVec.push_back(subDaughter.subMass()); + } + } + cand.nSingleDaughters = trackCount; - if (cand.nSingleDaughters < 3) + if (cand.nSingleDaughters < 3) // o2-linter: disable=magic-number (To be checked) return; trackCount = 0; @@ -626,9 +645,12 @@ struct HypKfTreeCreator { const auto mcParticleIdx = mcHypNuc.globalIndex(); auto hypNucsByMc = hypNucs.sliceBy(perMcParticle, mcParticleIdx); HyperNucleus candidate, hypNucDaughter; + candidate.speciesMC = mcHypNuc.species(); + candidate.isCascadeMC = candidate.speciesMC > 10; // o2-linter: disable=magic-number (To be checked) candidate.pdgCode = mcHypNuc.pdgCode(); candidate.isMatterMC = mcHypNuc.isMatter(); candidate.isPhysicalPrimary = mcHypNuc.isPhysicalPrimary(); + candidate.mcPhysicalPrimary = mcHypNuc.isPhysicalPrimary(); candidate.passedEvSelMC = mcColl.passedEvSel(); candidate.yGen = mcHypNuc.y(); candidate.ptGen = mcHypNuc.pt(); From 5b39755cd31f4727d83fdccf060433e411b9c500 Mon Sep 17 00:00:00 2001 From: Marvin Hemmer <53471402+mhemmer-cern@users.noreply.github.com> Date: Mon, 2 Jun 2025 19:21:44 +0200 Subject: [PATCH 1488/1650] [PWGJE,EMCAL-1154] emcalCorrectionTask: fix include headers (#11440) --- PWGJE/TableProducer/emcalCorrectionTask.cxx | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/PWGJE/TableProducer/emcalCorrectionTask.cxx b/PWGJE/TableProducer/emcalCorrectionTask.cxx index 76877211c83..1c1261827de 100644 --- a/PWGJE/TableProducer/emcalCorrectionTask.cxx +++ b/PWGJE/TableProducer/emcalCorrectionTask.cxx @@ -18,28 +18,42 @@ /// \author Raymond Ehlers (raymond.ehlers@cern.ch) ORNL, Florian Jonas (florian.jonas@cern.ch) /// -#include +#include +#include +#include +#include #include +#include #include #include #include #include +#include #include #include #include "CCDB/BasicCCDBManager.h" #include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisHelpers.h" #include "Framework/ASoA.h" +#include "Framework/Configurable.h" +#include "Framework/Expressions.h" +#include "Framework/HistogramSpec.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/InitContext.h" +#include "Framework/WorkflowSpec.h" #include "DetectorsBase/GeometryManager.h" +#include "PWGJE/DataModel/EMCALClusterDefinition.h" #include "PWGJE/DataModel/EMCALClusters.h" #include "PWGJE/DataModel/EMCALMatchedCollisions.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/TrackSelectionTables.h" +#include "DataFormatsEMCAL/ClusterLabel.h" #include "DataFormatsEMCAL/Cell.h" #include "DataFormatsEMCAL/CellLabel.h" #include "DataFormatsEMCAL/Constants.h" @@ -49,7 +63,9 @@ #include "EMCALBase/NonlinearityHandler.h" #include "EMCALReconstruction/Clusterizer.h" #include "PWGJE/Core/JetUtilities.h" +#include "GPUROOTCartesianFwd.h" #include "TVector2.h" +#include "TH1.h" using namespace o2; using namespace o2::framework; From 8e7950d9e2da01795ab71e55743040076fbb181e Mon Sep 17 00:00:00 2001 From: Noor Koster <82090643+cnkoster@users.noreply.github.com> Date: Mon, 2 Jun 2025 20:48:42 +0200 Subject: [PATCH 1489/1650] [PWGCF] Changed order evSel enum (#11442) --- PWGCF/Flow/Tasks/flowSP.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowSP.cxx b/PWGCF/Flow/Tasks/flowSP.cxx index 05ff0d67522..db8bb0df404 100644 --- a/PWGCF/Flow/Tasks/flowSP.cxx +++ b/PWGCF/Flow/Tasks/flowSP.cxx @@ -187,8 +187,8 @@ struct FlowSP { evSel_MultCuts, evSel_kIsGoodITSLayersAll, evSel_isSelectedZDC, - nEventSelections, - evSel_CentCuts + evSel_CentCuts, + nEventSelections }; enum TrackSelections { From 52e1c38784b8da7b5c41a6d65d7f2db9ccaa8b4b Mon Sep 17 00:00:00 2001 From: Jesper Gumprecht <113693781+jesgum@users.noreply.github.com> Date: Mon, 2 Jun 2025 20:53:08 +0200 Subject: [PATCH 1490/1650] [ALICE3] Modularise multi-charm task (#11441) --- ALICE3/DataModel/OTFMulticharm.h | 190 +++++++++----- ALICE3/TableProducer/CMakeLists.txt | 4 +- ...ticharm.cxx => alice3-multicharmTable.cxx} | 99 ++++---- ALICE3/Tasks/CMakeLists.txt | 5 + ALICE3/Tasks/alice3-multicharm.cxx | 235 ++++++++++++++++++ 5 files changed, 421 insertions(+), 112 deletions(-) rename ALICE3/TableProducer/{alice3-multicharm.cxx => alice3-multicharmTable.cxx} (90%) create mode 100644 ALICE3/Tasks/alice3-multicharm.cxx diff --git a/ALICE3/DataModel/OTFMulticharm.h b/ALICE3/DataModel/OTFMulticharm.h index 7dbde7bdc9a..c04ad88b4bf 100644 --- a/ALICE3/DataModel/OTFMulticharm.h +++ b/ALICE3/DataModel/OTFMulticharm.h @@ -10,10 +10,11 @@ // or submit itself to any jurisdiction. /// -/// \file OTFStrangeness.h +/// \file OTFMulticharm.h /// \author David Dobrigkeit Chinellato +/// \author Jesper Karlsson Gumprecht /// \since 05/08/2024 -/// \brief Set of tables for the ALICE3 strangeness information +/// \brief Set of tables for the ALICE3 multi-charm information /// #ifndef ALICE3_DATAMODEL_OTFMULTICHARM_H_ @@ -31,45 +32,72 @@ DECLARE_SOA_INDEX_COLUMN_FULL(XiCPion1, xiCPion1, int, Tracks, "_Pi1XiC"); DECLARE_SOA_INDEX_COLUMN_FULL(XiCPion2, xiCPion2, int, Tracks, "_Pi2XiC"); DECLARE_SOA_INDEX_COLUMN_FULL(XiCCPion, xiCCPion, int, Tracks, "_PiXiCC"); -// topo vars -DECLARE_SOA_COLUMN(DCAXiCDaughters, dcaXiCDaughters, float); -DECLARE_SOA_COLUMN(DCAXiCCDaughters, dcaXiCCDaughters, float); - -DECLARE_SOA_COLUMN(MXiC, mXiC, float); -DECLARE_SOA_COLUMN(MXiCC, mXiCC, float); +DECLARE_SOA_COLUMN(XicMass, xicMass, float); +DECLARE_SOA_COLUMN(XiccMass, xiccMass, float); // kine vars DECLARE_SOA_COLUMN(Pt, pt, float); DECLARE_SOA_COLUMN(Eta, eta, float); -// tracking counters -DECLARE_SOA_COLUMN(NSiliconHitsXi, nSiliconHitsXi, int); -DECLARE_SOA_COLUMN(NSiliconHitsPiFromXi, nSiliconHitsPiFromXi, int); -DECLARE_SOA_COLUMN(NSiliconHitsPiFromLa, nSiliconHitsPiFromLa, int); -DECLARE_SOA_COLUMN(NSiliconHitsPrFromLa, nSiliconHitsPrFromLa, int); -DECLARE_SOA_COLUMN(NSiliconHitsPiC1, nSiliconHitsPiC1, int); -DECLARE_SOA_COLUMN(NSiliconHitsPiC2, nSiliconHitsPiC2, int); -DECLARE_SOA_COLUMN(NSiliconHitsPiCC, nSiliconHitsPiCC, int); - -DECLARE_SOA_COLUMN(NTPCHitsPiFromXi, nTPCHitsPiFromXi, int); -DECLARE_SOA_COLUMN(NTPCHitsPiFromLa, nTPCHitsPiFromLa, int); -DECLARE_SOA_COLUMN(NTPCHitsPrFromLa, nTPCHitsPrFromLa, int); -DECLARE_SOA_COLUMN(NTPCHitsPiC1, nTPCHitsPiC1, int); -DECLARE_SOA_COLUMN(NTPCHitsPiC2, nTPCHitsPiC2, int); -DECLARE_SOA_COLUMN(NTPCHitsPiCC, nTPCHitsPiCC, int); - -// DCA to PV variables -DECLARE_SOA_COLUMN(DCAToPVXi, dcaToPVXi, float); -DECLARE_SOA_COLUMN(DCAToPVXiC, dcaToPVXiC, float); -DECLARE_SOA_COLUMN(DCAToPVXiCC, dcaToPVXiCC, float); - -DECLARE_SOA_COLUMN(DCAToPVPiFromXi, dcaToPVPiFromXi, float); -DECLARE_SOA_COLUMN(DCAToPVPiFromLa, dcaToPVPiFromLa, float); -DECLARE_SOA_COLUMN(DCAToPVPrFromLa, dcaToPVPrFromLa, float); - -DECLARE_SOA_COLUMN(DCAToPVPiC1, dcaToPVPiC1, float); -DECLARE_SOA_COLUMN(DCAToPVPiC2, dcaToPVPiC2, float); -DECLARE_SOA_COLUMN(DCAToPVPiCC, dcaToPVPiCC, float); +// topo vars +DECLARE_SOA_COLUMN(XiDCAz, xiDCAz, float); +DECLARE_SOA_COLUMN(XiDCAxy, xiDCAxy, float); +DECLARE_SOA_COLUMN(XicDauDCA, xicDauDCA, float); +DECLARE_SOA_COLUMN(XicDCAxy, xicDCAxy, float); +DECLARE_SOA_COLUMN(XicDCAz, xicDCAz, float); +DECLARE_SOA_COLUMN(XiccDauDCA, xiccDauDCA, float); +DECLARE_SOA_COLUMN(XiccDCAxy, xiccDCAxy, float); +DECLARE_SOA_COLUMN(XiccDCAz, xiccDCAz, float); + +DECLARE_SOA_COLUMN(PiFromXiDCAxy, piFromXiDCAxy, float); +DECLARE_SOA_COLUMN(PiFromLaDCAxy, piFromLaDCAxy, float); +DECLARE_SOA_COLUMN(PrFromLaDCAxy, prFromLaDCAxy, float); +DECLARE_SOA_COLUMN(PiFromXiDCAz, piFromXiDCAz, float); +DECLARE_SOA_COLUMN(PiFromLaDCAz, piFromLaDCAz, float); +DECLARE_SOA_COLUMN(PrFromLaDCAz, prFromLaDCAz, float); + +DECLARE_SOA_COLUMN(Pi1cDCAxy, pi1cDCAxy, float); +DECLARE_SOA_COLUMN(Pi2cDCAxy, pi2cDCAxy, float); +DECLARE_SOA_COLUMN(PiccDCAxy, piccDCAxy, float); +DECLARE_SOA_COLUMN(Pi1cDCAz, pi1cDCAz, float); +DECLARE_SOA_COLUMN(Pi2cDCAz, pi2cDCAz, float); +DECLARE_SOA_COLUMN(PiccDCAz, piccDCAz, float); + +// Lengths +DECLARE_SOA_COLUMN(XicDecayRadius2D, xicDecayRadius2D, float); +DECLARE_SOA_COLUMN(XiccDecayRadius2D, xiccDecayRadius2D, float); +DECLARE_SOA_COLUMN(XicProperLength, xicProperLength, float); +DECLARE_SOA_COLUMN(XicDistanceFromPV, xicDistanceFromPV, float); +DECLARE_SOA_COLUMN(XiccProperLength, xiccProperLength, float); + +// PID +DECLARE_SOA_COLUMN(Pi1cTofDeltaInner, pi1cTofDeltaInner, float); +DECLARE_SOA_COLUMN(Pi1cTofNSigmaInner, pi1cTofNSigmaInner, float); +DECLARE_SOA_COLUMN(Pi1cTofDeltaOuter, pi1cTofDeltaOuter, float); +DECLARE_SOA_COLUMN(Pi1cTofNSigmaOuter, pi1cTofNSigmaOuter, float); +DECLARE_SOA_COLUMN(Pi2cTofDeltaInner, pi2cTofDeltaInner, float); +DECLARE_SOA_COLUMN(Pi2cTofNSigmaInner, pi2cTofNSigmaInner, float); +DECLARE_SOA_COLUMN(Pi2cTofDeltaOuter, pi2cTofDeltaOuter, float); +DECLARE_SOA_COLUMN(Pi2cTofNSigmaOuter, pi2cTofNSigmaOuter, float); +DECLARE_SOA_COLUMN(PiccTofDeltaInner, piccTofDeltaInner, float); +DECLARE_SOA_COLUMN(PiccTofNSigmaInner, piccTofNSigmaInner, float); +DECLARE_SOA_COLUMN(PiccTofDeltaOuter, piccTofDeltaOuter, float); +DECLARE_SOA_COLUMN(PiccTofNSigmaOuter, piccTofNSigmaOuter, float); + +// Daughter info +DECLARE_SOA_COLUMN(PosPt, posPt, float); +DECLARE_SOA_COLUMN(PosEta, posEta, float); +DECLARE_SOA_COLUMN(NegPt, negPt, float); +DECLARE_SOA_COLUMN(NegEta, negEta, float); +DECLARE_SOA_COLUMN(BachPt, bachPt, float); +DECLARE_SOA_COLUMN(BachEta, bachEta, float); +DECLARE_SOA_COLUMN(BachPhi, bachPhi, float); +DECLARE_SOA_COLUMN(Pi1cPt, pi1cPt, float); +DECLARE_SOA_COLUMN(Pi1cEta, pi1cEta, float); +DECLARE_SOA_COLUMN(Pi2cPt, pi2cPt, float); +DECLARE_SOA_COLUMN(Pi2cEta, pi2cEta, float); +DECLARE_SOA_COLUMN(PiccPt, piccPt, float); +DECLARE_SOA_COLUMN(PiccEta, piccEta, float); } // namespace otfmulticharm DECLARE_SOA_TABLE(MCharmIndices, "AOD", "MCharmIndices", @@ -80,36 +108,72 @@ DECLARE_SOA_TABLE(MCharmIndices, "AOD", "MCharmIndices", otfmulticharm::XiCCPionId); DECLARE_SOA_TABLE(MCharmCores, "AOD", "MCharmCores", - otfmulticharm::DCAXiCDaughters, - otfmulticharm::DCAXiCCDaughters, - otfmulticharm::MXiC, - otfmulticharm::MXiCC, + otfmulticharm::XicDauDCA, + otfmulticharm::XiccDauDCA, + otfmulticharm::XicMass, + otfmulticharm::XiccMass, otfmulticharm::Pt, otfmulticharm::Eta, - otfmulticharm::NSiliconHitsXi, - otfmulticharm::NSiliconHitsPiFromXi, - otfmulticharm::NSiliconHitsPiFromLa, - otfmulticharm::NSiliconHitsPrFromLa, - otfmulticharm::NSiliconHitsPiC1, - otfmulticharm::NSiliconHitsPiC2, - otfmulticharm::NSiliconHitsPiCC, - otfmulticharm::NTPCHitsPiFromXi, - otfmulticharm::NTPCHitsPiFromLa, - otfmulticharm::NTPCHitsPrFromLa, - otfmulticharm::NTPCHitsPiC1, - otfmulticharm::NTPCHitsPiC2, - otfmulticharm::NTPCHitsPiCC, - - otfmulticharm::DCAToPVXi, - otfmulticharm::DCAToPVXiC, - otfmulticharm::DCAToPVXiCC, - otfmulticharm::DCAToPVPiFromXi, - otfmulticharm::DCAToPVPiFromLa, - otfmulticharm::DCAToPVPrFromLa, - otfmulticharm::DCAToPVPiC1, - otfmulticharm::DCAToPVPiC2, - otfmulticharm::DCAToPVPiCC); + otfmulticharm::XiDCAxy, + otfmulticharm::XicDCAxy, + otfmulticharm::XiccDCAxy, + otfmulticharm::XiDCAz, + otfmulticharm::XicDCAz, + otfmulticharm::XiccDCAz, + + otfmulticharm::PiFromXiDCAxy, + otfmulticharm::PiFromLaDCAxy, + otfmulticharm::PrFromLaDCAxy, + otfmulticharm::PiFromXiDCAz, + otfmulticharm::PiFromLaDCAz, + otfmulticharm::PrFromLaDCAz, + + otfmulticharm::Pi1cDCAxy, + otfmulticharm::Pi2cDCAxy, + otfmulticharm::PiccDCAxy, + otfmulticharm::Pi1cDCAz, + otfmulticharm::Pi2cDCAz, + otfmulticharm::PiccDCAz, + + otfmulticharm::XicDecayRadius2D, + otfmulticharm::XiccDecayRadius2D, + otfmulticharm::XicProperLength, + otfmulticharm::XicDistanceFromPV, + otfmulticharm::XiccProperLength, + + otfmulticharm::Pi1cTofDeltaInner, + otfmulticharm::Pi1cTofNSigmaInner, + otfmulticharm::Pi1cTofDeltaOuter, + otfmulticharm::Pi1cTofNSigmaOuter, + + otfmulticharm::Pi2cTofDeltaInner, + otfmulticharm::Pi2cTofNSigmaInner, + otfmulticharm::Pi2cTofDeltaOuter, + otfmulticharm::Pi2cTofNSigmaOuter, + + otfmulticharm::PiccTofDeltaInner, + otfmulticharm::PiccTofNSigmaInner, + otfmulticharm::PiccTofDeltaOuter, + otfmulticharm::PiccTofNSigmaOuter, + + otfmulticharm::BachPt, + otfmulticharm::BachEta, + + otfmulticharm::PosPt, + otfmulticharm::PosEta, + + otfmulticharm::NegPt, + otfmulticharm::NegEta, + + otfmulticharm::Pi1cPt, + otfmulticharm::Pi1cEta, + + otfmulticharm::Pi2cPt, + otfmulticharm::Pi2cEta, + + otfmulticharm::PiccPt, + otfmulticharm::PiccEta); } // namespace o2::aod diff --git a/ALICE3/TableProducer/CMakeLists.txt b/ALICE3/TableProducer/CMakeLists.txt index 8548ecd9897..d0b7afce076 100644 --- a/ALICE3/TableProducer/CMakeLists.txt +++ b/ALICE3/TableProducer/CMakeLists.txt @@ -41,8 +41,8 @@ o2physics_add_dpl_workflow(alice3-decayfinder PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DCAFitter COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(alice3-multicharm - SOURCES alice3-multicharm.cxx +o2physics_add_dpl_workflow(alice3-multicharm-table + SOURCES alice3-multicharmTable.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DCAFitter COMPONENT_NAME Analysis) diff --git a/ALICE3/TableProducer/alice3-multicharm.cxx b/ALICE3/TableProducer/alice3-multicharmTable.cxx similarity index 90% rename from ALICE3/TableProducer/alice3-multicharm.cxx rename to ALICE3/TableProducer/alice3-multicharmTable.cxx index 74948cfdf11..16b16c666d8 100644 --- a/ALICE3/TableProducer/alice3-multicharm.cxx +++ b/ALICE3/TableProducer/alice3-multicharmTable.cxx @@ -71,7 +71,7 @@ using tofTracks = soa::Join; using richTracks = soa::Join; using alice3tracks = soa::Join; -struct alice3multicharm { +struct alice3multicharmTable { SliceCache cache; Produces multiCharmIdx; @@ -131,8 +131,6 @@ struct alice3multicharm { ConfigurableAxis axisDecayLength{"axisDecayLength", {2000, 0, 2000}, "Decay lenght (#mum)"}; ConfigurableAxis axisTOFTrack{"axisTOFTrack", {1000, 0, 5000}, "TOF track time"}; - ConfigurableAxis axisPiMass{"axisPiMass", {200, 0.089f, 0.189f}, "Pi Inv Mass (GeV/c^{2})"}; - ConfigurableAxis axisPrMass{"axisPrMass", {200, 0.838f, 1.038f}, "Pr Inv Mass (GeV/c^{2})"}; ConfigurableAxis axisXiMass{"axisXiMass", {200, 1.221f, 1.421f}, "Xi Inv Mass (GeV/c^{2})"}; ConfigurableAxis axisXiCMass{"axisXiCMass", {200, 2.368f, 2.568f}, "XiC Inv Mass (GeV/c^{2})"}; ConfigurableAxis axisXiCCMass{"axisXiCCMass", {200, 3.521f, 3.721f}, "XiCC Inv Mass (GeV/c^{2})"}; @@ -414,15 +412,7 @@ struct alice3multicharm { histos.add("hEtaXiCC", "hEtaXiCC", kTH1D, {axisEta}); histos.add("hPtXiCC", "hPtXiCC", kTH1D, {axisPt}); - histos.add("h3dXicc", "h3dXicc", kTH3D, {axisPt, axisEta, axisXiCCMass}); - histos.add("h3dXic", "h3dXic", kTH3D, {axisPt, axisEta, axisXiCMass}); - histos.add("h3dXi", "h3dXi", kTH3D, {axisPt, axisEta, axisXiMass}); - histos.add("h3dPicc", "h3dPicc", kTH3D, {axisPt, axisEta, axisPiMass}); - histos.add("h3dPi1c", "h3dPi1c", kTH3D, {axisPt, axisEta, axisPiMass}); - histos.add("h3dPi2c", "h3dPi2c", kTH3D, {axisPt, axisEta, axisPiMass}); - histos.add("h3dBach", "h3dBach", kTH3D, {axisPt, axisEta, axisPiMass}); - histos.add("h3dPos", "h3dPos", kTH3D, {axisPt, axisEta, axisPrMass}); - histos.add("h3dNeg", "h3dNeg", kTH3D, {axisPt, axisEta, axisPiMass}); + histos.add("h3dMassXiCC", "h3dMassXiCC", kTH3D, {axisPt, axisEta, axisXiCCMass}); histos.add("hDCAXiCDaughters", "hDCAXiCDaughters", kTH1D, {axisDCAXiCDaughters}); histos.add("hDCAXiCCDaughters", "hDCAXiCCDaughters", kTH1D, {axisDCAXiCCDaughters}); @@ -526,11 +516,6 @@ struct alice3multicharm { auto piFromLa = xiCand.negTrack_as(); // de-reference neg track auto prFromLa = xiCand.posTrack_as(); // de-reference pos track - histos.fill(HIST("h3dXi"), xi.pt(), xi.eta(), xiCand.mXi()); - histos.fill(HIST("h3dBach"), piFromXi.pt(), piFromXi.eta(), o2::constants::physics::MassPionCharged); - histos.fill(HIST("h3dNeg"), piFromLa.pt(), piFromLa.eta(), o2::constants::physics::MassPionCharged); - histos.fill(HIST("h3dPos"), prFromLa.pt(), prFromLa.eta(), o2::constants::physics::MassProton); - if (!bitcheck(xi.decayMap(), kTrueXiFromXiC)) continue; @@ -554,11 +539,11 @@ struct alice3multicharm { continue; // too low momentum histos.fill(HIST("hPi1cPt"), pi1c.pt()); - double pi1cTOFDiffInner = std::fabs(pi1c.innerTOFTrackTimeReco() - pi1c.innerTOFExpectedTimePi()); + float pi1cTOFDiffInner = std::fabs(pi1c.innerTOFTrackTimeReco() - pi1c.innerTOFExpectedTimePi()); + float pi1cTOFDiffOuter = std::fabs(pi1c.outerTOFTrackTimeReco() - pi1c.outerTOFExpectedTimePi()); if (pi1cTOFDiffInner > piFromXiC_tofDiffInner) continue; // did not arrive at expected time - histos.fill(HIST("h3dPi1c"), pi1c.pt(), pi1c.eta(), o2::constants::physics::MassPionCharged); histos.fill(HIST("hInnerTOFTrackTimeRecoPi1c"), pi1cTOFDiffInner); // second pion from XiC decay for starts here for (auto const& pi2c : tracksPiFromXiCgrouped) { @@ -575,13 +560,12 @@ struct alice3multicharm { continue; // too low momentum histos.fill(HIST("hPi2cPt"), pi2c.pt()); - double pi2cTOFDiffInner = std::fabs(pi2c.innerTOFTrackTimeReco() - pi2c.innerTOFExpectedTimePi()); + float pi2cTOFDiffInner = std::fabs(pi2c.innerTOFTrackTimeReco() - pi2c.innerTOFExpectedTimePi()); + float pi2cTOFDiffOuter = std::fabs(pi2c.outerTOFTrackTimeReco() - pi2c.outerTOFExpectedTimePi()); if (pi2cTOFDiffInner > piFromXiC_tofDiffInner) continue; // did not arrive at expected time histos.fill(HIST("hInnerTOFTrackTimeRecoPi2c"), pi2cTOFDiffInner); - histos.fill(HIST("h3dPi2c"), pi2c.pt(), pi2c.eta(), o2::constants::physics::MassPionCharged); - // if I am here, it means this is a triplet to be considered for XiC vertexing. // will now attempt to build a three-body decay candidate with these three track rows. @@ -603,7 +587,7 @@ struct alice3multicharm { thisXiCcandidate.prong0mom[2] + thisXiCcandidate.prong1mom[2] + thisXiCcandidate.prong2mom[2]}; o2::track::TrackParCov xicTrack(thisXiCcandidate.xyz, momentumC, thisXiCcandidate.parentTrackCovMatrix, +1); - double xicDecayRadius2D = std::hypot(thisXiCcandidate.xyz[0], thisXiCcandidate.xyz[1]); + float xicDecayRadius2D = std::hypot(thisXiCcandidate.xyz[0], thisXiCcandidate.xyz[1]); if (xicDecayRadius2D < minXiCRadius) continue; // do not take if radius too small, likely a primary combination @@ -631,7 +615,7 @@ struct alice3multicharm { histos.fill(HIST("hDCAxyXiC"), std::fabs(xicdcaXY * 1e+4)); histos.fill(HIST("hDCAzXiC"), std::fabs(xicdcaZ * 1e+4)); histos.fill(HIST("hMassXiC"), thisXiCcandidate.mass); - histos.fill(HIST("h3dXic"), thisXiCcandidate.pt, thisXiCcandidate.eta, thisXiCcandidate.mass); + // attempt XiCC finding uint32_t nCombinationsCC = 0; for (auto const& picc : tracksPiFromXiCCgrouped) { @@ -646,12 +630,12 @@ struct alice3multicharm { histos.fill(HIST("hPiccPt"), picc.pt()); - double piccTOFDiffInner = std::fabs(picc.innerTOFTrackTimeReco() - picc.innerTOFExpectedTimePi()); + float piccTOFDiffInner = std::fabs(picc.innerTOFTrackTimeReco() - picc.innerTOFExpectedTimePi()); + float piccTOFDiffOuter = std::fabs(picc.outerTOFTrackTimeReco() - picc.outerTOFExpectedTimePi()); if (piccTOFDiffInner > piFromXiCC_tofDiffInner) continue; // did not arrive at expected time histos.fill(HIST("hInnerTOFTrackTimeRecoPicc"), piccTOFDiffInner); - histos.fill(HIST("h3dPicc"), picc.pt(), picc.eta(), o2::constants::physics::MassPionCharged); o2::track::TrackParCov piccTrack = getTrackParCov(picc); nCombinationsCC++; @@ -667,40 +651,40 @@ struct alice3multicharm { thisXiCCcandidate.prong0mom[2] + thisXiCCcandidate.prong1mom[2]}; o2::track::TrackParCov xiccTrack(thisXiCCcandidate.xyz, momentumCC, thisXiCCcandidate.parentTrackCovMatrix, +2); - double xiccDecayRadius2D = std::hypot(thisXiCCcandidate.xyz[0], thisXiCCcandidate.xyz[1]); + float xiccDecayRadius2D = std::hypot(thisXiCCcandidate.xyz[0], thisXiCCcandidate.xyz[1]); if (xiccDecayRadius2D < minXiCCRadius) continue; // do not take if radius too small, likely a primary combination histos.fill(HIST("hMinXiCCDecayRadius"), xiccDecayRadius2D * 1e+4); - double totalMomentumC = std::hypot(momentumC[0], momentumC[1], momentumC[2]); - double decayLengthXiC = std::hypot( + float totalMomentumC = std::hypot(momentumC[0], momentumC[1], momentumC[2]); + float decayLengthXiC = std::hypot( thisXiCcandidate.xyz[0] - thisXiCCcandidate.xyz[0], thisXiCcandidate.xyz[1] - thisXiCCcandidate.xyz[1], thisXiCcandidate.xyz[2] - thisXiCCcandidate.xyz[2]); - double xicProperLength = decayLengthXiC * thisXiCcandidate.mass / totalMomentumC; + float xicProperLength = decayLengthXiC * thisXiCcandidate.mass / totalMomentumC; if (xicProperLength < xicMinProperLength || xicProperLength > xicMaxProperLength) continue; // likely background histos.fill(HIST("hProperLengthXiC"), xicProperLength * 1e+4); - double xicDistanceFromPV = std::hypot( + float xicDistanceFromPV = std::hypot( thisXiCcandidate.xyz[0] - collision.posX(), thisXiCcandidate.xyz[1] - collision.posY(), thisXiCcandidate.xyz[2] - collision.posZ()); - double xicDecayDistanceFromPV = xicDistanceFromPV * thisXiCcandidate.mass / totalMomentumC; + float xicDecayDistanceFromPV = xicDistanceFromPV * thisXiCcandidate.mass / totalMomentumC; if (xicDecayDistanceFromPV < xicMinDecayDistanceFromPV) continue; // too close to PV histos.fill(HIST("hMinxicDecayDistanceFromPV"), xicDecayDistanceFromPV * 1e+4); - double totalMomentumCC = std::hypot(momentumCC[0], momentumCC[1], momentumCC[2]); - double decayLengthXiCC = std::hypot( + float totalMomentumCC = std::hypot(momentumCC[0], momentumCC[1], momentumCC[2]); + float decayLengthXiCC = std::hypot( thisXiCCcandidate.xyz[0] - collision.posX(), thisXiCCcandidate.xyz[1] - collision.posY(), thisXiCCcandidate.xyz[2] - collision.posZ()); - double xiccProperLength = decayLengthXiCC * thisXiCCcandidate.mass / totalMomentumCC; + float xiccProperLength = decayLengthXiCC * thisXiCCcandidate.mass / totalMomentumCC; if (xiccProperLength < xiccMinProperLength || xiccProperLength > xicMaxProperLength) continue; // likely background @@ -729,22 +713,43 @@ struct alice3multicharm { histos.fill(HIST("hMassXiCC"), thisXiCCcandidate.mass); histos.fill(HIST("hPtXiCC"), thisXiCCcandidate.pt); histos.fill(HIST("hEtaXiCC"), thisXiCCcandidate.eta); - histos.fill(HIST("h3dXicc"), thisXiCCcandidate.pt, thisXiCCcandidate.eta, thisXiCCcandidate.mass); + histos.fill(HIST("h3dMassXiCC"), thisXiCCcandidate.pt, thisXiCCcandidate.eta, thisXiCCcandidate.mass); // produce multi-charm table for posterior analysis if (fillDerivedTable) { + multiCharmIdx( + xiCand.globalIndex(), + pi1c.globalIndex(), pi2c.globalIndex(), + picc.globalIndex()); + multiCharmCore( thisXiCcandidate.dca, thisXiCCcandidate.dca, thisXiCcandidate.mass, thisXiCCcandidate.mass, thisXiCCcandidate.pt, thisXiCCcandidate.eta, - xi.nSiliconHits(), piFromXi.nSiliconHits(), - piFromLa.nSiliconHits(), prFromLa.nSiliconHits(), - pi1c.nSiliconHits(), pi2c.nSiliconHits(), picc.nSiliconHits(), - piFromXi.nTPCHits(), piFromLa.nTPCHits(), prFromLa.nTPCHits(), - pi1c.nTPCHits(), pi2c.nTPCHits(), picc.nTPCHits(), - xi.dcaXY(), xicdcaXY, xiccdcaXY, - piFromXi.dcaXY(), piFromLa.dcaXY(), prFromLa.dcaXY(), - pi1c.dcaXY(), pi2c.dcaXY(), picc.dcaXY()); + xi.dcaXY(), xi.dcaZ(), + xicdcaXY, xicdcaZ, + xiccdcaXY, xiccdcaZ, + piFromXi.dcaXY(), piFromXi.dcaZ(), + piFromLa.dcaXY(), piFromLa.dcaZ(), + prFromLa.dcaXY(), prFromLa.dcaZ(), + pi1c.dcaXY(), pi1c.dcaZ(), + pi2c.dcaXY(), pi2c.dcaZ(), + picc.dcaXY(), picc.dcaZ(), + xicDecayRadius2D, xiccDecayRadius2D, + xicProperLength, xicDecayDistanceFromPV, + xiccProperLength, + pi1cTOFDiffInner, pi1c.nSigmaPionInnerTOF(), + pi1cTOFDiffOuter, pi1c.nSigmaPionOuterTOF(), + pi2cTOFDiffInner, pi2c.nSigmaPionInnerTOF(), + pi2cTOFDiffOuter, pi2c.nSigmaPionOuterTOF(), + piccTOFDiffInner, picc.nSigmaPionInnerTOF(), + piccTOFDiffOuter, picc.nSigmaPionOuterTOF(), + piFromXi.pt(), piFromXi.eta(), + prFromLa.pt(), prFromLa.eta(), + piFromLa.pt(), piFromLa.eta(), + pi1c.pt(), pi1c.eta(), + pi2c.pt(), pi2c.eta(), + picc.pt(), picc.eta()); } } histos.fill(HIST("hCombinationsXiCC"), nCombinationsCC); @@ -756,13 +761,13 @@ struct alice3multicharm { //*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+* //*>-~-<*>-~-<*>-~-<*>-~-<*>-~-<*>-~-<*>-~-<*>-~-<* - PROCESS_SWITCH(alice3multicharm, processGenerated, "fill MC-only histograms", true); - PROCESS_SWITCH(alice3multicharm, processFindXiCC, "find XiCC baryons", true); + PROCESS_SWITCH(alice3multicharmTable, processGenerated, "fill MC-only histograms", true); + PROCESS_SWITCH(alice3multicharmTable, processFindXiCC, "find XiCC baryons", true); //*>-~-<*>-~-<*>-~-<*>-~-<*>-~-<*>-~-<*>-~-<*>-~-<* }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc)}; + adaptAnalysisTask(cfgc)}; } diff --git a/ALICE3/Tasks/CMakeLists.txt b/ALICE3/Tasks/CMakeLists.txt index ddf9008e667..8fb4c79ea12 100644 --- a/ALICE3/Tasks/CMakeLists.txt +++ b/ALICE3/Tasks/CMakeLists.txt @@ -59,6 +59,11 @@ o2physics_add_dpl_workflow(alice3-taskcorrelationddbar PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(alice3-multicharm + SOURCES alice3-multicharm.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(alice3-efficiency SOURCES alice3Efficiency.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore diff --git a/ALICE3/Tasks/alice3-multicharm.cxx b/ALICE3/Tasks/alice3-multicharm.cxx new file mode 100644 index 00000000000..34276a800b3 --- /dev/null +++ b/ALICE3/Tasks/alice3-multicharm.cxx @@ -0,0 +1,235 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +// +// *+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+* +// Decay finder task for ALICE 3 +// *+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+* +// +// Uses specific ALICE 3 PID and performance for studying +// HF decays. Work in progress: use at your own risk! +// + +#include +#include +#include +#include +#include +#include + +#include "Framework/runDataProcessing.h" +#include "Framework/RunningWorkflowInfo.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/ASoAHelpers.h" +#include "DCAFitter/DCAFitterN.h" +#include "ReconstructionDataFormats/Track.h" +#include "Common/Core/RecoDecay.h" +#include "Common/Core/trackUtilities.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" +#include "PWGLF/DataModel/LFParticleIdentification.h" +#include "Common/Core/TrackSelection.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "DetectorsBase/Propagator.h" +#include "DetectorsBase/GeometryManager.h" +#include "DataFormatsParameters/GRPObject.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "CCDB/BasicCCDBManager.h" +#include "DataFormatsCalibration/MeanVertexObject.h" +#include "ALICE3/DataModel/OTFTOF.h" +#include "ALICE3/DataModel/RICH.h" +#include "ALICE3/DataModel/A3DecayFinderTables.h" +#include "ALICE3/DataModel/OTFStrangeness.h" +#include "ALICE3/DataModel/OTFMulticharm.h" +#include "ALICE3/DataModel/tracksAlice3.h" +#include "DetectorsVertexing/PVertexer.h" +#include "DetectorsVertexing/PVertexerHelpers.h" +#include "CommonConstants/PhysicsConstants.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +using multicharmtracks = soa::Join; + +struct alice3multicharm { + SliceCache cache; + + ConfigurableAxis axisEta{"axisEta", {80, -4.0f, +4.0f}, "#eta"}; + ConfigurableAxis axisXiccMass{"axisXiccMass", {200, 3.521f, 3.721f}, "Xicc Inv Mass (GeV/c^{2})"}; + ConfigurableAxis axisDCA{"axisDCA", {400, 0, 400}, "DCA (#mum)"}; + ConfigurableAxis axisRadiusLarge{"axisRadiusLarge", {1000, 0, 20}, "Decay radius (cm)"}; + ConfigurableAxis axisRadius{"axisRadius", {10000, 0, 10000}, "Decay radius (#mum)"}; + ConfigurableAxis axisTofTrackDelta{"axisTofTrackDelta", {1000, 0, 5000}, "TOF track time"}; + ConfigurableAxis axisDecayLength{"axisDecayLength", {2000, 0, 2000}, "Decay lenght (#mum)"}; + ConfigurableAxis axisDcaDaughters{"axisDcaDaughters", {200, 0, 100}, "DCA (mum)"}; + ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.2f, 2.4f, 2.6f, 2.8f, 3.0f, 3.2f, 3.4f, 3.6f, 3.8f, 4.0f, 4.4f, 4.8f, 5.2f, 5.6f, 6.0f, 6.5f, 7.0f, 7.5f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 17.0f, 19.0f, 21.0f, 23.0f, 25.0f, 30.0f, 35.0f, 40.0f, 50.0f}, "pt axis for QA histograms"}; + + Configurable xiMinDCAxy{"xiMinDCAxy", -1, "[0] in |DCAxy| > [0]+[1]/pT"}; + Configurable xiMinDCAz{"xiMinDCAz", -1, "[0] in |DCAz| > [0]+[1]/pT"}; + Configurable xiMinRadius{"xiMinRadius", -1, "Minimum R2D for Xic decay (cm)"}; + + Configurable picMinDCAxy{"picMinDCAxy", -1, "[0] in |DCAz| > [0]+[1]/pT"}; + Configurable picMinDCAz{"picMinDCAz", -1, "[0] in |DCAxy| > [0]+[1]/pT"}; + Configurable picMaxTofDiffInner{"picTofDiffInner", 1e+4, "|signal - expected| (ps)"}; + Configurable picMinPt{"picMinPt", -1, "Minimum pT for Xic pions"}; + + Configurable piccMinDCAxy{"piccMinDCAxy", -1, "[0] in |DCAxy| > [0]+[1]/pT"}; + Configurable piccMinDCAz{"piccMinDCAz", -1, "[0] in |DCAz| > [0]+[1]/pT"}; + Configurable piccMaxTofDiffInner{"piccMaxTofDiffInner", 1e+4, "|signal - expected| (ps)"}; + Configurable piccMinPt{"piccMinPt", -1, "Minimum pT for Xicc pions"}; + + Configurable xicMaxDauDCA{"xicMaxDauDCA", 1e+4, "DCA between Xic daughters (cm)"}; + Configurable xicMinDCAxy{"xicMinDCAxy", -1, "[0] in |DCAz| > [0]+[1]/pT"}; + Configurable xicMinDCAz{"xicMinDCAz", -1, "[0] in |DCAxy| > [0]+[1]/pT"}; + Configurable xiccMaxDCAxy{"xiccMaxDCAxy", 1e+4, "Maximum DCAxy"}; + Configurable xiccMaxDCAz{"xiccMaxDCAz", 1e+4, "Maximum DCAz"}; + Configurable xicMinRadius{"xicMinRadius", -1, "Minimum R2D for Xic decay (cm)"}; + Configurable xicMinDecayDistanceFromPV{"xicMinDecayDistanceFromPV", -1, "Minimum distance for Xic decay from PV (cm)"}; + Configurable xicMinProperLength{"xicMinProperLength", -1, "Minimum proper length for Xic decay (cm)"}; + Configurable xicMaxProperLength{"xicMaxProperLength", 1e+4, "Minimum proper length for Xic decay (cm)"}; + + Configurable xiccMaxDauDCA{"xiccMaxDauDCA", 1e+4, "DCA between Xicc daughters (cm)"}; + Configurable xiccMinRadius{"xiccMinRadius", -1, "Minimum R2D for Xicc decay (cm)"}; + Configurable xiccMinProperLength{"xiccMinProperLength", -1, "Minimum proper length for Xicc decay (cm)"}; + Configurable xiccMaxProperLength{"xiccMaxProperLength", 1e+4, "Minimum proper length for Xicc decay (cm)"}; + + HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + + void init(InitContext&) + { + histos.add("SelectionQA/hDCAXicDaughters", "hDCAXicDaughters; DCA between Xic daughters (#mum)", kTH1D, {axisDcaDaughters}); + histos.add("SelectionQA/hDCAXiccDaughters", "hDCAXiccDaughters; DCA between Xicc daughters (#mum)", kTH1D, {axisDcaDaughters}); + histos.add("SelectionQA/hDCAxyXi", "hDCAxyXi; Xi DCAxy to PV (#mum)", kTH1D, {axisDCA}); + histos.add("SelectionQA/hDCAzXi", "hDCAzXi; Xi DCAz to PV (#mum)", kTH1D, {axisDCA}); + histos.add("SelectionQA/hDCAxyXic", "hDCAxyXic; Xic DCAxy to PV (#mum)", kTH1D, {axisDCA}); + histos.add("SelectionQA/hDCAzXic", "hDCAzXic; Xic DCAz to PV (#mum)", kTH1D, {axisDCA}); + histos.add("SelectionQA/hDCAxyXicc", "hDCAxyXicc; Xicc DCAxy to PV (#mum)", kTH1D, {axisDCA}); + histos.add("SelectionQA/hDCAzXicc", "hDCAzXicc; Xicc DCAz to PV (#mum)", kTH1D, {axisDCA}); + histos.add("SelectionQA/hPi1cPt", "hPi1cPt; Pi1c pT (Gev/#it(c))", kTH1D, {axisPt}); + histos.add("SelectionQA/hPi2cPt", "hPi2cPt; Pi2c pT (Gev/#it(c))", kTH1D, {axisPt}); + histos.add("SelectionQA/hPiccPt", "hPiccPt; Picc pT (Gev/#it(c))", kTH1D, {axisPt}); + histos.add("SelectionQA/hXicDecayRadius", "hXicDecayRadius; Distance (#mum)", kTH1D, {axisRadius}); + histos.add("SelectionQA/hXiccDecayRadius", "hXiccDecayRadius; Distance (#mum)", kTH1D, {axisRadius}); + histos.add("SelectionQA/hXicDecayDistanceFromPV", "hXicDecayDistanceFromPV; Distance (#mum)", kTH1D, {axisDecayLength}); + histos.add("SelectionQA/hProperLengthXic", "hProperLengthXic; Distance (#mum)", kTH1D, {axisDecayLength}); + histos.add("SelectionQA/hProperLengthXicc", "hProperLengthXicc; Distance (#mum)", kTH1D, {axisDecayLength}); + histos.add("SelectionQA/hInnerTofTimeDeltaPi1c", "hInnerTofTimeDeltaPi1c; Reco - expected pion (ps)", kTH1D, {axisTofTrackDelta}); + histos.add("SelectionQA/hInnerTofTimeDeltaPi2c", "hInnerTofTimeDeltaPi2c; Reco - expected pion (ps)", kTH1D, {axisTofTrackDelta}); + histos.add("SelectionQA/hInnerTofTimeDeltaPicc", "hInnerTofTimeDeltaPicc; Reco - expected pion (ps)", kTH1D, {axisTofTrackDelta}); + + histos.add("XiccProngs/h3dPos", "h3dPos; Xicc pT (GeV/#it(c)); Pos pT (GeV/#it(c)); Pos #eta", kTH3D, {axisPt, axisPt, axisEta}); + histos.add("XiccProngs/h3dNeg", "h3dNeg; Xicc pT (GeV/#it(c)); Neg pT (GeV/#it(c)); Neg #eta", kTH3D, {axisPt, axisPt, axisEta}); + histos.add("XiccProngs/h3dBach", "h3dBach; Xicc pT (GeV/#it(c)); Bach pT (GeV/#it(c)); Bach #eta", kTH3D, {axisPt, axisPt, axisEta}); + histos.add("XiccProngs/h3dPi1c", "h3dPi1c; Xicc pT (GeV/#it(c)); Pi1c pT (GeV/#it(c)); Pi1c #eta", kTH3D, {axisPt, axisPt, axisEta}); + histos.add("XiccProngs/h3dPi2c", "h3dPi2c; Xicc pT (GeV/#it(c)); Pi2c pT (GeV/#it(c)); Pi2c #eta", kTH3D, {axisPt, axisPt, axisEta}); + histos.add("XiccProngs/h3dPicc", "h3dPicc; Xicc pT (GeV/#it(c)); Picc pT (GeV/#it(c)); Picc #eta", kTH3D, {axisPt, axisPt, axisEta}); + histos.add("h3dXicc", "h3dXicc; Xicc pT (GeV/#it(c)); Xicc #eta; Xicc mass (GeV/#it(c)^{2})", kTH3D, {axisPt, axisEta, axisXiccMass}); + } + + void processXicc(multicharmtracks const& multiCharmTracks) + { + for (const auto& xiccCand : multiCharmTracks) { + if (xiccCand.xicDauDCA() > xicMaxDauDCA || xiccCand.xiccDauDCA() > xiccMaxDauDCA) + continue; + + if (std::fabs(xiccCand.xiDCAxy()) < xiMinDCAxy || std::fabs(xiccCand.xiDCAz()) < xiMinDCAz) + continue; + + if (std::fabs(xiccCand.pi1cDCAxy()) < picMinDCAxy || std::fabs(xiccCand.pi1cDCAz()) < picMinDCAz) + continue; + + if (std::fabs(xiccCand.pi2cDCAxy()) < picMinDCAxy || std::fabs(xiccCand.pi2cDCAz()) < picMinDCAz) + continue; + + if (std::fabs(xiccCand.piccDCAxy()) < piccMinDCAxy || std::fabs(xiccCand.piccDCAz()) < piccMinDCAz) + continue; + + if (std::fabs(xiccCand.xicDCAxy()) < xicMinDCAxy || std::fabs(xiccCand.xicDCAz()) < xicMinDCAz) + continue; + + if (std::fabs(xiccCand.pi1cDCAxy()) < picMinDCAxy || std::fabs(xiccCand.pi1cDCAz()) < picMinDCAz) + continue; + + if (std::fabs(xiccCand.pi2cDCAxy()) < picMinDCAxy || std::fabs(xiccCand.pi2cDCAz()) < picMinDCAz) + continue; + + if (std::fabs(xiccCand.xiccDCAxy()) > xiccMaxDCAxy || std::fabs(xiccCand.xiccDCAz()) > xiccMaxDCAz) + continue; + + // Cut on time delta as LoI for now + if (xiccCand.pi1cTofDeltaInner() > picMaxTofDiffInner) + continue; + + if (xiccCand.pi2cTofDeltaInner() > picMaxTofDiffInner) + continue; + + if (xiccCand.piccTofDeltaInner() > piccMaxTofDiffInner) + continue; + + if (xiccCand.pi1cPt() < picMinPt || xiccCand.pi2cPt() < picMinPt) + continue; + + if (xiccCand.piccPt() < piccMinPt) + continue; + + if (xiccCand.xicDecayRadius2D() < xicMinRadius) + continue; + + if (xiccCand.xiccDecayRadius2D() < xiccMinRadius) + continue; + + if (xiccCand.xicProperLength() < xicMinProperLength || xiccCand.xicProperLength() > xicMaxProperLength) + continue; + + if (xiccCand.xiccProperLength() < xiccMinProperLength || xiccCand.xiccProperLength() > xiccMaxProperLength) + continue; + + if (xiccCand.xicDistanceFromPV() < xicMinDecayDistanceFromPV) + continue; + + histos.fill(HIST("SelectionQA/hDCAXicDaughters"), xiccCand.xicDauDCA() * 1e+4); + histos.fill(HIST("SelectionQA/hDCAXiccDaughters"), xiccCand.xiccDauDCA() * 1e+4); + histos.fill(HIST("SelectionQA/hDCAxyXi"), std::fabs(xiccCand.xiDCAxy() * 1e+4)); + histos.fill(HIST("SelectionQA/hDCAzXi"), std::fabs(xiccCand.xiDCAz() * 1e+4)); + histos.fill(HIST("SelectionQA/hDCAxyXic"), std::fabs(xiccCand.xicDCAxy() * 1e+4)); + histos.fill(HIST("SelectionQA/hDCAzXic"), std::fabs(xiccCand.xicDCAz() * 1e+4)); + histos.fill(HIST("SelectionQA/hDCAxyXicc"), std::fabs(xiccCand.xiccDCAxy() * 1e+4)); + histos.fill(HIST("SelectionQA/hDCAzXicc"), std::fabs(xiccCand.xiccDCAz() * 1e+4)); + histos.fill(HIST("SelectionQA/hPi1cPt"), xiccCand.pi1cPt()); + histos.fill(HIST("SelectionQA/hPi2cPt"), xiccCand.pi2cPt()); + histos.fill(HIST("SelectionQA/hPiccPt"), xiccCand.piccPt()); + histos.fill(HIST("SelectionQA/hXicDecayRadius"), xiccCand.xicDecayRadius2D() * 1e+4); + histos.fill(HIST("SelectionQA/hXiccDecayRadius"), xiccCand.xiccDecayRadius2D() * 1e+4); + histos.fill(HIST("SelectionQA/hXicDecayDistanceFromPV"), xiccCand.xicDistanceFromPV() * 1e+4); + histos.fill(HIST("SelectionQA/hProperLengthXic"), xiccCand.xicProperLength() * 1e+4); + histos.fill(HIST("SelectionQA/hProperLengthXicc"), xiccCand.xiccProperLength() * 1e+4); + histos.fill(HIST("SelectionQA/hInnerTofTimeDeltaPi1c"), xiccCand.pi1cTofDeltaInner()); + histos.fill(HIST("SelectionQA/hInnerTofTimeDeltaPi2c"), xiccCand.pi2cTofDeltaInner()); + histos.fill(HIST("SelectionQA/hInnerTofTimeDeltaPicc"), xiccCand.piccTofDeltaInner()); + + histos.fill(HIST("XiccProngs/h3dNeg"), xiccCand.pt(), xiccCand.negPt(), xiccCand.negEta()); + histos.fill(HIST("XiccProngs/h3dPos"), xiccCand.pt(), xiccCand.posPt(), xiccCand.posEta()); + histos.fill(HIST("XiccProngs/h3dBach"), xiccCand.pt(), xiccCand.bachPt(), xiccCand.bachEta()); + histos.fill(HIST("XiccProngs/h3dPi1c"), xiccCand.pt(), xiccCand.pi1cPt(), xiccCand.pi1cEta()); + histos.fill(HIST("XiccProngs/h3dPi2c"), xiccCand.pt(), xiccCand.pi2cPt(), xiccCand.pi2cEta()); + histos.fill(HIST("XiccProngs/h3dPicc"), xiccCand.pt(), xiccCand.piccPt(), xiccCand.piccEta()); + histos.fill(HIST("h3dXicc"), xiccCand.pt(), xiccCand.eta(), xiccCand.xiccMass()); + } + } + + PROCESS_SWITCH(alice3multicharm, processXicc, "find Xicc baryons", true); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc)}; +} From 39af4a6669c9cf5742b9c06b1b5996130aeaa70f Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Tue, 3 Jun 2025 03:38:20 +0800 Subject: [PATCH 1491/1650] [PWGLF] feat: Add nuclei pair table to data model (#11444) --- PWGLF/DataModel/LFSlimNucleiTables.h | 43 ++++++++++++++++++++ PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx | 24 ++++++++--- 2 files changed, 61 insertions(+), 6 deletions(-) diff --git a/PWGLF/DataModel/LFSlimNucleiTables.h b/PWGLF/DataModel/LFSlimNucleiTables.h index 28067a9521b..fe23bbcae5b 100644 --- a/PWGLF/DataModel/LFSlimNucleiTables.h +++ b/PWGLF/DataModel/LFSlimNucleiTables.h @@ -53,6 +53,29 @@ DECLARE_SOA_COLUMN(SurvivedEventSelection, survivedEventSelection, bool); DECLARE_SOA_COLUMN(AbsoDecL, absoDecL, float); } // namespace NucleiTableNS + +namespace NucleiPairTableNS +{ +DECLARE_SOA_COLUMN(Pt1, pt1, float); // first particle pt +DECLARE_SOA_COLUMN(Eta1, eta1, float); // first particle eta +DECLARE_SOA_COLUMN(Phi1, phi1, float); // first particle phi +DECLARE_SOA_COLUMN(TPCInnerParam1, tpcInnerParam1, float); // first particle TPC inner param +DECLARE_SOA_COLUMN(TPCsignal1, tpcSignal1, float); // first particle TPC signal +DECLARE_SOA_COLUMN(DCAxy1, dcaxy1, float); // first particle DCA xy +DECLARE_SOA_COLUMN(DCAz1, dcaz1, float); // first particle DCA z +DECLARE_SOA_COLUMN(ClusterSizesITS1, clusterSizesITS1, uint32_t); // first particle ITS cluster sizes +DECLARE_SOA_COLUMN(Flags1, flags1, uint16_t); // first particle flags +DECLARE_SOA_COLUMN(Pt2, pt2, float); // second particle pt +DECLARE_SOA_COLUMN(Eta2, eta2, float); // second particle eta +DECLARE_SOA_COLUMN(Phi2, phi2, float); // second particle phi +DECLARE_SOA_COLUMN(TPCInnerParam2, tpcInnerParam2, float); // second particle TPC inner param +DECLARE_SOA_COLUMN(TPCsignal2, tpcSignal2, float); // second particle TPC signal +DECLARE_SOA_COLUMN(DCAxy2, dcaxy2, float); // second particle DCA xy +DECLARE_SOA_COLUMN(DCAz2, dcaz2, float); // second particle DCA z +DECLARE_SOA_COLUMN(ClusterSizesITS2, clusterSizesITS2, uint32_t); // second particle ITS cluster sizes +DECLARE_SOA_COLUMN(Flags2, flags2, uint16_t); // second particle flags +} // namespace NucleiPairTableNS + namespace NucleiFlowTableNS { DECLARE_SOA_COLUMN(CentFV0A, centFV0A, float); // centrality with FT0A estimator @@ -136,6 +159,26 @@ DECLARE_SOA_TABLE(NucleiTableMC, "AOD", "NUCLEITABLEMC", NucleiTableNS::SurvivedEventSelection, NucleiTableNS::AbsoDecL); +DECLARE_SOA_TABLE(NucleiPairTable, "AOD", "NUCLEIPAIRTABLE", + NucleiPairTableNS::Pt1, + NucleiPairTableNS::Eta1, + NucleiPairTableNS::Phi1, + NucleiPairTableNS::TPCInnerParam1, + NucleiPairTableNS::TPCsignal1, + NucleiPairTableNS::DCAxy1, + NucleiPairTableNS::DCAz1, + NucleiPairTableNS::ClusterSizesITS1, + NucleiPairTableNS::Flags1, + NucleiPairTableNS::Pt2, + NucleiPairTableNS::Eta2, + NucleiPairTableNS::Phi2, + NucleiPairTableNS::TPCInnerParam2, + NucleiPairTableNS::TPCsignal2, + NucleiPairTableNS::DCAxy2, + NucleiPairTableNS::DCAz2, + NucleiPairTableNS::ClusterSizesITS2, + NucleiPairTableNS::Flags2); + } // namespace o2::aod #endif // PWGLF_DATAMODEL_LFSLIMNUCLEITABLES_H_ diff --git a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx index 2494942e9c3..ecf322306d2 100644 --- a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx +++ b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx @@ -267,6 +267,7 @@ struct nucleiSpectra { }; Produces nucleiTable; + Produces nucleiPairTable; Produces nucleiTableMC; Produces nucleiTableFlow; Service ccdb; @@ -297,6 +298,7 @@ struct nucleiSpectra { Configurable> cfgDCAcut{"cfgDCAcut", {nuclei::DCAcutDefault[0], 5, 2, nuclei::names, nuclei::nDCAConfigName}, "Max DCAxy and DCAz for light nuclei"}; Configurable> cfgDownscaling{"cfgDownscaling", {nuclei::DownscalingDefault[0], 5, 1, nuclei::names, nuclei::DownscalingConfigName}, "Fraction of kept candidates for light nuclei"}; Configurable> cfgTreeConfig{"cfgTreeConfig", {nuclei::TreeConfigDefault[0], 5, 2, nuclei::names, nuclei::treeConfigNames}, "Filtered trees configuration"}; + Configurable cfgFillPairTree{"cfgFillPairTree", true, "Fill trees for pairs of light nuclei"}; Configurable> cfgDCAHists{"cfgDCAHists", {nuclei::DCAHistDefault[0], 5, 2, nuclei::names, nuclei::DCAConfigNames}, "DCA hist configuration"}; Configurable> cfgFlowHist{"cfgFlowHist", {nuclei::FlowHistDefault[0], 5, 1, nuclei::names, nuclei::flowConfigNames}, "Flow hist configuration"}; @@ -833,14 +835,24 @@ struct nucleiSpectra { } fillDataInfo(collision, tracks); - for (auto& c : nuclei::candidates) { - if (c.fillTree) { - nucleiTable(c.pt, c.eta, c.phi, c.tpcInnerParam, c.beta, c.zVertex, c.DCAxy, c.DCAz, c.TPCsignal, c.ITSchi2, c.TPCchi2, c.TOFchi2, c.flags, c.TPCfindableCls, c.TPCcrossedRows, c.ITSclsMap, c.TPCnCls, c.TPCnClsShared, c.clusterSizesITS); + for (size_t i1{0}; i1 < nuclei::candidates.size(); ++i1) { + auto& c1 = nuclei::candidates[i1]; + if (c1.fillTree) { + nucleiTable(c1.pt, c1.eta, c1.phi, c1.tpcInnerParam, c1.beta, c1.zVertex, c1.DCAxy, c1.DCAz, c1.TPCsignal, c1.ITSchi2, c1.TPCchi2, c1.TOFchi2, c1.flags, c1.TPCfindableCls, c1.TPCcrossedRows, c1.ITSclsMap, c1.TPCnCls, c1.TPCnClsShared, c1.clusterSizesITS); + if (cfgFillPairTree) { + for (size_t i2{i1 + 1}; i2 < nuclei::candidates.size(); ++i2) { + auto& c2 = nuclei::candidates[i2]; + if (!c2.fillTree || ((c1.flags & c2.flags) & 0x1F) == 0) { + continue; + } + nucleiPairTable(c1.pt, c1.eta, c1.phi, c1.tpcInnerParam, c1.TPCsignal, c1.DCAxy, c1.DCAz, c1.clusterSizesITS, c1.flags, c2.pt, c2.eta, c2.phi, c2.tpcInnerParam, c2.TPCsignal, c2.DCAxy, c2.DCAz, c2.clusterSizesITS, c2.flags); + } + } } - if (c.fillDCAHist) { + if (c1.fillDCAHist) { for (int iS{0}; iS < nuclei::species; ++iS) { - if (c.flags & BIT(iS)) { - nuclei::hDCAHists[c.pt < 0][iS]->Fill(std::abs(c.pt), c.DCAxy, c.DCAz, c.nSigmaTPC[iS], c.tofMasses[iS], c.ITSnCls, c.TPCnCls); + if (c1.flags & BIT(iS)) { + nuclei::hDCAHists[c1.pt < 0][iS]->Fill(std::abs(c1.pt), c1.DCAxy, c1.DCAz, c1.nSigmaTPC[iS], c1.tofMasses[iS], c1.ITSnCls, c1.TPCnCls); } } } From 99ff1c3042df2aa8eb8f799e8b7633fd9e0c92e8 Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Tue, 3 Jun 2025 05:23:27 +0800 Subject: [PATCH 1492/1650] [PWGCF] add eta-pt-Vz efficiency (#11436) --- PWGCF/Flow/Tasks/flowPtEfficiency.cxx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/PWGCF/Flow/Tasks/flowPtEfficiency.cxx b/PWGCF/Flow/Tasks/flowPtEfficiency.cxx index 0e272eb78a1..78dbc0fc731 100644 --- a/PWGCF/Flow/Tasks/flowPtEfficiency.cxx +++ b/PWGCF/Flow/Tasks/flowPtEfficiency.cxx @@ -145,18 +145,22 @@ struct FlowPtEfficiency { void init(InitContext const&) { + const AxisSpec axisVertex{20, -10, 10, "Vtxz (cm)"}; + const AxisSpec axisEta{20, -1., 1., "#eta"}; const AxisSpec axisCounter{1, 0, +1, ""}; // create histograms registry.add("eventCounter", "eventCounter", kTH1F, {axisCounter}); registry.add("hPtMCRec", "Monte Carlo Reco", {HistType::kTH1D, {axisPt}}); registry.add("hPtNchMCRec", "Reco production; pT (GeV/c); multiplicity", {HistType::kTH2D, {axisPt, axisNch}}); registry.add("hBVsPtVsPhiRec", "hBVsPtVsPhiRec", HistType::kTH3D, {axisB, axisPhi, axisPt}); + registry.add("hEtaPtVzRec", "hEtaPtVz Reconstructed", HistType::kTH3D, {axisEta, axisPt, axisVertex}); registry.add("mcEventCounter", "Monte Carlo Truth EventCounter", kTH1F, {axisCounter}); registry.add("hPtMCGen", "Monte Carlo Truth", {HistType::kTH1D, {axisPt}}); registry.add("hPtNchMCGen", "Truth production; pT (GeV/c); multiplicity", {HistType::kTH2D, {axisPt, axisNch}}); registry.add("numberOfRecoCollisions", "numberOfRecoCollisions", kTH1F, {{10, -0.5f, 9.5f}}); registry.add("hBVsPtVsPhiTrue", "hBVsPtVsPhiTrue", HistType::kTH3D, {axisB, axisPhi, axisPt}); + registry.add("hEtaPtVzTrue", "hEtaPtVz True", HistType::kTH3D, {axisEta, axisPt, axisVertex}); if (cfgFlowEnabled) { registry.add("hImpactParameterReco", "hImpactParameterReco", {HistType::kTH1D, {axisB}}); @@ -406,6 +410,7 @@ struct FlowPtEfficiency { if (isStable(mcParticle.pdgCode())) { registry.fill(HIST("hPtMCRec"), track.pt()); registry.fill(HIST("hPtNchMCRec"), track.pt(), tracks.size()); + registry.fill(HIST("hEtaPtVzRec"), track.eta(), track.pt(), vtxz); if (cfgFlowEnabled) { float deltaPhi = RecoDecay::constrainAngle(track.phi() - evPhi); @@ -462,6 +467,7 @@ struct FlowPtEfficiency { float lRandom = fRndm->Rndm(); float wacc = 1.0f; float weff = 1.0f; + float vtxz = mcCollision.posZ(); if (collisions.size() > -1) { registry.fill(HIST("mcEventCounter"), 0.5); @@ -477,8 +483,10 @@ struct FlowPtEfficiency { for (const auto& mcParticle : mcParticles) { if (mcParticle.isPhysicalPrimary() && isStable(mcParticle.pdgCode())) { registry.fill(HIST("hPtMCGen"), mcParticle.pt()); - if (collisions.size() > 0) + if (collisions.size() > 0) { registry.fill(HIST("hPtNchMCGen"), mcParticle.pt(), numberOfTracks[0]); + } + registry.fill(HIST("hEtaPtVzTrue"), mcParticle.eta(), mcParticle.pt(), vtxz); if (cfgFlowEnabled) { float deltaPhi = RecoDecay::constrainAngle(mcParticle.phi() - evPhi); From 9ff6ef1bc6b89c75f698390e07b7b6725d6a49a4 Mon Sep 17 00:00:00 2001 From: Francesco Mazzaschi <43742195+fmazzasc@users.noreply.github.com> Date: Tue, 3 Jun 2025 00:54:19 +0200 Subject: [PATCH 1493/1650] Add QA histogram for non-prompt nuclei (#11437) Co-authored-by: Francesco Mazzaschi --- PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx index ecf322306d2..712e3611013 100644 --- a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx +++ b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx @@ -516,6 +516,7 @@ struct nucleiSpectra { spectra.add("hTpcSignalData", "Specific energy loss", HistType::kTH2F, {{600, -6., 6., "#it{p} (GeV/#it{c})"}, {1400, 0, 1400, "d#it{E} / d#it{X} (a. u.)"}}); spectra.add("hTpcSignalDataSelected", "Specific energy loss for selected particles", HistType::kTH2F, {{600, -6., 6., "#it{p} (GeV/#it{c})"}, {1400, 0, 1400, "d#it{E} / d#it{X} (a. u.)"}}); spectra.add("hTofSignalData", "TOF beta", HistType::kTH2F, {{500, 0., 5., "#it{p} (GeV/#it{c})"}, {750, 0, 1.5, "TOF #beta"}}); + spectra.add("hMCDCAxyVsDecRadius", "DCA xy vs DecayRadius", HistType::kTH2F, {{20, 0., 0.2, "Decay radius"}, {150, -0.05, 0.05, "DCA_{xy} (cm)"}}); for (int iC{0}; iC < 2; ++iC) { nuclei::hGloTOFtracks[iC] = spectra.add(fmt::format("hTPCTOFtracks{}", nuclei::matter[iC]).data(), fmt::format("Global vs TOF matched {} tracks in a collision", nuclei::chargeLabelNames[iC]).data(), HistType::kTH2D, {{300, -0.5, 300.5, "Number of global tracks"}, {300, -0.5, 300.5, "Number of TOF matched tracks"}}); @@ -991,6 +992,8 @@ struct nucleiSpectra { if (std::find(nuclei::hfMothCodes.begin(), nuclei::hfMothCodes.end(), std::abs(motherparticle.pdgCode())) != nuclei::hfMothCodes.end()) { c.flags |= kIsSecondaryFromWeakDecay; MotherpdgCode = motherparticle.pdgCode(); + float decRadius = std::hypot(particle.vx() - motherparticle.vx(), particle.vy() - motherparticle.vy()); + spectra.fill(HIST("hMCDCAxyVsDecRadius"), decRadius, c.DCAxy); break; } } From 4d167676f934d3243e960e7e0e8372a21d70bb70 Mon Sep 17 00:00:00 2001 From: Anantha Padmanabhan M Nair <82643666+ananthapadmanabhan18@users.noreply.github.com> Date: Tue, 3 Jun 2025 05:57:02 +0530 Subject: [PATCH 1494/1650] [PWGUD] Updated the Event Selection (#11443) --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 33 ++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index 238ecac1245..14ffcc415a4 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -44,7 +44,6 @@ namespace o2::aod { namespace branch { - // vertex Position DECLARE_SOA_COLUMN(PosX, posX, double); DECLARE_SOA_COLUMN(PosY, posY, double); @@ -68,6 +67,9 @@ DECLARE_SOA_COLUMN(TimeFddc, timeFddc, double); DECLARE_SOA_COLUMN(TimeZna, timeZna, double); DECLARE_SOA_COLUMN(TimeZnc, timeZnc, double); +// Occupancy +DECLARE_SOA_COLUMN(Occupancy, occupancy, double); + // DCA DECLARE_SOA_COLUMN(Dcaxy1, dcaxy1, double); DECLARE_SOA_COLUMN(Dcaxy2, dcaxy2, double); @@ -182,6 +184,8 @@ DECLARE_SOA_TABLE(SignalData, "AOD", "signalData", branch::TimeZna, branch::TimeZnc, + branch::Occupancy, + branch::Dcaxy1, branch::Dcaxy2, branch::Dcaxy3, @@ -282,6 +286,8 @@ DECLARE_SOA_TABLE(BkgroundData, "AOD", "bkgroundData", branch::TimeZna, branch::TimeZnc, + branch::Occupancy, + branch::Dcaxy1, branch::Dcaxy2, branch::Dcaxy3, @@ -408,6 +414,8 @@ DECLARE_SOA_TABLE(SignalMCreco, "AOD", "SignalMCreco", branch::TimeZna, branch::TimeZnc, + branch::Occupancy, + branch::Dcaxy1, branch::Dcaxy2, branch::Dcaxy3, @@ -512,7 +520,7 @@ struct ExclusiveRhoTo4Pi { Configurable ft0aCut{"ft0aCut", 150., "FT0A threshold"}; Configurable ft0cCut{"ft0cCut", 50., "FT0C threshold"}; Configurable zdcCut{"zdcCut", 1., "ZDC threshold"}; - Configurable occupancyCut{"occupancyCut", 1000, "Occupancy Cut"}; + // Configurable occupancyCut{"occupancyCut", 1000, "Occupancy Cut"}; Configurable pvCut{"pvCut", 1.0, "Use Only PV tracks"}; Configurable numPVContrib{"numPVContrib", 4, "Number of PV Contributors"}; @@ -837,7 +845,6 @@ struct ExclusiveRhoTo4Pi { Filter vertexCut = (nabs(o2::aod::collision::posZ) <= vZCut) && (o2::aod::collision::numContrib == numPVContrib); Filter fitcuts = o2::aod::udcollision::totalFV0AmplitudeA < fv0Cut && o2::aod::udcollision::totalFT0AmplitudeA < ft0aCut && o2::aod::udcollision::totalFT0AmplitudeC < ft0cCut; Filter zdcCuts = (o2::aod::udzdc::energyCommonZNA < zdcCut) && (o2::aod::udzdc::energyCommonZNC < zdcCut); - Filter occupCut = nabs(o2::aod::udcollision::occupancyInTime) < occupancyCut; using UDtracks = soa::Join; using UDCollisions = soa::Filtered>; // using UDCollision = UDCollisions::iterator; @@ -923,6 +930,18 @@ struct ExclusiveRhoTo4Pi { return; } + // Check if there is at least one track with TOF in the selected events, otherwise return + bool hasAtleastOneTOF = false; + for (int i = 0; i < numPiPlusTracks; i++) { + if (selectedPionPlusTracks[i].hasTOF() == true) { + hasAtleastOneTOF = true; + break; + } + } + if (!hasAtleastOneTOF) { + return; + } + // Selecting Events with net charge = 0 if (numPionMinusTracks == numPiMinus && numPiPlusTracks == numPiPlus) { @@ -964,7 +983,7 @@ struct ExclusiveRhoTo4Pi { sigFromData( collision.posX(), collision.posY(), collision.posZ(), collision.totalFV0AmplitudeA(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), - collision.timeFV0A(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFDDA(), collision.timeFDDC(), collision.timeZNA(), collision.timeZNC(), + collision.timeFV0A(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFDDA(), collision.timeFDDC(), collision.timeZNA(), collision.timeZNC(), collision.occupancyInTime(), selectedPionPlusTracks[0].dcaXY(), selectedPionPlusTracks[1].dcaXY(), selectedPionMinusTracks[0].dcaXY(), selectedPionMinusTracks[1].dcaXY(), selectedPionPlusTracks[0].dcaZ(), selectedPionPlusTracks[1].dcaZ(), selectedPionMinusTracks[0].dcaZ(), selectedPionMinusTracks[1].dcaZ(), @@ -1037,7 +1056,7 @@ struct ExclusiveRhoTo4Pi { collision.posX(), collision.posY(), collision.posZ(), collision.totalFV0AmplitudeA(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), collision.timeFV0A(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFDDA(), collision.timeFDDC(), - collision.timeZNA(), collision.timeZNC(), + collision.timeZNA(), collision.timeZNC(), collision.occupancyInTime(), selectedPionTracks[0].dcaXY(), selectedPionTracks[1].dcaXY(), selectedPionTracks[0].dcaXY(), selectedPionTracks[1].dcaXY(), selectedPionTracks[0].dcaZ(), selectedPionTracks[1].dcaZ(), selectedPionTracks[0].dcaZ(), selectedPionTracks[1].dcaZ(), selectedPionTracks[0].tpcNSigmaPi(), selectedPionTracks[1].tpcNSigmaPi(), selectedPionTracks[0].tpcNSigmaPi(), selectedPionTracks[1].tpcNSigmaPi(), @@ -1174,7 +1193,7 @@ struct ExclusiveRhoTo4Pi { PROCESS_SWITCH(ExclusiveRhoTo4Pi, processMCgen, "The Process for 4 Pion Analysis from MC Generation", false); // Begin of MC Reconstruction function----------------------------------------------------------------------------------------------------------------------------------------------- - using CollisionStuff = soa::Filtered>; + using CollisionStuff = soa::Filtered>; using CollisionTotal = CollisionStuff::iterator; using TrackStuff = soa::Join; @@ -1303,7 +1322,7 @@ struct ExclusiveRhoTo4Pi { collision.posX(), collision.posY(), collision.posZ(), collision.totalFV0AmplitudeA(), collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), collision.timeFV0A(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFDDA(), collision.timeFDDC(), - collision.timeZNA(), collision.timeZNC(), + collision.timeZNA(), collision.timeZNC(), collision.occupancyInTime(), selectedPionPlusTracks[0].dcaXY(), selectedPionPlusTracks[1].dcaXY(), selectedPionMinusTracks[0].dcaXY(), selectedPionMinusTracks[1].dcaXY(), selectedPionPlusTracks[0].dcaZ(), selectedPionPlusTracks[1].dcaZ(), selectedPionMinusTracks[0].dcaZ(), selectedPionMinusTracks[1].dcaZ(), selectedPionPlusTracks[0].tpcNSigmaPi(), selectedPionPlusTracks[1].tpcNSigmaPi(), selectedPionMinusTracks[0].tpcNSigmaPi(), selectedPionMinusTracks[1].tpcNSigmaPi(), From 399bd4d1f66cea0a3555b5ef9ec0dec946c66bc8 Mon Sep 17 00:00:00 2001 From: omvazque Date: Mon, 2 Jun 2025 23:18:29 -0500 Subject: [PATCH 1495/1650] [PWGLF] Adds extra pt cutoff for the moments (#11450) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 24 +++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index 5bbfb186eb2..7da02f51416 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -96,7 +96,8 @@ struct UccZdc { // Track-kinematics selection Configurable minPt{"minPt", 0.1, "minimum pt of the tracks"}; - Configurable maxPt{"maxPt", 50., "maximum pt of the tracks"}; + Configurable maxPt{"maxPt", 3., "maximum pt of the tracks"}; + Configurable maxPtSpectra{"maxPtSpectra", 50., "maximum pt of the tracks"}; Configurable minEta{"minEta", -0.8, "minimum eta"}; Configurable maxEta{"maxEta", +0.8, "maximum eta"}; @@ -150,8 +151,7 @@ struct UccZdc { Zem }; - // Filter trackFilter = ((aod::track::eta > minEta) && (aod::track::eta < maxEta) && (aod::track::pt > minPt) && (aod::track::pt < maxPt) && requireGlobalTrackInFilter()); - Filter trackFilter = ((aod::track::eta > minEta) && (aod::track::eta < maxEta) && (aod::track::pt > minPt) && (aod::track::pt < maxPt)); + Filter trackFilter = ((aod::track::eta > minEta) && (aod::track::eta < maxEta)); // Apply Filters using TheFilteredTracks = soa::Filtered; @@ -296,6 +296,9 @@ struct UccZdc { LOG(info) << "\tuseMidRapNchSel=" << useMidRapNchSel.value; LOG(info) << "\tpaTHmeanNch=" << paTHmeanNch.value; LOG(info) << "\tpaTHsigmaNch=" << paTHsigmaNch.value; + LOG(info) << "\tminPt=" << minPt.value; + LOG(info) << "\tmaxPt=" << maxPt.value; + LOG(info) << "\tmaxPtSpectra=" << maxPtSpectra.value; ccdb->setURL("http://alice-ccdb.cern.ch"); // Enabling object caching, otherwise each call goes to the CCDB server @@ -473,6 +476,9 @@ struct UccZdc { if (!track.isGlobalTrack()) { continue; } + if ((track.pt() < minPt) || (track.pt() > maxPt)) { + continue; + } glbTracks++; } @@ -513,6 +519,9 @@ struct UccZdc { if (!track.isGlobalTrack()) { continue; } + if ((track.pt() < minPt) || (track.pt() > maxPtSpectra)) { + continue; + } registry.fill(HIST("ZposVsEta"), collision.posZ(), track.eta()); registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); @@ -635,6 +644,9 @@ struct UccZdc { if (!track.isGlobalTrack()) { continue; } + if ((track.pt() < minPt) || (track.pt() > maxPt)) { + continue; + } registry.fill(HIST("ZposVsEta"), collision.posZ(), track.eta()); registry.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); registry.fill(HIST("sigma1Pt"), track.pt(), track.sigma1Pt()); @@ -687,6 +699,9 @@ struct UccZdc { if (!track.isGlobalTrack()) { continue; } + if ((track.pt() < minPt) || (track.pt() > maxPtSpectra)) { + continue; + } float pt{track.pt()}; double weight{1.}; @@ -713,6 +728,9 @@ struct UccZdc { if (!track.isGlobalTrack()) { continue; } + if ((track.pt() < minPt) || (track.pt() > maxPtSpectra)) { + continue; + } registry.fill(HIST("NchVsZNVsPt"), w1, sumZNs, track.pt()); } From 9ae137c5d6d079913fee460f81eb93b39c5b3586 Mon Sep 17 00:00:00 2001 From: Fabio Colamaria Date: Tue, 3 Jun 2025 11:51:16 +0200 Subject: [PATCH 1496/1650] [ALICE3] Completing separation of topological distribution for S and B (#11453) Co-authored-by: fcolamar --- ALICE3/TableProducer/alice3-decayfinder.cxx | 106 +++++++++++--------- 1 file changed, 58 insertions(+), 48 deletions(-) diff --git a/ALICE3/TableProducer/alice3-decayfinder.cxx b/ALICE3/TableProducer/alice3-decayfinder.cxx index 73eb406295f..83f1998bf38 100644 --- a/ALICE3/TableProducer/alice3-decayfinder.cxx +++ b/ALICE3/TableProducer/alice3-decayfinder.cxx @@ -428,12 +428,18 @@ struct alice3decayFinder { if (doDCAplotsD) { histos.add("hDCADDaughters", "hDCADDaughters", kTH1D, {axisDCADaughters}); histos.add("hDCADbarDaughters", "hDCADbarDaughters", kTH1D, {axisDCADaughters}); - histos.add("hDCADDaughters_Selected", "hDCADDaughters", kTH1D, {axisDCADaughters}); - histos.add("hDCADbarDaughters_Selected", "hDCADbarDaughters", kTH1D, {axisDCADaughters}); + histos.add("hDCADDaughters_Selected", "hDCADDaughters_Selected", kTH1D, {axisDCADaughters}); + histos.add("hDCADbarDaughters_Selected", "hDCADbarDaughters_Selected", kTH1D, {axisDCADaughters}); histos.add("h2dDCAxyVsPtPiPlusFromD", "h2dDCAxyVsPtPiPlusFromD", kTH2F, {axisPt, axisDCA}); histos.add("h2dDCAxyVsPtPiMinusFromD", "h2dDCAxyVsPtPiMinusFromD", kTH2F, {axisPt, axisDCA}); histos.add("h2dDCAxyVsPtKaPlusFromD", "h2dDCAxyVsPtKaPlusFromD", kTH2F, {axisPt, axisDCA}); histos.add("h2dDCAxyVsPtKaMinusFromD", "h2dDCAxyVsPtKaMinusFromD", kTH2F, {axisPt, axisDCA}); + if (doTopoPlotsForSAndB) { + histos.add("hDCADDaughters_Signal", "hDCADDaughters_Signal", kTH1D, {axisDCADaughters}); + histos.add("hDCADDaughters_Bkg", "hDCADDaughters_Bkg", kTH1D, {axisDCADaughters}); + histos.add("hDCADbarDaughters_Signal", "hDCADbarDaughters_Signal", kTH1D, {axisDCADaughters}); + histos.add("hDCADbarDaughters_Bkg", "hDCADbarDaughters_Bkg", kTH1D, {axisDCADaughters}); + } } } if (doprocessFindLcBaryons) { @@ -532,29 +538,31 @@ struct alice3decayFinder { if (doDCAplotsD) histos.fill(HIST("hDCADDaughters"), dmeson.dcaDau * 1e+4); - if (doTopoPlotsForSAndB) { // fill plots of topological variables for S and B separately (reflections not considered here) - histos.fill(HIST("hDCosPA_Signal"), dmeson.cosPA); - histos.fill(HIST("hDCosPAxy_Signal"), dmeson.cosPAxy); - histos.fill(HIST("hDCosThetaStar_Signal"), dmeson.cosThetaStar); - histos.fill(HIST("hDDecayLength_Signal"), decayLength); - histos.fill(HIST("hDDecayLengthXY_Signal"), decayLengthXY); - histos.fill(HIST("hDNormDecayLength_Signal"), dmeson.normalizedDecayLength); - histos.fill(HIST("hImpParPi_Signal"), impParXY_daugPos); - histos.fill(HIST("hImpParK_Signal"), impParXY_daugNeg); - histos.fill(HIST("hImpParProduct_Signal"), impParXY_daugPos * impParXY_daugNeg); - histos.fill(HIST("hDCosPA_Bkg"), dmeson.cosPA); - histos.fill(HIST("hDCosPAxy_Bkg"), dmeson.cosPAxy); - histos.fill(HIST("hDCosThetaStar_Bkg"), dmeson.cosThetaStar); - histos.fill(HIST("hDDecayLength_Bkg"), decayLength); - histos.fill(HIST("hDDecayLengthXY_Bkg"), decayLengthXY); - histos.fill(HIST("hDNormDecayLength_Bkg"), dmeson.normalizedDecayLength); - histos.fill(HIST("hDCADDaughters_Bkg"), dmeson.dcaDau * 1e+4); - histos.fill(HIST("hImpParPi_Bkg"), impParXY_daugPos); - histos.fill(HIST("hImpParK_Bkg"), impParXY_daugNeg); - histos.fill(HIST("hImpParProduct_Bkg"), impParXY_daugPos * impParXY_daugNeg); - if (doDCAplotsD) { - histos.fill(HIST("hDCADDaughters_Signal"), dmeson.dcaDau * 1e+4); - histos.fill(HIST("hDCADDaughters_Bkg"), dmeson.dcaDau * 1e+4); + if (doTopoPlotsForSAndB) { // fill plots of topological variables for S and B separately (reflections not considered here) + if (dmeson.mcTruth == 1) { // true D0 + histos.fill(HIST("hDCosPA_Signal"), dmeson.cosPA); + histos.fill(HIST("hDCosPAxy_Signal"), dmeson.cosPAxy); + histos.fill(HIST("hDCosThetaStar_Signal"), dmeson.cosThetaStar); + histos.fill(HIST("hDDecayLength_Signal"), decayLength); + histos.fill(HIST("hDDecayLengthXY_Signal"), decayLengthXY); + histos.fill(HIST("hDNormDecayLength_Signal"), dmeson.normalizedDecayLength); + histos.fill(HIST("hImpParPi_Signal"), impParXY_daugPos); + histos.fill(HIST("hImpParK_Signal"), impParXY_daugNeg); + histos.fill(HIST("hImpParProduct_Signal"), impParXY_daugPos * impParXY_daugNeg); + if (doDCAplotsD) + histos.fill(HIST("hDCADDaughters_Signal"), dmeson.dcaDau * 1e+4); + } else if (!dmeson.mcTruth) { // bkg D0 + histos.fill(HIST("hDCosPA_Bkg"), dmeson.cosPA); + histos.fill(HIST("hDCosPAxy_Bkg"), dmeson.cosPAxy); + histos.fill(HIST("hDCosThetaStar_Bkg"), dmeson.cosThetaStar); + histos.fill(HIST("hDDecayLength_Bkg"), decayLength); + histos.fill(HIST("hDDecayLengthXY_Bkg"), decayLengthXY); + histos.fill(HIST("hDNormDecayLength_Bkg"), dmeson.normalizedDecayLength); + histos.fill(HIST("hImpParPi_Bkg"), impParXY_daugPos); + histos.fill(HIST("hImpParK_Bkg"), impParXY_daugNeg); + histos.fill(HIST("hImpParProduct_Bkg"), impParXY_daugPos * impParXY_daugNeg); + if (doDCAplotsD) + histos.fill(HIST("hDCADDaughters_Bkg"), dmeson.dcaDau * 1e+4); } } @@ -675,30 +683,32 @@ struct alice3decayFinder { if (doDCAplotsD) histos.fill(HIST("hDCADbarDaughters"), dmeson.dcaDau * 1e+4); - if (doTopoPlotsForSAndB) { // fill plots of topological variables for S and B separately (reflections not considered here) - histos.fill(HIST("hDCosPA_Signal"), dmeson.cosPA); - histos.fill(HIST("hDCosPAxy_Signal"), dmeson.cosPAxy); - histos.fill(HIST("hDCosThetaStar_Signal"), dmeson.cosThetaStar); - histos.fill(HIST("hDDecayLength_Signal"), decayLength); - histos.fill(HIST("hDDecayLengthXY_Signal"), decayLengthXY); - histos.fill(HIST("hDNormDecayLength_Signal"), dmeson.normalizedDecayLength); - histos.fill(HIST("hImpParPi_Signal"), impParXY_daugNeg); - histos.fill(HIST("hImpParK_Signal"), impParXY_daugPos); - histos.fill(HIST("hImpParProduct_Signal"), impParXY_daugPos * impParXY_daugNeg); - histos.fill(HIST("hDCosPA_Bkg"), dmeson.cosPA); - histos.fill(HIST("hDCosPAxy_Bkg"), dmeson.cosPAxy); - histos.fill(HIST("hDCosThetaStar_Bkg"), dmeson.cosThetaStar); - histos.fill(HIST("hDDecayLength_Bkg"), decayLength); - histos.fill(HIST("hDDecayLengthXY_Bkg"), decayLengthXY); - histos.fill(HIST("hDNormDecayLength_Bkg"), dmeson.normalizedDecayLength); - histos.fill(HIST("hDCADDaughters_Bkg"), dmeson.dcaDau * 1e+4); - histos.fill(HIST("hImpParPi_Bkg"), impParXY_daugNeg); - histos.fill(HIST("hImpParK_Bkg"), impParXY_daugPos); - histos.fill(HIST("hImpParProduct_Bkg"), impParXY_daugPos * impParXY_daugNeg); - if (doDCAplotsD) { - histos.fill(HIST("hDCADDaughters_Signal"), dmeson.dcaDau * 1e+4); - histos.fill(HIST("hDCADDaughters_Bkg"), dmeson.dcaDau * 1e+4); + if (doTopoPlotsForSAndB) { // fill plots of topological variables for S and B separately (reflections not considered here) + if (dmeson.mcTruth == 2) { // true D0bar + histos.fill(HIST("hDCosPA_Signal"), dmeson.cosPA); + histos.fill(HIST("hDCosPAxy_Signal"), dmeson.cosPAxy); + histos.fill(HIST("hDCosThetaStar_Signal"), dmeson.cosThetaStar); + histos.fill(HIST("hDDecayLength_Signal"), decayLength); + histos.fill(HIST("hDDecayLengthXY_Signal"), decayLengthXY); + histos.fill(HIST("hDNormDecayLength_Signal"), dmeson.normalizedDecayLength); + histos.fill(HIST("hImpParPi_Signal"), impParXY_daugNeg); + histos.fill(HIST("hImpParK_Signal"), impParXY_daugPos); + histos.fill(HIST("hImpParProduct_Signal"), impParXY_daugPos * impParXY_daugNeg); + if (doDCAplotsD) + histos.fill(HIST("hDCADbarDaughters_Signal"), dmeson.dcaDau * 1e+4); + } else if (!dmeson.mcTruth) { // bkg D0bar + histos.fill(HIST("hDCosPA_Bkg"), dmeson.cosPA); + histos.fill(HIST("hDCosPAxy_Bkg"), dmeson.cosPAxy); + histos.fill(HIST("hDCosThetaStar_Bkg"), dmeson.cosThetaStar); + histos.fill(HIST("hDDecayLength_Bkg"), decayLength); + histos.fill(HIST("hDDecayLengthXY_Bkg"), decayLengthXY); + histos.fill(HIST("hDNormDecayLength_Bkg"), dmeson.normalizedDecayLength); + histos.fill(HIST("hImpParPi_Bkg"), impParXY_daugNeg); + histos.fill(HIST("hImpParK_Bkg"), impParXY_daugPos); + histos.fill(HIST("hImpParProduct_Bkg"), impParXY_daugPos * impParXY_daugNeg); } + if (doDCAplotsD) + histos.fill(HIST("hDCADbarDaughters_Bkg"), dmeson.dcaDau * 1e+4); } if (dmeson.dcaDau > dcaDaughtersSelection) From e2f5f0cbd89f5c6e22463b005b79f3970f1a537c Mon Sep 17 00:00:00 2001 From: MaolinZH <109225729+MaolinZH@users.noreply.github.com> Date: Tue, 3 Jun 2025 14:27:29 +0200 Subject: [PATCH 1497/1650] [PWGDQ] add new set of electron cuts for e-mu and fix the tableMaker_withAssociation (#11446) --- PWGDQ/Core/CutsLibrary.cxx | 107 ++++-------------- .../TableProducer/tableMakerMC_withAssoc.cxx | 1 + 2 files changed, 23 insertions(+), 85 deletions(-) diff --git a/PWGDQ/Core/CutsLibrary.cxx b/PWGDQ/Core/CutsLibrary.cxx index c73c301a262..1feb6d88b0d 100644 --- a/PWGDQ/Core/CutsLibrary.cxx +++ b/PWGDQ/Core/CutsLibrary.cxx @@ -3665,79 +3665,10 @@ AnalysisCompositeCut* o2::aod::dqcuts::GetCompositeCut(const char* cutName) return cut; } - if (!nameStr.compare("emu_electron_test1")) { + if (!nameStr.compare("emu_electron_test")) { cut->AddCut(GetAnalysisCut("jpsiStandardKine")); - cut->AddCut(GetAnalysisCut("electronStandardQualityForO2MCdebug4")); - cut->AddCut(GetAnalysisCut("electronPIDnsigmaOpen")); - return cut; - } - - if (!nameStr.compare("emu_electron_test2")) { - cut->AddCut(GetAnalysisCut("jpsiStandardKine2")); - cut->AddCut(GetAnalysisCut("electronStandardQualityForO2MCdebug4")); - cut->AddCut(GetAnalysisCut("electronPIDnsigmaOpen")); - return cut; - } - - if (!nameStr.compare("emu_electron_test3")) { - cut->AddCut(GetAnalysisCut("jpsiKineSkimmed")); - cut->AddCut(GetAnalysisCut("electronStandardQualityForO2MCdebug4")); - cut->AddCut(GetAnalysisCut("electronPIDnsigmaOpen")); - return cut; - } - - if (!nameStr.compare("emu_electron_test1_loosensigma")) { - cut->AddCut(GetAnalysisCut("jpsiStandardKine")); - cut->AddCut(GetAnalysisCut("electronStandardQualityForO2MCdebug4")); - cut->AddCut(GetAnalysisCut("electronPIDnsigmaVeryVeryLoose2")); - return cut; - } - - if (!nameStr.compare("emu_electron_test2_loosensigma")) { - cut->AddCut(GetAnalysisCut("jpsiStandardKine2")); - cut->AddCut(GetAnalysisCut("electronStandardQualityForO2MCdebug4")); - cut->AddCut(GetAnalysisCut("electronPIDnsigmaVeryVeryLoose2")); - return cut; - } - - if (!nameStr.compare("emu_electron_test3_loosensigma")) { - cut->AddCut(GetAnalysisCut("jpsiKineSkimmed")); - cut->AddCut(GetAnalysisCut("electronStandardQualityForO2MCdebug4")); - cut->AddCut(GetAnalysisCut("electronPIDnsigmaVeryVeryLoose2")); - return cut; - } - - if (!nameStr.compare("emu_electron_test1_tightnsigma")) { - cut->AddCut(GetAnalysisCut("jpsiStandardKine")); - cut->AddCut(GetAnalysisCut("electronStandardQualityForO2MCdebug4")); - cut->AddCut(GetAnalysisCut("electronPIDnsigmaLoose")); - return cut; - } - - if (!nameStr.compare("emu_electron_test2_tightnsigma")) { - cut->AddCut(GetAnalysisCut("jpsiStandardKine2")); - cut->AddCut(GetAnalysisCut("electronStandardQualityForO2MCdebug4")); - cut->AddCut(GetAnalysisCut("electronPIDnsigmaLoose")); - return cut; - } - - if (!nameStr.compare("emu_electron_test3_tightnsigma")) { - cut->AddCut(GetAnalysisCut("jpsiKineSkimmed")); - cut->AddCut(GetAnalysisCut("electronStandardQualityForO2MCdebug4")); - cut->AddCut(GetAnalysisCut("electronPIDnsigmaLoose")); - return cut; - } - - if (!nameStr.compare("emu_electron_specialTest")) { - cut->AddCut(GetAnalysisCut("jpsiStandardKineForEMu")); - cut->AddCut(GetAnalysisCut("electronStandardQualityForO2MCdebug4")); - cut->AddCut(GetAnalysisCut("electronPIDnsigmaVeryVeryLoose2")); - return cut; - } - - if (!nameStr.compare("emu_electron_specialTest2")) { - cut->AddCut(GetAnalysisCut("jpsiStandardKineForEMu")); - cut->AddCut(GetAnalysisCut("electronStandardQualityForO2MCdebug4")); + cut->AddCut(GetAnalysisCut("electronTrackQuality_Maolin")); + cut->AddCut(GetAnalysisCut("electronPIDnsigmaEMu")); return cut; } @@ -4298,12 +4229,6 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) return cut; } - if (!nameStr.compare("jpsiStandardKineForEMu")) { - cut->AddCut(VarManager::kPt, 5.0, 1000.0); - cut->AddCut(VarManager::kEta, -0.9, 0.9); - return cut; - } - if (!nameStr.compare("lmeePrefilterKine")) { cut->AddCut(VarManager::kPt, 0., 20.0); cut->AddCut(VarManager::kEta, -1.2, 1.2); @@ -4744,6 +4669,17 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) return cut; } + if (!nameStr.compare("electronTrackQuality_Maolin")) { + cut->AddCut(VarManager::kIsITSibAny, 0.5, 1.5); + cut->AddCut(VarManager::kITSchi2, 0.0, 15.0); + cut->AddCut(VarManager::kTPCchi2, 0.0, 4.0); + cut->AddCut(VarManager::kTPCncls, 70, 161.); + cut->AddCut(VarManager::kTPCnclsCR, 70, 161); + cut->AddCut(VarManager::kTrackDCAxy, -2.0, 2.0); + cut->AddCut(VarManager::kTrackDCAz, -2.0, 2.0); + return cut; + } + if (!nameStr.compare("pionQualityCut1")) { cut->AddCut(VarManager::kPt, 0.15, 1000.0); cut->AddCut(VarManager::kIsITSibAny, 0.5, 1.5); @@ -5552,13 +5488,6 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) return cut; } - if (!nameStr.compare("electronPIDnsigmaVeryVeryLoose2")) { - cut->AddCut(VarManager::kTPCnSigmaEl, -4.0, 4.0); - cut->AddCut(VarManager::kTPCnSigmaPr, 1.5, 3000.0); - cut->AddCut(VarManager::kTPCnSigmaPi, 1.5, 3000.0); - return cut; - } - if (!nameStr.compare("electronPIDnsigmaVeryLoose")) { cut->AddCut(VarManager::kTPCnSigmaEl, -4.0, 4.0); cut->AddCut(VarManager::kTPCnSigmaPr, 2.5, 3000.0); @@ -5635,6 +5564,14 @@ AnalysisCut* o2::aod::dqcuts::GetAnalysisCut(const char* cutName) return cut; } + if (!nameStr.compare("electronPIDnsigmaEMu")) { + cut->AddCut(VarManager::kTPCnSigmaEl, -1.0, 3.0); + cut->AddCut(VarManager::kTPCnSigmaPr, 3.5, 3000.0); + cut->AddCut(VarManager::kTPCnSigmaPi, 3.5, 3000.0); + cut->AddCut(VarManager::kTPCnSigmaKa, 3.5, 3000.0); + return cut; + } + if (!nameStr.compare("kaonPIDnsigma")) { cut->AddCut(VarManager::kTPCnSigmaKa, -3.0, 3.0); return cut; diff --git a/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx b/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx index a2e053375d9..484ec4873d5 100644 --- a/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx +++ b/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx @@ -989,6 +989,7 @@ struct TableMakerMC { if (sig->CheckSignal(true, mctrack)) { mcflags |= (static_cast(1) << i); if (fDoDetailedQA) { + j = 0; for (auto& cut : fMuonCuts) { if (trackTempFilterMap & (uint8_t(1) << j)) { fHistMan->FillHistClass(Form("Muons_%s_%s", cut->GetName(), sig->GetName()), VarManager::fgValues); // fill the reconstructed truth From 0de64891b8e076f63cb507a1f382b0ea494fc9cd Mon Sep 17 00:00:00 2001 From: sashingo Date: Tue, 3 Jun 2025 21:36:20 +0900 Subject: [PATCH 1498/1650] [PWGHF] tuned histogram bins etc (#11439) --- PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx | 50 +++++++++-------------- 1 file changed, 20 insertions(+), 30 deletions(-) diff --git a/PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx b/PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx index df04cf96cd2..be71ab35a01 100644 --- a/PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx +++ b/PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx @@ -147,27 +147,29 @@ struct HfTaskElectronWeakBoson { zorroSummary.setObject(zorro.getZorroSummary()); } + // add configurable for CCDB path + zorro.setBaseCCDBPath(cfgCCDBPath.value); + // define axes you want to use - const AxisSpec axisZvtx{400, -20, 20, "Zvtx"}; + const AxisSpec axisZvtx{40, -20, 20, "Zvtx"}; const AxisSpec axisCounter{1, 0, 1, "events"}; - const AxisSpec axisEta{200, -1.0, 1.0, "#eta"}; + const AxisSpec axisEta{20, -1.0, 1.0, "#eta"}; const AxisSpec axisPt{nBinsPt, 0, binPtmax, "p_{T}"}; const AxisSpec axisNsigma{100, -5, 5, "N#sigma"}; const AxisSpec axisE{nBinsE, 0, binEmax, "Energy"}; const AxisSpec axisM02{100, 0, 1, "M02"}; - const AxisSpec axisdPhi{200, -1, 1, "dPhi"}; - const AxisSpec axisdEta{200, -1, 1, "dEta"}; + const AxisSpec axisdPhi{100, -0.5, 0.5, "dPhi"}; + const AxisSpec axisdEta{100, -0.5, 0.5, "dEta"}; const AxisSpec axisPhi{350, 0, 7, "Phi"}; const AxisSpec axisEop{200, 0, 2, "Eop"}; - const AxisSpec axisChi2{500, 0.0, 50.0, "#chi^{2}"}; + const AxisSpec axisChi2{250, 0.0, 25.0, "#chi^{2}"}; const AxisSpec axisCluster{100, 0.0, 200.0, "counts"}; - const AxisSpec axisITSNCls{20, 0.0, 20, "counts"}; - const AxisSpec axisEMCtime{200, -100.0, 100, "EMC time"}; - const AxisSpec axisIsoEnergy{100, 0, 1, "Isolation energy(GeV/C)"}; - const AxisSpec axisIsoTrack{20, -0.5, 19.5, "Isolation Track"}; - const AxisSpec axisInvMassZ{200, 0, 200, "M_{ee} (GeV/c^{2})"}; - const AxisSpec axisInvMassDy{200, 0, 2, "M_{ee} (GeV/c^{2})"}; - const AxisSpec axisTrigger{3, 0, 2, "Trigger status of zorro"}; + const AxisSpec axisITSNCls{10, 0.0, 10, "counts"}; + const AxisSpec axisEMCtime{100, -50.0, 50, "EMC time"}; + const AxisSpec axisIsoEnergy{100, 0, 1.0, "Isolation energy(GeV/C)"}; + const AxisSpec axisIsoTrack{15, -0.5, 14.5, "Isolation Track"}; + const AxisSpec axisInvMassZ{150, 0, 150, "M_{ee} (GeV/c^{2})"}; + const AxisSpec axisTrigger{3, -0.5, 2.5, "Trigger status of zorro"}; // create registrygrams registry.add("hZvtx", "Z vertex", kTH1F, {axisZvtx}); @@ -182,8 +184,6 @@ struct HfTaskElectronWeakBoson { registry.add("hPt", "track pt", kTH1F, {axisPt}); registry.add("hTPCNsigma", "TPC electron Nsigma", kTH2F, {{axisPt}, {axisNsigma}}); registry.add("hEnergy", "EMC cluster energy", kTH1F, {axisE}); - registry.add("hM02", "EMC M02", kTH2F, {{axisNsigma}, {axisM02}}); - registry.add("hM20", "EMC M20", kTH2F, {{axisNsigma}, {axisM02}}); registry.add("hTrMatch", "Track EMC Match", kTH2F, {{axisdPhi}, {axisdEta}}); registry.add("hTrMatch_mim", "Track EMC Match minimu minimumm", kTH2F, {{axisdPhi}, {axisdEta}}); registry.add("hMatchPhi", "Match in Phi", kTH2F, {{axisPhi}, {axisPhi}}); @@ -197,13 +197,13 @@ struct HfTaskElectronWeakBoson { registry.add("hIsolationTrack", "Isolation Track", kTH2F, {{axisE}, {axisIsoTrack}}); registry.add("hInvMassZeeLs", "invariant mass for Z LS pair", kTH2F, {{axisPt}, {axisInvMassZ}}); registry.add("hInvMassZeeUls", "invariant mass for Z ULS pair", kTH2F, {{axisPt}, {axisInvMassZ}}); - registry.add("hTHnElectrons", "electron info", HistType::kTHnSparseF, {axisPt, axisNsigma, axisM02, axisM02, axisEop, axisIsoEnergy}); + registry.add("hTHnElectrons", "electron info", HistType::kTHnSparseF, {axisPt, axisNsigma, axisM02, axisEop, axisIsoEnergy, axisIsoTrack}); // hisotgram for EMCal trigger registry.add("hEMCalTrigger", "EMCal trigger", kTH1F, {axisTrigger}); } - double calIsolatedCluster(const o2::aod::EMCALCluster& cluster, + double getIsolatedCluster(const o2::aod::EMCALCluster& cluster, const SelectedClusters& clusters) { double energySum = 0.0; @@ -236,7 +236,7 @@ struct HfTaskElectronWeakBoson { return (isoEnergy); } - int calIsolatedTrack(double etaEle, + int getIsolatedTrack(double etaEle, double phiEle, float ptEle, TrackEle const& tracks) @@ -244,9 +244,6 @@ struct HfTaskElectronWeakBoson { int trackCount = 0; for (const auto& track : tracks) { - // skip the reference track - if (std::abs(track.pt() - ptEle) < 1e-4) - continue; double dEta = track.eta() - etaEle; double dPhi = track.phi() - phiEle; @@ -285,9 +282,6 @@ struct HfTaskElectronWeakBoson { LOGF(info, "Initializing Zorro for run %d", runNumber); uint64_t currentTimestamp = bc.timestamp(); - // add configurable for CCDB path - zorro.setBaseCCDBPath(cfgCCDBPath.value); - // debug for timestamp LOGF(info, "Using CCDB path: %s, timestamp: %llu", cfgCCDBPath.value.c_str(), currentTimestamp); @@ -308,7 +302,6 @@ struct HfTaskElectronWeakBoson { return; } } - // initialze for inclusive-electron selectedElectronsIso.clear(); selectedElectronsAss.clear(); @@ -381,7 +374,6 @@ struct HfTaskElectronWeakBoson { if (match.emcalcluster_as().time() < timeEmcMin || match.emcalcluster_as().time() > timeEmcMax) continue; - float m20Emc = match.emcalcluster_as().m20(); float m02Emc = match.emcalcluster_as().m02(); float energyEmc = match.emcalcluster_as().energy(); double phiEmc = match.emcalcluster_as().phi(); @@ -416,17 +408,15 @@ struct HfTaskElectronWeakBoson { double eop = energyEmc / match.track_as().p(); - double isoEnergy = calIsolatedCluster(cluster, emcClusters); + double isoEnergy = getIsolatedCluster(cluster, emcClusters); - int trackCount = calIsolatedTrack(track.phi(), track.eta(), track.pt(), tracks); + int trackCount = getIsolatedTrack(track.eta(), track.phi(), track.pt(), tracks) - 1; if (match.track_as().pt() > ptTHnThresh && isTHnElectron) { - registry.fill(HIST("hTHnElectrons"), match.track_as().pt(), match.track_as().tpcNSigmaEl(), m02Emc, m20Emc, eop, isoEnergy); + registry.fill(HIST("hTHnElectrons"), match.track_as().pt(), match.track_as().tpcNSigmaEl(), m02Emc, eop, isoEnergy, trackCount); } // LOG(info) << "E/p" << eop; registry.fill(HIST("hEopNsigTPC"), match.track_as().tpcNSigmaEl(), eop); - registry.fill(HIST("hM02"), match.track_as().tpcNSigmaEl(), m02Emc); - registry.fill(HIST("hM20"), match.track_as().tpcNSigmaEl(), m20Emc); if (match.emcalcluster_as().m02() < m02Min || match.emcalcluster_as().m02() > m02Max) continue; From 671d96bc5304fb892cf88c156b0c6663df62b1b5 Mon Sep 17 00:00:00 2001 From: Luca Aglietta <75362880+Luca610@users.noreply.github.com> Date: Tue, 3 Jun 2025 22:21:07 +0200 Subject: [PATCH 1499/1650] [PWGHF] Refactor of charm resonances derived data creator (#11447) Co-authored-by: ALICE Action Bot --- PWGHF/D2H/DataModel/ReducedDataModel.h | 43 +- .../dataCreatorCharmResoReduced.cxx | 1295 ++++++++++++----- 2 files changed, 1004 insertions(+), 334 deletions(-) diff --git a/PWGHF/D2H/DataModel/ReducedDataModel.h b/PWGHF/D2H/DataModel/ReducedDataModel.h index eaa6b97cca4..092210a22ca 100644 --- a/PWGHF/D2H/DataModel/ReducedDataModel.h +++ b/PWGHF/D2H/DataModel/ReducedDataModel.h @@ -877,6 +877,21 @@ DECLARE_SOA_DYNAMIC_COLUMN(PVector, pVector, [](float px0, float py0, float pz0, float px1, float py1, float pz1, float px2, float py2, float pz2) -> std::array { return std::array{px0 + px1 + px2, py0 + py1 + py2, pz0 + pz1 + pz2}; }); } // namespace hf_reso_3_prong +namespace hf_reso_2_prong +{ +DECLARE_SOA_COLUMN(SelFlagD0, selFlagD0, uint8_t); //! Integer with D0 selection flag: 1 = selected as D0, 2 = selected as D0bar, 3 = selected as D0 and D0bar +DECLARE_SOA_DYNAMIC_COLUMN(Px, px, //! + [](float pxProng0, float pxProng1) -> float { return 1.f * pxProng0 + 1.f * pxProng1; }); +DECLARE_SOA_DYNAMIC_COLUMN(Py, py, //! + [](float pyProng0, float pyProng1) -> float { return 1.f * pyProng0 + 1.f * pyProng1; }); +DECLARE_SOA_DYNAMIC_COLUMN(Pz, pz, //! + [](float pzProng0, float pzProng1) -> float { return 1.f * pzProng0 + 1.f * pzProng1; }); +DECLARE_SOA_DYNAMIC_COLUMN(PVector, pVector, + [](float pxProng0, float pyProng0, float pzProng0, float pxProng1, float pyProng1, float pzProng1) -> std::array { return std::array{pxProng0 + pxProng1, pyProng0 + pyProng1, pzProng0 + pzProng1}; }); +DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, //! + [](float pxProng0, float pxProng1, float pyProng0, float pyProng1) -> float { return RecoDecay::pt((1.f * pxProng0 + 1.f * pxProng1), (1.f * pyProng0 + 1.f * pyProng1)); }); +} // namespace hf_reso_2_prong + namespace hf_reso_v0 { DECLARE_SOA_COLUMN(Cpa, cpa, float); //! Cosine of Pointing Angle of V0 candidate @@ -994,6 +1009,31 @@ DECLARE_SOA_TABLE(HfRed3PrNoTrks, "AOD", "HFRED3PRNOTRK", //! Table with 3 prong hf_cand::PVectorProng2, hf_reso_3_prong::PVector); +DECLARE_SOA_TABLE(HfRed2PrNoTrks, "AOD", "HFRED2PRNOTRK", //! Table with 2 prong candidate information for resonances reduced workflow + o2::soa::Index<>, + // Indices + hf_track_index_reduced::Prong0Id, hf_track_index_reduced::Prong1Id, + hf_track_index_reduced::HfRedCollisionId, + // Static + hf_cand::XSecondaryVertex, hf_cand::YSecondaryVertex, hf_cand::ZSecondaryVertex, + hf_cand::PxProng0, hf_cand::PyProng0, hf_cand::PzProng0, + hf_cand::PxProng1, hf_cand::PyProng1, hf_cand::PzProng1, + hf_track_vars_reduced::ItsNClsProngMin, hf_track_vars_reduced::TpcNClsCrossedRowsProngMin, hf_track_vars_reduced::TpcChi2NClProngMax, + hf_reso_2_prong::SelFlagD0, + // Dynamic + hf_reso_2_prong::Px, + hf_reso_2_prong::Py, + hf_reso_2_prong::Pz, + hf_track_vars_reduced::PtProng0, + hf_track_vars_reduced::PtProng1, + hf_track_vars_reduced::EtaProng0, + hf_track_vars_reduced::EtaProng1, + hf_reso_2_prong::PVector, + hf_reso_2_prong::Pt, + // InvMasses + hf_cand_dstar::InvMassD0, + hf_cand_dstar::InvMassD0Bar); + namespace hf_reso_cand_reduced { DECLARE_SOA_COLUMN(InvMass, invMass, float); //! Invariant mass in GeV/c2 @@ -1012,7 +1052,7 @@ DECLARE_SOA_COLUMN(FlagMcMatchGen, flagMcMatchGen, int8_t); // fla DECLARE_SOA_COLUMN(DebugMcRec, debugMcRec, int8_t); // debug flag for mis-association at reconstruction level DECLARE_SOA_COLUMN(Origin, origin, int8_t); // Flag for origin of MC particle 1=promt, 2=FD DECLARE_SOA_COLUMN(SignD0, signD0, int8_t); // Sign of the D0 in the channels with D* -> D0 pi, needed in case of non-matched D* - +DECLARE_SOA_COLUMN(InvMassGen, invMassGen, float); //! Invariant mass at generation level in GeV/c2 DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, //! [](float pxProng0, float pxProng1, float pyProng0, float pyProng1) -> float { return RecoDecay::pt((1.f * pxProng0 + 1.f * pxProng1), (1.f * pyProng0 + 1.f * pyProng1)); }); DECLARE_SOA_DYNAMIC_COLUMN(PtProng0, ptProng0, //! @@ -1073,6 +1113,7 @@ DECLARE_SOA_TABLE(HfMcRecRedDV0s, "AOD", "HFMCRECREDDV0", //! Table with reconst hf_reso_cand_reduced::Origin, hf_reso_cand_reduced::SignD0, hf_b0_mc::PtMother, + hf_reso_cand_reduced::InvMassGen, o2::soa::Marker<1>); DECLARE_SOA_TABLE(HfMcGenRedResos, "AOD", "HFMCGENREDRESO", //! Generation-level MC information on Ds-Resonances candidates for reduced workflow diff --git a/PWGHF/D2H/TableProducer/dataCreatorCharmResoReduced.cxx b/PWGHF/D2H/TableProducer/dataCreatorCharmResoReduced.cxx index 3dc7cdcb08c..a424d95d95b 100644 --- a/PWGHF/D2H/TableProducer/dataCreatorCharmResoReduced.cxx +++ b/PWGHF/D2H/TableProducer/dataCreatorCharmResoReduced.cxx @@ -21,9 +21,9 @@ #include #include -#include "DetectorsBase/Propagator.h" #include "CommonConstants/PhysicsConstants.h" #include "DCAFitter/DCAFitterN.h" +#include "DetectorsBase/Propagator.h" #include "Framework/AnalysisTask.h" #include "Framework/O2DatabasePDGPlugin.h" #include "Framework/runDataProcessing.h" @@ -39,8 +39,9 @@ #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/Utils/utilsBfieldCCDB.h" -#include "PWGHF/D2H/DataModel/ReducedDataModel.h" #include "PWGHF/Utils/utilsEvSelHf.h" + +#include "PWGHF/D2H/DataModel/ReducedDataModel.h" #include "PWGHF/D2H/Utils/utilsRedDataFormat.h" using namespace o2; @@ -73,26 +74,38 @@ enum BachelorType : uint8_t { enum DType : uint8_t { Dplus = 1, - Dstar + Dstar, + D0 +}; + +enum PairingType : uint8_t { + V0Only, + TrackOnly, + V0AndTrack +}; + +enum D0Sel : uint8_t { + selectedD0 = 0, + selectedD0Bar }; enum DecayTypeMc : uint8_t { - Ds1ToDStarK0ToD0PiK0s = 1, + Ds1ToDstarK0ToD0PiK0s = 1, Ds2StarToDplusK0sToPiKaPiPiPi, - Ds1ToDStarK0ToDPlusPi0K0s, - Ds1ToDStarK0ToD0PiK0sPart, - Ds1ToDStarK0ToD0NoPiK0sPart, - Ds1ToDStarK0ToD0PiK0sOneMu, + Ds1ToDstarK0ToDplusPi0K0s, + Ds1ToDstarK0ToD0PiK0sPart, + Ds1ToDstarK0ToD0NoPiK0sPart, + Ds1ToDstarK0ToD0PiK0sOneMu, Ds2StarToDplusK0sOneMu }; enum PartialMatchMc : uint8_t { K0Matched = 0, D0Matched, - DStarMatched, - DPlusMatched, + DstarMatched, + DplusMatched, K0MuMatched, - DStarMuMatched + DstarMuMatched }; /// Creation of D-V0 pairs @@ -104,27 +117,22 @@ struct HfDataCreatorCharmResoReduced { // tracks, V0 and D candidates reduced tables Produces hfCandV0; // Defined in PWGHF/D2H/DataModel/ReducedDataModel.h Produces hfTrackNoParam; // Defined in PWGHF/D2H/DataModel/ReducedDataModel.h - Produces hfCandD; // Defined in PWGHF/D2H/DataModel/ReducedDataModel.h + Produces hfCandD3Pr; // Defined in PWGHF/D2H/DataModel/ReducedDataModel.h + Produces hfCandD2Pr; // Defined in PWGHF/D2H/DataModel/ReducedDataModel.h // ML optional Tables - Produces hfCandDMl; // Defined in PWGHF/D2H/DataModel/ReducedDataModel.h + Produces hfCandD3PrMl; // Defined in PWGHF/D2H/DataModel/ReducedDataModel.h + Produces hfCandD2PrMl; // Defined in PWGHF/D2H/DataModel/ReducedDataModel.h // MC Tables Produces rowHfDV0McRecReduced; Produces rowHfResoMcGenReduced; - // CCDB configuration - o2::ccdb::CcdbApi ccdbApi; - Service ccdb; - Configurable url{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; - Configurable ccdbPathGrpMag{"ccdbPathGrpMag", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object (Run 3)"}; - Configurable propagateV0toPV{"propagateV0toPV", false, "Enable or disable V0 propagation to V0"}; - Configurable doMcRecQa{"doMcRecQa", true, "Fill QA histograms for Mc matching"}; - - int runNumber{0}; // needed to detect if the run changed and trigger update of calibrations etc. // selection D struct : ConfigurableGroup { std::string prefix = "dmesons"; Configurable selectionFlagDplus{"selectionFlagDplus", 7, "Selection Flag for D"}; Configurable selectionFlagDstarToD0Pi{"selectionFlagDstarToD0Pi", true, "Selection Flag for D* decay to D0 & Pi"}; + Configurable selectionFlagD0{"selectionFlagD0", 1, "Selection Flag for D0"}; + Configurable selectionFlagD0Bar{"selectionFlagD0Bar", 1, "Selection Flag for D0bar"}; } cfgDmesCuts; // selection V0 @@ -137,6 +145,7 @@ struct HfDataCreatorCharmResoReduced { Configurable trackNclusItsCut{"trackNclusItsCut", 0, "Minimum number of ITS clusters for V0 daughter"}; Configurable trackNCrossedRowsTpc{"trackNCrossedRowsTpc", 50, "Minimum TPC crossed rows"}; Configurable trackNsharedClusTpc{"trackNsharedClusTpc", 1000, "Maximum number of shared TPC clusters for V0 daughter"}; + Configurable trackFracMaxindableTpcCls{"trackFracMaxindableTpcCls", 0.8f, "Maximum fraction of findable TPC clusters for V0 daughter"}; Configurable dcaDau{"dcaDau", 1.f, "DCA V0 daughters"}; Configurable dcaMaxDauToPv{"dcaMaxDauToPv", 0.1f, "Maximum daughter's DCA to PV"}; Configurable dcaPv{"dcaPv", 1.f, "DCA V0 to PV"}; @@ -157,19 +166,43 @@ struct HfDataCreatorCharmResoReduced { Configurable maxNsigmaTpcPr{"maxNsigmaTpcPr", 3., "maximum proton NSigma in TPC for single tracks to be paired with D mesons; set negative to reject"}; } cfgSingleTrackCuts; + // QA histograms + struct : ConfigurableGroup { + Configurable applyCutsForQaHistograms{"applyCutsForQaHistograms", true, "flag to apply cuts to QA histograms"}; + Configurable cutMassDstarMin{"cutMassDstarMin", 0.143, "minimum mass for Dstar candidates"}; + Configurable cutMassDstarMax{"cutMassDstarMax", 0.155, "maximum mass for Dstar candidates"}; + Configurable cutMassDMin{"cutMassDMin", 1.83, "minimum mass for D0 and Dplus candidates"}; + Configurable cutMassDMax{"cutMassDMax", 1.92, "maximum mass for D0 and Dplus candidates"}; + Configurable cutMassK0sMin{"cutMassK0sMin", 0.485, "minimum mass for K0s candidates"}; + Configurable cutMassK0sMax{"cutMassK0sMax", 0.509, "maximum mass for K0s candidates"}; + Configurable cutMassLambdaMin{"cutMassLambdaMin", 1.11, "minimum mass for Lambda candidates"}; + Configurable cutMassLambdaMax{"cutMassLambdaMax", 1.12, "maximum mass for Lambda candidates"}; + } cfgQaPlots; // other configurables + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable ccdbPathGrpMag{"ccdbPathGrpMag", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object (Run 3)"}; + Configurable propagateV0toPV{"propagateV0toPV", false, "Enable or disable V0 propagation to V0"}; + Configurable doMcRecQa{"doMcRecQa", true, "Fill QA histograms for Mc matching"}; Configurable rejectPairsWithCommonDaughter{"rejectPairsWithCommonDaughter", true, "flag to reject already at this stage the pairs that share a daughter track"}; - // material correction for track propagation - o2::base::MatLayerCylSet* lut; - o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT; HfHelper hfHelper; o2::hf_evsel::HfEventSelection hfEvSel; - o2::vertexing::DCAFitterN<2> fitter; + + // CCDB service + o2::ccdb::CcdbApi ccdbApi; + Service ccdb; double bz{0.}; + int runNumber{0}; // needed to detect if the run changed and trigger update of calibrations etc. + + // material correction for track propagation + o2::base::MatLayerCylSet* lut; + o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT; + + // O2DatabasePDG service Service pdg; - // bool isHfCandResoConfigFilled = false; + // vertex fitter + o2::vertexing::DCAFitterN<2> fitter; // Helper struct to pass V0 informations struct { @@ -192,25 +225,36 @@ struct HfDataCreatorCharmResoReduced { struct { float invMassD; float ptD; - float invMassDdau; - float invMassKPiPiV0; + float invMassD0; + float invMassD0Bar; + float invMassReso; float ptReso; + int8_t signD; + std::array pVectorProng0; + std::array pVectorProng1; + std::array pVectorProng2; } varUtils; + using CandsDplusFiltered = soa::Filtered>; using CandsDplusFilteredWithMl = soa::Filtered>; - using CandDstarFiltered = soa::Filtered>; - using CandDstarFilteredWithMl = soa::Filtered>; + using CandsDstarFiltered = soa::Filtered>; + using CandsDstarFilteredWithMl = soa::Filtered>; + using CandsD0Filtered = soa::Filtered>; + using CandsD0FilteredWithMl = soa::Filtered>; using TracksWithPID = soa::Join; using TracksIUWithPID = soa::Join; using TracksIUWithPIDAndMC = soa::Join; Filter filterSelectDplus = (aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= cfgDmesCuts.selectionFlagDplus); Filter filterSelectedCandDstar = (aod::hf_sel_candidate_dstar::isSelDstarToD0Pi == cfgDmesCuts.selectionFlagDstarToD0Pi); + Filter filterSelectD0Candidates = (aod::hf_sel_candidate_d0::isSelD0 >= cfgDmesCuts.selectionFlagD0 || aod::hf_sel_candidate_d0::isSelD0bar >= cfgDmesCuts.selectionFlagD0Bar); Preslice candsDplusPerCollision = aod::hf_cand::collisionId; Preslice candsDplusPerCollisionWithMl = aod::hf_cand::collisionId; - Preslice candsDstarPerCollision = aod::hf_cand::collisionId; - Preslice candsDstarPerCollisionWithMl = aod::hf_cand::collisionId; + Preslice candsDstarPerCollision = aod::hf_cand::collisionId; + Preslice candsDstarPerCollisionWithMl = aod::hf_cand::collisionId; + Preslice candsD0PerCollision = aod::hf_cand::collisionId; + Preslice candsD0PerCollisionWithMl = aod::hf_cand::collisionId; Preslice candsV0PerCollision = aod::v0::collisionId; Preslice trackIndicesPerCollision = aod::track_association::collisionId; @@ -225,70 +269,88 @@ struct HfDataCreatorCharmResoReduced { labels[Event::NoDV0Selected] = "without DV0 pairs"; labels[Event::DV0Selected] = "with DV0 pairs"; static const AxisSpec axisEvents = {kNBinsEvents, 0.5, kNBinsEvents + 0.5, ""}; - registry.add("hEvents", "Events;;entries", HistType::kTH1F, {axisEvents}); + registry.add("hEvents", "Events;;entries", HistType::kTH1D, {axisEvents}); for (int iBin = 0; iBin < kNBinsEvents; iBin++) { registry.get(HIST("hEvents"))->GetXaxis()->SetBinLabel(iBin + 1, labels[iBin].data()); } - const AxisSpec axisPt{50, 0.f, 50.f, ""}; - const AxisSpec axisP{100, 0.f, 10.f, ""}; + const AxisSpec axisPt{50, 0.f, 50.f, "#it{p}_{T} (GeV/#it{c})"}; + const AxisSpec axisP{100, 0.f, 10.f, "#it{p} (GeV/#it{c})"}; const AxisSpec axisDeDx{500, 0.f, 1000.f, ""}; - const AxisSpec axisMassDplus{200, 1.7f, 2.1f, ""}; - const AxisSpec axisMassDstar{200, 0.139f, 0.179f, ""}; - const AxisSpec axisMassLambda{100, 1.05f, 1.35f, ""}; - const AxisSpec axisMassKzero{100, 0.35f, 0.65f, ""}; - const AxisSpec axisMassDsj{400, 0.49f, 0.89f, ""}; - - registry.add("hMassVsPtDplusAll", "Dplus candidates (all, regardless the pairing with V0s);#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPt, axisMassDplus}}); - registry.add("hMassVsPtDstarAll", "Dstar candidates (all, regardless the pairing with V0s);#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPt, axisMassDstar}}); - registry.add("hMassVsPtDplusPaired", "Dplus candidates (paired with V0s);#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPt, axisMassDplus}}); - registry.add("hMassVsPtDstarPaired", "Dstar candidates (paired with V0s);#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPt, axisMassDstar}}); - - registry.add("hMassVsPtK0s", "K0^{s} candidates;#it{p}_{T} (GeV/#it{c});inv. mass (#pi^{#plus}#pi^{#minus}) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPt, axisMassKzero}}); - registry.add("hMassVsPtLambda", "Lambda candidates;#it{p}_{T} (GeV/#it{c});inv. mass (p #pi^{#minus}) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPt, axisMassLambda}}); - registry.add("hdEdxVsP", "Tracks;#it{p} (GeV/#it{c});d#it{E}/d#it{x};entries", {HistType::kTH2F, {axisP, axisDeDx}}); - - registry.add("hMassDs1", "Ds1 candidates;m_{Ds1} - m_{D^{*}} (GeV/#it{c}^{2});entries", {HistType::kTH1F, {axisMassDsj}}); - registry.add("hMassDsStar2", "Ds^{*}2 candidates; Ds^{*}2 - m_{D^{#plus}} (GeV/#it{c}^{2});entries", {HistType::kTH1F, {axisMassDsj}}); - registry.add("hMassXcRes", "XcRes candidates; XcRes - m_{D^{#plus}} (GeV/#it{c}^{2});entries", {HistType::kTH1F, {{300, 1.1, 1.4}}}); - registry.add("hMassDstarProton", "D^{*}-proton candidates;m_{D^{*}p} - m_{D^{*}} (GeV/#it{c}^{2});entries", {HistType::kTH1F, {{500, 0.9, 1.4}}}); - registry.add("hDType", "D selection flag", {HistType::kTH1F, {{5, -2.5, 2.5}}}); - - registry.add("hMCRecCounter", "Number of Reconstructed MC Matched candidates per channel", {HistType::kTH1F, {{17, -8.5, 8.5}}}); - registry.add("hMCRecDebug", "Debug of MC Reco", {HistType::kTH1F, {{16, -0.5, 15.5}}}); - registry.add("hMCRecOrigin", "Origin of Matched particles", {HistType::kTH1F, {{3, -0.5, 2.5}}}); - - registry.add("hMCGenCounter", "Number of Generated particles; Decay Channel Flag; pT [GeV/c]", {HistType::kTH2F, {{17, -8.5, 8.5}, {100, 0, 50}}}); - registry.add("hMCSignCounter", "Sign of Generated particles", {HistType::kTH1F, {{3, -1.5, 1.5}}}); - registry.add("hMCGenOrigin", "Origin of Generated particles", {HistType::kTH1F, {{3, -0.5, 2.5}}}); - registry.add("hMCOriginCounterWrongDecay", "Origin of Generated particles in Wrong decay", {HistType::kTH1F, {{3, -0.5, 2.5}}}); + const AxisSpec axisMassD0{200, 1.7f, 2.1f, "inv. mass (GeV/#it{c}^{2})"}; + const AxisSpec axisMassDplus{200, 1.7f, 2.1f, "inv. mass (GeV/#it{c}^{2})"}; + const AxisSpec axisMassDstar{200, 0.139f, 0.179f, "delta inv. mass (GeV/#it{c}^{2})"}; // o2-linter: disable=pdg/explicit-mass (false positive) + const AxisSpec axisMassLambda{100, 1.05f, 1.35f, "inv. mass (GeV/#it{c}^{2})"}; + const AxisSpec axisMassKzero{100, 0.35f, 0.65f, "inv. mass (GeV/#it{c}^{2})"}; + const AxisSpec axisDeltaMassToK{500, 0.49, 1.49, "inv. mass (GeV/#it{c}^{2})"}; + const AxisSpec axisDeltaMassToPi{500, 0.13, 1.13, "inv. mass (GeV/#it{c}^{2})"}; + const AxisSpec axisDeltaMassToPr{500, 0.93, 1.93, "inv. mass (GeV/#it{c}^{2})"}; + const AxisSpec axisDeltaMassToLambda{500, 1.05, 2.05, "inv. mass (GeV/#it{c}^{2})"}; + const AxisSpec axisMassDsj{400, 0.49f, 0.89f, ""}; // Ds1 and Ds2Star legacy + registry.add("hMassVsPtDplusAll", "Dplus candidates (all, regardless the pairing with V0s);#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisMassDplus}}); + registry.add("hMassVsPtDstarAll", "Dstar candidates (all, regardless the pairing with V0s);#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisMassDstar}}); + registry.add("hMassVsPtD0All", "D0 candidates (all, regardless the pairing with V0s);#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisMassD0}}); + registry.add("hMassVsPtDplusPaired", "Dplus candidates (paired with V0s);#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisMassDplus}}); + registry.add("hMassVsPtDstarPaired", "Dstar candidates (paired with V0s);#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisMassDstar}}); + registry.add("hMassVsPtD0Paired", "D0 candidates (paired with V0s);#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisMassD0}}); + registry.add("hMassVsPtD0BarPaired", "D0 candidates (paired with V0s);#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisMassD0}}); + registry.add("hMassVsPtK0s", "K0^{s} candidates;#it{p}_{T} (GeV/#it{c});inv. mass (#pi^{#plus}#pi^{#minus}) (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisMassKzero}}); + registry.add("hMassVsPtLambda", "Lambda candidates;#it{p}_{T} (GeV/#it{c});inv. mass (p #pi^{#minus}) (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisMassLambda}}); + registry.add("hdEdxVsP", "Tracks;#it{p} (GeV/#it{c});d#it{E}/d#it{x};entries", {HistType::kTH2D, {axisP, axisDeDx}}); + registry.add("hDType", "D selection flag", {HistType::kTH1D, {{5, -2.5, 2.5}}}); + + // QA reso invariant mass histograms + registry.add("hMassD0Pi", "D0Pi candidates; m_{D^{0}#pi^{+}} - m_{D^{0}} (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisDeltaMassToPi}}); + registry.add("hMassD0K", "D0Kplus candidates; m_{D^{0}K^{+}} - m_{D^{0} (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisDeltaMassToK}}); + registry.add("hMassD0Proton", "D0Proton candidates; m_{D^{0}p} - m_{D^{0} (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisDeltaMassToPr}}); + registry.add("hMassD0Lambda", "D0Lambda candidates; m_{D^{0}#Lambda} - m_{D^{0} (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisDeltaMassToLambda}}); + registry.add("hMassDstarPi", "DstarPi candidates; m_{D^{*+}#pi^{-}} (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisDeltaMassToPi}}); + registry.add("hMassDstarK", "DstarK candidates; m_{D^{*+}#pi^{-}} (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisDeltaMassToK}}); + registry.add("hMassDstarProton", "DstarProton candidates; m_{D^{*}p} (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisDeltaMassToPr}}); + registry.add("hMassDstarK0s", "DstarK0s candidates; m_{D^{*}K^{0}_{S}} (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisDeltaMassToK}}); + registry.add("hMassDstarLambda", "DstarLambda candidates; m_{D^{*}#Lambda} (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisDeltaMassToLambda}}); + registry.add("hMassDplusK0s", "DplusK0s candidates; m_{D^{+}K^{0}_{S}} (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisDeltaMassToK}}); + registry.add("hMassDplusPi", "DplusPi candidates; m_{D^{+}#pi^{-}} (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisDeltaMassToPi}}); + registry.add("hMassDplusK", "DplusK candidates; m_{D^{+}#pi^{-}} (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisDeltaMassToK}}); + registry.add("hMassDplusProton", "DplusProton candidates; m_{D^{+}p} (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisDeltaMassToPr}}); + registry.add("hMassDplusLambda", "DplusLambda candidates; m_{D^{+}#Lambda} (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisDeltaMassToLambda}}); + // MC Rec + registry.add("hMCRecCounter", "Number of Reconstructed MC Matched candidates per channel", {HistType::kTH1D, {{17, -8.5, 8.5}}}); + registry.add("hMCRecDebug", "Debug of MC Reco", {HistType::kTH1D, {{16, -0.5, 15.5}}}); + registry.add("hMCRecOrigin", "Origin of Matched particles", {HistType::kTH1D, {{3, -0.5, 2.5}}}); + registry.add("hMCRecMassGen", "Generated inv. mass of resoncances", {HistType::kTH1D, {{2000, 1.8, 3.8}}}); + // MC Gen + registry.add("hMCGenCounter", "Number of Generated particles; Decay Channel Flag; pT [GeV/c]", {HistType::kTH2D, {{17, -8.5, 8.5}, {100, 0, 50}}}); + registry.add("hMCSignCounter", "Sign of Generated particles", {HistType::kTH1D, {{3, -1.5, 1.5}}}); + registry.add("hMCGenOrigin", "Origin of Generated particles", {HistType::kTH1D, {{3, -0.5, 2.5}}}); + registry.add("hMCOriginCounterWrongDecay", "Origin of Generated particles in Wrong decay", {HistType::kTH1D, {{3, -0.5, 2.5}}}); if (doMcRecQa) { - registry.add("hMassVsPtK0Matched", "K0s candidates Matched ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPt, axisMassKzero}}); - registry.add("hMassVsPtD0Matched", "D0 candidates Matched ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPt, axisMassDplus}}); - registry.add("hMassVsPtDstarMatched", "Dstar candidates Matched ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPt, axisMassDstar}}); - registry.add("hMassVsPtDplusMatched", "Dplus candidates Matched ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPt, axisMassDplus}}); - registry.add("hMassVsPtDs1Matched", "Ds1 candidates Matched ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPt, axisMassDsj}}); - registry.add("hMassVsPtDs2StarMatched", "Ds2Star candidates Matched ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPt, axisMassDsj}}); - registry.add("hMassVsPtK0MatchedPiToMu", "K0s candidates Matched with PiToMu decay ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPt, axisMassKzero}}); - registry.add("hMassVsPtD0MatchedPiToMu", "D0 candidates Matched with PiToMu decay ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPt, axisMassDplus}}); - registry.add("hMassVsPtDstarMatchedPiToMu", "Dstar candidates Matched with PiToMu decay ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPt, axisMassDstar}}); - registry.add("hMassVsPtDplusMatchedPiToMu", "Dplus candidates Matched with PiToMu decay ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPt, axisMassDplus}}); - registry.add("hMassVsPtDs1MatchedPiToMu", "Ds1 candidates Matched with PiToMu decay ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPt, axisMassDsj}}); - registry.add("hMassVsPtDs2StarMatchedPiToMu", "Ds2Star candidates Matched with PiToMu decay ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPt, axisMassDsj}}); - registry.add("hMassVsPtD0MatchedKaToPi", "D0 candidates Matched with KaToPi decay ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPt, axisMassDplus}}); - registry.add("hMassVsPtDstarMatchedKaToPi", "Dstar candidates Matched with KaToPi decay ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPt, axisMassDstar}}); - registry.add("hMassVsPtDplusMatchedKaToPi", "Dplus candidates Matched with KaToPi decay ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPt, axisMassDplus}}); - registry.add("hMassVsPtDs1MatchedKaToPi", "Ds1 candidates Matched with KaToPi decay ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPt, axisMassDsj}}); - registry.add("hMassVsPtDs2StarMatchedKaToPi", "Ds2Star candidates Matched with KaToPi decay ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2F, {axisPt, axisMassDsj}}); + registry.add("hMassVsPtK0Matched", "K0s candidates Matched ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisMassKzero}}); + registry.add("hMassVsPtD0Matched", "D0 candidates Matched ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisMassDplus}}); + registry.add("hMassVsPtDstarMatched", "Dstar candidates Matched ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisMassDstar}}); + registry.add("hMassVsPtDplusMatched", "Dplus candidates Matched ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisMassDplus}}); + registry.add("hMassVsPtDs1Matched", "Ds1 candidates Matched ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisMassDsj}}); + registry.add("hMassVsPtDs2StarMatched", "Ds2Star candidates Matched ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisMassDsj}}); + registry.add("hMassVsPtK0MatchedPiToMu", "K0s candidates Matched with PiToMu decay ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisMassKzero}}); + registry.add("hMassVsPtD0MatchedPiToMu", "D0 candidates Matched with PiToMu decay ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisMassDplus}}); + registry.add("hMassVsPtDstarMatchedPiToMu", "Dstar candidates Matched with PiToMu decay ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisMassDstar}}); + registry.add("hMassVsPtDplusMatchedPiToMu", "Dplus candidates Matched with PiToMu decay ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisMassDplus}}); + registry.add("hMassVsPtDs1MatchedPiToMu", "Ds1 candidates Matched with PiToMu decay ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisMassDsj}}); + registry.add("hMassVsPtDs2StarMatchedPiToMu", "Ds2Star candidates Matched with PiToMu decay ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisMassDsj}}); + registry.add("hMassVsPtD0MatchedKaToPi", "D0 candidates Matched with KaToPi decay ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisMassDplus}}); + registry.add("hMassVsPtDstarMatchedKaToPi", "Dstar candidates Matched with KaToPi decay ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisMassDstar}}); + registry.add("hMassVsPtDplusMatchedKaToPi", "Dplus candidates Matched with KaToPi decay ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisMassDplus}}); + registry.add("hMassVsPtDs1MatchedKaToPi", "Ds1 candidates Matched with KaToPi decay ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisMassDsj}}); + registry.add("hMassVsPtDs2StarMatchedKaToPi", "Ds2Star candidates Matched with KaToPi decay ;#it{p}_{T} (GeV/#it{c});inv. mass (GeV/#it{c}^{2});entries", {HistType::kTH2D, {axisPt, axisMassDsj}}); } // Configure CCDB access - ccdb->setURL(url.value); + ccdb->setURL(ccdbUrl.value); ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); ccdb->setCreatedNotAfter(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); - ccdbApi.init(url); + ccdbApi.init(ccdbUrl); runNumber = 0; lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get("GLO/Param/MatLUT")); @@ -325,7 +387,7 @@ struct HfDataCreatorCharmResoReduced { if (track.itsNCls() < cfgV0Cuts.trackNclusItsCut || track.tpcNClsFound() < cfgV0Cuts.trackNCrossedRowsTpc || track.tpcNClsCrossedRows() < cfgV0Cuts.trackNCrossedRowsTpc || - track.tpcNClsCrossedRows() < 0.8 * track.tpcNClsFindable() || + track.tpcNClsCrossedRows() < cfgV0Cuts.trackFracMaxindableTpcCls * track.tpcNClsFindable() || track.tpcNClsShared() > cfgV0Cuts.trackNsharedClusTpc) { return false; } @@ -392,7 +454,7 @@ struct HfDataCreatorCharmResoReduced { auto& trackNegProp = fitter.getTrack(1); trackPosProp.getPxPyPzGlo(candidateV0.momPos); trackNegProp.getPxPyPzGlo(candidateV0.momNeg); - for (int i = 0; i < 3; ++i) { + for (int i = 0; i < 3; ++i) { // o2-linter: disable=magic-number (loop on xyz) candidateV0.mom[i] = candidateV0.momPos[i] + candidateV0.momNeg[i]; } candidateV0.pT = std::hypot(candidateV0.mom[0], candidateV0.mom[1]); @@ -413,7 +475,7 @@ struct HfDataCreatorCharmResoReduced { if (candidateV0.radius < cfgV0Cuts.radiusMin) { return false; } - for (int i = 0; i < 3; i++) { + for (int i = 0; i < 3; i++) { // o2-linter: disable=magic-number (loop on xyz) candidateV0.pos[i] = vtx[i]; } // v0 DCA to primary vertex @@ -533,17 +595,16 @@ struct HfDataCreatorCharmResoReduced { /// \param vecDaughtersReso is the vector with all daughter tracks (bachelor pion in last position) /// \param indexHfCandCharm is the index of the charm-hadron bachelor in the reduced table /// \param indexCandV0 is the index of the v0 bachelor in the reduced table - template + template void fillMcRecoInfo(const PParticles& particlesMc, const std::vector& vecDaughtersReso, int& indexHfCandCharm, int& indexCandV0) { - // we check the MC matching to be stored int8_t sign{0}; - int8_t signDStar{0}; - int8_t signDPlus{0}; + int8_t signDstar{0}; + int8_t signDplus{0}; int8_t signD0{0}; int8_t signV0{0}; int8_t flag{0}; @@ -553,38 +614,39 @@ struct HfDataCreatorCharmResoReduced { int8_t nKaToPiReso{0}, nKaToPiV0, nKaToPiD0{0}, nKaToPiDstar{0}, nKaToPiDplus{0}; std::vector idxBhadMothers{}; float motherPt{-1.f}; + float invMassGen{-1.f}; int indexRecReso{-1}, indexRecDstar{-1}, indexRecDplus{-1}, indexRecD0{-1}, indexRecK0{-1}, indexRecResoPartReco{-1}; - if constexpr (decChannel == DecayChannel::DstarV0) { + if constexpr (dType == DType::Dstar) { // Ds1 → D* K0 → (D0 π+) K0s → ((K-π+) π+)(π+π-) indexRecD0 = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersReso[0], vecDaughtersReso[1]}, Pdg::kD0, std::array{+kPiPlus, -kKPlus}, true, &signD0, 1, &nPiToMuD0, &nKaToPiD0); indexRecK0 = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersReso[3], vecDaughtersReso[4]}, kK0, std::array{+kPiPlus, -kPiPlus}, true, &signV0, 2, &nPiToMuV0, &nKaToPiV0); if (indexRecD0 > -1) { - indexRecDstar = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersReso[0], vecDaughtersReso[1], vecDaughtersReso[2]}, Pdg::kDStar, std::array{-kKPlus, +kPiPlus, +kPiPlus}, true, &signDStar, 2, &nPiToMuDstar, &nKaToPiDstar); + indexRecDstar = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersReso[0], vecDaughtersReso[1], vecDaughtersReso[2]}, Pdg::kDStar, std::array{-kKPlus, +kPiPlus, +kPiPlus}, true, &signDstar, 2, &nPiToMuDstar, &nKaToPiDstar); } if (indexRecD0 > -1 && indexRecDstar > -1 && indexRecK0 > -1) { indexRecReso = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersReso[0], vecDaughtersReso[1], vecDaughtersReso[2], vecDaughtersReso[3], vecDaughtersReso[4]}, Pdg::kDS1, std::array{+kPiPlus, -kKPlus, +kPiPlus, +kPiPlus, -kPiPlus}, true, &sign, 3, &nPiToMuReso, &nKaToPiReso); if (indexRecReso > -1 && nPiToMuReso == 0 && nKaToPiReso == 0) { - flag = sign * DecayTypeMc::Ds1ToDStarK0ToD0PiK0s; + flag = sign * DecayTypeMc::Ds1ToDstarK0ToD0PiK0s; } else if (indexRecReso > -1 && nPiToMuReso >= 1 && nKaToPiReso == 0) { - flag = sign * DecayTypeMc::Ds1ToDStarK0ToD0PiK0sOneMu; + flag = sign * DecayTypeMc::Ds1ToDstarK0ToD0PiK0sOneMu; } } // Ds1+ not matched: we check if it is partially reco if (indexRecReso < 0) { indexRecResoPartReco = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersReso[0], vecDaughtersReso[1], vecDaughtersReso[2], vecDaughtersReso[3], vecDaughtersReso[4]}, Pdg::kDS1, std::array{+kPiPlus, -kKPlus, +kPiPlus, +kPiPlus, -kPiPlus}, true, &sign, 3); - indexRecDplus = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersReso[0], vecDaughtersReso[1], vecDaughtersReso[2]}, Pdg::kDPlus, std::array{+kPiPlus, -kKPlus, +kPiPlus}, true, &signDPlus, 2); + indexRecDplus = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersReso[0], vecDaughtersReso[1], vecDaughtersReso[2]}, Pdg::kDPlus, std::array{+kPiPlus, -kKPlus, +kPiPlus}, true, &signDplus, 2); if (indexRecResoPartReco > -1) { // we look for decays of D* or D0 with more daughters if (indexRecDstar < 0 && indexRecK0 > -1) { - auto indexRecDstarPartReco = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersReso[0], vecDaughtersReso[1], vecDaughtersReso[2]}, Pdg::kDStar, std::array{-kKPlus, +kPiPlus, +kPiPlus}, true, &signDStar, 3); + auto indexRecDstarPartReco = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersReso[0], vecDaughtersReso[1], vecDaughtersReso[2]}, Pdg::kDStar, std::array{-kKPlus, +kPiPlus, +kPiPlus}, true, &signDstar, 3); if (indexRecDstarPartReco > -1) { if (indexRecDplus > -1) { // Ds1 -> D* K0s -> D+ π0 K0s - flag = sign * DecayTypeMc::Ds1ToDStarK0ToDPlusPi0K0s; + flag = sign * DecayTypeMc::Ds1ToDstarK0ToDplusPi0K0s; } else { - auto indexRecDzeroPartReco = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersReso[0], vecDaughtersReso[1]}, Pdg::kD0, std::array{+kPiPlus, -kKPlus}, true, &signD0, 2); - if (indexRecDzeroPartReco > -1) { // Ds1 -> D* K0s -> D0 π+ K0s -> K- π+ π0 π+ K0s - flag = sign * DecayTypeMc::Ds1ToDStarK0ToD0PiK0sPart; + auto indexRecD0PartReco = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersReso[0], vecDaughtersReso[1]}, Pdg::kD0, std::array{+kPiPlus, -kKPlus}, true, &signD0, 2); + if (indexRecD0PartReco > -1) { // Ds1 -> D* K0s -> D0 π+ K0s -> K- π+ π0 π+ K0s + flag = sign * DecayTypeMc::Ds1ToDstarK0ToD0PiK0sPart; } } } @@ -593,7 +655,7 @@ struct HfDataCreatorCharmResoReduced { if (indexRecD0 > -1 && indexRecK0 > -1 && indexRecDstar < 0) { indexRecResoPartReco = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersReso[0], vecDaughtersReso[1], vecDaughtersReso[3], vecDaughtersReso[4]}, Pdg::kDS1, std::array{+kPiPlus, -kKPlus, +kPiPlus, -kPiPlus}, true, &sign, 3); if (indexRecResoPartReco > -1) { - flag = sign * DecayTypeMc::Ds1ToDStarK0ToD0NoPiK0sPart; + flag = sign * DecayTypeMc::Ds1ToDstarK0ToD0NoPiK0sPart; } } } @@ -608,39 +670,40 @@ struct HfDataCreatorCharmResoReduced { auto particleReso = particlesMc.iteratorAt(indexParticle); origin = RecoDecay::getCharmHadronOrigin(particlesMc, particleReso, false, &idxBhadMothers); motherPt = particleReso.pt(); + invMassGen = RecoDecay::m(particleReso.p(), particleReso.e()); } if (doMcRecQa) { if (indexRecReso > -1) { if (nPiToMuReso == 0 && nKaToPiReso == 0) { - registry.fill(HIST("hMassVsPtDs1Matched"), varUtils.ptD, varUtils.invMassKPiPiV0 - varUtils.invMassD); + registry.fill(HIST("hMassVsPtDs1Matched"), varUtils.ptD, varUtils.invMassReso - varUtils.invMassD); } if (nPiToMuReso >= 1) { - registry.fill(HIST("hMassVsPtDs1MatchedPiToMu"), varUtils.ptD, varUtils.invMassKPiPiV0 - varUtils.invMassD); + registry.fill(HIST("hMassVsPtDs1MatchedPiToMu"), varUtils.ptD, varUtils.invMassReso - varUtils.invMassD); } if (nKaToPiReso >= 1) { - registry.fill(HIST("hMassVsPtDs1MatchedKaToPi"), varUtils.ptD, varUtils.invMassKPiPiV0 - varUtils.invMassD); + registry.fill(HIST("hMassVsPtDs1MatchedKaToPi"), varUtils.ptD, varUtils.invMassReso - varUtils.invMassD); } } if (indexRecD0 > -1) { if (nPiToMuD0 == 0 && nKaToPiD0 == 0) { - registry.fill(HIST("hMassVsPtD0Matched"), varUtils.ptD, varUtils.invMassDdau); + registry.fill(HIST("hMassVsPtD0Matched"), varUtils.ptD, varUtils.invMassD0); } if (nPiToMuD0 >= 1) { - registry.fill(HIST("hMassVsPtD0MatchedPiToMu"), varUtils.ptD, varUtils.invMassDdau); + registry.fill(HIST("hMassVsPtD0MatchedPiToMu"), varUtils.ptD, varUtils.invMassD0); } if (nKaToPiD0 >= 1) { - registry.fill(HIST("hMassVsPtD0MatchedKaToPi"), varUtils.ptD, varUtils.invMassDdau); + registry.fill(HIST("hMassVsPtD0MatchedKaToPi"), varUtils.ptD, varUtils.invMassD0); } } if (indexRecDstar > -1) { if (nPiToMuDstar == 0 && nKaToPiDstar == 0) { - registry.fill(HIST("hMassVsPtDstarMatched"), varUtils.ptD, varUtils.invMassD - varUtils.invMassDdau); + registry.fill(HIST("hMassVsPtDstarMatched"), varUtils.ptD, varUtils.invMassD - varUtils.invMassD0); } if (nPiToMuDstar >= 1) { - registry.fill(HIST("hMassVsPtDstarMatchedPiToMu"), varUtils.ptD, varUtils.invMassD - varUtils.invMassDdau); + registry.fill(HIST("hMassVsPtDstarMatchedPiToMu"), varUtils.ptD, varUtils.invMassD - varUtils.invMassD0); } if (nKaToPiDstar >= 1) { - registry.fill(HIST("hMassVsPtDstarMatchedKaToPi"), varUtils.ptD, varUtils.invMassD - varUtils.invMassDdau); + registry.fill(HIST("hMassVsPtDstarMatchedKaToPi"), varUtils.ptD, varUtils.invMassD - varUtils.invMassD0); } } if (indexRecK0 > -1) { @@ -655,10 +718,10 @@ struct HfDataCreatorCharmResoReduced { } } } - } else if constexpr (decChannel == DecayChannel::DplusV0) { + } else if constexpr (dType == DType::Dplus) { // Ds2Star → D+ K0 → (π+K-π+) K0s → (π+K-π+)(π+π-) indexRecK0 = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersReso[3], vecDaughtersReso[4]}, kK0, std::array{+kPiPlus, -kPiPlus}, true, &signV0, 2, &nPiToMuV0, &nKaToPiV0); - indexRecDplus = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersReso[0], vecDaughtersReso[1], vecDaughtersReso[2]}, Pdg::kDPlus, std::array{+kPiPlus, -kKPlus, +kPiPlus}, true, &signDPlus, 2, &nPiToMuDplus, &nKaToPiDplus); + indexRecDplus = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersReso[0], vecDaughtersReso[1], vecDaughtersReso[2]}, Pdg::kDPlus, std::array{+kPiPlus, -kKPlus, +kPiPlus}, true, &signDplus, 2, &nPiToMuDplus, &nKaToPiDplus); if (indexRecK0 > -1 && indexRecDplus > -1) { indexRecReso = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersReso[0], vecDaughtersReso[1], vecDaughtersReso[2], vecDaughtersReso[3], vecDaughtersReso[4]}, Pdg::kDS2Star, std::array{+kPiPlus, -kKPlus, +kPiPlus, +kPiPlus, -kPiPlus}, true, &sign, 3, &nPiToMuReso, &nKaToPiReso); if (indexRecReso > -1 && nPiToMuReso == 0 && nKaToPiReso == 0) { @@ -667,11 +730,11 @@ struct HfDataCreatorCharmResoReduced { flag = sign * DecayTypeMc::Ds2StarToDplusK0sOneMu; } else if (indexRecReso < 0) { // Verify partly reconstructed decay Ds1 -> D* K0s -> D+ π0 K0s - indexRecDstar = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersReso[0], vecDaughtersReso[1], vecDaughtersReso[2]}, Pdg::kDStar, std::array{-kKPlus, +kPiPlus, +kPiPlus}, true, &signDStar, 2); + indexRecDstar = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersReso[0], vecDaughtersReso[1], vecDaughtersReso[2]}, Pdg::kDStar, std::array{-kKPlus, +kPiPlus, +kPiPlus}, true, &signDstar, 2); if (indexRecDstar > -1) { indexRecReso = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersReso[0], vecDaughtersReso[1], vecDaughtersReso[2], vecDaughtersReso[3], vecDaughtersReso[4]}, Pdg::kDS1, std::array{+kPiPlus, -kKPlus, +kPiPlus, +kPiPlus, -kPiPlus}, true, &sign, 3); if (indexRecReso > -1) { - flag = sign * DecayTypeMc::Ds1ToDStarK0ToDPlusPi0K0s; + flag = sign * DecayTypeMc::Ds1ToDstarK0ToDplusPi0K0s; } } } @@ -680,17 +743,18 @@ struct HfDataCreatorCharmResoReduced { auto particleReso = particlesMc.iteratorAt(indexRecReso); origin = RecoDecay::getCharmHadronOrigin(particlesMc, particleReso, false, &idxBhadMothers); motherPt = particleReso.pt(); + invMassGen = RecoDecay::m(particleReso.p(), particleReso.e()); } if (doMcRecQa) { if (indexRecReso > -1) { if (nPiToMuReso == 0 && nKaToPiReso == 0) { - registry.fill(HIST("hMassVsPtDs2StarMatched"), varUtils.ptD, varUtils.invMassKPiPiV0 - varUtils.invMassD); + registry.fill(HIST("hMassVsPtDs2StarMatched"), varUtils.ptD, varUtils.invMassReso - varUtils.invMassD); } if (nPiToMuReso >= 1) { - registry.fill(HIST("hMassVsPtDs2StarMatchedPiToMu"), varUtils.ptD, varUtils.invMassKPiPiV0 - varUtils.invMassD); + registry.fill(HIST("hMassVsPtDs2StarMatchedPiToMu"), varUtils.ptD, varUtils.invMassReso - varUtils.invMassD); } if (nKaToPiReso >= 1) { - registry.fill(HIST("hMassVsPtDs2StarMatchedKaToPi"), varUtils.ptD, varUtils.invMassKPiPiV0 - varUtils.invMassD); + registry.fill(HIST("hMassVsPtDs2StarMatchedKaToPi"), varUtils.ptD, varUtils.invMassReso - varUtils.invMassD); } } if (indexRecDplus > -1) { @@ -720,6 +784,7 @@ struct HfDataCreatorCharmResoReduced { if (flag != 0) { registry.fill(HIST("hMCRecCounter"), flag); registry.fill(HIST("hMCRecOrigin"), origin); + registry.fill(HIST("hMCRecMassGen"), invMassGen); } else { if (indexRecK0 > -1) { SETBIT(debug, PartialMatchMc::K0Matched); @@ -728,21 +793,23 @@ struct HfDataCreatorCharmResoReduced { SETBIT(debug, PartialMatchMc::D0Matched); } if (indexRecDstar > -1) { - SETBIT(debug, PartialMatchMc::DStarMatched); + SETBIT(debug, PartialMatchMc::DstarMatched); } if (indexRecDplus > -1) { - SETBIT(debug, PartialMatchMc::DPlusMatched); + SETBIT(debug, PartialMatchMc::DplusMatched); } registry.fill(HIST("hMCRecDebug"), debug); } - rowHfDV0McRecReduced(indexHfCandCharm, indexCandV0, flag, debug, origin, signD0, motherPt); + rowHfDV0McRecReduced(indexHfCandCharm, indexCandV0, flag, debug, origin, signD0, motherPt, invMassGen); } - template + template void runDataCreation(Coll const& collision, CCands const& candsD, - BBach const& bachelors, - Tr const&, + BBachV0s const& bachelorV0s, + BBachTracks const& bachelorTrks, + Tr const& tracks, + TrIU const&, PParticles const& particlesMc, aod::BCsWithTimestamps const&) { @@ -753,6 +820,8 @@ struct HfDataCreatorCharmResoReduced { std::map selectedV0s; std::map selectedTracks; bool fillHfReducedCollision = false; + const bool doTracks = pairingType == PairingType::TrackOnly || pairingType == PairingType::V0AndTrack; + const bool doV0s = pairingType == PairingType::V0Only || pairingType == PairingType::V0AndTrack; auto bc = collision.template bc_as(); if (runNumber != bc.runNumber()) { LOG(info) << ">>>>>>>>>>>> Current run number: " << runNumber; @@ -763,60 +832,80 @@ struct HfDataCreatorCharmResoReduced { fitter.setBz(bz); // loop on D candidates for (const auto& candD : candsD) { - // initialize variables depending on decay channel + // initialize variables depending on D meson type bool fillHfCandD = false; - std::array pVecD; - std::array pVecProng2; std::array secondaryVertexD; std::array prongIdsD; - int8_t dtype; - std::array bdtScores; - std::vector charmHadDauTracks{}; + int8_t dtype{0}; + std::array bdtScores = {-1.f, -1.f, -1.f, -1.f, -1.f, -1.f}; + std::vector charmHadDauTracks{}; varUtils.ptD = candD.pt(); - if constexpr (DecayChannel == DecayChannel::DstarV0 || DecayChannel == DecayChannel::DstarTrack) { - if (candD.signSoftPi() > 0) { + if constexpr (dType == DType::Dstar) { + varUtils.signD = candD.signSoftPi(); + if (varUtils.signD > 0) { varUtils.invMassD = candD.invMassDstar(); - varUtils.invMassDdau = candD.invMassD0(); + varUtils.invMassD0 = candD.invMassD0(); } else { varUtils.invMassD = candD.invMassAntiDstar(); - varUtils.invMassDdau = candD.invMassD0Bar(); + varUtils.invMassD0 = candD.invMassD0Bar(); } - pVecD = candD.pVector(); secondaryVertexD[0] = candD.xSecondaryVertexD0(); secondaryVertexD[1] = candD.ySecondaryVertexD0(); secondaryVertexD[2] = candD.zSecondaryVertexD0(); prongIdsD[0] = candD.prong0Id(); prongIdsD[1] = candD.prong1Id(); prongIdsD[2] = candD.prongPiId(); - pVecProng2 = candD.pVecSoftPi(); - charmHadDauTracks.push_back(candD.template prong0_as
()); - charmHadDauTracks.push_back(candD.template prong1_as
()); - charmHadDauTracks.push_back(candD.template prongPi_as
()); - dtype = candD.signSoftPi() * DType::Dstar; + std::copy(candD.pVectorProng0().begin(), candD.pVectorProng0().end(), varUtils.pVectorProng0.begin()); + std::copy(candD.pVectorProng1().begin(), candD.pVectorProng1().end(), varUtils.pVectorProng1.begin()); + std::copy(candD.pVecSoftPi().begin(), candD.pVecSoftPi().end(), varUtils.pVectorProng2.begin()); + charmHadDauTracks.push_back(candD.template prong0_as()); + charmHadDauTracks.push_back(candD.template prong1_as()); + charmHadDauTracks.push_back(candD.template prongPi_as()); + dtype = varUtils.signD * DType::Dstar; if constexpr (withMl) { std::copy(candD.mlProbDstarToD0Pi().begin(), candD.mlProbDstarToD0Pi().end(), bdtScores.begin()); } - registry.fill(HIST("hMassVsPtDstarAll"), candD.pt(), varUtils.invMassD - varUtils.invMassDdau); - } else if constexpr (DecayChannel == DecayChannel::DplusV0) { - auto prong0 = candD.template prong0_as
(); + registry.fill(HIST("hMassVsPtDstarAll"), varUtils.ptD, varUtils.invMassD - varUtils.invMassD0); + } else if constexpr (dType == DType::Dplus) { + auto prong0 = candD.template prong0_as(); varUtils.invMassD = hfHelper.invMassDplusToPiKPi(candD); - pVecD = candD.pVector(); secondaryVertexD[0] = candD.xSecondaryVertex(); secondaryVertexD[1] = candD.ySecondaryVertex(); secondaryVertexD[2] = candD.zSecondaryVertex(); prongIdsD[0] = candD.prong0Id(); prongIdsD[1] = candD.prong1Id(); prongIdsD[2] = candD.prong2Id(); - pVecProng2 = candD.pVectorProng2(); - dtype = static_cast(prong0.sign() * DType::Dplus); - charmHadDauTracks.push_back(candD.template prong0_as
()); - charmHadDauTracks.push_back(candD.template prong1_as
()); - charmHadDauTracks.push_back(candD.template prong2_as
()); + varUtils.signD = prong0.sign(); + std::copy(candD.pVectorProng0().begin(), candD.pVectorProng0().end(), varUtils.pVectorProng0.begin()); + std::copy(candD.pVectorProng1().begin(), candD.pVectorProng1().end(), varUtils.pVectorProng1.begin()); + std::copy(candD.pVectorProng2().begin(), candD.pVectorProng2().end(), varUtils.pVectorProng2.begin()); + dtype = static_cast(varUtils.signD * DType::Dplus); + charmHadDauTracks.push_back(candD.template prong0_as()); + charmHadDauTracks.push_back(candD.template prong1_as()); + charmHadDauTracks.push_back(candD.template prong2_as()); if constexpr (withMl) { std::copy(candD.mlProbDplusToPiKPi().begin(), candD.mlProbDplusToPiKPi().end(), bdtScores.begin()); } - registry.fill(HIST("hMassVsPtDplusAll"), candD.pt(), varUtils.invMassD); - } // else if + registry.fill(HIST("hMassVsPtDplusAll"), varUtils.ptD, varUtils.invMassD0); + } else if constexpr (dType == DType::D0) { + varUtils.invMassD0 = hfHelper.invMassD0ToPiK(candD); + varUtils.invMassD0Bar = hfHelper.invMassD0barToKPi(candD); + secondaryVertexD[0] = candD.xSecondaryVertex(); + secondaryVertexD[1] = candD.ySecondaryVertex(); + secondaryVertexD[2] = candD.zSecondaryVertex(); + prongIdsD[0] = candD.prong0Id(); + prongIdsD[1] = candD.prong1Id(); + prongIdsD[2] = -1; // D0 does not have a third prong + charmHadDauTracks.push_back(candD.template prong0_as()); + charmHadDauTracks.push_back(candD.template prong1_as()); + std::copy(candD.pVectorProng0().begin(), candD.pVectorProng0().end(), varUtils.pVectorProng0.begin()); + std::copy(candD.pVectorProng1().begin(), candD.pVectorProng1().end(), varUtils.pVectorProng1.begin()); + varUtils.pVectorProng2 = {0.f, 0.f, 0.f}; // D0 does not have a third prong + if constexpr (withMl) { + std::copy(candD.mlProbD0().begin(), candD.mlProbD0().end(), bdtScores.begin()); + std::copy(candD.mlProbD0bar().begin(), candD.mlProbD0bar().end(), bdtScores.begin() + 3); + } + } // end of dType switch // Get single track variables float chi2TpcDauMax = -1.f; @@ -833,11 +922,11 @@ struct HfDataCreatorCharmResoReduced { } } - if constexpr (DecayChannel == DecayChannel::DplusV0 || DecayChannel == DecayChannel::DstarV0) { - // Loop on V0 candidates - for (const auto& v0 : bachelors) { - auto trackPos = v0.template posTrack_as
(); - auto trackNeg = v0.template negTrack_as
(); + // Loop on the bachelor V0s + if constexpr (doV0s) { + for (const auto& v0 : bachelorV0s) { + auto trackPos = v0.template posTrack_as(); + auto trackNeg = v0.template negTrack_as(); // Apply selsection auto v0DauTracks = std::array{trackPos, trackNeg}; if (!buildAndSelectV0(collision, prongIdsD, v0DauTracks)) { @@ -867,44 +956,95 @@ struct HfDataCreatorCharmResoReduced { o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParK0, 2.f, matCorr, &dcaInfo); getPxPyPz(trackParK0, candidateV0.mom); } + // compute resonance invariant mass and filling of QA histograms if (TESTBIT(candidateV0.v0Type, K0s)) { - if constexpr (DecayChannel == DecayChannel::DplusV0) { - varUtils.invMassKPiPiV0 = RecoDecay::m(std::array{candD.pVectorProng0(), candD.pVectorProng1(), candD.pVectorProng2(), candidateV0.mom}, std::array{MassPiPlus, MassKPlus, MassPiPlus, MassK0}); - // varUtils.ptReso = RecoDecay::pt(std::array{candD.pVectorProng0(), candD.pVectorProng1(), candD.pVectorProng2(), candidateV0.mom}); - } else if (DecayChannel == DecayChannel::DstarV0) { - // varUtils.ptReso = RecoDecay::pt(std::array{candD.pVectorProng0(), candD.pVectorProng1(), candD.pVecSoftPi(), candidateV0.mom}); - if (candD.signSoftPi() > 0) { - varUtils.invMassKPiPiV0 = RecoDecay::m(std::array{candD.pVectorProng0(), candD.pVectorProng1(), candD.pVecSoftPi(), candidateV0.mom}, std::array{MassPiPlus, MassKPlus, MassPiPlus, MassK0}); - } else { - varUtils.invMassKPiPiV0 = RecoDecay::m(std::array{candD.pVectorProng1(), candD.pVectorProng0(), candD.pVecSoftPi(), candidateV0.mom}, std::array{MassPiPlus, MassKPlus, MassPiPlus, MassK0}); - } - } registry.fill(HIST("hMassVsPtK0s"), candidateV0.pT, candidateV0.mK0Short); - if constexpr (DecayChannel == DecayChannel::DstarV0) { - registry.fill(HIST("hMassDs1"), varUtils.invMassKPiPiV0 - varUtils.invMassD); - } else if constexpr (DecayChannel == DecayChannel::DplusV0) { - registry.fill(HIST("hMassDsStar2"), varUtils.invMassKPiPiV0 - varUtils.invMassD); - } - } + switch (dType) { + case DType::Dstar: + varUtils.ptReso = RecoDecay::pt(RecoDecay::sumOfVec(varUtils.pVectorProng0, varUtils.pVectorProng1, varUtils.pVectorProng2, candidateV0.mom)); + if (varUtils.signD > 0) { + varUtils.invMassReso = RecoDecay::m(std::array{varUtils.pVectorProng0, varUtils.pVectorProng1, varUtils.pVectorProng2, candidateV0.mom}, std::array{MassPiPlus, MassKPlus, MassPiPlus, MassK0}); + } else { + varUtils.invMassReso = RecoDecay::m(std::array{varUtils.pVectorProng1, varUtils.pVectorProng0, varUtils.pVectorProng2, candidateV0.mom}, std::array{MassPiPlus, MassKPlus, MassPiPlus, MassK0}); + } + if (!cfgQaPlots.applyCutsForQaHistograms || + (varUtils.invMassD - varUtils.invMassD0 > cfgQaPlots.cutMassDstarMin && + varUtils.invMassD - varUtils.invMassD0 < cfgQaPlots.cutMassDstarMax && + candidateV0.mK0Short > cfgQaPlots.cutMassK0sMin && + candidateV0.mK0Short < cfgQaPlots.cutMassK0sMax)) { + registry.fill(HIST("hMassDstarK0s"), varUtils.ptReso, varUtils.invMassReso - varUtils.invMassD); + } + break; + case DType::Dplus: + varUtils.invMassReso = RecoDecay::m(std::array{varUtils.pVectorProng0, varUtils.pVectorProng1, varUtils.pVectorProng2, candidateV0.mom}, std::array{MassPiPlus, MassKPlus, MassPiPlus, MassK0}); + varUtils.ptReso = RecoDecay::pt(RecoDecay::sumOfVec(varUtils.pVectorProng0, varUtils.pVectorProng1, varUtils.pVectorProng2, candidateV0.mom)); + if (!cfgQaPlots.applyCutsForQaHistograms || + (varUtils.invMassD > cfgQaPlots.cutMassDMin && + varUtils.invMassD < cfgQaPlots.cutMassDMax && + candidateV0.mK0Short > cfgQaPlots.cutMassK0sMin && + candidateV0.mK0Short < cfgQaPlots.cutMassK0sMax)) { + registry.fill(HIST("hMassDplusK0s"), varUtils.ptReso, varUtils.invMassReso - varUtils.invMassD); + } + break; + default: + break; // no other D meson types expected + } // end of dType switch + } // matched with K0s bool isLambda = TESTBIT(candidateV0.v0Type, Lambda); bool isAntiLambda = TESTBIT(candidateV0.v0Type, AntiLambda); if (isLambda || isAntiLambda) { - if constexpr (DecayChannel == DecayChannel::DplusV0) { - varUtils.invMassKPiPiV0 = RecoDecay::m(std::array{candD.pVectorProng0(), candD.pVectorProng1(), candD.pVectorProng2(), candidateV0.mom}, std::array{MassPiPlus, MassKPlus, MassPiPlus, MassLambda0}); - } else if (DecayChannel == DecayChannel::DstarV0) { - if (candD.signSoftPi() > 0) { - varUtils.invMassKPiPiV0 = RecoDecay::m(std::array{candD.pVectorProng0(), candD.pVectorProng1(), candD.pVecSoftPi(), candidateV0.mom}, std::array{MassPiPlus, MassKPlus, MassPiPlus, MassLambda0}); - } else { - varUtils.invMassKPiPiV0 = RecoDecay::m(std::array{candD.pVectorProng1(), candD.pVectorProng0(), candD.pVecSoftPi(), candidateV0.mom}, std::array{MassPiPlus, MassKPlus, MassPiPlus, MassLambda0}); - } - } - if (isLambda || isAntiLambda) { - registry.fill(HIST("hMassVsPtLambda"), candidateV0.pT, candidateV0.mLambda); - } - if constexpr (DecayChannel == DecayChannel::DplusV0) { - registry.fill(HIST("hMassXcRes"), varUtils.invMassKPiPiV0 - varUtils.invMassD); - } - } + registry.fill(HIST("hMassVsPtLambda"), candidateV0.pT, candidateV0.mLambda); + switch (dType) { + case DType::Dstar: + varUtils.ptReso = RecoDecay::pt(RecoDecay::sumOfVec(varUtils.pVectorProng0, varUtils.pVectorProng1, varUtils.pVectorProng2, candidateV0.mom)); + if (varUtils.signD > 0) { + varUtils.invMassReso = RecoDecay::m(std::array{varUtils.pVectorProng0, varUtils.pVectorProng1, varUtils.pVectorProng2, candidateV0.mom}, std::array{MassPiPlus, MassKPlus, MassPiPlus, MassLambda}); + } else { + varUtils.invMassReso = RecoDecay::m(std::array{varUtils.pVectorProng1, varUtils.pVectorProng0, varUtils.pVectorProng2, candidateV0.mom}, std::array{MassPiPlus, MassKPlus, MassPiPlus, MassLambda}); + } + if (!cfgQaPlots.applyCutsForQaHistograms || + (varUtils.invMassD - varUtils.invMassD0 > cfgQaPlots.cutMassDstarMin && + varUtils.invMassD - varUtils.invMassD0 < cfgQaPlots.cutMassDstarMax && + candidateV0.mLambda > cfgQaPlots.cutMassLambdaMin && + candidateV0.mLambda < cfgQaPlots.cutMassLambdaMax)) { + registry.fill(HIST("hMassDstarLambda"), varUtils.ptReso, varUtils.invMassReso - varUtils.invMassD); + } + break; + case DType::Dplus: + varUtils.invMassReso = RecoDecay::m(std::array{varUtils.pVectorProng0, varUtils.pVectorProng1, varUtils.pVectorProng2, candidateV0.mom}, std::array{MassPiPlus, MassKPlus, MassPiPlus, MassLambda}); + varUtils.ptReso = RecoDecay::pt(RecoDecay::sumOfVec(varUtils.pVectorProng0, varUtils.pVectorProng1, varUtils.pVectorProng2, candidateV0.mom)); + if (!cfgQaPlots.applyCutsForQaHistograms || + (varUtils.invMassD > cfgQaPlots.cutMassDMin && + varUtils.invMassD < cfgQaPlots.cutMassDMax && + candidateV0.mLambda > cfgQaPlots.cutMassLambdaMin && + candidateV0.mLambda < cfgQaPlots.cutMassLambdaMax)) { + registry.fill(HIST("hMassDplusLambda"), varUtils.ptReso, varUtils.invMassReso - varUtils.invMassD); + } + break; + case DType::D0: + if (isLambda) { + varUtils.invMassReso = RecoDecay::m(std::array{varUtils.pVectorProng0, varUtils.pVectorProng1, candidateV0.mom}, std::array{MassPiPlus, MassKPlus, MassLambda}); + } else { + varUtils.invMassReso = RecoDecay::m(std::array{varUtils.pVectorProng1, varUtils.pVectorProng0, candidateV0.mom}, std::array{MassPiPlus, MassKPlus, MassLambda}); + } + varUtils.ptReso = RecoDecay::pt(RecoDecay::sumOfVec(varUtils.pVectorProng0, varUtils.pVectorProng1, candidateV0.mom)); + if (!cfgQaPlots.applyCutsForQaHistograms || + (varUtils.invMassD0 > cfgQaPlots.cutMassDMin && + varUtils.invMassD0 < cfgQaPlots.cutMassDMax && + candidateV0.mLambda > cfgQaPlots.cutMassLambdaMin && + candidateV0.mLambda < cfgQaPlots.cutMassLambdaMax)) { + if (isLambda) { + registry.fill(HIST("hMassD0Lambda"), varUtils.ptReso, varUtils.invMassReso - varUtils.invMassD0); + } else { + registry.fill(HIST("hMassD0Lambda"), varUtils.ptReso, varUtils.invMassReso - varUtils.invMassD0Bar); + } + } + break; + default: + break; + } // end of dType switch + } // matched with Lambda or AntiLambda + // fill V0 table // if information on V0 already stored, go to next V0 if (!selectedV0s.count(v0.globalIndex())) { @@ -920,26 +1060,27 @@ struct HfDataCreatorCharmResoReduced { selectedV0s[v0.globalIndex()] = hfCandV0.lastIndex(); } fillHfCandD = true; - // Optional filling of MC Rec table - if constexpr (doMc) { + // Optional filling of MC Rec table, for now only implemented for Ds1->D*K0s and Ds2*->D+K0s + if constexpr (doMc && (dType == DType::Dstar || dType == DType::Dplus)) { std::vector charmResoDauTracks{}; for (const auto& track : charmHadDauTracks) { charmResoDauTracks.push_back(track); } charmResoDauTracks.push_back(trackPos); charmResoDauTracks.push_back(trackNeg); - int indexHfCandCharm = hfCandD.lastIndex() + 1; + int indexHfCandCharm = hfCandD3Pr.lastIndex() + 1; int indexHfCandV0 = hfCandV0.lastIndex(); - fillMcRecoInfo(particlesMc, charmResoDauTracks, indexHfCandCharm, indexHfCandV0); + fillMcRecoInfo(particlesMc, charmResoDauTracks, indexHfCandCharm, indexHfCandV0); } - } // V0 loop - } else if constexpr (DecayChannel == DecayChannel::DstarTrack) { - for (const auto& trackIndex : bachelors) { - auto track = trackIndex.template track_as
(); + } // end of loop on V0 candidates + } // end of do V0s + // Loop on the bachelor tracks + if constexpr (doTracks) { + for (const auto& trackIndex : bachelorTrks) { + auto track = tracks.rawIteratorAt(trackIndex.trackId()); if (!isTrackSelected(track, prongIdsD)) { continue; } - // if the track has been reassociated, re-propagate it to PV (minor difference) auto trackParCovTrack = getTrackParCov(track); std::array dcaTrack{track.dcaXY(), track.dcaZ()}; @@ -948,15 +1089,162 @@ struct HfDataCreatorCharmResoReduced { o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParCovTrack, 2.f, matCorr, &dcaTrack); getPxPyPz(trackParCovTrack, pVecTrack); } - registry.fill(HIST("hdEdxVsP"), track.p(), track.tpcSignal()); - float invMassKPiPiP{0.f}; - if (candD.signSoftPi() > 0) { - invMassKPiPiP = RecoDecay::m(std::array{candD.pVectorProng0(), candD.pVectorProng1(), candD.pVecSoftPi(), pVecTrack}, std::array{MassPiPlus, MassKPlus, MassPiPlus, MassProton}); - } else { - invMassKPiPiP = RecoDecay::m(std::array{candD.pVectorProng1(), candD.pVectorProng0(), candD.pVecSoftPi(), pVecTrack}, std::array{MassPiPlus, MassKPlus, MassPiPlus, MassProton}); - } - registry.fill(HIST("hMassDstarProton"), invMassKPiPiP - varUtils.invMassD); + // compute invariant mass and filling of QA histograms + switch (dType) { + case DType::Dstar: + // D* pi + if (std::abs(track.tpcNSigmaPi()) < cfgSingleTrackCuts.maxNsigmaTpcPi) { + if (varUtils.signD > 0 && track.sign() < 0) { + varUtils.invMassReso = RecoDecay::m(std::array{varUtils.pVectorProng0, varUtils.pVectorProng1, varUtils.pVectorProng2, pVecTrack}, std::array{MassPiPlus, MassKPlus, MassPiPlus, MassPiPlus}); + } else if (varUtils.signD < 0 && track.sign() > 0) { + varUtils.invMassReso = RecoDecay::m(std::array{varUtils.pVectorProng1, varUtils.pVectorProng0, varUtils.pVectorProng2, pVecTrack}, std::array{MassPiPlus, MassKPlus, MassPiPlus, MassPiPlus}); + } else { + varUtils.invMassReso = -1.f; // invalid case + } + varUtils.ptReso = RecoDecay::pt(RecoDecay::sumOfVec(varUtils.pVectorProng0, varUtils.pVectorProng1, varUtils.pVectorProng2, pVecTrack)); + if (!cfgQaPlots.applyCutsForQaHistograms || + (varUtils.invMassD - varUtils.invMassD0 > cfgQaPlots.cutMassDstarMin && + varUtils.invMassD - varUtils.invMassD0 < cfgQaPlots.cutMassDstarMax)) { + registry.fill(HIST("hMassDstarPi"), varUtils.ptReso, varUtils.invMassReso - varUtils.invMassD); + } + } + if (std::abs(track.tpcNSigmaKa()) < cfgSingleTrackCuts.maxNsigmaTpcKa) { + if (varUtils.signD > 0 && track.sign() < 0) { + varUtils.invMassReso = RecoDecay::m(std::array{varUtils.pVectorProng0, varUtils.pVectorProng1, varUtils.pVectorProng2, pVecTrack}, std::array{MassPiPlus, MassKPlus, MassPiPlus, MassKPlus}); + } else if (varUtils.signD < 0 && track.sign() > 0) { + varUtils.invMassReso = RecoDecay::m(std::array{varUtils.pVectorProng1, varUtils.pVectorProng0, varUtils.pVectorProng2, pVecTrack}, std::array{MassPiPlus, MassKPlus, MassPiPlus, MassKPlus}); + } else { + varUtils.invMassReso = -1.f; // invalid case + } + varUtils.ptReso = RecoDecay::pt(RecoDecay::sumOfVec(varUtils.pVectorProng0, varUtils.pVectorProng1, varUtils.pVectorProng2, pVecTrack)); + if (!cfgQaPlots.applyCutsForQaHistograms || + (varUtils.invMassD - varUtils.invMassD0 > cfgQaPlots.cutMassDstarMin && + varUtils.invMassD - varUtils.invMassD0 < cfgQaPlots.cutMassDstarMax)) { + registry.fill(HIST("hMassDstarK"), varUtils.ptReso, varUtils.invMassReso - varUtils.invMassD); + } + } + // D* p + if (std::abs(track.tpcNSigmaPr()) < cfgSingleTrackCuts.maxNsigmaTpcPr) { + if (varUtils.signD > 0 && track.sign() > 0) { + varUtils.invMassReso = RecoDecay::m(std::array{varUtils.pVectorProng0, varUtils.pVectorProng1, varUtils.pVectorProng2, pVecTrack}, std::array{MassPiPlus, MassKPlus, MassPiPlus, MassProton}); + } else if (varUtils.signD < 0 && track.sign() < 0) { + varUtils.invMassReso = RecoDecay::m(std::array{varUtils.pVectorProng1, varUtils.pVectorProng0, varUtils.pVectorProng2, pVecTrack}, std::array{MassPiPlus, MassKPlus, MassPiPlus, MassProton}); + } else { + varUtils.invMassReso = -1.f; // invalid case + } + varUtils.ptReso = RecoDecay::pt(RecoDecay::sumOfVec(varUtils.pVectorProng0, varUtils.pVectorProng1, varUtils.pVectorProng2, pVecTrack)); + if (!cfgQaPlots.applyCutsForQaHistograms || + (varUtils.invMassD - varUtils.invMassD0 > cfgQaPlots.cutMassDstarMin && + varUtils.invMassD - varUtils.invMassD0 < cfgQaPlots.cutMassDstarMax)) { + registry.fill(HIST("hMassDstarProton"), varUtils.ptReso, varUtils.invMassReso - varUtils.invMassD); + } + } + break; + case DType::Dplus: + // D+ pi + if (std::abs(track.tpcNSigmaPi()) < cfgSingleTrackCuts.maxNsigmaTpcPi) { + if (varUtils.signD * track.sign() < 0) { + varUtils.invMassReso = RecoDecay::m(std::array{varUtils.pVectorProng0, varUtils.pVectorProng1, varUtils.pVectorProng2, pVecTrack}, std::array{MassPiPlus, MassKPlus, MassPiPlus, MassPiPlus}); + } else { + varUtils.invMassReso = -1.f; // invalid case + } + varUtils.ptReso = RecoDecay::pt(RecoDecay::sumOfVec(varUtils.pVectorProng0, varUtils.pVectorProng1, varUtils.pVectorProng2, pVecTrack)); + if (!cfgQaPlots.applyCutsForQaHistograms || + (varUtils.invMassD > cfgQaPlots.cutMassDMin && + varUtils.invMassD < cfgQaPlots.cutMassDMax)) { + registry.fill(HIST("hMassDplusPi"), varUtils.ptReso, varUtils.invMassReso - varUtils.invMassD); + } + } + // D+ K + if (std::abs(track.tpcNSigmaKa()) < cfgSingleTrackCuts.maxNsigmaTpcKa) { + if (varUtils.signD * track.sign() < 0) { + varUtils.invMassReso = RecoDecay::m(std::array{varUtils.pVectorProng0, varUtils.pVectorProng1, varUtils.pVectorProng2, pVecTrack}, std::array{MassPiPlus, MassKPlus, MassPiPlus, MassKPlus}); + } else { + varUtils.invMassReso = -1.f; // invalid case + } + varUtils.ptReso = RecoDecay::pt(RecoDecay::sumOfVec(varUtils.pVectorProng0, varUtils.pVectorProng1, varUtils.pVectorProng2, pVecTrack)); + if (!cfgQaPlots.applyCutsForQaHistograms || + (varUtils.invMassD > cfgQaPlots.cutMassDMin && + varUtils.invMassD < cfgQaPlots.cutMassDMax)) { + registry.fill(HIST("hMassDplusK"), varUtils.ptReso, varUtils.invMassReso - varUtils.invMassD); + } + } + // D+ pr + if (std::abs(track.tpcNSigmaPr()) < cfgSingleTrackCuts.maxNsigmaTpcPr) { + if (varUtils.signD * track.sign() < 0) { + varUtils.invMassReso = RecoDecay::m(std::array{varUtils.pVectorProng0, varUtils.pVectorProng1, varUtils.pVectorProng2, pVecTrack}, std::array{MassPiPlus, MassKPlus, MassPiPlus, MassProton}); + } else { + varUtils.invMassReso = -1.f; // invalid case + } + varUtils.ptReso = RecoDecay::pt(RecoDecay::sumOfVec(varUtils.pVectorProng0, varUtils.pVectorProng1, varUtils.pVectorProng2, pVecTrack)); + if (!cfgQaPlots.applyCutsForQaHistograms || + (varUtils.invMassD > cfgQaPlots.cutMassDMin && + varUtils.invMassD < cfgQaPlots.cutMassDMax)) { + registry.fill(HIST("hMassDplusProton"), varUtils.ptReso, varUtils.invMassReso - varUtils.invMassD); + } + } + break; + case DType::D0: + // D0 pi + if (std::abs(track.tpcNSigmaPi()) < cfgSingleTrackCuts.maxNsigmaTpcPi) { + if (track.sign() > 0) { + varUtils.invMassReso = RecoDecay::m(std::array{varUtils.pVectorProng0, varUtils.pVectorProng1, pVecTrack}, std::array{MassPiPlus, MassKPlus, MassPiPlus}); + } else { + varUtils.invMassReso = RecoDecay::m(std::array{varUtils.pVectorProng1, varUtils.pVectorProng0, pVecTrack}, std::array{MassPiPlus, MassKPlus, MassPiPlus}); + } + varUtils.ptReso = RecoDecay::pt(RecoDecay::sumOfVec(varUtils.pVectorProng0, varUtils.pVectorProng1, pVecTrack)); + if (!cfgQaPlots.applyCutsForQaHistograms || + (varUtils.invMassD0 > cfgQaPlots.cutMassDMin && + varUtils.invMassD0 < cfgQaPlots.cutMassDMax)) { + if (track.sign() > 0) { + registry.fill(HIST("hMassD0Pi"), varUtils.ptReso, varUtils.invMassReso - varUtils.invMassD0); + } else { + registry.fill(HIST("hMassD0Pi"), varUtils.ptReso, varUtils.invMassReso - varUtils.invMassD0Bar); + } + } + } + // D0 K + if (std::abs(track.tpcNSigmaKa()) < cfgSingleTrackCuts.maxNsigmaTpcKa) { + if (track.sign() > 0) { + varUtils.invMassReso = RecoDecay::m(std::array{varUtils.pVectorProng0, varUtils.pVectorProng1, pVecTrack}, std::array{MassPiPlus, MassKPlus, MassKPlus}); + } else { + varUtils.invMassReso = RecoDecay::m(std::array{varUtils.pVectorProng1, varUtils.pVectorProng0, pVecTrack}, std::array{MassPiPlus, MassKPlus, MassKPlus}); + } + varUtils.ptReso = RecoDecay::pt(RecoDecay::sumOfVec(varUtils.pVectorProng0, varUtils.pVectorProng1, pVecTrack)); + if (!cfgQaPlots.applyCutsForQaHistograms || + (varUtils.invMassD0 > cfgQaPlots.cutMassDMin && + varUtils.invMassD0 < cfgQaPlots.cutMassDMax)) { + if (track.sign() > 0) { + registry.fill(HIST("hMassD0K"), varUtils.ptReso, varUtils.invMassReso - varUtils.invMassD0); + } else { + registry.fill(HIST("hMassD0K"), varUtils.ptReso, varUtils.invMassReso - varUtils.invMassD0Bar); + } + } + } + // D0 p + if (std::abs(track.tpcNSigmaPr()) < cfgSingleTrackCuts.maxNsigmaTpcPr) { + if (track.sign() > 0) { + varUtils.invMassReso = RecoDecay::m(std::array{varUtils.pVectorProng0, varUtils.pVectorProng1, pVecTrack}, std::array{MassProton, MassKPlus, MassProton}); + } else { + varUtils.invMassReso = RecoDecay::m(std::array{varUtils.pVectorProng1, varUtils.pVectorProng0, pVecTrack}, std::array{MassProton, MassKPlus, MassProton}); + } + varUtils.ptReso = RecoDecay::pt(RecoDecay::sumOfVec(varUtils.pVectorProng0, varUtils.pVectorProng1, pVecTrack)); + if (!cfgQaPlots.applyCutsForQaHistograms || + (varUtils.invMassD0 > cfgQaPlots.cutMassDMin && + varUtils.invMassD0 < cfgQaPlots.cutMassDMax)) { + if (track.sign() > 0) { + registry.fill(HIST("hMassD0Proton"), varUtils.ptReso, varUtils.invMassReso - varUtils.invMassD0); + } else { + registry.fill(HIST("hMassD0Proton"), varUtils.ptReso, varUtils.invMassReso - varUtils.invMassD0Bar); + } + } + } + break; + default: + break; // no other D meson types expected + } // end of DType switch + // fill track table if (!selectedTracks.count(track.globalIndex())) { hfTrackNoParam(indexHfReducedCollision, track.px(), track.py(), track.pz(), track.sign(), @@ -966,25 +1254,48 @@ struct HfDataCreatorCharmResoReduced { selectedTracks[track.globalIndex()] = hfTrackNoParam.lastIndex(); } fillHfCandD = true; - } // track loop - } - + } // end of loop on bachelor tracks + } // end of do tracks + // fill D candidate table if (fillHfCandD) { // fill candDplus table only once per D candidate, only if at least one V0 is found - hfCandD(prongIdsD[0], prongIdsD[1], prongIdsD[2], - indexHfReducedCollision, - secondaryVertexD[0], secondaryVertexD[1], secondaryVertexD[2], - candD.pxProng0(), candD.pyProng0(), candD.pzProng0(), - candD.pxProng1(), candD.pyProng1(), candD.pzProng1(), - pVecProng2[0], pVecProng2[1], pVecProng2[2], - nItsClsDauMin, nTpcCrossRowsDauMin, chi2TpcDauMax, dtype); - if constexpr (withMl) { - hfCandDMl(bdtScores[0], bdtScores[1], bdtScores[2], -1., -1., -1.); + if constexpr (dType == DType::Dstar || dType == DType::Dplus) { + hfCandD3Pr(prongIdsD[0], prongIdsD[1], prongIdsD[2], + indexHfReducedCollision, + secondaryVertexD[0], secondaryVertexD[1], secondaryVertexD[2], + candD.pxProng0(), candD.pyProng0(), candD.pzProng0(), + candD.pxProng1(), candD.pyProng1(), candD.pzProng1(), + varUtils.pVectorProng2[0], varUtils.pVectorProng2[1], varUtils.pVectorProng2[2], + nItsClsDauMin, nTpcCrossRowsDauMin, chi2TpcDauMax, dtype); + if constexpr (withMl) { + hfCandD3PrMl(bdtScores[0], bdtScores[1], bdtScores[2], bdtScores[3], bdtScores[4], bdtScores[5]); + } + } else if constexpr (dType == DType::D0) { + uint8_t selFlagD0 = {BIT(D0Sel::selectedD0) | BIT(D0Sel::selectedD0Bar)}; + if (candD.isSelD0() < cfgDmesCuts.selectionFlagD0) { + CLRBIT(selFlagD0, D0Sel::selectedD0); + } + if (candD.isSelD0bar() < cfgDmesCuts.selectionFlagD0Bar) { + CLRBIT(selFlagD0, D0Sel::selectedD0Bar); + } + hfCandD2Pr(prongIdsD[0], prongIdsD[1], + indexHfReducedCollision, + secondaryVertexD[0], secondaryVertexD[1], secondaryVertexD[2], + candD.pxProng0(), candD.pyProng0(), candD.pzProng0(), + candD.pxProng1(), candD.pyProng1(), candD.pzProng1(), + nItsClsDauMin, nTpcCrossRowsDauMin, chi2TpcDauMax, + selFlagD0); + if constexpr (withMl) { + hfCandD2PrMl(bdtScores[0], bdtScores[1], bdtScores[2], bdtScores[3], bdtScores[4], bdtScores[5]); + } } fillHfReducedCollision = true; - if constexpr (DecayChannel == DecayChannel::DstarV0 || DecayChannel == DecayChannel::DstarTrack) { - registry.fill(HIST("hMassVsPtDstarPaired"), candD.pt(), varUtils.invMassD - varUtils.invMassDdau); - } else if constexpr (DecayChannel == DecayChannel::DplusV0) { + if constexpr (dType == DType::Dstar) { + registry.fill(HIST("hMassVsPtDstarPaired"), candD.pt(), varUtils.invMassD - varUtils.invMassD0); + } else if constexpr (dType == DType::Dplus) { registry.fill(HIST("hMassVsPtDplusPaired"), candD.pt(), varUtils.invMassD); + } else if constexpr (dType == DType::D0) { + registry.fill(HIST("hMassVsPtD0Paired"), candD.pt(), varUtils.invMassD0); + registry.fill(HIST("hMassVsPtD0BarPaired"), candD.pt(), varUtils.invMassD0Bar); } registry.fill(HIST("hDType"), dtype); } @@ -999,8 +1310,9 @@ struct HfDataCreatorCharmResoReduced { uint16_t hfRejMap = hfEvSel.getHfCollisionRejectionMask(collision, centrality, ccdb, registry); // fill collision table if it contains a DPi pair a minima hfReducedCollision(collision.posX(), collision.posY(), collision.posZ(), collision.numContrib(), hfRejMap, bz); - } // run data creation + } // end of runDataCreation function + // to be modified in the future to allow for different decay channels template void runMcGen(aod::McParticles const& particlesMc) { @@ -1008,8 +1320,8 @@ struct HfDataCreatorCharmResoReduced { for (const auto& particle : particlesMc) { int8_t sign{0}; int8_t flag{0}; - int8_t signDStar{0}; - int8_t signDPlus{0}; + int8_t signDstar{0}; + int8_t signDplus{0}; int8_t signV0{0}; int8_t origin = 0; std::vector idxBhadMothers{}; @@ -1021,25 +1333,25 @@ struct HfDataCreatorCharmResoReduced { origin = RecoDecay::getCharmHadronOrigin(particlesMc, particle, false, &idxBhadMothers); registry.fill(HIST("hMCGenOrigin"), origin); auto candV0MC = particlesMc.rawIteratorAt(particle.daughtersIds().back()); - auto candDStarMC = particlesMc.rawIteratorAt(particle.daughtersIds().front()); + auto candDstarMC = particlesMc.rawIteratorAt(particle.daughtersIds().front()); // K0 -> K0s -> π+π- if (RecoDecay::isMatchedMCGen(particlesMc, candV0MC, kK0, std::array{+kPiPlus, -kPiPlus}, true, &signV0, 2)) { // D* -> D0 π+ -> K-π+π+ - if (RecoDecay::isMatchedMCGen(particlesMc, candDStarMC, Pdg::kDStar, std::array{static_cast(Pdg::kD0), +static_cast(kPiPlus)}, true, &signDStar, 1)) { - auto candD0MC = particlesMc.rawIteratorAt(candDStarMC.daughtersIds().front()); - if (RecoDecay::isMatchedMCGen(particlesMc, candDStarMC, Pdg::kDStar, std::array{-kKPlus, +kPiPlus, +kPiPlus}, true, &signDStar, 2)) { - flag = signDStar * DecayTypeMc::Ds1ToDStarK0ToD0PiK0s; - } else if (RecoDecay::isMatchedMCGen(particlesMc, candD0MC, Pdg::kD0, std::array{-kKPlus, +kPiPlus, +kPiPlus, +kPi0}, true, &signDStar, 2) || - RecoDecay::isMatchedMCGen(particlesMc, candD0MC, Pdg::kD0, std::array{-kKPlus, +kPiPlus, +kPiPlus, -kPi0}, true, &signDStar, 2)) { - flag = signDStar * DecayTypeMc::Ds1ToDStarK0ToD0PiK0sPart; + if (RecoDecay::isMatchedMCGen(particlesMc, candDstarMC, Pdg::kDStar, std::array{static_cast(Pdg::kD0), +static_cast(kPiPlus)}, true, &signDstar, 1)) { + auto candD0MC = particlesMc.rawIteratorAt(candDstarMC.daughtersIds().front()); + if (RecoDecay::isMatchedMCGen(particlesMc, candDstarMC, Pdg::kDStar, std::array{-kKPlus, +kPiPlus, +kPiPlus}, true, &signDstar, 2)) { + flag = signDstar * DecayTypeMc::Ds1ToDstarK0ToD0PiK0s; + } else if (RecoDecay::isMatchedMCGen(particlesMc, candD0MC, Pdg::kD0, std::array{-kKPlus, +kPiPlus, +kPiPlus, +kPi0}, true, &signDstar, 2) || + RecoDecay::isMatchedMCGen(particlesMc, candD0MC, Pdg::kD0, std::array{-kKPlus, +kPiPlus, +kPiPlus, -kPi0}, true, &signDstar, 2)) { + flag = signDstar * DecayTypeMc::Ds1ToDstarK0ToD0PiK0sPart; } - } else if (RecoDecay::isMatchedMCGen(particlesMc, candDStarMC, Pdg::kDStar, std::array{static_cast(Pdg::kDPlus), static_cast(kGamma)}, true, &signDStar, 1) || - RecoDecay::isMatchedMCGen(particlesMc, candDStarMC, Pdg::kDStar, std::array{static_cast(Pdg::kDPlus), -static_cast(kGamma)}, true, &signDStar, 1) || - RecoDecay::isMatchedMCGen(particlesMc, candDStarMC, Pdg::kDStar, std::array{static_cast(Pdg::kDPlus), static_cast(kPi0)}, true, &signDStar, 1) || - RecoDecay::isMatchedMCGen(particlesMc, candDStarMC, Pdg::kDStar, std::array{static_cast(Pdg::kDPlus), -static_cast(kPi0)}, true, &signDStar, 1)) { - auto candDPlusMC = particlesMc.rawIteratorAt(candDStarMC.daughtersIds().front()); - if (RecoDecay::isMatchedMCGen(particlesMc, candDPlusMC, Pdg::kDPlus, std::array{+kPiPlus, -kKPlus, +kPiPlus}, true, &signDPlus, 2)) - flag = sign * DecayTypeMc::Ds1ToDStarK0ToDPlusPi0K0s; + } else if (RecoDecay::isMatchedMCGen(particlesMc, candDstarMC, Pdg::kDStar, std::array{static_cast(Pdg::kDPlus), static_cast(kGamma)}, true, &signDstar, 1) || + RecoDecay::isMatchedMCGen(particlesMc, candDstarMC, Pdg::kDStar, std::array{static_cast(Pdg::kDPlus), -static_cast(kGamma)}, true, &signDstar, 1) || + RecoDecay::isMatchedMCGen(particlesMc, candDstarMC, Pdg::kDStar, std::array{static_cast(Pdg::kDPlus), static_cast(kPi0)}, true, &signDstar, 1) || + RecoDecay::isMatchedMCGen(particlesMc, candDstarMC, Pdg::kDStar, std::array{static_cast(Pdg::kDPlus), -static_cast(kPi0)}, true, &signDstar, 1)) { + auto candDplusMC = particlesMc.rawIteratorAt(candDstarMC.daughtersIds().front()); + if (RecoDecay::isMatchedMCGen(particlesMc, candDplusMC, Pdg::kDPlus, std::array{+kPiPlus, -kKPlus, +kPiPlus}, true, &signDplus, 2)) + flag = sign * DecayTypeMc::Ds1ToDstarK0ToDplusPi0K0s; } } } else { @@ -1077,11 +1389,11 @@ struct HfDataCreatorCharmResoReduced { origin = RecoDecay::getCharmHadronOrigin(particlesMc, particle, false, &idxBhadMothers); registry.fill(HIST("hMCGenOrigin"), origin); auto candV0MC = particlesMc.rawIteratorAt(particle.daughtersIds().back()); - auto candDPlusMC = particlesMc.rawIteratorAt(particle.daughtersIds().front()); + auto candDplusMC = particlesMc.rawIteratorAt(particle.daughtersIds().front()); // K0 -> K0s -> π+π- if (RecoDecay::isMatchedMCGen(particlesMc, candV0MC, kK0, std::array{+kPiPlus, -kPiPlus}, true, &signV0, 2)) { // D* -> D0 π+ -> K-π+π+ - if (RecoDecay::isMatchedMCGen(particlesMc, candDPlusMC, Pdg::kDPlus, std::array{+kPiPlus, -kKPlus, +kPiPlus}, true, &signDPlus, 2)) { + if (RecoDecay::isMatchedMCGen(particlesMc, candDplusMC, Pdg::kDPlus, std::array{+kPiPlus, -kKPlus, +kPiPlus}, true, &signDplus, 2)) { flag = sign * DecayTypeMc::Ds2StarToDplusK0sToPiKaPiPiPi; } } @@ -1089,21 +1401,20 @@ struct HfDataCreatorCharmResoReduced { auto candV0MC = particlesMc.rawIteratorAt(particle.daughtersIds().back()); // K0 -> K0s -> π+π- if (RecoDecay::isMatchedMCGen(particlesMc, candV0MC, kK0, std::array{+kPiPlus, -kPiPlus}, true, &signV0, 2)) { - auto candDStarMC = particlesMc.rawIteratorAt(particle.daughtersIds().front()); + auto candDstarMC = particlesMc.rawIteratorAt(particle.daughtersIds().front()); // D* -> D+ π0/γ ->π+K-π+ π0/γ - if (RecoDecay::isMatchedMCGen(particlesMc, candDStarMC, Pdg::kDStar, std::array{static_cast(Pdg::kDPlus), static_cast(kGamma)}, true, &signDStar, 1) || - RecoDecay::isMatchedMCGen(particlesMc, candDStarMC, Pdg::kDStar, std::array{static_cast(Pdg::kDPlus), -static_cast(kGamma)}, true, &signDStar, 1) || - RecoDecay::isMatchedMCGen(particlesMc, candDStarMC, Pdg::kDStar, std::array{static_cast(Pdg::kDPlus), static_cast(kPi0)}, true, &signDStar, 1) || - RecoDecay::isMatchedMCGen(particlesMc, candDStarMC, Pdg::kDStar, std::array{static_cast(Pdg::kDPlus), -static_cast(kPi0)}, true, &signDStar, 1)) { - auto candDPlusMC = particlesMc.rawIteratorAt(candDStarMC.daughtersIds().front()); - if (RecoDecay::isMatchedMCGen(particlesMc, candDPlusMC, Pdg::kDPlus, std::array{+kPiPlus, -kKPlus, +kPiPlus}, true, &signDPlus, 2)) - flag = sign * DecayTypeMc::Ds1ToDStarK0ToDPlusPi0K0s; + if (RecoDecay::isMatchedMCGen(particlesMc, candDstarMC, Pdg::kDStar, std::array{static_cast(Pdg::kDPlus), static_cast(kGamma)}, true, &signDstar, 1) || + RecoDecay::isMatchedMCGen(particlesMc, candDstarMC, Pdg::kDStar, std::array{static_cast(Pdg::kDPlus), -static_cast(kGamma)}, true, &signDstar, 1) || + RecoDecay::isMatchedMCGen(particlesMc, candDstarMC, Pdg::kDStar, std::array{static_cast(Pdg::kDPlus), static_cast(kPi0)}, true, &signDstar, 1) || + RecoDecay::isMatchedMCGen(particlesMc, candDstarMC, Pdg::kDStar, std::array{static_cast(Pdg::kDPlus), -static_cast(kPi0)}, true, &signDstar, 1)) { + auto candDplusMC = particlesMc.rawIteratorAt(candDstarMC.daughtersIds().front()); + if (RecoDecay::isMatchedMCGen(particlesMc, candDplusMC, Pdg::kDPlus, std::array{+kPiPlus, -kKPlus, +kPiPlus}, true, &signDplus, 2)) + flag = sign * DecayTypeMc::Ds1ToDstarK0ToDplusPi0K0s; } } } else { if (std::abs(particle.pdgCode()) == Pdg::kDS2Star) { origin = RecoDecay::getCharmHadronOrigin(particlesMc, particle, false, &idxBhadMothers); - // LOGF(info, "Found DS2Star that decays into %d, %d", particlesMc.rawIteratorAt(particle.daughtersIds().front()).pdgCode(),particlesMc.rawIteratorAt(particle.daughtersIds().back()).pdgCode()); registry.fill(HIST("hMCOriginCounterWrongDecay"), origin); } } @@ -1134,10 +1445,14 @@ struct HfDataCreatorCharmResoReduced { } // for loop } // gen - void processDplusV0(soa::Join const& collisions, - CandsDplusFiltered const& candsDplus, - aod::V0s const& V0s, - TracksIUWithPID const& tracks, + // Process functions + // No ML + // Data + // D* + void processDstarV0(soa::Join const& collisions, + CandsDstarFiltered const& candsDstar, + aod::V0s const& v0s, + TracksIUWithPID const& tracksIU, aod::BCsWithTimestamps const& bcs) { int zvtxColl{0}; @@ -1148,21 +1463,20 @@ struct HfDataCreatorCharmResoReduced { for (const auto& collision : collisions) { o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); auto thisCollId = collision.globalIndex(); - auto candsDThisColl = candsDplus.sliceBy(candsDplusPerCollision, thisCollId); - auto V0sThisColl = V0s.sliceBy(candsV0PerCollision, thisCollId); - runDataCreation(collision, candsDThisColl, V0sThisColl, tracks, tracks, bcs); + auto candsDThisColl = candsDstar.sliceBy(candsDstarPerCollision, thisCollId); + auto v0sThisColl = v0s.sliceBy(candsV0PerCollision, thisCollId); + runDataCreation(collision, candsDThisColl, v0sThisColl, v0sThisColl, tracksIU, tracksIU, tracksIU, bcs); } // handle normalization by the right number of collisions hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); } - PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processDplusV0, "Process Dplus candidates paired with V0s without MC info and without ML info", true); + PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processDstarV0, "Process Dstar candidates paired with V0s", true); - void processDplusV0MC(soa::Join const& collisions, - CandsDplusFiltered const& candsDplus, - aod::V0s const& V0s, - TracksIUWithPIDAndMC const& tracks, - aod::McParticles const& particlesMc, - aod::BCsWithTimestamps const& bcs) + void processDstarTrack(soa::Join const& collisions, + CandsDstarFiltered const& candsDstar, + aod::TrackAssoc const& trackIndices, + TracksWithPID const& tracks, + aod::BCsWithTimestamps const& bcs) { int zvtxColl{0}; int sel8Coll{0}; @@ -1171,22 +1485,49 @@ struct HfDataCreatorCharmResoReduced { int allSelColl{0}; for (const auto& collision : collisions) { o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + auto thisCollId = collision.globalIndex(); - auto candsDThisColl = candsDplus.sliceBy(candsDplusPerCollision, thisCollId); - auto V0sThisColl = V0s.sliceBy(candsV0PerCollision, thisCollId); - runDataCreation(collision, candsDThisColl, V0sThisColl, tracks, particlesMc, bcs); + auto candsDThisColl = candsDstar.sliceBy(candsDstarPerCollision, thisCollId); + auto trackIdsThisColl = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); + runDataCreation(collision, candsDThisColl, trackIdsThisColl, trackIdsThisColl, tracks, tracks, tracks, bcs); + } + // handle normalization by the right number of collisions + hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); + } + PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processDstarTrack, "Process Dstar candidates paired with Tracks", false); + + void processDstarV0AndTrack(soa::Join const& collisions, + CandsDstarFiltered const& candsDstar, + aod::V0s const& v0s, + aod::TrackAssoc const& trackIndices, + TracksWithPID const& tracks, + TracksIUWithPID const& tracksIU, + aod::BCsWithTimestamps const& bcs) + { + int zvtxColl{0}; + int sel8Coll{0}; + int zvtxAndSel8Coll{0}; + int zvtxAndSel8CollAndSoftTrig{0}; + int allSelColl{0}; + for (const auto& collision : collisions) { + o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + auto thisCollId = collision.globalIndex(); + auto candsDThisColl = candsDstar.sliceBy(candsDstarPerCollision, thisCollId); + auto v0sThisColl = v0s.sliceBy(candsV0PerCollision, thisCollId); + auto trackIdsThisColl = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); + runDataCreation(collision, candsDThisColl, v0sThisColl, trackIdsThisColl, tracks, tracksIU, tracks, bcs); } - runMcGen(particlesMc); // handle normalization by the right number of collisions hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); } - PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processDplusV0MC, "Process DPlus candidates paired with V0s with MC matching and without ML info", false); + PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processDstarV0AndTrack, "Process Dstar candidates paired with V0s and Tracks", false); - void processDplusV0WithMl(soa::Join const& collisions, - CandsDplusFilteredWithMl const& candsDplus, - aod::V0s const& V0s, - TracksIUWithPID const& tracks, - aod::BCsWithTimestamps const& bcs) + // Dplus + void processDplusV0(soa::Join const& collisions, + CandsDplusFiltered const& candsDplus, + aod::V0s const& v0s, + TracksIUWithPID const& tracksIU, + aod::BCsWithTimestamps const& bcs) { int zvtxColl{0}; int sel8Coll{0}; @@ -1196,20 +1537,45 @@ struct HfDataCreatorCharmResoReduced { for (const auto& collision : collisions) { o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); auto thisCollId = collision.globalIndex(); - auto candsDThisColl = candsDplus.sliceBy(candsDplusPerCollisionWithMl, thisCollId); - auto V0sThisColl = V0s.sliceBy(candsV0PerCollision, thisCollId); - runDataCreation(collision, candsDThisColl, V0sThisColl, tracks, tracks, bcs); + auto candsDThisColl = candsDplus.sliceBy(candsDplusPerCollision, thisCollId); + auto v0sThisColl = v0s.sliceBy(candsV0PerCollision, thisCollId); + runDataCreation(collision, candsDThisColl, v0sThisColl, v0sThisColl, tracksIU, tracksIU, tracksIU, bcs); } // handle normalization by the right number of collisions hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); } - PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processDplusV0WithMl, "Process Dplus candidates paired with V0s with ML info", false); + PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processDplusV0, "Process Dplus candidates paired with V0s", false); - void processDplusV0MCWithMl(soa::Join const& collisions, - CandsDplusFilteredWithMl const& candsDplus, - aod::V0s const& V0s, - TracksIUWithPIDAndMC const& tracks, - aod::McParticles const& particlesMc, + void processDplusTrack(soa::Join const& collisions, + CandsDplusFiltered const& candsDplus, + aod::TrackAssoc const& trackIndices, + TracksWithPID const& tracks, + aod::BCsWithTimestamps const& bcs) + { + int zvtxColl{0}; + int sel8Coll{0}; + int zvtxAndSel8Coll{0}; + int zvtxAndSel8CollAndSoftTrig{0}; + int allSelColl{0}; + for (const auto& collision : collisions) { + o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + + auto thisCollId = collision.globalIndex(); + auto candsDThisColl = candsDplus.sliceBy(candsDplusPerCollision, thisCollId); + auto trackIdsThisColl = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); + runDataCreation(collision, candsDThisColl, trackIdsThisColl, trackIdsThisColl, tracks, tracks, tracks, bcs); + } + // handle normalization by the right number of collisions + hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); + } + PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processDplusTrack, "Process Dplus candidates paired with Tracks", false); + + void processDplusV0AndTrack(soa::Join const& collisions, + CandsDplusFiltered const& candsDplus, + aod::V0s const& v0s, + aod::TrackAssoc const& trackIndices, + TracksWithPID const& tracks, + TracksIUWithPID const& tracksIU, aod::BCsWithTimestamps const& bcs) { int zvtxColl{0}; @@ -1221,19 +1587,43 @@ struct HfDataCreatorCharmResoReduced { o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); auto thisCollId = collision.globalIndex(); auto candsDThisColl = candsDplus.sliceBy(candsDplusPerCollision, thisCollId); - auto V0sThisColl = V0s.sliceBy(candsV0PerCollision, thisCollId); - runDataCreation(collision, candsDThisColl, V0sThisColl, tracks, particlesMc, bcs); + auto v0sThisColl = v0s.sliceBy(candsV0PerCollision, thisCollId); + auto trackIdsThisColl = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); + runDataCreation(collision, candsDThisColl, v0sThisColl, trackIdsThisColl, tracks, tracksIU, tracks, bcs); } - runMcGen(particlesMc); // handle normalization by the right number of collisions hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); } - PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processDplusV0MCWithMl, "Process DPlus candidates paired with V0s with MC matching and with ML info", false); + PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processDplusV0AndTrack, "Process Dplus candidates paired with V0s and Tracks", false); + + // D0 + void processD0V0(soa::Join const& collisions, + CandsD0Filtered const& candsD0, + aod::V0s const& v0s, + TracksIUWithPID const& tracksIU, + aod::BCsWithTimestamps const& bcs) + { + int zvtxColl{0}; + int sel8Coll{0}; + int zvtxAndSel8Coll{0}; + int zvtxAndSel8CollAndSoftTrig{0}; + int allSelColl{0}; + for (const auto& collision : collisions) { + o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + auto thisCollId = collision.globalIndex(); + auto candsDThisColl = candsD0.sliceBy(candsD0PerCollision, thisCollId); + auto v0sThisColl = v0s.sliceBy(candsV0PerCollision, thisCollId); + runDataCreation(collision, candsDThisColl, v0sThisColl, v0sThisColl, tracksIU, tracksIU, tracksIU, bcs); + } + // handle normalization by the right number of collisions + hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); + } + PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processD0V0, "Process D0 candidates paired with V0s", false); - void processDstarV0(soa::Join const& collisions, - CandDstarFiltered const& candsDstar, - aod::V0s const& V0s, - TracksIUWithPID const& tracks, + void processD0Track(soa::Join const& collisions, + CandsD0Filtered const& candsD0, + aod::TrackAssoc const& trackIndices, + TracksWithPID const& tracks, aod::BCsWithTimestamps const& bcs) { int zvtxColl{0}; @@ -1243,20 +1633,49 @@ struct HfDataCreatorCharmResoReduced { int allSelColl{0}; for (const auto& collision : collisions) { o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + auto thisCollId = collision.globalIndex(); - auto candsDThisColl = candsDstar.sliceBy(candsDstarPerCollision, thisCollId); - auto V0sThisColl = V0s.sliceBy(candsV0PerCollision, thisCollId); - runDataCreation(collision, candsDThisColl, V0sThisColl, tracks, tracks, bcs); + auto candsDThisColl = candsD0.sliceBy(candsD0PerCollision, thisCollId); + auto trackIdsThisColl = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); + runDataCreation(collision, candsDThisColl, trackIdsThisColl, trackIdsThisColl, tracks, tracks, tracks, bcs); } // handle normalization by the right number of collisions hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); } - PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processDstarV0, "Process DStar candidates paired with V0s without MC info and without ML info", false); + PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processD0Track, "Process D0 candidates paired with Tracks", false); + + void processD0V0AndTrack(soa::Join const& collisions, + CandsD0Filtered const& candsD0, + aod::V0s const& v0s, + aod::TrackAssoc const& trackIndices, + TracksWithPID const& tracks, + TracksIUWithPID const& tracksIU, + aod::BCsWithTimestamps const& bcs) + { + int zvtxColl{0}; + int sel8Coll{0}; + int zvtxAndSel8Coll{0}; + int zvtxAndSel8CollAndSoftTrig{0}; + int allSelColl{0}; + for (const auto& collision : collisions) { + o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + auto thisCollId = collision.globalIndex(); + auto candsDThisColl = candsD0.sliceBy(candsD0PerCollision, thisCollId); + auto v0sThisColl = v0s.sliceBy(candsV0PerCollision, thisCollId); + auto trackIdsThisColl = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); + runDataCreation(collision, candsDThisColl, v0sThisColl, trackIdsThisColl, tracks, tracksIU, tracks, bcs); + } + // handle normalization by the right number of collisions + hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); + } + PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processD0V0AndTrack, "Process D0 candidates paired with V0s and Tracks", false); + // MC + // D* void processDstarV0MC(soa::Join const& collisions, - CandDstarFiltered const& candsDstar, - aod::V0s const& V0s, - TracksIUWithPIDAndMC const& tracks, + CandsDstarFiltered const& candsDstar, + aod::V0s const& v0s, + TracksIUWithPIDAndMC const& tracksIU, aod::McParticles const& particlesMc, aod::BCsWithTimestamps const& bcs) { @@ -1269,19 +1688,50 @@ struct HfDataCreatorCharmResoReduced { o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); auto thisCollId = collision.globalIndex(); auto candsDThisColl = candsDstar.sliceBy(candsDstarPerCollision, thisCollId); - auto V0sThisColl = V0s.sliceBy(candsV0PerCollision, thisCollId); - runDataCreation(collision, candsDThisColl, V0sThisColl, tracks, particlesMc, bcs); + auto v0sThisColl = v0s.sliceBy(candsV0PerCollision, thisCollId); + runDataCreation(collision, candsDThisColl, v0sThisColl, v0sThisColl, tracksIU, tracksIU, particlesMc, bcs); } runMcGen(particlesMc); // handle normalization by the right number of collisions hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); } - PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processDstarV0MC, "Process DStar candidates paired with V0s with MC matching and without ML info", false); + PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processDstarV0MC, "Process Dstar candidates paired with V0s with MC matching", false); + // Dplus + void processDplusV0MC(soa::Join const& collisions, + CandsDplusFiltered const& candsDplus, + aod::V0s const& v0s, + TracksIUWithPIDAndMC const& tracksIU, + aod::McParticles const& particlesMc, + aod::BCsWithTimestamps const& bcs) + { + int zvtxColl{0}; + int sel8Coll{0}; + int zvtxAndSel8Coll{0}; + int zvtxAndSel8CollAndSoftTrig{0}; + int allSelColl{0}; + for (const auto& collision : collisions) { + o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + auto thisCollId = collision.globalIndex(); + auto candsDThisColl = candsDplus.sliceBy(candsDplusPerCollision, thisCollId); + auto v0sThisColl = v0s.sliceBy(candsV0PerCollision, thisCollId); + runDataCreation(collision, candsDThisColl, v0sThisColl, v0sThisColl, tracksIU, tracksIU, particlesMc, bcs); + } + runMcGen(particlesMc); + // handle normalization by the right number of collisions + hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); + } + PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processDplusV0MC, "Process Dstar candidates paired with V0s with MC matching", false); + // D0 + // Not implemented yet + + // ML + // Data + // D* void processDstarV0WithMl(soa::Join const& collisions, - CandDstarFilteredWithMl const& candsDstar, - aod::V0s const& V0s, - TracksIUWithPID const& tracks, + CandsDstarFilteredWithMl const& candsDstar, + aod::V0s const& v0s, + TracksIUWithPID const& tracksIU, aod::BCsWithTimestamps const& bcs) { int zvtxColl{0}; @@ -1291,23 +1741,21 @@ struct HfDataCreatorCharmResoReduced { int allSelColl{0}; for (const auto& collision : collisions) { o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); - auto thisCollId = collision.globalIndex(); auto candsDThisColl = candsDstar.sliceBy(candsDstarPerCollisionWithMl, thisCollId); - auto V0sThisColl = V0s.sliceBy(candsV0PerCollision, thisCollId); - runDataCreation(collision, candsDThisColl, V0sThisColl, tracks, tracks, bcs); + auto v0sThisColl = v0s.sliceBy(candsV0PerCollision, thisCollId); + runDataCreation(collision, candsDThisColl, v0sThisColl, v0sThisColl, tracksIU, tracksIU, tracksIU, bcs); } // handle normalization by the right number of collisions hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); } - PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processDstarV0WithMl, "Process DStar candidates paired with V0s with ML info", false); + PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processDstarV0WithMl, "Process Dstar candidates paired with V0s with ML info", false); - void processDstarV0MCWithMl(soa::Join const& collisions, - CandDstarFilteredWithMl const& candsDstar, - aod::V0s const& V0s, - TracksIUWithPIDAndMC const& tracks, - aod::McParticles const& particlesMc, - aod::BCsWithTimestamps const& bcs) + void processDstarTrackWithMl(soa::Join const& collisions, + CandsDstarFilteredWithMl const& candsDstar, + aod::TrackAssoc const& trackIndices, + TracksWithPID const& tracks, + aod::BCsWithTimestamps const& bcs) { int zvtxColl{0}; int sel8Coll{0}; @@ -1316,22 +1764,24 @@ struct HfDataCreatorCharmResoReduced { int allSelColl{0}; for (const auto& collision : collisions) { o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + auto thisCollId = collision.globalIndex(); - auto candsDThisColl = candsDstar.sliceBy(candsDstarPerCollision, thisCollId); - auto V0sThisColl = V0s.sliceBy(candsV0PerCollision, thisCollId); - runDataCreation(collision, candsDThisColl, V0sThisColl, tracks, particlesMc, bcs); + auto candsDThisColl = candsDstar.sliceBy(candsDstarPerCollisionWithMl, thisCollId); + auto trackIdsThisColl = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); + runDataCreation(collision, candsDThisColl, trackIdsThisColl, trackIdsThisColl, tracks, tracks, tracks, bcs); } - runMcGen(particlesMc); // handle normalization by the right number of collisions hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); } - PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processDstarV0MCWithMl, "Process MC DStar candidates paired with V0s with ML info", false); - - void processDstarTrack(soa::Join const& collisions, - CandDstarFiltered const& candsDstar, - aod::TrackAssoc const& trackIndices, - TracksWithPID const& tracks, - aod::BCsWithTimestamps const& bcs) + PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processDstarTrackWithMl, "Process Dstar candidates paired with Tracks with ML info", false); + + void processDstarV0AndTrackWithMl(soa::Join const& collisions, + CandsDstarFilteredWithMl const& candsDstar, + aod::V0s const& v0s, + aod::TrackAssoc const& trackIndices, + TracksWithPID const& tracks, + TracksIUWithPID const& tracksIU, + aod::BCsWithTimestamps const& bcs) { int zvtxColl{0}; int sel8Coll{0}; @@ -1341,17 +1791,42 @@ struct HfDataCreatorCharmResoReduced { for (const auto& collision : collisions) { o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); auto thisCollId = collision.globalIndex(); - auto candsDThisColl = candsDstar.sliceBy(candsDstarPerCollision, thisCollId); + auto candsDThisColl = candsDstar.sliceBy(candsDstarPerCollisionWithMl, thisCollId); + auto v0sThisColl = v0s.sliceBy(candsV0PerCollision, thisCollId); auto trackIdsThisColl = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); - runDataCreation(collision, candsDThisColl, trackIdsThisColl, tracks, tracks, bcs); + runDataCreation(collision, candsDThisColl, v0sThisColl, trackIdsThisColl, tracks, tracksIU, tracks, bcs); } // handle normalization by the right number of collisions hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); } - PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processDstarTrack, "Process DStar candidates paired with tracks without MC info and without ML info", false); + PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processDstarV0AndTrackWithMl, "Process Dstar candidates paired with V0s and Tracks with ML info", false); - void processDstarTrackWithMl(soa::Join const& collisions, - CandDstarFilteredWithMl const& candsDstar, + // Dplus + void processDplusV0WithMl(soa::Join const& collisions, + CandsDplusFilteredWithMl const& candsDplus, + aod::V0s const& v0s, + TracksIUWithPID const& tracksIU, + aod::BCsWithTimestamps const& bcs) + { + int zvtxColl{0}; + int sel8Coll{0}; + int zvtxAndSel8Coll{0}; + int zvtxAndSel8CollAndSoftTrig{0}; + int allSelColl{0}; + for (const auto& collision : collisions) { + o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + auto thisCollId = collision.globalIndex(); + auto candsDThisColl = candsDplus.sliceBy(candsDplusPerCollisionWithMl, thisCollId); + auto v0sThisColl = v0s.sliceBy(candsV0PerCollision, thisCollId); + runDataCreation(collision, candsDThisColl, v0sThisColl, v0sThisColl, tracksIU, tracksIU, tracksIU, bcs); + } + // handle normalization by the right number of collisions + hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); + } + PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processDplusV0WithMl, "Process Dplus candidates paired with V0s with ML info", false); + + void processDplusTrackWithMl(soa::Join const& collisions, + CandsDplusFilteredWithMl const& candsDplus, aod::TrackAssoc const& trackIndices, TracksWithPID const& tracks, aod::BCsWithTimestamps const& bcs) @@ -1365,15 +1840,169 @@ struct HfDataCreatorCharmResoReduced { o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); auto thisCollId = collision.globalIndex(); - auto candsDThisColl = candsDstar.sliceBy(candsDstarPerCollisionWithMl, thisCollId); + auto candsDThisColl = candsDplus.sliceBy(candsDplusPerCollisionWithMl, thisCollId); + auto trackIdsThisColl = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); + runDataCreation(collision, candsDThisColl, trackIdsThisColl, trackIdsThisColl, tracks, tracks, tracks, bcs); + } + // handle normalization by the right number of collisions + hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); + } + PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processDplusTrackWithMl, "Process Dplus candidates paired with Tracks with ML info", false); + + void processDplusV0AndTrackWithMl(soa::Join const& collisions, + CandsDplusFilteredWithMl const& candsDplus, + aod::V0s const& v0s, + aod::TrackAssoc const& trackIndices, + TracksWithPID const& tracks, + TracksIUWithPID const& tracksIU, + aod::BCsWithTimestamps const& bcs) + { + int zvtxColl{0}; + int sel8Coll{0}; + int zvtxAndSel8Coll{0}; + int zvtxAndSel8CollAndSoftTrig{0}; + int allSelColl{0}; + for (const auto& collision : collisions) { + o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + auto thisCollId = collision.globalIndex(); + auto candsDThisColl = candsDplus.sliceBy(candsDplusPerCollisionWithMl, thisCollId); + auto v0sThisColl = v0s.sliceBy(candsV0PerCollision, thisCollId); + auto trackIdsThisColl = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); + runDataCreation(collision, candsDThisColl, v0sThisColl, trackIdsThisColl, tracks, tracksIU, tracks, bcs); + } + // handle normalization by the right number of collisions + hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); + } + PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processDplusV0AndTrackWithMl, "Process Dplus candidates paired with V0s and Tracks with ML info", false); + + // D0 + void processD0V0WithMl(soa::Join const& collisions, + CandsD0FilteredWithMl const& candsD0, + aod::V0s const& v0s, + TracksIUWithPID const& tracksIU, + aod::BCsWithTimestamps const& bcs) + { + int zvtxColl{0}; + int sel8Coll{0}; + int zvtxAndSel8Coll{0}; + int zvtxAndSel8CollAndSoftTrig{0}; + int allSelColl{0}; + for (const auto& collision : collisions) { + o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + auto thisCollId = collision.globalIndex(); + auto candsDThisColl = candsD0.sliceBy(candsD0PerCollisionWithMl, thisCollId); + auto v0sThisColl = v0s.sliceBy(candsV0PerCollision, thisCollId); + runDataCreation(collision, candsDThisColl, v0sThisColl, v0sThisColl, tracksIU, tracksIU, tracksIU, bcs); + } + // handle normalization by the right number of collisions + hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); + } + PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processD0V0WithMl, "Process D0 candidates paired with V0s with ML info", false); + + void processD0TrackWithMl(soa::Join const& collisions, + CandsD0FilteredWithMl const& candsD0, + aod::TrackAssoc const& trackIndices, + TracksWithPID const& tracks, + aod::BCsWithTimestamps const& bcs) + { + int zvtxColl{0}; + int sel8Coll{0}; + int zvtxAndSel8Coll{0}; + int zvtxAndSel8CollAndSoftTrig{0}; + int allSelColl{0}; + for (const auto& collision : collisions) { + o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + + auto thisCollId = collision.globalIndex(); + auto candsDThisColl = candsD0.sliceBy(candsD0PerCollisionWithMl, thisCollId); + auto trackIdsThisColl = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); + runDataCreation(collision, candsDThisColl, trackIdsThisColl, trackIdsThisColl, tracks, tracks, tracks, bcs); + } + // handle normalization by the right number of collisions + hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); + } + PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processD0TrackWithMl, "Process D0 candidates paired with Tracks with ML info", false); + + void processD0V0AndTrackWithMl(soa::Join const& collisions, + CandsD0FilteredWithMl const& candsD0, + aod::V0s const& v0s, + aod::TrackAssoc const& trackIndices, + TracksWithPID const& tracks, + TracksIUWithPID const& tracksIU, + aod::BCsWithTimestamps const& bcs) + { + int zvtxColl{0}; + int sel8Coll{0}; + int zvtxAndSel8Coll{0}; + int zvtxAndSel8CollAndSoftTrig{0}; + int allSelColl{0}; + for (const auto& collision : collisions) { + o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + auto thisCollId = collision.globalIndex(); + auto candsDThisColl = candsD0.sliceBy(candsD0PerCollisionWithMl, thisCollId); + auto v0sThisColl = v0s.sliceBy(candsV0PerCollision, thisCollId); auto trackIdsThisColl = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); - runDataCreation(collision, candsDThisColl, trackIdsThisColl, tracks, tracks, bcs); + runDataCreation(collision, candsDThisColl, v0sThisColl, trackIdsThisColl, tracks, tracksIU, tracks, bcs); } // handle normalization by the right number of collisions hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); } - PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processDstarTrackWithMl, "Process DStar candidates paired with tracks with ML info", false); + PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processD0V0AndTrackWithMl, "Process D0 candidates paired with V0s and Tracks with ML info", false); + // MC + // D* + void processDstarV0MCWithMl(soa::Join const& collisions, + CandsDstarFilteredWithMl const& candsDstar, + aod::V0s const& v0s, + TracksIUWithPIDAndMC const& tracksIU, + aod::McParticles const& particlesMc, + aod::BCsWithTimestamps const& bcs) + { + int zvtxColl{0}; + int sel8Coll{0}; + int zvtxAndSel8Coll{0}; + int zvtxAndSel8CollAndSoftTrig{0}; + int allSelColl{0}; + for (const auto& collision : collisions) { + o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + auto thisCollId = collision.globalIndex(); + auto candsDThisColl = candsDstar.sliceBy(candsDstarPerCollision, thisCollId); + auto v0sThisColl = v0s.sliceBy(candsV0PerCollision, thisCollId); + runDataCreation(collision, candsDThisColl, v0sThisColl, v0sThisColl, tracksIU, tracksIU, particlesMc, bcs); + } + runMcGen(particlesMc); + // handle normalization by the right number of collisions + hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); + } + PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processDstarV0MCWithMl, "Process Dstar candidates paired with V0s with MC matching and with ML info", false); + + // Dplus + void processDplusV0MCWithMl(soa::Join const& collisions, + CandsDplusFilteredWithMl const& candsDplus, + aod::V0s const& v0s, + TracksIUWithPIDAndMC const& tracksIU, + aod::McParticles const& particlesMc, + aod::BCsWithTimestamps const& bcs) + { + int zvtxColl{0}; + int sel8Coll{0}; + int zvtxAndSel8Coll{0}; + int zvtxAndSel8CollAndSoftTrig{0}; + int allSelColl{0}; + for (const auto& collision : collisions) { + o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + auto thisCollId = collision.globalIndex(); + auto candsDThisColl = candsDplus.sliceBy(candsDplusPerCollision, thisCollId); + auto v0sThisColl = v0s.sliceBy(candsV0PerCollision, thisCollId); + runDataCreation(collision, candsDThisColl, v0sThisColl, v0sThisColl, tracksIU, tracksIU, particlesMc, bcs); + } + runMcGen(particlesMc); + // handle normalization by the right number of collisions + hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); + } + PROCESS_SWITCH(HfDataCreatorCharmResoReduced, processDplusV0MCWithMl, "Process Dplus candidates paired with V0s with MC matching and with ML info", false); + // D0 + // Not implemented yet }; // struct WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From d110d91c27f4e8ea2c1249d3719b534d7ada6343 Mon Sep 17 00:00:00 2001 From: Tao_Fang <52570362+Tao-Fang@users.noreply.github.com> Date: Wed, 4 Jun 2025 07:17:57 +0800 Subject: [PATCH 1500/1650] [PWGHF] Add ML selection for Xic0ToXiPiKf (#11388) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ALICE Action Bot Co-authored-by: Vít Kučera --- PWGHF/Core/HfMlResponseXic0ToXiPiKf.h | 144 ++++++++++++++++++ PWGHF/DataModel/CandidateSelectionTables.h | 4 + PWGHF/TableProducer/CMakeLists.txt | 2 +- .../candidateSelectorXic0ToXiPiKf.cxx | 52 +++++++ 4 files changed, 201 insertions(+), 1 deletion(-) create mode 100644 PWGHF/Core/HfMlResponseXic0ToXiPiKf.h diff --git a/PWGHF/Core/HfMlResponseXic0ToXiPiKf.h b/PWGHF/Core/HfMlResponseXic0ToXiPiKf.h new file mode 100644 index 00000000000..d75bdcc4c10 --- /dev/null +++ b/PWGHF/Core/HfMlResponseXic0ToXiPiKf.h @@ -0,0 +1,144 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file HfMlResponseXic0ToXiPiKf.h +/// \brief Class to compute the ML response for Ξc^0 → Ξ∓ π± kf analysis selections +/// \author Tao Fang , Central China Normal University + +#ifndef PWGHF_CORE_HFMLRESPONSEXIC0TOXIPIKF_H_ +#define PWGHF_CORE_HFMLRESPONSEXIC0TOXIPIKF_H_ + +#include + +#include "PWGHF/Core/HfMlResponse.h" + +// Fill the map of available input features +// the key is the feature's name (std::string) +// the value is the corresponding value in EnumInputFeatures +#define FILL_MAP_XIC0TOXIPIKF(FEATURE) \ + { \ + #FEATURE, static_cast(InputFeaturesXic0ToXiPiKf::FEATURE) \ + } + +// Check if the index of mCachedIndices (index associated to a FEATURE) +// matches the entry in EnumInputFeatures associated to this FEATURE +// if so, the inputFeatures vector is filled with the FEATURE's value +// by calling the corresponding GETTER from OBJECT +#define CHECK_AND_FILL_VEC_XIC0TOXIPIKF_FULL(OBJECT, FEATURE, GETTER) \ + case static_cast(InputFeaturesXic0ToXiPiKf::FEATURE): { \ + inputFeatures.emplace_back(OBJECT.GETTER()); \ + break; \ + } + +// where OBJECT is named candidate and FEATURE = GETTER +#define CHECK_AND_FILL_VEC_XIC0TOXIPIKF(GETTER) \ + case static_cast(InputFeaturesXic0ToXiPiKf::GETTER): { \ + inputFeatures.emplace_back(candidate.GETTER()); \ + break; \ + } + +namespace o2::analysis +{ + +enum class InputFeaturesXic0ToXiPiKf : uint8_t { + tpcNSigmaPiFromLambda, + tpcNSigmaPiFromCasc, + tpcNSigmaPiFromCharmBaryon, + dcaCascDau, + dcaCharmBaryonDau, + kfDcaXYPiFromXic, + kfDcaXYCascToPv, + cascChi2OverNdf, + xicChi2OverNdf, + cascldl, + chi2TopoCascToPv, + chi2TopoCascToXic, + cosPaCascToXic, + decayLenXYCasc +}; + +template +class HfMlResponseXic0ToXiPiKf : public HfMlResponse +{ + public: + /// Default constructor + HfMlResponseXic0ToXiPiKf() = default; + /// Default destructor + virtual ~HfMlResponseXic0ToXiPiKf() = default; + + /// Method to get the input features vector needed for ML inference + /// \param candidate is the Xic0 candidate + /// \return inputFeatures vector + template + // std::vector getInputFeatures(T1 const& candidate) + std::vector getInputFeatures(T1 const& candidate, T2 const& lamProngPi, T2 const& cascProngPi, T3 const& charmBaryonProngPi) + { + std::vector inputFeatures; + + for (const auto& idx : MlResponse::mCachedIndices) { + switch (idx) { + // PID variables + CHECK_AND_FILL_VEC_XIC0TOXIPIKF_FULL(lamProngPi, tpcNSigmaPiFromLambda, tpcNSigmaPi); + CHECK_AND_FILL_VEC_XIC0TOXIPIKF_FULL(cascProngPi, tpcNSigmaPiFromCasc, tpcNSigmaPi); + CHECK_AND_FILL_VEC_XIC0TOXIPIKF_FULL(charmBaryonProngPi, tpcNSigmaPiFromCharmBaryon, tpcNSigmaPi); + // DCA + CHECK_AND_FILL_VEC_XIC0TOXIPIKF(dcaCascDau); + CHECK_AND_FILL_VEC_XIC0TOXIPIKF(dcaCharmBaryonDau); + CHECK_AND_FILL_VEC_XIC0TOXIPIKF(kfDcaXYPiFromXic); + CHECK_AND_FILL_VEC_XIC0TOXIPIKF(kfDcaXYCascToPv); + // Chi2Geo + CHECK_AND_FILL_VEC_XIC0TOXIPIKF(cascChi2OverNdf); + CHECK_AND_FILL_VEC_XIC0TOXIPIKF(xicChi2OverNdf); + // ldl + CHECK_AND_FILL_VEC_XIC0TOXIPIKF(cascldl); + // Chi2Topo + CHECK_AND_FILL_VEC_XIC0TOXIPIKF(chi2TopoCascToPv); + CHECK_AND_FILL_VEC_XIC0TOXIPIKF(chi2TopoCascToXic); + // CosPa + CHECK_AND_FILL_VEC_XIC0TOXIPIKF(cosPaCascToXic); + // Decay length + CHECK_AND_FILL_VEC_XIC0TOXIPIKF(decayLenXYCasc); + } + } + + return inputFeatures; + } + + protected: + /// Method to fill the map of available input features + void setAvailableInputFeatures() + { + MlResponse::mAvailableInputFeatures = { + FILL_MAP_XIC0TOXIPIKF(tpcNSigmaPiFromLambda), + FILL_MAP_XIC0TOXIPIKF(tpcNSigmaPiFromCasc), + FILL_MAP_XIC0TOXIPIKF(tpcNSigmaPiFromCharmBaryon), + FILL_MAP_XIC0TOXIPIKF(dcaCascDau), + FILL_MAP_XIC0TOXIPIKF(dcaCharmBaryonDau), + FILL_MAP_XIC0TOXIPIKF(kfDcaXYPiFromXic), + FILL_MAP_XIC0TOXIPIKF(kfDcaXYCascToPv), + FILL_MAP_XIC0TOXIPIKF(cascChi2OverNdf), + FILL_MAP_XIC0TOXIPIKF(xicChi2OverNdf), + FILL_MAP_XIC0TOXIPIKF(cascldl), + FILL_MAP_XIC0TOXIPIKF(chi2TopoCascToPv), + FILL_MAP_XIC0TOXIPIKF(chi2TopoCascToXic), + FILL_MAP_XIC0TOXIPIKF(cosPaCascToXic), + FILL_MAP_XIC0TOXIPIKF(decayLenXYCasc), + }; + } +}; + +} // namespace o2::analysis + +#undef FILL_MAP_XIC0TOXIPIKF +#undef CHECK_AND_FILL_VEC_XIC0TOXIPIKF_FULL +#undef CHECK_AND_FILL_VEC_XIC0TOXIPIKF + +#endif // PWGHF_CORE_HFMLRESPONSEXIC0TOXIPIKF_H_ diff --git a/PWGHF/DataModel/CandidateSelectionTables.h b/PWGHF/DataModel/CandidateSelectionTables.h index 5aa0068f80d..f693605f635 100644 --- a/PWGHF/DataModel/CandidateSelectionTables.h +++ b/PWGHF/DataModel/CandidateSelectionTables.h @@ -350,6 +350,7 @@ DECLARE_SOA_COLUMN(TofNSigmaPiFromLambda, tofNSigmaPiFromLambda, float); DECLARE_SOA_COLUMN(TofNSigmaPrFromLambda, tofNSigmaPrFromLambda, float); DECLARE_SOA_COLUMN(PidTpcInfoStored, pidTpcInfoStored, int); DECLARE_SOA_COLUMN(PidTofInfoStored, pidTofInfoStored, int); +DECLARE_SOA_COLUMN(MlProbToXiPi, mlProbToXiPi, std::vector); } // namespace hf_sel_toxipi DECLARE_SOA_TABLE(HfSelToXiPi, "AOD", "HFSELTOXIPI", @@ -366,6 +367,9 @@ DECLARE_SOA_TABLE(HfSelToXiPiKf, "AOD", "HFSELTOXIPIKF", hf_sel_toxipi::TpcNSigmaPiFromCharmBaryon, hf_sel_toxipi::TpcNSigmaPiFromCasc, hf_sel_toxipi::TpcNSigmaPiFromLambda, hf_sel_toxipi::TpcNSigmaPrFromLambda, hf_sel_toxipi::TofNSigmaPiFromCharmBaryon, hf_sel_toxipi::TofNSigmaPiFromCasc, hf_sel_toxipi::TofNSigmaPiFromLambda, hf_sel_toxipi::TofNSigmaPrFromLambda); +DECLARE_SOA_TABLE(HfMlToXiPiKf, "AOD", "HFMLSELTOXIPIKF", + hf_sel_toxipi::MlProbToXiPi); + namespace hf_sel_toomegapi { DECLARE_SOA_COLUMN(StatusPidLambda, statusPidLambda, bool); diff --git a/PWGHF/TableProducer/CMakeLists.txt b/PWGHF/TableProducer/CMakeLists.txt index c74e876761e..2ec33b5d134 100644 --- a/PWGHF/TableProducer/CMakeLists.txt +++ b/PWGHF/TableProducer/CMakeLists.txt @@ -174,7 +174,7 @@ o2physics_add_dpl_workflow(candidate-selector-omegac0-to-omega-pi o2physics_add_dpl_workflow(candidate-selector-xic0-to-xi-pi-kf SOURCES candidateSelectorXic0ToXiPiKf.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::MLCore COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(candidate-selector-to-xi-pi diff --git a/PWGHF/TableProducer/candidateSelectorXic0ToXiPiKf.cxx b/PWGHF/TableProducer/candidateSelectorXic0ToXiPiKf.cxx index 904b8c86b5b..81327bb70e1 100644 --- a/PWGHF/TableProducer/candidateSelectorXic0ToXiPiKf.cxx +++ b/PWGHF/TableProducer/candidateSelectorXic0ToXiPiKf.cxx @@ -12,6 +12,10 @@ /// \file candidateSelectorXic0ToXiPiKf.cxx /// \brief Xic0 → Xi Pi selection task /// \author Ran Tu , Fudan University +/// \author Tao Fang , Central China Normal University + +#include +#include #include "CommonConstants/PhysicsConstants.h" #include "Framework/AnalysisTask.h" @@ -20,6 +24,9 @@ #include "Common/Core/TrackSelection.h" #include "Common/Core/TrackSelectorPID.h" +#include "PWGHF/Core/HfMlResponseXic0ToXiPiKf.h" +#include "PWGHF/Core/SelectorCuts.h" + #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/Utils/utilsAnalysis.h" @@ -39,6 +46,7 @@ enum PidInfoStored { /// Struct for applying Xic0 -> Xi pi selection cuts struct HfCandidateSelectorXic0ToXiPiKf { Produces hfSelToXiPi; + Produces hfMlToXiPi; // LF analysis selections Configurable radiusCascMin{"radiusCascMin", 0.5, "Min cascade radius"}; @@ -116,6 +124,25 @@ struct HfCandidateSelectorXic0ToXiPiKf { Configurable nClustersItsInnBarrMin{"nClustersItsInnBarrMin", 1, "Minimum number of ITS clusters in inner barrel requirement for pi <- charm baryon"}; Configurable itsChi2PerClusterMax{"itsChi2PerClusterMax", 36, "Maximum value of chi2 fit over ITS clusters for pi <- charm baryon"}; + // ML inference + Configurable applyMl{"applyMl", true, "Flag to apply ML selections"}; + Configurable> binsPtMl{"binsPtMl", std::vector{hf_cuts_ml::vecBinsPt}, "pT bin limits for ML application"}; + Configurable> cutDirMl{"cutDirMl", std::vector{hf_cuts_ml::vecCutDir}, "Whether to reject score values greater or smaller than the threshold"}; + Configurable> cutsMl{"cutsMl", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; + Configurable nClassesMl{"nClassesMl", static_cast(hf_cuts_ml::NCutScores), "Number of classes in ML model"}; + Configurable> namesInputFeatures{"namesInputFeatures", std::vector{"feature1", "feature2"}, "Names of ML model input features"}; + + // CCDB configuration + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable> modelPathsCCDB{"modelPathsCCDB", std::vector{"EventFiltering/PWGHF/BDTXic0ToXipiKf"}, "Paths of models on CCDB"}; + Configurable> onnxFileNames{"onnxFileNames", std::vector{"ModelHandler_onnx_Xic0ToXipiKf.onnx"}, "ONNX file names for each pT bin (if not from CCDB full path)"}; + Configurable timestampCCDB{"timestampCCDB", -1, "timestamp of the ONNX file for ML model used to query in CCDB"}; + Configurable loadModelsFromCCDB{"loadModelsFromCCDB", false, "Flag to enable or disable the loading of models from CCDB"}; + + o2::analysis::HfMlResponseXic0ToXiPiKf hfMlResponse; + std::vector outputMlXic0ToXiPiKf = {}; + o2::ccdb::CcdbApi ccdbApi; + TrackSelectorPr selectorProton; TrackSelectorPi selectorPion; @@ -176,6 +203,18 @@ struct HfCandidateSelectorXic0ToXiPiKf { registry.add("hSelMassCharmBaryon", "hSelMassCharmBaryon;status;entries", {HistType::kTH1D, {axisSel}}); registry.add("hSelDcaXYToPvV0Daughters", "hSelDcaXYToPvV0Daughters;status;entries", {HistType::kTH1D, {axisSel}}); registry.add("hSelDcaXYToPvPiFromCasc", "hSelDcaXYToPvPiFromCasc;status;entries", {HistType::kTH1D, {axisSel}}); + + if (applyMl) { + hfMlResponse.configure(binsPtMl, cutsMl, cutDirMl, nClassesMl); + if (loadModelsFromCCDB) { + ccdbApi.init(ccdbUrl); + hfMlResponse.setModelPathsCCDB(onnxFileNames, ccdbApi, modelPathsCCDB, timestampCCDB); + } else { + hfMlResponse.setModelPathsLocal(onnxFileNames); + } + hfMlResponse.cacheInputFeaturesIndices(namesInputFeatures); + hfMlResponse.init(); + } } void process(aod::HfCandToXiPiKf const& candidates, @@ -186,6 +225,8 @@ struct HfCandidateSelectorXic0ToXiPiKf { // looping over charm baryon candidates for (const auto& candidate : candidates) { + auto ptCand = RecoDecay::pt(candidate.pxCharmBaryon(), candidate.pyCharmBaryon()); + bool resultSelections = true; // True if the candidate passes all the selections, False otherwise auto trackV0PosDauId = candidate.posTrackId(); // positive V0 daughter @@ -503,6 +544,17 @@ struct HfCandidateSelectorXic0ToXiPiKf { registry.fill(HIST("hSelMassCharmBaryon"), 0); } + // ML selections + if (applyMl) { + bool isSelectedMlXic0 = false; + std::vector inputFeaturesXic0 = hfMlResponse.getInputFeatures(candidate, trackPiFromLam, trackPiFromCasc, trackPiFromCharm); + isSelectedMlXic0 = hfMlResponse.isSelectedMl(inputFeaturesXic0, ptCand, outputMlXic0ToXiPiKf); + if (!isSelectedMlXic0) { + continue; + } + hfMlToXiPi(outputMlXic0ToXiPiKf); + } + hfSelToXiPi(statusPidCharmBaryon, statusPidCascade, statusPidLambda, statusInvMassCharmBaryon, statusInvMassCascade, statusInvMassLambda, resultSelections, infoTpcStored, infoTofStored, trackPiFromCharm.tpcNSigmaPi(), trackPiFromCasc.tpcNSigmaPi(), trackPiFromLam.tpcNSigmaPi(), trackPrFromLam.tpcNSigmaPr(), trackPiFromCharm.tofNSigmaPi(), trackPiFromCasc.tofNSigmaPi(), trackPiFromLam.tofNSigmaPi(), trackPrFromLam.tofNSigmaPr()); From 0640c0c3bb0e9732fdb0a002994bd66c8c33eb5d Mon Sep 17 00:00:00 2001 From: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> Date: Wed, 4 Jun 2025 01:58:36 +0200 Subject: [PATCH 1501/1650] [PWGLF] Fix bit flags for preselecting V0s and cascades (#11462) --- PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx index ecc0136a438..f00a1e646dc 100644 --- a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx @@ -196,12 +196,12 @@ struct StrangenessBuilder { kCascFoundTags, nTables }; - enum V0PreSelection : uint8_t { selGamma = 0, + enum V0PreSelection : uint8_t { selGamma = static_cast(1) << static_cast(0), selK0Short, selLambda, selAntiLambda }; - enum CascPreSelection : uint8_t { selXiMinus = 0, + enum CascPreSelection : uint8_t { selXiMinus = static_cast(1) << static_cast(0), selXiPlus, selOmegaMinus, selOmegaPlus }; From 89d47df05258ebeb9b9e89488fb41c3a11669070 Mon Sep 17 00:00:00 2001 From: "Paul Veen (paveen)" <80593165+ppoava@users.noreply.github.com> Date: Wed, 4 Jun 2025 07:10:25 +0200 Subject: [PATCH 1502/1650] [Common] Adding muonQA task (#11438) --- Common/Tasks/CMakeLists.txt | 5 + Common/Tasks/qaMuon.cxx | 2584 +++++++++++++++++++++++++++++++++++ 2 files changed, 2589 insertions(+) create mode 100644 Common/Tasks/qaMuon.cxx diff --git a/Common/Tasks/CMakeLists.txt b/Common/Tasks/CMakeLists.txt index a63d0146e34..64d4f7e6611 100644 --- a/Common/Tasks/CMakeLists.txt +++ b/Common/Tasks/CMakeLists.txt @@ -87,4 +87,9 @@ o2physics_add_dpl_workflow(centrality-study o2physics_add_dpl_workflow(flow-test SOURCES flowTest.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(muon-qa + SOURCES qaMuon.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::Field O2::DetectorsBase O2::DetectorsCommonDataFormats O2::MathUtils O2::MCHTracking O2::DataFormatsMCH O2::GlobalTracking O2::MCHBase O2::MCHGeometryTransformer O2::CommonUtils COMPONENT_NAME Analysis) \ No newline at end of file diff --git a/Common/Tasks/qaMuon.cxx b/Common/Tasks/qaMuon.cxx new file mode 100644 index 00000000000..1f210249089 --- /dev/null +++ b/Common/Tasks/qaMuon.cxx @@ -0,0 +1,2584 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// \brief The task for muon QA +/// \author Andrea Ferrero +/// \author Paul Veen +/// \author Chi Zhang + +#include + +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/runDataProcessing.h" +#include "Framework/ASoAHelpers.h" + +#include "CCDB/BasicCCDBManager.h" +#include "CCDB/CCDBTimeStampUtils.h" +#include "CommonUtils/NameConf.h" +#include "CommonUtils/ConfigurableParam.h" +#include "DataFormatsMCH/Cluster.h" +#include "DataFormatsParameters/GRPObject.h" +#include "DetectorsBase/GeometryManager.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "DetectorsBase/GRPGeomHelper.h" +#include "DetectorsBase/Propagator.h" +#include "Field/MagneticField.h" +#include "MathUtils/Cartesian.h" +#include "MCHGeometryTransformer/Transformations.h" +#include "MCHTracking/Track.h" +#include "MCHTracking/TrackExtrap.h" +#include "MCHTracking/TrackParam.h" +#include "MCHTracking/TrackFitter.h" +#include "MCHBase/TrackerParam.h" +#include "GlobalTracking/MatchGlobalFwd.h" +#include "ReconstructionDataFormats/TrackFwd.h" +#include "Common/DataModel/FwdTrackReAlignTables.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/CollisionAssociationTables.h" + +#include "TGeoGlobalMagField.h" +#include "Math/Vector4D.h" + +using namespace std; +using namespace o2; +using namespace o2::aod; +using namespace o2::mch; +using namespace o2::framework; +using namespace o2::framework::expressions; + +using MyEvents = soa::Join; +using MyMuonsWithCov = soa::Join; +using MyMFTs = aod::MFTTracks; + +using SMatrix55 = ROOT::Math::SMatrix>; +using SMatrix5 = ROOT::Math::SVector; + +using MuonPair = std::pair, std::pair>; +using GlobalMuonPair = std::pair>, std::pair>>; + +const int fgNCh = 10; +const int fgNDetElemCh[fgNCh] = {4, 4, 4, 4, 18, 18, 26, 26, 26, 26}; +const int fgSNDetElemCh[fgNCh + 1] = {0, 4, 8, 12, 16, 34, 52, 78, 104, 130, 156}; +const float zAtAbsEnd = -505.; + +constexpr double firstMFTPlaneZ = o2::mft::constants::mft::LayerZCoordinate()[0]; +constexpr double lastMFTPlaneZ = o2::mft::constants::mft::LayerZCoordinate()[9]; + +std::array zRefPlane{ + firstMFTPlaneZ, + lastMFTPlaneZ, + -90.0, + -300.0, + //-505.0, + -520.0}; + +std::vector> referencePlanes{ + {"MFT-begin", 10.0}, + {"MFT-end", 15.0}, + {"Absorber-begin", 20.0}, + {"Absorber-mid", 75.0}, + //{"Absorber-end", 100.0}, + {"MCH-begin", 100.0}}; + +enum MuonExtrapolation { + // Index used to set different options for muon propagation + kToVtx = 0, // propagtion to vertex by default + kToDCA, + kToAbsEnd, + kToZ +}; + +struct VarColl { + int64_t globalIndex = 0; + float x = 0.f; + float y = 0.f; + float z = 0.f; + float covXX = 0.f; + float covYY = 0.f; + int64_t bc = 0; + int multMFT = 0; +}; + +struct VarTrack { + int64_t collisionId = -1; + int64_t globalIndex = 0; + int nClusters = 0; // Only MCH + int sign = 0; + int64_t bc = 0; + int trackType = 0; + float trackTime = 0.f; + + // Basic kinematics + float x = 0.f; + float y = 0.f; + float z = 0.f; + float eta = 0.f; + float phi = 0.f; + float tgl = 0.f; + + float px = 0.f; + float py = 0.f; + float pz = 0.f; + float pT = 0.f; + float p = 0.f; + + // Propagation related infos + float dcaX = 0.f; + float dcaY = 0.f; + float pDca = 0.f; + float rabs = 0.f; + float chi2 = 0.f; + float chi2matching = 0.f; +}; + +struct VarClusters { + vector> posClusters; // (x,y,z) + vector> errorClusters; // (ex,ey) + vector DEIDs; +}; + +struct muonQa { + //// Variables for enabling QA options + struct : ConfigurableGroup { + Configurable fEnableQAMatching{"cfgEnableQAMatching", false, "Enable MCH-MFT matching QA checks"}; + Configurable fEnableQAResidual{"cfgEnableQAResidual", false, "Enable residual QA checks"}; + Configurable fEnableQADCA{"cfgEnableQADCA", false, "Enable DCA QA checks"}; + Configurable fEnableQADimuon{"cfgEnableQADimuon", false, "Enable dimuon QA checks"}; + } configQAs; + + //// Variables for selecting muon tracks + struct : ConfigurableGroup { + Configurable fPMchLow{"cfgPMchLow", 0.0f, ""}; + Configurable fPtMchLow{"cfgPtMchLow", 0.7f, ""}; + Configurable fEtaMchLow{"cfgEtaMchLow", -4.0f, ""}; + Configurable fEtaMchUp{"cfgEtaMchUp", -2.5f, ""}; + Configurable fRabsLow{"cfgRabsLow", 17.6f, ""}; + Configurable fRabsUp{"cfgRabsUp", 89.5f, ""}; + Configurable fSigmaPdcaUp{"cfgPdcaUp", 6.f, ""}; + Configurable fTrackChi2MchUp{"cfgTrackChi2MchUp", 5.f, ""}; + Configurable fMatchingChi2MchMidUp{"cfgMatchingChi2MchMidUp", 999.f, ""}; + } configMuons; + + //// Variables for selecting mft tracks + struct : ConfigurableGroup { + Configurable fEtaMftLow{"cfgEtaMftlow", -3.6f, ""}; + Configurable fEtaMftUp{"cfgEtaMftup", -2.5f, ""}; + Configurable fTrackNClustMftLow{"cfgTrackNClustMftLow", 7, ""}; + Configurable fTrackChi2MftUp{"cfgTrackChi2MftUp", 999.f, ""}; + } configMFTs; + + //// Variables for selecting global tracks + Configurable fMatchingChi2MftMchUp{"cfgMatchingChi2MftMchUp", 50.f, ""}; + + //// Variables for alignment corrections + Configurable fEnableMFTAlignmentCorrections{"cfgEnableMFTAlignmentCorrections", false, ""}; + + //// Variables for re-alignment setup + struct : ConfigurableGroup { + Configurable fDoRealign{"cfgDoRealign", false, "Switch to apply re-alignment"}; + Configurable fChamberResolutionX{"cfgChamberResolutionX", 0.4, "Chamber resolution along X configuration for refit"}; // 0.4cm pp, 0.2cm PbPb + Configurable fChamberResolutionY{"cfgChamberResolutionY", 0.4, "Chamber resolution along Y configuration for refit"}; // 0.4cm pp, 0.2cm PbPb + Configurable fSigmaCutImprove{"cfgSigmaCutImprove", 6., "Sigma cut for track improvement"}; + } configRealign; + + /// Variables to event mixing criteria + struct : ConfigurableGroup { + Configurable fEventMaxDeltaNMFT{"cfgEventMaxDeltaNMFT", 1, ""}; + Configurable fEventMaxDeltaVtxZ{"cfgEventMaxDeltaVtxZ", 1.f, ""}; + Configurable fEventMinDeltaBc{"cfgEventMinDeltaBc", 500, ""}; + } configMixing; + + //// Variables for ccdb + struct : ConfigurableGroup { + Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; + Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; + Configurable geoPathRealign{"geoPathRealign", "GLO/Config/GeometryAligned", "Path of the geometry file"}; + Configurable nolaterthan{"ccdb-no-later-than-ref", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object of reference basis"}; + Configurable nolaterthanRealign{"ccdb-no-later-than-new", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object of new basis"}; + } configCCDB; + + //// Variables for histograms configuration + Configurable fNCandidatesMax{"nCandidatesMax", 5, ""}; + + parameters::GRPMagField* grpmag = nullptr; + TrackFitter trackFitter; // Track fitter from MCH tracking library + + globaltracking::MatchGlobalFwd mMatching; + int fCurrentRun; // needed to detect if the run changed and trigger update of calibrations etc. + double mImproveCutChi2; // Chi2 cut for track improvement. + Service ccdb; + o2::field::MagneticField* fieldB = nullptr; + double Bz; // Bz for MFT + + geo::TransformationCreator transformation; + map transformRef; // reference geometry w.r.t track data + map transformNew; // new geometry + TGeoManager* geoNew = nullptr; + TGeoManager* geoRef = nullptr; + + Preslice perMuon = aod::fwdtrkcl::fwdtrackId; + Preslice fwdtracksPerCollision = aod::fwdtrack::collisionId; + Preslice mftPerCollision = aod::fwdtrack::collisionId; + + HistogramRegistry registry{"registry", {}}; + HistogramRegistry registryDCA{"registryDCA", {}}; + HistogramRegistry registryResiduals{"registryResiduals", {}}; + HistogramRegistry registryResidualsMFT{"registryResidualsMFT", {}}; + HistogramRegistry registryResidualsMCH{"registryResidualsMCH", {}}; + HistogramRegistry registryDimuon{"registryDimuon", {}}; + + std::array quadrants = {"Q0", "Q1", "Q2", "Q3"}; + + std::array, 3>, 4>, 2> dcaHistos; + std::array, 3>, 4>, 2> dcaHistosMixedEvents; + + std::array, 4>, 6> trackResidualsHistos; + std::array, 4>, 6> trackResidualsHistosMixedEvents; + + std::array, 10>, 4> residualsHistos; + std::array, 10>, 4> residualsHistosMixedEvents; + + std::array, 10>, 2>, 2> residualsHistosPerDE; + std::array, 10>, 2>, 2> residualsHistosPerDEMixedEvents; + + std::array, 10>, 2>, 2> mchResidualsHistosPerDE; + std::array, 10>, 2>, 2> mchResidualsHistosPerDEMixedEvents; + + VarTrack fgValuesMCH; + VarTrack fgValuesMCHpv; + VarTrack fgValuesMFT; + VarTrack fgValuesGlobal; + vector fgValuesCandidates; + + void CreateBasicHistograms() + { + // ====================== + // Muons plots + // ====================== + + AxisSpec chi2Axis = {1000, 0, 1000, "chi2"}; + AxisSpec momentumAxis = {1000, 0, 1000, "p (GeV/c)"}; + AxisSpec transverseMomentumAxis = {1000, 0, 100, "p_{T} (GeV/c)"}; + AxisSpec etaAxis = {80, -5, -1, "#eta"}; + AxisSpec rAbsAxis = {100, 0., 100.0, "R_{abs} (cm)"}; + AxisSpec dcaAxis = {400, 0.0, 20.0, "DCA"}; + AxisSpec pdcaAxis = {5000, 0.0, 5000.0, "p #times DCA"}; + AxisSpec phiAxis = {360, -180.0, 180.0, "#phi (degrees)"}; + + registry.add("muons/TrackChi2", "MCH track #chi^{2}", {HistType::kTH1F, {chi2Axis}}); + registry.add("muons/TrackP", "MCH track momentum", {HistType::kTH1F, {momentumAxis}}); + registry.add("muons/TrackPt", "MCH track transverse momentum", {HistType::kTH1F, {transverseMomentumAxis}}); + registry.add("muons/TrackEta", "MCH track #eta", {HistType::kTH1F, {etaAxis}}); + registry.add("muons/TrackRabs", "MCH track R_{abs}", {HistType::kTH1F, {rAbsAxis}}); + registry.add("muons/TrackDCA", "MCH track DCA", {HistType::kTH1F, {dcaAxis}}); + registry.add("muons/TrackPDCA", "MCH track p #times DCA", {HistType::kTH1F, {pdcaAxis}}); + registry.add("muons/TrackPhi", "MCH track #phi", {HistType::kTH1F, {phiAxis}}); + + // ====================== + // Global muons plots + // ====================== + int nTrackTypes = static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::MCHStandaloneTrack) + 1; + AxisSpec trackTypeAxis = {static_cast(nTrackTypes), 0.0, static_cast(nTrackTypes), "track type"}; + registry.add("global-muons/nTracksPerType", "Number of tracks per type", {HistType::kTH1F, {trackTypeAxis}}); + + AxisSpec nCandidatesAxis = {static_cast(fNCandidatesMax), 0.0, static_cast(fNCandidatesMax), "match candidate rank"}; + registry.add("global-muons/NCandidates", "Number of MFT-MCH match candidates", {HistType::kTH1F, {nCandidatesAxis}}); + registry.add("global-muons/MatchChi2", "MFT-MCH match chi2", {HistType::kTH2F, {chi2Axis, nCandidatesAxis}}); + + registry.add("global-muons/TrackChi2", "Muon track #chi^{2}", {HistType::kTH1F, {chi2Axis}}); + registry.add("global-muons/TrackP", "Muon track momentum", {HistType::kTH1F, {momentumAxis}}); + registry.add("global-muons/TrackPt", "Muon track transverse momentum", {HistType::kTH1F, {transverseMomentumAxis}}); + registry.add("global-muons/TrackEta", "Muon track #eta", {HistType::kTH1F, {etaAxis}}); + registry.add("global-muons/TrackRabs", "Muon track R_{abs}", {HistType::kTH1F, {rAbsAxis}}); + registry.add("global-muons/TrackDCA", "Muon track DCA", {HistType::kTH1F, {dcaAxis}}); + registry.add("global-muons/TrackPDCA", "Muon track p #times DCA", {HistType::kTH1F, {pdcaAxis}}); + registry.add("global-muons/TrackPhi", "Muon track #phi", {HistType::kTH1F, {phiAxis}}); + + // ====================== + // Global muon plots with matching cuts + // ====================== + + if (configQAs.fEnableQAMatching) { + AxisSpec dbcAxis = {1000, -500, 500, "#Delta_{BC}"}; + registry.add("global-matches/BCdifference", "MCH-MFT BC difference", {HistType::kTH1F, {dbcAxis}}); + + AxisSpec nClustersAxis = {20, 0, 20, "# of MFT clusters per track"}; + + registry.add("global-matches/MatchChi2", "MFT-MCH match chi2", {HistType::kTH1F, {chi2Axis}}); + + registry.add("global-matches/TrackChi2_MFT", "MFT track #chi^{2}", {HistType::kTH1F, {chi2Axis}}); + registry.add("global-matches/TrackNclusters_MFT", "MFT track Nclusters", {HistType::kTH1F, {nClustersAxis}}); + + registry.add("global-matches/TrackChi2", "Muon track #chi^{2}", {HistType::kTH1F, {chi2Axis}}); + registry.add("global-matches/TrackP", "Muon track momentum", {HistType::kTH1F, {momentumAxis}}); + registry.add("global-matches/TrackPt", "Muon track transverse momentum", {HistType::kTH1F, {transverseMomentumAxis}}); + registry.add("global-matches/TrackEta", "Muon track #eta", {HistType::kTH1F, {etaAxis}}); + registry.add("global-matches/TrackRabs", "Muon track R_{abs}", {HistType::kTH1F, {rAbsAxis}}); + registry.add("global-matches/TrackDCA", "Muon track DCA", {HistType::kTH1F, {dcaAxis}}); + registry.add("global-matches/TrackPDCA", "Muon track p #times DCA", {HistType::kTH1F, {pdcaAxis}}); + registry.add("global-matches/TrackPhi", "Muon track #phi", {HistType::kTH1F, {phiAxis}}); + + registry.add("global-matches/TrackP_glo", "Global muon track momentum", {HistType::kTH1F, {momentumAxis}}); + registry.add("global-matches/TrackPt_glo", "Global muon track transverse momentum", {HistType::kTH1F, {transverseMomentumAxis}}); + registry.add("global-matches/TrackEta_glo", "Global muon track #eta", {HistType::kTH1F, {etaAxis}}); + registry.add("global-matches/TrackDCA_glo", "Global muon track DCA", {HistType::kTH1F, {dcaAxis}}); + registry.add("global-matches/TrackPhi_glo", "Global muon track #phi", {HistType::kTH1F, {phiAxis}}); + } + + AxisSpec momentumCorrelationAxis = {100, 0, 100, "momentum (GeV/c)"}; + AxisSpec momentumDeltaAxis = {100, -1, 1, "#DeltaP (GeV/c)"}; + // Momentum correlations + registry.add("global-muons/MomentumCorrelation_Global_vs_Muon", + "P_{global} vs. P_{MCH}", + {HistType::kTH2F, {momentumCorrelationAxis, momentumCorrelationAxis}}); + registry.add("global-muons/MomentumDifference_Global_vs_Muon", + "(P_{global} - P_{MCH}) / P_{MCH} vs. P_{MCH}", + {HistType::kTH2F, {momentumCorrelationAxis, momentumDeltaAxis}}); + registry.add("global-muons/MomentumCorrelation_subleading_vs_leading", + "P_{subleading_match} vs. P_{leading_match}", + {HistType::kTH2F, {momentumCorrelationAxis, momentumCorrelationAxis}}); + registry.add("global-muons/MomentumDifference_subleading_vs_leading", + "(P_{subleading_match} - P_{leading_match}) / P_{leading_match} vs. P_{leading_match}", + {HistType::kTH2F, {momentumCorrelationAxis, momentumDeltaAxis}}); + + // AxisSpec etaAxis = {100, -5.0, -2.0, "#eta"}; + AxisSpec etaCorrelationAxis = {80, -5.0, -1.0, "#eta"}; + AxisSpec etaDeltaAxis = {100, -0.2, 0.2, "#Delta#eta"}; + // Eta correlations + registry.add("global-muons/EtaCorrelation_Global_vs_Muon", + "#eta_{global} vs. #eta_{MCH}", + {HistType::kTH2F, {etaCorrelationAxis, etaCorrelationAxis}}); + registry.add("global-muons/EtaDifference_Global_vs_Muon", + "(#eta_{global} - #eta_{MCH}) / #eta_{MCH} vs. #eta_{MCH}", + {HistType::kTH2F, {etaCorrelationAxis, etaDeltaAxis}}); + registry.add("global-muons/EtaCorrelation_subleading_vs_leading", + "#eta_{subleading_match} vs. #eta_{leading_match}", + {HistType::kTH2F, {etaCorrelationAxis, etaCorrelationAxis}}); + registry.add("global-muons/EtaDifference_subleading_vs_leading", + "(#eta_{subleading_match} - #eta_{leading_match}) / #eta_{leading_match} vs. #eta_{leading_match}", + {HistType::kTH2F, {etaCorrelationAxis, etaDeltaAxis}}); + } + + void CreateDetailedHistograms() + { + AxisSpec dcaxMFTAxis = {400, -0.5, 0.5, "DCA_{x} (cm)"}; + AxisSpec dcayMFTAxis = {400, -0.5, 0.5, "DCA_{y} (cm)"}; + AxisSpec dcaxMCHAxis = {400, -10.0, 10.0, "DCA_{x} (cm)"}; + AxisSpec dcayMCHAxis = {400, -10.0, 10.0, "DCA_{y} (cm)"}; + AxisSpec dcazAxis = {20, -10.0, 10.0, "DCA_{z} (cm)"}; + AxisSpec dxAxis = {600, -30.0, 30.0, "#Delta x (cm)"}; + AxisSpec dyAxis = {600, -30.0, 30.0, "#Delta y (cm)"}; + AxisSpec thetaxAxis = {10, 0.0, 20.0, "#theta_{x} (degrees)"}; + AxisSpec dThetaxAxis = {500, -5.0, 5.0, "#Delta#theta_{x} (degrees)"}; + AxisSpec thetayAxis = {10, 0.0, 20.0, "#theta_{y} (degrees)"}; + AxisSpec dThetayAxis = {500, -5.0, 5.0, "#Delta#theta_{y} (degrees)"}; + AxisSpec phiAxis = {360, -180.0, 180.0, "#phi (degrees)"}; + AxisSpec dPhiAxis = {200, -20.0, 20.0, "#Delta#phi (degrees)"}; + + if (configQAs.fEnableQAResidual) { + for (size_t i = 0; i < referencePlanes.size(); i++) { + const auto& refPLane = referencePlanes[i]; + AxisSpec xAxis = {10, 0, refPLane.second, "|x| (cm)"}; + AxisSpec yAxis = {10, 0, refPLane.second, "|y| (cm)"}; + for (size_t j = 0; j < quadrants.size(); j++) { + const auto& quadrant = quadrants[j]; + std::string histPath = std::string("Alignment/same-event/Residuals/ReferencePlanes/") + refPLane.first + "/" + quadrant + "/"; + trackResidualsHistos[i][j]["dx_vs_x"] = registry.add((histPath + "dx_vs_x").c_str(), std::format("#Delta x vs. |x| - {}", quadrant).c_str(), {HistType::kTH2F, {xAxis, dxAxis}}); + trackResidualsHistos[i][j]["dx_vs_y"] = registry.add((histPath + "dx_vs_y").c_str(), std::format("#Delta x vs. |y| - {}", quadrant).c_str(), {HistType::kTH2F, {yAxis, dxAxis}}); + trackResidualsHistos[i][j]["dy_vs_x"] = registry.add((histPath + "dy_vs_x").c_str(), std::format("#Delta y vs. |x| - {}", quadrant).c_str(), {HistType::kTH2F, {xAxis, dyAxis}}); + trackResidualsHistos[i][j]["dy_vs_y"] = registry.add((histPath + "dy_vs_y").c_str(), std::format("#Delta y vs. |y| - {}", quadrant).c_str(), {HistType::kTH2F, {yAxis, dyAxis}}); + + trackResidualsHistos[i][j]["dthetax_vs_x"] = registry.add((histPath + "dthetax_vs_x").c_str(), std::format("#Delta #theta_x vs. |x| - {}", quadrant).c_str(), {HistType::kTH2F, {xAxis, dThetaxAxis}}); + trackResidualsHistos[i][j]["dthetax_vs_y"] = registry.add((histPath + "dthetax_vs_y").c_str(), std::format("#Delta #theta_x vs. |y| - {}", quadrant).c_str(), {HistType::kTH2F, {yAxis, dThetaxAxis}}); + trackResidualsHistos[i][j]["dthetax_vs_thetax"] = registry.add((histPath + "dthetax_vs_thetax").c_str(), std::format("#Delta #theta_x vs. |#theta_x| - {}", quadrant).c_str(), {HistType::kTH2F, {thetaxAxis, dThetaxAxis}}); + + trackResidualsHistos[i][j]["dthetay_vs_x"] = registry.add((histPath + "dthetay_vs_x").c_str(), std::format("#Delta #theta_y vs. |x| - {}", quadrant).c_str(), {HistType::kTH2F, {xAxis, dThetayAxis}}); + trackResidualsHistos[i][j]["dthetay_vs_y"] = registry.add((histPath + "dthetay_vs_y").c_str(), std::format("#Delta #theta_y vs. |y| - {}", quadrant).c_str(), {HistType::kTH2F, {yAxis, dThetayAxis}}); + trackResidualsHistos[i][j]["dthetay_vs_thetay"] = registry.add((histPath + "dthetay_vs_thetay").c_str(), std::format("#Delta #theta_y vs. |#theta_y| - {}", quadrant).c_str(), {HistType::kTH2F, {thetayAxis, dThetayAxis}}); + + // mixed events + histPath = std::string("Alignment/mixed-event/Residuals/ReferencePlanes/") + refPLane.first + "/" + quadrant + "/"; + trackResidualsHistosMixedEvents[i][j]["dx_vs_x"] = registry.add((histPath + "dx_vs_x").c_str(), std::format("#Delta x vs. |x| - {}", quadrant).c_str(), {HistType::kTH2F, {xAxis, dxAxis}}); + trackResidualsHistosMixedEvents[i][j]["dx_vs_y"] = registry.add((histPath + "dx_vs_y").c_str(), std::format("#Delta x vs. |y| - {}", quadrant).c_str(), {HistType::kTH2F, {yAxis, dxAxis}}); + trackResidualsHistosMixedEvents[i][j]["dy_vs_x"] = registry.add((histPath + "dy_vs_x").c_str(), std::format("#Delta y vs. |x| - {}", quadrant).c_str(), {HistType::kTH2F, {xAxis, dyAxis}}); + trackResidualsHistosMixedEvents[i][j]["dy_vs_y"] = registry.add((histPath + "dy_vs_y").c_str(), std::format("#Delta y vs. |y| - {}", quadrant).c_str(), {HistType::kTH2F, {yAxis, dyAxis}}); + + trackResidualsHistosMixedEvents[i][j]["dthetax_vs_x"] = registry.add((histPath + "dthetax_vs_x").c_str(), std::format("#Delta #theta_x vs. |x| - {}", quadrant).c_str(), {HistType::kTH2F, {xAxis, dThetaxAxis}}); + trackResidualsHistosMixedEvents[i][j]["dthetax_vs_y"] = registry.add((histPath + "dthetax_vs_y").c_str(), std::format("#Delta #theta_x vs. |y| - {}", quadrant).c_str(), {HistType::kTH2F, {yAxis, dThetaxAxis}}); + trackResidualsHistosMixedEvents[i][j]["dthetax_vs_thetax"] = registry.add((histPath + "dthetax_vs_thetax").c_str(), std::format("#Delta #theta_x vs. |#theta_x| - {}", quadrant).c_str(), {HistType::kTH2F, {thetaxAxis, dThetaxAxis}}); + + trackResidualsHistosMixedEvents[i][j]["dthetay_vs_x"] = registry.add((histPath + "dthetay_vs_x").c_str(), std::format("#Delta #theta_y vs. |x| - {}", quadrant).c_str(), {HistType::kTH2F, {xAxis, dThetayAxis}}); + trackResidualsHistosMixedEvents[i][j]["dthetay_vs_y"] = registry.add((histPath + "dthetay_vs_y").c_str(), std::format("#Delta #theta_y vs. |y| - {}", quadrant).c_str(), {HistType::kTH2F, {yAxis, dThetayAxis}}); + trackResidualsHistosMixedEvents[i][j]["dthetay_vs_thetay"] = registry.add((histPath + "dthetay_vs_thetay").c_str(), std::format("#Delta #theta_y vs. |#theta_y| - {}", quadrant).c_str(), {HistType::kTH2F, {thetayAxis, dThetayAxis}}); + } + } + + for (size_t j = 0; j < quadrants.size(); j++) { + const auto& quadrant = quadrants[j]; + AxisSpec xAxis = {20, 0, 200, "|x| (cm)"}; + AxisSpec yAxis = {10, 0, 200, "|y| (cm)"}; + for (int chamber = 0; chamber < 10; chamber++) { + std::string histPath = std::string("Alignment/same-event/Residuals/MFT/") + quadrant + "/CH" + std::to_string(chamber + 1) + "/"; + // Delta x at cluster + residualsHistos[j][chamber]["dx_vs_x"] = registryResiduals.add((histPath + "dx_vs_x").c_str(), "Cluster x residual vs. x", {HistType::kTH2F, {xAxis, dxAxis}}); + residualsHistos[j][chamber]["dx_vs_y"] = registryResiduals.add((histPath + "dx_vs_y").c_str(), "Cluster x residual vs. y", {HistType::kTH2F, {yAxis, dxAxis}}); + residualsHistos[j][chamber]["dy_vs_x"] = registryResiduals.add((histPath + "dy_vs_x").c_str(), "Cluster y residual vs. x", {HistType::kTH2F, {xAxis, dyAxis}}); + residualsHistos[j][chamber]["dy_vs_y"] = registryResiduals.add((histPath + "dy_vs_y").c_str(), "Cluster y residual vs. y", {HistType::kTH2F, {yAxis, dyAxis}}); + + // mixed events + histPath = std::string("Alignment/mixed-event/Residuals/MFT/") + quadrant + "/CH" + std::to_string(chamber + 1) + "/"; + // Delta x at cluster + residualsHistosMixedEvents[j][chamber]["dx_vs_x"] = registryResiduals.add((histPath + "dx_vs_x").c_str(), "Cluster x residual vs. x", {HistType::kTH2F, {xAxis, dxAxis}}); + residualsHistosMixedEvents[j][chamber]["dx_vs_y"] = registryResiduals.add((histPath + "dx_vs_y").c_str(), "Cluster x residual vs. y", {HistType::kTH2F, {yAxis, dxAxis}}); + residualsHistosMixedEvents[j][chamber]["dy_vs_x"] = registryResiduals.add((histPath + "dy_vs_x").c_str(), "Cluster y residual vs. x", {HistType::kTH2F, {xAxis, dyAxis}}); + residualsHistosMixedEvents[j][chamber]["dy_vs_y"] = registryResiduals.add((histPath + "dy_vs_y").c_str(), "Cluster y residual vs. y", {HistType::kTH2F, {yAxis, dyAxis}}); + } + } + + for (size_t i = 0; i < 2; i++) { + std::string topBottom = (i == 0) ? "top" : "bottom"; + AxisSpec deAxis = {26, 0, 26, "DE index"}; + AxisSpec phiAxis = {16, -180, 180, "#phi (degrees)"}; + for (size_t j = 0; j < 2; j++) { + std::string sign = (j == 0) ? "positive" : "negative"; + for (int chamber = 0; chamber < 10; chamber++) { + std::string histPath = std::string("Alignment/same-event/Residuals/MFT/MFT_") + topBottom + "/" + sign + "/CH" + std::to_string(chamber + 1) + "/"; + // Delta x and y at cluster + residualsHistosPerDE[i][j][chamber]["dx_vs_de"] = registryResidualsMFT.add((histPath + "dx_vs_de").c_str(), "Cluster x residual vs. DE index", {HistType::kTH2F, {deAxis, dxAxis}}); + residualsHistosPerDE[i][j][chamber]["dy_vs_de"] = registryResidualsMFT.add((histPath + "dy_vs_de").c_str(), "Cluster y residual vs. DE index", {HistType::kTH2F, {deAxis, dxAxis}}); + + residualsHistosPerDE[i][j][chamber]["dx_vs_phi"] = registryResidualsMFT.add((histPath + "dx_vs_phi").c_str(), "Cluster x residual vs. cluster #phi", {HistType::kTH2F, {phiAxis, dxAxis}}); + residualsHistosPerDE[i][j][chamber]["dy_vs_phi"] = registryResidualsMFT.add((histPath + "dy_vs_phi").c_str(), "Cluster y residual vs. cluster #phi", {HistType::kTH2F, {phiAxis, dxAxis}}); + + // mixed events + histPath = std::string("Alignment/mixed-event/Residuals/MFT/MFT_") + topBottom + "/" + sign + "/CH" + std::to_string(chamber + 1) + "/"; + // Delta x and y at cluster + residualsHistosPerDEMixedEvents[i][j][chamber]["dx_vs_de"] = registryResidualsMFT.add((histPath + "dx_vs_de").c_str(), "Cluster x residual vs. DE index", {HistType::kTH2F, {deAxis, dxAxis}}); + residualsHistosPerDEMixedEvents[i][j][chamber]["dy_vs_de"] = registryResidualsMFT.add((histPath + "dy_vs_de").c_str(), "Cluster y residual vs. DE index", {HistType::kTH2F, {deAxis, dxAxis}}); + + residualsHistosPerDEMixedEvents[i][j][chamber]["dx_vs_phi"] = registryResidualsMFT.add((histPath + "dx_vs_phi").c_str(), "Cluster x residual vs. cluster #phi", {HistType::kTH2F, {phiAxis, dxAxis}}); + residualsHistosPerDEMixedEvents[i][j][chamber]["dy_vs_phi"] = registryResidualsMFT.add((histPath + "dy_vs_phi").c_str(), "Cluster y residual vs. cluster #phi", {HistType::kTH2F, {phiAxis, dxAxis}}); + } + } + } + + for (size_t i = 0; i < 2; i++) { + std::string topBottom = (i == 0) ? "top" : "bottom"; + AxisSpec deAxis = {26, 0, 26, "DE index"}; + for (size_t j = 0; j < 2; j++) { + std::string sign = (j == 0) ? "positive" : "negative"; + for (int chamber = 0; chamber < 10; chamber++) { + std::string histPath = std::string("Alignment/same-event/Residuals/MCH/MCH_") + topBottom + "/" + sign + "/CH" + std::to_string(chamber + 1) + "/"; + // Delta x and y at cluster + mchResidualsHistosPerDE[i][j][chamber]["dx_vs_de"] = registryResidualsMCH.add((histPath + "dx_vs_de").c_str(), "Cluster x residual vs. DE index", {HistType::kTH2F, {deAxis, dxAxis}}); + mchResidualsHistosPerDE[i][j][chamber]["dy_vs_de"] = registryResidualsMCH.add((histPath + "dy_vs_de").c_str(), "Cluster y residual vs. DE index", {HistType::kTH2F, {deAxis, dxAxis}}); + + // mixed events + histPath = std::string("Alignment/mixed-event/Residuals/MCH/MCH_") + topBottom + "/" + sign + "/CH" + std::to_string(chamber + 1) + "/"; + // Delta x and y at cluster + mchResidualsHistosPerDEMixedEvents[i][j][chamber]["dx_vs_de"] = registryResidualsMCH.add((histPath + "dx_vs_de").c_str(), "Cluster x residual vs. DE index", {HistType::kTH2F, {deAxis, dxAxis}}); + mchResidualsHistosPerDEMixedEvents[i][j][chamber]["dy_vs_de"] = registryResidualsMCH.add((histPath + "dy_vs_de").c_str(), "Cluster y residual vs. DE index", {HistType::kTH2F, {deAxis, dxAxis}}); + } + } + } + } + + if (configQAs.fEnableQADCA) { + for (size_t j = 0; j < quadrants.size(); j++) { + const auto& quadrant = quadrants[j]; + std::string histPath = std::string("Alignment/same-event/DCA/MFT/") + quadrant + "/"; + dcaHistos[0][j][0]["DCA_x"] = registryDCA.add((histPath + "DCA_x").c_str(), std::format("DCA(x) - {}", quadrant).c_str(), {HistType::kTH1F, {dcaxMFTAxis}}); + dcaHistos[0][j][1]["DCA_x"] = registryDCA.add((histPath + "DCA_x_pos").c_str(), std::format("DCA(x) - {} charge > 0", quadrant).c_str(), {HistType::kTH1F, {dcaxMFTAxis}}); + dcaHistos[0][j][2]["DCA_x"] = registryDCA.add((histPath + "DCA_x_neg").c_str(), std::format("DCA(x) - {} charge < 0", quadrant).c_str(), {HistType::kTH1F, {dcaxMFTAxis}}); + dcaHistos[0][j][0]["DCA_y"] = registryDCA.add((histPath + "DCA_y").c_str(), std::format("DCA(y) - {}", quadrant).c_str(), {HistType::kTH1F, {dcayMFTAxis}}); + dcaHistos[0][j][1]["DCA_y"] = registryDCA.add((histPath + "DCA_y_pos").c_str(), std::format("DCA(y) - {} charge > 0", quadrant).c_str(), {HistType::kTH1F, {dcayMFTAxis}}); + dcaHistos[0][j][2]["DCA_y"] = registryDCA.add((histPath + "DCA_y_neg").c_str(), std::format("DCA(y) - {} charge < 0", quadrant).c_str(), {HistType::kTH1F, {dcayMFTAxis}}); + dcaHistos[0][j][0]["DCA_x_vs_z"] = registryDCA.add((histPath + "DCA_x_vs_z").c_str(), std::format("DCA(x) vs. z - {}", quadrant).c_str(), {HistType::kTH2F, {dcazAxis, dcaxMFTAxis}}); + dcaHistos[0][j][0]["DCA_y_vs_z"] = registryDCA.add((histPath + "DCA_y_vs_z").c_str(), std::format("DCA(y) vs. z - {}", quadrant).c_str(), {HistType::kTH2F, {dcazAxis, dcayMFTAxis}}); + + histPath = std::string("Alignment/same-event/DCA/MCH/") + quadrant + "/"; + dcaHistos[1][j][0]["DCA_x"] = registryDCA.add((histPath + "DCA_x").c_str(), std::format("DCA(x) - {}", quadrant).c_str(), {HistType::kTH1F, {dcaxMCHAxis}}); + dcaHistos[1][j][1]["DCA_x"] = registryDCA.add((histPath + "DCA_x_pos").c_str(), std::format("DCA(x) - {} charge > 0", quadrant).c_str(), {HistType::kTH1F, {dcaxMCHAxis}}); + dcaHistos[1][j][2]["DCA_x"] = registryDCA.add((histPath + "DCA_x_neg").c_str(), std::format("DCA(x) - {} charge < 0", quadrant).c_str(), {HistType::kTH1F, {dcaxMCHAxis}}); + dcaHistos[1][j][0]["DCA_y"] = registryDCA.add((histPath + "DCA_y").c_str(), std::format("DCA(y) - {}", quadrant).c_str(), {HistType::kTH1F, {dcayMCHAxis}}); + dcaHistos[1][j][1]["DCA_y"] = registryDCA.add((histPath + "DCA_y_pos").c_str(), std::format("DCA(y) - {} charge > 0", quadrant).c_str(), {HistType::kTH1F, {dcayMCHAxis}}); + dcaHistos[1][j][2]["DCA_y"] = registryDCA.add((histPath + "DCA_y_neg").c_str(), std::format("DCA(y) - {} charge < 0", quadrant).c_str(), {HistType::kTH1F, {dcayMCHAxis}}); + + histPath = std::string("Alignment/mixed-event/DCA/MFT/") + quadrant + "/"; + dcaHistosMixedEvents[0][j][0]["DCA_x"] = registryDCA.add((histPath + "DCA_x").c_str(), std::format("DCA(x) - {}", quadrant).c_str(), {HistType::kTH1F, {dcaxMFTAxis}}); + dcaHistosMixedEvents[0][j][1]["DCA_x"] = registryDCA.add((histPath + "DCA_x_pos").c_str(), std::format("DCA(x) - {} charge > 0", quadrant).c_str(), {HistType::kTH1F, {dcaxMFTAxis}}); + dcaHistosMixedEvents[0][j][2]["DCA_x"] = registryDCA.add((histPath + "DCA_x_neg").c_str(), std::format("DCA(x) - {} charge < 0", quadrant).c_str(), {HistType::kTH1F, {dcaxMFTAxis}}); + dcaHistosMixedEvents[0][j][0]["DCA_y"] = registryDCA.add((histPath + "DCA_y").c_str(), std::format("DCA(y) - {}", quadrant).c_str(), {HistType::kTH1F, {dcayMFTAxis}}); + dcaHistosMixedEvents[0][j][1]["DCA_y"] = registryDCA.add((histPath + "DCA_y_pos").c_str(), std::format("DCA(y) - {} charge > 0", quadrant).c_str(), {HistType::kTH1F, {dcayMFTAxis}}); + dcaHistosMixedEvents[0][j][2]["DCA_y"] = registryDCA.add((histPath + "DCA_y_neg").c_str(), std::format("DCA(y) - {} charge < 0", quadrant).c_str(), {HistType::kTH1F, {dcayMFTAxis}}); + dcaHistosMixedEvents[0][j][0]["DCA_x_vs_z"] = registryDCA.add((histPath + "DCA_x_vs_z").c_str(), std::format("DCA(x) vs. z - {}", quadrant).c_str(), {HistType::kTH2F, {dcazAxis, dcaxMFTAxis}}); + dcaHistosMixedEvents[0][j][0]["DCA_y_vs_z"] = registryDCA.add((histPath + "DCA_y_vs_z").c_str(), std::format("DCA(y) vs. z - {}", quadrant).c_str(), {HistType::kTH2F, {dcazAxis, dcayMFTAxis}}); + + histPath = std::string("Alignment/mixed-event/DCA/MCH/") + quadrant + "/"; + dcaHistosMixedEvents[1][j][0]["DCA_x"] = registryDCA.add((histPath + "DCA_x").c_str(), std::format("DCA(x) - {}", quadrant).c_str(), {HistType::kTH1F, {dcaxMCHAxis}}); + dcaHistosMixedEvents[1][j][1]["DCA_x"] = registryDCA.add((histPath + "DCA_x_pos").c_str(), std::format("DCA(x) - {} charge > 0", quadrant).c_str(), {HistType::kTH1F, {dcaxMCHAxis}}); + dcaHistosMixedEvents[1][j][2]["DCA_x"] = registryDCA.add((histPath + "DCA_x_neg").c_str(), std::format("DCA(x) - {} charge < 0", quadrant).c_str(), {HistType::kTH1F, {dcaxMCHAxis}}); + dcaHistosMixedEvents[1][j][0]["DCA_y"] = registryDCA.add((histPath + "DCA_y").c_str(), std::format("DCA(y) - {}", quadrant).c_str(), {HistType::kTH1F, {dcayMCHAxis}}); + dcaHistosMixedEvents[1][j][1]["DCA_y"] = registryDCA.add((histPath + "DCA_y_pos").c_str(), std::format("DCA(y) - {} charge > 0", quadrant).c_str(), {HistType::kTH1F, {dcayMCHAxis}}); + dcaHistosMixedEvents[1][j][2]["DCA_y"] = registryDCA.add((histPath + "DCA_y_neg").c_str(), std::format("DCA(y) - {} charge < 0", quadrant).c_str(), {HistType::kTH1F, {dcayMCHAxis}}); + } + } + + if (configQAs.fEnableQADimuon) { + AxisSpec invMassAxis = {400, 1, 5, "M_{#mu^{+}#mu^{-}} (GeV/c^{2})"}; + AxisSpec invMassCorrelationAxis = {80, 0, 8, "M_{#mu^{+}#mu^{-}} (GeV/c^{2})"}; + AxisSpec invMassAxisFull = {5000, 0, 100, "M_{#mu^{+}#mu^{-}} (GeV/c^{2})"}; + // MCH-MID tracks with MCH acceptance cuts + registryDimuon.add("dimuon/same-event/invariantMass_MuonKine_MuonCuts", "#mu^{+}#mu^{-} invariant mass", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/same-event/invariantMassFull_MuonKine_MuonCuts", "#mu^{+}#mu^{-} invariant mass", {HistType::kTH1F, {invMassAxisFull}}); + registryDimuon.add("dimuon/mixed-event/invariantMass_MuonKine_MuonCuts", "#mu^{+}#mu^{-} invariant mass", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/mixed-event/invariantMassFull_MuonKine_MuonCuts", "#mu^{+}#mu^{-} invariant mass", {HistType::kTH1F, {invMassAxisFull}}); + // MCH-MID tracks with MCH acceptance cuts and combinations from the top and bottom halfs of MCH + registryDimuon.add("dimuon/same-event/invariantMass_MuonKine_MuonCuts_TT", "#mu^{+}#mu^{-} invariant mass, top-top", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/same-event/invariantMassFull_MuonKine_MuonCuts_TT", "#mu^{+}#mu^{-} invariant mass, top-top", {HistType::kTH1F, {invMassAxisFull}}); + registryDimuon.add("dimuon/same-event/invariantMass_MuonKine_MuonCuts_TB", "#mu^{+}#mu^{-} invariant mass, top-bottom or bottom-top", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/same-event/invariantMassFull_MuonKine_MuonCuts_TB", "#mu^{+}#mu^{-} invariant mass, top-bottom or bottom-top", {HistType::kTH1F, {invMassAxisFull}}); + registryDimuon.add("dimuon/same-event/invariantMass_MuonKine_MuonCuts_BB", "#mu^{+}#mu^{-} invariant mass, bottom-bottom", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/same-event/invariantMassFull_MuonKine_MuonCuts_BB", "#mu^{+}#mu^{-} invariant mass, bottom-bottom", {HistType::kTH1F, {invMassAxisFull}}); + registryDimuon.add("dimuon/mixed-event/invariantMass_MuonKine_MuonCuts_TT", "#mu^{+}#mu^{-} invariant mass, top-top", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/mixed-event/invariantMassFull_MuonKine_MuonCuts_TT", "#mu^{+}#mu^{-} invariant mass, top-top", {HistType::kTH1F, {invMassAxisFull}}); + registryDimuon.add("dimuon/mixed-event/invariantMass_MuonKine_MuonCuts_TB", "#mu^{+}#mu^{-} invariant mass, top-bottom or bottom-top", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/mixed-event/invariantMassFull_MuonKine_MuonCuts_TB", "#mu^{+}#mu^{-} invariant mass, top-bottom or bottom-top", {HistType::kTH1F, {invMassAxisFull}}); + registryDimuon.add("dimuon/mixed-event/invariantMass_MuonKine_MuonCuts_BB", "#mu^{+}#mu^{-} invariant mass, bottom-bottom", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/mixed-event/invariantMassFull_MuonKine_MuonCuts_BB", "#mu^{+}#mu^{-} invariant mass, bottom-bottom", {HistType::kTH1F, {invMassAxisFull}}); + // MCH-MID tracks with MFT acceptance cuts and combinations from the top and bottom halfs of MCH + registryDimuon.add("dimuon/same-event/invariantMass_MuonKine_GlobalMuonCuts_TT", "#mu^{+}#mu^{-} invariant mass, top-top", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/same-event/invariantMassFull_MuonKine_GlobalMuonCuts_TT", "#mu^{+}#mu^{-} invariant mass, top-top", {HistType::kTH1F, {invMassAxisFull}}); + registryDimuon.add("dimuon/same-event/invariantMass_MuonKine_GlobalMuonCuts_TB", "#mu^{+}#mu^{-} invariant mass, top-bottom or bottom-top", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/same-event/invariantMassFull_MuonKine_GlobalMuonCuts_TB", "#mu^{+}#mu^{-} invariant mass, top-bottom or bottom-top", {HistType::kTH1F, {invMassAxisFull}}); + registryDimuon.add("dimuon/same-event/invariantMass_MuonKine_GlobalMuonCuts_BB", "#mu^{+}#mu^{-} invariant mass, bottom-bottom", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/same-event/invariantMassFull_MuonKine_GlobalMuonCuts_BB", "#mu^{+}#mu^{-} invariant mass, bottom-bottom", {HistType::kTH1F, {invMassAxisFull}}); + registryDimuon.add("dimuon/mixed-event/invariantMass_MuonKine_GlobalMuonCuts_TT", "#mu^{+}#mu^{-} invariant mass, top-top", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/mixed-event/invariantMassFull_MuonKine_GlobalMuonCuts_TT", "#mu^{+}#mu^{-} invariant mass, top-top", {HistType::kTH1F, {invMassAxisFull}}); + registryDimuon.add("dimuon/mixed-event/invariantMass_MuonKine_GlobalMuonCuts_TB", "#mu^{+}#mu^{-} invariant mass, top-bottom or bottom-top", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/mixed-event/invariantMassFull_MuonKine_GlobalMuonCuts_TB", "#mu^{+}#mu^{-} invariant mass, top-bottom or bottom-top", {HistType::kTH1F, {invMassAxisFull}}); + registryDimuon.add("dimuon/mixed-event/invariantMass_MuonKine_GlobalMuonCuts_BB", "#mu^{+}#mu^{-} invariant mass, bottom-bottom", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/mixed-event/invariantMassFull_MuonKine_GlobalMuonCuts_BB", "#mu^{+}#mu^{-} invariant mass, bottom-bottom", {HistType::kTH1F, {invMassAxisFull}}); + // MCH-MID tracks with MCH acceptance cuts and combinations from the left and right halfs of MCH + registryDimuon.add("dimuon/same-event/invariantMass_MuonKine_MuonCuts_LL", "#mu^{+}#mu^{-} invariant mass, left-left", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/same-event/invariantMassFull_MuonKine_MuonCuts_LL", "#mu^{+}#mu^{-} invariant mass, left-left", {HistType::kTH1F, {invMassAxisFull}}); + registryDimuon.add("dimuon/same-event/invariantMass_MuonKine_MuonCuts_LR", "#mu^{+}#mu^{-} invariant mass, left-right or right-left", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/same-event/invariantMassFull_MuonKine_MuonCuts_LR", "#mu^{+}#mu^{-} invariant mass, left-right or right-left", {HistType::kTH1F, {invMassAxisFull}}); + registryDimuon.add("dimuon/same-event/invariantMass_MuonKine_MuonCuts_RR", "#mu^{+}#mu^{-} invariant mass, right-right", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/same-event/invariantMassFull_MuonKine_MuonCuts_RR", "#mu^{+}#mu^{-} invariant mass, right-right", {HistType::kTH1F, {invMassAxisFull}}); + registryDimuon.add("dimuon/mixed-event/invariantMass_MuonKine_MuonCuts_LL", "#mu^{+}#mu^{-} invariant mass, left-left", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/mixed-event/invariantMassFull_MuonKine_MuonCuts_LL", "#mu^{+}#mu^{-} invariant mass, left-left", {HistType::kTH1F, {invMassAxisFull}}); + registryDimuon.add("dimuon/mixed-event/invariantMass_MuonKine_MuonCuts_LR", "#mu^{+}#mu^{-} invariant mass, left-right or left-right", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/mixed-event/invariantMassFull_MuonKine_MuonCuts_LR", "#mu^{+}#mu^{-} invariant mass, left-right or right-left", {HistType::kTH1F, {invMassAxisFull}}); + registryDimuon.add("dimuon/mixed-event/invariantMass_MuonKine_MuonCuts_RR", "#mu^{+}#mu^{-} invariant mass, right-right", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/mixed-event/invariantMassFull_MuonKine_MuonCuts_RR", "#mu^{+}#mu^{-} invariant mass, right-right", {HistType::kTH1F, {invMassAxisFull}}); + // MCH-MID tracks with MFT acceptance cuts + registryDimuon.add("dimuon/same-event/invariantMass_MuonKine_GlobalMuonCuts", "#mu^{+}#mu^{-} invariant mass", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/same-event/invariantMassFull_MuonKine_GlobalMuonCuts", "#mu^{+}#mu^{-} invariant mass", {HistType::kTH1F, {invMassAxisFull}}); + registryDimuon.add("dimuon/mixed-event/invariantMass_MuonKine_GlobalMuonCuts", "#mu^{+}#mu^{-} invariant mass", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/mixed-event/invariantMassFull_MuonKine_GlobalMuonCuts", "#mu^{+}#mu^{-} invariant mass", {HistType::kTH1F, {invMassAxisFull}}); + // MCH-MID tracks with MFT acceptance cuts and combinations from the left and right halfs of MCH + registryDimuon.add("dimuon/same-event/invariantMass_MuonKine_GlobalMuonCuts_LL", "#mu^{+}#mu^{-} invariant mass, left-left", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/same-event/invariantMassFull_MuonKine_GlobalMuonCuts_LL", "#mu^{+}#mu^{-} invariant mass, left-left", {HistType::kTH1F, {invMassAxisFull}}); + registryDimuon.add("dimuon/same-event/invariantMass_MuonKine_GlobalMuonCuts_LR", "#mu^{+}#mu^{-} invariant mass, left-right or right-left", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/same-event/invariantMassFull_MuonKine_GlobalMuonCuts_LR", "#mu^{+}#mu^{-} invariant mass, left-right or right-left", {HistType::kTH1F, {invMassAxisFull}}); + registryDimuon.add("dimuon/same-event/invariantMass_MuonKine_GlobalMuonCuts_RR", "#mu^{+}#mu^{-} invariant mass, right-right", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/same-event/invariantMassFull_MuonKine_GlobalMuonCuts_RR", "#mu^{+}#mu^{-} invariant mass, right-right", {HistType::kTH1F, {invMassAxisFull}}); + registryDimuon.add("dimuon/mixed-event/invariantMass_MuonKine_GlobalMuonCuts_LL", "#mu^{+}#mu^{-} invariant mass, left-left", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/mixed-event/invariantMassFull_MuonKine_GlobalMuonCuts_LL", "#mu^{+}#mu^{-} invariant mass, left-left", {HistType::kTH1F, {invMassAxisFull}}); + registryDimuon.add("dimuon/mixed-event/invariantMass_MuonKine_GlobalMuonCuts_LR", "#mu^{+}#mu^{-} invariant mass, left-right or right-left", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/mixed-event/invariantMassFull_MuonKine_GlobalMuonCuts_LR", "#mu^{+}#mu^{-} invariant mass, left-right or right-left", {HistType::kTH1F, {invMassAxisFull}}); + registryDimuon.add("dimuon/mixed-event/invariantMass_MuonKine_GlobalMuonCuts_RR", "#mu^{+}#mu^{-} invariant mass, right-right", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/mixed-event/invariantMassFull_MuonKine_GlobalMuonCuts_RR", "#mu^{+}#mu^{-} invariant mass right-right", {HistType::kTH1F, {invMassAxisFull}}); + // Good MFT-MCH-MID tracks with MCH parameters and MFT acceptance cuts + registryDimuon.add("dimuon/same-event/invariantMass_MuonKine_GlobalMatchesCuts", "#mu^{+}#mu^{-} invariant mass", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/same-event/invariantMassFull_MuonKine_GlobalMatchesCuts", "#mu^{+}#mu^{-} invariant mass", {HistType::kTH1F, {invMassAxisFull}}); + registryDimuon.add("dimuon/mixed-event/invariantMass_MuonKine_GlobalMatchesCuts", "#mu^{+}#mu^{-} invariant mass", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/mixed-event/invariantMassFull_MuonKine_GlobalMatchesCuts", "#mu^{+}#mu^{-} invariant mass", {HistType::kTH1F, {invMassAxisFull}}); + // Good MFT-MCH-MID tracks with global parameters MFT acceptance cuts + registryDimuon.add("dimuon/same-event/invariantMass_GlobalMuonKine_GlobalMatchesCuts", "#mu^{+}#mu^{-} invariant mass", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/same-event/invariantMassFull_GlobalMuonKine_GlobalMatchesCuts", "#mu^{+}#mu^{-} invariant mass", {HistType::kTH1F, {invMassAxisFull}}); + registryDimuon.add("dimuon/mixed-event/invariantMass_GlobalMuonKine_GlobalMatchesCuts", "#mu^{+}#mu^{-} invariant mass", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/mixed-event/invariantMassFull_GlobalMuonKine_GlobalMatchesCuts", "#mu^{+}#mu^{-} invariant mass", {HistType::kTH1F, {invMassAxisFull}}); + // Good MFT-MCH-MID tracks with re-scaled MFT kinematics and MFT acceptance cuts + registryDimuon.add("dimuon/same-event/invariantMass_ScaledMftKine_GlobalMatchesCuts", "M_{#mu^{+}#mu^{-}} - rescaled MFT momentum", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/same-event/invariantMassFull_ScaledMftKine_GlobalMatchesCuts", "M_{#mu^{+}#mu^{-}} - rescaled MFT momentum", {HistType::kTH1F, {invMassAxisFull}}); + registryDimuon.add("dimuon/mixed-event/invariantMass_ScaledMftKine_GlobalMatchesCuts", "M_{#mu^{+}#mu^{-}} - rescaled MFT momentum", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/mixed-event/invariantMassFull_ScaledMftKine_GlobalMatchesCuts", "M_{#mu^{+}#mu^{-}} - rescaled MFT momentum", {HistType::kTH1F, {invMassAxisFull}}); + // combinations of tracks from top and bottom halfs of MFT + registryDimuon.add("dimuon/same-event/invariantMass_ScaledMftKine_GlobalMatchesCuts_TT", "M_{#mu^{+}#mu^{-}} - rescaled MFT momentum, top-top", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/same-event/invariantMass_ScaledMftKine_GlobalMatchesCuts_TB", "M_{#mu^{+}#mu^{-}} - rescaled MFT momentum, top-bottom", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/same-event/invariantMass_ScaledMftKine_GlobalMatchesCuts_BT", "M_{#mu^{+}#mu^{-}} - rescaled MFT momentum, bottom-top", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/same-event/invariantMass_ScaledMftKine_GlobalMatchesCuts_BB", "M_{#mu^{+}#mu^{-}} - rescaled MFT momentum, bottom-bottom", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/mixed-event/invariantMass_ScaledMftKine_GlobalMatchesCuts_TT", "M_{#mu^{+}#mu^{-}} - rescaled MFT momentum, top-top", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/mixed-event/invariantMass_ScaledMftKine_GlobalMatchesCuts_TB", "M_{#mu^{+}#mu^{-}} - rescaled MFT momentum, top-bottom", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/mixed-event/invariantMass_ScaledMftKine_GlobalMatchesCuts_BT", "M_{#mu^{+}#mu^{-}} - rescaled MFT momentum, bottom-top", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/mixed-event/invariantMass_ScaledMftKine_GlobalMatchesCuts_BB", "M_{#mu^{+}#mu^{-}} - rescaled MFT momentum, bottom-bottom", {HistType::kTH1F, {invMassAxis}}); + // combinations with sub-leading matches + registryDimuon.add("dimuon/same-event/invariantMass_GlobalMuonKine_GlobalMatchesCuts_leading_subleading", "#mu^{+}#mu^{-} invariant mass", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/same-event/invariantMassFull_GlobalMuonKine_GlobalMatchesCuts_leading_subleading", "#mu^{+}#mu^{-} invariant mass", {HistType::kTH1F, {invMassAxisFull}}); + registryDimuon.add("dimuon/same-event/invariantMass_GlobalMuonKine_GlobalMatchesCuts_subleading_leading", "#mu^{+}#mu^{-} invariant mass", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/same-event/invariantMassFull_GlobalMuonKine_GlobalMatchesCuts_subleading_leading", "#mu^{+}#mu^{-} invariant mass", {HistType::kTH1F, {invMassAxisFull}}); + registryDimuon.add("dimuon/same-event/invariantMass_GlobalMuonKine_GlobalMatchesCuts_subleading_subleading", "#mu^{+}#mu^{-} invariant mass", {HistType::kTH1F, {invMassAxis}}); + registryDimuon.add("dimuon/same-event/invariantMassFull_GlobalMuonKine_GlobalMatchesCuts_subleading_subleading", "#mu^{+}#mu^{-} invariant mass", {HistType::kTH1F, {invMassAxisFull}}); + + // invariant mass correlations + registryDimuon.add("dimuon/same-event/invariantMass_MuonKine_vs_GlobalMuonKine", "M_{#mu^{+}#mu^{-}} - muon tracks vs. global tracks", {HistType::kTH2F, {invMassCorrelationAxis, invMassCorrelationAxis}}); + registryDimuon.add("dimuon/same-event/invariantMass_ScaledMftKine_vs_GlobalMuonKine", "M_{#mu^{+}#mu^{-}} - rescaled MFT tracks vs. global tracks", {HistType::kTH2F, {invMassCorrelationAxis, invMassCorrelationAxis}}); + registryDimuon.add("dimuon/same-event/invariantMass_GlobalMuonKine_subleading_vs_leading", "M_{#mu^{+}#mu^{-}} - subleading vs. leading matches", {HistType::kTH2F, {invMassCorrelationAxis, invMassCorrelationAxis}}); + } + } + + void doTransformMFT(o2::mch::TrackParam& track) + { + double zCH10 = -1437.6; + double z = track.getZ(); + // double dZ = zMCH - z; + double x = track.getNonBendingCoor(); + double y = track.getBendingCoor(); + double xSlope = track.getNonBendingSlope(); + double ySlope = track.getBendingSlope(); + + double xShiftMCH = (y > 0) ? 0.8541 : -1.5599; + double xCorrection = xShiftMCH * z / zCH10; + track.setNonBendingCoor(x + xCorrection); + double xSlopeCorrection = xShiftMCH / zCH10; + track.setNonBendingSlope(xSlope + xSlopeCorrection); + + double yShiftMCH = (y > 0) ? 3.0311 : 0.7588; + double yCorrection = yShiftMCH * z / zCH10; + track.setBendingCoor(y + yCorrection); + double ySlopeCorrection = yShiftMCH / zCH10; + track.setBendingSlope(ySlope + ySlopeCorrection); + } + + template + void TransformMFT(TTrack& track) + { + if constexpr (static_cast(GlobalFwdFillMap)) { + auto mchTrack = mMatching.FwdtoMCH(track); + doTransformMFT(mchTrack); + + auto transformedTrack = mMatching.MCHtoFwd(mchTrack); + track.setParameters(transformedTrack.getParameters()); + track.setZ(transformedTrack.getZ()); + track.setCovariances(transformedTrack.getCovariances()); + } else { + o2::dataformats::GlobalFwdTrack fwdtrack; + fwdtrack.setParameters(track.getParameters()); + fwdtrack.setZ(track.getZ()); + fwdtrack.setCovariances(track.getCovariances()); + auto mchTrack = mMatching.FwdtoMCH(fwdtrack); + doTransformMFT(mchTrack); + + auto transformedTrack = mMatching.MCHtoFwd(mchTrack); + track.setParameters(transformedTrack.getParameters()); + track.setZ(transformedTrack.getZ()); + track.setCovariances(transformedTrack.getCovariances()); + } + } + + int GetDetElemId(int iDetElemNumber) + { + // make sure detector number is valid + if (!(iDetElemNumber >= fgSNDetElemCh[0] && + iDetElemNumber < fgSNDetElemCh[10])) { + LOGF(fatal, "Invalid detector element number: %d", iDetElemNumber); + } + /// get det element number from ID + // get chamber and element number in chamber + int iCh = 0; + int iDet = 0; + for (int i = 1; i <= 10; i++) { + if (iDetElemNumber < fgSNDetElemCh[i]) { + iCh = i; + iDet = iDetElemNumber - fgSNDetElemCh[i - 1]; + break; + } + } + + // make sure detector index is valid + if (!(iCh > 0 && iCh <= 10 && iDet < fgNDetElemCh[iCh - 1])) { + LOGF(fatal, "Invalid detector element id: %d", 100 * iCh + iDet); + } + + // add number of detectors up to this chamber + return 100 * iCh + iDet; + } + + int GetQuadrantPhi(double phi) + { + if (phi >= 0 && phi < 90) { + return 0; + } + if (phi >= 90 && phi <= 180) { + return 1; + } + if (phi >= -180 && phi < -90) { + return 2; + } + if (phi >= -90 && phi < 0) { + return 3; + } + return -1; + } + + template + int GetQuadrantTrack(TTrack const& track) + { + double phi = static_cast(track.phi()) * 180 / TMath::Pi(); + return GetQuadrantPhi(phi); + } + + bool RemoveTrack(mch::Track& track) + { + // Refit track with re-aligned clusters + bool removeTrack = false; + try { + trackFitter.fit(track, false); + } catch (exception const& e) { + removeTrack = true; + return removeTrack; + } + + auto itStartingParam = std::prev(track.rend()); + + while (true) { + + try { + trackFitter.fit(track, true, false, (itStartingParam == track.rbegin()) ? nullptr : &itStartingParam); + } catch (exception const&) { + removeTrack = true; + break; + } + + double worstLocalChi2 = -1.0; + + track.tagRemovableClusters(0x1F, false); + + auto itWorstParam = track.end(); + + for (auto itParam = track.begin(); itParam != track.end(); ++itParam) { + if (itParam->getLocalChi2() > worstLocalChi2) { + worstLocalChi2 = itParam->getLocalChi2(); + itWorstParam = itParam; + } + } + + if (worstLocalChi2 < mImproveCutChi2) { + break; + } + + if (!itWorstParam->isRemovable()) { + removeTrack = true; + track.removable(); + break; + } + + auto itNextParam = track.removeParamAtCluster(itWorstParam); + auto itNextToNextParam = (itNextParam == track.end()) ? itNextParam : std::next(itNextParam); + itStartingParam = track.rbegin(); + + if (track.getNClusters() < 10) { + removeTrack = true; + break; + } else { + while (itNextToNextParam != track.end()) { + if (itNextToNextParam->getClusterPtr()->getChamberId() != itNextParam->getClusterPtr()->getChamberId()) { + itStartingParam = std::make_reverse_iterator(++itNextParam); + break; + } + ++itNextToNextParam; + } + } + } + + if (!removeTrack) { + for (auto& param : track) { + param.setParameters(param.getSmoothParameters()); + param.setCovariances(param.getSmoothCovariances()); + } + } + + return removeTrack; + } + + template + bool pDCACut(Var const& fgValues, Var const& fgValuesPV, double nSigmaPDCA) + { + static const double sigmaPDCA23 = 80.; + static const double sigmaPDCA310 = 54.; + static const double relPRes = 0.0004; + static const double slopeRes = 0.0005; + + double thetaAbs = TMath::ATan(fgValues.rabs / 505.) * TMath::RadToDeg(); + double p = fgValuesPV.p; + + double pDCA = fgValues.pDca; + double sigmaPDCA = (thetaAbs < 3) ? sigmaPDCA23 : sigmaPDCA310; + double nrp = nSigmaPDCA * relPRes * p; + double pResEffect = sigmaPDCA / (1. - nrp / (1. + nrp)); + double slopeResEffect = 535. * slopeRes * p; + double sigmaPDCAWithRes = TMath::Sqrt(pResEffect * pResEffect + slopeResEffect * slopeResEffect); + + if (pDCA > nSigmaPDCA * sigmaPDCAWithRes) { + return false; + } + + return true; + } + + template + bool IsMixedEvent(Var const& fgValues1, Var const& fgValues2) + { + if (fgValues1.bc == fgValues2.bc) { + return false; + } + + uint64_t bcDiff = (fgValues2.bc > fgValues1.bc) ? (fgValues2.bc - fgValues1.bc) : (fgValues1.bc - fgValues2.bc); + // in the event mixing case, we require a minimum BC gap between the collisions + if (bcDiff < configMixing.fEventMinDeltaBc) + return false; + + // we also require that the collisions have similar Z positions and multiplicity of MFT tracks + if (std::fabs(fgValues2.z - fgValues1.z) > configMixing.fEventMaxDeltaVtxZ) { + return false; + } + + if (std::abs(fgValues2.multMFT - fgValues1.multMFT) > configMixing.fEventMaxDeltaNMFT) { + return false; + } + + return true; + } + + template + bool IsGoodMuon(Var const& fgValues, Var const& fgValuesPV, float fTrackChi2MchUp, float fPMchLow, float fPtMchLow, float fEtaMchLow, float fEtaMchUp, float fRabsLow, float fRabsUp, float fSigmaPdcaUp) + { + // chi2 cut + if (fgValues.chi2 > fTrackChi2MchUp) + return false; + + // momentum cut + if (fgValues.p < fPMchLow) { + return false; // skip low-momentum tracks + } + + // transverse momentum cut + if (fgValues.pT < fPtMchLow) { + return false; // skip low-momentum tracks + } + + // Eta cut + if ((fgValues.eta < fEtaMchLow || fgValues.eta > fEtaMchUp)) { + return false; + } + + // RAbs cut + if ((fgValues.rabs < fRabsLow || fgValues.rabs > fRabsUp)) { + return false; + } + + // pDCA cut + if (!pDCACut(fgValues, fgValuesPV, fSigmaPdcaUp)) { + return false; + } + + return true; + } + + template + bool IsGoodMuon(Var const& fgValues, Var const& fgValuesPV) + { + return IsGoodMuon(fgValues, fgValuesPV, configMuons.fTrackChi2MchUp, configMuons.fPMchLow, configMuons.fPtMchLow, configMuons.fEtaMchLow, configMuons.fEtaMchUp, configMuons.fRabsLow, configMuons.fRabsUp, configMuons.fSigmaPdcaUp); + } + + template + bool IsGoodGlobalMuon(Var const& fgValues, Var const& fgValuesPV) + { + return IsGoodMuon(fgValues, fgValuesPV, configMuons.fTrackChi2MchUp, configMuons.fPMchLow, configMuons.fPtMchLow, configMFTs.fEtaMftLow, configMFTs.fEtaMftUp, configMuons.fRabsLow, configMuons.fRabsUp, configMuons.fSigmaPdcaUp); + } + + template + bool IsGoodMFT(Var const& fgValues, float fTrackChi2MftUp, int fTrackNClustMftLow) + { + // chi2 cut + if (fgValues.chi2 > fTrackChi2MftUp) { + return false; + } + + // number of clusters cut + if (fgValues.nClusters < fTrackNClustMftLow) { + return false; + } + + return true; + } + + template + bool IsGoodGlobalMatching(Var const& fgValues, float fTrackChi2MftUp, int fTrackNClustMftLow, float fMatchingChi2MftMchUp) + { + if (!IsGoodMFT(fgValues, fTrackChi2MftUp, fTrackNClustMftLow)) { + return false; + } + + if (fgValues.chi2matching > fMatchingChi2MftMchUp) { + return false; + } + + return true; + } + + template + bool IsGoodGlobalMatching(Var const& fgValues) + { + return IsGoodGlobalMatching(fgValues, configMFTs.fTrackChi2MftUp, configMFTs.fTrackNClustMftLow, fMatchingChi2MftMchUp); + } + + template + double GetMuMuInvariantMass(VarT const& track1, VarT const& track2) + { + ROOT::Math::PxPyPzMVector muon1{ + track1.px, + track1.py, + track1.pz, + o2::constants::physics::MassMuon}; + + ROOT::Math::PxPyPzMVector muon2{ + track2.px, + track2.py, + track2.pz, + o2::constants::physics::MassMuon}; + + auto dimuon = muon1 + muon2; + + return dimuon.M(); + } + + template + void GetMuonPairs(TMuons const& muons, TCandidates const& matchingCandidates, const std::map& collisionInfos, + std::vector& muonPairs, + std::vector& globalMuonPairs) + { + // muon tracks - outer loop over collisions + for (auto& [collisionIndex1, collisionInfo1] : collisionInfos) { + + // outer loop over muon tracks + auto muonCollision1 = muons.sliceBy(fwdtracksPerCollision, collisionInfo1.globalIndex); + for (auto muon1 : muonCollision1) { + + if (muon1.trackType() <= 2) { + continue; + } + auto mchIndex1 = muon1.globalIndex(); + + // inner loop over collisions + for (auto& [collisionIndex2, collisionInfo2] : collisionInfos) { + // avoid double-counting of collisions + if (collisionIndex2 < collisionIndex1) + continue; + + bool sameEvent = (collisionIndex1 == collisionIndex2); + bool mixedEvent = IsMixedEvent(collisionInfo1, collisionInfo2); + + if (!sameEvent && !mixedEvent) + continue; + + // inner loop over muon tracks + auto muonCollision2 = muons.sliceBy(fwdtracksPerCollision, collisionInfo2.globalIndex); + for (auto muon2 : muonCollision2) { + if (muon2.trackType() <= 2) { + continue; + } + auto mchIndex2 = muon2.globalIndex(); + + // avoid double-counting of muon pairs if we are not mixing events + if (sameEvent && mchIndex2 <= mchIndex1) + continue; + + MuonPair muonPair{{collisionIndex1, mchIndex1}, {collisionIndex2, mchIndex2}}; + muonPairs.emplace_back(muonPair); + } + } + } + } + + // global muon tracks - outer loop over collisions + for (auto& [collisionIndex1, collisionInfo1] : collisionInfos) { + + // outer loop over global muon tracks + auto muonCollision1 = muons.sliceBy(fwdtracksPerCollision, collisionInfo1.globalIndex); + for (auto muon1 : muonCollision1) { + + if (muon1.trackType() <= 2) { + continue; + } + auto mchIndex1 = muon1.globalIndex(); + auto matchingCandidateIt1 = matchingCandidates.find(mchIndex1); + if (matchingCandidateIt1 == matchingCandidates.end()) { + continue; + } + + // inner loop over collisions + for (auto& [collisionIndex2, collisionInfo2] : collisionInfos) { + // avoid double-counting of collisions + if (collisionIndex2 < collisionIndex1) + continue; + + bool sameEvent = (collisionIndex1 == collisionIndex2); + bool mixedEvent = IsMixedEvent(collisionInfo1, collisionInfo2); + + if (!sameEvent && !mixedEvent) + continue; + + // outer loop over global muon tracks + auto muonCollision2 = muons.sliceBy(fwdtracksPerCollision, collisionInfo2.globalIndex); + for (auto muon2 : muonCollision2) { + + if (muon2.trackType() <= 2) { + continue; + } + auto mchIndex2 = muon2.globalIndex(); + auto matchingCandidateIt2 = matchingCandidates.find(mchIndex2); + if (matchingCandidateIt2 == matchingCandidates.end()) { + continue; + } + + // avoid double-counting of muon pairs if we are not mixing events + if (sameEvent && mchIndex2 <= mchIndex1) + continue; + + GlobalMuonPair muonPair{{collisionIndex1, matchingCandidateIt1->second}, {collisionIndex2, matchingCandidateIt2->second}}; + globalMuonPairs.emplace_back(muonPair); + } + } + } + } + } + + template + void FillCollision(TEvent const& collision, Var& fgValues) + { + fgValues.globalIndex = collision.globalIndex(); + fgValues.x = collision.posX(); + fgValues.y = collision.posY(); + fgValues.z = collision.posZ(); + fgValues.covXX = collision.covXX(); + fgValues.covYY = collision.covYY(); + } + + template + void FillTrack(mch::Track const& muon, Var& fgValues) + { + mch::TrackParam trackParam = mch::TrackParam(muon.first()); + auto proptrack = mMatching.MCHtoFwd(trackParam); + + fgValues.pT = proptrack.getPt(); + fgValues.x = proptrack.getX(); + fgValues.y = proptrack.getY(); + fgValues.z = proptrack.getZ(); + fgValues.eta = proptrack.getEta(); + fgValues.tgl = proptrack.getTgl(); + fgValues.phi = proptrack.getPhi(); + + fgValues.p = proptrack.getP(); + fgValues.px = proptrack.getPx(); + fgValues.py = proptrack.getPy(); + fgValues.pz = proptrack.getPz(); + + fgValues.chi2 = trackParam.getTrackChi2(); + fgValues.nClusters = muon.getNClusters(); + fgValues.sign = trackParam.getCharge(); + } + + template + void FillTrack(TTrack const& muon, Var& fgValues) + { + fgValues.collisionId = muon.collisionId(); + fgValues.globalIndex = muon.globalIndex(); + fgValues.trackTime = muon.trackTime(); + + fgValues.pT = muon.pt(); + fgValues.x = muon.x(); + fgValues.y = muon.y(); + fgValues.z = muon.z(); + fgValues.eta = muon.eta(); + fgValues.tgl = muon.tgl(); + fgValues.phi = muon.phi(); + + fgValues.p = muon.p(); + fgValues.px = muon.px(); + fgValues.py = muon.py(); + fgValues.pz = muon.pz(); + + fgValues.chi2 = muon.chi2(); + fgValues.nClusters = muon.nClusters(); + fgValues.sign = muon.sign(); + + if constexpr (static_cast(MuonFillMap)) { + // Direct info from AO2D without re-propagation + fgValues.pDca = muon.pDca(); + fgValues.rabs = muon.rAtAbsorberEnd(); + fgValues.trackType = muon.trackType(); + } + } + + template + bool FillClusters(TMCHTrack const& muon, TFwdCls const& mchcls, Var& fgValues, mch::Track& convertedTrack) + { + int removable = 0; + auto clustersSliced = mchcls.sliceBy(perMuon, muon.globalIndex()); // Slice clusters by muon id + vector> posClusters; + + int clIndex = -1; + // Get re-aligned clusters associated to current track + for (auto const& cluster : clustersSliced) { + clIndex += 1; + + math_utils::Point3D local; + math_utils::Point3D master; + + mch::Cluster* clusterMCH = new mch::Cluster(); + master.SetXYZ(cluster.x(), cluster.y(), cluster.z()); + + if (configRealign.fDoRealign) { + // Transformation from reference geometry frame to new geometry frame + transformRef[cluster.deId()].MasterToLocal(master, local); + transformNew[cluster.deId()].LocalToMaster(local, master); + } + + clusterMCH->x = master.x(); + clusterMCH->y = master.y(); + clusterMCH->z = master.z(); + + uint32_t ClUId = mch::Cluster::buildUniqueId(static_cast(cluster.deId() / 100) - 1, cluster.deId(), clIndex); + clusterMCH->uid = ClUId; + clusterMCH->ex = cluster.isGoodX() ? 0.2 : 10.0; + clusterMCH->ey = cluster.isGoodY() ? 0.2 : 10.0; + + // Fill temporary values + vector posCls = {clusterMCH->x, clusterMCH->y, clusterMCH->z}; + vector eCls = {clusterMCH->ex, clusterMCH->ey}; + posClusters.emplace_back(posCls); + fgValues.errorClusters.emplace_back(eCls); + fgValues.DEIDs.emplace_back(cluster.deId()); + + // Add transformed cluster into temporary variable + convertedTrack.createParamAtCluster(*clusterMCH); + } + + if (configRealign.fDoRealign) { + // Refit the re-aligned track + if (convertedTrack.getNClusters() != 0) { + removable = RemoveTrack(convertedTrack); + } else { + LOGF(fatal, "Muon track %d has no associated clusters.", muon.globalIndex()); + } + + for (auto it = convertedTrack.begin(); it != convertedTrack.end(); it++) { + vector pos = {static_cast(it->getNonBendingCoor()), static_cast(it->getBendingCoor()), static_cast(it->getZ())}; + fgValues.posClusters.emplace_back(pos); + } + + } else { + fgValues.posClusters = posClusters; + } + + return !removable; + } + + template + void FillMatchingCandidates(TMuon const& muon, TMCH const& mchtrack, TMap& matchingCandidates) + { + uint64_t muonId = muon.globalIndex(); + uint64_t mchId = mchtrack.globalIndex(); + + //// Save matching candidates index pairs + auto matchingCandidateIt = matchingCandidates.find(mchId); + if (matchingCandidateIt != matchingCandidates.end()) { + matchingCandidateIt->second.push_back(muonId); + } else { + matchingCandidates[mchId].push_back(muonId); + } + } + + template + void FillPropagation(mch::Track const& muon, VarC const& collision, VarT& fgValues, int endPoint = kToVtx, int endZ = 0) + { + o2::dataformats::GlobalFwdTrack propmuon; + mch::TrackParam trackParam = mch::TrackParam(muon.first()); + fgValues.chi2 = trackParam.getTrackChi2(); + fgValues.nClusters = muon.getNClusters(); + fgValues.sign = trackParam.getCharge(); + + if (endPoint == kToVtx) { + o2::mch::TrackExtrap::extrapToVertex(trackParam, collision.x, collision.y, collision.z, collision.covXX, collision.covYY); + } + if (endPoint == kToDCA) { + o2::mch::TrackExtrap::extrapToVertexWithoutBranson(trackParam, collision.z); + } + if (endPoint == kToAbsEnd) { + o2::mch::TrackExtrap::extrapToZ(trackParam, zAtAbsEnd); + } + if (endPoint == kToZ) { + o2::mch::TrackExtrap::extrapToZ(trackParam, endZ); + } + + auto proptrack = mMatching.MCHtoFwd(trackParam); + propmuon.setParameters(proptrack.getParameters()); + propmuon.setZ(proptrack.getZ()); + propmuon.setCovariances(proptrack.getCovariances()); + + //// Fill propagation informations + if (endPoint == kToVtx || endPoint == kToZ) { + fgValues.pT = propmuon.getPt(); + fgValues.x = propmuon.getX(); + fgValues.y = propmuon.getY(); + fgValues.z = propmuon.getZ(); + fgValues.eta = propmuon.getEta(); + fgValues.tgl = propmuon.getTgl(); + fgValues.phi = propmuon.getPhi(); + + fgValues.p = propmuon.getP(); + fgValues.px = propmuon.getP() * sin(M_PI / 2 - atan(propmuon.getTgl())) * cos(propmuon.getPhi()); + fgValues.py = propmuon.getP() * sin(M_PI / 2 - atan(propmuon.getTgl())) * sin(propmuon.getPhi()); + fgValues.pz = propmuon.getP() * cos(M_PI / 2 - atan(propmuon.getTgl())); + } + + if (endPoint == kToDCA) { + fgValues.dcaX = (propmuon.getX() - collision.x); + fgValues.dcaY = (propmuon.getY() - collision.y); + float dcaXY = std::sqrt(fgValues.dcaX * fgValues.dcaX + fgValues.dcaY * fgValues.dcaY); + + mch::TrackParam trackParam = mch::TrackParam(muon.first()); + float p = trackParam.p(); + fgValues.pDca = p * dcaXY; + } + + if (endPoint == kToAbsEnd) { + double xAbs = propmuon.getX(); + double yAbs = propmuon.getY(); + fgValues.rabs = std::sqrt(xAbs * xAbs + yAbs * yAbs); + } + } + + template + void FillPropagation(TTrack const& muon, VarC const& collision, VarT const& fgValuesMCH, VarT& fgValues, int endPoint = kToVtx, int endZ = 0) + { + o2::dataformats::GlobalFwdTrack propmuon; + double chi2 = muon.chi2(); + fgValues.chi2 = chi2; + fgValues.nClusters = muon.nClusters(); + fgValues.sign = muon.sign(); + + if constexpr (static_cast(MuonFillMap)) { + o2::dataformats::GlobalFwdTrack track; + + SMatrix5 tpars(muon.x(), muon.y(), muon.phi(), muon.tgl(), muon.signed1Pt()); + std::vector v1{muon.cXX(), muon.cXY(), muon.cYY(), muon.cPhiX(), muon.cPhiY(), + muon.cPhiPhi(), muon.cTglX(), muon.cTglY(), muon.cTglPhi(), muon.cTglTgl(), + muon.c1PtX(), muon.c1PtY(), muon.c1PtPhi(), muon.c1PtTgl(), muon.c1Pt21Pt2()}; + SMatrix55 tcovs(v1.begin(), v1.end()); + o2::track::TrackParCovFwd fwdtrack{muon.z(), tpars, tcovs, chi2}; + + track.setParameters(tpars); + track.setZ(fwdtrack.getZ()); + track.setCovariances(tcovs); + auto mchTrack = mMatching.FwdtoMCH(track); + + if (endPoint == kToVtx) { + o2::mch::TrackExtrap::extrapToVertex(mchTrack, collision.x, collision.y, collision.z, collision.covXX, collision.covYY); + } + if (endPoint == kToDCA) { + o2::mch::TrackExtrap::extrapToVertexWithoutBranson(mchTrack, collision.z); + } + if (endPoint == kToAbsEnd) { + o2::mch::TrackExtrap::extrapToZ(mchTrack, zAtAbsEnd); + } + if (endPoint == kToZ) { + o2::mch::TrackExtrap::extrapToZ(mchTrack, endZ); + } + + auto proptrack = mMatching.MCHtoFwd(mchTrack); + propmuon.setParameters(proptrack.getParameters()); + propmuon.setZ(proptrack.getZ()); + propmuon.setCovariances(proptrack.getCovariances()); + + } else { + + o2::dataformats::GlobalFwdTrack track; + + if constexpr (static_cast(Scaled)) { + double pMCH = fgValuesMCH.p; + int sign = fgValuesMCH.sign; + + double px = pMCH * sin(M_PI / 2 - atan(muon.tgl())) * cos(muon.phi()); + double py = pMCH * sin(M_PI / 2 - atan(muon.tgl())) * sin(muon.phi()); + // double pz = pMCH * cos(M_PI / 2 - atan(mft.tgl())); + double pt = std::sqrt(std::pow(px, 2) + std::pow(py, 2)); + + double chi2 = muon.chi2(); + double signed1Pt = endPoint == kToDCA ? muon.signed1Pt() : sign / pt; + SMatrix5 tpars(muon.x(), muon.y(), muon.phi(), muon.tgl(), signed1Pt); + std::vector v1{0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0}; + SMatrix55 tcovs(v1.begin(), v1.end()); + o2::track::TrackParCovFwd fwdtrack{muon.z(), tpars, tcovs, chi2}; + track.setParameters(tpars); + track.setZ(fwdtrack.getZ()); + track.setCovariances(tcovs); + } else { + SMatrix5 tpars(muon.x(), muon.y(), muon.phi(), muon.tgl(), muon.signed1Pt()); + std::vector v1{muon.cXX(), muon.cXY(), muon.cYY(), muon.cPhiX(), muon.cPhiY(), + muon.cPhiPhi(), muon.cTglX(), muon.cTglY(), muon.cTglPhi(), muon.cTglTgl(), + muon.c1PtX(), muon.c1PtY(), muon.c1PtPhi(), muon.c1PtTgl(), muon.c1Pt21Pt2()}; + SMatrix55 tcovs(v1.begin(), v1.end()); + o2::track::TrackParCovFwd fwdtrack{muon.z(), tpars, tcovs, chi2}; + track.setParameters(tpars); + track.setZ(fwdtrack.getZ()); + track.setCovariances(tcovs); + } + + if (endPoint == kToVtx) { + if (fEnableMFTAlignmentCorrections) { + TransformMFT<0>(track); + } + auto geoMan = o2::base::GeometryManager::meanMaterialBudget(muon.x(), muon.y(), muon.z(), collision.x, collision.y, collision.z); + auto x2x0 = static_cast(geoMan.meanX2X0); + track.propagateToVtxhelixWithMCS(collision.z, {collision.x, collision.y}, {collision.covXX, collision.covYY}, Bz, x2x0); + } + if (endPoint == kToDCA) { + if (fEnableMFTAlignmentCorrections) { + TransformMFT<0>(track); + } + track.propagateToZ(collision.z, Bz); + } + if (endPoint == kToZ) { + auto mchTrackExt = mMatching.FwdtoMCH(track); + if (fEnableMFTAlignmentCorrections) { + doTransformMFT(mchTrackExt); + } + o2::mch::TrackExtrap::extrapToZ(mchTrackExt, endZ); + track = mMatching.MCHtoFwd(mchTrackExt); + } + + propmuon.setParameters(track.getParameters()); + propmuon.setZ(track.getZ()); + propmuon.setCovariances(track.getCovariances()); + } + + //// Fill propagation informations + if (endPoint == kToVtx || endPoint == kToZ) { + fgValues.pT = propmuon.getPt(); + fgValues.x = propmuon.getX(); + fgValues.y = propmuon.getY(); + fgValues.z = propmuon.getZ(); + fgValues.eta = propmuon.getEta(); + fgValues.tgl = propmuon.getTgl(); + fgValues.phi = propmuon.getPhi(); + + fgValues.p = propmuon.getP(); + fgValues.px = propmuon.getP() * sin(M_PI / 2 - atan(propmuon.getTgl())) * cos(propmuon.getPhi()); + fgValues.py = propmuon.getP() * sin(M_PI / 2 - atan(propmuon.getTgl())) * sin(propmuon.getPhi()); + fgValues.pz = propmuon.getP() * cos(M_PI / 2 - atan(propmuon.getTgl())); + } + + if (endPoint == kToDCA) { + fgValues.dcaX = (propmuon.getX() - collision.x); + fgValues.dcaY = (propmuon.getY() - collision.y); + float dcaXY = std::sqrt(fgValues.dcaX * fgValues.dcaX + fgValues.dcaY * fgValues.dcaY); + + if constexpr (static_cast(MuonFillMap)) { + float p = muon.p(); + fgValues.pDca = p * dcaXY; + } + } + + if (endPoint == kToAbsEnd) { + double xAbs = propmuon.getX(); + double yAbs = propmuon.getY(); + fgValues.rabs = std::sqrt(xAbs * xAbs + yAbs * yAbs); + } + } + + template + void FillMatching(TTrack const& track, Var& fgValuesMCH, Var& fgValuesMFT) + { + fgValuesMCH.chi2matching = track.chi2MatchMCHMID(); + fgValuesMFT.chi2matching = track.chi2MatchMCHMFT(); + } + + template + void FillMuonHistograms(Var const& fgValuesMCH, Var const& fgValuesMCHpv, Var const& fgValuesMFT, Var const& fgValuesGlobal, VarVector const& fgValuesCandidates) + { + if constexpr (static_cast(MuonFillMap)) { + // Muon histograms + if (IsGoodMuon(fgValuesMCH, fgValuesMCHpv, 1.E10, configMuons.fPMchLow, configMuons.fPtMchLow, configMuons.fEtaMchLow, configMuons.fEtaMchUp, configMuons.fRabsLow, configMuons.fRabsUp, configMuons.fSigmaPdcaUp)) { + registry.get(HIST("muons/TrackChi2"))->Fill(fgValuesMCH.chi2); + } + if (IsGoodMuon(fgValuesMCH, fgValuesMCHpv, configMuons.fTrackChi2MchUp, 0., configMuons.fPtMchLow, configMuons.fEtaMchLow, configMuons.fEtaMchUp, configMuons.fRabsLow, configMuons.fRabsUp, configMuons.fSigmaPdcaUp)) { + registry.get(HIST("muons/TrackP"))->Fill(fgValuesMCH.p); + } + if (IsGoodMuon(fgValuesMCH, fgValuesMCHpv, configMuons.fTrackChi2MchUp, configMuons.fPMchLow, 0., configMuons.fEtaMchLow, configMuons.fEtaMchUp, configMuons.fRabsLow, configMuons.fRabsUp, configMuons.fSigmaPdcaUp)) { + registry.get(HIST("muons/TrackPt"))->Fill(fgValuesMCH.pT); + } + if (IsGoodMuon(fgValuesMCH, fgValuesMCHpv, configMuons.fTrackChi2MchUp, configMuons.fPMchLow, configMuons.fPtMchLow, -1.E10, 1.E10, configMuons.fRabsLow, configMuons.fRabsUp, configMuons.fSigmaPdcaUp)) { + registry.get(HIST("muons/TrackEta"))->Fill(fgValuesMCH.eta); + } + if (IsGoodMuon(fgValuesMCH, fgValuesMCHpv, configMuons.fTrackChi2MchUp, configMuons.fPMchLow, configMuons.fPtMchLow, configMuons.fEtaMchLow, configMuons.fEtaMchUp, 0., 1.E10, configMuons.fSigmaPdcaUp)) { + registry.get(HIST("muons/TrackRabs"))->Fill(fgValuesMCH.rabs); + } + if (IsGoodMuon(fgValuesMCH, fgValuesMCHpv, configMuons.fTrackChi2MchUp, configMuons.fPMchLow, configMuons.fPtMchLow, configMuons.fEtaMchLow, configMuons.fEtaMchUp, configMuons.fRabsLow, configMuons.fRabsUp, 1.E10)) { + registry.get(HIST("muons/TrackPDCA"))->Fill(fgValuesMCH.pDca); + } + if (IsGoodMuon(fgValuesMCH, fgValuesMCHpv, configMuons.fTrackChi2MchUp, configMuons.fPMchLow, configMuons.fPtMchLow, configMuons.fEtaMchLow, configMuons.fEtaMchUp, configMuons.fRabsLow, configMuons.fRabsUp, configMuons.fSigmaPdcaUp)) { + registry.get(HIST("muons/TrackPhi"))->Fill(fgValuesMCH.phi * 180.0 / TMath::Pi()); + registry.get(HIST("muons/TrackDCA"))->Fill(std::sqrt(fgValuesMCH.dcaX * fgValuesMCH.dcaX + fgValuesMCH.dcaY * fgValuesMCH.dcaY)); + } + } + + if constexpr (static_cast(GlobalMuonFillMap)) { + // Global muon histograms + if (IsGoodMuon(fgValuesMCH, fgValuesMCHpv, 1.E10, configMuons.fPMchLow, configMuons.fPtMchLow, configMFTs.fEtaMftLow, configMFTs.fEtaMftUp, configMuons.fRabsLow, configMuons.fRabsUp, configMuons.fSigmaPdcaUp)) { + registry.get(HIST("global-muons/TrackChi2"))->Fill(fgValuesMCH.chi2); + } + if (IsGoodMuon(fgValuesMCH, fgValuesMCHpv, configMuons.fTrackChi2MchUp, 0., configMuons.fPtMchLow, configMFTs.fEtaMftLow, configMFTs.fEtaMftUp, configMuons.fRabsLow, configMuons.fRabsUp, configMuons.fSigmaPdcaUp)) { + registry.get(HIST("global-muons/TrackP"))->Fill(fgValuesMCH.p); + + // Momentum correlations + registry.get(HIST("global-muons/MomentumCorrelation_Global_vs_Muon"))->Fill(fgValuesMCH.p, fgValuesGlobal.p); + if (fgValuesMCH.p != 0) { + registry.get(HIST("global-muons/MomentumDifference_Global_vs_Muon"))->Fill(fgValuesMCH.p, (fgValuesGlobal.p - fgValuesMCH.p) / fgValuesMCH.p); + } + + if (fgValuesCandidates.size() >= 2) { + registry.get(HIST("global-muons/MomentumCorrelation_subleading_vs_leading"))->Fill(fgValuesCandidates[0].p, fgValuesCandidates[1].p); + if (fgValuesCandidates[0].p != 0) { + registry.get(HIST("global-muons/MomentumDifference_subleading_vs_leading"))->Fill(fgValuesCandidates[0].p, (fgValuesCandidates[1].p - fgValuesCandidates[0].p) / fgValuesCandidates[0].p); + } + } + } + if (IsGoodMuon(fgValuesMCH, fgValuesMCHpv, configMuons.fTrackChi2MchUp, configMuons.fPMchLow, 0., configMFTs.fEtaMftLow, configMFTs.fEtaMftUp, configMuons.fRabsLow, configMuons.fRabsUp, configMuons.fSigmaPdcaUp)) { + registry.get(HIST("global-muons/TrackPt"))->Fill(fgValuesMCH.pT); + } + if (IsGoodMuon(fgValuesMCH, fgValuesMCHpv, configMuons.fTrackChi2MchUp, configMuons.fPMchLow, configMuons.fPtMchLow, -1.E10, 1.E10, configMuons.fRabsLow, configMuons.fRabsUp, configMuons.fSigmaPdcaUp)) { + registry.get(HIST("global-muons/TrackEta"))->Fill(fgValuesMCH.eta); + + // Eta correlations + registry.get(HIST("global-muons/EtaCorrelation_Global_vs_Muon"))->Fill(fgValuesMCH.eta, fgValuesGlobal.eta); + if (fgValuesMCH.eta != 0) { + registry.get(HIST("global-muons/EtaDifference_Global_vs_Muon"))->Fill(fgValuesMCH.eta, (fgValuesGlobal.eta - fgValuesMCH.eta) / fgValuesMCH.eta); + } + + if (fgValuesCandidates.size() >= 2) { + registry.get(HIST("global-muons/EtaCorrelation_subleading_vs_leading"))->Fill(fgValuesCandidates[0].eta, fgValuesCandidates[1].eta); + if (fgValuesCandidates[0].eta != 0) { + registry.get(HIST("global-muons/EtaDifference_subleading_vs_leading"))->Fill(fgValuesCandidates[0].eta, (fgValuesCandidates[1].eta - fgValuesCandidates[0].eta) / fgValuesCandidates[0].eta); + } + } + } + if (IsGoodMuon(fgValuesMCH, fgValuesMCHpv, configMuons.fTrackChi2MchUp, configMuons.fPMchLow, configMuons.fPtMchLow, configMFTs.fEtaMftLow, configMFTs.fEtaMftUp, 0., 1.E10, configMuons.fSigmaPdcaUp)) { + registry.get(HIST("global-muons/TrackRabs"))->Fill(fgValuesMCH.rabs); + } + if (IsGoodMuon(fgValuesMCH, fgValuesMCHpv, configMuons.fTrackChi2MchUp, configMuons.fPMchLow, configMuons.fPtMchLow, configMFTs.fEtaMftLow, configMFTs.fEtaMftUp, configMuons.fRabsLow, configMuons.fRabsUp, 1.E10)) { + registry.get(HIST("global-muons/TrackPDCA"))->Fill(fgValuesMCH.pDca); + } + if (IsGoodMuon(fgValuesMCH, fgValuesMCHpv, configMuons.fTrackChi2MchUp, configMuons.fPMchLow, configMuons.fPtMchLow, configMFTs.fEtaMftLow, configMFTs.fEtaMftUp, configMuons.fRabsLow, configMuons.fRabsUp, configMuons.fSigmaPdcaUp)) { + registry.get(HIST("global-muons/TrackPhi"))->Fill(fgValuesMCH.phi * 180.0 / TMath::Pi()); + registry.get(HIST("global-muons/TrackDCA"))->Fill(std::sqrt(fgValuesMCH.dcaX * fgValuesMCH.dcaX + fgValuesMCH.dcaY * fgValuesMCH.dcaY)); + } + } + + if constexpr (static_cast(GlobalMatchingFillMap)) { + // Global muon histograms + if (IsGoodMuon(fgValuesMCH, fgValuesMCHpv, 1.E10, configMuons.fPMchLow, configMuons.fPtMchLow, configMFTs.fEtaMftLow, configMFTs.fEtaMftUp, configMuons.fRabsLow, configMuons.fRabsUp, configMuons.fSigmaPdcaUp)) { + if (IsGoodGlobalMatching(fgValuesMFT, configMFTs.fTrackChi2MftUp, configMFTs.fTrackNClustMftLow, fMatchingChi2MftMchUp)) { + registry.get(HIST("global-matches/TrackChi2"))->Fill(fgValuesMCH.chi2); + } + } + if (IsGoodMuon(fgValuesMCH, fgValuesMCHpv, configMuons.fTrackChi2MchUp, 0., configMuons.fPtMchLow, configMFTs.fEtaMftLow, configMFTs.fEtaMftUp, configMuons.fRabsLow, configMuons.fRabsUp, configMuons.fSigmaPdcaUp)) { + if (IsGoodGlobalMatching(fgValuesMFT, configMFTs.fTrackChi2MftUp, configMFTs.fTrackNClustMftLow, fMatchingChi2MftMchUp)) { + registry.get(HIST("global-matches/TrackP"))->Fill(fgValuesMCH.p); + } + } + if (IsGoodMuon(fgValuesMCH, fgValuesMCHpv, configMuons.fTrackChi2MchUp, configMuons.fPMchLow, 0., configMFTs.fEtaMftLow, configMFTs.fEtaMftUp, configMuons.fRabsLow, configMuons.fRabsUp, configMuons.fSigmaPdcaUp)) { + if (IsGoodGlobalMatching(fgValuesMFT, configMFTs.fTrackChi2MftUp, configMFTs.fTrackNClustMftLow, fMatchingChi2MftMchUp)) { + registry.get(HIST("global-matches/TrackPt"))->Fill(fgValuesMCH.pT); + } + } + if (IsGoodMuon(fgValuesMCH, fgValuesMCHpv, configMuons.fTrackChi2MchUp, configMuons.fPMchLow, configMuons.fPtMchLow, -1.E10, 1.E10, configMuons.fRabsLow, configMuons.fRabsUp, configMuons.fSigmaPdcaUp)) { + if (IsGoodGlobalMatching(fgValuesMFT, configMFTs.fTrackChi2MftUp, configMFTs.fTrackNClustMftLow, fMatchingChi2MftMchUp)) { + registry.get(HIST("global-matches/TrackEta"))->Fill(fgValuesMCH.eta); + } + } + if (IsGoodMuon(fgValuesMCH, fgValuesMCHpv, configMuons.fTrackChi2MchUp, configMuons.fPMchLow, configMuons.fPtMchLow, configMFTs.fEtaMftLow, configMFTs.fEtaMftUp, 0., 1.E10, configMuons.fSigmaPdcaUp)) { + if (IsGoodGlobalMatching(fgValuesMFT, configMFTs.fTrackChi2MftUp, configMFTs.fTrackNClustMftLow, fMatchingChi2MftMchUp)) { + registry.get(HIST("global-matches/TrackRabs"))->Fill(fgValuesMCH.rabs); + } + } + if (IsGoodMuon(fgValuesMCH, fgValuesMCHpv, configMuons.fTrackChi2MchUp, configMuons.fPMchLow, configMuons.fPtMchLow, configMFTs.fEtaMftLow, configMFTs.fEtaMftUp, configMuons.fRabsLow, configMuons.fRabsUp, 1.E10)) { + if (IsGoodGlobalMatching(fgValuesMFT, configMFTs.fTrackChi2MftUp, configMFTs.fTrackNClustMftLow, fMatchingChi2MftMchUp)) { + registry.get(HIST("global-matches/TrackPDCA"))->Fill(fgValuesMCH.pDca); + } + } + if (IsGoodMuon(fgValuesMCH, fgValuesMCHpv, configMuons.fTrackChi2MchUp, configMuons.fPMchLow, configMuons.fPtMchLow, configMFTs.fEtaMftLow, configMFTs.fEtaMftUp, configMuons.fRabsLow, configMuons.fRabsUp, configMuons.fSigmaPdcaUp)) { + if (IsGoodGlobalMatching(fgValuesMFT, configMFTs.fTrackChi2MftUp, configMFTs.fTrackNClustMftLow, fMatchingChi2MftMchUp)) { + registry.get(HIST("global-matches/TrackPhi"))->Fill(fgValuesMCH.phi * 180.0 / TMath::Pi()); + registry.get(HIST("global-matches/TrackDCA"))->Fill(std::sqrt(fgValuesMCH.dcaX * fgValuesMCH.dcaX + fgValuesMCH.dcaY * fgValuesMCH.dcaY)); + + registry.get(HIST("global-matches/TrackP_glo"))->Fill(fgValuesGlobal.p); + registry.get(HIST("global-matches/TrackPt_glo"))->Fill(fgValuesGlobal.pT); + registry.get(HIST("global-matches/TrackEta_glo"))->Fill(fgValuesGlobal.eta); + registry.get(HIST("global-matches/TrackPhi_glo"))->Fill(fgValuesGlobal.phi * 180.0 / TMath::Pi()); + registry.get(HIST("global-matches/TrackDCA_glo"))->Fill(std::sqrt(fgValuesGlobal.dcaX * fgValuesGlobal.dcaX + fgValuesGlobal.dcaY * fgValuesGlobal.dcaY)); + } + if (IsGoodGlobalMatching(fgValuesMFT, 1.E10, configMFTs.fTrackNClustMftLow, fMatchingChi2MftMchUp)) { + registry.get(HIST("global-matches/TrackChi2_MFT"))->Fill(fgValuesMFT.chi2); + } + if (IsGoodGlobalMatching(fgValuesMFT, configMFTs.fTrackChi2MftUp, 0, fMatchingChi2MftMchUp)) { + registry.get(HIST("global-matches/TrackNclusters_MFT"))->Fill(fgValuesMFT.nClusters); + } + if (IsGoodGlobalMatching(fgValuesMFT, configMFTs.fTrackChi2MftUp, configMFTs.fTrackNClustMftLow, 1.E10)) { + registry.get(HIST("global-matches/MatchChi2"))->Fill(fgValuesMFT.chi2matching); + } + } + } + } + + template + void FillTrackResidualHistograms(VarVector const& fgVectorsMCH, VarVector const& fgVectorsMFT, int quadrant, bool same, bool mixed) + { + std::vector> xPos; + std::vector> yPos; + std::vector> thetax; + std::vector> thetay; + for (int zi = 0; zi < int(zRefPlane.size()); zi++) { + xPos.emplace_back(std::array{fgVectorsMCH[zi].x, fgVectorsMFT[zi].x}); + yPos.emplace_back(std::array{fgVectorsMCH[zi].y, fgVectorsMFT[zi].y}); + thetax.emplace_back(std::array{ + std::atan2(fgVectorsMCH[zi].px, -1.0 * fgVectorsMCH[zi].pz) * 180 / TMath::Pi(), + std::atan2(fgVectorsMFT[zi].px, -1.0 * fgVectorsMFT[zi].pz) * 180 / TMath::Pi()}); + thetay.emplace_back(std::array{ + std::atan2(fgVectorsMCH[zi].py, -1.0 * fgVectorsMCH[zi].pz) * 180 / TMath::Pi(), + std::atan2(fgVectorsMFT[zi].py, -1.0 * fgVectorsMFT[zi].pz) * 180 / TMath::Pi()}); + } + + for (int i = 0; i < int(zRefPlane.size()); i++) { + if (same) { + std::get>(trackResidualsHistos[i][quadrant]["dx_vs_x"])->Fill(std::fabs(xPos[i][1]), xPos[i][0] - xPos[i][1]); + std::get>(trackResidualsHistos[i][quadrant]["dx_vs_y"])->Fill(std::fabs(yPos[i][1]), xPos[i][0] - xPos[i][1]); + std::get>(trackResidualsHistos[i][quadrant]["dy_vs_x"])->Fill(std::fabs(xPos[i][1]), yPos[i][0] - yPos[i][1]); + std::get>(trackResidualsHistos[i][quadrant]["dy_vs_y"])->Fill(std::fabs(yPos[i][1]), yPos[i][0] - yPos[i][1]); + + std::get>(trackResidualsHistos[i][quadrant]["dthetax_vs_x"])->Fill(std::fabs(xPos[i][1]), thetax[i][0] - thetax[i][1]); + std::get>(trackResidualsHistos[i][quadrant]["dthetax_vs_y"])->Fill(std::fabs(yPos[i][1]), thetax[i][0] - thetax[i][1]); + std::get>(trackResidualsHistos[i][quadrant]["dthetax_vs_thetax"])->Fill(std::fabs(thetax[i][1]), thetax[i][0] - thetax[i][1]); + std::get>(trackResidualsHistos[i][quadrant]["dthetay_vs_x"])->Fill(std::fabs(xPos[i][1]), thetay[i][0] - thetay[i][1]); + std::get>(trackResidualsHistos[i][quadrant]["dthetay_vs_y"])->Fill(std::fabs(yPos[i][1]), thetay[i][0] - thetay[i][1]); + std::get>(trackResidualsHistos[i][quadrant]["dthetay_vs_thetay"])->Fill(std::fabs(thetay[i][1]), thetay[i][0] - thetay[i][1]); + } + if (mixed) { + std::get>(trackResidualsHistosMixedEvents[i][quadrant]["dx_vs_x"])->Fill(std::fabs(xPos[i][1]), xPos[i][0] - xPos[i][1]); + std::get>(trackResidualsHistosMixedEvents[i][quadrant]["dx_vs_y"])->Fill(std::fabs(yPos[i][1]), xPos[i][0] - xPos[i][1]); + std::get>(trackResidualsHistosMixedEvents[i][quadrant]["dy_vs_x"])->Fill(std::fabs(xPos[i][1]), yPos[i][0] - yPos[i][1]); + std::get>(trackResidualsHistosMixedEvents[i][quadrant]["dy_vs_y"])->Fill(std::fabs(yPos[i][1]), yPos[i][0] - yPos[i][1]); + + std::get>(trackResidualsHistosMixedEvents[i][quadrant]["dthetax_vs_x"])->Fill(std::fabs(xPos[i][1]), thetax[i][0] - thetax[i][1]); + std::get>(trackResidualsHistosMixedEvents[i][quadrant]["dthetax_vs_y"])->Fill(std::fabs(yPos[i][1]), thetax[i][0] - thetax[i][1]); + std::get>(trackResidualsHistosMixedEvents[i][quadrant]["dthetax_vs_thetax"])->Fill(std::fabs(thetax[i][1]), thetax[i][0] - thetax[i][1]); + std::get>(trackResidualsHistosMixedEvents[i][quadrant]["dthetay_vs_x"])->Fill(std::fabs(xPos[i][1]), thetay[i][0] - thetay[i][1]); + std::get>(trackResidualsHistosMixedEvents[i][quadrant]["dthetay_vs_y"])->Fill(std::fabs(yPos[i][1]), thetay[i][0] - thetay[i][1]); + std::get>(trackResidualsHistosMixedEvents[i][quadrant]["dthetay_vs_thetay"])->Fill(std::fabs(thetay[i][1]), thetay[i][0] - thetay[i][1]); + } + } + } + + template + void FillDCAHistograms(VarT const& fgValues, VarC const& fgValuesColl, int sign, int quadrant, bool same, bool mixed) + { + if constexpr (static_cast(MuonFillMap)) { + if (same) { + std::get>(dcaHistos[1][quadrant][0]["DCA_x"])->Fill(fgValues.dcaX); + std::get>(dcaHistos[1][quadrant][0]["DCA_y"])->Fill(fgValues.dcaY); + std::get>(dcaHistos[1][quadrant][sign]["DCA_x"])->Fill(fgValues.dcaX); + std::get>(dcaHistos[1][quadrant][sign]["DCA_y"])->Fill(fgValues.dcaY); + } + if (mixed) { + std::get>(dcaHistosMixedEvents[1][quadrant][0]["DCA_x"])->Fill(fgValues.dcaX); + std::get>(dcaHistosMixedEvents[1][quadrant][0]["DCA_y"])->Fill(fgValues.dcaY); + std::get>(dcaHistosMixedEvents[1][quadrant][sign]["DCA_x"])->Fill(fgValues.dcaX); + std::get>(dcaHistosMixedEvents[1][quadrant][sign]["DCA_y"])->Fill(fgValues.dcaY); + } + } + + if constexpr (static_cast(GlobalMuonFillMap)) { + if (same) { + std::get>(dcaHistos[0][quadrant][0]["DCA_x"])->Fill(fgValues.dcaX); + std::get>(dcaHistos[0][quadrant][0]["DCA_y"])->Fill(fgValues.dcaY); + std::get>(dcaHistos[0][quadrant][sign]["DCA_x"])->Fill(fgValues.dcaX); + std::get>(dcaHistos[0][quadrant][sign]["DCA_y"])->Fill(fgValues.dcaY); + std::get>(dcaHistos[0][quadrant][0]["DCA_x_vs_z"])->Fill(fgValuesColl.z, fgValues.dcaX); + std::get>(dcaHistos[0][quadrant][0]["DCA_y_vs_z"])->Fill(fgValuesColl.z, fgValues.dcaY); + } + + if (mixed) { + std::get>(dcaHistosMixedEvents[0][quadrant][0]["DCA_x"])->Fill(fgValues.dcaX); + std::get>(dcaHistosMixedEvents[0][quadrant][0]["DCA_y"])->Fill(fgValues.dcaY); + std::get>(dcaHistosMixedEvents[0][quadrant][sign]["DCA_x"])->Fill(fgValues.dcaX); + std::get>(dcaHistosMixedEvents[0][quadrant][sign]["DCA_y"])->Fill(fgValues.dcaY); + std::get>(dcaHistosMixedEvents[0][quadrant][0]["DCA_x_vs_z"])->Fill(fgValuesColl.z, fgValues.dcaX); + std::get>(dcaHistosMixedEvents[0][quadrant][0]["DCA_y_vs_z"])->Fill(fgValuesColl.z, fgValues.dcaY); + } + } + } + + template + void FillResidualHistograms(Var const& fgValuesProp, Var const& fgValuesMCH, Var const& fgValuesMCHpv, Var const& fgValuesMFT, float xCls, float yCls, int topBottom, int posNeg, int quadrant, int chamber, int deIndex, bool same, bool mixed) + { + std::array xPos{xCls, fgValuesProp.x}; + std::array yPos{yCls, fgValuesProp.y}; + double phiClus = std::atan2(yCls, xCls) * 180 / TMath::Pi(); + + if constexpr (static_cast(MuonFillMap)) { + if (IsGoodMuon(fgValuesMCH, fgValuesMCHpv, configMuons.fTrackChi2MchUp, 20., configMuons.fPtMchLow, configMFTs.fEtaMftLow, configMFTs.fEtaMftUp, configMuons.fRabsLow, configMuons.fRabsUp, configMuons.fSigmaPdcaUp)) { + if (same) { + std::get>(mchResidualsHistosPerDE[topBottom][posNeg][chamber]["dx_vs_de"])->Fill(deIndex, xPos[0] - xPos[1]); + std::get>(mchResidualsHistosPerDE[topBottom][posNeg][chamber]["dy_vs_de"])->Fill(deIndex, yPos[0] - yPos[1]); + } + if (mixed) { + std::get>(mchResidualsHistosPerDEMixedEvents[topBottom][posNeg][chamber]["dx_vs_de"])->Fill(deIndex, xPos[0] - xPos[1]); + std::get>(mchResidualsHistosPerDEMixedEvents[topBottom][posNeg][chamber]["dy_vs_de"])->Fill(deIndex, yPos[0] - yPos[1]); + } + } + } + + if constexpr (static_cast(MFTFillMap)) { + if (IsGoodMuon(fgValuesMCH, fgValuesMCHpv, configMuons.fTrackChi2MchUp, 20., configMuons.fPtMchLow, configMFTs.fEtaMftLow, configMFTs.fEtaMftUp, configMuons.fRabsLow, configMuons.fRabsUp, configMuons.fSigmaPdcaUp)) { + if (IsGoodMFT(fgValuesMFT, configMFTs.fTrackChi2MftUp, configMFTs.fTrackNClustMftLow)) { + if (same) { + std::get>(residualsHistos[quadrant][chamber]["dx_vs_x"])->Fill(std::fabs(xPos[1]), xPos[0] - xPos[1]); + std::get>(residualsHistos[quadrant][chamber]["dx_vs_y"])->Fill(std::fabs(yPos[1]), xPos[0] - xPos[1]); + std::get>(residualsHistos[quadrant][chamber]["dy_vs_x"])->Fill(std::fabs(xPos[1]), yPos[0] - yPos[1]); + std::get>(residualsHistos[quadrant][chamber]["dy_vs_y"])->Fill(std::fabs(yPos[1]), yPos[0] - yPos[1]); + + // residuals vs. DE index + std::get>(residualsHistosPerDE[topBottom][posNeg][chamber]["dx_vs_de"])->Fill(deIndex, xPos[0] - xPos[1]); + std::get>(residualsHistosPerDE[topBottom][posNeg][chamber]["dy_vs_de"])->Fill(deIndex, yPos[0] - yPos[1]); + + // residuals vs. cluster phi + std::get>(residualsHistosPerDE[topBottom][posNeg][chamber]["dx_vs_phi"])->Fill(phiClus, xPos[0] - xPos[1]); + std::get>(residualsHistosPerDE[topBottom][posNeg][chamber]["dy_vs_phi"])->Fill(phiClus, yPos[0] - yPos[1]); + } + if (mixed) { + std::get>(residualsHistosMixedEvents[quadrant][chamber]["dx_vs_x"])->Fill(std::fabs(xPos[1]), xPos[0] - xPos[1]); + std::get>(residualsHistosMixedEvents[quadrant][chamber]["dx_vs_y"])->Fill(std::fabs(yPos[1]), xPos[0] - xPos[1]); + std::get>(residualsHistosMixedEvents[quadrant][chamber]["dy_vs_x"])->Fill(std::fabs(xPos[1]), yPos[0] - yPos[1]); + std::get>(residualsHistosMixedEvents[quadrant][chamber]["dy_vs_y"])->Fill(std::fabs(yPos[1]), yPos[0] - yPos[1]); + + // residuals vs. DE index + std::get>(residualsHistosPerDEMixedEvents[topBottom][posNeg][chamber]["dx_vs_de"])->Fill(deIndex, xPos[0] - xPos[1]); + std::get>(residualsHistosPerDEMixedEvents[topBottom][posNeg][chamber]["dy_vs_de"])->Fill(deIndex, yPos[0] - yPos[1]); + + // residuals vs. cluster phi + std::get>(residualsHistosPerDEMixedEvents[topBottom][posNeg][chamber]["dx_vs_phi"])->Fill(phiClus, xPos[0] - xPos[1]); + std::get>(residualsHistosPerDEMixedEvents[topBottom][posNeg][chamber]["dy_vs_phi"])->Fill(phiClus, yPos[0] - yPos[1]); + } + } + } + } + } + + template + void resetVar(Var& fgValues) + { + fgValues = {}; + } + + void initCCDB(aod::BCsWithTimestamps const& bcs) + { + // Update CCDB informations + if (bcs.size() > 0 && fCurrentRun != bcs.begin().runNumber()) { + // Load magnetic field information from CCDB/local + ccdb->setCreatedNotAfter(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); + grpmag = ccdb->getForTimeStamp(configCCDB.grpmagPath, bcs.begin().timestamp()); + if (grpmag != nullptr) { + base::Propagator::initFieldFromGRP(grpmag); + TrackExtrap::setField(); + TrackExtrap::useExtrapV2(); + fieldB = static_cast(TGeoGlobalMagField::Instance()->GetField()); // for MFT + double centerMFT[3] = {0, 0, -61.4}; // or use middle point between Vtx and MFT? + Bz = fieldB->getBz(centerMFT); // Get field at centre of MFT + } else { + LOGF(fatal, "GRP object is not available in CCDB at timestamp=%llu", bcs.begin().timestamp()); + } + + // Load geometry information from CCDB/local + LOGF(info, "Loading reference aligned geometry from CCDB no later than %d", configCCDB.nolaterthan.value); + ccdb->setCreatedNotAfter(configCCDB.nolaterthan); // this timestamp has to be consistent with what has been used in reco + geoRef = ccdb->getForTimeStamp(configCCDB.geoPath, bcs.begin().timestamp()); + ccdb->clearCache(configCCDB.geoPath); + if (geoRef != nullptr) { + transformation = geo::transformationFromTGeoManager(*geoRef); + } else { + LOGF(fatal, "Reference aligned geometry object is not available in CCDB at timestamp=%llu", bcs.begin().timestamp()); + } + for (int i = 0; i < 156; i++) { + int iDEN = GetDetElemId(i); + transformRef[iDEN] = transformation(iDEN); + } + + if (configRealign.fDoRealign) { + LOGF(info, "Loading new aligned geometry from CCDB no later than %d", configCCDB.nolaterthanRealign.value); + ccdb->setCreatedNotAfter(configCCDB.nolaterthanRealign); // make sure this timestamp can be resolved regarding the reference one + geoNew = ccdb->getForTimeStamp(configCCDB.geoPathRealign, bcs.begin().timestamp()); + ccdb->clearCache(configCCDB.geoPathRealign); + if (geoNew != nullptr) { + transformation = geo::transformationFromTGeoManager(*geoNew); + } else { + LOGF(fatal, "New aligned geometry object is not available in CCDB at timestamp=%llu", bcs.begin().timestamp()); + } + for (int i = 0; i < 156; i++) { + int iDEN = GetDetElemId(i); + transformNew[iDEN] = transformation(iDEN); + } + } + + fCurrentRun = bcs.begin().runNumber(); + } + } + + void init(InitContext const&) + { + fCurrentRun = 0; + + // Configuration for CCDB server + ccdb->setURL(configCCDB.ccdburl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + + // Configuration for track fitter + const auto& trackerParam = TrackerParam::Instance(); + trackFitter.setBendingVertexDispersion(trackerParam.bendingVertexDispersion); + trackFitter.setChamberResolution(configRealign.fChamberResolutionX, configRealign.fChamberResolutionY); + trackFitter.smoothTracks(true); + trackFitter.useChamberResolution(); + mImproveCutChi2 = 2. * configRealign.fSigmaCutImprove * configRealign.fSigmaCutImprove; + + CreateBasicHistograms(); + CreateDetailedHistograms(); + } + + template + void runDCA(TEventMap const& collisions, TMFTTracks const& mfts, TTrack const& muon, mch::Track const& mchrealigned, VarC& fgValuesColl, VarT& fgValuesMCH, VarT& fgValuesMCHpv, VarT& fgValuesMFT) + { + if constexpr (static_cast(MuonFillMap)) { + + // track selection + if (!IsGoodMuon(fgValuesMCH, fgValuesMCHpv, configMuons.fTrackChi2MchUp, 30., 4., configMFTs.fEtaMftLow, configMFTs.fEtaMftUp, configMuons.fRabsLow, configMuons.fRabsUp, configMuons.fSigmaPdcaUp)) { + return; + } + + // Loop over collisions + for (auto& [collisionId, fgValuesColltmp] : collisions) { + + bool sameEvent = (fgValuesColltmp.bc == fgValuesColl.bc); + bool mixedEvent = IsMixedEvent(fgValuesColltmp, fgValuesColl); + + if (!sameEvent && !mixedEvent) { + continue; + } + + // Fill propagation of MCH track to DCA + if (configRealign.fDoRealign) { + FillPropagation(mchrealigned, fgValuesColltmp, fgValuesMCH, kToDCA); + } else { + FillPropagation<1>(muon, fgValuesColltmp, VarTrack{}, fgValuesMCH, kToDCA); + } + + double phi = fgValuesMCH.phi * 180 / TMath::Pi(); + int quadrant = GetQuadrantPhi(phi); + int sign = (fgValuesMCH.sign > 0) ? 1 : 2; + + // Fill DCA QA histograms + FillDCAHistograms<1, 0>(fgValuesMCH, fgValuesColltmp, sign, quadrant, sameEvent, mixedEvent); + } + } + + if constexpr (static_cast(GlobalMuonFillMap)) { + auto mftsThisCollision = mfts.sliceBy(mftPerCollision, fgValuesColl.globalIndex); + for (auto const& mft : mftsThisCollision) { + + // Fill MFT track + VarTrack fgValuesMFTtmp; + FillTrack<0>(mft, fgValuesMFTtmp); + + if (fgValuesMFT.trackTime != fgValuesMFTtmp.trackTime) { + continue; // if not time compatible + } + + if (!IsGoodMFT(fgValuesMFTtmp, configMFTs.fTrackChi2MftUp, configMFTs.fTrackNClustMftLow)) { + continue; + } + + int quadrant = GetQuadrantTrack(mft); + if (quadrant < 0) { + continue; + } + + int sign = (fgValuesMFTtmp.sign > 0) ? 1 : 2; + + for (auto& [collisionId, fgValuesColltmp] : collisions) { + + bool sameEvent = (fgValuesColltmp.bc == fgValuesColl.bc); + bool mixedEvent = IsMixedEvent(fgValuesColltmp, fgValuesColl); + + if (!sameEvent && !mixedEvent) { + continue; + } + + // Propagate MFT track to DCA + FillPropagation<0, 1>(mft, fgValuesColltmp, VarTrack{}, fgValuesMFTtmp, kToDCA); + + // Fill DCA QA histograms + FillDCAHistograms<0, 1>(fgValuesMFTtmp, fgValuesColltmp, sign, quadrant, sameEvent, mixedEvent); + } + resetVar(fgValuesMFTtmp); + } + } + } + + template + void runResidual(TEventMap const& collisions, TMuons const& muons, TMFTTracks const& mfts, TMuonCls const& clusters, TMCHTrack const& mchtrack, mch::Track const& mchrealigned, TMFTTrack const& mfttrack, VarC const& fgValuesColl, VarT const& fgValuesMCH, VarT const& fgValuesMCHpv, VarT const& fgValuesMFT) + { + if (!IsGoodMuon(fgValuesMCH, fgValuesMCHpv, configMuons.fTrackChi2MchUp, 20., configMuons.fPtMchLow, configMFTs.fEtaMftLow, configMFTs.fEtaMftUp, configMuons.fRabsLow, configMuons.fRabsUp, configMuons.fSigmaPdcaUp)) { + return; + } + + double phi = fgValuesMCH.phi * 180 / TMath::Pi(); + int quadrant = GetQuadrantPhi(phi); + + //// MCH-MFT track residuals + if (mfttrack.has_collision()) { + auto& fgValuesCollMatched = collisions.at(mfttrack.collisionId()); + + // Do extrapolation for muons to all reference planes + vector mchTrackExtrap; + for (double z : zRefPlane) { + VarTrack fgValues; + if (configRealign.fDoRealign) { + FillPropagation(mchrealigned, VarColl{}, fgValues, kToZ, z); + } else { + FillPropagation<1>(mchtrack, VarColl{}, VarTrack{}, fgValues, kToZ, z); + } + mchTrackExtrap.emplace_back(fgValues); + } + + // Loop over MFT tracks + for (auto const& mft : mfts) { + + if (!mft.has_collision()) { + continue; + } + + // Fill MFT track + VarTrack fgValuesMFTtmp; + FillTrack<0>(mft, fgValuesMFTtmp); + + // Track selection + if (!IsGoodMFT(fgValuesMFTtmp, configMFTs.fTrackChi2MftUp, configMFTs.fTrackNClustMftLow)) { + continue; + } + + auto& fgValuesCollMFT = collisions.at(mft.collisionId()); + + bool sameEvent = (fgValuesCollMFT.bc == fgValuesCollMatched.bc); + bool mixedEvent = IsMixedEvent(fgValuesCollMFT, fgValuesColl); + if (!sameEvent && !mixedEvent) { + continue; + } + + // Do extrapolation for MFTs to all reference planes + vector mftTrackExtrap; + for (double z : zRefPlane) { + VarTrack fgValues; + FillPropagation<0, 1>(mft, fgValuesCollMFT, mchTrackExtrap[1], fgValues, kToZ, z); + mftTrackExtrap.emplace_back(fgValues); + } + + //// Fill QA histograms for alignment checks + FillTrackResidualHistograms(mchTrackExtrap, mftTrackExtrap, quadrant, sameEvent, mixedEvent); + + resetVar(fgValuesMFTtmp); + } + } + + //// Track-Cluster residuals + for (auto const& muon : muons) { + if (static_cast(muon.trackType()) <= 2) { + continue; + } + if (!muon.has_collision()) { + continue; + } + auto& fgValuesCollMCH = collisions.at(muon.collisionId()); + + bool sameEvent = (fgValuesCollMCH.bc == fgValuesColl.bc); + bool mixedEvent = IsMixedEvent(fgValuesCollMCH, fgValuesColl); + if (!sameEvent && !mixedEvent) { + continue; + } + + //// Fill MCH clusters: do re-alignment if asked + mch::Track mchrealignedTmp; + VarClusters fgValuesClsTmp; + if (!FillClusters(muon, clusters, fgValuesClsTmp, mchrealignedTmp)) { + continue; // Refit is not valid + } + + // Loop over attached clusters + for (int iCls = 0; iCls < int(fgValuesClsTmp.posClusters.size()); iCls++) { + + double phiCls = std::atan2(fgValuesClsTmp.posClusters[iCls][1], fgValuesClsTmp.posClusters[iCls][0]) * 180 / TMath::Pi(); + int quadrantCls = GetQuadrantPhi(phiCls); + int DEId = fgValuesClsTmp.DEIDs[iCls]; + int chamber = DEId / 100 - 1; + int deIndex = DEId % 100; + + //// MCH residuals + //// Propagate MCH track to given cluster + VarTrack fgValuesMCHprop; + if (configRealign.fDoRealign) { + FillPropagation(mchrealigned, VarColl{}, fgValuesMCHprop, kToZ, fgValuesClsTmp.posClusters[iCls][2]); + } else { + FillPropagation<1>(mchtrack, VarColl{}, VarTrack{}, fgValuesMCHprop, kToZ, fgValuesClsTmp.posClusters[iCls][2]); + } + + //// Fill residual QA histograms + int topBottom = (fgValuesMCH.y >= 0) ? 0 : 1; + int posNeg = (fgValuesMCH.sign >= 0) ? 0 : 1; + FillResidualHistograms<1, 0>(fgValuesMCHprop, fgValuesMCH, fgValuesMCHpv, fgValuesMFT, fgValuesClsTmp.posClusters[iCls][0], fgValuesClsTmp.posClusters[iCls][1], topBottom, posNeg, quadrantCls, chamber, deIndex, sameEvent, mixedEvent); + resetVar(fgValuesMCHprop); + + //// MFT residuals + if (IsGoodMFT(fgValuesMFT, configMFTs.fTrackChi2MftUp, configMFTs.fTrackNClustMftLow)) { + //// Propagate MFT track to given cluster + VarTrack fgValuesMFTprop; + FillPropagation<0, 1>(mfttrack, VarColl{}, fgValuesMCH, fgValuesMFTprop, kToZ, fgValuesClsTmp.posClusters[iCls][2]); + + //// Fill residual QA histograms for MFT + topBottom = (mfttrack.y() >= 0) ? 0 : 1; + posNeg = (fgValuesMCH.sign >= 0) ? 0 : 1; + FillResidualHistograms<0, 1>(fgValuesMFTprop, fgValuesMCH, fgValuesMCHpv, fgValuesMFT, fgValuesClsTmp.posClusters[iCls][0], fgValuesClsTmp.posClusters[iCls][1], topBottom, posNeg, quadrantCls, chamber, deIndex, sameEvent, mixedEvent); + resetVar(fgValuesMFTprop); + } + } + } + } + + template + void runEventSelection(TEvents const& collisions, TBcs const& bcs, TFwdTracks const& muons, TMFTTracks const& mfts, TMap& collisionSel) + { + for (auto const& collision : collisions) { + + uint64_t collisionIndex = collision.globalIndex(); + auto muonsThisCollision = muons.sliceBy(fwdtracksPerCollision, collisionIndex); + auto mftsThisCollision = mfts.sliceBy(mftPerCollision, collisionIndex); + + if (muonsThisCollision.size() < 1 && mftsThisCollision.size() < 1) { + continue; + } + + auto& fgValuesColl = collisionSel[collisionIndex]; + FillCollision(collision, fgValuesColl); + fgValuesColl.bc = bcs.rawIteratorAt(collision.bcId()).globalBC(); + fgValuesColl.multMFT = mftsThisCollision.size(); + } + } + + template + void runMuonQA(TEventMap const& collisions, TCandidateMap& matchingCandidates, TFwdTracks const& muons, TMFTTracks const& mfts, TMuonCls const& clusters) + { + //// First loop over all muon tracks + for (auto const& muon : muons) { + + //// Get collision information if associated + VarColl fgValuesColl; + if (muon.has_collision()) { + fgValuesColl = collisions.at(muon.collisionId()); + } else { + continue; + } + + if (static_cast(muon.trackType()) <= 2) { // MFT-MCH-MID(0) or MFT-MCH(2) + + registry.get(HIST("global-muons/nTracksPerType"))->Fill(static_cast(muon.trackType())); + + // auto mfttrack = muon.template matchMFTTrack_as(); // unused parameter? + auto mchtrack = muon.template matchMCHTrack_as(); + + // Fill global matching candidates: global muons per MCH track + FillMatchingCandidates(muon, mchtrack, matchingCandidates); + + } else { // MCH-MID(3) or MCH(4) + + // Fill MCH tracks + FillTrack<1>(muon, fgValuesMCH); + + // Propagate MCH to PV + FillPropagation<1>(muon, fgValuesColl, fgValuesMCH, fgValuesMCHpv); // copied in a separate variable + + //// Fill MCH clusters: re-align clusters if required + mch::Track mchrealigned; + VarClusters fgValuesCls; + if (!FillClusters(muon, clusters, fgValuesCls, mchrealigned)) { + continue; // if refit was not passed + } + + //// Update MCH tracks kinematics if using realigned muons + if (configRealign.fDoRealign) { + + // Update track info + FillTrack(mchrealigned, fgValuesMCH); + + // Update propagate of MCH to PV + FillPropagation(mchrealigned, fgValuesColl, fgValuesMCHpv); + + // Update pDCA and Rabs values + FillPropagation(mchrealigned, fgValuesColl, fgValuesMCH, kToAbsEnd); + FillPropagation(mchrealigned, fgValuesColl, fgValuesMCH, kToDCA); + } + + //// Fill muon QA histograms + FillMuonHistograms<1, 0, 0>(fgValuesMCH, fgValuesMCHpv, fgValuesMFT, VarTrack{}, nullptr); + + //// Fill muon DCA QA checks + if (configQAs.fEnableQADCA) { + runDCA<1, 0>(collisions, mfts, muon, mchrealigned, fgValuesColl, fgValuesMCH, fgValuesMCHpv, fgValuesMFT); + } + } + + resetVar(fgValuesMFT); + resetVar(fgValuesMCH); + resetVar(fgValuesMCHpv); + } + + //// Second loop over global muon tracks + for (auto& [mchIndex, globalMuonsVector] : matchingCandidates) { + + //// sort matching candidates in ascending order based on the matching chi2 + auto compareChi2 = [&muons](uint64_t trackIndex1, uint64_t trackIndex2) -> bool { + auto const& track1 = muons.rawIteratorAt(trackIndex1); + auto const& track2 = muons.rawIteratorAt(trackIndex2); + + return (track1.chi2MatchMCHMFT() < track2.chi2MatchMCHMFT()); + }; + std::sort(globalMuonsVector.begin(), globalMuonsVector.end(), compareChi2); + + //// Get tracks + auto muontrack = muons.rawIteratorAt(globalMuonsVector[0]); + auto mchtrack = muontrack.template matchMCHTrack_as(); + auto mfttrack = muontrack.template matchMFTTrack_as(); + + //// Fill matching chi2 + FillMatching(muontrack, fgValuesMCH, fgValuesMFT); + + //// Fill global informations + registry.get(HIST("global-muons/NCandidates"))->Fill(int(globalMuonsVector.size())); + for (size_t candidateIndex = 0; candidateIndex < globalMuonsVector.size(); candidateIndex++) { + auto const& muon = muons.rawIteratorAt(globalMuonsVector[candidateIndex]); + registry.get(HIST("global-muons/MatchChi2"))->Fill(muon.chi2MatchMCHMFT(), candidateIndex); + } + + //// Fill collision information if avalaible + auto& fgValuesCollGlo = collisions.at(muontrack.collisionId()); + VarColl fgValuesCollMCH; // in principal should be the same as global muon + if (mchtrack.has_collision()) { + fgValuesCollMCH = collisions.at(mchtrack.collisionId()); + } + + //// Fill MCH and MFT tracks: basic info copied from input tables + FillTrack<1>(mchtrack, fgValuesMCH); + FillTrack<0>(mfttrack, fgValuesMFT); + FillTrack<1>(muontrack, fgValuesGlobal); + + //// Propagate MCH to PV + FillPropagation<1>(mchtrack, fgValuesCollMCH, VarTrack{}, fgValuesMCHpv); // saved in separate variable fgValuesMCHpv + + //// Fill MCH clusters: re-align clusters if required + mch::Track mchrealigned; + VarClusters fgValuesCls; + if (!FillClusters(mchtrack, clusters, fgValuesCls, mchrealigned)) { + continue; // if refit was not passed + } + + //// Update MCH tracks kinematics if using realigned muons + if (configRealign.fDoRealign) { + // Update track info + FillTrack(mchrealigned, fgValuesMCH); + + // Update propagation of MCH to PV + FillPropagation(mchrealigned, fgValuesCollMCH, fgValuesMCHpv); + + // Update pDCA and Rabs values + FillPropagation(mchrealigned, fgValuesCollMCH, fgValuesMCH, kToAbsEnd); + FillPropagation(mchrealigned, fgValuesCollMCH, fgValuesMCH, kToDCA); + } + + //// Fill global muon candidates info + for (int i = 0; i < int(globalMuonsVector.size()); i++) { + VarTrack fgValuesTmp; + auto muonCandidate = muons.rawIteratorAt(globalMuonsVector[i]); + FillTrack<0>(muonCandidate, fgValuesTmp); + fgValuesCandidates.emplace_back(fgValuesTmp); + } + + //// Fill global muons QA : fill global matching QA if required + if (configQAs.fEnableQAMatching) { + + // Propagate global muon tracks to DCA: treat it as MFT using p from MCH? + FillPropagation<0, 1>(muontrack, fgValuesCollGlo, fgValuesMCH, fgValuesGlobal, kToDCA); + + // Fill bc difference of matched MCH and MFT + if (muontrack.has_collision() && mfttrack.has_collision()) { + fgValuesMCH.bc = collisions.at(muontrack.collisionId()).bc; + fgValuesMFT.bc = collisions.at(mfttrack.collisionId()).bc; + int64_t dbc = fgValuesMCH.bc - fgValuesMFT.bc; + registry.get(HIST("global-matches/BCdifference"))->Fill(dbc); + } + + // Fill QA histograms including global matching + FillMuonHistograms<0, 1, 1>(fgValuesMCH, fgValuesMCHpv, fgValuesMFT, fgValuesGlobal, fgValuesCandidates); + + } else { + // Fill QA histograms + FillMuonHistograms<0, 1, 0>(fgValuesMCH, fgValuesMCHpv, fgValuesMFT, fgValuesGlobal, fgValuesCandidates); + } + + //// Fill residual QA checks if requireds + if (configQAs.fEnableQAResidual) { + runResidual(collisions, muons, mfts, clusters, mchtrack, mchrealigned, mfttrack, fgValuesCollGlo, fgValuesMCH, fgValuesMCHpv, fgValuesMFT); + } + + //// Fill MFT DCA QA checks if required + if (configQAs.fEnableQADCA) { + runDCA<0, 1>(collisions, mfts, nullptr, mch::Track(), fgValuesCollGlo, fgValuesMCH, fgValuesMCHpv, fgValuesMFT); + } + + fgValuesCandidates.clear(); + resetVar(fgValuesMFT); + resetVar(fgValuesMCH); + resetVar(fgValuesMCHpv); + resetVar(fgValuesGlobal); + } + } + + template + void runDimuonQA(TEventMap const& collisions, TCandidateMap const& matchingCandidates, TFwdTracks const& muonTracks, TMuonCls const& clusters) + { + std::vector muonPairs; + std::vector globalMuonPairs; + + GetMuonPairs(muonTracks, matchingCandidates, collisions, muonPairs, globalMuonPairs); + + for (auto& [muon1, muon2] : muonPairs) { + auto collisionIndex1 = muon1.first; + auto const& collision1 = collisions.at(collisionIndex1); + auto collisionIndex2 = muon2.first; + auto const& collision2 = collisions.at(collisionIndex2); + + auto mchIndex1 = muon1.second; + auto mchIndex2 = muon2.second; + auto const& muonTrack1 = muonTracks.rawIteratorAt(mchIndex1); + auto const& muonTrack2 = muonTracks.rawIteratorAt(mchIndex2); + + VarTrack fgValuesMuon1, fgValuesMuonPV1; + VarTrack fgValuesMuon2, fgValuesMuonPV2; + mch::Track mchrealigned1, mchrealigned2; + VarClusters fgValuesCls1, fgValuesCls2; + if (!FillClusters(muonTrack1, clusters, fgValuesCls1, mchrealigned1) || !FillClusters(muonTrack2, clusters, fgValuesCls2, mchrealigned2)) { + continue; // Refit is not valid + } + + if (configRealign.fDoRealign) { + + FillTrack(mchrealigned1, fgValuesMuon1); + FillTrack(mchrealigned2, fgValuesMuon2); + + // Propagate MCH to PV + FillPropagation(mchrealigned1, collision1, fgValuesMuonPV1); + FillPropagation(mchrealigned2, collision2, fgValuesMuonPV2); + + // Recalculate pDCA and Rabs values + FillPropagation(mchrealigned1, collision1, fgValuesMuon1, kToAbsEnd); + FillPropagation(mchrealigned1, collision1, fgValuesMuon1, kToDCA); + FillPropagation(mchrealigned2, collision2, fgValuesMuon2, kToAbsEnd); + FillPropagation(mchrealigned2, collision2, fgValuesMuon2, kToDCA); + } else { + FillTrack<1>(muonTrack1, fgValuesMuon1); + FillTrack<1>(muonTrack2, fgValuesMuon2); + + // Propagate MCH to PV + FillPropagation<1>(muonTrack1, collision1, fgValuesMuon1, fgValuesMuonPV1); + FillPropagation<1>(muonTrack2, collision2, fgValuesMuon1, fgValuesMuonPV2); + } + + int sign1 = muonTrack1.sign(); + int sign2 = muonTrack2.sign(); + + // only consider opposite-sign pairs + if ((sign1 * sign2) >= 0) + continue; + + int Quadrant1 = GetQuadrantPhi(muonTrack1.phi() * 180.0 / TMath::Pi()); + int Quadrant2 = GetQuadrantPhi(muonTrack2.phi() * 180.0 / TMath::Pi()); + int TopBottom1 = (Quadrant1 == 0 || Quadrant1 == 1) ? 0 : 1; + int TopBottom2 = (Quadrant2 == 0 || Quadrant2 == 1) ? 0 : 1; + int LeftRight1 = (Quadrant1 == 0 || Quadrant1 == 2) ? 0 : 1; + int LeftRight2 = (Quadrant2 == 0 || Quadrant2 == 2) ? 0 : 1; + + bool goodMuonTracks = (IsGoodMuon(fgValuesMuon1, fgValuesMuonPV1) && IsGoodMuon(fgValuesMuon2, fgValuesMuonPV2)); + bool goodGlobalMuonTracks = (IsGoodGlobalMuon(fgValuesMuon1, fgValuesMuonPV1) && IsGoodGlobalMuon(fgValuesMuon2, fgValuesMuonPV2)); + + bool sameEvent = (collisionIndex1 == collisionIndex2); + + double mass = GetMuMuInvariantMass(fgValuesMuonPV1, fgValuesMuonPV2); + if (goodMuonTracks) { + if (sameEvent) { + // same-event case + registryDimuon.get(HIST("dimuon/same-event/invariantMass_MuonKine_MuonCuts"))->Fill(mass); + registryDimuon.get(HIST("dimuon/same-event/invariantMassFull_MuonKine_MuonCuts"))->Fill(mass); + + if (TopBottom1 == 0 && TopBottom2 == 0) { + registryDimuon.get(HIST("dimuon/same-event/invariantMass_MuonKine_MuonCuts_TT"))->Fill(mass); + registryDimuon.get(HIST("dimuon/same-event/invariantMassFull_MuonKine_MuonCuts_TT"))->Fill(mass); + } else if ((TopBottom1 == 0 && TopBottom2 == 1) || (TopBottom1 == 1 && TopBottom2 == 0)) { + registryDimuon.get(HIST("dimuon/same-event/invariantMass_MuonKine_MuonCuts_TB"))->Fill(mass); + registryDimuon.get(HIST("dimuon/same-event/invariantMassFull_MuonKine_MuonCuts_TB"))->Fill(mass); + } else if (TopBottom1 == 1 && TopBottom2 == 1) { + registryDimuon.get(HIST("dimuon/same-event/invariantMass_MuonKine_MuonCuts_BB"))->Fill(mass); + registryDimuon.get(HIST("dimuon/same-event/invariantMassFull_MuonKine_MuonCuts_BB"))->Fill(mass); + } + + if (LeftRight1 == 0 && LeftRight2 == 0) { + registryDimuon.get(HIST("dimuon/same-event/invariantMass_MuonKine_MuonCuts_LL"))->Fill(mass); + registryDimuon.get(HIST("dimuon/same-event/invariantMassFull_MuonKine_MuonCuts_LL"))->Fill(mass); + } else if ((LeftRight1 == 0 && LeftRight2 == 1) || (LeftRight1 == 1 && LeftRight2 == 0)) { + registryDimuon.get(HIST("dimuon/same-event/invariantMass_MuonKine_MuonCuts_LR"))->Fill(mass); + registryDimuon.get(HIST("dimuon/same-event/invariantMassFull_MuonKine_MuonCuts_LR"))->Fill(mass); + } else if (LeftRight1 == 1 && LeftRight2 == 1) { + registryDimuon.get(HIST("dimuon/same-event/invariantMass_MuonKine_MuonCuts_RR"))->Fill(mass); + registryDimuon.get(HIST("dimuon/same-event/invariantMassFull_MuonKine_MuonCuts_RR"))->Fill(mass); + } + } else { + // event-mixing case + registryDimuon.get(HIST("dimuon/mixed-event/invariantMass_MuonKine_MuonCuts"))->Fill(mass); + registryDimuon.get(HIST("dimuon/mixed-event/invariantMassFull_MuonKine_MuonCuts"))->Fill(mass); + + if (TopBottom1 == 0 && TopBottom2 == 0) { + registryDimuon.get(HIST("dimuon/mixed-event/invariantMass_MuonKine_MuonCuts_TT"))->Fill(mass); + registryDimuon.get(HIST("dimuon/mixed-event/invariantMassFull_MuonKine_MuonCuts_TT"))->Fill(mass); + } else if ((TopBottom1 == 0 && TopBottom2 == 1) || (TopBottom1 == 1 && TopBottom2 == 0)) { + registryDimuon.get(HIST("dimuon/mixed-event/invariantMass_MuonKine_MuonCuts_TB"))->Fill(mass); + registryDimuon.get(HIST("dimuon/mixed-event/invariantMassFull_MuonKine_MuonCuts_TB"))->Fill(mass); + } else if (TopBottom1 == 1 && TopBottom2 == 1) { + registryDimuon.get(HIST("dimuon/mixed-event/invariantMass_MuonKine_MuonCuts_BB"))->Fill(mass); + registryDimuon.get(HIST("dimuon/mixed-event/invariantMassFull_MuonKine_MuonCuts_BB"))->Fill(mass); + } + + if (LeftRight1 == 0 && LeftRight2 == 0) { + registryDimuon.get(HIST("dimuon/mixed-event/invariantMass_MuonKine_MuonCuts_LL"))->Fill(mass); + registryDimuon.get(HIST("dimuon/mixed-event/invariantMassFull_MuonKine_MuonCuts_LL"))->Fill(mass); + } else if ((LeftRight1 == 0 && LeftRight2 == 1) || (LeftRight1 == 1 && LeftRight2 == 0)) { + registryDimuon.get(HIST("dimuon/mixed-event/invariantMass_MuonKine_MuonCuts_LR"))->Fill(mass); + registryDimuon.get(HIST("dimuon/mixed-event/invariantMassFull_MuonKine_MuonCuts_LR"))->Fill(mass); + } else if (LeftRight1 == 1 && LeftRight2 == 1) { + registryDimuon.get(HIST("dimuon/mixed-event/invariantMass_MuonKine_MuonCuts_RR"))->Fill(mass); + registryDimuon.get(HIST("dimuon/mixed-event/invariantMassFull_MuonKine_MuonCuts_RR"))->Fill(mass); + } + } + } + + if (goodGlobalMuonTracks) { + if (sameEvent) { + // same-event case + registryDimuon.get(HIST("dimuon/same-event/invariantMass_MuonKine_GlobalMuonCuts"))->Fill(mass); + registryDimuon.get(HIST("dimuon/same-event/invariantMassFull_MuonKine_GlobalMuonCuts"))->Fill(mass); + + if (TopBottom1 == 0 && TopBottom2 == 0) { + registryDimuon.get(HIST("dimuon/same-event/invariantMass_MuonKine_GlobalMuonCuts_TT"))->Fill(mass); + registryDimuon.get(HIST("dimuon/same-event/invariantMassFull_MuonKine_GlobalMuonCuts_TT"))->Fill(mass); + } else if ((TopBottom1 == 0 && TopBottom2 == 1) || (TopBottom1 == 1 && TopBottom2 == 0)) { + registryDimuon.get(HIST("dimuon/same-event/invariantMass_MuonKine_GlobalMuonCuts_TB"))->Fill(mass); + registryDimuon.get(HIST("dimuon/same-event/invariantMassFull_MuonKine_GlobalMuonCuts_TB"))->Fill(mass); + } else if (TopBottom1 == 1 && TopBottom2 == 1) { + registryDimuon.get(HIST("dimuon/same-event/invariantMass_MuonKine_GlobalMuonCuts_BB"))->Fill(mass); + registryDimuon.get(HIST("dimuon/same-event/invariantMassFull_MuonKine_GlobalMuonCuts_BB"))->Fill(mass); + } + + if (LeftRight1 == 0 && LeftRight2 == 0) { + registryDimuon.get(HIST("dimuon/same-event/invariantMass_MuonKine_GlobalMuonCuts_LL"))->Fill(mass); + registryDimuon.get(HIST("dimuon/same-event/invariantMassFull_MuonKine_GlobalMuonCuts_LL"))->Fill(mass); + } else if ((LeftRight1 == 0 && LeftRight2 == 1) || (LeftRight1 == 1 && LeftRight2 == 0)) { + registryDimuon.get(HIST("dimuon/same-event/invariantMass_MuonKine_GlobalMuonCuts_LR"))->Fill(mass); + registryDimuon.get(HIST("dimuon/same-event/invariantMassFull_MuonKine_GlobalMuonCuts_LR"))->Fill(mass); + } else if (LeftRight1 == 1 && LeftRight2 == 1) { + registryDimuon.get(HIST("dimuon/same-event/invariantMass_MuonKine_GlobalMuonCuts_RR"))->Fill(mass); + registryDimuon.get(HIST("dimuon/same-event/invariantMassFull_MuonKine_GlobalMuonCuts_RR"))->Fill(mass); + } + } else { + // event-mixing case + registryDimuon.get(HIST("dimuon/mixed-event/invariantMass_MuonKine_GlobalMuonCuts"))->Fill(mass); + registryDimuon.get(HIST("dimuon/mixed-event/invariantMassFull_MuonKine_GlobalMuonCuts"))->Fill(mass); + + if (TopBottom1 == 0 && TopBottom2 == 0) { + registryDimuon.get(HIST("dimuon/mixed-event/invariantMass_MuonKine_GlobalMuonCuts_TT"))->Fill(mass); + registryDimuon.get(HIST("dimuon/mixed-event/invariantMassFull_MuonKine_GlobalMuonCuts_TT"))->Fill(mass); + } else if ((TopBottom1 == 0 && TopBottom2 == 1) || (TopBottom1 == 1 && TopBottom2 == 0)) { + registryDimuon.get(HIST("dimuon/mixed-event/invariantMass_MuonKine_GlobalMuonCuts_TB"))->Fill(mass); + registryDimuon.get(HIST("dimuon/mixed-event/invariantMassFull_MuonKine_GlobalMuonCuts_TB"))->Fill(mass); + } else if (TopBottom1 == 1 && TopBottom2 == 1) { + registryDimuon.get(HIST("dimuon/mixed-event/invariantMass_MuonKine_GlobalMuonCuts_BB"))->Fill(mass); + registryDimuon.get(HIST("dimuon/mixed-event/invariantMassFull_MuonKine_GlobalMuonCuts_BB"))->Fill(mass); + } + + if (LeftRight1 == 0 && LeftRight2 == 0) { + registryDimuon.get(HIST("dimuon/mixed-event/invariantMass_MuonKine_GlobalMuonCuts_LL"))->Fill(mass); + registryDimuon.get(HIST("dimuon/mixed-event/invariantMassFull_MuonKine_GlobalMuonCuts_LL"))->Fill(mass); + } else if ((LeftRight1 == 0 && LeftRight2 == 1) || (LeftRight1 == 1 && LeftRight2 == 0)) { + registryDimuon.get(HIST("dimuon/mixed-event/invariantMass_MuonKine_GlobalMuonCuts_LR"))->Fill(mass); + registryDimuon.get(HIST("dimuon/mixed-event/invariantMassFull_MuonKine_GlobalMuonCuts_LR"))->Fill(mass); + } else if (LeftRight1 == 1 && LeftRight2 == 1) { + registryDimuon.get(HIST("dimuon/mixed-event/invariantMass_MuonKine_GlobalMuonCuts_RR"))->Fill(mass); + registryDimuon.get(HIST("dimuon/mixed-event/invariantMassFull_MuonKine_GlobalMuonCuts_RR"))->Fill(mass); + } + } + } + } + + for (auto& [muon1, muon2] : globalMuonPairs) { + auto collisionIndex1 = muon1.first; + auto collisionIndex2 = muon2.first; + auto& globalTracksVector1 = muon1.second; + auto& globalTracksVector2 = muon2.second; + + auto const& collision1 = collisions.at(collisionIndex1); + auto const& collision2 = collisions.at(collisionIndex2); + + auto const& muonTrack1 = muonTracks.rawIteratorAt(globalTracksVector1[0]); + auto const& muonTrack2 = muonTracks.rawIteratorAt(globalTracksVector2[0]); + auto const& mftTrack1 = muonTrack1.template matchMFTTrack_as(); + auto const& mftTrack2 = muonTrack2.template matchMFTTrack_as(); + auto const& mchTrack1 = muonTrack1.template matchMCHTrack_as(); + auto const& mchTrack2 = muonTrack2.template matchMCHTrack_as(); + + VarTrack fgValuesMuon1, fgValuesMuonPV1, fgValuesMCH1, fgValuesMCHpv1, fgValuesMFT1, fgValuesMFTpv1; + VarTrack fgValuesMuon2, fgValuesMuonPV2, fgValuesMCH2, fgValuesMCHpv2, fgValuesMFT2, fgValuesMFTpv2; + + // Fill MCH and MFT tracks + FillTrack<1>(mchTrack1, fgValuesMCH1); + FillTrack<0>(mftTrack1, fgValuesMFT1); + FillTrack<1>(muonTrack1, fgValuesMuon1); + FillTrack<1>(mchTrack2, fgValuesMCH2); + FillTrack<0>(mftTrack2, fgValuesMFT2); + FillTrack<1>(muonTrack2, fgValuesMuon2); + + //// Fill matching chi2 + FillMatching(muonTrack1, fgValuesMCH1, fgValuesMFT1); + FillMatching(muonTrack2, fgValuesMCH2, fgValuesMFT2); + + mch::Track mchrealigned1, mchrealigned2; + VarClusters fgValuesCls1, fgValuesCls2; + if (!FillClusters(muonTrack1, clusters, fgValuesCls1, mchrealigned1) || !FillClusters(muonTrack2, clusters, fgValuesCls2, mchrealigned2)) { + continue; // Refit is not valid + } + + if (configRealign.fDoRealign) { + + FillTrack(mchrealigned1, fgValuesMCH1); + FillTrack(mchrealigned2, fgValuesMCH2); + + // Propagate MCH to PV + FillPropagation(mchrealigned1, collision1, fgValuesMCHpv1); + FillPropagation(mchrealigned2, collision2, fgValuesMCHpv2); + + // Recalculate pDCA and Rabs values + FillPropagation(mchrealigned1, collision1, fgValuesMCH1, kToAbsEnd); + FillPropagation(mchrealigned1, collision1, fgValuesMCH1, kToDCA); + FillPropagation(mchrealigned2, collision2, fgValuesMCH2, kToAbsEnd); + FillPropagation(mchrealigned2, collision2, fgValuesMCH2, kToDCA); + + } else { + FillTrack<1>(mchTrack1, fgValuesMCH1); + FillTrack<1>(mchTrack2, fgValuesMCH2); + + // Propagate MCH to PV + FillPropagation<1>(mchTrack1, collision1, fgValuesMCH1, fgValuesMCHpv1); + FillPropagation<1>(mchTrack2, collision2, fgValuesMCH2, fgValuesMCHpv2); + } + + // Propagate global muon tracks to PV + FillPropagation<0>(muonTrack1, collision1, fgValuesMCH1, fgValuesMuonPV1); + FillPropagation<0>(muonTrack2, collision2, fgValuesMCH2, fgValuesMuonPV2); + + // Propagate MFT tracks to PV + FillPropagation<0, 1>(mftTrack1, collision1, fgValuesMCH1, fgValuesMFTpv1); + FillPropagation<0, 1>(mftTrack2, collision2, fgValuesMCH2, fgValuesMFTpv2); + + int sign1 = mchTrack1.sign(); + int sign2 = mchTrack2.sign(); + + // only consider opposite-sign pairs + if ((sign1 * sign2) >= 0) + continue; + + // indexes indicating whether the positive and negative tracks come from the top or bottom halves of MFT + int posTopBottom = (sign1 > 0) ? ((muonTrack1.y() >= 0) ? 0 : 1) : ((muonTrack2.y() >= 0) ? 0 : 1); + int negTopBottom = (sign1 < 0) ? ((muonTrack1.y() >= 0) ? 0 : 1) : ((muonTrack2.y() >= 0) ? 0 : 1); + + bool goodGlobalMuonTracks = (IsGoodGlobalMuon(fgValuesMCH1, fgValuesMCHpv1) && IsGoodGlobalMuon(fgValuesMCH2, fgValuesMCHpv2)); + bool goodGlobalMuonMatches = (IsGoodGlobalMatching(fgValuesMFT1) && IsGoodGlobalMatching(fgValuesMFT2)); + + bool sameEvent = (collisionIndex1 == collisionIndex2); + + if (goodGlobalMuonTracks && goodGlobalMuonMatches) { + + double massMCH = GetMuMuInvariantMass(fgValuesMCHpv1, fgValuesMCHpv2); + double mass = GetMuMuInvariantMass(fgValuesMuonPV1, fgValuesMuonPV2); + double massScaled = GetMuMuInvariantMass(fgValuesMFTpv1, fgValuesMFTpv2); + + if (sameEvent) { + // same-event case + registryDimuon.get(HIST("dimuon/same-event/invariantMass_MuonKine_GlobalMatchesCuts"))->Fill(massMCH); + registryDimuon.get(HIST("dimuon/same-event/invariantMassFull_MuonKine_GlobalMatchesCuts"))->Fill(massMCH); + registryDimuon.get(HIST("dimuon/same-event/invariantMass_GlobalMuonKine_GlobalMatchesCuts"))->Fill(mass); + registryDimuon.get(HIST("dimuon/same-event/invariantMassFull_GlobalMuonKine_GlobalMatchesCuts"))->Fill(mass); + registryDimuon.get(HIST("dimuon/same-event/invariantMass_ScaledMftKine_GlobalMatchesCuts"))->Fill(massScaled); + registryDimuon.get(HIST("dimuon/same-event/invariantMassFull_ScaledMftKine_GlobalMatchesCuts"))->Fill(massScaled); + + if (posTopBottom == 0 && negTopBottom == 0) { + registryDimuon.get(HIST("dimuon/same-event/invariantMass_ScaledMftKine_GlobalMatchesCuts_TT"))->Fill(massScaled); + } else if (posTopBottom == 0 && negTopBottom == 1) { + registryDimuon.get(HIST("dimuon/same-event/invariantMass_ScaledMftKine_GlobalMatchesCuts_TB"))->Fill(massScaled); + } else if (posTopBottom == 1 && negTopBottom == 0) { + registryDimuon.get(HIST("dimuon/same-event/invariantMass_ScaledMftKine_GlobalMatchesCuts_BT"))->Fill(massScaled); + } else if (posTopBottom == 1 && negTopBottom == 1) { + registryDimuon.get(HIST("dimuon/same-event/invariantMass_ScaledMftKine_GlobalMatchesCuts_BB"))->Fill(massScaled); + } + + // mass correlation + registryDimuon.get(HIST("dimuon/same-event/invariantMass_MuonKine_vs_GlobalMuonKine"))->Fill(mass, massMCH); + registryDimuon.get(HIST("dimuon/same-event/invariantMass_ScaledMftKine_vs_GlobalMuonKine"))->Fill(mass, massScaled); + } else { + // event-mixing case + registryDimuon.get(HIST("dimuon/mixed-event/invariantMass_MuonKine_GlobalMatchesCuts"))->Fill(massMCH); + registryDimuon.get(HIST("dimuon/mixed-event/invariantMassFull_MuonKine_GlobalMatchesCuts"))->Fill(massMCH); + registryDimuon.get(HIST("dimuon/mixed-event/invariantMass_GlobalMuonKine_GlobalMatchesCuts"))->Fill(mass); + registryDimuon.get(HIST("dimuon/mixed-event/invariantMassFull_GlobalMuonKine_GlobalMatchesCuts"))->Fill(mass); + registryDimuon.get(HIST("dimuon/mixed-event/invariantMass_ScaledMftKine_GlobalMatchesCuts"))->Fill(massScaled); + registryDimuon.get(HIST("dimuon/mixed-event/invariantMassFull_ScaledMftKine_GlobalMatchesCuts"))->Fill(massScaled); + + if (posTopBottom == 0 && negTopBottom == 0) { + registryDimuon.get(HIST("dimuon/mixed-event/invariantMass_ScaledMftKine_GlobalMatchesCuts_TT"))->Fill(massScaled); + } else if (posTopBottom == 0 && negTopBottom == 1) { + registryDimuon.get(HIST("dimuon/mixed-event/invariantMass_ScaledMftKine_GlobalMatchesCuts_TB"))->Fill(massScaled); + } else if (posTopBottom == 1 && negTopBottom == 0) { + registryDimuon.get(HIST("dimuon/mixed-event/invariantMass_ScaledMftKine_GlobalMatchesCuts_BT"))->Fill(massScaled); + } else if (posTopBottom == 1 && negTopBottom == 1) { + registryDimuon.get(HIST("dimuon/mixed-event/invariantMass_ScaledMftKine_GlobalMatchesCuts_BB"))->Fill(massScaled); + } + } + } + + // plots for sub-leading matches are only filled in the same-event case + if (sameEvent) { + if (globalTracksVector1.size() > 1) { + VarTrack fgValuesMuonb1, fgValuesMuonbpv1, fgValuesMFTb1; + auto const& muonTrack1b = muonTracks.rawIteratorAt(globalTracksVector1[1]); + FillTrack<1>(muonTrack1b, fgValuesMuonb1); + FillPropagation<0>(muonTrack1b, collision1, fgValuesMCH1, fgValuesMuonbpv1); + + goodGlobalMuonTracks = (IsGoodGlobalMuon(fgValuesMCH1, fgValuesMCHpv1) && IsGoodGlobalMuon(fgValuesMCH2, fgValuesMCHpv2)); + goodGlobalMuonMatches = (IsGoodGlobalMatching(fgValuesMFTb1) && IsGoodGlobalMatching(fgValuesMFT2)); + double mass = GetMuMuInvariantMass(fgValuesMuonbpv1, fgValuesMuonPV2); + if (goodGlobalMuonTracks && goodGlobalMuonMatches) { + registryDimuon.get(HIST("dimuon/same-event/invariantMass_GlobalMuonKine_GlobalMatchesCuts_subleading_leading"))->Fill(mass); + registryDimuon.get(HIST("dimuon/same-event/invariantMassFull_GlobalMuonKine_GlobalMatchesCuts_subleading_leading"))->Fill(mass); + } + } + + if (globalTracksVector2.size() > 1) { + VarTrack fgValuesMuonb2, fgValuesMuonbpv2, fgValuesMFTb2; + auto const& muonTrack2b = muonTracks.rawIteratorAt(globalTracksVector2[1]); + FillTrack<1>(muonTrack2b, fgValuesMuonb2); + FillPropagation<0>(muonTrack2b, collision2, fgValuesMCH2, fgValuesMuonbpv2); + + goodGlobalMuonTracks = (IsGoodGlobalMuon(fgValuesMCH1, fgValuesMCHpv1) && IsGoodGlobalMuon(fgValuesMCH2, fgValuesMCHpv2)); + goodGlobalMuonMatches = (IsGoodGlobalMatching(fgValuesMFTb2) && IsGoodGlobalMatching(fgValuesMFT1)); + double mass = GetMuMuInvariantMass(fgValuesMuonbpv2, fgValuesMuonPV1); + if (goodGlobalMuonTracks && goodGlobalMuonMatches) { + registryDimuon.get(HIST("dimuon/same-event/invariantMass_GlobalMuonKine_GlobalMatchesCuts_leading_subleading"))->Fill(mass); + registryDimuon.get(HIST("dimuon/same-event/invariantMassFull_GlobalMuonKine_GlobalMatchesCuts_leading_subleading"))->Fill(mass); + } + } + + if (globalTracksVector1.size() > 1 && globalTracksVector2.size() > 1) { + VarTrack fgValuesMuonb1, fgValuesMuonbpv1, fgValuesMFTb1; + VarTrack fgValuesMuonb2, fgValuesMuonbpv2, fgValuesMFTb2; + auto const& muonTrack1b = muonTracks.rawIteratorAt(globalTracksVector1[1]); + auto const& muonTrack2b = muonTracks.rawIteratorAt(globalTracksVector2[1]); + + FillTrack<1>(muonTrack1b, fgValuesMuonb1); + FillPropagation<0>(muonTrack1b, collision1, fgValuesMCH1, fgValuesMuonbpv1); + + FillTrack<1>(muonTrack2b, fgValuesMuonb2); + FillPropagation<0>(muonTrack2b, collision2, fgValuesMCH2, fgValuesMuonbpv2); + + goodGlobalMuonTracks = (IsGoodGlobalMuon(fgValuesMCH1, fgValuesMCHpv1) && IsGoodGlobalMuon(fgValuesMCH2, fgValuesMCHpv2)); + goodGlobalMuonMatches = (IsGoodGlobalMatching(fgValuesMFTb1) && IsGoodGlobalMatching(fgValuesMFTb2)); + double mass = GetMuMuInvariantMass(fgValuesMuonbpv1, fgValuesMuonbpv2); + double massLeading = GetMuMuInvariantMass(fgValuesMuonPV1, fgValuesMuonPV2); + if (goodGlobalMuonTracks && goodGlobalMuonMatches) { + registryDimuon.get(HIST("dimuon/same-event/invariantMass_GlobalMuonKine_GlobalMatchesCuts_subleading_subleading"))->Fill(mass); + registryDimuon.get(HIST("dimuon/same-event/invariantMassFull_GlobalMuonKine_GlobalMatchesCuts_subleading_subleading"))->Fill(mass); + + // mass correlation + registryDimuon.get(HIST("dimuon/same-event/invariantMass_GlobalMuonKine_subleading_vs_leading"))->Fill(massLeading, mass); + } + } + } + } + } + + void processMuonQa(MyEvents const& collisions, aod::BCsWithTimestamps const& bcs, MyMuonsWithCov const& muontracks, MyMFTs const& mfttracks, aod::FwdTrkCls const& muonclusters) + { + std::map collisionSel; + std::map> matchingCandidates; + + initCCDB(bcs); + + runEventSelection(collisions, bcs, muontracks, mfttracks, collisionSel); + + runMuonQA(collisionSel, matchingCandidates, muontracks, mfttracks, muonclusters); + + if (configQAs.fEnableQADimuon) { + runDimuonQA(collisionSel, matchingCandidates, muontracks, muonclusters); + } + } + PROCESS_SWITCH(muonQa, processMuonQa, "Process to run muon QA", true); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} From d62c8351bd2c648ff7c0f41377017d19e6bdd06d Mon Sep 17 00:00:00 2001 From: Ionut Cristian Arsene Date: Wed, 4 Jun 2025 11:20:55 +0200 Subject: [PATCH 1503/1650] =?UTF-8?q?[PWGDQ]=20Small=20fix=20for=20computi?= =?UTF-8?q?ng=20the=20TPC=20nSigmas=20when=20running=20the=20table-maker?= =?UTF-8?q?=20=E2=80=A6=20(#11455)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ionut Cristian Arsene Co-authored-by: ALICE Action Bot --- PWGDQ/Core/VarManager.h | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 1da8fa30562..65dded71cf5 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -1106,15 +1106,19 @@ class VarManager : public TObject // Check whether all the needed objects for TPC postcalibration are available if (fgCalibs.find(kTPCElectronMean) != fgCalibs.end() && fgCalibs.find(kTPCElectronSigma) != fgCalibs.end()) { fgRunTPCPostCalibration[0] = true; + fgUsedVars[kTPCnSigmaEl_Corr] = true; } if (fgCalibs.find(kTPCPionMean) != fgCalibs.end() && fgCalibs.find(kTPCPionSigma) != fgCalibs.end()) { fgRunTPCPostCalibration[1] = true; + fgUsedVars[kTPCnSigmaPi_Corr] = true; } if (fgCalibs.find(kTPCKaonMean) != fgCalibs.end() && fgCalibs.find(kTPCKaonSigma) != fgCalibs.end()) { fgRunTPCPostCalibration[2] = true; + fgUsedVars[kTPCnSigmaKa_Corr] = true; } if (fgCalibs.find(kTPCProtonMean) != fgCalibs.end() && fgCalibs.find(kTPCProtonSigma) != fgCalibs.end()) { fgRunTPCPostCalibration[3] = true; + fgUsedVars[kTPCnSigmaPr_Corr] = true; } } static TObject* GetCalibrationObject(CalibObjects calib) @@ -2376,7 +2380,7 @@ void VarManager::FillTrack(T const& track, float* values) } // Quantities based on the barrel PID tables - if constexpr ((fillMap & TrackPID) > 0 || (fillMap & ReducedTrackBarrelPID) > 0) { + if constexpr ((fillMap & TrackPID) > 0 || (fillMap & TrackTPCPID) > 0 || (fillMap & ReducedTrackBarrelPID) > 0) { values[kTPCnSigmaEl] = track.tpcNSigmaEl(); values[kTPCnSigmaPi] = track.tpcNSigmaPi(); values[kTPCnSigmaKa] = track.tpcNSigmaKa(); @@ -2479,10 +2483,13 @@ void VarManager::FillTrack(T const& track, float* values) values[kTPCnSigmaPr_Corr] = track.tpcNSigmaPr(); } } - values[kTOFnSigmaEl] = track.tofNSigmaEl(); - values[kTOFnSigmaPi] = track.tofNSigmaPi(); - values[kTOFnSigmaKa] = track.tofNSigmaKa(); - values[kTOFnSigmaPr] = track.tofNSigmaPr(); + + if constexpr ((fillMap & TrackPID) > 0 || (fillMap & ReducedTrackBarrelPID) > 0) { + values[kTOFnSigmaEl] = track.tofNSigmaEl(); + values[kTOFnSigmaPi] = track.tofNSigmaPi(); + values[kTOFnSigmaKa] = track.tofNSigmaKa(); + values[kTOFnSigmaPr] = track.tofNSigmaPr(); + } if (fgUsedVars[kTPCsignalRandomized] || fgUsedVars[kTPCnSigmaElRandomized] || fgUsedVars[kTPCnSigmaPiRandomized] || fgUsedVars[kTPCnSigmaPrRandomized]) { // NOTE: this is needed temporarily for the study of the impact of TPC pid degradation on the quarkonium triggers in high lumi pp From 0e4e97b35ca98151412e25ff63c0ab14b60ae3ad Mon Sep 17 00:00:00 2001 From: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> Date: Wed, 4 Jun 2025 13:13:27 +0200 Subject: [PATCH 1504/1650] [PWGCF,PWGEM,PWGLF] Replace expression columns with dynamic columns in strangeness data model (#11420) Co-authored-by: ALICE Action Bot --- .../Tasks/threeParticleCorrelations.cxx | 23 +- PWGEM/PhotonMeson/TableProducer/createPCM.cxx | 9 +- PWGLF/DataModel/LFStrangenessTables.h | 223 +++++++++--------- .../Strangeness/cascadebuilder.cxx | 9 - .../Strangeness/cascadefinder.cxx | 9 +- .../Strangeness/cascadespawner.cxx | 2 +- .../Strangeness/lambdakzerobuilder.cxx | 10 +- .../Strangeness/lambdakzerofinder.cxx | 9 +- .../Strangeness/lambdakzerospawner.cxx | 2 +- .../Strangeness/strangenessbuilder.cxx | 12 +- 10 files changed, 134 insertions(+), 174 deletions(-) diff --git a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx index 99cf6e75c69..d133b83f559 100644 --- a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx +++ b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx @@ -68,10 +68,6 @@ struct ThreeParticleCorrelations { Filter mcCollZvtx = nabs(aod::mccollision::posZ) < zvtxMax; Filter evSelect = aod::evsel::sel8 == true; - // V0 filters - Filter v0Pt = aod::v0data::pt > v0PtMin&& aod::v0data::pt < v0PtMax; - Filter v0Eta = nabs(aod::v0data::eta) < v0EtaMax; - // Track filters Filter trackPt = aod::track::pt > trackPtMin&& aod::track::pt < trackPtMax; Filter trackEta = nabs(aod::track::eta) < trackEtaMax; @@ -83,7 +79,6 @@ struct ThreeParticleCorrelations { // Table aliases - Data using MyFilteredCollisions = soa::Filtered>; using MyFilteredCollision = MyFilteredCollisions::iterator; - using MyFilteredV0s = soa::Filtered; using MyFilteredTracks = soa::Filtered>; @@ -122,7 +117,7 @@ struct ThreeParticleCorrelations { BinningType collBinning{{confCentBins, confZvtxBins}, true}; BinningTypeMC collBinningMC{{confCentBins, confZvtxBins}, true}; - Pair pairData{collBinning, 5, -1, &cache}; + Pair pairData{collBinning, 5, -1, &cache}; SameKindPair pairMC{collBinningMC, 5, -1, &cache}; // Process configurables @@ -313,7 +308,7 @@ struct ThreeParticleCorrelations { //========================================================================================================================================================================================================================================================================== - void processSame(MyFilteredCollision const& collision, MyFilteredV0s const& v0s, MyFilteredTracks const& tracks, aod::BCsWithTimestamps const&) + void processSame(MyFilteredCollision const& collision, aod::V0Datas const& v0s, MyFilteredTracks const& tracks, aod::BCsWithTimestamps const&) { if (!acceptEvent(collision, true)) { @@ -425,7 +420,7 @@ struct ThreeParticleCorrelations { // End of the Same-Event correlations } - void processMixed(MyFilteredCollisions const&, MyFilteredV0s const&, MyFilteredTracks const&, aod::BCsWithTimestamps const&) + void processMixed(MyFilteredCollisions const&, aod::V0Datas const&, MyFilteredTracks const&, aod::BCsWithTimestamps const&) { // Start of the Mixed-Event correlations @@ -886,7 +881,6 @@ struct ThreeParticleCorrelations { template bool acceptEvent(const CollCand& collision, bool FillHist) // Event filter { - if (FillHist) { rQARegistry.fill(HIST("hNEvents"), 0.5); } @@ -911,8 +905,12 @@ struct ThreeParticleCorrelations { template bool v0Filters(const V0Cand& v0, bool MCRec) // V0 filter { - if (!MCRec) { // Data + if (v0.pt() < v0PtMin || v0.pt() > v0PtMax) + return false; + if (std::abs(v0.eta()) > v0EtaMax) + return false; + if (v0Sign(v0) == 1) { const auto& posDaughter = v0.template posTrack_as(); if (std::abs(posDaughter.tpcNSigmaPr()) > nSigma4) { @@ -925,6 +923,11 @@ struct ThreeParticleCorrelations { } } } else { // MC Reconstructed + if (v0.pt() < v0PtMin || v0.pt() > v0PtMax) + return false; + if (std::abs(v0.eta()) > v0EtaMax) + return false; + if (v0Sign(v0) == 1) { const auto& posDaughter = v0.template posTrack_as(); if (std::abs(posDaughter.tpcNSigmaPr()) > nSigma4) { diff --git a/PWGEM/PhotonMeson/TableProducer/createPCM.cxx b/PWGEM/PhotonMeson/TableProducer/createPCM.cxx index f8ba87d2cbc..4ca74633e1b 100644 --- a/PWGEM/PhotonMeson/TableProducer/createPCM.cxx +++ b/PWGEM/PhotonMeson/TableProducer/createPCM.cxx @@ -554,15 +554,8 @@ struct createPCM { PROCESS_SWITCH(createPCM, processTrkCollAsso, "create V0s with track-to-collision associator", false); }; -// Extends the v0data table with expression columns -struct v0Initializer { - Spawns v0cores; - void init(InitContext const&) {} -}; - WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"v0-finder"}), - adaptAnalysisTask(cfgc, TaskName{"v0-initializer"})}; + adaptAnalysisTask(cfgc, TaskName{"v0-finder"})}; } diff --git a/PWGLF/DataModel/LFStrangenessTables.h b/PWGLF/DataModel/LFStrangenessTables.h index bfe3a4f055d..ce2e9e65eda 100644 --- a/PWGLF/DataModel/LFStrangenessTables.h +++ b/PWGLF/DataModel/LFStrangenessTables.h @@ -618,42 +618,28 @@ DECLARE_SOA_COLUMN(GeneratedK0Short, generatedK0Short, std::vector); DECLARE_SOA_COLUMN(GeneratedLambda, generatedLambda, std::vector); //! Lambda binned generated data DECLARE_SOA_COLUMN(GeneratedAntiLambda, generatedAntiLambda, std::vector); //! AntiLambda binned generated data -//______________________________________________________ -// EXPRESSION COLUMNS -DECLARE_SOA_EXPRESSION_COLUMN(Px, px, //! V0 px - float, 1.f * aod::v0data::pxpos + 1.f * aod::v0data::pxneg); -DECLARE_SOA_EXPRESSION_COLUMN(Py, py, //! V0 py - float, 1.f * aod::v0data::pypos + 1.f * aod::v0data::pyneg); -DECLARE_SOA_EXPRESSION_COLUMN(Pz, pz, //! V0 pz - float, 1.f * aod::v0data::pzpos + 1.f * aod::v0data::pzneg); -DECLARE_SOA_EXPRESSION_COLUMN(Pt, pt, float, //! Transverse momentum in GeV/c - nsqrt((1.f * aod::v0data::pxpos + 1.f * aod::v0data::pxneg) * - (1.f * aod::v0data::pxpos + 1.f * aod::v0data::pxneg) + - (1.f * aod::v0data::pypos + 1.f * aod::v0data::pyneg) * (1.f * aod::v0data::pypos + 1.f * aod::v0data::pyneg))); -DECLARE_SOA_EXPRESSION_COLUMN(P, p, float, //! Total momentum in GeV/c - nsqrt((1.f * aod::v0data::pxpos + 1.f * aod::v0data::pxneg) * - (1.f * aod::v0data::pxpos + 1.f * aod::v0data::pxneg) + - (1.f * aod::v0data::pypos + 1.f * aod::v0data::pyneg) * (1.f * aod::v0data::pypos + 1.f * aod::v0data::pyneg) + - (1.f * aod::v0data::pzpos + 1.f * aod::v0data::pzneg) * (1.f * aod::v0data::pzpos + 1.f * aod::v0data::pzneg))); -DECLARE_SOA_EXPRESSION_COLUMN(Phi, phi, float, //! Phi in the range [0, 2pi) - o2::constants::math::PI + natan2(-1.0f * (1.f * aod::v0data::pypos + 1.f * aod::v0data::pyneg), -1.0f * (1.f * aod::v0data::pxpos + 1.f * aod::v0data::pxneg))); -DECLARE_SOA_EXPRESSION_COLUMN(Eta, eta, float, //! Pseudorapidity, conditionally defined to avoid FPEs - ifnode((nsqrt((1.f * aod::v0data::pxpos + 1.f * aod::v0data::pxneg) * (1.f * aod::v0data::pxpos + 1.f * aod::v0data::pxneg) + - (1.f * aod::v0data::pypos + 1.f * aod::v0data::pyneg) * (1.f * aod::v0data::pypos + 1.f * aod::v0data::pyneg) + - (1.f * aod::v0data::pzpos + 1.f * aod::v0data::pzneg) * (1.f * aod::v0data::pzpos + 1.f * aod::v0data::pzneg)) - - (1.f * aod::v0data::pzpos + 1.f * aod::v0data::pzneg)) < static_cast(1e-7), - ifnode((1.f * aod::v0data::pzpos + 1.f * aod::v0data::pzneg) < 0.f, -100.f, 100.f), - 0.5f * nlog((nsqrt((1.f * aod::v0data::pxpos + 1.f * aod::v0data::pxneg) * (1.f * aod::v0data::pxpos + 1.f * aod::v0data::pxneg) + - (1.f * aod::v0data::pypos + 1.f * aod::v0data::pyneg) * (1.f * aod::v0data::pypos + 1.f * aod::v0data::pyneg) + - (1.f * aod::v0data::pzpos + 1.f * aod::v0data::pzneg) * (1.f * aod::v0data::pzpos + 1.f * aod::v0data::pzneg)) + - (1.f * aod::v0data::pzpos + 1.f * aod::v0data::pzneg)) / - (nsqrt((1.f * aod::v0data::pxpos + 1.f * aod::v0data::pxneg) * (1.f * aod::v0data::pxpos + 1.f * aod::v0data::pxneg) + - (1.f * aod::v0data::pypos + 1.f * aod::v0data::pyneg) * (1.f * aod::v0data::pypos + 1.f * aod::v0data::pyneg) + - (1.f * aod::v0data::pzpos + 1.f * aod::v0data::pzneg) * (1.f * aod::v0data::pzpos + 1.f * aod::v0data::pzneg)) - - (1.f * aod::v0data::pzpos + 1.f * aod::v0data::pzneg))))); - //______________________________________________________ // DYNAMIC COLUMNS +DECLARE_SOA_DYNAMIC_COLUMN(Px, px, //! V0 px + [](float pxPos, float pxNeg) -> float { return pxPos + pxNeg; }); +DECLARE_SOA_DYNAMIC_COLUMN(Py, py, //! V0 py + [](float pyPos, float pyNeg) -> float { return pyPos + pyNeg; }); +DECLARE_SOA_DYNAMIC_COLUMN(Pz, pz, //! V0 pz + [](float pzPos, float pzNeg) -> float { return pzPos + pzNeg; }); +DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, //! Transverse momentum in GeV/c + [](float pxPos, float pyPos, float pxNeg, float pyNeg) -> float { + return RecoDecay::sqrtSumOfSquares(pxPos + pxNeg, pyPos + pyNeg); + }); +DECLARE_SOA_DYNAMIC_COLUMN(P, p, //! Total momentum in GeV/c + [](float pxPos, float pyPos, float pzPos, float pxNeg, float pyNeg, float pzNeg) -> float { + return RecoDecay::sqrtSumOfSquares(pxPos + pxNeg, pyPos + pyNeg, pzPos + pzNeg); + }); +DECLARE_SOA_DYNAMIC_COLUMN(Phi, phi, //! Phi in the range [0, 2pi) + [](float pxPos, float pyPos, float pxNeg, float pyNeg) -> float { return RecoDecay::phi(pxPos + pxNeg, pyPos + pyNeg); }); +DECLARE_SOA_DYNAMIC_COLUMN(Eta, eta, //! Pseudorapidity, conditionally defined to avoid FPEs + [](float pxPos, float pyPos, float pzPos, float pxNeg, float pyNeg, float pzNeg) -> float { + return RecoDecay::eta(std::array{pxPos + pxNeg, pyPos + pyNeg, pzPos + pzNeg}); + }); // Account for rigidity in case of hypertriton DECLARE_SOA_DYNAMIC_COLUMN(PtHypertriton, ptHypertriton, //! V0 pT [](float pxpos, float pypos, float pxneg, float pyneg) -> float { return RecoDecay::sqrtSumOfSquares(2.0f * pxpos + pxneg, 2.0f * pypos + pyneg); }); @@ -666,8 +652,8 @@ DECLARE_SOA_DYNAMIC_COLUMN(V0Radius, v0radius, //! V0 decay radius (2D, centered // Distance Over To Mom DECLARE_SOA_DYNAMIC_COLUMN(DistOverTotMom, distovertotmom, //! PV to V0decay distance over total momentum - [](float X, float Y, float Z, float Px, float Py, float Pz, float pvX, float pvY, float pvZ) { - float P = RecoDecay::sqrtSumOfSquares(Px, Py, Pz); + [](float X, float Y, float Z, float pxPos, float pyPos, float pzPos, float pxNeg, float pyNeg, float pzNeg, float pvX, float pvY, float pvZ) { + float P = RecoDecay::sqrtSumOfSquares(pxPos + pxNeg, pyPos + pyNeg, pzPos + pzNeg); return std::sqrt(std::pow(X - pvX, 2) + std::pow(Y - pvY, 2) + std::pow(Z - pvZ, 2)) / (P + 1E-10); }); @@ -746,19 +732,23 @@ DECLARE_SOA_DYNAMIC_COLUMN(M, m, //! mass under a certain hypothesis (0:K0, 1:L, }); DECLARE_SOA_DYNAMIC_COLUMN(YK0Short, yK0Short, //! V0 y with K0short hypothesis - [](float Px, float Py, float Pz) -> float { return RecoDecay::y(std::array{Px, Py, Pz}, o2::constants::physics::MassKaonNeutral); }); + [](float pxpos, float pypos, float pzpos, float pxneg, float pyneg, float pzneg) -> float { + return RecoDecay::y(std::array{pxpos + pxneg, pypos + pyneg, pzpos + pzneg}, o2::constants::physics::MassKaonNeutral); + }); DECLARE_SOA_DYNAMIC_COLUMN(YLambda, yLambda, //! V0 y with lambda or antilambda hypothesis - [](float Px, float Py, float Pz) -> float { return RecoDecay::y(std::array{Px, Py, Pz}, o2::constants::physics::MassLambda); }); + [](float pxpos, float pypos, float pzpos, float pxneg, float pyneg, float pzneg) -> float { + return RecoDecay::y(std::array{pxpos + pxneg, pypos + pyneg, pzpos + pzneg}, o2::constants::physics::MassLambda); + }); DECLARE_SOA_DYNAMIC_COLUMN(YHypertriton, yHypertriton, //! V0 y with hypertriton hypothesis [](float pxpos, float pypos, float pzpos, float pxneg, float pyneg, float pzneg) -> float { return RecoDecay::y(std::array{2.0f * pxpos + pxneg, 2.0f * pypos + pyneg, 2.0f * pzpos + pzneg}, o2::constants::physics::MassHyperTriton); }); DECLARE_SOA_DYNAMIC_COLUMN(YAntiHypertriton, yAntiHypertriton, //! V0 y with antihypertriton hypothesis [](float pxpos, float pypos, float pzpos, float pxneg, float pyneg, float pzneg) -> float { return RecoDecay::y(std::array{pxpos + 2.0f * pxneg, pypos + 2.0f * pyneg, pzpos + 2.0f * pzneg}, o2::constants::physics::MassHyperTriton); }); DECLARE_SOA_DYNAMIC_COLUMN(Rapidity, rapidity, //! rapidity (0:K0, 1:L, 2:Lbar) - [](float Px, float Py, float Pz, int value) -> float { + [](float pxpos, float pypos, float pzpos, float pxneg, float pyneg, float pzneg, int value) -> float { if (value == 0) - return RecoDecay::y(std::array{Px, Py, Pz}, o2::constants::physics::MassKaonNeutral); + return RecoDecay::y(std::array{pxpos + pxneg, pypos + pyneg, pzpos + pzneg}, o2::constants::physics::MassKaonNeutral); if (value == 1 || value == 2) - return RecoDecay::y(std::array{Px, Py, Pz}, o2::constants::physics::MassLambda); + return RecoDecay::y(std::array{pxpos + pxneg, pypos + pyneg, pzpos + pzneg}, o2::constants::physics::MassLambda); return 0.0f; }); @@ -820,10 +810,17 @@ DECLARE_SOA_TABLE_STAGED(V0CoresBase, "V0CORE", //! core information about decay v0data::V0CosPA, v0data::DCAV0ToPV, v0data::V0Type, // Dynamic columns + v0data::Px, + v0data::Py, + v0data::Pz, + v0data::Pt, + v0data::P, + v0data::Phi, + v0data::Eta, v0data::PtHypertriton, v0data::PtAntiHypertriton, v0data::V0Radius, - v0data::DistOverTotMom, + v0data::DistOverTotMom, v0data::Alpha, v0data::QtArm, v0data::PsiPair, @@ -840,11 +837,11 @@ DECLARE_SOA_TABLE_STAGED(V0CoresBase, "V0CORE", //! core information about decay v0data::M, // Longitudinal - v0data::YK0Short, - v0data::YLambda, + v0data::YK0Short, + v0data::YLambda, v0data::YHypertriton, v0data::YAntiHypertriton, - v0data::Rapidity, + v0data::Rapidity, v0data::NegativePt, v0data::PositivePt, v0data::NegativeEta, @@ -855,8 +852,8 @@ DECLARE_SOA_TABLE_STAGED(V0CoresBase, "V0CORE", //! core information about decay v0data::IsPhotonTPConly); // extended table with expression columns that can be used as arguments of dynamic columns -DECLARE_SOA_EXTENDED_TABLE_USER(V0Cores, V0CoresBase, "V0COREEXT", //! - v0data::Px, v0data::Py, v0data::Pz, v0data::Pt, v0data::P, v0data::Phi, v0data::Eta); // the table name has here to be the one with EXT which is not nice and under study +// DECLARE_SOA_EXTENDED_TABLE_USER(V0Cores, V0CoresBase, "V0COREEXT", //! +// v0data::Px, v0data::Py, v0data::Pz, v0data::Pt, v0data::P, v0data::Phi, v0data::Eta); // the table name has here to be the one with EXT which is not nice and under study // // extended table with expression columns that can be used as arguments of dynamic columns // DECLARE_SOA_EXTENDED_TABLE_USER(StoredV0Cores, StoredV0CoresBase, "V0COREEXT", //! @@ -894,10 +891,17 @@ DECLARE_SOA_TABLE_FULL(StoredV0fCCores, "V0fCCores", "AOD", "V0FCCORE", //! core v0data::V0CosPA, v0data::DCAV0ToPV, v0data::V0Type, // Dynamic columns + v0data::Px, + v0data::Py, + v0data::Pz, + v0data::Pt, + v0data::P, + v0data::Phi, + v0data::Eta, v0data::PtHypertriton, v0data::PtAntiHypertriton, v0data::V0Radius, - v0data::DistOverTotMom, + v0data::DistOverTotMom, v0data::Alpha, v0data::QtArm, v0data::PsiPair, @@ -914,11 +918,11 @@ DECLARE_SOA_TABLE_FULL(StoredV0fCCores, "V0fCCores", "AOD", "V0FCCORE", //! core v0data::M, // Longitudinal - v0data::YK0Short, - v0data::YLambda, + v0data::YK0Short, + v0data::YLambda, v0data::YHypertriton, v0data::YAntiHypertriton, - v0data::Rapidity, + v0data::Rapidity, v0data::NegativePt, v0data::PositivePt, v0data::NegativeEta, @@ -930,8 +934,8 @@ DECLARE_SOA_TABLE_FULL(StoredV0fCCores, "V0fCCores", "AOD", "V0FCCORE", //! core o2::soa::Marker<2>); // extended table with expression columns that can be used as arguments of dynamic columns -DECLARE_SOA_EXTENDED_TABLE_USER(V0fCCores, StoredV0fCCores, "V0FCCOREEXT", //! - v0data::Px, v0data::Py, v0data::Pz, v0data::Pt, v0data::P, v0data::Phi, v0data::Eta); // the table name has here to be the one with EXT which is not nice and under study +// DECLARE_SOA_EXTENDED_TABLE_USER(V0fCCores, StoredV0fCCores, "V0FCCOREEXT", //! +// v0data::Px, v0data::Py, v0data::Pz, v0data::Pt, v0data::P, v0data::Phi, v0data::Eta); // the table name has here to be the one with EXT which is not nice and under study DECLARE_SOA_TABLE_FULL(V0fCCovs, "V0fCCovs", "AOD", "V0FCCOVS", //! V0 covariance matrices v0data::PositionCovMat, v0data::MomentumCovMat, o2::soa::Marker<2>); @@ -1001,6 +1005,9 @@ DECLARE_SOA_TABLE(GeAntiLambda, "AOD", "GeAntiLambda", v0data::GeneratedAntiLamb DECLARE_SOA_TABLE_STAGED(V0MCMothers, "V0MCMOTHER", //! optional table for MC mothers o2::soa::Index<>, v0data::MotherMCPartId); +using V0fCCores = StoredV0fCCores; +using V0Cores = V0CoresBase; + using V0MCCores = V0MCCores_002; using StoredV0MCCores = StoredV0MCCores_002; @@ -1263,13 +1270,20 @@ DECLARE_SOA_DYNAMIC_COLUMN(CascRadius, cascradius, //! // CosPAs DECLARE_SOA_DYNAMIC_COLUMN(V0CosPA, v0cosPA, //! - [](float Xlambda, float Ylambda, float Zlambda, float PxLambda, float PyLambda, float PzLambda, float pvX, float pvY, float pvZ) -> float { return RecoDecay::cpa(std::array{pvX, pvY, pvZ}, std::array{Xlambda, Ylambda, Zlambda}, std::array{PxLambda, PyLambda, PzLambda}); }); + [](float Xlambda, float Ylambda, float Zlambda, float pxPos, float pyPos, float pzPos, float pxNeg, float pyNeg, float pzNeg, float pvX, float pvY, float pvZ) -> float { + return RecoDecay::cpa(std::array{pvX, pvY, pvZ}, std::array{Xlambda, Ylambda, Zlambda}, std::array{pxPos + pxNeg, pyPos + pyNeg, pzPos + pzNeg}); + }); // DECLARE_SOA_DYNAMIC_COLUMN(CascCosPA, casccosPA, //! // [](float X, float Y, float Z, float Px, float Py, float Pz, float pvX, float pvY, float pvZ) -> float { return RecoDecay::cpa(std::array{pvX, pvY, pvZ}, std::array{X, Y, Z}, std::array{Px, Py, Pz}); }); DECLARE_SOA_DYNAMIC_COLUMN(CascCosPA, casccosPA, //! [](float X, float Y, float Z, float PxBach, float PxPos, float PxNeg, float PyBach, float PyPos, float PyNeg, float PzBach, float PzPos, float PzNeg, float pvX, float pvY, float pvZ) -> float { return RecoDecay::cpa(std::array{pvX, pvY, pvZ}, std::array{X, Y, Z}, std::array{PxBach + PxPos + PxNeg, PyBach + PyPos + PyNeg, PzBach + PzPos + PzNeg}); }); DECLARE_SOA_DYNAMIC_COLUMN(DCAV0ToPV, dcav0topv, //! - [](float X, float Y, float Z, float Px, float Py, float Pz, float pvX, float pvY, float pvZ) -> float { return std::sqrt((std::pow((pvY - Y) * Pz - (pvZ - Z) * Py, 2) + std::pow((pvX - X) * Pz - (pvZ - Z) * Px, 2) + std::pow((pvX - X) * Py - (pvY - Y) * Px, 2)) / (Px * Px + Py * Py + Pz * Pz)); }); + [](float X, float Y, float Z, float pxpos, float pypos, float pzpos, float pxneg, float pyneg, float pzneg, float pvX, float pvY, float pvZ) -> float { + float px = pxpos + pxneg; + float py = pypos + pyneg; + float pz = pzpos + pzneg; + return std::sqrt((std::pow((pvY - Y) * pz - (pvZ - Z) * py, 2) + std::pow((pvX - X) * pz - (pvZ - Z) * px, 2) + std::pow((pvX - X) * py - (pvY - Y) * px, 2)) / (px * px + py * py + pz * pz)); + }); // Calculated on the fly with mass assumption + dynamic tables DECLARE_SOA_DYNAMIC_COLUMN(MLambda, mLambda, //! @@ -1332,42 +1346,22 @@ DECLARE_SOA_DYNAMIC_COLUMN(BachelorPtMC, bachelorptMC, //! bachelor daughter pT [](float pxBachMC, float pyBachMC) -> float { return RecoDecay::sqrtSumOfSquares(pxBachMC, pyBachMC); }); DECLARE_SOA_DYNAMIC_COLUMN(PtMC, ptMC, //! cascade pT [](float pxMC, float pyMC) -> float { return RecoDecay::sqrtSumOfSquares(pxMC, pyMC); }); -} // namespace cascdata -//______________________________________________________ -// EXPRESSION COLUMNS FOR TRACASCCORES -namespace cascdataext -{ -DECLARE_SOA_EXPRESSION_COLUMN(PxLambda, pxlambda, //! - float, 1.f * aod::cascdata::pxpos + 1.f * aod::cascdata::pxneg); -DECLARE_SOA_EXPRESSION_COLUMN(PyLambda, pylambda, //! - float, 1.f * aod::cascdata::pypos + 1.f * aod::cascdata::pyneg); -DECLARE_SOA_EXPRESSION_COLUMN(PzLambda, pzlambda, //! - float, 1.f * aod::cascdata::pzpos + 1.f * aod::cascdata::pzneg); -DECLARE_SOA_EXPRESSION_COLUMN(Pt, pt, float, //! Transverse momentum in GeV/c - nsqrt(aod::cascdata::px* aod::cascdata::px + - aod::cascdata::py * aod::cascdata::py)); -DECLARE_SOA_EXPRESSION_COLUMN(P, p, float, //! Total momentum in GeV/c - nsqrt(aod::cascdata::px* aod::cascdata::px + - aod::cascdata::py * aod::cascdata::py + - aod::cascdata::pz * aod::cascdata::pz)); -DECLARE_SOA_EXPRESSION_COLUMN(Phi, phi, float, //! Phi in the range [0, 2pi) - o2::constants::math::PI + natan2(-1.0f * aod::cascdata::py, -1.0f * aod::cascdata::px)); -DECLARE_SOA_EXPRESSION_COLUMN(Eta, eta, float, //! Pseudorapidity, conditionally defined to avoid FPEs - ifnode((nsqrt(aod::cascdata::px * aod::cascdata::px + - aod::cascdata::py * aod::cascdata::py + - aod::cascdata::pz * aod::cascdata::pz) - - aod::cascdata::pz) < static_cast(1e-7), - ifnode(aod::cascdata::pz < 0.f, -100.f, 100.f), - 0.5f * nlog((nsqrt(aod::cascdata::px * aod::cascdata::px + - aod::cascdata::py * aod::cascdata::py + - aod::cascdata::pz * aod::cascdata::pz) + - aod::cascdata::pz) / - (nsqrt(aod::cascdata::px * aod::cascdata::px + - aod::cascdata::py * aod::cascdata::py + - aod::cascdata::pz * aod::cascdata::pz) - - aod::cascdata::pz)))); -} // namespace cascdataext +DECLARE_SOA_DYNAMIC_COLUMN(PxLambda, pxlambda, //! Lambda daughter px + [](float pxPos, float pxNeg) -> float { return pxPos + pxNeg; }); +DECLARE_SOA_DYNAMIC_COLUMN(PyLambda, pylambda, //! Lambda daughter py + [](float pyPos, float pyNeg) -> float { return pyPos + pyNeg; }); +DECLARE_SOA_DYNAMIC_COLUMN(PzLambda, pzlambda, //! Lambda daughter pz + [](float pzPos, float pzNeg) -> float { return pzPos + pzNeg; }); +DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, //! Cascade transverse momentum in GeV/c + [](float px, float py) -> float { return RecoDecay::sqrtSumOfSquares(px, py); }); +DECLARE_SOA_DYNAMIC_COLUMN(P, p, //! Cascade total momentum in GeV/c + [](float px, float py, float pz) -> float { return RecoDecay::sqrtSumOfSquares(px, py, pz); }); +DECLARE_SOA_DYNAMIC_COLUMN(Phi, phi, //! Cascade phi in the range [0, 2pi) + [](float px, float py) -> float { return RecoDecay::phi(px, py); }); +DECLARE_SOA_DYNAMIC_COLUMN(Eta, eta, //! Cascade pseudorapidity + [](float px, float py, float pz) -> float { return RecoDecay::eta(std::array{px, py, pz}); }); +} // namespace cascdata //______________________________________________________ // Cascade data model: @@ -1413,11 +1407,18 @@ DECLARE_SOA_TABLE(StoredCascCores, "AOD", "CASCCORE", //! core information about cascdata::DCAPosToPV, cascdata::DCANegToPV, cascdata::DCABachToPV, cascdata::DCAXYCascToPV, cascdata::DCAZCascToPV, // Dynamic columns + cascdata::PxLambda, + cascdata::PyLambda, + cascdata::PzLambda, + cascdata::Pt, + cascdata::P, + cascdata::Phi, + cascdata::Eta, cascdata::V0Radius, cascdata::CascRadius, - cascdata::V0CosPA, + cascdata::V0CosPA, cascdata::CascCosPA, - cascdata::DCAV0ToPV, + cascdata::DCAV0ToPV, // Invariant masses cascdata::MLambda, @@ -1456,11 +1457,18 @@ DECLARE_SOA_TABLE(StoredKFCascCores, "AOD", "KFCASCCORE", //! kfcascdata::MLambda, cascdata::KFV0Chi2, cascdata::KFCascadeChi2, // Dynamic columns + cascdata::PxLambda, + cascdata::PyLambda, + cascdata::PzLambda, + cascdata::Pt, + cascdata::P, + cascdata::Phi, + cascdata::Eta, cascdata::V0Radius, cascdata::CascRadius, - cascdata::V0CosPA, + cascdata::V0CosPA, cascdata::CascCosPA, - cascdata::DCAV0ToPV, + cascdata::DCAV0ToPV, // Invariant masses cascdata::M, @@ -1494,11 +1502,18 @@ DECLARE_SOA_TABLE(StoredTraCascCores, "AOD", "TRACASCCORE", //! cascdata::MatchingChi2, cascdata::TopologyChi2, cascdata::ItsClsSize, // Dynamic columns + cascdata::PxLambda, + cascdata::PyLambda, + cascdata::PzLambda, + cascdata::Pt, + cascdata::P, + cascdata::Phi, + cascdata::Eta, cascdata::V0Radius, cascdata::CascRadius, - cascdata::V0CosPA, + cascdata::V0CosPA, cascdata::CascCosPA, - cascdata::DCAV0ToPV, + cascdata::DCAV0ToPV, // Invariant masses cascdata::MLambda, @@ -1568,19 +1583,9 @@ DECLARE_SOA_TABLE(TraCascCovs, "AOD", "TRACASCCOVS", //! cascdata::MomentumCovMat, o2::soa::Marker<2>); -// extended table with expression columns that can be used as arguments of dynamic columns -DECLARE_SOA_EXTENDED_TABLE_USER(CascCores, StoredCascCores, "CascDATAEXT", //! - cascdataext::PxLambda, cascdataext::PyLambda, cascdataext::PzLambda, cascdataext::Pt, cascdataext::P, cascdataext::Eta, cascdataext::Phi); - -// extended table with expression columns that can be used as arguments of dynamic columns -DECLARE_SOA_EXTENDED_TABLE_USER(KFCascCores, StoredKFCascCores, "KFCascDATAEXT", //! - cascdataext::PxLambda, cascdataext::PyLambda, cascdataext::PzLambda, - cascdataext::Pt, cascdataext::P, cascdataext::Eta, cascdataext::Phi); - -// extended table with expression columns that can be used as arguments of dynamic columns -DECLARE_SOA_EXTENDED_TABLE_USER(TraCascCores, StoredTraCascCores, "TraCascDATAEXT", //! - cascdataext::PxLambda, cascdataext::PyLambda, cascdataext::PzLambda, - cascdataext::Pt, cascdataext::P, cascdataext::Eta, cascdataext::Phi); +using CascCores = StoredCascCores; +using KFCascCores = StoredKFCascCores; +using TraCascCores = StoredTraCascCores; namespace cascdata { diff --git a/PWGLF/TableProducer/Strangeness/cascadebuilder.cxx b/PWGLF/TableProducer/Strangeness/cascadebuilder.cxx index 453072b6b30..b4a19e6660b 100644 --- a/PWGLF/TableProducer/Strangeness/cascadebuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/cascadebuilder.cxx @@ -2388,14 +2388,6 @@ struct cascadePreselector { //*>-~-<*>-~-<*>-~-<*>-~-<*>-~-<*>-~-<*>-~-<*>-~-<* }; -/// Extends the cascdata table with expression columns -struct cascadeInitializer { - Spawns cascdataext; - Spawns kfcascdataext; - Spawns tracascdataext; - void init(InitContext const&) {} -}; - struct cascadeLinkBuilder { Produces cascdataLink; @@ -2482,7 +2474,6 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) return WorkflowSpec{ adaptAnalysisTask(cfgc), adaptAnalysisTask(cfgc), - adaptAnalysisTask(cfgc), adaptAnalysisTask(cfgc), adaptAnalysisTask(cfgc), adaptAnalysisTask(cfgc)}; diff --git a/PWGLF/TableProducer/Strangeness/cascadefinder.cxx b/PWGLF/TableProducer/Strangeness/cascadefinder.cxx index fcb0479fca2..3901d3f14c3 100644 --- a/PWGLF/TableProducer/Strangeness/cascadefinder.cxx +++ b/PWGLF/TableProducer/Strangeness/cascadefinder.cxx @@ -430,17 +430,10 @@ struct cascadefinderQA { } }; -/// Extends the cascdata table with expression columns -struct cascadeinitializer { - Spawns cascdataext; - void init(InitContext const&) {} -}; - WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ adaptAnalysisTask(cfgc, TaskName{"lf-cascadeprefilter"}), adaptAnalysisTask(cfgc, TaskName{"lf-cascadefinder"}), - adaptAnalysisTask(cfgc, TaskName{"lf-cascadefinderQA"}), - adaptAnalysisTask(cfgc, TaskName{"lf-cascadeinitializer"})}; + adaptAnalysisTask(cfgc, TaskName{"lf-cascadefinderQA"})}; } diff --git a/PWGLF/TableProducer/Strangeness/cascadespawner.cxx b/PWGLF/TableProducer/Strangeness/cascadespawner.cxx index dc004b91e78..ab3f4cb7c3d 100644 --- a/PWGLF/TableProducer/Strangeness/cascadespawner.cxx +++ b/PWGLF/TableProducer/Strangeness/cascadespawner.cxx @@ -35,7 +35,7 @@ using namespace o2::framework::expressions; /// Extends the cascdata table with expression columns struct cascadespawner { - Spawns cascdataext; + // Spawns cascdataext; void init(InitContext const&) {} }; diff --git a/PWGLF/TableProducer/Strangeness/lambdakzerobuilder.cxx b/PWGLF/TableProducer/Strangeness/lambdakzerobuilder.cxx index bcf2c1268e2..7b898bfa98e 100644 --- a/PWGLF/TableProducer/Strangeness/lambdakzerobuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/lambdakzerobuilder.cxx @@ -1808,18 +1808,10 @@ struct lambdakzeroV0DataLinkBuilder { PROCESS_SWITCH(lambdakzeroV0DataLinkBuilder, processFindable, "process findable V0s", false); }; -// Extends the v0data table with expression columns -struct lambdakzeroInitializer { - Spawns v0cores; - Spawns v0fccores; - void init(InitContext const&) {} -}; - WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ adaptAnalysisTask(cfgc), adaptAnalysisTask(cfgc), - adaptAnalysisTask(cfgc), - adaptAnalysisTask(cfgc)}; + adaptAnalysisTask(cfgc)}; } diff --git a/PWGLF/TableProducer/Strangeness/lambdakzerofinder.cxx b/PWGLF/TableProducer/Strangeness/lambdakzerofinder.cxx index 60d331ea61d..e75c72c77f4 100644 --- a/PWGLF/TableProducer/Strangeness/lambdakzerofinder.cxx +++ b/PWGLF/TableProducer/Strangeness/lambdakzerofinder.cxx @@ -429,17 +429,10 @@ struct lambdakzerofinderQa { PROCESS_SWITCH(lambdakzerofinderQa, processRun2, "Process Run 2 data", false); }; -/// Extends the v0data table with expression columns -struct lambdakzeroinitializer { - Spawns v0cores; - void init(InitContext const&) {} -}; - WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ adaptAnalysisTask(cfgc, TaskName{"lf-lambdakzeroprefilter"}), adaptAnalysisTask(cfgc, TaskName{"lf-lambdakzerofinder"}), - adaptAnalysisTask(cfgc, TaskName{"lf-lambdakzerofinderQA"}), - adaptAnalysisTask(cfgc, TaskName{"lf-lambdakzeroinitializer"})}; + adaptAnalysisTask(cfgc, TaskName{"lf-lambdakzerofinderQA"})}; } diff --git a/PWGLF/TableProducer/Strangeness/lambdakzerospawner.cxx b/PWGLF/TableProducer/Strangeness/lambdakzerospawner.cxx index 7ec0b4cc010..19c174aef7f 100644 --- a/PWGLF/TableProducer/Strangeness/lambdakzerospawner.cxx +++ b/PWGLF/TableProducer/Strangeness/lambdakzerospawner.cxx @@ -35,7 +35,7 @@ using namespace o2::framework::expressions; // Extends the v0data table with expression columns struct lambdakzerospawner { - Spawns v0cores; + // Spawns v0cores; void init(InitContext const&) {} }; diff --git a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx index f00a1e646dc..22bc5c6a6e6 100644 --- a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx @@ -2644,18 +2644,8 @@ struct StrangenessBuilder { PROCESS_SWITCH(StrangenessBuilder, processMonteCarloRun2WithPID, "process monte carlo (Run 2)", false); }; -// Extends the v0data table with expression columns -struct strangenessbuilderInitializer { - Spawns v0cores; - Spawns cascdataext; - Spawns kfcascdataext; - Spawns tracascdataext; - void init(InitContext const&) {} -}; - WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc), - adaptAnalysisTask(cfgc)}; + adaptAnalysisTask(cfgc)}; } From cacd269374196a72f5548d4794435db298d56f98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Wed, 4 Jun 2025 13:30:16 +0200 Subject: [PATCH 1505/1650] [ALICE3] A3: update protection of DetLayer (#11381) --- ALICE3/Core/DelphesO2LutWriter.cxx | 75 ++++++++++++++++++- ALICE3/Core/DelphesO2LutWriter.h | 3 +- ALICE3/Core/DetLayer.cxx | 72 ++++++++++++++++++ ALICE3/Core/DetLayer.h | 52 ++++++++++++- ALICE3/Core/FastTracker.cxx | 77 +++++++++++--------- ALICE3/Core/FastTracker.h | 8 +- ALICE3/TableProducer/OTF/onTheFlyTracker.cxx | 8 +- 7 files changed, 249 insertions(+), 46 deletions(-) diff --git a/ALICE3/Core/DelphesO2LutWriter.cxx b/ALICE3/Core/DelphesO2LutWriter.cxx index 6f079c7ece1..65608d592e9 100644 --- a/ALICE3/Core/DelphesO2LutWriter.cxx +++ b/ALICE3/Core/DelphesO2LutWriter.cxx @@ -26,6 +26,7 @@ #include "iostream" #include "TMatrixD.h" #include "TVectorD.h" +#include "TAxis.h" #include "TMatrixDSymEigen.h" #include "TDatabasePDG.h" #include "TLorentzVector.h" @@ -55,7 +56,8 @@ bool DelphesO2LutWriter::fatSolve(lutEntry_t& lutEntry, const float mass, int itof, int otof, - int q) + int q, + const float nch) { lutEntry.valid = false; @@ -63,9 +65,9 @@ bool DelphesO2LutWriter::fatSolve(lutEntry_t& lutEntry, tlv.SetPtEtaPhiM(pt, eta, 0., mass); o2::track::TrackParCov trkIn; o2::upgrade::convertTLorentzVectorToO2Track(q, tlv, {0., 0., 0.}, trkIn); - o2::track::TrackParCov trkOut; - if (fat.FastTrack(trkIn, trkOut, 1) < 0) { + const int status = fat.FastTrack(trkIn, trkOut, nch); + if (status <= 0) { Printf(" --- fatSolve: FastTrack failed --- \n"); tlv.Print(); return false; @@ -234,6 +236,9 @@ void DelphesO2LutWriter::lutWrite(const char* filename, int pdg, float field, in lutEntry_t lutEntry; // write entries + int nCalls = 0; + int successfullCalls = 0; + int failedCalls = 0; for (int inch = 0; inch < nnch; ++inch) { Printf(" --- writing nch = %d/%d", inch, nnch); auto nch = lutHeader.nchmap.eval(inch); @@ -242,6 +247,7 @@ void DelphesO2LutWriter::lutWrite(const char* filename, int pdg, float field, in for (int irad = 0; irad < nrad; ++irad) { Printf(" --- writing irad = %d/%d", irad, nrad); for (int ieta = 0; ieta < neta; ++ieta) { + nCalls++; Printf(" --- writing ieta = %d/%d", ieta, neta); auto eta = lutHeader.etamap.eval(ieta); lutEntry.eta = lutHeader.etamap.eval(ieta); @@ -252,6 +258,7 @@ void DelphesO2LutWriter::lutWrite(const char* filename, int pdg, float field, in if (std::fabs(eta) <= etaMaxBarrel) { // full lever arm ends at etaMaxBarrel Printf("Solving in the barrel"); // printf(" --- fatSolve: pt = %f, eta = %f, mass = %f, field=%f \n", lutEntry.pt, lutEntry.eta, lutHeader.mass, lutHeader.field); + successfullCalls++; if (!fatSolve(lutEntry, lutEntry.pt, lutEntry.eta, lutHeader.mass, itof, otof, q)) { // printf(" --- fatSolve: error \n"); lutEntry.valid = false; @@ -260,6 +267,8 @@ void DelphesO2LutWriter::lutWrite(const char* filename, int pdg, float field, in for (int i = 0; i < 15; ++i) { lutEntry.covm[i] = 0.; } + successfullCalls--; + failedCalls++; } } else { Printf("Solving outside the barrel"); @@ -267,6 +276,7 @@ void DelphesO2LutWriter::lutWrite(const char* filename, int pdg, float field, in lutEntry.eff = 1.; lutEntry.eff2 = 1.; bool retval = true; + successfullCalls++; if (useFlatDipole) { // Using the parametrization at the border of the barrel retval = fatSolve(lutEntry, lutEntry.pt, etaMaxBarrel, lutHeader.mass, itof, otof, q); } else if (usePara) { @@ -288,6 +298,8 @@ void DelphesO2LutWriter::lutWrite(const char* filename, int pdg, float field, in for (int i = 0; i < 15; ++i) { lutEntry.covm[i] = 0.; } + successfullCalls--; + failedCalls++; } } Printf("Diagonalizing"); @@ -298,6 +310,8 @@ void DelphesO2LutWriter::lutWrite(const char* filename, int pdg, float field, in } } } + Printf(" --- finished writing LUT file %s", filename); + Printf(" --- successfull calls: %d/%d, failed calls: %d/%d", successfullCalls, nCalls, failedCalls, nCalls); lutFile.close(); } @@ -331,10 +345,13 @@ void DelphesO2LutWriter::diagonalise(lutEntry_t& lutEntry) TGraph* DelphesO2LutWriter::lutRead(const char* filename, int pdg, int what, int vs, float nch, float radius, float eta, float pt) { + Printf(" --- reading LUT file %s", filename); + // vs static const int kNch = 0; static const int kEta = 1; static const int kPt = 2; + // what static const int kEfficiency = 0; static const int kEfficiency2 = 1; static const int kEfficiencyInnerTOF = 2; @@ -360,6 +377,58 @@ TGraph* DelphesO2LutWriter::lutRead(const char* filename, int pdg, int what, int } auto nbins = lutMap.nbins; auto g = new TGraph(); + g->SetName(Form("lut_%s_%d_vs_%d_what_%d", filename, pdg, vs, what)); + g->SetTitle(Form("LUT for %s, pdg %d, vs %d, what %d", filename, pdg, vs, what)); + switch (vs) { + case kNch: + Printf(" --- vs = kNch"); + g->GetXaxis()->SetTitle("Nch"); + break; + case kEta: + Printf(" --- vs = kEta"); + g->GetXaxis()->SetTitle("#eta"); + break; + case kPt: + Printf(" --- vs = kPt"); + g->GetXaxis()->SetTitle("p_{T} (GeV/c)"); + break; + default: + Printf(" --- error: unknown vs %d", vs); + return nullptr; + } + switch (what) { + case kEfficiency: + Printf(" --- what = kEfficiency"); + g->GetYaxis()->SetTitle("Efficiency (%)"); + break; + case kEfficiency2: + Printf(" --- what = kEfficiency2"); + g->GetYaxis()->SetTitle("Efficiency2 (%)"); + break; + case kEfficiencyInnerTOF: + Printf(" --- what = kEfficiencyInnerTOF"); + g->GetYaxis()->SetTitle("Inner TOF Efficiency (%)"); + break; + case kEfficiencyOuterTOF: + Printf(" --- what = kEfficiencyOuterTOF"); + g->GetYaxis()->SetTitle("Outer TOF Efficiency (%)"); + break; + case kPtResolution: + Printf(" --- what = kPtResolution"); + g->GetYaxis()->SetTitle("p_{T} Resolution (%)"); + break; + case kRPhiResolution: + Printf(" --- what = kRPhiResolution"); + g->GetYaxis()->SetTitle("R#phi Resolution (#mum)"); + break; + case kZResolution: + Printf(" --- what = kZResolution"); + g->GetYaxis()->SetTitle("Z Resolution (#mum)"); + break; + default: + Printf(" --- error: unknown what %d", what); + return nullptr; + } bool canBeInvalid = true; for (int i = 0; i < nbins; ++i) { diff --git a/ALICE3/Core/DelphesO2LutWriter.h b/ALICE3/Core/DelphesO2LutWriter.h index e4b979a46cd..25faf7f382c 100644 --- a/ALICE3/Core/DelphesO2LutWriter.h +++ b/ALICE3/Core/DelphesO2LutWriter.h @@ -55,7 +55,8 @@ class DelphesO2LutWriter const float mass = 0.13957000, int itof = 0, int otof = 0, - int q = 1); + int q = 1, + const float nch = 1); bool fwdSolve(float* covm, float pt = 0.1, float eta = 0.0, float mass = 0.13957000); bool fwdPara(lutEntry_t& lutEntry, float pt = 0.1, float eta = 0.0, float mass = 0.13957000, float Bfield = 0.5); void lutWrite(const char* filename = "lutCovm.dat", int pdg = 211, float field = 0.2, int itof = 0, int otof = 0); diff --git a/ALICE3/Core/DetLayer.cxx b/ALICE3/Core/DetLayer.cxx index 392356b1e5a..25e61e6e6d5 100644 --- a/ALICE3/Core/DetLayer.cxx +++ b/ALICE3/Core/DetLayer.cxx @@ -16,4 +16,76 @@ /// \brief Basic struct to hold information regarding a detector layer to be used in fast simulation /// +#include +#include + #include "DetLayer.h" + +namespace o2::fastsim +{ + +// Parametric constructor +DetLayer::DetLayer(const TString& name_, + float r_, + float z_, + float x0_, + float xrho_, + float resRPhi_, + float resZ_, + float eff_, + int type_) + : name(name_), + r(r_), + z(z_), + x0(x0_), + xrho(xrho_), + resRPhi(resRPhi_), + resZ(resZ_), + eff(eff_), + type(type_) +{ +} + +DetLayer::DetLayer(const DetLayer& other) + : name(other.name), r(other.r), z(other.z), x0(other.x0), xrho(other.xrho), resRPhi(other.resRPhi), resZ(other.resZ), eff(other.eff), type(other.type) +{ +} + +std::string DetLayer::toString() const +{ + std::string out = ""; + out.append("DetLayer: "); + out.append(name.Data()); + out.append(" | r: "); + out.append(std::to_string(r)); + out.append(" cm | z: "); + out.append(std::to_string(z)); + out.append(" cm | x0: "); + out.append(std::to_string(x0)); + out.append(" cm | xrho: "); + out.append(std::to_string(xrho)); + out.append(" g/cm^3 | resRPhi: "); + out.append(std::to_string(resRPhi)); + out.append(" cm | resZ: "); + out.append(std::to_string(resZ)); + out.append(" cm | eff: "); + out.append(std::to_string(eff)); + out.append(" | type: "); + switch (type) { + case layerInert: + out.append("Inert"); + break; + case layerSilicon: + out.append("Silicon"); + break; + case layerGas: + out.append("Gas/TPC"); + break; + default: + out.append("Unknown"); + break; + } + return out; +} + +} // namespace o2::fastsim diff --git a/ALICE3/Core/DetLayer.h b/ALICE3/Core/DetLayer.h index 6b9fea14c06..2577c73e42d 100644 --- a/ALICE3/Core/DetLayer.h +++ b/ALICE3/Core/DetLayer.h @@ -19,12 +19,59 @@ #ifndef ALICE3_CORE_DETLAYER_H_ #define ALICE3_CORE_DETLAYER_H_ +#include + #include "TString.h" namespace o2::fastsim { struct DetLayer { + public: + // Default constructor + DetLayer() = default; + // Parametric constructor + DetLayer(const TString& name_, float r_, float z_, float x0_, float xrho_, + float resRPhi_ = 0.0f, float resZ_ = 0.0f, float eff_ = 0.0f, int type_ = layerInert); + // Copy constructor + DetLayer(const DetLayer& other); + + // Setters + void setName(const TString& name_) { name = name_; } + void setRadius(float r_) { r = r_; } + void setZ(float z_) { z = z_; } + void setRadiationLength(float x0_) { x0 = x0_; } + void setDensity(float xrho_) { xrho = xrho_; } + void setResolutionRPhi(float resRPhi_) { resRPhi = resRPhi_; } + void setResolutionZ(float resZ_) { resZ = resZ_; } + void setEfficiency(float eff_) { eff = eff_; } + void setType(int type_) { type = type_; } + + // Getters + float getRadius() const { return r; } + float getZ() const { return z; } + float getRadiationLength() const { return x0; } + float getDensity() const { return xrho; } + float getResolutionRPhi() const { return resRPhi; } + float getResolutionZ() const { return resZ; } + float getEfficiency() const { return eff; } + int getType() const { return type; } + const TString& getName() const { return name; } + + // Check layer type + bool isInert() const { return type == layerInert; } + bool isSilicon() const { return type == layerSilicon; } + bool isGas() const { return type == layerGas; } + + // Utilities + std::string toString() const; + friend std::ostream& operator<<(std::ostream& os, const DetLayer& layer) + { + os << layer.toString(); + return os; + } + + private: // TString for holding name TString name; @@ -44,7 +91,10 @@ struct DetLayer { float eff; // detection efficiency // layer type - int type; // 0: undefined/inert, 1: silicon, 2: gas/tpc + int type; // 0: undefined/inert, 1: silicon, 2: gas/tpc + static constexpr int layerInert = 0; // inert/undefined layer + static constexpr int layerSilicon = 1; // silicon layer + static constexpr int layerGas = 2; // gas/tpc layer }; } // namespace o2::fastsim diff --git a/ALICE3/Core/FastTracker.cxx b/ALICE3/Core/FastTracker.cxx index 6b22461c187..1d06958504b 100644 --- a/ALICE3/Core/FastTracker.cxx +++ b/ALICE3/Core/FastTracker.cxx @@ -30,7 +30,6 @@ FastTracker::FastTracker() magneticField = 20; // in kiloGauss applyZacceptance = false; applyMSCorrection = true; - applyMSCorrection = true; applyElossCorrection = true; applyEffCorrection = true; covMatFactor = 0.99f; @@ -57,7 +56,11 @@ FastTracker::FastTracker() void FastTracker::AddLayer(TString name, float r, float z, float x0, float xrho, float resRPhi, float resZ, float eff, int type) { - DetLayer newLayer{name.Data(), r, z, x0, xrho, resRPhi, resZ, eff, type}; + DetLayer newLayer(name, r, z, x0, xrho, resRPhi, resZ, eff, type); + // Check that efficient layers are not inert layers + if (newLayer.getEfficiency() > 0.0f && newLayer.isInert()) { + LOG(error) << "Layer " << name << " with efficiency > 0.0 should not be inert"; + } layers.push_back(newLayer); } @@ -66,7 +69,7 @@ DetLayer FastTracker::GetLayer(int layer, bool ignoreBarrelLayers) const int layerIdx = layer; if (ignoreBarrelLayers) { for (int il = 0, trackingLayerIdx = 0; trackingLayerIdx <= layer; il++) { - if (layers[il].type == 0) + if (layers[il].isInert()) continue; trackingLayerIdx++; layerIdx = il; @@ -79,11 +82,12 @@ int FastTracker::GetLayerIndex(std::string name) const { int i = 0; for (const auto& layer : layers) { - if (layer.name == name) { + if (layer.getName() == name) { return i; } i++; } + LOG(error) << "Layer with name " << name << " not found in FastTracker layers"; return -1; } @@ -93,8 +97,7 @@ void FastTracker::Print() LOG(info) << "+-~-<*>-~-+-~-<*>-~-+-~-<*>-~-+-~-<*>-~-+-~-<*>-~-+-~-<*>-~-+-~-<*>-~-+"; LOG(info) << " Printing detector layout with " << layers.size() << " effective elements: "; for (uint32_t il = 0; il < layers.size(); il++) { - LOG(info) << " Layer #" << il << "\t" << layers[il].name.Data() << "\tr = " << Form("%.2f", layers[il].r) << "cm\tz = " << layers[il].z << "\t" - << "x0 = " << layers[il].x0 << "\txrho = " << layers[il].xrho << "\tresRPhi = " << layers[il].resRPhi << "\tresZ = " << layers[il].resZ << "\teff = " << layers[il].eff; + LOG(info) << " Layer #" << il << "\t" << layers[il]; } LOG(info) << "+-~-<*>-~-+-~-<*>-~-+-~-<*>-~-+-~-<*>-~-+-~-<*>-~-+-~-<*>-~-+-~-<*>-~-+"; } @@ -310,6 +313,7 @@ int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackPa const int xrhosteps = 100; const bool applyAngularCorrection = true; + goodHitProbability.clear(); for (int i = 0; i < kMaxNumberOfDetectors; ++i) goodHitProbability.push_back(-1.); goodHitProbability[0] = 1.; @@ -321,32 +325,35 @@ int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackPa new (&outputTrack)(o2::track::TrackParCov)(inputTrack); for (uint32_t il = 0; il < layers.size(); il++) { // check if layer is doable - if (layers[il].r < initialRadius) + if (layers[il].getRadius() < initialRadius) continue; // this layer should not be attempted, but go ahead // check if layer is reached float targetX = 1e+3; bool ok = true; - inputTrack.getXatLabR(layers[il].r, targetX, magneticField); - if (targetX > 999) + inputTrack.getXatLabR(layers[il].getRadius(), targetX, magneticField); + if (targetX > 999.f) { + LOGF(debug, "Failed to find intercept for layer %d at radius %.2f cm", il, layers[il].getRadius()); break; // failed to find intercept + } ok = inputTrack.propagateTo(targetX, magneticField); - if (ok && applyMSCorrection && layers[il].x0 > 0) { - ok = inputTrack.correctForMaterial(layers[il].x0, 0, applyAngularCorrection); + if (ok && applyMSCorrection && layers[il].getRadiationLength() > 0) { + ok = inputTrack.correctForMaterial(layers[il].getRadiationLength(), 0, applyAngularCorrection); } - if (ok && applyElossCorrection && layers[il].xrho > 0) { // correct in small steps + if (ok && applyElossCorrection && layers[il].getDensity() > 0) { // correct in small steps for (int ise = xrhosteps; ise--;) { - ok = inputTrack.correctForMaterial(0, -layers[il].xrho / xrhosteps, applyAngularCorrection); + ok = inputTrack.correctForMaterial(0, -layers[il].getDensity() / xrhosteps, applyAngularCorrection); if (!ok) break; } } + LOGF(debug, "Propagation was %s up to layer %d", ok ? "successful" : "unsuccessful", il); // was there a problem on this layer? if (!ok && il > 0) { // may fail to reach target layer due to the eloss float rad2 = inputTrack.getX() * inputTrack.getX() + inputTrack.getY() * inputTrack.getY(); - float maxR = layers[il - 1].r + kTrackingMargin * 2; + float maxR = layers[il - 1].getRadius() + kTrackingMargin * 2; float minRad = (fMinRadTrack > 0 && fMinRadTrack < maxR) ? fMinRadTrack : maxR; if (rad2 - minRad * minRad < kTrackingMargin * kTrackingMargin) { // check previously reached layer return -5; // did not reach min requested layer @@ -354,16 +361,20 @@ int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackPa break; } } - if (std::abs(inputTrack.getZ()) > layers[il].z && applyZacceptance) { + if (std::abs(inputTrack.getZ()) > layers[il].getZ() && applyZacceptance) { break; // out of acceptance bounds } - if (layers[il].type == 0) + if (layers[il].isInert()) { + LOG(info) << "Skipping inert layer: " << layers[il].getName() << " at radius " << layers[il].getRadius() << " cm"; continue; // inert layer, skip + } // layer is reached - if (firstLayerReached < 0) + if (firstLayerReached < 0) { + LOGF(debug, "First layer reached: %d", il); firstLayerReached = il; + } lastLayerReached = il; nIntercepts++; } @@ -415,7 +426,7 @@ int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackPa for (int il = lastLayerReached; il >= firstLayerReached; il--) { float targetX = 1e+3; - inputTrack.getXatLabR(layers[il].r, targetX, magneticField); + inputTrack.getXatLabR(layers[il].getRadius(), targetX, magneticField); if (targetX > 999) continue; // failed to find intercept @@ -423,7 +434,7 @@ int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackPa continue; // failed to propagate } - if (std::abs(inputTrack.getZ()) > layers[il].z && applyZacceptance) { + if (std::abs(inputTrack.getZ()) > layers[il].getZ() && applyZacceptance) { continue; // out of acceptance bounds but continue inwards } @@ -441,46 +452,46 @@ int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackPa if (!inwardTrack.propagateTo(xyz1[0], magneticField)) continue; - if (layers[il].type != 0) { // only update covm for tracker hits + if (!layers[il].isInert()) { // only update covm for tracker hits const o2::track::TrackParametrization::dim2_t hitpoint = { static_cast(xyz1[1]), static_cast(xyz1[2])}; - const o2::track::TrackParametrization::dim3_t hitpointcov = {layers[il].resRPhi * layers[il].resRPhi, 0.f, layers[il].resZ * layers[il].resZ}; + const o2::track::TrackParametrization::dim3_t hitpointcov = {layers[il].getResolutionRPhi() * layers[il].getResolutionRPhi(), 0.f, layers[il].getResolutionZ() * layers[il].getResolutionZ()}; inwardTrack.update(hitpoint, hitpointcov); inwardTrack.checkCovariance(); } - if (applyMSCorrection && layers[il].x0 > 0) { - if (!inputTrack.correctForMaterial(layers[il].x0, 0, applyAngularCorrection)) { + if (applyMSCorrection && layers[il].getRadiationLength() > 0) { + if (!inputTrack.correctForMaterial(layers[il].getRadiationLength(), 0, applyAngularCorrection)) { return -6; } - if (!inwardTrack.correctForMaterial(layers[il].x0, 0, applyAngularCorrection)) { + if (!inwardTrack.correctForMaterial(layers[il].getRadiationLength(), 0, applyAngularCorrection)) { return -6; } } - if (applyElossCorrection && layers[il].xrho > 0) { + if (applyElossCorrection && layers[il].getDensity() > 0) { for (int ise = xrhosteps; ise--;) { // correct in small steps - if (!inputTrack.correctForMaterial(0, layers[il].xrho / xrhosteps, applyAngularCorrection)) { + if (!inputTrack.correctForMaterial(0, layers[il].getDensity() / xrhosteps, applyAngularCorrection)) { return -7; } - if (!inwardTrack.correctForMaterial(0, layers[il].xrho / xrhosteps, applyAngularCorrection)) { + if (!inwardTrack.correctForMaterial(0, layers[il].getDensity() / xrhosteps, applyAngularCorrection)) { return -7; } } } - if (layers[il].type == 1) + if (layers[il].isSilicon()) nSiliconPoints++; // count silicon hits - if (layers[il].type == 2) + if (layers[il].isGas()) nGasPoints++; // count TPC/gas hits hits.push_back(thisHit); - if (applyEffCorrection && layers[il].type != 0) { // good hit probability calculation - double sigYCmb = o2::math_utils::sqrt(inwardTrack.getSigmaY2() + layers[il].resRPhi * layers[il].resRPhi); - double sigZCmb = o2::math_utils::sqrt(inwardTrack.getSigmaZ2() + layers[il].resZ * layers[il].resZ); - goodHitProbability[il] = ProbGoodChiSqHit(layers[il].r * 100, sigYCmb * 100, sigZCmb * 100); + if (applyEffCorrection && !layers[il].isInert()) { // good hit probability calculation + double sigYCmb = o2::math_utils::sqrt(inwardTrack.getSigmaY2() + layers[il].getResolutionRPhi() * layers[il].getResolutionRPhi()); + double sigZCmb = o2::math_utils::sqrt(inwardTrack.getSigmaZ2() + layers[il].getResolutionZ() * layers[il].getResolutionZ()); + goodHitProbability[il] = ProbGoodChiSqHit(layers[il].getRadius() * 100, sigYCmb * 100, sigZCmb * 100); goodHitProbability[0] *= goodHitProbability[il]; } } diff --git a/ALICE3/Core/FastTracker.h b/ALICE3/Core/FastTracker.h index f88b6c5ae85..702caa9e84b 100644 --- a/ALICE3/Core/FastTracker.h +++ b/ALICE3/Core/FastTracker.h @@ -39,10 +39,10 @@ class FastTracker void AddLayer(TString name, float r, float z, float x0, float xrho, float resRPhi = 0.0f, float resZ = 0.0f, float eff = 0.0f, int type = 0); DetLayer GetLayer(const int layer, bool ignoreBarrelLayers = true) const; int GetLayerIndex(const std::string name) const; - void SetRadiationLength(const std::string layerName, float x0) { layers[GetLayerIndex(layerName)].x0 = x0; } - void SetRadius(const std::string layerName, float r) { layers[GetLayerIndex(layerName)].r = r; } - void SetResolutionRPhi(const std::string layerName, float resRPhi) { layers[GetLayerIndex(layerName)].resRPhi = resRPhi; } - void SetResolutionZ(const std::string layerName, float resZ) { layers[GetLayerIndex(layerName)].resZ = resZ; } + void SetRadiationLength(const std::string layerName, float x0) { layers[GetLayerIndex(layerName)].setRadiationLength(x0); } + void SetRadius(const std::string layerName, float r) { layers[GetLayerIndex(layerName)].setRadius(r); } + void SetResolutionRPhi(const std::string layerName, float resRPhi) { layers[GetLayerIndex(layerName)].setResolutionRPhi(resRPhi); } + void SetResolutionZ(const std::string layerName, float resZ) { layers[GetLayerIndex(layerName)].setResolutionZ(resZ); } void SetResolution(const std::string layerName, float resRPhi, float resZ) { SetResolutionRPhi(layerName, resRPhi); diff --git a/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx b/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx index 989295f8c54..ff804b8485a 100644 --- a/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx +++ b/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx @@ -811,11 +811,11 @@ struct OnTheFlyTracker { float phi{std::atan2(-posClusterCandidate[1], -posClusterCandidate[0]) + o2::its::constants::math::Pi}; o2::fastsim::DetLayer currentTrackingLayer = fastTracker.GetLayer(i); - if (currentTrackingLayer.resRPhi > 1e-8 && currentTrackingLayer.resZ > 1e-8) { // catch zero (though should not really happen...) - phi = gRandom->Gaus(phi, std::asin(currentTrackingLayer.resRPhi / r)); + if (currentTrackingLayer.getResolutionRPhi() > 1e-8 && currentTrackingLayer.getResolutionZ() > 1e-8) { // catch zero (though should not really happen...) + phi = gRandom->Gaus(phi, std::asin(currentTrackingLayer.getResolutionRPhi() / r)); posClusterCandidate[0] = r * std::cos(phi); posClusterCandidate[1] = r * std::sin(phi); - posClusterCandidate[2] = gRandom->Gaus(posClusterCandidate[2], currentTrackingLayer.resZ); + posClusterCandidate[2] = gRandom->Gaus(posClusterCandidate[2], currentTrackingLayer.getResolutionZ()); } if (std::isnan(phi)) @@ -833,7 +833,7 @@ struct OnTheFlyTracker { const o2::track::TrackParametrization::dim2_t hitpoint = { static_cast(xyz1[1]), static_cast(xyz1[2])}; - const o2::track::TrackParametrization::dim3_t hitpointcov = {currentTrackingLayer.resRPhi * currentTrackingLayer.resRPhi, 0.f, currentTrackingLayer.resZ * currentTrackingLayer.resZ}; + const o2::track::TrackParametrization::dim3_t hitpointcov = {currentTrackingLayer.getResolutionRPhi() * currentTrackingLayer.getResolutionRPhi(), 0.f, currentTrackingLayer.getResolutionZ() * currentTrackingLayer.getResolutionZ()}; cascadeTrack.update(hitpoint, hitpointcov); thisCascade.foundClusters++; // add to findable } From fd1249dd86885af476f6adcaae3ab03df48397fd Mon Sep 17 00:00:00 2001 From: GijsvWeelden <55794847+GijsvWeelden@users.noreply.github.com> Date: Wed, 4 Jun 2025 14:48:52 +0200 Subject: [PATCH 1506/1650] [PWGJE] V0 Jet Finder: use V0 signal flags (#11190) --- PWGJE/Core/JetFindingUtilities.h | 5 ++++- PWGJE/DataModel/Jet.h | 5 +++-- PWGJE/JetFinders/jetFinderV0.cxx | 7 ++++--- PWGJE/Tasks/jetFragmentation.cxx | 4 ++-- PWGJE/Tasks/v0QA.cxx | 4 ++-- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/PWGJE/Core/JetFindingUtilities.h b/PWGJE/Core/JetFindingUtilities.h index d99c84ecbbf..ac81338a99d 100644 --- a/PWGJE/Core/JetFindingUtilities.h +++ b/PWGJE/Core/JetFindingUtilities.h @@ -224,7 +224,7 @@ bool analyseCandidateMC(std::vector& inputParticles, T const * @param v0s V0 candidates */ template -bool analyseV0s(std::vector& inputParticles, T const& v0s, float v0PtMin, float v0PtMax, float v0YMin, float v0YMax, int v0Index) +bool analyseV0s(std::vector& inputParticles, T const& v0s, float v0PtMin, float v0PtMax, float v0YMin, float v0YMax, int v0Index, bool useV0SignalFlags) { float v0Mass = 0; float v0Y = -10.0; @@ -235,6 +235,9 @@ bool analyseV0s(std::vector& inputParticles, T const& v0s, f v0Mass = v0.m(); v0Y = v0.y(); } else { + if (useV0SignalFlags && v0.isRejectedCandidate()) { + continue; + } if (v0Index == 0) { v0Mass = o2::constants::physics::MassKaonNeutral; } diff --git a/PWGJE/DataModel/Jet.h b/PWGJE/DataModel/Jet.h index 8db401ffc48..57731df23ba 100644 --- a/PWGJE/DataModel/Jet.h +++ b/PWGJE/DataModel/Jet.h @@ -35,6 +35,7 @@ #include "PWGHF/DataModel/DerivedTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGLF/DataModel/LFStrangenessTables.h" +#include "PWGLF/DataModel/V0SelectorTables.h" #include "PWGDQ/DataModel/ReducedInfoTables.h" namespace o2::aod @@ -244,8 +245,8 @@ using JetParticlesSubBplus = JMcParticleBplusSubs; using McCollisionsBplus = o2::soa::Join; using CandidatesBplusMCP = o2::soa::Join; -using CandidatesV0Data = o2::soa::Join; -using CandidatesV0MCD = o2::soa::Join; +using CandidatesV0Data = o2::soa::Join; +using CandidatesV0MCD = o2::soa::Join; // using V0Daughters = DauTrackExtras; using McCollisionsV0 = o2::soa::Join; using CandidatesV0MCP = o2::soa::Join; diff --git a/PWGJE/JetFinders/jetFinderV0.cxx b/PWGJE/JetFinders/jetFinderV0.cxx index 560968ce0fd..ece753369d9 100644 --- a/PWGJE/JetFinders/jetFinderV0.cxx +++ b/PWGJE/JetFinders/jetFinderV0.cxx @@ -37,6 +37,7 @@ #include "PWGJE/Core/JetFindingUtilities.h" #include "PWGJE/DataModel/Jet.h" #include "PWGJE/DataModel/JetReducedData.h" +#include "PWGLF/DataModel/V0SelectorTables.h" using namespace o2; using namespace o2::framework; @@ -93,6 +94,7 @@ struct JetFinderV0Task { Configurable jetPtBinWidth{"jetPtBinWidth", 5, "used to define the width of the jetPt bins for the THnSparse"}; Configurable fillTHnSparse{"fillTHnSparse", true, "switch to fill the THnSparse"}; Configurable jetExtraParam{"jetExtraParam", -99.0, "sets the _extra_param in fastjet"}; + Configurable useV0SignalFlags{"useV0SignalFlags", true, "use V0 signal flags table"}; Service pdgDatabase; int trackSelection = -1; @@ -161,7 +163,6 @@ struct JetFinderV0Task { Filter mcCollisionFilter = ((skipMBGapEvents.node() == false) || (aod::jmccollision::subGeneratorId != static_cast(jetderiveddatautilities::JCollisionSubGeneratorId::mbGap))); // should we add a posZ vtx cut here or leave it to analysers? Filter trackCuts = (aod::jtrack::pt >= trackPtMin && aod::jtrack::pt < trackPtMax && aod::jtrack::eta >= trackEtaMin && aod::jtrack::eta <= trackEtaMax && aod::jtrack::phi >= trackPhiMin && aod::jtrack::phi <= trackPhiMax); Filter partCuts = (aod::jmcparticle::pt >= trackPtMin && aod::jmcparticle::pt < trackPtMax && aod::jmcparticle::eta >= trackEtaMin && aod::jmcparticle::eta <= trackEtaMax && aod::jmcparticle::phi >= trackPhiMin && aod::jmcparticle::phi <= trackPhiMax); - // Filter candidateCuts = (aod::hfcand::pt >= candPtMin && aod::hfcand::pt < candPtMax && aod::hfcand::y >= candYMin && aod::hfcand::y < candYMax); // function that generalically processes Data and reco level events template @@ -171,7 +172,7 @@ struct JetFinderV0Task { return; } inputParticles.clear(); - if (!jetfindingutilities::analyseV0s(inputParticles, candidates, candPtMin, candPtMax, candYMin, candYMax, candIndex)) { + if (!jetfindingutilities::analyseV0s(inputParticles, candidates, candPtMin, candPtMax, candYMin, candYMax, candIndex, useV0SignalFlags)) { return; } @@ -192,7 +193,7 @@ struct JetFinderV0Task { { inputParticles.clear(); - if (!jetfindingutilities::analyseV0s(inputParticles, candidates, candPtMin, candPtMax, candYMin, candYMax, candIndex)) { + if (!jetfindingutilities::analyseV0s(inputParticles, candidates, candPtMin, candPtMax, candYMin, candYMax, candIndex, useV0SignalFlags)) { return; } jetfindingutilities::analyseParticles(inputParticles, particleSelection, jetTypeParticleLevel, particles, pdgDatabase, &candidates); diff --git a/PWGJE/Tasks/jetFragmentation.cxx b/PWGJE/Tasks/jetFragmentation.cxx index c181254819f..18d5dea2c56 100644 --- a/PWGJE/Tasks/jetFragmentation.cxx +++ b/PWGJE/Tasks/jetFragmentation.cxx @@ -56,9 +56,9 @@ using MatchedMCPJetsWithConstituents = soa::Join; -using CandidatesV0DataWithFlags = soa::Join; +using CandidatesV0DataWithFlags = aod::CandidatesV0Data; -using CandidatesV0MCDWithLabelsAndFlags = soa::Join; +using CandidatesV0MCDWithLabelsAndFlags = soa::Join; using MCDV0Jets = aod::V0ChargedMCDetectorLevelJets; using MCDV0JetsWithConstituents = soa::Join; using MatchedMCDV0Jets = soa::Join; diff --git a/PWGJE/Tasks/v0QA.cxx b/PWGJE/Tasks/v0QA.cxx index 6966c3b0101..8d8d0ab2cfc 100644 --- a/PWGJE/Tasks/v0QA.cxx +++ b/PWGJE/Tasks/v0QA.cxx @@ -47,7 +47,7 @@ using MCDV0JetsWithConstituents = soa::Join; using MatchedMCDV0JetsWithConstituents = soa::Join; -using CandidatesV0MCDWithFlags = soa::Join; +using CandidatesV0MCDWithFlags = soa::Join; using MCPV0Jets = aod::V0ChargedMCParticleLevelJets; using MCPV0JetsWithConstituents = soa::Join; @@ -1221,7 +1221,7 @@ struct V0QA { using DaughterJTracks = soa::Join; using DaughterTracks = soa::Join; - void processV0TrackQA(aod::JetCollision const& /*jcoll*/, soa::Join const& v0s, DaughterJTracks const&, DaughterTracks const&) + void processV0TrackQA(aod::JetCollision const& /*jcoll*/, aod::CandidatesV0Data const& v0s, DaughterJTracks const&, DaughterTracks const&) { // if (!jetderiveddatautilities::selectCollision(jcoll, eventSelectionBits)) { // return; From 69a62a04f0a7eea71a560d1906efaafb5ad6d2df Mon Sep 17 00:00:00 2001 From: Archita-Dash <91664849+Archita-Dash@users.noreply.github.com> Date: Wed, 4 Jun 2025 14:50:42 +0200 Subject: [PATCH 1507/1650] [PWGJE] separation of process functions for MCD and Data tables for Tracks and Multiplicities + Refactoring of the task (#11175) Co-authored-by: ALICE Action Bot --- PWGJE/Tasks/CMakeLists.txt | 4 +- ...ullJetSpectraPP.cxx => fullJetSpectra.cxx} | 1026 +++++++++++++---- 2 files changed, 822 insertions(+), 208 deletions(-) rename PWGJE/Tasks/{fullJetSpectraPP.cxx => fullJetSpectra.cxx} (52%) diff --git a/PWGJE/Tasks/CMakeLists.txt b/PWGJE/Tasks/CMakeLists.txt index 1a0854a2fbf..0e39c04445a 100644 --- a/PWGJE/Tasks/CMakeLists.txt +++ b/PWGJE/Tasks/CMakeLists.txt @@ -241,8 +241,8 @@ if(FastJet_FOUND) SOURCES statPromptPhoton.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore COMPONENT_NAME Analysis) - o2physics_add_dpl_workflow(full-jet-spectra-pp - SOURCES fullJetSpectraPP.cxx + o2physics_add_dpl_workflow(full-jet-spectra + SOURCES fullJetSpectra.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::PWGJECore O2Physics::AnalysisCore COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(bjet-tagging-ml diff --git a/PWGJE/Tasks/fullJetSpectraPP.cxx b/PWGJE/Tasks/fullJetSpectra.cxx similarity index 52% rename from PWGJE/Tasks/fullJetSpectraPP.cxx rename to PWGJE/Tasks/fullJetSpectra.cxx index a8eb7399502..40e233f9a90 100644 --- a/PWGJE/Tasks/fullJetSpectraPP.cxx +++ b/PWGJE/Tasks/fullJetSpectra.cxx @@ -8,14 +8,16 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. - -// FullJet Spectra in pp -// // +/// \file fullJetSpectra.cxx +/// \brief Task for full jet spectra studies in pp collisions. /// \author Archita Rani Dash + #include -#include #include +#include +#include +#include #include "CommonConstants/PhysicsConstants.h" #include "Framework/ASoA.h" @@ -25,6 +27,7 @@ #include "Framework/O2DatabasePDGPlugin.h" #include "Framework/runDataProcessing.h" #include "Framework/RunningWorkflowInfo.h" +#include "Framework/Logger.h" #include "Common/Core/TrackSelection.h" #include "Common/Core/TrackSelectionDefaults.h" @@ -51,12 +54,17 @@ using namespace o2::framework; using namespace o2::framework::expressions; // using namespace jetderiveddatautilities; -struct FullJetSpectrapp { +struct FullJetSpectra { HistogramRegistry registry; + // MC Sample split configurables + /* Configurable mcSplitSeed{"mcSplitSeed", 12345, "Seed for reproducible MC event splitting"}; + Configurable mcClosureSplitFrac{"mcClosureSplitFrac", 0.2f, "Fraction of MC events for closure test (MCD)"}; + Configurable doMcClosure{"doMcClosure", false, "Enable random splitting for MC closure test"}; + */ // Event configurables - Configurable VertexZCut{"VertexZCut", 10.0f, "Accepted z-vertex range"}; + Configurable vertexZCut{"vertexZCut", 10.0f, "Accepted z-vertex range"}; Configurable centralityMin{"centralityMin", -999.0, "minimum centrality"}; Configurable centralityMax{"centralityMax", 999.0, "maximum centrality"}; Configurable doEMCALEventWorkaround{"doEMCALEventWorkaround", false, "apply the workaround to read the EMC trigger bit by requiring a cell content in the EMCAL"}; @@ -88,8 +96,7 @@ struct FullJetSpectrapp { Configurable particleSelections{"particleSelections", "PhysicalPrimary", "set particle selections"}; // Cluster configurables - - Configurable clusterDefinitionS{"clusterDefinition", "kV3Default", "cluster definition to be selected, e.g. V3Default"}; + Configurable clusterDefinitionS{"clusterDefinitionS", "kV3Default", "cluster definition to be selected, e.g. V3Default"}; Configurable clusterEtaMin{"clusterEtaMin", -0.7, "minimum cluster eta"}; Configurable clusterEtaMax{"clusterEtaMax", 0.7, "maximum cluster eta"}; Configurable clusterPhiMin{"clusterPhiMin", 1.396, "minimum cluster phi"}; @@ -105,6 +112,8 @@ struct FullJetSpectrapp { Configurable pTHatAbsoluteMin{"pTHatAbsoluteMin", -99.0, "minimum value of pTHat"}; int trackSelection = -1; + const float kJetAreaFractionMinThreshold = -98.0f; + const float kLeadingConstituentPtMinThreshold = -98.0f; std::vector eventSelectionBits; std::vector filledJetR; std::vector jetRadiiValues; @@ -113,48 +122,109 @@ struct FullJetSpectrapp { Service pdgDatabase; + // Random splitter instance + /* TRandom3 randGen; + // float eventRandomValue = -1.0; // default invalid + // Cache to store random values per MC collision ID + std::unordered_map mcCollisionRandomValues; + */ + /* + MC CLOSURE SPLITTING LOGIC -> still not working across different process functions. Not so trivial in O2Physics Framework! + -------------------------- + • doMcClosure=true activates MC sample splitting. + • Each event gets ONE random value in [0, 1), stored in eventRandomValue. + • Events are split as: + - ≤ mcClosureSplitFrac -> Closure (MCD) + - > mcClosureSplitFrac -> Response (MCP + Matched) + • This ensures mutually exclusive processing — NO double-counting. + • eventRandomValue is reset to -1 after each event -> this is done by the `endOfEvent` defined at the end + */ + // Add Collision Histograms' Bin Labels for clarity void labelCollisionHistograms(HistogramRegistry& registry) { - if (doprocessTracks) { - auto h_collisions_unweighted = registry.get(HIST("h_collisions_unweighted")); - h_collisions_unweighted->GetXaxis()->SetBinLabel(1, "AllUnweightedDetColl"); - h_collisions_unweighted->GetXaxis()->SetBinLabel(2, "UnweightedCollWithVertexZ"); - h_collisions_unweighted->GetXaxis()->SetBinLabel(3, "EMCAcceptedUnweightedColl"); - h_collisions_unweighted->GetXaxis()->SetBinLabel(4, "UnweightedCollAfterTrackSel"); + if (doprocessDataTracks || doprocessMCTracks) { + auto hCollisionsUnweighted = registry.get(HIST("hCollisionsUnweighted")); + hCollisionsUnweighted->GetXaxis()->SetBinLabel(1, "allDetColl"); + hCollisionsUnweighted->GetXaxis()->SetBinLabel(2, "DetCollWithVertexZ"); + hCollisionsUnweighted->GetXaxis()->SetBinLabel(3, "MBRejectedDetEvents"); + hCollisionsUnweighted->GetXaxis()->SetBinLabel(4, "EventsNotSatisfyingEventSelection"); + hCollisionsUnweighted->GetXaxis()->SetBinLabel(5, "EMCreadoutDetEventsWithkTVXinEMC"); + hCollisionsUnweighted->GetXaxis()->SetBinLabel(6, "AllRejectedEventsAfterEMCEventSelection"); + hCollisionsUnweighted->GetXaxis()->SetBinLabel(7, "EMCAcceptedDetColl"); + hCollisionsUnweighted->GetXaxis()->SetBinLabel(8, "EMCAcceptedCollAfterTrackSel"); } if (doprocessTracksWeighted) { - auto h_collisions_weighted = registry.get(HIST("h_collisions_weighted")); - h_collisions_weighted->GetXaxis()->SetBinLabel(1, "AllWeightedDetColl"); - h_collisions_weighted->GetXaxis()->SetBinLabel(2, "WeightedCollWithVertexZ"); - h_collisions_weighted->GetXaxis()->SetBinLabel(3, "EMCAcceptedWeightedColl"); - h_collisions_weighted->GetXaxis()->SetBinLabel(4, "WeightedCollAfterTrackSel"); + auto hCollisionsWeighted = registry.get(HIST("hCollisionsWeighted")); + hCollisionsWeighted->GetXaxis()->SetBinLabel(1, "AllWeightedDetColl"); + hCollisionsWeighted->GetXaxis()->SetBinLabel(2, "WeightedCollWithVertexZ"); + hCollisionsWeighted->GetXaxis()->SetBinLabel(3, "MBRejectedDetEvents"); + hCollisionsWeighted->GetXaxis()->SetBinLabel(4, "EventsNotSatisfyingEventSelection"); + hCollisionsWeighted->GetXaxis()->SetBinLabel(5, "EMCreadoutDetJJEventsWithkTVXinEMC"); + hCollisionsWeighted->GetXaxis()->SetBinLabel(6, "AllRejectedEventsAfterEMCEventSelection"); + hCollisionsWeighted->GetXaxis()->SetBinLabel(7, "EMCAcceptedWeightedDetColl"); + hCollisionsWeighted->GetXaxis()->SetBinLabel(8, "EMCAcceptedWeightedCollAfterTrackSel"); } if (doprocessJetsData || doprocessJetsMCD || doprocessJetsMCDWeighted) { - auto h_Detcollision_counter = registry.get(HIST("h_Detcollision_counter")); - h_Detcollision_counter->GetXaxis()->SetBinLabel(1, "allDetColl"); - h_Detcollision_counter->GetXaxis()->SetBinLabel(2, "DetCollWithVertexZ"); - h_Detcollision_counter->GetXaxis()->SetBinLabel(3, "EMCAcceptedDetColl"); + auto hDetcollisionCounter = registry.get(HIST("hDetcollisionCounter")); + hDetcollisionCounter->GetXaxis()->SetBinLabel(1, "allDetColl"); + hDetcollisionCounter->GetXaxis()->SetBinLabel(2, "DetCollWithVertexZ"); + hDetcollisionCounter->GetXaxis()->SetBinLabel(3, "RejectedDetCollWithOutliers"); + hDetcollisionCounter->GetXaxis()->SetBinLabel(4, "MBRejectedDetEvents"); + hDetcollisionCounter->GetXaxis()->SetBinLabel(5, "EventsNotSatisfyingEventSelection"); + hDetcollisionCounter->GetXaxis()->SetBinLabel(6, "EMCreadoutDetEventsWithkTVXinEMC"); + hDetcollisionCounter->GetXaxis()->SetBinLabel(7, "AllRejectedEventsAfterEMCEventSelection"); + hDetcollisionCounter->GetXaxis()->SetBinLabel(8, "EMCAcceptedDetColl"); } if (doprocessJetsMCP || doprocessJetsMCPWeighted) { - auto h_Partcollision_counter = registry.get(HIST("h_Partcollision_counter")); - h_Partcollision_counter->GetXaxis()->SetBinLabel(1, "allMcColl"); - h_Partcollision_counter->GetXaxis()->SetBinLabel(2, "McCollWithVertexZ"); - h_Partcollision_counter->GetXaxis()->SetBinLabel(3, "DetCollWithSize>1"); - h_Partcollision_counter->GetXaxis()->SetBinLabel(4, "EMCAcceptedDetColl"); + auto hPartcollisionCounter = registry.get(HIST("hPartcollisionCounter")); + hPartcollisionCounter->GetXaxis()->SetBinLabel(1, "allMcColl"); + hPartcollisionCounter->GetXaxis()->SetBinLabel(2, "McCollWithVertexZ"); + hPartcollisionCounter->GetXaxis()->SetBinLabel(3, "PartCollWithSize>1"); + hPartcollisionCounter->GetXaxis()->SetBinLabel(4, "RejectedPartCollForDetCollWithSize0"); + hPartcollisionCounter->GetXaxis()->SetBinLabel(5, "RejectedPartCollWithOutliers"); + hPartcollisionCounter->GetXaxis()->SetBinLabel(6, "MBRejectedPartEvents"); + hPartcollisionCounter->GetXaxis()->SetBinLabel(7, "EMCreadoutDetJJEventsWithkTVXinEMC"); + hPartcollisionCounter->GetXaxis()->SetBinLabel(8, "AllRejectedPartEventsAfterEMCEventSelection"); + hPartcollisionCounter->GetXaxis()->SetBinLabel(9, "EMCAcceptedPartColl"); } if (doprocessJetsMCPMCDMatched || doprocessJetsMCPMCDMatchedWeighted) { - auto h_Matchedcollision_counter = registry.get(HIST("h_Matchedcollision_counter")); - h_Matchedcollision_counter->GetXaxis()->SetBinLabel(1, "allDetColl"); - h_Matchedcollision_counter->GetXaxis()->SetBinLabel(2, "DetCollWithVertexZ"); - h_Matchedcollision_counter->GetXaxis()->SetBinLabel(3, "EMCAcceptedDetColl"); + auto hMatchedcollisionCounter = registry.get(HIST("hMatchedcollisionCounter")); + hMatchedcollisionCounter->GetXaxis()->SetBinLabel(1, "allDetColl"); + hMatchedcollisionCounter->GetXaxis()->SetBinLabel(2, "DetCollWithVertexZ"); + hMatchedcollisionCounter->GetXaxis()->SetBinLabel(3, "RejectedDetCollWithOutliers"); + hMatchedcollisionCounter->GetXaxis()->SetBinLabel(4, "RejectedPartCollWithOutliers"); + hMatchedcollisionCounter->GetXaxis()->SetBinLabel(5, "EMCMBRejectedDetColl"); + hMatchedcollisionCounter->GetXaxis()->SetBinLabel(6, "EventsNotSatisfyingEventSelection"); + hMatchedcollisionCounter->GetXaxis()->SetBinLabel(7, "EMCreadoutDetJJEventsWithkTVXinEMC"); + hMatchedcollisionCounter->GetXaxis()->SetBinLabel(8, "AllRejectedDetEventsAfterEMCEventSelection"); + hMatchedcollisionCounter->GetXaxis()->SetBinLabel(9, "EMCAcceptedDetColl"); + } + + if (doprocessMBCollisionsDATAWithMultiplicity || doprocessMBCollisionsWithMultiplicity || doprocessCollisionsWeightedWithMultiplicity) { + auto hEventmultiplicityCounter = registry.get(HIST("hEventmultiplicityCounter")); + hEventmultiplicityCounter->GetXaxis()->SetBinLabel(1, "allDetColl"); + hEventmultiplicityCounter->GetXaxis()->SetBinLabel(2, "DetCollWithVertexZ"); + hEventmultiplicityCounter->GetXaxis()->SetBinLabel(3, "MBRejectedDetEvents"); + hEventmultiplicityCounter->GetXaxis()->SetBinLabel(4, "EventsNotSatisfyingEventSelection"); + hEventmultiplicityCounter->GetXaxis()->SetBinLabel(5, "EMCreadoutDetEventsWithkTVXinEMC"); + hEventmultiplicityCounter->GetXaxis()->SetBinLabel(6, "AllRejectedEventsAfterEMCEventSelection"); + hEventmultiplicityCounter->GetXaxis()->SetBinLabel(7, "EMCAcceptedDetColl"); } } + // Add Bin Labels for the MC Split Event Counter + /* void labelMCSplitHistogram(HistogramRegistry& registry) { + auto hSpliteventSelector = registry.get(HIST("hSpliteventSelector")); + hSpliteventSelector->GetXaxis()->SetBinLabel(1, "MCD"); + hSpliteventSelector->GetXaxis()->SetBinLabel(2, "MCP"); + hSpliteventSelector->GetXaxis()->SetBinLabel(3, "MatchedforRM"); +} +*/ void init(o2::framework::InitContext&) { trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast(trackSelections)); @@ -162,19 +232,46 @@ struct FullJetSpectrapp { particleSelection = static_cast(particleSelections); jetRadiiValues = (std::vector)jetRadii; + /* if (doMcClosure) { + // randGen.SetSeed(mcSplitSeed); + // randGen.SetSeed(static_cast(std::time(nullptr))); + // int seed = mcSplitSeed >= 0 ? mcSplitSeed : static_cast(std::time(nullptr)); + // randGen.SetSeed(seed); + // LOGF(info, "MC closure seed = %d", seed); + + int seed = mcSplitSeed >= 0 ? mcSplitSeed : static_cast(std::time(nullptr)); + randGen.SetSeed(seed); + LOGF(info, "MC closure splitting enabled with seed = %d, split fraction = %.2f", seed, static_cast(mcClosureSplitFrac)); + + registry.add("hSpliteventSelector", "Random MC Split Selector;Split Type;Entries",{HistType::kTH1F, {{3, 0.0, 3.0}}}); // 0=MCD, 1=MCP, 2=RM + + //individual processes' event counters for sanity checks + registry.add("h_MCD_splitevent_counter", "Events into MCD split", {HistType::kTH1F, {{1, 0.0, 1.0}}}); + registry.add("h_MCP_splitevent_counter", "Events into MCP split", {HistType::kTH1F, {{1, 0.0, 1.0}}}); + registry.add("h_Matched_splitevent_counter", "Events into Matched split", {HistType::kTH1F, {{1, 0.0, 1.0}}}); + registry.add("hRandomValueDebug", "Random values for debugging;Random Value;Entries", {HistType::kTH1F, {{100, 0.0, 1.0}}}); + + // DEBUG: Add counters for total events processed (before splitting) + registry.add("h_MCD_total_events", "Total MCD events processed", {HistType::kTH1F, {{1, 0.0, 1.0}}}); + registry.add("h_MCP_total_events", "Total MCP events processed", {HistType::kTH1F, {{1, 0.0, 1.0}}}); + registry.add("h_Matched_total_events", "Total Matched events processed", {HistType::kTH1F, {{1, 0.0, 1.0}}}); + registry.add("hMCCollisionIdDebug_MCP", "MC Collision Ids being processed", {HistType::kTH1F, {{100000, 0.0, 100000.0}}}); + + } + */ for (std::size_t iJetRadius = 0; iJetRadius < jetRadiiValues.size(); iJetRadius++) { filledJetR.push_back(0.0); } auto jetRadiiBins = (std::vector)jetRadii; if (jetRadiiBins.size() > 1) { - jetRadiiBins.push_back(jetRadiiBins[jetRadiiBins.size() - 1] + (TMath::Abs(jetRadiiBins[jetRadiiBins.size() - 1] - jetRadiiBins[jetRadiiBins.size() - 2]))); + jetRadiiBins.push_back(jetRadiiBins[jetRadiiBins.size() - 1] + (std::abs(jetRadiiBins[jetRadiiBins.size() - 1] - jetRadiiBins[jetRadiiBins.size() - 2]))); } else { jetRadiiBins.push_back(jetRadiiBins[jetRadiiBins.size() - 1] + 0.1); } // Track QA histograms - if (doprocessTracks || doprocessTracksWeighted) { - registry.add("h_collisions_unweighted", "event status; event status;entries", {HistType::kTH1F, {{12, 0., 12.0}}}); + if (doprocessDataTracks || doprocessMCTracks || doprocessTracksWeighted) { + registry.add("hCollisionsUnweighted", "event status; event status;entries", {HistType::kTH1F, {{12, 0., 12.0}}}); registry.add("h_track_pt", "track pT;#it{p}_{T,track} (GeV/#it{c});entries", {HistType::kTH1F, {{350, 0., 350.}}}); registry.add("h_track_eta", "track #eta;#eta_{track};entries", {HistType::kTH1F, {{100, -1., 1.}}}); @@ -191,21 +288,22 @@ struct FullJetSpectrapp { registry.add("h_cluster_energysum", "cluster energy sum;Sum of cluster energy per event;entries", {HistType::kTH1F, {{400, 0., 400.}}}); if (doprocessTracksWeighted) { - registry.add("h_collisions_weighted", "event status;event status;entries", {HistType::kTH1F, {{12, 0.0, 12.0}}}); + registry.add("hCollisionsWeighted", "event status;event status;entries", {HistType::kTH1F, {{12, 0.0, 12.0}}}); } } // Jet QA histograms if (doprocessJetsData || doprocessJetsMCD || doprocessJetsMCDWeighted) { - registry.add("h_Detcollision_counter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.}}}); + + registry.add("hDetcollisionCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.}}}); registry.add("h_full_jet_pt", "#it{p}_{T,jet};#it{p}_{T_jet} (GeV/#it{c});entries", {HistType::kTH1F, {{350, 0., 350.}}}); registry.add("h_full_jet_pt_pTHatcut", "#it{p}_{T,jet};#it{p}_{T_jet} (GeV/#it{c});entries", {HistType::kTH1F, {{350, 0., 350.}}}); registry.add("h_full_jet_eta", "jet #eta;#eta_{jet};entries", {HistType::kTH1F, {{100, -1., 1.}}}); registry.add("h_full_jet_phi", "jet #varphi;#varphi_{jet};entries", {HistType::kTH1F, {{160, 0., 7.}}}); registry.add("h_full_jet_clusterTime", "Time of cluster", HistType::kTH1F, {{500, -250, 250, "#it{t}_{cls} (ns)"}}); - registry.add("h2_full_jet_NEF", "#it{p}_{T,jet} vs NEF at Det Level; #it{p}_{T,jet} (GeV/#it{c});NEF", {HistType::kTH2F, {{350, 0., 350.}, {105, 0., 1.05}}}); - registry.add("h2_full_jet_NEF_rejected", "#it{p}_{T,jet} vs NEF at Det Level for rejected events; #it{p}_{T,jet} (GeV/#it{c});NEF", {HistType::kTH2F, {{350, 0., 350.}, {105, 0., 1.05}}}); + registry.add("h2_full_jet_nef", "#it{p}_{T,jet} vs nef at Det Level; #it{p}_{T,jet} (GeV/#it{c});nef", {HistType::kTH2F, {{350, 0., 350.}, {105, 0., 1.05}}}); + registry.add("h2_full_jet_nef_rejected", "#it{p}_{T,jet} vs nef at Det Level for rejected events; #it{p}_{T,jet} (GeV/#it{c});nef", {HistType::kTH2F, {{350, 0., 350.}, {105, 0., 1.05}}}); registry.add("h_Detjet_ntracks", "#it{p}_{T,track};#it{p}_{T,track} (GeV/#it{c});entries", {HistType::kTH1F, {{350, 0., 350.}}}); registry.add("h2_full_jet_chargedconstituents", "Number of charged constituents at Det Level;#it{p}_{T,jet} (GeV/#it{c});N_{ch}", {HistType::kTH2F, {{350, 0., 350.}, {100, 0., 100.}}}); @@ -228,14 +326,14 @@ struct FullJetSpectrapp { registry.add("h2_jet_etaphi", "jet #eta vs jet #varphi; #eta_{jet};#varphi_{jet}", {HistType::kTH2F, {{100, -1., 1.}, {160, -1., 7.}}}); } if (doprocessJetsMCP || doprocessJetsMCPWeighted) { - registry.add("h_Partcollision_counter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); + registry.add("hPartcollisionCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); registry.add("h_full_mcpjet_tablesize", "", {HistType::kTH1F, {{4, 0., 5.}}}); registry.add("h_full_mcpjet_ntracks", "", {HistType::kTH1F, {{200, -0.5, 200.}}}); registry.add("h_full_jet_pt_part", "jet pT;#it{p}_{T_jet} (GeV/#it{c});entries", {HistType::kTH1F, {{350, 0., 350.}}}); registry.add("h_full_jet_eta_part", "jet #eta;#eta_{jet};entries", {HistType::kTH1F, {{100, -1., 1.}}}); registry.add("h_full_jet_phi_part", "jet #varphi;#varphi_{jet};entries", {HistType::kTH1F, {{160, 0., 7.}}}); - registry.add("h2_full_jet_NEF_part", "#it{p}_{T,jet} vs NEF at Part Level;#it{p}_{T,jet} (GeV/#it{c});NEF", {HistType::kTH2F, {{350, 0., 350.}, {105, 0., 1.05}}}); + registry.add("h2_full_jet_nef_part", "#it{p}_{T,jet} vs nef at Part Level;#it{p}_{T,jet} (GeV/#it{c});nef", {HistType::kTH2F, {{350, 0., 350.}, {105, 0., 1.05}}}); registry.add("h_Partjet_ntracks", "#it{p}_{T,constituent};#it{p}_{T_constituent} (GeV/#it{c});entries", {HistType::kTH1F, {{350, 0., 350.}}}); registry.add("h2_full_jet_chargedconstituents_part", "Number of charged constituents at Part Level;#it{p}_{T,jet} (GeV/#it{c});N_{ch}", {HistType::kTH2F, {{350, 0., 350.}, {100, 0., 100.}}}); @@ -253,12 +351,18 @@ struct FullJetSpectrapp { registry.add("h2_track_etaphi_part", "jet_track #eta vs jet_track #varphi; #eta_{track};#varphi_{track}", {HistType::kTH2F, {{500, -5., 5.}, {160, -1., 7.}}}); registry.add("h2_jet_etaphi_part", "jet #eta vs jet #varphi; #eta_{jet};#varphi_{jet}", {HistType::kTH2F, {{100, -1., 1.}, {160, -1., 7.}}}); - registry.add("h_NOmcpemcalcollisions", "event status;entries", {HistType::kTH1F, {{100, 0., 100.}}}); - registry.add("h_mcpemcalcollisions", "event status;entries", {HistType::kTH1F, {{100, 0., 100.}}}); + // registry.add("h_NOmcpemcalcollisions", "event status;entries", {HistType::kTH1F, {{100, 0., 100.}}}); + // registry.add("h_mcpemcalcollisions", "event status;entries", {HistType::kTH1F, {{100, 0., 100.}}}); + registry.add("h2_full_mcpjetOutsideFiducial_pt", "MCP jet outside EMC Fiducial Acceptance #it{p}_{T,part};#it{p}_{T,part} (GeV/c); Ncounts", {HistType::kTH2F, {{350, 0., 350.}, {10000, 0., 10000.}}}); + registry.add("h_full_mcpjetOutside_eta_part", "MCP jet #eta outside EMC Fiducial Acceptance;#eta_{jet};entries", {HistType::kTH1F, {{100, -1., 1.}}}); + registry.add("h_full_mcpjetOutside_phi_part", "MCP jet #varphi outside EMC Fiducial Acceptance;#varphi_{jet};entries", {HistType::kTH1F, {{160, 0., 7.}}}); + registry.add("h2_full_mcpjetInsideFiducial_pt", "MCP jet #it{p}_{T,part} inside EMC Fiducial Acceptance;#it{p}_{T,part} (GeV/c); Ncounts", {HistType::kTH2F, {{350, 0., 350.}, {10000, 0., 10000.}}}); + registry.add("h_full_mcpjetInside_eta_part", "MCP jet #eta inside EMC Fiducial Acceptance;#eta_{jet};entries", {HistType::kTH1F, {{100, -1., 1.}}}); + registry.add("h_full_mcpjetInside_phi_part", "MCP jet #varphi inside EMC Fiducial Acceptance;#varphi_{jet};entries", {HistType::kTH1F, {{160, 0., 7.}}}); } if (doprocessJetsMCPMCDMatched || doprocessJetsMCPMCDMatchedWeighted) { - registry.add("h_Matchedcollision_counter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); + registry.add("hMatchedcollisionCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); registry.add("h_full_matchedmcdjet_tablesize", "", {HistType::kTH1F, {{350, 0., 350.}}}); registry.add("h_full_matchedmcpjet_tablesize", "", {HistType::kTH1F, {{350, 0., 350.}}}); @@ -286,23 +390,49 @@ struct FullJetSpectrapp { registry.add("h2_full_jet_energyscaleChargedVsFullPart", "Jet Energy Scale (charged part, vs. full jet pt); p_{T,part} (GeV/c); (p_{T,det} - p_{T,part})/p_{T,part}", {HistType::kTH2F, {{400, 0., 400.}, {200, -1., 1.}}}); registry.add("h2_full_jet_energyscaleNeutralVsFullPart", "Jet Energy Scale (neutral part, vs. full jet pt); p_{T,part} (GeV/c); (p_{T,det} - p_{T,part})/p_{T,part}", {HistType::kTH2F, {{400, 0., 400.}, {200, -1., 1.}}}); registry.add("h2_full_fakemcdjets", "Fake MCD Jets; p_{T,det} (GeV/c); NCounts", {HistType::kTH2F, {{350, 0., 350.}, {100, 0., 100.}}}); - registry.add("h2_full_fakemcpjets", "Fake MCP Jets; p_{T,part} (GeV/c); NCounts", {HistType::kTH2F, {{350, 0., 350.}, {100, 0., 100.}}}); + registry.add("h2FullfakeMcpJets", "Fake MCP Jets; p_{T,part} (GeV/c); NCounts", {HistType::kTH2F, {{350, 0., 350.}, {100, 0., 100.}}}); + registry.add("h2_full_matchedmcpjet_pt", "Matched MCP jet in EMC Fiducial Acceptance #it{p}_{T,part};#it{p}_{T,part} (GeV/c); Ncounts", {HistType::kTH2F, {{350, 0., 350.}, {10000, 0., 10000.}}}); + // Response Matrix registry.add("h_full_jet_ResponseMatrix", "Full Jets Response Matrix; p_{T,det} (GeV/c); p_{T,part} (GeV/c)", {HistType::kTH2F, {{350, 0., 350.}, {350, 0., 350.}}}); } - if (doprocessCollisionsWeightedWithMultiplicity || doprocessMBCollisionsWithMultiplicity) { + if (doprocessCollisionsWeightedWithMultiplicity || doprocessMBCollisionsWithMultiplicity || doprocessMBCollisionsDATAWithMultiplicity) { + registry.add("hEventmultiplicityCounter", "event status;event status;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); registry.add("h_FT0Mults_occupancy", "", {HistType::kTH1F, {{3500, 0., 3500.}}}); registry.add("h2_full_jet_FT0Amplitude", "; FT0C Amplitude; Counts", {HistType::kTH1F, {{3500, 0., 3500.}}}); registry.add("h2_full_jet_jetpTDetVsFT0Mults", "; p_{T,det} (GeV/c); FT0C Multiplicity", {HistType::kTH2F, {{350, 0., 350.}, {3500, 0., 3500.}}}); - registry.add("h3_full_jet_jetpTDet_FT0Mults_NEF", "; p_{T,det} (GeV/c); FT0C Multiplicity, NEF", {HistType::kTH3F, {{350, 0., 350.}, {3500, 0., 3500.}, {105, 0.0, 1.05}}}); + registry.add("h3_full_jet_jetpTDet_FT0Mults_nef", "; p_{T,det} (GeV/c); FT0C Multiplicity, nef", {HistType::kTH3F, {{350, 0., 350.}, {3500, 0., 3500.}, {105, 0.0, 1.05}}}); } // Label the histograms labelCollisionHistograms(registry); + // labelMCSplitHistogram(registry); } // init + // Get or generate random value for a specific MC collision + /* float getMCCollisionRandomValue(int64_t mcCollisionId) { + if (!doMcClosure) return 0.0f; + + // Check if I already have a random value for this MC collision + auto it = mcCollisionRandomValues.find(mcCollisionId); + if (it != mcCollisionRandomValues.end()) { + LOGF(debug, "Using cached random value %.4f for MC collision %lld", it->second, mcCollisionId); + return it->second; + } + + // Generate new random value for this MC collision + float randomVal = randGen.Uniform(0.0, 1.0); + mcCollisionRandomValues[mcCollisionId] = randomVal; + + // Debug histogram + registry.fill(HIST("hRandomValueDebug"), randomVal); + + LOGF(info, "Generated NEW random value %.4f for MC collision %lld", randomVal, mcCollisionId); + return randomVal; + } + */ using EMCCollisionsData = o2::soa::Join; // JetCollisions with EMCAL Collision Labels using EMCCollisionsMCD = o2::soa::Join; // where, JetCollisionsMCD = JetCollisions+JMcCollisionLbs @@ -313,33 +443,33 @@ struct FullJetSpectrapp { using JetTableMCPWeightedJoined = soa::Join; using JetTableMCDMatchedJoined = soa::Join; - using JetTableMCPMatchedJoined = soa::Join; + using jetMcpPerMcCollision = soa::Join; using JetTableMCDMatchedWeightedJoined = soa::Join; using JetTableMCPMatchedWeightedJoined = soa::Join; // Applying some cuts(filters) on collisions, tracks, clusters - Filter eventCuts = (nabs(aod::jcollision::posZ) < VertexZCut && aod::jcollision::centrality >= centralityMin && aod::jcollision::centrality < centralityMax); - // Filter EMCeventCuts = (nabs(aod::collision::posZ) < VertexZCut && aod::collision::centrality >= centralityMin && aod::collision::centrality < centralityMax); + Filter eventCuts = (nabs(aod::jcollision::posZ) < vertexZCut && aod::jcollision::centrality >= centralityMin && aod::jcollision::centrality < centralityMax); + // Filter EMCeventCuts = (nabs(aod::collision::posZ) < vertexZCut && aod::collision::centrality >= centralityMin && aod::collision::centrality < centralityMax); Filter trackCuts = (aod::jtrack::pt >= trackpTMin && aod::jtrack::pt < trackpTMax && aod::jtrack::eta > trackEtaMin && aod::jtrack::eta < trackEtaMax && aod::jtrack::phi >= trackPhiMin && aod::jtrack::phi <= trackPhiMax); aod::EMCALClusterDefinition clusterDefinition = aod::emcalcluster::getClusterDefinitionFromString(clusterDefinitionS.value); Filter clusterFilter = (aod::jcluster::definition == static_cast(clusterDefinition) && aod::jcluster::eta > clusterEtaMin && aod::jcluster::eta < clusterEtaMax && aod::jcluster::phi >= clusterPhiMin && aod::jcluster::phi <= clusterPhiMax && aod::jcluster::energy >= clusterEnergyMin && aod::jcluster::time > clusterTimeMin && aod::jcluster::time < clusterTimeMax && (clusterRejectExotics && aod::jcluster::isExotic != true)); - Preslice JetMCPPerMcCollision = aod::jet::mcCollisionId; + Preslice JetMCPPerMcCollision = aod::jet::mcCollisionId; PresliceUnsorted> CollisionsPerMCPCollision = aod::jmccollisionlb::mcCollisionId; template bool isAcceptedJet(U const& jet) { - if (jetAreaFractionMin > -98.0) { - if (jet.area() < jetAreaFractionMin * M_PI * (jet.r() / 100.0) * (jet.r() / 100.0)) { + if (jetAreaFractionMin > kJetAreaFractionMinThreshold) { + if (jet.area() < jetAreaFractionMin * o2::constants::math::PI * (jet.r() / 100.0) * (jet.r() / 100.0)) { return false; } } - if (leadingConstituentPtMin > -98.0) { + if (leadingConstituentPtMin > kLeadingConstituentPtMinThreshold) { bool isMinleadingConstituent = false; - for (auto& constituent : jet.template tracks_as()) { + for (const auto& constituent : jet.template tracks_as()) { if (constituent.pt() >= leadingConstituentPtMin) { isMinleadingConstituent = true; break; @@ -355,11 +485,6 @@ struct FullJetSpectrapp { template void fillJetHistograms(T const& jet, float weight = 1.0) { - float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); - if (jet.pt() > pTHatMaxMCD * pTHat || pTHat < pTHatAbsoluteMin) { // for MCD jets only to remove outliers; setting pTHatMaxMCD = 1 improves purity - return; - } - float neutralEnergy = 0.0; double sumtrackE = 0.0; if (jet.r() == round(selectedJetsRadius * 100.0f)) { @@ -368,7 +493,7 @@ struct FullJetSpectrapp { registry.fill(HIST("h_full_jet_phi"), jet.phi(), weight); registry.fill(HIST("h2_jet_etaphi"), jet.eta(), jet.phi(), weight); - for (auto& cluster : jet.template clusters_as()) { + for (const auto& cluster : jet.template clusters_as()) { registry.fill(HIST("h2_full_jet_neutralconstituents"), jet.pt(), jet.clustersIds().size(), weight); neutralEnergy += cluster.energy(); @@ -380,10 +505,10 @@ struct FullJetSpectrapp { registry.fill(HIST("h_full_jet_neutralconstituents_energy"), cluster.energy(), weight); registry.fill(HIST("h_full_jet_neutralconstituents_energysum"), neutralEnergy, weight); } - auto NEF = neutralEnergy / jet.energy(); - registry.fill(HIST("h2_full_jet_NEF"), jet.pt(), NEF, weight); + auto nef = neutralEnergy / jet.energy(); + registry.fill(HIST("h2_full_jet_nef"), jet.pt(), nef, weight); - for (auto& jettrack : jet.template tracks_as()) { + for (const auto& jettrack : jet.template tracks_as()) { sumtrackE += jettrack.energy(); registry.fill(HIST("h_Detjet_ntracks"), jettrack.pt(), weight); @@ -402,30 +527,34 @@ struct FullJetSpectrapp { } // jet.r() } - // check for NEF distribution for rejected events + // check for nef distribution for rejected events template void fillRejectedJetHistograms(T const& jet, float weight = 1.0) { float neutralEnergy = 0.0; if (jet.r() == round(selectedJetsRadius * 100.0f)) { - for (auto& cluster : jet.template clusters_as()) { + for (const auto& cluster : jet.template clusters_as()) { neutralEnergy += cluster.energy(); } - auto NEF = neutralEnergy / jet.energy(); - registry.fill(HIST("h2_full_jet_NEF_rejected"), jet.pt(), NEF, weight); + auto nef = neutralEnergy / jet.energy(); + registry.fill(HIST("h2_full_jet_nef_rejected"), jet.pt(), nef, weight); } // jet.r() } template void fillMCPHistograms(T const& jet, float weight = 1.0) { - float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); - if (jet.pt() > pTHatMaxMCP * pTHat || pTHat < pTHatAbsoluteMin) { // MCP outlier rejection - return; - } float neutralEnergy = 0.0; int neutralconsts = 0; int chargedconsts = 0; + int mcpjetOutsideFid = 0; + int mcpjetInsideFid = 0; + + auto isInFiducial = [&](auto const& jet) { + return jet.eta() >= jetEtaMin && jet.eta() <= jetEtaMax && + jet.phi() >= jetPhiMin && jet.phi() <= jetPhiMax; + }; + if (jet.r() == round(selectedJetsRadius * 100.0f)) { registry.fill(HIST("h_full_mcpjet_tablesize"), jet.size(), weight); registry.fill(HIST("h_full_mcpjet_ntracks"), jet.tracksIds().size(), weight); @@ -434,7 +563,21 @@ struct FullJetSpectrapp { registry.fill(HIST("h_full_jet_phi_part"), jet.phi(), weight); registry.fill(HIST("h2_jet_etaphi_part"), jet.eta(), jet.phi(), weight); - for (auto& constituent : jet.template tracks_as()) { + if (!isInFiducial(jet)) { + // jet is outside + mcpjetOutsideFid++; + registry.fill(HIST("h2_full_mcpjetOutsideFiducial_pt"), jet.pt(), mcpjetOutsideFid, weight); + registry.fill(HIST("h_full_mcpjetOutside_eta_part"), jet.eta(), weight); + registry.fill(HIST("h_full_mcpjetOutside_phi_part"), jet.phi(), weight); + } else { + // jet is inside + mcpjetInsideFid++; + registry.fill(HIST("h2_full_mcpjetInsideFiducial_pt"), jet.pt(), mcpjetInsideFid, weight); + registry.fill(HIST("h_full_mcpjetInside_eta_part"), jet.eta(), weight); + registry.fill(HIST("h_full_mcpjetInside_phi_part"), jet.phi(), weight); + } + + for (const auto& constituent : jet.template tracks_as()) { auto pdgParticle = pdgDatabase->GetParticle(constituent.pdgCode()); if (pdgParticle->Charge() == 0) { neutralconsts++; @@ -456,19 +599,16 @@ struct FullJetSpectrapp { registry.fill(HIST("h2_track_etaphi_part"), constituent.eta(), constituent.phi(), weight); } } // constituent loop - auto NEF = neutralEnergy / jet.energy(); - registry.fill(HIST("h2_full_jet_NEF_part"), jet.pt(), NEF, weight); - } + auto nef = neutralEnergy / jet.energy(); + registry.fill(HIST("h2_full_jet_nef_part"), jet.pt(), nef, weight); + } // jet.r() } template void fillTrackHistograms(T const& tracks, U const& clusters, float weight = 1.0) { double sumtrackE = 0.0; - float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); - if (pTHat < pTHatAbsoluteMin) { // Track outlier rejection - return; - } + for (auto const& track : tracks) { if (!jetderiveddatautilities::selectTrack(track, trackSelection)) { continue; @@ -484,7 +624,7 @@ struct FullJetSpectrapp { double clusterpt = cluster.energy() / std::cosh(cluster.eta()); sumclusterE += cluster.energy(); - registry.fill(HIST("h_clusterTime"), cluster.time()); + registry.fill(HIST("h_clusterTime"), cluster.time(), weight); registry.fill(HIST("h_cluster_pt"), clusterpt, weight); registry.fill(HIST("h_cluster_eta"), cluster.eta(), weight); registry.fill(HIST("h_cluster_phi"), cluster.phi(), weight); @@ -496,20 +636,12 @@ struct FullJetSpectrapp { template void fillMatchedHistograms(T const& jetBase, float weight = 1.0) { - float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); - if (jetBase.pt() > pTHatMaxMCD * pTHat || pTHat < pTHatAbsoluteMin) { - return; - } - if (jetBase.has_matchedJetGeo()) { // geometrical jet matching only needed for pp - here,matching Base(Det.level) with Tag (Part. level) jets registry.fill(HIST("h_full_matchedmcdjet_tablesize"), jetBase.size(), weight); registry.fill(HIST("h_full_matchedmcdjet_ntracks"), jetBase.tracksIds().size(), weight); registry.fill(HIST("h2_matchedjet_etaphiDet"), jetBase.eta(), jetBase.phi(), weight); - for (auto& jetTag : jetBase.template matchedJetGeo_as>()) { - if (jetTag.pt() > pTHatMaxMCP * pTHat || pTHat < pTHatAbsoluteMin) { // MCP outlier rejection - continue; - } + for (const auto& jetTag : jetBase.template matchedJetGeo_as>()) { auto deltaEta = jetBase.eta() - jetTag.eta(); auto deltaPhi = jetBase.phi() - jetTag.phi(); auto deltaR = jetutilities::deltaR(jetBase, jetTag); @@ -537,31 +669,51 @@ struct FullJetSpectrapp { void processDummy(aod::JetCollisions const&) { } - PROCESS_SWITCH(FullJetSpectrapp, processDummy, "dummy task", true); + PROCESS_SWITCH(FullJetSpectra, processDummy, "dummy task", true); void processJetsData(soa::Filtered::iterator const& collision, FullJetTableDataJoined const& jets, aod::JetTracks const&, aod::JetClusters const&) { bool eventAccepted = false; - registry.fill(HIST("h_Detcollision_counter"), 0.5); + double weight = 1.0; + float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); - if (fabs(collision.posZ()) > VertexZCut) { + registry.fill(HIST("hDetcollisionCounter"), 0.5); // allDetColl + if (std::fabs(collision.posZ()) > vertexZCut) { return; } - registry.fill(HIST("h_Detcollision_counter"), 1.5); + registry.fill(HIST("hDetcollisionCounter"), 1.5); // DetCollWithVertexZ + + // outlier check: for every outlier jet, reject the whole event + for (auto const& jet : jets) { + if (jet.pt() > pTHatMaxMCD * pTHat || pTHat < pTHatAbsoluteMin) { // for MCD jets only to remove outliers; setting pTHatMaxMCD = 1 improves purity + registry.fill(HIST("hDetcollisionCounter"), 2.5); // RejectedDetCollWithOutliers + return; + } + // this cut only to be used for calculating Jet Purity and not for Response Matrix + // this is mainly applied to remove all high weight jets causing big fluctuations + if (jet.pt() > 1 * pTHat) { + registry.fill(HIST("h_full_jet_pt_pTHatcut"), jet.pt(), weight); + } + } + if (doMBGapTrigger && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + registry.fill(HIST("hDetcollisionCounter"), 3.5); // MBRejectedDetEvents return; } if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, doMBGapTrigger)) { + registry.fill(HIST("hDetcollisionCounter"), 4.5); // EventsNotSatisfyingEventSelection return; } if (doEMCALEventWorkaround) { if (collision.isEmcalReadout() && !collision.isAmbiguous()) { // i.e. EMCAL has a cell content eventAccepted = true; if (collision.alias_bit(kTVXinEMC)) { + registry.fill(HIST("hDetcollisionCounter"), 5.5); // EMCreadoutDetEventsWithkTVXinEMC } } } else { if (!collision.isAmbiguous() && jetderiveddatautilities::eventEMCAL(collision) && collision.alias_bit(kTVXinEMC)) { + registry.fill(HIST("hDetcollisionCounter"), 5.5); // EMCreadoutDetEventsWithkTVXinEMC eventAccepted = true; } } @@ -572,9 +724,10 @@ struct FullJetSpectrapp { fillRejectedJetHistograms(jet, 1.0); } } + registry.fill(HIST("hDetcollisionCounter"), 6.5); // AllRejectedDetEventsAfterEMCEventSelection return; } - registry.fill(HIST("h_Detcollision_counter"), 2.5); + registry.fill(HIST("hDetcollisionCounter"), 7.5); // EMCAcceptedDetColl for (auto const& jet : jets) { if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { @@ -589,32 +742,75 @@ struct FullJetSpectrapp { fillJetHistograms(jet); } } - PROCESS_SWITCH(FullJetSpectrapp, processJetsData, "Full Jets Data", false); + PROCESS_SWITCH(FullJetSpectra, processJetsData, "Full Jets Data", false); void processJetsMCD(soa::Filtered::iterator const& collision, JetTableMCDJoined const& jets, aod::JetTracks const&, aod::JetClusters const&) { bool eventAccepted = false; + double weight = 1.0; + float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); + + /* if (doMcClosure) { + // Count total events processed (before splitting decision) + registry.fill(HIST("h_MCD_total_events"), 0.5); + + // DEBUG: Let's verify what collision IDs we're actually seeing + LOGF(info, "[MCD DEBUG] Processing MC collision ID: %lld", collision.mcCollisionId()); - registry.fill(HIST("h_Detcollision_counter"), 0.5); - if (fabs(collision.posZ()) > VertexZCut) { + // Get random value for this MC collision + float eventRandomValue = getMCCollisionRandomValue(collision.mcCollisionId()); + + // MCD gets events with random value <= split fraction (20%) + if (eventRandomValue > mcClosureSplitFrac) { + LOGF(debug, "[MCD] Event REJECTED: rand = %.4f > split = %.2f (MC collision %d)", + eventRandomValue, static_cast(mcClosureSplitFrac), collision.mcCollisionId()); + return; // This event goes to MCP & Matched processes + } + + LOGF(info, "[MCD] Event ACCEPTED: rand = %.4f <= split = %.2f (MC collision %d)", + eventRandomValue, static_cast(mcClosureSplitFrac), collision.mcCollisionId()); + + registry.fill(HIST("hSpliteventSelector"), 0.5); // 20% Closure input for the measured spectra (reco) + registry.fill(HIST("h_MCD_splitevent_counter"), 0.5); + } + */ + registry.fill(HIST("hDetcollisionCounter"), 0.5); // allDetColl + if (std::fabs(collision.posZ()) > vertexZCut) { return; } - registry.fill(HIST("h_Detcollision_counter"), 1.5); + registry.fill(HIST("hDetcollisionCounter"), 1.5); // DetCollWithVertexZ + + // outlier check: for every outlier jet, reject the whole event + for (auto const& jet : jets) { + if (jet.pt() > pTHatMaxMCD * pTHat || pTHat < pTHatAbsoluteMin) { // for MCD jets only to remove outliers; setting pTHatMaxMCD = 1 improves purity + registry.fill(HIST("hDetcollisionCounter"), 2.5); // RejectedDetCollWithOutliers + return; + } + // this cut only to be used for calculating Jet Purity and not for Response Matrix + // this is mainly applied to remove all high weight jets causing big fluctuations + if (jet.pt() > 1 * pTHat) { + registry.fill(HIST("h_full_jet_pt_pTHatcut"), jet.pt(), weight); + } + } if (doMBGapTrigger && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + registry.fill(HIST("hDetcollisionCounter"), 3.5); // MBRejectedDetEvents return; } if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, doMBGapTrigger)) { + registry.fill(HIST("hDetcollisionCounter"), 4.5); // EventsNotSatisfyingEventSelection return; } if (doEMCALEventWorkaround) { if (collision.isEmcalReadout() && !collision.isAmbiguous()) { // i.e. EMCAL has a cell content eventAccepted = true; if (collision.alias_bit(kTVXinEMC)) { + registry.fill(HIST("hDetcollisionCounter"), 5.5); // EMCreadoutDetEventsWithkTVXinEMC } } } else { if (!collision.isAmbiguous() && jetderiveddatautilities::eventEMCAL(collision) && collision.alias_bit(kTVXinEMC)) { eventAccepted = true; + registry.fill(HIST("hDetcollisionCounter"), 5.5); // EMCreadoutDetEventsWithkTVXinEMC } } @@ -624,9 +820,10 @@ struct FullJetSpectrapp { fillRejectedJetHistograms(jet, 1.0); } } + registry.fill(HIST("hDetcollisionCounter"), 6.5); // AllRejectedDetEventsAfterEMCEventSelection return; } - registry.fill(HIST("h_Detcollision_counter"), 2.5); + registry.fill(HIST("hDetcollisionCounter"), 7.5); // EMCAcceptedDetColl for (auto const& jet : jets) { if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { @@ -641,33 +838,73 @@ struct FullJetSpectrapp { fillJetHistograms(jet); } } - PROCESS_SWITCH(FullJetSpectrapp, processJetsMCD, "Full Jets at Detector Level", false); + PROCESS_SWITCH(FullJetSpectra, processJetsMCD, "Full Jets at Detector Level", false); void processJetsMCDWeighted(soa::Filtered::iterator const& collision, JetTableMCDWeightedJoined const& jets, aod::JMcCollisions const&, aod::JetTracks const&, aod::JetClusters const&) { bool eventAccepted = false; + double pTHat = 10. / (std::pow(collision.mcCollision().weight(), 1.0 / pTHatExponent)); + + /* if (doMcClosure) { + // Count total events processed (before splitting decision) + registry.fill(HIST("h_MCD_total_events"), 0.5); - registry.fill(HIST("h_Detcollision_counter"), 0.5); - if (fabs(collision.posZ()) > VertexZCut) { + // DEBUG: Let's verify what collision IDs we're actually seeing + LOGF(info, "[MCD DEBUG] Processing MC collision ID: %lld", collision.mcCollisionId()); + + // Get random value for this MC collision + float eventRandomValue = getMCCollisionRandomValue(collision.mcCollisionId()); + + // MCD gets events with random value <= split fraction (20%) + if (eventRandomValue > mcClosureSplitFrac) { + LOGF(debug, "[MCD] Event REJECTED: rand = %.4f > split = %.2f (MC collision %d)", + eventRandomValue, static_cast(mcClosureSplitFrac), collision.mcCollisionId()); + return; // This event goes to MCP & Matched processes + } + + LOGF(info, "[MCD] Event ACCEPTED: rand = %.4f <= split = %.2f (MC collision %d)", + eventRandomValue, static_cast(mcClosureSplitFrac), collision.mcCollisionId()); + + registry.fill(HIST("hSpliteventSelector"), 0.5); // 20% Closure input for the measured spectra (reco) + registry.fill(HIST("h_MCD_splitevent_counter"), 0.5); + } + */ + registry.fill(HIST("hDetcollisionCounter"), 0.5, collision.mcCollision().weight()); // allDetColl + if (std::fabs(collision.posZ()) > vertexZCut) { return; } - registry.fill(HIST("h_Detcollision_counter"), 1.5); + registry.fill(HIST("hDetcollisionCounter"), 1.5, collision.mcCollision().weight()); // DetCollWithVertexZ + // outlier check: for every outlier jet, reject the whole event + for (auto const& jet : jets) { + if (jet.pt() > pTHatMaxMCD * pTHat || pTHat < pTHatAbsoluteMin) { // for MCD jets only to remove outliers; setting pTHatMaxMCD = 1 improves purity + registry.fill(HIST("hDetcollisionCounter"), 2.5, collision.mcCollision().weight()); // RejectedDetCollWithOutliers + return; + } + // this cut only to be used for calculating Jet Purity and not for Response Matrix + // this is mainly applied to remove all high weight jets causing big fluctuations + if (jet.pt() > 1 * pTHat) { + registry.fill(HIST("h_full_jet_pt_pTHatcut"), jet.pt(), collision.mcCollision().weight()); + } + } if (doMBGapTrigger && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + registry.fill(HIST("hDetcollisionCounter"), 3.5, collision.mcCollision().weight()); // MBRejectedDetEvents return; } if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, doMBGapTrigger)) { + registry.fill(HIST("hDetcollisionCounter"), 4.5, collision.mcCollision().weight()); // EventsNotSatisfyingEventSelection return; } - if (doEMCALEventWorkaround) { if (collision.isEmcalReadout() && !collision.isAmbiguous()) { // i.e. EMCAL has a cell content eventAccepted = true; if (collision.alias_bit(kTVXinEMC)) { + registry.fill(HIST("hDetcollisionCounter"), 5.5, collision.mcCollision().weight()); // EMCreadoutDetEventsWithkTVXinEMC } } } else { if (!collision.isAmbiguous() && jetderiveddatautilities::eventEMCAL(collision) && collision.alias_bit(kTVXinEMC)) { eventAccepted = true; + registry.fill(HIST("hDetcollisionCounter"), 5.5, collision.mcCollision().weight()); // EMCreadoutDetEventsWithkTVXinEMC } } @@ -677,9 +914,10 @@ struct FullJetSpectrapp { fillRejectedJetHistograms(jet, collision.mcCollision().weight()); } } + registry.fill(HIST("hDetcollisionCounter"), 6.5, collision.mcCollision().weight()); // AllRejectedDetEventsAfterEMCEventSelection return; } - registry.fill(HIST("h_Detcollision_counter"), 2.5); + registry.fill(HIST("hDetcollisionCounter"), 7.5, collision.mcCollision().weight()); // EMCAcceptedDetColl for (auto const& jet : jets) { if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { @@ -691,56 +929,96 @@ struct FullJetSpectrapp { if (!isAcceptedJet(jet)) { continue; } - - // this cut only to be used for calculating Jet Purity and not for Response Matrix - // this is mainly applied to remove all high weight jets causing big fluctuations - double pTHat = 10. / (std::pow(collision.mcCollision().weight(), 1.0 / pTHatExponent)); - if (jet.pt() > 1 * pTHat) { - registry.fill(HIST("h_full_jet_pt_pTHatcut"), jet.pt(), collision.mcCollision().weight()); - } - fillJetHistograms(jet, collision.mcCollision().weight()); } } - PROCESS_SWITCH(FullJetSpectrapp, processJetsMCDWeighted, "Full Jets at Detector Level on weighted events", false); + PROCESS_SWITCH(FullJetSpectra, processJetsMCDWeighted, "Full Jets at Detector Level on weighted events", false); void processJetsMCP(aod::JetMcCollision const& mccollision, JetTableMCPJoined const& jets, aod::JetParticles const&, soa::SmallGroups const& collisions) { bool eventAccepted = false; + double weight = 1.0; + float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); + + /* if (doMcClosure) { + // Count total events processed (before splitting decision) + registry.fill(HIST("h_MCP_total_events"), 0.5); + + // DEBUG: Let's verify what collision IDs we're actually seeing + LOGF(info, "[MCP DEBUG] Processing MC collision ID: %lld", mccollision.globalIndex()); + + // Get random value for this MC collision + float eventRandomValue = getMCCollisionRandomValue(mccollision.globalIndex()); + + // DEBUG: Track which MC collisions we're processing + registry.fill(HIST("hMCCollisionIdDebug_MCP"), static_cast(mccollision.globalIndex() % 100000)); - registry.fill(HIST("h_Partcollision_counter"), 0.5); - if (fabs(mccollision.posZ()) > VertexZCut) { + // MCP gets events with random value > split fraction (80%) + if (eventRandomValue <= mcClosureSplitFrac) { + LOGF(debug, "[MCP] Event REJECTED: rand = %.4f <= split = %.2f (MC collision %lld)", + eventRandomValue, static_cast(mcClosureSplitFrac), mccollision.globalIndex()); + return; // This event goes to MCD only + } + + LOGF(info, "[MCP] Event ACCEPTED: rand = %.4f > split = %.2f (MC collision %lld)", + eventRandomValue, static_cast(mcClosureSplitFrac), mccollision.globalIndex()); + + registry.fill(HIST("hSpliteventSelector"), 1.5); // remaining 80% input for MCP + registry.fill(HIST("h_MCP_splitevent_counter"), 0.5); + } + */ + registry.fill(HIST("hPartcollisionCounter"), 0.5); // allMcColl + if (std::fabs(mccollision.posZ()) > vertexZCut) { return; } - registry.fill(HIST("h_Partcollision_counter"), 1.5); + registry.fill(HIST("hPartcollisionCounter"), 1.5); // McCollWithVertexZ if (collisions.size() < 1) { return; } - registry.fill(HIST("h_Partcollision_counter"), 2.5); - for (auto const& collision : collisions) { - if (doMBGapTrigger && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + registry.fill(HIST("hPartcollisionCounter"), 2.5); // PartCollWithSize>1 + + if (collisions.size() == 0) { + registry.fill(HIST("hPartcollisionCounter"), 3.5); // RejectedPartCollForDetCollWithSize0 + return; + } + + // outlier check: for every outlier jet, reject the whole event + for (auto const& jet : jets) { + if (jet.pt() > pTHatMaxMCP * pTHat || pTHat < pTHatAbsoluteMin) { + registry.fill(HIST("hPartcollisionCounter"), 4.5); // RejectedPartCollWithOutliers return; } - if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, doMBGapTrigger)) { - eventAccepted = true; - // return; + } + + if (doMBGapTrigger && mccollision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + // Fill rejected MB events; + registry.fill(HIST("hPartcollisionCounter"), 5.5); // MBRejectedPartEvents + return; + } + + for (auto const& collision : collisions) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, doMBGapTrigger)) { + return; } if (doEMCALEventWorkaround) { if (collision.isEmcalReadout() && !collision.isAmbiguous()) { // i.e. EMCAL has a cell content eventAccepted = true; if (collision.alias_bit(kTVXinEMC)) { + registry.fill(HIST("hPartcollisionCounter"), 6.5); // EMCreadoutDetEventsWithkTVXinEMC } } } else { if (!collision.isAmbiguous() && jetderiveddatautilities::eventEMCAL(collision) && collision.alias_bit(kTVXinEMC)) { eventAccepted = true; + registry.fill(HIST("hPartcollisionCounter"), 6.5); // EMCreadoutDetEventsWithkTVXinEMC } } } if (!eventAccepted) { + registry.fill(HIST("hPartcollisionCounter"), 7.5); // AllRejectedPartEventsAfterEMCEventSelection return; } - registry.fill(HIST("h_Partcollision_counter"), 3.5); + registry.fill(HIST("hPartcollisionCounter"), 8.5); // EMCAcceptedWeightedPartColl for (auto const& jet : jets) { if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { @@ -760,44 +1038,93 @@ struct FullJetSpectrapp { } } } - PROCESS_SWITCH(FullJetSpectrapp, processJetsMCP, "Full Jets at Particle Level", false); + PROCESS_SWITCH(FullJetSpectra, processJetsMCP, "Full Jets at Particle Level", false); void processJetsMCPWeighted(aod::JetMcCollision const& mccollision, JetTableMCPWeightedJoined const& jets, aod::JetParticles const&, soa::SmallGroups const& collisions) { bool eventAccepted = false; + float pTHat = 10. / (std::pow(mccollision.weight(), 1.0 / pTHatExponent)); - registry.fill(HIST("h_Partcollision_counter"), 0.5); - if (fabs(mccollision.posZ()) > VertexZCut) { + /* if (doMcClosure) { + // Count total events processed (before splitting decision) + registry.fill(HIST("h_MCP_total_events"), 0.5); + + // DEBUG: Let's verify what collision IDs we're actually seeing + LOGF(info, "[MCP DEBUG] Processing MC collision ID: %lld", mccollision.globalIndex()); + + // Get random value for this MC collision + float eventRandomValue = getMCCollisionRandomValue(mccollision.globalIndex()); + + // DEBUG: Track which MC collisions we're processing + registry.fill(HIST("hMCCollisionIdDebug_MCP"), static_cast(mccollision.globalIndex() % 100000)); + + // MCP gets events with random value > split fraction (80%) + if (eventRandomValue <= mcClosureSplitFrac) { + LOGF(debug, "[MCP] Event REJECTED: rand = %.4f <= split = %.2f (MC collision %lld)", + eventRandomValue, static_cast(mcClosureSplitFrac), mccollision.globalIndex()); + return; // This event goes to MCD only + } + + LOGF(info, "[MCP] Event ACCEPTED: rand = %.4f > split = %.2f (MC collision %lld)", + eventRandomValue, static_cast(mcClosureSplitFrac), mccollision.globalIndex()); + + registry.fill(HIST("hSpliteventSelector"), 1.5); // remaining 80% input for MCP + registry.fill(HIST("h_MCP_splitevent_counter"), 0.5); + } + */ + registry.fill(HIST("hPartcollisionCounter"), 0.5, mccollision.weight()); // allMcColl + if (std::fabs(mccollision.posZ()) > vertexZCut) { return; } - registry.fill(HIST("h_Partcollision_counter"), 1.5); + registry.fill(HIST("hPartcollisionCounter"), 1.5, mccollision.weight()); // McCollWithVertexZ if (collisions.size() < 1) { return; } - registry.fill(HIST("h_Partcollision_counter"), 2.5); - for (auto const& collision : collisions) { - if (doMBGapTrigger && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + registry.fill(HIST("hPartcollisionCounter"), 2.5, mccollision.weight()); // PartCollWithSize>1 + + if (collisions.size() == 0) { + registry.fill(HIST("hPartcollisionCounter"), 3.5, mccollision.weight()); // RejectedPartCollForDetCollWithSize0 + return; + } + + // outlier check: for every outlier jet, reject the whole event + for (auto const& jet : jets) { + if (jet.pt() > pTHatMaxMCP * pTHat || pTHat < pTHatAbsoluteMin) { + registry.fill(HIST("hPartcollisionCounter"), 4.5, mccollision.weight()); // RejectedPartCollWithOutliers return; } - if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, doMBGapTrigger)) { - eventAccepted = true; + } + + if (doMBGapTrigger && mccollision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + // Fill rejected MB events + registry.fill(HIST("hPartcollisionCounter"), 5.5, mccollision.weight()); // MBRejectedPartEvents + return; + } + + for (auto const& collision : collisions) { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, doMBGapTrigger)) { + return; } if (doEMCALEventWorkaround) { if (collision.isEmcalReadout() && !collision.isAmbiguous()) { // i.e. EMCAL has a cell content eventAccepted = true; if (collision.alias_bit(kTVXinEMC)) { + registry.fill(HIST("hPartcollisionCounter"), 6.5, mccollision.weight()); // EMCreadoutDetJJEventsWithkTVXinEMC } } } else { if (!collision.isAmbiguous() && jetderiveddatautilities::eventEMCAL(collision) && collision.alias_bit(kTVXinEMC)) { eventAccepted = true; + registry.fill(HIST("hPartcollisionCounter"), 6.5, mccollision.weight()); // EMCreadoutDetJJEventsWithkTVXinEMC } } } if (!eventAccepted) { + registry.fill(HIST("hPartcollisionCounter"), 7.5, mccollision.weight()); // AllRejectedPartEventsAfterEMCEventSelection return; } - registry.fill(HIST("h_Partcollision_counter"), 3.5); + // Fill EMCAL JJ Part events + registry.fill(HIST("hPartcollisionCounter"), 8.5, mccollision.weight()); // EMCAcceptedWeightedPartColl for (auto const& jet : jets) { if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { @@ -821,43 +1148,91 @@ struct FullJetSpectrapp { } } } - PROCESS_SWITCH(FullJetSpectrapp, processJetsMCPWeighted, "Full Jets at Particle Level on weighted events", false); + PROCESS_SWITCH(FullJetSpectra, processJetsMCPWeighted, "Full Jets at Particle Level on weighted events", false); - void processJetsMCPMCDMatched(soa::Filtered::iterator const& collision, JetTableMCDMatchedJoined const& mcdjets, JetTableMCPMatchedJoined const& mcpjets, aod::JMcCollisions const&, aod::JetTracks const&, aod::JetClusters const&, aod::JetParticles const&) + void processJetsMCPMCDMatched(soa::Filtered::iterator const& collision, JetTableMCDMatchedJoined const& mcdjets, jetMcpPerMcCollision const& mcpjets, aod::JMcCollisions const&, aod::JetTracks const&, aod::JetClusters const&, aod::JetParticles const&) { bool eventAccepted = false; - int fakemcdjet = 0; - int fakemcpjet = 0; + int fakeMcdJet = 0; + int fakeMcpJet = 0; + double weight = 1.0; + float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); const auto mcpJetsPerMcCollision = mcpjets.sliceBy(JetMCPPerMcCollision, collision.mcCollisionId()); - registry.fill(HIST("h_Matchedcollision_counter"), 0.5); + /* if (doMcClosure) { + // Count total events processed (before splitting decision) + registry.fill(HIST("h_Matched_total_events"), 0.5); + + // Use consistent MC collision ID - same as MCD + int64_t mcCollisionId = collision.mcCollisionId(); + + // DEBUG: Let's verify what collision IDs we're actually seeing + LOGF(info, "[Matched DEBUG] Processing MC collision ID: %lld", mcCollisionId); + float eventRandomValue = getMCCollisionRandomValue(mcCollisionId); + + // Matched gets events with random value > split fraction (80%) - same as MCP + if (eventRandomValue <= mcClosureSplitFrac) { + LOGF(debug, "[Matched] Event REJECTED: rand = %.4f <= split = %.2f (MC collision %lld)", + eventRandomValue, static_cast(mcClosureSplitFrac), mcCollisionId); + return; // This event goes to MCD only + } + + LOGF(info, "[Matched] Event ACCEPTED: rand = %.4f > split = %.2f (MC collision %lld)", + eventRandomValue, static_cast(mcClosureSplitFrac), mcCollisionId); + + registry.fill(HIST("hSpliteventSelector"), 2.5); // Bin for Response Matrix + registry.fill(HIST("h_Matched_splitevent_counter"), 0.5); + } + */ + registry.fill(HIST("hMatchedcollisionCounter"), 0.5); // allDetColl - if (fabs(collision.posZ()) > VertexZCut) { // making double sure this condition is satisfied + if (std::fabs(collision.posZ()) > vertexZCut) { // making double sure this condition is satisfied return; } - registry.fill(HIST("h_Matchedcollision_counter"), 1.5); + registry.fill(HIST("hMatchedcollisionCounter"), 1.5); // DetCollWithVertexZ + + // outlier check: for every outlier jet, reject the whole event + for (auto const& mcdjet : mcdjets) { + if (mcdjet.pt() > pTHatMaxMCD * pTHat || pTHat < pTHatAbsoluteMin) { + registry.fill(HIST("hMatchedcollisionCounter"), 2.5); // RejectedDetCollWithOutliers + return; + } + } + // //outlier check for Part collisions: commenting out this for now otherwise this rejects all Det Colls + // for (auto const& mcpjet : mcpjets) { + // if (mcpjet.pt() > pTHatMaxMCP * pTHat || pTHat < pTHatAbsoluteMin) { + // registry.fill(HIST("hMatchedcollisionCounter"),3.5); //RejectedPartCollWithOutliers + // return; + // } + // } if (doMBGapTrigger && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + registry.fill(HIST("hMatchedcollisionCounter"), 4.5); // EMCMBRejectedDetColl return; } + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, doMBGapTrigger)) { + registry.fill(HIST("hMatchedcollisionCounter"), 5.5); // EventsNotSatisfyingEventSelection return; } if (doEMCALEventWorkaround) { if (collision.isEmcalReadout() && !collision.isAmbiguous()) { // i.e. EMCAL has a cell content eventAccepted = true; if (collision.alias_bit(kTVXinEMC)) { + registry.fill(HIST("hMatchedcollisionCounter"), 6.5); // EMCreadoutDetEventsWithkTVXinEMC } } } else { if (!collision.isAmbiguous() && jetderiveddatautilities::eventEMCAL(collision) && collision.alias_bit(kTVXinEMC)) { eventAccepted = true; + registry.fill(HIST("hMatchedcollisionCounter"), 6.5); // EMCreadoutDetEventsWithkTVXinEMC } } if (!eventAccepted) { + registry.fill(HIST("hMatchedcollisionCounter"), 7.5); // AllRejectedDetEventsAfterEMCEventSelection return; } - registry.fill(HIST("h_Matchedcollision_counter"), 2.5); + registry.fill(HIST("hMatchedcollisionCounter"), 8.5); // EMCAcceptedDetColl for (const auto& mcdjet : mcdjets) { if (!jetfindingutilities::isInEtaAcceptance(mcdjet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { @@ -865,50 +1240,94 @@ struct FullJetSpectrapp { } // Check if MCD jet is within the EMCAL fiducial region; if not then flag it as a fake jet if (mcdjet.phi() < jetPhiMin || mcdjet.phi() > jetPhiMax || mcdjet.eta() < jetEtaMin || mcdjet.eta() > jetEtaMax) { - fakemcdjet++; - registry.fill(HIST("h2_full_fakemcdjets"), mcdjet.pt(), fakemcdjet, 1.0); + fakeMcdJet++; + registry.fill(HIST("h2_full_fakemcdjets"), mcdjet.pt(), fakeMcdJet, 1.0); continue; } if (!isAcceptedJet(mcdjet)) { continue; } - for (auto& mcpjet : mcdjet.template matchedJetGeo_as()) { + for (const auto& mcpjet : mcdjet.template matchedJetGeo_as()) { // apply emcal fiducial cuts to the matched particle level jets if (mcpjet.eta() > jetEtaMax || mcpjet.eta() < jetEtaMin || mcpjet.phi() > jetPhiMax || mcpjet.phi() < jetPhiMin) { - fakemcpjet++; - registry.fill(HIST("h2_full_fakemcpjets"), mcpjet.pt(), fakemcpjet, 1.0); + fakeMcpJet++; + registry.fill(HIST("h2_full_fakemcpjets"), mcpjet.pt(), fakeMcpJet, 1.0); continue; } } // mcpjet loop - fillMatchedHistograms(mcdjet); + fillMatchedHistograms(mcdjet); } // mcdjet loop } - PROCESS_SWITCH(FullJetSpectrapp, processJetsMCPMCDMatched, "Full Jet finder MCP matched to MCD", false); + PROCESS_SWITCH(FullJetSpectra, processJetsMCPMCDMatched, "Full Jet finder MCP matched to MCD", false); void processJetsMCPMCDMatchedWeighted(soa::Filtered::iterator const& collision, JetTableMCDMatchedWeightedJoined const& mcdjets, JetTableMCPMatchedWeightedJoined const& mcpjets, aod::JMcCollisions const&, aod::JetTracks const&, aod::JetClusters const&, aod::JetParticles const&) { + bool eventAccepted = false; + int fakeMcdJet = 0; + int fakeMcpJet = 0; + int NPartJetFid = 0; float eventWeight = collision.mcCollision().weight(); + float pTHat = 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); + const auto mcpJetsPerMcCollision = mcpjets.sliceBy(JetMCPPerMcCollision, collision.mcCollisionId()); + + /* if (doMcClosure) { + // Count total events processed (before splitting decision) + registry.fill(HIST("h_Matched_total_events"), 0.5); + + // Use consistent MC collision ID - same as MCD + int64_t mcCollisionId = collision.mcCollisionId(); + + // DEBUG: Let's verify what collision IDs we're actually seeing + LOGF(info, "[Matched DEBUG] Processing MC collision ID: %lld", mcCollisionId); + float eventRandomValue = getMCCollisionRandomValue(mcCollisionId); - registry.fill(HIST("h_Matchedcollision_counter"), 0.5); - if (fabs(collision.posZ()) > VertexZCut) { // making double sure this condition is satisfied + // Matched gets events with random value > split fraction (80%) - same as MCP + if (eventRandomValue <= mcClosureSplitFrac) { + LOGF(debug, "[Matched] Event REJECTED: rand = %.4f <= split = %.2f (MC collision %lld)", + eventRandomValue, static_cast(mcClosureSplitFrac), mcCollisionId); + return; // This event goes to MCD only + } + + LOGF(info, "[Matched] Event ACCEPTED: rand = %.4f > split = %.2f (MC collision %lld)", + eventRandomValue, static_cast(mcClosureSplitFrac), mcCollisionId); + + registry.fill(HIST("hSpliteventSelector"), 2.5); // Bin for Response Matrix + registry.fill(HIST("h_Matched_splitevent_counter"), 0.5); + } + */ + registry.fill(HIST("hMatchedcollisionCounter"), 0.5, eventWeight); // allDetColl + if (std::fabs(collision.posZ()) > vertexZCut) { // making double sure this condition is satisfied return; } - registry.fill(HIST("h_Matchedcollision_counter"), 1.5); + registry.fill(HIST("hMatchedcollisionCounter"), 1.5, eventWeight); // DetCollWithVertexZ + + // outlier check: for every outlier jet, reject the whole event + for (auto const& mcdjet : mcdjets) { + if (mcdjet.pt() > pTHatMaxMCD * pTHat || pTHat < pTHatAbsoluteMin) { + registry.fill(HIST("hMatchedcollisionCounter"), 2.5, eventWeight); // RejectedDetCollWithOutliers + return; + } + } + // outlier check for Part collisions: commenting out this for now otherwise this rejects all Det Colls + // for (auto const& mcpjet : mcpjets) { + // if (mcpjet.pt() > pTHatMaxMCP * pTHat || pTHat < pTHatAbsoluteMin) { + // registry.fill(HIST("hMatchedcollisionCounter"),3.5, eventWeight); //RejectedPartCollWithOutliers + // return; + // } + // } if (doMBGapTrigger && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + registry.fill(HIST("hMatchedcollisionCounter"), 4.5, eventWeight); // EMCMBRejectedDetColl return; } + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, doMBGapTrigger)) { + registry.fill(HIST("hMatchedcollisionCounter"), 5.5, eventWeight); // EventsNotSatisfyingEventSelection return; } - bool eventAccepted = false; - int fakemcdjet = 0; - int fakemcpjet = 0; - float pTHat = 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); - const auto mcpJetsPerMcCollision = mcpjets.sliceBy(JetMCPPerMcCollision, collision.mcCollisionId()); - for (auto mcpjet : mcpJetsPerMcCollision) { - if (mcpjet.pt() > pTHatMaxMCP * pTHat) { // outlier rejection for MCP + for (auto const& mcpjet : mcpJetsPerMcCollision) { + if (mcpjet.pt() > pTHatMaxMCP * pTHat) { // outlier rejection for MCP: Should I remove this cut as I'm already doing MC outlier rejection @L1071? return; } } @@ -916,25 +1335,26 @@ struct FullJetSpectrapp { if (collision.isEmcalReadout() && !collision.isAmbiguous()) { // i.e. EMCAL has a cell content eventAccepted = true; if (collision.alias_bit(kTVXinEMC)) { - registry.fill(HIST("h_Matchedcollision_counter"), eventWeight); + registry.fill(HIST("hMatchedcollisionCounter"), 6.5, eventWeight); // EMCreadoutDetJJEventsWithkTVXinEMC } } } else { if (!collision.isAmbiguous() && jetderiveddatautilities::eventEMCAL(collision) && collision.alias_bit(kTVXinEMC)) { eventAccepted = true; - registry.fill(HIST("h_Matchedcollision_counter"), eventWeight); + registry.fill(HIST("hMatchedcollisionCounter"), 6.5, eventWeight); // EMCreadoutDetJJEventsWithkTVXinEMC } } if (!eventAccepted) { + registry.fill(HIST("hMatchedcollisionCounter"), 7.5, eventWeight); // AllRejectedDetEventsAfterEMCEventSelection return; } - registry.fill(HIST("h_Matchedcollision_counter"), 2.5); + registry.fill(HIST("hMatchedcollisionCounter"), 8.5, eventWeight); // EMCAcceptedDetColl for (const auto& mcdjet : mcdjets) { // Check if MCD jet is within the EMCAL fiducial region; if not then flag it as a fake jet if (mcdjet.phi() < jetPhiMin || mcdjet.phi() > jetPhiMax || mcdjet.eta() < jetEtaMin || mcdjet.eta() > jetEtaMax) { - fakemcdjet++; - registry.fill(HIST("h2_full_fakemcdjets"), mcdjet.pt(), fakemcdjet, eventWeight); + fakeMcdJet++; + registry.fill(HIST("h2_full_fakemcdjets"), mcdjet.pt(), fakeMcdJet, eventWeight); continue; } if (!jetfindingutilities::isInEtaAcceptance(mcdjet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { @@ -944,35 +1364,73 @@ struct FullJetSpectrapp { continue; } - for (auto& mcpjet : mcdjet.template matchedJetGeo_as()) { - // apply emcal fiducial cuts to the matched particle level jets + for (const auto& mcpjet : mcdjet.template matchedJetGeo_as()) { + // apply emcal fiducial cuts to the matched particle level jets - if the matched mcp jet lies outside of the EMCAL fiducial, flag it as a fake jet if (mcpjet.eta() > jetEtaMax || mcpjet.eta() < jetEtaMin || mcpjet.phi() > jetPhiMax || mcpjet.phi() < jetPhiMin) { - fakemcpjet++; - registry.fill(HIST("h2_full_fakemcpjets"), mcpjet.pt(), fakemcpjet, eventWeight); + fakeMcpJet++; + registry.fill(HIST("h2FullfakeMcpJets"), mcpjet.pt(), fakeMcpJet, eventWeight); continue; + } else { + NPartJetFid++; + // // If both MCD-MCP matched jet pairs are within the EMCAL fiducial region, fill these histos + registry.fill(HIST("h2_full_matchedmcpjet_pt"), mcpjet.pt(), NPartJetFid, eventWeight); + registry.fill(HIST("h_full_matchedmcpjet_eta"), mcpjet.eta(), eventWeight); + registry.fill(HIST("h_full_matchedmcpjet_phi"), mcpjet.phi(), eventWeight); } - // // If both MCD-MCP matched jet pairs are within the EMCAL fiducial region, fill these histos - registry.fill(HIST("h_full_matchedmcpjet_eta"), mcpjet.eta(), eventWeight); - registry.fill(HIST("h_full_matchedmcpjet_phi"), mcpjet.phi(), eventWeight); } // mcpjet fillMatchedHistograms(mcdjet, eventWeight); } // mcdjet } - PROCESS_SWITCH(FullJetSpectrapp, processJetsMCPMCDMatchedWeighted, "Full Jet finder MCP matched to MCD on weighted events", false); + PROCESS_SWITCH(FullJetSpectra, processJetsMCPMCDMatchedWeighted, "Full Jet finder MCP matched to MCD on weighted events", false); + + // Periodic cleanup to prevent unbounded memory growth + /*void processCleanup(aod::Collision const&) { + static int callCount = 0; + callCount++; + + // Clean up cache every 50000 calls to prevent memory issues + if (doMcClosure && callCount % 50000 == 0 && mcCollisionRandomValues.size() > 20000) { + LOGF(info, "Cleaning up MC collision random values cache (size: %zu)", mcCollisionRandomValues.size()); + mcCollisionRandomValues.clear(); + + // IMPROVEMENT: Add logging to verify our split ratios + float mcdCount = registry.get(HIST("h_MCD_splitevent_counter"))->GetBinContent(1); + float mcpCount = registry.get(HIST("h_MCP_splitevent_counter"))->GetBinContent(1); + float matchedCount = registry.get(HIST("h_Matched_splitevent_counter"))->GetBinContent(1); - void processTracks(soa::Filtered::iterator const& collision, soa::Filtered const& tracks, soa::Filtered const& clusters) + float totalEvents = mcdCount + mcpCount; // MCP and Matched should be the same, so don't double count + float actualSplitFrac = totalEvents > 0 ? mcdCount / totalEvents : 0.0f; + + LOGF(info, "Current split statistics: MCD=%.1f, MCP=%.1f, Matched=%.1f", mcdCount, mcpCount, matchedCount); + LOGF(info, "Actual split fraction: %.3f (target: %.3f)", actualSplitFrac, static_cast(mcClosureSplitFrac)); + } + } + PROCESS_SWITCH(FullJetSpectra, processCleanup, "Periodic cleanup", true); + */ + void processDataTracks(soa::Filtered::iterator const& collision, soa::Filtered const& tracks, soa::Filtered const& clusters) { bool eventAccepted = false; + double weight = 1.0; + float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); - registry.fill(HIST("h_collisions_unweighted"), 0.5); - if (fabs(collision.posZ()) > VertexZCut) { + registry.fill(HIST("hCollisionsUnweighted"), 0.5); // allDetColl + if (std::fabs(collision.posZ()) > vertexZCut) { return; } - registry.fill(HIST("h_collisions_unweighted"), 1.5); + registry.fill(HIST("hCollisionsUnweighted"), 1.5); // DetCollWithVertexZ + + // for (auto const& track : tracks) { + if (pTHat < pTHatAbsoluteMin) { // Track outlier rejection: should this be for every track iteration or for every collision? + return; + } + // } + if (doMBGapTrigger && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + registry.fill(HIST("hCollisionsUnweighted"), 2.5); // MBRejectedDetEvents return; } if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, doMBGapTrigger)) { + registry.fill(HIST("hCollisionsUnweighted"), 3.5); // EventsNotSatisfyingEventSelection return; } // needed for the workaround to access EMCAL trigger bits. - This is needed for the MC productions in which the EMC trigger bits are missing. (MB MC LHC24f3, for ex.) @@ -986,8 +1444,7 @@ struct FullJetSpectrapp { if (collision.isEmcalReadout() && !collision.isAmbiguous()) { // i.e. EMCAL has a cell content eventAccepted = true; if (collision.alias_bit(kTVXinEMC)) { - registry.fill(HIST("h_collisions_unweighted"), 4.0); // Tracks with kTVXinEMC - registry.fill(HIST("h_Detcollision_counter"), 1.0); + registry.fill(HIST("hCollisionsUnweighted"), 4.5); // EMCreadoutDetEventsWithkTVXinEMC } } } else { @@ -995,16 +1452,72 @@ struct FullJetSpectrapp { // This is the default check for the simulations with proper trigger flags not requiring the above workaround. if (!collision.isAmbiguous() && jetderiveddatautilities::eventEMCAL(collision) && collision.alias_bit(kTVXinEMC)) { eventAccepted = true; - registry.fill(HIST("h_collisions_unweighted"), 4.0); // Tracks with kTVXinEMC - registry.fill(HIST("h_Detcollision_counter"), 1.0); + registry.fill(HIST("hCollisionsUnweighted"), 4.5); // EMCreadoutDetEventsWithkTVXinEMC + } + } + + if (!eventAccepted) { + registry.fill(HIST("hCollisionsUnweighted"), 5.5); // AllRejectedDetEventsAfterEMCEventSelection + return; + } + registry.fill(HIST("hCollisionsUnweighted"), 6.5); // EMCAcceptedDetColl + + for (auto const& track : tracks) { + if (!jetderiveddatautilities::selectTrack(track, trackSelection)) { + continue; + } + // Fill Accepted events histos + fillTrackHistograms(tracks, clusters, 1.0); + } + registry.fill(HIST("hCollisionsUnweighted"), 7.5); // EMCAcceptedCollAfterTrackSel + } + PROCESS_SWITCH(FullJetSpectra, processDataTracks, "Full Jet tracks for Data", false); + + void processMCTracks(soa::Filtered::iterator const& collision, soa::Filtered const& tracks, soa::Filtered const& clusters) + { + bool eventAccepted = false; + double weight = 1.0; + float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); + + registry.fill(HIST("hCollisionsUnweighted"), 0.5); // allDetColl + if (std::fabs(collision.posZ()) > vertexZCut) { + return; + } + registry.fill(HIST("hCollisionsUnweighted"), 1.5); // DetCollWithVertexZ + + // for (auto const& track : tracks) { + if (pTHat < pTHatAbsoluteMin) { // Track outlier rejection: should this be for every track iteration or for every collision? + return; + } + // } + if (doMBGapTrigger && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + registry.fill(HIST("hCollisionsUnweighted"), 2.5); // MBRejectedDetEvents + return; + } + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, doMBGapTrigger)) { + registry.fill(HIST("hCollisionsUnweighted"), 3.5); // EventsNotSatisfyingEventSelection + return; + } + + if (doEMCALEventWorkaround) { + if (collision.isEmcalReadout() && !collision.isAmbiguous()) { // i.e. EMCAL has a cell content + eventAccepted = true; + if (collision.alias_bit(kTVXinEMC)) { + registry.fill(HIST("hCollisionsUnweighted"), 4.5); // EMCreadoutDetEventsWithkTVXinEMC + } + } + } else { + if (!collision.isAmbiguous() && jetderiveddatautilities::eventEMCAL(collision) && collision.alias_bit(kTVXinEMC)) { + eventAccepted = true; + registry.fill(HIST("hCollisionsUnweighted"), 4.5); // EMCreadoutDetEventsWithkTVXinEMC } } if (!eventAccepted) { - registry.fill(HIST("h_collisions_unweighted"), 8.0); // Tracks w/o kTVXinEMC + registry.fill(HIST("hCollisionsUnweighted"), 5.5); // AllRejectedDetEventsAfterEMCEventSelection return; } - registry.fill(HIST("h_collisions_unweighted"), 2.5); + registry.fill(HIST("hCollisionsUnweighted"), 6.5); // EMCAcceptedDetColl for (auto const& track : tracks) { if (!jetderiveddatautilities::selectTrack(track, trackSelection)) { @@ -1013,9 +1526,9 @@ struct FullJetSpectrapp { // Fill Accepted events histos fillTrackHistograms(tracks, clusters, 1.0); } - registry.fill(HIST("h_collisions_unweighted"), 3.5); + registry.fill(HIST("hCollisionsUnweighted"), 7.5); // EMCAcceptedCollAfterTrackSel } - PROCESS_SWITCH(FullJetSpectrapp, processTracks, "Full Jet tracks", false); + PROCESS_SWITCH(FullJetSpectra, processMCTracks, "Full Jet tracks for MC", false); void processTracksWeighted(soa::Filtered::iterator const& collision, aod::JMcCollisions const&, @@ -1024,54 +1537,63 @@ struct FullJetSpectrapp { { bool eventAccepted = false; float eventWeight = collision.mcCollision().weight(); + float pTHat = 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); - registry.fill(HIST("h_collisions_weighted"), 0.5); - if (fabs(collision.posZ()) > VertexZCut) { + registry.fill(HIST("hCollisionsWeighted"), 0.5, eventWeight); // AllWeightedDetColl + if (std::fabs(collision.posZ()) > vertexZCut) { return; } - registry.fill(HIST("h_collisions_weighted"), 1.5); + registry.fill(HIST("hCollisionsWeighted"), 1.5, eventWeight); // WeightedCollWithVertexZ + + // for (auto const& track : tracks) { + if (pTHat < pTHatAbsoluteMin) { // Track outlier rejection: should this be for every track iteration or for every collision? + return; + } + // } if (doMBGapTrigger && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + registry.fill(HIST("hCollisionsWeighted"), 2.5, eventWeight); // MBRejectedDetEvents return; } if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, doMBGapTrigger)) { + registry.fill(HIST("hCollisionsWeighted"), 3.5, eventWeight); // EventsNotSatisfyingEventSelection return; } if (doMBGapTrigger && eventWeight == 1) { + registry.fill(HIST("hCollisionsWeighted"), 2.5, eventWeight); // MBRejectedDetEvents return; } - registry.fill(HIST("h_collisions_weighted"), 1.0, eventWeight); // total events if (doEMCALEventWorkaround) { if (collision.isEmcalReadout() && !collision.isAmbiguous()) { // i.e. EMCAL has a cell content eventAccepted = true; fillTrackHistograms(tracks, clusters, eventWeight); if (collision.alias_bit(kTVXinEMC)) { - registry.fill(HIST("h_collisions_weighted"), 4.0, eventWeight); // TracksWeighted with kTVXinEMC + registry.fill(HIST("hCollisionsWeighted"), 4.5, eventWeight); // EMCreadoutDetJJEventsWithkTVXinEMC } } } else { if (!collision.isAmbiguous() && jetderiveddatautilities::eventEMCAL(collision) && collision.alias_bit(kTVXinEMC)) { eventAccepted = true; - registry.fill(HIST("h_collisions_weighted"), 4.0, eventWeight); // TracksWeighted with kTVXinEMC + registry.fill(HIST("hCollisionsWeighted"), 4.5, eventWeight); // EMCreadoutDetJJEventsWithkTVXinEMC } } if (!eventAccepted) { - registry.fill(HIST("h_collisions_weighted"), 7.0, eventWeight); // TracksWeighted w/o kTVXinEMC + registry.fill(HIST("hCollisionsWeighted"), 5.5, eventWeight); // AllRejectedDetEventsAfterEMCEventSelection return; } - registry.fill(HIST("h_collisions_weighted"), 2.5); + registry.fill(HIST("hCollisionsWeighted"), 6.5); // EMCAcceptedWeightedDetColl for (auto const& track : tracks) { if (!jetderiveddatautilities::selectTrack(track, trackSelection)) { continue; } // Fill Accepted events histos - fillTrackHistograms(tracks, clusters, 1.0); + fillTrackHistograms(tracks, clusters, eventWeight); } - registry.fill(HIST("h_collisions_weighted"), 3.5); + registry.fill(HIST("hCollisionsWeighted"), 7.5, eventWeight); // EMCAcceptedWeightedCollAfterTrackSel } - PROCESS_SWITCH(FullJetSpectrapp, processTracksWeighted, "Full Jet tracks weighted", false); + PROCESS_SWITCH(FullJetSpectra, processTracksWeighted, "Full Jet tracks weighted", false); void processCollisionsWeightedWithMultiplicity(soa::Filtered>::iterator const& collision, JetTableMCDWeightedJoined const& mcdjets, aod::JMcCollisions const&, soa::Filtered const& tracks, soa::Filtered const& clusters) { @@ -1079,16 +1601,21 @@ struct FullJetSpectrapp { float eventWeight = collision.mcCollision().weight(); float neutralEnergy = 0.0; - if (fabs(collision.posZ()) > VertexZCut) { + registry.fill(HIST("hEventmultiplicityCounter"), 0.5, eventWeight); // allDetColl + if (std::fabs(collision.posZ()) > vertexZCut) { + registry.fill(HIST("hEventmultiplicityCounter"), 1.5, eventWeight); // DetCollWithVertexZ return; } if (doMBGapTrigger && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + registry.fill(HIST("hEventmultiplicityCounter"), 2.5, eventWeight); // MBRejectedDetEvents return; } if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, doMBGapTrigger)) { + registry.fill(HIST("hEventmultiplicityCounter"), 3.5, eventWeight); // EventsNotSatisfyingEventSelection return; } if (doMBGapTrigger && eventWeight == 1) { + registry.fill(HIST("hEventmultiplicityCounter"), 2.5, eventWeight); // MBRejectedDetEvents return; } @@ -1097,23 +1624,29 @@ struct FullJetSpectrapp { eventAccepted = true; fillTrackHistograms(tracks, clusters, eventWeight); if (collision.alias_bit(kTVXinEMC)) { + registry.fill(HIST("hEventmultiplicityCounter"), 4.5, eventWeight); // EMCreadoutDetJJEventsWithkTVXinEMC } } } else { if (!collision.isAmbiguous() && jetderiveddatautilities::eventEMCAL(collision) && collision.alias_bit(kTVXinEMC)) { eventAccepted = true; + registry.fill(HIST("hEventmultiplicityCounter"), 4.5, eventWeight); // EMCreadoutDetJJEventsWithkTVXinEMC } } if (!eventAccepted) { + registry.fill(HIST("hEventmultiplicityCounter"), 5.5, eventWeight); // AllRejectedDetEventsAfterEMCEventSelection return; } + registry.fill(HIST("hCollisionsWeighted"), 6.5); // EMCAcceptedWeightedDetColl + for (auto const& track : tracks) { if (!jetderiveddatautilities::selectTrack(track, trackSelection)) { continue; } } - registry.fill(HIST("h_FT0Mults_occupancy"), collision.multiplicity()); + registry.fill(HIST("hEventmultiplicityCounter"), 7.5, eventWeight); // EMCAcceptedWeightedCollAfterTrackSel + registry.fill(HIST("h_FT0Mults_occupancy"), collision.multiplicity(), eventWeight); for (auto const& mcdjet : mcdjets) { float pTHat = 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); @@ -1134,11 +1667,11 @@ struct FullJetSpectrapp { for (auto const& cluster : clusters) { neutralEnergy += cluster.energy(); } - auto NEF = neutralEnergy / mcdjet.energy(); - registry.fill(HIST("h3_full_jet_jetpTDet_FT0Mults_NEF"), mcdjet.pt(), collision.multiplicity(), NEF, eventWeight); + auto nef = neutralEnergy / mcdjet.energy(); + registry.fill(HIST("h3_full_jet_jetpTDet_FT0Mults_nef"), mcdjet.pt(), collision.multiplicity(), nef, eventWeight); } } - PROCESS_SWITCH(FullJetSpectrapp, processCollisionsWeightedWithMultiplicity, "Weighted Collisions for Full Jets Multiplicity Studies", false); + PROCESS_SWITCH(FullJetSpectra, processCollisionsWeightedWithMultiplicity, "Weighted Collisions for Full Jets Multiplicity Studies", false); void processMBCollisionsWithMultiplicity(soa::Filtered>::iterator const& collision, JetTableMCDJoined const& mcdjets, aod::JMcCollisions const&, soa::Filtered const& tracks, soa::Filtered const& clusters) { @@ -1146,13 +1679,18 @@ struct FullJetSpectrapp { float pTHat = 10. / (std::pow(1.0, 1.0 / pTHatExponent)); float neutralEnergy = 0.0; - if (fabs(collision.posZ()) > VertexZCut) { + registry.fill(HIST("hEventmultiplicityCounter"), 0.5); // allDetColl + if (std::fabs(collision.posZ()) > vertexZCut) { return; } + registry.fill(HIST("hEventmultiplicityCounter"), 1.5); // DetCollWithVertexZ + if (doMBGapTrigger && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + registry.fill(HIST("hEventmultiplicityCounter"), 2.5); // MBRejectedDetEvents return; } if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, doMBGapTrigger)) { + registry.fill(HIST("hEventmultiplicityCounter"), 3.5); // EventsNotSatisfyingEventSelection return; } @@ -1161,22 +1699,28 @@ struct FullJetSpectrapp { eventAccepted = true; fillTrackHistograms(tracks, clusters, 1.0); if (collision.alias_bit(kTVXinEMC)) { + registry.fill(HIST("hEventmultiplicityCounter"), 4.5); // EMCreadoutDetEventsWithkTVXinEMC } } } else { if (!collision.isAmbiguous() && jetderiveddatautilities::eventEMCAL(collision) && collision.alias_bit(kTVXinEMC)) { eventAccepted = true; + registry.fill(HIST("hEventmultiplicityCounter"), 4.5); // EMCreadoutDetEventsWithkTVXinEMC } } if (!eventAccepted) { + registry.fill(HIST("hEventmultiplicityCounter"), 5.5); // AllRejectedDetEventsAfterEMCEventSelection return; } + registry.fill(HIST("hEventmultiplicityCounter"), 6.5); // EMCAcceptedDetColl + for (auto const& track : tracks) { if (!jetderiveddatautilities::selectTrack(track, trackSelection)) { continue; } } + registry.fill(HIST("hEventmultiplicityCounter"), 7.5); // EMCAcceptedCollAfterTrackSel registry.fill(HIST("h_FT0Mults_occupancy"), collision.multiplicity()); for (auto const& mcdjet : mcdjets) { @@ -1197,15 +1741,85 @@ struct FullJetSpectrapp { for (auto const& cluster : clusters) { neutralEnergy += cluster.energy(); } - auto NEF = neutralEnergy / mcdjet.energy(); - registry.fill(HIST("h3_full_jet_jetpTDet_FT0Mults_NEF"), mcdjet.pt(), collision.multiplicity(), NEF, 1.0); + auto nef = neutralEnergy / mcdjet.energy(); + registry.fill(HIST("h3_full_jet_jetpTDet_FT0Mults_nef"), mcdjet.pt(), collision.multiplicity(), nef, 1.0); } } - PROCESS_SWITCH(FullJetSpectrapp, processMBCollisionsWithMultiplicity, "MB Collisions for Full Jets Multiplicity Studies", false); + PROCESS_SWITCH(FullJetSpectra, processMBCollisionsWithMultiplicity, "MB MCD Collisions for Full Jets Multiplicity Studies", false); + + void processMBCollisionsDATAWithMultiplicity(soa::Filtered>::iterator const& collision, FullJetTableDataJoined const& jets, soa::Filtered const& tracks, soa::Filtered const& clusters) + { + bool eventAccepted = false; + float neutralEnergy = 0.0; + + registry.fill(HIST("hEventmultiplicityCounter"), 0.5); // allDetColl + if (std::fabs(collision.posZ()) > vertexZCut) { + return; + } + registry.fill(HIST("hEventmultiplicityCounter"), 1.5); // DetCollWithVertexZ + if (doMBGapTrigger && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { + registry.fill(HIST("hEventmultiplicityCounter"), 2.5); // MBRejectedDetEvents + return; + } + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, doMBGapTrigger)) { + registry.fill(HIST("hEventmultiplicityCounter"), 3.5); // EventsNotSatisfyingEventSelection + return; + } + + if (doEMCALEventWorkaround) { + if (collision.isEmcalReadout() && !collision.isAmbiguous()) { // i.e. EMCAL has a cell content + eventAccepted = true; + fillTrackHistograms(tracks, clusters, 1.0); + if (collision.alias_bit(kTVXinEMC)) { + registry.fill(HIST("hEventmultiplicityCounter"), 4.5); // EMCreadoutDetEventsWithkTVXinEMC + } + } + } else { + if (!collision.isAmbiguous() && jetderiveddatautilities::eventEMCAL(collision) && collision.alias_bit(kTVXinEMC)) { + eventAccepted = true; + registry.fill(HIST("hEventmultiplicityCounter"), 4.5); // EMCreadoutDetEventsWithkTVXinEMC + } + } + + if (!eventAccepted) { + registry.fill(HIST("hEventmultiplicityCounter"), 5.5); // AllRejectedDetEventsAfterEMCEventSelection + return; + } + registry.fill(HIST("hEventmultiplicityCounter"), 6.5); // EMCAcceptedDetColl + + for (auto const& track : tracks) { + if (!jetderiveddatautilities::selectTrack(track, trackSelection)) { + continue; + } + } + registry.fill(HIST("hEventmultiplicityCounter"), 7.5); // EMCAcceptedCollAfterTrackSel + registry.fill(HIST("h_FT0Mults_occupancy"), collision.multiplicity()); + + for (auto const& jet : jets) { + if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + if (jet.phi() < jetPhiMin || jet.phi() > jetPhiMax) { + continue; + } + if (!isAcceptedJet(jet)) { + continue; + } + registry.fill(HIST("h2_full_jet_jetpTDetVsFT0Mults"), jet.pt(), collision.multiplicity(), 1.0); + + for (auto const& cluster : clusters) { + neutralEnergy += cluster.energy(); + } + auto nef = neutralEnergy / jet.energy(); + registry.fill(HIST("h3_full_jet_jetpTDet_FT0Mults_nef"), jet.pt(), collision.multiplicity(), nef, 1.0); + } + } + PROCESS_SWITCH(FullJetSpectra, processMBCollisionsDATAWithMultiplicity, "MB DATA Collisions for Full Jets Multiplicity Studies", false); + }; // struct WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"full-jet-spectra-pp"})}; + adaptAnalysisTask(cfgc)}; } From 6cf0bf1ae75444831f1743af40df0acfbeb414b1 Mon Sep 17 00:00:00 2001 From: dajones2 <140733426+dajones2@users.noreply.github.com> Date: Wed, 4 Jun 2025 13:51:11 +0100 Subject: [PATCH 1508/1650] [PWGJE] Adding track level outlier cut (#11449) --- PWGJE/Tasks/jetHadronRecoil.cxx | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/PWGJE/Tasks/jetHadronRecoil.cxx b/PWGJE/Tasks/jetHadronRecoil.cxx index 357e973efe2..018814cdeeb 100644 --- a/PWGJE/Tasks/jetHadronRecoil.cxx +++ b/PWGJE/Tasks/jetHadronRecoil.cxx @@ -71,6 +71,8 @@ struct JetHadronRecoil { Configurable pTHatExponent{"pTHatExponent", 4.0, "exponent of the event weight for the calculation of pTHat"}; Configurable pTHatMaxMCD{"pTHatMaxMCD", 999.0, "maximum fraction of hard scattering for jet acceptance in detector MC"}; Configurable pTHatMaxMCP{"pTHatMaxMCP", 999.0, "maximum fraction of hard scattering for jet acceptance in particle MC"}; + Configurable pTHatTrackMaxMCD{"pTHatTrackMaxMCD", 999.0, "maximum fraction of hard scattering for track acceptance in detector MC"}; + Configurable pTHatTrackMaxMCP{"pTHatTrackMaxMCP", 999.0, "maximum fraction of hard scattering for track acceptance in particle MC"}; Configurable rhoReferenceShift{"rhoReferenceShift", 0.0, "shift in rho calculated in reference events for consistency with signal events"}; Configurable triggerMasks{"triggerMasks", "", "possible JE Trigger masks: fJetChLowPt,fJetChHighPt,fTrackLowPt,fTrackHighPt,fJetD0ChLowPt,fJetD0ChHighPt,fJetLcChLowPt,fJetLcChHighPt,fEMCALReadout,fJetFullHighPt,fJetFullLowPt,fJetNeutralHighPt,fJetNeutralLowPt,fGammaVeryHighPtEMCAL,fGammaVeryHighPtDCAL,fGammaHighPtEMCAL,fGammaHighPtDCAL,fGammaLowPtEMCAL,fGammaLowPtDCAL,fGammaVeryLowPtEMCAL,fGammaVeryLowPtDCAL"}; Configurable skipMBGapEvents{"skipMBGapEvents", false, "flag to choose to reject min. bias gap events; jet-level rejection applied at the jet finder level, here rejection is applied for collision and track process functions"}; @@ -122,6 +124,7 @@ struct JetHadronRecoil { {"hPtTrack", "Track p_{T};p_{T};entries", {HistType::kTH1F, {{200, 0, 200}}}}, {"hEtaTrack", "Track #eta;#eta;entries", {HistType::kTH1F, {{100, -1.0, 1.0}}}}, {"hPhiTrack", "Track #phi;#phi;entries", {HistType::kTH1F, {{100, 0.0, o2::constants::math::TwoPI}}}}, + {"hTrack3D", "3D tracks histogram;p_{T};#eta;#phi", {HistType::kTH3F, {{200, 0, 200}, {100, -1.0, 1.0}, {100, 0.0, o2::constants::math::TwoPI}}}}, {"hPtTrackPtHard", "Track p_{T} vs #hat{p};p_{T};#frac{p_{T}}{#hat{p}}", {HistType::kTH2F, {{200, 0, 200}, {20, 0, 5}}}}, {"hConstituents3D", "3D constituents histogram;p_{T};#eta;#phi", {HistType::kTH3F, {{200, 0, 200}, {100, -1.0, 1.0}, {100, 0.0, o2::constants::math::TwoPI}}}}, {"hReferencePtDPhi", "jet p_{T} vs DPhi;#Delta#phi;p_{T,jet}", {HistType::kTH2F, {{100, 0, o2::constants::math::TwoPI}, {500, -100, 400}}}}, @@ -219,6 +222,9 @@ struct JetHadronRecoil { if (!jetderiveddatautilities::selectTrack(track, trackSelection)) { continue; } + if (track.pt() > pTHatTrackMaxMCD * pTHat) { + return; + } if (isSigCol && track.pt() < ptTTsigMax && track.pt() > ptTTsigMin) { phiTTAr.push_back(track.phi()); ptTTAr.push_back(track.pt()); @@ -234,7 +240,8 @@ struct JetHadronRecoil { registry.fill(HIST("hPtTrack"), track.pt(), weight); registry.fill(HIST("hEtaTrack"), track.eta(), weight); registry.fill(HIST("hPhiTrack"), track.phi(), weight); - registry.fill(HIST("hPtTrackPtHard"), track.pt(), track.pt() / pTHat); + registry.fill(HIST("hTrack3D"), track.pt(), track.eta(), track.phi(), weight); + registry.fill(HIST("hPtTrackPtHard"), track.pt(), track.pt() / pTHat, weight); } if (nTT > 0) { @@ -260,7 +267,7 @@ struct JetHadronRecoil { for (const auto& jet : jets) { if (jet.pt() > pTHatMaxMCD * pTHat) { - continue; + return; } for (const auto& constituent : jet.template tracks_as
()) { if (constituent.pt() > leadingPT) { @@ -335,6 +342,9 @@ struct JetHadronRecoil { isSigCol = false; for (const auto& particle : particles) { + if (particle.pt() > pTHatTrackMaxMCD * pTHat) { + return; + } auto pdgParticle = pdg->GetParticle(particle.pdgCode()); if (!pdgParticle) { continue; @@ -370,7 +380,7 @@ struct JetHadronRecoil { for (const auto& jet : jets) { if (jet.pt() > pTHatMaxMCP * pTHat) { - continue; + return; } for (const auto& constituent : jet.template tracks_as()) { registry.fill(HIST("hConstituents3D"), constituent.pt(), constituent.eta(), constituent.phi()); From cea90cc5a1cef1adf524b5acaf64fdddb9349773 Mon Sep 17 00:00:00 2001 From: Jerome Jung Date: Wed, 4 Jun 2025 15:19:38 +0200 Subject: [PATCH 1509/1650] [PWGEM] LMee: adjusted q/pT binning and fixed DCA1vsDCA2 hist filling (#11461) --- PWGEM/Dilepton/Core/Dilepton.h | 15 +++++++++++++++ PWGEM/Dilepton/Core/SingleTrackQC.h | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/PWGEM/Dilepton/Core/Dilepton.h b/PWGEM/Dilepton/Core/Dilepton.h index ebe9e26ad50..95bd4a0b6f8 100644 --- a/PWGEM/Dilepton/Core/Dilepton.h +++ b/PWGEM/Dilepton/Core/Dilepton.h @@ -903,6 +903,11 @@ struct Dilepton { if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("uls/hMvsPhiV"), phiv, v12.M(), weight); fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("uls/hMvsOpAng"), opAng, v12.M(), weight); + if (cfgDCAType == 1) { + fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("uls/hDCA1vsDCA2"), dcaXYinSigma(t1), dcaXYinSigma(t2), weight); + } else if (cfgDCAType == 2) { + fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("uls/hDCA1vsDCA2"), dcaZinSigma(t1), dcaZinSigma(t2), weight); + } } } else if (t1.sign() > 0 && t2.sign() > 0) { // LS++ fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("lspp/hs"), v12.M(), v12.Pt(), pair_dca, weight); @@ -910,6 +915,11 @@ struct Dilepton { if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("lspp/hMvsPhiV"), phiv, v12.M(), weight); fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("lspp/hMvsOpAng"), opAng, v12.M(), weight); + if (cfgDCAType == 1) { + fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("lspp/hDCA1vsDCA2"), dcaXYinSigma(t1), dcaXYinSigma(t2), weight); + } else if (cfgDCAType == 2) { + fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("lspp/hDCA1vsDCA2"), dcaZinSigma(t1), dcaZinSigma(t2), weight); + } } } else if (t1.sign() < 0 && t2.sign() < 0) { // LS-- fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("lsmm/hs"), v12.M(), v12.Pt(), pair_dca, weight); @@ -917,6 +927,11 @@ struct Dilepton { if constexpr (pairtype == o2::aod::pwgem::dilepton::utils::pairutil::DileptonPairType::kDielectron) { fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("lsmm/hMvsPhiV"), phiv, v12.M(), weight); fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("lsmm/hMvsOpAng"), opAng, v12.M(), weight); + if (cfgDCAType == 1) { + fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("lsmm/hDCA1vsDCA2"), dcaXYinSigma(t1), dcaXYinSigma(t2), weight); + } else if (cfgDCAType == 2) { + fRegistry.fill(HIST("Pair/") + HIST(event_pair_types[ev_id]) + HIST("lsmm/hDCA1vsDCA2"), dcaZinSigma(t1), dcaZinSigma(t2), weight); + } } } } else if (cfgAnalysisType == static_cast(o2::aod::pwgem::dilepton::utils::pairutil::DileptonAnalysisType::kUPC)) { diff --git a/PWGEM/Dilepton/Core/SingleTrackQC.h b/PWGEM/Dilepton/Core/SingleTrackQC.h index 7ed467c2814..f5f8be20518 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQC.h @@ -231,7 +231,7 @@ struct SingleTrackQC { // track info fRegistry.add("Track/positive/hs", "rec. single electron", kTHnSparseD, {axis_pt, axis_eta, axis_phi, axis_dca}, true); - fRegistry.add("Track/positive/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{400, -20, 20}}, false); + fRegistry.add("Track/positive/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{2000, -5, 5}}, false); fRegistry.add("Track/positive/hDCAxyz", "DCA xy vs. z;DCA_{xy} (cm);DCA_{z} (cm)", kTH2F, {{200, -1.0f, 1.0f}, {700, -3.5f, 3.5f}}, false); fRegistry.add("Track/positive/hDCAxyzSigma", "DCA xy vs. z;DCA_{xy} (#sigma);DCA_{z} (#sigma)", kTH2F, {{400, -20.0f, 20.0f}, {400, -20.0f, 20.0f}}, false); fRegistry.add("Track/positive/hDCAxyRes_Pt", "DCA_{xy} resolution vs. pT;p_{T} (GeV/c);DCA_{xy} resolution (#mum)", kTH2F, {{200, 0, 10}, {500, 0., 500}}, false); From 5fe8d6a04e90af620475acdfc1e72e273f082702 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Wed, 4 Jun 2025 23:25:42 +0900 Subject: [PATCH 1510/1650] [PWGEM/Dilepton] reduce memory consumption in createResolutionMap.cxx (#11468) --- PWGEM/Dilepton/Tasks/createResolutionMap.cxx | 177 +++++++++++++------ 1 file changed, 121 insertions(+), 56 deletions(-) diff --git a/PWGEM/Dilepton/Tasks/createResolutionMap.cxx b/PWGEM/Dilepton/Tasks/createResolutionMap.cxx index 6613f88127d..557c3468be2 100644 --- a/PWGEM/Dilepton/Tasks/createResolutionMap.cxx +++ b/PWGEM/Dilepton/Tasks/createResolutionMap.cxx @@ -68,7 +68,7 @@ struct CreateResolutionMap { Configurable cfgEventGeneratorType{"cfgEventGeneratorType", -1, "if positive, select event generator type. i.e. gap or signal"}; Configurable cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"}; - Configurable cfg_require_true_mc_collision_association{"cfg_require_true_mc_collision_association", true, "flag to require true mc collision association"}; + Configurable cfg_require_true_mc_collision_association{"cfg_require_true_mc_collision_association", false, "flag to require true mc collision association"}; Configurable cfg_reject_fake_match_its_tpc{"cfg_reject_fake_match_its_tpc", false, "flag to reject fake match between ITS-TPC"}; // Configurable cfg_reject_fake_match_its_tpc_tof{"cfg_reject_fake_match_its_tpc_tof", false, "flag to reject fake match between ITS-TPC-TOF"}; Configurable cfg_reject_fake_match_mft_mch{"cfg_reject_fake_match_mft_mch", false, "flag to reject fake match between MFT-MCH"}; @@ -84,6 +84,9 @@ struct CreateResolutionMap { ConfigurableAxis ConfDeltaEtaBins{"ConfDeltaEtaBins", {200, -0.5f, +0.5f}, "deta bins for output histograms"}; ConfigurableAxis ConfDeltaPhiBins{"ConfDeltaPhiBins", {200, -0.5f, +0.5f}, "dphi bins for output histograms"}; + Configurable cfgFillTHnSparse{"cfgFillTHnSparse", true, "fill THnSparse for output"}; + Configurable cfgFillTH2{"cfgFillTH2", false, "fill TH2 for output"}; + Configurable cfgRequireGoodRCT{"cfgRequireGoodRCT", false, "require good detector flag in run condtion table"}; Configurable cfgRCTLabelCB{"cfgRCTLabelCB", "CBT_hadronPID", "select 1 [CBT, CBT_hadron] see O2Physics/Common/CCDB/RCTSelectionFlags.h"}; Configurable cfgRCTLabelFWDSA{"cfgRCTLabelFWDSA", "CBT_muon", "select 1 [CBT_muon] see O2Physics/Common/CCDB/RCTSelectionFlags.h"}; @@ -212,18 +215,22 @@ struct CreateResolutionMap { registry.add("Event/Electron/hImpPar_Centrality", "true imapact parameter vs. estimated centrality;impact parameter (fm);centrality (%)", kTH2F, {{200, 0, 20}, {110, 0, 110}}, true); registry.add("Event/Muon/hImpPar_Centrality", "true imapact parameter vs. estimated centrality;impact parameter (fm);centrality (%)", kTH2F, {{200, 0, 20}, {110, 0, 110}}, true); - registry.add("Electron/hPt", "rec. p_{T,l};p_{T,l} (GeV/c)", kTH1F, {{1000, 0, 10}}, false); - registry.add("Electron/hEtaPhi", "rec. #eta vs. #varphi;#varphi_{l} (rad.);#eta_{l}", kTH2F, {{90, 0, 2 * M_PI}, {100, -5, +5}}, false); - registry.add("Electron/Ptgen_RelDeltaPt", "resolution", kTH2F, {{axis_pt_gen}, {axis_dpt}}, true); - registry.add("Electron/Ptgen_DeltaEta", "resolution", kTH2F, {{axis_pt_gen}, {axis_deta}}, true); - registry.add("Electron/Ptgen_DeltaPhi_Pos", "resolution", kTH2F, {{axis_pt_gen}, {axis_dphi}}, true); - registry.add("Electron/Ptgen_DeltaPhi_Neg", "resolution", kTH2F, {{axis_pt_gen}, {axis_dphi}}, true); - registry.addClone("Electron/", "StandaloneMuon/"); - registry.addClone("Electron/", "GlobalMuon/"); - - registry.add("Electron/hs_reso", "8D resolution positive", kTHnSparseF, {axis_cent, axis_pt_gen, axis_eta_cb_gen, axis_phi_gen, axis_charge_gen, axis_dpt, axis_deta, axis_dphi}, true); - registry.add("StandaloneMuon/hs_reso", "8D resolution positive", kTHnSparseF, {axis_cent, axis_pt_gen, axis_eta_fwd_gen, axis_phi_gen, axis_charge_gen, axis_dpt, axis_deta, axis_dphi}, true); - registry.add("GlobalMuon/hs_reso", "8D resolution positive", kTHnSparseF, {axis_cent, axis_pt_gen, axis_eta_fwd_gen, axis_phi_gen, axis_charge_gen, axis_dpt, axis_deta, axis_dphi}, true); + if (cfgFillTH2) { + registry.add("Electron/hPt", "rec. p_{T,l};p_{T,l} (GeV/c)", kTH1F, {{1000, 0, 10}}, false); + registry.add("Electron/hEtaPhi", "rec. #eta vs. #varphi;#varphi_{l} (rad.);#eta_{l}", kTH2F, {{90, 0, 2 * M_PI}, {100, -5, +5}}, false); + registry.add("Electron/Ptgen_RelDeltaPt", "resolution", kTH2F, {{axis_pt_gen}, {axis_dpt}}, true); + registry.add("Electron/Ptgen_DeltaEta", "resolution", kTH2F, {{axis_pt_gen}, {axis_deta}}, true); + registry.add("Electron/Ptgen_DeltaPhi_Pos", "resolution", kTH2F, {{axis_pt_gen}, {axis_dphi}}, true); + registry.add("Electron/Ptgen_DeltaPhi_Neg", "resolution", kTH2F, {{axis_pt_gen}, {axis_dphi}}, true); + registry.addClone("Electron/", "StandaloneMuon/"); + registry.addClone("Electron/", "GlobalMuon/"); + } + + if (cfgFillTHnSparse) { + registry.add("Electron/hs_reso", "8D resolution", kTHnSparseF, {axis_cent, axis_pt_gen, axis_eta_cb_gen, axis_phi_gen, axis_charge_gen, axis_dpt, axis_deta, axis_dphi}, true); + registry.add("StandaloneMuon/hs_reso", "8D resolution", kTHnSparseF, {axis_cent, axis_pt_gen, axis_eta_fwd_gen, axis_phi_gen, axis_charge_gen, axis_dpt, axis_deta, axis_dphi}, true); + registry.add("GlobalMuon/hs_reso", "8D resolution", kTHnSparseF, {axis_cent, axis_pt_gen, axis_eta_fwd_gen, axis_phi_gen, axis_charge_gen, axis_dpt, axis_deta, axis_dphi}, true); + } } void initCCDB(aod::BCsWithTimestamps::iterator const& bc) @@ -376,8 +383,8 @@ struct CreateResolutionMap { std::pair> itsRequirement_ibany = {1, {0, 1, 2}}; // any hits on 3 ITS ib layers. std::pair> itsRequirement_ib1st = {1, {0}}; // first hit on ITS ib layers. - template - bool isSelectedTrack(TCollision const& collision, TTrack const& track) + template + bool isSelectedTrack(TTrack const& track) { if (!track.hasITS() || !track.hasTPC()) { return false; @@ -425,23 +432,63 @@ struct CreateResolutionMap { return false; } - o2::dataformats::DCA mDcaInfoCov; - mDcaInfoCov.set(999, 999, 999, 999, 999); - auto track_par_cov_recalc = getTrackParCov(track); - track_par_cov_recalc.setPID(o2::track::PID::Electron); - mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); - mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); - o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc, 2.f, matCorr, &mDcaInfoCov); - float dcaXY = mDcaInfoCov.getY(); - float dcaZ = mDcaInfoCov.getZ(); + return true; + } + + template + bool isSelectedTrackKine(TTrack const& track, const float pt, const float eta, const float dcaXY, const float dcaZ) + { + if (!track.hasITS() || !track.hasTPC()) { + return false; + } + + if (track.tpcChi2NCl() > electroncuts.cfg_max_chi2tpc) { + return false; + } + + if (track.itsChi2NCl() > electroncuts.cfg_max_chi2its) { + return false; + } + + if (track.itsNCls() < electroncuts.cfg_min_ncluster_its) { + return false; + } + if (track.itsNClsInnerBarrel() < electroncuts.cfg_min_ncluster_itsib) { + return false; + } + + auto hits = std::count_if(itsRequirement_ibany.second.begin(), itsRequirement_ibany.second.end(), [&](auto&& requiredLayer) { return track.itsClusterMap() & (1 << requiredLayer); }); + if (hits < itsRequirement_ibany.first) { + return false; + } + if (electroncuts.cfg_require_itsib_1st) { + auto hit_ib1st = std::count_if(itsRequirement_ib1st.second.begin(), itsRequirement_ib1st.second.end(), [&](auto&& requiredLayer) { return track.itsClusterMap() & (1 << requiredLayer); }); + if (hit_ib1st < itsRequirement_ib1st.first) { + return false; + } + } - // LOGF(info, "collision.globalIndex() = %d, track.collisionId() = %d, track.pt() = %.16f, track_par_cov_recalc.getPt() = %.16f", collision.globalIndex(), track.collisionId(), track.pt(), track_par_cov_recalc.getPt()); + if (track.tpcNClsFound() < electroncuts.cfg_min_ncluster_tpc) { + return false; + } + + if (track.tpcNClsCrossedRows() < electroncuts.cfg_min_ncrossedrows) { + return false; + } + + if (track.tpcCrossedRowsOverFindableCls() < electroncuts.cfg_min_tpc_cr_findable_ratio) { + return false; + } + + if (track.tpcFractionSharedCls() > electroncuts.cfg_max_frac_shared_clusters_tpc) { + return false; + } if (std::fabs(dcaXY) > electroncuts.cfg_max_dcaxy || std::fabs(dcaZ) > electroncuts.cfg_max_dcaz) { return false; } - if (track_par_cov_recalc.getPt() < electroncuts.cfg_min_pt_track || std::fabs(track_par_cov_recalc.getEta()) > electroncuts.cfg_max_eta_track) { + if (pt < electroncuts.cfg_min_pt_track || std::fabs(eta) > electroncuts.cfg_max_eta_track) { return false; } @@ -555,29 +602,38 @@ struct CreateResolutionMap { if (cfgRequireGoodRCT && !rctCheckerFWDSA.checkTable(collision)) { return; } - registry.fill(HIST("StandaloneMuon/hPt"), pt); - registry.fill(HIST("StandaloneMuon/hEtaPhi"), phi, eta); - registry.fill(HIST("StandaloneMuon/hs_reso"), centrality, mcparticle.pt(), mcparticle.eta(), mcparticle.phi(), -mcparticle.pdgCode() / 13, (mcparticle.pt() - pt) / mcparticle.pt(), mcparticle.eta() - eta, mcparticle.phi() - phi); - registry.fill(HIST("StandaloneMuon/Ptgen_RelDeltaPt"), mcparticle.pt(), (mcparticle.pt() - pt) / mcparticle.pt()); - registry.fill(HIST("StandaloneMuon/Ptgen_DeltaEta"), mcparticle.pt(), mcparticle.eta() - eta); - if (mcparticle.pdgCode() == -13) { // positive muon - registry.fill(HIST("StandaloneMuon/Ptgen_DeltaPhi_Pos"), mcparticle.pt(), mcparticle.phi() - phi); - } else if (mcparticle.pdgCode() == 13) { // negative muon - registry.fill(HIST("StandaloneMuon/Ptgen_DeltaPhi_Neg"), mcparticle.pt(), mcparticle.phi() - phi); + if (cfgFillTHnSparse) { + registry.fill(HIST("StandaloneMuon/hs_reso"), centrality, mcparticle.pt(), mcparticle.eta(), mcparticle.phi(), -mcparticle.pdgCode() / 13, (mcparticle.pt() - pt) / mcparticle.pt(), mcparticle.eta() - eta, mcparticle.phi() - phi); + } + + if (cfgFillTH2) { + registry.fill(HIST("StandaloneMuon/hPt"), pt); + registry.fill(HIST("StandaloneMuon/hEtaPhi"), phi, eta); + registry.fill(HIST("StandaloneMuon/Ptgen_RelDeltaPt"), mcparticle.pt(), (mcparticle.pt() - pt) / mcparticle.pt()); + registry.fill(HIST("StandaloneMuon/Ptgen_DeltaEta"), mcparticle.pt(), mcparticle.eta() - eta); + if (mcparticle.pdgCode() == -13) { // positive muon + registry.fill(HIST("StandaloneMuon/Ptgen_DeltaPhi_Pos"), mcparticle.pt(), mcparticle.phi() - phi); + } else if (mcparticle.pdgCode() == 13) { // negative muon + registry.fill(HIST("StandaloneMuon/Ptgen_DeltaPhi_Neg"), mcparticle.pt(), mcparticle.phi() - phi); + } } } else if (muon.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack)) { if (cfgRequireGoodRCT && !rctCheckerFWDGL.checkTable(collision)) { return; } - registry.fill(HIST("GlobalMuon/hPt"), pt); - registry.fill(HIST("GlobalMuon/hEtaPhi"), phi, eta); - registry.fill(HIST("GlobalMuon/hs_reso"), centrality, mcparticle.pt(), mcparticle.eta(), mcparticle.phi(), -mcparticle.pdgCode() / 13, (mcparticle.pt() - pt) / mcparticle.pt(), mcparticle.eta() - eta, mcparticle.phi() - phi); - registry.fill(HIST("GlobalMuon/Ptgen_RelDeltaPt"), mcparticle.pt(), (mcparticle.pt() - pt) / mcparticle.pt()); - registry.fill(HIST("GlobalMuon/Ptgen_DeltaEta"), mcparticle.pt(), mcparticle.eta() - eta); - if (mcparticle.pdgCode() == -13) { // positive muon - registry.fill(HIST("GlobalMuon/Ptgen_DeltaPhi_Pos"), mcparticle.pt(), mcparticle.phi() - phi); - } else if (mcparticle.pdgCode() == 13) { // negative muon - registry.fill(HIST("GlobalMuon/Ptgen_DeltaPhi_Neg"), mcparticle.pt(), mcparticle.phi() - phi); + if (cfgFillTHnSparse) { + registry.fill(HIST("GlobalMuon/hs_reso"), centrality, mcparticle.pt(), mcparticle.eta(), mcparticle.phi(), -mcparticle.pdgCode() / 13, (mcparticle.pt() - pt) / mcparticle.pt(), mcparticle.eta() - eta, mcparticle.phi() - phi); + } + if (cfgFillTH2) { + registry.fill(HIST("GlobalMuon/hPt"), pt); + registry.fill(HIST("GlobalMuon/hEtaPhi"), phi, eta); + registry.fill(HIST("GlobalMuon/Ptgen_RelDeltaPt"), mcparticle.pt(), (mcparticle.pt() - pt) / mcparticle.pt()); + registry.fill(HIST("GlobalMuon/Ptgen_DeltaEta"), mcparticle.pt(), mcparticle.eta() - eta); + if (mcparticle.pdgCode() == -13) { // positive muon + registry.fill(HIST("GlobalMuon/Ptgen_DeltaPhi_Pos"), mcparticle.pt(), mcparticle.phi() - phi); + } else if (mcparticle.pdgCode() == 13) { // negative muon + registry.fill(HIST("GlobalMuon/Ptgen_DeltaPhi_Neg"), mcparticle.pt(), mcparticle.phi() - phi); + } } } return; @@ -655,7 +711,8 @@ struct CreateResolutionMap { if (cfg_require_true_mc_collision_association && mcparticle.mcCollisionId() != collision.mcCollisionId()) { return; } - if (!isSelectedTrack(collision, track)) { + + if (!isSelectedTrack(track)) { return; } @@ -666,23 +723,31 @@ struct CreateResolutionMap { mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc, 2.f, matCorr, &mDcaInfoCov); - // float dcaXY = mDcaInfoCov.getY(); - // float dcaZ = mDcaInfoCov.getZ(); + float dcaXY = mDcaInfoCov.getY(); + float dcaZ = mDcaInfoCov.getZ(); float pt = track_par_cov_recalc.getPt(); float eta = track_par_cov_recalc.getEta(); float phi = track_par_cov_recalc.getPhi(); o2::math_utils::bringTo02Pi(phi); - registry.fill(HIST("Electron/hPt"), pt); - registry.fill(HIST("Electron/hEtaPhi"), phi, eta); - registry.fill(HIST("Electron/hs_reso"), centrality, mcparticle.pt(), mcparticle.eta(), mcparticle.phi(), -mcparticle.pdgCode() / 11, (mcparticle.pt() - pt) / mcparticle.pt(), mcparticle.eta() - eta, mcparticle.phi() - phi); - registry.fill(HIST("Electron/Ptgen_RelDeltaPt"), mcparticle.pt(), (mcparticle.pt() - pt) / mcparticle.pt()); - registry.fill(HIST("Electron/Ptgen_DeltaEta"), mcparticle.pt(), mcparticle.eta() - eta); - if (mcparticle.pdgCode() == -11) { // positron - registry.fill(HIST("Electron/Ptgen_DeltaPhi_Pos"), mcparticle.pt(), mcparticle.phi() - phi); - } else if (mcparticle.pdgCode() == 11) { // electron - registry.fill(HIST("Electron/Ptgen_DeltaPhi_Neg"), mcparticle.pt(), mcparticle.phi() - phi); + if (!isSelectedTrackKine(track, pt, eta, dcaXY, dcaZ)) { + return; + } + + if (cfgFillTHnSparse) { + registry.fill(HIST("Electron/hs_reso"), centrality, mcparticle.pt(), mcparticle.eta(), mcparticle.phi(), -mcparticle.pdgCode() / 11, (mcparticle.pt() - pt) / mcparticle.pt(), mcparticle.eta() - eta, mcparticle.phi() - phi); + } + if (cfgFillTH2) { + registry.fill(HIST("Electron/hPt"), pt); + registry.fill(HIST("Electron/hEtaPhi"), phi, eta); + registry.fill(HIST("Electron/Ptgen_RelDeltaPt"), mcparticle.pt(), (mcparticle.pt() - pt) / mcparticle.pt()); + registry.fill(HIST("Electron/Ptgen_DeltaEta"), mcparticle.pt(), mcparticle.eta() - eta); + if (mcparticle.pdgCode() == -11) { // positron + registry.fill(HIST("Electron/Ptgen_DeltaPhi_Pos"), mcparticle.pt(), mcparticle.phi() - phi); + } else if (mcparticle.pdgCode() == 11) { // electron + registry.fill(HIST("Electron/Ptgen_DeltaPhi_Neg"), mcparticle.pt(), mcparticle.phi() - phi); + } } } From 1fe5ad4891790de31e0192552d71b842c8d585e5 Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Wed, 4 Jun 2025 22:49:46 +0800 Subject: [PATCH 1511/1650] [PWGLF] feat(kinkBuilder): use aod::BCs instead of aod::BCsWithTimestamps (#11460) --- PWGLF/TableProducer/Common/kinkBuilder.cxx | 66 +++++++--------------- PWGLF/Utils/svPoolCreator.h | 18 +++--- 2 files changed, 29 insertions(+), 55 deletions(-) diff --git a/PWGLF/TableProducer/Common/kinkBuilder.cxx b/PWGLF/TableProducer/Common/kinkBuilder.cxx index f51e1ba1599..d2b25be26a0 100644 --- a/PWGLF/TableProducer/Common/kinkBuilder.cxx +++ b/PWGLF/TableProducer/Common/kinkBuilder.cxx @@ -122,12 +122,9 @@ struct kinkBuilder { Configurable unlikeSignBkg{"unlikeSignBkg", false, "Use unlike sign background"}; // CCDB options - Configurable inputBz{"inputBz", -999, "bz field, -999 is automatic"}; Configurable ccdbPath{"ccdbPath", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; - Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; - Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; // PDG codes @@ -174,7 +171,6 @@ struct kinkBuilder { ccdb->setURL(ccdbPath); ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); - ccdb->setFatalWhenNull(false); fitter.setPropagateToPCA(true); fitter.setMaxR(200.); fitter.setMinParamChange(1e-3); @@ -183,10 +179,6 @@ struct kinkBuilder { fitter.setMaxChi2(1e9); fitter.setUseAbsDCA(true); - lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get(lutPath)); - int mat{static_cast(cfgMaterialCorrection)}; - fitter.setMatCorrType(static_cast(mat)); - svCreator.setTimeMargin(customVertexerTimeMargin); if (skipAmbiTracks) { svCreator.setSkipAmbiTracks(); @@ -210,6 +202,11 @@ struct kinkBuilder { h2MothMassPt = qaRegistry.add("h2MothMassPt", "; p_{T} (GeV/#it{c}); m (GeV/#it{c}^{2})", HistType::kTH2F, {ptAxis, massAxis}); h2ClsMapPtMoth = qaRegistry.add("h2ClsMapPtMoth", "; p_{T} (GeV/#it{c}); ITS cluster map", HistType::kTH2F, {ptAxis, itsClusterMapAxis}); h2ClsMapPtDaug = qaRegistry.add("h2ClsMapPtDaug", "; p_{T} (GeV/#it{c}); ITS cluster map", HistType::kTH2F, {ptAxis, itsClusterMapAxis}); + + for (int i = 0; i < 5; i++) { + mBBparamsDaug[i] = cfgBetheBlochParams->get("Daughter", Form("p%i", i)); + } + mBBparamsDaug[5] = cfgBetheBlochParams->get("Daughter", "resolution"); } template @@ -247,7 +244,7 @@ struct kinkBuilder { } template - void fillCandidateData(const Tcolls& collisions, const Ttracks& tracks, aod::AmbiguousTracks const& ambiguousTracks, aod::BCsWithTimestamps const& bcs) + void fillCandidateData(const Tcolls& collisions, const Ttracks& tracks, aod::AmbiguousTracks const& ambiguousTracks, aod::BCs const& bcs) { svCreator.clearPools(); svCreator.fillBC2Coll(collisions, bcs); @@ -274,7 +271,7 @@ struct kinkBuilder { auto trackDaug = tracks.rawIteratorAt(svCand.tr1Idx); auto const& collision = trackMoth.template collision_as(); - auto const& bc = collision.template bc_as(); + auto const& bc = collision.template bc_as(); initCCDB(bc); o2::dataformats::VertexBase primaryVertex; @@ -283,9 +280,9 @@ struct kinkBuilder { kinkCand.primVtx = {primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ()}; o2::track::TrackParCov trackParCovMoth = getTrackParCov(trackMoth); + o2::track::TrackParCov trackParCovMothPV{trackParCovMoth}; o2::base::Propagator::Instance()->PropagateToXBxByBz(trackParCovMoth, LayerRadii[trackMoth.itsNCls() - 1]); - o2::track::TrackParCov trackParCovMothPV = getTrackParCov(trackMoth); std::array dcaInfoMoth; o2::base::Propagator::Instance()->propagateToDCABxByBz({primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ()}, trackParCovMothPV, 2.f, static_cast(cfgMaterialCorrection.value), &dcaInfoMoth); @@ -401,51 +398,28 @@ struct kinkBuilder { } } - void initCCDB(aod::BCsWithTimestamps::iterator const& bc) + void initCCDB(aod::BCs::iterator const& bc) { if (mRunNumber == bc.runNumber()) { return; } - auto run3grp_timestamp = bc.timestamp(); - - o2::parameters::GRPObject* grpo = ccdb->getForTimeStamp(grpPath, run3grp_timestamp); - o2::parameters::GRPMagField* grpmag = 0x0; - if (grpo) { - o2::base::Propagator::initFieldFromGRP(grpo); - if (inputBz < -990) { - // Fetch magnetic field from ccdb for current collision - mBz = grpo->getNominalL3Field(); - LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << mBz << " kZG"; - } else { - mBz = inputBz; - } - } else { - grpmag = ccdb->getForTimeStamp(grpmagPath, run3grp_timestamp); - if (!grpmag) { - LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for timestamp " << run3grp_timestamp; - } - o2::base::Propagator::initFieldFromGRP(grpmag); - if (inputBz < -990) { - // Fetch magnetic field from ccdb for current collision - mBz = std::lround(5.f * grpmag->getL3Current() / 30000.f); - LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << mBz << " kZG"; - } else { - mBz = inputBz; - } - } + mRunNumber = bc.runNumber(); + LOG(info) << "Initializing CCDB for run " << mRunNumber; + o2::parameters::GRPMagField* grpmag = ccdb->getForRun(grpmagPath, mRunNumber); + o2::base::Propagator::initFieldFromGRP(grpmag); + mBz = grpmag->getNominalL3Field(); + fitter.setBz(mBz); - for (int i = 0; i < 5; i++) { - mBBparamsDaug[i] = cfgBetheBlochParams->get("Daughter", Form("p%i", i)); + if (!lut) { + lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get(lutPath)); + int mat{static_cast(cfgMaterialCorrection)}; + fitter.setMatCorrType(static_cast(mat)); } - mBBparamsDaug[5] = cfgBetheBlochParams->get("Daughter", "resolution"); - - fitter.setBz(mBz); - mRunNumber = bc.runNumber(); o2::base::Propagator::Instance()->setMatLUT(lut); LOG(info) << "Task initialized for run " << mRunNumber << " with magnetic field " << mBz << " kZG"; } - void process(aod::Collisions const& collisions, TracksFull const& tracks, aod::AmbiguousTracks const& ambiTracks, aod::BCsWithTimestamps const& bcs) + void process(aod::Collisions const& collisions, TracksFull const& tracks, aod::AmbiguousTracks const& ambiTracks, aod::BCs const& bcs) { kinkCandidates.clear(); diff --git a/PWGLF/Utils/svPoolCreator.h b/PWGLF/Utils/svPoolCreator.h index 2414eb7e19b..25da298fe34 100644 --- a/PWGLF/Utils/svPoolCreator.h +++ b/PWGLF/Utils/svPoolCreator.h @@ -73,20 +73,20 @@ class svPoolCreator o2::vertexing::DCAFitterN<2>* getFitter() { return &fitter; } std::array, 4> getTrackCandPool() { return trackCandPool; } - template - void fillBC2Coll(const C& collisions, aod::BCsWithTimestamps const&) + template + void fillBC2Coll(const C& collisions, BC const&) { for (unsigned i = 0; i < collisions.size(); i++) { auto collision = collisions.rawIteratorAt(i); if (!collision.has_bc()) { continue; } - bc2Coll[collision.template bc_as().globalBC()] = i; + bc2Coll[collision.template bc_as().globalBC()] = i; } } - template - void appendTrackCand(const T& trackCand, const C& collisions, int pdgHypo, o2::aod::AmbiguousTracks const& ambiTracks, aod::BCsWithTimestamps const&) + template + void appendTrackCand(const T& trackCand, const C& collisions, int pdgHypo, o2::aod::AmbiguousTracks const& ambiTracks, BC const&) { if (pdgHypo != track0Pdg && pdgHypo != track1Pdg) { LOG(debug) << "Wrong pdg hypothesis"; @@ -97,18 +97,18 @@ class svPoolCreator uint64_t globalBC = BcInvalid; if (trackCand.has_collision()) { if (trackCand.template collision_as().has_bc()) { - globalBC = trackCand.template collision_as().template bc_as().globalBC(); + globalBC = trackCand.template collision_as().template bc_as().globalBC(); } } else if (!skipAmbiTracks) { for (const auto& ambTrack : ambiTracks) { if (ambTrack.trackId() != trackCand.globalIndex()) { continue; } - if (!ambTrack.has_bc() || ambTrack.bc_as().size() == 0) { + if (!ambTrack.has_bc() || ambTrack.bc_as().size() == 0) { globalBC = BcInvalid; break; } - globalBC = ambTrack.bc_as().begin().globalBC(); + globalBC = ambTrack.bc_as().begin().globalBC(); break; } } else { @@ -134,7 +134,7 @@ class svPoolCreator const auto& collision = collisions.rawIteratorAt(i); float collTime = collision.collisionTime(); float collTimeRes2 = collision.collisionTimeRes() * collision.collisionTimeRes(); - uint64_t collBC = collision.template bc_as().globalBC(); + uint64_t collBC = collision.template bc_as().globalBC(); int collIdx = collision.globalIndex(); int64_t bcOffset = globalBC - static_cast(collBC); if (static_cast(std::abs(bcOffset)) > bOffsetMax) { From a0da1f2bff4caba44b76bdf4a3489b80e11c0d5d Mon Sep 17 00:00:00 2001 From: Roman Lietava Date: Wed, 4 Jun 2025 18:28:16 +0200 Subject: [PATCH 1512/1650] [PWGLF] multiplicity and centrality (#11406) --- PWGLF/DataModel/LFNonPromptCascadeTables.h | 24 ++++++++++++++++++-- PWGLF/Tasks/Strangeness/nonPromptCascade.cxx | 18 +++++++++------ 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/PWGLF/DataModel/LFNonPromptCascadeTables.h b/PWGLF/DataModel/LFNonPromptCascadeTables.h index 687d698a529..177167d5997 100644 --- a/PWGLF/DataModel/LFNonPromptCascadeTables.h +++ b/PWGLF/DataModel/LFNonPromptCascadeTables.h @@ -115,6 +115,10 @@ DECLARE_SOA_COLUMN(MotherDecayDaughters, motherDecayDaughters, int8_t); DECLARE_SOA_COLUMN(Sel8, sel8, bool); DECLARE_SOA_COLUMN(MultFT0C, multFT0C, float); DECLARE_SOA_COLUMN(MultFT0A, multFT0A, float); +DECLARE_SOA_COLUMN(MultFT0M, multFT0M, float); +DECLARE_SOA_COLUMN(CentFT0C, centFT0C, float); +DECLARE_SOA_COLUMN(CentFT0A, centFT0A, float); +DECLARE_SOA_COLUMN(CentFT0M, centFT0M, float); } // namespace NPCascadeTable DECLARE_SOA_TABLE(NPCascTable, "AOD", "NPCASCTABLE", @@ -175,7 +179,11 @@ DECLARE_SOA_TABLE(NPCascTable, "AOD", "NPCASCTABLE", NPCascadeTable::BachPionTOFNSigma, NPCascadeTable::Sel8, NPCascadeTable::MultFT0C, - NPCascadeTable::MultFT0A) + NPCascadeTable::MultFT0A, + NPCascadeTable::MultFT0M, + NPCascadeTable::CentFT0C, + NPCascadeTable::CentFT0A, + NPCascadeTable::CentFT0M) DECLARE_SOA_TABLE(NPCascTableNT, "AOD", "NPCASCTABLENT", NPCascadeTable::MatchingChi2, @@ -235,7 +243,11 @@ DECLARE_SOA_TABLE(NPCascTableNT, "AOD", "NPCASCTABLENT", NPCascadeTable::BachPionTOFNSigma, NPCascadeTable::Sel8, NPCascadeTable::MultFT0C, - NPCascadeTable::MultFT0A) + NPCascadeTable::MultFT0A, + NPCascadeTable::MultFT0M, + NPCascadeTable::CentFT0C, + NPCascadeTable::CentFT0A, + NPCascadeTable::CentFT0M) DECLARE_SOA_TABLE(NPCascTableMC, "AOD", "NPCASCTABLEMC", NPCascadeTable::MatchingChi2, @@ -302,6 +314,10 @@ DECLARE_SOA_TABLE(NPCascTableMC, "AOD", "NPCASCTABLEMC", NPCascadeTable::Sel8, NPCascadeTable::MultFT0C, NPCascadeTable::MultFT0A, + NPCascadeTable::MultFT0M, + NPCascadeTable::CentFT0C, + NPCascadeTable::CentFT0A, + NPCascadeTable::CentFT0M, NPCascadeTable::gPt, NPCascadeTable::gEta, NPCascadeTable::gPhi, @@ -381,6 +397,10 @@ DECLARE_SOA_TABLE(NPCascTableMCNT, "AOD", "NPCASCTABLEMCNT", NPCascadeTable::Sel8, NPCascadeTable::MultFT0C, NPCascadeTable::MultFT0A, + NPCascadeTable::MultFT0M, + NPCascadeTable::CentFT0C, + NPCascadeTable::CentFT0A, + NPCascadeTable::CentFT0M, NPCascadeTable::gPt, NPCascadeTable::gEta, NPCascadeTable::gPhi, diff --git a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx index 51f6ba34bb2..f46b865393a 100644 --- a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx +++ b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx @@ -121,8 +121,11 @@ struct NPCascCandidate { bool sel8; float multFT0C; float multFT0A; + float multFT0M; + float centFT0C; + float centFT0A; + float centFT0M; }; - std::array isFromHF(auto& particle) { bool fromBeauty = false; @@ -170,8 +173,8 @@ struct NonPromptCascadeTask { using TracksExtData = soa::Join; using TracksExtMC = soa::Join; - using CollisionCandidatesRun3 = soa::Join; - using CollisionCandidatesRun3MC = soa::Join; + using CollisionCandidatesRun3 = soa::Join; + using CollisionCandidatesRun3MC = soa::Join; Preslice perCollision = aod::track::collisionId; Preslice perCollisionMC = aod::track::collisionId; @@ -192,6 +195,7 @@ struct NonPromptCascadeTask { Configurable cfgMinCosPA{"cfgMinCosPA", -1.f, "Minimum cosine of pointing angle"}; Configurable> cfgCutsPID{"particlesCutsPID", {cutsPID[0], nParticles, nCutsPID, particlesNames, cutsNames}, "Nuclei PID selections"}; Configurable cfgSkimmedProcessing{"cfgSkimmedProcessing", true, "Skimmed dataset processing"}; + Configurable cfgHMOmegaTrigger{"cfgHMOmegaTrigger", "HighMultOmega", "OTS high multiplicity Omega trigger"}; Zorro mZorro; OutputObj mZorroSummary{"ZorroSummary"}; @@ -226,6 +230,7 @@ struct NonPromptCascadeTask { void init(InitContext const&) { mZorroSummary.setObject(mZorro.getZorroSummary()); + mZorroSummary->setupTOIs(1, cfgHMOmegaTrigger); mCCDB->setURL(ccdbUrl); mCCDB->setFatalWhenNull(true); mCCDB->setCaching(true); @@ -298,7 +303,6 @@ struct NonPromptCascadeTask { } } } - template void fillCandidatesVector(CollisionType const&, TrackType const& tracks, auto const& cascades, auto& candidates) { @@ -514,7 +518,7 @@ struct NonPromptCascadeTask { cascITSclusters, protonTrack.itsNCls(), pionTrack.itsNCls(), bachelor.itsNCls(), protonTrack.tpcNClsFound(), pionTrack.tpcNClsFound(), bachelor.tpcNClsFound(), protonTrack.tpcNSigmaPr(), pionTrack.tpcNSigmaPi(), bachelor.tpcNSigmaKa(), bachelor.tpcNSigmaPi(), protonTrack.hasTOF(), pionTrack.hasTOF(), bachelor.hasTOF(), - protonTrack.tofNSigmaPr(), pionTrack.tofNSigmaPi(), bachelor.tofNSigmaKa(), bachelor.tofNSigmaPi(), collision.sel8(), collision.multFT0C(), collision.multFT0A()}); + protonTrack.tofNSigmaPr(), pionTrack.tofNSigmaPi(), bachelor.tofNSigmaKa(), bachelor.tofNSigmaPi(), collision.sel8(), collision.multFT0C(), collision.multFT0A(), collision.multFT0M(), collision.centFT0C(), collision.centFT0A(), collision.centFT0M()}); } } @@ -534,7 +538,7 @@ struct NonPromptCascadeTask { c.protonTPCNSigma, c.pionTPCNSigma, c.bachKaonTPCNSigma, c.bachPionTPCNSigma, c.protonHasTOF, c.pionHasTOF, c.bachHasTOF, c.protonTOFNSigma, c.pionTOFNSigma, c.bachKaonTOFNSigma, c.bachPionTOFNSigma, - c.sel8, c.multFT0C, c.multFT0A); + c.sel8, c.multFT0C, c.multFT0A, c.multFT0M, c.centFT0C, c.centFT0A, c.centFT0M); } } @@ -570,7 +574,7 @@ struct NonPromptCascadeTask { c.cascNClusITS, c.protonNClusITS, c.pionNClusITS, c.bachNClusITS, c.protonNClusTPC, c.pionNClusTPC, c.bachNClusTPC, c.protonTPCNSigma, c.pionTPCNSigma, c.bachKaonTPCNSigma, c.bachPionTPCNSigma, c.protonHasTOF, c.pionHasTOF, c.bachHasTOF, c.protonTOFNSigma, c.pionTOFNSigma, c.bachKaonTOFNSigma, c.bachPionTOFNSigma, - c.sel8, c.multFT0C, c.multFT0A, + c.sel8, c.multFT0C, c.multFT0A, c.multFT0M, c.centFT0C, c.centFT0A, c.centFT0M, particle.pt(), particle.eta(), particle.phi(), mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), particle.pdgCode(), mcCollision.posX() - particle.vx(), mcCollision.posY() - particle.vy(), mcCollision.posZ() - particle.vz(), mcCollision.globalIndex() == recCollision.mcCollisionId(), c.hasFakeReassociation, motherDecayDaughters); From 054ad1588990dbe0737d29fd67b433ae54892fe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Wed, 4 Jun 2025 19:48:15 +0200 Subject: [PATCH 1513/1650] [PWGHF,PWGJE] Unify and extend MC flags in candidate tables (3-prong, D*+) (#11382) --- PWGHF/Core/DecayChannels.h | 180 ++++++++++++++++++ PWGHF/D2H/Tasks/taskCharmPolarisation.cxx | 16 +- PWGHF/D2H/Tasks/taskDplus.cxx | 10 +- PWGHF/D2H/Tasks/taskDs.cxx | 38 ++-- PWGHF/D2H/Tasks/taskDstarToD0Pi.cxx | 6 +- PWGHF/D2H/Tasks/taskLc.cxx | 4 +- PWGHF/D2H/Tasks/taskSigmac.cxx | 4 +- PWGHF/D2H/Tasks/taskXic.cxx | 4 +- .../DataModel/CandidateReconstructionTables.h | 1 + .../TableProducer/correlatorDplusDminus.cxx | 8 +- .../TableProducer/correlatorDplusHadrons.cxx | 8 +- .../HFC/TableProducer/correlatorDsHadrons.cxx | 24 ++- .../HFC/TableProducer/correlatorLcHadrons.cxx | 8 +- .../HFC/TableProducer/femtoDreamProducer.cxx | 2 +- .../HFC/Tasks/taskCorrelationDplusHadrons.cxx | 4 +- PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx | 8 +- PWGHF/HFC/Tasks/taskCorrelationLcHadrons.cxx | 4 +- PWGHF/HFC/Tasks/taskFlow.cxx | 2 +- .../TableProducer/candidateCreator3Prong.cxx | 20 +- PWGHF/TableProducer/candidateCreatorDstar.cxx | 20 +- .../candidateCreatorSigmac0plusplus.cxx | 2 +- PWGHF/TableProducer/candidateCreatorXicc.cxx | 8 +- .../derivedDataCreatorDplusToPiKPi.cxx | 14 +- .../derivedDataCreatorDstarToD0Pi.cxx | 14 +- .../derivedDataCreatorLcToPKPi.cxx | 14 +- .../TableProducer/treeCreatorDplusToPiKPi.cxx | 8 +- PWGHF/TableProducer/treeCreatorDsToKKPi.cxx | 31 ++- .../TableProducer/treeCreatorDstarToD0Pi.cxx | 6 +- PWGHF/TableProducer/treeCreatorLcToPKPi.cxx | 4 +- PWGHF/TableProducer/treeCreatorXicToPKPi.cxx | 6 +- PWGHF/Tasks/taskCharmHadImpactPar.cxx | 2 +- PWGHF/Tasks/taskLcCentrality.cxx | 5 +- PWGHF/Tasks/taskMcValidation.cxx | 14 +- PWGHF/Utils/utilsMcGen.h | 34 ++-- PWGJE/Core/JetHFUtilities.h | 8 +- 35 files changed, 384 insertions(+), 157 deletions(-) create mode 100644 PWGHF/Core/DecayChannels.h diff --git a/PWGHF/Core/DecayChannels.h b/PWGHF/Core/DecayChannels.h new file mode 100644 index 00000000000..f56e8ce1005 --- /dev/null +++ b/PWGHF/Core/DecayChannels.h @@ -0,0 +1,180 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file DecayChannels.h +/// \brief Definitions of constants for MC flagging of HF decay channels. +/// \author Vít Kučera , Inha University +/// \note DecayChannelMain enums define unique combinations of the mother and the daughters for main channels. +/// \note DecayChannelResonant enums define unique combinations of the mother and the daughters for resonant channels. +/// \note Value 0 is reserved to indicate no match. +/// \note Daughter ordering convention: (charm|strange|π±|K±|π0), (baryon|meson), (+|−) + +#ifndef PWGHF_CORE_DECAYCHANNELS_H_ +#define PWGHF_CORE_DECAYCHANNELS_H_ + +#include + +namespace o2::hf_decay +{ + +// TODO +// - HF cascades (Λc+ → p K0short) +// - HF cascades to LF cascades (Ωc0/Ξc0 → Ξ+ π−, Ξc+ → Ξ+ π− π+) +// - Σc + +namespace hf_cand_2prong +{ +/// @brief 2-prong candidates: main channels +enum DecayChannelMain : int8_t { + // D0 + D0ToPiK = 1, // π+ K− + D0ToPiKPi0, // π+ K− π0 + D0ToPiPi, // π+ π− + D0ToPiPiPi0, // π+ π− π0 + D0ToKK, // K+ K− + // + LastChannelMain +}; +/// @brief 2-prong candidates: resonant channels +enum DecayChannelResonant : int8_t { + // D0 + D0ToRhoplusPi = 1, // ρ+ π− + D0ToRhoplusK, // ρ+ K− + D0ToKstar0Pi0, // anti-K*0 π0 + D0ToKstarPi, // K*− π+ + // + LastChannelResonant +}; +} // namespace hf_cand_2prong + +namespace hf_cand_3prong +{ +/// @brief 3-prong candidates: main channels +enum DecayChannelMain : int8_t { + // D+ + DplusToPiKPi = 1, // π+ K− π+ + DplusToPiKPiPi0, // π+ K− π+ π0 + DplusToPiPiPi, // π+ π− π+ + DplusToPiKK, // π+ K− K+ + // Ds+ + DsToPiKK, // π+ K− K+ + DsToPiKKPi0, // π+ K− K+ π0 + DsToPiPiK, // π+ π− K+ + DsToPiPiPi, // π+ π− π+ + DsToPiPiPiPi0, // π+ π− π+ π0 + // D*+ + DstarToPiKPi, // π+ K− π+ (from [(D0 → π+ K−) π+]) + // Λc+ + LcToPKPi, // p K− π+ + LcToPKPiPi0, // p K− π+ π0 + LcToPPiPi, // p π− π+ + LcToPKK, // p K− K+ + // Ξc+ + XicToPKPi, // p K− π+ + XicToPKK, // p K− K+ + XicToSPiPi, // Σ+ π− π+ + // + LastChannelMain +}; +/// @brief 3-prong candidates: resonant channels +enum DecayChannelResonant : int8_t { + // D+ + DplusToPhiPi = 1, // φ π+ + DplusToKstar0K, // anti-K*0 K+ + DplusToKstar1430_0K, // anti-K*0(1430) K+ + DplusToRho0Pi, // ρ0 π+ + DplusToF2_1270Pi, // f2(1270) π+ + // Ds+ + DsToPhiPi, // φ π+ + DsToPhiRhoplus, // φ ρ+ + DsToKstar0K, // anti-K*0 K+ + DsToKstar0Pi, // anti-K*0 π+ + DsToRho0Pi, // ρ0 π+ + DsToRho0K, // ρ0 K+ + DsToF2_1270Pi, // f2(1270) π+ + DsToF0_1370K, // f0(1370) K+ + DsToEtaPi, // η π+ + // Λc+ + LcToPKstar0, // p K*0(892) + LcToDeltaplusplusK, // Δ++ K− + LcToL1520Pi, // Λ(1520) π+ + // Ξc+ + XicToPKstar0, // p anti-K*0(892) + XicToPPhi, // p φ + // + LastChannelResonant +}; +} // namespace hf_cand_3prong + +namespace hf_cand_dstar +{ +/// @brief D*+ candidates: main channels +enum DecayChannelMain : int8_t { + // D*+ + DstarToPiKPi = 1, // π+ K− π+ (from [(D0 → π+ K−) π+]) + DstarToPiKPiPi0, // π+ K− π+ π0 (from [(D0 → π+ K− π0) π+] or [(D+ → π+ K− π+) π0]) + // + LastChannelMain +}; +} // namespace hf_cand_dstar + +namespace hf_cand_beauty +{ +/// @brief beauty candidates: main channels +enum DecayChannelMain : int8_t { + // B0 + B0ToDminusPi = 1, // D− π+ + B0ToDminusPiPi0, // D− π+ π0 + B0ToDminusPiGamma, // D− π+ γ0 + B0ToDminusK, // D− K+ + B0ToD0PiPi, // anti-D0 π+ π− + // Bs0 + BsToDsPi, // Ds− π+ + BsToDsPiPi0, // Ds− π+ π0 + BsToDsPiGamma, // Ds− π+ γ0 + BsToDsK, // Ds− K+ + // Λb0 + LbToLcPi, // Λc+ π− + LbToLcPiPi0, // Λc+ π− π0 + LbToLcPiGamma, // Λc+ π− γ0 + LbToLcK, // Λc+ K− + LbToLcKPi0, // Λc+ K− π0 + // B+ + BplusToD0Pi, // anti-D0 π+ + BplusToD0PiPi0, // anti-D0 π+ π0 + BplusToD0PiGamma, // anti-D0 π+ γ0 + BplusToD0K, // anti-D0 K+ + // + LastChannelMain +}; +/// @brief beauty candidates: resonant channels +enum DecayChannelResonant : int8_t { + // B0 + B0ToDminusRhoplus = 1, // D− ρ+ + B0ToDstarminusPi, // D*− π+ + // Bs0 + BsToDsRhoplus, // Ds− ρ+ + BsToDsstarPi, // Ds*− π+ + // Λb0 + LbToLcRhoplus, // Λc+ ρ− + LbToScPi, // Σc+ π− + LbToScK, // Σc+ K− + LbToSc0Pi0, // Σc0 π0 + // B+ + BplusToD0Rhoplus, // anti-D0 ρ+ + BplusToDstar0Pi, // anti-D*0 π+ + // + LastChannelResonant +}; +} // namespace hf_cand_beauty +} // namespace o2::hf_decay + +#endif // PWGHF_CORE_DECAYCHANNELS_H_ diff --git a/PWGHF/D2H/Tasks/taskCharmPolarisation.cxx b/PWGHF/D2H/Tasks/taskCharmPolarisation.cxx index 43b75756959..95cefe1ff0f 100644 --- a/PWGHF/D2H/Tasks/taskCharmPolarisation.cxx +++ b/PWGHF/D2H/Tasks/taskCharmPolarisation.cxx @@ -1086,8 +1086,8 @@ struct TaskPolarisationCharmHadrons { bool partRecoDstar{false}; if constexpr (doMc) { if constexpr (channel == charm_polarisation::DecayChannel::DstarToDzeroPi) { - partRecoDstar = TESTBIT(std::abs(candidate.flagMcMatchRec()), aod::hf_cand_dstar::DecayType::DstarToD0PiPi0) && TESTBIT(std::abs(candidate.flagMcMatchRecD0()), aod::hf_cand_dstar::DecayType::D0ToPiKPi0); - bool signalDstar = TESTBIT(std::abs(candidate.flagMcMatchRec()), aod::hf_cand_dstar::DecayType::DstarToD0Pi) && TESTBIT(std::abs(candidate.flagMcMatchRecD0()), aod::hf_cand_dstar::DecayType::D0ToPiK); + partRecoDstar = std::abs(candidate.flagMcMatchRec()) == hf_decay::hf_cand_dstar::DecayChannelMain::DstarToPiKPiPi0 && std::abs(candidate.flagMcMatchRecD0()) == hf_decay::hf_cand_2prong::DecayChannelMain::D0ToPiKPi0; + bool signalDstar = std::abs(candidate.flagMcMatchRec()) == hf_decay::hf_cand_dstar::DecayChannelMain::DstarToPiKPi && std::abs(candidate.flagMcMatchRecD0()) == hf_decay::hf_cand_2prong::DecayChannelMain::D0ToPiK; if (!signalDstar && (!partRecoDstar || !activatePartRecoDstar)) { // this candidate is not signal and not partially reconstructed signal, skip return isCandidateInSignalRegion; } @@ -1099,8 +1099,8 @@ struct TaskPolarisationCharmHadrons { return isCandidateInSignalRegion; } } else if constexpr (channel == charm_polarisation::DecayChannel::LcToPKPi) { - if constexpr (!studyLcPKPiBkgMc) { // skip this if studyLcPKPiBkgMc is true, since we are interested in background - if (!TESTBIT(std::abs(candidate.flagMcMatchRec()), aod::hf_cand_3prong::DecayType::LcToPKPi)) { // this candidate is not signal, skip + if constexpr (!studyLcPKPiBkgMc) { // skip this if studyLcPKPiBkgMc is true, since we are interested in background + if (std::abs(candidate.flagMcMatchRec()) != hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi) { // this candidate is not signal, skip return isCandidateInSignalRegion; } origin = candidate.originMcRec(); @@ -1501,7 +1501,7 @@ struct TaskPolarisationCharmHadrons { /// check if the pKpi triplet is a Lc->pKpi int8_t isRealLcPKPi = 0; - if (isRealPKPi && TESTBIT(std::abs(candidate.flagMcMatchRec()), aod::hf_cand_3prong::DecayType::LcToPKPi)) { + if (isRealPKPi && (std::abs(candidate.flagMcMatchRec()) == hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi)) { isRealLcPKPi = 1; } @@ -1607,8 +1607,8 @@ struct TaskPolarisationCharmHadrons { int8_t charge = -99; bool partRecoDstar{false}; if constexpr (channel == charm_polarisation::DecayChannel::DstarToDzeroPi) { - partRecoDstar = TESTBIT(std::abs(mcParticle.flagMcMatchGen()), aod::hf_cand_dstar::DecayType::DstarToD0PiPi0) && TESTBIT(std::abs(mcParticle.flagMcMatchGenD0()), aod::hf_cand_dstar::DecayType::D0ToPiKPi0); - bool signalDstar = TESTBIT(std::abs(mcParticle.flagMcMatchGen()), aod::hf_cand_dstar::DecayType::DstarToD0Pi) && TESTBIT(std::abs(mcParticle.flagMcMatchGenD0()), aod::hf_cand_dstar::DecayType::D0ToPiK); + partRecoDstar = TESTBIT(std::abs(mcParticle.flagMcMatchGen()), hf_decay::hf_cand_dstar::DecayChannelMain::DstarToPiKPiPi0) && TESTBIT(std::abs(mcParticle.flagMcMatchGenD0()), hf_decay::hf_cand_2prong::DecayChannelMain::D0ToPiKPi0); + bool signalDstar = TESTBIT(std::abs(mcParticle.flagMcMatchGen()), hf_decay::hf_cand_dstar::DecayChannelMain::DstarToPiKPi) && TESTBIT(std::abs(mcParticle.flagMcMatchGenD0()), hf_decay::hf_cand_2prong::DecayChannelMain::D0ToPiK); if (!signalDstar && (!activatePartRecoDstar || !partRecoDstar)) { // this particle is not signal and not partially reconstructed signal, skip return; @@ -1629,7 +1629,7 @@ struct TaskPolarisationCharmHadrons { massDau = massPi; massCharmHad = massDstar; } else if constexpr (channel == charm_polarisation::DecayChannel::LcToPKPi) { - if (!TESTBIT(std::abs(mcParticle.flagMcMatchGen()), aod::hf_cand_3prong::DecayType::LcToPKPi)) { // this particle is not signal, skip + if (std::abs(mcParticle.flagMcMatchGen()) != hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi) { // this particle is not signal, skip return; } origin = mcParticle.originMcGen(); diff --git a/PWGHF/D2H/Tasks/taskDplus.cxx b/PWGHF/D2H/Tasks/taskDplus.cxx index ccbb6a2bd90..cbf6118ce68 100644 --- a/PWGHF/D2H/Tasks/taskDplus.cxx +++ b/PWGHF/D2H/Tasks/taskDplus.cxx @@ -74,12 +74,12 @@ struct HfTaskDplus { Partition selectedDPlusCandidatesWithMl = aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlagDplus; // Matched MC - Partition recoDPlusCandidates = nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_3prong::DecayType::DplusToPiKPi)) && aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlagDplus; - Partition recoDPlusCandidatesWithMl = nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_3prong::DecayType::DplusToPiKPi)) && aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlagDplus; + Partition recoDPlusCandidates = nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi) && aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlagDplus; + Partition recoDPlusCandidatesWithMl = nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi) && aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlagDplus; // MC Bkg - Partition recoBkgCandidates = nabs(aod::hf_cand_3prong::flagMcMatchRec) != static_cast(BIT(aod::hf_cand_3prong::DecayType::DplusToPiKPi)) && aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlagDplus; - Partition recoBkgCandidatesWithMl = nabs(aod::hf_cand_3prong::flagMcMatchRec) != static_cast(BIT(aod::hf_cand_3prong::DecayType::DplusToPiKPi)) && aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlagDplus; + Partition recoBkgCandidates = nabs(aod::hf_cand_3prong::flagMcMatchRec) != static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi) && aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlagDplus; + Partition recoBkgCandidatesWithMl = nabs(aod::hf_cand_3prong::flagMcMatchRec) != static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi) && aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlagDplus; ConfigurableAxis thnConfigAxisY{"thnConfigAxisY", {40, -1, 1}, "Cand. rapidity bins"}; ConfigurableAxis thnConfigAxisCent{"thnConfigAxisCent", {110, 0., 110.}, ""}; @@ -569,7 +569,7 @@ struct HfTaskDplus { ptGenB = -1; flagGenB = -1; auto yGen = RecoDecay::y(particle.pVector(), o2::constants::physics::MassDPlus); - if ((yCandGenMax >= 0. && std::abs(yGen) > yCandGenMax) || (std::abs(particle.flagMcMatchGen()) != 1 << aod::hf_cand_3prong::DecayType::DplusToPiKPi)) { + if ((yCandGenMax >= 0. && std::abs(yGen) > yCandGenMax) || (std::abs(particle.flagMcMatchGen()) != hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi)) { continue; } if (particle.originMcGen() == RecoDecay::OriginType::NonPrompt) { diff --git a/PWGHF/D2H/Tasks/taskDs.cxx b/PWGHF/D2H/Tasks/taskDs.cxx index f8d848e596f..2b94c93f6b8 100644 --- a/PWGHF/D2H/Tasks/taskDs.cxx +++ b/PWGHF/D2H/Tasks/taskDs.cxx @@ -57,6 +57,19 @@ enum DataType { Data = 0, McBkg, kDataTypes }; +enum Mother : int8_t { + Ds, + Dplus +}; + +enum ResonantChannel : int8_t { + PhiPi = 1, + Kstar0K = 2 +}; + +static std::unordered_map> channelsResonant = {{{Mother::Ds, {{ResonantChannel::PhiPi, hf_decay::hf_cand_3prong::DecayChannelResonant::DsToPhiPi}, {ResonantChannel::Kstar0K, hf_decay::hf_cand_3prong::DecayChannelResonant::DsToKstar0K}}}, + {Mother::Dplus, {{ResonantChannel::PhiPi, hf_decay::hf_cand_3prong::DecayChannelResonant::DplusToPhiPi}, {ResonantChannel::Kstar0K, hf_decay::hf_cand_3prong::DecayChannelResonant::DplusToKstar0K}}}}}; + template concept hasDsMlInfo = requires(T candidate) { candidate.mlProbDsToKKPi(); @@ -66,7 +79,7 @@ concept hasDsMlInfo = requires(T candidate) { /// Ds± analysis task struct HfTaskDs { - Configurable decayChannel{"decayChannel", 1, "Switch between decay channels: 1 for Ds/Dplus->PhiPi->KKpi, 2 for Ds/Dplus->K0*K->KKPi"}; + Configurable decayChannel{"decayChannel", 1, "Switch between resonant decay channels: 1 for Ds/Dplus->PhiPi->KKpi, 2 for Ds/Dplus->K0*K->KKPi"}; Configurable fillDplusMc{"fillDplusMc", true, "Switch to fill Dplus MC information"}; Configurable selectionFlagDs{"selectionFlagDs", 7, "Selection Flag for Ds"}; Configurable> classMl{"classMl", {0, 2, 3}, "Indexes of ML scores to be stored. Three indexes max."}; @@ -128,7 +141,6 @@ struct HfTaskDs { ConfigurableAxis axisCentrality{"axisCentrality", {100, 0., 1.}, "axis for centrality/multiplicity"}; ConfigurableAxis axisOccupancy{"axisOccupancy", {14, 0., 14000.}, "axis for occupancy"}; - int offsetDplusDecayChannel = aod::hf_cand_3prong::DecayChannelDToKKPi::DplusToPhiPi - aod::hf_cand_3prong::DecayChannelDToKKPi::DsToPhiPi; // Offset between Dplus and Ds to use the same decay channel. See aod::hf_cand_3prong::DecayChannelDToKKPi int mRunNumber{0}; bool lCalibLoaded; TList* lCalibObjects; @@ -162,6 +174,10 @@ struct HfTaskDs { LOGP(fatal, "No process function enabled"); } + if (decayChannel != ResonantChannel::PhiPi && decayChannel != ResonantChannel::Kstar0K) { + LOGP(fatal, "Invalid value of decayChannel"); + } + AxisSpec ptbins{axisPt, "#it{p}_{T} (GeV/#it{c})"}; AxisSpec ptBHad{axisPtBHad, "#it{p}_{T}(B) (GeV/#it{c})"}; AxisSpec flagBHad{axisFlagBHad, "B Hadron flag"}; @@ -272,37 +288,37 @@ struct HfTaskDs { template bool isDsPrompt(const CandDs& candidate) { - return std::abs(candidate.flagMcMatchRec()) == static_cast(BIT(aod::hf_cand_3prong::DecayType::DsToKKPi)) && candidate.flagMcDecayChanRec() == decayChannel && candidate.originMcRec() == RecoDecay::OriginType::Prompt; + return std::abs(candidate.flagMcMatchRec()) == static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::DsToPiKK) && candidate.flagMcDecayChanRec() == channelsResonant[Mother::Ds][decayChannel] && candidate.originMcRec() == RecoDecay::OriginType::Prompt; } template bool isDplusPrompt(const CandDs& candidate) { - return std::abs(candidate.flagMcMatchRec()) == static_cast(BIT(aod::hf_cand_3prong::DecayType::DsToKKPi)) && candidate.flagMcDecayChanRec() == decayChannel + offsetDplusDecayChannel && candidate.originMcRec() == RecoDecay::OriginType::Prompt; + return std::abs(candidate.flagMcMatchRec()) == static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKK) && candidate.flagMcDecayChanRec() == channelsResonant[Mother::Dplus][decayChannel] && candidate.originMcRec() == RecoDecay::OriginType::Prompt; } template bool isDsNonPrompt(const CandDs& candidate) { - return std::abs(candidate.flagMcMatchRec()) == static_cast(BIT(aod::hf_cand_3prong::DecayType::DsToKKPi)) && candidate.flagMcDecayChanRec() == decayChannel && candidate.originMcRec() == RecoDecay::OriginType::NonPrompt; + return std::abs(candidate.flagMcMatchRec()) == static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::DsToPiKK) && candidate.flagMcDecayChanRec() == channelsResonant[Mother::Ds][decayChannel] && candidate.originMcRec() == RecoDecay::OriginType::NonPrompt; } template bool isDplusNonPrompt(const CandDs& candidate) { - return std::abs(candidate.flagMcMatchRec()) == static_cast(BIT(aod::hf_cand_3prong::DecayType::DsToKKPi)) && candidate.flagMcDecayChanRec() == decayChannel + offsetDplusDecayChannel && candidate.originMcRec() == RecoDecay::OriginType::NonPrompt; + return std::abs(candidate.flagMcMatchRec()) == static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKK) && candidate.flagMcDecayChanRec() == channelsResonant[Mother::Dplus][decayChannel] && candidate.originMcRec() == RecoDecay::OriginType::NonPrompt; } template bool isDplusBkg(const CandDs& candidate) { - return std::abs(candidate.flagMcMatchRec()) == static_cast(BIT(aod::hf_cand_3prong::DecayType::DplusToPiKPi)); + return std::abs(candidate.flagMcMatchRec()) == static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi); } template bool isLcBkg(const CandDs& candidate) { - return std::abs(candidate.flagMcMatchRec()) == static_cast(BIT(aod::hf_cand_3prong::DecayType::LcToPKPi)); + return std::abs(candidate.flagMcMatchRec()) == static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi); } /// Checks whether the candidate is in the signal region of either the Ds or D+ decay @@ -673,9 +689,9 @@ struct HfTaskDs { // MC gen. for (const auto& particle : mcParticles) { - if (std::abs(particle.flagMcMatchGen()) == 1 << aod::hf_cand_3prong::DecayType::DsToKKPi) { + if (std::abs(particle.flagMcMatchGen()) == hf_decay::hf_cand_3prong::DecayChannelMain::DsToPiKK || std::abs(particle.flagMcMatchGen()) == hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKK) { const auto& recoCollsPerMcColl = recoCollisions.sliceBy(colPerMcCollision, particle.mcCollision().globalIndex()); - if (particle.flagMcDecayChanGen() == decayChannel || (fillDplusMc && particle.flagMcDecayChanGen() == (decayChannel + offsetDplusDecayChannel))) { + if (particle.flagMcDecayChanGen() == channelsResonant[Mother::Ds][decayChannel] || (fillDplusMc && particle.flagMcDecayChanGen() == channelsResonant[Mother::Dplus][decayChannel])) { auto pt = particle.pt(); double y{0.f}; @@ -689,7 +705,7 @@ struct HfTaskDs { occ = o2::hf_occupancy::getOccupancyGenColl(recoCollsPerMcColl, occEstimator); } - if (particle.flagMcDecayChanGen() == decayChannel) { + if (particle.flagMcDecayChanGen() == channelsResonant[Mother::Ds][decayChannel]) { y = RecoDecay::y(particle.pVector(), o2::constants::physics::MassDS); if (yCandGenMax >= 0. && std::abs(y) > yCandGenMax) { continue; diff --git a/PWGHF/D2H/Tasks/taskDstarToD0Pi.cxx b/PWGHF/D2H/Tasks/taskDstarToD0Pi.cxx index eaadbab783c..0682c0584aa 100644 --- a/PWGHF/D2H/Tasks/taskDstarToD0Pi.cxx +++ b/PWGHF/D2H/Tasks/taskDstarToD0Pi.cxx @@ -313,8 +313,8 @@ struct HfTaskDstarToD0Pi { continue; } auto collision = candDstarMcRec.template collision_as(); - auto centrality = collision.centFT0M(); // 0-100% - if (TESTBIT(std::abs(candDstarMcRec.flagMcMatchRec()), aod::hf_cand_dstar::DecayType::DstarToD0Pi)) { // if MC matching is successful at Reconstruction Level + auto centrality = collision.centFT0M(); // 0-100% + if (std::abs(candDstarMcRec.flagMcMatchRec()) == hf_decay::hf_cand_dstar::DecayChannelMain::DstarToPiKPi) { // if MC matching is successful at Reconstruction Level // LOGF(info, "MC Rec Dstar loop MC Matched"); // get MC Mother particle auto prong0 = candDstarMcRec.template prong0_as(); @@ -392,7 +392,7 @@ struct HfTaskDstarToD0Pi { { // MC Gen level for (auto const& mcParticle : rowsMcPartilces) { - if (TESTBIT(std::abs(mcParticle.flagMcMatchGen()), aod::hf_cand_dstar::DecayType::DstarToD0Pi)) { // MC Matching is successful at Generator Level + if (std::abs(mcParticle.flagMcMatchGen()) == hf_decay::hf_cand_dstar::DecayChannelMain::DstarToPiKPi) { // MC Matching is successful at Generator Level auto ptGen = mcParticle.pt(); auto yGen = RecoDecay::y(mcParticle.pVector(), o2::constants::physics::MassDStar); if (yCandDstarGenMax >= 0. && std::abs(yGen) > yCandDstarGenMax) { diff --git a/PWGHF/D2H/Tasks/taskLc.cxx b/PWGHF/D2H/Tasks/taskLc.cxx index eca9a4a2672..cf3c070e6b7 100644 --- a/PWGHF/D2H/Tasks/taskLc.cxx +++ b/PWGHF/D2H/Tasks/taskLc.cxx @@ -376,7 +376,7 @@ struct HfTaskLc { continue; } - if (std::abs(candidate.flagMcMatchRec()) == 1 << aod::hf_cand_3prong::DecayType::LcToPKPi) { + if (std::abs(candidate.flagMcMatchRec()) == hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi) { // Get the corresponding MC particle. auto mcParticleProng0 = candidate.template prong0_as().template mcParticle_as>(); auto pdgCodeProng0 = std::abs(mcParticleProng0.pdgCode()); @@ -589,7 +589,7 @@ struct HfTaskLc { { // MC gen. for (const auto& particle : mcParticles) { - if (std::abs(particle.flagMcMatchGen()) == 1 << aod::hf_cand_3prong::DecayType::LcToPKPi) { + if (std::abs(particle.flagMcMatchGen()) == hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi) { auto yGen = RecoDecay::y(particle.pVector(), o2::constants::physics::MassLambdaCPlus); if (yCandGenMax >= 0. && std::abs(yGen) > yCandGenMax) { continue; diff --git a/PWGHF/D2H/Tasks/taskSigmac.cxx b/PWGHF/D2H/Tasks/taskSigmac.cxx index 39011a4a44d..3ea06c80733 100644 --- a/PWGHF/D2H/Tasks/taskSigmac.cxx +++ b/PWGHF/D2H/Tasks/taskSigmac.cxx @@ -726,7 +726,7 @@ struct HfTaskSigmac { /// loop over Lc generated particles for (const auto& particle : mcParticlesLc) { - if (std::abs(particle.flagMcMatchGen()) != BIT(aod::hf_cand_3prong::DecayType::LcToPKPi)) { + if (std::abs(particle.flagMcMatchGen()) != hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi) { continue; } if (yCandGenMax >= 0. && std::abs(RecoDecay::y(particle.pVector(), o2::constants::physics::MassLambdaCPlus)) > yCandGenMax) { @@ -1149,7 +1149,7 @@ struct HfTaskSigmac { if (enableTHn) { /// loop over Λc+ candidates w/o Σc0,++ mass-window cut for (const auto& candidateLc : candidatesLc) { - if (!TESTBIT(std::abs(candidateLc.flagMcMatchRec()), aod::hf_cand_3prong::DecayType::LcToPKPi)) { + if (std::abs(candidateLc.flagMcMatchRec()) != hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi) { continue; } double massLc(-1.); diff --git a/PWGHF/D2H/Tasks/taskXic.cxx b/PWGHF/D2H/Tasks/taskXic.cxx index d2dc111d826..5c338f8b957 100644 --- a/PWGHF/D2H/Tasks/taskXic.cxx +++ b/PWGHF/D2H/Tasks/taskXic.cxx @@ -429,7 +429,7 @@ struct HfTaskXic { massXicToPiKP = hfHelper.invMassXicToPiKP(candidate); // mass conjugate } - if (std::abs(candidate.flagMcMatchRec()) == 1 << aod::hf_cand_3prong::DecayType::XicToPKPi) { + if (std::abs(candidate.flagMcMatchRec()) == hf_decay::hf_cand_3prong::DecayChannelMain::XicToPKPi) { // Get the corresponding MC particle. auto mcParticleProng0 = candidate.template prong0_as().template mcParticle_as>(); auto pdgCodeProng0 = std::abs(mcParticleProng0.pdgCode()); @@ -572,7 +572,7 @@ struct HfTaskXic { // MC gen. for (const auto& particle : mcParticles) { - if (std::abs(particle.flagMcMatchGen()) == 1 << aod::hf_cand_3prong::DecayType::XicToPKPi) { + if (std::abs(particle.flagMcMatchGen()) == hf_decay::hf_cand_3prong::DecayChannelMain::XicToPKPi) { auto yGen = RecoDecay::y(particle.pVector(), o2::constants::physics::MassXiCPlus); if (yCandGenMax >= 0. && std::abs(yGen) > yCandGenMax) { continue; diff --git a/PWGHF/DataModel/CandidateReconstructionTables.h b/PWGHF/DataModel/CandidateReconstructionTables.h index 1f4e94b0e83..014bfa3e32e 100644 --- a/PWGHF/DataModel/CandidateReconstructionTables.h +++ b/PWGHF/DataModel/CandidateReconstructionTables.h @@ -35,6 +35,7 @@ #include "PWGLF/DataModel/LFStrangenessTables.h" #include "PWGHF/Utils/utilsPid.h" +#include "PWGHF/Core/DecayChannels.h" // FIXME: temporary until propagated where needed namespace o2::aod { diff --git a/PWGHF/HFC/TableProducer/correlatorDplusDminus.cxx b/PWGHF/HFC/TableProducer/correlatorDplusDminus.cxx index e6f40634641..3cbee2b072a 100644 --- a/PWGHF/HFC/TableProducer/correlatorDplusDminus.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDplusDminus.cxx @@ -298,7 +298,7 @@ struct HfCorrelatorDplusDminus { if (outerSecondTrack.sign() == 1) { outerParticleSign = -1; // Dminus (second daughter track is positive) } - if (std::abs(candidate1.flagMcMatchRec()) == 1 << aod::hf_cand_3prong::DecayType::DplusToPiKPi) { + if (std::abs(candidate1.flagMcMatchRec()) == hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi) { // fill invariant mass plots and per-candidate distributions from Dplus/Dminus signal candidates if (outerParticleSign == 1) { // reco and matched as Dplus registry.fill(HIST("hMassDplusMCRecSig"), hfHelper.invMassDplusToPiKPi(candidate1), candidate1.pt(), efficiencyWeight); @@ -326,7 +326,7 @@ struct HfCorrelatorDplusDminus { if (outerParticleSign == -1) { continue; // reject Dminus in outer loop } - flagDplusSignal = std::abs(candidate1.flagMcMatchRec()) == 1 << aod::hf_cand_3prong::DecayType::DplusToPiKPi; // flagDplusSignal 'true' if candidate1 matched to Dplus + flagDplusSignal = std::abs(candidate1.flagMcMatchRec()) == hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi; // flagDplusSignal 'true' if candidate1 matched to Dplus for (const auto& candidate2 : selectedDPlusCandidatesGroupedMC) { if (!(candidate2.hfflag() & 1 << aod::hf_cand_3prong::DecayType::DplusToPiKPi)) { // check decay channel flag for candidate2 continue; @@ -335,7 +335,7 @@ struct HfCorrelatorDplusDminus { if (innerSecondTrack.sign() != 1) { // keep only Dminus (with second daughter track positive) continue; } - flagDminusSignal = std::abs(candidate2.flagMcMatchRec()) == 1 << aod::hf_cand_3prong::DecayType::DplusToPiKPi; // flagDminusSignal 'true' if candidate2 matched to Dminus + flagDminusSignal = std::abs(candidate2.flagMcMatchRec()) == hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi; // flagDminusSignal 'true' if candidate2 matched to Dminus if (yCandMax >= 0. && std::abs(hfHelper.yDplus(candidate2)) > yCandMax) { continue; } @@ -428,7 +428,7 @@ struct HfCorrelatorDplusDminus { // fill pairs vs etaCut plot bool rightDecayChannels = false; - if ((std::abs(particle1.flagMcMatchGen()) == 1 << aod::hf_cand_3prong::DecayType::DplusToPiKPi) && (std::abs(particle2.flagMcMatchGen()) == 1 << aod::hf_cand_3prong::DecayType::DplusToPiKPi)) { + if ((std::abs(particle1.flagMcMatchGen()) == hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi) && (std::abs(particle2.flagMcMatchGen()) == hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi)) { rightDecayChannels = true; } do { diff --git a/PWGHF/HFC/TableProducer/correlatorDplusHadrons.cxx b/PWGHF/HFC/TableProducer/correlatorDplusHadrons.cxx index d40daca5410..a1a8941779b 100644 --- a/PWGHF/HFC/TableProducer/correlatorDplusHadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDplusHadrons.cxx @@ -422,7 +422,7 @@ struct HfCorrelatorDplusHadrons { efficiencyWeightD = 1. / efficiencyD->at(effBinD); } // Dplus flag - isDplusSignal = TESTBIT(std::abs(candidate.flagMcMatchRec()), aod::hf_cand_3prong::DecayType::DplusToPiKPi); + isDplusSignal = std::abs(candidate.flagMcMatchRec()) == hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi; // prompt and non-prompt division isDplusPrompt = candidate.originMcRec() == RecoDecay::OriginType::Prompt; isDplusNonPrompt = candidate.originMcRec() == RecoDecay::OriginType::NonPrompt; @@ -531,7 +531,7 @@ struct HfCorrelatorDplusHadrons { if (std::abs(particle1.pdgCode()) != Pdg::kDPlus) { continue; } - if (!TESTBIT(std::abs(particle1.flagMcMatchGen()), aod::hf_cand_3prong::DecayType::DplusToPiKPi)) { + if (std::abs(particle1.flagMcMatchGen()) != hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi) { continue; } double yD = RecoDecay::y(particle1.pVector(), MassDPlus); @@ -637,7 +637,7 @@ struct HfCorrelatorDplusHadrons { continue; } // Dplus flag - bool isDplusSignal = TESTBIT(std::abs(candidate.flagMcMatchRec()), aod::hf_cand_3prong::DecayType::DplusToPiKPi); + bool isDplusSignal = std::abs(candidate.flagMcMatchRec()) == hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi; // prompt and non-prompt division bool isDplusPrompt = candidate.originMcRec() == RecoDecay::OriginType::Prompt; bool isDplusNonPrompt = candidate.originMcRec() == RecoDecay::OriginType::NonPrompt; @@ -675,7 +675,7 @@ struct HfCorrelatorDplusHadrons { std::vector outputMl = {-1., -1., -1.}; bool isPhysicalPrimary = false; int trackOrigin = -1; - bool isDplusSignal = std::abs(candidate.flagMcMatchRec()) == 1 << aod::hf_cand_3prong::DecayType::DplusToPiKPi; + bool isDplusSignal = std::abs(candidate.flagMcMatchRec()) == hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi; // prompt and non-prompt division bool isDplusPrompt = candidate.originMcRec() == RecoDecay::OriginType::Prompt; if (pAssoc.has_mcParticle()) { diff --git a/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx b/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx index 3ba26af40a6..2b9ea57bfd5 100644 --- a/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx @@ -15,6 +15,7 @@ /// \author Samuele Cattaruzzi #include +#include #include "CommonConstants/PhysicsConstants.h" #include "Framework/AnalysisTask.h" @@ -41,6 +42,13 @@ using namespace o2::constants::math; using namespace o2::framework; using namespace o2::framework::expressions; +enum ResonantChannel : int8_t { + PhiPi = 1, + Kstar0K = 2 +}; + +static std::unordered_map channelsResonant = {{{ResonantChannel::PhiPi, hf_decay::hf_cand_3prong::DecayChannelResonant::DsToPhiPi}, {ResonantChannel::Kstar0K, hf_decay::hf_cand_3prong::DecayChannelResonant::DsToKstar0K}}}; + /// Returns deltaPhi value in range [-pi/2., 3.*pi/2], typically used for correlation studies double getDeltaPhi(double phiHadron, double phiD) { @@ -156,7 +164,7 @@ struct HfCorrelatorDsHadrons { Configurable selNoSameBunchPileUpColl{"selNoSameBunchPileUpColl", true, "Flag for rejecting the collisions associated with the same bunch crossing (used only in MC processes)"}; Configurable selectionFlagDs{"selectionFlagDs", 7, "Selection Flag for Ds (avoid the case of flag = 0, no outputMlScore)"}; Configurable numberEventsMixed{"numberEventsMixed", 5, "Number of events mixed in ME process"}; - Configurable decayChannel{"decayChannel", 1, "Decay channels: 1 for Ds->PhiPi->KKpi, 2 for Ds->K0*K->KKPi"}; + Configurable decayChannel{"decayChannel", 1, "Resonant decay channels: 1 for Ds->PhiPi->KKpi, 2 for Ds->K0*K->KKPi"}; Configurable applyEfficiency{"applyEfficiency", true, "Flag for applying D-meson efficiency weights"}; Configurable yCandMax{"yCandMax", 0.8, "max. cand. rapidity"}; Configurable yCandGenMax{"yCandGenMax", 0.5, "max. gen. cand. rapidity"}; @@ -462,8 +470,8 @@ struct HfCorrelatorDsHadrons { // prompt and non-prompt division isDsPrompt = candidate.originMcRec() == RecoDecay::OriginType::Prompt; // Ds Signal - isDsSignal = std::abs(candidate.flagMcMatchRec()) == 1 << aod::hf_cand_3prong::DecayType::DsToKKPi; - isDecayChan = candidate.flagMcDecayChanRec() == decayChannel; + isDsSignal = std::abs(candidate.flagMcMatchRec()) == hf_decay::hf_cand_3prong::DecayChannelMain::DsToPiKK; + isDecayChan = candidate.flagMcDecayChanRec() == channelsResonant[decayChannel]; if (std::abs(hfHelper.yDs(candidate)) > yCandMax || candidate.pt() < ptCandMin || candidate.pt() > ptCandMax) { continue; @@ -643,7 +651,7 @@ struct HfCorrelatorDsHadrons { // MC gen level for (const auto& particle : groupedMcParticles) { // check if the particle is Ds - if ((std::abs(particle.flagMcMatchGen()) == 1 << aod::hf_cand_3prong::DecayType::DsToKKPi) && (particle.flagMcDecayChanGen() == decayChannel)) { + if ((std::abs(particle.flagMcMatchGen()) == hf_decay::hf_cand_3prong::DecayChannelMain::DsToPiKK) && (particle.flagMcDecayChanGen() == channelsResonant[decayChannel])) { double yD = RecoDecay::y(particle.pVector(), MassDS); if (std::abs(yD) > yCandGenMax || particle.pt() < ptCandMin || particle.pt() > ptCandMax) { continue; @@ -651,7 +659,7 @@ struct HfCorrelatorDsHadrons { fillMcGenHisto(particle); // prompt and non-prompt division isDsPrompt = particle.originMcGen() == RecoDecay::OriginType::Prompt; - isDecayChan = particle.flagMcDecayChanGen() == decayChannel; + isDecayChan = particle.flagMcDecayChanGen() == channelsResonant[decayChannel]; std::vector listDaughters{}; std::array arrDaughDsPDG = {+kKPlus, -kKPlus, kPiPlus}; std::array prongsId; @@ -823,7 +831,7 @@ struct HfCorrelatorDsHadrons { if (std::abs(hfHelper.yDs(candidate)) > yCandMax || candidate.pt() < ptCandMin || candidate.pt() > ptCandMax) { continue; } - if (std::abs(candidate.flagMcMatchRec()) == 1 << aod::hf_cand_3prong::DecayType::DsToKKPi) { + if (std::abs(candidate.flagMcMatchRec()) == hf_decay::hf_cand_3prong::DecayChannelMain::DsToPiKK) { // DsToKKPi and DsToPiKK division if (candidate.isSelDsToKKPi() >= selectionFlagDs) { fillHistoMcRecSig(candidate, 0.); @@ -860,7 +868,7 @@ struct HfCorrelatorDsHadrons { // prompt and non-prompt division isDsPrompt = candidate.originMcRec() == RecoDecay::OriginType::Prompt; // Ds Signal - isDsSignal = std::abs(candidate.flagMcMatchRec()) == 1 << aod::hf_cand_3prong::DecayType::DsToKKPi; + isDsSignal = std::abs(candidate.flagMcMatchRec()) == hf_decay::hf_cand_3prong::DecayChannelMain::DsToPiKK; isDecayChan = candidate.flagMcDecayChanRec() == decayChannel; if (pAssoc.has_mcParticle()) { auto mcParticle = pAssoc.template mcParticle_as(); @@ -911,7 +919,7 @@ struct HfCorrelatorDsHadrons { for (const auto& [c1, tracks1, c2, tracks2] : pairMcGen) { int poolBin = corrBinningMcGen.getBin(std::make_tuple(c1.posZ(), c1.multMCFT0A())); for (const auto& [candidate, particleAssoc] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { - if ((std::abs(candidate.flagMcMatchGen()) == 1 << aod::hf_cand_3prong::DecayType::DsToKKPi) && (candidate.flagMcDecayChanGen() == decayChannel)) { + if ((std::abs(candidate.flagMcMatchGen()) == hf_decay::hf_cand_3prong::DecayChannelMain::DsToPiKK) && (candidate.flagMcDecayChanGen() == decayChannel)) { double yD = RecoDecay::y(candidate.pVector(), MassDS); if (std::abs(yD) > yCandGenMax || candidate.pt() < ptCandMin || candidate.pt() > ptCandMax) { continue; diff --git a/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx b/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx index f8dd07c5fc4..c76ec3d62d2 100644 --- a/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorLcHadrons.cxx @@ -532,7 +532,7 @@ struct HfCorrelatorLcHadrons { auto trackPos1 = candidate.template prong0_as(); // positive daughter (negative for the antiparticles) auto trackPos2 = candidate.template prong2_as(); int8_t chargeLc = trackPos1.sign(); // charge of 1st prong will be the charge of Lc candidate - isLcSignal = TESTBIT(std::abs(candidate.flagMcMatchRec()), aod::hf_cand_3prong::DecayType::LcToPKPi); + isLcSignal = std::abs(candidate.flagMcMatchRec()) == hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi; isLcPrompt = candidate.originMcRec() == RecoDecay::OriginType::Prompt; isLcNonPrompt = candidate.originMcRec() == RecoDecay::OriginType::NonPrompt; std::vector outputMl = {-1., -1., -1.}; @@ -778,7 +778,7 @@ struct HfCorrelatorLcHadrons { if (std::abs(particle.pdgCode()) != Pdg::kLambdaCPlus) { continue; } - if (!TESTBIT(std::abs(particle.flagMcMatchGen()), aod::hf_cand_3prong::DecayType::LcToPKPi)) { + if (std::abs(particle.flagMcMatchGen()) != hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi) { continue; } double yL = RecoDecay::y(particle.pVector(), MassLambdaCPlus); @@ -944,7 +944,7 @@ struct HfCorrelatorLcHadrons { continue; } // Lc flag - bool isLcSignal = TESTBIT(std::abs(candidate.flagMcMatchRec()), aod::hf_cand_3prong::DecayType::LcToPKPi); + bool isLcSignal = std::abs(candidate.flagMcMatchRec()) == hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi; // prompt and non-prompt division bool isLcPrompt = candidate.originMcRec() == RecoDecay::OriginType::Prompt; bool isLcNonPrompt = candidate.originMcRec() == RecoDecay::OriginType::NonPrompt; @@ -993,7 +993,7 @@ struct HfCorrelatorLcHadrons { std::vector outputMl = {-1., -1., -1.}; bool isPhysicalPrimary = false; int trackOrigin = -1; - bool isLcSignal = std::abs(candidate.flagMcMatchRec()) == 1 << aod::hf_cand_3prong::DecayType::LcToPKPi; + bool isLcSignal = std::abs(candidate.flagMcMatchRec()) == hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi; bool isLcPrompt = candidate.originMcRec() == RecoDecay::OriginType::Prompt; if (pidTrkApplied) { if (!passPIDSelection(pAssoc, trkPIDspecies, pidTPCMax, pidTOFMax, tofPIDThreshold, forceTOF)) diff --git a/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx b/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx index 16a32177afd..ee8ec8aaa26 100644 --- a/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx +++ b/PWGHF/HFC/TableProducer/femtoDreamProducer.cxx @@ -563,7 +563,7 @@ struct HfFemtoDreamProducer { // Filling particle properties rowCandCharmHadGen.reserve(particles.size()); for (const auto& particle : particles) { - if (std::abs(particle.flagMcMatchGen()) == 1 << aod::hf_cand_3prong::DecayType::LcToPKPi) { + if (std::abs(particle.flagMcMatchGen()) == hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi) { rowCandCharmHadGen( particle.mcCollisionId(), particle.flagMcMatchGen(), diff --git a/PWGHF/HFC/Tasks/taskCorrelationDplusHadrons.cxx b/PWGHF/HFC/Tasks/taskCorrelationDplusHadrons.cxx index 43398e86043..339ab91a27c 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationDplusHadrons.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationDplusHadrons.cxx @@ -589,7 +589,7 @@ struct HfTaskCorrelationDplusHadrons { auto mcCollision = mcParticle.template mcCollision_as>(); multiplicity = mcCollision.multMCFT0A() + mcCollision.multMCFT0C(); // multFT0M = multFt0A + multFT0C hCandidates->Fill(kCandidateStepMcGenAll, mcParticle.pt(), multiplicity, mcParticle.originMcGen()); - if (std::abs(mcParticle.flagMcMatchGen()) == 1 << aod::hf_cand_3prong::DecayType::DplusToPiKPi) { + if (std::abs(mcParticle.flagMcMatchGen()) == hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi) { hCandidates->Fill(kCandidateStepMcGenDplusToPiKPi, mcParticle.pt(), multiplicity, mcParticle.originMcGen()); auto yDplus = RecoDecay::y(mcParticle.pVector(), o2::constants::physics::MassDPlus); if (std::abs(yDplus) <= yCandGenMax) { @@ -636,7 +636,7 @@ struct HfTaskCorrelationDplusHadrons { continue; } multiplicity = collision.multFT0M(); - if (std::abs(candidate.flagMcMatchRec()) == 1 << aod::hf_cand_3prong::DecayType::DplusToPiKPi) { + if (std::abs(candidate.flagMcMatchRec()) == hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi) { hCandidates->Fill(kCandidateStepMcReco, candidate.pt(), multiplicity, candidate.originMcRec()); if (std::abs(hfHelper.yDplus(candidate)) <= yCandMax) { hCandidates->Fill(kCandidateStepMcRecoInAcceptance, candidate.pt(), multiplicity, candidate.originMcRec()); diff --git a/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx b/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx index f70f05b0691..3375d71b86d 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx @@ -693,7 +693,7 @@ struct HfTaskCorrelationDsHadrons { // generated candidate loop for (const auto& mcParticle : groupedMcParticles) { - if ((std::abs(mcParticle.flagMcMatchGen()) == 1 << aod::hf_cand_3prong::DecayType::DsToKKPi) && (mcParticle.flagMcDecayChanGen() == decayChannel)) { + if ((std::abs(mcParticle.flagMcMatchGen()) == hf_decay::hf_cand_3prong::DecayChannelMain::DsToPiKK) && (mcParticle.flagMcDecayChanGen() == decayChannel)) { hCandidates->Fill(kCandidateStepMcGenDsToKKPi, mcParticle.pt(), multiplicityGen, mcParticle.originMcGen()); auto yDs = RecoDecay::y(mcParticle.pVector(), o2::constants::physics::MassDS); if (std::abs(yDs) <= yCandGenMax) { @@ -738,7 +738,7 @@ struct HfTaskCorrelationDsHadrons { continue; } - if ((std::abs(candidate.flagMcMatchRec()) == 1 << aod::hf_cand_3prong::DecayType::DsToKKPi) && (candidate.flagMcDecayChanRec() == decayChannel)) { + if ((std::abs(candidate.flagMcMatchRec()) == hf_decay::hf_cand_3prong::DecayChannelMain::DsToPiKK) && (candidate.flagMcDecayChanRec() == decayChannel)) { auto prong0McPart = candidate.template prong0_as().template mcParticle_as(); // DsToKKPi and DsToPiKK division if (((std::abs(prong0McPart.pdgCode()) == kKPlus) && (candidate.isSelDsToKKPi() >= selectionFlagDs)) || ((std::abs(prong0McPart.pdgCode()) == kPiPlus) && (candidate.isSelDsToPiKK() >= selectionFlagDs))) { @@ -773,7 +773,7 @@ struct HfTaskCorrelationDsHadrons { float multiplicity = -1.; for (const auto& mcParticle : mcParticles) { // generated candidates - if ((std::abs(mcParticle.flagMcMatchGen()) == 1 << aod::hf_cand_3prong::DecayType::DsToKKPi) && (mcParticle.flagMcDecayChanGen() == decayChannel)) { + if ((std::abs(mcParticle.flagMcMatchGen()) == hf_decay::hf_cand_3prong::DecayChannelMain::DsToPiKK) && (mcParticle.flagMcDecayChanGen() == decayChannel)) { auto mcCollision = mcParticle.template mcCollision_as>(); multiplicity = mcCollision.multMCFT0A() + mcCollision.multMCFT0C(); // multFT0M = multFt0A + multFT0C hCandidates->Fill(kCandidateStepMcGenDsToKKPi, mcParticle.pt(), multiplicity, mcParticle.originMcGen()); @@ -824,7 +824,7 @@ struct HfTaskCorrelationDsHadrons { continue; } multiplicity = collision.multFT0M(); - if ((std::abs(candidate.flagMcMatchRec()) == 1 << aod::hf_cand_3prong::DecayType::DsToKKPi) && (candidate.flagMcDecayChanRec() == decayChannel)) { + if ((std::abs(candidate.flagMcMatchRec()) == hf_decay::hf_cand_3prong::DecayChannelMain::DsToPiKK) && (candidate.flagMcDecayChanRec() == decayChannel)) { auto prong0McPart = candidate.template prong0_as().template mcParticle_as(); // DsToKKPi and DsToPiKK division if (((std::abs(prong0McPart.pdgCode()) == kKPlus) && (candidate.isSelDsToKKPi() >= selectionFlagDs)) || ((std::abs(prong0McPart.pdgCode()) == kPiPlus) && (candidate.isSelDsToPiKK() >= selectionFlagDs))) { diff --git a/PWGHF/HFC/Tasks/taskCorrelationLcHadrons.cxx b/PWGHF/HFC/Tasks/taskCorrelationLcHadrons.cxx index 2d123acde31..791dd045f99 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationLcHadrons.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationLcHadrons.cxx @@ -811,7 +811,7 @@ struct HfTaskCorrelationLcHadrons { auto mcCollision = mcParticle.template mcCollision_as>(); multiplicity = mcCollision.multMCFT0A() + mcCollision.multMCFT0C(); // multFT0M = multFt0A + multFT0C hCandidates->Fill(kCandidateStepMcGenAll, mcParticle.pt(), multiplicity, mcParticle.originMcGen()); - if (std::abs(mcParticle.flagMcMatchGen()) == 1 << aod::hf_cand_3prong::DecayType::LcToPKPi) { + if (std::abs(mcParticle.flagMcMatchGen()) == hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi) { hCandidates->Fill(kCandidateStepMcGenLcToPKPi, mcParticle.pt(), multiplicity, mcParticle.originMcGen()); auto yL = RecoDecay::y(mcParticle.pVector(), o2::constants::physics::MassLambdaCPlus); if (std::abs(yL) <= yCandGenMax) { @@ -862,7 +862,7 @@ struct HfTaskCorrelationLcHadrons { continue; } multiplicity = collision.multFT0M(); - if (std::abs(candidate.flagMcMatchRec()) == 1 << aod::hf_cand_3prong::DecayType::LcToPKPi) { + if (std::abs(candidate.flagMcMatchRec()) == hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi) { hCandidates->Fill(kCandidateStepMcReco, candidate.pt(), multiplicity, candidate.originMcRec()); if (std::abs(hfHelper.yLc(candidate)) <= yCandMax) { hCandidates->Fill(kCandidateStepMcRecoInAcceptance, candidate.pt(), multiplicity, candidate.originMcRec()); diff --git a/PWGHF/HFC/Tasks/taskFlow.cxx b/PWGHF/HFC/Tasks/taskFlow.cxx index 840357b0b3e..981ce78e7ca 100644 --- a/PWGHF/HFC/Tasks/taskFlow.cxx +++ b/PWGHF/HFC/Tasks/taskFlow.cxx @@ -809,7 +809,7 @@ struct HfTaskFlow { // } } } else { // For now, that means we do LambdaC - if (std::abs(mcCandidate.flagMcMatchGen()) == 1 << aod::hf_cand_3prong::DecayType::LcToPKPi) { + if (std::abs(mcCandidate.flagMcMatchGen()) == hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi) { if (etaCandidateMax >= 0. && std::abs(etaCandidate) > etaCandidateMax) { return false; diff --git a/PWGHF/TableProducer/candidateCreator3Prong.cxx b/PWGHF/TableProducer/candidateCreator3Prong.cxx index d8f5963b301..145e84513db 100644 --- a/PWGHF/TableProducer/candidateCreator3Prong.cxx +++ b/PWGHF/TableProducer/candidateCreator3Prong.cxx @@ -46,7 +46,7 @@ #include "PWGLF/DataModel/mcCentrality.h" #include "PWGHF/Core/CentralityEstimation.h" -#include "PWGHF/Core/SelectorCuts.h" +#include "PWGHF/Core/DecayChannels.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/Utils/utilsBfieldCCDB.h" #include "PWGHF/Utils/utilsEvSelHf.h" @@ -55,10 +55,10 @@ #include "PWGHF/Utils/utilsTrkCandHf.h" using namespace o2; -using namespace o2::analysis; using namespace o2::hf_evsel; using namespace o2::hf_trkcandsel; using namespace o2::aod::hf_cand_3prong; +using namespace o2::hf_decay::hf_cand_3prong; using namespace o2::hf_centrality; using namespace o2::hf_occupancy; using namespace o2::constants::physics; @@ -953,7 +953,7 @@ struct HfCandidateCreator3ProngExpressions { indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, Pdg::kDPlus, std::array{+kPiPlus, -kKPlus, +kPiPlus}, true, &sign, 2); } if (indexRec > -1) { - flag = sign * (1 << DecayType::DplusToPiKPi); + flag = sign * DecayChannelMain::DplusToPiKPi; } } @@ -982,9 +982,7 @@ struct HfCandidateCreator3ProngExpressions { } } if (indexRec > -1) { - // DecayType::DsToKKPi is used to flag both Ds± → K± K∓ π± and D± → K± K∓ π± - // TODO: move to different and explicit flags - flag = sign * (1 << DecayType::DsToKKPi); + flag = sign * (isDplus ? DecayChannelMain::DplusToPiKK : DecayChannelMain::DsToPiKK); if (arrayDaughters[0].has_mcParticle()) { swapping = int8_t(std::abs(arrayDaughters[0].mcParticle().pdgCode()) == kPiPlus); } @@ -995,9 +993,9 @@ struct HfCandidateCreator3ProngExpressions { arrPDGDaugh[iProng] = std::abs(daughI.pdgCode()); } if ((arrPDGDaugh[0] == arrPDGResonantDPhiPi[0] && arrPDGDaugh[1] == arrPDGResonantDPhiPi[1]) || (arrPDGDaugh[0] == arrPDGResonantDPhiPi[1] && arrPDGDaugh[1] == arrPDGResonantDPhiPi[0])) { - channel = isDplus ? DecayChannelDToKKPi::DplusToPhiPi : DecayChannelDToKKPi::DsToPhiPi; + channel = isDplus ? DecayChannelResonant::DplusToPhiPi : DecayChannelResonant::DsToPhiPi; } else if ((arrPDGDaugh[0] == arrPDGResonantDKstarK[0] && arrPDGDaugh[1] == arrPDGResonantDKstarK[1]) || (arrPDGDaugh[0] == arrPDGResonantDKstarK[1] && arrPDGDaugh[1] == arrPDGResonantDKstarK[0])) { - channel = isDplus ? DecayChannelDToKKPi::DplusToK0starK : DecayChannelDToKKPi::DsToK0starK; + channel = isDplus ? DecayChannelResonant::DplusToKstar0K : DecayChannelResonant::DsToKstar0K; } } } @@ -1011,7 +1009,7 @@ struct HfCandidateCreator3ProngExpressions { indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, Pdg::kDStar, std::array{+kPiPlus, +kPiPlus, -kKPlus}, true, &sign, 2); } if (indexRec > -1) { - flag = sign * (1 << DstarToPiKPiBkg); + flag = sign * DecayChannelMain::DstarToPiKPi; channel = 1; } } @@ -1028,7 +1026,7 @@ struct HfCandidateCreator3ProngExpressions { indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, Pdg::kLambdaCPlus, std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2); } if (indexRec > -1) { - flag = sign * (1 << DecayType::LcToPKPi); + flag = sign * DecayChannelMain::LcToPKPi; // Flagging the different Λc± → p± K∓ π± decay channels if (arrayDaughters[0].has_mcParticle()) { @@ -1063,7 +1061,7 @@ struct HfCandidateCreator3ProngExpressions { indexRec = RecoDecay::getMatchedMCRec(mcParticles, arrayDaughters, Pdg::kXiCPlus, std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2); } if (indexRec > -1) { - flag = sign * (1 << DecayType::XicToPKPi); + flag = sign * DecayChannelMain::XicToPKPi; if (arrayDaughters[0].has_mcParticle()) { swapping = int8_t(std::abs(arrayDaughters[0].mcParticle().pdgCode()) == kPiPlus); } diff --git a/PWGHF/TableProducer/candidateCreatorDstar.cxx b/PWGHF/TableProducer/candidateCreatorDstar.cxx index b5b67db87ab..f25a09dbbb3 100644 --- a/PWGHF/TableProducer/candidateCreatorDstar.cxx +++ b/PWGHF/TableProducer/candidateCreatorDstar.cxx @@ -638,10 +638,10 @@ struct HfCandidateCreatorDstarExpressions { } if (indexRecDstar > -1) { - flagDstar = signDstar * (BIT(aod::hf_cand_dstar::DecayType::DstarToD0Pi)); + flagDstar = signDstar * hf_decay::hf_cand_dstar::DecayChannelMain::DstarToPiKPi; } if (indexRecD0 > -1) { - flagD0 = signD0 * (BIT(aod::hf_cand_dstar::DecayType::D0ToPiK)); + flagD0 = signD0 * hf_decay::hf_cand_2prong::DecayChannelMain::D0ToPiK; } // check partly reconstructed decays, namely D0->Kpipi0 @@ -673,11 +673,11 @@ struct HfCandidateCreatorDstarExpressions { auto motherParticleDstar = mcParticles.rawIteratorAt(indexRecDstar); if (signDstar > 0) { if (RecoDecay::isMatchedMCGen(mcParticles, motherParticleDstar, Pdg::kDStar, std::array{+kPiPlus, +kPiPlus, -kKPlus, +kPi0}, false, &signDstar, 2)) { - flagDstar = signDstar * (BIT(aod::hf_cand_dstar::DecayType::DstarToD0PiPi0)); + flagDstar = signDstar * hf_decay::hf_cand_dstar::DecayChannelMain::DstarToPiKPiPi0; } } else { if (RecoDecay::isMatchedMCGen(mcParticles, motherParticleDstar, -Pdg::kDStar, std::array{-kPiPlus, -kPiPlus, +kKPlus, +kPi0}, false, &signDstar, 2)) { - flagDstar = signDstar * (BIT(aod::hf_cand_dstar::DecayType::DstarToD0PiPi0)); + flagDstar = signDstar * hf_decay::hf_cand_dstar::DecayChannelMain::DstarToPiKPiPi0; } } } @@ -686,11 +686,11 @@ struct HfCandidateCreatorDstarExpressions { auto motherParticleD0 = mcParticles.rawIteratorAt(indexRecD0); if (signD0 > 0) { if (RecoDecay::isMatchedMCGen(mcParticles, motherParticleD0, Pdg::kD0, std::array{+kPiPlus, -kKPlus, +kPi0}, false, &signD0)) { - flagD0 = signD0 * (BIT(aod::hf_cand_dstar::DecayType::D0ToPiKPi0)); + flagD0 = signD0 * hf_decay::hf_cand_2prong::DecayChannelMain::D0ToPiKPi0; } } else { if (RecoDecay::isMatchedMCGen(mcParticles, motherParticleD0, -Pdg::kD0, std::array{-kPiPlus, +kKPlus, +kPi0}, false, &signD0)) { - flagD0 = signD0 * (BIT(aod::hf_cand_dstar::DecayType::D0ToPiKPi0)); + flagD0 = signD0 * hf_decay::hf_cand_2prong::DecayChannelMain::D0ToPiKPi0; } } } @@ -764,11 +764,11 @@ struct HfCandidateCreatorDstarExpressions { } } if (RecoDecay::isMatchedMCGen(mcParticles, particleD0, Pdg::kD0, std::array{+kPiPlus, -kKPlus}, true, &signD0)) { - flagDstar = signDstar * (BIT(aod::hf_cand_dstar::DecayType::DstarToD0Pi)); - flagD0 = signD0 * (BIT(aod::hf_cand_dstar::DecayType::D0ToPiK)); + flagDstar = signDstar * hf_decay::hf_cand_dstar::DecayChannelMain::DstarToPiKPi; + flagD0 = signD0 * hf_decay::hf_cand_2prong::DecayChannelMain::D0ToPiK; } else if (RecoDecay::isMatchedMCGen(mcParticles, particleD0, Pdg::kD0, std::array{+kPiPlus, -kKPlus, +kPi0}, false, &signD0) || RecoDecay::isMatchedMCGen(mcParticles, particleD0, -Pdg::kD0, std::array{-kPiPlus, +kKPlus, +kPi0}, false, &signD0)) { - flagDstar = signDstar * (BIT(aod::hf_cand_dstar::DecayType::DstarToD0PiPi0)); - flagD0 = signD0 * (BIT(aod::hf_cand_dstar::DecayType::D0ToPiKPi0)); + flagDstar = signDstar * hf_decay::hf_cand_dstar::DecayChannelMain::DstarToPiKPiPi0; + flagD0 = signD0 * hf_decay::hf_cand_2prong::DecayChannelMain::D0ToPiKPi0; } } diff --git a/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx b/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx index 8ab7e92d5ce..c8dbbf04b2b 100644 --- a/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx +++ b/PWGHF/TableProducer/candidateCreatorSigmac0plusplus.cxx @@ -472,7 +472,7 @@ struct HfCandidateSigmac0plusplusMc { /// skip immediately the candidate Σc0,++ w/o a Λc+ matched to MC auto candLc = candSigmac.prongLc_as(); - if (!(std::abs(candLc.flagMcMatchRec()) == BIT(aod::hf_cand_3prong::DecayType::LcToPKPi))) { /// (*) + if (std::abs(candLc.flagMcMatchRec()) != hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi) { /// (*) rowMCMatchScRec(flag, origin, -1.f, 0, -1); continue; } diff --git a/PWGHF/TableProducer/candidateCreatorXicc.cxx b/PWGHF/TableProducer/candidateCreatorXicc.cxx index 214c2cea891..e4455828b8d 100644 --- a/PWGHF/TableProducer/candidateCreatorXicc.cxx +++ b/PWGHF/TableProducer/candidateCreatorXicc.cxx @@ -105,7 +105,7 @@ struct HfCandidateCreatorXicc { aod::TracksWCov const& tracks) { for (const auto& xicCand : xicCands) { - if (!(xicCand.hfflag() & 1 << o2::aod::hf_cand_3prong::XicToPKPi)) { + if (!(xicCand.hfflag() & 1 << o2::aod::hf_cand_3prong::DecayType::XicToPKPi)) { continue; } if (xicCand.isSelXicToPKPi() >= selectionFlagXic) { @@ -195,9 +195,9 @@ struct HfCandidateCreatorXicc { xicCand.globalIndex(), trackpion.globalIndex(), hfFlag); } // if on selected Xicc - } // loop over candidates - } // end of process -}; // end of struct + } // loop over candidates + } // end of process +}; // end of struct /// Extends the base table with expression columns. struct HfCandidateCreatorXiccExpressions { diff --git a/PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx b/PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx index c5c26270b79..6897b30ec0e 100644 --- a/PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx +++ b/PWGHF/TableProducer/derivedDataCreatorDplusToPiKPi.cxx @@ -87,7 +87,7 @@ struct HfDerivedDataCreatorDplusToPiKPi { using TypeMcCollisions = soa::Join; Filter filterSelectCandidates = (aod::hf_sel_candidate_dplus::isSelDplusToPiKPi & static_cast(BIT(aod::SelectionStep::RecoMl - 1))) != 0; // select candidates which passed all cuts at least up to RecoMl - 1 - Filter filterMcGenMatching = nabs(aod::hf_cand_3prong::flagMcMatchGen) == static_cast(BIT(aod::hf_cand_3prong::DecayType::DplusToPiKPi)); + Filter filterMcGenMatching = nabs(aod::hf_cand_3prong::flagMcMatchGen) == static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi); Preslice candidatesPerCollision = aod::hf_cand::collisionId; Preslice candidatesMcPerCollision = aod::hf_cand::collisionId; @@ -101,10 +101,10 @@ struct HfDerivedDataCreatorDplusToPiKPi { Partition candidatesMlAll = aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= 0; Partition candidatesMcMlAll = aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= 0; // partitions for signal and background - Partition candidatesMcSig = nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_3prong::DecayType::DplusToPiKPi)); - Partition candidatesMcBkg = nabs(aod::hf_cand_3prong::flagMcMatchRec) != static_cast(BIT(aod::hf_cand_3prong::DecayType::DplusToPiKPi)); - Partition candidatesMcMlSig = nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_3prong::DecayType::DplusToPiKPi)); - Partition candidatesMcMlBkg = nabs(aod::hf_cand_3prong::flagMcMatchRec) != static_cast(BIT(aod::hf_cand_3prong::DecayType::DplusToPiKPi)); + Partition candidatesMcSig = nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi); + Partition candidatesMcBkg = nabs(aod::hf_cand_3prong::flagMcMatchRec) != static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi); + Partition candidatesMcMlSig = nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi); + Partition candidatesMcMlBkg = nabs(aod::hf_cand_3prong::flagMcMatchRec) != static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi); void init(InitContext const&) { @@ -253,7 +253,7 @@ struct HfDerivedDataCreatorDplusToPiKPi { swapping = candidate.isCandidateSwapped(); flagDecayChanRec = candidate.flagMcDecayChanRec(); if constexpr (onlyBkg) { - if (TESTBIT(std::abs(flagMcRec), aod::hf_cand_3prong::DecayType::DplusToPiKPi)) { + if (std::abs(flagMcRec) == hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi) { continue; } if (downSampleBkgFactor < 1.) { @@ -264,7 +264,7 @@ struct HfDerivedDataCreatorDplusToPiKPi { } } if constexpr (onlySig) { - if (!TESTBIT(std::abs(flagMcRec), aod::hf_cand_3prong::DecayType::DplusToPiKPi)) { + if (std::abs(flagMcRec) != hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi) { continue; } } diff --git a/PWGHF/TableProducer/derivedDataCreatorDstarToD0Pi.cxx b/PWGHF/TableProducer/derivedDataCreatorDstarToD0Pi.cxx index 084605c2f3b..7c592e9ccb1 100644 --- a/PWGHF/TableProducer/derivedDataCreatorDstarToD0Pi.cxx +++ b/PWGHF/TableProducer/derivedDataCreatorDstarToD0Pi.cxx @@ -83,7 +83,7 @@ struct HfDerivedDataCreatorDstarToD0Pi { using TypeMcCollisions = soa::Join; Filter filterSelectCandidates = aod::hf_sel_candidate_dstar::isSelDstarToD0Pi == true; - Filter filterMcGenMatching = nabs(aod::hf_cand_dstar::flagMcMatchGen) == static_cast(BIT(aod::hf_cand_dstar::DecayType::DstarToD0Pi)); + Filter filterMcGenMatching = nabs(aod::hf_cand_dstar::flagMcMatchGen) == static_cast(hf_decay::hf_cand_dstar::DecayChannelMain::DstarToPiKPi); Preslice candidatesPerCollision = aod::hf_cand::collisionId; Preslice candidatesMcPerCollision = aod::hf_cand::collisionId; @@ -97,10 +97,10 @@ struct HfDerivedDataCreatorDstarToD0Pi { Partition candidatesMlAll = aod::hf_sel_candidate_dstar::isSelDstarToD0Pi == true; Partition candidatesMcMlAll = aod::hf_sel_candidate_dstar::isSelDstarToD0Pi == true; // partitions for signal and background - Partition candidatesMcSig = nabs(aod::hf_cand_dstar::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_dstar::DecayType::DstarToD0Pi)); - Partition candidatesMcBkg = nabs(aod::hf_cand_dstar::flagMcMatchRec) != static_cast(BIT(aod::hf_cand_dstar::DecayType::DstarToD0Pi)); - Partition candidatesMcMlSig = nabs(aod::hf_cand_dstar::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_dstar::DecayType::DstarToD0Pi)); - Partition candidatesMcMlBkg = nabs(aod::hf_cand_dstar::flagMcMatchRec) != static_cast(BIT(aod::hf_cand_dstar::DecayType::DstarToD0Pi)); + Partition candidatesMcSig = nabs(aod::hf_cand_dstar::flagMcMatchRec) == static_cast(hf_decay::hf_cand_dstar::DecayChannelMain::DstarToPiKPi); + Partition candidatesMcBkg = nabs(aod::hf_cand_dstar::flagMcMatchRec) != static_cast(hf_decay::hf_cand_dstar::DecayChannelMain::DstarToPiKPi); + Partition candidatesMcMlSig = nabs(aod::hf_cand_dstar::flagMcMatchRec) == static_cast(hf_decay::hf_cand_dstar::DecayChannelMain::DstarToPiKPi); + Partition candidatesMcMlBkg = nabs(aod::hf_cand_dstar::flagMcMatchRec) != static_cast(hf_decay::hf_cand_dstar::DecayChannelMain::DstarToPiKPi); void init(InitContext const&) { @@ -229,7 +229,7 @@ struct HfDerivedDataCreatorDstarToD0Pi { flagMcRec = candidate.flagMcMatchRec(); origin = candidate.originMcRec(); if constexpr (onlyBkg) { - if (TESTBIT(std::abs(flagMcRec), aod::hf_cand_dstar::DecayType::DstarToD0Pi)) { + if (std::abs(flagMcRec) == hf_decay::hf_cand_dstar::DecayChannelMain::DstarToPiKPi) { continue; } if (downSampleBkgFactor < 1.) { @@ -240,7 +240,7 @@ struct HfDerivedDataCreatorDstarToD0Pi { } } if constexpr (onlySig) { - if (!TESTBIT(std::abs(flagMcRec), aod::hf_cand_dstar::DecayType::DstarToD0Pi)) { + if (std::abs(flagMcRec) != hf_decay::hf_cand_dstar::DecayChannelMain::DstarToPiKPi) { continue; } } diff --git a/PWGHF/TableProducer/derivedDataCreatorLcToPKPi.cxx b/PWGHF/TableProducer/derivedDataCreatorLcToPKPi.cxx index 7078087a222..a956d4ff202 100644 --- a/PWGHF/TableProducer/derivedDataCreatorLcToPKPi.cxx +++ b/PWGHF/TableProducer/derivedDataCreatorLcToPKPi.cxx @@ -87,7 +87,7 @@ struct HfDerivedDataCreatorLcToPKPi { using TypeMcCollisions = soa::Join; Filter filterSelectCandidates = aod::hf_sel_candidate_lc::isSelLcToPKPi >= 1 || aod::hf_sel_candidate_lc::isSelLcToPiKP >= 1; - Filter filterMcGenMatching = nabs(aod::hf_cand_3prong::flagMcMatchGen) == static_cast(BIT(aod::hf_cand_3prong::DecayType::LcToPKPi)); + Filter filterMcGenMatching = nabs(aod::hf_cand_3prong::flagMcMatchGen) == static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi); Preslice candidatesPerCollision = aod::hf_cand::collisionId; Preslice candidatesMcPerCollision = aod::hf_cand::collisionId; @@ -101,10 +101,10 @@ struct HfDerivedDataCreatorLcToPKPi { Partition candidatesMlAll = aod::hf_sel_candidate_lc::isSelLcToPKPi >= 0; Partition candidatesMcMlAll = aod::hf_sel_candidate_lc::isSelLcToPKPi >= 0; // partitions for signal and background - Partition candidatesMcSig = nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_3prong::DecayType::LcToPKPi)); - Partition candidatesMcBkg = nabs(aod::hf_cand_3prong::flagMcMatchRec) != static_cast(BIT(aod::hf_cand_3prong::DecayType::LcToPKPi)); - Partition candidatesMcMlSig = nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_3prong::DecayType::LcToPKPi)); - Partition candidatesMcMlBkg = nabs(aod::hf_cand_3prong::flagMcMatchRec) != static_cast(BIT(aod::hf_cand_3prong::DecayType::LcToPKPi)); + Partition candidatesMcSig = nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi); + Partition candidatesMcBkg = nabs(aod::hf_cand_3prong::flagMcMatchRec) != static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi); + Partition candidatesMcMlSig = nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi); + Partition candidatesMcMlBkg = nabs(aod::hf_cand_3prong::flagMcMatchRec) != static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi); void init(InitContext const&) { @@ -252,7 +252,7 @@ struct HfDerivedDataCreatorLcToPKPi { origin = candidate.originMcRec(); swapping = candidate.isCandidateSwapped(); if constexpr (onlyBkg) { - if (TESTBIT(std::abs(flagMcRec), aod::hf_cand_3prong::DecayType::LcToPKPi)) { + if (std::abs(flagMcRec) == hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi) { continue; } if (downSampleBkgFactor < 1.) { @@ -263,7 +263,7 @@ struct HfDerivedDataCreatorLcToPKPi { } } if constexpr (onlySig) { - if (!TESTBIT(std::abs(flagMcRec), aod::hf_cand_3prong::DecayType::LcToPKPi)) { + if (std::abs(flagMcRec) != hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi) { continue; } } diff --git a/PWGHF/TableProducer/treeCreatorDplusToPiKPi.cxx b/PWGHF/TableProducer/treeCreatorDplusToPiKPi.cxx index 7e482985c0d..3d23c0b30ca 100644 --- a/PWGHF/TableProducer/treeCreatorDplusToPiKPi.cxx +++ b/PWGHF/TableProducer/treeCreatorDplusToPiKPi.cxx @@ -268,11 +268,11 @@ struct HfTreeCreatorDplusToPiKPi { using CollisionsCent = soa::Join; Filter filterSelectCandidates = aod::hf_sel_candidate_dplus::isSelDplusToPiKPi >= selectionFlagDplus; - Filter filterMcGenMatching = nabs(o2::aod::hf_cand_3prong::flagMcMatchGen) == static_cast(BIT(aod::hf_cand_3prong::DecayType::DplusToPiKPi)); + Filter filterMcGenMatching = nabs(o2::aod::hf_cand_3prong::flagMcMatchGen) == static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi); - Partition reconstructedCandSig = nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_3prong::DecayType::DplusToPiKPi)) || nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_3prong::DecayType::DsToKKPi)); // DecayType::DsToKKPi is used to flag both Ds± → K± K∓ π± and D± → K± K∓ π± - Partition reconstructedCandBkg = nabs(aod::hf_cand_3prong::flagMcMatchRec) != static_cast(BIT(aod::hf_cand_3prong::DecayType::DplusToPiKPi)); - Partition reconstructedCandSigMl = nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_3prong::DecayType::DplusToPiKPi)) || nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_3prong::DecayType::DsToKKPi)) || nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_3prong::DstarToPiKPiBkg)); // DecayType::DsToKKPi is used to flag both Ds± → K± K∓ π± and D± → K± K∓ π± + Partition reconstructedCandSig = nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi) || nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::DsToPiKK) || nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKK); + Partition reconstructedCandBkg = nabs(aod::hf_cand_3prong::flagMcMatchRec) != static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi); + Partition reconstructedCandSigMl = nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi) || nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::DsToPiKK) || nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKK) || nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::DstarToPiKPi); void init(InitContext const&) { diff --git a/PWGHF/TableProducer/treeCreatorDsToKKPi.cxx b/PWGHF/TableProducer/treeCreatorDsToKKPi.cxx index cf2f595f44b..7a8547cf32a 100644 --- a/PWGHF/TableProducer/treeCreatorDsToKKPi.cxx +++ b/PWGHF/TableProducer/treeCreatorDsToKKPi.cxx @@ -17,6 +17,8 @@ /// \author Stefano Politanò , Politecnico & INFN, Torino /// \author Fabio Catalano , CERN +#include + #include "CommonConstants/PhysicsConstants.h" #include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" @@ -229,6 +231,19 @@ DECLARE_SOA_TABLE(HfCandDsFullPs, "AOD", "HFCANDDSFULLP", hf_cand_3prong::OriginMcGen); } // namespace o2::aod +enum Mother : int8_t { + Ds, + Dplus +}; + +enum ResonantChannel : int8_t { + PhiPi = 1, + Kstar0K = 2 +}; + +static std::unordered_map> channelsResonant = {{{Mother::Ds, {{ResonantChannel::PhiPi, hf_decay::hf_cand_3prong::DecayChannelResonant::DsToPhiPi}, {ResonantChannel::Kstar0K, hf_decay::hf_cand_3prong::DecayChannelResonant::DsToKstar0K}}}, + {Mother::Dplus, {{ResonantChannel::PhiPi, hf_decay::hf_cand_3prong::DecayChannelResonant::DplusToPhiPi}, {ResonantChannel::Kstar0K, hf_decay::hf_cand_3prong::DecayChannelResonant::DplusToKstar0K}}}}}; + /// Writes the full information in an output TTree struct HfTreeCreatorDsToKKPi { Produces rowCandidateFull; @@ -236,7 +251,7 @@ struct HfTreeCreatorDsToKKPi { Produces rowCandidateFullParticles; Produces rowCandidateLite; - Configurable decayChannel{"decayChannel", 1, "Switch between decay channels: 1 for Ds/Dplus->PhiPi->KKpi, 2 for Ds/Dplus->K0*K->KKPi"}; + Configurable decayChannel{"decayChannel", 1, "Switch between resonant decay channels: 1 for Ds/Dplus->PhiPi->KKpi, 2 for Ds/Dplus->K0*K->KKPi"}; Configurable fillDplusMc{"fillDplusMc", false, "Switch to fill Dplus MC information"}; Configurable selectionFlagDs{"selectionFlagDs", 1, "Selection flag for Ds"}; Configurable fillCandidateLiteTable{"fillCandidateLiteTable", false, "Switch to fill lite table with candidate properties"}; @@ -260,16 +275,22 @@ struct HfTreeCreatorDsToKKPi { int offsetDplusDecayChannel = aod::hf_cand_3prong::DecayChannelDToKKPi::DplusToPhiPi - aod::hf_cand_3prong::DecayChannelDToKKPi::DsToPhiPi; // Offset between Dplus and Ds to use the same decay channel. See aod::hf_cand_3prong::DecayChannelDToKKPi Filter filterSelectCandidates = aod::hf_sel_candidate_ds::isSelDsToKKPi >= selectionFlagDs || aod::hf_sel_candidate_ds::isSelDsToPiKK >= selectionFlagDs; - Filter filterMcGenMatching = nabs(o2::aod::hf_cand_3prong::flagMcMatchGen) == static_cast(BIT(aod::hf_cand_3prong::DecayType::DsToKKPi)) && (aod::hf_cand_3prong::flagMcDecayChanGen == decayChannel || (fillDplusMc && aod::hf_cand_3prong::flagMcDecayChanGen == (decayChannel + offsetDplusDecayChannel))); // Do not store Dplus MC if fillDplusMc is false + Filter filterMcGenMatching = + nabs(o2::aod::hf_cand_3prong::flagMcMatchGen) == static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::DsToPiKK) && + (aod::hf_cand_3prong::flagMcDecayChanGen == channelsResonant[Mother::Ds][decayChannel] || + (fillDplusMc && aod::hf_cand_3prong::flagMcDecayChanGen == channelsResonant[Mother::Dplus][decayChannel])); // Do not store Dplus MC if fillDplusMc is false Partition selectedDsToKKPiCand = aod::hf_sel_candidate_ds::isSelDsToKKPi >= selectionFlagDs; Partition selectedDsToPiKKCand = aod::hf_sel_candidate_ds::isSelDsToPiKK >= selectionFlagDs; - Partition reconstructedCandSig = nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_3prong::DecayType::DsToKKPi)) && (aod::hf_cand_3prong::flagMcDecayChanRec == decayChannel || (fillDplusMc && aod::hf_cand_3prong::flagMcDecayChanRec == (decayChannel + offsetDplusDecayChannel))); // Do not store Dplus MC if fillDplusMc is false - Partition reconstructedCandBkg = nabs(aod::hf_cand_3prong::flagMcMatchRec) != static_cast(BIT(aod::hf_cand_3prong::DecayType::DsToKKPi)); + Partition reconstructedCandSig = nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::DsToPiKK) && (aod::hf_cand_3prong::flagMcDecayChanRec == channelsResonant[Mother::Ds][decayChannel] || (fillDplusMc && aod::hf_cand_3prong::flagMcDecayChanRec == channelsResonant[Mother::Dplus][decayChannel])); // Do not store Dplus MC if fillDplusMc is false + Partition reconstructedCandBkg = nabs(aod::hf_cand_3prong::flagMcMatchRec) != static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::DsToPiKK); void init(InitContext const&) { + if (decayChannel != ResonantChannel::PhiPi && decayChannel != ResonantChannel::Kstar0K) { + LOGP(fatal, "Invalid value of decayChannel"); + } } template @@ -305,7 +326,7 @@ struct HfTreeCreatorDsToKKPi { originMc = candidate.originMcRec(); channelMc = candidate.flagMcDecayChanRec(); isSwapped = candidate.isCandidateSwapped(); - if (fillDplusMc && candidate.flagMcDecayChanRec() == (decayChannel + offsetDplusDecayChannel)) { + if (fillDplusMc && candidate.flagMcDecayChanRec() == channelsResonant[Mother::Dplus][decayChannel]) { yCand = hfHelper.yDplus(candidate); eCand = hfHelper.eDplus(candidate); ctCand = hfHelper.ctDplus(candidate); diff --git a/PWGHF/TableProducer/treeCreatorDstarToD0Pi.cxx b/PWGHF/TableProducer/treeCreatorDstarToD0Pi.cxx index 00d2bea174f..2b838d774b1 100644 --- a/PWGHF/TableProducer/treeCreatorDstarToD0Pi.cxx +++ b/PWGHF/TableProducer/treeCreatorDstarToD0Pi.cxx @@ -261,10 +261,10 @@ struct HfTreeCreatorDstarToD0Pi { using CandDstarMcGen = soa::Filtered>; Filter filterSelectCandidates = aod::hf_sel_candidate_dstar::isSelDstarToD0Pi == selectionFlagDstarToD0Pi; - Filter filterMcGenMatching = nabs(aod::hf_cand_dstar::flagMcMatchGen) == static_cast(BIT(aod::hf_cand_dstar::DecayType::DstarToD0Pi)); + Filter filterMcGenMatching = nabs(aod::hf_cand_dstar::flagMcMatchGen) == static_cast(hf_decay::hf_cand_dstar::DecayChannelMain::DstarToPiKPi); - Partition reconstructedCandSig = nabs(aod::hf_cand_dstar::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_dstar::DecayType::DstarToD0Pi)); - Partition reconstructedCandBkg = nabs(aod::hf_cand_dstar::flagMcMatchRec) != static_cast(BIT(aod::hf_cand_dstar::DecayType::DstarToD0Pi)); + Partition reconstructedCandSig = nabs(aod::hf_cand_dstar::flagMcMatchRec) == static_cast(hf_decay::hf_cand_dstar::DecayChannelMain::DstarToPiKPi); + Partition reconstructedCandBkg = nabs(aod::hf_cand_dstar::flagMcMatchRec) != static_cast(hf_decay::hf_cand_dstar::DecayChannelMain::DstarToPiKPi); void init(InitContext const&) { diff --git a/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx b/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx index 398bf3fc57a..5ad144e472e 100644 --- a/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx +++ b/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx @@ -410,7 +410,7 @@ struct HfTreeCreatorLcToPKPi { SigBgStatus status{Default}; - if (std::abs(flag) == (1 << o2::aod::hf_cand_3prong::DecayType::LcToPKPi)) { + if (std::abs(flag) == o2::hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi) { if (swapped == 0) { if (candFlag == 0) { if (origin == RecoDecay::OriginType::Prompt) @@ -917,7 +917,7 @@ struct HfTreeCreatorLcToPKPi { // Filling particle properties rowCandidateFullParticles.reserve(particles.size()); for (const auto& particle : particles) { - if (std::abs(particle.flagMcMatchGen()) == 1 << aod::hf_cand_3prong::DecayType::LcToPKPi) { + if (std::abs(particle.flagMcMatchGen()) == o2::hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi) { auto mcDaughter0 = particle.template daughters_as>().begin(); auto mcCollision = particle.template mcCollision_as(); auto p = particle.p(); diff --git a/PWGHF/TableProducer/treeCreatorXicToPKPi.cxx b/PWGHF/TableProducer/treeCreatorXicToPKPi.cxx index 279dbc797fc..b038f28c80e 100644 --- a/PWGHF/TableProducer/treeCreatorXicToPKPi.cxx +++ b/PWGHF/TableProducer/treeCreatorXicToPKPi.cxx @@ -231,13 +231,13 @@ struct HfTreeCreatorXicToPKPi { using CandXicMcGen = soa::Filtered>; Filter filterSelectCandidates = aod::hf_sel_candidate_xic::isSelXicToPKPi >= selectionFlagXic || aod::hf_sel_candidate_xic::isSelXicToPiKP >= selectionFlagXic; - Filter filterMcGenMatching = nabs(o2::aod::hf_cand_3prong::flagMcMatchGen) == static_cast(BIT(aod::hf_cand_3prong::DecayType::XicToPKPi)); + Filter filterMcGenMatching = nabs(o2::aod::hf_cand_3prong::flagMcMatchGen) == static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::XicToPKPi); Partition selectedXicToPKPiCand = aod::hf_sel_candidate_xic::isSelXicToPKPi >= selectionFlagXic; Partition selectedXicToPiKPCand = aod::hf_sel_candidate_xic::isSelXicToPiKP >= selectionFlagXic; - Partition reconstructedCandSig = nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_3prong::DecayType::XicToPKPi)); - Partition reconstructedCandBkg = nabs(aod::hf_cand_3prong::flagMcMatchRec) != static_cast(BIT(aod::hf_cand_3prong::DecayType::XicToPKPi)); + Partition reconstructedCandSig = nabs(aod::hf_cand_3prong::flagMcMatchRec) == static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::XicToPKPi); + Partition reconstructedCandBkg = nabs(aod::hf_cand_3prong::flagMcMatchRec) != static_cast(hf_decay::hf_cand_3prong::DecayChannelMain::XicToPKPi); void init(InitContext const&) { diff --git a/PWGHF/Tasks/taskCharmHadImpactPar.cxx b/PWGHF/Tasks/taskCharmHadImpactPar.cxx index 051fdd0b7a2..9671501387f 100644 --- a/PWGHF/Tasks/taskCharmHadImpactPar.cxx +++ b/PWGHF/Tasks/taskCharmHadImpactPar.cxx @@ -162,7 +162,7 @@ struct HfTaskCharmHadImpactPar { if constexpr (channel == Channel::DplusToKPiPi) { // D+ -> Kpipi if constexpr (doMc) { if (fillOnlySignal) { - if (std::abs(candidate.flagMcMatchRec()) != 1 << aod::hf_cand_3prong::DecayType::DplusToPiKPi) { + if (std::abs(candidate.flagMcMatchRec()) != o2::hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi) { return; } } diff --git a/PWGHF/Tasks/taskLcCentrality.cxx b/PWGHF/Tasks/taskLcCentrality.cxx index 091b70b66ec..274421f8093 100644 --- a/PWGHF/Tasks/taskLcCentrality.cxx +++ b/PWGHF/Tasks/taskLcCentrality.cxx @@ -25,6 +25,7 @@ #include "Common/DataModel/Centrality.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" @@ -162,7 +163,7 @@ struct HfTaskLcCentralityMc { if (yCandMax >= 0. && std::abs(hfHelper.yLc(candidate)) > yCandMax) { continue; } - if (std::abs(candidate.flagMcMatchRec()) == 1 << aod::hf_cand_3prong::DecayType::LcToPKPi) { + if (std::abs(candidate.flagMcMatchRec()) == hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi) { // Get the corresponding MC particle. auto indexMother = RecoDecay::getMother(mcParticles, candidate.prong0_as().mcParticle_as>(), o2::constants::physics::Pdg::kLambdaCPlus, true); auto particleMother = mcParticles.rawIteratorAt(indexMother); @@ -184,7 +185,7 @@ struct HfTaskLcCentralityMc { } // MC gen. for (const auto& particle : mcParticles) { - if (std::abs(particle.flagMcMatchGen()) == 1 << aod::hf_cand_3prong::DecayType::LcToPKPi) { + if (std::abs(particle.flagMcMatchGen()) == hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi) { if (yCandMax >= 0. && std::abs(RecoDecay::y(particle.pVector(), o2::constants::physics::MassLambdaCPlus)) > yCandMax) { continue; } diff --git a/PWGHF/Tasks/taskMcValidation.cxx b/PWGHF/Tasks/taskMcValidation.cxx index eea7aa4c4ab..269cd7b21ea 100644 --- a/PWGHF/Tasks/taskMcValidation.cxx +++ b/PWGHF/Tasks/taskMcValidation.cxx @@ -1106,21 +1106,21 @@ struct HfTaskMcValidationRec { continue; } int whichHad = -1; - if (isDPlusSel && TESTBIT(std::abs(cand3Prong.flagMcMatchRec()), hf_cand_3prong::DecayType::DplusToPiKPi)) { + if (isDPlusSel && std::abs(cand3Prong.flagMcMatchRec()) == o2::hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi) { whichHad = DplusToPiKPi; - } else if (isDsSel && TESTBIT(std::abs(cand3Prong.flagMcMatchRec()), hf_cand_3prong::DecayType::DsToKKPi)) { - if (cand3Prong.flagMcDecayChanRec() == hf_cand_3prong::DecayChannelDToKKPi::DsToPhiPi) { + } else if (isDsSel && std::abs(cand3Prong.flagMcMatchRec()) == o2::hf_decay::hf_cand_3prong::DecayChannelMain::DsToPiKK) { + if (cand3Prong.flagMcDecayChanRec() == o2::hf_decay::hf_cand_3prong::DecayChannelResonant::DsToPhiPi) { whichHad = DsToPhiPiToKKPi; } - if (cand3Prong.flagMcDecayChanRec() == hf_cand_3prong::DecayChannelDToKKPi::DsToK0starK) { + if (cand3Prong.flagMcDecayChanRec() == o2::hf_decay::hf_cand_3prong::DecayChannelResonant::DsToKstar0K) { whichHad = DsToK0starKToKKPi; } - if (cand3Prong.flagMcDecayChanRec() == hf_cand_3prong::DecayChannelDToKKPi::DplusToPhiPi) { + if (cand3Prong.flagMcDecayChanRec() == o2::hf_decay::hf_cand_3prong::DecayChannelResonant::DplusToPhiPi) { whichHad = DplusToPhiPiToKKPi; } - } else if (isLcSel && TESTBIT(std::abs(cand3Prong.flagMcMatchRec()), hf_cand_3prong::DecayType::LcToPKPi)) { + } else if (isLcSel && std::abs(cand3Prong.flagMcMatchRec()) == o2::hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi) { whichHad = LcToPKPi; - } else if (isXicSel && TESTBIT(std::abs(cand3Prong.flagMcMatchRec()), hf_cand_3prong::DecayType::XicToPKPi)) { + } else if (isXicSel && std::abs(cand3Prong.flagMcMatchRec()) == o2::hf_decay::hf_cand_3prong::DecayChannelMain::XicToPKPi) { whichHad = XiCplusToPKPi; } int whichOrigin; diff --git a/PWGHF/Utils/utilsMcGen.h b/PWGHF/Utils/utilsMcGen.h index bc0380bd198..73dac888c8e 100644 --- a/PWGHF/Utils/utilsMcGen.h +++ b/PWGHF/Utils/utilsMcGen.h @@ -28,6 +28,7 @@ #include "Common/Core/RecoDecay.h" +#include "PWGHF/Core/DecayChannels.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" namespace hf_mc_gen @@ -85,6 +86,7 @@ template void fillMcMatchGen3Prong(T const& mcParticles, U const& mcParticlesPerMcColl, V& rowMcMatchGen, bool rejectBackground) { using namespace o2::constants::physics; + constexpr std::size_t NDaughtersResonant{2u}; // Match generated particles. for (const auto& particle : mcParticlesPerMcColl) { @@ -94,12 +96,12 @@ void fillMcMatchGen3Prong(T const& mcParticles, U const& mcParticlesPerMcColl, V int8_t sign = 0; std::vector arrDaughIndex; std::vector idxBhadMothers{}; - std::array arrPDGDaugh; - std::array arrPDGResonant1 = {kProton, 313}; // Λc± → p± K* - std::array arrPDGResonant2 = {2224, kKPlus}; // Λc± → Δ(1232)±± K∓ - std::array arrPDGResonant3 = {102134, kPiPlus}; // Λc± → Λ(1520) π± - std::array arrPDGResonantDPhiPi = {333, kPiPlus}; // Ds± → Phi π± and D± → Phi π± - std::array arrPDGResonantDKstarK = {313, kKPlus}; // Ds± → K*(892)0bar K± and D± → K*(892)0bar K± + std::array arrPDGDaugh; + std::array arrPDGResonant1 = {kProton, Pdg::kK0Star892}; // Λc± → p± K* + std::array arrPDGResonant2 = {2224, kKPlus}; // Λc± → Δ(1232)±± K∓ + std::array arrPDGResonant3 = {102134, kPiPlus}; // Λc± → Λ(1520) π± + std::array arrPDGResonantDPhiPi = {Pdg::kPhi, kPiPlus}; // Ds± → Phi π± and D± → Phi π± + std::array arrPDGResonantDKstarK = {Pdg::kK0Star892, kKPlus}; // Ds± → K*(892)0bar K± and D± → K*(892)0bar K± // Reject particles from background events if (particle.fromBackgroundEvent() && rejectBackground) { rowMcMatchGen(flag, origin, channel, -1); @@ -109,7 +111,7 @@ void fillMcMatchGen3Prong(T const& mcParticles, U const& mcParticlesPerMcColl, V // D± → π± K∓ π± if (flag == 0) { if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kDPlus, std::array{+kPiPlus, -kKPlus, +kPiPlus}, true, &sign, 2)) { - flag = sign * (1 << o2::aod::hf_cand_3prong::DecayType::DplusToPiKPi); + flag = sign * o2::hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi; } } @@ -119,24 +121,24 @@ void fillMcMatchGen3Prong(T const& mcParticles, U const& mcParticlesPerMcColl, V if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kDS, std::array{+kKPlus, -kKPlus, +kPiPlus}, true, &sign, 2)) { // DecayType::DsToKKPi is used to flag both Ds± → K± K∓ π± and D± → K± K∓ π± // TODO: move to different and explicit flags - flag = sign * (1 << o2::aod::hf_cand_3prong::DecayType::DsToKKPi); + flag = sign * o2::hf_decay::hf_cand_3prong::DecayChannelMain::DsToPiKK; } else if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kDPlus, std::array{+kKPlus, -kKPlus, +kPiPlus}, true, &sign, 2)) { // DecayType::DsToKKPi is used to flag both Ds± → K± K∓ π± and D± → K± K∓ π± // TODO: move to different and explicit flags - flag = sign * (1 << o2::aod::hf_cand_3prong::DecayType::DsToKKPi); + flag = sign * o2::hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKK; isDplus = true; } if (flag != 0) { RecoDecay::getDaughters(particle, &arrDaughIndex, std::array{0}, 1); - if (arrDaughIndex.size() == 2) { + if (arrDaughIndex.size() == NDaughtersResonant) { for (auto jProng = 0u; jProng < arrDaughIndex.size(); ++jProng) { auto daughJ = mcParticles.rawIteratorAt(arrDaughIndex[jProng]); arrPDGDaugh[jProng] = std::abs(daughJ.pdgCode()); } if ((arrPDGDaugh[0] == arrPDGResonantDPhiPi[0] && arrPDGDaugh[1] == arrPDGResonantDPhiPi[1]) || (arrPDGDaugh[0] == arrPDGResonantDPhiPi[1] && arrPDGDaugh[1] == arrPDGResonantDPhiPi[0])) { - channel = isDplus ? o2::aod::hf_cand_3prong::DecayChannelDToKKPi::DplusToPhiPi : o2::aod::hf_cand_3prong::DecayChannelDToKKPi::DsToPhiPi; + channel = isDplus ? o2::hf_decay::hf_cand_3prong::DecayChannelResonant::DplusToPhiPi : o2::hf_decay::hf_cand_3prong::DecayChannelResonant::DsToPhiPi; } else if ((arrPDGDaugh[0] == arrPDGResonantDKstarK[0] && arrPDGDaugh[1] == arrPDGResonantDKstarK[1]) || (arrPDGDaugh[0] == arrPDGResonantDKstarK[1] && arrPDGDaugh[1] == arrPDGResonantDKstarK[0])) { - channel = isDplus ? o2::aod::hf_cand_3prong::DecayChannelDToKKPi::DplusToK0starK : o2::aod::hf_cand_3prong::DecayChannelDToKKPi::DsToK0starK; + channel = isDplus ? o2::hf_decay::hf_cand_3prong::DecayChannelResonant::DplusToKstar0K : o2::hf_decay::hf_cand_3prong::DecayChannelResonant::DsToKstar0K; } } } @@ -145,18 +147,18 @@ void fillMcMatchGen3Prong(T const& mcParticles, U const& mcParticlesPerMcColl, V // D*± → D0(bar) π± if (flag == 0) { if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kDStar, std::array{+kPiPlus, +kPiPlus, -kKPlus}, true, &sign, 2)) { - flag = sign * (1 << o2::aod::hf_cand_3prong::DstarToPiKPiBkg); + flag = sign * o2::hf_decay::hf_cand_3prong::DecayChannelMain::DstarToPiKPi; } } // Λc± → p± K∓ π± if (flag == 0) { if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kLambdaCPlus, std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2)) { - flag = sign * (1 << o2::aod::hf_cand_3prong::DecayType::LcToPKPi); + flag = sign * o2::hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi; // Flagging the different Λc± → p± K∓ π± decay channels RecoDecay::getDaughters(particle, &arrDaughIndex, std::array{0}, 1); - if (arrDaughIndex.size() == 2) { + if (arrDaughIndex.size() == NDaughtersResonant) { for (auto jProng = 0u; jProng < arrDaughIndex.size(); ++jProng) { auto daughJ = mcParticles.rawIteratorAt(arrDaughIndex[jProng]); arrPDGDaugh[jProng] = std::abs(daughJ.pdgCode()); @@ -175,7 +177,7 @@ void fillMcMatchGen3Prong(T const& mcParticles, U const& mcParticlesPerMcColl, V // Ξc± → p± K∓ π± if (flag == 0) { if (RecoDecay::isMatchedMCGen(mcParticles, particle, Pdg::kXiCPlus, std::array{+kProton, -kKPlus, +kPiPlus}, true, &sign, 2)) { - flag = sign * (1 << o2::aod::hf_cand_3prong::DecayType::XicToPKPi); + flag = sign * o2::hf_decay::hf_cand_3prong::DecayChannelMain::XicToPKPi; } } diff --git a/PWGJE/Core/JetHFUtilities.h b/PWGJE/Core/JetHFUtilities.h index 97394dd6a70..a5ec07fe157 100644 --- a/PWGJE/Core/JetHFUtilities.h +++ b/PWGJE/Core/JetHFUtilities.h @@ -283,13 +283,13 @@ constexpr bool isMatchedHFCandidate(T const& candidate) return false; } } else if constexpr (isDplusCandidate()) { - if (std::abs(candidate.flagMcMatchRec()) == 1 << o2::aod::hf_cand_3prong::DecayType::DplusToPiKPi) { + if (std::abs(candidate.flagMcMatchRec()) == o2::hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi) { return true; } else { return false; } } else if constexpr (isLcCandidate()) { - if (std::abs(candidate.flagMcMatchRec()) == 1 << o2::aod::hf_cand_3prong::DecayType::LcToPKPi) { + if (std::abs(candidate.flagMcMatchRec()) == o2::hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi) { return true; } else { return false; @@ -307,13 +307,13 @@ constexpr bool isMatchedHFCandidate(T const& candidate) return false; } } else if constexpr (isDplusMcCandidate()) { - if (std::abs(candidate.flagMcMatchGen()) == 1 << o2::aod::hf_cand_3prong::DecayType::DplusToPiKPi) { + if (std::abs(candidate.flagMcMatchGen()) == o2::hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi) { return true; } else { return false; } } else if constexpr (isLcMcCandidate()) { - if (std::abs(candidate.flagMcMatchGen()) == 1 << o2::aod::hf_cand_3prong::DecayType::LcToPKPi) { + if (std::abs(candidate.flagMcMatchGen()) == o2::hf_decay::hf_cand_3prong::DecayChannelMain::LcToPKPi) { return true; } else { return false; From 495086dfc0c8e4c46db9bf985ee659e94abf6f79 Mon Sep 17 00:00:00 2001 From: Debadatta3337 Date: Thu, 5 Jun 2025 00:49:36 +0530 Subject: [PATCH 1514/1650] [PWGDQ] Update HistogramLibrery (#11456) Co-authored-by: Debadatta3337 --- PWGDQ/Core/HistogramsLibrary.cxx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 91e5264c969..7e8be6950a9 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -90,10 +90,10 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "MultFDDA", "MultFDDA", false, 300, 0.0, 300.0, VarManager::kMultFDDA); hm->AddHistogram(histClass, "MultFDDC", "MultFDDC", false, 50, 0.0, 50.0, VarManager::kMultFDDC); hm->AddHistogram(histClass, "MultTracklets", "MultTracklets", false, 250, 0.0, 250.0, VarManager::kMultTracklets); - hm->AddHistogram(histClass, "VtxNContribReal", "Vtx n contributors", false, 200, 0.0, 200.0, VarManager::kVtxNcontribReal); + hm->AddHistogram(histClass, "VtxNContribReal", "Vtx n contributors", false, 150, 0.0, 150.0, VarManager::kVtxNcontribReal); hm->AddHistogram(histClass, "VtxNContrib", "Vtx n contributors", false, 100, 0.0, 100.0, VarManager::kVtxNcontrib); - hm->AddHistogram(histClass, "MultNTracksPVeta1", "MultNTracksPVeta1", false, 200, 0, 200.0, VarManager::kMultNTracksPVeta1); - hm->AddHistogram(histClass, "MultNTracksPVetaHalf", "MultNTracksPVetaHalf", false, 200, 0, 200.0, VarManager::kMultNTracksPVetaHalf); + hm->AddHistogram(histClass, "MultNTracksPVeta1", "MultNTracksPVeta1", false, 150, 0, 150.0, VarManager::kMultNTracksPVeta1); + hm->AddHistogram(histClass, "MultNTracksPVetaHalf", "MultNTracksPVetaHalf", false, 150, 0, 150.0, VarManager::kMultNTracksPVetaHalf); hm->AddHistogram(histClass, "MultTPC_MultFV0A", "MultTPC vs MultFV0A", false, 100, 0, 500.0, VarManager::kMultTPC, 100, 0, 500.0, VarManager::kMultFV0A); hm->AddHistogram(histClass, "MultTPC_MultFT0A", "MultTPC vs MultFT0A", false, 100, 0, 500.0, VarManager::kMultTPC, 100, 0, 200.0, VarManager::kMultFT0A); hm->AddHistogram(histClass, "MultTPC_MultFT0C", "MultTPC vs MultFT0C", false, 100, 0, 500.0, VarManager::kMultTPC, 100, 0, 300.0, VarManager::kMultFT0C); @@ -112,7 +112,9 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "VtxZ_MultTPCWithPV", "VtxZ vs MultTPCWithPV", false, 240, -12.0, 12.0, VarManager::kVtxZ, 400, 0, 400.0, VarManager::kMultNTracksHasTPC); hm->AddHistogram(histClass, "VtxZ_MultITSTPCWithPV", "VtxZ vs MultITSTPCWithPV", false, 240, -12.0, 12.0, VarManager::kVtxZ, 400, 0, 400.0, VarManager::kMultNTracksITSTPC); hm->AddHistogram(histClass, "VtxZ_MultITSOnly", "VtxZ vs MultITSOnly", false, 240, -12.0, 12.0, VarManager::kVtxZ, 400, 0, 400.0, VarManager::kMultNTracksITSOnly); - hm->AddHistogram(histClass, "VtxZ_VtxNcontribReal", "VtxZ vs VtxNcontribReal", false, 240, -12.0, 12.0, VarManager::kVtxZ, 200, 0, 200.0, VarManager::kVtxNcontribReal); + hm->AddHistogram(histClass, "VtxZ_VtxNcontribReal", "VtxZ vs VtxNcontribReal", false, 100, -10.0, 10.0, VarManager::kVtxZ, 150, 0, 150.0, VarManager::kVtxNcontribReal); + hm->AddHistogram(histClass, "VtxZ_MultNTracksPVeta1", "VtxZ vs MultNTracksPVeta1", false, 100, -10.0, 10.0, VarManager::kVtxZ, 150, 0, 150.0, VarManager::kMultNTracksPVeta1); + hm->AddHistogram(histClass, "VtxZ_MultNTracksPVetaHalf", "VtxZ vs MultNTracksPVetaHalf", false, 100, -10.0, 10.0, VarManager::kVtxZ, 150, 0, 150.0, VarManager::kMultNTracksPVetaHalf); } else { hm->AddHistogram(histClass, "MultTPC", "MultTPC", false, 200, 0.0, 50000.0, VarManager::kMultTPC); @@ -938,7 +940,9 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "Y_Pt", "", false, 100, -5.0, 5.0, VarManager::kRap, 20, 0.0, 20.0, VarManager::kPt); } if (subGroupStr.Contains("mult_pvcontrib")) { - hm->AddHistogram(histClass, "Mass_VtxNcontribReal", "Mass vs VtxNcontribReal", false, 200, 2.0, 5.0, VarManager::kMass, 200, 0, 200.0, VarManager::kVtxNcontribReal); + hm->AddHistogram(histClass, "Mass_VtxNcontribReal", "Mass vs VtxNcontribReal", false, 200, 2.0, 5.0, VarManager::kMass, 150, 0, 150.0, VarManager::kVtxNcontribReal); + hm->AddHistogram(histClass, "Mass_MultNTracksPVetaHalf", "Mass vs MultNTracksPVetaHalf", false, 200, 2.0, 5.0, VarManager::kMass, 150, 0, 150.0, VarManager::kMultNTracksPVetaHalf); + hm->AddHistogram(histClass, "Mass_MultNTracksPVeta1", "Mass vs MultNTracksPVeta1", false, 200, 2.0, 5.0, VarManager::kMass, 150, 0, 150.0, VarManager::kMultNTracksPVeta1); } if (subGroupStr.Contains("barrel")) { hm->AddHistogram(histClass, "Mass", "", false, 500, 0.0, 5.0, VarManager::kMass); From 28320c47b1922fcdc1aece815e76f05354dbc24a Mon Sep 17 00:00:00 2001 From: Lucia Anna Tarasovicova Date: Wed, 4 Jun 2025 22:50:54 +0200 Subject: [PATCH 1515/1650] [PWGLF] Change in hStrangeCorrelation (#11466) Co-authored-by: Lucia Anna Tarasovicova --- PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx index ab7c0d543bd..606c5713d5e 100644 --- a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx +++ b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx @@ -581,6 +581,13 @@ struct HStrangeCorrelation { hEfficiencyV0[0] = hEfficiencyK0Short; hEfficiencyV0[1] = hEfficiencyLambda; hEfficiencyV0[2] = hEfficiencyAntiLambda; + + float etaWeight = 1; + if (systCuts.doOnTheFlyFlattening) { + float preWeight = 1 - std::abs(deltaeta) / 1.6; + etaWeight = preWeight != 0 ? 1.0f / preWeight : 0.0f; + } + static_for<0, 2>([&](auto i) { constexpr int Index = i.value; float efficiency = 1.0f; @@ -595,6 +602,7 @@ struct HStrangeCorrelation { } float weight = (applyEfficiencyCorrection || applyEfficiencyForTrigger) ? 1. / efficiency : 1.0f; + weight = weight * etaWeight; if (TESTBIT(doCorrelation, Index) && (!applyEfficiencyCorrection || efficiency != 0) && (doPPAnalysis || (TESTBIT(selMap, Index) && TESTBIT(selMap, Index + 3)))) { if (assocCandidate.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(Index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && !mixing && -massWindowConfigurations.maxBgNSigma < assocCandidate.invMassNSigma(Index) && assocCandidate.invMassNSigma(Index) < -massWindowConfigurations.minBgNSigma) histos.fill(HIST("sameEvent/LeftBg/") + HIST(kV0names[Index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); @@ -703,6 +711,12 @@ struct HStrangeCorrelation { hEfficiencyCascade[2] = hEfficiencyOmegaMinus; hEfficiencyCascade[3] = hEfficiencyOmegaPlus; + float etaWeight = 1; + if (systCuts.doOnTheFlyFlattening) { + float preWeight = 1 - std::abs(deltaeta) / 1.6; + etaWeight = preWeight != 0 ? 1.0f / preWeight : 0.0f; + } + static_for<0, 3>([&](auto i) { constexpr int Index = i.value; float efficiency = 1.0f; @@ -716,6 +730,7 @@ struct HStrangeCorrelation { efficiency = 1; } float weight = (applyEfficiencyCorrection || applyEfficiencyForTrigger) ? 1. / efficiency : 1.0f; + weight = weight * etaWeight; if (TESTBIT(doCorrelation, Index + 3) && (!applyEfficiencyCorrection || efficiency != 0) && (doPPAnalysis || (TESTBIT(CascselMap, Index) && TESTBIT(CascselMap, Index + 4) && TESTBIT(CascselMap, Index + 8) && TESTBIT(CascselMap, Index + 12)))) { if (assocCandidate.compatible(Index, systCuts.dEdxCompatibility) && (!doMCassociation || assocCandidate.mcTrue(Index)) && (!doAssocPhysicalPrimary || assocCandidate.mcPhysicalPrimary()) && !mixing && -massWindowConfigurations.maxBgNSigma < assocCandidate.invMassNSigma(Index) && assocCandidate.invMassNSigma(Index) < -massWindowConfigurations.minBgNSigma) histos.fill(HIST("sameEvent/LeftBg/") + HIST(kCascadenames[Index]), deltaphi, deltaeta, ptassoc, pttrigger, pvz, mult, weight); From 332e1082bfb5819c0f54ceafd36560bd9cf210fb Mon Sep 17 00:00:00 2001 From: Yash Patley <52608802+yashpatley@users.noreply.github.com> Date: Thu, 5 Jun 2025 07:34:23 +0530 Subject: [PATCH 1516/1650] [PWGCF] Update lambdaR2Correlation.cxx (#11465) --- .../Tasks/lambdaR2Correlation.cxx | 103 ++++++++++-------- 1 file changed, 59 insertions(+), 44 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx index 01befb49204..9a299ed8950 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/lambdaR2Correlation.cxx @@ -164,8 +164,6 @@ enum TrackLabels { kPFCorrPtCent, kPFCorrPtRapCent, kNoPFCorr, - kCorrFact, - kErrCorrFact, kGenTotAccLambda, kGenLambdaNoDau, kGenLambdaToPrPi @@ -468,8 +466,6 @@ struct LambdaTableProducer { histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPFCorrPtCent, "kPFCorrPtCent"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kPFCorrPtRapCent, "kPFCorrPtRapCent"); histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kNoPFCorr, "kNoPFCorr"); - histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kCorrFact, "kCorrFact"); - histos.get(HIST("Tracks/h1f_tracks_info"))->GetXaxis()->SetBinLabel(TrackLabels::kErrCorrFact, "kErrCorrFact"); } template @@ -826,7 +822,7 @@ struct LambdaTableProducer { } // initialize efficiency factor and primary fraction values - float effFact = 1., primFrac = 1.; + float effCorrFact = 1., primFrac = 1.; float rap = (cDoEtaAnalysis) ? v0.eta() : v0.yLambda(); // Get Efficiency Factor @@ -835,14 +831,14 @@ struct LambdaTableProducer { TH1F* histEff = reinterpret_cast(objEff->Clone()); if (histEff->GetDimension() == TwoDimCorr) { histos.fill(HIST("Tracks/h1f_tracks_info"), kEffCorrPtCent); - effFact = histEff->GetBinContent(histEff->FindBin(cent, v0.pt())); + effCorrFact = histEff->GetBinContent(histEff->FindBin(cent, v0.pt())); } else if (histEff->GetDimension() == ThreeDimCorr) { histos.fill(HIST("Tracks/h1f_tracks_info"), kEffCorrPtRapCent); - effFact = histEff->GetBinContent(histEff->FindBin(cent, v0.pt(), rap)); + effCorrFact = histEff->GetBinContent(histEff->FindBin(cent, v0.pt(), rap)); } else { histos.fill(HIST("Tracks/h1f_tracks_info"), kNoEffCorr); LOGF(warning, "CCDB OBJECT IS NOT A HISTOGRAM !!!"); - effFact = 1.; + effCorrFact = 1.; } delete histEff; } @@ -855,6 +851,9 @@ struct LambdaTableProducer { if (histPrm->GetDimension() == TwoDimCorr) { histos.fill(HIST("Tracks/h1f_tracks_info"), kPFCorrPtCent); primFrac = histPrm->GetBinContent(histPrm->FindBin(cent, v0.pt())); + } else if (histPrm->GetDimension() == ThreeDimCorr) { + histos.fill(HIST("Tracks/h1f_tracks_info"), kPFCorrPtRapCent); + primFrac = histPrm->GetBinContent(histPrm->FindBin(cent, v0.pt(), rap)); } else { histos.fill(HIST("Tracks/h1f_tracks_info"), kNoPFCorr); LOGF(warning, "CCDB OBJECT IS NOT A HISTOGRAM !!!"); @@ -863,13 +862,7 @@ struct LambdaTableProducer { delete histPrm; } - if (effFact != 0) { - histos.fill(HIST("Tracks/h1f_tracks_info"), kCorrFact); - return primFrac / effFact; - } - - histos.fill(HIST("Tracks/h1f_tracks_info"), kErrCorrFact); - return 1.; + return primFrac * effCorrFact; } template @@ -1175,7 +1168,7 @@ struct LambdaTableProducer { } SliceCache cache; - Preslice> perCollision = aod::track::collisionId; + Preslice> perCollision = aod::v0data::collisionId; using CollisionsRun3 = soa::Join; using CollisionsRun2 = soa::Join; @@ -1390,7 +1383,9 @@ struct LambdaR2Correlation { Configurable cMinRap{"cMinRap", -0.5, "Minimum Rapidity"}; Configurable cMaxRap{"cMaxRap", 0.5, "Maximum Rapidity"}; Configurable cNPhiBins{"cNPhiBins", 36, "N Phi Bins"}; - Configurable cAnaPairs{"cAnaPairs", true, "Analyze Pairs Flag (Not required for efficiency computation)"}; + Configurable cAnaSecondaries{"cAnaSecondaries", false, "Analysze Secondaries"}; + Configurable cAnaPairs{"cAnaPairs", false, "Analyze Pairs Flag"}; + Configurable cAnaSecondaryPairs{"cAnaSecondaryPairs", false, "Analyze Secondary Pairs Flag"}; // Eta/Rap Analysis Configurable cDoEtaAnalysis{"cDoEtaAnalysis", false, "Eta/Rap Analysis Flag"}; @@ -1475,8 +1470,10 @@ struct LambdaR2Correlation { histos.add("Reco/Primary/h3f_n1_pteta_LaP", "#rho_{1}^{#Lambda}", kTH3F, {axisCent, axisPt, axisEta}); histos.add("Reco/Primary/h3f_n1_pteta_LaM", "#rho_{1}^{#bar{#Lambda}}", kTH3F, {axisCent, axisPt, axisEta}); - // Clone Singles Histogram - histos.addClone("Reco/Primary/", "Reco/Secondary/"); + // Clone Singles Primary/Secondary Histogram + if (cAnaSecondaries) { + histos.addClone("Reco/Primary/", "Reco/Secondary/"); + } if (cAnaPairs) { // rho2 for numerator of R2 @@ -1498,9 +1495,11 @@ struct LambdaR2Correlation { histos.add("Reco/PP/h2f_n2_qinv_LaM_LaM", "#rho_{2}^{#bar{#Lambda}#bar{#Lambda}}", kTH2F, {axisCent, axisQinv}); // Clone Pairs Histograms - histos.addClone("Reco/PP/", "Reco/PS/"); - histos.addClone("Reco/PP/", "Reco/SP/"); - histos.addClone("Reco/PP/", "Reco/SS/"); + if (cAnaSecondaryPairs) { + histos.addClone("Reco/PP/", "Reco/PS/"); + histos.addClone("Reco/PP/", "Reco/SP/"); + histos.addClone("Reco/PP/", "Reco/SS/"); + } } // MCGen @@ -1625,22 +1624,30 @@ struct LambdaR2Correlation { analyzeSingles(lambdaPrimTracks); analyzeSingles(antiLambdaPrimTracks); - analyzeSingles(lambdaSecdTracks); - analyzeSingles(antiLambdaSecdTracks); + + if (cAnaSecondaries) { + analyzeSingles(lambdaSecdTracks); + analyzeSingles(antiLambdaSecdTracks); + } if (cAnaPairs) { + // Primary Pairs Only analyzePairs(lambdaPrimTracks, antiLambdaPrimTracks); analyzePairs(lambdaPrimTracks, lambdaPrimTracks); analyzePairs(antiLambdaPrimTracks, antiLambdaPrimTracks); - analyzePairs(lambdaPrimTracks, antiLambdaSecdTracks); - analyzePairs(lambdaPrimTracks, lambdaSecdTracks); - analyzePairs(antiLambdaPrimTracks, antiLambdaSecdTracks); - analyzePairs(lambdaSecdTracks, antiLambdaPrimTracks); - analyzePairs(lambdaSecdTracks, lambdaPrimTracks); - analyzePairs(antiLambdaSecdTracks, antiLambdaPrimTracks); - analyzePairs(lambdaSecdTracks, antiLambdaSecdTracks); - analyzePairs(lambdaSecdTracks, lambdaSecdTracks); - analyzePairs(antiLambdaSecdTracks, antiLambdaSecdTracks); + + // Secondary Pairs + if (cAnaSecondaryPairs) { + analyzePairs(lambdaPrimTracks, antiLambdaSecdTracks); + analyzePairs(lambdaPrimTracks, lambdaSecdTracks); + analyzePairs(antiLambdaPrimTracks, antiLambdaSecdTracks); + analyzePairs(lambdaSecdTracks, antiLambdaPrimTracks); + analyzePairs(lambdaSecdTracks, lambdaPrimTracks); + analyzePairs(antiLambdaSecdTracks, antiLambdaPrimTracks); + analyzePairs(lambdaSecdTracks, antiLambdaSecdTracks); + analyzePairs(lambdaSecdTracks, lambdaSecdTracks); + analyzePairs(antiLambdaSecdTracks, antiLambdaSecdTracks); + } } } @@ -1669,22 +1676,30 @@ struct LambdaR2Correlation { analyzeSingles(lambdaPrimTracks); analyzeSingles(antiLambdaPrimTracks); - analyzeSingles(lambdaSecdTracks); - analyzeSingles(antiLambdaSecdTracks); + + if (cAnaSecondaries) { + analyzeSingles(lambdaSecdTracks); + analyzeSingles(antiLambdaSecdTracks); + } if (cAnaPairs) { + // Primary Pairs Only analyzePairs(lambdaPrimTracks, antiLambdaPrimTracks); analyzePairs(lambdaPrimTracks, lambdaPrimTracks); analyzePairs(antiLambdaPrimTracks, antiLambdaPrimTracks); - analyzePairs(lambdaPrimTracks, antiLambdaSecdTracks); - analyzePairs(lambdaPrimTracks, lambdaSecdTracks); - analyzePairs(antiLambdaPrimTracks, antiLambdaSecdTracks); - analyzePairs(lambdaSecdTracks, antiLambdaPrimTracks); - analyzePairs(lambdaSecdTracks, lambdaPrimTracks); - analyzePairs(antiLambdaSecdTracks, antiLambdaPrimTracks); - analyzePairs(lambdaSecdTracks, antiLambdaSecdTracks); - analyzePairs(lambdaSecdTracks, lambdaSecdTracks); - analyzePairs(antiLambdaSecdTracks, antiLambdaSecdTracks); + + // Secondary Pairs + if (cAnaSecondaryPairs) { + analyzePairs(lambdaPrimTracks, antiLambdaSecdTracks); + analyzePairs(lambdaPrimTracks, lambdaSecdTracks); + analyzePairs(antiLambdaPrimTracks, antiLambdaSecdTracks); + analyzePairs(lambdaSecdTracks, antiLambdaPrimTracks); + analyzePairs(lambdaSecdTracks, lambdaPrimTracks); + analyzePairs(antiLambdaSecdTracks, antiLambdaPrimTracks); + analyzePairs(lambdaSecdTracks, antiLambdaSecdTracks); + analyzePairs(lambdaSecdTracks, lambdaSecdTracks); + analyzePairs(antiLambdaSecdTracks, antiLambdaSecdTracks); + } } } From 876a2ea4cd6a43812c2573831e8f2104710d94b7 Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Thu, 5 Jun 2025 10:23:32 +0800 Subject: [PATCH 1517/1650] [PWGCF] produce and apply Efficiency correction (#11469) Co-authored-by: ALICE Action Bot --- .../Tasks/diHadronCor.cxx | 157 ++++++++++++++---- 1 file changed, 125 insertions(+), 32 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx b/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx index dbe6d1d4b79..e11c8ace7c2 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx @@ -36,6 +36,7 @@ #include "Common/DataModel/Centrality.h" #include "PWGCF/DataModel/CorrelationsDerived.h" #include "Common/DataModel/CollisionAssociationTables.h" +#include "Common/DataModel/PIDResponse.h" #include "PWGCF/Core/CorrelationContainer.h" #include "PWGCF/Core/PairCuts.h" #include "PWGCF/GenericFramework/Core/GFWPowerArray.h" @@ -44,6 +45,7 @@ #include "PWGCF/GenericFramework/Core/GFWWeights.h" #include "DataFormatsParameters/GRPObject.h" #include "DataFormatsParameters/GRPMagField.h" +#include using namespace o2; using namespace o2::framework; @@ -100,6 +102,8 @@ struct DiHadronCor { O2_DEFINE_CONFIGURABLE(cfgCutOccupancyHigh, int, 2000, "High cut on TPC occupancy") O2_DEFINE_CONFIGURABLE(cfgCutOccupancyLow, int, 0, "Low cut on TPC occupancy") O2_DEFINE_CONFIGURABLE(cfgEfficiency, std::string, "", "CCDB path to efficiency object") + O2_DEFINE_CONFIGURABLE(cfgLocalEfficiency, bool, false, "Use local efficiency object") + O2_DEFINE_CONFIGURABLE(cfgVerbosity, bool, false, "Verbose output") SliceCache cache; SliceCache cacheNch; @@ -107,27 +111,37 @@ struct DiHadronCor { ConfigurableAxis axisVertex{"axisVertex", {10, -10, 10}, "vertex axis for histograms"}; ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100}, "multiplicity axis for histograms"}; ConfigurableAxis axisCentrality{"axisCentrality", {VARIABLE_WIDTH, 0, 10, 20, 30, 40, 50, 60, 70, 80, 90}, "centrality axis for histograms"}; - ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt axis for histograms"}; + ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.2, 1.4, 1.6, 1.8, 2, 2.5, 3, 4, 5, 6, 8, 10}, "pt axis for histograms"}; ConfigurableAxis axisDeltaPhi{"axisDeltaPhi", {72, -PIHalf, PIHalf * 3}, "delta phi axis for histograms"}; ConfigurableAxis axisDeltaEta{"axisDeltaEta", {48, -2.4, 2.4}, "delta eta axis for histograms"}; - ConfigurableAxis axisPtTrigger{"axisPtTrigger", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt trigger axis for histograms"}; - ConfigurableAxis axisPtAssoc{"axisPtAssoc", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt associated axis for histograms"}; + ConfigurableAxis axisPtTrigger{"axisPtTrigger", {VARIABLE_WIDTH, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.2, 1.4, 1.6, 1.8, 2, 2.5, 3, 4, 5, 6, 8, 10}, "pt trigger axis for histograms"}; + ConfigurableAxis axisPtAssoc{"axisPtAssoc", {VARIABLE_WIDTH, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.2, 1.4, 1.6, 1.8, 2, 2.5, 3, 4, 5, 6, 8, 10}, "pt associated axis for histograms"}; ConfigurableAxis axisVtxMix{"axisVtxMix", {VARIABLE_WIDTH, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "vertex axis for mixed event histograms"}; ConfigurableAxis axisMultMix{"axisMultMix", {VARIABLE_WIDTH, 0, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100}, "multiplicity / centrality axis for mixed event histograms"}; ConfigurableAxis axisSample{"axisSample", {cfgSampleSize, 0, cfgSampleSize}, "sample axis for histograms"}; ConfigurableAxis axisVertexEfficiency{"axisVertexEfficiency", {10, -10, 10}, "vertex axis for efficiency histograms"}; ConfigurableAxis axisEtaEfficiency{"axisEtaEfficiency", {20, -1.0, 1.0}, "eta axis for efficiency histograms"}; - ConfigurableAxis axisPtEfficiency{"axisPtEfficiency", {VARIABLE_WIDTH, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0}, "pt axis for efficiency histograms"}; + ConfigurableAxis axisPtEfficiency{"axisPtEfficiency", {VARIABLE_WIDTH, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.2, 1.4, 1.6, 1.8, 2, 2.5, 3, 4, 5, 6, 8, 10}, "pt axis for efficiency histograms"}; // make the filters and cuts. Filter collisionFilter = (nabs(aod::collision::posZ) < cfgCutVtxZ) && (aod::evsel::sel8) == true && (aod::cent::centFT0C > cfgCentFT0CMin) && (aod::cent::centFT0C < cfgCentFT0CMax); Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls) && (nabs(aod::track::dcaZ) < cfgCutDCAz); + using AodCollisions = soa::Filtered>; // aod::CentFT0Cs + using AodTracks = soa::Filtered>; + + // Filter for MCParticle + Filter particleFilter = (nabs(aod::mcparticle::eta) < cfgCutEta) && (aod::mcparticle::pt > cfgCutPtMin) && (aod::mcparticle::pt < cfgCutPtMax); + using MyMcParticles = soa::Filtered; + + // Filter for MCcollisions + Filter mccollisionFilter = nabs(aod::mccollision::posZ) < cfgCutVtxZ; + using MyMcCollisions = soa::Filtered; + + Preslice perCollision = aod::track::collisionId; // Corrections - TH1D* mEfficiency = nullptr; - GFWWeights* mAcceptance = nullptr; - TObjArray* mAcceptanceList = nullptr; + TH3D* mEfficiency = nullptr; bool correctionsLoaded = false; // Define the outputs @@ -150,6 +164,9 @@ struct DiHadronCor { MixedEvent = 3 }; + // persistent caches + std::vector efficiencyAssociatedCache; + // Additional Event selection cuts - Copy from flowGenericFramework.cxx TF1* fMultPVCutLow = nullptr; TF1* fMultPVCutHigh = nullptr; @@ -159,9 +176,6 @@ struct DiHadronCor { TF1* fT0AV0AMean = nullptr; TF1* fT0AV0ASigma = nullptr; - using AodCollisions = soa::Filtered>; // aod::CentFT0Cs - using AodTracks = soa::Filtered>; - void init(InitContext&) { const AxisSpec axisPhi{72, 0.0, constants::math::TwoPI, "#varphi"}; @@ -224,6 +238,7 @@ struct DiHadronCor { registry.add("deltaEta_deltaPhi_mixed", "", {HistType::kTH2D, {axisDeltaPhi, axisDeltaEta}}); registry.add("Phi", "Phi", {HistType::kTH1D, {axisPhi}}); registry.add("Eta", "Eta", {HistType::kTH1D, {axisEta}}); + registry.add("EtaCorrected", "EtaCorrected", {HistType::kTH1D, {axisEta}}); registry.add("pT", "pT", {HistType::kTH1D, {axisPtTrigger}}); registry.add("pTCorrected", "pTCorrected", {HistType::kTH1D, {axisPtTrigger}}); registry.add("Nch", "N_{ch}", {HistType::kTH1D, {axisMultiplicity}}); @@ -237,6 +252,10 @@ struct DiHadronCor { registry.add("eventcount", "bin", {HistType::kTH1F, {{4, 0, 4, "bin"}}}); // histogram to see how many events are in the same and mixed event + if (!cfgEfficiency.value.empty()) { + efficiencyAssociatedCache.reserve(512); + } + std::vector corrAxis = {{axisSample, "Sample"}, {axisVertex, "z-vtx (cm)"}, {axisPtTrigger, "p_{T} (GeV/c)"}, @@ -244,9 +263,9 @@ struct DiHadronCor { {axisDeltaPhi, "#Delta#varphi (rad)"}, {axisDeltaEta, "#Delta#eta"}}; std::vector effAxis = { - {axisVertexEfficiency, "z-vtx (cm)"}, - {axisPtEfficiency, "p_{T} (GeV/c)"}, {axisEtaEfficiency, "#eta"}, + {axisPtEfficiency, "p_{T} (GeV/c)"}, + {axisVertexEfficiency, "z-vtx (cm)"}, }; std::vector userAxis; @@ -298,12 +317,18 @@ struct DiHadronCor { return ((track.tpcNClsFound() >= cfgCutTPCclu) && (track.itsNCls() >= cfgCutITSclu)); } - void loadCorrections(uint64_t timestamp) + void loadEfficiency(uint64_t timestamp) { - if (correctionsLoaded) + if (correctionsLoaded) { return; + } if (cfgEfficiency.value.empty() == false) { - mEfficiency = ccdb->getForTimeStamp(cfgEfficiency, timestamp); + if (cfgLocalEfficiency > 0) { + TFile* fEfficiencyTrigger = TFile::Open(cfgEfficiency.value.c_str(), "READ"); + mEfficiency = reinterpret_cast(fEfficiencyTrigger->Get("ccdb_object")); + } else { + mEfficiency = ccdb->getForTimeStamp(cfgEfficiency, timestamp); + } if (mEfficiency == nullptr) { LOGF(fatal, "Could not load efficiency histogram for trigger particles from %s", cfgEfficiency.value.c_str()); } @@ -312,13 +337,17 @@ struct DiHadronCor { correctionsLoaded = true; } - bool setCurrentParticleWeights(float& weight_nue, float pt) + bool getEfficiencyCorrection(float& weight_nue, float eta, float pt, float posZ) { float eff = 1.; - if (mEfficiency) - eff = mEfficiency->GetBinContent(mEfficiency->FindBin(pt)); - else + if (mEfficiency) { + int etaBin = mEfficiency->GetXaxis()->FindBin(eta); + int ptBin = mEfficiency->GetYaxis()->FindBin(pt); + int zBin = mEfficiency->GetZaxis()->FindBin(posZ); + eff = mEfficiency->GetBinContent(etaBin, ptBin, zBin); + } else { eff = 1.0; + } if (eff == 0) return false; weight_nue = 1. / eff; @@ -336,13 +365,15 @@ struct DiHadronCor { registry.fill(HIST("zVtx"), collision.posZ()); float weff1 = 1; + float vtxz = collision.posZ(); for (auto const& track1 : tracks) { if (!trackSelected(track1)) continue; - if (!setCurrentParticleWeights(weff1, track1.pt())) + if (!getEfficiencyCorrection(weff1, track1.eta(), track1.pt(), vtxz)) continue; registry.fill(HIST("Phi"), RecoDecay::constrainAngle(track1.phi(), 0.0)); registry.fill(HIST("Eta"), track1.eta()); + registry.fill(HIST("EtaCorrected"), track1.eta(), weff1); registry.fill(HIST("pT"), track1.pt()); registry.fill(HIST("pTCorrected"), track1.pt(), weff1); } @@ -376,6 +407,16 @@ struct DiHadronCor { template void fillCorrelations(TTracks tracks1, TTracksAssoc tracks2, float posZ, int system, int magneticField, float cent) // function to fill the Output functions (sparse) and the delta eta and delta phi histograms { + // Cache efficiency for particles (too many FindBin lookups) + if (mEfficiency) { + efficiencyAssociatedCache.clear(); + efficiencyAssociatedCache.reserve(tracks2.size()); + for (const auto& track2 : tracks2) { + float weff = 1.; + getEfficiencyCorrection(weff, track2.eta(), track2.pt(), posZ); + efficiencyAssociatedCache.push_back(weff); + } + } if (system == SameEvent) { registry.fill(HIST("Centrality_used"), cent); @@ -384,25 +425,26 @@ struct DiHadronCor { int fSampleIndex = gRandom->Uniform(0, cfgSampleSize); - float weff1 = 1; - float weff2 = 1; + float triggerWeight = 1.0f; + float associatedWeight = 1.0f; // loop over all tracks for (auto const& track1 : tracks1) { if (!trackSelected(track1)) continue; - if (!setCurrentParticleWeights(weff1, track1.pt())) + if (!getEfficiencyCorrection(triggerWeight, track1.eta(), track1.pt(), posZ)) continue; if (system == SameEvent) { - registry.fill(HIST("Trig_hist"), fSampleIndex, posZ, track1.pt()); + registry.fill(HIST("Trig_hist"), fSampleIndex, posZ, track1.pt(), triggerWeight); } for (auto const& track2 : tracks2) { if (!trackSelected(track2)) continue; - if (!setCurrentParticleWeights(weff2, track2.pt())) - continue; + if (mEfficiency) { + associatedWeight = efficiencyAssociatedCache[track2.filteredIndex()]; + } if (track1.pt() <= track2.pt()) continue; // skip if the trigger pt is less than the associate pt @@ -435,12 +477,12 @@ struct DiHadronCor { // fill the right sparse and histograms if (system == SameEvent) { - same->getPairHist()->Fill(step, fSampleIndex, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta); - registry.fill(HIST("deltaEta_deltaPhi_same"), deltaPhi, deltaEta); + same->getPairHist()->Fill(step, fSampleIndex, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta, triggerWeight * associatedWeight); + registry.fill(HIST("deltaEta_deltaPhi_same"), deltaPhi, deltaEta, triggerWeight * associatedWeight); } else if (system == MixedEvent) { - mixed->getPairHist()->Fill(step, fSampleIndex, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta); - registry.fill(HIST("deltaEta_deltaPhi_mixed"), deltaPhi, deltaEta); + mixed->getPairHist()->Fill(step, fSampleIndex, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta, triggerWeight * associatedWeight); + registry.fill(HIST("deltaEta_deltaPhi_mixed"), deltaPhi, deltaEta, triggerWeight * associatedWeight); } } } @@ -528,7 +570,7 @@ struct DiHadronCor { registry.fill(HIST("eventcount"), SameEvent); // because its same event i put it in the 1 bin - loadCorrections(bc.timestamp()); + loadEfficiency(bc.timestamp()); fillYield(collision, tracks); if (cfgSelCollByNch && (tracks.size() < cfgCutMultMin || tracks.size() >= cfgCutMultMax)) { @@ -561,7 +603,7 @@ struct DiHadronCor { for (auto const& [collision1, tracks1, collision2, tracks2] : pair) { registry.fill(HIST("eventcount"), MixedEvent); // fill the mixed event in the 3 bin auto bc = collision1.bc_as(); - loadCorrections(bc.timestamp()); + loadEfficiency(bc.timestamp()); if (cfgSelCollByNch && (tracks1.size() < cfgCutMultMin || tracks1.size() >= cfgCutMultMax)) continue; @@ -587,6 +629,57 @@ struct DiHadronCor { } PROCESS_SWITCH(DiHadronCor, processMixed, "Process mixed events", true); + + int getSpecies(int pdgCode) + { + switch (pdgCode) { + case 211: // pion + case -211: + return 0; + case 321: // Kaon + case -321: + return 1; + case 2212: // proton + case -2212: + return 2; + default: // NOTE. The efficiency histogram is hardcoded to contain 4 species. Anything special will have the last slot. + return 3; + } + } + + void processMCEfficiency(MyMcCollisions::iterator const& mcCollision, aod::BCsWithTimestamps const&, soa::SmallGroups> const& collisions, MyMcParticles const& mcParticles, AodTracks const& tracks) + { + if (cfgSelCollByNch && (tracks.size() < cfgCutMultMin || tracks.size() >= cfgCutMultMax)) { + return; + } + // Primaries + for (const auto& mcParticle : mcParticles) { + if (mcParticle.isPhysicalPrimary()) { + same->getTrackHistEfficiency()->Fill(CorrelationContainer::MC, mcParticle.eta(), mcParticle.pt(), getSpecies(mcParticle.pdgCode()), 0., mcCollision.posZ()); + } + } + for (const auto& collision : collisions) { + auto groupedTracks = tracks.sliceBy(perCollision, collision.globalIndex()); + if (cfgVerbosity) { + LOGF(info, " Reconstructed collision at vtx-z = %f", collision.posZ()); + LOGF(info, " which has %d tracks", groupedTracks.size()); + } + + for (const auto& track : groupedTracks) { + if (track.has_mcParticle()) { + const auto& mcParticle = track.mcParticle(); + if (mcParticle.isPhysicalPrimary()) { + same->getTrackHistEfficiency()->Fill(CorrelationContainer::RecoPrimaries, mcParticle.eta(), mcParticle.pt(), getSpecies(mcParticle.pdgCode()), 0., mcCollision.posZ()); + } + same->getTrackHistEfficiency()->Fill(CorrelationContainer::RecoAll, mcParticle.eta(), mcParticle.pt(), getSpecies(mcParticle.pdgCode()), 0., mcCollision.posZ()); + } else { + // fake track + same->getTrackHistEfficiency()->Fill(CorrelationContainer::Fake, track.eta(), track.pt(), 0, 0., mcCollision.posZ()); + } + } + } + } + PROCESS_SWITCH(DiHadronCor, processMCEfficiency, "MC: Extract efficiencies", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From faa86dc00e5f24a299e0179d80e4cc496a9f8e29 Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Thu, 5 Jun 2025 04:49:47 +0200 Subject: [PATCH 1518/1650] [PWGLF] Full process function autoconfigure for strangeness builder service (#11467) Co-authored-by: ALICE Builder --- .../Strangeness/strangenessbuilder.cxx | 74 ++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx index 22bc5c6a6e6..c38c792f5e1 100644 --- a/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx +++ b/PWGLF/TableProducer/Strangeness/strangenessbuilder.cxx @@ -301,6 +301,9 @@ struct StrangenessBuilder { Configurable mc_findableMode{"mc_findableMode", 0, "0: disabled; 1: add findable-but-not-found to existing V0s from AO2D; 2: reset V0s and generate only findable-but-not-found"}; + // Autoconfigure process functions + Configurable autoConfigureProcess{"autoConfigureProcess", false, "if true, will configure process function switches based on metadata"}; + // V0 building options struct : ConfigurableGroup { std::string prefix = "v0BuilderOpts"; @@ -2646,6 +2649,75 @@ struct StrangenessBuilder { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { + auto strangenessBuilderTask = adaptAnalysisTask(cfgc); + bool isRun3 = true, hasRunInfo = false; + bool isMC = false, hasDataTypeInfo = false; + if (cfgc.options().hasOption("aod-metadata-Run") == true) { + hasRunInfo = true; + if (cfgc.options().get("aod-metadata-Run") == "2") { + isRun3 = false; + } + } + if (cfgc.options().hasOption("aod-metadata-DataType") == true) { + hasDataTypeInfo = true; + if (cfgc.options().get("aod-metadata-DataType") == "MC") { + isMC = true; + } + } + + int idxSwitches[8]; // 8 switches (real / real r2 / MC / MC r2 + PID) + bool autoConfigureProcessConfig = true; + bool withPID = false; + + for (size_t ipar = 0; ipar < strangenessBuilderTask.options.size(); ipar++) { + auto option = strangenessBuilderTask.options[ipar]; + if (option.name == "processRealData") { + idxSwitches[0] = ipar; + } + if (option.name == "processRealDataRun2") { + idxSwitches[1] = ipar; + } + if (option.name == "processMonteCarlo") { + idxSwitches[2] = ipar; + } + if (option.name == "processMonteCarloRun2") { + idxSwitches[3] = ipar; + } + if (option.name == "processRealDataWithPID") { + idxSwitches[4] = ipar; + } + if (option.name == "processRealDataRun2WithPID") { + idxSwitches[5] = ipar; + } + if (option.name == "processMonteCarloWithPID") { + idxSwitches[6] = ipar; + } + if (option.name == "processMonteCarloRun2WithPID") { + idxSwitches[7] = ipar; + } + if (option.name == "autoConfigureProcess") { + autoConfigureProcessConfig = option.defaultValue.get(); // check if autoconfig requested + } + // use withPID in case preselection is requested + if (option.name == "preSelectOpts.preselectOnlyDesiredV0s" || option.name == "preSelectOpts.preselectOnlyDesiredCascades") { + withPID = withPID || option.defaultValue.get(); + } + } + if ((!hasRunInfo || !hasDataTypeInfo) && autoConfigureProcessConfig) { + throw std::runtime_error("Autoconfigure requested but no metadata information found! Please check if --aod-file was used in the last workflow added in the execution and if the AO2D in question has metadata saved in it."); + } + + // positions of switches are known. Next: flip if asked for + if (autoConfigureProcessConfig) { + int relevantProcess = static_cast(!isRun3) + 2 * static_cast(isMC) + 4 * static_cast(withPID); + LOGF(info, "Automatic configuration of process switches requested! Autodetected settings: isRun3? %i, isMC? %i, withPID? %i (switch #%i)", hasRunInfo, hasDataTypeInfo, isRun3, isMC, withPID, relevantProcess); + for (size_t idx = 0; idx < 8; idx++) { + auto option = strangenessBuilderTask.options[idxSwitches[idx]]; + option.defaultValue = false; // switch all off + } + strangenessBuilderTask.options[idxSwitches[relevantProcess]].defaultValue = true; + } + return WorkflowSpec{ - adaptAnalysisTask(cfgc)}; + strangenessBuilderTask}; } From e8d5480551a879b5de28f97719de183e462820bf Mon Sep 17 00:00:00 2001 From: Francesco Mazzaschi <43742195+fmazzasc@users.noreply.github.com> Date: Thu, 5 Jun 2025 05:57:26 +0200 Subject: [PATCH 1519/1650] [PWGLF] Fix MC information for primaries and secondaries (#11452) --- PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx | 27 ++++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx index 712e3611013..551fbb56e6d 100644 --- a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx +++ b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx @@ -1017,16 +1017,15 @@ struct nucleiSpectra { if (pdg != nuclei::codes[iS]) { continue; } - uint16_t flags{kIsPhysicalPrimary}; - if (particle.isPhysicalPrimary()) { - if (particle.y() > cfgCutRapidityMin && particle.y() < cfgCutRapidityMax) { - nuclei::hGenNuclei[iS][particle.pdgCode() < 0]->Fill(1., particle.pt()); - } + if (particle.y() < cfgCutRapidityMin || particle.y() > cfgCutRapidityMax) { + continue; } - if (!isReconstructed[index] && (cfgTreeConfig->get(iS, 0u) || cfgTreeConfig->get(iS, 1u))) { - float absDecL = computeAbsoDecL(particle); - int motherPdgCode = 0; + uint16_t flags = 0; + int motherPdgCode = 0; + if (particle.isPhysicalPrimary()) { + flags |= kIsPhysicalPrimary; + nuclei::hGenNuclei[iS][particle.pdgCode() < 0]->Fill(1., particle.pt()); if (particle.has_mothers()) { for (auto& motherparticle : particle.mothers_as()) { if (std::find(nuclei::hfMothCodes.begin(), nuclei::hfMothCodes.end(), std::abs(motherparticle.pdgCode())) != nuclei::hfMothCodes.end()) { @@ -1036,6 +1035,18 @@ struct nucleiSpectra { } } } + } else if (particle.has_mothers()) { + flags |= kIsSecondaryFromWeakDecay; + for (auto& motherparticle : particle.mothers_as()) { + motherPdgCode = motherparticle.pdgCode(); + } + } else { + flags |= kIsSecondaryFromMaterial; + } + + if (!isReconstructed[index] && (cfgTreeConfig->get(iS, 0u) || cfgTreeConfig->get(iS, 1u))) { + float absDecL = computeAbsoDecL(particle); + nucleiTableMC(999., 999., 999., 0., 0., 999., 999., 999., -1, -1, -1, -1, flags, 0, 0, 0, 0, 0, 0, particle.pt(), particle.eta(), particle.phi(), particle.pdgCode(), motherPdgCode, goodCollisions[particle.mcCollisionId()], absDecL); } break; From b9fb45780f8b5263702b77d73f60a28a12d074d3 Mon Sep 17 00:00:00 2001 From: lmattei01 <122298453+lmattei01@users.noreply.github.com> Date: Thu, 5 Jun 2025 12:45:02 +0200 Subject: [PATCH 1520/1650] [PWGDQ] Fixing the initialization of histograms of reconstructed dimuons matched to MC signals (#11476) Co-authored-by: MATTEI --- PWGDQ/Tasks/dqEfficiency_withAssoc.cxx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx index 9630c8275b5..cb44ae1d935 100644 --- a/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx +++ b/PWGDQ/Tasks/dqEfficiency_withAssoc.cxx @@ -1507,7 +1507,8 @@ struct AnalysisSameEventPairing { // assign hist directories for pairs matched to MC signals for each (muon cut, MCrec signal) combination if (!sigNamesStr.IsNull()) { - for (auto& sig : fRecMCSignals) { + for (unsigned int isig = 0; isig < fRecMCSignals.size(); isig++) { + auto sig = fRecMCSignals.at(isig); names = { Form("PairsMuonSEPM_%s_%s", objArray->At(icut)->GetName(), sig->GetName()), Form("PairsMuonSEPP_%s_%s", objArray->At(icut)->GetName(), sig->GetName()), @@ -1526,9 +1527,9 @@ struct AnalysisSameEventPairing { for (auto& n : names) { histNames += Form("%s;", n.Data()); } + fMuonHistNamesMCmatched.try_emplace(icut * fRecMCSignals.size() + isig, names); } // end loop over MC signals } - fMuonHistNamesMCmatched[icut] = names; } } } // end loop over cuts From 9b282af6f5f83fad66c99b5602af520e8ffafa4d Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Thu, 5 Jun 2025 18:54:20 +0800 Subject: [PATCH 1521/1650] [PWGLF] feat(nonPromptCascade): Introduce configurable triggers of interest (#11473) --- PWGLF/Tasks/Strangeness/nonPromptCascade.cxx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx index f46b865393a..c5388c034a2 100644 --- a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx +++ b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx @@ -195,7 +195,7 @@ struct NonPromptCascadeTask { Configurable cfgMinCosPA{"cfgMinCosPA", -1.f, "Minimum cosine of pointing angle"}; Configurable> cfgCutsPID{"particlesCutsPID", {cutsPID[0], nParticles, nCutsPID, particlesNames, cutsNames}, "Nuclei PID selections"}; Configurable cfgSkimmedProcessing{"cfgSkimmedProcessing", true, "Skimmed dataset processing"}; - Configurable cfgHMOmegaTrigger{"cfgHMOmegaTrigger", "HighMultOmega", "OTS high multiplicity Omega trigger"}; + Configurable cfgTriggersOfInterest{"cfgTriggersOfInterest", "fTrackedOmega,fOmegaHighMult", "Triggers of interest, comma separated for Zorro"}; Zorro mZorro; OutputObj mZorroSummary{"ZorroSummary"}; @@ -230,7 +230,6 @@ struct NonPromptCascadeTask { void init(InitContext const&) { mZorroSummary.setObject(mZorro.getZorroSummary()); - mZorroSummary->setupTOIs(1, cfgHMOmegaTrigger); mCCDB->setURL(ccdbUrl); mCCDB->setFatalWhenNull(true); mCCDB->setCaching(true); @@ -295,7 +294,7 @@ struct NonPromptCascadeTask { for (const auto& coll : collisions) { auto bc = coll.template bc_as(); if (runNumber != bc.runNumber()) { - mZorro.initCCDB(mCCDB.service, bc.runNumber(), bc.timestamp(), "fTrackedOmega"); + mZorro.initCCDB(mCCDB.service, bc.runNumber(), bc.timestamp(), cfgTriggersOfInterest.value); mZorro.populateHistRegistry(mRegistry, bc.runNumber()); runNumber = bc.runNumber(); } From 1d354d0936e002a3fcc78a8ec852f0c5e37eb1af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josu=C3=A9=20Mart=C3=ADnez=20Garc=C3=ADa?= Date: Thu, 5 Jun 2025 06:22:35 -0600 Subject: [PATCH 1522/1650] [PWGUD] Improving correlation for gap sides (#11435) --- PWGUD/Tasks/upcPhotonuclearAnalysisJMG.cxx | 163 ++++++++++++++------- 1 file changed, 113 insertions(+), 50 deletions(-) diff --git a/PWGUD/Tasks/upcPhotonuclearAnalysisJMG.cxx b/PWGUD/Tasks/upcPhotonuclearAnalysisJMG.cxx index 995e04a8335..eb16b83f315 100644 --- a/PWGUD/Tasks/upcPhotonuclearAnalysisJMG.cxx +++ b/PWGUD/Tasks/upcPhotonuclearAnalysisJMG.cxx @@ -47,9 +47,21 @@ namespace tree DECLARE_SOA_COLUMN(PtSideA, ptSideA, std::vector); DECLARE_SOA_COLUMN(RapSideA, rapSideA, std::vector); DECLARE_SOA_COLUMN(PhiSideA, phiSideA, std::vector); +DECLARE_SOA_COLUMN(TPCSignalSideA, tpcSignalSideA, std::vector); +DECLARE_SOA_COLUMN(TOFSignalSideA, tofSignalSideA, std::vector); +DECLARE_SOA_COLUMN(TPCNSigmaPiSideA, tpcNSigmaPiSideA, std::vector); +DECLARE_SOA_COLUMN(TOFNSigmaPiSideA, tofNSigmaPiSideA, std::vector); +DECLARE_SOA_COLUMN(TPCNSigmaKaSideA, tpcNSigmaKaSideA, std::vector); +DECLARE_SOA_COLUMN(TOFNSigmaKaSideA, tofNSigmaKaSideA, std::vector); DECLARE_SOA_COLUMN(PtSideC, ptSideC, std::vector); DECLARE_SOA_COLUMN(RapSideC, rapSideC, std::vector); DECLARE_SOA_COLUMN(PhiSideC, phiSideC, std::vector); +DECLARE_SOA_COLUMN(TPCSignalSideC, tpcSignalSideC, std::vector); +DECLARE_SOA_COLUMN(TOFSignalSideC, tofSignalSideC, std::vector); +DECLARE_SOA_COLUMN(TPCNSigmaPiSideC, tpcNSigmaPiSideC, std::vector); +DECLARE_SOA_COLUMN(TOFNSigmaPiSideC, tofNSigmaPiSideC, std::vector); +DECLARE_SOA_COLUMN(TPCNSigmaKaSideC, tpcNSigmaKaSideC, std::vector); +DECLARE_SOA_COLUMN(TOFNSigmaKaSideC, tofNSigmaKaSideC, std::vector); DECLARE_SOA_COLUMN(NchSideA, nchSideA, int); DECLARE_SOA_COLUMN(MultiplicitySideA, multiplicitySideA, int); DECLARE_SOA_COLUMN(NchSideC, nchSideC, int); @@ -59,9 +71,21 @@ DECLARE_SOA_TABLE(TREE, "AOD", "Tree", tree::PtSideA, tree::RapSideA, tree::PhiSideA, + tree::TPCSignalSideA, + tree::TOFSignalSideA, + tree::TPCNSigmaPiSideA, + tree::TOFNSigmaPiSideA, + tree::TPCNSigmaKaSideA, + tree::TOFNSigmaKaSideA, tree::PtSideC, tree::RapSideC, tree::PhiSideC, + tree::TPCSignalSideC, + tree::TOFSignalSideC, + tree::TPCNSigmaPiSideC, + tree::TOFNSigmaPiSideC, + tree::TPCNSigmaKaSideC, + tree::TOFNSigmaKaSideC, tree::NchSideA, tree::MultiplicitySideA, tree::NchSideC, @@ -76,6 +100,7 @@ struct upcPhotonuclearAnalysisJMG { HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; // Declare configurables on events/collisions + Configurable nEvenstMixed{"nEvenstMixed", 3, {"Events to be Mixed"}}; Configurable myZVtxCut{"myZVtxCut", 10., {"My collision cut"}}; Configurable myTimeZNACut{"myTimeZNACut", 2., {"My collision cut"}}; Configurable myTimeZNCCut{"myTimeZNCCut", 2., {"My collision cut"}}; @@ -127,11 +152,13 @@ struct upcPhotonuclearAnalysisJMG { Filter collisionZNTimeFilter = nabs(aod::udzdc::timeZNA) < myTimeZNACut && nabs(aod::udzdc::timeZNC) < myTimeZNCCut; using FullSGUDCollision = soa::Filtered>; - using FullUDTracks = soa::Join; + using FullUDTracks = soa::Join; // Output definitions - OutputObj same{"sameEvent"}; - OutputObj mixed{"mixedEvent"}; + OutputObj sameGapSideA{"sameEventGapSideA"}; + OutputObj mixedGapSideA{"mixedEventGapSideA"}; + OutputObj sameGapSideC{"sameEventGapSideC"}; + OutputObj mixedGapSideC{"mixedEventGapSideC"}; UPCPairCuts mPairCuts; bool doPairCuts = false; @@ -175,6 +202,7 @@ struct upcPhotonuclearAnalysisJMG { histos.add("Tracks/SGsideA/hTrackPhi", "#it{#phi} distribution; #it{#phi}; counts", kTH1F, {axisPhi}); histos.add("Tracks/SGsideA/hTrackEta", "#it{#eta} distribution; #it{#eta}; counts", kTH1F, {axisEta}); histos.add("Tracks/SGsideA/hTrackTPCSignnalP", "#it{TPC dE/dx vs p}; #it{p*charge}; #it{TPC dE/dx}", kTH2F, {axisP, axisTPCSignal}); + histos.add("Tracks/SGsideA/hTrackTOFSignnalP", "#it{TOF signal vs p}; #it{p*charge}; #it{TOF signal}", kTH2F, {axisP, axisTPCSignal}); histos.add("Tracks/SGsideA/hTrackITSNCls", "#it{N Clusters ITS} distribution; #it{N Clusters ITS}; counts", kTH1F, {axisNCls}); histos.add("Tracks/SGsideA/hTrackITSChi2NCls", "#it{N Clusters Chi2 ITS} distribution; #it{N Clusters Chi2 ITS}; counts", kTH1F, {axisChi2NCls}); histos.add("Tracks/SGsideA/hTrackNClsCrossedRowsOverNClsFindable", "#it{NClsCrossedRows/FindableNCls} distribution in TPC; #it{NClsCrossedRows/FindableNCls}; counts", kTH1F, {axisTPCNClsCrossedRowsMin}); @@ -205,6 +233,7 @@ struct upcPhotonuclearAnalysisJMG { histos.add("Tracks/SGsideC/hTrackPhi", "#it{#phi} distribution; #it{#phi}; counts", kTH1F, {axisPhi}); histos.add("Tracks/SGsideC/hTrackEta", "#it{#eta} distribution; #it{#eta}; counts", kTH1F, {axisEta}); histos.add("Tracks/SGsideC/hTrackTPCSignnalP", "#it{TPC dE/dx vs p}; #it{p*charge}; #it{TPC dE/dx}", kTH2F, {axisP, axisTPCSignal}); + histos.add("Tracks/SGsideC/hTrackTOFSignnalP", "#it{TOF signal vs p}; #it{p*charge}; #it{TOF signal}", kTH2F, {axisP, axisTPCSignal}); histos.add("Tracks/SGsideC/hTrackITSNCls", "#it{N Clusters ITS} distribution; #it{N Clusters ITS}; counts", kTH1F, {axisNCls}); histos.add("Tracks/SGsideC/hTrackITSChi2NCls", "#it{N Clusters Chi2 ITS} distribution; #it{N Clusters Chi2 ITS}; counts", kTH1F, {axisChi2NCls}); histos.add("Tracks/SGsideC/hTrackNClsCrossedRowsOverNClsFindable", "#it{NClsCrossedRows/FindableNCls} distribution in TPC; #it{NClsCrossedRows/FindableNCls}; counts", kTH1F, {axisTPCNClsCrossedRowsMin}); @@ -240,18 +269,22 @@ struct upcPhotonuclearAnalysisJMG { {axisEtaEfficiency, "#eta"}, {axisPtEfficiency, "p_{T} (GeV/c)"}, {axisVertexEfficiency, "z-vtx (cm)"}}; - same.setObject(new CorrelationContainer("sameEvent", "sameEvent", corrAxis, effAxis, {})); - mixed.setObject(new CorrelationContainer("mixedEvent", "mixedEvent", corrAxis, effAxis, {})); + sameGapSideA.setObject(new CorrelationContainer("sameEventGapSideA", "sameEventGapSideA", corrAxis, effAxis, {})); + mixedGapSideA.setObject(new CorrelationContainer("mixedEventGapSideA", "mixedEventGapSideA", corrAxis, effAxis, {})); + sameGapSideC.setObject(new CorrelationContainer("sameEventGapSideC", "sameEventGapSideC", corrAxis, effAxis, {})); + mixedGapSideC.setObject(new CorrelationContainer("mixedEventGapSideC", "mixedEventGapSideC", corrAxis, effAxis, {})); } - std::vector vtxBinsEdges{VARIABLE_WIDTH, -10.0f, -7.0f, -5.0f, -2.0f, 0.0f, 2.0f, 5.0f, 7.0f, 10.0f}; - std::vector multBinsEdges{VARIABLE_WIDTH, 0.0f, 50.0f, 400.0f}; + std::vector vtxBinsEdges{VARIABLE_WIDTH, -10.0f, -5.0f, 0.0f, 5.0f, 10.0f}; + std::vector gapSideBinsEdges{VARIABLE_WIDTH, -0.5, 0.5, 1.5}; + SliceCache cache; // Binning only on PosZ without multiplicity - using BinningType = ColumnBinningPolicy; - BinningType bindingOnVtx{{vtxBinsEdges}, true}; - SameKindPair pairs{bindingOnVtx, 5, -1, &cache}; + // using BinningType = ColumnBinningPolicy; + using BinningType = ColumnBinningPolicy; + BinningType bindingOnVtx{{vtxBinsEdges, {gapSideBinsEdges}}, true}; + SameKindPair pairs{bindingOnVtx, nEvenstMixed, -1, &cache}; // ColumnBinningPolicy bindingOnVtx{{vtxBinsEdges, multBinsEdges}, true}; @@ -345,7 +378,7 @@ struct upcPhotonuclearAnalysisJMG { template void fillQAUD(const TTracks tracks) { - for (auto& track : tracks) { + for (const auto& track : tracks) { histos.fill(HIST("yields"), tracks.size(), track.pt(), eta(track.px(), track.py(), track.pz())); histos.fill(HIST("etaphi"), tracks.size(), eta(track.px(), track.py(), track.pz()), phi(track.px(), track.py())); } @@ -363,12 +396,12 @@ struct upcPhotonuclearAnalysisJMG { void fillCorrelationsUD(TTarget target, const TTracks tracks1, const TTracks tracks2, float multiplicity, float posZ) { multiplicity = tracks1.size(); - for (auto& track1 : tracks1) { + for (const auto& track1 : tracks1) { if (isTrackCut(track1) == false) { continue; } target->getTriggerHist()->Fill(CorrelationContainer::kCFStepReconstructed, track1.pt(), multiplicity, posZ, 1.0); - for (auto& track2 : tracks2) { + for (const auto& track2 : tracks2) { if (track1 == track2) { continue; } @@ -396,8 +429,9 @@ struct upcPhotonuclearAnalysisJMG { int sgSide = reconstructedCollision.gapSide(); int nTracksCharged = 0; float sumPt = 0; - std::vector vTrackPtSideA, vTrackEtaSideA, vTrackPhiSideA; - std::vector vTrackPtSideC, vTrackEtaSideC, vTrackPhiSideC; + std::vector vTrackPtSideA, vTrackEtaSideA, vTrackPhiSideA, vTrackTPCSignalSideA, vTrackTOFSignalSideA, vTrackTPCNSigmaPiSideA, vTrackTOFNSigmaPiSideA, vTrackTPCNSigmaKaSideA, vTrackTOFNSigmaKaSideA; + std::vector vTrackPtSideC, vTrackEtaSideC, vTrackPhiSideC, vTrackTPCSignalSideC, vTrackTOFSignalSideC, vTrackTPCNSigmaPiSideC, vTrackTOFNSigmaPiSideC, vTrackTPCNSigmaKaSideC, vTrackTOFNSigmaKaSideC; + int nTracksChargedSideA(-222), nTracksChargedSideC(-222); int multiplicitySideA(-222), multiplicitySideC(-222); @@ -416,7 +450,7 @@ struct upcPhotonuclearAnalysisJMG { histos.fill(HIST("Events/SGsideA/hZVtx"), reconstructedCollision.posZ()); histos.fill(HIST("Events/SGsideA/hAmplitudFT0A"), reconstructedCollision.totalFT0AmplitudeA()); histos.fill(HIST("Events/SGsideA/hAmplitudFT0C"), reconstructedCollision.totalFT0AmplitudeC()); - for (auto& track : reconstructedTracks) { + for (const auto& track : reconstructedTracks) { if (track.sign() == 1 || track.sign() == -1) { if (isTrackCut(track) == false) { continue; @@ -427,9 +461,16 @@ struct upcPhotonuclearAnalysisJMG { histos.fill(HIST("Tracks/SGsideA/hTrackPhi"), phi(track.px(), track.py())); histos.fill(HIST("Tracks/SGsideA/hTrackEta"), eta(track.px(), track.py(), track.pz())); histos.fill(HIST("Tracks/SGsideA/hTrackTPCSignnalP"), momentum(track.px(), track.py(), track.pz()) * track.sign(), track.tpcSignal()); + histos.fill(HIST("Tracks/SGsideA/hTrackTOFSignnalP"), momentum(track.px(), track.py(), track.pz()) * track.sign(), track.tofSignal()); vTrackPtSideA.push_back(track.pt()); vTrackEtaSideA.push_back(eta(track.px(), track.py(), track.pz())); vTrackPhiSideA.push_back(phi(track.px(), track.py())); + vTrackTPCSignalSideA.push_back(track.tpcSignal()); + vTrackTOFSignalSideA.push_back(track.tofSignal()); + vTrackTPCNSigmaPiSideA.push_back(track.tpcNSigmaPi()); + vTrackTOFNSigmaPiSideA.push_back(track.tofNSigmaPi()); + vTrackTPCNSigmaKaSideA.push_back(track.tpcNSigmaKa()); + vTrackTOFNSigmaKaSideA.push_back(track.tofNSigmaKa()); histos.fill(HIST("Tracks/SGsideA/hTrackITSNCls"), track.itsNCls()); histos.fill(HIST("Tracks/SGsideA/hTrackITSChi2NCls"), track.itsChi2NCl()); @@ -465,7 +506,7 @@ struct upcPhotonuclearAnalysisJMG { histos.fill(HIST("Events/SGsideC/hZVtx"), reconstructedCollision.posZ()); histos.fill(HIST("Events/SGsideC/hAmplitudFT0A"), reconstructedCollision.totalFT0AmplitudeA()); histos.fill(HIST("Events/SGsideC/hAmplitudFT0C"), reconstructedCollision.totalFT0AmplitudeC()); - for (auto& track : reconstructedTracks) { + for (const auto& track : reconstructedTracks) { if (track.sign() == 1 || track.sign() == -1) { if (isTrackCut(track) == false) { continue; @@ -476,9 +517,16 @@ struct upcPhotonuclearAnalysisJMG { histos.fill(HIST("Tracks/SGsideC/hTrackPhi"), phi(track.px(), track.py())); histos.fill(HIST("Tracks/SGsideC/hTrackEta"), eta(track.px(), track.py(), track.pz())); histos.fill(HIST("Tracks/SGsideC/hTrackTPCSignnalP"), momentum(track.px(), track.py(), track.pz()) * track.sign(), track.tpcSignal()); + histos.fill(HIST("Tracks/SGsideC/hTrackTOFSignnalP"), momentum(track.px(), track.py(), track.pz()) * track.sign(), track.tofSignal()); vTrackPtSideC.push_back(track.pt()); vTrackEtaSideC.push_back(eta(track.px(), track.py(), track.pz())); vTrackPhiSideC.push_back(phi(track.px(), track.py())); + vTrackTPCSignalSideC.push_back(track.tpcSignal()); + vTrackTOFSignalSideC.push_back(track.tofSignal()); + vTrackTPCNSigmaPiSideC.push_back(track.tpcNSigmaPi()); + vTrackTOFNSigmaPiSideC.push_back(track.tofNSigmaPi()); + vTrackTPCNSigmaKaSideC.push_back(track.tpcNSigmaKa()); + vTrackTOFNSigmaKaSideC.push_back(track.tofNSigmaKa()); histos.fill(HIST("Tracks/SGsideC/hTrackITSNCls"), track.itsNCls()); histos.fill(HIST("Tracks/SGsideC/hTrackITSChi2NCls"), track.itsChi2NCl()); @@ -504,7 +552,7 @@ struct upcPhotonuclearAnalysisJMG { return; break; } - tree(vTrackPtSideA, vTrackEtaSideA, vTrackPhiSideA, vTrackPtSideC, vTrackEtaSideC, vTrackPhiSideC, nTracksChargedSideA, multiplicitySideA, nTracksChargedSideC, multiplicitySideC); + tree(vTrackPtSideA, vTrackEtaSideA, vTrackPhiSideA, vTrackTPCSignalSideA, vTrackTOFSignalSideA, vTrackTPCNSigmaPiSideA, vTrackTOFNSigmaPiSideA, vTrackTPCNSigmaKaSideA, vTrackTOFNSigmaKaSideA, vTrackPtSideC, vTrackEtaSideC, vTrackPhiSideC, vTrackTPCSignalSideA, vTrackTOFSignalSideA, vTrackTPCNSigmaPiSideA, vTrackTOFNSigmaPiSideA, vTrackTPCNSigmaKaSideA, vTrackTOFNSigmaKaSideA, nTracksChargedSideA, multiplicitySideA, nTracksChargedSideC, multiplicitySideC); // nTracksChargedSideA = nTracksChargedSideC = multiplicitySideA = multiplicitySideC = 0; } PROCESS_SWITCH(upcPhotonuclearAnalysisJMG, processSG, "Process in UD tables", true); @@ -512,25 +560,32 @@ struct upcPhotonuclearAnalysisJMG { void processSame(FullSGUDCollision::iterator const& reconstructedCollision, FullUDTracks const& reconstructedTracks) { int sgSide = reconstructedCollision.gapSide(); + float multiplicity = 0; - float multiplicity = reconstructedTracks.size(); switch (sgSide) { case 0: // gap for side A if (isCollisionCutSG(reconstructedCollision, 0) == false) { return; } - if (fillCollisionUD(same, multiplicity) == false) { + multiplicity = reconstructedTracks.size(); + if (fillCollisionUD(sameGapSideA, multiplicity) == false) { return; } - LOGF(info, "Filling same events"); + // LOGF(debug, "Filling sameGapSideA events"); histos.fill(HIST("eventcount"), -2); fillQAUD(reconstructedTracks); - fillCorrelationsUD(same, reconstructedTracks, reconstructedTracks, multiplicity, reconstructedCollision.posZ()); + fillCorrelationsUD(sameGapSideA, reconstructedTracks, reconstructedTracks, multiplicity, reconstructedCollision.posZ()); break; case 1: // gap for side C - // if (isCollisionCutSG(reconstructedCollision, 1) == false) { - // return; - // } + if (isCollisionCutSG(reconstructedCollision, 1) == false) { + return; + } + multiplicity = reconstructedTracks.size(); + if (fillCollisionUD(sameGapSideC, multiplicity) == false) { + return; + } + // LOGF(debug, "Filling sameGapSideC events"); + fillCorrelationsUD(sameGapSideC, reconstructedTracks, reconstructedTracks, multiplicity, reconstructedCollision.posZ()); break; default: return; @@ -542,37 +597,45 @@ struct upcPhotonuclearAnalysisJMG { void processMixed(FullSGUDCollision::iterator const& reconstructedCollision) { - int sgSide = reconstructedCollision.gapSide(); + (void)reconstructedCollision; + // int sgSide = reconstructedCollision.gapSide(); // int sgSide = 0; - for (auto& [collision1, tracks1, collision2, tracks2] : pairs) { + for (const auto& [collision1, tracks1, collision2, tracks2] : pairs) { if (collision1.size() == 0 || collision2.size() == 0) { - LOGF(info, "One or both collisions are empty."); + // LOGF(debug, "One or both collisions are empty."); continue; } - float multiplicity = tracks1.size(); - LOGF(info, "Filling mixed events"); - switch (sgSide) { - case 0: // gap for side A - if (isCollisionCutSG(reconstructedCollision, 0) == false) { - return; - } - if (fillCollisionUD(mixed, multiplicity) == false) { - return; - } - // LOGF(info, ">>> Bin of collision: ", bindingOnVtx.getBin({collision1.posZ()})); - // histos.fill(HIST("eventcount"), bindingOnVtx.getBin({collision1.posZ(), collision1.totalFT0AmplitudeC()})); - histos.fill(HIST("eventcount"), bindingOnVtx.getBin({collision1.posZ()})); - fillCorrelationsUD(mixed, tracks1, tracks2, multiplicity, collision1.posZ()); - break; - case 1: // gap for side C - // if (isCollisionCutSG(reconstructedCollision, 1) == false) { - // return; - // } - break; - default: + + float multiplicity = 0; + if (collision1.gapSide() == 0 && collision2.gapSide() == 0) { // gap on side A + if (isCollisionCutSG(collision1, 0) == false && isCollisionCutSG(collision2, 0) == false) { + continue; + } + // LOGF(debug, "In the pairs loop, gap side A"); + multiplicity = tracks1.size(); + if (fillCollisionUD(mixedGapSideA, multiplicity) == false) { return; - break; + } + // histos.fill(HIST("eventcount"), bindingOnVtx.getBin({collision1.posZ()})); + histos.fill(HIST("eventcount"), bindingOnVtx.getBin({collision1.posZ(), collision1.gapSide()})); + fillCorrelationsUD(mixedGapSideA, tracks1, tracks2, multiplicity, collision1.posZ()); + // LOGF(debug, "Filling mixedGapSideA events, Gap for side A"); + } + + if (collision1.gapSide() == 1 && collision2.gapSide() == 1) { // gap on side C + if (isCollisionCutSG(collision1, 1) == false && isCollisionCutSG(collision2, 1) == false) { + continue; + } + // LOGF(debug, "In the pairs loop, gap side C"); + multiplicity = tracks1.size(); + if (fillCollisionUD(mixedGapSideC, multiplicity) == false) { + return; + } + fillCorrelationsUD(mixedGapSideC, tracks1, tracks2, multiplicity, collision1.posZ()); + // LOGF(debug, "Filling mixedGapSideC events, Gap for side C"); + } else { + continue; } } } From f3cfe9b98463cb5d5962986dd6f27dc0ba452258 Mon Sep 17 00:00:00 2001 From: JStaa <39123272+JStaa@users.noreply.github.com> Date: Thu, 5 Jun 2025 15:30:41 +0200 Subject: [PATCH 1523/1650] [PWGCF] Made a change to the RD method cuts (#11471) Co-authored-by: ALICE Action Bot --- .../Tasks/threeParticleCorrelations.cxx | 92 ++++++++++++++----- 1 file changed, 69 insertions(+), 23 deletions(-) diff --git a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx index d133b83f559..2d35169f9e8 100644 --- a/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx +++ b/PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx @@ -49,7 +49,8 @@ struct ThreeParticleCorrelations { float pionPtMin = 0.3, pionPtMax = 2.3, kaonPtMin = 0.5, kaonPtMax = 2.5, protonPtMin = 0.5, protonPtMax = 2.5; float pionPtMid = 1.5, kaonPtMid1 = 1.5, kaonPtMid2 = 2.0, protonPtMid = 0.7; - float dEtaMin = 0.05, dPhiStarMin = 0.11; + float dEtaMax = 0.05, dEtaMin = 0.022; + float dPhiStarMinOS = 0.075, dPhiStarMinSS = 0.12; float rMin = 0.8, rMax = 2.5; // Lambda invariant mass fit @@ -91,7 +92,7 @@ struct ThreeParticleCorrelations { // Table aliases - MC Rec using MCRecCollisions = soa::Join; using MyFilteredMCRecCollisions = soa::Filtered; - using MyFilteredMCV0s = soa::Filtered>; + using MyMCV0s = soa::Join; using MyFilteredMCTracks = soa::Filtered>; @@ -205,6 +206,10 @@ struct ThreeParticleCorrelations { rPhiStarRegistry.add("hSEProtonPostCut_SS", "hSEProtonPostCut_SS", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); rPhiStarRegistry.add("hSEProtonPostCut_SSP", "hSEProtonPostCut_SSP", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); rPhiStarRegistry.add("hSEProtonPostCut_SSN", "hSEProtonPostCut_SSN", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); + rPhiStarRegistry.add("hSEPhiStarMean_OS", "hSEPhiStarMean_OS", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); + rPhiStarRegistry.add("hSEPhiStarMean_SS", "hSEPhiStarMean_SS", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); + rPhiStarRegistry.add("hSEPhiStarMean_SSP", "hSEPhiStarMean_SSP", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); + rPhiStarRegistry.add("hSEPhiStarMean_SSN", "hSEPhiStarMean_SSN", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); rPhiStarRegistry.add("hMEProtonPreCut_OS", "hMEProtonPreCut_OS", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); rPhiStarRegistry.add("hMEProtonPreCut_SS", "hMEProtonPreCut_SS", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); @@ -214,6 +219,10 @@ struct ThreeParticleCorrelations { rPhiStarRegistry.add("hMEProtonPostCut_SS", "hMEProtonPostCut_SS", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); rPhiStarRegistry.add("hMEProtonPostCut_SSP", "hMEProtonPostCut_SSP", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); rPhiStarRegistry.add("hMEProtonPostCut_SSN", "hMEProtonPostCut_SSN", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); + rPhiStarRegistry.add("hMEPhiStarMean_OS", "hMEPhiStarMean_OS", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); + rPhiStarRegistry.add("hMEPhiStarMean_SS", "hMEPhiStarMean_SS", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); + rPhiStarRegistry.add("hMEPhiStarMean_SSP", "hMEPhiStarMean_SSP", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); + rPhiStarRegistry.add("hMEPhiStarMean_SSN", "hMEPhiStarMean_SSN", {HistType::kTH2D, {{121, -0.3025, 0.3025}, {101, -0.0505, 0.0505}}}); // Efficiency rMCRegistry.add("hGenerated", "hGenerated", {HistType::kTH3D, {{trackPtAxis}, {trackEtaAxis}, {centralityAxis}}}); @@ -658,7 +667,7 @@ struct ThreeParticleCorrelations { // End of the Monte-Carlo generated QA } - void processMCRec(MyFilteredMCRecCollisions::iterator const& collision, MyFilteredMCV0s const& v0s, MyFilteredMCTracks const& tracks, aod::McCollisions const&, aod::McParticles const&) + void processMCRec(MyFilteredMCRecCollisions::iterator const& collision, MyMCV0s const& v0s, MyFilteredMCTracks const& tracks, aod::McCollisions const&, aod::McParticles const&) { if (!acceptEvent(collision, false) || !collision.has_mcCollision()) { @@ -749,7 +758,7 @@ struct ThreeParticleCorrelations { for (const auto& v0 : v0s) { - if (!v0.has_mcParticle()) { + if (!v0.has_mcParticle() || v0.pt() < v0PtMin || v0.pt() > v0PtMax || std::abs(v0.eta()) > v0EtaMax) { continue; } auto particle = v0.mcParticle(); @@ -881,36 +890,38 @@ struct ThreeParticleCorrelations { template bool acceptEvent(const CollCand& collision, bool FillHist) // Event filter { + if (FillHist) { rQARegistry.fill(HIST("hNEvents"), 0.5); } if (!collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { // kNoSameBunchPileup - return false; + return kFALSE; } if (FillHist) { rQARegistry.fill(HIST("hNEvents"), 1.5); } if (!collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { // kIsGoodZvtxFT0vsPV - return false; + return kFALSE; } if (FillHist) { rQARegistry.fill(HIST("hNEvents"), 2.5); } - return true; + return kTRUE; } template bool v0Filters(const V0Cand& v0, bool MCRec) // V0 filter { - if (!MCRec) { // Data - if (v0.pt() < v0PtMin || v0.pt() > v0PtMax) - return false; - if (std::abs(v0.eta()) > v0EtaMax) - return false; + if (v0.pt() < v0PtMin || v0.pt() > v0PtMax) + return kFALSE; + if (std::abs(v0.eta()) > v0EtaMax) + return kFALSE; + + if (!MCRec) { // Data if (v0Sign(v0) == 1) { const auto& posDaughter = v0.template posTrack_as(); if (std::abs(posDaughter.tpcNSigmaPr()) > nSigma4) { @@ -923,11 +934,6 @@ struct ThreeParticleCorrelations { } } } else { // MC Reconstructed - if (v0.pt() < v0PtMin || v0.pt() > v0PtMax) - return false; - if (std::abs(v0.eta()) > v0EtaMax) - return false; - if (v0Sign(v0) == 1) { const auto& posDaughter = v0.template posTrack_as(); if (std::abs(posDaughter.tpcNSigmaPr()) > nSigma4) { @@ -1075,6 +1081,7 @@ struct ThreeParticleCorrelations { bool radialDistanceFilter(const V0Cand& v0, const TrackCand& track, double B, bool Mix) { + bool pass = true; if (confRDSwitch) { auto proton = v0.template posTrack_as(); @@ -1083,8 +1090,8 @@ struct ThreeParticleCorrelations { } double dEta = proton.eta() - track.eta(); - if (std::abs(dEta) > dEtaMin) { - return kTRUE; + if (std::abs(dEta) > dEtaMax) { + return pass; } double dPhiStar; @@ -1092,6 +1099,9 @@ struct ThreeParticleCorrelations { double phaseProton = (-0.3 * B * proton.sign()) / (2 * proton.pt()); double phaseTrack = (-0.3 * B * track.sign()) / (2 * track.pt()); + double dPhiStarMean = 0; + + // Start of the TPC radius loop for (double r = rMin; r <= rMax; r += 0.01) { dPhiStar = RecoDecay::constrainAngle(dPhi + std::asin(phaseProton * r) - std::asin(phaseTrack * r), -constants::math::PIHalf); @@ -1122,11 +1132,19 @@ struct ThreeParticleCorrelations { } } - if (std::abs(dPhiStar) < dPhiStarMin) { - return kFALSE; + if (std::abs(dEta) < dEtaMin) { + if (proton.sign() * track.sign() == -1) { // OS (Electric charge) + if (std::abs(dPhiStar) < dPhiStarMinOS) { + pass = false; + } + } else if (proton.sign() * track.sign() == 1) { // SS (Electric charge) + if (std::abs(dPhiStar) < dPhiStarMinSS) { + pass = false; + } + } } - if (r == rMin) { + if (r == rMin && pass) { if (!Mix) { // Same-event if (proton.sign() * track.sign() == -1) { // OS (Electric charge) rPhiStarRegistry.fill(HIST("hSEProtonPostCut_OS"), dPhiStar, dEta); @@ -1152,10 +1170,38 @@ struct ThreeParticleCorrelations { } } } + + dPhiStarMean += (dPhiStar / 170); + } + // End of the TPC radius loop + + if (!Mix) { // Same-event + if (proton.sign() * track.sign() == -1) { // OS (Electric charge) + rPhiStarRegistry.fill(HIST("hSEPhiStarMean_OS"), dPhiStarMean, dEta); + } else if (proton.sign() * track.sign() == 1) { // SS (Electric charge) + rPhiStarRegistry.fill(HIST("hSEPhiStarMean_SS"), dPhiStarMean, dEta); + if (proton.sign() == 1) { // Positive + rPhiStarRegistry.fill(HIST("hSEPhiStarMean_SSP"), dPhiStarMean, dEta); + } else if (proton.sign() == -1) { // Negative + rPhiStarRegistry.fill(HIST("hSEPhiStarMean_SSN"), dPhiStarMean, dEta); + } + } + + } else { // Mixed-event + if (proton.sign() * track.sign() == -1) { // OS (Electric charge) + rPhiStarRegistry.fill(HIST("hMEPhiStarMean_OS"), dPhiStarMean, dEta); + } else if (proton.sign() * track.sign() == 1) { // SS (Electric charge) + rPhiStarRegistry.fill(HIST("hMEPhiStarMean_SS"), dPhiStarMean, dEta); + if (proton.sign() == 1) { // Positive + rPhiStarRegistry.fill(HIST("hMEPhiStarMean_SSP"), dPhiStarMean, dEta); + } else if (proton.sign() == -1) { // Negative + rPhiStarRegistry.fill(HIST("hMEPhiStarMean_SSN"), dPhiStarMean, dEta); + } + } } } - return kTRUE; + return pass; } }; From 616c4273b372a12f255c7bdd52f9b3c9feccc516 Mon Sep 17 00:00:00 2001 From: Kangkan Goswami Date: Thu, 5 Jun 2025 19:21:27 +0530 Subject: [PATCH 1524/1650] [PWGDQ] Update VarManager.h to correct the cos theta definition in PP frame (#11451) Co-authored-by: ALICE Action Bot --- PWGDQ/Core/VarManager.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 65dded71cf5..3c1437cb5cb 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -2917,7 +2917,7 @@ void VarManager::FillPair(T1 const& t1, T2 const& t2, float* values) ROOT::Math::XYZVector yaxis_PP{(v12.Vect()).Unit()}; ROOT::Math::XYZVector xaxis_PP{(yaxis_PP.Cross(zaxis_PP)).Unit()}; if (fgUsedVars[kCosThetaPP]) { - values[kCosThetaPP] = zaxis_PP.Dot(v_CM); + values[kCosThetaPP] = zaxis_PP.Dot(v_CM) / std::sqrt(zaxis_PP.Mag2()); } if (fgUsedVars[kPhiPP]) { values[kPhiPP] = TMath::ATan2(yaxis_PP.Dot(v_CM), xaxis_PP.Dot(v_CM)); From 1bd84e1b90c0e79a6e655445ebcd2ec6ed5c97d0 Mon Sep 17 00:00:00 2001 From: Kaare Endrup Iversen <69893472+kaareendrup@users.noreply.github.com> Date: Thu, 5 Jun 2025 22:31:41 +0200 Subject: [PATCH 1525/1650] [PWGDQ] Add loading of geometry to dilepton-track task (#11478) --- PWGDQ/Tasks/tableReader_withAssoc.cxx | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/PWGDQ/Tasks/tableReader_withAssoc.cxx b/PWGDQ/Tasks/tableReader_withAssoc.cxx index a58b23fac02..c17a0b3d24c 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.cxx +++ b/PWGDQ/Tasks/tableReader_withAssoc.cxx @@ -2903,6 +2903,10 @@ struct AnalysisDileptonTrack { Configurable fConfigGRPmagPath{"cfgGrpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; Configurable fConfigMagField{"cfgMagField", 5.0f, "Manually set magnetic field"}; + Configurable fConfigCcdbUrl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable fConfigNoLaterThan{"ccdb-no-later-than", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; + Configurable fConfigGeoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; + int fCurrentRun; // needed to detect if the run changed and trigger update of calibrations etc. int fNCuts; // number of dilepton leg cuts int fNLegCuts; @@ -3152,6 +3156,16 @@ struct AnalysisDileptonTrack { VarManager::SetUseVars(fHistMan->GetUsedVars()); fOutputList.setObject(fHistMan->GetMainHistogramList()); + + fCCDB->setURL(fConfigCcdbUrl.value); + fCCDB->setCaching(true); + fCCDB->setLocalObjectValidityChecking(); + fCCDB->setCreatedNotAfter(fConfigNoLaterThan.value); + if (!o2::base::GeometryManager::isGeometryLoaded()) { + LOG(info) << "Loading geometry from CCDB in dilepton-track task"; + fCCDB->get(fConfigGeoPath); + } + LOG(info) << "Initialization of AnalysisDileptonTrack finished (idstoreh)"; } From 7c0d3cc2b75e3c29ca8feec824a9c6a409163700 Mon Sep 17 00:00:00 2001 From: suyoupeng <109774812+15071832337@users.noreply.github.com> Date: Fri, 6 Jun 2025 05:19:42 +0800 Subject: [PATCH 1526/1650] [PWGLF] Lambda local polarization induced by jet in pp collision 13.6 TeV (#11477) --- .../Strangeness/lambdaJetpolarization.cxx | 158 +++++++++++++++++- 1 file changed, 154 insertions(+), 4 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx b/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx index 6fa6c332398..3acfbad4d10 100644 --- a/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx +++ b/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx @@ -54,6 +54,7 @@ struct LfMyV0s { HistogramRegistry registry{"registry"}; HistogramRegistry registryData{"registryData", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry registryV0Data{"registryV0Data", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry registryLongitudinalPolarization{"registryLongitudinalPolarization", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; Configurable zVtx{"zVtx", 10.0, "Maximum zVertex"}; Configurable rJet{"rJet", 0.4, "Jet resolution parameter R"}; @@ -94,13 +95,13 @@ struct LfMyV0s { Configurable ispassdTrackSelectionForJetReconstruction{"ispassdTrackSelectionForJetReconstruction", 1, "do track selection"}; // v0Event selection - Configurable sel8{"sel8", 0, "Apply sel8 event selection"}; + Configurable sel8{"sel8", 1, "Apply sel8 event selection"}; Configurable isTriggerTVX{"isTriggerTVX", 1, "TVX trigger"}; Configurable iscutzvertex{"iscutzvertex", 1, "Accepted z-vertex range (cm)"}; Configurable isNoTimeFrameBorder{"isNoTimeFrameBorder", 1, "TF border cut"}; Configurable isNoITSROFrameBorder{"isNoITSROFrameBorder", 1, "ITS ROF border cut"}; Configurable isVertexTOFmatched{"isVertexTOFmatched", 1, "Is Vertex TOF matched"}; - Configurable isGoodZvtxFT0vsPV{"isGoodZvtxFT0vsPV", 0, "isGoodZvtxFT0vsPV"}; + Configurable isGoodZvtxFT0vsPV{"isGoodZvtxFT0vsPV", 1, "isGoodZvtxFT0vsPV"}; Configurable cutzvertex{"cutzvertex", 10.0f, "Accepted z-vertex range (cm)"}; Configurable CtauLambda{"ctauLambda", 30, "C tau Lambda (cm)"}; Configurable requirepassedSingleTrackSelection{"requirepassedSingleTrackSelection", false, "requirepassedSingleTrackSelection"}; @@ -111,10 +112,11 @@ struct LfMyV0s { Configurable yMax{"V0yMax", +0.5f, "maximum y"}; Configurable v0rejLambda{"v0rejLambda", 0.01, "V0 rej Lambda"}; Configurable v0accLambda{"v0accLambda", 0.075, "V0 acc Lambda"}; - Configurable ifinitpasslambda{"ifinitpasslambda", 1, "ifinitpasslambda"}; - Configurable ifpasslambda{"passedLambdaSelection", 0, "passedLambdaSelection"}; + Configurable ifinitpasslambda{"ifinitpasslambda", 0, "ifinitpasslambda"}; + Configurable ifpasslambda{"passedLambdaSelection", 1, "passedLambdaSelection"}; Configurable paramArmenterosCut{"paramArmenterosCut", 0.2, "parameter Armenteros Cut"}; Configurable doArmenterosCut{"doArmenterosCut", 0, "do Armenteros Cut"}; + Configurable noSameBunchPileUp{"noSameBunchPileUp", true, "reject SameBunchPileUp"}; // Jet background subtraction JetBkgSubUtils backgroundSub; @@ -312,6 +314,40 @@ struct LfMyV0s { registryV0Data.add("AverageSinthetainJetV0", "AverageSinthetainJetV0", {HistType::kTProfile, {{200, 0.9, 1.2}}}); registryV0Data.add("AverageCosSquarethetainJetV0", "AverageCosSquarethetainJetV0", {HistType::kTProfile, {{200, 0.9, 1.2}}}); + + // LongitudinalPolarization event selection + registryLongitudinalPolarization.add("hNEvents", "hNEvents", {HistType::kTH1I, {{5, 0.f, 5.f}}}); + registryLongitudinalPolarization.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(1, "all"); + registryLongitudinalPolarization.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(2, "sel8"); + registryLongitudinalPolarization.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(3, "zvertex"); + registryLongitudinalPolarization.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(4, "isGoodZvtxFT0vsPV"); + registryLongitudinalPolarization.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(5, "isNoSameBunchPileup"); + registryLongitudinalPolarization.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(6, "Applied selected"); + + registryLongitudinalPolarization.add("hMassVsPtLambda", "hMassVsPtLambda", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {200, 1.016f, 1.216f}}}); + registryLongitudinalPolarization.add("hMassVsPtAntiLambda", "hMassVsPtAntiLambda", {HistType::kTH2F, {{100, 0.0f, 10.0f}, {200, 1.016f, 1.216f}}}); + + registryLongitudinalPolarization.add("V0pxInRest_frame", "V0pxInRest_frame", kTH1F, {axisPx}); + registryLongitudinalPolarization.add("V0pyInRest_frame", "V0pyInRest_frame", kTH1F, {axisPy}); + registryLongitudinalPolarization.add("V0pzInRest_frame", "V0pzInRest_frame", kTH1F, {axisPz}); + + registryLongitudinalPolarization.add("nV0sPerEvent", "nV0sPerEvent", kTH1F, {{10, 0.0, 10.0}}); + registryLongitudinalPolarization.add("nV0sPerEventsel", "nV0sPerEventsel", kTH1F, {{10, 0.0, 10.0}}); + + registryLongitudinalPolarization.add("hprotoncosthetainV0", "hprotoncosthetainV0", kTH1F, {{200, -1.f, 1.f}}); + registryLongitudinalPolarization.add("hprotoncosSquarethetainV0", "hprotoncosSquarethetainV0", kTH1F, {{200, -1.f, 1.f}}); + registryLongitudinalPolarization.add("hLambdamassandCosthetaInV0", "hLambdamassandCosthetaInV0", kTH2F, {{200, 0.9, 1.2}, {200, -1, 1}}); + registryLongitudinalPolarization.add("TProfile2DLambdaPtMassCostheta", "", kTProfile2D, {TProfile2DaxisMass, TProfile2DaxisPt}); + registryLongitudinalPolarization.add("TProfile2DLambdaPtMassCosSquareTheta", "", kTProfile2D, {TProfile2DaxisMass, TProfile2DaxisPt}); + + registryLongitudinalPolarization.add("hantiprotoncosthetainV0", "hantiprotoncosthetainV0", kTH1F, {{200, -1.f, 1.f}}); + registryLongitudinalPolarization.add("hantiprotoncosSquarethetainV0", "hantiprotoncosSquarethetainV0", kTH1F, {{200, -1.f, 1.f}}); + registryLongitudinalPolarization.add("hAntiLambdamassandCosthetaInV0", "hAntiLambdamassandCosthetaInV0", kTH2F, {{200, 0.9, 1.2}, {200, -1, 1}}); + registryLongitudinalPolarization.add("TProfile2DAntiLambdaPtMassCostheta", "TProfile2DAntiLambdaPtMassCostheta", kTProfile2D, {TProfile2DaxisMass, TProfile2DaxisPt}); + registryLongitudinalPolarization.add("TProfile2DAntiLambdaPtMassCosSquareTheta", "TProfile2DAntiLambdaPtMassCosSquareTheta", kTProfile2D, {TProfile2DaxisMass, TProfile2DaxisPt}); + + registryLongitudinalPolarization.add("TProfile1DLambdaPtMassCostheta", "Invariant Mass vs cos(#theta)", {HistType::kTProfile, {{200, 0.9, 1.2}}}); + registryLongitudinalPolarization.add("TProfile1DAntiLambdaPtMassCostheta", "Invariant Mass vs cos(#theta)", {HistType::kTProfile, {{200, 0.9, 1.2}}}); } double massPr = o2::constants::physics::MassProton; double massLambda = o2::constants::physics::MassLambda; @@ -814,6 +850,32 @@ struct LfMyV0s { return true; } + template + bool AcceptEventForLongitudinalPolarization(TCollision const& collision) + { + if (sel8 && !collision.sel8()) { + return false; + } + registryLongitudinalPolarization.fill(HIST("hNEvents"), 1.5); + + if (iscutzvertex && TMath::Abs(collision.posZ()) > cutzvertex) { + return false; + } + registryLongitudinalPolarization.fill(HIST("hNEvents"), 2.5); + + if (noSameBunchPileUp && !collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { + return false; + } + registryLongitudinalPolarization.fill(HIST("hNEvents"), 3.5); + // check vertex matching to FT0 + if (isGoodZvtxFT0vsPV && !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { + return false; + } + registryLongitudinalPolarization.fill(HIST("hNEvents"), 4.5); + + return true; + } + using SelCollisions = soa::Join; using StrHadronDaughterTracks = soa::Join; void processData(SelCollisions::iterator const& collision, aod::V0Datas const& fullV0s, StrHadronDaughterTracks const& tracks) @@ -1151,6 +1213,94 @@ struct LfMyV0s { registryV0Data.fill(HIST("nV0sPerEventsel"), V0NumbersPerEventsel); } PROCESS_SWITCH(LfMyV0s, processDataV0, "processDataV0", true); + + void processLongitudinalPolarization(SelCollisions::iterator const& collision, aod::V0Datas const& fullV0s, StrHadronDaughterTracks const&) + { + registryLongitudinalPolarization.fill(HIST("hNEvents"), 0.5); + if (!AcceptEventForLongitudinalPolarization(collision)) { + return; + } + registryLongitudinalPolarization.fill(HIST("hNEvents"), 5.5); + int V0NumbersPerEvent = 0; + int V0NumbersPerEventsel = 0; + for (const auto& v0 : fullV0s) { + V0NumbersPerEvent++; + float ctauLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0; + float ctauAntiLambda = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassLambda0Bar; + const auto& pos = v0.posTrack_as(); + const auto& neg = v0.negTrack_as(); + + if (passedLambdaSelection(v0, pos, neg) && ctauLambda < CtauLambda && ifpasslambda) { + V0NumbersPerEventsel++; + registryLongitudinalPolarization.fill(HIST("hMassVsPtLambda"), v0.pt(), v0.mLambda()); + double PLambda = sqrt(v0.px() * v0.px() + v0.py() * v0.py() + v0.pz() * v0.pz()); + double ELambda = sqrt(v0.mLambda() * v0.mLambda() + PLambda * PLambda); + double protonE = sqrt(massPr * massPr + pos.px() * pos.px() + pos.py() * pos.py() + pos.pz() * pos.pz()); + TMatrixD pLabV0(4, 1); + pLabV0(0, 0) = ELambda; + pLabV0(1, 0) = v0.px(); + pLabV0(2, 0) = v0.py(); + pLabV0(3, 0) = v0.pz(); + + TMatrixD pLabproton(4, 1); + pLabproton(0, 0) = protonE; + pLabproton(1, 0) = pos.px(); + pLabproton(2, 0) = pos.py(); + pLabproton(3, 0) = pos.pz(); + + TMatrixD V0InV0(4, 1); + V0InV0 = LorentzTransInV0frame(ELambda, v0.px(), v0.py(), v0.pz()) * pLabV0; + registryLongitudinalPolarization.fill(HIST("V0pxInRest_frame"), V0InV0(1, 0)); + registryLongitudinalPolarization.fill(HIST("V0pyInRest_frame"), V0InV0(2, 0)); + registryLongitudinalPolarization.fill(HIST("V0pzInRest_frame"), V0InV0(3, 0)); + + TMatrixD protonInV0(4, 1); + protonInV0 = LorentzTransInV0frame(ELambda, v0.px(), v0.py(), v0.pz()) * pLabproton; + double protonPInV0 = sqrt(protonInV0(1, 0) * protonInV0(1, 0) + protonInV0(2, 0) * protonInV0(2, 0) + protonInV0(3, 0) * protonInV0(3, 0)); + + double protonCosThetainV0 = protonInV0(3, 0) / protonPInV0; + + registryLongitudinalPolarization.fill(HIST("hprotoncosthetainV0"), protonCosThetainV0); + registryLongitudinalPolarization.fill(HIST("hprotoncosSquarethetainV0"), protonCosThetainV0 * protonCosThetainV0); + registryLongitudinalPolarization.fill(HIST("hLambdamassandCosthetaInV0"), v0.mLambda(), protonCosThetainV0); + + registryLongitudinalPolarization.fill(HIST("TProfile2DLambdaPtMassCostheta"), v0.mLambda(), v0.pt(), protonCosThetainV0); + registryLongitudinalPolarization.fill(HIST("TProfile2DLambdaPtMassCosSquareTheta"), v0.mLambda(), v0.pt(), protonCosThetainV0 * protonCosThetainV0); + + registryLongitudinalPolarization.fill(HIST("TProfile1DLambdaPtMassCostheta"), v0.mLambda(), protonCosThetainV0); + } + if (passedAntiLambdaSelection(v0, pos, neg) && ctauAntiLambda < CtauLambda && ifpasslambda) { + registryLongitudinalPolarization.fill(HIST("hMassVsPtAntiLambda"), v0.pt(), v0.mAntiLambda()); + + double PLambda = sqrt(v0.px() * v0.px() + v0.py() * v0.py() + v0.pz() * v0.pz()); + double ELambda = sqrt(v0.mAntiLambda() * v0.mAntiLambda() + PLambda * PLambda); + double protonE = sqrt(massPr * massPr + neg.px() * neg.px() + neg.py() * neg.py() + neg.pz() * neg.pz()); + + TMatrixD pLabproton(4, 1); + pLabproton(0, 0) = protonE; + pLabproton(1, 0) = neg.px(); + pLabproton(2, 0) = neg.py(); + pLabproton(3, 0) = neg.pz(); + + TMatrixD protonInV0(4, 1); + protonInV0 = LorentzTransInV0frame(ELambda, v0.px(), v0.py(), v0.pz()) * pLabproton; + double protonPInV0 = sqrt(protonInV0(1, 0) * protonInV0(1, 0) + protonInV0(2, 0) * protonInV0(2, 0) + protonInV0(3, 0) * protonInV0(3, 0)); + + double protonCosThetainV0 = protonInV0(3, 0) / protonPInV0; + + registryLongitudinalPolarization.fill(HIST("hantiprotoncosthetainV0"), protonCosThetainV0); + registryLongitudinalPolarization.fill(HIST("hantiprotoncosSquarethetainV0"), protonCosThetainV0 * protonCosThetainV0); + registryLongitudinalPolarization.fill(HIST("hAntiLambdamassandCosthetaInV0"), v0.mAntiLambda(), protonCosThetainV0); + + registryLongitudinalPolarization.fill(HIST("TProfile2DAntiLambdaPtMassCostheta"), v0.mAntiLambda(), v0.pt(), protonCosThetainV0); + registryLongitudinalPolarization.fill(HIST("TProfile2DAntiLambdaPtMassCosSquareTheta"), v0.mAntiLambda(), v0.pt(), protonCosThetainV0 * protonCosThetainV0); + registryLongitudinalPolarization.fill(HIST("TProfile1DAntiLambdaPtMassCostheta"), v0.mAntiLambda(), protonCosThetainV0); + } + } + registryLongitudinalPolarization.fill(HIST("nV0sPerEvent"), V0NumbersPerEvent); + registryLongitudinalPolarization.fill(HIST("nV0sPerEventsel"), V0NumbersPerEventsel); + } + PROCESS_SWITCH(LfMyV0s, processLongitudinalPolarization, "processLongitudinalPolarization", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From a8b92b174d80b67170de4ae6578da92664b41119 Mon Sep 17 00:00:00 2001 From: Thorkj <154221526+Thorkj@users.noreply.github.com> Date: Fri, 6 Jun 2025 00:01:25 +0200 Subject: [PATCH 1527/1650] [PWGCF] minor change in regard to MFT selection (#11479) Co-authored-by: ALICE Action Bot --- PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx b/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx index 09e74854914..489c99bdbff 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/corrSparse.cxx @@ -11,7 +11,7 @@ /// \file corrSparse.cxx /// \brief Provides a sparse with usefull two particle correlation info -/// \author Thor Jensen (thor.kjaersgaard.jensen@cern.ch) and Debojit Sarkar (debojit.sarkar@cern.ch) +/// \author Thor Jensen (thor.kjaersgaard.jensen@cern.ch) #include #include "TRandom3.h" @@ -253,15 +253,15 @@ struct CorrSparse { for (auto const& track2 : tracks2) { - if (track1.pt() <= track2.pt()) - continue; // skip if the trigger pt is less than the associate pt - if (processMFT) { if constexpr (std::is_same_v) { if (!isAcceptedMftTrack(track2)) { continue; } } + } else { + if (track1.pt() <= track2.pt()) + continue; // skip if the trigger pt is less than the associate pt } float deltaPhi = RecoDecay::constrainAngle(track1.phi() - track2.phi(), -PIHalf); From 45fbcff8620a7d9fff30c360e53baed841ac7579 Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Fri, 6 Jun 2025 07:31:00 +0800 Subject: [PATCH 1528/1650] [PWGCF] add MC process (#11482) --- PWGCF/Flow/Tasks/flowTask.cxx | 143 ++++++++--- .../Tasks/diHadronCor.cxx | 222 ++++++++++++++---- 2 files changed, 289 insertions(+), 76 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowTask.cxx b/PWGCF/Flow/Tasks/flowTask.cxx index 91c7402cf90..5431a84bd47 100644 --- a/PWGCF/Flow/Tasks/flowTask.cxx +++ b/PWGCF/Flow/Tasks/flowTask.cxx @@ -113,6 +113,16 @@ struct FlowTask { Filter collisionFilter = (nabs(aod::collision::posZ) < cfgCutVertex) && (aod::cent::centFT0C > cfgCentFT0CMin) && (aod::cent::centFT0C < cfgCentFT0CMax); Filter trackFilter = ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls) && (nabs(aod::track::dcaZ) < cfgCutDCAz); + using FilteredCollisions = soa::Filtered>; + using FilteredTracks = soa::Filtered>; + // Filter for MCcollisions + Filter mccollisionFilter = nabs(aod::mccollision::posZ) < cfgCutVertex; + using FilteredMcCollisions = soa::Filtered; + // Filter for MCParticle + Filter particleFilter = (nabs(aod::mcparticle::eta) < cfgCutEta) && (aod::mcparticle::pt > cfgCutPtMin) && (aod::mcparticle::pt < cfgCutPtMax); + using FilteredMcParticles = soa::Filtered; + + using FilteredSmallGroupMcCollisions = soa::SmallGroups>; // Corrections TH1D* mEfficiency = nullptr; @@ -127,6 +137,7 @@ struct FlowTask { // Define output OutputObj fFC{FlowContainer("FlowContainer")}; + OutputObj fFCgen{FlowContainer("FlowContainer_gen")}; OutputObj fWeights{GFWWeights("weights")}; HistogramRegistry registry{"registry"}; @@ -143,6 +154,10 @@ struct FlowTask { // Count the total number of enum kCount_CentEstimators }; + enum DataType { + kReco, + kGen + }; int mRunNumber{-1}; uint64_t mSOR{0}; double mMinSeconds{-1.}; @@ -157,9 +172,6 @@ struct FlowTask { TF1* funcV3; TF1* funcV4; - using AodCollisions = soa::Filtered>; - using AodTracks = soa::Filtered>; - // Track selection TrackSelection myTrackSel; TF1* fPhiCutLow = nullptr; @@ -222,6 +234,11 @@ struct FlowTask { registry.add("hMult", "Multiplicity distribution", {HistType::kTH1D, {{3000, 0.5, 3000.5}}}); std::string hCentTitle = "Centrality distribution, Estimator " + std::to_string(cfgCentEstimator); registry.add("hCent", hCentTitle.c_str(), {HistType::kTH1D, {{90, 0, 90}}}); + if (doprocessMCGen) { + registry.add("MCGen/MChVtxZ", "Vexter Z distribution", {HistType::kTH1D, {axisVertex}}); + registry.add("MCGen/MChMult", "Multiplicity distribution", {HistType::kTH1D, {{3000, 0.5, 3000.5}}}); + registry.add("MCGen/MChCent", hCentTitle.c_str(), {HistType::kTH1D, {{90, 0, 90}}}); + } if (!cfgUseSmallMemory) { registry.add("BeforeSel8_globalTracks_centT0C", "before sel8;Centrality T0C;mulplicity global tracks", {HistType::kTH2D, {axisCentForQA, axisNch}}); registry.add("BeforeCut_globalTracks_centT0C", "before cut;Centrality T0C;mulplicity global tracks", {HistType::kTH2D, {axisCentForQA, axisNch}}); @@ -256,6 +273,11 @@ struct FlowTask { registry.add("hDCAz", "DCAz after cuts; DCAz (cm); Pt", {HistType::kTH2D, {{200, -0.5, 0.5}, {200, 0, 5}}}); registry.add("hDCAxy", "DCAxy after cuts; DCAxy (cm); Pt", {HistType::kTH2D, {{200, -0.5, 0.5}, {200, 0, 5}}}); registry.add("hTrackCorrection2d", "Correlation table for number of tracks table; uncorrected track; corrected track", {HistType::kTH2D, {axisNch, axisNch}}); + if (doprocessMCGen) { + registry.add("MCGen/MChPhi", "#phi distribution", {HistType::kTH1D, {axisPhi}}); + registry.add("MCGen/MChEta", "#eta distribution", {HistType::kTH1D, {axisEta}}); + registry.add("MCGen/MChPtRef", "p_{T} distribution after cut", {HistType::kTH1D, {axisPtHist}}); + } o2::framework::AxisSpec axis = axisPt; int nPtBins = axis.binEdges.size() - 1; @@ -327,6 +349,11 @@ struct FlowTask { fFC->SetName("FlowContainer"); fFC->SetXAxis(fPtAxis); fFC->Initialize(oba, axisIndependent, cfgNbootstrap); + if (doprocessMCGen) { + fFCgen->SetName("FlowContainer_gen"); + fFCgen->SetXAxis(fPtAxis); + fFCgen->Initialize(oba, axisIndependent, cfgNbootstrap); + } delete oba; // eta region @@ -471,6 +498,7 @@ struct FlowTask { return; } + template void fillFC(const GFW::CorrConfig& corrconf, const double& cent, const double& rndm) { double dnx, val; @@ -479,8 +507,9 @@ struct FlowTask { if (dnx == 0) return; val = fGFW->Calculate(corrconf, 0, kFALSE).real() / dnx; - if (std::fabs(val) < 1) - fFC->FillProfile(corrconf.Head.c_str(), cent, val, dnx, rndm); + if (std::fabs(val) < 1) { + (dt == kGen) ? fFCgen->FillProfile(corrconf.Head.c_str(), cent, val, dnx, rndm) : fFC->FillProfile(corrconf.Head.c_str(), cent, val, dnx, rndm); + } return; } for (auto i = 1; i <= fPtAxis->GetNbins(); i++) { @@ -488,8 +517,9 @@ struct FlowTask { if (dnx == 0) continue; val = fGFW->Calculate(corrconf, i - 1, kFALSE).real() / dnx; - if (std::fabs(val) < 1) - fFC->FillProfile(Form("%s_pt_%i", corrconf.Head.c_str(), i), cent, val, dnx, rndm); + if (std::fabs(val) < 1) { + (dt == kGen) ? fFCgen->FillProfile(Form("%s_pt_%i", corrconf.Head.c_str(), i), cent, val, dnx, rndm) : fFC->FillProfile(Form("%s_pt_%i", corrconf.Head.c_str(), i), cent, val, dnx, rndm); + } } return; } @@ -610,7 +640,8 @@ struct FlowTask { registry.fill(HIST("hEventCountSpecific"), 8.5); // V0A T0A 5 sigma cut - if (cfgEvSelV0AT0ACut && (std::fabs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > 5 * fT0AV0ASigma->Eval(collision.multFT0A()))) + float sigma = 5.0; + if (cfgEvSelV0AT0ACut && (std::fabs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > sigma * fT0AV0ASigma->Eval(collision.multFT0A()))) return 0; if (cfgEvSelV0AT0ACut) registry.fill(HIST("hEventCountSpecific"), 9.5); @@ -641,7 +672,8 @@ struct FlowTask { registry.fill(HIST("hEventCountTentative"), 7.5); if (!((multNTracksPV < fMultPVCutLow->Eval(centrality)) || (multNTracksPV > fMultPVCutHigh->Eval(centrality)) || (multTrk < fMultCutLow->Eval(centrality)) || (multTrk > fMultCutHigh->Eval(centrality)))) registry.fill(HIST("hEventCountTentative"), 8.5); - if (!(std::fabs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > 5 * fT0AV0ASigma->Eval(collision.multFT0A()))) + float sigma = 5.0; + if (!(std::fabs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > sigma * fT0AV0ASigma->Eval(collision.multFT0A()))) registry.fill(HIST("hEventCountTentative"), 9.5); } @@ -675,7 +707,30 @@ struct FlowTask { gCurrentHadronicRate = gHadronicRate[mRunNumber]; } - void process(AodCollisions::iterator const& collision, aod::BCsWithTimestamps const&, AodTracks const& tracks) + template + float getCentrality(TCollision const& collision) + { + float cent; + switch (cfgCentEstimator) { + case kCentFT0C: + cent = collision.centFT0C(); + break; + case kCentFT0CVariant1: + cent = collision.centFT0CVariant1(); + break; + case kCentFT0M: + cent = collision.centFT0M(); + break; + case kCentFV0A: + cent = collision.centFV0A(); + break; + default: + cent = collision.centFT0C(); + } + return cent; + } + + void process(FilteredCollisions::iterator const& collision, aod::BCsWithTimestamps const&, FilteredTracks const& tracks) { registry.fill(HIST("hEventCount"), 0.5); if (!cfgUseSmallMemory && tracks.size() >= 1) { @@ -703,23 +758,8 @@ struct FlowTask { registry.fill(HIST("BeforeCut_multV0A_multT0A"), collision.multFT0A(), collision.multFV0A()); registry.fill(HIST("BeforeCut_multT0C_centT0C"), collision.centFT0C(), collision.multFT0C()); } - float cent; - switch (cfgCentEstimator) { - case kCentFT0C: - cent = collision.centFT0C(); - break; - case kCentFT0CVariant1: - cent = collision.centFT0CVariant1(); - break; - case kCentFT0M: - cent = collision.centFT0M(); - break; - case kCentFV0A: - cent = collision.centFV0A(); - break; - default: - cent = collision.centFT0C(); - } + float cent = getCentrality(collision); + if (cfgUseTentativeEventCounter) eventCounterQA(collision, tracks.size(), cent); if (cfgUseAdditionalEventCut && !eventSelected(collision, tracks.size(), cent)) @@ -844,9 +884,56 @@ struct FlowTask { // Filling Flow Container for (uint l_ind = 0; l_ind < corrconfigs.size(); l_ind++) { - fillFC(corrconfigs.at(l_ind), independent, lRandom); + fillFC(corrconfigs.at(l_ind), independent, lRandom); + } + } + + void processMCGen(FilteredMcCollisions::iterator const& mcCollision, FilteredSmallGroupMcCollisions const& collisions, FilteredMcParticles const& mcParticles) + { + if (collisions.size() != 1) + return; + + float cent = -1.; + for (const auto& collision : collisions) { + cent = getCentrality(collision); + } + + float lRandom = fRndm->Rndm(); + float vtxz = mcCollision.posZ(); + registry.fill(HIST("MCGen/MChVtxZ"), vtxz); + registry.fill(HIST("MCGen/MChMult"), mcParticles.size()); + registry.fill(HIST("MCGen/MChCent"), cent); + float independent = cent; + if (cfgUseNch) + independent = static_cast(mcParticles.size()); + + fGFW->Clear(); + + for (const auto& mcParticle : mcParticles) { + if (!mcParticle.isPhysicalPrimary()) + continue; + bool withinPtPOI = (cfgCutPtPOIMin < mcParticle.pt()) && (mcParticle.pt() < cfgCutPtPOIMax); // within POI pT range + bool withinPtRef = (cfgCutPtRefMin < mcParticle.pt()) && (mcParticle.pt() < cfgCutPtRefMax); // within RF pT range + + if (withinPtRef) { + registry.fill(HIST("MCGen/MChPhi"), mcParticle.phi()); + registry.fill(HIST("MCGen/MChEta"), mcParticle.eta()); + registry.fill(HIST("MCGen/MChPtRef"), mcParticle.pt()); + } + if (withinPtRef) + fGFW->Fill(mcParticle.eta(), fPtAxis->FindBin(mcParticle.pt()) - 1, mcParticle.phi(), 1., 1); + if (withinPtPOI) + fGFW->Fill(mcParticle.eta(), fPtAxis->FindBin(mcParticle.pt()) - 1, mcParticle.phi(), 1., 2); + if (withinPtPOI && withinPtRef) + fGFW->Fill(mcParticle.eta(), fPtAxis->FindBin(mcParticle.pt()) - 1, mcParticle.phi(), 1., 4); + } + + // Filling Flow Container + for (uint l_ind = 0; l_ind < corrconfigs.size(); l_ind++) { + fillFC(corrconfigs.at(l_ind), independent, lRandom); } } + PROCESS_SWITCH(FlowTask, processMCGen, "Process analysis for MC generated events", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx b/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx index e11c8ace7c2..f799a8d7564 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx @@ -50,16 +50,6 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; -namespace o2::aod -{ -namespace di_hadron_cor -{ -DECLARE_SOA_COLUMN(Multiplicity, multiplicity, int); -} -DECLARE_SOA_TABLE(Multiplicity, "AOD", "MULTIPLICITY", - di_hadron_cor::Multiplicity); - -} // namespace o2::aod // define the filtered collisions and tracks #define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable NAME{#NAME, DEFAULT, HELP}; @@ -106,18 +96,17 @@ struct DiHadronCor { O2_DEFINE_CONFIGURABLE(cfgVerbosity, bool, false, "Verbose output") SliceCache cache; - SliceCache cacheNch; ConfigurableAxis axisVertex{"axisVertex", {10, -10, 10}, "vertex axis for histograms"}; - ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100}, "multiplicity axis for histograms"}; - ConfigurableAxis axisCentrality{"axisCentrality", {VARIABLE_WIDTH, 0, 10, 20, 30, 40, 50, 60, 70, 80, 90}, "centrality axis for histograms"}; + ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100, 120, 140, 160, 180, 200, 220, 240, 260, 280, 300}, "multiplicity axis for histograms"}; + ConfigurableAxis axisCentrality{"axisCentrality", {VARIABLE_WIDTH, 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100}, "centrality axis for histograms"}; ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.2, 1.4, 1.6, 1.8, 2, 2.5, 3, 4, 5, 6, 8, 10}, "pt axis for histograms"}; ConfigurableAxis axisDeltaPhi{"axisDeltaPhi", {72, -PIHalf, PIHalf * 3}, "delta phi axis for histograms"}; ConfigurableAxis axisDeltaEta{"axisDeltaEta", {48, -2.4, 2.4}, "delta eta axis for histograms"}; ConfigurableAxis axisPtTrigger{"axisPtTrigger", {VARIABLE_WIDTH, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.2, 1.4, 1.6, 1.8, 2, 2.5, 3, 4, 5, 6, 8, 10}, "pt trigger axis for histograms"}; ConfigurableAxis axisPtAssoc{"axisPtAssoc", {VARIABLE_WIDTH, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.2, 1.4, 1.6, 1.8, 2, 2.5, 3, 4, 5, 6, 8, 10}, "pt associated axis for histograms"}; ConfigurableAxis axisVtxMix{"axisVtxMix", {VARIABLE_WIDTH, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "vertex axis for mixed event histograms"}; - ConfigurableAxis axisMultMix{"axisMultMix", {VARIABLE_WIDTH, 0, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100}, "multiplicity / centrality axis for mixed event histograms"}; + ConfigurableAxis axisMultMix{"axisMultMix", {VARIABLE_WIDTH, 0, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100, 120, 140, 160, 180, 200, 220, 240, 260, 280, 300}, "multiplicity / centrality axis for mixed event histograms"}; ConfigurableAxis axisSample{"axisSample", {cfgSampleSize, 0, cfgSampleSize}, "sample axis for histograms"}; ConfigurableAxis axisVertexEfficiency{"axisVertexEfficiency", {10, -10, 10}, "vertex axis for efficiency histograms"}; @@ -127,18 +116,22 @@ struct DiHadronCor { // make the filters and cuts. Filter collisionFilter = (nabs(aod::collision::posZ) < cfgCutVtxZ) && (aod::evsel::sel8) == true && (aod::cent::centFT0C > cfgCentFT0CMin) && (aod::cent::centFT0C < cfgCentFT0CMax); Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls) && (nabs(aod::track::dcaZ) < cfgCutDCAz); - using AodCollisions = soa::Filtered>; // aod::CentFT0Cs - using AodTracks = soa::Filtered>; + using FilteredCollisions = soa::Filtered>; + using FilteredTracks = soa::Filtered>; + using FilteredTracksWithMCLabels = soa::Filtered>; // Filter for MCParticle Filter particleFilter = (nabs(aod::mcparticle::eta) < cfgCutEta) && (aod::mcparticle::pt > cfgCutPtMin) && (aod::mcparticle::pt < cfgCutPtMax); - using MyMcParticles = soa::Filtered; + using FilteredMcParticles = soa::Filtered; // Filter for MCcollisions Filter mccollisionFilter = nabs(aod::mccollision::posZ) < cfgCutVtxZ; - using MyMcCollisions = soa::Filtered; + using FilteredMcCollisions = soa::Filtered; + + using FilteredSmallGroupMcCollisions = soa::SmallGroups>; Preslice perCollision = aod::track::collisionId; + PresliceUnsorted collisionPerMCCollision = aod::mccollisionlabel::mcCollisionId; // Corrections TH3D* mEfficiency = nullptr; @@ -247,13 +240,22 @@ struct DiHadronCor { registry.add("Centrality", hCentTitle.c_str(), {HistType::kTH1D, {axisCentrality}}); registry.add("Centrality_used", hCentTitle.c_str(), {HistType::kTH1D, {axisCentrality}}); // histogram to see how many events are in the same and mixed event registry.add("zVtx", "zVtx", {HistType::kTH1D, {axisVertex}}); + registry.add("zVtx_used", "zVtx_used", {HistType::kTH1D, {axisVertex}}); registry.add("Trig_hist", "", {HistType::kTHnSparseF, {{axisSample, axisVertex, axisPtTrigger}}}); registry.add("eventcount", "bin", {HistType::kTH1F, {{4, 0, 4, "bin"}}}); // histogram to see how many events are in the same and mixed event - - if (!cfgEfficiency.value.empty()) { - efficiencyAssociatedCache.reserve(512); + if (doprocessMCSame) { + registry.add("MCTrue/MCeventcount", "MCeventcount", {HistType::kTH1F, {{4, 0, 4, "bin"}}}); // histogram to see how many events are in the same and mixed event + registry.add("MCTrue/MCCentrality", hCentTitle.c_str(), {HistType::kTH1D, {axisCentrality}}); + registry.add("MCTrue/MCNch", "N_{ch}", {HistType::kTH1D, {axisMultiplicity}}); + registry.add("MCTrue/MCzVtx", "MCzVtx", {HistType::kTH1D, {axisVertex}}); + registry.add("MCTrue/MCPhi", "MCPhi", {HistType::kTH1D, {axisPhi}}); + registry.add("MCTrue/MCEta", "MCEta", {HistType::kTH1D, {axisEta}}); + registry.add("MCTrue/MCpT", "MCpT", {HistType::kTH1D, {axisPtTrigger}}); + registry.add("MCTrue/MCTrig_hist", "", {HistType::kTHnSparseF, {{axisSample, axisVertex, axisPtTrigger}}}); + registry.add("MCTrue/MCdeltaEta_deltaPhi_same", "", {HistType::kTH2D, {axisDeltaPhi, axisDeltaEta}}); // check to see the delta eta and delta phi distribution + registry.add("MCTrue/MCdeltaEta_deltaPhi_mixed", "", {HistType::kTH2D, {axisDeltaPhi, axisDeltaEta}}); } std::vector corrAxis = {{axisSample, "Sample"}, @@ -358,12 +360,6 @@ struct DiHadronCor { template void fillYield(TCollision collision, TTracks tracks) // function to fill the yield and etaphi histograms. { - float cent = getCentrality(collision); - registry.fill(HIST("Centrality"), cent); - - registry.fill(HIST("Nch"), tracks.size()); - registry.fill(HIST("zVtx"), collision.posZ()); - float weff1 = 1; float vtxz = collision.posZ(); for (auto const& track1 : tracks) { @@ -403,7 +399,6 @@ struct DiHadronCor { return dPhiStar; } - // template void fillCorrelations(TTracks tracks1, TTracksAssoc tracks2, float posZ, int system, int magneticField, float cent) // function to fill the Output functions (sparse) and the delta eta and delta phi histograms { @@ -487,6 +482,45 @@ struct DiHadronCor { } } } + template + void fillMCCorrelations(TTracks tracks1, TTracksAssoc tracks2, float posZ, int system) // function to fill the Output functions (sparse) and the delta eta and delta phi histograms + { + int fSampleIndex = gRandom->Uniform(0, cfgSampleSize); + + float triggerWeight = 1.0f; + float associatedWeight = 1.0f; + // loop over all tracks + for (auto const& track1 : tracks1) { + if (step >= CorrelationContainer::kCFStepTrackedOnlyPrim && !track1.isPhysicalPrimary()) + continue; + + if (system == SameEvent && doprocessMCSame) + registry.fill(HIST("MCTrue/MCTrig_hist"), fSampleIndex, posZ, track1.pt(), triggerWeight); + + for (auto const& track2 : tracks2) { + + if (step >= CorrelationContainer::kCFStepTrackedOnlyPrim && !track2.isPhysicalPrimary()) + continue; + + if (track1.pt() <= track2.pt()) + continue; // skip if the trigger pt is less than the associate pt + + float deltaPhi = RecoDecay::constrainAngle(track1.phi() - track2.phi(), -PIHalf); + float deltaEta = track1.eta() - track2.eta(); + + // fill the right sparse and histograms + if (system == SameEvent) { + same->getPairHist()->Fill(step, fSampleIndex, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta, triggerWeight * associatedWeight); + if (doprocessMCSame) + registry.fill(HIST("MCTrue/MCdeltaEta_deltaPhi_same"), deltaPhi, deltaEta, triggerWeight * associatedWeight); + } else if (system == MixedEvent) { + mixed->getPairHist()->Fill(step, fSampleIndex, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta, triggerWeight * associatedWeight); + if (doprocessMCMixed) + registry.fill(HIST("MCTrue/MCdeltaEta_deltaPhi_mixed"), deltaPhi, deltaEta, triggerWeight * associatedWeight); + } + } + } + } template bool eventSelected(TCollision collision, const int multTrk, const float centrality, const bool fillCounter) @@ -552,7 +586,8 @@ struct DiHadronCor { registry.fill(HIST("hEventCountSpecific"), 8.5); // V0A T0A 5 sigma cut - if (cfgEvSelV0AT0ACut && (std::fabs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > 5 * fT0AV0ASigma->Eval(collision.multFT0A()))) + float sigma = 5.0; + if (cfgEvSelV0AT0ACut && (std::fabs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > sigma * fT0AV0ASigma->Eval(collision.multFT0A()))) return 0; if (fillCounter && cfgEvSelV0AT0ACut) registry.fill(HIST("hEventCountSpecific"), 9.5); @@ -560,7 +595,7 @@ struct DiHadronCor { return 1; } - void processSame(AodCollisions::iterator const& collision, AodTracks const& tracks, aod::BCsWithTimestamps const&) + void processSame(FilteredCollisions::iterator const& collision, FilteredTracks const& tracks, aod::BCsWithTimestamps const&) { auto bc = collision.bc_as(); @@ -568,10 +603,9 @@ struct DiHadronCor { if (cfgUseAdditionalEventCut && !eventSelected(collision, tracks.size(), cent, true)) return; - registry.fill(HIST("eventcount"), SameEvent); // because its same event i put it in the 1 bin - - loadEfficiency(bc.timestamp()); - fillYield(collision, tracks); + registry.fill(HIST("Centrality"), cent); + registry.fill(HIST("Nch"), tracks.size()); + registry.fill(HIST("zVtx"), collision.posZ()); if (cfgSelCollByNch && (tracks.size() < cfgCutMultMin || tracks.size() >= cfgCutMultMax)) { return; @@ -580,15 +614,20 @@ struct DiHadronCor { return; } + loadEfficiency(bc.timestamp()); + registry.fill(HIST("eventcount"), SameEvent); // because its same event i put it in the 1 bin + fillYield(collision, tracks); + + same->fillEvent(tracks.size(), CorrelationContainer::kCFStepReconstructed); fillCorrelations(tracks, tracks, collision.posZ(), SameEvent, getMagneticField(bc.timestamp()), cent); } PROCESS_SWITCH(DiHadronCor, processSame, "Process same event", true); // the process for filling the mixed events - void processMixed(AodCollisions const& collisions, AodTracks const& tracks, aod::BCsWithTimestamps const&) + void processMixed(FilteredCollisions const& collisions, FilteredTracks const& tracks, aod::BCsWithTimestamps const&) { - auto getTracksSize = [&tracks, this](AodCollisions::iterator const& collision) { + auto getTracksSize = [&tracks, this](FilteredCollisions::iterator const& collision) { auto associatedTracks = tracks.sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), this->cache); auto mult = associatedTracks.size(); return mult; @@ -599,11 +638,8 @@ struct DiHadronCor { MixedBinning binningOnVtxAndMult{{getTracksSize}, {axisVtxMix, axisMultMix}, true}; auto tracksTuple = std::make_tuple(tracks, tracks); - Pair pair{binningOnVtxAndMult, cfgMixEventNumMin, -1, collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip + Pair pair{binningOnVtxAndMult, cfgMixEventNumMin, -1, collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip for (auto const& [collision1, tracks1, collision2, tracks2] : pair) { - registry.fill(HIST("eventcount"), MixedEvent); // fill the mixed event in the 3 bin - auto bc = collision1.bc_as(); - loadEfficiency(bc.timestamp()); if (cfgSelCollByNch && (tracks1.size() < cfgCutMultMin || tracks1.size() >= cfgCutMultMax)) continue; @@ -624,6 +660,10 @@ struct DiHadronCor { if (!cfgSelCollByNch && (cent2 < cfgCutCentMin || cent2 >= cfgCutCentMax)) continue; + registry.fill(HIST("eventcount"), MixedEvent); // fill the mixed event in the 3 bin + auto bc = collision1.bc_as(); + loadEfficiency(bc.timestamp()); + fillCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent, getMagneticField(bc.timestamp()), cent1); } } @@ -632,22 +672,19 @@ struct DiHadronCor { int getSpecies(int pdgCode) { - switch (pdgCode) { - case 211: // pion - case -211: + switch (std::abs(pdgCode)) { + case PDG_t::kPiPlus: // pion return 0; - case 321: // Kaon - case -321: + case PDG_t::kKPlus: // Kaon return 1; - case 2212: // proton - case -2212: + case PDG_t::kProton: // proton return 2; default: // NOTE. The efficiency histogram is hardcoded to contain 4 species. Anything special will have the last slot. return 3; } } - void processMCEfficiency(MyMcCollisions::iterator const& mcCollision, aod::BCsWithTimestamps const&, soa::SmallGroups> const& collisions, MyMcParticles const& mcParticles, AodTracks const& tracks) + void processMCEfficiency(FilteredMcCollisions::iterator const& mcCollision, aod::BCsWithTimestamps const&, soa::SmallGroups> const& collisions, FilteredMcParticles const& mcParticles, FilteredTracksWithMCLabels const& tracks) { if (cfgSelCollByNch && (tracks.size() < cfgCutMultMin || tracks.size() >= cfgCutMultMax)) { return; @@ -680,6 +717,95 @@ struct DiHadronCor { } } PROCESS_SWITCH(DiHadronCor, processMCEfficiency, "MC: Extract efficiencies", false); + + void processMCSame(FilteredMcCollisions::iterator const& mcCollision, FilteredMcParticles const& mcParticles, FilteredSmallGroupMcCollisions const& collisions) + { + if (cfgVerbosity) { + LOGF(info, "processMCSame. MC collision: %d, particles: %d, collisions: %d", mcCollision.globalIndex(), mcParticles.size(), collisions.size()); + } + + float cent = -1; + for (const auto& collision : collisions) { + cent = getCentrality(collision); + } + + if (cfgSelCollByNch && (mcParticles.size() < cfgCutMultMin || mcParticles.size() >= cfgCutMultMax)) { + return; + } + if (!cfgSelCollByNch && (cent < cfgCutCentMin || cent >= cfgCutCentMax)) { + return; + } + + registry.fill(HIST("MCTrue/MCeventcount"), SameEvent); // because its same event i put it in the 1 bin + registry.fill(HIST("MCTrue/MCCentrality"), cent); + registry.fill(HIST("MCTrue/MCNch"), mcParticles.size()); + registry.fill(HIST("MCTrue/MCzVtx"), mcCollision.posZ()); + for (const auto& mcParticle : mcParticles) { + if (mcParticle.isPhysicalPrimary()) { + registry.fill(HIST("MCTrue/MCPhi"), mcParticle.phi()); + registry.fill(HIST("MCTrue/MCEta"), mcParticle.eta()); + registry.fill(HIST("MCTrue/MCpT"), mcParticle.pt()); + } + } + + same->fillEvent(mcParticles.size(), CorrelationContainer::kCFStepAll); + fillMCCorrelations(mcParticles, mcParticles, mcCollision.posZ(), SameEvent); + + if (collisions.size() == 0) { + return; + } + + same->fillEvent(mcParticles.size(), CorrelationContainer::kCFStepTrackedOnlyPrim); + fillMCCorrelations(mcParticles, mcParticles, mcCollision.posZ(), SameEvent); + } + PROCESS_SWITCH(DiHadronCor, processMCSame, "Process MC same event", false); + + void processMCMixed(FilteredMcCollisions const& mcCollisions, FilteredMcParticles const& mcParticles, FilteredSmallGroupMcCollisions const& collisions) + { + auto getTracksSize = [&mcParticles, this](FilteredMcCollisions::iterator const& mcCollision) { + auto associatedTracks = mcParticles.sliceByCached(o2::aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), this->cache); + auto mult = associatedTracks.size(); + return mult; + }; + + using MixedBinning = FlexibleBinningPolicy, o2::aod::mccollision::PosZ, decltype(getTracksSize)>; + + MixedBinning binningOnVtxAndMult{{getTracksSize}, {axisVtxMix, axisMultMix}, true}; + + auto tracksTuple = std::make_tuple(mcParticles, mcParticles); + Pair pair{binningOnVtxAndMult, cfgMixEventNumMin, -1, mcCollisions, tracksTuple, &cache}; // -1 is the number of the bin to skip + for (auto const& [collision1, tracks1, collision2, tracks2] : pair) { + + if (cfgSelCollByNch && (tracks1.size() < cfgCutMultMin || tracks1.size() >= cfgCutMultMax)) + continue; + + if (cfgSelCollByNch && (tracks2.size() < cfgCutMultMin || tracks2.size() >= cfgCutMultMax)) + continue; + + auto groupedCollisions = collisions.sliceBy(collisionPerMCCollision, collision1.globalIndex()); + if (cfgVerbosity > 0) { + LOGF(info, "Found %d related collisions", groupedCollisions.size()); + } + float cent = -1; + for (const auto& collision : groupedCollisions) { + cent = getCentrality(collision); + } + + if (!cfgSelCollByNch && groupedCollisions.size() != 0 && (cent < cfgCutCentMin || cent >= cfgCutCentMax)) + continue; + + registry.fill(HIST("MCTrue/MCeventcount"), MixedEvent); // fill the mixed event in the 3 bin + + fillMCCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent); + + if (groupedCollisions.size() == 0) { + continue; + } + + fillMCCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent); + } + } + PROCESS_SWITCH(DiHadronCor, processMCMixed, "Process MC mixed events", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 436df8a36d7f4a03b3c32a0d69acf162f424c89d Mon Sep 17 00:00:00 2001 From: Mingyu Zhang <83645570+Mingyu3360715@users.noreply.github.com> Date: Fri, 6 Jun 2025 03:00:13 +0200 Subject: [PATCH 1529/1650] [PWGHF] fix missing assignment of Lc gen pt (#11483) --- PWGHF/D2H/Tasks/taskSigmac.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGHF/D2H/Tasks/taskSigmac.cxx b/PWGHF/D2H/Tasks/taskSigmac.cxx index 3ea06c80733..dff39af4c28 100644 --- a/PWGHF/D2H/Tasks/taskSigmac.cxx +++ b/PWGHF/D2H/Tasks/taskSigmac.cxx @@ -732,7 +732,7 @@ struct HfTaskSigmac { if (yCandGenMax >= 0. && std::abs(RecoDecay::y(particle.pVector(), o2::constants::physics::MassLambdaCPlus)) > yCandGenMax) { continue; } - double ptGenLc(-1.), ptGenLcBMother(-1.); + double ptGenLc(particle.pt()), ptGenLcBMother(-1.); int origin = particle.originMcGen(); int channel = particle.flagMcDecayChanGen(); if (origin == RecoDecay::OriginType::Prompt) { From 180f457ed2ffa53ea61ed6fed095b1a0f652de7a Mon Sep 17 00:00:00 2001 From: Sigurd Nese <32108009+sigurdnese@users.noreply.github.com> Date: Thu, 5 Jun 2025 23:56:22 -0700 Subject: [PATCH 1530/1650] [PWGDQ] Fill vertexing chi2PCA for triplets (#11472) --- PWGDQ/Core/HistogramsLibrary.cxx | 1 + PWGDQ/Core/VarManager.h | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 7e8be6950a9..9fdb5b0cae5 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -1034,6 +1034,7 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "LxyProj_Mass_Pt", "", false, 50, 2.0, 4.0, VarManager::kMass, 10, 0.0, 20.0, VarManager::kPt, 1000, -1.0, 1.0, VarManager::kVertexingLxyProjected); hm->AddHistogram(histClass, "LzProj_Mass_Pt", "", false, 50, 2.0, 4.0, VarManager::kMass, 10, 0.0, 20.0, VarManager::kPt, 1000, -1.0, 1.0, VarManager::kVertexingLzProjected); hm->AddHistogram(histClass, "CosPointingAngle", "", false, 200, -1.0, 1.0, VarManager::kCosPointingAngle); + hm->AddHistogram(histClass, "VtxingChi2PCA", "", false, 100, 0.0, 10.0, VarManager::kVertexingChi2PCA); } if (subGroupStr.Contains("kalman-filter")) { diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 3c1437cb5cb..31c1f69a275 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -3979,6 +3979,7 @@ void VarManager::FillTripletVertexing(C const& collision, T const& t1, T const& values[VarManager::kVertexingProcCode] = procCode; if (procCode == 0) { // TODO: set the other variables to appropriate values and return + values[kVertexingChi2PCA] = -999.; values[kVertexingLxy] = -999.; values[kVertexingLxyz] = -999.; values[kVertexingLz] = -999.; @@ -4013,6 +4014,11 @@ void VarManager::FillTripletVertexing(C const& collision, T const& t1, T const& o2::dataformats::VertexBase primaryVertex = {std::move(vtxXYZ), std::move(vtxCov)}; auto covMatrixPV = primaryVertex.getCov(); + if (fgUsedVars[kVertexingChi2PCA]) { + auto chi2PCA = fgFitterThreeProngBarrel.getChi2AtPCACandidate(); + values[VarManager::kVertexingChi2PCA] = chi2PCA; + } + double phi = std::atan2(secondaryVertex[1] - collision.posY(), secondaryVertex[0] - collision.posX()); double theta = std::atan2(secondaryVertex[2] - collision.posZ(), std::sqrt((secondaryVertex[0] - collision.posX()) * (secondaryVertex[0] - collision.posX()) + @@ -4279,9 +4285,10 @@ void VarManager::FillDileptonTrackVertexing(C const& collision, T1 const& lepton covMatrixPCA = fgFitterThreeProngFwd.calcPCACovMatrixFlat(); } - auto chi2PCA = fgFitterThreeProngBarrel.getChi2AtPCACandidate(); - if (fgUsedVars[kVertexingChi2PCA]) + if (fgUsedVars[kVertexingChi2PCA]) { + auto chi2PCA = fgFitterThreeProngBarrel.getChi2AtPCACandidate(); values[VarManager::kVertexingChi2PCA] = chi2PCA; + } double phi = std::atan2(secondaryVertex[1] - collision.posY(), secondaryVertex[0] - collision.posX()); double theta = std::atan2(secondaryVertex[2] - collision.posZ(), From aa228f01a2dff624794aa4968ca851b689ce2968 Mon Sep 17 00:00:00 2001 From: Samuele Cattaruzzi <124249902+scattaru@users.noreply.github.com> Date: Fri, 6 Jun 2025 09:26:55 +0200 Subject: [PATCH 1531/1650] [DPG] Adding ITS task for impact parameter studies (#11401) --- DPG/Tasks/CMakeLists.txt | 1 + DPG/Tasks/ITS/CMakeLists.txt | 18 + DPG/Tasks/ITS/itsImpParStudies.cxx | 699 +++++++++++++++++++++++++++++ 3 files changed, 718 insertions(+) create mode 100644 DPG/Tasks/ITS/CMakeLists.txt create mode 100644 DPG/Tasks/ITS/itsImpParStudies.cxx diff --git a/DPG/Tasks/CMakeLists.txt b/DPG/Tasks/CMakeLists.txt index 959ed3e5637..642f8d6e772 100644 --- a/DPG/Tasks/CMakeLists.txt +++ b/DPG/Tasks/CMakeLists.txt @@ -18,3 +18,4 @@ add_subdirectory(FDD) add_subdirectory(MFT) add_subdirectory(Monitor) add_subdirectory(FT0) +add_subdirectory(ITS) diff --git a/DPG/Tasks/ITS/CMakeLists.txt b/DPG/Tasks/ITS/CMakeLists.txt new file mode 100644 index 00000000000..2850271fb41 --- /dev/null +++ b/DPG/Tasks/ITS/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright 2019-2020 CERN and copyright holders of ALICE O2. +# See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +# All rights not expressly granted are reserved. +# +# This software is distributed under the terms of the GNU General Public +# License v3 (GPL Version 3), copied verbatim in the file "COPYING". +# +# In applying this license CERN does not waive the privileges and immunities +# granted to it by virtue of its status as an Intergovernmental Organization +# or submit itself to any jurisdiction. + +o2physics_add_dpl_workflow(its-impact-parameter-studies + SOURCES itsImpParStudies.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + O2::ReconstructionDataFormats + O2::DetectorsCommonDataFormats + O2::DetectorsVertexing + COMPONENT_NAME Analysis) diff --git a/DPG/Tasks/ITS/itsImpParStudies.cxx b/DPG/Tasks/ITS/itsImpParStudies.cxx new file mode 100644 index 00000000000..67fba3b4989 --- /dev/null +++ b/DPG/Tasks/ITS/itsImpParStudies.cxx @@ -0,0 +1,699 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// \author Samuele Cattaruzzi + +#include + +#include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" +#include "ReconstructionDataFormats/DCA.h" +#include "Common/Core/trackUtilities.h" // for propagation to primary vertex + +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/PIDResponse.h" +#include "DetectorsBase/Propagator.h" +#include "DetectorsBase/GeometryManager.h" +#include "CommonUtils/NameConf.h" +#include "Framework/AnalysisDataModel.h" +#include "Common/Core/TrackSelection.h" +#include "DetectorsVertexing/PVertexer.h" +#include "ReconstructionDataFormats/Vertex.h" +#include "CCDB/BasicCCDBManager.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "Framework/RunningWorkflowInfo.h" +#include "CCDB/CcdbApi.h" +#include "DataFormatsCalibration/MeanVertexObject.h" +#include "CommonConstants/GeomConstants.h" + +#include "iostream" +#include "vector" +#include "set" + +using namespace o2::framework; +using namespace o2::framework::expressions; + +// void customize(std::vector& workflowOptions) +//{ +// ConfigParamSpec optionDoMC{"doMC", VariantType::Bool, false, {"Fill MC histograms."}}; +// workflowOptions.push_back(optionDoMC); +// } + +#include "Framework/runDataProcessing.h" + +/// QA task for impact parameter distribution monitoring +struct ItsImpactParStudies { + + /// Input parameters + Configurable fDebug{"fDebug", false, "Debug flag enabling outputs"}; + Configurable fEnablePulls{"fEnablePulls", false, "Enable storage of pulls"}; + ConfigurableAxis binningImpPar{"binningImpPar", {200, -500.f, 500.f}, "Impact parameter binning"}; + ConfigurableAxis binningPulls{"binningPulls", {200, -10.f, 10.f}, "Pulls binning"}; + ConfigurableAxis binningPt{"binningPt", {100, 0.f, 10.f}, "Pt binning"}; + ConfigurableAxis binningEta{"binningEta", {40, -2.f, 2.f}, "Eta binning"}; + ConfigurableAxis binningPhi{"binningPhi", {24, 0.f, o2::constants::math::TwoPI}, "Phi binning"}; + ConfigurableAxis binningPDG{"binningPDG", {5, -1.5f, 3.5f}, "PDG species binning (-1: not matched, 0: unknown, 1: pi, 2: K, 3: p)"}; + ConfigurableAxis binningCharge{"binningCharge", {2, -2.f, 2.f}, "charge binning (-1: negative; +1: positive)"}; + ConfigurableAxis binningIuPosX{"binningIuPosX", {100, -10.f, 10.f}, "Track IU x position"}; + ConfigurableAxis binningIuPosY{"binningIuPosY", {100, -10.f, 10.f}, "Track IU y position"}; + ConfigurableAxis binningIuPosZ{"binningIuPosZ", {100, -10.f, 10.f}, "Track IU z position"}; + ConfigurableAxis binningClusterSize{"binningClusterSize", {16, -0.5, 15.5}, "Cluster size, four bits per a layer"}; + ConfigurableAxis binsNumPvContrib{"binsNumPvContrib", {200, 0, 200}, "Number of original PV contributors"}; + Configurable keepOnlyPhysPrimary{"keepOnlyPhysPrimary", false, "Consider only phys. primary particles (MC)"}; + Configurable keepOnlyPvContrib{"keepOnlyPvContrib", false, "Consider only PV contributor tracks"}; + // Configurable numberContributorsMin{"numberContributorsMin", 0, "Minimum number of contributors for the primary vertex"}; + Configurable useTriggerkINT7{"useTriggerkINT7", false, "Use kINT7 trigger"}; + Configurable usesel8{"usesel8", true, "Use or not the sel8() (T0A & T0C) event selection"}; + Configurable addTrackIUinfo{"addTrackIUinfo", false, "Add track parameters at inner most update"}; + Configurable trackSelection{"trackSelection", 1, "Track selection: 0 -> No Cut, 1 -> kGlobalTrack, 2 -> kGlobalTrackWoPtEta, 3 -> kGlobalTrackWoDCA, 4 -> kQualityTracks, 5 -> kInAcceptanceTracks"}; + Configurable zVtxMax{"zVtxMax", 10.f, "Maximum value for |z_vtx|"}; + // Configurable keepOnlyGlobalTracks{"keepOnlyGlobalTracks", 1, "Keep only global tracks or not"}; + Configurable ptMin{"ptMin", 0.1f, "Minimum track pt [GeV/c]"}; + Configurable nSigmaTPCPionMin{"nSigmaTPCPionMin", -99999.f, "Minimum nSigma value in TPC, pion hypothesis"}; + Configurable nSigmaTPCPionMax{"nSigmaTPCPionMax", 99999.f, "Maximum nSigma value in TPC, pion hypothesis"}; + Configurable nSigmaTPCKaonMin{"nSigmaTPCKaonMin", -99999.f, "Minimum nSigma value in TPC, kaon hypothesis"}; + Configurable nSigmaTPCKaonMax{"nSigmaTPCKaonMax", 99999.f, "Maximum nSigma value in TPC, kaon hypothesis"}; + Configurable nSigmaTPCProtonMin{"nSigmaTPCProtonMin", -99999.f, "Minimum nSigma value in TPC, proton hypothesis"}; + Configurable nSigmaTPCProtonMax{"nSigmaTPCProtonMax", 99999.f, "Maximum nSigma value in TPC, proton hypothesis"}; + Configurable nSigmaTOFPionMin{"nSigmaTOFPionMin", -99999.f, "Minimum nSigma value in TOF, pion hypothesis"}; + Configurable nSigmaTOFPionMax{"nSigmaTOFPionMax", 99999.f, "Maximum nSigma value in TOF, pion hypothesis"}; + Configurable nSigmaTOFKaonMin{"nSigmaTOFKaonMin", -99999.f, "Minimum nSigma value in TOF, kaon hypothesis"}; + Configurable nSigmaTOFKaonMax{"nSigmaTOFKaonMax", 99999.f, "Maximum nSigma value in TOF, kaon hypothesis"}; + Configurable nSigmaTOFProtonMin{"nSigmaTOFProtonMin", -99999.f, "Minimum nSigma value in TOF, proton hypothesis"}; + Configurable nSigmaTOFProtonMax{"nSigmaTOFProtonMax", 99999.f, "Maximum nSigma value in TOF, proton hypothesis"}; + // PV refit + Configurable ccdburl{"ccdburl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable ccdbPathLut{"ccdbpath_lut", "GLO/Param/MatLUT", "Path for LUT parametrization"}; + // Configurable ccdbpath_geo{"ccdbpath_geo", "GLO/Config/GeometryAligned", "Path of the geometry file"}; + Configurable ccdbPathGrp{"ccdbpath_grp", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + Configurable doPVrefit{"doPVrefit", true, "Do PV refit"}; + Configurable fillHistoPVrefit{"fillHistoPVrefit", false, "Do PV refit"}; + Configurable nBinsDeltaXPVrefit{"nBins_DeltaX_PVrefit", 1000, "Number of bins of DeltaX for PV refit"}; + Configurable nBinsDeltaYPVrefit{"nBins_DeltaY_PVrefit", 1000, "Number of bins of DeltaY for PV refit"}; + Configurable nBinsDeltaZPVrefit{"nBins_DeltaZ_PVrefit", 1000, "Number of bins of DeltaZ for PV refit"}; + Configurable minDeltaXPVrefit{"minDeltaX_PVrefit", -0.5, "Min. DeltaX value for PV refit (cm)"}; + Configurable maxDeltaXPVrefit{"maxDeltaX_PVrefit", 0.5, "Max. DeltaX value for PV refit (cm)"}; + Configurable minDeltaYPVrefit{"minDeltaY_PVrefit", -0.5, "Min. DeltaY value for PV refit (cm)"}; + Configurable maxDeltaYPVrefit{"maxDeltaY_PVrefit", 0.5, "Max. DeltaY value for PV refit (cm)"}; + Configurable minDeltaZPVrefit{"minDeltaZ_PVrefit", -0.5, "Min. DeltaZ value for PV refit (cm)"}; + Configurable maxDeltaZPVrefit{"maxDeltaZ_PVrefit", 0.5, "Max. DeltaZ value for PV refit (cm)"}; + Configurable minPVcontrib{"minPVcontrib", 0, "Minimum number of PV contributors"}; + Configurable maxPVcontrib{"maxPVcontrib", 10000, "Maximum number of PV contributors"}; + Configurable removeDiamondConstraint{"removeDiamondConstraint", true, "Remove the diamond constraint for the PV refit"}; + Configurable keepAllTracksPVrefit{"keepAllTracksPVrefit", false, "Keep all tracks for PV refit (for debug)"}; + Configurable useCustomITSHitMap{"use_customITSHitMap", false, "Use custom ITS hitmap selection"}; + Configurable customITShitmap{"customITShitmap", 0, "Custom ITS hitmap (consider the binary representation)"}; + Configurable customITShitmap_exclude{"customITShitmap_exclude", 0, "Custom ITS hitmap of layers to be excluded (consider the binary representation)"}; + Configurable nCustomMinITShits{"n_customMinITShits", 0, "Minimum number of layers crossed by a track among those in \"customITShitmap\""}; + Configurable customForceITSTPCmatching{"custom_forceITSTPCmatching", false, "Consider or not only ITS-TPC macthed tracks when using custom ITS hitmap"}; + Configurable downsamplingFraction{"downsamplingFraction", 1.1, "Fraction of tracks to be used to fill the output objects"}; + + /// Custom cut selection objects + TrackSelection selector_ITShitmap; + + /// Selections with Filter (from o2::framework::expressions) + // Primary vertex |z_vtx| ptMin; + + /// Histogram registry (from o2::framework) + HistogramRegistry histograms{"HistogramsImpParQA"}; + bool isPIDPionApplied; + bool isPIDKaonApplied; + bool isPIDProtonApplied; + + // Needed for PV refitting + Service ccdb; + o2::base::MatLayerCylSet* lut = nullptr; + // o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT; + int mRunNumber; + + ///////////////////////////////////////////////////////////// + /// Process functions /// + ///////////////////////////////////////////////////////////// + + /// Data + using CollisionRecoTable = o2::soa::Join; + using TrackTable = o2::soa::Join; + using TrackFullTable = o2::soa::Join; + using TrackTableIU = o2::soa::Join; + void processData(o2::soa::Filtered::iterator const& collision, + const TrackTable& tracksUnfiltered, + const o2::soa::Filtered& tracks, + const TrackTableIU& tracksIU, + o2::aod::BCsWithTimestamps const&) + { + /// here call the template processReco function + auto bc = collision.bc_as(); + processReco(collision, tracksUnfiltered, tracks, tracksIU, 0, bc); + } + PROCESS_SWITCH(ItsImpactParStudies, processData, "process data", true); + + /// MC + using CollisionMCRecoTable = o2::soa::Join; + using TrackMCFullTable = o2::soa::Join; + void processMC(o2::soa::Filtered::iterator const& collision, + TrackTable const& tracksUnfiltered, + o2::soa::Filtered const& tracks, + const TrackTableIU& tracksIU, + const o2::aod::McParticles& mcParticles, + const o2::aod::McCollisions&, + o2::aod::BCsWithTimestamps const&) + { + /// here call the template processReco function + auto bc = collision.bc_as(); + processReco(collision, tracksUnfiltered, tracks, tracksIU, mcParticles, bc); + } + PROCESS_SWITCH(ItsImpactParStudies, processMC, "process MC", false); + + /// core template process function + /// template + /// void processReco(const C& collision, const TrackTable& unfilteredTracks, const T& tracks, + /// const T_MC& mcParticles, + /// o2::aod::BCsWithTimestamps const& bcs); + + ///////////////////////////////////////////////////////////// + + /// init function - declare and define histograms + void init(InitContext&) + { + // Primary vertex + const AxisSpec collisionXAxis{100, -20.f, 20.f, "X (cm)"}; + const AxisSpec collisionYAxis{100, -20.f, 20.f, "Y (cm)"}; + const AxisSpec collisionZAxis{100, -20.f, 20.f, "Z (cm)"}; + const AxisSpec collisionXOrigAxis{1000, -20.f, 20.f, "X original PV (cm)"}; + const AxisSpec collisionYOrigAxis{1000, -20.f, 20.f, "Y original PV (cm)"}; + const AxisSpec collisionZOrigAxis{1000, -20.f, 20.f, "Z original PV (cm)"}; + const AxisSpec collisionNumberContributorAxis{1000, 0, 1000, "Number of contributors"}; + const AxisSpec collisionDeltaX_PVrefit{nBinsDeltaXPVrefit, minDeltaXPVrefit, maxDeltaXPVrefit, "#Delta x_{PV} (cm)"}; + const AxisSpec collisionDeltaY_PVrefit{nBinsDeltaYPVrefit, minDeltaYPVrefit, maxDeltaYPVrefit, "#Delta y_{PV} (cm)"}; + const AxisSpec collisionDeltaZ_PVrefit{nBinsDeltaZPVrefit, minDeltaZPVrefit, maxDeltaZPVrefit, "#Delta z_{PV} (cm)"}; + + histograms.add("Reco/vertices", "", kTH1D, {{2, 0.5f, 2.5f, ""}}); + histograms.get(HIST("Reco/vertices"))->GetXaxis()->SetBinLabel(1, "All PV"); + histograms.get(HIST("Reco/vertices"))->GetXaxis()->SetBinLabel(2, "PV refit doable"); + histograms.add("Reco/vertices_perTrack", "", kTH1D, {{3, 0.5f, 3.5f, ""}}); + histograms.get(HIST("Reco/vertices_perTrack"))->GetXaxis()->SetBinLabel(1, "All PV"); + histograms.get(HIST("Reco/vertices_perTrack"))->GetXaxis()->SetBinLabel(2, "PV refit doable"); + histograms.get(HIST("Reco/vertices_perTrack"))->GetXaxis()->SetBinLabel(3, "PV refit #chi^{2}!=-1"); + histograms.add("Reco/vertexZ", "", kTH1D, {collisionZAxis}); + histograms.add("Reco/numberContributors", "", kTH1D, {collisionNumberContributorAxis}); + if (doPVrefit && fillHistoPVrefit) { + histograms.add("Reco/nContrib_vs_DeltaX_PVrefit", "", kTH2D, {collisionNumberContributorAxis, collisionDeltaX_PVrefit}); + histograms.add("Reco/nContrib_vs_DeltaY_PVrefit", "", kTH2D, {collisionNumberContributorAxis, collisionDeltaY_PVrefit}); + histograms.add("Reco/nContrib_vs_DeltaZ_PVrefit", "", kTH2D, {collisionNumberContributorAxis, collisionDeltaZ_PVrefit}); + histograms.add("Reco/nContrib_vs_Chi2PVrefit", "", kTH2D, {collisionNumberContributorAxis, {102, -1.5, 100.5, "#chi^{2} PV refit"}}); + histograms.add("Reco/X_PVrefitChi2minus1", "PV refit with #chi^{2}==-1", kTH2D, {collisionXAxis, collisionXOrigAxis}); + histograms.add("Reco/Y_PVrefitChi2minus1", "PV refit with #chi^{2}==-1", kTH2D, {collisionYAxis, collisionYOrigAxis}); + histograms.add("Reco/Z_PVrefitChi2minus1", "PV refit with #chi^{2}==-1", kTH2D, {collisionZAxis, collisionZOrigAxis}); + histograms.add("Reco/nContrib_PVrefitNotDoable", "N. contributors for PV refit not doable", kTH1D, {collisionNumberContributorAxis}); + histograms.add("Reco/nContrib_PVrefitChi2minus1", "N. contributors original PV for PV refit #chi^{2}==-1", kTH1D, {collisionNumberContributorAxis}); + } + + // Needed for PV refitting + ccdb->setURL(ccdburl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get(ccdbPathLut)); + + mRunNumber = -1; + + /// Custom cut selection objects - ITS layers that must be present + std::set set_customITShitmap; // = {}; + constexpr std::size_t NLayersIts = 7; + if (useCustomITSHitMap) { + for (std::size_t indexItsLayer = 0; indexItsLayer < NLayersIts; indexItsLayer++) { + if ((customITShitmap & (1 << indexItsLayer)) > 0) { + set_customITShitmap.insert(static_cast(indexItsLayer)); + } + } + LOG(info) << "### customITShitmap: " << customITShitmap; + LOG(info) << "### nCustomMinITShits: " << nCustomMinITShits; + LOG(info) << "### set_customITShitmap.size(): " << set_customITShitmap.size(); + LOG(info) << "### Custom ITS hitmap checked: "; + for (std::set::iterator it = set_customITShitmap.begin(); it != set_customITShitmap.end(); it++) { + LOG(info) << "Layer " << static_cast(*it) << " "; + } + LOG(info) << "############"; + + selector_ITShitmap.SetRequireHitsInITSLayers(nCustomMinITShits, set_customITShitmap); + } + /// Custom cut selection objects - ITS layers that must be absent + std::set set_customITShitmap_exclude; // = {}; + if (useCustomITSHitMap) { + for (std::size_t indexItsLayer = 0; indexItsLayer < NLayersIts; indexItsLayer++) { + if ((customITShitmap_exclude & (1 << indexItsLayer)) > 0) { + set_customITShitmap_exclude.insert(static_cast(indexItsLayer)); + } + } + LOG(info) << "### customITShitmap_exclude: " << customITShitmap_exclude; + LOG(info) << "### set_customITShitmap_exclude.size(): " << set_customITShitmap_exclude.size(); + LOG(info) << "### ITS layers to be excluded: "; + for (std::set::iterator it = set_customITShitmap_exclude.begin(); it != set_customITShitmap_exclude.end(); it++) { + LOG(info) << "Layer " << static_cast(*it) << " "; + } + LOG(info) << "############"; + + selector_ITShitmap.SetRequireNoHitsInITSLayers(set_customITShitmap_exclude); + } + + // tracks + const AxisSpec trackPtAxis{binningPt, "#it{p}_{T} (GeV/#it{c})"}; + const AxisSpec trackPaxis{binningPt, "#it{p} (GeV/#it{c})"}; + const AxisSpec trackEtaAxis{binningEta, "#it{#eta}"}; + const AxisSpec trackPhiAxis{binningPhi, "#varphi"}; + const AxisSpec trackIUposXaxis{binningIuPosX, "x (cm)"}; + const AxisSpec trackIUposYaxis{binningIuPosY, "y (cm)"}; + const AxisSpec trackIUposZaxis{binningIuPosZ, "z (cm)"}; + const AxisSpec trackIUclusterSize{binningClusterSize, "cluster size"}; + const AxisSpec trackImpParRPhiAxis{binningImpPar, "#it{d}_{r#it{#varphi}} (#mum)"}; + const AxisSpec trackImpParZAxis{binningImpPar, "#it{d}_{z} (#mum)"}; + const AxisSpec trackImpParRPhiPullsAxis{binningPulls, "#it{d}_{r#it{#varphi}} / #sigma(#it{d}_{r#it{#varphi}})"}; + const AxisSpec trackImpParZPullsAxis{binningPulls, "#it{d}_{z} / #sigma(#it{d}_{z})"}; + const AxisSpec trackNSigmaTPCPionAxis{20, -10.f, 10.f, "Number of #sigma TPC #pi^{#pm}"}; + const AxisSpec trackNSigmaTPCKaonAxis{20, -10.f, 10.f, "Number of #sigma TPC K^{#pm}"}; + const AxisSpec trackNSigmaTPCProtonAxis{20, -10.f, 10.f, "Number of #sigma TPC proton"}; + const AxisSpec trackNSigmaTOFPionAxis{20, -10.f, 10.f, "Number of #sigma TOF #pi^{#pm}"}; + const AxisSpec trackNSigmaTOFKaonAxis{20, -10.f, 10.f, "Number of #sigma TOF K^{#pm}"}; + const AxisSpec trackNSigmaTOFProtonAxis{20, -10.f, 10.f, "Number of #sigma TOF proton"}; + const AxisSpec trackPDGAxis{binningPDG, "species (-1: not matched, 0: unknown, 1: pi, 2: K, 3: p)"}; + const AxisSpec trackChargeAxis{binningCharge, "charge binning (-1: negative; +1: positive)"}; + const AxisSpec axisVertexNumContrib{binsNumPvContrib, "Number of original PV contributors"}; + const AxisSpec trackIsPvContrib{2, -0.5f, 1.5f, "is PV contributor: 1=yes, 0=no"}; + + histograms.add("Reco/pt", "", kTH1D, {trackPtAxis}); + histograms.add("Reco/itsHits", "Number of hits vs ITS layer;layer ITS", kTH2D, {{8, -1.5, 6.5, "ITS layer"}, {8, -0.5, 7.5, "Number of hits"}}); + + if (addTrackIUinfo) { + histograms.add("Reco/h4ClusterSizeIU", "", kTHnSparseD, {trackPaxis, trackImpParRPhiAxis, trackIUposXaxis, trackIUposYaxis, trackIUposZaxis, trackIUclusterSize}); + histograms.add("Reco/h4ImpParZIU", "", kTHnSparseD, {trackPaxis, trackImpParZAxis, trackIUposXaxis, trackIUposYaxis, trackIUposZaxis}); + } + + isPIDPionApplied = ((nSigmaTPCPionMin > -10.001 && nSigmaTPCPionMax < 10.001) || (nSigmaTOFPionMin > -10.001 && nSigmaTOFPionMax < 10.001)); + if (isPIDPionApplied) { + if (addTrackIUinfo) { + histograms.add("Reco/h4ClusterSizeIU_Pion", "", kTHnSparseD, {trackPaxis, trackImpParRPhiAxis, trackIUposXaxis, trackIUposYaxis, trackIUposZaxis, trackIUclusterSize}); + } + } + isPIDKaonApplied = ((nSigmaTPCKaonMin > -10.001 && nSigmaTPCKaonMax < 10.001) || (nSigmaTOFKaonMin > -10.001 && nSigmaTOFKaonMax < 10.001)); + if (isPIDKaonApplied) { + if (addTrackIUinfo) { + histograms.add("Reco/h4ClusterSizeIU_Kaon", "", kTHnSparseD, {trackPaxis, trackImpParRPhiAxis, trackIUposXaxis, trackIUposYaxis, trackIUposZaxis, trackIUclusterSize}); + } + } + isPIDProtonApplied = ((nSigmaTPCProtonMin > -10.001 && nSigmaTPCProtonMax < 10.001) || (nSigmaTOFProtonMin > -10.001 && nSigmaTOFProtonMax < 10.001)); + if (isPIDProtonApplied) { + if (addTrackIUinfo) { + histograms.add("Reco/h4ClusterSizeIU_Proton", "", kTHnSparseD, {trackPaxis, trackImpParRPhiAxis, trackIUposXaxis, trackIUposYaxis, trackIUposZaxis, trackIUclusterSize}); + } + } + histograms.add("Reco/hNSigmaTPCPion", "", kTH2D, {trackPtAxis, trackNSigmaTPCPionAxis}); + histograms.add("Reco/hNSigmaTPCKaon", "", kTH2D, {trackPtAxis, trackNSigmaTPCKaonAxis}); + histograms.add("Reco/hNSigmaTPCProton", "", kTH2D, {trackPtAxis, trackNSigmaTPCProtonAxis}); + histograms.add("Reco/hNSigmaTOFPion", "", kTH2D, {trackPtAxis, trackNSigmaTOFPionAxis}); + histograms.add("Reco/hNSigmaTOFKaon", "", kTH2D, {trackPtAxis, trackNSigmaTOFKaonAxis}); + histograms.add("Reco/hNSigmaTOFProton", "", kTH2D, {trackPtAxis, trackNSigmaTOFProtonAxis}); + histograms.add("Reco/hNSigmaTPCPion_afterPID", "", kTH2D, {trackPtAxis, trackNSigmaTPCPionAxis}); + histograms.add("Reco/hNSigmaTPCKaon_afterPID", "", kTH2D, {trackPtAxis, trackNSigmaTPCKaonAxis}); + histograms.add("Reco/hNSigmaTPCProton_afterPID", "", kTH2D, {trackPtAxis, trackNSigmaTPCProtonAxis}); + histograms.add("Reco/hNSigmaTOFPion_afterPID", "", kTH2D, {trackPtAxis, trackNSigmaTOFPionAxis}); + histograms.add("Reco/hNSigmaTOFKaon_afterPID", "", kTH2D, {trackPtAxis, trackNSigmaTOFKaonAxis}); + histograms.add("Reco/hNSigmaTOFProton_afterPID", "", kTH2D, {trackPtAxis, trackNSigmaTOFProtonAxis}); + + histograms.add("MC/vertexZ_MCColl", "", kTH1D, {collisionZAxis}); + histograms.add("MC/ptMC", "", kTH1D, {trackPtAxis}); + } + + /// core template process function + template + void processReco(const C& collision, const TrackTable& unfilteredTracks, const T& tracks, + const TrackTableIU& tracksIU, const T_MC& /*mcParticles*/, + o2::aod::BCsWithTimestamps::iterator const& bc) + { + constexpr float toMicrometers = 10000.f; // Conversion from [cm] to [mum] + + /// trigger selection + if (useTriggerkINT7) { + // from Tutorial/src/multiplicityEventTrackSelection.cxx + if (!collision.alias_bit(kINT7)) { + return; + } + } + /// offline event selections + if (usesel8 && !collision.sel8()) { + return; + } + + histograms.fill(HIST("Reco/vertices"), 1); + histograms.fill(HIST("Reco/vertexZ"), collision.posZ()); + histograms.fill(HIST("Reco/numberContributors"), collision.numContrib()); + if constexpr (IS_MC) { + if (collision.has_mcCollision()) { + histograms.fill(HIST("MC/vertexZ_MCColl"), collision.mcCollision().posZ()); + } + } + + /////////////////////////////////// + /// For PV refit /// + /////////////////////////////////// + /// retrieve the tracks contributing to the primary vertex fitting + std::vector vec_globID_contr = {}; + std::vector vec_TrkContributos = {}; + if (fDebug) { + LOG(info) << "\n === New collision"; + } + const int nTrk = unfilteredTracks.size(); + int nContrib = 0; + int nNonContrib = 0; + for (const auto& unfilteredTrack : unfilteredTracks) { + if (!unfilteredTrack.isPVContributor()) { + /// the track di not contribute to fit the primary vertex + nNonContrib++; + continue; + } + vec_globID_contr.push_back(unfilteredTrack.globalIndex()); + vec_TrkContributos.push_back(getTrackParCov(unfilteredTrack)); + nContrib++; + if (fDebug) { + LOG(info) << "---> a contributor! stuff saved"; + LOG(info) << "vec_contrib size: " << vec_TrkContributos.size() << ", nContrib: " << nContrib; + } + } + if (fDebug) { + LOG(info) << "===> nTrk: " << nTrk << ", nContrib: " << nContrib << ", nNonContrib: " << nNonContrib; + } + + if (vec_TrkContributos.size() != collision.numContrib()) { + LOG(info) << "!!! something wrong in the number of contributor tracks for PV fit !!! " << vec_TrkContributos.size() << " vs. " << collision.numContrib(); + return; + } + + std::vector vec_useTrk_PVrefit(vec_globID_contr.size(), true); + + /// Prepare the vertex refitting + // Get the magnetic field for the Propagator + o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT; + // auto bc = collision.bc_as(); + if (mRunNumber != bc.runNumber()) { + o2::parameters::GRPMagField* grpo = ccdb->getForTimeStamp(ccdbPathGrp, bc.timestamp()); + if (grpo != nullptr) { + o2::base::Propagator::initFieldFromGRP(grpo); + o2::base::Propagator::Instance()->setMatLUT(lut); + LOG(info) << "Setting magnetic field to current " << grpo->getL3Current() << " A for run " << bc.runNumber() << " from its GRP CCDB object"; + } else { + LOGF(fatal, "GRP object is not available in CCDB for run=%d at timestamp=%llu", bc.runNumber(), bc.timestamp()); + } + mRunNumber = bc.runNumber(); + } + // build the VertexBase to initialize the vertexer + o2::dataformats::VertexBase Pvtx; + Pvtx.setX(collision.posX()); + Pvtx.setY(collision.posY()); + Pvtx.setZ(collision.posZ()); + Pvtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + // configure PVertexer + o2::vertexing::PVertexer vertexer; + if (removeDiamondConstraint) { + o2::conf::ConfigurableParam::updateFromString("pvertexer.useMeanVertexConstraint=false"); // we want to refit w/o MeanVertex constraint + } + vertexer.init(); + bool PVrefit_doable = vertexer.prepareVertexRefit(vec_TrkContributos, Pvtx); + if (!PVrefit_doable) { + LOG(info) << "Not enough tracks accepted for the refit"; + if (doPVrefit) { + histograms.fill(HIST("Reco/nContrib_PVrefitNotDoable"), collision.numContrib()); + } + } else { + histograms.fill(HIST("Reco/vertices"), 2); + } + + if (fDebug) { + LOG(info) << "prepareVertexRefit = " << PVrefit_doable << " Ncontrib= " << vec_TrkContributos.size() << " Ntracks= " << collision.numContrib() << " Vtx= " << Pvtx.asString(); + } + /////////////////////////////////// + /////////////////////////////////// + + /// loop over tracks + float pt = -999.f; + float p = -999.f; + bool isPvContributor = false; + float impParRPhi = -999.f; + float impParZ = -999.f; + float tpcNSigmaPion = -999.f; + float tpcNSigmaKaon = -999.f; + float tpcNSigmaProton = -999.f; + float tofNSigmaPion = -999.f; + float tofNSigmaKaon = -999.f; + float tofNSigmaProton = -999.f; + float trackIuPosX = -999.f; + float trackIuPosY = -999.f; + float trackIuPosZ = -999.f; + std::array posXYZ = {-999.f, -999.f, -999.f}; + int clusterSizeInLayer0 = -1; + int ntr = tracks.size(); + int cnt = 0; + for (const auto& track : tracks) { + + isPvContributor = track.isPVContributor(); + if (keepOnlyPvContrib && !isPvContributor) { + /// let's skip all tracks that were not PV contributors originally + /// this let us ignore tracks flagged as ambiguous + continue; + } + + /// Specific MC selections + if constexpr (IS_MC) { + if (keepOnlyPhysPrimary) { + /// we want only physical primary particles + if (!track.has_mcParticle()) { + continue; + } + auto particle = track.mcParticle(); + if (keepOnlyPhysPrimary && particle.isPhysicalPrimary()) { + continue; + } + histograms.fill(HIST("MC/ptMC"), particle.pt()); + } else { + if (track.has_mcParticle()) { + auto particle = track.mcParticle(); + histograms.fill(HIST("MC/ptMC"), particle.pt()); + } + } + } + + /// Using the Filter instead + /// if ((keepOnlyGlobalTracks) && (!track.isGlobalTrack())) { + /// /// not a global track (FB 4 with tight DCA cuts) + /// continue; + ///} + + /// apply custom ITS hitmap selections, if asked + if (useCustomITSHitMap && !selector_ITShitmap.IsSelected(track, TrackSelection::TrackCuts::kITSHits)) { + /// skip this track and go on, because it does not satisfy the ITS hit requirements + continue; + } + if (useCustomITSHitMap && customForceITSTPCmatching && (!track.hasITS() || !track.hasTPC())) { + // if (useCustomITSHitMap && customForceITSTPCmatching && track.hasITS()) { ///ATTEMPT: REMOVE TRACKS WITH ITS + /// skip this track because it is not global (no matching ITS-TPC) + continue; + } + int itsNhits = 0; + for (unsigned int i = 0; i < 7; i++) { + if (track.itsClusterMap() & (1 << i)) { + itsNhits += 1; + } + } + bool trkHasITS = false; + for (unsigned int i = 0; i < 7; i++) { + if (track.itsClusterMap() & (1 << i)) { + trkHasITS = true; + histograms.fill(HIST("Reco/itsHits"), i, itsNhits); + } + } + if (!trkHasITS) { + histograms.fill(HIST("Reco/itsHits"), -1, itsNhits); + } + + pt = track.pt(); + p = track.p(); + tpcNSigmaPion = track.tpcNSigmaPi(); + tpcNSigmaKaon = track.tpcNSigmaKa(); + tpcNSigmaProton = track.tpcNSigmaPr(); + tofNSigmaPion = track.tofNSigmaPi(); + tofNSigmaKaon = track.tofNSigmaKa(); + tofNSigmaProton = track.tofNSigmaPr(); + + histograms.fill(HIST("Reco/pt"), pt); + histograms.fill(HIST("Reco/hNSigmaTPCPion"), pt, tpcNSigmaPion); + histograms.fill(HIST("Reco/hNSigmaTPCKaon"), pt, tpcNSigmaKaon); + histograms.fill(HIST("Reco/hNSigmaTPCProton"), pt, tpcNSigmaProton); + histograms.fill(HIST("Reco/hNSigmaTOFPion"), pt, tofNSigmaPion); + histograms.fill(HIST("Reco/hNSigmaTOFKaon"), pt, tofNSigmaKaon); + histograms.fill(HIST("Reco/hNSigmaTOFProton"), pt, tofNSigmaProton); + + histograms.fill(HIST("Reco/vertices_perTrack"), 1); + if (PVrefit_doable) { + histograms.fill(HIST("Reco/vertices_perTrack"), 2); + } + /// PV refitting, if the tracks contributed to this at the beginning + o2::dataformats::VertexBase PVbase_recalculated; + bool recalc_imppar = false; + if (doPVrefit && PVrefit_doable) { + auto it_trk = std::find(vec_globID_contr.begin(), vec_globID_contr.end(), track.globalIndex()); /// track global index + // if( it_trk==vec_globID_contr.end() ) { + // /// not found: this track did not contribute to the initial PV fitting + // continue; + // } + if (it_trk != vec_globID_contr.end()) { + /// this track contributed to the PV fit: let's do the refit without it + const int entry = std::distance(vec_globID_contr.begin(), it_trk); + if (!keepAllTracksPVrefit) { + vec_useTrk_PVrefit[entry] = false; /// remove the track from the PV refitting + } + auto Pvtx_refitted = vertexer.refitVertex(vec_useTrk_PVrefit, Pvtx); // vertex refit + if (fDebug) { + LOG(info) << "refit " << cnt << "/" << ntr << " result = " << Pvtx_refitted.asString(); + } + + /// enable the dca recalculation for the current PV contributor, after removing it from the PV refit + recalc_imppar = true; + + if (Pvtx_refitted.getChi2() < 0 && fillHistoPVrefit) { + LOG(info) << "---> Refitted vertex has bad chi2 = " << Pvtx_refitted.getChi2(); + histograms.fill(HIST("Reco/X_PVrefitChi2minus1"), Pvtx_refitted.getX(), collision.posX()); + histograms.fill(HIST("Reco/Y_PVrefitChi2minus1"), Pvtx_refitted.getY(), collision.posY()); + histograms.fill(HIST("Reco/Z_PVrefitChi2minus1"), Pvtx_refitted.getZ(), collision.posZ()); + histograms.fill(HIST("Reco/nContrib_PVrefitChi2minus1"), collision.numContrib()); + recalc_imppar = false; + } else if (fillHistoPVrefit) { + histograms.fill(HIST("Reco/vertices_perTrack"), 3); + } + // histograms.fill(HIST("Reco/nContrib_vs_Chi2PVrefit"), /*Pvtx_refitted.getNContributors()*/collision.numContrib()-1, Pvtx_refitted.getChi2()); + histograms.fill(HIST("Reco/nContrib_vs_Chi2PVrefit"), vec_useTrk_PVrefit.size() - 1, Pvtx_refitted.getChi2()); + + vec_useTrk_PVrefit[entry] = true; /// restore the track for the next PV refitting + + if (recalc_imppar) { + // fill the histograms for refitted PV with good Chi2 + const double DeltaX = Pvtx.getX() - Pvtx_refitted.getX(); + const double DeltaY = Pvtx.getY() - Pvtx_refitted.getY(); + const double DeltaZ = Pvtx.getZ() - Pvtx_refitted.getZ(); + if (fillHistoPVrefit) { + histograms.fill(HIST("Reco/nContrib_vs_DeltaX_PVrefit"), collision.numContrib(), DeltaX); + histograms.fill(HIST("Reco/nContrib_vs_DeltaY_PVrefit"), collision.numContrib(), DeltaY); + histograms.fill(HIST("Reco/nContrib_vs_DeltaZ_PVrefit"), collision.numContrib(), DeltaZ); + } + // fill the newly calculated PV + PVbase_recalculated.setX(Pvtx_refitted.getX()); + PVbase_recalculated.setY(Pvtx_refitted.getY()); + PVbase_recalculated.setZ(Pvtx_refitted.getZ()); + PVbase_recalculated.setCov(Pvtx_refitted.getSigmaX2(), Pvtx_refitted.getSigmaXY(), Pvtx_refitted.getSigmaY2(), Pvtx_refitted.getSigmaXZ(), Pvtx_refitted.getSigmaYZ(), Pvtx_refitted.getSigmaZ2()); + } + + cnt++; + } + } /// end 'if (doPVrefit && PVrefit_doable)' + + /// impact parameter to the PV + // value calculated wrt global PV (not recalculated) ---> coming from trackextension workflow + impParRPhi = toMicrometers * track.dcaXY(); // dca.getY(); + impParZ = toMicrometers * track.dcaZ(); // dca.getY(); + // updated value after PV recalculation + if (recalc_imppar) { + if (fEnablePulls) { + auto trackParCov = getTrackParCov(track); + o2::dataformats::DCA dcaInfoCov{999, 999, 999, 999, 999}; + if (o2::base::Propagator::Instance()->propagateToDCABxByBz(PVbase_recalculated, trackParCov, 2.f, matCorr, &dcaInfoCov)) { + impParRPhi = dcaInfoCov.getY() * toMicrometers; + impParZ = dcaInfoCov.getZ() * toMicrometers; + } + } else { + auto trackPar = getTrackPar(track); + std::array dcaInfo{-999., -999.}; + if (o2::base::Propagator::Instance()->propagateToDCABxByBz({PVbase_recalculated.getX(), PVbase_recalculated.getY(), PVbase_recalculated.getZ()}, trackPar, 2.f, matCorr, &dcaInfo)) { + impParRPhi = dcaInfo[0] * toMicrometers; + impParZ = dcaInfo[1] * toMicrometers; + } + } + } + + /// retrive track position at inner most update + if (addTrackIUinfo) { + for (const auto& trackIU : tracksIU) { + if (trackIU.globalIndex() == track.globalIndex()) { + o2::track::TrackParCov trackIuParCov = getTrackParCov(trackIU); + trackIuParCov.getXYZGlo(posXYZ); + trackIuPosX = posXYZ[0]; + trackIuPosY = posXYZ[1]; + trackIuPosZ = posXYZ[2]; + clusterSizeInLayer0 = trackIU.itsClsSizeInLayer(0); + } + } + } + + /// all tracks + if ((pt * 1000 - static_cast(pt * 1000)) > downsamplingFraction) { + // downsampling - do not consider the current track + continue; + } + + if (addTrackIUinfo) { + histograms.fill(HIST("Reco/h4ClusterSizeIU"), p, impParRPhi, trackIuPosX, trackIuPosY, trackIuPosZ, clusterSizeInLayer0); + histograms.fill(HIST("Reco/h4ImpParZIU"), p, impParZ, trackIuPosX, trackIuPosY, trackIuPosZ); + } + + if (isPIDPionApplied && nSigmaTPCPionMin < tpcNSigmaPion && tpcNSigmaPion < nSigmaTPCPionMax && nSigmaTOFPionMin < tofNSigmaPion && tofNSigmaPion < nSigmaTOFPionMax) { + /// PID selected pions + if (addTrackIUinfo) { + histograms.fill(HIST("Reco/h4ClusterSizeIU_Pion"), p, impParRPhi, trackIuPosX, trackIuPosY, trackIuPosZ, clusterSizeInLayer0); + } + histograms.fill(HIST("Reco/hNSigmaTPCPion_afterPID"), pt, tpcNSigmaPion); + histograms.fill(HIST("Reco/hNSigmaTOFPion_afterPID"), pt, tofNSigmaPion); + } + if (isPIDKaonApplied && nSigmaTPCKaonMin < tpcNSigmaKaon && tpcNSigmaKaon < nSigmaTPCKaonMax && nSigmaTOFKaonMin < tofNSigmaKaon && tofNSigmaKaon < nSigmaTOFKaonMax) { + /// PID selected kaons + if (addTrackIUinfo) { + histograms.fill(HIST("Reco/h4ClusterSizeIU_Kaon"), p, impParRPhi, trackIuPosX, trackIuPosY, trackIuPosZ, clusterSizeInLayer0); + } + histograms.fill(HIST("Reco/hNSigmaTPCKaon_afterPID"), pt, tpcNSigmaKaon); + histograms.fill(HIST("Reco/hNSigmaTOFKaon_afterPID"), pt, tofNSigmaKaon); + } + if (isPIDProtonApplied && nSigmaTPCProtonMin < tpcNSigmaProton && tpcNSigmaProton < nSigmaTPCProtonMax && nSigmaTOFProtonMin < tofNSigmaProton && tofNSigmaProton < nSigmaTOFProtonMax) { + /// PID selected Protons + if (addTrackIUinfo) { + histograms.fill(HIST("Reco/h4ClusterSizeIU_Proton"), p, impParRPhi, trackIuPosX, trackIuPosY, trackIuPosZ, clusterSizeInLayer0); + } + histograms.fill(HIST("Reco/hNSigmaTPCProton_afterPID"), pt, tpcNSigmaProton); + histograms.fill(HIST("Reco/hNSigmaTOFProton_afterPID"), pt, tofNSigmaProton); + } + } + } /// end processReco +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + WorkflowSpec w{ + adaptAnalysisTask(cfgc)}; + return w; +} From 5dd019bc84b926ae73eec7b22d90687396bc8085 Mon Sep 17 00:00:00 2001 From: cterrevo Date: Fri, 6 Jun 2025 10:25:58 +0200 Subject: [PATCH 1532/1650] [PWGHF] taskXic: Remove PID track tables. Fix magic numbers. (#11458) Co-authored-by: ALICE Action Bot --- PWGHF/D2H/Tasks/taskXic.cxx | 38 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskXic.cxx b/PWGHF/D2H/Tasks/taskXic.cxx index 5c338f8b957..3ef874240ec 100644 --- a/PWGHF/D2H/Tasks/taskXic.cxx +++ b/PWGHF/D2H/Tasks/taskXic.cxx @@ -48,8 +48,13 @@ struct HfTaskXic { Configurable dcaZTrackMax{"dcaZTrackMax", 0.0025, "max. DCAz for track"}; Configurable> binsPt{"binsPt", std::vector{hf_cuts_xic_to_p_k_pi::vecBinsPt}, "pT bin limits"}; - // THnSparse for ML outputScores and Vars Configurable enableTHn{"enableTHn", false, "enable THn for Xic"}; + HfHelper hfHelper; + Service pdg; + + Filter filterSelectCandidates = (aod::hf_sel_candidate_xic::isSelXicToPKPi >= selectionFlagXic || aod::hf_sel_candidate_xic::isSelXicToPiKP >= selectionFlagXic); + + // THnSparse for ML outputScores and Vars ConfigurableAxis thnConfigAxisPt{"thnConfigAxisPt", {36, 0, 36}, ""}; ConfigurableAxis thnConfigAxisMass{"thnConfigAxisMass", {300, 1.98, 2.58}, ""}; ConfigurableAxis thnConfigAxisPtProng{"thnConfigAxisPtProng", {100, 0, 20}, ""}; @@ -61,19 +66,10 @@ struct HfTaskXic { ConfigurableAxis thnConfigAxisBdtScoreSignal{"thnConfigAxisBdtScoreSignal", {100, 0., 1.}, ""}; ConfigurableAxis thnConfigAxisYMC{"thnConfigAxisYMC", {100, -2., 2.}, ""}; // - Service pdg; - HfHelper hfHelper; float etaMaxAcceptance = 0.8; float ptMinAcceptance = 0.1; - using TracksWPid = soa::Join; - - Filter filterSelectCandidates = (aod::hf_sel_candidate_xic::isSelXicToPKPi >= selectionFlagXic || aod::hf_sel_candidate_xic::isSelXicToPiKP >= selectionFlagXic); - - Partition> selectedMCXicCandidates = (aod::hf_sel_candidate_xic::isSelXicToPKPi >= selectionFlagXic || aod::hf_sel_candidate_xic::isSelXicToPiKP >= selectionFlagXic); - HistogramRegistry registry{ "registry", // histo not in pt bins { @@ -257,7 +253,7 @@ struct HfTaskXic { template void analysisData(aod::Collision const& collision, Cands const& candidates, - TracksWPid const& tracks) + aod::TracksWDca const& tracks) { int nTracks = 0; @@ -317,9 +313,9 @@ struct HfTaskXic { registry.fill(HIST("Data/hChi2PCA"), candidate.chi2PCA(), ptCandidate); // PID histos - auto trackProng0 = candidate.template prong0_as(); - auto trackProng1 = candidate.template prong1_as(); - auto trackProng2 = candidate.template prong2_as(); + auto trackProng0 = candidate.template prong0_as(); + auto trackProng1 = candidate.template prong1_as(); + auto trackProng2 = candidate.template prong2_as(); auto momentumProng0 = trackProng0.p(); auto momentumProng1 = trackProng1.p(); @@ -355,10 +351,11 @@ struct HfTaskXic { if (enableTHn) { double massXic(-1); double outputBkg(-1), outputPrompt(-1), outputFD(-1); + const int ternaryCl = 3; if (candidate.isSelXicToPKPi() >= selectionFlagXic) { massXic = hfHelper.invMassXicToPKPi(candidate); if constexpr (useMl) { - if (candidate.mlProbXicToPKPi().size() == 3) { + if (candidate.mlProbXicToPKPi().size() == ternaryCl) { outputBkg = candidate.mlProbXicToPKPi()[0]; /// bkg score outputPrompt = candidate.mlProbXicToPKPi()[1]; /// prompt score outputFD = candidate.mlProbXicToPKPi()[2]; /// non-prompt score @@ -372,7 +369,7 @@ struct HfTaskXic { if (candidate.isSelXicToPiKP() >= selectionFlagXic) { massXic = hfHelper.invMassXicToPiKP(candidate); if constexpr (useMl) { - if (candidate.mlProbXicToPiKP().size() == 3) { + if (candidate.mlProbXicToPiKP().size() == ternaryCl) { outputBkg = candidate.mlProbXicToPiKP()[0]; /// bkg score outputPrompt = candidate.mlProbXicToPiKP()[1]; /// prompt score outputFD = candidate.mlProbXicToPiKP()[2]; /// non-prompt score @@ -389,14 +386,14 @@ struct HfTaskXic { void processDataStd(aod::Collision const& collision, soa::Filtered> const& candidates, - TracksWPid const& tracks) + aod::TracksWDca const& tracks) { analysisData(collision, candidates, tracks); } PROCESS_SWITCH(HfTaskXic, processDataStd, "Process Data with the standard method", true); void processDataWithMl(aod::Collision const& collision, - soa::Filtered> const& candidatesMl, TracksWPid const& tracks) + soa::Filtered> const& candidatesMl, aod::TracksWDca const& tracks) { analysisData(collision, candidatesMl, tracks); } @@ -494,6 +491,7 @@ struct HfTaskXic { if (enableTHn) { double massXic(-1); double outputBkg(-1), outputPrompt(-1), outputFD(-1); + const int ternaryCl = 3; bool allProngsInAcceptance = false; if ((candidate.isSelXicToPKPi() >= selectionFlagXic) && pdgCodeProng0 == kProton) { massXic = hfHelper.invMassXicToPKPi(candidate); @@ -505,7 +503,7 @@ struct HfTaskXic { } allProngsInAcceptance = isProngInAcceptance(etaProngs[0], ptProngs[0]) && isProngInAcceptance(etaProngs[1], ptProngs[1]) && isProngInAcceptance(etaProngs[2], ptProngs[2]); if constexpr (useMl) { - if (candidate.mlProbXicToPKPi().size() == 3) { + if (candidate.mlProbXicToPKPi().size() == ternaryCl) { outputBkg = candidate.mlProbXicToPKPi()[0]; /// bkg score outputPrompt = candidate.mlProbXicToPKPi()[1]; /// prompt score outputFD = candidate.mlProbXicToPKPi()[2]; /// non-prompt score @@ -526,7 +524,7 @@ struct HfTaskXic { } allProngsInAcceptance = isProngInAcceptance(etaProngs[0], ptProngs[0]) && isProngInAcceptance(etaProngs[1], ptProngs[1]) && isProngInAcceptance(etaProngs[2], ptProngs[2]); if constexpr (useMl) { - if (candidate.mlProbXicToPiKP().size() == 3) { + if (candidate.mlProbXicToPiKP().size() == ternaryCl) { outputBkg = candidate.mlProbXicToPiKP()[0]; /// bkg score outputPrompt = candidate.mlProbXicToPiKP()[1]; /// prompt score outputFD = candidate.mlProbXicToPiKP()[2]; /// non-prompt score From 15178cf0dd27344d44e4e94bc328d017a1581257 Mon Sep 17 00:00:00 2001 From: Fabrizio Chinu <91954233+fchinu@users.noreply.github.com> Date: Fri, 6 Jun 2025 10:28:41 +0200 Subject: [PATCH 1533/1650] [PWGHF] Add interaction rate selection to HF PID task (#11474) --- PWGHF/Tasks/CMakeLists.txt | 2 +- PWGHF/Tasks/taskPidStudies.cxx | 27 ++++++++++++++++++++++----- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/PWGHF/Tasks/CMakeLists.txt b/PWGHF/Tasks/CMakeLists.txt index 658988d070a..b212b705b23 100644 --- a/PWGHF/Tasks/CMakeLists.txt +++ b/PWGHF/Tasks/CMakeLists.txt @@ -46,7 +46,7 @@ o2physics_add_dpl_workflow(task-multiplicity-estimator-correlation o2physics_add_dpl_workflow(task-pid-studies SOURCES taskPidStudies.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::EventFilteringUtils + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::EventFilteringUtils O2Physics::AnalysisCCDB COMPONENT_NAME Analysis) # o2physics_add_dpl_workflow(task-sel-optimisation diff --git a/PWGHF/Tasks/taskPidStudies.cxx b/PWGHF/Tasks/taskPidStudies.cxx index 6f5056d9a9c..ad3943a7134 100644 --- a/PWGHF/Tasks/taskPidStudies.cxx +++ b/PWGHF/Tasks/taskPidStudies.cxx @@ -27,6 +27,7 @@ #include "Framework/runDataProcessing.h" #include "Framework/HistogramRegistry.h" +#include "Common/CCDB/ctpRateFetcher.h" #include "Common/DataModel/PIDResponse.h" #include "Common/DataModel/Centrality.h" #include "Common/DataModel/Multiplicity.h" @@ -98,11 +99,12 @@ DECLARE_SOA_COLUMN(NSigmaTpcBachKa, nSigmaTpcBachKa, float); //! nSigmaTPC of ba DECLARE_SOA_COLUMN(NSigmaTofBachKa, nSigmaTofBachKa, float); //! nSigmaTOF of bachelor with kaon hypothesis // Common columns -DECLARE_SOA_COLUMN(OccupancyFt0c, occupancyFt0c, float); //! Occupancy from FT0C -DECLARE_SOA_COLUMN(OccupancyIts, occupancyIts, float); //! Occupancy from ITS -DECLARE_SOA_COLUMN(CentralityFT0C, centralityFT0C, float); //! Centrality from FT0C -DECLARE_SOA_COLUMN(CentralityFT0M, centralityFT0M, float); //! Centrality from FT0M -DECLARE_SOA_COLUMN(CandFlag, candFlag, int); //! Flag for MC matching +DECLARE_SOA_COLUMN(OccupancyFt0c, occupancyFt0c, float); //! Occupancy from FT0C +DECLARE_SOA_COLUMN(OccupancyIts, occupancyIts, float); //! Occupancy from ITS +DECLARE_SOA_COLUMN(CentralityFT0C, centralityFT0C, float); //! Centrality from FT0C +DECLARE_SOA_COLUMN(CentralityFT0M, centralityFT0M, float); //! Centrality from FT0M +DECLARE_SOA_COLUMN(InteractionRate, interactionRate, double); //! Centrality from FT0M +DECLARE_SOA_COLUMN(CandFlag, candFlag, int); //! Flag for MC matching } // namespace pid_studies DECLARE_SOA_TABLE(PidV0s, "AOD", "PIDV0S", //! Table with PID information @@ -132,6 +134,7 @@ DECLARE_SOA_TABLE(PidV0s, "AOD", "PIDV0S", //! Table with PID information pid_studies::OccupancyIts, pid_studies::CentralityFT0C, pid_studies::CentralityFT0M, + pid_studies::InteractionRate, pid_studies::CandFlag); DECLARE_SOA_TABLE(PidCascades, "AOD", "PIDCASCADES", //! Table with PID information @@ -152,6 +155,7 @@ DECLARE_SOA_TABLE(PidCascades, "AOD", "PIDCASCADES", //! Table with PID informat pid_studies::OccupancyIts, pid_studies::CentralityFT0C, pid_studies::CentralityFT0M, + pid_studies::InteractionRate, pid_studies::CandFlag); } // namespace o2::aod @@ -172,6 +176,8 @@ struct HfTaskPidStudies { Configurable massLambdaMax{"massLambdaMax", 1.3, "Maximum mass for lambda"}; Configurable massOmegaMin{"massOmegaMin", 1.5, "Minimum mass for omega"}; Configurable massOmegaMax{"massOmegaMax", 1.8, "Maximum mass for omega"}; + Configurable interactionRateMin{"interactionRateMin", -1, "Minimum interaction rate (kHz)"}; + Configurable interactionRateMax{"interactionRateMax", 1.e20, "Maximum interaction rate (kHz)"}; Configurable radiusMax{"radiusMax", 2.3, "Maximum decay radius (cm)"}; Configurable cosPaMin{"cosPaMin", 0.98, "Minimum cosine of pointing angle"}; Configurable dcaV0DaughtersMax{"dcaV0DaughtersMax", 0.2, "Maximum DCA among the V0 daughters (cm)"}; @@ -181,6 +187,7 @@ struct HfTaskPidStudies { Configurable qtArmenterosMaxForLambda{"qtArmenterosMaxForLambda", 0.12, "Minimum Armenteros' qt for (anti)Lambda"}; Configurable downSampleBkgFactor{"downSampleBkgFactor", 1., "Fraction of candidates to keep"}; Configurable ptMaxForDownSample{"ptMaxForDownSample", 10., "Maximum pt for the application of the downsampling factor"}; + Configurable ctpFetcherSource{"ctpFetcherSource", "T0VTX", "Source for CTP rate fetching, e.g. T0VTX, T0CE, T0SC, ZNC (hadronic)"}; Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; using PidTracks = soa::Join; using CascsMcRec = soa::Join; + ctpRateFetcher rateFetcher; HfEventSelection hfEvSel; HfEventSelectionMc hfEvSelMc; + double interactionRate{-1.}; o2::framework::Service ccdb; HistogramRegistry registry{"registry", {}}; @@ -259,6 +268,7 @@ struct HfTaskPidStudies { coll.trackOccupancyInTimeRange(), coll.centFT0C(), coll.centFT0M(), + interactionRate, flag); } else { const auto& bachTrack = candidate.template bachelor_as(); @@ -280,6 +290,7 @@ struct HfTaskPidStudies { coll.trackOccupancyInTimeRange(), coll.centFT0C(), coll.centFT0M(), + interactionRate, flag); } } @@ -328,6 +339,12 @@ struct HfTaskPidStudies { template bool isCollSelected(const Coll& coll) { + auto bc = coll.template bc_as(); + interactionRate = rateFetcher.fetch(ccdb.service, bc.timestamp(), bc.runNumber(), ctpFetcherSource.value) * 1.e-3; // convert to kHz + if (interactionRate < interactionRateMin || interactionRate > interactionRateMax) { + return false; + } + float cent{-1.f}; const auto rejectionMask = hfEvSel.getHfCollisionRejectionMask(coll, cent, ccdb, registry); /// monitor the satisfied event selections From 85d0d5454e4af5456051410916c60d24f1e5e351 Mon Sep 17 00:00:00 2001 From: Lucia Anna Tarasovicova Date: Fri, 6 Jun 2025 13:47:24 +0200 Subject: [PATCH 1534/1650] [PWGLF] PWGLF Change in hStrangeCorrelation.cxx (#11488) Co-authored-by: Lucia Anna Tarasovicova --- PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx index 606c5713d5e..f9952efca40 100644 --- a/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx +++ b/PWGLF/Tasks/Strangeness/hStrangeCorrelation.cxx @@ -1109,8 +1109,8 @@ struct HStrangeCorrelation { if (TESTBIT(doCorrelation, 8)) { histos.add("hAsssocTrackEtaVsPtVsPhi", "", kTH3F, {axisPtQA, axisEta, axisPhi}); - histos.add("hAssocPrimaryEtaVsPt", "", kTH3F, {axisPtQA, axisEta, axisMultNDim}); - histos.add("hAssocHadronsAllSelectedEtaVsPt", "", kTH3F, {axisPtQA, axisEta, axisMultNDim}); + histos.add("hAssocPrimaryEtaVsPt", "", kTH3F, {axisPtQA, axisEta, axisMult}); + histos.add("hAssocHadronsAllSelectedEtaVsPt", "", kTH3F, {axisPtQA, axisEta, axisMult}); histos.add("hAssocPtResolution", ";p_{T}^{reconstructed} (GeV/c); p_{T}^{generated} (GeV/c)", kTH2F, {axisPtQA, axisPtQA}); } From 8e7564b2a5062128a2860a83be859a5578a0c158 Mon Sep 17 00:00:00 2001 From: dajones2 <140733426+dajones2@users.noreply.github.com> Date: Fri, 6 Jun 2025 16:17:02 +0100 Subject: [PATCH 1535/1650] [PWGJE] Changing outlier rejection on response to the event level (#11481) --- PWGJE/Tasks/jetHadronRecoil.cxx | 118 ++++++++++++++++---------------- 1 file changed, 60 insertions(+), 58 deletions(-) diff --git a/PWGJE/Tasks/jetHadronRecoil.cxx b/PWGJE/Tasks/jetHadronRecoil.cxx index 018814cdeeb..71946c49aee 100644 --- a/PWGJE/Tasks/jetHadronRecoil.cxx +++ b/PWGJE/Tasks/jetHadronRecoil.cxx @@ -108,7 +108,6 @@ struct JetHadronRecoil { 0.57, 0.60}; AxisSpec dRAxis = {dRBinning, "#Delta R"}; - AxisSpec ptAxisDet = {ptBinningDet, "#it{p}_{T,det} (GeV/c)"}; AxisSpec ptAxisPart = {ptBinningPart, "#it{p}_{T,part} (GeV/c)"}; AxisSpec phiAxisDet = {100, 0.0, o2::constants::math::TwoPI, "#phi_{det}"}; @@ -145,6 +144,8 @@ struct JetHadronRecoil { {"hPtPart", "Particle p_{T};p_{T};entries", {HistType::kTH1F, {{200, 0, 200}}}}, {"hEtaPart", "Particle #eta;#eta;entries", {HistType::kTH1F, {{100, -1.0, 1.0}}}}, {"hPhiPart", "Particle #phi;#phi;entries", {HistType::kTH1F, {{100, 0.0, o2::constants::math::TwoPI}}}}, + {"hPart3D", "3D tracks histogram;p_{T};#eta;#phi", {HistType::kTH3F, {{200, 0, 200}, {100, -1.0, 1.0}, {100, 0.0, o2::constants::math::TwoPI}}}}, + {"hPtPartPtHard", "Track p_{T} vs #hat{p};p_{T};#frac{p_{T}}{#hat{p}}", {HistType::kTH2F, {{200, 0, 200}, {20, 0, 5}}}}, {"hDeltaR", "#DeltaR;#DeltaR;#frac{dN_{jets}}{d#DeltaR}", {HistType::kTH1F, {dRAxis}}}, {"hDeltaRPart", "Particle #DeltaR;#DeltaR;#frac{1}{N_{jets}}#frac{dN_{jets}}{d#DeltaR}", {HistType::kTH1F, {dRAxis}}}, {"hDeltaRpT", "jet p_{T} vs #DeltaR;p_{T,jet};#DeltaR", {HistType::kTH2F, {{500, -100, 400}, dRAxis}}}, @@ -330,7 +331,9 @@ struct JetHadronRecoil { { bool isSigCol; std::vector phiTTAr; + std::vector ptTTAr; double phiTT = 0; + double ptTT = 0; int trigNumber = 0; int nTT = 0; float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); @@ -354,27 +357,34 @@ struct JetHadronRecoil { } if (isSigCol && particle.pt() < ptTTsigMax && particle.pt() > ptTTsigMin) { phiTTAr.push_back(particle.phi()); + ptTTAr.push_back(particle.pt()); nTT++; } if (!isSigCol && particle.pt() < ptTTrefMax && particle.pt() > ptTTrefMin) { phiTTAr.push_back(particle.phi()); + ptTTAr.push_back(particle.pt()); nTT++; } registry.fill(HIST("hPtPart"), particle.pt(), weight); registry.fill(HIST("hEtaPart"), particle.eta(), weight); registry.fill(HIST("hPhiPart"), particle.phi(), weight); + registry.fill(HIST("hPart3D"), particle.pt(), particle.eta(), particle.phi(), weight); + registry.fill(HIST("hPtPartPtHard"), particle.pt(), particle.pt() / pTHat, weight); } if (nTT > 0) { trigNumber = rand->Integer(nTT); phiTT = phiTTAr[trigNumber]; + ptTT = ptTTAr[trigNumber]; if (isSigCol) { registry.fill(HIST("hNtrig"), 1.5, weight); registry.fill(HIST("hSigEventTriggers"), nTT, weight); + registry.fill(HIST("hSignalTriggersPtHard"), ptTT / pTHat, weight); } if (!isSigCol) { registry.fill(HIST("hNtrig"), 0.5, weight); registry.fill(HIST("hRefEventTriggers"), nTT, weight); + registry.fill(HIST("hReferenceTriggersPtHard"), ptTT / pTHat, weight); } } @@ -405,6 +415,7 @@ struct JetHadronRecoil { registry.fill(HIST("hSignalPtDPhi"), dphi, jet.pt(), weight); if (std::abs(dphi - o2::constants::math::PI) < 0.6) { registry.fill(HIST("hSignalPt"), jet.pt(), weight); + registry.fill(HIST("hSignalPtHard"), jet.pt(), ptTT / pTHat, weight); } } if (!isSigCol) { @@ -416,6 +427,7 @@ struct JetHadronRecoil { registry.fill(HIST("hReferencePtDPhi"), dphi, jet.pt(), weight); if (std::abs(dphi - o2::constants::math::PI) < 0.6) { registry.fill(HIST("hReferencePt"), jet.pt(), weight); + registry.fill(HIST("hReferencePtHard"), jet.pt(), ptTT / pTHat, weight); } } } @@ -423,46 +435,48 @@ struct JetHadronRecoil { } template - void fillMatchedHistograms(T const& jetBase, V const& mcdjetsWTA, W const& mcpjetsWTA, U const&, X const& tracks, Y const& particles, float weight = 1.0, float rho = 0.0) + void fillMatchedHistograms(T const& jetsBase, V const& mcdjetsWTA, W const& mcpjetsWTA, U const&, X const& tracks, Y const& particles, float weight = 1.0, float rho = 0.0) { - double dR = 0; - double dRp = 0; - - float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); - if (jetBase.pt() > pTHatMaxMCD * pTHat) { - return; - } + for (const auto& jetBase : jetsBase) { + double dR = 0; + double dRp = 0; - for (const auto& mcdjetWTA : mcdjetsWTA) { - double djet = RecoDecay::sqrtSumOfSquares(RecoDecay::constrainAngle(jetBase.phi() - mcdjetWTA.phi(), -o2::constants::math::PI), jetBase.eta() - mcdjetWTA.eta()); - if (mcdjetWTA.pt() > pTHatMaxMCD * pTHat) { - continue; - } - if (djet < 0.6 * jetR) { - dR = djet; - break; + float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); + if (jetBase.pt() > pTHatMaxMCD * pTHat) { + return; } - } - - dR = getWTAaxisDifference(jetBase, mcdjetsWTA, tracks, true); - if (jetBase.has_matchedJetGeo()) { - for (const auto& jetTag : jetBase.template matchedJetGeo_as>()) { - if (jetTag.pt() > pTHatMaxMCP * pTHat) { + for (const auto& mcdjetWTA : mcdjetsWTA) { + double djet = RecoDecay::sqrtSumOfSquares(RecoDecay::constrainAngle(jetBase.phi() - mcdjetWTA.phi(), -o2::constants::math::PI), jetBase.eta() - mcdjetWTA.eta()); + if (mcdjetWTA.pt() > pTHatMaxMCD * pTHat) { continue; } + if (djet < 0.6 * jetR) { + dR = djet; + break; + } + } + + dR = getWTAaxisDifference(jetBase, mcdjetsWTA, tracks, true); + + if (jetBase.has_matchedJetGeo()) { + for (const auto& jetTag : jetBase.template matchedJetGeo_as>()) { + if (jetTag.pt() > pTHatMaxMCP * pTHat) { + return; + } - dRp = getWTAaxisDifference(jetTag, mcpjetsWTA, particles, true); - - registry.fill(HIST("hPtMatched"), jetBase.pt() - (rho * jetBase.area()), jetTag.pt(), weight); - registry.fill(HIST("hPhiMatched"), jetBase.phi(), jetTag.phi(), weight); - registry.fill(HIST("hPtResolution"), jetTag.pt(), (jetTag.pt() - (jetBase.pt() - (rho * jetBase.area()))) / jetTag.pt(), weight); - registry.fill(HIST("hPhiResolution"), jetTag.pt(), jetTag.phi() - jetBase.phi(), weight); - registry.fill(HIST("hDeltaRMatched"), dR, dRp, weight); - registry.fill(HIST("hDeltaRResolution"), jetTag.pt(), dRp - dR, weight); - registry.fill(HIST("hFullMatching"), jetBase.pt() - (rho * jetBase.area()), jetTag.pt(), jetBase.phi(), jetTag.phi(), dR, dRp, weight); - registry.fill(HIST("hPtMatched1d"), jetTag.pt(), weight); - registry.fill(HIST("hDeltaRMatched1d"), dRp, weight); + dRp = getWTAaxisDifference(jetTag, mcpjetsWTA, particles, true); + + registry.fill(HIST("hPtMatched"), jetBase.pt() - (rho * jetBase.area()), jetTag.pt(), weight); + registry.fill(HIST("hPhiMatched"), jetBase.phi(), jetTag.phi(), weight); + registry.fill(HIST("hPtResolution"), jetTag.pt(), (jetTag.pt() - (jetBase.pt() - (rho * jetBase.area()))) / jetTag.pt(), weight); + registry.fill(HIST("hPhiResolution"), jetTag.pt(), jetTag.phi() - jetBase.phi(), weight); + registry.fill(HIST("hDeltaRMatched"), dR, dRp, weight); + registry.fill(HIST("hDeltaRResolution"), jetTag.pt(), dRp - dR, weight); + registry.fill(HIST("hFullMatching"), jetBase.pt() - (rho * jetBase.area()), jetTag.pt(), jetBase.phi(), jetTag.phi(), dR, dRp, weight); + registry.fill(HIST("hPtMatched1d"), jetTag.pt(), weight); + registry.fill(HIST("hDeltaRMatched1d"), dRp, weight); + } } } } @@ -626,9 +640,7 @@ struct JetHadronRecoil { } registry.fill(HIST("hZvtxSelected"), collision.posZ()); const auto& mcpjetsWTACut = mcpjetsWTA.sliceBy(partJetsPerCollision, collision.mcCollisionId()); - for (const auto& mcdjet : mcdjets) { - fillMatchedHistograms(mcdjet, mcdjetsWTA, mcpjetsWTACut, mcpjets, tracks, particles); - } + fillMatchedHistograms(mcdjets, mcdjetsWTA, mcpjetsWTACut, mcpjets, tracks, particles); } PROCESS_SWITCH(JetHadronRecoil, processJetsMCPMCDMatched, "process MC matched (inc jets)", false); @@ -649,20 +661,18 @@ struct JetHadronRecoil { } registry.fill(HIST("hZvtxSelected"), collision.posZ()); const auto& mcpjetsWTACut = mcpjetsWTA.sliceBy(partJetsPerCollision, collision.mcCollisionId()); - for (const auto& mcdjet : mcdjets) { - fillMatchedHistograms(mcdjet, mcdjetsWTA, mcpjetsWTACut, mcpjets, tracks, particles, 1.0, collision.rho()); - } + fillMatchedHistograms(mcdjets, mcdjetsWTA, mcpjetsWTACut, mcpjets, tracks, particles); } PROCESS_SWITCH(JetHadronRecoil, processJetsMCPMCDMatchedWithRhoSubtraction, "process MC matched (inc jets) with rho subtraction", false); void processJetsMCPMCDMatchedWeighted(soa::Filtered::iterator const& collision, - soa::Filtered> const& mcdjets, + soa::Filtered> const& mcdjets, soa::Filtered> const& mcdjetsWTA, soa::Filtered> const& mcpjetsWTA, aod::JetTracks const& tracks, aod::JetParticles const& particles, aod::JetMcCollisions const&, - soa::Filtered> const& mcpjets) + soa::Filtered> const& mcpjets) { if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { return; @@ -672,20 +682,18 @@ struct JetHadronRecoil { } registry.fill(HIST("hZvtxSelected"), collision.posZ()); const auto& mcpjetsWTACut = mcpjetsWTA.sliceBy(partJetsPerCollision, collision.mcCollisionId()); - for (const auto& mcdjet : mcdjets) { - fillMatchedHistograms(mcdjet, mcdjetsWTA, mcpjetsWTACut, mcpjets, tracks, particles, mcdjet.eventWeight()); - } + fillMatchedHistograms(mcdjets, mcdjetsWTA, mcpjetsWTACut, mcpjets, tracks, particles, collision.mcCollision().weight()); } PROCESS_SWITCH(JetHadronRecoil, processJetsMCPMCDMatchedWeighted, "process MC matched with event weights (inc jets)", false); void processJetsMCPMCDMatchedWeightedWithRhoSubtraction(soa::Filtered>::iterator const& collision, - soa::Filtered> const& mcdjets, + soa::Filtered> const& mcdjets, soa::Filtered> const& mcdjetsWTA, soa::Filtered> const& mcpjetsWTA, aod::JetTracks const& tracks, aod::JetParticles const& particles, aod::JetMcCollisions const&, - soa::Filtered> const& mcpjets) + soa::Filtered> const& mcpjets) { if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { return; @@ -695,9 +703,7 @@ struct JetHadronRecoil { } registry.fill(HIST("hZvtxSelected"), collision.posZ()); const auto& mcpjetsWTACut = mcpjetsWTA.sliceBy(partJetsPerCollision, collision.mcCollisionId()); - for (const auto& mcdjet : mcdjets) { - fillMatchedHistograms(mcdjet, mcdjetsWTA, mcpjetsWTACut, mcpjets, tracks, particles, mcdjet.eventWeight(), collision.rho()); - } + fillMatchedHistograms(mcdjets, mcdjetsWTA, mcpjetsWTACut, mcpjets, tracks, particles, collision.mcCollision().weight(), collision.rho()); } PROCESS_SWITCH(JetHadronRecoil, processJetsMCPMCDMatchedWeightedWithRhoSubtraction, "process MC matched with event weights (inc jets) and rho subtraction", false); @@ -726,21 +732,19 @@ struct JetHadronRecoil { } } if (ishJetEvent) { - for (const auto& mcdjet : mcdjets) { - fillMatchedHistograms(mcdjet, mcdjetsWTA, mcpjetsWTACut, mcpjets, tracks, particles); - } + fillMatchedHistograms(mcdjets, mcdjetsWTA, mcpjetsWTACut, mcpjets, tracks, particles); } } PROCESS_SWITCH(JetHadronRecoil, processRecoilJetsMCPMCDMatched, "process MC matched (recoil jets)", false); void processRecoilJetsMCPMCDMatchedWeighted(soa::Filtered::iterator const& collision, - soa::Filtered> const& mcdjets, + soa::Filtered> const& mcdjets, soa::Filtered> const& mcdjetsWTA, soa::Filtered> const& mcpjetsWTA, soa::Filtered const& tracks, soa::Filtered const& particles, aod::JetMcCollisions const&, - soa::Filtered> const& mcpjets) + soa::Filtered> const& mcpjets) { if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { return; @@ -758,9 +762,7 @@ struct JetHadronRecoil { } } if (ishJetEvent) { - for (const auto& mcdjet : mcdjets) { - fillMatchedHistograms(mcdjet, mcdjetsWTA, mcpjetsWTACut, mcpjets, tracks, particles, mcdjet.eventWeight()); - } + fillMatchedHistograms(mcdjets, mcdjetsWTA, mcpjetsWTACut, mcpjets, tracks, particles, collision.mcCollision().weight()); } } PROCESS_SWITCH(JetHadronRecoil, processRecoilJetsMCPMCDMatchedWeighted, "process MC matched with event weights (recoil jets)", false); From 380619cc446a1eff9c8a4b22e35a94cb0b3919e3 Mon Sep 17 00:00:00 2001 From: Sergio Garcia <47090312+singiamtel@users.noreply.github.com> Date: Fri, 6 Jun 2025 17:18:50 +0200 Subject: [PATCH 1536/1650] [Common,ALICE3,PWGLF,PWGUD,DPG,Tutorial] Import system libraries using angle brackets (#11454) --- ALICE3/Core/DelphesO2LutWriter.cxx | 2 +- Common/CCDB/macros/upload_event_selection_params.C | 4 ++-- Common/CCDB/macros/upload_event_selection_params_run3.C | 4 ++-- DPG/Tasks/AOTEvent/dEdxVsOccupancyWithTrackQAinfo.cxx | 2 +- DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx | 2 +- DPG/Tasks/AOTTrack/qaEventTrack.cxx | 4 ++-- DPG/Tasks/AOTTrack/qaImpPar.cxx | 6 +++--- DPG/Tasks/AOTTrack/qaMatchEff.cxx | 6 +++--- .../TableProducer/Strangeness/hStrangeCorrelationFilter.cxx | 2 +- PWGUD/Core/SGTrackSelector.h | 2 +- PWGUD/Core/UPCJpsiCentralBarrelCorrHelper.h | 2 +- PWGUD/Tasks/eventByevent.cxx | 2 +- PWGUD/Tasks/exclusivePentaquark.cxx | 2 +- PWGUD/Tasks/exclusivePhi.cxx | 2 +- PWGUD/Tasks/exclusivePhiLeptons.cxx | 2 +- PWGUD/Tasks/exclusivePhiLeptonsTrees.cxx | 2 +- PWGUD/Tasks/exclusiveTwoProtons.cxx | 2 +- PWGUD/Tasks/exclusiveTwoProtonsSG.cxx | 2 +- PWGUD/Tasks/polarisationRho.cxx | 2 +- PWGUD/Tasks/sgD0Analyzer.cxx | 2 +- PWGUD/Tasks/sgExclOmega.cxx | 2 +- PWGUD/Tasks/sgExclusivePhi.cxx | 2 +- PWGUD/Tasks/sgExclusivePhiITSselections.cxx | 2 +- PWGUD/Tasks/sgFourPiAnalyzer.cxx | 2 +- PWGUD/Tasks/sgInclJpsi.cxx | 2 +- PWGUD/Tasks/sgSixPiAnalyzer.cxx | 2 +- PWGUD/Tasks/sgSpectraAnalyzer.cxx | 2 +- PWGUD/Tasks/sgTwoPiAnalyzer.cxx | 2 +- PWGUD/Tasks/upcForward.cxx | 2 +- PWGUD/Tasks/upcPionAnalysis.cxx | 2 +- PWGUD/Tasks/upcRhoAnalysis.cxx | 2 +- PWGUD/Tasks/upcRhoPrimeAnalysis.cxx | 2 +- Tutorials/PWGUD/UDTutorial_05.cxx | 2 +- Tutorials/PWGUD/UDTutorial_07.cxx | 2 +- 34 files changed, 41 insertions(+), 41 deletions(-) diff --git a/ALICE3/Core/DelphesO2LutWriter.cxx b/ALICE3/Core/DelphesO2LutWriter.cxx index 65608d592e9..f3cba264b11 100644 --- a/ALICE3/Core/DelphesO2LutWriter.cxx +++ b/ALICE3/Core/DelphesO2LutWriter.cxx @@ -23,7 +23,7 @@ #include "ALICE3/Core/DelphesO2TrackSmearer.h" #include "ALICE3/Core/DelphesO2LutWriter.h" -#include "iostream" +#include #include "TMatrixD.h" #include "TVectorD.h" #include "TAxis.h" diff --git a/Common/CCDB/macros/upload_event_selection_params.C b/Common/CCDB/macros/upload_event_selection_params.C index 5d63cf49be8..cafc863ab03 100644 --- a/Common/CCDB/macros/upload_event_selection_params.C +++ b/Common/CCDB/macros/upload_event_selection_params.C @@ -12,8 +12,8 @@ #include "CCDB/CcdbApi.h" #include "CCDB/BasicCCDBManager.h" #include "TString.h" -#include "map" -#include "string" +#include +#include #include "EventSelectionParams.h" using std::map; using std::string; diff --git a/Common/CCDB/macros/upload_event_selection_params_run3.C b/Common/CCDB/macros/upload_event_selection_params_run3.C index b439959fe1c..f81491949c6 100644 --- a/Common/CCDB/macros/upload_event_selection_params_run3.C +++ b/Common/CCDB/macros/upload_event_selection_params_run3.C @@ -11,8 +11,8 @@ #include "CCDB/CcdbApi.h" #include "TString.h" -#include "map" -#include "string" +#include +#include #include "EventSelectionParams.h" using std::map; using std::string; diff --git a/DPG/Tasks/AOTEvent/dEdxVsOccupancyWithTrackQAinfo.cxx b/DPG/Tasks/AOTEvent/dEdxVsOccupancyWithTrackQAinfo.cxx index 36af0603ee8..c87fd48bc99 100644 --- a/DPG/Tasks/AOTEvent/dEdxVsOccupancyWithTrackQAinfo.cxx +++ b/DPG/Tasks/AOTEvent/dEdxVsOccupancyWithTrackQAinfo.cxx @@ -15,7 +15,7 @@ /// \author Igor Altsybeev #include -#include "map" +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" diff --git a/DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx b/DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx index c6dbbe1a17a..a76dc9ea0f7 100644 --- a/DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx +++ b/DPG/Tasks/AOTEvent/detectorOccupancyQa.cxx @@ -15,7 +15,7 @@ /// \author Igor Altsybeev #include -#include "map" +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" diff --git a/DPG/Tasks/AOTTrack/qaEventTrack.cxx b/DPG/Tasks/AOTTrack/qaEventTrack.cxx index 847ec4f0388..09590267ed8 100644 --- a/DPG/Tasks/AOTTrack/qaEventTrack.cxx +++ b/DPG/Tasks/AOTTrack/qaEventTrack.cxx @@ -36,8 +36,8 @@ #include "Common/Core/TrackSelectionDefaults.h" #include "Common/TableProducer/PID/pidTOFBase.h" -#include "string" -#include "vector" +#include +#include using namespace o2; using namespace o2::framework; diff --git a/DPG/Tasks/AOTTrack/qaImpPar.cxx b/DPG/Tasks/AOTTrack/qaImpPar.cxx index 1f7494c9395..2ff3ca3761c 100644 --- a/DPG/Tasks/AOTTrack/qaImpPar.cxx +++ b/DPG/Tasks/AOTTrack/qaImpPar.cxx @@ -34,9 +34,9 @@ #include "DataFormatsCalibration/MeanVertexObject.h" #include "CommonConstants/GeomConstants.h" -#include "iostream" -#include "vector" -#include "set" +#include +#include +#include using namespace o2::framework; using namespace o2::framework::expressions; diff --git a/DPG/Tasks/AOTTrack/qaMatchEff.cxx b/DPG/Tasks/AOTTrack/qaMatchEff.cxx index ddcdf65766e..704d3fa89ad 100644 --- a/DPG/Tasks/AOTTrack/qaMatchEff.cxx +++ b/DPG/Tasks/AOTTrack/qaMatchEff.cxx @@ -32,9 +32,9 @@ #include "Framework/RunningWorkflowInfo.h" #include "Framework/runDataProcessing.h" // -#include "string" -#include "vector" -#include "set" +#include +#include +#include // namespace extConfPar { diff --git a/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx b/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx index 6fdccd95a51..61f9e2f5086 100644 --- a/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx +++ b/PWGLF/TableProducer/Strangeness/hStrangeCorrelationFilter.cxx @@ -30,7 +30,7 @@ #include "Common/DataModel/Centrality.h" #include "CCDB/BasicCCDBManager.h" #include "TF1.h" -#include "string" +#include #include #include "EventFiltering/Zorro.h" diff --git a/PWGUD/Core/SGTrackSelector.h b/PWGUD/Core/SGTrackSelector.h index 1b68ab0ddba..4288ef89e80 100644 --- a/PWGUD/Core/SGTrackSelector.h +++ b/PWGUD/Core/SGTrackSelector.h @@ -21,7 +21,7 @@ #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "Framework/O2DatabasePDGPlugin.h" -#include "iostream" +#include #include "PWGUD/DataModel/UDTables.h" #include "PWGUD/Core/SGSelector.h" #include diff --git a/PWGUD/Core/UPCJpsiCentralBarrelCorrHelper.h b/PWGUD/Core/UPCJpsiCentralBarrelCorrHelper.h index 0857d6bab1d..955601495e6 100644 --- a/PWGUD/Core/UPCJpsiCentralBarrelCorrHelper.h +++ b/PWGUD/Core/UPCJpsiCentralBarrelCorrHelper.h @@ -19,7 +19,7 @@ #include #include #include "CommonConstants/MathConstants.h" -#include "random" +#include using namespace o2; using namespace o2::framework; diff --git a/PWGUD/Tasks/eventByevent.cxx b/PWGUD/Tasks/eventByevent.cxx index 3df594af546..072ae2d961c 100644 --- a/PWGUD/Tasks/eventByevent.cxx +++ b/PWGUD/Tasks/eventByevent.cxx @@ -13,7 +13,7 @@ #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" -#include "iostream" +#include #include "PWGUD/DataModel/UDTables.h" #include #include diff --git a/PWGUD/Tasks/exclusivePentaquark.cxx b/PWGUD/Tasks/exclusivePentaquark.cxx index 95da9600f67..c63dc7fce68 100644 --- a/PWGUD/Tasks/exclusivePentaquark.cxx +++ b/PWGUD/Tasks/exclusivePentaquark.cxx @@ -11,7 +11,7 @@ #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" -#include "iostream" +#include #include "PWGUD/DataModel/UDTables.h" #include #include "TLorentzVector.h" diff --git a/PWGUD/Tasks/exclusivePhi.cxx b/PWGUD/Tasks/exclusivePhi.cxx index 8f764f2bfff..634d17a5d8e 100644 --- a/PWGUD/Tasks/exclusivePhi.cxx +++ b/PWGUD/Tasks/exclusivePhi.cxx @@ -13,7 +13,7 @@ #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" -#include "iostream" +#include #include "PWGUD/DataModel/UDTables.h" #include #include "TLorentzVector.h" diff --git a/PWGUD/Tasks/exclusivePhiLeptons.cxx b/PWGUD/Tasks/exclusivePhiLeptons.cxx index ea7e92f61dd..b212dd21723 100644 --- a/PWGUD/Tasks/exclusivePhiLeptons.cxx +++ b/PWGUD/Tasks/exclusivePhiLeptons.cxx @@ -12,7 +12,7 @@ #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" -#include "iostream" +#include #include "PWGUD/DataModel/UDTables.h" #include #include "TLorentzVector.h" diff --git a/PWGUD/Tasks/exclusivePhiLeptonsTrees.cxx b/PWGUD/Tasks/exclusivePhiLeptonsTrees.cxx index e1ef9b8f3b4..00abada06d4 100644 --- a/PWGUD/Tasks/exclusivePhiLeptonsTrees.cxx +++ b/PWGUD/Tasks/exclusivePhiLeptonsTrees.cxx @@ -12,7 +12,7 @@ #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" -#include "iostream" +#include #include "PWGUD/DataModel/UDTables.h" #include #include "TLorentzVector.h" diff --git a/PWGUD/Tasks/exclusiveTwoProtons.cxx b/PWGUD/Tasks/exclusiveTwoProtons.cxx index 72032b06906..b7cf9b84004 100644 --- a/PWGUD/Tasks/exclusiveTwoProtons.cxx +++ b/PWGUD/Tasks/exclusiveTwoProtons.cxx @@ -11,7 +11,7 @@ #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" -#include "iostream" +#include #include "PWGUD/DataModel/UDTables.h" #include #include "TLorentzVector.h" diff --git a/PWGUD/Tasks/exclusiveTwoProtonsSG.cxx b/PWGUD/Tasks/exclusiveTwoProtonsSG.cxx index 0e0aa7c83dd..0ac54805c69 100644 --- a/PWGUD/Tasks/exclusiveTwoProtonsSG.cxx +++ b/PWGUD/Tasks/exclusiveTwoProtonsSG.cxx @@ -11,7 +11,7 @@ #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" -#include "iostream" +#include #include "PWGUD/DataModel/UDTables.h" #include #include "TLorentzVector.h" diff --git a/PWGUD/Tasks/polarisationRho.cxx b/PWGUD/Tasks/polarisationRho.cxx index 994c921a6df..c10e86baad6 100644 --- a/PWGUD/Tasks/polarisationRho.cxx +++ b/PWGUD/Tasks/polarisationRho.cxx @@ -11,7 +11,7 @@ #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" -#include "iostream" +#include #include "PWGUD/DataModel/UDTables.h" #include #include "TLorentzVector.h" diff --git a/PWGUD/Tasks/sgD0Analyzer.cxx b/PWGUD/Tasks/sgD0Analyzer.cxx index b5c35b9deec..58b01cbe281 100644 --- a/PWGUD/Tasks/sgD0Analyzer.cxx +++ b/PWGUD/Tasks/sgD0Analyzer.cxx @@ -17,7 +17,7 @@ #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "Framework/O2DatabasePDGPlugin.h" -#include "iostream" +#include #include "PWGUD/DataModel/UDTables.h" #include "PWGUD/Core/SGSelector.h" #include "Common/DataModel/PIDResponse.h" diff --git a/PWGUD/Tasks/sgExclOmega.cxx b/PWGUD/Tasks/sgExclOmega.cxx index 3e24048e621..0a816e1dc0e 100644 --- a/PWGUD/Tasks/sgExclOmega.cxx +++ b/PWGUD/Tasks/sgExclOmega.cxx @@ -17,7 +17,7 @@ #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "Framework/O2DatabasePDGPlugin.h" -#include "iostream" +#include #include "PWGUD/DataModel/UDTables.h" #include "PWGUD/Core/SGSelector.h" #include "Common/DataModel/PIDResponse.h" diff --git a/PWGUD/Tasks/sgExclusivePhi.cxx b/PWGUD/Tasks/sgExclusivePhi.cxx index 679d1677593..df10373e571 100644 --- a/PWGUD/Tasks/sgExclusivePhi.cxx +++ b/PWGUD/Tasks/sgExclusivePhi.cxx @@ -13,7 +13,7 @@ #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" -#include "iostream" +#include #include "PWGUD/DataModel/UDTables.h" #include #include "TLorentzVector.h" diff --git a/PWGUD/Tasks/sgExclusivePhiITSselections.cxx b/PWGUD/Tasks/sgExclusivePhiITSselections.cxx index 76c56e609f5..2d8bc72c0f6 100644 --- a/PWGUD/Tasks/sgExclusivePhiITSselections.cxx +++ b/PWGUD/Tasks/sgExclusivePhiITSselections.cxx @@ -13,7 +13,7 @@ #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" -#include "iostream" +#include #include "PWGUD/DataModel/UDTables.h" #include #include "TLorentzVector.h" diff --git a/PWGUD/Tasks/sgFourPiAnalyzer.cxx b/PWGUD/Tasks/sgFourPiAnalyzer.cxx index fb437863ed8..6a6abfc4628 100644 --- a/PWGUD/Tasks/sgFourPiAnalyzer.cxx +++ b/PWGUD/Tasks/sgFourPiAnalyzer.cxx @@ -17,7 +17,7 @@ #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "Framework/O2DatabasePDGPlugin.h" -#include "iostream" +#include #include "PWGUD/DataModel/UDTables.h" #include "PWGUD/Core/SGSelector.h" #include "PWGUD/Core/SGTrackSelector.h" diff --git a/PWGUD/Tasks/sgInclJpsi.cxx b/PWGUD/Tasks/sgInclJpsi.cxx index 7e0557ef5f0..f5001af7c10 100644 --- a/PWGUD/Tasks/sgInclJpsi.cxx +++ b/PWGUD/Tasks/sgInclJpsi.cxx @@ -17,7 +17,7 @@ #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "Framework/O2DatabasePDGPlugin.h" -#include "iostream" +#include #include "PWGUD/DataModel/UDTables.h" #include "PWGUD/Core/SGSelector.h" #include "Common/DataModel/PIDResponse.h" diff --git a/PWGUD/Tasks/sgSixPiAnalyzer.cxx b/PWGUD/Tasks/sgSixPiAnalyzer.cxx index 215c5d236a1..c3561ad7026 100644 --- a/PWGUD/Tasks/sgSixPiAnalyzer.cxx +++ b/PWGUD/Tasks/sgSixPiAnalyzer.cxx @@ -17,7 +17,7 @@ #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "Framework/O2DatabasePDGPlugin.h" -#include "iostream" +#include #include "PWGUD/DataModel/UDTables.h" #include "PWGUD/Core/SGSelector.h" #include "PWGUD/Core/SGTrackSelector.h" diff --git a/PWGUD/Tasks/sgSpectraAnalyzer.cxx b/PWGUD/Tasks/sgSpectraAnalyzer.cxx index cffb6014300..afd766e0992 100644 --- a/PWGUD/Tasks/sgSpectraAnalyzer.cxx +++ b/PWGUD/Tasks/sgSpectraAnalyzer.cxx @@ -17,7 +17,7 @@ #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "Framework/O2DatabasePDGPlugin.h" -#include "iostream" +#include #include "PWGUD/DataModel/UDTables.h" #include "PWGUD/Core/SGSelector.h" #include "PWGUD/Core/SGTrackSelector.h" diff --git a/PWGUD/Tasks/sgTwoPiAnalyzer.cxx b/PWGUD/Tasks/sgTwoPiAnalyzer.cxx index b7015745448..e1568bb1838 100644 --- a/PWGUD/Tasks/sgTwoPiAnalyzer.cxx +++ b/PWGUD/Tasks/sgTwoPiAnalyzer.cxx @@ -17,7 +17,7 @@ #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "Framework/O2DatabasePDGPlugin.h" -#include "iostream" +#include #include "PWGUD/DataModel/UDTables.h" #include "PWGUD/Core/SGSelector.h" #include "PWGUD/Core/SGTrackSelector.h" diff --git a/PWGUD/Tasks/upcForward.cxx b/PWGUD/Tasks/upcForward.cxx index 3a3c6ec722d..bebcf0b2be2 100644 --- a/PWGUD/Tasks/upcForward.cxx +++ b/PWGUD/Tasks/upcForward.cxx @@ -18,7 +18,7 @@ for now AO2D.root I am using is #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "Common/DataModel/EventSelection.h" -#include "iostream" +#include #include #include #include diff --git a/PWGUD/Tasks/upcPionAnalysis.cxx b/PWGUD/Tasks/upcPionAnalysis.cxx index 2d5d35cd564..fc215ea1822 100644 --- a/PWGUD/Tasks/upcPionAnalysis.cxx +++ b/PWGUD/Tasks/upcPionAnalysis.cxx @@ -13,7 +13,7 @@ #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" -#include "iostream" +#include #include "PWGUD/DataModel/UDTables.h" #include #include diff --git a/PWGUD/Tasks/upcRhoAnalysis.cxx b/PWGUD/Tasks/upcRhoAnalysis.cxx index 1395d66c04b..2bb9865cf34 100644 --- a/PWGUD/Tasks/upcRhoAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoAnalysis.cxx @@ -23,7 +23,7 @@ #include "Framework/AnalysisDataModel.h" #include "Framework/runDataProcessing.h" -#include "random" +#include #include "TLorentzVector.h" #include "Common/DataModel/PIDResponse.h" diff --git a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx index 64559cc10dd..d4048806854 100644 --- a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx @@ -20,7 +20,7 @@ #include "Framework/runDataProcessing.h" #include "Math/Vector4D.h" // similiar to TLorentzVector (which is now legacy apparently) -#include "random" +#include #include "Common/DataModel/PIDResponse.h" diff --git a/Tutorials/PWGUD/UDTutorial_05.cxx b/Tutorials/PWGUD/UDTutorial_05.cxx index 3a9bfb79605..40375c48614 100644 --- a/Tutorials/PWGUD/UDTutorial_05.cxx +++ b/Tutorials/PWGUD/UDTutorial_05.cxx @@ -10,7 +10,7 @@ // or submit itself to any jurisdiction. // -#include "iostream" +#include #include "TLorentzVector.h" #include "TDatabasePDG.h" diff --git a/Tutorials/PWGUD/UDTutorial_07.cxx b/Tutorials/PWGUD/UDTutorial_07.cxx index f2a5616f00d..0060b68293e 100644 --- a/Tutorials/PWGUD/UDTutorial_07.cxx +++ b/Tutorials/PWGUD/UDTutorial_07.cxx @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. // -#include "iostream" +#include #include #include #include "Framework/runDataProcessing.h" From d09ddad8d114338d14f68cec26f4989d5f4f450c Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Fri, 6 Jun 2025 17:25:14 +0200 Subject: [PATCH 1537/1650] [PWGLF] Add new expression for angular correlation (#11497) --- PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx index 4c5cc44de14..9badfb4b4ba 100644 --- a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx +++ b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx @@ -61,6 +61,7 @@ struct LfTaskLambdaSpinCorr { Configurable cfgEvtRCTFlagCheckerLimitAcceptAsBad{"cfgEvtRCTFlagCheckerLimitAcceptAsBad", true, "Evt sel: RCT flag checker treat Limited Acceptance As Bad"}; } rctCut; // mixing + Configurable cosCalculation{"cosCalculation", 1, "cos calculation"}; Configurable mixingCombination{"mixingCombination", 1, "mixing Combination"}; Configurable mixingEvSel{"mixingEvSel", false, "mixingEvSel"}; Configurable cfgCutOccupancy{"cfgCutOccupancy", 2000, "Occupancy cut"}; @@ -281,7 +282,18 @@ struct LfTaskLambdaSpinCorr { auto proton1LambdaRF = boostLambda1ToCM(proton1pairCM); auto proton2LambdaRF = boostLambda2ToCM(proton2pairCM); - double cosThetaDiff = proton1LambdaRF.Vect().Unit().Dot(proton2LambdaRF.Vect().Unit()); + auto cosThetaDiff = -999.0; + if (cosCalculation == 0) { + cosThetaDiff = proton1LambdaRF.Vect().Unit().Dot(proton2LambdaRF.Vect().Unit()); + } + + if (cosCalculation == 1) { + ROOT::Math::XYZVector quantizationAxis = lambda1CM.Vect().Unit(); + double cosTheta1 = proton1LambdaRF.Vect().Unit().Dot(quantizationAxis); + double cosTheta2 = proton2LambdaRF.Vect().Unit().Dot(quantizationAxis); + cosThetaDiff = cosTheta1 * cosTheta2; + } + double deltaR = TMath::Sqrt(TMath::Power(particle1.Eta() - particle2.Eta(), 2.0) + TMath::Power(particle1.Phi() - particle2.Phi(), 2.0)); if (datatype == 0) { if (tag1 && tag3) { From 7b385a16a7ecb25efebf0e5d7c43aefe8f1ef6eb Mon Sep 17 00:00:00 2001 From: Ravindra Singh <56298081+singhra1994@users.noreply.github.com> Date: Fri, 6 Jun 2025 17:56:53 +0200 Subject: [PATCH 1538/1650] [PWGHF] created a duplicate task to correlate Lc and Sc with hadrons (#11384) Co-authored-by: ALICE Action Bot --- PWGHF/HFC/DataModel/CorrelationTables.h | 9 +- PWGHF/HFC/TableProducer/CMakeLists.txt | 5 + .../TableProducer/correlatorLcScHadrons.cxx | 1077 +++++++++++++++++ 3 files changed, 1090 insertions(+), 1 deletion(-) create mode 100644 PWGHF/HFC/TableProducer/correlatorLcScHadrons.cxx diff --git a/PWGHF/HFC/DataModel/CorrelationTables.h b/PWGHF/HFC/DataModel/CorrelationTables.h index 3dc9e765ecb..eaf0b4f3c4a 100644 --- a/PWGHF/HFC/DataModel/CorrelationTables.h +++ b/PWGHF/HFC/DataModel/CorrelationTables.h @@ -147,6 +147,7 @@ DECLARE_SOA_COLUMN(DeltaEta, deltaEta, float); //! D DECLARE_SOA_COLUMN(DeltaY, deltaY, float); //! DeltaY between Lc and Hadrons DECLARE_SOA_COLUMN(PtLc, ptLc, float); //! Transverse momentum of Lc DECLARE_SOA_COLUMN(PtHadron, ptHadron, float); //! Transverse momentum of Hadron +DECLARE_SOA_COLUMN(ChargeCand, chargeCand, int); //! store charge of Lc and Sc DECLARE_SOA_COLUMN(MLc, mLc, float); //! Invariant mass of Lc DECLARE_SOA_COLUMN(MlScoreBkg, mlScoreBkg, float); //! ML background score for Lc selection DECLARE_SOA_COLUMN(MlScorePrompt, mlScorePrompt, float); //! ML prompt score for Lc selection @@ -216,8 +217,14 @@ DECLARE_SOA_TABLE(TrkRecInfoLc, "AOD", "TRKRECINFOLC", //! Tracks Reconstructed aod::hf_correlation_lc_hadron::TrackDcaXY, aod::hf_correlation_lc_hadron::TrackDcaZ, aod::hf_correlation_lc_hadron::TrackTPCNClsCrossedRows); -DECLARE_SOA_TABLE(LcHadronPairY, "AOD", "LCHPAIRY", //! Lc candidates Generated Information + +DECLARE_SOA_TABLE(LcHadronPairY, "AOD", "LCHPAIRY", aod::hf_correlation_lc_hadron::DeltaY); +DECLARE_SOA_TABLE(CandChargePair, "AOD", "CANDCHARGEPAIR", + aod::hf_correlation_lc_hadron::ChargeCand); +DECLARE_SOA_TABLE(CandCharge, "AOD", "CANDCHARGE", + aod::hf_correlation_lc_hadron::ChargeCand); + // definition of columns and tables for Ds-Hadron correlation pairs namespace hf_correlation_ds_hadron { diff --git a/PWGHF/HFC/TableProducer/CMakeLists.txt b/PWGHF/HFC/TableProducer/CMakeLists.txt index 56b01bcd412..99f2c4fb152 100644 --- a/PWGHF/HFC/TableProducer/CMakeLists.txt +++ b/PWGHF/HFC/TableProducer/CMakeLists.txt @@ -64,6 +64,11 @@ o2physics_add_dpl_workflow(correlator-lc-hadrons PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(correlator-lc-sc-hadrons + SOURCES correlatorLcScHadrons.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(femto-dream-producer SOURCES femtoDreamProducer.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::EventFilteringUtils O2Physics::MLCore diff --git a/PWGHF/HFC/TableProducer/correlatorLcScHadrons.cxx b/PWGHF/HFC/TableProducer/correlatorLcScHadrons.cxx new file mode 100644 index 00000000000..77c31d17969 --- /dev/null +++ b/PWGHF/HFC/TableProducer/correlatorLcScHadrons.cxx @@ -0,0 +1,1077 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file correlatorLcScHadrons.cxx +/// \brief Lc-Hadrons correlator task - data-like, Mc-Reco and Mc-Gen analyses +/// +/// \author Marianna Mazzilli +/// \author Zhen Zhang +/// \author Ravindra Singh + +#include +#include "TRandom3.h" + +#include "CommonConstants/PhysicsConstants.h" +#include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/O2DatabasePDGPlugin.h" +#include "Framework/runDataProcessing.h" + +#include "Common/Core/TrackSelection.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "CommonConstants/MathConstants.h" + +#include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" +#include "PWGHF/DataModel/CandidateReconstructionTables.h" +#include "PWGHF/DataModel/CandidateSelectionTables.h" +#include "PWGHF/HFC/DataModel/CorrelationTables.h" +#include "PWGHF/HFC/Utils/utilsCorrelations.h" + +using namespace o2; +using namespace o2::analysis; +using namespace o2::constants::physics; +using namespace o2::constants::math; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::analysis::hf_correlations; +/// +/// Returns deltaPhi values in range [-pi/2., 3.*pi/2.], typically used for correlation studies +/// +double getDeltaPhi(double phiLc, double phiHadron) +{ + return RecoDecay::constrainAngle(phiHadron - phiLc, -PIHalf); +} + +// definition of ME variables +using BinningType = ColumnBinningPolicy>; +using BinningTypeMcGen = ColumnBinningPolicy; + +// Code to select collisions with at least one Lambda_c +struct HfCorrelatorLcScHadronsSelection { + Produces lcSel; + + Configurable useSel8{"useSel8", true, "Flag for applying sel8 for collision selection"}; + Configurable selNoSameBunchPileUpColl{"selNoSameBunchPileUpColl", true, "Flag for rejecting the collisions associated with the same bunch crossing"}; + Configurable doSelLcCollision{"doSelLcCollision", true, "Select collisions with at least one Lc"}; + Configurable selectionFlagLc{"selectionFlagLc", 1, "Selection Flag for Lc"}; + Configurable yCandMax{"yCandMax", 0.8, "max. cand. rapidity"}; + Configurable ptCandMin{"ptCandMin", 1., "min. cand. pT"}; + + HfHelper hfHelper; + SliceCache cache; + + using SelCollisions = soa::Join; + using CandsLcDataFiltered = soa::Filtered>; + using CandsLcMcRecFiltered = soa::Filtered>; + using CandidatesLcMcGen = soa::Join; + + // filter on selection of Lc and decay channel Lc->PKPi + Filter lcFilter = ((o2::aod::hf_track_index::hfflag & static_cast(1 << aod::hf_cand_3prong::DecayType::LcToPKPi)) != static_cast(0)) && (aod::hf_sel_candidate_lc::isSelLcToPKPi >= selectionFlagLc || aod::hf_sel_candidate_lc::isSelLcToPiKP >= selectionFlagLc); + + /// Code to select collisions with at least one Lc - for real data and data-like analysis + void processLcSelectionData(SelCollisions::iterator const& collision, + CandsLcDataFiltered const& candidates) + { + bool isSelColl = true; + bool isLcFound = true; + bool isSel8 = true; + bool isNosameBunchPileUp = true; + if (doSelLcCollision) { + for (const auto& candidate : candidates) { + if (std::abs(hfHelper.yLc(candidate)) > yCandMax || candidate.pt() < ptCandMin) { + isLcFound = false; + continue; + } + isLcFound = true; + break; + } + } + if (useSel8) { + isSel8 = collision.sel8(); + } + if (selNoSameBunchPileUpColl) { + isNosameBunchPileUp = static_cast(collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)); + } + isSelColl = isLcFound && isSel8 && isNosameBunchPileUp; + lcSel(isSelColl); + } + PROCESS_SWITCH(HfCorrelatorLcScHadronsSelection, processLcSelectionData, "Process Lc Collision Selection Data", true); + + void processLcSelectionMcRec(SelCollisions::iterator const& collision, + CandsLcMcRecFiltered const& candidates) + { + bool isSelColl = true; + bool isLcFound = true; + bool isSel8 = true; + bool isNosameBunchPileUp = true; + if (doSelLcCollision) { + for (const auto& candidate : candidates) { + if (std::abs(hfHelper.yLc(candidate)) > yCandMax || candidate.pt() < ptCandMin) { + isLcFound = false; + continue; + } + isLcFound = true; + break; + } + } + if (useSel8) { + isSel8 = collision.sel8(); + } + if (selNoSameBunchPileUpColl) { + isNosameBunchPileUp = static_cast(collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)); + } + isSelColl = isLcFound && isSel8 && isNosameBunchPileUp; + lcSel(isSelColl); + } + PROCESS_SWITCH(HfCorrelatorLcScHadronsSelection, processLcSelectionMcRec, "Process Lc Selection McRec", false); + + void processLcSelectionMcGen(aod::McCollision const&, + CandidatesLcMcGen const& mcParticles) + { + bool isLcFound = true; + for (const auto& particle : mcParticles) { + if (std::abs(particle.pdgCode()) != Pdg::kLambdaCPlus) { + isLcFound = false; + continue; + } + double yL = RecoDecay::y(particle.pVector(), MassLambdaCPlus); + if (std::abs(yL) > yCandMax || particle.pt() < ptCandMin) { + isLcFound = false; + continue; + } + isLcFound = true; + break; + } + lcSel(isLcFound); + } + PROCESS_SWITCH(HfCorrelatorLcScHadronsSelection, processLcSelectionMcGen, "Process Lc Selection McGen", false); +}; + +// Lc-Hadron correlation pair builder - for real data and data-like analysis (i.e. reco-level w/o matching request via Mc truth) +struct HfCorrelatorLcScHadrons { + Produces entryCandHadronPair; + Produces entryCandHadronPairY; + Produces entryCandHadronPairTrkPID; + Produces entryCandHadronRecoInfo; + Produces entryCandHadronMlInfo; + Produces entryCandCandRecoInfo; + Produces entryCandHadronGenInfo; + Produces entryCandCandGenInfo; + Produces entryTrackRecoInfo; + Produces entryCand; + Produces entryHadron; + Produces entryTrkPID; + Produces entryPairCandCharge; + Produces entryCandCharge; + + Configurable selectionFlagLc{"selectionFlagLc", 1, "Selection Flag for Lc"}; + Configurable numberEventsMixed{"numberEventsMixed", 5, "number of events mixed in ME process"}; + Configurable applyEfficiency{"applyEfficiency", 1, "Flag for applying Lc efficiency weights"}; + Configurable yCandMax{"yCandMax", 0.8, "max. cand. rapidity"}; + Configurable yCandGenMax{"yCandGenMax", 0.5, "max. gen. cand. rapidity"}; + Configurable etaTrackMax{"etaTrackMax", 0.8, "max. eta of tracks"}; + Configurable dcaXYTrackMax{"dcaXYTrackMax", 1., "max. DCAxy of tracks"}; + Configurable dcaZTrackMax{"dcaZTrackMax", 1., "max. DCAz of tracks"}; + Configurable ptCandMin{"ptCandMin", 1., "min. cand. pT"}; + Configurable ptCandMax{"ptCandMax", 50., "max. cand. pT"}; + Configurable ptTrackMin{"ptTrackMin", 0.3, "min. track pT"}; + Configurable ptTrackMax{"ptTrackMax", 50., "max. track pT"}; + Configurable multMin{"multMin", 0., "minimum multiplicity accepted"}; + Configurable multMax{"multMax", 10000., "maximum multiplicity accepted"}; + Configurable> classMl{"classMl", {0, 1, 2}, "Indexes of ML scores to be stored. Three indexes max."}; + Configurable> binsPtLc{"binsPtLc", std::vector{o2::analysis::hf_cuts_lc_to_p_k_pi::vecBinsPt}, "pT bin limits for candidate mass plots"}; + Configurable> binsPtHadron{"binsPtHadron", std::vector{0.3, 2., 4., 8., 12., 50.}, "pT bin limits for assoc particle"}; + Configurable> binsPtEfficiencyLc{"binsPtEfficiencyLc", std::vector{o2::analysis::hf_cuts_lc_to_p_k_pi::vecBinsPt}, "pT bin limits for efficiency"}; + Configurable> efficiencyLc{"efficiencyLc", {1., 1., 1., 1., 1., 1.}, "efficiency values for Lc"}; + Configurable storeAutoCorrelationFlag{"storeAutoCorrelationFlag", false, "Store flag that indicates if the track is paired to its Lc mother instead of skipping it"}; + Configurable correlateLcWithLeadingParticle{"correlateLcWithLeadingParticle", false, "Switch for correlation of Lc baryons with leading particle only"}; + Configurable pidTrkApplied{"pidTrkApplied", false, "Apply PID selection for associated tracks"}; + Configurable> trkPIDspecies{"trkPIDspecies", std::vector{o2::track::PID::Proton, o2::track::PID::Pion, o2::track::PID::Kaon}, "Trk sel: Particles species for PID, proton, pion, kaon"}; + Configurable> pidTPCMax{"pidTPCMax", std::vector{3., 0., 0.}, "maximum nSigma TPC"}; + Configurable> pidTOFMax{"pidTOFMax", std::vector{3., 0., 0.}, "maximum nSigma TOF"}; + Configurable tofPIDThreshold{"tofPIDThreshold", 0.75, "minimum pT after which TOF PID is applicable"}; + Configurable fillTrkPID{"fillTrkPID", false, "fill PID information for associated tracks"}; + Configurable forceTOF{"forceTOF", false, "fill PID information for associated tracks"}; + Configurable calTrkEff{"calTrkEff", false, "fill histograms to calculate efficiency"}; + Configurable isRecTrkPhyPrimary{"isRecTrkPhyPrimary", true, "Calculate the efficiency of reconstructed primary physical tracks"}; + Configurable calEffEventWithCand{"calEffEventWithCand", true, "Calculate the efficiency of Lc candidate"}; + Configurable eventFractionToAnalyze{"eventFractionToAnalyze", -1, "Fraction of events to analyze (use only for ME offline on very large samples)"}; + + HfHelper hfHelper; + SliceCache cache; + Service pdg; + int leadingIndex = 0; + int poolBin = 0; + int poolBinLc = 0; + bool correlationStatus = false; + bool isPrompt = false; + bool isNonPrompt = false; + bool isSignal = false; + + static constexpr size_t NDaughters{3u}; + TRandom3* rnd = new TRandom3(0); + std::vector outputMl = {-1., -1., -1.}; + std::vector outputMlPKPi = {-1., -1., -1.}; + std::vector outputMlPiKP = {-1., -1., -1.}; + + // Event Mixing for the Data Mode + using SelCollisionsWithSc = soa::Join; + using SelCollisionsWithLc = soa::Filtered>; + using SelCollisionsWithLcMc = soa::Filtered>; // collisionFilter applied + + using CandsLcData = soa::Join; + using CandsLcDataFiltered = soa::Filtered; + + // Event Mixing for the MCRec Mode + using CandsLcMcRec = soa::Join; + using CandsLcMcRecFiltered = soa::Filtered; + using CandidatesLcMcGen = soa::Join; // flagLcFilter applied + // Event Mixing for the MCGen Mode + using McCollisionsSel = soa::Filtered>; + using McParticlesSel = soa::Filtered; + // Tracks used in Data and MC + using TracksData = soa::Filtered>; // trackFilter applied + using TracksWithMc = soa::Filtered>; // trackFilter applied + // Filters for ME + Filter collisionFilter = aod::hf_selection_lc_collision::lcSel == true; + Filter lcFilter = ((o2::aod::hf_track_index::hfflag & static_cast(1 << aod::hf_cand_3prong::DecayType::LcToPKPi)) != static_cast(0)) && (aod::hf_sel_candidate_lc::isSelLcToPKPi >= selectionFlagLc || aod::hf_sel_candidate_lc::isSelLcToPiKP >= selectionFlagLc); + Filter trackFilter = (nabs(aod::track::eta) < etaTrackMax) && (nabs(aod::track::pt) > ptTrackMin) && (nabs(aod::track::dcaXY) < dcaXYTrackMax) && (nabs(aod::track::dcaZ) < dcaZTrackMax); + + // Preslice perTrueCollision = o2::aod::mcparticle::McCollisionId; + Preslice perTrueCollision = o2::aod::mcparticle::mcCollisionId; + // configurable axis definition + ConfigurableAxis binsMultiplicity{"binsMultiplicity", {VARIABLE_WIDTH, 0.0f, 2000.0f, 6000.0f, 100000.0f}, "Mixing bins - multiplicity"}; + ConfigurableAxis binsZVtx{"binsZVtx", {VARIABLE_WIDTH, -10.0f, -2.5f, 2.5f, 10.0f}, "Mixing bins - z-vertex"}; + ConfigurableAxis binsMultiplicityMc{"binsMultiplicityMc", {VARIABLE_WIDTH, 0.0f, 20.0f, 50.0f, 500.0f}, "Mixing bins - MC multiplicity"}; // In MCGen multiplicity is defined by counting tracks + ConfigurableAxis binsBdtScore{"binsBdtScore", {100, 0., 1.}, "Bdt output scores"}; + ConfigurableAxis binsEta{"binsEta", {50, -2., 2.}, "#it{#eta}"}; + ConfigurableAxis binsPhi{"binsPhi", {64, -PIHalf, 3. * PIHalf}, "#it{#varphi}"}; + ConfigurableAxis binsPoolBin{"binsPoolBin", {9, 0., 9.}, "PoolBin"}; + ConfigurableAxis binsMultFT0M{"binsMultFT0M", {600, 0., 6000.}, "Multiplicity as FT0M signal amplitude"}; + ConfigurableAxis binsCandMass{"binsCandMass", {200, 1.98, 2.58}, "inv. mass (p K #pi) (GeV/#it{c}^{2})"}; + + BinningType corrBinning{{binsZVtx, binsMultiplicity}, true}; + + HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject}; + void init(InitContext&) + { + AxisSpec axisCandMass = {binsCandMass, "inv. mass (p K #pi) (GeV/#it{c}^{2})"}; + AxisSpec axisEta = {binsEta, "#it{eta}"}; + AxisSpec axisPhi = {binsPhi, "#it{#varphi}"}; + AxisSpec axisPtLc = {static_cast>(binsPtLc), "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec axisPtHadron = {static_cast>(binsPtHadron), "#it{p}_{T} Hadron (GeV/#it{c})"}; + AxisSpec axisPtTrack = {500, 0, 50, "#it{p}_{T} Hadron (GeV/#it{c})"}; + AxisSpec axisMultiplicity = {binsMultiplicity, "Multiplicity"}; + AxisSpec axisMultFT0M = {binsMultFT0M, "MultiplicityFT0M"}; + AxisSpec axisPosZ = {binsZVtx, "PosZ"}; + AxisSpec axisBdtScore = {binsBdtScore, "Bdt score"}; + AxisSpec axisPoolBin = {binsPoolBin, "PoolBin"}; + AxisSpec axisRapidity = {100, -2, 2, "Rapidity"}; + AxisSpec axisSign = {2, -1, 1, "Sign"}; + + registry.add("hPtCand", "Lc,Hadron candidates;candidate #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPtLc}}); + registry.add("hPtProng0", "Lc,Hadron candidates;prong 0 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPtLc}}); + registry.add("hPtProng1", "Lc,Hadron candidates;prong 1 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPtLc}}); + registry.add("hPtProng2", "Lc,Hadron candidates;prong 2 #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPtLc}}); + registry.add("hSelectionStatusLcToPKPi", "Lc,Hadron candidates;selection status;entries", {HistType::kTH1F, {{8, -0.5, 7.5}}}); + registry.add("hSelectionStatusLcToPiKP", "Lc,Hadron candidates;selection status;entries", {HistType::kTH1F, {{8, -0.5, 7.5}}}); + registry.add("hEta", "Lc,Hadron candidates;candidate #it{#eta};entries", {HistType::kTH1F, {axisEta}}); + registry.add("hPhi", "Lc,Hadron candidates;candidate #it{#varphi};entries", {HistType::kTH1F, {axisPhi}}); + registry.add("hcountCandHadronPerEvent", "Lc,Hadron particles - MC gen;Number per event;entries", {HistType::kTH1F, {{21, -0.5, 20.5}}}); + registry.add("hMultiplicityPreSelection", "multiplicity prior to selection;multiplicity;entries", {HistType::kTH1F, {{10000, 0., 10000.}}}); + registry.add("hMultiplicity", "multiplicity;multiplicity;entries", {HistType::kTH1F, {{10000, 0., 10000.}}}); + registry.add("hMultFT0M", "multiplicity;multiplicity;entries", {HistType::kTH1F, {{10000, 0., 10000.}}}); + registry.add("hZvtx", "z vertex;z vertex;entries", {HistType::kTH1F, {{200, -20., 20.}}}); + registry.add("hCandBin", "Lc selected in pool Bin;pool Bin;entries", {HistType::kTH1F, {{9, 0., 9.}}}); + registry.add("hTracksBin", "Tracks selected in pool Bin;pool Bin;entries", {HistType::kTH1F, {{9, 0., 9.}}}); + registry.add("hMassLcVsPt", "Lc candidates;inv. mass (p K #pi) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{axisCandMass}, {axisPtLc}}}); + registry.add("hMassLcData", "Lc candidates;inv. mass (p K #pi) (GeV/#it{c}^{2});entries", {HistType::kTH1F, {{axisCandMass}}}); + registry.add("hLcPoolBin", "Lc candidates pool bin", {HistType::kTH1F, {axisPoolBin}}); + registry.add("hTracksPoolBin", "Particles associated pool bin", {HistType::kTH1F, {axisPoolBin}}); + // Histograms for MC Reco analysis + registry.add("hMcEvtCount", "Event counter - MC gen;;entries", {HistType::kTH1F, {{1, -0.5, 0.5}}}); + registry.add("hMassLcMcRecBkg", "Lc background candidates - MC reco;inv. mass (p K #pi) (GeV/#it{c}^{2});entries", {HistType::kTH2F, {{axisCandMass}, {axisPtLc}}}); + registry.add("hPtCandSig", "Lc,Hadron candidates - MC Reco", {HistType::kTH1F, {axisPtLc}}); + registry.add("hPtCandSigPrompt", "Lc,Hadron candidates Prompt - MC Reco", {HistType::kTH1F, {axisPtLc}}); + registry.add("hPtCandSigNonPrompt", "Lc,Hadron candidates Non Prompt - MC Reco", {HistType::kTH1F, {axisPtLc}}); + registry.add("hPtCandMcRecBkg", "Lc,Hadron candidates - MC Reco", {HistType::kTH1F, {axisPtLc}}); + registry.add("hEtaSig", "Lc,Hadron candidates - MC Reco", {HistType::kTH1F, {axisEta}}); + registry.add("hPhiSig", "Lc,Hadron candidates - MC Reco", {HistType::kTH1F, {axisPhi}}); + registry.add("hY", "Lc,Hadron candidates;candidate #it{#y};entries", {HistType::kTH1F, {axisRapidity}}); + registry.add("hYSig", "Lc,Hadron candidates - MC reco;candidate #it{#y};entries", {HistType::kTH1F, {axisRapidity}}); + registry.add("hPtCandMcRecSigPrompt", "Lc,Hadron candidates Prompt - MC Reco", {HistType::kTH1F, {axisPtLc}}); + registry.add("hPtCandMcRecSigNonPrompt", "Lc,Hadron candidates Non Prompt - MC Reco", {HistType::kTH1F, {axisPtLc}}); + registry.add("hEtaMcRecBkg", "Lc,Hadron candidates - MC Reco", {HistType::kTH1F, {axisEta}}); + registry.add("hPhiMcRecBkg", "Lc,Hadron candidates - MC Reco", {HistType::kTH1F, {axisPhi}}); + registry.add("hYMcRecBkg", "Lc,Hadron candidates - MC reco;candidate #it{#y};entries", {HistType::kTH1F, {axisRapidity}}); + registry.add("hFakeTracksMcRec", "Fake tracks - MC Rec", {HistType::kTH1F, {axisPtHadron}}); + registry.add("hPtParticleAssocVsCandMcRec", "Associated Particle - MC Rec", {HistType::kTH2F, {{axisPtHadron}, {axisPtLc}}}); + registry.add("hPtTracksVsSignRec", "Associated Particle - MC Rec", {HistType::kTH2F, {{axisPtTrack}, {axisSign}}}); + registry.add("hPtTracksVsSignRecTrue", "Associated Particle - MC Rec (True)", {HistType::kTH2F, {{axisPtTrack}, {axisSign}}}); + registry.add("hPtTracksVsSignGen", "Associated Particle - MC Gen", {HistType::kTH2F, {{axisPtTrack}, {axisSign}}}); + registry.add("hPtPrimaryParticleAssocVsCandMcRec", "Associated Particle - MC Rec", {HistType::kTH2F, {{axisPtHadron}, {axisPtLc}}}); + registry.add("hPtVsMultiplicityMcRecPrompt", "Multiplicity FT0M - MC Rec Prompt", {HistType::kTH2F, {{axisPtLc}, {axisMultFT0M}}}); + registry.add("hPtVsMultiplicityMcRecNonPrompt", "Multiplicity FT0M - MC Rec Non Prompt", {HistType::kTH2F, {{axisPtLc}, {axisMultFT0M}}}); + // Histograms for MC Gen analysis + registry.add("hcountCandtriggersMcGen", "Lc trigger particles - MC gen;;N of trigger Lc", {HistType::kTH2F, {{1, -0.5, 0.5}, {axisPtLc}}}); + registry.add("hPtCandMcGen", "Lc,Hadron particles - MC gen;particle #it{p}_{T} (GeV/#it{c});entries", {HistType::kTH1F, {axisPtLc}}); + registry.add("hYMcGen", "Lc,Hadron candidates - MC gen;candidate #it{#y};entries", {HistType::kTH1F, {axisRapidity}}); + registry.add("hPtCandMcGenPrompt", "Lc,Hadron particles - MC Gen Prompt", {HistType::kTH1F, {axisPtLc}}); + registry.add("hPtCandMcGenNonPrompt", "Lc,Hadron particles - MC Gen Non Prompt", {HistType::kTH1F, {axisPtLc}}); + registry.add("hPtParticleAssocMcGen", "Associated Particle - MC Gen", {HistType::kTH1F, {axisPtHadron}}); + registry.add("hEtaMcGen", "Lc,Hadron particles - MC Gen", {HistType::kTH1F, {axisEta}}); + registry.add("hPhiMcGen", "Lc,Hadron particles - MC Gen", {HistType::kTH1F, {axisPhi}}); + registry.add("hMultFT0AMcGen", "Lc,Hadron multiplicity FT0A - MC Gen", {HistType::kTH1F, {axisMultiplicity}}); + + corrBinning = {{binsZVtx, binsMultiplicity}, true}; + } + + template + void fillMlOutput(MlProbType const& mlProb, std::vector& outputMl) + { + for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { + outputMl[iclass] = mlProb[classMl->at(iclass)]; + } + }; + + template + double estimateY(CandType const& candidate) + { + double y = -999.; + const int chargeScZero = 0; + if constexpr (isCandSc) { + int8_t chargeCand = candidate.charge(); + + if (chargeCand == chargeScZero) { + y = hfHelper.ySc0(candidate); + } else { + y = hfHelper.yScPlusPlus(candidate); + } + + } else { + y = hfHelper.yLc(candidate); + } + return y; + } + + template + void calculateTrkEff(T1 const& trackPos1, T2 const& trackPos2, McPart const& mcParticles) + { + // genrated tracks + decltype(trackPos1.template mcParticle_as()) mctrk{}; + if (trackPos1.has_mcParticle()) { // ambiguous tracks should be small + mctrk = trackPos1.template mcParticle_as(); + } else if (trackPos2.has_mcParticle()) { + mctrk = trackPos2.template mcParticle_as(); + } else { + return; + } + auto gentracks = mcParticles.sliceBy(perTrueCollision, mctrk.mcCollisionId()); + for (const auto& track : gentracks) { + if (std::abs(track.eta()) > etaTrackMax || track.pt() < ptTrackMin || track.pt() > ptTrackMax) { + continue; + } + if ((std::abs(track.pdgCode()) != kElectron) && (std::abs(track.pdgCode()) != kMuonMinus) && (std::abs(track.pdgCode()) != kPiPlus) && (std::abs(track.pdgCode()) != kKPlus) && (std::abs(track.pdgCode()) != kProton)) { + continue; + } + + if (pidTrkApplied && (std::abs(track.pdgCode()) != kProton)) + continue; // proton PID + + if (!track.isPhysicalPrimary()) { + continue; + } + + auto motherTrkGen = mcParticles.iteratorAt(track.mothersIds()[0]); + if (std::abs(motherTrkGen.pdgCode()) == kLambdaCPlus) + continue; + + auto chargeTrack = pdg->GetParticle(track.pdgCode())->Charge(); // Retrieve charge + registry.fill(HIST("hPtTracksVsSignGen"), track.pt(), chargeTrack / (2 * std::abs(chargeTrack))); + } + } + template + void fillCorrelationTable(bool trkPidFill, TrackType const& track, CandType const& candidate, + const std::vector& outMl, int binPool, int8_t correlStatus, + double yCand, int signCand, McPart const& mcParticles) + { + bool isPhysicalPrimary = false; + int trackOrigin = -1; + + entryCandHadronPair(getDeltaPhi(track.phi(), candidate.phi()), + track.eta() - candidate.eta(), + candidate.pt(), + track.pt() * track.sign(), + binPool, + correlStatus); + entryCandHadronPairY(track.y() - yCand); + entryCandHadronMlInfo(outMl[0], outMl[1]); + entryTrackRecoInfo(track.dcaXY(), track.dcaZ(), track.tpcNClsCrossedRows()); + entryPairCandCharge(signCand); + if (trkPidFill) { + entryCandHadronPairTrkPID(track.tpcNSigmaPr(), track.tpcNSigmaKa(), track.tpcNSigmaPi(), track.tofNSigmaPr(), track.tofNSigmaKa(), track.tofNSigmaPi()); + } + if constexpr (isMcRec) { + if (track.has_mcParticle()) { + auto mcParticle = track.template mcParticle_as(); + isPhysicalPrimary = mcParticle.isPhysicalPrimary(); + trackOrigin = RecoDecay::getCharmHadronOrigin(mcParticles, mcParticle, true); + entryCandHadronGenInfo(isPrompt, isPhysicalPrimary, trackOrigin); + } else { + entryCandHadronGenInfo(isPrompt, false, 0); + registry.fill(HIST("hFakeTracksMcRec"), track.pt()); + } + registry.fill(HIST("hPtParticleAssocVsCandMcRec"), track.pt(), candidate.pt()); + if (isPhysicalPrimary) { + registry.fill(HIST("hPtPrimaryParticleAssocVsCandMcRec"), track.pt(), candidate.pt()); + } + } + } + + template + void doSameEvent(CollisionType const& collision, + TrackType const& tracks, + CandType const& candidates, + aod::McParticles const* mcParticles = nullptr) + { + + int nTracks = 0; + int64_t timeStamp = 0; + const int chargeScPlusPlus = 2; + const int chargeScZero = 0; + bool skipMixedEventTableFilling = false; + float multiplicityFT0M = collision.multFT0M(); + int gCollisionId = collision.globalIndex(); + if (candidates.size() == 0) { + return; + } + + if (eventFractionToAnalyze > 0) { + if (rnd->Uniform(0, 1) > eventFractionToAnalyze) { + skipMixedEventTableFilling = true; + } + } + + if constexpr (!isMcRec) { + timeStamp = collision.template bc_as().timestamp(); + } + + poolBin = corrBinning.getBin(std::make_tuple(collision.posZ(), multiplicityFT0M)); + if (correlateLcWithLeadingParticle) { + leadingIndex = findLeadingParticle(tracks, etaTrackMax.value); + } + + // Count good tracks + if (collision.numContrib() > 1) { + for (const auto& track : tracks) { + if (std::abs(track.eta()) > etaTrackMax || std::abs(track.dcaXY()) > dcaXYTrackMax || std::abs(track.dcaZ()) > dcaZTrackMax) { + continue; + } + nTracks++; + } + } + + registry.fill(HIST("hMultiplicityPreSelection"), nTracks); + if (nTracks < multMin || nTracks > multMax) { + return; + } + registry.fill(HIST("hMultiplicity"), nTracks); + + int countCand = 1; + + for (const auto& candidate : candidates) { + + int8_t chargeCand = 3; + double efficiencyWeightCand = 1.; + double yCand = -999.0; + double etaCand = -999.0; + double ptCandLc = -999.0; + double ptCand = -999.0; + double phiCand = -999.0; + double massCandPKPi = -999.0; + double massCandPiKP = -999.0; + bool selLcPKPi = false; + bool selLcPiKP = false; + + yCand = estimateY(candidate); + etaCand = candidate.eta(); + ptCand = candidate.pt(); + phiCand = RecoDecay::constrainAngle(candidate.phi(), -PIHalf); + + if ((std::abs(yCand) > yCandMax) || ptCand < ptCandMin || ptCand > ptCandMax) { + continue; + } + + registry.fill(HIST("hY"), yCand); + registry.fill(HIST("hPtCand"), ptCand); + registry.fill(HIST("hEta"), etaCand); + registry.fill(HIST("hPhi"), phiCand); + registry.fill(HIST("hCandBin"), poolBin); + + if (applyEfficiency) { + efficiencyWeightCand = 1. / efficiencyLc->at(o2::analysis::findBin(binsPtEfficiencyLc, ptCand)); + } + + if constexpr (isMcRec) { + isPrompt = candidate.originMcRec() == RecoDecay::OriginType::Prompt; + isNonPrompt = candidate.originMcRec() == RecoDecay::OriginType::NonPrompt; + } + + if constexpr (isCandSc) { + chargeCand = candidate.charge(); + const auto& candidateLc = candidate.template prongLc_as(); + ptCandLc = candidateLc.pt(); + selLcPKPi = (candidateLc.isSelLcToPKPi() >= selectionFlagLc) && (candidate.statusSpreadLcMinvPKPiFromPDG()); + selLcPiKP = (candidateLc.isSelLcToPiKP() >= selectionFlagLc) && (candidate.statusSpreadLcMinvPiKPFromPDG()); + if (selLcPKPi) { + const auto& probs = candidateLc.mlProbLcToPKPi(); + fillMlOutput(probs, outputMlPKPi); + massCandPKPi = hfHelper.invMassScRecoLcToPKPi(candidate, candidateLc); + } + if (selLcPiKP) { + const auto& probs = candidateLc.mlProbLcToPiKP(); + fillMlOutput(probs, outputMlPiKP); + massCandPiKP = hfHelper.invMassScRecoLcToPiKP(candidate, candidateLc); + } + if constexpr (isMcRec) { + // isSignal = + // (TESTBIT(std::abs(candidate.flagMcMatchRec()), aod::hf_cand_sigmac::DecayType::Sc0ToPKPiPi) && chargeCand == 0) || + // (TESTBIT(std::abs(candidate.flagMcMatchRec()), aod::hf_cand_sigmac::DecayType::ScplusplusToPKPiPi) && std::abs(chargeCand) == 2); + isSignal = + (std::abs(candidate.flagMcMatchRec()) == (1 << aod::hf_cand_sigmac::DecayType::Sc0ToPKPiPi) && chargeCand == chargeScZero) || + (std::abs(candidate.flagMcMatchRec()) == (1 << aod::hf_cand_sigmac::DecayType::ScplusplusToPKPiPi) && std::abs(chargeCand) == chargeScPlusPlus); + + auto trackPos1 = candidateLc.template prong0_as(); + auto trackPos2 = candidateLc.template prong2_as(); + if (calTrkEff && countCand == 1 && (isSignal || !calEffEventWithCand)) { + calculateTrkEff(trackPos1, trackPos2, *mcParticles); + } + registry.fill(HIST("hPtProng1"), candidate.template prong1_as().pt()); + } else { + registry.fill(HIST("hPtProng1"), candidate.prong1().pt()); + } + registry.fill(HIST("hPtProng0"), ptCandLc); + } else { + selLcPKPi = candidate.isSelLcToPKPi() >= selectionFlagLc; + selLcPiKP = candidate.isSelLcToPiKP() >= selectionFlagLc; + if (selLcPKPi) { + const auto& probs = candidate.mlProbLcToPKPi(); + fillMlOutput(probs, outputMlPKPi); + massCandPKPi = hfHelper.invMassLcToPKPi(candidate); + } + if (selLcPiKP) { + const auto& probs = candidate.mlProbLcToPiKP(); + fillMlOutput(probs, outputMlPiKP); + massCandPiKP = hfHelper.invMassLcToPiKP(candidate); + } + auto trackPos1 = candidate.template prong0_as(); + auto trackPos2 = candidate.template prong2_as(); + chargeCand = trackPos1.sign(); + if constexpr (isMcRec) { + isSignal = TESTBIT(std::abs(candidate.flagMcMatchRec()), aod::hf_cand_3prong::DecayType::LcToPKPi); + if (calTrkEff && countCand == 1 && (isSignal || !calEffEventWithCand)) { + calculateTrkEff(trackPos1, trackPos2, *mcParticles); + } + } + registry.fill(HIST("hPtProng0"), candidate.ptProng0()); + registry.fill(HIST("hPtProng1"), candidate.ptProng1()); + registry.fill(HIST("hPtProng2"), candidate.ptProng2()); + } + + if (isSignal) { + registry.fill(HIST("hPtCandSig"), ptCand); + registry.fill(HIST("hEtaSig"), ptCand); + registry.fill(HIST("hPhiSig"), phiCand); + registry.fill(HIST("hYSig"), yCand); + } + + if (selLcPKPi) { + registry.fill(HIST("hMassLcVsPt"), massCandPKPi, ptCand, efficiencyWeightCand); + registry.fill(HIST("hMassLcData"), massCandPKPi, efficiencyWeightCand); + registry.fill(HIST("hSelectionStatusLcToPKPi"), selLcPKPi); + if (isPrompt) { + registry.fill(HIST("hPtCandSigPrompt"), ptCand); + registry.fill(HIST("hPtVsMultiplicityMcRecPrompt"), ptCand, multiplicityFT0M); + } else if (isNonPrompt) { + registry.fill(HIST("hPtCandSigNonPrompt"), ptCand); + registry.fill(HIST("hPtVsMultiplicityMcRecNonPrompt"), ptCand, multiplicityFT0M); + } + + entryCandCandRecoInfo(massCandPKPi, ptCand, outputMlPKPi[0], outputMlPKPi[1]); + entryCandCandGenInfo(isPrompt); + if (!skipMixedEventTableFilling) { + entryCand(candidate.phi(), etaCand, ptCand, massCandPKPi, poolBin, gCollisionId, timeStamp); + entryCandCharge(chargeCand); + } + } + + if (selLcPiKP) { + registry.fill(HIST("hMassLcVsPt"), massCandPiKP, ptCand, efficiencyWeightCand); + registry.fill(HIST("hMassLcData"), massCandPiKP, efficiencyWeightCand); + registry.fill(HIST("hSelectionStatusLcToPiKP"), selLcPiKP); + if (isPrompt) { + registry.fill(HIST("hPtCandSigPrompt"), ptCand); + registry.fill(HIST("hPtVsMultiplicityMcRecPrompt"), ptCand, multiplicityFT0M); + } else if (isNonPrompt) { + registry.fill(HIST("hPtCandSigNonPrompt"), ptCand); + registry.fill(HIST("hPtVsMultiplicityMcRecNonPrompt"), ptCand, multiplicityFT0M); + } + entryCandCandRecoInfo(massCandPiKP, ptCand, outputMlPiKP[0], outputMlPiKP[1]); + entryCandCandGenInfo(isPrompt); + if (!skipMixedEventTableFilling) { + entryCand(candidate.phi(), etaCand, ptCand, massCandPiKP, poolBin, gCollisionId, timeStamp); + entryCandCharge(chargeCand); + } + } + + registry.fill(HIST("hCandBin"), poolBin); + // Correlation with hadrons + for (const auto& track : tracks) { + // Remove Lc daughters by checking track indices + if constexpr (!isCandSc) { + if ((candidate.prong0Id() == track.globalIndex()) || (candidate.prong1Id() == track.globalIndex()) || (candidate.prong2Id() == track.globalIndex())) { + if (!storeAutoCorrelationFlag) { + continue; + } + correlationStatus = true; + } + } else { + const auto& candidateLc = candidate.template prongLc_as(); + if ((candidateLc.prong0Id() == track.globalIndex()) || (candidateLc.prong1Id() == track.globalIndex()) || (candidateLc.prong2Id() == track.globalIndex()) || (candidate.prong1Id() == track.globalIndex())) { + if (!storeAutoCorrelationFlag) { + continue; + } + correlationStatus = true; + } + } + if (!track.isGlobalTrackWoDCA()) { + continue; + } + if (pidTrkApplied) { + if (!passPIDSelection(track, trkPIDspecies, pidTPCMax, pidTOFMax, tofPIDThreshold, forceTOF)) + continue; + } + if (correlateLcWithLeadingParticle) { + if (track.globalIndex() != leadingIndex) { + continue; + } + } + if constexpr (isMcRec) { + if (calTrkEff && countCand == 1 && (isSignal || !calEffEventWithCand) && track.has_mcParticle()) { + auto mcParticle = track.template mcParticle_as(); + if (!mcParticle.isPhysicalPrimary() && isRecTrkPhyPrimary) + continue; + + auto motherTrk = mcParticles->iteratorAt(mcParticle.mothersIds()[0]); + if (std::abs(motherTrk.pdgCode()) == kLambdaCPlus) + continue; + + registry.fill(HIST("hPtTracksVsSignRec"), track.pt(), track.sign() / 2.); + if (std::abs(mcParticle.pdgCode()) == kProton) + registry.fill(HIST("hPtTracksVsSignRecTrue"), track.pt(), track.sign() / 2.); + } + } + + if (selLcPKPi) { + fillCorrelationTable(fillTrkPID, track, candidate, outputMlPKPi, poolBin, correlationStatus, yCand, chargeCand, *mcParticles); + entryCandHadronRecoInfo(massCandPKPi, false); + } + if (selLcPiKP) { + fillCorrelationTable(fillTrkPID, track, candidate, outputMlPiKP, poolBin, correlationStatus, yCand, chargeCand, *mcParticles); + entryCandHadronRecoInfo(massCandPiKP, false); + } + + if (countCand == 1) { + if (!skipMixedEventTableFilling) { + entryHadron(track.phi(), track.eta(), track.pt() * track.sign(), poolBin, gCollisionId, timeStamp); + if (fillTrkPID) { + entryTrkPID(track.tpcNSigmaPr(), track.tpcNSigmaKa(), track.tpcNSigmaPi(), track.tofNSigmaPr(), track.tofNSigmaKa(), track.tofNSigmaPi()); + } + registry.fill(HIST("hTracksBin"), poolBin); + } + } + } // end Hadron Tracks loop + countCand++; + } // end outer Lc loop + registry.fill(HIST("hZvtx"), collision.posZ()); + registry.fill(HIST("hMultFT0M"), multiplicityFT0M); + } + + template + void doMixEvent(CollisionType const& collisions, + TrackType const& tracks, + CandType const& candidates, + aod::McParticles const* mcParticles = nullptr) + { + + if (candidates.size() == 0) { + return; + } + + double yCand = -999.; + double ptCand = -999.; + int8_t chargeCand = 3; + double massCandPKPi = -999.0; + double massCandPiKP = -999.0; + bool selLcPKPi = false; + bool selLcPiKP = false; + const int chargeScPlusPlus = 2; + const int chargeScZero = 0; + + auto tracksTuple = std::make_tuple(candidates, tracks); + Pair pairData{corrBinning, numberEventsMixed, -1, collisions, tracksTuple, &cache}; + + for (const auto& [c1, tracks1, c2, tracks2] : pairData) { + poolBin = corrBinning.getBin(std::make_tuple(c2.posZ(), c2.multFT0M())); + poolBinLc = corrBinning.getBin(std::make_tuple(c1.posZ(), c1.multFT0M())); + registry.fill(HIST("hMultFT0M"), c1.multFT0M()); + registry.fill(HIST("hZvtx"), c1.posZ()); + registry.fill(HIST("hTracksPoolBin"), poolBin); + registry.fill(HIST("hLcPoolBin"), poolBinLc); + for (const auto& [candidate, assocParticle] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { + + yCand = estimateY(candidate); + ptCand = candidate.pt(); + if constexpr (isMcRec) { + isPrompt = candidate.originMcRec() == RecoDecay::OriginType::Prompt; + isNonPrompt = candidate.originMcRec() == RecoDecay::OriginType::NonPrompt; + } + + if constexpr (isCandSc) { + const auto& candidateLc = candidate.template prongLc_as(); + chargeCand = candidate.charge(); + selLcPKPi = (candidateLc.isSelLcToPKPi() >= selectionFlagLc) && (candidate.statusSpreadLcMinvPKPiFromPDG()); + selLcPiKP = (candidateLc.isSelLcToPiKP() >= selectionFlagLc) && (candidate.statusSpreadLcMinvPiKPFromPDG()); + if (selLcPKPi) { + const auto& probs = candidateLc.mlProbLcToPKPi(); + fillMlOutput(probs, outputMlPKPi); + massCandPKPi = hfHelper.invMassScRecoLcToPKPi(candidate, candidateLc); + } + if (selLcPiKP) { + const auto& probs = candidateLc.mlProbLcToPiKP(); + fillMlOutput(probs, outputMlPiKP); + massCandPiKP = hfHelper.invMassScRecoLcToPKPi(candidate, candidateLc); + } + if constexpr (isMcRec) { + isSignal = + (TESTBIT(std::abs(candidate.flagMcMatchRec()), aod::hf_cand_sigmac::DecayType::Sc0ToPKPiPi) && chargeCand == chargeScZero) || + (TESTBIT(std::abs(candidate.flagMcMatchRec()), aod::hf_cand_sigmac::DecayType::ScplusplusToPKPiPi) && std::abs(chargeCand) == chargeScPlusPlus); + } + } else { + selLcPKPi = candidate.isSelLcToPKPi() >= selectionFlagLc; + selLcPiKP = candidate.isSelLcToPiKP() >= selectionFlagLc; + if (selLcPKPi) { + const auto& probs = candidate.mlProbLcToPKPi(); + fillMlOutput(probs, outputMlPKPi); + massCandPKPi = hfHelper.invMassLcToPKPi(candidate); + } + if (selLcPiKP) { + const auto& probs = candidate.mlProbLcToPiKP(); + fillMlOutput(probs, outputMlPiKP); + massCandPiKP = hfHelper.invMassLcToPiKP(candidate); + } + auto trackPos1 = candidate.template prong0_as(); + chargeCand = trackPos1.sign(); + if constexpr (isMcRec) { + isSignal = TESTBIT(std::abs(candidate.flagMcMatchRec()), aod::hf_cand_3prong::DecayType::LcToPKPi); + } + } + + if (!assocParticle.isGlobalTrackWoDCA() || std::abs(yCand) > yCandMax) { + continue; + } + + if (pidTrkApplied) { + if (!passPIDSelection(assocParticle, trkPIDspecies, pidTPCMax, pidTOFMax, tofPIDThreshold, forceTOF)) + continue; + } + + if (selLcPKPi) { + fillCorrelationTable(fillTrkPID, assocParticle, candidate, outputMlPKPi, poolBin, correlationStatus, yCand, chargeCand, *mcParticles); + entryCandHadronRecoInfo(massCandPKPi, false); + + if (isPrompt) { + registry.fill(HIST("hPtCandMcRecSigPrompt"), ptCand); + registry.fill(HIST("hPtVsMultiplicityMcRecPrompt"), ptCand, 0); + } else if (isNonPrompt) { + registry.fill(HIST("hPtCandMcRecSigNonPrompt"), ptCand); + registry.fill(HIST("hPtVsMultiplicityMcRecNonPrompt"), ptCand, 0); + } + } + + if (selLcPiKP) { + fillCorrelationTable(fillTrkPID, assocParticle, candidate, outputMlPiKP, poolBin, correlationStatus, yCand, chargeCand, *mcParticles); + entryCandHadronRecoInfo(massCandPiKP, false); + + if (isPrompt) { + registry.fill(HIST("hPtCandMcRecSigPrompt"), ptCand); + registry.fill(HIST("hPtVsMultiplicityMcRecPrompt"), ptCand, 0); + } else if (isNonPrompt) { + registry.fill(HIST("hPtCandMcRecSigNonPrompt"), ptCand); + registry.fill(HIST("hPtVsMultiplicityMcRecNonPrompt"), ptCand, 0); + } + } + } + } + } + + //} + + /// Lc-hadron correlation pair builder - for real data and data-like analysis (i.e. reco-level w/o matching request via MC truth) + void processDataLc(SelCollisionsWithLc::iterator const& collision, + TracksData const& tracks, + CandsLcDataFiltered const& candidates, + aod::BCsWithTimestamps const&) + { + doSameEvent(collision, tracks, candidates); + } + PROCESS_SWITCH(HfCorrelatorLcScHadrons, processDataLc, "Process data", true); + + void processDataSc(SelCollisionsWithSc::iterator const& collision, + TracksData const& tracks, + aod::Tracks const&, + aod::HfCandSc const& candidates, + CandsLcData const&, + aod::BCsWithTimestamps const&) // MUST be last among index-compatible + { + doSameEvent(collision, tracks, candidates); + } + PROCESS_SWITCH(HfCorrelatorLcScHadrons, processDataSc, "Process data Sc", false); + + /// Lc-Hadron correlation process starts for McRec + void processMcRecLc(SelCollisionsWithLc::iterator const& collision, + TracksWithMc const& tracks, + CandsLcMcRecFiltered const& candidates, + aod::McParticles const& mcParticles) + { + doSameEvent(collision, tracks, candidates, &mcParticles); + } + PROCESS_SWITCH(HfCorrelatorLcScHadrons, processMcRecLc, "Process Mc Reco mode", false); + + /// Lc-Hadron correlation process starts for McRec + void processMcRecSc(SelCollisionsWithSc::iterator const& collision, + TracksWithMc const& tracks, + aod::TracksWMc const&, + soa::Join const& candidates, + CandsLcData const&, + aod::McParticles const& mcParticles) + { + doSameEvent(collision, tracks, candidates, &mcParticles); + } + PROCESS_SWITCH(HfCorrelatorLcScHadrons, processMcRecSc, "Process Mc Reco mode", false); + + void processDataMixedEventSc(SelCollisionsWithSc const& collisions, + TracksData const& tracks, + aod::Tracks const&, + aod::HfCandSc const& candidates, + CandsLcData const&) + { + doMixEvent(collisions, tracks, candidates); + } + PROCESS_SWITCH(HfCorrelatorLcScHadrons, processDataMixedEventSc, "Process Mixed Event Data", false); + + void processDataMixedEventLc(SelCollisionsWithLc const& collisions, + CandsLcDataFiltered const& candidates, + TracksData const& tracks) + { + + doMixEvent(collisions, tracks, candidates); + } + PROCESS_SWITCH(HfCorrelatorLcScHadrons, processDataMixedEventLc, "Process Mixed Event Data", false); + + void processMcRecMixedEventSc(SelCollisionsWithSc const& collisions, + TracksWithMc const& tracks, + aod::TracksWMc const&, + soa::Join const& candidates, + CandsLcData const&, + aod::McParticles const& mcParticles) + { + doMixEvent(collisions, tracks, candidates, &mcParticles); + } + PROCESS_SWITCH(HfCorrelatorLcScHadrons, processMcRecMixedEventSc, "Process Mixed Event McRec", false); + + void processMcRecMixedEventLc(SelCollisionsWithLc const& collisions, + CandsLcMcRecFiltered const& candidates, + TracksWithMc const& tracks, + aod::McParticles const& mcParticles) + { + doMixEvent(collisions, tracks, candidates, &mcParticles); + } + PROCESS_SWITCH(HfCorrelatorLcScHadrons, processMcRecMixedEventLc, "Process Mixed Event McRec", false) + + /// Lc-Hadron correlation pair builder - for Mc Gen-level analysis + void processMcGen(SelCollisionsWithLcMc::iterator const& mcCollision, + CandidatesLcMcGen const& mcParticles) + { + int counterLcHadron = 0; + registry.fill(HIST("hMcEvtCount"), 0); + + BinningTypeMcGen corrBinningMcGen{{binsZVtx, binsMultiplicityMc}, true}; + poolBin = corrBinningMcGen.getBin(std::make_tuple(mcCollision.posZ(), mcCollision.multMCFT0A())); + registry.fill(HIST("hMultFT0AMcGen"), mcCollision.multMCFT0A()); + + // find leading particle + if (correlateLcWithLeadingParticle) { + leadingIndex = findLeadingParticleMcGen(mcParticles, etaTrackMax.value, ptTrackMin.value); + } + + // Mc Gen level + for (const auto& particle : mcParticles) { + if (std::abs(particle.pdgCode()) != Pdg::kLambdaCPlus) { + continue; + } + if (!TESTBIT(std::abs(particle.flagMcMatchGen()), aod::hf_cand_3prong::DecayType::LcToPKPi)) { + continue; + } + double yL = RecoDecay::y(particle.pVector(), MassLambdaCPlus); + if (std::abs(yL) > yCandGenMax || particle.pt() < ptCandMin) { + continue; + } + registry.fill(HIST("hCandBin"), poolBin); + registry.fill(HIST("hPtCandMcGen"), particle.pt()); + registry.fill(HIST("hEtaMcGen"), particle.eta()); + registry.fill(HIST("hPhiMcGen"), RecoDecay::constrainAngle(particle.phi(), -PIHalf)); + registry.fill(HIST("hYMcGen"), yL); + + isPrompt = particle.originMcGen() == RecoDecay::OriginType::Prompt; + isNonPrompt = particle.originMcGen() == RecoDecay::OriginType::NonPrompt; + if (isPrompt) { + registry.fill(HIST("hPtCandMcGenPrompt"), particle.pt()); + } else if (isNonPrompt) { + registry.fill(HIST("hPtCandMcGenNonPrompt"), particle.pt()); + } + + // prompt and non-prompt division + std::vector listDaughters{}; + std::array arrDaughLcPDG = {kProton, -kKPlus, kPiPlus}; + std::array prongsId; + listDaughters.clear(); + RecoDecay::getDaughters(particle, &listDaughters, arrDaughLcPDG, 2); + int counterDaughters = 0; + if (listDaughters.size() == NDaughters) { + for (const auto& dauIdx : listDaughters) { + auto daughI = mcParticles.rawIteratorAt(dauIdx - mcParticles.offset()); + counterDaughters += 1; + prongsId[counterDaughters - 1] = daughI.globalIndex(); + } + } + counterLcHadron++; + // Lc Hadron correlation dedicated section + // if it's a Lc particle, search for Hadron and evalutate correlations + registry.fill(HIST("hcountCandtriggersMcGen"), 0, particle.pt()); // to count trigger Lc for normalisation + for (const auto& particleAssoc : mcParticles) { + if (std::abs(particleAssoc.eta()) > etaTrackMax || particleAssoc.pt() < ptTrackMin || particleAssoc.pt() > ptTrackMax) { + continue; + } + if (particleAssoc.globalIndex() == prongsId[0] || particleAssoc.globalIndex() == prongsId[1] || particleAssoc.globalIndex() == prongsId[2]) { + if (!storeAutoCorrelationFlag) { + continue; + } + correlationStatus = true; + } + + if ((std::abs(particleAssoc.pdgCode()) != kElectron) && (std::abs(particleAssoc.pdgCode()) != kMuonMinus) && (std::abs(particleAssoc.pdgCode()) != kPiPlus) && (std::abs(particle.pdgCode()) != kKPlus) && (std::abs(particleAssoc.pdgCode()) != kProton)) { + continue; + } + + if (pidTrkApplied && (std::abs(particleAssoc.pdgCode()) != kProton)) + continue; // proton PID + + if (!particleAssoc.isPhysicalPrimary()) { + continue; + } + + if (correlateLcWithLeadingParticle) { + if (particleAssoc.globalIndex() != leadingIndex) { + continue; + } + } + + int8_t chargeLc = pdg->GetParticle(particle.pdgCode())->Charge(); // Retrieve charge + int8_t chargeAssoc = pdg->GetParticle(particleAssoc.pdgCode())->Charge(); // Retrieve charge + + int trackOrigin = RecoDecay::getCharmHadronOrigin(mcParticles, particleAssoc, true); + registry.fill(HIST("hPtParticleAssocMcGen"), particleAssoc.pt()); + entryCandHadronPair(getDeltaPhi(particleAssoc.phi(), particle.phi()), + particleAssoc.eta() - particle.eta(), + particle.pt() * chargeLc / std::abs(chargeLc), + particleAssoc.pt() * chargeAssoc / std::abs(chargeAssoc), + poolBin, + correlationStatus); + entryCandHadronPairY(particleAssoc.y() - yL); + entryCandHadronRecoInfo(MassLambdaCPlus, true); + entryCandHadronGenInfo(isPrompt, particleAssoc.isPhysicalPrimary(), trackOrigin); + } // end inner loop + } // end outer loop + registry.fill(HIST("hcountCandHadronPerEvent"), counterLcHadron); + registry.fill(HIST("hZvtx"), mcCollision.posZ()); + } + PROCESS_SWITCH(HfCorrelatorLcScHadrons, processMcGen, "Process Mc Gen mode", false); + + void processMcGenMixedEvent(SelCollisionsWithLcMc const& collisions, + CandidatesLcMcGen const& mcParticles) + { + BinningTypeMcGen corrBinningMcGen{{binsZVtx, binsMultiplicityMc}, true}; + auto tracksTuple = std::make_tuple(mcParticles, mcParticles); + Pair pairMcGen{corrBinningMcGen, numberEventsMixed, -1, collisions, tracksTuple, &cache}; + for (const auto& [c1, tracks1, c2, tracks2] : pairMcGen) { + poolBin = corrBinningMcGen.getBin(std::make_tuple(c1.posZ(), c1.multMCFT0A())); + for (const auto& [candidate, particleAssoc] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(tracks1, tracks2))) { + if (std::abs(candidate.pdgCode()) != Pdg::kLambdaCPlus) { + continue; + } + double yL = RecoDecay::y(candidate.pVector(), MassLambdaCPlus); + if (std::abs(yL) > yCandGenMax || candidate.pt() < ptCandMin || candidate.pt() > ptCandMax) { + continue; + } + if (std::abs(particleAssoc.eta()) > etaTrackMax || particleAssoc.pt() < ptTrackMin || particleAssoc.pt() > ptTrackMax) { + continue; + } + if ((std::abs(particleAssoc.pdgCode()) != kElectron) && (std::abs(particleAssoc.pdgCode()) != kMuonMinus) && (std::abs(particleAssoc.pdgCode()) != kPiPlus) && (std::abs(particleAssoc.pdgCode()) != kKPlus) && (std::abs(particleAssoc.pdgCode()) != kProton)) { + continue; + } + if (!particleAssoc.isPhysicalPrimary()) { + continue; + } + if (pidTrkApplied && (std::abs(particleAssoc.pdgCode()) != kProton)) { + continue; // proton PID + } + int8_t chargeLc = pdg->GetParticle(candidate.pdgCode())->Charge(); // Retrieve charge + int8_t chargeAssoc = pdg->GetParticle(particleAssoc.pdgCode())->Charge(); // Retrieve charge + + int trackOrigin = RecoDecay::getCharmHadronOrigin(mcParticles, particleAssoc, true); + bool isPrompt = candidate.originMcGen() == RecoDecay::OriginType::Prompt; + entryCandHadronPair(getDeltaPhi(particleAssoc.phi(), candidate.phi()), + particleAssoc.eta() - candidate.eta(), + candidate.pt() * chargeLc / std::abs(chargeLc), + particleAssoc.pt() * chargeAssoc / std::abs(chargeAssoc), + poolBin, + correlationStatus); + entryCandHadronPairY(particleAssoc.y() - yL); + entryCandHadronRecoInfo(MassLambdaCPlus, true); + entryCandHadronGenInfo(isPrompt, particleAssoc.isPhysicalPrimary(), trackOrigin); + } + } + } + PROCESS_SWITCH(HfCorrelatorLcScHadrons, processMcGenMixedEvent, "Process Mixed Event McGen", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc)}; +} From 8135f7af43a30d1a6cf6d4faa71b7f7ef2460126 Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Sat, 7 Jun 2025 01:30:10 +0800 Subject: [PATCH 1539/1650] [PWGCF] add on-the-fly process (#11494) --- .../Tasks/diHadronCor.cxx | 68 ++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx b/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx index f799a8d7564..063cc32378a 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx @@ -245,7 +245,13 @@ struct DiHadronCor { registry.add("Trig_hist", "", {HistType::kTHnSparseF, {{axisSample, axisVertex, axisPtTrigger}}}); registry.add("eventcount", "bin", {HistType::kTH1F, {{4, 0, 4, "bin"}}}); // histogram to see how many events are in the same and mixed event - if (doprocessMCSame) { + if (doprocessMCSame && doprocessOntheflySame) { + LOGF(fatal, "Full simulation and on-the-fly processing of same event not supported"); + } + if (doprocessMCMixed && doprocessOntheflyMixed) { + LOGF(fatal, "Full simulation and on-the-fly processing of mixed event not supported"); + } + if (doprocessMCSame || doprocessOntheflySame) { registry.add("MCTrue/MCeventcount", "MCeventcount", {HistType::kTH1F, {{4, 0, 4, "bin"}}}); // histogram to see how many events are in the same and mixed event registry.add("MCTrue/MCCentrality", hCentTitle.c_str(), {HistType::kTH1D, {axisCentrality}}); registry.add("MCTrue/MCNch", "N_{ch}", {HistType::kTH1D, {axisMultiplicity}}); @@ -806,6 +812,66 @@ struct DiHadronCor { } } PROCESS_SWITCH(DiHadronCor, processMCMixed, "Process MC mixed events", false); + + void processOntheflySame(FilteredMcCollisions::iterator const& mcCollision, FilteredMcParticles const& mcParticles) + { + if (cfgVerbosity) { + LOGF(info, "processOntheflySame. MC collision: %d, particles: %d", mcCollision.globalIndex(), mcParticles.size()); + } + + if (cfgSelCollByNch && (mcParticles.size() < cfgCutMultMin || mcParticles.size() >= cfgCutMultMax)) { + return; + } + + registry.fill(HIST("MCTrue/MCeventcount"), SameEvent); // because its same event i put it in the 1 bin + registry.fill(HIST("MCTrue/MCNch"), mcParticles.size()); + registry.fill(HIST("MCTrue/MCzVtx"), mcCollision.posZ()); + for (const auto& mcParticle : mcParticles) { + if (mcParticle.isPhysicalPrimary()) { + registry.fill(HIST("MCTrue/MCPhi"), mcParticle.phi()); + registry.fill(HIST("MCTrue/MCEta"), mcParticle.eta()); + registry.fill(HIST("MCTrue/MCpT"), mcParticle.pt()); + } + } + + same->fillEvent(mcParticles.size(), CorrelationContainer::kCFStepAll); + fillMCCorrelations(mcParticles, mcParticles, mcCollision.posZ(), SameEvent); + + same->fillEvent(mcParticles.size(), CorrelationContainer::kCFStepTrackedOnlyPrim); + fillMCCorrelations(mcParticles, mcParticles, mcCollision.posZ(), SameEvent); + } + PROCESS_SWITCH(DiHadronCor, processOntheflySame, "Process on-the-fly same event", false); + + void processOntheflyMixed(FilteredMcCollisions const& mcCollisions, FilteredMcParticles const& mcParticles) + { + auto getTracksSize = [&mcParticles, this](FilteredMcCollisions::iterator const& mcCollision) { + auto associatedTracks = mcParticles.sliceByCached(o2::aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), this->cache); + auto mult = associatedTracks.size(); + return mult; + }; + + using MixedBinning = FlexibleBinningPolicy, o2::aod::mccollision::PosZ, decltype(getTracksSize)>; + + MixedBinning binningOnVtxAndMult{{getTracksSize}, {axisVtxMix, axisMultMix}, true}; + + auto tracksTuple = std::make_tuple(mcParticles, mcParticles); + Pair pair{binningOnVtxAndMult, cfgMixEventNumMin, -1, mcCollisions, tracksTuple, &cache}; // -1 is the number of the bin to skip + for (auto const& [collision1, tracks1, collision2, tracks2] : pair) { + + if (cfgSelCollByNch && (tracks1.size() < cfgCutMultMin || tracks1.size() >= cfgCutMultMax)) + continue; + + if (cfgSelCollByNch && (tracks2.size() < cfgCutMultMin || tracks2.size() >= cfgCutMultMax)) + continue; + + registry.fill(HIST("MCTrue/MCeventcount"), MixedEvent); // fill the mixed event in the 3 bin + + fillMCCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent); + + fillMCCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent); + } + } + PROCESS_SWITCH(DiHadronCor, processOntheflyMixed, "Process on-the-fly mixed events", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 26b69d99b8273fd8ab95304c4474f5a1c820aab9 Mon Sep 17 00:00:00 2001 From: blacwovie Date: Sat, 7 Jun 2025 03:01:07 +0800 Subject: [PATCH 1540/1650] [PWGCF] Update PiDeuteronFemto.cxx (#11496) Co-authored-by: ALICE Action Bot --- PWGCF/Femto/TableProducer/PiDeuteronFemto.cxx | 149 ++++++++++++++---- 1 file changed, 121 insertions(+), 28 deletions(-) diff --git a/PWGCF/Femto/TableProducer/PiDeuteronFemto.cxx b/PWGCF/Femto/TableProducer/PiDeuteronFemto.cxx index 6874bdcc607..9acef964220 100644 --- a/PWGCF/Femto/TableProducer/PiDeuteronFemto.cxx +++ b/PWGCF/Femto/TableProducer/PiDeuteronFemto.cxx @@ -152,8 +152,6 @@ struct PiDeuteronFemto { Configurable settingCutVertex{"settingCutVertex", 10.0f, "Accepted z-vertex range"}; Configurable settingCutPinMinDe{"settingCutPinMinDe", 0.0f, "Minimum Pin for De"}; Configurable settingCutEta{"settingCutEta", 0.8f, "Eta cut on daughter track"}; - Configurable settingCutDCAxy{"settingCutDCAxy", 2.0f, "DCAxy range for tracks"}; - Configurable settingCutDCAz{"settingCutDCAz", 2.0f, "DCAz range for tracks"}; Configurable settingCutChi2tpcLow{"settingCutChi2tpcLow", 0.0f, "Low cut on TPC chi2"}; Configurable settingCutChi2tpcHigh{"settingCutChi2tpcHigh", 999.f, "High cut on TPC chi2"}; Configurable settingCutInvMass{"settingCutInvMass", 0.0f, "Invariant mass upper limit"}; @@ -170,6 +168,18 @@ struct PiDeuteronFemto { Configurable settingCutNsigmaTOFTPCPi{"settingCutNsigmaTOFTPCPi", 3.0f, "Value of the Pion TOF TPC Nsigma cut"}; Configurable settingNoMixedEvents{"settingNoMixedEvents", 5, "Number of mixed events per event"}; Configurable settingEnableBkgUS{"settingEnableBkgUS", false, "Enable US background"}; + + Configurable settingFillTable{"settingFillTable", false, "Enable table filling"}; + Configurable settingCutPiptMin{"settingCutPiptMin", 0.14f, "Minimum PT cut on Pi"}; + Configurable settingCutPiptMax{"settingCutPiptMax", 4.0f, "Maximum PT cut on Pi"}; + Configurable settingCutDeptMin{"settingCutDeptMin", 0.6f, "Minimum PT cut on De"}; + Configurable settingCutDeptMax{"settingCutDeptMax", 1.6f, "Maximum PT cut on De"}; + Configurable settingCutPiDCAxyMin{"settingCutPiDCAxyMin", 0.3f, "DCAxy Min for Pi"}; + Configurable settingCutPiDCAzMin{"settingCutPiDCAzMin", 0.3f, "DCAz Min for Pi"}; + Configurable settingCutDeDCAzMin{"settingCutDeDCAzMin", 0.2f, "DCAxy Min for De"}; + Configurable settingCutNsigTPCPrMin{"settingCutNsigTPCPrMin", 3.0f, "Minimum TPC Pr Nsigma cut on Pi"}; + Configurable settingCutNsigTOFPrMin{"settingCutNsigTOFPrMin", 3.0f, "Minimum TOF Pr Nsigma cut on Pi"}; + Configurable settingSaveUSandLS{"settingSaveUSandLS", true, "Save All Pairs"}; Configurable settingFillMultiplicity{"settingFillMultiplicity", false, "Fill multiplicity table"}; @@ -214,30 +224,33 @@ struct PiDeuteronFemto { HistogramRegistry mQaRegistry{ "QA", - { - {"hVtxZ", "Vertex distribution in Z;Z (cm)", {HistType::kTH1F, {{400, -20.0, 20.0}}}}, - {"hNcontributor", "Number of primary vertex contributor", {HistType::kTH1F, {{2000, 0.0f, 2000.0f}}}}, - {"hTrackSel", "Accepted tracks", {HistType::kTH1F, {{Selections::kAll, -0.5, static_cast(Selections::kAll) - 0.5}}}}, - {"hEvents", "; Events;", {HistType::kTH1F, {{3, -0.5, 2.5}}}}, - {"hEmptyPool", "svPoolCreator did not find track pairs false/true", {HistType::kTH1F, {{2, -0.5, 1.5}}}}, - {"hdcaxyDe", ";DCA_{xy} (cm)", {HistType::kTH1F, {{200, -1.0f, 1.0f}}}}, - {"hdcazDe", ";DCA_{z} (cm)", {HistType::kTH1F, {{200, -1.0f, 1.0f}}}}, - {"hNClsDeITS", ";N_{ITS} Cluster", {HistType::kTH1F, {{20, -10.0f, 10.0f}}}}, - {"hNClsPiITS", ";N_{ITS} Cluster", {HistType::kTH1F, {{20, -10.0f, 10.0f}}}}, - {"hDePitInvMass", "; M(De + p) (GeV/#it{c}^{2})", {HistType::kTH1F, {{300, 3.74f, 4.34f}}}}, - {"hDePt", "#it{p}_{T} distribution; #it{p}_{T} (GeV/#it{c})", {HistType::kTH1F, {{240, -6.0f, 6.0f}}}}, - {"hPiPt", "Pt distribution; #it{p}_{T} (GeV/#it{c})", {HistType::kTH1F, {{120, -3.0f, 3.0f}}}}, - {"h2dEdxDecandidates", "dEdx distribution; #it{p} (GeV/#it{c}); dE/dx (a.u.)", {HistType::kTH2F, {{200, -5.0f, 5.0f}, {100, 0.0f, 2000.0f}}}}, - {"h2NsigmaDeTPC", "NsigmaDe TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(De)", {HistType::kTH2F, {{20, -5.0f, 5.0f}, {200, -5.0f, 5.0f}}}}, - {"h2NsigmaDeTPC_preselection", "NsigmaDe TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(De)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}}, - {"h2NsigmaDeTPC_preselecComp", "NsigmaDe TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(De)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}}, - {"h2NSigmaDeITS_preselection", "NsigmaDe ITS distribution; signed #it{p}_{T} (GeV/#it{c}); n#sigma_{ITS} De", {HistType::kTH2F, {{50, -5.0f, 5.0f}, {120, -3.0f, 3.0f}}}}, - {"h2NSigmaDeITS", "NsigmaDe ITS distribution; signed #it{p}_{T} (GeV/#it{c}); n#sigma_{ITS} De", {HistType::kTH2F, {{50, -5.0f, 5.0f}, {120, -3.0f, 3.0f}}}}, - {"h2NsigmaPiTPC", "NsigmaPi TPC distribution; #it{p}_{T}(GeV/#it{c}); n#sigma_{TPC}(p)", {HistType::kTH2F, {{20, -5.0f, 5.0f}, {200, -5.0f, 5.0f}}}}, - {"h2NsigmaPiTPC_preselection", "NsigmaDe TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(De)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}}, - {"h2NsigmaPiTOF", "NsigmaPi TOF distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TOF}(p)", {HistType::kTH2F, {{20, -5.0f, 5.0f}, {200, -5.0f, 5.0f}}}}, - {"h2NsigmaPiTOF_preselection", "NsigmaPi TOF distribution; #iit{p}_{T} (GeV/#it{c}); n#sigma_{TOF}(p)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}}, - }, + {{"hVtxZ", "Vertex distribution in Z;Z (cm)", {HistType::kTH1F, {{400, -20.0, 20.0}}}}, + {"hNcontributor", "Number of primary vertex contributor", {HistType::kTH1F, {{2000, 0.0f, 2000.0f}}}}, + {"hTrackSel", "Accepted tracks", {HistType::kTH1F, {{Selections::kAll, -0.5, static_cast(Selections::kAll) - 0.5}}}}, + {"hEvents", "; Events;", {HistType::kTH1F, {{3, -0.5, 2.5}}}}, + {"hEmptyPool", "svPoolCreator did not find track pairs false/true", {HistType::kTH1F, {{2, -0.5, 1.5}}}}, + {"hdcaxyDe", ";DCA_{xy} (cm)", {HistType::kTH1F, {{200, -1.0f, 1.0f}}}}, + {"hdcazDe", ";DCA_{z} (cm)", {HistType::kTH1F, {{200, -1.0f, 1.0f}}}}, + {"hNClsDeITS", ";N_{ITS} Cluster", {HistType::kTH1F, {{20, -10.0f, 10.0f}}}}, + {"hNClsPiITS", ";N_{ITS} Cluster", {HistType::kTH1F, {{20, -10.0f, 10.0f}}}}, + {"hDePitInvMass", "; M(De + p) (GeV/#it{c}^{2})", {HistType::kTH1F, {{300, 3.74f, 4.34f}}}}, + {"hDePt", "#it{p}_{T} distribution; #it{p}_{T} (GeV/#it{c})", {HistType::kTH1F, {{240, -6.0f, 6.0f}}}}, + {"hPiPt", "Pt distribution; #it{p}_{T} (GeV/#it{c})", {HistType::kTH1F, {{120, -3.0f, 3.0f}}}}, + {"h2dEdxDecandidates", "dEdx distribution; #it{p} (GeV/#it{c}); dE/dx (a.u.)", {HistType::kTH2F, {{200, -5.0f, 5.0f}, {100, 0.0f, 2000.0f}}}}, + {"h2NsigmaDeTPC", "NsigmaDe TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(De)", {HistType::kTH2F, {{20, -5.0f, 5.0f}, {200, -5.0f, 5.0f}}}}, + {"h2NsigmaDeTPC_preselection", "NsigmaDe TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(De)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}}, + {"h2NsigmaDeTPC_preselecComp", "NsigmaDe TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(De)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}}, + {"h2NSigmaDeITS_preselection", "NsigmaDe ITS distribution; signed #it{p}_{T} (GeV/#it{c}); n#sigma_{ITS} De", {HistType::kTH2F, {{50, -5.0f, 5.0f}, {120, -3.0f, 3.0f}}}}, + {"h2NSigmaDeITS", "NsigmaDe ITS distribution; signed #it{p}_{T} (GeV/#it{c}); n#sigma_{ITS} De", {HistType::kTH2F, {{50, -5.0f, 5.0f}, {120, -3.0f, 3.0f}}}}, + {"h2NsigmaPiTPC", "NsigmaPi TPC distribution; #it{p}_{T}(GeV/#it{c}); n#sigma_{TPC}(p)", {HistType::kTH2F, {{20, -5.0f, 5.0f}, {200, -5.0f, 5.0f}}}}, + {"h2NsigmaPiTPC_preselection", "NsigmaDe TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(De)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}}, + {"h2NsigmaPiTOF", "NsigmaPi TOF distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TOF}(p)", {HistType::kTH2F, {{20, -5.0f, 5.0f}, {200, -5.0f, 5.0f}}}}, + {"h2NsigmaPiTOF_preselection", "NsigmaPi TOF distribution; #iit{p}_{T} (GeV/#it{c}); n#sigma_{TOF}(p)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}}, + {"hkStar_LS_M", ";kStar (GeV/c)", {HistType::kTH1F, {{300, 0.0f, 3.0f}}}}, + {"hkStar_LS_A", ";kStar (GeV/c)", {HistType::kTH1F, {{300, 0.0f, 3.0f}}}}, + {"hkStar_US_M", ";kStar (GeV/c)", {HistType::kTH1F, {{300, 0.0f, 3.0f}}}}, + {"hkStar_US_A", ";kStar (GeV/c)", {HistType::kTH1F, {{300, 0.0f, 3.0f}}}}, + {"hisBkgEM", "; isBkgEM;", {HistType::kTH1F, {{3, -1, 2}}}}}, OutputObjHandlingPolicy::AnalysisObject, false, true}; @@ -683,6 +696,81 @@ struct PiDeuteronFemto { mQaRegistry.fill(HIST("hdcazDe"), piDecand.dcazDe); mQaRegistry.fill(HIST("hNClsDeITS"), piDecand.nClsItsDe); mQaRegistry.fill(HIST("hNClsPiITS"), piDecand.nClsItsPi); + mQaRegistry.fill(HIST("hisBkgEM"), piDecand.isBkgEM); + } + + double computePrTPCnsig(double InnerParamTPCHad, double SignalTPCHad) + { + double m_BBparamsProton[6] = {-54.42066571222577, 0.2857381250239097, 1.247140602468868, 0.6297483918147729, 2.985438833884555, 0.09}; + + float TPCinnerParam = InnerParamTPCHad; + float expTPCSignal = o2::tpc::BetheBlochAleph((TPCinnerParam / 0.9382721), m_BBparamsProton[0], m_BBparamsProton[1], m_BBparamsProton[2], m_BBparamsProton[3], m_BBparamsProton[4]); + double resoTPC{expTPCSignal * m_BBparamsProton[5]}; + return ((SignalTPCHad - expTPCSignal) / resoTPC); + } + + double tofNSigmaCalculation(double MassTOFHad, double ptHad) + { + double fExpTOFMassHad = 0.9487; // Proton mass in TOF + const float kp0 = 1.22204e-02; + const float kp1 = 7.48467e-01; + + double fSigmaTOFMassHad = (kp0 * TMath::Exp(kp1 * TMath::Abs(ptHad))) * fExpTOFMassHad; + double fNSigmaTOFHad = (MassTOFHad - fExpTOFMassHad) / fSigmaTOFMassHad; + return fNSigmaTOFHad; + } + + double computeKstar(const PiDecandidate& piDecand) + { + TLorentzVector he3, hadron; + float massHe3 = 2.80839; + float massHad = 0.1395704; + he3.SetPtEtaPhiM(abs(piDecand.recoPtDe()), piDecand.recoEtaDe(), piDecand.recoPhiDe(), massHe3); + hadron.SetPtEtaPhiM(abs(piDecand.recoPtPi()), piDecand.recoEtaPi(), piDecand.recoPhiPi(), massHad); + + TLorentzVector p_total_lab = he3 + hadron; + TVector3 v_cm = p_total_lab.BoostVector(); + TLorentzVector p1_cm = he3; + TLorentzVector p2_cm = hadron; + p1_cm.Boost(-v_cm); + p2_cm.Boost(-v_cm); + TLorentzVector p_diff_cm = p1_cm - p2_cm; + double kStar = sqrt(p_diff_cm.X() * p_diff_cm.X() + p_diff_cm.Y() * p_diff_cm.Y() + p_diff_cm.Z() * p_diff_cm.Z()); + return kStar / 2.0; + } + + void fillKstar(const PiDecandidate& piDecand) + { + double PrTPCnsigma = computePrTPCnsig(piDecand.momPiTPC, piDecand.tpcSignalPi); + double PrTOFnsigma = tofNSigmaCalculation(piDecand.massTOFPi, piDecand.recoPtPi()); + if (abs(PrTPCnsigma) < settingCutNsigTPCPrMin) + return; + if (abs(PrTOFnsigma) < settingCutNsigTOFPrMin) + return; + float DeDCAxyMin = 0.015 + 0.0305 / TMath::Power(piDecand.recoPtDe(), 1.1); + if (abs(piDecand.dcaxyDe) > DeDCAxyMin || abs(piDecand.dcazDe) > settingCutDeDCAzMin || abs(piDecand.dcaxyPi) > settingCutPiDCAxyMin || abs(piDecand.dcazPi) > settingCutPiDCAzMin) + return; + if (std::abs(piDecand.recoPtPi()) < settingCutPiptMin || std::abs(piDecand.recoPtPi()) > settingCutPiptMax) + return; + if (std::abs(piDecand.recoPtDe()) < settingCutDeptMin || std::abs(piDecand.recoPtDe()) > settingCutDeptMax) + return; + + fillHistograms(piDecand); + + double kstar = computeKstar(piDecand); + if (piDecand.isBkgUS == 0) { + if (piDecand.recoPtDe() > 0) { + mQaRegistry.fill(HIST("hkStar_LS_M"), kstar); + } else { + mQaRegistry.fill(HIST("hkStar_LS_A"), kstar); + } + } else { + if (piDecand.recoPtDe() > 0) { + mQaRegistry.fill(HIST("hkStar_US_M"), kstar); + } else { + mQaRegistry.fill(HIST("hkStar_US_A"), kstar); + } + } } // ================================================================================================================== @@ -700,9 +788,14 @@ struct PiDeuteronFemto { if (!fillCandidateInfo(deTrack, piTrack, collBracket, collisions, piDecand, tracks, isMixedEvent)) { continue; } - fillHistograms(piDecand); + + fillKstar(piDecand); + auto collision = collisions.rawIteratorAt(piDecand.collisionID); - fillTable(piDecand, collision); + + if (settingFillTable) { + fillTable(piDecand, collision); + } } } From 611656e6c2c8634aa3081ab40855ae5924b22cc7 Mon Sep 17 00:00:00 2001 From: a-m-andrushko <96832230+a-m-andrushko@users.noreply.github.com> Date: Fri, 6 Jun 2025 21:03:39 +0200 Subject: [PATCH 1541/1650] [PWGCF] FemtoUniverse -- Add helicity angle analysis in lambda decay. (#11254) --- PWGCF/FemtoUniverse/Core/FemtoUniverseMath.h | 8 +- .../Tasks/femtoUniverseDebugV0.cxx | 91 +++++++++++-------- 2 files changed, 56 insertions(+), 43 deletions(-) diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseMath.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseMath.h index a55c896fb6b..ec40ea035e6 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseMath.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseMath.h @@ -64,13 +64,14 @@ class FemtoUniverseMath return 0.5 * trackRelK.P(); } + /// Boost particles from LAB Frame to Pair Rest Frame (for lambda daughters) /// \tparam T type of tracks /// \param part1 Particle 1 /// \param mass1 Mass of particle 1 /// \param part2 Particle 2 /// \param mass2 Mass of particle 2 template - static float getthetastar(const T& part1, const float mass1, const T& part2, const float mass2) + static ROOT::Math::PxPyPzMVector boostPRF(const T& part1, const float mass1, const T& part2, const float mass2) { const ROOT::Math::PtEtaPhiMVector vecpart1(part1.pt(), part1.eta(), part1.phi(), mass1); const ROOT::Math::PtEtaPhiMVector vecpart2(part2.pt(), part2.eta(), part2.phi(), mass2); @@ -88,10 +89,7 @@ class FemtoUniverseMath partOneCMS = boostPRF(partOneCMS); partTwoCMS = boostPRF(partTwoCMS); - const ROOT::Math::PtEtaPhiMVector partOneCMSGeo(partOneCMS); - const ROOT::Math::PtEtaPhiMVector partTwoCMSGeo(partTwoCMS); - - return (partOneCMSGeo.Theta() - partTwoCMSGeo.Theta()); + return partOneCMS; } /// Compute the qij of a pair of particles diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniverseDebugV0.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniverseDebugV0.cxx index 955af5a6876..d35aa3fa779 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniverseDebugV0.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniverseDebugV0.cxx @@ -16,20 +16,22 @@ #include #include -#include #include +#include #include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" #include "Framework/HistogramRegistry.h" #include "Framework/ASoAHelpers.h" #include "Framework/RunningWorkflowInfo.h" #include "Framework/StepTHn.h" +#include "Framework/O2DatabasePDGPlugin.h" #include "DataFormatsParameters/GRPObject.h" #include "PWGCF/FemtoUniverse/DataModel/FemtoDerived.h" #include "PWGCF/FemtoUniverse/Core/FemtoUniverseParticleHisto.h" #include "PWGCF/FemtoUniverse/Core/FemtoUniverseEventHisto.h" #include "PWGCF/FemtoUniverse/Core/femtoUtils.h" +#include "PWGCF/FemtoUniverse/Core/FemtoUniverseMath.h" using namespace o2; using namespace o2::analysis::femto_universe; @@ -37,72 +39,85 @@ using namespace o2::framework; using namespace o2::framework::expressions; using namespace o2::soa; -struct femtoUniverseDebugV0 { +struct FemtoUniverseDebugV0 { + + Service pdg; + SliceCache cache; - Configurable ConfPDGCodeV0{"ConfPDGCodePartOne", 3122, "V0 - PDG code"}; - Configurable ConfPDGCodeChildPos{"ConfPDGCodeChildPos", 2212, "Positive Child - PDG code"}; - Configurable ConfPDGCodeChildNeg{"ConfPDGCodeChildNeg", 211, "Negative Child- PDG code"}; - Configurable ConfCutV0{"ConfCutV0", 338, "V0 - Selection bit from cutCulator"}; - ConfigurableAxis ConfV0TempFitVarBins{"ConfV0TempFitVarBins", {300, 0.95, 1.}, "V0: binning of the TempFitVar in the pT vs. TempFitVar plot"}; - ConfigurableAxis ConfV0TempFitVarpTBins{"ConfV0TempFitVarpTBins", {20, 0.5, 4.05}, "V0: pT binning of the pT vs. TempFitVar plot"}; - - Configurable ConfCutChildPos{"ConfCutChildPos", 150, "Positive Child of V0 - Selection bit from cutCulator"}; - Configurable ConfCutChildNeg{"ConfCutChildNeg", 149, "Negative Child of V0 - Selection bit from cutCulator"}; - Configurable ConfChildPosPidnSigmaMax{"ConfChildPosPidnSigmaMax", 3.f, "Positive Child of V0 - Selection bit from cutCulator"}; - Configurable ConfChildNegPidnSigmaMax{"ConfChildNegPidnSigmaMax", 3.f, "Negative Child of V0 - Selection bit from cutCulator"}; - Configurable ConfChildPosIndex{"ConfChildPosIndex", 1, "Positive Child of V0 - Index from cutCulator"}; - Configurable ConfChildNegIndex{"ConfChildNegIndex", 0, "Negative Child of V0 - Index from cutCulator"}; - Configurable> ConfChildPIDnSigmaMax{"ConfChildPIDnSigmaMax", std::vector{4.f, 3.f}, "V0 child sel: Max. PID nSigma TPC"}; - Configurable ConfChildnSpecies{"ConfChildnSpecies", 2, "Number of particle spieces (for V0 children) with PID info"}; - ConfigurableAxis ConfChildTempFitVarBins{"ConfChildTempFitVarBins", {300, -0.15, 0.15}, "V0 child: binning of the TempFitVar in the pT vs. TempFitVar plot"}; - ConfigurableAxis ConfChildTempFitVarpTBins{"ConfChildTempFitVarpTBins", {20, 0.5, 4.05}, "V0 child: pT binning of the pT vs. TempFitVar plot"}; + Configurable confPDGCodeV0{"confPDGCodeV0", 3122, "V0 -- PDG code"}; + Configurable confPDGCodePositiveChild{"confPDGCodePositiveChild", 2212, "Positive Child -- PDG code"}; + Configurable confPDGCodeNegativeChild{"confPDGCodeNegativeChild", 211, "Negative Child -- PDG code"}; + Configurable confCutV0{"confCutV0", 338, "V0 -- Selection bit from cutCulator"}; + ConfigurableAxis confV0TempFitVarBins{"confV0TempFitVarBins", {300, 0.95, 1.}, "V0: binning of the TempFitVar in the pT vs. TempFitVar plot"}; + ConfigurableAxis confV0TempFitVarpTBins{"confV0TempFitVarpTBins", {20, 0.5, 4.05}, "V0: pT binning of the pT vs. TempFitVar plot"}; + + Configurable confCutPositiveChild{"confCutPositiveChild", 150, "Positive Child of V0 -- Selection bit from cutCulator"}; + Configurable confCutNegativeChild{"confCutNegativeChild", 149, "Negative Child of V0 -- Selection bit from cutCulator"}; + Configurable confPositiveChildPIDnSigmaMax{"confPositiveChildPIDnSigmaMax", 3.f, "Positive Child of V0 -- Selection bit from cutCulator"}; + Configurable confNegativeChildPIDnSigmaMax{"confNegativeChildPIDnSigmaMax", 3.f, "Negative Child of V0 -- Selection bit from cutCulator"}; + Configurable confPositiveChildIndex{"confPositiveChildIndex", 1, "Positive Child of V0 -- Index from cutCulator"}; + Configurable confNegativeChildIndex{"confNegativeChildIndex", 0, "Negative Child of V0 -- Index from cutCulator"}; + Configurable> confChildPIDnSigmaMax{"confChildPIDnSigmaMax", std::vector{4.f, 3.f}, "V0 child selection: max. PID nSigma TPC"}; + Configurable confChildnSpecies{"confChildnSpecies", 2, "Number of particle spieces (for V0 children) with PID info"}; + ConfigurableAxis confChildTempFitVarBins{"confChildTempFitVarBins", {300, -0.15, 0.15}, "V0 child: binning of the TempFitVar in the pT vs. TempFitVar plot"}; + ConfigurableAxis confChildTempFitVarpTBins{"confChildTempFitVarpTBins", {20, 0.5, 4.05}, "V0 child: pT binning of the pT vs. TempFitVar plot"}; using FemtoFullParticles = soa::Join; - Partition partsOne = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kV0)) && ((aod::femtouniverseparticle::cut & ConfCutV0) == ConfCutV0); + Partition partsOne = (aod::femtouniverseparticle::partType == uint8_t(aod::femtouniverseparticle::ParticleType::kV0)) && ((aod::femtouniverseparticle::cut & confCutV0) == confCutV0); Preslice perCol = aod::femtouniverseparticle::fdCollisionId; /// Histogramming FemtoUniverseEventHisto eventHisto; - FemtoUniverseParticleHisto posChildHistos; - FemtoUniverseParticleHisto negChildHistos; + FemtoUniverseParticleHisto positiveChildHistos; + FemtoUniverseParticleHisto negativeChildHistos; FemtoUniverseParticleHisto V0Histos; /// Histogram output HistogramRegistry EventRegistry{"Event", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry V0Registry{"FullV0QA", {}, OutputObjHandlingPolicy::AnalysisObject}; + HistogramRegistry thetaRegistry{"ThetaQA", {}, OutputObjHandlingPolicy::AnalysisObject}; void init(InitContext&) { eventHisto.init(&EventRegistry); - posChildHistos.init(&V0Registry, ConfChildTempFitVarpTBins, ConfChildTempFitVarBins, false, ConfPDGCodeChildPos.value, true); - negChildHistos.init(&V0Registry, ConfChildTempFitVarpTBins, ConfChildTempFitVarBins, false, ConfPDGCodeChildNeg, true); - V0Histos.init(&V0Registry, ConfV0TempFitVarpTBins, ConfV0TempFitVarBins, false, ConfPDGCodeV0.value, true); + positiveChildHistos.init(&V0Registry, confChildTempFitVarpTBins, confChildTempFitVarBins, false, confPDGCodePositiveChild.value, true); + negativeChildHistos.init(&V0Registry, confChildTempFitVarpTBins, confChildTempFitVarBins, false, confPDGCodeNegativeChild, true); + V0Histos.init(&V0Registry, confV0TempFitVarpTBins, confV0TempFitVarBins, false, confPDGCodeV0.value, true); + + thetaRegistry.add("Theta/hTheta", " ; p (GeV/#it{c}); cos(#theta)", kTH2F, {{100, 0, 10}, {50, -5, 5}}); } - /// Porduce QA plots for V0 selection in FemtoUniverse framework + /// Produce QA plots for V0 selection in FemtoUniverse framework void process(o2::aod::FdCollision const& col, FemtoFullParticles const& parts) { auto groupPartsOne = partsOne->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); eventHisto.fillQA(col); - for (auto& part : groupPartsOne) { + for (const auto& part : groupPartsOne) { if (!part.has_children()) { continue; } - const auto& posChild = parts.iteratorAt(part.index() - 2); - const auto& negChild = parts.iteratorAt(part.index() - 1); - if (posChild.globalIndex() != part.childrenIds()[0] || negChild.globalIndex() != part.childrenIds()[1]) { + const auto& positiveChild = parts.iteratorAt(part.index() - 2); + const auto& negativeChild = parts.iteratorAt(part.index() - 1); + if (positiveChild.globalIndex() != part.childrenIds()[0] || negativeChild.globalIndex() != part.childrenIds()[1]) { LOG(warn) << "Indices of V0 children do not match"; continue; } - // check cuts on V0 children - if ((posChild.partType() == uint8_t(aod::femtouniverseparticle::ParticleType::kV0Child) && (posChild.cut() & ConfCutChildPos) == ConfCutChildPos) && - (negChild.partType() == uint8_t(aod::femtouniverseparticle::ParticleType::kV0Child) && (negChild.cut() & ConfCutChildNeg) == ConfCutChildNeg) && - isFullPIDSelected(posChild.pidCut(), posChild.p(), 999.f, ConfChildPosIndex.value, ConfChildnSpecies.value, ConfChildPIDnSigmaMax.value, ConfChildPosPidnSigmaMax.value, 1.f) && - isFullPIDSelected(negChild.pidCut(), negChild.p(), 999.f, ConfChildNegIndex.value, ConfChildnSpecies.value, ConfChildPIDnSigmaMax.value, ConfChildNegPidnSigmaMax.value, 1.f)) { + + // Check cuts on V0 children + if (positiveChild.partType() == uint8_t(aod::femtouniverseparticle::ParticleType::kV0Child) && + negativeChild.partType() == uint8_t(aod::femtouniverseparticle::ParticleType::kV0Child) && + isFullPIDSelected(positiveChild.pidCut(), positiveChild.p(), 999.f, confPositiveChildIndex.value, confChildnSpecies.value, confChildPIDnSigmaMax.value, confPositiveChildPIDnSigmaMax.value, 1.f) && + isFullPIDSelected(negativeChild.pidCut(), negativeChild.p(), 999.f, confNegativeChildIndex.value, confChildnSpecies.value, confChildPIDnSigmaMax.value, confNegativeChildPIDnSigmaMax.value, 1.f)) { + auto positiveChildMass = pdg->Mass(confPDGCodePositiveChild); + auto negativeChildMass = pdg->Mass(confPDGCodeNegativeChild); + auto positiveChildBoosted = FemtoUniverseMath::boostPRF(positiveChild, positiveChildMass, negativeChild, negativeChildMass); + auto cosineTheta = (positiveChildBoosted.Px() * part.px() + positiveChildBoosted.Py() * part.py() + positiveChildBoosted.Pz() * part.pz()) / (positiveChildBoosted.P() * part.p()); + V0Histos.fillQA(part); - posChildHistos.fillQA(posChild); - negChildHistos.fillQA(negChild); + positiveChildHistos.fillQA(positiveChild); + negativeChildHistos.fillQA(negativeChild); + thetaRegistry.fill(HIST("Theta/hTheta"), part.p(), cosineTheta); } } } @@ -112,7 +127,7 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { WorkflowSpec workflow{ - adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc), }; return workflow; } From ed92cfecb6d1a14e08e948e1841090feb8def32b Mon Sep 17 00:00:00 2001 From: Rik Spijkers <78484875+rspijkers@users.noreply.github.com> Date: Fri, 6 Jun 2025 22:32:12 +0200 Subject: [PATCH 1542/1650] [PWGLF] Implement MC processes in cascade selector (#11484) --- .../Tasks/Strangeness/cascadecorrelations.cxx | 502 ++++++++++++------ 1 file changed, 326 insertions(+), 176 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx b/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx index 8461e713543..632d80dd4d1 100644 --- a/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx +++ b/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx @@ -96,6 +96,7 @@ struct CascadeSelector { Configurable doNoSameBunchPileUp{"doNoSameBunchPileUp", true, "Switch to apply NoSameBunchPileUp event selection"}; Configurable INEL{"INEL", 0, "Number of charged tracks within |eta| < 1 has to be greater than value"}; Configurable maxVertexZ{"maxVertexZ", 10., "Maximum value of z coordinate of PV"}; + Configurable etaCascades{"etaCascades", 0.8, "min/max of eta for cascades"}; // Tracklevel Configurable tpcNsigmaBachelor{"tpcNsigmaBachelor", 3, "TPC NSigma bachelor"}; @@ -104,7 +105,6 @@ struct CascadeSelector { Configurable minTPCCrossedRows{"minTPCCrossedRows", 80, "min N TPC crossed rows"}; // TODO: finetune! 80 > 159/2, so no split tracks? Configurable minITSClusters{"minITSClusters", 4, "minimum number of ITS clusters"}; Configurable etaTracks{"etaTracks", 1.0, "min/max of eta for tracks"}; - Configurable etaCascades{"etaCascades", 0.8, "min/max of eta for cascades"}; // Selection criteria - compatible with core wagon autodetect - copied from cascadeanalysis.cxx //*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+* @@ -122,28 +122,32 @@ struct CascadeSelector { //*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+* // TODO: variables as function of Omega mass, only do Xi for now - AxisSpec vertexAxis = {100, -10.0f, 10.0f, "cm"}; - AxisSpec dcaAxis = {50, 0.0f, 5.0f, "cm"}; - // AxisSpec invMassAxis = {1000, 1.0f, 2.0f, "Inv. Mass (GeV/c^{2})"}; - AxisSpec invXiMassAxis = {100, 1.28f, 1.38f, "Inv. Mass (GeV/c^{2})"}; - AxisSpec invOmegaMassAxis = {100, 1.62f, 1.72f, "Inv. Mass (GeV/c^{2})"}; - AxisSpec ptAxis = {150, 0, 15, "#it{p}_{T}"}; - AxisSpec rapidityAxis{100, -1.f, 1.f, "y"}; + ConfigurableAxis radiusAxis = {"radiusAxis", {100, 0.0f, 50.0f}, "cm"}; + ConfigurableAxis cpaAxis = {"cpaAxis", {100, 0.95f, 1.0f}, "CPA"}; + ConfigurableAxis vertexAxis = {"vertexAxis", {100, -10.0f, 10.0f}, "cm"}; + ConfigurableAxis dcaAxis = {"dcaAxis", {100, 0.0f, 2.0f}, "cm"}; + ConfigurableAxis invXiMassAxis = {"invXiMassAxis", {100, 1.28f, 1.38f}, "Inv. Mass (GeV/c^{2})"}; + ConfigurableAxis invOmegaMassAxis = {"invOmegaMassAxis", {100, 1.62f, 1.72f}, "Inv. Mass (GeV/c^{2})"}; + ConfigurableAxis ptAxis = {"ptAxis", {150, 0, 15}, "#it{p}_{T}"}; + ConfigurableAxis rapidityAxis{"rapidityAxis", {100, -1.f, 1.f}, "y"}; + ConfigurableAxis invLambdaMassAxis{"invLambdaMassAxis", {100, 1.07f, 1.17f}, "Inv. Mass (GeV/c^{2})"}; + AxisSpec itsClustersAxis{8, -0.5, 7.5, "number of ITS clusters"}; + AxisSpec tpcRowsAxis{160, -0.5, 159.5, "TPC crossed rows"}; HistogramRegistry registry{ "registry", { // basic selection variables - {"hV0Radius", "hV0Radius", {HistType::kTH3F, {{100, 0.0f, 100.0f, "cm"}, invXiMassAxis, ptAxis}}}, - {"hCascRadius", "hCascRadius", {HistType::kTH3F, {{100, 0.0f, 100.0f, "cm"}, invXiMassAxis, ptAxis}}}, - {"hV0CosPA", "hV0CosPA", {HistType::kTH3F, {{100, 0.95f, 1.0f}, invXiMassAxis, ptAxis}}}, - {"hCascCosPA", "hCascCosPA", {HistType::kTH3F, {{100, 0.95f, 1.0f}, invXiMassAxis, ptAxis}}}, + {"hV0Radius", "hV0Radius", {HistType::kTH3F, {radiusAxis, invXiMassAxis, ptAxis}}}, + {"hCascRadius", "hCascRadius", {HistType::kTH3F, {radiusAxis, invXiMassAxis, ptAxis}}}, + {"hV0CosPA", "hV0CosPA", {HistType::kTH3F, {cpaAxis, invXiMassAxis, ptAxis}}}, + {"hCascCosPA", "hCascCosPA", {HistType::kTH3F, {cpaAxis, invXiMassAxis, ptAxis}}}, {"hDCAPosToPV", "hDCAPosToPV", {HistType::kTH3F, {vertexAxis, invXiMassAxis, ptAxis}}}, {"hDCANegToPV", "hDCANegToPV", {HistType::kTH3F, {vertexAxis, invXiMassAxis, ptAxis}}}, {"hDCABachToPV", "hDCABachToPV", {HistType::kTH3F, {vertexAxis, invXiMassAxis, ptAxis}}}, {"hDCAV0ToPV", "hDCAV0ToPV", {HistType::kTH3F, {vertexAxis, invXiMassAxis, ptAxis}}}, {"hDCAV0Dau", "hDCAV0Dau", {HistType::kTH3F, {dcaAxis, invXiMassAxis, ptAxis}}}, {"hDCACascDau", "hDCACascDau", {HistType::kTH3F, {dcaAxis, invXiMassAxis, ptAxis}}}, - {"hLambdaMass", "hLambdaMass", {HistType::kTH3F, {{100, 1.0f, 1.2f, "Inv. Mass (GeV/c^{2})"}, invXiMassAxis, ptAxis}}}, + {"hLambdaMass", "hLambdaMass", {HistType::kTH3F, {invLambdaMassAxis, invXiMassAxis, ptAxis}}}, {"hMassXiMinus", "hMassXiMinus", {HistType::kTH3F, {invXiMassAxis, ptAxis, rapidityAxis}}}, {"hMassXiPlus", "hMassXiPlus", {HistType::kTH3F, {invXiMassAxis, ptAxis, rapidityAxis}}}, @@ -159,12 +163,12 @@ struct CascadeSelector { // {"hMassXi5", "Xi inv mass after bachelor PID cut", {HistType::kTH2F, {invMassAxis, ptAxis}}}, // ITS & TPC clusters, with Xi inv mass - {"hTPCnCrossedRowsPos", "hTPCnCrossedRowsPos", {HistType::kTH3F, {{160, -0.5, 159.5, "TPC crossed rows"}, invXiMassAxis, ptAxis}}}, - {"hTPCnCrossedRowsNeg", "hTPCnCrossedRowsNeg", {HistType::kTH3F, {{160, -0.5, 159.5, "TPC crossed rows"}, invXiMassAxis, ptAxis}}}, - {"hTPCnCrossedRowsBach", "hTPCnCrossedRowsBach", {HistType::kTH3F, {{160, -0.5, 159.5, "TPC crossed rows"}, invXiMassAxis, ptAxis}}}, - {"hITSnClustersPos", "hITSnClustersPos", {HistType::kTH3F, {{8, -0.5, 7.5, "number of ITS clusters"}, invXiMassAxis, ptAxis}}}, - {"hITSnClustersNeg", "hITSnClustersNeg", {HistType::kTH3F, {{8, -0.5, 7.5, "number of ITS clusters"}, invXiMassAxis, ptAxis}}}, - {"hITSnClustersBach", "hITSnClustersBach", {HistType::kTH3F, {{8, -0.5, 7.5, "number of ITS clusters"}, invXiMassAxis, ptAxis}}}, + {"hTPCnCrossedRowsPos", "hTPCnCrossedRowsPos", {HistType::kTH3F, {tpcRowsAxis, invXiMassAxis, ptAxis}}}, + {"hTPCnCrossedRowsNeg", "hTPCnCrossedRowsNeg", {HistType::kTH3F, {tpcRowsAxis, invXiMassAxis, ptAxis}}}, + {"hTPCnCrossedRowsBach", "hTPCnCrossedRowsBach", {HistType::kTH3F, {tpcRowsAxis, invXiMassAxis, ptAxis}}}, + {"hITSnClustersPos", "hITSnClustersPos", {HistType::kTH3F, {itsClustersAxis, invXiMassAxis, ptAxis}}}, + {"hITSnClustersNeg", "hITSnClustersNeg", {HistType::kTH3F, {itsClustersAxis, invXiMassAxis, ptAxis}}}, + {"hITSnClustersBach", "hITSnClustersBach", {HistType::kTH3F, {itsClustersAxis, invXiMassAxis, ptAxis}}}, {"hTriggerQA", "hTriggerQA", {HistType::kTH1F, {{2, -0.5, 1.5, "Trigger y/n"}}}}, }, @@ -193,11 +197,43 @@ struct CascadeSelector { hEventSel->GetXaxis()->SetBinLabel(4, "V_z"); hEventSel->GetXaxis()->SetBinLabel(5, "NoSameBunchPileUp"); hEventSel->GetXaxis()->SetBinLabel(6, "Selected events"); + + if (doprocessRecMC) { + // only create the rec matched to gen histograms if relevant + registry.add("truerec/hV0Radius", "hV0Radius", HistType::kTH1F, {radiusAxis}); + registry.add("truerec/hCascRadius", "hCascRadius", HistType::kTH1F, {radiusAxis}); + registry.add("truerec/hV0CosPA", "hV0CosPA", HistType::kTH1F, {cpaAxis}); + registry.add("truerec/hCascCosPA", "hCascCosPA", HistType::kTH1F, {cpaAxis}); + registry.add("truerec/hDCAPosToPV", "hDCAPosToPV", HistType::kTH1F, {vertexAxis}); + registry.add("truerec/hDCANegToPV", "hDCANegToPV", HistType::kTH1F, {vertexAxis}); + registry.add("truerec/hDCABachToPV", "hDCABachToPV", HistType::kTH1F, {vertexAxis}); + registry.add("truerec/hDCAV0ToPV", "hDCAV0ToPV", HistType::kTH1F, {vertexAxis}); + registry.add("truerec/hDCAV0Dau", "hDCAV0Dau", HistType::kTH1F, {dcaAxis}); + registry.add("truerec/hDCACascDau", "hDCACascDau", HistType::kTH1F, {dcaAxis}); + registry.add("truerec/hLambdaMass", "hLambdaMass", HistType::kTH1F, {invLambdaMassAxis}); + registry.add("truerec/hTPCnCrossedRowsPos", "hTPCnCrossedRowsPos", HistType::kTH1F, {tpcRowsAxis}); + registry.add("truerec/hTPCnCrossedRowsNeg", "hTPCnCrossedRowsNeg", HistType::kTH1F, {tpcRowsAxis}); + registry.add("truerec/hTPCnCrossedRowsBach", "hTPCnCrossedRowsBach", HistType::kTH1F, {tpcRowsAxis}); + registry.add("truerec/hITSnClustersPos", "hITSnClustersPos", HistType::kTH1F, {itsClustersAxis}); + registry.add("truerec/hITSnClustersNeg", "hITSnClustersNeg", HistType::kTH1F, {itsClustersAxis}); + registry.add("truerec/hITSnClustersBach", "hITSnClustersBach", HistType::kTH1F, {itsClustersAxis}); + registry.add("truerec/hXiMinus", "hXiMinus", HistType::kTH2F, {ptAxis, rapidityAxis}); + registry.add("truerec/hXiPlus", "hXiPlus", HistType::kTH2F, {ptAxis, rapidityAxis}); + registry.add("truerec/hOmegaMinus", "hOmegaMinus", HistType::kTH2F, {ptAxis, rapidityAxis}); + registry.add("truerec/hOmegaPlus", "hOmegaPlus", HistType::kTH2F, {ptAxis, rapidityAxis}); + } + + if (doprocessGenMC) { + // only create the MC gen histograms if relevant + registry.add("gen/hXiMinus", "hXiMinus", HistType::kTH2F, {ptAxis, rapidityAxis}); + registry.add("gen/hXiPlus", "hXiPlus", HistType::kTH2F, {ptAxis, rapidityAxis}); + registry.add("gen/hOmegaMinus", "hOmegaMinus", HistType::kTH2F, {ptAxis, rapidityAxis}); + registry.add("gen/hOmegaPlus", "hOmegaPlus", HistType::kTH2F, {ptAxis, rapidityAxis}); + } } - void process(MyCollisions::iterator const& collision, aod::CascDataExt const& Cascades, FullTracksExtIUWithPID const&, aod::BCsWithTimestamps const&) + bool eventSelection(MyCollisions::iterator const& collision) { - bool evSel = true; if (useTrigger) { auto bc = collision.bc_as(); zorro.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), triggerList); @@ -206,177 +242,273 @@ struct CascadeSelector { registry.fill(HIST("hTriggerQA"), 1); } else { registry.fill(HIST("hTriggerQA"), 0); - evSel = false; + return false; } } - // fill event selection based on which selection criteria are applied and passed - // do not skip the collision - this will lead to the cascadeFlag table having less entries than the Cascade table, and therefor not joinable. registry.fill(HIST("hEventSel"), 0); if (doSel8 && !collision.sel8()) { - evSel = false; registry.fill(HIST("hEventSel"), 1); + return false; } else if (collision.multNTracksPVeta1() <= INEL) { - evSel = false; registry.fill(HIST("hEventSel"), 2); + return false; } else if (std::abs(collision.posZ()) > maxVertexZ) { - evSel = false; registry.fill(HIST("hEventSel"), 3); + return false; } else if (doNoSameBunchPileUp && !collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { - evSel = false; registry.fill(HIST("hEventSel"), 4); + return false; } - if (evSel) // passes all selections - registry.fill(HIST("hEventSel"), 5); + // passes all selections + registry.fill(HIST("hEventSel"), 5); + return true; + } - for (auto const& casc : Cascades) { - if (!evSel) { - cascflags(0); - continue; + void fillMatchedHistos(LabeledCascades::iterator rec, int flag, MyCollisions::iterator collision) + { + if (flag == 0) + return; + if (!rec.has_mcParticle()) + return; + auto gen = rec.mcParticle(); + if (!gen.isPhysicalPrimary()) + return; + int genpdg = gen.pdgCode(); + if ((flag < 3 && TMath::Abs(genpdg) == 3312) || (flag > 1 && TMath::Abs(genpdg) == 3334)) { + // if casc is consistent with Xi and has matched gen Xi OR cand is consistent with Omega and has matched gen omega + // have to do this in case we reco true Xi with only Omega hypothesis (or vice versa) (very unlikely) + registry.fill(HIST("truerec/hV0Radius"), rec.v0radius()); + registry.fill(HIST("truerec/hCascRadius"), rec.cascradius()); + registry.fill(HIST("truerec/hV0CosPA"), rec.v0cosPA(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("truerec/hCascCosPA"), rec.casccosPA(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("truerec/hDCAPosToPV"), rec.dcapostopv()); + registry.fill(HIST("truerec/hDCANegToPV"), rec.dcanegtopv()); + registry.fill(HIST("truerec/hDCABachToPV"), rec.dcabachtopv()); + registry.fill(HIST("truerec/hDCAV0ToPV"), rec.dcav0topv(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("truerec/hDCAV0Dau"), rec.dcaV0daughters()); + registry.fill(HIST("truerec/hDCACascDau"), rec.dcacascdaughters()); + registry.fill(HIST("truerec/hLambdaMass"), rec.mLambda()); + registry.fill(HIST("truerec/hITSnClustersPos"), rec.posTrack_as().itsNCls()); + registry.fill(HIST("truerec/hITSnClustersNeg"), rec.negTrack_as().itsNCls()); + registry.fill(HIST("truerec/hITSnClustersBach"), rec.bachelor_as().itsNCls()); + registry.fill(HIST("truerec/hTPCnCrossedRowsPos"), rec.posTrack_as().tpcNClsCrossedRows()); + registry.fill(HIST("truerec/hTPCnCrossedRowsNeg"), rec.negTrack_as().tpcNClsCrossedRows()); + registry.fill(HIST("truerec/hTPCnCrossedRowsBach"), rec.bachelor_as().tpcNClsCrossedRows()); + switch (genpdg) { // is matched so we can use genpdg + case 3312: + registry.fill(HIST("truerec/hXiMinus"), rec.pt(), rec.yXi()); + break; + case -3312: + registry.fill(HIST("truerec/hXiPlus"), rec.pt(), rec.yXi()); + break; + case 3334: + registry.fill(HIST("truerec/hOmegaMinus"), rec.pt(), rec.yOmega()); + break; + case -3334: + registry.fill(HIST("truerec/hOmegaPlus"), rec.pt(), rec.yOmega()); + break; } + } + } - // these are the tracks: - auto bachTrack = casc.bachelor_as(); - auto posTrack = casc.posTrack_as(); - auto negTrack = casc.negTrack_as(); - - // topo variables before cuts: - registry.fill(HIST("hV0Radius"), casc.v0radius(), casc.mXi(), casc.pt()); - registry.fill(HIST("hCascRadius"), casc.cascradius(), casc.mXi(), casc.pt()); - registry.fill(HIST("hV0CosPA"), casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ()), casc.mXi(), casc.pt()); - registry.fill(HIST("hCascCosPA"), casc.casccosPA(collision.posX(), collision.posY(), collision.posZ()), casc.mXi(), casc.pt()); - registry.fill(HIST("hDCAPosToPV"), casc.dcapostopv(), casc.mXi(), casc.pt()); - registry.fill(HIST("hDCANegToPV"), casc.dcanegtopv(), casc.mXi(), casc.pt()); - registry.fill(HIST("hDCABachToPV"), casc.dcabachtopv(), casc.mXi(), casc.pt()); - registry.fill(HIST("hDCAV0ToPV"), casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ()), casc.mXi(), casc.pt()); - registry.fill(HIST("hDCAV0Dau"), casc.dcaV0daughters(), casc.mXi(), casc.pt()); - registry.fill(HIST("hDCACascDau"), casc.dcacascdaughters(), casc.mXi(), casc.pt()); - registry.fill(HIST("hLambdaMass"), casc.mLambda(), casc.mXi(), casc.pt()); - - registry.fill(HIST("hITSnClustersPos"), posTrack.itsNCls(), casc.mXi(), casc.pt()); - registry.fill(HIST("hITSnClustersNeg"), negTrack.itsNCls(), casc.mXi(), casc.pt()); - registry.fill(HIST("hITSnClustersBach"), bachTrack.itsNCls(), casc.mXi(), casc.pt()); - registry.fill(HIST("hTPCnCrossedRowsPos"), posTrack.tpcNClsCrossedRows(), casc.mXi(), casc.pt()); - registry.fill(HIST("hTPCnCrossedRowsNeg"), negTrack.tpcNClsCrossedRows(), casc.mXi(), casc.pt()); - registry.fill(HIST("hTPCnCrossedRowsBach"), bachTrack.tpcNClsCrossedRows(), casc.mXi(), casc.pt()); - - registry.fill(HIST("hSelectionStatus"), 0); // all the cascade before selections - // registry.fill(HIST("hMassXi0"), casc.mXi(), casc.pt()); - - // TPC N crossed rows todo: check if minTPCCrossedRows > 50 - if (posTrack.tpcNClsCrossedRows() < minTPCCrossedRows || negTrack.tpcNClsCrossedRows() < minTPCCrossedRows || bachTrack.tpcNClsCrossedRows() < minTPCCrossedRows) { - cascflags(0); - continue; - } - registry.fill(HIST("hSelectionStatus"), 1); // passes nTPC crossed rows - // registry.fill(HIST("hMassXi1"), casc.mXi(), casc.pt()); + template + int processCandidate(TCascade const& casc, MyCollisions::iterator const& collision) + { + // these are the tracks: + auto bachTrack = casc.template bachelor_as(); + auto posTrack = casc.template posTrack_as(); + auto negTrack = casc.template negTrack_as(); + + // topo variables before cuts: + registry.fill(HIST("hV0Radius"), casc.v0radius(), casc.mXi(), casc.pt()); + registry.fill(HIST("hCascRadius"), casc.cascradius(), casc.mXi(), casc.pt()); + registry.fill(HIST("hV0CosPA"), casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ()), casc.mXi(), casc.pt()); + registry.fill(HIST("hCascCosPA"), casc.casccosPA(collision.posX(), collision.posY(), collision.posZ()), casc.mXi(), casc.pt()); + registry.fill(HIST("hDCAPosToPV"), casc.dcapostopv(), casc.mXi(), casc.pt()); + registry.fill(HIST("hDCANegToPV"), casc.dcanegtopv(), casc.mXi(), casc.pt()); + registry.fill(HIST("hDCABachToPV"), casc.dcabachtopv(), casc.mXi(), casc.pt()); + registry.fill(HIST("hDCAV0ToPV"), casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ()), casc.mXi(), casc.pt()); + registry.fill(HIST("hDCAV0Dau"), casc.dcaV0daughters(), casc.mXi(), casc.pt()); + registry.fill(HIST("hDCACascDau"), casc.dcacascdaughters(), casc.mXi(), casc.pt()); + registry.fill(HIST("hLambdaMass"), casc.mLambda(), casc.mXi(), casc.pt()); + + registry.fill(HIST("hITSnClustersPos"), posTrack.itsNCls(), casc.mXi(), casc.pt()); + registry.fill(HIST("hITSnClustersNeg"), negTrack.itsNCls(), casc.mXi(), casc.pt()); + registry.fill(HIST("hITSnClustersBach"), bachTrack.itsNCls(), casc.mXi(), casc.pt()); + registry.fill(HIST("hTPCnCrossedRowsPos"), posTrack.tpcNClsCrossedRows(), casc.mXi(), casc.pt()); + registry.fill(HIST("hTPCnCrossedRowsNeg"), negTrack.tpcNClsCrossedRows(), casc.mXi(), casc.pt()); + registry.fill(HIST("hTPCnCrossedRowsBach"), bachTrack.tpcNClsCrossedRows(), casc.mXi(), casc.pt()); + + registry.fill(HIST("hSelectionStatus"), 0); // all the cascade before selections + // registry.fill(HIST("hMassXi0"), casc.mXi(), casc.pt()); + + // TPC N crossed rows todo: check if minTPCCrossedRows > 50 + if (posTrack.tpcNClsCrossedRows() < minTPCCrossedRows || negTrack.tpcNClsCrossedRows() < minTPCCrossedRows || bachTrack.tpcNClsCrossedRows() < minTPCCrossedRows) + return 0; - // ITS N clusters todo: check if minITSClusters > 0 - if (posTrack.itsNCls() < minITSClusters || negTrack.itsNCls() < minITSClusters || bachTrack.itsNCls() < minITSClusters) { - cascflags(0); - continue; - } - registry.fill(HIST("hSelectionStatus"), 2); // passes nITS clusters - // registry.fill(HIST("hMassXi2"), casc.mXi(), casc.pt()); - - //// TOPO CUTS //// TODO: improve! - double pvx = collision.posX(); - double pvy = collision.posY(); - double pvz = collision.posZ(); - if (casc.v0radius() < v0setting_radius || - casc.cascradius() < cascadesetting_cascradius || - casc.v0cosPA(pvx, pvy, pvz) < v0setting_cospa || - casc.casccosPA(pvx, pvy, pvz) < cascadesetting_cospa || - casc.dcav0topv(pvx, pvy, pvz) < cascadesetting_mindcav0topv || - TMath::Abs(casc.mLambda() - 1.115683) > cascadesetting_v0masswindow) { - // It failed at least one topo selection - cascflags(0); - continue; - } - registry.fill(HIST("hSelectionStatus"), 3); // passes topo - // registry.fill(HIST("hMassXi3"), casc.mXi(), casc.pt()); + registry.fill(HIST("hSelectionStatus"), 1); // passes nTPC crossed rows + // registry.fill(HIST("hMassXi1"), casc.mXi(), casc.pt()); - if (TMath::Abs(posTrack.eta()) > etaTracks || TMath::Abs(negTrack.eta()) > etaTracks || TMath::Abs(bachTrack.eta()) > etaTracks) { - cascflags(0); - continue; - } - registry.fill(HIST("hSelectionStatus"), 4); // passes track eta + // ITS N clusters todo: check if minITSClusters > 0 + if (posTrack.itsNCls() < minITSClusters || negTrack.itsNCls() < minITSClusters || bachTrack.itsNCls() < minITSClusters) + return 0; - if (TMath::Abs(casc.eta()) > etaCascades) { - cascflags(0); - continue; - } - registry.fill(HIST("hSelectionStatus"), 5); // passes candidate eta + registry.fill(HIST("hSelectionStatus"), 2); // passes nITS clusters + // registry.fill(HIST("hMassXi2"), casc.mXi(), casc.pt()); + + //// TOPO CUTS //// TODO: improve! + double pvx = collision.posX(); + double pvy = collision.posY(); + double pvz = collision.posZ(); + if (casc.v0radius() < v0setting_radius || + casc.cascradius() < cascadesetting_cascradius || + casc.v0cosPA(pvx, pvy, pvz) < v0setting_cospa || + casc.casccosPA(pvx, pvy, pvz) < cascadesetting_cospa || + casc.dcav0topv(pvx, pvy, pvz) < cascadesetting_mindcav0topv || + TMath::Abs(casc.mLambda() - 1.115683) > cascadesetting_v0masswindow) + return 0; // It failed at least one topo selection + + registry.fill(HIST("hSelectionStatus"), 3); // passes topo + // registry.fill(HIST("hMassXi3"), casc.mXi(), casc.pt()); + + if (TMath::Abs(posTrack.eta()) > etaTracks || TMath::Abs(negTrack.eta()) > etaTracks || TMath::Abs(bachTrack.eta()) > etaTracks) + return 0; - // TODO: TOF (for pT > 2 GeV per track?) + registry.fill(HIST("hSelectionStatus"), 4); // passes track eta - //// TPC PID //// - // Lambda check - if (casc.sign() < 0) { - // Proton check: - if (TMath::Abs(posTrack.tpcNSigmaPr()) > tpcNsigmaProton) { - cascflags(0); - continue; - } - // Pion check: - if (TMath::Abs(negTrack.tpcNSigmaPi()) > tpcNsigmaPion) { - cascflags(0); - continue; - } - } else { - // Proton check: - if (TMath::Abs(negTrack.tpcNSigmaPr()) > tpcNsigmaProton) { - cascflags(0); - continue; - } - // Pion check: - if (TMath::Abs(posTrack.tpcNSigmaPi()) > tpcNsigmaPion) { - cascflags(0); - continue; - } - } - registry.fill(HIST("hSelectionStatus"), 6); // passes V0 daughters PID - // registry.fill(HIST("hMassXi4"), casc.mXi(), casc.pt()); - - // Bachelor check - if (TMath::Abs(bachTrack.tpcNSigmaPi()) < tpcNsigmaBachelor) { - if (TMath::Abs(bachTrack.tpcNSigmaKa()) < tpcNsigmaBachelor) { - // consistent with both! - cascflags(2); - registry.fill(HIST("hSelectionStatus"), 7); // passes bach PID - // registry.fill(HIST("hMassXi5"), casc.mXi(), casc.pt()); - if (casc.sign() < 0) { - registry.fill(HIST("hMassXiMinus"), casc.mXi(), casc.pt(), casc.yXi()); - registry.fill(HIST("hMassOmegaMinus"), casc.mOmega(), casc.pt(), casc.yOmega()); - } else { - registry.fill(HIST("hMassXiPlus"), casc.mXi(), casc.pt(), casc.yXi()); - registry.fill(HIST("hMassOmegaPlus"), casc.mOmega(), casc.pt(), casc.yOmega()); - } - continue; - } - cascflags(1); + if (TMath::Abs(casc.eta()) > etaCascades) + return 0; + + registry.fill(HIST("hSelectionStatus"), 5); // passes candidate eta + + // TODO: TOF (for pT > 2 GeV per track?) + + //// TPC PID //// + // Lambda check + if (casc.sign() < 0) { + // Proton check: + if (TMath::Abs(posTrack.tpcNSigmaPr()) > tpcNsigmaProton) + return 0; + // Pion check: + if (TMath::Abs(negTrack.tpcNSigmaPi()) > tpcNsigmaPion) + return 0; + } else { + // Proton check: + if (TMath::Abs(negTrack.tpcNSigmaPr()) > tpcNsigmaProton) + return 0; + // Pion check: + if (TMath::Abs(posTrack.tpcNSigmaPi()) > tpcNsigmaPion) + return 0; + } + registry.fill(HIST("hSelectionStatus"), 6); // passes V0 daughters PID + // registry.fill(HIST("hMassXi4"), casc.mXi(), casc.pt()); + + // Bachelor check + if (TMath::Abs(bachTrack.tpcNSigmaPi()) < tpcNsigmaBachelor) { + if (TMath::Abs(bachTrack.tpcNSigmaKa()) < tpcNsigmaBachelor) { + // consistent with both! registry.fill(HIST("hSelectionStatus"), 7); // passes bach PID // registry.fill(HIST("hMassXi5"), casc.mXi(), casc.pt()); if (casc.sign() < 0) { registry.fill(HIST("hMassXiMinus"), casc.mXi(), casc.pt(), casc.yXi()); - } else { - registry.fill(HIST("hMassXiPlus"), casc.mXi(), casc.pt(), casc.yXi()); - } - continue; - } else if (TMath::Abs(bachTrack.tpcNSigmaKa()) < tpcNsigmaBachelor) { - cascflags(3); - registry.fill(HIST("hSelectionStatus"), 7); // passes bach PID - if (casc.sign() < 0) { registry.fill(HIST("hMassOmegaMinus"), casc.mOmega(), casc.pt(), casc.yOmega()); } else { + registry.fill(HIST("hMassXiPlus"), casc.mXi(), casc.pt(), casc.yXi()); registry.fill(HIST("hMassOmegaPlus"), casc.mOmega(), casc.pt(), casc.yOmega()); } + return 2; + } + registry.fill(HIST("hSelectionStatus"), 7); // passes bach PID + // registry.fill(HIST("hMassXi5"), casc.mXi(), casc.pt()); + if (casc.sign() < 0) { + registry.fill(HIST("hMassXiMinus"), casc.mXi(), casc.pt(), casc.yXi()); + } else { + registry.fill(HIST("hMassXiPlus"), casc.mXi(), casc.pt(), casc.yXi()); + } + return 1; + } else if (TMath::Abs(bachTrack.tpcNSigmaKa()) < tpcNsigmaBachelor) { + registry.fill(HIST("hSelectionStatus"), 7); // passes bach PID + if (casc.sign() < 0) { + registry.fill(HIST("hMassOmegaMinus"), casc.mOmega(), casc.pt(), casc.yOmega()); + } else { + registry.fill(HIST("hMassOmegaPlus"), casc.mOmega(), casc.pt(), casc.yOmega()); + } + return 3; + } + // if we reach here, the bachelor was neither pion nor kaon + return 0; + } // processCandidate + + void processGenMC(aod::McCollision const&, soa::SmallGroups> const&, aod::McParticles const& mcParticles) + { + for (auto const& mcPart : mcParticles) { + if (!mcPart.isPhysicalPrimary()) + continue; + if (TMath::Abs(mcPart.eta()) > etaCascades) + continue; + + switch (mcPart.pdgCode()) { + case 3312: + registry.fill(HIST("gen/hXiMinus"), mcPart.pt(), mcPart.y()); + break; + case -3312: + registry.fill(HIST("gen/hXiPlus"), mcPart.pt(), mcPart.y()); + break; + case 3334: + registry.fill(HIST("gen/hOmegaMinus"), mcPart.pt(), mcPart.y()); + break; + case -3334: + registry.fill(HIST("gen/hOmegaPlus"), mcPart.pt(), mcPart.y()); + break; + } + } + + // if (matchedCollisions.size() < 1) { + // return; + // } else if (matchedCollisions.size() == 1) { + // for (auto const& collision : matchedCollisions) { // not really a loop, as there is only one collision + // } + // } else if (matchedCollisions.size() > 1) { + // registry.fill(HIST("MC/hSplitEvents"), matchedCollisions.size()); + // return; + // } + } // processGen + + // wrappers for data/MC processes on reco level + void processRecData(MyCollisions::iterator const& collision, aod::CascDataExt const& Cascades, FullTracksExtIUWithPID const&, aod::BCsWithTimestamps const&) + { + bool evSel = eventSelection(collision); + // do not skip the collision if event selection fails - this will lead to the cascadeFlag table having less entries than the Cascade table, and therefor not joinable. + for (auto const& casc : Cascades) { + if (!evSel) { + cascflags(0); continue; } - // if we reach here, the bachelor was neither pion nor kaon - cascflags(0); - } // cascade loop - } // process + int flag = processCandidate(casc, collision); + cascflags(flag); + } + } + + void processRecMC(MyCollisions::iterator const& collision, LabeledCascades const& Cascades, FullTracksExtIUWithPID const&, aod::BCsWithTimestamps const&, aod::McParticles const&) + { + bool evSel = eventSelection(collision); + // do not skip the collision if event selection fails - this will lead to the cascadeFlag table having less entries than the Cascade table, and therefor not joinable. + for (auto const& casc : Cascades) { + if (!evSel) { + cascflags(0); + continue; + } + int flag = processCandidate(casc, collision); + cascflags(flag); + // do mc matching here + fillMatchedHistos(casc, flag, collision); // if sign < 0 then pdg > 0 + } + } + + PROCESS_SWITCH(CascadeSelector, processRecData, "Process rec data", true); + PROCESS_SWITCH(CascadeSelector, processRecMC, "Process rec MC", false); + PROCESS_SWITCH(CascadeSelector, processGenMC, "Process gen MC", false); }; // struct struct CascadeCorrelations { @@ -395,14 +527,20 @@ struct CascadeCorrelations { Configurable doTFBorderCut{"doTFBorderCut", true, "Switch to apply TimeframeBorderCut event selection"}; Configurable doSel8{"doSel8", true, "Switch to apply sel8 event selection"}; - AxisSpec invMassAxis = {1000, 1.0f, 2.0f, "Inv. Mass (GeV/c^{2})"}; - AxisSpec deltaPhiAxis = {180, -PIHalf, 3 * PIHalf, "#Delta#varphi"}; // 180 is divisible by 18 (tpc sectors) and 20 (run 2 binning) - AxisSpec deltaYAxis = {40, -2 * maxRapidity, 2 * maxRapidity, "#Delta y"}; // TODO: narrower range? - AxisSpec ptAxis = {150, 0, 15, "#it{p}_{T}"}; - AxisSpec selectionFlagAxis = {4, -0.5f, 3.5f, "Selection flag of casc candidate"}; - AxisSpec vertexAxis = {200, -10.0f, 10.0f, "cm"}; - AxisSpec multiplicityAxis{100, 0, 100, "Multiplicity (MultFT0M?)"}; + ConfigurableAxis radiusAxis = {"radiusAxis", {100, 0.0f, 50.0f}, "cm"}; + ConfigurableAxis cpaAxis = {"cpaAxis", {100, 0.95f, 1.0f}, "CPA"}; + ConfigurableAxis invMassAxis = {"invMassAxis", {1000, 1.0f, 2.0f}, "Inv. Mass (GeV/c^{2})"}; + ConfigurableAxis deltaPhiAxis = {"deltaPhiAxis", {180, -PIHalf, 3 * PIHalf}, "#Delta#varphi"}; // 180 is divisible by 18 (tpc sectors) and 20 (run 2 binning) + ConfigurableAxis ptAxis = {"ptAxis", {150, 0, 15}, "#it{p}_{T}"}; + ConfigurableAxis vertexAxis = {"vertexAxis", {200, -10.0f, 10.0f}, "cm"}; + ConfigurableAxis dcaAxis = {"dcaAxis", {100, 0.0f, 2.0f}, "cm"}; + ConfigurableAxis multiplicityAxis{"multiplicityAxis", {100, 0, 100}, "Multiplicity (MultFT0M?)"}; + ConfigurableAxis invLambdaMassAxis{"invLambdaMassAxis", {100, 1.07f, 1.17f}, "Inv. Mass (GeV/c^{2})"}; + AxisSpec deltaYAxis{40, -2 * maxRapidity, 2 * maxRapidity, "#Delta y"}; AxisSpec rapidityAxis{100, -maxRapidity, maxRapidity, "y"}; + AxisSpec selectionFlagAxis{4, -0.5f, 3.5f, "Selection flag of casc candidate"}; + AxisSpec itsClustersAxis{8, -0.5, 7.5, "number of ITS clusters"}; + AxisSpec tpcRowsAxis{160, -0.5, 159.5, "TPC crossed rows"}; // initialize efficiency maps TH1D* hEffXiMin; @@ -460,18 +598,24 @@ struct CascadeCorrelations { // trigger QA {"hTriggerQA", "hTriggerQA", {HistType::kTH1F, {{2, -0.5, 1.5, "Trigger y/n"}}}}, - // basic selection variables - {"hV0Radius", "hV0Radius", {HistType::kTH1F, {{1000, 0.0f, 100.0f, "cm"}}}}, - {"hCascRadius", "hCascRadius", {HistType::kTH1F, {{1000, 0.0f, 100.0f, "cm"}}}}, - {"hV0CosPA", "hV0CosPA", {HistType::kTH1F, {{100, 0.95f, 1.0f}}}}, - {"hCascCosPA", "hCascCosPA", {HistType::kTH1F, {{100, 0.95f, 1.0f}}}}, + // basic selection variables (after cuts) + {"hV0Radius", "hV0Radius", {HistType::kTH1F, {radiusAxis}}}, + {"hCascRadius", "hCascRadius", {HistType::kTH1F, {radiusAxis}}}, + {"hV0CosPA", "hV0CosPA", {HistType::kTH1F, {cpaAxis}}}, + {"hCascCosPA", "hCascCosPA", {HistType::kTH1F, {cpaAxis}}}, {"hDCAPosToPV", "hDCAPosToPV", {HistType::kTH1F, {vertexAxis}}}, {"hDCANegToPV", "hDCANegToPV", {HistType::kTH1F, {vertexAxis}}}, {"hDCABachToPV", "hDCABachToPV", {HistType::kTH1F, {vertexAxis}}}, {"hDCAV0ToPV", "hDCAV0ToPV", {HistType::kTH1F, {vertexAxis}}}, - {"hDCAV0Dau", "hDCAV0Dau", {HistType::kTH1F, {{100, 0.0f, 10.0f, "cm^{2}"}}}}, - {"hDCACascDau", "hDCACascDau", {HistType::kTH1F, {{100, 0.0f, 10.0f, "cm^{2}"}}}}, - {"hLambdaMass", "hLambdaMass", {HistType::kTH1F, {{500, 1.0f, 1.5f, "Inv. Mass (GeV/c^{2})"}}}}, + {"hDCAV0Dau", "hDCAV0Dau", {HistType::kTH1F, {dcaAxis}}}, + {"hDCACascDau", "hDCACascDau", {HistType::kTH1F, {dcaAxis}}}, + {"hLambdaMass", "hLambdaMass", {HistType::kTH1F, {invLambdaMassAxis}}}, + {"hTPCnCrossedRowsPos", "hTPCnCrossedRowsPos", {HistType::kTH1F, {tpcRowsAxis}}}, + {"hTPCnCrossedRowsNeg", "hTPCnCrossedRowsNeg", {HistType::kTH1F, {tpcRowsAxis}}}, + {"hTPCnCrossedRowsBach", "hTPCnCrossedRowsBach", {HistType::kTH1F, {tpcRowsAxis}}}, + {"hITSnClustersPos", "hITSnClustersPos", {HistType::kTH1F, {itsClustersAxis}}}, + {"hITSnClustersNeg", "hITSnClustersNeg", {HistType::kTH1F, {itsClustersAxis}}}, + {"hITSnClustersBach", "hITSnClustersBach", {HistType::kTH1F, {itsClustersAxis}}}, {"hSelectionFlag", "hSelectionFlag", {HistType::kTH1I, {selectionFlagAxis}}}, {"hAutoCorrelation", "hAutoCorrelation", {HistType::kTH1I, {{4, -0.5f, 3.5f, "Types of SS autocorrelation"}}}}, @@ -592,6 +736,12 @@ struct CascadeCorrelations { registry.fill(HIST("hDCAV0Dau"), casc.dcaV0daughters()); registry.fill(HIST("hDCACascDau"), casc.dcacascdaughters()); registry.fill(HIST("hLambdaMass"), casc.mLambda()); + registry.fill(HIST("hITSnClustersPos"), casc.posTrack_as().itsNCls()); + registry.fill(HIST("hITSnClustersNeg"), casc.negTrack_as().itsNCls()); + registry.fill(HIST("hITSnClustersBach"), casc.bachelor_as().itsNCls()); + registry.fill(HIST("hTPCnCrossedRowsPos"), casc.posTrack_as().tpcNClsCrossedRows()); + registry.fill(HIST("hTPCnCrossedRowsNeg"), casc.negTrack_as().tpcNClsCrossedRows()); + registry.fill(HIST("hTPCnCrossedRowsBach"), casc.bachelor_as().tpcNClsCrossedRows()); registry.fill(HIST("hSelectionFlag"), casc.isSelected()); registry.fill(HIST("hPhi"), casc.phi()); From aad4a7854816a63b347ef99095ecd318c15236f8 Mon Sep 17 00:00:00 2001 From: Pritam Chakraborty <47203359+prchakra@users.noreply.github.com> Date: Sat, 7 Jun 2025 07:15:35 +0200 Subject: [PATCH 1543/1650] [PWGCF] FemtoUniverse: Adding Configurables for event mixing in mult (#11502) --- ...mtoUniversePairTaskTrackTrackSpherHarMultKtExtended.cxx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackSpherHarMultKtExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackSpherHarMultKtExtended.cxx index 28d1295c124..977342a3939 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackSpherHarMultKtExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackSpherHarMultKtExtended.cxx @@ -150,7 +150,8 @@ struct femtoUniversePairTaskTrackTrackSpherHarMultKtExtended { ConfigurableAxis ConfTempFitVarpTBins{"ConfTempFitVarpTBins", {20, 0.5, 4.05}, "pT binning of the pT vs. TempFitVar plot"}; /// Correlation part - ConfigurableAxis ConfMultBins{"ConfMultBins", {VARIABLE_WIDTH, 0.0f, 4.0f, 8.0f, 12.0f, 16.0f, 20.0f, 24.0f, 28.0f, 32.0f, 36.0f, 40.0f, 44.0f, 48.0f, 52.0f, 56.0f, 60.0f, 64.0f, 68.0f, 72.0f, 76.0f, 80.0f, 84.0f, 88.0f, 92.0f, 96.0f, 100.0f, 200.0f, 99999.f}, "Mixing bins - multiplicity or centrality"}; // \todo to be obtained from the hash task + ConfigurableAxis ConfMultBinsCent{"ConfMultBinsCent", {VARIABLE_WIDTH, 0.0f, 4.0f, 8.0f, 12.0f, 16.0f, 20.0f, 24.0f, 28.0f, 32.0f, 36.0f, 40.0f, 44.0f, 48.0f, 52.0f, 56.0f, 60.0f, 64.0f, 68.0f, 72.0f, 76.0f, 80.0f, 84.0f, 88.0f, 92.0f, 96.0f, 100.0f, 200.0f, 99999.f}, "Mixing bins - centrality"}; // \todo to be obtained from the hash task + ConfigurableAxis ConfMultBinsMult{"ConfMultBinsMult", {VARIABLE_WIDTH, 0.0f, 400.0f, 800.0f, 1200.0f, 1600.0f, 2000.0f, 2500.0f, 3000.0f, 3500.0f, 4000.0f, 4500.0f, 5000.0f, 6000.0f, 7000.0f, 8000.0f, 9000.0f, 10000.0f, 11000.0f, 12000.0f, 13000.0f, 14000.0f, 15000.0f, 16000.0f, 17000.0f, 18000.0f, 99999.f}, "Mixing bins - centrality"}; ConfigurableAxis ConfMultKstarBins{"ConfMultKstarBins", {VARIABLE_WIDTH, 0.0f, 200.0f}, "Bins for kstar analysis in multiplicity or centrality bins (10 is maximum)"}; ConfigurableAxis ConfKtKstarBins{"ConfKtKstarBins", {VARIABLE_WIDTH, 0.1f, 0.2f, 0.3f, 0.4f}, "Bins for kstar analysis in kT bins"}; ConfigurableAxis ConfVtxBins{"ConfVtxBins", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; @@ -158,8 +159,8 @@ struct femtoUniversePairTaskTrackTrackSpherHarMultKtExtended { ConfigurableAxis ConfmTBins3D{"ConfmTBins3D", {VARIABLE_WIDTH, 1.02f, 1.14f, 1.20f, 1.26f, 1.38f, 1.56f, 1.86f, 4.50f}, "mT Binning for the 3Dimensional plot: k* vs multiplicity vs mT (set <> to true in order to use)"}; ConfigurableAxis ConfmultBins3D{"ConfmultBins3D", {VARIABLE_WIDTH, 0.0f, 20.0f, 30.0f, 40.0f, 99999.0f}, "multiplicity Binning for the 3Dimensional plot: k* vs multiplicity vs mT (set <> to true in order to use)"}; - ColumnBinningPolicy colBinningCent{{ConfVtxBins, ConfMultBins}, true}; - ColumnBinningPolicy colBinningNtr{{ConfVtxBins, ConfMultBins}, true}; + ColumnBinningPolicy colBinningCent{{ConfVtxBins, ConfMultBinsCent}, true}; + ColumnBinningPolicy colBinningNtr{{ConfVtxBins, ConfMultBinsMult}, true}; ConfigurableAxis ConfkstarBins{"ConfkstarBins", {60, 0.0, 0.3}, "binning kstar"}; ConfigurableAxis ConfkTBins{"ConfkTBins", {150, 0., 9.}, "binning kT"}; From ac487cb570cf79adf9a4ae3f2184956b1fb4aaa2 Mon Sep 17 00:00:00 2001 From: Francesco Mazzaschi <43742195+fmazzasc@users.noreply.github.com> Date: Sat, 7 Jun 2025 09:19:16 +0200 Subject: [PATCH 1544/1650] [PWGLF] Add mother decay radius and remove track tuner (#11499) Co-authored-by: Francesco Mazzaschi --- PWGLF/DataModel/LFSlimNucleiTables.h | 6 +- PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx | 73 ++++++-------------- 2 files changed, 24 insertions(+), 55 deletions(-) diff --git a/PWGLF/DataModel/LFSlimNucleiTables.h b/PWGLF/DataModel/LFSlimNucleiTables.h index fe23bbcae5b..e562c35ddc6 100644 --- a/PWGLF/DataModel/LFSlimNucleiTables.h +++ b/PWGLF/DataModel/LFSlimNucleiTables.h @@ -44,12 +44,13 @@ DECLARE_SOA_COLUMN(ITSclsMap, itsClsMap, uint8_t); DECLARE_SOA_COLUMN(TPCnCls, tpcNCls, uint8_t); DECLARE_SOA_COLUMN(TPCnClsShared, tpcNClsShared, uint8_t); DECLARE_SOA_COLUMN(ITSclusterSizes, itsClusterSizes, uint32_t); +DECLARE_SOA_COLUMN(SurvivedEventSelection, survivedEventSelection, bool); DECLARE_SOA_COLUMN(gPt, genPt, float); DECLARE_SOA_COLUMN(gEta, genEta, float); DECLARE_SOA_COLUMN(gPhi, genPhi, float); DECLARE_SOA_COLUMN(PDGcode, pdgCode, int); DECLARE_SOA_COLUMN(MotherPDGcode, MotherpdgCode, int); -DECLARE_SOA_COLUMN(SurvivedEventSelection, survivedEventSelection, bool); +DECLARE_SOA_COLUMN(MotherDecRad, motherDecRad, float); DECLARE_SOA_COLUMN(AbsoDecL, absoDecL, float); } // namespace NucleiTableNS @@ -151,12 +152,13 @@ DECLARE_SOA_TABLE(NucleiTableMC, "AOD", "NUCLEITABLEMC", NucleiTableNS::TPCnCls, NucleiTableNS::TPCnClsShared, NucleiTableNS::ITSclusterSizes, + NucleiTableNS::SurvivedEventSelection, NucleiTableNS::gPt, NucleiTableNS::gEta, NucleiTableNS::gPhi, NucleiTableNS::PDGcode, NucleiTableNS::MotherPDGcode, - NucleiTableNS::SurvivedEventSelection, + NucleiTableNS::MotherDecRad, NucleiTableNS::AbsoDecL); DECLARE_SOA_TABLE(NucleiPairTable, "AOD", "NUCLEIPAIRTABLE", diff --git a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx index 551fbb56e6d..205c0eda0a4 100644 --- a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx +++ b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx @@ -41,7 +41,6 @@ #include "Common/TableProducer/PID/pidTOFBase.h" #include "Common/Core/EventPlaneHelper.h" #include "Common/DataModel/Qvectors.h" -#include "Common/Tools/TrackTuner.h" #include "Common/Core/RecoDecay.h" #include "DataFormatsParameters/GRPMagField.h" @@ -273,7 +272,6 @@ struct nucleiSpectra { Service ccdb; Zorro zorro; OutputObj zorroSummary{"zorroSummary"}; - TrackTuner trackTunerObj; Configurable cfgCompensatePIDinTracking{"cfgCompensatePIDinTracking", false, "If true, divide tpcInnerParam by the electric charge"}; @@ -282,8 +280,8 @@ struct nucleiSpectra { Configurable cfgCutVertex{"cfgCutVertex", 10.0f, "Accepted z-vertex range"}; Configurable cfgCutEta{"cfgCutEta", 0.8f, "Eta range for tracks"}; Configurable cfgCutTpcMom{"cfgCutTpcMom", 0.2f, "Minimum TPC momentum for tracks"}; - Configurable cfgCutRapidityMin{"cfgCutRapidityMin", -0.5, "Minimum rapidity for tracks"}; - Configurable cfgCutRapidityMax{"cfgCutRapidityMax", 0.5, "Maximum rapidity for tracks"}; + Configurable cfgCutRapidityMin{"cfgCutRapidityMin", -1., "Minimum rapidity for tracks"}; + Configurable cfgCutRapidityMax{"cfgCutRapidityMax", 1., "Maximum rapidity for tracks"}; Configurable cfgCutOnReconstructedRapidity{"cfgCutOnReconstructedRapidity", false, "Cut on reconstructed rapidity"}; Configurable cfgCutNclusITS{"cfgCutNclusITS", 5, "Minimum number of ITS clusters"}; Configurable cfgCutNclusTPC{"cfgCutNclusTPC", 70, "Minimum number of TPC clusters"}; @@ -327,9 +325,6 @@ struct nucleiSpectra { Configurable cfgSkimmedProcessing{"cfgSkimmedProcessing", false, "Skimmed dataset processing"}; - // configurables for track tuner - Configurable cfgUseTrackTuner{"cfgUseTrackTuner", false, "Apply track tuner corrections to MC tracks"}; - Configurable cfgTrackTunerParams{"cfgTrackTunerParams", "debugInfo=0|updateTrackDCAs=1|updateTrackCovMat=1|updateCurvature=0|updateCurvatureIU=0|updatePulls=1|isInputFileFromCCDB=1|pathInputFile=Users/m/mfaggin/test/inputsTrackTuner/pp2023/smoothHighPtMC|nameInputFile=trackTuner_DataLHC23fPass1_McLHC23k4b_run535085.root|pathFileQoverPt=Users/h/hsharma/qOverPtGraphs|nameFileQoverPt=D0sigma_Data_removal_itstps_MC_LHC22b1b.root|usePvRefitCorrections=0|qOverPtMC=-1.|qOverPtData=-1.", "TrackTuner parameter initialization (format: =|=)"}; // running variables for track tuner o2::dataformats::DCA mDcaInfoCov; o2::track::TrackParametrizationWithError mTrackParCov; @@ -516,7 +511,7 @@ struct nucleiSpectra { spectra.add("hTpcSignalData", "Specific energy loss", HistType::kTH2F, {{600, -6., 6., "#it{p} (GeV/#it{c})"}, {1400, 0, 1400, "d#it{E} / d#it{X} (a. u.)"}}); spectra.add("hTpcSignalDataSelected", "Specific energy loss for selected particles", HistType::kTH2F, {{600, -6., 6., "#it{p} (GeV/#it{c})"}, {1400, 0, 1400, "d#it{E} / d#it{X} (a. u.)"}}); spectra.add("hTofSignalData", "TOF beta", HistType::kTH2F, {{500, 0., 5., "#it{p} (GeV/#it{c})"}, {750, 0, 1.5, "TOF #beta"}}); - spectra.add("hMCDCAxyVsDecRadius", "DCA xy vs DecayRadius", HistType::kTH2F, {{20, 0., 0.2, "Decay radius"}, {150, -0.05, 0.05, "DCA_{xy} (cm)"}}); + for (int iC{0}; iC < 2; ++iC) { nuclei::hGloTOFtracks[iC] = spectra.add(fmt::format("hTPCTOFtracks{}", nuclei::matter[iC]).data(), fmt::format("Global vs TOF matched {} tracks in a collision", nuclei::chargeLabelNames[iC]).data(), HistType::kTH2D, {{300, -0.5, 300.5, "Number of global tracks"}, {300, -0.5, 300.5, "Number of TOF matched tracks"}}); @@ -562,12 +557,6 @@ struct nucleiSpectra { } nuclei::lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get("GLO/Param/MatLUT")); - // TrackTuner initialization - if (cfgUseTrackTuner) { - std::string outputStringParams = trackTunerObj.configParams(cfgTrackTunerParams); - spectra.add("hTrackTunedTracks", outputStringParams.c_str(), HistType::kTH1F, {{1, 0.5, 1.5, ""}}); - trackTunerObj.getDcaGraphs(); - } } template @@ -665,20 +654,6 @@ struct nucleiSpectra { mDcaInfoCov.set(999, 999, 999, 999, 999); setTrackParCov(track, mTrackParCov); mTrackParCov.setPID(track.pidForTracking()); - if constexpr ( - requires { - track.has_mcParticle(); - }) { - if (cfgUseTrackTuner) { - bool hasMcParticle = track.has_mcParticle(); - if (hasMcParticle) { - spectra.get(HIST("hTrackTunedTracks"))->Fill(1); // all tracks - auto mcParticle = track.mcParticle(); - trackTunerObj.tuneTrackParams(mcParticle, mTrackParCov, matCorr, &mDcaInfoCov, spectra.get(HIST("hTrackTunedTracks"))); - } - } - } - std::array dcaInfo; o2::base::Propagator::Instance()->propagateToDCA(collVtx, mTrackParCov, mBz, 2.f, static_cast(cfgMaterialCorrection.value), &dcaInfo); @@ -957,24 +932,6 @@ struct nucleiSpectra { if (!c.correctPV) { c.flags |= kIsAmbiguous; } - if (!particle.isPhysicalPrimary()) { - c.isSecondary = true; - if (particle.getProcess() == 4) { - c.fromWeakDecay = true; - } - } else { - // if the particle has a hf mother it is flagged as secondary - if (particle.has_mothers()) { - for (auto& motherparticle : particle.mothers_as()) { - if (std::find(nuclei::hfMothCodes.begin(), nuclei::hfMothCodes.end(), std::abs(motherparticle.pdgCode())) != nuclei::hfMothCodes.end()) { - c.isSecondary = true; - c.fromWeakDecay = true; - break; - } - } - } - } - if (c.fillDCAHist && cfgDCAHists->get(iS, c.pt < 0)) { nuclei::hDCAHists[c.pt < 0][iS]->Fill(std::abs(c.pt), c.DCAxy, c.DCAz, c.nSigmaTPC[iS], c.tofMasses[iS], c.ITSnCls, c.TPCnCls, c.correctPV, c.isSecondary, c.fromWeakDecay); } @@ -983,7 +940,12 @@ struct nucleiSpectra { if (!storeIt) { continue; } - int MotherpdgCode = 0; + if (particle.y() < cfgCutRapidityMin || particle.y() > cfgCutRapidityMax) { + continue; + } + + int motherPdgCode = 0; + float motherDecRadius = -1; isReconstructed[particle.globalIndex()] = true; if (particle.isPhysicalPrimary()) { c.flags |= kIsPhysicalPrimary; @@ -991,9 +953,8 @@ struct nucleiSpectra { for (auto& motherparticle : particle.mothers_as()) { if (std::find(nuclei::hfMothCodes.begin(), nuclei::hfMothCodes.end(), std::abs(motherparticle.pdgCode())) != nuclei::hfMothCodes.end()) { c.flags |= kIsSecondaryFromWeakDecay; - MotherpdgCode = motherparticle.pdgCode(); - float decRadius = std::hypot(particle.vx() - motherparticle.vx(), particle.vy() - motherparticle.vy()); - spectra.fill(HIST("hMCDCAxyVsDecRadius"), decRadius, c.DCAxy); + motherPdgCode = motherparticle.pdgCode(); + motherDecRadius = std::hypot(particle.vx() - motherparticle.vx(), particle.vy() - motherparticle.vy()); break; } } @@ -1001,13 +962,16 @@ struct nucleiSpectra { } else if (particle.has_mothers()) { c.flags |= kIsSecondaryFromWeakDecay; for (auto& motherparticle : particle.mothers_as()) { - MotherpdgCode = motherparticle.pdgCode(); + motherPdgCode = motherparticle.pdgCode(); + motherDecRadius = std::hypot(particle.vx() - motherparticle.vx(), particle.vy() - motherparticle.vy()); } } else { c.flags |= kIsSecondaryFromMaterial; } + + isReconstructed[particle.globalIndex()] = true; float absoDecL = computeAbsoDecL(particle); - nucleiTableMC(c.pt, c.eta, c.phi, c.tpcInnerParam, c.beta, c.zVertex, c.DCAxy, c.DCAz, c.TPCsignal, c.ITSchi2, c.TPCchi2, c.TOFchi2, c.flags, c.TPCfindableCls, c.TPCcrossedRows, c.ITSclsMap, c.TPCnCls, c.TPCnClsShared, c.clusterSizesITS, particle.pt(), particle.eta(), particle.phi(), particle.pdgCode(), MotherpdgCode, goodCollisions[particle.mcCollisionId()], absoDecL); + nucleiTableMC(c.pt, c.eta, c.phi, c.tpcInnerParam, c.beta, c.zVertex, c.DCAxy, c.DCAz, c.TPCsignal, c.ITSchi2, c.TPCchi2, c.TOFchi2, c.flags, c.TPCfindableCls, c.TPCcrossedRows, c.ITSclsMap, c.TPCnCls, c.TPCnClsShared, c.clusterSizesITS, goodCollisions[particle.mcCollisionId()], particle.pt(), particle.eta(), particle.phi(), particle.pdgCode(), motherPdgCode, motherDecRadius, absoDecL); } int index{0}; @@ -1023,6 +987,7 @@ struct nucleiSpectra { uint16_t flags = 0; int motherPdgCode = 0; + float motherDecRadius = -1; if (particle.isPhysicalPrimary()) { flags |= kIsPhysicalPrimary; nuclei::hGenNuclei[iS][particle.pdgCode() < 0]->Fill(1., particle.pt()); @@ -1031,6 +996,7 @@ struct nucleiSpectra { if (std::find(nuclei::hfMothCodes.begin(), nuclei::hfMothCodes.end(), std::abs(motherparticle.pdgCode())) != nuclei::hfMothCodes.end()) { flags |= kIsSecondaryFromWeakDecay; motherPdgCode = motherparticle.pdgCode(); + motherDecRadius = std::hypot(particle.vx() - motherparticle.vx(), particle.vy() - motherparticle.vy()); break; } } @@ -1039,6 +1005,7 @@ struct nucleiSpectra { flags |= kIsSecondaryFromWeakDecay; for (auto& motherparticle : particle.mothers_as()) { motherPdgCode = motherparticle.pdgCode(); + motherDecRadius = std::hypot(particle.vx() - motherparticle.vx(), particle.vy() - motherparticle.vy()); } } else { flags |= kIsSecondaryFromMaterial; @@ -1047,7 +1014,7 @@ struct nucleiSpectra { if (!isReconstructed[index] && (cfgTreeConfig->get(iS, 0u) || cfgTreeConfig->get(iS, 1u))) { float absDecL = computeAbsoDecL(particle); - nucleiTableMC(999., 999., 999., 0., 0., 999., 999., 999., -1, -1, -1, -1, flags, 0, 0, 0, 0, 0, 0, particle.pt(), particle.eta(), particle.phi(), particle.pdgCode(), motherPdgCode, goodCollisions[particle.mcCollisionId()], absDecL); + nucleiTableMC(999., 999., 999., 0., 0., 999., 999., 999., -1, -1, -1, -1, flags, 0, 0, 0, 0, 0, 0, goodCollisions[particle.mcCollisionId()], particle.pt(), particle.eta(), particle.phi(), particle.pdgCode(), motherPdgCode, motherDecRadius, absDecL); } break; } From 9fdb0ac12a876221eb450876a46045ec510b9dc6 Mon Sep 17 00:00:00 2001 From: Tao_Fang <52570362+Tao-Fang@users.noreply.github.com> Date: Sat, 7 Jun 2025 16:00:26 +0800 Subject: [PATCH 1545/1650] [PWGHF] Add Centrality for Xic0ToXiPiKf and Omegac0ToOmegapiKf (#11470) Co-authored-by: ALICE Action Bot --- PWGHF/D2H/Tasks/taskOmegac0ToOmegapi.cxx | 101 +++++++++++++++++- .../candidateCreatorXic0Omegac0.cxx | 98 +++++++++++++---- .../TableProducer/treeCreatorXic0ToXiPiKf.cxx | 83 +++++++++++++- 3 files changed, 256 insertions(+), 26 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskOmegac0ToOmegapi.cxx b/PWGHF/D2H/Tasks/taskOmegac0ToOmegapi.cxx index 7142b2d2e49..2550d41c386 100644 --- a/PWGHF/D2H/Tasks/taskOmegac0ToOmegapi.cxx +++ b/PWGHF/D2H/Tasks/taskOmegac0ToOmegapi.cxx @@ -23,6 +23,7 @@ #include "PWGHF/Core/CentralityEstimation.h" #include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" #include "PWGHF/Utils/utilsEvSelHf.h" @@ -37,6 +38,7 @@ using namespace o2::framework::expressions; struct HfTaskOmegac0ToOmegapi { // ML inference Configurable applyMl{"applyMl", false, "Flag to apply ML selections"}; + Configurable fillCent{"fillCent", false, "Flag to fill centrality information"}; Configurable selectionFlagOmegac0{"selectionFlagOmegac0", true, "Select Omegac0 candidates"}; Configurable yCandGenMax{"yCandGenMax", 0.5, "max. gen particle rapidity"}; Configurable yCandRecoMax{"yCandRecoMax", 0.8, "max. cand. rapidity"}; @@ -57,20 +59,26 @@ struct HfTaskOmegac0ToOmegapi { using Omegac0Gen = soa::Filtered>; using Collisions = soa::Join; + using CollisionsWithFT0C = soa::Join; + using CollisionsWithFT0M = soa::Join; using CollisionsWithMcLabels = soa::Join; Filter filterOmegaCToOmegaPiFlag = (aod::hf_track_index::hfflag & static_cast(BIT(aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaPi))) != static_cast(0); Filter filterOmegaCMatchedRec = nabs(aod::hf_cand_xic0_omegac0::flagMcMatchRec) == static_cast(BIT(aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi)); Filter filterOmegaCMatchedGen = nabs(aod::hf_cand_xic0_omegac0::flagMcMatchGen) == static_cast(BIT(aod::hf_cand_xic0_omegac0::DecayType::OmegaczeroToOmegaPi)); + Preslice candOmegacKFPerCollision = aod::hf_cand_xic0_omegac0::collisionId; + Preslice candOmegacKFMlPerCollision = aod::hf_cand_xic0_omegac0::collisionId; PresliceUnsorted colPerMcCollision = aod::mccollisionlabel::mcCollisionId; // ThnSparse for ML outputScores and Vars - ConfigurableAxis thnConfigAxisPromptScore{"thnConfigAxisPromptScore", {50, 0, 1}, "Prompt score bins"}; + ConfigurableAxis thnConfigAxisPromptScore{"thnConfigAxisPromptScore", {100, 0, 1}, "Prompt score bins"}; ConfigurableAxis thnConfigAxisMass{"thnConfigAxisMass", {120, 2.4, 3.1}, "Cand. inv-mass bins"}; ConfigurableAxis thnConfigAxisPtB{"thnConfigAxisPtB", {1000, 0, 100}, "Cand. beauty mother pTB bins"}; ConfigurableAxis thnConfigAxisPt{"thnConfigAxisPt", {100, 0, 20}, "Cand. pT bins"}; ConfigurableAxis thnConfigAxisY{"thnConfigAxisY", {20, -1, 1}, "Cand. rapidity bins"}; + ConfigurableAxis thnConfigAxisCent{"thnConfigAxisCent", {100, 0, 100}, "Centrality bins"}; + ConfigurableAxis thnConfigAxisPtPion{"thnConfigAxisPtPion", {100, 0, 10}, "PtPion from Omegac0 bins"}; ConfigurableAxis thnConfigAxisOrigin{"thnConfigAxisOrigin", {3, -0.5, 2.5}, "Cand. origin type"}; ConfigurableAxis thnConfigAxisMatchFlag{"thnConfigAxisMatchFlag", {15, -7.5, 7.5}, "Cand. MC Match Flag type"}; ConfigurableAxis thnConfigAxisGenPtD{"thnConfigAxisGenPtD", {500, 0, 50}, "Gen Pt D"}; @@ -80,7 +88,7 @@ struct HfTaskOmegac0ToOmegapi { void init(InitContext&) { - std::array doprocess{doprocessDataWithKFParticle, doprocessMcWithKFParticle, doprocessDataWithKFParticleMl, doprocessMcWithKFParticleMl}; + std::array doprocess{doprocessDataWithKFParticle, doprocessMcWithKFParticle, doprocessDataWithKFParticleMl, doprocessMcWithKFParticleMl, doprocessDataWithKFParticleFT0C, doprocessDataWithKFParticleMlFT0C, doprocessDataWithKFParticleFT0M, doprocessDataWithKFParticleMlFT0M}; if ((std::accumulate(doprocess.begin(), doprocess.end(), 0)) != 1) { LOGP(fatal, "One and only one process function should be enabled at a time."); } @@ -117,6 +125,26 @@ struct HfTaskOmegac0ToOmegapi { registry.add("hMassVsPtVsPtBVsYVsOriginVsOmegac0Type", "Thn for Omegac0 candidates", HistType::kTHnSparseF, axes); registry.get(HIST("hMassVsPtVsPtBVsYVsOriginVsOmegac0Type"))->Sumw2(); } + if (fillCent) { + const AxisSpec thnAxisPromptScore{thnConfigAxisPromptScore, "BDT score prompt."}; + const AxisSpec thnAxisCent{thnConfigAxisCent, "Centrality."}; + const AxisSpec thnAxisPtPion{thnConfigAxisPtPion, "Pt of Pion from Omegac0."}; + std::vector axesWithBdtCent = {thnAxisPromptScore, thnAxisMass, thnAxisPt, thnAxisY, thnAxisCent, thnAxisPtPion, thnConfigAxisNumPvContr}; + std::vector axesWithCent = {thnAxisMass, thnAxisPt, thnAxisY, thnAxisCent, thnAxisPtPion, thnConfigAxisNumPvContr}; + registry.add("hBdtScoreVsMassVsPtVsYVsCentVsPtPion", "Thn for Omegac0 candidates with BDT&Cent&pTpi", HistType::kTHnSparseD, axesWithBdtCent); + registry.add("hMassVsPtVsYVsCentVsPtPion", "Thn for Omegac0 candidates with Cent&pTpi", HistType::kTHnSparseD, axesWithCent); + registry.get(HIST("hBdtScoreVsMassVsPtVsYVsCentVsPtPion"))->Sumw2(); + registry.get(HIST("hMassVsPtVsYVsCentVsPtPion"))->Sumw2(); + } + } + + /// Evaluate centrality/multiplicity percentile (centrality estimator is automatically selected based on the used table) + /// \param candidate is candidate + /// \return centrality/multiplicity percentile of the collision + template + float evaluateCentralityColl(const Coll& collision) + { + return o2::hf_centrality::getCentralityColl(collision); } template @@ -138,6 +166,47 @@ struct HfTaskOmegac0ToOmegapi { } } + template + void processDataCent(const CandType& candidates, CollType const& collisions) + { + for (const auto& collision : collisions) { + + auto thisCollId = collision.globalIndex(); + auto groupedOmegacCandidates = applyMl + ? candidates.sliceBy(candOmegacKFMlPerCollision, thisCollId) + : candidates.sliceBy(candOmegacKFPerCollision, thisCollId); + auto numPvContributors = collision.numContrib(); + + for (const auto& candidate : groupedOmegacCandidates) { + if (!(candidate.resultSelections() == true || (candidate.resultSelections() == false && !selectionFlagOmegac0))) { + continue; + } + if (yCandRecoMax >= 0. && std::abs(candidate.kfRapOmegac()) > yCandRecoMax) { + continue; + } + float cent = evaluateCentralityColl(collision); + if constexpr (applyMl) { + registry.fill(HIST("hBdtScoreVsMassVsPtVsYVsCentVsPtPion"), + candidate.mlProbOmegac()[0], + candidate.invMassCharmBaryon(), + candidate.ptCharmBaryon(), + candidate.kfRapOmegac(), + cent, + candidate.kfptPiFromOmegac(), + numPvContributors); + } else { + registry.fill(HIST("hMassVsPtVsYVsCentVsPtPion"), + candidate.invMassCharmBaryon(), + candidate.ptCharmBaryon(), + candidate.kfRapOmegac(), + cent, + candidate.kfptPiFromOmegac(), + numPvContributors); + } + } + } + } + template void processMc(const CandType& candidates, Omegac0Gen const& mcParticles, @@ -202,6 +271,34 @@ struct HfTaskOmegac0ToOmegapi { } PROCESS_SWITCH(HfTaskOmegac0ToOmegapi, processDataWithKFParticleMl, "process HfTaskOmegac0ToOmegapi with KFParticle and ML selections", false); + void processDataWithKFParticleFT0C(Omegac0CandsKF const& candidates, + CollisionsWithFT0C const& collisions) + { + processDataCent(candidates, collisions); + } + PROCESS_SWITCH(HfTaskOmegac0ToOmegapi, processDataWithKFParticleFT0C, "process HfTaskOmegac0ToOmegapi with KFParticle and with FT0C centrality", false); + + void processDataWithKFParticleMlFT0C(Omegac0CandsMlKF const& candidates, + CollisionsWithFT0C const& collisions) + { + processDataCent(candidates, collisions); + } + PROCESS_SWITCH(HfTaskOmegac0ToOmegapi, processDataWithKFParticleMlFT0C, "process HfTaskOmegac0ToOmegapi with KFParticle and ML selections and with FT0C centrality", false); + + void processDataWithKFParticleFT0M(Omegac0CandsKF const& candidates, + CollisionsWithFT0M const& collisions) + { + processDataCent(candidates, collisions); + } + PROCESS_SWITCH(HfTaskOmegac0ToOmegapi, processDataWithKFParticleFT0M, "process HfTaskOmegac0ToOmegapi with KFParticle and with FT0M centrality", false); + + void processDataWithKFParticleMlFT0M(Omegac0CandsMlKF const& candidates, + CollisionsWithFT0M const& collisions) + { + processDataCent(candidates, collisions); + } + PROCESS_SWITCH(HfTaskOmegac0ToOmegapi, processDataWithKFParticleMlFT0M, "process HfTaskOmegac0ToOmegapi with KFParticle and ML selections and with FT0M centrality", false); + void processMcWithKFParticle(OmegaC0CandsMcKF const& omegaC0CandidatesMcKF, Omegac0Gen const& mcParticles, TracksMc const& tracks, diff --git a/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx b/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx index e3ba8f255dc..754272af541 100644 --- a/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx +++ b/PWGHF/TableProducer/candidateCreatorXic0Omegac0.cxx @@ -15,6 +15,7 @@ /// \author Ruiqi Yin , Fudan University /// \author Yunfan Liu , China University of Geosciences /// \author Ran Tu , Fudan University +/// \author Tao Fang , Central China Normal University #ifndef HomogeneousField #define HomogeneousField // o2-linter: disable=name/macro (required by KFParticle) @@ -243,16 +244,16 @@ struct HfCandidateCreatorXic0Omegac0 { void init(InitContext const&) { - std::array allProcesses = {doprocessNoCentToXiPi, doprocessNoCentToXiPiTraCasc, doprocessCentFT0CToXiPi, doprocessCentFT0MToXiPi, doprocessNoCentToOmegaPi, doprocessOmegacToOmegaPiWithKFParticle, doprocessCentFT0CToOmegaPi, doprocessCentFT0MToOmegaPi, doprocessNoCentToOmegaK, doprocessCentFT0CToOmegaK, doprocessCentFT0MToOmegaK, doprocessXicToXiPiWithKFParticle}; + std::array allProcesses = {doprocessNoCentToXiPi, doprocessNoCentToXiPiTraCasc, doprocessCentFT0CToXiPi, doprocessCentFT0MToXiPi, doprocessNoCentToOmegaPi, doprocessNoCentOmegacToOmegaPiWithKFParticle, doprocessCentFT0COmegacToOmegaPiWithKFParticle, doprocessCentFT0MOmegacToOmegaPiWithKFParticle, doprocessCentFT0CToOmegaPi, doprocessCentFT0MToOmegaPi, doprocessNoCentToOmegaK, doprocessCentFT0CToOmegaK, doprocessCentFT0MToOmegaK, doprocessNoCentXicToXiPiWithKFParticle, doprocessCentFT0CXicToXiPiWithKFParticle, doprocessCentFT0MXicToXiPiWithKFParticle}; if (std::accumulate(allProcesses.begin(), allProcesses.end(), 0) == 0) { LOGP(fatal, "No process function enabled, please select one for at least one channel."); } - std::array processesToXiPi = {doprocessNoCentToXiPi, doprocessNoCentToXiPiTraCasc, doprocessCentFT0CToXiPi, doprocessCentFT0MToXiPi, doprocessXicToXiPiWithKFParticle}; + std::array processesToXiPi = {doprocessNoCentToXiPi, doprocessNoCentToXiPiTraCasc, doprocessCentFT0CToXiPi, doprocessCentFT0MToXiPi, doprocessNoCentXicToXiPiWithKFParticle, doprocessCentFT0CXicToXiPiWithKFParticle, doprocessCentFT0MXicToXiPiWithKFParticle}; if (std::accumulate(processesToXiPi.begin(), processesToXiPi.end(), 0) > 1) { LOGP(fatal, "One and only one ToXiPi process function must be enabled at a time."); } - std::array processesToOmegaPi = {doprocessNoCentToOmegaPi, doprocessCentFT0CToOmegaPi, doprocessCentFT0MToOmegaPi, doprocessOmegacToOmegaPiWithKFParticle}; + std::array processesToOmegaPi = {doprocessNoCentToOmegaPi, doprocessCentFT0CToOmegaPi, doprocessCentFT0MToOmegaPi, doprocessNoCentOmegacToOmegaPiWithKFParticle, doprocessCentFT0COmegacToOmegaPiWithKFParticle, doprocessCentFT0MOmegacToOmegaPiWithKFParticle}; if (std::accumulate(processesToOmegaPi.begin(), processesToOmegaPi.end(), 0) > 1) { LOGP(fatal, "One and only one process ToOmegaPi function must be enabled at a time."); } @@ -267,7 +268,7 @@ struct HfCandidateCreatorXic0Omegac0 { LOGP(fatal, "At most one process function for collision monitoring can be enabled at a time."); } if (nProcessesCollisions == 1) { - if ((doprocessNoCentToXiPi && !doprocessCollisions) || (doprocessNoCentToXiPiTraCasc && !doprocessCollisions) || (doprocessNoCentToOmegaPi && !doprocessCollisions) || (doprocessNoCentToOmegaK && !doprocessCollisions) || (doprocessOmegacToOmegaPiWithKFParticle && !doprocessCollisions) || (doprocessXicToXiPiWithKFParticle && !doprocessCollisions)) { + if ((doprocessNoCentToXiPi && !doprocessCollisions) || (doprocessNoCentToXiPiTraCasc && !doprocessCollisions) || (doprocessNoCentToOmegaPi && !doprocessCollisions) || (doprocessNoCentToOmegaK && !doprocessCollisions) || (doprocessNoCentOmegacToOmegaPiWithKFParticle && !doprocessCollisions) || (doprocessNoCentXicToXiPiWithKFParticle && !doprocessCollisions)) { LOGP(fatal, "Process function for collision monitoring not correctly enabled. Did you enable \"processCollisions\"?"); } if ((doprocessCentFT0CToXiPi && !doprocessCollisionsCentFT0C) || (doprocessCentFT0CToOmegaPi && !doprocessCollisionsCentFT0C) || (doprocessCentFT0CToOmegaK && !doprocessCollisionsCentFT0C)) { @@ -725,7 +726,7 @@ struct HfCandidateCreatorXic0Omegac0 { } // loop over LF Cascade-bachelor candidates } // end of run function - template + template void runKfOmegac0CreatorWithKFParticle(Coll const&, aod::BCsWithTimestamps const& /*bcWithTimeStamps*/, MyKfTracks const&, @@ -740,6 +741,12 @@ struct HfCandidateCreatorXic0Omegac0 { hCandidateCounter->Fill(1); auto collision = cand.collision_as(); + float centrality{-1.f}; + const auto rejectionMask = hfEvSel.getHfCollisionRejectionMask(collision, centrality, ccdb, registry); + if (rejectionMask != 0) { + /// at least one event selection not satisfied --> reject the candidate + continue; + } // set the magnetic field from CCDB auto bc = collision.template bc_as(); @@ -1196,7 +1203,7 @@ struct HfCandidateCreatorXic0Omegac0 { } // loop over LF Cascade-bachelor candidates } // end of run function //========================================================== - template + template void runKfXic0CreatorWithKFParticle(Coll const&, aod::BCsWithTimestamps const& /*bcWithTimeStamps*/, MyKfTracks const&, @@ -1212,6 +1219,13 @@ struct HfCandidateCreatorXic0Omegac0 { auto collision = cand.collision_as(); + float centrality{-1.f}; + const auto rejectionMask = hfEvSel.getHfCollisionRejectionMask(collision, centrality, ccdb, registry); + if (rejectionMask != 0) { + /// at least one event selection not satisfied --> reject the candidate + continue; + } + // set the magnetic field from CCDB auto bc = collision.template bc_as(); if (runNumber != bc.runNumber()) { @@ -1678,27 +1692,27 @@ struct HfCandidateCreatorXic0Omegac0 { } PROCESS_SWITCH(HfCandidateCreatorXic0Omegac0, processNoCentToOmegaPi, "Run candidate creator w/o centrality selections for omega pi decay channel", false); - void processOmegacToOmegaPiWithKFParticle(aod::Collisions const& collisions, + void processNoCentOmegacToOmegaPiWithKFParticle(soa::Join const& collisions, + aod::BCsWithTimestamps const& bcWithTimeStamps, + MyKfTracks const& tracks, + MyKfCascTable const& cascades, + KFCascadesLinked const& cascadeLinks, + aod::HfCascLf2Prongs const& candidates) + { + runKfOmegac0CreatorWithKFParticle(collisions, bcWithTimeStamps, tracks, cascades, cascadeLinks, candidates, hInvMassCharmBaryonToOmegaPi, hFitterStatusToOmegaPi, hCandidateCounterToOmegaPi, hCascadesCounterToOmegaPi); + } + PROCESS_SWITCH(HfCandidateCreatorXic0Omegac0, processNoCentOmegacToOmegaPiWithKFParticle, "Run candidate creator w/o centrality selections for Omegac0 To omega pi decay channel using KFParticle", false); + + void processNoCentXicToXiPiWithKFParticle(soa::Join const& collisions, aod::BCsWithTimestamps const& bcWithTimeStamps, MyKfTracks const& tracks, MyKfCascTable const& cascades, KFCascadesLinked const& cascadeLinks, aod::HfCascLf2Prongs const& candidates) { - runKfOmegac0CreatorWithKFParticle(collisions, bcWithTimeStamps, tracks, cascades, cascadeLinks, candidates, hInvMassCharmBaryonToOmegaPi, hFitterStatusToOmegaPi, hCandidateCounterToOmegaPi, hCascadesCounterToOmegaPi); - } - PROCESS_SWITCH(HfCandidateCreatorXic0Omegac0, processOmegacToOmegaPiWithKFParticle, "Run candidate creator w/o centrality selections for Omegac0 To omega pi decay channel using KFParticle", false); - - void processXicToXiPiWithKFParticle(aod::Collisions const& collisions, - aod::BCsWithTimestamps const& bcWithTimeStamps, - MyKfTracks const& tracks, - MyKfCascTable const& cascades, - KFCascadesLinked const& cascadeLinks, - aod::HfCascLf2Prongs const& candidates) - { - runKfXic0CreatorWithKFParticle(collisions, bcWithTimeStamps, tracks, cascades, cascadeLinks, candidates, hInvMassCharmBaryonToXiPi, hFitterStatusToXiPi, hCandidateCounterToXiPi, hCascadesCounterToXiPi); + runKfXic0CreatorWithKFParticle(collisions, bcWithTimeStamps, tracks, cascades, cascadeLinks, candidates, hInvMassCharmBaryonToXiPi, hFitterStatusToXiPi, hCandidateCounterToXiPi, hCascadesCounterToXiPi); } - PROCESS_SWITCH(HfCandidateCreatorXic0Omegac0, processXicToXiPiWithKFParticle, "Run candidate creator w/o centrality selections for Xic0 To Xi pi decay channel using KFParticle", false); + PROCESS_SWITCH(HfCandidateCreatorXic0Omegac0, processNoCentXicToXiPiWithKFParticle, "Run candidate creator w/o centrality selections for Xic0 To Xi pi decay channel using KFParticle", false); void processNoCentToOmegaK(soa::Join const& collisions, aod::BCsWithTimestamps const& bcWithTimeStamps, @@ -1737,6 +1751,28 @@ struct HfCandidateCreatorXic0Omegac0 { } PROCESS_SWITCH(HfCandidateCreatorXic0Omegac0, processCentFT0CToOmegaPi, "Run candidate creator w/ centrality selection on FT0C for omega pi channel", false); + void processCentFT0COmegacToOmegaPiWithKFParticle(soa::Join const& collisions, + aod::BCsWithTimestamps const& bcWithTimeStamps, + MyKfTracks const& tracks, + MyKfCascTable const& cascades, + KFCascadesLinked const& cascadeLinks, + aod::HfCascLf2Prongs const& candidates) + { + runKfOmegac0CreatorWithKFParticle(collisions, bcWithTimeStamps, tracks, cascades, cascadeLinks, candidates, hInvMassCharmBaryonToOmegaPi, hFitterStatusToOmegaPi, hCandidateCounterToOmegaPi, hCascadesCounterToOmegaPi); + } + PROCESS_SWITCH(HfCandidateCreatorXic0Omegac0, processCentFT0COmegacToOmegaPiWithKFParticle, "Run candidate creator w/o centrality selections for Omegac0 To omega pi decay channel using KFParticle", false); + + void processCentFT0CXicToXiPiWithKFParticle(soa::Join const& collisions, + aod::BCsWithTimestamps const& bcWithTimeStamps, + MyKfTracks const& tracks, + MyKfCascTable const& cascades, + KFCascadesLinked const& cascadeLinks, + aod::HfCascLf2Prongs const& candidates) + { + runKfXic0CreatorWithKFParticle(collisions, bcWithTimeStamps, tracks, cascades, cascadeLinks, candidates, hInvMassCharmBaryonToXiPi, hFitterStatusToXiPi, hCandidateCounterToXiPi, hCascadesCounterToXiPi); + } + PROCESS_SWITCH(HfCandidateCreatorXic0Omegac0, processCentFT0CXicToXiPiWithKFParticle, "Run candidate creator w FT0C centrality selections for Xic0 To Xi pi decay channel using KFParticle", false); + void processCentFT0CToOmegaK(soa::Join const& collisions, aod::BCsWithTimestamps const& bcWithTimeStamps, TracksWCovDca const& tracks, @@ -1774,6 +1810,28 @@ struct HfCandidateCreatorXic0Omegac0 { } PROCESS_SWITCH(HfCandidateCreatorXic0Omegac0, processCentFT0MToOmegaPi, "Run candidate creator w/ centrality selection on FT0M for omega pi channel", false); + void processCentFT0MOmegacToOmegaPiWithKFParticle(soa::Join const& collisions, + aod::BCsWithTimestamps const& bcWithTimeStamps, + MyKfTracks const& tracks, + MyKfCascTable const& cascades, + KFCascadesLinked const& cascadeLinks, + aod::HfCascLf2Prongs const& candidates) + { + runKfOmegac0CreatorWithKFParticle(collisions, bcWithTimeStamps, tracks, cascades, cascadeLinks, candidates, hInvMassCharmBaryonToOmegaPi, hFitterStatusToOmegaPi, hCandidateCounterToOmegaPi, hCascadesCounterToOmegaPi); + } + PROCESS_SWITCH(HfCandidateCreatorXic0Omegac0, processCentFT0MOmegacToOmegaPiWithKFParticle, "Run candidate creator w/o centrality selections for Omegac0 To omega pi decay channel using KFParticle", false); + + void processCentFT0MXicToXiPiWithKFParticle(soa::Join const& collisions, + aod::BCsWithTimestamps const& bcWithTimeStamps, + MyKfTracks const& tracks, + MyKfCascTable const& cascades, + KFCascadesLinked const& cascadeLinks, + aod::HfCascLf2Prongs const& candidates) + { + runKfXic0CreatorWithKFParticle(collisions, bcWithTimeStamps, tracks, cascades, cascadeLinks, candidates, hInvMassCharmBaryonToXiPi, hFitterStatusToXiPi, hCandidateCounterToXiPi, hCascadesCounterToXiPi); + } + PROCESS_SWITCH(HfCandidateCreatorXic0Omegac0, processCentFT0MXicToXiPiWithKFParticle, "Run candidate creator w FT0M centrality selections for Xic0 To Xi pi decay channel using KFParticle", false); + void processCentFT0MToOmegaK(soa::Join const& collisions, aod::BCsWithTimestamps const& bcWithTimeStamps, TracksWCovDca const& tracks, diff --git a/PWGHF/TableProducer/treeCreatorXic0ToXiPiKf.cxx b/PWGHF/TableProducer/treeCreatorXic0ToXiPiKf.cxx index e763724e501..87355a4590b 100644 --- a/PWGHF/TableProducer/treeCreatorXic0ToXiPiKf.cxx +++ b/PWGHF/TableProducer/treeCreatorXic0ToXiPiKf.cxx @@ -14,12 +14,15 @@ /// In this file are defined and filled the output tables /// /// \author Ran Tu , Fudan University +/// \author Tao Fang , Central China Normal University #include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" #include "Common/Core/RecoDecay.h" +#include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/CentralityEstimation.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" @@ -30,6 +33,7 @@ namespace o2::aod { namespace full { +DECLARE_SOA_COLUMN(Centrality, centrality, float); DECLARE_SOA_COLUMN(InvMassLambda, invMassLambda, float); DECLARE_SOA_COLUMN(InvMassCascade, invMassCascade, float); DECLARE_SOA_COLUMN(InvMassCharmBaryon, invMassCharmBaryon, float); @@ -97,6 +101,7 @@ DECLARE_SOA_COLUMN(MassCascChi2OverNdf, massCascChi2OverNdf, float); } // namespace full DECLARE_SOA_TABLE(HfKfXicFulls, "AOD", "HFKFXICFULL", + full::Centrality, full::TpcNSigmaPiFromCharmBaryon, full::TofNSigmaPiFromCharmBaryon, full::TpcNSigmaPiFromCasc, full::TofNSigmaPiFromCasc, full::TpcNSigmaPiFromLambda, full::TofNSigmaPiFromLambda, full::TpcNSigmaPrFromLambda, full::TofNSigmaPrFromLambda, full::KfDcaXYPiFromXic, full::DcaCascDau, full::DcaCharmBaryonDau, full::KfDcaXYCascToPv, @@ -127,18 +132,29 @@ struct HfTreeCreatorXic0ToXiPiKf { Configurable zPvCut{"zPvCut", 10., "Cut on absolute value of primary vertex z coordinate"}; using MyTrackTable = soa::Join; + using MyEventTable = soa::Join; + using MyEventTableWithFT0C = soa::Join; + using MyEventTableWithFT0M = soa::Join; + using MyEventTableWithNTracksPV = soa::Join; void init(InitContext const&) { } - template + template void fillKfCandidate(const T& candidate, int8_t flagMc, int8_t debugMc, int8_t originMc, bool collisionMatched) { if (candidate.resultSelections() && candidate.statusPidCharmBaryon() && candidate.statusInvMassLambda() && candidate.statusInvMassCascade() && candidate.statusInvMassCharmBaryon()) { + float centrality = -999.f; + if constexpr (useCentrality) { + auto const& collision = candidate.template collision_as(); + centrality = o2::hf_centrality::getCentralityColl(collision); + } + rowKfCandidate( + centrality, candidate.tpcNSigmaPiFromCharmBaryon(), candidate.tofNSigmaPiFromCharmBaryon(), candidate.tpcNSigmaPiFromCasc(), @@ -202,26 +218,85 @@ struct HfTreeCreatorXic0ToXiPiKf { } } - void processKfData(MyTrackTable const&, + void processKfData(MyTrackTable const&, MyEventTable const&, soa::Join const& candidates) { rowKfCandidate.reserve(candidates.size()); for (const auto& candidate : candidates) { - fillKfCandidate(candidate, -7, -7, RecoDecay::OriginType::None, false); + fillKfCandidate(candidate, -7, -7, RecoDecay::OriginType::None, false); } } PROCESS_SWITCH(HfTreeCreatorXic0ToXiPiKf, processKfData, "Process KF data", false); + void processKfDataWithFT0C(MyTrackTable const&, MyEventTableWithFT0C const&, + soa::Join const& candidates) + { + rowKfCandidate.reserve(candidates.size()); + for (const auto& candidate : candidates) { + fillKfCandidate(candidate, -7, -7, RecoDecay::OriginType::None, false); + } + } + PROCESS_SWITCH(HfTreeCreatorXic0ToXiPiKf, processKfDataWithFT0C, "Process KF data with FT0C", false); + + void processKfDataWithFT0M(MyTrackTable const&, MyEventTableWithFT0M const&, + soa::Join const& candidates) + { + rowKfCandidate.reserve(candidates.size()); + for (const auto& candidate : candidates) { + fillKfCandidate(candidate, -7, -7, RecoDecay::OriginType::None, false); + } + } + PROCESS_SWITCH(HfTreeCreatorXic0ToXiPiKf, processKfDataWithFT0M, "Process KF data with FT0M", false); + + void processDataLiteWithNTracksPV(MyTrackTable const&, + soa::Join const& candidates) + { + rowKfCandidate.reserve(candidates.size()); + for (const auto& candidate : candidates) { + fillKfCandidate(candidate, -7, -7, RecoDecay::OriginType::None, false); + } + } + PROCESS_SWITCH(HfTreeCreatorXic0ToXiPiKf, processDataLiteWithNTracksPV, "Process KF data with Ntracks", false); + void processKfMcXic0(MyTrackTable const&, soa::Join const& candidates) { rowKfCandidate.reserve(candidates.size()); for (const auto& candidate : candidates) { - fillKfCandidate(candidate, candidate.flagMcMatchRec(), candidate.debugMcRec(), candidate.originRec(), candidate.collisionMatched()); + fillKfCandidate(candidate, candidate.flagMcMatchRec(), candidate.debugMcRec(), candidate.originRec(), candidate.collisionMatched()); } } PROCESS_SWITCH(HfTreeCreatorXic0ToXiPiKf, processKfMcXic0, "Process MC with information for xic0", false); + void processKfMCWithFT0C(MyTrackTable const&, + soa::Join const& candidates) + { + rowKfCandidate.reserve(candidates.size()); + for (const auto& candidate : candidates) { + fillKfCandidate(candidate, candidate.flagMcMatchRec(), candidate.debugMcRec(), candidate.originRec(), candidate.collisionMatched()); + } + } + PROCESS_SWITCH(HfTreeCreatorXic0ToXiPiKf, processKfMCWithFT0C, "Process MC with information for xic0 at FT0C", false); + + void processKfMCWithFT0M(MyTrackTable const&, + soa::Join const& candidates) + { + rowKfCandidate.reserve(candidates.size()); + for (const auto& candidate : candidates) { + fillKfCandidate(candidate, candidate.flagMcMatchRec(), candidate.debugMcRec(), candidate.originRec(), candidate.collisionMatched()); + } + } + PROCESS_SWITCH(HfTreeCreatorXic0ToXiPiKf, processKfMCWithFT0M, "Process MC with information for xic0 at FT0M", false); + + void processMCLiteWithNTracksPV(MyTrackTable const&, + soa::Join const& candidates) + { + rowKfCandidate.reserve(candidates.size()); + for (const auto& candidate : candidates) { + fillKfCandidate(candidate, candidate.flagMcMatchRec(), candidate.debugMcRec(), candidate.originRec(), candidate.collisionMatched()); + } + } + PROCESS_SWITCH(HfTreeCreatorXic0ToXiPiKf, processMCLiteWithNTracksPV, "Process MC with information for xic0 at Ntrack", false); }; // end of struct WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From a187fdf68711699a5e608a1d17f45b68777f4379 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Sat, 7 Jun 2025 20:36:15 +0200 Subject: [PATCH 1546/1650] [PWGEM/Dilepton] reduce memory consumption in createResolutionMap.cxx (#11505) --- PWGEM/Dilepton/Tasks/createResolutionMap.cxx | 84 ++++++++++++-------- 1 file changed, 53 insertions(+), 31 deletions(-) diff --git a/PWGEM/Dilepton/Tasks/createResolutionMap.cxx b/PWGEM/Dilepton/Tasks/createResolutionMap.cxx index 557c3468be2..c6c056b5dcb 100644 --- a/PWGEM/Dilepton/Tasks/createResolutionMap.cxx +++ b/PWGEM/Dilepton/Tasks/createResolutionMap.cxx @@ -73,7 +73,7 @@ struct CreateResolutionMap { // Configurable cfg_reject_fake_match_its_tpc_tof{"cfg_reject_fake_match_its_tpc_tof", false, "flag to reject fake match between ITS-TPC-TOF"}; Configurable cfg_reject_fake_match_mft_mch{"cfg_reject_fake_match_mft_mch", false, "flag to reject fake match between MFT-MCH"}; - ConfigurableAxis ConfPtGenBins{"ConfPtGenBins", {VARIABLE_WIDTH, 0.00, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.10, 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.20, 0.21, 0.22, 0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.30, 0.31, 0.32, 0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.40, 0.41, 0.42, 0.43, 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.50, 0.51, 0.52, 0.53, 0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.60, 0.61, 0.62, 0.63, 0.64, 0.65, 0.66, 0.67, 0.68, 0.69, 0.70, 0.71, 0.72, 0.73, 0.74, 0.75, 0.76, 0.77, 0.78, 0.79, 0.80, 0.81, 0.82, 0.83, 0.84, 0.85, 0.86, 0.87, 0.88, 0.89, 0.90, 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1.00, 1.10, 1.20, 1.30, 1.40, 1.50, 1.60, 1.70, 1.80, 1.90, 2.00, 2.10, 2.20, 2.30, 2.40, 2.50, 2.60, 2.70, 2.80, 2.90, 3.00, 3.10, 3.20, 3.30, 3.40, 3.50, 3.60, 3.70, 3.80, 3.90, 4.00, 4.10, 4.20, 4.30, 4.40, 4.50, 4.60, 4.70, 4.80, 4.90, 5.00, 5.50, 6.00, 6.50, 7.00, 7.50, 8.00, 8.50, 9.00, 9.50, 10.00, 11.00, 12.00, 13.00, 14.00, 15.00, 16.00, 17.00, 18.00, 19.00, 20.00}, "gen. pT bins for output histograms"}; + ConfigurableAxis ConfPtGenBins{"ConfPtGenBins", {VARIABLE_WIDTH, 0.00, 0.05, 0.06, 0.07, 0.08, 0.09, 0.10, 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.20, 0.21, 0.22, 0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.30, 0.31, 0.32, 0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.40, 0.41, 0.42, 0.43, 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.50, 0.51, 0.52, 0.53, 0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.60, 0.61, 0.62, 0.63, 0.64, 0.65, 0.66, 0.67, 0.68, 0.69, 0.70, 0.71, 0.72, 0.73, 0.74, 0.75, 0.76, 0.77, 0.78, 0.79, 0.80, 0.81, 0.82, 0.83, 0.84, 0.85, 0.86, 0.87, 0.88, 0.89, 0.90, 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1.00, 1.10, 1.20, 1.30, 1.40, 1.50, 1.60, 1.70, 1.80, 1.90, 2.00, 2.10, 2.20, 2.30, 2.40, 2.50, 2.60, 2.70, 2.80, 2.90, 3.00, 3.10, 3.20, 3.30, 3.40, 3.50, 3.60, 3.70, 3.80, 3.90, 4.00, 4.10, 4.20, 4.30, 4.40, 4.50, 4.60, 4.70, 4.80, 4.90, 5.00, 5.50, 6.00, 6.50, 7.00, 7.50, 8.00, 8.50, 9.00, 9.50, 10.00, 11.00, 12.00, 13.00, 14.00, 15.00, 16.00, 17.00, 18.00, 19.00, 20.00}, "gen. pT bins for output histograms"}; ConfigurableAxis ConfCentBins{"ConfCentBins", {VARIABLE_WIDTH, 0, 10, 30, 50, 110}, "centrality (%) bins for output histograms"}; ConfigurableAxis ConfEtaCBGenBins{"ConfEtaCBGenBins", {30, -1.5, +1.5}, "gen. eta bins at midrapidity for output histograms"}; @@ -81,8 +81,8 @@ struct CreateResolutionMap { ConfigurableAxis ConfPhiGenBins{"ConfPhiGenBins", {72, 0, 2.f * M_PI}, "gen. eta bins at forward rapidity for output histograms"}; ConfigurableAxis ConfRelDeltaPtBins{"ConfRelDeltaPtBins", {200, -1.f, +1.f}, "rel. dpt for output histograms"}; - ConfigurableAxis ConfDeltaEtaBins{"ConfDeltaEtaBins", {200, -0.5f, +0.5f}, "deta bins for output histograms"}; - ConfigurableAxis ConfDeltaPhiBins{"ConfDeltaPhiBins", {200, -0.5f, +0.5f}, "dphi bins for output histograms"}; + ConfigurableAxis ConfDeltaEtaBins{"ConfDeltaEtaBins", {200, -0.2f, +0.2f}, "deta bins for output histograms"}; + ConfigurableAxis ConfDeltaPhiBins{"ConfDeltaPhiBins", {200, -0.2f, +0.2f}, "dphi bins for output histograms"}; Configurable cfgFillTHnSparse{"cfgFillTHnSparse", true, "fill THnSparse for output"}; Configurable cfgFillTH2{"cfgFillTH2", false, "fill TH2 for output"}; @@ -212,9 +212,11 @@ struct CreateResolutionMap { const AxisSpec axis_dphi{ConfDeltaPhiBins, "#varphi_{l}^{gen} - #varphi_{l}^{rec} (rad.)"}; const AxisSpec axis_charge_gen{3, -1.5, +1.5, "true sign"}; - registry.add("Event/Electron/hImpPar_Centrality", "true imapact parameter vs. estimated centrality;impact parameter (fm);centrality (%)", kTH2F, {{200, 0, 20}, {110, 0, 110}}, true); - registry.add("Event/Muon/hImpPar_Centrality", "true imapact parameter vs. estimated centrality;impact parameter (fm);centrality (%)", kTH2F, {{200, 0, 20}, {110, 0, 110}}, true); - + // registry.add("Event/Electron/hImpPar_Centrality", "true imapact parameter vs. estimated centrality;impact parameter (fm);centrality (%)", kTH2F, {{200, 0, 20}, {110, 0, 110}}, true); + // registry.add("Event/Electron/hImpPar_Centrality", "true imapact parameter vs. estimated centrality;impact parameter (fm);centrality (%)", kTH2F, {{200, 0, 20}, {110, 0, 110}}, true); + if (doprocessGen) { + registry.add("Event/hGenID", "generator ID;generator ID;Number of mc collisions", kTH1F, {{7, -1.5, 5.5}}, true); + } if (cfgFillTH2) { registry.add("Electron/hPt", "rec. p_{T,l};p_{T,l} (GeV/c)", kTH1F, {{1000, 0, 10}}, false); registry.add("Electron/hEtaPhi", "rec. #eta vs. #varphi;#varphi_{l} (rad.);#eta_{l}", kTH2F, {{90, 0, 2 * M_PI}, {100, -5, +5}}, false); @@ -685,7 +687,7 @@ struct CreateResolutionMap { using MyCollisions = Join; using MyCollision = MyCollisions::iterator; - using MyTracks = soa::Join; + using MyTracks = soa::Join; using MyTrack = MyTracks::iterator; using MyFwdTracks = soa::Join; @@ -765,19 +767,22 @@ struct CreateResolutionMap { continue; } - auto mccollision = collision.template mcCollision_as(); - if (cfgEventGeneratorType >= 0 && mccollision.getSubGeneratorId() != cfgEventGeneratorType) { - continue; - } - float centrality = std::array{collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}[cfgCentEstimator]; - registry.fill(HIST("Event/Electron/hImpPar_Centrality"), mccollision.impactParameter(), centrality); + // auto mccollision = collision.template mcCollision_as(); + // registry.fill(HIST("Event/Electron/hImpPar_Centrality"), mccollision.impactParameter(), centrality); auto tracks_per_coll = tracks.sliceBy(perCollision_mid, collision.globalIndex()); for (const auto& track : tracks_per_coll) { if (!track.has_mcParticle()) { continue; } + + auto mctrack = track.template mcParticle_as(); + auto mccollision_from_mctrack = mctrack.template mcCollision_as(); + if (cfgEventGeneratorType >= 0 && mccollision_from_mctrack.getSubGeneratorId() != cfgEventGeneratorType) { + continue; + } + fillElectron(collision, track, centrality); } // end of track loop } // end of collision loop @@ -799,13 +804,9 @@ struct CreateResolutionMap { continue; } - auto mccollision = collision.template mcCollision_as(); - if (cfgEventGeneratorType >= 0 && mccollision.getSubGeneratorId() != cfgEventGeneratorType) { - continue; - } - float centrality = std::array{collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}[cfgCentEstimator]; - registry.fill(HIST("Event/Electron/hImpPar_Centrality"), mccollision.impactParameter(), centrality); + // auto mccollision = collision.template mcCollision_as(); + // registry.fill(HIST("Event/Electron/hImpPar_Centrality"), mccollision.impactParameter(), centrality); auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, collision.globalIndex()); for (const auto& trackId : trackIdsThisCollision) { @@ -813,6 +814,11 @@ struct CreateResolutionMap { if (!track.has_mcParticle()) { continue; } + auto mctrack = track.template mcParticle_as(); + auto mccollision_from_mctrack = mctrack.template mcCollision_as(); + if (cfgEventGeneratorType >= 0 && mccollision_from_mctrack.getSubGeneratorId() != cfgEventGeneratorType) { + continue; + } fillElectron(collision, track, centrality); } // end of track loop } // end of collision loop @@ -836,13 +842,9 @@ struct CreateResolutionMap { continue; } - auto mccollision = collision.template mcCollision_as(); - if (cfgEventGeneratorType >= 0 && mccollision.getSubGeneratorId() != cfgEventGeneratorType) { - continue; - } - float centrality = std::array{collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}[cfgCentEstimator]; - registry.fill(HIST("Event/Muon/hImpPar_Centrality"), mccollision.impactParameter(), centrality); + // auto mccollision = collision.template mcCollision_as(); + // registry.fill(HIST("Event/Muon/hImpPar_Centrality"), mccollision.impactParameter(), centrality); auto sa_muons_per_coll = sa_muons->sliceByCached(o2::aod::fwdtrack::collisionId, collision.globalIndex(), cache); auto global_muons_per_coll = global_muons->sliceByCached(o2::aod::fwdtrack::collisionId, collision.globalIndex(), cache); @@ -851,6 +853,12 @@ struct CreateResolutionMap { if (!muon.has_mcParticle()) { continue; } + + auto mctrack = muon.template mcParticle_as(); + auto mccollision_from_mctrack = mctrack.template mcCollision_as(); + if (cfgEventGeneratorType >= 0 && mccollision_from_mctrack.getSubGeneratorId() != cfgEventGeneratorType) { + continue; + } fillMuon(collision, muon, centrality); } // end of standalone muon loop @@ -858,6 +866,11 @@ struct CreateResolutionMap { if (!muon.has_mcParticle()) { continue; } + auto mctrack = muon.template mcParticle_as(); + auto mccollision_from_mctrack = mctrack.template mcCollision_as(); + if (cfgEventGeneratorType >= 0 && mccollision_from_mctrack.getSubGeneratorId() != cfgEventGeneratorType) { + continue; + } fillMuon(collision, muon, centrality); } // end of global muon loop @@ -880,13 +893,9 @@ struct CreateResolutionMap { continue; } - auto mccollision = collision.template mcCollision_as(); - if (cfgEventGeneratorType >= 0 && mccollision.getSubGeneratorId() != cfgEventGeneratorType) { - continue; - } - float centrality = std::array{collision.centFT0M(), collision.centFT0A(), collision.centFT0C()}[cfgCentEstimator]; - registry.fill(HIST("Event/Muon/hImpPar_Centrality"), mccollision.impactParameter(), centrality); + // auto mccollision = collision.template mcCollision_as(); + // registry.fill(HIST("Event/Muon/hImpPar_Centrality"), mccollision.impactParameter(), centrality); auto fwdtrackIdsThisCollision = fwdtrackIndices.sliceBy(fwdtrackIndicesPerCollision, collision.globalIndex()); for (const auto& fwdtrackId : fwdtrackIdsThisCollision) { @@ -894,11 +903,24 @@ struct CreateResolutionMap { if (!muon.has_mcParticle()) { continue; } + auto mctrack = muon.template mcParticle_as(); + auto mccollision_from_mctrack = mctrack.template mcCollision_as(); + if (cfgEventGeneratorType >= 0 && mccollision_from_mctrack.getSubGeneratorId() != cfgEventGeneratorType) { + continue; + } fillMuon(collision, muon, centrality); } // end of fwdtrack loop } // end of collision loop } PROCESS_SWITCH(CreateResolutionMap, processMuonTTCA, "create resolution map for muon at forward rapidity", false); + + void processGen(aod::McCollisions const& mcCollisions) + { + for (const auto& mccollision : mcCollisions) { + registry.fill(HIST("Event/hGenID"), mccollision.getSubGeneratorId()); + } + } + PROCESS_SWITCH(CreateResolutionMap, processGen, "process generated info", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { From 6c1394c9e93dca49bf1a5d81b33ba6e42a26ee46 Mon Sep 17 00:00:00 2001 From: Nida Malik Date: Sun, 8 Jun 2025 01:44:14 +0530 Subject: [PATCH 1547/1650] [PWGCF] Added histograms for Monte Carlo (#11486) --- .../Tasks/netchargeFluctuations.cxx | 639 ++++++++++++++++-- 1 file changed, 588 insertions(+), 51 deletions(-) diff --git a/PWGCF/EbyEFluctuations/Tasks/netchargeFluctuations.cxx b/PWGCF/EbyEFluctuations/Tasks/netchargeFluctuations.cxx index b927b083066..f94b6161330 100644 --- a/PWGCF/EbyEFluctuations/Tasks/netchargeFluctuations.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/netchargeFluctuations.cxx @@ -9,94 +9,631 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -// author Nida Malik (nida.malik@cern.ch) -// Department of Physics, Aligarh Muslim University, India -// to study the net charge fluctuations by observable, #nu_dyn +/// \file netchargeFluctuations.cxx +/// \brief Calculate net-charge fluctuations using nu_dyn observable +/// For charged particles +/// For RUN-3 +/// +/// \author Nida Malik +#include // Include for std::vector #include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Multiplicity.h" -#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/Core/trackUtilities.h" +#include "Common/CCDB/EventSelectionParams.h" #include "Common/Core/TrackSelection.h" #include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/Centrality.h" +#include "CommonConstants/MathConstants.h" +#include "Common/DataModel/FT0Corrected.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/RunningWorkflowInfo.h" +#include "PWGCF/Core/CorrelationContainer.h" +#include "PWGCF/Core/PairCuts.h" +#include "Common/CCDB/TriggerAliases.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/O2DatabasePDGPlugin.h" +#include "CommonConstants/PhysicsConstants.h" +#include "TProfile.h" +#include "TProfile2D.h" +#include "TRandom3.h" using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; using namespace std; +using namespace o2::constants::physics; + +namespace o2 +{ +namespace aod +{ +namespace net_charge +{ +DECLARE_SOA_COLUMN(PosCharge, posCharge, float); +DECLARE_SOA_COLUMN(NegCharge, negCharge, float); +DECLARE_SOA_COLUMN(PosSqCharge, posSqCharge, float); +DECLARE_SOA_COLUMN(NegSqCharge, negSqCharge, float); +DECLARE_SOA_COLUMN(TermPCharge, termPCharge, float); +DECLARE_SOA_COLUMN(TermNCharge, termNCharge, float); +DECLARE_SOA_COLUMN(PosNegCharge, posNegCharge, float); +DECLARE_SOA_COLUMN(Centrality, centrality, float); +} // namespace net_charge -namespace o2::aod +namespace net_charge_gen { -using MyCollisions = soa::Join; -using MyCollision = MyCollisions::iterator; +DECLARE_SOA_COLUMN(PosCharge, posCharge, float); +DECLARE_SOA_COLUMN(NegCharge, negCharge, float); +DECLARE_SOA_COLUMN(PosSqCharge, posSqCharge, float); +DECLARE_SOA_COLUMN(NegSqCharge, negSqCharge, float); +DECLARE_SOA_COLUMN(TermPCharge, termPCharge, float); +DECLARE_SOA_COLUMN(TermNCharge, termNCharge, float); +DECLARE_SOA_COLUMN(PosNegCharge, posNegCharge, float); +DECLARE_SOA_COLUMN(Centrality, centrality, float); +} // namespace net_charge_gen + +DECLARE_SOA_TABLE(NetCharge, "AOD", "NETChargefluct", + net_charge::PosCharge, + net_charge::NegCharge, + net_charge::PosSqCharge, + net_charge::NegSqCharge, + net_charge::TermPCharge, + net_charge::TermNCharge, + net_charge::PosNegCharge, + net_charge::Centrality); + +DECLARE_SOA_TABLE(NetChargeGen, "AOD", "NETfluctGen", + net_charge_gen::PosCharge, + net_charge_gen::NegCharge, + net_charge_gen::PosSqCharge, + net_charge_gen::NegSqCharge, + net_charge_gen::TermPCharge, + net_charge_gen::TermNCharge, + net_charge_gen::PosNegCharge, + net_charge_gen::Centrality); -using MyTracks = soa::Join; +using MyCollisionsRun2 = soa::Join; +using MyCollisionRun2 = MyCollisionsRun2::iterator; +using MyCollisionsRun3 = soa::Join; +using MyCollisionRun3 = MyCollisionsRun3::iterator; +using MyTracks = soa::Join; using MyTrack = MyTracks::iterator; -} // namespace o2::aod + +using MyMCCollisionsRun2 = soa::Join; +using MyMCCollisionRun2 = MyMCCollisionsRun2::iterator; + +using MyMCCollisionsRun3 = soa::Join; +using MyMCCollisionRun3 = MyMCCollisionsRun3::iterator; + +using MyMCTracks = soa::Join; +using MyMCTrack = MyMCTracks::iterator; +} // namespace aod +} // namespace o2 + +enum RunType { + kRun3 = 0, + kRun2 +}; struct NetchargeFluctuations { - HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + Produces netCharge; + Produces netChargeGen; + Service pdgService; + + HistogramRegistry histogramRegistry{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + + // Configurables + Configurable vertexZcut{"vertexZcut", 10.f, "Vertex Z"}; + Configurable etaCut{"etaCut", 0.8, "Eta cut"}; + Configurable ptMinCut{"ptMinCut", 0.2, "Pt min cut"}; + Configurable ptMaxCut{"ptMaxCut", 5.0, "Pt max cut"}; + Configurable dcaXYCut{"dcaXYCut", 0.12, "DCA XY cut"}; + Configurable dcaZCut{"dcaZCut", 0.3, "DCA Z cut"}; + Configurable tpcCrossCut{"tpcCrossCut", 70, "TPC crossrows cut"}; + Configurable itsChiCut{"itsChiCut", 70, "ITS chi2 cluster cut"}; + Configurable tpcChiCut{"tpcChiCut", 70, "TPC chi2 cluster cut"}; + + // Event selections + Configurable cSel8Trig{"cSel8Trig", true, "Sel8 (T0A + T0C) Selection Run3"}; // sel8 + Configurable cInt7Trig{"cInt7Trig", true, "kINT7 MB Trigger"}; // kINT7 + Configurable cSel7Trig{"cSel7Trig", true, "Sel7 (V0A + V0C) Selection Run2"}; // sel7 + Configurable cTFBorder{"cTFBorder", false, "Timeframe Border Selection"}; // pileup + Configurable cNoItsROBorder{"cNoItsROBorder", false, "No ITSRO Border Cut"}; // pileup + Configurable cItsTpcVtx{"cItsTpcVtx", false, "ITS+TPC Vertex Selection"}; // pileup + Configurable cPileupReject{"cPileupReject", false, "Pileup rejection"}; // pileup + Configurable cZVtxTimeDiff{"cZVtxTimeDiff", false, "z-vtx time diff selection"}; // pileup + Configurable cIsGoodITSLayers{"cIsGoodITSLayers", false, "Good ITS Layers All"}; // pileup + + // Initialization + float cent = 0.; + float mult = 0.; void init(o2::framework::InitContext&) { - AxisSpec vtxZAxis = {100, -20, 20, "Z (cm)"}; - AxisSpec dcaAxis = {1000, -100, 100, "DCA_{xy} (cm)"}; - AxisSpec dcazAxis = {1000, -100, 100, "DCA_{z} (cm)"}; - AxisSpec ptAxis = {40, 0.0, 4.0, "#it{p}_{T} (GeV/#it{c})"}; - AxisSpec etaAxis = {30, -1.5, 1.5, "#eta"}; - AxisSpec centAxis = {100, 0., 100., "centrality"}; - AxisSpec multAxis = {2000, 0., 2000., "multiplicity"}; - - histos.add("hVertexZ_bef", "", kTH1F, {vtxZAxis}); - histos.add("hVertexZ_aft", "", kTH1F, {vtxZAxis}); - histos.add("hVertexZ_aft_sel", "", kTH1D, {vtxZAxis}); - histos.add("hDCAxy_bef", "", kTH1D, {dcaAxis}); - histos.add("hDCAxy_aft", "", kTH1D, {dcaAxis}); - histos.add("hDCAz_bef", "", kTH1D, {dcazAxis}); - histos.add("hDCAz_aft", "", kTH1D, {dcazAxis}); - histos.add("hCentrality", "", kTH1D, {centAxis}); - histos.add("hMultiplicity", "", kTH1D, {multAxis}); - histos.add("hEta", "", kTH1F, {etaAxis}); - histos.add("hPt", "", kTH1F, {ptAxis}); + const AxisSpec vtxzAxis = {80, -20, 20, "V_{Z} (cm)"}; + const AxisSpec dcaAxis = {250, -0.5, 0.5, "DCA_{xy} (cm)"}; + const AxisSpec dcazAxis = {250, -0.5, 0.5, "DCA_{z} (cm)"}; + const AxisSpec ptAxis = {70, 0.0, 7.0, "#it{p}_{T} (GeV/#it{c})"}; + const AxisSpec etaAxis = {20, -1., 1., "#eta"}; + const AxisSpec centAxis = {100, 0., 100., "centrality"}; + const AxisSpec multAxis = {200, 0., 10000., "FT0M Amplitude"}; + const AxisSpec tpcChiAxis = {140, 0., 7., "Chi2"}; + const AxisSpec itsChiAxis = {80, 0., 40., "Chi2"}; + const AxisSpec crossedRowAxis = {160, 0., 160., "TPC Crossed rows"}; + const AxisSpec eventsAxis = {10, 0, 10, ""}; + const AxisSpec signAxis = {20, -10, 10, ""}; + + histogramRegistry.add("hVtxZ_before", "", kTH1F, {vtxzAxis}); + histogramRegistry.add("hDcaXY_before", "", kTH1F, {dcaAxis}); + histogramRegistry.add("hDcaZ_before", "", kTH1F, {dcazAxis}); + histogramRegistry.add("hTPCchi2perCluster_before", "", kTH1D, {tpcChiAxis}); + histogramRegistry.add("hITSchi2perCluster_before", "", kTH1D, {itsChiAxis}); + histogramRegistry.add("hTPCCrossedrows_before", "", kTH1D, {crossedRowAxis}); + histogramRegistry.add("hPtDcaXY_before", "", kTH2D, {ptAxis, dcaAxis}); + histogramRegistry.add("hPtDcaZ_before", "", kTH2D, {ptAxis, dcazAxis}); + histogramRegistry.add("hVtxZ_after", "", kTH1F, {vtxzAxis}); + histogramRegistry.add("hDcaXY_after", "", kTH1F, {dcaAxis}); + histogramRegistry.add("hDcaZ_after", "", kTH1F, {dcazAxis}); + histogramRegistry.add("hTPCchi2perCluster_after", "", kTH1D, {tpcChiAxis}); + histogramRegistry.add("hITSchi2perCluster_after", "", kTH1D, {itsChiAxis}); + histogramRegistry.add("hTPCCrossedrows_after", "", kTH1D, {crossedRowAxis}); + histogramRegistry.add("hPtDcaXY_after", "", kTH2D, {ptAxis, dcaAxis}); + histogramRegistry.add("hPtDcaZ_after", "", kTH2D, {ptAxis, dcazAxis}); + histogramRegistry.add("hEta", "", kTH1F, {etaAxis}); + histogramRegistry.add("hPt", "", kTH1F, {ptAxis}); + histogramRegistry.add("hCentrality", "", kTH1F, {centAxis}); + histogramRegistry.add("hMultiplicity", "", kTH1F, {multAxis}); + histogramRegistry.add("rec_hVtxZ_before", "", kTH1F, {vtxzAxis}); + histogramRegistry.add("gen_hVtxZ_before", "", kTH1F, {vtxzAxis}); + histogramRegistry.add("rec_hDcaXY_before", "", kTH1D, {dcaAxis}); + histogramRegistry.add("rec_hDcaZ_before", "", kTH1D, {dcazAxis}); + histogramRegistry.add("rec_hTPCchi2perCluster_before", "TPC #Chi^{2}/Cluster", kTH1D, {tpcChiAxis}); + histogramRegistry.add("rec_hITSchi2perCluster_before", "ITS #Chi^{2}/Cluster", kTH1D, {itsChiAxis}); + histogramRegistry.add("rec_hTPCCrossedrows_before", "Crossed TPC rows", kTH1D, {crossedRowAxis}); + histogramRegistry.add("rec_hVtxZ_after", "", kTH1F, {vtxzAxis}); + histogramRegistry.add("gen_hVtxZ_after", "", kTH1F, {vtxzAxis}); + histogramRegistry.add("rec_hDcaXY_after", "", kTH1D, {dcaAxis}); + histogramRegistry.add("rec_hDcaZ_after", "", kTH1D, {dcazAxis}); + histogramRegistry.add("rec_hTPCchi2perCluster_after", "TPC #Chi^{2}/Cluster", kTH1D, {tpcChiAxis}); + histogramRegistry.add("rec_hITSchi2perCluster_after", "ITS #Chi^{2}/Cluster", kTH1D, {itsChiAxis}); + histogramRegistry.add("rec_hTPCCrossedrows_after", "Crossed TPC rows", kTH1D, {crossedRowAxis}); + histogramRegistry.add("gen_hEta", "", kTH1F, {etaAxis}); + histogramRegistry.add("rec_hEta", "", kTH1F, {etaAxis}); + histogramRegistry.add("gen_hSign", "", kTH1F, {signAxis}); + histogramRegistry.add("gen_hPt", "", kTH1F, {ptAxis}); + histogramRegistry.add("rec_hPt", "", kTH1F, {ptAxis}); + histogramRegistry.add("rec_hPtDcaXY_after", "hPtDCAxy", kTH2D, {ptAxis, dcaAxis}); + histogramRegistry.add("rec_hPtDcaZ_after", "hPtDCAz", kTH2D, {ptAxis, dcazAxis}); + histogramRegistry.add("rec_hCentrality", "", kTH1D, {centAxis}); + histogramRegistry.add("gen_hCentrality", "", kTH1D, {centAxis}); + histogramRegistry.add("rec_hMultiplicity", "", kTH1D, {multAxis}); + histogramRegistry.add("gen_hMultiplicity", "", kTH1D, {multAxis}); } - void process(aod::MyCollision const& coll, aod::MyTracks const& inputTracks) + template + bool selCollision(C const& coll) { - histos.fill(HIST("hVertexZ_bef"), coll.posZ()); + if (std::abs(coll.posZ()) > vertexZcut) { + return false; + } // Reject the collisions with large vertex-z - if (std::fabs(coll.posZ()) > 10.f) { - return; + if constexpr (run == kRun3) { + + if (cSel8Trig && !coll.sel8()) { + return false; + } // require min bias trigger + cent = coll.centFT0M(); // centrality for run3 + mult = coll.multFT0M(); // multiplicity for run3 + } else { + if (cInt7Trig && !coll.alias_bit(kINT7)) { + return false; + } + if (cSel7Trig && !coll.sel7()) { + return false; + } + cent = coll.centRun2V0M(); // centrality for run2 + mult = coll.multFV0M(); // multiplicity for run2 + } + + if (cNoItsROBorder && !coll.selection_bit(aod::evsel::kNoITSROFrameBorder)) { + return false; + } + + if (cTFBorder && !coll.selection_bit(aod::evsel::kNoTimeFrameBorder)) { + return false; + } + + if (cPileupReject && !coll.selection_bit(aod::evsel::kNoSameBunchPileup)) { + return false; + } + + if (cZVtxTimeDiff && !coll.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { + return false; + } + + if (cItsTpcVtx && !coll.selection_bit(aod::evsel::kIsVertexITSTPC)) { + return false; + } + + return true; // if all checks pass, accept the collision + } + + template + bool selTrack(T const& track) + { + if (!track.isGlobalTrack()) { + return false; + } // accept only global tracks + + if (std::fabs(track.dcaXY()) > dcaXYCut) { + return false; + } + + if (std::fabs(track.dcaZ()) > dcaZCut) { + return false; } - histos.fill(HIST("hVertexZ_aft"), coll.posZ()); - if (!coll.sel7()) { + if (std::fabs(track.eta()) >= etaCut) { + return false; + } + + if (track.pt() <= ptMinCut || track.pt() >= ptMaxCut) { + return false; + } + + if (track.tpcNClsCrossedRows() < tpcCrossCut) { + return false; + } + + if (track.itsChi2NCl() > itsChiCut) { + return false; + } + + if (track.tpcChi2NCl() > tpcChiCut) { + return false; + } + + return true; // if all checks pass, accept the collision + } + + template + void calculation(C const& coll, T const& tracks) + { + histogramRegistry.fill(HIST("hVtxZ_before"), coll.posZ()); + + if (!selCollision(coll)) { return; } - histos.fill(HIST("hVertexZ_aft_sel"), coll.posZ()); - histos.fill(HIST("hCentrality"), coll.centRun2V0M()); - histos.fill(HIST("hMultiplicity"), coll.multFV0M()); - for (auto const& track : inputTracks) { - if (std::fabs(track.eta()) > 0.8) + histogramRegistry.fill(HIST("hVtxZ_after"), coll.posZ()); + histogramRegistry.fill(HIST("hCentrality"), cent); + histogramRegistry.fill(HIST("hMultiplicity"), mult); + + int fpos = 0, fneg = 0, posneg = 0, termn = 0, termp = 0; + + for (const auto& track : tracks) { + histogramRegistry.fill(HIST("hTPCchi2perCluster_before"), track.tpcChi2NCl()); + histogramRegistry.fill(HIST("hITSchi2perCluster_before"), track.itsChi2NCl()); + histogramRegistry.fill(HIST("hTPCCrossedrows_before"), track.tpcNClsCrossedRows()); + histogramRegistry.fill(HIST("hDcaXY_before"), track.dcaXY()); + histogramRegistry.fill(HIST("hDcaZ_before"), track.dcaZ()); + histogramRegistry.fill(HIST("hPtDcaXY_before"), track.pt(), track.dcaXY()); + histogramRegistry.fill(HIST("hPtDcaZ_before"), track.pt(), track.dcaZ()); + + if (!selTrack(track)) { continue; - if (!(track.pt() > 0.2 && track.pt() < 2.)) + } + if (track.sign() == 0) continue; + histogramRegistry.fill(HIST("hDcaXY_after"), track.dcaXY()); + histogramRegistry.fill(HIST("hDcaZ_after"), track.dcaZ()); + histogramRegistry.fill(HIST("hPt"), track.pt()); + histogramRegistry.fill(HIST("hEta"), track.eta()); + histogramRegistry.fill(HIST("hPtDcaXY_after"), track.pt(), track.dcaXY()); + histogramRegistry.fill(HIST("hPtDcaZ_after"), track.pt(), track.dcaZ()); + histogramRegistry.fill(HIST("hTPCCrossedrows_after"), track.tpcNClsCrossedRows()); + histogramRegistry.fill(HIST("hTPCchi2perCluster_after"), track.tpcChi2NCl()); + histogramRegistry.fill(HIST("hITSchi2perCluster_after"), track.itsChi2NCl()); + + if (track.sign() == 1) { + fpos += 1; + termp = fpos * (fpos - 1); + } + + if (track.sign() == -1) { + fneg += 1; + termn = fneg * (fneg - 1); + } - histos.fill(HIST("hDCAxy_bef"), track.dcaXY()); - histos.fill(HIST("hDCAz_bef"), track.dcaZ()); + posneg = fpos * fneg; + netCharge(fpos, fneg, fpos * fpos, fneg * fneg, termp, termn, posneg, cent); + } // tracks + + return; + } + + template + void histosMcRecoGen(C const& coll, T const& inputTracks, M const& mcCollisions, P const& mcParticles) + { + (void)mcCollisions; + if (!coll.has_mcCollision()) { + return; + } + + histogramRegistry.fill(HIST("gen_hVtxZ_before"), coll.mcCollision().posZ()); + histogramRegistry.fill(HIST("rec_hVtxZ_before"), coll.posZ()); + + if (cNoItsROBorder && !coll.selection_bit(aod::evsel::kNoITSROFrameBorder)) { + return; + } + if (cTFBorder && !coll.selection_bit(aod::evsel::kNoTimeFrameBorder)) { + return; + } + if (cPileupReject && !coll.selection_bit(aod::evsel::kNoSameBunchPileup)) { + return; + } + if (cZVtxTimeDiff && !coll.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { + return; + } + if (cItsTpcVtx && !coll.selection_bit(aod::evsel::kIsVertexITSTPC)) { + return; + } + if (std::abs(coll.posZ()) > vertexZcut) { + return; + } + + if constexpr (run == kRun3) { + if (cSel8Trig && !coll.sel8()) { + return; + } + + cent = coll.centFT0M(); // centrality for run3 + mult = coll.multFT0M(); + } else { + if (cSel7Trig && !coll.sel7()) { + return; + } + + cent = coll.centRun2V0M(); // centrality for run2 + mult = coll.multFV0M(); // multiplicity for run2 + } + + histogramRegistry.fill(HIST("rec_hVtxZ_after"), coll.posZ()); + histogramRegistry.fill(HIST("rec_hCentrality"), cent); + histogramRegistry.fill(HIST("rec_hMultiplicity"), mult); + + int posRec = 0, negRec = 0, posNegRec = 0, termNRec = 0, termPRec = 0; + int posGen = 0, negGen = 0, posNegGen = 0, termNGen = 0, termPGen = 0; + + const auto& mccolgen = coll.template mcCollision_as(); + if (std::abs(mccolgen.posZ()) > vertexZcut) { + return; + } + + const auto& mcpartgen = mcParticles.sliceByCached(aod::mcparticle::mcCollisionId, mccolgen.globalIndex(), cache); + histogramRegistry.fill(HIST("gen_hVtxZ_after"), mccolgen.posZ()); + + for (const auto& track : inputTracks) { if (!track.isGlobalTrack()) continue; + if (std::fabs(track.dcaXY()) > dcaXYCut) + continue; + if (std::fabs(track.dcaZ()) > dcaZCut) + continue; + if (std::fabs(track.eta()) > etaCut) + continue; + if ((track.pt() <= ptMinCut) || (track.pt() >= ptMaxCut)) + continue; + if (track.sign() == 0) { + continue; + } - histos.fill(HIST("hDCAxy_aft"), track.dcaXY()); - histos.fill(HIST("hDCAz_aft"), track.dcaZ()); - histos.fill(HIST("hPt"), track.pt()); - histos.fill(HIST("hEta"), track.eta()); - } + histogramRegistry.fill(HIST("rec_hPt"), track.pt()); + histogramRegistry.fill(HIST("rec_hEta"), track.eta()); + + if (track.sign() == 1) { + posRec += 1; + termPRec = posRec * (posRec - 1); + } + + if (track.sign() == -1) { + negRec += 1; + termNRec = negRec * (negRec - 1); + } + + posNegRec = posRec * negRec; + + netCharge(posRec, negRec, posRec * posRec, negRec * negRec, + termPRec, termNRec, posNegRec, cent); + } // loop over inputTracks (reco) + + for (const auto& mcpart : mcpartgen) { + if (!mcpart.isPhysicalPrimary()) { + continue; + } + int pid = mcpart.pdgCode(); + auto sign = 0; + auto* pd = pdgService->GetParticle(pid); + if (pd != nullptr) { + sign = pd->Charge() / 3.; + } + if (sign == 0) { + continue; + } + // auto pdgServicecode = mcpart.pdgCode(); + if (std::abs(pid) != kElectron && std::abs(pid) != kMuonMinus && std::abs(pid) != kPiPlus && std::abs(pid) != kKPlus && std::abs(pid) != kProton) { + continue; + } + + if (std::fabs(mcpart.eta()) > etaCut) + continue; + if ((mcpart.pt() <= ptMinCut) || (mcpart.pt() >= ptMaxCut)) + continue; + histogramRegistry.fill(HIST("gen_hPt"), mcpart.pt()); + histogramRegistry.fill(HIST("gen_hEta"), mcpart.eta()); + histogramRegistry.fill(HIST("gen_hSign"), sign); + + if (sign == 1) { + posGen += 1; + termPGen = posGen * (posGen - 1); + } + + if (sign == -1) { + negGen += 1; + termNGen = negGen * (negGen - 1); + } + + posNegGen = posGen * negGen; + + netChargeGen(posGen, negGen, posGen * posGen, negGen * negGen, + termPGen, termNGen, posNegGen, cent); + + } // particle + } // void + + SliceCache cache; + Preslice mcTrack = o2::aod::mcparticle::mcCollisionId; + + void processDataRun3(aod::MyCollisionRun3 const& coll, aod::MyTracks const& tracks) + { + calculation(coll, tracks); } -}; + + PROCESS_SWITCH(NetchargeFluctuations, processDataRun3, "Process for Run3 DATA", false); + + void processDataRun2(aod::MyCollisionRun2 const& coll, aod::MyTracks const& tracks) + { + calculation(coll, tracks); + } + + PROCESS_SWITCH(NetchargeFluctuations, processDataRun2, "Process for Run2 DATA", false); + + void processMcRun3(aod::MyMCCollisionRun3 const& coll, aod::MyMCTracks const& inputTracks, + aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) + { + histosMcRecoGen(coll, inputTracks, mcCollisions, mcParticles); + } + + PROCESS_SWITCH(NetchargeFluctuations, processMcRun3, "Process reconstructed", true); + + void processMcRun2(aod::MyMCCollisionRun2 const& coll, aod::MyMCTracks const& inputTracks, + aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) + { + histosMcRecoGen(coll, inputTracks, mcCollisions, mcParticles); + } + + PROCESS_SWITCH(NetchargeFluctuations, processMcRun2, "Process reconstructed", false); + +}; // struct + +struct NetchargeAnalysis { + Configurable cfSubSample{"cfSubSample", 30, "Number of subsamples"}; + HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject}; + std::vector>> net; + std::vector>> subSample; + std::vector>> genSubSample; + TRandom3* fRndm = new TRandom3(0); + + void init(o2::framework::InitContext&) + { + std::vector centBinning = {0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100}; + AxisSpec centAxis = {centBinning, "centrality"}; + + registry.add("data/pos_vs_cent", "", {HistType::kTProfile, {centAxis}}); + registry.add("data/neg_vs_cent", "", {HistType::kTProfile, {centAxis}}); + registry.add("data/termp_vs_cent", "", {HistType::kTProfile, {centAxis}}); + registry.add("data/termn_vs_cent", "", {HistType::kTProfile, {centAxis}}); + registry.add("data/pos_sq_vs_cent", "", {HistType::kTProfile, {centAxis}}); + registry.add("data/neg_sq_vs_cent", "", {HistType::kTProfile, {centAxis}}); + registry.add("data/posneg_vs_cent", "", {HistType::kTProfile, {centAxis}}); + + registry.add("gen/pos_vs_cent", "", {HistType::kTProfile, {centAxis}}); + registry.add("gen/neg_vs_cent", "", {HistType::kTProfile, {centAxis}}); + registry.add("gen/termp_vs_cent", "", {HistType::kTProfile, {centAxis}}); + registry.add("gen/termn_vs_cent", "", {HistType::kTProfile, {centAxis}}); + registry.add("gen/pos_sq_vs_cent", "", {HistType::kTProfile, {centAxis}}); + registry.add("gen/neg_sq_vs_cent", "", {HistType::kTProfile, {centAxis}}); + registry.add("gen/posneg_vs_cent", "", {HistType::kTProfile, {centAxis}}); + + subSample.resize(cfSubSample); + genSubSample.resize(cfSubSample); + + for (int i = 0; i < cfSubSample; ++i) { + subSample[i].resize(7); + genSubSample[i].resize(7); + + subSample[i][0] = std::get>(registry.add(Form("data/subSample_%d/pos_vs_cent", i), "", {HistType::kTProfile, {centAxis}})); + subSample[i][1] = std::get>(registry.add(Form("data/subSample_%d/neg_vs_cent", i), "", {HistType::kTProfile, {centAxis}})); + subSample[i][2] = std::get>(registry.add(Form("data/subSample_%d/termp_vs_cent", i), "", {HistType::kTProfile, {centAxis}})); + subSample[i][3] = std::get>(registry.add(Form("data/subSample_%d/termn_vs_cent", i), "", {HistType::kTProfile, {centAxis}})); + subSample[i][4] = std::get>(registry.add(Form("data/subSample_%d/pos_sq_vs_cent", i), "", {HistType::kTProfile, {centAxis}})); + subSample[i][5] = std::get>(registry.add(Form("data/subSample_%d/neg_sq_vs_cent", i), "", {HistType::kTProfile, {centAxis}})); + subSample[i][6] = std::get>(registry.add(Form("data/subSample_%d/posneg_vs_cent", i), "", {HistType::kTProfile, {centAxis}})); + + genSubSample[i][0] = std::get>(registry.add(Form("gen/genSubSample_%d/pos_vs_cent", i), "", {HistType::kTProfile, {centAxis}})); + genSubSample[i][1] = std::get>(registry.add(Form("gen/genSubSample_%d/neg_vs_cent", i), "", {HistType::kTProfile, {centAxis}})); + genSubSample[i][2] = std::get>(registry.add(Form("gen/genSubSample_%d/termp_vs_cent", i), "", {HistType::kTProfile, {centAxis}})); + genSubSample[i][3] = std::get>(registry.add(Form("gen/genSubSample_%d/termn_vs_cent", i), "", {HistType::kTProfile, {centAxis}})); + genSubSample[i][4] = std::get>(registry.add(Form("gen/genSubSample_%d/pos_sq_vs_cent", i), "", {HistType::kTProfile, {centAxis}})); + genSubSample[i][5] = std::get>(registry.add(Form("gen/genSubSample_%d/neg_sq_vs_cent", i), "", {HistType::kTProfile, {centAxis}})); + genSubSample[i][6] = std::get>(registry.add(Form("gen/genSubSample_%d/posneg_vs_cent", i), "", {HistType::kTProfile, {centAxis}})); + } + + } // void + + void processData(aod::NetCharge::iterator const& event_netcharge) + { + registry.get(HIST("data/pos_vs_cent"))->Fill(event_netcharge.centrality(), event_netcharge.posCharge()); + registry.get(HIST("data/neg_vs_cent"))->Fill(event_netcharge.centrality(), event_netcharge.negCharge()); + registry.get(HIST("data/termp_vs_cent"))->Fill(event_netcharge.centrality(), event_netcharge.termPCharge()); + registry.get(HIST("data/termn_vs_cent"))->Fill(event_netcharge.centrality(), event_netcharge.termNCharge()); + registry.get(HIST("data/pos_sq_vs_cent"))->Fill(event_netcharge.centrality(), event_netcharge.posSqCharge()); + registry.get(HIST("data/neg_sq_vs_cent"))->Fill(event_netcharge.centrality(), event_netcharge.negSqCharge()); + registry.get(HIST("data/posneg_vs_cent"))->Fill(event_netcharge.centrality(), event_netcharge.posNegCharge()); + + int sampleIndex = static_cast(cfSubSample * fRndm->Rndm()); + subSample[sampleIndex][0]->Fill(event_netcharge.centrality(), event_netcharge.posCharge()); + subSample[sampleIndex][1]->Fill(event_netcharge.centrality(), event_netcharge.negCharge()); + subSample[sampleIndex][2]->Fill(event_netcharge.centrality(), event_netcharge.termPCharge()); + subSample[sampleIndex][3]->Fill(event_netcharge.centrality(), event_netcharge.termNCharge()); + subSample[sampleIndex][4]->Fill(event_netcharge.centrality(), event_netcharge.posSqCharge()); + subSample[sampleIndex][5]->Fill(event_netcharge.centrality(), event_netcharge.negSqCharge()); + subSample[sampleIndex][6]->Fill(event_netcharge.centrality(), event_netcharge.posNegCharge()); + } // void + PROCESS_SWITCH(NetchargeAnalysis, processData, "Process reconstructed and Data", true); + + void processGen(aod::NetChargeGen::iterator const& event_netcharge) + { + registry.get(HIST("gen/pos_vs_cent"))->Fill(event_netcharge.centrality(), event_netcharge.posCharge()); + registry.get(HIST("gen/neg_vs_cent"))->Fill(event_netcharge.centrality(), event_netcharge.negCharge()); + registry.get(HIST("gen/termp_vs_cent"))->Fill(event_netcharge.centrality(), event_netcharge.termPCharge()); + registry.get(HIST("gen/termn_vs_cent"))->Fill(event_netcharge.centrality(), event_netcharge.termNCharge()); + registry.get(HIST("gen/pos_sq_vs_cent"))->Fill(event_netcharge.centrality(), event_netcharge.posSqCharge()); + registry.get(HIST("gen/neg_sq_vs_cent"))->Fill(event_netcharge.centrality(), event_netcharge.negSqCharge()); + registry.get(HIST("gen/posneg_vs_cent"))->Fill(event_netcharge.centrality(), event_netcharge.posNegCharge()); + + int sampleIndex = static_cast(cfSubSample * fRndm->Rndm()); + genSubSample[sampleIndex][0]->Fill(event_netcharge.centrality(), event_netcharge.posCharge()); + genSubSample[sampleIndex][1]->Fill(event_netcharge.centrality(), event_netcharge.negCharge()); + genSubSample[sampleIndex][2]->Fill(event_netcharge.centrality(), event_netcharge.termPCharge()); + genSubSample[sampleIndex][3]->Fill(event_netcharge.centrality(), event_netcharge.termNCharge()); + genSubSample[sampleIndex][4]->Fill(event_netcharge.centrality(), event_netcharge.posSqCharge()); + genSubSample[sampleIndex][5]->Fill(event_netcharge.centrality(), event_netcharge.negSqCharge()); + genSubSample[sampleIndex][6]->Fill(event_netcharge.centrality(), event_netcharge.posNegCharge()); + } // void + PROCESS_SWITCH(NetchargeAnalysis, processGen, "Process generated", true); + +}; // struct Netcharge_analysis + WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - WorkflowSpec workflow{adaptAnalysisTask(cfgc)}; - return workflow; + return WorkflowSpec{ + {adaptAnalysisTask(cfgc)}, + {adaptAnalysisTask(cfgc)} + + }; } From cee3e0496f2dba0ce29b2118922859a3fadd7c41 Mon Sep 17 00:00:00 2001 From: Fabio Colamaria Date: Sat, 7 Jun 2025 23:50:05 +0200 Subject: [PATCH 1548/1650] [ALICE3] Adding decay channel check for D efficiency evaluation in decay finder (#11492) Co-authored-by: fcolamar --- ALICE3/TableProducer/alice3-decayfinder.cxx | 36 +++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/ALICE3/TableProducer/alice3-decayfinder.cxx b/ALICE3/TableProducer/alice3-decayfinder.cxx index 83f1998bf38..2d12ea9ed14 100644 --- a/ALICE3/TableProducer/alice3-decayfinder.cxx +++ b/ALICE3/TableProducer/alice3-decayfinder.cxx @@ -267,6 +267,7 @@ struct alice3decayFinder { dmeson.mcTruth = 2; // D0bar } } + return true; } @@ -362,7 +363,9 @@ struct alice3decayFinder { if (doprocessFindDmesons) { histos.add("h2dGenD", "h2dGenD", kTH2F, {axisPt, axisEta}); + histos.add("h2dGenD_KpiOnly", "h2dGenD_KpiOnly", kTH2F, {axisPt, axisEta}); histos.add("h2dGenDbar", "h2dGenDbar", kTH2F, {axisPt, axisEta}); + histos.add("h2dGenDbar_KpiOnly", "h2dGenDbar_KpiOnly", kTH2F, {axisPt, axisEta}); histos.add("h3dRecD", "h3dRecD", kTH3F, {axisPt, axisEta, axisDMass}); histos.add("h3dRecDSig", "h3dRecDSig", kTH3F, {axisPt, axisEta, axisDMass}); histos.add("h3dRecDRefl", "h3dRecDRefl", kTH3F, {axisPt, axisEta, axisDMass}); @@ -471,11 +474,37 @@ struct alice3decayFinder { if (doprocessFindDmesons) { for (auto const& mcParticle : trueD) { histos.fill(HIST("h2dGenD"), mcParticle.pt(), mcParticle.eta()); - histos.fill(HIST("hDGenForEfficiency"), mcParticle.pt(), mcParticle.y()); // in common for D and Dbar + auto daughters = mcParticle.template daughters_as(); + if (daughters.size() != 2) + continue; + // int daugID[2]; + int daugPDG[2], i = 0; + for (const auto& dau : daughters) { + // daugID[i] = dau.globalIndex(); + daugPDG[i] = dau.pdgCode(); + i++; + } + if ((std::fabs(daugPDG[0]) == 321 && std::fabs(daugPDG[1]) == 211) || (std::fabs(daugPDG[0]) == 211 && std::fabs(daugPDG[1]) == 321)) { + histos.fill(HIST("h2dGenD_KpiOnly"), mcParticle.pt(), mcParticle.eta()); + histos.fill(HIST("hDGenForEfficiency"), mcParticle.pt(), mcParticle.y()); // in common for D and Dbar + } } for (auto const& mcParticle : trueDbar) { histos.fill(HIST("h2dGenDbar"), mcParticle.pt(), mcParticle.eta()); - histos.fill(HIST("hDGenForEfficiency"), mcParticle.pt(), mcParticle.y()); // in common for D and Dbar + auto daughters = mcParticle.template daughters_as(); + if (daughters.size() != 2) + continue; + // int daugID[2]; + int daugPDG[2], i = 0; + for (const auto& dau : daughters) { + // daugID[i] = dau.globalIndex(); + daugPDG[i] = dau.pdgCode(); + i++; + } + if ((std::fabs(daugPDG[0]) == 321 && std::fabs(daugPDG[1]) == 211) || (std::fabs(daugPDG[0]) == 211 && std::fabs(daugPDG[1]) == 321)) { + histos.fill(HIST("h2dGenDbar_KpiOnly"), mcParticle.pt(), mcParticle.eta()); + histos.fill(HIST("hDGenForEfficiency"), mcParticle.pt(), mcParticle.y()); // in common for D and Dbar + } } } if (doprocessFindLcBaryons) { @@ -509,6 +538,7 @@ struct alice3decayFinder { // D0 mesons for (auto const& posTrackRow : tracksPiPlusFromDgrouped) { for (auto const& negTrackRow : tracksKaMinusFromDgrouped) { + if (mcSameMotherCheck && !checkSameMother(posTrackRow, negTrackRow)) continue; if (!buildDecayCandidateTwoBody(posTrackRow, negTrackRow, o2::constants::physics::MassPionCharged, o2::constants::physics::MassKaonCharged, mcParticles)) @@ -651,9 +681,11 @@ struct alice3decayFinder { mcTruthOutcome(dmeson.mcTruth); } } + // D0bar mesons for (auto const& posTrackRow : tracksKaPlusFromDgrouped) { for (auto const& negTrackRow : tracksPiMinusFromDgrouped) { + if (mcSameMotherCheck && !checkSameMother(posTrackRow, negTrackRow)) continue; if (!buildDecayCandidateTwoBody(posTrackRow, negTrackRow, o2::constants::physics::MassKaonCharged, o2::constants::physics::MassPionCharged, mcParticles)) From 619fe61c053dad90b597668cf2b2198d14fdbf0c Mon Sep 17 00:00:00 2001 From: Hirak Koley Date: Sun, 8 Jun 2025 10:55:28 +0530 Subject: [PATCH 1549/1650] [PWGLF] Initial commit of lstaranalysis task (#11506) --- PWGLF/Tasks/Resonances/CMakeLists.txt | 5 + PWGLF/Tasks/Resonances/lstaranalysis.cxx | 1087 ++++++++++++++++++++++ 2 files changed, 1092 insertions(+) create mode 100644 PWGLF/Tasks/Resonances/lstaranalysis.cxx diff --git a/PWGLF/Tasks/Resonances/CMakeLists.txt b/PWGLF/Tasks/Resonances/CMakeLists.txt index aec43e97f65..4ba33fce401 100644 --- a/PWGLF/Tasks/Resonances/CMakeLists.txt +++ b/PWGLF/Tasks/Resonances/CMakeLists.txt @@ -44,6 +44,11 @@ o2physics_add_dpl_workflow(lambda1520analysis PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(lstaranalysis + SOURCES lstaranalysis.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(k1analysis SOURCES k1analysis.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore diff --git a/PWGLF/Tasks/Resonances/lstaranalysis.cxx b/PWGLF/Tasks/Resonances/lstaranalysis.cxx new file mode 100644 index 00000000000..816761609b6 --- /dev/null +++ b/PWGLF/Tasks/Resonances/lstaranalysis.cxx @@ -0,0 +1,1087 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file lstaranalysis.cxx +/// \brief This standalone task reconstructs track-track decay of lambda(1520) resonance candidate +/// \author Hirak Kumar Koley + +// 1. Own header (doesn't exist) + +// 2. C system headers (none) + +// 3. C++ system headers +#include + +// 4. Other includes: O2 framework, ROOT, etc. +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" + +#include + +#include "Framework/O2DatabasePDGPlugin.h" +#include "Framework/HistogramRegistry.h" + +#include "PWGLF/Utils/collisionCuts.h" + +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/PIDResponse.h" + +#include "TRandom.h" +#include "TVector3.h" +#include "Math/Vector4D.h" +#include "TPDGCode.h" + +using namespace o2; +using namespace o2::soa; +using namespace o2::aod; +using namespace o2::framework; +using namespace o2::constants::physics; + +using LorentzVectorPtEtaPhiMass = ROOT::Math::PtEtaPhiMVector; + +struct Lstaranalysis { + // Define slice per Resocollision + SliceCache cache; + Preslice perCollision = o2::aod::track::collisionId; + + using EventCandidates = soa::Join; + using TrackCandidates = soa::Join; + + using MCEventCandidates = soa::Join; + using MCTrackCandidates = soa::Join; + + HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + + Service ccdb; + Service pdg; + ccdb::CcdbApi ccdbApi; + + Configurable cfgURL{"cfgURL", "http://alice-ccdb.cern.ch", "Address of the CCDB to browse"}; + Configurable noLaterThan{"noLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "Latest acceptable timestamp of creation for the object"}; + + /// Event cuts + o2::analysis::CollisonCuts colCuts; + Configurable cfgEvtZvtx{"cfgEvtZvtx", 10.f, "Evt sel: Max. z-Vertex (cm)"}; + Configurable cfgEvtOccupancyInTimeRangeMax{"cfgEvtOccupancyInTimeRangeMax", -1, "Evt sel: maximum track occupancy"}; + Configurable cfgEvtOccupancyInTimeRangeMin{"cfgEvtOccupancyInTimeRangeMin", -1, "Evt sel: minimum track occupancy"}; + Configurable cfgEvtTriggerCheck{"cfgEvtTriggerCheck", false, "Evt sel: check for trigger"}; + Configurable cfgEvtOfflineCheck{"cfgEvtOfflineCheck", true, "Evt sel: check for offline selection"}; + Configurable cfgEvtTriggerTVXSel{"cfgEvtTriggerTVXSel", false, "Evt sel: triggerTVX selection (MB)"}; + Configurable cfgEvtTFBorderCut{"cfgEvtTFBorderCut", false, "Evt sel: apply TF border cut"}; + Configurable cfgEvtUseITSTPCvertex{"cfgEvtUseITSTPCvertex", false, "Evt sel: use at lease on ITS-TPC track for vertexing"}; + Configurable cfgEvtZvertexTimedifference{"cfgEvtZvertexTimedifference", false, "Evt sel: apply Z-vertex time difference"}; + Configurable cfgEvtPileupRejection{"cfgEvtPileupRejection", false, "Evt sel: apply pileup rejection"}; + Configurable cfgEvtNoITSROBorderCut{"cfgEvtNoITSROBorderCut", false, "Evt sel: apply NoITSRO border cut"}; + Configurable cfgEvtCollInTimeRangeStandard{"cfgEvtCollInTimeRangeStandard", false, "Evt sel: apply NoCollInTimeRangeStandard"}; + + Configurable cfgEventCentralityMin{"cfgEventCentralityMin", 0.0f, "Event sel: minimum centrality"}; + Configurable cfgEventCentralityMax{"cfgEventCentralityMax", 100.0f, "Event sel: maximum centrality"}; + + // Configurables + // Pre-selection Track cuts + Configurable cMinPtcut{"cMinPtcut", 0.15f, "Minimal pT for tracks"}; + Configurable cMinTPCNClsFound{"cMinTPCNClsFound", 120, "minimum TPCNClsFound value for good track"}; + + // DCA Selections + // DCAr to PV + Configurable cMaxDCArToPVcut{"cMaxDCArToPVcut", 0.1f, "Track DCAr cut to PV Maximum"}; + // DCAz to PV + Configurable cMaxDCAzToPVcut{"cMaxDCAzToPVcut", 0.1f, "Track DCAz cut to PV Maximum"}; + + // Track selections + Configurable cfgPrimaryTrack{"cfgPrimaryTrack", true, "Primary track selection"}; // kGoldenChi2 | kDCAxy | kDCAz + Configurable cfgGlobalWoDCATrack{"cfgGlobalWoDCATrack", true, "Global track selection without DCA"}; // kQualityTracks (kTrackType | kTPCNCls | kTPCCrossedRows | kTPCCrossedRowsOverNCls | kTPCChi2NDF | kTPCRefit | kITSNCls | kITSChi2NDF | kITSRefit | kITSHits) | kInAcceptanceTracks (kPtRange | kEtaRange) + Configurable cfgGlobalTrack{"cfgGlobalTrack", false, "Global track selection"}; // kGoldenChi2 | kDCAxy | kDCAz + Configurable cfgPVContributor{"cfgPVContributor", false, "PV contributor track selection"}; // PV Contriuibutor + Configurable cfgHasTOF{"cfgHasTOF", false, "Require TOF"}; + Configurable cfgUseTPCRefit{"cfgUseTPCRefit", false, "Require TPC Refit"}; + Configurable cfgUseITSRefit{"cfgUseITSRefit", false, "Require ITS Refit"}; + Configurable cTPCNClsFound{"cTPCNClsFound", false, "Switch to turn on/off TPCNClsFound cut"}; + Configurable cDCAr7SigCut{"cDCAr7SigCut", false, "Track DCAr 7 Sigma cut to PV Maximum"}; + + /// PID Selections + Configurable cByPassTOF{"cByPassTOF", false, "By pass TOF PID selection"}; // By pass TOF PID selection + Configurable cPIDcutType{"cPIDcutType", 2, "cPIDcutType = 1 for square cut, 2 for circular cut"}; // By pass TOF PID selection + + // Kaon + Configurable> kaonTPCPIDpTintv{"kaonTPCPIDpTintv", {0.5}, "pT intervals for Kaon TPC PID cuts"}; + Configurable> kaonTPCPIDcuts{"kaonTPCPIDcuts", {2}, "nSigma list for Kaon TPC PID cuts"}; + Configurable> kaonTOFPIDpTintv{"kaonTOFPIDpTintv", {999.}, "pT intervals for Kaon TOF PID cuts"}; + Configurable> kaonTOFPIDcuts{"kaonTOFPIDcuts", {2}, "nSigma list for Kaon TOF PID cuts"}; + Configurable> kaonTPCTOFCombinedpTintv{"kaonTPCTOFCombinedpTintv", {999.}, "pT intervals for Kaon TPC-TOF PID cuts"}; + Configurable> kaonTPCTOFCombinedPIDcuts{"kaonTPCTOFCombinedPIDcuts", {2}, "nSigma list for Kaon TPC-TOF PID cuts"}; + Configurable cMaxTPCnSigmaKaonVETO{"cMaxTPCnSigmaKaonVETO", 3.0, "TPC nSigma VETO cut for Kaon"}; // TPC + + // Proton + Configurable> protonTPCPIDpTintv{"protonTPCPIDpTintv", {0.9}, "pT intervals for Kaon TPC PID cuts"}; + Configurable> protonTPCPIDcuts{"protonTPCPIDcuts", {2}, "nSigma list for Kaon TPC PID cuts"}; + Configurable> protonTOFPIDpTintv{"protonTOFPIDpTintv", {999.}, "pT intervals for Kaon TOF PID cuts"}; + Configurable> protonTOFPIDcuts{"protonTOFPIDcuts", {2}, "nSigma list for Kaon TOF PID cuts"}; + Configurable> protonTPCTOFCombinedpTintv{"protonTPCTOFCombinedpTintv", {999.}, "pT intervals for Proton TPC-TOF PID cuts"}; + Configurable> protonTPCTOFCombinedPIDcuts{"protonTPCTOFCombinedPIDcuts", {2}, "nSigma list for Proton TPC-TOF PID cuts"}; + Configurable cMaxTPCnSigmaProtonVETO{"cMaxTPCnSigmaProtonVETO", 3.0, "TPC nSigma VETO cut for Proton"}; // TPC + + // Additional purity check + Configurable crejectPion{"crejectPion", false, "Switch to turn on/off pion contamination"}; + Configurable cApplyOpeningAngle{"cApplyOpeningAngle", false, "Kinematic Cuts for p-K pair opening angle"}; + Configurable cMinOpeningAngle{"cMinOpeningAngle", 1.4, "Maximum deltaEta between daughters"}; + Configurable cMaxOpeningAngle{"cMaxOpeningAngle", 2.4, "Maximum deltaPhi between daughters"}; + + /// Event Mixing + Configurable nEvtMixing{"nEvtMixing", 10, "Number of events to mix"}; + ConfigurableAxis cfgVtxBins{"cfgVtxBins", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; + ConfigurableAxis cfgMultBins{"cfgMultBins", {VARIABLE_WIDTH, 0.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f, 110.0f}, "Mixing bins - multiplicity"}; + + // Rotational background + Configurable isCalcRotBkg{"isCalcRotBkg", true, "Calculate rotational background"}; + Configurable rotationalcut{"rotationalcut", 10, "Cut value (Rotation angle pi - pi/cut and pi + pi/cut)"}; + Configurable cNofRotations{"cNofRotations", 3, "Number of random rotations in the rotational background"}; + + // MC selection cut + Configurable cZvertCutMC{"cZvertCutMC", 10.0, "MC Z-vertex cut"}; + Configurable cEtacutMC{"cEtacutMC", 0.5, "MC eta cut"}; + + // cuts on mother + Configurable cfgCutsOnMother{"cfgCutsOnMother", false, "Enable additional cuts on mother"}; + Configurable cMaxPtMotherCut{"cMaxPtMotherCut", 10.0, "Maximum pt of mother cut"}; + Configurable cMaxMinvMotherCut{"cMaxMinvMotherCut", 3.0, "Maximum Minv of mother cut"}; + Configurable cMaxDeltaEtaCut{"cMaxDeltaEtaCut", 0.7, "Maximum deltaEta between daughters"}; + Configurable cMaxDeltaPhiCut{"cMaxDeltaPhiCut", 1.5, "Maximum deltaPhi between daughters"}; + + // switches + Configurable cFillMultQA{"cFillMultQA", false, "Turn on/off additional QA plots"}; + Configurable cFilladditionalQAeventPlots{"cFilladditionalQAeventPlots", false, "Additional QA event plots"}; + Configurable cFilladditionalMEPlots{"cFilladditionalMEPlots", false, "Additional Mixed event plots"}; + Configurable cFilldeltaEtaPhiPlots{"cFilldeltaEtaPhiPlots", false, "Enamble additional cuts on daughters"}; + Configurable cFillinvmass1DPlots{"cFillinvmass1DPlots", false, "Invariant mass 1D"}; + + Configurable cfgCentEst{"cfgCentEst", 2, "Centrality estimator, 1: FT0C, 2: FT0M"}; + + TRandom* rn = new TRandom(); + + /// Figures + ConfigurableAxis binsPt{"binsPt", {VARIABLE_WIDTH, 0.0, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.1, 1.2, 1.25, 1.3, 1.4, 1.5, 1.6, 1.7, 1.75, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0, 3.1, 3.2, 3.3, 3.4, 3.6, 3.7, 3.8, 3.9, 4.0, 4.1, 4.2, 4.5, 4.6, 4.8, 4.9, 5.0, 5.5, 5.6, 6.0, 6.4, 6.5, 7.0, 7.2, 8.0, 9.0, 9.5, 9.6, 10.0, 11.0, 11.5, 12.0, 13.0, 14.0, 14.4, 15.0, 16.0, 18.0, 19.2, 20.}, "Binning of the pT axis"}; + ConfigurableAxis binsPtQA{"binsPtQA", {VARIABLE_WIDTH, 0.0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8, 5.0, 5.2, 5.4, 5.6, 5.8, 6.0, 6.2, 6.4, 6.6, 6.8, 7.0, 7.2, 7.4, 7.6, 7.8, 8.0, 8.2, 8.4, 8.6, 8.8, 9.0, 9.2, 9.4, 9.6, 9.8, 10.0, 10.2, 10.4, 10.6, 10.8, 11, 11.2, 11.4, 11.6, 11.8, 12, 12.2, 12.4, 12.6, 12.8, 13, 13.2, 13.4, 13.6, 13.8, 14, 14.2, 14.4, 14.6, 14.8, 15, 15.2, 15.4, 15.6, 15.8, 16, 16.2, 16.4, 16.6, 16.8, 17, 17.2, 17.4, 17.6, 17.8, 18, 18.2, 18.4, 18.6, 18.8, 19, 19.2, 19.4, 19.6, 19.8, 20}, "Binning of the pT axis"}; + ConfigurableAxis binsEta{"binsEta", {150, -1.5, 1.5}, ""}; + ConfigurableAxis binsMass{"binsMass", {70, 1.3, 2.0}, "Invariant Mass (GeV/#it{c}^2)"}; + ConfigurableAxis binsMult{"binsMult", {110, 0.0, 110.0}, "mult_{FT0M}"}; + ConfigurableAxis binsDCAz{"binsDCAz", {40, -0.2, 0.2}, ""}; + ConfigurableAxis binsDCAxy{"binsDCAxy", {40, -0.2, 0.2}, ""}; + ConfigurableAxis binsTPCXrows{"binsTPCXrows", {100, 60, 160}, ""}; + ConfigurableAxis binsnSigma{"binsnSigma", {130, -6.5, 6.5}, ""}; + ConfigurableAxis binsnTPCSignal{"binsnTPCSignal", {1000, 0, 1000}, ""}; + ConfigurableAxis binsEtaPhi{"binsEtaPhi", {350, -3.5, 3.5}, ""}; + + float centrality; + + void init(framework::InitContext&) + { + centrality = -999; + + colCuts.setCuts(cfgEvtZvtx, cfgEvtTriggerCheck, cfgEvtOfflineCheck, /*checkRun3*/ true, /*triggerTVXsel*/ false, cfgEvtOccupancyInTimeRangeMax, cfgEvtOccupancyInTimeRangeMin); + colCuts.init(&histos); + colCuts.setTriggerTVX(cfgEvtTriggerTVXSel); + colCuts.setApplyTFBorderCut(cfgEvtTFBorderCut); + colCuts.setApplyITSTPCvertex(cfgEvtUseITSTPCvertex); + colCuts.setApplyZvertexTimedifference(cfgEvtZvertexTimedifference); + colCuts.setApplyPileupRejection(cfgEvtPileupRejection); + colCuts.setApplyNoITSROBorderCut(cfgEvtNoITSROBorderCut); + colCuts.setApplyCollInTimeRangeStandard(cfgEvtCollInTimeRangeStandard); + + // axes + AxisSpec axisPt{binsPt, "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec axisPtQA{binsPtQA, "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec axisEta{binsEta, "#eta"}; + AxisSpec axisMassLambda1520{binsMass, "Invariant Mass (GeV/#it{c}^2)"}; + AxisSpec axisMult{binsMult, "mult_{V0M}"}; + AxisSpec axisDCAz{binsDCAz, "DCA_{z}"}; + AxisSpec axisDCAxy{binsDCAxy, "DCA_{XY}"}; + AxisSpec axisTPCXrow{binsTPCXrows, "#Xrows_{TPC}"}; + AxisSpec axisPIDQA{binsnSigma, "#sigma"}; + AxisSpec axisTPCSignal{binsnTPCSignal, ""}; + AxisSpec axisMClabel{5, -0.5, 5.5, "MC Label"}; + AxisSpec axisEtaPhi{binsEtaPhi, ""}; + AxisSpec axisPhi{350, -3.5, 3.5, "#Phi"}; + AxisSpec axisMultMix{cfgMultBins, "Multiplicity"}; + AxisSpec axisVtxMix{cfgVtxBins, "Vertex Z (cm)"}; + + if (cFilladditionalQAeventPlots) { + // event histograms + if (doprocessData) { + histos.add("TestME/hPairsCounterSameE", "tot n pairs sameE", HistType::kTH1F, {{1, 0.5f, 1.5f}}); + histos.add("QAevent/hEvtCounterSameE", "Number of analyzed Same Events", HistType::kTH1F, {{1, 0.5, 1.5}}); + histos.add("QAevent/hVertexZSameE", "Collision Vertex Z position", HistType::kTH1F, {{100, -15., 15.}}); + histos.add("QAevent/hMultiplicityPercentSameE", "Multiplicity percentile of collision", HistType::kTH1F, {{120, 0.0f, 120.0f}}); + histos.add("TestME/hCollisionIndexSameE", "coll index sameE", HistType::kTH1F, {{500, 0.0f, 500.0f}}); + histos.add("TestME/hnTrksSameE", "n tracks per event SameE", HistType::kTH1F, {{1000, 0.0f, 1000.0f}}); + } + // Test on Mixed event + if (doprocessME) { + + // Histograms for Mixed Event Pool characteristics + histos.add("QAevent/hMixPool_VtxZ", "Mixed Event Pool: Vertex Z;Vtx Z (cm);Counts", HistType::kTH1F, {axisVtxMix}); + histos.add("QAevent/hMixPool_Multiplicity", "Mixed Event Pool: Multiplicity;Multiplicity;Counts", HistType::kTH1F, {axisMultMix}); + histos.add("QAevent/hMixPool_VtxZ_vs_Multiplicity", "Mixed Event Pool: Vertex Z vs Multiplicity;Counts", HistType::kTH2F, {axisVtxMix, axisMultMix}); + + histos.add("TestME/hPairsCounterMixedE", "tot n pairs mixedE", HistType::kTH1F, {{1, 0.5f, 1.5f}}); + histos.add("QAevent/hEvtCounterMixedE", "Number of analyzed Mixed Events", HistType::kTH1F, {{1, 0.5, 1.5}}); + histos.add("QAevent/hVertexZMixedE", "Collision Vertex Z position", HistType::kTH1F, {{100, -15., 15.}}); + histos.add("QAevent/hMultiplicityPercentMixedE", "Multiplicity percentile of collision", HistType::kTH1F, {{120, 0.0f, 120.0f}}); + histos.add("TestME/hCollisionIndexMixedE", "coll index mixedE", HistType::kTH1F, {{500, 0.0f, 500.0f}}); + histos.add("TestME/hnTrksMixedE", "n tracks per event MixedE", HistType::kTH1F, {{1000, 0.0f, 1000.0f}}); + } + } + + if (doprocessData) { + // Track QA before cuts + // --- Track + histos.add("QA/QAbefore/Track/TOF_TPC_Map_ka_all", "TOF + TPC Combined PID for Kaon;#sigma_{TOF}^{Kaon};#sigma_{TPC}^{Kaon}", {HistType::kTHnSparseF, {axisPIDQA, axisPIDQA}}); + histos.add("QA/QAbefore/Track/TOF_Nsigma_ka_all", "TOF NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Kaon};", {HistType::kTHnSparseF, {axisMult, axisPt, axisPIDQA}}); + histos.add("QA/QAbefore/Track/TPC_Nsigma_ka_all", "TPC NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Kaon};", {HistType::kTHnSparseF, {axisMult, axisPt, axisPIDQA}}); + histos.add("QA/QAbefore/Track/TPConly_Nsigma_ka", "TPC NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Kaon};", {HistType::kTHnSparseF, {axisPt, axisPIDQA}}); + histos.add("QA/QAbefore/Track/TOF_TPC_Map_pr_all", "TOF + TPC Combined PID for Proton;#sigma_{TOF}^{Proton};#sigma_{TPC}^{Proton}", {HistType::kTHnSparseF, {axisPIDQA, axisPIDQA}}); + histos.add("QA/QAbefore/Track/TOF_Nsigma_pr_all", "TOF NSigma for Proton;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Proton};", {HistType::kTHnSparseF, {axisMult, axisPt, axisPIDQA}}); + histos.add("QA/QAbefore/Track/TPC_Nsigma_pr_all", "TPC NSigma for Proton;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Proton};", {HistType::kTHnSparseF, {axisMult, axisPt, axisPIDQA}}); + histos.add("QA/QAbefore/Track/TPConly_Nsigma_pr", "TPC NSigma for Proton;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Proton};", {HistType::kTHnSparseF, {axisPt, axisPIDQA}}); + histos.add("QA/QAbefore/Track/dcaZ", "DCA_{Z} distribution of selected Kaons; #it{p}_{T} (GeV/#it{c}); DCA_{Z} (cm); ", HistType::kTHnSparseF, {axisPt, axisDCAz}); + histos.add("QA/QAbefore/Track/dcaXY", "DCA_{XY} momentum distribution of selected Kaons; #it{p}_{T} (GeV/#it{c}); DCA_{XY} (cm);", HistType::kTHnSparseF, {axisPt, axisDCAxy}); + histos.add("QA/QAbefore/Track/TPC_CR", "# TPC Xrows distribution of selected Kaons; #it{p}_{T} (GeV/#it{c}); TPC X rows", HistType::kTHnSparseF, {axisPt, axisTPCXrow}); + histos.add("QA/QAbefore/Track/pT", "pT distribution of Kaons; #it{p}_{T} (GeV/#it{c}); Counts;", {HistType::kTH1F, {axisPt}}); + histos.add("QA/QAbefore/Track/eta", "#eta distribution of Kaons; #eta; Counts;", {HistType::kTH1F, {axisEta}}); + + if (cFillMultQA) { + // Multiplicity correlation calibrations + histos.add("MultCalib/centGloPVpr", "Centrality vs Global-Tracks", kTHnSparseF, {{110, 0, 110, "Centrality"}, {500, 0, 5000, "Global Tracks"}, {500, 0, 5000, "PV tracks"}}); + histos.add("MultCalib/centGloPVka", "Centrality vs Global-Tracks", kTHnSparseF, {{110, 0, 110, "Centrality"}, {500, 0, 5000, "Global Tracks"}, {500, 0, 5000, "PV tracks"}}); + } + + // PID QA after cuts + // --- Kaon + histos.add("QA/QAafter/Kaon/TOF_TPC_Map_ka_all", "TOF + TPC Combined PID for Kaon;#sigma_{TOF}^{Kaon};#sigma_{TPC}^{Kaon}", {HistType::kTHnSparseF, {axisPIDQA, axisPIDQA}}); + histos.add("QA/QAafter/Kaon/TOF_Nsigma_ka_all", "TOF NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Kaon};", {HistType::kTHnSparseF, {axisMult, axisPt, axisPIDQA}}); + histos.add("QA/QAafter/Kaon/TPC_Nsigma_ka_all", "TPC NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Kaon};", {HistType::kTHnSparseF, {axisMult, axisPt, axisPIDQA}}); + histos.add("QA/QAafter/Kaon/TPC_Nsigma_ka_TPConly", "TPC NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Kaon};", {HistType::kTHnSparseF, {axisPt, axisPIDQA}}); + histos.add("QA/QAafter/Kaon/dcaZ", "DCA_{Z} distribution of selected Kaons; #it{p}_{T} (GeV/#it{c}); DCA_{Z} (cm); ", HistType::kTHnSparseF, {axisPt, axisDCAz}); + histos.add("QA/QAafter/Kaon/dcaXY", "DCA_{XY} momentum distribution of selected Kaons; #it{p}_{T} (GeV/#it{c}); DCA_{XY} (cm);", HistType::kTHnSparseF, {axisPt, axisDCAxy}); + histos.add("QA/QAafter/Kaon/TPC_CR", "# TPC Xrows distribution of selected Kaons; #it{p}_{T} (GeV/#it{c}); TPC X rows", HistType::kTHnSparseF, {axisPt, axisTPCXrow}); + histos.add("QA/QAafter/Kaon/pT", "pT distribution of Kaons; #it{p}_{T} (GeV/#it{c}); Counts;", {HistType::kTH1F, {axisPt}}); + histos.add("QA/QAafter/Kaon/eta", "#eta distribution of Kaons; #eta; Counts;", {HistType::kTH1F, {axisEta}}); + histos.add("QA/QAafter/Kaon/TPC_Signal_ka_all", "TPC Signal for Kaon;#it{p}_{T} (GeV/#it{c});TPC Signal (A.U.)", {HistType::kTHnSparseF, {axisPt, axisTPCSignal}}); + histos.add("QA/QAafter/Kaon/TPCnclusterPhika", "TPC ncluster vs phi", kTHnSparseF, {{160, 0, 160, "TPC nCluster"}, {63, 0, 6.28, "#phi"}}); + + // --- Proton + histos.add("QA/QAafter/Proton/TOF_TPC_Map_pr_all", "TOF + TPC Combined PID for Proton;#sigma_{TOF}^{Proton};#sigma_{TPC}^{Proton}", {HistType::kTHnSparseF, {axisPIDQA, axisPIDQA}}); + histos.add("QA/QAafter/Proton/TOF_Nsigma_pr_all", "TOF NSigma for Proton;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Proton};", {HistType::kTHnSparseF, {axisMult, axisPt, axisPIDQA}}); + histos.add("QA/QAafter/Proton/TPC_Nsigma_pr_all", "TPC NSigma for Proton;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Proton};", {HistType::kTHnSparseF, {axisMult, axisPt, axisPIDQA}}); + histos.add("QA/QAafter/Proton/TPC_Nsigma_pr_TPConly", "TPC NSigma for Proton;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Proton};", {HistType::kTHnSparseF, {axisPt, axisPIDQA}}); + histos.add("QA/QAafter/Proton/dcaZ", "DCA_{Z} distribution of selected Protons; #it{p}_{T} (GeV/#it{c}); DCA_{Z} (cm);", HistType::kTHnSparseF, {axisPt, axisDCAz}); + histos.add("QA/QAafter/Proton/dcaXY", "DCA_{XY} momentum distribution of selected Protons; #it{p}_{T} (GeV/#it{c}); DCA_{XY} (cm);", HistType::kTHnSparseF, {axisPt, axisDCAxy}); + histos.add("QA/QAafter/Proton/TPC_CR", "# TPC Xrows distribution of selected Protons; #it{p}_{T} (GeV/#it{c}); TPC X rows", HistType::kTHnSparseF, {axisPt, axisTPCXrow}); + histos.add("QA/QAafter/Proton/pT", "pT distribution of Protons; #it{p}_{T} (GeV/#it{c}); Counts;", {HistType::kTH1F, {axisPt}}); + histos.add("QA/QAafter/Proton/eta", "#eta distribution of Protons; #eta; Counts;", {HistType::kTH1F, {axisEta}}); + histos.add("QA/QAafter/Proton/TPC_Signal_pr_all", "TPC Signal for Proton;#it{p}_{T} (GeV/#it{c});TPC Signal (A.U.)", {HistType::kTHnSparseF, {axisPt, axisTPCSignal}}); + histos.add("QA/QAafter/Proton/TPCnclusterPhipr", "TPC ncluster vs phi", kTHnSparseF, {{160, 0, 160, "TPC nCluster"}, {63, 0, 6.28, "#phi"}}); + + // Mass QA 1D for quick check + if (cFillinvmass1DPlots) { + histos.add("Result/Data/lambda1520invmass", "Invariant mass of #Lambda(1520) K^{#pm}p^{#mp}; Invariant Mass (GeV/#it{c}^2); Counts;", {HistType::kTH1F, {axisMassLambda1520}}); + histos.add("Result/Data/antilambda1520invmass", "Invariant mass of #Lambda(1520) K^{#mp}p^{#pm}; Invariant Mass (GeV/#it{c}^2); Counts;", {HistType::kTH1F, {axisMassLambda1520}}); + histos.add("Result/Data/lambda1520invmassLSPP", "Invariant mass of #Lambda(1520) Like Sign Method K^{#plus}p^{#plus}; Invariant Mass (GeV/#it{c}^2); Counts;", {HistType::kTH1F, {axisMassLambda1520}}); // K+ + Pr + histos.add("Result/Data/lambda1520invmassLSMM", "Invariant mass of #Lambda(1520) Like Sign Method K^{#minus}p^{#minus}; Invariant Mass (GeV/#it{c}^2); Counts;", {HistType::kTH1F, {axisMassLambda1520}}); // K- + anti-Pr + } + // eta phi QA + if (cFilldeltaEtaPhiPlots) { + histos.add("QAbefore/deltaEta", "deltaEta of kaon and proton candidates", HistType::kTH1F, {axisEtaPhi}); + histos.add("QAbefore/deltaPhi", "deltaPhi of kaon and proton candidates", HistType::kTH1F, {axisEtaPhi}); + + histos.add("QAafter/deltaEta", "deltaEta of kaon and proton candidates", HistType::kTH1F, {axisEtaPhi}); + histos.add("QAafter/deltaPhi", "deltaPhi of kaon and proton candidates", HistType::kTH1F, {axisEtaPhi}); + + histos.add("QAafter/deltaEtaafter", "deltaEta of kaon and proton candidates", HistType::kTH1F, {axisEtaPhi}); + histos.add("QAafter/deltaPhiafter", "deltaPhi of kaon and proton candidates", HistType::kTH1F, {axisEtaPhi}); + histos.add("QAafter/EtaPrafter", "Eta of proton candidates", HistType::kTH1F, {axisEta}); + histos.add("QAafter/PhiPrafter", "Phi of proton candidates", HistType::kTH1F, {axisPhi}); + histos.add("QAafter/EtaKaafter", "Eta of kaon candidates", HistType::kTH1F, {axisEta}); + histos.add("QAafter/PhiKaafter", "Phi of kaon candidates", HistType::kTH1F, {axisPhi}); + } + + if (isCalcRotBkg) { + histos.add("Result/Data/h3lambda1520InvMassRotation", "Invariant mass of #Lambda(1520) rotation", kTHnSparseF, {axisMult, axisPt, axisMassLambda1520}); + } + + // 3d histogram + histos.add("Result/Data/h3lambda1520invmass", "Invariant mass of #Lambda(1520) K^{#pm}p^{#mp}", HistType::kTHnSparseF, {axisMult, axisPt, axisMassLambda1520}); + histos.add("Result/Data/h3antilambda1520invmass", "Invariant mass of #Lambda(1520) K^{#mp}p^{#pm}", HistType::kTHnSparseF, {axisMult, axisPt, axisMassLambda1520}); + histos.add("Result/Data/h3lambda1520invmassLSPP", "Invariant mass of #Lambda(1520) Like Sign Method K^{#plus}p^{#plus}", HistType::kTHnSparseF, {axisMult, axisPt, axisMassLambda1520}); // K+ + Pr + histos.add("Result/Data/h3lambda1520invmassLSMM", "Invariant mass of #Lambda(1520) Like Sign Method K^{#minus}p^{#minus}", HistType::kTHnSparseF, {axisMult, axisPt, axisMassLambda1520}); // K- + anti-Pr + } + if (doprocessME) { + if (cFillinvmass1DPlots) { + histos.add("Result/Data/lambda1520invmassME", "Invariant mass of #Lambda(1520) mixed event K^{#pm}p^{#mp}; Invariant Mass (GeV/#it{c}^2); Counts;", {HistType::kTH1F, {axisMassLambda1520}}); + } + histos.add("Result/Data/h3lambda1520invmassME", "Invariant mass of #Lambda(1520) mixed event K^{#pm}p^{#mp}", HistType::kTHnSparseF, {axisMult, axisPt, axisMassLambda1520}); + + if (cFilladditionalMEPlots) { + histos.add("Result/Data/h3lambda1520invmassME_DS", "Invariant mass of #Lambda(1520) mixed event DS", kTHnSparseF, {axisMult, axisPt, axisMassLambda1520}); + histos.add("Result/Data/h3lambda1520invmassME_DSAnti", "Invariant mass of #Lambda(1520) mixed event DSAnti", kTHnSparseF, {axisMult, axisPt, axisMassLambda1520}); + } + } + + // MC QA + if (doprocessMCTrue) { + histos.add("QA/MC/h2GenEtaPt_beforeanycut", " #eta-#it{p}_{T} distribution of Generated #Lambda(1520); #eta; #it{p}_{T}; Counts;", HistType::kTHnSparseF, {axisEta, axisPtQA}); + histos.add("QA/MC/h2GenPhiRapidity_beforeanycut", " #phi-y distribution of Generated #Lambda(1520); #phi; y; Counts;", HistType::kTHnSparseF, {axisPhi, axisEta}); + histos.add("QA/MC/h2GenEtaPt_beforeEtacut", " #eta-#it{p}_{T} distribution of Generated #Lambda(1520); #eta; #it{p}_{T}; Counts;", HistType::kTHnSparseF, {axisEta, axisPtQA}); + histos.add("QA/MC/h2GenPhiRapidity_beforeEtacut", " #phi-y distribution of Generated #Lambda(1520); #phi; y; Counts;", HistType::kTHnSparseF, {axisPhi, axisEta}); + histos.add("QA/MC/h2GenEtaPt_afterEtacut", " #phi-#it{p}_{T} distribution of Generated #Lambda(1520); #eta; #it{p}_{T}; Counts;", HistType::kTHnSparseF, {axisEta, axisPtQA}); + histos.add("QA/MC/h2GenPhiRapidity_afterEtacut", " #phi-y distribution of Generated #Lambda(1520); #phi; y; Counts;", HistType::kTHnSparseF, {axisPhi, axisEta}); + + histos.add("Result/MC/Genlambda1520pt", "pT distribution of True MC #Lambda(1520)0", kTHnSparseF, {axisMClabel, axisPt, axisMult}); + histos.add("Result/MC/Genantilambda1520pt", "pT distribution of True MC Anti-#Lambda(1520)0", kTHnSparseF, {axisMClabel, axisPt, axisMult}); + } + if (doprocessMC) { + histos.add("QA/MC/h2RecoEtaPt_after", " #eta-#it{p}_{T} distribution of Reconstructed #Lambda(1520); #eta; #it{p}_{T}; Counts;", HistType::kTHnSparseF, {axisEta, axisPt}); + histos.add("QA/MC/h2RecoPhiRapidity_after", " #phi-y distribution of Reconstructed #Lambda(1520); #phi; y; Counts;", HistType::kTHnSparseF, {axisPhi, axisEta}); + + histos.add("QA/MC/trkDCAxy_pr", "DCAxy distribution of proton track candidates", HistType::kTHnSparseF, {axisPt, axisDCAxy}); + histos.add("QA/MC/trkDCAxy_ka", "DCAxy distribution of kaon track candidates", HistType::kTHnSparseF, {axisPt, axisDCAxy}); + histos.add("QA/MC/trkDCAz_pr", "DCAz distribution of proton track candidates", HistType::kTHnSparseF, {axisPt, axisDCAz}); + histos.add("QA/MC/trkDCAz_ka", "DCAz distribution of kaon track candidates", HistType::kTHnSparseF, {axisPt, axisDCAz}); + histos.add("QA/MC/TOF_Nsigma_pr_all", "TOF NSigma for Proton;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Proton};", {HistType::kTHnSparseF, {axisMult, axisPt, axisPIDQA}}); + histos.add("QA/MC/TPC_Nsigma_pr_all", "TPC NSigma for Proton;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Proton};", {HistType::kTHnSparseF, {axisMult, axisPt, axisPIDQA}}); + histos.add("QA/MC/TOF_Nsigma_ka_all", "TOF NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Kaon};", {HistType::kTHnSparseF, {axisMult, axisPt, axisPIDQA}}); + histos.add("QA/MC/TPC_Nsigma_ka_all", "TPC NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Kaon};", {HistType::kTHnSparseF, {axisMult, axisPt, axisPIDQA}}); + + histos.add("Result/MC/h3lambda1520Recoinvmass", "Invariant mass of Reconstructed MC #Lambda(1520)0", kTHnSparseF, {axisMult, axisPt, axisMassLambda1520}); + histos.add("Result/MC/h3antilambda1520Recoinvmass", "Invariant mass of Reconstructed MC Anti-#Lambda(1520)0", kTHnSparseF, {axisMult, axisPt, axisMassLambda1520}); + + ccdb->setURL(cfgURL); + ccdbApi.init("http://alice-ccdb.cern.ch"); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setCreatedNotAfter(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); + } + + // Print output histograms statistics + LOG(info) << "Size of the histograms in spectraTOF"; + histos.print(); + } + + float massKa = MassKaonCharged; + float massPr = MassProton; + + int kLambda1520PDG = static_cast(102134); // PDG code for Lambda(1520) + + template + float getCentrality(CollisionType const& collision) + { + if (cfgCentEst == static_cast(1)) { + return collision.multFT0C(); + } else if (cfgCentEst == static_cast(2)) { + return collision.multFT0M(); + } else { + return -999; + } + } + + template + int getDetId(DetNameType const& name) + { + LOGF(info, "getDetId running"); + if (name.value == "FT0C") { + return 0; + } else if (name.value == "FT0A") { + return 1; + } else if (name.value == "FT0M") { + return 2; + } else if (name.value == "FV0A") { + return 3; + } else if (name.value == "TPCpos") { + return 4; + } else if (name.value == "TPCneg") { + return 5; + } else { + return false; + } + } + + template + bool trackCut(const TrackType track) + { + // basic track cuts + if (std::abs(track.pt()) < cMinPtcut) + return false; + if (cDCAr7SigCut) { + if (std::abs(track.dcaXY()) > (0.004f + 0.0130f / (track.pt()))) // 7 - Sigma cut + return false; + } else { + if (std::abs(track.dcaXY()) > cMaxDCArToPVcut) + return false; + } + if (std::abs(track.dcaZ()) > cMaxDCAzToPVcut) + return false; + if (cTPCNClsFound && (track.tpcNClsFound() < cMinTPCNClsFound)) + return false; + if (cfgHasTOF && !track.hasTOF()) + return false; + if (cfgPrimaryTrack && !track.isPrimaryTrack()) + return false; + if (cfgGlobalWoDCATrack && !track.isGlobalTrackWoDCA()) + return false; + if (cfgPVContributor && !track.isPVContributor()) + return false; + if (cfgGlobalTrack && !track.isGlobalTrack()) + return false; + if (cfgUseITSRefit && !track.passedITSRefit()) + return false; + if (cfgUseTPCRefit && !track.passedTPCRefit()) + return false; + + return true; + } + + // PID selection old PID method + template + bool pTdependentPIDProton(const T& candidate) + { + auto vProtonTPCPIDpTintv = static_cast>(protonTPCPIDpTintv); + vProtonTPCPIDpTintv.insert(vProtonTPCPIDpTintv.begin(), cMinPtcut); + auto vProtonTPCPIDcuts = static_cast>(protonTPCPIDcuts); + auto vProtonTOFPIDpTintv = static_cast>(protonTOFPIDpTintv); + auto vProtonTPCTOFCombinedpTintv = static_cast>(protonTPCTOFCombinedpTintv); + auto vProtonTPCTOFCombinedPIDcuts = static_cast>(protonTPCTOFCombinedPIDcuts); + auto vProtonTOFPIDcuts = static_cast>(protonTOFPIDcuts); + auto lengthOfprotonTPCPIDpTintv = static_cast(vProtonTPCPIDpTintv.size()); + auto lengthOfprotonTOFPIDpTintv = static_cast(vProtonTOFPIDpTintv.size()); + auto lengthOfprotonTPCTOFCombinedPIDpTintv = static_cast(vProtonTPCTOFCombinedpTintv.size()); + + bool tpcPIDPassed{false}, tofPIDPassed{false}; + + // For Proton candidate: + // TPC PID + if (lengthOfprotonTPCPIDpTintv > 0) { + if (candidate.pt() > vProtonTPCPIDpTintv[lengthOfprotonTPCPIDpTintv - 1]) { + tpcPIDPassed = false; + } else { + for (int i = 0; i < lengthOfprotonTPCPIDpTintv; i++) { + if (candidate.pt() > vProtonTPCPIDpTintv[i] && candidate.pt() < vProtonTPCPIDpTintv[i + 1]) { + if (std::abs(candidate.tpcNSigmaPr()) < vProtonTPCPIDcuts[i]) + tpcPIDPassed = true; + } + } + } + } + + // bypass TOF + if (cByPassTOF && tpcPIDPassed) { + return true; + } + + // TOF PID + if (candidate.hasTOF()) { + if (cPIDcutType == 1) { + if (lengthOfprotonTOFPIDpTintv > 0) { + if (candidate.pt() > vProtonTOFPIDpTintv[lengthOfprotonTOFPIDpTintv - 1]) { + tofPIDPassed = false; + } else { + for (int i = 0; i < lengthOfprotonTOFPIDpTintv; i++) { + if (candidate.pt() < vProtonTOFPIDpTintv[i]) { + + if (std::abs(candidate.tofNSigmaPr()) < vProtonTOFPIDcuts[i] && std::abs(candidate.tpcNSigmaPr()) < cMaxTPCnSigmaProtonVETO) + tofPIDPassed = true; + } + } + } + } + } else if (cPIDcutType == static_cast(2)) { + if (lengthOfprotonTPCTOFCombinedPIDpTintv > 0) { + if (candidate.pt() > vProtonTPCTOFCombinedpTintv[lengthOfprotonTPCTOFCombinedPIDpTintv - 1]) { + tofPIDPassed = false; + } else { + for (int i = 0; i < lengthOfprotonTPCTOFCombinedPIDpTintv; i++) { + if (candidate.pt() < vProtonTPCTOFCombinedpTintv[i]) { + if ((candidate.tpcNSigmaPr() * candidate.tpcNSigmaPr() + candidate.tofNSigmaPr() * candidate.tofNSigmaPr()) < (vProtonTPCTOFCombinedPIDcuts[i] * vProtonTPCTOFCombinedPIDcuts[i])) + tofPIDPassed = true; + } + } + } + } + } + } else { + tofPIDPassed = true; + } + + // TPC-TOF Combined PID + if (tpcPIDPassed && tofPIDPassed) { + return true; + } + + return false; + } + + template + bool pTdependentPIDKaon(const T& candidate) + { + auto vKaonTPCPIDpTintv = static_cast>(kaonTPCPIDpTintv); + vKaonTPCPIDpTintv.insert(vKaonTPCPIDpTintv.begin(), cMinPtcut); + auto vKaonTPCPIDcuts = static_cast>(kaonTPCPIDcuts); + auto vKaonTOFPIDpTintv = static_cast>(kaonTOFPIDpTintv); + auto vKaonTPCTOFCombinedpTintv = static_cast>(kaonTPCTOFCombinedpTintv); + auto vKaonTPCTOFCombinedPIDcuts = static_cast>(kaonTPCTOFCombinedPIDcuts); + auto vKaonTOFPIDcuts = static_cast>(kaonTOFPIDcuts); + auto lengthOfkaonTPCPIDpTintv = static_cast(vKaonTPCPIDpTintv.size()); + auto lengthOfkaonTOFPIDpTintv = static_cast(vKaonTOFPIDpTintv.size()); + auto lengthOfkaonTPCTOFCombinedPIDpTintv = static_cast(vKaonTPCTOFCombinedpTintv.size()); + + bool tpcPIDPassed{false}, tofPIDPassed{false}; + + // For Kaon candidate: + // TPC PID + if (lengthOfkaonTPCPIDpTintv > 0) { + if (candidate.pt() > vKaonTPCPIDpTintv[lengthOfkaonTPCPIDpTintv - 1]) { + tpcPIDPassed = false; + } else { + for (int i = 0; i < lengthOfkaonTPCPIDpTintv; i++) { + if (candidate.pt() > vKaonTPCPIDpTintv[i] && candidate.pt() < vKaonTPCPIDpTintv[i + 1]) { + if (std::abs(candidate.tpcNSigmaKa()) < vKaonTPCPIDcuts[i]) + tpcPIDPassed = true; + } + } + } + } + + // bypass TOF + if (cByPassTOF && tpcPIDPassed) { + return true; + } + + // TOF PID + if (candidate.hasTOF()) { + if (cPIDcutType == 1) { + if (lengthOfkaonTOFPIDpTintv > 0) { + if (candidate.pt() > vKaonTOFPIDpTintv[lengthOfkaonTOFPIDpTintv - 1]) { + tofPIDPassed = false; + } else { + for (int i = 0; i < lengthOfkaonTOFPIDpTintv; i++) { + if (candidate.pt() < vKaonTOFPIDpTintv[i]) { + + if (std::abs(candidate.tofNSigmaKa()) < vKaonTOFPIDcuts[i] && std::abs(candidate.tpcNSigmaKa()) < cMaxTPCnSigmaKaonVETO) + tofPIDPassed = true; + } + } + } + } + } else if (cPIDcutType == static_cast(2)) { + if (lengthOfkaonTPCTOFCombinedPIDpTintv > 0) { + if (candidate.pt() > vKaonTPCTOFCombinedpTintv[lengthOfkaonTPCTOFCombinedPIDpTintv - 1]) { + tofPIDPassed = false; + } else { + for (int i = 0; i < lengthOfkaonTPCTOFCombinedPIDpTintv; i++) { + if (candidate.pt() < vKaonTPCTOFCombinedpTintv[i]) { + if ((candidate.tpcNSigmaKa() * candidate.tpcNSigmaKa() + candidate.tofNSigmaKa() * candidate.tofNSigmaKa()) < (vKaonTPCTOFCombinedPIDcuts[i] * vKaonTPCTOFCombinedPIDcuts[i])) + tofPIDPassed = true; + } + } + } + } + } + } else { + tofPIDPassed = true; + } + + // TPC-TOF Combined PID + if (tpcPIDPassed && tofPIDPassed) { + return true; + } + + return false; + } + + template + bool rejectPion(const T& candidate) + { + if (candidate.pt() > static_cast(1.0) && candidate.pt() < static_cast(2.0) && !candidate.hasTOF() && candidate.tpcNSigmaPi() < static_cast(2)) { + return false; + } + return true; + } + + template + void fillHistograms(const CollisionType& collision, const TracksType& dTracks1, const TracksType& dTracks2) + { + auto multiplicity = collision.centFT0M(); + + // Multiplicity correlation calibration plots + if (cFillMultQA) { + if constexpr (IsData) { + histos.fill(HIST("MultCalib/centGloPVpr"), multiplicity, dTracks1.size(), collision.multNTracksPV()); + histos.fill(HIST("MultCalib/centGloPVka"), multiplicity, dTracks2.size(), collision.multNTracksPV()); + } + } + + if (cFilladditionalQAeventPlots) { + if constexpr (!IsMix) { + histos.fill(HIST("QAevent/hVertexZSameE"), collision.posZ()); + histos.fill(HIST("QAevent/hMultiplicityPercentSameE"), multiplicity); + histos.fill(HIST("TestME/hCollisionIndexSameE"), collision.globalIndex()); + histos.fill(HIST("TestME/hnTrksSameE"), dTracks1.size()); + } else { + histos.fill(HIST("QAevent/hVertexZMixedE"), collision.posZ()); + histos.fill(HIST("QAevent/hMultiplicityPercentMixedE"), multiplicity); + histos.fill(HIST("TestME/hCollisionIndexMixedE"), collision.globalIndex()); + histos.fill(HIST("TestME/hnTrksMixedE"), dTracks1.size()); + } + } + // LOG(info) << "After pass, Collision index:" << collision.index() << "multiplicity: " << collision.centFT0M() << endl; + + LorentzVectorPtEtaPhiMass lDecayDaughter1, lDecayDaughter2, lResonance, ldaughterRot, lresonanceRot; + + for (const auto& [trk1, trk2] : combinations(CombinationsFullIndexPolicy(dTracks1, dTracks2))) { + // Full index policy is needed to consider all possible combinations + if (trk1.index() == trk2.index()) + continue; // We need to run (0,1), (1,0) pairs as well. but same id pairs are not needed. + + if (cFilladditionalQAeventPlots) { + if constexpr (IsData) { + histos.fill(HIST("TestME/hPairsCounterSameE"), 1.0); + } else if (IsMix) { + histos.fill(HIST("TestME/hPairsCounterMixedE"), 1.0); + } + } + + // apply the track cut + if (!trackCut(trk1) || !trackCut(trk2)) + continue; + + //// Initialize variables + // Trk1: Proton, Trk2: Kaon + auto isTrk1hasTOF = trk1.hasTOF(); + auto isTrk2hasTOF = trk2.hasTOF(); + + auto trk1ptPr = trk1.pt(); + auto trk1NSigmaPrTPC = trk1.tpcNSigmaPr(); + auto trk1NSigmaPrTOF = (isTrk1hasTOF) ? trk1.tofNSigmaPr() : -999.; + auto trk2ptKa = trk2.pt(); + auto trk2NSigmaKaTPC = trk2.tpcNSigmaKa(); + auto trk2NSigmaKaTOF = (isTrk2hasTOF) ? trk2.tofNSigmaKa() : -999.; + + auto deltaEta = std::abs(trk1.eta() - trk2.eta()); + auto deltaPhi = std::abs(trk1.phi() - trk2.phi()); + deltaPhi = (deltaPhi > constants::math::PI) ? (constants::math::TwoPI - deltaPhi) : deltaPhi; + + //// QA plots before the selection + // --- Track QA all + if constexpr (IsData) { + histos.fill(HIST("QA/QAbefore/Track/TPC_Nsigma_pr_all"), multiplicity, trk1ptPr, trk1NSigmaPrTPC); + if (isTrk1hasTOF) { + histos.fill(HIST("QA/QAbefore/Track/TOF_Nsigma_pr_all"), multiplicity, trk1ptPr, trk1NSigmaPrTOF); + histos.fill(HIST("QA/QAbefore/Track/TOF_TPC_Map_pr_all"), trk1NSigmaPrTOF, trk1NSigmaPrTPC); + } + if (!isTrk1hasTOF) { + histos.fill(HIST("QA/QAbefore/Track/TPConly_Nsigma_pr"), trk1ptPr, trk1NSigmaPrTPC); + } + histos.fill(HIST("QA/QAbefore/Track/TPC_Nsigma_ka_all"), multiplicity, trk2ptKa, trk2NSigmaKaTPC); + if (isTrk2hasTOF) { + histos.fill(HIST("QA/QAbefore/Track/TOF_Nsigma_ka_all"), multiplicity, trk2ptKa, trk2NSigmaKaTOF); + histos.fill(HIST("QA/QAbefore/Track/TOF_TPC_Map_ka_all"), trk2NSigmaKaTOF, trk2NSigmaKaTPC); + } + if (!isTrk2hasTOF) { + histos.fill(HIST("QA/QAbefore/Track/TPConly_Nsigma_ka"), trk2ptKa, trk2NSigmaKaTPC); + } + + histos.fill(HIST("QA/QAbefore/Track/dcaZ"), trk1ptPr, trk1.dcaZ()); + histos.fill(HIST("QA/QAbefore/Track/dcaXY"), trk1ptPr, trk1.dcaXY()); + histos.fill(HIST("QA/QAbefore/Track/TPC_CR"), trk1ptPr, trk1.tpcNClsCrossedRows()); + histos.fill(HIST("QA/QAbefore/Track/pT"), trk1ptPr); + histos.fill(HIST("QA/QAbefore/Track/eta"), trk1.eta()); + if (cFilldeltaEtaPhiPlots) { + histos.fill(HIST("QAbefore/deltaEta"), deltaEta); + histos.fill(HIST("QAbefore/deltaPhi"), deltaPhi); + } + } + + //// Apply the pid selection + if (crejectPion && rejectPion(trk2)) + continue; + + if (!pTdependentPIDProton(trk1) || !pTdependentPIDKaon(trk2)) + continue; + + //// QA plots after the selection + if constexpr (IsData) { // --- PID QA Proton + histos.fill(HIST("QA/QAafter/Proton/TPC_Nsigma_pr_all"), multiplicity, trk1ptPr, trk1NSigmaPrTPC); + histos.fill(HIST("QA/QAafter/Proton/TPC_Signal_pr_all"), trk1ptPr, trk1.tpcSignal()); + if (isTrk1hasTOF) { + histos.fill(HIST("QA/QAafter/Proton/TOF_Nsigma_pr_all"), multiplicity, trk1ptPr, trk1NSigmaPrTOF); + histos.fill(HIST("QA/QAafter/Proton/TOF_TPC_Map_pr_all"), trk1NSigmaPrTOF, trk1NSigmaPrTPC); + } + if (!isTrk1hasTOF) { + histos.fill(HIST("QA/QAafter/Proton/TPC_Nsigma_pr_TPConly"), trk1ptPr, trk1NSigmaPrTPC); + } + histos.fill(HIST("QA/QAafter/Proton/dcaZ"), trk1ptPr, trk1.dcaZ()); + histos.fill(HIST("QA/QAafter/Proton/dcaXY"), trk1ptPr, trk1.dcaXY()); + histos.fill(HIST("QA/QAafter/Proton/TPC_CR"), trk1ptPr, trk1.tpcNClsCrossedRows()); + histos.fill(HIST("QA/QAafter/Proton/pT"), trk1ptPr); + histos.fill(HIST("QA/QAafter/Proton/eta"), trk1.eta()); + histos.fill(HIST("QA/QAafter/Proton/TPCnclusterPhipr"), trk1.tpcNClsFound(), trk1.phi()); + + // --- PID QA Kaon + histos.fill(HIST("QA/QAafter/Kaon/TPC_Nsigma_ka_all"), multiplicity, trk2ptKa, trk2NSigmaKaTPC); + histos.fill(HIST("QA/QAafter/Kaon/TPC_Signal_ka_all"), trk2ptKa, trk2.tpcSignal()); + if (isTrk2hasTOF) { + histos.fill(HIST("QA/QAafter/Kaon/TOF_Nsigma_ka_all"), multiplicity, trk2ptKa, trk2NSigmaKaTOF); + histos.fill(HIST("QA/QAafter/Kaon/TOF_TPC_Map_ka_all"), trk2NSigmaKaTOF, trk2NSigmaKaTPC); + } + if (!isTrk2hasTOF) { + histos.fill(HIST("QA/QAafter/Kaon/TPC_Nsigma_ka_TPConly"), trk2ptKa, trk2NSigmaKaTPC); + } + histos.fill(HIST("QA/QAafter/Kaon/dcaZ"), trk2ptKa, trk2.dcaZ()); + histos.fill(HIST("QA/QAafter/Kaon/dcaXY"), trk2ptKa, trk2.dcaXY()); + histos.fill(HIST("QA/QAafter/Kaon/TPC_CR"), trk2ptKa, trk2.tpcNClsCrossedRows()); + histos.fill(HIST("QA/QAafter/Kaon/pT"), trk2ptKa); + histos.fill(HIST("QA/QAafter/Kaon/eta"), trk2.eta()); + histos.fill(HIST("QA/QAafter/Kaon/TPCnclusterPhika"), trk2.tpcNClsFound(), trk2.phi()); + + if (cFilldeltaEtaPhiPlots) { + histos.fill(HIST("QAafter/deltaEta"), deltaEta); + histos.fill(HIST("QAafter/deltaPhi"), deltaPhi); + } + } + + // Apply kinematic opening angle cut + if (cApplyOpeningAngle) { + TVector3 v1(trk1.px(), trk1.py(), trk1.pz()); + TVector3 v2(trk2.px(), trk2.py(), trk2.pz()); + float alpha = v1.Angle(v2); + if (alpha > cMinOpeningAngle && alpha < cMaxOpeningAngle) + continue; + } + + //// Resonance reconstruction + lDecayDaughter1 = LorentzVectorPtEtaPhiMass(trk1.pt(), trk1.eta(), trk1.phi(), massPr); + lDecayDaughter2 = LorentzVectorPtEtaPhiMass(trk2.pt(), trk2.eta(), trk2.phi(), massKa); + lResonance = lDecayDaughter1 + lDecayDaughter2; + // Rapidity cut + if (std::abs(lResonance.Rapidity()) > static_cast(0.5)) + continue; + + if (cfgCutsOnMother) { + if (lResonance.Pt() >= cMaxPtMotherCut) // excluding candidates in overflow + continue; + if (lResonance.M() >= cMaxMinvMotherCut) // excluding candidates in overflow + continue; + } + + if (cFilldeltaEtaPhiPlots) { + if (deltaEta >= cMaxDeltaEtaCut) + continue; + if (deltaPhi >= cMaxDeltaPhiCut) + continue; + + if constexpr (!IsMix) { + histos.fill(HIST("QAafter/EtaPrafter"), trk1.eta()); + histos.fill(HIST("QAafter/PhiPrafter"), trk1.phi()); + histos.fill(HIST("QAafter/EtaKaafter"), trk2.eta()); + histos.fill(HIST("QAafter/PhiKaafter"), trk2.phi()); + histos.fill(HIST("QAafter/deltaEtaafter"), deltaEta); + histos.fill(HIST("QAafter/deltaPhiafter"), deltaPhi); + } + } + + //// Un-like sign pair only + if (trk1.sign() * trk2.sign() < 0) { + if constexpr (IsData) { + if (isCalcRotBkg) { + for (int i = 0; i < cNofRotations; i++) { + float theta2 = rn->Uniform(constants::math::PI - constants::math::PI / rotationalcut, constants::math::PI + constants::math::PI / rotationalcut); + ldaughterRot = LorentzVectorPtEtaPhiMass(trk2.pt(), trk2.eta(), trk2.phi() + theta2, massKa); // for rotated background + lresonanceRot = lDecayDaughter1 + ldaughterRot; + histos.fill(HIST("Result/Data/h3lambda1520InvMassRotation"), multiplicity, lresonanceRot.Pt(), lresonanceRot.M()); + } + } + + if (trk1.sign() < 0) { + if (cFillinvmass1DPlots) { + histos.fill(HIST("Result/Data/lambda1520invmass"), lResonance.M()); + } + histos.fill(HIST("Result/Data/h3lambda1520invmass"), multiplicity, lResonance.Pt(), lResonance.M()); + } else if (trk1.sign() > 0) { + if (cFillinvmass1DPlots) { + histos.fill(HIST("Result/Data/antilambda1520invmass"), lResonance.M()); + } + histos.fill(HIST("Result/Data/h3antilambda1520invmass"), multiplicity, lResonance.Pt(), lResonance.M()); + } + } else if (IsMix) { + if (cFillinvmass1DPlots) { + histos.fill(HIST("Result/Data/lambda1520invmassME"), lResonance.M()); + } + histos.fill(HIST("Result/Data/h3lambda1520invmassME"), multiplicity, lResonance.Pt(), lResonance.M()); + if (cFilladditionalMEPlots) { + if (trk1.sign() < 0) { + histos.fill(HIST("Result/Data/h3lambda1520invmassME_DS"), multiplicity, lResonance.Pt(), lResonance.M()); + } else if (trk1.sign() > 0) { + histos.fill(HIST("Result/Data/h3lambda1520invmassME_DSAnti"), multiplicity, lResonance.Pt(), lResonance.M()); + } + } + } + + // MC + if constexpr (IsMC) { + // LOG(info) << "trk1 pdgcode: " << trk1.pdgCode() << "trk2 pdgcode: " << trk2.pdgCode() << endl; + + const auto mctrack1 = trk1.mcParticle(); + const auto mctrack2 = trk2.mcParticle(); + + if (std::abs(mctrack1.pdgCode()) != PDG_t::kProton || std::abs(mctrack2.pdgCode()) != PDG_t::kKPlus) + continue; + bool isMotherOk = false; + int pdgCodeMother = -999; + + if (!trk1.has_mcParticle() || !trk2.has_mcParticle()) + continue; + + for (const auto& mothertrack1 : mctrack1.template mothers_as()) { + for (const auto& mothertrack2 : mctrack2.template mothers_as()) { + if (mothertrack1.pdgCode() != mothertrack2.pdgCode()) + continue; + if (mothertrack1.globalIndex() != mothertrack2.globalIndex()) + continue; + + if (std::abs(mothertrack1.pdgCode()) == kLambda1520PDG) // Pb PDG code + continue; + + pdgCodeMother = mothertrack1.pdgCode(); + + isMotherOk = true; + } + } + + // if (motherdTracks1.id() != motherdTracks2.id()) // Same mother + // continue; + // if (std::abs(motherdTracks1.pdgCode()) != kLambda1520PDG) + // continue; + + if (std::abs(lResonance.Eta()) > cEtacutMC) // eta cut + continue; + + if (!isMotherOk) + continue; + + histos.fill(HIST("QA/MC/h2RecoEtaPt_after"), lResonance.Eta(), lResonance.Pt()); + histos.fill(HIST("QA/MC/h2RecoPhiRapidity_after"), lResonance.Phi(), lResonance.Rapidity()); + + // Track selection check. + histos.fill(HIST("QA/MC/trkDCAxy_pr"), trk1ptPr, trk1.dcaXY()); + histos.fill(HIST("QA/MC/trkDCAxy_ka"), trk2ptKa, trk2.dcaXY()); + histos.fill(HIST("QA/MC/trkDCAz_pr"), trk1ptPr, trk1.dcaZ()); + histos.fill(HIST("QA/MC/trkDCAz_ka"), trk2ptKa, trk2.dcaZ()); + + histos.fill(HIST("QA/MC/TPC_Nsigma_pr_all"), multiplicity, trk1ptPr, trk1NSigmaPrTPC); + if (isTrk1hasTOF) { + histos.fill(HIST("QA/MC/TOF_Nsigma_pr_all"), multiplicity, trk1ptPr, trk1NSigmaPrTOF); + } + histos.fill(HIST("QA/MC/TPC_Nsigma_ka_all"), multiplicity, trk2ptKa, trk2NSigmaKaTPC); + if (isTrk2hasTOF) { + histos.fill(HIST("QA/MC/TOF_Nsigma_ka_all"), multiplicity, trk2ptKa, trk2NSigmaKaTOF); + } + + // MC histograms + if (pdgCodeMother > 0) { + histos.fill(HIST("Result/MC/h3lambda1520Recoinvmass"), multiplicity, lResonance.Pt(), lResonance.M()); + } else { + histos.fill(HIST("Result/MC/h3antilambda1520Recoinvmass"), multiplicity, lResonance.Pt(), lResonance.M()); + } + } + } else { + if constexpr (IsData) { + // Like sign pair ++ + if (trk1.sign() > 0) { + if (cFillinvmass1DPlots) { + histos.fill(HIST("Result/Data/lambda1520invmassLSPP"), lResonance.M()); + } + histos.fill(HIST("Result/Data/h3lambda1520invmassLSPP"), multiplicity, lResonance.Pt(), lResonance.M()); + } else { // Like sign pair -- + if (cFillinvmass1DPlots) { + histos.fill(HIST("Result/Data/lambda1520invmassLSMM"), lResonance.M()); + } + histos.fill(HIST("Result/Data/h3lambda1520invmassLSMM"), multiplicity, lResonance.Pt(), lResonance.M()); + } + } + } + } + } + + void processData(EventCandidates::iterator const& collision, + TrackCandidates const& tracks, + BCsWithTimestamps const&) + { + if (!colCuts.isSelected(collision)) // Default event selection + return; + + centrality = getCentrality(collision); + // if (centrality < cfgEventCentralityMin || centrality > cfgEventCentralityMax) + // return; + + colCuts.fillQA(collision); + + if (cFilladditionalQAeventPlots) + histos.fill(HIST("QAevent/hEvtCounterSameE"), 1.0); + fillHistograms(collision, tracks, tracks); + } + PROCESS_SWITCH(Lstaranalysis, processData, "Process Event for data without partition", false); + + void processMC(MCEventCandidates::iterator const& collision, + MCTrackCandidates const& tracks, + BCsWithTimestamps const&) + { + if (!colCuts.isSelected(collision) || (std::abs(collision.posZ()) > cZvertCutMC)) // MC event selection, all cuts missing vtx cut + return; + fillHistograms(collision, tracks, tracks); + } + PROCESS_SWITCH(Lstaranalysis, processMC, "Process Event for MC Light without partition", false); + + void processMCTrue(EventCandidates::iterator const& collision, McParticles const& mcParticles) + { + auto multiplicity = collision.centFT0M(); + + LorentzVectorPtEtaPhiMass lDecayDaughter1, lDecayDaughter2, vresoParent; + + // Not related to the real collisions + for (const auto& part : mcParticles) { // loop over all MC particles + if (std::abs(part.pdgCode()) != kLambda1520PDG) // Lambda1520(0) + continue; + + auto kDaughters = part.daughters_as(); + if (kDaughters.size() != static_cast(2)) { + continue; + } + + // bool pass1 = std::abs(part.daughterPDG1()) == 321 || std::abs(part.daughterPDG2()) == 321; // At least one decay to Kaon + // bool pass2 = std::abs(part.daughterPDG1()) == 2212 || std::abs(part.daughterPDG2()) == 2212; // At least one decay to Proton + + auto daughtp = false; + auto daughtk = false; + for (const auto& kCurrentDaughter : kDaughters) { + if (!kCurrentDaughter.isPhysicalPrimary()) + break; + + if (std::abs(kCurrentDaughter.pdgCode()) == PDG_t::kProton) { // Proton + daughtp = true; + lDecayDaughter1 = LorentzVectorPtEtaPhiMass(kCurrentDaughter.pt(), kCurrentDaughter.eta(), kCurrentDaughter.phi(), massPr); + } else if (std::abs(kCurrentDaughter.pdgCode()) == PDG_t::kKPlus) { + daughtk = true; + lDecayDaughter2 = LorentzVectorPtEtaPhiMass(kCurrentDaughter.pt(), kCurrentDaughter.eta(), kCurrentDaughter.phi(), massKa); + } + } + + // Checking if we have both decay products + if (!daughtp || !daughtk) + continue; + + vresoParent = lDecayDaughter1 + lDecayDaughter2; + + histos.fill(HIST("QA/MC/h2GenEtaPt_beforeanycut"), vresoParent.Eta(), part.pt()); + histos.fill(HIST("QA/MC/h2GenPhiRapidity_beforeanycut"), vresoParent.Phi(), part.y()); + + if (std::abs(part.y()) > static_cast(0.5)) // rapidity cut + continue; + + histos.fill(HIST("QA/MC/h2GenEtaPt_beforeEtacut"), vresoParent.Eta(), part.pt()); + histos.fill(HIST("QA/MC/h2GenPhiRapidity_beforeEtacut"), vresoParent.Phi(), part.y()); + + if (std::abs(vresoParent.Eta()) > cEtacutMC) // eta cut + continue; + + histos.fill(HIST("QA/MC/h2GenEtaPt_afterEtacut"), vresoParent.Eta(), part.pt()); + histos.fill(HIST("QA/MC/h2GenPhiRapidity_afterEtacut"), vresoParent.Phi(), part.y()); + + // without any event selection + if (part.pdgCode() > 0) + histos.fill(HIST("Result/MC/Genlambda1520pt"), 0, part.pt(), multiplicity); + else + histos.fill(HIST("Result/MC/Genantilambda1520pt"), 0, part.pt(), multiplicity); + + if (collision.posZ() > static_cast(10.)) // INEL10 + { + if (part.pdgCode() > 0) + histos.fill(HIST("Result/MC/Genlambda1520pt"), 1, part.pt(), multiplicity); + else + histos.fill(HIST("Result/MC/Genantilambda1520pt"), 1, part.pt(), multiplicity); + } + if (collision.posZ() > static_cast(10.) && collision.sel8()) // INEL>10, vtx10 + { + if (part.pdgCode() > 0) + histos.fill(HIST("Result/MC/Genlambda1520pt"), 2, part.pt(), multiplicity); + else + histos.fill(HIST("Result/MC/Genantilambda1520pt"), 2, part.pt(), multiplicity); + } + if (collision.posZ() > static_cast(10.) && collision.selection_bit(aod::evsel::kIsTriggerTVX)) // vtx10, TriggerTVX + { + if (part.pdgCode() > 0) + histos.fill(HIST("Result/MC/Genlambda1520pt"), 3, part.pt(), multiplicity); + else + histos.fill(HIST("Result/MC/Genantilambda1520pt"), 3, part.pt(), multiplicity); + } + if (colCuts.isSelected(collision)) // after all event selection + { + if (part.pdgCode() > 0) + histos.fill(HIST("Result/MC/Genlambda1520pt"), 4, part.pt(), multiplicity); + else + histos.fill(HIST("Result/MC/Genantilambda1520pt"), 4, part.pt(), multiplicity); + } + } + } + PROCESS_SWITCH(Lstaranalysis, processMCTrue, "Process Event for MC only", false); + + // Processing Event Mixing + using BinningTypeVtxZT0M = ColumnBinningPolicy; + BinningTypeVtxZT0M colBinning{{cfgVtxBins, cfgMultBins}, true}; + + void processME(EventCandidates const& collision, + TrackCandidates const& tracks, + BCsWithTimestamps const&) + { + auto tracksTuple = std::make_tuple(tracks); + SameKindPair pairs{colBinning, nEvtMixing, -1, collision, tracksTuple, &cache}; // -1 is the number of the bin to skip + + for (const auto& [collision1, tracks1, collision2, tracks2] : pairs) { + // LOGF(info, "Mixed event collisions: (%d, %d)", collision1.globalIndex(), collision2.globalIndex()); + + // for (auto& [t1, t2] : combinations(CombinationsFullIndexPolicy(tracks1, tracks2))) { + // LOGF(info, "Mixed event tracks pair: (%d, %d) from events (%d, %d)", t1.index(), t2.index(), collision1.index(), collision2.index()); + // } + + if (cFilladditionalQAeventPlots) { + // Fill histograms for the characteristics of the *mixed* events (collision1 and collision2) + // This will show the distribution of events that are actually being mixed. + histos.fill(HIST("QAevent/hMixPool_VtxZ"), collision1.posZ()); + histos.fill(HIST("QAevent/hMixPool_Multiplicity"), collision1.centFT0M()); // Assuming getCentrality() gives multiplicity + histos.fill(HIST("QAevent/hMixPool_VtxZ_vs_Multiplicity"), collision1.posZ(), collision1.centFT0M()); + + // You might also want to fill for collision2 if you want to see both partners' distributions + // histos.fill(HIST("QAevent/hMixPool_VtxZ"), collision2.posZ()); + // histos.fill(HIST("QAevent/hMixPool_Multiplicity"), collision2.getCentrality()); + // histos.fill(HIST("QAevent/hMixPool_VtxZ_vs_Multiplicity"), collision2.posZ(), collision2.getCentrality()); + + histos.fill(HIST("QAevent/hEvtCounterMixedE"), 1.f); + } + fillHistograms(collision1, tracks1, tracks2); + } + } + PROCESS_SWITCH(Lstaranalysis, processME, "Process EventMixing light without partition", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} From ac2f787e41b9d04c669f3189f4fa3d40292b4566 Mon Sep 17 00:00:00 2001 From: sarjeetagami <162087855+sarjeetagami@users.noreply.github.com> Date: Sun, 8 Jun 2025 10:56:43 +0530 Subject: [PATCH 1550/1650] [PWGLF] added RCT flag in kstar flow and phi production task (#11501) Co-authored-by: sarjeeta gami --- PWGLF/Tasks/Resonances/kstarpbpb.cxx | 51 +++++-- .../Tasks/Resonances/phianalysisrun3_PbPb.cxx | 128 ++++++++++++++---- 2 files changed, 144 insertions(+), 35 deletions(-) diff --git a/PWGLF/Tasks/Resonances/kstarpbpb.cxx b/PWGLF/Tasks/Resonances/kstarpbpb.cxx index cd2ddf8d0c0..0093b921c80 100644 --- a/PWGLF/Tasks/Resonances/kstarpbpb.cxx +++ b/PWGLF/Tasks/Resonances/kstarpbpb.cxx @@ -59,6 +59,7 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; using std::array; +using namespace o2::aod::rctsel; struct kstarpbpb { struct : ConfigurableGroup { @@ -70,6 +71,16 @@ struct kstarpbpb { Service ccdb; o2::ccdb::CcdbApi ccdbApi; // Service pdg; + struct RCTCut : ConfigurableGroup { + Configurable requireRCTFlagChecker{"requireRCTFlagChecker", true, "Check event quality in run condition table"}; + Configurable cfgEvtRCTFlagCheckerLabel{"cfgEvtRCTFlagCheckerLabel", "CBT_hadronPID", "Evt sel: RCT flag checker label"}; + Configurable cfgEvtRCTFlagCheckerZDCCheck{"cfgEvtRCTFlagCheckerZDCCheck", false, "Evt sel: RCT flag checker ZDC check"}; + Configurable cfgEvtRCTFlagCheckerLimitAcceptAsBad{"cfgEvtRCTFlagCheckerLimitAcceptAsBad", true, "Evt sel: RCT flag checker treat Limited Acceptance As Bad"}; + + RCTFlagsChecker rctChecker; + }; + + RCTCut rctCut; // CCDB options // Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; @@ -162,6 +173,11 @@ struct kstarpbpb { void init(o2::framework::InitContext&) { + rctCut.rctChecker.init( + rctCut.cfgEvtRCTFlagCheckerLabel, + rctCut.cfgEvtRCTFlagCheckerZDCCheck, + rctCut.cfgEvtRCTFlagCheckerLimitAcceptAsBad); + std::vector occupancyBinning = {0.0, 500.0, 1000.0, 1500.0, 2000.0, 3000.0, 4000.0, 5000.0, 50000.0}; AxisSpec phiAxis = {500, -6.28, 6.28, "phi"}; AxisSpec resAxis = {6000, -30, 30, "Res"}; @@ -170,6 +186,7 @@ struct kstarpbpb { if (!fillSA) { if (same) { histos.add("hSparseV2SASameEvent_V2", "hSparseV2SASameEvent_V2", HistType::kTHnSparseF, {configThnAxisInvMass, configThnAxisPt, configThnAxisV2, configThnAxisCentrality}); + histos.add("hEvtSelInfo", "hEvtSelInfo", kTH1F, {{10, 0, 10.0}}); } if (like) { histos.add("hSparseV2SAlikeEventNN_V2", "hSparseV2SAlikeEventNN_V2", HistType::kTHnSparseF, {configThnAxisInvMass, configThnAxisPt, configThnAxisV2, configThnAxisCentrality}); @@ -230,10 +247,11 @@ struct kstarpbpb { } if (additionalQAplots) { // DCA QA - histos.add("QAbefore/trkDCAxyka", "DCAxy distribution of kaon track candidates", HistType::kTH1F, {{150, 0.0f, 1.0f}}); - histos.add("QAbefore/trkDCAzka", "DCAz distribution of kaon track candidates", HistType::kTH1F, {{150, 0.0f, 1.0f}}); - histos.add("QAafter/trkDCAxyka", "DCAxy distribution of kaon track candidates", HistType::kTH1F, {{150, 0.0f, 1.0f}}); - histos.add("QAafter/trkDCAzka", "DCAz distribution of kaon track candidates", HistType::kTH1F, {{150, 0.0f, 1.0f}}); + histos.add("QAbefore/trkDCAxyka", "DCAxy distribution of kaon track candidates", HistType::kTH1F, {{150, -1.0f, 1.0f}}); + histos.add("QAbefore/trkDCAzka", "DCAz distribution of kaon track candidates", HistType::kTH1F, {{150, -1.0f, 1.0f}}); + histos.add("QAafter/trkDCAxyka", "DCAxy distribution of kaon track candidates", HistType::kTH1F, {{150, -1.0f, 1.0f}}); + histos.add("QAafter/trkDCAzka", "DCAz distribution of kaon track candidates", HistType::kTH1F, {{150, -1.0f, 1.0f}}); + // PID QA before cuts histos.add("QAbefore/TOF_TPC_Mapka_allka", "TOF + TPC Combined PID for Kaon;#sigma_{TOF}^{Kaon};#sigma_{TPC}^{Kaon}", {HistType::kTH2D, {{100, -6, 6}, {100, -6, 6}}}); histos.add("QAbefore/TOF_Nsigma_allka", "TOF NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Kaon};", {HistType::kTH3D, {{200, 0.0, 20.0}, {100, -6, 6}, {100, 0.0, 100.0}}}); @@ -244,10 +262,10 @@ struct kstarpbpb { histos.add("QAafter/TPC_Nsigma_allka", "TPC NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Kaon};", {HistType::kTH3D, {{200, 0.0, 20.0}, {100, -6, 6}, {100, 0.0, 100.0}}}); // DCA QA - histos.add("QAbefore/trkDCAxypi", "DCAxy distribution of pion track candidates", HistType::kTH1F, {{150, 0.0f, 1.0f}}); - histos.add("QAbefore/trkDCAzpi", "DCAz distribution of pion track candidates", HistType::kTH1F, {{150, 0.0f, 1.0f}}); - histos.add("QAafter/trkDCAxypi", "DCAxy distribution of pion track candidates", HistType::kTH1F, {{150, 0.0f, 1.0f}}); - histos.add("QAafter/trkDCAzpi", "DCAz distribution of pion track candidates", HistType::kTH1F, {{150, 0.0f, 1.0f}}); + histos.add("QAbefore/trkDCAxypi", "DCAxy distribution of pion track candidates", HistType::kTH1F, {{150, -1.0f, 1.0f}}); + histos.add("QAbefore/trkDCAzpi", "DCAz distribution of pion track candidates", HistType::kTH1F, {{150, -1.0f, 1.0f}}); + histos.add("QAafter/trkDCAxypi", "DCAxy distribution of pion track candidates", HistType::kTH1F, {{150, -1.0f, 1.0f}}); + histos.add("QAafter/trkDCAzpi", "DCAz distribution of pion track candidates", HistType::kTH1F, {{150, -1.0f, 1.0f}}); // PID QA before cuts histos.add("QAbefore/TOF_TPC_Mapka_allpi", "TOF + TPC Combined PID for pion;#sigma_{TOF}^{pion};#sigma_{TPC}^{pion}", {HistType::kTH2D, {{100, -6, 6}, {100, -6, 6}}}); histos.add("QAbefore/TOF_Nsigma_allpi", "TOF NSigma for pion;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{pion};", {HistType::kTH3D, {{200, 0.0, 20.0}, {100, -6, 6}, {100, 0.0, 100.0}}}); @@ -492,9 +510,15 @@ struct kstarpbpb { TH2D* hweight; void processSE(EventCandidates::iterator const& collision, TrackCandidates const& tracks, aod::BCsWithTimestamps const&) { + histos.fill(HIST("hEvtSelInfo"), 0.5); + if (rctCut.requireRCTFlagChecker && !rctCut.rctChecker(collision)) { + return; + } + histos.fill(HIST("hEvtSelInfo"), 1.5); if (!collision.sel8() || !collision.triggereventep() || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(aod::evsel::kNoITSROFrameBorder) || !collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV) || !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { return; } + histos.fill(HIST("hEvtSelInfo"), 2.5); auto centrality = collision.centFT0C(); auto multTPC = collision.multNTracksPV(); int occupancy = collision.trackOccupancyInTimeRange(); @@ -504,15 +528,18 @@ struct kstarpbpb { auto QFT0C = collision.qFT0C(); auto QFT0A = collision.qFT0A(); auto QTPC = collision.qTPC(); - if (fillOccupancy && occupancy >= cfgOccupancyCut) { + if (fillOccupancy && occupancy > cfgOccupancyCut) { return; } + histos.fill(HIST("hEvtSelInfo"), 3.5); if (additionalEvsel && !eventSelected(collision, centrality)) { return; } + histos.fill(HIST("hEvtSelInfo"), 4.5); if (additionalEvselITS && !collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { return; } + histos.fill(HIST("hEvtSelInfo"), 5.5); if (additionalQAplots1) { histos.fill(HIST("hFTOCvsTPCSelected"), centrality, multTPC); histos.fill(HIST("hPsiFT0C"), centrality, psiFT0C); @@ -1088,6 +1115,12 @@ struct kstarpbpb { BinningTypeVertexContributor binningOnPositions{{axisVertex, axisMultiplicityClass, axisOccup}, true}; SameKindPair pair{binningOnPositions, cfgNoMixedEvents, -1, collisions, tracksTuple, &cache}; for (auto& [collision1, tracks1, collision2, tracks2] : pair) { + if (rctCut.requireRCTFlagChecker && !rctCut.rctChecker(collision1)) { + continue; + } + if (rctCut.requireRCTFlagChecker && !rctCut.rctChecker(collision2)) { + continue; + } if (!collision1.sel8() || !collision1.triggereventep() || !collision1.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision1.selection_bit(aod::evsel::kNoITSROFrameBorder) || !collision1.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision1.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV) || !collision1.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { continue; } diff --git a/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx b/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx index 425bb69d512..e2224d11e3f 100644 --- a/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx +++ b/PWGLF/Tasks/Resonances/phianalysisrun3_PbPb.cxx @@ -31,6 +31,7 @@ #include #include #include +#include #include "TRandom3.h" #include "Math/Vector3D.h" @@ -63,8 +64,16 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; using std::array; -struct phianalysisrun3_PbPb { +using namespace o2::aod::rctsel; +struct phianalysisrun3_PbPb { + struct : ConfigurableGroup { + Configurable requireRCTFlagChecker{"requireRCTFlagChecker", true, "Check event quality in run condition table"}; + Configurable cfgEvtRCTFlagCheckerLabel{"cfgEvtRCTFlagCheckerLabel", "CBT_hadronPID", "Evt sel: RCT flag checker label"}; + Configurable cfgEvtRCTFlagCheckerZDCCheck{"cfgEvtRCTFlagCheckerZDCCheck", false, "Evt sel: RCT flag checker ZDC check"}; + Configurable cfgEvtRCTFlagCheckerLimitAcceptAsBad{"cfgEvtRCTFlagCheckerLimitAcceptAsBad", true, "Evt sel: RCT flag checker treat Limited Acceptance As Bad"}; + } rctCut; + RCTFlagsChecker rctChecker; HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; // events Configurable cfgCutVertex{"cfgCutVertex", 10.0f, "Accepted z-vertex range"}; @@ -110,12 +119,14 @@ struct phianalysisrun3_PbPb { Configurable avoidsplitrackMC{"avoidsplitrackMC", false, "avoid split track in MC"}; void init(o2::framework::InitContext&) { + rctChecker.init(rctCut.cfgEvtRCTFlagCheckerLabel, rctCut.cfgEvtRCTFlagCheckerZDCCheck, rctCut.cfgEvtRCTFlagCheckerLimitAcceptAsBad); AxisSpec impactParAxis = {binsImpactPar, "Impact Parameter"}; AxisSpec ptAxis = {binsPt, "#it{p}_{T} (GeV/#it{c})"}; AxisSpec centAxis = {binsCent, "V0M (%)"}; histos.add("hCentrality", "Centrality distribution", kTH1F, {{200, 0.0, 200.0}}); histos.add("hVtxZ", "Vertex distribution in Z;Z (cm)", kTH1F, {{400, -20.0, 20.0}}); histos.add("hOccupancy", "Occupancy distribution", kTH1F, {{500, 0, 50000}}); + histos.add("hEvtSelInfo", "hEvtSelInfo", kTH1F, {{10, 0, 10.0}}); if (!isMC) { histos.add("h3PhiInvMassUnlikeSign", "Invariant mass of Phi meson Unlike Sign", kTH3F, {{200, 0.0, 200.0}, {200, 0.0f, 20.0f}, {200, 0.9, 1.1}}); histos.add("h3PhiInvMassMixed", "Invariant mass of Phi meson Mixed", kTH3F, {{200, 0.0, 200.0}, {200, 0.0f, 20.0f}, {200, 0.9, 1.1}}); @@ -168,18 +179,35 @@ struct phianalysisrun3_PbPb { } // DCA QA - histos.add("QAbefore/trkDCAxy", "DCAxy distribution of kaon track candidates", HistType::kTH1F, {{150, 0.0f, 1.0f}}); - histos.add("QAbefore/trkDCAz", "DCAz distribution of kaon track candidates", HistType::kTH1F, {{150, 0.0f, 1.0f}}); - histos.add("QAafter/trkDCAxy", "DCAxy distribution of kaon track candidates", HistType::kTH1F, {{150, 0.0f, 1.0f}}); - histos.add("QAafter/trkDCAz", "DCAz distribution of kaon track candidates", HistType::kTH1F, {{150, 0.0f, 1.0f}}); + // DCA histograms: separate for positive and negative kaons, range [-1.0, 1.0] + histos.add("QAbefore/trkDCAxy_pos", "DCAxy distribution of positive kaon track candidates", HistType::kTH1F, {{150, -1.0f, 1.0f}}); + histos.add("QAbefore/trkDCAxy_neg", "DCAxy distribution of negative kaon track candidates", HistType::kTH1F, {{150, -1.0f, 1.0f}}); + histos.add("QAbefore/trkDCAz_pos", "DCAz distribution of positive kaon track candidates", HistType::kTH1F, {{150, -1.0f, 1.0f}}); + histos.add("QAbefore/trkDCAz_neg", "DCAz distribution of negative kaon track candidates", HistType::kTH1F, {{150, -1.0f, 1.0f}}); + + histos.add("QAafter/trkDCAxy_pos", "DCAxy distribution of positive kaon track candidates", HistType::kTH1F, {{150, -1.0f, 1.0f}}); + histos.add("QAafter/trkDCAxy_neg", "DCAxy distribution of negative kaon track candidates", HistType::kTH1F, {{150, -1.0f, 1.0f}}); + histos.add("QAafter/trkDCAz_pos", "DCAz distribution of positive kaon track candidates", HistType::kTH1F, {{150, -1.0f, 1.0f}}); + histos.add("QAafter/trkDCAz_neg", "DCAz distribution of negative kaon track candidates", HistType::kTH1F, {{150, -1.0f, 1.0f}}); // PID QA before cuts - histos.add("QAbefore/TOF_TPC_Mapka_all", "TOF + TPC Combined PID for Kaon;#sigma_{TOF}^{Kaon};#sigma_{TPC}^{Kaon}", {HistType::kTH2D, {{100, -6, 6}, {100, -6, 6}}}); - histos.add("QAbefore/TOF_Nsigma_all", "TOF NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Kaon};", {HistType::kTH3D, {{200, -12, 12}, {200, 0.0, 200.0}, {200, 0.0f, 20.0f}}}); - histos.add("QAbefore/TPC_Nsigma_all", "TPC NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Kaon};", {HistType::kTH3D, {{200, -12, 12}, {200, 0.0, 200.0}, {200, 0.0f, 20.0f}}}); + histos.add("QAbefore/TOF_TPC_Mapka_all_pos", "TOF + TPC Combined PID for positive Kaon;#sigma_{TOF}^{K^{+}};#sigma_{TPC}^{K^{+}}", {HistType::kTH2D, {{100, -6, 6}, {100, -6, 6}}}); + histos.add("QAbefore/TOF_TPC_Mapka_all_neg", "TOF + TPC Combined PID for negative Kaon;#sigma_{TOF}^{K^{-}};#sigma_{TPC}^{K^{-}}", {HistType::kTH2D, {{100, -6, 6}, {100, -6, 6}}}); + + histos.add("QAbefore/TOF_Nsigma_all_pos", "TOF NSigma for positive Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{K^{+}}", {HistType::kTH3D, {{200, -12, 12}, {200, 0.0, 200.0}, {200, 0.0f, 20.0f}}}); + histos.add("QAbefore/TOF_Nsigma_all_neg", "TOF NSigma for negative Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{K^{-}}", {HistType::kTH3D, {{200, -12, 12}, {200, 0.0, 200.0}, {200, 0.0f, 20.0f}}}); + + histos.add("QAbefore/TPC_Nsigma_all_pos", "TPC NSigma for positive Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{K^{+}}", {HistType::kTH3D, {{200, -12, 12}, {200, 0.0, 200.0}, {200, 0.0f, 20.0f}}}); + histos.add("QAbefore/TPC_Nsigma_all_neg", "TPC NSigma for negative Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{K^{-}}", {HistType::kTH3D, {{200, -12, 12}, {200, 0.0, 200.0}, {200, 0.0f, 20.0f}}}); + // PID QA after cuts - histos.add("QAafter/TOF_TPC_Mapka_all", "TOF + TPC Combined PID for Kaon;#sigma_{TOF}^{Kaon};#sigma_{TPC}^{Kaon}", {HistType::kTH2D, {{100, -6, 6}, {100, -6, 6}}}); - histos.add("QAafter/TOF_Nsigma_all", "TOF NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{Kaon};", {HistType::kTH3D, {{200, -12, 12}, {200, 0.0, 200.0}, {200, 0.0f, 20.0f}}}); - histos.add("QAafter/TPC_Nsigma_all", "TPC NSigma for Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{Kaon};", {HistType::kTH3D, {{200, -12, 12}, {200, 0.0, 200.0}, {200, 0.0f, 20.0f}}}); + histos.add("QAafter/TOF_TPC_Mapka_all_pos", "TOF + TPC Combined PID for positive Kaon;#sigma_{TOF}^{K^{+}};#sigma_{TPC}^{K^{+}}", {HistType::kTH2D, {{100, -6, 6}, {100, -6, 6}}}); + histos.add("QAafter/TOF_TPC_Mapka_all_neg", "TOF + TPC Combined PID for negative Kaon;#sigma_{TOF}^{K^{-}};#sigma_{TPC}^{K^{-}}", {HistType::kTH2D, {{100, -6, 6}, {100, -6, 6}}}); + + histos.add("QAafter/TOF_Nsigma_all_pos", "TOF NSigma for positive Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{K^{+}}", {HistType::kTH3D, {{200, -12, 12}, {200, 0.0, 200.0}, {200, 0.0f, 20.0f}}}); + histos.add("QAafter/TOF_Nsigma_all_neg", "TOF NSigma for negative Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TOF}^{K^{-}}", {HistType::kTH3D, {{200, -12, 12}, {200, 0.0, 200.0}, {200, 0.0f, 20.0f}}}); + + histos.add("QAafter/TPC_Nsigma_all_pos", "TPC NSigma for positive Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{K^{+}}", {HistType::kTH3D, {{200, -12, 12}, {200, 0.0, 200.0}, {200, 0.0f, 20.0f}}}); + histos.add("QAafter/TPC_Nsigma_all_neg", "TPC NSigma for negative Kaon;#it{p}_{T} (GeV/#it{c});#sigma_{TPC}^{K^{-}}", {HistType::kTH3D, {{200, -12, 12}, {200, 0.0, 200.0}, {200, 0.0f, 20.0f}}}); } double massKa = o2::constants::physics::MassKPlus; @@ -314,19 +342,28 @@ struct phianalysisrun3_PbPb { ROOT::Math::PxPyPzMVector PhiMesonMother, KaonPlus, KaonMinus; void processSameEvent(EventCandidates::iterator const& collision, TrackCandidates const& tracks, aod::BCs const&) { + histos.fill(HIST("hEvtSelInfo"), 0.5); + if (rctCut.requireRCTFlagChecker && !rctChecker(collision)) { + return; + } + histos.fill(HIST("hEvtSelInfo"), 1.5); if (!collision.sel8()) { return; } + histos.fill(HIST("hEvtSelInfo"), 2.5); if (additionalEvSel2 && (!collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { return; } + histos.fill(HIST("hEvtSelInfo"), 3.5); if (additionalEvSel3 && (!collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard))) { return; } + histos.fill(HIST("hEvtSelInfo"), 4.5); int occupancy = collision.trackOccupancyInTimeRange(); if (fillOccupancy && (occupancy > cfgCutOccupancy)) { return; } + histos.fill(HIST("hEvtSelInfo"), 5.5); float multiplicity{-1}; if (cfgMultFT0) multiplicity = collision.centFT0C(); @@ -337,11 +374,21 @@ struct phianalysisrun3_PbPb { if (!selectionTrack(track1)) { continue; } - histos.fill(HIST("QAbefore/TPC_Nsigma_all"), track1.tpcNSigmaKa(), multiplicity, track1.pt()); - histos.fill(HIST("QAbefore/TOF_Nsigma_all"), track1.tofNSigmaKa(), multiplicity, track1.pt()); - histos.fill(HIST("QAbefore/trkDCAxy"), track1.dcaXY()); - histos.fill(HIST("QAbefore/trkDCAz"), track1.dcaZ()); - histos.fill(HIST("QAbefore/TOF_TPC_Mapka_all"), track1.tofNSigmaKa(), track1.tpcNSigmaKa()); + int track1Sign = track1.sign(); // or track1.charge(), assuming it returns ±1 + + if (track1Sign > 0) { // Positive kaon + histos.fill(HIST("QAbefore/TPC_Nsigma_all_pos"), track1.tpcNSigmaKa(), multiplicity, track1.pt()); + histos.fill(HIST("QAbefore/TOF_Nsigma_all_pos"), track1.tofNSigmaKa(), multiplicity, track1.pt()); + histos.fill(HIST("QAbefore/trkDCAxy_pos"), track1.dcaXY()); + histos.fill(HIST("QAbefore/trkDCAz_pos"), track1.dcaZ()); + histos.fill(HIST("QAbefore/TOF_TPC_Mapka_all_pos"), track1.tofNSigmaKa(), track1.tpcNSigmaKa()); + } else if (track1Sign < 0) { // Negative kaon + histos.fill(HIST("QAbefore/TPC_Nsigma_all_neg"), track1.tpcNSigmaKa(), multiplicity, track1.pt()); + histos.fill(HIST("QAbefore/TOF_Nsigma_all_neg"), track1.tofNSigmaKa(), multiplicity, track1.pt()); + histos.fill(HIST("QAbefore/trkDCAxy_neg"), track1.dcaXY()); + histos.fill(HIST("QAbefore/trkDCAz_neg"), track1.dcaZ()); + histos.fill(HIST("QAbefore/TOF_TPC_Mapka_all_neg"), track1.tofNSigmaKa(), track1.tpcNSigmaKa()); + } auto track1ID = track1.globalIndex(); for (auto track2 : tracks) { @@ -358,19 +405,42 @@ struct phianalysisrun3_PbPb { bool unlike = true; bool mix = false; if (!ispTdepPID && selectionPID(track1) && selectionPID(track2)) { - histos.fill(HIST("QAafter/TPC_Nsigma_all"), track1.tpcNSigmaKa(), multiplicity, track1.pt()); - histos.fill(HIST("QAafter/TOF_Nsigma_all"), track1.tofNSigmaKa(), multiplicity, track1.pt()); - histos.fill(HIST("QAafter/trkDCAxy"), track1.dcaXY()); - histos.fill(HIST("QAafter/trkDCAz"), track1.dcaZ()); - histos.fill(HIST("QAafter/TOF_TPC_Mapka_all"), track1.tofNSigmaKa(), track1.tpcNSigmaKa()); + int track1Sign = track1.sign(); // Assuming `charge()` gives +1 or -1 + + if (track1Sign > 0) { // Positive kaon + histos.fill(HIST("QAafter/TPC_Nsigma_all_pos"), track1.tpcNSigmaKa(), multiplicity, track1.pt()); + histos.fill(HIST("QAafter/TOF_Nsigma_all_pos"), track1.tofNSigmaKa(), multiplicity, track1.pt()); + histos.fill(HIST("QAafter/trkDCAxy_pos"), track1.dcaXY()); + histos.fill(HIST("QAafter/trkDCAz_pos"), track1.dcaZ()); + histos.fill(HIST("QAafter/TOF_TPC_Mapka_all_pos"), track1.tofNSigmaKa(), track1.tpcNSigmaKa()); + } else if (track1Sign < 0) { // Negative kaon + histos.fill(HIST("QAafter/TPC_Nsigma_all_neg"), track1.tpcNSigmaKa(), multiplicity, track1.pt()); + histos.fill(HIST("QAafter/TOF_Nsigma_all_neg"), track1.tofNSigmaKa(), multiplicity, track1.pt()); + histos.fill(HIST("QAafter/trkDCAxy_neg"), track1.dcaXY()); + histos.fill(HIST("QAafter/trkDCAz_neg"), track1.dcaZ()); + histos.fill(HIST("QAafter/TOF_TPC_Mapka_all_neg"), track1.tofNSigmaKa(), track1.tpcNSigmaKa()); + } + FillinvMass(track1, track2, multiplicity, unlike, mix, massKa, massKa); } + if (ispTdepPID && selectionPIDpTdependent(track1) && selectionPIDpTdependent(track2)) { - histos.fill(HIST("QAafter/TPC_Nsigma_all"), track1.tpcNSigmaKa(), multiplicity, track1.pt()); - histos.fill(HIST("QAafter/TOF_Nsigma_all"), track1.tofNSigmaKa(), multiplicity, track1.pt()); - histos.fill(HIST("QAafter/trkDCAxy"), track1.dcaXY()); - histos.fill(HIST("QAafter/trkDCAz"), track1.dcaZ()); - histos.fill(HIST("QAafter/TOF_TPC_Mapka_all"), track1.tofNSigmaKa(), track1.tpcNSigmaKa()); + int track1Sign = track1.sign(); // Same assumption as above + + if (track1Sign > 0) { // Positive kaon + histos.fill(HIST("QAafter/TPC_Nsigma_all_pos"), track1.tpcNSigmaKa(), multiplicity, track1.pt()); + histos.fill(HIST("QAafter/TOF_Nsigma_all_pos"), track1.tofNSigmaKa(), multiplicity, track1.pt()); + histos.fill(HIST("QAafter/trkDCAxy_pos"), track1.dcaXY()); + histos.fill(HIST("QAafter/trkDCAz_pos"), track1.dcaZ()); + histos.fill(HIST("QAafter/TOF_TPC_Mapka_all_pos"), track1.tofNSigmaKa(), track1.tpcNSigmaKa()); + } else if (track1Sign < 0) { // Negative kaon + histos.fill(HIST("QAafter/TPC_Nsigma_all_neg"), track1.tpcNSigmaKa(), multiplicity, track1.pt()); + histos.fill(HIST("QAafter/TOF_Nsigma_all_neg"), track1.tofNSigmaKa(), multiplicity, track1.pt()); + histos.fill(HIST("QAafter/trkDCAxy_neg"), track1.dcaXY()); + histos.fill(HIST("QAafter/trkDCAz_neg"), track1.dcaZ()); + histos.fill(HIST("QAafter/TOF_TPC_Mapka_all_neg"), track1.tofNSigmaKa(), track1.tpcNSigmaKa()); + } + FillinvMass(track1, track2, multiplicity, unlike, mix, massKa, massKa); } } @@ -385,6 +455,12 @@ struct phianalysisrun3_PbPb { BinningTypeVertexContributor binningOnPositions{{axisVertex, axisMultiplicity}, true}; SameKindPair pair{binningOnPositions, cfgNoMixedEvents, -1, collisions, tracksTuple, &cache}; for (auto& [c1, tracks1, c2, tracks2] : pair) { + if (rctCut.requireRCTFlagChecker && !rctChecker(c1)) { + continue; + } + if (rctCut.requireRCTFlagChecker && !rctChecker(c2)) { + continue; + } if (!c1.sel8()) { continue; } From 0a7abfcee80623d732937ef6686e676bc6315d11 Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Sun, 8 Jun 2025 19:38:31 +0800 Subject: [PATCH 1551/1650] [PWGCF] try to fix on-the-fly process (#11508) --- .../Tasks/diHadronCor.cxx | 114 ++++++++++++------ 1 file changed, 76 insertions(+), 38 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx b/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx index 063cc32378a..4a944a4fff0 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx @@ -76,8 +76,7 @@ struct DiHadronCor { O2_DEFINE_CONFIGURABLE(cfgRadiusHigh, float, 2.5, "High radius for merging cut") O2_DEFINE_CONFIGURABLE(cfgSampleSize, double, 10, "Sample size for mixed event") O2_DEFINE_CONFIGURABLE(cfgCentEstimator, int, 0, "0:FT0C; 1:FT0CVariant1; 2:FT0M; 3:FT0A") - O2_DEFINE_CONFIGURABLE(cfgCentFT0CMin, float, 0.0f, "Minimum centrality (FT0C) to cut events in filter") - O2_DEFINE_CONFIGURABLE(cfgCentFT0CMax, float, 100.0f, "Maximum centrality (FT0C) to cut events in filter") + O2_DEFINE_CONFIGURABLE(cfgCentTableUnavailable, bool, false, "if a dataset does not provide centrality information") O2_DEFINE_CONFIGURABLE(cfgUseAdditionalEventCut, bool, false, "Use additional event cut on mult correlations") O2_DEFINE_CONFIGURABLE(cfgUseTentativeEventCounter, bool, false, "After sel8(), count events regardless of real event selection") O2_DEFINE_CONFIGURABLE(cfgEvSelkNoSameBunchPileup, bool, false, "rejects collisions which are associated with the same found-by-T0 bunch crossing") @@ -98,23 +97,23 @@ struct DiHadronCor { SliceCache cache; ConfigurableAxis axisVertex{"axisVertex", {10, -10, 10}, "vertex axis for histograms"}; - ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100, 120, 140, 160, 180, 200, 220, 240, 260, 280, 300}, "multiplicity axis for histograms"}; - ConfigurableAxis axisCentrality{"axisCentrality", {VARIABLE_WIDTH, 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100}, "centrality axis for histograms"}; - ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.2, 1.4, 1.6, 1.8, 2, 2.5, 3, 4, 5, 6, 8, 10}, "pt axis for histograms"}; + ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 10, 20, 40, 60, 80, 100, 120, 140, 160, 180, 200, 220, 240, 260}, "multiplicity axis for histograms"}; + ConfigurableAxis axisCentrality{"axisCentrality", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100}, "centrality axis for histograms"}; + ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.2, 0.5, 1, 1.5, 2, 3, 4, 6, 10}, "pt axis for histograms"}; ConfigurableAxis axisDeltaPhi{"axisDeltaPhi", {72, -PIHalf, PIHalf * 3}, "delta phi axis for histograms"}; ConfigurableAxis axisDeltaEta{"axisDeltaEta", {48, -2.4, 2.4}, "delta eta axis for histograms"}; - ConfigurableAxis axisPtTrigger{"axisPtTrigger", {VARIABLE_WIDTH, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.2, 1.4, 1.6, 1.8, 2, 2.5, 3, 4, 5, 6, 8, 10}, "pt trigger axis for histograms"}; - ConfigurableAxis axisPtAssoc{"axisPtAssoc", {VARIABLE_WIDTH, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.2, 1.4, 1.6, 1.8, 2, 2.5, 3, 4, 5, 6, 8, 10}, "pt associated axis for histograms"}; + ConfigurableAxis axisPtTrigger{"axisPtTrigger", {VARIABLE_WIDTH, 0.2, 0.5, 1, 1.5, 2, 3, 4, 6, 10}, "pt trigger axis for histograms"}; + ConfigurableAxis axisPtAssoc{"axisPtAssoc", {VARIABLE_WIDTH, 0.2, 0.5, 1, 1.5, 2, 3, 4, 6, 10}, "pt associated axis for histograms"}; ConfigurableAxis axisVtxMix{"axisVtxMix", {VARIABLE_WIDTH, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "vertex axis for mixed event histograms"}; - ConfigurableAxis axisMultMix{"axisMultMix", {VARIABLE_WIDTH, 0, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100, 120, 140, 160, 180, 200, 220, 240, 260, 280, 300}, "multiplicity / centrality axis for mixed event histograms"}; + ConfigurableAxis axisMultMix{"axisMultMix", {VARIABLE_WIDTH, 0, 10, 20, 40, 60, 80, 100, 120, 140, 160, 180, 200, 220, 240, 260}, "multiplicity / centrality axis for mixed event histograms"}; ConfigurableAxis axisSample{"axisSample", {cfgSampleSize, 0, cfgSampleSize}, "sample axis for histograms"}; ConfigurableAxis axisVertexEfficiency{"axisVertexEfficiency", {10, -10, 10}, "vertex axis for efficiency histograms"}; ConfigurableAxis axisEtaEfficiency{"axisEtaEfficiency", {20, -1.0, 1.0}, "eta axis for efficiency histograms"}; - ConfigurableAxis axisPtEfficiency{"axisPtEfficiency", {VARIABLE_WIDTH, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.2, 1.4, 1.6, 1.8, 2, 2.5, 3, 4, 5, 6, 8, 10}, "pt axis for efficiency histograms"}; + ConfigurableAxis axisPtEfficiency{"axisPtEfficiency", {VARIABLE_WIDTH, 0.2, 0.5, 1, 1.5, 2, 3, 4, 6, 10}, "pt axis for efficiency histograms"}; // make the filters and cuts. - Filter collisionFilter = (nabs(aod::collision::posZ) < cfgCutVtxZ) && (aod::evsel::sel8) == true && (aod::cent::centFT0C > cfgCentFT0CMin) && (aod::cent::centFT0C < cfgCentFT0CMax); + Filter collisionFilter = (nabs(aod::collision::posZ) < cfgCutVtxZ); Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtMin) && (aod::track::pt < cfgCutPtMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls) && (nabs(aod::track::dcaZ) < cfgCutDCAz); using FilteredCollisions = soa::Filtered>; using FilteredTracks = soa::Filtered>; @@ -128,7 +127,7 @@ struct DiHadronCor { Filter mccollisionFilter = nabs(aod::mccollision::posZ) < cfgCutVtxZ; using FilteredMcCollisions = soa::Filtered; - using FilteredSmallGroupMcCollisions = soa::SmallGroups>; + using SmallGroupMcCollisions = soa::SmallGroups>; Preslice perCollision = aod::track::collisionId; PresliceUnsorted collisionPerMCCollision = aod::mccollisionlabel::mcCollisionId; @@ -171,13 +170,14 @@ struct DiHadronCor { void init(InitContext&) { + if (cfgCentTableUnavailable && !cfgSelCollByNch) { + LOGF(fatal, "Centrality table is unavailable, cannot select collisions by centrality"); + } const AxisSpec axisPhi{72, 0.0, constants::math::TwoPI, "#varphi"}; const AxisSpec axisEta{40, -1., 1., "#eta"}; ccdb->setURL("http://alice-ccdb.cern.ch"); ccdb->setCaching(true); - ccdb->setLocalObjectValidityChecking(); - auto now = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); ccdb->setCreatedNotAfter(now); @@ -325,6 +325,24 @@ struct DiHadronCor { return ((track.tpcNClsFound() >= cfgCutTPCclu) && (track.itsNCls() >= cfgCutITSclu)); } + template + bool genTrackSelected(TTrack track) + { + if (!track.isPhysicalPrimary()) { + return false; + } + if (!track.producedByGenerator()) { + return false; + } + if (std::abs(track.eta()) > cfgCutEta) { + return false; + } + if (std::abs(track.pt()) < cfgCutPtMin || std::abs(track.pt()) > cfgCutPtMax) { + return false; + } + return true; + } + void loadEfficiency(uint64_t timestamp) { if (correctionsLoaded) { @@ -420,7 +438,8 @@ struct DiHadronCor { } if (system == SameEvent) { - registry.fill(HIST("Centrality_used"), cent); + if (!cfgCentTableUnavailable) + registry.fill(HIST("Centrality_used"), cent); registry.fill(HIST("Nch_used"), tracks1.size()); } @@ -499,14 +518,18 @@ struct DiHadronCor { for (auto const& track1 : tracks1) { if (step >= CorrelationContainer::kCFStepTrackedOnlyPrim && !track1.isPhysicalPrimary()) continue; + if (doprocessOntheflySame && !genTrackSelected(track1)) + continue; - if (system == SameEvent && doprocessMCSame) + if (system == SameEvent && (doprocessMCSame || doprocessOntheflySame)) registry.fill(HIST("MCTrue/MCTrig_hist"), fSampleIndex, posZ, track1.pt(), triggerWeight); for (auto const& track2 : tracks2) { if (step >= CorrelationContainer::kCFStepTrackedOnlyPrim && !track2.isPhysicalPrimary()) continue; + if (doprocessOntheflyMixed && !genTrackSelected(track2)) + continue; if (track1.pt() <= track2.pt()) continue; // skip if the trigger pt is less than the associate pt @@ -517,11 +540,11 @@ struct DiHadronCor { // fill the right sparse and histograms if (system == SameEvent) { same->getPairHist()->Fill(step, fSampleIndex, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta, triggerWeight * associatedWeight); - if (doprocessMCSame) + if (doprocessMCSame || doprocessOntheflySame) registry.fill(HIST("MCTrue/MCdeltaEta_deltaPhi_same"), deltaPhi, deltaEta, triggerWeight * associatedWeight); } else if (system == MixedEvent) { mixed->getPairHist()->Fill(step, fSampleIndex, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta, triggerWeight * associatedWeight); - if (doprocessMCMixed) + if (doprocessMCMixed || doprocessOntheflyMixed) registry.fill(HIST("MCTrue/MCdeltaEta_deltaPhi_mixed"), deltaPhi, deltaEta, triggerWeight * associatedWeight); } } @@ -603,20 +626,24 @@ struct DiHadronCor { void processSame(FilteredCollisions::iterator const& collision, FilteredTracks const& tracks, aod::BCsWithTimestamps const&) { - + if (!collision.sel8()) + return; auto bc = collision.bc_as(); - float cent = getCentrality(collision); + float cent = -1.; + if (!cfgCentTableUnavailable) + cent = getCentrality(collision); if (cfgUseAdditionalEventCut && !eventSelected(collision, tracks.size(), cent, true)) return; - registry.fill(HIST("Centrality"), cent); + if (!cfgCentTableUnavailable) + registry.fill(HIST("Centrality"), cent); registry.fill(HIST("Nch"), tracks.size()); registry.fill(HIST("zVtx"), collision.posZ()); if (cfgSelCollByNch && (tracks.size() < cfgCutMultMin || tracks.size() >= cfgCutMultMax)) { return; } - if (!cfgSelCollByNch && (cent < cfgCutCentMin || cent >= cfgCutCentMax)) { + if (!cfgSelCollByNch && !cfgCentTableUnavailable && (cent < cfgCutCentMin || cent >= cfgCutCentMax)) { return; } @@ -646,6 +673,8 @@ struct DiHadronCor { auto tracksTuple = std::make_tuple(tracks, tracks); Pair pair{binningOnVtxAndMult, cfgMixEventNumMin, -1, collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip for (auto const& [collision1, tracks1, collision2, tracks2] : pair) { + if (!collision1.sel8() || !collision2.sel8()) + continue; if (cfgSelCollByNch && (tracks1.size() < cfgCutMultMin || tracks1.size() >= cfgCutMultMax)) continue; @@ -653,17 +682,21 @@ struct DiHadronCor { if (cfgSelCollByNch && (tracks2.size() < cfgCutMultMin || tracks2.size() >= cfgCutMultMax)) continue; - float cent1 = getCentrality(collision1); - float cent2 = getCentrality(collision2); + float cent1 = -1; + float cent2 = -1; + if (!cfgCentTableUnavailable) { + cent1 = getCentrality(collision1); + cent2 = getCentrality(collision2); + } if (cfgUseAdditionalEventCut && !eventSelected(collision1, tracks1.size(), cent1, false)) continue; if (cfgUseAdditionalEventCut && !eventSelected(collision2, tracks2.size(), cent2, false)) continue; - if (!cfgSelCollByNch && (cent1 < cfgCutCentMin || cent1 >= cfgCutCentMax)) + if (!cfgSelCollByNch && !cfgCentTableUnavailable && (cent1 < cfgCutCentMin || cent1 >= cfgCutCentMax)) continue; - if (!cfgSelCollByNch && (cent2 < cfgCutCentMin || cent2 >= cfgCutCentMax)) + if (!cfgSelCollByNch && !cfgCentTableUnavailable && (cent2 < cfgCutCentMin || cent2 >= cfgCutCentMax)) continue; registry.fill(HIST("eventcount"), MixedEvent); // fill the mixed event in the 3 bin @@ -724,26 +757,29 @@ struct DiHadronCor { } PROCESS_SWITCH(DiHadronCor, processMCEfficiency, "MC: Extract efficiencies", false); - void processMCSame(FilteredMcCollisions::iterator const& mcCollision, FilteredMcParticles const& mcParticles, FilteredSmallGroupMcCollisions const& collisions) + void processMCSame(FilteredMcCollisions::iterator const& mcCollision, FilteredMcParticles const& mcParticles, SmallGroupMcCollisions const& collisions) { if (cfgVerbosity) { LOGF(info, "processMCSame. MC collision: %d, particles: %d, collisions: %d", mcCollision.globalIndex(), mcParticles.size(), collisions.size()); } float cent = -1; - for (const auto& collision : collisions) { - cent = getCentrality(collision); + if (!cfgCentTableUnavailable) { + for (const auto& collision : collisions) { + cent = getCentrality(collision); + } } if (cfgSelCollByNch && (mcParticles.size() < cfgCutMultMin || mcParticles.size() >= cfgCutMultMax)) { return; } - if (!cfgSelCollByNch && (cent < cfgCutCentMin || cent >= cfgCutCentMax)) { + if (!cfgSelCollByNch && !cfgCentTableUnavailable && (cent < cfgCutCentMin || cent >= cfgCutCentMax)) { return; } registry.fill(HIST("MCTrue/MCeventcount"), SameEvent); // because its same event i put it in the 1 bin - registry.fill(HIST("MCTrue/MCCentrality"), cent); + if (!cfgCentTableUnavailable) + registry.fill(HIST("MCTrue/MCCentrality"), cent); registry.fill(HIST("MCTrue/MCNch"), mcParticles.size()); registry.fill(HIST("MCTrue/MCzVtx"), mcCollision.posZ()); for (const auto& mcParticle : mcParticles) { @@ -766,7 +802,7 @@ struct DiHadronCor { } PROCESS_SWITCH(DiHadronCor, processMCSame, "Process MC same event", false); - void processMCMixed(FilteredMcCollisions const& mcCollisions, FilteredMcParticles const& mcParticles, FilteredSmallGroupMcCollisions const& collisions) + void processMCMixed(FilteredMcCollisions const& mcCollisions, FilteredMcParticles const& mcParticles, SmallGroupMcCollisions const& collisions) { auto getTracksSize = [&mcParticles, this](FilteredMcCollisions::iterator const& mcCollision) { auto associatedTracks = mcParticles.sliceByCached(o2::aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), this->cache); @@ -793,11 +829,13 @@ struct DiHadronCor { LOGF(info, "Found %d related collisions", groupedCollisions.size()); } float cent = -1; - for (const auto& collision : groupedCollisions) { - cent = getCentrality(collision); + if (!cfgCentTableUnavailable) { + for (const auto& collision : groupedCollisions) { + cent = getCentrality(collision); + } } - if (!cfgSelCollByNch && groupedCollisions.size() != 0 && (cent < cfgCutCentMin || cent >= cfgCutCentMax)) + if (!cfgSelCollByNch && !cfgCentTableUnavailable && groupedCollisions.size() != 0 && (cent < cfgCutCentMin || cent >= cfgCutCentMax)) continue; registry.fill(HIST("MCTrue/MCeventcount"), MixedEvent); // fill the mixed event in the 3 bin @@ -813,7 +851,7 @@ struct DiHadronCor { } PROCESS_SWITCH(DiHadronCor, processMCMixed, "Process MC mixed events", false); - void processOntheflySame(FilteredMcCollisions::iterator const& mcCollision, FilteredMcParticles const& mcParticles) + void processOntheflySame(aod::McCollisions::iterator const& mcCollision, aod::McParticles const& mcParticles) { if (cfgVerbosity) { LOGF(info, "processOntheflySame. MC collision: %d, particles: %d", mcCollision.globalIndex(), mcParticles.size()); @@ -842,9 +880,9 @@ struct DiHadronCor { } PROCESS_SWITCH(DiHadronCor, processOntheflySame, "Process on-the-fly same event", false); - void processOntheflyMixed(FilteredMcCollisions const& mcCollisions, FilteredMcParticles const& mcParticles) + void processOntheflyMixed(aod::McCollisions const& mcCollisions, aod::McParticles const& mcParticles) { - auto getTracksSize = [&mcParticles, this](FilteredMcCollisions::iterator const& mcCollision) { + auto getTracksSize = [&mcParticles, this](aod::McCollisions::iterator const& mcCollision) { auto associatedTracks = mcParticles.sliceByCached(o2::aod::mcparticle::mcCollisionId, mcCollision.globalIndex(), this->cache); auto mult = associatedTracks.size(); return mult; @@ -855,7 +893,7 @@ struct DiHadronCor { MixedBinning binningOnVtxAndMult{{getTracksSize}, {axisVtxMix, axisMultMix}, true}; auto tracksTuple = std::make_tuple(mcParticles, mcParticles); - Pair pair{binningOnVtxAndMult, cfgMixEventNumMin, -1, mcCollisions, tracksTuple, &cache}; // -1 is the number of the bin to skip + Pair pair{binningOnVtxAndMult, cfgMixEventNumMin, -1, mcCollisions, tracksTuple, &cache}; // -1 is the number of the bin to skip for (auto const& [collision1, tracks1, collision2, tracks2] : pair) { if (cfgSelCollByNch && (tracks1.size() < cfgCutMultMin || tracks1.size() >= cfgCutMultMax)) From c40ee82831bf30ca995d05c593695d771c2bed19 Mon Sep 17 00:00:00 2001 From: chengtt0406 <39661669+chengtt0406@users.noreply.github.com> Date: Mon, 9 Jun 2025 01:47:36 +0800 Subject: [PATCH 1552/1650] [PWGHF] reset decayChannel=1 (#11511) --- PWGHF/TableProducer/treeCreatorOmegacSt.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/PWGHF/TableProducer/treeCreatorOmegacSt.cxx b/PWGHF/TableProducer/treeCreatorOmegacSt.cxx index 5792492c39c..8d2780cd435 100644 --- a/PWGHF/TableProducer/treeCreatorOmegacSt.cxx +++ b/PWGHF/TableProducer/treeCreatorOmegacSt.cxx @@ -369,6 +369,7 @@ struct HfTreeCreatorOmegacSt { } else if (idxKaonDaughter >= 0 && idxCascDaughter >= 0) { decayChannel = o2::aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaK; // OmegaC -> Omega + K } else { + decayChannel = -1; LOG(warning) << "Decay channel not recognized!"; } if (decayChannel != -1) { From d194bb737ce9d8e8bc5c2b79c290fe31f2fcb086 Mon Sep 17 00:00:00 2001 From: Evgeny Kryshen Date: Mon, 9 Jun 2025 14:07:23 +0300 Subject: [PATCH 1553/1650] [Common] Setting processRun2 to true by default (#11514) --- Common/TableProducer/eventSelection.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Common/TableProducer/eventSelection.cxx b/Common/TableProducer/eventSelection.cxx index b06e98b84c5..3c989f1848a 100644 --- a/Common/TableProducer/eventSelection.cxx +++ b/Common/TableProducer/eventSelection.cxx @@ -1223,7 +1223,7 @@ struct LumiTask { LOGP(debug, "Dummy process function for Run 2"); } - PROCESS_SWITCH(LumiTask, processRun2, "Process Run2 lumi task", false); + PROCESS_SWITCH(LumiTask, processRun2, "Process Run2 lumi task", true); void processRun3(BCsWithBcSelsRun3 const& bcs, aod::FT0s const&) { From e917f4e8f1fa80fc482f77d373f59dd2e0225bb7 Mon Sep 17 00:00:00 2001 From: basiach <74355517+basiach@users.noreply.github.com> Date: Mon, 9 Jun 2025 14:33:33 +0200 Subject: [PATCH 1554/1650] [PWGCF] FemtoUniverse - Adding centrality for MC cascades and a PDG histogram (#11517) Co-authored-by: Barbara Chytla --- .../femtoUniverseProducerTask.cxx | 41 +++++++++++++++++++ .../Tasks/femtoUniverseEfficiencyBase.cxx | 6 +++ ...toUniversePairTaskTrackCascadeExtended.cxx | 7 +++- 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx index 00ed3161ce7..e9a07329468 100644 --- a/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx +++ b/PWGCF/FemtoUniverse/TableProducer/femtoUniverseProducerTask.cxx @@ -2336,6 +2336,47 @@ struct FemtoUniverseProducerTask { } PROCESS_SWITCH(FemtoUniverseProducerTask, processTruthAndFullMCCasc, "Provide both MC truth and reco for tracks and Cascades", false); + void processTruthAndFullMCCentRun3Casc( + aod::McCollisions const& mccols, + aod::McParticles const& mcParticles, + aod::FemtoFullCollisionCentRun3MCs const& collisions, + soa::Filtered> const& tracks, + soa::Join const& fullCascades, + aod::BCsWithTimestamps const&) + { + + // recos + std::set recoMcIds; + for (const auto& col : collisions) { + auto groupedTracks = tracks.sliceBy(perCollisionTracks, col.globalIndex()); + auto groupedCascParts = fullCascades.sliceBy(perCollisionCascs, col.globalIndex()); + getMagneticFieldTesla(col.bc_as()); + const auto colcheck = fillCollisionsCentRun3(col); + if (colcheck) { + fillTracks(groupedTracks); + fillCascade(col, groupedCascParts, groupedTracks); + } + for (const auto& track : groupedTracks) { + if (trackCuts.isSelectedMinimal(track)) + recoMcIds.insert(track.mcParticleId()); + } + } + + // truth + for (const auto& mccol : mccols) { + auto groupedCollisions = collisions.sliceBy(recoCollsPerMCCollCentPbPb, mccol.globalIndex()); + for (const auto& col : groupedCollisions) { + const auto colcheck = fillMCTruthCollisionsCentRun3(col); // fills the reco collisions for mc collision + if (colcheck) { + auto groupedMCParticles = mcParticles.sliceBy(perMCCollision, mccol.globalIndex()); + outputCollExtra(1.0, 1.0); + fillParticles(groupedMCParticles, recoMcIds); // fills mc particles + } + } + } + } + PROCESS_SWITCH(FemtoUniverseProducerTask, processTruthAndFullMCCentRun3Casc, "Provide both MC truth and reco for tracks and cascades with centrality", false); + Preslice> perCollisionD0s = aod::track::collisionId; void processTrackD0MC(aod::McCollisions const& mccols, aod::TracksWMc const&, diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniverseEfficiencyBase.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniverseEfficiencyBase.cxx index 92e42134f0a..5397acf05dc 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniverseEfficiencyBase.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniverseEfficiencyBase.cxx @@ -160,6 +160,7 @@ struct FemtoUniverseEfficiencyBase { trackHistoPartOneRec.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarDCABins, 0, confPDGCodePartOne, confIsDebug); registryMCOrigin.add("part1/hPt", " ;#it{p}_{T} (GeV/c); Entries", {HistType::kTH1F, {{240, 0, 6}}}); registryPDG.add("part1/PDGvspT", "PDG;#it{p}_{T} (GeV/c); PDG", {HistType::kTH2F, {{500, 0, 5}, {16001, -8000.5, 8000.5}}}); + registryPDG.add("part1/PDGvspTall", "PDG;#it{p}_{T} (GeV/c); PDG", {HistType::kTH2F, {{500, 0, 5}, {16001, -8000.5, 8000.5}}}); if (confParticleTypePartOne == uint8_t(aod::femtouniverseparticle::ParticleType::kV0)) { trackHistoV0OneRec.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarCPABins, 0, confPDGCodePartOne, confIsDebug); trackHistoV0OneChildPosRec.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarDCABins, 0, 0, confIsDebug, "posChildV0_1"); @@ -169,6 +170,7 @@ struct FemtoUniverseEfficiencyBase { } registryPDG.add("part2/PDGvspT", "PDG;#it{p}_{T} (GeV/c); PDG", {HistType::kTH2F, {{500, 0, 5}, {16001, -8000.5, 8000.5}}}); + registryPDG.add("part2/PDGvspTall", "PDG;#it{p}_{T} (GeV/c); PDG", {HistType::kTH2F, {{500, 0, 5}, {16001, -8000.5, 8000.5}}}); if (!confIsSame) { trackHistoPartTwoGen.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarPDGBins, 0, confPDGCodePartTwo, false); trackHistoPartTwoRec.init(&qaRegistry, confTempFitVarpTBins, confTempFitVarDCABins, 0, confPDGCodePartTwo, confIsDebug); @@ -373,6 +375,8 @@ struct FemtoUniverseEfficiencyBase { continue; } + registryPDG.fill(HIST("part1/PDGvspTall"), part.pt(), mcParticle.pdgMCTruth()); + if (!(std::abs(mcParticle.pdgMCTruth()) == std::abs(confPDGCodePartOne))) { continue; } @@ -397,6 +401,8 @@ struct FemtoUniverseEfficiencyBase { continue; } + registryPDG.fill(HIST("part2/PDGvspTall"), part.pt(), mcParticle.pdgMCTruth()); + if (!(std::abs(mcParticle.pdgMCTruth()) == std::abs(confPDGCodePartTwo))) { continue; } diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx index e4ebe2db60a..026cabb1367 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx @@ -631,6 +631,8 @@ struct femtoUniversePairTaskTrackCascadeExtended { // MC truth void processSameEventMCgen(const FilteredFDCollision& col, [[maybe_unused]] const FemtoFullParticles& parts) { + const int multCol = confUseCent ? col.multV0M() : col.multNtr(); + auto groupPartsOne = partsOneMCgen->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); auto groupPartsTwo = partsTwoMCgen->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); @@ -665,7 +667,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { int pdgCodeCasc = static_cast(p2.pidCut()); if ((confCascType1 == 0 && pdgCodeCasc != 3334) || (confCascType1 == 2 && pdgCodeCasc != -3334) || (confCascType1 == 1 && pdgCodeCasc != 3312) || (confCascType1 == 3 && pdgCodeCasc != -3312)) continue; - sameEventCont.setPair(p1, p2, col.multNtr(), confUse3D, 1.0f); + sameEventCont.setPair(p1, p2, multCol, confUse3D, 1.0f); } } } @@ -676,6 +678,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { ColumnBinningPolicy colBinning{{confVtxBins, confMultBins}, true}; for (const auto& [collision1, collision2] : soa::selfCombinations(colBinning, 5, -1, cols, cols)) { + const int multCol = confUseCent ? collision1.multV0M() : collision1.multNtr(); auto groupPartsOne = partsOneMCgen->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision1.globalIndex(), cache); auto groupPartsTwo = partsTwoMCgen->sliceByCached(aod::femtouniverseparticle::fdCollisionId, collision2.globalIndex(), cache); @@ -692,7 +695,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { int pdgCodeCasc = static_cast(p2.pidCut()); if ((confCascType1 == 0 && pdgCodeCasc != 3334) || (confCascType1 == 2 && pdgCodeCasc != -3334) || (confCascType1 == 1 && pdgCodeCasc != 3312) || (confCascType1 == 3 && pdgCodeCasc != -3312)) continue; - mixedEventCont.setPair(p1, p2, collision1.multNtr(), confUse3D, 1.0f); + mixedEventCont.setPair(p1, p2, multCol, confUse3D, 1.0f); } } } From 48b40e6d4e3543f5f355d036740a957b5bfecad5 Mon Sep 17 00:00:00 2001 From: Rahul Verma <110929992+rahulverma012@users.noreply.github.com> Date: Mon, 9 Jun 2025 20:26:52 +0530 Subject: [PATCH 1555/1650] [Common] modified aod::TracksQA_002 to aod::TracksQAVersion (#11485) Co-authored-by: Anton Alkin --- Common/TableProducer/occupancyTableProducer.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Common/TableProducer/occupancyTableProducer.cxx b/Common/TableProducer/occupancyTableProducer.cxx index 2e4a01ddbb1..95d1ca72dea 100644 --- a/Common/TableProducer/occupancyTableProducer.cxx +++ b/Common/TableProducer/occupancyTableProducer.cxx @@ -1692,7 +1692,7 @@ struct TrackMeanOccTableProducer { } } - using MyTracksQA = aod::TracksQA_002; + using MyTracksQA = aod::TracksQAVersion; // using MyTracksQA = aod::TracksQA_002; // Process the Data int dfCount = 0; From a6b800e16aa8038bbc821e7926e307a1ded800cd Mon Sep 17 00:00:00 2001 From: Pritam Chakraborty <47203359+prchakra@users.noreply.github.com> Date: Mon, 9 Jun 2025 21:23:33 +0200 Subject: [PATCH 1556/1650] [PWGCF] FemtoUniverse: Fine binning the helicity angle distribution (#11521) --- PWGCF/FemtoUniverse/Tasks/femtoUniverseDebugV0.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniverseDebugV0.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniverseDebugV0.cxx index d35aa3fa779..fe1bf2e7983 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniverseDebugV0.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniverseDebugV0.cxx @@ -85,7 +85,7 @@ struct FemtoUniverseDebugV0 { negativeChildHistos.init(&V0Registry, confChildTempFitVarpTBins, confChildTempFitVarBins, false, confPDGCodeNegativeChild, true); V0Histos.init(&V0Registry, confV0TempFitVarpTBins, confV0TempFitVarBins, false, confPDGCodeV0.value, true); - thetaRegistry.add("Theta/hTheta", " ; p (GeV/#it{c}); cos(#theta)", kTH2F, {{100, 0, 10}, {50, -5, 5}}); + thetaRegistry.add("Theta/hTheta", " ; p (GeV/#it{c}); cos(#theta)", kTH2F, {{100, 0, 10}, {110, -1.1, 1.1}}); } /// Produce QA plots for V0 selection in FemtoUniverse framework From 93cfd0f116c7120b9ff14ce9938c354125993ce2 Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Mon, 9 Jun 2025 22:09:34 +0200 Subject: [PATCH 1557/1650] [PWGLF] Improve variable selection in mixed event (#11522) --- .../Tasks/Strangeness/taskLambdaSpinCorr.cxx | 135 +++++++++++------- 1 file changed, 87 insertions(+), 48 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx index 9badfb4b4ba..0472e380aed 100644 --- a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx +++ b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx @@ -61,8 +61,8 @@ struct LfTaskLambdaSpinCorr { Configurable cfgEvtRCTFlagCheckerLimitAcceptAsBad{"cfgEvtRCTFlagCheckerLimitAcceptAsBad", true, "Evt sel: RCT flag checker treat Limited Acceptance As Bad"}; } rctCut; // mixing - Configurable cosCalculation{"cosCalculation", 1, "cos calculation"}; - Configurable mixingCombination{"mixingCombination", 1, "mixing Combination"}; + Configurable cosCalculation{"cosCalculation", 0, "cos calculation"}; + Configurable mixingCombination{"mixingCombination", 0, "mixing Combination"}; Configurable mixingEvSel{"mixingEvSel", false, "mixingEvSel"}; Configurable cfgCutOccupancy{"cfgCutOccupancy", 2000, "Occupancy cut"}; ConfigurableAxis axisVertex{"axisVertex", {5, -10, 10}, "vertex axis for bin"}; @@ -128,7 +128,8 @@ struct LfTaskLambdaSpinCorr { AxisSpec thnAxisInvMasspair{iMNbinspair, lbinIMpair, hbinIMpair, "#it{M} (GeV/#it{c}^{2})"}; histos.add("hEvtSelInfo", "hEvtSelInfo", kTH1F, {{10, 0, 10.0}}); histos.add("hPtDiff", "hPtDiff", kTH1F, {{1000, 0, 100.0}}); - histos.add("hRDiff", "hRDiff", kTH1F, {{640, 0, 16.0}}); + histos.add("hPhiDiff", "hPhiDiff", kTH1F, {{800, -8.0, 8.0}}); + histos.add("hRDiff", "hRDiff", kTH1F, {{640, -16.0, 16.0}}); histos.add("hv0Mult", "hv0Mult", kTH1F, {{10001, -0.5, 10000.5}}); histos.add("hCentrality", "Centrality distribution", kTH1F, {{configcentAxis}}); histos.add("hSparseLambdaLambda", "hSparseLambdaLambda", HistType::kTHnSparseF, {thnAxisInvMass, thnAxisInvMass, configthnAxisPol, configcentAxis, thnAxisInvMasspair}, true); @@ -244,8 +245,8 @@ struct LfTaskLambdaSpinCorr { const ROOT::Math::PxPyPzMVector& Lambdadummy, const ROOT::Math::PxPyPzMVector& AntiLambdadummy) { - const double minMass = 1.0; - const double maxMass = 2.0; + const double minMass = 1.09; + const double maxMass = 1.14; return (lambdaTag && aLambdaTag && (Lambdadummy.M() > minMass && Lambdadummy.M() < maxMass) && (AntiLambdadummy.M() > minMass && AntiLambdadummy.M() < maxMass)); @@ -293,8 +294,8 @@ struct LfTaskLambdaSpinCorr { double cosTheta2 = proton2LambdaRF.Vect().Unit().Dot(quantizationAxis); cosThetaDiff = cosTheta1 * cosTheta2; } - - double deltaR = TMath::Sqrt(TMath::Power(particle1.Eta() - particle2.Eta(), 2.0) + TMath::Power(particle1.Phi() - particle2.Phi(), 2.0)); + double deltaPhi = RecoDecay::constrainAngle(particle1.Phi() - particle2.Phi(), 0.0); + double deltaR = TMath::Sqrt(TMath::Power(particle1.Eta() - particle2.Eta(), 2.0) + TMath::Power(deltaPhi, 2.0)); if (datatype == 0) { if (tag1 && tag3) { histos.fill(HIST("hSparseLambdaLambda"), particle1.M(), particle2.M(), cosThetaDiff, centrality, deltaR); @@ -411,7 +412,7 @@ struct LfTaskLambdaSpinCorr { return {lambdaTag, aLambdaTag, true}; // Valid candidate } - + ROOT::Math::PxPyPzMVector lambda0, antiLambda0, proton0, pion0, antiProton0, antiPion0; ROOT::Math::PxPyPzMVector lambda, antiLambda, proton, pion, antiProton, antiPion; ROOT::Math::PxPyPzMVector lambda2, antiLambda2, proton2, pion2, antiProton2, antiPion2; ROOT::Math::PxPyPzMVector lambdamc, antiLambdamc, protonmc, pionmc, antiProtonmc, antiPionmc; @@ -478,7 +479,12 @@ struct LfTaskLambdaSpinCorr { pion = ROOT::Math::PxPyPzMVector(v0.pxpos(), v0.pypos(), v0.pzpos(), o2::constants::physics::MassPionCharged); antiLambda = antiProton + pion; } - + if (lambdaTag && (lambda.M() < lbinIM || lambda.M() > hbinIM)) { + continue; + } + if (aLambdaTag && (antiLambda.M() < lbinIM || antiLambda.M() > hbinIM)) { + continue; + } auto postrack1 = v0.template posTrack_as(); auto negtrack1 = v0.template negTrack_as(); @@ -504,6 +510,12 @@ struct LfTaskLambdaSpinCorr { pion2 = ROOT::Math::PxPyPzMVector(v02.pxpos(), v02.pypos(), v02.pzpos(), o2::constants::physics::MassPionCharged); antiLambda2 = antiProton2 + pion2; } + if (lambdaTag2 && (lambda2.M() < lbinIM || lambda2.M() > hbinIM)) { + continue; + } + if (aLambdaTag2 && (antiLambda2.M() < lbinIM || antiLambda2.M() > hbinIM)) { + continue; + } auto postrack2 = v02.template posTrack_as(); auto negtrack2 = v02.template negTrack_as(); if (postrack1.globalIndex() == postrack2.globalIndex() || negtrack1.globalIndex() == negtrack2.globalIndex()) { @@ -630,8 +642,42 @@ struct LfTaskLambdaSpinCorr { if (postrack1.globalIndex() == postrack2.globalIndex() || negtrack1.globalIndex() == negtrack2.globalIndex()) { continue; } - auto samePairSumPt = t1.pt() + t2.pt(); - auto samePairR = TMath::Sqrt(TMath::Power(t1.phi() - t2.phi(), 2.0) + TMath::Power(t1.eta() - t2.eta(), 2.0)); + // auto samePairSumPt = t1.pt() + t2.pt(); + double deltaPhiSame = RecoDecay::constrainAngle(t1.phi() - t2.phi(), 0.0); + auto samePairR = TMath::Sqrt(TMath::Power(deltaPhiSame, 2.0) + TMath::Power(t1.eta() - t2.eta(), 2.0)); + + if (lambdaTag1) { + proton0 = ROOT::Math::PxPyPzMVector(t1.pxpos(), t1.pypos(), t1.pzpos(), o2::constants::physics::MassProton); + antiPion0 = ROOT::Math::PxPyPzMVector(t1.pxneg(), t1.pyneg(), t1.pzneg(), o2::constants::physics::MassPionCharged); + lambda0 = proton0 + antiPion0; + } + if (aLambdaTag1) { + antiProton0 = ROOT::Math::PxPyPzMVector(t1.pxneg(), t1.pyneg(), t1.pzneg(), o2::constants::physics::MassProton); + pion0 = ROOT::Math::PxPyPzMVector(t1.pxpos(), t1.pypos(), t1.pzpos(), o2::constants::physics::MassPionCharged); + antiLambda0 = antiProton0 + pion0; + } + if (lambdaTag1 && (lambda0.M() < lbinIM || lambda0.M() > hbinIM)) { + continue; + } + if (aLambdaTag1 && (antiLambda0.M() < lbinIM || antiLambda0.M() > hbinIM)) { + continue; + } + if (lambdaTag2) { + proton = ROOT::Math::PxPyPzMVector(t2.pxpos(), t2.pypos(), t2.pzpos(), o2::constants::physics::MassProton); + antiPion = ROOT::Math::PxPyPzMVector(t2.pxneg(), t2.pyneg(), t2.pzneg(), o2::constants::physics::MassPionCharged); + lambda = proton + antiPion; + } + if (aLambdaTag2) { + antiProton = ROOT::Math::PxPyPzMVector(t2.pxneg(), t2.pyneg(), t2.pzneg(), o2::constants::physics::MassProton); + pion = ROOT::Math::PxPyPzMVector(t2.pxpos(), t2.pypos(), t2.pzpos(), o2::constants::physics::MassPionCharged); + antiLambda = antiProton + pion; + } + if (lambdaTag2 && (lambda.M() < lbinIM || lambda.M() > hbinIM)) { + continue; + } + if (aLambdaTag2 && (antiLambda.M() < lbinIM || antiLambda.M() > hbinIM)) { + continue; + } for (const auto& t3 : groupV03) { // if (pairStatus[t3.index()][t2.index()]) { // LOGF(info, "repeat match found v0 id: (%d, %d)", t3.index(), t2.index()); @@ -653,55 +699,49 @@ struct LfTaskLambdaSpinCorr { if (lambdaTag1 != lambdaTag3 || aLambdaTag1 != aLambdaTag3) { continue; } - // if (std::abs(t1.pt() - t3.pt()) > ptMix) { - // continue; - // } - // if (std::abs(t1.eta() - t3.eta()) > etaMix) { - // continue; - // } - // if (std::abs(t1.phi() - t3.phi()) > phiMix) { - // continue; - // } - auto mixPairSumPt = t3.pt() + t2.pt(); - auto mixPairR = TMath::Sqrt(TMath::Power(t3.phi() - t2.phi(), 2.0) + TMath::Power(t3.eta() - t2.eta(), 2.0)); - histos.fill(HIST("hPtDiff"), TMath::Abs(mixPairSumPt - samePairSumPt)); - histos.fill(HIST("hRDiff"), TMath::Abs(mixPairR - samePairR)); - if (mixingCombination == 0 && std::abs(t1.pt() - t3.pt()) > ptMix) { - continue; + + if (lambdaTag3) { + proton2 = ROOT::Math::PxPyPzMVector(t3.pxpos(), t3.pypos(), t3.pzpos(), o2::constants::physics::MassProton); + antiPion2 = ROOT::Math::PxPyPzMVector(t3.pxneg(), t3.pyneg(), t3.pzneg(), o2::constants::physics::MassPionCharged); + lambda2 = proton2 + antiPion2; + } + if (aLambdaTag3) { + antiProton2 = ROOT::Math::PxPyPzMVector(t3.pxneg(), t3.pyneg(), t3.pzneg(), o2::constants::physics::MassProton); + pion2 = ROOT::Math::PxPyPzMVector(t3.pxpos(), t3.pypos(), t3.pzpos(), o2::constants::physics::MassPionCharged); + antiLambda2 = antiProton2 + pion2; } - if (mixingCombination == 0 && std::abs(t1.eta() - t3.eta()) > etaMix) { + if (lambdaTag3 && (lambda2.M() < lbinIM || lambda2.M() > hbinIM)) { continue; } - if (mixingCombination == 0 && std::abs(t1.phi() - t3.phi()) > phiMix) { + if (aLambdaTag3 && (antiLambda2.M() < lbinIM || antiLambda2.M() > hbinIM)) { continue; } + double deltaPhiMix = RecoDecay::constrainAngle(t3.phi() - t2.phi(), 0.0); + auto mixPairR = TMath::Sqrt(TMath::Power(deltaPhiMix, 2.0) + TMath::Power(t3.eta() - t2.eta(), 2.0)); + auto etaDiff = t1.eta() - t3.eta(); + auto phiDiff = RecoDecay::constrainAngle(t1.phi() - t3.phi(), 0.0); - if (mixingCombination == 1 && std::abs(mixPairSumPt - samePairSumPt) > ptMix) { + histos.fill(HIST("hPtDiff"), t1.pt() - t3.pt()); + histos.fill(HIST("hPhiDiff"), phiDiff); + histos.fill(HIST("hRDiff"), etaDiff); + + if (mixingCombination == 0 && std::abs(t1.pt() - t3.pt()) > ptMix) { continue; } - if (mixingCombination == 1 && std::abs(mixPairR - samePairR) > etaMix) { + if (mixingCombination == 0 && t1.eta() * t3.eta() > 0 && std::abs(etaDiff) > etaMix) { continue; } - if (lambdaTag2) { - proton = ROOT::Math::PxPyPzMVector(t2.pxpos(), t2.pypos(), t2.pzpos(), o2::constants::physics::MassProton); - antiPion = ROOT::Math::PxPyPzMVector(t2.pxneg(), t2.pyneg(), t2.pzneg(), o2::constants::physics::MassPionCharged); - lambda = proton + antiPion; - } - if (aLambdaTag2) { - antiProton = ROOT::Math::PxPyPzMVector(t2.pxneg(), t2.pyneg(), t2.pzneg(), o2::constants::physics::MassProton); - pion = ROOT::Math::PxPyPzMVector(t2.pxpos(), t2.pypos(), t2.pzpos(), o2::constants::physics::MassPionCharged); - antiLambda = antiProton + pion; + if (mixingCombination == 0 && phiDiff > phiMix) { + continue; } - if (lambdaTag3) { - proton2 = ROOT::Math::PxPyPzMVector(t3.pxpos(), t3.pypos(), t3.pzpos(), o2::constants::physics::MassProton); - antiPion2 = ROOT::Math::PxPyPzMVector(t3.pxneg(), t3.pyneg(), t3.pzneg(), o2::constants::physics::MassPionCharged); - lambda2 = proton2 + antiPion2; + + if (mixingCombination == 1 && std::abs(t1.pt() - t3.pt()) > ptMix) { + continue; } - if (aLambdaTag3) { - antiProton2 = ROOT::Math::PxPyPzMVector(t3.pxneg(), t3.pyneg(), t3.pzneg(), o2::constants::physics::MassProton); - pion2 = ROOT::Math::PxPyPzMVector(t3.pxpos(), t3.pypos(), t3.pzpos(), o2::constants::physics::MassPionCharged); - antiLambda2 = antiProton2 + pion2; + if (mixingCombination == 1 && std::abs(mixPairR - samePairR) > etaMix) { + continue; } + if (lambdaTag2 && lambdaTag3) { fillHistograms(1, 0, 1, 0, lambda, lambda2, proton, proton2, centrality, 2); } else if (aLambdaTag2 && aLambdaTag3) { @@ -714,7 +754,6 @@ struct LfTaskLambdaSpinCorr { continue; } pairfound = true; - // pairStatus[t3.index()][t2.index()] = true; pairStatus[t3.index()][t2.index()] = true; // LOGF(info, "v0 id: (%d, %d)", t3.index(), t2.index()); if (pairfound) { From 7ff9895dd08cd17430f4674a7340faa6b443574c Mon Sep 17 00:00:00 2001 From: sarjeetagami <162087855+sarjeetagami@users.noreply.github.com> Date: Tue, 10 Jun 2025 02:24:16 +0530 Subject: [PATCH 1558/1650] [PWGLF] fix event selection hist (#11524) Co-authored-by: sarjeeta gami --- PWGLF/Tasks/Resonances/kstarpbpb.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Resonances/kstarpbpb.cxx b/PWGLF/Tasks/Resonances/kstarpbpb.cxx index 0093b921c80..a8ad0497647 100644 --- a/PWGLF/Tasks/Resonances/kstarpbpb.cxx +++ b/PWGLF/Tasks/Resonances/kstarpbpb.cxx @@ -184,9 +184,9 @@ struct kstarpbpb { AxisSpec centAxis = {8, 0, 80, "V0M (%)"}; AxisSpec occupancyAxis = {occupancyBinning, "Occupancy"}; if (!fillSA) { + histos.add("hEvtSelInfo", "hEvtSelInfo", kTH1F, {{10, 0, 10.0}}); if (same) { histos.add("hSparseV2SASameEvent_V2", "hSparseV2SASameEvent_V2", HistType::kTHnSparseF, {configThnAxisInvMass, configThnAxisPt, configThnAxisV2, configThnAxisCentrality}); - histos.add("hEvtSelInfo", "hEvtSelInfo", kTH1F, {{10, 0, 10.0}}); } if (like) { histos.add("hSparseV2SAlikeEventNN_V2", "hSparseV2SAlikeEventNN_V2", HistType::kTHnSparseF, {configThnAxisInvMass, configThnAxisPt, configThnAxisV2, configThnAxisCentrality}); From dabc6c07c3d10b0745cab2b0be5ecc300a189188 Mon Sep 17 00:00:00 2001 From: Mario Ciacco Date: Mon, 9 Jun 2025 23:23:01 +0200 Subject: [PATCH 1559/1650] [PWGLF] use material LUT in fit and propagation (#11513) --- .../Strangeness/LFStrangeTreeCreator.cxx | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/LFStrangeTreeCreator.cxx b/PWGLF/TableProducer/Strangeness/LFStrangeTreeCreator.cxx index 955b4ebc142..4ab2f0cc745 100644 --- a/PWGLF/TableProducer/Strangeness/LFStrangeTreeCreator.cxx +++ b/PWGLF/TableProducer/Strangeness/LFStrangeTreeCreator.cxx @@ -157,8 +157,8 @@ struct LFStrangeTreeCreator { int mRunNumber; float d_bz; - // o2::base::MatLayerCylSet* lut = nullptr; - Configurable cfgMaterialCorrection{"cfgMaterialCorrection", static_cast(o2::base::Propagator::MatCorrType::USEMatCorrNONE), "Type of material correction"}; + o2::base::MatLayerCylSet* lut = nullptr; + Configurable cfgMaterialCorrection{"cfgMaterialCorrection", static_cast(o2::base::Propagator::MatCorrType::USEMatCorrLUT), "Type of material correction"}; ConfigurableAxis centAxis{"centAxis", {106, 0, 106}, "binning for the centrality"}; ConfigurableAxis zVtxAxis{"zVtxBins", {100, -20.f, 20.f}, "Binning for the vertex z in cm"}; @@ -248,7 +248,11 @@ struct LFStrangeTreeCreator { mRunNumber = bc.runNumber(); fitter.setBz(d_bz); - // o2::base::Propagator::Instance()->setMatLUT(lut); + lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get("GLO/Param/MatLUT")); + o2::base::Propagator::Instance()->setMatLUT(lut); + + int mat{static_cast(cfgMaterialCorrection)}; + fitter.setMatCorrType(static_cast(mat)); } void init(o2::framework::InitContext&) @@ -261,7 +265,6 @@ struct LFStrangeTreeCreator { ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); ccdb->setFatalWhenNull(false); - // lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get("GLO/Param/MatLUT")); fitter.setPropagateToPCA(true); fitter.setMaxR(200.); @@ -272,8 +275,6 @@ struct LFStrangeTreeCreator { fitter.setMaxChi2(1e9); fitter.setUseAbsDCA(true); fitter.setWeightedFinalPCA(false); - int mat{static_cast(cfgMaterialCorrection)}; - fitter.setMatCorrType(static_cast(mat)); // event QA histos.add("QA/zVtx", ";#it{z}_{vtx} (cm);Entries", HistType::kTH1F, {zVtxAxis}); From 9f1f6d1e71fb9a187a696093788fd0099c09b523 Mon Sep 17 00:00:00 2001 From: mherzer <96999709+mherzer28@users.noreply.github.com> Date: Mon, 9 Jun 2025 23:50:29 +0200 Subject: [PATCH 1560/1650] [PWGLF] added second option for mass calculation (#11459) Co-authored-by: ALICE Action Bot --- PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx | 47 ++++++++++++++++----- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx b/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx index a33295b6021..f00fc314870 100644 --- a/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx +++ b/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx @@ -35,6 +35,7 @@ #include "PWGLF/DataModel/LFParticleIdentification.h" #include "ReconstructionDataFormats/PID.h" #include "ReconstructionDataFormats/Track.h" +#include "PWGLF/DataModel/pidTOFGeneric.h" #include namespace o2::aod @@ -113,7 +114,7 @@ static const std::vector particleCharge{1, 2}; static const std::vector particleChargeFactor{2.3, 2.55}; static const std::vector betheBlochParNames{ "p0", "p1", "p2", "p3", "p4", "resolution"}; -constexpr float betheBlochDefault[nParticles][nBetheParams]{ +constexpr float BetheBlochDefault[nParticles][nBetheParams]{ {0.248753, 3.58634, 0.0167065, 2.29194, 0.774344, 0.07}, // triton {0.0274556, 18.3054, 3.99987e-05, 3.17219, 11.1775, @@ -126,7 +127,8 @@ using TracksFull = soa::Join; + aod::TOFSignal, aod::TrackSelectionExtension, + o2::aod::EvTimeTOFFT0ForTrack>; class Particle { @@ -186,7 +188,7 @@ struct TrHeAnalysis { } evselOptions; Configurable cfgTPCPidMethod{"cfgTPCPidMethod", false, "Using own or built in bethe parametrization"}; // false for built in - + Configurable cfgMassMethod{"cfgMassMethod", 0, "0: Using built in 1: mass calculated with beta 2: mass calculated with the event time"}; // Set the multiplity event limits Configurable cfgLowMultCut{"cfgLowMultCut", 0.0f, "Accepted multiplicity percentage lower limit"}; Configurable cfgHighMultCut{"cfgHighMultCut", 100.0f, "Accepted multiplicity percentage higher limit"}; @@ -226,7 +228,7 @@ struct TrHeAnalysis { Configurable nsigmaTPCTr{"nsigmaTPCTr", 5.f, "Value of the Nsigma TPC cut for tritons"}; Configurable nsigmaTPCHe{"nsigmaTPCHe", 5.f, "Value of the Nsigma TPC cut for helium-3"}; } nsigmaTPCvar; - Configurable> cfgBetheBlochParams{"cfgBetheBlochParams", {betheBlochDefault[0], nParticles, nBetheParams, particleNames, betheBlochParNames}, "TPC Bethe-Bloch parameterisation for light nuclei"}; + Configurable> cfgBetheBlochParams{"cfgBetheBlochParams", {BetheBlochDefault[0], nParticles, nBetheParams, particleNames, betheBlochParNames}, "TPC Bethe-Bloch parameterisation for light nuclei"}; void init(o2::framework::InitContext&) { @@ -663,12 +665,14 @@ struct TrHeAnalysis { constexpr int NNumLayers = 8; constexpr int NBitsPerLayer = 4; constexpr int NBitMask = (1 << NBitsPerLayer) - 1; + int sum = 0, n = 0; for (int i = 0; i < NNumLayers; i++) { int clsSize = (track.itsClusterSizes() >> (NBitsPerLayer * i)) & NBitMask; sum += clsSize; - if (clsSize) + if (clsSize) { n++; + } } return n > 0 ? static_cast(sum) / n : 0.f; } @@ -681,13 +685,34 @@ struct TrHeAnalysis { return hePID ? track.tpcInnerParam() / 2 : track.tpcInnerParam(); } template - float getMass(T const& track) + float getMass(const T& track) { - const float beta = track.beta(); - const float rigidity = getRigidity(track); - float gamma = 1 / std::sqrt(1 - beta * beta); - float mass = (rigidity / std::sqrt(gamma * gamma - 1)); - return mass; + if (cfgMassMethod == 0) { + return track.mass(); + } + if (cfgMassMethod == 1) { + const float beta = track.beta(); + const float rigidity = getRigidity(track); + float gamma = 1 / std::sqrt(1 - beta * beta); + float mass = (rigidity / std::sqrt(gamma * gamma - 1.f)); + return mass; + } + if (cfgMassMethod == 2) { + const float rigidity = getRigidity(track); + float tofStartTime = track.evTimeForTrack(); + float tofTime = track.tofSignal(); + constexpr float CInCmPs = 2.99792458e-2f; + float length = track.length(); + float time = tofTime - tofStartTime; + if (time > 0.f && length > 0.f) { + float beta = length / (CInCmPs * time); + float gamma = 1 / std::sqrt(1 - beta * beta); + float mass = rigidity / std::sqrt(gamma * gamma - 1.f); + return mass; + } + return -1.f; + } + return -1.f; } }; From 6785b213e6a3420481e697a6cbbc4b0291b9b7c4 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Tue, 10 Jun 2025 00:27:03 +0200 Subject: [PATCH 1561/1650] [PWGEM/Dilepton] update dimuon analyses (#11526) --- PWGEM/Dilepton/Core/DielectronCut.h | 16 +- PWGEM/Dilepton/Core/Dilepton.h | 6 + PWGEM/Dilepton/Core/DileptonMC.h | 6 + PWGEM/Dilepton/Core/DimuonCut.cxx | 16 ++ PWGEM/Dilepton/Core/DimuonCut.h | 25 +++ PWGEM/Dilepton/Core/SingleTrackQC.h | 14 ++ PWGEM/Dilepton/Core/SingleTrackQCMC.h | 12 ++ .../treeCreatorElectronMLDDA.cxx | 177 ++++++++++-------- PWGEM/Dilepton/Tasks/createResolutionMap.cxx | 27 ++- PWGEM/Dilepton/Utils/EMTrackUtilities.h | 26 ++- 10 files changed, 226 insertions(+), 99 deletions(-) diff --git a/PWGEM/Dilepton/Core/DielectronCut.h b/PWGEM/Dilepton/Core/DielectronCut.h index 9ad54af870c..eec8c0928b9 100644 --- a/PWGEM/Dilepton/Core/DielectronCut.h +++ b/PWGEM/Dilepton/Core/DielectronCut.h @@ -359,13 +359,13 @@ class DielectronCut : public TNamed { switch (cut) { case DielectronCuts::kTrackPtRange: - return track.pt() >= mMinTrackPt && track.pt() <= mMaxTrackPt; + return track.pt() > mMinTrackPt && track.pt() < mMaxTrackPt; case DielectronCuts::kTrackEtaRange: - return track.eta() >= mMinTrackEta && track.eta() <= mMaxTrackEta; + return track.eta() > mMinTrackEta && track.eta() < mMaxTrackEta; case DielectronCuts::kTrackPhiRange: - return track.phi() >= mMinTrackPhi && track.phi() <= mMaxTrackPhi; + return track.phi() > mMinTrackPhi && track.phi() < mMaxTrackPhi; case DielectronCuts::kTPCNCls: return track.tpcNClsFound() >= mMinNClustersTPC; @@ -374,10 +374,10 @@ class DielectronCut : public TNamed return track.tpcNClsCrossedRows() >= mMinNCrossedRowsTPC; case DielectronCuts::kTPCCrossedRowsOverNCls: - return track.tpcCrossedRowsOverFindableCls() >= mMinNCrossedRowsOverFindableClustersTPC; + return track.tpcCrossedRowsOverFindableCls() > mMinNCrossedRowsOverFindableClustersTPC; case DielectronCuts::kTPCFracSharedClusters: - return track.tpcFractionSharedCls() <= mMaxFracSharedClustersTPC; + return track.tpcFractionSharedCls() < mMaxFracSharedClustersTPC; case DielectronCuts::kRelDiffPin: return mMinRelDiffPin < (track.tpcInnerParam() - track.p()) / track.p() && (track.tpcInnerParam() - track.p()) / track.p() < mMaxRelDiffPin; @@ -386,13 +386,13 @@ class DielectronCut : public TNamed return mMinChi2PerClusterTPC < track.tpcChi2NCl() && track.tpcChi2NCl() < mMaxChi2PerClusterTPC; case DielectronCuts::kDCA3Dsigma: - return mMinDca3D <= dca3DinSigma(track) && dca3DinSigma(track) <= mMaxDca3D; // in sigma for single leg + return mMinDca3D < dca3DinSigma(track) && dca3DinSigma(track) < mMaxDca3D; // in sigma for single leg case DielectronCuts::kDCAxy: - return std::fabs(track.dcaXY()) <= ((mMaxDcaXYPtDep) ? mMaxDcaXYPtDep(track.pt()) : mMaxDcaXY); + return std::fabs(track.dcaXY()) < ((mMaxDcaXYPtDep) ? mMaxDcaXYPtDep(track.pt()) : mMaxDcaXY); case DielectronCuts::kDCAz: - return std::fabs(track.dcaZ()) <= mMaxDcaZ; + return std::fabs(track.dcaZ()) < mMaxDcaZ; case DielectronCuts::kITSNCls: return mMinNClustersITS <= track.itsNCls() && track.itsNCls() <= mMaxNClustersITS; diff --git a/PWGEM/Dilepton/Core/Dilepton.h b/PWGEM/Dilepton/Core/Dilepton.h index 95bd4a0b6f8..46cecc81c87 100644 --- a/PWGEM/Dilepton/Core/Dilepton.h +++ b/PWGEM/Dilepton/Core/Dilepton.h @@ -281,6 +281,10 @@ struct Dilepton { Configurable cfg_min_rabs{"cfg_min_rabs", 17.6, "min Radius at the absorber end"}; Configurable cfg_max_rabs{"cfg_max_rabs", 89.5, "max Radius at the absorber end"}; Configurable enableTTCA{"enableTTCA", true, "Flag to enable or disable TTCA"}; + Configurable cfg_max_relDPt_wrt_matchedMCHMID{"cfg_max_relDPt_wrt_matchedMCHMID", 1e+10f, "max. relative dpt between MFT-MCH-MID and MCH-MID"}; + Configurable cfg_max_DEta_wrt_matchedMCHMID{"cfg_max_DEta_wrt_matchedMCHMID", 1e+10f, "max. deta between MFT-MCH-MID and MCH-MID"}; + Configurable cfg_max_DPhi_wrt_matchedMCHMID{"cfg_max_DPhi_wrt_matchedMCHMID", 1e+10f, "max. dphi between MFT-MCH-MID and MCH-MID"}; + Configurable> requiredMFTDisks{"requiredMFTDisks", std::vector{0}, "hit map on MFT disks [0,1,2,3,4]. logical-OR of each double-sided disk"}; } dimuoncuts; o2::aod::rctsel::RCTFlagsChecker rctChecker; @@ -749,6 +753,8 @@ struct Dilepton { fDimuonCut.SetDCAxy(0.f, dimuoncuts.cfg_max_dcaxy); fDimuonCut.SetRabs(dimuoncuts.cfg_min_rabs, dimuoncuts.cfg_max_rabs); fDimuonCut.SetMaxPDCARabsDep([&](float rabs) { return (rabs < 26.5 ? 594.f : 324.f); }); + fDimuonCut.SetMaxdPtdEtadPhiwrtMCHMID(dimuoncuts.cfg_max_relDPt_wrt_matchedMCHMID, dimuoncuts.cfg_max_DEta_wrt_matchedMCHMID, dimuoncuts.cfg_max_DPhi_wrt_matchedMCHMID); // this is relevant for global muons + fDimuonCut.SetMFTHitMap(dimuoncuts.requiredMFTDisks); } template diff --git a/PWGEM/Dilepton/Core/DileptonMC.h b/PWGEM/Dilepton/Core/DileptonMC.h index 769c6b72ec3..00cec907de5 100644 --- a/PWGEM/Dilepton/Core/DileptonMC.h +++ b/PWGEM/Dilepton/Core/DileptonMC.h @@ -273,6 +273,10 @@ struct DileptonMC { Configurable cfg_min_rabs{"cfg_min_rabs", 17.6, "min Radius at the absorber end"}; Configurable cfg_max_rabs{"cfg_max_rabs", 89.5, "max Radius at the absorber end"}; Configurable enableTTCA{"enableTTCA", true, "Flag to enable or disable TTCA"}; + Configurable cfg_max_relDPt_wrt_matchedMCHMID{"cfg_max_relDPt_wrt_matchedMCHMID", 1e+10f, "max. relative dpt between MFT-MCH-MID and MCH-MID"}; + Configurable cfg_max_DEta_wrt_matchedMCHMID{"cfg_max_DEta_wrt_matchedMCHMID", 1e+10f, "max. deta between MFT-MCH-MID and MCH-MID"}; + Configurable cfg_max_DPhi_wrt_matchedMCHMID{"cfg_max_DPhi_wrt_matchedMCHMID", 1e+10f, "max. dphi between MFT-MCH-MID and MCH-MID"}; + Configurable> requiredMFTDisks{"requiredMFTDisks", std::vector{0}, "hit map on MFT disks [0,1,2,3,4]. logical-OR of each double-sided disk"}; } dimuoncuts; o2::aod::rctsel::RCTFlagsChecker rctChecker; @@ -715,6 +719,8 @@ struct DileptonMC { fDimuonCut.SetDCAxy(0.f, dimuoncuts.cfg_max_dcaxy); fDimuonCut.SetRabs(dimuoncuts.cfg_min_rabs, dimuoncuts.cfg_max_rabs); fDimuonCut.SetMaxPDCARabsDep([&](float rabs) { return (rabs < 26.5 ? 594.f : 324.f); }); + fDimuonCut.SetMaxdPtdEtadPhiwrtMCHMID(dimuoncuts.cfg_max_relDPt_wrt_matchedMCHMID, dimuoncuts.cfg_max_DEta_wrt_matchedMCHMID, dimuoncuts.cfg_max_DPhi_wrt_matchedMCHMID); // this is relevant for global muons + fDimuonCut.SetMFTHitMap(dimuoncuts.requiredMFTDisks); } template diff --git a/PWGEM/Dilepton/Core/DimuonCut.cxx b/PWGEM/Dilepton/Core/DimuonCut.cxx index ee18a8e4232..5ee3bf3d3bd 100644 --- a/PWGEM/Dilepton/Core/DimuonCut.cxx +++ b/PWGEM/Dilepton/Core/DimuonCut.cxx @@ -119,3 +119,19 @@ void DimuonCut::SetMaxPDCARabsDep(std::function RabsDepCut) mMaxPDCARabsDep = RabsDepCut; LOG(info) << "Dimuon Cut, set max pDCA as a function of Rabs: " << mMaxPDCARabsDep(10.0); } +void DimuonCut::SetMFTHitMap(std::vector hitMap) +{ + mRequiredMFTDisks = hitMap; + for (const auto& iDisk : mRequiredMFTDisks) { + LOG(info) << "Dimuon Cut, require MFT hit on Disk: " << iDisk; + } +} +void DimuonCut::SetMaxdPtdEtadPhiwrtMCHMID(float reldPtMax, float dEtaMax, float dPhiMax) +{ + mMaxReldPtwrtMCHMID = reldPtMax; + mMaxdEtawrtMCHMID = dEtaMax; + mMaxdPhiwrtMCHMID = dPhiMax; + LOG(info) << "Dimuon Cut, set max rel. dpt between MFT-MCH-MID and associated MCH-MID: " << mMaxReldPtwrtMCHMID; + LOG(info) << "Dimuon Cut, set max deta between MFT-MCH-MID and associated MCH-MID: " << mMaxdEtawrtMCHMID; + LOG(info) << "Dimuon Cut, set max dphi between MFT-MCH-MID and associated MCH-MID: " << mMaxdPhiwrtMCHMID; +} diff --git a/PWGEM/Dilepton/Core/DimuonCut.h b/PWGEM/Dilepton/Core/DimuonCut.h index 4bb854c6b73..34d8364f65b 100644 --- a/PWGEM/Dilepton/Core/DimuonCut.h +++ b/PWGEM/Dilepton/Core/DimuonCut.h @@ -59,6 +59,8 @@ class DimuonCut : public TNamed kMatchingChi2MCHMID, kRabs, kPDCA, + kMFTHitMap, + kDPtDEtaDPhiwrtMCHMID, kNCuts }; @@ -154,6 +156,12 @@ class DimuonCut : public TNamed if (!IsSelectedTrack(track, DimuonCuts::kRabs)) { return false; } + if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) && !IsSelectedTrack(track, DimuonCuts::kMFTHitMap)) { + return false; + } + if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) && !IsSelectedTrack(track, DimuonCuts::kDPtDEtaDPhiwrtMCHMID)) { + return false; + } return true; } @@ -198,6 +206,19 @@ class DimuonCut : public TNamed case DimuonCuts::kRabs: return mMinRabs < track.rAtAbsorberEnd() && track.rAtAbsorberEnd() < mMaxRabs; + case DimuonCuts::kMFTHitMap: { + std::vector mftHitMap{checkMFTHitMap<0, 1>(track), checkMFTHitMap<2, 3>(track), checkMFTHitMap<4, 5>(track), checkMFTHitMap<6, 7>(track), checkMFTHitMap<8, 9>(track)}; + for (const auto& iDisk : mRequiredMFTDisks) { + if (!mftHitMap[iDisk]) { + return false; + } + } + return true; + } + + case DimuonCuts::kDPtDEtaDPhiwrtMCHMID: + return std::fabs(track.ptMatchedMCHMID() - track.pt()) / track.pt() < mMaxReldPtwrtMCHMID && std::sqrt(std::pow((track.etaMatchedMCHMID() - track.eta()) / mMaxdEtawrtMCHMID, 2) + std::pow((track.phiMatchedMCHMID() - track.phi()) / mMaxdPhiwrtMCHMID, 2)) < 1.f; + default: return false; } @@ -222,6 +243,8 @@ class DimuonCut : public TNamed void SetDCAxy(float min, float max); // in cm void SetRabs(float min, float max); // in cm void SetMaxPDCARabsDep(std::function RabsDepCut); + void SetMFTHitMap(std::vector hitMap); + void SetMaxdPtdEtadPhiwrtMCHMID(float reldPtMax, float dEtaMax, float dPhiMax); // this is relevant for global muons private: // pair cuts @@ -249,6 +272,8 @@ class DimuonCut : public TNamed float mMinRabs{17.6}, mMaxRabs{89.5}; float mMinDcaXY{0.0f}, mMaxDcaXY{1e10f}; + float mMaxReldPtwrtMCHMID{1e10f}, mMaxdEtawrtMCHMID{1e10f}, mMaxdPhiwrtMCHMID{1e10f}; + std::vector mRequiredMFTDisks{}; ClassDef(DimuonCut, 1); }; diff --git a/PWGEM/Dilepton/Core/SingleTrackQC.h b/PWGEM/Dilepton/Core/SingleTrackQC.h index f5f8be20518..2fc94a8a91c 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQC.h @@ -201,6 +201,10 @@ struct SingleTrackQC { Configurable cfg_min_rabs{"cfg_min_rabs", 17.6, "min Radius at the absorber end"}; Configurable cfg_max_rabs{"cfg_max_rabs", 89.5, "max Radius at the absorber end"}; Configurable enableTTCA{"enableTTCA", true, "Flag to enable or disable TTCA"}; + Configurable cfg_max_relDPt_wrt_matchedMCHMID{"cfg_max_relDPt_wrt_matchedMCHMID", 1e+10f, "max. relative dpt between MFT-MCH-MID and MCH-MID"}; + Configurable cfg_max_DEta_wrt_matchedMCHMID{"cfg_max_DEta_wrt_matchedMCHMID", 1e+10f, "max. deta between MFT-MCH-MID and MCH-MID"}; + Configurable cfg_max_DPhi_wrt_matchedMCHMID{"cfg_max_DPhi_wrt_matchedMCHMID", 1e+10f, "max. dphi between MFT-MCH-MID and MCH-MID"}; + Configurable> requiredMFTDisks{"requiredMFTDisks", std::vector{0}, "hit map on MFT disks [0,1,2,3,4]. logical-OR of each double-sided disk"}; } dimuoncuts; o2::aod::rctsel::RCTFlagsChecker rctChecker; @@ -282,6 +286,7 @@ struct SingleTrackQC { // track info fRegistry.add("Track/positive/hs", "rec. single muon", kTHnSparseD, {axis_pt, axis_eta, axis_phi, axis_dca}, true); fRegistry.add("Track/positive/hEtaPhi_MatchMCHMID", "#eta vs. #varphi of matched MCHMID", kTH2F, {{180, 0, 2.f * M_PI}, {100, -6, -1}}, false); + fRegistry.add("Track/positive/hdEtadPhi", "#Delta#eta vs. #Delta#varphi between MFT-MCH-MID and MCH-MID;#varphi_{sa} - #varphi_{gl} (rad.);#eta_{sa} - #eta_{gl}", kTH2F, {{90, -M_PI / 4, M_PI / 4}, {100, -0.5, +0.5}}, false); fRegistry.add("Track/positive/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{400, -20, 20}}, false); fRegistry.add("Track/positive/hTrackType", "track type", kTH1F, {{6, -0.5f, 5.5}}, false); fRegistry.add("Track/positive/hDCAxy", "DCA x vs. y;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -0.5f, 0.5f}, {200, -0.5f, 0.5f}}, false); @@ -452,6 +457,8 @@ struct SingleTrackQC { fDimuonCut.SetDCAxy(0.f, dimuoncuts.cfg_max_dcaxy); fDimuonCut.SetRabs(dimuoncuts.cfg_min_rabs, dimuoncuts.cfg_max_rabs); fDimuonCut.SetMaxPDCARabsDep([&](float rabs) { return (rabs < 26.5 ? 594.f : 324.f); }); + fDimuonCut.SetMaxdPtdEtadPhiwrtMCHMID(dimuoncuts.cfg_max_relDPt_wrt_matchedMCHMID, dimuoncuts.cfg_max_DEta_wrt_matchedMCHMID, dimuoncuts.cfg_max_DPhi_wrt_matchedMCHMID); // this is relevant for global muons + fDimuonCut.SetMFTHitMap(dimuoncuts.requiredMFTDisks); } template @@ -560,9 +567,15 @@ struct SingleTrackQC { weight = map_weight[track.globalIndex()]; } float dca_xy = fwdDcaXYinSigma(track); + + float deta = track.etaMatchedMCHMID() - track.eta(); + float dphi = track.phiMatchedMCHMID() - track.phi(); + o2::math_utils::bringToPMPi(dphi); + if (track.sign() > 0) { fRegistry.fill(HIST("Track/positive/hs"), track.pt(), track.eta(), track.phi(), dca_xy, weight); fRegistry.fill(HIST("Track/positive/hEtaPhi_MatchMCHMID"), track.phiMatchedMCHMID(), track.etaMatchedMCHMID(), weight); + fRegistry.fill(HIST("Track/positive/hdEtadPhi"), dphi, deta, weight); fRegistry.fill(HIST("Track/positive/hQoverPt"), track.sign() / track.pt()); fRegistry.fill(HIST("Track/positive/hTrackType"), track.trackType()); fRegistry.fill(HIST("Track/positive/hDCAxy"), track.fwdDcaX(), track.fwdDcaY()); @@ -580,6 +593,7 @@ struct SingleTrackQC { } else { fRegistry.fill(HIST("Track/negative/hs"), track.pt(), track.eta(), track.phi(), dca_xy, weight); fRegistry.fill(HIST("Track/negative/hEtaPhi_MatchMCHMID"), track.phiMatchedMCHMID(), track.etaMatchedMCHMID(), weight); + fRegistry.fill(HIST("Track/negative/hdEtadPhi"), dphi, deta, weight); fRegistry.fill(HIST("Track/negative/hQoverPt"), track.sign() / track.pt()); fRegistry.fill(HIST("Track/negative/hTrackType"), track.trackType()); fRegistry.fill(HIST("Track/negative/hDCAxy"), track.fwdDcaX(), track.fwdDcaY()); diff --git a/PWGEM/Dilepton/Core/SingleTrackQCMC.h b/PWGEM/Dilepton/Core/SingleTrackQCMC.h index f400b617f1f..481bb2e9e5e 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQCMC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQCMC.h @@ -207,6 +207,10 @@ struct SingleTrackQCMC { Configurable cfg_min_rabs{"cfg_min_rabs", 17.6, "min Radius at the absorber end"}; Configurable cfg_max_rabs{"cfg_max_rabs", 89.5, "max Radius at the absorber end"}; Configurable enableTTCA{"enableTTCA", true, "Flag to enable or disable TTCA"}; + Configurable cfg_max_relDPt_wrt_matchedMCHMID{"cfg_max_relDPt_wrt_matchedMCHMID", 1e+10f, "max. relative dpt between MFT-MCH-MID and MCH-MID"}; + Configurable cfg_max_DEta_wrt_matchedMCHMID{"cfg_max_DEta_wrt_matchedMCHMID", 1e+10f, "max. deta between MFT-MCH-MID and MCH-MID"}; + Configurable cfg_max_DPhi_wrt_matchedMCHMID{"cfg_max_DPhi_wrt_matchedMCHMID", 1e+10f, "max. dphi between MFT-MCH-MID and MCH-MID"}; + Configurable> requiredMFTDisks{"requiredMFTDisks", std::vector{0}, "hit map on MFT disks [0,1,2,3,4]. logical-OR of each double-sided disk"}; } dimuoncuts; o2::aod::rctsel::RCTFlagsChecker rctChecker; @@ -339,6 +343,7 @@ struct SingleTrackQCMC { fRegistry.add("Track/lf/positive/hs", "rec. single muon", kTHnSparseD, {axis_pt, axis_eta, axis_phi, axis_dca, axis_charge_gen}, true); if (cfgFillQA) { fRegistry.add("Track/lf/positive/hEtaPhi_MatchMCHMID", "#eta vs. #varphi of matched MCHMID", kTH2F, {{180, 0, 2.f * M_PI}, {100, -6, -1}}, false); + fRegistry.add("Track/lf/positive/hdEtadPhi", "#Delta#eta vs. #Delta#varphi between MFT-MCH-MID and MCH-MID;#varphi_{sa} - #varphi_{gl} (rad.);#eta_{sa} - #eta_{gl}", kTH2F, {{90, -M_PI / 4, M_PI / 4}, {100, -0.5, +0.5}}, false); fRegistry.add("Track/lf/positive/hQoverPt", "q/pT;q/p_{T} (GeV/c)^{-1}", kTH1F, {{400, -20, 20}}, false); fRegistry.add("Track/lf/positive/hTrackType", "track type", kTH1F, {{6, -0.5f, 5.5}}, false); fRegistry.add("Track/lf/positive/hDCAxy", "DCA x vs. y;DCA_{x} (cm);DCA_{y} (cm)", kTH2F, {{200, -0.5f, 0.5f}, {200, -0.5f, 0.5f}}, false); @@ -511,6 +516,8 @@ struct SingleTrackQCMC { fDimuonCut.SetDCAxy(0.f, dimuoncuts.cfg_max_dcaxy); fDimuonCut.SetRabs(dimuoncuts.cfg_min_rabs, dimuoncuts.cfg_max_rabs); fDimuonCut.SetMaxPDCARabsDep([&](float rabs) { return (rabs < 26.5 ? 594.f : 324.f); }); + fDimuonCut.SetMaxdPtdEtadPhiwrtMCHMID(dimuoncuts.cfg_max_relDPt_wrt_matchedMCHMID, dimuoncuts.cfg_max_DEta_wrt_matchedMCHMID, dimuoncuts.cfg_max_DPhi_wrt_matchedMCHMID); // this is relevant for global muons + fDimuonCut.SetMFTHitMap(dimuoncuts.requiredMFTDisks); } template @@ -670,6 +677,9 @@ struct SingleTrackQCMC { { auto mctrack = track.template emmcparticle_as(); float dca_xy = fwdDcaXYinSigma(track); + float deta = track.etaMatchedMCHMID() - track.eta(); + float dphi = track.phiMatchedMCHMID() - track.phi(); + o2::math_utils::bringToPMPi(dphi); float weight = 1.f; if (cfgApplyWeightTTCA) { @@ -681,6 +691,7 @@ struct SingleTrackQCMC { fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hs"), track.pt(), track.eta(), track.phi(), dca_xy, -mctrack.pdgCode() / pdg_lepton, weight); if (cfgFillQA) { fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hEtaPhi_MatchMCHMID"), track.phiMatchedMCHMID(), track.etaMatchedMCHMID(), weight); + fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hdEtadPhi"), dphi, deta, weight); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hQoverPt"), track.sign() / track.pt()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hTrackType"), track.trackType()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("positive/hDCAxy"), track.fwdDcaX(), track.fwdDcaY()); @@ -703,6 +714,7 @@ struct SingleTrackQCMC { fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hs"), track.pt(), track.eta(), track.phi(), dca_xy, -mctrack.pdgCode() / pdg_lepton, weight); if (cfgFillQA) { fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hEtaPhi_MatchMCHMID"), track.phiMatchedMCHMID(), track.etaMatchedMCHMID(), weight); + fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hdEtadPhi"), dphi, deta, weight); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hQoverPt"), track.sign() / track.pt()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hTrackType"), track.trackType()); fRegistry.fill(HIST("Track/") + HIST(lepton_source_types[lepton_source_id]) + HIST("negative/hDCAxy"), track.fwdDcaX(), track.fwdDcaY()); diff --git a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx index a24b62374f8..a0c7b6362f7 100644 --- a/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx +++ b/PWGEM/Dilepton/TableProducer/treeCreatorElectronMLDDA.cxx @@ -54,7 +54,7 @@ using namespace o2::constants::physics; using MyCollisions = soa::Join; using MyCollision = MyCollisions::iterator; -using MyTracks = soa::Join; using MyTrack = MyTracks::iterator; @@ -77,19 +77,18 @@ struct TreeCreatorElectronMLDDA { {"V0/hMassK0Short", "V0 mass K0S", {HistType::kTH1F, {{200, 0.4, 0.6}}}}, {"V0/hMassLambda", "V0 mass Lambda", {HistType::kTH1F, {{100, 1.08, 1.18}}}}, {"V0/hMassAntiLambda", "V0 mass AntiLambda", {HistType::kTH1F, {{100, 1.08, 1.18}}}}, - {"hMvsPhiV", "mee vs. phiv", {HistType::kTH2F, {{72, 0, M_PI}, {100, 0, 0.1}}}}, - - {"V0/hTPCdEdx_P_El", "TPC dEdx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, - {"V0/hTPCdEdx_P_Mu", "TPC dEdx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, - {"V0/hTPCdEdx_P_Pi", "TPC dEdx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, - {"V0/hTPCdEdx_P_Ka", "TPC dEdx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, - {"V0/hTPCdEdx_P_Pr", "TPC dEdx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, - - {"V0/hTOFbeta_P_El", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, - {"V0/hTOFbeta_P_Mu", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, - {"V0/hTOFbeta_P_Pi", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, - {"V0/hTOFbeta_P_Ka", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, - {"V0/hTOFbeta_P_Pr", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, + {"hMvsPhiV", "m_{ee} vs. #varphi_{V};#varphi_{V} (rad.);m_{ee} (GeV/c^{2})", {HistType::kTH2F, {{90, 0, M_PI}, {100, 0, 0.1}}}}, + + {"V0/hTPCdEdx_P_El", "TPC dEdx vs. p;p_{in} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, + {"V0/hTPCdEdx_P_Mu", "TPC dEdx vs. p;p_{in} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, + {"V0/hTPCdEdx_P_Pi", "TPC dEdx vs. p;p_{in} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, + {"V0/hTPCdEdx_P_Ka", "TPC dEdx vs. p;p_{in} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, + {"V0/hTPCdEdx_P_Pr", "TPC dEdx vs. p;p_{in} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0, 5}, {200, 0, 200}}}}, + {"V0/hTOFbeta_P_El", "TOF beta vs. p;p_{in} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, + {"V0/hTOFbeta_P_Mu", "TOF beta vs. p;p_{in} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, + {"V0/hTOFbeta_P_Pi", "TOF beta vs. p;p_{in} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, + {"V0/hTOFbeta_P_Ka", "TOF beta vs. p;p_{in} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, + {"V0/hTOFbeta_P_Pr", "TOF beta vs. p;p_{in} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0, 5}, {220, 0, 1.1}}}}, {"Cascade/hRxy_Xi", "R_{xy} of cascade vs. mass;m_{#Lambda#pi};R_{xy} (cm)", {HistType::kTH2F, {{200, 1.2, 1.4}, {200, 0, 20.f}}}}, {"Cascade/hRxy_Omega", "R_{xy} of cascade vs. mass;m_{#LambdaK};R_{xy} (cm)", {HistType::kTH2F, {{200, 1.6, 1.8}, {200, 0, 20.f}}}}, @@ -103,9 +102,7 @@ struct TreeCreatorElectronMLDDA { {"Cascade/hMassXi", "cascade mass #Xi", {HistType::kTH1F, {{200, 1.2, 1.4}}}}, {"Cascade/hMassOmega", "cascade mass #Omega", {HistType::kTH1F, {{200, 1.6, 1.8}}}}, {"Cascade/hMassPt_Xi", "cascade mass #Xi^{#pm};m_{#Lambda#pi} (GeV/c^{2});p_{T,#Lambda#pi} (GeV/c)", {HistType::kTH2F, {{200, 1.2, 1.4}, {100, 0, 10}}}}, - {"Cascade/hMassPt_Xi_bachelor", "cascade mass #Xi^{#pm};m_{#Lambda#pi} (GeV/c^{2});p_{T,#pi} (GeV/c)", {HistType::kTH2F, {{200, 1.2, 1.4}, {100, 0, 10}}}}, {"Cascade/hMassPt_Omega", "cascade mass #Omega^{#pm};m_{#LambdaK} (GeV/c^{2});p_{T,#LambdaK} (GeV/c)", {HistType::kTH2F, {{200, 1.6, 1.8}, {100, 0, 10}}}}, - {"Cascade/hMassPt_Omega_bachelor", "cascade mass #Omega^{#pm};m_{#LambdaK} (GeV/c^{2});p_{T,K} (GeV/c)", {HistType::kTH2F, {{200, 1.6, 1.8}, {100, 0, 10}}}}, }, }; @@ -386,15 +383,15 @@ struct TreeCreatorElectronMLDDA { } mDcaInfoCov.set(999, 999, 999, 999, 999); - auto track_par_cov_recalc = getTrackParCov(track); - track_par_cov_recalc.setPID(track.pidForTracking()); + auto trackParCov = getTrackParCov(track); + trackParCov.setPID(track.pidForTracking()); mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); - o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc, 2.f, matCorr, &mDcaInfoCov); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, trackParCov, 2.f, matCorr, &mDcaInfoCov); float dcaXY = mDcaInfoCov.getY(); float dcaZ = mDcaInfoCov.getZ(); - if (std::fabs(track_par_cov_recalc.getEta()) > trackcuts.cfg_max_eta || track_par_cov_recalc.getPt() < trackcuts.cfg_min_pt) { + if (std::fabs(trackParCov.getEta()) > trackcuts.cfg_max_eta || trackParCov.getPt() < trackcuts.cfg_min_pt) { return false; } @@ -442,15 +439,15 @@ struct TreeCreatorElectronMLDDA { } mDcaInfoCov.set(999, 999, 999, 999, 999); - auto track_par_cov_recalc = getTrackParCov(track); - track_par_cov_recalc.setPID(track.pidForTracking()); + auto trackParCov = getTrackParCov(track); + trackParCov.setPID(track.pidForTracking()); mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); - o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc, 2.f, matCorr, &mDcaInfoCov); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, trackParCov, 2.f, matCorr, &mDcaInfoCov); float dcaXY = mDcaInfoCov.getY(); // float dcaZ = mDcaInfoCov.getZ(); - if (std::fabs(track_par_cov_recalc.getEta()) > v0cuts.cfg_max_eta || track_par_cov_recalc.getPt() < v0cuts.cfg_min_pt) { + if (std::fabs(trackParCov.getEta()) > v0cuts.cfg_max_eta || trackParCov.getPt() < v0cuts.cfg_min_pt) { return false; } @@ -526,17 +523,17 @@ struct TreeCreatorElectronMLDDA { if (std::find(stored_trackIds.begin(), stored_trackIds.end(), track.globalIndex()) == stored_trackIds.end()) { mDcaInfoCov.set(999, 999, 999, 999, 999); - auto track_par_cov_recalc = getTrackParCov(track); - track_par_cov_recalc.setPID(track.pidForTracking()); + auto trackParCov = getTrackParCov(track); + trackParCov.setPID(track.pidForTracking()); mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); - o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, track_par_cov_recalc, 2.f, matCorr, &mDcaInfoCov); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, trackParCov, 2.f, matCorr, &mDcaInfoCov); float dcaXY = mDcaInfoCov.getY(); float dcaZ = mDcaInfoCov.getZ(); emprimarytracks(collision.globalIndex(), collision.posZ(), collision.numContrib(), collision.trackOccupancyInTimeRange(), collision.ft0cOccupancyInTimeRange(), - track.pt(), track.eta(), track.phi(), track.tgl(), track.signed1Pt(), - dcaXY, dcaZ, track_par_cov_recalc.getSigmaY2(), track_par_cov_recalc.getSigmaZ2(), track_par_cov_recalc.getSigmaZY(), + trackParCov.getPt(), trackParCov.getEta(), trackParCov.getPhi() > 0.f ? trackParCov.getPhi() : trackParCov.getPhi() + 2 * M_PI, trackParCov.getTgl(), trackParCov.getQ2Pt(), + dcaXY, dcaZ, trackParCov.getSigmaY2(), trackParCov.getSigmaZ2(), trackParCov.getSigmaZY(), track.tpcNClsFindable(), track.tpcNClsFound(), track.tpcNClsCrossedRows(), track.tpcChi2NCl(), track.tpcInnerParam(), track.tpcSignal(), track.tpcNSigmaEl(), track.tpcNSigmaMu(), track.tpcNSigmaPi(), track.tpcNSigmaKa(), track.tpcNSigmaPr(), @@ -582,33 +579,32 @@ struct TreeCreatorElectronMLDDA { for (const auto& v0 : v0s_coll) { auto pos = v0.template posTrack_as(); auto neg = v0.template negTrack_as(); - if (!isSelectedV0Leg(collision, pos) || !isSelectedV0Leg(collision, neg)) { + // LOGF(info, "v0.globalIndex() = %d, v0.collisionId() = %d, v0.posTrackId() = %d, v0.negTrackId() = %d", v0.globalIndex(), v0.collisionId(), v0.posTrackId(), v0.negTrackId()); + + if (v0.dcaV0daughters() > v0cuts.cfg_max_dcadau) { + continue; + } + if (v0.v0cosPA() < v0cuts.cfg_min_cospa) { continue; } if (pos.sign() * neg.sign() > 0) { continue; } - - // LOGF(info, "v0.globalIndex() = %d, v0.collisionId() = %d, v0.posTrackId() = %d, v0.negTrackId() = %d", v0.globalIndex(), v0.collisionId(), v0.posTrackId(), v0.negTrackId()); + if (!isSelectedV0Leg(collision, pos) || !isSelectedV0Leg(collision, neg)) { + continue; + } registry.fill(HIST("V0/hPCA"), v0.dcaV0daughters()); registry.fill(HIST("V0/hCosPA"), v0.v0cosPA()); registry.fill(HIST("V0/hAP"), v0.alpha(), v0.qtarm()); - if (v0.dcaV0daughters() > v0cuts.cfg_max_dcadau) { - continue; - } - if (v0.v0cosPA() < v0cuts.cfg_min_cospa) { - continue; - } - if (isPion(pos) && isPion(neg)) { registry.fill(HIST("V0/hMassK0Short"), v0.mK0Short()); if (v0cuts.cfg_min_mass_k0s < v0.mK0Short() && v0.mK0Short() < v0cuts.cfg_max_mass_k0s) { - registry.fill(HIST("V0/hTPCdEdx_P_Pi"), neg.p(), neg.tpcSignal()); - registry.fill(HIST("V0/hTOFbeta_P_Pi"), neg.p(), neg.beta()); - registry.fill(HIST("V0/hTPCdEdx_P_Pi"), pos.p(), pos.tpcSignal()); - registry.fill(HIST("V0/hTOFbeta_P_Pi"), pos.p(), pos.beta()); + registry.fill(HIST("V0/hTPCdEdx_P_Pi"), neg.tpcInnerParam(), neg.tpcSignal()); + registry.fill(HIST("V0/hTOFbeta_P_Pi"), neg.tpcInnerParam(), neg.beta()); + registry.fill(HIST("V0/hTPCdEdx_P_Pi"), pos.tpcInnerParam(), pos.tpcSignal()); + registry.fill(HIST("V0/hTOFbeta_P_Pi"), pos.tpcInnerParam(), pos.beta()); if (dist01(engine) < downscaling_pion || pos.tpcInnerParam() > max_pin_for_downscaling_pion) { fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kPion), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } @@ -623,8 +619,8 @@ struct TreeCreatorElectronMLDDA { if (dist01(engine) < downscaling_proton || pos.tpcInnerParam() > max_pin_for_downscaling_proton) { fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kProton), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } - registry.fill(HIST("V0/hTPCdEdx_P_Pr"), pos.p(), pos.tpcSignal()); - registry.fill(HIST("V0/hTOFbeta_P_Pr"), pos.p(), pos.beta()); + registry.fill(HIST("V0/hTPCdEdx_P_Pr"), pos.tpcInnerParam(), pos.tpcSignal()); + registry.fill(HIST("V0/hTOFbeta_P_Pr"), pos.tpcInnerParam(), pos.beta()); } } if (isPionTight(pos) && isProton(neg)) { @@ -633,14 +629,14 @@ struct TreeCreatorElectronMLDDA { if (dist01(engine) < downscaling_proton || neg.tpcInnerParam() > max_pin_for_downscaling_proton) { fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kProton), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } - registry.fill(HIST("V0/hTPCdEdx_P_Pr"), neg.p(), neg.tpcSignal()); - registry.fill(HIST("V0/hTOFbeta_P_Pr"), neg.p(), neg.beta()); + registry.fill(HIST("V0/hTPCdEdx_P_Pr"), neg.tpcInnerParam(), neg.tpcSignal()); + registry.fill(HIST("V0/hTOFbeta_P_Pr"), neg.tpcInnerParam(), neg.beta()); } } - registry.fill(HIST("V0/hMassGamma"), v0.mGamma()); - registry.fill(HIST("V0/hXY_Gamma"), v0.x(), v0.y()); - registry.fill(HIST("V0/hMassGamma_Rxy"), v0.v0radius(), v0.mGamma()); if (isElectron(pos) && isElectron(neg)) { + registry.fill(HIST("V0/hMassGamma"), v0.mGamma()); + registry.fill(HIST("V0/hXY_Gamma"), v0.x(), v0.y()); + registry.fill(HIST("V0/hMassGamma_Rxy"), v0.v0radius(), v0.mGamma()); if ((v0cuts.cfg_min_mass_photon < v0.mGamma() && v0.mGamma() < v0cuts.cfg_max_mass_photon)) { if (dist01(engine) < downscaling_electron || pos.tpcInnerParam() > max_pin_for_downscaling_electron) { fillTrackTable(collision, pos, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); @@ -648,10 +644,10 @@ struct TreeCreatorElectronMLDDA { if (dist01(engine) < downscaling_electron || neg.tpcInnerParam() > max_pin_for_downscaling_electron) { fillTrackTable(collision, neg, static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron), static_cast(o2::aod::pwgem::dilepton::Track_Type::kSecondary), false); } - registry.fill(HIST("V0/hTPCdEdx_P_El"), neg.p(), neg.tpcSignal()); - registry.fill(HIST("V0/hTOFbeta_P_El"), neg.p(), neg.beta()); - registry.fill(HIST("V0/hTPCdEdx_P_El"), pos.p(), pos.tpcSignal()); - registry.fill(HIST("V0/hTOFbeta_P_El"), pos.p(), pos.beta()); + registry.fill(HIST("V0/hTPCdEdx_P_El"), neg.tpcInnerParam(), neg.tpcSignal()); + registry.fill(HIST("V0/hTOFbeta_P_El"), neg.tpcInnerParam(), neg.beta()); + registry.fill(HIST("V0/hTPCdEdx_P_El"), pos.tpcInnerParam(), pos.tpcSignal()); + registry.fill(HIST("V0/hTOFbeta_P_El"), pos.tpcInnerParam(), pos.beta()); } } } // end of v0 loop @@ -662,10 +658,6 @@ struct TreeCreatorElectronMLDDA { auto bachelor = cascade.template bachelor_as(); auto pos = cascade.template posTrack_as(); auto neg = cascade.template negTrack_as(); - if (!isSelectedV0Leg(collision, pos) || !isSelectedV0Leg(collision, neg) || !isSelectedV0Leg(collision, bachelor)) { - continue; - } - if (pos.sign() * neg.sign() > 0) { continue; } @@ -680,7 +672,6 @@ struct TreeCreatorElectronMLDDA { } } - registry.fill(HIST("Cascade/hMassLambda"), cascade.mLambda()); if (!(v0cuts.cfg_min_mass_lambda < cascade.mLambda() && cascade.mLambda() < v0cuts.cfg_max_mass_lambda)) { continue; } @@ -689,11 +680,6 @@ struct TreeCreatorElectronMLDDA { continue; } - registry.fill(HIST("Cascade/hV0PCA"), cascade.dcaV0daughters()); - registry.fill(HIST("Cascade/hV0CosPA"), cascade.v0cosPA(collision.posX(), collision.posY(), collision.posZ())); - registry.fill(HIST("Cascade/hPCA"), cascade.dcacascdaughters()); // distance between bachelor and V0. - registry.fill(HIST("Cascade/hCosPA"), cascade.casccosPA(collision.posX(), collision.posY(), collision.posZ())); - if (cascade.dcaV0daughters() > cascadecuts.cfg_max_dcadau_v0) { continue; } @@ -715,6 +701,16 @@ struct TreeCreatorElectronMLDDA { continue; } + if (!isSelectedV0Leg(collision, pos) || !isSelectedV0Leg(collision, neg) || !isSelectedV0Leg(collision, bachelor)) { + continue; + } + + registry.fill(HIST("Cascade/hMassLambda"), cascade.mLambda()); + registry.fill(HIST("Cascade/hV0PCA"), cascade.dcaV0daughters()); + registry.fill(HIST("Cascade/hV0CosPA"), cascade.v0cosPA(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("Cascade/hPCA"), cascade.dcacascdaughters()); // distance between bachelor and V0. + registry.fill(HIST("Cascade/hCosPA"), cascade.casccosPA(collision.posX(), collision.posY(), collision.posZ())); + float length = std::sqrt(std::pow(cascade.x() - collision.posX(), 2) + std::pow(cascade.y() - collision.posY(), 2) + std::pow(cascade.z() - collision.posZ(), 2)); float mom = cascade.p(); float ctauXi = length / mom * o2::constants::physics::MassXiMinus; // 4.91 cm in PDG @@ -723,19 +719,17 @@ struct TreeCreatorElectronMLDDA { if (isPion(bachelor)) { registry.fill(HIST("Cascade/hMassXi"), cascade.mXi()); registry.fill(HIST("Cascade/hMassPt_Xi"), cascade.mXi(), cascade.pt()); - registry.fill(HIST("Cascade/hMassPt_Xi_bachelor"), cascade.mXi(), bachelor.p()); registry.fill(HIST("Cascade/hRxy_Xi"), cascade.mXi(), cascade.cascradius()); registry.fill(HIST("Cascade/hCTau_Xi"), cascade.mXi(), ctauXi); } if (!(cascadecuts.cfg_min_mass_Xi < cascade.mXi() && cascade.mXi() < cascadecuts.cfg_max_mass_Xi) && isKaon(bachelor)) { // reject Xi candidates registry.fill(HIST("Cascade/hMassOmega"), cascade.mOmega()); registry.fill(HIST("Cascade/hMassPt_Omega"), cascade.mOmega(), cascade.pt()); - registry.fill(HIST("Cascade/hMassPt_Omega_bachelor"), cascade.mOmega(), bachelor.p()); registry.fill(HIST("Cascade/hRxy_Omega"), cascade.mOmega(), cascade.cascradius()); registry.fill(HIST("Cascade/hCTau_Omega"), cascade.mOmega(), ctauOmega); if (cascadecuts.cfg_min_mass_Omega < cascade.mOmega() && cascade.mOmega() < cascadecuts.cfg_max_mass_Omega) { // select Omega candidates - registry.fill(HIST("V0/hTPCdEdx_P_Ka"), bachelor.p(), bachelor.tpcSignal()); - registry.fill(HIST("V0/hTOFbeta_P_Ka"), bachelor.p(), bachelor.beta()); + registry.fill(HIST("V0/hTPCdEdx_P_Ka"), bachelor.tpcInnerParam(), bachelor.tpcSignal()); + registry.fill(HIST("V0/hTOFbeta_P_Ka"), bachelor.tpcInnerParam(), bachelor.beta()); if (dist01(engine) < downscaling_kaon || bachelor.tpcInnerParam() > max_pin_for_downscaling_kaon) { fillTrackTable(collision, bachelor, static_cast(o2::aod::pwgem::dilepton::PID_Label::kKaon), static_cast(o2::aod::pwgem::dilepton::Track_Type::kPrimary), false); } @@ -743,21 +737,38 @@ struct TreeCreatorElectronMLDDA { } } // end of cascade loop + std::array ppos{0, 0, 0}; + std::array pneg{0, 0, 0}; + // for electron sample for validation auto posTracks_per_coll = posTracks->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); auto negTracks_per_coll = negTracks->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); for (const auto& [pos, neg] : combinations(CombinationsFullIndexPolicy(posTracks_per_coll, negTracks_per_coll))) { - if (!isSelectedTrack(collision, pos) || !isSelectedTrack(collision, neg)) { + if (!isElectron(pos) || !isElectron(neg)) { continue; } - if (!isElectron(pos) || !isElectron(neg)) { + if (!isSelectedTrack(collision, pos) || !isSelectedTrack(collision, neg)) { continue; } - ROOT::Math::PtEtaPhiMVector v1(neg.pt(), neg.eta(), neg.phi(), o2::constants::physics::MassElectron); - ROOT::Math::PtEtaPhiMVector v2(pos.pt(), pos.eta(), pos.phi(), o2::constants::physics::MassElectron); + auto posParCov = getTrackParCov(pos); + posParCov.setPID(pos.pidForTracking()); + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, posParCov, 2.f, matCorr, &mDcaInfoCov); + getPxPyPz(posParCov, ppos); + + auto negParCov = getTrackParCov(neg); + negParCov.setPID(pos.pidForTracking()); + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, negParCov, 2.f, matCorr, &mDcaInfoCov); + getPxPyPz(negParCov, pneg); + + ROOT::Math::PtEtaPhiMVector v1(negParCov.getPt(), negParCov.getEta(), negParCov.getPhi() > 0.f ? negParCov.getPhi() : negParCov.getPhi() + 2 * M_PI, o2::constants::physics::MassElectron); + ROOT::Math::PtEtaPhiMVector v2(posParCov.getPt(), posParCov.getEta(), posParCov.getPhi() > 0.f ? posParCov.getPhi() : posParCov.getPhi() + 2 * M_PI, o2::constants::physics::MassElectron); ROOT::Math::PtEtaPhiMVector v12 = v1 + v2; - float phiv = o2::aod::pwgem::dilepton::utils::pairutil::getPhivPair(pos.px(), pos.py(), pos.pz(), neg.px(), neg.py(), neg.pz(), pos.sign(), neg.sign(), d_bz); + float phiv = o2::aod::pwgem::dilepton::utils::pairutil::getPhivPair(ppos[0], ppos[1], ppos[2], pneg[0], pneg[1], pneg[2], pos.sign(), neg.sign(), d_bz); registry.fill(HIST("hMvsPhiV"), phiv, v12.M()); if ((dalitzcuts.cfg_min_mass_ee < v12.M() && v12.M() < dalitzcuts.cfg_max_mass_ee) && (dalitzcuts.cfg_min_phiv_ee < phiv && phiv < dalitzcuts.cfg_max_phiv_ee)) { // ee from pi0 dalitz decay is found. @@ -793,19 +804,19 @@ struct MLTrackQC { { {"hTPCdEdx_P_All", "TPC dE/dx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0.f, 5.f}, {200, 0, 200}}}}, {"hTOFbeta_P_All", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0.f, 5.f}, {220, 0.0, 1.1}}}}, - {"hITSClusterSize_P_All", "mean ITS cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {64, 0.0, 16}}}}, + {"hITSobClusterSize_P_All", "mean ITSob cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, {"hTPCdEdx_P_Electron", "TPC dE/dx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0.f, 5.f}, {200, 0, 200}}}}, {"hTOFbeta_P_Electron", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0.f, 5.f}, {220, 0.0, 1.1}}}}, - {"hITSClusterSize_P_Electron", "mean ITS cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {64, 0.0, 16}}}}, + {"hITSobClusterSize_P_Electron", "mean ITSob cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, {"hTPCdEdx_P_Pion", "TPC dE/dx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0.f, 5.f}, {200, 0, 200}}}}, {"hTOFbeta_P_Pion", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0.f, 5.f}, {220, 0.0, 1.1}}}}, - {"hITSClusterSize_P_Pion", "mean ITS cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {64, 0.0, 16}}}}, + {"hITSobClusterSize_P_Pion", "mean ITSob cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, {"hTPCdEdx_P_Kaon", "TPC dE/dx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0.f, 5.f}, {200, 0, 200}}}}, {"hTOFbeta_P_Kaon", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0.f, 5.f}, {220, 0.0, 1.1}}}}, - {"hITSClusterSize_P_Kaon", "mean ITS cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {64, 0.0, 16}}}}, + {"hITSobClusterSize_P_Kaon", "mean ITSob cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, {"hTPCdEdx_P_Proton", "TPC dE/dx vs. p;p^{ITS-TPC} (GeV/c);TPC dE/dx", {HistType::kTH2F, {{500, 0.f, 5.f}, {200, 0, 200}}}}, {"hTOFbeta_P_Proton", "TOF beta vs. p;p^{ITS-TPC} (GeV/c);TOF #beta", {HistType::kTH2F, {{500, 0.f, 5.f}, {220, 0.0, 1.1}}}}, - {"hITSClusterSize_P_Proton", "mean ITS cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {64, 0.0, 16}}}}, + {"hITSobClusterSize_P_Proton", "mean ITSob cluster size vs. p;p^{ITS-TPC} (GeV/c); #times cos(#lambda)", {HistType::kTH2F, {{500, 0.f, 5.f}, {150, 0.0, 15}}}}, {"hTPCNsigmaEl_P", "TPC n#sigma_{e} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{e}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, {"hTPCNsigmaPi_P", "TPC n#sigma_{#pi} vs. p;p^{ITS-TPC} (GeV/c);n #sigma_{#pi}^{TPC}", {HistType::kTH2F, {{500, 0.f, 5.f}, {100, -5, +5}}}}, @@ -823,29 +834,29 @@ struct MLTrackQC { for (const auto& track : tracks) { registry.fill(HIST("hTPCdEdx_P_All"), track.p(), track.tpcSignal()); registry.fill(HIST("hTOFbeta_P_All"), track.p(), track.beta()); - registry.fill(HIST("hITSClusterSize_P_All"), track.p(), track.meanClusterSizeITS() * std::cos(std::atan(track.tgl()))); + registry.fill(HIST("hITSobClusterSize_P_All"), track.p(), track.meanClusterSizeITSob() * std::cos(std::atan(track.tgl()))); if (track.pidlabel() == static_cast(o2::aod::pwgem::dilepton::PID_Label::kElectron)) { registry.fill(HIST("hTPCdEdx_P_Electron"), track.p(), track.tpcSignal()); registry.fill(HIST("hTOFbeta_P_Electron"), track.p(), track.beta()); - registry.fill(HIST("hITSClusterSize_P_Electron"), track.p(), track.meanClusterSizeITS() * std::cos(std::atan(track.tgl()))); + registry.fill(HIST("hITSobClusterSize_P_Electron"), track.p(), track.meanClusterSizeITSob() * std::cos(std::atan(track.tgl()))); registry.fill(HIST("hTPCNsigmaEl_P"), track.p(), track.tpcNSigmaEl()); registry.fill(HIST("hTOFNsigmaEl_P"), track.p(), track.tofNSigmaEl()); } else if (track.pidlabel() == static_cast(o2::aod::pwgem::dilepton::PID_Label::kPion)) { registry.fill(HIST("hTPCdEdx_P_Pion"), track.p(), track.tpcSignal()); registry.fill(HIST("hTOFbeta_P_Pion"), track.p(), track.beta()); - registry.fill(HIST("hITSClusterSize_P_Pion"), track.p(), track.meanClusterSizeITS() * std::cos(std::atan(track.tgl()))); + registry.fill(HIST("hITSobClusterSize_P_Pion"), track.p(), track.meanClusterSizeITSob() * std::cos(std::atan(track.tgl()))); registry.fill(HIST("hTPCNsigmaPi_P"), track.p(), track.tpcNSigmaPi()); registry.fill(HIST("hTOFNsigmaPi_P"), track.p(), track.tofNSigmaPi()); } else if (track.pidlabel() == static_cast(o2::aod::pwgem::dilepton::PID_Label::kKaon)) { registry.fill(HIST("hTPCdEdx_P_Kaon"), track.p(), track.tpcSignal()); registry.fill(HIST("hTOFbeta_P_Kaon"), track.p(), track.beta()); - registry.fill(HIST("hITSClusterSize_P_Kaon"), track.p(), track.meanClusterSizeITS() * std::cos(std::atan(track.tgl()))); + registry.fill(HIST("hITSobClusterSize_P_Kaon"), track.p(), track.meanClusterSizeITSob() * std::cos(std::atan(track.tgl()))); registry.fill(HIST("hTPCNsigmaKa_P"), track.p(), track.tpcNSigmaKa()); registry.fill(HIST("hTOFNsigmaKa_P"), track.p(), track.tofNSigmaKa()); } else if (track.pidlabel() == static_cast(o2::aod::pwgem::dilepton::PID_Label::kProton)) { registry.fill(HIST("hTPCdEdx_P_Proton"), track.p(), track.tpcSignal()); registry.fill(HIST("hTOFbeta_P_Proton"), track.p(), track.beta()); - registry.fill(HIST("hITSClusterSize_P_Proton"), track.p(), track.meanClusterSizeITS() * std::cos(std::atan(track.tgl()))); + registry.fill(HIST("hITSobClusterSize_P_Proton"), track.p(), track.meanClusterSizeITSob() * std::cos(std::atan(track.tgl()))); registry.fill(HIST("hTPCNsigmaPr_P"), track.p(), track.tpcNSigmaPr()); registry.fill(HIST("hTOFNsigmaPr_P"), track.p(), track.tofNSigmaPr()); } diff --git a/PWGEM/Dilepton/Tasks/createResolutionMap.cxx b/PWGEM/Dilepton/Tasks/createResolutionMap.cxx index c6c056b5dcb..8ae6b3e563f 100644 --- a/PWGEM/Dilepton/Tasks/createResolutionMap.cxx +++ b/PWGEM/Dilepton/Tasks/createResolutionMap.cxx @@ -157,12 +157,12 @@ struct CreateResolutionMap { Configurable cfg_mid_rabs{"cfg_mid_rabs", 26.5, "middle R at absorber end for pDCA cut"}; Configurable cfg_max_pdca_forLargeR{"cfg_max_pdca_forLargeR", 324.f, "max. pDCA for large R at absorber end"}; Configurable cfg_max_pdca_forSmallR{"cfg_max_pdca_forSmallR", 594.f, "max. pDCA for small R at absorber end"}; - Configurable cfg_min_nclusters_MFT{"cfg_min_nclusters_MFT", 5, "min nclusters MFT"}; - Configurable cfg_min_nclusters_MCH{"min_min_nclusters_MCH", 5, "min nclusters MCH"}; Configurable cfg_max_reldpt{"cfg_max_reldpt", 1e+10f, "max. relative dpt between MFT-MCH-MID and MCH-MID"}; Configurable cfg_max_deta{"cfg_max_deta", 1e+10f, "max. deta between MFT-MCH-MID and MCH-MID"}; Configurable cfg_max_dphi{"cfg_max_dphi", 1e+10f, "max. dphi between MFT-MCH-MID and MCH-MID"}; Configurable refitGlobalMuon{"refitGlobalMuon", true, "flag to refit global muon"}; + Configurable requireMFTHitMap{"requireMFTHitMap", false, "flag to require MFT hit map"}; + Configurable> requiredMFTDisks{"requiredMFTDisks", std::vector{4}, "hit map on MFT disks [0,1,2,3,4]. logical-OR of each double-sided disk"}; } muoncuts; HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -583,6 +583,15 @@ struct CreateResolutionMap { return; } + if (muoncuts.requireMFTHitMap) { + std::vector hasMFTs{hasMFT<0, 1>(mfttrack), hasMFT<2, 3>(mfttrack), hasMFT<4, 5>(mfttrack), hasMFT<6, 7>(mfttrack), hasMFT<8, 9>(mfttrack)}; + for (int i = 0; i < static_cast(muoncuts.requiredMFTDisks->size()); i++) { + if (!hasMFTs[muoncuts.requiredMFTDisks->at(i)]) { + return; + } + } + } + } else if (muon.trackType() == o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack) { o2::dataformats::GlobalFwdTrack propmuonAtRabs = propagateMuon(muon, collision, propagationPoint::kToRabs); // this is necessary only for MuonStandaloneTrack float xAbs = propmuonAtRabs.getX(); @@ -680,6 +689,20 @@ struct CreateResolutionMap { return true; } + template + bool hasMFT(T const& track) + { + // logical-OR + uint64_t mftClusterSizesAndTrackFlags = track.mftClusterSizesAndTrackFlags(); + uint16_t clmap = 0; + for (unsigned int layer = begin; layer <= end; layer++) { + if ((mftClusterSizesAndTrackFlags >> (layer * 6)) & 0x3f) { + clmap |= (1 << layer); + } + } + return (clmap > 0); + } + SliceCache cache; Preslice perCollision_mid = o2::aod::track::collisionId; Preslice perCollision_fwd = o2::aod::fwdtrack::collisionId; diff --git a/PWGEM/Dilepton/Utils/EMTrackUtilities.h b/PWGEM/Dilepton/Utils/EMTrackUtilities.h index 6ac2275aee1..eb73226cd1e 100644 --- a/PWGEM/Dilepton/Utils/EMTrackUtilities.h +++ b/PWGEM/Dilepton/Utils/EMTrackUtilities.h @@ -65,12 +65,12 @@ float dcaZinSigma(T const& track) template float fwdDcaXYinSigma(T const& track) { - float cXX = track.cXXatDCA(); // in cm^2 - float cYY = track.cYYatDCA(); // in cm^2 - float cXY = track.cXYatDCA(); // in cm^2 - float dcaX = track.fwdDcaX(); // in cm - float dcaY = track.fwdDcaY(); // in cm - float det = cXX * cYY - cXY * cXY; // determinant + float cXX = track.cXXatDCA(); // in cm^2 + float cYY = track.cYYatDCA(); // in cm^2 + float cXY = track.cXYatDCA(); // in cm^2 + float dcaX = track.fwdDcaX(); // in cm + float dcaY = track.fwdDcaY(); // in cm + float det = cXX * cYY - cXY * cXY; // determinant if (det < 0) { return 999.f; @@ -88,6 +88,20 @@ float sigmaFwdDcaXY(T const& track) return dcaXY / fwdDcaXYinSigma(track); } //_______________________________________________________________________ +template +bool checkMFTHitMap(T const& track) +{ + // logical-OR + uint64_t mftClusterSizesAndTrackFlags = track.mftClusterSizesAndTrackFlags(); + uint16_t clmap = 0; + for (unsigned int layer = begin; layer <= end; layer++) { + if ((mftClusterSizesAndTrackFlags >> (layer * 6)) & 0x3f) { + clmap |= (1 << layer); + } + } + return (clmap > 0); +} +//_______________________________________________________________________ template bool isBestMatch(TTrack const& track, TCut const& cut, TTracks const& tracks) { From a34f6789a4cf76c79dab50d6eb05447e8d4067af Mon Sep 17 00:00:00 2001 From: Paola Vargas Torres <88360333+PaolaVT@users.noreply.github.com> Date: Mon, 9 Jun 2025 19:53:30 -0600 Subject: [PATCH 1562/1650] [PWGLF] Phi cut was added (#11527) --- PWGMM/UE/Tasks/dedxAnalysis.cxx | 45 +++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/PWGMM/UE/Tasks/dedxAnalysis.cxx b/PWGMM/UE/Tasks/dedxAnalysis.cxx index 0336638dade..34999be4f7e 100644 --- a/PWGMM/UE/Tasks/dedxAnalysis.cxx +++ b/PWGMM/UE/Tasks/dedxAnalysis.cxx @@ -28,6 +28,7 @@ #include "PWGLF/DataModel/LFStrangenessTables.h" #include "ReconstructionDataFormats/Track.h" #include "Common/Core/TrackSelectionDefaults.h" +#include "TF1.h" using namespace o2; using namespace o2::framework; @@ -58,6 +59,8 @@ struct DedxAnalysis { float pionTofCut = 1.0; float invMassCut = 0.01; float invMassCutGamma = 0.0015; + float magField = 1.0; + float pTcut = 2.0; // Configurable Parameters // Tracks cuts @@ -103,6 +106,10 @@ struct DedxAnalysis { Configurable> calibrationFactorPos{"calibrationFactorPos", {50.5157, 50.6359, 50.3198, 49.3345, 48.9197, 49.4931, 50.0188, 50.1406}, "positive calibration factors"}; ConfigurableAxis binP{"binP", {VARIABLE_WIDTH, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 18.0, 20.0}, ""}; + // phi cut fits + TF1* fphiCutHigh = nullptr; + TF1* fphiCutLow = nullptr; + TrackSelection myTrackSelection() { TrackSelection selectedTracks; @@ -130,6 +137,8 @@ struct DedxAnalysis { AxisSpec ptAxis = {binP, "pT (GeV/c)"}; AxisSpec etaAxis{8, -0.8, 0.8, "#eta"}; AxisSpec pAxis = {binP, "#it{p}/Z (GeV/c)"}; + fphiCutLow = new TF1("StandardPhiCutLow", "0.1/x/x+pi/18.0-0.025", 0, 50); + fphiCutHigh = new TF1("StandardPhiCutHigh", "0.12/x+pi/18.0+0.035", 0, 50); if (calibrationMode) { // MIP for pions registryDeDx.add( @@ -202,6 +211,11 @@ struct DedxAnalysis { "hdEdx_vs_phi", "dE/dx", HistType::kTH2F, {{100, 0.0, 6.4, "#phi"}, {dedxAxis}}); + // phi cut + registryDeDx.add( + "hpt_vs_phi", "phi cut", HistType::kTH2F, + {{ptAxis}, {100, 0.0, 6.4, "#phi"}}); + registryDeDx.add( "hbeta_vs_p_Neg", "beta", HistType::kTH2F, {{pAxis}, {100, 0.0, 1.1, "#beta"}}); @@ -375,6 +389,33 @@ struct DedxAnalysis { return true; } + // Phi cut + template + bool passedPhiCut(const T& trk, float magField, const TF1& fphiCutLow, const TF1& fphiCutHigh) + { + float pt = trk.pt(); + float phi = trk.phi(); + int charge = trk.sign(); + + if (pt < pTcut) + return true; + + if (magField < 0.) // for negatve polarity field + phi = o2::constants::math::TwoPI - phi; + if (charge < 0) // for negatve charge + phi = o2::constants::math::TwoPI - phi; + + // to center gap in the middle + phi += o2::constants::math::PI / 18.0f; + phi = std::fmod(phi, o2::constants::math::PI / 9.0f); + + if (phi < fphiCutHigh.Eval(pt) && phi > fphiCutLow.Eval(pt)) + return false; // reject track + + registryDeDx.fill(HIST("hpt_vs_phi"), pt, phi); + return true; + } + // Process Data void process(SelectedCollisions::iterator const& collision, aod::V0Datas const& fullV0s, PIDTracks const& tracks) @@ -410,6 +451,10 @@ struct DedxAnalysis { if (!mySelectionPrim.IsSelected(trk)) continue; + // phi cut + if (!passedPhiCut(trk, magField, *fphiCutLow, *fphiCutHigh)) + continue; + float signedP = trk.sign() * trk.tpcInnerParam(); // MIP calibration for pions From 6b9caf473595589879c44c4c32a02f73b939e89e Mon Sep 17 00:00:00 2001 From: Anantha Padmanabhan M Nair <82643666+ananthapadmanabhan18@users.noreply.github.com> Date: Tue, 10 Jun 2025 11:52:07 +0530 Subject: [PATCH 1563/1650] [PWGUD] Added the bc selection cuts for the new pass5 and renamed histograms (#11520) --- PWGUD/Tasks/exclusiveRhoTo4Pi.cxx | 394 ++++++++++++++++-------------- 1 file changed, 205 insertions(+), 189 deletions(-) diff --git a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx index 14ffcc415a4..ac0a9459569 100644 --- a/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx +++ b/PWGUD/Tasks/exclusiveRhoTo4Pi.cxx @@ -519,8 +519,11 @@ struct ExclusiveRhoTo4Pi { Configurable fv0Cut{"fv0Cut", 50., "FV0A threshold"}; Configurable ft0aCut{"ft0aCut", 150., "FT0A threshold"}; Configurable ft0cCut{"ft0cCut", 50., "FT0C threshold"}; - Configurable zdcCut{"zdcCut", 1., "ZDC threshold"}; - // Configurable occupancyCut{"occupancyCut", 1000, "Occupancy Cut"}; + Configurable zdcCut{"zdcCut", 0., "ZDC threshold"}; + Configurable sbpCut{"sbpCut", 1, "Sbp"}; + Configurable itsROFbCut{"itsROFbCut", 1, "itsROFbCut"}; + Configurable vtxITSTPCcut{"vtxITSTPCcut", 1, "vtxITSTPCcut"}; + Configurable tfbCut{"tfbCut", 1, "tfbCut"}; Configurable pvCut{"pvCut", 1.0, "Use Only PV tracks"}; Configurable numPVContrib{"numPVContrib", 4, "Number of PV Contributors"}; @@ -563,66 +566,66 @@ struct ExclusiveRhoTo4Pi { histosData.add("tpcNClsFindable", "TPC N Cls Findable; N Cls Findable; Counts", kTH1F, {{200, 0, 200}}); // TPC nSigma - histosData.add("tpcNSigmaPi_WTS", "TPC nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosData.add("tpcNSigmaPi_WTS_PID_Pi", "TPC nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tpcNSigmaPi_all", "TPC nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tpcNSigmaPi_pions", "TPC nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); // TPC nSigma of other particles with selected pion tracks - histosData.add("tpcNSigmaKa_WTS_PID_Pi", "TPC nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosData.add("tpcNSigmaPr_WTS_PID_Pi", "TPC nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosData.add("tpcNSigmaEl_WTS_PID_Pi", "TPC nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosData.add("tpcNSigmaMu_WTS_PID_Pi", "TPC nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tpcNSigmaKa_pions", "TPC nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tpcNSigmaPr_pions", "TPC nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tpcNSigmaEl_pions", "TPC nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tpcNSigmaMu_pions", "TPC nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); // TOF nSigma - histosData.add("tofNSigmaPi_WTS", "TOF nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosData.add("tofNSigmaPi_WTS_PID_Pi", "TOF nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tofNSigmaPi_all", "TOF nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tofNSigmaPi_pions", "TOF nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); // TOF nSigma of other particles with selected pion tracks - histosData.add("tofNSigmaKa_WTS_PID_Pi", "TOF nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosData.add("tofNSigmaPr_WTS_PID_Pi", "TOF nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosData.add("tofNSigmaEl_WTS_PID_Pi", "TOF nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosData.add("tofNSigmaMu_WTS_PID_Pi", "TOF nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tofNSigmaKa_pions", "TOF nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tofNSigmaPr_pions", "TOF nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tofNSigmaEl_pions", "TOF nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosData.add("tofNSigmaMu_pions", "TOF nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); // Track Transverse Momentum - histosData.add("pT_track_WTS", "pT with track selection; pT [GeV/c]; Counts", kTH1F, {{nBinsPt, 0, 2}}); - histosData.add("pT_track_WTS_PID_Pi", "pT with track selection and PID selection of Pi; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); - histosData.add("pT_track_WTS_PID_Pi_contributed", "pT with track selection and PID selection of Pi which are contributed to selected event; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); + histosData.add("pT_track_all", "pT with track selection; pT [GeV/c]; Counts", kTH1F, {{nBinsPt, 0, 2}}); + histosData.add("pT_track_pions", "pT with track selection and PID selection of Pi; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); + histosData.add("pT_track_pions_contributed", "pT with track selection and PID selection of Pi which are contributed to selected event; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); // Track Rapidity - histosData.add("rapidity_track_WTS", "Rapidity with track selection; y; Counts", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); - histosData.add("rapidity_track_WTS_PID_Pi", "Rapidity with track selection and PID selection of Pi; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); - histosData.add("rapidity_track_WTS_PID_Pi_contributed", "Rapidity with track selection and PID selection of Pi which are contributed to selected event; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + histosData.add("rapidity_track_all", "Rapidity with track selection; y; Counts", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + histosData.add("rapidity_track_pions", "Rapidity with track selection and PID selection of Pi; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + histosData.add("rapidity_track_pions_contributed", "Rapidity with track selection and PID selection of Pi which are contributed to selected event; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); // Zero charge Event Transverse Momentum - histosData.add("pT_event_0charge_WTS_PID_Pi", "Event pT in 0 Charge Events With Track Selection and PID Selection of Pi; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); + histosData.add("fourpion_pT_0_charge", "Event pT in 0 Charge Events With Track Selection and PID Selection of Pi; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); // Non Zero charge Event Transverse Momentum - histosData.add("pT_event_non0charge_WTS_PID_Pi", "Event pT in Non 0 Charge Events With Track Selection and PID Selection of Pi; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); + histosData.add("fourpion_pT_non_0_charge", "Event pT in Non 0 Charge Events With Track Selection and PID Selection of Pi; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); // Rapidity of 0 charge Events - histosData.add("rapidity_event_0charge_WTS_PID_Pi_domainA", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} < 0.15 GeV/c; y; Events", kTH1F, {{1000, -2.5, 2.5}}); - histosData.add("rapidity_event_0charge_WTS_PID_Pi_domainB", "Rapidity of Events With Track Selection and PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; y; Events", kTH1F, {{1000, -2.5, 2.5}}); - histosData.add("rapidity_event_0charge_WTS_PID_Pi_domainC", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} > 0.80 GeV/c; y; Events", kTH1F, {{1000, -2.5, 2.5}}); + histosData.add("fourpion_rap_0_charge_domA", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} < 0.15 GeV/c; y; Events", kTH1F, {{1000, -2.5, 2.5}}); + histosData.add("fourpion_rap_0_charge_domB", "Rapidity of Events With Track Selection and PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; y; Events", kTH1F, {{1000, -2.5, 2.5}}); + histosData.add("fourpion_rap_0_charge_domC", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} > 0.80 GeV/c; y; Events", kTH1F, {{1000, -2.5, 2.5}}); // Rapidity of non 0 charge Events - histosData.add("rapidity_event_non0charge_WTS_PID_Pi_domainA", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} < 0.15 GeV/c; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); - histosData.add("rapidity_event_non0charge_WTS_PID_Pi_domainB", "Rapidity of Events With Track Selection and PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c$; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); - histosData.add("rapidity_event_non0charge_WTS_PID_Pi_domainC", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} > 0.80 GeV/c; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + histosData.add("fourpion_rap_non_0_charge_domA", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} < 0.15 GeV/c; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + histosData.add("fourpion_rap_non_0_charge_domB", "Rapidity of Events With Track Selection and PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c$; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + histosData.add("fourpion_rap_non_0_charge_domC", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} > 0.80 GeV/c; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); // Pair Invariant Mass - histosData.add("invMass_pair_1", "Invariant Mass Distribution of 2 pions 1 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); - histosData.add("invMass_pair_2", "Invariant Mass Distribution of 2 pions 2 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); - histosData.add("invMass_pair_3", "Invariant Mass Distribution of 2 pions 3 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); - histosData.add("invMass_pair_4", "Invariant Mass Distribution of 2 pions 4 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); + histosData.add("twopion_mass_1", "Invariant Mass Distribution of 2 pions 1 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); + histosData.add("twopion_mass_2", "Invariant Mass Distribution of 2 pions 2 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); + histosData.add("twopion_mass_3", "Invariant Mass Distribution of 2 pions 3 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); + histosData.add("twopion_mass_4", "Invariant Mass Distribution of 2 pions 4 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); // Invariant Mass of 0 charge events - histosData.add("invMass_event_0charge_WTS_PID_Pi_domainA", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for p_{T} < 0.15 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // pT < 0.15GeV - histosData.add("invMass_event_0charge_WTS_PID_Pi_domainB", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // 0.15GeV < pT < 0.8GeV - histosData.add("invMass_event_0charge_WTS_PID_Pi_domainC", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for p_{T} > 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // 0.8GeV < pT + histosData.add("fourpion_mass_0_charge_domA", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for p_{T} < 0.15 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // pT < 0.15GeV + histosData.add("fourpion_mass_0_charge_domB", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // 0.15GeV < pT < 0.8GeV + histosData.add("fourpion_mass_0_charge_domC", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for p_{T} > 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // 0.8GeV < pT // Invariant mass of non 0 charge events - histosData.add("invMass_event_non0charge_WTS_PID_Pi_domainA", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for p_{T} < 0.15 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // pT < 0.15GeV - histosData.add("invMass_event_non0charge_WTS_PID_Pi_domainB", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // 0.15GeV < pT < 0.8GeV - histosData.add("invMass_event_non0charge_WTS_PID_Pi_domainC", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for p_{T} > 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // 0.8GeV < pT + histosData.add("fourpion_mass_non_0_charge_domA", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for p_{T} < 0.15 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // pT < 0.15GeV + histosData.add("fourpion_mass_non_0_charge_domB", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // 0.15GeV < pT < 0.8GeV + histosData.add("fourpion_mass_non_0_charge_domC", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for p_{T} > 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // 0.8GeV < pT // tpc signal histosData.add("tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); @@ -640,12 +643,12 @@ struct ExclusiveRhoTo4Pi { histosData.add("V0A", "V0A amplitude", kTH1F, {{1000, 0.0, 100}}); // Collin Soper Theta and Phi - histosData.add("CS_phi_pair_1", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); - histosData.add("CS_phi_pair_2", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); - histosData.add("CS_costheta_pair_1", "#theta Distribution;cos(#theta); Counts", kTH1F, {{nBinsCosTheta, -1, 1}}); - histosData.add("CS_costheta_pair_2", "#theta Distribution;cos(#theta); Counts", kTH1F, {{nBinsCosTheta, -1, 1}}); - histosData.add("phi_cosTheta_pair_1", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); - histosData.add("phi_cosTheta_pair_2", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); + histosData.add("collin_soper_phi_1", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); + histosData.add("collin_soper_phi_2", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); + histosData.add("collin_soper_costheta_1", "#theta Distribution;cos(#theta); Counts", kTH1F, {{nBinsCosTheta, -1, 1}}); + histosData.add("collin_soper_costheta_2", "#theta Distribution;cos(#theta); Counts", kTH1F, {{nBinsCosTheta, -1, 1}}); + histosData.add("phi_vs_costheta_1", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); + histosData.add("phi_vs_costheta_2", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); // MC Gen Stuff @@ -679,8 +682,8 @@ struct ExclusiveRhoTo4Pi { histosMCgen.add("fourPion_phi_pair_2", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); histosMCgen.add("fourPion_costheta_pair_1", "#theta Distribution;cos(#theta); Events", kTH1F, {{nBinsCosTheta, -1, 1}}); histosMCgen.add("fourPion_costheta_pair_2", "#theta Distribution;cos(#theta); Events", kTH1F, {{nBinsCosTheta, -1, 1}}); - histosMCgen.add("phi_cosTheta_pair_1", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); - histosMCgen.add("phi_cosTheta_pair_2", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); + histosMCgen.add("phi_vs_costheta_1", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); + histosMCgen.add("phi_vs_costheta_2", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); // MC Reco Stuff @@ -697,66 +700,66 @@ struct ExclusiveRhoTo4Pi { histosMCreco.add("EventCounts", "Total Events; Events", kTH1F, {{10, 0, 10}}); // TPC nSigma - histosMCreco.add("tpcNSigmaPi_WTS", "TPC nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosMCreco.add("tpcNSigmaPi_WTS_PID_Pi", "TPC nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tpcNSigmaPi_all", "TPC nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tpcNSigmaPi_pions", "TPC nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); // TPC nSigma of other particles with selected pion tracks - histosMCreco.add("tpcNSigmaKa_WTS_PID_Pi", "TPC nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosMCreco.add("tpcNSigmaPr_WTS_PID_Pi", "TPC nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosMCreco.add("tpcNSigmaEl_WTS_PID_Pi", "TPC nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosMCreco.add("tpcNSigmaMu_WTS_PID_Pi", "TPC nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tpcNSigmaKa_pions", "TPC nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tpcNSigmaPr_pions", "TPC nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tpcNSigmaEl_pions", "TPC nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tpcNSigmaMu_pions", "TPC nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); // TOF nSigma - histosMCreco.add("tofNSigmaPi_WTS", "TOF nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosMCreco.add("tofNSigmaPi_WTS_PID_Pi", "TOF nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tofNSigmaPi_all", "TOF nSigma Pion with track selection; Events", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tofNSigmaPi_pions", "TOF nSigma Pion with track selection and PID Selection of Pi; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); // TOF nSigma of other particles with selected pion tracks - histosMCreco.add("tofNSigmaKa_WTS_PID_Pi", "TOF nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosMCreco.add("tofNSigmaPr_WTS_PID_Pi", "TOF nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosMCreco.add("tofNSigmaEl_WTS_PID_Pi", "TOF nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); - histosMCreco.add("tofNSigmaMu_WTS_PID_Pi", "TOF nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tofNSigmaKa_pions", "TOF nSigma Kaon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tofNSigmaPr_pions", "TOF nSigma Proton with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tofNSigmaEl_pions", "TOF nSigma Electron with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); + histosMCreco.add("tofNSigmaMu_pions", "TOF nSigma Muon with track selection and PID Selection of Pion; Entries", kTH2F, {{1000, -15, 15}, {nBinsPt, 0, 10}}); // Track Transverse Momentum - histosMCreco.add("pT_track_WTS", "pT with track selection; pT [GeV/c]; Counts", kTH1F, {{nBinsPt, 0, 2}}); - histosMCreco.add("pT_track_WTS_PID_Pi", "pT with track selection and PID selection of Pi; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); - histosMCreco.add("pT_track_WTS_PID_Pi_contributed", "pT with track selection and PID selection of Pi which are contributed to selected event; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); + histosMCreco.add("pT_track_all", "pT with track selection; pT [GeV/c]; Counts", kTH1F, {{nBinsPt, 0, 2}}); + histosMCreco.add("pT_track_pions", "pT with track selection and PID selection of Pi; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); + histosMCreco.add("pT_track_pions_contributed", "pT with track selection and PID selection of Pi which are contributed to selected event; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); // Track Rapidity - histosMCreco.add("rapidity_track_WTS", "Rapidity with track selection; y; Counts", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); - histosMCreco.add("rapidity_track_WTS_PID_Pi", "Rapidity with track selection and PID selection of Pi; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); - histosMCreco.add("rapidity_track_WTS_PID_Pi_contributed", "Rapidity with track selection and PID selection of Pi which are contributed to selected event; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + histosMCreco.add("rapidity_track_all", "Rapidity with track selection; y; Counts", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + histosMCreco.add("rapidity_track_pions", "Rapidity with track selection and PID selection of Pi; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + histosMCreco.add("rapidity_track_pions_contributed", "Rapidity with track selection and PID selection of Pi which are contributed to selected event; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); // Zero charge Event Transverse Momentum - histosMCreco.add("pT_event_0charge_WTS_PID_Pi", "Event pT in 0 Charge Events With Track Selection and PID Selection of Pi; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); + histosMCreco.add("fourpion_pT_0_charge", "Event pT in 0 Charge Events With Track Selection and PID Selection of Pi; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); // Non Zero charge Event Transverse Momentum - histosMCreco.add("pT_event_non0charge_WTS_PID_Pi", "Event pT in Non 0 Charge Events With Track Selection and PID Selection of Pi; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); + histosMCreco.add("fourpion_pT_non_0_charge", "Event pT in Non 0 Charge Events With Track Selection and PID Selection of Pi; pT [GeV/c]; Events", kTH1F, {{nBinsPt, 0, 2}}); // Rapidity of 0 charge Events - histosMCreco.add("rapidity_event_0charge_WTS_PID_Pi_domainA", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} < 0.15 GeV/c; y; Events", kTH1F, {{1000, -2.5, 2.5}}); - histosMCreco.add("rapidity_event_0charge_WTS_PID_Pi_domainB", "Rapidity of Events With Track Selection and PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; y; Events", kTH1F, {{1000, -2.5, 2.5}}); - histosMCreco.add("rapidity_event_0charge_WTS_PID_Pi_domainC", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} > 0.80 GeV/c; y; Events", kTH1F, {{1000, -2.5, 2.5}}); + histosMCreco.add("fourpion_rap_0_charge_domA", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} < 0.15 GeV/c; y; Events", kTH1F, {{1000, -2.5, 2.5}}); + histosMCreco.add("fourpion_rap_0_charge_domB", "Rapidity of Events With Track Selection and PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; y; Events", kTH1F, {{1000, -2.5, 2.5}}); + histosMCreco.add("fourpion_rap_0_charge_domC", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} > 0.80 GeV/c; y; Events", kTH1F, {{1000, -2.5, 2.5}}); // Rapidity of non 0 charge Events - histosMCreco.add("rapidity_event_non0charge_WTS_PID_Pi_domainA", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} < 0.15 GeV/c; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); - histosMCreco.add("rapidity_event_non0charge_WTS_PID_Pi_domainB", "Rapidity of Events With Track Selection and PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c$; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); - histosMCreco.add("rapidity_event_non0charge_WTS_PID_Pi_domainC", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} > 0.80 GeV/c; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + histosMCreco.add("fourpion_rap_non_0_charge_domA", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} < 0.15 GeV/c; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + histosMCreco.add("fourpion_rap_non_0_charge_domB", "Rapidity of Events With Track Selection and PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c$; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); + histosMCreco.add("fourpion_rap_non_0_charge_domC", "Rapidity of Events With Track Selection and PID Selection of Pi for p_{T} > 0.80 GeV/c; y; Events", kTH1F, {{nBinsRapidity, -2.5, 2.5}}); // Pair Invariant Mass - histosMCreco.add("invMass_pair_1", "Invariant Mass Distribution of 2 pions 1 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); - histosMCreco.add("invMass_pair_2", "Invariant Mass Distribution of 2 pions 2 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); - histosMCreco.add("invMass_pair_3", "Invariant Mass Distribution of 2 pions 3 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); - histosMCreco.add("invMass_pair_4", "Invariant Mass Distribution of 2 pions 4 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); + histosMCreco.add("twopion_mass_1", "Invariant Mass Distribution of 2 pions 1 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); + histosMCreco.add("twopion_mass_2", "Invariant Mass Distribution of 2 pions 2 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); + histosMCreco.add("twopion_mass_3", "Invariant Mass Distribution of 2 pions 3 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); + histosMCreco.add("twopion_mass_4", "Invariant Mass Distribution of 2 pions 4 ; m(#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{5000, 0, 5}}); // Invariant Mass of 0 charge events - histosMCreco.add("invMass_event_0charge_WTS_PID_Pi_domainA", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for p_{T} < 0.15 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // pT < 0.15GeV - histosMCreco.add("invMass_event_0charge_WTS_PID_Pi_domainB", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // 0.15GeV < pT < 0.8GeV - histosMCreco.add("invMass_event_0charge_WTS_PID_Pi_domainC", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for p_{T} > 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // 0.8GeV < pT + histosMCreco.add("fourpion_mass_0_charge_domA", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for p_{T} < 0.15 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // pT < 0.15GeV + histosMCreco.add("fourpion_mass_0_charge_domB", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // 0.15GeV < pT < 0.8GeV + histosMCreco.add("fourpion_mass_0_charge_domC", "Invariant Mass Distribution of 0 charge Events with PID Selection of Pi for p_{T} > 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // 0.8GeV < pT // Invariant mass of non 0 charge events - histosMCreco.add("invMass_event_non0charge_WTS_PID_Pi_domainA", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for p_{T} < 0.15 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // pT < 0.15GeV - histosMCreco.add("invMass_event_non0charge_WTS_PID_Pi_domainB", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // 0.15GeV < pT < 0.8GeV - histosMCreco.add("invMass_event_non0charge_WTS_PID_Pi_domainC", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for p_{T} > 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // 0.8GeV < pT + histosMCreco.add("fourpion_mass_non_0_charge_domA", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for p_{T} < 0.15 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // pT < 0.15GeV + histosMCreco.add("fourpion_mass_non_0_charge_domB", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for 0.15< p_{T} < 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // 0.15GeV < pT < 0.8GeV + histosMCreco.add("fourpion_mass_non_0_charge_domC", "Invariant Mass Distribution of non 0 charge Events with PID Selection of Pi for p_{T} > 0.80 GeV/c; m(#pi^{+}#pi^{-}#pi^{+}#pi^{-}) [GeV/c]", kTH1F, {{nBinsInvariantMass, invariantMassMin, invariantMassMax}}); // 0.8GeV < pT // tpc signal histosMCreco.add("tpcSignal", "TPC dEdx vs p; p [GeV/c]; dEdx [a.u.]", kTH2F, {{500, 0, 10}, {5000, 0.0, 5000.0}}); @@ -774,12 +777,12 @@ struct ExclusiveRhoTo4Pi { histosMCreco.add("V0A", "V0A amplitude", kTH1F, {{1000, 0.0, 100}}); // Collin Soper Theta and Phi - histosMCreco.add("CS_phi_pair_1", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); - histosMCreco.add("CS_phi_pair_2", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); - histosMCreco.add("CS_costheta_pair_1", "#theta Distribution;cos(#theta); Counts", kTH1F, {{nBinsCosTheta, -1, 1}}); - histosMCreco.add("CS_costheta_pair_2", "#theta Distribution;cos(#theta); Counts", kTH1F, {{nBinsCosTheta, -1, 1}}); - histosMCreco.add("phi_cosTheta_pair_1", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); - histosMCreco.add("phi_cosTheta_pair_2", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); + histosMCreco.add("collin_soper_phi_1", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); + histosMCreco.add("collin_soper_phi_2", "#phi Distribution; #phi; Events", kTH1F, {{nBinsPhi, -3.2, 3.2}}); + histosMCreco.add("collin_soper_costheta_1", "#theta Distribution;cos(#theta); Counts", kTH1F, {{nBinsCosTheta, -1, 1}}); + histosMCreco.add("collin_soper_costheta_2", "#theta Distribution;cos(#theta); Counts", kTH1F, {{nBinsCosTheta, -1, 1}}); + histosMCreco.add("phi_vs_costheta_1", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); + histosMCreco.add("phi_vs_costheta_2", "Phi vs cosTheta; #phi; cos(#theta)", kTH2F, {{nBinsPhi, -3.2, 3.2}, {nBinsCosTheta, -1, 1}}); } // End of init function //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -845,7 +848,9 @@ struct ExclusiveRhoTo4Pi { Filter vertexCut = (nabs(o2::aod::collision::posZ) <= vZCut) && (o2::aod::collision::numContrib == numPVContrib); Filter fitcuts = o2::aod::udcollision::totalFV0AmplitudeA < fv0Cut && o2::aod::udcollision::totalFT0AmplitudeA < ft0aCut && o2::aod::udcollision::totalFT0AmplitudeC < ft0cCut; Filter zdcCuts = (o2::aod::udzdc::energyCommonZNA < zdcCut) && (o2::aod::udzdc::energyCommonZNC < zdcCut); - using UDtracks = soa::Join; + Filter bcSelectionCut = (o2::aod::udcollision::sbp == sbpCut) && (o2::aod::udcollision::itsROFb == itsROFbCut) && (o2::aod::udcollision::vtxITSTPC == vtxITSTPCcut) && (o2::aod::udcollision::tfb == tfbCut); + Filter onlyPVtracks = o2::aod::udtrack::isPVContributor == true; + using UDtracks = soa::Filtered>; using UDCollisions = soa::Filtered>; // using UDCollision = UDCollisions::iterator; //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -897,10 +902,10 @@ struct ExclusiveRhoTo4Pi { ROOT::Math::PxPyPzMVector selectedTrackVector(selectedTracks[i].px(), selectedTracks[i].py(), selectedTracks[i].pz(), o2::constants::physics::MassPionCharged); histosData.fill(HIST("tpcSignal"), selectedTrackVector.P(), selectedTracks[i].tpcSignal()); histosData.fill(HIST("tofBeta"), selectedTrackVector.P(), selectedTracks[i].beta()); - histosData.fill(HIST("tpcNSigmaPi_WTS"), selectedTracks[i].tpcNSigmaPi(), selectedTrackVector.Pt()); - histosData.fill(HIST("tofNSigmaPi_WTS"), selectedTracks[i].tofNSigmaPi(), selectedTrackVector.Pt()); - histosData.fill(HIST("pT_track_WTS"), selectedTrackVector.Pt()); - histosData.fill(HIST("rapidity_track_WTS"), selectedTrackVector.Rapidity()); + histosData.fill(HIST("tpcNSigmaPi_all"), selectedTracks[i].tpcNSigmaPi(), selectedTrackVector.Pt()); + histosData.fill(HIST("tofNSigmaPi_all"), selectedTracks[i].tofNSigmaPi(), selectedTrackVector.Pt()); + histosData.fill(HIST("pT_track_all"), selectedTrackVector.Pt()); + histosData.fill(HIST("rapidity_track_all"), selectedTrackVector.Rapidity()); histosData.fill(HIST("itsChi2NCl"), selectedTracks[i].itsChi2NCl()); histosData.fill(HIST("tpcChi2NCl"), selectedTracks[i].tpcChi2NCl()); histosData.fill(HIST("tpcNClsFindable"), selectedTracks[i].tpcNClsFindable()); @@ -912,24 +917,26 @@ struct ExclusiveRhoTo4Pi { ROOT::Math::PxPyPzMVector selectedPionTrackVector(selectedPionTracks[i].px(), selectedPionTracks[i].py(), selectedPionTracks[i].pz(), o2::constants::physics::MassPionCharged); histosData.fill(HIST("tpcSignal_Pi"), selectedPionTrackVector.P(), selectedPionTracks[i].tpcSignal()); histosData.fill(HIST("tofBeta_Pi"), selectedPionTrackVector.P(), selectedPionTracks[i].beta()); - histosData.fill(HIST("tpcNSigmaPi_WTS_PID_Pi"), selectedPionTracks[i].tpcNSigmaPi(), selectedPionTrackVector.Pt()); - histosData.fill(HIST("tpcNSigmaKa_WTS_PID_Pi"), selectedPionTracks[i].tpcNSigmaKa(), selectedPionTrackVector.Pt()); - histosData.fill(HIST("tpcNSigmaPr_WTS_PID_Pi"), selectedPionTracks[i].tpcNSigmaPr(), selectedPionTrackVector.Pt()); - histosData.fill(HIST("tpcNSigmaEl_WTS_PID_Pi"), selectedPionTracks[i].tpcNSigmaEl(), selectedPionTrackVector.Pt()); - histosData.fill(HIST("tpcNSigmaMu_WTS_PID_Pi"), selectedPionTracks[i].tpcNSigmaMu(), selectedPionTrackVector.Pt()); - histosData.fill(HIST("tofNSigmaPi_WTS_PID_Pi"), selectedPionTracks[i].tofNSigmaPi(), selectedPionTrackVector.Pt()); - histosData.fill(HIST("tofNSigmaKa_WTS_PID_Pi"), selectedPionTracks[i].tofNSigmaKa(), selectedPionTrackVector.Pt()); - histosData.fill(HIST("tofNSigmaPr_WTS_PID_Pi"), selectedPionTracks[i].tofNSigmaPr(), selectedPionTrackVector.Pt()); - histosData.fill(HIST("tofNSigmaEl_WTS_PID_Pi"), selectedPionTracks[i].tofNSigmaEl(), selectedPionTrackVector.Pt()); - histosData.fill(HIST("tofNSigmaMu_WTS_PID_Pi"), selectedPionTracks[i].tofNSigmaMu(), selectedPionTrackVector.Pt()); - histosData.fill(HIST("pT_track_WTS_PID_Pi"), selectedPionTrackVector.Pt()); - histosData.fill(HIST("rapidity_track_WTS_PID_Pi"), selectedPionTrackVector.Rapidity()); + histosData.fill(HIST("tpcNSigmaPi_pions"), selectedPionTracks[i].tpcNSigmaPi(), selectedPionTrackVector.Pt()); + histosData.fill(HIST("tpcNSigmaKa_pions"), selectedPionTracks[i].tpcNSigmaKa(), selectedPionTrackVector.Pt()); + histosData.fill(HIST("tpcNSigmaPr_pions"), selectedPionTracks[i].tpcNSigmaPr(), selectedPionTrackVector.Pt()); + histosData.fill(HIST("tpcNSigmaEl_pions"), selectedPionTracks[i].tpcNSigmaEl(), selectedPionTrackVector.Pt()); + histosData.fill(HIST("tpcNSigmaMu_pions"), selectedPionTracks[i].tpcNSigmaMu(), selectedPionTrackVector.Pt()); + histosData.fill(HIST("tofNSigmaPi_pions"), selectedPionTracks[i].tofNSigmaPi(), selectedPionTrackVector.Pt()); + histosData.fill(HIST("tofNSigmaKa_pions"), selectedPionTracks[i].tofNSigmaKa(), selectedPionTrackVector.Pt()); + histosData.fill(HIST("tofNSigmaPr_pions"), selectedPionTracks[i].tofNSigmaPr(), selectedPionTrackVector.Pt()); + histosData.fill(HIST("tofNSigmaEl_pions"), selectedPionTracks[i].tofNSigmaEl(), selectedPionTrackVector.Pt()); + histosData.fill(HIST("tofNSigmaMu_pions"), selectedPionTracks[i].tofNSigmaMu(), selectedPionTrackVector.Pt()); + histosData.fill(HIST("pT_track_pions"), selectedPionTrackVector.Pt()); + histosData.fill(HIST("rapidity_track_pions"), selectedPionTrackVector.Rapidity()); } // End of loop over tracks with selection and PID selection of Pions if (numSelectedPionTracks != numFourPionTracks) { return; } + histosData.fill(HIST("EventCounts"), 2); + // Check if there is at least one track with TOF in the selected events, otherwise return bool hasAtleastOneTOF = false; for (int i = 0; i < numPiPlusTracks; i++) { @@ -941,10 +948,13 @@ struct ExclusiveRhoTo4Pi { if (!hasAtleastOneTOF) { return; } + histosData.fill(HIST("EventCounts"), 3); // Selecting Events with net charge = 0 if (numPionMinusTracks == numPiMinus && numPiPlusTracks == numPiPlus) { + histosData.fill(HIST("EventCounts"), 4); + ROOT::Math::PtEtaPhiMVector k1, k2, k3, k4, k1234, k13, k14, k23, k24; ROOT::Math::PxPyPzMVector p1(selectedPionPlusTracks[0].px(), selectedPionPlusTracks[0].py(), selectedPionPlusTracks[0].pz(), o2::constants::physics::MassPionCharged); @@ -952,15 +962,15 @@ struct ExclusiveRhoTo4Pi { ROOT::Math::PxPyPzMVector p3(selectedPionMinusTracks[0].px(), selectedPionMinusTracks[0].py(), selectedPionMinusTracks[0].pz(), o2::constants::physics::MassPionCharged); ROOT::Math::PxPyPzMVector p4(selectedPionMinusTracks[1].px(), selectedPionMinusTracks[1].py(), selectedPionMinusTracks[1].pz(), o2::constants::physics::MassPionCharged); - histosData.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p1.Pt()); - histosData.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p2.Pt()); - histosData.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p3.Pt()); - histosData.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p4.Pt()); + histosData.fill(HIST("pT_track_pions_contributed"), p1.Pt()); + histosData.fill(HIST("pT_track_pions_contributed"), p2.Pt()); + histosData.fill(HIST("pT_track_pions_contributed"), p3.Pt()); + histosData.fill(HIST("pT_track_pions_contributed"), p4.Pt()); - histosData.fill(HIST("rapidity_track_WTS_PID_Pi_contributed"), p1.Rapidity()); - histosData.fill(HIST("rapidity_track_WTS_PID_Pi_contributed"), p2.Rapidity()); - histosData.fill(HIST("rapidity_track_WTS_PID_Pi_contributed"), p3.Rapidity()); - histosData.fill(HIST("rapidity_track_WTS_PID_Pi_contributed"), p4.Rapidity()); + histosData.fill(HIST("rapidity_track_pions_contributed"), p1.Rapidity()); + histosData.fill(HIST("rapidity_track_pions_contributed"), p2.Rapidity()); + histosData.fill(HIST("rapidity_track_pions_contributed"), p3.Rapidity()); + histosData.fill(HIST("rapidity_track_pions_contributed"), p4.Rapidity()); k1.SetCoordinates(p1.Pt(), p1.Eta(), p1.Phi(), o2::constants::physics::MassPionCharged); k2.SetCoordinates(p2.Pt(), p2.Eta(), p2.Phi(), o2::constants::physics::MassPionCharged); @@ -1012,31 +1022,34 @@ struct ExclusiveRhoTo4Pi { fourPiPhiPair1, fourPiPhiPair2, fourPiCosThetaPair1, fourPiCosThetaPair2); if (std::fabs(p1234.Rapidity()) < rhoRapCut) { - histosData.fill(HIST("pT_event_0charge_WTS_PID_Pi"), p1234.Pt()); + histosData.fill(HIST("fourpion_pT_0_charge"), p1234.Pt()); if (p1234.Pt() < rhoPtCut) { - histosData.fill(HIST("rapidity_event_0charge_WTS_PID_Pi_domainA"), p1234.Rapidity()); - histosData.fill(HIST("invMass_event_0charge_WTS_PID_Pi_domainA"), p1234.M()); - histosData.fill(HIST("invMass_pair_1"), (p1 + p3).M()); - histosData.fill(HIST("invMass_pair_2"), (p1 + p4).M()); - histosData.fill(HIST("invMass_pair_3"), (p2 + p3).M()); - histosData.fill(HIST("invMass_pair_4"), (p2 + p4).M()); + histosData.fill(HIST("EventCounts"), 5); + + histosData.fill(HIST("fourpion_rap_0_charge_domA"), p1234.Rapidity()); + histosData.fill(HIST("fourpion_mass_0_charge_domA"), p1234.M()); - histosData.fill(HIST("CS_phi_pair_1"), fourPiPhiPair1); - histosData.fill(HIST("CS_phi_pair_2"), fourPiPhiPair2); - histosData.fill(HIST("CS_costheta_pair_1"), fourPiCosThetaPair1); - histosData.fill(HIST("CS_costheta_pair_2"), fourPiCosThetaPair2); + histosData.fill(HIST("twopion_mass_1"), (p1 + p3).M()); + histosData.fill(HIST("twopion_mass_2"), (p1 + p4).M()); + histosData.fill(HIST("twopion_mass_3"), (p2 + p3).M()); + histosData.fill(HIST("twopion_mass_4"), (p2 + p4).M()); - histosData.fill(HIST("phi_cosTheta_pair_1"), fourPiPhiPair1, fourPiCosThetaPair1); - histosData.fill(HIST("phi_cosTheta_pair_2"), fourPiPhiPair2, fourPiCosThetaPair2); + histosData.fill(HIST("collin_soper_phi_1"), fourPiPhiPair1); + histosData.fill(HIST("collin_soper_phi_2"), fourPiPhiPair2); + histosData.fill(HIST("collin_soper_costheta_1"), fourPiCosThetaPair1); + histosData.fill(HIST("collin_soper_costheta_2"), fourPiCosThetaPair2); + + histosData.fill(HIST("phi_vs_costheta_1"), fourPiPhiPair1, fourPiCosThetaPair1); + histosData.fill(HIST("phi_vs_costheta_2"), fourPiPhiPair2, fourPiCosThetaPair2); } if (p1234.Pt() > rhoPtCut && p1234.Pt() < zeroPointEight) { - histosData.fill(HIST("rapidity_event_0charge_WTS_PID_Pi_domainB"), p1234.Rapidity()); - histosData.fill(HIST("invMass_event_0charge_WTS_PID_Pi_domainB"), p1234.M()); + histosData.fill(HIST("fourpion_rap_0_charge_domB"), p1234.Rapidity()); + histosData.fill(HIST("fourpion_mass_0_charge_domB"), p1234.M()); } if (p1234.Pt() > zeroPointEight) { - histosData.fill(HIST("rapidity_event_0charge_WTS_PID_Pi_domainC"), p1234.Rapidity()); - histosData.fill(HIST("invMass_event_0charge_WTS_PID_Pi_domainC"), p1234.M()); + histosData.fill(HIST("fourpion_rap_0_charge_domC"), p1234.Rapidity()); + histosData.fill(HIST("fourpion_mass_0_charge_domC"), p1234.M()); } } // End of Rapidity range selection @@ -1045,6 +1058,8 @@ struct ExclusiveRhoTo4Pi { // Selecting Events with net charge != 0 for estimation of background if (numPionMinusTracks != numPiMinus && numPiPlusTracks != numPiPlus) { + histosData.fill(HIST("EventCounts"), 6); + ROOT::Math::PxPyPzMVector p1(selectedPionTracks[0].px(), selectedPionTracks[0].py(), selectedPionTracks[0].pz(), o2::constants::physics::MassPionCharged); ROOT::Math::PxPyPzMVector p2(selectedPionTracks[1].px(), selectedPionTracks[1].py(), selectedPionTracks[1].pz(), o2::constants::physics::MassPionCharged); ROOT::Math::PxPyPzMVector p3(selectedPionTracks[2].px(), selectedPionTracks[2].py(), selectedPionTracks[2].pz(), o2::constants::physics::MassPionCharged); @@ -1074,19 +1089,20 @@ struct ExclusiveRhoTo4Pi { p1234.Pt(), p1234.Eta(), p1234.Phi(), p1234.Rapidity(), p1234.M()); if (std::fabs(p1234.Rapidity()) < rhoRapCut) { - histosData.fill(HIST("pT_event_non0charge_WTS_PID_Pi"), p1234.Pt()); + histosData.fill(HIST("fourpion_pT_non_0_charge"), p1234.Pt()); if (p1234.Pt() < rhoPtCut) { - histosData.fill(HIST("rapidity_event_non0charge_WTS_PID_Pi_domainA"), p1234.Rapidity()); - histosData.fill(HIST("invMass_event_non0charge_WTS_PID_Pi_domainA"), p1234.M()); + histosData.fill(HIST("EventCounts"), 7); + histosData.fill(HIST("fourpion_rap_non_0_charge_domA"), p1234.Rapidity()); + histosData.fill(HIST("fourpion_mass_non_0_charge_domA"), p1234.M()); } if (p1234.Pt() > rhoPtCut && p1234.Pt() < zeroPointEight) { - histosData.fill(HIST("rapidity_event_non0charge_WTS_PID_Pi_domainB"), p1234.Rapidity()); - histosData.fill(HIST("invMass_event_non0charge_WTS_PID_Pi_domainB"), p1234.M()); + histosData.fill(HIST("fourpion_rap_non_0_charge_domB"), p1234.Rapidity()); + histosData.fill(HIST("fourpion_mass_non_0_charge_domB"), p1234.M()); } if (p1234.Pt() > zeroPointEight) { - histosData.fill(HIST("rapidity_event_non0charge_WTS_PID_Pi_domainC"), p1234.Rapidity()); - histosData.fill(HIST("invMass_event_non0charge_WTS_PID_Pi_domainC"), p1234.M()); + histosData.fill(HIST("fourpion_rap_non_0_charge_domC"), p1234.Rapidity()); + histosData.fill(HIST("fourpion_mass_non_0_charge_domC"), p1234.M()); } } // End of Rapidity range selection } // End of Analysis for non 0 charge events @@ -1186,8 +1202,8 @@ struct ExclusiveRhoTo4Pi { histosMCgen.fill(HIST("fourPion_phi_pair_2"), phiPair2); histosMCgen.fill(HIST("fourPion_costheta_pair_1"), cosThetaPair1); histosMCgen.fill(HIST("fourPion_costheta_pair_2"), cosThetaPair2); - histosMCgen.fill(HIST("phi_cosTheta_pair_1"), phiPair1, cosThetaPair1); - histosMCgen.fill(HIST("phi_cosTheta_pair_2"), phiPair2, cosThetaPair2); + histosMCgen.fill(HIST("phi_vs_costheta_1"), phiPair1, cosThetaPair1); + histosMCgen.fill(HIST("phi_vs_costheta_2"), phiPair2, cosThetaPair2); } // End of 4 Pion MC Generation Process function PROCESS_SWITCH(ExclusiveRhoTo4Pi, processMCgen, "The Process for 4 Pion Analysis from MC Generation", false); @@ -1247,10 +1263,10 @@ struct ExclusiveRhoTo4Pi { ROOT::Math::PxPyPzMVector selectedTrackVector(selectedTracks[i].px(), selectedTracks[i].py(), selectedTracks[i].pz(), o2::constants::physics::MassPionCharged); histosMCreco.fill(HIST("tpcSignal"), selectedTrackVector.P(), selectedTracks[i].tpcSignal()); histosMCreco.fill(HIST("tofBeta"), selectedTrackVector.P(), selectedTracks[i].beta()); - histosMCreco.fill(HIST("tpcNSigmaPi_WTS"), selectedTracks[i].tpcNSigmaPi(), selectedTrackVector.Pt()); - histosMCreco.fill(HIST("tofNSigmaPi_WTS"), selectedTracks[i].tofNSigmaPi(), selectedTrackVector.Pt()); - histosMCreco.fill(HIST("pT_track_WTS"), selectedTrackVector.Pt()); - histosMCreco.fill(HIST("rapidity_track_WTS"), selectedTrackVector.Rapidity()); + histosMCreco.fill(HIST("tpcNSigmaPi_all"), selectedTracks[i].tpcNSigmaPi(), selectedTrackVector.Pt()); + histosMCreco.fill(HIST("tofNSigmaPi_all"), selectedTracks[i].tofNSigmaPi(), selectedTrackVector.Pt()); + histosMCreco.fill(HIST("pT_track_all"), selectedTrackVector.Pt()); + histosMCreco.fill(HIST("rapidity_track_all"), selectedTrackVector.Rapidity()); histosMCreco.fill(HIST("itsChi2NCl"), selectedTracks[i].itsChi2NCl()); histosMCreco.fill(HIST("tpcChi2NCl"), selectedTracks[i].tpcChi2NCl()); histosMCreco.fill(HIST("tpcNClsFindable"), selectedTracks[i].tpcNClsFindable()); @@ -1262,18 +1278,18 @@ struct ExclusiveRhoTo4Pi { ROOT::Math::PxPyPzMVector selectedPionTrackVector(selectedPionTracks[i].px(), selectedPionTracks[i].py(), selectedPionTracks[i].pz(), o2::constants::physics::MassPionCharged); histosMCreco.fill(HIST("tpcSignal_Pi"), selectedPionTrackVector.P(), selectedPionTracks[i].tpcSignal()); histosMCreco.fill(HIST("tofBeta_Pi"), selectedPionTrackVector.P(), selectedPionTracks[i].beta()); - histosMCreco.fill(HIST("tpcNSigmaPi_WTS_PID_Pi"), selectedPionTracks[i].tpcNSigmaPi(), selectedPionTrackVector.Pt()); - histosMCreco.fill(HIST("tpcNSigmaKa_WTS_PID_Pi"), selectedPionTracks[i].tpcNSigmaKa(), selectedPionTrackVector.Pt()); - histosMCreco.fill(HIST("tpcNSigmaPr_WTS_PID_Pi"), selectedPionTracks[i].tpcNSigmaPr(), selectedPionTrackVector.Pt()); - histosMCreco.fill(HIST("tpcNSigmaEl_WTS_PID_Pi"), selectedPionTracks[i].tpcNSigmaEl(), selectedPionTrackVector.Pt()); - histosMCreco.fill(HIST("tpcNSigmaMu_WTS_PID_Pi"), selectedPionTracks[i].tpcNSigmaMu(), selectedPionTrackVector.Pt()); - histosMCreco.fill(HIST("tofNSigmaPi_WTS_PID_Pi"), selectedPionTracks[i].tofNSigmaPi(), selectedPionTrackVector.Pt()); - histosMCreco.fill(HIST("tofNSigmaKa_WTS_PID_Pi"), selectedPionTracks[i].tofNSigmaKa(), selectedPionTrackVector.Pt()); - histosMCreco.fill(HIST("tofNSigmaPr_WTS_PID_Pi"), selectedPionTracks[i].tofNSigmaPr(), selectedPionTrackVector.Pt()); - histosMCreco.fill(HIST("tofNSigmaEl_WTS_PID_Pi"), selectedPionTracks[i].tofNSigmaEl(), selectedPionTrackVector.Pt()); - histosMCreco.fill(HIST("tofNSigmaMu_WTS_PID_Pi"), selectedPionTracks[i].tofNSigmaMu(), selectedPionTrackVector.Pt()); - histosMCreco.fill(HIST("pT_track_WTS_PID_Pi"), std::sqrt(selectedPionTracks[i].px() * selectedPionTracks[i].px() + selectedPionTracks[i].py() * selectedPionTracks[i].py())); - histosMCreco.fill(HIST("rapidity_track_WTS_PID_Pi"), selectedPionTrackVector.Rapidity()); + histosMCreco.fill(HIST("tpcNSigmaPi_pions"), selectedPionTracks[i].tpcNSigmaPi(), selectedPionTrackVector.Pt()); + histosMCreco.fill(HIST("tpcNSigmaKa_pions"), selectedPionTracks[i].tpcNSigmaKa(), selectedPionTrackVector.Pt()); + histosMCreco.fill(HIST("tpcNSigmaPr_pions"), selectedPionTracks[i].tpcNSigmaPr(), selectedPionTrackVector.Pt()); + histosMCreco.fill(HIST("tpcNSigmaEl_pions"), selectedPionTracks[i].tpcNSigmaEl(), selectedPionTrackVector.Pt()); + histosMCreco.fill(HIST("tpcNSigmaMu_pions"), selectedPionTracks[i].tpcNSigmaMu(), selectedPionTrackVector.Pt()); + histosMCreco.fill(HIST("tofNSigmaPi_pions"), selectedPionTracks[i].tofNSigmaPi(), selectedPionTrackVector.Pt()); + histosMCreco.fill(HIST("tofNSigmaKa_pions"), selectedPionTracks[i].tofNSigmaKa(), selectedPionTrackVector.Pt()); + histosMCreco.fill(HIST("tofNSigmaPr_pions"), selectedPionTracks[i].tofNSigmaPr(), selectedPionTrackVector.Pt()); + histosMCreco.fill(HIST("tofNSigmaEl_pions"), selectedPionTracks[i].tofNSigmaEl(), selectedPionTrackVector.Pt()); + histosMCreco.fill(HIST("tofNSigmaMu_pions"), selectedPionTracks[i].tofNSigmaMu(), selectedPionTrackVector.Pt()); + histosMCreco.fill(HIST("pT_track_pions"), std::sqrt(selectedPionTracks[i].px() * selectedPionTracks[i].px() + selectedPionTracks[i].py() * selectedPionTracks[i].py())); + histosMCreco.fill(HIST("rapidity_track_pions"), selectedPionTrackVector.Rapidity()); } // End of loop over tracks with selection and PID selection of Pions if (numSelectedPionTracks != numFourPionTracks) { @@ -1290,15 +1306,15 @@ struct ExclusiveRhoTo4Pi { ROOT::Math::PxPyPzMVector p3(selectedPionMinusTracks[0].px(), selectedPionMinusTracks[0].py(), selectedPionMinusTracks[0].pz(), o2::constants::physics::MassPionCharged); ROOT::Math::PxPyPzMVector p4(selectedPionMinusTracks[1].px(), selectedPionMinusTracks[1].py(), selectedPionMinusTracks[1].pz(), o2::constants::physics::MassPionCharged); - histosMCreco.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p1.Pt()); - histosMCreco.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p2.Pt()); - histosMCreco.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p3.Pt()); - histosMCreco.fill(HIST("pT_track_WTS_PID_Pi_contributed"), p4.Pt()); + histosMCreco.fill(HIST("pT_track_pions_contributed"), p1.Pt()); + histosMCreco.fill(HIST("pT_track_pions_contributed"), p2.Pt()); + histosMCreco.fill(HIST("pT_track_pions_contributed"), p3.Pt()); + histosMCreco.fill(HIST("pT_track_pions_contributed"), p4.Pt()); - histosMCreco.fill(HIST("rapidity_track_WTS_PID_Pi_contributed"), p1.Rapidity()); - histosMCreco.fill(HIST("rapidity_track_WTS_PID_Pi_contributed"), p2.Rapidity()); - histosMCreco.fill(HIST("rapidity_track_WTS_PID_Pi_contributed"), p3.Rapidity()); - histosMCreco.fill(HIST("rapidity_track_WTS_PID_Pi_contributed"), p4.Rapidity()); + histosMCreco.fill(HIST("rapidity_track_pions_contributed"), p1.Rapidity()); + histosMCreco.fill(HIST("rapidity_track_pions_contributed"), p2.Rapidity()); + histosMCreco.fill(HIST("rapidity_track_pions_contributed"), p3.Rapidity()); + histosMCreco.fill(HIST("rapidity_track_pions_contributed"), p4.Rapidity()); k1.SetCoordinates(p1.Pt(), p1.Eta(), p1.Phi(), o2::constants::physics::MassPionCharged); k2.SetCoordinates(p2.Pt(), p2.Eta(), p2.Phi(), o2::constants::physics::MassPionCharged); @@ -1341,30 +1357,30 @@ struct ExclusiveRhoTo4Pi { phiPair1, phiPair2, cosThetaPair1, cosThetaPair2); if (std::fabs(p1234.Rapidity()) < rhoRapCut) { - histosMCreco.fill(HIST("pT_event_0charge_WTS_PID_Pi"), p1234.Pt()); + histosMCreco.fill(HIST("fourpion_pT_0_charge"), p1234.Pt()); if (p1234.Pt() < rhoPtCut) { - histosMCreco.fill(HIST("rapidity_event_0charge_WTS_PID_Pi_domainA"), p1234.Rapidity()); - histosMCreco.fill(HIST("invMass_event_0charge_WTS_PID_Pi_domainA"), p1234.M()); - - histosMCreco.fill(HIST("invMass_pair_1"), (p1 + p3).M()); - histosMCreco.fill(HIST("invMass_pair_2"), (p1 + p4).M()); - histosMCreco.fill(HIST("invMass_pair_3"), (p2 + p3).M()); - histosMCreco.fill(HIST("invMass_pair_4"), (p2 + p4).M()); - - histosMCreco.fill(HIST("CS_phi_pair_1"), phiPair1); - histosMCreco.fill(HIST("CS_phi_pair_2"), phiPair2); - histosMCreco.fill(HIST("CS_costheta_pair_1"), cosThetaPair1); - histosMCreco.fill(HIST("CS_costheta_pair_2"), cosThetaPair2); - histosMCreco.fill(HIST("phi_cosTheta_pair_1"), phiPair1, cosThetaPair1); - histosMCreco.fill(HIST("phi_cosTheta_pair_2"), phiPair2, cosThetaPair2); + histosMCreco.fill(HIST("fourpion_rap_0_charge_domA"), p1234.Rapidity()); + histosMCreco.fill(HIST("fourpion_mass_0_charge_domA"), p1234.M()); + + histosMCreco.fill(HIST("twopion_mass_1"), (p1 + p3).M()); + histosMCreco.fill(HIST("twopion_mass_2"), (p1 + p4).M()); + histosMCreco.fill(HIST("twopion_mass_3"), (p2 + p3).M()); + histosMCreco.fill(HIST("twopion_mass_4"), (p2 + p4).M()); + + histosMCreco.fill(HIST("collin_soper_phi_1"), phiPair1); + histosMCreco.fill(HIST("collin_soper_phi_2"), phiPair2); + histosMCreco.fill(HIST("collin_soper_costheta_1"), cosThetaPair1); + histosMCreco.fill(HIST("collin_soper_costheta_2"), cosThetaPair2); + histosMCreco.fill(HIST("phi_vs_costheta_1"), phiPair1, cosThetaPair1); + histosMCreco.fill(HIST("phi_vs_costheta_2"), phiPair2, cosThetaPair2); } if (p1234.Pt() > rhoPtCut && p1234.Pt() < zeroPointEight) { - histosMCreco.fill(HIST("rapidity_event_0charge_WTS_PID_Pi_domainB"), p1234.Rapidity()); - histosMCreco.fill(HIST("invMass_event_0charge_WTS_PID_Pi_domainB"), p1234.M()); + histosMCreco.fill(HIST("fourpion_rap_0_charge_domB"), p1234.Rapidity()); + histosMCreco.fill(HIST("fourpion_mass_0_charge_domB"), p1234.M()); } if (p1234.Pt() > zeroPointEight) { - histosMCreco.fill(HIST("rapidity_event_0charge_WTS_PID_Pi_domainC"), p1234.Rapidity()); - histosMCreco.fill(HIST("invMass_event_0charge_WTS_PID_Pi_domainC"), p1234.M()); + histosMCreco.fill(HIST("fourpion_rap_0_charge_domC"), p1234.Rapidity()); + histosMCreco.fill(HIST("fourpion_mass_0_charge_domC"), p1234.M()); } } // End of Rapidity range selection @@ -1380,19 +1396,19 @@ struct ExclusiveRhoTo4Pi { ROOT::Math::PxPyPzMVector p1234 = p1 + p2 + p3 + p4; if (std::fabs(p1234.Rapidity()) < rhoRapCut) { - histosMCreco.fill(HIST("pT_event_non0charge_WTS_PID_Pi"), p1234.Pt()); + histosMCreco.fill(HIST("fourpion_pT_non_0_charge"), p1234.Pt()); if (p1234.Pt() < rhoPtCut) { - histosMCreco.fill(HIST("rapidity_event_non0charge_WTS_PID_Pi_domainA"), p1234.Rapidity()); - histosMCreco.fill(HIST("invMass_event_non0charge_WTS_PID_Pi_domainA"), p1234.M()); + histosMCreco.fill(HIST("fourpion_rap_non_0_charge_domA"), p1234.Rapidity()); + histosMCreco.fill(HIST("fourpion_mass_non_0_charge_domA"), p1234.M()); } if (p1234.Pt() > rhoPtCut && p1234.Pt() < zeroPointEight) { - histosMCreco.fill(HIST("rapidity_event_non0charge_WTS_PID_Pi_domainB"), p1234.Rapidity()); - histosMCreco.fill(HIST("invMass_event_non0charge_WTS_PID_Pi_domainB"), p1234.M()); + histosMCreco.fill(HIST("fourpion_rap_non_0_charge_domB"), p1234.Rapidity()); + histosMCreco.fill(HIST("fourpion_mass_non_0_charge_domB"), p1234.M()); } if (p1234.Pt() > zeroPointEight) { - histosMCreco.fill(HIST("rapidity_event_non0charge_WTS_PID_Pi_domainC"), p1234.Rapidity()); - histosMCreco.fill(HIST("invMass_event_non0charge_WTS_PID_Pi_domainC"), p1234.M()); + histosMCreco.fill(HIST("fourpion_rap_non_0_charge_domC"), p1234.Rapidity()); + histosMCreco.fill(HIST("fourpion_mass_non_0_charge_domC"), p1234.M()); } } // End of Rapidity range selection From ea070ab755f32d595c6c63eff00f08e9fa4e4adb Mon Sep 17 00:00:00 2001 From: Shyam Kumar Date: Tue, 10 Jun 2025 09:14:46 +0200 Subject: [PATCH 1564/1650] [PWGHF] Selection of prompt and non-prompt scores within a defined range (#11510) --- PWGHF/HFC/Tasks/taskCorrelationDplusHadrons.cxx | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/PWGHF/HFC/Tasks/taskCorrelationDplusHadrons.cxx b/PWGHF/HFC/Tasks/taskCorrelationDplusHadrons.cxx index 339ab91a27c..834bf4d217c 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationDplusHadrons.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationDplusHadrons.cxx @@ -80,7 +80,8 @@ struct HfTaskCorrelationDplusHadrons { Configurable selectionFlagDplus{"selectionFlagDplus", 7, "Selection Flag for D+"}; // 7 corresponds to topo+PID cuts Configurable selNoSameBunchPileUpColl{"selNoSameBunchPileUpColl", true, "Flag for rejecting the collisions associated with the same bunch crossing"}; Configurable> classMl{"classMl", {0, 1, 2}, "Indexes of ML scores to be stored. Three indexes max."}; - Configurable> mlScorePromptOrNonPrompt{"mlScorePromptOrNonPrompt", {0.5, 0.5, 0.5, 0.5}, "Machine learning scores for prompt or Feed-down"}; + Configurable> mlScorePromptOrNonPromptMin{"mlScorePromptOrNonPromptMin", {0.5, 0.5, 0.5, 0.5}, "Minimum Machine learning scores for prompt or Feed-down"}; + Configurable> mlScorePromptOrNonPromptMax{"mlScorePromptOrNonPromptMax", {1.0, 1.0, 1.0, 1.0}, "Maximum Machine learning scores for prompt or Feed-down"}; Configurable> mlScoreBkg{"mlScoreBkg", {0.5, 0.5, 0.5, 0.5}, "Machine learning scores for bkg"}; // pT ranges for correlation plots: the default values are those embedded in hf_cuts_dplus_to_pi_k_pi (i.e. the mass pT bins), but can be redefined via json files Configurable> binsPtCorrelations{"binsPtCorrelations", std::vector{ptBinsCorrelationsVec}, "pT bin limits for correlation plots"}; @@ -315,7 +316,7 @@ struct HfTaskCorrelationDplusHadrons { continue; } - if (bdtScorePromptOrNonPrompt < mlScorePromptOrNonPrompt->at(effBinD) || bdtScoreBkg > mlScoreBkg->at(effBinD)) { + if (bdtScorePromptOrNonPrompt < mlScorePromptOrNonPromptMin->at(effBinD) || bdtScorePromptOrNonPrompt > mlScorePromptOrNonPromptMax->at(effBinD) || bdtScoreBkg > mlScoreBkg->at(effBinD)) { continue; } double efficiencyWeightD = 1.; @@ -354,7 +355,7 @@ struct HfTaskCorrelationDplusHadrons { continue; } - if (bdtScorePromptOrNonPrompt < mlScorePromptOrNonPrompt->at(effBinD) || bdtScoreBkg > mlScoreBkg->at(effBinD)) { + if (bdtScorePromptOrNonPrompt < mlScorePromptOrNonPromptMin->at(effBinD) || bdtScorePromptOrNonPrompt > mlScorePromptOrNonPromptMax->at(effBinD) || bdtScoreBkg > mlScoreBkg->at(effBinD)) { continue; } if (trackDcaXY > dcaXYTrackMax || trackDcaZ > dcaZTrackMax || trackTpcCrossedRows < nTpcCrossedRaws) { @@ -417,7 +418,7 @@ struct HfTaskCorrelationDplusHadrons { if (ptD < binsPtEfficiencyD->front() || ptD > binsPtEfficiencyD->back()) continue; - if (bdtScorePromptOrNonPrompt < mlScorePromptOrNonPrompt->at(effBinD) || bdtScoreBkg > mlScoreBkg->at(effBinD)) { + if (bdtScorePromptOrNonPrompt < mlScorePromptOrNonPromptMin->at(effBinD) || bdtScorePromptOrNonPrompt > mlScorePromptOrNonPromptMax->at(effBinD) || bdtScoreBkg > mlScoreBkg->at(effBinD)) { continue; } double efficiencyWeightD = 1.; @@ -471,7 +472,7 @@ struct HfTaskCorrelationDplusHadrons { if (ptD < binsPtEfficiencyD->front() || ptD > binsPtEfficiencyD->back()) continue; - if (bdtScorePromptOrNonPrompt < mlScorePromptOrNonPrompt->at(effBinD) || bdtScoreBkg > mlScoreBkg->at(effBinD)) { + if (bdtScorePromptOrNonPrompt < mlScorePromptOrNonPromptMin->at(effBinD) || bdtScorePromptOrNonPrompt > mlScorePromptOrNonPromptMax->at(effBinD) || bdtScoreBkg > mlScoreBkg->at(effBinD)) { continue; } if (trackDcaXY > dcaXYTrackMax || trackDcaZ > dcaZTrackMax || trackTpcCrossedRows < nTpcCrossedRaws) { @@ -628,7 +629,7 @@ struct HfTaskCorrelationDplusHadrons { for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { outputMl[iclass] = candidate.mlProbDplusToPiKPi()[classMl->at(iclass)]; } - if (outputMl[0] > mlScoreBkg->at(o2::analysis::findBin(binsPtEfficiencyD, candidate.pt())) || outputMl[idxBdtScore] < mlScorePromptOrNonPrompt->at(o2::analysis::findBin(binsPtEfficiencyD, candidate.pt()))) { + if (outputMl[0] > mlScoreBkg->at(o2::analysis::findBin(binsPtEfficiencyD, candidate.pt())) || outputMl[idxBdtScore] < mlScorePromptOrNonPromptMin->at(o2::analysis::findBin(binsPtEfficiencyD, candidate.pt())) || outputMl[idxBdtScore] > mlScorePromptOrNonPromptMax->at(o2::analysis::findBin(binsPtEfficiencyD, candidate.pt()))) { continue; } auto collision = candidate.template collision_as>(); From 7c55e60b7efc80a514feb6297b4f083fdd1a6612 Mon Sep 17 00:00:00 2001 From: suyoupeng <109774812+15071832337@users.noreply.github.com> Date: Tue, 10 Jun 2025 17:31:15 +0800 Subject: [PATCH 1565/1650] [PWGLF] Lambda local polarization induced by jet in pp collision 13.6 TeV (#11529) --- .../Strangeness/lambdaJetpolarization.cxx | 61 ++++++++----------- 1 file changed, 24 insertions(+), 37 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx b/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx index 3acfbad4d10..cca1bdf193e 100644 --- a/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx +++ b/PWGLF/Tasks/Strangeness/lambdaJetpolarization.cxx @@ -29,6 +29,9 @@ #include #include "TProfile2D.h" #include "PWGLF/DataModel/lambdaJetpolarization.h" +#include "Math/Vector3D.h" +#include "Math/Vector4D.h" +#include "Math/GenVector/Boost.h" #include #include @@ -351,6 +354,8 @@ struct LfMyV0s { } double massPr = o2::constants::physics::MassProton; double massLambda = o2::constants::physics::MassLambda; + double massPi = o2::constants::physics::MassPionCharged; + ROOT::Math::PxPyPzMVector ProtonVec, PionVec, LambdaVec, ProtonBoostedVec, LambdaBoostedVec; TMatrixD LorentzTransInV0frame(double ELambda, double Lambdapx, double Lambdapy, double Lambdapz) { @@ -1233,32 +1238,20 @@ struct LfMyV0s { if (passedLambdaSelection(v0, pos, neg) && ctauLambda < CtauLambda && ifpasslambda) { V0NumbersPerEventsel++; registryLongitudinalPolarization.fill(HIST("hMassVsPtLambda"), v0.pt(), v0.mLambda()); - double PLambda = sqrt(v0.px() * v0.px() + v0.py() * v0.py() + v0.pz() * v0.pz()); - double ELambda = sqrt(v0.mLambda() * v0.mLambda() + PLambda * PLambda); - double protonE = sqrt(massPr * massPr + pos.px() * pos.px() + pos.py() * pos.py() + pos.pz() * pos.pz()); - TMatrixD pLabV0(4, 1); - pLabV0(0, 0) = ELambda; - pLabV0(1, 0) = v0.px(); - pLabV0(2, 0) = v0.py(); - pLabV0(3, 0) = v0.pz(); - TMatrixD pLabproton(4, 1); - pLabproton(0, 0) = protonE; - pLabproton(1, 0) = pos.px(); - pLabproton(2, 0) = pos.py(); - pLabproton(3, 0) = pos.pz(); + ProtonVec = ROOT::Math::PxPyPzMVector(v0.pxpos(), v0.pypos(), v0.pzpos(), massPr); + PionVec = ROOT::Math::PxPyPzMVector(v0.pxneg(), v0.pyneg(), v0.pzneg(), massPi); + LambdaVec = ProtonVec + PionVec; + LambdaVec.SetM(massLambda); + ROOT::Math::Boost boost{LambdaVec.BoostToCM()}; + ProtonBoostedVec = boost(ProtonVec); + LambdaBoostedVec = boost(LambdaVec); - TMatrixD V0InV0(4, 1); - V0InV0 = LorentzTransInV0frame(ELambda, v0.px(), v0.py(), v0.pz()) * pLabV0; - registryLongitudinalPolarization.fill(HIST("V0pxInRest_frame"), V0InV0(1, 0)); - registryLongitudinalPolarization.fill(HIST("V0pyInRest_frame"), V0InV0(2, 0)); - registryLongitudinalPolarization.fill(HIST("V0pzInRest_frame"), V0InV0(3, 0)); + registryLongitudinalPolarization.fill(HIST("V0pxInRest_frame"), LambdaBoostedVec.Px()); + registryLongitudinalPolarization.fill(HIST("V0pyInRest_frame"), LambdaBoostedVec.Py()); + registryLongitudinalPolarization.fill(HIST("V0pzInRest_frame"), LambdaBoostedVec.Pz()); - TMatrixD protonInV0(4, 1); - protonInV0 = LorentzTransInV0frame(ELambda, v0.px(), v0.py(), v0.pz()) * pLabproton; - double protonPInV0 = sqrt(protonInV0(1, 0) * protonInV0(1, 0) + protonInV0(2, 0) * protonInV0(2, 0) + protonInV0(3, 0) * protonInV0(3, 0)); - - double protonCosThetainV0 = protonInV0(3, 0) / protonPInV0; + double protonCosThetainV0 = ProtonBoostedVec.Pz() / ProtonBoostedVec.P(); registryLongitudinalPolarization.fill(HIST("hprotoncosthetainV0"), protonCosThetainV0); registryLongitudinalPolarization.fill(HIST("hprotoncosSquarethetainV0"), protonCosThetainV0 * protonCosThetainV0); @@ -1272,21 +1265,15 @@ struct LfMyV0s { if (passedAntiLambdaSelection(v0, pos, neg) && ctauAntiLambda < CtauLambda && ifpasslambda) { registryLongitudinalPolarization.fill(HIST("hMassVsPtAntiLambda"), v0.pt(), v0.mAntiLambda()); - double PLambda = sqrt(v0.px() * v0.px() + v0.py() * v0.py() + v0.pz() * v0.pz()); - double ELambda = sqrt(v0.mAntiLambda() * v0.mAntiLambda() + PLambda * PLambda); - double protonE = sqrt(massPr * massPr + neg.px() * neg.px() + neg.py() * neg.py() + neg.pz() * neg.pz()); - - TMatrixD pLabproton(4, 1); - pLabproton(0, 0) = protonE; - pLabproton(1, 0) = neg.px(); - pLabproton(2, 0) = neg.py(); - pLabproton(3, 0) = neg.pz(); - - TMatrixD protonInV0(4, 1); - protonInV0 = LorentzTransInV0frame(ELambda, v0.px(), v0.py(), v0.pz()) * pLabproton; - double protonPInV0 = sqrt(protonInV0(1, 0) * protonInV0(1, 0) + protonInV0(2, 0) * protonInV0(2, 0) + protonInV0(3, 0) * protonInV0(3, 0)); + ProtonVec = ROOT::Math::PxPyPzMVector(v0.pxneg(), v0.pyneg(), v0.pzneg(), massPr); + PionVec = ROOT::Math::PxPyPzMVector(v0.pxpos(), v0.pypos(), v0.pzpos(), massPi); + LambdaVec = ProtonVec + PionVec; + LambdaVec.SetM(massLambda); + ROOT::Math::Boost boost{LambdaVec.BoostToCM()}; + ProtonBoostedVec = boost(ProtonVec); + LambdaBoostedVec = boost(LambdaVec); - double protonCosThetainV0 = protonInV0(3, 0) / protonPInV0; + double protonCosThetainV0 = ProtonBoostedVec.Pz() / ProtonBoostedVec.P(); registryLongitudinalPolarization.fill(HIST("hantiprotoncosthetainV0"), protonCosThetainV0); registryLongitudinalPolarization.fill(HIST("hantiprotoncosSquarethetainV0"), protonCosThetainV0 * protonCosThetainV0); From 8d0698b4c298f648eb471f9bfed1e6f0f2f20018 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Tue, 10 Jun 2025 12:04:27 +0200 Subject: [PATCH 1566/1650] [Infrastructure] Configure clang-format to sort and group includes (#11448) --- .clang-format | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++- CPPLINT.cfg | 2 +- 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/.clang-format b/.clang-format index c5979d77ba1..33e5d4f9d0c 100644 --- a/.clang-format +++ b/.clang-format @@ -39,7 +39,60 @@ PenaltyBreakFirstLessLess: 120 PenaltyBreakString: 1000 PenaltyExcessCharacter: 1000000 PenaltyReturnTypeOnItsOwnLine: 200 -SortIncludes: false +SortIncludes: CaseSensitive +IncludeBlocks: Regroup +IncludeCategories: + # O2Physics, PWG + - Regex: ^(<|")PWG[A-Z]{2}/.*\.h + Priority: 2 + CaseSensitive: true + # O2Physics, non-PWG + - Regex: ^(<|")(Common|ALICE3|DPG|EventFiltering|Tools|Tutorials)/.*\.h + Priority: 3 + CaseSensitive: true + # O2 + - Regex: ^(<|")(Algorithm|CCDB|Common[A-Z]|DataFormats|DCAFitter|Detectors|EMCAL|Field|Framework|FT0|FV0|GlobalTracking|ITS|MathUtils|MFT|MCH|MID|PHOS|PID|ReconstructionDataFormats|SimulationDataFormat|TOF|TPC|ZDC).*/.*\.h + Priority: 4 + CaseSensitive: true + # ROOT + - Regex: ^(<|")(T[A-Z]|Math/|Roo[A-Z])[[:alnum:]/]+\.h + Priority: 5 + CaseSensitive: true + # known third-party: KFParticle + - Regex: ^(<|")KF[A-Z][[:alnum:]]+\.h + Priority: 6 + CaseSensitive: true + # known third-party: FastJet + - Regex: ^(<|")fastjet/ + Priority: 6 + CaseSensitive: true + # known third-party: ONNX runtime + - Regex: ^(<|")onnxruntime + Priority: 6 + CaseSensitive: true + # incomplete path to DataModel + - Regex: ^(<|").*DataModel/ + Priority: 1 + CaseSensitive: true + # other third-party + - Regex: ^(<|")([[:alnum:]_]+/)+[[:alnum:]_]+\.h + Priority: 6 + CaseSensitive: true + # other local-looking file + - Regex: ^".*\. + Priority: 1 + CaseSensitive: true + # C system + - Regex: ^(<|")[[:lower:]_]+\.h(>|") + Priority: 102 + CaseSensitive: true + # C++ system + - Regex: ^(<|")[[:lower:]_/]+(>|") + Priority: 101 + CaseSensitive: true + # rest + - Regex: .* + Priority: 100 SpaceBeforeAssignmentOperators: true SpaceBeforeParens: ControlStatements SpaceInEmptyParentheses: false diff --git a/CPPLINT.cfg b/CPPLINT.cfg index 7f7d3c357c3..96a8077f685 100644 --- a/CPPLINT.cfg +++ b/CPPLINT.cfg @@ -1 +1 @@ -filter=-build/c++11,-build/namespaces,-readability/fn_size,-readability/todo,-runtime/references,-whitespace/blank_line,-whitespace/braces,-whitespace/comments,-whitespace/indent_namespace,-whitespace/line_length,-whitespace/semicolon,-whitespace/todo +filter=-build/c++11,-build/include_order,-build/namespaces,-readability/fn_size,-readability/todo,-runtime/references,-whitespace/blank_line,-whitespace/braces,-whitespace/comments,-whitespace/indent_namespace,-whitespace/line_length,-whitespace/semicolon,-whitespace/todo From 4699d4ae442bbf8b3cdc161e255562a4b4eb223b Mon Sep 17 00:00:00 2001 From: Oleksii Lubynets Date: Tue, 10 Jun 2025 13:20:52 +0200 Subject: [PATCH 1567/1650] [PWGHF] Enable ML selection in KF-based LcToPKPi reconstruction (#11489) --- PWGHF/Core/HfMlResponseLcToPKPi.h | 63 +++++++++-- PWGHF/TableProducer/candidateSelectorLc.cxx | 59 +++++++--- PWGHF/TableProducer/treeCreatorLcToPKPi.cxx | 116 +++++++++++++++++--- 3 files changed, 194 insertions(+), 44 deletions(-) diff --git a/PWGHF/Core/HfMlResponseLcToPKPi.h b/PWGHF/Core/HfMlResponseLcToPKPi.h index 405e16cfc42..ae797f32acd 100644 --- a/PWGHF/Core/HfMlResponseLcToPKPi.h +++ b/PWGHF/Core/HfMlResponseLcToPKPi.h @@ -16,8 +16,12 @@ #ifndef PWGHF_CORE_HFMLRESPONSELCTOPKPI_H_ #define PWGHF_CORE_HFMLRESPONSELCTOPKPI_H_ +#include +#include #include +#include "PWGHF/DataModel/CandidateReconstructionTables.h" + #include "PWGHF/Core/HfMlResponse.h" // Fill the map of available input features @@ -129,10 +133,22 @@ enum class InputFeaturesLcToPKPi : uint8_t { tofNSigmaPrExpPr0, tofNSigmaPiExpPi2, tpcTofNSigmaPrExpPr0, - tpcTofNSigmaPiExpPi2 + tpcTofNSigmaPiExpPi2, + kfChi2PrimProton, + kfChi2PrimKaon, + kfChi2PrimPion, + kfChi2GeoKaonPion, + kfChi2GeoProtonPion, + kfChi2GeoProtonKaon, + kfDcaKaonPion, + kfDcaProtonPion, + kfDcaProtonKaon, + kfChi2Geo, + kfChi2Topo, + kfDecayLengthNormalised }; -template +template class HfMlResponseLcToPKPi : public HfMlResponse { public: @@ -179,8 +195,6 @@ class HfMlResponseLcToPKPi : public HfMlResponse CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tpcNSigmaPr2, nSigTpcPr2); CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tpcNSigmaKa2, nSigTpcKa2); CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tpcNSigmaPi2, nSigTpcPi2); - // CHECK_AND_FILL_VEC_LCTOPKPI_OBJECT_SIGNED(prong0, prong2, tpcNSigmaPrExpPr0, tpcNSigmaPr); - // CHECK_AND_FILL_VEC_LCTOPKPI_OBJECT_SIGNED(prong2, prong0, tpcNSigmaPiExpPi2, tpcNSigmaPi); CHECK_AND_FILL_VEC_LCTOPKPI_SIGNED(candidate, tpcNSigmaPrExpPr0, nSigTpcPr0, nSigTpcPr2); CHECK_AND_FILL_VEC_LCTOPKPI_SIGNED(candidate, tpcNSigmaPiExpPi2, nSigTpcPi2, nSigTpcPi0); // TOF PID variables @@ -193,8 +207,6 @@ class HfMlResponseLcToPKPi : public HfMlResponse CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tofNSigmaPr2, nSigTofPr2); CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tofNSigmaKa2, nSigTofKa2); CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tofNSigmaPi2, nSigTofPi2); - // CHECK_AND_FILL_VEC_LCTOPKPI_OBJECT_SIGNED(prong0, prong2, tofNSigmaPrExpPr0, tofNSigmaPr); - // CHECK_AND_FILL_VEC_LCTOPKPI_OBJECT_SIGNED(prong2, prong0, tofNSigmaPiExpPi2, tofNSigmaPi); CHECK_AND_FILL_VEC_LCTOPKPI_SIGNED(candidate, tofNSigmaPrExpPr0, nSigTofPr0, nSigTofPr2); CHECK_AND_FILL_VEC_LCTOPKPI_SIGNED(candidate, tofNSigmaPiExpPi2, nSigTofPi2, nSigTofPi0); // Combined PID variables @@ -207,13 +219,29 @@ class HfMlResponseLcToPKPi : public HfMlResponse CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tpcTofNSigmaPr0, tpcTofNSigmaPr0); CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tpcTofNSigmaPr1, tpcTofNSigmaPr1); CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, tpcTofNSigmaPr2, tpcTofNSigmaPr2); - // CHECK_AND_FILL_VEC_LCTOPKPI_OBJECT_SIGNED(prong0, prong2, tpcTofNSigmaPrExpPr0, tpcTofNSigmaPr); - // CHECK_AND_FILL_VEC_LCTOPKPI_OBJECT_SIGNED(prong2, prong0, tpcTofNSigmaPiExpPi2, tpcTofNSigmaPi); CHECK_AND_FILL_VEC_LCTOPKPI_SIGNED(candidate, tpcTofNSigmaPrExpPr0, tpcTofNSigmaPr0, tpcTofNSigmaPr2); CHECK_AND_FILL_VEC_LCTOPKPI_SIGNED(candidate, tpcTofNSigmaPiExpPi2, tpcTofNSigmaPi2, tpcTofNSigmaPi0); } + if constexpr (reconstructionType == aod::hf_cand::VertexerType::KfParticle) { + switch (idx) { + CHECK_AND_FILL_VEC_LCTOPKPI_SIGNED(candidate, kfChi2PrimProton, kfChi2PrimProng0, kfChi2PrimProng2); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, kfChi2PrimKaon, kfChi2PrimProng1); + CHECK_AND_FILL_VEC_LCTOPKPI_SIGNED(candidate, kfChi2PrimPion, kfChi2PrimProng2, kfChi2PrimProng0); + CHECK_AND_FILL_VEC_LCTOPKPI_SIGNED(candidate, kfChi2GeoKaonPion, kfChi2GeoProng1Prong2, kfChi2GeoProng0Prong1); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, kfChi2GeoProtonPion, kfChi2GeoProng0Prong2); + CHECK_AND_FILL_VEC_LCTOPKPI_SIGNED(candidate, kfChi2GeoProtonKaon, kfChi2GeoProng0Prong1, kfChi2GeoProng1Prong2); + CHECK_AND_FILL_VEC_LCTOPKPI_SIGNED(candidate, kfDcaKaonPion, kfDcaProng1Prong2, kfDcaProng0Prong1); + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, kfDcaProtonPion, kfDcaProng0Prong2); + CHECK_AND_FILL_VEC_LCTOPKPI_SIGNED(candidate, kfDcaProtonKaon, kfDcaProng0Prong1, kfDcaProng1Prong2); + CHECK_AND_FILL_VEC_LCTOPKPI(kfChi2Geo); + CHECK_AND_FILL_VEC_LCTOPKPI(kfChi2Topo); + case static_cast(InputFeaturesLcToPKPi::kfDecayLengthNormalised): { + inputFeatures.emplace_back(candidate.kfDecayLength() / candidate.kfDecayLengthError()); + break; + } + } + } } - return inputFeatures; } @@ -273,6 +301,23 @@ class HfMlResponseLcToPKPi : public HfMlResponse FILL_MAP_LCTOPKPI(tpcTofNSigmaPr2), FILL_MAP_LCTOPKPI(tpcTofNSigmaPrExpPr0), FILL_MAP_LCTOPKPI(tpcTofNSigmaPiExpPi2)}; + if constexpr (reconstructionType == aod::hf_cand::VertexerType::KfParticle) { + std::map mapKfFeatures{ + // KFParticle variables + FILL_MAP_LCTOPKPI(kfChi2PrimProton), + FILL_MAP_LCTOPKPI(kfChi2PrimKaon), + FILL_MAP_LCTOPKPI(kfChi2PrimPion), + FILL_MAP_LCTOPKPI(kfChi2GeoKaonPion), + FILL_MAP_LCTOPKPI(kfChi2GeoProtonPion), + FILL_MAP_LCTOPKPI(kfChi2GeoProtonKaon), + FILL_MAP_LCTOPKPI(kfDcaKaonPion), + FILL_MAP_LCTOPKPI(kfDcaProtonPion), + FILL_MAP_LCTOPKPI(kfDcaProtonKaon), + FILL_MAP_LCTOPKPI(kfChi2Geo), + FILL_MAP_LCTOPKPI(kfChi2Topo), + FILL_MAP_LCTOPKPI(kfDecayLengthNormalised)}; + MlResponse::mAvailableInputFeatures.insert(mapKfFeatures.begin(), mapKfFeatures.end()); + } } }; diff --git a/PWGHF/TableProducer/candidateSelectorLc.cxx b/PWGHF/TableProducer/candidateSelectorLc.cxx index 93b84c79522..d48cb5f3daa 100644 --- a/PWGHF/TableProducer/candidateSelectorLc.cxx +++ b/PWGHF/TableProducer/candidateSelectorLc.cxx @@ -93,7 +93,8 @@ struct HfCandidateSelectorLc { Configurable loadModelsFromCCDB{"loadModelsFromCCDB", false, "Flag to enable or disable the loading of models from CCDB"}; HfHelper hfHelper; - o2::analysis::HfMlResponseLcToPKPi hfMlResponse; + o2::analysis::HfMlResponseLcToPKPi hfMlResponseDCA; + o2::analysis::HfMlResponseLcToPKPi hfMlResponseKF; std::vector outputMlLcToPKPi = {}; std::vector outputMlLcToPiKP = {}; o2::ccdb::CcdbApi ccdbApi; @@ -142,15 +143,28 @@ struct HfCandidateSelectorLc { } if (applyMl) { - hfMlResponse.configure(binsPtMl, cutsMl, cutDirMl, nClassesMl); - if (loadModelsFromCCDB) { - ccdbApi.init(ccdbUrl); - hfMlResponse.setModelPathsCCDB(onnxFileNames, ccdbApi, modelPathsCCDB, timestampCCDB); - } else { - hfMlResponse.setModelPathsLocal(onnxFileNames); + if (doprocessNoBayesPidWithDCAFitterN || doprocessBayesPidWithDCAFitterN) { + hfMlResponseDCA.configure(binsPtMl, cutsMl, cutDirMl, nClassesMl); + if (loadModelsFromCCDB) { + ccdbApi.init(ccdbUrl); + hfMlResponseDCA.setModelPathsCCDB(onnxFileNames, ccdbApi, modelPathsCCDB, timestampCCDB); + } else { + hfMlResponseDCA.setModelPathsLocal(onnxFileNames); + } + hfMlResponseDCA.cacheInputFeaturesIndices(namesInputFeatures); + hfMlResponseDCA.init(); + } + if (doprocessNoBayesPidWithKFParticle || doprocessBayesPidWithKFParticle) { + hfMlResponseKF.configure(binsPtMl, cutsMl, cutDirMl, nClassesMl); + if (loadModelsFromCCDB) { + ccdbApi.init(ccdbUrl); + hfMlResponseKF.setModelPathsCCDB(onnxFileNames, ccdbApi, modelPathsCCDB, timestampCCDB); + } else { + hfMlResponseKF.setModelPathsLocal(onnxFileNames); + } + hfMlResponseKF.cacheInputFeaturesIndices(namesInputFeatures); + hfMlResponseKF.init(); } - hfMlResponse.cacheInputFeaturesIndices(namesInputFeatures); - hfMlResponse.init(); } massK0Star892 = o2::constants::physics::MassK0Star892; @@ -273,7 +287,7 @@ struct HfCandidateSelectorLc { return false; } - float massLc, massKPi; + float massLc{0.f}, massKPi{0.f}; if constexpr (reconstructionType == aod::hf_cand::VertexerType::DCAFitter) { if (trackProton.globalIndex() == candidate.prong0Id()) { massLc = hfHelper.invMassLcToPKPi(candidate); @@ -553,13 +567,24 @@ struct HfCandidateSelectorLc { isSelectedMlLcToPKPi = false; isSelectedMlLcToPiKP = false; - if (pidLcToPKPi == 1 && pidBayesLcToPKPi == 1 && topolLcToPKPi) { - std::vector inputFeaturesLcToPKPi = hfMlResponse.getInputFeatures(candidate, true); - isSelectedMlLcToPKPi = hfMlResponse.isSelectedMl(inputFeaturesLcToPKPi, candidate.pt(), outputMlLcToPKPi); - } - if (pidLcToPiKP == 1 && pidBayesLcToPiKP == 1 && topolLcToPiKP) { - std::vector inputFeaturesLcToPiKP = hfMlResponse.getInputFeatures(candidate, false); - isSelectedMlLcToPiKP = hfMlResponse.isSelectedMl(inputFeaturesLcToPiKP, candidate.pt(), outputMlLcToPiKP); + if constexpr (reconstructionType == aod::hf_cand::VertexerType::DCAFitter) { + if (pidLcToPKPi == 1 && pidBayesLcToPKPi == 1 && topolLcToPKPi) { + std::vector inputFeaturesLcToPKPi = hfMlResponseDCA.getInputFeatures(candidate, true); + isSelectedMlLcToPKPi = hfMlResponseDCA.isSelectedMl(inputFeaturesLcToPKPi, candidate.pt(), outputMlLcToPKPi); + } + if (pidLcToPiKP == 1 && pidBayesLcToPiKP == 1 && topolLcToPiKP) { + std::vector inputFeaturesLcToPiKP = hfMlResponseDCA.getInputFeatures(candidate, false); + isSelectedMlLcToPiKP = hfMlResponseDCA.isSelectedMl(inputFeaturesLcToPiKP, candidate.pt(), outputMlLcToPiKP); + } + } else { + if (pidLcToPKPi == 1 && pidBayesLcToPKPi == 1 && topolLcToPKPi) { + std::vector inputFeaturesLcToPKPi = hfMlResponseKF.getInputFeatures(candidate, true); + isSelectedMlLcToPKPi = hfMlResponseKF.isSelectedMl(inputFeaturesLcToPKPi, candidate.pt(), outputMlLcToPKPi); + } + if (pidLcToPiKP == 1 && pidBayesLcToPiKP == 1 && topolLcToPiKP) { + std::vector inputFeaturesLcToPiKP = hfMlResponseKF.getInputFeatures(candidate, false); + isSelectedMlLcToPiKP = hfMlResponseKF.isSelectedMl(inputFeaturesLcToPiKP, candidate.pt(), outputMlLcToPiKP); + } } hfMlLcToPKPiCandidate(outputMlLcToPKPi, outputMlLcToPiKP); diff --git a/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx b/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx index 5ad144e472e..3f53966a973 100644 --- a/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx +++ b/PWGHF/TableProducer/treeCreatorLcToPKPi.cxx @@ -17,7 +17,9 @@ /// \author Nicolo' Jacazio , CERN /// \author Luigi Dello Stritto , CERN +#include #include +#include #include "CommonConstants/PhysicsConstants.h" #include "Framework/AnalysisTask.h" @@ -87,6 +89,9 @@ DECLARE_SOA_COLUMN(IsCandidateSwapped, isCandidateSwapped, int8_t); DECLARE_SOA_INDEX_COLUMN_FULL(Candidate, candidate, int, HfCand3ProngWPidPiKaPr, "_0"); DECLARE_SOA_INDEX_COLUMN(McParticle, mcParticle); DECLARE_SOA_COLUMN(Channel, channel, int8_t); // direct or resonant +DECLARE_SOA_COLUMN(MlScoreFirstClass, mlScoreFirstClass, float); +DECLARE_SOA_COLUMN(MlScoreSecondClass, mlScoreSecondClass, float); +DECLARE_SOA_COLUMN(MlScoreThirdClass, mlScoreThirdClass, float); // Events DECLARE_SOA_INDEX_COLUMN(McCollision, mcCollision); DECLARE_SOA_COLUMN(IsEventReject, isEventReject, int); @@ -238,7 +243,10 @@ DECLARE_SOA_TABLE(HfCandLcLites, "AOD", "HFCANDLCLITE", full::OriginMcRec, full::IsCandidateSwapped, full::Channel, - full::MassKPi); + full::MassKPi, + full::MlScoreFirstClass, + full::MlScoreSecondClass, + full::MlScoreThirdClass); DECLARE_SOA_TABLE(HfCollIdLCLite, "AOD", "HFCOLLIDLCLITE", full::CollisionId); @@ -316,7 +324,10 @@ DECLARE_SOA_TABLE(HfCandLcFulls, "AOD", "HFCANDLCFULL", full::IsCandidateSwapped, full::CandidateId, full::Channel, - full::MassKPi); + full::MassKPi, + full::MlScoreFirstClass, + full::MlScoreSecondClass, + full::MlScoreThirdClass); DECLARE_SOA_TABLE(HfCandLcFullEvs, "AOD", "HFCANDLCFULLEV", full::CollisionId, @@ -374,6 +385,7 @@ struct HfTreeCreatorLcToPKPi { Configurable fillCandidateLiteTable{"fillCandidateLiteTable", false, "Switch to fill lite table with candidate properties"}; Configurable fillCollIdTable{"fillCollIdTable", false, "Fill a single-column table with collision index"}; Configurable fillCandidateMcTable{"fillCandidateMcTable", false, "Switch to fill a table with MC particles matched to candidates"}; + Configurable applyMl{"applyMl", false, "Whether ML was used in candidateSelectorLc"}; Configurable keepOnlySignalMc{"keepOnlySignalMc", false, "Fill MC tree only with signal candidates"}; Configurable keepOnlyBkg{"keepOnlyBkg", false, "Fill MC tree only with background candidates"}; Configurable downSampleBkgFactor{"downSampleBkgFactor", 1., "Fraction of candidates to store in the tree"}; @@ -553,11 +565,40 @@ struct HfTreeCreatorLcToPKPi { return std::make_pair(invMass, invMassKPi); } + /// \brief function to get ML score values for the current candidate and assign them to input parameters + /// \param candidate candidate instance + /// \param candidateMlScore instance of handler of vectors with ML scores associated with the current candidate + /// \param mlScoreFirstClass ML score for belonging to the first class + /// \param mlScoreSecondClass ML score for belonging to the second class + /// \param mlScoreThirdClass ML score for belonging to the third class + /// \param candFlag flag indicating if PKPi (0) or PiKP (1) hypothesis is used + void assignMlScores(aod::HfMlLcToPKPi::iterator const& candidateMlScore, float& mlScoreFirstClass, float& mlScoreSecondClass, float& mlScoreThirdClass, int candFlag) + { + std::vector mlScores; + if (candFlag == 0) { + std::copy(candidateMlScore.mlProbLcToPKPi().begin(), candidateMlScore.mlProbLcToPKPi().end(), std::back_inserter(mlScores)); + } else { + std::copy(candidateMlScore.mlProbLcToPiKP().begin(), candidateMlScore.mlProbLcToPiKP().end(), std::back_inserter(mlScores)); + } + constexpr int IndexFirstClass{0}; + constexpr int IndexSecondClass{1}; + constexpr int IndexThirdClass{2}; + if (mlScores.size() == 0) { + return; // when candidateSelectorLc rejects a candidate by "usual", non-ML cut, the ml score vector remains empty + } + mlScoreFirstClass = mlScores.at(IndexFirstClass); + mlScoreSecondClass = mlScores.at(IndexSecondClass); + if (mlScores.size() > IndexThirdClass) { + mlScoreThirdClass = mlScores.at(IndexThirdClass); + } + } + /// \brief function to fill lite table /// \param candidate candidate instance + /// \param candidateMlScore instance of handler of vectors with ML scores associated with the current candidate /// \param candFlag flag indicating if PKPi (0) or PiKP (1) hypothesis is used template - void fillLiteTable(CandType const& candidate, int candFlag) + void fillLiteTable(CandType const& candidate, aod::HfMlLcToPKPi::iterator const& candidateMlScore, int candFlag) { auto [functionInvMass, functionInvMassKPi] = evaluateInvariantMasses(candidate, candFlag); const float functionCt = hfHelper.ctLc(candidate); @@ -575,6 +616,14 @@ struct HfTreeCreatorLcToPKPi { functionFlagMcDecayChanRec = candidate.flagMcDecayChanRec(); } + float mlScoreFirstClass{UndefValueFloat}; + float mlScoreSecondClass{UndefValueFloat}; + float mlScoreThirdClass{UndefValueFloat}; + + if (applyMl) { + assignMlScores(candidateMlScore, mlScoreFirstClass, mlScoreSecondClass, mlScoreThirdClass, candFlag); + } + rowCandidateLite( candidate.posX(), candidate.posY(), @@ -618,7 +667,10 @@ struct HfTreeCreatorLcToPKPi { functionOriginMcRec, functionIsCandidateSwapped, functionFlagMcDecayChanRec, - functionInvMassKPi); + functionInvMassKPi, + mlScoreFirstClass, + mlScoreSecondClass, + mlScoreThirdClass); if (fillCollIdTable) { /// save also candidate collision indices @@ -628,9 +680,10 @@ struct HfTreeCreatorLcToPKPi { /// \brief function to fill lite table /// \param candidate candidate instance + /// \param candidateMlScore instance of handler of vectors with ML scores associated with the current candidate /// \param candFlag flag indicating if PKPi (0) or PiKP (1) hypothesis is used template - void fillFullTable(CandType const& candidate, int candFlag) + void fillFullTable(CandType const& candidate, aod::HfMlLcToPKPi::iterator const& candidateMlScore, int candFlag) { auto [functionInvMass, functionInvMassKPi] = evaluateInvariantMasses(candidate, candFlag); const float functionCt = hfHelper.ctLc(candidate); @@ -649,6 +702,14 @@ struct HfTreeCreatorLcToPKPi { functionFlagMcDecayChanRec = candidate.flagMcDecayChanRec(); } + float mlScoreFirstClass{UndefValueFloat}; + float mlScoreSecondClass{UndefValueFloat}; + float mlScoreThirdClass{UndefValueFloat}; + + if (applyMl) { + assignMlScores(candidateMlScore, mlScoreFirstClass, mlScoreSecondClass, mlScoreThirdClass, candFlag); + } + rowCandidateFull( candidate.collisionId(), candidate.posX(), @@ -722,7 +783,10 @@ struct HfTreeCreatorLcToPKPi { functionIsCandidateSwapped, candidate.globalIndex(), functionFlagMcDecayChanRec, - functionInvMassKPi); + functionInvMassKPi, + mlScoreFirstClass, + mlScoreSecondClass, + mlScoreThirdClass); } /// \brief function to fill lite table @@ -839,6 +903,7 @@ struct HfTreeCreatorLcToPKPi { void fillTablesMc(Colls const& collisions, aod::McCollisions const&, CandType const& candidates, + aod::HfMlLcToPKPi const& candidateMlScores, soa::Join const& particles, soa::Join const&, aod::BCs const&) { @@ -850,7 +915,10 @@ struct HfTreeCreatorLcToPKPi { const size_t candidatesSize = candidates.size(); reserveTables(candidatesSize, IsMc); + int iCand{0}; for (const auto& candidate : candidates) { + auto candidateMlScore = candidateMlScores.rawIteratorAt(iCand); + ++iCand; float ptProng0 = candidate.ptProng0(); auto collision = candidate.template collision_as(); auto fillTable = [&](int candFlag) { @@ -863,9 +931,9 @@ struct HfTreeCreatorLcToPKPi { const bool notSkippedBkg = isMcCandidateSignal || candidate.pt() > downSampleBkgPtMax || pseudoRndm < downSampleBkgFactor; if (passSelection && notSkippedBkg && (keepAll || (keepOnlySignalMc && isMcCandidateSignal) || (keepOnlyBkg && !isMcCandidateSignal))) { if (fillCandidateLiteTable) { - fillLiteTable(candidate, candFlag); + fillLiteTable(candidate, candidateMlScore, candFlag); } else { - fillFullTable(candidate, candFlag); + fillFullTable(candidate, candidateMlScore, candFlag); } if constexpr (reconstructionType == aod::hf_cand::VertexerType::KfParticle) { @@ -955,10 +1023,11 @@ struct HfTreeCreatorLcToPKPi { void processMcNoCentralityWithDCAFitterN(soa::Join const& collisions, aod::McCollisions const& mcCollisions, soa::Join const& candidates, + aod::HfMlLcToPKPi const& candidateMlScores, soa::Join const& particles, soa::Join const& tracks, aod::BCs const& bcs) { - fillTablesMc(collisions, mcCollisions, candidates, particles, tracks, bcs); + fillTablesMc(collisions, mcCollisions, candidates, candidateMlScores, particles, tracks, bcs); } PROCESS_SWITCH(HfTreeCreatorLcToPKPi, processMcNoCentralityWithDCAFitterN, "Process MC tree writer w/o centrality with DCAFitterN", false); @@ -971,10 +1040,11 @@ struct HfTreeCreatorLcToPKPi { void processMcWithCentralityWithDCAFitterN(soa::Join const& collisions, aod::McCollisions const& mcCollisions, soa::Join const& candidates, + aod::HfMlLcToPKPi const& candidateMlScores, soa::Join const& particles, soa::Join const& tracks, aod::BCs const& bcs) { - fillTablesMc(collisions, mcCollisions, candidates, particles, tracks, bcs); + fillTablesMc(collisions, mcCollisions, candidates, candidateMlScores, particles, tracks, bcs); } PROCESS_SWITCH(HfTreeCreatorLcToPKPi, processMcWithCentralityWithDCAFitterN, "Process MC tree writer with centrality with DCAFitterN", false); @@ -988,10 +1058,11 @@ struct HfTreeCreatorLcToPKPi { void processMcNoCentralityWithKFParticle(soa::Join const& collisions, aod::McCollisions const& mcCollisions, soa::Join const& candidates, + aod::HfMlLcToPKPi const& candidateMlScores, soa::Join const& particles, soa::Join const& tracks, aod::BCs const& bcs) { - fillTablesMc(collisions, mcCollisions, candidates, particles, tracks, bcs); + fillTablesMc(collisions, mcCollisions, candidates, candidateMlScores, particles, tracks, bcs); } PROCESS_SWITCH(HfTreeCreatorLcToPKPi, processMcNoCentralityWithKFParticle, "Process MC tree writer w/o centrality with KFParticle", false); @@ -1004,10 +1075,11 @@ struct HfTreeCreatorLcToPKPi { void processMcWithCentralityWithKFParticle(soa::Join const& collisions, aod::McCollisions const& mcCollisions, soa::Join const& candidates, + aod::HfMlLcToPKPi const& candidateMlScores, soa::Join const& particles, soa::Join const& tracks, aod::BCs const& bcs) { - fillTablesMc(collisions, mcCollisions, candidates, particles, tracks, bcs); + fillTablesMc(collisions, mcCollisions, candidates, candidateMlScores, particles, tracks, bcs); } PROCESS_SWITCH(HfTreeCreatorLcToPKPi, processMcWithCentralityWithKFParticle, "Process MC tree writer with centrality with KFParticle", false); @@ -1017,6 +1089,7 @@ struct HfTreeCreatorLcToPKPi { template void fillTablesData(Colls const& collisions, CandType const& candidates, + aod::HfMlLcToPKPi const& candidateMlScores, TracksWPid const&, aod::BCs const&) { @@ -1029,7 +1102,10 @@ struct HfTreeCreatorLcToPKPi { // Filling candidate properties + int iCand{0}; for (const auto& candidate : candidates) { + auto candidateMlScore = candidateMlScores.rawIteratorAt(iCand); + ++iCand; float ptProng0 = candidate.ptProng0(); auto collision = candidate.template collision_as(); auto fillTable = [&](int candFlag) { @@ -1037,9 +1113,9 @@ struct HfTreeCreatorLcToPKPi { const int functionSelection = candFlag == 0 ? candidate.isSelLcToPKPi() : candidate.isSelLcToPiKP(); if (functionSelection >= selectionFlagLc && (candidate.pt() > downSampleBkgPtMax || (pseudoRndm < downSampleBkgFactor && candidate.pt() < downSampleBkgPtMax))) { if (fillCandidateLiteTable) { - fillLiteTable(candidate, candFlag); + fillLiteTable(candidate, candidateMlScore, candFlag); } else { - fillFullTable(candidate, candFlag); + fillFullTable(candidate, candidateMlScore, candFlag); } if constexpr (reconstructionType == aod::hf_cand::VertexerType::KfParticle) { @@ -1060,9 +1136,10 @@ struct HfTreeCreatorLcToPKPi { /// \param bcs Bunch-crossing table void processDataNoCentralityWithDCAFitterN(soa::Join const& collisions, soa::Join const& candidates, + aod::HfMlLcToPKPi const& candidateMlScores, TracksWPid const& tracks, aod::BCs const& bcs) { - fillTablesData(collisions, candidates, tracks, bcs); + fillTablesData(collisions, candidates, candidateMlScores, tracks, bcs); } PROCESS_SWITCH(HfTreeCreatorLcToPKPi, processDataNoCentralityWithDCAFitterN, "Process data tree writer w/o centrality with DCAFitterN", false); @@ -1073,9 +1150,10 @@ struct HfTreeCreatorLcToPKPi { /// \param bcs Bunch-crossing table void processDataWithCentralityWithDCAFitterN(soa::Join const& collisions, soa::Join const& candidates, + aod::HfMlLcToPKPi const& candidateMlScores, TracksWPid const& tracks, aod::BCs const& bcs) { - fillTablesData(collisions, candidates, tracks, bcs); + fillTablesData(collisions, candidates, candidateMlScores, tracks, bcs); } PROCESS_SWITCH(HfTreeCreatorLcToPKPi, processDataWithCentralityWithDCAFitterN, "Process data tree writer with centrality with DCAFitterN", true); @@ -1086,9 +1164,10 @@ struct HfTreeCreatorLcToPKPi { /// \param bcs Bunch-crossing table void processDataNoCentralityWithKFParticle(soa::Join const& collisions, soa::Join const& candidates, + aod::HfMlLcToPKPi const& candidateMlScores, TracksWPid const& tracks, aod::BCs const& bcs) { - fillTablesData(collisions, candidates, tracks, bcs); + fillTablesData(collisions, candidates, candidateMlScores, tracks, bcs); } PROCESS_SWITCH(HfTreeCreatorLcToPKPi, processDataNoCentralityWithKFParticle, "Process data tree writer w/o centrality with KFParticle", false); @@ -1099,9 +1178,10 @@ struct HfTreeCreatorLcToPKPi { /// \param bcs Bunch-crossing table void processDataWithCentralityWithKFParticle(soa::Join const& collisions, soa::Join const& candidates, + aod::HfMlLcToPKPi const& candidateMlScores, TracksWPid const& tracks, aod::BCs const& bcs) { - fillTablesData(collisions, candidates, tracks, bcs); + fillTablesData(collisions, candidates, candidateMlScores, tracks, bcs); } PROCESS_SWITCH(HfTreeCreatorLcToPKPi, processDataWithCentralityWithKFParticle, "Process data tree writer with centrality with KFParticle", false); }; From 2d36f307a3fac21f8ab9673ad8ea91b7608b2b70 Mon Sep 17 00:00:00 2001 From: Zhengqing Wang Date: Tue, 10 Jun 2025 20:29:01 +0800 Subject: [PATCH 1568/1650] [PWGCF] update on ese (#11530) Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/flowEsePHe3.cxx | 1564 ++++++++++++++++-------------- 1 file changed, 820 insertions(+), 744 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowEsePHe3.cxx b/PWGCF/Flow/Tasks/flowEsePHe3.cxx index 61582f233b3..624043a2d31 100644 --- a/PWGCF/Flow/Tasks/flowEsePHe3.cxx +++ b/PWGCF/Flow/Tasks/flowEsePHe3.cxx @@ -36,6 +36,8 @@ #include "Framework/RunningWorkflowInfo.h" #include "Framework/StaticFor.h" +#include "DataFormatsTPC/BetheBlochAleph.h" + #include "Common/DataModel/Qvectors.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/TrackSelectionTables.h" @@ -51,42 +53,213 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; +using namespace o2::constants::physics; namespace o2::aod { -namespace flow_ese_p_he3 +namespace ese_var_table { -DECLARE_SOA_COLUMN(NPidFlag, nPidFlag, int8_t); // unqualified -1, hadron 0, proton 1, he3 2, proton+he3 3 -} // namespace flow_ese_p_he3 -DECLARE_SOA_TABLE(PHe3ESEFlags, "AOD", "PHe3ESEFlags", flow_ese_p_he3::NPidFlag); +DECLARE_SOA_COLUMN(EseVtz, eseVtz, float); +DECLARE_SOA_COLUMN(EseCentFT0C, eseCentFT0C, float); +DECLARE_SOA_COLUMN(EsePsi2FT0C, esePsi2FT0C, float); +DECLARE_SOA_COLUMN(Eseq2Tar, eseq2Tar, float); +DECLARE_SOA_COLUMN(Eseq2Ref, eseq2Ref, float); +DECLARE_SOA_COLUMN(EseTarSign, eseTarSign, int8_t); +DECLARE_SOA_COLUMN(EseTarTPCInnerParam, eseTarTPCInnerParam, float); +DECLARE_SOA_COLUMN(EseTarTPCSignal, eseTarTPCSignal, float); +DECLARE_SOA_COLUMN(EseTarPt, eseTarPt, float); +DECLARE_SOA_COLUMN(EseTarEta, eseTarEta, float); +DECLARE_SOA_COLUMN(EseTarPhi, eseTarPhi, float); +DECLARE_SOA_COLUMN(EseTarDCAxy, eseTarDCAxy, float); +DECLARE_SOA_COLUMN(EseTarDCAz, eseTarDCAz, float); +DECLARE_SOA_COLUMN(EseTarTPCNcls, eseTarTPCNcls, uint8_t); +DECLARE_SOA_COLUMN(EseTarITSNcls, eseTarITSNcls, uint8_t); +DECLARE_SOA_COLUMN(EseTarTPCChi2NDF, eseTarTPCChi2NDF, float); +DECLARE_SOA_COLUMN(EseTarITSChi2NDF, eseTarITSChi2NDF, float); +DECLARE_SOA_COLUMN(EseTarTPCNSigma, eseTarTPCNSigma, float); +DECLARE_SOA_COLUMN(EseTarTOFNSigma, eseTarTOFNSigma, float); +DECLARE_SOA_COLUMN(EseTarITSNSigma, eseTarITSNSigma, float); +DECLARE_SOA_COLUMN(EseTarITSClusSize, eseTarITSClusSize, uint32_t); +} // namespace ese_var_table + +DECLARE_SOA_TABLE(ESETable, "AOD", "ESETable", + ese_var_table::EseVtz, + ese_var_table::EseCentFT0C, + ese_var_table::EsePsi2FT0C, + ese_var_table::Eseq2Tar, + ese_var_table::Eseq2Ref, + ese_var_table::EseTarSign, + ese_var_table::EseTarTPCInnerParam, + ese_var_table::EseTarTPCSignal, + ese_var_table::EseTarPt, + ese_var_table::EseTarEta, + ese_var_table::EseTarPhi, + ese_var_table::EseTarDCAxy, + ese_var_table::EseTarDCAz, + ese_var_table::EseTarTPCNcls, + ese_var_table::EseTarITSNcls, + ese_var_table::EseTarTPCChi2NDF, + ese_var_table::EseTarITSChi2NDF, + ese_var_table::EseTarTPCNSigma, + ese_var_table::EseTarTOFNSigma, + ese_var_table::EseTarITSNSigma, + ese_var_table::EseTarITSClusSize); } // namespace o2::aod -namespace pid_flags -{ -// constexpr int8_t kUnqualified = -1; -// constexpr int8_t kUnPOIHadron = 0; -constexpr int8_t kProton = 1; -constexpr int8_t kHe3 = 2; -constexpr int8_t kProtonHe3 = 3; -} // namespace pid_flags - -namespace event_selection -{ -constexpr int kFT0AV0ASigma = 5; -} +struct ESECandidate { + float vtz; + float centFT0C; + float psi2FT0C; + float q2Tar; + float q2Ref; + int8_t signTar; + float tpcInnerParamTar; + float tpcSignalTar; + float ptTar; + float etaTar; + float phiTar; + float dcaXYTar; + float dcaZTar; + uint8_t tpcNclsTar; + uint8_t itsNclsTar; + float tpcChi2NDFTar; + float itsChi2NDFTar; + float tpcNSigmaTar; + float tofNSigmaTar; + float itsNSigmaTar; + uint32_t itsClusSizeTar; +}; -namespace fourier_mode +namespace ese_parameters { -// constexpr int kMode1 = 1; -constexpr int kMode2 = 2; -// constexpr int kMode3 = 3; -} // namespace fourier_mode +constexpr uint8_t kProton = 0; +constexpr uint8_t kDeuteron = 1; +constexpr uint8_t kTriton = 2; +constexpr uint8_t kHe3 = 3; +constexpr uint8_t kAlpha = 4; +constexpr int kFT0AV0ASigma = 5; +constexpr int kRMSMode = 0; +constexpr int kTPCMode = 1; +constexpr int kTOFOnlyMode = 2; +constexpr float Amplitudelow = 1e-8; +constexpr float Charges[5]{1.f, 1.f, 1.f, 2.f, 2.f}; +constexpr float Masses[5]{MassProton, MassDeuteron, MassTriton, MassHelium3, MassAlpha}; +constexpr double BetheBlochDefault[5][6]{ + {-136.71, 0.441, 0.2269, 1.347, 0.8035, 0.09}, + {-136.71, 0.441, 0.2269, 1.347, 0.8035, 0.09}, + {-239.99, 1.155, 1.099, 1.137, 1.006, 0.09}, + {-321.34, 0.6539, 1.591, 0.8225, 2.363, 0.09}, + {-586.66, 1.859, 4.435, 0.282, 3.201, 0.09}}; +constexpr double BbMomScalingDefault[5][2]{// 0:poscharged 1:negcharged + {1., 1.}, + {1., 1.}, + {1., 1.}, + {1., 1.}, + {1., 1.}}; +constexpr int Open3DPIDPlots[3][1]{ + {0}, + {0}, + {0}}; +constexpr int OpenEvSel[10][1]{ + {1}, + {1}, + {1}, + {1}, + {1}, + {1}, + {1}, + {1}, + {0}, + {1}}; +constexpr int OpenTrackSel[7][1]{ + {1}, + {1}, + {1}, + {1}, + {1}, + {1}, + {1}}; +constexpr double TPCnSigmaCutDefault[5][2]{ + {-3., 3.}, + {-3., 3.}, + {-3., 3.}, + {-3., 3.}, + {-3., 3.}}; +constexpr double ITSnSigmaCutDefault[5][2]{ + {-3., 3.}, + {-3., 3.}, + {-3., 3.}, + {-3., 3.}, + {-3., 3.}}; +constexpr double PtPreselection[5][2]{ + {0.15, 99.}, + {0.15, 99.}, + {0.15, 99.}, + {0.15, 99.}, + {0.15, 99.}}; +static const std::vector names{"proton", "deuteron", "triton", "He3", "alpha"}; +static const std::vector chargeLabelNames{"Positive", "Negative"}; +static const std::vector betheBlochParNames{"p0", "p1", "p2", "p3", "p4", "resolution"}; +static const std::vector plot3DPIDNames{"TOF vs ITS", "ITS vs TPC", "TOF vs TPC"}; +static const std::vector openEventSelNames{"EvSelkIsGoodZvtxFT0vsPV", "EvSelkNoSameBunchPileup", "EvSelkNoCollInTimeRangeStandard", "EvSelkIsGoodITSLayersAll", "EvSelkNoCollInRofStandard", "EvSelkNoHighMultCollInPrevRof", "EvSelOccupancy", "EvSelMultCorrelationPVTracks", "EvSelMultCorrelationGlobalTracks", "EvSelV0AT0ACut"}; +static const std::vector openTrackSelNames{"passedITSNCls", "passedITSChi2NDF", "passedITSHits", "passedTPCChi2NDF", "passedTPCCrossedRowsOverNCls", "passedDCAxy", "passedDCAz"}; +static const std::vector plot3DConfigNames{"Open related 3D nSigma plots"}; +static const std::vector openEventSelConfigNames{"Open related event selection options"}; +static const std::vector openTrackSelConfigNames{"Open track selection from TrackSelection table"}; +static const std::vector pidTPCnSigmaNames{"n#sigma_{TPC} Low", "n#sigma_{TPC} High"}; +static const std::vector pidITSnSigmaNames{"n#sigma_{ITS} Low", "n#sigma_{ITS} High"}; +static const std::vector pidPtNames{"p_{T} Low", "p_{T} High"}; +std::vector eseCandidates; +// Tar ptr +std::shared_ptr hPIDQATar1D[12]; +std::shared_ptr hPIDQATar2D[4]; +std::shared_ptr hPIDQATar3D[3]; +std::shared_ptr hv2Tar[2]; +std::shared_ptr hESEQATar1D[2]; +std::shared_ptr hESEQATar2D; +std::shared_ptr hESETar; +// Ref ptr +std::shared_ptr hPIDQARef1D[12]; +std::shared_ptr hPIDQARef2D[4]; +std::shared_ptr hPIDQARef3D[3]; +std::shared_ptr hv2Ref[2]; +std::shared_ptr hESEQARef1D[2]; +std::shared_ptr hESEQARef2D; +} // namespace ese_parameters -using TracksPID = soa::Join; -struct FillPIDcolums { +using TracksPIDFull = soa::Join; - HistogramRegistry histosQA{"histosQAPID", {}, OutputObjHandlingPolicy::AnalysisObject}; +struct FlowEsePHe3 { + EventPlaneHelper helperEP; + o2::aod::ITSResponse itsResponse; + HistogramRegistry histsESE{"histsESE", {}, OutputObjHandlingPolicy::AnalysisObject}; + // process POI control + Configurable cfgTarName{"cfgTarName", "kHe3", "Name of the v2 particle: kProton, kDeuteron, kTriton, kHe3, kAlpha"}; + Configurable cfgRefName{"cfgRefName", "kProton", "Name of the q2 reference particle: kProton, kDeuteron, kTriton, kHe3, kAlpha"}; + // total control config + Configurable cfgOpenAllowCrossTrack{"cfgOpenAllowCrossTrack", false, "Allow one track to be identified as different kind of PID particles"}; + Configurable cfgOpenFullEventQA{"cfgOpenFullEventQA", true, "Open full QA plots for event QA"}; + Configurable cfgOpenPIDQA{"cfgOpenPIDQA", true, "Open PID QA plots"}; + Configurable cfgOpenv2{"cfgOpenv2", true, "Open v2(EP)and q calculation for Proton and He3"}; + Configurable cfgOpenESE{"cfgOpenESE", true, "Open ESE plots"}; + Configurable cfgOpenESEQA{"cfgOpenESEQA", true, "Open ESE QA plots"}; + Configurable> cfgOpen3DPIDPlots{"cfgOpen3DPIDPlots", {ese_parameters::Open3DPIDPlots[0], 3, 1, ese_parameters::plot3DPIDNames, ese_parameters::plot3DConfigNames}, "3D PID QA Plots switch configuration"}; + // Qvec configs + Configurable cfgDetName{"cfgDetName", "FT0C", "The name of detector to be analyzed"}; + Configurable cfgRefAName{"cfgRefAName", "TPCpos", "The name of detector for reference A"}; + Configurable cfgRefBName{"cfgRefBName", "TPCneg", "The name of detector for reference B"}; + Configurable cfgnTotalSystem{"cfgnTotalSystem", 7, "total qvector number"}; + // pre event selection(filter) + Configurable cfgVtzCut{"cfgVtzCut", 10.0f, "Accepted z-vertex range"}; + Configurable cfgCentMin{"cfgCentMin", 0.0f, "Centrality min"}; + Configurable cfgCentMax{"cfgCentMax", 100.0f, "Centrality max"}; + // event selection configs + Configurable cfgCutOccupancyLow{"cfgCutOccupancyLow", 0, "Low boundary cut on TPC occupancy"}; + Configurable cfgCutOccupancyHigh{"cfgCutOccupancyHigh", 3000, "High boundary cut on TPC occupancy"}; + Configurable> cfgOpenEvSel{"cfgOpenEvSel", {ese_parameters::OpenEvSel[0], 10, 1, ese_parameters::openEventSelNames, ese_parameters::openEventSelConfigNames}, "Event selection switch configuration"}; + // track selection configs + Configurable> cfgOpenTrackSel{"cfgOpenTrackSel", {ese_parameters::OpenTrackSel[0], 7, 1, ese_parameters::openTrackSelNames, ese_parameters::openTrackSelConfigNames}, "Track selection switch configuration"}; Configurable cfgMinPtPID{"cfgMinPtPID", 0.15, "Minimum track #P_{t} for PID"}; Configurable cfgMaxPtPID{"cfgMaxPtPID", 99.9, "Maximum track #P_{t} for PID"}; Configurable cfgMaxEtaPID{"cfgMaxEtaPID", 0.8, "Maximum track #eta for PID"}; @@ -101,516 +274,152 @@ struct FillPIDcolums { Configurable cfgMaxDCAxy{"cfgMaxDCAxy", 99, "Maxium DCAxy for standard PID tracking"}; Configurable cfgMaxDCAz{"cfgMaxDCAz", 2, "Maxium DCAz for standard PID tracking"}; Configurable cfgPtMaxforTPCOnlyPIDPrton{"cfgPtMaxforTPCOnlyPIDPrton", 0.4, "Maxmium track pt for TPC only PID, at RMS PID mode for proton"}; - Configurable cfgPtMaxforTPCOnlyPIDHe3{"cfgPtMaxforTPCOnlyPIDHe3", 0.5, "Maxmium track pt for TPC only PID, at RMS PID mode for he3"}; - - Configurable cfgProtonPIDMode{"cfgProtonPIDMode", 2, "Proton PID mode: 0 for TPC + RMS(TPC,TOF), 1 for TPC only, 2 for TOF only"}; - Configurable cfgHe3PIDMode{"cfgHe3PIDMode", 1, "He3 PID mode: 0 for TPC + RMS(TPC,TOF), 1 for TPC only, 2 for TOF only"}; - - Configurable cfgOpenpassedITSNCls{"cfgOpenpassedITSNCls", false, "useTrackSelectionTables passedITSNCls for basic track selection"}; - Configurable cfgOpenpassedITSChi2NDF{"cfgOpenpassedITSChi2NDF", false, "useTrackSelectionTables passedITSChi2NDF for basic track selection"}; - Configurable cfgOpenpassedITSHits{"cfgOpenpassedITSHits", false, "useTrackSelectionTables passedITSHits for basic track selection"}; - Configurable cfgOpenpassedTPCChi2NDF{"cfgOpenpassedTPCChi2NDF", false, "useTrackSelectionTables passedTPCChi2NDF for basic track selection"}; - Configurable cfgOpenpassedTPCCrossedRowsOverNCls{"cfgOpenpassedTPCCrossedRowsOverNCls", false, "useTrackSelectionTables passedTPCCrossedRowsOverNCls for basic track selection"}; - Configurable cfgOpenpassedDCAxy{"cfgOpenpassedDCAxy", false, "useTrackSelectionTables passedDCAxy for basic track selection"}; - Configurable cfgOpenpassedDCAz{"cfgOpenpassedDCAz", false, "useTrackSelectionTables passedDCAz for basic track selection"}; - - Configurable cfgQuietMode{"cfgQuietMode", false, "open quiet mode for saving cpu cost and only do some basic QA plots"}; - Configurable cfgOpenPIDITSProton{"cfgOpenPIDITSProton", true, "open ITS assistance cut for proton PID"}; - Configurable cfgOpenPIDITSHe3{"cfgOpenPIDITSHe3", false, "open ITS assistance cut for He3 PID"}; - Configurable cfgOpenPIDByPtProtonMain{"cfgOpenPIDByPtProtonMain", false, "Selection Proton by pt its pt binnings for main selection"}; - Configurable cfgOpenPIDByPtHe3Main{"cfgOpenPIDByPtHe3Main", false, "Selection He3 by pt its pt binnings for main selection"}; - Configurable cfgOpenPIDByPtProtonITS{"cfgOpenPIDByPtProtonITS", false, "Selection Proton by pt its pt binnings for ITS selection"}; - Configurable cfgOpenPIDByPtHe3ITS{"cfgOpenPIDByPtHe3ITS", false, "Selection He3 by pt its pt binnings for ITS selection"}; - Configurable cfgOpenHe3ITSPtCut{"cfgOpenHe3ITSPtCut", true, "Do He3 ITS contamination cut"}; - Configurable cfgOpenAllowCrossTrack{"cfgOpenAllowCrossTrack", false, "Allow one track to be identified as different kind of PID particles"}; - - Configurable cfgOpenPlotnSigmaTOFITSPt{"cfgOpenPlotnSigmaTOFITSPt", true, "plot nSigmaTOF vs nSigmaITS vs Pt"}; - Configurable cfgOpenPlotnSigmaITSTPCPt{"cfgOpenPlotnSigmaITSTPCPt", true, "plot nSigmaITS vs nSigmaTOF vs Pt"}; - Configurable cfgOpenPlotnSigmaTOFTPCPt{"cfgOpenPlotnSigmaTOFTPCPt", true, "plot nSigmaTOF vs nSigmaTPC vs Pt"}; - - Configurable> cfgPtCutProton{"cfgPtCutProton", {0.15, 99.}, "Pt limit for Proton"}; - Configurable> cfgPtCutHe3{"cfgPtCutHe3", {0.15, 99.}, "Pt limit for He3"}; - Configurable> cfgnSigmaCutTPCProton{"cfgnSigmaCutTPCProton", {-3, 3}, "TPC nsigma cut limit for Proton"}; - Configurable> cfgnSigmaCutTPCHe3{"cfgnSigmaCutTPCHe3", {-2, 2}, "TPC nsigma cut limit for He3"}; + // PID configs + Configurable> cfgPtPreselection{"cfgPtPreselection", {ese_parameters::PtPreselection[0], 5, 2, ese_parameters::names, ese_parameters::pidPtNames}, "Pt preselection for light nuclei"}; Configurable> cfgnSigmaCutTOFProton{"cfgnSigmaCutTOFProton", {-1.5, 1.5}, "TOF nsigma cut limit for Proton"}; - Configurable> cfgnSigmaCutTOFHe3{"cfgnSigmaCutTOFHe3", {-1.5, 1.5}, "TOF nsigma cut limit for He3"}; - Configurable> cfgnSigmaCutITSProton{"cfgnSigmaCutITSProton", {-3, 3}, "ITS nsigma cut limit for Proton"}; - Configurable> cfgnSigmaCutITSHe3{"cfgnSigmaCutITSHe3", {-3, 3}, "ITS nsigma cut limit for He3"}; Configurable> cfgnSigmaCutRMSProton{"cfgnSigmaCutRMSProton", {-3, 3}, "RMS nsigma cut limit for Proton"}; - Configurable> cfgnSigmaCutRMSHe3{"cfgnSigmaCutRMSHe3", {-3, 3}, "RMS nsigma cut limit for He3"}; - - Configurable> cfgPtBinProtonPID{"cfgPtBinProtonPID", {0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 3.0, 3.5, 4.0, 5.0, 6.0}, "pt bin for pion PIDnsigma"}; - Configurable> cfgPtBinHe3PID{"cfgPtBinHe3PID", {2, 2.2, 2.4, 2.6, 2.8, 3, 3.2, 3.6, 4, 4.4, 4.8, 5.2, 5.6, 6, 6.4, 7.2, 8, 10}, "pt bin for pion PIDnsigma"}; - - Configurable> cfgnSigmaTPCProtonPtUpper{"cfgnSigmaTPCProtonPtUpper", {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, "nSigmaTPC cut upper limit anchored to proton pt bins"}; - Configurable> cfgnSigmaTOFProtonPtUpper{"cfgnSigmaTOFProtonPtUpper", {1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5}, "nSigmaTOF cut upper limit anchored to proton pt bins"}; - Configurable> cfgnSigmaITSProtonPtUpper{"cfgnSigmaITSProtonPtUpper", {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, "nSigmaITS cut upper limit anchored to proton pt bins"}; - Configurable> cfgnSigmaRMSProtonPtUpper{"cfgnSigmaRMSProtonPtUpper", {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, "nSigmaRMS cut upper limit anchored to proton pt bins"}; - Configurable> cfgnSigmaTPCProtonPtLower{"cfgnSigmaTPCProtonPtLower", {-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3}, "nSigmaTPC cut lower limit anchored to proton pt bins"}; - Configurable> cfgnSigmaTOFProtonPtLower{"cfgnSigmaTOFProtonPtLower", {-1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5}, "nSigmaTOF cut lower limit anchored to proton pt bins"}; - Configurable> cfgnSigmaITSProtonPtLower{"cfgnSigmaITSProtonPtLower", {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2}, "nSigmaITS cut lower limit anchored to proton pt bins"}; - Configurable> cfgnSigmaRMSProtonPtLower{"cfgnSigmaRMSProtonPtLower", {-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3}, "nSigmaRMS cut lower limit anchored to proton pt bins"}; - Configurable> cfgnSigmaTPCHe3PtUpper{"cfgnSigmaTPCHe3PtUpper", {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, "nSigmaTPC cut upper limit anchored to He3 pt bins"}; - Configurable> cfgnSigmaTOFHe3PtUpper{"cfgnSigmaTOFHe3PtUpper", {1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5}, "nSigmaTOF cut upper limit anchored to He3 pt bins"}; - Configurable> cfgnSigmaITSHe3PtUpper{"cfgnSigmaITSHe3PtUpper", {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, "nSigmaITS cut upper limit anchored to He3 pt bins"}; - Configurable> cfgnSigmaRMSHe3PtUpper{"cfgnSigmaRMSHe3PtUpper", {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, "nSigmaRMS cut upper limit anchored to He3 pt bins"}; - Configurable> cfgnSigmaTPCHe3PtLower{"cfgnSigmaTPCHe3PtLower", {-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3}, "nSigmaTPC cut lower limit anchored to He3 pt bins"}; - Configurable> cfgnSigmaTOFHe3PtLower{"cfgnSigmaTOFHe3PtLower", {-1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5}, "nSigmaTOF cut lower limit anchored to He3 pt bins"}; - Configurable> cfgnSigmaITSHe3PtLower{"cfgnSigmaITSHe3PtLower", {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2}, "nSigmaITS cut lower limit anchored to He3 pt bins"}; - Configurable> cfgnSigmaRMSHe3PtLower{"cfgnSigmaRMSHe3PtLower", {-3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3}, "nSigmaRMS cut lower limit anchored to He3 pt bins"}; - + Configurable cfgUseSelfnSigmaTPCProton{"cfgUseSelfnSigmaTPCProton", false, "Use self nSigma TPC for Proton PID"}; + Configurable cfgProtonPIDMode{"cfgProtonPIDMode", 2, "Proton PID mode: 0 for TPC + RMS(TPC,TOF), 1 for TPC only, 2 for TOF only"}; + Configurable> cfgnSigmaTPC{"cfgnSigmaTPC", {ese_parameters::TPCnSigmaCutDefault[0], 5, 2, ese_parameters::names, ese_parameters::pidTPCnSigmaNames}, "TPC nSigma selection for light nuclei"}; + Configurable> cfgnSigmaITS{"cfgnSigmaITS", {ese_parameters::ITSnSigmaCutDefault[0], 5, 2, ese_parameters::names, ese_parameters::pidITSnSigmaNames}, "ITS nSigma selection for light nuclei"}; + // PID BBself paras config + Configurable> cfgBetheBlochParams{"cfgBetheBlochParams", {ese_parameters::BetheBlochDefault[0], 5, 6, ese_parameters::names, ese_parameters::betheBlochParNames}, "TPC Bethe-Bloch parameterisation for light nuclei"}; + Configurable> cfgMomentumScalingBetheBloch{"cfgMomentumScalingBetheBloch", {ese_parameters::BbMomScalingDefault[0], 5, 2, ese_parameters::names, ese_parameters::chargeLabelNames}, "TPC Bethe-Bloch momentum scaling for light nuclei"}; + Configurable cfgCompensatePIDinTracking{"cfgCompensatePIDinTracking", true, "If true, divide tpcInnerParam by the electric charge"}; + // Axias configs ConfigurableAxis cfgrigidityBins{"cfgrigidityBins", {200, -10.f, 10.f}, "Binning for rigidity #it{p}^{TPC}/#it{z}"}; ConfigurableAxis cfgdedxBins{"cfgdedxBins", {1000, 0.f, 1000.f}, "Binning for dE/dx"}; ConfigurableAxis cfgnSigmaBinsTPC{"cfgnSigmaBinsTPC", {200, -5.f, 5.f}, "Binning for n sigma TPC"}; ConfigurableAxis cfgnSigmaBinsTOF{"cfgnSigmaBinsTOF", {200, -5.f, 5.f}, "Binning for n sigma TOF"}; ConfigurableAxis cfgnSigmaBinsITS{"cfgnSigmaBinsITS", {200, -5.f, 5.f}, "Binning for n sigma ITS"}; - ConfigurableAxis cfgnSigmaBinsRMS{"cfgnSigmaBinsRMS", {100, 0.f, 10.f}, "Combination Binning for TPC&TOF nsigma"}; - ConfigurableAxis cfgaxisptPID{"cfgaxisptPID", {120, 0, 12}, "Binning for P_{t} PID"}; - ConfigurableAxis cfgaxispPID{"cfgaxispPID", {50, 0, 5}, "Binning for P PID"}; + ConfigurableAxis cfgaxispt{"cfgaxispt", {100, 0, 10}, "Binning for P_{t}"}; ConfigurableAxis cfgaxisetaPID{"cfgaxisetaPID", {90, -0.9, 0.9}, "Binning for Pt QA"}; ConfigurableAxis cfgaxisDCAz{"cfgaxisDCAz", {200, -1, 1}, "Binning for DCAz"}; ConfigurableAxis cfgaxisDCAxy{"cfgaxisDCAxy", {100, -0.5, 0.5}, "Binning for DCAxy"}; - ConfigurableAxis cfgaxisChi2Ncls{"cfgaxisChi2Ncls", {100, 0, 100}, "Binning for Chi2Ncls TPC/ITS"}; + ConfigurableAxis cfgaxisChi2Ncls{"cfgaxisChi2Ncls", {100, 0, 30}, "Binning for Chi2Ncls TPC/ITS"}; + ConfigurableAxis cfgaxisQvecF{"cfgaxisQvecF", {300, -1, 1}, ""}; + ConfigurableAxis cfgaxisCent{"cfgaxisCent", {90, 0, 90}, ""}; + ConfigurableAxis cfgaxisNch{"cfgaxisNch", {4000, 0, 4000}, "N_{ch}"}; + ConfigurableAxis cfgaxisT0C{"cfgaxisT0C", {70, 0, 70000}, "N_{ch} (T0C)"}; + ConfigurableAxis cfgaxisT0A{"cfgaxisT0A", {200, 0, 200000}, "N_{ch} (T0A)"}; + ConfigurableAxis cfgaxisNchPV{"cfgaxisNchPV", {4000, 0, 4000}, "N_{ch} (PV)"}; + ConfigurableAxis cfgaxisq2{"cfgaxisq2", {120, 0, 12}, "Binning for P_{t} PID"}; + ConfigurableAxis cfgaxiscos{"cfgaxiscos", {102, -1.02, 1.02}, ""}; - // Function for He3 TPC-ITS mismatching cuts referd to by chiara's slides - TF1* fNSigmaITSPt = nullptr; + uint8_t poiTar; + uint8_t poiRef; + int detId; + int refAId; + int refBId; + int detInd; + int refAInd; + int refBInd; + // Function for He3 purity cut refered from luca's slides + TF1* fMultPVCutLow = nullptr; + TF1* fMultPVCutHigh = nullptr; + TF1* fMultCutLow = nullptr; + TF1* fMultCutHigh = nullptr; + TF1* fT0AV0AMean = nullptr; + TF1* fT0AV0ASigma = nullptr; - template - bool trackSelBasic(const TrackType track) - { - if ((track.pt() < cfgMinPtPID) || (track.pt() > cfgMaxPtPID)) - return false; - if (std::abs(track.eta()) > cfgMaxEtaPID) - return false; - if (cfgOpenpassedITSNCls) { - if (!track.passedITSNCls()) - return false; - } else { - if (track.itsNCls() < cfgMinITSCls || track.itsNCls() > cfgMaxITSCls) - return false; - } - if (cfgOpenpassedITSChi2NDF) { - if (!track.passedITSChi2NDF()) - return false; - } else { - if (track.itsChi2NCl() < cfgMinChi2NClITS || track.itsChi2NCl() > cfgMaxChi2NClITS) - return false; - } - if (cfgOpenpassedITSHits) { - if (!track.passedITSHits()) - return false; - } - if (cfgOpenpassedTPCChi2NDF) { - if (!track.passedTPCChi2NDF()) - return false; - } else { - if (track.tpcChi2NCl() < cfgMinTPCChi2NCl || track.tpcChi2NCl() > cfgMaxTPCChi2NCl) - return false; - } - if (cfgOpenpassedTPCCrossedRowsOverNCls) { - if (!track.passedTPCCrossedRowsOverNCls()) - return false; - } - if (cfgOpenpassedDCAxy) { - if (!track.passedDCAxy()) - return false; - } else { - if (std::abs(track.dcaXY()) > cfgMaxDCAxy) - return false; - } - if (cfgOpenpassedDCAz) { - if (!track.passedDCAz()) - return false; - } else { - if (std::abs(track.dcaZ()) > cfgMaxDCAz) - return false; - } - if (track.tpcNClsFound() < cfgMinTPCCls || track.tpcNClsFound() > cfgMaxTPCCls) - return false; - return true; - } + Filter collisionFilter = (nabs(aod::collision::posZ) < cfgVtzCut) && (aod::cent::centFT0C > cfgCentMin) && (aod::cent::centFT0C < cfgCentMax); - template - bool pidProtonSel(const TrackType track, float nSigmaLower, float nSigmaUpper) - { // proton == 1 , He3 == 2 - if (track.pt() < cfgPtCutProton.value[0] || track.pt() > cfgPtCutProton.value[1]) - return false; - float nSigmaUse = -999; - switch (cfgProtonPIDMode) { - case 0: // RMS - nSigmaUse = (track.pt() > cfgPtMaxforTPCOnlyPIDPrton) ? std::hypot(track.tpcNSigmaPr(), track.tofNSigmaPr()) : track.tpcNSigmaPr(); - break; - case 1: // TPC only - nSigmaUse = track.tpcNSigmaPr(); - break; - case 2: // TOF only - nSigmaUse = track.tofNSigmaPr(); - break; - } - if (nSigmaUse < nSigmaLower || nSigmaUse > nSigmaUpper) { - return false; - } else { - return true; - } - } + Produces eseTable; template - bool pidHe3Sel(const TrackType track, float nSigmaLower, float nSigmaUpper) - { // proton == 1 , He3 == 2 - if (track.pt() < cfgPtCutHe3.value[0] || track.pt() > cfgPtCutHe3.value[1]) - return false; - float nSigmaUse = -999; - switch (cfgHe3PIDMode) { - case 0: // RMS - nSigmaUse = (track.pt() > cfgPtMaxforTPCOnlyPIDHe3) ? std::hypot(track.tpcNSigmaHe(), track.tofNSigmaHe()) : track.tpcNSigmaHe(); - break; - case 1: // TPC only - nSigmaUse = track.tpcNSigmaHe(); - break; - case 2: // TOF only - nSigmaUse = track.tofNSigmaHe(); - break; - } - if (nSigmaUse < nSigmaLower || nSigmaUse > nSigmaUpper) { - return false; - } else { - return true; + float getNSigmaTPCSelfBB(const TrackType track, uint8_t POI) + { + bool heliumPID = track.pidForTracking() == o2::track::PID::Helium3 || track.pidForTracking() == o2::track::PID::Alpha; + float correctedTpcInnerParam = (heliumPID && cfgCompensatePIDinTracking) ? track.tpcInnerParam() / 2 : track.tpcInnerParam(); + const int iC{track.sign() < 0}; + switch (POI) { + case ese_parameters::kProton: { + const double bgScaling[2]{ese_parameters::Charges[0] * cfgMomentumScalingBetheBloch->get(0u, 0u) / ese_parameters::Masses[0], ese_parameters::Charges[0] * cfgMomentumScalingBetheBloch->get(0u, 1u) / ese_parameters::Masses[0]}; + double expBethe{tpc::BetheBlochAleph(static_cast(correctedTpcInnerParam * bgScaling[iC]), cfgBetheBlochParams->get(0u, 0u), cfgBetheBlochParams->get(0u, 1u), cfgBetheBlochParams->get(0u, 2u), cfgBetheBlochParams->get(0u, 3u), cfgBetheBlochParams->get(0u, 4u))}; + double expSigma{expBethe * cfgBetheBlochParams->get(0u, 5u)}; + double nSigmaTPC{static_cast((track.tpcSignal() - expBethe) / expSigma)}; + return nSigmaTPC; + } + case ese_parameters::kDeuteron: { + const double bgScaling[2]{ese_parameters::Charges[1] * cfgMomentumScalingBetheBloch->get(1u, 0u) / ese_parameters::Masses[1], ese_parameters::Charges[1] * cfgMomentumScalingBetheBloch->get(1u, 1u) / ese_parameters::Masses[1]}; + double expBethe{tpc::BetheBlochAleph(static_cast(correctedTpcInnerParam * bgScaling[iC]), cfgBetheBlochParams->get(1u, 0u), cfgBetheBlochParams->get(1u, 1u), cfgBetheBlochParams->get(1u, 2u), cfgBetheBlochParams->get(1u, 3u), cfgBetheBlochParams->get(1u, 4u))}; + double expSigma{expBethe * cfgBetheBlochParams->get(1u, 5u)}; + double nSigmaTPC{static_cast((track.tpcSignal() - expBethe) / expSigma)}; + return nSigmaTPC; + } + case ese_parameters::kTriton: { + const double bgScaling[2]{ese_parameters::Charges[2] * cfgMomentumScalingBetheBloch->get(2u, 0u) / ese_parameters::Masses[2], ese_parameters::Charges[2] * cfgMomentumScalingBetheBloch->get(2u, 1u) / ese_parameters::Masses[2]}; + double expBethe{tpc::BetheBlochAleph(static_cast(correctedTpcInnerParam * bgScaling[iC]), cfgBetheBlochParams->get(2u, 0u), cfgBetheBlochParams->get(2u, 1u), cfgBetheBlochParams->get(2u, 2u), cfgBetheBlochParams->get(2u, 3u), cfgBetheBlochParams->get(2u, 4u))}; + double expSigma{expBethe * cfgBetheBlochParams->get(2u, 5u)}; + double nSigmaTPC{static_cast((track.tpcSignal() - expBethe) / expSigma)}; + return nSigmaTPC; + } + case ese_parameters::kHe3: { + const double bgScaling[2]{ese_parameters::Charges[3] * cfgMomentumScalingBetheBloch->get(3u, 0u) / ese_parameters::Masses[3], ese_parameters::Charges[3] * cfgMomentumScalingBetheBloch->get(3u, 1u) / ese_parameters::Masses[3]}; + double expBethe{tpc::BetheBlochAleph(static_cast(correctedTpcInnerParam * bgScaling[iC]), cfgBetheBlochParams->get(3u, 0u), cfgBetheBlochParams->get(3u, 1u), cfgBetheBlochParams->get(3u, 2u), cfgBetheBlochParams->get(3u, 3u), cfgBetheBlochParams->get(3u, 4u))}; + double expSigma{expBethe * cfgBetheBlochParams->get(3u, 5u)}; + double nSigmaTPC{static_cast((track.tpcSignal() - expBethe) / expSigma)}; + return nSigmaTPC; + } + case ese_parameters::kAlpha: { + const double bgScaling[2]{ese_parameters::Charges[4] * cfgMomentumScalingBetheBloch->get(4u, 0u) / ese_parameters::Masses[4], ese_parameters::Charges[4] * cfgMomentumScalingBetheBloch->get(4u, 1u) / ese_parameters::Masses[4]}; + double expBethe{tpc::BetheBlochAleph(static_cast(correctedTpcInnerParam * bgScaling[iC]), cfgBetheBlochParams->get(4u, 0u), cfgBetheBlochParams->get(4u, 1u), cfgBetheBlochParams->get(4u, 2u), cfgBetheBlochParams->get(4u, 3u), cfgBetheBlochParams->get(4u, 4u))}; + double expSigma{expBethe * cfgBetheBlochParams->get(4u, 5u)}; + double nSigmaTPC{static_cast((track.tpcSignal() - expBethe) / expSigma)}; + return nSigmaTPC; + } + default: + return -99.f; } } template - int crossTrackID(const TrackType track) + float getNSigmaTOF(const TrackType track, uint8_t POI) { - if (track.tpcNSigmaPr() < track.tpcNSigmaHe()) { - return 0; - } else { - return 1; + switch (POI) { + case ese_parameters::kProton: { + return track.tofNSigmaPr(); + } + case ese_parameters::kDeuteron: { + return track.tofNSigmaDe(); + } + case ese_parameters::kTriton: { + return track.tofNSigmaTr(); + } + case ese_parameters::kHe3: { + return track.tofNSigmaHe(); + } + case ese_parameters::kAlpha: { + return track.tofNSigmaAl(); + } + default: + return -99.f; } } - void init(InitContext const&) + template + float getNSigmaITS(const TrackType track, uint8_t POI) { - if (cfgOpenHe3ITSPtCut) { - fNSigmaITSPt = new TF1("fNSigmaITSPt", "[0]/pow(x,0.5) - [2]", 0.02, 1000); - fNSigmaITSPt->SetParameters(4.6, 0.5, 4.5); - } - AxisSpec axisITSNcls = {10, -1.5, 8.5, "ITSNcls"}; - AxisSpec axisTPCNcls = {160, 0, 160, "TPCNcls"}; - if (!cfgQuietMode) { - histosQA.add("QA/hist_dEdxTPC_All", ";#it{p}^{TPC}/#it{z} (GeV/c);d#it{E}/d#it{x}", {HistType::kTH2F, {cfgrigidityBins, cfgdedxBins}}); - histosQA.add("QA/Proton/hist_dEdxTPC_Pr", ";#it{p}^{TPC}/#it{z} (GeV/c);d#it{E}/d#it{x}", {HistType::kTH2F, {cfgrigidityBins, cfgdedxBins}}); - histosQA.add("QA/He3/hist_dEdxTPC_He3", ";#it{p}^{TPC}/#it{z} (GeV/c);d#it{E}/d#it{x}", {HistType::kTH2F, {cfgrigidityBins, cfgdedxBins}}); - histosQA.add("QA/hist_pt_All", ";#it{p}_{T};counts", {HistType::kTH1F, {cfgaxisptPID}}); - histosQA.add("QA/Proton/hist_pt_Pr", ";#it{p}_{T};counts", {HistType::kTH1F, {cfgaxisptPID}}); - histosQA.add("QA/He3/hist_pt_He3", ";#it{p}_{T};counts", {HistType::kTH1F, {cfgaxisptPID}}); - histosQA.add("QA/hist_eta_All", ";#it{#eta};counts", {HistType::kTH1F, {cfgaxisetaPID}}); - histosQA.add("QA/Proton/hist_eta_Pr", ";#it{#eta};counts", {HistType::kTH1F, {cfgaxisetaPID}}); - histosQA.add("QA/He3/hist_eta_He3", ";#it{#eta};counts", {HistType::kTH1F, {cfgaxisetaPID}}); - histosQA.add("QA/hist_ITSNcls_All", ";ITSNcls;counts", {HistType::kTH1F, {axisITSNcls}}); - histosQA.add("QA/Proton/hist_ITSNcls_Pr", ";ITSNcls;counts", {HistType::kTH1F, {axisITSNcls}}); - histosQA.add("QA/He3/hist_ITSNcls_He3", ";ITSNcls;counts", {HistType::kTH1F, {axisITSNcls}}); - histosQA.add("QA/hist_TPCNcls_All", ";TPCNcls;counts", {HistType::kTH1F, {axisTPCNcls}}); - histosQA.add("QA/Proton/hist_TPCNcls_Pr", ";TPCNcls;counts", {HistType::kTH1F, {axisTPCNcls}}); - histosQA.add("QA/He3/hist_TPCNcls_He3", ";TPCNcls;counts", {HistType::kTH1F, {axisTPCNcls}}); - histosQA.add("QA/hist_ITSChi2NDF_All", ";ITS#it{#chi^{2}}/NDF;counts", {HistType::kTH1F, {cfgaxisChi2Ncls}}); - histosQA.add("QA/Proton/hist_ITSChi2NDF_Pr", ";ITS#it{#chi^{2}}/NDF;counts", {HistType::kTH1F, {cfgaxisChi2Ncls}}); - histosQA.add("QA/He3/hist_ITSChi2NDF_He3", ";ITS#it{#chi^{2}}/NDF;counts", {HistType::kTH1F, {cfgaxisChi2Ncls}}); - histosQA.add("QA/hist_TPCChi2NDF_All", ";TPC#it{#chi^{2}}/NDF;counts", {HistType::kTH1F, {cfgaxisChi2Ncls}}); - histosQA.add("QA/Proton/hist_TPCChi2NDF_Pr", ";TPC#it{#chi^{2}}/NDF;counts", {HistType::kTH1F, {cfgaxisChi2Ncls}}); - histosQA.add("QA/He3/hist_TPCChi2NDF_He3", ";TPC#it{#chi^{2}}/NDF;counts", {HistType::kTH1F, {cfgaxisChi2Ncls}}); - histosQA.add("QA/hist_DCAxy_All", ";#it{DCA_{xy}};counts", {HistType::kTH1F, {cfgaxisDCAxy}}); - histosQA.add("QA/Proton/hist_DCAxy_Pr", ";#it{DCA_{xy}};counts", {HistType::kTH1F, {cfgaxisDCAxy}}); - histosQA.add("QA/He3/hist_DCAxy_He3", ";#it{DCA_{xy}};counts", {HistType::kTH1F, {cfgaxisDCAxy}}); - histosQA.add("QA/hist_DCAz_All", ";#it{DCA_{xy}};counts", {HistType::kTH1F, {cfgaxisDCAz}}); - histosQA.add("QA/Proton/hist_DCAz_Pr", ";#it{DCA_{xy}};counts", {HistType::kTH1F, {cfgaxisDCAz}}); - histosQA.add("QA/He3/hist_DCAz_He3", ";#it{DCA_{xy}};counts", {HistType::kTH1F, {cfgaxisDCAz}}); - histosQA.add("QA/Proton/hist_nSigmaTPC_Pr", ";n_{#sigma}TPC", {HistType::kTH1F, {cfgnSigmaBinsTPC}}); - histosQA.add("QA/Proton/hist_nSigmaTPCPt_Pr", ";#it{p}_{T};n_{#sigma}TPC", {HistType::kTH2F, {cfgaxisptPID, cfgnSigmaBinsTPC}}); - histosQA.add("QA/Proton/hist_nSigmaTOF_Pr", ";n_{#sigma}TOF", {HistType::kTH1F, {cfgnSigmaBinsTOF}}); - histosQA.add("QA/Proton/hist_nSigmaTOFPt_Pr", ";#it{p}_{T};n_{#sigma}TOF", {HistType::kTH2F, {cfgaxisptPID, cfgnSigmaBinsTOF}}); - histosQA.add("QA/Proton/hist_nSigmaITS_Pr", ";n_{#sigma}ITS", {HistType::kTH1F, {cfgnSigmaBinsITS}}); - histosQA.add("QA/Proton/hist_nSigmaITSPt_Pr", ";#it{p}_{T};n_{#sigma}ITS", {HistType::kTH2F, {cfgaxisptPID, cfgnSigmaBinsITS}}); - histosQA.add("QA/Proton/hist_nSigmaRMS_Pr", ";n_{#sigma}RMS", {HistType::kTH1F, {cfgnSigmaBinsRMS}}); - histosQA.add("QA/Proton/hist_nSigmaRMSPt_Pr", ";#it{p}_{T};n_{#sigma}RMS", {HistType::kTH2F, {cfgaxisptPID, cfgnSigmaBinsRMS}}); - histosQA.add("QA/He3/hist_nSigmaTPC_He3", ";n_{#sigma}TPC", {HistType::kTH1F, {cfgnSigmaBinsTPC}}); - histosQA.add("QA/He3/hist_nSigmaTPCPt_He3", ";#it{p}_{T};n_{#sigma}TPC", {HistType::kTH2F, {cfgaxisptPID, cfgnSigmaBinsTPC}}); - histosQA.add("QA/He3/hist_nSigmaTOF_He3", ";n_{#sigma}TOF", {HistType::kTH1F, {cfgnSigmaBinsTOF}}); - histosQA.add("QA/He3/hist_nSigmaTOFPt_He3", ";#it{p}_{T};n_{#sigma}TOF", {HistType::kTH2F, {cfgaxisptPID, cfgnSigmaBinsTOF}}); - histosQA.add("QA/He3/hist_nSigmaITS_He3", ";n_{#sigma}ITS", {HistType::kTH1F, {cfgnSigmaBinsITS}}); - histosQA.add("QA/He3/hist_nSigmaITSPt_He3", ";#it{p}_{T};n_{#sigma}ITS", {HistType::kTH2F, {cfgaxisptPID, cfgnSigmaBinsITS}}); - histosQA.add("QA/He3/hist_nSigmaRMS_He3", ";n_{#sigma}RMS", {HistType::kTH1F, {cfgnSigmaBinsRMS}}); - histosQA.add("QA/He3/hist_nSigmaRMSPt_He3", ";#it{p}_{T};n_{#sigma}RMS", {HistType::kTH2F, {cfgaxisptPID, cfgnSigmaBinsRMS}}); - if (cfgOpenHe3ITSPtCut) { - histosQA.add("QA/He3/hist_nSigmaITSPt_He3_unCuted", ";#it{p}_{T};n_{#sigma}ITS", {HistType::kTH2F, {cfgaxisptPID, cfgnSigmaBinsITS}}); + switch (POI) { + case ese_parameters::kProton: { + return itsResponse.nSigmaITS(track); } - if (cfgOpenPlotnSigmaTOFITSPt) { - histosQA.add("QA/Proton/hist_nSigmaTOFITSPt_Pr", ";n_{#sigma}TOF;n_{#sigma}ITS;#it{p}_{T}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsITS, cfgaxisptPID}}); - histosQA.add("QA/He3/hist_nSigmaTOFITSPt_He3", ";n_{#sigma}TOF;n_{#sigma}ITS;#it{p}_{T}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsITS, cfgaxisptPID}}); + case ese_parameters::kDeuteron: { + return itsResponse.nSigmaITS(track); } - if (cfgOpenPlotnSigmaITSTPCPt) { - histosQA.add("QA/Proton/hist_nSigmaITSTPCPt_Pr", ";n_{#sigma}ITS;n_{#sigma}TPC;#it{p}_{T}", {HistType::kTH3F, {cfgnSigmaBinsITS, cfgnSigmaBinsTPC, cfgaxisptPID}}); - histosQA.add("QA/He3/hist_nSigmaITSTPCPt_He3", ";n_{#sigma}ITS;n_{#sigma}TPC;#it{p}_{T}", {HistType::kTH3F, {cfgnSigmaBinsITS, cfgnSigmaBinsTPC, cfgaxisptPID}}); + case ese_parameters::kTriton: { + return itsResponse.nSigmaITS(track); } - if (cfgOpenPlotnSigmaTOFTPCPt) { - histosQA.add("QA/Proton/hist_nSigmaTOFTPCPt_Pr", ";n_{#sigma}TOF;n_{#sigma}TPC;#it{p}_{T}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsTPC, cfgaxisptPID}}); - histosQA.add("QA/He3/hist_nSigmaTOFTPCPt_He3", ";n_{#sigma}TOF;n_{#sigma}TPC;#it{p}_{T}", {HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsTPC, cfgaxisptPID}}); + case ese_parameters::kHe3: { + return itsResponse.nSigmaITS(track); } - } - } - Produces pidEsePHe3Table; - void process(TracksPID const& tracks) - { - auto tracksWithITSPid = soa::Attach(tracks); - int8_t pidFlag; - for (const auto& track : tracksWithITSPid) { - histosQA.fill(HIST("QA/hist_dEdxTPC_All"), track.sign() * track.tpcInnerParam(), track.tpcSignal()); - histosQA.fill(HIST("QA/hist_pt_All"), track.pt()); - histosQA.fill(HIST("QA/hist_eta_All"), track.eta()); - histosQA.fill(HIST("QA/hist_ITSNcls_All"), track.itsNCls()); - histosQA.fill(HIST("QA/hist_TPCNcls_All"), track.tpcNClsFound()); - histosQA.fill(HIST("QA/hist_ITSChi2NDF_All"), track.itsChi2NCl()); - histosQA.fill(HIST("QA/hist_TPCChi2NDF_All"), track.tpcChi2NCl()); - histosQA.fill(HIST("QA/hist_DCAxy_All"), track.dcaXY()); - histosQA.fill(HIST("QA/hist_DCAz_All"), track.dcaZ()); - if (!trackSelBasic(track)) { - pidFlag = -1; - } else { - int currentPtBinPr = -1, currentPtBinHe3 = -1; - if (cfgOpenPIDByPtProtonMain || (cfgOpenPIDByPtProtonITS && cfgOpenPIDITSProton)) { - for (int i = 0; i < static_cast(cfgPtBinProtonPID.value.size()) - 1; ++i) { - if (track.pt() >= cfgPtBinProtonPID.value[i] && track.pt() < cfgPtBinProtonPID.value[i + 1]) { - currentPtBinPr = i; - break; - } - } - } - if (cfgOpenPIDByPtHe3Main || (cfgOpenPIDByPtHe3ITS && cfgOpenPIDITSHe3)) { - for (int i = 0; i < static_cast(cfgPtBinHe3PID.value.size()) - 1; ++i) { - if (track.pt() >= cfgPtBinHe3PID.value[i] && track.pt() < cfgPtBinHe3PID.value[i + 1]) { - currentPtBinHe3 = i; - break; - } - } - } - float nSigmaTPCCutPrPtLower = (currentPtBinPr == -1) ? cfgnSigmaCutTPCProton.value[0] : cfgnSigmaTPCProtonPtLower.value[currentPtBinPr]; - float nSigmaTPCCutPrPtUpper = (currentPtBinPr == -1) ? cfgnSigmaCutTPCProton.value[1] : cfgnSigmaTPCProtonPtUpper.value[currentPtBinPr]; - float nSigmaTOFCutPrPtLower = (currentPtBinPr == -1) ? cfgnSigmaCutTOFProton.value[0] : cfgnSigmaTOFProtonPtLower.value[currentPtBinPr]; - float nSigmaTOFCutPrPtUpper = (currentPtBinPr == -1) ? cfgnSigmaCutTOFProton.value[1] : cfgnSigmaTOFProtonPtUpper.value[currentPtBinPr]; - float nSigmaRMSCutPrPtLower = (currentPtBinPr == -1) ? cfgnSigmaCutRMSProton.value[0] : cfgnSigmaRMSProtonPtLower.value[currentPtBinPr]; - float nSigmaRMSCutPrPtUpper = (currentPtBinPr == -1) ? cfgnSigmaCutRMSProton.value[1] : cfgnSigmaRMSProtonPtUpper.value[currentPtBinPr]; - float nSigmaITSCutPrPtLower = (currentPtBinPr == -1) ? cfgnSigmaCutITSProton.value[0] : cfgnSigmaITSProtonPtLower.value[currentPtBinPr]; - float nSigmaITSCutPrPtUpper = (currentPtBinPr == -1) ? cfgnSigmaCutITSProton.value[1] : cfgnSigmaITSProtonPtUpper.value[currentPtBinPr]; - float nSigmaTPCCutHe3PtLower = (currentPtBinHe3 == -1) ? cfgnSigmaCutTPCHe3.value[0] : cfgnSigmaTPCHe3PtLower.value[currentPtBinHe3]; - float nSigmaTPCCutHe3PtUpper = (currentPtBinHe3 == -1) ? cfgnSigmaCutTPCHe3.value[1] : cfgnSigmaTPCHe3PtUpper.value[currentPtBinHe3]; - float nSigmaTOFCutHe3PtLower = (currentPtBinHe3 == -1) ? cfgnSigmaCutTOFHe3.value[0] : cfgnSigmaTOFHe3PtLower.value[currentPtBinHe3]; - float nSigmaTOFCutHe3PtUpper = (currentPtBinHe3 == -1) ? cfgnSigmaCutTOFHe3.value[1] : cfgnSigmaTOFHe3PtUpper.value[currentPtBinHe3]; - float nSigmaRMSCutHe3PtLower = (currentPtBinHe3 == -1) ? cfgnSigmaCutRMSHe3.value[0] : cfgnSigmaRMSHe3PtLower.value[currentPtBinHe3]; - float nSigmaRMSCutHe3PtUpper = (currentPtBinHe3 == -1) ? cfgnSigmaCutRMSHe3.value[1] : cfgnSigmaRMSHe3PtUpper.value[currentPtBinHe3]; - float nSigmaITSCutHe3PtLower = (currentPtBinHe3 == -1) ? cfgnSigmaCutITSHe3.value[0] : cfgnSigmaITSHe3PtLower.value[currentPtBinHe3]; - float nSigmaITSCutHe3PtUpper = (currentPtBinHe3 == -1) ? cfgnSigmaCutITSHe3.value[1] : cfgnSigmaITSHe3PtUpper.value[currentPtBinHe3]; - float nSigmaMainLowerPr = -999, nSigmaMainUpperPr = -999; - float nSigmaMainLowerHe3 = -999, nSigmaMainUpperHe3 = -999; - switch (cfgProtonPIDMode) { - case 0: - nSigmaMainLowerPr = nSigmaRMSCutPrPtLower; - nSigmaMainUpperPr = nSigmaRMSCutPrPtUpper; - break; - case 1: - nSigmaMainLowerPr = nSigmaTPCCutPrPtLower; - nSigmaMainUpperPr = nSigmaTPCCutPrPtUpper; - break; - case 2: - nSigmaMainLowerPr = nSigmaTOFCutPrPtLower; - nSigmaMainUpperPr = nSigmaTOFCutPrPtUpper; - break; - } - switch (cfgHe3PIDMode) { - case 0: - nSigmaMainLowerHe3 = nSigmaRMSCutHe3PtLower; - nSigmaMainUpperHe3 = nSigmaRMSCutHe3PtUpper; - break; - case 1: - nSigmaMainLowerHe3 = nSigmaTPCCutHe3PtLower; - nSigmaMainUpperHe3 = nSigmaTPCCutHe3PtUpper; - break; - case 2: - nSigmaMainLowerHe3 = nSigmaTOFCutHe3PtLower; - nSigmaMainUpperHe3 = nSigmaTOFCutHe3PtUpper; - break; - } - bool kIsPr = false, kIsHe3 = false; - // Identify Proton - if (pidProtonSel(track, nSigmaMainLowerPr, nSigmaMainUpperPr)) { - kIsPr = true; - if (cfgOpenPIDITSProton) { - if (track.itsNSigmaPr() < nSigmaITSCutPrPtLower || track.itsNSigmaPr() > nSigmaITSCutPrPtUpper) { - kIsPr = false; - } - } - } - // Identify He3 - if (pidHe3Sel(track, nSigmaMainLowerHe3, nSigmaMainUpperHe3)) { - kIsHe3 = true; - if (cfgOpenPIDITSHe3) { - if (track.itsNSigmaHe() < nSigmaITSCutHe3PtLower || track.itsNSigmaHe() > nSigmaITSCutHe3PtUpper) { - kIsHe3 = false; - } - } - } - // Cross track rejection - if (!cfgOpenAllowCrossTrack) { - if (kIsPr && kIsHe3) { - switch (crossTrackID(track)) { - case 0: - kIsPr = true; - kIsHe3 = false; - break; - case 1: - kIsPr = false; - kIsHe3 = true; - break; - } - } - } - // Filter He3 contaimination - if (cfgOpenHe3ITSPtCut && kIsHe3) { - if (!cfgQuietMode) { - histosQA.fill(HIST("QA/He3/hist_nSigmaITSPt_He3_unCuted"), track.pt(), track.itsNSigmaHe()); - } - if (track.itsNSigmaHe() < fNSigmaITSPt->Eval(track.pt())) { - kIsHe3 = false; - } - } - pidFlag = (kIsHe3 << 1) | kIsPr; - // Fill QA histograms - if (!cfgQuietMode) { - if (kIsPr) { - histosQA.fill(HIST("QA/Proton/hist_dEdxTPC_Pr"), track.sign() * track.tpcInnerParam(), track.tpcSignal()); - histosQA.fill(HIST("QA/Proton/hist_pt_Pr"), track.pt()); - histosQA.fill(HIST("QA/Proton/hist_eta_Pr"), track.eta()); - histosQA.fill(HIST("QA/Proton/hist_ITSNcls_Pr"), track.itsNCls()); - histosQA.fill(HIST("QA/Proton/hist_TPCNcls_Pr"), track.tpcNClsFound()); - histosQA.fill(HIST("QA/Proton/hist_ITSChi2NDF_Pr"), track.itsChi2NCl()); - histosQA.fill(HIST("QA/Proton/hist_TPCChi2NDF_Pr"), track.tpcChi2NCl()); - histosQA.fill(HIST("QA/Proton/hist_DCAxy_Pr"), track.dcaXY()); - histosQA.fill(HIST("QA/Proton/hist_DCAz_Pr"), track.dcaZ()); - histosQA.fill(HIST("QA/Proton/hist_nSigmaTPC_Pr"), track.tpcNSigmaPr()); - histosQA.fill(HIST("QA/Proton/hist_nSigmaTPCPt_Pr"), track.pt(), track.tpcNSigmaPr()); - histosQA.fill(HIST("QA/Proton/hist_nSigmaTOF_Pr"), track.tofNSigmaPr()); - histosQA.fill(HIST("QA/Proton/hist_nSigmaTOFPt_Pr"), track.pt(), track.tofNSigmaPr()); - histosQA.fill(HIST("QA/Proton/hist_nSigmaITS_Pr"), track.itsNSigmaPr()); - histosQA.fill(HIST("QA/Proton/hist_nSigmaITSPt_Pr"), track.pt(), track.itsNSigmaPr()); - histosQA.fill(HIST("QA/Proton/hist_nSigmaRMS_Pr"), std::hypot(track.tpcNSigmaPr(), track.tofNSigmaPr())); - histosQA.fill(HIST("QA/Proton/hist_nSigmaRMSPt_Pr"), track.pt(), std::hypot(track.tpcNSigmaPr(), track.tofNSigmaPr())); - if (cfgOpenPlotnSigmaTOFITSPt) { - histosQA.fill(HIST("QA/Proton/hist_nSigmaTOFITSPt_Pr"), track.tofNSigmaPr(), track.itsNSigmaPr(), track.pt()); - } - if (cfgOpenPlotnSigmaITSTPCPt) { - histosQA.fill(HIST("QA/Proton/hist_nSigmaITSTPCPt_Pr"), track.itsNSigmaPr(), track.tpcNSigmaPr(), track.pt()); - } - if (cfgOpenPlotnSigmaTOFTPCPt) { - histosQA.fill(HIST("QA/Proton/hist_nSigmaTOFTPCPt_Pr"), track.tofNSigmaPr(), track.tpcNSigmaPr(), track.pt()); - } - } - if (kIsHe3) { - histosQA.fill(HIST("QA/He3/hist_dEdxTPC_He3"), track.sign() * track.tpcInnerParam(), track.tpcSignal()); - histosQA.fill(HIST("QA/He3/hist_pt_He3"), track.pt()); - histosQA.fill(HIST("QA/He3/hist_eta_He3"), track.eta()); - histosQA.fill(HIST("QA/He3/hist_ITSNcls_He3"), track.itsNCls()); - histosQA.fill(HIST("QA/He3/hist_TPCNcls_He3"), track.tpcNClsFound()); - histosQA.fill(HIST("QA/He3/hist_ITSChi2NDF_He3"), track.itsChi2NCl()); - histosQA.fill(HIST("QA/He3/hist_TPCChi2NDF_He3"), track.tpcChi2NCl()); - histosQA.fill(HIST("QA/He3/hist_DCAxy_He3"), track.dcaXY()); - histosQA.fill(HIST("QA/He3/hist_DCAz_He3"), track.dcaZ()); - histosQA.fill(HIST("QA/He3/hist_nSigmaTPC_He3"), track.tpcNSigmaHe()); - histosQA.fill(HIST("QA/He3/hist_nSigmaTPCPt_He3"), track.pt(), track.tpcNSigmaHe()); - histosQA.fill(HIST("QA/He3/hist_nSigmaTOF_He3"), track.tofNSigmaHe()); - histosQA.fill(HIST("QA/He3/hist_nSigmaTOFPt_He3"), track.pt(), track.tofNSigmaHe()); - histosQA.fill(HIST("QA/He3/hist_nSigmaITS_He3"), track.itsNSigmaHe()); - histosQA.fill(HIST("QA/He3/hist_nSigmaITSPt_He3"), track.pt(), track.itsNSigmaHe()); - histosQA.fill(HIST("QA/He3/hist_nSigmaRMS_He3"), std::hypot(track.tpcNSigmaHe(), track.tofNSigmaHe())); - histosQA.fill(HIST("QA/He3/hist_nSigmaRMSPt_He3"), track.pt(), std::hypot(track.tpcNSigmaHe(), track.tofNSigmaHe())); - if (cfgOpenPlotnSigmaTOFITSPt) { - histosQA.fill(HIST("QA/He3/hist_nSigmaTOFITSPt_He3"), track.tofNSigmaHe(), track.itsNSigmaHe(), track.pt()); - } - if (cfgOpenPlotnSigmaITSTPCPt) { - histosQA.fill(HIST("QA/He3/hist_nSigmaITSTPCPt_He3"), track.itsNSigmaHe(), track.tpcNSigmaHe(), track.pt()); - } - if (cfgOpenPlotnSigmaTOFTPCPt) { - histosQA.fill(HIST("QA/He3/hist_nSigmaTOFTPCPt_He3"), track.tofNSigmaHe(), track.tpcNSigmaHe(), track.pt()); - } - } - } + case ese_parameters::kAlpha: { + return itsResponse.nSigmaITS(track); } - pidEsePHe3Table(pidFlag); + default: + return -99.f; } } -}; - -struct FlowEsePHe3 { - HistogramRegistry histos{"histosmain", {}, OutputObjHandlingPolicy::AnalysisObject}; - - Configurable> cfgnMods{"cfgnMods", {2}, "Modulation of interest"}; - Configurable cfgDetName{"cfgDetName", "FT0C", "The name of detector to be analyzed"}; - Configurable cfgRefAName{"cfgRefAName", "TPCpos", "The name of detector for reference A"}; - Configurable cfgRefBName{"cfgRefBName", "TPCneg", "The name of detector for reference B"}; - Configurable cfgnTotalSystem{"cfgnTotalSystem", 7, "total qvector number"}; - - Configurable cfgVtzCut{"cfgVtzCut", 10.0f, "Accepted z-vertex range"}; - Configurable cfgCentMin{"cfgCentMin", 0.0f, "Centrality min"}; - Configurable cfgCentMax{"cfgCentMax", 100.0f, "Centrality max"}; - - Configurable cfgCutOccupancyLow{"cfgCutOccupancyLow", 0, "Low boundary cut on TPC occupancy"}; - Configurable cfgCutOccupancyHigh{"cfgCutOccupancyHigh", 3000, "High boundary cut on TPC occupancy"}; - Configurable cfgUseAdditionalEventCut{"cfgUseAdditionalEventCut", true, "Use additional event cut beyond sel8"}; - Configurable cfgOpenEvSelkIsGoodZvtxFT0vsPV{"cfgOpenEvSelkIsGoodZvtxFT0vsPV", true, "removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference, use this cut at low multiplicities with caution"}; - Configurable cfgOpenEvSelkNoSameBunchPileup{"cfgOpenEvSelkNoSameBunchPileup", true, "rejects collisions which are associated with the same found-by-T0 bunch crossing"}; - Configurable cfgOpenEvSelkNoCollInTimeRangeStandard{"cfgOpenEvSelkNoCollInTimeRangeStandard", true, "no collisions in specified time range"}; - Configurable cfgOpenEvSelkIsGoodITSLayersAll{"cfgOpenEvSelkIsGoodITSLayersAll", true, "cut time intervals with dead ITS staves"}; - Configurable cfgOpenEvSelkNoCollInRofStandard{"cfgOpenEvSelkNoCollInRofStandard", true, "no other collisions in this Readout Frame with per-collision multiplicity above threshold"}; - Configurable cfgOpenEvSelkNoHighMultCollInPrevRof{"cfgOpenEvSelkNoHighMultCollInPrevRof", true, "veto an event if FT0C amplitude in previous ITS ROF is above threshold"}; - Configurable cfgOpenEvSelOccupancy{"cfgOpenEvSelOccupancy", true, "Occupancy cut"}; - Configurable cfgOpenEvSelMultCorrelationPVTracks{"cfgOpenEvSelMultCorrelationPVTracks", true, "Multiplicity correlation cut for PVtracks vs centrality(FT0C)"}; - Configurable cfgOpenEvSelMultCorrelationGlobalTracks{"cfgOpenEvSelMultCorrelationGlobalTracks", false, "Multiplicity correlation cut for Globaltracks vs centrality(FT0C)"}; - Configurable cfgOpenEvSelV0AT0ACut{"cfgOpenEvSelV0AT0ACut", true, "V0A T0A 5 sigma cut"}; - Configurable cfgOpenFullEventQA{"cfgOpenFullEventQA", true, "Open full QA plots for event QA"}; - Configurable cfgOpenv2q{"cfgOpenv2q", true, "Open v2(EP)and q calculation for Proton and He3"}; - Configurable cfgOpenESE{"cfgOpenESE", true, "Open ESE process"}; - Configurable cfgOpenESEChargeSeperation{"cfgOpenESEChargeSeperation", true, "Open ESE for postive and negative charge repectivily"}; - Configurable cfgOpenESEProton{"cfgOpenESEProton", true, "Open ESE Proton process"}; - Configurable cfgOpenESEHe3{"cfgOpenESEHe3", true, "Open ESE He3 process"}; - - ConfigurableAxis cfgaxisQvecF{"cfgaxisQvecF", {300, -1, 1}, ""}; - ConfigurableAxis cfgaxisCent{"cfgaxisCent", {90, 0, 90}, ""}; - ConfigurableAxis cfgaxispt{"cfgaxispt", {100, 0, 10}, ""}; - ConfigurableAxis cfgaxisCentForQA{"cfgaxisCentForQA", {100, 0, 100}, "centrality for event QA"}; - ConfigurableAxis cfgaxisNch{"cfgaxisNch", {4000, 0, 4000}, "N_{ch}"}; - ConfigurableAxis cfgaxisT0C{"cfgaxisT0C", {70, 0, 70000}, "N_{ch} (T0C)"}; - ConfigurableAxis cfgaxisT0A{"cfgaxisT0A", {200, 0, 200000}, "N_{ch} (T0A)"}; - ConfigurableAxis cfgaxisNchPV{"cfgaxisNchPV", {4000, 0, 4000}, "N_{ch} (PV)"}; - ConfigurableAxis cfgaxisq2{"cfgaxisq2", {120, 0, 12}, "Binning for P_{t} PID"}; - - EventPlaneHelper helperEP; - SliceCache cache; - - int detId; - int refAId; - int refBId; - // Additional Event selection cuts - Copy from flowGenericFramework.cxx - TF1* fMultPVCutLow = nullptr; - TF1* fMultPVCutHigh = nullptr; - TF1* fMultCutLow = nullptr; - TF1* fMultCutHigh = nullptr; - TF1* fT0AV0AMean = nullptr; - TF1* fT0AV0ASigma = nullptr; - - Filter collisionFilter = (nabs(aod::collision::posZ) < cfgVtzCut) && (aod::cent::centFT0C > cfgCentMin) && (aod::cent::centFT0C < cfgCentMax); - Filter properPIDfilter = aod::flow_ese_p_he3::nPidFlag >= (int8_t)0; // Only POI - - Partition>> protonTrackSet = ((aod::flow_ese_p_he3::nPidFlag == pid_flags::kProton) || (aod::flow_ese_p_he3::nPidFlag == pid_flags::kProtonHe3)); - Partition>> he3TrackSet = ((aod::flow_ese_p_he3::nPidFlag == pid_flags::kHe3) || (aod::flow_ese_p_he3::nPidFlag == pid_flags::kProtonHe3)); template int getDetId(const T& name) @@ -637,160 +446,409 @@ struct FlowEsePHe3 { } } + template + uint8_t getPOI(const T& POI) + { + if (POI.value == "kProton") { + return ese_parameters::kProton; + } else if (POI.value == "kDeuteron") { + return ese_parameters::kDeuteron; + } else if (POI.value == "kTriton") { + return ese_parameters::kTriton; + } else if (POI.value == "kHe3") { + return ese_parameters::kHe3; + } else if (POI.value == "kAlpha") { + return ese_parameters::kAlpha; + } else { + LOGF(warning, "Unknown POI: %s", POI.value.c_str()); + return 0; + } + } + + float calculateq2(const float qx, const float qy, const int multi) + { + if (multi <= 0) { + return 0.f; + } else { + return std::hypot(qx, qy) / std::sqrt(static_cast(multi)); + } + } + template - bool selEvent(const CollType& collision, const int multTrk, const float centrality) + bool eventSelBasic(const CollType& collision, const int64_t multTrk, const float centrality, bool fillQA) { - histos.fill(HIST("QA/histEventCountDetail"), 0.5); - if (cfgOpenEvSelkIsGoodZvtxFT0vsPV && !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { + if (!collision.sel8()) + return false; + if (fillQA) { + histsESE.fill(HIST("EventQA/histEventCount"), 0.5); + } + if (cfgOpenEvSel->get(0u) && !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { return false; } - if (cfgOpenEvSelkIsGoodZvtxFT0vsPV) { - histos.fill(HIST("QA/histEventCountDetail"), 1.5); + if (fillQA && cfgOpenEvSel->get(0u)) { + histsESE.fill(HIST("EventQA/histEventCount"), 1.5); } - if (cfgOpenEvSelkNoSameBunchPileup && !collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { + if (cfgOpenEvSel->get(1u) && !collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { return false; } - if (cfgOpenEvSelkNoSameBunchPileup) { - histos.fill(HIST("QA/histEventCountDetail"), 2.5); + if (fillQA && cfgOpenEvSel->get(1u)) { + histsESE.fill(HIST("EventQA/histEventCount"), 2.5); } - if (cfgOpenEvSelkNoCollInTimeRangeStandard && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + if (cfgOpenEvSel->get(2u) && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { return false; } - if (cfgOpenEvSelkNoCollInTimeRangeStandard) { - histos.fill(HIST("QA/histEventCountDetail"), 3.5); + if (fillQA && cfgOpenEvSel->get(2u)) { + histsESE.fill(HIST("EventQA/histEventCount"), 3.5); } - if (cfgOpenEvSelkIsGoodITSLayersAll && !collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + if (cfgOpenEvSel->get(3u) && !collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { return false; } - if (cfgOpenEvSelkIsGoodITSLayersAll) { - histos.fill(HIST("QA/histEventCountDetail"), 4.5); + if (fillQA && cfgOpenEvSel->get(3u)) { + histsESE.fill(HIST("EventQA/histEventCount"), 4.5); } - if (cfgOpenEvSelkNoCollInRofStandard && !collision.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { + if (cfgOpenEvSel->get(4u) && !collision.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { return false; } - if (cfgOpenEvSelkNoCollInRofStandard) { - histos.fill(HIST("QA/histEventCountDetail"), 5.5); + if (fillQA && cfgOpenEvSel->get(4u)) { + histsESE.fill(HIST("EventQA/histEventCount"), 5.5); } - if (cfgOpenEvSelkNoHighMultCollInPrevRof && !collision.selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof)) { + if (cfgOpenEvSel->get(5u) && !collision.selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof)) { return false; } - if (cfgOpenEvSelkNoHighMultCollInPrevRof) { - histos.fill(HIST("QA/histEventCountDetail"), 6.5); + if (fillQA && cfgOpenEvSel->get(5u)) { + histsESE.fill(HIST("EventQA/histEventCount"), 6.5); } auto multNTracksPV = collision.multNTracksPV(); auto occupancy = collision.trackOccupancyInTimeRange(); - if (cfgOpenEvSelOccupancy && (occupancy < cfgCutOccupancyLow || occupancy > cfgCutOccupancyHigh)) { + if (cfgOpenEvSel->get(6u) && (occupancy < cfgCutOccupancyLow || occupancy > cfgCutOccupancyHigh)) { return false; } - if (cfgOpenEvSelOccupancy) { - histos.fill(HIST("QA/histEventCountDetail"), 7.5); + if (fillQA && cfgOpenEvSel->get(6u)) { + histsESE.fill(HIST("EventQA/histEventCount"), 7.5); } - if (cfgOpenEvSelMultCorrelationPVTracks) { + if (cfgOpenEvSel->get(7u)) { if (multNTracksPV < fMultPVCutLow->Eval(centrality)) return false; if (multNTracksPV > fMultPVCutHigh->Eval(centrality)) return false; } - if (cfgOpenEvSelMultCorrelationPVTracks) { - histos.fill(HIST("QA/histEventCountDetail"), 8.5); + if (fillQA && cfgOpenEvSel->get(7u)) { + histsESE.fill(HIST("EventQA/histEventCount"), 8.5); } - if (cfgOpenEvSelMultCorrelationGlobalTracks) { + if (cfgOpenEvSel->get(8u)) { if (multTrk < fMultCutLow->Eval(centrality)) return false; if (multTrk > fMultCutHigh->Eval(centrality)) return false; } - if (cfgOpenEvSelMultCorrelationGlobalTracks) { - histos.fill(HIST("QA/histEventCountDetail"), 9.5); + if (fillQA && cfgOpenEvSel->get(8u)) { + histsESE.fill(HIST("EventQA/histEventCount"), 9.5); } - if (cfgOpenEvSelV0AT0ACut && (std::fabs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > event_selection::kFT0AV0ASigma * fT0AV0ASigma->Eval(collision.multFT0A()))) { + if (cfgOpenEvSel->get(9u) && (std::fabs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > ese_parameters::kFT0AV0ASigma * fT0AV0ASigma->Eval(collision.multFT0A()))) { return false; } - if (cfgOpenEvSelV0AT0ACut) { - histos.fill(HIST("QA/histEventCountDetail"), 10.5); + if (fillQA && cfgOpenEvSel->get(9u)) { + histsESE.fill(HIST("EventQA/histEventCount"), 10.5); + } + if (fillQA) { + histsESE.fill(HIST("EventQA/histVtz"), collision.posZ()); + histsESE.fill(HIST("EventQA/histCent"), centrality); } return true; } + template + bool trackSelBasic(const TrackType track) + { + if ((track.pt() < cfgMinPtPID) || (track.pt() > cfgMaxPtPID)) + return false; + if (std::abs(track.eta()) > cfgMaxEtaPID) + return false; + if (cfgOpenTrackSel->get(0u)) { + if (!track.passedITSNCls()) + return false; + } else { + if (track.itsNCls() < cfgMinITSCls || track.itsNCls() > cfgMaxITSCls) + return false; + } + if (cfgOpenTrackSel->get(1u)) { + if (!track.passedITSChi2NDF()) + return false; + } else { + if (track.itsChi2NCl() < cfgMinChi2NClITS || track.itsChi2NCl() > cfgMaxChi2NClITS) + return false; + } + if (cfgOpenTrackSel->get(2u)) { + if (!track.passedITSHits()) + return false; + } + if (cfgOpenTrackSel->get(3u)) { + if (!track.passedTPCChi2NDF()) + return false; + } else { + if (track.tpcChi2NCl() < cfgMinTPCChi2NCl || track.tpcChi2NCl() > cfgMaxTPCChi2NCl) + return false; + } + if (cfgOpenTrackSel->get(4u)) { + if (!track.passedTPCCrossedRowsOverNCls()) + return false; + } + if (cfgOpenTrackSel->get(5u)) { + if (!track.passedDCAxy()) + return false; + } else { + if (std::abs(track.dcaXY()) > cfgMaxDCAxy) + return false; + } + if (cfgOpenTrackSel->get(6u)) { + if (!track.passedDCAz()) + return false; + } else { + if (std::abs(track.dcaZ()) > cfgMaxDCAz) + return false; + } + if (track.tpcNClsFound() < cfgMinTPCCls || track.tpcNClsFound() > cfgMaxTPCCls) + return false; + return true; + } + template - void fillHistosQvec(const CollType& collision, int nmode) + void fillEventQAhistBe(const CollType collision, const int multTrk, const float centrality) { - int detInd = detId * 4 + cfgnTotalSystem * 4 * (nmode - 2); - int refAInd = refAId * 4 + cfgnTotalSystem * 4 * (nmode - 2); - int refBInd = refBId * 4 + cfgnTotalSystem * 4 * (nmode - 2); - if (nmode == fourier_mode::kMode2) { - if (collision.qvecAmp()[detId] > 1e-8) { - histos.fill(HIST("QA/histQvec_CorrL0_V2"), collision.qvecRe()[detInd], collision.qvecIm()[detInd], collision.centFT0C()); - histos.fill(HIST("QA/histQvec_CorrL1_V2"), collision.qvecRe()[detInd + 1], collision.qvecIm()[detInd + 1], collision.centFT0C()); - histos.fill(HIST("QA/histQvec_CorrL2_V2"), collision.qvecRe()[detInd + 2], collision.qvecIm()[detInd + 2], collision.centFT0C()); - histos.fill(HIST("QA/histQvec_CorrL3_V2"), collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], collision.centFT0C()); - histos.fill(HIST("QA/histEvtPl_CorrL0_V2"), helperEP.GetEventPlane(collision.qvecRe()[detInd], collision.qvecIm()[detInd], nmode), collision.centFT0C()); - histos.fill(HIST("QA/histEvtPl_CorrL1_V2"), helperEP.GetEventPlane(collision.qvecRe()[detInd + 1], collision.qvecIm()[detInd + 1], nmode), collision.centFT0C()); - histos.fill(HIST("QA/histEvtPl_CorrL2_V2"), helperEP.GetEventPlane(collision.qvecRe()[detInd + 2], collision.qvecIm()[detInd + 2], nmode), collision.centFT0C()); - histos.fill(HIST("QA/histEvtPl_CorrL3_V2"), helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode), collision.centFT0C()); - } - if (collision.qvecAmp()[detId] > 1e-8 && collision.qvecAmp()[refAId] > 1e-8 && collision.qvecAmp()[refBId] > 1e-8) { - histos.fill(HIST("QA/histQvecRes_SigRefAV2"), collision.centFT0C(), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode), helperEP.GetEventPlane(collision.qvecRe()[refAInd + 3], collision.qvecIm()[refAInd + 3], nmode), nmode)); - histos.fill(HIST("QA/histQvecRes_SigRefBV2"), collision.centFT0C(), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode), helperEP.GetEventPlane(collision.qvecRe()[refBInd + 3], collision.qvecIm()[refBInd + 3], nmode), nmode)); - histos.fill(HIST("QA/histQvecRes_RefARefBV2"), collision.centFT0C(), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[refAInd + 3], collision.qvecIm()[refAInd + 3], nmode), helperEP.GetEventPlane(collision.qvecRe()[refBInd + 3], collision.qvecIm()[refBInd + 3], nmode), nmode)); - } + histsESE.fill(HIST("EventQA/hist_globalTracks_centT0C_before"), centrality, multTrk); + histsESE.fill(HIST("EventQA/hist_PVTracks_centT0C_before"), centrality, collision.multNTracksPV()); + histsESE.fill(HIST("EventQA/hist_globalTracks_PVTracks_before"), collision.multNTracksPV(), multTrk); + histsESE.fill(HIST("EventQA/hist_globalTracks_multT0A_before"), collision.multFT0A(), multTrk); + histsESE.fill(HIST("EventQA/hist_globalTracks_multV0A_before"), collision.multFV0A(), multTrk); + histsESE.fill(HIST("EventQA/hist_multV0A_multT0A_before"), collision.multFT0A(), collision.multFV0A()); + histsESE.fill(HIST("EventQA/hist_multT0C_centT0C_before"), centrality, collision.multFT0C()); + } + + template + void fillEventQAhistAf(const CollType collision, const int multTrk, const float centrality) + { + histsESE.fill(HIST("EventQA/hist_globalTracks_centT0C_after"), centrality, multTrk); + histsESE.fill(HIST("EventQA/hist_PVTracks_centT0C_after"), centrality, collision.multNTracksPV()); + histsESE.fill(HIST("EventQA/hist_globalTracks_PVTracks_after"), collision.multNTracksPV(), multTrk); + histsESE.fill(HIST("EventQA/hist_globalTracks_multT0A_after"), collision.multFT0A(), multTrk); + histsESE.fill(HIST("EventQA/hist_globalTracks_multV0A_after"), collision.multFV0A(), multTrk); + histsESE.fill(HIST("EventQA/hist_multV0A_multT0A_after"), collision.multFT0A(), collision.multFV0A()); + histsESE.fill(HIST("EventQA/hist_multT0C_centT0C_after"), centrality, collision.multFT0C()); + } + + template + void fillTrackQAhist(const TrackType track) + { + bool heliumPID = track.pidForTracking() == o2::track::PID::Helium3 || track.pidForTracking() == o2::track::PID::Alpha; + float correctedTpcInnerParam = (heliumPID && cfgCompensatePIDinTracking) ? track.tpcInnerParam() / 2 : track.tpcInnerParam(); + histsESE.fill(HIST("TrackQA/hist_dEdxTPC_All"), track.sign() * correctedTpcInnerParam, track.tpcSignal()); + histsESE.fill(HIST("TrackQA/hist_pt_All"), track.pt()); + histsESE.fill(HIST("TrackQA/hist_eta_All"), track.eta()); + histsESE.fill(HIST("TrackQA/hist_phi_All"), track.phi()); + histsESE.fill(HIST("TrackQA/hist_DCAxy_All"), track.dcaXY()); + histsESE.fill(HIST("TrackQA/hist_DCAz_All"), track.dcaZ()); + histsESE.fill(HIST("TrackQA/hist_ITSNcls_All"), track.itsNCls()); + histsESE.fill(HIST("TrackQA/hist_TPCNcls_All"), track.tpcNClsFound()); + histsESE.fill(HIST("TrackQA/hist_ITSChi2NDF_All"), track.itsChi2NCl()); + histsESE.fill(HIST("TrackQA/hist_TPCChi2NDF_All"), track.tpcChi2NCl()); + } + + template + void fillHistosQvec(const CollType& collision) + { + int detInd = detId * 4 + cfgnTotalSystem * 4 * (2 - 2); + int refAInd = refAId * 4 + cfgnTotalSystem * 4 * (2 - 2); + int refBInd = refBId * 4 + cfgnTotalSystem * 4 * (2 - 2); + if (collision.qvecAmp()[detId] > ese_parameters::Amplitudelow) { + histsESE.fill(HIST("PlanQA/histQvec_CorrL0_V2"), collision.qvecRe()[detInd], collision.qvecIm()[detInd], collision.centFT0C()); + histsESE.fill(HIST("PlanQA/histQvec_CorrL1_V2"), collision.qvecRe()[detInd + 1], collision.qvecIm()[detInd + 1], collision.centFT0C()); + histsESE.fill(HIST("PlanQA/histQvec_CorrL2_V2"), collision.qvecRe()[detInd + 2], collision.qvecIm()[detInd + 2], collision.centFT0C()); + histsESE.fill(HIST("PlanQA/histQvec_CorrL3_V2"), collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], collision.centFT0C()); + histsESE.fill(HIST("PlanQA/histEvtPl_CorrL0_V2"), helperEP.GetEventPlane(collision.qvecRe()[detInd], collision.qvecIm()[detInd], 2), collision.centFT0C()); + histsESE.fill(HIST("PlanQA/histEvtPl_CorrL1_V2"), helperEP.GetEventPlane(collision.qvecRe()[detInd + 1], collision.qvecIm()[detInd + 1], 2), collision.centFT0C()); + histsESE.fill(HIST("PlanQA/histEvtPl_CorrL2_V2"), helperEP.GetEventPlane(collision.qvecRe()[detInd + 2], collision.qvecIm()[detInd + 2], 2), collision.centFT0C()); + histsESE.fill(HIST("PlanQA/histEvtPl_CorrL3_V2"), helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], 2), collision.centFT0C()); + } + if (collision.qvecAmp()[detId] > ese_parameters::Amplitudelow && collision.qvecAmp()[refAId] > ese_parameters::Amplitudelow && collision.qvecAmp()[refBId] > ese_parameters::Amplitudelow) { + histsESE.fill(HIST("PlanQA/histQvecRes_SigRefAV2"), collision.centFT0C(), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], 2), helperEP.GetEventPlane(collision.qvecRe()[refAInd + 3], collision.qvecIm()[refAInd + 3], 2), 2)); + histsESE.fill(HIST("PlanQA/histQvecRes_SigRefBV2"), collision.centFT0C(), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], 2), helperEP.GetEventPlane(collision.qvecRe()[refBInd + 3], collision.qvecIm()[refBInd + 3], 2), 2)); + histsESE.fill(HIST("PlanQA/histQvecRes_RefARefBV2"), collision.centFT0C(), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[refAInd + 3], collision.qvecIm()[refAInd + 3], 2), helperEP.GetEventPlane(collision.qvecRe()[refBInd + 3], collision.qvecIm()[refBInd + 3], 2), 2)); } } template - float calculateq2(const TrackType tracks, float psi2, float cent, int pidmode) // pidmode 1 for proton , 2 for he3 + bool pidSel(const TrackType& track, uint8_t POI) { - int multi = tracks.size(); - if (multi > 0) { - float q2x = 0, q2y = 0; - for (const auto& track : tracks) { - q2x += std::cos(2 * track.phi()); - q2y += std::sin(2 * track.phi()); - if (pidmode == pid_flags::kProton) { - if (track.sign() > 0) { - histos.fill(HIST("V2/histCosV2EP_Pr_Pos"), track.pt(), cent, std::cos(2 * (track.phi() - psi2))); - } else { - histos.fill(HIST("V2/histCosV2EP_Pr_Neg"), track.pt(), cent, std::cos(2 * (track.phi() - psi2))); + if (track.pt() < cfgPtPreselection->get(POI, 0u) || track.pt() > cfgPtPreselection->get(POI, 1u)) { + return false; + } + float nSigmaTPC = 0.f; + float nSigmaITS = 0.f; + switch (POI) { + case ese_parameters::kProton: + if (cfgProtonPIDMode == ese_parameters::kRMSMode) { // RMS mode + float nSigmaUse = (track.pt() > cfgPtMaxforTPCOnlyPIDPrton) ? std::hypot(track.tpcNSigmaPr(), track.tofNSigmaPr()) : track.tpcNSigmaPr(); + if (nSigmaUse < cfgnSigmaCutRMSProton.value[0] || nSigmaUse > cfgnSigmaCutRMSProton.value[1]) { + return false; } - } - if (pidmode == pid_flags::kHe3) { - if (track.sign() > 0) { - histos.fill(HIST("V2/histCosV2EP_He3_Pos"), track.pt(), cent, std::cos(2 * (track.phi() - psi2))); - } else { - histos.fill(HIST("V2/histCosV2EP_He3_Neg"), track.pt(), cent, std::cos(2 * (track.phi() - psi2))); + } else if (cfgProtonPIDMode == ese_parameters::kTPCMode) { // TPC mode + nSigmaTPC = (cfgUseSelfnSigmaTPCProton ? getNSigmaTPCSelfBB(track, ese_parameters::kProton) : track.tpcNSigmaPr()); + } else if (cfgProtonPIDMode == ese_parameters::kTOFOnlyMode) { // TOF only mode + if (!track.hasTOF()) + return false; + if (track.tofNSigmaPr() < cfgnSigmaCutTOFProton.value[0] || track.tofNSigmaPr() > cfgnSigmaCutTOFProton.value[1]) { + return false; } } - } - return std::hypot(q2x, q2y) / std::sqrt(multi); - } else { - return 0; + nSigmaITS = itsResponse.nSigmaITS(track); + break; + + case ese_parameters::kDeuteron: + nSigmaTPC = getNSigmaTPCSelfBB(track, ese_parameters::kDeuteron); + nSigmaITS = itsResponse.nSigmaITS(track); + break; + + case ese_parameters::kTriton: + nSigmaTPC = getNSigmaTPCSelfBB(track, ese_parameters::kTriton); + nSigmaITS = itsResponse.nSigmaITS(track); + break; + + case ese_parameters::kHe3: + nSigmaTPC = getNSigmaTPCSelfBB(track, ese_parameters::kHe3); + nSigmaITS = itsResponse.nSigmaITS(track); + break; + + case ese_parameters::kAlpha: + nSigmaTPC = getNSigmaTPCSelfBB(track, ese_parameters::kAlpha); + nSigmaITS = itsResponse.nSigmaITS(track); + break; + + default: + LOGF(error, "Unknown POI: %d", POI); + return false; + } + if (nSigmaTPC < cfgnSigmaTPC->get(POI, 0u) || nSigmaTPC > cfgnSigmaTPC->get(POI, 1u)) { + return false; + } + if (nSigmaITS < cfgnSigmaITS->get(POI, 0u) || nSigmaITS > cfgnSigmaITS->get(POI, 1u)) { + return false; } + return true; } - template - void processESE(const TrackType tracks, float psi2, float q2, float cent, int pidmode, bool spcharge) // pidmode 1 for proton , 2 for he3 + template + void fillESECandidates(Tcoll const& collision, Ttrks const& tracks, float& q2Tarx, float& q2Tary, int& multiTar, float& q2Refx, float& q2Refy, int& multiRef) { - for (const auto& track : tracks) { - if (pidmode == pid_flags::kProton) { - if (spcharge) { + float psi2 = helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], 2); + float q2Tarinit{0.f}; + float q2Refinit{0.f}; + for (const auto& track : tracks) { // loop on tracks + if (!trackSelBasic(track)) { + continue; + } + // we fill the track info QA in the main process + fillTrackQAhist(track); + bool kIsTar{false}; + bool kIsRef{false}; + kIsTar = pidSel(track, poiTar); + kIsRef = pidSel(track, poiRef); + if (!cfgOpenAllowCrossTrack && kIsTar && kIsRef) { + if (getNSigmaTPCSelfBB(track, poiTar) < getNSigmaTPCSelfBB(track, poiRef)) { + kIsRef = false; + } else { + kIsTar = false; + } + } + if (kIsTar) { + multiTar++; + q2Tarx += std::cos(2 * track.phi()); + q2Tary += std::sin(2 * track.phi()); + bool heliumPID = track.pidForTracking() == o2::track::PID::Helium3 || track.pidForTracking() == o2::track::PID::Alpha; + float correctedTpcInnerParam = (heliumPID && cfgCompensatePIDinTracking) ? track.tpcInnerParam() / 2 : track.tpcInnerParam(); + float nSigmaTPCTar{(poiTar == ese_parameters::kProton && !cfgUseSelfnSigmaTPCProton) ? track.tpcNSigmaPr() : getNSigmaTPCSelfBB(track, poiTar)}; + float nSigmaTOFTar{getNSigmaTOF(track, poiTar)}; + float nSigmaITSTar{getNSigmaITS(track, poiTar)}; + if (cfgOpenPIDQA) { + ese_parameters::hPIDQATar1D[0]->Fill(track.pt()); + ese_parameters::hPIDQATar1D[1]->Fill(track.eta()); + ese_parameters::hPIDQATar1D[2]->Fill(track.phi()); + ese_parameters::hPIDQATar1D[3]->Fill(track.itsNCls()); + ese_parameters::hPIDQATar1D[4]->Fill(track.tpcNClsFound()); + ese_parameters::hPIDQATar1D[5]->Fill(track.itsChi2NCl()); + ese_parameters::hPIDQATar1D[6]->Fill(track.tpcChi2NCl()); + ese_parameters::hPIDQATar1D[7]->Fill(track.dcaXY()); + ese_parameters::hPIDQATar1D[8]->Fill(track.dcaZ()); + ese_parameters::hPIDQATar1D[9]->Fill(nSigmaTPCTar); + ese_parameters::hPIDQATar1D[10]->Fill(nSigmaTOFTar); + ese_parameters::hPIDQATar1D[11]->Fill(nSigmaITSTar); + ese_parameters::hPIDQATar2D[0]->Fill(track.sign() * correctedTpcInnerParam, track.tpcSignal()); + ese_parameters::hPIDQATar2D[1]->Fill(nSigmaTPCTar, track.pt()); + ese_parameters::hPIDQATar2D[2]->Fill(nSigmaTOFTar, track.pt()); + ese_parameters::hPIDQATar2D[3]->Fill(nSigmaITSTar, track.pt()); + if (cfgOpen3DPIDPlots->get(0u)) { + ese_parameters::hPIDQATar3D[0]->Fill(nSigmaTOFTar, nSigmaITSTar, track.pt()); + } + if (cfgOpen3DPIDPlots->get(1u)) { + ese_parameters::hPIDQATar3D[1]->Fill(nSigmaITSTar, nSigmaTPCTar, track.pt()); + } + if (cfgOpen3DPIDPlots->get(2u)) { + ese_parameters::hPIDQATar3D[2]->Fill(nSigmaTOFTar, nSigmaTPCTar, track.pt()); + } + } + if (cfgOpenv2) { if (track.sign() > 0) { - histos.fill(HIST("ESE/hist_v2PosPr_Cent_Pt_q2He3"), track.pt(), cent, q2, std::cos(2 * (track.phi() - psi2))); + ese_parameters::hv2Tar[0]->Fill(track.pt(), collision.centFT0C(), std::cos(2 * (track.phi() - psi2))); } else { - histos.fill(HIST("ESE/hist_v2NegPr_Cent_Pt_q2He3"), track.pt(), cent, q2, std::cos(2 * (track.phi() - psi2))); + ese_parameters::hv2Tar[1]->Fill(track.pt(), collision.centFT0C(), std::cos(2 * (track.phi() - psi2))); } - } else { - histos.fill(HIST("ESE/hist_v2Pr_Cent_Pt_q2He3"), track.pt(), cent, q2, std::cos(2 * (track.phi() - psi2))); } + ese_parameters::eseCandidates.emplace_back(ESECandidate{ + collision.posZ(), collision.centFT0C(), psi2, q2Tarinit, q2Refinit, static_cast(track.sign()), correctedTpcInnerParam, track.tpcSignal(), track.pt(), track.eta(), track.phi(), + track.dcaXY(), track.dcaZ(), static_cast(track.tpcNClsFound()), track.itsNCls(), track.tpcChi2NCl(), track.itsChi2NCl(), + nSigmaTPCTar, nSigmaTOFTar, nSigmaITSTar, track.itsClusterSizes()}); } - if (pidmode == pid_flags::kHe3) { - if (spcharge) { + if (kIsRef) { + multiRef++; + q2Refx += std::cos(2 * track.phi()); + q2Refy += std::sin(2 * track.phi()); + bool heliumPID = track.pidForTracking() == o2::track::PID::Helium3 || track.pidForTracking() == o2::track::PID::Alpha; + float correctedTpcInnerParam = (heliumPID && cfgCompensatePIDinTracking) ? track.tpcInnerParam() / 2 : track.tpcInnerParam(); + float nSigmaTPCRef{(poiRef == ese_parameters::kProton && !cfgUseSelfnSigmaTPCProton) ? track.tpcNSigmaPr() : getNSigmaTPCSelfBB(track, poiRef)}; + float nSigmaTOFRef{getNSigmaTOF(track, poiRef)}; + float nSigmaITSRef{getNSigmaITS(track, poiRef)}; + if (cfgOpenPIDQA) { + ese_parameters::hPIDQARef1D[0]->Fill(track.pt()); + ese_parameters::hPIDQARef1D[1]->Fill(track.eta()); + ese_parameters::hPIDQARef1D[2]->Fill(track.phi()); + ese_parameters::hPIDQARef1D[3]->Fill(track.itsNCls()); + ese_parameters::hPIDQARef1D[4]->Fill(track.tpcNClsFound()); + ese_parameters::hPIDQARef1D[5]->Fill(track.itsChi2NCl()); + ese_parameters::hPIDQARef1D[6]->Fill(track.tpcChi2NCl()); + ese_parameters::hPIDQARef1D[7]->Fill(track.dcaXY()); + ese_parameters::hPIDQARef1D[8]->Fill(track.dcaZ()); + ese_parameters::hPIDQARef1D[9]->Fill(nSigmaTPCRef); + ese_parameters::hPIDQARef1D[10]->Fill(nSigmaTOFRef); + ese_parameters::hPIDQARef1D[11]->Fill(nSigmaITSRef); + ese_parameters::hPIDQARef2D[0]->Fill(track.sign() * correctedTpcInnerParam, track.tpcSignal()); + ese_parameters::hPIDQARef2D[1]->Fill(nSigmaTPCRef, track.pt()); + ese_parameters::hPIDQARef2D[2]->Fill(nSigmaTOFRef, track.pt()); + ese_parameters::hPIDQARef2D[3]->Fill(nSigmaITSRef, track.pt()); + if (cfgOpen3DPIDPlots->get(0u)) { + ese_parameters::hPIDQARef3D[0]->Fill(nSigmaTOFRef, nSigmaITSRef, track.pt()); + } + if (cfgOpen3DPIDPlots->get(1u)) { + ese_parameters::hPIDQARef3D[1]->Fill(nSigmaITSRef, nSigmaTPCRef, track.pt()); + } + if (cfgOpen3DPIDPlots->get(2u)) { + ese_parameters::hPIDQARef3D[2]->Fill(nSigmaTOFRef, nSigmaTPCRef, track.pt()); + } + } + if (cfgOpenv2) { if (track.sign() > 0) { - histos.fill(HIST("ESE/hist_v2PosHe3_Cent_Pt_q2Pr"), track.pt(), cent, q2, std::cos(2 * (track.phi() - psi2))); + ese_parameters::hv2Ref[0]->Fill(track.pt(), collision.centFT0C(), std::cos(2 * (track.phi() - psi2))); } else { - histos.fill(HIST("ESE/hist_v2NegHe3_Cent_Pt_q2Pr"), track.pt(), cent, q2, std::cos(2 * (track.phi() - psi2))); + ese_parameters::hv2Ref[1]->Fill(track.pt(), collision.centFT0C(), std::cos(2 * (track.phi() - psi2))); } - } else { - histos.fill(HIST("ESE/hist_v2He3_Cent_Pt_q2Pr"), track.pt(), cent, q2, std::cos(2 * (track.phi() - psi2))); } } } @@ -798,6 +856,8 @@ struct FlowEsePHe3 { void init(InitContext const&) { + poiTar = getPOI(cfgTarName); + poiRef = getPOI(cfgRefName); detId = getDetId(cfgDetName); refAId = getDetId(cfgRefAName); refBId = getDetId(cfgRefBName); @@ -807,169 +867,186 @@ struct FlowEsePHe3 { refAId = 4; refBId = 5; } - if (cfgUseAdditionalEventCut) { - fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x - 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); - fMultPVCutLow->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); - fMultPVCutHigh = new TF1("fMultPVCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x + 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); - fMultPVCutHigh->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); + detInd = detId * 4 + cfgnTotalSystem * 4 * (2 - 2); + refAInd = refAId * 4 + cfgnTotalSystem * 4 * (2 - 2); + refBInd = refBId * 4 + cfgnTotalSystem * 4 * (2 - 2); - fMultCutLow = new TF1("fMultCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x - 2.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); - fMultCutLow->SetParameters(1654.46, -47.2379, 0.449833, -0.0014125, 150.773, -3.67334, 0.0530503, -0.000614061, 3.15956e-06); - fMultCutHigh = new TF1("fMultCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x + 3.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); - fMultCutHigh->SetParameters(1654.46, -47.2379, 0.449833, -0.0014125, 150.773, -3.67334, 0.0530503, -0.000614061, 3.15956e-06); + fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x - 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); + fMultPVCutLow->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); + fMultPVCutHigh = new TF1("fMultPVCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x + 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); + fMultPVCutHigh->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); + fMultCutLow = new TF1("fMultCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x - 2.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); + fMultCutLow->SetParameters(1654.46, -47.2379, 0.449833, -0.0014125, 150.773, -3.67334, 0.0530503, -0.000614061, 3.15956e-06); + fMultCutHigh = new TF1("fMultCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x + 3.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); + fMultCutHigh->SetParameters(1654.46, -47.2379, 0.449833, -0.0014125, 150.773, -3.67334, 0.0530503, -0.000614061, 3.15956e-06); + fT0AV0AMean = new TF1("fT0AV0AMean", "[0]+[1]*x", 0, 200000); + fT0AV0AMean->SetParameters(-1601.0581, 9.417652e-01); + fT0AV0ASigma = new TF1("fT0AV0ASigma", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 200000); + fT0AV0ASigma->SetParameters(463.4144, 6.796509e-02, -9.097136e-07, 7.971088e-12, -2.600581e-17); - fT0AV0AMean = new TF1("fT0AV0AMean", "[0]+[1]*x", 0, 200000); - fT0AV0AMean->SetParameters(-1601.0581, 9.417652e-01); - fT0AV0ASigma = new TF1("fT0AV0ASigma", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 200000); - fT0AV0ASigma->SetParameters(463.4144, 6.796509e-02, -9.097136e-07, 7.971088e-12, -2.600581e-17); - } + AxisSpec axisITSNcls = {10, -1.5, 8.5, "ITSNcls"}; + AxisSpec axisTPCNcls = {160, 0, 160, "TPCNcls"}; AxisSpec axisEvtPl = {100, -1.0 * constants::math::PI, constants::math::PI}; - AxisSpec axisvertexz = {100, -15., 15., "vrtx_{Z} [cm]"}; - histos.add("QA/histEventCount", "", {HistType::kTH1F, {{3, 0.0, 3.0}}}); - histos.get(HIST("QA/histEventCount"))->GetXaxis()->SetBinLabel(1, "Filtered event"); - histos.get(HIST("QA/histEventCount"))->GetXaxis()->SetBinLabel(2, "after sel8"); - histos.get(HIST("QA/histEventCount"))->GetXaxis()->SetBinLabel(3, "after additional event cut"); - if (cfgUseAdditionalEventCut) { - histos.add("QA/histEventCountDetail", "Number of Event;; Count", {HistType::kTH1F, {{11, 0, 11}}}); - histos.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(1, "after sel8"); - histos.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(2, "kIsGoodZvtxFT0vsPV"); - histos.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(3, "kNoSameBunchPileup"); - histos.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(4, "kNoCollInTimeRangeStandard"); - histos.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(5, "kIsGoodITSLayersAll"); - histos.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(6, "kNoCollInRofStandard"); - histos.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(7, "kNoHighMultCollInPrevRof"); - histos.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(8, "occupancy"); - histos.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(9, "MultCorrelationPVTracks"); - histos.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(10, "MultCorrelationGlobalTracks"); - histos.get(HIST("QA/histEventCountDetail"))->GetXaxis()->SetBinLabel(11, "cfgEvSelV0AT0ACut"); - } + AxisSpec axisPhi = {200, -2.1 * constants::math::PI, 2.1 * constants::math::PI}; + AxisSpec axisCentForQA = {100, 0, 100}; + AxisSpec axisCharge = {4, -2, 2, "Charge"}; + // hists for event level QA + histsESE.add("EventQA/histEventCount", ";Event Count;Counts", {HistType::kTH1F, {{100, 0, 100}}}); + histsESE.get(HIST("EventQA/histEventCount"))->GetXaxis()->SetBinLabel(1, "after sel8"); + histsESE.get(HIST("EventQA/histEventCount"))->GetXaxis()->SetBinLabel(2, "kIsGoodZvtxFT0vsPV"); + histsESE.get(HIST("EventQA/histEventCount"))->GetXaxis()->SetBinLabel(3, "kNoSameBunchPileup"); + histsESE.get(HIST("EventQA/histEventCount"))->GetXaxis()->SetBinLabel(4, "kNoCollInTimeRangeStandard"); + histsESE.get(HIST("EventQA/histEventCount"))->GetXaxis()->SetBinLabel(5, "kIsGoodITSLayersAll"); + histsESE.get(HIST("EventQA/histEventCount"))->GetXaxis()->SetBinLabel(6, "kNoCollInRofStandard"); + histsESE.get(HIST("EventQA/histEventCount"))->GetXaxis()->SetBinLabel(7, "kNoHighMultCollInPrevRof"); + histsESE.get(HIST("EventQA/histEventCount"))->GetXaxis()->SetBinLabel(8, "occupancy"); + histsESE.get(HIST("EventQA/histEventCount"))->GetXaxis()->SetBinLabel(9, "MultCorrelationPVTracks"); + histsESE.get(HIST("EventQA/histEventCount"))->GetXaxis()->SetBinLabel(10, "MultCorrelationGlobalTracks"); + histsESE.get(HIST("EventQA/histEventCount"))->GetXaxis()->SetBinLabel(11, "cfgEvSelV0AT0ACut"); + histsESE.add("EventQA/histVtz", ";#it{Vtz} (cm);Counts", {HistType::kTH1F, {{200, -20., +20.}}}); + histsESE.add("EventQA/histCent", ";Centrality (%);Counts", {HistType::kTH1F, {{100, 0., 100.}}}); if (cfgOpenFullEventQA) { - histos.add("QA/hist_globalTracks_centT0C_before", "before cut;Centrality T0C;mulplicity global tracks", {HistType::kTH2D, {cfgaxisCentForQA, cfgaxisNch}}); - histos.add("QA/hist_PVTracks_centT0C_before", "before cut;Centrality T0C;mulplicity PV tracks", {HistType::kTH2D, {cfgaxisCentForQA, cfgaxisNchPV}}); - histos.add("QA/hist_globalTracks_PVTracks_before", "before cut;mulplicity PV tracks;mulplicity global tracks", {HistType::kTH2D, {cfgaxisNchPV, cfgaxisNch}}); - histos.add("QA/hist_globalTracks_multT0A_before", "before cut;mulplicity T0A;mulplicity global tracks", {HistType::kTH2D, {cfgaxisT0A, cfgaxisNch}}); - histos.add("QA/hist_globalTracks_multV0A_before", "before cut;mulplicity V0A;mulplicity global tracks", {HistType::kTH2D, {cfgaxisT0A, cfgaxisNch}}); - histos.add("QA/hist_multV0A_multT0A_before", "before cut;mulplicity T0A;mulplicity V0A", {HistType::kTH2D, {cfgaxisT0A, cfgaxisT0A}}); - histos.add("QA/hist_multT0C_centT0C_before", "before cut;Centrality T0C;mulplicity T0C", {HistType::kTH2D, {cfgaxisCentForQA, cfgaxisT0C}}); - histos.add("QA/hist_globalTracks_centT0C_after", "after cut;Centrality T0C;mulplicity global tracks", {HistType::kTH2D, {cfgaxisCentForQA, cfgaxisNch}}); - histos.add("QA/hist_PVTracks_centT0C_after", "after cut;Centrality T0C;mulplicity PV tracks", {HistType::kTH2D, {cfgaxisCentForQA, cfgaxisNchPV}}); - histos.add("QA/hist_globalTracks_PVTracks_after", "after cut;mulplicity PV tracks;mulplicity global tracks", {HistType::kTH2D, {cfgaxisNchPV, cfgaxisNch}}); - histos.add("QA/hist_globalTracks_multT0A_after", "after cut;mulplicity T0A;mulplicity global tracks", {HistType::kTH2D, {cfgaxisT0A, cfgaxisNch}}); - histos.add("QA/hist_globalTracks_multV0A_after", "after cut;mulplicity V0A;mulplicity global tracks", {HistType::kTH2D, {cfgaxisT0A, cfgaxisNch}}); - histos.add("QA/hist_multV0A_multT0A_after", "after cut;mulplicity T0A;mulplicity V0A", {HistType::kTH2D, {cfgaxisT0A, cfgaxisT0A}}); - histos.add("QA/hist_multT0C_centT0C_after", "after cut;Centrality T0C;mulplicity T0C", {HistType::kTH2D, {cfgaxisCentForQA, cfgaxisT0C}}); - } - histos.add("QA/histVertexZRec", ";vrtx_{Z} [cm];counts", {HistType::kTH1F, {axisvertexz}}); - histos.add("QA/histCentrality", ";Centrality;counts", {HistType::kTH1F, {cfgaxisCentForQA}}); - histos.add("QA/histProtonNum", "ProtonNum;counts", {HistType::kTH1F, {{100, 0, 100}}}); - histos.add("QA/histHe3Num", "He3Num;counts", {HistType::kTH1F, {{20, 0, 20}}}); - histos.add("QA/histQvec_CorrL0_V2", ";#it{Q_{x}};#it{Q_{y}};Centrality", {HistType::kTH3F, {cfgaxisQvecF, cfgaxisQvecF, cfgaxisCent}}); - histos.add("QA/histQvec_CorrL1_V2", ";#it{Q_{x}};#it{Q_{y}};Centrality", {HistType::kTH3F, {cfgaxisQvecF, cfgaxisQvecF, cfgaxisCent}}); - histos.add("QA/histQvec_CorrL2_V2", ";#it{Q_{x}};#it{Q_{y}};Centrality", {HistType::kTH3F, {cfgaxisQvecF, cfgaxisQvecF, cfgaxisCent}}); - histos.add("QA/histQvec_CorrL3_V2", ";#it{Q_{x}};#it{Q_{y}};Centrality", {HistType::kTH3F, {cfgaxisQvecF, cfgaxisQvecF, cfgaxisCent}}); - histos.add("QA/histEvtPl_CorrL0_V2", ";EventPlane angle;Centrality", {HistType::kTH2F, {axisEvtPl, cfgaxisCent}}); - histos.add("QA/histEvtPl_CorrL1_V2", ";EventPlane angle;Centrality", {HistType::kTH2F, {axisEvtPl, cfgaxisCent}}); - histos.add("QA/histEvtPl_CorrL2_V2", ";EventPlane angle;Centrality", {HistType::kTH2F, {axisEvtPl, cfgaxisCent}}); - histos.add("QA/histEvtPl_CorrL3_V2", ";EventPlane angle;Centrality", {HistType::kTH2F, {axisEvtPl, cfgaxisCent}}); - histos.add("QA/histQvecRes_SigRefAV2", ";Centrality;Cos(Sig-RefA)", {HistType::kTProfile, {cfgaxisCent}}); - histos.add("QA/histQvecRes_SigRefBV2", ";Centrality;Cos(Sig-RefB)", {HistType::kTProfile, {cfgaxisCent}}); - histos.add("QA/histQvecRes_RefARefBV2", ";Centrality;Cos(RefA-RefB)", {HistType::kTProfile, {cfgaxisCent}}); - if (cfgOpenv2q) { - histos.add("V2/histCosV2EP_Pr_Pos", ";#it{p}_{T};Centrality", {HistType::kTProfile2D, {cfgaxispt, cfgaxisCent}}); - histos.add("V2/histCosV2EP_Pr_Neg", ";#it{p}_{T};Centrality", {HistType::kTProfile2D, {cfgaxispt, cfgaxisCent}}); - histos.add("V2/histCosV2EP_He3_Pos", ";#it{p}_{T};Centrality", {HistType::kTProfile2D, {cfgaxispt, cfgaxisCent}}); - histos.add("V2/histCosV2EP_He3_Neg", ";#it{p}_{T};Centrality", {HistType::kTProfile2D, {cfgaxispt, cfgaxisCent}}); - histos.add("q2/hist_q2_Cen_Pr", ";q_{2} (TPC);Centrality", {HistType::kTH2F, {cfgaxisq2, cfgaxisCent}}); - histos.add("q2/hist_q2_Cen_He3", ";q_{2} (TPC);Centrality", {HistType::kTH2F, {cfgaxisq2, cfgaxisCent}}); - histos.add("q2/hist_q2_Pr", ";q_{2} (TPC);counts", {HistType::kTH1F, {cfgaxisq2}}); - histos.add("q2/hist_q2_He3", ";q_{2} (TPC);counts", {HistType::kTH1F, {cfgaxisq2}}); + histsESE.add("EventQA/hist_globalTracks_centT0C_before", "before cut;Centrality T0C;mulplicity global tracks", {HistType::kTH2D, {axisCentForQA, cfgaxisNch}}); + histsESE.add("EventQA/hist_PVTracks_centT0C_before", "before cut;Centrality T0C;mulplicity PV tracks", {HistType::kTH2D, {axisCentForQA, cfgaxisNchPV}}); + histsESE.add("EventQA/hist_globalTracks_PVTracks_before", "before cut;mulplicity PV tracks;mulplicity global tracks", {HistType::kTH2D, {cfgaxisNchPV, cfgaxisNch}}); + histsESE.add("EventQA/hist_globalTracks_multT0A_before", "before cut;mulplicity T0A;mulplicity global tracks", {HistType::kTH2D, {cfgaxisT0A, cfgaxisNch}}); + histsESE.add("EventQA/hist_globalTracks_multV0A_before", "before cut;mulplicity V0A;mulplicity global tracks", {HistType::kTH2D, {cfgaxisT0A, cfgaxisNch}}); + histsESE.add("EventQA/hist_multV0A_multT0A_before", "before cut;mulplicity T0A;mulplicity V0A", {HistType::kTH2D, {cfgaxisT0A, cfgaxisT0A}}); + histsESE.add("EventQA/hist_multT0C_centT0C_before", "before cut;Centrality T0C;mulplicity T0C", {HistType::kTH2D, {axisCentForQA, cfgaxisT0C}}); + histsESE.add("EventQA/hist_globalTracks_centT0C_after", "after cut;Centrality T0C;mulplicity global tracks", {HistType::kTH2D, {axisCentForQA, cfgaxisNch}}); + histsESE.add("EventQA/hist_PVTracks_centT0C_after", "after cut;Centrality T0C;mulplicity PV tracks", {HistType::kTH2D, {axisCentForQA, cfgaxisNchPV}}); + histsESE.add("EventQA/hist_globalTracks_PVTracks_after", "after cut;mulplicity PV tracks;mulplicity global tracks", {HistType::kTH2D, {cfgaxisNchPV, cfgaxisNch}}); + histsESE.add("EventQA/hist_globalTracks_multT0A_after", "after cut;mulplicity T0A;mulplicity global tracks", {HistType::kTH2D, {cfgaxisT0A, cfgaxisNch}}); + histsESE.add("EventQA/hist_globalTracks_multV0A_after", "after cut;mulplicity V0A;mulplicity global tracks", {HistType::kTH2D, {cfgaxisT0A, cfgaxisNch}}); + histsESE.add("EventQA/hist_multV0A_multT0A_after", "after cut;mulplicity T0A;mulplicity V0A", {HistType::kTH2D, {cfgaxisT0A, cfgaxisT0A}}); + histsESE.add("EventQA/hist_multT0C_centT0C_after", "after cut;Centrality T0C;mulplicity T0C", {HistType::kTH2D, {axisCentForQA, cfgaxisT0C}}); } - if (cfgOpenESE) { - if (cfgOpenESEChargeSeperation) { - if (cfgOpenESEProton) { - histos.add("ESE/hist_v2PosPr_Cent_Pt_q2He3", ";#it{p}_{T};q_{2}(He3);Centrality", HistType::kTProfile3D, {cfgaxispt, cfgaxisq2, cfgaxisCent}); - histos.add("ESE/hist_v2NegPr_Cent_Pt_q2He3", ";#it{p}_{T};q_{2}(He3);Centrality", HistType::kTProfile3D, {cfgaxispt, cfgaxisq2, cfgaxisCent}); - } - if (cfgOpenESEHe3) { - histos.add("ESE/hist_v2PosHe3_Cent_Pt_q2Pr", ";#it{p}_{T};q_{2}(Proton);Centrality", HistType::kTProfile3D, {cfgaxispt, cfgaxisq2, cfgaxisCent}); - histos.add("ESE/hist_v2NegHe3_Cent_Pt_q2Pr", ";#it{p}_{T};q_{2}(Proton);Centrality", HistType::kTProfile3D, {cfgaxispt, cfgaxisq2, cfgaxisCent}); - } - } else { - if (cfgOpenESEProton) { - histos.add("ESE/hist_v2Pr_Cent_Pt_q2He3", ";#it{p}_{T};q_{2}(He3);Centrality", HistType::kTProfile3D, {cfgaxispt, cfgaxisq2, cfgaxisCent}); - } - if (cfgOpenESEHe3) { - histos.add("ESE/hist_v2He3_Cent_Pt_q2Pr", ";#it{p}_{T};q_{2}(Proton);Centrality", HistType::kTProfile3D, {cfgaxispt, cfgaxisq2, cfgaxisCent}); - } + histsESE.add("PlanQA/histQvec_CorrL0_V2", ";#it{Q_{x}};#it{Q_{y}};Centrality", {HistType::kTH3F, {cfgaxisQvecF, cfgaxisQvecF, cfgaxisCent}}); + histsESE.add("PlanQA/histQvec_CorrL1_V2", ";#it{Q_{x}};#it{Q_{y}};Centrality", {HistType::kTH3F, {cfgaxisQvecF, cfgaxisQvecF, cfgaxisCent}}); + histsESE.add("PlanQA/histQvec_CorrL2_V2", ";#it{Q_{x}};#it{Q_{y}};Centrality", {HistType::kTH3F, {cfgaxisQvecF, cfgaxisQvecF, cfgaxisCent}}); + histsESE.add("PlanQA/histQvec_CorrL3_V2", ";#it{Q_{x}};#it{Q_{y}};Centrality", {HistType::kTH3F, {cfgaxisQvecF, cfgaxisQvecF, cfgaxisCent}}); + histsESE.add("PlanQA/histEvtPl_CorrL0_V2", ";EventPlane angle;Centrality", {HistType::kTH2F, {axisEvtPl, cfgaxisCent}}); + histsESE.add("PlanQA/histEvtPl_CorrL1_V2", ";EventPlane angle;Centrality", {HistType::kTH2F, {axisEvtPl, cfgaxisCent}}); + histsESE.add("PlanQA/histEvtPl_CorrL2_V2", ";EventPlane angle;Centrality", {HistType::kTH2F, {axisEvtPl, cfgaxisCent}}); + histsESE.add("PlanQA/histEvtPl_CorrL3_V2", ";EventPlane angle;Centrality", {HistType::kTH2F, {axisEvtPl, cfgaxisCent}}); + histsESE.add("PlanQA/histQvecRes_SigRefAV2", ";Centrality;Cos(Sig-RefA)", {HistType::kTProfile, {cfgaxisCent}}); + histsESE.add("PlanQA/histQvecRes_SigRefBV2", ";Centrality;Cos(Sig-RefB)", {HistType::kTProfile, {cfgaxisCent}}); + histsESE.add("PlanQA/histQvecRes_RefARefBV2", ";Centrality;Cos(RefA-RefB)", {HistType::kTProfile, {cfgaxisCent}}); + // hists for track level QA + histsESE.add("TrackQA/hist_dEdxTPC_All", ";#it{p}^{TPC}/#it{z} (GeV/c);d#it{E}/d#it{x}", {HistType::kTH2F, {cfgrigidityBins, cfgdedxBins}}); + histsESE.add("TrackQA/hist_pt_All", ";#it{p}_{T};counts", {HistType::kTH1F, {cfgaxispt}}); + histsESE.add("TrackQA/hist_eta_All", ";#it{#eta};counts", {HistType::kTH1F, {cfgaxisetaPID}}); + histsESE.add("TrackQA/hist_phi_All", ";#it{#phi};counts", {HistType::kTH1F, {axisPhi}}); + histsESE.add("TrackQA/hist_ITSNcls_All", ";ITSNcls;counts", {HistType::kTH1F, {axisITSNcls}}); + histsESE.add("TrackQA/hist_TPCNcls_All", ";TPCNcls;counts", {HistType::kTH1F, {axisTPCNcls}}); + histsESE.add("TrackQA/hist_ITSChi2NDF_All", ";ITS#it{#chi^{2}}/NDF;counts", {HistType::kTH1F, {cfgaxisChi2Ncls}}); + histsESE.add("TrackQA/hist_TPCChi2NDF_All", ";TPC#it{#chi^{2}}/NDF;counts", {HistType::kTH1F, {cfgaxisChi2Ncls}}); + histsESE.add("TrackQA/hist_DCAxy_All", ";#it{DCA_{xy}};counts", {HistType::kTH1F, {cfgaxisDCAxy}}); + histsESE.add("TrackQA/hist_DCAz_All", ";#it{DCA_{xy}};counts", {HistType::kTH1F, {cfgaxisDCAz}}); + // v2 and ESEPlots + /// QA plots + if (cfgOpenPIDQA) { + ese_parameters::hPIDQATar2D[0] = histsESE.add(Form("ESE/TrackQA/hist_dEdxTPC_%s", cfgTarName.value.c_str()), ";#it{p}^{TPC}/#it{z} (GeV/c);d#it{E}/d#it{x}", HistType::kTH2F, {cfgrigidityBins, cfgdedxBins}); + ese_parameters::hPIDQATar1D[0] = histsESE.add(Form("ESE/TrackQA/hist_pt_%s", cfgTarName.value.c_str()), ";#it{p}_{T};counts", HistType::kTH1F, {cfgaxispt}); + ese_parameters::hPIDQATar1D[1] = histsESE.add(Form("ESE/TrackQA/hist_eta_%s", cfgTarName.value.c_str()), ";#it{#eta};counts", HistType::kTH1F, {cfgaxisetaPID}); + ese_parameters::hPIDQATar1D[2] = histsESE.add(Form("ESE/TrackQA/hist_phi_%s", cfgTarName.value.c_str()), ";#it{#phi};counts", HistType::kTH1F, {axisPhi}); + ese_parameters::hPIDQATar1D[3] = histsESE.add(Form("ESE/TrackQA/hist_ITSNcls_%s", cfgTarName.value.c_str()), ";ITSNcls;counts", HistType::kTH1F, {axisITSNcls}); + ese_parameters::hPIDQATar1D[4] = histsESE.add(Form("ESE/TrackQA/hist_TPCNcls_%s", cfgTarName.value.c_str()), ";TPCNcls;counts", HistType::kTH1F, {axisTPCNcls}); + ese_parameters::hPIDQATar1D[5] = histsESE.add(Form("ESE/TrackQA/hist_ITSChi2NDF_%s", cfgTarName.value.c_str()), ";ITS#it{#chi^{2}}/NDF;counts", HistType::kTH1F, {cfgaxisChi2Ncls}); + ese_parameters::hPIDQATar1D[6] = histsESE.add(Form("ESE/TrackQA/hist_TPCChi2NDF_%s", cfgTarName.value.c_str()), ";TPC#it{#chi^{2}}/NDF;counts", HistType::kTH1F, {cfgaxisChi2Ncls}); + ese_parameters::hPIDQATar1D[7] = histsESE.add(Form("ESE/TrackQA/hist_DCAxy_%s", cfgTarName.value.c_str()), ";#it{DCA_{xy}};counts", HistType::kTH1F, {cfgaxisDCAxy}); + ese_parameters::hPIDQATar1D[8] = histsESE.add(Form("ESE/TrackQA/hist_DCAz_%s", cfgTarName.value.c_str()), ";#it{DCA_{xy}};counts", HistType::kTH1F, {cfgaxisDCAz}); + ese_parameters::hPIDQATar1D[9] = histsESE.add(Form("ESE/TrackQA/hist_nSigmaTPC_%s", cfgTarName.value.c_str()), ";n#sigmaTPC;counts", HistType::kTH1F, {cfgnSigmaBinsTPC}); + ese_parameters::hPIDQATar2D[1] = histsESE.add(Form("ESE/TrackQA/hist_nSigmaTPC_pt_%s", cfgTarName.value.c_str()), ";#it{p}_{T};n#sigmaTPC", HistType::kTH2F, {cfgaxispt, cfgnSigmaBinsTPC}); + ese_parameters::hPIDQATar1D[10] = histsESE.add(Form("ESE/TrackQA/hist_nSigmaTOF_%s", cfgTarName.value.c_str()), ";n#sigmaTOF;counts", HistType::kTH1F, {cfgnSigmaBinsTOF}); + ese_parameters::hPIDQATar2D[2] = histsESE.add(Form("ESE/TrackQA/hist_nSigmaTOF_pt_%s", cfgTarName.value.c_str()), ";#it{p}_{T};n#sigmaTOF", HistType::kTH2F, {cfgaxispt, cfgnSigmaBinsTOF}); + ese_parameters::hPIDQATar1D[11] = histsESE.add(Form("ESE/TrackQA/hist_nSigmaITS_%s", cfgTarName.value.c_str()), ";n#sigmaITS;counts", HistType::kTH1F, {cfgnSigmaBinsITS}); + ese_parameters::hPIDQATar2D[3] = histsESE.add(Form("ESE/TrackQA/hist_nSigmaITS_pt_%s", cfgTarName.value.c_str()), ";#it{p}_{T};n#sigmaITS", HistType::kTH2F, {cfgaxispt, cfgnSigmaBinsITS}); + ese_parameters::hPIDQARef2D[0] = histsESE.add(Form("ESE/TrackQA/hist_dEdxTPC_%s", cfgRefName.value.c_str()), ";#it{p}^{TPC}/#it{z} (GeV/c);d#it{E}/d#it{x}", HistType::kTH2F, {cfgrigidityBins, cfgdedxBins}); + ese_parameters::hPIDQARef1D[0] = histsESE.add(Form("ESE/TrackQA/hist_pt_%s", cfgRefName.value.c_str()), ";#it{p}_{T};counts", HistType::kTH1F, {cfgaxispt}); + ese_parameters::hPIDQARef1D[1] = histsESE.add(Form("ESE/TrackQA/hist_eta_%s", cfgRefName.value.c_str()), ";#it{#eta};counts", HistType::kTH1F, {cfgaxisetaPID}); + ese_parameters::hPIDQARef1D[2] = histsESE.add(Form("ESE/TrackQA/hist_phi_%s", cfgRefName.value.c_str()), ";#it{#phi};counts", HistType::kTH1F, {axisPhi}); + ese_parameters::hPIDQARef1D[3] = histsESE.add(Form("ESE/TrackQA/hist_ITSNcls_%s", cfgRefName.value.c_str()), ";ITSNcls;counts", HistType::kTH1F, {axisITSNcls}); + ese_parameters::hPIDQARef1D[4] = histsESE.add(Form("ESE/TrackQA/hist_TPCNcls_%s", cfgRefName.value.c_str()), ";TPCNcls;counts", HistType::kTH1F, {axisTPCNcls}); + ese_parameters::hPIDQARef1D[5] = histsESE.add(Form("ESE/TrackQA/hist_ITSChi2NDF_%s", cfgRefName.value.c_str()), ";ITS#it{#chi^{2}}/NDF;counts", HistType::kTH1F, {cfgaxisChi2Ncls}); + ese_parameters::hPIDQARef1D[6] = histsESE.add(Form("ESE/TrackQA/hist_TPCChi2NDF_%s", cfgRefName.value.c_str()), ";TPC#it{#chi^{2}}/NDF;counts", HistType::kTH1F, {cfgaxisChi2Ncls}); + ese_parameters::hPIDQARef1D[7] = histsESE.add(Form("ESE/TrackQA/hist_DCAxy_%s", cfgRefName.value.c_str()), ";#it{DCA_{xy}};counts", HistType::kTH1F, {cfgaxisDCAxy}); + ese_parameters::hPIDQARef1D[8] = histsESE.add(Form("ESE/TrackQA/hist_DCAz_%s", cfgRefName.value.c_str()), ";#it{DCA_{xy}};counts", HistType::kTH1F, {cfgaxisDCAz}); + ese_parameters::hPIDQARef1D[9] = histsESE.add(Form("ESE/TrackQA/hist_nSigmaTPC_%s", cfgRefName.value.c_str()), ";n#sigmaTPC;counts", HistType::kTH1F, {cfgnSigmaBinsTPC}); + ese_parameters::hPIDQARef2D[1] = histsESE.add(Form("ESE/TrackQA/hist_nSigmaTPC_pt_%s", cfgRefName.value.c_str()), ";#it{p}_{T};n#sigmaTPC", HistType::kTH2F, {cfgaxispt, cfgnSigmaBinsTPC}); + ese_parameters::hPIDQARef1D[10] = histsESE.add(Form("ESE/TrackQA/hist_nSigmaTOF_%s", cfgRefName.value.c_str()), ";n#sigmaTOF;counts", HistType::kTH1F, {cfgnSigmaBinsTOF}); + ese_parameters::hPIDQARef2D[2] = histsESE.add(Form("ESE/TrackQA/hist_nSigmaTOF_pt_%s", cfgRefName.value.c_str()), ";#it{p}_{T};n#sigmaTOF", HistType::kTH2F, {cfgaxispt, cfgnSigmaBinsTOF}); + ese_parameters::hPIDQARef1D[11] = histsESE.add(Form("ESE/TrackQA/hist_nSigmaITS_%s", cfgRefName.value.c_str()), ";n#sigmaITS;counts", HistType::kTH1F, {cfgnSigmaBinsITS}); + ese_parameters::hPIDQARef2D[3] = histsESE.add(Form("ESE/TrackQA/hist_nSigmaITS_pt_%s", cfgRefName.value.c_str()), ";#it{p}_{T};n#sigmaITS", HistType::kTH2F, {cfgaxispt, cfgnSigmaBinsITS}); + if (cfgOpen3DPIDPlots->get(0u)) { + ese_parameters::hPIDQATar3D[0] = histsESE.add(Form("ESE/TrackQA/hist_nSigmaTOFITSPt_%s", cfgTarName.value.c_str()), ";n_{#sigma}TOF;n_{#sigma}ITS;#it{p}_{T}", HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsITS, cfgaxispt}); + ese_parameters::hPIDQARef3D[0] = histsESE.add(Form("ESE/TrackQA/hist_nSigmaTOFITSPt_%s", cfgRefName.value.c_str()), ";n_{#sigma}TOF;n_{#sigma}ITS;#it{p}_{T}", HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsITS, cfgaxispt}); } + if (cfgOpen3DPIDPlots->get(1u)) { + ese_parameters::hPIDQATar3D[1] = histsESE.add(Form("ESE/TrackQA/hist_nSigmaITSTPCPt_%s", cfgTarName.value.c_str()), ";n_{#sigma}ITS;n_{#sigma}TPC;#it{p}_{T}", HistType::kTH3F, {cfgnSigmaBinsITS, cfgnSigmaBinsTPC, cfgaxispt}); + ese_parameters::hPIDQARef3D[1] = histsESE.add(Form("ESE/TrackQA/hist_nSigmaITSTPCPt_%s", cfgRefName.value.c_str()), ";n_{#sigma}ITS;n_{#sigma}TPC;#it{p}_{T}", HistType::kTH3F, {cfgnSigmaBinsITS, cfgnSigmaBinsTPC, cfgaxispt}); + } + if (cfgOpen3DPIDPlots->get(2u)) { + ese_parameters::hPIDQATar3D[2] = histsESE.add(Form("ESE/TrackQA/hist_nSigmaTOFTPCPt_%s", cfgTarName.value.c_str()), ";n_{#sigma}TOF;n_{#sigma}TPC;#it{p}_{T}", HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsTPC, cfgaxispt}); + ese_parameters::hPIDQARef3D[2] = histsESE.add(Form("ESE/TrackQA/hist_nSigmaTOFTPCPt_%s", cfgRefName.value.c_str()), ";n_{#sigma}TOF;n_{#sigma}TPC;#it{p}_{T}", HistType::kTH3F, {cfgnSigmaBinsTOF, cfgnSigmaBinsTPC, cfgaxispt}); + } + } + // v2 plots + if (cfgOpenv2) { + ese_parameters::hv2Tar[0] = histsESE.add(Form("ESE/V2/hist_%sPosV2", cfgTarName.value.c_str()), ";#it{p}_{T};Centrality (%)", HistType::kTProfile2D, {cfgaxispt, cfgaxisCent}); + ese_parameters::hv2Tar[1] = histsESE.add(Form("ESE/V2/hist_%sNegV2", cfgTarName.value.c_str()), ";#it{p}_{T};Centrality (%)", HistType::kTProfile2D, {cfgaxispt, cfgaxisCent}); + ese_parameters::hv2Ref[0] = histsESE.add(Form("ESE/V2/hist_%sPosV2", cfgRefName.value.c_str()), ";#it{p}_{T};Centrality (%)", HistType::kTProfile2D, {cfgaxispt, cfgaxisCent}); + ese_parameters::hv2Ref[1] = histsESE.add(Form("ESE/V2/hist_%sNegV2", cfgRefName.value.c_str()), ";#it{p}_{T};Centrality (%)", HistType::kTProfile2D, {cfgaxispt, cfgaxisCent}); + } + // ESE plots + if (cfgOpenESEQA) { + ese_parameters::hESEQATar1D[0] = histsESE.add(Form("ESE/ESEQA/hist_%sNum", cfgTarName.value.c_str()), ";Num_{Proton}/Event;counts", HistType::kTH1F, {{100, 0, 100}}); + ese_parameters::hESEQATar1D[1] = histsESE.add(Form("ESE/ESEQA/hist_%sq2", cfgTarName.value.c_str()), ";#it{q}_{2};counts", HistType::kTH1F, {cfgaxisq2}); + ese_parameters::hESEQATar2D = histsESE.add(Form("ESE/ESEQA/hist_%sq2_Cent", cfgTarName.value.c_str()), ";#it{q}_{2};Centrality (%)", HistType::kTH2F, {cfgaxisq2, cfgaxisCent}); + ese_parameters::hESEQARef1D[0] = histsESE.add(Form("ESE/ESEQA/hist_%sNum", cfgRefName.value.c_str()), ";Num_{He3}/Event;counts", HistType::kTH1F, {{10, 0, 10}}); + ese_parameters::hESEQARef1D[1] = histsESE.add(Form("ESE/ESEQA/hist_%sq2", cfgRefName.value.c_str()), ";#it{q}_{2};counts", HistType::kTH1F, {cfgaxisq2}); + ese_parameters::hESEQARef2D = histsESE.add(Form("ESE/ESEQA/hist_%sq2_Cent", cfgRefName.value.c_str()), ";#it{q}_{2};Centrality (%)", HistType::kTH2F, {cfgaxisq2, cfgaxisCent}); + } + if (cfgOpenESE) { + ese_parameters::hESETar = histsESE.add(Form("ESE/ESE/histESE_%s", cfgTarName.value.c_str()), ";#it{p}_{T};Centrality (%);#it{q}_{2};cos(#phi-#Psi_{2});Charge", HistType::kTHnSparseF, {cfgaxispt, cfgaxisCent, cfgaxisq2, cfgaxiscos, axisCharge}); } } - void process(soa::Filtered>::iterator const& collision, soa::Filtered> const& tracks) + void process(soa::Filtered>::iterator const& collision, TracksPIDFull const& tracks) { - const auto cent = collision.centFT0C(); - histos.fill(HIST("QA/histEventCount"), 0.5); - if (!collision.sel8()) - return; - if (tracks.size() < 1) - return; - histos.fill(HIST("QA/histEventCount"), 1.5); - if (cfgOpenFullEventQA) { - histos.fill(HIST("QA/hist_globalTracks_centT0C_before"), cent, tracks.size()); - histos.fill(HIST("QA/hist_PVTracks_centT0C_before"), cent, collision.multNTracksPV()); - histos.fill(HIST("QA/hist_globalTracks_PVTracks_before"), collision.multNTracksPV(), tracks.size()); - histos.fill(HIST("QA/hist_globalTracks_multT0A_before"), collision.multFT0A(), tracks.size()); - histos.fill(HIST("QA/hist_globalTracks_multV0A_before"), collision.multFV0A(), tracks.size()); - histos.fill(HIST("QA/hist_multV0A_multT0A_before"), collision.multFT0A(), collision.multFV0A()); - histos.fill(HIST("QA/hist_multT0C_centT0C_before"), cent, collision.multFT0C()); - } - if (cfgUseAdditionalEventCut && !selEvent(collision, tracks.size(), cent)) { + ese_parameters::eseCandidates.clear(); + const float centrality{collision.centFT0C()}; + const int64_t multTrk{tracks.size()}; + if (cfgOpenFullEventQA) + fillEventQAhistBe(collision, multTrk, centrality); + if (!eventSelBasic(collision, multTrk, centrality, true)) return; + if (cfgOpenFullEventQA) + fillEventQAhistAf(collision, multTrk, centrality); + float q2Tarx{0.}; + float q2Tary{0.}; + float q2Refx{0.}; + float q2Refy{0.}; + int multiTar{0}; + int multiRef{0}; + fillESECandidates(collision, tracks, q2Tarx, q2Tary, multiTar, q2Refx, q2Refy, multiRef); + float q2Tar{calculateq2(q2Tarx, q2Tary, multiTar)}; + float q2Ref{calculateq2(q2Refx, q2Refy, multiRef)}; + if (cfgOpenESEQA) { + ese_parameters::hESEQATar1D[0]->Fill(multiTar); + ese_parameters::hESEQATar1D[1]->Fill(q2Tar); + ese_parameters::hESEQATar2D->Fill(q2Tar, centrality); + ese_parameters::hESEQARef1D[0]->Fill(multiRef); + ese_parameters::hESEQARef1D[1]->Fill(q2Ref); + ese_parameters::hESEQARef2D->Fill(q2Ref, centrality); } - histos.fill(HIST("QA/histEventCount"), 2.5); - histos.fill(HIST("QA/histCentrality"), cent); - histos.fill(HIST("QA/histVertexZRec"), collision.posZ()); - if (cfgOpenFullEventQA) { - histos.fill(HIST("QA/hist_globalTracks_centT0C_after"), cent, tracks.size()); - histos.fill(HIST("QA/hist_PVTracks_centT0C_after"), cent, collision.multNTracksPV()); - histos.fill(HIST("QA/hist_globalTracks_PVTracks_after"), collision.multNTracksPV(), tracks.size()); - histos.fill(HIST("QA/hist_globalTracks_multT0A_after"), collision.multFT0A(), tracks.size()); - histos.fill(HIST("QA/hist_globalTracks_multV0A_after"), collision.multFV0A(), tracks.size()); - histos.fill(HIST("QA/hist_multV0A_multT0A_after"), collision.multFT0A(), collision.multFV0A()); - histos.fill(HIST("QA/hist_multT0C_centT0C_after"), cent, collision.multFT0C()); - } - auto tracksPr = protonTrackSet->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - auto tracksHe3 = he3TrackSet->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - int multiPr = tracksPr.size(); - int multiHe3 = tracksHe3.size(); - // LOGF(info, Form("Collison ID + 1; Proton Num:%d; He3 Num:%d;\n", multiPr, multiHe3)); - histos.fill(HIST("QA/histProtonNum"), multiPr); - histos.fill(HIST("QA/histHe3Num"), multiHe3); - if (multiPr < 1 && multiHe3 < 1) - return; // Reject Collisions without enough POI - for (auto i = 0; i < static_cast(cfgnMods->size()); i++) { - int detIndGlobal = detId * 4 + cfgnTotalSystem * 4 * (cfgnMods->at(i) - 2); - float psiNGlobal = helperEP.GetEventPlane(collision.qvecRe()[detIndGlobal + 3], collision.qvecIm()[detIndGlobal + 3], cfgnMods->at(i)); - if (cfgnMods->at(i) == fourier_mode::kMode2) { - // LOGF(info, "Process q2\n"); - float q2Proton = calculateq2(tracksPr, psiNGlobal, cent, 1); - float q2He3 = calculateq2(tracksHe3, psiNGlobal, cent, 2); - histos.fill(HIST("q2/hist_q2_Pr"), q2Proton); - histos.fill(HIST("q2/hist_q2_He3"), q2He3); - histos.fill(HIST("q2/hist_q2_Cen_Pr"), q2Proton, cent); - histos.fill(HIST("q2/hist_q2_Cen_He3"), q2He3, cent); - if (cfgOpenESE && multiPr > 0 && multiHe3 > 0) { - // LOGF(info, "Process ESE\n"); - if (cfgOpenESEProton) { - processESE(tracksPr, psiNGlobal, q2Proton, cent, 1, cfgOpenESEChargeSeperation); - } - if (cfgOpenESEHe3) { - processESE(tracksHe3, psiNGlobal, q2He3, cent, 2, cfgOpenESEChargeSeperation); - } - } - // LOGF(info, "Process for this event over\n"); + if (multiTar == 0) + return; + for (const auto& c : ese_parameters::eseCandidates) { + eseTable(c.vtz, c.centFT0C, c.psi2FT0C, q2Tar, q2Ref, c.signTar, c.tpcInnerParamTar, c.tpcSignalTar, c.ptTar, c.etaTar, c.phiTar, c.dcaXYTar, c.dcaZTar, c.tpcNclsTar, c.itsNclsTar, c.tpcChi2NDFTar, c.itsChi2NDFTar, c.tpcNSigmaTar, c.tofNSigmaTar, c.itsNSigmaTar, c.itsClusSizeTar); + if (cfgOpenESE) { + ese_parameters::hESETar->Fill(c.ptTar, c.centFT0C, q2Ref, std::cos(2 * (c.phiTar - c.psi2FT0C)), c.signTar); } - fillHistosQvec(collision, cfgnMods->at(i)); } } }; @@ -977,7 +1054,6 @@ struct FlowEsePHe3 { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc), adaptAnalysisTask(cfgc), }; } From a8fa1f2062f96842105ee6626fbfe1af0b6f665c Mon Sep 17 00:00:00 2001 From: skundu692 <86804743+skundu692@users.noreply.github.com> Date: Tue, 10 Jun 2025 15:00:25 +0200 Subject: [PATCH 1569/1650] [PWGLF] Add new process function to run over strangeness dervide data (#11531) --- .../Tasks/Strangeness/taskLambdaSpinCorr.cxx | 363 ++++++++++++++++++ 1 file changed, 363 insertions(+) diff --git a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx index 0472e380aed..00a2d9707f5 100644 --- a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx +++ b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx @@ -50,6 +50,9 @@ using namespace o2::framework::expressions; using std::array; using namespace o2::aod::rctsel; +using dauTracks = soa::Join; +using v0Candidates = soa::Join; + struct LfTaskLambdaSpinCorr { Service ccdb; @@ -375,6 +378,32 @@ struct LfTaskLambdaSpinCorr { return {lambdaTag, aLambdaTag, true}; // Valid candidate } + std::tuple getLambdaTagsDD(const auto& v0, const auto& collision) + { + auto postrack = v0.template posTrackExtra_as(); + auto negtrack = v0.template negTrackExtra_as(); + + int lambdaTag = 0; + int aLambdaTag = 0; + + if (isSelectedV0Daughter(v0, postrack, 0) && isSelectedV0Daughter(v0, negtrack, 1)) { + lambdaTag = 1; + } + if (isSelectedV0Daughter(v0, negtrack, 0) && isSelectedV0Daughter(v0, postrack, 1)) { + aLambdaTag = 1; + } + + if (!lambdaTag && !aLambdaTag) { + return {0, 0, false}; // No valid tags + } + + if (!selectionV0(collision, v0)) { + return {0, 0, false}; // Fails selection + } + + return {lambdaTag, aLambdaTag, true}; // Valid candidate + } + std::tuple getLambdaTagsMC(const auto& v0, const auto& collision) { auto postrack = v0.template posTrack_as(); @@ -766,6 +795,340 @@ struct LfTaskLambdaSpinCorr { } PROCESS_SWITCH(LfTaskLambdaSpinCorr, processME, "Process data ME", true); + void processDerivedData(soa::Join::iterator const& collision, v0Candidates const& V0s, dauTracks const&) + { + histos.fill(HIST("hEvtSelInfo"), 0.5); + if (rctCut.requireRCTFlagChecker && !rctChecker(collision)) { + return; + } + histos.fill(HIST("hEvtSelInfo"), 1.5); + if (!collision.sel8()) { + return; + } + histos.fill(HIST("hEvtSelInfo"), 2.5); + auto centrality = collision.centFT0C(); + int occupancy = collision.trackOccupancyInTimeRange(); + if (additionalEvSel && (!collision.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { + return; + } + histos.fill(HIST("hEvtSelInfo"), 3.5); + if (additionalEvSel3 && (!collision.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision.selection_bit(aod::evsel::kNoITSROFrameBorder))) { + return; + } + histos.fill(HIST("hEvtSelInfo"), 4.5); + if (additionalEvSel4 && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + return; + } + histos.fill(HIST("hEvtSelInfo"), 5.5); + if (additionalEvSel5 && !collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + return; + } + histos.fill(HIST("hEvtSelInfo"), 6.5); + if (occupancy > cfgCutOccupancy) { + return; + } + histos.fill(HIST("hEvtSelInfo"), 7.5); + histos.fill(HIST("hCentrality"), centrality); + + for (const auto& v0 : V0s) { + auto [lambdaTag, aLambdaTag, isValid] = getLambdaTagsDD(v0, collision); + if (!isValid) { + continue; + } + + if (lambdaTag && aLambdaTag) { + continue; + } + + if (lambdaTag) { + proton = ROOT::Math::PxPyPzMVector(v0.pxpos(), v0.pypos(), v0.pzpos(), o2::constants::physics::MassProton); + antiPion = ROOT::Math::PxPyPzMVector(v0.pxneg(), v0.pyneg(), v0.pzneg(), o2::constants::physics::MassPionCharged); + lambda = proton + antiPion; + } + if (aLambdaTag) { + antiProton = ROOT::Math::PxPyPzMVector(v0.pxneg(), v0.pyneg(), v0.pzneg(), o2::constants::physics::MassProton); + pion = ROOT::Math::PxPyPzMVector(v0.pxpos(), v0.pypos(), v0.pzpos(), o2::constants::physics::MassPionCharged); + antiLambda = antiProton + pion; + } + + if (lambdaTag && (lambda.M() < lbinIM || lambda.M() > hbinIM)) { + continue; + } + if (aLambdaTag && (antiLambda.M() < lbinIM || antiLambda.M() > hbinIM)) { + continue; + } + + // auto postrack1 = v0.template posTrackExtra_as(); + // auto negtrack1 = v0.template negTrackExtra_as(); + + // 2nd loop for combination of lambda lambda + for (const auto& v02 : V0s) { + if (v02.index() <= v0.index()) { + continue; + } + auto [lambdaTag2, aLambdaTag2, isValid2] = getLambdaTagsDD(v02, collision); + if (!isValid2) { + continue; + } + if (lambdaTag2 && aLambdaTag2) { + continue; + } + if (lambdaTag2) { + proton2 = ROOT::Math::PxPyPzMVector(v02.pxpos(), v02.pypos(), v02.pzpos(), o2::constants::physics::MassProton); + antiPion2 = ROOT::Math::PxPyPzMVector(v02.pxneg(), v02.pyneg(), v02.pzneg(), o2::constants::physics::MassPionCharged); + lambda2 = proton2 + antiPion2; + } + if (aLambdaTag2) { + antiProton2 = ROOT::Math::PxPyPzMVector(v02.pxneg(), v02.pyneg(), v02.pzneg(), o2::constants::physics::MassProton); + pion2 = ROOT::Math::PxPyPzMVector(v02.pxpos(), v02.pypos(), v02.pzpos(), o2::constants::physics::MassPionCharged); + antiLambda2 = antiProton2 + pion2; + } + + if (lambdaTag2 && (lambda2.M() < lbinIM || lambda2.M() > hbinIM)) { + continue; + } + if (aLambdaTag2 && (antiLambda2.M() < lbinIM || antiLambda2.M() > hbinIM)) { + continue; + } + + // auto postrack2 = v02.template posTrackExtra_as(); + // auto negtrack2 = v02.template negTrackExtra_as(); + if (v0.posTrackExtraId() == v02.posTrackExtraId() || v0.negTrackExtraId() == v02.negTrackExtraId()) { + continue; + } + + if (lambdaTag && lambdaTag2) { + fillHistograms(1, 0, 1, 0, lambda, lambda2, proton, proton2, centrality, 0); + } + if (aLambdaTag && aLambdaTag2) { + fillHistograms(0, 1, 0, 1, antiLambda, antiLambda2, antiProton, antiProton2, centrality, 0); + } + if (lambdaTag && aLambdaTag2) { + fillHistograms(1, 0, 0, 1, lambda, antiLambda2, proton, antiProton2, centrality, 0); + } + if (aLambdaTag && lambdaTag2) { + fillHistograms(0, 1, 1, 0, antiLambda, lambda2, antiProton, proton2, centrality, 0); + } + } + } + } + PROCESS_SWITCH(LfTaskLambdaSpinCorr, processDerivedData, "Process derived data", true); + + Preslice tracksPerCollisionV0Mixed = o2::aod::v0data::straCollisionId; // for derived data only + void processDerivedDataMixed(soa::Join const& collisions, v0Candidates const& V0s, dauTracks const&) + + { + + for (auto& [collision1, collision2] : selfCombinations(colBinning, nMix, -1, collisions, collisions)) { + // LOGF(info, "Mixed event collisions: (%d, %d)", collision1.index(), collision2.index()); + if (rctCut.requireRCTFlagChecker && !rctChecker(collision1)) { + continue; + } + if (rctCut.requireRCTFlagChecker && !rctChecker(collision2)) { + continue; + } + int occupancy1 = collision1.trackOccupancyInTimeRange(); + int occupancy2 = collision2.trackOccupancyInTimeRange(); + + if (collision1.index() == collision2.index()) { + continue; + } + if (!collision1.sel8() || !collision2.sel8()) { + continue; + } + if (additionalEvSel && (!collision1.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision1.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { + continue; + } + if (occupancy1 > cfgCutOccupancy) { + continue; + } + if (additionalEvSel && (!collision2.selection_bit(aod::evsel::kNoSameBunchPileup) || !collision2.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV))) { + continue; + } + if (occupancy2 > cfgCutOccupancy) { + continue; + } + if (additionalEvSel3 && (!collision1.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision1.selection_bit(aod::evsel::kNoITSROFrameBorder))) { + continue; + } + if (additionalEvSel4 && !collision1.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + continue; + } + if (mixingEvSel && additionalEvSel5 && !collision1.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + continue; + } + + if (additionalEvSel3 && (!collision2.selection_bit(aod::evsel::kNoTimeFrameBorder) || !collision2.selection_bit(aod::evsel::kNoITSROFrameBorder))) { + continue; + } + if (additionalEvSel4 && !collision2.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + continue; + } + if (mixingEvSel && additionalEvSel5 && !collision2.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + continue; + } + auto centrality = collision1.centFT0C(); + auto groupV01 = V0s.sliceBy(tracksPerCollisionV0Mixed, collision1.globalIndex()); + auto groupV02 = V0s.sliceBy(tracksPerCollisionV0Mixed, collision1.globalIndex()); + auto groupV03 = V0s.sliceBy(tracksPerCollisionV0Mixed, collision2.globalIndex()); + + size_t rows = groupV03.size() + 20; + size_t cols = groupV01.size() + 20; + std::vector> pairStatus(rows, std::vector(cols, false)); + histos.fill(HIST("hv0Mult"), groupV01.size()); + for (auto& [t1, t2] : soa::combinations(o2::soa::CombinationsFullIndexPolicy(groupV01, groupV02))) { + bool pairfound = false; + if (t2.index() <= t1.index()) { + continue; + } + if (t1.straCollisionId() != t2.straCollisionId()) { + continue; + } + + auto [lambdaTag1, aLambdaTag1, isValid1] = getLambdaTagsDD(t1, collision1); + auto [lambdaTag2, aLambdaTag2, isValid2] = getLambdaTagsDD(t2, collision1); + if (!isValid1) { + continue; + } + if (!isValid2) { + continue; + } + if (lambdaTag1 && aLambdaTag1) { + continue; + } + if (lambdaTag2 && aLambdaTag2) { + continue; + } + // auto postrack1 = t1.template posTrackExtra_as(); + // auto negtrack1 = t1.template negTrackExtra_as(); + // auto postrack2 = t2.template posTrackExtra_as(); + // auto negtrack2 = t2.template negTrackExtra_as(); + if (t1.posTrackExtraId() == t2.posTrackExtraId() || t1.negTrackExtraId() == t2.negTrackExtraId()) { + continue; + } + // auto samePairSumPt = t1.pt() + t2.pt(); + // auto samePairR = TMath::Sqrt(TMath::Power(t1.phi() - t2.phi(), 2.0) + TMath::Power(t1.eta() - t2.eta(), 2.0)); + + double deltaPhiSame = RecoDecay::constrainAngle(t1.phi() - t2.phi(), 0.0); + auto samePairR = TMath::Sqrt(TMath::Power(deltaPhiSame, 2.0) + TMath::Power(t1.eta() - t2.eta(), 2.0)); + + if (lambdaTag1) { + proton0 = ROOT::Math::PxPyPzMVector(t1.pxpos(), t1.pypos(), t1.pzpos(), o2::constants::physics::MassProton); + antiPion0 = ROOT::Math::PxPyPzMVector(t1.pxneg(), t1.pyneg(), t1.pzneg(), o2::constants::physics::MassPionCharged); + lambda0 = proton0 + antiPion0; + } + if (aLambdaTag1) { + antiProton0 = ROOT::Math::PxPyPzMVector(t1.pxneg(), t1.pyneg(), t1.pzneg(), o2::constants::physics::MassProton); + pion0 = ROOT::Math::PxPyPzMVector(t1.pxpos(), t1.pypos(), t1.pzpos(), o2::constants::physics::MassPionCharged); + antiLambda0 = antiProton0 + pion0; + } + if (lambdaTag1 && (lambda0.M() < lbinIM || lambda0.M() > hbinIM)) { + continue; + } + if (aLambdaTag1 && (antiLambda0.M() < lbinIM || antiLambda0.M() > hbinIM)) { + continue; + } + if (lambdaTag2) { + proton = ROOT::Math::PxPyPzMVector(t2.pxpos(), t2.pypos(), t2.pzpos(), o2::constants::physics::MassProton); + antiPion = ROOT::Math::PxPyPzMVector(t2.pxneg(), t2.pyneg(), t2.pzneg(), o2::constants::physics::MassPionCharged); + lambda = proton + antiPion; + } + if (aLambdaTag2) { + antiProton = ROOT::Math::PxPyPzMVector(t2.pxneg(), t2.pyneg(), t2.pzneg(), o2::constants::physics::MassProton); + pion = ROOT::Math::PxPyPzMVector(t2.pxpos(), t2.pypos(), t2.pzpos(), o2::constants::physics::MassPionCharged); + antiLambda = antiProton + pion; + } + if (lambdaTag2 && (lambda.M() < lbinIM || lambda.M() > hbinIM)) { + continue; + } + if (aLambdaTag2 && (antiLambda.M() < lbinIM || antiLambda.M() > hbinIM)) { + continue; + } + + for (const auto& t3 : groupV03) { + if (pairStatus[t3.index()][t2.index()]) { + continue; + } + if (t1.straCollisionId() == t3.straCollisionId()) { + continue; + } + auto [lambdaTag3, aLambdaTag3, isValid3] = getLambdaTagsDD(t3, collision2); + if (!isValid3) { + continue; + } + if (lambdaTag3 && aLambdaTag3) { + continue; + } + if (lambdaTag1 != lambdaTag3 || aLambdaTag1 != aLambdaTag3) { + continue; + } + + if (lambdaTag3) { + proton2 = ROOT::Math::PxPyPzMVector(t3.pxpos(), t3.pypos(), t3.pzpos(), o2::constants::physics::MassProton); + antiPion2 = ROOT::Math::PxPyPzMVector(t3.pxneg(), t3.pyneg(), t3.pzneg(), o2::constants::physics::MassPionCharged); + lambda2 = proton2 + antiPion2; + } + if (aLambdaTag3) { + antiProton2 = ROOT::Math::PxPyPzMVector(t3.pxneg(), t3.pyneg(), t3.pzneg(), o2::constants::physics::MassProton); + pion2 = ROOT::Math::PxPyPzMVector(t3.pxpos(), t3.pypos(), t3.pzpos(), o2::constants::physics::MassPionCharged); + antiLambda2 = antiProton2 + pion2; + } + if (lambdaTag3 && (lambda2.M() < lbinIM || lambda2.M() > hbinIM)) { + continue; + } + + if (aLambdaTag3 && (antiLambda2.M() < lbinIM || antiLambda2.M() > hbinIM)) { + continue; + } + + double deltaPhiMix = RecoDecay::constrainAngle(t3.phi() - t2.phi(), 0.0); + auto mixPairR = TMath::Sqrt(TMath::Power(deltaPhiMix, 2.0) + TMath::Power(t3.eta() - t2.eta(), 2.0)); + + auto etaDiff = t1.eta() - t3.eta(); + auto phiDiff = RecoDecay::constrainAngle(t1.phi() - t3.phi(), 0.0); + + histos.fill(HIST("hPtDiff"), t1.pt() - t3.pt()); + histos.fill(HIST("hPhiDiff"), phiDiff); + histos.fill(HIST("hRDiff"), etaDiff); + + if (mixingCombination == 0 && std::abs(t1.pt() - t3.pt()) > ptMix) { + continue; + } + if (mixingCombination == 0 && t1.eta() * t3.eta() > 0 && std::abs(etaDiff) > etaMix) { + continue; + } + if (mixingCombination == 0 && phiDiff > phiMix) { + continue; + } + if (mixingCombination == 1 && std::abs(t1.pt() - t3.pt()) > ptMix) { + continue; + } + if (mixingCombination == 1 && std::abs(mixPairR - samePairR) > etaMix) { + continue; + } + if (lambdaTag2 && lambdaTag3) { + fillHistograms(1, 0, 1, 0, lambda, lambda2, proton, proton2, centrality, 2); + } else if (aLambdaTag2 && aLambdaTag3) { + fillHistograms(0, 1, 0, 1, antiLambda, antiLambda2, antiProton, antiProton2, centrality, 2); + } else if (lambdaTag2 && aLambdaTag3) { + fillHistograms(1, 0, 0, 1, lambda, antiLambda2, proton, antiProton2, centrality, 2); + } else if (aLambdaTag2 && lambdaTag3) { + fillHistograms(0, 1, 1, 0, antiLambda, lambda2, antiProton, proton2, centrality, 2); + } else { + continue; + } + pairfound = true; + pairStatus[t3.index()][t2.index()] = true; + if (pairfound) { + break; + } + } + } + } + } + + PROCESS_SWITCH(LfTaskLambdaSpinCorr, processDerivedDataMixed, "Process mixed derived data", true); + using CollisionMCRecTableCentFT0C = soa::Join; using TrackMCRecTable = soa::Join; using V0TrackCandidatesMC = soa::Join; From e4f236157e60e559733aeb6cb2648d650961db5c Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Tue, 10 Jun 2025 16:03:15 +0200 Subject: [PATCH 1570/1650] [PWGEM/Dilepton] update in DimuonCut (#11536) --- PWGEM/Dilepton/Core/Dilepton.h | 3 ++- PWGEM/Dilepton/Core/DileptonMC.h | 3 ++- PWGEM/Dilepton/Core/DimuonCut.cxx | 9 ++++++--- PWGEM/Dilepton/Core/DimuonCut.h | 5 +++-- PWGEM/Dilepton/Core/SingleTrackQC.h | 3 ++- PWGEM/Dilepton/Core/SingleTrackQCMC.h | 3 ++- 6 files changed, 17 insertions(+), 9 deletions(-) diff --git a/PWGEM/Dilepton/Core/Dilepton.h b/PWGEM/Dilepton/Core/Dilepton.h index 46cecc81c87..33f0ba99718 100644 --- a/PWGEM/Dilepton/Core/Dilepton.h +++ b/PWGEM/Dilepton/Core/Dilepton.h @@ -284,6 +284,7 @@ struct Dilepton { Configurable cfg_max_relDPt_wrt_matchedMCHMID{"cfg_max_relDPt_wrt_matchedMCHMID", 1e+10f, "max. relative dpt between MFT-MCH-MID and MCH-MID"}; Configurable cfg_max_DEta_wrt_matchedMCHMID{"cfg_max_DEta_wrt_matchedMCHMID", 1e+10f, "max. deta between MFT-MCH-MID and MCH-MID"}; Configurable cfg_max_DPhi_wrt_matchedMCHMID{"cfg_max_DPhi_wrt_matchedMCHMID", 1e+10f, "max. dphi between MFT-MCH-MID and MCH-MID"}; + Configurable requireMFTHitMap{"requireMFTHitMap", false, "flag to apply MFT hit map"}; Configurable> requiredMFTDisks{"requiredMFTDisks", std::vector{0}, "hit map on MFT disks [0,1,2,3,4]. logical-OR of each double-sided disk"}; } dimuoncuts; @@ -754,7 +755,7 @@ struct Dilepton { fDimuonCut.SetRabs(dimuoncuts.cfg_min_rabs, dimuoncuts.cfg_max_rabs); fDimuonCut.SetMaxPDCARabsDep([&](float rabs) { return (rabs < 26.5 ? 594.f : 324.f); }); fDimuonCut.SetMaxdPtdEtadPhiwrtMCHMID(dimuoncuts.cfg_max_relDPt_wrt_matchedMCHMID, dimuoncuts.cfg_max_DEta_wrt_matchedMCHMID, dimuoncuts.cfg_max_DPhi_wrt_matchedMCHMID); // this is relevant for global muons - fDimuonCut.SetMFTHitMap(dimuoncuts.requiredMFTDisks); + fDimuonCut.SetMFTHitMap(dimuoncuts.requireMFTHitMap, dimuoncuts.requiredMFTDisks); } template diff --git a/PWGEM/Dilepton/Core/DileptonMC.h b/PWGEM/Dilepton/Core/DileptonMC.h index 00cec907de5..25ebe949553 100644 --- a/PWGEM/Dilepton/Core/DileptonMC.h +++ b/PWGEM/Dilepton/Core/DileptonMC.h @@ -276,6 +276,7 @@ struct DileptonMC { Configurable cfg_max_relDPt_wrt_matchedMCHMID{"cfg_max_relDPt_wrt_matchedMCHMID", 1e+10f, "max. relative dpt between MFT-MCH-MID and MCH-MID"}; Configurable cfg_max_DEta_wrt_matchedMCHMID{"cfg_max_DEta_wrt_matchedMCHMID", 1e+10f, "max. deta between MFT-MCH-MID and MCH-MID"}; Configurable cfg_max_DPhi_wrt_matchedMCHMID{"cfg_max_DPhi_wrt_matchedMCHMID", 1e+10f, "max. dphi between MFT-MCH-MID and MCH-MID"}; + Configurable requireMFTHitMap{"requireMFTHitMap", false, "flag to apply MFT hit map"}; Configurable> requiredMFTDisks{"requiredMFTDisks", std::vector{0}, "hit map on MFT disks [0,1,2,3,4]. logical-OR of each double-sided disk"}; } dimuoncuts; @@ -720,7 +721,7 @@ struct DileptonMC { fDimuonCut.SetRabs(dimuoncuts.cfg_min_rabs, dimuoncuts.cfg_max_rabs); fDimuonCut.SetMaxPDCARabsDep([&](float rabs) { return (rabs < 26.5 ? 594.f : 324.f); }); fDimuonCut.SetMaxdPtdEtadPhiwrtMCHMID(dimuoncuts.cfg_max_relDPt_wrt_matchedMCHMID, dimuoncuts.cfg_max_DEta_wrt_matchedMCHMID, dimuoncuts.cfg_max_DPhi_wrt_matchedMCHMID); // this is relevant for global muons - fDimuonCut.SetMFTHitMap(dimuoncuts.requiredMFTDisks); + fDimuonCut.SetMFTHitMap(dimuoncuts.requireMFTHitMap, dimuoncuts.requiredMFTDisks); } template diff --git a/PWGEM/Dilepton/Core/DimuonCut.cxx b/PWGEM/Dilepton/Core/DimuonCut.cxx index 5ee3bf3d3bd..96f00f8b7a5 100644 --- a/PWGEM/Dilepton/Core/DimuonCut.cxx +++ b/PWGEM/Dilepton/Core/DimuonCut.cxx @@ -119,11 +119,14 @@ void DimuonCut::SetMaxPDCARabsDep(std::function RabsDepCut) mMaxPDCARabsDep = RabsDepCut; LOG(info) << "Dimuon Cut, set max pDCA as a function of Rabs: " << mMaxPDCARabsDep(10.0); } -void DimuonCut::SetMFTHitMap(std::vector hitMap) +void DimuonCut::SetMFTHitMap(bool flag, std::vector hitMap) { + mApplyMFTHitMap = flag; mRequiredMFTDisks = hitMap; - for (const auto& iDisk : mRequiredMFTDisks) { - LOG(info) << "Dimuon Cut, require MFT hit on Disk: " << iDisk; + if (mApplyMFTHitMap) { + for (const auto& iDisk : mRequiredMFTDisks) { + LOG(info) << "Dimuon Cut, require MFT hit on Disk: " << iDisk; + } } } void DimuonCut::SetMaxdPtdEtadPhiwrtMCHMID(float reldPtMax, float dEtaMax, float dPhiMax) diff --git a/PWGEM/Dilepton/Core/DimuonCut.h b/PWGEM/Dilepton/Core/DimuonCut.h index 34d8364f65b..b96afcd7c28 100644 --- a/PWGEM/Dilepton/Core/DimuonCut.h +++ b/PWGEM/Dilepton/Core/DimuonCut.h @@ -156,7 +156,7 @@ class DimuonCut : public TNamed if (!IsSelectedTrack(track, DimuonCuts::kRabs)) { return false; } - if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) && !IsSelectedTrack(track, DimuonCuts::kMFTHitMap)) { + if (mApplyMFTHitMap && track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) && !IsSelectedTrack(track, DimuonCuts::kMFTHitMap)) { return false; } if (track.trackType() == static_cast(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack) && !IsSelectedTrack(track, DimuonCuts::kDPtDEtaDPhiwrtMCHMID)) { @@ -243,7 +243,7 @@ class DimuonCut : public TNamed void SetDCAxy(float min, float max); // in cm void SetRabs(float min, float max); // in cm void SetMaxPDCARabsDep(std::function RabsDepCut); - void SetMFTHitMap(std::vector hitMap); + void SetMFTHitMap(bool flag, std::vector hitMap); void SetMaxdPtdEtadPhiwrtMCHMID(float reldPtMax, float dEtaMax, float dPhiMax); // this is relevant for global muons private: @@ -273,6 +273,7 @@ class DimuonCut : public TNamed float mMinRabs{17.6}, mMaxRabs{89.5}; float mMinDcaXY{0.0f}, mMaxDcaXY{1e10f}; float mMaxReldPtwrtMCHMID{1e10f}, mMaxdEtawrtMCHMID{1e10f}, mMaxdPhiwrtMCHMID{1e10f}; + bool mApplyMFTHitMap{false}; std::vector mRequiredMFTDisks{}; ClassDef(DimuonCut, 1); diff --git a/PWGEM/Dilepton/Core/SingleTrackQC.h b/PWGEM/Dilepton/Core/SingleTrackQC.h index 2fc94a8a91c..561e8a2adee 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQC.h @@ -204,6 +204,7 @@ struct SingleTrackQC { Configurable cfg_max_relDPt_wrt_matchedMCHMID{"cfg_max_relDPt_wrt_matchedMCHMID", 1e+10f, "max. relative dpt between MFT-MCH-MID and MCH-MID"}; Configurable cfg_max_DEta_wrt_matchedMCHMID{"cfg_max_DEta_wrt_matchedMCHMID", 1e+10f, "max. deta between MFT-MCH-MID and MCH-MID"}; Configurable cfg_max_DPhi_wrt_matchedMCHMID{"cfg_max_DPhi_wrt_matchedMCHMID", 1e+10f, "max. dphi between MFT-MCH-MID and MCH-MID"}; + Configurable requireMFTHitMap{"requireMFTHitMap", false, "flag to apply MFT hit map"}; Configurable> requiredMFTDisks{"requiredMFTDisks", std::vector{0}, "hit map on MFT disks [0,1,2,3,4]. logical-OR of each double-sided disk"}; } dimuoncuts; @@ -458,7 +459,7 @@ struct SingleTrackQC { fDimuonCut.SetRabs(dimuoncuts.cfg_min_rabs, dimuoncuts.cfg_max_rabs); fDimuonCut.SetMaxPDCARabsDep([&](float rabs) { return (rabs < 26.5 ? 594.f : 324.f); }); fDimuonCut.SetMaxdPtdEtadPhiwrtMCHMID(dimuoncuts.cfg_max_relDPt_wrt_matchedMCHMID, dimuoncuts.cfg_max_DEta_wrt_matchedMCHMID, dimuoncuts.cfg_max_DPhi_wrt_matchedMCHMID); // this is relevant for global muons - fDimuonCut.SetMFTHitMap(dimuoncuts.requiredMFTDisks); + fDimuonCut.SetMFTHitMap(dimuoncuts.requireMFTHitMap, dimuoncuts.requiredMFTDisks); } template diff --git a/PWGEM/Dilepton/Core/SingleTrackQCMC.h b/PWGEM/Dilepton/Core/SingleTrackQCMC.h index 481bb2e9e5e..5fb15b4ec26 100644 --- a/PWGEM/Dilepton/Core/SingleTrackQCMC.h +++ b/PWGEM/Dilepton/Core/SingleTrackQCMC.h @@ -210,6 +210,7 @@ struct SingleTrackQCMC { Configurable cfg_max_relDPt_wrt_matchedMCHMID{"cfg_max_relDPt_wrt_matchedMCHMID", 1e+10f, "max. relative dpt between MFT-MCH-MID and MCH-MID"}; Configurable cfg_max_DEta_wrt_matchedMCHMID{"cfg_max_DEta_wrt_matchedMCHMID", 1e+10f, "max. deta between MFT-MCH-MID and MCH-MID"}; Configurable cfg_max_DPhi_wrt_matchedMCHMID{"cfg_max_DPhi_wrt_matchedMCHMID", 1e+10f, "max. dphi between MFT-MCH-MID and MCH-MID"}; + Configurable requireMFTHitMap{"requireMFTHitMap", false, "flag to apply MFT hit map"}; Configurable> requiredMFTDisks{"requiredMFTDisks", std::vector{0}, "hit map on MFT disks [0,1,2,3,4]. logical-OR of each double-sided disk"}; } dimuoncuts; @@ -517,7 +518,7 @@ struct SingleTrackQCMC { fDimuonCut.SetRabs(dimuoncuts.cfg_min_rabs, dimuoncuts.cfg_max_rabs); fDimuonCut.SetMaxPDCARabsDep([&](float rabs) { return (rabs < 26.5 ? 594.f : 324.f); }); fDimuonCut.SetMaxdPtdEtadPhiwrtMCHMID(dimuoncuts.cfg_max_relDPt_wrt_matchedMCHMID, dimuoncuts.cfg_max_DEta_wrt_matchedMCHMID, dimuoncuts.cfg_max_DPhi_wrt_matchedMCHMID); // this is relevant for global muons - fDimuonCut.SetMFTHitMap(dimuoncuts.requiredMFTDisks); + fDimuonCut.SetMFTHitMap(dimuoncuts.requireMFTHitMap, dimuoncuts.requiredMFTDisks); } template From 5d734484732f8730a6f987503e32ea95391cd0ea Mon Sep 17 00:00:00 2001 From: Rrantu <156880782+Rrantu@users.noreply.github.com> Date: Wed, 11 Jun 2025 07:48:54 +0800 Subject: [PATCH 1571/1650] [PWGHF] Add Xic0 flow task and fix previous O2 linter issues (#11533) --- PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx | 158 +++++++++++++++++------ 1 file changed, 117 insertions(+), 41 deletions(-) diff --git a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx index 862b4910c72..03e475bc7ed 100644 --- a/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx +++ b/PWGHF/D2H/Tasks/taskFlowCharmHadrons.cxx @@ -14,6 +14,7 @@ /// /// \author S. Politanò, INFN Torino, Italy /// \author Wu Chuntai, CUG, China +/// \author Ran Tu, Fudan University, China #include #include @@ -48,7 +49,8 @@ enum DecayChannel { DplusToPiKPi = 0, LcToPKPi, LcToPiKP, XicToPKPi, - XicToPiKP + XicToPiKP, + Xic0ToXiPi }; enum QvecEstimator { FV0A = 0, @@ -75,25 +77,11 @@ struct HfTaskFlowCharmHadrons { Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Configurable> classMl{"classMl", {0, 2}, "Indexes of BDT scores to be stored. Two indexes max."}; - ConfigurableAxis thnConfigAxisInvMass{"thnConfigAxisInvMass", {100, 1.78, 2.05}, ""}; - ConfigurableAxis thnConfigAxisPt{"thnConfigAxisPt", {10, 0., 10.}, ""}; - ConfigurableAxis thnConfigAxisCent{"thnConfigAxisCent", {10000, 0., 100.}, ""}; - ConfigurableAxis thnConfigAxisCosNPhi{"thnConfigAxisCosNPhi", {100, -1., 1.}, ""}; - ConfigurableAxis thnConfigAxisPsi{"thnConfigAxisPsi", {6000, 2. * TMath::Pi(), 2. * TMath::Pi()}, ""}; - ConfigurableAxis thnConfigAxisCosDeltaPhi{"thnConfigAxisCosDeltaPhi", {100, -1., 1.}, ""}; - ConfigurableAxis thnConfigAxisScalarProd{"thnConfigAxisScalarProd", {100, 0., 1.}, ""}; - ConfigurableAxis thnConfigAxisMlOne{"thnConfigAxisMlOne", {1000, 0., 1.}, ""}; - ConfigurableAxis thnConfigAxisMlTwo{"thnConfigAxisMlTwo", {1000, 0., 1.}, ""}; - ConfigurableAxis thnConfigAxisOccupancyITS{"thnConfigAxisOccupancyITS", {14, 0, 14000}, ""}; - ConfigurableAxis thnConfigAxisOccupancyFT0C{"thnConfigAxisOccupancyFT0C", {14, 0, 140000}, ""}; - ConfigurableAxis thnConfigAxisNoSameBunchPileup{"thnConfigAxisNoSameBunchPileup", {2, 0, 2}, ""}; - ConfigurableAxis thnConfigAxisOccupancy{"thnConfigAxisOccupancy", {2, 0, 2}, ""}; - ConfigurableAxis thnConfigAxisNoCollInTimeRangeNarrow{"thnConfigAxisNoCollInTimeRangeNarrow", {2, 0, 2}, ""}; - ConfigurableAxis thnConfigAxisNoCollInTimeRangeStandard{"thnConfigAxisNoCollInTimeRangeStandard", {2, 0, 2}, ""}; - ConfigurableAxis thnConfigAxisNoCollInRofStandard{"thnConfigAxisNoCollInRofStandard", {2, 0, 2}, ""}; - ConfigurableAxis thnConfigAxisResoFT0cFV0a{"thnConfigAxisResoFT0cFV0a", {160, -8, 8}, ""}; - ConfigurableAxis thnConfigAxisResoFT0cTPCtot{"thnConfigAxisResoFT0cTPCtot", {160, -8, 8}, ""}; - ConfigurableAxis thnConfigAxisResoFV0aTPCtot{"thnConfigAxisResoFV0aTPCtot", {160, -8, 8}, ""}; + HfHelper hfHelper; + EventPlaneHelper epHelper; + HfEventSelection hfEvSel; // event selection and monitoring + o2::framework::Service ccdb; + SliceCache cache; using CandDsDataWMl = soa::Filtered>; using CandDsData = soa::Filtered>; @@ -103,6 +91,8 @@ struct HfTaskFlowCharmHadrons { using CandLcDataWMl = soa::Filtered>; using CandXicData = soa::Filtered>; using CandXicDataWMl = soa::Filtered>; + using CandXic0Data = soa::Filtered>; + using CandXic0DataWMl = soa::Filtered>; using CandD0DataWMl = soa::Filtered>; using CandD0Data = soa::Filtered>; using CollsWithQvecs = soa::Join; @@ -112,6 +102,7 @@ struct HfTaskFlowCharmHadrons { Filter filterSelectD0Candidates = aod::hf_sel_candidate_d0::isSelD0 >= selectionFlag || aod::hf_sel_candidate_d0::isSelD0bar >= selectionFlag; Filter filterSelectLcCandidates = aod::hf_sel_candidate_lc::isSelLcToPKPi >= selectionFlag || aod::hf_sel_candidate_lc::isSelLcToPiKP >= selectionFlag; Filter filterSelectXicCandidates = aod::hf_sel_candidate_xic::isSelXicToPKPi >= selectionFlag || aod::hf_sel_candidate_xic::isSelXicToPiKP >= selectionFlag; + Filter filterSelectXic0Candidates = aod::hf_sel_toxipi::resultSelections >= selectionFlag; Partition selectedDsToKKPi = aod::hf_sel_candidate_ds::isSelDsToKKPi >= selectionFlag; Partition selectedDsToPiKK = aod::hf_sel_candidate_ds::isSelDsToPiKK >= selectionFlag; @@ -129,12 +120,28 @@ struct HfTaskFlowCharmHadrons { Partition selectedXicToPiKP = aod::hf_sel_candidate_xic::isSelXicToPiKP >= selectionFlag; Partition selectedXicToPKPiWMl = aod::hf_sel_candidate_xic::isSelXicToPKPi >= selectionFlag; Partition selectedXicToPiKPWMl = aod::hf_sel_candidate_xic::isSelXicToPiKP >= selectionFlag; + Partition selectedXic0 = aod::hf_sel_toxipi::resultSelections >= selectionFlag; + Partition selectedXic0WMl = aod::hf_sel_toxipi::resultSelections >= selectionFlag; - SliceCache cache; - HfHelper hfHelper; - EventPlaneHelper epHelper; - HfEventSelection hfEvSel; // event selection and monitoring - o2::framework::Service ccdb; + ConfigurableAxis thnConfigAxisInvMass{"thnConfigAxisInvMass", {100, 1.78, 2.05}, ""}; + ConfigurableAxis thnConfigAxisPt{"thnConfigAxisPt", {10, 0., 10.}, ""}; + ConfigurableAxis thnConfigAxisCent{"thnConfigAxisCent", {10000, 0., 100.}, ""}; + ConfigurableAxis thnConfigAxisCosNPhi{"thnConfigAxisCosNPhi", {100, -1., 1.}, ""}; + ConfigurableAxis thnConfigAxisPsi{"thnConfigAxisPsi", {6000, 0, constants::math::TwoPI}, ""}; + ConfigurableAxis thnConfigAxisCosDeltaPhi{"thnConfigAxisCosDeltaPhi", {100, -1., 1.}, ""}; + ConfigurableAxis thnConfigAxisScalarProd{"thnConfigAxisScalarProd", {100, 0., 1.}, ""}; + ConfigurableAxis thnConfigAxisMlOne{"thnConfigAxisMlOne", {1000, 0., 1.}, ""}; + ConfigurableAxis thnConfigAxisMlTwo{"thnConfigAxisMlTwo", {1000, 0., 1.}, ""}; + ConfigurableAxis thnConfigAxisOccupancyITS{"thnConfigAxisOccupancyITS", {14, 0, 14000}, ""}; + ConfigurableAxis thnConfigAxisOccupancyFT0C{"thnConfigAxisOccupancyFT0C", {14, 0, 140000}, ""}; + ConfigurableAxis thnConfigAxisNoSameBunchPileup{"thnConfigAxisNoSameBunchPileup", {2, 0, 2}, ""}; + ConfigurableAxis thnConfigAxisOccupancy{"thnConfigAxisOccupancy", {2, 0, 2}, ""}; + ConfigurableAxis thnConfigAxisNoCollInTimeRangeNarrow{"thnConfigAxisNoCollInTimeRangeNarrow", {2, 0, 2}, ""}; + ConfigurableAxis thnConfigAxisNoCollInTimeRangeStandard{"thnConfigAxisNoCollInTimeRangeStandard", {2, 0, 2}, ""}; + ConfigurableAxis thnConfigAxisNoCollInRofStandard{"thnConfigAxisNoCollInRofStandard", {2, 0, 2}, ""}; + ConfigurableAxis thnConfigAxisResoFT0cFV0a{"thnConfigAxisResoFT0cFV0a", {160, -8, 8}, ""}; + ConfigurableAxis thnConfigAxisResoFT0cTPCtot{"thnConfigAxisResoFT0cTPCtot", {160, -8, 8}, ""}; + ConfigurableAxis thnConfigAxisResoFV0aTPCtot{"thnConfigAxisResoFV0aTPCtot", {160, -8, 8}, ""}; HistogramRegistry registry{"registry", {}}; @@ -231,15 +238,15 @@ struct HfTaskFlowCharmHadrons { } if (storeResoOccu) { - std::vector axes_reso = {thnAxisCent, thnAxisResoFT0cFV0a, thnAxisResoFT0cTPCtot, thnAxisResoFV0aTPCtot}; + std::vector axesReso = {thnAxisCent, thnAxisResoFT0cFV0a, thnAxisResoFT0cTPCtot, thnAxisResoFV0aTPCtot}; if (occEstimator == 1) { - axes_reso.insert(axes_reso.end(), {thnAxisOccupancyITS, thnAxisNoSameBunchPileup, thnAxisOccupancy, - thnAxisNoCollInTimeRangeNarrow, thnAxisNoCollInTimeRangeStandard, thnAxisNoCollInRofStandard}); + axesReso.insert(axesReso.end(), {thnAxisOccupancyITS, thnAxisNoSameBunchPileup, thnAxisOccupancy, + thnAxisNoCollInTimeRangeNarrow, thnAxisNoCollInTimeRangeStandard, thnAxisNoCollInRofStandard}); } else { - axes_reso.insert(axes_reso.end(), {thnAxisOccupancyFT0C, thnAxisNoSameBunchPileup, thnAxisOccupancy, - thnAxisNoCollInTimeRangeNarrow, thnAxisNoCollInTimeRangeStandard, thnAxisNoCollInRofStandard}); + axesReso.insert(axesReso.end(), {thnAxisOccupancyFT0C, thnAxisNoSameBunchPileup, thnAxisOccupancy, + thnAxisNoCollInTimeRangeNarrow, thnAxisNoCollInTimeRangeStandard, thnAxisNoCollInRofStandard}); } - registry.add("spReso/hSparseReso", "THn for resolution with occupancy", HistType::kTHnSparseF, axes_reso); + registry.add("spReso/hSparseReso", "THn for resolution with occupancy", HistType::kTHnSparseF, axesReso); } hfEvSel.addHistograms(registry); // collision monitoring @@ -285,6 +292,44 @@ struct HfTaskFlowCharmHadrons { } } + /// Compute the Q vector for the candidate's tracks + /// \param cand is the candidate + /// \param tracksQx is the X component of the Q vector for the tracks + /// \param tracksQy is the Y component of the Q vector for the tracks + /// \param channel is the decay channel + template + void getQvecXic0Tracks(const T1& cand, + std::vector& tracksQx, + std::vector& tracksQy, + float ampl) + { + // add possibility to consider different weights for the tracks, at the moment only pT is considered; + float pXTrack0 = cand.pxPosV0Dau(); + float pYTrack0 = cand.pyPosV0Dau(); + float pTTrack0 = std::hypot(pXTrack0, pYTrack0); + float phiTrack0 = std::atan2(pXTrack0, pYTrack0); + float pXTrack1 = cand.pxNegV0Dau(); + float pYTrack1 = cand.pyNegV0Dau(); + float pTTrack1 = std::hypot(pXTrack1, pYTrack1); + float phiTrack1 = std::atan2(pXTrack1, pYTrack1); + float pYTrack2 = cand.pxBachFromCasc(); + float pXTrack2 = cand.pyBachFromCasc(); + float pTTrack2 = std::hypot(pXTrack2, pYTrack2); + float phiTrack2 = std::atan2(pXTrack2, pYTrack2); + float pXTrack3 = cand.pxBachFromCharmBaryon(); + float pYTrack3 = cand.pyBachFromCharmBaryon(); + float pTTrack3 = std::hypot(pXTrack3, pYTrack3); + float phiTrack3 = std::atan2(pXTrack3, pYTrack3); + + tracksQx.push_back(std::cos(harmonic * phiTrack0) * pTTrack0 / ampl); + tracksQy.push_back(std::sin(harmonic * phiTrack0) * pTTrack0 / ampl); + tracksQx.push_back(std::cos(harmonic * phiTrack1) * pTTrack1 / ampl); + tracksQy.push_back(std::sin(harmonic * phiTrack1) * pTTrack1 / ampl); + tracksQx.push_back(std::cos(harmonic * phiTrack2) * pTTrack2 / ampl); + tracksQy.push_back(std::sin(harmonic * phiTrack2) * pTTrack2 / ampl); + tracksQx.push_back(std::cos(harmonic * phiTrack3) * pTTrack3 / ampl); + tracksQy.push_back(std::sin(harmonic * phiTrack3) * pTTrack3 / ampl); + } /// Compute the delta psi in the range [0, pi/harmonic] /// \param psi1 is the first angle /// \param psi2 is the second angle @@ -292,12 +337,7 @@ struct HfTaskFlowCharmHadrons { float getDeltaPsiInRange(float psi1, float psi2) { float deltaPsi = psi1 - psi2; - if (std::abs(deltaPsi) > constants::math::PI / harmonic) { - if (deltaPsi > 0.) - deltaPsi -= constants::math::TwoPI / harmonic; - else - deltaPsi += constants::math::TwoPI / harmonic; - } + deltaPsi = RecoDecay::constrainAngle(deltaPsi, -o2::constants::math::PI / harmonic, harmonic); return deltaPsi; } @@ -552,18 +592,36 @@ struct HfTaskFlowCharmHadrons { default: break; } + } else if constexpr (std::is_same_v || std::is_same_v) { + massCand = candidate.invMassCharmBaryon(); + if constexpr (std::is_same_v) { + for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) + outputMl[iclass] = candidate.mlProbToXiPi()[classMl->at(iclass)]; + } } - float ptCand = candidate.pt(); - float phiCand = candidate.phi(); + float ptCand = 0.; + float phiCand = 0.; + + if constexpr (std::is_same_v || std::is_same_v) { + ptCand = candidate.kfptXic(); + phiCand = std::atan2(candidate.pxCharmBaryon(), candidate.pyCharmBaryon()); + } else { + ptCand = candidate.pt(); + phiCand = candidate.phi(); + } // If TPC is used for the SP estimation, the tracks of the hadron candidate must be removed from the TPC Q vector to avoid double counting if (qvecDetector == QvecEstimator::TPCNeg || qvecDetector == QvecEstimator::TPCPos) { float ampl = amplQVec - static_cast(nProngs); std::vector tracksQx = {}; std::vector tracksQy = {}; - - getQvecDtracks(candidate, tracksQx, tracksQy, ampl); + if constexpr (std::is_same_v || std::is_same_v) { + // std::cout<(candidate, tracksQx, tracksQy, ampl); + } for (auto iTrack{0u}; iTrack < tracksQx.size(); ++iTrack) { xQVec -= tracksQx[iTrack]; yQVec -= tracksQy[iTrack]; @@ -683,6 +741,24 @@ struct HfTaskFlowCharmHadrons { } PROCESS_SWITCH(HfTaskFlowCharmHadrons, processXic, "Process Xic candidates", false); + // Xic0 with ML + void processXic0Ml(CollsWithQvecs::iterator const& collision, + CandXic0DataWMl const&) + { + auto candsXic0WMl = selectedXic0WMl->sliceByCached(aod::hf_cand::collisionId, collision.globalIndex(), cache); + runFlowAnalysis(collision, candsXic0WMl); + } + PROCESS_SWITCH(HfTaskFlowCharmHadrons, processXic0Ml, "Process Xic0 candidates with ML", false); + + // Xic0 + void processXic0(CollsWithQvecs::iterator const& collision, + CandXic0Data const&) + { + auto candsXic0 = selectedXic0->sliceByCached(aod::hf_cand::collisionId, collision.globalIndex(), cache); + runFlowAnalysis(collision, candsXic0); + } + PROCESS_SWITCH(HfTaskFlowCharmHadrons, processXic0, "Process Xic0 candidates", false); + // Resolution void processResolution(CollsWithQvecs::iterator const& collision, aod::BCsWithTimestamps const& bcs) From c90c6540f1185f7e815d76853c2c6fb2b0423efc Mon Sep 17 00:00:00 2001 From: Felix Schlepper Date: Wed, 11 Jun 2025 03:19:37 +0200 Subject: [PATCH 1572/1650] [ALICE3] do not include internal ITS code (#11539) Co-authored-by: ALICE Action Bot --- ALICE3/TableProducer/OTF/onTheFlyTracker.cxx | 62 +++++++++----------- 1 file changed, 28 insertions(+), 34 deletions(-) diff --git a/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx b/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx index ff804b8485a..c858f5a753e 100644 --- a/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx +++ b/ALICE3/TableProducer/OTF/onTheFlyTracker.cxx @@ -23,48 +23,42 @@ /// \author Roberto Preghenella preghenella@bo.infn.it /// -#include -#include -#include -#include -#include - -#include -#include -#include -#include +#include "ALICE3/Core/DelphesO2TrackSmearer.h" +#include "ALICE3/Core/DetLayer.h" +#include "ALICE3/Core/FastTracker.h" +#include "ALICE3/Core/TrackUtilities.h" +#include "ALICE3/DataModel/OTFStrangeness.h" +#include "ALICE3/DataModel/collisionAlice3.h" +#include "ALICE3/DataModel/tracksAlice3.h" +#include "Common/Core/RecoDecay.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "CommonConstants/MathConstants.h" +#include "DCAFitter/DCAFitterN.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "DetectorsBase/Propagator.h" +#include "DetectorsVertexing/PVertexer.h" +#include "DetectorsVertexing/PVertexerHelpers.h" +#include "Field/MagneticField.h" #include "Framework/AnalysisDataModel.h" #include "Framework/AnalysisTask.h" -#include "Framework/runDataProcessing.h" #include "Framework/HistogramRegistry.h" -#include -#include "DCAFitter/DCAFitterN.h" -#include "Common/Core/RecoDecay.h" #include "Framework/O2DatabasePDGPlugin.h" -#include "Common/DataModel/TrackSelectionTables.h" +#include "Framework/runDataProcessing.h" #include "ReconstructionDataFormats/DCA.h" -#include "DetectorsBase/Propagator.h" -#include "DataFormatsParameters/GRPMagField.h" -#include "DetectorsVertexing/PVertexer.h" -#include "DetectorsVertexing/PVertexerHelpers.h" #include "SimulationDataFormat/InteractionSampler.h" -#include "Field/MagneticField.h" -#include "ITSMFTSimulation/Hit.h" -#include "ITStracking/Configuration.h" -#include "ITStracking/IOUtils.h" -#include "ITStracking/Tracker.h" -#include "ITStracking/Vertexer.h" -#include "ITStracking/VertexerTraits.h" +#include +#include +#include +#include +#include -#include "ALICE3/Core/DelphesO2TrackSmearer.h" -#include "ALICE3/Core/FastTracker.h" -#include "ALICE3/Core/DetLayer.h" -#include "ALICE3/Core/TrackUtilities.h" -#include "ALICE3/DataModel/collisionAlice3.h" -#include "ALICE3/DataModel/tracksAlice3.h" -#include "ALICE3/DataModel/OTFStrangeness.h" +#include +#include +#include +#include +#include using namespace o2; using namespace o2::framework; @@ -808,7 +802,7 @@ struct OnTheFlyTracker { std::array posClusterCandidate; trackParCov.getXYZGlo(posClusterCandidate); float r{std::hypot(posClusterCandidate[0], posClusterCandidate[1])}; - float phi{std::atan2(-posClusterCandidate[1], -posClusterCandidate[0]) + o2::its::constants::math::Pi}; + float phi{std::atan2(-posClusterCandidate[1], -posClusterCandidate[0]) + o2::constants::math::PI}; o2::fastsim::DetLayer currentTrackingLayer = fastTracker.GetLayer(i); if (currentTrackingLayer.getResolutionRPhi() > 1e-8 && currentTrackingLayer.getResolutionZ() > 1e-8) { // catch zero (though should not really happen...) From 433d1f969952e873db5fa1f2c494365a36dbf69c Mon Sep 17 00:00:00 2001 From: aimeric-landou <46970521+aimeric-landou@users.noreply.github.com> Date: Wed, 11 Jun 2025 11:13:34 +0200 Subject: [PATCH 1573/1650] [Common] Common - add trackdcacov table producer for Run2 converted data (#11434) --- Common/TableProducer/CMakeLists.txt | 5 + .../TableProducer/trackDcaCovFillerRun2.cxx | 179 ++++++++++++++++++ 2 files changed, 184 insertions(+) create mode 100644 Common/TableProducer/trackDcaCovFillerRun2.cxx diff --git a/Common/TableProducer/CMakeLists.txt b/Common/TableProducer/CMakeLists.txt index 042bd643d3e..1d6918d6121 100644 --- a/Common/TableProducer/CMakeLists.txt +++ b/Common/TableProducer/CMakeLists.txt @@ -62,6 +62,11 @@ o2physics_add_dpl_workflow(track-propagation PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(track-dca-cov-filler-run2 + SOURCES trackDcaCovFillerRun2.cxx + PUBLIC_LINK_LIBRARIES O2::DetectorsBase O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(track-propagation-tester SOURCES trackPropagationTester.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::trackSelectionRequest diff --git a/Common/TableProducer/trackDcaCovFillerRun2.cxx b/Common/TableProducer/trackDcaCovFillerRun2.cxx new file mode 100644 index 00000000000..d07833ae9e0 --- /dev/null +++ b/Common/TableProducer/trackDcaCovFillerRun2.cxx @@ -0,0 +1,179 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file trackDcaCovFillerRun2.cxx +/// \author Aimeric Landou , CERN +/// \brief Fills DCA and DCA Cov tables for Run 2 tracks +// Run 2 AO2Ds cannot have their dcacov filled by the current track-propagation workflow as the workflow isn't designed for them, given Run 2 tracks are already propagated to the PV. +// This task fills the DCA Cov (and DCA) tables for Run 2 tracks by "propagating" the tracks (though given they are already at the PV it doesn't actually do the propagation) and retrieving the DCA and DCA cov given by the propagateToDCABxByBz function + +#include + +#include "TableHelper.h" +#include "Common/Tools/TrackTuner.h" +#include "DataFormatsParameters/GRPObject.h" + +using namespace o2; +using namespace o2::framework; +// using namespace o2::framework::expressions; + +struct TrackDcaCovFillerRun2 { + Produces tracksDCA; + Produces tracksDCACov; + + // Produces tunertable; + + Service ccdb; + + bool fillTracksDCA = false; + bool fillTracksDCACov = false; + int runNumber = -1; + + o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; + + const o2::dataformats::MeanVertexObject* mMeanVtx = nullptr; + o2::parameters::GRPMagField* grpmag = nullptr; + o2::base::MatLayerCylSet* lut = nullptr; + + Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable ccdbPathGrp{"ccdbPathGrp", "GLO/GRP/GRP", "CCDB path of the grp file (run2)"}; + Configurable mVtxPath{"mVtxPath", "GLO/Calib/MeanVertex", "Path of the mean vertex file"}; + + HistogramRegistry registry{"registry"}; + + void init(o2::framework::InitContext& initContext) + { + // Checking if the tables are requested in the workflow and enabling them + fillTracksDCA = isTableRequiredInWorkflow(initContext, "TracksDCA"); + fillTracksDCACov = isTableRequiredInWorkflow(initContext, "TracksDCACov"); + + ccdb->setURL(ccdburl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + } + + void initCCDB(aod::BCsWithTimestamps::iterator const& bc) + { + if (runNumber == bc.runNumber()) { + return; + } + + // Run 2 GRP object + o2::parameters::GRPObject* grpo = ccdb->getForTimeStamp(ccdbPathGrp, bc.timestamp()); + if (grpo == nullptr) { + LOGF(fatal, "Run 2 GRP object (type o2::parameters::GRPObject) is not available in CCDB for run=%d at timestamp=%llu", bc.runNumber(), bc.timestamp()); + } + o2::base::Propagator::initFieldFromGRP(grpo); + LOGF(info, "Setting magnetic field to %d kG for run %d from its GRP CCDB object (type o2::parameters::GRPObject)", grpo->getNominalL3Field(), bc.runNumber()); + + mMeanVtx = ccdb->getForTimeStamp(mVtxPath, bc.timestamp()); + runNumber = bc.runNumber(); + } + + // Running variables + std::array mDcaInfo; + o2::dataformats::DCA mDcaInfoCov; + o2::dataformats::VertexBase mVtx; + o2::track::TrackParametrization mTrackPar; + o2::track::TrackParametrizationWithError mTrackParCov; + + template + void fillTrackTables(TTrack const& tracks, + TParticle const&, + aod::Collisions const&, + aod::BCsWithTimestamps const& bcs) + { + if (bcs.size() == 0) { + return; + } + initCCDB(bcs.begin()); + + if constexpr (fillCovMat) { + if (fillTracksDCACov) { + tracksDCACov.reserve(tracks.size()); + } + } else { + if (fillTracksDCA) { + tracksDCA.reserve(tracks.size()); + } + } + + for (auto const& track : tracks) { + if constexpr (fillCovMat) { + if (fillTracksDCA || fillTracksDCACov) { + mDcaInfoCov.set(999, 999, 999, 999, 999); + } + setTrackParCov(track, mTrackParCov); + } else { + if (fillTracksDCA) { + mDcaInfo[0] = 999; + mDcaInfo[1] = 999; + } + setTrackPar(track, mTrackPar); + } + + if (track.has_collision()) { + auto const& collision = track.collision(); + if constexpr (fillCovMat) { + mVtx.setPos({collision.posX(), collision.posY(), collision.posZ()}); + mVtx.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, mTrackParCov, 2.f, matCorr, &mDcaInfoCov); + } else { + o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, mTrackPar, 2.f, matCorr, &mDcaInfo); + } + } else { + if constexpr (fillCovMat) { + mVtx.setPos({mMeanVtx->getX(), mMeanVtx->getY(), mMeanVtx->getZ()}); + mVtx.setCov(mMeanVtx->getSigmaX() * mMeanVtx->getSigmaX(), 0.0f, mMeanVtx->getSigmaY() * mMeanVtx->getSigmaY(), 0.0f, 0.0f, mMeanVtx->getSigmaZ() * mMeanVtx->getSigmaZ()); + o2::base::Propagator::Instance()->propagateToDCABxByBz(mVtx, mTrackParCov, 2.f, matCorr, &mDcaInfoCov); + } else { + o2::base::Propagator::Instance()->propagateToDCABxByBz({mMeanVtx->getX(), mMeanVtx->getY(), mMeanVtx->getZ()}, mTrackPar, 2.f, matCorr, &mDcaInfo); + } + } + + if constexpr (fillCovMat) { + if (fillTracksDCA) { + tracksDCA(mDcaInfoCov.getY(), mDcaInfoCov.getZ()); + } + if (fillTracksDCACov) { + tracksDCACov(mDcaInfoCov.getSigmaY2(), mDcaInfoCov.getSigmaZ2()); + } + } else { + if (fillTracksDCA) { + tracksDCA(mDcaInfo[0], mDcaInfo[1]); + } + } + } + } + + void processCovariance(soa::Join const& tracks, aod::Collisions const& collisions, aod::BCsWithTimestamps const& bcs) + { + fillTrackTables, /*Particle*/ soa::Join, /*isMc = */ false, /*fillCovMat =*/true>(tracks, tracks, collisions, bcs); + } + PROCESS_SWITCH(TrackDcaCovFillerRun2, processCovariance, "Process with covariance", false); + + void processStandard(soa::Join const& tracks, aod::Collisions const& collisions, aod::BCsWithTimestamps const& bcs) + { + fillTrackTables, /*Particle*/ soa::Join, /*isMc = */ false, /*fillCovMat =*/false>(tracks, tracks, collisions, bcs); + } + PROCESS_SWITCH(TrackDcaCovFillerRun2, processStandard, "Process without covariance", true); +}; + +//**************************************************************************************** +/** + * Workflow definition. + */ +//**************************************************************************************** +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + WorkflowSpec workflow{adaptAnalysisTask(cfgc)}; + return workflow; +} From cea07ba418f72631f0cf4fcea0a5d783b963638c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josu=C3=A9=20Mart=C3=ADnez=20Garc=C3=ADa?= Date: Wed, 11 Jun 2025 03:32:37 -0600 Subject: [PATCH 1574/1650] [PWGUD] : Fixing the runtime overhead (#11532) --- PWGUD/Tasks/upcPhotonuclearAnalysisJMG.cxx | 49 ++++++++++++++-------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/PWGUD/Tasks/upcPhotonuclearAnalysisJMG.cxx b/PWGUD/Tasks/upcPhotonuclearAnalysisJMG.cxx index eb16b83f315..d20a78429dd 100644 --- a/PWGUD/Tasks/upcPhotonuclearAnalysisJMG.cxx +++ b/PWGUD/Tasks/upcPhotonuclearAnalysisJMG.cxx @@ -100,7 +100,8 @@ struct upcPhotonuclearAnalysisJMG { HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; // Declare configurables on events/collisions - Configurable nEvenstMixed{"nEvenstMixed", 3, {"Events to be Mixed"}}; + Configurable nEventsMixed{"nEventsMixed", 3, {"Events to be Mixed"}}; + Configurable factorEventsMixed{"factorEventsMixed", 100, {"factorEventsMixed to events mixed"}}; Configurable myZVtxCut{"myZVtxCut", 10., {"My collision cut"}}; Configurable myTimeZNACut{"myTimeZNACut", 2., {"My collision cut"}}; Configurable myTimeZNCCut{"myTimeZNCCut", 2., {"My collision cut"}}; @@ -275,23 +276,18 @@ struct upcPhotonuclearAnalysisJMG { mixedGapSideC.setObject(new CorrelationContainer("mixedEventGapSideC", "mixedEventGapSideC", corrAxis, effAxis, {})); } - std::vector vtxBinsEdges{VARIABLE_WIDTH, -10.0f, -5.0f, 0.0f, 5.0f, 10.0f}; + std::vector vtxBinsEdges{VARIABLE_WIDTH, -10.0f, -7.0f, -5.0f, -2.5f, 0.0f, 2.5f, 5.0f, 7.0f, 10.0f}; std::vector gapSideBinsEdges{VARIABLE_WIDTH, -0.5, 0.5, 1.5}; SliceCache cache; + int countGapA = 0; + int countGapC = 0; // Binning only on PosZ without multiplicity // using BinningType = ColumnBinningPolicy; using BinningType = ColumnBinningPolicy; - BinningType bindingOnVtx{{vtxBinsEdges, {gapSideBinsEdges}}, true}; - SameKindPair pairs{bindingOnVtx, nEvenstMixed, -1, &cache}; - - // ColumnBinningPolicy bindingOnVtx{{vtxBinsEdges, multBinsEdges}, true}; - - // SameKindPair, - // FullUDTracks, - // ColumnBinningPolicy> - // pair{bindingOnVtx, 5, -1, &cache}; + BinningType bindingOnVtx{{vtxBinsEdges, gapSideBinsEdges}, true}; + SameKindPair pairs{bindingOnVtx, nEventsMixed, -1, &cache}; template bool isCollisionCutSG(CSG const& collision, int SideGap) @@ -584,7 +580,8 @@ struct upcPhotonuclearAnalysisJMG { if (fillCollisionUD(sameGapSideC, multiplicity) == false) { return; } - // LOGF(debug, "Filling sameGapSideC events"); + histos.fill(HIST("eventcount"), -1); + // LOGF(info, "Filling sameGapSideC events"); fillCorrelationsUD(sameGapSideC, reconstructedTracks, reconstructedTracks, multiplicity, reconstructedCollision.posZ()); break; default: @@ -601,18 +598,34 @@ struct upcPhotonuclearAnalysisJMG { // int sgSide = reconstructedCollision.gapSide(); // int sgSide = 0; + int maxCountGapA = 0; + int maxCountGapC = 0; + + if (auto histEventCount = histos.get(HIST("eventcount"))) { + int binA = histEventCount->GetXaxis()->FindBin(-2); // Gap A + int binC = histEventCount->GetXaxis()->FindBin(-1); // Gap C + + maxCountGapA = histEventCount->GetBinContent(binA) * factorEventsMixed; + maxCountGapC = histEventCount->GetBinContent(binC) * factorEventsMixed; + } + for (const auto& [collision1, tracks1, collision2, tracks2] : pairs) { if (collision1.size() == 0 || collision2.size() == 0) { - // LOGF(debug, "One or both collisions are empty."); + // LOGF(info, "One or both collisions are empty."); continue; } + if (countGapA >= maxCountGapA && countGapC >= maxCountGapC) { + break; + } float multiplicity = 0; if (collision1.gapSide() == 0 && collision2.gapSide() == 0) { // gap on side A if (isCollisionCutSG(collision1, 0) == false && isCollisionCutSG(collision2, 0) == false) { continue; } - // LOGF(debug, "In the pairs loop, gap side A"); + // std::cout << "Counts for Gap A: " << countGapA << " Maximum Count for Gap A " << maxCountGapA << std::endl; + ++countGapA; + // LOGF(info, "In the pairs loop, gap side A"); multiplicity = tracks1.size(); if (fillCollisionUD(mixedGapSideA, multiplicity) == false) { return; @@ -620,20 +633,22 @@ struct upcPhotonuclearAnalysisJMG { // histos.fill(HIST("eventcount"), bindingOnVtx.getBin({collision1.posZ()})); histos.fill(HIST("eventcount"), bindingOnVtx.getBin({collision1.posZ(), collision1.gapSide()})); fillCorrelationsUD(mixedGapSideA, tracks1, tracks2, multiplicity, collision1.posZ()); - // LOGF(debug, "Filling mixedGapSideA events, Gap for side A"); + // LOGF(info, "Filling mixedGapSideA events, Gap for side A"); } if (collision1.gapSide() == 1 && collision2.gapSide() == 1) { // gap on side C if (isCollisionCutSG(collision1, 1) == false && isCollisionCutSG(collision2, 1) == false) { continue; } - // LOGF(debug, "In the pairs loop, gap side C"); + // std::cout << "Counts for Gap C: " << countGapC << " Maximum Count for Gap C" << maxCountGapC << std::endl; + ++countGapC; + // LOGF(info, "In the pairs loop, gap side C"); multiplicity = tracks1.size(); if (fillCollisionUD(mixedGapSideC, multiplicity) == false) { return; } fillCorrelationsUD(mixedGapSideC, tracks1, tracks2, multiplicity, collision1.posZ()); - // LOGF(debug, "Filling mixedGapSideC events, Gap for side C"); + // LOGF(info, "Filling mixedGapSideC events, Gap for side C"); } else { continue; } From fadf9a9fb37ad3cc09a0f053e7ec92d083b0f9e2 Mon Sep 17 00:00:00 2001 From: Maximiliano Puccio Date: Wed, 11 Jun 2025 22:31:36 +0800 Subject: [PATCH 1575/1650] [Trigger] Add macro to inspect trigger menu per run (#11544) --- EventFiltering/macros/getMenu.C | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 EventFiltering/macros/getMenu.C diff --git a/EventFiltering/macros/getMenu.C b/EventFiltering/macros/getMenu.C new file mode 100644 index 00000000000..692ebe396f3 --- /dev/null +++ b/EventFiltering/macros/getMenu.C @@ -0,0 +1,31 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +#include "CCDB/BasicCCDBManager.h" + +#include +#include + +#include + +void getMenu(int runNumber, std::string baseCCDBPath = "Users/m/mpuccio/EventFiltering/OTS/Chunked/") +{ + auto& ccdb = o2::ccdb::BasicCCDBManager::instance(); + TH1* counters = ccdb.getForRun(baseCCDBPath + "FilterCounters", runNumber); + TAxis* axis = counters->GetXaxis(); + + std::vector binLabels(axis->GetNbins() - 2); // skip first and last bins + std::cout << "Menu for run " << runNumber << ":\n"; + for (int i = 2; i < axis->GetNbins(); ++i) { + binLabels[i - 1] = axis->GetBinLabel(i); + std::cout << "Id " << i - 2 << ": " << axis->GetBinLabel(i) << "\n"; + } +} From b07b526549cd883fb75f31f12135ef558e927729 Mon Sep 17 00:00:00 2001 From: Sandeep Dudi <69388148+sdudi123@users.noreply.github.com> Date: Wed, 11 Jun 2025 16:36:22 +0200 Subject: [PATCH 1576/1650] [PWGUD] Updated macro for JIT session error Cannot allocate memory issue (#11490) Co-authored-by: sandeep dudi --- PWGUD/Tasks/sginclusivePhiKstarSD.cxx | 219 +++++++++++++++----------- 1 file changed, 124 insertions(+), 95 deletions(-) diff --git a/PWGUD/Tasks/sginclusivePhiKstarSD.cxx b/PWGUD/Tasks/sginclusivePhiKstarSD.cxx index 20d4f08d1d6..628818bd553 100644 --- a/PWGUD/Tasks/sginclusivePhiKstarSD.cxx +++ b/PWGUD/Tasks/sginclusivePhiKstarSD.cxx @@ -59,6 +59,15 @@ struct SginclusivePhiKstarSD { Configurable zdcCut{"zdcCut", 0., "ZDC threshold"}; Configurable vzCut{"vzCut", 10., "Vz position"}; Configurable occCut{"occCut", 1000., "Occupancy cut"}; + Configurable hadronicRate{"hadronicRate", 1000., "hadronicRate cut"}; + Configurable useTrs{"useTrs", -1, "kNoCollInTimeRangeStandard cut"}; + Configurable useTrofs{"useTrofs", -1, "kNoCollInRofStandard cut"}; + Configurable useHmpr{"useHmpr", -1, "kNoHighMultCollInPrevRof cut"}; + Configurable useTfb{"useTfb", -1, "kNoTimeFrameBorder cut"}; + Configurable useItsrofb{"useItsrofb", -1, "kNoITSROFrameBorder cut"}; + Configurable useSbp{"useSbp", -1, "kNoSameBunchPileup cut"}; + Configurable useZvtxftovpv{"useZvtxftovpv", -1, "kIsGoodZvtxFT0vsPV cut"}; + Configurable useVtxItsTpc{"useVtxItsTpc", -1, "kIsVertexITSTPC cut"}; // Track Selections Configurable pvCut{"pvCut", 1.0, "Use Only PV tracks"}; @@ -395,9 +404,9 @@ struct SginclusivePhiKstarSD { } //_____________________________________________________________________________ - double cosThetaCollinsSoperFrame(TLorentzVector pair1, - TLorentzVector pair2, - TLorentzVector fourpion) + double cosThetaCollinsSoperFrame(ROOT::Math::PxPyPzMVector pair1, + ROOT::Math::PxPyPzMVector pair2, + ROOT::Math::PxPyPzMVector fourpion) { double halfSqrtSnn = 2680.; double massOfLead208 = 193.6823; @@ -483,7 +492,7 @@ struct SginclusivePhiKstarSD { } //------------------------------------------------------------------------------------------------------ - double phiCollinsSoperFrame(TLorentzVector pair1, TLorentzVector pair2, TLorentzVector fourpion) + double phiCollinsSoperFrame(ROOT::Math::PxPyPzMVector pair1, ROOT::Math::PxPyPzMVector pair2, ROOT::Math::PxPyPzMVector fourpion) { // Half of the energy per pair of the colliding nucleons. double halfSqrtSnn = 2680.; @@ -518,24 +527,24 @@ struct SginclusivePhiKstarSD { void process(UDCollisionFull const& collision, UDtracksfull const& tracks) { - TLorentzVector v0; - TLorentzVector v1; - TLorentzVector v01; + ROOT::Math::PxPyPzMVector v0; + ROOT::Math::PxPyPzMVector v1; + ROOT::Math::PxPyPzMVector v01; int gapSide = collision.gapSide(); float fitCut[5] = {fv0Cut, ft0aCut, ft0cCut, fddaCut, fddcCut}; std::vector parameters = {pvCut, dcazCut, dcaxyCut, tpcChi2Cut, tpcNClsFindableCut, itsChi2Cut, etaCut, ptCut}; int truegapSide = sgSelector.trueGap(collision, fitCut[0], fitCut[1], fitCut[2], zdcCut); - TLorentzVector phiv; - TLorentzVector phiv1; + ROOT::Math::PxPyPzMVector phiv; + ROOT::Math::PxPyPzMVector phiv1; - std::vector onlyPionTracksp; + std::vector onlyPionTracksp; std::vector rawPionTracksp; - std::vector onlyPionTrackspm; + std::vector onlyPionTrackspm; std::vector rawPionTrackspm; - std::vector onlyPionTracksn; + std::vector onlyPionTracksn; std::vector rawPionTracksn; registry.fill(HIST("GapSide"), gapSide); @@ -547,6 +556,25 @@ struct SginclusivePhiKstarSD { return; if (std::abs(collision.occupancyInTime()) > occCut) return; + if (std::abs(collision.hadronicRate()) > hadronicRate) + return; + + if (useTrs != -1 && collision.trs() != useTrs) + return; + if (useTrofs != -1 && collision.trofs() != useTrofs) + return; + if (useHmpr != -1 && collision.hmpr() != useHmpr) + return; + if (useTfb != -1 && collision.tfb() != useTfb) + return; + if (useItsrofb != -1 && collision.itsROFb() != useItsrofb) + return; + if (useSbp != -1 && collision.sbp() != useSbp) + return; + if (useZvtxftovpv != -1 && collision.zVtxFT0vPV() != useZvtxftovpv) + return; + if (useVtxItsTpc != -1 && collision.vtxITSTPC() != useVtxItsTpc) + return; int mult = collision.numContrib(); if (gapSide == 0) { @@ -569,18 +597,19 @@ struct SginclusivePhiKstarSD { int trackextra = 0; int trackextraDG = 0; - Partition pvContributors1 = aod::udtrack::isPVContributor == true; - pvContributors1.bindTable(tracks); - if (gapSide == 0) { - registry.get(HIST("nPVContributors_data"))->Fill(pvContributors1.size(), 1.); - } - if (gapSide == 1) { - registry.get(HIST("nPVContributors_data_1"))->Fill(pvContributors1.size(), 1.); - } + /* Partition pvContributors1 = aod::udtrack::isPVContributor == true; + pvContributors1.bindTable(tracks); + if (gapSide == 0) { + registry.get(HIST("nPVContributors_data"))->Fill(pvContributors1.size(), 1.); + } + if (gapSide == 1) { + registry.get(HIST("nPVContributors_data_1"))->Fill(pvContributors1.size(), 1.); + } + */ for (const auto& track1 : tracks) { if (!trackselector(track1, parameters)) continue; - v0.SetXYZM(track1.px(), track1.py(), track1.pz(), o2::constants::physics::MassPionCharged); + v0.SetCoordinates(track1.px(), track1.py(), track1.pz(), o2::constants::physics::MassPionCharged); if (selectionPIDPion1(track1)) { onlyPionTrackspm.push_back(v0); rawPionTrackspm.push_back(track1); @@ -719,8 +748,8 @@ struct SginclusivePhiKstarSD { continue; if (phi && selectionPIDKaon1(t0) && selectionPIDKaon1(t1)) { // Apply kaon hypothesis and create pairs - v0.SetXYZM(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassKaonCharged); - v1.SetXYZM(t1.px(), t1.py(), t1.pz(), o2::constants::physics::MassKaonCharged); + v0.SetCoordinates(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassKaonCharged); + v1.SetCoordinates(t1.px(), t1.py(), t1.pz(), o2::constants::physics::MassKaonCharged); v01 = v0 + v1; // Opposite sign pairs if (t0.sign() != t1.sign()) { @@ -754,8 +783,8 @@ struct SginclusivePhiKstarSD { continue; if (kstar && selectionPIDKaon1(t0) && selectionPIDPion1(t1)) { // Apply kaon hypothesis and create pairs - v0.SetXYZM(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassKaonCharged); - v1.SetXYZM(t1.px(), t1.py(), t1.pz(), o2::constants::physics::MassPionCharged); + v0.SetCoordinates(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassKaonCharged); + v1.SetCoordinates(t1.px(), t1.py(), t1.pz(), o2::constants::physics::MassPionCharged); v01 = v0 + v1; // Opposite sign pairs if (t0.sign() != t1.sign()) { @@ -790,8 +819,8 @@ struct SginclusivePhiKstarSD { continue; if (phi && selectionPIDKaon1(t0) && selectionPIDKaon1(t1)) { // Apply kaon hypothesis and create pairs - v0.SetXYZM(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassKaonCharged); - v1.SetXYZM(t1.px(), t1.py(), t1.pz(), o2::constants::physics::MassKaonCharged); + v0.SetCoordinates(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassKaonCharged); + v1.SetCoordinates(t1.px(), t1.py(), t1.pz(), o2::constants::physics::MassKaonCharged); v01 = v0 + v1; // Opposite sign pairs if (t0.sign() != t1.sign()) { @@ -825,8 +854,8 @@ struct SginclusivePhiKstarSD { continue; if (kstar && selectionPIDKaon1(t0) && selectionPIDPion1(t1)) { // Apply kaon hypothesis and create pairs - v0.SetXYZM(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassKaonCharged); - v1.SetXYZM(t1.px(), t1.py(), t1.pz(), o2::constants::physics::MassPionCharged); + v0.SetCoordinates(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassKaonCharged); + v1.SetCoordinates(t1.px(), t1.py(), t1.pz(), o2::constants::physics::MassPionCharged); v01 = v0 + v1; // Opposite sign pairs if (t0.sign() != t1.sign()) { @@ -860,8 +889,8 @@ struct SginclusivePhiKstarSD { continue; if (phi && selectionPIDKaon1(t0) && selectionPIDKaon1(t1)) { // Apply kaon hypothesis and create pairs - v0.SetXYZM(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassKaonCharged); - v1.SetXYZM(t1.px(), t1.py(), t1.pz(), o2::constants::physics::MassKaonCharged); + v0.SetCoordinates(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassKaonCharged); + v1.SetCoordinates(t1.px(), t1.py(), t1.pz(), o2::constants::physics::MassKaonCharged); v01 = v0 + v1; // Opposite sign pairs if (t0.sign() != t1.sign()) { @@ -895,8 +924,8 @@ struct SginclusivePhiKstarSD { continue; if (kstar && selectionPIDKaon1(t0) && selectionPIDPion1(t1)) { // Apply kaon hypothesis and create pairs - v0.SetXYZM(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassKaonCharged); - v1.SetXYZM(t1.px(), t1.py(), t1.pz(), o2::constants::physics::MassPionCharged); + v0.SetCoordinates(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassKaonCharged); + v1.SetCoordinates(t1.px(), t1.py(), t1.pz(), o2::constants::physics::MassPionCharged); v01 = v0 + v1; // Opposite sign pairs if (t0.sign() != t1.sign()) { @@ -932,8 +961,8 @@ struct SginclusivePhiKstarSD { if (phi && selectionPIDKaon1(t0) && selectionPIDKaon1(t1)) { // Apply kaon hypothesis and create pairs - v0.SetXYZM(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassKaonCharged); - v1.SetXYZM(t1.px(), t1.py(), t1.pz(), o2::constants::physics::MassKaonCharged); + v0.SetCoordinates(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassKaonCharged); + v1.SetCoordinates(t1.px(), t1.py(), t1.pz(), o2::constants::physics::MassKaonCharged); v01 = v0 + v1; // Opposite sign pairs if (t0.sign() != t1.sign()) { @@ -971,8 +1000,8 @@ struct SginclusivePhiKstarSD { auto rotkaonPx = t0.px() * std::cos(rotangle) - t0.py() * std::sin(rotangle); auto rotkaonPy = t0.px() * std::sin(rotangle) + t0.py() * std::cos(rotangle); - v0.SetXYZM(rotkaonPx, rotkaonPy, t0.pz(), o2::constants::physics::MassKaonCharged); - v1.SetXYZM(t1.px(), t1.py(), t1.pz(), o2::constants::physics::MassKaonCharged); + v0.SetCoordinates(rotkaonPx, rotkaonPy, t0.pz(), o2::constants::physics::MassKaonCharged); + v1.SetCoordinates(t1.px(), t1.py(), t1.pz(), o2::constants::physics::MassKaonCharged); v01 = v0 + v1; if (t0.sign() != t1.sign()) { if (gapSide == 0) { @@ -995,8 +1024,8 @@ struct SginclusivePhiKstarSD { if (t0.globalIndex() == t1.globalIndex()) continue; if (rho && selectionPIDProton(t0, useTof, nsigmaTpcCut, nsigmaTofCut) && selectionPIDPion1(t1)) { - v0.SetXYZM(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassProton); - v1.SetXYZM(t1.px(), t1.py(), t1.pz(), o2::constants::physics::MassPionCharged); + v0.SetCoordinates(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassProton); + v1.SetCoordinates(t1.px(), t1.py(), t1.pz(), o2::constants::physics::MassPionCharged); v01 = v0 + v1; // Opposite sign pairs if (t0.sign() != t1.sign()) { @@ -1025,8 +1054,8 @@ struct SginclusivePhiKstarSD { if (kstar && selectionPIDKaon1(t0) && selectionPIDPion1(t1)) { if (kaoncut && t0.tpcNSigmaPi() < pionNsigmaCut) continue; - v0.SetXYZM(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassKaonCharged); - v1.SetXYZM(t1.px(), t1.py(), t1.pz(), o2::constants::physics::MassPionCharged); + v0.SetCoordinates(t0.px(), t0.py(), t0.pz(), o2::constants::physics::MassKaonCharged); + v1.SetCoordinates(t1.px(), t1.py(), t1.pz(), o2::constants::physics::MassPionCharged); v01 = v0 + v1; // Opposite sign pairs if (t0.sign() != t1.sign()) { @@ -1062,8 +1091,8 @@ struct SginclusivePhiKstarSD { auto rotkaonPx = t0.px() * std::cos(rotangle) - t0.py() * std::sin(rotangle); auto rotkaonPy = t0.px() * std::sin(rotangle) + t0.py() * std::cos(rotangle); - v0.SetXYZM(rotkaonPx, rotkaonPy, t0.pz(), o2::constants::physics::MassKaonCharged); - v1.SetXYZM(t1.px(), t1.py(), t1.pz(), o2::constants::physics::MassPionCharged); + v0.SetCoordinates(rotkaonPx, rotkaonPy, t0.pz(), o2::constants::physics::MassKaonCharged); + v1.SetCoordinates(t1.px(), t1.py(), t1.pz(), o2::constants::physics::MassPionCharged); v01 = v0 + v1; if (t0.sign() != t1.sign()) { if (gapSide == 0) { @@ -1082,12 +1111,12 @@ struct SginclusivePhiKstarSD { } if (fourpion) { if (gapSide == 2 && mult2 == 4) { - TLorentzVector pair1, pair2, pair3, pair4; + ROOT::Math::PxPyPzMVector pair1, pair2, pair3, pair4; if (onlyPionTracksp.size() == 2 && onlyPionTracksn.size() == 2) { - TLorentzVector k1 = onlyPionTracksp.at(0); - TLorentzVector k2 = onlyPionTracksp.at(1); - TLorentzVector k3 = onlyPionTracksn.at(0); - TLorentzVector k4 = onlyPionTracksn.at(1); + ROOT::Math::PxPyPzMVector k1 = onlyPionTracksp.at(0); + ROOT::Math::PxPyPzMVector k2 = onlyPionTracksp.at(1); + ROOT::Math::PxPyPzMVector k3 = onlyPionTracksn.at(0); + ROOT::Math::PxPyPzMVector k4 = onlyPionTracksn.at(1); phiv = k1 + k2 + k3 + k4; pair1 = k1 + k3; pair2 = k2 + k4; @@ -1112,10 +1141,10 @@ struct SginclusivePhiKstarSD { if (onlyPionTracksp.size() != 2 && onlyPionTracksn.size() != 2) { if (onlyPionTracksp.size() + onlyPionTracksn.size() != 4) return; - TLorentzVector l1 = onlyPionTrackspm.at(0); - TLorentzVector l2 = onlyPionTrackspm.at(1); - TLorentzVector l3 = onlyPionTrackspm.at(2); - TLorentzVector l4 = onlyPionTrackspm.at(3); + ROOT::Math::PxPyPzMVector l1 = onlyPionTrackspm.at(0); + ROOT::Math::PxPyPzMVector l2 = onlyPionTrackspm.at(1); + ROOT::Math::PxPyPzMVector l3 = onlyPionTrackspm.at(2); + ROOT::Math::PxPyPzMVector l4 = onlyPionTrackspm.at(3); phiv1 = l1 + l2 + l3 + l4; registry.fill(HIST("os_pppp_pT_2_ls"), phiv1.M(), phiv1.Pt(), phiv1.Rapidity()); } @@ -1134,9 +1163,9 @@ struct SginclusivePhiKstarSD { using BinningTypeVertexContributor = ColumnBinningPolicy; void mixprocess(UDCollisionsFull1 const& collisions, UDtracksfull const& /*track*/) { - TLorentzVector v0; - TLorentzVector v1; - TLorentzVector v01; + ROOT::Math::PxPyPzMVector v0; + ROOT::Math::PxPyPzMVector v1; + ROOT::Math::PxPyPzMVector v01; float fitCut[5] = {fv0Cut, ft0aCut, ft0cCut, fddaCut, fddcCut}; std::vector parameters = {pvCut, dcazCut, dcaxyCut, tpcChi2Cut, tpcNClsFindableCut, itsChi2Cut, etaCut, ptCut}; BinningTypeVertexContributor binningOnPositions{{axisVertex, axisMultiplicityClass}, true}; @@ -1158,8 +1187,8 @@ struct SginclusivePhiKstarSD { if (!trackselector(track1, parameters) || !trackselector(track2, parameters)) continue; if (phi && selectionPIDKaon1(track1) && selectionPIDKaon1(track2)) { - v0.SetXYZM(track1.px(), track1.py(), track1.pz(), o2::constants::physics::MassKaonCharged); - v1.SetXYZM(track2.px(), track2.py(), track2.pz(), o2::constants::physics::MassKaonCharged); + v0.SetCoordinates(track1.px(), track1.py(), track1.pz(), o2::constants::physics::MassKaonCharged); + v1.SetCoordinates(track2.px(), track2.py(), track2.pz(), o2::constants::physics::MassKaonCharged); v01 = v0 + v1; // Opposite sign pairs if (track1.sign() != track2.sign()) { @@ -1181,8 +1210,8 @@ struct SginclusivePhiKstarSD { if (track1.globalIndex() == track2.globalIndex()) continue; if (kstar && selectionPIDKaon1(track1) && selectionPIDPion1(track2)) { - v0.SetXYZM(track1.px(), track1.py(), track1.pz(), o2::constants::physics::MassKaonCharged); - v1.SetXYZM(track2.px(), track2.py(), track2.pz(), o2::constants::physics::MassPionCharged); + v0.SetCoordinates(track1.px(), track1.py(), track1.pz(), o2::constants::physics::MassKaonCharged); + v1.SetCoordinates(track2.px(), track2.py(), track2.pz(), o2::constants::physics::MassPionCharged); v01 = v0 + v1; // Opposite sign pairs if (track1.sign() != track2.sign()) { @@ -1216,11 +1245,11 @@ struct SginclusivePhiKstarSD { void processMCTruth(aod::UDMcCollisions const& mccollisions, CCs const& collisions, aod::UDMcParticles const& McParts, TCs const& tracks) { // number of McCollisions in DF - TLorentzVector v0; - TLorentzVector v1; - TLorentzVector v01; - TLorentzVector vkstar; - TLorentzVector vphi; + ROOT::Math::PxPyPzMVector v0; + ROOT::Math::PxPyPzMVector v1; + ROOT::Math::PxPyPzMVector v01; + ROOT::Math::PxPyPzMVector vkstar; + ROOT::Math::PxPyPzMVector vphi; for (const auto& mccollision : mccollisions) { if (mccollision.generatorsID() != generatedId) continue; @@ -1236,11 +1265,11 @@ struct SginclusivePhiKstarSD { for (const auto& [tr1, tr2] : combinations(partSlice, partSlice)) { if ((tr1.pdgCode() == kKPlus && tr2.pdgCode() == kPiMinus) || (tr1.pdgCode() == kKMinus && tr2.pdgCode() == kPiPlus) || (tr1.pdgCode() == kPiPlus && tr2.pdgCode() == kKMinus) || (tr1.pdgCode() == kPiMinus && tr2.pdgCode() == kKPlus)) { if (std::abs(tr1.pdgCode()) == kKPlus) { - v0.SetXYZM(tr1.px(), tr1.py(), tr1.pz(), o2::constants::physics::MassKaonCharged); - v1.SetXYZM(tr2.px(), tr2.py(), tr2.pz(), o2::constants::physics::MassPionCharged); + v0.SetCoordinates(tr1.px(), tr1.py(), tr1.pz(), o2::constants::physics::MassKaonCharged); + v1.SetCoordinates(tr2.px(), tr2.py(), tr2.pz(), o2::constants::physics::MassPionCharged); } else { - v0.SetXYZM(tr1.px(), tr1.py(), tr1.pz(), o2::constants::physics::MassPionCharged); - v1.SetXYZM(tr2.px(), tr2.py(), tr2.pz(), o2::constants::physics::MassKaonCharged); + v0.SetCoordinates(tr1.px(), tr1.py(), tr1.pz(), o2::constants::physics::MassPionCharged); + v1.SetCoordinates(tr2.px(), tr2.py(), tr2.pz(), o2::constants::physics::MassKaonCharged); } if (!tr1.isPhysicalPrimary() || !tr2.isPhysicalPrimary()) continue; @@ -1255,7 +1284,7 @@ struct SginclusivePhiKstarSD { if (tr1.has_mothers() && tr2.has_mothers()) { for (const auto& mother : tr1.mothers_as()) { if (std::abs(mother.pdgCode()) == o2::constants::physics::Pdg::kK0Star892) { - vkstar.SetXYZM(mother.px(), mother.py(), mother.pz(), o2::constants::physics::MassK0Star892); + vkstar.SetCoordinates(mother.px(), mother.py(), mother.pz(), o2::constants::physics::MassK0Star892); registry.get(HIST("MC/accMPtRap_kstar_G"))->Fill(vkstar.M(), vkstar.Pt(), vkstar.Rapidity(), 1.); flag = true; } @@ -1279,8 +1308,8 @@ struct SginclusivePhiKstarSD { if (std::abs(tr1.pdgCode()) != kKPlus || std::abs(tr2.pdgCode()) != kKPlus) continue; - v0.SetXYZM(tr1.px(), tr1.py(), tr1.pz(), o2::constants::physics::MassKaonCharged); - v1.SetXYZM(tr2.px(), tr2.py(), tr2.pz(), o2::constants::physics::MassKaonCharged); + v0.SetCoordinates(tr1.px(), tr1.py(), tr1.pz(), o2::constants::physics::MassKaonCharged); + v1.SetCoordinates(tr2.px(), tr2.py(), tr2.pz(), o2::constants::physics::MassKaonCharged); if (tr1.pdgCode() == tr2.pdgCode()) continue; v01 = v0 + v1; @@ -1296,7 +1325,7 @@ struct SginclusivePhiKstarSD { if (tr1.has_mothers() && tr2.has_mothers()) { for (const auto& mother : tr1.mothers_as()) { if (std::abs(mother.pdgCode()) == o2::constants::physics::Pdg::kPhi) { - vphi.SetXYZM(mother.px(), mother.py(), mother.pz(), o2::constants::physics::MassPhi); + vphi.SetCoordinates(mother.px(), mother.py(), mother.pz(), o2::constants::physics::MassPhi); registry.get(HIST("MC/accMPtRap_phi_G"))->Fill(vphi.M(), vphi.Pt(), vphi.Rapidity(), 1.); flag = true; } @@ -1349,8 +1378,8 @@ struct SginclusivePhiKstarSD { std::vector parameters = {pvCut, dcazCut, dcaxyCut, tpcChi2Cut, tpcNClsFindableCut, itsChi2Cut, etaCut, ptCut}; int truegapSide = sgSelector.trueGap(collision, fitCut[0], fitCut[1], fitCut[2], zdcCut); registry.get(HIST("Reco/Stat"))->Fill(4.0, 1.); - Partition pvContributors = aod::udtrack::isPVContributor == true; - pvContributors.bindTable(tracks); + // Partition pvContributors = aod::udtrack::isPVContributor == true; + // pvContributors.bindTable(tracks); if (std::abs(collision.posZ()) > vzCut) return; if (std::abs(collision.occupancyInTime()) > occCut) @@ -1358,16 +1387,16 @@ struct SginclusivePhiKstarSD { registry.get(HIST("Reco/Stat"))->Fill(truegapSide, 1.); if (truegapSide != gapsideMC) return; - registry.get(HIST("Reco/nPVContributors"))->Fill(pvContributors.size(), 1.); - TLorentzVector vphi; - TLorentzVector vkstar; - TLorentzVector v0; - TLorentzVector vr0; - TLorentzVector vr1; - TLorentzVector vr01; - TLorentzVector vr0g; - TLorentzVector vr1g; - TLorentzVector vr01g; + // registry.get(HIST("Reco/nPVContributors"))->Fill(pvContributors.size(), 1.); + ROOT::Math::PxPyPzMVector vphi; + ROOT::Math::PxPyPzMVector vkstar; + ROOT::Math::PxPyPzMVector v0; + ROOT::Math::PxPyPzMVector vr0; + ROOT::Math::PxPyPzMVector vr1; + ROOT::Math::PxPyPzMVector vr01; + ROOT::Math::PxPyPzMVector vr0g; + ROOT::Math::PxPyPzMVector vr1g; + ROOT::Math::PxPyPzMVector vr01g; int t1 = 0; if (truegapSide == 0) { registry.fill(HIST("V0A_0_mc"), collision.totalFV0AmplitudeA()); @@ -1401,7 +1430,7 @@ struct SginclusivePhiKstarSD { registry.get(HIST("Reco/tr_chi2ncl_2"))->Fill(tr1.tpcChi2NCl(), 1.); registry.get(HIST("Reco/tr_tpcnclfind_2"))->Fill(tr1.tpcNClsFindable(), 1.); registry.get(HIST("Reco/tr_itsChi2NCl_2"))->Fill(tr1.itsChi2NCl(), 1.); - v0.SetXYZM(tr1.px(), tr1.py(), tr1.pz(), o2::constants::physics::MassPionCharged); + v0.SetCoordinates(tr1.px(), tr1.py(), tr1.pz(), o2::constants::physics::MassPionCharged); registry.fill(HIST("tpc_dedx_mc"), v0.P(), tr1.tpcSignal()); registry.fill(HIST("tof_beta_mc"), v0.P(), tr1.beta()); @@ -1421,7 +1450,7 @@ struct SginclusivePhiKstarSD { } t1++; - vr0.SetXYZM(tr1.px(), tr1.py(), tr1.pz(), o2::constants::physics::MassKaonCharged); + vr0.SetCoordinates(tr1.px(), tr1.py(), tr1.pz(), o2::constants::physics::MassKaonCharged); registry.get(HIST("Reco/trpt"))->Fill(vr0.Pt(), 1.); registry.get(HIST("Reco/treta_k"))->Fill(vr0.Eta(), 1.); if (!selectionPIDKaon1(tr1)) @@ -1437,7 +1466,7 @@ struct SginclusivePhiKstarSD { if (t2 > t1) { if (!selectionPIDKaon1(tr2)) continue; - vr1.SetXYZM(tr2.px(), tr2.py(), tr2.pz(), o2::constants::physics::MassKaonCharged); + vr1.SetCoordinates(tr2.px(), tr2.py(), tr2.pz(), o2::constants::physics::MassKaonCharged); auto mcPart2 = tr2.udMcParticle(); if (std::abs(mcPart2.globalIndex() - mcPart1.globalIndex()) != 1) continue; @@ -1452,7 +1481,7 @@ struct SginclusivePhiKstarSD { if (mcPart1.has_mothers() && mcPart2.has_mothers()) { for (const auto& mother : mcPart1.mothers_as()) { if (std::abs(mother.pdgCode()) == o2::constants::physics::Pdg::kPhi) { - vphi.SetXYZM(mother.px(), mother.py(), mother.pz(), o2::constants::physics::MassPhi); + vphi.SetCoordinates(mother.px(), mother.py(), mother.pz(), o2::constants::physics::MassPhi); registry.get(HIST("MC/accMPtRap_phi_T"))->Fill(vphi.M(), vphi.Pt(), vphi.Rapidity(), 1.); flag = true; } @@ -1463,8 +1492,8 @@ struct SginclusivePhiKstarSD { } } } - vr0g.SetXYZM(mcPart1.px(), mcPart1.py(), mcPart1.pz(), o2::constants::physics::MassKaonCharged); - vr1g.SetXYZM(mcPart2.px(), mcPart2.py(), mcPart2.pz(), o2::constants::physics::MassKaonCharged); + vr0g.SetCoordinates(mcPart1.px(), mcPart1.py(), mcPart1.pz(), o2::constants::physics::MassKaonCharged); + vr1g.SetCoordinates(mcPart2.px(), mcPart2.py(), mcPart2.pz(), o2::constants::physics::MassKaonCharged); vr01g = vr0g + vr1g; vr01 = vr0 + vr1; @@ -1499,10 +1528,10 @@ struct SginclusivePhiKstarSD { if (tr1.sign() * tr2.sign() > 0) continue; - vr0.SetXYZM(tr1.px(), tr1.py(), tr1.pz(), o2::constants::physics::MassPionCharged); - vr1.SetXYZM(tr2.px(), tr2.py(), tr2.pz(), o2::constants::physics::MassKaonCharged); - vr0g.SetXYZM(mcPart1.px(), mcPart1.py(), mcPart1.pz(), o2::constants::physics::MassPionCharged); - vr1g.SetXYZM(mcPart2.px(), mcPart2.py(), mcPart2.pz(), o2::constants::physics::MassKaonCharged); + vr0.SetCoordinates(tr1.px(), tr1.py(), tr1.pz(), o2::constants::physics::MassPionCharged); + vr1.SetCoordinates(tr2.px(), tr2.py(), tr2.pz(), o2::constants::physics::MassKaonCharged); + vr0g.SetCoordinates(mcPart1.px(), mcPart1.py(), mcPart1.pz(), o2::constants::physics::MassPionCharged); + vr1g.SetCoordinates(mcPart2.px(), mcPart2.py(), mcPart2.pz(), o2::constants::physics::MassKaonCharged); vr01g = vr0g + vr1g; vr01 = vr0 + vr1; if (!trackselector(tr1, parameters) || !trackselector(tr2, parameters)) { @@ -1514,7 +1543,7 @@ struct SginclusivePhiKstarSD { if (mcPart1.has_mothers() && mcPart2.has_mothers()) { for (const auto& mother : mcPart1.mothers_as()) { if (std::abs(mother.pdgCode()) == o2::constants::physics::Pdg::kK0Star892) { - vkstar.SetXYZM(mother.px(), mother.py(), mother.pz(), o2::constants::physics::MassK0Star892); + vkstar.SetCoordinates(mother.px(), mother.py(), mother.pz(), o2::constants::physics::MassK0Star892); registry.get(HIST("MC/accMPtRap_kstar_T"))->Fill(vkstar.M(), vkstar.Pt(), vkstar.Rapidity(), 1.); flag = true; } From f767b84ff5ac922b08bfccc37e12120a86df555e Mon Sep 17 00:00:00 2001 From: ariedel-cern <85537041+ariedel-cern@users.noreply.github.com> Date: Wed, 11 Jun 2025 18:01:37 +0200 Subject: [PATCH 1577/1650] [Trigger,PWGCF] Fix order of enums (#11545) --- EventFiltering/PWGCF/CFFilterAll.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EventFiltering/PWGCF/CFFilterAll.cxx b/EventFiltering/PWGCF/CFFilterAll.cxx index 589228edc5f..efc7625b215 100644 --- a/EventFiltering/PWGCF/CFFilterAll.cxx +++ b/EventFiltering/PWGCF/CFFilterAll.cxx @@ -61,8 +61,8 @@ enum CFTriggers { kPPRho, kPD, kLD, - kRhoD, kPhiD, + kRhoD, kNTriggers }; From 8127a20f97c65738b56642ac20a51c291f6da882 Mon Sep 17 00:00:00 2001 From: Felix Schlepper Date: Wed, 11 Jun 2025 20:09:12 +0200 Subject: [PATCH 1578/1650] [PWGLF] do not include ITS internal code (#11540) --- .../Strangeness/Converters/CMakeLists.txt | 10 +++++----- .../Strangeness/Converters/straevselsconverter2.cxx | 11 ++++++----- .../Strangeness/Converters/straevselsconverter3.cxx | 11 ++++++----- .../Strangeness/Converters/straevselsconverter4.cxx | 8 ++++---- .../Strangeness/Converters/straevselsconverter5.cxx | 10 +++++----- 5 files changed, 26 insertions(+), 24 deletions(-) diff --git a/PWGLF/TableProducer/Strangeness/Converters/CMakeLists.txt b/PWGLF/TableProducer/Strangeness/Converters/CMakeLists.txt index 131672fd384..842137dafe1 100644 --- a/PWGLF/TableProducer/Strangeness/Converters/CMakeLists.txt +++ b/PWGLF/TableProducer/Strangeness/Converters/CMakeLists.txt @@ -41,22 +41,22 @@ o2physics_add_dpl_workflow(straevselsconverter o2physics_add_dpl_workflow(straevselsconverter2 SOURCES straevselsconverter2.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::ITStracking + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::ReconstructionDataFormats COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(straevselsconverter3 SOURCES straevselsconverter3.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::ITStracking + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::ReconstructionDataFormats COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(straevselsconverter4 SOURCES straevselsconverter4.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::ITStracking + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(straevselsconverter5 SOURCES straevselsconverter5.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::ITStracking O2Physics::AnalysisCCDB + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::AnalysisCCDB COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(straevselsconverter2rawcents @@ -117,4 +117,4 @@ o2physics_add_dpl_workflow(stramccollisionconverter2 o2physics_add_dpl_workflow(zdcneutronsconverter SOURCES zdcneutronsconverter.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore - COMPONENT_NAME Analysis) \ No newline at end of file + COMPONENT_NAME Analysis) diff --git a/PWGLF/TableProducer/Strangeness/Converters/straevselsconverter2.cxx b/PWGLF/TableProducer/Strangeness/Converters/straevselsconverter2.cxx index 401b04bbc83..fd3ccad4ee4 100644 --- a/PWGLF/TableProducer/Strangeness/Converters/straevselsconverter2.cxx +++ b/PWGLF/TableProducer/Strangeness/Converters/straevselsconverter2.cxx @@ -8,12 +8,13 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "ITStracking/Vertexer.h" #include "PWGLF/DataModel/LFStrangenessTables.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/runDataProcessing.h" +#include "ReconstructionDataFormats/Vertex.h" + using namespace o2; using namespace o2::framework; @@ -52,7 +53,7 @@ struct straevselsconverter2 { values.totalFDDAmplitudeC(), values.energyCommonZNA(), values.energyCommonZNC(), - o2::its::Vertex::FlagsMask /*dummy flag value*/); + o2::dataformats::Vertex::FlagsMask /*dummy flag value*/); } } }; diff --git a/PWGLF/TableProducer/Strangeness/Converters/straevselsconverter3.cxx b/PWGLF/TableProducer/Strangeness/Converters/straevselsconverter3.cxx index ecbd738f5fa..ac209c26fe7 100644 --- a/PWGLF/TableProducer/Strangeness/Converters/straevselsconverter3.cxx +++ b/PWGLF/TableProducer/Strangeness/Converters/straevselsconverter3.cxx @@ -8,12 +8,13 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "ITStracking/Vertexer.h" #include "PWGLF/DataModel/LFStrangenessTables.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/runDataProcessing.h" +#include "ReconstructionDataFormats/Vertex.h" + using namespace o2; using namespace o2::framework; @@ -53,7 +54,7 @@ struct straevselsconverter3 { values.totalFDDAmplitudeC(), values.energyCommonZNA(), values.energyCommonZNC(), - o2::its::Vertex::FlagsMask /*dummy flag value*/); + o2::dataformats::Vertex::FlagsMask /*dummy flag value*/); } } }; diff --git a/PWGLF/TableProducer/Strangeness/Converters/straevselsconverter4.cxx b/PWGLF/TableProducer/Strangeness/Converters/straevselsconverter4.cxx index ad988fd93aa..2dc55f365c9 100644 --- a/PWGLF/TableProducer/Strangeness/Converters/straevselsconverter4.cxx +++ b/PWGLF/TableProducer/Strangeness/Converters/straevselsconverter4.cxx @@ -8,12 +8,12 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "ITStracking/Vertexer.h" #include "PWGLF/DataModel/LFStrangenessTables.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/runDataProcessing.h" + using namespace o2; using namespace o2::framework; diff --git a/PWGLF/TableProducer/Strangeness/Converters/straevselsconverter5.cxx b/PWGLF/TableProducer/Strangeness/Converters/straevselsconverter5.cxx index f9617c42a0b..0ba066f99b3 100644 --- a/PWGLF/TableProducer/Strangeness/Converters/straevselsconverter5.cxx +++ b/PWGLF/TableProducer/Strangeness/Converters/straevselsconverter5.cxx @@ -8,13 +8,13 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" + #include "CCDB/BasicCCDBManager.h" #include "DataFormatsParameters/AggregatedRunInfo.h" -#include "ITStracking/Vertexer.h" -#include "PWGLF/DataModel/LFStrangenessTables.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/runDataProcessing.h" using namespace o2; using namespace o2::framework; From 0a2591dc056498ae2e0f2a5c8fddda6151abb8a0 Mon Sep 17 00:00:00 2001 From: prottayCMT <61418725+prottayCMT@users.noreply.github.com> Date: Wed, 11 Jun 2025 21:43:09 +0200 Subject: [PATCH 1579/1650] [PWGLF] removed globalindex to index in addition to filters (#11565) Co-authored-by: Prottay Das --- .../Tasks/Strangeness/taskLambdaSpinCorr.cxx | 87 +++++++++++-------- 1 file changed, 50 insertions(+), 37 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx index 00a2d9707f5..33157c327bf 100644 --- a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx +++ b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx @@ -13,36 +13,41 @@ /// \brief Analysis task for Lambda spin spin correlation /// /// \author prottay.das@cern.ch +/// \author sourav.kundu@cern.ch -#include -#include -#include -#include -#include "Math/Vector2D.h" -#include "Math/Vector3D.h" -#include "Math/Vector4D.h" -#include "Math/GenVector/Boost.h" +#include "PWGLF/DataModel/LFStrangenessPIDTables.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" +#include "PWGMM/Mult/DataModel/Index.h" // for Particles2Tracks table -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/HistogramRegistry.h" -#include "Framework/StepTHn.h" -#include "Common/DataModel/PIDResponse.h" -#include "Common/DataModel/Multiplicity.h" +#include "Common/Core/TrackSelection.h" +#include "Common/Core/trackUtilities.h" #include "Common/DataModel/Centrality.h" -#include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/EventSelection.h" -#include "Common/Core/trackUtilities.h" +#include "Common/DataModel/FT0Corrected.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/TrackSelectionTables.h" + +#include "CCDB/BasicCCDBManager.h" #include "CommonConstants/PhysicsConstants.h" -#include "Common/Core/TrackSelection.h" #include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/StepTHn.h" +#include "Framework/runDataProcessing.h" #include "ReconstructionDataFormats/Track.h" -#include "CCDB/BasicCCDBManager.h" -#include "PWGLF/DataModel/LFStrangenessTables.h" -#include "PWGLF/DataModel/LFStrangenessPIDTables.h" -#include "Common/DataModel/FT0Corrected.h" -#include "PWGMM/Mult/DataModel/Index.h" // for Particles2Tracks table + +#include "Math/GenVector/Boost.h" +#include "Math/Vector2D.h" +#include "Math/Vector3D.h" +#include "Math/Vector4D.h" + +#include + +#include +#include +#include using namespace o2; using namespace o2::framework; @@ -66,7 +71,6 @@ struct LfTaskLambdaSpinCorr { // mixing Configurable cosCalculation{"cosCalculation", 0, "cos calculation"}; Configurable mixingCombination{"mixingCombination", 0, "mixing Combination"}; - Configurable mixingEvSel{"mixingEvSel", false, "mixingEvSel"}; Configurable cfgCutOccupancy{"cfgCutOccupancy", 2000, "Occupancy cut"}; ConfigurableAxis axisVertex{"axisVertex", {5, -10, 10}, "vertex axis for bin"}; ConfigurableAxis axisMultiplicityClass{"axisMultiplicityClass", {8, 0, 80}, "multiplicity percentile for bin"}; @@ -94,13 +98,13 @@ struct LfTaskLambdaSpinCorr { Configurable confV0PtMin{"confV0PtMin", 0.f, "Minimum transverse momentum of V0"}; Configurable confV0PtMax{"confV0PtMax", 0.f, "Maximum transverse momentum of V0"}; Configurable confV0Rap{"confV0Rap", 0.8f, "Rapidity range of V0"}; - Configurable confV0DCADaughMax{"confV0DCADaughMax", 0.2f, "Maximum DCA between the V0 daughters"}; + Configurable confV0DCADaughMax{"confV0DCADaughMax", 0.2f, "Maximum DCA between the V0 daughters"}; Configurable confV0CPAMin{"confV0CPAMin", 0.9998f, "Minimum CPA of V0"}; Configurable confV0TranRadV0Min{"confV0TranRadV0Min", 1.5f, "Minimum transverse radius"}; Configurable confV0TranRadV0Max{"confV0TranRadV0Max", 100.f, "Maximum transverse radius"}; Configurable cMaxV0DCA{"cMaxV0DCA", 1.2, "Maximum V0 DCA to PV"}; - Configurable cMinV0DCAPr{"cMinV0DCAPr", 0.05, "Minimum V0 daughters DCA to PV for Pr"}; - Configurable cMinV0DCAPi{"cMinV0DCAPi", 0.05, "Minimum V0 daughters DCA to PV for Pi"}; + Configurable cMinV0DCAPr{"cMinV0DCAPr", 0.05, "Minimum V0 daughters DCA to PV for Pr"}; + Configurable cMinV0DCAPi{"cMinV0DCAPi", 0.05, "Minimum V0 daughters DCA to PV for Pi"}; Configurable cMaxV0LifeTime{"cMaxV0LifeTime", 20, "Maximum V0 life time"}; // config for V0 daughters @@ -610,7 +614,7 @@ struct LfTaskLambdaSpinCorr { if (additionalEvSel4 && !collision1.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { continue; } - if (mixingEvSel && additionalEvSel5 && !collision1.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + if (additionalEvSel5 && !collision1.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { continue; } @@ -620,7 +624,7 @@ struct LfTaskLambdaSpinCorr { if (additionalEvSel4 && !collision2.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { continue; } - if (mixingEvSel && additionalEvSel5 && !collision2.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + if (additionalEvSel5 && !collision2.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { continue; } @@ -795,7 +799,11 @@ struct LfTaskLambdaSpinCorr { } PROCESS_SWITCH(LfTaskLambdaSpinCorr, processME, "Process data ME", true); - void processDerivedData(soa::Join::iterator const& collision, v0Candidates const& V0s, dauTracks const&) + Filter v0der = (nabs(aod::v0data::dcapostopv) > cMinV0DCAPr && nabs(aod::v0data::dcanegtopv) > cMinV0DCAPi && nabs(aod::v0data::dcaV0daughters) < confV0DCADaughMax); + using v0Cand = soa::Filtered; + + // void processDerivedData(soa::Join::iterator const& collision, v0Candidates const& V0s, dauTracks const&) + void processDerivedData(soa::Join::iterator const& collision, v0Cand const& V0s, dauTracks const&) { histos.fill(HIST("hEvtSelInfo"), 0.5); if (rctCut.requireRCTFlagChecker && !rctChecker(collision)) { @@ -914,8 +922,10 @@ struct LfTaskLambdaSpinCorr { } PROCESS_SWITCH(LfTaskLambdaSpinCorr, processDerivedData, "Process derived data", true); - Preslice tracksPerCollisionV0Mixed = o2::aod::v0data::straCollisionId; // for derived data only - void processDerivedDataMixed(soa::Join const& collisions, v0Candidates const& V0s, dauTracks const&) + // Preslice tracksPerCollisionV0Mixed = o2::aod::v0data::straCollisionId; // for derived data only + Preslice tracksPerCollisionV0Mixed = o2::aod::v0data::straCollisionId; // for derived data only + // void processDerivedDataMixed(soa::Join const& collisions, v0Candidates const& V0s, dauTracks const&) + void processDerivedDataMixed(soa::Join const& collisions, v0Cand const& V0s, dauTracks const&) { @@ -954,7 +964,7 @@ struct LfTaskLambdaSpinCorr { if (additionalEvSel4 && !collision1.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { continue; } - if (mixingEvSel && additionalEvSel5 && !collision1.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + if (additionalEvSel5 && !collision1.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { continue; } @@ -964,13 +974,16 @@ struct LfTaskLambdaSpinCorr { if (additionalEvSel4 && !collision2.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { continue; } - if (mixingEvSel && additionalEvSel5 && !collision2.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { + if (additionalEvSel5 && !collision2.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll)) { continue; } auto centrality = collision1.centFT0C(); - auto groupV01 = V0s.sliceBy(tracksPerCollisionV0Mixed, collision1.globalIndex()); - auto groupV02 = V0s.sliceBy(tracksPerCollisionV0Mixed, collision1.globalIndex()); - auto groupV03 = V0s.sliceBy(tracksPerCollisionV0Mixed, collision2.globalIndex()); + // auto groupV01 = V0s.sliceBy(tracksPerCollisionV0Mixed, collision1.globalIndex()); + // auto groupV02 = V0s.sliceBy(tracksPerCollisionV0Mixed, collision1.globalIndex()); + // auto groupV03 = V0s.sliceBy(tracksPerCollisionV0Mixed, collision2.globalIndex()); + auto groupV01 = V0s.sliceBy(tracksPerCollisionV0Mixed, collision1.index()); + auto groupV02 = V0s.sliceBy(tracksPerCollisionV0Mixed, collision1.index()); + auto groupV03 = V0s.sliceBy(tracksPerCollisionV0Mixed, collision2.index()); size_t rows = groupV03.size() + 20; size_t cols = groupV01.size() + 20; From d37782d24def4b2f8477a42f3015a9890b90af03 Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Thu, 12 Jun 2025 07:21:44 +0800 Subject: [PATCH 1580/1650] [PWGCF] flowtask: ccdb set to now. diHadron: add event weight (#11569) --- PWGCF/Flow/Tasks/flowTask.cxx | 4 +- .../Tasks/diHadronCor.cxx | 155 ++++++++++-------- 2 files changed, 88 insertions(+), 71 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowTask.cxx b/PWGCF/Flow/Tasks/flowTask.cxx index 5431a84bd47..4390131be3a 100644 --- a/PWGCF/Flow/Tasks/flowTask.cxx +++ b/PWGCF/Flow/Tasks/flowTask.cxx @@ -132,7 +132,6 @@ struct FlowTask { // Connect to ccdb Service ccdb; - Configurable ccdbNoLaterThan{"ccdbNoLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; // Define output @@ -196,7 +195,8 @@ struct FlowTask { ccdb->setURL(ccdbUrl.value); ccdb->setCaching(true); - ccdb->setCreatedNotAfter(ccdbNoLaterThan.value); + auto now = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); + ccdb->setCreatedNotAfter(now); // Add some output objects to the histogram registry // Event QA diff --git a/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx b/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx index 4a944a4fff0..189e201ef68 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx @@ -78,7 +78,6 @@ struct DiHadronCor { O2_DEFINE_CONFIGURABLE(cfgCentEstimator, int, 0, "0:FT0C; 1:FT0CVariant1; 2:FT0M; 3:FT0A") O2_DEFINE_CONFIGURABLE(cfgCentTableUnavailable, bool, false, "if a dataset does not provide centrality information") O2_DEFINE_CONFIGURABLE(cfgUseAdditionalEventCut, bool, false, "Use additional event cut on mult correlations") - O2_DEFINE_CONFIGURABLE(cfgUseTentativeEventCounter, bool, false, "After sel8(), count events regardless of real event selection") O2_DEFINE_CONFIGURABLE(cfgEvSelkNoSameBunchPileup, bool, false, "rejects collisions which are associated with the same found-by-T0 bunch crossing") O2_DEFINE_CONFIGURABLE(cfgEvSelkIsGoodZvtxFT0vsPV, bool, false, "removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference, use this cut at low multiplicities with caution") O2_DEFINE_CONFIGURABLE(cfgEvSelkNoCollInTimeRangeStandard, bool, false, "no collisions in specified time range") @@ -93,6 +92,7 @@ struct DiHadronCor { O2_DEFINE_CONFIGURABLE(cfgEfficiency, std::string, "", "CCDB path to efficiency object") O2_DEFINE_CONFIGURABLE(cfgLocalEfficiency, bool, false, "Use local efficiency object") O2_DEFINE_CONFIGURABLE(cfgVerbosity, bool, false, "Verbose output") + O2_DEFINE_CONFIGURABLE(cfgUseEventWeights, bool, false, "Use event weights for mixed event") SliceCache cache; @@ -184,29 +184,18 @@ struct DiHadronCor { LOGF(info, "Starting init"); // Event Counter - registry.add("hEventCountSpecific", "Number of Event;; Count", {HistType::kTH1D, {{10, 0, 10}}}); - registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(1, "after sel8"); - registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(2, "kNoSameBunchPileup"); - registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(3, "kIsGoodZvtxFT0vsPV"); - registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(4, "kNoCollInTimeRangeStandard"); - registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(5, "kIsGoodITSLayersAll"); - registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(6, "kNoCollInRofStandard"); - registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(7, "kNoHighMultCollInPrevRof"); - registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(8, "occupancy"); - registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(9, "MultCorrelation"); - registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(10, "cfgEvSelV0AT0ACut"); - if (cfgUseTentativeEventCounter) { - registry.add("hEventCountTentative", "Number of Event;; Count", {HistType::kTH1D, {{10, 0, 10}}}); - registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(1, "after sel8"); - registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(2, "kNoSameBunchPileup"); - registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(3, "kIsGoodZvtxFT0vsPV"); - registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(4, "kNoCollInTimeRangeStandard"); - registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(5, "kIsGoodITSLayersAll"); - registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(6, "kNoCollInRofStandard"); - registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(7, "kNoHighMultCollInPrevRof"); - registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(8, "occupancy"); - registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(9, "MultCorrelation"); - registry.get(HIST("hEventCountTentative"))->GetXaxis()->SetBinLabel(10, "cfgEvSelV0AT0ACut"); + if (doprocessSame && cfgUseAdditionalEventCut) { + registry.add("hEventCountSpecific", "Number of Event;; Count", {HistType::kTH1D, {{10, 0, 10}}}); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(1, "after sel8"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(2, "kNoSameBunchPileup"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(3, "kIsGoodZvtxFT0vsPV"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(4, "kNoCollInTimeRangeStandard"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(5, "kIsGoodITSLayersAll"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(6, "kNoCollInRofStandard"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(7, "kNoHighMultCollInPrevRof"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(8, "occupancy"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(9, "MultCorrelation"); + registry.get(HIST("hEventCountSpecific"))->GetXaxis()->SetBinLabel(10, "cfgEvSelV0AT0ACut"); } if (cfgUseAdditionalEventCut) { @@ -226,23 +215,24 @@ struct DiHadronCor { fT0AV0ASigma->SetParameters(463.4144, 6.796509e-02, -9.097136e-07, 7.971088e-12, -2.600581e-17); } - // Make histograms to check the distributions after cuts - registry.add("deltaEta_deltaPhi_same", "", {HistType::kTH2D, {axisDeltaPhi, axisDeltaEta}}); // check to see the delta eta and delta phi distribution - registry.add("deltaEta_deltaPhi_mixed", "", {HistType::kTH2D, {axisDeltaPhi, axisDeltaEta}}); - registry.add("Phi", "Phi", {HistType::kTH1D, {axisPhi}}); - registry.add("Eta", "Eta", {HistType::kTH1D, {axisEta}}); - registry.add("EtaCorrected", "EtaCorrected", {HistType::kTH1D, {axisEta}}); - registry.add("pT", "pT", {HistType::kTH1D, {axisPtTrigger}}); - registry.add("pTCorrected", "pTCorrected", {HistType::kTH1D, {axisPtTrigger}}); - registry.add("Nch", "N_{ch}", {HistType::kTH1D, {axisMultiplicity}}); - registry.add("Nch_used", "N_{ch}", {HistType::kTH1D, {axisMultiplicity}}); // histogram to see how many events are in the same and mixed event std::string hCentTitle = "Centrality distribution, Estimator " + std::to_string(cfgCentEstimator); - registry.add("Centrality", hCentTitle.c_str(), {HistType::kTH1D, {axisCentrality}}); - registry.add("Centrality_used", hCentTitle.c_str(), {HistType::kTH1D, {axisCentrality}}); // histogram to see how many events are in the same and mixed event - registry.add("zVtx", "zVtx", {HistType::kTH1D, {axisVertex}}); - registry.add("zVtx_used", "zVtx_used", {HistType::kTH1D, {axisVertex}}); - - registry.add("Trig_hist", "", {HistType::kTHnSparseF, {{axisSample, axisVertex, axisPtTrigger}}}); + // Make histograms to check the distributions after cuts + if (doprocessSame) { + registry.add("deltaEta_deltaPhi_same", "", {HistType::kTH2D, {axisDeltaPhi, axisDeltaEta}}); // check to see the delta eta and delta phi distribution + registry.add("deltaEta_deltaPhi_mixed", "", {HistType::kTH2D, {axisDeltaPhi, axisDeltaEta}}); + registry.add("Phi", "Phi", {HistType::kTH1D, {axisPhi}}); + registry.add("Eta", "Eta", {HistType::kTH1D, {axisEta}}); + registry.add("EtaCorrected", "EtaCorrected", {HistType::kTH1D, {axisEta}}); + registry.add("pT", "pT", {HistType::kTH1D, {axisPtTrigger}}); + registry.add("pTCorrected", "pTCorrected", {HistType::kTH1D, {axisPtTrigger}}); + registry.add("Nch", "N_{ch}", {HistType::kTH1D, {axisMultiplicity}}); + registry.add("Nch_used", "N_{ch}", {HistType::kTH1D, {axisMultiplicity}}); // histogram to see how many events are in the same and mixed event + registry.add("Centrality", hCentTitle.c_str(), {HistType::kTH1D, {axisCentrality}}); + registry.add("Centrality_used", hCentTitle.c_str(), {HistType::kTH1D, {axisCentrality}}); // histogram to see how many events are in the same and mixed event + registry.add("zVtx", "zVtx", {HistType::kTH1D, {axisVertex}}); + registry.add("zVtx_used", "zVtx_used", {HistType::kTH1D, {axisVertex}}); + registry.add("Trig_hist", "", {HistType::kTHnSparseF, {{axisSample, axisVertex, axisPtTrigger}}}); + } registry.add("eventcount", "bin", {HistType::kTH1F, {{4, 0, 4, "bin"}}}); // histogram to see how many events are in the same and mixed event if (doprocessMCSame && doprocessOntheflySame) { @@ -263,6 +253,13 @@ struct DiHadronCor { registry.add("MCTrue/MCdeltaEta_deltaPhi_same", "", {HistType::kTH2D, {axisDeltaPhi, axisDeltaEta}}); // check to see the delta eta and delta phi distribution registry.add("MCTrue/MCdeltaEta_deltaPhi_mixed", "", {HistType::kTH2D, {axisDeltaPhi, axisDeltaEta}}); } + if (doprocessMCEfficiency) { + registry.add("MCEffeventcount", "bin", {HistType::kTH1F, {{4, 0, 4, "bin"}}}); + registry.get(HIST("MCEffeventcount"))->GetXaxis()->SetBinLabel(1, "MC"); + registry.get(HIST("MCEffeventcount"))->GetXaxis()->SetBinLabel(2, "Reco Primary"); + registry.get(HIST("MCEffeventcount"))->GetXaxis()->SetBinLabel(3, "Reco All"); + registry.get(HIST("MCEffeventcount"))->GetXaxis()->SetBinLabel(4, "Fake"); + } std::vector corrAxis = {{axisSample, "Sample"}, {axisVertex, "z-vtx (cm)"}, @@ -424,7 +421,7 @@ struct DiHadronCor { } template - void fillCorrelations(TTracks tracks1, TTracksAssoc tracks2, float posZ, int system, int magneticField, float cent) // function to fill the Output functions (sparse) and the delta eta and delta phi histograms + void fillCorrelations(TTracks tracks1, TTracksAssoc tracks2, float posZ, int system, int magneticField, float cent, float eventWeight) // function to fill the Output functions (sparse) and the delta eta and delta phi histograms { // Cache efficiency for particles (too many FindBin lookups) if (mEfficiency) { @@ -455,7 +452,7 @@ struct DiHadronCor { if (!getEfficiencyCorrection(triggerWeight, track1.eta(), track1.pt(), posZ)) continue; if (system == SameEvent) { - registry.fill(HIST("Trig_hist"), fSampleIndex, posZ, track1.pt(), triggerWeight); + registry.fill(HIST("Trig_hist"), fSampleIndex, posZ, track1.pt(), eventWeight * triggerWeight); } for (auto const& track2 : tracks2) { @@ -497,18 +494,18 @@ struct DiHadronCor { // fill the right sparse and histograms if (system == SameEvent) { - same->getPairHist()->Fill(step, fSampleIndex, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta, triggerWeight * associatedWeight); - registry.fill(HIST("deltaEta_deltaPhi_same"), deltaPhi, deltaEta, triggerWeight * associatedWeight); + same->getPairHist()->Fill(step, fSampleIndex, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta, eventWeight * triggerWeight * associatedWeight); + registry.fill(HIST("deltaEta_deltaPhi_same"), deltaPhi, deltaEta, eventWeight * triggerWeight * associatedWeight); } else if (system == MixedEvent) { - mixed->getPairHist()->Fill(step, fSampleIndex, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta, triggerWeight * associatedWeight); - registry.fill(HIST("deltaEta_deltaPhi_mixed"), deltaPhi, deltaEta, triggerWeight * associatedWeight); + mixed->getPairHist()->Fill(step, fSampleIndex, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta, eventWeight * triggerWeight * associatedWeight); + registry.fill(HIST("deltaEta_deltaPhi_mixed"), deltaPhi, deltaEta, eventWeight * triggerWeight * associatedWeight); } } } } template - void fillMCCorrelations(TTracks tracks1, TTracksAssoc tracks2, float posZ, int system) // function to fill the Output functions (sparse) and the delta eta and delta phi histograms + void fillMCCorrelations(TTracks tracks1, TTracksAssoc tracks2, float posZ, int system, float eventWeight) // function to fill the Output functions (sparse) and the delta eta and delta phi histograms { int fSampleIndex = gRandom->Uniform(0, cfgSampleSize); @@ -522,7 +519,7 @@ struct DiHadronCor { continue; if (system == SameEvent && (doprocessMCSame || doprocessOntheflySame)) - registry.fill(HIST("MCTrue/MCTrig_hist"), fSampleIndex, posZ, track1.pt(), triggerWeight); + registry.fill(HIST("MCTrue/MCTrig_hist"), fSampleIndex, posZ, track1.pt(), eventWeight * triggerWeight); for (auto const& track2 : tracks2) { @@ -539,13 +536,13 @@ struct DiHadronCor { // fill the right sparse and histograms if (system == SameEvent) { - same->getPairHist()->Fill(step, fSampleIndex, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta, triggerWeight * associatedWeight); + same->getPairHist()->Fill(step, fSampleIndex, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta, eventWeight * triggerWeight * associatedWeight); if (doprocessMCSame || doprocessOntheflySame) - registry.fill(HIST("MCTrue/MCdeltaEta_deltaPhi_same"), deltaPhi, deltaEta, triggerWeight * associatedWeight); + registry.fill(HIST("MCTrue/MCdeltaEta_deltaPhi_same"), deltaPhi, deltaEta, eventWeight * triggerWeight * associatedWeight); } else if (system == MixedEvent) { - mixed->getPairHist()->Fill(step, fSampleIndex, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta, triggerWeight * associatedWeight); + mixed->getPairHist()->Fill(step, fSampleIndex, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta, eventWeight * triggerWeight * associatedWeight); if (doprocessMCMixed || doprocessOntheflyMixed) - registry.fill(HIST("MCTrue/MCdeltaEta_deltaPhi_mixed"), deltaPhi, deltaEta, triggerWeight * associatedWeight); + registry.fill(HIST("MCTrue/MCdeltaEta_deltaPhi_mixed"), deltaPhi, deltaEta, eventWeight * triggerWeight * associatedWeight); } } } @@ -652,7 +649,7 @@ struct DiHadronCor { fillYield(collision, tracks); same->fillEvent(tracks.size(), CorrelationContainer::kCFStepReconstructed); - fillCorrelations(tracks, tracks, collision.posZ(), SameEvent, getMagneticField(bc.timestamp()), cent); + fillCorrelations(tracks, tracks, collision.posZ(), SameEvent, getMagneticField(bc.timestamp()), cent, 1.0f); } PROCESS_SWITCH(DiHadronCor, processSame, "Process same event", true); @@ -671,8 +668,9 @@ struct DiHadronCor { MixedBinning binningOnVtxAndMult{{getTracksSize}, {axisVtxMix, axisMultMix}, true}; auto tracksTuple = std::make_tuple(tracks, tracks); - Pair pair{binningOnVtxAndMult, cfgMixEventNumMin, -1, collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip - for (auto const& [collision1, tracks1, collision2, tracks2] : pair) { + Pair pairs{binningOnVtxAndMult, cfgMixEventNumMin, -1, collisions, tracksTuple, &cache}; // -1 is the number of the bin to skip + for (auto it = pairs.begin(); it != pairs.end(); it++) { + auto& [collision1, tracks1, collision2, tracks2] = *it; if (!collision1.sel8() || !collision2.sel8()) continue; @@ -702,8 +700,12 @@ struct DiHadronCor { registry.fill(HIST("eventcount"), MixedEvent); // fill the mixed event in the 3 bin auto bc = collision1.bc_as(); loadEfficiency(bc.timestamp()); + float eventWeight = 1.0f; + if (cfgUseEventWeights) { + eventWeight = 1.0f / it.currentWindowNeighbours(); + } - fillCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent, getMagneticField(bc.timestamp()), cent1); + fillCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent, getMagneticField(bc.timestamp()), cent1, eventWeight); } } @@ -723,7 +725,7 @@ struct DiHadronCor { } } - void processMCEfficiency(FilteredMcCollisions::iterator const& mcCollision, aod::BCsWithTimestamps const&, soa::SmallGroups> const& collisions, FilteredMcParticles const& mcParticles, FilteredTracksWithMCLabels const& tracks) + void processMCEfficiency(FilteredMcCollisions::iterator const& mcCollision, soa::SmallGroups> const& collisions, FilteredMcParticles const& mcParticles, FilteredTracksWithMCLabels const& tracks) { if (cfgSelCollByNch && (tracks.size() < cfgCutMultMin || tracks.size() >= cfgCutMultMax)) { return; @@ -731,6 +733,7 @@ struct DiHadronCor { // Primaries for (const auto& mcParticle : mcParticles) { if (mcParticle.isPhysicalPrimary()) { + registry.fill(HIST("MCEffeventcount"), 0.5); same->getTrackHistEfficiency()->Fill(CorrelationContainer::MC, mcParticle.eta(), mcParticle.pt(), getSpecies(mcParticle.pdgCode()), 0., mcCollision.posZ()); } } @@ -745,11 +748,14 @@ struct DiHadronCor { if (track.has_mcParticle()) { const auto& mcParticle = track.mcParticle(); if (mcParticle.isPhysicalPrimary()) { + registry.fill(HIST("MCEffeventcount"), 1.5); same->getTrackHistEfficiency()->Fill(CorrelationContainer::RecoPrimaries, mcParticle.eta(), mcParticle.pt(), getSpecies(mcParticle.pdgCode()), 0., mcCollision.posZ()); } + registry.fill(HIST("MCEffeventcount"), 2.5); same->getTrackHistEfficiency()->Fill(CorrelationContainer::RecoAll, mcParticle.eta(), mcParticle.pt(), getSpecies(mcParticle.pdgCode()), 0., mcCollision.posZ()); } else { // fake track + registry.fill(HIST("MCEffeventcount"), 3.5); same->getTrackHistEfficiency()->Fill(CorrelationContainer::Fake, track.eta(), track.pt(), 0, 0., mcCollision.posZ()); } } @@ -791,14 +797,15 @@ struct DiHadronCor { } same->fillEvent(mcParticles.size(), CorrelationContainer::kCFStepAll); - fillMCCorrelations(mcParticles, mcParticles, mcCollision.posZ(), SameEvent); + fillMCCorrelations(mcParticles, mcParticles, mcCollision.posZ(), SameEvent, 1.0f); if (collisions.size() == 0) { return; } + registry.fill(HIST("MCTrue/MCeventcount"), 2.5); same->fillEvent(mcParticles.size(), CorrelationContainer::kCFStepTrackedOnlyPrim); - fillMCCorrelations(mcParticles, mcParticles, mcCollision.posZ(), SameEvent); + fillMCCorrelations(mcParticles, mcParticles, mcCollision.posZ(), SameEvent, 1.0f); } PROCESS_SWITCH(DiHadronCor, processMCSame, "Process MC same event", false); @@ -815,8 +822,9 @@ struct DiHadronCor { MixedBinning binningOnVtxAndMult{{getTracksSize}, {axisVtxMix, axisMultMix}, true}; auto tracksTuple = std::make_tuple(mcParticles, mcParticles); - Pair pair{binningOnVtxAndMult, cfgMixEventNumMin, -1, mcCollisions, tracksTuple, &cache}; // -1 is the number of the bin to skip - for (auto const& [collision1, tracks1, collision2, tracks2] : pair) { + Pair pairs{binningOnVtxAndMult, cfgMixEventNumMin, -1, mcCollisions, tracksTuple, &cache}; // -1 is the number of the bin to skip + for (auto it = pairs.begin(); it != pairs.end(); it++) { + auto& [collision1, tracks1, collision2, tracks2] = *it; if (cfgSelCollByNch && (tracks1.size() < cfgCutMultMin || tracks1.size() >= cfgCutMultMax)) continue; @@ -839,14 +847,18 @@ struct DiHadronCor { continue; registry.fill(HIST("MCTrue/MCeventcount"), MixedEvent); // fill the mixed event in the 3 bin + float eventWeight = 1.0f; + if (cfgUseEventWeights) { + eventWeight = 1.0f / it.currentWindowNeighbours(); + } - fillMCCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent); + fillMCCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent, eventWeight); if (groupedCollisions.size() == 0) { continue; } - fillMCCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent); + fillMCCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent, eventWeight); } } PROCESS_SWITCH(DiHadronCor, processMCMixed, "Process MC mixed events", false); @@ -873,10 +885,10 @@ struct DiHadronCor { } same->fillEvent(mcParticles.size(), CorrelationContainer::kCFStepAll); - fillMCCorrelations(mcParticles, mcParticles, mcCollision.posZ(), SameEvent); + fillMCCorrelations(mcParticles, mcParticles, mcCollision.posZ(), SameEvent, 1.0f); same->fillEvent(mcParticles.size(), CorrelationContainer::kCFStepTrackedOnlyPrim); - fillMCCorrelations(mcParticles, mcParticles, mcCollision.posZ(), SameEvent); + fillMCCorrelations(mcParticles, mcParticles, mcCollision.posZ(), SameEvent, 1.0f); } PROCESS_SWITCH(DiHadronCor, processOntheflySame, "Process on-the-fly same event", false); @@ -893,8 +905,9 @@ struct DiHadronCor { MixedBinning binningOnVtxAndMult{{getTracksSize}, {axisVtxMix, axisMultMix}, true}; auto tracksTuple = std::make_tuple(mcParticles, mcParticles); - Pair pair{binningOnVtxAndMult, cfgMixEventNumMin, -1, mcCollisions, tracksTuple, &cache}; // -1 is the number of the bin to skip - for (auto const& [collision1, tracks1, collision2, tracks2] : pair) { + Pair pairs{binningOnVtxAndMult, cfgMixEventNumMin, -1, mcCollisions, tracksTuple, &cache}; // -1 is the number of the bin to skip + for (auto it = pairs.begin(); it != pairs.end(); it++) { + auto& [collision1, tracks1, collision2, tracks2] = *it; if (cfgSelCollByNch && (tracks1.size() < cfgCutMultMin || tracks1.size() >= cfgCutMultMax)) continue; @@ -903,10 +916,14 @@ struct DiHadronCor { continue; registry.fill(HIST("MCTrue/MCeventcount"), MixedEvent); // fill the mixed event in the 3 bin + float eventWeight = 1.0f; + if (cfgUseEventWeights) { + eventWeight = 1.0f / it.currentWindowNeighbours(); + } - fillMCCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent); + fillMCCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent, eventWeight); - fillMCCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent); + fillMCCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent, eventWeight); } } PROCESS_SWITCH(DiHadronCor, processOntheflyMixed, "Process on-the-fly mixed events", false); From ae5cfdc9678f0d4368c5c5a67884d1483ea8a250 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Thu, 12 Jun 2025 07:23:03 +0200 Subject: [PATCH 1581/1650] [PWGHF,Tutorial] Include What You Use (#11553) --- Tutorials/PWGHF/DataModelMini.h | 7 ++++- Tutorials/PWGHF/skimCreatorMini.cxx | 31 +++++++++++++-------- Tutorials/PWGHF/taskMini.cxx | 42 ++++++++++++++++++----------- 3 files changed, 52 insertions(+), 28 deletions(-) diff --git a/Tutorials/PWGHF/DataModelMini.h b/Tutorials/PWGHF/DataModelMini.h index 7a03f1462b7..720b7207676 100644 --- a/Tutorials/PWGHF/DataModelMini.h +++ b/Tutorials/PWGHF/DataModelMini.h @@ -17,7 +17,12 @@ #ifndef TUTORIALS_PWGHF_DATAMODELMINI_H_ #define TUTORIALS_PWGHF_DATAMODELMINI_H_ -#include "Framework/AnalysisDataModel.h" +#include "Common/Core/RecoDecay.h" + +#include +#include + +#include namespace o2::aod { diff --git a/Tutorials/PWGHF/skimCreatorMini.cxx b/Tutorials/PWGHF/skimCreatorMini.cxx index ac6b12e2004..6fba171cfbf 100644 --- a/Tutorials/PWGHF/skimCreatorMini.cxx +++ b/Tutorials/PWGHF/skimCreatorMini.cxx @@ -14,21 +14,30 @@ /// /// \author Vít Kučera , Inha University -// O2 -#include "CommonConstants/PhysicsConstants.h" -#include "DCAFitter/DCAFitterN.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/AnalysisTask.h" -#include "Framework/HistogramRegistry.h" -#include "Framework/runDataProcessing.h" - -// O2Physics +#include "Tutorials/PWGHF/DataModelMini.h" +// #include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" #include "Common/DataModel/TrackSelectionTables.h" -// PWGHF -#include "Tutorials/PWGHF/DataModelMini.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include using namespace o2; using namespace o2::aod; diff --git a/Tutorials/PWGHF/taskMini.cxx b/Tutorials/PWGHF/taskMini.cxx index 871fe710581..1876d6230cc 100644 --- a/Tutorials/PWGHF/taskMini.cxx +++ b/Tutorials/PWGHF/taskMini.cxx @@ -14,23 +14,33 @@ /// /// \author Vít Kučera , Inha University -// O2 -#include "CommonConstants/PhysicsConstants.h" -#include "DCAFitter/DCAFitterN.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/AnalysisTask.h" -#include "Framework/HistogramRegistry.h" -#include "Framework/runDataProcessing.h" - -// O2Physics +#include "Tutorials/PWGHF/DataModelMini.h" +// +#include "PWGHF/Core/HfHelper.h" +// #include "Common/Core/RecoDecay.h" #include "Common/Core/TrackSelectorPID.h" #include "Common/Core/trackUtilities.h" -#include "Common/DataModel/PIDResponse.h" - -// PWGHF -#include "PWGHF/Core/HfHelper.h" -#include "Tutorials/PWGHF/DataModelMini.h" +#include "Common/DataModel/PIDResponseTOF.h" +#include "Common/DataModel/PIDResponseTPC.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include using namespace o2; using namespace o2::aod; @@ -314,8 +324,8 @@ struct HfTaskMiniD0 { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"hf-task-mini-candidate-creator-2prong"}), // o2-linter: disable=name/o2-task - adaptAnalysisTask(cfgc, TaskName{"hf-task-mini-candidate-creator-2prong-expressions"}), // o2-linter: disable=name/o2-task + adaptAnalysisTask(cfgc, TaskName{"hf-task-mini-candidate-creator-2prong"}), // o2-linter: disable=name/o2-task (wrong hyphenation) + adaptAnalysisTask(cfgc, TaskName{"hf-task-mini-candidate-creator-2prong-expressions"}), // o2-linter: disable=name/o2-task (wrong hyphenation) adaptAnalysisTask(cfgc), adaptAnalysisTask(cfgc)}; } From 004e2f3dab8e012f4f996fdf6acc6eb4b03b0138 Mon Sep 17 00:00:00 2001 From: Simone Ragoni <47641042+siragoni@users.noreply.github.com> Date: Thu, 12 Jun 2025 08:34:43 +0200 Subject: [PATCH 1582/1650] [PWGUD] new task for inclusive MC (#11498) --- PWGUD/Tasks/CMakeLists.txt | 7 +- PWGUD/Tasks/analysisMCDPMJetSGv3.cxx | 412 +++++++++++++++++++++++++++ 2 files changed, 418 insertions(+), 1 deletion(-) create mode 100644 PWGUD/Tasks/analysisMCDPMJetSGv3.cxx diff --git a/PWGUD/Tasks/CMakeLists.txt b/PWGUD/Tasks/CMakeLists.txt index a193e46587e..d828261167c 100644 --- a/PWGUD/Tasks/CMakeLists.txt +++ b/PWGUD/Tasks/CMakeLists.txt @@ -246,5 +246,10 @@ o2physics_add_dpl_workflow(flow-cumulants-upc o2physics_add_dpl_workflow(flow-correlations-upc SOURCES flowCorrelationsUpc.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::AnalysisCCDB O2Physics::PWGCFCore + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::AnalysisCCDB O2Physics::PWGCFCore + COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(analysis-mc-dpm-jet-sg-v3 + SOURCES analysisMCDPMJetSGv3.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore COMPONENT_NAME Analysis) diff --git a/PWGUD/Tasks/analysisMCDPMJetSGv3.cxx b/PWGUD/Tasks/analysisMCDPMJetSGv3.cxx new file mode 100644 index 00000000000..4347871377a --- /dev/null +++ b/PWGUD/Tasks/analysisMCDPMJetSGv3.cxx @@ -0,0 +1,412 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// \file AnalysisMCDPMJetSGv3.cxx +/// \brief Process MC DPMJet events for inclusive studies. +/// +/// \author Simone Ragoni + +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Framework/ASoAHelpers.h" +// #include "TDatabasePDG.h" +#include "PWGUD/Core/UPCHelpers.h" +#include "PWGUD/DataModel/UDTables.h" +// #include "TLorentzVector.h" +// #include "TVector3.h" +#include "Math/LorentzVector.h" // ROOT::Math::LorentzVector +#include "Math/PxPyPzM4D.h" // ROOT::Math::PxPyPzM4D +#include "TMath.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +struct AnalysisMCDPMJetSGv3 { + HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + // TDatabasePDG* fPDG = TDatabasePDG::Instance(); + + Configurable nBinsPt{"nBinsPt", 100, "N bins in pT histo"}; + + // using myCompleteTracks = soa::Join; + // using myFilteredTracks = soa::Filtered; + using BCs = soa::Join; + + Preslice perCollision = aod::track::collisionId; + Preslice perMcCollision = o2::aod::mcparticle::mcCollisionId; + // using MCTCs = soa::Join; + // using MCTC = MCTCs::iterator; + // define abbreviations + using CCs = soa::Join; + using CC = CCs::iterator; + using MCparticles = aod::UDMcParticles::iterator; + using TCs = soa::Join; + // using TCs = soa::Join; + using TC = TCs::iterator; + using LorentzVectorM = ROOT::Math::LorentzVector>; + + double massPion = 0.; + double massKaon = 0.; + double massProton = 0.; + const int codePion = 211; + const int codeKaon = 321; + const int codeProton = 2212; + + void init(InitContext const&) + { + // TParticlePDG* pionPDG = fPDG->GetParticle(codePion); + // if (pionPDG != nullptr) { + // massPion = pionPDG->Mass(); + // } + // TParticlePDG* kaonPDG = fPDG->GetParticle(codeKaon); + // if (kaonPDG != nullptr) { + // massKaon = kaonPDG->Mass(); + // } + // TParticlePDG* protonPDG = fPDG->GetParticle(codeProton); + // if (protonPDG != nullptr) { + // massProton = protonPDG->Mass(); + // } + massPion = o2::constants::physics::MassPionCharged; + massKaon = o2::constants::physics::MassKaonCharged; + massProton = o2::constants::physics::MassProton; + + // define axes you want to use + const AxisSpec axisCounter{10, 0, 10, ""}; + const AxisSpec axisEta{100, -1.5, +1.5, "#eta"}; + const AxisSpec axisPt{5000, 0, 5, "p_{T}"}; + const AxisSpec axisPtSmall{1000, 0, 1, "p_{T}"}; + const AxisSpec axisMass{nBinsPt, 0, 5, "m_{#pi#pi}"}; + const AxisSpec axisMassSmall{nBinsPt, 0, 2, "m_{#pi#pi}"}; + const AxisSpec axisDeltaPt{100, -1.0, +1.0, "#Delta(p_{T})"}; + const AxisSpec axisBC{1000, -10000.0, +10000.0, "BCs"}; + const AxisSpec axisBCext{100000, -10000000.0, +10000000.0, "BCs"}; + const AxisSpec axisCosTheta{100, -1.0, +1.0, "cos#theta"}; + const AxisSpec axisPhi{600, -o2::constants::math::PI, -o2::constants::math::PI, "#varphi"}; + + // create histograms + histos.add("hdEdx", "p vs dE/dx Signal", kTH2F, {{100, 0.0, 3.0}, {1000, 0.0, 2000.0}}); + histos.add("hSigmaPion", "p vs dE/dx sigma pion TPC ", kTH2F, {{300, 0.0, 3.0}, {200, -10.0, 10.0}}); + histos.add("hSigmaPionTruth", "p vs dE/dx sigma pion TPC truth", kTH2F, {{300, 0.0, 3.0}, {200, -10.0, 10.0}}); + histos.add("hSigmaPionTOF", "p vs dE/dx sigma pion TOF ", kTH2F, {{300, 0.0, 3.0}, {200, -10.0, 10.0}}); + histos.add("hSigmaPionTruthTOF", "p vs dE/dx sigma pion TOF truth", kTH2F, {{300, 0.0, 3.0}, {200, -10.0, 10.0}}); + histos.add("hSigmaKaon", "p vs dE/dx sigma kaon TPC ", kTH2F, {{300, 0.0, 3.0}, {200, -10.0, 10.0}}); + histos.add("hSigmaKaonTruth", "p vs dE/dx sigma kaon TPC truth", kTH2F, {{300, 0.0, 3.0}, {200, -10.0, 10.0}}); + histos.add("hSigmaKaonTOF", "p vs dE/dx sigma kaon TOF ", kTH2F, {{300, 0.0, 3.0}, {200, -10.0, 10.0}}); + histos.add("hSigmaKaonTruthTOF", "p vs dE/dx sigma kaon TOF truth", kTH2F, {{300, 0.0, 3.0}, {200, -10.0, 10.0}}); + histos.add("hSigmaProton", "p vs dE/dx sigma proton TPC ", kTH2F, {{300, 0.0, 3.0}, {200, -10.0, 10.0}}); + histos.add("hSigmaProtonTruth", "p vs dE/dx sigma proton TPC truth", kTH2F, {{300, 0.0, 3.0}, {200, -10.0, 10.0}}); + histos.add("hSigmaProtonTOF", "p vs dE/dx sigma proton TOF ", kTH2F, {{300, 0.0, 3.0}, {200, -10.0, 10.0}}); + histos.add("hSigmaProtonTruthTOF", "p vs dE/dx sigma proton TOF truth", kTH2F, {{300, 0.0, 3.0}, {200, -10.0, 10.0}}); + + histos.add("hVisibleMultiVsGeneratedMulti", "Multiplicity correlation", kTH2F, {{10000, -0.5, 9999.5}, {1000, -0.5, 999.5}}); + + histos.add("eventCounter", "eventCounter", kTH1F, {axisCounter}); + histos.add("ptResolution", "ptResolution", kTH2F, {axisPt, axisDeltaPt}); + + histos.add("ptGeneratedPion", "ptGeneratedPion", kTH1F, {axisPt}); + histos.add("ptGeneratedKaon", "ptGeneratedKaon", kTH1F, {axisPt}); + histos.add("ptGeneratedProton", "ptGeneratedProton", kTH1F, {axisPt}); + histos.add("ptGeneratedPionAxE", "ptGeneratedPionAxE", kTH1F, {axisPt}); + histos.add("ptGeneratedKaonAxE", "ptGeneratedKaonAxE", kTH1F, {axisPt}); + histos.add("ptGeneratedProtonAxE", "ptGeneratedProtonAxE", kTH1F, {axisPt}); + histos.add("ptGeneratedProtonAxEPos", "ptGeneratedProtonAxEPos", kTH1F, {axisPt}); + histos.add("ptGeneratedProtonAxENeg", "ptGeneratedProtonAxENeg", kTH1F, {axisPt}); + histos.add("ptReconstructedPion", "ptReconstructedPion", kTH1F, {axisPt}); + histos.add("ptReconstructedKaon", "ptReconstructedKaon", kTH1F, {axisPt}); + histos.add("ptReconstructedProton", "ptReconstructedProton", kTH1F, {axisPt}); + histos.add("ptReconstructedProtonPos", "ptReconstructedProtonPos", kTH1F, {axisPt}); + histos.add("ptReconstructedProtonNeg", "ptReconstructedProtonNeg", kTH1F, {axisPt}); + histos.add("ptReconstructedPionTOF", "ptReconstructedPionTOF", kTH1F, {axisPt}); + histos.add("ptReconstructedKaonTOF", "ptReconstructedKaonTOF", kTH1F, {axisPt}); + histos.add("ptReconstructedProtonTOF", "ptReconstructedProtonTOF", kTH1F, {axisPt}); + + histos.add("allreconstructedPFPion", "allreconstructedPFPion", kTH1F, {axisPt}); + histos.add("allreconstructedPFKaon", "allreconstructedPFKaon", kTH1F, {axisPt}); + histos.add("allreconstructedPFProton", "allreconstructedPFProton", kTH1F, {axisPt}); + histos.add("allreconstructedPFProtonPos", "allreconstructedPFProtonPos", kTH1F, {axisPt}); + histos.add("allreconstructedPFProtonNeg", "allreconstructedPFProtonNeg", kTH1F, {axisPt}); + histos.add("allreconstructedPFPionTOF", "allreconstructedPFPionTOF", kTH1F, {axisPt}); + histos.add("allreconstructedPFKaonTOF", "allreconstructedPFKaonTOF", kTH1F, {axisPt}); + histos.add("allreconstructedPFProtonTOF", "allreconstructedPFProtonTOF", kTH1F, {axisPt}); + + histos.add("numberOfRecoCollisions", "numberOfRecoCollisions", kTH1F, {{100, -0.5f, 99.5f}}); + histos.add("numberOfRecoCollisions2", "numberOfRecoCollisions2", kTH1F, {{100, -0.5f, 99.5f}}); + histos.add("numberOfTracksMC", "numberOfTracksMC", kTH1F, {{100, -0.5f, 99.5f}}); + histos.add("numberOfTracksReco", "numberOfTracksReco", kTH1F, {{100, -0.5f, 99.5f}}); + + histos.add("bcResolution", "bcResolution", kTH1F, {axisBC}); + histos.add("mcbcHistogram", "mcbcHistogram", kTH1F, {axisBCext}); + histos.add("bcHistogram", "bcHistogram", kTH1F, {axisBCext}); + histos.add("mcbcModuloOrbitHistogram", "mcbcModuloOrbitHistogram", kTH1F, {axisBC}); + histos.add("bcModuloOrbitHistogram", "bcModuloOrbitHistogram", kTH1F, {axisBC}); + } + //----------------------------------------------------------------------------------------------------------------------- + void processSim(aod::UDMcCollision const& mcCollision, aod::UDMcParticles const& mcParticles) + { + // histos.fill(HIST("eventCounter"), 0.5); + + // auto massPion = 0.; + // TParticlePDG pionPDG = fPDG->GetParticle(codePion); + // massPion = pionPDG.Mass(); + // auto massKaon = 0.; + // TParticlePDG kaonPDG = fPDG->GetParticle(codeKaon); + // massKaon = kaonPDG.Mass(); + // auto massProton = 0.; + // TParticlePDG protonPDG = fPDG->GetParticle(codeProton); + // massProton = protonPDG.Mass(); + histos.fill(HIST("numberOfTracksMC"), mcParticles.size()); + histos.fill(HIST("eventCounter"), mcCollision.size()); + // LOGF(info, "New event! mcParticles.size() = %d", mcParticles.size()); + + int counterMC = 0; + int counter = 0; + for (const auto& mcParticle : mcParticles) { + if (!mcParticle.isPhysicalPrimary()) + continue; + counterMC += 1; + // if(mcParticle.isPhysicalPrimary()) counterMC += 1; + LorentzVectorM protoMC( + mcParticle.px(), + mcParticle.py(), + mcParticle.pz(), + massPion); + double etaMax = 0.8; + double ptMin = 0.1; + if (std::fabs(protoMC.Eta()) < etaMax && protoMC.Pt() > ptMin) { + counter += 1; + } + if (!mcParticle.isPhysicalPrimary()) + continue; + // if(mcParticle.isPhysicalPrimary() && fabs(mcParticle.eta())<0.9){ // do this in the context of the MC loop ! (context matters!!!) + // LorentzVectorM pMC; + LorentzVectorM pMC(mcParticle.px(), mcParticle.py(), mcParticle.pz(), massPion); + if (std::abs(mcParticle.pdgCode()) == codePion) { + // histos.fill(HIST("ptGeneratedPion"), mcParticle.pt()); + // LorentzVectorM pMC(mcParticle.px(), mcParticle.py(), mcParticle.pz(), massPion); + histos.fill(HIST("ptGeneratedPion"), pMC.Pt()); + } + if (std::abs(mcParticle.pdgCode()) == codeKaon) { + // histos.fill(HIST("ptGenerateKaon"), mcParticle.pt()); + // LorentzVectorM pMC(mcParticle.px(), mcParticle.py(), mcParticle.pz(), massKaon); + pMC.SetM(massKaon); + histos.fill(HIST("ptGeneratedKaon"), pMC.Pt()); + } + if (std::abs(mcParticle.pdgCode()) == codeProton) { + // histos.fill(HIST("ptGeneratedProton"), mcParticle.pt()); + // LorentzVectorM pMC(mcParticle.px(), mcParticle.py(), mcParticle.pz(), massProton); + pMC.SetM(massProton); + histos.fill(HIST("ptGeneratedProton"), pMC.Pt()); + } + double yMax = 0.8; + if (std::abs(pMC.Rapidity()) < yMax) { + if (std::abs(mcParticle.pdgCode()) == codePion) + histos.fill(HIST("ptGeneratedPionAxE"), pMC.Pt()); + if (std::abs(mcParticle.pdgCode()) == codeKaon) + histos.fill(HIST("ptGeneratedKaonAxE"), pMC.Pt()); + if (std::abs(mcParticle.pdgCode()) == codeProton) + histos.fill(HIST("ptGeneratedProtonAxE"), pMC.Pt()); + if (mcParticle.pdgCode() == codeProton) { + histos.fill(HIST("ptGeneratedProtonAxEPos"), pMC.Pt()); + } else { + histos.fill(HIST("ptGeneratedProtonAxENeg"), pMC.Pt()); + } + } + } + histos.fill(HIST("hVisibleMultiVsGeneratedMulti"), counterMC, counter); + } + PROCESS_SWITCH(AnalysisMCDPMJetSGv3, processSim, "processSim", true); + + void processReco(CC const& collision, + TCs const& tracks, + // aod::UDMcCollisions const& /*mccollisions*/, + aod::UDMcParticles const& mcParticles) + { + histos.fill(HIST("numberOfRecoCollisions"), 88.); // number of times coll was reco-ed + histos.fill(HIST("numberOfRecoCollisions"), collision.size()); // number of times coll was reco-ed + histos.fill(HIST("numberOfRecoCollisions2"), mcParticles.size()); + Partition pvContributors = aod::udtrack::isPVContributor == true; + pvContributors.bindTable(tracks); + + // auto massPion = 0.; + // TParticlePDG pionPDG = fPDG->GetParticle(codePion); + // massPion = pionPDG.Mass(); + // auto massKaon = 0.; + // TParticlePDG kaonPDG = fPDG->GetParticle(codeKaon); + // massKaon = kaonPDG.Mass(); + // auto massProton = 0.; + // TParticlePDG protonPDG = fPDG->GetParticle(codeProton); + // massProton = protonPDG.Mass(); + + histos.fill(HIST("numberOfTracksReco"), tracks.size()); + // double etaMax = 0.8; + double yMax = 0.8; + double sigmaMax = 3.; + double ptMin = 0.1; + int nFindableMin = 70; + double dcaZlimit = 2.; + + // int counter = 0; + for (const auto& track : tracks) { + if (track.isPVContributor()) { + int nFindable = track.tpcNClsFindable(); + if (nFindable < nFindableMin) { + continue; + } + // int NMinusFound = track.tpcNClsFindableMinusFound(); + // int NCluster = NFindable - NMinusFound; + // if (NCluster < 70) { + // continue; + // } + if (track.pt() < ptMin) { + continue; + } + if (!(std::abs(track.dcaZ()) < dcaZlimit)) { + continue; + } + double dcaLimit = 0.0105 + 0.035 / std::pow(track.pt(), 1.1); + if (!(std::abs(track.dcaXY()) < dcaLimit)) { + continue; + } + + double momentum = std::sqrt(track.px() * track.px() + track.py() * track.py() + track.pz() * track.pz()); + double dEdx = track.tpcSignal(); + histos.fill(HIST("hdEdx"), momentum, dEdx); + + LorentzVectorM pion(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged); + LorentzVectorM kaon(track.px(), track.py(), track.pz(), o2::constants::physics::MassKaonCharged); + LorentzVectorM proton(track.px(), track.py(), track.pz(), o2::constants::physics::MassProton); + auto nSigmaPi = -999.; + auto nSigmaKa = -999.; + auto nSigmaPr = -999.; + auto nSigmaPiTOF = -999.; + auto nSigmaKaTOF = -999.; + auto nSigmaPrTOF = -999.; + // This section makes templates + if (track.hasTPC()) { + nSigmaPi = track.tpcNSigmaPi(); + nSigmaKa = track.tpcNSigmaKa(); + nSigmaPr = track.tpcNSigmaPr(); + if (std::abs(nSigmaPi) < sigmaMax && std::abs(pion.Rapidity()) < yMax) { + histos.fill(HIST("hSigmaPion"), track.pt(), nSigmaPi); + if (track.has_udMcParticle()) { + auto mcParticle = track.udMcParticle(); + // if(abs(mcParticle.pdgCode())==codePion && mcParticle.isPhysicalPrimary()) howManyPionsHavePionMCandPrimaries += 1; + if (std::abs(mcParticle.pdgCode()) == codePion) { + histos.fill(HIST("hSigmaPionTruth"), track.pt(), nSigmaPi); + histos.fill(HIST("allreconstructedPFPion"), track.pt()); + if (mcParticle.isPhysicalPrimary()) { + histos.fill(HIST("ptReconstructedPion"), track.pt()); + } + } + } + } + if (std::abs(nSigmaKa) < sigmaMax && std::abs(kaon.Rapidity()) < yMax) { + histos.fill(HIST("hSigmaKaon"), track.pt(), nSigmaKa); + if (track.has_udMcParticle()) { + auto mcParticle = track.udMcParticle(); + if (std::abs(mcParticle.pdgCode()) == codeKaon) { + histos.fill(HIST("hSigmaKaonTruth"), track.pt(), nSigmaKa); + histos.fill(HIST("allreconstructedPFKaon"), track.pt()); + if (mcParticle.isPhysicalPrimary()) { + histos.fill(HIST("ptReconstructedKaon"), track.pt()); + } + } + } + } + if (std::abs(nSigmaPr) < sigmaMax && std::abs(proton.Rapidity()) < yMax) { + histos.fill(HIST("hSigmaProton"), track.pt(), nSigmaPr); + if (track.has_udMcParticle()) { + auto mcParticle = track.udMcParticle(); + if (std::abs(mcParticle.pdgCode()) == codeProton) { + histos.fill(HIST("hSigmaProtonTruth"), track.pt(), nSigmaPr); + histos.fill(HIST("allreconstructedPFProton"), track.pt()); + if (mcParticle.pdgCode() == codeProton) { + histos.fill(HIST("allreconstructedPFProtonPos"), track.pt()); + } else { + histos.fill(HIST("allreconstructedPFProtonNeg"), track.pt()); + } + if (mcParticle.isPhysicalPrimary()) { + histos.fill(HIST("ptReconstructedProton"), track.pt()); + if (mcParticle.pdgCode() == codeProton) { + histos.fill(HIST("ptReconstructedProtonPos"), track.pt()); + } else { + histos.fill(HIST("ptReconstructedProtonNeg"), track.pt()); + } + } + } + } + } + } + if (track.hasTPC() && track.hasTOF()) { + // if (track.hasTOF()) { + nSigmaPiTOF = track.tofNSigmaPi(); + nSigmaKaTOF = track.tofNSigmaKa(); + nSigmaPrTOF = track.tofNSigmaPr(); + if (std::abs(nSigmaPiTOF) < sigmaMax && std::abs(pion.Rapidity()) < yMax) { + histos.fill(HIST("hSigmaPionTOF"), track.pt(), nSigmaPiTOF); + if (track.has_udMcParticle()) { + auto mcParticle = track.udMcParticle(); + // if(abs(mcParticle.pdgCode())==codePion && mcParticle.isPhysicalPrimary()) howManyPionsHavePionMCandPrimaries += 1; + if (std::abs(mcParticle.pdgCode()) == codePion) { + histos.fill(HIST("hSigmaPionTruthTOF"), track.pt(), nSigmaPiTOF); + histos.fill(HIST("allreconstructedPFPionTOF"), track.pt()); + if (mcParticle.isPhysicalPrimary()) { + histos.fill(HIST("ptReconstructedPionTOF"), track.pt()); + } + } + } + } + if (std::abs(nSigmaKaTOF) < sigmaMax && std::abs(kaon.Rapidity()) < yMax) { + histos.fill(HIST("hSigmaKaonTOF"), track.pt(), nSigmaKaTOF); + if (track.has_udMcParticle()) { + auto mcParticle = track.udMcParticle(); + if (std::abs(mcParticle.pdgCode()) == codeKaon) { + histos.fill(HIST("hSigmaKaonTruthTOF"), track.pt(), nSigmaKaTOF); + histos.fill(HIST("allreconstructedPFKaonTOF"), track.pt()); + if (mcParticle.isPhysicalPrimary()) { + histos.fill(HIST("ptReconstructedKaonTOF"), track.pt()); + } + } + } + } + if (std::abs(nSigmaPrTOF) < sigmaMax && std::abs(proton.Rapidity()) < yMax) { + histos.fill(HIST("hSigmaProtonTOF"), track.pt(), nSigmaPrTOF); + if (track.has_udMcParticle()) { + auto mcParticle = track.udMcParticle(); + if (std::abs(mcParticle.pdgCode()) == codeProton) { + histos.fill(HIST("hSigmaProtonTruthTOF"), track.pt(), nSigmaPrTOF); + histos.fill(HIST("allreconstructedPFProtonTOF"), track.pt()); + if (mcParticle.isPhysicalPrimary()) { + histos.fill(HIST("ptReconstructedProtonTOF"), track.pt()); + } + } + } + } + } + // counter++; + // histos.fill(HIST("hVisibleMultiVsGeneratedMulti"), counterMC, counter); + // histos.fill(HIST("hVisibleMultiVsGeneratedMulti"), mcParticles.size(), counter); + } + } // track loop + + // } // collision loop + } + PROCESS_SWITCH(AnalysisMCDPMJetSGv3, processReco, "processReco", true); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc)}; +} From 7fa11979f7cd1c6fe835d7f1130459a5e25ed012 Mon Sep 17 00:00:00 2001 From: Jesper Gumprecht <113693781+jesgum@users.noreply.github.com> Date: Thu, 12 Jun 2025 08:55:36 +0200 Subject: [PATCH 1583/1650] [ALICE3] Remove subscription to MCharmIndices (#11557) --- ALICE3/Tasks/alice3-multicharm.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ALICE3/Tasks/alice3-multicharm.cxx b/ALICE3/Tasks/alice3-multicharm.cxx index 34276a800b3..2b6ad804ddf 100644 --- a/ALICE3/Tasks/alice3-multicharm.cxx +++ b/ALICE3/Tasks/alice3-multicharm.cxx @@ -57,7 +57,7 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; -using multicharmtracks = soa::Join; +// using multicharmtracks = soa::Join; struct alice3multicharm { SliceCache cache; @@ -134,7 +134,7 @@ struct alice3multicharm { histos.add("h3dXicc", "h3dXicc; Xicc pT (GeV/#it(c)); Xicc #eta; Xicc mass (GeV/#it(c)^{2})", kTH3D, {axisPt, axisEta, axisXiccMass}); } - void processXicc(multicharmtracks const& multiCharmTracks) + void processXicc(aod::MCharmCores const& multiCharmTracks) { for (const auto& xiccCand : multiCharmTracks) { if (xiccCand.xicDauDCA() > xicMaxDauDCA || xiccCand.xiccDauDCA() > xiccMaxDauDCA) From ace5701f458cd33e4564b679b50c30944ec5c5bc Mon Sep 17 00:00:00 2001 From: yuanzhe <90246048+wang-yuanzhe@users.noreply.github.com> Date: Thu, 12 Jun 2025 09:15:28 +0200 Subject: [PATCH 1584/1650] [PWGLF] Add option to disable SV radius cut for kink (#11541) --- PWGLF/TableProducer/Common/kinkBuilder.cxx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/PWGLF/TableProducer/Common/kinkBuilder.cxx b/PWGLF/TableProducer/Common/kinkBuilder.cxx index d2b25be26a0..51be861741a 100644 --- a/PWGLF/TableProducer/Common/kinkBuilder.cxx +++ b/PWGLF/TableProducer/Common/kinkBuilder.cxx @@ -106,6 +106,7 @@ struct kinkBuilder { Configurable etaMax{"etaMax", 1., "eta daughter"}; Configurable nTPCClusMinDaug{"nTPCClusMinDaug", 80, "daug NTPC clusters cut"}; Configurable askTOFforDaug{"askTOFforDaug", false, "If true, ask for TOF signal"}; + Configurable doSVRadiusCut{"doSVRadiusCut", true, "If true, apply the cut on the radius of the secondary vertex and tracksIU"}; o2::vertexing::DCAFitterN<2> fitter; o2::base::MatLayerCylSet* lut = nullptr; @@ -329,7 +330,7 @@ struct kinkBuilder { // cut on decay radius to 17 cm float decRad2 = kinkCand.decVtx[0] * kinkCand.decVtx[0] + kinkCand.decVtx[1] * kinkCand.decVtx[1]; - if (decRad2 < LayerRadii[3] * LayerRadii[3]) { + if (doSVRadiusCut && decRad2 < LayerRadii[3] * LayerRadii[3]) { continue; } @@ -348,11 +349,11 @@ struct kinkBuilder { } } - if (lastLayerMoth >= firstLayerDaug) { + if (doSVRadiusCut && lastLayerMoth >= firstLayerDaug) { continue; } - if (decRad2 < LayerRadii[lastLayerMoth] * LayerRadii[lastLayerMoth]) { + if (doSVRadiusCut && decRad2 < LayerRadii[lastLayerMoth] * LayerRadii[lastLayerMoth]) { continue; } From 1c67fb276f952074f84f5f01877e690cd11ca8d9 Mon Sep 17 00:00:00 2001 From: creetz16 <79141119+creetz16@users.noreply.github.com> Date: Thu, 12 Jun 2025 09:15:44 +0200 Subject: [PATCH 1585/1650] [PWGLF] Update hypertriton 3body decay analysis (#11512) Co-authored-by: ALICE Action Bot --- PWGLF/DataModel/Reduced3BodyTables.h | 28 +- PWGLF/DataModel/Vtx3BodyTables.h | 783 ++-- PWGLF/TableProducer/Nuspex/CMakeLists.txt | 17 +- .../Nuspex/decay3bodybuilder.cxx | 3334 ++++++----------- .../Nuspex/hypertriton3bodyfinder.cxx | 1197 ------ .../Nuspex/reduced3bodyCreator.cxx | 61 +- .../TableProducer/Nuspex/threebodyKFTask.cxx | 488 --- .../Nuspex/threebodyRecoTask.cxx | 909 ----- PWGLF/Tasks/Nuspex/CMakeLists.txt | 10 - PWGLF/Tasks/Nuspex/hypertriton3bodyMcqa.cxx | 908 ----- .../Tasks/Nuspex/hypertriton3bodyanalysis.cxx | 797 ---- PWGLF/Utils/decay3bodyBuilderHelper.h | 838 +++++ 12 files changed, 2219 insertions(+), 7151 deletions(-) delete mode 100644 PWGLF/TableProducer/Nuspex/hypertriton3bodyfinder.cxx delete mode 100644 PWGLF/TableProducer/Nuspex/threebodyKFTask.cxx delete mode 100644 PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx delete mode 100644 PWGLF/Tasks/Nuspex/hypertriton3bodyMcqa.cxx delete mode 100644 PWGLF/Tasks/Nuspex/hypertriton3bodyanalysis.cxx create mode 100644 PWGLF/Utils/decay3bodyBuilderHelper.h diff --git a/PWGLF/DataModel/Reduced3BodyTables.h b/PWGLF/DataModel/Reduced3BodyTables.h index 51fff63c81d..aeabfb92c0b 100644 --- a/PWGLF/DataModel/Reduced3BodyTables.h +++ b/PWGLF/DataModel/Reduced3BodyTables.h @@ -83,6 +83,7 @@ DECLARE_SOA_TABLE_FULL(StoredRedIUTracks, "RedIUTracks", "AOD", "REDIUTRACK", // // tracks extra track::PIDForTracking, track::IsPVContributor, + track::HasITS, track::HasTPC, track::HasTOF, track::TPCNClsFound, @@ -120,29 +121,22 @@ DECLARE_SOA_INDEX_COLUMN_FULL(Track0, track0, int, RedIUTracks, "_0"); //! DECLARE_SOA_INDEX_COLUMN_FULL(Track1, track1, int, RedIUTracks, "_1"); //! Track 1 index DECLARE_SOA_INDEX_COLUMN_FULL(Track2, track2, int, RedIUTracks, "_2"); //! Track 2 index DECLARE_SOA_INDEX_COLUMN_FULL(Collision, collision, int, RedCollisions, ""); //! Collision index -DECLARE_SOA_COLUMN(Phi, phi, float); //! decay3body radius -DECLARE_SOA_COLUMN(Radius, radius, float); //! decay3body phi -DECLARE_SOA_COLUMN(PosZ, posz, float); //! decay3body z position +DECLARE_SOA_COLUMN(RadiusKF, radiusKF, float); //! phi of momentum of mother particle calculated by KF +DECLARE_SOA_COLUMN(PhiKF, phiKF, float); //! SV radius in x-y plane calculated by KF +DECLARE_SOA_COLUMN(PosZKF, poszKF, float); //! z position of SV calculated by KF +DECLARE_SOA_COLUMN(RadiusDCA, radiusDCA, float); //! phi of momentum of mother particle calculated by dcaFitter +DECLARE_SOA_COLUMN(PhiDCA, phiDCA, float); //! SV radius in x-y plane calculated by dcaFitter +DECLARE_SOA_COLUMN(PosZDCA, poszDCA, float); //! z position of SV calculated by dcaFitter +DECLARE_SOA_COLUMN(TrackedClSize, trackedClSize, float); //! average ITS cluster size (if tracked) } // namespace reduceddecay3body DECLARE_SOA_TABLE(RedDecay3Bodys, "AOD", "REDDECAY3BODY", //! reduced 3-body decay table o2::soa::Index<>, reduceddecay3body::CollisionId, reduceddecay3body::Track0Id, reduceddecay3body::Track1Id, reduceddecay3body::Track2Id); -using ReducedDecay3BodysLinked = soa::Join; -using ReducedDecay3BodyLinked = ReducedDecay3BodysLinked::iterator; - DECLARE_SOA_TABLE(Red3BodyInfo, "AOD", "RED3BODYINFO", //! joinable with RedDecay3Bodys - reduceddecay3body::Radius, reduceddecay3body::Phi, reduceddecay3body::PosZ); - -namespace dcafittersvinfo -{ -DECLARE_SOA_COLUMN(SVRadius, svRadius, float); //! SV radius in x-y plane calculated by dcaFitter -DECLARE_SOA_COLUMN(MomPhi, momPhi, float); //! phi of momentum of mother particle calculated from dcaFitter -DECLARE_SOA_COLUMN(SVPosZ, svPosZ, float); //! z position of SV calculated by dcaFitter -} // namespace dcafittersvinfo - -DECLARE_SOA_TABLE_FULL(DCAFitterSVInfo, "FitSVInfo", "AOD", "FITSVINFO", //! joinable with RedDecay3Bodys - dcafittersvinfo::SVRadius, dcafittersvinfo::MomPhi, dcafittersvinfo::SVPosZ); + reduceddecay3body::RadiusKF, reduceddecay3body::PhiKF, reduceddecay3body::PosZKF, + reduceddecay3body::RadiusDCA, reduceddecay3body::PhiDCA, reduceddecay3body::PosZDCA, + reduceddecay3body::TrackedClSize); } // namespace o2::aod diff --git a/PWGLF/DataModel/Vtx3BodyTables.h b/PWGLF/DataModel/Vtx3BodyTables.h index 9ae43bb0255..f03dfa8254c 100644 --- a/PWGLF/DataModel/Vtx3BodyTables.h +++ b/PWGLF/DataModel/Vtx3BodyTables.h @@ -10,7 +10,7 @@ // or submit itself to any jurisdiction. /// \file Vtx3BodyTables.h -/// \brief Definitions of reduced tables for 3body decayed hypertriton +/// \brief Definitions of analysis tables for 3body decayed hypertriton /// \author Yuanzhe Wang /// \author Carolina Reetz @@ -26,48 +26,117 @@ namespace o2::aod { namespace vtx3body { -DECLARE_SOA_INDEX_COLUMN_FULL(Track0, track0, int, Tracks, "_0"); //! -DECLARE_SOA_INDEX_COLUMN_FULL(Track1, track1, int, Tracks, "_1"); //! -DECLARE_SOA_INDEX_COLUMN_FULL(Track2, track2, int, Tracks, "_2"); //! +// indices +DECLARE_SOA_INDEX_COLUMN_FULL(TrackPr, trackPr, int, Tracks, "_pr"); //! +DECLARE_SOA_INDEX_COLUMN_FULL(TrackPi, trackPi, int, Tracks, "_pi"); //! +DECLARE_SOA_INDEX_COLUMN_FULL(TrackDe, trackDe, int, Tracks, "_de"); //! DECLARE_SOA_INDEX_COLUMN(Collision, collision); //! DECLARE_SOA_INDEX_COLUMN(Decay3Body, decay3body); //! -// General 3 body Vtx properties: position, momentum -DECLARE_SOA_COLUMN(PxTrack0, pxtrack0, float); //! track0 px at min -DECLARE_SOA_COLUMN(PyTrack0, pytrack0, float); //! track0 py at min -DECLARE_SOA_COLUMN(PzTrack0, pztrack0, float); //! track0 pz at min -DECLARE_SOA_COLUMN(PxTrack1, pxtrack1, float); //! track1 px at min -DECLARE_SOA_COLUMN(PyTrack1, pytrack1, float); //! track1 py at min -DECLARE_SOA_COLUMN(PzTrack1, pztrack1, float); //! track1 pz at min -DECLARE_SOA_COLUMN(PxTrack2, pxtrack2, float); //! track2 px at min -DECLARE_SOA_COLUMN(PyTrack2, pytrack2, float); //! track2 py at min -DECLARE_SOA_COLUMN(PzTrack2, pztrack2, float); //! track2 pz at min -DECLARE_SOA_COLUMN(X, x, float); //! decay position X -DECLARE_SOA_COLUMN(Y, y, float); //! decay position Y -DECLARE_SOA_COLUMN(Z, z, float); //! decay position Z - -// Saved from finding: DCAs -DECLARE_SOA_COLUMN(DCAVtxDaughters, dcaVtxdaughters, float); //! DCA among daughters -DECLARE_SOA_COLUMN(DCAXYTrack0ToPV, dcaXYtrack0topv, float); //! DCAXY of prong0 to PV -DECLARE_SOA_COLUMN(DCAXYTrack1ToPV, dcaXYtrack1topv, float); //! DCAXY of prong1 to PV -DECLARE_SOA_COLUMN(DCAXYTrack2ToPV, dcaXYtrack2topv, float); //! DCAXY of prong2 to PV -DECLARE_SOA_COLUMN(DCATrack0ToPV, dcatrack0topv, float); //! DCA of prong0 to PV -DECLARE_SOA_COLUMN(DCATrack1ToPV, dcatrack1topv, float); //! DCA of prong1 to PV -DECLARE_SOA_COLUMN(DCATrack2ToPV, dcatrack2topv, float); //! DCA of prong2 to PV - -// Recalculated TOF PID information of bachelor -DECLARE_SOA_COLUMN(TOFNSigmaBachDe, tofNSigmaBachDe, float); //! Recalculated Nsigma seperation with TOF for deuteron +// General 3 body Vtx properties +DECLARE_SOA_COLUMN(Mass, mass, float); //! candidate mass (with H3L or Anti-H3L mass hypothesis depending on deuteron charge) +DECLARE_SOA_COLUMN(Sign, sign, float); //! candidate sign +DECLARE_SOA_COLUMN(X, x, float); //! decay position X +DECLARE_SOA_COLUMN(Y, y, float); //! decay position Y +DECLARE_SOA_COLUMN(Z, z, float); //! decay position Z +DECLARE_SOA_COLUMN(Px, px, float); //! momentum X +DECLARE_SOA_COLUMN(Py, py, float); //! momentum Y +DECLARE_SOA_COLUMN(Pz, pz, float); //! momentum Z +DECLARE_SOA_COLUMN(Chi2, chi2, float); //! KFParticle: chi2geo/ndf or chi2topo/ndf of vertex fit, DCA fitter: Chi2AtPCACandidate value + +// daughter properties +DECLARE_SOA_COLUMN(MassV0, massV0, float); //! V0 mass (with H3L or Anti-H3L mass hypothesis depending on deuteron charge) +DECLARE_SOA_COLUMN(PxTrackPr, pxTrackPr, float); //! track0 px at min +DECLARE_SOA_COLUMN(PyTrackPr, pyTrackPr, float); //! track0 py at min +DECLARE_SOA_COLUMN(PzTrackPr, pzTrackPr, float); //! track0 pz at min +DECLARE_SOA_COLUMN(PxTrackPi, pxTrackPi, float); //! track1 px at min +DECLARE_SOA_COLUMN(PyTrackPi, pyTrackPi, float); //! track1 py at min +DECLARE_SOA_COLUMN(PzTrackPi, pzTrackPi, float); //! track1 pz at min +DECLARE_SOA_COLUMN(PxTrackDe, pxTrackDe, float); //! track2 px at min +DECLARE_SOA_COLUMN(PyTrackDe, pyTrackDe, float); //! track2 py at min +DECLARE_SOA_COLUMN(PzTrackDe, pzTrackDe, float); //! track2 pz at min + +// DCAs to PV +DECLARE_SOA_COLUMN(DCAXYTrackPrToPV, dcaXYtrackPrToPv, float); //! DCAXY of proton to PV +DECLARE_SOA_COLUMN(DCAXYTrackPiToPV, dcaXYtrackPiToPv, float); //! DCAXY of pion to PV +DECLARE_SOA_COLUMN(DCAXYTrackDeToPV, dcaXYtrackDeToPv, float); //! DCAXY of deuteron to PV +DECLARE_SOA_COLUMN(DCAZTrackPrToPV, dcaZtrackPrToPv, float); //! DCAZ of proton to PV +DECLARE_SOA_COLUMN(DCAZTrackPiToPV, dcaZtrackPiToPv, float); //! DCAZ of pion to PV +DECLARE_SOA_COLUMN(DCAZTrackDeToPV, dcaZtrackDeToPv, float); //! DCAZ of deuteron to PV + +// DCAs to SV +DECLARE_SOA_COLUMN(DCATrackPrToSV, dcaTrackPrToSv, float); //! DCA of proton to SV +DECLARE_SOA_COLUMN(DCATrackPiToSV, dcaTrackPiToSv, float); //! DCA of pion to SV +DECLARE_SOA_COLUMN(DCATrackDeToSV, dcaTrackDeToSv, float); //! DCA of deuteron to SV +DECLARE_SOA_COLUMN(DCAVtxDaughters, dcaVtxdaughters, float); //! Quadratic sum of DCA between daughters at SV + +// Strangeness tracking +DECLARE_SOA_COLUMN(TrackedClSize, trackedClSize, float); //! Average ITS cluster size of strangeness tracked 3body + +// PID +DECLARE_SOA_COLUMN(TPCNSigmaPr, tpcNSigmaPr, float); //! nsigma proton of TPC PID of the proton daughter +DECLARE_SOA_COLUMN(TPCNSigmaPi, tpcNSigmaPi, float); //! nsigma pion of TPC PID of the pion daughter +DECLARE_SOA_COLUMN(TPCNSigmaDe, tpcNSigmaDe, float); //! nsigma deuteron of TPC PID of the bachelor daughter +DECLARE_SOA_COLUMN(TPCNSigmaPiBach, tpcNSigmaPiBach, float); //! nsigma pion of TPC PID of the bachelor daughter +DECLARE_SOA_COLUMN(TOFNSigmaDe, tofNSigmaDe, float); //! nsigma deuteron of TOF PID of the bachelor daughter +DECLARE_SOA_COLUMN(PIDTrackingDe, pidTrackingDe, uint32_t); //! PID during tracking of bachelor daughter + +// Daughter track quality +DECLARE_SOA_COLUMN(TPCNClTrackPr, tpcNClTrackPr, int); //! Number of TPC clusters of proton daughter +DECLARE_SOA_COLUMN(TPCNClTrackPi, tpcNClTrackPi, int); //! Number of TPC clusters of pion daughter +DECLARE_SOA_COLUMN(TPCNClTrackDe, tpcNClTrackDe, int); //! Number of TPC clusters of deuteron daughter +DECLARE_SOA_COLUMN(ITSClSizePr, itsClsizePr, double); //! average ITS cluster size of proton daughter +DECLARE_SOA_COLUMN(ITSClSizePi, itsClsizePi, double); //! average ITS cluster size of pion daughter +DECLARE_SOA_COLUMN(ITSClSizeDe, itsClsizeDe, double); //! average ITS cluster size of deuteron daughter + +// Covariance matrices +DECLARE_SOA_COLUMN(CovProton, covProton, float[21]); //! covariance matrix elements of proton daughter track +DECLARE_SOA_COLUMN(CovPion, covPion, float[21]); //! covariance matrix elements of pion daughter track +DECLARE_SOA_COLUMN(CovDeuteron, covDeuteron, float[21]); //! covariance matrix elements of deuteron daughter track +DECLARE_SOA_COLUMN(VtxCovMat, vtxCovMat, float[21]); //! covariance matrix elements of candidate + +// Monte Carlo info +DECLARE_SOA_COLUMN(GenPx, genPx, float); // generated Px of the hypertriton in GeV/c +DECLARE_SOA_COLUMN(GenPy, genPy, float); // generated Py of the hypertriton in GeV/c +DECLARE_SOA_COLUMN(GenPz, genPz, float); // generated Pz of the hypertriton in GeV/c +DECLARE_SOA_COLUMN(GenX, genX, float); // generated decay vtx position X of the hypertriton +DECLARE_SOA_COLUMN(GenY, genY, float); // generated decay vtx position Y of the hypertriton +DECLARE_SOA_COLUMN(GenZ, genZ, float); // generated decay vtx position Z of the hypertriton +DECLARE_SOA_COLUMN(GenCt, genCt, float); // generated Ct of the hypertriton +DECLARE_SOA_COLUMN(GenPhi, genPhi, float); // generated Phi of the hypertriton +DECLARE_SOA_COLUMN(GenEta, genEta, float); // Eta of the hypertriton +DECLARE_SOA_COLUMN(GenRap, genRap, float); // generated rapidity of the hypertriton +DECLARE_SOA_COLUMN(GenPPr, genPPr, float); //! generated momentum proton daughter particle +DECLARE_SOA_COLUMN(GenPPi, genPPi, float); //! generated momentum pion daughter particle +DECLARE_SOA_COLUMN(GenPDe, genPDe, float); //! generated momentum deuteron daughter particle +DECLARE_SOA_COLUMN(GenPtPr, genPtPr, float); //! generated transverse momentum proton daughter particle +DECLARE_SOA_COLUMN(GenPtPi, genPtPi, float); //! generated transverse momentum pion daughter particle +DECLARE_SOA_COLUMN(GenPtDe, genPtDe, float); //! generated transverse momentum deuteron daughter particle +DECLARE_SOA_COLUMN(IsTrueH3L, isTrueH3l, bool); //! flag for true hypertriton candidate +DECLARE_SOA_COLUMN(IsTrueAntiH3L, isTrueAntiH3l, bool); //! flag for true anti-hypertriton candidate +DECLARE_SOA_COLUMN(PrPdgCode, prPdgCode, int); //! MC particle proton PDG code +DECLARE_SOA_COLUMN(PiPdgCode, piPdgCode, int); //! MC particle pion PDG code +DECLARE_SOA_COLUMN(DePdgCode, dePdgCode, int); //! MC particle deuteron PDG code +DECLARE_SOA_COLUMN(IsDePrimary, isDePrimary, bool); //! flag for deuteron daughter primary +DECLARE_SOA_COLUMN(IsSurvEvSel, isSurvEvSel, int); //! flag if reco collision survived event selection +DECLARE_SOA_COLUMN(IsReco, isreco, int); //! flag if candidate was reconstructed // Derived expressions // Momenta -DECLARE_SOA_DYNAMIC_COLUMN(P, p, //! 3 body p - [](float pxtrack0, float pytrack0, float pztrack0, float pxtrack1, float pytrack1, float pztrack1, float pxtrack2, float pytrack2, float pztrack2) -> float { return RecoDecay::sqrtSumOfSquares(pxtrack0 + pxtrack1 + pxtrack2, pytrack0 + pytrack1 + pytrack2, pztrack0 + pztrack1 + pztrack2); }); -DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, //! 3 body pT - [](float pxtrack0, float pytrack0, float pxtrack1, float pytrack1, float pxtrack2, float pytrack2) -> float { return RecoDecay::sqrtSumOfSquares(pxtrack0 + pxtrack1 + pxtrack2, pytrack0 + pytrack1 + pytrack2); }); +DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, //! 3 body pT in GeV/c + [](float px, float py) -> float { return RecoDecay::sqrtSumOfSquares(px, py); }); +DECLARE_SOA_DYNAMIC_COLUMN(P, p, //! 3 body total momentum in GeV/c + [](float px, float py, float pz) -> float { return RecoDecay::sqrtSumOfSquares(px, py, pz); }); +DECLARE_SOA_DYNAMIC_COLUMN(GenPt, genPt, //! 3 body pT in GeV/c + [](float genPx, float genPy) -> float { return RecoDecay::sqrtSumOfSquares(genPx, genPy); }); +DECLARE_SOA_DYNAMIC_COLUMN(GenP, genP, //! 3 body total momentum in GeV/c + [](float genPx, float genPy, float genPz) -> float { return RecoDecay::sqrtSumOfSquares(genPx, genPy, genPz); }); // Length quantities DECLARE_SOA_DYNAMIC_COLUMN(VtxRadius, vtxradius, //! 3 body decay radius (2D, centered at zero) [](float x, float y) -> float { return RecoDecay::sqrtSumOfSquares(x, y); }); +DECLARE_SOA_DYNAMIC_COLUMN(GenRadius, genRadius, //! 3 body decay radius (2D, centered at zero) + [](float genX, float genY) -> float { return RecoDecay::sqrtSumOfSquares(genX, genY); }); // Distance Over To Mom DECLARE_SOA_DYNAMIC_COLUMN(DistOverTotMom, distovertotmom, //! PV to 3 body decay distance over total momentum @@ -79,6 +148,7 @@ DECLARE_SOA_DYNAMIC_COLUMN(DistOverTotMom, distovertotmom, //! PV to 3 body deca // CosPA DECLARE_SOA_DYNAMIC_COLUMN(VtxCosPA, vtxcosPA, //! 3 body vtx CosPA [](float X, float Y, float Z, float Px, float Py, float Pz, float pvX, float pvY, float pvZ) -> float { return RecoDecay::cpa(std::array{pvX, pvY, pvZ}, std::array{X, Y, Z}, std::array{Px, Py, Pz}); }); + // Dca to PV DECLARE_SOA_DYNAMIC_COLUMN(DCAVtxToPV, dcavtxtopv, //! DCA of 3 body vtx to PV [](float X, float Y, float Z, float Px, float Py, float Pz, float pvX, float pvY, float pvZ) -> float { return std::sqrt((std::pow((pvY - Y) * Pz - (pvZ - Z) * Py, 2) + std::pow((pvX - X) * Pz - (pvZ - Z) * Px, 2) + std::pow((pvX - X) * Py - (pvY - Y) * Px, 2)) / (Px * Px + Py * Py + Pz * Pz)); }); @@ -89,532 +159,151 @@ DECLARE_SOA_DYNAMIC_COLUMN(Eta, eta, //! 3 body vtx eta DECLARE_SOA_DYNAMIC_COLUMN(Phi, phi, //! 3 body vtx phi [](float Px, float Py) -> float { return RecoDecay::phi(Px, Py); }); -// Calculated on the fly with mother particle hypothesis -DECLARE_SOA_DYNAMIC_COLUMN(MHypertriton, mHypertriton, //! mass under Hypertriton hypothesis - [](float pxtrack0, float pytrack0, float pztrack0, float pxtrack1, float pytrack1, float pztrack1, float pxtrack2, float pytrack2, float pztrack2) -> float { return RecoDecay::m(std::array{std::array{pxtrack0, pytrack0, pztrack0}, std::array{pxtrack1, pytrack1, pztrack1}, std::array{pxtrack2, pytrack2, pztrack2}}, std::array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged, o2::constants::physics::MassDeuteron}); }); -DECLARE_SOA_DYNAMIC_COLUMN(MAntiHypertriton, mAntiHypertriton, //! mass under antiHypertriton hypothesis - [](float pxtrack0, float pytrack0, float pztrack0, float pxtrack1, float pytrack1, float pztrack1, float pxtrack2, float pytrack2, float pztrack2) -> float { return RecoDecay::m(std::array{std::array{pxtrack0, pytrack0, pztrack0}, std::array{pxtrack1, pytrack1, pztrack1}, std::array{pxtrack2, pytrack2, pztrack2}}, std::array{o2::constants::physics::MassPionCharged, o2::constants::physics::MassProton, o2::constants::physics::MassDeuteron}); }); - -DECLARE_SOA_DYNAMIC_COLUMN(MHyperHelium4, mHyperHelium4, //! mass under HyperHelium4 hypothesis - [](float pxtrack0, float pytrack0, float pztrack0, float pxtrack1, float pytrack1, float pztrack1, float pxtrack2, float pytrack2, float pztrack2) -> float { return RecoDecay::m(std::array{std::array{pxtrack0, pytrack0, pztrack0}, std::array{pxtrack1, pytrack1, pztrack1}, std::array{pxtrack2, pytrack2, pztrack2}}, std::array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged, o2::constants::physics::MassHelium3}); }); -DECLARE_SOA_DYNAMIC_COLUMN(MAntiHyperHelium4, mAntiHyperHelium4, //! mass under antiHyperHelium4 hypothesis - [](float pxtrack0, float pytrack0, float pztrack0, float pxtrack1, float pytrack1, float pztrack1, float pxtrack2, float pytrack2, float pztrack2) -> float { return RecoDecay::m(std::array{std::array{pxtrack0, pytrack0, pztrack0}, std::array{pxtrack1, pytrack1, pztrack1}, std::array{pxtrack2, pytrack2, pztrack2}}, std::array{o2::constants::physics::MassPionCharged, o2::constants::physics::MassProton, o2::constants::physics::MassHelium3}); }); - -DECLARE_SOA_DYNAMIC_COLUMN(YHypertriton, yHypertriton, //! 3 body vtx y with hypertriton or antihypertriton hypothesis +// Rapidity +DECLARE_SOA_DYNAMIC_COLUMN(Rap, rap, //! 3 body vtx y with hypertriton or antihypertriton hypothesis [](float Px, float Py, float Pz) -> float { return RecoDecay::y(std::array{Px, Py, Pz}, o2::constants::physics::MassHyperTriton); }); -DECLARE_SOA_DYNAMIC_COLUMN(YHyperHelium4, yHyperHelium4, //! 3 body vtx y with hyperhelium4 or antihyperhelium4 hypothesis - [](float Px, float Py, float Pz) -> float { return RecoDecay::y(std::array{Px, Py, Pz}, o2::constants::physics::MassHyperHelium4); }); - -// kinematic information of daughter tracks -DECLARE_SOA_DYNAMIC_COLUMN(Track0Pt, track0pt, //! daughter0 pT - [](float pxtrack0, float pytrack0) -> float { return RecoDecay::sqrtSumOfSquares(pxtrack0, pytrack0); }); -DECLARE_SOA_DYNAMIC_COLUMN(Track1Pt, track1pt, //! daughter1 pT - [](float pxtrack1, float pytrack1) -> float { return RecoDecay::sqrtSumOfSquares(pxtrack1, pytrack1); }); -DECLARE_SOA_DYNAMIC_COLUMN(Track2Pt, track2pt, //! daughter2 pT - [](float pxtrack2, float pytrack2) -> float { return RecoDecay::sqrtSumOfSquares(pxtrack2, pytrack2); }); -DECLARE_SOA_DYNAMIC_COLUMN(Track0Eta, track0eta, //! daughter0 eta - [](float pxtrack0, float pytrack0, float pztrack0) -> float { return RecoDecay::eta(std::array{pxtrack0, pytrack0, pztrack0}); }); -DECLARE_SOA_DYNAMIC_COLUMN(Track0Phi, track0phi, //! daughter0 phi - [](float pxtrack0, float pytrack0) -> float { return RecoDecay::phi(pxtrack0, pytrack0); }); -DECLARE_SOA_DYNAMIC_COLUMN(Track1Eta, track1eta, //! daughter1 eta - [](float pxtrack1, float pytrack1, float pztrack1) -> float { return RecoDecay::eta(std::array{pxtrack1, pytrack1, pztrack1}); }); -DECLARE_SOA_DYNAMIC_COLUMN(Track1Phi, track1phi, //! daughter1 phi - [](float pxtrack1, float pytrack1) -> float { return RecoDecay::phi(pxtrack1, pytrack1); }); -DECLARE_SOA_DYNAMIC_COLUMN(Track2Eta, track2eta, //! daughter2 eta - [](float pxtrack2, float pytrack2, float pztrack2) -> float { return RecoDecay::eta(std::array{pxtrack2, pytrack2, pztrack2}); }); -DECLARE_SOA_DYNAMIC_COLUMN(Track2Phi, track2phi, //! daughter2 phi - [](float pxtrack2, float pytrack2) -> float { return RecoDecay::phi(pxtrack2, pytrack2); }); - -DECLARE_SOA_EXPRESSION_COLUMN(Px, px, //! 3 body vtx px - float, 1.f * aod::vtx3body::pxtrack0 + 1.f * aod::vtx3body::pxtrack1 + 1.f * aod::vtx3body::pxtrack2); -DECLARE_SOA_EXPRESSION_COLUMN(Py, py, //! 3 body vtx py - float, 1.f * aod::vtx3body::pytrack0 + 1.f * aod::vtx3body::pytrack1 + 1.f * aod::vtx3body::pytrack2); -DECLARE_SOA_EXPRESSION_COLUMN(Pz, pz, //! 3 body vtx pz - float, 1.f * aod::vtx3body::pztrack0 + 1.f * aod::vtx3body::pztrack1 + 1.f * aod::vtx3body::pztrack2); -} // namespace vtx3body - -DECLARE_SOA_TABLE_FULL(StoredVtx3BodyDatas, "Vtx3BodyDatas", "AOD", "Vtx3BodyDATA", //! - o2::soa::Index<>, vtx3body::Track0Id, vtx3body::Track1Id, vtx3body::Track2Id, vtx3body::CollisionId, vtx3body::Decay3BodyId, - vtx3body::X, vtx3body::Y, vtx3body::Z, - vtx3body::PxTrack0, vtx3body::PyTrack0, vtx3body::PzTrack0, - vtx3body::PxTrack1, vtx3body::PyTrack1, vtx3body::PzTrack1, - vtx3body::PxTrack2, vtx3body::PyTrack2, vtx3body::PzTrack2, - vtx3body::DCAVtxDaughters, - vtx3body::DCAXYTrack0ToPV, vtx3body::DCAXYTrack1ToPV, vtx3body::DCAXYTrack2ToPV, - vtx3body::DCATrack0ToPV, vtx3body::DCATrack1ToPV, vtx3body::DCATrack2ToPV, - vtx3body::TOFNSigmaBachDe, - - // Dynamic columns - vtx3body::P, - vtx3body::Pt, - vtx3body::VtxRadius, - vtx3body::DistOverTotMom, - vtx3body::VtxCosPA, - vtx3body::DCAVtxToPV, - - // Invariant masses - vtx3body::MHypertriton, - vtx3body::MAntiHypertriton, - vtx3body::MHyperHelium4, - vtx3body::MAntiHyperHelium4, - - // Longitudinal - vtx3body::YHypertriton, - vtx3body::YHyperHelium4, - vtx3body::Eta, - vtx3body::Phi, - vtx3body::Track0Pt, - vtx3body::Track0Eta, - vtx3body::Track0Phi, - vtx3body::Track1Pt, - vtx3body::Track1Eta, - vtx3body::Track1Phi, - vtx3body::Track2Pt, - vtx3body::Track2Eta, - vtx3body::Track2Phi); - -// extended table with expression columns that can be used as arguments of dynamic columns -DECLARE_SOA_EXTENDED_TABLE_USER(Vtx3BodyDatas, StoredVtx3BodyDatas, "Vtx3BodyDATAEXT", //! - vtx3body::Px, vtx3body::Py, vtx3body::Pz); - -using Vtx3BodyData = Vtx3BodyDatas::iterator; -namespace vtx3body -{ -DECLARE_SOA_INDEX_COLUMN(Vtx3BodyData, vtx3BodyData); //! Index to Vtx3BodyData entry -} - -DECLARE_SOA_TABLE(Decay3BodyDataLink, "AOD", "DECAY3BODYLINK", //! Joinable table with Decay3bodys which links to Vtx3BodyData which is not produced for all entries - vtx3body::Vtx3BodyDataId); - -using Decay3BodysLinked = soa::Join; -using Decay3BodyLinked = Decay3BodysLinked::iterator; - -// Definition of labels for Vtx3BodyDatas -namespace mcvtx3bodylabel -{ -DECLARE_SOA_INDEX_COLUMN(McParticle, mcParticle); //! MC particle for Vtx3BodyDatas -} // namespace mcvtx3bodylabel - -DECLARE_SOA_TABLE(McVtx3BodyLabels, "AOD", "MCVTXLABEL", //! Table joinable with Vtx3BodyData containing the MC labels - mcvtx3bodylabel::McParticleId); -using McVtx3BodyLabel = McVtx3BodyLabels::iterator; -// Definition of labels for Decay3Bodys // Full table, joinable with Decay3Bodys (CAUTION: NOT WITH Vtx3BodyDATA) -namespace mcfullvtx3bodylabel -{ -DECLARE_SOA_INDEX_COLUMN(McParticle, mcParticle); //! MC particle for Decay3Bodys -} // namespace mcfullvtx3bodylabel - -DECLARE_SOA_TABLE(McFullVtx3BodyLabels, "AOD", "MCFULLVTXLABEL", //! Table joinable with Decay3Bodys - mcfullvtx3bodylabel::McParticleId); -using McFullVtx3BodyLabel = McFullVtx3BodyLabels::iterator; +// Kinematic information of daughter tracks +DECLARE_SOA_DYNAMIC_COLUMN(TrackPrPt, trackPrPt, //! daughter0 pT + [](float pxTrackPr, float pyTrackPr) -> float { return RecoDecay::sqrtSumOfSquares(pxTrackPr, pyTrackPr); }); +DECLARE_SOA_DYNAMIC_COLUMN(TrackPiPt, trackPiPt, //! daughter1 pT + [](float pxTrackPi, float pyTrackPi) -> float { return RecoDecay::sqrtSumOfSquares(pxTrackPi, pyTrackPi); }); +DECLARE_SOA_DYNAMIC_COLUMN(TrackDePt, trackDePt, //! daughter2 pT + [](float pxTrackDe, float pyTrackDe) -> float { return RecoDecay::sqrtSumOfSquares(pxTrackDe, pyTrackDe); }); +DECLARE_SOA_DYNAMIC_COLUMN(TrackPrEta, trackPrEta, //! daughter0 eta + [](float pxTrackPr, float pyTrackPr, float pzTrackPr) -> float { return RecoDecay::eta(std::array{pxTrackPr, pyTrackPr, pzTrackPr}); }); +DECLARE_SOA_DYNAMIC_COLUMN(TrackPrPhi, trackPrPhi, //! daughter0 phi + [](float pxTrackPr, float pyTrackPr) -> float { return RecoDecay::phi(pxTrackPr, pyTrackPr); }); +DECLARE_SOA_DYNAMIC_COLUMN(TrackPiEta, trackPiEta, //! daughter1 eta + [](float pxTrackPi, float pyTrackPi, float pzTrackPi) -> float { return RecoDecay::eta(std::array{pxTrackPi, pyTrackPi, pzTrackPi}); }); +DECLARE_SOA_DYNAMIC_COLUMN(TrackPiPhi, trackPiPhi, //! daughter1 phi + [](float pxTrackPi, float pyTrackPi) -> float { return RecoDecay::phi(pxTrackPi, pyTrackPi); }); +DECLARE_SOA_DYNAMIC_COLUMN(TrackDeEta, trackDeEta, //! daughter2 eta + [](float pxTrackDe, float pyTrackDe, float pzTrackDe) -> float { return RecoDecay::eta(std::array{pxTrackDe, pyTrackDe, pzTrackDe}); }); +DECLARE_SOA_DYNAMIC_COLUMN(TrackDePhi, trackDePhi, //! daughter2 phi + [](float pxTrackDe, float pyTrackDe) -> float { return RecoDecay::phi(pxTrackDe, pyTrackDe); }); +} // namespace vtx3body -// output table for ML studies -namespace hyp3body -{ -// collision -DECLARE_SOA_COLUMN(Centrality, centrality, float); //! centrality -// reconstruced candidate -DECLARE_SOA_COLUMN(IsMatter, isMatter, bool); //! bool: true for matter -DECLARE_SOA_COLUMN(M, m, float); //! invariant mass -DECLARE_SOA_COLUMN(P, p, float); //! p -DECLARE_SOA_COLUMN(Pt, pt, float); //! pT -DECLARE_SOA_COLUMN(Ct, ct, float); //! ct -DECLARE_SOA_COLUMN(CosPA, cospa, float); -DECLARE_SOA_COLUMN(DCADaughters, dcaDaughters, float); //! DCA among daughters -DECLARE_SOA_COLUMN(DCACandToPV, dcaCandtopv, float); //! DCA of the reconstructed track to pv -DECLARE_SOA_COLUMN(VtxRadius, vtxRadius, float); //! Radius of SV -// kinematic infomation of daughter tracks -DECLARE_SOA_COLUMN(PtProton, ptProton, float); //! pT of the proton daughter -DECLARE_SOA_COLUMN(EtaProton, etaProton, float); //! eta of the proton daughter -DECLARE_SOA_COLUMN(PhiProton, phiProton, float); //! phi of the proton daughter -DECLARE_SOA_COLUMN(RadiusProton, radiusProton, float); //! radius of innermost hit of the proton daughter -DECLARE_SOA_COLUMN(PtPion, ptPion, float); //! pT of the pion daughter -DECLARE_SOA_COLUMN(EtaPion, etaPion, float); //! eta of the pion daughter -DECLARE_SOA_COLUMN(PhiPion, phiPion, float); //! phi of the pion daughter -DECLARE_SOA_COLUMN(RadiusPion, radiusPion, float); //! radius of innermost hit of the pion daughter -DECLARE_SOA_COLUMN(PtBachelor, ptBachelor, float); //! pT of the bachelor daughter -DECLARE_SOA_COLUMN(EtaBachelor, etaBachelor, float); //! eta of the bachelor daughter -DECLARE_SOA_COLUMN(PhiBachelor, phiBachelor, float); //! phi of the bachelor daughter -DECLARE_SOA_COLUMN(RadiusBachelor, radiusBachelor, float); //! radius of innermost hit of the bachelor daughter -// track quality -DECLARE_SOA_COLUMN(TPCNclusProton, tpcNclusProton, uint8_t); //! number of TPC clusters of the proton daughter -DECLARE_SOA_COLUMN(TPCNclusPion, tpcNclusPion, uint8_t); //! number of TPC clusters of the pion daughter -DECLARE_SOA_COLUMN(TPCNclusBachelor, tpcNclusBachelor, uint8_t); //! number of TPC clusters of the bachelor daughter -DECLARE_SOA_COLUMN(ITSNclusSizeProton, itsNclusSizeProton, uint8_t); //! average ITS cluster size of the proton daughter -DECLARE_SOA_COLUMN(ITSNclusSizePion, itsNclusSizePion, uint8_t); //! average ITS cluster size of the pion daughter -DECLARE_SOA_COLUMN(ITSNclusSizeBachelor, itsNclusSizeBachelor, uint8_t); //! average ITS cluster size of the bachelor daughter -// PID -DECLARE_SOA_COLUMN(TPCNSigmaProton, tpcNSigmaProton, float); //! nsigma of TPC PID of the proton daughter -DECLARE_SOA_COLUMN(TPCNSigmaPion, tpcNSigmaPion, float); //! nsigma of TPC PID of the pion daughter -DECLARE_SOA_COLUMN(TPCNSigmaBachelor, tpcNSigmaBachelor, float); //! nsigma of TPC PID of the bachelor daughter -DECLARE_SOA_COLUMN(TOFNSigmaBachelor, tofNSigmaBachelor, float); //! nsigma of TOF PID of the bachelor daughter -// DCA to PV -DECLARE_SOA_COLUMN(DCAXYProtonToPV, dcaxyProtontoPV, float); //! DCAXY of the proton daughter to pv -DECLARE_SOA_COLUMN(DCAXYPionToPV, dcaxyPiontoPV, float); //! DCAXY of the pion daughter to pv -DECLARE_SOA_COLUMN(DCAXYBachelorToPV, dcaxyBachelortoPV, float); //! DCAXY of the bachelor daughter to pv -DECLARE_SOA_COLUMN(DCAProtonToPV, dcaProtontoPV, float); //! DCA of the proton daughter to pv -DECLARE_SOA_COLUMN(DCAPionToPV, dcaPiontoPV, float); //! DCA of the pion daughter to pv -DECLARE_SOA_COLUMN(DCABachelorToPV, dcaBachelortoPV, float); //! DCA of the bachelor daughter to pv -DECLARE_SOA_COLUMN(IsBachPrimary, isbachprimary, bool); //! flag for bachelor daughter primary -// for MC -DECLARE_SOA_COLUMN(GenP, genP, float); // P of the hypertriton -DECLARE_SOA_COLUMN(GenPt, genPt, float); // pT of the hypertriton -DECLARE_SOA_COLUMN(GenCt, genCt, float); // ct of the hypertriton -DECLARE_SOA_COLUMN(GenPhi, genPhi, float); // Phi of the hypertriton -DECLARE_SOA_COLUMN(GenEta, genEta, float); // Eta of the hypertriton -DECLARE_SOA_COLUMN(GenRapidity, genRapidity, float); // Rapidity of the hypertriton -DECLARE_SOA_COLUMN(IsReco, isReco, bool); // bool: true for reco -DECLARE_SOA_COLUMN(IsSignal, isSignal, bool); // bool: true for signal -DECLARE_SOA_COLUMN(PdgCode, pdgCode, int); // pdgCode of the mcparticle, -1 for fake pair -DECLARE_SOA_COLUMN(SurvivedEventSelection, survivedEventSelection, bool); // bool: true for survived event selection -} // namespace hyp3body - -// output table for data -DECLARE_SOA_TABLE(Hyp3BodyCands, "AOD", "HYP3BODYCANDS", - o2::soa::Index<>, - hyp3body::Centrality, - // secondary vertex and reconstruced candidate - hyp3body::IsMatter, - hyp3body::M, - hyp3body::P, - hyp3body::Pt, - hyp3body::Ct, - hyp3body::CosPA, - hyp3body::DCADaughters, - hyp3body::DCACandToPV, - hyp3body::VtxRadius, - // daughter tracks - hyp3body::PtProton, hyp3body::EtaProton, hyp3body::PhiProton, hyp3body::RadiusProton, - hyp3body::PtPion, hyp3body::EtaPion, hyp3body::PhiPion, hyp3body::RadiusPion, - hyp3body::PtBachelor, hyp3body::EtaBachelor, hyp3body::PhiBachelor, hyp3body::RadiusBachelor, - hyp3body::TPCNclusProton, hyp3body::TPCNclusPion, hyp3body::TPCNclusBachelor, - hyp3body::ITSNclusSizeProton, hyp3body::ITSNclusSizePion, hyp3body::ITSNclusSizeBachelor, - hyp3body::TPCNSigmaProton, hyp3body::TPCNSigmaPion, hyp3body::TPCNSigmaBachelor, - hyp3body::TOFNSigmaBachelor, - hyp3body::DCAXYProtonToPV, hyp3body::DCAXYPionToPV, hyp3body::DCAXYBachelorToPV, - hyp3body::DCAProtonToPV, hyp3body::DCAPionToPV, hyp3body::DCABachelorToPV); - -// output table for MC -DECLARE_SOA_TABLE(MCHyp3BodyCands, "AOD", "MCHYP3BODYCANDS", +// index table +DECLARE_SOA_TABLE(Decay3BodyIndices, "AOD", "3BodyINDEX", //! o2::soa::Index<>, - hyp3body::Centrality, - // secondary vertex and reconstruced candidate - hyp3body::IsMatter, - hyp3body::M, - hyp3body::P, - hyp3body::Pt, - hyp3body::Ct, - hyp3body::CosPA, - hyp3body::DCADaughters, - hyp3body::DCACandToPV, - hyp3body::VtxRadius, - // daughter tracks - hyp3body::PtProton, hyp3body::EtaProton, hyp3body::PhiProton, hyp3body::RadiusProton, - hyp3body::PtPion, hyp3body::EtaPion, hyp3body::PhiPion, hyp3body::RadiusPion, - hyp3body::PtBachelor, hyp3body::EtaBachelor, hyp3body::PhiBachelor, hyp3body::RadiusBachelor, - hyp3body::TPCNclusProton, hyp3body::TPCNclusPion, hyp3body::TPCNclusBachelor, - hyp3body::ITSNclusSizeProton, hyp3body::ITSNclusSizePion, hyp3body::ITSNclusSizeBachelor, - hyp3body::TPCNSigmaProton, hyp3body::TPCNSigmaPion, hyp3body::TPCNSigmaBachelor, - hyp3body::TOFNSigmaBachelor, - hyp3body::DCAXYProtonToPV, hyp3body::DCAXYPionToPV, hyp3body::DCAXYBachelorToPV, - hyp3body::DCAProtonToPV, hyp3body::DCAPionToPV, hyp3body::DCABachelorToPV, - hyp3body::IsBachPrimary, - // MC information - hyp3body::GenP, - hyp3body::GenPt, - hyp3body::GenCt, - hyp3body::GenPhi, - hyp3body::GenEta, - hyp3body::GenRapidity, - hyp3body::IsSignal, - hyp3body::IsReco, - hyp3body::PdgCode, - hyp3body::SurvivedEventSelection); - -//______________________________________________________ -// DATAMODEL FOR KFPARTICLE DECAY3BODYS - -namespace kfvtx3body -{ -// General 3 body Vtx properties: mass, momentum, charge -DECLARE_SOA_COLUMN(Mass, mass, float); //! candidate mass (PID hypothesis depending on bachelor charge) -DECLARE_SOA_COLUMN(XErr, xerr, float); //! candidate position x error at decay position -DECLARE_SOA_COLUMN(YErr, yerr, float); //! candidate position y error at decay position -DECLARE_SOA_COLUMN(ZErr, zerr, float); //! candidate position z error at decay position -DECLARE_SOA_COLUMN(Px, px, float); //! candidate px at decay position -DECLARE_SOA_COLUMN(Py, py, float); //! candidate py at decay position -DECLARE_SOA_COLUMN(Pz, pz, float); //! candidate pz at decay position -DECLARE_SOA_COLUMN(Pt, pt, float); //! candidate pt at decay position -DECLARE_SOA_COLUMN(PxErr, pxerr, float); //! candidate px error at decay position -DECLARE_SOA_COLUMN(PyErr, pyerr, float); //! candidate py error at decay position -DECLARE_SOA_COLUMN(PzErr, pzerr, float); //! candidate pz error at decay position -DECLARE_SOA_COLUMN(PtErr, pterr, float); //! candidate pt error at decay position -DECLARE_SOA_COLUMN(Sign, sign, float); //! candidate sign - -// topological properties -DECLARE_SOA_COLUMN(VtxCosPAKF, vtxcospakf, float); //! 3 body vtx CosPA from KFParticle (using kfpPV) -DECLARE_SOA_COLUMN(VtxCosXYPAKF, vtxcosxypakf, float); //! 3 body vtx CosPA from KFParticle (using kfpPV) -DECLARE_SOA_COLUMN(VtxCosPAKFtopo, vtxcospakftopo, float); //! 3 body vtx CosPA from KFParticle after topological constraint (using kfpPV) -DECLARE_SOA_COLUMN(VtxCosXYPAKFtopo, vtxcosxypakftopo, float); //! 3 body vtx CosPA from KFParticle after topological constraint (using kfpPV) -DECLARE_SOA_COLUMN(DCAVtxToPVKF, dcavtxtopvkf, float); //! 3 body vtx DCA to PV from KFParticle (using kfpPV) -DECLARE_SOA_COLUMN(DCAXYVtxToPVKF, dcaxyvtxtopvkf, float); //! 3 body vtx DCAxy to PV from KFParticle (using kfpPV) -DECLARE_SOA_COLUMN(DecayLKF, decaylkf, float); //! 3 body vtx decay length from KFParticle (using kfpPV after topological constraint) -DECLARE_SOA_COLUMN(DecayLXYKF, decaylxykf, float); //! 3 body vtx decay length XY from KFParticle (using kfpPV after topological constraint) -DECLARE_SOA_COLUMN(DecayLDeltaL, decayldeltal, float); //! 3 body vtx l/dl from KFParticle (using kfpPV after topological constraint) -DECLARE_SOA_COLUMN(Chi2geoNDF, chi2geondf, float); //! 3 body vtx chi2geo from geometrical KFParticle fit -DECLARE_SOA_COLUMN(Chi2topoNDF, chi2topondf, float); //! 3 body vtx chi2topo from KFParticle topological constraint to the PV (using kfpPV) -DECLARE_SOA_COLUMN(CTauKFtopo, ctaukftopo, float); //! 3 body vtx ctau from KFParticle after topological constraint - -// Strangeness tracking -DECLARE_SOA_COLUMN(TrackedClSize, trackedclsize, int); //! Cluster size of strangeness tracked 3body - -// daughters -DECLARE_SOA_COLUMN(DCATrack0ToPVKF, dcatrack0topvkf, float); //! DCA of proton prong to PV from KFParticle -DECLARE_SOA_COLUMN(DCATrack1ToPVKF, dcatrack1topvkf, float); //! DCA of pion prong to PV from KFParticle -DECLARE_SOA_COLUMN(DCATrack2ToPVKF, dcatrack2topvkf, float); //! DCA of deuteron prong to PV from KFParticle -DECLARE_SOA_COLUMN(DCAxyTrack0ToPVKF, dcaxytrack0topvkf, float); //! DCAxy of proton prong to PV from KFParticle -DECLARE_SOA_COLUMN(DCAxyTrack1ToPVKF, dcaxytrack1topvkf, float); //! DCAxy of pion prong to PV from KFParticle -DECLARE_SOA_COLUMN(DCAxyTrack2ToPVKF, dcaxytrack2topvkf, float); //! DCAxy of deuteron prong to PV from KFParticle -DECLARE_SOA_COLUMN(DCATrackPosToPV, dcatrackpostopv, float); //! DCA of positive track to PV (propagated before vtx fit) -DECLARE_SOA_COLUMN(DCATrackNegToPV, dcatracknegtopv, float); //! DCA of negative track to PV (propagated before vtx fit) -DECLARE_SOA_COLUMN(DCATrackBachToPV, dcatrackbachtopv, float); //! DCA of bachelor track to PV (propagated before vtx fit) -DECLARE_SOA_COLUMN(DCAxyTrackPosToPV, dcaxytrackpostopv, float); //! DCAxy of positive track to PV (propagated before vtx fit) -DECLARE_SOA_COLUMN(DCAxyTrackNegToPV, dcaxytracknegtopv, float); //! DCAxy of negative track to PV (propagated before vtx fit) -DECLARE_SOA_COLUMN(DCAxyTrackBachToPV, dcaxytrackbachtopv, float); //! DCAxy of bachelor track to PV (propagated before vtx fit) -DECLARE_SOA_COLUMN(DCAxyTrack0ToSVKF, dcaxytrack0tosvkf, float); //! DCAxy of proton prong to SV from KFParticle -DECLARE_SOA_COLUMN(DCAxyTrack1ToSVKF, dcaxytrack1tosvkf, float); //! DCAxy of pion prong to SV from KFParticle -DECLARE_SOA_COLUMN(DCAxyTrack2ToSVKF, dcaxytrack2tosvkf, float); //! DCAxy of deuteron prong to SV from KFParticle -DECLARE_SOA_COLUMN(DCATrack0ToTrack1KF, dcatrack0totrack1kf, float); //! DCAxy of proton prong to pion from KFParticle -DECLARE_SOA_COLUMN(DCATrack0ToTrack2KF, dcatrack0totrack2kf, float); //! DCAxy of proton prong to deuteron from KFParticle -DECLARE_SOA_COLUMN(DCATrack1ToTrack2KF, dcatrack1totrack2kf, float); //! DCAxy of pion prong to deuteron from KFParticle -DECLARE_SOA_COLUMN(DCAVtxDaughtersKF, dcavtxdaughterskf, float); //! sum of DCAs between daughters in 3D from KFParticle -DECLARE_SOA_COLUMN(Track0Sign, track0sign, float); //! sign of proton daughter track -DECLARE_SOA_COLUMN(Track1Sign, track1sign, float); //! sign of pion daughter track -DECLARE_SOA_COLUMN(Track2Sign, track2sign, float); //! sign of deuteron daughter track -DECLARE_SOA_COLUMN(TPCInnerParamTrack0, tpcinnerparamtrack0, float); //! momentum at inner wall of TPC of proton daughter -DECLARE_SOA_COLUMN(TPCInnerParamTrack1, tpcinnerparamtrack1, float); //! momentum at inner wall of TPC of pion daughter -DECLARE_SOA_COLUMN(TPCInnerParamTrack2, tpcinnerparamtrack2, float); //! momentum at inner wall of TPC of deuteron daughter -DECLARE_SOA_COLUMN(TPCNClTrack0, tpcncltrack0, int); //! Number of TPC clusters of proton daughter -DECLARE_SOA_COLUMN(TPCNClTrack1, tpcncltrack1, int); //! Number of TPC clusters of pion daughter -DECLARE_SOA_COLUMN(TPCNClTrack2, tpcncltrack2, int); //! Number of TPC clusters of deuteron daughter -DECLARE_SOA_COLUMN(TPCChi2NClDeuteron, tpcchi2ncldeuteron, float); //! TPC Chi2 / cluster of deuteron daughter -DECLARE_SOA_COLUMN(DeltaPhiDeuteron, deltaphideuteron, float); //! phi before track rotation - phi after track rotation for deuteron track -DECLARE_SOA_COLUMN(DeltaPhiProton, deltaphiproton, float); //! phi before track rotation - phi after track rotation for proton track -// PID -DECLARE_SOA_COLUMN(TPCNSigmaProton, tpcnsigmaproton, float); //! nsigma proton of TPC PID of the proton daughter -DECLARE_SOA_COLUMN(TPCNSigmaPion, tpcnsigmapion, float); //! nsigma pion of TPC PID of the pion daughter -DECLARE_SOA_COLUMN(TPCNSigmaDeuteron, tpcnsigmadeuteron, float); //! nsigma deuteron of TPC PID of the bachelor daughter -DECLARE_SOA_COLUMN(TPCNSigmaPionBach, tpcnsigmapionbach, float); //! nsigma pion of TPC PID of the bachelor daughter -DECLARE_SOA_COLUMN(TPCdEdxProton, tpcdedxproton, float); //! TPC dEdx of the proton daughter -DECLARE_SOA_COLUMN(TPCdEdxPion, tpcdedxpion, float); //! TPC dEdx of the pion daughter -DECLARE_SOA_COLUMN(TPCdEdxDeuteron, tpcdedxdeuteron, float); //! TPC dEdx of the bachelor daughter -DECLARE_SOA_COLUMN(TOFNSigmaDeuteron, tofnsigmadeuteron, float); //! nsigma of TOF PID of the bachelor daughter -DECLARE_SOA_COLUMN(ITSClusSizeDeuteron, itsclussizedeuteron, double); //! average ITS cluster size of bachelor daughter -DECLARE_SOA_COLUMN(PIDTrackingDeuteron, pidtrackingdeuteron, uint32_t); //! PID during tracking of bachelor daughter - -// Monte Carlo -DECLARE_SOA_COLUMN(GenP, genp, float); //! generated momentum -DECLARE_SOA_COLUMN(GenPt, genpt, float); //! generated transverse momentum -DECLARE_SOA_COLUMN(GenDecVtxX, gendecvtxx, double); //! generated decay vertex position x -DECLARE_SOA_COLUMN(GenDecVtxY, gendecvtxy, double); //! generated decay vertex position y -DECLARE_SOA_COLUMN(GenDecVtxZ, gendecvtxz, double); //! generated decay vertex position z -DECLARE_SOA_COLUMN(GenCtau, genctau, double); //! generated ctau -DECLARE_SOA_COLUMN(GenPhi, genphi, float); //! generated phi -DECLARE_SOA_COLUMN(GenEta, geneta, float); //! generated eta -DECLARE_SOA_COLUMN(GenRapidity, genrapidity, float); //! generated rapidity -DECLARE_SOA_COLUMN(GenPosP, genposp, float); //! generated momentum pos daughter particle -DECLARE_SOA_COLUMN(GenPosPt, genpospt, float); //! generated transverse momentum pos daughter particle -DECLARE_SOA_COLUMN(GenNegP, gennegp, float); //! generated momentum neg daughter particle -DECLARE_SOA_COLUMN(GenNegPt, gennegpt, float); //! generated transverse momentum neg daughter particle -DECLARE_SOA_COLUMN(GenBachP, genbachp, float); //! generated momentum bachelor daughter particle -DECLARE_SOA_COLUMN(GenBachPt, genbachpt, float); //! generated transverse momentum bachelor daughter particle -DECLARE_SOA_COLUMN(IsTrueH3L, istrueh3l, bool); //! flag for true hypertriton candidate -DECLARE_SOA_COLUMN(IsTrueAntiH3L, istrueantih3l, bool); //! flag for true anti-hypertriton candidate -DECLARE_SOA_COLUMN(PdgCodeDau0, pdgcodedau0, int); //! MC particle daughter 0 PDG code -DECLARE_SOA_COLUMN(PdgCodeDau1, pdgcodedau1, int); //! MC particle daughter 1 PDG code -DECLARE_SOA_COLUMN(PdgCodeDau2, pdgcodedau2, int); //! MC particle daughter 2 PDG code -DECLARE_SOA_COLUMN(IsBachPrimary, isbachprimary, bool); //! flag for bachelor daughter primary -DECLARE_SOA_COLUMN(SurvEvSel, survevsel, int); //! flag if reco collision survived event selection -DECLARE_SOA_COLUMN(IsReco, isreco, int); //! flag if candidate was reconstructed - -// V0 -DECLARE_SOA_COLUMN(MassV0, massv0, float); //! proton, pion vertex mass -DECLARE_SOA_COLUMN(Chi2MassV0, chi2massv0, float); //! chi2 of proton, pion mass constraint to Lambda mass -DECLARE_SOA_COLUMN(CosPAV0, cospav0, float); //! proton, pion vertex mass - -} // namespace kfvtx3body + vtx3body::Decay3BodyId, + vtx3body::TrackPrId, vtx3body::TrackPiId, vtx3body::TrackDeId, + vtx3body::CollisionId); -DECLARE_SOA_TABLE(KFVtx3BodyDatas, "AOD", "KFVTX3BODYDATA", - o2::soa::Index<>, vtx3body::CollisionId, vtx3body::Track0Id, vtx3body::Track1Id, vtx3body::Track2Id, vtx3body::Decay3BodyId, - - // hypertriton candidate - kfvtx3body::Mass, - vtx3body::X, vtx3body::Y, vtx3body::Z, - kfvtx3body::XErr, kfvtx3body::YErr, kfvtx3body::ZErr, - kfvtx3body::Px, kfvtx3body::Py, kfvtx3body::Pz, kfvtx3body::Pt, - kfvtx3body::PxErr, kfvtx3body::PyErr, kfvtx3body::PzErr, kfvtx3body::PtErr, - kfvtx3body::Sign, - kfvtx3body::DCAVtxToPVKF, kfvtx3body::DCAXYVtxToPVKF, - kfvtx3body::VtxCosPAKF, kfvtx3body::VtxCosXYPAKF, - kfvtx3body::VtxCosPAKFtopo, kfvtx3body::VtxCosXYPAKFtopo, - kfvtx3body::DecayLKF, kfvtx3body::DecayLXYKF, kfvtx3body::DecayLDeltaL, - kfvtx3body::Chi2geoNDF, kfvtx3body::Chi2topoNDF, - kfvtx3body::CTauKFtopo, kfvtx3body::TrackedClSize, - - // V0 - kfvtx3body::MassV0, kfvtx3body::Chi2MassV0, - kfvtx3body::CosPAV0, - - // daughters - vtx3body::PxTrack0, vtx3body::PyTrack0, vtx3body::PzTrack0, // proton - vtx3body::PxTrack1, vtx3body::PyTrack1, vtx3body::PzTrack1, // pion - vtx3body::PxTrack2, vtx3body::PyTrack2, vtx3body::PzTrack2, // deuteron - kfvtx3body::TPCInnerParamTrack0, kfvtx3body::TPCInnerParamTrack1, kfvtx3body::TPCInnerParamTrack2, // proton, pion, deuteron - kfvtx3body::TPCNClTrack0, kfvtx3body::TPCNClTrack1, kfvtx3body::TPCNClTrack2, // proton, pion, deuteron - kfvtx3body::TPCChi2NClDeuteron, - kfvtx3body::DeltaPhiDeuteron, kfvtx3body::DeltaPhiProton, - kfvtx3body::DCATrack0ToPVKF, kfvtx3body::DCATrack1ToPVKF, kfvtx3body::DCATrack2ToPVKF, kfvtx3body::DCAxyTrack0ToPVKF, kfvtx3body::DCAxyTrack1ToPVKF, kfvtx3body::DCAxyTrack2ToPVKF, - kfvtx3body::DCAxyTrack0ToSVKF, kfvtx3body::DCAxyTrack1ToSVKF, kfvtx3body::DCAxyTrack2ToSVKF, - kfvtx3body::DCATrack0ToTrack1KF, kfvtx3body::DCATrack0ToTrack2KF, kfvtx3body::DCATrack1ToTrack2KF, - kfvtx3body::DCAVtxDaughtersKF, - kfvtx3body::DCAxyTrackPosToPV, kfvtx3body::DCAxyTrackNegToPV, kfvtx3body::DCAxyTrackBachToPV, - kfvtx3body::DCATrackPosToPV, kfvtx3body::DCATrackNegToPV, kfvtx3body::DCATrackBachToPV, - kfvtx3body::Track0Sign, kfvtx3body::Track1Sign, kfvtx3body::Track2Sign, // track sing: proton, pion, deuteron - kfvtx3body::TPCNSigmaProton, kfvtx3body::TPCNSigmaPion, kfvtx3body::TPCNSigmaDeuteron, kfvtx3body::TPCNSigmaPionBach, - kfvtx3body::TPCdEdxProton, kfvtx3body::TPCdEdxPion, kfvtx3body::TPCdEdxDeuteron, - kfvtx3body::TOFNSigmaDeuteron, - kfvtx3body::ITSClusSizeDeuteron, - kfvtx3body::PIDTrackingDeuteron); - -using KFVtx3BodyData = KFVtx3BodyDatas::iterator; -namespace kfvtx3body -{ -DECLARE_SOA_INDEX_COLUMN(KFVtx3BodyData, kfvtx3BodyData); //! Index to KFVtx3BodyData entry -} - -DECLARE_SOA_TABLE(KFDecay3BodyDataLink, "AOD", "KF3BODYLINK", //! Joinable table with Decay3bodys which links to KFVtx3BodyData which is not produced for all entries - kfvtx3body::KFVtx3BodyDataId); - -using KFDecay3BodysLinked = soa::Join; -using KFDecay3BodyLinked = KFDecay3BodysLinked::iterator; - -// Lite data candidate table for analysis -DECLARE_SOA_TABLE(KFVtx3BodyDatasLite, "AOD", "KF3BODYLITE", +// reconstructed candidate table for analysis +DECLARE_SOA_TABLE(Vtx3BodyDatas, "AOD", "VTX3BODYDATA", //! o2::soa::Index<>, - // hypertriton candidate - kfvtx3body::Mass, + vtx3body::Sign, + vtx3body::Mass, vtx3body::MassV0, vtx3body::X, vtx3body::Y, vtx3body::Z, - kfvtx3body::Px, kfvtx3body::Py, kfvtx3body::Pz, kfvtx3body::Pt, - kfvtx3body::Sign, - kfvtx3body::DCAVtxToPVKF, kfvtx3body::DCAXYVtxToPVKF, - kfvtx3body::VtxCosPAKF, kfvtx3body::VtxCosXYPAKF, - kfvtx3body::DecayLKF, kfvtx3body::DecayLXYKF, kfvtx3body::DecayLDeltaL, - kfvtx3body::Chi2geoNDF, kfvtx3body::Chi2topoNDF, - kfvtx3body::CTauKFtopo, kfvtx3body::TrackedClSize, - - // V0 - kfvtx3body::MassV0, - kfvtx3body::CosPAV0, - - // daughters - vtx3body::PxTrack0, vtx3body::PyTrack0, vtx3body::PzTrack0, // proton - vtx3body::PxTrack1, vtx3body::PyTrack1, vtx3body::PzTrack1, // pion - vtx3body::PxTrack2, vtx3body::PyTrack2, vtx3body::PzTrack2, // deuteron - kfvtx3body::TPCInnerParamTrack0, kfvtx3body::TPCInnerParamTrack1, kfvtx3body::TPCInnerParamTrack2, // proton, pion, deuteron - kfvtx3body::TPCNClTrack0, kfvtx3body::TPCNClTrack1, kfvtx3body::TPCNClTrack2, // proton, pion, deuteron - kfvtx3body::TPCChi2NClDeuteron, - kfvtx3body::DeltaPhiDeuteron, kfvtx3body::DeltaPhiProton, - kfvtx3body::DCATrack0ToPVKF, kfvtx3body::DCATrack1ToPVKF, kfvtx3body::DCATrack2ToPVKF, kfvtx3body::DCAxyTrack0ToPVKF, kfvtx3body::DCAxyTrack1ToPVKF, kfvtx3body::DCAxyTrack2ToPVKF, - kfvtx3body::DCAxyTrack0ToSVKF, kfvtx3body::DCAxyTrack1ToSVKF, kfvtx3body::DCAxyTrack2ToSVKF, - kfvtx3body::DCATrack0ToTrack1KF, kfvtx3body::DCATrack0ToTrack2KF, kfvtx3body::DCATrack1ToTrack2KF, - kfvtx3body::DCAVtxDaughtersKF, - kfvtx3body::Track0Sign, kfvtx3body::Track1Sign, kfvtx3body::Track2Sign, // track sing: proton, pion, deuteron - kfvtx3body::TPCNSigmaProton, kfvtx3body::TPCNSigmaPion, kfvtx3body::TPCNSigmaDeuteron, kfvtx3body::TPCNSigmaPionBach, - kfvtx3body::TOFNSigmaDeuteron, - kfvtx3body::ITSClusSizeDeuteron, - kfvtx3body::PIDTrackingDeuteron); - -using KFVtx3BodyDataLite = KFVtx3BodyDatasLite::iterator; + vtx3body::Px, vtx3body::Py, vtx3body::Pz, + vtx3body::Chi2, + vtx3body::TrackedClSize, + vtx3body::PxTrackPr, vtx3body::PyTrackPr, vtx3body::PzTrackPr, + vtx3body::PxTrackPi, vtx3body::PyTrackPi, vtx3body::PzTrackPi, + vtx3body::PxTrackDe, vtx3body::PyTrackDe, vtx3body::PzTrackDe, + vtx3body::DCAXYTrackPrToPV, vtx3body::DCAXYTrackPiToPV, vtx3body::DCAXYTrackDeToPV, + vtx3body::DCAZTrackPrToPV, vtx3body::DCAZTrackPiToPV, vtx3body::DCAZTrackDeToPV, + vtx3body::DCATrackPrToSV, vtx3body::DCATrackPiToSV, vtx3body::DCATrackDeToSV, + vtx3body::DCAVtxDaughters, + vtx3body::TPCNSigmaPr, vtx3body::TPCNSigmaPi, vtx3body::TPCNSigmaDe, vtx3body::TPCNSigmaPiBach, + vtx3body::TOFNSigmaDe, + vtx3body::ITSClSizePr, vtx3body::ITSClSizePi, vtx3body::ITSClSizeDe, + vtx3body::TPCNClTrackPr, vtx3body::TPCNClTrackPi, vtx3body::TPCNClTrackDe, + vtx3body::PIDTrackingDe, + + // Dynamic columns + vtx3body::P, + vtx3body::Pt, + vtx3body::VtxRadius, + vtx3body::DistOverTotMom, + vtx3body::VtxCosPA, + vtx3body::DCAVtxToPV, + + // Longitudinal + vtx3body::Rap, + vtx3body::Eta, + vtx3body::Phi, + vtx3body::TrackPrPt, + vtx3body::TrackPrEta, + vtx3body::TrackPrPhi, + vtx3body::TrackPiPt, + vtx3body::TrackPiEta, + vtx3body::TrackPiPhi, + vtx3body::TrackDePt, + vtx3body::TrackDeEta, + vtx3body::TrackDePhi); + +// covariance matrix table +DECLARE_SOA_TABLE(Vtx3BodyCovs, "AOD", "VTX3BODYCOV", //! + vtx3body::CovProton, vtx3body::CovPion, vtx3body::CovDeuteron, + vtx3body::VtxCovMat); // MC candidate table for analysis -DECLARE_SOA_TABLE(McKFVtx3BodyDatas, "AOD", "MCKF3BODYDATAS", +DECLARE_SOA_TABLE(McVtx3BodyDatas, "AOD", "MC3BODYDATA", //! o2::soa::Index<>, - // hypertriton candidate - kfvtx3body::Mass, + vtx3body::Sign, + vtx3body::Mass, vtx3body::MassV0, vtx3body::X, vtx3body::Y, vtx3body::Z, - kfvtx3body::XErr, kfvtx3body::YErr, kfvtx3body::ZErr, - kfvtx3body::Px, kfvtx3body::Py, kfvtx3body::Pz, kfvtx3body::Pt, - kfvtx3body::PxErr, kfvtx3body::PyErr, kfvtx3body::PzErr, kfvtx3body::PtErr, - kfvtx3body::Sign, - kfvtx3body::DCAVtxToPVKF, kfvtx3body::DCAXYVtxToPVKF, - kfvtx3body::VtxCosPAKF, kfvtx3body::VtxCosXYPAKF, - kfvtx3body::VtxCosPAKFtopo, kfvtx3body::VtxCosXYPAKFtopo, - kfvtx3body::DecayLKF, kfvtx3body::DecayLXYKF, kfvtx3body::DecayLDeltaL, - kfvtx3body::Chi2geoNDF, kfvtx3body::Chi2topoNDF, - kfvtx3body::CTauKFtopo, kfvtx3body::TrackedClSize, - - // V0 - kfvtx3body::MassV0, kfvtx3body::Chi2MassV0, - kfvtx3body::CosPAV0, - - // daughters - vtx3body::PxTrack0, vtx3body::PyTrack0, vtx3body::PzTrack0, // proton - vtx3body::PxTrack1, vtx3body::PyTrack1, vtx3body::PzTrack1, // pion - vtx3body::PxTrack2, vtx3body::PyTrack2, vtx3body::PzTrack2, // deuteron - kfvtx3body::TPCInnerParamTrack0, kfvtx3body::TPCInnerParamTrack1, kfvtx3body::TPCInnerParamTrack2, // proton, pion, deuteron - kfvtx3body::TPCNClTrack0, kfvtx3body::TPCNClTrack1, kfvtx3body::TPCNClTrack2, // proton, pion, deuteron - kfvtx3body::TPCChi2NClDeuteron, - kfvtx3body::DeltaPhiDeuteron, kfvtx3body::DeltaPhiProton, - kfvtx3body::DCATrack0ToPVKF, kfvtx3body::DCATrack1ToPVKF, kfvtx3body::DCATrack2ToPVKF, kfvtx3body::DCAxyTrack0ToPVKF, kfvtx3body::DCAxyTrack1ToPVKF, kfvtx3body::DCAxyTrack2ToPVKF, - kfvtx3body::DCAxyTrack0ToSVKF, kfvtx3body::DCAxyTrack1ToSVKF, kfvtx3body::DCAxyTrack2ToSVKF, - kfvtx3body::DCATrack0ToTrack1KF, kfvtx3body::DCATrack0ToTrack2KF, kfvtx3body::DCATrack1ToTrack2KF, - kfvtx3body::DCAVtxDaughtersKF, - kfvtx3body::DCAxyTrackPosToPV, kfvtx3body::DCAxyTrackNegToPV, kfvtx3body::DCAxyTrackBachToPV, - kfvtx3body::DCATrackPosToPV, kfvtx3body::DCATrackNegToPV, kfvtx3body::DCATrackBachToPV, - kfvtx3body::Track0Sign, kfvtx3body::Track1Sign, kfvtx3body::Track2Sign, // track sing: proton, pion, deuteron - kfvtx3body::TPCNSigmaProton, kfvtx3body::TPCNSigmaPion, kfvtx3body::TPCNSigmaDeuteron, kfvtx3body::TPCNSigmaPionBach, - kfvtx3body::TPCdEdxProton, kfvtx3body::TPCdEdxPion, kfvtx3body::TPCdEdxDeuteron, - kfvtx3body::TOFNSigmaDeuteron, - kfvtx3body::ITSClusSizeDeuteron, - kfvtx3body::PIDTrackingDeuteron, - - // MC information - kfvtx3body::GenP, - kfvtx3body::GenPt, - kfvtx3body::GenDecVtxX, kfvtx3body::GenDecVtxY, kfvtx3body::GenDecVtxZ, - kfvtx3body::GenCtau, - kfvtx3body::GenPhi, - kfvtx3body::GenEta, - kfvtx3body::GenRapidity, - kfvtx3body::GenPosP, kfvtx3body::GenPosPt, - kfvtx3body::GenNegP, kfvtx3body::GenNegPt, - kfvtx3body::GenBachP, kfvtx3body::GenBachPt, - kfvtx3body::IsTrueH3L, kfvtx3body::IsTrueAntiH3L, - kfvtx3body::PdgCodeDau0, kfvtx3body::PdgCodeDau1, kfvtx3body::PdgCodeDau2, - kfvtx3body::IsBachPrimary, - kfvtx3body::IsReco, - kfvtx3body::SurvEvSel); - -// Definition of labels for KFVtx3BodyDatas -namespace mckfvtx3bodylabel -{ -DECLARE_SOA_INDEX_COLUMN(McParticle, mcParticle); //! MC particle for KF Vtx3BodyDatas -} // namespace mckfvtx3bodylabel - -DECLARE_SOA_TABLE(McKFVtx3BodyLabels, "AOD", "MCKFVTXLABEL", //! Table joinable with KFVtx3BodyData containing the MC labels - mckfvtx3bodylabel::McParticleId); -using McKFVtx3BodyLabel = McKFVtx3BodyLabels::iterator; - -// Definition of labels for KFDecay3Bodys // Full table, joinable with KFDecay3Bodys (CAUTION: NOT WITH Vtx3BodyDATA) -namespace mcfullkfvtx3bodylabel -{ -DECLARE_SOA_INDEX_COLUMN(McParticle, mcParticle); //! MC particle for Decay3Bodys -} // namespace mcfullkfvtx3bodylabel + vtx3body::Px, vtx3body::Py, vtx3body::Pz, + vtx3body::Chi2, + vtx3body::TrackedClSize, + vtx3body::PxTrackPr, vtx3body::PyTrackPr, vtx3body::PzTrackPr, + vtx3body::PxTrackPi, vtx3body::PyTrackPi, vtx3body::PzTrackPi, + vtx3body::PxTrackDe, vtx3body::PyTrackDe, vtx3body::PzTrackDe, + vtx3body::DCAXYTrackPrToPV, vtx3body::DCAXYTrackPiToPV, vtx3body::DCAXYTrackDeToPV, + vtx3body::DCAZTrackPrToPV, vtx3body::DCAZTrackPiToPV, vtx3body::DCAZTrackDeToPV, + vtx3body::DCATrackPrToSV, vtx3body::DCATrackPiToSV, vtx3body::DCATrackDeToSV, + vtx3body::DCAVtxDaughters, + vtx3body::TPCNSigmaPr, vtx3body::TPCNSigmaPi, vtx3body::TPCNSigmaDe, vtx3body::TPCNSigmaPiBach, + vtx3body::TOFNSigmaDe, + vtx3body::ITSClSizePr, vtx3body::ITSClSizePi, vtx3body::ITSClSizeDe, + vtx3body::TPCNClTrackPr, vtx3body::TPCNClTrackPi, vtx3body::TPCNClTrackDe, + vtx3body::PIDTrackingDe, + + // Monte Carlo information + vtx3body::GenPx, vtx3body::GenPy, vtx3body::GenPz, + vtx3body::GenX, vtx3body::GenY, vtx3body::GenZ, + vtx3body::GenCt, + vtx3body::GenPhi, vtx3body::GenEta, vtx3body::GenRap, + vtx3body::GenPPr, vtx3body::GenPPi, vtx3body::GenPDe, + vtx3body::GenPtPr, vtx3body::GenPtPi, vtx3body::GenPtDe, + vtx3body::IsTrueH3L, vtx3body::IsTrueAntiH3L, + vtx3body::IsReco, + vtx3body::PrPdgCode, vtx3body::PiPdgCode, vtx3body::DePdgCode, + vtx3body::IsDePrimary, + vtx3body::IsSurvEvSel, + + // Dynamic columns + vtx3body::P, + vtx3body::Pt, + vtx3body::GenP, + vtx3body::GenPt, + vtx3body::VtxRadius, + vtx3body::GenRadius, + vtx3body::DistOverTotMom, + vtx3body::VtxCosPA, + vtx3body::DCAVtxToPV, + + // Longitudinal + vtx3body::Rap, + vtx3body::Eta, + vtx3body::Phi, + vtx3body::TrackPrPt, + vtx3body::TrackPrEta, + vtx3body::TrackPrPhi, + vtx3body::TrackPiPt, + vtx3body::TrackPiEta, + vtx3body::TrackPiPhi, + vtx3body::TrackDePt, + vtx3body::TrackDeEta, + vtx3body::TrackDePhi); + +// Define joins +using Vtx3BodyDatasCovs = soa::Join; +using Vtx3BodyDatasCovsIndexed = soa::Join; -DECLARE_SOA_TABLE(McFullKFVtx3BodyLabels, "AOD", "MCFULLKFLABEL", //! Table joinable with Decay3Bodys (CAUTION: NOT WITH Vtx3BodyDATA) - mcfullkfvtx3bodylabel::McParticleId); -using McFullKFVtx3BodyLabel = McFullKFVtx3BodyLabels::iterator; } // namespace o2::aod #endif // PWGLF_DATAMODEL_VTX3BODYTABLES_H_ diff --git a/PWGLF/TableProducer/Nuspex/CMakeLists.txt b/PWGLF/TableProducer/Nuspex/CMakeLists.txt index f8f62f22925..7138fe9ded7 100644 --- a/PWGLF/TableProducer/Nuspex/CMakeLists.txt +++ b/PWGLF/TableProducer/Nuspex/CMakeLists.txt @@ -11,7 +11,7 @@ o2physics_add_dpl_workflow(decay3bodybuilder SOURCES decay3bodybuilder.cxx - PUBLIC_LINK_LIBRARIES O2::DCAFitter KFParticle::KFParticle O2Physics::AnalysisCore O2::TOFBase O2Physics::EventFilteringUtils O2::DetectorsVertexing + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DCAFitter KFParticle::KFParticle O2::TOFBase O2Physics::EventFilteringUtils O2::DetectorsVertexing COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(hyhefour-builder @@ -29,11 +29,6 @@ o2physics_add_dpl_workflow(lnn-reco-task PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DCAFitter COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(hypertriton3bodyfinder - SOURCES hypertriton3bodyfinder.cxx - PUBLIC_LINK_LIBRARIES O2::DCAFitter O2Physics::AnalysisCore - COMPONENT_NAME Analysis) - o2physics_add_dpl_workflow(nucleustreecreator SOURCES LFTreeCreatorNuclei.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore @@ -59,11 +54,6 @@ o2physics_add_dpl_workflow(threebodymcfinder PUBLIC_LINK_LIBRARIES O2::DCAFitter O2Physics::AnalysisCore COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(threebody-reco-task - SOURCES threebodyRecoTask.cxx - PUBLIC_LINK_LIBRARIES O2::DCAFitter O2Physics::AnalysisCore O2Physics::EventFilteringUtils - COMPONENT_NAME Analysis) - o2physics_add_dpl_workflow(ebye-maker SOURCES ebyeMaker.cxx PUBLIC_LINK_LIBRARIES O2::DCAFitter O2Physics::AnalysisCore @@ -79,11 +69,6 @@ o2physics_add_dpl_workflow(pidtof-generic PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::TOFBase COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(threebody-kf-task - SOURCES threebodyKFTask.cxx - PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore - COMPONENT_NAME Analysis) - o2physics_add_dpl_workflow(hypernuclei-kf-reco-task SOURCES hypKfRecoTask.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore KFParticle::KFParticle diff --git a/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx b/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx index b7b643bca21..77c3e5668a7 100644 --- a/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx +++ b/PWGLF/TableProducer/Nuspex/decay3bodybuilder.cxx @@ -9,10 +9,12 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +// ======================== /// \file decay3bodybuilder.cxx -/// \brief Builder task for 3-body decay reconstruction (p + pion + bachelor) +/// \brief Builder task for 3-body hypertriton decay reconstruction (proton + pion + deuteron) /// \author Yuanzhe Wang -/// \author Carolina Reetz (KFParticle specific part) +/// \author Carolina Reetz +// ======================== #include #include @@ -20,25 +22,20 @@ #include #include #include -#include #include - -#include -#include +#include #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "Framework/ASoAHelpers.h" -#include "DCAFitter/DCAFitterN.h" #include "ReconstructionDataFormats/Track.h" -#include "DetectorsVertexing/SVertexHypothesis.h" #include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" -#include "PWGLF/DataModel/LFStrangenessTables.h" #include "PWGLF/DataModel/Reduced3BodyTables.h" #include "PWGLF/DataModel/Vtx3BodyTables.h" #include "PWGLF/DataModel/pidTOFGeneric.h" +#include "PWGLF/Utils/decay3bodyBuilderHelper.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/PIDResponse.h" #include "Common/Core/PID/PIDTOF.h" @@ -53,8 +50,6 @@ #include "DataFormatsParameters/GRPObject.h" #include "DataFormatsParameters/GRPMagField.h" #include "CCDB/BasicCCDBManager.h" -#include "DataFormatsTPC/BetheBlochAleph.h" -#include "DataFormatsCalibration/MeanVertexObject.h" #ifndef HomogeneousField #define HomogeneousField @@ -70,308 +65,207 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; -using std::array; - -using FullTracksExtIU = soa::Join; -using FullTracksExtPIDIU = soa::Join; - -using ColwithEvTimes = o2::soa::Join; -using ColwithEvTimesMults = o2::soa::Join; -using TrackExtIUwithEvTimes = soa::Join; -using TrackExtPIDIUwithEvTimes = soa::Join; - -using MCLabeledTracksIU = soa::Join; - -using ReducedCollisionsMults = soa::Join; -using ReducedCollisionsMultsCents = soa::Join; - -namespace -{ -const float pidCutsLambda[o2::vertexing::SVertexHypothesis::NPIDParams] = {0., 20, 0., 5.0, 0.0, 1.09004e-03, 2.62291e-04, 8.93179e-03, 2.83121}; // Lambda -} // namespace - -struct VtxCandidate { - int track0Id; - int track1Id; - int track2Id; - int collisionId; - int decay3bodyId; - float vtxPos[3]; - float track0P[3]; - float track1P[3]; - float track2P[3]; - float dcadaughters; - float daudcaxytopv[3]; // 0 - proton, 1 - pion, 2 - bachelor - float daudcatopv[3]; // 0 - proton, 1 - pion, 2 - bachelor - float bachelortofNsigma; -}; -struct kfCandidate { - // hypertriton - int collisionID; - int trackPosID; - int trackNegID; - int trackBachID; - int decay3bodyID; - float mass; - float pos[3]; - float posErr[3]; - float mom[4]; - float momErr[4]; - float charge; - float dcaToPV[2]; // 3D, xy - float cpaToPV[2]; // 3D, xy - float cpaToPVtopo[2]; // 3D, xy - float decLen[2]; // 3D, xy - float ldl; - float chi2geoNDF; - float chi2topoNDF; - float ctau; - float trackedClSize; - float DeltaPhiRotDeuteron; - float DeltaPhiRotProton; - // V0 - float massV0; - float chi2massV0; - float cpaV0ToPV; - // daughter momenta - float protonMom[3]; - float pionMom[3]; - float deuteronMom[3]; - float tpcInnerParam[3]; // proton, pion, deuteron - // daughter track quality - int tpcNClDaughters[3]; // proton, pion, deuteron - float tpcChi2NClDeuteron; - // daughter DCAs KF - float DCAdaughterToPV[3]; // proton, pion, deuteron - float DCAdaughterToPVxy[3]; // proton, pion, deuteron - float DCAdaughterToSVxy[3]; // proton, pion, deuteron - float DCAprotonToPion; - float DCAprotonToDeuteron; - float DCApionToDeuteron; - float DCAvtxDaughters3D; - // daughter DCAs to PV propagated with material - float trackDCAxy[3]; // pos, neg, bach - float trackDCA[3]; // pos, neg, bach - // daughter signs - float daughterCharge[3]; // proton, pion, deuteron - // daughter PID - float tpcNsigma[4]; // proton, pion, deuteron, bach with pion hyp - float tpcdEdx[3]; // proton, pion, deuteron - float tofNsigmaDeuteron; - float averageClusterSizeDeuteron; - float pidForTrackingDeuteron; +static constexpr int nParameters = 1; +static const std::vector tableNames{ + "Decay3BodyIndices", + "Vtx3BodyDatas", + "Vtx3BodyCovs", + "McVtx3BodyDatas"}; + +static constexpr int nTablesConst = 4; + +static const std::vector parameterNames{"enable"}; +static const int defaultParameters[nTablesConst][nParameters]{ + {0}, // Decay3BodyIndices + {0}, // Vtx3BodyDatas + {0}, // Vtx3BodyCovs + {0} // McVtx3BodyDatas }; -struct decay3bodyBuilder { - - Produces vtx3bodydata; - Produces kfvtx3bodydata; - Produces kfvtx3bodydatalite; - Service ccdb; - o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; - std::vector VtxCandidates; +using TracksExtPIDIUwithEvTimes = soa::Join; +using TracksExtPIDIUwithEvTimesLabeled = soa::Join; - std::unordered_map ccdbCache; // Maps runNumber -> d_bz - std::unordered_map> grpMagCache; // Maps runNumber -> grpmap +using ColswithEvTimes = o2::soa::Join; +using ColswithEvTimesLabeled = o2::soa::Join; - Zorro zorro; - OutputObj zorroSummary{"zorroSummary"}; +struct decay3bodyBuilder { - std::vector fTrackedClSizeVector; + // helper object + o2::pwglf::decay3bodyBuilderHelper helper; + + // table index : match order above + enum tableIndex { kDecay3BodyIndices = 0, + kVtx3BodyDatas, + kVtx3BodyCovs, + kMcVtx3BodyDatas, + nTables }; + + struct : ProducesGroup { + Produces decay3bodyindices; + Produces vtx3bodydatas; + Produces vtx3bodycovs; + Produces mcvtx3bodydatas; + } products; + + // enablde tables + Configurable> enabledTables{"enabledTables", + {defaultParameters[0], nTables, nParameters, tableNames, parameterNames}, + "Produce this table: 0 - false, 1 - true"}; + std::vector mEnabledTables; // Vector of enabled tables + + // general options + Configurable useMatCorrType{"useMatCorrType", 0, "0: none, 1: TGeo, 2: LUT"}; + Configurable doTrackQA{"doTrackQA", false, "Flag to fill QA histograms for daughter tracks of (selected) decay3body candidates."}; + Configurable doVertexQA{"doVertexQA", false, "Flag to fill QA histograms for PV of (selected) events."}; + Configurable doSel8selection{"doSel8selection", true, "flag for sel8 event selection"}; + Configurable doPosZselection{"doPosZselection", true, "flag for posZ event selection"}; - // Configurables - Configurable d_UseAbsDCA{"d_UseAbsDCA", true, "Use Abs DCAs"}; - - enum Hyp3Body { kH3L = 0, - kH4L, - kHe4L, - kHe5L, - kNHyp3body }; - - enum VtxStep { kVtxAll = 0, - kVtxTPCNcls, - kVtxPIDCut, - kVtxhasSV, - kVtxDcaDau, - kVtxCosPA, - kNVtxSteps }; - - enum kfvtxstep { kKfVtxAll = 0, - kKfVtxCharge, - kKfVtxEta, - kKfVtxTPCNcls, - kKfVtxTPCRows, - kKfVtxTPCPID, - kKfVtxDCAxyPV, - kKfVtxDCAzPV, - kKfVtxV0MassConst, - kKfVtxhasSV, - kKfVtxDcaDau, - kKfVtxDcaDauVtx, - kKfVtxDauPt, - kKfVtxRap, - kKfVtxPt, - kKfVtxMass, - kKfVtxCosPA, - kKfVtxCosPAXY, - kKfVtxChi2geo, - kKfVtxTopoConstr, - kKfVtxChi2topo, - kKfNVtxSteps }; - - HistogramRegistry registry{"registry", {}}; - - // hypothesis - Configurable motherhyp{"motherhyp", 0, "hypothesis of the 3body decayed particle"}; // corresponds to Hyp3Body - int bachelorcharge = 1; // to be updated in Init base on the hypothesis - o2::aod::pidtofgeneric::TofPidNewCollision bachelorTOFPID; // to be updated in Init base on the hypothesis - - // Selection criteria - Configurable d_bz_input{"d_bz", -999, "bz field, -999 is automatic"}; - Configurable mintpcNCls{"mintpcNCls", 70, "min tpc Nclusters"}; - Configurable minCosPA3body{"minCosPA3body", 0.9, "minCosPA3body"}; - Configurable dcavtxdau{"dcavtxdau", 1.0, "DCA Vtx Daughters"}; - Configurable enablePidCut{"enablePidCut", 0, "enable function checkPIDH3L"}; - Configurable TofPidNsigmaMin{"TofPidNsigmaMin", -5, "TofPidNsigmaMin"}; - Configurable TofPidNsigmaMax{"TofPidNsigmaMax", 5, "TofPidNsigmaMax"}; - Configurable TpcPidNsigmaCut{"TpcPidNsigmaCut", 5, "TpcPidNsigmaCut"}; - Configurable minBachPUseTOF{"minBachPUseTOF", 1, "minBachP Enable TOF PID"}; + // data processing options + Configurable doSkimmedProcessing{"doSkimmedProcessing", false, "Apply Zoroo counting in case of skimmed data input"}; + Configurable triggerList{"triggerList", "fTriggerEventF1Proton, fTrackedOmega, fTrackedXi, fOmegaLargeRadius, fDoubleOmega, fOmegaHighMult, fSingleXiYN, fQuadrupleXi, fDoubleXi, fhadronOmega, fOmegaXi, fTripleXi, fOmega, fGammaVeryLowPtEMCAL, fGammaVeryLowPtDCAL, fGammaHighPtEMCAL, fGammaLowPtEMCAL, fGammaVeryHighPtDCAL, fGammaVeryHighPtEMCAL, fGammaLowPtDCAL, fJetNeutralLowPt, fJetNeutralHighPt, fGammaHighPtDCAL, fJetFullLowPt, fJetFullHighPt, fEMCALReadout, fPCMandEE, fPHOSnbar, fPCMHighPtPhoton, fPHOSPhoton, fLD, fPPPHI, fPD, fLLL, fPLL, fPPL, fPPP, fLeadingPtTrack, fHighFt0cFv0Flat, fHighFt0cFv0Mult, fHighFt0Flat, fHighFt0Mult, fHighMultFv0, fHighTrackMult, fHfSingleNonPromptCharm3P, fHfSingleNonPromptCharm2P, fHfSingleCharm3P, fHfPhotonCharm3P, fHfHighPt2P, fHfSigmaC0K0, fHfDoubleCharm2P, fHfBeauty3P, fHfFemto3P, fHfFemto2P, fHfHighPt3P, fHfSigmaCPPK, fHfDoubleCharm3P, fHfDoubleCharmMix, fHfPhotonCharm2P, fHfV0Charm2P, fHfBeauty4P, fHfV0Charm3P, fHfSingleCharm2P, fHfCharmBarToXiBach, fSingleMuHigh, fSingleMuLow, fLMeeHMR, fDiMuon, fDiElectron, fLMeeIMR, fSingleE, fTrackHighPt, fTrackLowPt, fJetChHighPt, fJetChLowPt, fUDdiffLarge, fUDdiffSmall, fITSextremeIonisation, fITSmildIonisation, fH3L3Body, fHe, fH2", "List of triggers used to select events"}; + Configurable onlyKeepInterestedTrigger{"onlyKeepInterestedTrigger", false, "Flag to keep only interested trigger"}; - Configurable useMatCorrType{"useMatCorrType", 0, "0: none, 1: TGeo, 2: LUT"}; // CCDB options - Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; - Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; - Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; - Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; - Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; - // CCDB TOF PID paras - Configurable timestamp{"ccdb-timestamp", -1, "timestamp of the object"}; - Configurable paramFileName{"paramFileName", "", "Path to the parametrization object. If empty the parametrization is not taken from file"}; - Configurable parametrizationPath{"parametrizationPath", "TOF/Calib/Params", "Path of the TOF parametrization on the CCDB or in the file, if the paramFileName is not empty"}; - Configurable passName{"passName", "", "Name of the pass inside of the CCDB parameter collection. If empty, the automatically deceted from metadata (to be implemented!!!)"}; - Configurable timeShiftCCDBPath{"timeShiftCCDBPath", "", "Path of the TOF time shift vs eta. If empty none is taken"}; - Configurable loadResponseFromCCDB{"loadResponseFromCCDB", false, "Flag to load the response from the CCDB"}; - Configurable fatalOnPassNotAvailable{"fatalOnPassNotAvailable", true, "Flag to throw a fatal if the pass is not available in the retrieved CCDB object"}; - // for KFParticle reconstruction struct : ConfigurableGroup { - Configurable cfgSkimmedProcessing{"kfparticleConfigurations.cfgSkimmedProcessing", false, "Flag for skimmed dataset processing"}; - Configurable triggerList{"kfparticleConfigurations.triggerList", "fH3L3Body", "List of triggers used to select events"}; - Configurable cfgOnlyKeepInterestedTrigger{"kfparticleConfigurations.cfgOnlyKeepInterestedTrigger", false, "Flag to keep only interested trigger"}; - Configurable fillCandidateFullTable{"kfparticleConfigurations.fillCandidateFullTable", false, "Switch to fill full table with candidate properties"}; - Configurable doSel8selection{"kfparticleConfigurations.doSel8selection", true, "flag for sel8 event selection"}; - Configurable doPosZselection{"kfparticleConfigurations.doPosZselection", true, "flag for posZ event selection"}; - Configurable doDCAFitterPreMinimum{"kfparticleConfigurations.doDCAFitterPreMinimum", false, "do DCAFitter pre-optimization before KF fit to include material corrections for decay3body vertex"}; - Configurable doTrackQA{"kfparticleConfigurations.doTrackQA", false, "Flag to fill QA histograms for daughter tracks."}; - Configurable doVertexQA{"kfparticleConfigurations.doVertexQA", false, "Flag to fill QA histograms for KFParticle PV."}; - Configurable useLambdaMassConstraint{"kfparticleConfigurations.useLambdaMassConstraint", false, "Apply Lambda mass constraint on proton-pion vertex"}; - Configurable doDCAPreSel{"kfparticleConfigurations.doDCAPreSel", false, "Apply selection on DCA of daughter tracks to PV"}; - Configurable maxEta{"kfparticleConfigurations.maxEta", 1.0, "Maximum eta for proton and pion daughter tracks"}; - Configurable maxEtaDeuteron{"kfparticleConfigurations.maxEtaDeuteron", 0.9, "Maximum eta for deuteron daughter track"}; - Configurable useTPCforPion{"kfparticleConfigurations.useTPCforPion", true, "Flag to ask for TPC info for pion track (PID, nClusters), false: pion track can be ITS only"}; - Configurable mintpcNClsProton{"kfparticleConfigurations.mintpcNClsProton", 70, "Minimum number of TPC clusters for proton track"}; - Configurable mintpcNClsPion{"kfparticleConfigurations.mintpcNClsPion", 70, "Minimum number of TPC clusters for pion track"}; - Configurable mintpcNClsBach{"kfparticleConfigurations.mintpcNClsBach", 70, "Minimum number of TPC clusters for bachelor track"}; - Configurable mintpcCrossedRows{"kfparticleConfigurations.mintpcCrossedRows", 70, "Minimum number of TPC crossed rows for proton and deuteron track"}; - Configurable mintpcCrossedRowsPion{"kfparticleConfigurations.mintpcCrossedRowsPion", 70, "Minimum number of TPC crossed rows for pion track"}; - Configurable minPtProton{"kfparticleConfigurations.minPtProton", 0.1, "Minimum pT of proton track"}; - Configurable maxPtProton{"kfparticleConfigurations.maxPtProton", 10, "Maximum pT of proton track"}; - Configurable minPtPion{"kfparticleConfigurations.minPtPion", 0.1, "Minimum pT of pion track"}; - Configurable maxPtPion{"kfparticleConfigurations.maxPtPion", 10, "Maximum pT of pion track"}; - Configurable minPtDeuteron{"kfparticleConfigurations.minPtDeuteron", 0.1, "Minimum pT of deuteron track"}; - Configurable maxPtDeuteron{"kfparticleConfigurations.maxPtDeuteron", 10, "Maximum pT of deuteron track"}; - Configurable mindcaXYPionPV{"kfparticleConfigurations.mindcaXYPionPV", 0.1, "Minimum DCA XY of the pion daughter track to the PV"}; - Configurable mindcaXYProtonPV{"kfparticleConfigurations.mindcaXYProtonPV", 0.1, "Minimum DCA XY of the proton daughter track to the PV"}; - Configurable mindcaZPionPV{"kfparticleConfigurations.mindcaZPionPV", 0.1, "Minimum DCA Z of the pion daughter track to the PV"}; - Configurable mindcaZProtonPV{"kfparticleConfigurations.mindcaZProtonPV", 0.1, "Minimum DCA Z of the proton daughter track to the PV"}; - Configurable maxtpcnSigma{"kfparticleConfigurations.maxtpcnSigma", 5., "Maximum nSigma TPC for daughter tracks"}; - Configurable maxDcaProDeu{"kfparticleConfigurations.maxDcaProDeu", 1000., "Maximum geometrical distance between proton and deuteron at the SV in 3D with KFParticle"}; - Configurable maxDcaProPi{"kfparticleConfigurations.maxDcaProPi", 1000., "Maximum geometrical distance between proton and pion at the SV in 3D with KFParticle"}; - Configurable maxDcaPiDe{"kfparticleConfigurations.maxDcaPiDe", 1000., "Maximum geometrical distance between pion and deuteron at the SV in 3D with KFParticle"}; - Configurable maxDcaXYSVDau{"kfparticleConfigurations.maxDcaXYSVDau", 1.0, "Maximum geometrical distance of daughter tracks from the SV in XY with KFParticle"}; - Configurable maxRapidityHt{"kfparticleConfigurations.maxRapidityHt", 1., "Maximum rapidity for Hypertriton candidates with KFParticle"}; - Configurable minPtHt{"kfparticleConfigurations.minPtHt", 0.01, "Minimum momentum for Hypertriton candidates with KFParticle (0.01 applied in SVertexer)"}; - Configurable maxPtHt{"kfparticleConfigurations.maxPtHt", 36., "Maximum momentum for Hypertriton candidates with KFParticle"}; - Configurable minMassHt{"kfparticleConfigurations.minMassHt", 2.96, "Minimum candidate mass with KFParticle"}; - Configurable maxMassHt{"kfparticleConfigurations.maxMassHt", 3.05, "Maximum candidate mass with KFParticle"}; - Configurable maxctauHt{"kfparticleConfigurations.maxctauHt", 40., "Maximum candidate ctau with KFParticle before topological constraint"}; - Configurable maxChi2geo{"kfparticleConfigurations.maxChi2geo", 1000., "Maximum chi2 geometrical with KFParticle"}; - Configurable minCosPA{"kfparticleConfigurations.minCosPA", 0.8, "Minimum cosine pointing angle with KFParticle (0.8 applied in SVertexer)"}; - Configurable minCosPAxy{"kfparticleConfigurations.minCosPAxy", 0.8, "Minimum cosine pointing angle in xy with KFParticle"}; - Configurable applyTopoSel{"kfparticleConfigurations.applyTopoSel", false, "Apply selection constraining the mother to the PV with KFParticle"}; - Configurable maxChi2topo{"kfparticleConfigurations.maxChi2topo", 1000., "Maximum chi2 topological with KFParticle"}; - Configurable nEvtMixing{"kfparticleConfigurations.nEvtMixing", 5, "Number of events to mix"}; - ConfigurableAxis binsVtxZ{"kfparticleConfigurations.binsVtxZ", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; - ConfigurableAxis binsMultiplicity{"kfparticleConfigurations.binsMultiplicity", {VARIABLE_WIDTH, 0.0f, 1.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f, 110.0f}, "Mixing bins - multiplicity"}; - // 3body mixing - Configurable mixingType{"kfparticleConfigurations.mixingType", 0, "0: mix V0 from one event with bachelor from another, 1: mix pion and bachelor from one event with proton from another "}; - Configurable applySVertexerV0Cuts{"kfparticleConfigurations.applySVertexerV0Cuts", false, "Apply virtual V0 cuts applied in SVertexer in case of proton mixing"}; - ConfigurableAxis bins3BodyRadius{"kfparticleConfigurations.bins3BodyRadius", {VARIABLE_WIDTH, 0.0f, 0.5f, 1.0f, 1.5f, 2.0f, 3.0f, 4.0f, 6.0f, 8.0f, 10.0f, 12.0f, 14.0f, 16.0f, 18.0f, 20.0f, 30.0f, 1000.0}, "Mixing bins - 3body radius"}; - // ConfigurableAxis bins3BodyPhi{"kfparticleConfigurations.bins3BodyPhi", {VARIABLE_WIDTH, -180.0f*TMath::Pi()/180, -170.0f*TMath::Pi()/180, -160.0f*TMath::Pi()/180, -150.0f*TMath::Pi()/180, -140.0f*TMath::Pi()/180, -130.0f*TMath::Pi()/180, -120.0f*TMath::Pi()/180, -110.0f*TMath::Pi()/180, -100.0f*TMath::Pi()/180, -90.0f*TMath::Pi()/180, -80.0f*TMath::Pi()/180, -70.0f*TMath::Pi()/180, -60.0f*TMath::Pi()/180, -50.0f*TMath::Pi()/180, -40.0f*TMath::Pi()/180, -30.0f*TMath::Pi()/180, -20.0f*TMath::Pi()/180, -10.0f*TMath::Pi()/180, 0.0f, 10.0f*TMath::Pi()/180, 20.0f*TMath::Pi()/180, 30.0f*TMath::Pi()/180, 40.0f*TMath::Pi()/180, 50.0f*TMath::Pi()/180, 60.0f*TMath::Pi()/180, 70.0f*TMath::Pi()/180, 80.0f*TMath::Pi()/180, 90.0f*TMath::Pi()/180, 100.0f*TMath::Pi()/180, 110.0f*TMath::Pi()/180, 120.0f*TMath::Pi()/180, 130.0f*TMath::Pi()/180, 140.0f*TMath::Pi()/180, 150.0f*TMath::Pi()/180, 160.0f*TMath::Pi()/180, 170.0f*TMath::Pi()/180, 180.0f*TMath::Pi()/180}, "Mixing bins - 3body phi"}; - ConfigurableAxis bins3BodyPhi{"kfparticleConfigurations.bins3BodyPhi", {VARIABLE_WIDTH, -180.0f * TMath::Pi() / 180, -160.0f * TMath::Pi() / 180, -140.0f * TMath::Pi() / 180, -120.0f * TMath::Pi() / 180, -100.0f * TMath::Pi() / 180, -80.0f * TMath::Pi() / 180, -60.0f * TMath::Pi() / 180, -40.0f * TMath::Pi() / 180, -20.0f * TMath::Pi() / 180, 0.0f, 20.0f * TMath::Pi() / 180, 40.0f * TMath::Pi() / 180, 60.0f * TMath::Pi() / 180, 80.0f * TMath::Pi() / 180, 100.0f * TMath::Pi() / 180, 120.0f * TMath::Pi() / 180, 140.0f * TMath::Pi() / 180, 160.0f * TMath::Pi() / 180, 180.0f * TMath::Pi() / 180}, "Mixing bins - 3body phi"}; - ConfigurableAxis bins3BodyPosZ{"kfparticleConfigurations.bins3BodyPosZ", {VARIABLE_WIDTH, -300.0f, -42.0f, -13.0f, -6.0f, -4.0f, -2.0f, 0.0f, 2.0f, 4.0f, 6.0f, 13.0f, 42.0f, 300.0f}, "Mixing bins - 3body z position"}; - Configurable selectVtxZ3bodyMixing{"kfparticleConfigurations.selectVtxZ3bodyMixing", true, "Select same VtxZ events in case of 3body mixing"}; - Configurable VtxZBin3bodyMixing{"kfparticleConfigurations.VtxZBin3bodyMixing", 1., "Bin width for event vtx z position in case of 3body mixing"}; - } kfparticleConfigurations; - - //------------------------------------------------------------------ - // Sets for DCAFitter event mixing + std::string prefix = "ccdb"; + Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; + Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; + Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; + Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; + } ccdbConfigurations; + + // Decay3body building options struct : ConfigurableGroup { - Configurable nUseMixed{"dcaFitterEMSel.nUseMixed", 5, "nUseMixed"}; - Configurable mMinPt2V0{"dcaFitterEMSel.mMinPt2V0", 0.5, "mMinPt2V0"}; // minimum pT^2 of V0 - Configurable mMaxTgl2V0{"dcaFitterEMSel.mMaxTgl2V0", 4, "mMaxTgl2V0"}; // maximum tgLambda^2 of V0 - Configurable mMaxDCAXY2ToMeanVertex3bodyV0{"dcaFitterEMSel.mMaxDCAXY2ToMeanVertex3bodyV0", 4, "mMaxDCAXY2ToMeanVertex3bodyV0"}; // max DCA^2 of 2 body decay to mean vertex of 3 body decay in XY - Configurable minCosPAXYMeanVertex3bodyV0{"dcaFitterEMSel.minCosPAXYMeanVertex3bodyV0", 0.9, "minCosPAXYMeanVertex3bodyV0"}; // min CosPA of 2 body decay to mean vertex of 3 body decay in XY - Configurable minCosPA3bodyV0{"dcaFitterEMSel.minCosPA3bodyV0", 0.8, "minCosPA3bodyV0"}; // min CosPA of 3 body decay to PV - Configurable maxRDiffV03body{"dcaFitterEMSel.maxRDiffV03body", 3, "maxRDiffV03body"}; // Maximum difference between virtual V0 and 3body radius - Configurable minPt3Body = {"dcaFitterEMSel.minPt3Body", 0.01, ""}; // minimum pT of 3body Vertex - Configurable maxTgl3Body = {"dcaFitterEMSel.maxTgl3Body", 2, ""}; // maximum tgLambda of 3body Vertex - Configurable maxDCAXY3Body{"dcaFitterEMSel.maxDCAXY3Body", 0.5, "DCAXY H3L to PV"}; // max DCA of 3 body decay to PV in XY - Configurable maxDCAZ3Body{"dcaFitterEMSel.maxDCAZ3Body", 1.0, "DCAZ H3L to PV"}; // max DCA of 3 body decay to PV in Z - // Binning for mixing events - ConfigurableAxis binsVtxZ{"dcaFitterEMSel.binsVtxZ", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; - ConfigurableAxis binsMultiplicity{"dcaFitterEMSel.binsMultiplicity", {VARIABLE_WIDTH, 0.0f, 1.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f, 110.0f}, "Mixing bins - multiplicity"}; - Configurable maxDeltaRadiusColMixing{"dcaFitterEMSel.maxDeltaRadiusColMixing", 2., "max difference between pv z position in case of collision mixing"}; - Configurable maxDeltaPhiColMixing{"dcaFitterEMSel.maxDeltaPhiColMixing", 30., "max difference between Phi of monther particle in case of collision mixing (degree)"}; - // Configurations for mixing decay3bodys - // Configurable cfgUseDCAFitterInfo{"dcaFitterEMSel.cfgUseDCAFitterInfo", true, ""}; // if use information from dcatFitter while mixing reduced 3bodys - Configurable cfgMix3BodyMethod{"dcaFitterEMSel.cfgMix3BodyMethod", 0, ""}; // 0: bachelor, 1: pion, 2: proton - Configurable cfgApplyV0Cut{"dcaFitterEMSel.cfgApplyV0Cut", true, "if apply V0 cut while performing event-mixing"}; - ConfigurableAxis bins3BodyRadius{"dcaFitterEMSel.bins3BodyRadius", {VARIABLE_WIDTH, 0.0f, 2.0f, 4.0f, 7.0f, 10.0f, 14.0f, 18.0f, 22.0f, 30.0f, 40.0f}, "Mixing bins - 3body radius"}; - ConfigurableAxis bins3BodyPhi{"dcaFitterEMSel.bins3BodyPhi", {VARIABLE_WIDTH, -3.15, -2.15, -1, 0, 1, 2.15, 3.15}, "Mixing bins - 3body phi"}; - ConfigurableAxis bins3BodyPhiDegree{"dcaFitterEMSel.bins3BodyPhiDegree", {VARIABLE_WIDTH, -180, -120, -60, 0, 60, 120, 180}, "Mixing bins - 3body phi"}; - ConfigurableAxis bins3BodyPosZ{"dcaFitterEMSel.bins3BodyPosZ", {VARIABLE_WIDTH, -500.0f, -200.0f, -100.0f, -70.0f, -60.0f, -50.0f, -40.0f, -35.0f, -30.0f, -25.0f, -20.0f, -15.0f, -13.0f, -10.0f, -8.0f, -6.0f, -4.0f, -2.0f, 0.0f, 2.0f, 4.0f, 6.0f, 8.0f, 10.0f, 13.0f, 15.0f, 20.0f, 25.0f, 30.0f, 35.0f, 40.0f, 50.0f, 60.0f, 70.0f, 100.0f, 200.0f, 500.0f}, "3body SV z position"}; - Configurable selectPVPosZ3bodyMixing{"dcaFitterEMSel.selectPVPosZ3bodyMixing", true, "Select same pvPosZ events in case of 3body mixing"}; - Configurable maxDeltaPVPosZ3bodyMixing{"dcaFitterEMSel.maxDeltaPVPosZ3bodyMixing", 1., "max difference between pv z position in case of 3body mixing"}; - } dcaFitterEMSel; - - SliceCache cache; - using BinningTypeColEM = ColumnBinningPolicy; - using Binning3BodyDCAFitter = ColumnBinningPolicy; - using Binning3BodyKFInfo = ColumnBinningPolicy; - - // KF event mixing - using BinningTypeKF = ColumnBinningPolicy; + std::string prefix = "decay3bodyBuilderOpts"; + // building options + Configurable useKFParticle{"useKFParticle", false, "Use KFParticle for decay3body building"}; + Configurable kfSetTopologicalConstraint{"kfSetTopologicalConstraint", false, "Set topological vertex constraint in case of KFParticle reconstruction"}; + Configurable useSelections{"useSelections", true, "Apply selections during decay3body building"}; + Configurable useTPCforPion{"useTPCforPion", false, "Flag to ask for TPC info for pion track (PID, nClusters), false: pion track can be ITS only"}; + Configurable acceptTPCOnly{"acceptTPCOnly", false, "Accept TPC only tracks as daughters"}; + Configurable calculateCovariance{"calculateCovariance", true, "Calculate candidate and daughter covariance matrices"}; + // daughter track selections + Configurable maxEtaDaughters{"maxEtaDaughters", 0.9, "Max eta of daughters"}; + Configurable minTPCNClProton{"minTPCNClProton", 90, "Min TPC NClusters of proton daughter"}; + Configurable minTPCNClPion{"minTPCNClPion", 70, "Min TPC NClusters of pion daughter"}; + Configurable minTPCNClDeuteron{"minTPCNClDeuteron", 100, "Min TPC NClusters of deuteron daughter"}; + Configurable minDCAProtonToPV{"minDCAProtonToPV", 0.1, "Min DCA of proton to PV"}; + Configurable minDCAPionToPV{"minDCAPionToPV", 0.1, "Min DCA of pion to PV"}; + Configurable minDCADeuteronToPV{"minDCADeuteronToPV", 0.1, "Min DCA of deuteron to PV"}; + Configurable minPtProton{"minPtProton", 0.3, "Min Pt of proton daughter"}; + Configurable minPtPion{"minPtPion", 0.1, "Min Pt of pion daughter"}; + Configurable minPtDeuteron{"minPtDeuteron", 0.6, "Min Pt of deuteron daughter"}; + Configurable maxPtProton{"maxPtProton", 5.0, "Max Pt of proton daughter"}; + Configurable maxPtPion{"maxPtPion", 1.2, "Max Pt of pion daughter"}; + Configurable maxPtDeuteron{"maxPtDeuteron", 10.0, "Max Pt of deuteron daughter"}; + Configurable maxTPCnSigma{"maxTPCnSigma", 5.0, "Min/max TPC nSigma of daughter tracks"}; + Configurable minTOFnSigmaDeuteron{"minTOFnSigmaDeuteron", -5.0, "Min TOF nSigma of deuteron daughter"}; + Configurable maxTOFnSigmaDeuteron{"maxTOFnSigmaDeuteron", 5.0, "Max TOF nSigma of deuteron daughter"}; + Configurable minPDeuteronUseTOF{"minPDeuteronUseTOF", 1.0, "Min P of deuteron to use TOF PID"}; + Configurable maxDCADauAtSV{"maxDCADauAtSV", 0.5, "Max DCA of daughters at SV (quadratic sum of daughter DCAs between each other)"}; + // candidate selections + Configurable maxRapidity{"maxRapidity", 1.0, "Max rapidity of decay3body vertex"}; + Configurable minPt{"minPt", 2.0, "Min Pt of decay3body candidate"}; + Configurable maxPt{"maxPt", 5.0, "Max Pt of decay3body candidate"}; + Configurable minMass{"minMass", 2.96, "Min mass of decay3body candidate"}; + Configurable maxMass{"maxMass", 3.04, "Max mass of decay3body candidate"}; + Configurable minCtau{"minCtau", 0.0, "Min ctau of decay3body candidate"}; + Configurable maxCtau{"maxCtau", 100.0, "Max ctau of decay3body candidate"}; + Configurable minCosPA{"minCosPA", 0.9, "Min cosPA of decay3body candidate"}; + Configurable maxChi2{"maxChi2", 100.0, "Max chi2 of decay3body candidate"}; + } decay3bodyBuilderOpts; - // 3body mixing - // using Binning3Body = ColumnBinningPolicy; - using Binning3Body = ColumnBinningPolicy; + struct : ConfigurableGroup { + std::string prefix = "mixingOpts"; + Configurable n3bodyMixing{"n3bodyMixing", 0, "Number of decay3bodys to mix: 0 - value set to maximum bin entry in hDecay3BodyRadiusPhi, > 0 - manual setting"}; + Configurable mixingType{"mixingType", 0, "0: mix V0 from one event with bachelor from another, 1: mix pion and bachelor from one event with proton from another, 1: mix proton and bachelor from one event with pion from another "}; + ConfigurableAxis bins3BodyRadius{"mixingOpts.bins3BodyRadius", {VARIABLE_WIDTH, 0.0f, 2.0f, 4.0f, 7.0f, 10.0f, 14.0f, 18.0f, 22.0f, 30.0f, 40.0f}, "Mixing bins - 3body radius"}; + ConfigurableAxis bins3BodyPhi{"mixingOpts.bins3BodyPhi", {VARIABLE_WIDTH, -180 * TMath::Pi() / 180, -120 * TMath::Pi() / 180, -60 * TMath::Pi() / 180, 0, 60 * TMath::Pi() / 180, 120 * TMath::Pi() / 180, 180 * TMath::Pi() / 180}, "Mixing bins - 3body phi (rad)"}; + ConfigurableAxis bins3BodyPhiDegree{"mixingOpts.bins3BodyPhiDegree", {VARIABLE_WIDTH, -180, -120, -60, 0, 60, 120, 180}, "Mixing bins - 3body phi (degree)"}; + ConfigurableAxis bins3BodyPosZ{"mixingOpts.bins3BodyPosZ", {VARIABLE_WIDTH, -500.0f, -200.0f, -100.0f, -70.0f, -60.0f, -50.0f, -40.0f, -35.0f, -30.0f, -25.0f, -20.0f, -15.0f, -13.0f, -10.0f, -8.0f, -6.0f, -4.0f, -2.0f, 0.0f, 2.0f, 4.0f, 6.0f, 8.0f, 10.0f, 13.0f, 15.0f, 20.0f, 25.0f, 30.0f, 35.0f, 40.0f, 50.0f, 60.0f, 70.0f, 100.0f, 200.0f, 500.0f}, "3body SV z position"}; + Configurable selectPVPosZ3bodyMixing{"selectPVPosZ3bodyMixing", true, "Select same pvPosZ events in case of 3body mixing"}; + Configurable maxDeltaPVPosZ3bodyMixing{"maxDeltaPVPosZ3bodyMixing", 1., "max difference between PV z position in case of 3body mixing"}; + // SVertexer selections + Configurable minPt2V0{"minPt2V0", 0.5, "Min Pt squared of V0"}; + Configurable maxTgl2V0{"maxTgl2V0", 4, "Max tgl squared of V0"}; + Configurable maxDCAXY2ToMeanVertex3bodyV0{"maxDCAXY2ToMeanVertex3bodyV0", 4, "Max DCA XY squared of V0 to mean vertex"}; + Configurable minCosPAXYMeanVertex3bodyV0{"minCosPAXYMeanVertex3bodyV0", 0.9, "Min cosPA XY of V0 to mean vertex"}; + Configurable minCosPA3bodyV0{"minCosPA3bodyV0", 0.8, "Min cosPA of V0"}; + Configurable maxRDiffV03body{"maxRDiffV03body", 3, "Max RDiff of V0 to 3body"}; + Configurable minPt3Body{"minPt3Body", 0.5, "Min Pt of 3body"}; + Configurable maxTgl3Body{"maxTgl3Body", 0.01, "Max tgl of 3body"}; + Configurable maxDCAXY3Body{"maxDCAXY3Body", 0.5, "Max DCA XY of 3body"}; + Configurable maxDCAZ3Body{"maxDCAZ3Body", 1.0, "Max DCA Z of 3body"}; + } mixingOpts; - // Filters and slices - Preslice perCollision = o2::aod::decay3body::collisionId; - Preslice perReducedCollision = o2::aod::reduceddecay3body::collisionId; + struct : ConfigurableGroup { + std::string prefix = "tofPIDOpts"; + Configurable timestamp{"ccdb-timestamp", -1, "timestamp of the object"}; + Configurable paramFileName{"paramFileName", "", "Path to the parametrization object. If empty the parametrization is not taken from file"}; + Configurable parametrizationPath{"parametrizationPath", "TOF/Calib/Params", "Path of the TOF parametrization on the CCDB or in the file, if the paramFileName is not empty"}; + Configurable passName{"passName", "", "Name of the pass inside of the CCDB parameter collection. If empty, the automatically deceted from metadata (to be implemented!!!)"}; + Configurable timeShiftCCDBPath{"timeShiftCCDBPath", "", "Path of the TOF time shift vs eta. If empty none is taken"}; + Configurable loadResponseFromCCDB{"loadResponseFromCCDB", false, "Flag to load the response from the CCDB"}; + Configurable fatalOnPassNotAvailable{"fatalOnPassNotAvailable", true, "Flag to throw a fatal if the pass is not available in the retrieved CCDB object"}; + } tofPIDOpts; + + // Helper struct to contain MC information prior to filling + struct mc3Bodyinfo { + int label; + std::array genDecVtx{0.f}; + std::array genMomentum{0.f}; + float genCt; + float genPhi; + float genEta; + float genRapidity; + float genMomProton; + float genMomPion; + float genMomDeuteron; + float genPtProton; + float genPtPion; + float genPtDeuteron; + bool isTrueH3L; + bool isTrueAntiH3L; + bool isReco; + int daughterPrPdgCode; + int daughterPiPdgCode; + int daughterDePdgCode; + bool isDeuteronPrimary; + bool survivedEventSel; + }; + mc3Bodyinfo this3BodyMCInfo; + // CCDB and magnetic field int mRunNumber; float d_bz; - float maxSnp; // max sine phi for propagation - float maxStep; // max step size (cm) for propagation + Service ccdb; + o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; + std::unordered_map ccdbCache; // Maps runNumber -> d_bz o2::base::MatLayerCylSet* lut = nullptr; - o2::vertexing::DCAFitterN<2> fitterV0; - o2::vertexing::DCAFitterN<3> fitter3body; + + // histogram registry + HistogramRegistry registry{"Registry", {}, OutputObjHandlingPolicy::AnalysisObject}; + + // bachelor TOF PID + o2::aod::pidtofgeneric::TofPidNewCollision bachelorTOFPID; // to be updated in Init based on the hypothesis + o2::aod::pidtofgeneric::TofPidNewCollision bachelorTOFPIDLabeled; // to be updated in Init based on the hypothesis o2::pid::tof::TOFResoParamsV2 mRespParamsV2; - std::array mV0Hyps; // 0 - Lambda, 1 - AntiLambda - bool doUpdateGRPMagField = false; // if initialize magnetic field for each bc - o2::dataformats::VertexBase mMeanVertex{{0., 0., 0.}, {0.1 * 0.1, 0., 0.1 * 0.1, 0., 0., 6. * 6.}}; + + // 3body mixing + using Binning3BodyKF = ColumnBinningPolicy; + using Binning3BodyDCAfitter = ColumnBinningPolicy; + + // skimmed processing + Zorro zorro; + OutputObj zorroSummary{"zorroSummary"}; + + // tracked cluster size + std::vector fTrackedClSizeVector; + + // MC info + std::vector isGoodCollision; void init(InitContext&) { @@ -379,276 +273,238 @@ struct decay3bodyBuilder { mRunNumber = 0; d_bz = 0; - maxSnp = 0.85f; // could be changed later - maxStep = 2.00f; // could be changed later - - // set hypothesis corresponds to Hyp3Body, tpcpid to be implemented - switch (motherhyp) { - case Hyp3Body::kH3L: - bachelorcharge = 1; - bachelorTOFPID.SetPidType(o2::track::PID::Deuteron); - break; - case Hyp3Body::kH4L: - bachelorcharge = 1; - bachelorTOFPID.SetPidType(o2::track::PID::Triton); - break; - case Hyp3Body::kHe4L: - bachelorcharge = 2; - bachelorTOFPID.SetPidType(o2::track::PID::Helium3); - break; - case Hyp3Body::kHe5L: - bachelorcharge = 2; - bachelorTOFPID.SetPidType(o2::track::PID::Alpha); - break; - default: - LOG(fatal) << "Wrong hypothesis for decay3body"; - return; - } - fitterV0.setPropagateToPCA(true); - fitterV0.setMaxR(200.); - fitterV0.setMinParamChange(1e-3); - fitterV0.setMinRelChi2Change(0.9); - fitterV0.setMaxDZIni(1e9); - fitterV0.setMaxChi2(1e9); - fitterV0.setUseAbsDCA(d_UseAbsDCA); - - fitter3body.setPropagateToPCA(true); - fitter3body.setMaxR(200.); //->maxRIni3body - fitter3body.setMinParamChange(1e-3); - fitter3body.setMinRelChi2Change(0.9); - fitter3body.setMaxDZIni(1e9); - fitter3body.setMaxChi2(1e9); - fitter3body.setUseAbsDCA(d_UseAbsDCA); - - // Material correction in the DCA fitter - ccdb->setURL(ccdburl); + mEnabledTables.resize(nTables, 0); + + // CCDB options + ccdb->setURL(ccdbConfigurations.ccdburl); ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); ccdb->setFatalWhenNull(false); + // Set material correction if (useMatCorrType == 1) { LOGF(info, "TGeo correction requested, loading geometry"); if (!o2::base::GeometryManager::isGeometryLoaded()) { - ccdb->get(geoPath); + ccdb->get(ccdbConfigurations.geoPath); } + matCorr = o2::base::Propagator::MatCorrType::USEMatCorrTGeo; } if (useMatCorrType == 2) { LOGF(info, "LUT correction requested, loading LUT"); - lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get(lutPath)); - } - - // Material correction in the DCA fitter - if (useMatCorrType == 1) - matCorr = o2::base::Propagator::MatCorrType::USEMatCorrTGeo; - if (useMatCorrType == 2) + lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get(ccdbConfigurations.lutPath)); matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT; - - fitterV0.setMatCorrType(matCorr); - fitter3body.setMatCorrType(matCorr); - - // Add histograms separately for different process functions - if (doprocessRun3 == true || doprocessRun3Reduced) { - registry.add("hEventCounter", "hEventCounter", HistType::kTH1F, {{1, 0.0f, 1.0f}}); - } - - if (doprocessRun3 == true || doprocessRun3Reduced || doprocessRun3ReducedEM == true || doprocessRun3Reduced3bodyMixing == true || doprocessRun3Reduced3bodyMixingKFInfo == true) { - auto hVtx3BodyCounter = registry.add("hVtx3BodyCounter", "hVtx3BodyCounter", HistType::kTH1D, {{6, 0.0f, 6.0f}}); - hVtx3BodyCounter->GetXaxis()->SetBinLabel(1, "Total"); - hVtx3BodyCounter->GetXaxis()->SetBinLabel(2, "TPCNcls"); - hVtx3BodyCounter->GetXaxis()->SetBinLabel(3, "PIDCut"); - hVtx3BodyCounter->GetXaxis()->SetBinLabel(4, "HasSV"); - hVtx3BodyCounter->GetXaxis()->SetBinLabel(5, "DcaDau"); - hVtx3BodyCounter->GetXaxis()->SetBinLabel(6, "CosPA"); - registry.add("hBachelorTOFNSigmaDe", "", HistType::kTH2F, {{40, -10.0f, 10.0f, "p/z (GeV/c)"}, {40, -10.0f, 10.0f, "TOF n#sigma"}}); } - if (doprocessRun3ReducedEM == true) { - registry.add("hEventCount", "hEventCount", HistType::kTH2F, {dcaFitterEMSel.binsVtxZ, dcaFitterEMSel.binsMultiplicity}); - registry.add("hEventPairs", "hEventPairs", HistType::kTH2F, {dcaFitterEMSel.binsVtxZ, dcaFitterEMSel.binsMultiplicity}); - registry.add("hDecay3BodyPairsBeforeCut", "hDecay3BodyPairsBeforeCut", HistType::kTH2F, {dcaFitterEMSel.binsVtxZ, dcaFitterEMSel.binsMultiplicity}); - registry.add("hDecay3BodyPairsAfterCut", "hDecay3BodyPairsAfterCut", HistType::kTH2F, {dcaFitterEMSel.binsVtxZ, dcaFitterEMSel.binsMultiplicity}); - registry.add("hRadius0", "hRadius0", HistType::kTH1F, {{200, 0.0f, 20.0f, "Radius (cm)"}}); - registry.add("hRadius1", "hRadius1", HistType::kTH1F, {{200, 0.0f, 20.0f, "Radius (cm)"}}); - registry.add("hDeltaRadius", "hDeltaRadius", HistType::kTH1F, {{400, -20.0f, 20.0f, "#Delta Radius (cm)"}}); - registry.add("hPhi0", "hPhi0", HistType::kTH1F, {{360, -180.0f, 180.0f, "#phi (degree)"}}); - registry.add("hPhi1", "hPhi1", HistType::kTH1F, {{360, -180.0f, 180.0f, "#phi (degree)"}}); - registry.add("hDeltaPhi", "hDeltaPhi", HistType::kTH1F, {{360, -180.0f, 180.0f, "#Delta #phi (degree)"}}); + helper.fitterV0.setMatCorrType(matCorr); + helper.fitter3body.setMatCorrType(matCorr); + + // set bachelor PID + bachelorTOFPID.SetPidType(o2::track::PID::Deuteron); + bachelorTOFPIDLabeled.SetPidType(o2::track::PID::Deuteron); + + // set decay3body parameters in the helper + helper.decay3bodyselections.maxEtaDaughters = decay3bodyBuilderOpts.maxEtaDaughters; + helper.decay3bodyselections.minTPCNClProton = decay3bodyBuilderOpts.minTPCNClProton; + helper.decay3bodyselections.minTPCNClPion = decay3bodyBuilderOpts.minTPCNClPion; + helper.decay3bodyselections.minTPCNClDeuteron = decay3bodyBuilderOpts.minTPCNClDeuteron; + helper.decay3bodyselections.minDCAProtonToPV = decay3bodyBuilderOpts.minDCAProtonToPV; + helper.decay3bodyselections.minDCAPionToPV = decay3bodyBuilderOpts.minDCAPionToPV; + helper.decay3bodyselections.minDCADeuteronToPV = decay3bodyBuilderOpts.minDCADeuteronToPV; + helper.decay3bodyselections.minPtProton = decay3bodyBuilderOpts.minPtProton; + helper.decay3bodyselections.minPtPion = decay3bodyBuilderOpts.minPtPion; + helper.decay3bodyselections.minPtDeuteron = decay3bodyBuilderOpts.minPtDeuteron; + helper.decay3bodyselections.maxPtProton = decay3bodyBuilderOpts.maxPtProton; + helper.decay3bodyselections.maxPtPion = decay3bodyBuilderOpts.maxPtPion; + helper.decay3bodyselections.maxPtDeuteron = decay3bodyBuilderOpts.maxPtDeuteron; + helper.decay3bodyselections.maxTPCnSigma = decay3bodyBuilderOpts.maxTPCnSigma; + helper.decay3bodyselections.minTOFnSigmaDeuteron = decay3bodyBuilderOpts.minTOFnSigmaDeuteron; + helper.decay3bodyselections.maxTOFnSigmaDeuteron = decay3bodyBuilderOpts.maxTOFnSigmaDeuteron; + helper.decay3bodyselections.minPDeuteronUseTOF = decay3bodyBuilderOpts.minPDeuteronUseTOF; + helper.decay3bodyselections.maxDCADauAtSV = decay3bodyBuilderOpts.maxDCADauAtSV; + helper.decay3bodyselections.maxRapidity = decay3bodyBuilderOpts.maxRapidity; + helper.decay3bodyselections.minPt = decay3bodyBuilderOpts.minPt; + helper.decay3bodyselections.maxPt = decay3bodyBuilderOpts.maxPt; + helper.decay3bodyselections.minMass = decay3bodyBuilderOpts.minMass; + helper.decay3bodyselections.maxMass = decay3bodyBuilderOpts.maxMass; + helper.decay3bodyselections.minCtau = decay3bodyBuilderOpts.minCtau; + helper.decay3bodyselections.maxCtau = decay3bodyBuilderOpts.maxCtau; + helper.decay3bodyselections.minCosPA = decay3bodyBuilderOpts.minCosPA; + helper.decay3bodyselections.maxChi2 = decay3bodyBuilderOpts.maxChi2; + + // set SVertexer selection parameters in the helper + helper.svertexerselections.minPt2V0 = mixingOpts.minPt2V0; + helper.svertexerselections.maxTgl2V0 = mixingOpts.maxTgl2V0; + helper.svertexerselections.maxDCAXY2ToMeanVertex3bodyV0 = mixingOpts.maxDCAXY2ToMeanVertex3bodyV0; + helper.svertexerselections.minCosPAXYMeanVertex3bodyV0 = mixingOpts.minCosPAXYMeanVertex3bodyV0; + helper.svertexerselections.minCosPA3bodyV0 = mixingOpts.minCosPA3bodyV0; + helper.svertexerselections.maxRDiffV03body = mixingOpts.maxRDiffV03body; + helper.svertexerselections.minPt3Body = mixingOpts.minPt3Body; + helper.svertexerselections.maxTgl3Body = mixingOpts.maxTgl3Body; + helper.svertexerselections.maxDCAXY3Body = mixingOpts.maxDCAXY3Body; + helper.svertexerselections.maxDCAZ3Body = mixingOpts.maxDCAZ3Body; + + // list enabled process functions + LOGF(info, "*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*"); + LOGF(info, " Decay3body builder: basic configuration listing"); + LOGF(info, "*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*"); + + if (doprocessRealData) { + LOGF(info, " ===> process function enabled: processRealData"); + } + if (doprocessRealDataReduced) { + LOGF(info, " ===> process function enabled: processRealDataReduced"); + } + if (doprocessRealDataReduced3bodyMixing) { + LOGF(info, " ===> process function enabled: processRealDataReduced3bodyMixing"); + } + if (doprocessMonteCarlo) { + LOGF(info, " ===> process function enabled: processMonteCarlo"); + } + + // list enabled tables + for (int i = 0; i < nTables; i++) { + if (mEnabledTables[i]) { + LOGF(info, " -~> Table enabled: %s", tableNames[i]); + } + } + + // print base cuts + LOGF(info, "*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*"); + LOGF(info, "-~> max daughter eta ..............: %f", decay3bodyBuilderOpts.maxEtaDaughters.value); + LOGF(info, "-~> min TPC ncls proton ...........: %i", decay3bodyBuilderOpts.minTPCNClProton.value); + LOGF(info, "-~> min TPC ncls pion .............: %i", decay3bodyBuilderOpts.minTPCNClPion.value); + LOGF(info, "-~> min TPC ncls bach .............: %i", decay3bodyBuilderOpts.minTPCNClDeuteron.value); + LOGF(info, "-~> min DCA proton to PV ..........: %f", decay3bodyBuilderOpts.minDCAProtonToPV.value); + LOGF(info, "-~> min DCA pion to PV ............: %f", decay3bodyBuilderOpts.minDCAPionToPV.value); + LOGF(info, "-~> min DCA bach to PV ............: %f", decay3bodyBuilderOpts.minDCADeuteronToPV.value); + LOGF(info, "-~> min pT proton .................: %f", decay3bodyBuilderOpts.minPtProton.value); + LOGF(info, "-~> min pT pion ...................: %f", decay3bodyBuilderOpts.minPtPion.value); + LOGF(info, "-~> min pT bach ...................: %f", decay3bodyBuilderOpts.minPtDeuteron.value); + LOGF(info, "-~> max pT proton .................: %f", decay3bodyBuilderOpts.maxPtProton.value); + LOGF(info, "-~> max pT pion ...................: %f", decay3bodyBuilderOpts.maxPtPion.value); + LOGF(info, "-~> max pT bach ...................: %f", decay3bodyBuilderOpts.maxPtDeuteron.value); + LOGF(info, "-~> max TPC nSigma ...............: %f", decay3bodyBuilderOpts.maxTPCnSigma.value); + LOGF(info, "-~> min TOF nSigma deuteron ......: %f", decay3bodyBuilderOpts.minTOFnSigmaDeuteron.value); + LOGF(info, "-~> max TOF nSigma deuteron ......: %f", decay3bodyBuilderOpts.maxTOFnSigmaDeuteron.value); + LOGF(info, "-~> min p bach use TOF ...........: %f", decay3bodyBuilderOpts.minPDeuteronUseTOF.value); + LOGF(info, "-~> max DCA dau at SV ............: %f", decay3bodyBuilderOpts.maxDCADauAtSV.value); + LOGF(info, "-~> max rapidity .................: %f", decay3bodyBuilderOpts.maxRapidity.value); + LOGF(info, "-~> min pT .......................: %f", decay3bodyBuilderOpts.minPt.value); + LOGF(info, "-~> max pT .......................: %f", decay3bodyBuilderOpts.maxPt.value); + LOGF(info, "-~> min mass .....................: %f", decay3bodyBuilderOpts.minMass.value); + LOGF(info, "-~> max mass .....................: %f", decay3bodyBuilderOpts.maxMass.value); + LOGF(info, "-~> min ctau .....................: %f", decay3bodyBuilderOpts.minCtau.value); + LOGF(info, "-~> max ctau .....................: %f", decay3bodyBuilderOpts.maxCtau.value); + LOGF(info, "-~> min cosPA ....................: %f", decay3bodyBuilderOpts.minCosPA.value); + LOGF(info, "-~> max chi2 .....................: %f", decay3bodyBuilderOpts.maxChi2.value); + LOGF(info, "*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*"); + + // bookkeeping histograms + auto h = registry.add("Counters/hTableBuildingStatistics", "hTableBuildingStatistics", kTH1D, {{nTablesConst, -0.5f, static_cast(nTablesConst)}}); + auto h2 = registry.add("Counters/hInputStatistics", "hInputStatistics", kTH1D, {{nTablesConst, -0.5f, static_cast(nTablesConst)}}); + h2->SetTitle("Input table sizes"); + + // configure tables to generate + for (int i = 0; i < nTables; i++) { + h->GetXaxis()->SetBinLabel(i + 1, tableNames[i].c_str()); + h2->GetXaxis()->SetBinLabel(i + 1, tableNames[i].c_str()); + h->SetBinContent(i + 1, 0); // mark all as disabled to start + + int f = enabledTables->get(tableNames[i].c_str(), "enable"); + if (f == 1) { + mEnabledTables[i] = 1; + h->SetBinContent(i + 1, 1); // mark enabled + } + } + + if (mEnabledTables[kVtx3BodyDatas] && mEnabledTables[kMcVtx3BodyDatas]) { + LOG(fatal) << "Tables Vtx3BodyDatas and McVtx3BodyDatas cannot both be enabled at the same time. Choose one!"; } - if (doprocessRun3Reduced3bodyMixing == true || doprocessRun3Reduced3bodyMixingKFInfo == true) { - registry.add("hDecay3BodyRadiusPhi", "hDecay3BodyRadiusPhi", HistType::kTH2F, {dcaFitterEMSel.bins3BodyRadius, dcaFitterEMSel.bins3BodyPhi}); - registry.add("hDecay3BodyPosZ", "hDecay3BodyPosZ", HistType::kTH1F, {dcaFitterEMSel.bins3BodyPosZ}); - auto h3bodyCombinationCounter = registry.add("h3bodyCombinationCounter", "h3bodyCombinationCounter", HistType::kTH1D, {{4, 0.0f, 4.0f}}); - h3bodyCombinationCounter->GetXaxis()->SetBinLabel(1, "total"); - h3bodyCombinationCounter->GetXaxis()->SetBinLabel(2, "bach sign/ID"); - h3bodyCombinationCounter->GetXaxis()->SetBinLabel(3, "not same collision"); - h3bodyCombinationCounter->GetXaxis()->SetBinLabel(4, "collision VtxZ"); - } - - if (doprocessRun3ReducedEM == true || doprocessRun3Reduced3bodyMixing == true || doprocessRun3Reduced3bodyMixingKFInfo == true) { - doUpdateGRPMagField = true; - registry.add("h3bodyEMCutCounter", "h3bodyEMCutCounter", HistType::kTH1D, {{14, 0.0f, 14.0f}}); - } - - if (doprocessRun3withKFParticle == true || doprocessRun3withKFParticleStrangenessTracking == true || doprocessRun3withKFParticleReduced == true || doprocessRun3withKFParticleReducedEM == true || doprocessRun3withKFParticleReduced3bodyMixing == true) { - auto hEventCounterZorro = registry.add("Counters/hEventCounterZorro", "hEventCounterZorro", HistType::kTH1D, {{2, -0.5, 1.5}}); - hEventCounterZorro->GetXaxis()->SetBinLabel(1, "Zorro before evsel"); - hEventCounterZorro->GetXaxis()->SetBinLabel(2, "Zorro after evsel"); - auto hEventCounterKFParticle = registry.add("Counters/hEventCounterKFParticle", "hEventCounterKFParticle", HistType::kTH1D, {{4, 0.0f, 4.0f}}); - hEventCounterKFParticle->GetXaxis()->SetBinLabel(1, "total"); - hEventCounterKFParticle->GetXaxis()->SetBinLabel(2, "sel8"); - hEventCounterKFParticle->GetXaxis()->SetBinLabel(3, "vertexZ"); - hEventCounterKFParticle->GetXaxis()->SetBinLabel(4, "has candidate"); - hEventCounterKFParticle->LabelsOption("v"); - auto hVtx3BodyCounterKFParticle = registry.add("Counters/hVtx3BodyCounterKFParticle", "hVtx3BodyCounterKFParticle", HistType::kTH1D, {{21, 0.0f, 21.0f}}); - hVtx3BodyCounterKFParticle->GetXaxis()->SetBinLabel(1, "Total"); - hVtx3BodyCounterKFParticle->GetXaxis()->SetBinLabel(2, "Charge"); - hVtx3BodyCounterKFParticle->GetXaxis()->SetBinLabel(3, "Eta"); - hVtx3BodyCounterKFParticle->GetXaxis()->SetBinLabel(4, "TPCNcls"); - hVtx3BodyCounterKFParticle->GetXaxis()->SetBinLabel(5, "TPCRows"); - hVtx3BodyCounterKFParticle->GetXaxis()->SetBinLabel(6, "TPCpid"); - hVtx3BodyCounterKFParticle->GetXaxis()->SetBinLabel(7, "DCAxyPV"); - hVtx3BodyCounterKFParticle->GetXaxis()->SetBinLabel(8, "DCAzPV"); - hVtx3BodyCounterKFParticle->GetXaxis()->SetBinLabel(9, "V0MassConst"); - hVtx3BodyCounterKFParticle->GetXaxis()->SetBinLabel(10, "HasSV"); - hVtx3BodyCounterKFParticle->GetXaxis()->SetBinLabel(11, "DcaDau"); - hVtx3BodyCounterKFParticle->GetXaxis()->SetBinLabel(12, "DCADauVtx"); - hVtx3BodyCounterKFParticle->GetXaxis()->SetBinLabel(13, "DauPt"); - hVtx3BodyCounterKFParticle->GetXaxis()->SetBinLabel(14, "Rapidity"); - hVtx3BodyCounterKFParticle->GetXaxis()->SetBinLabel(15, "Pt"); - hVtx3BodyCounterKFParticle->GetXaxis()->SetBinLabel(16, "Mass"); - hVtx3BodyCounterKFParticle->GetXaxis()->SetBinLabel(17, "CosPA"); - hVtx3BodyCounterKFParticle->GetXaxis()->SetBinLabel(18, "CosPAXY"); - hVtx3BodyCounterKFParticle->GetXaxis()->SetBinLabel(19, "Chi2geo"); - hVtx3BodyCounterKFParticle->GetXaxis()->SetBinLabel(20, "TopoConstr"); - hVtx3BodyCounterKFParticle->GetXaxis()->SetBinLabel(21, "Chi2topo"); - hVtx3BodyCounterKFParticle->LabelsOption("v"); - - registry.add("QA/Tracks/hTrackPosTPCNcls", "hTrackPosTPCNcls", HistType::kTH1F, {{152, 0, 152, "# TPC clusters"}}); - registry.add("QA/Tracks/hTrackNegTPCNcls", "hTrackNegTPCNcls", HistType::kTH1F, {{152, 0, 152, "# TPC clusters"}}); - registry.add("QA/Tracks/hTrackBachTPCNcls", "hTrackBachTPCNcls", HistType::kTH1F, {{152, 0, 152, "# TPC clusters"}}); - registry.add("QA/Tracks/hTrackPosHasTPC", "hTrackPosHasTPC", HistType::kTH1F, {{2, -0.5, 1.5, "has TPC"}}); - registry.add("QA/Tracks/hTrackNegHasTPC", "hTrackNegHasTPC", HistType::kTH1F, {{2, -0.5, 1.5, "has TPC"}}); - registry.add("QA/Tracks/hTrackBachHasTPC", "hTrackBachHasTPC", HistType::kTH1F, {{2, -0.5, 1.5, "has TPC"}}); - registry.add("QA/Tracks/hTrackBachITSClusSizes", "hTrackBachITSClusSizes", HistType::kTH1F, {{10, 0., 10., "ITS cluster sizes"}}); - registry.add("QA/Tracks/hTrackProtonTPCPID", "hTrackProtonTPCPID", HistType::kTH2F, {{100, -10.0f, 10.0f, "p/z (GeV/c)"}, {100, -10.0f, 10.0f, "TPC n#sigma"}}); - registry.add("QA/Tracks/hTrackPionTPCPID", "hTrackPionTPCPID", HistType::kTH2F, {{100, -10.0f, 10.0f, "p/z (GeV/c)"}, {100, -10.0f, 10.0f, "TPC n#sigma"}}); - registry.add("QA/Tracks/hTrackBachTPCPID", "hTrackBachTPCPID", HistType::kTH2F, {{100, -10.0f, 10.0f, "p/z (GeV/c)"}, {100, -10.0f, 10.0f, "TPC n#sigma"}}); - registry.add("QA/Tracks/hTrackProtonPt", "hTrackProtonPt", HistType::kTH1F, {{100, 0.0f, 10.0f, "#it{p}_{T} (GeV/c)"}}); - registry.add("QA/Tracks/hTrackPionPt", "hTrackPionPt", HistType::kTH1F, {{100, 0.0f, 10.0f, "#it{p}_{T} (GeV/c)"}}); - registry.add("QA/Tracks/hTrackBachPt", "hTrackBachPt", HistType::kTH1F, {{100, 0.0f, 10.0f, "#it{p}_{T} (GeV/c)"}}); - registry.add("QA/Event/hAllSelEventsVtxZ", "hAllSelEventsVtxZ", HistType::kTH1F, {{500, -15.0f, 15.0f, "PV Z (cm)"}}); - registry.add("QA/Event/hVtxXKF", "hVtxXKF", HistType::kTH1F, {{500, -0.1f, 0.1f, "PV X (cm)"}}); - registry.add("QA/Event/hVtxYKF", "hVtxYKF", HistType::kTH1F, {{500, -0.1f, 0.1f, "PV Y (cm)"}}); - registry.add("QA/Event/hVtxZKF", "hVtxZKF", HistType::kTH1F, {{500, -15.0f, 15.0f, "PV Z (cm)"}}); - registry.add("QA/Event/hVtxCovXXKF", "hVtxCovXXKF", HistType::kTH1F, {{200, -0.0001f, 0.0001f, "PV cov(XX) (cm^{2})"}}); - registry.add("QA/Event/hVtxCovYYKF", "hVtxCovYYKF", HistType::kTH1F, {{200, -0.0001f, 0.0001f, "PV cov(YY) (cm^{2})"}}); - registry.add("QA/Event/hVtxCovZZKF", "hVtxCovZZKF", HistType::kTH1F, {{200, -0.0001f, 0.0001f, "PV cov(ZZ) (cm^{2})"}}); - registry.add("QA/Event/hVtxCovXYKF", "hVtxCovXYKF", HistType::kTH1F, {{200, -0.0001f, 0.0001f, "PV cov(XY) (cm^{2})"}}); - registry.add("QA/Event/hVtxCovXZKF", "hVtxCovXZKF", HistType::kTH1F, {{200, -0.0001f, 0.0001f, "PV cov(XZ) (cm^{2})"}}); - registry.add("QA/Event/hVtxCovYZKF", "hVtxCovYZKF", HistType::kTH1F, {{200, -0.0001f, 0.0001f, "PV cov(YZ) (cm^{2})"}}); - registry.add("QA/Event/hVtxX", "hVtxX", HistType::kTH1F, {{500, -0.1f, 0.1f, "PV X (cm)"}}); - registry.add("QA/Event/hVtxY", "hVtxY", HistType::kTH1F, {{500, -0.1f, 0.1f, "PV Y (cm)"}}); - registry.add("QA/Event/hVtxZ", "hVtxZ", HistType::kTH1F, {{500, -15.0f, 15.0f, "PV Z (cm)"}}); - registry.add("QA/Event/hVtxCovXX", "hVtxCovXX", HistType::kTH1F, {{200, -0.0001f, 0.0001f, "PV cov(XX) (cm^{2})"}}); - registry.add("QA/Event/hVtxCovYY", "hVtxCovYY", HistType::kTH1F, {{200, -0.0001f, 0.0001f, "PV cov(YY) (cm^{2})"}}); - registry.add("QA/Event/hVtxCovZZ", "hVtxCovZZ", HistType::kTH1F, {{200, -0.0001f, 0.0001f, "PV cov(ZZ) (cm^{2})"}}); - registry.add("QA/Event/hVtxCovXY", "hVtxCovXY", HistType::kTH1F, {{200, -0.0001f, 0.0001f, "PV cov(XY) (cm^{2})"}}); - registry.add("QA/Event/hVtxCovXZ", "hVtxCovXZ", HistType::kTH1F, {{200, -0.0001f, 0.0001f, "PV cov(XZ) (cm^{2})"}}); - registry.add("QA/Event/hVtxCovYZ", "hVtxCovYZ", HistType::kTH1F, {{200, -0.0001f, 0.0001f, "PV cov(YZ) (cm^{2})"}}); - } - - if (doprocessRun3withKFParticleReducedEM == true) { - registry.add("QA/EM/hPairCounterMixing", "hPairCounterMixing", HistType::kTH1D, {{1, 0.0f, 1.0f}}); - auto hCombinationCounterMixing = registry.add("QA/EM/hCombinationCounterMixing", "hCombinationCounterMixing", HistType::kTH1D, {{3, 0.0f, 3.0f}}); - hCombinationCounterMixing->GetXaxis()->SetBinLabel(1, "total"); - hCombinationCounterMixing->GetXaxis()->SetBinLabel(2, "bach sign/ID"); - hCombinationCounterMixing->GetXaxis()->SetBinLabel(3, "radius, phi"); - hCombinationCounterMixing->LabelsOption("v"); - - registry.add("QA/EM/hEventBinCounts", "hEventBinCounts", HistType::kTH2D, {{10, 0, 10, "bins VtxZ"}, {13, 0, 13, "bins mult"}}); - registry.add("QA/EM/h3bodyBinCounts", "h3bodyBinCounts", HistType::kTH2D, {{10, 0, 10, "bins VtxZ"}, {13, 0, 13, "bins mult"}}); - registry.add("QA/EM/hPairBinCounts", "hPairBinCounts", HistType::kTH2D, {{10, 0, 10, "bins VtxZ"}, {13, 0, 13, "bins mult"}}); - - registry.add("QA/EM/hRadius1", "hRadius1", HistType::kTH1F, {{200, 0.0f, 20.0f, "Radius (cm)"}}); - registry.add("QA/EM/hRadius2", "hRadius2", HistType::kTH1F, {{200, 0.0f, 20.0f, "Radius (cm)"}}); - registry.add("QA/EM/hPhi1", "hPhi1", HistType::kTH1F, {{360, 0.0f, 360.0f, "#phi (degree)"}}); - registry.add("QA/EM/hPhi2", "hPhi2", HistType::kTH1F, {{360, 0.0f, 360.0f, "#phi (degree)"}}); - registry.add("QA/EM/hDeltaRadius", "hDeltaRadius", HistType::kTH1F, {{200, 0.0f, 10.0f, "#Delta Radius (cm)"}}); - registry.add("QA/EM/hDeltaPhi", "hDeltaPhi", HistType::kTH1F, {{360, 0.0f, 360.0f, "#Delta #phi (degree)"}}); - } - - if (doprocessRun3withKFParticleReduced3bodyMixing == true) { - auto h3bodyCombinationCounter = registry.add("QA/EM/h3bodyCombinationCounter", "h3bodyCombinationCounter", HistType::kTH1D, {{4, 0.0f, 4.0f}}); + // Add histograms separately for different process functions + if (doprocessRealData == true || doprocessMonteCarlo == true) { + auto hEventCounter = registry.add("Counters/hEventCounter", "hEventCounter", HistType::kTH1D, {{3, 0.0f, 3.0f}}); + hEventCounter->GetXaxis()->SetBinLabel(1, "total"); + hEventCounter->GetXaxis()->SetBinLabel(2, "sel8"); + hEventCounter->GetXaxis()->SetBinLabel(3, "vertexZ"); + hEventCounter->LabelsOption("v"); + } + + if (doprocessRealData == true || doprocessRealDataReduced == true || doprocessMonteCarlo == true) { + if (doTrackQA) { // histograms for all daughter tracks of (selected) 3body candidates + registry.add("QA/Tracks/hTrackProtonTPCNcls", "hTrackProtonTPCNcls", HistType::kTH1F, {{152, 0, 152, "# TPC clusters"}}); + registry.add("QA/Tracks/hTrackPionTPCNcls", "hTrackPionTPCNcls", HistType::kTH1F, {{152, 0, 152, "# TPC clusters"}}); + registry.add("QA/Tracks/hTrackDeuteronTPCNcls", "hTrackDeuteronTPCNcls", HistType::kTH1F, {{152, 0, 152, "# TPC clusters"}}); + registry.add("QA/Tracks/hTrackProtonHasTPC", "hTrackProtonHasTPC", HistType::kTH1F, {{2, -0.5, 1.5, "has TPC"}}); + registry.add("QA/Tracks/hTrackPionHasTPC", "hTrackPionHasTPC", HistType::kTH1F, {{2, -0.5, 1.5, "has TPC"}}); + registry.add("QA/Tracks/hTrackDeuteronHasTPC", "hTrackDeuteronHasTPC", HistType::kTH1F, {{2, -0.5, 1.5, "has TPC"}}); + registry.add("QA/Tracks/hTrackDeuteronITSClusSizes", "hTrackDeuteronITSClusSizes", HistType::kTH1F, {{10, 0., 10., "ITS cluster sizes"}}); + registry.add("QA/Tracks/hTrackProtonTPCPID", "hTrackProtonTPCPID", HistType::kTH2F, {{100, -10.0f, 10.0f, "p/z (GeV/c)"}, {100, -10.0f, 10.0f, "TPC n#sigma"}}); + registry.add("QA/Tracks/hTrackPionTPCPID", "hTrackPionTPCPID", HistType::kTH2F, {{100, -10.0f, 10.0f, "p/z (GeV/c)"}, {100, -10.0f, 10.0f, "TPC n#sigma"}}); + registry.add("QA/Tracks/hTrackDeuteronTPCPID", "hTrackDeuteronTPCPID", HistType::kTH2F, {{100, -10.0f, 10.0f, "p/z (GeV/c)"}, {100, -10.0f, 10.0f, "TPC n#sigma"}}); + registry.add("QA/Tracks/hTrackProtonPt", "hTrackProtonPt", HistType::kTH1F, {{100, 0.0f, 10.0f, "#it{p}_{T} (GeV/c)"}}); + registry.add("QA/Tracks/hTrackPionPt", "hTrackPionPt", HistType::kTH1F, {{100, 0.0f, 10.0f, "#it{p}_{T} (GeV/c)"}}); + registry.add("QA/Tracks/hTrackDeuteronPt", "hTrackDeuteronPt", HistType::kTH1F, {{100, 0.0f, 10.0f, "#it{p}_{T} (GeV/c)"}}); + } + if (doVertexQA) { + registry.add("QA/Event/hAllSelEventsVtxZ", "hAllSelEventsVtxZ", HistType::kTH1F, {{500, -15.0f, 15.0f, "PV Z (cm)"}}); + registry.add("QA/Event/hVtxX", "hVtxX", HistType::kTH1F, {{500, -0.1f, 0.1f, "PV X (cm)"}}); + registry.add("QA/Event/hVtxY", "hVtxY", HistType::kTH1F, {{500, -0.1f, 0.1f, "PV Y (cm)"}}); + registry.add("QA/Event/hVtxZ", "hVtxZ", HistType::kTH1F, {{500, -15.0f, 15.0f, "PV Z (cm)"}}); + registry.add("QA/Event/hVtxCovXX", "hVtxCovXX", HistType::kTH1F, {{200, -0.0001f, 0.0001f, "PV cov(XX) (cm^{2})"}}); + registry.add("QA/Event/hVtxCovYY", "hVtxCovYY", HistType::kTH1F, {{200, -0.0001f, 0.0001f, "PV cov(YY) (cm^{2})"}}); + registry.add("QA/Event/hVtxCovZZ", "hVtxCovZZ", HistType::kTH1F, {{200, -0.0001f, 0.0001f, "PV cov(ZZ) (cm^{2})"}}); + registry.add("QA/Event/hVtxCovXY", "hVtxCovXY", HistType::kTH1F, {{200, -0.0001f, 0.0001f, "PV cov(XY) (cm^{2})"}}); + registry.add("QA/Event/hVtxCovXZ", "hVtxCovXZ", HistType::kTH1F, {{200, -0.0001f, 0.0001f, "PV cov(XZ) (cm^{2})"}}); + registry.add("QA/Event/hVtxCovYZ", "hVtxCovYZ", HistType::kTH1F, {{200, -0.0001f, 0.0001f, "PV cov(YZ) (cm^{2})"}}); + } + } + + if (doprocessRealDataReduced3bodyMixing == true) { + auto h3bodyCombinationCounter = registry.add("Mixing/h3bodyCombinationCounter", "h3bodyCombinationCounter", HistType::kTH1D, {{4, 0.0f, 4.0f}}); h3bodyCombinationCounter->GetXaxis()->SetBinLabel(1, "total"); h3bodyCombinationCounter->GetXaxis()->SetBinLabel(2, "not same collision"); h3bodyCombinationCounter->GetXaxis()->SetBinLabel(3, "collision VtxZ"); h3bodyCombinationCounter->GetXaxis()->SetBinLabel(4, "bach sign/ID"); h3bodyCombinationCounter->LabelsOption("v"); - // registry.add("QA/EM/h3bodyBinCounts", "h3bodyBinCounts", HistType::kTH3D, {{16, 0, 16, "bins radius"}, {36, 0, 36, "bins phi"}, {12, 0, 12, "bins pos Z"}}); - registry.add("QA/EM/h3bodyBinCounts", "h3bodyBinCounts", HistType::kTH2D, {{16, 0, 16, "bins radius"}, {18, 0, 18, "bins phi"}}); - - AxisSpec radiusAxis = {kfparticleConfigurations.bins3BodyRadius, "Radius (cm)"}; - AxisSpec phiAxis = {kfparticleConfigurations.bins3BodyPhi, "#phi (degree)"}; - AxisSpec posZAxis = {kfparticleConfigurations.bins3BodyPosZ, "position in z (cm)"}; - - registry.add("QA/EM/hRadius", "hRadius", HistType::kTH1F, {radiusAxis}); - registry.add("QA/EM/hPhi", "hPhi", HistType::kTH1F, {phiAxis}); - registry.add("QA/EM/hPosZ", "hPosZ", HistType::kTH1F, {posZAxis}); + registry.add("Mixing/hDecay3BodyRadiusPhi", "hDecay3BodyRadiusPhi", HistType::kTH2F, {mixingOpts.bins3BodyRadius, mixingOpts.bins3BodyPhi}); + registry.add("Mixing/hDecay3BodyPosZ", "hDecay3BodyPosZ", HistType::kTH1F, {mixingOpts.bins3BodyPosZ}); } } - void initCCDB(aod::BCsWithTimestamps::iterator const& bc) + template + bool initCCDB(aod::BCsWithTimestamps const& bcs, TCollisions const& collisions) { - if (mRunNumber == bc.runNumber()) { - return; + auto bc = collisions.size() ? collisions.begin().template bc_as() : bcs.begin(); + if (!bcs.size()) { + LOGF(warn, "No BC found, skipping this DF."); + return false; // signal to skip this DF } - if (kfparticleConfigurations.cfgSkimmedProcessing) { - zorro.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), kfparticleConfigurations.triggerList); - zorro.populateHistRegistry(registry, bc.runNumber()); + + if (mRunNumber == bc.runNumber()) { + return true; } - // In case override, don't proceed, please - no CCDB access required - if (d_bz_input > -990) { - d_bz = d_bz_input; - fitterV0.setBz(d_bz); - fitter3body.setBz(d_bz); -#ifdef HomogeneousField - KFParticle::SetField(d_bz); -#endif - o2::parameters::GRPMagField grpmag; - if (std::fabs(d_bz) > 1e-5) { - grpmag.setL3Current(30000.f / (d_bz / 5.0f)); - } - o2::base::Propagator::initFieldFromGRP(&grpmag); - mRunNumber = bc.runNumber(); - return; + if (doSkimmedProcessing) { + zorro.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), triggerList); + zorro.populateHistRegistry(registry, bc.runNumber()); } - auto run3grp_timestamp = bc.timestamp(); - o2::parameters::GRPObject* grpo = ccdb->getForTimeStamp(grpPath, run3grp_timestamp); + auto timestamp = bc.timestamp(); o2::parameters::GRPMagField* grpmag = 0x0; - if (grpo) { - o2::base::Propagator::initFieldFromGRP(grpo); - // Fetch magnetic field from ccdb for current collision - d_bz = grpo->getNominalL3Field(); - LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; - } else { - grpmag = ccdb->getForTimeStamp(grpmagPath, run3grp_timestamp); - if (!grpmag) { - LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for timestamp " << run3grp_timestamp; - } - o2::base::Propagator::initFieldFromGRP(grpmag); - // Fetch magnetic field from ccdb for current collision - // d_bz = std::lround(5.f * grpmag->getL3Current() / 30000.f); - d_bz = o2::base::Propagator::Instance()->getNominalBz(); - LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; - } - mRunNumber = bc.runNumber(); - // Set magnetic field value once known - fitterV0.setBz(d_bz); - fitter3body.setBz(d_bz); + grpmag = ccdb->getForTimeStamp(ccdbConfigurations.grpmagPath, timestamp); + if (!grpmag) { + LOG(fatal) << "Got nullptr from CCDB for path " << ccdbConfigurations.grpmagPath << " of object GRPMagField for timestamp " << timestamp; + } + o2::base::Propagator::initFieldFromGRP(grpmag); + // Fetch magnetic field from ccdb for current collision + auto d_bz = o2::base::Propagator::Instance()->getNominalBz(); + LOG(info) << "Retrieved GRP for timestamp " << timestamp << " with magnetic field of " << d_bz << " kG"; + + // set magnetic field value for DCA fitter + helper.fitterV0.setBz(d_bz); + helper.fitter3body.setBz(d_bz); // Set magnetic field for KF vertexing #ifdef HomogeneousField KFParticle::SetField(d_bz); @@ -657,1853 +513,849 @@ struct decay3bodyBuilder { if (useMatCorrType == 2) { // setMatLUT only after magfield has been initalized // (setMatLUT has implicit and problematic init field call if not) + LOG(info) << "Loading material look-up table for timestamp: " << timestamp; + lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->getForTimeStamp(ccdbConfigurations.lutPath, timestamp)); o2::base::Propagator::Instance()->setMatLUT(lut); } + // mark run as configured + mRunNumber = bc.runNumber(); + // Initial TOF PID Paras, copied from PIDTOF.h - timestamp.value = bc.timestamp(); - ccdb->setTimestamp(timestamp.value); + tofPIDOpts.timestamp.value = bc.timestamp(); + ccdb->setTimestamp(tofPIDOpts.timestamp.value); // Not later than now objects ccdb->setCreatedNotAfter(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); // TODO: implement the automatic pass name detection from metadata - if (passName.value == "") { - passName.value = "unanchored"; // temporary default - LOG(warning) << "Passed autodetect mode for pass, not implemented yet, waiting for metadata. Taking '" << passName.value << "'"; + if (tofPIDOpts.passName.value == "") { + tofPIDOpts.passName.value = "unanchored"; // temporary default + LOG(warning) << "Passed autodetect mode for pass, not implemented yet, waiting for metadata. Taking '" << tofPIDOpts.passName.value << "'"; } - LOG(info) << "Using parameter collection, starting from pass '" << passName.value << "'"; + LOG(info) << "Using parameter collection, starting from pass '" << tofPIDOpts.passName.value << "'"; - const std::string fname = paramFileName.value; + const std::string fname = tofPIDOpts.paramFileName.value; if (!fname.empty()) { // Loading the parametrization from file - LOG(info) << "Loading exp. sigma parametrization from file " << fname << ", using param: " << parametrizationPath.value; + LOG(info) << "Loading exp. sigma parametrization from file " << fname << ", using param: " << tofPIDOpts.parametrizationPath.value; if (1) { o2::tof::ParameterCollection paramCollection; - paramCollection.loadParamFromFile(fname, parametrizationPath.value); + paramCollection.loadParamFromFile(fname, tofPIDOpts.parametrizationPath.value); LOG(info) << "+++ Loaded parameter collection from file +++"; - if (!paramCollection.retrieveParameters(mRespParamsV2, passName.value)) { - if (fatalOnPassNotAvailable) { - LOGF(fatal, "Pass '%s' not available in the retrieved CCDB object", passName.value.data()); + if (!paramCollection.retrieveParameters(mRespParamsV2, tofPIDOpts.passName.value)) { + if (tofPIDOpts.fatalOnPassNotAvailable) { + LOGF(fatal, "Pass '%s' not available in the retrieved CCDB object", tofPIDOpts.passName.value.data()); } else { - LOGF(warning, "Pass '%s' not available in the retrieved CCDB object", passName.value.data()); + LOGF(warning, "Pass '%s' not available in the retrieved CCDB object", tofPIDOpts.passName.value.data()); } } else { - mRespParamsV2.setShiftParameters(paramCollection.getPars(passName.value)); + mRespParamsV2.setShiftParameters(paramCollection.getPars(tofPIDOpts.passName.value)); mRespParamsV2.printShiftParameters(); } } else { - mRespParamsV2.loadParamFromFile(fname.data(), parametrizationPath.value); + mRespParamsV2.loadParamFromFile(fname.data(), tofPIDOpts.parametrizationPath.value); } - } else if (loadResponseFromCCDB) { // Loading it from CCDB - LOG(info) << "Loading exp. sigma parametrization from CCDB, using path: " << parametrizationPath.value << " for timestamp " << timestamp.value; - o2::tof::ParameterCollection* paramCollection = ccdb->getForTimeStamp(parametrizationPath.value, timestamp.value); + } else if (tofPIDOpts.loadResponseFromCCDB) { // Loading it from CCDB + LOG(info) << "Loading exp. sigma parametrization from CCDB, using path: " << tofPIDOpts.parametrizationPath.value << " for timestamp " << tofPIDOpts.timestamp.value; + o2::tof::ParameterCollection* paramCollection = ccdb->getForTimeStamp(tofPIDOpts.parametrizationPath.value, tofPIDOpts.timestamp.value); paramCollection->print(); - if (!paramCollection->retrieveParameters(mRespParamsV2, passName.value)) { // Attempt at loading the parameters with the pass defined - if (fatalOnPassNotAvailable) { - LOGF(fatal, "Pass '%s' not available in the retrieved CCDB object", passName.value.data()); + if (!paramCollection->retrieveParameters(mRespParamsV2, tofPIDOpts.passName.value)) { // Attempt at loading the parameters with the pass defined + if (tofPIDOpts.fatalOnPassNotAvailable) { + LOGF(fatal, "Pass '%s' not available in the retrieved CCDB object", tofPIDOpts.passName.value.data()); } else { - LOGF(warning, "Pass '%s' not available in the retrieved CCDB object", passName.value.data()); + LOGF(warning, "Pass '%s' not available in the retrieved CCDB object", tofPIDOpts.passName.value.data()); } } else { // Pass is available, load non standard parameters - mRespParamsV2.setShiftParameters(paramCollection->getPars(passName.value)); + mRespParamsV2.setShiftParameters(paramCollection->getPars(tofPIDOpts.passName.value)); mRespParamsV2.printShiftParameters(); } } mRespParamsV2.print(); - if (timeShiftCCDBPath.value != "") { - if (timeShiftCCDBPath.value.find(".root") != std::string::npos) { - mRespParamsV2.setTimeShiftParameters(timeShiftCCDBPath.value, "gmean_Pos", true); - mRespParamsV2.setTimeShiftParameters(timeShiftCCDBPath.value, "gmean_Neg", false); + if (tofPIDOpts.timeShiftCCDBPath.value != "") { + if (tofPIDOpts.timeShiftCCDBPath.value.find(".root") != std::string::npos) { + mRespParamsV2.setTimeShiftParameters(tofPIDOpts.timeShiftCCDBPath.value, "gmean_Pos", true); + mRespParamsV2.setTimeShiftParameters(tofPIDOpts.timeShiftCCDBPath.value, "gmean_Neg", false); } else { - mRespParamsV2.setTimeShiftParameters(ccdb->getForTimeStamp(Form("%s/pos", timeShiftCCDBPath.value.c_str()), timestamp.value), true); - mRespParamsV2.setTimeShiftParameters(ccdb->getForTimeStamp(Form("%s/neg", timeShiftCCDBPath.value.c_str()), timestamp.value), false); + mRespParamsV2.setTimeShiftParameters(ccdb->getForTimeStamp(Form("%s/pos", tofPIDOpts.timeShiftCCDBPath.value.c_str()), tofPIDOpts.timestamp.value), true); + mRespParamsV2.setTimeShiftParameters(ccdb->getForTimeStamp(Form("%s/neg", tofPIDOpts.timeShiftCCDBPath.value.c_str()), tofPIDOpts.timestamp.value), false); } } bachelorTOFPID.SetParams(mRespParamsV2); + bachelorTOFPIDLabeled.SetParams(mRespParamsV2); + + return true; } - void initCCDBfromRunNumber(int runNumber) + float getMagFieldFromRunNumber(int runNumber) { - // set magnetic field only when run number changes - if (mRunNumber == runNumber) { - LOG(debug) << "CCDB initialized for run " << mRunNumber; - return; - } - mRunNumber = runNumber; // Update the last run number - + float magField; // Check if the CCDB data for this run is already cached if (ccdbCache.find(runNumber) != ccdbCache.end()) { LOG(debug) << "CCDB data already cached for run " << runNumber; - d_bz = ccdbCache[runNumber]; - if (doUpdateGRPMagField == true) { - o2::base::Propagator::initFieldFromGRP(grpMagCache[runNumber].get()); - } + magField = ccdbCache[runNumber]; + // if not, retrieve it from CCDB } else { - std::shared_ptr grpmag = std::make_shared(*ccdb->getForRun(grpmagPath, runNumber)); + std::shared_ptr grpmag = std::make_shared(*ccdb->getForRun(ccdbConfigurations.grpmagPath, runNumber)); if (!grpmag) { - LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for run number " << runNumber; + LOG(fatal) << "Got nullptr from CCDB for path " << ccdbConfigurations.grpmagPath << " of object GRPMagField and " << ccdbConfigurations.grpPath << " of object GRPObject for run number " << runNumber; } o2::base::Propagator::initFieldFromGRP(grpmag.get()); // Fetch magnetic field from ccdb for current collision - d_bz = o2::base::Propagator::Instance()->getNominalBz(); + magField = o2::base::Propagator::Instance()->getNominalBz(); LOG(info) << "Retrieved GRP for run number " << runNumber << " with magnetic field of " << d_bz << " kZG"; - ccdbCache[runNumber] = d_bz; - grpMagCache[runNumber] = grpmag; + // cache magnetic field info + ccdbCache[runNumber] = magField; + } + return magField; + } + + void initFittersWithMagField(int runNumber, float magField) + { + // set magnetic field only when run number changes + if (mRunNumber == runNumber) { + LOG(debug) << "CCDB initialized for run " << mRunNumber; + return; } + mRunNumber = runNumber; // Update the last run number + + // update propagator + o2::base::Propagator::Instance()->setNominalBz(magField); // Set magnetic field for KF vertexing #ifdef HomogeneousField - KFParticle::SetField(d_bz); + KFParticle::SetField(magField); #endif // Set field for DCAfitter - fitterV0.setBz(d_bz); - fitter3body.setBz(d_bz); - - mV0Hyps[0].set(o2::track::PID::Lambda, o2::track::PID::Proton, o2::track::PID::Pion, pidCutsLambda, d_bz); - mV0Hyps[1].set(o2::track::PID::Lambda, o2::track::PID::Pion, o2::track::PID::Proton, pidCutsLambda, d_bz); + helper.fitterV0.setBz(magField); + helper.fitter3body.setBz(magField); if (useMatCorrType == 2) { - // setMatLUT only after magfield has been initalized + // setMatLUT only after magfield has been initalized (setMatLUT has implicit and problematic init field call if not) o2::base::Propagator::Instance()->setMatLUT(lut); } - - // cache magnetic field info - ccdbCache[runNumber] = d_bz; } - //------------------------------------------------------------------ - //-------------------- DCA fitter reconstruction ------------------- - //------------------------------------------------------------------ - // Select decay3body candidate based on daughter track PID - template - bool checkPID(TTrack const& trackProton, TTrack const& trackPion, TTrack const& trackBachelor, const double& tofNSigmaBach) - { - if ((tofNSigmaBach < TofPidNsigmaMin || tofNSigmaBach > TofPidNsigmaMax) && trackBachelor.p() > minBachPUseTOF) { - return false; - } - if (std::abs(trackProton.tpcNSigmaPr()) > TpcPidNsigmaCut) { - return false; - } - if (std::abs(trackPion.tpcNSigmaPi()) > TpcPidNsigmaCut) { - return false; - } - return true; - } - // PID check for H3L - template - bool checkPIDH3L(TTrack const& trackProton, TTrack const& trackPion, TTrack const& trackBachelor, const double& tofNSigmaBach) + // ______________________________________________________________ + // function to build decay3body candidates + template + void buildCandidates(TBCs const&, + TCollisions const& collisions, + T3Bodys const& decay3bodys, + TMCParticles const& mcParticles, + TMCCollisions const& mcCollisions) { - if ((std::abs(trackBachelor.tpcNSigmaDe()) > TpcPidNsigmaCut) || !checkPID(trackProton, trackPion, trackBachelor, tofNSigmaBach)) { - return false; + if (!(mEnabledTables[kVtx3BodyDatas] || mEnabledTables[kMcVtx3BodyDatas])) { + LOG(info) << "No request for candidate analysis table in place, skipping candidate building." << std::endl; + return; // don't do if no request for decay3bodys in place } - return true; - } - //------------------------------------------------------------------ - // 3body candidate builder - template - void fillVtxCand(TCollisionTable const& collision, TTrackTable const& t0, TTrackTable const& t1, TTrackTable const& t2, int64_t decay3bodyId, int bachelorcharge = 1, double tofNSigmaBach = -999, bool saveInTable = true) - { - registry.fill(HIST("hVtx3BodyCounter"), kVtxAll); + // prepare MC container (not necessarily used) + std::vector mcParticleIsReco; - if (t0.tpcNClsFound() < mintpcNCls || t1.tpcNClsFound() < mintpcNCls || t2.tpcNClsFound() < mintpcNCls) { - return; + // clear and reserve size for MC info vectors + if constexpr (soa::is_table) { + isGoodCollision.resize(mcCollisions.size(), false); + mcParticleIsReco.resize(mcParticles.size(), false); } - registry.fill(HIST("hVtx3BodyCounter"), kVtxTPCNcls); - if (enablePidCut) { - if (t2.sign() > 0) { - if (!checkPIDH3L(t0, t1, t2, tofNSigmaBach)) - return; - } else { - if (!checkPIDH3L(t1, t0, t2, tofNSigmaBach)) - return; - } - } + // Loop over collisions for vertex QA + for (const auto& collision : collisions) { + if constexpr (soa::is_table) { // only do if NOT running over reduced data (already done in reducedCreator) + // Zorro event counting + bool isZorroSelected = false; + if (doSkimmedProcessing) { + isZorroSelected = zorro.isSelected(collision.template bc_as().globalBC()); + if (!isZorroSelected && onlyKeepInterestedTrigger) { + continue; + } + } - registry.fill(HIST("hVtx3BodyCounter"), kVtxPIDCut); + // event counting + registry.fill(HIST("Counters/hEventCounter"), 0.5); + if (doSel8selection && !collision.sel8()) { + continue; + } + registry.fill(HIST("Counters/hEventCounter"), 1.5); + if (doPosZselection && (collision.posZ() >= 10.0f || collision.posZ() <= -10.0f)) { + continue; + } + registry.fill(HIST("Counters/hEventCounter"), 2.5); + } + + // vertex QA and counting + if (doVertexQA) { + registry.fill(HIST("QA/Event/hAllSelEventsVtxZ"), collision.posZ()); + registry.fill(HIST("QA/Event/hVtxX"), collision.posX()); + registry.fill(HIST("QA/Event/hVtxY"), collision.posY()); + registry.fill(HIST("QA/Event/hVtxZ"), collision.posZ()); + registry.fill(HIST("QA/Event/hVtxCovXX"), collision.covXX()); + registry.fill(HIST("QA/Event/hVtxCovYY"), collision.covYY()); + registry.fill(HIST("QA/Event/hVtxCovZZ"), collision.covZZ()); + registry.fill(HIST("QA/Event/hVtxCovXY"), collision.covXY()); + registry.fill(HIST("QA/Event/hVtxCovXZ"), collision.covXZ()); + registry.fill(HIST("QA/Event/hVtxCovYZ"), collision.covYZ()); + } + + // In case of MC: reco collision survived event selection filter --> fill value for MC collision if collision is "true" MC collision + if constexpr (soa::is_table) { + if (collision.mcCollisionId() >= 0) { + isGoodCollision[collision.mcCollisionId()] = true; + } + } + } // loop over collisions - // Calculate DCA with respect to the collision associated to the V0, not individual tracks - std::array dcaInfo; + // Loop over all decay3bodys in same time frame + registry.fill(HIST("Counters/hInputStatistics"), kVtx3BodyDatas, decay3bodys.size()); + int lastRunNumber = -1; + for (const auto& decay3body : decay3bodys) { + // skip decay3body without assigned collision + /// TODO: do we want this?? + if (decay3body.collisionId() < 0) { + return; + } - auto Track0Par = getTrackPar(t0); - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, Track0Par, 2.f, fitter3body.getMatCorrType(), &dcaInfo); - auto Track0dcaXY = dcaInfo[0]; - auto Track0dca = std::sqrt(Track0dcaXY * Track0dcaXY + dcaInfo[1] * dcaInfo[1]); + // aquire collision + auto const& collision = collisions.rawIteratorAt(decay3body.collisionId()); - auto Track1Par = getTrackPar(t1); - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, Track1Par, 2.f, fitter3body.getMatCorrType(), &dcaInfo); - auto Track1dcaXY = dcaInfo[0]; - auto Track1dca = std::sqrt(Track1dcaXY * Track1dcaXY + dcaInfo[1] * dcaInfo[1]); + // initialise CCDB from run number saved in reduced collisions table when running over reduced data + if constexpr (!soa::is_table) { // only do if running over reduced data (otherwise CCDB is initialised in process function) + if (collision.runNumber() != lastRunNumber) { + initFittersWithMagField(collision.runNumber(), getMagFieldFromRunNumber(collision.runNumber())); + lastRunNumber = collision.runNumber(); // Update the last run number + LOG(debug) << "CCDB initialized for run " << lastRunNumber; + } + } - auto Track2Par = getTrackPar(t2); - o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, Track2Par, 2.f, fitter3body.getMatCorrType(), &dcaInfo); - auto Track2dcaXY = dcaInfo[0]; - auto Track2dca = std::sqrt(Track2dcaXY * Track2dcaXY + dcaInfo[1] * dcaInfo[1]); + // event selection + if constexpr (soa::is_table) { + if (doSel8selection && !collision.sel8()) { // only when NOT running over reduced data + continue; + } + } + if (doPosZselection && (collision.posZ() >= 10.0f || collision.posZ() <= -10.0f)) { + continue; + } - auto Track0 = getTrackParCov(t0); - auto Track1 = getTrackParCov(t1); - auto Track2 = getTrackParCov(t2); - int n3bodyVtx = fitter3body.process(Track0, Track1, Track2); - if (n3bodyVtx == 0) { // discard this pair - return; - } - registry.fill(HIST("hVtx3BodyCounter"), kVtxhasSV); + // aquire tracks + auto trackPos = decay3body.template track0_as(); + auto trackNeg = decay3body.template track1_as(); + auto trackDeuteron = decay3body.template track2_as(); + auto trackProton = trackPos; + auto trackPion = trackNeg; + if (trackDeuteron.sign() < 0) { + trackProton = trackNeg; + trackPion = trackPos; + } + + // get deuteron TOF PID + float tofNSigmaDeuteron; + if constexpr (!soa::is_table) { // running over derived data + tofNSigmaDeuteron = trackDeuteron.tofNSigmaDe(); + } else if constexpr (soa::is_table) { // running over AO2Ds + if constexpr (soa::is_table) { // running over MC (track table with labels) + tofNSigmaDeuteron = getTOFnSigma(collision, trackDeuteron); + } else { // running over real data + tofNSigmaDeuteron = getTOFnSigma(collision, trackDeuteron); + } + } - std::array pos = {0.}; - const auto& vtxXYZ = fitter3body.getPCACandidate(); - for (int i = 0; i < 3; i++) { - pos[i] = vtxXYZ[i]; - } + /// build Decay3body candidate + if (!helper.buildDecay3BodyCandidate(collision, + trackProton, + trackPion, + trackDeuteron, + decay3body.globalIndex(), + tofNSigmaDeuteron, + fTrackedClSizeVector[decay3body.globalIndex()], + decay3bodyBuilderOpts.useKFParticle, + decay3bodyBuilderOpts.kfSetTopologicalConstraint, + decay3bodyBuilderOpts.useSelections, + decay3bodyBuilderOpts.useTPCforPion, + decay3bodyBuilderOpts.acceptTPCOnly, + decay3bodyBuilderOpts.calculateCovariance, + false /*isEventMixing*/)) { + continue; + } - std::array p0 = {0.}, p1 = {0.}, p2{0.}; - const auto& propagatedTrack0 = fitter3body.getTrack(0); - const auto& propagatedTrack1 = fitter3body.getTrack(1); - const auto& propagatedTrack2 = fitter3body.getTrack(2); - propagatedTrack0.getPxPyPzGlo(p0); - propagatedTrack1.getPxPyPzGlo(p1); - propagatedTrack2.getPxPyPzGlo(p2); - for (int i = 0; i < 3; i++) { - p2[i] *= bachelorcharge; - } - std::array p3B = {p0[0] + p1[0] + p2[0], p0[1] + p1[1] + p2[1], p0[2] + p1[2] + p2[2]}; + // fill QA histograms + if (doTrackQA) { // histograms filled for daughter tracks of (selected) 3body candidates + registry.fill(HIST("QA/Tracks/hTrackProtonTPCNcls"), trackProton.tpcNClsFound()); + registry.fill(HIST("QA/Tracks/hTrackPionTPCNcls"), trackPion.tpcNClsFound()); + registry.fill(HIST("QA/Tracks/hTrackDeuteronTPCNcls"), trackDeuteron.tpcNClsFound()); + registry.fill(HIST("QA/Tracks/hTrackProtonHasTPC"), trackProton.hasTPC()); + registry.fill(HIST("QA/Tracks/hTrackPionHasTPC"), trackPion.hasTPC()); + registry.fill(HIST("QA/Tracks/hTrackDeuteronHasTPC"), trackDeuteron.hasTPC()); + registry.fill(HIST("QA/Tracks/hTrackDeuteronITSClusSizes"), trackDeuteron.itsClusterSizes()); + registry.fill(HIST("QA/Tracks/hTrackProtonTPCPID"), trackProton.sign() * trackProton.tpcInnerParam(), trackProton.tpcNSigmaPr()); + registry.fill(HIST("QA/Tracks/hTrackPionTPCPID"), trackPion.sign() * trackPion.tpcInnerParam(), trackPion.tpcNSigmaPi()); + registry.fill(HIST("QA/Tracks/hTrackDeuteronTPCPID"), trackDeuteron.sign() * trackDeuteron.tpcInnerParam(), trackDeuteron.tpcNSigmaDe()); + registry.fill(HIST("QA/Tracks/hTrackProtonPt"), trackProton.pt()); + registry.fill(HIST("QA/Tracks/hTrackPionPt"), trackPion.pt()); + registry.fill(HIST("QA/Tracks/hTrackDeuteronPt"), trackDeuteron.pt()); + } + + // generate analysis tables with current candidate (only Vtx3BodyDatas is filled here, McVtx3BodyDatas table is filled later) + if (!mEnabledTables[kMcVtx3BodyDatas]) { + fillAnalysisTables(); + } + + // ___________________________________________________________ + // MC handling part: matching of reconstructed candidates + // ___________________________________________________________ + // fill MC table with reco MC candidate information and gen information if matched to MC particle + if constexpr (soa::is_table) { + // MC info + resetMCInfo(this3BodyMCInfo); + this3BodyMCInfo.isReco = true; + + // check if daughters have MC particle + if (!trackProton.has_mcParticle() || !trackPion.has_mcParticle() || !trackDeuteron.has_mcParticle()) { + continue; + } - if (fitter3body.getChi2AtPCACandidate() > dcavtxdau) { - return; - } - registry.fill(HIST("hVtx3BodyCounter"), kVtxDcaDau); + // get MC daughter particles + auto mcTrackProton = trackProton.template mcParticle_as(); + auto mcTrackPion = trackPion.template mcParticle_as(); + auto mcTrackDeuteron = trackDeuteron.template mcParticle_as(); + + // set daughter MC info (also for non-matched candidates) + this3BodyMCInfo.daughterPrPdgCode = mcTrackProton.pdgCode(); + this3BodyMCInfo.daughterPiPdgCode = mcTrackPion.pdgCode(); + this3BodyMCInfo.daughterDePdgCode = mcTrackDeuteron.pdgCode(); + this3BodyMCInfo.isDeuteronPrimary = mcTrackDeuteron.isPhysicalPrimary(); + this3BodyMCInfo.genMomProton = mcTrackProton.p(); + this3BodyMCInfo.genMomPion = mcTrackPion.p(); + this3BodyMCInfo.genMomDeuteron = mcTrackDeuteron.p(); + this3BodyMCInfo.genPtProton = mcTrackProton.pt(); + this3BodyMCInfo.genPtPion = mcTrackPion.pt(); + this3BodyMCInfo.genPtDeuteron = mcTrackDeuteron.pt(); + + // check if reco mother is true H3L/Anti-H3l + bool isMuonReco; + int motherID = checkH3LTruth(mcTrackProton, mcTrackPion, mcTrackDeuteron, isMuonReco); + + // get generated mother MC info + if (motherID > 0) { + auto mcTrackH3L = mcParticles.rawIteratorAt(motherID); + int chargeFactor = mcTrackH3L.pdgCode() > 0 ? 1 : -1; + this3BodyMCInfo.label = motherID; + this3BodyMCInfo.genMomentum = {mcTrackH3L.px(), mcTrackH3L.py(), mcTrackH3L.pz()}; + this3BodyMCInfo.genDecVtx = {mcTrackProton.vx(), mcTrackProton.vy(), mcTrackProton.vz()}; + this3BodyMCInfo.genCt = RecoDecay::sqrtSumOfSquares(mcTrackProton.vx() - mcTrackH3L.vx(), mcTrackProton.vy() - mcTrackH3L.vy(), mcTrackProton.vz() - mcTrackH3L.vz()) * o2::constants::physics::MassHyperTriton / mcTrackH3L.p(); + this3BodyMCInfo.genPhi = mcTrackH3L.phi(); + this3BodyMCInfo.genEta = mcTrackH3L.eta(); + this3BodyMCInfo.genRapidity = mcTrackH3L.y(); + this3BodyMCInfo.isTrueH3L = chargeFactor > 0; + this3BodyMCInfo.isTrueAntiH3L = chargeFactor < 0; + } - float VtxcosPA = RecoDecay::cpa(std::array{collision.posX(), collision.posY(), collision.posZ()}, std::array{pos[0], pos[1], pos[2]}, std::array{p3B[0], p3B[1], p3B[2]}); - if (VtxcosPA < minCosPA3body) { - return; - } - registry.fill(HIST("hVtx3BodyCounter"), kVtxCosPA); - registry.fill(HIST("hBachelorTOFNSigmaDe"), t2.sign() * t2.p(), tofNSigmaBach); - - // additional cut for EM - if (decay3bodyId == -1) { - registry.fill(HIST("h3bodyEMCutCounter"), 0.5); - auto v0Track0 = getTrackParCov(t0); - auto v0Track1 = getTrackParCov(t1); - int nV0 = fitterV0.process(v0Track0, v0Track1); - if (nV0 == 0) { - return; - } - registry.fill(HIST("h3bodyEMCutCounter"), 1.5); + // fill analysis tables (only McVtx3BodyDatas is filled here) + fillAnalysisTables(); - std::array v0pos = {0.}; - const auto& v0vtxXYZ = fitterV0.getPCACandidate(); - for (int i = 0; i < 3; i++) { - v0pos[i] = v0vtxXYZ[i]; - } - const int cand = 0; - if (!fitterV0.isPropagateTracksToVertexDone(cand) && !fitterV0.propagateTracksToVertex(cand)) { - return; - } - registry.fill(HIST("h3bodyEMCutCounter"), 2.5); - - const auto& trPProp = fitterV0.getTrack(0, cand); - const auto& trNProp = fitterV0.getTrack(1, cand); - std::array pP{}, pN{}; - trPProp.getPxPyPzGlo(pP); - trNProp.getPxPyPzGlo(pN); - std::array pV0 = {pP[0] + pN[0], pP[1] + pN[1], pP[2] + pN[2]}; - // Cut for Virtual V0 - float dxv0 = v0pos[0] - mMeanVertex.getX(), dyv0 = v0pos[1] - mMeanVertex.getY(), r2v0 = dxv0 * dxv0 + dyv0 * dyv0; - float rv0 = std::sqrt(r2v0); - float pt2V0 = pV0[0] * pV0[0] + pV0[1] * pV0[1], prodXYv0 = dxv0 * pV0[0] + dyv0 * pV0[1], tDCAXY = prodXYv0 / pt2V0; - if (dcaFitterEMSel.cfgApplyV0Cut && pt2V0 <= dcaFitterEMSel.mMinPt2V0) { - return; - } - registry.fill(HIST("h3bodyEMCutCounter"), 3.5); - if (dcaFitterEMSel.cfgApplyV0Cut && pV0[2] * pV0[2] / pt2V0 > dcaFitterEMSel.mMaxTgl2V0) { // tgLambda cut - return; - } - registry.fill(HIST("h3bodyEMCutCounter"), 4.5); - - float p2V0 = pt2V0 + pV0[2] * pV0[2], ptV0 = std::sqrt(pt2V0); - // apply mass selections - float p2Pos = pP[0] * pP[0] + pP[1] * pP[1] + pP[2] * pP[2], p2Neg = pN[0] * pN[0] + pN[1] * pN[1] + pN[2] * pN[2]; - bool good3bodyV0Hyp = false; - for (int ipid = 0; ipid < 2; ipid++) { - float massForLambdaHyp = mV0Hyps[ipid].calcMass(p2Pos, p2Neg, p2V0); - if (massForLambdaHyp - mV0Hyps[ipid].getMassV0Hyp() < mV0Hyps[ipid].getMargin(ptV0)) { - good3bodyV0Hyp = true; - break; + // mark mcParticle as reconstructed + if (this3BodyMCInfo.label > -1) { + mcParticleIsReco[this3BodyMCInfo.label] = true; + } + } // constexpr requires mcParticles check + } // decay3body loop + + // ____________________________________________________________________ + // MC handling part: generated information of non-reco candidates + // ____________________________________________________________________ + if constexpr (soa::is_table) { + for (auto& mcparticle : mcParticles) { + // MC info + resetMCInfo(this3BodyMCInfo); + this3BodyMCInfo.isReco = false; + + // skip MC particle if reconstructed and already filled previously + if (mcParticleIsReco[mcparticle.globalIndex()] == true) { + continue; } - } - if (dcaFitterEMSel.cfgApplyV0Cut && !good3bodyV0Hyp) { - return; - } - registry.fill(HIST("h3bodyEMCutCounter"), 5.5); - float dcaX = dxv0 - pV0[0] * tDCAXY, dcaY = dyv0 - pV0[1] * tDCAXY, dca2 = dcaX * dcaX + dcaY * dcaY; - float cosPAXY = prodXYv0 / rv0 * ptV0; - if (dcaFitterEMSel.cfgApplyV0Cut && dca2 > dcaFitterEMSel.mMaxDCAXY2ToMeanVertex3bodyV0) { - return; - } - registry.fill(HIST("h3bodyEMCutCounter"), 6.5); - // FIXME: V0 cosPA cut to be investigated - if (dcaFitterEMSel.cfgApplyV0Cut && cosPAXY < dcaFitterEMSel.minCosPAXYMeanVertex3bodyV0) { - return; - } - registry.fill(HIST("h3bodyEMCutCounter"), 7.5); - // Check: CosPA Cut of Virtual V0 may not be used since the V0 may be based on another PV - float dx = v0pos[0] - collision.posX(), dy = v0pos[1] - collision.posY(), dz = v0pos[2] - collision.posZ(), prodXYZv0 = dx * pV0[0] + dy * pV0[1] + dz * pV0[2]; - float v0CosPA = prodXYZv0 / std::sqrt((dx * dx + dy * dy + dz * dz) * p2V0); - if (dcaFitterEMSel.cfgApplyV0Cut && v0CosPA < dcaFitterEMSel.minCosPA3bodyV0) { - return; - } - registry.fill(HIST("h3bodyEMCutCounter"), 8.5); + // set flag if corresponding MC collision has matched reconstructed collision which passed event selection + this3BodyMCInfo.survivedEventSel = isGoodCollision[mcparticle.mcCollisionId()]; - float r3body = std::hypot(pos[0], pos[1]); - if (r3body < 0.5) { - return; - } - registry.fill(HIST("h3bodyEMCutCounter"), 9.5); + // check if MC particle is hypertriton + if (std::abs(mcparticle.pdgCode()) != 1010010030) { + continue; + } - // Cut for the compatibility of V0 and 3body vertex - float deltaR = std::abs(rv0 - r3body); - if (deltaR > dcaFitterEMSel.maxRDiffV03body) { - return; - } - registry.fill(HIST("h3bodyEMCutCounter"), 10.5); + // check daughter identities + bool haveProton = false, havePion = false, haveDeuteron = false; + bool haveAntiProton = false, haveAntiPion = false, haveAntiDeuteron = false; + for (auto& mcparticleDaughter : mcparticle.template daughters_as()) { + if (mcparticleDaughter.pdgCode() == PDG_t::kProton) + haveProton = true; + if (mcparticleDaughter.pdgCode() == PDG_t::kProtonBar) + haveAntiProton = true; + if (mcparticleDaughter.pdgCode() == PDG_t::kPiPlus) + havePion = true; + if (mcparticleDaughter.pdgCode() == PDG_t::kPiMinus) + haveAntiPion = true; + if (mcparticleDaughter.pdgCode() == 1000010020) + haveDeuteron = true; + if (mcparticleDaughter.pdgCode() == -1000010020) + haveAntiDeuteron = true; + } - float pt3B = std::hypot(p3B[0], p3B[1]); - if (pt3B < dcaFitterEMSel.minPt3Body) { // pt cut - return; - } - registry.fill(HIST("h3bodyEMCutCounter"), 11.5); - if (p3B[2] / pt3B > dcaFitterEMSel.maxTgl3Body) { // tgLambda cut - return; - } - registry.fill(HIST("h3bodyEMCutCounter"), 12.5); - - // H3L DCA Check - const auto& vertexXYZ = fitter3body.getPCACandidatePos(); - auto track3B = o2::track::TrackParCov(vertexXYZ, p3B, t2.sign()); - o2::dataformats::DCA dca; - if (!track3B.propagateToDCA({{collision.posX(), collision.posY(), collision.posZ()}, {collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()}}, fitter3body.getBz(), &dca, 5.) || - std::abs(dca.getY()) > dcaFitterEMSel.maxDCAXY3Body || std::abs(dca.getZ()) > dcaFitterEMSel.maxDCAZ3Body) { - return; - } - registry.fill(HIST("h3bodyEMCutCounter"), 13.5); - } + // check if hypertriton decayed via 3-body decay and is particle or anti-particle + if ((haveProton && haveAntiPion && haveDeuteron) || (haveAntiProton && havePion && haveAntiDeuteron)) { + if (mcparticle.pdgCode() > 0) { + this3BodyMCInfo.isTrueH3L = true; + } else if (mcparticle.pdgCode() < 0) { + this3BodyMCInfo.isTrueAntiH3L = true; + } + // get daughters + for (auto& mcparticleDaughter : mcparticle.template daughters_as()) { + if (std::abs(mcparticleDaughter.pdgCode()) == PDG_t::kProton) { // proton + this3BodyMCInfo.genMomProton = mcparticleDaughter.p(); + this3BodyMCInfo.genPtProton = mcparticleDaughter.pt(); + this3BodyMCInfo.daughterPrPdgCode = mcparticleDaughter.pdgCode(); + this3BodyMCInfo.genDecVtx = {mcparticleDaughter.vx(), mcparticleDaughter.vy(), mcparticleDaughter.vz()}; + } else if (std::abs(mcparticleDaughter.pdgCode()) == PDG_t::kPiPlus) { // pion + this3BodyMCInfo.genMomPion = mcparticleDaughter.p(); + this3BodyMCInfo.genPtPion = mcparticleDaughter.pt(); + this3BodyMCInfo.daughterPiPdgCode = mcparticleDaughter.pdgCode(); + } else if (std::abs(mcparticleDaughter.pdgCode()) == 1000010020) { // deuteron + this3BodyMCInfo.genMomDeuteron = mcparticleDaughter.p(); + this3BodyMCInfo.genPtDeuteron = mcparticleDaughter.pt(); + this3BodyMCInfo.daughterDePdgCode = mcparticleDaughter.pdgCode(); + this3BodyMCInfo.isDeuteronPrimary = mcparticleDaughter.isPhysicalPrimary(); + } + } + } else { + continue; // stop if particle is not decayed via 3-body decay + } - VtxCandidate candVtx; - candVtx.track0Id = t0.globalIndex(); - candVtx.track1Id = t1.globalIndex(); - candVtx.track2Id = t2.globalIndex(); - candVtx.collisionId = collision.globalIndex(); - candVtx.decay3bodyId = decay3bodyId; - candVtx.vtxPos[0] = pos[0]; - candVtx.vtxPos[1] = pos[1]; - candVtx.vtxPos[2] = pos[2]; - candVtx.track0P[0] = p0[0]; - candVtx.track0P[1] = p0[1]; - candVtx.track0P[2] = p0[2]; - candVtx.track1P[0] = p1[0]; - candVtx.track1P[1] = p1[1]; - candVtx.track1P[2] = p1[2]; - candVtx.track2P[0] = p2[0]; - candVtx.track2P[1] = p2[1]; - candVtx.track2P[2] = p2[2]; - candVtx.dcadaughters = fitter3body.getChi2AtPCACandidate(); - candVtx.daudcaxytopv[0] = Track0dcaXY; - candVtx.daudcaxytopv[1] = Track1dcaXY; - candVtx.daudcaxytopv[2] = Track2dcaXY; - candVtx.daudcatopv[0] = Track0dca; - candVtx.daudcatopv[1] = Track1dca; - candVtx.daudcatopv[2] = Track2dca; - candVtx.bachelortofNsigma = tofNSigmaBach; - if (saveInTable) { - fillVtx3BodyTable(candVtx); - } else { - VtxCandidates.push_back(candVtx); - } + // calculate ctau + this3BodyMCInfo.genCt = RecoDecay::sqrtSumOfSquares(this3BodyMCInfo.genDecVtx[0] - mcparticle.vx(), this3BodyMCInfo.genDecVtx[1] - mcparticle.vy(), this3BodyMCInfo.genDecVtx[2] - mcparticle.vz()) * o2::constants::physics::MassHyperTriton / mcparticle.p(); + + // fill MCDecay3BodyCores table if requested + if (mEnabledTables[kMcVtx3BodyDatas]) { + products.mcvtx3bodydatas(-1, // sign + -1., -1., // mass, massV0 + -1., -1., -1., // position + -1., -1., -1., // momentum + -1., // chi2 + -1., // trackedClSize + -1., -1., -1., // momProton + -1., -1., -1., // momPion + -1., -1., -1., // momDeuteron + -1., -1., -1., // trackDCAxyToPV: 0 - proton, 1 - pion, 2 - deuteron + -1., -1., -1., // trackDCAzToPV: 0 - proton, 1 - pion, 2 - deuteron + -1., -1., -1., // daughterDCAtoSV: 0 - proton, 1 - pion, 2 - deuteron + -1., // daughterDCAatSV + -1., -1., -1., -1., // tpcNsigma: 0 - proton, 1 - pion, 2 - deuteron, 3 - bach with pion hyp + -1., // tofNsigmaDeuteron + -1., -1., -1., // average ITS cluster sizes: proton, pion, deuteron + -1., -1., -1., // TPCNCl: proton, pion, deuteron + -1., // pidForTrackingDeuteron + // MC information + mcparticle.px(), mcparticle.py(), mcparticle.pz(), + this3BodyMCInfo.genDecVtx[0], this3BodyMCInfo.genDecVtx[1], this3BodyMCInfo.genDecVtx[2], + this3BodyMCInfo.genCt, + mcparticle.phi(), mcparticle.eta(), mcparticle.y(), + this3BodyMCInfo.genMomProton, this3BodyMCInfo.genMomPion, this3BodyMCInfo.genMomDeuteron, + this3BodyMCInfo.genPtProton, this3BodyMCInfo.genPtPion, this3BodyMCInfo.genPtDeuteron, + this3BodyMCInfo.isTrueH3L, this3BodyMCInfo.isTrueAntiH3L, + this3BodyMCInfo.isReco, + this3BodyMCInfo.daughterPrPdgCode, this3BodyMCInfo.daughterPiPdgCode, this3BodyMCInfo.daughterDePdgCode, + this3BodyMCInfo.isDeuteronPrimary, + this3BodyMCInfo.survivedEventSel); + } // enabled table check + } // mcParticles loop + } // constexpr requires mcParticles check } - //------------------------------------------------------------------ - // event mixing - template - void doMixed3Body(TMixed3bodys decay3bodys, TBinningType binningType) + + // ______________________________________________________________ + // function to build mixed decay3body candidates + template + void buildMixedCandidates(TRedDecay3Bodys const& decay3bodys, TBinningType const& binningType) { + if (!mEnabledTables[kVtx3BodyDatas]) { + return; // don't do if no request for decay3bodys in place + } + // Strictly upper index policy for decay3body objects binned by radius, phi - for (const auto& [decay3body0, decay3body1] : selfCombinations(binningType, dcaFitterEMSel.nUseMixed, -1, decay3bodys, decay3bodys)) { - auto tpos0 = decay3body0.template track0_as(); - auto tneg0 = decay3body0.template track1_as(); - auto tbach0 = decay3body0.template track2_as(); - auto tpos1 = decay3body1.template track0_as(); - auto tneg1 = decay3body1.template track1_as(); - auto tbach1 = decay3body1.template track2_as(); - - registry.fill(HIST("h3bodyCombinationCounter"), 0.5); - - // ---------- selections ---------- - if ((tbach0.sign() > 0 && !(tbach1.sign() > 0)) || (tbach0.sign() < 0 && !(tbach1.sign() < 0)) || tbach0.globalIndex() == tbach1.globalIndex()) { // only combine if tbach1 has correct sign and is not same as tbach0 + for (const auto& [decay3body0, decay3body1] : selfPairCombinations(binningType, mixingOpts.n3bodyMixing, -1, decay3bodys)) { + auto trackPos0 = decay3body0.template track0_as(); + auto trackNeg0 = decay3body0.template track1_as(); + auto trackDeuteron0 = decay3body0.template track2_as(); + auto trackPos1 = decay3body1.template track0_as(); + auto trackNeg1 = decay3body1.template track1_as(); + auto trackDeuteron1 = decay3body1.template track2_as(); + + // assign tracks + auto trackProton0 = trackPos0; + auto trackPion0 = trackNeg0; + auto trackProton1 = trackPos1; + auto trackPion1 = trackNeg1; + if (trackDeuteron0.sign() < 0) { + trackProton0 = trackNeg0; + trackPion0 = trackPos0; + } + if (trackDeuteron1.sign() < 0) { + trackProton1 = trackNeg1; + trackPion1 = trackPos1; + } + + registry.fill(HIST("Mixing/h3bodyCombinationCounter"), 0.5); + + // only combine if from different event + if (decay3body0.collisionId() == decay3body1.collisionId()) { continue; } - registry.fill(HIST("h3bodyCombinationCounter"), 1.5); + registry.fill(HIST("Mixing/h3bodyCombinationCounter"), 1.5); + + // collision vertex selection + auto collision0 = decay3body0.template collision_as(); + auto collision1 = decay3body1.template collision_as(); + + // get b_z value for each collision (from CCDB or cache) and cache it for that run number + float magFieldCol0 = getMagFieldFromRunNumber(collision0.runNumber()); + float magFieldCol1 = getMagFieldFromRunNumber(collision1.runNumber()); - if (decay3body0.collisionId() == decay3body1.collisionId()) { // only combine if from different event + // only combine if collision similar in VtxZ + if (mixingOpts.selectPVPosZ3bodyMixing && std::abs(collision0.posZ() - collision1.posZ()) > mixingOpts.maxDeltaPVPosZ3bodyMixing) { continue; } - registry.fill(HIST("h3bodyCombinationCounter"), 2.5); + registry.fill(HIST("Mixing/h3bodyCombinationCounter"), 2.5); - auto c0 = decay3body0.template collision_as(); - auto c1 = decay3body1.template collision_as(); + // Charge selections + // same magnetic fields --> mix matter with matter + if ((magFieldCol0 / std::abs(magFieldCol0)) == (magFieldCol1 / std::abs(magFieldCol1))) { + if (trackDeuteron0.sign() != trackDeuteron1.sign()) { + continue; + } + } + // opposite magnetic fields --> mix matter with anti-matter + if ((magFieldCol0 / std::abs(magFieldCol0)) != (magFieldCol1 / std::abs(magFieldCol1))) { + if (trackDeuteron0.sign() == trackDeuteron1.sign()) { + continue; + } + } - if (dcaFitterEMSel.selectPVPosZ3bodyMixing && std::abs(c0.posZ() - c1.posZ()) > dcaFitterEMSel.maxDeltaPVPosZ3bodyMixing) { // only combine if collision similar in PV posZ + // don't mix 3body with itself + if ((trackDeuteron0.globalIndex() == trackDeuteron1.globalIndex()) || (trackProton0.globalIndex() == trackProton1.globalIndex()) || (trackPion0.globalIndex() == trackPion1.globalIndex())) { continue; } - registry.fill(HIST("h3bodyCombinationCounter"), 3.5); - - initCCDBfromRunNumber(c0.runNumber()); - - if (dcaFitterEMSel.cfgMix3BodyMethod == 0) { // mix bachelor (deuteron) - fillVtxCand(c0, tpos0, tneg0, tbach1, -1, bachelorcharge, tbach1.tofNSigmaDe()); - fillVtxCand(c1, tpos1, tneg1, tbach0, -1, bachelorcharge, tbach0.tofNSigmaDe()); - } else if ((dcaFitterEMSel.cfgMix3BodyMethod == 1 && tbach0.sign() > 0) || (dcaFitterEMSel.cfgMix3BodyMethod == 2 && tbach0.sign() < 0)) { // mix piMinus or proton - fillVtxCand(c0, tpos0, tneg1, tbach0, -1, bachelorcharge, tbach0.tofNSigmaDe()); - fillVtxCand(c1, tpos1, tneg0, tbach1, -1, bachelorcharge, tbach1.tofNSigmaDe()); - } else if ((dcaFitterEMSel.cfgMix3BodyMethod == 1 && tbach0.sign() < 0) || (dcaFitterEMSel.cfgMix3BodyMethod == 2 && tbach0.sign() > 0)) { // mix piPlus or anti-proton - fillVtxCand(c0, tpos1, tneg0, tbach0, -1, bachelorcharge, tbach0.tofNSigmaDe()); - fillVtxCand(c1, tpos0, tneg1, tbach1, -1, bachelorcharge, tbach1.tofNSigmaDe()); - } + registry.fill(HIST("Mixing/h3bodyCombinationCounter"), 3.5); - VtxCandidates.clear(); + // candidate analysis + // mix deuteron + if (mixingOpts.mixingType == 0) { + doMixing(collision0, trackProton0, trackPion0, trackDeuteron1, magFieldCol0); + doMixing(collision1, trackProton1, trackPion1, trackDeuteron0, magFieldCol1); + } + // mix proton + if (mixingOpts.mixingType == 1) { + doMixing(collision0, trackProton1, trackPion0, trackDeuteron0, magFieldCol0); + doMixing(collision1, trackProton0, trackPion1, trackDeuteron1, magFieldCol1); + } + // mix pion + if (mixingOpts.mixingType == 2) { + doMixing(collision0, trackProton0, trackPion1, trackDeuteron0, magFieldCol0); + doMixing(collision1, trackProton1, trackPion0, trackDeuteron1, magFieldCol1); + } } // end decay3body combinations loop } - //------------------------------------------------------------------ - // fill the StoredVtx3BodyDatas table - void fillVtx3BodyTable(VtxCandidate const& candVtx) + + // ______________________________________________________________ + // function to calculate correct TOF nSigma for deuteron track + template + double getTOFnSigma(TCollision const& collision, TTrack const& track) { - vtx3bodydata( - candVtx.track0Id, candVtx.track1Id, candVtx.track2Id, candVtx.collisionId, candVtx.decay3bodyId, - candVtx.vtxPos[0], candVtx.vtxPos[1], candVtx.vtxPos[2], - candVtx.track0P[0], candVtx.track0P[1], candVtx.track0P[2], candVtx.track1P[0], candVtx.track1P[1], candVtx.track1P[2], candVtx.track2P[0], candVtx.track2P[1], candVtx.track2P[2], - candVtx.dcadaughters, - candVtx.daudcaxytopv[0], candVtx.daudcaxytopv[1], candVtx.daudcaxytopv[2], - candVtx.daudcatopv[0], candVtx.daudcatopv[1], candVtx.daudcatopv[2], - candVtx.bachelortofNsigma); + // TOF PID of deuteron + if (track.has_collision() && track.hasTOF()) { + auto originalcol = track.template collision_as(); + if constexpr (isMC) { + return bachelorTOFPIDLabeled.GetTOFNSigma(track, originalcol, collision); + } else { + return bachelorTOFPID.GetTOFNSigma(track, originalcol, collision); + } + } + return -999; } - //------------------------------------------------------------------ - //-------------------- KFParticle reconstruction ------------------- - //------------------------------------------------------------------ - // function to select daughter track PID - template - bool selectTPCPID(TTrack const& trackProton, TTrack const& trackPion, TTrack const& trackDeuteron) + // ______________________________________________________________ + // function to fill analysis tables + void fillAnalysisTables() { - if (std::abs(trackProton.tpcNSigmaPr()) > kfparticleConfigurations.maxtpcnSigma) { - return false; - } - if (std::abs(trackDeuteron.tpcNSigmaDe()) > kfparticleConfigurations.maxtpcnSigma) { - return false; + // generate analysis tables + if (mEnabledTables[kDecay3BodyIndices]) { + products.decay3bodyindices(helper.decay3body.decay3bodyID, + helper.decay3body.protonID, helper.decay3body.pionID, helper.decay3body.deuteronID, + helper.decay3body.collisionID); + registry.fill(HIST("Counters/hTableBuildingStatistics"), kDecay3BodyIndices); + } + if (mEnabledTables[kVtx3BodyDatas]) { + products.vtx3bodydatas(helper.decay3body.sign, + helper.decay3body.mass, helper.decay3body.massV0, + helper.decay3body.position[0], helper.decay3body.position[1], helper.decay3body.position[2], + helper.decay3body.momentum[0], helper.decay3body.momentum[1], helper.decay3body.momentum[2], + helper.decay3body.chi2, + helper.decay3body.trackedClSize, + helper.decay3body.momProton[0], helper.decay3body.momProton[1], helper.decay3body.momProton[2], + helper.decay3body.momPion[0], helper.decay3body.momPion[1], helper.decay3body.momPion[2], + helper.decay3body.momDeuteron[0], helper.decay3body.momDeuteron[1], helper.decay3body.momDeuteron[2], + helper.decay3body.trackDCAxyToPV[0], helper.decay3body.trackDCAxyToPV[1], helper.decay3body.trackDCAxyToPV[2], // 0 - proton, 1 - pion, 2 - deuteron + helper.decay3body.trackDCAzToPV[0], helper.decay3body.trackDCAzToPV[1], helper.decay3body.trackDCAzToPV[2], // 0 - proton, 1 - pion, 2 - deuteron + helper.decay3body.daughterDCAtoSV[0], helper.decay3body.daughterDCAtoSV[1], helper.decay3body.daughterDCAtoSV[2], // 0 - proton, 1 - pion, 2 - deuteron + helper.decay3body.daughterDCAatSV, + helper.decay3body.tpcNsigma[0], helper.decay3body.tpcNsigma[1], helper.decay3body.tpcNsigma[2], helper.decay3body.tpcNsigma[2], // 0 - proton, 1 - pion, 2 - deuteron, 3 - bach with pion hyp + helper.decay3body.tofNsigmaDeuteron, + helper.decay3body.averageITSClSize[0], helper.decay3body.averageITSClSize[1], helper.decay3body.averageITSClSize[2], // 0 - proton, 1 - pion, 2 - deuteron + helper.decay3body.tpcNCl[0], helper.decay3body.tpcNCl[1], helper.decay3body.tpcNCl[2], // 0 - proton, 1 - pion, 2 - deuteron + helper.decay3body.pidForTrackingDeuteron); + registry.fill(HIST("Counters/hTableBuildingStatistics"), kVtx3BodyDatas); + } + if (mEnabledTables[kVtx3BodyCovs]) { + products.vtx3bodycovs(helper.decay3body.covProton, + helper.decay3body.covPion, + helper.decay3body.covDeuteron, + helper.decay3body.covariance); + registry.fill(HIST("Counters/hTableBuildingStatistics"), kVtx3BodyCovs); + } + if (mEnabledTables[kMcVtx3BodyDatas]) { + products.mcvtx3bodydatas(helper.decay3body.sign, + helper.decay3body.mass, helper.decay3body.massV0, + helper.decay3body.position[0], helper.decay3body.position[1], helper.decay3body.position[2], + helper.decay3body.momentum[0], helper.decay3body.momentum[1], helper.decay3body.momentum[2], + helper.decay3body.chi2, + helper.decay3body.trackedClSize, + helper.decay3body.momProton[0], helper.decay3body.momProton[1], helper.decay3body.momProton[2], + helper.decay3body.momPion[0], helper.decay3body.momPion[1], helper.decay3body.momPion[2], + helper.decay3body.momDeuteron[0], helper.decay3body.momDeuteron[1], helper.decay3body.momDeuteron[2], + helper.decay3body.trackDCAxyToPV[0], helper.decay3body.trackDCAxyToPV[1], helper.decay3body.trackDCAxyToPV[2], // 0 - proton, 1 - pion, 2 - deuteron + helper.decay3body.trackDCAzToPV[0], helper.decay3body.trackDCAzToPV[1], helper.decay3body.trackDCAzToPV[2], // 0 - proton, 1 - pion, 2 - deuteron + helper.decay3body.daughterDCAtoSV[0], helper.decay3body.daughterDCAtoSV[1], helper.decay3body.daughterDCAtoSV[2], // 0 - proton, 1 - pion, 2 - deuteron + helper.decay3body.daughterDCAatSV, + helper.decay3body.tpcNsigma[0], helper.decay3body.tpcNsigma[1], helper.decay3body.tpcNsigma[2], helper.decay3body.tpcNsigma[2], // 0 - proton, 1 - pion, 2 - deuteron, 3 - bach with pion hyp + helper.decay3body.tofNsigmaDeuteron, + helper.decay3body.averageITSClSize[0], helper.decay3body.averageITSClSize[1], helper.decay3body.averageITSClSize[2], // 0 - proton, 1 - pion, 2 - deuteron + helper.decay3body.tpcNCl[0], helper.decay3body.tpcNCl[1], helper.decay3body.tpcNCl[2], // 0 - proton, 1 - pion, 2 - deuteron + helper.decay3body.pidForTrackingDeuteron, + // MC information + this3BodyMCInfo.genMomentum[0], this3BodyMCInfo.genMomentum[1], this3BodyMCInfo.genMomentum[2], + this3BodyMCInfo.genDecVtx[0], this3BodyMCInfo.genDecVtx[1], this3BodyMCInfo.genDecVtx[2], + this3BodyMCInfo.genCt, + this3BodyMCInfo.genPhi, this3BodyMCInfo.genEta, this3BodyMCInfo.genRapidity, + this3BodyMCInfo.genMomProton, this3BodyMCInfo.genMomPion, this3BodyMCInfo.genMomDeuteron, + this3BodyMCInfo.genPtProton, this3BodyMCInfo.genPtPion, this3BodyMCInfo.genPtDeuteron, + this3BodyMCInfo.isTrueH3L, this3BodyMCInfo.isTrueAntiH3L, + this3BodyMCInfo.isReco, + this3BodyMCInfo.daughterPrPdgCode, this3BodyMCInfo.daughterPiPdgCode, this3BodyMCInfo.daughterDePdgCode, + this3BodyMCInfo.isDeuteronPrimary, + this3BodyMCInfo.survivedEventSel); + registry.fill(HIST("Counters/hTableBuildingStatistics"), kMcVtx3BodyDatas); } - if (kfparticleConfigurations.useTPCforPion && std::abs(trackPion.tpcNSigmaPi()) > kfparticleConfigurations.maxtpcnSigma) { - return false; + } + + // ______________________________________________________________ + // function to build mixed 3body candidate from selected tracks + template + void doMixing(TCollision const& collision, TTrack const& trackProton, TTrack const& trackPion, TTrack const& trackDeuteron, float magField) + { + // set vertexers and propagator with correct mag field of this collision (only if run number changed compared to previous candidate build) + initFittersWithMagField(collision.runNumber(), magField); + if (helper.buildDecay3BodyCandidate(collision, trackProton, trackPion, trackDeuteron, + -1 /*decay3bodyIndex*/, + trackDeuteron.tofNSigmaDe(), + 0 /*trackedClSize*/, + decay3bodyBuilderOpts.useKFParticle, + decay3bodyBuilderOpts.kfSetTopologicalConstraint, + decay3bodyBuilderOpts.useSelections, + decay3bodyBuilderOpts.useTPCforPion, + decay3bodyBuilderOpts.acceptTPCOnly, + decay3bodyBuilderOpts.calculateCovariance, + true /*isEventMixing*/)) { + // fill analysis tables with built candidate + fillAnalysisTables(); + return; + } else { + return; } - return true; } - template - double getTOFnSigma(TCollision const& collision, TTrack const& track, bool isEventMixing) + // ______________________________________________________________ + // function to check if a reconstructed mother is a true H3L/Anti-H3L (returns -1 if not) + template + int checkH3LTruth(MCTrack3B const& mcParticlePr, MCTrack3B const& mcParticlePi, MCTrack3B const& mcParticleDe, bool& isMuonReco) { - // TOF PID of deuteron (set motherhyp correctly) - double tofNSigmaDeuteron = -999; - if (track.has_collision() && track.hasTOF()) { - if (isEventMixing) { - tofNSigmaDeuteron = bachelorTOFPID.GetTOFNSigma(track, collision, collision); - } else { - auto originalcol = track.template collision_as(); - tofNSigmaDeuteron = bachelorTOFPID.GetTOFNSigma(track, originalcol, collision); + if (std::abs(mcParticlePr.pdgCode()) != 2212 || std::abs(mcParticleDe.pdgCode()) != 1000010020) { + return -1; + } + // check proton and deuteron mother + int prDeMomID = -1; + for (const auto& motherPr : mcParticlePr.template mothers_as()) { + for (const auto& motherDe : mcParticleDe.template mothers_as()) { + if (motherPr.globalIndex() == motherDe.globalIndex() && std::abs(motherPr.pdgCode()) == 1010010030) { + prDeMomID = motherPr.globalIndex(); + break; + } + } + } + if (prDeMomID == -1) { + return -1; + } + if (std::abs(mcParticlePi.pdgCode()) != 211 && std::abs(mcParticlePi.pdgCode()) != 13) { + return -1; + } + // check if the pion track is a muon coming from a pi -> mu + vu decay, if yes, take the mother pi + auto mcParticlePiTmp = mcParticlePi; + if (std::abs(mcParticlePiTmp.pdgCode()) == 13) { + for (const auto& motherPi : mcParticlePiTmp.template mothers_as()) { + if (std::abs(motherPi.pdgCode()) == 211) { + mcParticlePiTmp = motherPi; + isMuonReco = true; + break; + } + } + } + // now loop over the pion mother + for (const auto& motherPi : mcParticlePiTmp.template mothers_as()) { + if (motherPi.globalIndex() == prDeMomID) { + return motherPi.globalIndex(); } } - return tofNSigmaDeuteron; + return -1; } - //------------------------------------------------------------------ - // function to fill candidate table - template - void fillCandidateTable(TCandidate const& candidate) + // ______________________________________________________________ + // function to reset MCInfo + void resetMCInfo(mc3Bodyinfo mcInfo) { - kfvtx3bodydatalite( - // hypertriton - candidate.mass, - candidate.pos[0], candidate.pos[1], candidate.pos[2], - candidate.mom[0], candidate.mom[1], candidate.mom[2], candidate.mom[3], - candidate.charge, - candidate.dcaToPV[0], candidate.dcaToPV[1], // 3D, xy - candidate.cpaToPV[0], candidate.cpaToPV[1], // 3D, xy - candidate.decLen[0], candidate.decLen[1], // 3D, xy - candidate.ldl, - candidate.chi2geoNDF, candidate.chi2topoNDF, - candidate.ctau, - candidate.trackedClSize, - // V0 - candidate.massV0, - candidate.cpaV0ToPV, - // daughter momenta at vertex - candidate.protonMom[0], candidate.protonMom[1], candidate.protonMom[2], - candidate.pionMom[0], candidate.pionMom[1], candidate.pionMom[2], - candidate.deuteronMom[0], candidate.deuteronMom[1], candidate.deuteronMom[2], - candidate.tpcInnerParam[0], candidate.tpcInnerParam[1], candidate.tpcInnerParam[2], // proton, pion, deuteron - // daughter track quality - candidate.tpcNClDaughters[0], candidate.tpcNClDaughters[1], candidate.tpcNClDaughters[2], // proton, pion, deuteron - candidate.tpcChi2NClDeuteron, - candidate.DeltaPhiRotDeuteron, candidate.DeltaPhiRotProton, - // daughter DCAs KF - candidate.DCAdaughterToPV[0], candidate.DCAdaughterToPV[1], candidate.DCAdaughterToPV[2], // proton, pion, deuteron - candidate.DCAdaughterToPVxy[0], candidate.DCAdaughterToPVxy[1], candidate.DCAdaughterToPVxy[2], // proton, pion, deuteron - candidate.DCAdaughterToSVxy[0], candidate.DCAdaughterToSVxy[1], candidate.DCAdaughterToSVxy[2], // proton, pion, deuteron - candidate.DCAprotonToPion, candidate.DCAprotonToDeuteron, candidate.DCApionToDeuteron, - candidate.DCAvtxDaughters3D, - // daughter signs - candidate.daughterCharge[0], candidate.daughterCharge[1], candidate.daughterCharge[2], // proton, pion, deuteron - // daughter PID - candidate.tpcNsigma[0], candidate.tpcNsigma[1], candidate.tpcNsigma[2], candidate.tpcNsigma[3], // proton, pion, deuteron, bach with pion hyp - candidate.tofNsigmaDeuteron, - candidate.averageClusterSizeDeuteron, - candidate.pidForTrackingDeuteron); - - if (kfparticleConfigurations.fillCandidateFullTable) { - kfvtx3bodydata( - candidate.collisionID, candidate.trackPosID, candidate.trackNegID, candidate.trackBachID, candidate.decay3bodyID, - // hypertriton - candidate.mass, - candidate.pos[0], candidate.pos[1], candidate.pos[2], - candidate.posErr[0], candidate.posErr[1], candidate.posErr[2], - candidate.mom[0], candidate.mom[1], candidate.mom[2], candidate.mom[3], - candidate.momErr[0], candidate.momErr[1], candidate.momErr[2], candidate.momErr[3], - candidate.charge, - candidate.dcaToPV[0], candidate.dcaToPV[1], // 3D, xy - candidate.cpaToPV[0], candidate.cpaToPV[1], // 3D, xy - candidate.cpaToPVtopo[0], candidate.cpaToPVtopo[1], // 3D, xy - candidate.decLen[0], candidate.decLen[1], // 3D, xy - candidate.ldl, - candidate.chi2geoNDF, candidate.chi2topoNDF, - candidate.ctau, - candidate.trackedClSize, - // V0 - candidate.massV0, candidate.chi2massV0, - candidate.cpaV0ToPV, - // daughter momenta (at vertex and TPC) - candidate.protonMom[0], candidate.protonMom[1], candidate.protonMom[2], - candidate.pionMom[0], candidate.pionMom[1], candidate.pionMom[2], - candidate.deuteronMom[0], candidate.deuteronMom[1], candidate.deuteronMom[2], - candidate.tpcInnerParam[0], candidate.tpcInnerParam[1], candidate.tpcInnerParam[2], // proton, pion, deuteron - // daughter track quality - candidate.tpcNClDaughters[0], candidate.tpcNClDaughters[1], candidate.tpcNClDaughters[2], // proton, pion, deuteron - candidate.tpcChi2NClDeuteron, - candidate.DeltaPhiRotDeuteron, candidate.DeltaPhiRotProton, - // daughter DCAs KF - candidate.DCAdaughterToPV[0], candidate.DCAdaughterToPV[1], candidate.DCAdaughterToPV[2], // proton, pion, deuteron - candidate.DCAdaughterToPVxy[0], candidate.DCAdaughterToPVxy[1], candidate.DCAdaughterToPVxy[2], // proton, pion, deuteron - candidate.DCAdaughterToSVxy[0], candidate.DCAdaughterToSVxy[1], candidate.DCAdaughterToSVxy[2], // proton, pion, deuteron - candidate.DCAprotonToPion, candidate.DCAprotonToDeuteron, candidate.DCApionToDeuteron, - candidate.DCAvtxDaughters3D, - // daughter DCAs to PV propagated with material - candidate.trackDCAxy[0], candidate.trackDCAxy[1], candidate.trackDCAxy[2], // pos, neg, bach - candidate.trackDCA[0], candidate.trackDCA[1], candidate.trackDCA[2], // pos, neg, bach - // daughter signs - candidate.daughterCharge[0], candidate.daughterCharge[1], candidate.daughterCharge[2], // proton, pion, deuteron - // daughter PID - candidate.tpcNsigma[0], candidate.tpcNsigma[1], candidate.tpcNsigma[2], candidate.tpcNsigma[3], // proton, pion, deuteron, bach with pion hyp - candidate.tpcdEdx[0], candidate.tpcdEdx[1], candidate.tpcdEdx[2], // proton, pion, deuteron - candidate.tofNsigmaDeuteron, - candidate.averageClusterSizeDeuteron, - candidate.pidForTrackingDeuteron); - } - LOG(debug) << "Table filled."; + mcInfo.label = -1; + mcInfo.genMomentum[0] = -1., mcInfo.genMomentum[1] = -1., mcInfo.genMomentum[2] = -1.; + mcInfo.genDecVtx[0] = -1., mcInfo.genDecVtx[1] = -1., mcInfo.genDecVtx[2] = -1.; + mcInfo.genCt = -1.; + mcInfo.genPhi = -1., mcInfo.genEta = -1., mcInfo.genRapidity = -1.; + mcInfo.genMomProton = -1., mcInfo.genMomPion = -1., mcInfo.genMomDeuteron = -1.; + mcInfo.genPtProton = -1., mcInfo.genPtPion = -1., mcInfo.genPtDeuteron = -1.; + mcInfo.isTrueH3L = false, mcInfo.isTrueAntiH3L = false; + mcInfo.isReco = false; + mcInfo.daughterPrPdgCode = -1, mcInfo.daughterPiPdgCode = -1, mcInfo.daughterDePdgCode = -1; + mcInfo.isDeuteronPrimary = false; + mcInfo.survivedEventSel = false; + return; } - //------------------------------------------------------------------ - // function to fit KFParticle 3body vertex - template - void fit3bodyVertex(TKFParticle& kfpProton, TKFParticle& kfpPion, TKFParticle& kfpDeuteron, TKFParticle& KFHt) + // ______________________________________________________________ + // process functions + void processRealData(ColswithEvTimes const& collisions, + aod::Decay3Bodys const& decay3bodys, + aod::Tracked3Bodys const& tracked3bodys, + TracksExtPIDIUwithEvTimes const&, + aod::BCsWithTimestamps const& bcs) { - // Construct 3body vertex - int nDaughters3body = 3; - const KFParticle* Daughters3body[3] = {&kfpProton, &kfpPion, &kfpDeuteron}; - KFHt.SetConstructMethod(2); - try { - KFHt.Construct(Daughters3body, nDaughters3body); - } catch (std::runtime_error& e) { - LOG(debug) << "Failed to create Hyper triton 3-body vertex." << e.what(); + // initialise CCDB from BCs + if (!initCCDB(bcs, collisions)) { + LOG(info) << "CCDB initialisation failed, skipping candidate building." << std::endl; return; } - // transport all daughter tracks to hypertriton vertex - float HtVtx[3] = {0.}; - HtVtx[0] = KFHt.GetX(); - HtVtx[1] = KFHt.GetY(); - HtVtx[2] = KFHt.GetZ(); - kfpProton.TransportToPoint(HtVtx); - kfpPion.TransportToPoint(HtVtx); - kfpDeuteron.TransportToPoint(HtVtx); - LOG(debug) << "Hypertriton vertex constructed."; + + // get tracked cluster size info + fTrackedClSizeVector.clear(); + fTrackedClSizeVector.resize(decay3bodys.size(), 0); + for (const auto& tvtx3body : tracked3bodys) { + fTrackedClSizeVector[tvtx3body.decay3BodyId()] = tvtx3body.itsClsSize(); + } + + // do candidate analysis without MC processing + buildCandidates(bcs, // bc table + collisions, // collision table + decay3bodys, // decay3body table + static_cast(nullptr), // MC particle table + static_cast(nullptr)); // MC collision table } - //------------------------------------------------------------------ - // 3body candidate builder with KFParticle - template - void buildVtx3BodyDataTableKFParticle(TCollision const& collision, TTrack const& trackPos, TTrack const& trackNeg, TTrack const& trackBach, int64_t decay3bodyID, int bachelorcharge, double tofNSigmaDeuteron) + void processRealDataReduced(aod::RedCollisions const& collisions, + soa::Join const& decay3bodys, + aod::RedIUTracks const&) { - gROOT->SetBatch(true); - gRandom->SetSeed(42); - - // initialise KF primary vertex - KFPVertex kfpVertex = createKFPVertexFromCollision(collision); - KFParticle kfpv(kfpVertex); - LOG(debug) << "Created KF PV."; - - // fill event QA histograms --> only for events with a decay3body! - if (kfparticleConfigurations.doVertexQA) { - registry.fill(HIST("QA/Event/hVtxXKF"), kfpv.GetX()); - registry.fill(HIST("QA/Event/hVtxYKF"), kfpv.GetY()); - registry.fill(HIST("QA/Event/hVtxZKF"), kfpv.GetZ()); - registry.fill(HIST("QA/Event/hVtxCovXXKF"), kfpv.GetCovariance(0)); - registry.fill(HIST("QA/Event/hVtxCovYYKF"), kfpv.GetCovariance(2)); - registry.fill(HIST("QA/Event/hVtxCovZZKF"), kfpv.GetCovariance(5)); - registry.fill(HIST("QA/Event/hVtxCovXYKF"), kfpv.GetCovariance(1)); - registry.fill(HIST("QA/Event/hVtxCovXZKF"), kfpv.GetCovariance(3)); - registry.fill(HIST("QA/Event/hVtxCovYZKF"), kfpv.GetCovariance(4)); - registry.fill(HIST("QA/Event/hVtxX"), collision.posX()); - registry.fill(HIST("QA/Event/hVtxY"), collision.posY()); - registry.fill(HIST("QA/Event/hVtxZ"), collision.posZ()); - registry.fill(HIST("QA/Event/hVtxCovXX"), collision.covXX()); - registry.fill(HIST("QA/Event/hVtxCovYY"), collision.covYY()); - registry.fill(HIST("QA/Event/hVtxCovZZ"), collision.covZZ()); - registry.fill(HIST("QA/Event/hVtxCovXY"), collision.covXY()); - registry.fill(HIST("QA/Event/hVtxCovXZ"), collision.covXZ()); - registry.fill(HIST("QA/Event/hVtxCovYZ"), collision.covYZ()); + // get tracked cluster size info (saved in aod::Red3BodyInfo) + fTrackedClSizeVector.clear(); + fTrackedClSizeVector.resize(decay3bodys.size(), 0); + for (const auto& vtx3body : decay3bodys) { + fTrackedClSizeVector[vtx3body.globalIndex()] = vtx3body.trackedClSize(); } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxAll); - - auto trackParCovPos = getTrackParCov(trackPos); - auto trackParCovNeg = getTrackParCov(trackNeg); - auto trackParCovBach = getTrackParCov(trackBach); - LOG(debug) << "Got all daughter tracks."; - - bool isMatter = trackBach.sign() > 0 ? true : false; - - // ---------- fill track QA histograms ---------- - if (kfparticleConfigurations.doTrackQA) { - registry.fill(HIST("QA/Tracks/hTrackPosTPCNcls"), trackPos.tpcNClsFound()); - registry.fill(HIST("QA/Tracks/hTrackNegTPCNcls"), trackNeg.tpcNClsFound()); - registry.fill(HIST("QA/Tracks/hTrackBachTPCNcls"), trackBach.tpcNClsFound()); - registry.fill(HIST("QA/Tracks/hTrackPosHasTPC"), trackPos.hasTPC()); - registry.fill(HIST("QA/Tracks/hTrackNegHasTPC"), trackNeg.hasTPC()); - registry.fill(HIST("QA/Tracks/hTrackBachHasTPC"), trackBach.hasTPC()); - registry.fill(HIST("QA/Tracks/hTrackBachITSClusSizes"), trackBach.itsClusterSizes()); - if (isMatter) { - registry.fill(HIST("QA/Tracks/hTrackProtonTPCPID"), trackPos.sign() * trackPos.tpcInnerParam(), trackPos.tpcNSigmaPr()); - registry.fill(HIST("QA/Tracks/hTrackPionTPCPID"), trackNeg.sign() * trackNeg.tpcInnerParam(), trackNeg.tpcNSigmaPi()); - registry.fill(HIST("QA/Tracks/hTrackProtonPt"), trackPos.pt()); - registry.fill(HIST("QA/Tracks/hTrackPionPt"), trackNeg.pt()); + // do candidate analysis without MC processing + buildCandidates(static_cast(nullptr), // bc table + collisions, // collision table + decay3bodys, // decay3body table + static_cast(nullptr), // MC particle table + static_cast(nullptr)); // MC collision table + } + + void processRealDataReduced3bodyMixing(aod::RedCollisions const&, + soa::Join const& decay3bodys, + aod::RedIUTracks const&) + { + auto xAxis = registry.get(HIST("Mixing/hDecay3BodyRadiusPhi"))->GetXaxis(); + auto yAxis = registry.get(HIST("Mixing/hDecay3BodyRadiusPhi"))->GetYaxis(); + + for (const auto& decay3body : decay3bodys) { + int bin_Radius, bin_Phi; + if (decay3bodyBuilderOpts.useKFParticle) { + bin_Radius = xAxis->FindBin(decay3body.radiusKF()); + bin_Phi = yAxis->FindBin(decay3body.phiKF()); + registry.fill(HIST("Mixing/hDecay3BodyPosZ"), decay3body.poszKF()); } else { - registry.fill(HIST("QA/Tracks/hTrackProtonTPCPID"), trackNeg.sign() * trackNeg.tpcInnerParam(), trackNeg.tpcNSigmaPr()); - registry.fill(HIST("QA/Tracks/hTrackPionTPCPID"), trackPos.sign() * trackPos.tpcInnerParam(), trackPos.tpcNSigmaPi()); - registry.fill(HIST("QA/Tracks/hTrackProtonPt"), trackNeg.pt()); - registry.fill(HIST("QA/Tracks/hTrackPionPt"), trackPos.pt()); + bin_Radius = xAxis->FindBin(decay3body.radiusDCA()); + bin_Phi = yAxis->FindBin(decay3body.phiDCA()); + registry.fill(HIST("Mixing/hDecay3BodyPosZ"), decay3body.poszDCA()); } - registry.fill(HIST("QA/Tracks/hTrackBachTPCPID"), trackBach.sign() * trackBach.tpcInnerParam(), trackBach.tpcNSigmaDe()); - registry.fill(HIST("QA/Tracks/hTrackBachPt"), trackBach.pt()); + registry.fill(HIST("Mixing/hDecay3BodyRadiusPhi"), xAxis->GetBinCenter(bin_Radius), yAxis->GetBinCenter(bin_Phi)); } - // -------- STEP 1: track selection -------- - // collision ID --> not correct? tracks can have different collisions, but belong to one 3prong vertex! - // if (trackPos.collisionId() != trackNeg.collisionId() || trackPos.collisionId() != trackBach.collisionId() || trackNeg.collisionId() != trackBach.collisionId()) { - // continue; - // } - // track IDs --> already checked in SVertexer! + if (decay3bodyBuilderOpts.useKFParticle) { + Binning3BodyKF binningOnRadPhiKF{{mixingOpts.bins3BodyRadius, mixingOpts.bins3BodyPhi}, true}; + buildMixedCandidates(decay3bodys, binningOnRadPhiKF); + } else { + Binning3BodyDCAfitter binningOnRadPhiDCA{{mixingOpts.bins3BodyRadius, mixingOpts.bins3BodyPhi}, true}; + buildMixedCandidates(decay3bodys, binningOnRadPhiDCA); + } + } - // track signs (pos, neg, bach) --> sanity check, should already be in SVertexer - if (trackPos.sign() != +1 || trackNeg.sign() != -1) { + void processMonteCarlo(ColswithEvTimesLabeled const& collisions, + aod::Decay3Bodys const& decay3bodys, + aod::Tracked3Bodys const& tracked3bodys, + TracksExtPIDIUwithEvTimesLabeled const&, + aod::BCsWithTimestamps const& bcs, + aod::McParticles const& mcParticles, + aod::McCollisions const& mcCollisions) + { + // initialise CCDB from BCs + if (!initCCDB(bcs, collisions)) { + LOG(info) << "CCDB initialisation failed, skipping candidate building." << std::endl; return; } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxCharge); - // track eta - if (std::abs(trackPos.eta()) > kfparticleConfigurations.maxEta || std::abs(trackNeg.eta()) > kfparticleConfigurations.maxEta || std::abs(trackBach.eta()) > kfparticleConfigurations.maxEtaDeuteron) { - return; - } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxEta); - - // number of TPC clusters - if (trackBach.tpcNClsFound() <= kfparticleConfigurations.mintpcNClsBach) { - return; - } - if (isMatter && ((kfparticleConfigurations.useTPCforPion && trackNeg.tpcNClsFound() <= kfparticleConfigurations.mintpcNClsPion) || trackPos.tpcNClsFound() <= kfparticleConfigurations.mintpcNClsProton)) { - return; - } else if (!isMatter && ((kfparticleConfigurations.useTPCforPion && trackPos.tpcNClsFound() <= kfparticleConfigurations.mintpcNClsPion) || trackNeg.tpcNClsFound() <= kfparticleConfigurations.mintpcNClsProton)) { - return; - } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxTPCNcls); - - // number of TPC crossed rows - if (trackBach.tpcNClsCrossedRows() <= kfparticleConfigurations.mintpcCrossedRows) { - return; - } - if (isMatter && ((kfparticleConfigurations.useTPCforPion && trackNeg.tpcNClsCrossedRows() <= kfparticleConfigurations.mintpcCrossedRowsPion) || trackPos.tpcNClsCrossedRows() <= kfparticleConfigurations.mintpcCrossedRows)) { - return; - } else if (!isMatter && ((kfparticleConfigurations.useTPCforPion && trackPos.tpcNClsCrossedRows() <= kfparticleConfigurations.mintpcCrossedRowsPion) || trackNeg.tpcNClsCrossedRows() <= kfparticleConfigurations.mintpcCrossedRows)) { - return; - } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxTPCRows); - - // TPC PID - float tpcNsigmaProton; - float tpcNsigmaPion; - float dEdxProton; - float dEdxPion; - float tpcNsigmaDeuteron = trackBach.tpcNSigmaDe(); - float tpcNsigmaPionBach = trackBach.tpcNSigmaPi(); - float dEdxDeuteron = trackBach.tpcSignal(); - if (isMatter) { // hypertriton (proton, pi-, deuteron) - tpcNsigmaProton = trackPos.tpcNSigmaPr(); - tpcNsigmaPion = trackNeg.tpcNSigmaPi(); - dEdxProton = trackPos.tpcSignal(); - dEdxPion = trackNeg.tpcSignal(); - if (!selectTPCPID(trackPos, trackNeg, trackBach)) { - return; - } - } else if (!isMatter) { // anti-hypertriton (anti-proton, pi+, deuteron) - tpcNsigmaProton = trackNeg.tpcNSigmaPr(); - tpcNsigmaPion = trackPos.tpcNSigmaPi(); - dEdxProton = trackNeg.tpcSignal(); - dEdxPion = trackPos.tpcSignal(); - if (!selectTPCPID(trackNeg, trackPos, trackBach)) { - return; - } - } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxTPCPID); - LOG(debug) << "Basic track selections done."; - - // Average ITS cluster size of deuteron track - double averageClusterSizeDeuteron(0); - int nCls(0); - for (int i = 0; i < 7; i++) { - int clusterSize = trackBach.itsClsSizeInLayer(i); - averageClusterSizeDeuteron += static_cast(clusterSize); - if (clusterSize > 0) - nCls++; - } - averageClusterSizeDeuteron = averageClusterSizeDeuteron / static_cast(nCls); - - // track DCAxy and DCAz to PV associated with decay3body - o2::dataformats::VertexBase mPV; - o2::dataformats::DCA mDcaInfoCovPos; - o2::dataformats::DCA mDcaInfoCovNeg; - o2::dataformats::DCA mDcaInfoCovBach; - auto trackParCovPVPos = trackParCovPos; - auto trackParCovPVNeg = trackParCovNeg; - auto trackParCovPVBach = trackParCovBach; - mPV.setPos({collision.posX(), collision.posY(), collision.posZ()}); - mPV.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); - o2::base::Propagator::Instance()->propagateToDCABxByBz(mPV, trackParCovPVPos, 2.f, matCorr, &mDcaInfoCovPos); - o2::base::Propagator::Instance()->propagateToDCABxByBz(mPV, trackParCovPVNeg, 2.f, matCorr, &mDcaInfoCovNeg); - o2::base::Propagator::Instance()->propagateToDCABxByBz(mPV, trackParCovPVBach, 2.f, matCorr, &mDcaInfoCovBach); - auto TrackPosDcaXY = mDcaInfoCovPos.getY(); - auto TrackNegDcaXY = mDcaInfoCovNeg.getY(); - auto TrackBachDcaXY = mDcaInfoCovBach.getY(); - auto TrackPosDcaZ = mDcaInfoCovPos.getZ(); - auto TrackNegDcaZ = mDcaInfoCovNeg.getZ(); - auto TrackBachDcaZ = mDcaInfoCovBach.getZ(); - // calculate 3D track DCA - auto TrackPosDca = std::sqrt(TrackPosDcaXY * TrackPosDcaXY + TrackPosDcaZ * TrackPosDcaZ); - auto TrackNegDca = std::sqrt(TrackNegDcaXY * TrackNegDcaXY + TrackNegDcaZ * TrackNegDcaZ); - auto TrackBachDca = std::sqrt(TrackBachDcaXY * TrackBachDcaXY + TrackBachDcaZ * TrackBachDcaZ); - // selection - if (kfparticleConfigurations.doDCAPreSel && isMatter && (std::fabs(TrackNegDcaXY) <= kfparticleConfigurations.mindcaXYPionPV || std::fabs(TrackPosDcaXY) <= kfparticleConfigurations.mindcaXYProtonPV)) { - return; - } else if (kfparticleConfigurations.doDCAPreSel && !isMatter && (std::fabs(TrackPosDcaXY) <= kfparticleConfigurations.mindcaXYPionPV || std::fabs(TrackNegDcaXY) <= kfparticleConfigurations.mindcaXYProtonPV)) { - return; - } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxDCAxyPV); - if (kfparticleConfigurations.doDCAPreSel && isMatter && (std::fabs(TrackNegDcaZ) <= kfparticleConfigurations.mindcaZPionPV || std::fabs(TrackPosDcaZ) <= kfparticleConfigurations.mindcaZProtonPV)) { - return; - } else if (kfparticleConfigurations.doDCAPreSel && !isMatter && (std::fabs(TrackPosDcaZ) <= kfparticleConfigurations.mindcaZPionPV || std::fabs(TrackNegDcaZ) <= kfparticleConfigurations.mindcaZProtonPV)) { - return; - } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxDCAzPV); - - // daughter track momentum at inner wall of TPC - float tpcInnerParamProton; - float tpcInnerParamPion; - float tpcInnerParamDeuteron = trackBach.tpcInnerParam(); - if (isMatter) { // hypertriton (proton, pi-, deuteron) - tpcInnerParamProton = trackPos.tpcInnerParam(); - tpcInnerParamPion = trackNeg.tpcInnerParam(); - } else if (!isMatter) { // anti-hypertriton (anti-proton, pi+, deuteron) - tpcInnerParamProton = trackNeg.tpcInnerParam(); - tpcInnerParamPion = trackPos.tpcInnerParam(); - } - - // -------- STEP 2: fit vertex with proton and pion -------- - // Fit vertex with DCA fitter to find minimization point --> uses material corrections implicitly - if (kfparticleConfigurations.doDCAFitterPreMinimum) { - try { - fitter3body.process(trackParCovPos, trackParCovNeg, trackParCovBach); - } catch (std::runtime_error& e) { - LOG(error) << "Exception caught in DCA fitter process call: Not able to fit decay3body vertex!"; - return; - } - // re-acquire tracks at vertex position from DCA fitter - trackParCovPos = fitter3body.getTrack(0); - trackParCovNeg = fitter3body.getTrack(1); - trackParCovBach = fitter3body.getTrack(2); - - LOG(debug) << "Minimum found with DCA fitter for decay3body."; - } - - // create KFParticle objects from tracks - KFParticle kfpProton, kfpPion; - if (isMatter) { - kfpProton = createKFParticleFromTrackParCov(trackParCovPos, trackPos.sign(), constants::physics::MassProton); - kfpPion = createKFParticleFromTrackParCov(trackParCovNeg, trackNeg.sign(), constants::physics::MassPionCharged); - } else if (!isMatter) { - kfpProton = createKFParticleFromTrackParCov(trackParCovNeg, trackNeg.sign(), constants::physics::MassProton); - kfpPion = createKFParticleFromTrackParCov(trackParCovPos, trackPos.sign(), constants::physics::MassPionCharged); - } - LOG(debug) << "KFParticle objects created from daughter tracks."; - - // Construct V0 as intermediate step - KFParticle KFV0; - int nDaughtersV0 = 2; - const KFParticle* DaughtersV0[2] = {&kfpProton, &kfpPion}; - KFV0.SetConstructMethod(2); - try { - KFV0.Construct(DaughtersV0, nDaughtersV0); - } catch (std::runtime_error& e) { - LOG(debug) << "Failed to create V0 vertex from daughter tracks." << e.what(); - return; - } - KFV0.TransportToDecayVertex(); - LOG(debug) << "V0 constructed."; - - // check V0 mass and set mass constraint - float massV0, sigmaMassV0; - KFV0.GetMass(massV0, sigmaMassV0); - KFParticle KFV0Mass = KFV0; - KFV0Mass.SetNonlinearMassConstraint(o2::constants::physics::MassLambda); - float chi2massV0 = KFV0Mass.GetChi2() / KFV0Mass.GetNDF(); - if (kfparticleConfigurations.useLambdaMassConstraint) { - LOG(debug) << "V0 mass constraint applied."; - KFV0 = KFV0Mass; - } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxV0MassConst); - - // apply virtual V0 cuts used in SVertexer in case of 3body mixing with proton track - if (kfparticleConfigurations.mixingType == 1 && kfparticleConfigurations.applySVertexerV0Cuts) { - // V0 radius - if (std::sqrt(KFV0.GetX() * KFV0.GetX() + KFV0.GetY() * KFV0.GetY()) <= 0.5) { - return; - } - // pT - if (KFV0.GetPt() <= 0.01) { - return; - } - // pz/pT - if (KFV0.GetPz() / KFV0.GetPt() >= 2) { - return; - } - // cos(PA) - if (cpaXYFromKF(KFV0, kfpv) <= 0.9 || cpaFromKF(KFV0, kfpv) <= 0.8) { - return; - } - } - - // -------- STEP 3: fit three body vertex -------- - // Create KFParticle object from deuteron track - KFParticle kfpDeuteron; - kfpDeuteron = createKFParticleFromTrackParCov(trackParCovBach, trackBach.sign() * bachelorcharge, constants::physics::MassDeuteron); - LOG(debug) << "KFParticle created from deuteron track."; - - // Construct vertex - KFParticle KFHt; - fit3bodyVertex(kfpProton, kfpPion, kfpDeuteron, KFHt); - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxhasSV); - - // -------- STEP 4: daughter selections after geometrical vertex fit -------- - // daughter DCAs with KF - if ((kfpProton.GetDistanceFromParticle(kfpPion) >= kfparticleConfigurations.maxDcaProPi) || (kfpProton.GetDistanceFromParticle(kfpDeuteron) >= kfparticleConfigurations.maxDcaProDeu) || (kfpPion.GetDistanceFromParticle(kfpDeuteron) >= kfparticleConfigurations.maxDcaPiDe)) { - return; - } - float DCAvtxDaughters3D = kfpProton.GetDistanceFromParticle(kfpPion) + kfpProton.GetDistanceFromParticle(kfpDeuteron) + kfpPion.GetDistanceFromParticle(kfpDeuteron); - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxDcaDau); - LOG(debug) << "DCA selection after vertex fit applied."; - - // daughter DCAs to vertex - if (kfpProton.GetDistanceFromVertexXY(KFHt) >= kfparticleConfigurations.maxDcaXYSVDau || kfpPion.GetDistanceFromVertexXY(KFHt) >= kfparticleConfigurations.maxDcaXYSVDau || kfpDeuteron.GetDistanceFromVertexXY(KFHt) >= kfparticleConfigurations.maxDcaXYSVDau) { - return; - } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxDcaDauVtx); - LOG(debug) << "DCA to vertex selection after vertex fit applied."; - - // daughter pT - if (kfpProton.GetPt() < kfparticleConfigurations.minPtProton || kfpProton.GetPt() > kfparticleConfigurations.maxPtProton || kfpPion.GetPt() < kfparticleConfigurations.minPtPion || kfpPion.GetPt() > kfparticleConfigurations.maxPtPion || kfpDeuteron.GetPt() < kfparticleConfigurations.minPtDeuteron || kfpDeuteron.GetPt() > kfparticleConfigurations.maxPtDeuteron) { - return; - } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxDauPt); - LOG(debug) << "Daughter pT selection applied."; - - // -------- STEP 5: candidate selection and constraint after geometrical vertex fit -------- - // Rapidity - float rapHt = RecoDecay::y(std::array{KFHt.GetPx(), KFHt.GetPy(), KFHt.GetPz()}, o2::constants::physics::MassHyperTriton); - if (std::abs(rapHt) > kfparticleConfigurations.maxRapidityHt) { - return; - } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxRap); - - // Pt selection - if (KFHt.GetPt() <= kfparticleConfigurations.minPtHt || KFHt.GetPt() >= kfparticleConfigurations.maxPtHt) { - return; - } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxPt); - - // Mass window - float massHt, sigmaMassHt; - KFHt.GetMass(massHt, sigmaMassHt); - if (massHt <= kfparticleConfigurations.minMassHt || massHt >= kfparticleConfigurations.maxMassHt) { - return; - } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxMass); - - // cos(PA) to PV - if (std::abs(cpaFromKF(KFHt, kfpv)) <= kfparticleConfigurations.minCosPA) { - return; - } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxCosPA); - - // cos(PA) xy to PV - if (std::abs(cpaXYFromKF(KFHt, kfpv)) <= kfparticleConfigurations.minCosPAxy) { - return; - } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxCosPAXY); - - // chi2 geometrical - float chi2geoNDF = KFHt.GetChi2() / KFHt.GetNDF(); - if (kfparticleConfigurations.applyTopoSel && chi2geoNDF >= kfparticleConfigurations.maxChi2geo) { - return; - } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxChi2geo); - LOG(debug) << "Basic selections after vertex fit done."; - - // ctau before topo constraint - if (KFHt.GetLifeTime() > kfparticleConfigurations.maxctauHt) { - return; - } - - // Set vertex constraint and topological selection - KFParticle KFHtPV = KFHt; - try { - KFHtPV.SetProductionVertex(kfpv); - } catch (std::runtime_error& e) { - LOG(error) << "Exception caught KFParticle process call: Topological constraint failed"; - return; - } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxTopoConstr); // to check if topo constraint fails - // get topological chi2 - float chi2topoNDF = KFHtPV.GetChi2() / KFHtPV.GetNDF(); - KFHtPV.TransportToDecayVertex(); - if (kfparticleConfigurations.applyTopoSel && chi2topoNDF >= kfparticleConfigurations.maxChi2topo) { - return; - } - registry.fill(HIST("Counters/hVtx3BodyCounterKFParticle"), kKfVtxChi2topo); - - // -------- STEP 6: collect and fill candidate info -------- - // get cluster size of strangeness tracked 3bodies - float trackedClSize; - if (decay3bodyID == -1) { - trackedClSize = 0; - } else { - trackedClSize = !fTrackedClSizeVector.empty() ? fTrackedClSizeVector[decay3bodyID] : 0; - } - - // candidate filling - kfCandidate candidate; - candidate.collisionID = collision.globalIndex(); - candidate.trackPosID = trackPos.globalIndex(); - candidate.trackNegID = trackNeg.globalIndex(); - candidate.trackBachID = trackBach.globalIndex(); - candidate.decay3bodyID = decay3bodyID; - // hypertriton - candidate.mass = massHt; - candidate.pos[0] = KFHt.GetX(); - candidate.pos[1] = KFHt.GetY(); - candidate.pos[2] = KFHt.GetZ(); - candidate.posErr[0] = KFHt.GetErrX(); - candidate.posErr[1] = KFHt.GetErrY(); - candidate.posErr[2] = KFHt.GetErrZ(); - candidate.mom[0] = KFHt.GetPx(); - candidate.mom[1] = KFHt.GetPy(); - candidate.mom[2] = KFHt.GetPz(); - candidate.mom[3] = KFHt.GetPt(); - candidate.momErr[0] = KFHt.GetErrPx(); - candidate.momErr[1] = KFHt.GetErrPy(); - candidate.momErr[2] = KFHt.GetErrPz(); - candidate.momErr[3] = KFHt.GetErrPt(); - candidate.charge = KFHt.GetQ(); - candidate.dcaToPV[0] = KFHt.GetDistanceFromVertex(kfpv); - candidate.dcaToPV[1] = KFHt.GetDistanceFromVertexXY(kfpv); - candidate.cpaToPV[0] = cpaFromKF(KFHt, kfpv); - candidate.cpaToPV[1] = cpaXYFromKF(KFHt, kfpv); - candidate.cpaToPVtopo[0] = cpaFromKF(KFHtPV, kfpv); - candidate.cpaToPVtopo[1] = cpaXYFromKF(KFHtPV, kfpv); - candidate.decLen[0] = KFHtPV.GetDecayLength(); - candidate.decLen[1] = KFHtPV.GetDecayLengthXY(); - candidate.ldl = KFHtPV.GetDecayLength() / KFHtPV.GetErrDecayLength(); - candidate.chi2geoNDF = chi2geoNDF; - candidate.chi2topoNDF = chi2topoNDF; - candidate.ctau = KFHtPV.GetLifeTime(); - candidate.trackedClSize = trackedClSize; - // V0 - candidate.massV0 = massV0; - candidate.chi2massV0 = chi2massV0; - candidate.cpaV0ToPV = cpaFromKF(KFV0, kfpv); - // daughter momenta - candidate.protonMom[0] = kfpProton.GetPx(); - candidate.protonMom[1] = kfpProton.GetPy(); - candidate.protonMom[2] = kfpProton.GetPz(); - candidate.pionMom[0] = kfpPion.GetPx(); - candidate.pionMom[1] = kfpPion.GetPy(); - candidate.pionMom[2] = kfpPion.GetPz(); - candidate.deuteronMom[0] = kfpDeuteron.GetPx(); - candidate.deuteronMom[1] = kfpDeuteron.GetPy(); - candidate.deuteronMom[2] = kfpDeuteron.GetPz(); - candidate.tpcInnerParam[0] = tpcInnerParamProton; - candidate.tpcInnerParam[1] = tpcInnerParamPion; - candidate.tpcInnerParam[2] = tpcInnerParamDeuteron; - // daughter DCAs with KF - candidate.DCAdaughterToPV[0] = kfpProton.GetDistanceFromVertex(kfpv); - candidate.DCAdaughterToPV[1] = kfpPion.GetDistanceFromVertex(kfpv); - candidate.DCAdaughterToPV[2] = kfpDeuteron.GetDistanceFromVertex(kfpv); - candidate.DCAdaughterToPVxy[0] = kfpProton.GetDistanceFromVertexXY(kfpv); - candidate.DCAdaughterToPVxy[1] = kfpPion.GetDistanceFromVertexXY(kfpv); - candidate.DCAdaughterToPVxy[2] = kfpDeuteron.GetDistanceFromVertexXY(kfpv); - candidate.DCAdaughterToSVxy[0] = kfpProton.GetDistanceFromVertexXY(KFHt); - candidate.DCAdaughterToSVxy[1] = kfpPion.GetDistanceFromVertexXY(KFHt); - candidate.DCAdaughterToSVxy[2] = kfpDeuteron.GetDistanceFromVertexXY(KFHt); - candidate.DCAprotonToPion = kfpProton.GetDistanceFromParticle(kfpPion); - candidate.DCAprotonToDeuteron = kfpProton.GetDistanceFromParticle(kfpDeuteron); - candidate.DCApionToDeuteron = kfpPion.GetDistanceFromParticle(kfpDeuteron); - candidate.DCAvtxDaughters3D = DCAvtxDaughters3D; - // daughter DCAs with material corrections - candidate.trackDCAxy[0] = TrackPosDcaXY; - candidate.trackDCAxy[1] = TrackNegDcaXY; - candidate.trackDCAxy[2] = TrackBachDcaXY; - candidate.trackDCA[0] = TrackPosDca; - candidate.trackDCA[1] = TrackNegDca; - candidate.trackDCA[2] = TrackBachDca; - // daughter signs - candidate.daughterCharge[0] = kfpProton.GetQ(); - candidate.daughterCharge[1] = kfpPion.GetQ(); - candidate.daughterCharge[2] = trackBach.sign(); - // daughter PID - candidate.tpcNsigma[0] = tpcNsigmaProton; - candidate.tpcNsigma[1] = tpcNsigmaPion; - candidate.tpcNsigma[2] = tpcNsigmaDeuteron; - candidate.tpcNsigma[3] = tpcNsigmaPionBach; - candidate.tpcdEdx[0] = dEdxProton; - candidate.tpcdEdx[1] = dEdxPion; - candidate.tpcdEdx[2] = dEdxDeuteron; - candidate.tofNsigmaDeuteron = tofNSigmaDeuteron; - candidate.averageClusterSizeDeuteron = averageClusterSizeDeuteron; - candidate.pidForTrackingDeuteron = trackBach.pidForTracking(); - - //------------------------------------------------------------------ - // table filling - fillCandidateTable(candidate); - LOG(debug) << "Table filled."; - - // fill event counter hist (has selected candidate) --> only filled once per vertex - registry.fill(HIST("Counters/hEventCounterKFParticle"), 3.5); - } // end buildVtx3BodyDataTableKFParticle - - //------------------------------------------------------------------ - void processRun3(ColwithEvTimes const& collisions, aod::Decay3Bodys const& decay3bodys, TrackExtPIDIUwithEvTimes const&, aod::BCsWithTimestamps const&) - { - VtxCandidates.clear(); - - registry.fill(HIST("hEventCounter"), 0.5, collisions.size()); - - for (const auto& d3body : decay3bodys) { - auto t0 = d3body.track0_as(); - auto t1 = d3body.track1_as(); - auto t2 = d3body.track2_as(); - auto collision = d3body.collision_as(); - auto bc = collision.bc_as(); - initCCDB(bc); - - // Recalculate the TOF PID - double tofNSigmaBach = -999; - if (t2.has_collision() && t2.hasTOF()) { - auto originalcol = t2.template collision_as(); - tofNSigmaBach = bachelorTOFPID.GetTOFNSigma(t2, originalcol, collision); - } - - fillVtxCand(collision, t0, t1, t2, d3body.globalIndex(), bachelorcharge, tofNSigmaBach); - } - } - PROCESS_SWITCH(decay3bodyBuilder, processRun3, "Produce DCA fitter decay3body tables", true); - - //------------------------------------------------------------------ - void processRun3Reduced(aod::RedCollisions const& collisions, aod::RedDecay3Bodys const& decay3bodys, aod::RedIUTracks const&) - { - VtxCandidates.clear(); - - registry.fill(HIST("hEventCounter"), 0.5, collisions.size()); - - for (const auto& d3body : decay3bodys) { - auto t0 = d3body.track0_as(); - auto t1 = d3body.track1_as(); - auto t2 = d3body.track2_as(); - auto collision = d3body.collision_as(); - - initCCDBfromRunNumber(collision.runNumber()); - fillVtxCand(collision, t0, t1, t2, d3body.globalIndex(), bachelorcharge, t2.tofNSigmaDe()); - } - } - PROCESS_SWITCH(decay3bodyBuilder, processRun3Reduced, "Produce DCA fitter decay3body tables with reduced data", false); - - //------------------------------------------------------------------ - // Event-mixing background - void processRun3ReducedEM(ReducedCollisionsMultsCents const& collisions, aod::RedDecay3Bodys const& decay3bodys, aod::RedIUTracks const&) - { - auto xAxis = registry.get(HIST("hEventPairs"))->GetXaxis(); - auto yAxis = registry.get(HIST("hEventPairs"))->GetYaxis(); - - // fill collisions counter - for (const auto& collision : collisions) { - int bin_PosZ = xAxis->FindBin(collision.posZ()); - int bin_Mult = yAxis->FindBin(collision.multNTracksPV()); - registry.fill(HIST("hEventCount"), xAxis->GetBinCenter(bin_PosZ), yAxis->GetBinCenter(bin_Mult)); - } - VtxCandidates.clear(); - - auto tuple = std::make_tuple(decay3bodys); - BinningTypeColEM binningEvent{{dcaFitterEMSel.binsVtxZ, dcaFitterEMSel.binsMultiplicity}, true}; - SameKindPair pair{binningEvent, dcaFitterEMSel.nUseMixed, -1, collisions, tuple, &cache}; - - for (const auto& [c0, decay3bodys0, c1, decay3bodys1] : pair) { - // LOG(info) << "Processing event mixing with collisions " << c0.globalIndex() << " and " << c1.globalIndex(); - initCCDBfromRunNumber(c0.runNumber()); - - int bin_PosZ = xAxis->FindBin(c0.posZ()); - int bin_Mult = yAxis->FindBin(c0.multNTracksPV()); - registry.fill(HIST("hEventPairs"), xAxis->GetBinCenter(bin_PosZ), yAxis->GetBinCenter(bin_Mult)); - - for (const auto& [d3body0, d3body1] : combinations(soa::CombinationsFullIndexPolicy(decay3bodys0, decay3bodys1))) { - - registry.fill(HIST("hDecay3BodyPairsBeforeCut"), xAxis->GetBinCenter(bin_PosZ), yAxis->GetBinCenter(bin_Mult)); - - auto tpos0 = d3body0.track0_as(); - auto tneg0 = d3body0.track1_as(); - auto tbach0 = d3body0.track2_as(); - auto tpos1 = d3body1.track0_as(); - auto tneg1 = d3body1.track1_as(); - auto tbach1 = d3body1.track2_as(); - - // try to fit the vertex for decay3body0 - auto Trackpos0 = getTrackParCov(tpos0); - auto Trackneg0 = getTrackParCov(tneg0); - auto Trackbach0 = getTrackParCov(tbach0); - int nVtx0 = fitter3body.process(Trackpos0, Trackneg0, Trackbach0); - if (nVtx0 == 0) { - continue; - ; - } - - if ((tbach0.sign() > 0 && !(tbach1.sign() > 0)) || (tbach0.sign() < 0 && !(tbach1.sign() < 0)) || tbach0.globalIndex() == tbach1.globalIndex()) { // only combine if tbach1 has correct sign and is not same as tbach0 - continue; - } - - const auto& vtx0XYZ = fitter3body.getPCACandidate(); - float rVtx0 = std::hypot(vtx0XYZ[0], vtx0XYZ[1]); - registry.fill(HIST("hRadius0"), rVtx0); - - std::array ppos0 = {0.}, pneg0 = {0.}, pbach0{0.}; - const auto& propagatedtpos0 = fitter3body.getTrack(0); - const auto& propagatedtneg0 = fitter3body.getTrack(1); - const auto& propagatedtbach0 = fitter3body.getTrack(2); - propagatedtpos0.getPxPyPzGlo(ppos0); - propagatedtneg0.getPxPyPzGlo(pneg0); - propagatedtbach0.getPxPyPzGlo(pbach0); - for (int i = 0; i < 3; i++) { - pbach0[i] *= bachelorcharge; - } - std::array p3B0 = {ppos0[0] + pneg0[0] + pbach0[0], ppos0[1] + pneg0[1] + pbach0[1], ppos0[2] + pneg0[2] + pbach0[2]}; - float phiVtx0 = std::atan2(p3B0[1], p3B0[0]); - - // try to fit the vertex for decay3body1 - auto Trackpos1 = getTrackParCov(tpos1); - auto Trackneg1 = getTrackParCov(tneg1); - auto Trackbach1 = getTrackParCov(tbach1); - int nVtx1 = fitter3body.process(Trackpos1, Trackneg1, Trackbach1); - if (nVtx1 == 0) { - continue; - } - - const auto& vtx1XYZ = fitter3body.getPCACandidate(); - float rVtx1 = std::hypot(vtx1XYZ[0], vtx1XYZ[1]); - registry.fill(HIST("hRadius1"), rVtx1); - - std::array ppos1 = {0.}, pneg1 = {0.}, pbach1{0.}; - const auto& propagatedtpos1 = fitter3body.getTrack(0); - const auto& propagatedtneg1 = fitter3body.getTrack(1); - const auto& propagatedtbach1 = fitter3body.getTrack(2); - propagatedtpos1.getPxPyPzGlo(ppos1); - propagatedtneg1.getPxPyPzGlo(pneg1); - propagatedtbach1.getPxPyPzGlo(pbach1); - for (int i = 0; i < 3; i++) { - pbach1[i] *= bachelorcharge; - } - std::array p3B1 = {ppos1[0] + pneg1[0] + pbach1[0], ppos1[1] + pneg1[1] + pbach1[1], ppos1[2] + pneg1[2] + pbach1[2]}; - float phiVtx1 = std::atan2(p3B1[1], p3B1[0]); - registry.fill(HIST("hPhi0"), phiVtx0 * o2::constants::math::Rad2Deg); - registry.fill(HIST("hPhi1"), phiVtx1 * o2::constants::math::Rad2Deg); - // convert deltaPhi to range [-pi, pi] - float deltaPhi = RecoDecay::constrainAngle(phiVtx1 - phiVtx0, -o2::constants::math::PI); - // check if radius and phi of the two vertices are compatible - registry.fill(HIST("hDeltaRadius"), rVtx1 - rVtx0); - registry.fill(HIST("hDeltaPhi"), deltaPhi * o2::constants::math::Rad2Deg); - if (std::abs(deltaPhi) * o2::constants::math::Rad2Deg > dcaFitterEMSel.maxDeltaPhiColMixing || std::abs(rVtx1 - rVtx0) > dcaFitterEMSel.maxDeltaRadiusColMixing) { - continue; - } - registry.fill(HIST("hDecay3BodyPairsAfterCut"), xAxis->GetBinCenter(bin_PosZ), yAxis->GetBinCenter(bin_Mult)); - - fillVtxCand(c0, tpos0, tneg0, tbach1, -1, bachelorcharge, tbach1.tofNSigmaDe()); - // initCCDBfromRunNumber(c1.runNumber()); - fillVtxCand(c1, tpos1, tneg1, tbach0, -1, bachelorcharge, tbach0.tofNSigmaDe()); - } - } - - // Aviod break of preslice in following workflow - /*std::sort(VtxCandidates.begin(), VtxCandidates.end(), [](const VtxCandidate a, const VtxCandidate b) { - return a.collisionId < b.collisionId; - });*/ - } - PROCESS_SWITCH(decay3bodyBuilder, processRun3ReducedEM, "Produce event-mixing background", false); - - void processRun3Reduced3bodyMixing(ReducedCollisionsMults const&, aod::RedIUTracks const&, soa::Join const& decay3bodys) - { - VtxCandidates.clear(); - - auto xAxis = registry.get(HIST("hDecay3BodyRadiusPhi"))->GetXaxis(); - auto yAxis = registry.get(HIST("hDecay3BodyRadiusPhi"))->GetYaxis(); - - for (const auto& decay3body : decay3bodys) { - int bin_Radius = xAxis->FindBin(decay3body.svRadius()); - int bin_Phi = yAxis->FindBin(decay3body.momPhi()); - registry.fill(HIST("hDecay3BodyRadiusPhi"), xAxis->GetBinCenter(bin_Radius), yAxis->GetBinCenter(bin_Phi)); - registry.fill(HIST("hDecay3BodyPosZ"), decay3body.svPosZ()); - } - - Binning3BodyDCAFitter binningOnRadiusPhi{{dcaFitterEMSel.bins3BodyRadius, dcaFitterEMSel.bins3BodyPhiDegree}, true}; - doMixed3Body(decay3bodys, binningOnRadiusPhi); - } - PROCESS_SWITCH(decay3bodyBuilder, processRun3Reduced3bodyMixing, "Produce mixing background directly from mixed decay3bodys based on DCAFitter Info", false); - - void processRun3Reduced3bodyMixingKFInfo(ReducedCollisionsMults const&, aod::RedIUTracks const&, soa::Join const& decay3bodys) - { - VtxCandidates.clear(); - - auto xAxis = registry.get(HIST("hDecay3BodyRadiusPhi"))->GetXaxis(); - auto yAxis = registry.get(HIST("hDecay3BodyRadiusPhi"))->GetYaxis(); - - for (const auto& decay3body : decay3bodys) { - int bin_Radius = xAxis->FindBin(decay3body.radius()); - int bin_Phi = yAxis->FindBin(decay3body.phi()); - registry.fill(HIST("hDecay3BodyRadiusPhi"), xAxis->GetBinCenter(bin_Radius), yAxis->GetBinCenter(bin_Phi)); - registry.fill(HIST("hDecay3BodyPosZ"), decay3body.posz()); - } - - Binning3BodyKFInfo binningOnRadiusPhi{{dcaFitterEMSel.bins3BodyRadius, dcaFitterEMSel.bins3BodyPhi}, true}; - doMixed3Body(decay3bodys, binningOnRadiusPhi); - } - PROCESS_SWITCH(decay3bodyBuilder, processRun3Reduced3bodyMixingKFInfo, "Produce mixing background directly from mixed decay3bodys based on KF Info", false); - - //------------------------------------------------------------------ - void processRun3withKFParticle(ColwithEvTimes const& collisions, TrackExtPIDIUwithEvTimes const&, aod::Decay3Bodys const& decay3bodys, aod::BCsWithTimestamps const&) - { - for (const auto& collision : collisions) { - - auto bc = collision.bc_as(); - initCCDB(bc); - LOG(debug) << "CCDB initialised."; - - // Zorro event counting - bool isZorroSelected = false; - if (kfparticleConfigurations.cfgSkimmedProcessing) { - isZorroSelected = zorro.isSelected(collision.template bc_as().globalBC()); - if (isZorroSelected) { - registry.fill(HIST("Counters/hEventCounterZorro"), 0.); - } else { - if (kfparticleConfigurations.cfgOnlyKeepInterestedTrigger) { - continue; - } - } - } - - // event selection - registry.fill(HIST("Counters/hEventCounterKFParticle"), 0.5); - if (kfparticleConfigurations.doSel8selection && !collision.sel8()) { - continue; - } - registry.fill(HIST("Counters/hEventCounterKFParticle"), 1.5); - if (kfparticleConfigurations.doPosZselection && (collision.posZ() >= 10.0f || collision.posZ() <= -10.0f)) { - continue; - } - registry.fill(HIST("Counters/hEventCounterKFParticle"), 2.5); - registry.fill(HIST("QA/Event/hAllSelEventsVtxZ"), collision.posZ()); - - if (isZorroSelected) { - registry.fill(HIST("Counters/hEventCounterZorro"), 1.); - } - - // slice Decay3Body table by collision - const uint64_t collIdx = collision.globalIndex(); - auto Decay3BodyTable_thisCollision = decay3bodys.sliceBy(perCollision, collIdx); - for (auto& vtx3body : Decay3BodyTable_thisCollision) { - auto trackPos = vtx3body.template track0_as(); - auto trackNeg = vtx3body.template track1_as(); - auto trackBach = vtx3body.template track2_as(); - buildVtx3BodyDataTableKFParticle(collision, trackPos, trackNeg, trackBach, vtx3body.globalIndex(), bachelorcharge, getTOFnSigma(collision, trackBach, false /*isEventMixing*/)); - LOG(debug) << "End of processKFParticle."; - } - } - } - PROCESS_SWITCH(decay3bodyBuilder, processRun3withKFParticle, "Produce KFParticle decay3body tables", false); - - void processRun3withKFParticleStrangenessTracking(ColwithEvTimes const& collisions, TrackExtPIDIUwithEvTimes const& tracks, aod::Decay3Bodys const& decay3bodys, aod::Tracked3Bodys const& tracked3bodys, aod::BCsWithTimestamps const& bcs) - { + // get tracked cluster size info fTrackedClSizeVector.clear(); fTrackedClSizeVector.resize(decay3bodys.size(), 0); for (const auto& tvtx3body : tracked3bodys) { fTrackedClSizeVector[tvtx3body.decay3BodyId()] = tvtx3body.itsClsSize(); } - processRun3withKFParticle(collisions, tracks, decay3bodys, bcs); - } - PROCESS_SWITCH(decay3bodyBuilder, processRun3withKFParticleStrangenessTracking, "Produce KFParticle strangeness tracked decay3body tables", false); - - void processRun3withKFParticleReduced(aod::RedCollisions const& collisions, aod::RedIUTracks const&, aod::RedDecay3Bodys const& decay3bodys) - { - int lastRunNumber = -1; - - for (const auto& collision : collisions) { - // set magnetic field only when run number changes - if (collision.runNumber() != lastRunNumber) { - initCCDBfromRunNumber(collision.runNumber()); - lastRunNumber = collision.runNumber(); // Update the last run number - LOG(debug) << "CCDB initialized for run " << lastRunNumber; - } - - // event selection - registry.fill(HIST("Counters/hEventCounterKFParticle"), 2.5); - registry.fill(HIST("QA/Event/hAllSelEventsVtxZ"), collision.posZ()); - - // slice Decay3Body table by collision - const uint64_t collIdx = collision.globalIndex(); - auto Decay3BodyTable_thisCollision = decay3bodys.sliceBy(perReducedCollision, collIdx); - for (auto& vtx3body : Decay3BodyTable_thisCollision) { - auto trackPos = vtx3body.template track0_as(); - auto trackNeg = vtx3body.template track1_as(); - auto trackBach = vtx3body.template track2_as(); - buildVtx3BodyDataTableKFParticle(collision, trackPos, trackNeg, trackBach, vtx3body.globalIndex(), bachelorcharge, trackBach.tofNSigmaDe()); - } - LOG(debug) << "End of processKFParticleDerived."; - } - } - PROCESS_SWITCH(decay3bodyBuilder, processRun3withKFParticleReduced, "Produce KFParticle decay3body tables from derived decay3body data", false); - - void processRun3withKFParticleReducedEM(ReducedCollisionsMults const& collisions, aod::RedIUTracks const&, aod::RedDecay3Bodys const& decay3bodys) - { - // ------------- Check number of events in bins -------------- - // Define a 2D array to count events and pairs per bin - std::vector> binEventCounts(10, std::vector(13, 0)); // 10 vtxZ bins, 13 multiplicity bins - std::vector> binPairCounts(10, std::vector(13, 0)); - - // Function to find bin index (returns -1 if out of range) - auto findBin = [](float value, const std::vector& binEdges) -> int { - for (size_t i = 0; i < binEdges.size() - 1; ++i) { - if (value > binEdges[i] && value <= binEdges[i + 1]) { - return i; - } - } - return -1; // Shouldn't happen if events are within range - }; - // Loop over all collisions to count them in bins - for (auto& collision : collisions) { - float vtxZ = collision.posZ(); - float mult = collision.multNTracksPV(); - - // Determine bin indices - int vtxZBin = findBin(vtxZ, {-10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}); - int multBin = findBin(mult, {0.0f, 1.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f, 110.0f}); - - if (vtxZBin >= 0 && multBin >= 0) { - binEventCounts[vtxZBin][multBin]++; - } - } - // Print out the number of events per bin - LOG(info) << "Event count per bin (vtxZ, mult):"; - for (size_t i = 0; i < binEventCounts.size(); ++i) { - for (size_t j = 0; j < binEventCounts[i].size(); ++j) { - LOG(info) << "Bin (" << i << ", " << j << "): " << binEventCounts[i][j] << " events"; - } - } - // Fill histogram with numbers per bin - for (size_t i = 0; i < binEventCounts.size(); ++i) { - for (size_t j = 0; j < binEventCounts[i].size(); ++j) { - registry.fill(HIST("QA/EM/hEventBinCounts"), i, j, binEventCounts[i][j]); - } - } - LOG(info) << "Integral of hEventBinCounts:" << registry.get(HIST("QA/EM/hEventBinCounts"))->Integral(); - - // ------------- Check number of decay3bodys in bins ------------- - // Define a 2D array to count events and pairs per bin - std::vector> binDecay3BodyCounts(10, std::vector(13, 0)); // 10 vtxZ bins, 13 multiplicity bins - // Loop over all decay3bodys to count them in bins - for (auto& decay3body : decay3bodys) { - auto collision = decay3body.template collision_as(); - float vtx3bodyZ = collision.posZ(); - float mult3body = collision.multNTracksPV(); - - // Determine bin indices - int vtx3bodyZBin = findBin(vtx3bodyZ, {-10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}); - int mult3bodyBin = findBin(mult3body, {0.0f, 1.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f, 110.0f}); - - if (vtx3bodyZBin >= 0 && mult3bodyBin >= 0) { - binDecay3BodyCounts[vtx3bodyZBin][mult3bodyBin]++; - } - } - // Print out the number of events per bin - LOG(debug) << "Event count per bin (vtxZ, mult):"; - for (size_t i = 0; i < binDecay3BodyCounts.size(); ++i) { - for (size_t j = 0; j < binDecay3BodyCounts[i].size(); ++j) { - LOG(debug) << "Bin (" << i << ", " << j << "): " << binDecay3BodyCounts[i][j] << " events"; - } - } - // Fill histogram with numbers per bin - for (size_t i = 0; i < binDecay3BodyCounts.size(); ++i) { - for (size_t j = 0; j < binDecay3BodyCounts[i].size(); ++j) { - registry.fill(HIST("QA/EM/h3bodyBinCounts"), i, j, binDecay3BodyCounts[i][j]); - } - } - LOG(info) << "Integral of h3bodyBinCounts:" << registry.get(HIST("QA/EM/h3bodyBinCounts"))->Integral(); - - // ------------- Do event mixing -------------- - auto tuple = std::make_tuple(decay3bodys); - BinningTypeKF binningOnPosAndMult{{kfparticleConfigurations.binsVtxZ, kfparticleConfigurations.binsMultiplicity}, true}; // ignore over-/underflow - SameKindPair pair{binningOnPosAndMult, kfparticleConfigurations.nEvtMixing, -1, collisions, tuple, &cache}; // indicates that under/overflow (-1) to be ignored - - int lastRunNumber = -1; - - for (auto& [c1, decays3body1, c2, decays3body2] : pair) { - registry.fill(HIST("QA/EM/hPairCounterMixing"), 0.5); - - // event selection already applied in reducer task - - // set magnetic field only when run number changes - if (c1.runNumber() != lastRunNumber) { - initCCDBfromRunNumber(c1.runNumber()); - lastRunNumber = c1.runNumber(); // Update the last run number - LOG(debug) << "CCDB initialized for run " << lastRunNumber; - } - - // Get vtxZ and multiplicity from collision - float vtxZpair = c1.posZ(); - float multpair = c1.multNTracksPV(); - // Find the bin index - int vtxZpairBin = findBin(vtxZpair, {-10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}); - int multpairBin = findBin(multpair, {0.0f, 1.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f, 110.0f}); - if (vtxZpairBin >= 0 && multpairBin >= 0) { - binPairCounts[vtxZpairBin][multpairBin]++; // Count the pair - } - - for (auto& [decay3body1, decay3body2] : soa::combinations(soa::CombinationsFullIndexPolicy(decays3body1, decays3body2))) { - auto trackPos1 = decay3body1.template track0_as(); - auto trackNeg1 = decay3body1.template track1_as(); - auto trackBach1 = decay3body1.template track2_as(); - auto trackPos2 = decay3body2.template track0_as(); - auto trackNeg2 = decay3body2.template track1_as(); - auto trackBach2 = decay3body2.template track2_as(); - - registry.fill(HIST("QA/EM/hCombinationCounterMixing"), 0.5); - - // ---------- selections bachelor track ---------- - if ((trackBach1.sign() > 0 && !(trackBach2.sign() > 0)) || (trackBach1.sign() < 0 && !(trackBach2.sign() < 0)) || trackBach1.globalIndex() == trackBach2.globalIndex()) { // only combine if trackBach2 has correct sign and is not same as trackBach1 - continue; - } - registry.fill(HIST("QA/EM/hCombinationCounterMixing"), 1.5); - - // ---------- check radius and phi of decay3bodys ---------- - auto trackParCovPos1 = getTrackParCov(trackPos1); - auto trackParCovNeg1 = getTrackParCov(trackNeg1); - auto trackParCovBach1 = getTrackParCov(trackBach1); - auto trackParCovPos2 = getTrackParCov(trackPos2); - auto trackParCovNeg2 = getTrackParCov(trackNeg2); - auto trackParCovBach2 = getTrackParCov(trackBach2); - // create KFParticle objects from tracks - KFParticle kfpProton1, kfpPion1, kfpDeuteron1; - if (trackBach1.sign() > 0) { - kfpProton1 = createKFParticleFromTrackParCov(trackParCovPos1, trackPos1.sign(), constants::physics::MassProton); - kfpPion1 = createKFParticleFromTrackParCov(trackParCovNeg1, trackNeg1.sign(), constants::physics::MassPionCharged); - } else if (!(trackBach1.sign() > 0)) { - kfpProton1 = createKFParticleFromTrackParCov(trackParCovNeg1, trackNeg1.sign(), constants::physics::MassProton); - kfpPion1 = createKFParticleFromTrackParCov(trackParCovPos1, trackPos1.sign(), constants::physics::MassPionCharged); - } - kfpDeuteron1 = createKFParticleFromTrackParCov(trackParCovBach1, trackBach1.sign() * bachelorcharge, constants::physics::MassDeuteron); - KFParticle kfpProton2, kfpPion2, kfpDeuteron2; - if (trackBach2.sign() > 0) { - kfpProton2 = createKFParticleFromTrackParCov(trackParCovPos2, trackPos2.sign(), constants::physics::MassProton); - kfpPion2 = createKFParticleFromTrackParCov(trackParCovNeg2, trackNeg2.sign(), constants::physics::MassPionCharged); - } else if (!(trackBach2.sign() > 0)) { - kfpProton2 = createKFParticleFromTrackParCov(trackParCovNeg2, trackNeg2.sign(), constants::physics::MassProton); - kfpPion2 = createKFParticleFromTrackParCov(trackParCovPos2, trackPos2.sign(), constants::physics::MassPionCharged); - } - kfpDeuteron2 = createKFParticleFromTrackParCov(trackParCovBach2, trackBach2.sign() * bachelorcharge, constants::physics::MassDeuteron); - // fit vertices - KFParticle KFHt1, KFHt2; - fit3bodyVertex(kfpProton1, kfpPion1, kfpDeuteron1, KFHt1); - fit3bodyVertex(kfpProton2, kfpPion2, kfpDeuteron2, KFHt2); - - // ---------- select common radius and phi region ---------- - auto radius1 = std::sqrt(KFHt1.GetX() * KFHt1.GetX() + KFHt1.GetY() * KFHt1.GetY()); - auto radius2 = std::sqrt(KFHt2.GetX() * KFHt2.GetX() + KFHt2.GetY() * KFHt2.GetY()); - registry.fill(HIST("QA/EM/hRadius1"), radius1); - registry.fill(HIST("QA/EM/hRadius2"), radius2); - registry.fill(HIST("QA/EM/hPhi1"), KFHt1.GetPhi() * (180.0 / TMath::Pi())); - registry.fill(HIST("QA/EM/hPhi2"), KFHt2.GetPhi() * (180.0 / TMath::Pi())); - registry.fill(HIST("QA/EM/hDeltaRadius"), std::abs(radius1 - radius2)); - registry.fill(HIST("QA/EM/hDeltaPhi"), std::abs(KFHt1.GetPhi() - KFHt2.GetPhi()) * (180.0 / TMath::Pi())); - if (std::abs(KFHt1.GetPhi() - KFHt2.GetPhi()) * (180.0 / TMath::Pi()) > 10 || std::abs(radius1 - radius2) > 2) { - continue; - } - registry.fill(HIST("QA/EM/hCombinationCounterMixing"), 2.5); - - // fill 2D pair counter per bin - registry.fill(HIST("QA/EM/hPairBinCounts"), vtxZpairBin, multpairBin, 1); - - // ---------- do candidate analysis ---------- - buildVtx3BodyDataTableKFParticle(c1, trackPos1, trackNeg1, trackBach2, -1 /*vtx3bodyID*/, bachelorcharge, trackBach2.tofNSigmaDe()); - } // end decay3body combinations loop - } // end pairing loop - } // end process - PROCESS_SWITCH(decay3bodyBuilder, processRun3withKFParticleReducedEM, "Produce KFParticle event mixing decay3body tables from derived decay3body data", false); - - void processRun3withKFParticleReduced3bodyMixing(ReducedCollisionsMults const&, aod::RedIUTracks const&, soa::Join const& decay3bodys) - { - // Define a 2D array to count 3bodies per bin (radius, phi, posZ) - std::vector> bin3bodyCounts(16, std::vector(36, 0)); - - // Function to find bin index (returns -1 if out of range) - auto findBin = [](float value, const std::vector& binEdges) -> int { - for (size_t i = 0; i < binEdges.size() - 1; ++i) { - if (value > binEdges[i] && value <= binEdges[i + 1]) { - return i; - } - } - return -1; // Out of range - }; - - int counter = 0; - // Loop over all collisions to count them in bins - for (auto& decay3body : decay3bodys) { - counter++; - float radius = decay3body.radius(); - float phi = decay3body.phi(); - float posZ = decay3body.posz(); - - registry.fill(HIST("QA/EM/hRadius"), radius); - registry.fill(HIST("QA/EM/hPhi"), phi); - registry.fill(HIST("QA/EM/hPosZ"), posZ); - - // float degToRad = TMath::Pi()/180; - - // Determine bin indices - int radiusBin = findBin(radius, {0.0f, 0.5f, 1.0f, 1.5f, 2.0f, 3.0f, 4.0f, 6.0f, 8.0f, 10.0f, 12.0f, 14.0f, 16.0f, 18.0f, 20.0f, 30.0f, 1000.0}); - int phiBin = findBin(phi, {-180.0f * TMath::Pi() / 180, -160.0f * TMath::Pi() / 180, -140.0f * TMath::Pi() / 180, -120.0f * TMath::Pi() / 180, -100.0f * TMath::Pi() / 180, -80.0f * TMath::Pi() / 180, -60.0f * TMath::Pi() / 180, -40.0f * TMath::Pi() / 180, -20.0f * TMath::Pi() / 180, 0.0f, 20.0f * TMath::Pi() / 180, 40.0f * TMath::Pi() / 180, 60.0f * TMath::Pi() / 180, 80.0f * TMath::Pi() / 180, 100.0f * TMath::Pi() / 180, 120.0f * TMath::Pi() / 180, 140.0f * TMath::Pi() / 180, 160.0f * TMath::Pi() / 180, 180.0f * TMath::Pi() / 180}); - if (radiusBin >= 0 && phiBin >= 0) { // && posZBin >= 0) { - bin3bodyCounts[radiusBin][phiBin]++; //[posZBin]++; - } - } - LOG(info) << "3body counter: " << counter; - - // Print out the number of 3-body decays per bin - LOG(info) << "3body count per bin (radius, phi, posZ):"; - for (size_t i = 0; i < bin3bodyCounts.size(); ++i) { - for (size_t j = 0; j < bin3bodyCounts[i].size(); ++j) { - LOG(info) << "Bin (" << i << ", " << j << "): " << bin3bodyCounts[i][j] << " 3bodies"; - } - } - // Fill 3D histogram with numbers per bin - for (size_t i = 0; i < bin3bodyCounts.size(); ++i) { - for (size_t j = 0; j < bin3bodyCounts[i].size(); ++j) { - registry.fill(HIST("QA/EM/h3bodyBinCounts"), i, j, bin3bodyCounts[i][j]); - } - } - LOG(info) << "Integral of h3bodyBinCounts: " << registry.get(HIST("QA/EM/h3bodyBinCounts"))->Integral(); - - Binning3Body binningOnRadPhi{{kfparticleConfigurations.bins3BodyRadius, kfparticleConfigurations.bins3BodyPhi}, true}; - - // Strictly upper index policy for decay3body objects binned by radius, phi and z position - for (auto& [decay3body1, decay3body2] : selfPairCombinations(binningOnRadPhi, kfparticleConfigurations.nEvtMixing, -1, decay3bodys)) { - auto trackPos1 = decay3body1.template track0_as(); - auto trackNeg1 = decay3body1.template track1_as(); - auto trackBach1 = decay3body1.template track2_as(); - auto trackPos2 = decay3body2.template track0_as(); - auto trackNeg2 = decay3body2.template track1_as(); - auto trackBach2 = decay3body2.template track2_as(); - - registry.fill(HIST("QA/EM/h3bodyCombinationCounter"), 0.5); - - // collision vertex selections - auto collision1 = decay3body1.template collision_as(); - auto collision2 = decay3body2.template collision_as(); - initCCDBfromRunNumber(collision2.runNumber()); - initCCDBfromRunNumber(collision1.runNumber()); - - if (decay3body1.collisionId() == decay3body2.collisionId()) { // only combine if from different event - continue; - } - registry.fill(HIST("QA/EM/h3bodyCombinationCounter"), 1.5); - if (kfparticleConfigurations.selectVtxZ3bodyMixing && std::abs(collision1.posZ() - collision2.posZ()) > kfparticleConfigurations.VtxZBin3bodyMixing) { // only combine if collision similar in VtxZ - continue; - } - registry.fill(HIST("QA/EM/h3bodyCombinationCounter"), 2.5); - - // ---------- selections ---------- - if ((trackBach1.sign() > 0 && !(trackBach2.sign() > 0)) || (trackBach1.sign() < 0 && !(trackBach2.sign() < 0)) || trackBach1.globalIndex() == trackBach2.globalIndex()) { // only combine if trackBach2 has correct sign and is not same as trackBach1 - continue; - } - registry.fill(HIST("QA/EM/h3bodyCombinationCounter"), 3.5); - - // ---------- do candidate analysis ---------- - bool isMatter1 = false; - if (trackBach1.sign() > 0) { - isMatter1 = true; - } - if (kfparticleConfigurations.mixingType == 0) { // mix deuteron - buildVtx3BodyDataTableKFParticle(collision1, trackPos1, trackNeg1, trackBach2, -1 /*vtx3bodyID*/, bachelorcharge, trackBach2.tofNSigmaDe()); - buildVtx3BodyDataTableKFParticle(collision2, trackPos2, trackNeg2, trackBach1, -1 /*vtx3bodyID*/, bachelorcharge, trackBach1.tofNSigmaDe()); - } else if (kfparticleConfigurations.mixingType == 1) { // mix proton - if (isMatter1 == true) { - buildVtx3BodyDataTableKFParticle(collision1, trackPos2, trackNeg1, trackBach1, -1 /*vtx3bodyID*/, bachelorcharge, trackBach1.tofNSigmaDe()); - buildVtx3BodyDataTableKFParticle(collision2, trackPos1, trackNeg2, trackBach2, -1 /*vtx3bodyID*/, bachelorcharge, trackBach2.tofNSigmaDe()); - } else if (isMatter1 == false) { - buildVtx3BodyDataTableKFParticle(collision1, trackPos1, trackNeg2, trackBach1, -1 /*vtx3bodyID*/, bachelorcharge, trackBach1.tofNSigmaDe()); - buildVtx3BodyDataTableKFParticle(collision2, trackPos2, trackNeg1, trackBach2, -1 /*vtx3bodyID*/, bachelorcharge, trackBach2.tofNSigmaDe()); - } - } - } // end decay3body combinations loop - } - PROCESS_SWITCH(decay3bodyBuilder, processRun3withKFParticleReduced3bodyMixing, "Produce KFParticle mixed decay3body tables from derived decay3body data", false); -}; - -// build link from decay3body -> vtx3body -struct decay3bodyDataLinkBuilder { - Produces VtxDataLink; - - void init(InitContext const&) {} - - template - void buildDecay3BodyLabel(TDecay3Bodys const& decay3bodytable, TVtx3BodyDatas const& vtxdatatable) - { - std::vector lIndices; - lIndices.reserve(decay3bodytable.size()); - for (int ii = 0; ii < decay3bodytable.size(); ii++) - lIndices[ii] = -1; - for (const auto& vtxdata : vtxdatatable) { - if (vtxdata.decay3bodyId() != -1) { - lIndices[vtxdata.decay3bodyId()] = vtxdata.globalIndex(); - } - } - for (int ii = 0; ii < decay3bodytable.size(); ii++) { - VtxDataLink(lIndices[ii]); - } - } - - void processStandard(aod::Decay3Bodys const& decay3bodytable, aod::Vtx3BodyDatas const& vtxdatatable) - { - buildDecay3BodyLabel(decay3bodytable, vtxdatatable); - } - PROCESS_SWITCH(decay3bodyDataLinkBuilder, processStandard, "Produce label from decay3body to vtx3body", true); - - void processReduced(aod::RedDecay3Bodys const& decay3bodytable, aod::Vtx3BodyDatas const& vtxdatatable) - { - buildDecay3BodyLabel(decay3bodytable, vtxdatatable); - } - PROCESS_SWITCH(decay3bodyDataLinkBuilder, processReduced, "Produce label from reducedDecay3body to vtx3body", false); -}; - -struct kfdecay3bodyDataLinkBuilder { - Produces kfvtxdataLink; - - void init(InitContext const&) {} - - template - void buildDataLink(TDecay3Bodys const& decay3bodytable, TVtx3BodyDatas const& vtxdatatable) - { - std::vector lIndices; - lIndices.reserve(decay3bodytable.size()); - for (int ii = 0; ii < decay3bodytable.size(); ii++) - lIndices[ii] = -1; - for (auto& vtxdata : vtxdatatable) { - if (vtxdata.decay3bodyId() != -1) { - lIndices[vtxdata.decay3bodyId()] = vtxdata.globalIndex(); - } - } - for (int ii = 0; ii < decay3bodytable.size(); ii++) { - kfvtxdataLink(lIndices[ii]); - } - } - - void processStandard(aod::Decay3Bodys const& decay3bodytable, aod::KFVtx3BodyDatas const& vtxdatatable) - { - buildDataLink(decay3bodytable, vtxdatatable); // build Decay3Body -> KFDecay3BodyData link table - } - PROCESS_SWITCH(kfdecay3bodyDataLinkBuilder, processStandard, "Build data link table.", true); - - void processReduced(aod::RedDecay3Bodys const& decay3bodytable, aod::KFVtx3BodyDatas const& vtxdatatable) - { - buildDataLink(decay3bodytable, vtxdatatable); // build ReducedDecay3Body -> KFDecay3BodyData link table - } - PROCESS_SWITCH(kfdecay3bodyDataLinkBuilder, processReduced, "Build data link table for reduced data.", false); -}; - -struct decay3bodyLabelBuilder { - - Produces vtxlabels; - Produces vtxfulllabels; - - HistogramRegistry registry{"registry", {}}; - - void init(InitContext const&) - { - if (doprocessDoNotBuildLabels == false) { - auto hLabelCounter = registry.add("hLabelCounter", "hLabelCounter", HistType::kTH1D, {{3, 0.0f, 3.0f}}); - hLabelCounter->GetXaxis()->SetBinLabel(1, "Total"); - hLabelCounter->GetXaxis()->SetBinLabel(2, "Have Same MotherTrack"); - hLabelCounter->GetXaxis()->SetBinLabel(3, "True H3L"); - - registry.add("hHypertritonMCPt", "hHypertritonMCPt", HistType::kTH1F, {{100, 0.0f, 10.0f}}); - registry.add("hAntiHypertritonMCPt", "hAntiHypertritonMCPt", HistType::kTH1F, {{100, 0.0f, 10.0f}}); - registry.add("hHypertritonMCMass", "hHypertritonMCMass", HistType::kTH1F, {{40, 2.95f, 3.05f, "Inv. Mass (GeV/c^{2})"}}); - registry.add("hAntiHypertritonMCMass", "hAntiHypertritonMCMass", HistType::kTH1F, {{40, 2.95f, 3.05f, "Inv. Mass (GeV/c^{2})"}}); - registry.add("hHypertritonMCLifetime", "hHypertritonMCLifetime", HistType::kTH1F, {{50, 0.0f, 50.0f, "ct(cm)"}}); - registry.add("hAntiHypertritonMCLifetime", "hAntiHypertritonMCLifetime", HistType::kTH1F, {{50, 0.0f, 50.0f, "ct(cm)"}}); - } - } - - Configurable TpcPidNsigmaCut{"TpcPidNsigmaCut", 5, "TpcPidNsigmaCut"}; - - void processDoNotBuildLabels(aod::Decay3BodyDataLink const&) // is it possible to have none parameter? - { - // dummy process function - should not be required in the future - }; - PROCESS_SWITCH(decay3bodyLabelBuilder, processDoNotBuildLabels, "Do not produce MC label tables", true); - - void processBuildLabels(aod::Decay3BodysLinked const& decay3bodys, aod::Vtx3BodyDatas const& vtx3bodydatas, MCLabeledTracksIU const&, aod::McParticles const&) - { - std::vector lIndices; - lIndices.reserve(vtx3bodydatas.size()); - for (int ii = 0; ii < vtx3bodydatas.size(); ii++) { - lIndices[ii] = -1; - } - for (const auto& decay3body : decay3bodys) { - - int lLabel = -1; - int lPDG = -1; - float lPt = -1; - double MClifetime = -1; - bool is3bodyDecay = false; - int lGlobalIndex = -1; - - auto lTrack0 = decay3body.track0_as(); - auto lTrack1 = decay3body.track1_as(); - auto lTrack2 = decay3body.track2_as(); - registry.fill(HIST("hLabelCounter"), 0.5); - - // Association check - // There might be smarter ways of doing this in the future - if (!lTrack0.has_mcParticle() || !lTrack1.has_mcParticle() || !lTrack2.has_mcParticle()) { - vtxfulllabels(-1); - continue; - } - auto lMCTrack0 = lTrack0.mcParticle_as(); - auto lMCTrack1 = lTrack1.mcParticle_as(); - auto lMCTrack2 = lTrack2.mcParticle_as(); - if (!lMCTrack0.has_mothers() || !lMCTrack1.has_mothers() || !lMCTrack2.has_mothers()) { - vtxfulllabels(-1); - continue; - } - - for (const auto& lMother0 : lMCTrack0.mothers_as()) { - for (const auto& lMother1 : lMCTrack1.mothers_as()) { - for (const auto& lMother2 : lMCTrack2.mothers_as()) { - if (lMother0.globalIndex() == lMother1.globalIndex() && lMother0.globalIndex() == lMother2.globalIndex()) { - lGlobalIndex = lMother1.globalIndex(); - lPt = lMother1.pt(); - lPDG = lMother1.pdgCode(); - MClifetime = RecoDecay::sqrtSumOfSquares(lMCTrack2.vx() - lMother2.vx(), lMCTrack2.vy() - lMother2.vy(), lMCTrack2.vz() - lMother2.vz()) * o2::constants::physics::MassHyperTriton / lMother2.p(); // only for hypertriton - is3bodyDecay = true; // vtxs with the same mother - } - } - } - } // end association check - if (!is3bodyDecay) { - vtxfulllabels(-1); - continue; - } - registry.fill(HIST("hLabelCounter"), 1.5); - - // Intended for hypertriton cross-checks only - if (lPDG == 1010010030 && lMCTrack0.pdgCode() == 2212 && lMCTrack1.pdgCode() == -211 && lMCTrack2.pdgCode() == 1000010020) { - lLabel = lGlobalIndex; - double hypertritonMCMass = RecoDecay::m(std::array{std::array{lMCTrack0.px(), lMCTrack0.py(), lMCTrack0.pz()}, std::array{lMCTrack1.px(), lMCTrack1.py(), lMCTrack1.pz()}, std::array{lMCTrack2.px(), lMCTrack2.py(), lMCTrack2.pz()}}, std::array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged, o2::constants::physics::MassDeuteron}); - registry.fill(HIST("hLabelCounter"), 2.5); - registry.fill(HIST("hHypertritonMCPt"), lPt); - registry.fill(HIST("hHypertritonMCLifetime"), MClifetime); - registry.fill(HIST("hHypertritonMCMass"), hypertritonMCMass); - } - if (lPDG == -1010010030 && lMCTrack0.pdgCode() == 211 && lMCTrack1.pdgCode() == -2212 && lMCTrack2.pdgCode() == -1000010020) { - lLabel = lGlobalIndex; - double antiHypertritonMCMass = RecoDecay::m(std::array{std::array{lMCTrack0.px(), lMCTrack0.py(), lMCTrack0.pz()}, std::array{lMCTrack1.px(), lMCTrack1.py(), lMCTrack1.pz()}, std::array{lMCTrack2.px(), lMCTrack2.py(), lMCTrack2.pz()}}, std::array{o2::constants::physics::MassPionCharged, o2::constants::physics::MassProton, o2::constants::physics::MassDeuteron}); - registry.fill(HIST("hLabelCounter"), 2.5); - registry.fill(HIST("hAntiHypertritonMCPt"), lPt); - registry.fill(HIST("hAntiHypertritonMCLifetime"), MClifetime); - registry.fill(HIST("hAntiHypertritonMCMass"), antiHypertritonMCMass); - } - - // Construct label table, only vtx which corresponds to true mother and true daughters with a specified order is labeled - // for matter: track0->p, track1->pi, track2->bachelor - // for antimatter: track0->pi, track1->p, track2->bachelor - vtxfulllabels(lLabel); - if (decay3body.vtx3BodyDataId() != -1) { - lIndices[decay3body.vtx3BodyDataId()] = lLabel; - } - } - for (int ii = 0; ii < vtx3bodydatas.size(); ii++) { - vtxlabels(lIndices[ii]); - } + // do candidate analysis with MC processing + buildCandidates(bcs, // bc table + collisions, // collision table + decay3bodys, // decay3body table + mcParticles, // MC particle table + mcCollisions); // MC collision table } - PROCESS_SWITCH(decay3bodyLabelBuilder, processBuildLabels, "Produce MC label tables", false); -}; -struct decay3bodyInitializer { - Spawns vtx3bodydatas; - void init(InitContext const&) {} + PROCESS_SWITCH(decay3bodyBuilder, processRealData, "process real data", true); + PROCESS_SWITCH(decay3bodyBuilder, processRealDataReduced, "process real reduced data", false); + PROCESS_SWITCH(decay3bodyBuilder, processRealDataReduced3bodyMixing, "process real reduced data", false); + PROCESS_SWITCH(decay3bodyBuilder, processMonteCarlo, "process monte carlo", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc), - adaptAnalysisTask(cfgc), - adaptAnalysisTask(cfgc), - adaptAnalysisTask(cfgc), - }; + adaptAnalysisTask(cfgc)}; } diff --git a/PWGLF/TableProducer/Nuspex/hypertriton3bodyfinder.cxx b/PWGLF/TableProducer/Nuspex/hypertriton3bodyfinder.cxx deleted file mode 100644 index bad62accce2..00000000000 --- a/PWGLF/TableProducer/Nuspex/hypertriton3bodyfinder.cxx +++ /dev/null @@ -1,1197 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. - -// This 3-body method is not recommended due to high cost of computing resources -// author: yuanzhe.wang@cern.ch - -#include -#include -#include -#include - -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoAHelpers.h" -#include "DCAFitter/DCAFitterN.h" -#include "ReconstructionDataFormats/Track.h" -#include "Common/Core/RecoDecay.h" -#include "Common/Core/trackUtilities.h" -#include "PWGLF/DataModel/LFStrangenessTables.h" -#include "PWGLF/DataModel/Vtx3BodyTables.h" -#include "Common/Core/TrackSelection.h" -#include "Common/DataModel/TrackSelectionTables.h" -#include "Common/DataModel/EventSelection.h" -#include "Common/DataModel/Centrality.h" -#include "Common/DataModel/PIDResponse.h" -#include "EventFiltering/filterTables.h" - -#include "DetectorsBase/Propagator.h" -#include "DetectorsBase/GeometryManager.h" -#include "DataFormatsParameters/GRPObject.h" -#include "DataFormatsParameters/GRPMagField.h" -#include "CCDB/BasicCCDBManager.h" - -using namespace o2; -using namespace o2::framework; -using namespace o2::framework::expressions; -using std::array; - -using FullTracksExtIU = soa::Join; -using MCLabeledTracksIU = soa::Join; - -template -bool is3bodyDecayedH3L(TMCParticle const& particle) -{ - if (particle.pdgCode() != 1010010030 && particle.pdgCode() != -1010010030) { - return false; - } - bool haveProton = false, havePionPlus = false, haveDeuteron = false; - bool haveAntiProton = false, havePionMinus = false, haveAntiDeuteron = false; - for (auto& mcparticleDaughter : particle.template daughters_as()) { - if (mcparticleDaughter.pdgCode() == 2212) - haveProton = true; - if (mcparticleDaughter.pdgCode() == -2212) - haveAntiProton = true; - if (mcparticleDaughter.pdgCode() == 211) - havePionPlus = true; - if (mcparticleDaughter.pdgCode() == -211) - havePionMinus = true; - if (mcparticleDaughter.pdgCode() == 1000010020) - haveDeuteron = true; - if (mcparticleDaughter.pdgCode() == -1000010020) - haveAntiDeuteron = true; - } - if (haveProton && havePionMinus && haveDeuteron && particle.pdgCode() == 1010010030) { - return true; - } else if (haveAntiProton && havePionPlus && haveAntiDeuteron && particle.pdgCode() == -1010010030) { - return true; - } - return false; -} - -namespace o2::aod -{ -namespace v0goodpostrack -{ -DECLARE_SOA_INDEX_COLUMN_FULL(GoodTrack, goodTrack, int, Tracks, "_GoodTrack"); -DECLARE_SOA_INDEX_COLUMN(Collision, collision); -} // namespace v0goodpostrack -DECLARE_SOA_TABLE(V0GoodPosTracks, "AOD", "V0GOODPOSTRACKS", o2::soa::Index<>, v0goodpostrack::GoodTrackId, v0goodpostrack::CollisionId); -namespace v0goodnegtrack -{ -DECLARE_SOA_INDEX_COLUMN_FULL(GoodTrack, goodTrack, int, Tracks, "_GoodTrack"); -DECLARE_SOA_INDEX_COLUMN(Collision, collision); -} // namespace v0goodnegtrack -DECLARE_SOA_TABLE(V0GoodNegTracks, "AOD", "V0GOODNEGTRACKS", o2::soa::Index<>, v0goodnegtrack::GoodTrackId, v0goodnegtrack::CollisionId); -namespace v0goodtrack -{ -DECLARE_SOA_INDEX_COLUMN_FULL(GoodTrack, goodTrack, int, Tracks, "_GoodTrack"); -DECLARE_SOA_INDEX_COLUMN(Collision, collision); -} // namespace v0goodtrack -DECLARE_SOA_TABLE(V0GoodTracks, "AOD", "V0GOODTRACKS", o2::soa::Index<>, v0goodtrack::GoodTrackId, v0goodtrack::CollisionId); -} // namespace o2::aod - -struct trackprefilter { - HistogramRegistry registry{ - "registry", - { - {"hCrossedRows", "hCrossedRows", {HistType::kTH1F, {{50, 0.0f, 200.0f}}}}, - {"hGoodTrackCount", "hGoodTrackCount", {HistType::kTH1F, {{4, 0.0f, 4.0f}}}}, - {"hGoodPosTrackCount", "hGoodPosTrackCount", {HistType::kTH1F, {{1, 0.0f, 1.0f}}}}, - {"hGoodNegTrackCount", "hGoodNegTrackCount", {HistType::kTH1F, {{1, 0.0f, 1.0f}}}}, - {"h3bodyCounter", "h3bodyCounter", {HistType::kTH1F, {{6, 0.0f, 6.0f}}}}, - }, - }; - - // change the dca cut for helium3 - Configurable mintpcNCls{"mintpcNCls", 70, "min tpc Nclusters"}; - Configurable tpcrefit{"tpcrefit", 0, "demand TPC refit"}; - - Produces v0GoodPosTracks; - Produces v0GoodNegTracks; - Produces v0GoodTracks; - - // Fix: Add PID and pt cuts to tracks - void processDefault(aod::Collision const& /*collision*/, - FullTracksExtIU const& tracks) - { - for (auto& t0 : tracks) { - registry.fill(HIST("hGoodTrackCount"), 0.5); - registry.fill(HIST("hCrossedRows"), t0.tpcNClsCrossedRows()); - if (tpcrefit) { - if (!(t0.trackType() & o2::aod::track::TPCrefit)) { - continue; // TPC refit - } - } - registry.fill(HIST("hGoodTrackCount"), 1.5); - if (t0.tpcNClsFound() < mintpcNCls) { - continue; - } - registry.fill(HIST("hGoodTrackCount"), 2.5); - if (t0.signed1Pt() > 0.0f) { - v0GoodPosTracks(t0.globalIndex(), t0.collisionId()); - registry.fill(HIST("hGoodPosTrackCount"), 0.5); - registry.fill(HIST("hGoodTrackCount"), 3.5); - } - if (t0.signed1Pt() < 0.0f) { - v0GoodNegTracks(t0.globalIndex(), t0.collisionId()); - registry.fill(HIST("hGoodNegTrackCount"), 0.5); - registry.fill(HIST("hGoodTrackCount"), 3.5); - } - v0GoodTracks(t0.globalIndex(), t0.collisionId()); - } - } - PROCESS_SWITCH(trackprefilter, processDefault, "Default process function", true); - - // process function for MC d3body check - // void processCheck(aod::Collision const& collision, aod::Decay3Bodys const& decay3bodys, - void processCheck(aod::Decay3Bodys const& decay3bodys, - MCLabeledTracksIU const& /*tracks*/, aod::McParticles const& /*particlesMC*/) - { - for (auto& d3body : decay3bodys) { - registry.fill(HIST("h3bodyCounter"), 0.5); - auto lTrack0 = d3body.track0_as(); - auto lTrack1 = d3body.track1_as(); - auto lTrack2 = d3body.track2_as(); - if (!lTrack0.has_mcParticle() || !lTrack1.has_mcParticle() || !lTrack2.has_mcParticle()) { - continue; - } - registry.fill(HIST("h3bodyCounter"), 1.5); - auto lMCTrack0 = lTrack0.mcParticle_as(); - auto lMCTrack1 = lTrack1.mcParticle_as(); - auto lMCTrack2 = lTrack2.mcParticle_as(); - if (!lMCTrack0.has_mothers() || !lMCTrack1.has_mothers() || !lMCTrack2.has_mothers()) { - continue; - } - registry.fill(HIST("h3bodyCounter"), 2.5); - - int lPDG = -1; - bool is3bodyDecay = false; - for (auto& lMother0 : lMCTrack0.mothers_as()) { - for (auto& lMother1 : lMCTrack1.mothers_as()) { - for (auto& lMother2 : lMCTrack2.mothers_as()) { - if (lMother0.globalIndex() == lMother1.globalIndex() && lMother0.globalIndex() == lMother2.globalIndex()) { - lPDG = lMother1.pdgCode(); - if (lPDG == 1010010030 && lMCTrack0.pdgCode() == 2212 && lMCTrack1.pdgCode() == -211 && lMCTrack2.pdgCode() == 1000010020) { - is3bodyDecay = true; // vtxs with the same mother - } - if (lPDG == -1010010030 && lMCTrack0.pdgCode() == 211 && lMCTrack1.pdgCode() == -2212 && lMCTrack2.pdgCode() == -1000010020) { - is3bodyDecay = true; // vtxs with the same mother - } - } - } - } - } // end association check - - if (!is3bodyDecay || std::abs(lPDG) != 1010010030) { - continue; - } - registry.fill(HIST("h3bodyCounter"), 3.5); - if (lTrack0.collisionId() != lTrack1.collisionId() || lTrack0.collisionId() != lTrack2.collisionId()) { - continue; - } - registry.fill(HIST("h3bodyCounter"), 4.5); - - if (lTrack0.collisionId() != d3body.collisionId()) { - continue; - } - registry.fill(HIST("h3bodyCounter"), 5.5); - - // LOG(info) << "; Track0ID: " << lTrack0.globalIndex() << "; Track1ID:" << lTrack1.globalIndex() << "; Track2ID:" << lTrack2.globalIndex(); - v0GoodPosTracks(lTrack0.globalIndex(), lTrack0.collisionId()); - v0GoodNegTracks(lTrack1.globalIndex(), lTrack1.collisionId()); - v0GoodTracks(lTrack2.globalIndex(), lTrack2.collisionId()); - } - } - PROCESS_SWITCH(trackprefilter, processCheck, "Check specific paired tracks", false); -}; - -struct hypertriton3bodyFinder { - - Produces vtx3bodydata; - Service ccdb; - - // Configurables - Configurable UseCFFilter{"UseCFFilter", true, "Reject event without CF LD trigger"}; - Configurable RejectBkgInMC{"RejectBkgInMC", false, "Reject fake 3-body pairs in MC check"}; - - Configurable d_UseAbsDCA{"d_UseAbsDCA", true, "Use Abs DCAs"}; - Configurable d_bz_input{"d_bz", -999, "bz field, -999 is automatic"}; - - // Selection criteria - Configurable minRToMeanVertex = {"minRToMeanVertex", 0.5, ""}; ///< min radial distance of V0 from beam line (mean vertex) - // Configurable causalityRTolerance = {"causalityRTolerance", 1., ""}; ///< V0 radius cannot exceed its contributors minR by more than this value - Configurable maxV0ToProngsRDiff = {"maxV0ToProngsRDiff", 50., ""}; ///< V0 radius cannot be lower than this ammount wrt minR of contributors - Configurable minPtV0 = {"minPtV0", 0.5, ""}; ///< v0 minimum pT - Configurable maxTglV0 = {"maxTglV0", 2., ""}; ///< maximum tgLambda of V0 - Configurable maxDCAXY2ToMeanVertex3bodyV0 = {"maxDCAXY2ToMeanVertex3bodyV0", 2 * 2, ""}; - Configurable minCosPAXYMeanVertex3bodyV0 = {"minCosPAXYMeanVertex3bodyV0", 0.9, ""}; ///< min cos of PA to beam line (mean vertex) in tr. plane for 3body V0 cand. - Configurable minCosPA3bodyV0 = {"minCosPA3bodyV0", 0.8, ""}; // min cos of PA to PV for 3body V0 - - // for 3 body reconstructed Vertex - Configurable minbachPt = {"minbachPt", 0.6, ""}; ///< Minimum bachelor Pt - Configurable maxRDiff3bodyV0 = {"maxRDiff3bodyV0", 3, ""}; ///< Maximum difference between V0 and 3body radii - Configurable minPt3Body = {"minPt3Body", 0.01, ""}; // minimum pT of 3body Vertex - Configurable maxTgl3Body = {"maxTgl3Body", 2, ""}; // maximum tgLambda of 3body Vertex - Configurable minCosPA3body = {"minCosPA3body", 0.8, ""}; // min cos of PA to PV for 3body Vertex - - // for DCA - Configurable dcavtxdau{"dcavtxdau", 2.0, "DCA Vtx Daughters"}; - Configurable d_UseH3LDCACut{"d_UseH3LDCACut", true, "Use Cuts for H3L DCA to PV"}; - Configurable maxDCAXY3Body{"maxDCAXY3Body", 0.5, "DCAXY H3L to PV"}; // max DCA of 3 body decay to PV in XY - Configurable maxDCAZ3Body{"maxDCAZ3Body", 1.0, "DCAZ H3L to PV"}; // max DCA of 3 body decay to PV in Z - - Configurable useMatCorrType{"useMatCorrType", 2, "0: none, 1: TGeo, 2: LUT"}; - // CCDB options - Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; - Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; - Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; - Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; - Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; - - Preslice perCollisionGoodPosTracks = o2::aod::v0goodpostrack::collisionId; - Preslice perCollisionGoodNegTracks = o2::aod::v0goodnegtrack::collisionId; - Preslice perCollisionGoodTracks = o2::aod::v0goodtrack::collisionId; - Preslice perCollisionV0s = o2::aod::v0::collisionId; - Preslice perCollisionV0Datas = o2::aod::v0data::collisionId; - - // Helper struct to pass V0 information - HistogramRegistry registry{ - "registry", - { - {"hEventCounter", "hEventCounter", {HistType::kTH1F, {{2, 0.0f, 2.0f}}}}, - {"hDauTrackCounter", "hDauTrackCounter", {HistType::kTH1F, {{3, 0.0f, 3.0f}}}}, - {"hV0Counter", "hV0Counter", {HistType::kTH1F, {{8, -0.5f, 7.5f}}}}, - {"hTrueV0Counter", "hTrueV0Counter", {HistType::kTH1F, {{8, -0.5f, 7.5f}}}}, - {"hVtx3BodyCounter", "hVtx3BodyCounter", {HistType::kTH1F, {{9, -0.5f, 8.5f}}}}, - {"hTrueVtx3BodyCounter", "hTrueVtx3BodyCounter", {HistType::kTH1F, {{9, -0.5f, 8.5f}}}}, - {"hVirtLambaCounter", "hVirtualLambaCounter", {HistType::kTH1F, {{6, -0.5f, 5.5f}}}}, - {"hCFFilteredVirtLambaCounter", "hCFFilteredVirtLambaCounter", {HistType::kTH1F, {{6, -0.5f, 5.5f}}}}, - }, - }; - - //------------------------------------------------------------------ - // Fill stats histograms - enum v0step { kV0All = 0, - kV0hasSV, - kV0Radius, - kV0Pt, - kV0TgLamda, - kV0InvMass, - kV0DcaXY, - kV0CosPA, - kNV0Steps }; - enum vtxstep { kVtxAll = 0, - kVtxbachPt, - kVtxhasSV, - kVtxRadius, - kVtxPt, - kVtxTgLamda, - kVtxCosPA, - kVtxDcaDau, - kVtxDcaH3L, - kNVtxSteps }; - - // Helper struct to do bookkeeping of building parameters - struct { - std::array v0stats; - std::array truev0stats; - std::array vtxstats; - std::array truevtxstats; - std::array virtLambdastats; - } statisticsRegistry; - - void resetHistos() - { - for (Int_t ii = 0; ii < kNV0Steps; ii++) { - statisticsRegistry.v0stats[ii] = 0; - statisticsRegistry.truev0stats[ii] = 0; - } - for (Int_t ii = 0; ii < kNVtxSteps; ii++) { - statisticsRegistry.vtxstats[ii] = 0; - statisticsRegistry.truevtxstats[ii] = 0; - } - for (Int_t ii = 0; ii < 12; ii++) { - statisticsRegistry.virtLambdastats[ii] = 0; - } - } - - void fillHistos() - { - for (Int_t ii = 0; ii < kNV0Steps; ii++) { - registry.fill(HIST("hV0Counter"), ii, statisticsRegistry.v0stats[ii]); - registry.fill(HIST("hTrueV0Counter"), ii, statisticsRegistry.truev0stats[ii]); - } - for (Int_t ii = 0; ii < kNVtxSteps; ii++) { - registry.fill(HIST("hVtx3BodyCounter"), ii, statisticsRegistry.vtxstats[ii]); - registry.fill(HIST("hTrueVtx3BodyCounter"), ii, statisticsRegistry.truevtxstats[ii]); - } - for (Int_t ii = 0; ii < 3; ii++) { - registry.fill(HIST("hVirtLambaCounter"), ii, statisticsRegistry.virtLambdastats[ii]); - registry.fill(HIST("hVirtLambaCounter"), ii + 3, statisticsRegistry.virtLambdastats[ii + 3]); - registry.fill(HIST("hCFFilteredVirtLambaCounter"), ii, statisticsRegistry.virtLambdastats[ii + 6]); - registry.fill(HIST("hCFFilteredVirtLambaCounter"), ii + 3, statisticsRegistry.virtLambdastats[ii + 9]); - } - } - - // v0, vtx, and virtual Lambda statiscs - void FillV0Counter(int kn, bool istrue = false) - { - statisticsRegistry.v0stats[kn]++; - if (istrue) { - statisticsRegistry.truev0stats[kn]++; - } - } - void FillVtxCounter(int kn, bool istrue = false) - { - statisticsRegistry.vtxstats[kn]++; - if (istrue) { - statisticsRegistry.truevtxstats[kn]++; - } - } - //------------------------------------------------------------------ - - int mRunNumber; - float d_bz; - float maxSnp; // max sine phi for propagation - float maxStep; // max step size (cm) for propagation - o2::base::MatLayerCylSet* lut = nullptr; - o2::vertexing::DCAFitterN<2> fitter; - o2::vertexing::DCAFitterN<3> fitter3body; - - void init(InitContext&) - { - resetHistos(); - mRunNumber = 0; - d_bz = 0; - maxSnp = 0.85f; // could be changed later - maxStep = 2.00f; // could be changed later - - TString DauCounterbinLabel[3] = {"Proton", "Pion", "Deuteron"}; - TString V0CounterbinLabel[8] = {"Total", "hasSV", "V0R", "V0Pt", "TgLambda", "V0Mass", "DcaXY", "CosPA"}; - TString VtxCounterbinLabel[9] = {"Total", "bachPt", "hasSV", "VtxR", "VtxPt", "TgLambda", "CosPA", "DcaDau", "DcaH3L"}; - for (int i{0}; i < 3; i++) { - registry.get(HIST("hDauTrackCounter"))->GetXaxis()->SetBinLabel(i + 1, DauCounterbinLabel[i]); - } - for (int i{0}; i < kNV0Steps; i++) { - registry.get(HIST("hV0Counter"))->GetXaxis()->SetBinLabel(i + 1, V0CounterbinLabel[i]); - registry.get(HIST("hTrueV0Counter"))->GetXaxis()->SetBinLabel(i + 1, V0CounterbinLabel[i]); - } - for (int i{0}; i < kNVtxSteps; i++) { - registry.get(HIST("hVtx3BodyCounter"))->GetXaxis()->SetBinLabel(i + 1, VtxCounterbinLabel[i]); - registry.get(HIST("hTrueVtx3BodyCounter"))->GetXaxis()->SetBinLabel(i + 1, VtxCounterbinLabel[i]); - } - - ccdb->setURL(ccdburl); - ccdb->setCaching(true); - ccdb->setLocalObjectValidityChecking(); - ccdb->setFatalWhenNull(false); - - // Set 2-body fitter and 3-body fitter3body - fitter.setPropagateToPCA(true); - fitter.setMaxR(200.); //->maxRIni3body - fitter.setMinParamChange(1e-3); - fitter.setMinRelChi2Change(0.9); - fitter.setMaxDZIni(1e9); - fitter.setMaxChi2(1e9); - fitter.setUseAbsDCA(d_UseAbsDCA); - fitter3body.setPropagateToPCA(true); - fitter3body.setMaxR(200.); //->maxRIni3body - fitter3body.setMinParamChange(1e-3); - fitter3body.setMinRelChi2Change(0.9); - fitter3body.setMaxDZIni(1e9); - fitter3body.setMaxChi2(1e9); - fitter3body.setUseAbsDCA(d_UseAbsDCA); - - // Material correction in the DCA fitter - o2::base::Propagator::MatCorrType matCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; - if (useMatCorrType == 1) { - LOGF(info, "TGeo correction requested, loading geometry"); - if (!o2::base::GeometryManager::isGeometryLoaded()) { - ccdb->get(geoPath); - } - matCorr = o2::base::Propagator::MatCorrType::USEMatCorrTGeo; - } - if (useMatCorrType == 2) { - LOGF(info, "LUT correction requested, loading LUT"); - lut = o2::base::MatLayerCylSet::rectifyPtrFromFile(ccdb->get(lutPath)); - matCorr = o2::base::Propagator::MatCorrType::USEMatCorrLUT; - } - fitter.setMatCorrType(matCorr); - fitter3body.setMatCorrType(matCorr); - } - - void initCCDB(aod::BCsWithTimestamps::iterator const& bc) - { - if (mRunNumber == bc.runNumber()) { - return; - } - - // In case override, don't proceed, please - no CCDB access required - if (d_bz_input > -990) { - d_bz = d_bz_input; - fitter.setBz(d_bz); - fitter3body.setBz(d_bz); - o2::parameters::GRPMagField grpmag; - if (fabs(d_bz) > 1e-5) { - grpmag.setL3Current(30000.f / (d_bz / 5.0f)); - } - o2::base::Propagator::initFieldFromGRP(&grpmag); - mRunNumber = bc.runNumber(); - return; - } - - auto run3grp_timestamp = bc.timestamp(); - o2::parameters::GRPObject* grpo = ccdb->getForTimeStamp(grpPath, run3grp_timestamp); - o2::parameters::GRPMagField* grpmag = 0x0; - if (grpo) { - o2::base::Propagator::initFieldFromGRP(grpo); - // Fetch magnetic field from ccdb for current collision - d_bz = grpo->getNominalL3Field(); - LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; - } else { - grpmag = ccdb->getForTimeStamp(grpmagPath, run3grp_timestamp); - if (!grpmag) { - LOG(fatal) << "Got nullptr from CCDB for path " << grpmagPath << " of object GRPMagField and " << grpPath << " of object GRPObject for timestamp " << run3grp_timestamp; - } - o2::base::Propagator::initFieldFromGRP(grpmag); - // Fetch magnetic field from ccdb for current collision - d_bz = std::lround(5.f * grpmag->getL3Current() / 30000.f); - LOG(info) << "Retrieved GRP for timestamp " << run3grp_timestamp << " with magnetic field of " << d_bz << " kZG"; - } - mRunNumber = bc.runNumber(); - // Set magnetic field value once known - fitter.setBz(d_bz); - fitter3body.setBz(d_bz); - - if (useMatCorrType == 2) { - // setMatLUT only after magfield has been initalized - // (setMatLUT has implicit and problematic init field call if not) - o2::base::Propagator::Instance()->setMatLUT(lut); - } - } - - //------------------------------------------------------------------ - // Check the info of good tracks - template - void CheckGoodTracks(TGoodTrackTable const& dGoodtracks, aod::McParticles const& /*particlesMC*/) - { - for (auto& goodtrackid : dGoodtracks) { - auto goodtrack = goodtrackid.template goodTrack_as(); - if (!goodtrack.has_mcParticle()) { - continue; - } - auto mcgoodtrack = goodtrack.template mcParticle_as(); - if (!mcgoodtrack.has_mothers()) { - continue; - } - bool flag_H3L = false; - for (auto& mothertrack : mcgoodtrack.template mothers_as()) { - if (is3bodyDecayedH3L(mothertrack)) { - flag_H3L = true; - } - } - if (flag_H3L && std::abs(mcgoodtrack.pdgCode()) == 2212) { - registry.fill(HIST("hDauTrackCounter"), 0.5); - } - if (flag_H3L && std::abs(mcgoodtrack.pdgCode()) == 211) { - registry.fill(HIST("hDauTrackCounter"), 1.5); - } - if (flag_H3L && std::abs(mcgoodtrack.pdgCode()) == 1000010020) { - registry.fill(HIST("hDauTrackCounter"), 2.5); - } - } - } - - o2::dataformats::VertexBase mMeanVertex{{0., 0., 0.}, {0.1 * 0.1, 0., 0.1 * 0.1, 0., 0., 6. * 6.}}; - //------------------------------------------------------------------ - // Virtual Lambda V0 finder - template - bool DecayV0Finder(TCollisionTable const& dCollision, TTrackTable const& dPtrack, TTrackTable const& dNtrack, float& rv0, bool isTrue3bodyV0 = false) - { - if (dPtrack.collisionId() != dNtrack.collisionId()) { - return false; - } - FillV0Counter(kV0All, isTrue3bodyV0); - if (!isTrue3bodyV0 && RejectBkgInMC) { - return false; - } - - auto Track0 = getTrackParCov(dPtrack); - auto Track1 = getTrackParCov(dNtrack); - int nCand = fitter.process(Track0, Track1); - if (nCand == 0) { - return false; - } - FillV0Counter(kV0hasSV, isTrue3bodyV0); - - // validate V0 radial position - // First check closeness to the beam-line as same as SVertexer - const auto& v0XYZ = fitter.getPCACandidate(); - float dxv0 = v0XYZ[0] - mMeanVertex.getX(), dyv0 = v0XYZ[1] - mMeanVertex.getY(), r2v0 = dxv0 * dxv0 + dyv0 * dyv0; - // float rv0 = std::sqrt(r2v0); - rv0 = std::sqrt(r2v0); - if (rv0 < minRToMeanVertex) { - return false; - } - FillV0Counter(kV0Radius, isTrue3bodyV0); - - // Not involved: Get minR with same way in SVertexer - // float drv0P = rv0 - Track0minR, drv0N = rv0 - Track1minR; - - // check: if the process function finish the propagation - if (!fitter.isPropagateTracksToVertexDone() && !fitter.propagateTracksToVertex()) { - return false; - } - - auto& trPProp = fitter.getTrack(0); - auto& trNProp = fitter.getTrack(1); - std::array pP, pN; - trPProp.getPxPyPzGlo(pP); - trNProp.getPxPyPzGlo(pN); - // estimate DCA of neutral V0 track to beamline: straight line with parametric equation - // x = X0 + pV0[0]*t, y = Y0 + pV0[1]*t reaches DCA to beamline (Xv, Yv) at - // t = -[ (x0-Xv)*pV0[0] + (y0-Yv)*pV0[1]) ] / ( pT(pV0)^2 ) - // Similar equation for 3D distance involving pV0[2] - std::array pV0 = {pP[0] + pN[0], pP[1] + pN[1], pP[2] + pN[2]}; - float pt2V0 = pV0[0] * pV0[0] + pV0[1] * pV0[1], prodXYv0 = dxv0 * pV0[0] + dyv0 * pV0[1], tDCAXY = prodXYv0 / pt2V0; - float p2V0 = pt2V0 + pV0[2] * pV0[2], ptV0 = std::sqrt(pt2V0); - if (ptV0 < minPtV0) { // pt cut - return false; - } - FillV0Counter(kV0Pt, isTrue3bodyV0); - - if (pV0[2] / ptV0 > maxTglV0) { // tgLambda cut - return false; - } - FillV0Counter(kV0TgLamda, isTrue3bodyV0); - - // apply mass selections - float massV0LambdaHyp = RecoDecay::m(array{array{pP[0], pP[1], pP[2]}, array{pN[0], pN[1], pN[2]}}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged}); - float massV0AntiLambdaHyp = RecoDecay::m(array{array{pP[0], pP[1], pP[2]}, array{pN[0], pN[1], pN[2]}}, array{o2::constants::physics::MassPionCharged, o2::constants::physics::MassProton}); - float massMargin = 20 * (0.001 * (1. + 0.5 * ptV0)) + 0.07; - if (massV0LambdaHyp - o2::constants::physics::MassLambda > massMargin && massV0AntiLambdaHyp - o2::constants::physics::MassLambda > massMargin) { - return false; - } - FillV0Counter(kV0InvMass, isTrue3bodyV0); - - float dcaX = dxv0 - pV0[0] * tDCAXY, dcaY = dyv0 - pV0[1] * tDCAXY, dca2 = dcaX * dcaX + dcaY * dcaY; - float cosPAXY = prodXYv0 / std::sqrt(r2v0 * pt2V0); - if (dca2 > maxDCAXY2ToMeanVertex3bodyV0) { - return false; - } - FillV0Counter(kV0DcaXY, isTrue3bodyV0); - - if (cosPAXY < minCosPAXYMeanVertex3bodyV0) { - return false; - } - float dx = v0XYZ[0] - dCollision.posX(), dy = v0XYZ[1] - dCollision.posY(), dz = v0XYZ[2] - dCollision.posZ(), prodXYZv0 = dx * pV0[0] + dy * pV0[1] + dz * pV0[2]; - float cosPA = prodXYZv0 / std::sqrt((dx * dx + dy * dy + dz * dz) * p2V0); - if (cosPA < minCosPA3bodyV0) { - return false; - } - FillV0Counter(kV0CosPA, isTrue3bodyV0); - return true; - } - //------------------------------------------------------------------ - // 3body decay vertex finder - template - void Decay3bodyFinder(TCollisionTable const& dCollision, TTrackTable const& dPtrack, TTrackTable const& dNtrack, TTrackTable const& dBachtrack, float const& rv0, bool isTrue3bodyVtx = false) - { - if (dPtrack.collisionId() != dBachtrack.collisionId()) { - return; - } - if (dPtrack.globalIndex() == dBachtrack.globalIndex()) { - return; // skip the track used by V0 - } - FillVtxCounter(kVtxAll, isTrue3bodyVtx); - if (!isTrue3bodyVtx && RejectBkgInMC) { - return; - } - - auto track0 = getTrackParCov(dPtrack); - auto track1 = getTrackParCov(dNtrack); - auto bach = getTrackParCov(dBachtrack); - - if (bach.getPt() < minbachPt) { - return; - } - FillVtxCounter(kVtxbachPt, isTrue3bodyVtx); - - int n3bodyVtx = fitter3body.process(track0, track1, bach); - if (n3bodyVtx == 0) { // discard this pair - return; - } - FillVtxCounter(kVtxhasSV, isTrue3bodyVtx); - - const auto& vertexXYZ = fitter3body.getPCACandidatePos(); - // make sure the cascade radius is smaller than that of the vertex - float dxc = vertexXYZ[0] - dCollision.posX(), dyc = vertexXYZ[1] - dCollision.posY(), dzc = vertexXYZ[2] - dCollision.posZ(), r2vertex = dxc * dxc + dyc * dyc; - float rvertex = std::sqrt(r2vertex); - if (std::abs(rv0 - rvertex) > maxRDiff3bodyV0 || rvertex < minRToMeanVertex) { - return; - } - FillVtxCounter(kVtxRadius, isTrue3bodyVtx); - - // Not involved: bach.minR - rveretx check - - // check: if the process function finish the propagation - if (!fitter3body.isPropagateTracksToVertexDone() && !fitter3body.propagateTracksToVertex()) { - return; - } - - auto& tr0 = fitter3body.getTrack(0); - auto& tr1 = fitter3body.getTrack(1); - auto& tr2 = fitter3body.getTrack(2); - std::array p0, p1, p2; - tr0.getPxPyPzGlo(p0); - tr1.getPxPyPzGlo(p1); - tr2.getPxPyPzGlo(p2); - std::array p3B = {p0[0] + p1[0] + p2[0], p0[1] + p1[1] + p2[1], p0[2] + p1[2] + p2[2]}; - - float pt2 = p3B[0] * p3B[0] + p3B[1] * p3B[1], p2candidate = pt2 + p3B[2] * p3B[2]; - float pt = std::sqrt(pt2); - if (pt < minPt3Body) { // pt cut - return; - } - FillVtxCounter(kVtxPt, isTrue3bodyVtx); - - if (p3B[2] / pt > maxTgl3Body) { // tgLambda cut - return; - } - FillVtxCounter(kVtxTgLamda, isTrue3bodyVtx); - - float cosPA = (p3B[0] * dxc + p3B[1] * dyc + p3B[2] * dzc) / std::sqrt(p2candidate * (r2vertex + dzc * dzc)); - if (cosPA < minCosPA3body) { - return; - } - FillVtxCounter(kVtxCosPA, isTrue3bodyVtx); - - if (fitter3body.getChi2AtPCACandidate() > dcavtxdau) { - return; - } - FillVtxCounter(kVtxDcaDau, isTrue3bodyVtx); - - // Calculate DCA with respect to the collision associated to the V0, not individual tracks - std::array dcaInfo; - - auto Track0Par = getTrackPar(dPtrack); - o2::base::Propagator::Instance()->propagateToDCABxByBz({dCollision.posX(), dCollision.posY(), dCollision.posZ()}, Track0Par, 2.f, fitter3body.getMatCorrType(), &dcaInfo); - auto Track0dcaXY = dcaInfo[0]; - auto Track0dca = std::sqrt(Track0dcaXY * Track0dcaXY + dcaInfo[1] * dcaInfo[1]); - - auto Track1Par = getTrackPar(dNtrack); - o2::base::Propagator::Instance()->propagateToDCABxByBz({dCollision.posX(), dCollision.posY(), dCollision.posZ()}, Track1Par, 2.f, fitter3body.getMatCorrType(), &dcaInfo); - auto Track1dcaXY = dcaInfo[0]; - auto Track1dca = std::sqrt(Track1dcaXY * Track1dcaXY + dcaInfo[1] * dcaInfo[1]); - - auto Track2Par = getTrackPar(dBachtrack); - o2::base::Propagator::Instance()->propagateToDCABxByBz({dCollision.posX(), dCollision.posY(), dCollision.posZ()}, Track2Par, 2.f, fitter3body.getMatCorrType(), &dcaInfo); - auto Track2dcaXY = dcaInfo[0]; - auto Track2dca = std::sqrt(Track2dcaXY * Track2dcaXY + dcaInfo[1] * dcaInfo[1]); - - // H3L DCA Check - // auto track3B = o2::track::TrackParCov(vertexXYZ, p3B, fitter3body.calcPCACovMatrixFlat(), t2.sign()); - auto track3B = o2::track::TrackParCov(vertexXYZ, p3B, dBachtrack.sign()); - o2::dataformats::DCA dca; - if (d_UseH3LDCACut && (!track3B.propagateToDCA({{dCollision.posX(), dCollision.posY(), dCollision.posZ()}, {dCollision.covXX(), dCollision.covXY(), dCollision.covYY(), dCollision.covXZ(), dCollision.covYZ(), dCollision.covZZ()}}, fitter3body.getBz(), &dca, 5.) || - std::abs(dca.getY()) > maxDCAXY3Body || std::abs(dca.getZ()) > maxDCAZ3Body)) { - return; - } - FillVtxCounter(kVtxDcaH3L, isTrue3bodyVtx); - - vtx3bodydata( - dPtrack.globalIndex(), dNtrack.globalIndex(), dBachtrack.globalIndex(), dCollision.globalIndex(), 0, - vertexXYZ[0], vertexXYZ[1], vertexXYZ[2], - p0[0], p0[1], p0[2], p1[0], p1[1], p1[2], p2[0], p2[1], p2[2], - fitter3body.getChi2AtPCACandidate(), - Track0dcaXY, Track1dcaXY, Track2dcaXY, - Track0dca, Track1dca, Track2dca, - 0); // To be fixed - } - //------------------------------------------------------------------ - // 3body decay finder for a collsion - template - void DecayFinder(TCollisionTable const& dCollision, TPosTrackTable const& dPtracks, TNegTrackTable const& dNtracks, TGoodTrackTable const& dGoodtracks) - { - for (auto& t0id : dPtracks) { // FIXME: turn into combination(...) - auto t0 = t0id.template goodTrack_as(); - - for (auto& t1id : dNtracks) { - auto t1 = t1id.template goodTrack_as(); - float rv0; - if (!DecayV0Finder(dCollision, t0, t1, rv0)) { - continue; - } - - for (auto& t2id : dGoodtracks) { - auto t2 = t2id.template goodTrack_as(); - Decay3bodyFinder(dCollision, t0, t1, t2, rv0); - } - } - } - fillHistos(); - resetHistos(); - } - //------------------------------------------------------------------ - // MC 3body decay vertex finder - template - void DecayFinderMC(TCollisionTable const& dCollision, TPosTrackTable const& dPtracks, TNegTrackTable const& dNtracks, TGoodTrackTable const& dGoodtracks) - { - for (auto& t0id : dPtracks) { // FIXME: turn into combination(...) - auto t0 = t0id.template goodTrack_as(); - for (auto& t1id : dNtracks) { - auto t1 = t1id.template goodTrack_as(); - if (t0.collisionId() != t1.collisionId()) { - continue; - } - - bool isTrue3bodyV0 = false; - if (t0.has_mcParticle() && t1.has_mcParticle()) { - auto t0mc = t0.template mcParticle_as(); - auto t1mc = t1.template mcParticle_as(); - if ((t0mc.pdgCode() == 2212 && t1mc.pdgCode() == -211) || (t0mc.pdgCode() == 211 && t1mc.pdgCode() == -2212)) { - if (t0mc.has_mothers() && t1mc.has_mothers()) { - for (auto& t0mother : t0mc.template mothers_as()) { - for (auto& t1mother : t1mc.template mothers_as()) { - if (t0mother.globalIndex() == t1mother.globalIndex() && std::abs(t0mother.pdgCode()) == 1010010030) { - isTrue3bodyV0 = true; - } - } - } - } - } - } - - float rv0; - if (!DecayV0Finder(dCollision, t0, t1, rv0, isTrue3bodyV0)) { - continue; - } - - for (auto& t2id : dGoodtracks) { - auto t2 = t2id.template goodTrack_as(); - - bool isTrue3bodyVtx = false; - if (t0.has_mcParticle() && t1.has_mcParticle() && t2.has_mcParticle()) { - auto t0mc = t0.template mcParticle_as(); - auto t1mc = t1.template mcParticle_as(); - auto t2mc = t2.template mcParticle_as(); - if ((t0mc.pdgCode() == 2212 && t1mc.pdgCode() == -211 && t2mc.pdgCode() == 1000010020) || (t0mc.pdgCode() == 211 && t1mc.pdgCode() == -2212 && t2mc.pdgCode() == -1000010020)) { - if (t0mc.has_mothers() && t1mc.has_mothers() && t2mc.has_mothers()) { - for (auto& t0mother : t0mc.template mothers_as()) { - for (auto& t1mother : t1mc.template mothers_as()) { - for (auto& t2mother : t2mc.template mothers_as()) { - if (t0mother.globalIndex() == t1mother.globalIndex() && t0mother.globalIndex() == t2mother.globalIndex() && std::abs(t0mother.pdgCode()) == 1010010030) { - isTrue3bodyVtx = true; - } - } - } - } - } - } - } - - Decay3bodyFinder(dCollision, t0, t1, t2, rv0, isTrue3bodyVtx); - } - } - } - fillHistos(); - resetHistos(); - } - //------------------------------------------------------------------ - // MC virtual lambda check - template - void VirtualLambdaCheck(TCollisionTable const& /*dCollision*/, TV0DataTable const& fullV0s, int bin) - { - for (auto& v0 : fullV0s) { - statisticsRegistry.virtLambdastats[bin]++; - auto postrack = v0.template posTrack_as(); - auto negtrack = v0.template negTrack_as(); - if (postrack.has_mcParticle() && negtrack.has_mcParticle()) { - auto postrackmc = postrack.template mcParticle_as(); - auto negtrackmc = negtrack.template mcParticle_as(); - - if ((postrackmc.pdgCode() == 2212 && negtrackmc.pdgCode() == -211) || (postrackmc.pdgCode() == 211 && negtrackmc.pdgCode() == -2212)) { - if (postrackmc.has_mothers() && negtrackmc.has_mothers()) { - for (auto& posmother : postrackmc.template mothers_as()) { - for (auto& negmother : negtrackmc.template mothers_as()) { - if (posmother.globalIndex() == negmother.globalIndex()) { - if (posmother.pdgCode() == 1010010030) - statisticsRegistry.virtLambdastats[bin + 1]++; - else if (posmother.pdgCode() == -1010010030) - statisticsRegistry.virtLambdastats[bin + 2]++; - } - } - } - } - } - } - } - fillHistos(); - resetHistos(); - } - - //------------------------------------------------------------------ - // Process Function - void processData(aod::Collision const& collision, aod::V0GoodPosTracks const& ptracks, aod::V0GoodNegTracks const& ntracks, aod::V0GoodTracks const& goodtracks, FullTracksExtIU const&, aod::BCsWithTimestamps const&) - { - auto bc = collision.bc_as(); - initCCDB(bc); - registry.fill(HIST("hEventCounter"), 0.5); - - DecayFinder(collision, ptracks, ntracks, goodtracks); - } - PROCESS_SWITCH(hypertriton3bodyFinder, processData, "Produce StoredVtx3BodyDatas with data", true); - - void processCFFilteredData(aod::Collisions const& collisions, aod::CFFilters const& cffilters, aod::V0GoodPosTracks const& Ptracks, aod::V0GoodNegTracks const& Ntracks, aod::V0GoodTracks const& Goodtracks, FullTracksExtIU const&, aod::BCsWithTimestamps const&) - { - for (int i{0}; i < collisions.size(); i++) { - auto collision = collisions.iteratorAt(i); - auto cffilter = cffilters.iteratorAt(i); - auto bc = collision.bc_as(); - initCCDB(bc); - registry.fill(HIST("hEventCounter"), 0.5); - - auto ptracks = Ptracks.sliceBy(perCollisionGoodPosTracks, collision.globalIndex()); - auto ntracks = Ntracks.sliceBy(perCollisionGoodNegTracks, collision.globalIndex()); - auto goodtracks = Goodtracks.sliceBy(perCollisionGoodTracks, collision.globalIndex()); - - if (!cffilter.hasLD_LooseKstar() && UseCFFilter) { - continue; - } - registry.fill(HIST("hEventCounter"), 1.5); - - DecayFinder(collision, ptracks, ntracks, goodtracks); - } - } - PROCESS_SWITCH(hypertriton3bodyFinder, processCFFilteredData, "Produce StoredVtx3BodyDatas with data using CFtriggers", false); - - void processMC(aod::Collision const& collision, aod::V0GoodPosTracks const& ptracks, aod::V0GoodNegTracks const& ntracks, aod::V0GoodTracks const& goodtracks, aod::McParticles const& particlesMC, MCLabeledTracksIU const&, aod::BCsWithTimestamps const&) - { - auto bc = collision.bc_as(); - initCCDB(bc); - registry.fill(HIST("hEventCounter"), 0.5); - - CheckGoodTracks(goodtracks, particlesMC); - DecayFinderMC(collision, ptracks, ntracks, goodtracks); - } - PROCESS_SWITCH(hypertriton3bodyFinder, processMC, "Produce StoredVtx3BodyDatas with MC", false); - - void processCFFilteredMC(aod::Collisions const& collisions, aod::CFFilters const& cffilters, aod::V0GoodPosTracks const& Ptracks, aod::V0GoodNegTracks const& Ntracks, aod::V0GoodTracks const& Goodtracks, aod::V0s const& V0s, aod::V0Datas const& fullV0s, aod::McParticles const& particlesMC, MCLabeledTracksIU const&, aod::BCsWithTimestamps const&) - { - for (int i{0}; i < collisions.size(); i++) { - auto collision = collisions.iteratorAt(i); - auto cffilter = cffilters.iteratorAt(i); - auto bc = collision.bc_as(); - initCCDB(bc); - registry.fill(HIST("hEventCounter"), 0.5); - - auto goodtracks = Goodtracks.sliceBy(perCollisionGoodTracks, collision.globalIndex()); - CheckGoodTracks(goodtracks, particlesMC); - auto v0s = V0s.sliceBy(perCollisionV0s, collision.globalIndex()); - auto fullv0s = fullV0s.sliceBy(perCollisionV0Datas, collision.globalIndex()); - VirtualLambdaCheck(collision, v0s, 0); - VirtualLambdaCheck(collision, fullv0s, 3); - - if (!cffilter.hasLD_LooseKstar() && UseCFFilter) { - continue; - } - registry.fill(HIST("hEventCounter"), 1.5); - - auto ptracks = Ptracks.sliceBy(perCollisionGoodPosTracks, collision.globalIndex()); - auto ntracks = Ntracks.sliceBy(perCollisionGoodNegTracks, collision.globalIndex()); - - VirtualLambdaCheck(collision, v0s, 6); - VirtualLambdaCheck(collision, fullv0s, 9); - DecayFinderMC(collision, ptracks, ntracks, goodtracks); - } - } - PROCESS_SWITCH(hypertriton3bodyFinder, processCFFilteredMC, "Produce StoredVtx3BodyDatas with MC using CFtriggers", false); -}; - -struct hypertriton3bodyLabelBuilder { - - Produces vtxlabels; - - // for bookkeeping purposes: how many V0s come from same mother etc - HistogramRegistry registry{ - "registry", - { - {"hLabelCounter", "hLabelCounter", {HistType::kTH1F, {{3, 0.0f, 3.0f}}}}, - {"hHypertritonMCPt", "hHypertritonMCPt", {HistType::kTH1F, {{100, 0.0f, 10.0f}}}}, - {"hAntiHypertritonMCPt", "hAntiHypertritonMCPt", {HistType::kTH1F, {{100, 0.0f, 10.0f}}}}, - {"hHypertritonMCMass", "hHypertritonMCMass", {HistType::kTH1F, {{40, 2.95f, 3.05f, "Inv. Mass (GeV/c^{2})"}}}}, - {"hAntiHypertritonMCMass", "hAntiHypertritonMCMass", {HistType::kTH1F, {{40, 2.95f, 3.05f, "Inv. Mass (GeV/c^{2})"}}}}, - {"hHypertritonMCLifetime", "hHypertritonMCLifetime", {HistType::kTH1F, {{50, 0.0f, 50.0f, "ct(cm)"}}}}, - {"hAntiHypertritonMCLifetime", "hAntiHypertritonMCLifetime", {HistType::kTH1F, {{50, 0.0f, 50.0f, "ct(cm)"}}}}, - }, - }; - - void init(InitContext const&) - { - registry.get(HIST("hLabelCounter"))->GetXaxis()->SetBinLabel(1, "Total"); - registry.get(HIST("hLabelCounter"))->GetXaxis()->SetBinLabel(2, "Same MotherParticle"); - registry.get(HIST("hLabelCounter"))->GetXaxis()->SetBinLabel(3, "True H3L"); - } - - Configurable TpcPidNsigmaCut{"TpcPidNsigmaCut", 5, "TpcPidNsigmaCut"}; - - void processDoNotBuildLabels(aod::Collisions::iterator const&) - { - // dummy process function - should not be required in the future - } - PROCESS_SWITCH(hypertriton3bodyLabelBuilder, processDoNotBuildLabels, "Do not produce MC label tables", true); - - void processBuildLabels(aod::Vtx3BodyDatas const& vtx3bodydatas, MCLabeledTracksIU const&, aod::McParticles const& /*particlesMC*/) - { - std::vector lIndices; - lIndices.reserve(vtx3bodydatas.size()); - for (int ii = 0; ii < vtx3bodydatas.size(); ii++) { - lIndices[ii] = -1; - } - - for (auto& vtx3body : vtx3bodydatas) { - - int lLabel = -1; - int lPDG = -1; - float lPt = -1; - double MClifetime = -1; - bool is3bodyDecay = false; - int lGlobalIndex = -1; - - auto lTrack0 = vtx3body.track0_as(); - auto lTrack1 = vtx3body.track1_as(); - auto lTrack2 = vtx3body.track2_as(); - registry.fill(HIST("hLabelCounter"), 0.5); - - // Association check - // There might be smarter ways of doing this in the future - if (!lTrack0.has_mcParticle() || !lTrack1.has_mcParticle() || !lTrack2.has_mcParticle()) { - vtxlabels(-1); - continue; - } - auto lMCTrack0 = lTrack0.mcParticle_as(); - auto lMCTrack1 = lTrack1.mcParticle_as(); - auto lMCTrack2 = lTrack2.mcParticle_as(); - if (!lMCTrack0.has_mothers() || !lMCTrack1.has_mothers() || !lMCTrack2.has_mothers()) { - vtxlabels(-1); - continue; - } - - for (auto& lMother0 : lMCTrack0.mothers_as()) { - for (auto& lMother1 : lMCTrack1.mothers_as()) { - for (auto& lMother2 : lMCTrack2.mothers_as()) { - if (lMother0.globalIndex() == lMother1.globalIndex() && lMother0.globalIndex() == lMother2.globalIndex()) { - lGlobalIndex = lMother1.globalIndex(); - lPt = lMother1.pt(); - lPDG = lMother1.pdgCode(); - MClifetime = RecoDecay::sqrtSumOfSquares(lMCTrack2.vx() - lMother2.vx(), lMCTrack2.vy() - lMother2.vy(), lMCTrack2.vz() - lMother2.vz()) * o2::constants::physics::MassHyperTriton / lMother2.p(); - is3bodyDecay = true; // vtxs with the same mother - } - } - } - } // end association check - if (!is3bodyDecay) { - vtxlabels(-1); - continue; - } - registry.fill(HIST("hLabelCounter"), 1.5); - - // Intended for cross-checks only - // N.B. no rapidity cut! - if (lPDG == 1010010030 && lMCTrack0.pdgCode() == 2212 && lMCTrack1.pdgCode() == -211 && lMCTrack2.pdgCode() == 1000010020) { - lLabel = lGlobalIndex; - double hypertritonMCMass = RecoDecay::m(array{array{lMCTrack0.px(), lMCTrack0.py(), lMCTrack0.pz()}, array{lMCTrack1.px(), lMCTrack1.py(), lMCTrack1.pz()}, array{lMCTrack2.px(), lMCTrack2.py(), lMCTrack2.pz()}}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged, o2::constants::physics::MassDeuteron}); - registry.fill(HIST("hLabelCounter"), 2.5); - registry.fill(HIST("hHypertritonMCPt"), lPt); - registry.fill(HIST("hHypertritonMCLifetime"), MClifetime); - registry.fill(HIST("hHypertritonMCMass"), hypertritonMCMass); - } - if (lPDG == -1010010030 && lMCTrack0.pdgCode() == 211 && lMCTrack1.pdgCode() == -2212 && lMCTrack2.pdgCode() == -1000010020) { - lLabel = lGlobalIndex; - double antiHypertritonMCMass = RecoDecay::m(array{array{lMCTrack0.px(), lMCTrack0.py(), lMCTrack0.pz()}, array{lMCTrack1.px(), lMCTrack1.py(), lMCTrack1.pz()}, array{lMCTrack2.px(), lMCTrack2.py(), lMCTrack2.pz()}}, array{o2::constants::physics::MassPionCharged, o2::constants::physics::MassProton, o2::constants::physics::MassDeuteron}); - registry.fill(HIST("hLabelCounter"), 2.5); - registry.fill(HIST("hAntiHypertritonMCPt"), lPt); - registry.fill(HIST("hAntiHypertritonMCLifetime"), MClifetime); - registry.fill(HIST("hAntiHypertritonMCMass"), antiHypertritonMCMass); - } - - // Construct label table, only true hypertriton and true daughters with a specified order is labeled - // for matter: track0->p, track1->pi, track2->d - // for antimatter: track0->pi, track1->p, track2->d - vtxlabels(lLabel); - } - } - PROCESS_SWITCH(hypertriton3bodyLabelBuilder, processBuildLabels, "Produce MC label tables", false); -}; - -struct hypertriton3bodyComparewithDecay3body { - - HistogramRegistry registry{ - "registry", - { - {"hMCInfoCounter", "hMCInfoCounter", {HistType::kTH1F, {{8, 0.0f, 8.0f}}}}, - {"hCheckCounter", "hCheckCounter", {HistType::kTH1F, {{5, 0.0f, 5.0f}}}}, - {"hHypertritonMCPtTotal", "hHypertritonMCPtTotal", {HistType::kTH1F, {{20, 0.0f, 10.0f}}}}, - {"hHypertritonMCPt", "hHypertritonMCPt", {HistType::kTH1F, {{100, 0.0f, 10.0f}}}}, - {"hAntiHypertritonMCPt", "hAntiHypertritonMCPt", {HistType::kTH1F, {{100, 0.0f, 10.0f}}}}, - {"hHypertritonMCMass", "hHypertritonMCMass", {HistType::kTH1F, {{40, 2.95f, 3.05f}}}}, - {"hAntiHypertritonMCMass", "hAntiHypertritonMCMass", {HistType::kTH1F, {{40, 2.95f, 3.05f}}}}, - {"hPairedHypertritonMCPt", "hPairedHypertritonMCPt", {HistType::kTH1F, {{100, 0.0f, 10.0f}}}}, - {"hPairedAntiHypertritonMCPt", "hPairedAntiHypertritonMCPt", {HistType::kTH1F, {{100, 0.0f, 10.0f}}}}, - {"hSameMcIndexCounter", "hSameMcIndexCounter", {HistType::kTH1F, {{2, 0.0f, 2.0f}}}}, - }, - }; - - void init(InitContext const&) - { - registry.get(HIST("hCheckCounter"))->GetXaxis()->SetBinLabel(1, "Total"); - registry.get(HIST("hCheckCounter"))->GetXaxis()->SetBinLabel(2, "Sig in Decay3body"); - registry.get(HIST("hCheckCounter"))->GetXaxis()->SetBinLabel(3, "Sig SameCol"); - registry.get(HIST("hCheckCounter"))->GetXaxis()->SetBinLabel(4, "Sig contained by finder"); - registry.get(HIST("hCheckCounter"))->GetXaxis()->SetBinLabel(5, "Sig SameIndex"); - } - struct Indexdaughters { // check duplicated paired daughters - int64_t index0; - int64_t index1; - int64_t index2; - bool operator==(const Indexdaughters& t) const - { - return (this->index0 == t.index0 && this->index1 == t.index1 && this->index2 == t.index2); - } - }; - - void processDoNotCompare(aod::Collisions::iterator const&) - { - // dummy process function - should not be required in the future - } - PROCESS_SWITCH(hypertriton3bodyComparewithDecay3body, processDoNotCompare, "Do not do comparison", true); - - void processDoComparison(aod::Decay3Bodys const& decay3bodytable, soa::Join const& vtx3bodydatas, MCLabeledTracksIU const&, aod::McParticles const& /*particlesMC*/) - { - std::vector set_pair; - for (auto d3body : decay3bodytable) { - registry.fill(HIST("hCheckCounter"), 0.5); - registry.fill(HIST("hMCInfoCounter"), 0.5); - auto lTrack0 = d3body.track0_as(); - auto lTrack1 = d3body.track1_as(); - auto lTrack2 = d3body.track2_as(); - if (!lTrack0.has_mcParticle() || !lTrack1.has_mcParticle() || !lTrack2.has_mcParticle()) { - continue; - } - registry.fill(HIST("hMCInfoCounter"), 1.5); - auto lMCTrack0 = lTrack0.mcParticle_as(); - auto lMCTrack1 = lTrack1.mcParticle_as(); - auto lMCTrack2 = lTrack2.mcParticle_as(); - if (lMCTrack0.isPhysicalPrimary() || lMCTrack1.isPhysicalPrimary() || lMCTrack2.isPhysicalPrimary()) { - continue; - } - if (lMCTrack0.producedByGenerator() || lMCTrack1.producedByGenerator() || lMCTrack2.producedByGenerator()) { - continue; - } - registry.fill(HIST("hMCInfoCounter"), 2.5); - - if (!lMCTrack0.has_mothers() || !lMCTrack1.has_mothers() || !lMCTrack2.has_mothers()) { - continue; - } - registry.fill(HIST("hMCInfoCounter"), 3.5); - - int lPDG = -1; - float lPt = -1; - bool is3bodyDecayedH3L = false; - int lGlobalIndex = -1; - - for (auto& lMother0 : lMCTrack0.mothers_as()) { - for (auto& lMother1 : lMCTrack1.mothers_as()) { - for (auto& lMother2 : lMCTrack2.mothers_as()) { - registry.fill(HIST("hMCInfoCounter"), 4.5); - if (lMother0.globalIndex() == lMother1.globalIndex() && lMother0.globalIndex() == lMother2.globalIndex()) { // vtxs with the same mother - registry.fill(HIST("hMCInfoCounter"), 7.5); - lGlobalIndex = lMother1.globalIndex(); - lPDG = lMother1.pdgCode(); - lPt = lMother1.pt(); - if (lPDG == 1010010030 && lMCTrack0.pdgCode() == 2212 && lMCTrack1.pdgCode() == -211 && lMCTrack2.pdgCode() == 1000010020) { - is3bodyDecayedH3L = true; - double hypertritonMCMass = RecoDecay::m(array{array{lMCTrack0.px(), lMCTrack0.py(), lMCTrack0.pz()}, array{lMCTrack1.px(), lMCTrack1.py(), lMCTrack1.pz()}, array{lMCTrack2.px(), lMCTrack2.py(), lMCTrack2.pz()}}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged, o2::constants::physics::MassDeuteron}); - registry.fill(HIST("hHypertritonMCPt"), lPt); - registry.fill(HIST("hHypertritonMCMass"), hypertritonMCMass); - } - if (lPDG == -1010010030 && lMCTrack0.pdgCode() == 211 && lMCTrack1.pdgCode() == -2212 && lMCTrack2.pdgCode() == -1000010020) { - is3bodyDecayedH3L = true; - double antiHypertritonMCMass = RecoDecay::m(array{array{lMCTrack0.px(), lMCTrack0.py(), lMCTrack0.pz()}, array{lMCTrack1.px(), lMCTrack1.py(), lMCTrack1.pz()}, array{lMCTrack2.px(), lMCTrack2.py(), lMCTrack2.pz()}}, array{o2::constants::physics::MassPionCharged, o2::constants::physics::MassProton, o2::constants::physics::MassDeuteron}); - registry.fill(HIST("hAntiHypertritonMCPt"), lPt); - registry.fill(HIST("hAntiHypertritonMCMass"), antiHypertritonMCMass); - } - } - } - } - } // end association check - - if (!is3bodyDecayedH3L) { - continue; - } - - registry.fill(HIST("hCheckCounter"), 1.5); - registry.fill(HIST("hMCInfoCounter"), 5.5); - // for check - registry.fill(HIST("hHypertritonMCPtTotal"), lPt); - - Indexdaughters temp = {lMCTrack0.globalIndex(), lMCTrack1.globalIndex(), lMCTrack2.globalIndex()}; - auto p = std::find(set_pair.begin(), set_pair.end(), temp); - if (p == set_pair.end()) { - set_pair.push_back(temp); - registry.fill(HIST("hMCInfoCounter"), 6.5); - } - - if (lTrack0.collisionId() != lTrack1.collisionId() || lTrack0.collisionId() != lTrack2.collisionId()) { - continue; - } - registry.fill(HIST("hCheckCounter"), 2.5); - - for (auto vtx : vtx3bodydatas) { - if (vtx.mcParticleId() == -1) { - continue; - } - auto mcparticle = vtx.mcParticle_as(); - if (mcparticle.globalIndex() == lGlobalIndex) { - registry.fill(HIST("hCheckCounter"), 4.5); // rare case check: if motherId matches but daughters not - if (lTrack0.globalIndex() == vtx.track0Id() && lTrack1.globalIndex() == vtx.track1Id() && lTrack2.globalIndex() == vtx.track2Id()) { - registry.fill(HIST("hCheckCounter"), 3.5); - if (lPDG > 0) { - registry.fill(HIST("hPairedHypertritonMCPt"), lPt); - } else { - registry.fill(HIST("hPairedAntiHypertritonMCPt"), lPt); - } - break; - } - } - } - } - } - PROCESS_SWITCH(hypertriton3bodyComparewithDecay3body, processDoComparison, "Compare decay3bodys and finder method with MC", false); -}; - -struct hypertriton3bodyInitializer { - Spawns vtx3bodydatas; - void init(InitContext const&) {} -}; - -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - return WorkflowSpec{ - adaptAnalysisTask(cfgc), - adaptAnalysisTask(cfgc), - adaptAnalysisTask(cfgc), - adaptAnalysisTask(cfgc), - adaptAnalysisTask(cfgc), - }; -} diff --git a/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx b/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx index f8d3d04856a..4f52fdd8066 100644 --- a/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx +++ b/PWGLF/TableProducer/Nuspex/reduced3bodyCreator.cxx @@ -35,6 +35,7 @@ #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/PIDResponse.h" #include "Common/Core/PID/PIDTOF.h" +#include "Common/Core/RecoDecay.h" #include "TableHelper.h" #include "Tools/KFparticle/KFUtilities.h" @@ -78,7 +79,6 @@ struct reduced3bodyCreator { Produces reducedDecay3Bodys; Produces reduced3BodyInfo; Produces reducedFullTracksPIDIU; - Produces dcaFitterSVInfo; Service ccdb; Zorro zorro; @@ -88,7 +88,6 @@ struct reduced3bodyCreator { o2::aod::pidtofgeneric::TofPidNewCollision bachelorTOFPID; Configurable event_sel8_selection{"event_sel8_selection", true, "event selection count post sel8 cut"}; - Configurable mc_event_selection{"mc_event_selection", true, "mc event selection count post kIsTriggerTVX and kNoTimeFrameBorder"}; Configurable event_posZ_selection{"event_posZ_selection", true, "event selection count post poZ cut"}; // CCDB options Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; @@ -114,6 +113,9 @@ struct reduced3bodyCreator { float d_bz; o2::pid::tof::TOFResoParamsV2 mRespParamsV2; + // tracked cluster size + std::vector fTrackedClSizeVector; + HistogramRegistry registry{"registry", {}}; void init(InitContext&) @@ -282,7 +284,7 @@ struct reduced3bodyCreator { //------------------------------------------------------------------ // function to fit KFParticle 3body vertex template - void fit3bodyVertex(TKFParticle& kfpProton, TKFParticle& kfpPion, TKFParticle& kfpDeuteron, TKFParticle& KFHt) + bool fit3bodyVertex(TKFParticle& kfpProton, TKFParticle& kfpPion, TKFParticle& kfpDeuteron, TKFParticle& KFHt) { // Construct 3body vertex int nDaughters3body = 3; @@ -292,12 +294,13 @@ struct reduced3bodyCreator { KFHt.Construct(Daughters3body, nDaughters3body); } catch (std::runtime_error& e) { LOG(debug) << "Failed to create Hyper triton 3-body vertex." << e.what(); - return; + return false; } LOG(debug) << "Hypertriton vertex constructed."; + return true; } - void process(ColwithEvTimesMultsCents const& collisions, TrackExtPIDIUwithEvTimes const&, aod::Decay3Bodys const& decay3bodys, aod::BCsWithTimestamps const&) + void process(ColwithEvTimesMultsCents const& collisions, TrackExtPIDIUwithEvTimes const&, aod::Decay3Bodys const& decay3bodys, aod::Tracked3Bodys const& tracked3bodys, aod::BCsWithTimestamps const&) { std::vector triggeredCollisions(collisions.size(), false); @@ -340,7 +343,14 @@ struct reduced3bodyCreator { int lastCollisionID = -1; // collisionId of last analysed decay3body. Table is sorted. - // Creat reduced table + // get tracked cluster size info + fTrackedClSizeVector.clear(); + fTrackedClSizeVector.resize(decay3bodys.size(), 0); + for (const auto& tvtx3body : tracked3bodys) { + fTrackedClSizeVector[tvtx3body.decay3BodyId()] = tvtx3body.itsClsSize(); + } + + // Create reduced table for (const auto& d3body : decay3bodys) { auto collision = d3body.template collision_as(); @@ -398,7 +408,7 @@ struct reduced3bodyCreator { const auto trackStartIndex = reducedFullTracksPIDIU.lastIndex(); reducedDecay3Bodys(collisionIndex, trackStartIndex - 2, trackStartIndex - 1, trackStartIndex); - // -------- save reduced decay3body info table -------- + // -------- get decay3body info with KF -------- // get trackParCov daughters auto trackParCovPos = getTrackParCov(daughter0); auto trackParCovNeg = getTrackParCov(daughter1); @@ -413,23 +423,29 @@ struct reduced3bodyCreator { kfpPion = createKFParticleFromTrackParCov(trackParCovPos, daughter0.sign(), constants::physics::MassPionCharged); } kfpDeuteron = createKFParticleFromTrackParCov(trackParCovBach, daughter2.sign(), constants::physics::MassDeuteron); - // fit 3body vertex + // fit 3body vertex and caclulate radius, phi, z position + float radius, phi, posZ; KFParticle KFHt; - fit3bodyVertex(kfpProton, kfpPion, kfpDeuteron, KFHt); - // calculate radius and phi - auto radius = std::sqrt(KFHt.GetX() * KFHt.GetX() + KFHt.GetY() * KFHt.GetY()); - float phi, sigma; - KFHt.GetPhi(phi, sigma); - // fill 3body info table - reduced3BodyInfo(radius, phi, KFHt.GetZ()); - - // -------- save dcaFitter secondary vertex info table -------- + if (fit3bodyVertex(kfpProton, kfpPion, kfpDeuteron, KFHt)) { + radius = std::hypot(KFHt.GetX(), KFHt.GetY()); + phi = std::atan2(KFHt.GetPx(), KFHt.GetPy()); + posZ = KFHt.GetZ(); + } else { + radius = -999.; + phi = -999.; + posZ = -999.; + } + + // -------- get decay3body info with DCA fitter -------- auto Track0 = getTrackParCov(daughter0); auto Track1 = getTrackParCov(daughter1); auto Track2 = getTrackParCov(daughter2); int n3bodyVtx = fitter3body.process(Track0, Track1, Track2); + float phiVtx, rVtx, zVtx; if (n3bodyVtx == 0) { // discard this pair - dcaFitterSVInfo(-999, -999, -999); + phiVtx = -999.; + rVtx = -999.; + zVtx = -999.; } else { const auto& vtxXYZ = fitter3body.getPCACandidate(); @@ -441,10 +457,13 @@ struct reduced3bodyCreator { propagatedTrack1.getPxPyPzGlo(p1); propagatedTrack2.getPxPyPzGlo(p2); std::array p3B = {p0[0] + p1[0] + p2[0], p0[1] + p1[1] + p2[1], p0[2] + p1[2] + p2[2]}; - float phiVtx = std::atan2(p3B[1], p3B[0]); - float rVtx = std::hypot(vtxXYZ[0], vtxXYZ[1]); - dcaFitterSVInfo(rVtx, phiVtx, vtxXYZ[2]); + phiVtx = std::atan2(p3B[1], p3B[0]); + rVtx = std::hypot(vtxXYZ[0], vtxXYZ[1]); + zVtx = vtxXYZ[2]; } + + // fill 3body info table (KF and DCA fitter info) + reduced3BodyInfo(radius, phi, posZ, rVtx, phiVtx, zVtx, fTrackedClSizeVector[d3body.globalIndex()]); } // end decay3body loop registry.fill(HIST("hEventCounter"), 3.5, reducedCollisions.lastIndex() + 1); diff --git a/PWGLF/TableProducer/Nuspex/threebodyKFTask.cxx b/PWGLF/TableProducer/Nuspex/threebodyKFTask.cxx deleted file mode 100644 index 1fed55805c2..00000000000 --- a/PWGLF/TableProducer/Nuspex/threebodyKFTask.cxx +++ /dev/null @@ -1,488 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. -// -/// \brief Analysis task for KFVtx3BodyDatas (3body candidates reconstructed with KF) -/// \author Carolina Reetz --> partly copied from threebodyRecoTask.cxx -// ======================== - -#include -#include -#include -#include -#include - -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoAHelpers.h" -#include "ReconstructionDataFormats/Track.h" -#include "Common/Core/RecoDecay.h" -#include "Common/Core/trackUtilities.h" -#include "PWGLF/DataModel/LFStrangenessTables.h" -#include "PWGLF/DataModel/Vtx3BodyTables.h" -#include "Common/DataModel/EventSelection.h" -#include "Common/DataModel/Centrality.h" -#include "Common/DataModel/PIDResponse.h" -#include "CommonConstants/PhysicsConstants.h" - -using namespace o2; -using namespace o2::framework; -using namespace o2::framework::expressions; -using std::array; - -using MCLabeledTracksIU = soa::Join; - -struct threebodyKFTask { - - Produces outputMCTable; - std::vector filledMothers; - std::vector isGoodCollision; - - // Configurables - Configurable bachelorPdgCode{"bachelorPdgCode", 1000010020, "pdgCode of bachelor daughter"}; - Configurable motherPdgCode{"motherPdgCode", 1010010030, "pdgCode of mother"}; - - ConfigurableAxis m2PrPiBins{"m2PrPiBins", {60, 1., 3.3}, "Binning for m2(p,pi) axis"}; - ConfigurableAxis m2PiDeBins{"m2PiDeBins", {120, 4.0, 8.0}, "Binning for m2(pi,d) axis"}; - - // collision filter and preslice - Filter collisionFilter = (aod::evsel::sel8 == true && nabs(aod::collision::posZ) < 10.f); - Preslice perCollisionVtx3BodyDatas = o2::aod::vtx3body::collisionId; - - HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject}; - - void init(InitContext const&) - { - const AxisSpec axisM2PrPi{m2PrPiBins, "#it{m}^{2}(p,#pi^{-}) ((GeV/#it{c}^{2})^{2})"}; - const AxisSpec axisM2PiDe{m2PiDeBins, "#it{m}^{2}(#pi^{+},#bar{d}) ((GeV/#it{c}^{2})^{2})"}; - - registry.add("hCentFT0C", "hCentFT0C", HistType::kTH1F, {{100, 0.0f, 100.0f, "FT0C Centrality"}}); - - // mass spectrum of reco candidates - registry.add("hMassHypertriton", "Mass hypertriton", HistType::kTH1F, {{80, 2.96f, 3.04f, "#it{m}(p,#pi^{-},d) (GeV/#it{c}^{2})"}}); - registry.add("hMassAntiHypertriton", "Mass anti-hypertriton", HistType::kTH1F, {{80, 2.96f, 3.04f, "#it{m}(#bar{p},#pi^{+},#bar{d}) (GeV/#it{c}^{2})"}}); - // Dalitz diagrams of reco candidates - registry.add("hDalitzHypertriton", "Dalitz diagram", HistType::kTH2F, {axisM2PrPi, axisM2PiDe})->GetYaxis()->SetTitle("#it{m}^{2}(#pi^{-},d) ((GeV/#it{c}^{2})^{2})"); - registry.add("hDalitzAntiHypertriton", "Dalitz diagram", HistType::kTH2F, {axisM2PrPi, axisM2PiDe})->GetXaxis()->SetTitle("#it{m}^{2}(#bar{p},#pi^{+}) ((GeV/#it{c}^{2})^{2})"); - - // bachelor histgrams - registry.add("hAverageITSClusterSizeBachelor", "Average ITS cluster size bachelor track", HistType::kTH1F, {{15, 0.5, 15.5, "#langle ITS cluster size #rangle"}}); - registry.add("hdEdxBachelor", "TPC dE/dx bachelor track", HistType::kTH1F, {{200, 0.0f, 200.0f, "Average ITS cluster size"}}); - registry.add("hPIDTrackingBachelor", "Tracking PID bachelor track", HistType::kTH1F, {{20, 0.5, 20.5, "Tracking PID identifier"}}); - - // for gen information of reco candidates - auto LabelHist = registry.add("hLabelCounter", "Reco MC candidate counter", HistType::kTH1F, {{3, 0.0f, 3.0f}}); - LabelHist->GetXaxis()->SetBinLabel(1, "Total"); - LabelHist->GetXaxis()->SetBinLabel(2, "Have Same MotherTrack"); - LabelHist->GetXaxis()->SetBinLabel(3, "True H3L/Anti-H3L"); - registry.add("hTrueHypertritonMCPt", "pT gen. of reco. H3L", HistType::kTH1F, {{100, -10.0f, 10.0f, "#it{p}_{T} (GeV/#it{c})"}}); - registry.add("hTrueHypertritonMCMass", "mass gen. of reco. H3L", HistType::kTH1F, {{40, 2.96f, 3.04f, "#it{m}(p,#pi^{-},d) (GeV/#it{c}^{2})"}}); - registry.add("hTrueHypMassWithMuReco", "mass gen. of reco. H3L", HistType::kTH1F, {{40, 2.96f, 3.04f, "#it{m}(p,#pi^{-},d) (GeV/#it{c}^{2})"}}); - registry.add("hTrueHypertritonMCCTau", "#it{c}#tau gen. of reco. H3L", HistType::kTH1F, {{50, 0.0f, 50.0f, "#it{c}#tau(cm)"}}); - registry.add("hTrueHypertritonMCMassPrPi", "inv. mass gen. of reco. V0 pair (H3L)", HistType::kTH1F, {{100, 0.0f, 6.0f, "#it{m}(p,#pi^{-}) (GeV/#it{c}^{2})"}}); - - // for gen information of non reco candidates - registry.add("hTrueHypertritonMCMassPrPi_nonReco", "inv. mass gen. of non-reco. V0 pair (H3L)", HistType::kTH1F, {{100, 0.0f, 6.0f, "#it{m}(p,#pi^{-}) (GeV/#it{c}^{2})"}}); - registry.add("hTrueHypertritonMCPtPion_nonReco", "Pion #it{p}_{T} gen. of non-reco. H3L", HistType::kTH1F, {{100, 0.0f, 6.0f, "#it{p}_{T}(#pi) (GeV/#it{c})"}}); - registry.add("hTrueHypertritonMCPtProton_nonReco", "Proton #it{p}_{T} gen. of non-reco. H3L", HistType::kTH1F, {{100, 0.0f, 6.0f, "#it{p}_{T}(p) (GeV/#it{c})"}}); - } - - // helper function to check if a mother track is a true H3L/Anti-H3L - template - int checkH3LTruth(MCTrack3B const& mcParticlePr, MCTrack3B const& mcParticlePi, MCTrack3B const& mcParticleDe, bool& isMuonReco) - { - if (abs(mcParticlePr.pdgCode()) != 2212 || abs(mcParticleDe.pdgCode()) != 1000010020) { - return -1; - } - // check proton and deuteron mother - int prDeMomID = -1; - for (const auto& motherPr : mcParticlePr.template mothers_as()) { - for (const auto& motherDe : mcParticleDe.template mothers_as()) { - if (motherPr.globalIndex() == motherDe.globalIndex() && std::abs(motherPr.pdgCode()) == 1010010030) { - prDeMomID = motherPr.globalIndex(); - break; - } - } - } - if (prDeMomID == -1) { - return -1; - } - if (std::abs(mcParticlePi.pdgCode()) != 211 && std::abs(mcParticlePi.pdgCode()) != 13) { - return -1; - } - // check if the pion track is a muon coming from a pi -> mu + vu decay, if yes, take the mother pi - auto mcParticlePiTmp = mcParticlePi; - if (std::abs(mcParticlePiTmp.pdgCode()) == 13) { - for (const auto& motherPi : mcParticlePiTmp.template mothers_as()) { - if (std::abs(motherPi.pdgCode()) == 211) { - mcParticlePiTmp = motherPi; - isMuonReco = true; - break; - } - } - } - // now loop over the pion mother - for (const auto& motherPi : mcParticlePiTmp.template mothers_as()) { - if (motherPi.globalIndex() == prDeMomID) { - return motherPi.globalIndex(); - } - } - return -1; - } - - template - void fillQAPlots(TCand const& vtx3body) - { - // Mass plot - if (vtx3body.track2sign() > 0) { // hypertriton - registry.fill(HIST("hMassHypertriton"), vtx3body.mass()); - } else if (vtx3body.track2sign() < 0) { // anti-hypertriton - registry.fill(HIST("hMassAntiHypertriton"), vtx3body.mass()); - } - - // Dalitz plot - auto m2prpi = RecoDecay::m2(array{array{vtx3body.pxtrack0(), vtx3body.pytrack0(), vtx3body.pztrack0()}, array{vtx3body.pxtrack1(), vtx3body.pytrack1(), vtx3body.pztrack1()}}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged}); - auto m2pide = RecoDecay::m2(array{array{vtx3body.pxtrack1(), vtx3body.pytrack1(), vtx3body.pztrack1()}, array{vtx3body.pxtrack2(), vtx3body.pytrack2(), vtx3body.pztrack2()}}, array{o2::constants::physics::MassPionCharged, o2::constants::physics::MassDeuteron}); - if (std::abs(vtx3body.mass() - o2::constants::physics::MassHyperTriton) <= 0.005) { - if (vtx3body.track2sign() > 0) { // hypertriton - registry.fill(HIST("hDalitzHypertriton"), m2prpi, m2pide); - } else if (vtx3body.track2sign() < 0) { // anti-hypertriton - registry.fill(HIST("hDalitzAntiHypertriton"), m2prpi, m2pide); - } - } - - // ITS cluster sizes - registry.fill(HIST("hAverageITSClusterSizeBachelor"), vtx3body.itsclussizedeuteron()); - registry.fill(HIST("hdEdxBachelor"), vtx3body.tpcdedxdeuteron()); - registry.fill(HIST("hPIDTrackingBachelor"), vtx3body.pidtrackingdeuteron()); - } - - //------------------------------------------------------------------ - // process real data analysis - void processData(soa::Filtered>::iterator const& collision, - aod::KFVtx3BodyDatas const& vtx3bodydatas) - { - registry.fill(HIST("hCentFT0C"), collision.centFT0C()); - - for (auto& vtx3bodydata : vtx3bodydatas) { - // QA histograms - fillQAPlots(vtx3bodydata); - } - } - PROCESS_SWITCH(threebodyKFTask, processData, "Data analysis", true); - - //------------------------------------------------------------------ - // process mc analysis - void processMC(soa::Join const& collisions, - aod::KFVtx3BodyDatas const& vtx3bodydatas, - aod::McParticles const& particlesMC, - MCLabeledTracksIU const&, - aod::McCollisions const& mcCollisions) - { - filledMothers.clear(); - isGoodCollision.resize(mcCollisions.size(), false); - - // loop over collisions - for (const auto& collision : collisions) { - // event selection - if (!collision.sel8() || std::abs(collision.posZ()) > 10.f) { - continue; - } - // reco collision survived event selection filter --> fill value for MC collision if collision is "true" MC collision - if (collision.mcCollisionId() >= 0) { - isGoodCollision[collision.mcCollisionId()] = true; - } - - // fill MC table with reco MC candidate information and gen information if matched to MC particle - auto Decay3BodyTable_thisCollision = vtx3bodydatas.sliceBy(perCollisionVtx3BodyDatas, collision.globalIndex()); - for (auto& vtx3bodydata : Decay3BodyTable_thisCollision) { - registry.fill(HIST("hLabelCounter"), 0.5); - - // fill QA histograms for all reco candidates - fillQAPlots(vtx3bodydata); - - auto track0 = vtx3bodydata.track0_as(); - auto track1 = vtx3bodydata.track1_as(); - auto track2 = vtx3bodydata.track2_as(); - - if (!track0.has_mcParticle() || !track1.has_mcParticle() || !track2.has_mcParticle()) { - continue; - } - - auto mcTrack0 = track0.mcParticle_as(); - auto mcTrack1 = track1.mcParticle_as(); - auto mcTrack2 = track2.mcParticle_as(); - - float genPosPt = mcTrack0.pt(); - float genPosP = mcTrack0.p(); - int daughter0PDGcode = mcTrack0.pdgCode(); - float genNegPt = mcTrack1.pt(); - float genNegP = mcTrack1.p(); - int daughter1PDGcode = mcTrack1.pdgCode(); - float genBachPt = mcTrack2.pt(); - float genBachP = mcTrack2.p(); - int daughter2PDGcode = mcTrack2.pdgCode(); - bool isBachPrimary = mcTrack2.isPhysicalPrimary(); - - double MClifetime = -1.; - bool isTrueH3L = false; - bool isTrueAntiH3L = false; - float genPhi = -1.; - float genEta = -1.; - float genRap = -1.; - float genP = -1.; - float genPt = -1.; - std::array genDecVtx{-1.f}; - bool isMuonReco = false; - auto& mcTrackPr = vtx3bodydata.sign() > 0 ? mcTrack0 : mcTrack1; - auto& mcTrackPi = vtx3bodydata.sign() > 0 ? mcTrack1 : mcTrack0; - auto& mcTrackDe = mcTrack2; - int motherID = checkH3LTruth(mcTrackPr, mcTrackPi, mcTrackDe, isMuonReco); - if (motherID > 0) { - auto mcTrackHyp = particlesMC.rawIteratorAt(motherID); - genPhi = mcTrackHyp.phi(); - genEta = mcTrackHyp.eta(); - genPt = mcTrackHyp.pt(); - int chargeFactor = mcTrackHyp.pdgCode() > 0 ? 1 : -1; - isTrueH3L = chargeFactor > 0; - isTrueAntiH3L = chargeFactor < 0; - MClifetime = RecoDecay::sqrtSumOfSquares(mcTrackPr.vx() - mcTrackHyp.vx(), mcTrackPr.vy() - mcTrackHyp.vy(), mcTrackPr.vz() - mcTrackHyp.vz()) * o2::constants::physics::MassHyperTriton / mcTrackHyp.p(); - double MCMass = RecoDecay::m(array{array{mcTrackPr.px(), mcTrackPr.py(), mcTrackPr.pz()}, array{mcTrackPi.px(), mcTrackPi.py(), mcTrackPi.pz()}, array{mcTrackDe.px(), mcTrackDe.py(), mcTrackDe.pz()}}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged, o2::constants::physics::MassDeuteron}); - float MCmassPrPi = RecoDecay::m(array{array{mcTrackPr.px(), mcTrackPr.py(), mcTrackPr.pz()}, array{mcTrackPi.px(), mcTrackPi.py(), mcTrackPi.pz()}}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged}); - registry.fill(HIST("hLabelCounter"), 2.5); - registry.fill(HIST("hTrueHypertritonMCPt"), mcTrackHyp.pt() * chargeFactor); - registry.fill(HIST("hTrueHypertritonMCCTau"), MClifetime); - registry.fill(HIST("hTrueHypertritonMCMass"), MCMass); - registry.fill(HIST("hTrueHypertritonMCMassPrPi"), MCmassPrPi); - if (isMuonReco) { - registry.fill(HIST("hTrueHypMassWithMuReco"), MCMass); - } - filledMothers.push_back(mcTrackHyp.globalIndex()); - } - outputMCTable( // filled for each reconstructed candidate (in KFVtx3BodyDatas) - vtx3bodydata.mass(), - vtx3bodydata.x(), vtx3bodydata.y(), vtx3bodydata.z(), - vtx3bodydata.xerr(), vtx3bodydata.yerr(), vtx3bodydata.zerr(), - vtx3bodydata.px(), vtx3bodydata.py(), vtx3bodydata.pz(), vtx3bodydata.pt(), - vtx3bodydata.pxerr(), vtx3bodydata.pyerr(), vtx3bodydata.pzerr(), vtx3bodydata.pterr(), - vtx3bodydata.sign(), - vtx3bodydata.dcavtxtopvkf(), vtx3bodydata.dcaxyvtxtopvkf(), - vtx3bodydata.vtxcospakf(), vtx3bodydata.vtxcosxypakf(), - vtx3bodydata.vtxcospakftopo(), vtx3bodydata.vtxcosxypakftopo(), - vtx3bodydata.decaylkf(), vtx3bodydata.decaylxykf(), vtx3bodydata.decayldeltal(), - vtx3bodydata.chi2geondf(), vtx3bodydata.chi2topondf(), - vtx3bodydata.ctaukftopo(), - vtx3bodydata.trackedclsize(), - vtx3bodydata.massv0(), vtx3bodydata.chi2massv0(), - vtx3bodydata.cospav0(), - vtx3bodydata.pxtrack0(), vtx3bodydata.pytrack0(), vtx3bodydata.pztrack0(), // proton - vtx3bodydata.pxtrack1(), vtx3bodydata.pytrack1(), vtx3bodydata.pztrack1(), // pion - vtx3bodydata.pxtrack2(), vtx3bodydata.pytrack2(), vtx3bodydata.pztrack2(), // deuteron - vtx3bodydata.tpcinnerparamtrack0(), vtx3bodydata.tpcinnerparamtrack1(), vtx3bodydata.tpcinnerparamtrack2(), // proton, pion, deuteron - vtx3bodydata.tpcncltrack0(), vtx3bodydata.tpcncltrack1(), vtx3bodydata.tpcncltrack1(), // proton, pion, deuteron - vtx3bodydata.tpcchi2ncldeuteron(), - vtx3bodydata.deltaphideuteron(), vtx3bodydata.deltaphiproton(), - vtx3bodydata.dcatrack0topvkf(), vtx3bodydata.dcatrack1topvkf(), vtx3bodydata.dcatrack2topvkf(), // proton, pion, deuteron - vtx3bodydata.dcaxytrack0topvkf(), vtx3bodydata.dcaxytrack1topvkf(), vtx3bodydata.dcaxytrack2topvkf(), // proton, pion, deuteron - vtx3bodydata.dcaxytrack0tosvkf(), vtx3bodydata.dcaxytrack1tosvkf(), vtx3bodydata.dcaxytrack2tosvkf(), // proton, pion, deuteron - vtx3bodydata.dcatrack0totrack1kf(), vtx3bodydata.dcatrack0totrack2kf(), vtx3bodydata.dcatrack1totrack2kf(), - vtx3bodydata.dcavtxdaughterskf(), - vtx3bodydata.dcaxytrackpostopv(), vtx3bodydata.dcaxytracknegtopv(), vtx3bodydata.dcaxytrackbachtopv(), - vtx3bodydata.dcatrackpostopv(), vtx3bodydata.dcatracknegtopv(), vtx3bodydata.dcatrackbachtopv(), - vtx3bodydata.track0sign(), vtx3bodydata.track1sign(), vtx3bodydata.track2sign(), // proton, pion, deuteron - vtx3bodydata.tpcnsigmaproton(), vtx3bodydata.tpcnsigmapion(), vtx3bodydata.tpcnsigmadeuteron(), vtx3bodydata.tpcnsigmapionbach(), - vtx3bodydata.tpcdedxproton(), vtx3bodydata.tpcdedxpion(), vtx3bodydata.tpcdedxdeuteron(), - vtx3bodydata.tofnsigmadeuteron(), - vtx3bodydata.itsclussizedeuteron(), - vtx3bodydata.pidtrackingdeuteron(), - // MC info (-1 if not matched to MC particle) - genP, - genPt, - genDecVtx[0], genDecVtx[1], genDecVtx[2], - MClifetime, - genPhi, - genEta, - genRap, - genPosP, genPosPt, genNegP, genNegPt, genBachP, genBachPt, - isTrueH3L, isTrueAntiH3L, - daughter0PDGcode, daughter1PDGcode, daughter2PDGcode, isBachPrimary, - true, // is reconstructed - true); // reco event passed event selection - } // end vtx3bodydatas loop - } // end collision loop - - // generated MC particle analysis - // fill MC table with gen information for all generated but not reconstructed particles - for (auto& mcparticle : particlesMC) { - - double genMCmassPrPi = -1.; - bool isTrueGenH3L = false; - bool isTrueGenAntiH3L = false; - float genPBach = -1.; - float genPtBach = -1.; - float genPPos = -1.; - float genPtPos = -1.; - float genPNeg = -1.; - float genPtNeg = -1.; - int posDauPdgCode = -1; - int negDauPdgCode = -1; - int bachDauPdgCode = -1; - - // check if mcparticle was reconstructed and already filled in the table - if (std::find(filledMothers.begin(), filledMothers.end(), mcparticle.globalIndex()) != std::end(filledMothers)) { - continue; - } - - // set flag if corresponding reco collision survived event selection - bool survEvSel = isGoodCollision[mcparticle.mcCollisionId()]; - - // check if MC particle is hypertriton with 3-body decay - if (std::abs(mcparticle.pdgCode()) != motherPdgCode) { - continue; - } - bool haveProton = false, havePion = false, haveBachelor = false; - bool haveAntiProton = false, haveAntiPion = false, haveAntiBachelor = false; - for (auto& mcparticleDaughter : mcparticle.template daughters_as()) { - if (mcparticleDaughter.pdgCode() == 2212) - haveProton = true; - if (mcparticleDaughter.pdgCode() == -2212) - haveAntiProton = true; - if (mcparticleDaughter.pdgCode() == 211) - havePion = true; - if (mcparticleDaughter.pdgCode() == -211) - haveAntiPion = true; - if (mcparticleDaughter.pdgCode() == bachelorPdgCode) - haveBachelor = true; - if (mcparticleDaughter.pdgCode() == -bachelorPdgCode) - haveAntiBachelor = true; - } - - // check if particle or anti-particle - if (haveProton && haveAntiPion && haveBachelor && mcparticle.pdgCode() > 0) { - isTrueGenH3L = true; - // get proton and pion daughter - std::array protonMom{0.f}; - std::array piMinusMom{0.f}; - for (auto& mcparticleDaughter : mcparticle.template daughters_as()) { - if (mcparticleDaughter.pdgCode() == 2212) { - protonMom = {mcparticleDaughter.px(), mcparticleDaughter.py(), mcparticleDaughter.pz()}; - genPPos = mcparticleDaughter.p(); - genPtPos = mcparticleDaughter.pt(); - posDauPdgCode = mcparticleDaughter.pdgCode(); - } else if (mcparticleDaughter.pdgCode() == -211) { - piMinusMom = {mcparticleDaughter.px(), mcparticleDaughter.py(), mcparticleDaughter.pz()}; - genPNeg = mcparticleDaughter.p(); - genPtNeg = mcparticleDaughter.pt(); - negDauPdgCode = mcparticleDaughter.pdgCode(); - } - } - genMCmassPrPi = RecoDecay::m(array{protonMom, piMinusMom}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged}); - registry.fill(HIST("hTrueHypertritonMCMassPrPi_nonReco"), genMCmassPrPi); - registry.fill(HIST("hTrueHypertritonMCPtProton_nonReco"), RecoDecay::sqrtSumOfSquares(protonMom[0], protonMom[1])); - registry.fill(HIST("hTrueHypertritonMCPtPion_nonReco"), RecoDecay::sqrtSumOfSquares(piMinusMom[0], piMinusMom[1])); - } else if (haveAntiProton && havePion && haveAntiBachelor && mcparticle.pdgCode() < 0) { - isTrueGenAntiH3L = true; - // get anti-proton and pion daughter - std::array antiProtonMom{0.f}; - std::array piPlusMom{0.f}; - for (auto& mcparticleDaughter : mcparticle.template daughters_as()) { - if (mcparticleDaughter.pdgCode() == -2212) { - antiProtonMom = {mcparticleDaughter.px(), mcparticleDaughter.py(), mcparticleDaughter.pz()}; - genPNeg = mcparticleDaughter.p(); - genPtNeg = mcparticleDaughter.pt(); - negDauPdgCode = mcparticleDaughter.pdgCode(); - } else if (mcparticleDaughter.pdgCode() == 211) { - piPlusMom = {mcparticleDaughter.px(), mcparticleDaughter.py(), mcparticleDaughter.pz()}; - genPPos = mcparticleDaughter.p(); - genPtPos = mcparticleDaughter.pt(); - posDauPdgCode = mcparticleDaughter.pdgCode(); - } - } - genMCmassPrPi = RecoDecay::m(array{antiProtonMom, piPlusMom}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged}); - registry.fill(HIST("hTrueHypertritonMCMassPrPi_nonReco"), genMCmassPrPi); - registry.fill(HIST("hTrueHypertritonMCPtProton_nonReco"), RecoDecay::sqrtSumOfSquares(antiProtonMom[0], antiProtonMom[1])); - registry.fill(HIST("hTrueHypertritonMCPtPion_nonReco"), RecoDecay::sqrtSumOfSquares(piPlusMom[0], piPlusMom[1])); - } else { - continue; // stop if particle is no true H3L or Anti-H3L - } - - // get gen decay vertex and calculate ctau - std::array genDecayVtx{0.f}; - for (auto& mcDaughter : mcparticle.daughters_as()) { - if (std::abs(mcDaughter.pdgCode()) == bachelorPdgCode) { - genDecayVtx = {mcDaughter.vx(), mcDaughter.vy(), mcDaughter.vz()}; - genPBach = mcDaughter.p(); - genPtBach = mcDaughter.pt(); - bachDauPdgCode = mcDaughter.pdgCode(); - } - } - double genMClifetime = RecoDecay::sqrtSumOfSquares(genDecayVtx[0] - mcparticle.vx(), genDecayVtx[1] - mcparticle.vy(), genDecayVtx[2] - mcparticle.vz()) * o2::constants::physics::MassHyperTriton / mcparticle.p(); - outputMCTable( // reco information (-1) - -1, - -1, -1, -1, - -1, -1, -1, - -1, -1, -1, -1, - -1, -1, -1, -1, - -1, - -1, -1, - -1, -1, - -1, -1, - -1, -1, -1, - -1, -1, - -1, - -1, - -1, -1, - -1, - -1, -1, -1, - -1, -1, -1, - -1, -1, -1, - -1, -1, -1, - -1, -1, -1, - -1, - -1, -1, - -1, -1, -1, - -1, -1, -1, - -1, -1, -1, - -1, -1, -1, - -1, - -1, -1, -1, - -1, -1, -1, - -1, -1, -1, - -1, -1, -1, -1, - -1, -1, -1, - -1, - -1, - -1, - // gen information - mcparticle.p(), - mcparticle.pt(), - genDecayVtx[0], genDecayVtx[1], genDecayVtx[2], - genMClifetime, - mcparticle.phi(), - mcparticle.eta(), - mcparticle.y(), - genPPos, genPtPos, genPNeg, genPtNeg, genPBach, genPtBach, - isTrueGenH3L, isTrueGenAntiH3L, - posDauPdgCode, negDauPdgCode, bachDauPdgCode, - false, // isBachPrimary - false, // is reconstructed - survEvSel); - } // end mcparticles loop - } - PROCESS_SWITCH(threebodyKFTask, processMC, "MC analysis", false); -}; - -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - return WorkflowSpec{ - adaptAnalysisTask(cfgc), - }; -} diff --git a/PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx b/PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx deleted file mode 100644 index 36af287f95e..00000000000 --- a/PWGLF/TableProducer/Nuspex/threebodyRecoTask.cxx +++ /dev/null @@ -1,909 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. -// -/// \file threebodyRecoTask.cxx -/// \brief Analysis task for 3-body decay process (now mainly for hypertriton) -/// \author Yuanzhe Wang - -#include -#include -#include -#include -#include -#include -#include - -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoAHelpers.h" -#include "ReconstructionDataFormats/Track.h" -#include "Common/Core/RecoDecay.h" -#include "Common/Core/trackUtilities.h" -#include "PWGLF/DataModel/Vtx3BodyTables.h" -#include "PWGLF/DataModel/Reduced3BodyTables.h" -#include "Common/DataModel/EventSelection.h" -#include "Common/DataModel/Centrality.h" -#include "Common/DataModel/PIDResponse.h" -#include "CommonConstants/PhysicsConstants.h" -#include "CCDB/BasicCCDBManager.h" - -#include "EventFiltering/Zorro.h" -#include "EventFiltering/ZorroSummary.h" - -using namespace o2; -using namespace o2::framework; -using namespace o2::framework::expressions; - -using ReducedCols = soa::Join; -using FullTracksExtIU = soa::Join; -using MCLabeledTracksIU = soa::Join; - -std::vector triggerLabels = { - "fTriggerEventF1Proton", "fTrackedOmega", "fTrackedXi", "fOmegaLargeRadius", - "fDoubleOmega", "fOmegaHighMult", "fSingleXiYN", "fQuadrupleXi", "fDoubleXi", - "fhadronOmega", "fOmegaXi", "fTripleXi", "fOmega", "fGammaVeryLowPtEMCAL", - "fGammaVeryLowPtDCAL", "fGammaHighPtEMCAL", "fGammaLowPtEMCAL", "fGammaVeryHighPtDCAL", - "fGammaVeryHighPtEMCAL", "fGammaLowPtDCAL", "fJetNeutralLowPt", "fJetNeutralHighPt", - "fGammaHighPtDCAL", "fJetFullLowPt", "fJetFullHighPt", "fEMCALReadout", "fPCMandEE", - "fPHOSnbar", "fPCMHighPtPhoton", "fPHOSPhoton", "fLD", "fPPPHI", "fPD", "fLLL", "fPLL", - "fPPL", "fPPP", "fLeadingPtTrack", "fHighFt0cFv0Flat", "fHighFt0cFv0Mult", "fHighFt0Flat", - "fHighFt0Mult", "fHighMultFv0", "fHighTrackMult", "fHfSingleNonPromptCharm3P", - "fHfSingleNonPromptCharm2P", "fHfSingleCharm3P", "fHfPhotonCharm3P", "fHfHighPt2P", - "fHfSigmaC0K0", "fHfDoubleCharm2P", "fHfBeauty3P", "fHfFemto3P", "fHfFemto2P", - "fHfHighPt3P", "fHfSigmaCPPK", "fHfDoubleCharm3P", "fHfDoubleCharmMix", - "fHfPhotonCharm2P", "fHfV0Charm2P", "fHfBeauty4P", "fHfV0Charm3P", "fHfSingleCharm2P", - "fHfCharmBarToXiBach", "fSingleMuHigh", "fSingleMuLow", "fLMeeHMR", "fDiMuon", - "fDiElectron", "fLMeeIMR", "fSingleE", "fTrackHighPt", "fTrackLowPt", "fJetChHighPt", - "fJetChLowPt", "fUDdiffLarge", "fUDdiffSmall", "fITSextremeIonisation", - "fITSmildIonisation", "fH3L3Body", "fHe", "fH2"}; - -struct Candidate3body { - // Index - int mcmotherId; - int track0Id; - int track1Id; - int track2Id; - // Collision - float colCentFT0C; - // sv and candidate - bool isMatter; - float invmass; - float ct; - float cosPA; - float dcadaughters; - float dcacandtopv; - float vtxradius; - // daughter tracks - TLorentzVector lcand; - TLorentzVector lproton; - TLorentzVector lpion; - TLorentzVector lbachelor; - uint8_t dautpcNclusters[3]; // 0 - proton, 1 - pion, 2 - bachelor - uint32_t dauitsclussize[3]; // 0 - proton, 1 - pion, 2 - bachelor - float daudcaxytopv[3]; // 0 - proton, 1 - pion, 2 - bachelor - float daudcatopv[3]; // 0 - proton, 1 - pion, 2 - bachelor - float dautpcNsigma[3]; // 0 - proton, 1 - pion, 2 - bachelor - float dauinnermostR[3]; // 0 - proton, 1 - pion, 2 - bachelor !!! TracksIU required !!! - float bachelortofNsigma; - bool isBachPrimary = false; - // MC infomartion - TLorentzVector lgencand = {0, 0, 0, 0}; - float genct = -1; - float genrapidity = -999; - bool isSignal = false; - bool isReco = false; - int pdgCode = -1; - bool survivedEventSelection = false; -}; - -struct ThreebodyRecoTask { - - Produces outputDataTable; - Produces outputMCTable; - std::vector candidates3body; - std::vector filledMothers; - std::vector isGoodCollision; - - Service ccdb; - Zorro zorro; - OutputObj zorroSummary{"zorroSummary"}; - - //------------------------------------------------------------------ - PresliceUnsorted perCollisionVtx3BodyDatas = o2::aod::vtx3body::collisionId; - - // Configurable for trigger selection - Configurable triggerList{"triggerList", "fTriggerEventF1Proton, fTrackedOmega, fTrackedXi, fOmegaLargeRadius, fDoubleOmega, fOmegaHighMult, fSingleXiYN, fQuadrupleXi, fDoubleXi, fhadronOmega, fOmegaXi, fTripleXi, fOmega, fGammaVeryLowPtEMCAL, fGammaVeryLowPtDCAL, fGammaHighPtEMCAL, fGammaLowPtEMCAL, fGammaVeryHighPtDCAL, fGammaVeryHighPtEMCAL, fGammaLowPtDCAL, fJetNeutralLowPt, fJetNeutralHighPt, fGammaHighPtDCAL, fJetFullLowPt, fJetFullHighPt, fEMCALReadout, fPCMandEE, fPHOSnbar, fPCMHighPtPhoton, fPHOSPhoton, fLD, fPPPHI, fPD, fLLL, fPLL, fPPL, fPPP, fLeadingPtTrack, fHighFt0cFv0Flat, fHighFt0cFv0Mult, fHighFt0Flat, fHighFt0Mult, fHighMultFv0, fHighTrackMult, fHfSingleNonPromptCharm3P, fHfSingleNonPromptCharm2P, fHfSingleCharm3P, fHfPhotonCharm3P, fHfHighPt2P, fHfSigmaC0K0, fHfDoubleCharm2P, fHfBeauty3P, fHfFemto3P, fHfFemto2P, fHfHighPt3P, fHfSigmaCPPK, fHfDoubleCharm3P, fHfDoubleCharmMix, fHfPhotonCharm2P, fHfV0Charm2P, fHfBeauty4P, fHfV0Charm3P, fHfSingleCharm2P, fHfCharmBarToXiBach, fSingleMuHigh, fSingleMuLow, fLMeeHMR, fDiMuon, fDiElectron, fLMeeIMR, fSingleE, fTrackHighPt, fTrackLowPt, fJetChHighPt, fJetChLowPt, fUDdiffLarge, fUDdiffSmall, fITSextremeIonisation, fITSmildIonisation, fH3L3Body, fHe, fH2", "List of triggers used to select events"}; - Configurable cfgOnlyKeepInterestedTrigger{"cfgOnlyKeepInterestedTrigger", false, "Flag to keep only interested trigger"}; - Configurable bcTolerance{"bcTolerance", 100, "Tolerance for BC in Zorro"}; - // Configuration to enable like-sign analysis - Configurable cfgLikeSignAnalysis{"cfgLikeSignAnalysis", false, "Enable like-sign analysis"}; - // Selection criteria - Configurable vtxcospa{"vtxcospa", 0.99, "Vtx CosPA"}; // double -> N.B. dcos(x)/dx = 0 at x=0) - Configurable dcavtxdau{"dcavtxdau", 1.0, "DCA Vtx Daughters"}; // loose cut - Configurable dcapiontopv{"dcapiontopv", .05, "DCA Pion To PV"}; - Configurable etacut{"etacut", 0.9, "etacut"}; - Configurable rapiditycut{"rapiditycut", 1, "rapiditycut"}; - Configurable tofPIDNSigmaMin{"tofPIDNSigmaMin", -5, "tofPIDNSigmaMin"}; - Configurable tofPIDNSigmaMax{"tofPIDNSigmaMax", 5, "tofPIDNSigmaMax"}; - Configurable tpcPIDNSigmaCut{"tpcPIDNSigmaCut", 5, "tpcPIDNSigmaCut"}; - Configurable eventSel8Cut{"eventSel8Cut", true, "flag to enable event sel8 selection"}; - Configurable mcEventCut{"mcEventCut", true, "flag to enable mc event selection: kIsTriggerTVX and kNoTimeFrameBorder"}; - Configurable eventPosZCut{"eventPosZCut", true, "flag to enable event posZ selection"}; - Configurable lifetimecut{"lifetimecut", 40., "lifetimecut"}; // ct - Configurable minProtonPt{"minProtonPt", 0.3, "minProtonPt"}; - Configurable maxProtonPt{"maxProtonPt", 5, "maxProtonPt"}; - Configurable minPionPt{"minPionPt", 0.1, "minPionPt"}; - Configurable maxPionPt{"maxPionPt", 1.2, "maxPionPt"}; - Configurable minDeuteronPt{"minDeuteronPt", 0.6, "minDeuteronPt"}; - Configurable maxDeuteronPt{"maxDeuteronPt", 10, "maxDeuteronPt"}; - Configurable minDeuteronPUseTOF{"minDeuteronPUseTOF", 1, "minDeuteronPt Enable TOF PID"}; - Configurable h3LMassLowerlimit{"h3LMassLowerlimit", 2.96, "Hypertriton mass lower limit"}; - Configurable h3LMassUpperlimit{"h3LMassUpperlimit", 3.04, "Hypertriton mass upper limit"}; - Configurable mintpcNClsproton{"mintpcNClsproton", 90, "min tpc Nclusters for proton"}; - Configurable mintpcNClspion{"mintpcNClspion", 70, "min tpc Nclusters for pion"}; - Configurable mintpcNClsdeuteron{"mintpcNClsdeuteron", 100, "min tpc Nclusters for deuteron"}; - - Configurable mcsigma{"mcsigma", 0.0015, "sigma of mc invariant mass fit"}; // obtained from MC - Configurable bachelorPdgCode{"bachelorPdgCode", 1000010020, "pdgCode of bachelor daughter"}; - Configurable motherPdgCode{"motherPdgCode", 1010010030, "pdgCode of mother track"}; - - // 3sigma region for Dalitz plot - float lowersignallimit = o2::constants::physics::MassHyperTriton - 3 * mcsigma; - float uppersignallimit = o2::constants::physics::MassHyperTriton + 3 * mcsigma; - - // CCDB options - Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; - Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; - Configurable grpmagPath{"grpmagPath", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object"}; - Configurable lutPath{"lutPath", "GLO/Param/MatLUT", "Path of the Lut parametrization"}; - Configurable geoPath{"geoPath", "GLO/Config/GeometryAligned", "Path of the geometry file"}; - Configurable pidPath{"pidPath", "", "Path to the PID response object"}; - - // Zorro counting - Configurable cfgSkimmedProcessing{"cfgSkimmedProcessing", false, "Skimmed dataset processing"}; - - HistogramRegistry registry{ - "registry", - { - {"hEventCounter", "hEventCounter", {HistType::kTH1F, {{5, 0.0f, 5.0f}}}}, - {"hCentFT0C", "hCentFT0C", {HistType::kTH1F, {{100, 0.0f, 100.0f, "FT0C Centrality"}}}}, - {"hCandidatesCounter", "hCandidatesCounter", {HistType::kTH1F, {{12, 0.0f, 12.0f}}}}, - {"hMassHypertriton", "hMassHypertriton", {HistType::kTH1F, {{80, 2.96f, 3.04f}}}}, - {"hMassAntiHypertriton", "hMassAntiHypertriton", {HistType::kTH1F, {{80, 2.96f, 3.04f}}}}, - {"hMassHypertritonTotal", "hMassHypertritonTotal", {HistType::kTH1F, {{300, 2.9f, 3.2f}}}}, - {"hTOFPIDDeuteron", "hTOFPIDDeuteron", {HistType::kTH1F, {{2000, -100.0f, 100.0f}}}}, - {"hProtonTPCBB", "hProtonTPCBB", {HistType::kTH2F, {{160, -8.0f, 8.0f, "p/z(GeV/c)"}, {200, 0.0f, 1000.0f, "TPCSignal"}}}}, - {"hPionTPCBB", "hPionTPCBB", {HistType::kTH2F, {{160, -8.0f, 8.0f, "p/z(GeV/c)"}, {200, 0.0f, 1000.0f, "TPCSignal"}}}}, - {"hDeuteronTPCBB", "hDeuteronTPCBB", {HistType::kTH2F, {{160, -8.0f, 8.0f, "p/z(GeV/c)"}, {200, 0.0f, 1000.0f, "TPCSignal"}}}}, - {"hProtonTPCVsPt", "hProtonTPCVsPt", {HistType::kTH2F, {{50, 0.0f, 5.0f, "#it{p}_{T} (GeV/c)"}, {240, -6.0f, 6.0f, "TPC n#sigma"}}}}, - {"hPionTPCVsPt", "hPionTPCVsPt", {HistType::kTH2F, {{20, 0.0f, 2.0f, "#it{p}_{T} (GeV/c)"}, {240, -6.0f, 6.0f, "TPC n#sigma"}}}}, - {"hDeuteronTPCVsPt", "hDeuteronTPCVsPt", {HistType::kTH2F, {{80, 0.0f, 8.0f, "#it{p}_{T} (GeV/c)"}, {240, -6.0f, 6.0f, "TPC n#sigma"}}}}, - {"hDeuteronTOFVsPBeforeTOFCut", "hDeuteronTOFVsPBeforeTOFCut", {HistType::kTH2F, {{40, -10.0f, 10.0f, "p/z (GeV/c)"}, {40, -10.0f, 10.0f, "TOF n#sigma"}}}}, - {"hDeuteronTOFVsPAtferTOFCut", "hDeuteronTOFVsPAtferTOFCut", {HistType::kTH2F, {{40, -10.0f, 10.0f, "p/z (GeV/c)"}, {40, -10.0f, 10.0f, "TOF n#sigma"}}}}, - - {"hDalitz", "hDalitz", {HistType::kTH2F, {{120, 7.85, 8.45, "M^{2}(dp) (GeV^{2}/c^{4})"}, {60, 1.1, 1.4, "M^{2}(p#pi) (GeV^{2}/c^{4})"}}}}, - }, - }; - - //------------------------------------------------------------------ - // Fill stats histograms - enum Vtxstep { kCandAll = 0, - kCandDauEta, - kCandDauPt, - kCandTPCNcls, - kCandTPCPID, - kCandTOFPID, - kCandDcaToPV, - kCandRapidity, - kCandct, - kCandCosPA, - kCandDcaDau, - kCandInvMass, - kNCandSteps }; - - struct { - std::array candstats; - std::array truecandstats; - } statisticsRegistry; - - void resetHistos() - { - for (int ii = 0; ii < kNCandSteps; ii++) { - statisticsRegistry.candstats[ii] = 0; - statisticsRegistry.truecandstats[ii] = 0; - } - } - void fillCandCounter(int kn, bool istrue = false) - { - statisticsRegistry.candstats[kn]++; - if (istrue) { - statisticsRegistry.truecandstats[kn]++; - } - } - void fillHistos() - { - for (int ii = 0; ii < kNCandSteps; ii++) { - registry.fill(HIST("hCandidatesCounter"), ii, statisticsRegistry.candstats[ii]); - if (doprocessMC == true) { - registry.fill(HIST("hTrueHypertritonCounter"), ii, statisticsRegistry.truecandstats[ii]); - } - } - } - - int mRunNumber; - - void init(InitContext const&) - { - zorroSummary.setObject(zorro.getZorroSummary()); - - mRunNumber = 0; - - ccdb->setURL(ccdbUrl); - ccdb->setCaching(true); - ccdb->setLocalObjectValidityChecking(); - ccdb->setFatalWhenNull(false); - - registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(1, "total"); - registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(2, "sel8"); - registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(3, "vertexZ"); - registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(4, "Zorro H3L 3body event"); - registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(5, "has Candidate"); - - // Check for selection criteria !!! TracksIU required !!! - registry.add("hDiffRVtxProton", "hDiffRVtxProton", HistType::kTH1F, {{100, -10, 10}}); // difference between the radius of decay vertex and minR of proton - registry.add("hDiffRVtxPion", "hDiffRVtxPion", HistType::kTH1F, {{100, -10, 10}}); // difference between the radius of decay vertex and minR of pion - registry.add("hDiffRVtxDeuteron", "hDiffRVtxDeuteron", HistType::kTH1F, {{100, -10, 10}}); // difference between the radius of decay vertex and minR of deuteron - registry.add("hDiffDaughterR", "hDiffDaughterR", HistType::kTH1F, {{10000, -100, 100}}); // difference between minR of pion&proton and R of deuteron(bachelor) - - // Check triggers - auto hEventTriggerCount = registry.add("hEventTriggerCount", "hEventTriggerCount", HistType::kTH1F, {{static_cast(triggerLabels.size() + 1), 0, static_cast(triggerLabels.size() + 1)}}); - for (size_t i = 0; i < triggerLabels.size(); i++) { - hEventTriggerCount->GetXaxis()->SetBinLabel(i + 1, triggerLabels[i].c_str()); - } - hEventTriggerCount->GetXaxis()->SetBinLabel(triggerLabels.size() + 1, "NoTrigger"); - - if (cfgLikeSignAnalysis) { - registry.add("hInvMassCorrectSign", "hInvMassCorrectSign", HistType::kTH1F, {{80, 2.96f, 3.04f}}); // check if there are contamination of possible signals which are caused by unexpected PID - } - - if (doprocessMC == true) { - registry.add("hTrueHypertritonCounter", "hTrueHypertritonCounter", HistType::kTH1F, {{12, 0.0f, 12.0f}}); - auto hGeneratedHypertritonCounter = registry.add("hGeneratedHypertritonCounter", "hGeneratedHypertritonCounter", HistType::kTH1F, {{2, 0.0f, 2.0f}}); - hGeneratedHypertritonCounter->GetXaxis()->SetBinLabel(1, "Total"); - hGeneratedHypertritonCounter->GetXaxis()->SetBinLabel(2, "3-body decay"); - registry.add("hPtGeneratedHypertriton", "hPtGeneratedHypertriton", HistType::kTH1F, {{200, 0.0f, 10.0f}}); - registry.add("hctGeneratedHypertriton", "hctGeneratedHypertriton", HistType::kTH1F, {{50, 0, 50, "ct(cm)"}}); - registry.add("hEtaGeneratedHypertriton", "hEtaGeneratedHypertriton", HistType::kTH1F, {{40, -2.0f, 2.0f}}); - registry.add("hRapidityGeneratedHypertriton", "hRapidityGeneratedHypertriton", HistType::kTH1F, {{40, -2.0f, 2.0f}}); - registry.add("hPtGeneratedAntiHypertriton", "hPtGeneratedAntiHypertriton", HistType::kTH1F, {{200, 0.0f, 10.0f}}); - registry.add("hctGeneratedAntiHypertriton", "hctGeneratedAntiHypertriton", HistType::kTH1F, {{50, 0, 50, "ct(cm)"}}); - registry.add("hEtaGeneratedAntiHypertriton", "hEtaGeneratedAntiHypertriton", HistType::kTH1F, {{40, -2.0f, 2.0f}}); - registry.add("hRapidityGeneratedAntiHypertriton", "hRapidityGeneratedAntiHypertriton", HistType::kTH1F, {{40, -2.0f, 2.0f}}); - } - - TString candCounterbinLabel[kNCandSteps] = {"Total", "TrackEta", "DauPt", "TPCNcls", "TPCPID", "d TOFPID", "PionDcatoPV", "MomRapidity", "Lifetime", "VtxCosPA", "VtxDcaDau", "InvMass"}; - for (int i{0}; i < kNCandSteps; i++) { - registry.get(HIST("hCandidatesCounter"))->GetXaxis()->SetBinLabel(i + 1, candCounterbinLabel[i]); - if (doprocessMC == true) { - registry.get(HIST("hTrueHypertritonCounter"))->GetXaxis()->SetBinLabel(i + 1, candCounterbinLabel[i]); - } - } - } - - void initCCDB(aod::BCsWithTimestamps::iterator const& bc) - { - if (mRunNumber == bc.runNumber()) { - return; - } - - if (cfgSkimmedProcessing) { - zorro.initCCDB(ccdb.service, bc.runNumber(), bc.timestamp(), triggerList); - zorro.populateHistRegistry(registry, bc.runNumber()); - } - - LOGF(info, "Initializing CCDB for run %d", bc.runNumber()); - mRunNumber = bc.runNumber(); - } - - //------------------------------------------------------------------ - // Check if the mcparticle is hypertriton which decays into 3 daughters - template - bool is3bodyDecayed(TMCParticle const& particle) - { - if (std::abs(particle.pdgCode()) != motherPdgCode) { - return false; - } - bool haveProton = false, havePion = false, haveBachelor = false; - bool haveAntiProton = false, haveAntiPion = false, haveAntiBachelor = false; - for (const auto& mcparticleDaughter : particle.template daughters_as()) { - if (mcparticleDaughter.pdgCode() == PDG_t::kProton) - haveProton = true; - if (mcparticleDaughter.pdgCode() == PDG_t::kProtonBar) - haveAntiProton = true; - if (mcparticleDaughter.pdgCode() == PDG_t::kPiPlus) - havePion = true; - if (mcparticleDaughter.pdgCode() == PDG_t::kPiMinus) - haveAntiPion = true; - if (mcparticleDaughter.pdgCode() == bachelorPdgCode) - haveBachelor = true; - if (mcparticleDaughter.pdgCode() == -bachelorPdgCode) - haveAntiBachelor = true; - } - if (haveProton && haveAntiPion && haveBachelor && particle.pdgCode() > 0) { - return true; - } else if (haveAntiProton && havePion && haveAntiBachelor && particle.pdgCode() < 0) { - return true; - } - return false; - } - - //------------------------------------------------------------------ - // Event Selection - template - bool eventSelection(TCollision const& collision) - { - auto bc = collision.template bc_as(); - initCCDB(bc); - registry.fill(HIST("hEventCounter"), 0.5); - - if (eventSel8Cut && !collision.sel8()) { - return false; - } - registry.fill(HIST("hEventCounter"), 1.5); - if (eventPosZCut && std::abs(collision.posZ()) > 10.f) { // 10cm - return false; - } - registry.fill(HIST("hEventCounter"), 2.5); - registry.fill(HIST("hCentFT0C"), collision.centFT0C()); - - if (cfgSkimmedProcessing) { - bool zorroSelected = zorro.isSelected(bc.globalBC()); /// Just let Zorro do the accounting - if (zorroSelected) { - registry.fill(HIST("hEventCounter"), 3.5); - } else { - if (cfgOnlyKeepInterestedTrigger) { - return false; - } - } - } - - return true; - } - - //------------------------------------------------------------------ - // Fill candidate table - template - void fillCand(TCollisionTable const& collision, TCandTable const& candData, TTrackTable const& trackProton, TTrackTable const& trackPion, TTrackTable const& trackDeuteron, bool isMatter, bool isTrueCand = false, int lLabel = -1, TLorentzVector lmother = {0, 0, 0, 0}, double mcLifetime = -1, bool isBachPrimary = false) - { - double cospa = candData.vtxcosPA(collision.posX(), collision.posY(), collision.posZ()); - double ct = candData.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassHyperTriton; - - Candidate3body cand3body; - cand3body.isMatter = isMatter; - if (isMatter == true) { - cand3body.lproton.SetXYZM(candData.pxtrack0(), candData.pytrack0(), candData.pztrack0(), o2::constants::physics::MassProton); - cand3body.lpion.SetXYZM(candData.pxtrack1(), candData.pytrack1(), candData.pztrack1(), o2::constants::physics::MassPionCharged); - } else { - cand3body.lproton.SetXYZM(candData.pxtrack1(), candData.pytrack1(), candData.pztrack1(), o2::constants::physics::MassPionCharged); - cand3body.lpion.SetXYZM(candData.pxtrack0(), candData.pytrack0(), candData.pztrack0(), o2::constants::physics::MassProton); - } - - cand3body.mcmotherId = lLabel; - cand3body.track0Id = candData.track0Id(); - cand3body.track1Id = candData.track1Id(); - cand3body.track2Id = candData.track2Id(); - cand3body.colCentFT0C = collision.centFT0C(); - cand3body.invmass = cand3body.isMatter ? candData.mHypertriton() : candData.mAntiHypertriton(); - cand3body.lcand.SetXYZM(candData.px(), candData.py(), candData.pz(), o2::constants::physics::MassHyperTriton); - cand3body.ct = ct; - cand3body.cosPA = cospa; - cand3body.dcadaughters = candData.dcaVtxdaughters(); - cand3body.dcacandtopv = candData.dcavtxtopv(collision.posX(), collision.posY(), collision.posZ()); - cand3body.vtxradius = candData.vtxradius(); - cand3body.lbachelor.SetXYZM(candData.pxtrack2(), candData.pytrack2(), candData.pztrack2(), o2::constants::physics::MassDeuteron); - cand3body.dautpcNclusters[0] = trackProton.tpcNClsFound(); - cand3body.dautpcNclusters[1] = trackPion.tpcNClsFound(); - cand3body.dautpcNclusters[2] = trackDeuteron.tpcNClsFound(); - cand3body.dauitsclussize[0] = trackProton.itsClusterSizes(); - cand3body.dauitsclussize[1] = trackPion.itsClusterSizes(); - cand3body.dauitsclussize[2] = trackDeuteron.itsClusterSizes(); - cand3body.dautpcNsigma[0] = trackProton.tpcNSigmaPr(); - cand3body.dautpcNsigma[1] = trackPion.tpcNSigmaPi(); - cand3body.dautpcNsigma[2] = trackDeuteron.tpcNSigmaDe(); - cand3body.daudcaxytopv[0] = cand3body.isMatter ? candData.dcaXYtrack0topv() : candData.dcaXYtrack1topv(); - cand3body.daudcaxytopv[1] = cand3body.isMatter ? candData.dcaXYtrack1topv() : candData.dcaXYtrack0topv(); - cand3body.daudcaxytopv[2] = candData.dcaXYtrack2topv(); - cand3body.daudcatopv[0] = cand3body.isMatter ? candData.dcatrack0topv() : candData.dcatrack1topv(); - cand3body.daudcatopv[1] = cand3body.isMatter ? candData.dcatrack1topv() : candData.dcatrack0topv(); - cand3body.daudcatopv[2] = candData.dcatrack2topv(); - cand3body.dauinnermostR[0] = trackProton.x(); - cand3body.dauinnermostR[1] = trackPion.x(); - cand3body.dauinnermostR[2] = trackDeuteron.x(); - - cand3body.bachelortofNsigma = candData.tofNSigmaBachDe(); - cand3body.isBachPrimary = isBachPrimary; - if (isTrueCand) { - cand3body.mcmotherId = lLabel; - cand3body.lgencand = lmother; - cand3body.genct = mcLifetime; - cand3body.genrapidity = lmother.Rapidity(); - cand3body.isSignal = true; - cand3body.isReco = true; - cand3body.pdgCode = cand3body.isMatter ? motherPdgCode : -motherPdgCode; - cand3body.survivedEventSelection = true; - filledMothers.push_back(lLabel); - } - - candidates3body.push_back(cand3body); - - registry.fill(HIST("hProtonTPCBB"), trackProton.sign() * trackProton.p(), trackProton.tpcSignal()); - registry.fill(HIST("hPionTPCBB"), trackPion.sign() * trackPion.p(), trackPion.tpcSignal()); - registry.fill(HIST("hDeuteronTPCBB"), trackDeuteron.sign() * trackDeuteron.p(), trackDeuteron.tpcSignal()); - registry.fill(HIST("hProtonTPCVsPt"), trackProton.pt(), trackProton.tpcNSigmaPr()); - registry.fill(HIST("hPionTPCVsPt"), trackProton.pt(), trackPion.tpcNSigmaPi()); - registry.fill(HIST("hDeuteronTPCVsPt"), trackDeuteron.pt(), trackDeuteron.tpcNSigmaDe()); - registry.fill(HIST("hTOFPIDDeuteron"), candData.tofNSigmaBachDe()); - registry.fill(HIST("hDiffRVtxProton"), trackProton.x() - candData.vtxradius()); - registry.fill(HIST("hDiffRVtxPion"), trackPion.x() - candData.vtxradius()); - registry.fill(HIST("hDiffRVtxDeuteron"), trackDeuteron.x() - candData.vtxradius()); - float diffTrackR = trackDeuteron.x() - std::min(trackProton.x(), trackPion.x()); - registry.fill(HIST("hDiffDaughterR"), diffTrackR); - } - - //------------------------------------------------------------------ - // Selections for candidates - template - bool selectCand(TCollisionTable const& collision, TCandTable const& candData, TTrackTable const& trackProton, TTrackTable const& trackPion, TTrackTable const& trackDeuteron, bool isMatter, bool isTrueCand = false) - { - fillCandCounter(kCandAll, isTrueCand); - - // Selection on daughters - if (std::abs(trackProton.eta()) > etacut || std::abs(trackPion.eta()) > etacut || std::abs(trackDeuteron.eta()) > etacut) { - return false; - } - fillCandCounter(kCandDauEta, isTrueCand); - - if (trackProton.pt() < minProtonPt || trackProton.pt() > maxProtonPt || trackPion.pt() < minPionPt || trackPion.pt() > maxPionPt || trackDeuteron.pt() < minDeuteronPt || trackDeuteron.pt() > maxDeuteronPt) { - return false; - } - fillCandCounter(kCandDauPt, isTrueCand); - - if (trackProton.tpcNClsFound() < mintpcNClsproton || trackPion.tpcNClsFound() < mintpcNClspion || trackDeuteron.tpcNClsFound() < mintpcNClsdeuteron) { - return false; - } - fillCandCounter(kCandTPCNcls, isTrueCand); - - if (std::abs(trackProton.tpcNSigmaPr()) > tpcPIDNSigmaCut || std::abs(trackPion.tpcNSigmaPi()) > tpcPIDNSigmaCut || std::abs(trackDeuteron.tpcNSigmaDe()) > tpcPIDNSigmaCut) { - return false; - } - fillCandCounter(kCandTPCPID, isTrueCand); - - registry.fill(HIST("hDeuteronTOFVsPBeforeTOFCut"), trackDeuteron.sign() * trackDeuteron.p(), candData.tofNSigmaBachDe()); - if ((candData.tofNSigmaBachDe() < tofPIDNSigmaMin || candData.tofNSigmaBachDe() > tofPIDNSigmaMax) && trackDeuteron.p() > minDeuteronPUseTOF) { - return false; - } - fillCandCounter(kCandTOFPID, isTrueCand); - registry.fill(HIST("hDeuteronTOFVsPAtferTOFCut"), trackDeuteron.sign() * trackDeuteron.p(), candData.tofNSigmaBachDe()); - - double dcapion = isMatter ? candData.dcatrack1topv() : candData.dcatrack0topv(); - if (std::abs(dcapion) < dcapiontopv) { - return false; - } - fillCandCounter(kCandDcaToPV, isTrueCand); - - // Selection on candidate hypertriton - if (std::abs(candData.yHypertriton()) > rapiditycut) { - return false; - } - fillCandCounter(kCandRapidity, isTrueCand); - - double ct = candData.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassHyperTriton; - if (ct > lifetimecut) { - return false; - } - fillCandCounter(kCandct, isTrueCand); - - double cospa = candData.vtxcosPA(collision.posX(), collision.posY(), collision.posZ()); - if (cospa < vtxcospa) { - return false; - } - fillCandCounter(kCandCosPA, isTrueCand); - - if (candData.dcaVtxdaughters() > dcavtxdau) { - return false; - } - fillCandCounter(kCandDcaDau, isTrueCand); - - if ((isMatter && candData.mHypertriton() > h3LMassLowerlimit && candData.mHypertriton() < h3LMassUpperlimit)) { - // Hypertriton - registry.fill(HIST("hMassHypertriton"), candData.mHypertriton()); - registry.fill(HIST("hMassHypertritonTotal"), candData.mHypertriton()); - if (candData.mHypertriton() > lowersignallimit && candData.mHypertriton() < uppersignallimit) { - registry.fill(HIST("hDalitz"), RecoDecay::m2(std::array{std::array{candData.pxtrack0(), candData.pytrack0(), candData.pztrack0()}, std::array{candData.pxtrack2(), candData.pytrack2(), candData.pztrack2()}}, std::array{o2::constants::physics::MassProton, o2::constants::physics::MassDeuteron}), RecoDecay::m2(std::array{std::array{candData.pxtrack0(), candData.pytrack0(), candData.pztrack0()}, std::array{candData.pxtrack1(), candData.pytrack1(), candData.pztrack1()}}, std::array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged})); - } - } else if ((!isMatter && candData.mAntiHypertriton() > h3LMassLowerlimit && candData.mAntiHypertriton() < h3LMassUpperlimit)) { - // AntiHypertriton - registry.fill(HIST("hMassAntiHypertriton"), candData.mAntiHypertriton()); - registry.fill(HIST("hMassHypertritonTotal"), candData.mAntiHypertriton()); - if (candData.mAntiHypertriton() > lowersignallimit && candData.mAntiHypertriton() < uppersignallimit) { - registry.fill(HIST("hDalitz"), RecoDecay::m2(std::array{std::array{candData.pxtrack1(), candData.pytrack1(), candData.pztrack1()}, std::array{candData.pxtrack2(), candData.pytrack2(), candData.pztrack2()}}, std::array{o2::constants::physics::MassProton, o2::constants::physics::MassDeuteron}), RecoDecay::m2(std::array{std::array{candData.pxtrack1(), candData.pytrack1(), candData.pztrack1()}, std::array{candData.pxtrack0(), candData.pytrack0(), candData.pztrack0()}}, std::array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged})); - } - } else { - return false; - } - fillCandCounter(kCandInvMass, isTrueCand); - - return true; - } - - //------------------------------------------------------------------ - // Analysis process for a single candidate - template - void candidateAnalysis(TCollisionTable const& collision, TCandTable const& candData, bool& ifHasCandidate, bool isTrueCand = false, int lLabel = -1, TLorentzVector lmother = {0, 0, 0, 0}, double mcLifetime = -1, double isBachPrimary = false) - { - auto track0 = candData.template track0_as(); - auto track1 = candData.template track1_as(); - auto track2 = candData.template track2_as(); - - bool isMatter = track2.sign() > 0; // true if the candidate is hypertriton (p pi- d) - - auto& trackProton = isMatter ? track0 : track1; - auto& trackPion = isMatter ? track1 : track0; - auto& trackDeuteron = track2; - - if (selectCand(collision, candData, trackProton, trackPion, trackDeuteron, isMatter, isTrueCand)) { - ifHasCandidate = true; - fillCand(collision, candData, trackProton, trackPion, trackDeuteron, isMatter, isTrueCand, lLabel, lmother, mcLifetime, isBachPrimary); - } - } - - //------------------------------------------------------------------ - // Analysis process for like-sign candidates : (p pi- anti-d) or (anti-p pi+ d) - template - void likeSignAnalysis(TCollisionTable const& collision, TCandTable const& candData, bool& ifHasCandidate, bool isTrueCand = false, int lLabel = -1, TLorentzVector lmother = {0, 0, 0, 0}, double mcLifetime = -1, double isBachPrimary = false) - { - auto track0 = candData.template track0_as(); - auto track1 = candData.template track1_as(); - auto track2 = candData.template track2_as(); - - bool isMatter = track2.sign() < 0; // true if seach for background consists of (p pi- anti-d) - - // Assume proton has an oppisite charge with deuteron - auto& trackProton = isMatter ? track0 : track1; - auto& trackPion = isMatter ? track1 : track0; - auto& trackDeuteron = track2; - - if (selectCand(collision, candData, trackProton, trackPion, trackDeuteron, isMatter, isTrueCand)) { - ifHasCandidate = true; - fillCand(collision, candData, trackProton, trackPion, trackDeuteron, isMatter, isTrueCand, lLabel, lmother, mcLifetime, isBachPrimary); - // QA for if signals have the possibility to be reconginzed as a like-sign background - if (isMatter) { - registry.fill(HIST("hInvMassCorrectSign"), candData.mHypertriton()); - } else { - registry.fill(HIST("hInvMassCorrectSign"), candData.mAntiHypertriton()); - } - } - } - - //------------------------------------------------------------------ - // Analysis process for reduced data - template - void reducedAnalysis(TCollisionTable const& collision, TCandTable const& candData, TTracks tracks, bool isTrueCand = false, int lLabel = -1, TLorentzVector lmother = {0, 0, 0, 0}, double mcLifetime = -1, double isBachPrimary = false) - { - auto track0 = tracks.rawIteratorAt(candData.track0Id()); - auto track1 = tracks.rawIteratorAt(candData.track1Id()); - auto track2 = tracks.rawIteratorAt(candData.track2Id()); - - bool isMatter = track2.sign() > 0; // true if the candidate is hypertriton (p pi- d) - - auto& trackProton = isMatter ? track0 : track1; - auto& trackPion = isMatter ? track1 : track0; - auto& trackDeuteron = track2; - - if (selectCand(collision, candData, trackProton, trackPion, trackDeuteron, isMatter, isTrueCand)) { - fillCand(collision, candData, trackProton, trackPion, trackDeuteron, isMatter, isTrueCand, lLabel, lmother, mcLifetime, isBachPrimary); - } - } - - //------------------------------------------------------------------ - // Analysis process for reduced data with like-sign candidates - template - void reducedLikeSignAnalysis(TCollisionTable const& collision, TCandTable const& candData, TTracks tracks, bool isTrueCand = false, int lLabel = -1, TLorentzVector lmother = {0, 0, 0, 0}, double mcLifetime = -1, bool isBachPrimary = false) - { - auto track0 = tracks.rawIteratorAt(candData.track0Id()); - auto track1 = tracks.rawIteratorAt(candData.track1Id()); - auto track2 = tracks.rawIteratorAt(candData.track2Id()); - - bool isMatter = track2.sign() < 0; // true if seach for background consists of (p pi- anti-d) - - // Assume proton has an oppisite charge with deuteron - auto& trackProton = isMatter ? track0 : track1; - auto& trackPion = isMatter ? track1 : track0; - auto& trackDeuteron = track2; - - if (selectCand(collision, candData, trackProton, trackPion, trackDeuteron, isMatter, isTrueCand)) { - fillCand(collision, candData, trackProton, trackPion, trackDeuteron, isMatter, isTrueCand, lLabel, lmother, mcLifetime, isBachPrimary); - // QA for if signals have the possibility to be reconginzed as a like-sign background - if (isMatter) { - registry.fill(HIST("hInvMassCorrectSign"), candData.mHypertriton()); - } else { - registry.fill(HIST("hInvMassCorrectSign"), candData.mAntiHypertriton()); - } - } - } - - //------------------------------------------------------------------ - void fillOutputDataTable(Candidate3body const& cand3body) - { - outputDataTable(cand3body.colCentFT0C, - cand3body.isMatter, cand3body.invmass, cand3body.lcand.P(), cand3body.lcand.Pt(), cand3body.ct, - cand3body.cosPA, cand3body.dcadaughters, cand3body.dcacandtopv, cand3body.vtxradius, - cand3body.lproton.Pt(), cand3body.lproton.Eta(), cand3body.lproton.Phi(), cand3body.dauinnermostR[0], - cand3body.lpion.Pt(), cand3body.lpion.Eta(), cand3body.lpion.Phi(), cand3body.dauinnermostR[1], - cand3body.lbachelor.Pt(), cand3body.lbachelor.Eta(), cand3body.lbachelor.Phi(), cand3body.dauinnermostR[2], - cand3body.dautpcNclusters[0], cand3body.dautpcNclusters[1], cand3body.dautpcNclusters[2], - cand3body.dauitsclussize[0], cand3body.dauitsclussize[1], cand3body.dauitsclussize[2], - cand3body.dautpcNsigma[0], cand3body.dautpcNsigma[1], cand3body.dautpcNsigma[2], cand3body.bachelortofNsigma, - cand3body.daudcaxytopv[0], cand3body.daudcaxytopv[1], cand3body.daudcaxytopv[2], - cand3body.daudcatopv[0], cand3body.daudcatopv[1], cand3body.daudcatopv[2]); - } - - //------------------------------------------------------------------ - // collect information for generated hypertriton (should be called after event selection) - void getGeneratedH3LInfo(aod::McParticles const& particlesMC) - { - for (const auto& mcparticle : particlesMC) { - if (std::abs(mcparticle.pdgCode()) != motherPdgCode) { - continue; - } - registry.fill(HIST("hGeneratedHypertritonCounter"), 0.5); - - bool haveProton = false, havePionPlus = false, haveDeuteron = false; - bool haveAntiProton = false, havePionMinus = false, haveAntiDeuteron = false; - double mcLifetime = -1; - for (const auto& mcparticleDaughter : mcparticle.template daughters_as()) { - if (mcparticleDaughter.pdgCode() == PDG_t::kProton) - haveProton = true; - if (mcparticleDaughter.pdgCode() == PDG_t::kProtonBar) - haveAntiProton = true; - if (mcparticleDaughter.pdgCode() == PDG_t::kPiPlus) - havePionPlus = true; - if (mcparticleDaughter.pdgCode() == -PDG_t::kPiPlus) - havePionMinus = true; - if (mcparticleDaughter.pdgCode() == bachelorPdgCode) { - haveDeuteron = true; - mcLifetime = RecoDecay::sqrtSumOfSquares(mcparticleDaughter.vx() - mcparticle.vx(), mcparticleDaughter.vy() - mcparticle.vy(), mcparticleDaughter.vz() - mcparticle.vz()) * o2::constants::physics::MassHyperTriton / mcparticle.p(); - } - if (mcparticleDaughter.pdgCode() == -bachelorPdgCode) { - haveAntiDeuteron = true; - mcLifetime = RecoDecay::sqrtSumOfSquares(mcparticleDaughter.vx() - mcparticle.vx(), mcparticleDaughter.vy() - mcparticle.vy(), mcparticleDaughter.vz() - mcparticle.vz()) * o2::constants::physics::MassHyperTriton / mcparticle.p(); - } - } - if (haveProton && havePionMinus && haveDeuteron && mcparticle.pdgCode() == motherPdgCode) { - registry.fill(HIST("hGeneratedHypertritonCounter"), 1.5); - registry.fill(HIST("hPtGeneratedHypertriton"), mcparticle.pt()); - registry.fill(HIST("hctGeneratedHypertriton"), mcLifetime); - registry.fill(HIST("hEtaGeneratedHypertriton"), mcparticle.eta()); - registry.fill(HIST("hRapidityGeneratedHypertriton"), mcparticle.y()); - } else if (haveAntiProton && havePionPlus && haveAntiDeuteron && mcparticle.pdgCode() == -motherPdgCode) { - registry.fill(HIST("hGeneratedHypertritonCounter"), 1.5); - registry.fill(HIST("hPtGeneratedAntiHypertriton"), mcparticle.pt()); - registry.fill(HIST("hctGeneratedAntiHypertriton"), mcLifetime); - registry.fill(HIST("hEtaGeneratedAntiHypertriton"), mcparticle.eta()); - registry.fill(HIST("hRapidityGeneratedAntiHypertriton"), mcparticle.y()); - } - } - } - - //------------------------------------------------------------------ - // process real data analysis - void processData(soa::Join const& collisions, aod::Vtx3BodyDatas const& vtx3bodydatas, FullTracksExtIU const&, aod::BCsWithTimestamps const&) - { - for (const auto& collision : collisions) { - candidates3body.clear(); - - if (!eventSelection(collision)) { - continue; - } - - bool ifHasCandidate = false; - auto d3BodyCands = vtx3bodydatas.sliceBy(perCollisionVtx3BodyDatas, collision.globalIndex()); - for (const auto& vtx : d3BodyCands) { - if (cfgLikeSignAnalysis) { - likeSignAnalysis(collision, vtx, ifHasCandidate); - } else { - candidateAnalysis(collision, vtx, ifHasCandidate); - } - } - - if (ifHasCandidate) { - auto bc = collision.bc_as(); - auto triggerSelection = zorro.getTriggerOfInterestResults(bc.globalBC(), bcTolerance); - for (size_t i = 0; i < triggerSelection.size(); i++) { - if (triggerSelection[i]) { - registry.fill(HIST("hEventTriggerCount"), i + 0.5); - } - } - if (zorro.isNotSelectedByAny(bc.globalBC(), bcTolerance)) { - registry.fill(HIST("hEventTriggerCount"), triggerLabels.size() + 0.5); - } - registry.fill(HIST("hEventCounter"), 4.5); - } - fillHistos(); - resetHistos(); - - for (const auto& cand3body : candidates3body) { - fillOutputDataTable(cand3body); - } - } - } - PROCESS_SWITCH(ThreebodyRecoTask, processData, "Real data reconstruction", true); - - //------------------------------------------------------------------ - // process reduced data analysis - void processReducedData(ReducedCols const& collisions, aod::Vtx3BodyDatas const& vtx3bodydatas, aod::RedIUTracks const& tracks) - { - candidates3body.clear(); - - registry.fill(HIST("hEventCounter"), 0.5, collisions.size()); - - for (const auto& vtx : vtx3bodydatas) { - const auto& collision = collisions.iteratorAt(vtx.collisionId()); - if (cfgLikeSignAnalysis) { - reducedLikeSignAnalysis(collision, vtx, tracks); - } else { - reducedAnalysis(collision, vtx, tracks); - } - for (const auto& cand3body : candidates3body) { - fillOutputDataTable(cand3body); - } - candidates3body.clear(); - } - fillHistos(); - resetHistos(); - } - PROCESS_SWITCH(ThreebodyRecoTask, processReducedData, "Reduced data reconstruction", false); - - //------------------------------------------------------------------ - // process mc analysis - void processMC(soa::Join const& collisions, aod::Vtx3BodyDatas const& vtx3bodydatas, aod::McParticles const& particlesMC, MCLabeledTracksIU const& /*tracks*/, aod::McCollisions const& mcCollisions) - { - filledMothers.clear(); - getGeneratedH3LInfo(particlesMC); - isGoodCollision.resize(mcCollisions.size(), false); - - for (const auto& collision : collisions) { - candidates3body.clear(); - registry.fill(HIST("hEventCounter"), 0.5); - if (mcEventCut && (!collision.selection_bit(aod::evsel::kIsTriggerTVX) || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder))) { - continue; - } - registry.fill(HIST("hEventCounter"), 1.5); - if (eventPosZCut && std::abs(collision.posZ()) > 10.f) { // 10cm - continue; - } - registry.fill(HIST("hEventCounter"), 2.5); - registry.fill(HIST("hCentFT0C"), collision.centFT0C()); - - if (collision.mcCollisionId() >= 0) { - isGoodCollision[collision.mcCollisionId()] = true; - } - - bool ifHasCandidate = false; - auto vtxsThisCol = vtx3bodydatas.sliceBy(perCollisionVtx3BodyDatas, collision.globalIndex()); - - for (const auto& vtx : vtxsThisCol) { - bool isBachPrimary = false; - int lLabel = -1; - int lPDG = -1; - double mcLifetime = -1; - TLorentzVector lmother; - bool isTrueCand = false; - auto track0 = vtx.track0_as(); - auto track1 = vtx.track1_as(); - auto track2 = vtx.track2_as(); - if (track0.has_mcParticle() && track1.has_mcParticle() && track2.has_mcParticle()) { - auto lMCTrack0 = track0.mcParticle_as(); - auto lMCTrack1 = track1.mcParticle_as(); - auto lMCTrack2 = track2.mcParticle_as(); - - if (lMCTrack2.isPhysicalPrimary()) { - isBachPrimary = true; - } - - if (lMCTrack0.has_mothers() && lMCTrack1.has_mothers() && lMCTrack2.has_mothers()) { - for (const auto& lMother0 : lMCTrack0.mothers_as()) { - for (const auto& lMother1 : lMCTrack1.mothers_as()) { - for (const auto& lMother2 : lMCTrack2.mothers_as()) { - if (lMother0.globalIndex() == lMother1.globalIndex() && lMother0.globalIndex() == lMother2.globalIndex()) { - lLabel = lMother0.globalIndex(); - lPDG = lMother0.pdgCode(); - if ((lPDG == motherPdgCode && lMCTrack0.pdgCode() == PDG_t::kProton && lMCTrack1.pdgCode() == PDG_t::kPiMinus && lMCTrack2.pdgCode() == bachelorPdgCode) || - (lPDG == -motherPdgCode && lMCTrack0.pdgCode() == PDG_t::kPiPlus && lMCTrack1.pdgCode() == PDG_t::kProtonBar && lMCTrack2.pdgCode() == -bachelorPdgCode)) { - isTrueCand = true; - mcLifetime = RecoDecay::sqrtSumOfSquares(lMCTrack2.vx() - lMother2.vx(), lMCTrack2.vy() - lMother2.vy(), lMCTrack2.vz() - lMother2.vz()) * o2::constants::physics::MassHyperTriton / lMother2.p(); - lmother.SetXYZM(lMother0.px(), lMother0.py(), lMother0.pz(), o2::constants::physics::MassHyperTriton); - } - } - } - } - } - } - } - - candidateAnalysis(collision, vtx, ifHasCandidate, isTrueCand, lLabel, lmother, mcLifetime, isBachPrimary); - } - - if (ifHasCandidate) - registry.fill(HIST("hEventCounter"), 4.5); - fillHistos(); - resetHistos(); - - for (const auto& cand3body : candidates3body) { - outputMCTable(cand3body.colCentFT0C, - cand3body.isMatter, cand3body.invmass, cand3body.lcand.P(), cand3body.lcand.Pt(), cand3body.ct, - cand3body.cosPA, cand3body.dcadaughters, cand3body.dcacandtopv, cand3body.vtxradius, - cand3body.lproton.Pt(), cand3body.lproton.Eta(), cand3body.lproton.Phi(), cand3body.dauinnermostR[0], - cand3body.lpion.Pt(), cand3body.lpion.Eta(), cand3body.lpion.Phi(), cand3body.dauinnermostR[1], - cand3body.lbachelor.Pt(), cand3body.lbachelor.Eta(), cand3body.lbachelor.Phi(), cand3body.dauinnermostR[2], - cand3body.dautpcNclusters[0], cand3body.dautpcNclusters[1], cand3body.dautpcNclusters[2], - cand3body.dauitsclussize[0], cand3body.dauitsclussize[1], cand3body.dauitsclussize[2], - cand3body.dautpcNsigma[0], cand3body.dautpcNsigma[1], cand3body.dautpcNsigma[2], cand3body.bachelortofNsigma, - cand3body.daudcaxytopv[0], cand3body.daudcaxytopv[1], cand3body.daudcaxytopv[2], - cand3body.daudcatopv[0], cand3body.daudcatopv[1], cand3body.daudcatopv[2], - cand3body.isBachPrimary, - cand3body.lgencand.P(), cand3body.lgencand.Pt(), cand3body.genct, cand3body.lgencand.Phi(), cand3body.lgencand.Eta(), cand3body.lgencand.Rapidity(), - cand3body.isSignal, cand3body.isReco, cand3body.pdgCode, cand3body.survivedEventSelection); - } - } - - // now we fill only the signal candidates that were not reconstructed - for (const auto& mcparticle : particlesMC) { - if (!is3bodyDecayed(mcparticle)) { - continue; - } - if (std::find(filledMothers.begin(), filledMothers.end(), mcparticle.globalIndex()) != std::end(filledMothers)) { - continue; - } - bool isSurEvSelection = isGoodCollision[mcparticle.mcCollisionId()]; - std::array posSV{0.f}; - for (const auto& mcDaughter : mcparticle.daughters_as()) { - if (std::abs(mcDaughter.pdgCode()) == bachelorPdgCode) { - posSV = {mcDaughter.vx(), mcDaughter.vy(), mcDaughter.vz()}; - } - } - double mcLifetime = RecoDecay::sqrtSumOfSquares(posSV[0] - mcparticle.vx(), posSV[1] - mcparticle.vy(), posSV[2] - mcparticle.vz()) * o2::constants::physics::MassHyperTriton / mcparticle.p(); - outputMCTable(-1, - -1, -1, -1, -1, -1, - -1, -1, -1, -1, - -1, -1, -1, -1, - -1, -1, -1, -1, - -1, -1, -1, -1, - -1, -1, -1, - -1, -1, -1, - -1, -1, -1, -1, - -1, -1, -1, - -1, -1, -1, - false, - mcparticle.p(), mcparticle.pt(), mcLifetime, mcparticle.phi(), mcparticle.eta(), mcparticle.y(), - true, false, mcparticle.pdgCode(), isSurEvSelection); - } - } - PROCESS_SWITCH(ThreebodyRecoTask, processMC, "MC reconstruction", false); -}; - -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - return WorkflowSpec{ - adaptAnalysisTask(cfgc), - }; -} diff --git a/PWGLF/Tasks/Nuspex/CMakeLists.txt b/PWGLF/Tasks/Nuspex/CMakeLists.txt index b2af549c871..895e15935fc 100644 --- a/PWGLF/Tasks/Nuspex/CMakeLists.txt +++ b/PWGLF/Tasks/Nuspex/CMakeLists.txt @@ -24,16 +24,6 @@ o2physics_add_dpl_workflow(nuclei-hist PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(hypertriton3bodyanalysis - SOURCES hypertriton3bodyanalysis.cxx - PUBLIC_LINK_LIBRARIES O2::DCAFitter O2Physics::AnalysisCore - COMPONENT_NAME Analysis) - -o2physics_add_dpl_workflow(hypertriton3bodymcqa - SOURCES hypertriton3bodyMcqa.cxx - PUBLIC_LINK_LIBRARIES O2::DCAFitter O2Physics::AnalysisCore O2::TOFBase - COMPONENT_NAME Analysis) - o2physics_add_dpl_workflow(helium-flow SOURCES helium_flow.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore diff --git a/PWGLF/Tasks/Nuspex/hypertriton3bodyMcqa.cxx b/PWGLF/Tasks/Nuspex/hypertriton3bodyMcqa.cxx deleted file mode 100644 index ef8dfb4b958..00000000000 --- a/PWGLF/Tasks/Nuspex/hypertriton3bodyMcqa.cxx +++ /dev/null @@ -1,908 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. -// -/// \file hypertriton3bodyMcqa.cxx -/// \brief QA for MC productions which contain hypertriton 3body decay process, including special checks for TOF PID -/// \author Yuanzhe Wang - -#include -#include -#include -#include -#include -#include -#include - -#include "CommonDataFormat/InteractionRecord.h" -#include "CommonDataFormat/IRFrame.h" -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoAHelpers.h" -#include "ReconstructionDataFormats/Track.h" -#include "Common/Core/RecoDecay.h" -#include "Common/Core/trackUtilities.h" -#include "PWGLF/DataModel/LFStrangenessTables.h" -#include "PWGLF/DataModel/pidTOFGeneric.h" -#include "Common/Core/TrackSelection.h" -#include "Common/DataModel/TrackSelectionTables.h" -#include "Common/TableProducer/PID/pidTOFBase.h" -#include "Common/DataModel/EventSelection.h" -#include "Common/DataModel/Centrality.h" -#include "Common/DataModel/PIDResponse.h" -#include "CommonConstants/PhysicsConstants.h" -#include "CCDB/BasicCCDBManager.h" - -using namespace o2; -using namespace o2::framework; -using namespace o2::framework::expressions; -using std::array; -using ColwithEvTimes = o2::soa::Join; -using FullTracksExtIU = soa::Join; -using MCLabeledTracksIU = soa::Join; - -template -bool is3bodyDecayedH3L(TMCParticle const& particle) -{ - if (std::abs(particle.pdgCode()) != 1010010030) { - return false; - } - bool haveProton = false, havePion = false, haveDeuteron = false; - bool haveAntiProton = false, haveAntiPion = false, haveAntiDeuteron = false; - for (const auto& mcDaughter : particle.template daughters_as()) { - if (mcDaughter.pdgCode() == 2212) - haveProton = true; - if (mcDaughter.pdgCode() == -2212) - haveAntiProton = true; - if (mcDaughter.pdgCode() == 211) - havePion = true; - if (mcDaughter.pdgCode() == -211) - haveAntiPion = true; - if (mcDaughter.pdgCode() == 1000010020) - haveDeuteron = true; - if (mcDaughter.pdgCode() == -1000010020) - haveAntiDeuteron = true; - } - if (haveProton && haveAntiPion && haveDeuteron && particle.pdgCode() > 0) { - return true; - } else if (haveAntiProton && havePion && haveAntiDeuteron && particle.pdgCode() < 0) { - return true; - } - return false; -} - -template -bool isPairedH3LDaughters(TMCParticle const& mctrack0, TMCParticle const& mctrack1, TMCParticle const& mctrack2) -{ - for (const auto& particleMother : mctrack0.template mothers_as()) { - if (!(particleMother.pdgCode() == 1010010030 && mctrack0.pdgCode() == 2212 && mctrack1.pdgCode() == -211 && mctrack2.pdgCode() == 1000010020) && - !(particleMother.pdgCode() == -1010010030 && mctrack0.pdgCode() == -2212 && mctrack1.pdgCode() == 211 && mctrack2.pdgCode() == -1000010020)) { - continue; - } - bool flag1 = false, flag2 = false; - for (const auto& mcDaughter : particleMother.template daughters_as()) { - if (mcDaughter.globalIndex() == mctrack1.globalIndex()) - flag1 = true; - if (mcDaughter.globalIndex() == mctrack2.globalIndex()) - flag2 = true; - } - if (!flag1 || !flag2) - continue; - // move the requirement in mass region into the loop to draw a histogram - // double hypertritonMCMass = RecoDecay::m(array{array{mctrack0.px(), mctrack0.py(), mctrack0.pz()}, array{mctrack1.px(), mctrack1.py(), mctrack1.pz()}, array{mctrack2.px(), mctrack2.py(), mctrack2.pz()}}, array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged, o2::constants::physics::MassDeuteron}); - // if (hypertritonMCMass > 2.990 && hypertritonMCMass < 2.993) - return true; - } - return false; -} - -// check the properties of daughters candidates and true daughters -struct Hypertriton3bodyMcqa { - - Service ccdb; - Preslice perCollisionTracks = aod::track::collisionId; - - int mRunNumber; - - // Basic checks - HistogramRegistry registry{ - "registry", - { - {"hEventCounter", "hEventCounter", {HistType::kTH1F, {{3, 0.0f, 3.0f}}}}, - {"hParticleCounter", "hParticleCounter", {HistType::kTH1F, {{7, 0.0f, 7.0f}}}}, - - {"hTPCNCls", "hTPCNCls", {HistType::kTH1F, {{160, 0.0f, 160.0f}}}}, - {"hTPCNClsCrossedRows", "hTPCNClsCrossedRows", {HistType::kTH1F, {{160, 0.0f, 160.0f}}}}, - {"hTrackEta", "hTrackEta", {HistType::kTH1F, {{200, -10.0f, 10.0f}}}}, - {"hTrackITSNcls", "hTrackITSNcls", {HistType::kTH1F, {{10, 0.0f, 10.0f}}}}, - {"hTrackMcRapidity", "hTrackMcRapidity", {HistType::kTH1F, {{200, -10.0f, 10.0f}}}}, - {"hTrackNsigmaProton", "hTrackNsigmaProton", {HistType::kTH1F, {{120, -6.0f, 6.0f}}}}, - {"hTrackNsigmaPion", "hTrackNsigmaPion", {HistType::kTH1F, {{120, -6.0f, 6.0f}}}}, - {"hTrackNsigmaDeuteron", "hTrackNsigmaDeuteron", {HistType::kTH1F, {{120, -6.0f, 6.0f}}}}, - - {"hHypertritonEta", "hHypertritomEta", {HistType::kTH1F, {{200, -10.0f, 10.0f}}}}, - {"hHypertritonMcRapidity", "hHypertritonMcRapidity", {HistType::kTH1F, {{200, -10.0f, 10.0f}}}}, - {"hHypertritonMcPt", "hHypertritonMcPt", {HistType::kTH1F, {{300, 0.0f, 15.0f}}}}, - - {"hProtonCounter", "hProtonCounter", {HistType::kTH1F, {{2, 0.0f, 2.0f}}}}, - {"hProtonPt", "hProtonPt", {HistType::kTH1F, {{200, 0.0f, 10.0f}}}}, - {"hProtonP", "hProtonP", {HistType::kTH1F, {{200, 0.0f, 10.0f}}}}, - {"hProtonMcPt", "hProtonMcPt", {HistType::kTH1F, {{200, 0.0f, 10.0f}}}}, - {"hProtonMcP", "hProtonMcP", {HistType::kTH1F, {{200, 0.0f, 10.0f}}}}, - {"hProtonEta", "hProtonEta", {HistType::kTH1F, {{200, -10.0f, 10.0f}}}}, - {"hProtonMcRapidity", "hProtonMcRapidity", {HistType::kTH1F, {{200, -10.0f, 10.0f}}}}, - {"hProtonNsigmaProton", "hProtonNsigmaProton", {HistType::kTH1F, {{120, -6.0f, 6.0f}}}}, - {"hProtonTPCNCls", "hProtonTPCNCls", {HistType::kTH1F, {{120, 0.0f, 120.0f}}}}, - {"hProtonTPCBB", "hProtonTPCBB", {HistType::kTH2F, {{320, -8.0f, 8.0f, "p/z(GeV/c)"}, {200, 0.0f, 1000.0f, "TPCSignal"}}}}, - {"hProtonTPCBBAfterTPCNclsCut", "hProtonTPCBBAfterTPCNclsCut", {HistType::kTH2F, {{320, -8.0f, 8.0f, "p/z(GeV/c)"}, {200, 0.0f, 1000.0f, "TPCSignal"}}}}, - {"hDauProtonPt", "hDauProtonPt", {HistType::kTH1F, {{200, 0.0f, 10.0f}}}}, - {"hDauProtonMcPt", "hDauProtonMcPt", {HistType::kTH1F, {{200, 0.0f, 10.0f}}}}, - {"hDauProtonNsigmaProton", "hDauProtonNsigmaProton", {HistType::kTH1F, {{120, -6.0f, 6.0f}}}}, - {"hDauProtonTPCVsPt", "hDauProtonTPCVsPt", {HistType::kTH2F, {{50, 0.0f, 5.0f, "#it{p}_{T} (GeV/c)"}, {120, -6.0f, 6.0f, "TPC n#sigma"}}}}, - - {"hPionCounter", "hPionCounter", {HistType::kTH1F, {{2, 0.0f, 2.0f}}}}, - {"hPionPt", "hPionPt", {HistType::kTH1F, {{200, 0.0f, 10.0f}}}}, - {"hPionP", "hPionP", {HistType::kTH1F, {{200, 0.0f, 10.0f}}}}, - {"hPionMcPt", "hPionMcPt", {HistType::kTH1F, {{200, 0.0f, 10.0f}}}}, - {"hPionMcP", "hPionMcP", {HistType::kTH1F, {{200, 0.0f, 10.0f}}}}, - {"hPionEta", "hPionEta", {HistType::kTH1F, {{200, -10.0f, 10.0f}}}}, - {"hPionMcRapidity", "hPionMcRapidity", {HistType::kTH1F, {{200, -10.0f, 10.0f}}}}, - {"hPionNsigmaPion", "hPionNsigmaPion", {HistType::kTH1F, {{120, -6.0f, 6.0f}}}}, - {"hPionTPCNCls", "hPionTPCNCls", {HistType::kTH1F, {{160, 0.0f, 160.0f}}}}, - {"hPionTPCBB", "hPionTPCBB", {HistType::kTH2F, {{320, -8.0f, 8.0f, "p/z(GeV/c)"}, {200, 0.0f, 1000.0f, "TPCSignal"}}}}, - {"hPionTPCBBAfterTPCNclsCut", "hPionTPCBBAfterTPCNclsCut", {HistType::kTH2F, {{320, -8.0f, 8.0f, "p/z(GeV/c)"}, {200, 0.0f, 1000.0f, "TPCSignal"}}}}, - {"hDauPionPt", "hDauPionPt", {HistType::kTH1F, {{200, 0.0f, 10.0f}}}}, - {"hDauPionMcPt", "hDauPionMcPt", {HistType::kTH1F, {{200, 0.0f, 10.0f}}}}, - {"hDauPionNsigmaPion", "hDauPionNsigmaPion", {HistType::kTH1F, {{120, -6.0f, 6.0f}}}}, - {"hDauPionTPCVsPt", "hDauPionTPCVsPt", {HistType::kTH2F, {{20, 0.0f, 2.0f, "#it{p}_{T} (GeV/c)"}, {120, -6.0f, 6.0f, "TPC n#sigma"}}}}, - {"hDauPionDcaXY", "hDauPionDcaXY", {HistType::kTH1F, {{100, -10.0f, 10.0f}}}}, - - {"hDeuteronCounter", "hDeuteronCounter", {HistType::kTH1F, {{2, 0.0f, 2.0f}}}}, - {"hDeuteronPt", "hDeuteronPt", {HistType::kTH1F, {{200, 0.0f, 10.0f}}}}, - {"hDeuteronP", "hDeuteronP", {HistType::kTH1F, {{200, 0.0f, 10.0f}}}}, - {"hDeuteronMcPt", "hDeuteronMcPt", {HistType::kTH1F, {{200, 0.0f, 10.0f}}}}, - {"hDeuteronMcP", "hDeuteronMcP", {HistType::kTH1F, {{200, 0.0f, 10.0f}}}}, - {"hDeuteronEta", "hDeuteronEta", {HistType::kTH1F, {{200, -10.0f, 10.0f}}}}, - {"hDeuteronMcRapidity", "hDeuteronMcRapidity", {HistType::kTH1F, {{200, -10.0f, 10.0f}}}}, - {"hDeuteronNsigmaDeuteron", "hDeuteronNsigmaDeuteron", {HistType::kTH1F, {{120, -6.0f, 6.0f}}}}, - {"hDeuteronTPCNCls", "hDeuteronTPCNCls", {HistType::kTH1F, {{120, 0.0f, 120.0f}}}}, - {"hDeuteronTPCBB", "hDeuteronTPCBB", {HistType::kTH2F, {{320, -8.0f, 8.0f, "p/z(GeV/c)"}, {200, 0.0f, 1000.0f, "TPCSignal"}}}}, - {"hDeuteronTPCBBAfterTPCNclsCut", "hDeuteronTPCBBAfterTPCNclsCut", {HistType::kTH2F, {{320, -8.0f, 8.0f, "p/z(GeV/c)"}, {200, 0.0f, 1000.0f, "TPCSignal"}}}}, - {"hDauDeuteronPt", "hDauDeuteronPt", {HistType::kTH1F, {{200, 0.0f, 10.0f}}}}, - {"hDauDeuteronMcPt", "hDauDeuteronMcPt", {HistType::kTH1F, {{200, 0.0f, 10.0f}}}}, - {"hDauDeuteronTPCVsPt", "hDauDeuteronTPCVsPt", {HistType::kTH2F, {{80, 0.0f, 8.0f, "#it{p}_{T} (GeV/c)"}, {120, -6.0f, 6.0f, "TPC n#sigma"}}}}, - {"hDauDeuteronTOFNSigmaVsP", "hDauDeuteronTOFNSigmaVsP", {HistType::kTH2F, {{40, -10.0f, 10.0f, "p/z (GeV/c)"}, {600, -300.0f, 300.0f, "TOF n#sigma"}}}}, - {"hDauDeuteronTOFNSigmaVsPHasTOF", "hDauDeuteronTOFNSigmaVsPHasTOF", {HistType::kTH2F, {{40, -10.0f, 10.0f, "p/z (GeV/c)"}, {600, -300.0f, 300.0f, "TOF n#sigma"}}}}, - {"hDauDeuteronMatchCounter", "hDauDeuteronMatchCounter", {HistType::kTH1F, {{4, 0.0f, 4.0f}}}}, - - {"hTPCBB", "hTPCBB", {HistType::kTH2F, {{120, -8.0f, 8.0f, "p/z(GeV/c)"}, {100, 0.0f, 1000.0f, "TPCSignal"}}}}, - - {"hPairedH3LDaughers", "hPairedH3LDaughers", {HistType::kTH1F, {{3, 0.0f, 3.0f}}}}, - {"hPairedH3LDaughersInvMass", "hPairedH3LDaughersInvMass", {HistType::kTH1F, {{300, 2.9f, 3.2f}}}}, - {"hDuplicatedH3LDaughers", "hDuplicatedH3LDaughers", {HistType::kTH1F, {{3, 0.0f, 3.0f}}}}, - - // Diff checks always requir hasTOF - {"hDiffTrackTOFSignal", "hDiffTrackTOFSignal", {HistType::kTH1F, {{200, -1.0f, 1.0f}}}}, - {"hDiffEvTimeForTrack", "hDiffEvTimeForTrack", {HistType::kTH1F, {{200, -1.0f, 1.0f}}}}, - {"hDiffTrackTOFNSigmaDe", "hDiffTrackTOFNSigmaDe", {HistType::kTH1F, {{200, -1.0f, 1.0f}}}}, - {"hDauDeuteronNewTOFNSigmaVsP", "hDauDeuteronNewTOFNSigmaVsP", {HistType::kTH2F, {{40, -10.0f, 10.0f, "p/z (GeV/c)"}, {600, -300.0f, 300.0f, "TOF n#sigma"}}}}, - {"hWrongDeuteronTOFNSigmaVsP", "hWrongDeuteronTOFNSigmaVsP", {HistType::kTH2F, {{40, -10.0f, 10.0f, "p/z (GeV/c)"}, {600, -300.0f, 300.0f, "TOF n#sigma"}}}}, - {"hWrongDeuteronNewTOFNSigmaVsP", "hWrongDeuteronNewTOFNSigmaVsP", {HistType::kTH2F, {{40, -10.0f, 10.0f, "p/z (GeV/c)"}, {600, -300.0f, 300.0f, "TOF n#sigma"}}}}, - {"hDiffColTime", "hDiffColTime", {HistType::kTH1F, {{200, -100.0f, 100.0f}}}}, - {"hDauDeuteronDiffTOFNsigmaDeHasTOF", "hDauDeuteronDiffTOFNsigmaDeHasTOF", {HistType::kTH1F, {{200, -100.0f, 100.0f}}}}, - - // _v2 for using relinked collision - {"hDauDeuteronTOFNSigmaVsP_CorrectCol", "hDauDeuteronTOFNSigmaVsP_CorrectCol", {HistType::kTH2F, {{40, -10.0f, 10.0f, "p/z (GeV/c)"}, {600, -300.0f, 300.0f, "TOF n#sigma"}}}}, - {"hDauDeuteronNewTOFNSigmaVsP_CorrectCol", "hDauDeuteronNewTOFNSigmaVsP_CorrectCol", {HistType::kTH2F, {{40, -10.0f, 10.0f, "p/z (GeV/c)"}, {600, -300.0f, 300.0f, "TOF n#sigma"}}}}, - {"hDauDeuteronTOFNSigmaVsP_v2", "hDauDeuteronTOFNSigmaVsP_v2", {HistType::kTH2F, {{40, -10.0f, 10.0f, "p/z (GeV/c)"}, {600, -300.0f, 300.0f, "TOF n#sigma"}}}}, - {"hDauDeuteronNewTOFNSigmaVsP_v2_AO2D", "hDauDeuteronNewTOFNSigmaVsP_v2 AO2D", {HistType::kTH2F, {{40, -10.0f, 10.0f, "p/z (GeV/c)"}, {600, -300.0f, 300.0f, "TOF n#sigma"}}}}, - {"hDauDeuteronNewTOFNSigmaVsP_v2_EvSel", "hDauDeuteronNewTOFNSigmaVsP_v2 EvSel", {HistType::kTH2F, {{40, -10.0f, 10.0f, "p/z (GeV/c)"}, {600, -300.0f, 300.0f, "TOF n#sigma"}}}}, - {"hDauDeuteronTOFNSigmaVsColTimeRes_v2", "hDauDeuteronTOFNSigmaVsColTimeRes_v2", {HistType::kTH2F, {{100, 0.0f, 400.0f, "CollisionTimeRes(ns)"}, {600, -300.0f, 300.0f, "TOF n#sigma"}}}}, - {"hDauDeuteronTOFNSigmaVsColTimeRes_v2_AO2D", "hDauDeuteronTOFNSigmaVsColTimeRes_v2 AO2D", {HistType::kTH2F, {{100, 0.0f, 400.0f, "CollisionTimeRes(ns)"}, {600, -300.0f, 300.0f, "TOF n#sigma"}}}}, - {"hDauDeuteronTOFNSigmaVsColTimeRes_v2_EvSel", "hDauDeuteronTOFNSigmaVsColTimeRes_v2 EvSel", {HistType::kTH2F, {{100, 0.0f, 400.0f, "CollisionTimeRes(ns)"}, {600, -300.0f, 300.0f, "TOF n#sigma"}}}}, - {"hDauDeuteronTOFPIDCounter", "hDauDeuteronTOFPIDCounter", {HistType::kTH1F, {{5, 0.0f, 5.0f}}}}, - {"hDauDeuteronTOFPIDCounter_CloseBC", "hDauDeuteronTOFPIDCounter CloseBC", {HistType::kTH1F, {{5, 0.0f, 5.0f}}}}, - }, - }; - - void init(InitContext&) - { - registry.get(HIST("hParticleCounter"))->GetXaxis()->SetBinLabel(1, "Readin"); - registry.get(HIST("hParticleCounter"))->GetXaxis()->SetBinLabel(2, "Has_mcparticle"); - registry.get(HIST("hParticleCounter"))->GetXaxis()->SetBinLabel(3, "Rapidity Cut"); - registry.get(HIST("hParticleCounter"))->GetXaxis()->SetBinLabel(4, "McisHypertriton"); - registry.get(HIST("hParticleCounter"))->GetXaxis()->SetBinLabel(5, "McisProton"); - registry.get(HIST("hParticleCounter"))->GetXaxis()->SetBinLabel(6, "McisPion"); - registry.get(HIST("hParticleCounter"))->GetXaxis()->SetBinLabel(7, "McisDeuteron"); - - TString trackCounterbinLabel[2] = {"hasMom", "FromHypertriton"}; - for (int i{0}; i < 2; i++) { - registry.get(HIST("hProtonCounter"))->GetXaxis()->SetBinLabel(i + 1, trackCounterbinLabel[i]); - registry.get(HIST("hPionCounter"))->GetXaxis()->SetBinLabel(i + 1, trackCounterbinLabel[i]); - registry.get(HIST("hDeuteronCounter"))->GetXaxis()->SetBinLabel(i + 1, trackCounterbinLabel[i]); - } - registry.get(HIST("hDuplicatedH3LDaughers"))->GetXaxis()->SetBinLabel(1, "proton"); - registry.get(HIST("hDuplicatedH3LDaughers"))->GetXaxis()->SetBinLabel(2, "pion"); - registry.get(HIST("hDuplicatedH3LDaughers"))->GetXaxis()->SetBinLabel(3, "deuteron"); - - registry.get(HIST("hDauDeuteronMatchCounter"))->GetXaxis()->SetBinLabel(1, "Total"); - registry.get(HIST("hDauDeuteronMatchCounter"))->GetXaxis()->SetBinLabel(2, "correct collision"); - registry.get(HIST("hDauDeuteronMatchCounter"))->GetXaxis()->SetBinLabel(3, "hasTOF"); - registry.get(HIST("hDauDeuteronMatchCounter"))->GetXaxis()->SetBinLabel(4, "hasTOF & correct collsion"); - - registry.get(HIST("hDauDeuteronTOFPIDCounter"))->GetXaxis()->SetBinLabel(1, "Origin |n#sigma| >= 5"); - registry.get(HIST("hDauDeuteronTOFPIDCounter"))->GetXaxis()->SetBinLabel(2, "BothBC work"); - registry.get(HIST("hDauDeuteronTOFPIDCounter"))->GetXaxis()->SetBinLabel(3, "Only BCAO2D work"); - registry.get(HIST("hDauDeuteronTOFPIDCounter"))->GetXaxis()->SetBinLabel(4, "Only BCEvSel work"); - registry.get(HIST("hDauDeuteronTOFPIDCounter"))->GetXaxis()->SetBinLabel(5, "BothBC not work"); - registry.get(HIST("hDauDeuteronTOFPIDCounter_CloseBC"))->GetXaxis()->SetBinLabel(1, "Origin |n#sigma| < 6"); - registry.get(HIST("hDauDeuteronTOFPIDCounter_CloseBC"))->GetXaxis()->SetBinLabel(2, "BothBC work"); - registry.get(HIST("hDauDeuteronTOFPIDCounter_CloseBC"))->GetXaxis()->SetBinLabel(3, "Only BCAO2D work"); - registry.get(HIST("hDauDeuteronTOFPIDCounter_CloseBC"))->GetXaxis()->SetBinLabel(4, "Only BCEvSel work"); - registry.get(HIST("hDauDeuteronTOFPIDCounter_CloseBC"))->GetXaxis()->SetBinLabel(5, "BothBC not work"); - } - - Configurable dcapiontopv{"dcapiontopv", .05, "DCA Pion To PV"}; - Configurable minProtonPt{"minProtonPt", 0.3, "minProtonPt"}; - Configurable maxProtonPt{"maxProtonPt", 5, "maxProtonPt"}; - Configurable minPionPt{"minPionPt", 0.1, "minPionPt"}; - Configurable maxPionPt{"maxPionPt", 1.2, "maxPionPt"}; - Configurable minDeuteronPt{"minDeuteronPt", 0.6, "minDeuteronPt"}; - Configurable maxDeuteronPt{"maxDeuteronPt", 10, "maxDeuteronPt"}; - Configurable mc_event_selection{"mc_event_selection", true, "mc event selection count post kIsTriggerTVX and kNoTimeFrameBorder"}; - Configurable event_posZ_selection{"event_posZ_selection", true, "event selection count post poZ cut"}; - - // CCDB TOF PID paras - Configurable timestamp{"ccdb-timestamp", -1, "timestamp of the object"}; - Configurable paramFileName{"paramFileName", "", "Path to the parametrization object. If empty the parametrization is not taken from file"}; - Configurable parametrizationPath{"parametrizationPath", "TOF/Calib/Params", "Path of the TOF parametrization on the CCDB or in the file, if the paramFileName is not empty"}; - Configurable passName{"passName", "", "Name of the pass inside of the CCDB parameter collection. If empty, the automatically deceted from metadata (to be implemented!!!)"}; - Configurable timeShiftCCDBPath{"timeShiftCCDBPath", "", "Path of the TOF time shift vs eta. If empty none is taken"}; - Configurable loadResponseFromCCDB{"loadResponseFromCCDB", false, "Flag to load the response from the CCDB"}; - Configurable fatalOnPassNotAvailable{"fatalOnPassNotAvailable", true, "Flag to throw a fatal if the pass is not available in the retrieved CCDB object"}; - - o2::aod::pidtofgeneric::TofPidNewCollision bachelorTOFPID; - o2::pid::tof::TOFResoParamsV2 mRespParamsV2; - - void initCCDB(aod::BCsWithTimestamps::iterator const& bc) - { - if (mRunNumber == bc.runNumber()) { - return; - } - mRunNumber = bc.runNumber(); - - // Initial TOF PID Paras, copied from PIDTOF.h - timestamp.value = bc.timestamp(); - ccdb->setTimestamp(timestamp.value); - // Not later than now objects - ccdb->setCreatedNotAfter(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); - // TODO: implement the automatic pass name detection from metadata - if (passName.value == "") { - passName.value = "unanchored"; // temporary default - LOG(warning) << "Passed autodetect mode for pass, not implemented yet, waiting for metadata. Taking '" << passName.value << "'"; - } - LOG(info) << "Using parameter collection, starting from pass '" << passName.value << "'"; - - const std::string fname = paramFileName.value; - if (!fname.empty()) { // Loading the parametrization from file - LOG(info) << "Loading exp. sigma parametrization from file " << fname << ", using param: " << parametrizationPath.value; - if (1) { - o2::tof::ParameterCollection paramCollection; - paramCollection.loadParamFromFile(fname, parametrizationPath.value); - LOG(info) << "+++ Loaded parameter collection from file +++"; - if (!paramCollection.retrieveParameters(mRespParamsV2, passName.value)) { - if (fatalOnPassNotAvailable) { - LOGF(fatal, "Pass '%s' not available in the retrieved CCDB object", passName.value.data()); - } else { - LOGF(warning, "Pass '%s' not available in the retrieved CCDB object", passName.value.data()); - } - } else { - mRespParamsV2.setShiftParameters(paramCollection.getPars(passName.value)); - mRespParamsV2.printShiftParameters(); - } - } else { - mRespParamsV2.loadParamFromFile(fname.data(), parametrizationPath.value); - } - } else if (loadResponseFromCCDB) { // Loading it from CCDB - LOG(info) << "Loading exp. sigma parametrization from CCDB, using path: " << parametrizationPath.value << " for timestamp " << timestamp.value; - o2::tof::ParameterCollection* paramCollection = ccdb->getForTimeStamp(parametrizationPath.value, timestamp.value); - paramCollection->print(); - if (!paramCollection->retrieveParameters(mRespParamsV2, passName.value)) { // Attempt at loading the parameters with the pass defined - if (fatalOnPassNotAvailable) { - LOGF(fatal, "Pass '%s' not available in the retrieved CCDB object", passName.value.data()); - } else { - LOGF(warning, "Pass '%s' not available in the retrieved CCDB object", passName.value.data()); - } - } else { // Pass is available, load non standard parameters - mRespParamsV2.setShiftParameters(paramCollection->getPars(passName.value)); - mRespParamsV2.printShiftParameters(); - } - } - mRespParamsV2.print(); - if (timeShiftCCDBPath.value != "") { - if (timeShiftCCDBPath.value.find(".root") != std::string::npos) { - mRespParamsV2.setTimeShiftParameters(timeShiftCCDBPath.value, "gmean_Pos", true); - mRespParamsV2.setTimeShiftParameters(timeShiftCCDBPath.value, "gmean_Neg", false); - } else { - mRespParamsV2.setTimeShiftParameters(ccdb->getForTimeStamp(Form("%s/pos", timeShiftCCDBPath.value.c_str()), timestamp.value), true); - mRespParamsV2.setTimeShiftParameters(ccdb->getForTimeStamp(Form("%s/neg", timeShiftCCDBPath.value.c_str()), timestamp.value), false); - } - } - - bachelorTOFPID.SetParams(mRespParamsV2); - } - - struct Indexdaughters { // check duplicated paired daughters - int64_t index0; - int64_t index1; - int64_t index2; - bool operator==(const Indexdaughters& t) const - { - return (this->index0 == t.index0 && this->index1 == t.index1 && this->index2 == t.index2); - } - }; - - void process(ColwithEvTimes const& collisions, MCLabeledTracksIU const& tracks, aod::McParticles const& /*particlesMC*/, aod::McCollisions const& /*mcCollisions*/, aod::BCsWithTimestamps const&) - { - for (const auto& collision : collisions) { - auto bc = collision.bc_as(); - initCCDB(bc); - - registry.fill(HIST("hEventCounter"), 0.5); - if (mc_event_selection && (!collision.selection_bit(aod::evsel::kIsTriggerTVX) || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder))) { - continue; - } - registry.fill(HIST("hEventCounter"), 1.5); - if (event_posZ_selection && std::abs(collision.posZ()) > 10.f) { // 10cm - continue; - } - registry.fill(HIST("hEventCounter"), 2.5); - - std::vector protons, pions, deuterons; // index for daughter tracks - std::unordered_set set_proton, set_pion, set_deuteron; // check duplicated daughters - int itrack = -1; - - auto coltracks = tracks.sliceBy(perCollisionTracks, collision.globalIndex()); - - for (const auto& track : coltracks) { - - ++itrack; - registry.fill(HIST("hParticleCounter"), 0.5); - registry.fill(HIST("hTrackITSNcls"), track.itsNCls()); - registry.fill(HIST("hTPCNCls"), track.tpcNClsFound()); - registry.fill(HIST("hTPCNClsCrossedRows"), track.tpcNClsCrossedRows()); - registry.fill(HIST("hTrackNsigmaDeuteron"), track.tpcNSigmaDe()); - registry.fill(HIST("hTrackNsigmaProton"), track.tpcNSigmaPr()); - registry.fill(HIST("hTrackNsigmaPion"), track.tpcNSigmaPi()); - - if (!track.has_mcParticle()) { - continue; - } - auto mcparticle = track.mcParticle_as(); - registry.fill(HIST("hTPCBB"), track.p() * track.sign(), track.tpcSignal()); - - registry.fill(HIST("hParticleCounter"), 1.5); - - // if (TMath::Abs(mcparticle.y()) > 0.9) {continue;} - registry.fill(HIST("hParticleCounter"), 2.5); - registry.fill(HIST("hTrackEta"), track.eta()); - registry.fill(HIST("hTrackMcRapidity"), mcparticle.y()); - - // Hypertriton detected directly - if (mcparticle.pdgCode() == 1010010030 || mcparticle.pdgCode() == -1010010030) { - registry.fill(HIST("hParticleCounter"), 3.5); - registry.fill(HIST("hHypertritonMcPt"), mcparticle.pt()); - registry.fill(HIST("hHypertritonEta"), track.eta()); - registry.fill(HIST("hHypertritonMcRapidity"), mcparticle.y()); - } - - // Proton - if (mcparticle.pdgCode() == 2212 || mcparticle.pdgCode() == -2212) { - registry.fill(HIST("hParticleCounter"), 4.5); - if (track.tpcNClsFound() > 70) { - registry.fill(HIST("hProtonTPCBBAfterTPCNclsCut"), track.p() * track.sign(), track.tpcSignal()); - } - - if (mcparticle.has_mothers()) { - registry.fill(HIST("hProtonCounter"), 0.5); - for (const auto& particleMother : mcparticle.mothers_as()) { - bool flag_H3L = is3bodyDecayedH3L(particleMother); - if (!flag_H3L) { - continue; - } - protons.push_back(itrack); - auto p = set_proton.insert(mcparticle.globalIndex()); - if (p.second == false) - registry.fill(HIST("hDuplicatedH3LDaughers"), 0); - registry.fill(HIST("hProtonCounter"), 1.5); - registry.fill(HIST("hDauProtonPt"), track.pt()); - registry.fill(HIST("hDauProtonMcPt"), mcparticle.pt()); - registry.fill(HIST("hDauProtonNsigmaProton"), track.tpcNSigmaPr()); - registry.fill(HIST("hDauProtonTPCVsPt"), track.pt(), track.tpcNSigmaPr()); - } - } - - registry.fill(HIST("hProtonMcPt"), mcparticle.pt()); - registry.fill(HIST("hProtonMcP"), mcparticle.p()); - registry.fill(HIST("hProtonPt"), track.pt()); - registry.fill(HIST("hProtonP"), track.p()); - - registry.fill(HIST("hProtonNsigmaProton"), track.tpcNSigmaPr()); - registry.fill(HIST("hProtonTPCNCls"), track.tpcNClsFound()); - registry.fill(HIST("hProtonEta"), track.eta()); - registry.fill(HIST("hProtonMcRapidity"), mcparticle.y()); - registry.fill(HIST("hProtonTPCBB"), track.p() * track.sign(), track.tpcSignal()); - } - - // Pion - if (mcparticle.pdgCode() == 211 || mcparticle.pdgCode() == -211) { - registry.fill(HIST("hParticleCounter"), 5.5); - if (track.tpcNClsFound() > 70) { - registry.fill(HIST("hPionTPCBBAfterTPCNclsCut"), track.p() * track.sign(), track.tpcSignal()); - } - - if (mcparticle.has_mothers()) { - registry.fill(HIST("hPionCounter"), 0.5); - for (const auto& particleMother : mcparticle.mothers_as()) { - bool flag_H3L = is3bodyDecayedH3L(particleMother); - if (!flag_H3L) { - continue; - } - pions.push_back(itrack); - auto p = set_pion.insert(mcparticle.globalIndex()); - if (p.second == false) { - registry.fill(HIST("hDuplicatedH3LDaughers"), 1); - } - registry.fill(HIST("hPionCounter"), 1.5); - registry.fill(HIST("hDauPionPt"), track.pt()); - registry.fill(HIST("hDauPionMcPt"), mcparticle.pt()); - registry.fill(HIST("hDauPionTPCVsPt"), track.pt(), track.tpcNSigmaPi()); - registry.fill(HIST("hDauPionDcaXY"), track.dcaXY()); - } - } - - registry.fill(HIST("hPionMcPt"), mcparticle.pt()); - registry.fill(HIST("hPionMcP"), mcparticle.p()); - registry.fill(HIST("hPionPt"), track.pt()); - registry.fill(HIST("hPionP"), track.p()); - - registry.fill(HIST("hPionNsigmaPion"), track.tpcNSigmaPi()); - registry.fill(HIST("hPionTPCNCls"), track.tpcNClsFound()); - registry.fill(HIST("hPionEta"), track.eta()); - registry.fill(HIST("hPionMcRapidity"), mcparticle.y()); - registry.fill(HIST("hPionTPCBB"), track.p() * track.sign(), track.tpcSignal()); - } - - float tofNsigmaDe = -999; - static constexpr float kCSPEED = TMath::C() * 1.0e2f * 1.0e-12f; // c in cm/ps - - if (track.hasTOF() && track.has_collision()) { - auto responseDe = o2::pid::tof::ExpTimes(); - // float bachExpTime = track.length() * sqrt((o2::constants::physics::MassDeuteron * o2::constants::physics::MassDeuteron) + (track.tofExpMom() * track.tofExpMom())) / (kCSPEED * track.tofExpMom()); // L*E/(p*c) = L/v - - float mMassHyp = o2::track::pid_constants::sMasses2Z[track.pidForTracking()]; - float bachExpTime = track.length() * std::sqrt((mMassHyp * mMassHyp) + (track.tofExpMom() * track.tofExpMom())) / (kCSPEED * track.tofExpMom()); // L*E/(p*c) = L/v - float tofsignal = track.trackTime() * 1000 + bachExpTime; // in ps - - float expSigma = responseDe.GetExpectedSigma(mRespParamsV2, track, tofsignal, track.tofEvTimeErr()); - // tofNsigmaDe = (track.tofSignal() - track.tofEvTime() - responseDe.GetCorrectedExpectedSignal(mRespParamsV2, track)) / expSigma; - tofNsigmaDe = (tofsignal - track.tofEvTime() - responseDe.GetCorrectedExpectedSignal(mRespParamsV2, track)) / expSigma; - // tofNsigmaDe = (tofsignal - track.evTimeForTrack() - responseDe.GetCorrectedExpectedSignal(mRespParamsV2, track)) / expSigma; - - if (collision.bcId() == collision.foundBCId()) { - registry.fill(HIST("hDiffColTime"), track.tofEvTime() - collision.collisionTime()); - } - - // Assume deuterons linked to the correct collision, result of new TOF PID should be same as the default one - registry.fill(HIST("hDiffTrackTOFSignal"), track.tofSignal() - tofsignal); - registry.fill(HIST("hDiffEvTimeForTrack"), track.tofEvTime() - track.evTimeForTrack()); - registry.fill(HIST("hDiffTrackTOFNSigmaDe"), track.tofNSigmaDe() - bachelorTOFPID.GetTOFNSigma(o2::track::PID::Deuteron, track, collision, collision)); - // registry.fill(HIST("hDiffTrackTOFNSigmaDe"), track.tofExpSigmaDe() - bachelorTOFPID.GetTOFNSigma(o2::track::PID::Deuteron, track, collision, collision)); - } - - // Deuteron - if (mcparticle.pdgCode() == 1000010020 || mcparticle.pdgCode() == -1000010020) { - registry.fill(HIST("hParticleCounter"), 6.5); - if (track.tpcNClsFound() > 70) { - registry.fill(HIST("hDeuteronTPCBBAfterTPCNclsCut"), track.p() * track.sign(), track.tpcSignal()); - } - - if (mcparticle.has_mothers()) { - registry.fill(HIST("hDeuteronCounter"), 0.5); - for (const auto& particleMother : mcparticle.mothers_as()) { - bool flag_H3L = is3bodyDecayedH3L(particleMother); - if (!flag_H3L) { - continue; - } - deuterons.push_back(itrack); - auto p = set_deuteron.insert(mcparticle.globalIndex()); - if (p.second == false) - registry.fill(HIST("hDuplicatedH3LDaughers"), 2); - registry.fill(HIST("hDeuteronCounter"), 1.5); - registry.fill(HIST("hDauDeuteronPt"), track.pt()); - registry.fill(HIST("hDauDeuteronMcPt"), mcparticle.pt()); - registry.fill(HIST("hDauDeuteronTPCVsPt"), track.pt(), track.tpcNSigmaDe()); - registry.fill(HIST("hDauDeuteronTOFNSigmaVsP"), track.sign() * track.p(), track.tofNSigmaDe()); - - registry.fill(HIST("hDauDeuteronNewTOFNSigmaVsP"), track.sign() * track.p(), tofNsigmaDe); - if (track.hasTOF()) { - registry.fill(HIST("hDauDeuteronTOFNSigmaVsPHasTOF"), track.sign() * track.p(), track.tofNSigmaDe()); - registry.fill(HIST("hDauDeuteronDiffTOFNsigmaDeHasTOF"), track.tofNSigmaDe() - tofNsigmaDe); - } - registry.fill(HIST("hDauDeuteronMatchCounter"), 0.5); - if (mcparticle.mcCollisionId() == collision.mcCollisionId()) { - registry.fill(HIST("hDauDeuteronMatchCounter"), 1.5); - } - if (track.hasTOF()) { - registry.fill(HIST("hDauDeuteronMatchCounter"), 2.5); - if (mcparticle.mcCollisionId() == collision.mcCollisionId()) { - registry.fill(HIST("hDauDeuteronMatchCounter"), 3.5); - } - } - } - } - - registry.fill(HIST("hDeuteronMcPt"), mcparticle.pt()); - registry.fill(HIST("hDeuteronMcP"), mcparticle.p()); - registry.fill(HIST("hDeuteronPt"), track.pt()); - registry.fill(HIST("hDeuteronP"), track.p()); - - registry.fill(HIST("hDeuteronNsigmaDeuteron"), track.tpcNSigmaDe()); - registry.fill(HIST("hDeuteronTPCNCls"), track.tpcNClsFound()); - registry.fill(HIST("hDeuteronEta"), track.eta()); - registry.fill(HIST("hDeuteronMcRapidity"), mcparticle.y()); - registry.fill(HIST("hDeuteronTPCBB"), track.p() * track.sign(), track.tpcSignal()); - } else { - if (track.hasTOF()) { - registry.fill(HIST("hWrongDeuteronTOFNSigmaVsP"), track.sign() * track.p(), track.tofNSigmaDe()); - registry.fill(HIST("hWrongDeuteronNewTOFNSigmaVsP"), track.sign() * track.p(), tofNsigmaDe); - } - } - } - - std::vector set_pair; - for (size_t iproton = 0; iproton < protons.size(); iproton++) { - auto track0 = tracks.iteratorAt(protons[iproton]); - auto mctrack0 = track0.mcParticle_as(); - for (size_t ipion = 0; ipion < pions.size(); ipion++) { - auto track1 = tracks.iteratorAt(pions[ipion]); - auto mctrack1 = track1.mcParticle_as(); - for (size_t ideuteron = 0; ideuteron < deuterons.size(); ideuteron++) { - auto track2 = tracks.iteratorAt(deuterons[ideuteron]); - auto mctrack2 = track2.mcParticle_as(); - if (isPairedH3LDaughters(mctrack0, mctrack1, mctrack2)) { - registry.fill(HIST("hPairedH3LDaughers"), 0); - // MC mass cut, to check if the daughters are from materials - double hypertritonMCMass = RecoDecay::m(std::array{std::array{mctrack0.px(), mctrack0.py(), mctrack0.pz()}, std::array{mctrack1.px(), mctrack1.py(), mctrack1.pz()}, std::array{mctrack2.px(), mctrack2.py(), mctrack2.pz()}}, std::array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged, o2::constants::physics::MassDeuteron}); - registry.fill(HIST("hPairedH3LDaughersInvMass"), hypertritonMCMass); - if (hypertritonMCMass < 2.990 || hypertritonMCMass > 2.993) - continue; - registry.fill(HIST("hPairedH3LDaughers"), 1); - // duplicated daughters check - Indexdaughters temp = {mctrack0.globalIndex(), mctrack1.globalIndex(), mctrack2.globalIndex()}; - auto p = std::find(set_pair.begin(), set_pair.end(), temp); - if (p == set_pair.end()) { - set_pair.push_back(temp); - registry.fill(HIST("hPairedH3LDaughers"), 2); - } - } - } - } - } - } - - // Check for recalculated TOF PID for secondary deuterons - - std::vector SelectedEvents(collisions.size()); - int nevts = 0; - for (const auto& collision : collisions) { - SelectedEvents[nevts++] = collision.mcCollision_as().globalIndex(); - } - - for (const auto& track : tracks) { - if (!track.has_mcParticle()) { - continue; - } - auto mcparticle = track.mcParticle_as(); - if (mcparticle.pdgCode() == 1000010020 || mcparticle.pdgCode() == -1000010020) { - if (!mcparticle.has_mothers()) { - continue; - } - const auto evtReconstructed = std::find(SelectedEvents.begin(), SelectedEvents.end(), mcparticle.mcCollision_as().globalIndex()); - if (evtReconstructed == SelectedEvents.end() || !track.has_collision()) { - continue; - } - if (!track.has_collision()) { - continue; - } - auto collision = collisions.iteratorAt(evtReconstructed - SelectedEvents.begin()); - auto originalcollision = track.collision_as(); - - for (const auto& particleMother : mcparticle.mothers_as()) { - bool flag_H3L = is3bodyDecayedH3L(particleMother); - if (!flag_H3L) { - continue; - } - - auto bc = collision.bc_as(); - initCCDB(bc); - float tofNsigmaDeAO2D = -999; - float tofNsigmaDeEvSel = -999; - - if (track.hasTOF()) { - /*auto responseDe = o2::pid::tof::ExpTimes(); - //float bachExpTime = track.length() * sqrt((o2::constants::physics::MassDeuteron * o2::constants::physics::MassDeuteron) + (track.tofExpMom() * track.tofExpMom())) / (kCSPEED * track.tofExpMom()); // L*E/(p*c) = L/v - float mMassHyp = o2::track::pid_constants::sMasses2Z[track.pidForTracking()]; - float bachExpTime = track.length() * std::sqrt((mMassHyp * mMassHyp) + (track.tofExpMom() * track.tofExpMom())) / (kCSPEED * track.tofExpMom()); // L*E/(p*c) = L/v - */ - - tofNsigmaDeAO2D = bachelorTOFPID.GetTOFNSigma(o2::track::PID::Deuteron, track, originalcollision, collision); - tofNsigmaDeEvSel = bachelorTOFPID.GetTOFNSigma(o2::track::PID::Deuteron, track, originalcollision, collision, false); - - if (collision.globalIndex() == originalcollision.globalIndex()) { - registry.fill(HIST("hDauDeuteronTOFNSigmaVsP_CorrectCol"), track.sign() * track.p(), track.tofNSigmaDe()); - registry.fill(HIST("hDauDeuteronNewTOFNSigmaVsP_CorrectCol"), track.sign() * track.p(), tofNsigmaDeAO2D); - continue; - } - - /*if (originalcollision.collisionTimeRes() > 40){ - continue; - }*/ - registry.fill(HIST("hDauDeuteronTOFNSigmaVsP_v2"), track.sign() * track.p(), track.tofNSigmaDe()); - registry.fill(HIST("hDauDeuteronNewTOFNSigmaVsP_v2_AO2D"), track.sign() * track.p(), tofNsigmaDeAO2D); - registry.fill(HIST("hDauDeuteronNewTOFNSigmaVsP_v2_EvSel"), track.sign() * track.p(), tofNsigmaDeEvSel); - registry.fill(HIST("hDauDeuteronTOFNSigmaVsColTimeRes_v2"), collision.collisionTimeRes(), track.tofNSigmaDe()); - registry.fill(HIST("hDauDeuteronTOFNSigmaVsColTimeRes_v2_AO2D"), originalcollision.collisionTimeRes(), tofNsigmaDeAO2D); - registry.fill(HIST("hDauDeuteronTOFNSigmaVsColTimeRes_v2_EvSel"), originalcollision.collisionTimeRes(), tofNsigmaDeEvSel); - - if (std::abs(track.tofNSigmaDe()) >= 5) { - registry.fill(HIST("hDauDeuteronTOFPIDCounter"), 0.5); - if (std::abs(tofNsigmaDeAO2D) < 5 && std::abs(tofNsigmaDeEvSel) < 5) { - registry.fill(HIST("hDauDeuteronTOFPIDCounter"), 1.5); - } else if (std::abs(tofNsigmaDeAO2D) < 5 && std::abs(tofNsigmaDeEvSel) >= 5) { - registry.fill(HIST("hDauDeuteronTOFPIDCounter"), 2.5); - } else if (std::abs(tofNsigmaDeAO2D) >= 5 && std::abs(tofNsigmaDeEvSel) < 5) { - registry.fill(HIST("hDauDeuteronTOFPIDCounter"), 3.5); - } else if (std::abs(tofNsigmaDeAO2D) >= 5 && std::abs(tofNsigmaDeEvSel) >= 5) { - registry.fill(HIST("hDauDeuteronTOFPIDCounter"), 4.5); - } - } else if (std::abs(track.tofNSigmaDe()) < 5) { - registry.fill(HIST("hDauDeuteronTOFPIDCounter_CloseBC"), 0.5); - if (std::abs(tofNsigmaDeAO2D) < 5 && std::abs(tofNsigmaDeEvSel) < 5) { - registry.fill(HIST("hDauDeuteronTOFPIDCounter_CloseBC"), 1.5); - } else if (std::abs(tofNsigmaDeAO2D) < 5 && std::abs(tofNsigmaDeEvSel) >= 5) { - registry.fill(HIST("hDauDeuteronTOFPIDCounter_CloseBC"), 2.5); - } else if (std::abs(tofNsigmaDeAO2D) >= 5 && std::abs(tofNsigmaDeEvSel) < 5) { - registry.fill(HIST("hDauDeuteronTOFPIDCounter_CloseBC"), 3.5); - } else if (std::abs(tofNsigmaDeAO2D) >= 5 && std::abs(tofNsigmaDeEvSel) >= 5) { - registry.fill(HIST("hDauDeuteronTOFPIDCounter_CloseBC"), 4.5); - } - } - } - } - } - } - } -}; - -// check the performance of mcparticle -struct Hypertriton3bodyMcParticleCheck { - // Basic checks - HistogramRegistry registry{ - "registry", - { - {"hMcCollCounter", "hMcCollCounter", {HistType::kTH1F, {{2, 0.0f, 2.0f}}}}, - - {"h3dMCDecayedHypertriton", "h3dMCDecayedHypertriton", {HistType::kTH3F, {{20, -1.0f, 1.0f, "Rapidity"}, {200, 0.0f, 10.0f, "#it{p}_{T} (GeV/c)"}, {50, 0.0f, 50.0f, "ct(cm)"}}}}, - - {"hMcHypertritonCounter", "hMcHypertritonCounter", {HistType::kTH1F, {{9, 0.0f, 9.0f}}}}, - {"hMcHypertritonPt", "hMcHypertritonPt", {HistType::kTH1F, {{300, 0.0f, 15.0f}}}}, - {"hMcProtonPt", "hMcProtonPt", {HistType::kTH1F, {{200, 0.0f, 10.0f}}}}, - {"hMcPionPt", "hMcPionPt", {HistType::kTH1F, {{200, 0.0f, 10.0f}}}}, - {"hMcDeuteronPt", "hMcDeuteronPt", {HistType::kTH1F, {{200, 0.0f, 10.0f}}}}, - - {"hMcRecoInvMass", "hMcRecoInvMass", {HistType::kTH1F, {{100, 2.95, 3.05f}}}}, - - {"hDiffDaughterR", "hDiffDaughterR", {HistType::kTH1F, {{10000, -100, 100}}}}, // difference between minR of pion&proton and R of deuteron(bachelor) - {"hTrackX", "hTrackX", {HistType::kTH1F, {{10000, -100, 100}}}}, - {"hTrackY", "hTrackY", {HistType::kTH1F, {{10000, -100, 100}}}}, - {"hTrackZ", "hTrackZ", {HistType::kTH1F, {{10000, -100, 100}}}}, - }, - }; - - o2::pid::tof::TOFResoParamsV2 mRespParamsV2; - - void init(InitContext&) - { - registry.get(HIST("hMcCollCounter"))->GetXaxis()->SetBinLabel(1, "Total Counter"); - registry.get(HIST("hMcCollCounter"))->GetXaxis()->SetBinLabel(2, "Reconstructed"); - - registry.get(HIST("hMcHypertritonCounter"))->GetXaxis()->SetBinLabel(1, "Hypertriton All"); - registry.get(HIST("hMcHypertritonCounter"))->GetXaxis()->SetBinLabel(2, "Matter All"); - registry.get(HIST("hMcHypertritonCounter"))->GetXaxis()->SetBinLabel(3, "AntiMatter All"); - registry.get(HIST("hMcHypertritonCounter"))->GetXaxis()->SetBinLabel(4, "confirm to 3-body decay"); - registry.get(HIST("hMcHypertritonCounter"))->GetXaxis()->SetBinLabel(5, "Matter"); - registry.get(HIST("hMcHypertritonCounter"))->GetXaxis()->SetBinLabel(6, "AntiMatter"); - registry.get(HIST("hMcHypertritonCounter"))->GetXaxis()->SetBinLabel(7, "Rapidity"); - registry.get(HIST("hMcHypertritonCounter"))->GetXaxis()->SetBinLabel(8, "Lifetime"); - registry.get(HIST("hMcHypertritonCounter"))->GetXaxis()->SetBinLabel(9, "PtCut"); - } - - Configurable mc_event_selection{"mc_event_selection", true, "mc event selection count post kIsTriggerTVX and kNoTimeFrameBorder"}; - Configurable event_posZ_selection{"event_posZ_selection", true, "event selection count post poZ cut"}; - - Preslice permcCollision = o2::aod::mcparticle::mcCollisionId; - - std::vector mcPartIndices; - template - void SetTrackIDForMC(aod::McParticles const& particlesMC, TTrackTable const& tracks) - { - mcPartIndices.clear(); - mcPartIndices.resize(particlesMC.size()); - std::fill(mcPartIndices.begin(), mcPartIndices.end(), -1); - for (const auto& track : tracks) { - if (track.has_mcParticle()) { - auto mcparticle = track.template mcParticle_as(); - if (mcPartIndices[mcparticle.globalIndex()] == -1) { - mcPartIndices[mcparticle.globalIndex()] = track.globalIndex(); - } else { - auto candTrack = tracks.rawIteratorAt(mcPartIndices[mcparticle.globalIndex()]); - // Use the track which has innest information (also best quality? - if (track.x() < candTrack.x()) { - mcPartIndices[mcparticle.globalIndex()] = track.globalIndex(); - } - } - - // Checks for TrackR - registry.fill(HIST("hTrackX"), track.x()); - registry.fill(HIST("hTrackY"), track.y()); - registry.fill(HIST("hTrackZ"), track.z()); - } - } - } - - void process(aod::McCollisions const& mcCollisions, aod::McParticles const& particlesMC, const o2::soa::Join& collisions, MCLabeledTracksIU const& tracks) - { - SetTrackIDForMC(particlesMC, tracks); - std::vector SelectedEvents(collisions.size()); - int nevts = 0; - for (const auto& collision : collisions) { - if (mc_event_selection && (!collision.selection_bit(aod::evsel::kIsTriggerTVX) || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder))) { - continue; - } - if (event_posZ_selection && std::abs(collision.posZ()) > 10.f) { // 10cm - continue; - } - SelectedEvents[nevts++] = collision.mcCollision_as().globalIndex(); - } - SelectedEvents.resize(nevts); - - for (const auto& mcCollision : mcCollisions) { - registry.fill(HIST("hMcCollCounter"), 0.5); - const auto evtReconstructedAndSelected = std::find(SelectedEvents.begin(), SelectedEvents.end(), mcCollision.globalIndex()) != SelectedEvents.end(); - if (!evtReconstructedAndSelected) { // Check that the event is reconstructed and that the reconstructed events pass the selection - continue; - } - registry.fill(HIST("hMcCollCounter"), 1.5); - - const auto& dparticlesMC = particlesMC.sliceBy(permcCollision, mcCollision.globalIndex()); - - for (const auto& mcparticle : dparticlesMC) { - - if (mcparticle.pdgCode() == 2212 || mcparticle.pdgCode() == -2212) { - registry.fill(HIST("hMcProtonPt"), mcparticle.pt()); - } - if (mcparticle.pdgCode() == 211 || mcparticle.pdgCode() == -211) { - registry.fill(HIST("hMcPionPt"), mcparticle.pt()); - } - if (mcparticle.pdgCode() == 1000010020 || mcparticle.pdgCode() == -1000010020) { - registry.fill(HIST("hMcDeuteronPt"), mcparticle.pt()); - } - if (mcparticle.pdgCode() == 1010010030) { - registry.fill(HIST("hMcHypertritonCounter"), 1.5); - } else if (mcparticle.pdgCode() == -1010010030) { - registry.fill(HIST("hMcHypertritonCounter"), 2.5); - } - if (mcparticle.pdgCode() == 1010010030 || mcparticle.pdgCode() == -1010010030) { - registry.fill(HIST("hMcHypertritonCounter"), 0.5); - registry.fill(HIST("hMcHypertritonPt"), mcparticle.pt()); - - double dauDeuteronPos[3] = {-999, -999, -999}; - double dauProtonMom[3] = {-999, -999, -999}; - double dauPionMom[3] = {-999, -999, -999}; - double dauDeuteronMom[3] = {-999, -999, -999}; - double MClifetime = 999; - double dauProtonTrackR = 9999, dauPionTrackR = 99999, dauDeuteronTrackR = 999999; - bool flag_H3L = is3bodyDecayedH3L(mcparticle); - if (!flag_H3L) { - continue; - } - for (const auto& mcparticleDaughter : mcparticle.daughters_as()) { - if (std::abs(mcparticleDaughter.pdgCode()) == 2212) { - dauProtonMom[0] = mcparticleDaughter.px(); - dauProtonMom[1] = mcparticleDaughter.py(); - dauProtonMom[2] = mcparticleDaughter.pz(); - if (mcPartIndices[mcparticleDaughter.globalIndex()] != -1) { - auto trackProton = tracks.rawIteratorAt(mcPartIndices[mcparticleDaughter.globalIndex()]); - dauProtonTrackR = trackProton.x(); - } - } - if (std::abs(mcparticleDaughter.pdgCode()) == 211) { - dauPionMom[0] = mcparticleDaughter.px(); - dauPionMom[1] = mcparticleDaughter.py(); - dauPionMom[2] = mcparticleDaughter.pz(); - if (mcPartIndices[mcparticleDaughter.globalIndex()] != -1) { - auto trackPion = tracks.rawIteratorAt(mcPartIndices[mcparticleDaughter.globalIndex()]); - dauPionTrackR = trackPion.x(); - } - } - if (std::abs(mcparticleDaughter.pdgCode()) == 1000010020) { - dauDeuteronPos[0] = mcparticleDaughter.vx(); - dauDeuteronPos[1] = mcparticleDaughter.vy(); - dauDeuteronPos[2] = mcparticleDaughter.vz(); - dauDeuteronMom[0] = mcparticleDaughter.px(); - dauDeuteronMom[1] = mcparticleDaughter.py(); - dauDeuteronMom[2] = mcparticleDaughter.pz(); - if (mcPartIndices[mcparticleDaughter.globalIndex()] != -1) { - auto trackDeuteron = tracks.rawIteratorAt(mcPartIndices[mcparticleDaughter.globalIndex()]); - dauDeuteronTrackR = trackDeuteron.x(); - } - } - } - if (mcparticle.pdgCode() == 1010010030) { - registry.fill(HIST("hMcHypertritonCounter"), 3.5); - registry.fill(HIST("hMcHypertritonCounter"), 4.5); - } - if (mcparticle.pdgCode() == -1010010030) { - registry.fill(HIST("hMcHypertritonCounter"), 3.5); - registry.fill(HIST("hMcHypertritonCounter"), 5.5); - } - double hypertritonMCMass = RecoDecay::m(std::array{std::array{dauProtonMom[0], dauProtonMom[1], dauProtonMom[2]}, std::array{dauPionMom[0], dauPionMom[1], dauPionMom[2]}, std::array{dauDeuteronMom[0], dauDeuteronMom[1], dauDeuteronMom[2]}}, std::array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged, o2::constants::physics::MassDeuteron}); - registry.fill(HIST("hMcRecoInvMass"), hypertritonMCMass); - - if (hypertritonMCMass > 2.990 && hypertritonMCMass < 2.993) { - MClifetime = RecoDecay::sqrtSumOfSquares(dauDeuteronPos[0] - mcparticle.vx(), dauDeuteronPos[1] - mcparticle.vy(), dauDeuteronPos[2] - mcparticle.vz()) * o2::constants::physics::MassHyperTriton / mcparticle.p(); - registry.fill(HIST("h3dMCDecayedHypertriton"), mcparticle.y(), mcparticle.pt(), MClifetime); - - double diffTrackR = dauDeuteronTrackR - std::min(dauPionTrackR, dauProtonTrackR); - registry.fill(HIST("hDiffDaughterR"), diffTrackR); - - // int daughterPionCount = 0; - // for (auto& mcparticleDaughter : mcparticle.daughters_as()) { - // if (std::abs(mcparticleDaughter.pdgCode()) == 211) { - // daughterPionCount++; - // } - // } - - // Counter for hypertriton N_gen - if (std::abs(mcparticle.y()) < 1) { - registry.fill(HIST("hMcHypertritonCounter"), 6.5); - if (MClifetime < 40) { - registry.fill(HIST("hMcHypertritonCounter"), 7.5); - if (mcparticle.pt() > 1 && mcparticle.pt() < 10) { - registry.fill(HIST("hMcHypertritonCounter"), 8.5); - } - } - } - } - } - } - } - } -}; - -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - return WorkflowSpec{ - adaptAnalysisTask(cfgc), - adaptAnalysisTask(cfgc), - }; -} diff --git a/PWGLF/Tasks/Nuspex/hypertriton3bodyanalysis.cxx b/PWGLF/Tasks/Nuspex/hypertriton3bodyanalysis.cxx deleted file mode 100644 index b8aeb1d34c3..00000000000 --- a/PWGLF/Tasks/Nuspex/hypertriton3bodyanalysis.cxx +++ /dev/null @@ -1,797 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. -// -/// \file hypertriton3bodyanalysis.cxx -/// \brief Standard analysis workflow for hypertriton 3-body decay -/// \author Yuanzhe Wang - -#include -#include -#include -#include -#include - -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoAHelpers.h" -#include "ReconstructionDataFormats/Track.h" -#include "Common/Core/RecoDecay.h" -#include "Common/Core/trackUtilities.h" -// #include "PWGLF/DataModel/LFStrangenessTables.h" -#include "PWGLF/DataModel/Vtx3BodyTables.h" -#include "Common/Core/TrackSelection.h" -#include "Common/DataModel/TrackSelectionTables.h" -#include "Common/DataModel/EventSelection.h" -#include "Common/DataModel/Centrality.h" -#include "Common/DataModel/PIDResponse.h" -#include "CommonConstants/PhysicsConstants.h" - -using namespace o2; -using namespace o2::framework; -using namespace o2::framework::expressions; - -using FullTracksExtIU = soa::Join; -// using FullTracksExtIU = soa::Join; // For TOF PID check -using MCLabeledTracksIU = soa::Join; - -struct hypertriton3bodyQa { - // Basic checks - HistogramRegistry registry{ - "registry", - { - {"hVtxRadius", "hVtxRadius", {HistType::kTH1F, {{1000, 0.0f, 100.0f, "cm"}}}}, - {"hVtxCosPA", "hVtxCosPA", {HistType::kTH1F, {{1000, 0.9f, 1.0f}}}}, - {"hPtProton", "hPtProton", {HistType::kTH1F, {{200, 0.0f, 10.0f}}}}, - {"hPtPionMinus", "hPtPionMinus", {HistType::kTH1F, {{200, 0.0f, 10.0f}}}}, - {"hPtDeuteron", "hPtDeuteron", {HistType::kTH1F, {{200, 0.0f, 10.0f}}}}, - {"hPtAntiProton", "hPtAntiProton", {HistType::kTH1F, {{200, 0.0f, 10.0f}}}}, - {"hPtPionPlus", "hPtPionPlus", {HistType::kTH1F, {{200, 0.0f, 10.0f}}}}, - {"hPtAntiDeuteron", "hPtAntiDeuteron", {HistType::kTH1F, {{200, 0.0f, 10.0f}}}}, - {"hDCAXYProtonToPV", "hDCAXYProtonToPV", {HistType::kTH1F, {{1000, -10.0f, 10.0f, "cm"}}}}, - {"hDCAXYPionToPV", "hDCAXYPionToPV", {HistType::kTH1F, {{1000, -10.0f, 10.0f, "cm"}}}}, - {"hDCAXYDeuteronToPV", "hDCAXYDeuteronToPV", {HistType::kTH1F, {{1000, -10.0f, 10.0f, "cm"}}}}, - {"hDCAProtonToPV", "hDCAProtonToPV", {HistType::kTH1F, {{1000, -10.0f, 10.0f, "cm"}}}}, - {"hDCAPionToPV", "hDCAPionToPV", {HistType::kTH1F, {{1000, -10.0f, 10.0f, "cm"}}}}, - {"hDCADeuteronToPV", "hDCADeuteronToPV", {HistType::kTH1F, {{1000, -10.0f, 10.0f, "cm"}}}}, - {"hProtonTPCNcls", "hProtonTPCNcls", {HistType::kTH1F, {{300, 0, 300, "TPC cluster"}}}}, - {"hPionTPCNcls", "hPionTPCNcls", {HistType::kTH1F, {{300, 0, 300, "TPC cluster"}}}}, - {"hDeuteronTPCNcls", "hDeuteronTPCNcls", {HistType::kTH1F, {{300, 0, 300, "TPC cluster"}}}}, - {"hDCAVtxDau", "hDCAVtxDau", {HistType::kTH1F, {{1000, 0.0f, 10.0f, "cm^{2}"}}}}, - {"hVtxPt", "hVtxPt", {HistType::kTH1F, {{200, 0.0f, 10.0f, "p_{T}"}}}}, - {"hTOFPIDDeuteron", "hTOFPIDDeuteron", {HistType::kTH1F, {{2000, -100.0f, 100.0f}}}}, - {"hDeuTOFNsigma", "Deuteron TOF Nsigma distribution", {HistType::kTH2F, {{1200, -6, 6, "#it{p} (GeV/#it{c})"}, {2000, -100, 100, "TOF n#sigma"}}}}, - {"hDeuTOFNsigmaWithTPC", "Deuteron TOF Nsigma distribution", {HistType::kTH2F, {{1200, -6, 6, "#it{p} (GeV/#it{c})"}, {1000, -100, 100, "TOF n#sigma"}}}}, - }, - }; - - void init(InitContext const&) - { - AxisSpec massAxis = {120, 2.9f, 3.2f, "Inv. Mass (GeV/c^{2})"}; - registry.add("hMassHypertriton", "hMassHypertriton", {HistType::kTH1F, {massAxis}}); - registry.add("hMassAntiHypertriton", "hMassAntiHypertriton", {HistType::kTH1F, {massAxis}}); - // Check for selection criteria - registry.add("hDiffRVtxProton", "hDiffRVtxProton", HistType::kTH1F, {{100, -10, 10}}); // difference between the radius of decay vertex and minR of proton - registry.add("hDiffRVtxPion", "hDiffRVtxPion", HistType::kTH1F, {{100, -10, 10}}); // difference between the radius of decay vertex and minR of pion - registry.add("hDiffRVtxDeuteron", "hDiffRVtxDeuteron", HistType::kTH1F, {{100, -10, 10}}); // difference between the radius of decay vertex and minR of deuteron - registry.add("hDiffDaughterR", "hDiffDaughterR", HistType::kTH1F, {{10000, -100, 100}}); // difference between minR of pion&proton and R of deuteron(bachelor) - } - - void process(aod::Collision const& collision, aod::Vtx3BodyDatas const& vtx3bodydatas, FullTracksExtIU const& /*tracks*/) - { - for (const auto& vtx : vtx3bodydatas) { - auto track0 = vtx.track0_as(); - auto track1 = vtx.track1_as(); - auto track2 = vtx.track2_as(); - - registry.fill(HIST("hVtxRadius"), vtx.vtxradius()); - registry.fill(HIST("hVtxCosPA"), vtx.vtxcosPA(collision.posX(), collision.posY(), collision.posZ())); - registry.fill(HIST("hDCAVtxDau"), vtx.dcaVtxdaughters()); - registry.fill(HIST("hVtxPt"), vtx.pt()); - registry.fill(HIST("hMassHypertriton"), vtx.mHypertriton()); - registry.fill(HIST("hMassAntiHypertriton"), vtx.mAntiHypertriton()); - if (std::abs(track2.tpcNSigmaDe()) < 5) { - registry.fill(HIST("hDeuTOFNsigmaWithTPC"), track2.tpcInnerParam() * track2.sign(), vtx.tofNSigmaBachDe()); - } - if (track2.sign() > 0) { - registry.fill(HIST("hPtProton"), track0.pt()); - registry.fill(HIST("hPtPionMinus"), track1.pt()); - registry.fill(HIST("hPtDeuteron"), track2.pt()); - registry.fill(HIST("hDCAXYProtonToPV"), vtx.dcaXYtrack0topv()); - registry.fill(HIST("hDCAXYPionToPV"), vtx.dcaXYtrack1topv()); - registry.fill(HIST("hDCAProtonToPV"), vtx.dcatrack0topv()); - registry.fill(HIST("hDCAPionToPV"), vtx.dcatrack1topv()); - registry.fill(HIST("hProtonTPCNcls"), track0.tpcNClsCrossedRows()); - registry.fill(HIST("hPionTPCNcls"), track1.tpcNClsCrossedRows()); - registry.fill(HIST("hDiffRVtxProton"), track0.x() - vtx.vtxradius()); - registry.fill(HIST("hDiffRVtxPion"), track1.x() - vtx.vtxradius()); - } else { - registry.fill(HIST("hPtPionPlus"), track0.pt()); - registry.fill(HIST("hPtAntiProton"), track1.pt()); - registry.fill(HIST("hPtAntiDeuteron"), track2.pt()); - registry.fill(HIST("hDCAXYProtonToPV"), vtx.dcaXYtrack1topv()); - registry.fill(HIST("hDCAXYPionToPV"), vtx.dcaXYtrack0topv()); - registry.fill(HIST("hDCAProtonToPV"), vtx.dcatrack1topv()); - registry.fill(HIST("hDCAPionToPV"), vtx.dcatrack0topv()); - registry.fill(HIST("hProtonTPCNcls"), track1.tpcNClsCrossedRows()); - registry.fill(HIST("hPionTPCNcls"), track0.tpcNClsCrossedRows()); - registry.fill(HIST("hDiffRVtxProton"), track1.x() - vtx.vtxradius()); - registry.fill(HIST("hDiffRVtxPion"), track0.x() - vtx.vtxradius()); - } - registry.fill(HIST("hDCAXYDeuteronToPV"), vtx.dcaXYtrack2topv()); - registry.fill(HIST("hDCADeuteronToPV"), vtx.dcatrack2topv()); - registry.fill(HIST("hDeuteronTPCNcls"), track2.tpcNClsCrossedRows()); - registry.fill(HIST("hTOFPIDDeuteron"), vtx.tofNSigmaBachDe()); - registry.fill(HIST("hDeuTOFNsigma"), track2.tpcInnerParam() * track2.sign(), vtx.tofNSigmaBachDe()); - registry.fill(HIST("hDiffRVtxDeuteron"), track2.x() - vtx.vtxradius()); - float diffTrackR = track2.x() - std::min(track0.x(), track1.x()); - registry.fill(HIST("hDiffDaughterR"), diffTrackR); - } - } -}; - -struct hypertriton3bodyAnalysis { - - Preslice perCollisionVtx3BodyDatas = o2::aod::vtx3body::collisionId; - - // Selection criteria - Configurable vtxcospa{"vtxcospa", 0.99, "Vtx CosPA"}; // double -> N.B. dcos(x)/dx = 0 at x=0) - Configurable dcavtxdau{"dcavtxdau", 1.0, "DCA Vtx Daughters"}; // loose cut - Configurable dcapiontopv{"dcapiontopv", .05, "DCA Pion To PV"}; - Configurable etacut{"etacut", 0.9, "etacut"}; - Configurable rapiditycut{"rapiditycut", 1, "rapiditycut"}; - Configurable tofPIDNSigmaMin{"tofPIDNSigmaMin", -5, "tofPIDNSigmaMin"}; - Configurable tofPIDNSigmaMax{"tofPIDNSigmaMax", 5, "tofPIDNSigmaMax"}; - Configurable tpcPIDNSigmaCut{"tpcPIDNSigmaCut", 5, "tpcPIDNSigmaCut"}; - Configurable event_sel8_selection{"event_sel8_selection", true, "event selection count post sel8 cut"}; - Configurable mc_event_selection{"mc_event_selection", true, "mc event selection count post kIsTriggerTVX and kNoTimeFrameBorder"}; - Configurable event_posZ_selection{"event_posZ_selection", true, "event selection count post poZ cut"}; - Configurable lifetimecut{"lifetimecut", 40., "lifetimecut"}; // ct - Configurable minProtonPt{"minProtonPt", 0.3, "minProtonPt"}; - Configurable maxProtonPt{"maxProtonPt", 5, "maxProtonPt"}; - Configurable minPionPt{"minPionPt", 0.1, "minPionPt"}; - Configurable maxPionPt{"maxPionPt", 1.2, "maxPionPt"}; - Configurable minDeuteronPt{"minDeuteronPt", 0.6, "minDeuteronPt"}; - Configurable maxDeuteronPt{"maxDeuteronPt", 10, "maxDeuteronPt"}; - Configurable minDeuteronPUseTOF{"minDeuteronPUseTOF", 1, "minDeuteronPt Enable TOF PID"}; - Configurable h3LMassLowerlimit{"h3LMassLowerlimit", 2.96, "Hypertriton mass lower limit"}; - Configurable h3LMassUpperlimit{"h3LMassUpperlimit", 3.04, "Hypertriton mass upper limit"}; - Configurable mintpcNClsproton{"mintpcNClsproton", 90, "min tpc Nclusters for proton"}; - Configurable mintpcNClspion{"mintpcNClspion", 70, "min tpc Nclusters for pion"}; - Configurable mintpcNClsdeuteron{"mintpcNClsdeuteron", 100, "min tpc Nclusters for deuteron"}; - - Configurable mcsigma{"mcsigma", 0.0015, "sigma of mc invariant mass fit"}; // obtained from MC - Configurable bachelorPdgCode{"bachelorPdgCode", 1000010020, "pdgCode of bachelor daughter"}; - Configurable motherPdgCode{"motherPdgCode", 1010010030, "pdgCode of mother track"}; - - // 3sigma region for Dalitz plot - float lowersignallimit = o2::constants::physics::MassHyperTriton - 3 * mcsigma; - float uppersignallimit = o2::constants::physics::MassHyperTriton + 3 * mcsigma; - - HistogramRegistry registry{ - "registry", - { - {"hEventCounter", "hEventCounter", {HistType::kTH1F, {{4, 0.0f, 4.0f}}}}, - {"hCandidatesCounter", "hCandidatesCounter", {HistType::kTH1F, {{12, 0.0f, 12.0f}}}}, - {"hMassHypertriton", "hMassHypertriton", {HistType::kTH1F, {{80, 2.96f, 3.04f, "Inv. Mass (GeV/c^{2})"}}}}, - {"hMassAntiHypertriton", "hMassAntiHypertriton", {HistType::kTH1F, {{80, 2.96f, 3.04f, "Inv. Mass (GeV/c^{2})"}}}}, - {"hMassHypertritonTotal", "hMassHypertritonTotal", {HistType::kTH1F, {{300, 2.9f, 3.2f, "Inv. Mass (GeV/c^{2})"}}}}, - {"hPtProton", "hPtProton", {HistType::kTH1F, {{200, 0.0f, 10.0f, "#it{p}_{T} (GeV/c)"}}}}, - {"hPtPionMinus", "hPtPionMinus", {HistType::kTH1F, {{200, 0.0f, 10.0f, "#it{p}_{T} (GeV/c)"}}}}, - {"hPtDeuteron", "hPtDeuteron", {HistType::kTH1F, {{200, 0.0f, 10.0f, "#it{p}_{T} (GeV/c)"}}}}, - {"hPtAntiProton", "hPtAntiProton", {HistType::kTH1F, {{200, 0.0f, 10.0f, "#it{p}_{T} (GeV/c)"}}}}, - {"hPtPionPlus", "hPtPionPlus", {HistType::kTH1F, {{200, 0.0f, 10.0f, "#it{p}_{T} (GeV/c)"}}}}, - {"hPtAntiDeuteron", "hPtAntiDeuteron", {HistType::kTH1F, {{200, 0.0f, 10.0f, "#it{p}_{T} (GeV/c)"}}}}, - {"hDCAXYProtonToPV", "hDCAXYProtonToPV", {HistType::kTH1F, {{1000, -10.0f, 10.0f, "cm"}}}}, - {"hDCAXYPionToPV", "hDCAXYPionToPV", {HistType::kTH1F, {{1000, -10.0f, 10.0f, "cm"}}}}, - {"hDCAXYDeuteronToPV", "hDCAXYDeuteronToPV", {HistType::kTH1F, {{1000, -10.0f, 10.0f, "cm"}}}}, - {"hDCAProtonToPV", "hDCAProtonToPV", {HistType::kTH1F, {{1000, -10.0f, 10.0f, "cm"}}}}, - {"hDCAPionToPV", "hDCAPionToPV", {HistType::kTH1F, {{1000, -10.0f, 10.0f, "cm"}}}}, - {"hDCADeuteronToPV", "hDCADeuteronToPV", {HistType::kTH1F, {{1000, -10.0f, 10.0f, "cm"}}}}, - {"hProtonTPCNcls", "hProtonTPCNcls", {HistType::kTH1F, {{180, 0, 180, "TPC cluster"}}}}, - {"hPionTPCNcls", "hPionTPCNcls", {HistType::kTH1F, {{180, 0, 180, "TPC cluster"}}}}, - {"hDeuteronTPCNcls", "hDeuteronTPCNcls", {HistType::kTH1F, {{180, 0, 180, "TPC cluster"}}}}, - {"hVtxCosPA", "hVtxCosPA", {HistType::kTH1F, {{1000, 0.9f, 1.0f}}}}, - {"hDCAVtxDau", "hDCAVtxDau", {HistType::kTH1F, {{1000, 0.0f, 10.0f, "cm^{2}"}}}}, - {"hTOFPIDDeuteron", "hTOFPIDDeuteron", {HistType::kTH1F, {{2000, -100.0f, 100.0f}}}}, - {"hTPCPIDProton", "hTPCPIDProton", {HistType::kTH1F, {{120, -6.0f, 6.0f}}}}, - {"hTPCPIDPion", "hTPCPIDPion", {HistType::kTH1F, {{120, -6.0f, 6.0f}}}}, - {"hTPCPIDDeuteron", "hTPCPIDDeuteron", {HistType::kTH1F, {{120, -6.0f, 6.0f}}}}, - {"hProtonTPCBB", "hProtonTPCBB", {HistType::kTH2F, {{160, -8.0f, 8.0f, "p/z(GeV/c)"}, {200, 0.0f, 1000.0f, "TPCSignal"}}}}, - {"hPionTPCBB", "hPionTPCBB", {HistType::kTH2F, {{160, -8.0f, 8.0f, "p/z(GeV/c)"}, {200, 0.0f, 1000.0f, "TPCSignal"}}}}, - {"hDeuteronTPCBB", "hDeuteronTPCBB", {HistType::kTH2F, {{160, -8.0f, 8.0f, "p/z(GeV/c)"}, {200, 0.0f, 1000.0f, "TPCSignal"}}}}, - {"hProtonTPCVsPt", "hProtonTPCVsPt", {HistType::kTH2F, {{50, 0.0f, 5.0f, "#it{p}_{T} (GeV/c)"}, {120, -6.0f, 6.0f, "TPC n#sigma"}}}}, - {"hPionTPCVsPt", "hPionTPCVsPt", {HistType::kTH2F, {{20, 0.0f, 2.0f, "#it{p}_{T} (GeV/c)"}, {120, -6.0f, 6.0f, "TPC n#sigma"}}}}, - {"hDeuteronTPCVsPt", "hDeuteronTPCVsPt", {HistType::kTH2F, {{80, 0.0f, 8.0f, "#it{p}_{T} (GeV/c)"}, {120, -6.0f, 6.0f, "TPC n#sigma"}}}}, - {"hDeuteronTOFVsPBeforeTOFCut", "hDeuteronTOFVsPBeforeTOFCut", {HistType::kTH2F, {{40, -10.0f, 10.0f, "p/z (GeV/c)"}, {40, -10.0f, 10.0f, "TOF n#sigma"}}}}, - {"hDeuteronTOFVsPAfterTOFCut", "hDeuteronTOFVsPAfterTOFCut", {HistType::kTH2F, {{40, -10.0f, 10.0f, "p/z (GeV/c)"}, {40, -10.0f, 10.0f, "TOF n#sigma"}}}}, - - {"hDalitz", "hDalitz", {HistType::kTH2F, {{120, 7.85, 8.45, "M^{2}(dp) (GeV^{2}/c^{4})"}, {60, 1.1, 1.4, "M^{2}(p#pi) (GeV^{2}/c^{4})"}}}}, - {"h3dMassHypertriton", "h3dMassHypertriton", {HistType::kTH3F, {{20, 0.0f, 100.0f, "Cent (%)"}, {100, 0.0f, 10.0f, "#it{p}_{T} (GeV/c)"}, {80, 2.96f, 3.04f, "Inv. Mass (GeV/c^{2})"}}}}, - {"h3dMassAntiHypertriton", "h3dMassAntiHypertriton", {HistType::kTH3F, {{20, 0.0f, 100.0f, "Cent (%)"}, {100, 0.0f, 10.0f, "#it{p}_{T} (GeV/c)"}, {80, 2.96f, 3.04f, "Inv. Mass (GeV/c^{2})"}}}}, - {"h3dTotalHypertriton", "h3dTotalHypertriton", {HistType::kTH3F, {{50, 0, 50, "ct(cm)"}, {100, 0.0f, 10.0f, "#it{p}_{T} (GeV/c)"}, {80, 2.96f, 3.04f, "Inv. Mass (GeV/c^{2})"}}}}, - - {"hDeuteronTOFVsPBeforeTOFCutSig", "hDeuteronTOFVsPBeforeTOFCutSig", {HistType::kTH2F, {{40, -10.0f, 10.0f, "p/z (GeV/c)"}, {40, -10.0f, 10.0f, "TOF n#sigma"}}}}, - {"hDeuteronTOFVsPAfterTOFCutSig", "hDeuteronTOFVsPAfterTOFCutSig", {HistType::kTH2F, {{40, -10.0f, 10.0f, "p/z (GeV/c)"}, {40, -10.0f, 10.0f, "TOF n#sigma"}}}}, - {"h3dTotalTrueHypertriton", "h3dTotalTrueHypertriton", {HistType::kTH3F, {{50, 0, 50, "ct(cm)"}, {100, 0.0f, 10.0f, "#it{p}_{T} (GeV/c)"}, {80, 2.96f, 3.04f, "Inv. Mass (GeV/c^{2})"}}}}, - // For TOF PID check - /*{"hDeuteronDefaultTOFVsPBeforeTOFCut", "hDeuteronDefaultTOFVsPBeforeTOFCut", {HistType::kTH2F, {{40, -10.0f, 10.0f, "p/z (GeV/c)"}, {40, -10.0f, 10.0f, "TOF n#sigma"}}}}, - {"hDeuteronDefaultTOFVsPAtferTOFCut", "hDeuteronDefaultTOFVsPAtferTOFCut", {HistType::kTH2F, {{40, -10.0f, 10.0f, "p/z (GeV/c)"}, {40, -10.0f, 10.0f, "TOF n#sigma"}}}}, - {"hDeuteronDefaultTOFVsPBeforeTOFCutSig", "hDeuteronDefaultTOFVsPBeforeTOFCutSig", {HistType::kTH2F, {{40, -10.0f, 10.0f, "p/z (GeV/c)"}, {40, -10.0f, 10.0f, "TOF n#sigma"}}}}, - {"hDeuteronDefaultTOFVsPAfterTOFCutSig", "hDeuteronDefaultTOFVsPAfterTOFCutSig", {HistType::kTH2F, {{40, -10.0f, 10.0f, "p/z (GeV/c)"}, {40, -10.0f, 10.0f, "TOF n#sigma"}}}},*/ - }, - }; - - //------------------------------------------------------------------ - // Fill stats histograms - enum vtxstep { kCandAll = 0, - kCandDauEta, - kCandDauPt, - kCandTPCNcls, - kCandTPCPID, - kCandTOFPID, - kCandDcaToPV, - kCandRapidity, - kCandct, - kCandCosPA, - kCandDcaDau, - kCandInvMass, - kNCandSteps }; - - struct { - std::array candstats; - std::array truecandstats; - } statisticsRegistry; - - void resetHistos() - { - for (int ii = 0; ii < kNCandSteps; ii++) { - statisticsRegistry.candstats[ii] = 0; - statisticsRegistry.truecandstats[ii] = 0; - } - } - void FillCandCounter(int kn, bool istrue = false) - { - statisticsRegistry.candstats[kn]++; - if (istrue) { - statisticsRegistry.truecandstats[kn]++; - } - } - void fillHistos() - { - for (int ii = 0; ii < kNCandSteps; ii++) { - registry.fill(HIST("hCandidatesCounter"), ii, statisticsRegistry.candstats[ii]); - if (doprocessMC == true) { - registry.fill(HIST("hTrueHypertritonCounter"), ii, statisticsRegistry.truecandstats[ii]); - } - } - } - - ConfigurableAxis dcaBinning{"dca-binning", {200, 0.0f, 1.0f}, ""}; - ConfigurableAxis ptBinning{"pt-binning", {200, 0.0f, 10.0f}, ""}; - - void init(InitContext const&) - { - registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(1, "total"); - registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(2, "sel8"); - registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(3, "vertexZ"); - registry.get(HIST("hEventCounter"))->GetXaxis()->SetBinLabel(4, "has Candidate"); - - if (doprocessMC == true) { - registry.add("hTrueHypertritonCounter", "hTrueHypertritonCounter", HistType::kTH1F, {{12, 0.0f, 12.0f}}); - auto hGeneratedHypertritonCounter = registry.add("hGeneratedHypertritonCounter", "hGeneratedHypertritonCounter", HistType::kTH1F, {{2, 0.0f, 2.0f}}); - hGeneratedHypertritonCounter->GetXaxis()->SetBinLabel(1, "Total"); - hGeneratedHypertritonCounter->GetXaxis()->SetBinLabel(2, "3-body decay"); - registry.add("hPtGeneratedHypertriton", "hPtGeneratedHypertriton", HistType::kTH1F, {{200, 0.0f, 10.0f}}); - registry.add("hctGeneratedHypertriton", "hctGeneratedHypertriton", HistType::kTH1F, {{50, 0, 50, "ct(cm)"}}); - registry.add("hEtaGeneratedHypertriton", "hEtaGeneratedHypertriton", HistType::kTH1F, {{40, -2.0f, 2.0f}}); - registry.add("hRapidityGeneratedHypertriton", "hRapidityGeneratedHypertriton", HistType::kTH1F, {{40, -2.0f, 2.0f}}); - registry.add("hPtGeneratedAntiHypertriton", "hPtGeneratedAntiHypertriton", HistType::kTH1F, {{200, 0.0f, 10.0f}}); - registry.add("hctGeneratedAntiHypertriton", "hctGeneratedAntiHypertriton", HistType::kTH1F, {{50, 0, 50, "ct(cm)"}}); - registry.add("hEtaGeneratedAntiHypertriton", "hEtaGeneratedAntiHypertriton", HistType::kTH1F, {{40, -2.0f, 2.0f}}); - registry.add("hRapidityGeneratedAntiHypertriton", "hRapidityGeneratedAntiHypertriton", HistType::kTH1F, {{40, -2.0f, 2.0f}}); - } - - TString CandCounterbinLabel[kNCandSteps] = {"Total", "TrackEta", "DauPt", "TPCNcls", "TPCPID", "d TOFPID", "PionDcatoPV", "MomRapidity", "Lifetime", "VtxCosPA", "VtxDcaDau", "InvMass"}; - for (int i{0}; i < kNCandSteps; i++) { - registry.get(HIST("hCandidatesCounter"))->GetXaxis()->SetBinLabel(i + 1, CandCounterbinLabel[i]); - if (doprocessMC == true) { - registry.get(HIST("hTrueHypertritonCounter"))->GetXaxis()->SetBinLabel(i + 1, CandCounterbinLabel[i]); - } - } - } - - //------------------------------------------------------------------ - // Selections for candidates - template - bool SelectCand(TCollisionTable const& collision, TCandTable const& candData, TTrackTable const& trackProton, TTrackTable const& trackPion, TTrackTable const& trackDeuteron, bool isMatter, bool isTrueCand = false, double MClifetime = -1, double lPt = -1) - { - FillCandCounter(kCandAll, isTrueCand); - - // Selection on daughters - if (std::abs(trackProton.eta()) > etacut || std::abs(trackPion.eta()) > etacut || std::abs(trackDeuteron.eta()) > etacut) { - return false; - } - FillCandCounter(kCandDauEta, isTrueCand); - - if (trackProton.pt() < minProtonPt || trackProton.pt() > maxProtonPt || trackPion.pt() < minPionPt || trackPion.pt() > maxPionPt || trackDeuteron.pt() < minDeuteronPt || trackDeuteron.pt() > maxDeuteronPt) { - return false; - } - FillCandCounter(kCandDauPt, isTrueCand); - - if (trackProton.tpcNClsFound() < mintpcNClsproton || trackPion.tpcNClsFound() < mintpcNClspion || trackDeuteron.tpcNClsFound() < mintpcNClsdeuteron) { - return false; - } - FillCandCounter(kCandTPCNcls, isTrueCand); - - if (std::abs(trackProton.tpcNSigmaPr()) > tpcPIDNSigmaCut || std::abs(trackPion.tpcNSigmaPi()) > tpcPIDNSigmaCut || std::abs(trackDeuteron.tpcNSigmaDe()) > tpcPIDNSigmaCut) { - return false; - } - FillCandCounter(kCandTPCPID, isTrueCand); - - // registry.fill(HIST("hDeuteronDefaultTOFVsPBeforeTOFCut"), trackDeuteron.sign() * trackDeuteron.p(), trackDeuteron.tofNSigmaDe()); - registry.fill(HIST("hDeuteronTOFVsPBeforeTOFCut"), trackDeuteron.sign() * trackDeuteron.p(), candData.tofNSigmaBachDe()); - if (isTrueCand) { - // registry.fill(HIST("hDeuteronDefaultTOFVsPBeforeTOFCutSig"), trackDeuteron.sign() * trackDeuteron.p(), trackDeuteron.tofNSigmaDe()); - registry.fill(HIST("hDeuteronTOFVsPBeforeTOFCutSig"), trackDeuteron.sign() * trackDeuteron.p(), candData.tofNSigmaBachDe()); - } - if ((candData.tofNSigmaBachDe() < tofPIDNSigmaMin || candData.tofNSigmaBachDe() > tofPIDNSigmaMax) && trackDeuteron.p() > minDeuteronPUseTOF) { - return false; - } - FillCandCounter(kCandTOFPID, isTrueCand); - // registry.fill(HIST("hDeuteronDefaultTOFVsPAtferTOFCut"), trackDeuteron.sign() * trackDeuteron.p(), trackDeuteron.tofNSigmaDe()); - registry.fill(HIST("hDeuteronTOFVsPAfterTOFCut"), trackDeuteron.sign() * trackDeuteron.p(), candData.tofNSigmaBachDe()); - if (isTrueCand) { - // registry.fill(HIST("hDeuteronDefaultTOFVsPAfterTOFCutSig"), trackDeuteron.sign() * trackDeuteron.p(), trackDeuteron.tofNSigmaDe()); - registry.fill(HIST("hDeuteronTOFVsPAfterTOFCutSig"), trackDeuteron.sign() * trackDeuteron.p(), candData.tofNSigmaBachDe()); - } - - double dcapion = isMatter ? candData.dcatrack1topv() : candData.dcatrack0topv(); - if (std::abs(dcapion) < dcapiontopv) { - return false; - } - FillCandCounter(kCandDcaToPV, isTrueCand); - - // Selection on candidate hypertriton - if (std::abs(candData.yHypertriton()) > rapiditycut) { - return false; - } - FillCandCounter(kCandRapidity, isTrueCand); - - double ct = candData.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * o2::constants::physics::MassHyperTriton; - if (ct > lifetimecut) { - return false; - } - FillCandCounter(kCandct, isTrueCand); - - double cospa = candData.vtxcosPA(collision.posX(), collision.posY(), collision.posZ()); - if (cospa < vtxcospa) { - return false; - } - FillCandCounter(kCandCosPA, isTrueCand); - - if (candData.dcaVtxdaughters() > dcavtxdau) { - return false; - } - FillCandCounter(kCandDcaDau, isTrueCand); - - if ((isMatter && candData.mHypertriton() > h3LMassLowerlimit && candData.mHypertriton() < h3LMassUpperlimit)) { - // Hypertriton - registry.fill(HIST("hPtProton"), trackProton.pt()); - registry.fill(HIST("hPtPionMinus"), trackPion.pt()); - registry.fill(HIST("hPtDeuteron"), trackDeuteron.pt()); - registry.fill(HIST("hDCAXYProtonToPV"), candData.dcaXYtrack0topv()); - registry.fill(HIST("hDCAXYPionToPV"), candData.dcaXYtrack1topv()); - registry.fill(HIST("hDCAProtonToPV"), candData.dcatrack0topv()); - registry.fill(HIST("hDCAPionToPV"), candData.dcatrack1topv()); - - registry.fill(HIST("hMassHypertriton"), candData.mHypertriton()); - registry.fill(HIST("hMassHypertritonTotal"), candData.mHypertriton()); - registry.fill(HIST("h3dMassHypertriton"), 0., candData.pt(), candData.mHypertriton()); // collision.centV0M() instead of 0. once available - registry.fill(HIST("h3dTotalHypertriton"), ct, candData.pt(), candData.mHypertriton()); - if (candData.mHypertriton() > lowersignallimit && candData.mHypertriton() < uppersignallimit) { - registry.fill(HIST("hDalitz"), RecoDecay::m2(std::array{std::array{candData.pxtrack0(), candData.pytrack0(), candData.pztrack0()}, std::array{candData.pxtrack2(), candData.pytrack2(), candData.pztrack2()}}, std::array{o2::constants::physics::MassProton, o2::constants::physics::MassDeuteron}), RecoDecay::m2(std::array{std::array{candData.pxtrack0(), candData.pytrack0(), candData.pztrack0()}, std::array{candData.pxtrack1(), candData.pytrack1(), candData.pztrack1()}}, std::array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged})); - } - if (isTrueCand) { - registry.fill(HIST("h3dTotalTrueHypertriton"), MClifetime, lPt, candData.mHypertriton()); - } - } else if ((!isMatter && candData.mAntiHypertriton() > h3LMassLowerlimit && candData.mAntiHypertriton() < h3LMassUpperlimit)) { - // AntiHypertriton - registry.fill(HIST("hPtAntiProton"), trackProton.pt()); - registry.fill(HIST("hPtPionPlus"), trackPion.pt()); - registry.fill(HIST("hPtAntiDeuteron"), trackDeuteron.pt()); - registry.fill(HIST("hDCAXYProtonToPV"), candData.dcaXYtrack1topv()); - registry.fill(HIST("hDCAXYPionToPV"), candData.dcaXYtrack0topv()); - registry.fill(HIST("hDCAProtonToPV"), candData.dcatrack1topv()); - registry.fill(HIST("hDCAPionToPV"), candData.dcatrack0topv()); - - registry.fill(HIST("hMassAntiHypertriton"), candData.mAntiHypertriton()); - registry.fill(HIST("hMassHypertritonTotal"), candData.mAntiHypertriton()); - registry.fill(HIST("h3dMassAntiHypertriton"), 0., candData.pt(), candData.mAntiHypertriton()); // collision.centV0M() instead of 0. once available - registry.fill(HIST("h3dTotalHypertriton"), ct, candData.pt(), candData.mAntiHypertriton()); - if (candData.mAntiHypertriton() > lowersignallimit && candData.mAntiHypertriton() < uppersignallimit) { - registry.fill(HIST("hDalitz"), RecoDecay::m2(std::array{std::array{candData.pxtrack1(), candData.pytrack1(), candData.pztrack1()}, std::array{candData.pxtrack2(), candData.pytrack2(), candData.pztrack2()}}, std::array{o2::constants::physics::MassProton, o2::constants::physics::MassDeuteron}), RecoDecay::m2(std::array{std::array{candData.pxtrack1(), candData.pytrack1(), candData.pztrack1()}, std::array{candData.pxtrack0(), candData.pytrack0(), candData.pztrack0()}}, std::array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged})); - } - if (isTrueCand) { - registry.fill(HIST("h3dTotalTrueHypertriton"), MClifetime, lPt, candData.mHypertriton()); - } - } else { - return false; - } - - FillCandCounter(kCandInvMass, isTrueCand); - - registry.fill(HIST("hDCAXYDeuteronToPV"), candData.dcaXYtrack2topv()); - registry.fill(HIST("hDCADeuteronToPV"), candData.dcatrack2topv()); - registry.fill(HIST("hVtxCosPA"), candData.vtxcosPA(collision.posX(), collision.posY(), collision.posZ())); - registry.fill(HIST("hDCAVtxDau"), candData.dcaVtxdaughters()); - registry.fill(HIST("hProtonTPCNcls"), trackProton.tpcNClsCrossedRows()); - registry.fill(HIST("hPionTPCNcls"), trackPion.tpcNClsCrossedRows()); - registry.fill(HIST("hDeuteronTPCNcls"), trackDeuteron.tpcNClsCrossedRows()); - registry.fill(HIST("hTPCPIDProton"), trackProton.tpcNSigmaPr()); - registry.fill(HIST("hTPCPIDPion"), trackPion.tpcNSigmaPi()); - registry.fill(HIST("hTPCPIDDeuteron"), trackDeuteron.tpcNSigmaDe()); - registry.fill(HIST("hProtonTPCBB"), trackProton.sign() * trackProton.p(), trackProton.tpcSignal()); - registry.fill(HIST("hPionTPCBB"), trackPion.sign() * trackPion.p(), trackPion.tpcSignal()); - registry.fill(HIST("hDeuteronTPCBB"), trackDeuteron.sign() * trackDeuteron.p(), trackDeuteron.tpcSignal()); - registry.fill(HIST("hProtonTPCVsPt"), trackProton.pt(), trackProton.tpcNSigmaPr()); - registry.fill(HIST("hPionTPCVsPt"), trackProton.pt(), trackPion.tpcNSigmaPi()); - registry.fill(HIST("hDeuteronTPCVsPt"), trackDeuteron.pt(), trackDeuteron.tpcNSigmaDe()); - registry.fill(HIST("hTOFPIDDeuteron"), candData.tofNSigmaBachDe()); - - return true; - } - - //------------------------------------------------------------------ - // Analysis process for a single candidate - template - void CandidateAnalysis(TCollisionTable const& collision, TCandTable const& candData, bool& if_hasvtx, bool isTrueCand = false, double MClifetime = -1, double lPt = -1) - { - - auto track0 = candData.template track0_as(); - auto track1 = candData.template track1_as(); - auto track2 = candData.template track2_as(); - - bool isMatter = track2.sign() > 0; - - auto& trackProton = isMatter ? track0 : track1; - auto& trackPion = isMatter ? track1 : track0; - auto& trackDeuteron = track2; - - if (SelectCand(collision, candData, trackProton, trackPion, trackDeuteron, isMatter, isTrueCand, MClifetime, lPt)) { - if_hasvtx = true; - } - } - - //------------------------------------------------------------------ - // collect information for generated hypertriton (should be called after event selection) - void GetGeneratedH3LInfo(aod::McParticles const& particlesMC) - { - for (const auto& mcparticle : particlesMC) { - if (std::abs(mcparticle.pdgCode()) != motherPdgCode) { - continue; - } - registry.fill(HIST("hGeneratedHypertritonCounter"), 0.5); - - bool haveProton = false, havePionPlus = false, haveDeuteron = false; - bool haveAntiProton = false, havePionMinus = false, haveAntiDeuteron = false; - double MClifetime = -1; - for (const auto& mcparticleDaughter : mcparticle.template daughters_as()) { - if (mcparticleDaughter.pdgCode() == 2212) - haveProton = true; - if (mcparticleDaughter.pdgCode() == -2212) - haveAntiProton = true; - if (mcparticleDaughter.pdgCode() == 211) - havePionPlus = true; - if (mcparticleDaughter.pdgCode() == -211) - havePionMinus = true; - if (mcparticleDaughter.pdgCode() == bachelorPdgCode) { - haveDeuteron = true; - MClifetime = RecoDecay::sqrtSumOfSquares(mcparticleDaughter.vx() - mcparticle.vx(), mcparticleDaughter.vy() - mcparticle.vy(), mcparticleDaughter.vz() - mcparticle.vz()) * o2::constants::physics::MassHyperTriton / mcparticle.p(); - } - if (mcparticleDaughter.pdgCode() == -bachelorPdgCode) { - haveAntiDeuteron = true; - MClifetime = RecoDecay::sqrtSumOfSquares(mcparticleDaughter.vx() - mcparticle.vx(), mcparticleDaughter.vy() - mcparticle.vy(), mcparticleDaughter.vz() - mcparticle.vz()) * o2::constants::physics::MassHyperTriton / mcparticle.p(); - } - } - if (haveProton && havePionMinus && haveDeuteron && mcparticle.pdgCode() == motherPdgCode) { - registry.fill(HIST("hGeneratedHypertritonCounter"), 1.5); - registry.fill(HIST("hPtGeneratedHypertriton"), mcparticle.pt()); - registry.fill(HIST("hctGeneratedHypertriton"), MClifetime); - registry.fill(HIST("hEtaGeneratedHypertriton"), mcparticle.eta()); - registry.fill(HIST("hRapidityGeneratedHypertriton"), mcparticle.y()); - } else if (haveAntiProton && havePionPlus && haveAntiDeuteron && mcparticle.pdgCode() == -motherPdgCode) { - registry.fill(HIST("hGeneratedHypertritonCounter"), 1.5); - registry.fill(HIST("hPtGeneratedAntiHypertriton"), mcparticle.pt()); - registry.fill(HIST("hctGeneratedAntiHypertriton"), MClifetime); - registry.fill(HIST("hEtaGeneratedAntiHypertriton"), mcparticle.eta()); - registry.fill(HIST("hRapidityGeneratedAntiHypertriton"), mcparticle.y()); - } - } - } - - //------------------------------------------------------------------ - // process real data analysis - void processData(soa::Join::iterator const& collision, aod::Vtx3BodyDatas const& vtx3bodydatas, FullTracksExtIU const& /*tracks*/) - { - registry.fill(HIST("hEventCounter"), 0.5); - if (event_sel8_selection && !collision.sel8()) { - return; - } - registry.fill(HIST("hEventCounter"), 1.5); - if (event_posZ_selection && std::abs(collision.posZ()) > 10.f) { // 10cm - return; - } - registry.fill(HIST("hEventCounter"), 2.5); - - bool if_hasvtx = false; - - for (const auto& vtx : vtx3bodydatas) { - CandidateAnalysis(collision, vtx, if_hasvtx); - } - - if (if_hasvtx) - registry.fill(HIST("hEventCounter"), 3.5); - fillHistos(); - resetHistos(); - } - PROCESS_SWITCH(hypertriton3bodyAnalysis, processData, "Real data analysis", true); - - //------------------------------------------------------------------ - // process mc analysis - void processMC(soa::Join const& collisions, aod::Vtx3BodyDatas const& vtx3bodydatas, aod::McParticles const& particlesMC, MCLabeledTracksIU const& /*tracks*/) - { - GetGeneratedH3LInfo(particlesMC); - - for (const auto& collision : collisions) { - registry.fill(HIST("hEventCounter"), 0.5); - if (mc_event_selection && (!collision.selection_bit(aod::evsel::kIsTriggerTVX) || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder))) { - continue; - } - registry.fill(HIST("hEventCounter"), 1.5); - if (event_posZ_selection && std::abs(collision.posZ()) > 10.f) { // 10cm - continue; - } - registry.fill(HIST("hEventCounter"), 2.5); - - bool if_hasvtx = false; - auto vtxsthiscol = vtx3bodydatas.sliceBy(perCollisionVtx3BodyDatas, collision.globalIndex()); - - for (const auto& vtx : vtxsthiscol) { - // int lLabel = -1; - int lPDG = -1; - float lPt = -1; - double MClifetime = -1; - bool isTrueCand = false; - auto track0 = vtx.track0_as(); - auto track1 = vtx.track1_as(); - auto track2 = vtx.track2_as(); - if (track0.has_mcParticle() && track1.has_mcParticle() && track2.has_mcParticle()) { - auto lMCTrack0 = track0.mcParticle_as(); - auto lMCTrack1 = track1.mcParticle_as(); - auto lMCTrack2 = track2.mcParticle_as(); - if (lMCTrack0.has_mothers() && lMCTrack1.has_mothers() && lMCTrack2.has_mothers()) { - for (const auto& lMother0 : lMCTrack0.mothers_as()) { - for (const auto& lMother1 : lMCTrack1.mothers_as()) { - for (const auto& lMother2 : lMCTrack2.mothers_as()) { - if (lMother0.globalIndex() == lMother1.globalIndex() && lMother0.globalIndex() == lMother2.globalIndex()) { - // lLabel = lMother1.globalIndex(); - lPt = lMother1.pt(); - lPDG = lMother1.pdgCode(); - if ((lPDG == motherPdgCode && lMCTrack0.pdgCode() == 2212 && lMCTrack1.pdgCode() == -211 && lMCTrack2.pdgCode() == bachelorPdgCode) || - (lPDG == -motherPdgCode && lMCTrack0.pdgCode() == 211 && lMCTrack1.pdgCode() == -2212 && lMCTrack2.pdgCode() == -bachelorPdgCode)) { - isTrueCand = true; - MClifetime = RecoDecay::sqrtSumOfSquares(lMCTrack2.vx() - lMother2.vx(), lMCTrack2.vy() - lMother2.vy(), lMCTrack2.vz() - lMother2.vz()) * o2::constants::physics::MassHyperTriton / lMother2.p(); - } - } - } - } - } - } - } - - CandidateAnalysis(collision, vtx, if_hasvtx, isTrueCand, MClifetime, lPt); - } - - if (if_hasvtx) - registry.fill(HIST("hEventCounter"), 3.5); - fillHistos(); - resetHistos(); - } - } - PROCESS_SWITCH(hypertriton3bodyAnalysis, processMC, "MC analysis", false); -}; - -// check vtx3body with mclabels -struct hypertriton3bodyLabelCheck { - - Configurable mc_event_selection{"mc_event_selection", true, "mc event selection count post kIsTriggerTVX and kNoTimeFrameBorder"}; - Configurable event_posZ_selection{"event_posZ_selection", false, "event selection count post poZ cut"}; - Configurable tpcPIDNSigmaCut{"tpcPIDNSigmaCut", 5, "tpcPIDNSigmaCut"}; - Configurable motherPdgCode{"motherPdgCode", 1010010030, "pdgCode of mother track"}; - - HistogramRegistry registry{"registry", {}}; - - void init(InitContext const&) - { - if (doprocessData == false) { - auto hLabeledVtxCounter = registry.add("hLabeledVtxCounter", "hLabeledVtxCounter", HistType::kTH1F, {{3, 0.0f, 3.0f}}); - hLabeledVtxCounter->GetXaxis()->SetBinLabel(1, "Readin"); - hLabeledVtxCounter->GetXaxis()->SetBinLabel(2, "TrueMCH3L"); - hLabeledVtxCounter->GetXaxis()->SetBinLabel(3, "Nonrepetitive"); - registry.add("hMassTrueH3L", "hMassTrueH3L", HistType::kTH1F, {{80, 2.96f, 3.04f}}); - registry.add("hMassTrueH3LMatter", "hMassTrueH3LMatter", HistType::kTH1F, {{80, 2.96f, 3.04f}}); - registry.add("hMassTrueH3LAntiMatter", "hMassTrueH3LAntiMatter", HistType::kTH1F, {{80, 2.96f, 3.04f}}); - auto hPIDCounter = registry.add("hPIDCounter", "hPIDCounter", HistType::kTH1F, {{6, 0.0f, 6.0f}}); - hPIDCounter->GetXaxis()->SetBinLabel(1, "H3L Proton PID > 5"); - hPIDCounter->GetXaxis()->SetBinLabel(2, "H3L Pion PID > 5"); - hPIDCounter->GetXaxis()->SetBinLabel(3, "H3L Deuteron PID > 5"); - hPIDCounter->GetXaxis()->SetBinLabel(4, "#bar{H3L} Proton PID > 5"); - hPIDCounter->GetXaxis()->SetBinLabel(5, "#bar{H3L} Pion PID > 5"); - hPIDCounter->GetXaxis()->SetBinLabel(6, "#bar{H3L} Deuteron PID > 5"); - auto hHypertritonCounter = registry.add("hHypertritonCounter", "hHypertritonCounter", HistType::kTH1F, {{4, 0.0f, 4.0f}}); - hHypertritonCounter->GetXaxis()->SetBinLabel(1, "H3L"); - hHypertritonCounter->GetXaxis()->SetBinLabel(2, "H3L daughters pass PID"); - hHypertritonCounter->GetXaxis()->SetBinLabel(3, "#bar{H3L}"); - hHypertritonCounter->GetXaxis()->SetBinLabel(4, "#bar{H3L} daughters pass PID"); - auto hDecay3BodyCounter = registry.add("hDecay3BodyCounter", "hDecay3BodyCounter", HistType::kTH1F, {{5, 0.0f, 5.0f}}); - hDecay3BodyCounter->GetXaxis()->SetBinLabel(1, "Total"); - hDecay3BodyCounter->GetXaxis()->SetBinLabel(2, "True H3L"); - hDecay3BodyCounter->GetXaxis()->SetBinLabel(3, "Unduplicated H3L"); - hDecay3BodyCounter->GetXaxis()->SetBinLabel(4, "Correct collision"); - hDecay3BodyCounter->GetXaxis()->SetBinLabel(5, "Same ColID for daughters"); - registry.add("hDiffRVtxProton", "hDiffRVtxProton", HistType::kTH1F, {{100, -10, 10}}); // difference between the radius of decay vertex and minR of proton - registry.add("hDiffRVtxPion", "hDiffRVtxPion", HistType::kTH1F, {{100, -10, 10}}); // difference between the radius of decay vertex and minR of pion - registry.add("hDiffRVtxDeuteron", "hDiffRVtxDeuteron", HistType::kTH1F, {{100, -10, 10}}); // difference between the radius of decay vertex and minR of deuteron - } - } - - struct Indexdaughters { // check duplicated paired daughters - int64_t index0; - int64_t index1; - int64_t index2; - bool operator==(const Indexdaughters& t) const - { - return (this->index0 == t.index0 && this->index1 == t.index1 && this->index2 == t.index2); - } - }; - - void processData(soa::Join::iterator const&) - { - // dummy function - } - PROCESS_SWITCH(hypertriton3bodyLabelCheck, processData, "Donot check MC label tables", true); - - void processCheckLabel(soa::Join::iterator const& collision, aod::Decay3Bodys const& decay3bodys, soa::Join const& vtx3bodydatas, MCLabeledTracksIU const& /*tracks*/, aod::McParticles const& /*particlesMC*/, aod::McCollisions const& /*mcCollisions*/) - { - // check the decay3body table - std::vector set_pair; - for (const auto& d3body : decay3bodys) { - registry.fill(HIST("hDecay3BodyCounter"), 0.5); - auto lTrack0 = d3body.track0_as(); - auto lTrack1 = d3body.track1_as(); - auto lTrack2 = d3body.track2_as(); - if (!lTrack0.has_mcParticle() || !lTrack1.has_mcParticle() || !lTrack2.has_mcParticle()) { - continue; - } - auto lMCTrack0 = lTrack0.mcParticle_as(); - auto lMCTrack1 = lTrack1.mcParticle_as(); - auto lMCTrack2 = lTrack2.mcParticle_as(); - if (!lMCTrack0.has_mothers() || !lMCTrack1.has_mothers() || !lMCTrack2.has_mothers()) { - continue; - } - - for (const auto& lMother0 : lMCTrack0.mothers_as()) { - for (const auto& lMother1 : lMCTrack1.mothers_as()) { - for (const auto& lMother2 : lMCTrack2.mothers_as()) { - if (lMother0.globalIndex() == lMother1.globalIndex() && lMother0.globalIndex() == lMother2.globalIndex()) { - registry.fill(HIST("hDecay3BodyCounter"), 1.5); - // duplicated daughters check - Indexdaughters temp = {lMCTrack0.globalIndex(), lMCTrack1.globalIndex(), lMCTrack2.globalIndex()}; - auto p = std::find(set_pair.begin(), set_pair.end(), temp); - if (p == set_pair.end()) { - set_pair.push_back(temp); - registry.fill(HIST("hDecay3BodyCounter"), 2.5); - if (lMother0.mcCollisionId() == collision.mcCollisionId()) { - registry.fill(HIST("hDecay3BodyCounter"), 3.5); - if (lTrack0.collisionId() == lTrack1.collisionId() && lTrack0.collisionId() == lTrack2.collisionId()) { - registry.fill(HIST("hDecay3BodyCounter"), 4.5); - } - } - } - } - } - } - } - } - - if (mc_event_selection && (!collision.selection_bit(aod::evsel::kIsTriggerTVX) || !collision.selection_bit(aod::evsel::kNoTimeFrameBorder))) { - return; - } - - if (event_posZ_selection && std::abs(collision.posZ()) > 10.f) { // 10cm - return; - } - - std::vector set_mothertrack; - for (const auto& vtx : vtx3bodydatas) { - registry.fill(HIST("hLabeledVtxCounter"), 0.5); - if (vtx.mcParticleId() != -1) { - auto mcparticle = vtx.mcParticle_as(); - auto lTrack0 = vtx.track0_as(); - auto lTrack1 = vtx.track1_as(); - auto lTrack2 = vtx.track2_as(); - if (std::abs(mcparticle.pdgCode()) != motherPdgCode) { - continue; - } - registry.fill(HIST("hLabeledVtxCounter"), 1.5); - registry.fill(HIST("hDiffRVtxDeuteron"), lTrack2.x() - vtx.vtxradius()); - if (mcparticle.pdgCode() > 0) { - registry.fill(HIST("hHypertritonCounter"), 0.5); - registry.fill(HIST("hMassTrueH3L"), vtx.mHypertriton()); - registry.fill(HIST("hMassTrueH3LMatter"), vtx.mHypertriton()); - registry.fill(HIST("hDiffRVtxProton"), lTrack0.x() - vtx.vtxradius()); - registry.fill(HIST("hDiffRVtxPion"), lTrack1.x() - vtx.vtxradius()); - auto p = std::find(set_mothertrack.begin(), set_mothertrack.end(), mcparticle.globalIndex()); - if (p == set_mothertrack.end()) { - set_mothertrack.push_back(mcparticle.globalIndex()); - registry.fill(HIST("hLabeledVtxCounter"), 2.5); - } - if (std::abs(lTrack0.tpcNSigmaPr()) > tpcPIDNSigmaCut) { - registry.fill(HIST("hPIDCounter"), 0.5); - } - if (std::abs(lTrack1.tpcNSigmaPi()) > tpcPIDNSigmaCut) { - registry.fill(HIST("hPIDCounter"), 1.5); - } - if (std::abs(lTrack2.tpcNSigmaDe()) > tpcPIDNSigmaCut) { - registry.fill(HIST("hPIDCounter"), 2.5); - } - if (std::abs(lTrack0.tpcNSigmaPr()) < tpcPIDNSigmaCut && std::abs(lTrack1.tpcNSigmaPi()) < tpcPIDNSigmaCut && std::abs(lTrack2.tpcNSigmaDe()) < tpcPIDNSigmaCut) { - registry.fill(HIST("hHypertritonCounter"), 1.5); - } - } else { - registry.fill(HIST("hHypertritonCounter"), 2.5); - registry.fill(HIST("hMassTrueH3L"), vtx.mAntiHypertriton()); - registry.fill(HIST("hMassTrueH3LAntiMatter"), vtx.mAntiHypertriton()); - registry.fill(HIST("hDiffRVtxProton"), lTrack1.x() - vtx.vtxradius()); - registry.fill(HIST("hDiffRVtxPion"), lTrack0.x() - vtx.vtxradius()); - auto p = std::find(set_mothertrack.begin(), set_mothertrack.end(), mcparticle.globalIndex()); - if (p == set_mothertrack.end()) { - set_mothertrack.push_back(mcparticle.globalIndex()); - registry.fill(HIST("hLabeledVtxCounter"), 2.5); - } - if (std::abs(lTrack0.tpcNSigmaPi()) > tpcPIDNSigmaCut) { - registry.fill(HIST("hPIDCounter"), 4.5); - } - if (std::abs(lTrack1.tpcNSigmaPr()) > tpcPIDNSigmaCut) { - registry.fill(HIST("hPIDCounter"), 3.5); - } - if (std::abs(lTrack2.tpcNSigmaDe()) > tpcPIDNSigmaCut) { - registry.fill(HIST("hPIDCounter"), 5.5); - } - if (std::abs(lTrack0.tpcNSigmaPi()) < tpcPIDNSigmaCut && std::abs(lTrack1.tpcNSigmaPr()) < tpcPIDNSigmaCut && std::abs(lTrack2.tpcNSigmaDe()) < tpcPIDNSigmaCut) { - registry.fill(HIST("hHypertritonCounter"), 3.5); - } - } - } - } - } - PROCESS_SWITCH(hypertriton3bodyLabelCheck, processCheckLabel, "Check MC label tables", false); -}; - -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - return WorkflowSpec{ - adaptAnalysisTask(cfgc), - adaptAnalysisTask(cfgc), - adaptAnalysisTask(cfgc), - }; -} diff --git a/PWGLF/Utils/decay3bodyBuilderHelper.h b/PWGLF/Utils/decay3bodyBuilderHelper.h new file mode 100644 index 00000000000..550625f2fc6 --- /dev/null +++ b/PWGLF/Utils/decay3bodyBuilderHelper.h @@ -0,0 +1,838 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +#ifndef PWGLF_UTILS_DECAY3BODYBUILDERHELPER_H_ +#define PWGLF_UTILS_DECAY3BODYBUILDERHELPER_H_ + +#include +#include +#include +#include "DCAFitter/DCAFitterN.h" +#include "Framework/AnalysisDataModel.h" +#include "ReconstructionDataFormats/Track.h" +#include "DetectorsBase/GeometryManager.h" +#include "DetectorsVertexing/SVertexHypothesis.h" +#include "CommonConstants/PhysicsConstants.h" +#include "Common/Core/trackUtilities.h" +#include "Common/Core/RecoDecay.h" +#include "Tools/KFparticle/KFUtilities.h" + +#ifndef HomogeneousField +#define HomogeneousField +#endif + +/// includes KFParticle +#include "KFParticle.h" +#include "KFPTrack.h" +#include "KFPVertex.h" +#include "KFParticleBase.h" +#include "KFVertex.h" + +namespace o2 +{ +namespace pwglf +{ + +//_______________________________________________________________________ +// Deca3body information storage +struct decay3bodyCandidate { + // indexing + int collisionID = -1; + int decay3bodyID = -1; + int protonID = -1; + int pionID = -1; + int deuteronID = -1; + + // daughter properties + std::array momProton = {0.0f, 0.0f, 0.0f}; + std::array momPion = {0.0f, 0.0f, 0.0f}; + std::array momDeuteron = {0.0f, 0.0f, 0.0f}; + std::array posProton = {0.0f, 0.0f, 0.0f}; + std::array posPion = {0.0f, 0.0f, 0.0f}; + std::array posDeuteron = {0.0f, 0.0f, 0.0f}; + std::array trackDCAxyToPV = {0.0f, 0.0f, 0.0f}; // 0 - proton, 1 - pion, 2 - deuteron + std::array trackDCAzToPV = {0.0f, 0.0f, 0.0f}; // 0 - proton, 1 - pion, 2 - deuteron + std::array tpcNsigma = {0.0f, 0.0f, 0.0f, 0.0f}; // 0 - proton, 1 - pion, 2 - deuteron, 3 - bach with pion hyp + double tofNsigmaDeuteron = 0.0f; + std::array averageITSClSize = {0.0f, 0.0f, 0.0f}; // 0 - proton, 1 - pion, 2 - deuteron + std::array tpcNCl = {0.0f, 0.0f, 0.0f}; // 0 - proton, 1 - pion, 2 - deuteron + int pidForTrackingDeuteron = 0; + + // vertex properties + float mass; + float massV0; + int sign; + float momentum[3]; + float position[3]; + // std::array momentum = {0.0f, 0.0f, 0.0f}; + // std::array position = {0.0f, 0.0f, 0.0f}; + // float dcaToPV = 0.0f; + // float dcaxyToPV = 0.0f; + float chi2 = 0.0f; + float trackedClSize = 0.0f; + float daughterDCAatSV = 0.0f; // quadratic sum of DCA between daughters at SV + std::array daughterDCAtoSV = {0.0f, 0.0f, 0.0f}; // 0 - pos, 1 - neg, 2 - bach + + // covariance matrix + float covProton[21] = {0.0f}; + float covPion[21] = {0.0f}; + float covDeuteron[21] = {0.0f}; + float covariance[21] = {0.0f}; +}; + +//_______________________________________________________________________ +// builder helper class +class decay3bodyBuilderHelper +{ + public: + decay3bodyBuilderHelper() + { + fitter3body.setPropagateToPCA(true); + fitter3body.setMaxR(200.); //->maxRIni3body + fitter3body.setMinParamChange(1e-3); + fitter3body.setMinRelChi2Change(0.9); + fitter3body.setMaxDZIni(1e9); + fitter3body.setMaxDXYIni(4.0f); + fitter3body.setMaxChi2(1e9); + fitter3body.setUseAbsDCA(true); + + fitterV0.setPropagateToPCA(true); + fitterV0.setMaxR(200.); + fitterV0.setMinParamChange(1e-3); + fitterV0.setMinRelChi2Change(0.9); + fitterV0.setMaxDZIni(1e9); + fitterV0.setMaxChi2(1e9); + fitterV0.setUseAbsDCA(true); + + // mag field has to be set later + fitter3body.setBz(-999.9f); // will NOT make sense if not changed + }; + + o2::vertexing::DCAFitterN<2> fitterV0; // 2-prong o2 dca fitter + o2::vertexing::DCAFitterN<3> fitter3body; // 3-prong o2 dca fitter + + decay3bodyCandidate decay3body; // storage for Decay3body candidate properties + + o2::dataformats::VertexBase mMeanVertex{{0., 0., 0.}, {0.1 * 0.1, 0., 0.1 * 0.1, 0., 0., 6. * 6.}}; + o2::vertexing::SVertexHypothesis mV0Hyps; // 0 - Lambda, 1 - AntiLambda + + // decay3body candidate criteria + struct { + // daughter tracks + float maxEtaDaughters; + int minTPCNClProton; + int minTPCNClPion; + int minTPCNClDeuteron; + float minDCAProtonToPV; + float minDCAPionToPV; + float minDCADeuteronToPV; + float minPtProton; + float minPtPion; + float minPtDeuteron; + float maxPtProton; + float maxPtPion; + float maxPtDeuteron; + float maxTPCnSigma; + double minTOFnSigmaDeuteron; + double maxTOFnSigmaDeuteron; + float minPDeuteronUseTOF; + float maxDCADauAtSV; + // candidate + float maxRapidity; + float minPt; + float maxPt; + float minMass; + float maxMass; + float minCtau; + float maxCtau; + float minCosPA; + float maxChi2; + } decay3bodyselections; + + // SVertexer selection criteria + struct { + float minPt2V0; + float maxTgl2V0; + float maxDCAXY2ToMeanVertex3bodyV0; + float minCosPAXYMeanVertex3bodyV0; + float minCosPA3bodyV0; + float maxRDiffV03body; + float minPt3Body; + float maxTgl3Body; + float maxDCAXY3Body; + float maxDCAZ3Body; + } svertexerselections; + + //_______________________________________________________________________ + // build Decay3body from three tracks, including V0 building. + template + bool buildDecay3BodyCandidate(TCollision const& collision, + TTrack const& trackProton, + TTrack const& trackPion, + TTrack const& trackDeuteron, + int decay3bodyIndex, + double tofNsigmaDeuteron, + float trackedClSize, + bool useKFParticle = false, + bool kfSetTopologicalConstraint = false, + bool useSelections = true, + bool useTPCforPion = false, + bool acceptTPCOnly = false, + bool calculateCovariance = true, + bool isEventMixing = false) + { + int collisionIndex = collision.globalIndex(); + float pvX = collision.posX(); + float pvY = collision.posY(); + float pvZ = collision.posZ(); + + auto trackParCovProton = getTrackParCov(trackProton); + auto trackParCovPion = getTrackParCov(trackPion); + auto trackParCovDeuteron = getTrackParCov(trackDeuteron); + + decay3body.collisionID = collisionIndex; + decay3body.decay3bodyID = decay3bodyIndex; + decay3body.protonID = trackProton.globalIndex(); + decay3body.pionID = trackPion.globalIndex(); + decay3body.deuteronID = trackDeuteron.globalIndex(); + + //_______________________________________________________________________ + // track selections + if (useSelections) { + // proton track quality + if (trackProton.tpcNClsFound() < decay3bodyselections.minTPCNClProton) { + decay3body = {}; + return false; + } + // pion track quality + if (useTPCforPion) { + if (trackPion.tpcNClsFound() < decay3bodyselections.minTPCNClPion) { + decay3body = {}; + return false; + } + } + // deuteron track quality + if (trackDeuteron.tpcNClsFound() < decay3bodyselections.minTPCNClDeuteron) { + decay3body = {}; + return false; + } + + // track eta + if (std::fabs(trackProton.eta()) > decay3bodyselections.maxEtaDaughters) { + decay3body = {}; + return false; + } + if (std::fabs(trackPion.eta()) > decay3bodyselections.maxEtaDaughters) { + decay3body = {}; + return false; + } + if (std::fabs(trackDeuteron.eta()) > decay3bodyselections.maxEtaDaughters) { + decay3body = {}; + return false; + } + + // TPC only + if (!acceptTPCOnly && (!trackProton.hasITS() || !trackPion.hasITS() || !trackDeuteron.hasITS())) { + decay3body = {}; + return false; + } + + // daughter TPC PID + if (std::fabs(trackProton.tpcNSigmaPr()) > decay3bodyselections.maxTPCnSigma) { + decay3body = {}; + return false; + } + if (useTPCforPion && std::fabs(trackPion.tpcNSigmaPi()) > decay3bodyselections.maxTPCnSigma) { + decay3body = {}; + return false; + } + if (std::fabs(trackDeuteron.tpcNSigmaDe()) > decay3bodyselections.maxTPCnSigma) { + decay3body = {}; + return false; + } + + // deuteron TOF PID + if ((tofNsigmaDeuteron < decay3bodyselections.minTOFnSigmaDeuteron || tofNsigmaDeuteron > decay3bodyselections.maxTOFnSigmaDeuteron) && trackDeuteron.p() > decay3bodyselections.minPDeuteronUseTOF) { + decay3body = {}; + return false; + } + } // end of selections + + //_______________________________________________________________________ + // daughter track DCA to PV associated with decay3body + o2::dataformats::VertexBase mPV; + o2::dataformats::DCA mDcaInfoCov; + auto trackParCovProtonCopy = trackParCovProton; + auto trackParCovPionCopy = trackParCovPion; + auto trackParCovDeuteronCopy = trackParCovDeuteron; + mPV.setPos({pvX, pvY, pvZ}); + mPV.setCov(collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()); + + // proton track + o2::base::Propagator::Instance()->propagateToDCABxByBz(mPV, trackParCovProtonCopy, 2.f, fitter3body.getMatCorrType(), &mDcaInfoCov); + decay3body.trackDCAxyToPV[0] = mDcaInfoCov.getY(); + decay3body.trackDCAzToPV[0] = mDcaInfoCov.getZ(); + auto trackProtonDCAToPV = std::sqrt(decay3body.trackDCAxyToPV[0] * decay3body.trackDCAxyToPV[0] + decay3body.trackDCAzToPV[0] * decay3body.trackDCAzToPV[0]); + if (useSelections) { + if (trackProtonDCAToPV < decay3bodyselections.minDCAProtonToPV) { + decay3body = {}; + return false; + } + } + // pion track + o2::base::Propagator::Instance()->propagateToDCABxByBz(mPV, trackParCovPionCopy, 2.f, fitter3body.getMatCorrType(), &mDcaInfoCov); + decay3body.trackDCAxyToPV[1] = mDcaInfoCov.getY(); + decay3body.trackDCAzToPV[1] = mDcaInfoCov.getZ(); + auto trackPionDCAToPV = std::sqrt(decay3body.trackDCAxyToPV[1] * decay3body.trackDCAxyToPV[1] + decay3body.trackDCAzToPV[1] * decay3body.trackDCAzToPV[1]); + if (useSelections) { + if (trackPionDCAToPV < decay3bodyselections.minDCAPionToPV) { + decay3body = {}; + return false; + } + } + // deuteron track + o2::base::Propagator::Instance()->propagateToDCABxByBz(mPV, trackParCovDeuteronCopy, 2.f, fitter3body.getMatCorrType(), &mDcaInfoCov); + decay3body.trackDCAxyToPV[2] = mDcaInfoCov.getY(); + decay3body.trackDCAzToPV[2] = mDcaInfoCov.getZ(); + auto trackDeuteronDCAToPV = std::sqrt(decay3body.trackDCAxyToPV[2] * decay3body.trackDCAxyToPV[2] + decay3body.trackDCAzToPV[2] * decay3body.trackDCAzToPV[2]); + if (useSelections) { + if (trackDeuteronDCAToPV < decay3bodyselections.minDCADeuteronToPV) { + decay3body = {}; + return false; + } + } + + //_______________________________________________________________________ + // fit 3body vertex + if (!useKFParticle) { + fitVertexWithDCAFitter(trackProton, trackPion, trackDeuteron, calculateCovariance); + } else { + fitVertexWithKF(collision, trackProton, trackPion, trackDeuteron, kfSetTopologicalConstraint, calculateCovariance); + } + + //_______________________________________________________________________ + // get vertex information + // daughter pT + auto trackProtonPt = std::sqrt(decay3body.momProton[0] * decay3body.momProton[0] + decay3body.momProton[1] * decay3body.momProton[1]); + auto trackPionPt = std::sqrt(decay3body.momPion[0] * decay3body.momPion[0] + decay3body.momPion[1] * decay3body.momPion[1]); + auto trackDeuteronPt = std::sqrt(decay3body.momDeuteron[0] * decay3body.momDeuteron[0] + decay3body.momDeuteron[1] * decay3body.momDeuteron[1]); + + // DCA between daughters at SV + decay3body.daughterDCAatSV = std::hypot( + std::hypot(decay3body.posProton[0] - decay3body.posPion[0], + decay3body.posProton[1] - decay3body.posPion[1], + decay3body.posProton[2] - decay3body.posPion[2]), + std::hypot(decay3body.posProton[0] - decay3body.posDeuteron[0], + decay3body.posProton[1] - decay3body.posDeuteron[1], + decay3body.posProton[2] - decay3body.posDeuteron[2]), + std::hypot(decay3body.posPion[0] - decay3body.posProton[0], + decay3body.posPion[1] - decay3body.posProton[1], + decay3body.posPion[2] - decay3body.posProton[2])); + + // daughter DCA to SV + // proton daughter + decay3body.daughterDCAtoSV[0] = std::hypot( + decay3body.posProton[0] - decay3body.position[0], + decay3body.posProton[1] - decay3body.position[1], + decay3body.posProton[2] - decay3body.position[2]); + // pion daughter + decay3body.daughterDCAtoSV[1] = std::hypot( + decay3body.posPion[0] - decay3body.position[0], + decay3body.posPion[1] - decay3body.position[1], + decay3body.posPion[2] - decay3body.position[2]); + // deuteron daughter + decay3body.daughterDCAtoSV[2] = std::hypot( + decay3body.posDeuteron[0] - decay3body.position[0], + decay3body.posDeuteron[1] - decay3body.position[1], + decay3body.posDeuteron[2] - decay3body.position[2]); + + //_____________________________________________________ + // selections after vertex fit + if (useSelections) { + // daughter pT + // proton + if (trackProtonPt < decay3bodyselections.minPtProton || trackProtonPt > decay3bodyselections.maxPtProton) { + decay3body = {}; + return false; + } + // pion + if (trackPionPt < decay3bodyselections.minPtPion || trackPionPt > decay3bodyselections.maxPtPion) { + decay3body = {}; + return false; + } + // deuteron + if (trackDeuteronPt < decay3bodyselections.minPtDeuteron || trackDeuteronPt > decay3bodyselections.maxPtDeuteron) { + decay3body = {}; + return false; + } + + // daughter DCAs at SV + if (decay3body.daughterDCAatSV > decay3bodyselections.maxDCADauAtSV) { + decay3body = {}; + return false; + } + + // rapidity + float rapidity = RecoDecay::y(std::array{decay3body.momentum[0], decay3body.momentum[1], decay3body.momentum[2]}, o2::constants::physics::MassHyperTriton); + if (std::fabs(rapidity) > decay3bodyselections.maxRapidity) { + decay3body = {}; + return false; + } + + // pT + float pT = RecoDecay::pt(std::array{decay3body.momentum[0], decay3body.momentum[1], decay3body.momentum[2]}); + if (pT < decay3bodyselections.minPt || pT > decay3bodyselections.maxPt) { + decay3body = {}; + return false; + } + + // mass window + if (decay3body.mass < decay3bodyselections.minMass || decay3body.mass > decay3bodyselections.maxMass) { + decay3body = {}; + return false; + } + + // pointing angle + float cpa = RecoDecay::cpa(std::array{pvX, pvY, pvZ}, std::array{decay3body.position[0], decay3body.position[1], decay3body.position[2]}, std::array{decay3body.momentum[0], decay3body.momentum[1], decay3body.momentum[2]}); + if (cpa < decay3bodyselections.minCosPA) { + decay3body = {}; + return false; + } + + // vertex chi2 + if (decay3body.chi2 > decay3bodyselections.maxChi2) { + decay3body = {}; + return false; + } + + // ctau + float P = RecoDecay::sqrtSumOfSquares(decay3body.momentum[0], decay3body.momentum[1], decay3body.momentum[2]); + float ctau = std::sqrt(std::pow(decay3body.position[0] - pvX, 2) + std::pow(decay3body.position[1] - pvY, 2) + std::pow(decay3body.position[2] - pvZ, 2)) / (P + 1E-10) * o2::constants::physics::MassHyperTriton; + if (ctau < decay3bodyselections.minCtau || ctau > decay3bodyselections.maxCtau) { + decay3body = {}; + return false; + } + } + + //_______________________________________________________________________ + // SVertexer selections in case of event mixing + if (isEventMixing) { + applySVertexerCuts(collision, trackProton, trackPion, trackDeuteron, /*applyV0Cut = */ true); + } + + //_______________________________________________________________________ + // fill remaining candidate information + // daughter PID + decay3body.tpcNsigma[0] = trackProton.tpcNSigmaPr(); + decay3body.tpcNsigma[1] = trackPion.tpcNSigmaPi(); + decay3body.tpcNsigma[2] = trackDeuteron.tpcNSigmaDe(); + decay3body.tpcNsigma[3] = trackDeuteron.tpcNSigmaPi(); + // recalculated bachelor TOF PID + decay3body.tofNsigmaDeuteron = tofNsigmaDeuteron; + + // average ITS cluster size of daughter tracks + double averageClusterSizeProton(0), averageClusterSizePion(0), averageClusterSizeDeuteron(0); + int nClsProton(0), nClsPion(0), nClsDeuteron(0); + for (int i = 0; i < 7; i++) { + int clusterSizePr = trackProton.itsClsSizeInLayer(i); + int clusterSizePi = trackPion.itsClsSizeInLayer(i); + int clusterSizeDe = trackDeuteron.itsClsSizeInLayer(i); + averageClusterSizeProton += static_cast(clusterSizePr); + averageClusterSizePion += static_cast(clusterSizePi); + averageClusterSizeDeuteron += static_cast(clusterSizeDe); + if (clusterSizePr > 0) + nClsProton++; + if (clusterSizePi > 0) + nClsPion++; + if (clusterSizeDe > 0) + nClsDeuteron++; + } + averageClusterSizeProton = averageClusterSizeProton / static_cast(nClsProton); + averageClusterSizePion = averageClusterSizePion / static_cast(nClsPion); + averageClusterSizeDeuteron = averageClusterSizeDeuteron / static_cast(nClsDeuteron); + decay3body.averageITSClSize[0] = averageClusterSizeProton; + decay3body.averageITSClSize[1] = averageClusterSizePion; + decay3body.averageITSClSize[2] = averageClusterSizeDeuteron; + + // number of TPC clusters + decay3body.tpcNCl[0] = trackProton.tpcNClsFound(); + decay3body.tpcNCl[1] = trackPion.tpcNClsFound(); + decay3body.tpcNCl[2] = trackDeuteron.tpcNClsFound(); + + // PID for tracking of deuteron track + decay3body.pidForTrackingDeuteron = trackDeuteron.pidForTracking(); + + // tracked cluster size + decay3body.trackedClSize = trackedClSize; + + return true; + } + + //___________________________________________________________________________________ + // functionality to fit 3body vertex with KFParticle and fill vertex information + template + void fitVertexWithKF(TCollision const& collision, + TTrack const& trackProton, + TTrack const& trackPion, + TTrack const& trackDeuteron, + bool kfSetTopologicalConstraint = true, + bool calculateCovariance = true) + { + // get TrackParCov daughters + auto trackParCovProton = getTrackParCov(trackProton); + auto trackParCovPion = getTrackParCov(trackPion); + auto trackParCovDeuteron = getTrackParCov(trackDeuteron); + + // initialise KF primary vertex + KFVertex kfpVertex = createKFPVertexFromCollision(collision); + KFParticle kfpv(kfpVertex); + + // create KFParticle objects + KFParticle kfpProton, kfpPion, kfpDeuteron; + kfpProton = createKFParticleFromTrackParCov(trackParCovProton, trackProton.sign(), constants::physics::MassProton); + kfpPion = createKFParticleFromTrackParCov(trackParCovPion, trackPion.sign(), constants::physics::MassPionCharged); + kfpDeuteron = createKFParticleFromTrackParCov(trackParCovDeuteron, trackDeuteron.sign(), constants::physics::MassDeuteron); + + // construct V0 vertex + KFParticle KFV0; + int nDaughtersV0 = 2; + const KFParticle* DaughtersV0[2] = {&kfpProton, &kfpPion}; + KFV0.SetConstructMethod(2); + try { + KFV0.Construct(DaughtersV0, nDaughtersV0); + } catch (std::runtime_error& e) { + LOG(debug) << "Failed to create V0 vertex." << e.what(); + return; + } + + // construct vertex + KFParticle KFH3L; + int nDaughters3body = 3; + const KFParticle* Daughters3body[3] = {&kfpProton, &kfpPion, &kfpDeuteron}; + KFH3L.SetConstructMethod(2); + try { + KFH3L.Construct(Daughters3body, nDaughters3body); + } catch (std::runtime_error& e) { + LOG(debug) << "Failed to create Hyper triton 3-body vertex." << e.what(); + return; + } + + // topological constraint + if (kfSetTopologicalConstraint) { + KFH3L.SetProductionVertex(kfpv); + KFH3L.TransportToDecayVertex(); + } + + // get vertex position and momentum + decay3body.position[0] = KFH3L.GetX(); + decay3body.position[1] = KFH3L.GetY(); + decay3body.position[2] = KFH3L.GetZ(); + decay3body.momentum[0] = KFH3L.GetPx(); + decay3body.momentum[1] = KFH3L.GetPy(); + decay3body.momentum[2] = KFH3L.GetPz(); + + // get sign + decay3body.sign = KFH3L.GetQ() / std::abs(KFH3L.GetQ()); + + // transport all daughter tracks to hypertriton vertex + kfpProton.TransportToPoint(decay3body.position); + kfpPion.TransportToPoint(decay3body.position); + kfpDeuteron.TransportToPoint(decay3body.position); + + // daughter positions + decay3body.posProton[0] = kfpProton.GetX(); + decay3body.posProton[1] = kfpProton.GetY(); + decay3body.posProton[2] = kfpProton.GetZ(); + decay3body.posPion[0] = kfpPion.GetX(); + decay3body.posPion[1] = kfpPion.GetY(); + decay3body.posPion[2] = kfpPion.GetZ(); + decay3body.posDeuteron[0] = kfpDeuteron.GetX(); + decay3body.posDeuteron[1] = kfpDeuteron.GetY(); + decay3body.posDeuteron[2] = kfpDeuteron.GetZ(); + + // daughter momenta + decay3body.momProton[0] = kfpProton.GetPx(); + decay3body.momProton[1] = kfpProton.GetPy(); + decay3body.momProton[2] = kfpProton.GetPz(); + decay3body.momPion[0] = kfpPion.GetPx(); + decay3body.momPion[1] = kfpPion.GetPy(); + decay3body.momPion[2] = kfpPion.GetPz(); + decay3body.momDeuteron[0] = kfpDeuteron.GetPx(); + decay3body.momDeuteron[1] = kfpDeuteron.GetPy(); + decay3body.momDeuteron[2] = kfpDeuteron.GetPz(); + + // candidate mass + float mass, massErr; + KFH3L.GetMass(mass, massErr); + decay3body.mass = mass; + + // V0 mass + float massV0, massV0Err; + KFV0.GetMass(massV0, massV0Err); + decay3body.massV0 = massV0; + + // vertex chi2 + decay3body.chi2 = KFH3L.GetChi2() / KFH3L.GetNDF(); + + // caluclate covariance matrices + if (calculateCovariance) { + // candidate covariance matrix + std::array covKF; + for (int i = 0; i < 21; i++) { // get covariance matrix elements (lower triangle) + covKF[i] = KFH3L.GetCovariance(i); + decay3body.covariance[i] = covKF[i]; + } + // daughter track covariance matrices + for (int i = 0; i < 21; i++) { // get covariance matrix elements (lower triangle) + decay3body.covProton[i] = kfpProton.GetCovariance(i); + decay3body.covPion[i] = kfpPion.GetCovariance(i); + decay3body.covDeuteron[i] = kfpDeuteron.GetCovariance(i); + } + } + + return; + } + + //_______________________________________________________________________ + // functionality to fit 3body vertex with DCAFitter + template + void fitVertexWithDCAFitter(TTrack const& trackProton, + TTrack const& trackPion, + TTrack const& trackDeuteron, + bool calculateCovariance = true) + { + // get TrackParCov daughters + auto trackParCovProton = getTrackParCov(trackProton); + auto trackParCovPion = getTrackParCov(trackPion); + auto trackParCovDeuteron = getTrackParCov(trackDeuteron); + + // fit the vertex + int n3bodyVtx = fitter3body.process(trackParCovProton, trackParCovPion, trackParCovDeuteron); + if (n3bodyVtx == 0) { // discard this pair + return; + } + + // get vertex position + const auto& vtxXYZ = fitter3body.getPCACandidate(); + for (int i = 0; i < 3; i++) { + decay3body.position[i] = vtxXYZ[i]; + } + + // get daughter momenta + const auto& propagatedTrackProton = fitter3body.getTrack(0); + const auto& propagatedTrackPion = fitter3body.getTrack(1); + const auto& propagatedTrackDeuteron = fitter3body.getTrack(2); + propagatedTrackProton.getPxPyPzGlo(decay3body.momProton); + propagatedTrackPion.getPxPyPzGlo(decay3body.momPion); + propagatedTrackDeuteron.getPxPyPzGlo(decay3body.momDeuteron); + propagatedTrackProton.getXYZGlo(decay3body.posProton); + propagatedTrackPion.getXYZGlo(decay3body.posPion); + propagatedTrackDeuteron.getXYZGlo(decay3body.posDeuteron); + + // get daughter positions at vertex + + // calculate candidate momentum + decay3body.momentum[0] = decay3body.momProton[0] + decay3body.momPion[0] + decay3body.momDeuteron[0]; + decay3body.momentum[1] = decay3body.momProton[1] + decay3body.momPion[1] + decay3body.momDeuteron[1]; + decay3body.momentum[2] = decay3body.momProton[2] + decay3body.momPion[2] + decay3body.momDeuteron[2]; + + // candidate and V0 mass + decay3body.mass = RecoDecay::m( + std::array{std::array{decay3body.momProton[0], decay3body.momProton[1], decay3body.momProton[2]}, + std::array{decay3body.momPion[0], decay3body.momPion[1], decay3body.momPion[2]}, + std::array{decay3body.momDeuteron[0], decay3body.momDeuteron[1], decay3body.momDeuteron[2]}}, + std::array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged, o2::constants::physics::MassDeuteron}); + decay3body.massV0 = RecoDecay::m( + std::array{std::array{decay3body.momProton[0], decay3body.momProton[1], decay3body.momProton[2]}, + std::array{decay3body.momPion[0], decay3body.momPion[1], decay3body.momPion[2]}}, + std::array{o2::constants::physics::MassProton, o2::constants::physics::MassPionCharged}); + + // vertex chi2 at PCA + decay3body.chi2 = fitter3body.getChi2AtPCACandidate(); + + // candidate sign + decay3body.sign = trackDeuteron.sign(); + + // caluclate covariance matrices + if (calculateCovariance) { + // candidate position covariance matrix + auto covVtxV = fitter3body.calcPCACovMatrix(0); + decay3body.covariance[0] = covVtxV(0, 0); + decay3body.covariance[1] = covVtxV(1, 0); + decay3body.covariance[2] = covVtxV(1, 1); + decay3body.covariance[3] = covVtxV(2, 0); + decay3body.covariance[4] = covVtxV(2, 1); + decay3body.covariance[5] = covVtxV(2, 2); + // daughter covariance matrices + std::array covTproton = {0.}; + std::array covTpion = {0.}; + std::array covTdeuteron = {0.}; + propagatedTrackProton.getCovXYZPxPyPzGlo(covTproton); + propagatedTrackPion.getCovXYZPxPyPzGlo(covTpion); + propagatedTrackDeuteron.getCovXYZPxPyPzGlo(covTdeuteron); + for (int i = 0; i < 21; i++) { + decay3body.covProton[i] = covTproton[i]; + decay3body.covPion[i] = covTpion[i]; + decay3body.covDeuteron[i] = covTdeuteron[i]; + } + // candidate momentum covairance matrix + constexpr int MomInd[6] = {9, 13, 14, 18, 19, 20}; // cov matrix elements for momentum component + for (int i = 0; i < 6; i++) { + decay3body.covariance[MomInd[i]] = covTproton[MomInd[i]] + covTpion[MomInd[i]] + covTdeuteron[MomInd[i]]; + } + /// WARNING: position-momentum covariances are not calculated in the DCAFitter - remain zero + } + + return; + } + + //_______________________________________________________________________ + // functionality to apply SVertexer cuts in case of event mixing + template + void applySVertexerCuts(TCollision const& collision, + TTrack const& trackProton, + TTrack const& trackPion, + TTrack const& trackDeuteron, + bool applyV0Cut = true) + { + // get TrackParCov daughters + auto trackParCovProton = getTrackParCov(trackProton); + auto trackParCovPion = getTrackParCov(trackPion); + auto trackParCovDeuteron = getTrackParCov(trackDeuteron); + + const float pidCutsLambda[o2::vertexing::SVertexHypothesis::NPIDParams] = {0., 20, 0., 5.0, 0.0, 1.09004e-03, 2.62291e-04, 8.93179e-03, 2.83121}; // Lambda + mV0Hyps.set(o2::track::PID::Lambda, o2::track::PID::Proton, o2::track::PID::Pion, pidCutsLambda, fitter3body.getBz()); + + int nV0 = fitterV0.process(trackParCovProton, trackParCovPion); + if (nV0 == 0) { + return; + } + + std::array v0pos = {0.}; + const auto& v0vtxXYZ = fitterV0.getPCACandidate(); + for (int i = 0; i < 3; i++) { + v0pos[i] = v0vtxXYZ[i]; + } + const int cand = 0; + if (!fitterV0.isPropagateTracksToVertexDone(cand) && !fitterV0.propagateTracksToVertex(cand)) { + return; + } + + const auto& trProtonProp = fitterV0.getTrack(0, cand); + const auto& trPionProp = fitterV0.getTrack(1, cand); + std::array pProtonV0{}, pPionV0{}; + trProtonProp.getPxPyPzGlo(pProtonV0); + trPionProp.getPxPyPzGlo(pPionV0); + std::array pV0 = {pProtonV0[0] + pPionV0[0], pProtonV0[1] + pPionV0[1], pProtonV0[2] + pPionV0[2]}; + // Cut for Virtual V0 + float dxv0 = v0pos[0] - mMeanVertex.getX(), dyv0 = v0pos[1] - mMeanVertex.getY(), r2v0 = dxv0 * dxv0 + dyv0 * dyv0; + float rv0 = std::sqrt(r2v0); + float pt2V0 = pV0[0] * pV0[0] + pV0[1] * pV0[1], prodXYv0 = dxv0 * pV0[0] + dyv0 * pV0[1], tDCAXY = prodXYv0 / pt2V0; + if (applyV0Cut && pt2V0 <= svertexerselections.minPt2V0) { + return; + } + if (applyV0Cut && pV0[2] * pV0[2] / pt2V0 > svertexerselections.maxTgl2V0) { // tgLambda cut + return; + } + + float p2V0 = pt2V0 + pV0[2] * pV0[2], ptV0 = std::sqrt(pt2V0); + // apply mass selections + float p2Proton = pProtonV0[0] * pProtonV0[0] + pProtonV0[1] * pProtonV0[1] + pProtonV0[2] * pProtonV0[2], p2Pion = pPionV0[0] * pPionV0[0] + pPionV0[1] * pPionV0[1] + pPionV0[2] * pPionV0[2]; + bool good3bodyV0Hyp = false; + float massForLambdaHyp = mV0Hyps.calcMass(p2Proton, p2Pion, p2V0); + if (massForLambdaHyp - mV0Hyps.getMassV0Hyp() < mV0Hyps.getMargin(ptV0)) { + good3bodyV0Hyp = true; + } + if (applyV0Cut && !good3bodyV0Hyp) { + return; + } + + float dcaX = dxv0 - pV0[0] * tDCAXY, dcaY = dyv0 - pV0[1] * tDCAXY, dca2 = dcaX * dcaX + dcaY * dcaY; + float cosPAXY = prodXYv0 / rv0 * ptV0; + if (applyV0Cut && dca2 > svertexerselections.maxDCAXY2ToMeanVertex3bodyV0) { + return; + } + // FIXME: V0 cosPA cut to be investigated + if (applyV0Cut && cosPAXY < svertexerselections.minCosPAXYMeanVertex3bodyV0) { + return; + } + // Check: CosPA Cut of Virtual V0 may not be used since the V0 may be based on another PV + float dx = v0pos[0] - collision.posX(); + float dy = v0pos[1] - collision.posY(); + float dz = v0pos[2] - collision.posZ(); + float prodXYZv0 = dx * pV0[0] + dy * pV0[1] + dz * pV0[2]; + float v0CosPA = prodXYZv0 / std::sqrt((dx * dx + dy * dy + dz * dz) * p2V0); + if (applyV0Cut && v0CosPA < svertexerselections.minCosPA3bodyV0) { + return; + } + + // 3body vertex + int n3bodyVtx = fitter3body.process(trackParCovProton, trackParCovPion, trackParCovDeuteron); + if (n3bodyVtx == 0) { // discard this pair + return; + } + const auto& vertexXYZ = fitter3body.getPCACandidatePos(); + std::array pos = {0.}; + for (int i = 0; i < 3; i++) { + pos[i] = vertexXYZ[i]; + } + + std::array pProton = {0.}, pPion = {0.}, pDeuteron{0.}; + const auto& propagatedTrackProton = fitter3body.getTrack(0); + const auto& propagatedTrackPion = fitter3body.getTrack(1); + const auto& propagatedTrackDeuteron = fitter3body.getTrack(2); + propagatedTrackProton.getPxPyPzGlo(pProton); + propagatedTrackPion.getPxPyPzGlo(pPion); + propagatedTrackDeuteron.getPxPyPzGlo(pDeuteron); + std::array p3B = {pProton[0] + pPion[0] + pDeuteron[0], pProton[1] + pPion[1] + pDeuteron[1], pProton[2] + pPion[2] + pDeuteron[2]}; + + float r3body = std::hypot(pos[0], pos[1]); + if (r3body < 0.5) { + return; + } + + // Cut for the compatibility of V0 and 3body vertex + float deltaR = std::abs(rv0 - r3body); + if (deltaR > svertexerselections.maxRDiffV03body) { + return; + } + + float pt3B = std::hypot(p3B[0], p3B[1]); + if (pt3B < svertexerselections.minPt3Body) { // pt cut + return; + } + if (p3B[2] / pt3B > svertexerselections.maxTgl3Body) { // tgLambda cut + return; + } + + // H3L DCA Check + auto track3B = o2::track::TrackParCov(vertexXYZ, p3B, trackDeuteron.sign()); + o2::dataformats::DCA dca; + if (!track3B.propagateToDCA({{collision.posX(), collision.posY(), collision.posZ()}, {collision.covXX(), collision.covXY(), collision.covYY(), collision.covXZ(), collision.covYZ(), collision.covZZ()}}, fitter3body.getBz(), &dca, 5.) || + std::abs(dca.getY()) > svertexerselections.maxDCAXY3Body || std::abs(dca.getZ()) > svertexerselections.maxDCAZ3Body) { + return; + } + + return; + } + + private: + // internal helper to calculate DCA (3D) of a straight line to a given PV analytically + float CalculateDCAStraightToPV(float X, float Y, float Z, float Px, float Py, float Pz, float pvX, float pvY, float pvZ) + { + return std::sqrt((std::pow((pvY - Y) * Pz - (pvZ - Z) * Py, 2) + std::pow((pvX - X) * Pz - (pvZ - Z) * Px, 2) + std::pow((pvX - X) * Py - (pvY - Y) * Px, 2)) / (Px * Px + Py * Py + Pz * Pz)); + } +}; + +} // namespace pwglf +} // namespace o2 + +#endif // PWGLF_UTILS_DECAY3BODYBUILDERHELPER_H_ From 0c174df7f25a9d8009c1e40f54e6f0a247e9c89b Mon Sep 17 00:00:00 2001 From: chengtt0406 <39661669+chengtt0406@users.noreply.github.com> Date: Thu, 12 Jun 2025 15:49:47 +0800 Subject: [PATCH 1586/1650] [PWGHF] Remove indexRexCharmBaryon=-1 case for MC rec matching (#11556) --- PWGHF/TableProducer/treeCreatorOmegacSt.cxx | 81 +++++++++++---------- 1 file changed, 43 insertions(+), 38 deletions(-) diff --git a/PWGHF/TableProducer/treeCreatorOmegacSt.cxx b/PWGHF/TableProducer/treeCreatorOmegacSt.cxx index 8d2780cd435..4d3c59cfcd1 100644 --- a/PWGHF/TableProducer/treeCreatorOmegacSt.cxx +++ b/PWGHF/TableProducer/treeCreatorOmegacSt.cxx @@ -15,39 +15,41 @@ /// \author Jochen Klein /// \author Tiantian Cheng -#include -#include -#include -#include +#include "PWGHF/Core/SelectorCuts.h" +#include "PWGHF/DataModel/CandidateReconstructionTables.h" +#include "PWGHF/Utils/utilsTrkCandHf.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" -#include +#include "Common/Core/RecoDecay.h" +#include "Common/Core/TrackSelection.h" +#include "Common/Core/trackUtilities.h" +#include "Common/DataModel/CollisionAssociationTables.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "EventFiltering/Zorro.h" +#include "EventFiltering/ZorroSummary.h" #include "CCDB/BasicCCDBManager.h" #include "CommonConstants/PhysicsConstants.h" +#include "DCAFitter/DCAFitterN.h" #include "DataFormatsParameters/GRPMagField.h" #include "DataFormatsParameters/GRPObject.h" -#include "DCAFitter/DCAFitterN.h" #include "DetectorsBase/Propagator.h" -#include "EventFiltering/Zorro.h" -#include "EventFiltering/ZorroSummary.h" +#include "Framework/ASoA.h" #include "Framework/AnalysisDataModel.h" #include "Framework/AnalysisTask.h" -#include "Framework/ASoA.h" #include "Framework/HistogramRegistry.h" #include "Framework/O2DatabasePDGPlugin.h" #include "Framework/runDataProcessing.h" #include "ReconstructionDataFormats/DCA.h" -#include "Common/DataModel/EventSelection.h" -#include "Common/Core/RecoDecay.h" -#include "Common/Core/trackUtilities.h" -#include "Common/DataModel/PIDResponse.h" -#include "Common/Core/TrackSelection.h" -#include "Common/DataModel/TrackSelectionTables.h" -#include "Common/DataModel/CollisionAssociationTables.h" -#include "PWGLF/DataModel/LFStrangenessTables.h" -#include "PWGHF/Core/SelectorCuts.h" -#include "PWGHF/Utils/utilsTrkCandHf.h" -#include "PWGHF/DataModel/CandidateReconstructionTables.h" + +#include + +#include +#include +#include +#include using namespace o2; using namespace o2::framework; @@ -369,8 +371,7 @@ struct HfTreeCreatorOmegacSt { } else if (idxKaonDaughter >= 0 && idxCascDaughter >= 0) { decayChannel = o2::aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaK; // OmegaC -> Omega + K } else { - decayChannel = -1; - LOG(warning) << "Decay channel not recognized!"; + decayChannel = -1; // LOG(warning) << "Decay channel not recognized!"; } if (decayChannel != -1) { int idxDaughter = (decayChannel == o2::aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaPi) ? idxPionDaughter : idxKaonDaughter; @@ -662,32 +663,36 @@ struct HfTreeCreatorOmegacSt { // Match Omegac0 → Omega- + Pi+ indexRec = RecoDecay::getMatchedMCRec(mcParticles->get(), arrayDaughters, o2::constants::physics::kOmegaC0, std::array{+kPiPlus, +kKMinus, +kProton, +kPiMinus}, true, &sign, 3, &nPiToMuOmegac0, &nKaToPiOmegac0); + indexRecCharmBaryon = indexRec; + if (indexRec > -1) { + // Omega- → K pi p (Cascade match) + indexRec = RecoDecay::getMatchedMCRec(mcParticles->get(), arrayDaughtersCasc, +kOmegaMinus, std::array{+kKMinus, +kProton, +kPiMinus}, true, &signCasc, 2, &nPiToMuCasc, &nKaToPiCasc); + if (indexRec > -1) { + // Lambda → p pi (Lambda match) + indexRec = RecoDecay::getMatchedMCRec(mcParticles->get(), arrayDaughtersV0, +kLambda0, std::array{+kProton, +kPiMinus}, true, &signV0, 1, &nPiToMuV0); + if (indexRec > -1) { + isMatched = true; + } + } + } } else if (decayChannel == o2::aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaK) { // Match Omegac0 → Omega- + K+ indexRec = RecoDecay::getMatchedMCRec(mcParticles->get(), arrayDaughters, o2::constants::physics::kOmegaC0, std::array{+kKPlus, +kKMinus, +kProton, +kPiMinus}, true, &sign, 3, &nPiToMuOmegac0, &nKaToPiOmegac0); - } - indexRecCharmBaryon = indexRec; - if (indexRec > -1) { - // Omega- → K pi p (Cascade match) - indexRec = RecoDecay::getMatchedMCRec(mcParticles->get(), arrayDaughtersCasc, +kOmegaMinus, std::array{+kKMinus, +kProton, +kPiMinus}, true, &signCasc, 2, &nPiToMuCasc, &nKaToPiCasc); + indexRecCharmBaryon = indexRec; if (indexRec > -1) { - // Lambda → p pi (Lambda match) - indexRec = RecoDecay::getMatchedMCRec(mcParticles->get(), arrayDaughtersV0, +kLambda0, std::array{+kProton, +kPiMinus}, true, &signV0, 1, &nPiToMuV0); - if (decayChannel == o2::aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaPi) { - if (nPiToMuOmegac0 >= 1 && nKaToPiOmegac0 == 0) { - isMatched = true; - } else if (nPiToMuOmegac0 == 0 && nKaToPiOmegac0 == 0) { - isMatched = true; - } - } else if (decayChannel == o2::aod::hf_cand_casc_lf::DecayType2Prong::OmegaczeroToOmegaK) { - if (nPiToMuOmegac0 == 0 && nKaToPiOmegac0 == 0) { + // Omega- → K pi p (Cascade match) + indexRec = RecoDecay::getMatchedMCRec(mcParticles->get(), arrayDaughtersCasc, +kOmegaMinus, std::array{+kKMinus, +kProton, +kPiMinus}, true, &signCasc, 2, &nPiToMuCasc, &nKaToPiCasc); + if (indexRec > -1) { + // Lambda → p pi (Lambda match) + indexRec = RecoDecay::getMatchedMCRec(mcParticles->get(), arrayDaughtersV0, +kLambda0, std::array{+kProton, +kPiMinus}, true, &signV0, 1, &nPiToMuV0); + if (indexRec > -1) { isMatched = true; } } } } - if (isMatched) { + if (isMatched && indexRecCharmBaryon > -1) { auto particle = mcParticles->get().rawIteratorAt(indexRecCharmBaryon); origin = RecoDecay::getCharmHadronOrigin(mcParticles->get(), particle, false, &idxBhadMothers); } From fed3dae875a6bb50a34e450d0c7b3d47a571a147 Mon Sep 17 00:00:00 2001 From: sashingo Date: Thu, 12 Jun 2025 16:50:27 +0900 Subject: [PATCH 1587/1650] [PWGHF] added some histograms for EMCal (#11554) --- PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx b/PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx index be71ab35a01..72ff0ccdf8d 100644 --- a/PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx +++ b/PWGHF/HFL/Tasks/taskElectronWeakBoson.cxx @@ -160,6 +160,8 @@ struct HfTaskElectronWeakBoson { const AxisSpec axisM02{100, 0, 1, "M02"}; const AxisSpec axisdPhi{100, -0.5, 0.5, "dPhi"}; const AxisSpec axisdEta{100, -0.5, 0.5, "dEta"}; + const AxisSpec axisdR{20, 0.0, 0.2, "dR"}; + const AxisSpec axisNcell{50, 0.0, 50.0, "Ncell"}; const AxisSpec axisPhi{350, 0, 7, "Phi"}; const AxisSpec axisEop{200, 0, 2, "Eop"}; const AxisSpec axisChi2{250, 0.0, 25.0, "#chi^{2}"}; @@ -184,7 +186,8 @@ struct HfTaskElectronWeakBoson { registry.add("hPt", "track pt", kTH1F, {axisPt}); registry.add("hTPCNsigma", "TPC electron Nsigma", kTH2F, {{axisPt}, {axisNsigma}}); registry.add("hEnergy", "EMC cluster energy", kTH1F, {axisE}); - registry.add("hTrMatch", "Track EMC Match", kTH2F, {{axisdPhi}, {axisdEta}}); + registry.add("hEnergyNcell", "EMC cluster energy and cell", kTH2F, {{axisE}, {axisNcell}}); + registry.add("hTrMatchR", "Track EMC Match in radius", kTH2F, {{axisPt}, {axisdR}}); registry.add("hTrMatch_mim", "Track EMC Match minimu minimumm", kTH2F, {{axisdPhi}, {axisdEta}}); registry.add("hMatchPhi", "Match in Phi", kTH2F, {{axisPhi}, {axisPhi}}); registry.add("hMatchEta", "Match in Eta", kTH2F, {{axisEta}, {axisEta}}); @@ -198,6 +201,7 @@ struct HfTaskElectronWeakBoson { registry.add("hInvMassZeeLs", "invariant mass for Z LS pair", kTH2F, {{axisPt}, {axisInvMassZ}}); registry.add("hInvMassZeeUls", "invariant mass for Z ULS pair", kTH2F, {{axisPt}, {axisInvMassZ}}); registry.add("hTHnElectrons", "electron info", HistType::kTHnSparseF, {axisPt, axisNsigma, axisM02, axisEop, axisIsoEnergy, axisIsoTrack}); + registry.add("hTHnTrMatch", "Track EMC Match", HistType::kTHnSparseF, {axisPt, axisdPhi, axisdEta}); // hisotgram for EMCal trigger registry.add("hEMCalTrigger", "EMCal trigger", kTH1F, {axisTrigger}); @@ -298,7 +302,7 @@ struct HfTaskElectronWeakBoson { registry.fill(HIST("hEMCalTrigger"), isTriggered ? 1 : 0); // Skip event if not triggered and we're processing skimmed data - if (!isTriggered && cfgSkimmedProcessing) { + if (!isTriggered) { return; } } @@ -397,13 +401,16 @@ struct HfTaskElectronWeakBoson { dPhiMin = dPhi; dEtaMin = dEta; } - registry.fill(HIST("hTrMatch"), dPhi, dEta); + registry.fill(HIST("hTHnTrMatch"), match.track_as().pt(), dPhi, dEta); registry.fill(HIST("hEMCtime"), timeEmc); registry.fill(HIST("hEnergy"), energyEmc); - if (r > rMatchMax) + if (std::abs(dPhi) > rMatchMax || std::abs(dEta) > rMatchMax) continue; + registry.fill(HIST("hTrMatchR"), match.track_as().pt(), r); + registry.fill(HIST("hEnergyNcell"), energyEmc, match.emcalcluster_as().nCells()); + const auto& cluster = match.emcalcluster_as(); double eop = energyEmc / match.track_as().p(); From b3ff448c7d30db92ab2f574ce2f4dafdc274a66b Mon Sep 17 00:00:00 2001 From: Francesco Mazzaschi <43742195+fmazzasc@users.noreply.github.com> Date: Thu, 12 Jun 2025 10:31:21 +0200 Subject: [PATCH 1588/1650] Add number of PV contributors (#11558) Co-authored-by: Francesco Mazzaschi --- PWGLF/DataModel/LFSlimNucleiTables.h | 8 ++- PWGLF/TableProducer/Nuspex/nucleiFlowTree.cxx | 6 +-- PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx | 54 +++++++++---------- PWGLF/TableProducer/Nuspex/nucleiUtils.h | 1 + 4 files changed, 35 insertions(+), 34 deletions(-) diff --git a/PWGLF/DataModel/LFSlimNucleiTables.h b/PWGLF/DataModel/LFSlimNucleiTables.h index e562c35ddc6..e1c0e0eb364 100644 --- a/PWGLF/DataModel/LFSlimNucleiTables.h +++ b/PWGLF/DataModel/LFSlimNucleiTables.h @@ -14,10 +14,11 @@ /// \brief Slim nuclei tables /// -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoAHelpers.h" #include "Common/DataModel/Centrality.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisDataModel.h" + #ifndef PWGLF_DATAMODEL_LFSLIMNUCLEITABLES_H_ #define PWGLF_DATAMODEL_LFSLIMNUCLEITABLES_H_ @@ -31,6 +32,7 @@ DECLARE_SOA_COLUMN(Phi, phi, float); DECLARE_SOA_COLUMN(TPCInnerParam, tpcInnerParam, float); DECLARE_SOA_COLUMN(Beta, beta, float); DECLARE_SOA_COLUMN(Zvertex, zVertex, float); +DECLARE_SOA_COLUMN(NContrib, nContrib, int); DECLARE_SOA_COLUMN(DCAxy, dcaxy, float); DECLARE_SOA_COLUMN(DCAz, dcaz, float); DECLARE_SOA_COLUMN(TPCsignal, tpcSignal, float); @@ -102,6 +104,7 @@ DECLARE_SOA_TABLE(NucleiTable, "AOD", "NUCLEITABLE", NucleiTableNS::TPCInnerParam, NucleiTableNS::Beta, NucleiTableNS::Zvertex, + NucleiTableNS::NContrib, NucleiTableNS::DCAxy, NucleiTableNS::DCAz, NucleiTableNS::TPCsignal, @@ -139,6 +142,7 @@ DECLARE_SOA_TABLE(NucleiTableMC, "AOD", "NUCLEITABLEMC", NucleiTableNS::TPCInnerParam, NucleiTableNS::Beta, NucleiTableNS::Zvertex, + NucleiTableNS::NContrib, NucleiTableNS::DCAxy, NucleiTableNS::DCAz, NucleiTableNS::TPCsignal, diff --git a/PWGLF/TableProducer/Nuspex/nucleiFlowTree.cxx b/PWGLF/TableProducer/Nuspex/nucleiFlowTree.cxx index 68c9b7ac91d..6c15c2a626c 100644 --- a/PWGLF/TableProducer/Nuspex/nucleiFlowTree.cxx +++ b/PWGLF/TableProducer/Nuspex/nucleiFlowTree.cxx @@ -440,7 +440,7 @@ struct nucleiFlowTree { } nuclei::candidates.emplace_back(NucleusCandidate{ static_cast(track.globalIndex()), static_cast(track.collisionId()), (1 - 2 * iC) * mTrackParCov.getPt(), mTrackParCov.getEta(), mTrackParCov.getPhi(), - correctedTpcInnerParam, beta, collision.posZ(), dcaInfo[0], dcaInfo[1], track.tpcSignal(), track.itsChi2NCl(), track.tpcChi2NCl(), track.tofChi2(), + correctedTpcInnerParam, beta, collision.posZ(), collision.numContrib(), dcaInfo[0], dcaInfo[1], track.tpcSignal(), track.itsChi2NCl(), track.tpcChi2NCl(), track.tofChi2(), nSigmaTPC, tofMasses, fillTree, fillDCAHist, correctPV, isSecondary, fromWeakDecay, flag, track.tpcNClsFindable(), static_cast(track.tpcNClsCrossedRows()), track.itsClusterMap(), static_cast(track.tpcNClsFound()), static_cast(track.tpcNClsShared()), static_cast(track.itsNCls()), static_cast(track.itsClusterSizes())}); } @@ -456,7 +456,7 @@ struct nucleiFlowTree { } fillDataInfo(collision, tracks); for (auto& c : nuclei::candidates) { - nucleiTable(c.pt, c.eta, c.phi, c.tpcInnerParam, c.beta, c.zVertex, c.DCAxy, c.DCAz, c.TPCsignal, c.ITSchi2, c.TPCchi2, c.TOFchi2, c.flags, c.TPCfindableCls, c.TPCcrossedRows, c.ITSclsMap, c.TPCnCls, c.TPCnClsShared, c.clusterSizesITS); + nucleiTable(c.pt, c.eta, c.phi, c.tpcInnerParam, c.beta, c.zVertex, c.nContrib, c.DCAxy, c.DCAz, c.TPCsignal, c.ITSchi2, c.TPCchi2, c.TOFchi2, c.flags, c.TPCfindableCls, c.TPCcrossedRows, c.ITSclsMap, c.TPCnCls, c.TPCnClsShared, c.clusterSizesITS); } for (auto& c : nuclei::candidates_flow) { nucleiTableFlow(c.centFV0A, c.centFT0M, c.centFT0A, c.centFT0C, c.psiFT0A, c.psiFT0C, c.psiTPC, c.psiTPCl, c.psiTPCr, c.qFT0A, c.qFT0C, c.qTPC, c.qTPCl, c.qTPCr); @@ -473,7 +473,7 @@ struct nucleiFlowTree { } fillDataInfo(collision, tracks); for (auto& c : nuclei::candidates) { - nucleiTable(c.pt, c.eta, c.phi, c.tpcInnerParam, c.beta, c.zVertex, c.DCAxy, c.DCAz, c.TPCsignal, c.ITSchi2, c.TPCchi2, c.TOFchi2, c.flags, c.TPCfindableCls, c.TPCcrossedRows, c.ITSclsMap, c.TPCnCls, c.TPCnClsShared, c.clusterSizesITS); + nucleiTable(c.pt, c.eta, c.phi, c.tpcInnerParam, c.beta, c.zVertex, c.nContrib, c.DCAxy, c.DCAz, c.TPCsignal, c.ITSchi2, c.TPCchi2, c.TOFchi2, c.flags, c.TPCfindableCls, c.TPCcrossedRows, c.ITSclsMap, c.TPCnCls, c.TPCnClsShared, c.clusterSizesITS); } for (auto& c : nuclei::candidates_flow) { nucleiTableFlow(c.centFV0A, c.centFT0M, c.centFT0A, c.centFT0C, c.psiFT0A, c.psiFT0C, c.psiTPC, c.psiTPCl, c.psiTPCr, c.qFT0A, c.qFT0C, c.qTPC, c.qTPCl, c.qTPCr); diff --git a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx index 205c0eda0a4..22945965595 100644 --- a/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx +++ b/PWGLF/TableProducer/Nuspex/nucleiSpectra.cxx @@ -19,52 +19,47 @@ // o2-analysis-pid-tof-base, o2-analysis-multiplicity-table, o2-analysis-event-selection // (to add flow: o2-analysis-qvector-table, o2-analysis-centrality-table) -#include -#include -#include -#include -#include - -#include "Math/Vector4D.h" - -#include "CCDB/BasicCCDBManager.h" +#include "PWGLF/DataModel/EPCalibrationTables.h" +#include "PWGLF/DataModel/LFSlimNucleiTables.h" +#include "Common/Core/EventPlaneHelper.h" +#include "Common/Core/PID/PIDTOF.h" +#include "Common/Core/RecoDecay.h" #include "Common/Core/TrackSelection.h" #include "Common/Core/trackUtilities.h" #include "Common/DataModel/Centrality.h" -#include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/PIDResponse.h" #include "Common/DataModel/PIDResponseITS.h" +#include "Common/DataModel/Qvectors.h" #include "Common/DataModel/TrackSelectionTables.h" -#include "Common/Core/PID/PIDTOF.h" #include "Common/TableProducer/PID/pidTOFBase.h" -#include "Common/Core/EventPlaneHelper.h" -#include "Common/DataModel/Qvectors.h" -#include "Common/Core/RecoDecay.h" +#include "EventFiltering/Zorro.h" +#include "EventFiltering/ZorroSummary.h" +#include "CCDB/BasicCCDBManager.h" #include "DataFormatsParameters/GRPMagField.h" #include "DataFormatsParameters/GRPObject.h" #include "DataFormatsTPC/BetheBlochAleph.h" #include "DetectorsBase/GeometryManager.h" #include "DetectorsBase/Propagator.h" - -#include "EventFiltering/Zorro.h" -#include "EventFiltering/ZorroSummary.h" - +#include "Framework/ASoAHelpers.h" #include "Framework/AnalysisDataModel.h" #include "Framework/AnalysisTask.h" -#include "Framework/ASoAHelpers.h" #include "Framework/HistogramRegistry.h" #include "Framework/runDataProcessing.h" - #include "ReconstructionDataFormats/Track.h" -#include "PWGLF/DataModel/EPCalibrationTables.h" -#include "PWGLF/DataModel/LFSlimNucleiTables.h" - +#include "Math/Vector4D.h" #include "TRandom3.h" +#include +#include +#include +#include +#include + using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; @@ -79,6 +74,7 @@ struct NucleusCandidate { float tpcInnerParam; float beta; float zVertex; + int nContrib; float DCAxy; float DCAz; float TPCsignal; @@ -793,7 +789,7 @@ struct nucleiSpectra { } nuclei::candidates.emplace_back(NucleusCandidate{ static_cast(track.globalIndex()), static_cast(track.collisionId()), (1 - 2 * iC) * mTrackParCov.getPt(), mTrackParCov.getEta(), mTrackParCov.getPhi(), - correctedTpcInnerParam, beta, collision.posZ(), dcaInfo[0], dcaInfo[1], track.tpcSignal(), track.itsChi2NCl(), track.tpcChi2NCl(), track.tofChi2(), + correctedTpcInnerParam, beta, collision.posZ(), collision.numContrib(), dcaInfo[0], dcaInfo[1], track.tpcSignal(), track.itsChi2NCl(), track.tpcChi2NCl(), track.tofChi2(), nSigmaTPC, tofMasses, fillTree, fillDCAHist, correctPV, isSecondary, fromWeakDecay, flag, track.tpcNClsFindable(), static_cast(track.tpcNClsCrossedRows()), track.itsClusterMap(), static_cast(track.tpcNClsFound()), static_cast(track.tpcNClsShared()), static_cast(track.itsNCls()), static_cast(track.itsClusterSizes())}); } @@ -814,7 +810,7 @@ struct nucleiSpectra { for (size_t i1{0}; i1 < nuclei::candidates.size(); ++i1) { auto& c1 = nuclei::candidates[i1]; if (c1.fillTree) { - nucleiTable(c1.pt, c1.eta, c1.phi, c1.tpcInnerParam, c1.beta, c1.zVertex, c1.DCAxy, c1.DCAz, c1.TPCsignal, c1.ITSchi2, c1.TPCchi2, c1.TOFchi2, c1.flags, c1.TPCfindableCls, c1.TPCcrossedRows, c1.ITSclsMap, c1.TPCnCls, c1.TPCnClsShared, c1.clusterSizesITS); + nucleiTable(c1.pt, c1.eta, c1.phi, c1.tpcInnerParam, c1.beta, c1.zVertex, c1.nContrib, c1.DCAxy, c1.DCAz, c1.TPCsignal, c1.ITSchi2, c1.TPCchi2, c1.TOFchi2, c1.flags, c1.TPCfindableCls, c1.TPCcrossedRows, c1.ITSclsMap, c1.TPCnCls, c1.TPCnClsShared, c1.clusterSizesITS); if (cfgFillPairTree) { for (size_t i2{i1 + 1}; i2 < nuclei::candidates.size(); ++i2) { auto& c2 = nuclei::candidates[i2]; @@ -849,7 +845,7 @@ struct nucleiSpectra { fillDataInfo(collision, tracks); for (auto& c : nuclei::candidates) { if (c.fillTree) { - nucleiTable(c.pt, c.eta, c.phi, c.tpcInnerParam, c.beta, c.zVertex, c.DCAxy, c.DCAz, c.TPCsignal, c.ITSchi2, c.TPCchi2, c.TOFchi2, c.flags, c.TPCfindableCls, c.TPCcrossedRows, c.ITSclsMap, c.TPCnCls, c.TPCnClsShared, c.clusterSizesITS); + nucleiTable(c.pt, c.eta, c.phi, c.tpcInnerParam, c.beta, c.zVertex, c.nContrib, c.DCAxy, c.DCAz, c.TPCsignal, c.ITSchi2, c.TPCchi2, c.TOFchi2, c.flags, c.TPCfindableCls, c.TPCcrossedRows, c.ITSclsMap, c.TPCnCls, c.TPCnClsShared, c.clusterSizesITS); } if (c.fillDCAHist) { for (int iS{0}; iS < nuclei::species; ++iS) { @@ -878,7 +874,7 @@ struct nucleiSpectra { fillDataInfo(collision, tracks); for (auto& c : nuclei::candidates) { if (c.fillTree) { - nucleiTable(c.pt, c.eta, c.phi, c.tpcInnerParam, c.beta, c.zVertex, c.DCAxy, c.DCAz, c.TPCsignal, c.ITSchi2, c.TPCchi2, c.TOFchi2, c.flags, c.TPCfindableCls, c.TPCcrossedRows, c.ITSclsMap, c.TPCnCls, c.TPCnClsShared, c.clusterSizesITS); + nucleiTable(c.pt, c.eta, c.phi, c.tpcInnerParam, c.beta, c.zVertex, c.nContrib, c.DCAxy, c.DCAz, c.TPCsignal, c.ITSchi2, c.TPCchi2, c.TOFchi2, c.flags, c.TPCfindableCls, c.TPCcrossedRows, c.ITSclsMap, c.TPCnCls, c.TPCnClsShared, c.clusterSizesITS); } if (c.fillDCAHist) { for (int iS{0}; iS < nuclei::species; ++iS) { @@ -971,7 +967,7 @@ struct nucleiSpectra { isReconstructed[particle.globalIndex()] = true; float absoDecL = computeAbsoDecL(particle); - nucleiTableMC(c.pt, c.eta, c.phi, c.tpcInnerParam, c.beta, c.zVertex, c.DCAxy, c.DCAz, c.TPCsignal, c.ITSchi2, c.TPCchi2, c.TOFchi2, c.flags, c.TPCfindableCls, c.TPCcrossedRows, c.ITSclsMap, c.TPCnCls, c.TPCnClsShared, c.clusterSizesITS, goodCollisions[particle.mcCollisionId()], particle.pt(), particle.eta(), particle.phi(), particle.pdgCode(), motherPdgCode, motherDecRadius, absoDecL); + nucleiTableMC(c.pt, c.eta, c.phi, c.tpcInnerParam, c.beta, c.zVertex, c.nContrib, c.DCAxy, c.DCAz, c.TPCsignal, c.ITSchi2, c.TPCchi2, c.TOFchi2, c.flags, c.TPCfindableCls, c.TPCcrossedRows, c.ITSclsMap, c.TPCnCls, c.TPCnClsShared, c.clusterSizesITS, goodCollisions[particle.mcCollisionId()], particle.pt(), particle.eta(), particle.phi(), particle.pdgCode(), motherPdgCode, motherDecRadius, absoDecL); } int index{0}; @@ -1014,7 +1010,7 @@ struct nucleiSpectra { if (!isReconstructed[index] && (cfgTreeConfig->get(iS, 0u) || cfgTreeConfig->get(iS, 1u))) { float absDecL = computeAbsoDecL(particle); - nucleiTableMC(999., 999., 999., 0., 0., 999., 999., 999., -1, -1, -1, -1, flags, 0, 0, 0, 0, 0, 0, goodCollisions[particle.mcCollisionId()], particle.pt(), particle.eta(), particle.phi(), particle.pdgCode(), motherPdgCode, motherDecRadius, absDecL); + nucleiTableMC(999., 999., 999., 0., 0., 999., -1, 999., 999., -1, -1, -1, -1, flags, 0, 0, 0, 0, 0, 0, goodCollisions[particle.mcCollisionId()], particle.pt(), particle.eta(), particle.phi(), particle.pdgCode(), motherPdgCode, motherDecRadius, absDecL); } break; } diff --git a/PWGLF/TableProducer/Nuspex/nucleiUtils.h b/PWGLF/TableProducer/Nuspex/nucleiUtils.h index 2a9a64bc4b2..29cd489768d 100644 --- a/PWGLF/TableProducer/Nuspex/nucleiUtils.h +++ b/PWGLF/TableProducer/Nuspex/nucleiUtils.h @@ -29,6 +29,7 @@ struct NucleusCandidate { float tpcInnerParam; float beta; float zVertex; + int nContrib; float DCAxy; float DCAz; float TPCsignal; From ccd75917226e6857dd52374dfcfe5c3ce6daa47b Mon Sep 17 00:00:00 2001 From: aimeric-landou <46970521+aimeric-landou@users.noreply.github.com> Date: Thu, 12 Jun 2025 11:23:57 +0200 Subject: [PATCH 1589/1650] [PWGJE] trackEfficiency: use true track weight for numerator for fake tracks (#11493) --- PWGJE/Tasks/trackEfficiency.cxx | 86 ++++++++++++++++++++++----------- 1 file changed, 57 insertions(+), 29 deletions(-) diff --git a/PWGJE/Tasks/trackEfficiency.cxx b/PWGJE/Tasks/trackEfficiency.cxx index a591c32f958..87e37014ae7 100644 --- a/PWGJE/Tasks/trackEfficiency.cxx +++ b/PWGJE/Tasks/trackEfficiency.cxx @@ -82,6 +82,9 @@ struct TrackEfficiency { Configurable ptHatMin{"ptHatMin", 5, "min pT hat of collisions"}; Configurable ptHatMax{"ptHatMax", 300, "max pT hat of collisions"}; Configurable pTHatExponent{"pTHatExponent", 6.0, "exponent of the event weight for the calculation of pTHat"}; + Configurable pTHatMaxFractionMCD{"pTHatMaxFractionMCD", 999.0, "maximum fraction of hard scattering for reconstructed track acceptance in MC"}; + + Configurable useTrueTrackWeight{"useTrueTrackWeight", 1, "test configurable, to be removed"}; std::vector eventSelectionBits; int trackSelection = -1; @@ -110,6 +113,13 @@ struct TrackEfficiency { if (!(jetderiveddatautilities::selectTrack(track, trackSelection) && jetderiveddatautilities::selectTrackDcaZ(track, trackDcaZmax))) { continue; } + + float simPtRef = 10.; + float pTHat = simPtRef / (std::pow(weight, 1.0 / pTHatExponent)); + if (track.pt() > pTHatMaxFractionMCD * pTHat) { + continue; + } + registry.fill(HIST("h2_centrality_track_pt"), collision.centrality(), track.pt(), weight); registry.fill(HIST("h2_centrality_track_eta"), collision.centrality(), track.eta(), weight); registry.fill(HIST("h2_centrality_track_phi"), collision.centrality(), track.phi(), weight); @@ -164,8 +174,16 @@ struct TrackEfficiency { registry.get(HIST("hTrackCutsCounts"))->GetXaxis()->SetBinLabel(1, "allTracksInSelColl"); registry.get(HIST("hTrackCutsCounts"))->GetXaxis()->SetBinLabel(2, "trackSel"); registry.get(HIST("hTrackCutsCounts"))->GetXaxis()->SetBinLabel(3, "hasMcParticle"); - registry.get(HIST("hTrackCutsCounts"))->GetXaxis()->SetBinLabel(4, "mcPartIsPrimary"); - registry.get(HIST("hTrackCutsCounts"))->GetXaxis()->SetBinLabel(5, "etaAcc"); // not actually applied here but it will give an idea of what will be done in the post processing + + if (doprocessEFficiencyPurity) { + registry.get(HIST("hTrackCutsCounts"))->GetXaxis()->SetBinLabel(4, "mcPartIsPrimary"); + registry.get(HIST("hTrackCutsCounts"))->GetXaxis()->SetBinLabel(5, "etaAcc"); // not actually applied here but it will give an idea of what will be done in the post processing + } + if (doprocessEFficiencyPurityWeighted) { + registry.get(HIST("hTrackCutsCounts"))->GetXaxis()->SetBinLabel(4, "ptHatMaxFraction"); + registry.get(HIST("hTrackCutsCounts"))->GetXaxis()->SetBinLabel(5, "mcPartIsPrimary"); + registry.get(HIST("hTrackCutsCounts"))->GetXaxis()->SetBinLabel(6, "etaAcc"); // not actually applied here but it will give an idea of what will be done in the post processing + } AxisSpec ptAxisEff = {nBinsLowPt, 0., 10., "#it{p}_{T} (GeV/#it{c})"}; AxisSpec ptAxisHighEff = {18, 10., 100., "#it{p}_{T} (GeV/#it{c})"}; @@ -478,8 +496,9 @@ struct TrackEfficiency { } registry.fill(HIST("hMcCollCutsCounts"), 5.5); // at least one of the reconstructed collisions associated with this mcCollision is selected with regard to centrality - float eventWeight = mcCollision.weight(); - float pTHat = 10. / (std::pow(eventWeight, 1.0 / pTHatExponent)); + float simPtRef = 10.; + float mcCollEventWeight = mcCollision.weight(); + float pTHat = simPtRef / (std::pow(mcCollEventWeight, 1.0 / pTHatExponent)); if (pTHat < ptHatMin || pTHat > ptHatMax) { // only allows mcCollisions with weight in between min and max return; } @@ -493,16 +512,16 @@ struct TrackEfficiency { } registry.fill(HIST("hMcPartCutsCounts"), 1.5); // isCharged - registry.fill(HIST("h3_particle_pt_particle_eta_particle_phi_mcpart_nonprimary"), jMcParticle.pt(), jMcParticle.eta(), jMcParticle.phi(), eventWeight); + registry.fill(HIST("h3_particle_pt_particle_eta_particle_phi_mcpart_nonprimary"), jMcParticle.pt(), jMcParticle.eta(), jMcParticle.phi(), mcCollEventWeight); if (checkPrimaryPart && !jMcParticle.isPhysicalPrimary()) { // global tracks should be mostly primaries continue; } registry.fill(HIST("hMcPartCutsCounts"), 2.5); // isPrimary - registry.fill(HIST("h3_particle_pt_particle_eta_particle_phi_mcpartofinterest"), jMcParticle.pt(), jMcParticle.eta(), jMcParticle.phi(), eventWeight); + registry.fill(HIST("h3_particle_pt_particle_eta_particle_phi_mcpartofinterest"), jMcParticle.pt(), jMcParticle.eta(), jMcParticle.phi(), mcCollEventWeight); - registry.fill(HIST("h3_particle_pt_high_particle_eta_particle_phi_mcpartofinterest"), jMcParticle.pt(), jMcParticle.eta(), jMcParticle.phi(), eventWeight); + registry.fill(HIST("h3_particle_pt_high_particle_eta_particle_phi_mcpartofinterest"), jMcParticle.pt(), jMcParticle.eta(), jMcParticle.phi(), mcCollEventWeight); if ((std::abs(jMcParticle.eta()) < trackEtaAcceptanceCountQA)) { // removed from actual cuts for now because all the histograms have an eta axis registry.fill(HIST("hMcPartCutsCounts"), 3.5); // etaAccept // not actually applied here but it will give an idea of what will be done in the post processing @@ -532,27 +551,36 @@ struct TrackEfficiency { registry.fill(HIST("hTrackCutsCounts"), 1.5); if (!track.has_mcParticle()) { - registry.fill(HIST("h3_track_pt_track_eta_track_phi_nonassociatedtrack"), track.pt(), track.eta(), track.phi(), eventWeight); + registry.fill(HIST("h3_track_pt_track_eta_track_phi_nonassociatedtrack"), track.pt(), track.eta(), track.phi(), mcCollEventWeight); // weight attribution here not trivial; I use the one of the current mcCollision, but track belongs to no collision; what should be its weight? could be a moot point but algo has complained about invalid index for mcParticle if I put th etrueTrackCollEventWeight before this cut - registry.fill(HIST("h3_track_pt_high_track_eta_track_phi_nonassociatedtrack"), track.pt(), track.eta(), track.phi(), eventWeight); + registry.fill(HIST("h3_track_pt_high_track_eta_track_phi_nonassociatedtrack"), track.pt(), track.eta(), track.phi(), mcCollEventWeight); continue; } registry.fill(HIST("hTrackCutsCounts"), 2.5); + if (track.pt() > pTHatMaxFractionMCD * pTHat) { + continue; + } + registry.fill(HIST("hTrackCutsCounts"), 3.5); + + auto mcParticle = track.mcParticle_as(); + auto trueTrackMcCollision = mcParticle.mcCollision_as(); + float trueTrackCollEventWeight = useTrueTrackWeight ? trueTrackMcCollision.weight() : mcCollEventWeight; // test1 + auto jMcParticleFromTrack = track.mcParticle_as(); if (!jMcParticleFromTrack.isPhysicalPrimary()) { - registry.fill(HIST("h3_track_pt_track_eta_track_phi_associatedtrack_nonprimary"), track.pt(), track.eta(), track.phi(), eventWeight); - registry.fill(HIST("h3_particle_pt_particle_eta_particle_phi_associatedtrack_nonprimary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), eventWeight); + registry.fill(HIST("h3_track_pt_track_eta_track_phi_associatedtrack_nonprimary"), track.pt(), track.eta(), track.phi(), trueTrackCollEventWeight); + registry.fill(HIST("h3_particle_pt_particle_eta_particle_phi_associatedtrack_nonprimary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), trueTrackCollEventWeight); - registry.fill(HIST("h3_track_pt_high_track_eta_track_phi_associatedtrack_nonprimary"), track.pt(), track.eta(), track.phi(), eventWeight); - registry.fill(HIST("h3_particle_pt_high_particle_eta_particle_phi_associatedtrack_nonprimary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), eventWeight); + registry.fill(HIST("h3_track_pt_high_track_eta_track_phi_associatedtrack_nonprimary"), track.pt(), track.eta(), track.phi(), trueTrackCollEventWeight); + registry.fill(HIST("h3_particle_pt_high_particle_eta_particle_phi_associatedtrack_nonprimary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), trueTrackCollEventWeight); if (std::find(seenMcParticlesVector.begin(), seenMcParticlesVector.end(), jMcParticleFromTrack.globalIndex()) != seenMcParticlesVector.end()) { - registry.fill(HIST("h3_track_pt_track_eta_track_phi_associatedtrack_split_nonprimary"), track.pt(), track.eta(), track.phi(), eventWeight); - registry.fill(HIST("h3_particle_pt_particle_eta_particle_phi_associatedtrack_split_nonprimary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), eventWeight); + registry.fill(HIST("h3_track_pt_track_eta_track_phi_associatedtrack_split_nonprimary"), track.pt(), track.eta(), track.phi(), trueTrackCollEventWeight); + registry.fill(HIST("h3_particle_pt_particle_eta_particle_phi_associatedtrack_split_nonprimary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), trueTrackCollEventWeight); - registry.fill(HIST("h3_track_pt_high_track_eta_track_phi_associatedtrack_split_nonprimary"), track.pt(), track.eta(), track.phi(), eventWeight); - registry.fill(HIST("h3_particle_pt_high_particle_eta_particle_phi_associatedtrack_split_nonprimary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), eventWeight); + registry.fill(HIST("h3_track_pt_high_track_eta_track_phi_associatedtrack_split_nonprimary"), track.pt(), track.eta(), track.phi(), trueTrackCollEventWeight); + registry.fill(HIST("h3_particle_pt_high_particle_eta_particle_phi_associatedtrack_split_nonprimary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), trueTrackCollEventWeight); } else { seenMcParticlesVector.push_back(jMcParticleFromTrack.globalIndex()); } @@ -560,28 +588,28 @@ struct TrackEfficiency { continue; } - registry.fill(HIST("hTrackCutsCounts"), 3.5); + registry.fill(HIST("hTrackCutsCounts"), 4.5); - registry.fill(HIST("h3_track_pt_track_eta_track_phi_associatedtrack_primary"), track.pt(), track.eta(), track.phi(), eventWeight); - registry.fill(HIST("h3_particle_pt_particle_eta_particle_phi_associatedtrack_primary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), eventWeight); - registry.fill(HIST("h2_particle_pt_track_pt_residual_associatedtrack_primary"), jMcParticleFromTrack.pt(), (jMcParticleFromTrack.pt() - track.pt()) / jMcParticleFromTrack.pt(), eventWeight); + registry.fill(HIST("h3_track_pt_track_eta_track_phi_associatedtrack_primary"), track.pt(), track.eta(), track.phi(), trueTrackCollEventWeight); + registry.fill(HIST("h3_particle_pt_particle_eta_particle_phi_associatedtrack_primary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), trueTrackCollEventWeight); + registry.fill(HIST("h2_particle_pt_track_pt_residual_associatedtrack_primary"), jMcParticleFromTrack.pt(), (jMcParticleFromTrack.pt() - track.pt()) / jMcParticleFromTrack.pt(), trueTrackCollEventWeight); - registry.fill(HIST("h3_track_pt_high_track_eta_track_phi_associatedtrack_primary"), track.pt(), track.eta(), track.phi(), eventWeight); - registry.fill(HIST("h3_particle_pt_high_particle_eta_particle_phi_associatedtrack_primary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), eventWeight); - registry.fill(HIST("h2_particle_pt_high_track_pt_high_residual_associatedtrack_primary"), jMcParticleFromTrack.pt(), (jMcParticleFromTrack.pt() - track.pt()) / jMcParticleFromTrack.pt(), eventWeight); + registry.fill(HIST("h3_track_pt_high_track_eta_track_phi_associatedtrack_primary"), track.pt(), track.eta(), track.phi(), trueTrackCollEventWeight); + registry.fill(HIST("h3_particle_pt_high_particle_eta_particle_phi_associatedtrack_primary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), trueTrackCollEventWeight); + registry.fill(HIST("h2_particle_pt_high_track_pt_high_residual_associatedtrack_primary"), jMcParticleFromTrack.pt(), (jMcParticleFromTrack.pt() - track.pt()) / jMcParticleFromTrack.pt(), trueTrackCollEventWeight); if (std::find(seenMcParticlesVector.begin(), seenMcParticlesVector.end(), jMcParticleFromTrack.globalIndex()) != seenMcParticlesVector.end()) { - registry.fill(HIST("h3_track_pt_track_eta_track_phi_associatedtrack_split_primary"), track.pt(), track.eta(), track.phi(), eventWeight); - registry.fill(HIST("h3_particle_pt_particle_eta_particle_phi_associatedtrack_split_primary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), eventWeight); + registry.fill(HIST("h3_track_pt_track_eta_track_phi_associatedtrack_split_primary"), track.pt(), track.eta(), track.phi(), trueTrackCollEventWeight); + registry.fill(HIST("h3_particle_pt_particle_eta_particle_phi_associatedtrack_split_primary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), trueTrackCollEventWeight); - registry.fill(HIST("h3_track_pt_high_track_eta_track_phi_associatedtrack_split_primary"), track.pt(), track.eta(), track.phi(), eventWeight); - registry.fill(HIST("h3_particle_pt_high_particle_eta_particle_phi_associatedtrack_split_primary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), eventWeight); + registry.fill(HIST("h3_track_pt_high_track_eta_track_phi_associatedtrack_split_primary"), track.pt(), track.eta(), track.phi(), trueTrackCollEventWeight); + registry.fill(HIST("h3_particle_pt_high_particle_eta_particle_phi_associatedtrack_split_primary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), trueTrackCollEventWeight); } else { seenMcParticlesVector.push_back(jMcParticleFromTrack.globalIndex()); } if (std::abs(jMcParticleFromTrack.eta()) < trackEtaAcceptanceCountQA) { // not actually applied here but it will give an idea of what will be done in the post processing - registry.fill(HIST("hTrackCutsCounts"), 4.5); + registry.fill(HIST("hTrackCutsCounts"), 5.5); } } } From ec253788fdee395cc9216cc4587e031fb963e9bb Mon Sep 17 00:00:00 2001 From: Archita-Dash <91664849+Archita-Dash@users.noreply.github.com> Date: Thu, 12 Jun 2025 11:26:11 +0200 Subject: [PATCH 1590/1650] [PWGJE] removal of the redundant outlier cut from Data (#11534) --- PWGJE/Tasks/fullJetSpectra.cxx | 35 ++++++---------------------------- 1 file changed, 6 insertions(+), 29 deletions(-) diff --git a/PWGJE/Tasks/fullJetSpectra.cxx b/PWGJE/Tasks/fullJetSpectra.cxx index 40e233f9a90..5ddcde82ffb 100644 --- a/PWGJE/Tasks/fullJetSpectra.cxx +++ b/PWGJE/Tasks/fullJetSpectra.cxx @@ -674,8 +674,6 @@ struct FullJetSpectra { void processJetsData(soa::Filtered::iterator const& collision, FullJetTableDataJoined const& jets, aod::JetTracks const&, aod::JetClusters const&) { bool eventAccepted = false; - double weight = 1.0; - float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); registry.fill(HIST("hDetcollisionCounter"), 0.5); // allDetColl if (std::fabs(collision.posZ()) > vertexZCut) { @@ -683,37 +681,24 @@ struct FullJetSpectra { } registry.fill(HIST("hDetcollisionCounter"), 1.5); // DetCollWithVertexZ - // outlier check: for every outlier jet, reject the whole event - for (auto const& jet : jets) { - if (jet.pt() > pTHatMaxMCD * pTHat || pTHat < pTHatAbsoluteMin) { // for MCD jets only to remove outliers; setting pTHatMaxMCD = 1 improves purity - registry.fill(HIST("hDetcollisionCounter"), 2.5); // RejectedDetCollWithOutliers - return; - } - // this cut only to be used for calculating Jet Purity and not for Response Matrix - // this is mainly applied to remove all high weight jets causing big fluctuations - if (jet.pt() > 1 * pTHat) { - registry.fill(HIST("h_full_jet_pt_pTHatcut"), jet.pt(), weight); - } - } - if (doMBGapTrigger && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { - registry.fill(HIST("hDetcollisionCounter"), 3.5); // MBRejectedDetEvents + registry.fill(HIST("hDetcollisionCounter"), 2.5); // MBRejectedDetEvents return; } if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, doMBGapTrigger)) { - registry.fill(HIST("hDetcollisionCounter"), 4.5); // EventsNotSatisfyingEventSelection + registry.fill(HIST("hDetcollisionCounter"), 3.5); // EventsNotSatisfyingEventSelection return; } if (doEMCALEventWorkaround) { if (collision.isEmcalReadout() && !collision.isAmbiguous()) { // i.e. EMCAL has a cell content eventAccepted = true; if (collision.alias_bit(kTVXinEMC)) { - registry.fill(HIST("hDetcollisionCounter"), 5.5); // EMCreadoutDetEventsWithkTVXinEMC + registry.fill(HIST("hDetcollisionCounter"), 4.5); // EMCreadoutDetEventsWithkTVXinEMC } } } else { if (!collision.isAmbiguous() && jetderiveddatautilities::eventEMCAL(collision) && collision.alias_bit(kTVXinEMC)) { - registry.fill(HIST("hDetcollisionCounter"), 5.5); // EMCreadoutDetEventsWithkTVXinEMC + registry.fill(HIST("hDetcollisionCounter"), 4.5); // EMCreadoutDetEventsWithkTVXinEMC eventAccepted = true; } } @@ -724,10 +709,10 @@ struct FullJetSpectra { fillRejectedJetHistograms(jet, 1.0); } } - registry.fill(HIST("hDetcollisionCounter"), 6.5); // AllRejectedDetEventsAfterEMCEventSelection + registry.fill(HIST("hDetcollisionCounter"), 5.5); // AllRejectedDetEventsAfterEMCEventSelection return; } - registry.fill(HIST("hDetcollisionCounter"), 7.5); // EMCAcceptedDetColl + registry.fill(HIST("hDetcollisionCounter"), 6.5); // EMCAcceptedDetColl for (auto const& jet : jets) { if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { @@ -1410,8 +1395,6 @@ struct FullJetSpectra { void processDataTracks(soa::Filtered::iterator const& collision, soa::Filtered const& tracks, soa::Filtered const& clusters) { bool eventAccepted = false; - double weight = 1.0; - float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); registry.fill(HIST("hCollisionsUnweighted"), 0.5); // allDetColl if (std::fabs(collision.posZ()) > vertexZCut) { @@ -1419,12 +1402,6 @@ struct FullJetSpectra { } registry.fill(HIST("hCollisionsUnweighted"), 1.5); // DetCollWithVertexZ - // for (auto const& track : tracks) { - if (pTHat < pTHatAbsoluteMin) { // Track outlier rejection: should this be for every track iteration or for every collision? - return; - } - // } - if (doMBGapTrigger && collision.subGeneratorId() == jetderiveddatautilities::JCollisionSubGeneratorId::mbGap) { registry.fill(HIST("hCollisionsUnweighted"), 2.5); // MBRejectedDetEvents return; From e34248af39452246b2b08ccf50148409f63ba994 Mon Sep 17 00:00:00 2001 From: ynishida-style Date: Thu, 12 Jun 2025 18:26:44 +0900 Subject: [PATCH 1591/1650] [PWGJE] improvement of the track selection in jetShape.cxx (#11546) --- PWGJE/Tasks/jetShape.cxx | 89 +++++++++++++++++++++------------------- 1 file changed, 46 insertions(+), 43 deletions(-) diff --git a/PWGJE/Tasks/jetShape.cxx b/PWGJE/Tasks/jetShape.cxx index d7e1f2f0557..3c2bfb4c03c 100644 --- a/PWGJE/Tasks/jetShape.cxx +++ b/PWGJE/Tasks/jetShape.cxx @@ -13,14 +13,10 @@ /// \author Yuto Nishida /// \brief Task for measuring the dependence of the jet shape function rho(r) on the distance r from the jet axis. -#include -#include -#include - -#include "Framework/ASoA.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/AnalysisTask.h" -#include "Framework/HistogramRegistry.h" +#include "PWGJE/Core/FastJetUtilities.h" +#include "PWGJE/Core/JetDerivedDataUtilities.h" +#include "PWGJE/Core/JetUtilities.h" +#include "PWGJE/DataModel/Jet.h" #include "Common/Core/RecoDecay.h" #include "Common/Core/TrackSelection.h" @@ -28,13 +24,16 @@ #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/TrackSelectionTables.h" -#include "PWGJE/Core/FastJetUtilities.h" -#include "PWGJE/Core/JetUtilities.h" -#include "PWGJE/Core/JetDerivedDataUtilities.h" -#include "PWGJE/DataModel/Jet.h" - +#include "Framework/ASoA.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" #include "Framework/runDataProcessing.h" +#include +#include +#include + using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; @@ -61,6 +60,7 @@ struct JetShapeTask { {"ptSum", "ptSum", {HistType::kTH2F, {{14, 0, 0.7}, {300, 0, 300}}}}, {"ptSumBg1", "ptSumBg1", {HistType::kTH2F, {{14, 0, 0.7}, {300, 0, 300}}}}, {"ptSumBg2", "ptSumBg2", {HistType::kTH2F, {{14, 0, 0.7}, {300, 0, 300}}}}, + {"event/vertexz", ";Vtx_{z} (cm);Entries", {HistType::kTH1F, {{100, -20, 20}}}}, {"ptVsCentrality", "ptvscentrality", {HistType::kTH2F, {{100, 0, 100}, {300, 0, 300}}}}}}; Configurable vertexZCut{"vertexZCut", 10.0f, "Accepted z-vertex range"}; @@ -79,9 +79,13 @@ struct JetShapeTask { Configurable> distanceCategory{"distanceCategory", {0.00f, 0.05f, 0.10f, 0.15f, 0.20f, 0.25f, 0.30f, 0.35f, 0.40f, 0.45f, 0.50f, 0.55f, 0.60f, 0.65f, 0.70f}, "distance of category"}; // for ppi production - Configurable maxTpcNClsCrossedRows{"maxTpcNClsCrossedRows", 70, ""}; - Configurable maxDcaXY{"maxDcaXY", 0.2, ""}; - Configurable maxItsNCls{"maxItsNCls", 2, ""}; + Configurable etaTrUp{"etaTrUp", 0.7f, "maximum track eta"}; + Configurable dcaxyMax{"dcaxyMax", 2.0f, "mximum DCA xy"}; + Configurable chi2ItsMax{"chi2ItsMax", 15.0f, "its chi2 cut"}; + Configurable chi2TpcMax{"chi2TpcMax", 4.0f, "tpc chi2 cut"}; + Configurable nclItsMin{"nclItsMin", 2.0f, "its # of cluster cut"}; + Configurable nclTpcMin{"nclTpcMin", 100.0f, "tpc # if cluster cut"}; + Configurable nclcrossTpcMin{"nclcrossTpcMin", 70.0f, "tpc # of crossedRows cut"}; Configurable triggerMasks{"triggerMasks", "", "possible JE Trigger masks: fJetChLowPt,fJetChHighPt,fTrackLowPt,fTrackHighPt,fJetD0ChLowPt,fJetD0ChHighPt,fJetLcChLowPt,fJetLcChHighPt,fEMCALReadout,fJetFullHighPt,fJetFullLowPt,fJetNeutralHighPt,fJetNeutralLowPt,fGammaVeryHighPtEMCAL,fGammaVeryHighPtDCAL,fGammaHighPtEMCAL,fGammaHighPtDCAL,fGammaLowPtEMCAL,fGammaLowPtDCAL,fGammaVeryLowPtEMCAL,fGammaVeryLowPtDCAL"}; @@ -145,18 +149,10 @@ struct JetShapeTask { void processJetShape(soa::Filtered>::iterator const& collision, aod::JetTracks const& tracks, soa::Join const& jets) { - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { - return; - } - std::vector ptDensity; - std::vector ptDensityBg1; - std::vector ptDensityBg2; - - ptDensity.reserve(distanceCategory->size() - 1); - ptDensityBg1.reserve(distanceCategory->size() - 1); - ptDensityBg2.reserve(distanceCategory->size() - 1); - // std::cout << collision.centrality() << std::endl; + std::vector ptDensity(distanceCategory->size() - 1, 0.f); + std::vector ptDensityBg1(distanceCategory->size() - 1, 0.f); + std::vector ptDensityBg2(distanceCategory->size() - 1, 0.f); for (auto const& jet : jets) { if (!isAcceptedJet(jet)) { @@ -178,12 +174,10 @@ struct JetShapeTask { registry.fill(HIST("ptVsCentrality"), collision.centrality(), track.pt()); // calculate compornents of jetshapefunction rho(r) - std::vector trackPtSum; - std::vector trackPtSumBg1; - std::vector trackPtSumBg2; - trackPtSum.reserve(distanceCategory->size() - 1); - trackPtSumBg1.reserve(distanceCategory->size() - 1); - trackPtSumBg2.reserve(distanceCategory->size() - 1); + std::vector trackPtSum(distanceCategory->size() - 1, 0.f); + std::vector trackPtSumBg1(distanceCategory->size() - 1, 0.f); + std::vector trackPtSumBg2(distanceCategory->size() - 1, 0.f); + float phiBg1 = jet.phi() + (o2::constants::math::PIHalf); float phiBg2 = jet.phi() - (o2::constants::math::PIHalf); @@ -197,11 +191,11 @@ struct JetShapeTask { float distanceBg2 = std::sqrt(deltaEta * deltaEta + deltaPhiBg2 * deltaPhiBg2); for (size_t i = 0; i < distanceCategory->size() - 1; i++) { - if (distance < distanceCategory->at(i + 1)) + if (distanceCategory->at(i) <= distance && distance < distanceCategory->at(i + 1)) trackPtSum[i] += track.pt(); - if (distanceBg1 < distanceCategory->at(i + 1)) + if (distanceCategory->at(i) <= distanceBg1 && distanceBg1 < distanceCategory->at(i + 1)) trackPtSumBg1[i] += track.pt(); - if (distanceBg2 < distanceCategory->at(i + 1)) + if (distanceCategory->at(i) <= distanceBg2 && distanceBg2 < distanceCategory->at(i + 1)) trackPtSumBg2[i] += track.pt(); } @@ -221,9 +215,9 @@ struct JetShapeTask { for (size_t i = 0; i < distanceCategory->size() - 1; i++) { double jetX = (distanceCategory->at(i + 1) - distanceCategory->at(i)) * i + (distanceCategory->at(i + 1) - distanceCategory->at(i)) / 2; - double jetShapeFunction = ptDensity[i + 1]; - double jetShapeFunctionBg1 = ptDensityBg1[i + 1]; - double jetShapeFunctionBg2 = ptDensityBg2[i + 1]; + double jetShapeFunction = ptDensity[i]; + double jetShapeFunctionBg1 = ptDensityBg1[i]; + double jetShapeFunctionBg2 = ptDensityBg2[i]; registry.fill(HIST("ptSum"), jetX, jetShapeFunction); registry.fill(HIST("ptSumBg1"), jetX, jetShapeFunctionBg1); registry.fill(HIST("ptSumBg2"), jetX, jetShapeFunctionBg2); @@ -238,6 +232,8 @@ struct JetShapeTask { return; } + registry.fill(HIST("event/vertexz"), collision.posZ()); + for (auto const& jet : jets) { if (!isAcceptedJet(jet)) { continue; @@ -245,13 +241,20 @@ struct JetShapeTask { // tracks conditions for (const auto& track : tracks) { - if (track.tpcNClsCrossedRows() < maxTpcNClsCrossedRows) + if (std::abs(track.eta()) > etaTrUp) continue; - if (std::fabs(track.dcaXY()) > maxDcaXY) + if (track.tpcNClsCrossedRows() < nclcrossTpcMin) continue; - if (track.itsNCls() < maxItsNCls) { + if (std::abs(track.dcaXY()) > dcaxyMax) + continue; + if (track.itsChi2NCl() > chi2ItsMax) + continue; + if (track.tpcChi2NCl() > chi2TpcMax) + continue; + if (track.tpcNClsFound() < nclTpcMin) + continue; + if (track.itsNCls() < nclItsMin) continue; - } // PID check registry.fill(HIST("tpcDedx"), track.pt(), track.tpcSignal()); From edd7b3343a81539b983da2094ba401257450daad Mon Sep 17 00:00:00 2001 From: spucillo <93769017+spucillo@users.noreply.github.com> Date: Thu, 12 Jun 2025 12:01:30 +0200 Subject: [PATCH 1592/1650] [PWGLF] Fix the reweighting for cascades in MC + temporarily disabling histograms for secondary lambdas (#11559) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Strangeness/strangenessInJets.cxx | 408 ++++++++++++------ 1 file changed, 267 insertions(+), 141 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/strangenessInJets.cxx b/PWGLF/Tasks/Strangeness/strangenessInJets.cxx index b7e65345661..3cb2ac41f2b 100644 --- a/PWGLF/Tasks/Strangeness/strangenessInJets.cxx +++ b/PWGLF/Tasks/Strangeness/strangenessInJets.cxx @@ -12,7 +12,7 @@ /// \file strangenessInJets.cxx /// /// \brief task for analysis of strangeness in jets -/// \author Alberto Caliva (alberto.caliva@cern.ch), Francesca Ercolessi (francesca.ercolessi@cern.ch), Nicolò Jacazio (nicolo.jacazio@cern.ch) +/// \author Alberto Caliva (alberto.caliva@cern.ch), Francesca Ercolessi (francesca.ercolessi@cern.ch), Nicolò Jacazio (nicolo.jacazio@cern.ch), Sara Pucillo (sara.pucillo@cern.ch) /// \since May 22, 2024 #include @@ -156,9 +156,13 @@ struct StrangenessInJets { Configurable histoNameWeightAntilambdaJet{"histoNameWeightAntilambdaJet", "", "reweighting histogram: antilambda in jet"}; Configurable histoNameWeightAntilambdaUe{"histoNameWeightAntilambdaUe", "", "reweighting histogram: antilambda in ue"}; Configurable histoNameWeightsXiInJet{"histoNameWeightsXiInJet", "", "reweighting histogram: xi in jet"}; - Configurable histoNameWeightsXiInUe{"histoNameWeightsXiInUe", "", "reweighting histogram: xi in ue"}; + Configurable histoNameWeightsXiUe{"histoNameWeightsXiUe", "", "reweighting histogram: xi in ue"}; Configurable histoNameWeightsAntiXiInJet{"histoNameWeightsAntiXiInJet", "", "reweighting histogram: antixi in jet"}; - Configurable histoNameWeightsAntiXiInUe{"histoNameWeightsAntiXiInUe", "", "reweighting histogram: antixi in ue"}; + Configurable histoNameWeightsAntiXiUe{"histoNameWeightsAntiXiUe", "", "reweighting histogram: antixi in ue"}; + Configurable histoNameWeightsOmegaInJet{"histoNameWeightsOmegaInJet", "", "reweighting histogram: omega in jet"}; + Configurable histoNameWeightsOmegaUe{"histoNameWeightsOmegaUe", "", "reweighting histogram: omega in ue"}; + Configurable histoNameWeightsAntiOmegaInJet{"histoNameWeightsAntiOmegaInJet", "", "reweighting histogram: antiomega in jet"}; + Configurable histoNameWeightsAntiOmegaUe{"histoNameWeightsAntiOmegaUe", "", "reweighting histogram: antiomega in ue"}; // Two-dimensional weights TH2F* twodWeightsPiplusJet = nullptr; @@ -171,10 +175,14 @@ struct StrangenessInJets { TH2F* twodWeightsLambdaUe; TH2F* twodWeightsAntilambdaJet; TH2F* twodWeightsAntilambdaUe; - TH1F* weightsXiInJet; - TH1F* weightsXiInUe; - TH1F* weightsAntiXiInJet; - TH1F* weightsAntiXiInUe; + TH2F* twodWeightsXiInJet; + TH2F* twodWeightsXiUe; + TH2F* twodWeightsAntiXiInJet; + TH2F* twodWeightsAntiXiUe; + TH2F* twodWeightsOmegaInJet; + TH2F* twodWeightsOmegaUe; + TH2F* twodWeightsAntiOmegaInJet; + TH2F* twodWeightsAntiOmegaUe; // List of Particles enum Option { KZeroLambda, @@ -214,10 +222,14 @@ struct StrangenessInJets { twodWeightsLambdaUe = nullptr; twodWeightsAntilambdaJet = nullptr; twodWeightsAntilambdaUe = nullptr; - weightsXiInJet = nullptr; - weightsXiInUe = nullptr; - weightsAntiXiInJet = nullptr; - weightsAntiXiInUe = nullptr; + twodWeightsXiInJet = nullptr; + twodWeightsXiUe = nullptr; + twodWeightsAntiXiInJet = nullptr; + twodWeightsAntiXiUe = nullptr; + twodWeightsOmegaInJet = nullptr; + twodWeightsOmegaUe = nullptr; + twodWeightsAntiOmegaInJet = nullptr; + twodWeightsAntiOmegaUe = nullptr; } // Event Counters @@ -241,8 +253,8 @@ struct StrangenessInJets { registryQC.add("sumPtUE", "sumPtUE", HistType::kTH1F, {{500, 0, 50, "#it{p}_{T} (GeV/#it{c})"}}); registryQC.add("nJets_found", "nJets_found", HistType::kTH1F, {{10, 0, 10, "#it{n}_{Jet}"}}); registryQC.add("nJets_selected", "nJets_selected", HistType::kTH1F, {{10, 0, 10, "#it{n}_{Jet}"}}); - registryQC.add("dcaxy_vs_pt", "dcaxy_vs_pt", HistType::kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); - registryQC.add("dcaz_vs_pt", "dcaz_vs_pt", HistType::kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{z} (cm)"}}); + // registryQC.add("dcaxy_vs_pt", "dcaxy_vs_pt", HistType::kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{xy} (cm)"}}); + // registryQC.add("dcaz_vs_pt", "dcaz_vs_pt", HistType::kTH2F, {{100, 0.0, 5.0, "#it{p}_{T} (GeV/#it{c})"}, {2000, -0.05, 0.05, "DCA_{z} (cm)"}}); registryQC.add("jet_jet_overlaps", "jet_jet_overlaps", HistType::kTH2F, {{20, 0.0, 20.0, "#it{n}_{jet}"}, {200, 0.0, 200.0, "#it{n}_{overlaps}"}}); registryQC.add("jet_ue_overlaps", "jet_ue_overlaps", HistType::kTH2F, {{20, 0.0, 20.0, "#it{n}_{jet}"}, {200, 0.0, 200.0, "#it{n}_{overlaps}"}}); registryQC.add("ue_ue_overlaps", "ue_ue_overlaps", HistType::kTH2F, {{20, 0.0, 20.0, "#it{n}_{jet}"}, {200, 0.0, 200.0, "#it{n}_{overlaps}"}}); @@ -344,10 +356,14 @@ struct StrangenessInJets { registryMC.add("Lambda_generated_ue", "Lambda_generated_ue", HistType::kTH2F, {multBinning, ptAxis}); registryMC.add("AntiLambda_generated_jet", "AntiLambda_generated_jet", HistType::kTH2F, {multBinning, ptAxis}); registryMC.add("AntiLambda_generated_ue", "AntiLambda_generated_ue", HistType::kTH2F, {multBinning, ptAxis}); - registryMC.add("XiPos_generated", "XiPos_generated", HistType::kTH2F, {multBinning, ptAxis}); - registryMC.add("XiNeg_generated", "XiNeg_generated", HistType::kTH2F, {multBinning, ptAxis}); - registryMC.add("OmegaPos_generated", "OmegaPos_generated", HistType::kTH2F, {multBinning, ptAxis}); - registryMC.add("OmegaNeg_generated", "OmegaNeg_generated", HistType::kTH2F, {multBinning, ptAxis}); + registryMC.add("XiPos_generated_jet", "XiPos_generated_jet", HistType::kTH2F, {multBinning, ptAxis}); + registryMC.add("XiPos_generated_ue", "XiPos_generated_ue", HistType::kTH2F, {multBinning, ptAxis}); + registryMC.add("XiNeg_generated_jet", "XiNeg_generated_jet", HistType::kTH2F, {multBinning, ptAxis}); + registryMC.add("XiNeg_generated_ue", "XiNeg_generated_ue", HistType::kTH2F, {multBinning, ptAxis}); + registryMC.add("OmegaPos_generated_jet", "OmegaPos_generated_jet", HistType::kTH2F, {multBinning, ptAxis}); + registryMC.add("OmegaPos_generated_ue", "OmegaPos_generated_ue", HistType::kTH2F, {multBinning, ptAxis}); + registryMC.add("OmegaNeg_generated_jet", "OmegaNeg_generated_jet", HistType::kTH2F, {multBinning, ptAxis}); + registryMC.add("OmegaNeg_generated_ue", "OmegaNeg_generated_ue", HistType::kTH2F, {multBinning, ptAxis}); // Histograms for efficiency (reconstructed) registryMC.add("K0s_reconstructed_jet", "K0s_reconstructed_jet", HistType::kTH2F, {multBinning, ptAxis}); @@ -356,21 +372,30 @@ struct StrangenessInJets { registryMC.add("Lambda_reconstructed_ue", "Lambda_reconstructed_ue", HistType::kTH2F, {multBinning, ptAxis}); registryMC.add("AntiLambda_reconstructed_jet", "AntiLambda_reconstructed_jet", HistType::kTH2F, {multBinning, ptAxis}); registryMC.add("AntiLambda_reconstructed_ue", "AntiLambda_reconstructed_ue", HistType::kTH2F, {multBinning, ptAxis}); - registryMC.add("XiPos_reconstructed", "XiPos_reconstructed", HistType::kTH2F, {multBinning, ptAxis}); - registryMC.add("XiNeg_reconstructed", "XiNeg_reconstructed", HistType::kTH2F, {multBinning, ptAxis}); - registryMC.add("OmegaPos_reconstructed", "OmegaPos_reconstructed", HistType::kTH2F, {multBinning, ptAxis}); - registryMC.add("OmegaNeg_reconstructed", "OmegaNeg_reconstructed", HistType::kTH2F, {multBinning, ptAxis}); + registryMC.add("XiPos_reconstructed_jet", "XiPos_reconstructed_jet", HistType::kTH2F, {multBinning, ptAxis}); + registryMC.add("XiPos_reconstructed_ue", "XiPos_reconstructed_ue", HistType::kTH2F, {multBinning, ptAxis}); + registryMC.add("XiNeg_reconstructed_jet", "XiNeg_reconstructed_jet", HistType::kTH2F, {multBinning, ptAxis}); + registryMC.add("XiNeg_reconstructed_ue", "XiNeg_reconstructed_ue", HistType::kTH2F, {multBinning, ptAxis}); + registryMC.add("OmegaPos_reconstructed_jet", "OmegaPos_reconstructed_jet", HistType::kTH2F, {multBinning, ptAxis}); + registryMC.add("OmegaPos_reconstructed_ue", "OmegaPos_reconstructed_ue", HistType::kTH2F, {multBinning, ptAxis}); + registryMC.add("OmegaNeg_reconstructed_jet", "OmegaNeg_reconstructed_jet", HistType::kTH2F, {multBinning, ptAxis}); + registryMC.add("OmegaNeg_reconstructed_ue", "OmegaNeg_reconstructed_ue", HistType::kTH2F, {multBinning, ptAxis}); // Histograms for secondary hadrons registryMC.add("K0s_reconstructed_incl", "K0s_reconstructed_incl", HistType::kTH2F, {multBinning, ptAxis}); registryMC.add("Lambda_reconstructed_incl", "Lambda_reconstructed_incl", HistType::kTH2F, {multBinning, ptAxis}); registryMC.add("AntiLambda_reconstructed_incl", "AntiLambda_reconstructed_incl", HistType::kTH2F, {multBinning, ptAxis}); + registryMC.add("XiPos_reconstructed_incl", "XiPos_reconstructed_incl", HistType::kTH2F, {multBinning, ptAxis}); + registryMC.add("XiNeg_reconstructed_incl", "XiNeg_reconstructed_incl", HistType::kTH2F, {multBinning, ptAxis}); + registryMC.add("OmegaPos_reconstructed_incl", "OmegaPos_reconstructed_incl", HistType::kTH2F, {multBinning, ptAxis}); + registryMC.add("OmegaNeg_reconstructed_incl", "OmegaNeg_reconstructed_incl", HistType::kTH2F, {multBinning, ptAxis}); + // Histograms for secondary lambda in jet and UE - registryMC.add("Secondary_Lambda_InJet", "Secondary_Lambda_InJet", HistType::kTH1F, {ptAxis}); - registryMC.add("Secondary_Lambda_InUe", "Secondary_Lambda_InUe", HistType::kTH1F, {ptAxis}); - registryMC.add("Secondary_AntiLambda_InJet", "Secondary_AntiLambda_InJet", HistType::kTH1F, {ptAxis}); - registryMC.add("Secondary_AntiLambda_InUe", "Secondary_AntiLambda_InUe", HistType::kTH1F, {ptAxis}); + // registryMC.add("Secondary_Lambda_InJet", "Secondary_Lambda_InJet", HistType::kTH1F, {ptAxis}); + // registryMC.add("Secondary_Lambda_Ue", "Secondary_Lambda_Ue", HistType::kTH1F, {ptAxis}); + // registryMC.add("Secondary_AntiLambda_InJet", "Secondary_AntiLambda_InJet", HistType::kTH1F, {ptAxis}); + // registryMC.add("Secondary_AntiLambda_Ue", "Secondary_AntiLambda_Ue", HistType::kTH1F, {ptAxis}); // Histograms for 2d reweighting (pion) registryMC.add("mc_pi_plus_eta_pt/jet", "", HistType::kTH2F, {ptAxisPi, etaAxis}); @@ -399,20 +424,20 @@ struct StrangenessInJets { registryMC.add("AntiLambda_eta_pt_pythia", "AntiLambda_eta_pt_pythia", HistType::kTH2F, {ptAxis, etaAxis}); // Histograms for 2d reweighting (Xi) - registryMC.add("Xi_eta_pt_jet", "Xi_eta_pt_jet", HistType::kTH2F, {ptAxis, etaAxis}); - registryMC.add("Xi_eta_pt_ue", "Xi_eta_pt_ue", HistType::kTH2F, {ptAxis, etaAxis}); - registryMC.add("Xi_eta_pt_pythia", "Xi_eta_pt_pythia", HistType::kTH2F, {ptAxis, etaAxis}); - registryMC.add("AntiXi_eta_pt_jet", "AntiXi_eta_pt_jet", HistType::kTH2F, {ptAxis, etaAxis}); - registryMC.add("AntiXi_eta_pt_ue", "AntiXi_eta_pt_ue", HistType::kTH2F, {ptAxis, etaAxis}); - registryMC.add("AntiXi_eta_pt_pythia", "AntiXi_eta_pt_pythia", HistType::kTH2F, {ptAxis, etaAxis}); + registryMC.add("XiNeg_eta_pt_jet", "Xi_eta_pt_jet", HistType::kTH2F, {ptAxis, etaAxis}); + registryMC.add("XiNeg_eta_pt_ue", "Xi_eta_pt_ue", HistType::kTH2F, {ptAxis, etaAxis}); + registryMC.add("XiNeg_eta_pt_pythia", "Xi_eta_pt_pythia", HistType::kTH2F, {ptAxis, etaAxis}); + registryMC.add("XiPos_eta_pt_jet", "AntiXi_eta_pt_jet", HistType::kTH2F, {ptAxis, etaAxis}); + registryMC.add("XiPos_eta_pt_ue", "AntiXi_eta_pt_ue", HistType::kTH2F, {ptAxis, etaAxis}); + registryMC.add("XiPos_eta_pt_pythia", "AntiXi_eta_pt_pythia", HistType::kTH2F, {ptAxis, etaAxis}); // Histograms for 2d reweighting (Omega) - registryMC.add("Omega_eta_pt_jet", "Omega_eta_pt_jet", HistType::kTH2F, {ptAxis, etaAxis}); - registryMC.add("Omega_eta_pt_ue", "Omega_eta_pt_ue", HistType::kTH2F, {ptAxis, etaAxis}); - registryMC.add("Omega_eta_pt_pythia", "Omega_eta_pt_pythia", HistType::kTH2F, {ptAxis, etaAxis}); - registryMC.add("AntiOmega_eta_pt_jet", "AntiOmega_eta_pt_jet", HistType::kTH2F, {ptAxis, etaAxis}); - registryMC.add("AntiOmega_eta_pt_ue", "AntiOmega_eta_pt_ue", HistType::kTH2F, {ptAxis, etaAxis}); - registryMC.add("AntiOmega_eta_pt_pythia", "AntiOmega_eta_pt_pythia", HistType::kTH2F, {ptAxis, etaAxis}); + registryMC.add("OmegaNeg_eta_pt_jet", "Omega_eta_pt_jet", HistType::kTH2F, {ptAxis, etaAxis}); + registryMC.add("OmegaNeg_eta_pt_ue", "Omega_eta_pt_ue", HistType::kTH2F, {ptAxis, etaAxis}); + registryMC.add("OmegaNeg_eta_pt_pythia", "Omega_eta_pt_pythia", HistType::kTH2F, {ptAxis, etaAxis}); + registryMC.add("OmegaPos_eta_pt_jet", "AntiOmega_eta_pt_jet", HistType::kTH2F, {ptAxis, etaAxis}); + registryMC.add("OmegaPos_eta_pt_ue", "AntiOmega_eta_pt_ue", HistType::kTH2F, {ptAxis, etaAxis}); + registryMC.add("OmegaPos_eta_pt_pythia", "AntiOmega_eta_pt_pythia", HistType::kTH2F, {ptAxis, etaAxis}); // Histograms for efficiency (pions) registryMC.add("mc_pi_plus/in_jet/gen", "", HistType::kTH2F, {multBinning, ptAxisPi}); @@ -1017,25 +1042,17 @@ struct StrangenessInJets { get2DWeightHisto(histoNameWeightAntilambdaJet, twodWeightsAntilambdaJet); get2DWeightHisto(histoNameWeightAntilambdaUe, twodWeightsAntilambdaUe); - auto get1DWeightHisto = [&](Configurable name, TH1F*& histo) { - LOG(info) << "Looking for 1D weight histogram '" << name.value << "' for " << name.name; - if (name.value == "") { - LOG(info) << " -> Skipping"; - return; - } - histo = static_cast(l->FindObject(name.value.c_str())); - if (!histo) { - LOG(error) << "Could not open histogram '" << name.value << "'"; - return; - } - LOG(info) << "Opened histogram " << histo->ClassName() << " " << histo->GetName(); - }; - - // Secondary Lambda - get1DWeightHisto(histoNameWeightsXiInJet, weightsXiInJet); - get1DWeightHisto(histoNameWeightsXiInUe, weightsXiInUe); - get1DWeightHisto(histoNameWeightsAntiXiInJet, weightsAntiXiInJet); - get1DWeightHisto(histoNameWeightsAntiXiInUe, weightsAntiXiInUe); + // Xi + get2DWeightHisto(histoNameWeightsXiInJet, twodWeightsXiInJet); + get2DWeightHisto(histoNameWeightsXiUe, twodWeightsXiUe); + get2DWeightHisto(histoNameWeightsAntiXiInJet, twodWeightsAntiXiInJet); + get2DWeightHisto(histoNameWeightsAntiXiUe, twodWeightsAntiXiUe); + + // Omega + get2DWeightHisto(histoNameWeightsOmegaInJet, twodWeightsOmegaInJet); + get2DWeightHisto(histoNameWeightsOmegaUe, twodWeightsOmegaUe); + get2DWeightHisto(histoNameWeightsAntiOmegaInJet, twodWeightsAntiOmegaInJet); + get2DWeightHisto(histoNameWeightsAntiOmegaUe, twodWeightsAntiOmegaUe); } void processData(SelCollisions::iterator const& collision, @@ -1271,22 +1288,22 @@ struct StrangenessInJets { } bool isInJet = false; - bool isInUe = false; + bool isUe = false; if (deltaRjet < rJet) isInJet = true; if (deltaRue1 < rJet || deltaRue2 < rJet) - isInUe = true; + isUe = true; if (isHighPurityPion(track, nsigmaTPC, nsigmaTOF)) { if (track.sign() > 0) { if (isInJet) registryData.fill(HIST("piplus_dcaxy_in_jet"), multiplicity, track.pt(), track.dcaXY()); - if (isInUe) + if (isUe) registryData.fill(HIST("piplus_dcaxy_in_ue"), multiplicity, track.pt(), track.dcaXY()); } else { if (isInJet) registryData.fill(HIST("piminus_dcaxy_in_jet"), multiplicity, track.pt(), track.dcaXY()); - if (isInUe) + if (isUe) registryData.fill(HIST("piminus_dcaxy_in_ue"), multiplicity, track.pt(), track.dcaXY()); } } @@ -1301,7 +1318,7 @@ struct StrangenessInJets { if (isInJet) { registryData.fill(HIST("piplus_tpc_in_jet"), multiplicity, track.pt(), nsigmaTPC); } - if (isInUe) { + if (isUe) { registryData.fill(HIST("piplus_tpc_in_ue"), multiplicity, track.pt(), nsigmaTPC); } break; @@ -1309,7 +1326,7 @@ struct StrangenessInJets { if (isInJet) { registryData.fill(HIST("piminus_tpc_in_jet"), multiplicity, track.pt(), nsigmaTPC); } - if (isInUe) { + if (isUe) { registryData.fill(HIST("piminus_tpc_in_ue"), multiplicity, track.pt(), nsigmaTPC); } break; @@ -1327,7 +1344,7 @@ struct StrangenessInJets { if (isInJet) { registryData.fill(HIST("piplus_tof_in_jet"), multiplicity, track.pt(), nsigmaTOF); } - if (isInUe) { + if (isUe) { registryData.fill(HIST("piplus_tof_in_ue"), multiplicity, track.pt(), nsigmaTOF); } break; @@ -1335,7 +1352,7 @@ struct StrangenessInJets { if (isInJet) { registryData.fill(HIST("piminus_tof_in_jet"), multiplicity, track.pt(), nsigmaTOF); } - if (isInUe) { + if (isUe) { registryData.fill(HIST("piminus_tof_in_ue"), multiplicity, track.pt(), nsigmaTOF); } break; @@ -1504,66 +1521,66 @@ struct StrangenessInJets { TVector3 momentumV0 = momentumPos + momentumNeg; // Feed-down for lambda - if (passedLambdaSelection(v0, pos, neg) && pdgParent == kLambda0) { - if (!isPhysPrim) { - double wSecLambdaInJet(1.0); - double wSecLambdaInUe(1.0); - int idMother = posParticle.mothersIds()[0]; - const auto& mother = mcParticles.iteratorAt(idMother); - int idGrandMother = mother.mothersIds()[0]; - const auto& grandMother = mcParticles.iteratorAt(idGrandMother); - switch (grandMother.pdgCode()) { - case kXiMinus: - case kXiPlusBar: - // case 3322: - // case -3322: - if (weightsXiInJet) { - int ibinXiInJet = weightsXiInJet->GetXaxis()->FindBin(grandMother.pt()); - wSecLambdaInJet = weightsXiInJet->GetBinContent(ibinXiInJet); - } - if (weightsXiInUe) { - int ibinXiInUe = weightsXiInUe->GetXaxis()->FindBin(grandMother.pt()); - wSecLambdaInUe = weightsXiInUe->GetBinContent(ibinXiInUe); - } - break; - default: - break; - } - registryMC.fill(HIST("Secondary_Lambda_InJet"), v0.pt(), wSecLambdaInJet); - registryMC.fill(HIST("Secondary_Lambda_InUe"), v0.pt(), wSecLambdaInUe); - } - } + // if (passedLambdaSelection(v0, pos, neg) && pdgParent == kLambda0) { + // if (!isPhysPrim) { + // double wSecLambdaInJet(1.0); + // double wSecLambdaUe(1.0); + // int idMother = posParticle.mothersIds()[0]; + // const auto& mother = mcParticles.iteratorAt(idMother); + // int idGrandMother = mother.mothersIds()[0]; + // const auto& grandMother = mcParticles.iteratorAt(idGrandMother); + // switch (grandMother.pdgCode()) { + // case kXiMinus: + // case kXiPlusBar: + // // case 3322: + // // case -3322: + // if (weightsXiInJet) { + // int ibinXiInJet = weightsXiInJet->GetXaxis()->FindBin(grandMother.pt()); + // wSecLambdaInJet = weightsXiInJet->GetBinContent(ibinXiInJet); + // } + // if (weightsXiUe) { + // int ibinXiUe = weightsXiUe->GetXaxis()->FindBin(grandMother.pt()); + // wSecLambdaUe = weightsXiUe->GetBinContent(ibinXiUe); + // } + // break; + // default: + // break; + // } + // registryMC.fill(HIST("Secondary_Lambda_InJet"), v0.pt(), wSecLambdaInJet); + // registryMC.fill(HIST("Secondary_Lambda_Ue"), v0.pt(), wSecLambdaUe); + // } + //} // Feed-down for antilambda - if (passedAntiLambdaSelection(v0, pos, neg) && pdgParent == kLambda0Bar) { - if (!isPhysPrim) { - double wSecAntiLambdaInJet(1.0); - double wSecAntiLambdaInUe(1.0); - int idMother = posParticle.mothersIds()[0]; - const auto& mother = mcParticles.iteratorAt(idMother); - int idGrandMother = mother.mothersIds()[0]; - const auto& grandMother = mcParticles.iteratorAt(idGrandMother); - switch (grandMother.pdgCode()) { - case kXiMinus: - case kXiPlusBar: - // case 3322: - // case -3322: - if (weightsAntiXiInJet) { - int ibinAntiXiInJet = weightsAntiXiInJet->GetXaxis()->FindBin(grandMother.pt()); - wSecAntiLambdaInJet = weightsAntiXiInJet->GetBinContent(ibinAntiXiInJet); - } - if (weightsAntiXiInUe) { - int ibinAntiXiInUe = weightsAntiXiInUe->GetXaxis()->FindBin(grandMother.pt()); - wSecAntiLambdaInUe = weightsAntiXiInUe->GetBinContent(ibinAntiXiInUe); - } - break; - default: - break; - } - registryMC.fill(HIST("Secondary_AntiLambda_InJet"), v0.pt(), wSecAntiLambdaInJet); - registryMC.fill(HIST("Secondary_AntiLambda_InUe"), v0.pt(), wSecAntiLambdaInUe); - } - } + // if (passedAntiLambdaSelection(v0, pos, neg) && pdgParent == kLambda0Bar) { + // if (!isPhysPrim) { + // double wSecAntiLambdaInJet(1.0); + // double wSecAntiLambdaUe(1.0); + // int idMother = posParticle.mothersIds()[0]; + // const auto& mother = mcParticles.iteratorAt(idMother); + // int idGrandMother = mother.mothersIds()[0]; + // const auto& grandMother = mcParticles.iteratorAt(idGrandMother); + // switch (grandMother.pdgCode()) { + // case kXiMinus: + // case kXiPlusBar: + // // case 3322: + // // case -3322: + // if (weightsAntiXiInJet) { + // int ibinAntiXiInJet = weightsAntiXiInJet->GetXaxis()->FindBin(grandMother.pt()); + // wSecAntiLambdaInJet = weightsAntiXiInJet->GetBinContent(ibinAntiXiInJet); + // } + // if (weightsAntiXiUe) { + // int ibinAntiXiUe = weightsAntiXiUe->GetXaxis()->FindBin(grandMother.pt()); + // wSecAntiLambdaUe = weightsAntiXiUe->GetBinContent(ibinAntiXiUe); + // } + // break; + // default: + // break; + // } + // registryMC.fill(HIST("Secondary_AntiLambda_InJet"), v0.pt(), wSecAntiLambdaInJet); + // registryMC.fill(HIST("Secondary_AntiLambda_Ue"), v0.pt(), wSecAntiLambdaUe); + // } + //} if (passedK0ShortSelection(v0, pos, neg) && pdgParent == kK0Short) { registryMC.fill(HIST("K0s_reconstructed_incl"), multiplicity, v0.pt()); @@ -1645,6 +1662,7 @@ struct StrangenessInJets { continue; int pdgParent(0); + bool isPhysPrim = false; for (const auto& particleMotherOfNeg : negParticle.mothers_as()) { for (const auto& particleMotherOfPos : posParticle.mothers_as()) { for (const auto& particleMotherOfBach : bachParticle.mothers_as()) { @@ -1656,27 +1674,95 @@ struct StrangenessInJets { continue; pdgParent = particleMotherOfBach.pdgCode(); + isPhysPrim = particleMotherOfBach.isPhysicalPrimary(); } } } if (pdgParent == 0) continue; + // Generated Momentum of casc + TVector3 momentumPos(posParticle.px(), posParticle.py(), posParticle.pz()); + TVector3 momentumNeg(negParticle.px(), negParticle.py(), negParticle.pz()); + TVector3 momentumBach(bachParticle.px(), bachParticle.py(), bachParticle.pz()); + TVector3 momentumV0 = momentumPos + momentumNeg; + TVector3 momentumCasc = momentumV0 + momentumBach; + + // Xi+ + if (passedXiSelection(casc, pos, neg, bach, collision) && pdgParent == kXiPlusBar) { + registryMC.fill(HIST("XiPos_reconstructed_incl"), multiplicity, casc.pt()); + } + // Xi- + if (passedXiSelection(casc, pos, neg, bach, collision) && pdgParent == kXiMinus) { + registryMC.fill(HIST("XiNeg_reconstructed_incl"), multiplicity, casc.pt()); + } + // Omega+ + if (passedOmegaSelection(casc, pos, neg, bach, collision) && pdgParent == kOmegaPlusBar) { + registryMC.fill(HIST("OmegaPos_reconstructed_incl"), multiplicity, casc.pt()); + } + // Omega- + if (passedOmegaSelection(casc, pos, neg, bach, collision) && pdgParent == kOmegaMinus) { + registryMC.fill(HIST("OmegaNeg_reconstructed_incl"), multiplicity, casc.pt()); + } + + if (!isPhysPrim) + continue; + + double wXiPosJet(1.0), wXiPosUe(1.0), wXiNegJet(1.0), wXiNegUe(1.0), wOmegaPosJet(1.0), wOmegaPosUe(1.0), wOmegaNegJet(1.0), wOmegaNegUe(1.0); + if (applyReweighting) { + int ix = twodWeightsXiInJet->GetXaxis()->FindBin(momentumCasc.Pt()); + int iy = twodWeightsXiInJet->GetYaxis()->FindBin(momentumCasc.Eta()); + wXiPosJet = twodWeightsAntiXiInJet->GetBinContent(ix, iy); + wXiPosUe = twodWeightsAntiXiUe->GetBinContent(ix, iy); + wXiNegJet = twodWeightsXiInJet->GetBinContent(ix, iy); + wXiNegUe = twodWeightsXiUe->GetBinContent(ix, iy); + wOmegaPosJet = twodWeightsAntiOmegaInJet->GetBinContent(ix, iy); + wOmegaPosUe = twodWeightsAntiOmegaUe->GetBinContent(ix, iy); + wOmegaNegJet = twodWeightsOmegaInJet->GetBinContent(ix, iy); + wOmegaNegUe = twodWeightsOmegaUe->GetBinContent(ix, iy); + + // protections + if (ix == 0 || ix > twodWeightsXiInJet->GetNbinsX()) { + wXiPosJet = 1.0; + wXiPosUe = 1.0; + wXiNegJet = 1.0; + wXiNegUe = 1.0; + wOmegaPosJet = 1.0; + wOmegaPosUe = 1.0; + wOmegaNegJet = 1.0; + wOmegaNegUe = 1.0; + } + if (iy == 0 || iy > twodWeightsXiInJet->GetNbinsY()) { + wXiPosJet = 1.0; + wXiPosUe = 1.0; + wXiNegJet = 1.0; + wXiNegUe = 1.0; + wOmegaPosJet = 1.0; + wOmegaPosUe = 1.0; + wOmegaNegJet = 1.0; + wOmegaNegUe = 1.0; + } + } + // Xi+ if (passedXiSelection(casc, pos, neg, bach, collision) && pdgParent == kXiPlusBar) { - registryMC.fill(HIST("XiPos_reconstructed"), multiplicity, casc.pt()); + registryMC.fill(HIST("XiPos_reconstructed_jet"), multiplicity, casc.pt(), wXiPosJet); + registryMC.fill(HIST("XiPos_reconstructed_ue"), multiplicity, casc.pt(), wXiPosUe); } // Xi- if (passedXiSelection(casc, pos, neg, bach, collision) && pdgParent == kXiMinus) { - registryMC.fill(HIST("XiNeg_reconstructed"), multiplicity, casc.pt()); + registryMC.fill(HIST("XiNeg_reconstructed_jet"), multiplicity, casc.pt(), wXiNegJet); + registryMC.fill(HIST("XiNeg_reconstructed_ue"), multiplicity, casc.pt(), wXiNegUe); } // Omega+ if (passedOmegaSelection(casc, pos, neg, bach, collision) && pdgParent == kOmegaPlusBar) { - registryMC.fill(HIST("OmegaPos_reconstructed"), multiplicity, casc.pt()); + registryMC.fill(HIST("OmegaPos_reconstructed_jet"), multiplicity, casc.pt(), wOmegaPosJet); + registryMC.fill(HIST("OmegaPos_reconstructed_ue"), multiplicity, casc.pt(), wOmegaPosUe); } // Omega- if (passedOmegaSelection(casc, pos, neg, bach, collision) && pdgParent == kOmegaMinus) { - registryMC.fill(HIST("OmegaNeg_reconstructed"), multiplicity, casc.pt()); + registryMC.fill(HIST("OmegaNeg_reconstructed_jet"), multiplicity, casc.pt(), wOmegaNegJet); + registryMC.fill(HIST("OmegaNeg_reconstructed_ue"), multiplicity, casc.pt(), wOmegaNegUe); } } @@ -1854,6 +1940,42 @@ struct StrangenessInJets { } } + double wXiPosJet(1.0), wXiPosUe(1.0), wXiNegJet(1.0), wXiNegUe(1.0), wOmegaPosJet(1.0), wOmegaPosUe(1.0), wOmegaNegJet(1.0), wOmegaNegUe(1.0); + if (applyReweighting) { + int ix = twodWeightsXiInJet->GetXaxis()->FindBin(mcParticle.pt()); + int iy = twodWeightsXiInJet->GetYaxis()->FindBin(mcParticle.eta()); + wXiPosJet = twodWeightsAntiXiInJet->GetBinContent(ix, iy); + wXiPosUe = twodWeightsAntiXiUe->GetBinContent(ix, iy); + wXiNegJet = twodWeightsXiInJet->GetBinContent(ix, iy); + wXiNegUe = twodWeightsXiUe->GetBinContent(ix, iy); + wOmegaPosJet = twodWeightsAntiOmegaInJet->GetBinContent(ix, iy); + wOmegaPosUe = twodWeightsAntiOmegaUe->GetBinContent(ix, iy); + wOmegaNegJet = twodWeightsOmegaInJet->GetBinContent(ix, iy); + wOmegaNegUe = twodWeightsOmegaUe->GetBinContent(ix, iy); + + // protections + if (ix == 0 || ix > twodWeightsXiInJet->GetNbinsX()) { + wXiPosJet = 1.0; + wXiPosUe = 1.0; + wXiNegJet = 1.0; + wXiNegUe = 1.0; + wOmegaPosJet = 1.0; + wOmegaPosUe = 1.0; + wOmegaNegJet = 1.0; + wOmegaNegUe = 1.0; + } + if (iy == 0 || iy > twodWeightsXiInJet->GetNbinsY()) { + wXiPosJet = 1.0; + wXiPosUe = 1.0; + wXiNegJet = 1.0; + wXiNegUe = 1.0; + wOmegaPosJet = 1.0; + wOmegaPosUe = 1.0; + wOmegaNegJet = 1.0; + wOmegaNegUe = 1.0; + } + } + switch (mcParticle.pdgCode()) { /* case kPiPlus: // Pi+ @@ -1903,20 +2025,24 @@ struct StrangenessInJets { registryMC.fill(HIST("AntiLambda_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); break; case kXiPlusBar: // Xi Pos - registryMC.fill(HIST("XiPos_generated"), multiplicity, mcParticle.pt()); + registryMC.fill(HIST("XiPos_generated_jet"), multiplicity, mcParticle.pt(), wXiPosJet); + registryMC.fill(HIST("XiPos_generated_ue"), multiplicity, mcParticle.pt(), wXiPosUe); registryMC.fill(HIST("Xi_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); break; case kXiMinus: // Xi Neg - registryMC.fill(HIST("XiNeg_generated"), multiplicity, mcParticle.pt()); - registryMC.fill(HIST("AntiXi_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); + registryMC.fill(HIST("XiNeg_generated_jet"), multiplicity, mcParticle.pt(), wXiNegJet); + registryMC.fill(HIST("XiNeg_generated_ue"), multiplicity, mcParticle.pt(), wXiNegUe); + registryMC.fill(HIST("XiNeg_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); break; case kOmegaPlusBar: // Omega Pos - registryMC.fill(HIST("OmegaPos_generated"), multiplicity, mcParticle.pt()); - registryMC.fill(HIST("Omega_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); + registryMC.fill(HIST("OmegaPos_generated_jet"), multiplicity, mcParticle.pt(), wOmegaPosJet); + registryMC.fill(HIST("OmegaPos_generated_ue"), multiplicity, mcParticle.pt(), wOmegaPosUe); + registryMC.fill(HIST("OmegaPos_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); break; case kOmegaMinus: // Omega Neg - registryMC.fill(HIST("OmegaNeg_generated"), multiplicity, mcParticle.pt()); - registryMC.fill(HIST("AntiOmega_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); + registryMC.fill(HIST("OmegaNeg_generated_jet"), multiplicity, mcParticle.pt(), wOmegaNegJet); + registryMC.fill(HIST("OmegaNeg_generated_ue"), multiplicity, mcParticle.pt(), wOmegaNegUe); + registryMC.fill(HIST("OmegaNeg_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); break; } } @@ -2038,16 +2164,16 @@ struct StrangenessInJets { registryMC.fill(HIST("AntiLambda_eta_pt_jet"), particle.pt(), particle.eta()); break; case kXiMinus: - registryMC.fill(HIST("Xi_eta_pt_jet"), particle.pt(), particle.eta()); + registryMC.fill(HIST("XiNeg_eta_pt_jet"), particle.pt(), particle.eta()); break; case kXiPlusBar: - registryMC.fill(HIST("AntiXi_eta_pt_jet"), particle.pt(), particle.eta()); + registryMC.fill(HIST("XiPos_eta_pt_jet"), particle.pt(), particle.eta()); break; case kOmegaMinus: - registryMC.fill(HIST("Omega_eta_pt_jet"), particle.pt(), particle.eta()); + registryMC.fill(HIST("OmegaNeg_eta_pt_jet"), particle.pt(), particle.eta()); break; case kOmegaPlusBar: - registryMC.fill(HIST("AntiOmega_eta_pt_jet"), particle.pt(), particle.eta()); + registryMC.fill(HIST("OmegaPos_eta_pt_jet"), particle.pt(), particle.eta()); break; default: continue; @@ -2074,16 +2200,16 @@ struct StrangenessInJets { registryMC.fill(HIST("AntiLambda_eta_pt_ue"), particle.pt(), particle.eta()); break; case kXiMinus: - registryMC.fill(HIST("Xi_eta_pt_ue"), particle.pt(), particle.eta()); + registryMC.fill(HIST("XiNeg_eta_pt_ue"), particle.pt(), particle.eta()); break; case kXiPlusBar: - registryMC.fill(HIST("AntiXi_eta_pt_ue"), particle.pt(), particle.eta()); + registryMC.fill(HIST("XiPos_eta_pt_ue"), particle.pt(), particle.eta()); break; case kOmegaMinus: - registryMC.fill(HIST("Omega_eta_pt_ue"), particle.pt(), particle.eta()); + registryMC.fill(HIST("OmegaNeg_eta_pt_ue"), particle.pt(), particle.eta()); break; case kOmegaPlusBar: - registryMC.fill(HIST("AntiOmega_eta_pt_ue"), particle.pt(), particle.eta()); + registryMC.fill(HIST("OmegaPos_eta_pt_ue"), particle.pt(), particle.eta()); break; default: continue; From d4811a50fe71465fc6c97d7aebc6bed230aa1e73 Mon Sep 17 00:00:00 2001 From: Javier Castillo Castellanos Date: Thu, 12 Jun 2025 13:31:32 +0200 Subject: [PATCH 1593/1650] [Common] Use MCH track counterpart of global muon (#11542) --- Common/Tasks/qaMuon.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Common/Tasks/qaMuon.cxx b/Common/Tasks/qaMuon.cxx index 1f210249089..7c854935930 100644 --- a/Common/Tasks/qaMuon.cxx +++ b/Common/Tasks/qaMuon.cxx @@ -2399,7 +2399,7 @@ struct muonQa { mch::Track mchrealigned1, mchrealigned2; VarClusters fgValuesCls1, fgValuesCls2; - if (!FillClusters(muonTrack1, clusters, fgValuesCls1, mchrealigned1) || !FillClusters(muonTrack2, clusters, fgValuesCls2, mchrealigned2)) { + if (!FillClusters(mchTrack1, clusters, fgValuesCls1, mchrealigned1) || !FillClusters(mchTrack2, clusters, fgValuesCls2, mchrealigned2)) { continue; // Refit is not valid } From 4d0e62ca4e431a567752afa3509a1dc90270d4c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Thu, 12 Jun 2025 13:47:59 +0200 Subject: [PATCH 1594/1650] [ALICE3] Update FastTracker (#11570) Co-authored-by: ALICE Action Bot --- ALICE3/Core/FastTracker.cxx | 198 ++++++++++++++++-------------------- ALICE3/Core/FastTracker.h | 87 +++++++++------- 2 files changed, 139 insertions(+), 146 deletions(-) diff --git a/ALICE3/Core/FastTracker.cxx b/ALICE3/Core/FastTracker.cxx index 1d06958504b..fe89fcd80fd 100644 --- a/ALICE3/Core/FastTracker.cxx +++ b/ALICE3/Core/FastTracker.cxx @@ -9,13 +9,17 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -#include -#include +#include "FastTracker.h" + +#include "ReconstructionDataFormats/TrackParametrization.h" + #include "TMath.h" #include "TMatrixD.h" -#include "TRandom.h" #include "TMatrixDSymEigen.h" -#include "FastTracker.h" +#include "TRandom.h" + +#include +#include namespace o2 { @@ -24,36 +28,6 @@ namespace fastsim // +-~-<*>-~-+-~-<*>-~-+-~-<*>-~-+-~-<*>-~-+-~-<*>-~-+-~-<*>-~-+-~-<*>-~-+-~-<*>-~-+ -FastTracker::FastTracker() -{ - // base constructor - magneticField = 20; // in kiloGauss - applyZacceptance = false; - applyMSCorrection = true; - applyElossCorrection = true; - applyEffCorrection = true; - covMatFactor = 0.99f; - verboseLevel = 0; - - // last fast-tracked track properties - covMatOK = 0; - covMatNotOK = 0; - nIntercepts = 0; - nSiliconPoints = 0; - nGasPoints = 0; - - maxRadiusSlowDet = 10; - integrationTime = 0.02; // ms - crossSectionMinB = 8; - dNdEtaCent = 2200; - dNdEtaMinB = 1; - avgRapidity = 0.45; - sigmaD = 6.0; - luminosity = 1.e27; - otherBackground = 0.0; // [0, 1] - upcBackgroundMultiplier = 1.0; -} - void FastTracker::AddLayer(TString name, float r, float z, float x0, float xrho, float resRPhi, float resZ, float eff, int type) { DetLayer newLayer(name, r, z, x0, xrho, resRPhi, resZ, eff, type); @@ -61,6 +35,17 @@ void FastTracker::AddLayer(TString name, float r, float z, float x0, float xrho, if (newLayer.getEfficiency() > 0.0f && newLayer.isInert()) { LOG(error) << "Layer " << name << " with efficiency > 0.0 should not be inert"; } + // Layers should be ordered by increasing radius, check this + if (!layers.empty() && newLayer.getRadius() < layers.back().getRadius()) { + LOG(fatal) << "Layer " << newLayer << " is not ordered correctly, it should be after layer " << layers.back(); + } + // Layers should all have different names + for (const auto& layer : layers) { + if (layer.getName() == newLayer.getName()) { + LOG(fatal) << "Layer with name " << newLayer.getName() << " already exists in FastTracker layers"; + } + } + // Add the new layer to the layers vector layers.push_back(newLayer); } @@ -78,7 +63,7 @@ DetLayer FastTracker::GetLayer(int layer, bool ignoreBarrelLayers) const return layers[layerIdx]; } -int FastTracker::GetLayerIndex(std::string name) const +int FastTracker::GetLayerIndex(const std::string& name) const { int i = 0; for (const auto& layer : layers) { @@ -211,9 +196,9 @@ float FastTracker::Dist(float z, float r) // https://github.com/AliceO2Group/DelphesO2/blob/master/src/DetectorK/DetectorK.cxx#L743 int index = 1; int nSteps = 301; - double dist = 0.0; - double dz0 = (4 * sigmaD - (-4) * sigmaD / (nSteps = 1)); - double z0 = 0.0; + float dist = 0.0; + float dz0 = (4 * sigmaD - (-4) * sigmaD / (nSteps = 1)); + float z0 = 0.0; for (int i = 0; i < nSteps; i++) { if (i == nSteps - 1) index = 1; @@ -243,7 +228,7 @@ float FastTracker::IntegratedHitDensity(float multiplicity, float radius) // porting of DetektorK::IntegratedHitDensity // see here: // https://github.com/AliceO2Group/DelphesO2/blob/master/src/DetectorK/DetectorK.cxx#L712 - float zdcHz = luminosity * 1.e24 * crossSectionMinB; + float zdcHz = luminosity * 1.e24 * mCrossSectionMinB; float den = zdcHz * integrationTime / 1000. * multiplicity * Dist(0., radius) / (o2::constants::math::TwoPI * radius); if (den < OneEventHitDensity(multiplicity, radius)) den = OneEventHitDensity(multiplicity, radius); @@ -301,6 +286,7 @@ float FastTracker::ProbGoodChiSqHit(float radius, float searchRadiusRPhi, float // returns number of intercepts (generic for now) int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackParCov& outputTrack, const float nch) { + dNdEtaCent = nch; // set the number of charged particles per unit rapidity hits.clear(); nIntercepts = 0; nSiliconPoints = 0; @@ -310,38 +296,54 @@ int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackPa const float initialRadius = std::hypot(posIni[0], posIni[1]); const float kTrackingMargin = 0.1; const int kMaxNumberOfDetectors = 20; + if (kMaxNumberOfDetectors < layers.size()) { + LOG(fatal) << "Too many layers in FastTracker, increase kMaxNumberOfDetectors"; + return -1; // too many layers + } + int firstActiveLayer = -1; // first layer that is not inert + for (size_t i = 0; i < layers.size(); ++i) { + if (!layers[i].isInert()) { + firstActiveLayer = i; + break; + } + } + if (firstActiveLayer <= 0) { + LOG(fatal) << "No active layers found in FastTracker, check layer setup"; + return -2; // no active layers + } const int xrhosteps = 100; const bool applyAngularCorrection = true; goodHitProbability.clear(); - for (int i = 0; i < kMaxNumberOfDetectors; ++i) + for (int i = 0; i < kMaxNumberOfDetectors; ++i) { goodHitProbability.push_back(-1.); - goodHitProbability[0] = 1.; + } + goodHitProbability[0] = 1.; // we use layer zero to accumulate // +-~-<*>-~-+-~-<*>-~-+-~-<*>-~-+-~-<*>-~-+-~-<*>-~-+ // Outward pass to find intercepts int firstLayerReached = -1; int lastLayerReached = -1; new (&outputTrack)(o2::track::TrackParCov)(inputTrack); - for (uint32_t il = 0; il < layers.size(); il++) { + for (size_t il = 0; il < layers.size(); il++) { // check if layer is doable - if (layers[il].getRadius() < initialRadius) + if (layers[il].getRadius() < initialRadius) { continue; // this layer should not be attempted, but go ahead + } // check if layer is reached float targetX = 1e+3; - bool ok = true; inputTrack.getXatLabR(layers[il].getRadius(), targetX, magneticField); if (targetX > 999.f) { LOGF(debug, "Failed to find intercept for layer %d at radius %.2f cm", il, layers[il].getRadius()); break; // failed to find intercept } - ok = inputTrack.propagateTo(targetX, magneticField); - if (ok && applyMSCorrection && layers[il].getRadiationLength() > 0) { + bool ok = inputTrack.propagateTo(targetX, magneticField); + if (ok && mApplyMSCorrection && layers[il].getRadiationLength() > 0) { ok = inputTrack.correctForMaterial(layers[il].getRadiationLength(), 0, applyAngularCorrection); } - if (ok && applyElossCorrection && layers[il].getDensity() > 0) { // correct in small steps + if (ok && mApplyElossCorrection && layers[il].getDensity() > 0) { // correct in small steps for (int ise = xrhosteps; ise--;) { ok = inputTrack.correctForMaterial(0, -layers[il].getDensity() / xrhosteps, applyAngularCorrection); if (!ok) @@ -361,7 +363,7 @@ int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackPa break; } } - if (std::abs(inputTrack.getZ()) > layers[il].getZ() && applyZacceptance) { + if (std::abs(inputTrack.getZ()) > layers[il].getZ() && mApplyZacceptance) { break; // out of acceptance bounds } @@ -384,39 +386,19 @@ int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackPa o2::track::TrackParCov inwardTrack(inputTrack); // Enlarge covariance matrix - std::array trPars = {0.}; - for (int ip = 0; ip < 5; ip++) { + std::array trPars = {0.}; + for (int ip = 0; ip < o2::track::kNParams; ip++) { trPars[ip] = outputTrack.getParam(ip); } - std::array largeCov = {0.}; - enum { kY, - kZ, - kSnp, - kTgl, - kPtI }; // track parameter aliases - enum { kY2, - kYZ, - kZ2, - kYSnp, - kZSnp, - kSnp2, - kYTgl, - kZTgl, - kSnpTgl, - kTgl2, - kYPtI, - kZPtI, - kSnpPtI, - kTglPtI, - kPtI2 }; // cov.matrix aliases - const double kLargeErr2Coord = 5 * 5; - const double kLargeErr2Dir = 0.7 * 0.7; - const double kLargeErr2PtI = 30.5 * 30.5; - for (int ic = 15; ic--;) + static constexpr float kLargeErr2Coord = 5 * 5; + static constexpr float kLargeErr2Dir = 0.7 * 0.7; + static constexpr float kLargeErr2PtI = 30.5 * 30.5; + std::array largeCov = {0.}; + for (int ic = o2::track::kCovMatSize; ic--;) largeCov[ic] = 0.; - largeCov[kY2] = largeCov[kZ2] = kLargeErr2Coord; - largeCov[kSnp2] = largeCov[kTgl2] = kLargeErr2Dir; - largeCov[kPtI2] = kLargeErr2PtI * trPars[kPtI] * trPars[kPtI]; + largeCov[o2::track::CovLabels::kSigY2] = largeCov[o2::track::CovLabels::kSigZ2] = kLargeErr2Coord; + largeCov[o2::track::CovLabels::kSigSnp2] = largeCov[o2::track::CovLabels::kSigTgl2] = kLargeErr2Dir; + largeCov[o2::track::CovLabels::kSigQ2Pt2] = kLargeErr2PtI * trPars[o2::track::ParLabels::kQ2Pt] * trPars[o2::track::ParLabels::kQ2Pt]; inwardTrack.setCov(largeCov); inwardTrack.checkCovariance(); @@ -434,7 +416,7 @@ int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackPa continue; // failed to propagate } - if (std::abs(inputTrack.getZ()) > layers[il].getZ() && applyZacceptance) { + if (std::abs(inputTrack.getZ()) > layers[il].getZ() && mApplyZacceptance) { continue; // out of acceptance bounds but continue inwards } @@ -444,10 +426,10 @@ int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackPa std::vector thisHit = {spacePoint[0], spacePoint[1], spacePoint[2]}; // towards adding cluster: move to track alpha - double alpha = inwardTrack.getAlpha(); - double xyz1[3]{ - TMath::Cos(alpha) * spacePoint[0] + TMath::Sin(alpha) * spacePoint[1], - -TMath::Sin(alpha) * spacePoint[0] + TMath::Cos(alpha) * spacePoint[1], + float alpha = inwardTrack.getAlpha(); + float xyz1[3]{ + std::cos(alpha) * spacePoint[0] + std::sin(alpha) * spacePoint[1], + -std::sin(alpha) * spacePoint[0] + std::cos(alpha) * spacePoint[1], spacePoint[2]}; if (!inwardTrack.propagateTo(xyz1[0], magneticField)) continue; @@ -462,7 +444,7 @@ int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackPa inwardTrack.checkCovariance(); } - if (applyMSCorrection && layers[il].getRadiationLength() > 0) { + if (mApplyMSCorrection && layers[il].getRadiationLength() > 0) { if (!inputTrack.correctForMaterial(layers[il].getRadiationLength(), 0, applyAngularCorrection)) { return -6; } @@ -470,7 +452,7 @@ int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackPa return -6; } } - if (applyElossCorrection && layers[il].getDensity() > 0) { + if (mApplyElossCorrection && layers[il].getDensity() > 0) { for (int ise = xrhosteps; ise--;) { // correct in small steps if (!inputTrack.correctForMaterial(0, layers[il].getDensity() / xrhosteps, applyAngularCorrection)) { return -7; @@ -488,9 +470,9 @@ int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackPa hits.push_back(thisHit); - if (applyEffCorrection && !layers[il].isInert()) { // good hit probability calculation - double sigYCmb = o2::math_utils::sqrt(inwardTrack.getSigmaY2() + layers[il].getResolutionRPhi() * layers[il].getResolutionRPhi()); - double sigZCmb = o2::math_utils::sqrt(inwardTrack.getSigmaZ2() + layers[il].getResolutionZ() * layers[il].getResolutionZ()); + if (!layers[il].isInert()) { // good hit probability calculation + float sigYCmb = o2::math_utils::sqrt(inwardTrack.getSigmaY2() + layers[il].getResolutionRPhi() * layers[il].getResolutionRPhi()); + float sigZCmb = o2::math_utils::sqrt(inwardTrack.getSigmaZ2() + layers[il].getResolutionZ() * layers[il].getResolutionZ()); goodHitProbability[il] = ProbGoodChiSqHit(layers[il].getRadius() * 100, sigYCmb * 100, sigZCmb * 100); goodHitProbability[0] *= goodHitProbability[il]; } @@ -498,9 +480,11 @@ int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackPa // backpropagate to original radius float finalX = 1e+3; - inwardTrack.getXatLabR(initialRadius, finalX, magneticField); - if (finalX > 999) + bool inPropStatus = inwardTrack.getXatLabR(initialRadius, finalX, magneticField); + if (finalX > 999) { + LOG(debug) << "Failed to find intercept for initial radius " << initialRadius << " cm, x = " << finalX << " and status " << inPropStatus << " and sn = " << inwardTrack.getSnp() << " r = " << inwardTrack.getY() * inwardTrack.getY(); return -3; // failed to find intercept + } if (!inwardTrack.propagateTo(finalX, magneticField)) { return -4; // failed to propagate @@ -511,17 +495,15 @@ int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackPa return nIntercepts; // generate efficiency - if (applyEffCorrection) { - dNdEtaCent = nch; - float eff = 1.; - for (int i = 0; i < kMaxNumberOfDetectors; i++) { - float iGoodHit = goodHitProbability[i]; - if (iGoodHit <= 0) - continue; - - eff *= iGoodHit; - } + float eff = 1.; + for (int i = 0; i < kMaxNumberOfDetectors; i++) { + float iGoodHit = goodHitProbability[i]; + if (iGoodHit <= 0) + continue; + eff *= iGoodHit; + } + if (mApplyEffCorrection) { if (gRandom->Uniform() > eff) return -8; } @@ -530,11 +512,11 @@ int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackPa outputTrack.checkCovariance(); // Use covariance matrix based smearing - std::array covMat = {0.}; - for (int ii = 0; ii < 15; ii++) + std::array covMat = {0.}; + for (int ii = 0; ii < o2::track::kCovMatSize; ii++) covMat[ii] = outputTrack.getCov()[ii]; TMatrixDSym m(5); - double fcovm[5][5]; + float fcovm[5][5]; for (int ii = 0, k = 0; ii < 5; ++ii) { for (int j = 0; j < ii + 1; ++j, ++k) { @@ -544,7 +526,7 @@ int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackPa } // evaluate ruben's conditional, regularise - bool makePositiveDefinite = (covMatFactor > -1e-5); // apply fix + const bool makePositiveDefinite = (covMatFactor > -1e-5); // apply fix bool rubenConditional = false; for (int ii = 0; ii < 5; ii++) { for (int jj = 0; jj < 5; jj++) { @@ -571,7 +553,7 @@ int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackPa } if (negEigVal && rubenConditional && makePositiveDefinite) { - if (verboseLevel > 0) { + if (mVerboseLevel > 0) { LOG(info) << "WARNING: this diagonalization (at pt = " << inputTrack.getPt() << ") has negative eigenvalues despite Ruben's fix! Please be careful!"; LOG(info) << "Printing info:"; LOG(info) << "Kalman updates: " << nIntercepts; @@ -585,9 +567,9 @@ int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackPa covMatOK++; // transform parameter vector and smear - double params_[5]; + float params_[5]; for (int ii = 0; ii < 5; ++ii) { - double val = 0.; + float val = 0.; for (int j = 0; j < 5; ++j) val += eigVec[j][ii] * outputTrack.getParam(j); // smear parameters according to eigenvalues @@ -598,7 +580,7 @@ int FastTracker::FastTrack(o2::track::TrackParCov inputTrack, o2::track::TrackPa eigVec.Invert(); // transform back params vector for (int ii = 0; ii < 5; ++ii) { - double val = 0.; + float val = 0.; for (int j = 0; j < 5; ++j) val += eigVec[j][ii] * params_[j]; outputTrack.setParam(val, ii); diff --git a/ALICE3/Core/FastTracker.h b/ALICE3/Core/FastTracker.h index 702caa9e84b..a0dba5d7ec5 100644 --- a/ALICE3/Core/FastTracker.h +++ b/ALICE3/Core/FastTracker.h @@ -12,12 +12,15 @@ #ifndef ALICE3_CORE_FASTTRACKER_H_ #define ALICE3_CORE_FASTTRACKER_H_ -#include // not a system header but megalinter thinks so -#include -#include #include "DetLayer.h" + #include "ReconstructionDataFormats/Track.h" +#include // not a system header but megalinter thinks so + +#include +#include + namespace o2 { namespace fastsim @@ -32,13 +35,16 @@ class FastTracker { public: // Constructor/destructor - FastTracker(); + FastTracker() = default; + // Destructor virtual ~FastTracker() {} // Layer and layer configuration void AddLayer(TString name, float r, float z, float x0, float xrho, float resRPhi = 0.0f, float resZ = 0.0f, float eff = 0.0f, int type = 0); DetLayer GetLayer(const int layer, bool ignoreBarrelLayers = true) const; - int GetLayerIndex(const std::string name) const; + int GetLayerIndex(const std::string& name) const; + size_t GetNLayers() const { return layers.size(); } + bool IsLayerInert(const int layer) const { return layers[layer].isInert(); } void SetRadiationLength(const std::string layerName, float x0) { layers[GetLayerIndex(layerName)].setRadiationLength(x0); } void SetRadius(const std::string layerName, float r) { layers[GetLayerIndex(layerName)].setRadius(r); } void SetResolutionRPhi(const std::string layerName, float resRPhi) { layers[GetLayerIndex(layerName)].setResolutionRPhi(resRPhi); } @@ -80,20 +86,24 @@ class FastTracker void SetIntegrationTime(float t) { integrationTime = t; } void SetMaxRadiusOfSlowDetectors(float r) { maxRadiusSlowDet = r; } void SetAvgRapidity(float y) { avgRapidity = y; } - void SetdNdEtaCent(float d) { dNdEtaCent = d; } + void SetdNdEtaCent(int d) { dNdEtaCent = d; } void SetLhcUPCscale(float s) { lhcUPCScale = s; } void SetBField(float b) { magneticField = b; } void SetMinRadTrack(float r) { fMinRadTrack = r; } void SetMagneticField(float b) { magneticField = b; } - void SetApplyZacceptance(bool b) { applyZacceptance = b; } - void SetApplyMSCorrection(bool b) { applyMSCorrection = b; } - void SetApplyElossCorrection(bool b) { applyElossCorrection = b; } + void SetApplyZacceptance(bool b) { mApplyZacceptance = b; } + void SetApplyMSCorrection(bool b) { mApplyMSCorrection = b; } + void SetApplyElossCorrection(bool b) { mApplyElossCorrection = b; } + void SetApplyEffCorrection(bool b) { mApplyEffCorrection = b; } // Getters for the last track int GetNIntercepts() const { return nIntercepts; } int GetNSiliconPoints() const { return nSiliconPoints; } int GetNGasPoints() const { return nGasPoints; } - float GetGoodHitProb(int layer) const { return goodHitProbability[layer]; } + float GetGoodHitProb(int layer) const + { + return (layer >= 0 && static_cast(layer) < goodHitProbability.size()) ? goodHitProbability[layer] : 0.0f; + } std::size_t GetNHits() const { return hits.size(); } float GetHitX(const int i) const { return hits[i][0]; } float GetHitY(const int i) const { return hits[i][1]; } @@ -106,34 +116,35 @@ class FastTracker std::vector layers; std::vector> hits; // bookkeep last added hits - // operational - bool applyZacceptance; // check z acceptance or not - bool applyMSCorrection; // Apply correction for multiple scattering - bool applyElossCorrection; // Apply correction for eloss (requires MS correction) - bool applyEffCorrection; // Apply correction for hit efficiency - int verboseLevel; // 0: not verbose, >0 more verbose - int crossSectionMinB; - int dNdEtaCent; - int dNdEtaMinB; - float integrationTime; - float magneticField; // in kiloGauss (5 = 0.5T, etc) - float covMatFactor; // covmat off-diagonal factor to use for covmat fix (negative: no factor) - float sigmaD; - float luminosity; - float otherBackground; - float maxRadiusSlowDet; - float avgRapidity; - float lhcUPCScale; - float upcBackgroundMultiplier; - float fMinRadTrack = 132.; - - uint64_t covMatOK; // cov mat has negative eigenvals - uint64_t covMatNotOK; // cov mat has negative eigenvals - - // last track information - int nIntercepts; // found in first outward propagation - int nSiliconPoints; // silicon-based space points added to track - int nGasPoints; // tpc-based space points added to track + /// configuration parameters + bool mApplyZacceptance = false; /// check z acceptance or not + bool mApplyMSCorrection = true; /// Apply correction for multiple scattering + bool mApplyElossCorrection = true; /// Apply correction for eloss (requires MS correction) + bool mApplyEffCorrection = true; /// Apply correction for hit efficiency + int mVerboseLevel = 0; /// 0: not verbose, >0 more verbose + const float mCrossSectionMinB = 8; /// Minimum bias Cross section for event under study (PbPb MinBias ~ 8 Barns) + int dNdEtaCent = 2200; /// dN/deta e.g. at centrality 0-5% (for 5 TeV PbPb) + int dNdEtaMinB = 1; /// dN/deta for minimum bias events + float integrationTime = 0.02f; /// Integration time in ms + float magneticField = 20.f; /// Magnetic field in kiloGauss (5 = 0.5T, 20 = 2T, etc) + float covMatFactor = 0.99f; /// covmat off-diagonal factor to use for covmat fix (negative: no factor) + float sigmaD = 6.0f; /// sigma for the detector resolution in cm + float luminosity = 1.e27f; /// luminosity in cm^-2 s^-1 (e.g. 1.e27 for PbPb at 5 TeV) + float otherBackground = 0.0f; /// background from other sources, e.g. pileup, in [0, 1] + float maxRadiusSlowDet = 10.f; /// maximum radius of slow detectors in cm + float avgRapidity = 0.45f; /// average rapidity for hit density calculation + float lhcUPCScale = 1.0f; /// scale factor for LHC UPC events + float upcBackgroundMultiplier = 1.0f; /// multiplier for UPC background + float fMinRadTrack = 132.f; /// minimum radius for track propagation in cm + + /// counters for covariance matrix statuses + uint64_t covMatOK = 0; /// cov mat has positive eigenvals + uint64_t covMatNotOK = 0; /// cov mat has negative eigenvals + + /// last track information + int nIntercepts = 0; /// found in first outward propagation + int nSiliconPoints = 0; /// silicon-based space points added to track + int nGasPoints = 0; /// tpc-based space points added to track std::vector goodHitProbability; ClassDef(FastTracker, 1); From b4dcf3820795b1c3a459ab0b585f53fe6513540c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Thu, 12 Jun 2025 14:32:16 +0200 Subject: [PATCH 1595/1650] [Common] Include What You Use (#11547) --- Common/Core/fwdtrackUtilities.h | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Common/Core/fwdtrackUtilities.h b/Common/Core/fwdtrackUtilities.h index 13fb27c5862..74fe125c2f0 100644 --- a/Common/Core/fwdtrackUtilities.h +++ b/Common/Core/fwdtrackUtilities.h @@ -18,10 +18,18 @@ #ifndef COMMON_CORE_FWDTRACKUTILITIES_H_ #define COMMON_CORE_FWDTRACKUTILITIES_H_ +#include +#include +#include +#include +#include +#include + +#include +#include +#include + #include -#include -#include "Math/SMatrix.h" -#include "TGeoGlobalMagField.h" namespace o2::aod { From 4ac72416197f0ba93dcd9b902b871741f3a288c2 Mon Sep 17 00:00:00 2001 From: marcobianchi463 <121625445+marcobianchi463@users.noreply.github.com> Date: Thu, 12 Jun 2025 16:13:33 +0200 Subject: [PATCH 1596/1650] [PWGLF] Harmonics configurable and amplitude definition (#11555) --- PWGLF/TableProducer/Nuspex/nucleiFlowTree.cxx | 10 ++--- PWGLF/TableProducer/QC/flowQC.cxx | 42 ++++++++++--------- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/nucleiFlowTree.cxx b/PWGLF/TableProducer/Nuspex/nucleiFlowTree.cxx index 6c15c2a626c..14192166fae 100644 --- a/PWGLF/TableProducer/Nuspex/nucleiFlowTree.cxx +++ b/PWGLF/TableProducer/Nuspex/nucleiFlowTree.cxx @@ -428,11 +428,11 @@ struct nucleiFlowTree { computeEventPlane(collision.qvecTPCallImVec()[cfgHarmonics - 2], collision.qvecTPCallReVec()[cfgHarmonics - 2]), computeEventPlane(collision.qvecTPCnegImVec()[cfgHarmonics - 2], collision.qvecTPCnegReVec()[cfgHarmonics - 2]), computeEventPlane(collision.qvecTPCposImVec()[cfgHarmonics - 2], collision.qvecTPCposReVec()[cfgHarmonics - 2]), - collision.sumAmplFT0A(), - collision.sumAmplFT0C(), - static_cast(collision.nTrkTPCall()), - static_cast(collision.nTrkTPCneg()), - static_cast(collision.nTrkTPCpos())}); + std::hypot(collision.qvecFT0AImVec()[cfgHarmonics - 2], collision.qvecFT0AReVec()[cfgHarmonics - 2]), + std::hypot(collision.qvecFT0CImVec()[cfgHarmonics - 2], collision.qvecFT0CReVec()[cfgHarmonics - 2]), + std::hypot(collision.qvecTPCallImVec()[cfgHarmonics - 2], collision.qvecTPCallReVec()[cfgHarmonics - 2]), + std::hypot(collision.qvecTPCnegImVec()[cfgHarmonics - 2], collision.qvecTPCnegReVec()[cfgHarmonics - 2]), + std::hypot(collision.qvecTPCposImVec()[cfgHarmonics - 2], collision.qvecTPCposReVec()[cfgHarmonics - 2])}); } if (flag & kTriton) { if (track.pt() < cfgCutPtMinTree || track.pt() > cfgCutPtMaxTree || track.sign() > 0) diff --git a/PWGLF/TableProducer/QC/flowQC.cxx b/PWGLF/TableProducer/QC/flowQC.cxx index f5dfa06f9d7..1e32b954120 100644 --- a/PWGLF/TableProducer/QC/flowQC.cxx +++ b/PWGLF/TableProducer/QC/flowQC.cxx @@ -111,9 +111,11 @@ struct flowQC { int mRunNumber = 0; float mBz = 0.f; + Configurable cfgHarmonics{"cfgHarmonics", 2, "Harmonics for flow analysis"}; + // Flow analysis using CollWithEPandQvec = soa::Join::iterator; + aod::EvSels, aod::CentFT0As, aod::CentFT0Cs, aod::CentFT0Ms, aod::CentFV0As, aod::FT0Mults, aod::FV0Mults, aod::TPCMults, aod::EPCalibrationTables, aod::QvectorFT0CVecs, aod::QvectorFT0AVecs, aod::QvectorFT0MVecs, aod::QvectorFV0AVecs, aod::QvectorTPCallVecs, aod::QvectorTPCposVecs, aod::QvectorTPCnegVecs>::iterator; HistogramRegistry general{"general", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry flow_ep{"flow_ep", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; @@ -171,15 +173,15 @@ struct flowQC { const AxisSpec centAxis{cfgCentralityBins, fmt::format("{} percentile", (std::string)centDetectorNames[cfgCentralityEstimator])}; - const AxisSpec QxAxis{cfgQvecBins, "Q_{2,x}"}; - const AxisSpec QyAxis{cfgQvecBins, "Q_{2,y}"}; + const AxisSpec QxAxis{cfgQvecBins, Form("Q_{%d,x}", cfgHarmonics.value)}; + const AxisSpec QyAxis{cfgQvecBins, Form("Q_{%d,y}", cfgHarmonics.value)}; - const AxisSpec NormQxAxis{cfgQvecBins, "#frac{Q_{2,x}}{||#vec{Q_{2}}||}"}; - const AxisSpec NormQyAxis{cfgQvecBins, "#frac{Q_{2,y}}{||#vec{Q_{2}}||}"}; + const AxisSpec NormQxAxis{cfgQvecBins, Form("#frac{Q_{%d,x}}{||#vec{Q_{%d}}||}", cfgHarmonics.value, cfgHarmonics.value)}; + const AxisSpec NormQyAxis{cfgQvecBins, Form("#frac{Q_{%d,y}}{||#vec{Q_{%d}}||}", cfgHarmonics.value, cfgHarmonics.value)}; - const AxisSpec psiAxis{cfgPhiBins, "#psi_{2}"}; - const AxisSpec psiCompAxis{cfgPhiBins, "#psi_{2}^{EP} - #psi_{2}^{Qvec}"}; - const AxisSpec cosPsiCompAxis{cfgCosPhiBins, "cos[2(#psi_{2}^{EP} - #psi_{2}^{Qvec})]"}; + const AxisSpec psiAxis{cfgPhiBins, Form("#psi_{%d}", cfgHarmonics.value)}; + const AxisSpec psiCompAxis{cfgPhiBins, Form("#psi_{%d}^{EP} - #psi_{%d}^{Qvec}", cfgHarmonics.value, cfgHarmonics.value)}; + const AxisSpec cosPsiCompAxis{cfgCosPhiBins, Form("cos[2(#psi_{%d}^{EP} - #psi_{%d}^{Qvec})]", cfgHarmonics.value, cfgHarmonics.value)}; // z vertex histogram general.add("hRecVtxZData", "collision z position", HistType::kTH1F, {{200, -20., +20., "z position (cm)"}}); @@ -203,12 +205,12 @@ struct flowQC { hDeltaPsi[iMethod][iQvecDet][jQvecDet] = registry->add(Form("hDeltaPsi_%s_%s_%s", qVecDetectorNames[iQvecDet].c_str(), qVecDetectorNames[jQvecDet].c_str(), suffixes[iMethod].c_str()), "", HistType::kTH2F, {centAxis, {cfgDeltaPhiBins, Form("#psi_{%s} - #psi_{%s}", qVecDetectorNames[iQvecDet].c_str(), qVecDetectorNames[jQvecDet].c_str())}}); // Scalar-product histograms - auto spLabel = Form("#vec{Q}_{2}^{%s} #upoint #vec{Q}_{2}^{%s}", qVecDetectorNames[iQvecDet].c_str(), qVecDetectorNames[jQvecDet].c_str()); + auto spLabel = Form("#vec{Q}_{%d}^{%s} #upoint #vec{Q}_{%d}^{%s}", cfgHarmonics.value, qVecDetectorNames[iQvecDet].c_str(), cfgHarmonics.value, qVecDetectorNames[jQvecDet].c_str()); hScalarProduct[iMethod][iQvecDet][jQvecDet] = registry->add(Form("hScalarProduct_%s_%s_%s", qVecDetectorNames[iQvecDet].c_str(), qVecDetectorNames[jQvecDet].c_str(), suffixes[iMethod].c_str()), "", HistType::kTH2F, {centAxis, {cfgQvecBins, spLabel}}); // Normalised scalar-product histograms - auto normSpLabel = Form("#frac{#vec{Q}_{2}^{%s} #upoint #vec{Q}_{2}^{%s}}{||#vec{Q}_{2}^{%s}|| ||#vec{Q}_{2}^{%s}||}", qVecDetectorNames[iQvecDet].c_str(), qVecDetectorNames[jQvecDet].c_str(), qVecDetectorNames[iQvecDet].c_str(), qVecDetectorNames[jQvecDet].c_str()); + auto normSpLabel = Form("#frac{#vec{Q}_{%d}^{%s} #upoint #vec{Q}_{%d}^{%s}}{||#vec{Q}_{%d}^{%s}|| ||#vec{Q}_{%d}^{%s}||}", cfgHarmonics.value, qVecDetectorNames[iQvecDet].c_str(), cfgHarmonics.value, qVecDetectorNames[jQvecDet].c_str(), cfgHarmonics.value, qVecDetectorNames[iQvecDet].c_str(), cfgHarmonics.value, qVecDetectorNames[jQvecDet].c_str()); hNormalisedScalarProduct[iMethod][iQvecDet][jQvecDet] = registry->add(Form("hNormalisedScalarProduct_%s_%s_%s", qVecDetectorNames[iQvecDet].c_str(), qVecDetectorNames[jQvecDet].c_str(), suffixes[iMethod].c_str()), "", HistType::kTH2F, {centAxis, {cfgQvecBins, normSpLabel}}); } @@ -285,28 +287,28 @@ struct flowQC { float QyTPC_EP = QmodTPC_EP * std::sin(2 * psiTPC_EP); // Qvec method - float QxFT0A_Qvec = collision.qvecFT0ARe(); - float QyFT0A_Qvec = collision.qvecFT0AIm(); + float QxFT0A_Qvec = collision.qvecFT0AReVec()[cfgHarmonics - 2]; + float QyFT0A_Qvec = collision.qvecFT0AImVec()[cfgHarmonics - 2]; float QmodFT0A_Qvec = std::hypot(QxFT0A_Qvec, QyFT0A_Qvec); float psiFT0A_Qvec = computeEventPlane(QyFT0A_Qvec, QxFT0A_Qvec); - float QxFT0C_Qvec = collision.qvecFT0CRe(); - float QyFT0C_Qvec = collision.qvecFT0CIm(); + float QxFT0C_Qvec = collision.qvecFT0CReVec()[cfgHarmonics - 2]; + float QyFT0C_Qvec = collision.qvecFT0CImVec()[cfgHarmonics - 2]; float QmodFT0C_Qvec = std::hypot(QxFT0C_Qvec, QyFT0C_Qvec); float psiFT0C_Qvec = computeEventPlane(QyFT0C_Qvec, QxFT0C_Qvec); - float QxTPCl_Qvec = collision.qvecBNegRe(); - float QyTPCl_Qvec = collision.qvecBNegIm(); + float QxTPCl_Qvec = collision.qvecTPCnegReVec()[cfgHarmonics - 2]; + float QyTPCl_Qvec = collision.qvecTPCnegImVec()[cfgHarmonics - 2]; float QmodTPCl_Qvec = std::hypot(QxTPCl_Qvec, QyTPCl_Qvec); float psiTPCl_Qvec = computeEventPlane(QyTPCl_Qvec, QxTPCl_Qvec); - float QxTPCr_Qvec = collision.qvecBPosRe(); - float QyTPCr_Qvec = collision.qvecBPosIm(); + float QxTPCr_Qvec = collision.qvecTPCposReVec()[cfgHarmonics - 2]; + float QyTPCr_Qvec = collision.qvecTPCposImVec()[cfgHarmonics - 2]; float QmodTPCr_Qvec = std::hypot(QxTPCr_Qvec, QyTPCr_Qvec); float psiTPCr_Qvec = computeEventPlane(QyTPCr_Qvec, QxTPCr_Qvec); - float QxTPC_Qvec = collision.qvecBTotRe(); - float QyTPC_Qvec = collision.qvecBTotIm(); + float QxTPC_Qvec = collision.qvecTPCallReVec()[cfgHarmonics - 2]; + float QyTPC_Qvec = collision.qvecTPCallImVec()[cfgHarmonics - 2]; float QmodTPC_Qvec = std::hypot(QxTPC_Qvec, QyTPC_Qvec); float psiTPC_Qvec = computeEventPlane(QyTPC_Qvec, QxTPC_Qvec); From 5ccc11cec530c720bffd394840806a44aa6ce9dd Mon Sep 17 00:00:00 2001 From: hernasab Date: Thu, 12 Jun 2025 09:31:25 -0500 Subject: [PATCH 1597/1650] [PWGCF] added ccdb objects (#11568) Co-authored-by: Sabrina Hernandez --- PWGCF/Flow/Tasks/flowZdcTask.cxx | 131 +++++++++++++++++++++++-------- 1 file changed, 97 insertions(+), 34 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowZdcTask.cxx b/PWGCF/Flow/Tasks/flowZdcTask.cxx index 3bad6691449..18b92bbfff8 100644 --- a/PWGCF/Flow/Tasks/flowZdcTask.cxx +++ b/PWGCF/Flow/Tasks/flowZdcTask.cxx @@ -14,30 +14,34 @@ /// \since 10/01/2024 /// \brief task to evaluate flow and neutron skin with information from ZDC -#include -#include -#include -#include -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/ASoAHelpers.h" -#include "Framework/RunningWorkflowInfo.h" -#include "Framework/HistogramRegistry.h" - -#include "Common/DataModel/EventSelection.h" -#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/CCDB/EventSelectionParams.h" +#include "Common/CCDB/TriggerAliases.h" #include "Common/DataModel/Centrality.h" +#include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/TrackSelectionTables.h" + +#include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/RunningWorkflowInfo.h" +#include "Framework/runDataProcessing.h" +#include #include "TList.h" -#include -#include +#include #include +#include +#include #include #include -#include -#include + +#include +#include +#include +#include + using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; @@ -98,7 +102,10 @@ struct FlowZdcTask { Configurable isApplyFT0CbasedOccupancy{"isApplyFT0CbasedOccupancy", false, "T0C Occu cut?"}; Configurable isTDCcut{"isTDCcut", false, "Use TDC cut?"}; Configurable isZEMcut{"isZEMcut", true, "Use ZEM cut?"}; + Configurable useMidRapNchSel{"useMidRapNchSel", true, "Use mid-rapidit Nch selection"}; + Configurable applyEff{"applyEff", true, "Apply track-by-track efficiency correction"}; + Configurable nSigmaNchCut{"nSigmaNchCut", 1., "nSigma Nch selection"}; Configurable minNchSel{"minNchSel", 5., "min Nch Selection"}; Configurable znBasedCut{"znBasedCut", 100, "ZN-based cut"}; Configurable zemCut{"zemCut", 1000., "ZEM cut"}; @@ -106,6 +113,11 @@ struct FlowZdcTask { Configurable minOccCut{"minOccCut", 0, "min Occu cut"}; Configurable maxOccCut{"maxOccCut", 500, "max Occu cut"}; Configurable minITSnCls{"minITSnCls", 5, "min ITSnCls"}; + Configurable minPt{"minPt", 0.1, "minimum pt of the tracks"}; + Configurable maxPt{"maxPt", 3., "maximum pt of the tracks"}; + Configurable maxPtSpectra{"maxPtSpectra", 50., "maximum pt of the tracks"}; + Configurable minEta{"minEta", -0.8, "minimum eta"}; + Configurable maxEta{"maxEta", +0.8, "maximum eta"}; // axis configs ConfigurableAxis axisVertex{"axisVertex", {20, -10, 10}, "vertex axis for histograms"}; ConfigurableAxis axisPhi{"axisPhi", {60, 0.0, constants::math::TwoPI}, "phi axis for histograms"}; @@ -138,9 +150,12 @@ struct FlowZdcTask { using CollisionDataTable = soa::Join; using TrackDataTable = soa::Join; using FilTrackDataTable = soa::Filtered; - std::complex qTPC; // init q TPC - std::complex qZNA{0, 0}; // init qZNA - std::complex qZNC{0, 0}; // init qZNC + + // CCDB paths + Configurable paTH{"paTH", "Users/s/sahernan/test", "base path to the ccdb object"}; + Configurable paTHmeanNch{"paTHmeanNch", "Users/s/shernan/test", "base path to the ccdb object"}; + Configurable paTHsigmaNch{"paTHsigmaNch", "Users/s/shernan/testSigma", "base path to the ccdb object"}; + Configurable ccdbNoLaterThan{"ccdbNoLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; enum EvCutLabel { All = 1, @@ -164,8 +179,7 @@ struct FlowZdcTask { // Begin Histogram Registry HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; - OutputObj pCosPsiDifferences{TProfile("pCosPsiDifferences", "Differences in cos(psi) vs Centrality;Centrality;Mean cos(psi) Difference", 200, 0, 100, -1, 1)}; - OutputObj pSinPsiDifferences{TProfile("pSinPsiDifferences", "Differences in sin(psi) vs Centrality;Centrality;Mean sin(psi) Difference", 200, 0, 100, -1, 1)}; + Service ccdb; OutputObj pZNvsFT0Ccent{TProfile("pZNvsFT0Ccent", "ZN Energy vs FT0C Centrality", 100, 0, 100, 0, 500)}; OutputObj pZPvsFT0Ccent{TProfile("pZPvsFT0Ccent", "ZP Energy vs FT0C Centrality", 100, 0, 100, 0, 500)}; OutputObj pZNratiovscent{TProfile("pZNratiovscent", "Ratio ZNC/ZNA vs FT0C Centrality", 100, 0, 100, 0, 5)}; @@ -337,6 +351,24 @@ struct FlowZdcTask { histos.add("ZNVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA+ZNC;", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, minNch, maxZn}}}); histos.add("ZNDifVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA-ZNC;", kTH2F, {{{nBinsNch, minNch, maxNch}, {100, -50., 50.}}}); } + LOG(info) << "\tccdbNoLaterThan=" << ccdbNoLaterThan.value; + LOG(info) << "\tapplyEff=" << applyEff.value; + LOG(info) << "\tpaTH=" << paTH.value; + LOG(info) << "\tuseMidRapNchSel=" << useMidRapNchSel.value; + LOG(info) << "\tpaTHmeanNch=" << paTHmeanNch.value; + LOG(info) << "\tpaTHsigmaNch=" << paTHsigmaNch.value; + LOG(info) << "\tminPt=" << minPt.value; + LOG(info) << "\tmaxPt=" << maxPt.value; + LOG(info) << "\tmaxPtSpectra=" << maxPtSpectra.value; + + ccdb->setURL("http://alice-ccdb.cern.ch"); + // Enabling object caching, otherwise each call goes to the CCDB server + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setFatalWhenNull(false); + // Not later than now, will be replaced by the value of the train creation + // This avoids that users can replace objects **while** a train is running + ccdb->setCreatedNotAfter(ccdbNoLaterThan.value); } template bool isEventSelected(EventCuts const& col) @@ -480,6 +512,7 @@ struct FlowZdcTask { histos.fill(HIST("hEventCounter"), EvCutLabel::Zem); } + const double normT0M{(aT0A + aT0C) / 100.}; float znA = zdc.amplitudeZNA() / cfgCollisionEnergy; float znC = zdc.amplitudeZNC() / cfgCollisionEnergy; float zpA = zdc.amplitudeZPA() / cfgCollisionEnergy; @@ -506,7 +539,50 @@ struct FlowZdcTask { } glbTracks++; } + bool skipEvent{false}; + if (useMidRapNchSel) { + auto hMeanNch = ccdb->getForTimeStamp(paTHmeanNch.value, foundBC.timestamp()); + auto hSigmaNch = ccdb->getForTimeStamp(paTHsigmaNch.value, foundBC.timestamp()); + if (!hMeanNch) { + LOGF(info, "hMeanNch NOT LOADED!"); + return; + } + if (!hSigmaNch) { + LOGF(info, "hSigmaNch NOT LOADED!"); + return; + } + const int binT0M{hMeanNch->FindBin(normT0M)}; + const double meanNch{hMeanNch->GetBinContent(binT0M)}; + const double sigmaNch{hSigmaNch->GetBinContent(binT0M)}; + const double nSigmaSelection{nSigmaNchCut * sigmaNch}; + const double diffMeanNch{meanNch - glbTracks}; + + if (!(std::abs(diffMeanNch) < nSigmaSelection)) { + histos.fill(HIST("ExcludedEvtVsNch"), glbTracks); + } else { + skipEvent = true; + } + } + if (!skipEvent) { + return; + } + + for (const auto& track : tracks) { + // Track Selection + if (!track.isGlobalTrack()) { + continue; + } + if ((track.pt() < minPt) || (track.pt() > maxPtSpectra)) { + continue; + } + + histos.fill(HIST("ZposVsEta"), collision.posZ(), track.eta()); + histos.fill(HIST("EtaVsPhi"), track.eta(), track.phi()); + histos.fill(HIST("dcaXYvspT"), track.dcaXY(), track.pt()); + et += std::sqrt(std::pow(track.pt(), 2.) + std::pow(o2::constants::physics::MassPionCharged, 2.)); + meanpt += track.pt(); + } histos.fill(HIST("zPos"), collision.posZ()); histos.fill(HIST("T0Ccent"), collision.centFT0C()); @@ -574,18 +650,12 @@ struct FlowZdcTask { int globalTracks = tracks.size(); if (globalTracks < 1) return; - // this is the q vector for the TPC data. it is a complex function - double qTpcReal = 0.0; // Initialize qTPC_real - double qTpcIm = 0.0; // init qTPC_imaginary - std::complex qTPC(0, 0); // Starting with a q-vector of zero int nTot{0}; // Tracks are already filtered with GlobalTrack || GlobalTrackSDD for (const auto& track : tracks) { - double phi = track.phi(); nTot++; histos.fill(HIST("etaHistogram"), track.eta()); histos.fill(HIST("phiHistogram"), track.phi()); histos.fill(HIST("ptHistogram"), track.pt()); - qTPC += std::complex(std::cos(2.0 * phi), std::sin(2.0 * phi)); } // end track loop 1 double pT{0}; for (const auto& track : tracks) { @@ -599,16 +669,9 @@ struct FlowZdcTask { histos.fill(HIST("multvsCent"), cent, nTot); histos.fill(HIST("hYield"), nTot, pT); histos.fill(HIST("multHistogram"), nTot); - qTpcReal = qTPC.real() / nTot; // normalize these vectors by the total number of particles - qTpcIm = qTPC.imag() / nTot; - - histos.fill(HIST("REqHistogram"), qTpcReal); - histos.fill(HIST("IMqHistogram"), qTpcIm); histos.fill(HIST("TPCmultiplicity"), multTPC); histos.fill(HIST("hGlobalTracks"), globalTracks); - - histos.fill(HIST("revsimag"), qTpcReal, qTpcIm); } void processZdcCollAssoc( AodCollisions::iterator const& collision, From b687dee5dbdc9ff4ced9099fc4f9a5edaa4b091b Mon Sep 17 00:00:00 2001 From: Noor Koster <82090643+cnkoster@users.noreply.github.com> Date: Thu, 12 Jun 2025 16:55:59 +0200 Subject: [PATCH 1598/1650] [Common] Add timestamp, centrality and evSelection to inter-calib table (#11457) Co-authored-by: ALICE Action Bot --- Common/DataModel/ZDCInterCalib.h | 35 +++--- Common/TableProducer/CMakeLists.txt | 4 +- ...k-intercalib.cxx => zdcTaskInterCalib.cxx} | 116 ++++++++++++++++-- 3 files changed, 129 insertions(+), 26 deletions(-) rename Common/TableProducer/{zdc-task-intercalib.cxx => zdcTaskInterCalib.cxx} (53%) diff --git a/Common/DataModel/ZDCInterCalib.h b/Common/DataModel/ZDCInterCalib.h index 290a3ac61fe..d7b66575340 100644 --- a/Common/DataModel/ZDCInterCalib.h +++ b/Common/DataModel/ZDCInterCalib.h @@ -20,21 +20,23 @@ namespace o2::aod { -namespace znoutput +namespace znoutput // o2-linter: disable=name/workflow-file { -DECLARE_SOA_COLUMN(ZNApmc, commonPMZNA, float); //! PMC ZNA // o2-linter: disable=name/o2-column -DECLARE_SOA_COLUMN(ZNApm1, ZNAPM1, float); //! PM1 ZNA // o2-linter: disable=name/o2-column -DECLARE_SOA_COLUMN(ZNApm2, ZNAPM2, float); //! PM2 ZNA // o2-linter: disable=name/o2-column -DECLARE_SOA_COLUMN(ZNApm3, ZNAPM3, float); //! PM3 ZNA // o2-linter: disable=name/o2-column -DECLARE_SOA_COLUMN(ZNApm4, ZNAPM4, float); //! PM4 ZNA // o2-linter: disable=name/o2-column -DECLARE_SOA_COLUMN(ZNAtdc, ZNATDC, float); //! TDC ZNA // o2-linter: disable=name/o2-column -DECLARE_SOA_COLUMN(ZNCpmc, commonPMZNC, float); //! PMC ZNC // o2-linter: disable=name/o2-column -DECLARE_SOA_COLUMN(ZNCpm1, ZNCPM1, float); //! PM1 ZNC // o2-linter: disable=name/o2-column -DECLARE_SOA_COLUMN(ZNCpm2, ZNCPM2, float); //! PM2 ZNC // o2-linter: disable=name/o2-column -DECLARE_SOA_COLUMN(ZNCpm3, ZNCPM3, float); //! PM3 ZNC // o2-linter: disable=name/o2-column -DECLARE_SOA_COLUMN(ZNCpm4, ZNCPM4, float); //! PM4 ZNC // o2-linter: disable=name/o2-column -DECLARE_SOA_COLUMN(ZNCtdc, ZNCTDC, float); //! TDC ZNC // o2-linter: disable=name/o2-column - +DECLARE_SOA_COLUMN(ZNApmc, commonPMZNA, float); //! PMC ZNA // o2-linter: disable=name/o2-column +DECLARE_SOA_COLUMN(ZNApm1, ZNAPM1, float); //! PM1 ZNA // o2-linter: disable=name/o2-column +DECLARE_SOA_COLUMN(ZNApm2, ZNAPM2, float); //! PM2 ZNA // o2-linter: disable=name/o2-column +DECLARE_SOA_COLUMN(ZNApm3, ZNAPM3, float); //! PM3 ZNA // o2-linter: disable=name/o2-column +DECLARE_SOA_COLUMN(ZNApm4, ZNAPM4, float); //! PM4 ZNA // o2-linter: disable=name/o2-column +DECLARE_SOA_COLUMN(ZNAtdc, ZNATDC, float); //! TDC ZNA // o2-linter: disable=name/o2-column +DECLARE_SOA_COLUMN(ZNCpmc, commonPMZNC, float); //! PMC ZNC // o2-linter: disable=name/o2-column +DECLARE_SOA_COLUMN(ZNCpm1, ZNCPM1, float); //! PM1 ZNC // o2-linter: disable=name/o2-column +DECLARE_SOA_COLUMN(ZNCpm2, ZNCPM2, float); //! PM2 ZNC // o2-linter: disable=name/o2-column +DECLARE_SOA_COLUMN(ZNCpm3, ZNCPM3, float); //! PM3 ZNC // o2-linter: disable=name/o2-column +DECLARE_SOA_COLUMN(ZNCpm4, ZNCPM4, float); //! PM4 ZNC // o2-linter: disable=name/o2-column +DECLARE_SOA_COLUMN(ZNCtdc, ZNCTDC, float); //! TDC ZNC // o2-linter: disable=name/o2-column +DECLARE_SOA_COLUMN(Centrality, centrality, float); //! Centrality +DECLARE_SOA_COLUMN(Timestamp, timestamp, uint64_t); //! Timestamp +DECLARE_SOA_COLUMN(SelectionBits, selectionBits, uint8_t); //! Selection Flags } // namespace znoutput DECLARE_SOA_TABLE(ZDCInterCalib, "AOD", "ZDCIC", o2::soa::Index<>, @@ -49,7 +51,10 @@ DECLARE_SOA_TABLE(ZDCInterCalib, "AOD", "ZDCIC", o2::soa::Index<>, znoutput::ZNCpm2, znoutput::ZNCpm3, znoutput::ZNCpm4, - znoutput::ZNCtdc); + znoutput::ZNCtdc, + znoutput::Centrality, + znoutput::Timestamp, + znoutput::SelectionBits); } // namespace o2::aod #endif // COMMON_DATAMODEL_ZDCINTERCALIB_H_ diff --git a/Common/TableProducer/CMakeLists.txt b/Common/TableProducer/CMakeLists.txt index 1d6918d6121..d2d59ea2506 100644 --- a/Common/TableProducer/CMakeLists.txt +++ b/Common/TableProducer/CMakeLists.txt @@ -125,8 +125,8 @@ o2physics_add_dpl_workflow(match-mft-ft0 O2::DetectorsBase O2::DetectorsCommonDataFormats COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(zdc-task-intercalib - SOURCES zdc-task-intercalib.cxx +o2physics_add_dpl_workflow(zdc-task-inter-calib + SOURCES zdcTaskInterCalib.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore COMPONENT_NAME Analysis) diff --git a/Common/TableProducer/zdc-task-intercalib.cxx b/Common/TableProducer/zdcTaskInterCalib.cxx similarity index 53% rename from Common/TableProducer/zdc-task-intercalib.cxx rename to Common/TableProducer/zdcTaskInterCalib.cxx index 77b590bde57..78054580b81 100644 --- a/Common/TableProducer/zdc-task-intercalib.cxx +++ b/Common/TableProducer/zdcTaskInterCalib.cxx @@ -9,12 +9,10 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file zdc-task-intercalib.cxx +/// \file zdcTaskInterCalib.cxx /// \brief Task for ZDC tower inter-calibration /// \author chiara.oppedisano@cern.ch -// o2-linter: disable=name/workflow-file -// o2-linter: disable=name/file-cpp #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" #include "Framework/HistogramRegistry.h" @@ -35,9 +33,9 @@ using namespace o2::framework::expressions; using namespace o2::aod::evsel; using BCsRun3 = soa::Join; -using ColEvSels = soa::Join; +using ColEvSels = soa::Join; -struct ZDCCalibTower { +struct ZdcTaskInterCalib { Produces zTab; @@ -48,9 +46,32 @@ struct ZDCCalibTower { Configurable tdcCut{"tdcCut", false, "Flag for TDC cut"}; Configurable tdcZNmincut{"tdcZNmincut", -2.5, "Min ZN TDC cut"}; Configurable tdcZNmaxcut{"tdcZNmaxcut", -2.5, "Max ZN TDC cut"}; + // Event selections + Configurable cfgEvSelSel8{"cfgEvSelSel8", true, "Event selection: sel8"}; + Configurable cfgEvSelVtxZ{"cfgEvSelVtxZ", 10, "Event selection: zVtx"}; + Configurable cfgEvSelsDoOccupancySel{"cfgEvSelsDoOccupancySel", true, "Event selection: do occupancy selection"}; + Configurable cfgEvSelsMaxOccupancy{"cfgEvSelsMaxOccupancy", 10000, "Event selection: set max occupancy"}; + Configurable cfgEvSelsNoSameBunchPileupCut{"cfgEvSelsNoSameBunchPileupCut", true, "Event selection: no same bunch pileup cut"}; + Configurable cfgEvSelsIsGoodZvtxFT0vsPV{"cfgEvSelsIsGoodZvtxFT0vsPV", true, "Event selection: is good ZVTX FT0 vs PV"}; + Configurable cfgEvSelsNoCollInTimeRangeStandard{"cfgEvSelsNoCollInTimeRangeStandard", true, "Event selection: no collision in time range standard"}; + Configurable cfgEvSelsIsVertexITSTPC{"cfgEvSelsIsVertexITSTPC", true, "Event selection: is vertex ITSTPC"}; + Configurable cfgEvSelsIsGoodITSLayersAll{"cfgEvSelsIsGoodITSLayersAll", true, "Event selection: is good ITS layers all"}; // HistogramRegistry registry{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + enum SelectionCriteria { + evSel_zvtx, + evSel_sel8, + evSel_occupancy, + evSel_kNoSameBunchPileup, + evSel_kIsGoodZvtxFT0vsPV, + evSel_kNoCollInTimeRangeStandard, + evSel_kIsVertexITSTPC, + evSel_kIsGoodITSLayersAll, + evSel_allEvents, + nEventSelections + }; + void init(InitContext const&) { registry.add("ZNApmc", "ZNApmc; ZNA PMC; Entries", {HistType::kTH1F, {{nBins, -0.5, maxZN}}}); @@ -65,16 +86,93 @@ struct ZDCCalibTower { registry.add("ZNCpm4", "ZNCpm4; ZNC PM4; Entries", {HistType::kTH1F, {{nBins, -0.5, maxZN}}}); registry.add("ZNAsumq", "ZNAsumq; ZNA uncalib. sum PMQ; Entries", {HistType::kTH1F, {{nBins, -0.5, maxZN}}}); registry.add("ZNCsumq", "ZNCsumq; ZNC uncalib. sum PMQ; Entries", {HistType::kTH1F, {{nBins, -0.5, maxZN}}}); + + registry.add("hEventCount", "Number of Event; Cut; #Events Passed Cut", {HistType::kTH1D, {{nEventSelections, 0, nEventSelections}}}); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_allEvents + 1, "All events"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_zvtx + 1, "vtxZ"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_sel8 + 1, "Sel8"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_occupancy + 1, "kOccupancy"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_kNoSameBunchPileup + 1, "kNoSameBunchPileup"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_kIsGoodZvtxFT0vsPV + 1, "kIsGoodZvtxFT0vsPV"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_kNoCollInTimeRangeStandard + 1, "kNoCollInTimeRangeStandard"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_kIsVertexITSTPC + 1, "kIsVertexITSTPC"); + registry.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(evSel_kIsGoodITSLayersAll + 1, "kkIsGoodITSLayersAll"); + } + + template + uint8_t eventSelected(TCollision collision) + { + uint8_t selectionBits = 0; + bool selected; + + registry.fill(HIST("hEventCount"), evSel_allEvents); + + selected = std::fabs(collision.posZ()) < cfgEvSelVtxZ; + if (selected) { + selectionBits |= (uint8_t)(0x1u << evSel_zvtx); + registry.fill(HIST("hEventCount"), evSel_zvtx); + } + + selected = collision.sel8(); + if (selected) { + selectionBits |= (uint8_t)(0x1u << evSel_sel8); + registry.fill(HIST("hEventCount"), evSel_sel8); + } + + auto occupancy = collision.trackOccupancyInTimeRange(); + selected = occupancy <= cfgEvSelsMaxOccupancy; + if (selected) { + selectionBits |= (uint8_t)(0x1u << evSel_occupancy); + registry.fill(HIST("hEventCount"), evSel_occupancy); + } + + selected = collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup); + if (selected) { + selectionBits |= (uint8_t)(0x1u << evSel_kNoSameBunchPileup); + registry.fill(HIST("hEventCount"), evSel_kNoSameBunchPileup); + } + + selected = collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV); + if (selected) { + selectionBits |= (uint8_t)(0x1u << evSel_kIsGoodZvtxFT0vsPV); + registry.fill(HIST("hEventCount"), evSel_kIsGoodZvtxFT0vsPV); + } + + selected = collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard); + if (selected) { + selectionBits |= (uint8_t)(0x1u << evSel_kNoCollInTimeRangeStandard); + registry.fill(HIST("hEventCount"), evSel_kNoCollInTimeRangeStandard); + } + + selected = collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC); + if (selected) { + selectionBits |= (uint8_t)(0x1u << evSel_kIsVertexITSTPC); + registry.fill(HIST("hEventCount"), evSel_kIsVertexITSTPC); + } + + selected = collision.selection_bit(o2::aod::evsel::kIsGoodITSLayersAll); + if (selected) { + selectionBits |= (uint8_t)(0x1u << evSel_kIsGoodITSLayersAll); + registry.fill(HIST("hEventCount"), evSel_kIsGoodITSLayersAll); + } + + return selectionBits; } void process(ColEvSels const& cols, BCsRun3 const& /*bcs*/, aod::Zdcs const& /*zdcs*/) { // collision-based event selection + int nTowers = 4; // number of ZDC towers + for (auto const& collision : cols) { const auto& foundBC = collision.foundBC_as(); if (foundBC.has_zdc()) { const auto& zdc = foundBC.zdc(); + uint8_t evSelection = eventSelected(collision); + + float centrality = collision.centFT0C(); + // To assure that ZN have a genuine signal (tagged by the relative TDC) // we can check that the amplitude is >0 or that ADC is NOT very negative (-inf) @@ -117,7 +215,7 @@ struct ZDCCalibTower { }; // if (isZNChit) { - for (int it = 0; it < 4; it++) { + for (int it = 0; it < nTowers; it++) { pmqZNC[it] = (zdc.energySectorZNC())[it]; sumZNC += pmqZNC[it]; } @@ -129,7 +227,7 @@ struct ZDCCalibTower { registry.get(HIST("ZNCsumq"))->Fill(sumZNC); } if (isZNAhit) { - for (int it = 0; it < 4; it++) { + for (int it = 0; it < nTowers; it++) { pmqZNA[it] = (zdc.energySectorZNA())[it]; sumZNA += pmqZNA[it]; } @@ -142,7 +240,7 @@ struct ZDCCalibTower { registry.get(HIST("ZNAsumq"))->Fill(sumZNA); } if (isZNAhit || isZNChit) - zTab(pmcZNA, pmqZNA[0], pmqZNA[1], pmqZNA[2], pmqZNA[3], tdcZNC, pmcZNC, pmqZNC[0], pmqZNC[1], pmqZNC[2], pmqZNC[3], tdcZNA); + zTab(pmcZNA, pmqZNA[0], pmqZNA[1], pmqZNA[2], pmqZNA[3], tdcZNC, pmcZNC, pmqZNC[0], pmqZNC[1], pmqZNC[2], pmqZNC[3], tdcZNA, centrality, foundBC.timestamp(), evSelection); } } } @@ -151,5 +249,5 @@ struct ZDCCalibTower { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) // o2-linter: disable=name/file-cpp { return WorkflowSpec{ - adaptAnalysisTask(cfgc)}; + adaptAnalysisTask(cfgc)}; } From 5b4067110b657803747da8ae7f130f5f68584026 Mon Sep 17 00:00:00 2001 From: Francesco Mazzaschi <43742195+fmazzasc@users.noreply.github.com> Date: Thu, 12 Jun 2025 18:02:14 +0200 Subject: [PATCH 1599/1650] Add flag to disable its rof cut (#11572) Co-authored-by: Francesco Mazzaschi --- PWGLF/TableProducer/Nuspex/hyperRecoTask.cxx | 51 ++++++++++---------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/hyperRecoTask.cxx b/PWGLF/TableProducer/Nuspex/hyperRecoTask.cxx index 09ed3ec07b8..5a8624e50e1 100644 --- a/PWGLF/TableProducer/Nuspex/hyperRecoTask.cxx +++ b/PWGLF/TableProducer/Nuspex/hyperRecoTask.cxx @@ -11,39 +11,39 @@ // // Build hypertriton candidates from V0s and tracks -#include -#include -#include -#include -#include +#include "PWGLF/DataModel/EPCalibrationTables.h" +#include "PWGLF/DataModel/LFHypernucleiTables.h" +#include "PWGLF/Utils/svPoolCreator.h" -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoAHelpers.h" -#include "ReconstructionDataFormats/Track.h" +#include "Common/Core/PID/PIDTOF.h" +#include "Common/Core/PID/TPCPIDResponse.h" #include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" +#include "Common/DataModel/Centrality.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Multiplicity.h" -#include "Common/DataModel/Centrality.h" -#include "PWGLF/DataModel/EPCalibrationTables.h" -#include "DetectorsBase/Propagator.h" -#include "DetectorsBase/GeometryManager.h" -#include "DataFormatsParameters/GRPObject.h" -#include "DataFormatsParameters/GRPMagField.h" -#include "CCDB/BasicCCDBManager.h" - +#include "Common/TableProducer/PID/pidTOFBase.h" #include "EventFiltering/Zorro.h" #include "EventFiltering/ZorroSummary.h" -#include "Common/Core/PID/TPCPIDResponse.h" -#include "Common/Core/PID/PIDTOF.h" -#include "Common/TableProducer/PID/pidTOFBase.h" -#include "DataFormatsTPC/BetheBlochAleph.h" +#include "CCDB/BasicCCDBManager.h" #include "DCAFitter/DCAFitterN.h" -#include "PWGLF/Utils/svPoolCreator.h" -#include "PWGLF/DataModel/LFHypernucleiTables.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "DataFormatsParameters/GRPObject.h" +#include "DataFormatsTPC/BetheBlochAleph.h" +#include "DetectorsBase/GeometryManager.h" +#include "DetectorsBase/Propagator.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/runDataProcessing.h" +#include "ReconstructionDataFormats/Track.h" + +#include +#include +#include +#include +#include using namespace o2; using namespace o2::framework; @@ -168,6 +168,7 @@ struct hyperRecoTask { Configurable useCustomVertexer{"useCustomVertexer", false, "Use custom vertexer"}; Configurable skipAmbiTracks{"skipAmbiTracks", false, "Skip ambiguous tracks"}; + Configurable disableITSROFCut{"disableITSROFCut", false, "Disable ITS ROC cut for event selection"}; Configurable customVertexerTimeMargin{"customVertexerTimeMargin", 800, "Time margin for custom vertexer (ns)"}; Configurable> cfgBetheBlochParams{"cfgBetheBlochParams", {betheBlochDefault[0], 1, 6, particleName, betheBlochParNames}, "TPC Bethe-Bloch parameterisation for He3"}; Configurable cfgCompensatePIDinTracking{"cfgCompensatePIDinTracking", true, "If true, divide tpcInnerParam by the electric charge"}; @@ -341,7 +342,7 @@ struct hyperRecoTask { initCCDB(bc); hEvents->Fill(0.); - if (!collision.selection_bit(aod::evsel::kNoITSROFrameBorder)) { + if (!collision.selection_bit(aod::evsel::kNoITSROFrameBorder) && !disableITSROFCut) { continue; } From 0c3ee0064d832ca2c377bfbc22a6b6a8ae09ca8e Mon Sep 17 00:00:00 2001 From: Artem Kotliarov <71133985+KotliarovAr@users.noreply.github.com> Date: Thu, 12 Jun 2025 18:44:43 +0200 Subject: [PATCH 1600/1650] [PWGJE] PWGJE Change scheme for outlier removal (#11577) --- PWGJE/Tasks/recoilJets.cxx | 117 +++++++++++++++++++++---------------- 1 file changed, 67 insertions(+), 50 deletions(-) diff --git a/PWGJE/Tasks/recoilJets.cxx b/PWGJE/Tasks/recoilJets.cxx index f39d1c9fe25..26abd49517a 100644 --- a/PWGJE/Tasks/recoilJets.cxx +++ b/PWGJE/Tasks/recoilJets.cxx @@ -13,35 +13,33 @@ /// \file recoilJets.cxx /// \brief hadron-jet correlation analysis -#include -#include -#include +#include "PWGJE/Core/FastJetUtilities.h" +#include "PWGJE/Core/JetDerivedDataUtilities.h" +#include "PWGJE/Core/JetFinder.h" +#include "PWGJE/Core/JetFindingUtilities.h" +#include "PWGJE/DataModel/Jet.h" -#include "TRandom3.h" -#include "TVector2.h" +#include "Common/Core/RecoDecay.h" +#include "Common/Core/TrackSelection.h" +#include "Common/Core/TrackSelectionDefaults.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "EventFiltering/filterTables.h" +#include "CommonConstants/MathConstants.h" #include "Framework/ASoA.h" #include "Framework/AnalysisDataModel.h" #include "Framework/AnalysisTask.h" -#include "Framework/O2DatabasePDGPlugin.h" #include "Framework/HistogramRegistry.h" +#include "Framework/O2DatabasePDGPlugin.h" #include "Framework/runDataProcessing.h" -#include "CommonConstants/MathConstants.h" -#include "Common/Core/TrackSelection.h" -#include "Common/Core/TrackSelectionDefaults.h" -#include "Common/Core/RecoDecay.h" -#include "Common/DataModel/EventSelection.h" -#include "Common/DataModel/TrackSelectionTables.h" - -#include "PWGJE/Core/FastJetUtilities.h" -#include "PWGJE/Core/JetFinder.h" -#include "PWGJE/Core/JetFindingUtilities.h" -#include "PWGJE/DataModel/Jet.h" - -#include "PWGJE/Core/JetDerivedDataUtilities.h" +#include "TRandom3.h" +#include "TVector2.h" -#include "EventFiltering/filterTables.h" +#include +#include +#include using namespace o2; using namespace o2::framework; @@ -82,7 +80,6 @@ struct RecoilJets { // List of configurable parameters for MC Configurable pTHatExponent{"pTHatExponent", 4.0, "Exponent of the event weight for the calculation of pTHat"}; Configurable pTHatMax{"pTHatMax", 999.0, "Maximum fraction of hard scattering for jet acceptance in MC"}; - Configurable pTHatMaxTrack{"pTHatMaxTrack", 999.0, "Maximum fraction of hard scattering for track acceptance in MC"}; // Parameters for recoil jet selection Configurable ptTTrefMin{"ptTTrefMin", 5., "Minimum pT of reference TT"}; @@ -130,17 +127,29 @@ struct RecoilJets { void init(InitContext const&) { - eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast(evSel)); - trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast(trkSel)); + std::string evSelToString = static_cast(evSel); + std::string trkSelToString = static_cast(trkSel); + + eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(evSelToString); + trackSelection = jetderiveddatautilities::initialiseTrackSelection(trkSelToString); triggerMaskBits = jetderiveddatautilities::initialiseTriggerMaskBits(triggerMasks); // List of raw and MC det. distributions if (doprocessData || doprocessMCDetLevel || doprocessMCDetLevelWeighted) { + spectra.add("hEventSelectionCount", "Count # of events in the analysis", kTH1F, {{3, 0.0, 3.}}); + spectra.get(HIST("hEventSelectionCount"))->GetXaxis()->SetBinLabel(1, "Total # of events"); + spectra.get(HIST("hEventSelectionCount"))->GetXaxis()->SetBinLabel(2, Form("# of events after sel. %s", evSelToString.data())); + spectra.get(HIST("hEventSelectionCount"))->GetXaxis()->SetBinLabel(3, "# of events w. outlier"); + spectra.add("vertexZ", "Z vertex of collisions", kTH1F, {{60, -12., 12.}}); spectra.add("hHasAssocMcCollision", "Has det. level coll. associat. MC coll.", kTH1F, {{2, 0.0, 2.}}); spectra.get(HIST("hHasAssocMcCollision"))->GetXaxis()->SetBinLabel(1, "Yes"); spectra.get(HIST("hHasAssocMcCollision"))->GetXaxis()->SetBinLabel(2, "No"); + spectra.add("hTrackSelectionCount", "Count # of tracks in the analysis", kTH1F, {{2, 0.0, 2.}}); + spectra.get(HIST("hTrackSelectionCount"))->GetXaxis()->SetBinLabel(1, "Total # of tracks"); + spectra.get(HIST("hTrackSelectionCount"))->GetXaxis()->SetBinLabel(2, Form("# of tracks after sel. %s", trkSelToString.data())); + spectra.add("hTrackPtEtaPhi", "Charact. of tracks", kTH3F, {pT, pseudorap, phiAngle}); spectra.add("hTTSig_pT", "pT spectrum of all found TT_{Sig} cand.", kTH1F, {{40, 10., 50.}}); // needed to distinguish merged data from diff. wagons @@ -228,28 +237,33 @@ struct RecoilJets { // Fill histograms with raw or MC det. level data template - void fillHistograms(Collision const& collision, Jets const& jets, Tracks const& tracks, bool bIsMC = false, float weight = 1.) + void fillHistograms(Collision const& collision, Jets const& jets, Tracks const& tracks, float weight = 1.) { - bool bSigEv = false; std::vector vPhiOfTT; double phiTT = 0.; int nTT = 0; - float pTHat = 0.; - if (bIsMC) - pTHat = getPtHat(weight); + float pTHat = getPtHat(weight); auto dice = rand->Rndm(); if (dice < fracSig) bSigEv = true; + // Remove whole event if jet passes the outlier removal condition + for (const auto& jet : jets) { + if (jet.pt() > pTHatMax * pTHat) { + spectra.fill(HIST("hEventSelectionCount"), 2.5); + return; + } + } + for (const auto& track : tracks) { - if (skipTrack(track)) - continue; + spectra.fill(HIST("hTrackSelectionCount"), 0.5); - if (bIsMC && (track.pt() > pTHatMaxTrack * pTHat)) + if (skipTrack(track)) continue; + spectra.fill(HIST("hTrackSelectionCount"), 1.5); spectra.fill(HIST("hTrackPtEtaPhi"), track.pt(), track.eta(), track.phi(), weight); // Search for TT candidate @@ -279,10 +293,6 @@ struct RecoilJets { } for (const auto& jet : jets) { - - if (bIsMC && (jet.pt() > pTHatMax * pTHat)) - continue; - spectra.fill(HIST("hJetPtEtaPhiRhoArea"), jet.pt(), jet.eta(), jet.phi(), collision.rho(), jet.area(), weight); if (nTT > 0) { @@ -327,6 +337,11 @@ struct RecoilJets { if (dice < fracSig) bSigEv = true; + for (const auto& jet : jets) { + if (jet.pt() > pTHatMax * pTHat) + return; + } + for (const auto& particle : particles) { auto pdgParticle = pdg->GetParticle(particle.pdgCode()); if (!pdgParticle) @@ -337,9 +352,6 @@ struct RecoilJets { if (bParticleNeutral || !particle.isPhysicalPrimary()) continue; - if (particle.pt() > pTHatMaxTrack * pTHat) - continue; - spectra.fill(HIST("hPartPtEtaPhi"), particle.pt(), particle.eta(), particle.phi(), weight); if (bSigEv && (particle.pt() > ptTTsigMin && particle.pt() < ptTTsigMax)) { @@ -367,10 +379,6 @@ struct RecoilJets { } for (const auto& jet : jets) { - - if (jet.pt() > pTHatMax * pTHat) - continue; - spectra.fill(HIST("hJetPtEtaPhiRhoArea_Part"), jet.pt(), jet.eta(), jet.phi(), collision.rho(), jet.area(), weight); if (nTT > 0) { @@ -410,13 +418,15 @@ struct RecoilJets { double phiTTSig = 0.; float pTHat = getPtHat(weight); + for (const auto& jetBase : jetsBase) { + if (jetBase.pt() > pTHatMax * pTHat) + return; + } + for (const auto& track : tracks) { if (skipTrack(track)) continue; - if (track.pt() > pTHatMaxTrack * pTHat) - continue; - if (track.pt() > ptTTsigMin && track.pt() < ptTTsigMax) { vPhiOfTT.push_back(track.phi()); } @@ -428,9 +438,6 @@ struct RecoilJets { phiTTSig = getPhiTT(vPhiOfTT); for (const auto& jetBase : jetsBase) { - if (jetBase.pt() > pTHatMax * pTHat) - continue; - bool bIsBaseJetRecoil = get<1>(isRecoilJet(jetBase, phiTTSig)) && bIsThereTTSig; dataForUnfolding(jetBase, jetsTag, bIsBaseJetRecoil, weight); } @@ -440,9 +447,13 @@ struct RecoilJets { FilteredTracks const& tracks, FilteredJets const& jets) { + spectra.fill(HIST("hEventSelectionCount"), 0.5); + if (skipEvent(collision)) return; + spectra.fill(HIST("hEventSelectionCount"), 1.5); + spectra.fill(HIST("vertexZ"), collision.posZ()); fillHistograms(collision, jets, tracks); } @@ -452,11 +463,14 @@ struct RecoilJets { FilteredTracks const& tracks, FilteredJetsDetLevel const& jets) { + spectra.fill(HIST("hEventSelectionCount"), 0.5); if (skipEvent(collision) || skipMBGapEvent(collision)) return; + spectra.fill(HIST("hEventSelectionCount"), 1.5); + spectra.fill(HIST("vertexZ"), collision.posZ()); - fillHistograms(collision, jets, tracks, true); + fillHistograms(collision, jets, tracks); } PROCESS_SWITCH(RecoilJets, processMCDetLevel, "process MC detector level", false); @@ -465,9 +479,12 @@ struct RecoilJets { FilteredTracks const& tracks, FilteredJetsDetLevel const& jets) { + spectra.fill(HIST("hEventSelectionCount"), 0.5); if (skipEvent(collision) || skipMBGapEvent(collision)) return; + spectra.fill(HIST("hEventSelectionCount"), 1.5); + auto weight = collision.mcCollision().weight(); spectra.fill(HIST("vertexZ"), collision.posZ(), weight); @@ -477,7 +494,7 @@ struct RecoilJets { spectra.fill(HIST("hHasAssocMcCollision"), 1.5, weight); } - fillHistograms(collision, jets, tracks, true, weight); + fillHistograms(collision, jets, tracks, weight); } PROCESS_SWITCH(RecoilJets, processMCDetLevelWeighted, "process MC detector level with event weight", false); From 81a3bd2a795eee8252790d793f413911ea591e69 Mon Sep 17 00:00:00 2001 From: prottayCMT <61418725+prottayCMT@users.noreply.github.com> Date: Thu, 12 Jun 2025 20:17:27 +0200 Subject: [PATCH 1601/1650] [PWGLF] adjusted size of 2D array for mixing in derived data (#11583) Co-authored-by: Prottay Das --- PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx index 33157c327bf..be85c214406 100644 --- a/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx +++ b/PWGLF/Tasks/Strangeness/taskLambdaSpinCorr.cxx @@ -985,8 +985,8 @@ struct LfTaskLambdaSpinCorr { auto groupV02 = V0s.sliceBy(tracksPerCollisionV0Mixed, collision1.index()); auto groupV03 = V0s.sliceBy(tracksPerCollisionV0Mixed, collision2.index()); - size_t rows = groupV03.size() + 20; - size_t cols = groupV01.size() + 20; + size_t rows = groupV03.size() + 1600; + size_t cols = groupV01.size() + 1600; std::vector> pairStatus(rows, std::vector(cols, false)); histos.fill(HIST("hv0Mult"), groupV01.size()); for (auto& [t1, t2] : soa::combinations(o2::soa::CombinationsFullIndexPolicy(groupV01, groupV02))) { From f0a3ad86ed9eb518aeb64ac9efab7663f6140506 Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Fri, 13 Jun 2025 03:20:06 +0800 Subject: [PATCH 1602/1650] [PWGCF] add TPC cross row (#11574) --- PWGCF/Flow/Tasks/flowTask.cxx | 6 ++- .../Tasks/diHadronCor.cxx | 39 ++++++++++++------- 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowTask.cxx b/PWGCF/Flow/Tasks/flowTask.cxx index 4390131be3a..7477aa90aed 100644 --- a/PWGCF/Flow/Tasks/flowTask.cxx +++ b/PWGCF/Flow/Tasks/flowTask.cxx @@ -65,7 +65,8 @@ struct FlowTask { O2_DEFINE_CONFIGURABLE(cfgCutPtMax, float, 10.0f, "Maximal pT for all tracks") O2_DEFINE_CONFIGURABLE(cfgCutEta, float, 0.8f, "Eta range for tracks") O2_DEFINE_CONFIGURABLE(cfgCutChi2prTPCcls, float, 2.5f, "max chi2 per TPC clusters") - O2_DEFINE_CONFIGURABLE(cfgCutTPCclu, float, 70.0f, "minimum TPC clusters") + O2_DEFINE_CONFIGURABLE(cfgCutTPCclu, float, 50.0f, "minimum TPC clusters") + O2_DEFINE_CONFIGURABLE(cfgCutTPCCrossedRows, float, 70.0f, "minimum TPC crossed rows") O2_DEFINE_CONFIGURABLE(cfgCutITSclu, float, 5.0f, "minimum ITS clusters") O2_DEFINE_CONFIGURABLE(cfgCutDCAz, float, 2.0f, "max DCA to vertex z") O2_DEFINE_CONFIGURABLE(cfgCutDCAxyppPass3Enabled, bool, false, "switch of ppPass3 DCAxy pt dependent cut") @@ -477,6 +478,7 @@ struct FlowTask { myTrackSel = getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibAny, TrackSelection::GlobalTrackRun3DCAxyCut::Default); myTrackSel.SetMinNClustersTPC(cfgCutTPCclu); + myTrackSel.SetMinNCrossedRowsTPC(cfgCutTPCCrossedRows); myTrackSel.SetMinNClustersITS(cfgCutITSclu); if (cfgCutDCAxyppPass3Enabled) myTrackSel.SetMaxDcaXYPtDep([](float pt) { return 0.004f + 0.013f / pt; }); // Tuned on the LHC22f anchored MC LHC23d1d on primary pions. 7 Sigmas of the resolution @@ -686,7 +688,7 @@ struct FlowTask { if (cfgTrkSelSwitch) { return myTrackSel.IsSelected(track); } else { - return ((track.tpcNClsFound() >= cfgCutTPCclu) && (track.itsNCls() >= cfgCutITSclu)); + return ((track.tpcNClsFound() >= cfgCutTPCclu) && (track.tpcNClsCrossedRows() >= cfgCutTPCCrossedRows) && (track.itsNCls() >= cfgCutITSclu)); } } diff --git a/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx b/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx index 189e201ef68..e79c61b3096 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx @@ -62,7 +62,8 @@ struct DiHadronCor { O2_DEFINE_CONFIGURABLE(cfgCutPtMax, float, 10.0f, "maximum accepted track pT") O2_DEFINE_CONFIGURABLE(cfgCutEta, float, 0.8f, "Eta cut") O2_DEFINE_CONFIGURABLE(cfgCutChi2prTPCcls, float, 2.5f, "max chi2 per TPC clusters") - O2_DEFINE_CONFIGURABLE(cfgCutTPCclu, float, 70.0f, "minimum TPC clusters") + O2_DEFINE_CONFIGURABLE(cfgCutTPCclu, float, 50.0f, "minimum TPC clusters") + O2_DEFINE_CONFIGURABLE(cfgCutTPCCrossedRows, float, 70.0f, "minimum TPC crossed rows") O2_DEFINE_CONFIGURABLE(cfgCutITSclu, float, 5.0f, "minimum ITS clusters") O2_DEFINE_CONFIGURABLE(cfgCutDCAz, float, 2.0f, "max DCA to vertex z") O2_DEFINE_CONFIGURABLE(cfgCutMerging, float, 0.0, "Merging cut on track merge") @@ -242,7 +243,11 @@ struct DiHadronCor { LOGF(fatal, "Full simulation and on-the-fly processing of mixed event not supported"); } if (doprocessMCSame || doprocessOntheflySame) { - registry.add("MCTrue/MCeventcount", "MCeventcount", {HistType::kTH1F, {{4, 0, 4, "bin"}}}); // histogram to see how many events are in the same and mixed event + registry.add("MCTrue/MCeventcount", "MCeventcount", {HistType::kTH1F, {{5, 0, 5, "bin"}}}); // histogram to see how many events are in the same and mixed event + registry.get(HIST("MCTrue/MCeventcount"))->GetXaxis()->SetBinLabel(2, "same all"); + registry.get(HIST("MCTrue/MCeventcount"))->GetXaxis()->SetBinLabel(3, "same reco"); + registry.get(HIST("MCTrue/MCeventcount"))->GetXaxis()->SetBinLabel(4, "mixed all"); + registry.get(HIST("MCTrue/MCeventcount"))->GetXaxis()->SetBinLabel(5, "mixed reco"); registry.add("MCTrue/MCCentrality", hCentTitle.c_str(), {HistType::kTH1D, {axisCentrality}}); registry.add("MCTrue/MCNch", "N_{ch}", {HistType::kTH1D, {axisMultiplicity}}); registry.add("MCTrue/MCzVtx", "MCzVtx", {HistType::kTH1D, {axisVertex}}); @@ -254,13 +259,15 @@ struct DiHadronCor { registry.add("MCTrue/MCdeltaEta_deltaPhi_mixed", "", {HistType::kTH2D, {axisDeltaPhi, axisDeltaEta}}); } if (doprocessMCEfficiency) { - registry.add("MCEffeventcount", "bin", {HistType::kTH1F, {{4, 0, 4, "bin"}}}); - registry.get(HIST("MCEffeventcount"))->GetXaxis()->SetBinLabel(1, "MC"); - registry.get(HIST("MCEffeventcount"))->GetXaxis()->SetBinLabel(2, "Reco Primary"); - registry.get(HIST("MCEffeventcount"))->GetXaxis()->SetBinLabel(3, "Reco All"); - registry.get(HIST("MCEffeventcount"))->GetXaxis()->SetBinLabel(4, "Fake"); + registry.add("MCEffeventcount", "bin", {HistType::kTH1F, {{5, 0, 5, "bin"}}}); + registry.get(HIST("MCEffeventcount"))->GetXaxis()->SetBinLabel(1, "All"); + registry.get(HIST("MCEffeventcount"))->GetXaxis()->SetBinLabel(2, "MC"); + registry.get(HIST("MCEffeventcount"))->GetXaxis()->SetBinLabel(3, "Reco Primary"); + registry.get(HIST("MCEffeventcount"))->GetXaxis()->SetBinLabel(4, "Reco All"); + registry.get(HIST("MCEffeventcount"))->GetXaxis()->SetBinLabel(5, "Fake"); } + LOGF(info, "Initializing correlation container"); std::vector corrAxis = {{axisSample, "Sample"}, {axisVertex, "z-vtx (cm)"}, {axisPtTrigger, "p_{T} (GeV/c)"}, @@ -276,6 +283,8 @@ struct DiHadronCor { same.setObject(new CorrelationContainer("sameEvent", "sameEvent", corrAxis, effAxis, userAxis)); mixed.setObject(new CorrelationContainer("mixedEvent", "mixedEvent", corrAxis, effAxis, userAxis)); + + LOGF(info, "End of init"); } int getMagneticField(uint64_t timestamp) @@ -319,7 +328,7 @@ struct DiHadronCor { template bool trackSelected(TTrack track) { - return ((track.tpcNClsFound() >= cfgCutTPCclu) && (track.itsNCls() >= cfgCutITSclu)); + return ((track.tpcNClsFound() >= cfgCutTPCclu) && (track.tpcNClsCrossedRows() >= cfgCutTPCCrossedRows) && (track.itsNCls() >= cfgCutITSclu)); } template @@ -727,13 +736,14 @@ struct DiHadronCor { void processMCEfficiency(FilteredMcCollisions::iterator const& mcCollision, soa::SmallGroups> const& collisions, FilteredMcParticles const& mcParticles, FilteredTracksWithMCLabels const& tracks) { - if (cfgSelCollByNch && (tracks.size() < cfgCutMultMin || tracks.size() >= cfgCutMultMax)) { + registry.fill(HIST("MCEffeventcount"), 0.5); + if (cfgSelCollByNch && (mcParticles.size() < cfgCutMultMin || mcParticles.size() >= cfgCutMultMax)) { return; } // Primaries for (const auto& mcParticle : mcParticles) { if (mcParticle.isPhysicalPrimary()) { - registry.fill(HIST("MCEffeventcount"), 0.5); + registry.fill(HIST("MCEffeventcount"), 1.5); same->getTrackHistEfficiency()->Fill(CorrelationContainer::MC, mcParticle.eta(), mcParticle.pt(), getSpecies(mcParticle.pdgCode()), 0., mcCollision.posZ()); } } @@ -746,16 +756,16 @@ struct DiHadronCor { for (const auto& track : groupedTracks) { if (track.has_mcParticle()) { - const auto& mcParticle = track.mcParticle(); + auto mcParticle = track.mcParticle(); if (mcParticle.isPhysicalPrimary()) { - registry.fill(HIST("MCEffeventcount"), 1.5); + registry.fill(HIST("MCEffeventcount"), 2.5); same->getTrackHistEfficiency()->Fill(CorrelationContainer::RecoPrimaries, mcParticle.eta(), mcParticle.pt(), getSpecies(mcParticle.pdgCode()), 0., mcCollision.posZ()); } - registry.fill(HIST("MCEffeventcount"), 2.5); + registry.fill(HIST("MCEffeventcount"), 3.5); same->getTrackHistEfficiency()->Fill(CorrelationContainer::RecoAll, mcParticle.eta(), mcParticle.pt(), getSpecies(mcParticle.pdgCode()), 0., mcCollision.posZ()); } else { // fake track - registry.fill(HIST("MCEffeventcount"), 3.5); + registry.fill(HIST("MCEffeventcount"), 4.5); same->getTrackHistEfficiency()->Fill(CorrelationContainer::Fake, track.eta(), track.pt(), 0, 0., mcCollision.posZ()); } } @@ -858,6 +868,7 @@ struct DiHadronCor { continue; } + registry.fill(HIST("MCTrue/MCeventcount"), 4.5); fillMCCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent, eventWeight); } } From a73abc968157b1c4fbc8128d864f67750fa99fde Mon Sep 17 00:00:00 2001 From: dajones2 <140733426+dajones2@users.noreply.github.com> Date: Thu, 12 Jun 2025 21:20:09 +0100 Subject: [PATCH 1603/1650] [PWGJE] Fixing recoil jet response to fill with delta phi (#11578) --- PWGJE/Tasks/jetHadronRecoil.cxx | 108 ++++++++++++++++++++++---------- 1 file changed, 75 insertions(+), 33 deletions(-) diff --git a/PWGJE/Tasks/jetHadronRecoil.cxx b/PWGJE/Tasks/jetHadronRecoil.cxx index 71946c49aee..97cd31cfb5c 100644 --- a/PWGJE/Tasks/jetHadronRecoil.cxx +++ b/PWGJE/Tasks/jetHadronRecoil.cxx @@ -446,17 +446,6 @@ struct JetHadronRecoil { return; } - for (const auto& mcdjetWTA : mcdjetsWTA) { - double djet = RecoDecay::sqrtSumOfSquares(RecoDecay::constrainAngle(jetBase.phi() - mcdjetWTA.phi(), -o2::constants::math::PI), jetBase.eta() - mcdjetWTA.eta()); - if (mcdjetWTA.pt() > pTHatMaxMCD * pTHat) { - continue; - } - if (djet < 0.6 * jetR) { - dR = djet; - break; - } - } - dR = getWTAaxisDifference(jetBase, mcdjetsWTA, tracks, true); if (jetBase.has_matchedJetGeo()) { @@ -481,6 +470,77 @@ struct JetHadronRecoil { } } + template + void fillRecoilJetMatchedHistograms(T const& jetsBase, V const& mcdjetsWTA, W const& mcpjetsWTA, U const&, X const& tracks, Y const& particles, float weight = 1.0, float rho = 0.0) + { + std::vector phiTTAr; + std::vector phiTTArPart; + double phiTT = 0; + double phiTTPart = 0; + int trigNumber = 0; + int nTT = 0; + float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); + + for (const auto& track : tracks) { + if (!track.has_mcParticle()) { + continue; + } + if (!jetderiveddatautilities::selectTrack(track, trackSelection)) { + continue; + } + if (track.pt() > pTHatTrackMaxMCD * pTHat) { + return; + } + if (track.pt() < ptTTsigMax && track.pt() > ptTTsigMin) { + phiTTAr.push_back(track.phi()); + nTT++; + auto particle = track.template mcParticle_as(); + phiTTArPart.push_back(particle.phi()); + } + } + + if (nTT > 0) { + trigNumber = rand->Integer(nTT); + phiTT = phiTTAr[trigNumber]; + phiTTPart = phiTTAr[trigNumber]; + } else { + return; + } + + for (const auto& jetBase : jetsBase) { + double dR = 0; + double dRp = 0; + + if (jetBase.pt() > pTHatMaxMCD * pTHat) { + return; + } + + float dphi = RecoDecay::constrainAngle(jetBase.phi() - phiTT); + dR = getWTAaxisDifference(jetBase, mcdjetsWTA, tracks, true); + + if (jetBase.has_matchedJetGeo()) { + for (const auto& jetTag : jetBase.template matchedJetGeo_as>()) { + if (jetTag.pt() > pTHatMaxMCP * pTHat) { + return; + } + + float dphip = RecoDecay::constrainAngle(jetTag.phi() - phiTTPart); + dRp = getWTAaxisDifference(jetTag, mcpjetsWTA, particles, true); + + registry.fill(HIST("hPtMatched"), jetBase.pt() - (rho * jetBase.area()), jetTag.pt(), weight); + registry.fill(HIST("hPhiMatched"), dphi, dphip, weight); + registry.fill(HIST("hPtResolution"), jetTag.pt(), (jetTag.pt() - (jetBase.pt() - (rho * jetBase.area()))) / jetTag.pt(), weight); + registry.fill(HIST("hPhiResolution"), dphip, dphip - dphi, weight); + registry.fill(HIST("hDeltaRMatched"), dR, dRp, weight); + registry.fill(HIST("hDeltaRResolution"), jetTag.pt(), dRp - dR, weight); + registry.fill(HIST("hFullMatching"), jetBase.pt() - (rho * jetBase.area()), jetTag.pt(), dphi, dphip, dR, dRp, weight); + registry.fill(HIST("hPtMatched1d"), jetTag.pt(), weight); + registry.fill(HIST("hDeltaRMatched1d"), dRp, weight); + } + } + } + } + void processData(soa::Filtered::iterator const& collision, soa::Filtered> const& jets, soa::Filtered> const& jetsWTA, @@ -711,7 +771,7 @@ struct JetHadronRecoil { soa::Filtered> const& mcdjets, soa::Filtered> const& mcdjetsWTA, soa::Filtered> const& mcpjetsWTA, - soa::Filtered const& tracks, + soa::Filtered const& tracks, soa::Filtered const& particles, aod::JetMcCollisions const&, soa::Filtered> const& mcpjets) @@ -724,16 +784,7 @@ struct JetHadronRecoil { } registry.fill(HIST("hZvtxSelected"), collision.posZ()); const auto& mcpjetsWTACut = mcpjetsWTA.sliceBy(partJetsPerCollision, collision.mcCollisionId()); - bool ishJetEvent = false; - for (const auto& track : tracks) { - if (track.pt() < ptTTsigMax && track.pt() > ptTTsigMin) { - ishJetEvent = true; - break; - } - } - if (ishJetEvent) { - fillMatchedHistograms(mcdjets, mcdjetsWTA, mcpjetsWTACut, mcpjets, tracks, particles); - } + fillRecoilJetMatchedHistograms(mcdjets, mcdjetsWTA, mcpjetsWTACut, mcpjets, tracks, particles); } PROCESS_SWITCH(JetHadronRecoil, processRecoilJetsMCPMCDMatched, "process MC matched (recoil jets)", false); @@ -741,7 +792,7 @@ struct JetHadronRecoil { soa::Filtered> const& mcdjets, soa::Filtered> const& mcdjetsWTA, soa::Filtered> const& mcpjetsWTA, - soa::Filtered const& tracks, + soa::Filtered const& tracks, soa::Filtered const& particles, aod::JetMcCollisions const&, soa::Filtered> const& mcpjets) @@ -754,16 +805,7 @@ struct JetHadronRecoil { } registry.fill(HIST("hZvtxSelected"), collision.posZ()); const auto& mcpjetsWTACut = mcpjetsWTA.sliceBy(partJetsPerCollision, collision.mcCollisionId()); - bool ishJetEvent = false; - for (const auto& track : tracks) { - if (track.pt() < ptTTsigMax && track.pt() > ptTTsigMin) { - ishJetEvent = true; - break; - } - } - if (ishJetEvent) { - fillMatchedHistograms(mcdjets, mcdjetsWTA, mcpjetsWTACut, mcpjets, tracks, particles, collision.mcCollision().weight()); - } + fillRecoilJetMatchedHistograms(mcdjets, mcdjetsWTA, mcpjetsWTACut, mcpjets, tracks, particles, collision.mcCollision().weight()); } PROCESS_SWITCH(JetHadronRecoil, processRecoilJetsMCPMCDMatchedWeighted, "process MC matched with event weights (recoil jets)", false); From 426fd5e2148688e5df43a42352a98a089932ee86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Thu, 12 Jun 2025 22:35:43 +0200 Subject: [PATCH 1604/1650] [PWGLF] Update inelGt.h (#11579) Co-authored-by: ALICE Builder --- PWGLF/Utils/inelGt.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/PWGLF/Utils/inelGt.h b/PWGLF/Utils/inelGt.h index 2ed513a902c..70c3de8ab4f 100644 --- a/PWGLF/Utils/inelGt.h +++ b/PWGLF/Utils/inelGt.h @@ -19,6 +19,10 @@ #ifndef PWGLF_UTILS_INELGT_H_ #define PWGLF_UTILS_INELGT_H_ +#include "Framework/O2DatabasePDGPlugin.h" + +#include "TParticlePDG.h" + #include namespace o2 From 446b30e59b26f1fd67f7316e9c86977e79337636 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Thu, 12 Jun 2025 22:40:10 +0200 Subject: [PATCH 1605/1650] [PWGHF,Tutorial] Include What You Use (#11589) --- Tutorials/PWGHF/skimCreatorMini.cxx | 2 -- Tutorials/PWGHF/taskMini.cxx | 1 - 2 files changed, 3 deletions(-) diff --git a/Tutorials/PWGHF/skimCreatorMini.cxx b/Tutorials/PWGHF/skimCreatorMini.cxx index 6fba171cfbf..e3aae5bbaf4 100644 --- a/Tutorials/PWGHF/skimCreatorMini.cxx +++ b/Tutorials/PWGHF/skimCreatorMini.cxx @@ -27,11 +27,9 @@ #include #include #include -#include #include #include #include -#include #include #include diff --git a/Tutorials/PWGHF/taskMini.cxx b/Tutorials/PWGHF/taskMini.cxx index 1876d6230cc..813e9879ce4 100644 --- a/Tutorials/PWGHF/taskMini.cxx +++ b/Tutorials/PWGHF/taskMini.cxx @@ -34,7 +34,6 @@ #include #include #include -#include #include #include From 91fe487f89e5b16a40fb036ae006b1886c1bf54d Mon Sep 17 00:00:00 2001 From: EmilGorm <50658075+EmilGorm@users.noreply.github.com> Date: Fri, 13 Jun 2025 00:12:51 +0200 Subject: [PATCH 1606/1650] [PWGCF] Add flag to disable ITS based track selection cuts (#11576) --- PWGCF/Flow/Tasks/flowPtEfficiency.cxx | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowPtEfficiency.cxx b/PWGCF/Flow/Tasks/flowPtEfficiency.cxx index 78dbc0fc731..217b6f7fb36 100644 --- a/PWGCF/Flow/Tasks/flowPtEfficiency.cxx +++ b/PWGCF/Flow/Tasks/flowPtEfficiency.cxx @@ -60,6 +60,7 @@ struct FlowPtEfficiency { O2_DEFINE_CONFIGURABLE(cfgCutDCAz, float, 2.0f, "DCAz cut for tracks") O2_DEFINE_CONFIGURABLE(cfgCutDCAxyppPass3Enabled, bool, false, "switch of ppPass3 DCAxy pt dependent cut") O2_DEFINE_CONFIGURABLE(cfgCutDCAzPtDepEnabled, bool, false, "switch of DCAz pt dependent cut") + O2_DEFINE_CONFIGURABLE(cfgEnableITSCuts, bool, true, "switch of enabling ITS based track selection cuts") O2_DEFINE_CONFIGURABLE(cfgSelRunNumberEnabled, bool, false, "switch of run number selection") O2_DEFINE_CONFIGURABLE(cfgFlowEnabled, bool, false, "switch of calculating flow") O2_DEFINE_CONFIGURABLE(cfgFlowNbootstrap, int, 30, "Number of subsamples") @@ -219,10 +220,12 @@ struct FlowPtEfficiency { fGFWReco->CreateRegions(); } - if (cfgTrkSelRun3ITSMatch) { - myTrackSel = getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSall7Layers, TrackSelection::GlobalTrackRun3DCAxyCut::Default); - } else { - myTrackSel = getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibAny, TrackSelection::GlobalTrackRun3DCAxyCut::Default); + if (cfgEnableITSCuts) { + if (cfgTrkSelRun3ITSMatch) { + myTrackSel = getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSall7Layers, TrackSelection::GlobalTrackRun3DCAxyCut::Default); + } else { + myTrackSel = getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibAny, TrackSelection::GlobalTrackRun3DCAxyCut::Default); + } } if (cfgCutDCAxyppPass3Enabled) { myTrackSel.SetMaxDcaXYPtDep([](float pt) { return 0.004f + 0.013f / pt; }); @@ -230,8 +233,9 @@ struct FlowPtEfficiency { myTrackSel.SetMaxDcaXY(cfgCutDCAxy); } myTrackSel.SetMinNClustersTPC(cfgCutTPCclu); - myTrackSel.SetMinNClustersITS(cfgCutITSclu); myTrackSel.SetMinNCrossedRowsTPC(cfgCutTPCcrossedrows); + if (cfgEnableITSCuts) + myTrackSel.SetMinNClustersITS(cfgCutITSclu); if (!cfgCutDCAzPtDepEnabled) myTrackSel.SetMaxDcaZ(cfgCutDCAz); } @@ -358,10 +362,12 @@ struct FlowPtEfficiency { template bool trackSelected(TTrack track) { - if (cfgkIsTrackGlobal && !track.isGlobalTrack()) + if (cfgkIsTrackGlobal && !track.isGlobalTrack()) { return false; - if (cfgCutDCAzPtDepEnabled && (track.dcaZ() > (0.004f + 0.013f / track.pt()))) + } + if (cfgCutDCAzPtDepEnabled && (track.dcaZ() > (0.004f + 0.013f / track.pt()))) { return false; + } return myTrackSel.IsSelected(track); } @@ -378,7 +384,6 @@ struct FlowPtEfficiency { if (!std::count(cfgRunNumberList.value.begin(), cfgRunNumberList.value.end(), runNumber)) return; } - float imp = 0; bool impFetched = false; float evPhi = 0; @@ -393,7 +398,6 @@ struct FlowPtEfficiency { fGFWReco->Clear(); } - for (const auto& track : tracks) { if (!trackSelected(track)) continue; From 29561560903c90a1985c66106c1630e620957dd1 Mon Sep 17 00:00:00 2001 From: Pritam Chakraborty <47203359+prchakra@users.noreply.github.com> Date: Fri, 13 Jun 2025 01:27:43 +0200 Subject: [PATCH 1607/1650] [PWGCF] FemtoUniverse: Addidng 3D histo of qLCMS vs deta vs deta (#11594) --- .../Core/FemtoUniverseDetaDphiStar.h | 37 ++++++++++++++++--- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h index 0a06b3513e8..bc4c6f1ea4e 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h @@ -68,6 +68,9 @@ class FemtoUniverseDetaDphiStar histdetadpimixed[0][0] = mHistogramRegistry->add((dirName + static_cast(HistNamesMixed[0][0])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); histdetadpimixed[0][1] = mHistogramRegistry->add((dirName + static_cast(HistNamesMixed[1][0])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); + histdetadpiqlcmssame = mHistogramRegistry->add((dirName + static_cast(HistNamesSame[1][7])).c_str(), "; #it{q}_{LCMS}; #Delta #eta; #Delta #phi", kTH3F, {{100, 0.0, 0.5}, {100, -0.15, 0.15}, {100, -0.15, 0.15}}); + histdetadpiqlcmsmixed = mHistogramRegistry->add((dirName + static_cast(HistNamesMixed[1][7])).c_str(), "; #it{q}_{LCMS}; #Delta #eta; #Delta #phi", kTH3F, {{100, 0.0, 0.5}, {100, -0.15, 0.15}, {100, -0.15, 0.15}}); + if (plotForEveryRadii) { for (int i = 0; i < 9; i++) { histdetadpiRadii[0][i] = mHistogramRegistryQA->add((dirName + static_cast(HistNamesRadii[0][i])).c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); @@ -407,23 +410,42 @@ class FemtoUniverseDetaDphiStar } } + /// Check if pair is close or not + template + void ClosePairqLCMS(Part const& part1, Part const& part2, float lmagfield, uint8_t ChosenEventType, double qlcms) // add typename Parts and variable parts for adding MClabels + { + magfield = lmagfield; + if constexpr (kPartOneType == o2::aod::femtouniverseparticle::ParticleType::kTrack && kPartTwoType == o2::aod::femtouniverseparticle::ParticleType::kTrack) { + auto deta = part1.eta() - part2.eta(); + auto dphiAvg = averagePhiStar(part1, part2, 0); + + if (ChosenEventType == femto_universe_container::EventType::same) { + histdetadpiqlcmssame->Fill(qlcms, deta, dphiAvg); + } else if (ChosenEventType == femto_universe_container::EventType::mixed) { + histdetadpiqlcmsmixed->Fill(qlcms, deta, dphiAvg); + } else { + LOG(fatal) << "FemtoUniverseDetaDphiStar: passed arguments don't agree with FemtoUniverseDetaDphiStar's type of events! Please provide same or mixed."; + } + } + } + private: HistogramRegistry* mHistogramRegistry = nullptr; ///< For main output HistogramRegistry* mHistogramRegistryQA = nullptr; ///< For QA output static constexpr std::string_view DirNames[6] = {"kTrack_kTrack/", "kTrack_kV0/", "kV0_kV0/", "kTrack_kPhi/", "kTrack_kD0/", "kCascade_kCascade/"}; - static constexpr std::string_view HistNamesSame[2][7] = {{"detadphidetadphi0BeforeSame_0", "detadphidetadphi0BeforeSame_1", "detadphidetadphi0BeforeSame_2", + static constexpr std::string_view HistNamesSame[2][8] = {{"detadphidetadphi0BeforeSame_0", "detadphidetadphi0BeforeSame_1", "detadphidetadphi0BeforeSame_2", "detadphidetadphi0BeforeSame_3", "detadphidetadphi0BeforeSame_4", "detadphidetadphi0BeforeSame_5", - "detadphidetadphi0BeforeSame_6"}, + "detadphidetadphi0BeforeSame_6", "detadphidetadphi0BeforeSameqLCMS"}, {"detadphidetadphi0AfterSame_0", "detadphidetadphi0AfterSame_1", "detadphidetadphi0AfterSame_2", "detadphidetadphi0AfterSame_3", "detadphidetadphi0AfterSame_4", "detadphidetadphi0AfterSame_5", - "detadphidetadphi0AfterSame_6"}}; - static constexpr std::string_view HistNamesMixed[2][7] = {{"detadphidetadphi0BeforeMixed_0", "detadphidetadphi0BeforeMixed_1", "detadphidetadphi0BeforeMixed_2", + "detadphidetadphi0AfterSame_6", "detadphidetadphi0AfterSameqLCMS"}}; + static constexpr std::string_view HistNamesMixed[2][8] = {{"detadphidetadphi0BeforeMixed_0", "detadphidetadphi0BeforeMixed_1", "detadphidetadphi0BeforeMixed_2", "detadphidetadphi0BeforeMixed_3", "detadphidetadphi0BeforeMixed_4", "detadphidetadphi0BeforeMixed_5", - "detadphidetadphi0BeforeMixed_6"}, + "detadphidetadphi0BeforeMixed_6", "detadphidetadphi0BeforeMixedqLCMS"}, {"detadphidetadphi0AfterMixed_0", "detadphidetadphi0AfterMixed_1", "detadphidetadphi0AfterMixed_2", "detadphidetadphi0AfterMixed_3", "detadphidetadphi0AfterMixed_4", "detadphidetadphi0AfterMixed_5", - "detadphidetadphi0AfterMixed_6"}}; + "detadphidetadphi0AfterMixed_6", "detadphidetadphi0AfterMixedqLCMS"}}; static constexpr std::string_view HistNamesRadii[7][9] = {{"detadphidetadphi0Before_0_0", "detadphidetadphi0Before_0_1", "detadphidetadphi0Before_0_2", "detadphidetadphi0Before_0_3", "detadphidetadphi0Before_0_4", "detadphidetadphi0Before_0_5", @@ -471,6 +493,9 @@ class FemtoUniverseDetaDphiStar std::array, 2>, 7> histdetadpimixed{}; std::array, 9>, 7> histdetadpiRadii{}; + std::shared_ptr histdetadpiqlcmssame{}; + std::shared_ptr histdetadpiqlcmsmixed{}; + /// Calculate phi at all required radii stored in TmpRadiiTPC /// Magnetic field to be provided in Tesla template From ba4929b47640228e91a464ae644e190b85e9e8ae Mon Sep 17 00:00:00 2001 From: Preet-Bhanjan Date: Fri, 13 Jun 2025 01:39:22 +0200 Subject: [PATCH 1608/1650] [PWGCF] Addition New PID function (#11582) Co-authored-by: Preet Pati Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/flowPbpbPikp.cxx | 127 ++++++++++++++++++++++++++---- 1 file changed, 113 insertions(+), 14 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowPbpbPikp.cxx b/PWGCF/Flow/Tasks/flowPbpbPikp.cxx index dfcf5fb42fc..1d979488da3 100644 --- a/PWGCF/Flow/Tasks/flowPbpbPikp.cxx +++ b/PWGCF/Flow/Tasks/flowPbpbPikp.cxx @@ -36,6 +36,7 @@ #include "Common/DataModel/TrackSelectionTables.h" #include "Common/DataModel/Centrality.h" #include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/PIDResponseITS.h" #include "Common/Core/trackUtilities.h" #include "Common/DataModel/Multiplicity.h" #include "CommonConstants/PhysicsConstants.h" @@ -82,13 +83,14 @@ struct FlowPbpbPikp { O2_DEFINE_CONFIGURABLE(cfgCutPtMax, float, 3.0f, "Maximal pT for ref tracks") O2_DEFINE_CONFIGURABLE(cfgCutEta, float, 0.8f, "Eta range for tracks") O2_DEFINE_CONFIGURABLE(cfgTpcCluster, int, 70, "Number of TPC clusters") + O2_DEFINE_CONFIGURABLE(cfgTpcCrossRows, int, 70, "Number of TPC clusters") O2_DEFINE_CONFIGURABLE(cfgCutChi2prTPCcls, float, 2.5, "Chi2 per TPC clusters") O2_DEFINE_CONFIGURABLE(cfgNbootstrap, int, 10, "Number of subsamples") O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeights, bool, true, "Fill and output NUA weights") O2_DEFINE_CONFIGURABLE(cfgOutputRunByRun, bool, true, "Fill and output NUA weights run by run") O2_DEFINE_CONFIGURABLE(cfgEfficiency, std::string, "", "CCDB path to efficiency object") O2_DEFINE_CONFIGURABLE(cfgAcceptance, std::string, "", "CCDB path to acceptance object") - O2_DEFINE_CONFIGURABLE(cfgTpcNsigmaCut, float, 2.0f, "TPC N-sigma cut for pions, kaons, protons") + O2_DEFINE_CONFIGURABLE(cfgTpcCut, float, 2.0f, "TPC N-sigma cut for pions, kaons, protons") O2_DEFINE_CONFIGURABLE(cfgTofPtCut, float, 0.5f, "Minimum pt to use TOF N-sigma") O2_DEFINE_CONFIGURABLE(cfgCutDCAxy, float, 2.0f, "DCAxy range for tracks") O2_DEFINE_CONFIGURABLE(cfgCutDCAz, float, 2.0f, "DCAz range for tracks") @@ -97,18 +99,20 @@ struct FlowPbpbPikp { O2_DEFINE_CONFIGURABLE(cfgCutOccupancyMax, int, 2000, "Maximum occupancy cut") O2_DEFINE_CONFIGURABLE(cfgUseGlobalTrack, bool, true, "use Global track") O2_DEFINE_CONFIGURABLE(cfgITScluster, int, 5, "Number of ITS cluster") - O2_DEFINE_CONFIGURABLE(cfgTrackDensityCorrUse, bool, true, "Use track density efficiency correction") + O2_DEFINE_CONFIGURABLE(cfgTrackDensityCorrUse, bool, false, "Use track density efficiency correction") O2_DEFINE_CONFIGURABLE(cfgUseWeightPhiEtaVtxz, bool, false, "Use Phi, Eta, VertexZ dependent NUA weights") O2_DEFINE_CONFIGURABLE(cfgUseWeightPhiPtCent, bool, false, "Use Phi, Pt, Centrality dependent NUA weights") O2_DEFINE_CONFIGURABLE(cfgUseWeightPhiEtaPt, bool, true, "Use Phi, Eta, Pt dependent NUA weights") O2_DEFINE_CONFIGURABLE(cfgUseStrictPID, bool, true, "Use strict PID cuts for TPC") O2_DEFINE_CONFIGURABLE(cfgV0AT0Acut, int, 5, "V0AT0A cut") + O2_DEFINE_CONFIGURABLE(cfgUseAsymmetricPID, bool, false, "Use asymmetric PID cuts"); Configurable> cfgTrackDensityP0{"cfgTrackDensityP0", std::vector{0.7217476707, 0.7384792571, 0.7542625668, 0.7640680200, 0.7701951667, 0.7755299053, 0.7805901710, 0.7849446786, 0.7957356586, 0.8113039262, 0.8211968966, 0.8280558878, 0.8329342135}, "parameter 0 for track density efficiency correction"}; Configurable> cfgTrackDensityP1{"cfgTrackDensityP1", std::vector{-2.169488e-05, -2.191913e-05, -2.295484e-05, -2.556538e-05, -2.754463e-05, -2.816832e-05, -2.846502e-05, -2.843857e-05, -2.705974e-05, -2.477018e-05, -2.321730e-05, -2.203315e-05, -2.109474e-05}, "parameter 1 for track density efficiency correction"}; - Configurable> cfgTofNsigmaCut{"cfgTofNsigmaCut", std::vector{1.5, 1.5, 1.5}, "TOF n-sigma cut for pions, kaons, protons"}; - Configurable> cfgItsNsigmaCut{"cfgItsNsigmaCut", std::vector{3, 2.5, 2}, "ITS n-sigma cut for pions, kaons, protons"}; + Configurable> cfgTofNsigmaCut{"cfgTofNsigmaCut", std::vector{1.5, 1.5, 1.5, -1.5, -1.5, -1.5}, "TOF n-sigma cut for pions_posNsigma, kaons_posNsigma, protons_posNsigma, pions_negNsigma, kaons_negNsigma, protons_negNsigma"}; + Configurable> cfgItsNsigmaCut{"cfgItsNsigmaCut", std::vector{3, 2.5, 2, 3, 2.5, 2}, "ITS n-sigma cut for pions_posNsigma, kaons_posNsigma, protons_posNsigma, pions_negNsigma, kaons_negNsigma, protons_negNsigma"}; + Configurable> cfgTpcNsigmaCut{"cfgTpcNsigmaCut", std::vector{1.5, 1.5, 1.5, -1.5, -1.5, -1.5}, "TOF n-sigma cut for pions_posNsigma, kaons_posNsigma, protons_posNsigma, pions_negNsigma, kaons_negNsigma, protons_negNsigma"}; Configurable> cfgUseEventCuts{"cfgUseEventCuts", std::vector{1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0}, "Switch for various event cuts [kNoTimeFrameBorder, kNoITSROFrameBorder, kNoSameBunchPileup, kIsGoodZvtxFT0vsPV, kNoCollInTimeRangeStandard, kIsGoodITSLayersAll, kNoCollInRofStandard, kNoHighMultCollInPrevRof, Occupancy, Multiplicity correlation, T0AV0A 3 sigma cut, kIsVertexITSTPC, kTVXinTRD]"}; Configurable cfgRegions{"cfgRegions", {{"refN08", "refP08", "full", "poiN", "olN", "poiP", "olP", "poi", "ol", "poiNpi", "olNpi", "poiPpi", "olPpi", "poifullpi", "olfullpi", "poiNka", "olNka", "poiPka", "olPka", "poifullka", "olfullka", "poiNpr", "olNpr", "poiPpr", "olPpr", "poifullpr", "olfullpr"}, {-0.8, 0.4, -0.8, -0.8, -0.8, 0.4, 0.4, -0.8, -0.8, -0.8, -0.8, 0.4, 0.4, -0.8, -0.8, -0.8, -0.8, 0.4, 0.4, -0.8, -0.8, -0.8, -0.8, 0.4, 0.4, -0.8, -0.8}, {-0.4, 0.8, 0.8, -0.4, -0.4, 0.8, 0.8, 0.8, 0.8, -0.4, -0.4, 0.8, 0.8, 0.8, 0.8, -0.4, -0.4, 0.8, 0.8, 0.8, 0.8, -0.4, -0.4, 0.8, 0.8, 0.8, 0.8}, {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 128, 256, 128, 256, 128, 256, 2, 16, 2, 16, 2, 16, 4, 32, 4, 32, 4, 32, 8, 64, 8, 64, 8, 64}}, "Configurations for GFW regions"}; @@ -123,9 +127,11 @@ struct FlowPbpbPikp { ConfigurableAxis axisNsigmaTOF{"axisNsigmaTOF", {80, -5, 5}, "nsigmaTOF axis"}; ConfigurableAxis axisParticles{"axisParticles", {3, 0, 3}, "axis for different hadrons"}; ConfigurableAxis axisTPCsignal{"axisTPCsignal", {10000, 0, 1000}, "axis for TPC signal"}; + ConfigurableAxis axisTOFbeta{"axisTOFbeta", {200, 0, 2}, "axis for TOF beta"}; std::vector tofNsigmaCut = cfgTofNsigmaCut; std::vector itsNsigmaCut = cfgItsNsigmaCut; + std::vector tpcNsigmaCut = cfgTofNsigmaCut; Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; Filter trackFilter = (nabs(aod::track::dcaXY) < cfgCutDCAxy) && (nabs(aod::track::dcaZ) < cfgCutDCAz) && (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtPOIMin) && (aod::track::pt < cfgCutPtPOIMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls); @@ -238,11 +244,15 @@ struct FlowPbpbPikp { histos.add("c24_full_pi", "", {HistType::kTProfile, {axisMultiplicity}}); histos.add("c24_full_ka", "", {HistType::kTProfile, {axisMultiplicity}}); histos.add("c24_full_pr", "", {HistType::kTProfile, {axisMultiplicity}}); + + histos.add("TpcdEdx", "", {HistType::kTH2D, {axisPt, axisTPCsignal}}); + histos.add("TofBeta", "", {HistType::kTH2D, {axisPt, axisTOFbeta}}); + histos.add("TofTpcNsigma_before", "", {HistType::kTHnSparseD, {{axisParticles, axisNsigmaTPC, axisNsigmaTOF, axisPt}}}); histos.add("TofTpcNsigma_after", "", {HistType::kTHnSparseD, {{axisParticles, axisNsigmaTPC, axisNsigmaTOF, axisPt}}}); histos.add("partCount", "", {HistType::kTHnSparseD, {{axisParticles, axisMultiplicity, axisPt}}}); - histos.add("hEventCount", "Number of Event;; Count", {HistType::kTH1D, {{15, 0, 15}}}); + histos.add("hEventCount", "Number of Events;; Count", {HistType::kTH1D, {{15, 0, 15}}}); histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(1, "Filtered event"); histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(2, "After sel8"); histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(3, "kNoTimeFrameBorder"); @@ -259,6 +269,18 @@ struct FlowPbpbPikp { histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(14, "kIsVertexITSTPC"); histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(15, "kTVXinTRD"); + histos.add("hTrackCount", "Number of Tracks;; Count", {HistType::kTH1D, {{10, 0, 10}}}); + histos.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(1, "Filtered track"); + histos.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(2, "Global tracks"); + histos.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(3, "PV contributor"); + histos.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(4, "ITS clusters"); + histos.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(5, "TPC signal"); + histos.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(6, "TPC clusters"); + histos.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(7, "TPC crossed rows"); + histos.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(8, "Pions"); + histos.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(9, "Kaons"); + histos.get(HIST("hTrackCount"))->GetXaxis()->SetBinLabel(10, "Protons"); + if (cfgOutputNUAWeights && !cfgOutputRunByRun) { histos.add("NUA/hPhiEtaVtxz_ref", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, axisEta, axisVertex}}); histos.add("NUA/hPhiEtaVtxz_ch", ";#varphi;#eta;v_{z}", {HistType::kTH3D, {axisPhi, axisEta, axisVertex}}); @@ -386,13 +408,38 @@ struct FlowPbpbPikp { template bool selectionTrack(const TTrack& track) { - if (cfgUseGlobalTrack && !(track.isGlobalTrack() && track.isPVContributor() && track.itsNCls() > cfgITScluster && track.tpcNClsFound() > cfgTpcCluster && track.hasTPC())) { - return false; + histos.fill(HIST("hTrackCount"), 0.5); // Filtered tracks + if (cfgUseGlobalTrack && !(track.isGlobalTrack())) { + return 0; } - if (!cfgUseGlobalTrack && !(track.isPVContributor() && track.itsNCls() > cfgITScluster && track.hasTPC())) { - return false; + if (cfgUseGlobalTrack) + histos.fill(HIST("hTrackCount"), 1.5); // After global track selection + + if (!(track.isPVContributor())) { + return 0; } - return true; + histos.fill(HIST("hTrackCount"), 2.5); // After PV contributor selection + + if (!(track.itsNCls() > cfgITScluster)) { + return 0; + } + histos.fill(HIST("hTrackCount"), 3.5); // After ITS cluster selection + + if (!(track.hasTPC())) { + return 0; + } + histos.fill(HIST("hTrackCount"), 4.5); // If track has TPC signal + + if (!(track.tpcNClsFound() > cfgTpcCluster)) { + return 0; + } + histos.fill(HIST("hTrackCount"), 5.5); // After TPC cluster selection + + if (!(track.tpcNClsCrossedRows() > cfgTpcCrossRows)) { + return 0; + } + histos.fill(HIST("hTrackCount"), 6.5); // After TPC crossed rows selection + return 1; } template @@ -402,6 +449,7 @@ struct FlowPbpbPikp { switch (pidIndex) { case 1: histos.fill(HIST("TofTpcNsigma_after"), pidIndex - 1, track.tpcNSigmaPi(), track.tofNSigmaPi(), track.pt()); + histos.fill(HIST("hTrackCount"), 7.5); // Pion count if (!cfgAcceptance.value.empty() && cfgUseWeightPhiEtaVtxz) histos.fill(HIST("PhiCorrected/hPhiEtaVtxz_pi_corrd"), track.phi(), track.eta(), collision.posZ(), wacc); // pion weights if (!cfgAcceptance.value.empty() && cfgUseWeightPhiPtCent) @@ -411,6 +459,7 @@ struct FlowPbpbPikp { break; case 2: histos.fill(HIST("TofTpcNsigma_after"), pidIndex - 1, track.tpcNSigmaKa(), track.tofNSigmaKa(), track.pt()); + histos.fill(HIST("hTrackCount"), 8.5); // Kaon count if (!cfgAcceptance.value.empty() && cfgUseWeightPhiEtaVtxz) histos.fill(HIST("PhiCorrected/hPhiEtaVtxz_ka_corrd"), track.phi(), track.eta(), collision.posZ(), wacc); // kaon weights if (!cfgAcceptance.value.empty() && cfgUseWeightPhiPtCent) @@ -420,6 +469,7 @@ struct FlowPbpbPikp { break; case 3: histos.fill(HIST("TofTpcNsigma_after"), pidIndex - 1, track.tpcNSigmaPr(), track.tofNSigmaPr(), track.pt()); + histos.fill(HIST("hTrackCount"), 9.5); // Proton count if (!cfgAcceptance.value.empty() && cfgUseWeightPhiEtaVtxz) histos.fill(HIST("PhiCorrected/hPhiEtaVtxz_pr_corrd"), track.phi(), track.eta(), collision.posZ(), wacc); // proton weights if (!cfgAcceptance.value.empty() && cfgUseWeightPhiPtCent) @@ -437,12 +487,12 @@ struct FlowPbpbPikp { std::array nSigmaTPC = {track.tpcNSigmaPi(), track.tpcNSigmaKa(), track.tpcNSigmaPr()}; std::array nSigmaCombined = {std::hypot(track.tpcNSigmaPi(), track.tofNSigmaPi()), std::hypot(track.tpcNSigmaKa(), track.tofNSigmaKa()), std::hypot(track.tpcNSigmaPr(), track.tofNSigmaPr())}; int pid = -1; - float nsigma = cfgTpcNsigmaCut; + float nsigma = cfgTpcCut; // Choose which nSigma to use std::array nSigmaToUse = (track.pt() > cfgTofPtCut && track.hasTOF()) ? nSigmaCombined : nSigmaTPC; if (track.pt() > cfgTofPtCut && !track.hasTOF()) - return -1; + return 0; const int numSpecies = 3; int pidCount = 0; @@ -450,7 +500,7 @@ struct FlowPbpbPikp { for (int i = 0; i < numSpecies; ++i) { if (std::abs(nSigmaToUse[i]) < nsigma) { if (pidCount > 0 && cfgUseStrictPID) - return -1; // more than one particle with low nsigma + return 0; // more than one particle with low nsigma pidCount++; pid = i; @@ -461,6 +511,52 @@ struct FlowPbpbPikp { return pid + 1; // shift the pid by 1, 1 = pion, 2 = kaon, 3 = proton } + template + int getNsigmaPIDTpcTofAssymmetric(TTrack track) + { + // Computing Nsigma arrays for pion, kaon, and protons + std::array nSigmaTPC = {track.tpcNSigmaPi(), track.tpcNSigmaKa(), track.tpcNSigmaPr()}; + std::array nSigmaTOF = {track.tofNSigmaPi(), track.tofNSigmaKa(), track.tofNSigmaPr()}; + int pid = -1; + + bool isPion, isKaon, isProton; + bool isTpcPion = nSigmaTPC[0] < tpcNsigmaCut[0] && nSigmaTPC[0] > tpcNsigmaCut[0 + 3]; + bool isTpcKaon = nSigmaTPC[1] < tpcNsigmaCut[1] && nSigmaTPC[1] > tpcNsigmaCut[1 + 3]; + bool isTpcProton = nSigmaTPC[2] < tpcNsigmaCut[2] && nSigmaTPC[2] > tpcNsigmaCut[2 + 3]; + + bool isTofPion = nSigmaTOF[0] < tofNsigmaCut[0] && nSigmaTOF[0] > tofNsigmaCut[0 + 3]; + bool isTofKaon = nSigmaTOF[1] < tofNsigmaCut[1] && nSigmaTOF[1] > tofNsigmaCut[1 + 3]; + bool isTofProton = nSigmaTOF[2] < tofNsigmaCut[2] && nSigmaTOF[2] > tofNsigmaCut[2 + 3]; + + if (track.pt() > cfgTofPtCut && !track.hasTOF()) { + return 0; + } else if (track.pt() > cfgTofPtCut && track.hasTOF()) { + isPion = isTofPion && isTpcPion; + isKaon = isTofKaon && isTpcKaon; + isProton = isTofProton && isTpcProton; + } else { + isPion = isTpcPion; + isKaon = isTpcKaon; + isProton = isTpcProton; + } + + if ((isPion && isKaon) || (isPion && isProton) || (isKaon && isProton)) { + return 0; // more than one particle satisfy the criteria + } + + if (isPion) { + pid = PIONS; + } else if (isKaon) { + pid = KAONS; + } else if (isProton) { + pid = PROTONS; + } else { + return 0; // no particle satisfies the criteria + } + + return pid + 1; // shift the pid by 1, 1 = pion, 2 = kaon, 3 = proton + } + template void fillProfile(const GFW::CorrConfig& corrconf, const ConstStr& tarName, const double& cent) { @@ -814,6 +910,9 @@ struct FlowPbpbPikp { histos.fill(HIST("hEta"), track.eta()); histos.fill(HIST("hPt"), pt); + histos.fill(HIST("TpcdEdx"), pt, track.tpcSignal()); + histos.fill(HIST("TofBeta"), pt, track.beta()); + histos.fill(HIST("TofTpcNsigma_before"), PIONS, track.tpcNSigmaPi(), track.tofNSigmaPi(), pt); histos.fill(HIST("TofTpcNsigma_before"), KAONS, track.tpcNSigmaKa(), track.tofNSigmaKa(), pt); histos.fill(HIST("TofTpcNsigma_before"), PROTONS, track.tpcNSigmaPr(), track.tofNSigmaPr(), pt); @@ -821,7 +920,7 @@ struct FlowPbpbPikp { bool withinPtPOI = (cfgCutPtPOIMin < pt) && (pt < cfgCutPtPOIMax); // within POI pT range bool withinPtRef = (cfgCutPtMin < pt) && (pt < cfgCutPtMax); // within RF pT range - pidIndex = getNsigmaPIDTpcTof(track); + pidIndex = cfgUseAsymmetricPID ? getNsigmaPIDTpcTofAssymmetric(track) : getNsigmaPIDTpcTof(track); weff = 1; // Initializing weff for each track // NUA weights From b4b77c78cf73addb19930e6437a9cb485cac8f55 Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Fri, 13 Jun 2025 07:10:26 +0200 Subject: [PATCH 1609/1650] [Common] Unified, simple, fully self-configuring mult/cent provider (#11495) Co-authored-by: David Dobrigkeit Chinellato Co-authored-by: ALICE Builder Co-authored-by: romainschotter Co-authored-by: SCHOTTER Romain <47983209+romainschotter@users.noreply.github.com> --- Common/DataModel/Centrality.h | 9 + Common/TableProducer/CMakeLists.txt | 5 + Common/TableProducer/multCentTable.cxx | 204 ++++ Common/Tools/MultModule.h | 1336 ++++++++++++++++++++++++ 4 files changed, 1554 insertions(+) create mode 100644 Common/TableProducer/multCentTable.cxx create mode 100644 Common/Tools/MultModule.h diff --git a/Common/DataModel/Centrality.h b/Common/DataModel/Centrality.h index c3074a63c67..fa7e2ec51bc 100644 --- a/Common/DataModel/Centrality.h +++ b/Common/DataModel/Centrality.h @@ -60,6 +60,11 @@ DECLARE_SOA_TABLE(CentMFTs, "AOD", "CENTMFT", cent::CentMFT); //! Ru // Run 3 variant tables DECLARE_SOA_TABLE(CentFT0CVariant1s, "AOD", "CENTFT0Cvar1", cent::CentFT0CVariant1); //! Run 3 FT0C variant 1 +// Run 3 centrality per BC (joinable with BC) +DECLARE_SOA_TABLE(BCCentFT0Ms, "AOD", "BCCENTFT0M", cent::CentFT0M, o2::soa::Marker<1>); //! Run 3 FT0M BC centrality table +DECLARE_SOA_TABLE(BCCentFT0As, "AOD", "BCCENTFT0A", cent::CentFT0A, o2::soa::Marker<1>); //! Run 3 FT0A BC centrality table +DECLARE_SOA_TABLE(BCCentFT0Cs, "AOD", "BCCENTFT0C", cent::CentFT0C, o2::soa::Marker<1>); //! Run 3 FT0C BC centrality table + using CentRun2V0M = CentRun2V0Ms::iterator; using CentRun2V0A = CentRun2V0As::iterator; using CentRun2SPDTrk = CentRun2SPDTrks::iterator; @@ -77,6 +82,10 @@ using CentNTPV = CentNTPVs::iterator; using CentNGlobal = CentNGlobals::iterator; using CentMFT = CentMFTs::iterator; +using BCCentFT0M = BCCentFT0Ms::iterator; +using BCCentFT0A = BCCentFT0As::iterator; +using BCCentFT0C = BCCentFT0Cs::iterator; + template concept HasRun2Centrality = requires(T&& t) { { t.centRun2V0M() }; diff --git a/Common/TableProducer/CMakeLists.txt b/Common/TableProducer/CMakeLists.txt index d2d59ea2506..62211406807 100644 --- a/Common/TableProducer/CMakeLists.txt +++ b/Common/TableProducer/CMakeLists.txt @@ -32,6 +32,11 @@ o2physics_add_dpl_workflow(multiplicity-table PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(multcenttable + SOURCES multCentTable.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(multiplicity-extra-table SOURCES multiplicityExtraTable.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore diff --git a/Common/TableProducer/multCentTable.cxx b/Common/TableProducer/multCentTable.cxx new file mode 100644 index 00000000000..421e813bad4 --- /dev/null +++ b/Common/TableProducer/multCentTable.cxx @@ -0,0 +1,204 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file multCentTable.cxx +/// \brief unified, self-configuring mult/cent provider +/// \author ALICE + +//=============================================================== +// +// Unified, self-configuring multiplicity+centrality task +// still work in progress: use at your own discretion +// +//=============================================================== + +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/runDataProcessing.h" +#include "Framework/RunningWorkflowInfo.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/Core/trackUtilities.h" +#include "ReconstructionDataFormats/DCA.h" +#include "DetectorsBase/Propagator.h" +#include "DetectorsBase/GeometryManager.h" +#include "CommonUtils/NameConf.h" +#include "CCDB/CcdbApi.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "CCDB/BasicCCDBManager.h" +#include "Framework/HistogramRegistry.h" +#include "DataFormatsCalibration/MeanVertexObject.h" +#include "CommonConstants/GeomConstants.h" +#include "Common/Tools/TrackPropagationModule.h" +#include "Common/Tools/StandardCCDBLoader.h" +#include "Framework/O2DatabasePDGPlugin.h" +#include "MetadataHelper.h" +#include "Common/Tools/MultModule.h" + +using namespace o2; +using namespace o2::framework; +// using namespace o2::framework::expressions; + +MetadataHelper metadataInfo; // Metadata helper + +struct MultCentTable { + o2::common::multiplicity::standardConfigurables opts; + o2::common::multiplicity::products products; + o2::common::multiplicity::MultModule module; + + // CCDB boilerplate declarations + o2::framework::Configurable ccdburl{"ccdburl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Service ccdb; + Service pdg; + + // hold multiplicity values for layover to centrality calculation + std::vector mults; + + // slicers + Preslice> slicerTracksIU = o2::aod::track::collisionId; + Preslice> slicerTracksIUwithSelections = o2::aod::track::collisionId; + Preslice> slicerTrackRun2 = o2::aod::track::collisionId; + + void init(o2::framework::InitContext& initContext) + { + // CCDB boilerplate init + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setURL(ccdburl.value); + + // task-specific + module.init(opts, initContext); + } + + void processRun2(soa::Join const& collisions, + soa::Join const& tracks, + soa::Join const& bcs, + aod::Zdcs const&, + aod::FV0As const&, + aod::FV0Cs const&, + aod::FT0s const&) + { + mults.clear(); + for (auto const& collision : collisions) { + o2::common::multiplicity::multEntry mult; + const auto& bc = bcs.rawIteratorAt(collision.getId()); + const uint64_t collIdx = collision.globalIndex(); + auto tracksThisCollision = tracks.sliceBy(slicerTrackRun2, collIdx); + mult = module.collisionProcessRun2(collision, tracksThisCollision, bc, products); + mults.push_back(mult); + } + } + + void processRun3(soa::Join const& collisions, + soa::Join const& tracks, + soa::Join const&, + aod::Zdcs const&, + aod::FV0As const&, + aod::FT0s const&, + aod::FDDs const&) + { + mults.clear(); + for (auto const& collision : collisions) { + o2::common::multiplicity::multEntry mult; + const auto& bc = collision.bc_as>(); + const uint64_t collIdx = collision.globalIndex(); + auto tracksThisCollision = tracks.sliceBy(slicerTracksIU, collIdx); + mult = module.collisionProcessRun3(ccdb, metadataInfo, collision, tracksThisCollision, bc, products); + mults.push_back(mult); + } + } + + void processRun3WithGlobalCounters(soa::Join const& collisions, + soa::Join const& tracks, + soa::Join const&, + aod::Zdcs const&, + aod::FV0As const&, + aod::FT0s const&, + aod::FDDs const&) + { + mults.clear(); + for (auto const& collision : collisions) { + o2::common::multiplicity::multEntry mult; + const auto& bc = collision.bc_as>(); + const uint64_t collIdx = collision.globalIndex(); + auto tracksThisCollision = tracks.sliceBy(slicerTracksIUwithSelections, collIdx); + mult = module.collisionProcessRun3(ccdb, metadataInfo, collision, tracksThisCollision, bc, products); + mults.push_back(mult); + } + } + void processMFT(soa::Join::iterator const& collision, + o2::aod::MFTTracks const& mfttracks, + soa::SmallGroups const& retracks) + { + if (opts.mEnabledTables[o2::common::multiplicity::kMFTMults]) { + // populates MFT information in the mults buffer (in addition to filling table) + module.collisionProcessMFT(collision, mfttracks, retracks, mults, products); + } + } + void processMonteCarlo(aod::McCollision const& mcCollision, aod::McParticles const& mcParticles) + { + if (opts.mEnabledTables[o2::common::multiplicity::kMultMCExtras]) { + module.collisionProcessMonteCarlo(mcCollision, mcParticles, pdg, products); + } + } + void processMonteCarlo2Mults(soa::Join::iterator const& collision) + { + if (opts.mEnabledTables[o2::common::multiplicity::kMult2MCExtras]) { + // establish simple interlink for posterior analysis (derived data) + products.tableExtraMult2MCExtras(collision.mcCollisionId()); + } + } + void processCentralityRun2(aod::Collisions const& collisions, soa::Join const& bcs) + { + // it is important that this function is at the end of the other process functions. + // it requires `mults` to be properly set, which will only happen after the other process + // functions have been called. + + // internally, the function below will do nothing if no centrality is requested. + // it is thus safer to always keep the actual process function for centrality + // generation to true, since the requisites for being in this context are + // always fulfilled + if (collisions.size() != static_cast(mults.size())) { + LOGF(fatal, "Size of collisions doesn't match size of multiplicity buffer!"); + } + module.generateCentralitiesRun2(ccdb, metadataInfo, bcs, mults, products); + } + void processCentralityRun3(aod::Collisions const& collisions, soa::Join const& bcs, aod::FT0s const&) + { + // it is important that this function is at the end of the other process functions. + // it requires `mults` to be properly set, which will only happen after the other process + // functions have been called. + + // internally, the function below will do nothing if no centrality is requested. + // it is thus safer to always keep the actual process function for centrality + // generation to true, since the requisites for being in this context are + // always fulfilled + if (collisions.size() != static_cast(mults.size())) { + LOGF(fatal, "Size of collisions doesn't match size of multiplicity buffer!"); + } + module.generateCentralitiesRun3(ccdb, metadataInfo, bcs, mults, products); + } + + PROCESS_SWITCH(MultCentTable, processRun2, "Process Run 2", false); + PROCESS_SWITCH(MultCentTable, processRun3, "Process Run 3", true); + PROCESS_SWITCH(MultCentTable, processRun3WithGlobalCounters, "Process Run 3 + global tracking counters", false); + PROCESS_SWITCH(MultCentTable, processMFT, "Process MFT info", false); + PROCESS_SWITCH(MultCentTable, processMonteCarlo, "Process Monte Carlo information", false); + PROCESS_SWITCH(MultCentTable, processMonteCarlo2Mults, "Process Monte Carlo information", false); + PROCESS_SWITCH(MultCentTable, processCentralityRun2, "Generate Run 2 centralities", false); + PROCESS_SWITCH(MultCentTable, processCentralityRun3, "Generate Run 3 centralities", true); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + metadataInfo.initMetadata(cfgc); + WorkflowSpec workflow{adaptAnalysisTask(cfgc)}; + return workflow; +} diff --git a/Common/Tools/MultModule.h b/Common/Tools/MultModule.h new file mode 100644 index 00000000000..07397131b68 --- /dev/null +++ b/Common/Tools/MultModule.h @@ -0,0 +1,1336 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file MultModule.h +/// \brief combined multiplicity + centrality module with autodetect features +/// \author ALICE + +#ifndef COMMON_TOOLS_MULTMODULE_H_ +#define COMMON_TOOLS_MULTMODULE_H_ + +#include +#include +#include +#include +#include +#include +#include +#include "Framework/AnalysisDataModel.h" +#include "Framework/Configurable.h" +#include "Framework/HistogramSpec.h" +#include "TableHelper.h" +#include "Common/Core/TPCVDriftManager.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/Centrality.h" +#include "PWGMM/Mult/DataModel/bestCollisionTable.h" +#include "TFormula.h" + +//__________________________________________ +// MultModule + +namespace o2 +{ +namespace common +{ +namespace multiplicity +{ + +// statics necessary for the configurables in this namespace +static constexpr int nParameters = 1; +static const std::vector tableNames{ + // multiplicity subcomponent + "FV0Mults", + "FV0AOuterMults", + "FT0Mults", + "FDDMults", + "ZDCMults", + "TrackletMults", + "TPCMults", + "PVMults", + "MultsExtra", + "MultSelections", + "FV0MultZeqs", + "FT0MultZeqs", + "FDDMultZeqs", + "PVMultZeqs", + "MultMCExtras", + "kMult2MCExtras", + "kMFTMults", + "kMultsGlobal", + + // centrality subcomponent + "CentRun2V0Ms", + "CentRun2V0As", + "CentRun2SPDTrks", + "CentRun2SPDClss", + "CentRun2CL0s", + "CentRun2CL1s", + "CentFV0As", + "CentFT0Ms", + "CentFT0As", + "CentFT0Cs", + "CentFT0CVariant1s", + "CentFDDMs", + "CentNTPVs", + "CentNGlobals", + "CentMFTs", + "BCCentFT0Ms", + "BCCentFT0As", + "BCCentFT0Cs"}; + +static constexpr int nTablesConst = 36; + +static const std::vector parameterNames{"enable"}; +static const int defaultParameters[nTablesConst][nParameters]{ + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}, + {-1}}; + +// table index : match order above +enum tableIndex { kFV0Mults, // standard + kFV0AOuterMults, // standard + kFT0Mults, // standard + kFDDMults, // standard + kZDCMults, // standard + kTrackletMults, // Run 2 + kTPCMults, // standard + kPVMults, // standard + kMultsExtra, // standard + kMultSelections, // event selection + kFV0MultZeqs, // zeq calib, standard + kFT0MultZeqs, // zeq calib, standard + kFDDMultZeqs, // zeq calib, standard + kPVMultZeqs, // zeq calib, standard + kMultMCExtras, // MC exclusive + kMult2MCExtras, // MC exclusive + kMFTMults, // requires MFT task + kMultsGlobal, // requires track selection task + + // centrality subcomponent + kCentRun2V0Ms, // Run 2 + kCentRun2V0As, // Run 2 + kCentRun2SPDTrks, // Run 2 + kCentRun2SPDClss, // Run 2 + kCentRun2CL0s, // Run 2 + kCentRun2CL1s, // Run 2 + kCentFV0As, // standard Run 3 + kCentFT0Ms, // standard Run 3 + kCentFT0As, // standard Run 3 + kCentFT0Cs, // standard Run 3 + kCentFT0CVariant1s, // standard Run 3 + kCentFDDMs, // standard Run 3 + kCentNTPVs, // standard Run 3 + kCentNGlobals, // requires track selection task + kCentMFTs, // requires MFT task + kBCCentFT0Ms, // bc centrality + kBCCentFT0As, // bc centrality + kBCCentFT0Cs, // bc centrality + kNTables }; + +struct products : o2::framework::ProducesGroup { + //__________________________________________________ + // multiplicity tables + o2::framework::Produces tableFV0; + o2::framework::Produces tableFV0AOuter; + o2::framework::Produces tableFT0; + o2::framework::Produces tableFDD; + o2::framework::Produces tableZDC; + o2::framework::Produces tableTracklet; + o2::framework::Produces tableTpc; + o2::framework::Produces tablePv; + o2::framework::Produces tableExtra; + o2::framework::Produces multSelections; + o2::framework::Produces tableFV0Zeqs; + o2::framework::Produces tableFT0Zeqs; + o2::framework::Produces tableFDDZeqs; + o2::framework::Produces tablePVZeqs; + o2::framework::Produces tableExtraMc; + o2::framework::Produces tableExtraMult2MCExtras; + o2::framework::Produces mftMults; + o2::framework::Produces multsGlobal; + + //__________________________________________________ + // centrality tables (per collision / default) + o2::framework::Produces centRun2V0M; + o2::framework::Produces centRun2V0A; + o2::framework::Produces centRun2SPDTracklets; + o2::framework::Produces centRun2SPDClusters; + o2::framework::Produces centRun2CL0; + o2::framework::Produces centRun2CL1; + o2::framework::Produces centFV0A; + o2::framework::Produces centFT0M; + o2::framework::Produces centFT0A; + o2::framework::Produces centFT0C; + o2::framework::Produces centFT0CVariant1; + o2::framework::Produces centFDDM; + o2::framework::Produces centNTPV; + o2::framework::Produces centNGlobals; + o2::framework::Produces centMFTs; + o2::framework::Produces bcCentFT0A; + o2::framework::Produces bcCentFT0C; + o2::framework::Produces bcCentFT0M; + + //__________________________________________________ + // centrality tables per BC + // FIXME - future development +}; + +// for providing temporary buffer +// FIXME ideally cursors could be readable +// to avoid duplicate memory allocation but ok +struct multEntry { + float multFV0A = 0.0f; + float multFV0C = 0.0f; + float multFV0AOuter = 0.0f; + float multFT0A = 0.0f; + float multFT0C = 0.0f; + float multFDDA = 0.0f; + float multFDDC = 0.0f; + float multZNA = 0.0f; + float multZNC = 0.0f; + float multZEM1 = 0.0f; + float multZEM2 = 0.0f; + float multZPA = 0.0f; + float multZPC = 0.0f; + int multTracklets = 0; + + int multNContribs = 0; // PVMult 0.8 + int multNContribsEta1 = 0; // PVMult 1.0 + int multNContribsEtaHalf = 0; // PVMult 0.5 + int multTPC = 0; // all TPC (PV contrib unchecked) + int multHasTPC = 0; // extras + int multHasITS = 0; // extras + int multHasTOF = 0; // extras + int multHasTRD = 0; // extras + int multITSOnly = 0; // extras + int multTPCOnly = 0; // extras + int multITSTPC = 0; // extras + int multAllTracksTPCOnly = 0; // extras + int multAllTracksITSTPC = 0; // extras + + float multFV0AZeq = -999.0f; + float multFV0CZeq = -999.0f; + float multFT0AZeq = -999.0f; + float multFT0CZeq = -999.0f; + float multFDDAZeq = -999.0f; + float multFDDCZeq = -999.0f; + float multNContribsZeq = 0; + + int multGlobalTracks = 0; // multsGlobal + int multNbrContribsEta05GlobalTrackWoDCA = 0; // multsGlobal + int multNbrContribsEta08GlobalTrackWoDCA = 0; // multsGlobal + int multNbrContribsEta10GlobalTrackWoDCA = 0; // multsGlobal + + int multMFTAllTracks = 0; // mft + int multMFTTracks = 0; // mft + + // For Run2 only + float posZ = -999.0f; + uint16_t spdClustersL0 = 0; + uint16_t spdClustersL1 = 0; +}; + +// strangenessBuilder: 1st-order configurables +struct standardConfigurables : o2::framework::ConfigurableGroup { + // self-configuration configurables + o2::framework::Configurable> enabledTables{"enabledTables", + {defaultParameters[0], nTablesConst, nParameters, tableNames, parameterNames}, + "Produce this table: -1 for autodetect; otherwise, 0/1 is false/true"}; + std::vector mEnabledTables; // Vector of enabled tables + + // Autoconfigure process functions + o2::framework::Configurable autoConfigureProcess{"autoConfigureProcess", false, "if true, will configure process function switches based on metadata"}; + + // do vertex-Z equalized or not + o2::framework::Configurable doVertexZeq{"doVertexZeq", 1, "if 1: do vertex Z eq mult table"}; + + // global track counter configurables + o2::framework::Configurable minPtGlobalTrack{"minPtGlobalTrack", 0.15, "min. pT for global tracks"}; + o2::framework::Configurable maxPtGlobalTrack{"maxPtGlobalTrack", 1e+10, "max. pT for global tracks"}; + o2::framework::Configurable minNclsITSGlobalTrack{"minNclsITSGlobalTrack", 5, "min. number of ITS clusters for global tracks"}; + o2::framework::Configurable minNclsITSibGlobalTrack{"minNclsITSibGlobalTrack", 1, "min. number of ITSib clusters for global tracks"}; + + // ccdb information + o2::framework::Configurable ccdbPathVtxZ{"ccdbPathVtxZ", "Centrality/Calibration", "The CCDB path for vertex-Z calibration"}; + o2::framework::Configurable ccdbPathCentrality{"ccdbPathCentrality", "Centrality/Estimators", "The CCDB path for centrality information"}; + o2::framework::Configurable reconstructionPass{"reconstructionPass", "", {"Apass to use when fetching the calibration tables. Empty (default) does not check for any pass. Use `metadata` to fetch it from the AO2D metadata. Otherwise it will override the metadata."}}; + + // centrality operation + o2::framework::Configurable generatorName{"generatorName", "", {"Specify if and only if this is MC. Typical: PYTHIA"}}; + o2::framework::Configurable embedINELgtZEROselection{"embedINELgtZEROselection", false, {"Option to do percentile 100.5 if not INELgtZERO"}}; +}; + +class MultModule +{ + public: + MultModule() + { + // constructor + mRunNumber = 0; + mRunNumberCentrality = 0; + lCalibLoaded = false; + lCalibObjects = nullptr; + hVtxZFV0A = nullptr; + hVtxZFT0A = nullptr; + hVtxZFT0C = nullptr; + hVtxZFDDA = nullptr; + hVtxZFDDC = nullptr; + hVtxZNTracks = nullptr; + } + + // internal: calib related, vtx-z profiles + int mRunNumber; + int mRunNumberCentrality; + bool lCalibLoaded; + TList* lCalibObjects; + TProfile* hVtxZFV0A; + TProfile* hVtxZFT0A; + TProfile* hVtxZFT0C; + TProfile* hVtxZFDDA; + TProfile* hVtxZFDDC; + TProfile* hVtxZNTracks; + + // declaration of structs here + // (N.B.: will be invisible to the outside, create your own copies) + o2::common::multiplicity::standardConfigurables internalOpts; + + //_________________________________________________ + // centrality-related objects + struct TagRun2V0MCalibration { + bool mCalibrationStored = false; + TFormula* mMCScale = nullptr; + float mMCScalePars[6] = {0.0}; + TH1* mhVtxAmpCorrV0A = nullptr; + TH1* mhVtxAmpCorrV0C = nullptr; + TH1* mhMultSelCalib = nullptr; + } Run2V0MInfo; + struct TagRun2V0ACalibration { + bool mCalibrationStored = false; + TH1* mhVtxAmpCorrV0A = nullptr; + TH1* mhMultSelCalib = nullptr; + } Run2V0AInfo; + struct TagRun2SPDTrackletsCalibration { + bool mCalibrationStored = false; + TH1* mhVtxAmpCorr = nullptr; + TH1* mhMultSelCalib = nullptr; + } Run2SPDTksInfo; + struct TagRun2SPDClustersCalibration { + bool mCalibrationStored = false; + TH1* mhVtxAmpCorrCL0 = nullptr; + TH1* mhVtxAmpCorrCL1 = nullptr; + TH1* mhMultSelCalib = nullptr; + } Run2SPDClsInfo; + struct TagRun2CL0Calibration { + bool mCalibrationStored = false; + TH1* mhVtxAmpCorr = nullptr; + TH1* mhMultSelCalib = nullptr; + } Run2CL0Info; + struct TagRun2CL1Calibration { + bool mCalibrationStored = false; + TH1* mhVtxAmpCorr = nullptr; + TH1* mhMultSelCalib = nullptr; + } Run2CL1Info; + struct CalibrationInfo { + std::string name = ""; + bool mCalibrationStored = false; + TH1* mhMultSelCalib = nullptr; + float mMCScalePars[6] = {0.0}; + TFormula* mMCScale = nullptr; + explicit CalibrationInfo(std::string name) + : name(name), + mCalibrationStored(false), + mhMultSelCalib(nullptr), + mMCScalePars{0.0}, + mMCScale(nullptr) + { + } + bool isSane(bool fatalize = false) + { + if (!mhMultSelCalib) { + return true; + } + for (int i = 1; i < mhMultSelCalib->GetNbinsX() + 1; i++) { + if (mhMultSelCalib->GetXaxis()->GetBinLowEdge(i) > mhMultSelCalib->GetXaxis()->GetBinUpEdge(i)) { + if (fatalize) { + LOG(fatal) << "Centrality calibration table " << name << " has bins with low edge > up edge"; + } + LOG(warning) << "Centrality calibration table " << name << " has bins with low edge > up edge"; + return false; + } + } + return true; + } + }; + + CalibrationInfo fv0aInfo = CalibrationInfo("FV0"); + CalibrationInfo ft0mInfo = CalibrationInfo("FT0"); + CalibrationInfo ft0aInfo = CalibrationInfo("FT0A"); + CalibrationInfo ft0cInfo = CalibrationInfo("FT0C"); + CalibrationInfo ft0cVariant1Info = CalibrationInfo("FT0Cvar1"); + CalibrationInfo fddmInfo = CalibrationInfo("FDD"); + CalibrationInfo ntpvInfo = CalibrationInfo("NTracksPV"); + CalibrationInfo nGlobalInfo = CalibrationInfo("NGlobal"); + CalibrationInfo mftInfo = CalibrationInfo("MFT"); + + template + void init(TConfigurables& opts, TInitContext& context) + { + // read in configurations from the task where it's used + internalOpts = opts; + internalOpts.mEnabledTables.resize(nTablesConst, 0); + + LOGF(info, "Configuring tables to generate"); + auto& workflows = context.services().template get(); + + TString listOfRequestors[nTablesConst]; + for (int i = 0; i < nTablesConst; i++) { + int f = internalOpts.enabledTables->get(tableNames[i].c_str(), "enable"); + if (f == 1) { + internalOpts.mEnabledTables[i] = 1; + listOfRequestors[i] = "manual enabling"; + } + if (f == -1) { + // autodetect this table in other devices + for (o2::framework::DeviceSpec const& device : workflows.devices) { + // Step 1: check if this device subscribed to the V0data table + for (auto const& input : device.inputs) { + if (o2::framework::DataSpecUtils::partialMatch(input.matcher, o2::header::DataOrigin("AOD"))) { + auto&& [origin, description, version] = o2::framework::DataSpecUtils::asConcreteDataMatcher(input.matcher); + std::string tableNameWithVersion = tableNames[i]; + if (version > 0) { + tableNameWithVersion += Form("_%03d", version); + } + if (input.matcher.binding == tableNameWithVersion) { + LOGF(info, "Device %s has subscribed to %s (version %i)", device.name, tableNames[i], version); + listOfRequestors[i].Append(Form("%s ", device.name.c_str())); + internalOpts.mEnabledTables[i] = 1; + } + } + } + } + } + } + + opts = internalOpts; + + // list enabled tables + for (int i = 0; i < nTablesConst; i++) { + // printout to be improved in the future + if (internalOpts.mEnabledTables[i]) { + LOGF(info, " -~> Table enabled: %s, requested by %s", tableNames[i], listOfRequestors[i].Data()); + } + } + + // dependency checker + if (internalOpts.mEnabledTables[kCentFV0As] && !internalOpts.mEnabledTables[kFV0MultZeqs]) { + internalOpts.mEnabledTables[kFV0MultZeqs] = 1; + listOfRequestors[kFV0MultZeqs].Append(Form("%s ", "dependency check")); + } + if ((internalOpts.mEnabledTables[kCentFT0As] || internalOpts.mEnabledTables[kCentFT0Cs] || internalOpts.mEnabledTables[kCentFT0Ms] || internalOpts.mEnabledTables[kCentFT0CVariant1s]) && !internalOpts.mEnabledTables[kFT0MultZeqs]) { + internalOpts.mEnabledTables[kFT0MultZeqs] = 1; + listOfRequestors[kFT0MultZeqs].Append(Form("%s ", "dependency check")); + } + if (internalOpts.mEnabledTables[kCentFDDMs] && !internalOpts.mEnabledTables[kFDDMultZeqs]) { + internalOpts.mEnabledTables[kFDDMultZeqs] = 1; + listOfRequestors[kFDDMultZeqs].Append(Form("%s ", "dependency check")); + } + + mRunNumber = 0; + mRunNumberCentrality = 0; + lCalibLoaded = false; + hVtxZFV0A = nullptr; + hVtxZFT0A = nullptr; + hVtxZFT0C = nullptr; + hVtxZFDDA = nullptr; + hVtxZFDDC = nullptr; + hVtxZNTracks = nullptr; + } + + //__________________________________________________ + template + o2::common::multiplicity::multEntry collisionProcessRun2(TCollision const& collision, TTracks const& tracks, TBC const& bc, TOutputGroup& cursors) + { + // initialize properties + o2::common::multiplicity::multEntry mults; + + mults.posZ = collision.posZ(); + mults.spdClustersL0 = bc.spdClustersL0(); + mults.spdClustersL1 = bc.spdClustersL1(); + //_______________________________________________________________________ + // forward detector signals, raw + if (collision.has_fv0a()) { + for (const auto& amplitude : collision.fv0a().amplitude()) { + mults.multFV0A += amplitude; + } + } + if (collision.has_fv0c()) { + for (const auto& amplitude : collision.fv0c().amplitude()) { + mults.multFV0C += amplitude; + } + } + if (collision.has_ft0()) { + auto ft0 = collision.ft0(); + for (const auto& amplitude : ft0.amplitudeA()) { + mults.multFT0A += amplitude; + } + for (const auto& amplitude : ft0.amplitudeC()) { + mults.multFT0C += amplitude; + } + } + if (collision.has_zdc()) { + auto zdc = collision.zdc(); + mults.multZNA = zdc.energyCommonZNA(); + mults.multZNC = zdc.energyCommonZNC(); + } + + //_______________________________________________________________________ + // determine if barrel track loop is required, do it (once!) if so but save CPU if not + if (internalOpts.mEnabledTables[kPVMults] || internalOpts.mEnabledTables[kTPCMults] || internalOpts.mEnabledTables[kTrackletMults]) { + // Try to do something Similar to https://github.com/alisw/AliPhysics/blob/22862a945004f719f8e9664c0264db46e7186a48/OADB/AliPPVsMultUtils.cxx#L541C26-L541C37 + for (const auto& track : tracks) { + // check whether the track is a tracklet + if (track.trackType() == o2::aod::track::Run2Tracklet) { + if (internalOpts.mEnabledTables[kTrackletMults]) { + mults.multTracklets++; + } + if (internalOpts.mEnabledTables[kPVMults]) { + if (std::abs(track.eta()) < 1.0) { + mults.multNContribsEta1++; // pvmults + if (std::abs(track.eta()) < 0.8) { + mults.multNContribs++; // pvmults + if (std::abs(track.eta()) < 0.5) { + mults.multNContribsEtaHalf++; // pvmults + } + } + } + } + } + // check whether the track is a global ITS-TPC track + if (track.tpcNClsFindable() > 0) { + if (internalOpts.mEnabledTables[kTPCMults]) { + mults.multTPC++; + } + } + } + } + + // fill standard cursors if required + if (internalOpts.mEnabledTables[kFV0Mults]) { + cursors.tableFV0(mults.multFV0A, mults.multFV0C); + } + if (internalOpts.mEnabledTables[kFT0Mults]) { + cursors.tableFT0(mults.multFT0A, mults.multFT0C); + } + if (internalOpts.mEnabledTables[kFDDMults]) { + cursors.tableFDD(mults.multFDDA, mults.multFDDC); + } + if (internalOpts.mEnabledTables[kZDCMults]) { + cursors.tableZDC(mults.multZNA, mults.multZNC, 0.0f, 0.0f, 0.0f, 0.0f); + } + if (internalOpts.mEnabledTables[kTrackletMults]) { // Tracklets only Run2 + cursors.tableTracklet(mults.multTracklets); + } + if (internalOpts.mEnabledTables[kTPCMults]) { + cursors.tableTpc(mults.multTPC); + } + if (internalOpts.mEnabledTables[kPVMults]) { + cursors.tablePv(mults.multNContribs, mults.multNContribsEta1, mults.multNContribsEtaHalf); + } + + return mults; + } + + //__________________________________________________ + template + o2::common::multiplicity::multEntry collisionProcessRun3(TCCDB const& ccdb, TMetadataInfo const& metadataInfo, TCollision const& collision, TTracks const& tracks, TBC const& bc, TOutputGroup& cursors) + { + // initialize properties + o2::common::multiplicity::multEntry mults; + + //_______________________________________________________________________ + // preparatory steps + if (internalOpts.doVertexZeq > 0) { + if (bc.runNumber() != mRunNumber) { + mRunNumber = bc.runNumber(); // mark this run as at least tried + if (internalOpts.reconstructionPass.value == "") { + lCalibObjects = ccdb->template getForRun(internalOpts.ccdbPathVtxZ, mRunNumber); + } else if (internalOpts.reconstructionPass.value == "metadata") { + std::map metadata; + metadata["RecoPassName"] = metadataInfo.get("RecoPassName"); + LOGF(info, "Loading CCDB for reconstruction pass (from metadata): %s", metadataInfo.get("RecoPassName")); + lCalibObjects = ccdb->template getSpecificForRun(internalOpts.ccdbPathVtxZ, mRunNumber, metadata); + } else { + std::map metadata; + metadata["RecoPassName"] = internalOpts.reconstructionPass.value; + LOGF(info, "Loading CCDB for reconstruction pass (from provided argument): %s", internalOpts.reconstructionPass.value); + lCalibObjects = ccdb->template getSpecificForRun(internalOpts.ccdbPathVtxZ, mRunNumber, metadata); + } + + if (lCalibObjects) { + hVtxZFV0A = static_cast(lCalibObjects->FindObject("hVtxZFV0A")); + hVtxZFT0A = static_cast(lCalibObjects->FindObject("hVtxZFT0A")); + hVtxZFT0C = static_cast(lCalibObjects->FindObject("hVtxZFT0C")); + hVtxZFDDA = static_cast(lCalibObjects->FindObject("hVtxZFDDA")); + hVtxZFDDC = static_cast(lCalibObjects->FindObject("hVtxZFDDC")); + hVtxZNTracks = static_cast(lCalibObjects->FindObject("hVtxZNTracksPV")); + lCalibLoaded = true; + // Capture error + if (!hVtxZFV0A || !hVtxZFT0A || !hVtxZFT0C || !hVtxZFDDA || !hVtxZFDDC || !hVtxZNTracks) { + LOGF(error, "Problem loading CCDB objects! Please check"); + lCalibLoaded = false; + } + } else { + LOGF(error, "Problem loading CCDB object! Please check"); + lCalibLoaded = false; + } + } + } + + //_______________________________________________________________________ + // forward detector signals, raw + if (collision.has_foundFV0()) { + const auto& fv0 = collision.foundFV0(); + for (size_t ii = 0; ii < fv0.amplitude().size(); ii++) { + auto amplitude = fv0.amplitude()[ii]; + auto channel = fv0.channel()[ii]; + mults.multFV0A += amplitude; + if (channel > 7) { + mults.multFV0AOuter += amplitude; + } + } + } else { + mults.multFV0A = -999.f; + mults.multFV0AOuter = -999.f; + } + if (collision.has_foundFT0()) { + const auto& ft0 = collision.foundFT0(); + for (const auto& amplitude : ft0.amplitudeA()) { + mults.multFT0A += amplitude; + } + for (const auto& amplitude : ft0.amplitudeC()) { + mults.multFT0C += amplitude; + } + } else { + mults.multFT0A = -999.f; + mults.multFT0C = -999.f; + } + if (collision.has_foundFDD()) { + const auto& fdd = collision.foundFDD(); + for (const auto& amplitude : fdd.chargeA()) { + mults.multFDDA += amplitude; + } + for (const auto& amplitude : fdd.chargeC()) { + mults.multFDDC += amplitude; + } + } else { + mults.multFDDA = -999.f; + mults.multFDDC = -999.f; + } + if (bc.has_zdc()) { + mults.multZNA = bc.zdc().amplitudeZNA(); + mults.multZNC = bc.zdc().amplitudeZNC(); + mults.multZEM1 = bc.zdc().amplitudeZEM1(); + mults.multZEM2 = bc.zdc().amplitudeZEM2(); + mults.multZPA = bc.zdc().amplitudeZPA(); + mults.multZPC = bc.zdc().amplitudeZPC(); + } else { + mults.multZNA = -999.f; + mults.multZNC = -999.f; + mults.multZEM1 = -999.f; + mults.multZEM2 = -999.f; + mults.multZPA = -999.f; + mults.multZPC = -999.f; + } + + // fill standard cursors if required + if (internalOpts.mEnabledTables[kTrackletMults]) { // Tracklets (only Run2) nothing to do (to be removed!) + cursors.tableTracklet(0); + } + if (internalOpts.mEnabledTables[kFV0Mults]) { + cursors.tableFV0(mults.multFV0A, mults.multFV0C); + } + if (internalOpts.mEnabledTables[kFV0AOuterMults]) { + cursors.tableFV0AOuter(mults.multFV0AOuter); + } + if (internalOpts.mEnabledTables[kFT0Mults]) { + cursors.tableFT0(mults.multFT0A, mults.multFT0C); + } + if (internalOpts.mEnabledTables[kFDDMults]) { + cursors.tableFDD(mults.multFDDA, mults.multFDDC); + } + if (internalOpts.mEnabledTables[kZDCMults]) { + cursors.tableZDC(mults.multZNA, mults.multZNC, mults.multZEM1, mults.multZEM2, mults.multZPA, mults.multZPC); + } + + //_______________________________________________________________________ + // forward detector signals, vertex-Z equalized + if (internalOpts.mEnabledTables[kFV0MultZeqs]) { + if (std::fabs(collision.posZ() && lCalibLoaded)) { + mults.multFV0AZeq = hVtxZFV0A->Interpolate(0.0) * mults.multFV0A / hVtxZFV0A->Interpolate(collision.posZ()); + } else { + mults.multFV0AZeq = 0.0f; + } + cursors.tableFV0Zeqs(mults.multFV0AZeq); + } + if (internalOpts.mEnabledTables[kFT0MultZeqs]) { + if (std::fabs(collision.posZ() && lCalibLoaded)) { + mults.multFT0AZeq = hVtxZFT0A->Interpolate(0.0) * mults.multFT0A / hVtxZFT0A->Interpolate(collision.posZ()); + mults.multFT0CZeq = hVtxZFT0C->Interpolate(0.0) * mults.multFT0C / hVtxZFT0C->Interpolate(collision.posZ()); + } else { + mults.multFT0AZeq = 0.0f; + mults.multFT0CZeq = 0.0f; + } + cursors.tableFT0Zeqs(mults.multFT0AZeq, mults.multFT0CZeq); + } + if (internalOpts.mEnabledTables[kFDDMultZeqs]) { + if (std::fabs(collision.posZ() && lCalibLoaded)) { + mults.multFDDAZeq = hVtxZFDDA->Interpolate(0.0) * mults.multFDDA / hVtxZFDDA->Interpolate(collision.posZ()); + mults.multFDDCZeq = hVtxZFDDC->Interpolate(0.0) * mults.multFDDC / hVtxZFDDC->Interpolate(collision.posZ()); + } else { + mults.multFDDAZeq = 0.0f; + mults.multFDDCZeq = 0.0f; + } + cursors.tableFDDZeqs(mults.multFDDAZeq, mults.multFDDCZeq); + } + + //_______________________________________________________________________ + // determine if barrel track loop is required, do it (once!) if so but save CPU if not + if (internalOpts.mEnabledTables[kTPCMults] || internalOpts.mEnabledTables[kPVMults] || internalOpts.mEnabledTables[kMultsExtra] || internalOpts.mEnabledTables[kPVMultZeqs] || internalOpts.mEnabledTables[kMultsGlobal]) { + // single loop to calculate all + for (const auto& track : tracks) { + if (track.hasTPC()) { + mults.multTPC++; + if (track.hasITS()) { + mults.multAllTracksITSTPC++; // multsextra + } else { + mults.multAllTracksTPCOnly++; // multsextra + } + } + // PV contributor checked explicitly + if (track.isPVContributor()) { + if (std::abs(track.eta()) < 1.0) { + mults.multNContribsEta1++; // pvmults + if (std::abs(track.eta()) < 0.8) { + mults.multNContribs++; // pvmults + if (std::abs(track.eta()) < 0.5) { + mults.multNContribsEtaHalf++; // pvmults + } + } + } + if (track.hasITS()) { + mults.multHasITS++; // multsextra + if (track.hasTPC()) + mults.multITSTPC++; // multsextra + if (!track.hasTPC() && !track.hasTOF() && !track.hasTRD()) { + mults.multITSOnly++; // multsextra + } + } + if (track.hasTPC()) { + mults.multHasTPC++; // multsextra + if (!track.hasITS() && !track.hasTOF() && !track.hasTRD()) { + mults.multTPCOnly++; // multsextra + } + } + if (track.hasTOF()) { + mults.multHasTOF++; // multsextra + } + if (track.hasTRD()) { + mults.multHasTRD++; // multsextra + } + } + + // global counters: do them only in case information is provided in tracks table + if constexpr (requires { tracks.isQualityTrack(); }) { + if (track.pt() < internalOpts.maxPtGlobalTrack.value && track.pt() > internalOpts.minPtGlobalTrack.value && std::fabs(track.eta()) < 1.0f && track.isPVContributor() && tracks.isQualityTrack()) { + if (track.itsNCls() < internalOpts.minNclsITSGlobalTrack || track.itsNClsInnerBarrel() < internalOpts.minNclsITSibGlobalTrack) { + continue; + } + mults.multNbrContribsEta10GlobalTrackWoDCA++; + + if (std::abs(track.eta()) < 0.8) { + mults.multNbrContribsEta08GlobalTrackWoDCA++; + } + if (std::abs(track.eta()) < 0.5) { + mults.multNbrContribsEta05GlobalTrackWoDCA++; + } + } + if (std::fabs(track.eta()) < 0.8 && track.tpcNClsFound() >= 80 && track.tpcNClsCrossedRows() >= 100) { + if (track.isGlobalTrack()) { + mults.multGlobalTracks++; + } + } + } // end constexpr requires track selection stuff + } + + cursors.multsGlobal(mults.multGlobalTracks, mults.multNbrContribsEta08GlobalTrackWoDCA, mults.multNbrContribsEta10GlobalTrackWoDCA, mults.multNbrContribsEta05GlobalTrackWoDCA); + } + + // fill track counters at this stage if requested + if (internalOpts.mEnabledTables[kTPCMults]) { + cursors.tableTpc(mults.multTPC); + } + if (internalOpts.mEnabledTables[kPVMults]) { + cursors.tablePv(mults.multNContribs, mults.multNContribsEta1, mults.multNContribsEtaHalf); + } + if (internalOpts.mEnabledTables[kMultsExtra]) { + cursors.tableExtra(collision.numContrib(), collision.chi2(), collision.collisionTimeRes(), + bc.runNumber(), collision.posZ(), collision.sel8(), + mults.multHasITS, mults.multHasTPC, mults.multHasTOF, mults.multHasTRD, + mults.multITSOnly, mults.multTPCOnly, mults.multITSTPC, + mults.multAllTracksTPCOnly, mults.multAllTracksITSTPC, + collision.trackOccupancyInTimeRange(), + collision.ft0cOccupancyInTimeRange(), + collision.flags()); + } + if (internalOpts.mEnabledTables[kPVMultZeqs]) { + if (std::fabs(collision.posZ()) && lCalibLoaded) { + mults.multNContribsZeq = hVtxZNTracks->Interpolate(0.0) * mults.multNContribs / hVtxZNTracks->Interpolate(collision.posZ()); + } else { + mults.multNContribsZeq = 0.0f; + } + cursors.tablePVZeqs(mults.multNContribsZeq); + } + + // return multiplicity object such that it is handled properly when computing centrality + return mults; + } + + //__________________________________________________ + template + void collisionProcessMonteCarlo(TMCCollision const& mccollision, TMCParticles const& mcparticles, TPDGService const& pdg, TOutputGroup& cursors) + { + int multFT0A = 0; + int multFV0A = 0; + int multFT0C = 0; + int multFDDA = 0; + int multFDDC = 0; + int multBarrelEta05 = 0; + int multBarrelEta08 = 0; + int multBarrelEta10 = 0; + for (auto const& mcPart : mcparticles) { + if (!mcPart.isPhysicalPrimary()) { + continue; + } + + auto charge = 0.; + auto* p = pdg->GetParticle(mcPart.pdgCode()); + if (p != nullptr) { + charge = p->Charge(); + } + if (std::abs(charge) < 1e-3) { + continue; // reject neutral particles in counters + } + + if (std::abs(mcPart.eta()) < 1.0) { + multBarrelEta10++; + if (std::abs(mcPart.eta()) < 0.8) { + multBarrelEta08++; + if (std::abs(mcPart.eta()) < 0.5) { + multBarrelEta05++; + } + } + } + if (-3.3 < mcPart.eta() && mcPart.eta() < -2.1) + multFT0C++; + if (3.5 < mcPart.eta() && mcPart.eta() < 4.9) + multFT0A++; + if (2.2 < mcPart.eta() && mcPart.eta() < 5.0) + multFV0A++; + if (-6.9 < mcPart.eta() && mcPart.eta() < -4.9) + multFDDC++; + if (4.7 < mcPart.eta() && mcPart.eta() < 6.3) + multFDDA++; + } + cursors.tableExtraMc(multFT0A, multFT0C, multFV0A, multFDDA, multFDDC, multBarrelEta05, multBarrelEta08, multBarrelEta10, mccollision.posZ()); + } + + //__________________________________________________ + template + void collisionProcessMFT(TCollision const& collision, TMFTTracks const& mfttracks, TBestCollisionsFwd const& retracks, TMultBuffer& mults, TOutputGroup& cursors) + { + int nAllTracks = 0; + int nTracks = 0; + + for (const auto& track : mfttracks) { + if (track.nClusters() >= 5) { // hardcoded for now + nAllTracks++; + } + } + + if (retracks.size() > 0) { + for (const auto& retrack : retracks) { + auto track = retrack.mfttrack(); + if (track.nClusters() < 5) { + continue; // min cluster requirement + } + if ((track.eta() > -2.0f) && (track.eta() < -3.9f)) { + continue; // too far to be of true interest + } + if (std::abs(retrack.bestDCAXY()) > 2.0f) { + continue; // does not point to PV properly + } + nTracks++; + } + } + cursors.mftMults(nAllTracks, nTracks); + mults[collision.globalIndex()].multMFTAllTracks = nAllTracks; + mults[collision.globalIndex()].multMFTTracks = nTracks; + } + + //__________________________________________________ + template + void ConfigureCentralityRun2(TCCDB& ccdb, TMetadata const& metadataInfo, TBC const& bc) + { + if (bc.runNumber() != mRunNumberCentrality) { + mRunNumberCentrality = bc.runNumber(); // mark that this run has been attempted already regardless of outcome + LOGF(info, "centrality loading procedure for timestamp=%llu, run number=%d", bc.timestamp(), bc.runNumber()); + TList* callst = nullptr; + // Check if the ccdb path is a root file + if (internalOpts.ccdbPathCentrality.value.find(".root") != std::string::npos) { + TFile f(internalOpts.ccdbPathCentrality.value.c_str(), "READ"); + f.GetObject(internalOpts.reconstructionPass.value.c_str(), callst); + if (!callst) { + f.ls(); + LOG(fatal) << "No calibration list " << internalOpts.reconstructionPass.value << " found."; + } + } else { + if (internalOpts.reconstructionPass.value == "") { + callst = ccdb->template getForRun(internalOpts.ccdbPathCentrality, bc.runNumber()); + } else if (internalOpts.reconstructionPass.value == "metadata") { + std::map metadata; + metadata["RecoPassName"] = metadataInfo.get("RecoPassName"); + LOGF(info, "Loading CCDB for reconstruction pass (from metadata): %s", metadataInfo.get("RecoPassName")); + callst = ccdb->template getSpecificForRun(internalOpts.ccdbPathCentrality, bc.runNumber(), metadata); + } else { + std::map metadata; + metadata["RecoPassName"] = internalOpts.reconstructionPass.value; + LOGF(info, "Loading CCDB for reconstruction pass (from provided argument): %s", internalOpts.reconstructionPass.value); + callst = ccdb->template getSpecificForRun(internalOpts.ccdbPathCentrality, bc.runNumber(), metadata); + } + } + + Run2V0MInfo.mCalibrationStored = false; + Run2V0AInfo.mCalibrationStored = false; + Run2SPDTksInfo.mCalibrationStored = false; + Run2SPDClsInfo.mCalibrationStored = false; + Run2CL0Info.mCalibrationStored = false; + Run2CL1Info.mCalibrationStored = false; + if (callst != nullptr) { + auto getccdb = [callst](const char* ccdbhname) { + TH1* h = reinterpret_cast(callst->FindObject(ccdbhname)); + return h; + }; + auto getformulaccdb = [callst](const char* ccdbhname) { + TFormula* f = reinterpret_cast(callst->FindObject(ccdbhname)); + return f; + }; + + if (internalOpts.mEnabledTables[kCentRun2V0Ms]) { + LOGF(debug, "Getting new histograms with %d run number for %d run number", mRunNumber, bc.runNumber()); + Run2V0MInfo.mhVtxAmpCorrV0A = getccdb("hVtx_fAmplitude_V0A_Normalized"); + Run2V0MInfo.mhVtxAmpCorrV0C = getccdb("hVtx_fAmplitude_V0C_Normalized"); + Run2V0MInfo.mhMultSelCalib = getccdb("hMultSelCalib_V0M"); + Run2V0MInfo.mMCScale = getformulaccdb(TString::Format("%s-V0M", internalOpts.generatorName->c_str()).Data()); + if ((Run2V0MInfo.mhVtxAmpCorrV0A != nullptr) && (Run2V0MInfo.mhVtxAmpCorrV0C != nullptr) && (Run2V0MInfo.mhMultSelCalib != nullptr)) { + if (internalOpts.generatorName->length() != 0) { + if (Run2V0MInfo.mMCScale != nullptr) { + for (int ixpar = 0; ixpar < 6; ++ixpar) { + Run2V0MInfo.mMCScalePars[ixpar] = Run2V0MInfo.mMCScale->GetParameter(ixpar); + } + } else { + // continue filling with non-valid values (105) + LOGF(info, "MC Scale information from V0M for run %d not available", bc.runNumber()); + } + } + Run2V0MInfo.mCalibrationStored = true; + } else { + // continue filling with non-valid values (105) + LOGF(info, "Calibration information from V0M for run %d corrupted, will fill V0M tables with dummy values", bc.runNumber()); + } + } + if (internalOpts.mEnabledTables[kCentRun2V0As]) { + LOGF(debug, "Getting new histograms with %d run number for %d run number", mRunNumber, bc.runNumber()); + Run2V0AInfo.mhVtxAmpCorrV0A = getccdb("hVtx_fAmplitude_V0A_Normalized"); + Run2V0AInfo.mhMultSelCalib = getccdb("hMultSelCalib_V0A"); + if ((Run2V0AInfo.mhVtxAmpCorrV0A != nullptr) && (Run2V0AInfo.mhMultSelCalib != nullptr)) { + Run2V0AInfo.mCalibrationStored = true; + } else { + // continue filling with non-valid values (105) + LOGF(info, "Calibration information from V0A for run %d corrupted, will fill V0A tables with dummy values", bc.runNumber()); + } + } + if (internalOpts.mEnabledTables[kCentRun2SPDTrks]) { + LOGF(debug, "Getting new histograms with %d run number for %d run number", mRunNumber, bc.runNumber()); + Run2SPDTksInfo.mhVtxAmpCorr = getccdb("hVtx_fnTracklets_Normalized"); + Run2SPDTksInfo.mhMultSelCalib = getccdb("hMultSelCalib_SPDTracklets"); + if ((Run2SPDTksInfo.mhVtxAmpCorr != nullptr) && (Run2SPDTksInfo.mhMultSelCalib != nullptr)) { + Run2SPDTksInfo.mCalibrationStored = true; + } else { + // continue filling with non-valid values (105) + LOGF(info, "Calibration information from SPD tracklets for run %d corrupted, will fill SPD tracklets tables with dummy values", bc.runNumber()); + } + } + if (internalOpts.mEnabledTables[kCentRun2SPDClss]) { + LOGF(debug, "Getting new histograms with %d run number for %d run number", mRunNumber, bc.runNumber()); + Run2SPDClsInfo.mhVtxAmpCorrCL0 = getccdb("hVtx_fnSPDClusters0_Normalized"); + Run2SPDClsInfo.mhVtxAmpCorrCL1 = getccdb("hVtx_fnSPDClusters1_Normalized"); + Run2SPDClsInfo.mhMultSelCalib = getccdb("hMultSelCalib_SPDClusters"); + if ((Run2SPDClsInfo.mhVtxAmpCorrCL0 != nullptr) && (Run2SPDClsInfo.mhVtxAmpCorrCL1 != nullptr) && (Run2SPDClsInfo.mhMultSelCalib != nullptr)) { + Run2SPDClsInfo.mCalibrationStored = true; + } else { + // continue filling with non-valid values (105) + LOGF(info, "Calibration information from SPD clusters for run %d corrupted, will fill SPD clusters tables with dummy values", bc.runNumber()); + } + } + if (internalOpts.mEnabledTables[kCentRun2CL0s]) { + LOGF(debug, "Getting new histograms with %d run number for %d run number", mRunNumber, bc.runNumber()); + Run2CL0Info.mhVtxAmpCorr = getccdb("hVtx_fnSPDClusters0_Normalized"); + Run2CL0Info.mhMultSelCalib = getccdb("hMultSelCalib_CL0"); + if ((Run2CL0Info.mhVtxAmpCorr != nullptr) && (Run2CL0Info.mhMultSelCalib != nullptr)) { + Run2CL0Info.mCalibrationStored = true; + } else { + // continue filling with non-valid values (105) + LOGF(info, "Calibration information from CL0 multiplicity for run %d corrupted, will fill CL0 multiplicity tables with dummy values", bc.runNumber()); + } + } + if (internalOpts.mEnabledTables[kCentRun2CL1s]) { + LOGF(debug, "Getting new histograms with %d run number for %d run number", mRunNumber, bc.runNumber()); + Run2CL1Info.mhVtxAmpCorr = getccdb("hVtx_fnSPDClusters1_Normalized"); + Run2CL1Info.mhMultSelCalib = getccdb("hMultSelCalib_CL1"); + if ((Run2CL1Info.mhVtxAmpCorr != nullptr) && (Run2CL1Info.mhMultSelCalib != nullptr)) { + Run2CL1Info.mCalibrationStored = true; + } else { + // continue filling with non-valid values (105) + LOGF(info, "Calibration information from CL1 multiplicity for run %d corrupted, will fill CL1 multiplicity tables with dummy values", bc.runNumber()); + } + } + } else { + LOGF(info, "Centrality calibration is not available in CCDB for run=%d at timestamp=%llu, will fill tables with dummy values", bc.runNumber(), bc.timestamp()); + } + } + } + + //__________________________________________________ + template + void ConfigureCentralityRun3(TCCDB& ccdb, TMetadata const& metadataInfo, TBC const& bc) + { + if (bc.runNumber() != mRunNumberCentrality) { + mRunNumberCentrality = bc.runNumber(); // mark that this run has been attempted already regardless of outcome + LOGF(info, "centrality loading procedure for timestamp=%llu, run number=%d", bc.timestamp(), bc.runNumber()); + TList* callst = nullptr; + // Check if the ccdb path is a root file + if (internalOpts.ccdbPathCentrality.value.find(".root") != std::string::npos) { + TFile f(internalOpts.ccdbPathCentrality.value.c_str(), "READ"); + f.GetObject(internalOpts.reconstructionPass.value.c_str(), callst); + if (!callst) { + f.ls(); + LOG(fatal) << "No calibration list " << internalOpts.reconstructionPass.value << " found."; + } + } else { + if (internalOpts.reconstructionPass.value == "") { + callst = ccdb->template getForRun(internalOpts.ccdbPathCentrality, bc.runNumber()); + } else if (internalOpts.reconstructionPass.value == "metadata") { + std::map metadata; + metadata["RecoPassName"] = metadataInfo.get("RecoPassName"); + LOGF(info, "Loading CCDB for reconstruction pass (from metadata): %s", metadataInfo.get("RecoPassName")); + callst = ccdb->template getSpecificForRun(internalOpts.ccdbPathCentrality, bc.runNumber(), metadata); + } else { + std::map metadata; + metadata["RecoPassName"] = internalOpts.reconstructionPass.value; + LOGF(info, "Loading CCDB for reconstruction pass (from provided argument): %s", internalOpts.reconstructionPass.value); + callst = ccdb->template getSpecificForRun(internalOpts.ccdbPathCentrality, bc.runNumber(), metadata); + } + } + + fv0aInfo.mCalibrationStored = false; + ft0mInfo.mCalibrationStored = false; + ft0aInfo.mCalibrationStored = false; + ft0cInfo.mCalibrationStored = false; + ft0cVariant1Info.mCalibrationStored = false; + fddmInfo.mCalibrationStored = false; + ntpvInfo.mCalibrationStored = false; + nGlobalInfo.mCalibrationStored = false; + mftInfo.mCalibrationStored = false; + if (callst != nullptr) { + LOGF(info, "Getting new histograms with %d run number for %d run number", mRunNumber, bc.runNumber()); + auto getccdb = [callst, bc](struct CalibrationInfo& estimator, const o2::framework::Configurable generatorName) { // TODO: to consider the name inside the estimator structure + estimator.mhMultSelCalib = reinterpret_cast(callst->FindObject(TString::Format("hCalibZeq%s", estimator.name.c_str()).Data())); + estimator.mMCScale = reinterpret_cast(callst->FindObject(TString::Format("%s-%s", generatorName->c_str(), estimator.name.c_str()).Data())); + if (estimator.mhMultSelCalib != nullptr) { + if (generatorName->length() != 0) { + LOGF(info, "Retrieving MC calibration for %d, generator name: %s", bc.runNumber(), generatorName->c_str()); + if (estimator.mMCScale != nullptr) { + for (int ixpar = 0; ixpar < 6; ++ixpar) { + estimator.mMCScalePars[ixpar] = estimator.mMCScale->GetParameter(ixpar); + LOGF(info, "Parameter index %i value %.5f", ixpar, estimator.mMCScalePars[ixpar]); + } + } else { + LOGF(warning, "MC Scale information from %s for run %d not available", estimator.name.c_str(), bc.runNumber()); + } + } + estimator.mCalibrationStored = true; + estimator.isSane(); + } else { + LOGF(info, "Calibration information from %s for run %d not available, will fill this estimator with invalid values and continue (no crash).", estimator.name.c_str(), bc.runNumber()); + } + }; + + // invoke loading only for requested centralities + if (internalOpts.mEnabledTables[kCentFV0As]) + getccdb(fv0aInfo, internalOpts.generatorName); + if (internalOpts.mEnabledTables[kCentFT0Ms]) + getccdb(ft0mInfo, internalOpts.generatorName); + if (internalOpts.mEnabledTables[kCentFT0As]) + getccdb(ft0aInfo, internalOpts.generatorName); + if (internalOpts.mEnabledTables[kCentFT0Cs]) + getccdb(ft0cInfo, internalOpts.generatorName); + if (internalOpts.mEnabledTables[kCentFT0CVariant1s]) + getccdb(ft0cVariant1Info, internalOpts.generatorName); + if (internalOpts.mEnabledTables[kCentFDDMs]) + getccdb(fddmInfo, internalOpts.generatorName); + if (internalOpts.mEnabledTables[kCentNTPVs]) + getccdb(ntpvInfo, internalOpts.generatorName); + if (internalOpts.mEnabledTables[kCentNGlobals]) + getccdb(nGlobalInfo, internalOpts.generatorName); + if (internalOpts.mEnabledTables[kCentMFTs]) + getccdb(mftInfo, internalOpts.generatorName); + } else { + LOGF(info, "Centrality calibration is not available in CCDB for run=%d at timestamp=%llu, will fill tables with dummy values", bc.runNumber(), bc.timestamp()); + } + } + } + + //__________________________________________________ + template + void generateCentralitiesRun3(TCCDB& ccdb, TMetadata const& metadataInfo, TBCs const& bcs, TMultBuffer const& mults, TOutputGroup& cursors) + { + // takes multiplicity buffer and generates the desirable centrality values (if any) + + // first step: did someone actually ask for it? Otherwise, go home + if ( + internalOpts.mEnabledTables[kCentFV0As] || internalOpts.mEnabledTables[kCentFT0Ms] || + internalOpts.mEnabledTables[kCentFT0As] || internalOpts.mEnabledTables[kCentFT0Cs] || + internalOpts.mEnabledTables[kCentFT0CVariant1s] || internalOpts.mEnabledTables[kCentFDDMs] || + internalOpts.mEnabledTables[kCentNTPVs] || internalOpts.mEnabledTables[kCentNGlobals] || + internalOpts.mEnabledTables[kCentMFTs] || internalOpts.mEnabledTables[kBCCentFT0Ms] || + internalOpts.mEnabledTables[kBCCentFT0As] || internalOpts.mEnabledTables[kBCCentFT0Cs]) { + // check and update centrality calibration objects for Run 3 + const auto& firstbc = bcs.begin(); + ConfigureCentralityRun3(ccdb, metadataInfo, firstbc); + + /************************************************************ + * @brief Populates a table with data based on the given calibration information and multiplicity. + * + * @param table The table to populate. + * @param estimator The calibration information. + * @param multiplicity The multiplicity value. + *************************************************************/ + + auto populateTable = [&](auto& table, struct CalibrationInfo& estimator, float multiplicity, bool isInelGt0) { + const bool assignOutOfRange = internalOpts.embedINELgtZEROselection && !isInelGt0; + auto scaleMC = [](float x, float pars[6]) { + return std::pow(((pars[0] + pars[1] * std::pow(x, pars[2])) - pars[3]) / pars[4], 1.0f / pars[5]); + }; + + float percentile = 105.0f; + float scaledMultiplicity = multiplicity; + if (estimator.mCalibrationStored) { + if (estimator.mMCScale != nullptr) { + scaledMultiplicity = scaleMC(multiplicity, estimator.mMCScalePars); + LOGF(debug, "Unscaled %s multiplicity: %f, scaled %s multiplicity: %f", estimator.name.c_str(), multiplicity, estimator.name.c_str(), scaledMultiplicity); + } + percentile = estimator.mhMultSelCalib->GetBinContent(estimator.mhMultSelCalib->FindFixBin(scaledMultiplicity)); + if (assignOutOfRange) + percentile = 100.5f; + } + LOGF(debug, "%s centrality/multiplicity percentile = %.0f for a zvtx eq %s value %.0f", estimator.name.c_str(), percentile, estimator.name.c_str(), scaledMultiplicity); + table(percentile); + return percentile; + }; + + // populate centralities per event + for (size_t iEv = 0; iEv < mults.size(); iEv++) { + bool isInelGt0 = (mults[iEv].multNContribsEta1 > 0); + if (internalOpts.mEnabledTables[kCentFV0As]) + populateTable(cursors.centFV0A, fv0aInfo, mults[iEv].multFV0AZeq, isInelGt0); + if (internalOpts.mEnabledTables[kCentFT0Ms]) + populateTable(cursors.centFT0M, ft0mInfo, mults[iEv].multFT0AZeq + mults[iEv].multFT0CZeq, isInelGt0); + if (internalOpts.mEnabledTables[kCentFT0As]) + populateTable(cursors.centFT0A, ft0aInfo, mults[iEv].multFT0AZeq, isInelGt0); + if (internalOpts.mEnabledTables[kCentFT0Cs]) + populateTable(cursors.centFT0C, ft0cInfo, mults[iEv].multFT0CZeq, isInelGt0); + if (internalOpts.mEnabledTables[kCentFT0CVariant1s]) + populateTable(cursors.centFT0CVariant1, ft0cVariant1Info, mults[iEv].multFT0CZeq, isInelGt0); + if (internalOpts.mEnabledTables[kCentFDDMs]) + populateTable(cursors.centFDDM, fddmInfo, mults[iEv].multFDDAZeq + mults[iEv].multFDDCZeq, isInelGt0); + if (internalOpts.mEnabledTables[kCentNTPVs]) + populateTable(cursors.centNTPV, ntpvInfo, mults[iEv].multNContribs, isInelGt0); + if (internalOpts.mEnabledTables[kCentNGlobals]) + populateTable(cursors.centNGlobals, nGlobalInfo, mults[iEv].multGlobalTracks, isInelGt0); + if (internalOpts.mEnabledTables[kCentMFTs]) + populateTable(cursors.centMFTs, mftInfo, mults[iEv].multMFTTracks, isInelGt0); + } + + // populate centralities per BC + for (size_t ibc = 0; ibc < static_cast(bcs.size()); ibc++) { + float bcMultFT0A = 0; + float bcMultFT0C = 0; + + const auto& bc = bcs.rawIteratorAt(ibc); + if (bc.has_foundFT0()) { + const auto& ft0 = bc.foundFT0(); + for (const auto& amplitude : ft0.amplitudeA()) { + bcMultFT0A += amplitude; + } + for (const auto& amplitude : ft0.amplitudeC()) { + bcMultFT0C += amplitude; + } + } else { + bcMultFT0A = -999.f; + bcMultFT0C = -999.f; + } + + if (internalOpts.mEnabledTables[kBCCentFT0Ms]) + populateTable(cursors.bcCentFT0M, ft0mInfo, bcMultFT0A + bcMultFT0C, true); + if (internalOpts.mEnabledTables[kBCCentFT0As]) + populateTable(cursors.bcCentFT0A, ft0aInfo, bcMultFT0A, true); + if (internalOpts.mEnabledTables[kBCCentFT0Cs]) + populateTable(cursors.bcCentFT0C, ft0cInfo, bcMultFT0C, true); + } + } + } + //__________________________________________________ + template + void generateCentralitiesRun2(TCCDB& ccdb, TMetadata const& metadataInfo, TBCs const& bcs, TMultBuffer const& mults, TOutputGroup& cursors) + { + // takes multiplicity buffer and generates the desirable centrality values (if any) + // For Run 2 + if ( + internalOpts.mEnabledTables[kCentRun2V0Ms] || internalOpts.mEnabledTables[kCentRun2V0As] || + internalOpts.mEnabledTables[kCentRun2SPDTrks] || internalOpts.mEnabledTables[kCentRun2SPDClss] || + internalOpts.mEnabledTables[kCentRun2CL0s] || internalOpts.mEnabledTables[kCentRun2CL1s]) { + // check and update centrality calibration objects for Run 3 + const auto& firstbc = bcs.begin(); + ConfigureCentralityRun2(ccdb, metadataInfo, firstbc); + + auto scaleMC = [](float x, float pars[6]) { + return std::pow(((pars[0] + pars[1] * std::pow(x, pars[2])) - pars[3]) / pars[4], 1.0f / pars[5]); + }; + + // populate centralities per event + for (size_t iEv = 0; iEv < mults.size(); iEv++) { + if (internalOpts.mEnabledTables[kCentRun2V0Ms]) { + float cV0M = 105.0f; + if (Run2V0MInfo.mCalibrationStored) { + float v0m; + if (Run2V0MInfo.mMCScale != nullptr) { + v0m = scaleMC(mults[iEv].multFV0A + mults[iEv].multFV0C, Run2V0MInfo.mMCScalePars); + LOGF(debug, "Unscaled v0m: %f, scaled v0m: %f", mults[iEv].multFV0A + mults[iEv].multFV0C, v0m); + } else { + v0m = mults[iEv].multFV0A * Run2V0MInfo.mhVtxAmpCorrV0A->GetBinContent(Run2V0MInfo.mhVtxAmpCorrV0A->FindFixBin(mults[iEv].posZ)) + + mults[iEv].multFV0C * Run2V0MInfo.mhVtxAmpCorrV0C->GetBinContent(Run2V0MInfo.mhVtxAmpCorrV0C->FindFixBin(mults[iEv].posZ)); + } + cV0M = Run2V0MInfo.mhMultSelCalib->GetBinContent(Run2V0MInfo.mhMultSelCalib->FindFixBin(v0m)); + } + LOGF(debug, "centRun2V0M=%.0f", cV0M); + // fill centrality columns + cursors.centRun2V0M(cV0M); + } + if (internalOpts.mEnabledTables[kCentRun2V0As]) { + float cV0A = 105.0f; + if (Run2V0AInfo.mCalibrationStored) { + float v0a = mults[iEv].multFV0A * Run2V0AInfo.mhVtxAmpCorrV0A->GetBinContent(Run2V0AInfo.mhVtxAmpCorrV0A->FindFixBin(mults[iEv].posZ)); + cV0A = Run2V0AInfo.mhMultSelCalib->GetBinContent(Run2V0AInfo.mhMultSelCalib->FindFixBin(v0a)); + } + LOGF(debug, "centRun2V0A=%.0f", cV0A); + // fill centrality columns + cursors.centRun2V0A(cV0A); + } + if (internalOpts.mEnabledTables[kCentRun2SPDTrks]) { + float cSPD = 105.0f; + if (Run2SPDTksInfo.mCalibrationStored) { + float spdm = mults[iEv].multTracklets * Run2SPDTksInfo.mhVtxAmpCorr->GetBinContent(Run2SPDTksInfo.mhVtxAmpCorr->FindFixBin(mults[iEv].posZ)); + cSPD = Run2SPDTksInfo.mhMultSelCalib->GetBinContent(Run2SPDTksInfo.mhMultSelCalib->FindFixBin(spdm)); + } + LOGF(debug, "centSPDTracklets=%.0f", cSPD); + cursors.centRun2SPDTracklets(cSPD); + } + if (internalOpts.mEnabledTables[kCentRun2SPDClss]) { + float cSPD = 105.0f; + if (Run2SPDClsInfo.mCalibrationStored) { + float spdm = mults[iEv].spdClustersL0 * Run2SPDClsInfo.mhVtxAmpCorrCL0->GetBinContent(Run2SPDClsInfo.mhVtxAmpCorrCL0->FindFixBin(mults[iEv].posZ)) + + mults[iEv].spdClustersL1 * Run2SPDClsInfo.mhVtxAmpCorrCL1->GetBinContent(Run2SPDClsInfo.mhVtxAmpCorrCL1->FindFixBin(mults[iEv].posZ)); + cSPD = Run2SPDClsInfo.mhMultSelCalib->GetBinContent(Run2SPDClsInfo.mhMultSelCalib->FindFixBin(spdm)); + } + LOGF(debug, "centSPDClusters=%.0f", cSPD); + cursors.centRun2SPDClusters(cSPD); + } + if (internalOpts.mEnabledTables[kCentRun2CL0s]) { + float cCL0 = 105.0f; + if (Run2CL0Info.mCalibrationStored) { + float cl0m = mults[iEv].spdClustersL0 * Run2CL0Info.mhVtxAmpCorr->GetBinContent(Run2CL0Info.mhVtxAmpCorr->FindFixBin(mults[iEv].posZ)); + cCL0 = Run2CL0Info.mhMultSelCalib->GetBinContent(Run2CL0Info.mhMultSelCalib->FindFixBin(cl0m)); + } + LOGF(debug, "centCL0=%.0f", cCL0); + cursors.centRun2CL0(cCL0); + } + if (internalOpts.mEnabledTables[kCentRun2CL1s]) { + float cCL1 = 105.0f; + if (Run2CL1Info.mCalibrationStored) { + float cl1m = mults[iEv].spdClustersL1 * Run2CL1Info.mhVtxAmpCorr->GetBinContent(Run2CL1Info.mhVtxAmpCorr->FindFixBin(mults[iEv].posZ)); + cCL1 = Run2CL1Info.mhMultSelCalib->GetBinContent(Run2CL1Info.mhMultSelCalib->FindFixBin(cl1m)); + } + LOGF(debug, "centCL1=%.0f", cCL1); + cursors.centRun2CL1(cCL1); + } + } + } + } +}; // end BuilderModule + +} // namespace multiplicity +} // namespace common +} // namespace o2 + +#endif // COMMON_TOOLS_MULTMODULE_H_ From 1b6747a6e7a1816883e399e06de168830e210b57 Mon Sep 17 00:00:00 2001 From: spucillo <93769017+spucillo@users.noreply.github.com> Date: Fri, 13 Jun 2025 10:09:50 +0200 Subject: [PATCH 1610/1650] [PWGLF] Update reweighting for cascades in MC (#11597) Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Strangeness/strangenessInJets.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Strangeness/strangenessInJets.cxx b/PWGLF/Tasks/Strangeness/strangenessInJets.cxx index 3cb2ac41f2b..a783c324687 100644 --- a/PWGLF/Tasks/Strangeness/strangenessInJets.cxx +++ b/PWGLF/Tasks/Strangeness/strangenessInJets.cxx @@ -2027,7 +2027,7 @@ struct StrangenessInJets { case kXiPlusBar: // Xi Pos registryMC.fill(HIST("XiPos_generated_jet"), multiplicity, mcParticle.pt(), wXiPosJet); registryMC.fill(HIST("XiPos_generated_ue"), multiplicity, mcParticle.pt(), wXiPosUe); - registryMC.fill(HIST("Xi_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); + registryMC.fill(HIST("XiPos_eta_pt_pythia"), mcParticle.pt(), mcParticle.eta()); break; case kXiMinus: // Xi Neg registryMC.fill(HIST("XiNeg_generated_jet"), multiplicity, mcParticle.pt(), wXiNegJet); From 8cdfa4cb0f85a4b15ff20e252b982195a6d010c6 Mon Sep 17 00:00:00 2001 From: omvazque Date: Fri, 13 Jun 2025 03:11:25 -0500 Subject: [PATCH 1611/1650] [PWGLF] Updated the MC correction procedure (#11590) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 191 ++++++++++++------- 1 file changed, 124 insertions(+), 67 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index 7da02f51416..478c49fae87 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -15,18 +15,6 @@ /// \author Omar Vazquez (omar.vazquez.rueda@cern.ch) /// \since January 29, 2025 -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - #include "Common/CCDB/EventSelectionParams.h" #include "Common/CCDB/TriggerAliases.h" #include "Common/Core/TrackSelection.h" @@ -34,6 +22,7 @@ #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/TrackSelectionTables.h" + #include "CommonConstants/MathConstants.h" #include "CommonConstants/ZDCConstants.h" #include "Framework/ASoAHelpers.h" // required for Filter op. @@ -44,7 +33,20 @@ #include "Framework/runDataProcessing.h" #include "ReconstructionDataFormats/GlobalTrackID.h" #include "ReconstructionDataFormats/Track.h" +#include + #include "TPDGCode.h" +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include using namespace std; using namespace o2; @@ -81,6 +83,7 @@ struct UccZdc { Configurable isZEMcut{"isZEMcut", true, "Use ZEM cut"}; Configurable useMidRapNchSel{"useMidRapNchSel", true, "Use mid-rapidit Nch selection"}; Configurable applyEff{"applyEff", true, "Apply track-by-track efficiency correction"}; + Configurable correctNch{"correctNch", true, "Correct also Nch"}; // Event selection Configurable posZcut{"posZcut", +10.0, "z-vertex position cut"}; @@ -126,7 +129,8 @@ struct UccZdc { ConfigurableAxis binsCent{"binsCent", {VARIABLE_WIDTH, 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.}, "T0C binning"}; // CCDB paths - Configurable paTH{"paTH", "Users/o/omvazque/TrackingEfficiency", "base path to the ccdb object"}; + Configurable paTHEff{"paTHEff", "Users/o/omvazque/MCcorrection/perTimeStamp/TrackingEff", "base path to the ccdb object"}; + Configurable paTHFD{"paTHFD", "Users/o/omvazque/MCcorrection/perTimeStamp/FeedDown", "base path to the ccdb object"}; Configurable paTHmeanNch{"paTHmeanNch", "Users/o/omvazque/FitMeanNch_9May2025", "base path to the ccdb object"}; Configurable paTHsigmaNch{"paTHsigmaNch", "Users/o/omvazque/FitSigmaNch_9May2025", "base path to the ccdb object"}; Configurable ccdbNoLaterThan{"ccdbNoLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; @@ -238,6 +242,9 @@ struct UccZdc { registry.add("NchVsThreeParCorr", "MC closure;#it{N}_{ch} (|#eta| < 0.8, Corrected);#LT[#it{p}_{T}^{(3)}]#GT", kTProfile, {{nBinsNch, minNch, maxNch}}); registry.add("NchVsFourParCorr", "MC closure;#it{N}_{ch} (|#eta| < 0.8, Corrected);#LT[#it{p}_{T}^{(4)}]#GT", kTProfile, {{nBinsNch, minNch, maxNch}}); // Corrections + registry.add("NchRec", "Corrections;#it{N}_{ch} (|#eta| < 0.8);Entries;", kTH1F, {{nBinsNch, minNch, maxNch}}); + registry.add("NchTrue", "Corrections;#it{N}_{ch} (|#eta| < 0.8);Entries;", kTH1F, {{nBinsNch, minNch, maxNch}}); + registry.add("zPosMC", "Filled at MC closure + Corrections;;Entries;", kTH1F, {axisZpos}); registry.add("hEventCounterMC", "Event counter", kTH1F, {axisEvent}); registry.add("nRecColvsCent", "", kTH2F, {{6, -0.5, 5.5}, {{axisCent}}}); @@ -292,8 +299,11 @@ struct UccZdc { LOG(info) << "\tccdbNoLaterThan=" << ccdbNoLaterThan.value; LOG(info) << "\tapplyEff=" << applyEff.value; - LOG(info) << "\tpaTH=" << paTH.value; + LOG(info) << "\tcorrectNch=" << correctNch.value; + LOG(info) << "\tpaTHEff=" << paTHEff.value; + LOG(info) << "\tpaTHFD=" << paTHFD.value; LOG(info) << "\tuseMidRapNchSel=" << useMidRapNchSel.value; + LOG(info) << "\tnSigmaNchCut=" << nSigmaNchCut.value; LOG(info) << "\tpaTHmeanNch=" << paTHmeanNch.value; LOG(info) << "\tpaTHsigmaNch=" << paTHsigmaNch.value; LOG(info) << "\tminPt=" << minPt.value; @@ -681,48 +691,55 @@ struct UccZdc { } } + // Skip event based on number of Nch sigmas if (!skipEvent) { return; } - auto efficiency = ccdb->getForTimeStamp(paTH.value, foundBC.timestamp()); - // auto efficiency = ccdb->getForRun(paTH.value, foundBC.runNumber()); - if (!efficiency) { + auto efficiency = ccdb->getForTimeStamp(paTHEff.value, foundBC.timestamp()); + auto fd = ccdb->getForTimeStamp(paTHFD.value, foundBC.timestamp()); + if (!efficiency || !fd) { return; } std::vector pTs; - std::vector wIs; - // Calculates the event weight, W_k + std::vector vecFD; + std::vector vecOneOverEff; + + // Calculates the Nch multiplicity for (const auto& track : tracks) { // Track Selection if (!track.isGlobalTrack()) { continue; } - if ((track.pt() < minPt) || (track.pt() > maxPtSpectra)) { + if ((track.pt() < minPt) || (track.pt() > maxPt)) { continue; } float pt{track.pt()}; - double weight{1.}; + float effValue{1.0}; if (applyEff) { - weight = efficiency->GetBinContent(efficiency->FindBin(pt)); + effValue = efficiency->GetBinContent(efficiency->FindBin(pt)); } - if (weight > 0.) { - pTs.emplace_back(pt); - wIs.emplace_back(weight); + if (effValue > 0.) { + vecOneOverEff.emplace_back(1. / effValue); } } - double p1, p2, p3, p4, w1, w2, w3, w4; - p1 = p2 = p3 = p4 = w1 = w2 = w3 = w4 = 0.0; - getPTpowers(pTs, wIs, p1, w1, p2, w2, p3, w3, p4, w4); - const double nch{static_cast(pTs.size())}; - if (nch < minNchSel) { + double nchMult{0.}; + nchMult = std::accumulate(vecOneOverEff.begin(), vecOneOverEff.end(), 0); + if (!applyEff) + nchMult = static_cast(glbTracks); + if (applyEff && !correctNch) + nchMult = static_cast(glbTracks); + if (nchMult < minNchSel) { return; } - // To calculate event-averaged + // Fill vectors for [pT] measurement + pTs.clear(); + vecFD.clear(); + vecOneOverEff.clear(); for (const auto& track : tracks) { // Track Selection if (!track.isGlobalTrack()) { @@ -731,9 +748,27 @@ struct UccZdc { if ((track.pt() < minPt) || (track.pt() > maxPtSpectra)) { continue; } - registry.fill(HIST("NchVsZNVsPt"), w1, sumZNs, track.pt()); + + float pt{track.pt()}; + float effValue{1.}; + float fdValue{1.}; + if (applyEff) { + effValue = efficiency->GetBinContent(efficiency->FindBin(pt)); + fdValue = fd->GetBinContent(fd->FindBin(pt)); + } + if ((effValue > 0.) && (fdValue > 0.)) { + pTs.emplace_back(pt); + vecOneOverEff.emplace_back(1. / effValue); + vecFD.emplace_back(fdValue); + } + // To calculate event-averaged + registry.fill(HIST("NchVsZNVsPt"), nchMult, sumZNs, track.pt()); } + double p1, p2, p3, p4, w1, w2, w3, w4; + p1 = p2 = p3 = p4 = w1 = w2 = w3 = w4 = 0.0; + getPTpowers(pTs, vecOneOverEff, vecFD, p1, w1, p2, w2, p3, w3, p4, w4); + // EbE one-particle pT correlation double oneParCorr{p1 / w1}; @@ -752,20 +787,20 @@ struct UccZdc { double numFourParCorr{std::pow(p1, 4.) - 6. * p2 * std::pow(p1, 2.) + 3. * std::pow(p2, 2.) + 8 * p3 * p1 - 6. * p4}; double fourParCorr{numFourParCorr / denFourParCorr}; - registry.fill(HIST("Nch"), w1); + registry.fill(HIST("Nch"), nchMult); registry.fill(HIST("ZNamp"), sumZNs); - registry.fill(HIST("NchVsZN"), w1, sumZNs); - registry.fill(HIST("NchVsZP"), w1, sumZPs); + registry.fill(HIST("NchVsZN"), nchMult, sumZNs); + registry.fill(HIST("NchVsZP"), nchMult, sumZPs); registry.fill(HIST("NITSTacksVsZN"), itsTracks, sumZNs); registry.fill(HIST("NITSTacksVsZP"), itsTracks, sumZPs); registry.fill(HIST("T0MVsZN"), normT0M, sumZNs); registry.fill(HIST("T0MVsZP"), normT0M, sumZPs); registry.fill(HIST("NchUncorrected"), glbTracks); - registry.fill(HIST("NchVsOneParCorr"), w1, oneParCorr, w1); - registry.fill(HIST("NchVsOneParCorrVsZN"), w1, sumZNs, oneParCorr, w1); - registry.fill(HIST("NchVsTwoParCorrVsZN"), w1, sumZNs, twoParCorr, denTwoParCorr); - registry.fill(HIST("NchVsThreeParCorrVsZN"), w1, sumZNs, threeParCorr, denThreeParCorr); - registry.fill(HIST("NchVsFourParCorrVsZN"), w1, sumZNs, fourParCorr, denFourParCorr); + registry.fill(HIST("NchVsOneParCorr"), nchMult, oneParCorr, w1); + registry.fill(HIST("NchVsOneParCorrVsZN"), nchMult, sumZNs, oneParCorr, w1); + registry.fill(HIST("NchVsTwoParCorrVsZN"), nchMult, sumZNs, twoParCorr, denTwoParCorr); + registry.fill(HIST("NchVsThreeParCorrVsZN"), nchMult, sumZNs, threeParCorr, denThreeParCorr); + registry.fill(HIST("NchVsFourParCorrVsZN"), nchMult, sumZNs, fourParCorr, denFourParCorr); } PROCESS_SWITCH(UccZdc, processZdcCollAss, "Process ZDC W/Coll Ass.", true); @@ -774,7 +809,6 @@ struct UccZdc { TRandom* randPointer = new TRandom(); void processMCclosure(aod::McCollisions::iterator const& mccollision, soa::SmallGroups const& collisions, o2::aod::BCsRun3 const& /*bcs*/, aod::McParticles const& mcParticles, TheFilteredSimTracks const& simTracks) { - float rndNum = randPointer->Uniform(0.0, 1.0); registry.fill(HIST("RandomNumber"), rndNum); @@ -809,14 +843,17 @@ struct UccZdc { // To use run-by-run efficiency const auto& foundBC = collision.foundBC_as(); - // auto efficiency = ccdb->getForTimeStamp(paTH.value, foundBC.timestamp()); - auto efficiency = ccdb->getForRun(paTH.value, foundBC.runNumber()); - if (!efficiency) { - continue; + auto efficiency = ccdb->getForTimeStamp(paTHEff.value, foundBC.timestamp()); + auto fd = ccdb->getForTimeStamp(paTHFD.value, foundBC.timestamp()); + if (!efficiency || !fd) { + return; } + int nchRaw{0}; std::vector pTs; - std::vector wIs; + std::vector vecFD; + std::vector vecOneOverEff; + // std::vector wIs; const auto& groupedTracks{simTracks.sliceBy(perCollision, collision.globalIndex())}; // Calculates the event weight, W_k for (const auto& track : groupedTracks) { @@ -826,22 +863,29 @@ struct UccZdc { } float pt{track.pt()}; - double weight{efficiency->GetBinContent(efficiency->FindBin(pt))}; - if (!(weight > 0.)) { - continue; + float effValue{1.}; + float fdValue{1.}; + nchRaw++; + if (applyEff) { + effValue = efficiency->GetBinContent(efficiency->FindBin(pt)); + fdValue = fd->GetBinContent(fd->FindBin(pt)); + } + if ((effValue > 0.) && (fdValue > 0.)) { + pTs.emplace_back(pt); + vecOneOverEff.emplace_back(1. / effValue); + vecFD.emplace_back(fdValue); } - pTs.emplace_back(pt); - wIs.emplace_back(weight); } - const double nch{static_cast(pTs.size())}; - if (nch < minNchSel) { - continue; + double nchMult{0.}; + nchMult = std::accumulate(vecOneOverEff.begin(), vecOneOverEff.end(), 0); + if (nchMult < minNchSel) { + return; } double p1, p2, p3, p4, w1, w2, w3, w4; p1 = p2 = p3 = p4 = w1 = w2 = w3 = w4 = 0.0; - getPTpowers(pTs, wIs, p1, w1, p2, w2, p3, w3, p4, w4); + getPTpowers(pTs, vecOneOverEff, vecFD, p1, w1, p2, w2, p3, w3, p4, w4); const double denTwoParCorr{std::pow(w1, 2.) - w2}; const double numTwoParCorr{std::pow(p1, 2.) - p2}; @@ -855,16 +899,18 @@ struct UccZdc { const double threeParCorr{numThreeParCorr / denThreeParCorr}; const double fourParCorr{numFourParCorr / denFourParCorr}; - registry.fill(HIST("Nch"), w1); - registry.fill(HIST("NchUncorrected"), nch); - registry.fill(HIST("NchVsOneParCorr"), w1, oneParCorr, w1); - registry.fill(HIST("NchVsTwoParCorr"), w1, twoParCorr, denTwoParCorr); - registry.fill(HIST("NchVsThreeParCorr"), w1, threeParCorr, denThreeParCorr); - registry.fill(HIST("NchVsFourParCorr"), w1, fourParCorr, denFourParCorr); + registry.fill(HIST("Nch"), nchMult); + registry.fill(HIST("NchUncorrected"), nchRaw); + registry.fill(HIST("NchVsOneParCorr"), nchMult, oneParCorr, w1); + registry.fill(HIST("NchVsTwoParCorr"), nchMult, twoParCorr, denTwoParCorr); + registry.fill(HIST("NchVsThreeParCorr"), nchMult, threeParCorr, denThreeParCorr); + registry.fill(HIST("NchVsFourParCorr"), nchMult, fourParCorr, denFourParCorr); //--------------------------- Generated MC --------------------------- std::vector pTsMC; - std::vector wIsMC; + std::vector vecFullEff; + std::vector vecFDEqualOne; + // Calculates the event weight, W_k for (const auto& particle : mcParticles) { if (particle.eta() < minEta || particle.eta() > maxEta) { @@ -879,17 +925,19 @@ struct UccZdc { float pt{particle.pt()}; pTsMC.emplace_back(pt); - wIsMC.emplace_back(1.); + vecFullEff.emplace_back(1.); + vecFDEqualOne.emplace_back(1.); } - const double nchMC{static_cast(pTsMC.size())}; + double nchMC{0}; + nchMult = std::accumulate(vecFullEff.begin(), vecFullEff.end(), 0); if (nchMC < minNchSel) { continue; } double p1MC, p2MC, p3MC, p4MC, w1MC, w2MC, w3MC, w4MC; p1MC = p2MC = p3MC = p4MC = w1MC = w2MC = w3MC = w4MC = 0.0; - getPTpowers(pTsMC, wIsMC, p1MC, w1MC, p2MC, w2MC, p3MC, w3MC, p4MC, w4MC); + getPTpowers(pTsMC, vecFullEff, vecFDEqualOne, p1MC, w1MC, p2MC, w2MC, p3MC, w3MC, p4MC, w4MC); const double denTwoParCorrMC{std::pow(w1MC, 2.) - w2MC}; const double numTwoParCorrMC{std::pow(p1MC, 2.) - p2MC}; @@ -911,6 +959,8 @@ struct UccZdc { } else { // Correction with the remaining half of the sample registry.fill(HIST("EvtsDivided"), 1); //----- MC reconstructed -----// + int nchTrue{0}; + int nchRec{0}; const auto& groupedTracks{simTracks.sliceBy(perCollision, collision.globalIndex())}; for (const auto& track : groupedTracks) { // Track Selection @@ -932,6 +982,7 @@ struct UccZdc { continue; } + nchRec++; registry.fill(HIST("Pt_ch"), cent, track.pt()); if (particle.pdgCode() == PDG_t::kPiPlus || particle.pdgCode() == PDG_t::kPiMinus) { registry.fill(HIST("Pt_pi"), cent, track.pt()); @@ -960,6 +1011,7 @@ struct UccZdc { continue; } + nchTrue++; registry.fill(HIST("PtMC_ch"), cent, particle.pt()); if (particle.pdgCode() == PDG_t::kPiPlus || particle.pdgCode() == PDG_t::kPiMinus) { // pion registry.fill(HIST("PtMC_pi"), cent, particle.pt()); @@ -975,18 +1027,23 @@ struct UccZdc { registry.fill(HIST("PtMC_re"), cent, particle.pt()); } } + + registry.fill(HIST("NchRec"), nchRec); + registry.fill(HIST("NchTrue"), nchTrue); } // Half of statistics for corrections } // Collisions } PROCESS_SWITCH(UccZdc, processMCclosure, "Process MC closure", false); template - void getPTpowers(const T& pTs, const T& wIs, U& pOne, U& wOne, U& pTwo, U& wTwo, U& pThree, U& wThree, U& pFour, U& wFour) + void getPTpowers(const T& pTs, const T& vecOneOverEff, const T& vecFD, U& pOne, U& wOne, U& pTwo, U& wTwo, U& pThree, U& wThree, U& pFour, U& wFour) { pOne = wOne = pTwo = wTwo = pThree = wThree = pFour = wFour = 0.; for (std::size_t i = 0; i < pTs.size(); ++i) { const float pTi{pTs.at(i)}; - const float wEighti{wIs.at(i)}; + const float eFFi{vecOneOverEff.at(i)}; + const float fDi{vecFD.at(i)}; + const float wEighti{eFFi * fDi}; pOne += wEighti * pTi; wOne += wEighti; pTwo += std::pow(wEighti * pTi, 2.); From bf307e085208145b545240114de6e5aad6253d4d Mon Sep 17 00:00:00 2001 From: jaelpark Date: Fri, 13 Jun 2025 14:07:09 +0200 Subject: [PATCH 1612/1650] [PWGCF] Fix 2prong filter MC particle indexing (#11585) --- PWGCF/TableProducer/filter2Prong.cxx | 28 +++++++------- PWGCF/Tasks/correlations.cxx | 57 +++++++++++++++------------- 2 files changed, 44 insertions(+), 41 deletions(-) diff --git a/PWGCF/TableProducer/filter2Prong.cxx b/PWGCF/TableProducer/filter2Prong.cxx index 25bee387660..4d86c4deda5 100644 --- a/PWGCF/TableProducer/filter2Prong.cxx +++ b/PWGCF/TableProducer/filter2Prong.cxx @@ -11,26 +11,24 @@ /// \author Jasper Parkkila -#include -#include -#include -#include - -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoAHelpers.h" - -#include "MathUtils/detail/TypeTruncation.h" - #include "PWGCF/DataModel/CorrelationsDerived.h" - #include "PWGHF/Core/HfHelper.h" #include "PWGHF/DataModel/CandidateReconstructionTables.h" #include "PWGHF/DataModel/CandidateSelectionTables.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/runDataProcessing.h" +#include "MathUtils/detail/TypeTruncation.h" + #include +#include +#include +#include +#include + using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; @@ -143,11 +141,11 @@ struct Filter2Prong { } PROCESS_SWITCH(Filter2Prong, processData, "Process data D0 candidates", true); - void processMC(aod::McCollisions::iterator const&, aod::CFMcParticleRefs const& cfmcparticles, aod::McParticles const& mcparticles) + void processMC(aod::McCollisions::iterator const&, aod::CFMcParticleRefs const& cfmcparticles, [[maybe_unused]] aod::McParticles const& mcparticles) { // The main filter outputs the primary MC particles. Here we just resolve the daughter indices that are needed for the efficiency matching. for (const auto& r : cfmcparticles) { - const auto& mcParticle = mcparticles.iteratorAt(r.mcParticleId()); + const auto& mcParticle = r.mcParticle(); if (mcParticle.daughtersIds().size() != 2) { output2ProngMcParts(-1, -1); continue; diff --git a/PWGCF/Tasks/correlations.cxx b/PWGCF/Tasks/correlations.cxx index 7461cc4b671..1e079482284 100644 --- a/PWGCF/Tasks/correlations.cxx +++ b/PWGCF/Tasks/correlations.cxx @@ -13,36 +13,37 @@ /// \brief task for the correlation calculations with CF-filtered tracks for O2 analysis /// \author Jan Fiete Grosse-Oetringhaus , Jasper Parkkila -#include -#include -#include +#include "PWGCF/Core/CorrelationContainer.h" +#include "PWGCF/Core/PairCuts.h" +#include "PWGCF/DataModel/CorrelationsDerived.h" -#include -#include -#include -#include -#include -#include +#include "Common/Core/RecoDecay.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/TrackSelectionTables.h" -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoAHelpers.h" #include "CCDB/BasicCCDBManager.h" -#include "Framework/StepTHn.h" +#include "CommonConstants/MathConstants.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "DataFormatsParameters/GRPObject.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" #include "Framework/HistogramRegistry.h" #include "Framework/RunningWorkflowInfo.h" -#include "CommonConstants/MathConstants.h" -#include "Common/Core/RecoDecay.h" +#include "Framework/StepTHn.h" +#include "Framework/runDataProcessing.h" -#include "Common/DataModel/EventSelection.h" -#include "Common/DataModel/TrackSelectionTables.h" -#include "Common/DataModel/Centrality.h" -#include "PWGCF/DataModel/CorrelationsDerived.h" -#include "PWGCF/Core/CorrelationContainer.h" -#include "PWGCF/Core/PairCuts.h" -#include "DataFormatsParameters/GRPObject.h" -#include "DataFormatsParameters/GRPMagField.h" +#include +#include +#include +#include +#include + +#include +#include +#include +#include using namespace o2; using namespace o2::framework; @@ -1065,17 +1066,21 @@ struct CorrelationTask { for (const auto& p2track : grouped2ProngTracks) { // Check if the mc particles of the prongs are found. + if (p2track.cfTrackProng0Id() < 0 || p2track.cfTrackProng1Id() < 0) { + // fake track + same->getTrackHistEfficiency()->Fill(CorrelationContainer::Fake, p2track.eta(), p2track.pt(), 0, multiplicity, mcCollision.posZ()); + } const auto& p0 = p2track.cfTrackProng0_as(); const auto& p1 = p2track.cfTrackProng1_as(); if (p0.has_cfMCParticle() && p1.has_cfMCParticle()) { // find the 2-prong MC particle by the daughter MC particle IDs auto m = std::find_if(p2indexCache.begin(), p2indexCache.end(), [&](const auto& t) -> bool { - const auto& mcParticle = mcParticles.iteratorAt(t); + const auto& mcParticle = mcParticles.iteratorAt(t - mcParticles.begin().globalIndex()); return p0.cfMCParticleId() == mcParticle.cfParticleDaugh0Id() && p1.cfMCParticleId() == mcParticle.cfParticleDaugh1Id(); }); if (m == p2indexCache.end()) continue; - const auto& mcParticle = mcParticles.iteratorAt(*m); + const auto& mcParticle = mcParticles.iteratorAt(*m - mcParticles.begin().globalIndex()); if (mcParticle.isPhysicalPrimary()) { same->getTrackHistEfficiency()->Fill(CorrelationContainer::RecoPrimaries, mcParticle.eta(), mcParticle.pt(), getSpecies(mcParticle.pdgCode()), multiplicity, mcCollision.posZ()); } From 7fa4415bd206497d27697fca4cfec93d5d0c4043 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Fri, 13 Jun 2025 15:00:03 +0200 Subject: [PATCH 1613/1650] [PWGHF,Trigger] Include What You Use (#11548) --- EventFiltering/PWGHF/HFFilter.cxx | 75 ++++++++++++------- .../PWGHF/HFFilterCharmHadronSignals.cxx | 58 ++++++++------ EventFiltering/PWGHF/HFFilterHelpers.h | 63 +++++++++------- .../PWGHF/HFFilterPrepareMLSamples.cxx | 53 ++++++++----- 4 files changed, 151 insertions(+), 98 deletions(-) diff --git a/EventFiltering/PWGHF/HFFilter.cxx b/EventFiltering/PWGHF/HFFilter.cxx index 4c0d2d891de..7a538f53f27 100644 --- a/EventFiltering/PWGHF/HFFilter.cxx +++ b/EventFiltering/PWGHF/HFFilter.cxx @@ -8,7 +8,6 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -// O2 includes /// \file HFFilter.cxx /// \brief task for selection of events with HF signals @@ -20,40 +19,60 @@ /// \author Federica Zanone , Heidelberg University /// \author Antonio Palasciano , INFN Bari -#include -#include -#include -#include - -#include "TRandom3.h" - -#include "CommonConstants/PhysicsConstants.h" -#include "CCDB/BasicCCDBManager.h" -#include "DataFormatsParameters/GRPMagField.h" -#include "DataFormatsParameters/GRPObject.h" -#include "DCAFitter/DCAFitterN.h" -#include "DetectorsBase/Propagator.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/AnalysisTask.h" -#include "Framework/ASoAHelpers.h" -#include "Framework/HistogramRegistry.h" -#include "Framework/runDataProcessing.h" -#include "ReconstructionDataFormats/DCA.h" +#include "EventFiltering/PWGHF/HFFilterHelpers.h" +#include "EventFiltering/filterTables.h" +// +#include "PWGHF/Core/SelectorCuts.h" +#include "PWGHF/DataModel/CandidateReconstructionTables.h" +// +#include "PWGEM/PhotonMeson/DataModel/gammaTables.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" #include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" #include "Common/DataModel/CollisionAssociationTables.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/PIDResponseITS.h" +#include "Common/DataModel/PIDResponseTOF.h" +#include "Common/DataModel/PIDResponseTPC.h" +#include "Common/DataModel/TrackSelectionTables.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include -#include "PWGEM/PhotonMeson/DataModel/gammaTables.h" - -#include "PWGHF/DataModel/CandidateReconstructionTables.h" -#include "PWGHF/DataModel/CandidateSelectionTables.h" -#include "PWGHF/Utils/utilsTrkCandHf.h" - -#include "EventFiltering/filterTables.h" -#include "EventFiltering/PWGHF/HFFilterHelpers.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include using namespace o2; using namespace o2::soa; diff --git a/EventFiltering/PWGHF/HFFilterCharmHadronSignals.cxx b/EventFiltering/PWGHF/HFFilterCharmHadronSignals.cxx index ab46a5e2504..3cd5a047bb9 100644 --- a/EventFiltering/PWGHF/HFFilterCharmHadronSignals.cxx +++ b/EventFiltering/PWGHF/HFFilterCharmHadronSignals.cxx @@ -8,37 +8,53 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -// O2 includes /// \file HFFilterCharmHadronSignals.cxx /// \brief task for the quality control of the signals of D0, D+, Ds+, Lc+, and D*+ selected in the HFFilter.cxx task /// /// \author Fabrizio Grosa , CERN -#include -#include - -#include "CCDB/BasicCCDBManager.h" -#include "DataFormatsParameters/GRPMagField.h" -#include "DataFormatsParameters/GRPObject.h" -#include "DetectorsBase/Propagator.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/AnalysisTask.h" -#include "Framework/ASoAHelpers.h" -#include "Framework/HistogramRegistry.h" -#include "Framework/runDataProcessing.h" - +#include "EventFiltering/PWGHF/HFFilterHelpers.h" +// +#include "PWGHF/Core/SelectorCuts.h" +#include "PWGHF/DataModel/CandidateReconstructionTables.h" +// +#include "Common/CCDB/EventSelectionParams.h" +#include "Common/Core/RecoDecay.h" #include "Common/Core/trackUtilities.h" #include "Common/DataModel/CollisionAssociationTables.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Multiplicity.h" - -#include "PWGHF/Core/SelectorCuts.h" -#include "PWGHF/DataModel/CandidateReconstructionTables.h" -#include "PWGHF/DataModel/CandidateSelectionTables.h" - -#include "EventFiltering/filterTables.h" -#include "EventFiltering/PWGHF/HFFilterHelpers.h" +#include "Common/DataModel/PIDResponseTOF.h" +#include "Common/DataModel/PIDResponseTPC.h" +#include "Common/DataModel/TrackSelectionTables.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include using namespace o2; using namespace o2::analysis; diff --git a/EventFiltering/PWGHF/HFFilterHelpers.h b/EventFiltering/PWGHF/HFFilterHelpers.h index 72b2f71cae4..af70e4c05fa 100644 --- a/EventFiltering/PWGHF/HFFilterHelpers.h +++ b/EventFiltering/PWGHF/HFFilterHelpers.h @@ -8,7 +8,6 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -// O2 includes /// \file HFFilterHelpers.h /// \brief Header file with definition of variables, methods, and tables used in the HFFilter.cxx task @@ -23,41 +22,47 @@ #ifndef EVENTFILTERING_PWGHF_HFFILTERHELPERS_H_ #define EVENTFILTERING_PWGHF_HFFILTERHELPERS_H_ +#include "EventFiltering/filterTables.h" +// +#include "PWGHF/Core/SelectorCuts.h" +// +#include "Common/Core/RecoDecay.h" +#include "Common/Core/trackUtilities.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include // IWYU pragma: keep (do not replace with Math/Vector4Dfwd.h) +#include +#include +#include +#include + +#include + #include #include #include +#include +#include #include -#include #include +#include #include -#include "Math/GenVector/Boost.h" -#include "Math/Vector3D.h" -#include "Math/Vector4D.h" - -#include "CCDB/CcdbApi.h" -#include "CCDB/BasicCCDBManager.h" -#include "CommonConstants/MathConstants.h" -#include "CommonConstants/PhysicsConstants.h" -#include "DataFormatsTPC/BetheBlochAleph.h" -#include "DCAFitter/DCAFitterN.h" -#include "DetectorsBase/Propagator.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/AnalysisTask.h" -#include "Framework/DataTypes.h" -#include "Framework/HistogramRegistry.h" -#include "Framework/AnalysisHelpers.h" -#include "Framework/O2DatabasePDGPlugin.h" - -#include "Common/Core/RecoDecay.h" -#include "Common/Core/trackUtilities.h" - -#include "PWGHF/Core/SelectorCuts.h" -#include "PWGHF/DataModel/CandidateReconstructionTables.h" -#include "PWGHF/DataModel/CandidateSelectionTables.h" - -#include "EventFiltering/filterTables.h" - namespace o2::aod { diff --git a/EventFiltering/PWGHF/HFFilterPrepareMLSamples.cxx b/EventFiltering/PWGHF/HFFilterPrepareMLSamples.cxx index 2a5dda41464..6a5f50eb158 100644 --- a/EventFiltering/PWGHF/HFFilterPrepareMLSamples.cxx +++ b/EventFiltering/PWGHF/HFFilterPrepareMLSamples.cxx @@ -8,7 +8,6 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -// O2 includes /// \file HFFilterPrepareMLSamples.cxx /// \brief task for trainings of ML models to be used in the HFFilter.cxx task @@ -19,31 +18,45 @@ /// \author Biao Zhang , CCNU /// \author Antonio Palasciano , INFN Bari -#include +#include "EventFiltering/PWGHF/HFFilterHelpers.h" +// +#include "PWGHF/DataModel/CandidateReconstructionTables.h" +// +#include "Common/Core/RecoDecay.h" +#include "Common/Core/trackUtilities.h" +#include "Common/DataModel/PIDResponseTOF.h" +#include "Common/DataModel/PIDResponseTPC.h" +#include "Common/DataModel/TrackSelectionTables.h" + #if __has_include() #include // needed for HFFilterHelpers, to be fixed #else #include #endif -#include "CommonConstants/PhysicsConstants.h" -#include "CCDB/BasicCCDBManager.h" -#include "DataFormatsParameters/GRPMagField.h" -#include "DataFormatsParameters/GRPObject.h" -#include "DetectorsBase/Propagator.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/AnalysisTask.h" -#include "Framework/ASoAHelpers.h" -#include "Framework/HistogramRegistry.h" -#include "Framework/runDataProcessing.h" - -#include "Common/Core/trackUtilities.h" - -#include "PWGHF/Core/SelectorCuts.h" -#include "PWGHF/DataModel/CandidateReconstructionTables.h" -#include "PWGHF/DataModel/CandidateSelectionTables.h" - -#include "EventFiltering/PWGHF/HFFilterHelpers.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include +#include +#include +#include using namespace o2; using namespace o2::analysis; From 637c818e8e19e00549d41c6286124eb0412d164a Mon Sep 17 00:00:00 2001 From: Francesca Ercolessi Date: Fri, 13 Jun 2025 15:15:07 +0200 Subject: [PATCH 1614/1650] [PWGLF] nuclei-proton angular correlations: Add dp and pp correlation (#11605) --- .../Tasks/Nuspex/hadronnucleicorrelation.cxx | 433 ++++++++++++++---- 1 file changed, 350 insertions(+), 83 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx b/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx index 6407e12a3c9..f90d12d75b1 100644 --- a/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx +++ b/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx @@ -13,36 +13,38 @@ /// \author Francesca Ercolessi /// \since 21 April 2024 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "TGrid.h" +#include "PWGCF/Femto3D/Core/femto3dPairTask.h" +#include "PWGCF/Femto3D/DataModel/singletrackselector.h" + +#include "Common/Core/RecoDecay.h" +#include "Common/DataModel/Multiplicity.h" #include "CCDB/BasicCCDBManager.h" #include "CCDB/CcdbApi.h" -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/HistogramRegistry.h" - #include "Framework/ASoA.h" -#include "MathUtils/Utils.h" -#include "Framework/DataTypes.h" -#include "Common/DataModel/Multiplicity.h" #include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/DataTypes.h" #include "Framework/Expressions.h" - +#include "Framework/HistogramRegistry.h" #include "Framework/StaticFor.h" -#include "PWGCF/Femto3D/DataModel/singletrackselector.h" -#include "PWGCF/Femto3D/Core/femto3dPairTask.h" +#include "Framework/runDataProcessing.h" +#include "MathUtils/Utils.h" + +#include "TGrid.h" +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include using namespace o2; using namespace o2::soa; @@ -56,6 +58,8 @@ struct hadronnucleicorrelation { static constexpr int pdgProton = 2212; static constexpr int pdgDeuteron = 1000010020; + Configurable mode{"mode", 0, "0: antid-antip, 1: d-p, 2: antid-p, 3: d-antip, 4: antip-p, 5: antip-antip, 6: p-p"}; + Configurable doQA{"doQA", true, "save QA histograms"}; Configurable doMCQA{"doMCQA", false, "save MC QA histograms"}; Configurable isMC{"isMC", false, "is MC"}; @@ -143,16 +147,21 @@ struct hadronnucleicorrelation { // key: pair of an integer and a float - value: vector of colType objects // for each key I have a vector of collisions - std::map, std::vector> mixbins_antidantip; + std::map, std::vector> mixbins_antid; + std::map, std::vector> mixbins_d; + std::map, std::vector> mixbins_antip; + std::map, std::vector> mixbins_p; std::map, std::vector> mixbinsPID_antidantip; std::map> mixbinsMC_antidantip; std::map> mixbinsMC_dp; - std::vector> hEtaPhi_AntiDeAntiPr_SE; - std::vector> hEtaPhi_AntiDeAntiPr_ME; - std::vector> hCorrEtaPhi_AntiDeAntiPr_SE; - std::vector> hCorrEtaPhi_AntiDeAntiPr_ME; + // Data histograms + std::vector> hEtaPhi_SE; + std::vector> hEtaPhi_ME; + std::vector> hCorrEtaPhi_SE; + std::vector> hCorrEtaPhi_ME; + // MC histograms std::vector> hEtaPhiRec_AntiDeAntiPr_SE; std::vector> hEtaPhiGen_AntiDeAntiPr_SE; std::vector> hEtaPhiRec_AntiDeAntiPr_ME; @@ -161,7 +170,6 @@ struct hadronnucleicorrelation { std::vector> hPIDEtaPhiGen_AntiDeAntiPr_SE; std::vector> hPIDEtaPhiRec_AntiDeAntiPr_ME; std::vector> hPIDEtaPhiGen_AntiDeAntiPr_ME; - std::vector> hEtaPhiGen_AntiPrAntiPr_SE; std::vector> hEtaPhiGen_AntiPrAntiPr_ME; @@ -193,19 +201,21 @@ struct hadronnucleicorrelation { AxisSpec ptBinnedAxis = {pTBins, "#it{p}_{T} of #bar{p} (GeV/c)"}; AxisSpec etaAxis = {100, -1., 1., "#eta"}; - AxisSpec phiAxis = {157, 0., 2 * o2::constants::math::PI, "#phi (rad)"}; + AxisSpec phiAxis = {157, 0., o2::constants::math::TwoPI, "#phi (rad)"}; AxisSpec pTAxis = {200, -10.f, 10.f, "p_{T} GeV/c"}; AxisSpec pTAxis_small = {100, -5.f, 5.f, "p_{T} GeV/c"}; AxisSpec DeltaEtaAxis = {100, -1.5, 1.5, "#Delta#eta"}; - AxisSpec DeltaPhiAxis = {60, -o2::constants::math::PI / 2, 1.5 * o2::constants::math::PI, "#Delta#phi (rad)"}; + AxisSpec DeltaPhiAxis = {60, -1 * o2::constants::math::PIHalf, 3 * o2::constants::math::PIHalf, "#Delta#phi (rad)"}; - registry.add("hNEvents", "hNEvents", {HistType::kTH1D, {{5, 0.f, 5.f}}}); + registry.add("hNEvents", "hNEvents", {HistType::kTH1D, {{7, 0.f, 7.f}}}); registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(1, "Selected"); registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(2, "events with #bar{d}-#bar{p}"); registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(3, "events with d-p"); registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(4, "events with #bar{d}"); registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(5, "events with d"); + registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(6, "events with #bar{p}"); + registry.get(HIST("hNEvents"))->GetXaxis()->SetBinLabel(7, "events with p"); nBinspT = pTBins.value.size() - 1; @@ -251,17 +261,40 @@ struct hadronnucleicorrelation { } } + TString name = "AntiDeAntiPr"; + switch (mode) { + case 1: + name = "DePr"; + break; + case 2: + name = "AntiDePr"; + break; + case 3: + name = "DeAntiPr"; + break; + case 4: + name = "AntiPrPr"; + break; + case 5: + name = "AntiPrAntiPr"; + break; + case 6: + name = "PrPr"; + break; + } + if (!isMC) { for (int i = 0; i < nBinspT; i++) { - auto htempSE_AntiDeAntiPr = registry.add(Form("hEtaPhi_AntiDeAntiPr_SE_pt%02.0f%02.0f", pTBins.value.at(i) * 10, pTBins.value.at(i + 1) * 10), Form("Raw #Delta#eta#Delta#phi (%.1f(Form("hEtaPhi_AntiDeAntiPr_ME_pt%02.0f%02.0f", pTBins.value.at(i) * 10, pTBins.value.at(i + 1) * 10), Form("Raw #Delta#eta#Delta#phi (%.1f(Form("hCorrEtaPhi_AntiDeAntiPr_SE_pt%02.0f%02.0f", pTBins.value.at(i) * 10, pTBins.value.at(i + 1) * 10), Form("#Delta#eta#Delta#phi (%.1f(Form("hCorrEtaPhi_AntiDeAntiPr_ME_pt%02.0f%02.0f", pTBins.value.at(i) * 10, pTBins.value.at(i + 1) * 10), Form("#Delta#eta#Delta#phi (%.1f(Form("hEtaPhi_%s_SE_pt%02.0f%02.0f", name.Data(), pTBins.value.at(i) * 10, pTBins.value.at(i + 1) * 10), Form("Raw #Delta#eta#Delta#phi (%.1f(Form("hEtaPhi_%s_ME_pt%02.0f%02.0f", name.Data(), pTBins.value.at(i) * 10, pTBins.value.at(i + 1) * 10), Form("Raw #Delta#eta#Delta#phi (%.1f(Form("hCorrEtaPhi_%s_SE_pt%02.0f%02.0f", name.Data(), pTBins.value.at(i) * 10, pTBins.value.at(i + 1) * 10), Form("#Delta#eta#Delta#phi (%.1f(Form("hCorrEtaPhi_%s_ME_pt%02.0f%02.0f", name.Data(), pTBins.value.at(i) * 10, pTBins.value.at(i + 1) * 10), Form("#Delta#eta#Delta#phi (%.1f - void mixTracks(Type const& tracks1, Type const& tracks2, bool isMCPID) + void mixTracks(Type const& tracks1, Type const& tracks2, bool isIdentical, bool isMCPID) { // last value: 0 -- SE; 1 -- ME for (auto it1 : tracks1) { for (auto it2 : tracks2) { @@ -529,7 +562,7 @@ struct hadronnucleicorrelation { // Calculate Delta-eta Delta-phi (reco) float deltaEta = it2->eta() - it1->eta(); float deltaPhi = it2->phi() - it1->phi(); - deltaPhi = getDeltaPhi(deltaPhi); + deltaPhi = RecoDecay::constrainAngle(deltaPhi, -1 * o2::constants::math::PIHalf); // Calculate Delta-eta Delta-phi (gen) float deltaEtaGen = -999.; @@ -537,24 +570,52 @@ struct hadronnucleicorrelation { if constexpr (doMC) { deltaEtaGen = it2->eta_MC() - it1->eta_MC(); deltaPhiGen = it2->phi_MC() - it1->phi_MC(); - deltaPhiGen = getDeltaPhi(deltaPhiGen); + deltaPhiGen = RecoDecay::constrainAngle(deltaPhiGen, -1 * o2::constants::math::PIHalf); } - float antipcorr = 1, antidcorr = 1; - for (int k = 0; k < nBinspT; k++) { if (it1->pt() >= pTBins.value.at(k) && it1->pt() < pTBins.value.at(k + 1)) { + float corr1 = 1, corr2 = 1; + if (docorrection) { // Apply corrections - antipcorr = hEffpTEta_antiproton->Interpolate(it2->pt(), it2->eta()); - antidcorr = hEffpTEta_antideuteron->Interpolate(it1->pt(), it1->eta()); + switch (mode) { + case 0: + corr1 = hEffpTEta_antideuteron->Interpolate(it1->pt(), it1->eta()); + corr2 = hEffpTEta_antiproton->Interpolate(it2->pt(), it2->eta()); + break; + case 1: + corr1 = hEffpTEta_deuteron->Interpolate(it1->pt(), it1->eta()); + corr2 = hEffpTEta_proton->Interpolate(it2->pt(), it2->eta()); + break; + case 2: + corr1 = hEffpTEta_antideuteron->Interpolate(it1->pt(), it1->eta()); + corr2 = hEffpTEta_proton->Interpolate(it2->pt(), it2->eta()); + break; + case 3: + corr1 = hEffpTEta_deuteron->Interpolate(it1->pt(), it1->eta()); + corr2 = hEffpTEta_antiproton->Interpolate(it2->pt(), it2->eta()); + break; + case 4: + corr1 = hEffpTEta_antiproton->Interpolate(it1->pt(), it1->eta()); + corr2 = hEffpTEta_proton->Interpolate(it2->pt(), it2->eta()); + break; + case 5: + corr1 = hEffpTEta_antiproton->Interpolate(it1->pt(), it1->eta()); + corr2 = hEffpTEta_antiproton->Interpolate(it2->pt(), it2->eta()); + break; + case 6: + corr1 = hEffpTEta_proton->Interpolate(it1->pt(), it1->eta()); + corr2 = hEffpTEta_proton->Interpolate(it2->pt(), it2->eta()); + break; + } } if (ME) { if constexpr (!doMC) { // Data - hEtaPhi_AntiDeAntiPr_ME[k]->Fill(deltaEta, deltaPhi, it2->pt()); - hCorrEtaPhi_AntiDeAntiPr_ME[k]->Fill(deltaEta, deltaPhi, it2->pt(), 1. / (antipcorr * antidcorr)); + hEtaPhi_ME[k]->Fill(deltaEta, deltaPhi, it2->pt()); + hCorrEtaPhi_ME[k]->Fill(deltaEta, deltaPhi, it2->pt(), 1. / (corr1 * corr2)); } else { // MC if (isMCPID) { hPIDEtaPhiRec_AntiDeAntiPr_ME[k]->Fill(deltaEta, deltaPhi, it2->pt()); @@ -566,8 +627,12 @@ struct hadronnucleicorrelation { } } else { if constexpr (!doMC) { // Data - hEtaPhi_AntiDeAntiPr_SE[k]->Fill(deltaEta, deltaPhi, it2->pt()); - hCorrEtaPhi_AntiDeAntiPr_SE[k]->Fill(deltaEta, deltaPhi, it2->pt(), 1. / (antipcorr * antidcorr)); + // is Identical (pp and antip-antip)? + if (isIdentical && std::abs(deltaPhi) < 0.001 && std::abs(deltaEta) < 0.001) { + continue; + } + hEtaPhi_SE[k]->Fill(deltaEta, deltaPhi, it2->pt()); + hCorrEtaPhi_SE[k]->Fill(deltaEta, deltaPhi, it2->pt(), 1. / (corr1 * corr2)); } else { // MC if (isMCPID) { hPIDEtaPhiRec_AntiDeAntiPr_SE[k]->Fill(deltaEta, deltaPhi, it2->pt()); @@ -591,7 +656,7 @@ struct hadronnucleicorrelation { for (auto it2 : particles2) { // Calculate Delta-eta Delta-phi (gen) float deltaEtaGen = it2->eta() - it1->eta(); - float deltaPhiGen = getDeltaPhi(it2->phi() - it1->phi()); + float deltaPhiGen = RecoDecay::constrainAngle(it2->phi() - it1->phi(), -1 * o2::constants::math::PIHalf); // Loop over pT bins for (int k = 0; k < nBinspT; k++) { @@ -615,7 +680,7 @@ struct hadronnucleicorrelation { for (auto it2 : particles2) { // Calculate Delta-eta Delta-phi (gen) float deltaEtaGen = it2->eta() - it1->eta(); - float deltaPhiGen = getDeltaPhi(it2->phi() - it1->phi()); + float deltaPhiGen = RecoDecay::constrainAngle(it2->phi() - it1->phi(), -1 * o2::constants::math::PIHalf); if (!ME && std::abs(deltaPhiGen) < 0.001 && std::abs(deltaEtaGen) < 0.001) { continue; @@ -636,16 +701,6 @@ struct hadronnucleicorrelation { } } - float getDeltaPhi(float deltaPhi) - { - if (deltaPhi < -o2::constants::math::PI / 2) { - return deltaPhi += 2 * o2::constants::math::PI; - } else if (deltaPhi >= 3 * o2::constants::math::PI / 2) { - return deltaPhi -= 2 * o2::constants::math::PI; - } - return deltaPhi; - } - void GetCorrection(o2::framework::Service const& ccdbObj, TString filepath, TString histname) { TList* l = ccdbObj->get(filepath.Data()); @@ -793,14 +848,180 @@ struct hadronnucleicorrelation { if (selectedtracks_antid.find(collision.globalIndex()) != selectedtracks_antid.end()) { registry.fill(HIST("hNEvents"), 3.5); + mixbins_antid[std::pair{vertexBinToMix, centBinToMix}].push_back(std::make_shared(collision)); + } + if (selectedtracks_d.find(collision.globalIndex()) != selectedtracks_d.end()) { + registry.fill(HIST("hNEvents"), 4.5); + mixbins_d[std::pair{vertexBinToMix, centBinToMix}].push_back(std::make_shared(collision)); + } + if (selectedtracks_antip.find(collision.globalIndex()) != selectedtracks_antip.end()) { + registry.fill(HIST("hNEvents"), 5.5); + mixbins_antip[std::pair{vertexBinToMix, centBinToMix}].push_back(std::make_shared(collision)); + } + if (selectedtracks_p.find(collision.globalIndex()) != selectedtracks_p.end()) { + registry.fill(HIST("hNEvents"), 6.5); + mixbins_p[std::pair{vertexBinToMix, centBinToMix}].push_back(std::make_shared(collision)); + } + } + + if (mode == 0 && !mixbins_antid.empty()) { + + for (auto i = mixbins_antid.begin(); i != mixbins_antid.end(); i++) { // iterating over all vertex&mult bins + + std::vector value = i->second; + int EvPerBin = value.size(); // number of collisions in each vertex&mult bin + + for (int indx1 = 0; indx1 < EvPerBin; indx1++) { // loop over all the events in each vertex&mult bin + + auto col1 = value[indx1]; + + if (selectedtracks_antip.find(col1->index()) != selectedtracks_antip.end()) { + mixTracks<0, 0>(selectedtracks_antid[col1->index()], selectedtracks_antip[col1->index()], 0, 0); // mixing SE + } + + for (int indx2 = 0; indx2 < EvPerBin; indx2++) { // nested loop for all the combinations of collisions in a chosen mult/vertex bin + + auto col2 = value[indx2]; + + if (col1 == col2) { + continue; + } - mixbins_antidantip[std::pair{vertexBinToMix, centBinToMix}].push_back(std::make_shared(collision)); + if (selectedtracks_antip.find(col2->index()) != selectedtracks_antip.end()) { + mixTracks<1, 0>(selectedtracks_antid[col1->index()], selectedtracks_antip[col2->index()], 0, 0); // mixing ME + } + } + } } } - if (!mixbins_antidantip.empty()) { + if (mode == 1 && !mixbins_d.empty()) { - for (auto i = mixbins_antidantip.begin(); i != mixbins_antidantip.end(); i++) { // iterating over all vertex&mult bins + for (auto i = mixbins_d.begin(); i != mixbins_d.end(); i++) { // iterating over all vertex&mult bins + + std::vector value = i->second; + int EvPerBin = value.size(); // number of collisions in each vertex&mult bin + + for (int indx1 = 0; indx1 < EvPerBin; indx1++) { // loop over all the events in each vertex&mult bin + + auto col1 = value[indx1]; + + if (selectedtracks_p.find(col1->index()) != selectedtracks_p.end()) { + mixTracks<0, 0>(selectedtracks_d[col1->index()], selectedtracks_p[col1->index()], 0, 0); // mixing SE + } + + for (int indx2 = 0; indx2 < EvPerBin; indx2++) { // nested loop for all the combinations of collisions in a chosen mult/vertex bin + + auto col2 = value[indx2]; + + if (col1 == col2) { + continue; + } + + if (selectedtracks_p.find(col2->index()) != selectedtracks_p.end()) { + mixTracks<1, 0>(selectedtracks_d[col1->index()], selectedtracks_p[col2->index()], 0, 0); // mixing ME + } + } + } + } + } + + if (mode == 2 && !mixbins_antid.empty()) { + + for (auto i = mixbins_antid.begin(); i != mixbins_antid.end(); i++) { // iterating over all vertex&mult bins + + std::vector value = i->second; + int EvPerBin = value.size(); // number of collisions in each vertex&mult bin + + for (int indx1 = 0; indx1 < EvPerBin; indx1++) { // loop over all the events in each vertex&mult bin + + auto col1 = value[indx1]; + + if (selectedtracks_p.find(col1->index()) != selectedtracks_p.end()) { + mixTracks<0, 0>(selectedtracks_antid[col1->index()], selectedtracks_p[col1->index()], 0, 0); // mixing SE + } + + for (int indx2 = 0; indx2 < EvPerBin; indx2++) { // nested loop for all the combinations of collisions in a chosen mult/vertex bin + + auto col2 = value[indx2]; + + if (col1 == col2) { + continue; + } + + if (selectedtracks_p.find(col2->index()) != selectedtracks_p.end()) { + mixTracks<1, 0>(selectedtracks_antid[col1->index()], selectedtracks_p[col2->index()], 0, 0); // mixing ME + } + } + } + } + } + + if (mode == 3 && !mixbins_d.empty()) { + + for (auto i = mixbins_d.begin(); i != mixbins_d.end(); i++) { // iterating over all vertex&mult bins + + std::vector value = i->second; + int EvPerBin = value.size(); // number of collisions in each vertex&mult bin + + for (int indx1 = 0; indx1 < EvPerBin; indx1++) { // loop over all the events in each vertex&mult bin + + auto col1 = value[indx1]; + + if (selectedtracks_antip.find(col1->index()) != selectedtracks_antip.end()) { + mixTracks<0, 0>(selectedtracks_d[col1->index()], selectedtracks_antip[col1->index()], 0, 0); // mixing SE + } + + for (int indx2 = 0; indx2 < EvPerBin; indx2++) { // nested loop for all the combinations of collisions in a chosen mult/vertex bin + + auto col2 = value[indx2]; + + if (col1 == col2) { + continue; + } + + if (selectedtracks_antip.find(col2->index()) != selectedtracks_antip.end()) { + mixTracks<1, 0>(selectedtracks_d[col1->index()], selectedtracks_antip[col2->index()], 0, 0); // mixing ME + } + } + } + } + } + + if (mode == 4 && !mixbins_antip.empty()) { + + for (auto i = mixbins_antip.begin(); i != mixbins_antip.end(); i++) { // iterating over all vertex&mult bins + + std::vector value = i->second; + int EvPerBin = value.size(); // number of collisions in each vertex&mult bin + + for (int indx1 = 0; indx1 < EvPerBin; indx1++) { // loop over all the events in each vertex&mult bin + + auto col1 = value[indx1]; + + if (selectedtracks_p.find(col1->index()) != selectedtracks_p.end()) { + mixTracks<0, 0>(selectedtracks_antip[col1->index()], selectedtracks_p[col1->index()], 0, 0); // mixing SE + } + + for (int indx2 = 0; indx2 < EvPerBin; indx2++) { // nested loop for all the combinations of collisions in a chosen mult/vertex bin + + auto col2 = value[indx2]; + + if (col1 == col2) { + continue; + } + + if (selectedtracks_p.find(col2->index()) != selectedtracks_p.end()) { + mixTracks<1, 0>(selectedtracks_antip[col1->index()], selectedtracks_p[col2->index()], 0, 0); // mixing ME + } + } + } + } + } + + if (mode == 5 && !mixbins_antip.empty()) { + + for (auto i = mixbins_antip.begin(); i != mixbins_antip.end(); i++) { // iterating over all vertex&mult bins std::vector value = i->second; int EvPerBin = value.size(); // number of collisions in each vertex&mult bin @@ -810,7 +1031,7 @@ struct hadronnucleicorrelation { auto col1 = value[indx1]; if (selectedtracks_antip.find(col1->index()) != selectedtracks_antip.end()) { - mixTracks<0, 0>(selectedtracks_antid[col1->index()], selectedtracks_antip[col1->index()], 0); // mixing SE + mixTracks<0, 0>(selectedtracks_antip[col1->index()], selectedtracks_antip[col1->index()], 1, 0); // mixing SE } for (int indx2 = 0; indx2 < EvPerBin; indx2++) { // nested loop for all the combinations of collisions in a chosen mult/vertex bin @@ -822,7 +1043,38 @@ struct hadronnucleicorrelation { } if (selectedtracks_antip.find(col2->index()) != selectedtracks_antip.end()) { - mixTracks<1, 0>(selectedtracks_antid[col1->index()], selectedtracks_antip[col2->index()], 0); // mixing ME + mixTracks<1, 0>(selectedtracks_antip[col1->index()], selectedtracks_antip[col2->index()], 1, 0); // mixing ME + } + } + } + } + } + + if (mode == 6 && !mixbins_p.empty()) { + + for (auto i = mixbins_p.begin(); i != mixbins_p.end(); i++) { // iterating over all vertex&mult bins + + std::vector value = i->second; + int EvPerBin = value.size(); // number of collisions in each vertex&mult bin + + for (int indx1 = 0; indx1 < EvPerBin; indx1++) { // loop over all the events in each vertex&mult bin + + auto col1 = value[indx1]; + + if (selectedtracks_p.find(col1->index()) != selectedtracks_p.end()) { + mixTracks<0, 0>(selectedtracks_p[col1->index()], selectedtracks_p[col1->index()], 1, 0); // mixing SE + } + + for (int indx2 = 0; indx2 < EvPerBin; indx2++) { // nested loop for all the combinations of collisions in a chosen mult/vertex bin + + auto col2 = value[indx2]; + + if (col1 == col2) { + continue; + } + + if (selectedtracks_p.find(col2->index()) != selectedtracks_p.end()) { + mixTracks<1, 0>(selectedtracks_p[col1->index()], selectedtracks_p[col2->index()], 1, 0); // mixing ME } } } @@ -846,10 +1098,25 @@ struct hadronnucleicorrelation { (i->second).clear(); selectedtracks_d.clear(); - for (auto& pair : mixbins_antidantip) { + for (auto& pair : mixbins_antid) { + pair.second.clear(); // Clear the vector associated with the key + } + mixbins_antid.clear(); // Then clear the map itself + + for (auto& pair : mixbins_d) { + pair.second.clear(); // Clear the vector associated with the key + } + mixbins_d.clear(); // Then clear the map itself + + for (auto& pair : mixbins_antip) { + pair.second.clear(); // Clear the vector associated with the key + } + mixbins_antip.clear(); // Then clear the map itself + + for (auto& pair : mixbins_p) { pair.second.clear(); // Clear the vector associated with the key } - mixbins_antidantip.clear(); // Then clear the map itself + mixbins_p.clear(); // Then clear the map itself } PROCESS_SWITCH(hadronnucleicorrelation, processData, "processData", true); @@ -1222,7 +1489,7 @@ struct hadronnucleicorrelation { int centBinToMix = std::floor(collision.multPerc() / (100.0 / _multNsubBins)); if (selectedtracksMC_antid.find(collision.globalIndex()) != selectedtracksMC_antid.end()) { - mixbins_antidantip[std::pair{vertexBinToMix, centBinToMix}].push_back(std::make_shared(collision)); + mixbins_antid[std::pair{vertexBinToMix, centBinToMix}].push_back(std::make_shared(collision)); } if (selectedtracksPIDMC_antid.find(collision.globalIndex()) != selectedtracksPIDMC_antid.end()) { @@ -1230,9 +1497,9 @@ struct hadronnucleicorrelation { } } // coll - if (!mixbins_antidantip.empty()) { + if (!mixbins_antid.empty()) { - for (auto i = mixbins_antidantip.begin(); i != mixbins_antidantip.end(); i++) { // iterating over all vertex&mult bins + for (auto i = mixbins_antid.begin(); i != mixbins_antid.end(); i++) { // iterating over all vertex&mult bins std::vector value = i->second; int EvPerBin = value.size(); // number of collisions in each vertex&mult bin @@ -1242,7 +1509,7 @@ struct hadronnucleicorrelation { auto col1 = value[indx1]; if (selectedtracksMC_antip.find(col1->index()) != selectedtracksMC_antip.end()) { - mixTracks<0, 1>(selectedtracksMC_antid[col1->index()], selectedtracksMC_antip[col1->index()], 0); // mixing SE + mixTracks<0, 1>(selectedtracksMC_antid[col1->index()], selectedtracksMC_antip[col1->index()], 0, 0); // mixing SE } for (int indx2 = indx1 + 1; indx2 < EvPerBin; indx2++) { // nested loop for all the combinations of collisions in a chosen mult/vertex bin @@ -1254,7 +1521,7 @@ struct hadronnucleicorrelation { } if (selectedtracksMC_antip.find(col2->index()) != selectedtracksMC_antip.end()) { - mixTracks<1, 1>(selectedtracksMC_antid[col1->index()], selectedtracksMC_antip[col2->index()], 0); // mixing ME + mixTracks<1, 1>(selectedtracksMC_antid[col1->index()], selectedtracksMC_antip[col2->index()], 0, 0); // mixing ME } } } @@ -1273,7 +1540,7 @@ struct hadronnucleicorrelation { auto col1 = value[indx1]; if (selectedtracksPIDMC_antip.find(col1->index()) != selectedtracksPIDMC_antip.end()) { - mixTracks<0, 1>(selectedtracksPIDMC_antid[col1->index()], selectedtracksPIDMC_antip[col1->index()], 1); // mixing SE + mixTracks<0, 1>(selectedtracksPIDMC_antid[col1->index()], selectedtracksPIDMC_antip[col1->index()], 0, 1); // mixing SE } for (int indx2 = indx1 + 1; indx2 < EvPerBin; indx2++) { // nested loop for all the combinations of collisions in a chosen mult/vertex bin @@ -1285,7 +1552,7 @@ struct hadronnucleicorrelation { } if (selectedtracksPIDMC_antip.find(col2->index()) != selectedtracksPIDMC_antip.end()) { - mixTracks<1, 1>(selectedtracksPIDMC_antid[col1->index()], selectedtracksPIDMC_antip[col2->index()], 1); // mixing ME + mixTracks<1, 1>(selectedtracksPIDMC_antid[col1->index()], selectedtracksPIDMC_antip[col2->index()], 0, 1); // mixing ME } } } @@ -1330,10 +1597,10 @@ struct hadronnucleicorrelation { } mixbinsPID_antidantip.clear(); // clear the map - for (auto& pair : mixbins_antidantip) { + for (auto& pair : mixbins_antid) { pair.second.clear(); // clear the vector associated with the key } - mixbins_antidantip.clear(); // clear the map + mixbins_antid.clear(); // clear the map } PROCESS_SWITCH(hadronnucleicorrelation, processMC, "processMC", false); From ae5e3cc2e8345e7c7314d45795876bbea335f4a9 Mon Sep 17 00:00:00 2001 From: YubiaoWang Date: Fri, 13 Jun 2025 21:19:00 +0800 Subject: [PATCH 1615/1650] [PWGJE] Add MCD and MCP in jet v2 task, Updated Data and MC fitting check plots (#11596) --- PWGJE/Tasks/jetChargedV2.cxx | 1287 +++++++++++++++++++++++++++------- 1 file changed, 1028 insertions(+), 259 deletions(-) diff --git a/PWGJE/Tasks/jetChargedV2.cxx b/PWGJE/Tasks/jetChargedV2.cxx index 6133cc19a27..20ea7907a75 100644 --- a/PWGJE/Tasks/jetChargedV2.cxx +++ b/PWGJE/Tasks/jetChargedV2.cxx @@ -13,70 +13,60 @@ /// \file jetChargedV2.cxx /// \brief This file contains the implementation for the Charged Jet v2 analysis in the ALICE experiment -#include -#include -#include -#include -#include -#include -#include -#include -#include -// o2Physics includes. -#include "CommonConstants/MathConstants.h" -#include "CCDB/BasicCCDBManager.h" -#include "DataFormatsParameters/GRPMagField.h" - -#include "Framework/runDataProcessing.h" - -#include "Common/DataModel/FT0Corrected.h" -#include "Common/DataModel/Multiplicity.h" -#include "Common/DataModel/Centrality.h" -#include "Common/CCDB/ctpRateFetcher.h" - -//< evt pln .h >// -#include "Framework/ASoAHelpers.h" -#include "Framework/RunningWorkflowInfo.h" -#include "Framework/StaticFor.h" +#include "PWGJE/Core/FastJetUtilities.h" +#include "PWGJE/Core/JetDerivedDataUtilities.h" +#include "PWGJE/Core/JetFinder.h" +#include "PWGJE/Core/JetFindingUtilities.h" +#include "PWGJE/DataModel/Jet.h" -#include "Common/DataModel/Qvectors.h" #include "Common/Core/EventPlaneHelper.h" -//< evt pln .h | end >// - -// o2 includes. -#include "DetectorsCommonDataFormats/AlignParam.h" +#include "Common/Core/TrackSelection.h" +#include "Common/Core/TrackSelectionDefaults.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Qvectors.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "EventFiltering/filterTables.h" +#include "CommonConstants/PhysicsConstants.h" #include "Framework/ASoA.h" +#include "Framework/ASoAHelpers.h" #include "Framework/AnalysisDataModel.h" #include "Framework/AnalysisTask.h" -#include "Framework/O2DatabasePDGPlugin.h" #include "Framework/HistogramRegistry.h" +#include "Framework/O2DatabasePDGPlugin.h" +#include "Framework/RunningWorkflowInfo.h" +#include "Framework/StaticFor.h" +#include "Framework/runDataProcessing.h" -#include "Common/Core/TrackSelection.h" -#include "Common/Core/TrackSelectionDefaults.h" - -#include "Common/DataModel/EventSelection.h" -#include "Common/DataModel/TrackSelectionTables.h" - -#include "PWGJE/Core/FastJetUtilities.h" -#include "PWGJE/Core/JetFinder.h" -#include "PWGJE/Core/JetFindingUtilities.h" -#include "PWGJE/DataModel/Jet.h" +#include +#include +#include +#include +#include +#include +#include +#include -#include "PWGJE/Core/JetDerivedDataUtilities.h" -#include "EventFiltering/filterTables.h" +#include +#include +#include +#include +#include using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; struct JetChargedV2 { + using McParticleCollision = soa::Join; + using ChargedMCDMatchedJets = soa::Join; + using ChargedMCPMatchedJets = soa::Join; + HistogramRegistry registry; HistogramRegistry histosQA{"histosQA", {}, OutputObjHandlingPolicy::AnalysisObject, false, false}; Configurable eventSelections{"eventSelections", "sel8", "choose event selection"}; Configurable trackSelections{"trackSelections", "globalTracks", "set track selections"}; - Configurable> jetRadii{"jetRadii", std::vector{0.4}, "jet resolution parameters"}; Configurable vertexZCut{"vertexZCut", 10.0f, "Accepted z-vertex range"}; @@ -95,6 +85,7 @@ struct JetChargedV2 { Configurable jetPtMax{"jetPtMax", 200.0, "maximum pT acceptance for jets"}; Configurable jetEtaMin{"jetEtaMin", -0.9, "minimum eta acceptance for jets"}; Configurable jetEtaMax{"jetEtaMax", 0.9, "maximum eta acceptance for jets"}; + Configurable nBinsEta{"nBinsEta", 200, "number of bins for eta axes"}; Configurable jetRadius{"jetRadius", 0.2, "jet resolution parameters"}; Configurable randomConeLeadJetDeltaR{"randomConeLeadJetDeltaR", -99.0, "min distance between leading jet axis and random cone (RC) axis; if negative, min distance is set to automatic value of R_leadJet+R_RC "}; @@ -104,6 +95,7 @@ struct JetChargedV2 { Configurable randomConeR{"randomConeR", 0.4, "size of random Cone for estimating background fluctuations"}; Configurable trackOccupancyInTimeRangeMax{"trackOccupancyInTimeRangeMax", 999999, "maximum occupancy of tracks in neighbouring collisions in a given time range; only applied to reconstructed collisions (data and mcd jets), not mc collisions (mcp jets)"}; Configurable trackOccupancyInTimeRangeMin{"trackOccupancyInTimeRangeMin", -999999, "minimum occupancy of tracks in neighbouring collisions in a given time range; only applied to reconstructed collisions (data and mcd jets), not mc collisions (mcp jets)"}; + //=====================< evt pln >=====================// Configurable cfgAddEvtSel{"cfgAddEvtSel", true, "event selection"}; Configurable> cfgnMods{"cfgnMods", {2}, "Modulation of interest"}; @@ -124,6 +116,16 @@ struct JetChargedV2 { int refAId; int refBId; + //=====================< jetSpectraConfig to this analysis >=====================// + Configurable pTHatExponent{"pTHatExponent", 6.0, "exponent of the event weight for the calculation of pTHat"}; + Configurable acceptSplitCollisions{"acceptSplitCollisions", 0, "0: only look at mcCollisions that are not split; 1: accept split mcCollisions, 2: accept split mcCollisions but only look at the first reco collision associated with it"}; + Configurable pTHatAbsoluteMin{"pTHatAbsoluteMin", -99.0, "minimum value of pTHat"}; + Configurable skipMBGapEvents{"skipMBGapEvents", false, "flag to choose to reject min. bias gap events; jet-level rejection can also be applied at the jet finder level for jets only, here rejection is applied for collision and track process functions for the first time, and on jets in case it was set to false at the jet finder level"}; + Configurable checkMcCollisionIsMatched{"checkMcCollisionIsMatched", false, "0: count whole MCcollisions, 1: select MCcollisions which only have their correspond collisions"}; + Configurable pTHatMaxMCD{"pTHatMaxMCD", 999.0, "maximum fraction of hard scattering for jet acceptance in detector MC"}; + Configurable pTHatMaxMCP{"pTHatMaxMCP", 999.0, "maximum fraction of hard scattering for jet acceptance in particle MC"}; + Configurable checkLeadConstituentPtForMcpJets{"checkLeadConstituentPtForMcpJets", false, "flag to choose whether particle level jets should have their lead track pt above leadingConstituentPtMin to be accepted; off by default, as leadingConstituentPtMin cut is only applied on MCD jets for the Pb-Pb analysis using pp MC anchored to Pb-Pb for the response matrix"}; + template int getDetId(const T& name) { @@ -148,7 +150,7 @@ struct JetChargedV2 { return 0; } } - //=====================< evt pln | end >=====================// + //=====================< evt p615ln | end >=====================// Configurable selectedJetsRadius{"selectedJetsRadius", 0.2, "resolution parameter for histograms without radius"}; @@ -160,7 +162,12 @@ struct JetChargedV2 { double evtnum = 0; double accptTrack = 0; double fitTrack = 0; + float collQvecAmpDetId = 1e-8; TH1F* hPtsumSumptFit = nullptr; + TH1F* hPtsumSumptFitMCP = nullptr; + TF1* fFitModulationV2v3 = 0x0; + TH1F* hPtsumSumptFitP = nullptr; + TF1* fFitModulationV2v3P = 0x0; void init(o2::framework::InitContext&) { @@ -173,6 +180,12 @@ struct JetChargedV2 { refAId = 4; refBId = 5; } + auto jetRadiiBins = (std::vector)jetRadii; + if (jetRadiiBins.size() > 1) { + jetRadiiBins.push_back(jetRadiiBins[jetRadiiBins.size() - 1] + (std::abs(jetRadiiBins[jetRadiiBins.size() - 1] - jetRadiiBins[jetRadiiBins.size() - 2]))); + } else { + jetRadiiBins.push_back(jetRadiiBins[jetRadiiBins.size() - 1] + 0.1); + } auto jetPtTemp = 0.0; jetPtBins.push_back(jetPtTemp); @@ -200,8 +213,14 @@ struct JetChargedV2 { } std::sort(jetPtBinsRhoAreaSub.begin(), jetPtBinsRhoAreaSub.end()); - AxisSpec jetPtAxis = {jetPtBins, "#it{p}_{T} (GeV/#it{c})"}; - AxisSpec jetPtAxisRhoAreaSub = {jetPtBinsRhoAreaSub, "#it{p}_{T} (GeV/#it{c})"}; + //< MCAxis >// + AxisSpec centralityAxis = {1200, -10., 110., "Centrality"}; + AxisSpec trackPtAxis = {200, -0.5, 199.5, "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec trackEtaAxis = {nBinsEta, -1.0, 1.0, "#eta"}; + AxisSpec phiAxis = {160, -1.0, 7.0, "#varphi"}; + AxisSpec jetPtAxis = {200, 0., 200., "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec jetPtAxisRhoAreaSub = {400, -200., 200., "#it{p}_{T} (GeV/#it{c})"}; + AxisSpec jetEtaAxis = {nBinsEta, -1.0, 1.0, "#eta"}; AxisSpec axisPt = {40, 0.0, 4.0}; AxisSpec axisEta = {32, -0.8, 0.8}; @@ -211,102 +230,177 @@ struct JetChargedV2 { eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast(eventSelections)); trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast(trackSelections)); - //< Track efficiency plots >// - registry.add("h_collisions", "event status;event status;entries", {HistType::kTH1F, {{4, 0.0, 4.0}}}); - registry.add("h2_centrality_collisions", "centrality vs collisions; centrality; collisions", {HistType::kTH2F, {{120, -10., 110.}, {4, 0.0, 4.0}}}); - registry.add("h2_centrality_track_pt", "centrality vs track pT; centrality; #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {{1200, -10.0, 110.0}, {200, 0., 200.}}}); - registry.add("h2_centrality_track_eta", "centrality vs track #eta; centrality; #eta_{track}", {HistType::kTH2F, {{1200, -10.0, 110.0}, {100, -1.0, 1.0}}}); - registry.add("h2_centrality_track_phi", "centrality vs track #varphi; centrality; #varphi_{track}", {HistType::kTH2F, {{1200, -10.0, 110.0}, {160, -1.0, 7.}}}); - registry.add("h2_centrality_track_energy", "centrality vs track energy; centrality; Energy GeV", {HistType::kTH2F, {{120, -10., 110.}, {100, 0.0, 100.0}}}); - registry.add("h2_track_pt_track_sigmapt", "#sigma(#it{p}_{T})/#it{p}_{T}; #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {{100, 0., 10.}, {100000, 0.0, 100.0}}}); - registry.add("h2_track_pt_high_track_sigmapt", "#sigma(#it{p}_{T})/#it{p}_{T}; #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {{90, 10., 100.}, {100000, 0.0, 100.0}}}); - registry.add("h2_track_pt_track_sigma1overpt", "#sigma(1/#it{p}_{T}); #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {{100, 0., 10.}, {1000, 0.0, 10.0}}}); - registry.add("h2_track_pt_high_track_sigma1overpt", "#sigma(1/#it{p}_{T}); #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {{90, 10., 100.}, {1000, 0.0, 10.0}}}); - - //< \sigma p_T at local rho test plot > - registry.add("h_accept_Track", "all and accept track;Track;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); - registry.add("h_accept_Track_init", "all and accept track;Track;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); - registry.add("h_accept_Track_Fit", "all and accept track;Track;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); - - registry.add("h_ptsum_collnum", "ptsum collnum;collnum;entries", {HistType::kTH1F, {{40, 0.0, 40}}}); - registry.add("h_ptsum_sumpt", "jet sumpt;sum p_{T};entries", {HistType::kTH1F, {{40, 0., o2::constants::math::TwoPI}}}); - registry.add("h2_phi_track_eta", "phi vs track eta; #eta (GeV/#it{c}); #varphi", {HistType::kTH2F, {{100, -1.0, 1.0}, {40, 0., o2::constants::math::TwoPI}}}); - registry.add("h2_centrality_phi_w_pt", "centrality vs jet #varphi; centrality; entries", {HistType::kTH2F, {{100, 0.0, 100.0}, {40, 0., o2::constants::math::TwoPI}}}); - registry.add("h2_evtnum_phi_w_pt", "eventNumber vs jet #varphi; #eventNumber; entries", {HistType::kTH2F, {{1000, 0.0, 1000}, {40, 0., o2::constants::math::TwoPI}}}); - - //< fit quality >// - registry.add("h_PvalueCDF_CombinFit", "cDF #chi^{2}; entries", {HistType::kTH1F, {{50, 0, 1}}}); - registry.add("h2_PvalueCDFCent_CombinFit", "p-value cDF vs centrality; centrality; p-value", {HistType::kTH2F, {{100, 0, 100}, {40, 0, 1}}}); - registry.add("h2_Chi2Cent_CombinFit", "Chi2 vs centrality; centrality; #tilde{#chi^{2}}", {HistType::kTH2F, {{100, 0, 100}, {100, 0, 5}}}); - registry.add("h2_PChi2_CombinFit", "p-value vs #tilde{#chi^{2}}; p-value; #tilde{#chi^{2}}", {HistType::kTH2F, {{100, 0, 1}, {100, 0, 5}}}); - - registry.add("Thn_PChi2_CombinFitCent", "p-value vs #tilde{#chi^{2}}; p-value; #tilde{#chi^{2}}", {HistType::kTHnSparseF, {{100, 0.0, 100.0}, {100, 0, 1}, {100, 0, 5}}}); - registry.add("h2_PChi2_CombinFitA", "p-value vs #tilde{#chi^{2}}; p-value; #tilde{#chi^{2}}", {HistType::kTH2F, {{100, 0, 1}, {100, 0, 5}}}); - registry.add("h2_PChi2_CombinFitB", "p-value vs #tilde{#chi^{2}}; p-value; #tilde{#chi^{2}}", {HistType::kTH2F, {{100, 0, 1}, {100, 0, 5}}}); - - registry.add("h_evtnum_centrlity", "eventNumber vs centrality ; #eventNumber", {HistType::kTH1F, {{1000, 0.0, 1000}}}); - registry.add("h_evtnum_NTrk", "eventNumber vs Number of Track ; #eventNumber", {HistType::kTH1F, {{1000, 0.0, 1000}}}); - - registry.add("Thn_evtnum_phi_centrality", "eventNumber vs jet #varphi; #eventNumber; entries", {HistType::kTHnSparseF, {{1000, 0.0, 1000}, {40, 0., o2::constants::math::TwoPI}, {100, 0.0, 100.0}}}); - - registry.add("h2_evt_fitpara", "event vs fit parameter; evtnum; parameter", {HistType::kTH2F, {cfgAxisEvtfit, {5, 0., 5}}}); - - registry.add("h_v2obs_centrality", "fitparameter v2obs vs centrality ; #centrality", {HistType::kTProfile, {cfgAxisVnCent}}); - registry.add("h_v3obs_centrality", "fitparameter v3obs vs centrality ; #centrality", {HistType::kTProfile, {cfgAxisVnCent}}); - - registry.add("h_fitparaRho_evtnum", "fitparameter #rho_{0} vs evtnum ; #eventnumber", {HistType::kTH1F, {{1000, 0.0, 1000}}}); - registry.add("h_fitparaPsi2_evtnum", "fitparameter #Psi_{2} vs evtnum ; #eventnumber", {HistType::kTH1F, {{1000, 0.0, 1000}}}); - registry.add("h_fitparaPsi3_evtnum", "fitparameter #Psi_{3} vs evtnum ; #eventnumber", {HistType::kTH1F, {{1000, 0.0, 1000}}}); - registry.add("h_fitparav2obs_evtnum", "fitparameter v2obs vs evtnum ; #eventnumber", {HistType::kTH1F, {{1000, 0.0, 1000}}}); - registry.add("h_fitparav3obs_evtnum", "fitparameter v3obs vs evtnum ; #eventnumber", {HistType::kTH1F, {{1000, 0.0, 1000}}}); - - registry.add("h2_fitParaZero_cent", "#varphi vs #rho(#varphi); #cent; #fitParameter[0] ", {HistType::kTH2F, {{100, 0., 100}, {210, -10.0, 200.0}}}); - registry.add("h2_phi_rhophi", "#varphi vs #rho(#varphi); #varphi - #Psi_{EP,2}; #rho_{ch}(#varphi) ", {HistType::kTH2F, {{40, 0., o2::constants::math::TwoPI}, {210, -10.0, 200.0}}}); - registry.add("h2_phi_rholocal", "#varphi vs #rho(#varphi); #varphi - #Psi_{EP,2}; #rho(#varphi) ", {HistType::kTH2F, {{40, 0., o2::constants::math::TwoPI}, {210, -10.0, 200.0}}}); - registry.add("h2_phi_rholocal_cent", "#varphi vs #rho(#varphi); #cent; #rho(#varphi) ", {HistType::kTH2F, {{100, 0., 100}, {210, -10.0, 200.0}}}); - registry.add("h3_centrality_localrho_phi", "centrality; #rho_{local}; #Delta#varphi_{jet}", {HistType::kTH3F, {{120, -10.0, 110.0}, {200, 0.0, 200.0}, {40, 0., o2::constants::math::TwoPI}}}); - - registry.add("h3_centrality_rhovsphi_phi", "centrality; #rho(#varphi); #Delta#varphi_{jet}", {HistType::kTH3F, {{120, -10.0, 110.0}, {200, 0.0, 200.0}, {40, 0., o2::constants::math::TwoPI}}}); - //< \sigma p_T at local rho test plot | end > - - registry.add("h_jet_pt_rhoareasubtracted", "jet pT rhoareasubtracted;#it{p}_{T,jet} (GeV/#it{c}); entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); - registry.add("h_jet_pt_rholocal", "jet pT rholocal;#it{p}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); - - registry.add("h2_centrality_jet_pt_rhoareasubtracted", "centrality vs #it{p}_{T,jet}; centrality; #it{p}_{T,jet} (GeV/#it{c})", {HistType::kTH2F, {{1200, -10.0, 110.0}, jetPtAxisRhoAreaSub}}); - - registry.add("leadJetPt", "leadJet Pt ", {HistType::kTH1F, {{200, 0., 200.0}}}); - registry.add("leadJetPhi", "leadJet constituent #phi ", {HistType::kTH1F, {{80, -1.0, 7.}}}); - registry.add("leadJetEta", "leadJet constituent #eta ", {HistType::kTH1F, {{100, -1.0, 1.0}}}); - - //< RC test plots >// - registry.add("h3_centrality_deltapT_RandomCornPhi_rhorandomconewithoutleadingjet", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}; #Delta#varphi_{jet}", {HistType::kTH3F, {{100, 0.0, 100.0}, {400, -200.0, 200.0}, {100, 0., o2::constants::math::TwoPI}}}); - registry.add("h3_centrality_deltapT_RandomCornPhi_localrhovsphi", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}; #Delta#varphi_{jet}", {HistType::kTH3F, {{100, 0.0, 100.0}, {400, -200.0, 200.0}, {100, 0., o2::constants::math::TwoPI}}}); - registry.add("h2_centrality_deltapT_RandomCornPhi_RCprocess_rhorandomconewithoutleadingjet", "#it{p}_{T,random cone} - #it{area, random cone} * #it{rho}; #Delta#varphi_{jet}", {HistType::kTH2F, {{400, -200.0, 200.0}, {100, 0., o2::constants::math::TwoPI}}}); - - registry.add("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithoutleadingjet", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}(#varphi); #Delta#varphi_{jet}", {HistType::kTH3F, {{100, 0.0, 100.0}, {400, -200.0, 200.0}, {100, 0., o2::constants::math::TwoPI}}}); - //< bkg sub plot | end >// - //< median rho >// - registry.add("h_jet_pt_in_plane_v2", "jet pT;#it{p}^{in-plane}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); - registry.add("h_jet_pt_out_of_plane_v2", "jet pT;#it{p}^{out-of-plane}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); - registry.add("h_jet_pt_in_plane_v3", "jet pT;#it{p}^{in-plane}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); - registry.add("h_jet_pt_out_of_plane_v3", "jet pT;#it{p}^{out-of-plane}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); - - registry.add("h2_centrality_jet_pt_in_plane_v2", "centrality vs #it{p}^{in-plane}_{T,jet}; centrality; #it{p}_{T,jet} (GeV/#it{c})", {HistType::kTH2F, {{120, -10.0, 110.0}, jetPtAxisRhoAreaSub}}); - registry.add("h2_centrality_jet_pt_out_of_plane_v2", "centrality vs #it{p}^{out-of-plane}_{T,jet}; centrality; #it{p}_{T,jet} (GeV/#it{c})", {HistType::kTH2F, {{120, -10.0, 110.0}, jetPtAxisRhoAreaSub}}); - registry.add("h2_centrality_jet_pt_in_plane_v3", "centrality vs #it{p}^{in-plane}_{T,jet}; centrality; #it{p}_{T,jet} (GeV/#it{c})", {HistType::kTH2F, {{120, -10.0, 110.0}, jetPtAxisRhoAreaSub}}); - registry.add("h2_centrality_jet_pt_out_of_plane_v3", "centrality vs #it{p}^{out-of-plane}_{T,jet}; centrality; #it{p}_{T,jet} (GeV/#it{c})", {HistType::kTH2F, {{120, -10.0, 110.0}, jetPtAxisRhoAreaSub}}); - //< rho(phi) >// - registry.add("h_jet_pt_inclusive_v2_rho", "jet pT;#it{p}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); - registry.add("h_jet_pt_in_plane_v2_rho", "jet pT;#it{p}^{in-plane}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); - registry.add("h_jet_pt_out_of_plane_v2_rho", "jet pT;#it{p}^{out-of-plane}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); - registry.add("h_jet_pt_in_plane_v3_rho", "jet pT;#it{p}^{in-plane}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); - registry.add("h_jet_pt_out_of_plane_v3_rho", "jet pT;#it{p}^{out-of-plane}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); - - registry.add("h2_centrality_jet_pt_in_plane_v2_rho", "centrality vs #it{p}^{in-plane}_{T,jet}; centrality; #it{p}_{T,jet} (GeV/#it{c})", {HistType::kTH2F, {{120, -10.0, 110.0}, jetPtAxisRhoAreaSub}}); - registry.add("h2_centrality_jet_pt_out_of_plane_v2_rho", "centrality vs #it{p}^{out-of-plane}_{T,jet}; centrality; #it{p}_{T,jet} (GeV/#it{c})", {HistType::kTH2F, {{120, -10.0, 110.0}, jetPtAxisRhoAreaSub}}); - registry.add("h2_centrality_jet_pt_in_plane_v3_rho", "centrality vs #it{p}^{in-plane}_{T,jet}; centrality; #it{p}_{T,jet} (GeV/#it{c})", {HistType::kTH2F, {{120, -10.0, 110.0}, jetPtAxisRhoAreaSub}}); - registry.add("h2_centrality_jet_pt_out_of_plane_v3_rho", "centrality vs #it{p}^{out-of-plane}_{T,jet}; centrality; #it{p}_{T,jet} (GeV/#it{c})", {HistType::kTH2F, {{120, -10.0, 110.0}, jetPtAxisRhoAreaSub}}); + registry.add("h_jet_phat", "jet #hat{p};#hat{p} (GeV/#it{c});entries", {HistType::kTH1F, {{1000, 0, 1000}}}); + registry.add("h_jet_phat_weighted", "jet #hat{p};#hat{p} (GeV/#it{c});entries", {HistType::kTH1F, {{1000, 0, 1000}}}); + + if (doprocessSigmaPtMCP) { + registry.add("h_jet_eta_part_rhoareasubtracted", "part jet #eta;#eta^{part}; counts", {HistType::kTH1F, {jetEtaAxis}}); + registry.add("h_jet_phi_part_rhoareasubtracted", "part jet #varphi;#varphi^{part}; counts", {HistType::kTH1F, {phiAxis}}); + registry.add("h2_jet_pt_part_jet_area_part_rhoareasubtracted", "part jet #it{p}_{T,jet} vs. Area_{jet}; #it{p}_{T,jet}^{part} (GeV/#it{c}); Area_{jet}^{part}", {HistType::kTH2F, {jetPtAxisRhoAreaSub, {150, 0., 1.5}}}); + registry.add("h3_jet_pt_jet_eta_jet_phi_part_rhoareasubtracted", "part jet pt vs. eta vs.phi", {HistType::kTH3F, {jetPtAxisRhoAreaSub, jetEtaAxis, phiAxis}}); + registry.add("leadJetPtMCP", "MCP leadJet Pt ", {HistType::kTH1F, {{200, 0., 200.0}}}); + registry.add("leadJetPhiMCP", "MCP leadJet constituent #phi ", {HistType::kTH1F, {{80, -1.0, 7.}}}); + registry.add("leadJetEtaMCP", "MCP leadJet constituent #eta ", {HistType::kTH1F, {{100, -1.0, 1.0}}}); + registry.add("h_mcp_evtnum_NTrk", "MCP eventNumber vs Number of Track ; #eventNumber", {HistType::kTH1F, {{1000, 0.0, 1000}}}); + registry.add("h3_mcp_centrality_localrho_phi", "MCP centrality; #rho_{local}; #Delta#varphi_{jet}", {HistType::kTH3F, {{120, -10.0, 110.0}, {200, 0.0, 200.0}, {40, 0., o2::constants::math::TwoPI}}}); + registry.add("h_mcp_jet_pt_rholocal", "jet pT rholocal;#it{p}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); + registry.add("h2_mcp_phi_rholocal", "#varphi vs #rho(#varphi); #varphi - #Psi_{EP,2}; #rho(#varphi) ", {HistType::kTH2F, {{40, 0., o2::constants::math::TwoPI}, {210, -10.0, 200.0}}}); + //< MCP fit test >// + registry.add("h_mcp_ptsum_sumpt", "jet sumpt;sum p_{T};entries", {HistType::kTH1F, {{40, 0., o2::constants::math::TwoPI}}}); + registry.add("h2_mcp_phi_track_eta", "phi vs track eta; #eta (GeV/#it{c}); #varphi", {HistType::kTH2F, {{100, -1.0, 1.0}, {40, 0., o2::constants::math::TwoPI}}}); + registry.add("h_mcp_evtnum_centrlity", "eventNumber vs centrality ; #eventNumber", {HistType::kTH1F, {{1000, 0.0, 1000}}}); + registry.add("h_mcp_v2obs_centrality", "fitparameter v2obs vs centrality ; #centrality", {HistType::kTProfile, {cfgAxisVnCent}}); + registry.add("h_mcp_v3obs_centrality", "fitparameter v3obs vs centrality ; #centrality", {HistType::kTProfile, {cfgAxisVnCent}}); + registry.add("h_mcp_fitparaRho_evtnum", "fitparameter #rho_{0} vs evtnum ; #eventnumber", {HistType::kTH1F, {{1000, 0.0, 1000}}}); + registry.add("h_mcp_fitparaPsi2_evtnum", "fitparameter #Psi_{2} vs evtnum ; #eventnumber", {HistType::kTH1F, {{1000, 0.0, 1000}}}); + registry.add("h_mcp_fitparaPsi3_evtnum", "fitparameter #Psi_{3} vs evtnum ; #eventnumber", {HistType::kTH1F, {{1000, 0.0, 1000}}}); + registry.add("h_mcp_fitparav2obs_evtnum", "fitparameter v2obs vs evtnum ; #eventnumber", {HistType::kTH1F, {{1000, 0.0, 1000}}}); + registry.add("h_mcp_fitparav3obs_evtnum", "fitparameter v3obs vs evtnum ; #eventnumber", {HistType::kTH1F, {{1000, 0.0, 1000}}}); + + registry.add("h_mcp_jet_pt_in_plane_v2_rho", "jet pT;#it{p}^{in-plane}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); + registry.add("h_mcp_jet_pt_out_of_plane_v2_rho", "jet pT;#it{p}^{out-of-plane}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); + registry.add("h_mcp_jet_pt_in_plane_v3_rho", "jet pT;#it{p}^{in-plane}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); + registry.add("h_mcp_jet_pt_out_of_plane_v3_rho", "jet pT;#it{p}^{out-of-plane}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); + + registry.add("h2_mcp_centrality_jet_pt_in_plane_v2_rho", "centrality vs #it{p}^{in-plane}_{T,jet}; centrality; #it{p}_{T,jet} (GeV/#it{c})", {HistType::kTH2F, {{120, -10.0, 110.0}, jetPtAxisRhoAreaSub}}); + registry.add("h2_mcp_centrality_jet_pt_out_of_plane_v2_rho", "centrality vs #it{p}^{out-of-plane}_{T,jet}; centrality; #it{p}_{T,jet} (GeV/#it{c})", {HistType::kTH2F, {{120, -10.0, 110.0}, jetPtAxisRhoAreaSub}}); + registry.add("h2_mcp_centrality_jet_pt_in_plane_v3_rho", "centrality vs #it{p}^{in-plane}_{T,jet}; centrality; #it{p}_{T,jet} (GeV/#it{c})", {HistType::kTH2F, {{120, -10.0, 110.0}, jetPtAxisRhoAreaSub}}); + registry.add("h2_mcp_centrality_jet_pt_out_of_plane_v3_rho", "centrality vs #it{p}^{out-of-plane}_{T,jet}; centrality; #it{p}_{T,jet} (GeV/#it{c})", {HistType::kTH2F, {{120, -10.0, 110.0}, jetPtAxisRhoAreaSub}}); + + registry.add("h3_mcp_centrality_deltapT_RandomCornPhi_localrhovsphi", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}; #Delta#varphi_{jet}", {HistType::kTH3F, {{100, 0.0, 100.0}, {400, -200.0, 200.0}, {100, 0., o2::constants::math::TwoPI}}}); + registry.add("h3_mcp_centrality_deltapT_RandomCornPhi_rhorandomconewithoutleadingjet", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}; #Delta#varphi_{jet}", {HistType::kTH3F, {{100, 0.0, 100.0}, {400, -200.0, 200.0}, {100, 0., o2::constants::math::TwoPI}}}); + registry.add("h3_mcp_centrality_deltapT_RandomCornPhi_localrhovsphiwithoutleadingjet", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}(#varphi); #Delta#varphi_{jet}", {HistType::kTH3F, {{100, 0.0, 100.0}, {400, -200.0, 200.0}, {100, 0., o2::constants::math::TwoPI}}}); + + registry.add("h_mcColl_counts_areasub", " number of mc events; event status; entries", {HistType::kTH1F, {{10, 0, 10}}}); + registry.get(HIST("h_mcColl_counts_areasub"))->GetXaxis()->SetBinLabel(1, "allMcColl"); + registry.get(HIST("h_mcColl_counts_areasub"))->GetXaxis()->SetBinLabel(2, "vertexZ"); + registry.get(HIST("h_mcColl_counts_areasub"))->GetXaxis()->SetBinLabel(3, "noRecoColl"); + registry.get(HIST("h_mcColl_counts_areasub"))->GetXaxis()->SetBinLabel(4, "splitColl"); + registry.get(HIST("h_mcColl_counts_areasub"))->GetXaxis()->SetBinLabel(5, "recoEvtSel"); + registry.get(HIST("h_mcColl_counts_areasub"))->GetXaxis()->SetBinLabel(6, "centralitycut"); + registry.get(HIST("h_mcColl_counts_areasub"))->GetXaxis()->SetBinLabel(7, "occupancycut"); + registry.add("h_mcColl_rho", "mc collision rho;#rho (GeV/#it{c}); counts", {HistType::kTH1F, {{500, 0.0, 500.0}}}); + + //< \sigma p_T at local rho test plot > + registry.add("h_accept_Track", "all and accept track;Track;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); + registry.get(HIST("h_accept_Track"))->GetXaxis()->SetBinLabel(1, "acceptTrk"); + registry.get(HIST("h_accept_Track"))->GetXaxis()->SetBinLabel(2, "acceptTrkInFit"); + registry.get(HIST("h_accept_Track"))->GetXaxis()->SetBinLabel(3, "beforeSumptFit"); + registry.get(HIST("h_accept_Track"))->GetXaxis()->SetBinLabel(4, "afterSumptFit"); + registry.get(HIST("h_accept_Track"))->GetXaxis()->SetBinLabel(5, "getNtrk"); + registry.get(HIST("h_accept_Track"))->GetXaxis()->SetBinLabel(6, "getNtrkMCP"); + //< fit test >// + registry.add("h_ptsum_collnum", "ptsum collnum;collnum;entries", {HistType::kTH1F, {{40, 0.0, 40}}}); + registry.add("h_ptsum_sumpt", "jet sumpt;sum p_{T};entries", {HistType::kTH1F, {{40, 0., o2::constants::math::TwoPI}}}); + } + if (doprocessInOutJetV2 || doprocessInOutJetV2MCD || doprocessSigmaPt || doprocessSigmaPtMCD) { + //< Track efficiency plots >// + registry.add("h_collisions", "event status;event status;entries", {HistType::kTH1F, {{4, 0.0, 4.0}}}); + registry.add("h2_centrality_collisions", "centrality vs collisions; centrality; collisions", {HistType::kTH2F, {{120, -10., 110.}, {4, 0.0, 4.0}}}); + registry.add("h2_centrality_track_pt", "centrality vs track pT; centrality; #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {{1200, -10.0, 110.0}, {200, 0., 200.}}}); + registry.add("h2_centrality_track_eta", "centrality vs track #eta; centrality; #eta_{track}", {HistType::kTH2F, {{1200, -10.0, 110.0}, {100, -1.0, 1.0}}}); + registry.add("h2_centrality_track_phi", "centrality vs track #varphi; centrality; #varphi_{track}", {HistType::kTH2F, {{1200, -10.0, 110.0}, {160, -1.0, 7.}}}); + registry.add("h2_centrality_track_energy", "centrality vs track energy; centrality; Energy GeV", {HistType::kTH2F, {{120, -10., 110.}, {100, 0.0, 100.0}}}); + registry.add("h2_track_pt_track_sigmapt", "#sigma(#it{p}_{T})/#it{p}_{T}; #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {{100, 0., 10.}, {100000, 0.0, 100.0}}}); + registry.add("h2_track_pt_high_track_sigmapt", "#sigma(#it{p}_{T})/#it{p}_{T}; #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {{90, 10., 100.}, {100000, 0.0, 100.0}}}); + registry.add("h2_track_pt_track_sigma1overpt", "#sigma(1/#it{p}_{T}); #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {{100, 0., 10.}, {1000, 0.0, 10.0}}}); + registry.add("h2_track_pt_high_track_sigma1overpt", "#sigma(1/#it{p}_{T}); #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {{90, 10., 100.}, {1000, 0.0, 10.0}}}); + + //< \sigma p_T at local rho test plot > + registry.add("h_accept_Track", "all and accept track;Track;entries", {HistType::kTH1F, {{10, 0.0, 10.0}}}); + registry.get(HIST("h_accept_Track"))->GetXaxis()->SetBinLabel(1, "acceptTrk"); + registry.get(HIST("h_accept_Track"))->GetXaxis()->SetBinLabel(2, "acceptTrkInFit"); + registry.get(HIST("h_accept_Track"))->GetXaxis()->SetBinLabel(3, "beforeSumptFit"); + registry.get(HIST("h_accept_Track"))->GetXaxis()->SetBinLabel(4, "afterSumptFit"); + registry.get(HIST("h_accept_Track"))->GetXaxis()->SetBinLabel(5, "getNtrk"); + registry.get(HIST("h_accept_Track"))->GetXaxis()->SetBinLabel(6, "getNtrkMCP"); + + registry.add("h_ptsum_collnum", "ptsum collnum;collnum;entries", {HistType::kTH1F, {{40, 0.0, 40}}}); + registry.add("h_ptsum_sumpt", "jet sumpt;sum p_{T};entries", {HistType::kTH1F, {{40, 0., o2::constants::math::TwoPI}}}); + registry.add("h2_phi_track_eta", "phi vs track eta; #eta (GeV/#it{c}); #varphi", {HistType::kTH2F, {{100, -1.0, 1.0}, {40, 0., o2::constants::math::TwoPI}}}); + registry.add("h2_centrality_phi_w_pt", "centrality vs jet #varphi; centrality; entries", {HistType::kTH2F, {{100, 0.0, 100.0}, {40, 0., o2::constants::math::TwoPI}}}); + registry.add("h2_evtnum_phi_w_pt", "eventNumber vs jet #varphi; #eventNumber; entries", {HistType::kTH2F, {{1000, 0.0, 1000}, {40, 0., o2::constants::math::TwoPI}}}); + + //< fit quality >// + registry.add("h_PvalueCDF_CombinFit", "cDF #chi^{2}; entries", {HistType::kTH1F, {{50, 0, 1}}}); + registry.add("h2_PvalueCDFCent_CombinFit", "p-value cDF vs centrality; centrality; p-value", {HistType::kTH2F, {{100, 0, 100}, {40, 0, 1}}}); + registry.add("h2_Chi2Cent_CombinFit", "Chi2 vs centrality; centrality; #tilde{#chi^{2}}", {HistType::kTH2F, {{100, 0, 100}, {100, 0, 5}}}); + registry.add("h2_PChi2_CombinFit", "p-value vs #tilde{#chi^{2}}; p-value; #tilde{#chi^{2}}", {HistType::kTH2F, {{100, 0, 1}, {100, 0, 5}}}); + + registry.add("Thn_PChi2_CombinFitCent", "p-value vs #tilde{#chi^{2}}; p-value; #tilde{#chi^{2}}", {HistType::kTHnSparseF, {{100, 0.0, 100.0}, {100, 0, 1}, {100, 0, 5}}}); + registry.add("h2_PChi2_CombinFitA", "p-value vs #tilde{#chi^{2}}; p-value; #tilde{#chi^{2}}", {HistType::kTH2F, {{100, 0, 1}, {100, 0, 5}}}); + registry.add("h2_PChi2_CombinFitB", "p-value vs #tilde{#chi^{2}}; p-value; #tilde{#chi^{2}}", {HistType::kTH2F, {{100, 0, 1}, {100, 0, 5}}}); + + registry.add("h_evtnum_centrlity", "eventNumber vs centrality ; #eventNumber", {HistType::kTH1F, {{1000, 0.0, 1000}}}); + registry.add("h_evtnum_NTrk", "eventNumber vs Number of Track ; #eventNumber", {HistType::kTH1F, {{1000, 0.0, 1000}}}); + + registry.add("Thn_evtnum_phi_centrality", "eventNumber vs jet #varphi; #eventNumber; entries", {HistType::kTHnSparseF, {{1000, 0.0, 1000}, {40, 0., o2::constants::math::TwoPI}, {100, 0.0, 100.0}}}); + + registry.add("h2_evt_fitpara", "event vs fit parameter; evtnum; parameter", {HistType::kTH2F, {cfgAxisEvtfit, {5, 0., 5}}}); + registry.add("h_v2obs_centrality", "fitparameter v2obs vs centrality ; #centrality", {HistType::kTProfile, {cfgAxisVnCent}}); + registry.add("h_v3obs_centrality", "fitparameter v3obs vs centrality ; #centrality", {HistType::kTProfile, {cfgAxisVnCent}}); + + registry.add("h_fitparaRho_evtnum", "fitparameter #rho_{0} vs evtnum ; #eventnumber", {HistType::kTH1F, {{1000, 0.0, 1000}}}); + registry.add("h_fitparaPsi2_evtnum", "fitparameter #Psi_{2} vs evtnum ; #eventnumber", {HistType::kTH1F, {{1000, 0.0, 1000}}}); + registry.add("h_fitparaPsi3_evtnum", "fitparameter #Psi_{3} vs evtnum ; #eventnumber", {HistType::kTH1F, {{1000, 0.0, 1000}}}); + registry.add("h_fitparav2obs_evtnum", "fitparameter v2obs vs evtnum ; #eventnumber", {HistType::kTH1F, {{1000, 0.0, 1000}}}); + registry.add("h_fitparav3obs_evtnum", "fitparameter v3obs vs evtnum ; #eventnumber", {HistType::kTH1F, {{1000, 0.0, 1000}}}); + + registry.add("h2_fitParaZero_cent", "#varphi vs #rho(#varphi); #cent; #fitParameter[0] ", {HistType::kTH2F, {{100, 0., 100}, {210, -10.0, 200.0}}}); + registry.add("h2_phi_rhophi", "#varphi vs #rho(#varphi); #varphi - #Psi_{EP,2}; #rho_{ch}(#varphi) ", {HistType::kTH2F, {{40, 0., o2::constants::math::TwoPI}, {210, -10.0, 200.0}}}); + registry.add("h2_phi_rholocal", "#varphi vs #rho(#varphi); #varphi - #Psi_{EP,2}; #rho(#varphi) ", {HistType::kTH2F, {{40, 0., o2::constants::math::TwoPI}, {210, -10.0, 200.0}}}); + registry.add("h2_phi_rholocal_cent", "#varphi vs #rho(#varphi); #cent; #rho(#varphi) ", {HistType::kTH2F, {{100, 0., 100}, {210, -10.0, 200.0}}}); + registry.add("h3_centrality_localrho_phi", "centrality; #rho_{local}; #Delta#varphi_{jet}", {HistType::kTH3F, {{120, -10.0, 110.0}, {200, 0.0, 200.0}, {40, 0., o2::constants::math::TwoPI}}}); + + registry.add("h3_centrality_rhovsphi_phi", "centrality; #rho(#varphi); #Delta#varphi_{jet}", {HistType::kTH3F, {{120, -10.0, 110.0}, {200, 0.0, 200.0}, {40, 0., o2::constants::math::TwoPI}}}); + //< \sigma p_T at local rho test plot | end > + + registry.add("h_jet_pt_rhoareasubtracted", "jet pT rhoareasubtracted;#it{p}_{T,jet} (GeV/#it{c}); entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); + registry.add("h_jet_pt_rholocal", "jet pT rholocal;#it{p}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); + + registry.add("leadJetPt", "leadJet Pt ", {HistType::kTH1F, {{200, 0., 200.0}}}); + registry.add("leadJetPhi", "leadJet constituent #phi ", {HistType::kTH1F, {{80, -1.0, 7.}}}); + registry.add("leadJetEta", "leadJet constituent #eta ", {HistType::kTH1F, {{100, -1.0, 1.0}}}); + + //< RC test plots >// + registry.add("h3_centrality_deltapT_RandomCornPhi_rhorandomconewithoutleadingjet", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}; #Delta#varphi_{jet}", {HistType::kTH3F, {{100, 0.0, 100.0}, {400, -200.0, 200.0}, {100, 0., o2::constants::math::TwoPI}}}); + registry.add("h3_centrality_deltapT_RandomCornPhi_localrhovsphi", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}; #Delta#varphi_{jet}", {HistType::kTH3F, {{100, 0.0, 100.0}, {400, -200.0, 200.0}, {100, 0., o2::constants::math::TwoPI}}}); + + registry.add("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithoutleadingjet", "centrality; #it{p}_{T,random cone} - #it{area, random cone} * #it{rho}(#varphi); #Delta#varphi_{jet}", {HistType::kTH3F, {{100, 0.0, 100.0}, {400, -200.0, 200.0}, {100, 0., o2::constants::math::TwoPI}}}); + //< bkg sub plot | end >// + //< median rho >// + registry.add("h_jet_pt_in_plane_v2", "jet pT;#it{p}^{in-plane}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); + registry.add("h_jet_pt_out_of_plane_v2", "jet pT;#it{p}^{out-of-plane}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); + registry.add("h_jet_pt_in_plane_v3", "jet pT;#it{p}^{in-plane}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); + registry.add("h_jet_pt_out_of_plane_v3", "jet pT;#it{p}^{out-of-plane}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); + + registry.add("h2_centrality_jet_pt_in_plane_v2", "centrality vs #it{p}^{in-plane}_{T,jet}; centrality; #it{p}_{T,jet} (GeV/#it{c})", {HistType::kTH2F, {{120, -10.0, 110.0}, jetPtAxisRhoAreaSub}}); + registry.add("h2_centrality_jet_pt_out_of_plane_v2", "centrality vs #it{p}^{out-of-plane}_{T,jet}; centrality; #it{p}_{T,jet} (GeV/#it{c})", {HistType::kTH2F, {{120, -10.0, 110.0}, jetPtAxisRhoAreaSub}}); + registry.add("h2_centrality_jet_pt_in_plane_v3", "centrality vs #it{p}^{in-plane}_{T,jet}; centrality; #it{p}_{T,jet} (GeV/#it{c})", {HistType::kTH2F, {{120, -10.0, 110.0}, jetPtAxisRhoAreaSub}}); + registry.add("h2_centrality_jet_pt_out_of_plane_v3", "centrality vs #it{p}^{out-of-plane}_{T,jet}; centrality; #it{p}_{T,jet} (GeV/#it{c})", {HistType::kTH2F, {{120, -10.0, 110.0}, jetPtAxisRhoAreaSub}}); + //< rho(phi) >// + registry.add("h_jet_pt_inclusive_v2_rho", "jet pT;#it{p}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); + registry.add("h_jet_pt_in_plane_v2_rho", "jet pT;#it{p}^{in-plane}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); + registry.add("h_jet_pt_out_of_plane_v2_rho", "jet pT;#it{p}^{out-of-plane}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); + registry.add("h_jet_pt_in_plane_v3_rho", "jet pT;#it{p}^{in-plane}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); + registry.add("h_jet_pt_out_of_plane_v3_rho", "jet pT;#it{p}^{out-of-plane}_{T,jet} (GeV/#it{c});entries", {HistType::kTH1F, {jetPtAxisRhoAreaSub}}); + + registry.add("h2_centrality_jet_pt_in_plane_v2_rho", "centrality vs #it{p}^{in-plane}_{T,jet}; centrality; #it{p}_{T,jet} (GeV/#it{c})", {HistType::kTH2F, {{120, -10.0, 110.0}, jetPtAxisRhoAreaSub}}); + registry.add("h2_centrality_jet_pt_out_of_plane_v2_rho", "centrality vs #it{p}^{out-of-plane}_{T,jet}; centrality; #it{p}_{T,jet} (GeV/#it{c})", {HistType::kTH2F, {{120, -10.0, 110.0}, jetPtAxisRhoAreaSub}}); + registry.add("h2_centrality_jet_pt_in_plane_v3_rho", "centrality vs #it{p}^{in-plane}_{T,jet}; centrality; #it{p}_{T,jet} (GeV/#it{c})", {HistType::kTH2F, {{120, -10.0, 110.0}, jetPtAxisRhoAreaSub}}); + registry.add("h2_centrality_jet_pt_out_of_plane_v3_rho", "centrality vs #it{p}^{out-of-plane}_{T,jet}; centrality; #it{p}_{T,jet} (GeV/#it{c})", {HistType::kTH2F, {{120, -10.0, 110.0}, jetPtAxisRhoAreaSub}}); + + registry.add("h2_centrality_jet_pt_rhoareasubtracted", "centrality vs. jet pT;centrality; #it{p}_{T,jet} (GeV/#it{c}); counts", {HistType::kTH2F, {centralityAxis, jetPtAxisRhoAreaSub}}); + registry.add("h2_centrality_jet_eta_rhoareasubtracted", "centrality vs. jet eta;centrality; #eta; counts", {HistType::kTH2F, {centralityAxis, jetEtaAxis}}); + registry.add("h2_centrality_jet_phi_rhoareasubtracted", "centrality vs. jet phi;centrality; #varphi; counts", {HistType::kTH2F, {centralityAxis, phiAxis}}); + registry.add("h2_jet_pt_jet_area_rhoareasubtracted", "jet #it{p}_{T,jet} vs. Area_{jet}; #it{p}_{T,jet} (GeV/#it{c}); Area_{jet}", {HistType::kTH2F, {jetPtAxis, {150, 0., 1.5}}}); + registry.add("h3_jet_pt_jet_eta_jet_phi_rhoareasubtracted", "jet_pt_eta_phi_rhoareasubtracted", {HistType::kTH3F, {jetPtAxisRhoAreaSub, jetEtaAxis, phiAxis}}); + registry.add("h2_jet_pt_track_pt_rhoareasubtracted", "jet #it{p}_{T,jet} vs. #it{p}_{T,track}; #it{p}_{T,jet} (GeV/#it{c}); #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH2F, {jetPtAxisRhoAreaSub, trackPtAxis}}); + } + //< track test >// + registry.add("h_track_pt", "track #it{p}_{T} ; #it{p}_{T,track} (GeV/#it{c})", {HistType::kTH1F, {trackPtAxis}}); + registry.add("h2_track_eta_track_phi", "track eta vs. track phi; #eta; #phi; counts", {HistType::kTH2F, {trackEtaAxis, phiAxis}}); //=====================< evt pln plot >=====================// AxisSpec axisCent{cfgAxisCent, "centrality"}; AxisSpec axisQvec{cfgAxisQvec, "Q"}; @@ -334,34 +428,37 @@ struct JetChargedV2 { //=====================< evt pln plot | end >=====================// } - Preslice jetsPerJCollision = o2::aod::jet::collisionId; - Preslice tracksPerJCollision = o2::aod::jtrack::collisionId; - + Preslice tracksPerJCollision = o2::aod::jtrack::collisionId; Filter trackCuts = (aod::jtrack::pt >= trackPtMin && aod::jtrack::pt < trackPtMax && aod::jtrack::eta > trackEtaMin && aod::jtrack::eta < trackEtaMax); Filter eventCuts = (nabs(aod::jcollision::posZ) < vertexZCut && aod::jcollision::centrality >= centralityMin && aod::jcollision::centrality < centralityMax); + PresliceUnsorted> collisionsPerMCPCollision = aod::jmccollisionlb::mcCollisionId; - template - bool isAcceptedJet(U const& jet) + template + bool isAcceptedJet(TJets const& jet, bool mcLevelIsParticleLevel = false) { - double jetAreaFractionMinCfgMin = -98.0; - double jetAreaFractionMinCfgMax = 9998.0; - if (jetAreaFractionMin > jetAreaFractionMinCfgMin) { + double jetAreaFractionMinAcc = -98.0; + double leadingConstituentPtMinAcc = -98.0; + double leadingConstituentPtMaxAcc = 9998.0; + if (jetAreaFractionMin > jetAreaFractionMinAcc) { if (jet.area() < jetAreaFractionMin * o2::constants::math::PI * (jet.r() / 100.0) * (jet.r() / 100.0)) { return false; } } bool checkConstituentPt = true; - bool checkConstituentMinPt = (leadingConstituentPtMin > jetAreaFractionMinCfgMin); - bool checkConstituentMaxPt = (leadingConstituentPtMax < jetAreaFractionMinCfgMax); + bool checkConstituentMinPt = (leadingConstituentPtMin > leadingConstituentPtMinAcc); + bool checkConstituentMaxPt = (leadingConstituentPtMax < leadingConstituentPtMaxAcc); if (!checkConstituentMinPt && !checkConstituentMaxPt) { checkConstituentPt = false; } + if (mcLevelIsParticleLevel && !checkLeadConstituentPtForMcpJets) { + checkConstituentPt = false; + } if (checkConstituentPt) { bool isMinLeadingConstituent = !checkConstituentMinPt; bool isMaxLeadingConstituent = true; - for (const auto& constituent : jet.template tracks_as()) { + for (const auto& constituent : jet.template tracks_as()) { double pt = constituent.pt(); if (checkConstituentMinPt && pt >= leadingConstituentPtMin) { @@ -373,51 +470,322 @@ struct JetChargedV2 { } return isMinLeadingConstituent && isMaxLeadingConstituent; } - return true; } - template - bool trackIsInJet(T const& track, U const& jet) + double chiSquareCDF(int nDF, double x) { - for (auto const& constituentId : jet.tracksIds()) { - if (constituentId == track.globalIndex()) { - return true; + return TMath::Gamma(nDF / 2., x / 2.); + } + + // leading jet fill + template + void fillLeadingJetQA(T const& jets, double& leadingJetPt, double& leadingJetPhi, double& leadingJetEta) + { + for (const auto& jet : jets) { + if (jet.pt() > leadingJetPt) { + leadingJetPt = jet.pt(); + leadingJetEta = jet.eta(); + leadingJetPhi = jet.phi(); } } - return false; + registry.fill(HIST("leadJetPt"), leadingJetPt); + registry.fill(HIST("leadJetPhi"), leadingJetPhi); + registry.fill(HIST("leadJetEta"), leadingJetEta); } + // create h_ptsum_sumpt_fit, with number of Track template - void fillTrackHistograms(T const& collision, U const& tracks, float weight = 1.0) + void getNtrk(T const& tracks, U const& jets, int& nTrk, double& evtnum, double& leadingJetEta) { - for (auto const& track : tracks) { - if (!(jetderiveddatautilities::selectTrack(track, trackSelection) && jetderiveddatautilities::selectTrackDcaZ(track, trackDcaZmax))) { + if (jets.size() > 0) { + for (auto const& track : tracks) { + if (jetderiveddatautilities::selectTrack(track, trackSelection) && (std::fabs(track.eta() - leadingJetEta) > jetRadius) && track.pt() >= localRhoFitPtMin && track.pt() <= localRhoFitPtMax) { + registry.fill(HIST("h_accept_Track"), 4.5); + nTrk += 1; + } + } + registry.fill(HIST("h_evtnum_NTrk"), evtnum, nTrk); + } + } + + // fill nTrk plot for fit rho(varphi) + template + void fillNtrkCheck(T const& collision, U const& tracks, J const& jets, TH1F* hPtsumSumptFit, double& leadingJetEta, double& evtnum) + { + if (jets.size() > 0) { + for (auto const& trackfit : tracks) { + registry.fill(HIST("h_accept_Track"), 0.5); + if (jetderiveddatautilities::selectTrack(trackfit, trackSelection) && (std::fabs(trackfit.eta() - leadingJetEta) > jetRadius) && trackfit.pt() >= localRhoFitPtMin && trackfit.pt() <= localRhoFitPtMax) { + registry.fill(HIST("h_accept_Track"), 1.5); + } + } + + for (auto const& track : tracks) { + registry.fill(HIST("h_accept_Track"), 2.5); + if (jetderiveddatautilities::selectTrack(track, trackSelection) && (std::fabs(track.eta() - leadingJetEta) > jetRadius) && track.pt() >= localRhoFitPtMin && track.pt() <= localRhoFitPtMax) { + registry.fill(HIST("h_accept_Track"), 3.5); + hPtsumSumptFit->Fill(track.phi(), track.pt()); + registry.fill(HIST("h2_phi_track_eta"), track.eta(), track.phi()); + registry.fill(HIST("h_ptsum_sumpt"), track.phi(), track.pt()); + registry.fill(HIST("h2_centrality_phi_w_pt"), collision.centrality(), track.phi(), track.pt()); + registry.fill(HIST("h2_evtnum_phi_w_pt"), evtnum, track.phi(), track.pt()); + registry.fill(HIST("Thn_evtnum_phi_centrality"), evtnum, track.phi(), collision.centrality()); + } + } + } + } + + // MCP leading jet fill + template + void fillLeadingJetQAMCP(T const& jets, double& leadingJetPt, double& leadingJetPhi, double& leadingJetEta) + { + for (const auto& jet : jets) { + if (jet.pt() > leadingJetPt) { + leadingJetPt = jet.pt(); + leadingJetEta = jet.eta(); + leadingJetPhi = jet.phi(); + } + } + registry.fill(HIST("leadJetPtMCP"), leadingJetPt); + registry.fill(HIST("leadJetPhiMCP"), leadingJetPhi); + registry.fill(HIST("leadJetEtaMCP"), leadingJetEta); + } + + template + void fitFncMCP(U const& collision, T const& tracks, J const& jets, TH1F* hPtsumSumptFitMCP, double leadingJetEta, bool mcLevelIsParticleLevel, float weight = 1.0) + { + double ep2 = 0.; + double ep3 = 0.; + int cfgNmodA = 2; + int cfgNmodB = 3; + int evtPlnAngleA = 7; + int evtPlnAngleB = 3; + int evtPlnAngleC = 5; + for (uint i = 0; i < cfgnMods->size(); i++) { + int nmode = cfgnMods->at(i); + int detInd = detId * 4 + cfgnTotalSystem * 4 * (nmode - 2); + if (nmode == cfgNmodA) { + if (collision.qvecAmp()[detId] > collQvecAmpDetId) { + ep2 = helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode); + } + } else if (nmode == cfgNmodB) { + if (collision.qvecAmp()[detId] > collQvecAmpDetId) { + ep3 = helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode); + } + } + } + + const char* fitFunctionV2v3P = "[0] * (1. + 2. * ([1] * std::cos(2. * (x - [2])) + [3] * std::cos(3. * (x - [4]))))"; + fFitModulationV2v3P = new TF1("fit_kV3", fitFunctionV2v3P, 0, o2::constants::math::TwoPI); + //=========================< set parameter >=========================// + fFitModulationV2v3P->SetParameter(0, 1.); + fFitModulationV2v3P->SetParameter(1, 0.01); + fFitModulationV2v3P->SetParameter(3, 0.01); + + double ep2fix = 0.; + double ep3fix = 0.; + + if (ep2 < 0) { + ep2fix = RecoDecay::constrainAngle(ep2); + fFitModulationV2v3P->FixParameter(2, ep2fix); + } else { + fFitModulationV2v3P->FixParameter(2, ep2); + } + if (ep3 < 0) { + ep3fix = RecoDecay::constrainAngle(ep3); + fFitModulationV2v3P->FixParameter(4, ep3fix); + } else { + fFitModulationV2v3P->FixParameter(4, ep3); + } + + hPtsumSumptFitMCP->Fit(fFitModulationV2v3P, "Q", "ep", 0, o2::constants::math::TwoPI); + + // int paraNum = 5; + double temppara[5]; + temppara[0] = fFitModulationV2v3P->GetParameter(0); + temppara[1] = fFitModulationV2v3P->GetParameter(1); + temppara[2] = fFitModulationV2v3P->GetParameter(2); + temppara[3] = fFitModulationV2v3P->GetParameter(3); + temppara[4] = fFitModulationV2v3P->GetParameter(4); + if (temppara[0] == 0) { + return; + } + registry.fill(HIST("h_mcp_fitparaRho_evtnum"), evtnum, temppara[0]); + registry.fill(HIST("h_mcp_fitparav2obs_evtnum"), evtnum, temppara[1]); + registry.fill(HIST("h_mcp_fitparaPsi2_evtnum"), evtnum, temppara[2]); + registry.fill(HIST("h_mcp_fitparav3obs_evtnum"), evtnum, temppara[3]); + registry.fill(HIST("h_mcp_fitparaPsi3_evtnum"), evtnum, temppara[4]); + + registry.fill(HIST("h_mcp_v2obs_centrality"), collision.centrality(), temppara[1]); + registry.fill(HIST("h_mcp_v3obs_centrality"), collision.centrality(), temppara[3]); + registry.fill(HIST("h_mcp_evtnum_centrlity"), evtnum, collision.centrality()); + + for (uint i = 0; i < cfgnMods->size(); i++) { + int nmode = cfgnMods->at(i); + int detInd = detId * 4 + cfgnTotalSystem * 4 * (nmode - 2); + + for (auto const& jet : jets) { + if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + if (!isAcceptedJet(jet, mcLevelIsParticleLevel)) { + continue; + } + if (jet.r() != round(selectedJetsRadius * 100.0f)) { + continue; + } + + double integralValue = fFitModulationV2v3P->Integral(jet.phi() - jetRadius, jet.phi() + jetRadius); + double rholocal = collision.rho() / (2 * jetRadius * temppara[0]) * integralValue; + registry.fill(HIST("h3_mcp_centrality_localrho_phi"), collision.centrality(), rholocal, jet.phi() - ep2, weight); + + if (nmode == cfgNmodA) { + registry.fill(HIST("h_mcp_jet_pt_rholocal"), jet.pt() - (rholocal * jet.area()), weight); + + double phiMinusPsi2; + if (collision.qvecAmp()[detId] < collQvecAmpDetId) { + continue; + } + phiMinusPsi2 = jet.phi() - ep2; + + registry.fill(HIST("h2_mcp_phi_rholocal"), jet.phi() - ep2, rholocal, weight); + + if ((phiMinusPsi2 < o2::constants::math::PIQuarter) || (phiMinusPsi2 >= evtPlnAngleA * o2::constants::math::PIQuarter) || (phiMinusPsi2 >= evtPlnAngleB * o2::constants::math::PIQuarter && phiMinusPsi2 < evtPlnAngleC * o2::constants::math::PIQuarter)) { + registry.fill(HIST("h_mcp_jet_pt_in_plane_v2_rho"), jet.pt() - (rholocal * jet.area()), weight); + registry.fill(HIST("h2_mcp_centrality_jet_pt_in_plane_v2_rho"), collision.centrality(), jet.pt() - (rholocal * jet.area()), weight); + } else { + registry.fill(HIST("h_mcp_jet_pt_out_of_plane_v2_rho"), jet.pt() - (rholocal * jet.area()), weight); + registry.fill(HIST("h2_mcp_centrality_jet_pt_out_of_plane_v2_rho"), collision.centrality(), jet.pt() - (rholocal * jet.area()), weight); + } + } else if (nmode == cfgNmodB) { + double phiMinusPsi3; + if (collision.qvecAmp()[detId] < collQvecAmpDetId) { + continue; + } + ep3 = helperEP.GetEventPlane(collision.qvecRe()[detInd], collision.qvecIm()[detInd], nmode); + phiMinusPsi3 = jet.phi() - ep3; + + if ((phiMinusPsi3 < o2::constants::math::PIQuarter) || (phiMinusPsi3 >= evtPlnAngleA * o2::constants::math::PIQuarter) || (phiMinusPsi3 >= evtPlnAngleB * o2::constants::math::PIQuarter && phiMinusPsi3 < evtPlnAngleC * o2::constants::math::PIQuarter)) { + registry.fill(HIST("h_mcp_jet_pt_in_plane_v3_rho"), jet.pt() - (rholocal * jet.area()), weight); + registry.fill(HIST("h2_mcp_centrality_jet_pt_in_plane_v3_rho"), collision.centrality(), jet.pt() - (rholocal * jet.area()), weight); + } else { + registry.fill(HIST("h_mcp_jet_pt_out_of_plane_v3_rho"), jet.pt() - (rholocal * jet.area()), weight); + registry.fill(HIST("h2_mcp_centrality_jet_pt_out_of_plane_v3_rho"), collision.centrality(), jet.pt() - (rholocal * jet.area()), weight); + } + } + } + } + // RCpT + for (uint i = 0; i < cfgnMods->size(); i++) { + TRandom3 randomNumber(0); + float randomConeEta = randomNumber.Uniform(trackEtaMin + randomConeR, trackEtaMax - randomConeR); + float randomConePhi = randomNumber.Uniform(0.0, o2::constants::math::TwoPI); + float randomConePt = 0; + double integralValueRC = fFitModulationV2v3P->Integral(randomConePhi - randomConeR, randomConePhi + randomConeR); + double rholocalRC = collision.rho() / (2 * randomConeR * temppara[0]) * integralValueRC; + + int nmode = cfgnMods->at(i); + if (nmode == cfgNmodA) { + double rcPhiPsi2; + rcPhiPsi2 = randomConePhi - ep2; + + for (auto const& track : tracks) { + if (jetderiveddatautilities::selectTrack(track, trackSelection)) { + float dPhi = RecoDecay::constrainAngle(track.phi() - randomConePhi, static_cast(-o2::constants::math::PI)); + float dEta = track.eta() - randomConeEta; + if (std::sqrt(dEta * dEta + dPhi * dPhi) < randomConeR) { + randomConePt += track.pt(); + } + } + } + registry.fill(HIST("h3_mcp_centrality_deltapT_RandomCornPhi_localrhovsphi"), collision.centrality(), randomConePt - o2::constants::math::PI * randomConeR * randomConeR * rholocalRC, rcPhiPsi2, weight); + + // removing the leading jet from the random cone + if (jets.size() > 0) { // if there are no jets in the acceptance (from the jetfinder cuts) then there can be no leading jet + float dPhiLeadingJet = RecoDecay::constrainAngle(jets.iteratorAt(0).phi() - randomConePhi, static_cast(-o2::constants::math::PI)); + float dEtaLeadingJet = jets.iteratorAt(0).eta() - randomConeEta; + + bool jetWasInCone = false; + while ((randomConeLeadJetDeltaR <= 0 && (std::sqrt(dEtaLeadingJet * dEtaLeadingJet + dPhiLeadingJet * dPhiLeadingJet) < jets.iteratorAt(0).r() / 100.0 + randomConeR)) || (randomConeLeadJetDeltaR > 0 && (std::sqrt(dEtaLeadingJet * dEtaLeadingJet + dPhiLeadingJet * dPhiLeadingJet) < randomConeLeadJetDeltaR))) { + jetWasInCone = true; + randomConeEta = randomNumber.Uniform(trackEtaMin + randomConeR, trackEtaMax - randomConeR); + randomConePhi = randomNumber.Uniform(0.0, o2::constants::math::TwoPI); + dPhiLeadingJet = RecoDecay::constrainAngle(jets.iteratorAt(0).phi() - randomConePhi, static_cast(-o2::constants::math::PI)); + dEtaLeadingJet = jets.iteratorAt(0).eta() - randomConeEta; + } + if (jetWasInCone) { + randomConePt = 0.0; + for (auto const& track : tracks) { + if (jetderiveddatautilities::selectTrack(track, trackSelection) && (std::fabs(track.eta() - leadingJetEta) > randomConeR)) { // if track selection is uniformTrack, dcaXY and dcaZ cuts need to be added as they aren't in the selection so that they can be studied here + float dPhi = RecoDecay::constrainAngle(track.phi() - randomConePhi, static_cast(-o2::constants::math::PI)); + float dEta = track.eta() - randomConeEta; + if (std::sqrt(dEta * dEta + dPhi * dPhi) < randomConeR) { + randomConePt += track.pt(); + } + } + } + } + } + registry.fill(HIST("h3_mcp_centrality_deltapT_RandomCornPhi_localrhovsphiwithoutleadingjet"), collision.centrality(), randomConePt - o2::constants::math::PI * randomConeR * randomConeR * rholocalRC, rcPhiPsi2, weight); + registry.fill(HIST("h3_mcp_centrality_deltapT_RandomCornPhi_rhorandomconewithoutleadingjet"), collision.centrality(), randomConePt - o2::constants::math::PI * randomConeR * randomConeR * collision.rho(), rcPhiPsi2, weight); + } else if (nmode == cfgNmodB) { continue; } - registry.fill(HIST("h2_centrality_track_pt"), collision.centrality(), track.pt(), weight); - registry.fill(HIST("h2_centrality_track_eta"), collision.centrality(), track.eta(), weight); - registry.fill(HIST("h2_centrality_track_phi"), collision.centrality(), track.phi(), weight); - registry.fill(HIST("h2_centrality_track_energy"), collision.centrality(), track.energy(), weight); - registry.fill(HIST("h2_track_pt_track_sigma1overpt"), track.pt(), track.sigma1Pt(), weight); - registry.fill(HIST("h2_track_pt_track_sigmapt"), track.pt(), track.sigma1Pt() * track.pt(), weight); - registry.fill(HIST("h2_track_pt_high_track_sigma1overpt"), track.pt(), track.sigma1Pt(), weight); - registry.fill(HIST("h2_track_pt_high_track_sigmapt"), track.pt(), track.sigma1Pt() * track.pt(), weight); } } - void fillLeadingJetQA(double leadingJetPt, double leadingJetPhi, double leadingJetEta) + template + void fillJetAreaSubHistograms(TJets const& jet, float centrality, float rho, float weight = 1.0) { - registry.fill(HIST("leadJetPt"), leadingJetPt); - registry.fill(HIST("leadJetPhi"), leadingJetPhi); - registry.fill(HIST("leadJetEta"), leadingJetEta); + float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); + if (jet.pt() > pTHatMaxMCD * pTHat || pTHat < pTHatAbsoluteMin) { + return; + } + double jetcorrpt = jet.pt() - (rho * jet.area()); + if (jet.r() == round(selectedJetsRadius * 100.0f)) { + // fill jet histograms after area-based subtraction + registry.fill(HIST("h2_centrality_jet_pt_rhoareasubtracted"), centrality, jetcorrpt, weight); + registry.fill(HIST("h3_jet_pt_jet_eta_jet_phi_rhoareasubtracted"), jetcorrpt, jet.eta(), jet.phi(), weight); + if (jetcorrpt > 0) { + registry.fill(HIST("h2_centrality_jet_eta_rhoareasubtracted"), centrality, jet.eta(), weight); + registry.fill(HIST("h2_centrality_jet_phi_rhoareasubtracted"), centrality, jet.phi(), weight); + registry.fill(HIST("h2_jet_pt_jet_area_rhoareasubtracted"), jetcorrpt, jet.area(), weight); + } + } + + for (const auto& constituent : jet.template tracks_as()) { + registry.fill(HIST("h2_jet_pt_track_pt_rhoareasubtracted"), jetcorrpt, constituent.pt(), weight); + } } - double chiSquareCDF(int nDF, double x) + template + void fillMCPAreaSubHistograms(TJets const& jet, float rho = 0.0, float weight = 1.0) { - return TMath::Gamma(nDF / 2., x / 2.); + float pTHat = 10. / (std::pow(weight, 1.0 / pTHatExponent)); + if (jet.pt() > pTHatMaxMCP * pTHat || pTHat < pTHatAbsoluteMin) { + return; + } + if (jet.r() == round(selectedJetsRadius * 100.0f)) { + // fill mcp jet histograms + double jetcorrpt = jet.pt() - (rho * jet.area()); + registry.fill(HIST("h3_jet_pt_jet_eta_jet_phi_part_rhoareasubtracted"), jetcorrpt, jet.eta(), jet.phi(), weight); + if (jetcorrpt > 0) { + registry.fill(HIST("h_jet_eta_part_rhoareasubtracted"), jet.eta(), weight); + registry.fill(HIST("h_jet_phi_part_rhoareasubtracted"), jet.phi(), weight); + registry.fill(HIST("h2_jet_pt_part_jet_area_part_rhoareasubtracted"), jetcorrpt, jet.area(), weight); + } + } + } + + template + void fillTrackHistograms(TTracks const& track, float weight = 1.0) + { + registry.fill(HIST("h_track_pt"), track.pt(), weight); + registry.fill(HIST("h2_track_eta_track_phi"), track.eta(), track.phi(), weight); } + //=======================================[ process area ]=============================================// void processInOutJetV2(soa::Filtered>::iterator const& collision, soa::Join const& jets, aod::JetTracks const&) @@ -430,18 +798,18 @@ struct JetChargedV2 { } //=====================< evt pln [n=2->\Psi_2, n=3->\Psi_3] >=====================// histosQA.fill(HIST("histCent"), collision.cent()); + + //=====================< evt pln [n=2->\Psi_2, n=3->\Psi_3] >=====================// + int cfgNmodA = 2; + int cfgNmodB = 3; for (uint i = 0; i < cfgnMods->size(); i++) { int nmode = cfgnMods->at(i); int detInd = detId * 4 + cfgnTotalSystem * 4 * (nmode - 2); int refAInd = refAId * 4 + cfgnTotalSystem * 4 * (nmode - 2); int refBInd = refBId * 4 + cfgnTotalSystem * 4 * (nmode - 2); - int cfgNmodA = 2; - int cfgNmodB = 3; - int evtPlnAngleA = 7; - int evtPlnAngleB = 3; - int evtPlnAngleC = 5; + if (nmode == cfgNmodA) { - if (collision.qvecAmp()[detId] > 1e-8 || collision.qvecAmp()[refAId] < 1e-8 || collision.qvecAmp()[refBId] < 1e-8) { + if (collision.qvecAmp()[detId] > collQvecAmpDetId || collision.qvecAmp()[refAId] < collQvecAmpDetId || collision.qvecAmp()[refBId] < collQvecAmpDetId) { histosQA.fill(HIST("histQvecUncorV2"), collision.qvecRe()[detInd], collision.qvecIm()[detInd], collision.cent()); histosQA.fill(HIST("histQvecRectrV2"), collision.qvecRe()[detInd + 1], collision.qvecIm()[detInd + 1], collision.cent()); histosQA.fill(HIST("histQvecTwistV2"), collision.qvecRe()[detInd + 2], collision.qvecIm()[detInd + 2], collision.cent()); @@ -471,10 +839,18 @@ struct JetChargedV2 { histosQA.fill(HIST("histEvtPlRes_SigRefBV3"), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode), helperEP.GetEventPlane(collision.qvecRe()[refBInd + 3], collision.qvecIm()[refBInd + 3], nmode), nmode), collision.cent()); histosQA.fill(HIST("histEvtPlRes_RefARefBV3"), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[refAInd + 3], collision.qvecIm()[refAInd + 3], nmode), helperEP.GetEventPlane(collision.qvecRe()[refBInd + 3], collision.qvecIm()[refBInd + 3], nmode), nmode), collision.cent()); } + } + + int evtPlnAngleA = 7; + int evtPlnAngleB = 3; + int evtPlnAngleC = 5; + for (uint i = 0; i < cfgnMods->size(); i++) { + int nmode = cfgnMods->at(i); + int detInd = detId * 4 + cfgnTotalSystem * 4 * (nmode - 2); if (nmode == cfgNmodA) { double phiMinusPsi2; - if (collision.qvecAmp()[detId] < 1e-8) { + if (collision.qvecAmp()[detId] < collQvecAmpDetId) { continue; } float ep2 = helperEP.GetEventPlane(collision.qvecRe()[detInd], collision.qvecIm()[detInd], nmode); @@ -489,7 +865,6 @@ struct JetChargedV2 { continue; } registry.fill(HIST("h_jet_pt_rhoareasubtracted"), jet.pt() - (collision.rho() * jet.area()), 1.0); - registry.fill(HIST("h2_centrality_jet_pt_rhoareasubtracted"), collision.centrality(), jet.pt() - (collision.rho() * jet.area()), 1.0); phiMinusPsi2 = jet.phi() - ep2; if ((phiMinusPsi2 < o2::constants::math::PIQuarter) || (phiMinusPsi2 >= evtPlnAngleA * o2::constants::math::PIQuarter) || (phiMinusPsi2 >= evtPlnAngleB * o2::constants::math::PIQuarter && phiMinusPsi2 < evtPlnAngleC * o2::constants::math::PIQuarter)) { @@ -526,7 +901,123 @@ struct JetChargedV2 { } } } - PROCESS_SWITCH(JetChargedV2, processInOutJetV2, "Jet V2 in and out of plane", true); + PROCESS_SWITCH(JetChargedV2, processInOutJetV2, "Jet V2 in and out of plane", false); + + void processInOutJetV2MCD(soa::Filtered>::iterator const& collision, + soa::Join const& jets, + aod::JetTracks const&) + { + if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { + return; + } + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + return; + } + //=====================< evt pln [n=2->\Psi_2, n=3->\Psi_3] >=====================// + histosQA.fill(HIST("histCent"), collision.cent()); + //=====================< evt pln [n=2->\Psi_2, n=3->\Psi_3] >=====================// + int cfgNmodA = 2; + int cfgNmodB = 3; + for (uint i = 0; i < cfgnMods->size(); i++) { + int nmode = cfgnMods->at(i); + int detInd = detId * 4 + cfgnTotalSystem * 4 * (nmode - 2); + int refAInd = refAId * 4 + cfgnTotalSystem * 4 * (nmode - 2); + int refBInd = refBId * 4 + cfgnTotalSystem * 4 * (nmode - 2); + + if (nmode == cfgNmodA) { + if (collision.qvecAmp()[detId] > collQvecAmpDetId || collision.qvecAmp()[refAId] < collQvecAmpDetId || collision.qvecAmp()[refBId] < collQvecAmpDetId) { + histosQA.fill(HIST("histQvecUncorV2"), collision.qvecRe()[detInd], collision.qvecIm()[detInd], collision.cent()); + histosQA.fill(HIST("histQvecRectrV2"), collision.qvecRe()[detInd + 1], collision.qvecIm()[detInd + 1], collision.cent()); + histosQA.fill(HIST("histQvecTwistV2"), collision.qvecRe()[detInd + 2], collision.qvecIm()[detInd + 2], collision.cent()); + histosQA.fill(HIST("histQvecFinalV2"), collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], collision.cent()); + + histosQA.fill(HIST("histEvtPlUncorV2"), helperEP.GetEventPlane(collision.qvecRe()[detInd], collision.qvecIm()[detInd], nmode), collision.cent()); + histosQA.fill(HIST("histEvtPlRectrV2"), helperEP.GetEventPlane(collision.qvecRe()[detInd + 1], collision.qvecIm()[detInd + 1], nmode), collision.cent()); + histosQA.fill(HIST("histEvtPlTwistV2"), helperEP.GetEventPlane(collision.qvecRe()[detInd + 2], collision.qvecIm()[detInd + 2], nmode), collision.cent()); + histosQA.fill(HIST("histEvtPlFinalV2"), helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode), collision.cent()); + + histosQA.fill(HIST("histEvtPlRes_SigRefAV2"), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode), helperEP.GetEventPlane(collision.qvecRe()[refAInd + 3], collision.qvecIm()[refAInd + 3], nmode), nmode), collision.cent()); + histosQA.fill(HIST("histEvtPlRes_SigRefBV2"), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode), helperEP.GetEventPlane(collision.qvecRe()[refBInd + 3], collision.qvecIm()[refBInd + 3], nmode), nmode), collision.cent()); + histosQA.fill(HIST("histEvtPlRes_RefARefBV2"), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[refAInd + 3], collision.qvecIm()[refAInd + 3], nmode), helperEP.GetEventPlane(collision.qvecRe()[refBInd + 3], collision.qvecIm()[refBInd + 3], nmode), nmode), collision.cent()); + } + } else if (nmode == cfgNmodB) { + histosQA.fill(HIST("histQvecUncorV3"), collision.qvecRe()[detInd], collision.qvecIm()[detInd], collision.cent()); + histosQA.fill(HIST("histQvecRectrV3"), collision.qvecRe()[detInd + 1], collision.qvecIm()[detInd + 1], collision.cent()); + histosQA.fill(HIST("histQvecTwistV3"), collision.qvecRe()[detInd + 2], collision.qvecIm()[detInd + 2], collision.cent()); + histosQA.fill(HIST("histQvecFinalV3"), collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], collision.cent()); + + histosQA.fill(HIST("histEvtPlUncorV3"), helperEP.GetEventPlane(collision.qvecRe()[detInd], collision.qvecIm()[detInd], nmode), collision.cent()); + histosQA.fill(HIST("histEvtPlRectrV3"), helperEP.GetEventPlane(collision.qvecRe()[detInd + 1], collision.qvecIm()[detInd + 1], nmode), collision.cent()); + histosQA.fill(HIST("histEvtPlTwistV3"), helperEP.GetEventPlane(collision.qvecRe()[detInd + 2], collision.qvecIm()[detInd + 2], nmode), collision.cent()); + histosQA.fill(HIST("histEvtPlFinalV3"), helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode), collision.cent()); + + histosQA.fill(HIST("histEvtPlRes_SigRefAV3"), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode), helperEP.GetEventPlane(collision.qvecRe()[refAInd + 3], collision.qvecIm()[refAInd + 3], nmode), nmode), collision.cent()); + histosQA.fill(HIST("histEvtPlRes_SigRefBV3"), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode), helperEP.GetEventPlane(collision.qvecRe()[refBInd + 3], collision.qvecIm()[refBInd + 3], nmode), nmode), collision.cent()); + histosQA.fill(HIST("histEvtPlRes_RefARefBV3"), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[refAInd + 3], collision.qvecIm()[refAInd + 3], nmode), helperEP.GetEventPlane(collision.qvecRe()[refBInd + 3], collision.qvecIm()[refBInd + 3], nmode), nmode), collision.cent()); + } + } + + int evtPlnAngleA = 7; + int evtPlnAngleB = 3; + int evtPlnAngleC = 5; + for (uint i = 0; i < cfgnMods->size(); i++) { + int nmode = cfgnMods->at(i); + int detInd = detId * 4 + cfgnTotalSystem * 4 * (nmode - 2); + + if (nmode == cfgNmodA) { + double phiMinusPsi2; + if (collision.qvecAmp()[detId] < collQvecAmpDetId) { + continue; + } + float ep2 = helperEP.GetEventPlane(collision.qvecRe()[detInd], collision.qvecIm()[detInd], nmode); + for (auto const& jet : jets) { + if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + if (!isAcceptedJet(jet)) { + continue; + } + if (jet.r() != round(selectedJetsRadius * 100.0f)) { + continue; + } + registry.fill(HIST("h_jet_pt_rhoareasubtracted"), jet.pt() - (collision.rho() * jet.area()), 1.0); + + phiMinusPsi2 = jet.phi() - ep2; + if ((phiMinusPsi2 < o2::constants::math::PIQuarter) || (phiMinusPsi2 >= evtPlnAngleA * o2::constants::math::PIQuarter) || (phiMinusPsi2 >= evtPlnAngleB * o2::constants::math::PIQuarter && phiMinusPsi2 < evtPlnAngleC * o2::constants::math::PIQuarter)) { + registry.fill(HIST("h_jet_pt_in_plane_v2"), jet.pt() - (collision.rho() * jet.area()), 1.0); + registry.fill(HIST("h2_centrality_jet_pt_in_plane_v2"), collision.centrality(), jet.pt() - (collision.rho() * jet.area()), 1.0); + } else { + registry.fill(HIST("h_jet_pt_out_of_plane_v2"), jet.pt() - (collision.rho() * jet.area()), 1.0); + registry.fill(HIST("h2_centrality_jet_pt_out_of_plane_v2"), collision.centrality(), jet.pt() - (collision.rho() * jet.area()), 1.0); + } + } + } else if (nmode == cfgNmodB) { + double phiMinusPsi3; + float ep3 = helperEP.GetEventPlane(collision.qvecRe()[detInd], collision.qvecIm()[detInd], nmode); + for (auto const& jet : jets) { + if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + if (!isAcceptedJet(jet)) { + continue; + } + if (jet.r() != round(selectedJetsRadius * 100.0f)) { + continue; + } + phiMinusPsi3 = jet.phi() - ep3; + + if ((phiMinusPsi3 < o2::constants::math::PIQuarter) || (phiMinusPsi3 >= evtPlnAngleA * o2::constants::math::PIQuarter) || (phiMinusPsi3 >= evtPlnAngleB * o2::constants::math::PIQuarter && phiMinusPsi3 < evtPlnAngleC * o2::constants::math::PIQuarter)) { + registry.fill(HIST("h_jet_pt_in_plane_v3"), jet.pt() - (collision.rho() * jet.area()), 1.0); + registry.fill(HIST("h2_centrality_jet_pt_in_plane_v3"), collision.centrality(), jet.pt() - (collision.rho() * jet.area()), 1.0); + } else { + registry.fill(HIST("h_jet_pt_out_of_plane_v3"), jet.pt() - (collision.rho() * jet.area()), 1.0); + registry.fill(HIST("h2_centrality_jet_pt_out_of_plane_v3"), collision.centrality(), jet.pt() - (collision.rho() * jet.area()), 1.0); + } + } + } + } + } + PROCESS_SWITCH(JetChargedV2, processInOutJetV2MCD, "Jet V2 in and out of plane MCD", false); void processSigmaPt(soa::Filtered>::iterator const& collision, soa::Join const& jets, @@ -541,60 +1032,21 @@ struct JetChargedV2 { return; } registry.fill(HIST("h_collisions"), 2.5); + double leadingJetPt = -1; double leadingJetPhi = -1; double leadingJetEta = -1; - for (const auto& jet : jets) { - if (jet.pt() > leadingJetPt) { - leadingJetPt = jet.pt(); - leadingJetEta = jet.eta(); - leadingJetPhi = jet.phi(); - } - } - fillLeadingJetQA(leadingJetPt, leadingJetPhi, leadingJetEta); + fillLeadingJetQA(jets, leadingJetPt, leadingJetPhi, leadingJetEta); int nTrk = 0; - if (jets.size() > 0) { - for (auto const& track : tracks) { - if (jetderiveddatautilities::selectTrack(track, trackSelection) && (std::fabs(track.eta() - leadingJetEta) > jetRadius) && track.pt() >= localRhoFitPtMin && track.pt() <= localRhoFitPtMax) { - registry.fill(HIST("h_accept_Track"), 2.5); - nTrk += 1; - } - } - registry.fill(HIST("h_evtnum_NTrk"), evtnum, nTrk); - } - + getNtrk(tracks, jets, nTrk, evtnum, leadingJetEta); if (nTrk <= 0) { - return; - } - - hPtsumSumptFit = new TH1F("h_ptsum_sumpt_fit", "h_ptsum_sumpt fit use", TMath::CeilNint(std::sqrt(nTrk)), 0., o2::constants::math::TwoPI); - - if (jets.size() > 0) { - for (auto const& trackfit : tracks) { - registry.fill(HIST("h_accept_Track"), 0.5); - if (jetderiveddatautilities::selectTrack(trackfit, trackSelection) && (std::fabs(trackfit.eta() - leadingJetEta) > jetRadius) && trackfit.pt() >= localRhoFitPtMin && trackfit.pt() <= localRhoFitPtMax) { - registry.fill(HIST("h_accept_Track_Fit"), 0.5); - fitTrack += 1; - } - } - - for (auto const& track : tracks) { - registry.fill(HIST("h_accept_Track"), 1.5); - if (jetderiveddatautilities::selectTrack(track, trackSelection) && (std::fabs(track.eta() - leadingJetEta) > jetRadius) && track.pt() >= localRhoFitPtMin && track.pt() <= localRhoFitPtMax) { - accptTrack += 1; - registry.fill(HIST("h_accept_Track"), 2.5); - hPtsumSumptFit->Fill(track.phi(), track.pt()); - registry.fill(HIST("h2_phi_track_eta"), track.eta(), track.phi()); - registry.fill(HIST("h_ptsum_sumpt"), track.phi(), track.pt()); - registry.fill(HIST("h2_centrality_phi_w_pt"), collision.centrality(), track.phi(), track.pt()); - registry.fill(HIST("h2_evtnum_phi_w_pt"), evtnum, track.phi(), track.pt()); - registry.fill(HIST("Thn_evtnum_phi_centrality"), evtnum, track.phi(), collision.centrality()); - registry.fill(HIST("h_accept_Track_init"), accptTrack); - registry.fill(HIST("h_accept_Track_Fit"), 1.5); - } - } + return; } + hPtsumSumptFit = new TH1F("h_ptsum_sumpt_fit", "h_ptsum_sumpt fit use", TMath::CeilNint(std::sqrt(nTrk)), 0., o2::constants::math::TwoPI); + + fillNtrkCheck(collision, tracks, jets, hPtsumSumptFit, leadingJetEta, evtnum); + registry.fill(HIST("h_ptsum_collnum"), 0.5); double ep2 = 0.; @@ -608,17 +1060,16 @@ struct JetChargedV2 { int nmode = cfgnMods->at(i); int detInd = detId * 4 + cfgnTotalSystem * 4 * (nmode - 2); if (nmode == cfgNmodA) { - if (collision.qvecAmp()[detId] > 1e-8) { + if (collision.qvecAmp()[detId] > collQvecAmpDetId) { ep2 = helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode); } } else if (nmode == cfgNmodB) { - if (collision.qvecAmp()[detId] > 1e-8) { + if (collision.qvecAmp()[detId] > collQvecAmpDetId) { ep3 = helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode); } } } - TF1* fFitModulationV2v3 = 0x0; const char* fitFunctionV2v3 = "[0] * (1. + 2. * ([1] * std::cos(2. * (x - [2])) + [3] * std::cos(3. * (x - [4]))))"; fFitModulationV2v3 = new TF1("fit_kV3", fitFunctionV2v3, 0, o2::constants::math::TwoPI); //=========================< set parameter >=========================// @@ -700,6 +1151,7 @@ struct JetChargedV2 { int evtMidAreaMax = 50; if (evtcent >= evtCentAreaMin && evtcent <= evtCentAreaMax) { registry.fill(HIST("h2_PChi2_CombinFitA"), cDF, chiSqr / (static_cast(nDF))); + } else if (evtcent >= evtMidAreaMin && evtcent <= evtMidAreaMax) { registry.fill(HIST("h2_PChi2_CombinFitB"), cDF, chiSqr / (static_cast(nDF))); } @@ -730,7 +1182,7 @@ struct JetChargedV2 { registry.fill(HIST("h_jet_pt_rholocal"), jet.pt() - (rholocal * jet.area()), 1.0); double phiMinusPsi2; - if (collision.qvecAmp()[detId] < 1e-8) { + if (collision.qvecAmp()[detId] < collQvecAmpDetId) { continue; } phiMinusPsi2 = jet.phi() - ep2; @@ -747,7 +1199,7 @@ struct JetChargedV2 { } } else if (nmode == cfgNmodB) { double phiMinusPsi3; - if (collision.qvecAmp()[detId] < 1e-8) { + if (collision.qvecAmp()[detId] < collQvecAmpDetId) { continue; } ep3 = helperEP.GetEventPlane(collision.qvecRe()[detInd], collision.qvecIm()[detInd], nmode); @@ -821,35 +1273,229 @@ struct JetChargedV2 { } } delete hPtsumSumptFit; + delete fFitModulationV2v3; evtnum += 1; } - PROCESS_SWITCH(JetChargedV2, processSigmaPt, "Sigma pT and bkg as fcn of phi", true); + PROCESS_SWITCH(JetChargedV2, processSigmaPt, "Sigma pT and bkg as fcn of phi", false); - void processRandomConeDataV2(soa::Filtered>::iterator const& collision, - soa::Join const& jets, - soa::Filtered const& tracks) + void processSigmaPtMCD(soa::Filtered>::iterator const& collision, + soa::Join const& jets, + aod::JetTracks const& tracks) { + registry.fill(HIST("h_collisions"), 0.5); + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { + return; + } + registry.fill(HIST("h_collisions"), 1.5); if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { return; } - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { + registry.fill(HIST("h_collisions"), 2.5); + for (auto const& jet : jets) { + if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + if (!isAcceptedJet(jet)) { + continue; + } + fillJetAreaSubHistograms(jet, collision.centrality(), collision.rho()); + } + + double leadingJetPt = -1; + double leadingJetPhi = -1; + double leadingJetEta = -1; + fillLeadingJetQA(jets, leadingJetPt, leadingJetPhi, leadingJetEta); + + int nTrk = 0; + getNtrk(tracks, jets, nTrk, evtnum, leadingJetEta); + if (nTrk <= 0) { + return; + } + hPtsumSumptFit = new TH1F("h_ptsum_sumpt_fit", "h_ptsum_sumpt fit use", TMath::CeilNint(std::sqrt(nTrk)), 0., o2::constants::math::TwoPI); + + fillNtrkCheck(collision, tracks, jets, hPtsumSumptFit, leadingJetEta, evtnum); + + registry.fill(HIST("h_ptsum_collnum"), 0.5); + + double ep2 = 0.; + double ep3 = 0.; + int cfgNmodA = 2; + int cfgNmodB = 3; + int evtPlnAngleA = 7; + int evtPlnAngleB = 3; + int evtPlnAngleC = 5; + for (uint i = 0; i < cfgnMods->size(); i++) { + int nmode = cfgnMods->at(i); + int detInd = detId * 4 + cfgnTotalSystem * 4 * (nmode - 2); + if (nmode == cfgNmodA) { + if (collision.qvecAmp()[detId] > collQvecAmpDetId) { + ep2 = helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode); + } + } else if (nmode == cfgNmodB) { + if (collision.qvecAmp()[detId] > collQvecAmpDetId) { + ep3 = helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode); + } + } + } + + const char* fitFunctionV2v3 = "[0] * (1. + 2. * ([1] * std::cos(2. * (x - [2])) + [3] * std::cos(3. * (x - [4]))))"; + fFitModulationV2v3 = new TF1("fit_kV3", fitFunctionV2v3, 0, o2::constants::math::TwoPI); + //=========================< set parameter >=========================// + fFitModulationV2v3->SetParameter(0, 1.); + fFitModulationV2v3->SetParameter(1, 0.01); + fFitModulationV2v3->SetParameter(3, 0.01); + + double ep2fix = 0.; + double ep3fix = 0.; + + if (ep2 < 0) { + ep2fix = RecoDecay::constrainAngle(ep2); + fFitModulationV2v3->FixParameter(2, ep2fix); + } else { + fFitModulationV2v3->FixParameter(2, ep2); + } + if (ep3 < 0) { + ep3fix = RecoDecay::constrainAngle(ep3); + fFitModulationV2v3->FixParameter(4, ep3fix); + } else { + fFitModulationV2v3->FixParameter(4, ep3); + } + + hPtsumSumptFit->Fit(fFitModulationV2v3, "Q", "ep", 0, o2::constants::math::TwoPI); + + double temppara[5]; + temppara[0] = fFitModulationV2v3->GetParameter(0); + temppara[1] = fFitModulationV2v3->GetParameter(1); + temppara[2] = fFitModulationV2v3->GetParameter(2); + temppara[3] = fFitModulationV2v3->GetParameter(3); + temppara[4] = fFitModulationV2v3->GetParameter(4); + int paraNum = 5; + for (int i = 1; i <= paraNum; i++) { + registry.fill(HIST("h2_evt_fitpara"), evtnum, i - 0.5, temppara[i - 1]); + } + + registry.fill(HIST("h_fitparaRho_evtnum"), evtnum, temppara[0]); + registry.fill(HIST("h_fitparav2obs_evtnum"), evtnum, temppara[1]); + registry.fill(HIST("h_fitparaPsi2_evtnum"), evtnum, temppara[2]); + registry.fill(HIST("h_fitparav3obs_evtnum"), evtnum, temppara[3]); + registry.fill(HIST("h_fitparaPsi3_evtnum"), evtnum, temppara[4]); + + registry.fill(HIST("h_v2obs_centrality"), collision.centrality(), temppara[1]); + registry.fill(HIST("h_v3obs_centrality"), collision.centrality(), temppara[3]); + registry.fill(HIST("h_evtnum_centrlity"), evtnum, collision.centrality()); + + if (temppara[0] == 0) { return; } + registry.fill(HIST("h2_fitParaZero_cent"), collision.centrality(), temppara[0], 1.0); + + int nDF = 1; + int numOfFreePara = 2; + nDF = static_cast(fFitModulationV2v3->GetXaxis()->GetNbins()) - numOfFreePara; + if (nDF == 0 || static_cast(nDF) <= 0.) + return; + double chi2 = 0.; + for (int i = 0; i < hPtsumSumptFit->GetXaxis()->GetNbins(); i++) { + if (hPtsumSumptFit->GetBinContent(i + 1) <= 0.) + continue; + chi2 += std::pow((hPtsumSumptFit->GetBinContent(i + 1) - fFitModulationV2v3->Eval(hPtsumSumptFit->GetXaxis()->GetBinCenter(1 + i))), 2) / hPtsumSumptFit->GetBinContent(i + 1); + } + + double chiSqr = 999.; + double cDF = 1.; + + chiSqr = chi2; + cDF = 1. - chiSquareCDF(nDF, chiSqr); + + registry.fill(HIST("h_PvalueCDF_CombinFit"), cDF); + registry.fill(HIST("h2_PvalueCDFCent_CombinFit"), collision.centrality(), cDF); + registry.fill(HIST("h2_Chi2Cent_CombinFit"), collision.centrality(), chiSqr / (static_cast(nDF))); + registry.fill(HIST("h2_PChi2_CombinFit"), cDF, chiSqr / (static_cast(nDF))); + registry.fill(HIST("Thn_PChi2_CombinFitCent"), collision.centrality(), cDF, chiSqr / (static_cast(nDF))); + double evtcent = collision.centrality(); + int evtCentAreaMin = 0; + int evtCentAreaMax = 5; + int evtMidAreaMin = 30; + int evtMidAreaMax = 50; + if (evtcent >= evtCentAreaMin && evtcent <= evtCentAreaMax) { + registry.fill(HIST("h2_PChi2_CombinFitA"), cDF, chiSqr / (static_cast(nDF))); + + } else if (evtcent >= evtMidAreaMin && evtcent <= evtMidAreaMax) { + registry.fill(HIST("h2_PChi2_CombinFitB"), cDF, chiSqr / (static_cast(nDF))); + } + for (uint i = 0; i < cfgnMods->size(); i++) { + int nmode = cfgnMods->at(i); + int detInd = detId * 4 + cfgnTotalSystem * 4 * (nmode - 2); + + for (auto const& jet : jets) { + if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + if (!isAcceptedJet(jet)) { + continue; + } + if (jet.r() != round(selectedJetsRadius * 100.0f)) { + continue; + } + + double integralValue = fFitModulationV2v3->Integral(jet.phi() - jetRadius, jet.phi() + jetRadius); + double rholocal = collision.rho() / (2 * jetRadius * temppara[0]) * integralValue; + registry.fill(HIST("h2_phi_rhophi"), jet.phi() - ep2, fFitModulationV2v3->Eval(jet.phi()), 1.0); + registry.fill(HIST("h3_centrality_rhovsphi_phi"), collision.centrality(), fFitModulationV2v3->Eval(jet.phi()), jet.phi() - ep2); + + registry.fill(HIST("h2_phi_rholocal_cent"), collision.centrality(), rholocal, 1.0); + registry.fill(HIST("h3_centrality_localrho_phi"), collision.centrality(), rholocal, jet.phi() - ep2); + + if (nmode == cfgNmodA) { + registry.fill(HIST("h_jet_pt_rholocal"), jet.pt() - (rholocal * jet.area()), 1.0); + + double phiMinusPsi2; + if (collision.qvecAmp()[detId] < collQvecAmpDetId) { + continue; + } + phiMinusPsi2 = jet.phi() - ep2; + + registry.fill(HIST("h2_phi_rholocal"), jet.phi() - ep2, rholocal, 1.0); + registry.fill(HIST("h_jet_pt_inclusive_v2_rho"), jet.pt() - (rholocal * jet.area()), 1.0); + + if ((phiMinusPsi2 < o2::constants::math::PIQuarter) || (phiMinusPsi2 >= evtPlnAngleA * o2::constants::math::PIQuarter) || (phiMinusPsi2 >= evtPlnAngleB * o2::constants::math::PIQuarter && phiMinusPsi2 < evtPlnAngleC * o2::constants::math::PIQuarter)) { + registry.fill(HIST("h_jet_pt_in_plane_v2_rho"), jet.pt() - (rholocal * jet.area()), 1.0); + registry.fill(HIST("h2_centrality_jet_pt_in_plane_v2_rho"), collision.centrality(), jet.pt() - (rholocal * jet.area()), 1.0); + } else { + registry.fill(HIST("h_jet_pt_out_of_plane_v2_rho"), jet.pt() - (rholocal * jet.area()), 1.0); + registry.fill(HIST("h2_centrality_jet_pt_out_of_plane_v2_rho"), collision.centrality(), jet.pt() - (rholocal * jet.area()), 1.0); + } + } else if (nmode == cfgNmodB) { + double phiMinusPsi3; + if (collision.qvecAmp()[detId] < collQvecAmpDetId) { + continue; + } + ep3 = helperEP.GetEventPlane(collision.qvecRe()[detInd], collision.qvecIm()[detInd], nmode); + phiMinusPsi3 = jet.phi() - ep3; + if ((phiMinusPsi3 < o2::constants::math::PIQuarter) || (phiMinusPsi3 >= evtPlnAngleA * o2::constants::math::PIQuarter) || (phiMinusPsi3 >= evtPlnAngleB * o2::constants::math::PIQuarter && phiMinusPsi3 < evtPlnAngleC * o2::constants::math::PIQuarter)) { + registry.fill(HIST("h_jet_pt_in_plane_v3_rho"), jet.pt() - (rholocal * jet.area()), 1.0); + registry.fill(HIST("h2_centrality_jet_pt_in_plane_v3_rho"), collision.centrality(), jet.pt() - (rholocal * jet.area()), 1.0); + } else { + registry.fill(HIST("h_jet_pt_out_of_plane_v3_rho"), jet.pt() - (rholocal * jet.area()), 1.0); + registry.fill(HIST("h2_centrality_jet_pt_out_of_plane_v3_rho"), collision.centrality(), jet.pt() - (rholocal * jet.area()), 1.0); + } + } + } + } + // RCpT for (uint i = 0; i < cfgnMods->size(); i++) { TRandom3 randomNumber(0); float randomConeEta = randomNumber.Uniform(trackEtaMin + randomConeR, trackEtaMax - randomConeR); float randomConePhi = randomNumber.Uniform(0.0, o2::constants::math::TwoPI); float randomConePt = 0; + double integralValueRC = fFitModulationV2v3->Integral(randomConePhi - randomConeR, randomConePhi + randomConeR); + double rholocalRC = collision.rho() / (2 * randomConeR * temppara[0]) * integralValueRC; int nmode = cfgnMods->at(i); - int detInd = detId * 4 + cfgnTotalSystem * 4 * (nmode - 2); - int cfgNmodA = 2; - int cfgNmodB = 3; if (nmode == cfgNmodA) { double rcPhiPsi2; - float evtPl2 = helperEP.GetEventPlane(collision.qvecRe()[detInd], collision.qvecIm()[detInd], nmode); - rcPhiPsi2 = randomConePhi - evtPl2; + rcPhiPsi2 = randomConePhi - ep2; for (auto const& track : tracks) { if (jetderiveddatautilities::selectTrack(track, trackSelection)) { @@ -860,13 +1506,15 @@ struct JetChargedV2 { } } } + registry.fill(HIST("h3_centrality_deltapT_RandomCornPhi_localrhovsphi"), collision.centrality(), randomConePt - o2::constants::math::PI * randomConeR * randomConeR * rholocalRC, rcPhiPsi2, 1.0); + // removing the leading jet from the random cone if (jets.size() > 0) { // if there are no jets in the acceptance (from the jetfinder cuts) then there can be no leading jet float dPhiLeadingJet = RecoDecay::constrainAngle(jets.iteratorAt(0).phi() - randomConePhi, static_cast(-o2::constants::math::PI)); float dEtaLeadingJet = jets.iteratorAt(0).eta() - randomConeEta; bool jetWasInCone = false; - while (std::sqrt(dEtaLeadingJet * dEtaLeadingJet + dPhiLeadingJet * dPhiLeadingJet) < jets.iteratorAt(0).r() / 100.0 + randomConeR) { + while ((randomConeLeadJetDeltaR <= 0 && (std::sqrt(dEtaLeadingJet * dEtaLeadingJet + dPhiLeadingJet * dPhiLeadingJet) < jets.iteratorAt(0).r() / 100.0 + randomConeR)) || (randomConeLeadJetDeltaR > 0 && (std::sqrt(dEtaLeadingJet * dEtaLeadingJet + dPhiLeadingJet * dPhiLeadingJet) < randomConeLeadJetDeltaR))) { jetWasInCone = true; randomConeEta = randomNumber.Uniform(trackEtaMin + randomConeR, trackEtaMax - randomConeR); randomConePhi = randomNumber.Uniform(0.0, o2::constants::math::TwoPI); @@ -876,7 +1524,7 @@ struct JetChargedV2 { if (jetWasInCone) { randomConePt = 0.0; for (auto const& track : tracks) { - if (jetderiveddatautilities::selectTrack(track, trackSelection)) { + if (jetderiveddatautilities::selectTrack(track, trackSelection) && (std::fabs(track.eta() - leadingJetEta) > randomConeR)) { // if track selection is uniformTrack, dcaXY and dcaZ cuts need to be added as they aren't in the selection so that they can be studied here float dPhi = RecoDecay::constrainAngle(track.phi() - randomConePhi, static_cast(-o2::constants::math::PI)); float dEta = track.eta() - randomConeEta; if (std::sqrt(dEta * dEta + dPhi * dPhi) < randomConeR) { @@ -886,30 +1534,151 @@ struct JetChargedV2 { } } } - registry.fill(HIST("h2_centrality_deltapT_RandomCornPhi_RCprocess_rhorandomconewithoutleadingjet"), randomConePt - o2::constants::math::PI * randomConeR * randomConeR * collision.rho(), rcPhiPsi2, 1.0); + registry.fill(HIST("h3_centrality_deltapT_RandomCornPhi_localrhovsphiwithoutleadingjet"), collision.centrality(), randomConePt - o2::constants::math::PI * randomConeR * randomConeR * rholocalRC, rcPhiPsi2, 1.0); + registry.fill(HIST("h3_centrality_deltapT_RandomCornPhi_rhorandomconewithoutleadingjet"), collision.centrality(), randomConePt - o2::constants::math::PI * randomConeR * randomConeR * collision.rho(), rcPhiPsi2, 1.0); } else if (nmode == cfgNmodB) { continue; } } + delete hPtsumSumptFit; + delete fFitModulationV2v3; + evtnum += 1; + } + PROCESS_SWITCH(JetChargedV2, processSigmaPtMCD, "jet spectra with rho-area subtraction for MCD", false); + + void processSigmaPtMCP(McParticleCollision::iterator const& mccollision, + soa::SmallGroups> const& collisions, + soa::Join const& jets, + aod::JetTracks const& tracks, + aod::JetParticles const&) + { + bool mcLevelIsParticleLevel = true; + int acceptSplitCollInMCP = 2; + + registry.fill(HIST("h_mcColl_counts_areasub"), 0.5); + if (std::abs(mccollision.posZ()) > vertexZCut) { + return; + } + registry.fill(HIST("h_mcColl_counts_areasub"), 1.5); + if (collisions.size() < 1) { + return; + } + registry.fill(HIST("h_mcColl_counts_areasub"), 2.5); + if (acceptSplitCollisions == 0 && collisions.size() > 1) { + return; + } + registry.fill(HIST("h_mcColl_counts_areasub"), 3.5); + + bool hasSel8Coll = false; + bool centralityIsGood = false; + bool occupancyIsGood = false; + if (acceptSplitCollisions == acceptSplitCollInMCP) { + if (jetderiveddatautilities::selectCollision(collisions.begin(), eventSelectionBits, skipMBGapEvents)) { + hasSel8Coll = true; + } + if ((centralityMin < collisions.begin().centrality()) && (collisions.begin().centrality() < centralityMax)) { + centralityIsGood = true; + } + if ((trackOccupancyInTimeRangeMin < collisions.begin().trackOccupancyInTimeRange()) && (collisions.begin().trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMax)) { + occupancyIsGood = true; + } + } else { + for (auto const& collision : collisions) { + if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { + hasSel8Coll = true; + } + if ((centralityMin < collision.centrality()) && (collision.centrality() < centralityMax)) { + centralityIsGood = true; + } + if ((trackOccupancyInTimeRangeMin < collision.trackOccupancyInTimeRange()) && (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMax)) { + occupancyIsGood = true; + } + } + } + if (!hasSel8Coll) { + return; + } + registry.fill(HIST("h_mcColl_counts_areasub"), 4.5); + + if (!centralityIsGood) { + return; + } + registry.fill(HIST("h_mcColl_counts_areasub"), 5.5); + + if (!occupancyIsGood) { + return; + } + registry.fill(HIST("h_mcColl_counts_areasub"), 6.5); + registry.fill(HIST("h_mcColl_rho"), mccollision.rho()); + + for (auto const& jet : jets) { + if (!jetfindingutilities::isInEtaAcceptance(jet, jetEtaMin, jetEtaMax, trackEtaMin, trackEtaMax)) { + continue; + } + if (!isAcceptedJet(jet, mcLevelIsParticleLevel)) { + continue; + } + fillMCPAreaSubHistograms(jet, mccollision.rho()); + } + + for (auto const& collision : collisions) { + auto collTracks = tracks.sliceBy(tracksPerJCollision, collision.globalIndex()); + + double leadingJetPt = -1; + double leadingJetPhi = -1; + double leadingJetEta = -1; + fillLeadingJetQAMCP(jets, leadingJetPt, leadingJetPhi, leadingJetEta); + + int nTrk = 0; + if (jets.size() > 0) { + for (auto const& track : collTracks) { + if (jetderiveddatautilities::selectTrack(track, trackSelection) && (std::fabs(track.eta() - leadingJetEta) > jetRadius) && track.pt() >= localRhoFitPtMin && track.pt() <= localRhoFitPtMax) { + registry.fill(HIST("h_accept_Track"), 5.5); + nTrk += 1; + } + } + registry.fill(HIST("h_mcp_evtnum_NTrk"), evtnum, nTrk); + } + if (nTrk <= 0) { + return; + } + hPtsumSumptFitMCP = new TH1F("h_ptsum_sumpt_fit", "h_ptsum_sumpt fit use", TMath::CeilNint(std::sqrt(nTrk)), 0., o2::constants::math::TwoPI); + + if (jets.size() > 0) { + for (auto const& track : collTracks) { + if (jetderiveddatautilities::selectTrack(track, trackSelection) && (std::fabs(track.eta() - leadingJetEta) > jetRadius) && track.pt() >= localRhoFitPtMin && track.pt() <= localRhoFitPtMax) { + hPtsumSumptFitMCP->Fill(track.phi(), track.pt()); + registry.fill(HIST("h2_mcp_phi_track_eta"), track.eta(), track.phi()); + registry.fill(HIST("h_mcp_ptsum_sumpt"), track.phi(), track.pt()); + } + } + } + + registry.fill(HIST("h_ptsum_collnum"), 0.5); + fitFncMCP(collision, tracks, jets, hPtsumSumptFitMCP, leadingJetEta, mcLevelIsParticleLevel); + } + + delete hPtsumSumptFitMCP; + delete fFitModulationV2v3P; + evtnum += 1; } - PROCESS_SWITCH(JetChargedV2, processRandomConeDataV2, "QA for random cone estimation of background fluctuations in data", true); + PROCESS_SWITCH(JetChargedV2, processSigmaPtMCP, "jet spectra with area-based subtraction for MC particle level", false); void processTracksQA(soa::Filtered>::iterator const& collision, soa::Filtered> const& tracks) { - registry.fill(HIST("h_collisions"), 0.5); - registry.fill(HIST("h2_centrality_collisions"), collision.centrality(), 0.5); if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) { return; } - registry.fill(HIST("h_collisions"), 1.5); - registry.fill(HIST("h2_centrality_collisions"), collision.centrality(), 1.5); if (collision.trackOccupancyInTimeRange() < trackOccupancyInTimeRangeMin || trackOccupancyInTimeRangeMax < collision.trackOccupancyInTimeRange()) { return; } - registry.fill(HIST("h_collisions"), 2.5); - registry.fill(HIST("h2_centrality_collisions"), collision.centrality(), 2.5); - fillTrackHistograms(collision, tracks); + for (auto const& track : tracks) { + if (!jetderiveddatautilities::selectTrack(track, trackSelection)) { + continue; + } + fillTrackHistograms(track); + } } PROCESS_SWITCH(JetChargedV2, processTracksQA, "QA for charged tracks", false); }; From a40fd7c6a23abff56d540099c3decaf31a269d16 Mon Sep 17 00:00:00 2001 From: Rashi gupta <167059733+rashigupt@users.noreply.github.com> Date: Fri, 13 Jun 2025 18:58:37 +0530 Subject: [PATCH 1616/1650] [PWGHF] Add configurable for mixed event pair in correlatorHfeHadrons (#11591) Co-authored-by: Rashi Gupta --- PWGHF/HFC/TableProducer/correlatorHfeHadrons.cxx | 5 +++-- .../TableProducer/electronSelectionWithTpcEmcal.cxx | 10 ++++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/PWGHF/HFC/TableProducer/correlatorHfeHadrons.cxx b/PWGHF/HFC/TableProducer/correlatorHfeHadrons.cxx index 25b5d476269..277111d8817 100644 --- a/PWGHF/HFC/TableProducer/correlatorHfeHadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorHfeHadrons.cxx @@ -54,6 +54,7 @@ struct HfCorrelatorHfeHadrons { Configurable zPvPosMax{"zPvPosMax", 10., "Maximum z of the primary vertex (cm)"}; Configurable isRun3{"isRun3", true, "Data is from Run3 or Run2"}; + Configurable numberEventsMixed{"numberEventsMixed", 5, "number of events mixed in ME process"}; // Associated Hadron selection Configurable ptTrackMin{"ptTrackMin", 0.1f, "Transverse momentum range for associated hadron tracks"}; Configurable etaTrackMax{"etaTrackMax", 0.8f, "Eta range for associated hadron tracks"}; @@ -377,7 +378,7 @@ struct HfCorrelatorHfeHadrons { void processDataMixedEvent(TableCollisions const& collision, aod::HfCorrSelEl const& electron, TableTracks const& tracks) { auto tracksTuple = std::make_tuple(electron, tracks); - Pair pair{corrBinning, 5, -1, collision, tracksTuple, &cache}; + Pair pair{corrBinning, numberEventsMixed, -1, collision, tracksTuple, &cache}; // loop over the rows of the new table for (const auto& [c1, tracks1, c2, tracks2] : pair) { @@ -392,7 +393,7 @@ struct HfCorrelatorHfeHadrons { void processMcRecMixedEvent(McTableCollisions const& mccollision, aod::HfCorrSelEl const& electron, McTableTracks const& mcTracks) { auto tracksTuple = std::make_tuple(electron, mcTracks); - Pair pairMcRec{corrBinning, 5, -1, mccollision, tracksTuple, &cache}; + Pair pairMcRec{corrBinning, numberEventsMixed, -1, mccollision, tracksTuple, &cache}; // loop over the rows of the new table for (const auto& [c1, tracks1, c2, tracks2] : pairMcRec) { diff --git a/PWGHF/HFL/TableProducer/electronSelectionWithTpcEmcal.cxx b/PWGHF/HFL/TableProducer/electronSelectionWithTpcEmcal.cxx index ae8be97b6b9..24ebae0ea8a 100644 --- a/PWGHF/HFL/TableProducer/electronSelectionWithTpcEmcal.cxx +++ b/PWGHF/HFL/TableProducer/electronSelectionWithTpcEmcal.cxx @@ -202,8 +202,9 @@ struct HfElectronSelectionWithTpcEmcal { registry.add("hAfterPIDEtaPhi", "PID Info after PID Cuts Eta vs Phi ; #eta; #varphi; ", {HistType::kTH2F, {{axisEta}, {axisPhi}}}); registry.add("hEPRatioAfterPID", "E/P Ratio after PID Cuts apply only trackwodca filter", {HistType::kTH2F, {{axisPt}, {axisEmcEnergy}}}); - registry.add("hPIDAfterPIDCuts", "PID Info after PID cuts; E/P;#it{p}_{T} (GeV#it{/c});n#sigma;m02; m20;", {HistType::kTHnSparseF, {{binsEoP}, {binsPt}, {binsnSigma}, {binsM02}, {binsM20}}}); - registry.add("hEmcClsTrkEtaPhiDiffTime", "EmcClsTrkEtaPhiDiffTime;#Delta#eta;#Delta#varphi;Sec;", {HistType::kTH3F, {{binsDeltaEta}, {binsDeltaPhi}, {binsEmcClsTime}}}); + + registry.add("hPIDAfterPIDCuts", "PID Info after PID cuts; E/P;#it{p}_{T} (GeV#it{/c});n#sigma;m02; m20;", {HistType::kTHnSparseF, {{axisEoP}, {axisPt}, {axisnSigma}, {axisM02}, {axisM20}}}); + registry.add("hEmcClsTrkEtaPhiDiffTime", "EmcClsTrkEtaPhiDiffTime;#Delta#eta;#Delta#varphi;Sec;", {HistType::kTH3F, {{axisDeltaEta}, {axisDeltaPhi}, {axisEmcClsTime}}}); } // Track Selection Cut template @@ -365,6 +366,11 @@ struct HfElectronSelectionWithTpcEmcal { return; registry.fill(HIST("hNevents"), 1); + + // skip events with no clusters + if (emcClusters.size() == 0) { + return; + } registry.fill(HIST("hZvertex"), collision.posZ()); ///////////////////////////////// From 683a675142472f719183ae28cfc75ebafae973e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Fri, 13 Jun 2025 15:39:21 +0200 Subject: [PATCH 1617/1650] [PWGLF] Include What You Use (#11551) --- PWGLF/DataModel/LFStrangenessTables.h | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/PWGLF/DataModel/LFStrangenessTables.h b/PWGLF/DataModel/LFStrangenessTables.h index ce2e9e65eda..3ee36c7c54a 100644 --- a/PWGLF/DataModel/LFStrangenessTables.h +++ b/PWGLF/DataModel/LFStrangenessTables.h @@ -8,22 +8,29 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. + #ifndef PWGLF_DATAMODEL_LFSTRANGENESSTABLES_H_ #define PWGLF_DATAMODEL_LFSTRANGENESSTABLES_H_ -#include -#include -#include "Framework/AnalysisDataModel.h" +#include "PWGLF/DataModel/EPCalibrationTables.h" +#include "PWGLF/DataModel/SPCalibrationTables.h" +#include "PWGUD/DataModel/UDTables.h" + #include "Common/Core/RecoDecay.h" -#include "CommonConstants/PhysicsConstants.h" +#include "Common/DataModel/Centrality.h" #include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/McCollisionExtra.h" // IWYU pragma: keep (FIXME: not used, remove asap) #include "Common/DataModel/Multiplicity.h" -#include "Common/DataModel/Centrality.h" #include "Common/DataModel/Qvectors.h" -#include "Common/DataModel/McCollisionExtra.h" -#include "PWGLF/DataModel/EPCalibrationTables.h" -#include "PWGLF/DataModel/SPCalibrationTables.h" -#include "PWGUD/DataModel/UDTables.h" + +#include +#include +#include + +#include +#include +#include +#include namespace o2::aod { From d1f56789df661736fac4844d5946d89be9d3df94 Mon Sep 17 00:00:00 2001 From: Fabrizio Chinu <91954233+fchinu@users.noreply.github.com> Date: Fri, 13 Jun 2025 16:01:07 +0200 Subject: [PATCH 1618/1650] [Common,PWGHF] Add reduced workflow for B+, B0s -> J/Psi X analyses (#11368) Co-authored-by: ALICE Action Bot --- Common/Core/RecoDecay.h | 14 + PWGHF/Core/DecayChannels.h | 24 + PWGHF/Core/HfHelper.h | 250 +++- PWGHF/Core/HfMlResponseBplusToJpsiKReduced.h | 179 +++ PWGHF/Core/HfMlResponseBsToJpsiPhiReduced.h | 201 +++ PWGHF/Core/SelectorCuts.h | 159 +++ PWGHF/D2H/DataModel/ReducedDataModel.h | 288 ++++- PWGHF/D2H/TableProducer/CMakeLists.txt | 10 + .../candidateCreatorB0Reduced.cxx | 22 +- .../candidateCreatorBToJpsiReduced.cxx | 482 +++++++ .../candidateCreatorBplusReduced.cxx | 20 +- .../candidateCreatorBsReduced.cxx | 20 +- .../dataCreatorCharmHadPiReduced.cxx | 65 +- .../dataCreatorJpsiHadReduced.cxx | 1120 +++++++++++++++++ PWGHF/D2H/Tasks/CMakeLists.txt | 10 + PWGHF/D2H/Tasks/taskBplusToJpsiKReduced.cxx | 535 ++++++++ PWGHF/D2H/Tasks/taskBsToJpsiPhiReduced.cxx | 582 +++++++++ PWGHF/D2H/Utils/utilsRedDataFormat.h | 35 +- .../DataModel/CandidateReconstructionTables.h | 226 +++- PWGHF/DataModel/CandidateSelectionTables.h | 14 +- PWGHF/Utils/utilsTrkCandHf.h | 27 +- 21 files changed, 4141 insertions(+), 142 deletions(-) create mode 100644 PWGHF/Core/HfMlResponseBplusToJpsiKReduced.h create mode 100644 PWGHF/Core/HfMlResponseBsToJpsiPhiReduced.h create mode 100644 PWGHF/D2H/TableProducer/candidateCreatorBToJpsiReduced.cxx create mode 100644 PWGHF/D2H/TableProducer/dataCreatorJpsiHadReduced.cxx create mode 100644 PWGHF/D2H/Tasks/taskBplusToJpsiKReduced.cxx create mode 100644 PWGHF/D2H/Tasks/taskBsToJpsiPhiReduced.cxx diff --git a/Common/Core/RecoDecay.h b/Common/Core/RecoDecay.h index 2bdf3b82b60..7716a8d64a0 100644 --- a/Common/Core/RecoDecay.h +++ b/Common/Core/RecoDecay.h @@ -22,6 +22,7 @@ #include // std::array #include // std::abs, std::sqrt #include +#include // std::apply #include // std::move #include // std::vector @@ -285,6 +286,19 @@ struct RecoDecay { return static_cast(length) * static_cast(mass) / p(mom); } + /// Calculates proper lifetime times c (pseudoproper decay length) in XY from information on daughter tracks. + /// \param posPV {x, y, z} or {x, y} position of the primary vertex + /// \param posSV {x, y, z} or {x, y} position of the secondary vertex + /// \param mom array of {x, y, z} or {x, y} momentum arrays of the decay products + /// \param mass mass of the decay products + /// \return pseudoproper decay length + template + static double ctXY(const T& posPV, const U& posSV, const std::array, N>& mom, const std::array mass) + { + // c t_xy = l_xy * m c^2 / (pT c) + return distanceXY(posPV, posSV) * m(mom, mass) / std::apply([](const auto&... args) { return pt(args...); }, mom); + } + /// Calculates cosine of θ* (theta star). /// \note Implemented for 2 prongs only. /// \param arrMom array of two 3-momentum arrays diff --git a/PWGHF/Core/DecayChannels.h b/PWGHF/Core/DecayChannels.h index f56e8ce1005..44fefb4eeff 100644 --- a/PWGHF/Core/DecayChannels.h +++ b/PWGHF/Core/DecayChannels.h @@ -174,6 +174,30 @@ enum DecayChannelResonant : int8_t { // LastChannelResonant }; +/// @brief beauty candidates: beauty to J/ψ decay channels +enum DecayChannelToJpsiMain : int8_t { + // B0 + B0ToJpsiPiK = 1, // J/ψ π- K+ + // Bs0 + BsToJpsiKK, // J/ψ K+ K- + // Λb0 + LbToJpsiPK, // J/ψ p K- + // B+ + BplusToJpsiK, // J/ψ K+ + // Bc+ + BcToJpsiPi, // J/ψ π+ + // + LastChannelToJpsiMain +}; +/// @brief beauty candidates: beauty to J/ψ resonant decay channels +enum DecayChannelToJpsiResonant : int8_t { + // B0 + B0ToJpsiKstar0 = 1, // J/ψ K*0(892) + // Bs0 + BsToJpsiPhi, // J/ψ φ + // + LastChannelToJpsiResonant +}; } // namespace hf_cand_beauty } // namespace o2::hf_decay diff --git a/PWGHF/Core/HfHelper.h b/PWGHF/Core/HfHelper.h index 3f991854956..5c613a4b69a 100644 --- a/PWGHF/Core/HfHelper.h +++ b/PWGHF/Core/HfHelper.h @@ -17,21 +17,21 @@ #ifndef PWGHF_CORE_HFHELPER_H_ #define PWGHF_CORE_HFHELPER_H_ -#include -#include // IWYU pragma: keep (do not replace with Math/Vector4Dfwd.h) +#include "PWGHF/Utils/utilsAnalysis.h" + +#include "Common/Core/RecoDecay.h" +#include "Common/Core/TrackSelectorPID.h" #include #include +#include +#include // IWYU pragma: keep (do not replace with Math/Vector4Dfwd.h) + #include #include #include -#include "Common/Core/RecoDecay.h" -#include "Common/Core/TrackSelectorPID.h" - -#include "PWGHF/Utils/utilsAnalysis.h" - class HfHelper { public: @@ -173,6 +173,12 @@ class HfHelper return candidate.m(std::array{o2::constants::physics::MassD0, o2::constants::physics::MassPiPlus}); } + template + auto invMassBplusToJpsiK(const T& candidate) + { + return candidate.m(std::array{o2::constants::physics::MassMuon, o2::constants::physics::MassMuon, o2::constants::physics::MassKPlus}); + } + template auto cosThetaStarBplus(const T& candidate) { @@ -659,6 +665,12 @@ class HfHelper return candidate.m(std::array{o2::constants::physics::MassDSBar, o2::constants::physics::MassPiPlus}); } + template + auto invMassBsToJpsiPhi(const T& candidate) + { + return candidate.m(std::array{o2::constants::physics::MassMuon, o2::constants::physics::MassMuon, o2::constants::physics::MassKPlus, o2::constants::physics::MassKPlus}); + } + template auto cosThetaStarBs(const T& candidate) { @@ -784,8 +796,7 @@ class HfHelper /// \param pidTrackPi PID status of trackPi (prong1 of B0 candidate) /// \param acceptPIDNotApplicable switch to accept Status::NotApplicable /// \return true if prong1 of B0 candidate passes all selections - template - bool selectionB0ToDPiPid(const T1& pidTrackPi, const T2& acceptPIDNotApplicable) + bool selectionB0ToDPiPid(const int pidTrackPi, const bool acceptPIDNotApplicable) { if (!acceptPIDNotApplicable && pidTrackPi != TrackSelectorPID::Accepted) { return false; @@ -805,10 +816,10 @@ class HfHelper template bool selectionBplusToD0PiTopol(const T1& candBp, const T2& cuts, const T3& binsPt) { - auto ptcandBp = candBp.pt(); + auto ptCandBp = candBp.pt(); auto ptPi = RecoDecay::pt(candBp.pxProng1(), candBp.pyProng1()); - int pTBin = o2::analysis::findBin(binsPt, ptcandBp); + int pTBin = o2::analysis::findBin(binsPt, ptCandBp); if (pTBin == -1) { return false; } @@ -860,8 +871,7 @@ class HfHelper /// \param pidTrackPi PID status of trackPi (prong1 of B+ candidate) /// \param acceptPIDNotApplicable switch to accept Status::NotApplicable /// \return true if prong1 of B+ candidate passes all selections - template - bool selectionBplusToD0PiPid(const T1& pidTrackPi, const T2& acceptPIDNotApplicable) + bool selectionBplusToD0PiPid(const int pidTrackPi, const bool acceptPIDNotApplicable) { if (!acceptPIDNotApplicable && pidTrackPi != TrackSelectorPID::Accepted) { return false; @@ -873,6 +883,105 @@ class HfHelper return true; } + // Apply topological cuts as defined in SelectorCuts.h + /// \param candBp B+ candidate + /// \param cuts B+ candidate selection per pT bin + /// \param binsPt pT bin limits + /// \return true if candidate passes all selections + template + bool selectionBplusToJpsiKTopol(const T1& candBp, const T2& cuts, const T3& binsPt) + { + auto ptCandBp = candBp.pt(); + auto mCandBp = invMassBplusToJpsiK(candBp); + auto ptJpsi = RecoDecay::pt(candBp.pxProng0(), candBp.pyProng0()); + auto ptKa = RecoDecay::pt(candBp.pxProng1(), candBp.pyProng1()); + auto candJpsi = candBp.jpsi(); + float pseudoPropDecLen = candBp.decayLengthXY() * mCandBp / ptCandBp; + + int binPt = o2::analysis::findBin(binsPt, ptCandBp); + if (binPt == -1) { + return false; + } + + // B+ mass cut + if (std::abs(mCandBp - o2::constants::physics::MassBPlus) > cuts->get(binPt, "m")) { + return false; + } + + // kaon pt + if (ptKa < cuts->get(binPt, "pT K")) { + return false; + } + + // J/Psi pt + if (ptJpsi < cuts->get(binPt, "pT J/Psi")) { + return false; + } + + // J/Psi mass + if (std::abs(candJpsi.m() - o2::constants::physics::MassJPsi) < cuts->get(binPt, "DeltaM J/Psi")) { + return false; + } + + // d0(J/Psi)xd0(K) + if (candBp.impactParameterProduct() > cuts->get(binPt, "B Imp. Par. Product")) { + return false; + } + + // B+ Decay length + if (candBp.decayLength() < cuts->get(binPt, "B decLen")) { + return false; + } + + // B+ Decay length XY + if (candBp.decayLengthXY() < cuts->get(binPt, "B decLenXY")) { + return false; + } + + // B+ CPA cut + if (candBp.cpa() < cuts->get(binPt, "CPA")) { + return false; + } + + // B+ CPAXY cut + if (candBp.cpaXY() < cuts->get(binPt, "CPAXY")) { + return false; + } + + // d0 of K + if (std::abs(candBp.impactParameter1()) < cuts->get(binPt, "d0 K")) { + return false; + } + + // d0 of J/Psi + if (std::abs(candBp.impactParameter0()) < cuts->get(binPt, "d0 J/Psi")) { + return false; + } + + // B pseudoproper decay length + if (pseudoPropDecLen < cuts->get(binPt, "B pseudoprop. decLen")) { + return false; + } + + return true; + } + + /// Apply PID selection + /// \param pidTrackKa PID status of trackKa (prong1 of B+ candidate) + /// \param acceptPIDNotApplicable switch to accept Status::NotApplicable + /// \return true if prong1 of B+ candidate passes all selections + bool selectionBplusToJpsiKPid(const int pidTrackKa, const bool acceptPIDNotApplicable) + { + if (!acceptPIDNotApplicable && pidTrackKa != TrackSelectorPID::Accepted) { + return false; + } + if (acceptPIDNotApplicable && pidTrackKa == TrackSelectorPID::Rejected) { + return false; + } + + return true; + } + /// Apply topological cuts as defined in SelectorCuts.h /// \param candBs Bs candidate /// \param cuts Bs candidate selections @@ -947,8 +1056,7 @@ class HfHelper /// \param pidTrackPi PID status of trackPi (prong1 of Bs candidate) /// \param acceptPIDNotApplicable switch to accept Status::NotApplicable /// \return true if prong1 of Bs candidate passes all selections - template - bool selectionBsToDsPiPid(const T1& pidTrackPi, const T2& acceptPIDNotApplicable) + bool selectionBsToDsPiPid(const int pidTrackPi, const bool acceptPIDNotApplicable) { if (!acceptPIDNotApplicable && pidTrackPi != TrackSelectorPID::Accepted) { return false; @@ -960,6 +1068,115 @@ class HfHelper return true; } + // Apply topological cuts as defined in SelectorCuts.h + /// \param candBs Bs candidate + /// \param candKa0 kaon candidate 0 (phi daughter) + /// \param candKa1 kaon candidate 1 (phi daughter) + /// \param cuts Bs candidate selection per pT bin + /// \param binsPt pT bin limits + /// \return true if candidate passes all selections + template + bool selectionBsToJpsiPhiTopol(const T1& candBs, const T2& candKa0, const T3& candKa1, const T4& cuts, const T5& binsPt) + { + auto ptCandBs = candBs.pt(); + auto mCandBs = invMassBsToJpsiPhi(candBs); + std::array pVecKa0 = candKa0.pVector(); + std::array pVecKa1 = candKa1.pVector(); + auto mCandPhi = RecoDecay::m(std::array{pVecKa0, pVecKa1}, std::array{o2::constants::physics::MassKPlus, o2::constants::physics::MassKPlus}); + auto ptJpsi = RecoDecay::pt(candBs.pxProng0(), candBs.pyProng0()); + auto candJpsi = candBs.jpsi(); + float pseudoPropDecLen = candBs.decayLengthXY() * mCandBs / ptCandBs; + + int binPt = o2::analysis::findBin(binsPt, ptCandBs); + if (binPt == -1) { + return false; + } + + // Bs mass cut + if (std::abs(mCandBs - o2::constants::physics::MassBPlus) > cuts->get(binPt, "m")) { + return false; + } + + // kaon pt + if (candKa0.pt() < cuts->get(binPt, "pT K") && + candKa1.pt() < cuts->get(binPt, "pT K")) { + return false; + } + + // J/Psi pt + if (ptJpsi < cuts->get(binPt, "pT J/Psi")) { + return false; + } + + // phi mass + if (std::abs(mCandPhi - o2::constants::physics::MassPhi) < cuts->get(binPt, "DeltaM phi")) { + return false; + } + + // J/Psi mass + if (std::abs(candJpsi.m() - o2::constants::physics::MassJPsi) < cuts->get(binPt, "DeltaM J/Psi")) { + return false; + } + + // d0(J/Psi)xd0(phi) + if (candBs.impactParameterProduct() > cuts->get(binPt, "B Imp. Par. Product")) { + return false; + } + + // Bs Decay length + if (candBs.decayLength() < cuts->get(binPt, "B decLen")) { + return false; + } + + // Bs Decay length XY + if (candBs.decayLengthXY() < cuts->get(binPt, "B decLenXY")) { + return false; + } + + // Bs CPA cut + if (candBs.cpa() < cuts->get(binPt, "CPA")) { + return false; + } + + // Bs CPAXY cut + if (candBs.cpaXY() < cuts->get(binPt, "CPAXY")) { + return false; + } + + // d0 of phi + if (std::abs(candBs.impactParameter1()) < cuts->get(binPt, "d0 phi")) { + return false; + } + + // d0 of J/Psi + if (std::abs(candBs.impactParameter0()) < cuts->get(binPt, "d0 J/Psi")) { + return false; + } + + // B pseudoproper decay length + if (pseudoPropDecLen < cuts->get(binPt, "B pseudoprop. decLen")) { + return false; + } + + return true; + } + + /// Apply PID selection + /// \param pidTrackKa PID status of trackKa (prong1 of B+ candidate) + /// \param acceptPIDNotApplicable switch to accept Status::NotApplicable + /// \return true if prong1 of B+ candidate passes all selections + bool selectionBsToJpsiPhiPid(const int pidTrackKa, const bool acceptPIDNotApplicable) + { + if (!acceptPIDNotApplicable && pidTrackKa != TrackSelectorPID::Accepted) { + return false; + } + if (acceptPIDNotApplicable && pidTrackKa == TrackSelectorPID::Rejected) { + return false; + } + + return true; + } + /// Apply topological cuts as defined in SelectorCuts.h /// \param candLb Lb candidate /// \param cuts Lb candidate selection per pT bin" @@ -1028,8 +1245,7 @@ class HfHelper /// \param pidTrackPi PID status of trackPi (prong1 of Lb candidate) /// \param acceptPIDNotApplicable switch to accept Status::NotApplicable /// \return true if prong1 of Lb candidate passes all selections - template - bool selectionLbToLcPiPid(const T1& pidTrackPi, const T2& acceptPIDNotApplicable) + bool selectionLbToLcPiPid(const int pidTrackPi, const bool acceptPIDNotApplicable) { if (!acceptPIDNotApplicable && pidTrackPi != TrackSelectorPID::Accepted) { return false; diff --git a/PWGHF/Core/HfMlResponseBplusToJpsiKReduced.h b/PWGHF/Core/HfMlResponseBplusToJpsiKReduced.h new file mode 100644 index 00000000000..5f218ec6259 --- /dev/null +++ b/PWGHF/Core/HfMlResponseBplusToJpsiKReduced.h @@ -0,0 +1,179 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file HfMlResponseBplusToJpsiKReduced.h +/// \brief Class to compute the ML response for B± → J/Psi K± analysis selections in the reduced format +/// \author Fabrizio Chinu , Università degli Studi and INFN Torino + +#ifndef PWGHF_CORE_HFMLRESPONSEBPLUSTOJPSIKREDUCED_H_ +#define PWGHF_CORE_HFMLRESPONSEBPLUSTOJPSIKREDUCED_H_ + +#include "PWGHF/Core/HfMlResponse.h" +#include "PWGHF/D2H/Utils/utilsRedDataFormat.h" + +#include + +// Fill the map of available input features +// the key is the feature's name (std::string) +// the value is the corresponding value in EnumInputFeatures +#define FILL_MAP_BPLUS(FEATURE) \ + { \ + #FEATURE, static_cast(InputFeaturesBplusToJpsiKReduced::FEATURE) \ + } + +// Check if the index of mCachedIndices (index associated to a FEATURE) +// matches the entry in EnumInputFeatures associated to this FEATURE +// if so, the inputFeatures vector is filled with the FEATURE's value +// by calling the corresponding GETTER from OBJECT +#define CHECK_AND_FILL_VEC_BPLUS_FULL(OBJECT, FEATURE, GETTER) \ + case static_cast(InputFeaturesBplusToJpsiKReduced::FEATURE): { \ + inputFeatures.emplace_back(OBJECT.GETTER()); \ + break; \ + } + +// Check if the index of mCachedIndices (index associated to a FEATURE) +// matches the entry in EnumInputFeatures associated to this FEATURE +// if so, the inputFeatures vector is filled with the FEATURE's value +// by calling the GETTER function taking OBJECT in argument +#define CHECK_AND_FILL_VEC_BPLUS_FUNC(OBJECT, FEATURE, GETTER) \ + case static_cast(InputFeaturesBplusToJpsiKReduced::FEATURE): { \ + inputFeatures.emplace_back(GETTER(OBJECT)); \ + break; \ + } + +// Specific case of CHECK_AND_FILL_VEC_BPLUS_FULL(OBJECT, FEATURE, GETTER) +// where OBJECT is named candidate and FEATURE = GETTER +#define CHECK_AND_FILL_VEC_BPLUS(GETTER) \ + case static_cast(InputFeaturesBplusToJpsiKReduced::GETTER): { \ + inputFeatures.emplace_back(candidate.GETTER()); \ + break; \ + } + +// Specific case of CHECK_AND_FILL_VEC_BPLUS_FULL(OBJECT, FEATURE, GETTER) +// where OBJECT is named candidate, FEATURE = GETTER, and args are needed +#define CHECK_AND_FILL_VEC_BPLUS_WITH_ARGS(GETTER, ARGS...) \ + case static_cast(InputFeaturesBplusToJpsiKReduced::GETTER): { \ + inputFeatures.emplace_back(candidate.GETTER(ARGS)); \ + break; \ + } + +namespace o2::analysis +{ + +enum class InputFeaturesBplusToJpsiKReduced : uint8_t { + ptProng0 = 0, + ptProng1, + impactParameter0, + impactParameter1, + impactParameter2, + impactParameterProduct, + impactParameterProductJpsi, + chi2PCA, + decayLength, + decayLengthXY, + decayLengthNormalised, + decayLengthXYNormalised, + cpa, + cpaXY, + maxNormalisedDeltaIP, + ctXY, + tpcNSigmaKa1, + tofNSigmaKa1, + tpcTofNSigmaKa1 +}; + +template +class HfMlResponseBplusToJpsiKReduced : public HfMlResponse +{ + public: + /// Default constructor + HfMlResponseBplusToJpsiKReduced() = default; + /// Default destructor + virtual ~HfMlResponseBplusToJpsiKReduced() = default; + + /// Method to get the input features vector needed for ML inference + /// \param candidate is the B+ candidate + /// \param prong1 is the candidate's prong1 + /// \return inputFeatures vector + template + std::vector getInputFeatures(T1 const& candidate, + T2 const& prong1) + { + std::vector inputFeatures; + + for (const auto& idx : MlResponse::mCachedIndices) { + switch (idx) { + CHECK_AND_FILL_VEC_BPLUS(ptProng0); + CHECK_AND_FILL_VEC_BPLUS(ptProng1); + CHECK_AND_FILL_VEC_BPLUS(impactParameter0); + CHECK_AND_FILL_VEC_BPLUS(impactParameter1); + CHECK_AND_FILL_VEC_BPLUS(impactParameter2); + CHECK_AND_FILL_VEC_BPLUS(impactParameterProduct); + CHECK_AND_FILL_VEC_BPLUS(impactParameterProductJpsi); + CHECK_AND_FILL_VEC_BPLUS(chi2PCA); + CHECK_AND_FILL_VEC_BPLUS(decayLength); + CHECK_AND_FILL_VEC_BPLUS(decayLengthXY); + CHECK_AND_FILL_VEC_BPLUS(decayLengthNormalised); + CHECK_AND_FILL_VEC_BPLUS(decayLengthXYNormalised); + CHECK_AND_FILL_VEC_BPLUS(cpa); + CHECK_AND_FILL_VEC_BPLUS(cpaXY); + CHECK_AND_FILL_VEC_BPLUS(maxNormalisedDeltaIP); + CHECK_AND_FILL_VEC_BPLUS_WITH_ARGS(ctXY, std::array{o2::constants::physics::MassMuon, o2::constants::physics::MassMuon, o2::constants::physics::MassKPlus}); + // TPC PID variable + CHECK_AND_FILL_VEC_BPLUS_FULL(prong1, tpcNSigmaKa1, tpcNSigmaKa); + // TOF PID variable + CHECK_AND_FILL_VEC_BPLUS_FULL(prong1, tofNSigmaKa1, tofNSigmaKa); + // Combined PID variables + CHECK_AND_FILL_VEC_BPLUS_FUNC(prong1, tpcTofNSigmaKa1, o2::pid_tpc_tof_utils::getTpcTofNSigmaKa1); + } + } + + return inputFeatures; + } + + protected: + /// Method to fill the map of available input features + void setAvailableInputFeatures() + { + MlResponse::mAvailableInputFeatures = { + FILL_MAP_BPLUS(ptProng0), + FILL_MAP_BPLUS(ptProng1), + FILL_MAP_BPLUS(impactParameter0), + FILL_MAP_BPLUS(impactParameter1), + FILL_MAP_BPLUS(impactParameter2), + FILL_MAP_BPLUS(impactParameterProduct), + FILL_MAP_BPLUS(impactParameterProductJpsi), + FILL_MAP_BPLUS(chi2PCA), + FILL_MAP_BPLUS(decayLength), + FILL_MAP_BPLUS(decayLengthXY), + FILL_MAP_BPLUS(decayLengthNormalised), + FILL_MAP_BPLUS(decayLengthXYNormalised), + FILL_MAP_BPLUS(cpa), + FILL_MAP_BPLUS(cpaXY), + FILL_MAP_BPLUS(maxNormalisedDeltaIP), + FILL_MAP_BPLUS(ctXY), + // TPC PID variable + FILL_MAP_BPLUS(tpcNSigmaKa1), + // TOF PID variable + FILL_MAP_BPLUS(tofNSigmaKa1), + // Combined PID variable + FILL_MAP_BPLUS(tpcTofNSigmaKa1)}; + } +}; + +} // namespace o2::analysis + +#undef FILL_MAP_BPLUS +#undef CHECK_AND_FILL_VEC_BPLUS_FULL +#undef CHECK_AND_FILL_VEC_BPLUS_FUNC +#undef CHECK_AND_FILL_VEC_BPLUS + +#endif // PWGHF_CORE_HFMLRESPONSEBPLUSTOJPSIKREDUCED_H_ diff --git a/PWGHF/Core/HfMlResponseBsToJpsiPhiReduced.h b/PWGHF/Core/HfMlResponseBsToJpsiPhiReduced.h new file mode 100644 index 00000000000..71e19567a2b --- /dev/null +++ b/PWGHF/Core/HfMlResponseBsToJpsiPhiReduced.h @@ -0,0 +1,201 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file HfMlResponseBsToJpsiPhiReduced.h +/// \brief Class to compute the ML response for Bs0 → J/Psi phi analysis selections in the reduced format +/// \author Fabrizio Chinu , Università degli Studi and INFN Torino + +#ifndef PWGHF_CORE_HFMLRESPONSEBSTOJPSIPHIREDUCED_H_ +#define PWGHF_CORE_HFMLRESPONSEBSTOJPSIPHIREDUCED_H_ + +#include "PWGHF/Core/HfMlResponse.h" +#include "PWGHF/D2H/Utils/utilsRedDataFormat.h" + +#include + +// Fill the map of available input features +// the key is the feature's name (std::string) +// the value is the corresponding value in EnumInputFeatures +#define FILL_MAP_BS(FEATURE) \ + { \ + #FEATURE, static_cast(InputFeaturesBsToJpsiPhiReduced::FEATURE) \ + } + +// Check if the index of mCachedIndices (index associated to a FEATURE) +// matches the entry in EnumInputFeatures associated to this FEATURE +// if so, the inputFeatures vector is filled with the FEATURE's value +// by calling the corresponding GETTER from OBJECT +#define CHECK_AND_FILL_VEC_BS_FULL(OBJECT, FEATURE, GETTER) \ + case static_cast(InputFeaturesBsToJpsiPhiReduced::FEATURE): { \ + inputFeatures.emplace_back(OBJECT.GETTER()); \ + break; \ + } + +// Check if the index of mCachedIndices (index associated to a FEATURE) +// matches the entry in EnumInputFeatures associated to this FEATURE +// if so, the inputFeatures vector is filled with the FEATURE's value +// by calling the GETTER function taking OBJECT in argument +#define CHECK_AND_FILL_VEC_BS_FUNC(OBJECT, FEATURE, GETTER) \ + case static_cast(InputFeaturesBsToJpsiPhiReduced::FEATURE): { \ + inputFeatures.emplace_back(GETTER(OBJECT)); \ + break; \ + } + +// Specific case of CHECK_AND_FILL_VEC_BS_FULL(OBJECT, FEATURE, GETTER) +// where OBJECT is named candidate and FEATURE = GETTER +#define CHECK_AND_FILL_VEC_BS(GETTER) \ + case static_cast(InputFeaturesBsToJpsiPhiReduced::GETTER): { \ + inputFeatures.emplace_back(candidate.GETTER()); \ + break; \ + } + +// Specific case of CHECK_AND_FILL_VEC_BPLUS_FULL(OBJECT, FEATURE, GETTER) +// where OBJECT is named candidate and FEATURE = GETTER and args are needed +#define CHECK_AND_FILL_VEC_BS_WITH_ARGS(GETTER, ARGS...) \ + case static_cast(InputFeaturesBsToJpsiPhiReduced::GETTER): { \ + inputFeatures.emplace_back(candidate.GETTER(ARGS)); \ + break; \ + } + +namespace o2::analysis +{ + +enum class InputFeaturesBsToJpsiPhiReduced : uint8_t { + ptProng0 = 0, + ptProng1, + impactParameter0, + impactParameter1, + impactParameter2, + impactParameter3, + impactParameterProduct, + impactParameterProductJpsi, + impactParameterProductPhi, + chi2PCA, + decayLength, + decayLengthXY, + decayLengthNormalised, + decayLengthXYNormalised, + cpa, + cpaXY, + maxNormalisedDeltaIP, + ctXY, + tpcNSigmaKa0, + tofNSigmaKa0, + tpcTofNSigmaKa0, + tpcNSigmaKa1, + tofNSigmaKa1, + tpcTofNSigmaKa1 +}; + +template +class HfMlResponseBsToJpsiPhiReduced : public HfMlResponse +{ + public: + /// Default constructor + HfMlResponseBsToJpsiPhiReduced() = default; + /// Default destructor + virtual ~HfMlResponseBsToJpsiPhiReduced() = default; + + /// Method to get the input features vector needed for ML inference + /// \param candidate is the Bs candidate + /// \param prong1 is the candidate's prong1 + /// \return inputFeatures vector + template + std::vector getInputFeatures(T1 const& candidate, + T2 const& prong1, + T3 const& prong2) + { + std::vector inputFeatures; + + for (const auto& idx : MlResponse::mCachedIndices) { + switch (idx) { + CHECK_AND_FILL_VEC_BS(ptProng0); + CHECK_AND_FILL_VEC_BS(ptProng1); + CHECK_AND_FILL_VEC_BS(impactParameter0); + CHECK_AND_FILL_VEC_BS(impactParameter1); + CHECK_AND_FILL_VEC_BS(impactParameter2); + CHECK_AND_FILL_VEC_BS(impactParameter3); + CHECK_AND_FILL_VEC_BS(impactParameterProduct); + CHECK_AND_FILL_VEC_BS(impactParameterProductJpsi); + CHECK_AND_FILL_VEC_BS(impactParameterProductPhi); + CHECK_AND_FILL_VEC_BS(chi2PCA); + CHECK_AND_FILL_VEC_BS(decayLength); + CHECK_AND_FILL_VEC_BS(decayLengthXY); + CHECK_AND_FILL_VEC_BS(decayLengthNormalised); + CHECK_AND_FILL_VEC_BS(decayLengthXYNormalised); + CHECK_AND_FILL_VEC_BS(cpa); + CHECK_AND_FILL_VEC_BS(cpaXY); + CHECK_AND_FILL_VEC_BS(maxNormalisedDeltaIP); + CHECK_AND_FILL_VEC_BS_WITH_ARGS(ctXY, std::array{o2::constants::physics::MassMuon, o2::constants::physics::MassMuon, o2::constants::physics::MassKPlus, o2::constants::physics::MassKPlus}); + // TPC PID variable + CHECK_AND_FILL_VEC_BS_FULL(prong1, tpcNSigmaKa0, tpcNSigmaKa); + // TOF PID variable + CHECK_AND_FILL_VEC_BS_FULL(prong1, tofNSigmaKa0, tofNSigmaKa); + // Combined PID variables + CHECK_AND_FILL_VEC_BS_FUNC(prong1, tpcTofNSigmaKa0, o2::pid_tpc_tof_utils::getTpcTofNSigmaKa1); + // TPC PID variable + CHECK_AND_FILL_VEC_BS_FULL(prong2, tpcNSigmaKa1, tpcNSigmaKa); + // TOF PID variable + CHECK_AND_FILL_VEC_BS_FULL(prong2, tofNSigmaKa1, tofNSigmaKa); + // Combined PID variables + CHECK_AND_FILL_VEC_BS_FUNC(prong2, tpcTofNSigmaKa1, o2::pid_tpc_tof_utils::getTpcTofNSigmaKa1); + } + } + + return inputFeatures; + } + + protected: + /// Method to fill the map of available input features + void setAvailableInputFeatures() + { + MlResponse::mAvailableInputFeatures = { + FILL_MAP_BS(ptProng0), + FILL_MAP_BS(ptProng1), + FILL_MAP_BS(impactParameter0), + FILL_MAP_BS(impactParameter1), + FILL_MAP_BS(impactParameter2), + FILL_MAP_BS(impactParameter3), + FILL_MAP_BS(impactParameterProduct), + FILL_MAP_BS(impactParameterProductJpsi), + FILL_MAP_BS(impactParameterProductPhi), + FILL_MAP_BS(chi2PCA), + FILL_MAP_BS(decayLength), + FILL_MAP_BS(decayLengthXY), + FILL_MAP_BS(decayLengthNormalised), + FILL_MAP_BS(decayLengthXYNormalised), + FILL_MAP_BS(cpa), + FILL_MAP_BS(cpaXY), + FILL_MAP_BS(maxNormalisedDeltaIP), + FILL_MAP_BS(ctXY), + // TPC PID variable + FILL_MAP_BS(tpcNSigmaKa0), + // TOF PID variable + FILL_MAP_BS(tofNSigmaKa0), + // Combined PID variable + FILL_MAP_BS(tpcTofNSigmaKa0), + // TPC PID variable + FILL_MAP_BS(tpcNSigmaKa1), + // TOF PID variable + FILL_MAP_BS(tofNSigmaKa1), + // Combined PID variable + FILL_MAP_BS(tpcTofNSigmaKa1)}; + } +}; + +} // namespace o2::analysis + +#undef FILL_MAP_BS +#undef CHECK_AND_FILL_VEC_BS_FULL +#undef CHECK_AND_FILL_VEC_BS_FUNC +#undef CHECK_AND_FILL_VEC_BS + +#endif // PWGHF_CORE_HFMLRESPONSEBSTOJPSIPHIREDUCED_H_ diff --git a/PWGHF/Core/SelectorCuts.h b/PWGHF/Core/SelectorCuts.h index 61e17b16ff1..7fbd324f8c3 100644 --- a/PWGHF/Core/SelectorCuts.h +++ b/PWGHF/Core/SelectorCuts.h @@ -896,6 +896,53 @@ static const std::vector labelsPt = { static const std::vector labelsCutVar = {"m", "DCA_xy", "DCA_z", "pT El", "chi2PCA"}; } // namespace hf_cuts_jpsi_to_e_e +namespace hf_cuts_jpsi_to_mu_mu +{ +static constexpr int NBinsPt = 9; +static constexpr int NCutVars = 8; +// default values for the pT bin edges (can be used to configure histogram axis) +// offset by 1 from the bin numbers in cuts array +constexpr double BinsPt[NBinsPt + 1] = { + 0, + 0.5, + 1.0, + 2.0, + 3.0, + 4.0, + 5.0, + 6.0, + 10.0, + 16.0, +}; +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; + +// default values for the cuts +constexpr double Cuts[NBinsPt][NCutVars] = {{0.6, 1.0, 0.2, 0.2, 0.9, 0.9, 0., 0.}, /* 0 < pT < 0.5 */ + {0.6, 1.0, 0.2, 0.2, 0.9, 0.9, 0., 0.}, /* 0.5 < pT < 1 */ + {0.6, 1.0, 0.2, 0.2, 0.9, 0.9, 0., 0.}, /* 1 < pT < 2 */ + {0.6, 1.0, 0.2, 0.2, 0.9, 0.9, 0., 0.}, /* 2 < pT < 3 */ + {0.6, 1.0, 0.2, 0.2, 0.9, 0.9, 0., 0.}, /* 3 < pT < 4 */ + {0.6, 1.0, 0.2, 0.2, 0.9, 0.9, 0., 0.}, /* 4 < pT < 5 */ + {0.8, 1.0, 0.3, 0.3, 0.9, 0.9, 0., 0.}, /* 5 < pT < 6 */ + {0.8, 1.0, 0.3, 0.3, 0.9, 0.9, 1., 0.}, /* 6 < pT < 10 */ + {0.8, 1.0, 0.3, 0.3, 0.9, 0.9, 1., 0.}}; /* 10 < pT < 16 */ + +// row labels +static const std::vector labelsPt = { + "pT bin 0", + "pT bin 1", + "pT bin 2", + "pT bin 3", + "pT bin 4", + "pT bin 5", + "pT bin 6", + "pT bin 7", + "pT bin 8"}; + +// column labels +static const std::vector labelsCutVar = {"m", "pT mu", "decay length", "decay length xy", "cpa", "cpa xy", "d0xd0", "pseudoprop. decay length"}; +} // namespace hf_cuts_jpsi_to_mu_mu + namespace hf_cuts_b0_to_d_pi { static constexpr int NBinsPt = 12; @@ -1003,6 +1050,62 @@ static const std::vector labelsPt = { static const std::vector labelsCutVar = {"m", "CPA", "Chi2PCA", "d0 Ds", "d0 Pi", "pT Ds", "pT Pi", "Bs decLen", "Bs decLenXY", "Imp. Par. Product"}; } // namespace hf_cuts_bs_to_ds_pi +namespace hf_cuts_bs_to_jpsi_phi +{ +static constexpr int NBinsPt = 12; +static constexpr int NCutVars = 13; +// default values for the pT bin edges (can be used to configure histogram axis) +// offset by 1 from the bin numbers in cuts array +constexpr double BinsPt[NBinsPt + 1] = { + 0, + 0.5, + 1.0, + 2.0, + 3.0, + 4.0, + 5.0, + 7.0, + 10.0, + 13.0, + 16.0, + 20.0, + 24.0}; + +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; + +// default values for the cuts +// DeltaM CPA d0Jpsi d0K pTJpsi pTK BDecayLength BDecayLengthXY BIPProd DeltaMJpsi JpsiIPProd +constexpr double Cuts[NBinsPt][NCutVars] = {{1., 0.8, 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.02, 0.}, /* 0 < pt < 0.5 */ + {1., 0.8, 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.02, 0.}, /* 0.5 < pt < 1 */ + {1., 0.8, 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.02, 0.}, /* 1 < pt < 2 */ + {1., 0.8, 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.02, 0.}, /* 2 < pt < 3 */ + {1., 0.8, 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.02, 0.}, /* 3 < pt < 4 */ + {1., 0.8, 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.02, 0.}, /* 4 < pt < 5 */ + {1., 0.8, 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.02, 0.}, /* 5 < pt < 7 */ + {1., 0.8, 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.02, 0.}, /* 7 < pt < 10 */ + {1., 0.8, 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.02, 0.}, /* 10 < pt < 13 */ + {1., 0.8, 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.02, 0.}, /* 13 < pt < 16 */ + {1., 0.8, 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.02, 0.}, /* 16 < pt < 20 */ + {1., 0.8, 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.02, 0.}}; /* 20 < pt < 24 */ +// row labels +static const std::vector labelsPt = { + "pT bin 0", + "pT bin 1", + "pT bin 2", + "pT bin 3", + "pT bin 4", + "pT bin 5", + "pT bin 6", + "pT bin 7", + "pT bin 8", + "pT bin 9", + "pT bin 10", + "pT bin 11"}; + +// column labels +static const std::vector labelsCutVar = {"m", "CPA", "CPAXY", "d0 J/Psi", "d0 phi", "pT J/Psi", "pT K", "B decLen", "B decLenXY", "B Imp. Par. Product", "DeltaM J/Psi", "DeltaM phi", "B pseudoprop. decLen"}; +} // namespace hf_cuts_bs_to_jpsi_phi + namespace hf_cuts_bplus_to_d0_pi { static constexpr int NBinsPt = 12; @@ -1059,6 +1162,62 @@ static const std::vector labelsPt = { static const std::vector labelsCutVar = {"m", "CPA", "d0 D0", "d0 Pi", "pT D0", "pT Pi", "B decLen", "B decLenXY", "Imp. Par. Product", "DeltaMD0", "Cos ThetaStar"}; } // namespace hf_cuts_bplus_to_d0_pi +namespace hf_cuts_bplus_to_jpsi_k +{ +static constexpr int NBinsPt = 12; +static constexpr int NCutVars = 12; +// default values for the pT bin edges (can be used to configure histogram axis) +// offset by 1 from the bin numbers in cuts array +constexpr double BinsPt[NBinsPt + 1] = { + 0, + 0.5, + 1.0, + 2.0, + 3.0, + 4.0, + 5.0, + 7.0, + 10.0, + 13.0, + 16.0, + 20.0, + 24.0}; + +auto vecBinsPt = std::vector{BinsPt, BinsPt + NBinsPt + 1}; + +// default values for the cuts +// DeltaM CPA d0Jpsi d0K pTJpsi pTK BDecayLength BDecayLengthXY BIPProd DeltaMJpsi JpsiIPProd +constexpr double Cuts[NBinsPt][NCutVars] = {{1., 0.8, 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.}, /* 0 < pt < 0.5 */ + {1., 0.8, 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.}, /* 0.5 < pt < 1 */ + {1., 0.8, 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.}, /* 1 < pt < 2 */ + {1., 0.8, 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.}, /* 2 < pt < 3 */ + {1., 0.8, 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.}, /* 3 < pt < 4 */ + {1., 0.8, 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.}, /* 4 < pt < 5 */ + {1., 0.8, 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.}, /* 5 < pt < 7 */ + {1., 0.8, 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.}, /* 7 < pt < 10 */ + {1., 0.8, 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.}, /* 10 < pt < 13 */ + {1., 0.8, 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.}, /* 13 < pt < 16 */ + {1., 0.8, 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.}, /* 16 < pt < 20 */ + {1., 0.8, 0.8, 0.01, 0.01, 1.0, 0.15, 0.05, 0.05, 0., 0.1, 0.}}; /* 20 < pt < 24 */ +// row labels +static const std::vector labelsPt = { + "pT bin 0", + "pT bin 1", + "pT bin 2", + "pT bin 3", + "pT bin 4", + "pT bin 5", + "pT bin 6", + "pT bin 7", + "pT bin 8", + "pT bin 9", + "pT bin 10", + "pT bin 11"}; + +// column labels +static const std::vector labelsCutVar = {"m", "CPA", "CPAXY", "d0 J/Psi", "d0 K", "pT J/Psi", "pT K", "B decLen", "B decLenXY", "B Imp. Par. Product", "DeltaM J/Psi", "B pseudoprop. decLen"}; +} // namespace hf_cuts_bplus_to_jpsi_k + namespace hf_cuts_lb_to_lc_pi { static constexpr int NBinsPt = 12; diff --git a/PWGHF/D2H/DataModel/ReducedDataModel.h b/PWGHF/D2H/DataModel/ReducedDataModel.h index 092210a22ca..939f0648099 100644 --- a/PWGHF/D2H/DataModel/ReducedDataModel.h +++ b/PWGHF/D2H/DataModel/ReducedDataModel.h @@ -19,16 +19,13 @@ /// \author Fabrizio Grosa , CERN /// \author Luca Aglietta , Università degli Studi di Torino (UniTO) /// \author Biao Zhang , Heidelberg University +/// \author Fabrizio Chinu , Università degli Studi di Torino (UniTO) #ifndef PWGHF_D2H_DATAMODEL_REDUCEDDATAMODEL_H_ #define PWGHF_D2H_DATAMODEL_REDUCEDDATAMODEL_H_ -#include -#include - -#include "CommonConstants/PhysicsConstants.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoA.h" +#include "PWGHF/DataModel/CandidateReconstructionTables.h" +#include "PWGHF/Utils/utilsPid.h" #include "Common/Core/RecoDecay.h" #include "Common/DataModel/Centrality.h" @@ -37,8 +34,14 @@ #include "Common/DataModel/PIDResponseTPC.h" #include "Common/DataModel/Qvectors.h" -#include "PWGHF/DataModel/CandidateReconstructionTables.h" -#include "PWGHF/Utils/utilsPid.h" +#include "CommonConstants/PhysicsConstants.h" +#include "Framework/ASoA.h" +#include "Framework/AnalysisDataModel.h" + +#include +#include +#include +#include namespace o2 { @@ -278,6 +281,66 @@ DECLARE_SOA_TABLE(HfRedTracksCov, "AOD", "HFREDTRACKCOV", //! Table with track c soa::Index<>, HFTRACKPARCOV_COLUMNS); +// CAREFUL: need to follow convention [Name = Description + 's'] in DECLARE_SOA_TABLE(Name, "AOD", Description) +// to call DECLARE_SOA_INDEX_COLUMN_FULL later on +DECLARE_SOA_TABLE(HfRedBach0Bases, "AOD", "HFREDBACH0BASE", //! Table with track information for reduced workflow + soa::Index<>, + hf_track_index_reduced::TrackId, + hf_track_index_reduced::HfRedCollisionId, + HFTRACKPAR_COLUMNS, + hf_track_vars_reduced::ItsNCls, + hf_track_vars_reduced::TpcNClsCrossedRows, + hf_track_vars_reduced::TpcChi2NCl, + hf_track_vars_reduced::HasTPC, + hf_track_vars_reduced::HasTOF, + pidtpc::TPCNSigmaPi, + pidtof::TOFNSigmaPi, + pidtpc::TPCNSigmaKa, + pidtof::TOFNSigmaKa, + pidtpc::TPCNSigmaPr, + pidtof::TOFNSigmaPr, + hf_track_pid_reduced::TPCTOFNSigmaPi, + hf_track_pid_reduced::TPCTOFNSigmaKa, + hf_track_pid_reduced::TPCTOFNSigmaPr, + aod::track::Px, + aod::track::Py, + aod::track::Pz, + aod::track::PVector); + +DECLARE_SOA_TABLE(HfRedBach0Cov, "AOD", "HFREDBACH0COV", //! Table with track covariance information for reduced workflow + soa::Index<>, + HFTRACKPARCOV_COLUMNS); + +// CAREFUL: need to follow convention [Name = Description + 's'] in DECLARE_SOA_TABLE(Name, "AOD", Description) +// to call DECLARE_SOA_INDEX_COLUMN_FULL later on +DECLARE_SOA_TABLE(HfRedBach1Bases, "AOD", "HFREDBACH1BASE", //! Table with track information for reduced workflow + soa::Index<>, + hf_track_index_reduced::TrackId, + hf_track_index_reduced::HfRedCollisionId, + HFTRACKPAR_COLUMNS, + hf_track_vars_reduced::ItsNCls, + hf_track_vars_reduced::TpcNClsCrossedRows, + hf_track_vars_reduced::TpcChi2NCl, + hf_track_vars_reduced::HasTPC, + hf_track_vars_reduced::HasTOF, + pidtpc::TPCNSigmaPi, + pidtof::TOFNSigmaPi, + pidtpc::TPCNSigmaKa, + pidtof::TOFNSigmaKa, + pidtpc::TPCNSigmaPr, + pidtof::TOFNSigmaPr, + hf_track_pid_reduced::TPCTOFNSigmaPi, + hf_track_pid_reduced::TPCTOFNSigmaKa, + hf_track_pid_reduced::TPCTOFNSigmaPr, + aod::track::Px, + aod::track::Py, + aod::track::Pz, + aod::track::PVector); + +DECLARE_SOA_TABLE(HfRedBach1Cov, "AOD", "HFREDBACH1COV", //! Table with track covariance information for reduced workflow + soa::Index<>, + HFTRACKPARCOV_COLUMNS); + // table with all attributes needed to call statusTpcAndTof() in the selector task DECLARE_SOA_TABLE(HfRedTracksPid, "AOD", "HFREDTRACKPID", //! Table with PID track information for reduced workflow o2::soa::Index<>, @@ -289,8 +352,14 @@ DECLARE_SOA_TABLE(HfRedTracksPid, "AOD", "HFREDTRACKPID", //! Table with PID tra DECLARE_SOA_EXTENDED_TABLE_USER(HfRedTracksExt, HfRedTrackBases, "HFREDTRACKEXT", //! Track parameters at collision vertex aod::track::Pt); +DECLARE_SOA_EXTENDED_TABLE_USER(HfRedBach0Ext, HfRedBach0Bases, "HFREDBACH0EXT", //! Track parameters at collision vertex + aod::track::Pt); +DECLARE_SOA_EXTENDED_TABLE_USER(HfRedBach1Ext, HfRedBach1Bases, "HFREDBACH1EXT", //! Track parameters at collision vertex + aod::track::Pt); using HfRedTracks = HfRedTracksExt; +using HfRedBach0Tracks = HfRedBach0Ext; +using HfRedBach1Tracks = HfRedBach1Ext; namespace hf_charm_cand_reduced { @@ -304,6 +373,105 @@ DECLARE_SOA_COLUMN(MlScorePromptMassHypo1, mlScorePromptMassHypo1, float); DECLARE_SOA_COLUMN(MlScoreNonpromptMassHypo1, mlScoreNonpromptMassHypo1, float); //! ML score for non-prompt class (mass hypothesis 1) } // namespace hf_charm_cand_reduced +namespace hf_jpsi_cand_reduced +{ +DECLARE_SOA_COLUMN(ProngPosId, prongPosId, int); //! Original track index +DECLARE_SOA_COLUMN(ProngNegId, prongNegId, int); //! Original track index +DECLARE_SOA_COLUMN(HfRedCollisionId, hfRedCollisionId, int); //! Collision index +DECLARE_SOA_COLUMN(M, m, float); //! Invariant mass of candidate in GeV/c2 +DECLARE_SOA_COLUMN(XDauPos, xDauPos, float); //! x +DECLARE_SOA_COLUMN(XDauNeg, xDauNeg, float); //! x +DECLARE_SOA_COLUMN(YDauPos, yDauPos, float); //! y +DECLARE_SOA_COLUMN(YDauNeg, yDauNeg, float); //! y +DECLARE_SOA_COLUMN(ZDauPos, zDauPos, float); //! z +DECLARE_SOA_COLUMN(ZDauNeg, zDauNeg, float); //! z +DECLARE_SOA_COLUMN(AlphaDauPos, alphaDauPos, float); //! alpha of the J/Psi positive decay daughter +DECLARE_SOA_COLUMN(AlphaDauNeg, alphaDauNeg, float); //! alpha of the J/Psi negative decay daughter +DECLARE_SOA_COLUMN(SnpDauPos, snpDauPos, float); //! snp of the J/Psi positive decay daughter +DECLARE_SOA_COLUMN(SnpDauNeg, snpDauNeg, float); //! snp of the J/Psi negative decay daughter +DECLARE_SOA_COLUMN(TglDauPos, tglDauPos, float); //! tgl of the J/Psi positive decay daughter +DECLARE_SOA_COLUMN(TglDauNeg, tglDauNeg, float); //! tgl of the J/Psi negative decay daughter +DECLARE_SOA_COLUMN(Signed1PtDauPos, signed1PtDauPos, float); //! signed1Pt of the J/Psi positive decay daughter +DECLARE_SOA_COLUMN(Signed1PtDauNeg, signed1PtDauNeg, float); //! signed1Pt of the J/Psi negative decay daughter + +DECLARE_SOA_DYNAMIC_COLUMN(PxDauPos, pxDauPos, //! Momentum in x-direction in GeV/c + [](float signed1Pt, float snp, float alpha) -> float { + auto pt = 1.f / std::abs(signed1Pt); + // FIXME: GCC & clang should optimize to sincosf + float cs = cosf(alpha), sn = sinf(alpha); + auto r = std::sqrt((1.f - snp) * (1.f + snp)); + return pt * (r * cs - snp * sn); + }); +DECLARE_SOA_DYNAMIC_COLUMN(PyDauPos, pyDauPos, //! Momentum in y-direction in GeV/c + [](float signed1Pt, float snp, float alpha) -> float { + auto pt = 1.f / std::abs(signed1Pt); + // FIXME: GCC & clang should optimize to sincosf + float cs = cosf(alpha), sn = sinf(alpha); + auto r = std::sqrt((1.f - snp) * (1.f + snp)); + return pt * (snp * cs + r * sn); + }); +DECLARE_SOA_DYNAMIC_COLUMN(PzDauPos, pzDauPos, //! Momentum in z-direction in GeV/c + [](float signed1Pt, float tgl) -> float { + auto pt = 1.f / std::abs(signed1Pt); + return pt * tgl; + }); +DECLARE_SOA_DYNAMIC_COLUMN(PxDauNeg, pxDauNeg, //! Momentum in x-direction in GeV/c + [](float signed1Pt, float snp, float alpha) -> float { + auto pt = 1.f / std::abs(signed1Pt); + // FIXME: GCC & clang should optimize to sincosf + float cs = cosf(alpha), sn = sinf(alpha); + auto r = std::sqrt((1.f - snp) * (1.f + snp)); + return pt * (r * cs - snp * sn); + }); +DECLARE_SOA_DYNAMIC_COLUMN(PyDauNeg, pyDauNeg, //! Momentum in y-direction in GeV/c + [](float signed1Pt, float snp, float alpha) -> float { + auto pt = 1.f / std::abs(signed1Pt); + // FIXME: GCC & clang should optimize to sincosf + float cs = cosf(alpha), sn = sinf(alpha); + auto r = std::sqrt((1.f - snp) * (1.f + snp)); + return pt * (snp * cs + r * sn); + }); +DECLARE_SOA_DYNAMIC_COLUMN(PzDauNeg, pzDauNeg, //! Momentum in z-direction in GeV/c + [](float signed1Pt, float tgl) -> float { + auto pt = 1.f / std::abs(signed1Pt); + return pt * tgl; + }); + +// Covariance matrix of the J/Psi positive decay daughter +DECLARE_SOA_COLUMN(CYYDauPos, cYYDauPos, float); //! Covariance matrix +DECLARE_SOA_COLUMN(CZYDauPos, cZYDauPos, float); //! Covariance matrix +DECLARE_SOA_COLUMN(CZZDauPos, cZZDauPos, float); //! Covariance matrix +DECLARE_SOA_COLUMN(CSnpYDauPos, cSnpYDauPos, float); //! Covariance matrix +DECLARE_SOA_COLUMN(CSnpZDauPos, cSnpZDauPos, float); //! Covariance matrix +DECLARE_SOA_COLUMN(CSnpSnpDauPos, cSnpSnpDauPos, float); //! Covariance matrix +DECLARE_SOA_COLUMN(CTglYDauPos, cTglYDauPos, float); //! Covariance matrix +DECLARE_SOA_COLUMN(CTglZDauPos, cTglZDauPos, float); //! Covariance matrix +DECLARE_SOA_COLUMN(CTglSnpDauPos, cTglSnpDauPos, float); //! Covariance matrix +DECLARE_SOA_COLUMN(CTglTglDauPos, cTglTglDauPos, float); //! Covariance matrix +DECLARE_SOA_COLUMN(C1PtYDauPos, c1PtYDauPos, float); //! Covariance matrix +DECLARE_SOA_COLUMN(C1PtZDauPos, c1PtZDauPos, float); //! Covariance matrix +DECLARE_SOA_COLUMN(C1PtSnpDauPos, c1PtSnpDauPos, float); //! Covariance matrix +DECLARE_SOA_COLUMN(C1PtTglDauPos, c1PtTglDauPos, float); //! Covariance matrix +DECLARE_SOA_COLUMN(C1Pt21Pt2DauPos, c1Pt21Pt2DauPos, float); //! Covariance matrix + +// Covariance matrix of the J/Psi negative decay daughter +DECLARE_SOA_COLUMN(CYYDauNeg, cYYDauNeg, float); //! Covariance matrix +DECLARE_SOA_COLUMN(CZYDauNeg, cZYDauNeg, float); //! Covariance matrix +DECLARE_SOA_COLUMN(CZZDauNeg, cZZDauNeg, float); //! Covariance matrix +DECLARE_SOA_COLUMN(CSnpYDauNeg, cSnpYDauNeg, float); //! Covariance matrix +DECLARE_SOA_COLUMN(CSnpZDauNeg, cSnpZDauNeg, float); //! Covariance matrix +DECLARE_SOA_COLUMN(CSnpSnpDauNeg, cSnpSnpDauNeg, float); //! Covariance matrix +DECLARE_SOA_COLUMN(CTglYDauNeg, cTglYDauNeg, float); //! Covariance matrix +DECLARE_SOA_COLUMN(CTglZDauNeg, cTglZDauNeg, float); //! Covariance matrix +DECLARE_SOA_COLUMN(CTglSnpDauNeg, cTglSnpDauNeg, float); //! Covariance matrix +DECLARE_SOA_COLUMN(CTglTglDauNeg, cTglTglDauNeg, float); //! Covariance matrix +DECLARE_SOA_COLUMN(C1PtYDauNeg, c1PtYDauNeg, float); //! Covariance matrix +DECLARE_SOA_COLUMN(C1PtZDauNeg, c1PtZDauNeg, float); //! Covariance matrix +DECLARE_SOA_COLUMN(C1PtSnpDauNeg, c1PtSnpDauNeg, float); //! Covariance matrix +DECLARE_SOA_COLUMN(C1PtTglDauNeg, c1PtTglDauNeg, float); //! Covariance matrix +DECLARE_SOA_COLUMN(C1Pt21Pt2DauNeg, c1Pt21Pt2DauNeg, float); //! Covariance matrix +} // namespace hf_jpsi_cand_reduced + // CAREFUL: need to follow convention [Name = Description + 's'] in DECLARE_SOA_TABLE(Name, "AOD", Description) // to call DECLARE_SOA_INDEX_COLUMN_FULL later on DECLARE_SOA_TABLE(HfRed2Prongs, "AOD", "HFRED2PRONG", //! Table with 2prong candidate information for reduced workflow @@ -370,6 +538,47 @@ DECLARE_SOA_TABLE_VERSIONED(HfRed3ProngsMl_001, "AOD", "HFRED3PRONGML", 1, //! T using HfRed3ProngsMl = HfRed3ProngsMl_001; +// CAREFUL: need to follow convention [Name = Description + 's'] in DECLARE_SOA_TABLE(Name, "AOD", Description) +// to call DECLARE_SOA_INDEX_COLUMN_FULL later on +DECLARE_SOA_TABLE(HfRedJpsis, "AOD", "HFREDJPSI", //! Table with J/Psi candidate information for reduced workflow + o2::soa::Index<>, + hf_jpsi_cand_reduced::ProngPosId, + hf_jpsi_cand_reduced::ProngNegId, + hf_track_index_reduced::HfRedCollisionId, + hf_cand::XSecondaryVertex, hf_cand::YSecondaryVertex, hf_cand::ZSecondaryVertex, + hf_jpsi_cand_reduced::M, + hf_jpsi_cand_reduced::XDauPos, hf_jpsi_cand_reduced::XDauNeg, + hf_jpsi_cand_reduced::YDauPos, hf_jpsi_cand_reduced::YDauNeg, + hf_jpsi_cand_reduced::ZDauPos, hf_jpsi_cand_reduced::ZDauNeg, + hf_jpsi_cand_reduced::AlphaDauPos, hf_jpsi_cand_reduced::AlphaDauNeg, + hf_jpsi_cand_reduced::SnpDauPos, hf_jpsi_cand_reduced::SnpDauNeg, + hf_jpsi_cand_reduced::TglDauPos, hf_jpsi_cand_reduced::TglDauNeg, + hf_jpsi_cand_reduced::Signed1PtDauPos, hf_jpsi_cand_reduced::Signed1PtDauNeg, + hf_jpsi_cand_reduced::PxDauPos, + hf_jpsi_cand_reduced::PxDauNeg, + hf_jpsi_cand_reduced::PyDauPos, + hf_jpsi_cand_reduced::PyDauNeg, + hf_jpsi_cand_reduced::PzDauPos, + hf_jpsi_cand_reduced::PzDauNeg); + +DECLARE_SOA_TABLE(HfRedJpsiCov, "AOD", "HFREDJPSICOV", //! Table with J/Psi candidate covariance for reduced workflow + o2::soa::Index<>, + hf_jpsi_cand_reduced::CYYDauPos, hf_jpsi_cand_reduced::CYYDauNeg, + hf_jpsi_cand_reduced::CZYDauPos, hf_jpsi_cand_reduced::CZYDauNeg, + hf_jpsi_cand_reduced::CZZDauPos, hf_jpsi_cand_reduced::CZZDauNeg, + hf_jpsi_cand_reduced::CSnpYDauPos, hf_jpsi_cand_reduced::CSnpYDauNeg, + hf_jpsi_cand_reduced::CSnpZDauPos, hf_jpsi_cand_reduced::CSnpZDauNeg, + hf_jpsi_cand_reduced::CSnpSnpDauPos, hf_jpsi_cand_reduced::CSnpSnpDauNeg, + hf_jpsi_cand_reduced::CTglYDauPos, hf_jpsi_cand_reduced::CTglYDauNeg, + hf_jpsi_cand_reduced::CTglZDauPos, hf_jpsi_cand_reduced::CTglZDauNeg, + hf_jpsi_cand_reduced::CTglSnpDauPos, hf_jpsi_cand_reduced::CTglSnpDauNeg, + hf_jpsi_cand_reduced::CTglTglDauPos, hf_jpsi_cand_reduced::CTglTglDauNeg, + hf_jpsi_cand_reduced::C1PtYDauPos, hf_jpsi_cand_reduced::C1PtYDauNeg, + hf_jpsi_cand_reduced::C1PtZDauPos, hf_jpsi_cand_reduced::C1PtZDauNeg, + hf_jpsi_cand_reduced::C1PtSnpDauPos, hf_jpsi_cand_reduced::C1PtSnpDauNeg, + hf_jpsi_cand_reduced::C1PtTglDauPos, hf_jpsi_cand_reduced::C1PtTglDauNeg, + hf_jpsi_cand_reduced::C1Pt21Pt2DauPos, hf_jpsi_cand_reduced::C1Pt21Pt2DauNeg); + DECLARE_SOA_TABLE(HfRedPidDau0s_000, "AOD", "HFREDPIDDAU0", //! hf_track_pid_reduced::TPCNSigmaPiProng0, hf_track_pid_reduced::TOFNSigmaPiProng0, @@ -474,6 +683,8 @@ namespace hf_cand_bplus_reduced { DECLARE_SOA_INDEX_COLUMN_FULL(Prong0, prong0, int, HfRed2Prongs, "_0"); //! Prong0 index DECLARE_SOA_INDEX_COLUMN_FULL(Prong1, prong1, int, HfRedTrackBases, "_1"); //! Prong1 index +DECLARE_SOA_INDEX_COLUMN_FULL(Jpsi, jpsi, int, HfRedJpsis, "_0"); //! J/Psi index +DECLARE_SOA_INDEX_COLUMN_FULL(BachKa, bachKa, int, HfRedBach0Bases, "_0"); //! J/Psi index DECLARE_SOA_COLUMN(Prong0MlScoreBkg, prong0MlScoreBkg, float); //! Bkg ML score of the D daughter DECLARE_SOA_COLUMN(Prong0MlScorePrompt, prong0MlScorePrompt, float); //! Prompt ML score of the D daughter DECLARE_SOA_COLUMN(Prong0MlScoreNonprompt, prong0MlScoreNonprompt, float); //! Nonprompt ML score of the D daughter @@ -482,6 +693,9 @@ DECLARE_SOA_COLUMN(Prong0MlScoreNonprompt, prong0MlScoreNonprompt, float); //! N DECLARE_SOA_TABLE(HfRedBplusProngs, "AOD", "HFREDBPPRONG", hf_cand_bplus_reduced::Prong0Id, hf_cand_bplus_reduced::Prong1Id); +DECLARE_SOA_TABLE(HfRedBplus2JpsiDaus, "AOD", "HFREDBP2JPSIDAU", + hf_cand_bplus_reduced::JpsiId, hf_cand_bplus_reduced::BachKaId); + DECLARE_SOA_TABLE(HfRedBplusD0Mls, "AOD", "HFREDBPLUSD0ML", //! Table with ML scores for the D0 daughter hf_cand_bplus_reduced::Prong0MlScoreBkg, hf_cand_bplus_reduced::Prong0MlScorePrompt, @@ -489,19 +703,26 @@ DECLARE_SOA_TABLE(HfRedBplusD0Mls, "AOD", "HFREDBPLUSD0ML", //! Table with ML sc o2::soa::Marker<1>); using HfRedCandBplus = soa::Join; +using HfRedCandBplusToJpsiK = soa::Join; namespace hf_cand_bs_reduced { -DECLARE_SOA_INDEX_COLUMN_FULL(Prong0, prong0, int, HfRed3Prongs, "_0"); //! Prong0 index -DECLARE_SOA_INDEX_COLUMN_FULL(Prong1, prong1, int, HfRedTrackBases, "_1"); //! Prong1 index -DECLARE_SOA_COLUMN(Prong0MlScoreBkg, prong0MlScoreBkg, float); //! Bkg ML score of the D daughter -DECLARE_SOA_COLUMN(Prong0MlScorePrompt, prong0MlScorePrompt, float); //! Prompt ML score of the D daughter -DECLARE_SOA_COLUMN(Prong0MlScoreNonprompt, prong0MlScoreNonprompt, float); //! Nonprompt ML score of the D daughter +DECLARE_SOA_INDEX_COLUMN_FULL(Prong0, prong0, int, HfRed3Prongs, "_0"); //! Prong0 index +DECLARE_SOA_INDEX_COLUMN_FULL(Prong1, prong1, int, HfRedTrackBases, "_1"); //! Prong1 index +DECLARE_SOA_INDEX_COLUMN_FULL(Jpsi, jpsi, int, HfRedJpsis, "_0"); //! J/Psi index +DECLARE_SOA_INDEX_COLUMN_FULL(Prong0Phi, prong0Phi, int, HfRedBach0Bases, "_0"); //! J/Psi index +DECLARE_SOA_INDEX_COLUMN_FULL(Prong1Phi, prong1Phi, int, HfRedBach1Bases, "_0"); //! J/Psi index +DECLARE_SOA_COLUMN(Prong0MlScoreBkg, prong0MlScoreBkg, float); //! Bkg ML score of the D daughter +DECLARE_SOA_COLUMN(Prong0MlScorePrompt, prong0MlScorePrompt, float); //! Prompt ML score of the D daughter +DECLARE_SOA_COLUMN(Prong0MlScoreNonprompt, prong0MlScoreNonprompt, float); //! Nonprompt ML score of the D daughter } // namespace hf_cand_bs_reduced DECLARE_SOA_TABLE(HfRedBsProngs, "AOD", "HFREDBSPRONG", //! Table with Bs daughter indices hf_cand_bs_reduced::Prong0Id, hf_cand_bs_reduced::Prong1Id); +DECLARE_SOA_TABLE(HfRedBs2JpsiDaus, "AOD", "HFREDBS2JPSIDAU", + hf_cand_bs_reduced::JpsiId, hf_cand_bs_reduced::Prong0PhiId, hf_cand_bs_reduced::Prong1PhiId); + DECLARE_SOA_TABLE(HfRedBsDsMls, "AOD", "HFREDBSDSML", //! Table with ML scores for the Ds daughter hf_cand_bs_reduced::Prong0MlScoreBkg, hf_cand_bs_reduced::Prong0MlScorePrompt, @@ -509,6 +730,7 @@ DECLARE_SOA_TABLE(HfRedBsDsMls, "AOD", "HFREDBSDSML", //! Table with ML scores f o2::soa::Marker<1>); using HfRedCandBs = soa::Join; +using HfRedCandBsToJpsiPhi = soa::Join; namespace hf_cand_lb_reduced { @@ -576,6 +798,7 @@ DECLARE_SOA_TABLE(HfMcCheckDpPis, "AOD", "HFMCCHECKDPPI", //! Table with reconst // Table with same size as HFCANDB0 DECLARE_SOA_TABLE(HfMcRecRedB0s, "AOD", "HFMCRECREDB0", //! Reconstruction-level MC information on B0 candidates for reduced workflow hf_cand_b0::FlagMcMatchRec, + hf_cand_b0::ChannelMcMatchRec, hf_cand_b0::FlagWrongCollision, hf_cand_b0::DebugMcRec, hf_b0_mc::PtMother); @@ -591,6 +814,7 @@ DECLARE_SOA_TABLE(HfMcCheckB0s, "AOD", "HFMCCHECKB0", //! Table with reconstruct DECLARE_SOA_TABLE(HfMcGenRedB0s, "AOD", "HFMCGENREDB0", //! Generation-level MC information on B0 candidates for reduced workflow hf_cand_b0::FlagMcMatchGen, + hf_cand_b0::ChannelMcMatchRec, hf_b0_mc::PtTrack, hf_b0_mc::YTrack, hf_b0_mc::EtaTrack, @@ -644,6 +868,16 @@ DECLARE_SOA_TABLE(HfMcRecRedD0Pis, "AOD", "HFMCRECREDD0PI", //! Table with recon hf_cand_bplus::DebugMcRec, hf_bplus_mc::PtMother); +// table with results of reconstruction level MC matching +DECLARE_SOA_TABLE(HfMcRecRedJPKs, "AOD", "HFMCRECREDJPK", //! Table with reconstructed MC information on J/PsiK(<-B+) pairs for reduced workflow + hf_cand_bplus_reduced::JpsiId, + hf_cand_bplus_reduced::Prong1Id, + hf_cand_bplus::FlagMcMatchRec, + hf_cand_bplus::ChannelMcMatchRec, + hf_cand_bplus::FlagWrongCollision, + hf_cand_bplus::DebugMcRec, + hf_bplus_mc::PtMother); + // DECLARE_SOA_EXTENDED_TABLE_USER(ExTable, Tracks, "EXTABLE", DECLARE_SOA_TABLE(HfMcCheckD0Pis, "AOD", "HFMCCHECKD0PI", //! Table with reconstructed MC information on D0Pi(<-B0) pairs for MC checks in reduced workflow hf_bplus_mc::PdgCodeBeautyMother, @@ -656,6 +890,7 @@ DECLARE_SOA_TABLE(HfMcCheckD0Pis, "AOD", "HFMCCHECKD0PI", //! Table with reconst // Table with same size as HFCANDBPLUS DECLARE_SOA_TABLE(HfMcRecRedBps, "AOD", "HFMCRECREDBP", //! Reconstruction-level MC information on B+ candidates for reduced workflow hf_cand_bplus::FlagMcMatchRec, + hf_cand_bplus::ChannelMcMatchRec, hf_cand_bplus::FlagWrongCollision, hf_cand_bplus::DebugMcRec, hf_bplus_mc::PtMother); @@ -670,6 +905,7 @@ DECLARE_SOA_TABLE(HfMcCheckBps, "AOD", "HFMCCHECKBP", //! Table with reconstruct DECLARE_SOA_TABLE(HfMcGenRedBps, "AOD", "HFMCGENREDBP", //! Generation-level MC information on B+ candidates for reduced workflow hf_cand_bplus::FlagMcMatchGen, + hf_cand_bplus::ChannelMcMatchRec, hf_bplus_mc::PtTrack, hf_bplus_mc::YTrack, hf_bplus_mc::EtaTrack, @@ -687,6 +923,7 @@ namespace hf_cand_bplus_config DECLARE_SOA_COLUMN(MySelectionFlagD0, mySelectionFlagD0, int8_t); //! Flag to filter selected D0 mesons DECLARE_SOA_COLUMN(MySelectionFlagD0bar, mySelectionFlagD0bar, int8_t); //! Flag to filter selected D0 mesons DECLARE_SOA_COLUMN(MyInvMassWindowD0Pi, myInvMassWindowD0Pi, float); //! Half-width of the Bplus invariant-mass window in GeV/c2 +DECLARE_SOA_COLUMN(MyInvMassWindowJpsiK, myInvMassWindowJpsiK, float); //! Half-width of the Bplus invariant-mass window in GeV/c2 } // namespace hf_cand_bplus_config DECLARE_SOA_TABLE(HfCandBpConfigs, "AOD", "HFCANDBPCONFIG", //! Table with configurables information for reduced workflow @@ -694,6 +931,9 @@ DECLARE_SOA_TABLE(HfCandBpConfigs, "AOD", "HFCANDBPCONFIG", //! Table with confi hf_cand_bplus_config::MySelectionFlagD0bar, hf_cand_bplus_config::MyInvMassWindowD0Pi); +DECLARE_SOA_TABLE(HfCfgBpToJpsi, "AOD", "HFCFGBPTOJPSI", //! Table with configurables information for reduced workflow + hf_cand_bplus_config::MyInvMassWindowJpsiK); + namespace hf_bs_mc { // MC Rec @@ -726,6 +966,17 @@ DECLARE_SOA_TABLE(HfMcRecRedDsPis, "AOD", "HFMCRECREDDSPI", //! Table with recon hf_cand_bs::DebugMcRec, hf_bs_mc::PtMother); +// table with results of reconstruction level MC matching +DECLARE_SOA_TABLE(HfMcRecRedJPPhis, "AOD", "HFMCRECREDJPPHI", //! Table with reconstructed MC information on DsPi(<-Bs) pairs for reduced workflow + hf_cand_bs_reduced::JpsiId, + hf_cand_bs_reduced::Prong0PhiId, + hf_cand_bs_reduced::Prong1PhiId, + hf_cand_bs::FlagMcMatchRec, + hf_cand_bs::ChannelMcMatchRec, + hf_cand_bs::FlagWrongCollision, + hf_cand_bs::DebugMcRec, + hf_bs_mc::PtMother); + // try with extended table ? // DECLARE_SOA_EXTENDED_TABLE_USER(ExTable, Tracks, "EXTABLE", DECLARE_SOA_TABLE(HfMcCheckDsPis, "AOD", "HFMCCHECKDSPI", //! Table with reconstructed MC information on DsPi(<-Bs) pairs for MC checks in reduced workflow @@ -740,6 +991,7 @@ DECLARE_SOA_TABLE(HfMcCheckDsPis, "AOD", "HFMCCHECKDSPI", //! Table with reconst // Table with same size as HFCANDBS DECLARE_SOA_TABLE(HfMcRecRedBss, "AOD", "HFMCRECREDBS", //! Reconstruction-level MC information on Bs candidates for reduced workflow hf_cand_bs::FlagMcMatchRec, + hf_cand_bs::ChannelMcMatchRec, hf_cand_bs::FlagWrongCollision, hf_cand_bs::DebugMcRec, hf_bs_mc::PtMother); @@ -755,6 +1007,7 @@ DECLARE_SOA_TABLE(HfMcCheckBss, "AOD", "HFMCCHECKBS", //! Table with reconstruct DECLARE_SOA_TABLE(HfMcGenRedBss, "AOD", "HFMCGENREDBS", //! Generation-level MC information on Bs candidates for reduced workflow hf_cand_bs::FlagMcMatchGen, + hf_cand_bs::ChannelMcMatchRec, hf_bs_mc::PtTrack, hf_bs_mc::YTrack, hf_bs_mc::EtaTrack, @@ -769,14 +1022,17 @@ DECLARE_SOA_TABLE(HfMcGenRedBss, "AOD", "HFMCGENREDBS", //! Generation-level MC // so we can use them in the Bs part namespace hf_cand_bs_config { -DECLARE_SOA_COLUMN(MySelectionFlagD, mySelectionFlagD, int8_t); //! Flag to filter selected Ds mesons -DECLARE_SOA_COLUMN(MyInvMassWindowDPi, myInvMassWindowDPi, float); //! Half-width of the Bs invariant-mass window in GeV/c2 +DECLARE_SOA_COLUMN(MySelectionFlagD, mySelectionFlagD, int8_t); //! Flag to filter selected Ds mesons +DECLARE_SOA_COLUMN(MyInvMassWindowDPi, myInvMassWindowDPi, float); //! Half-width of the Bs invariant-mass window in GeV/c2 +DECLARE_SOA_COLUMN(MyInvMassWindowJpsiPhi, myInvMassWindowJpsiPhi, float); //! Half-width of the Bs invariant-mass window in GeV/c2 } // namespace hf_cand_bs_config DECLARE_SOA_TABLE(HfCandBsConfigs, "AOD", "HFCANDBSCONFIG", //! Table with configurables information for reduced workflow hf_cand_bs_config::MySelectionFlagD, hf_cand_bs_config::MyInvMassWindowDPi); +DECLARE_SOA_TABLE(HfCfgBsToJpsis, "AOD", "HFCFGBSTOJPSI", //! Table with configurables information for reduced workflow + hf_cand_bs_config::MyInvMassWindowJpsiPhi); namespace hf_lb_mc { // MC Rec @@ -1053,7 +1309,7 @@ DECLARE_SOA_COLUMN(DebugMcRec, debugMcRec, int8_t); // deb DECLARE_SOA_COLUMN(Origin, origin, int8_t); // Flag for origin of MC particle 1=promt, 2=FD DECLARE_SOA_COLUMN(SignD0, signD0, int8_t); // Sign of the D0 in the channels with D* -> D0 pi, needed in case of non-matched D* DECLARE_SOA_COLUMN(InvMassGen, invMassGen, float); //! Invariant mass at generation level in GeV/c2 -DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, //! +DECLARE_SOA_DYNAMIC_COLUMN(Pt, pt, //! [](float pxProng0, float pxProng1, float pyProng0, float pyProng1) -> float { return RecoDecay::pt((1.f * pxProng0 + 1.f * pxProng1), (1.f * pyProng0 + 1.f * pyProng1)); }); DECLARE_SOA_DYNAMIC_COLUMN(PtProng0, ptProng0, //! [](float pxProng0, float pyProng0) -> float { return RecoDecay::pt(pxProng0, pyProng0); }); diff --git a/PWGHF/D2H/TableProducer/CMakeLists.txt b/PWGHF/D2H/TableProducer/CMakeLists.txt index 928359768a9..a60ab1d78ab 100644 --- a/PWGHF/D2H/TableProducer/CMakeLists.txt +++ b/PWGHF/D2H/TableProducer/CMakeLists.txt @@ -11,6 +11,11 @@ # Candidate creators +o2physics_add_dpl_workflow(candidate-creator-b-to-jpsi-reduced + SOURCES candidateCreatorBToJpsiReduced.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::MLCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(candidate-creator-b0-reduced SOURCES candidateCreatorB0Reduced.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DCAFitter @@ -70,6 +75,11 @@ o2physics_add_dpl_workflow(data-creator-charm-reso-reduced PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::EventFilteringUtils COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(data-creator-jpsi-had-reduced + SOURCES dataCreatorJpsiHadReduced.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::EventFilteringUtils + COMPONENT_NAME Analysis) + # Converters o2physics_add_dpl_workflow(converter-reduced-3-prongs-ml diff --git a/PWGHF/D2H/TableProducer/candidateCreatorB0Reduced.cxx b/PWGHF/D2H/TableProducer/candidateCreatorB0Reduced.cxx index 89562743ef4..6434b88e024 100644 --- a/PWGHF/D2H/TableProducer/candidateCreatorB0Reduced.cxx +++ b/PWGHF/D2H/TableProducer/candidateCreatorB0Reduced.cxx @@ -15,7 +15,13 @@ /// \author Alexandre Bigot , IPHC Strasbourg /// \author Fabrizio Grosa , CERN -#include +#include "PWGHF/D2H/DataModel/ReducedDataModel.h" +#include "PWGHF/DataModel/CandidateReconstructionTables.h" +#include "PWGHF/DataModel/CandidateSelectionTables.h" +#include "PWGHF/Utils/utilsTrkCandHf.h" + +#include "Common/Core/trackUtilities.h" +#include "Common/DataModel/CollisionAssociationTables.h" #include "CommonConstants/PhysicsConstants.h" #include "DCAFitter/DCAFitterN.h" @@ -23,13 +29,7 @@ #include "Framework/runDataProcessing.h" #include "ReconstructionDataFormats/DCA.h" -#include "Common/Core/trackUtilities.h" -#include "Common/DataModel/CollisionAssociationTables.h" - -#include "PWGHF/DataModel/CandidateReconstructionTables.h" -#include "PWGHF/DataModel/CandidateSelectionTables.h" -#include "PWGHF/D2H/DataModel/ReducedDataModel.h" -#include "PWGHF/Utils/utilsTrkCandHf.h" +#include using namespace o2; using namespace o2::aod; @@ -203,7 +203,7 @@ struct HfCandidateCreatorB0Reduced { rowCandidateDmesMlScores(candD.mlScoreBkgMassHypo0(), candD.mlScorePromptMassHypo0(), candD.mlScoreNonpromptMassHypo0()); } } // pi loop - } // D loop + } // D loop } void processData(HfRedCollisionsWithExtras const& collisions, @@ -295,7 +295,7 @@ struct HfCandidateCreatorB0ReducedExpressions { if ((rowDPiMcRec.prong0Id() != candB0.prong0Id()) || (rowDPiMcRec.prong1Id() != candB0.prong1Id())) { continue; } - rowB0McRec(rowDPiMcRec.flagMcMatchRec(), rowDPiMcRec.flagWrongCollision(), rowDPiMcRec.debugMcRec(), rowDPiMcRec.ptMother()); + rowB0McRec(rowDPiMcRec.flagMcMatchRec(), -1 /*channel*/, rowDPiMcRec.flagWrongCollision(), rowDPiMcRec.debugMcRec(), rowDPiMcRec.ptMother()); filledMcInfo = true; if constexpr (checkDecayTypeMc) { rowB0McCheck(rowDPiMcRec.pdgCodeBeautyMother(), @@ -308,7 +308,7 @@ struct HfCandidateCreatorB0ReducedExpressions { break; } if (!filledMcInfo) { // protection to get same size tables in case something went wrong: we created a candidate that was not preselected in the D-Pi creator - rowB0McRec(0, -1, -1, -1.f); + rowB0McRec(0, -1, -1, -1, -1.f); if constexpr (checkDecayTypeMc) { rowB0McCheck(-1, -1, -1, -1, -1, -1); } diff --git a/PWGHF/D2H/TableProducer/candidateCreatorBToJpsiReduced.cxx b/PWGHF/D2H/TableProducer/candidateCreatorBToJpsiReduced.cxx new file mode 100644 index 00000000000..9fc5d845a04 --- /dev/null +++ b/PWGHF/D2H/TableProducer/candidateCreatorBToJpsiReduced.cxx @@ -0,0 +1,482 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file candidateCreatorBToJpsiReduced.cxx +/// \brief Reconstruction of B->J/Psi hadron candidates +/// +/// \author Fabrizio Chinu , Università degli Studi and INFN Torino +/// \author Fabrizio Grosa , CERN + +#include "PWGHF/D2H/DataModel/ReducedDataModel.h" +#include "PWGHF/DataModel/CandidateReconstructionTables.h" +#include "PWGHF/Utils/utilsTrkCandHf.h" + +#include "Common/Core/RecoDecay.h" +#include "Common/Core/trackUtilities.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include +#include +#include +#include + +using namespace o2; +using namespace o2::aod; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::hf_trkcandsel; + +enum DecayChannel : uint8_t { + B0ToJpsiK0Star = 0, + BplusToJpsiK, + BsToJpsiPhi +}; + +/// Reconstruction of B+ candidates +struct HfCandidateCreatorBToJpsiReduced { + Produces rowCandidateBpBase; // table defined in CandidateReconstructionTables.h + Produces rowCandidateBpProngs; // table defined in ReducedDataModel.h + Produces rowCandidateBsBase; // table defined in CandidateReconstructionTables.h + Produces rowCandidateBsProngs; // table defined in ReducedDataModel.h + + // vertexing + Configurable propagateToPCA{"propagateToPCA", true, "create tracks version propagated to PCA"}; + Configurable useAbsDCA{"useAbsDCA", true, "Minimise abs. distance rather than chi2"}; + Configurable useWeightedFinalPCA{"useWeightedFinalPCA", false, "Recalculate vertex position using track covariances, effective only if useAbsDCA is true"}; + Configurable maxR{"maxR", 200., "reject PCA's above this radius"}; + Configurable maxDZIni{"maxDZIni", 4., "reject (if>0) PCA candidate if tracks DZ exceeds threshold"}; + Configurable minParamChange{"minParamChange", 1.e-3, "stop iterations if largest change of any B+ is smaller than this"}; + Configurable minRelChi2Change{"minRelChi2Change", 0.9, "stop iterations is chi2/chi2old > this"}; + + Configurable runJpsiToee{"runJpsiToee", false, "Run analysis for J/Psi to ee (debug)"}; + // selection + Configurable invMassWindowJpsiHadTolerance{"invMassWindowJpsiHadTolerance", 0.01, "invariant-mass window tolerance for J/Psi K pair preselections (GeV/c2)"}; + + float myInvMassWindowJpsiK{1.}, myInvMassWindowJpsiPhi{1.}; // variable that will store the value of invMassWindowJpsiK (defined in dataCreatorJpsiKReduced.cxx) + double massBplus{0.}, massBs{0.}; + double bz{0.}; + o2::vertexing::DCAFitterN<2> df2; // fitter for B vertex (2-prong vertex fitter) + o2::vertexing::DCAFitterN<3> df3; // fitter for B vertex (3-prong vertex fitter) + o2::vertexing::DCAFitterN<4> df4; // fitter for B vertex (4-prong vertex fitter) + + using HfRedCollisionsWithExtras = soa::Join; + + Preslice> candsJpsiPerCollision = hf_track_index_reduced::hfRedCollisionId; + Preslice> tracksLf0PerCollision = hf_track_index_reduced::hfRedCollisionId; + Preslice> tracksLf1PerCollision = hf_track_index_reduced::hfRedCollisionId; + + std::shared_ptr hCandidatesB, hCandidatesPhi; + o2::base::Propagator::MatCorrType noMatCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; + HistogramRegistry registry{"registry"}; + + void init(InitContext const&) + { + // invariant-mass window cut + massBplus = o2::constants::physics::MassBPlus; + massBs = o2::constants::physics::MassBS; + + // Initialize fitters + df2.setPropagateToPCA(propagateToPCA); + df2.setMaxR(maxR); + df2.setMaxDZIni(maxDZIni); + df2.setMinParamChange(minParamChange); + df2.setMinRelChi2Change(minRelChi2Change); + df2.setUseAbsDCA(useAbsDCA); + df2.setWeightedFinalPCA(useWeightedFinalPCA); + df2.setMatCorrType(noMatCorr); + + df3.setPropagateToPCA(propagateToPCA); + df3.setMaxR(maxR); + df3.setMaxDZIni(maxDZIni); + df3.setMinParamChange(minParamChange); + df3.setMinRelChi2Change(minRelChi2Change); + df3.setUseAbsDCA(useAbsDCA); + df3.setWeightedFinalPCA(useWeightedFinalPCA); + df3.setMatCorrType(noMatCorr); + + df4.setPropagateToPCA(propagateToPCA); + df4.setMaxR(maxR); + df4.setMaxDZIni(maxDZIni); + df4.setMinParamChange(minParamChange); + df4.setMinRelChi2Change(minRelChi2Change); + df4.setUseAbsDCA(useAbsDCA); + df4.setWeightedFinalPCA(useWeightedFinalPCA); + df4.setMatCorrType(noMatCorr); + + // histograms + registry.add("hMassJpsi", "J/Psi mass;#it{M}_{#mu#mu} (GeV/#it{c}^{2});Counts", {HistType::kTH1F, {{600, 2.5, 3.7, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("hMassBplusToJpsiK", "2-prong candidates;inv. mass (B^{+} #rightarrow #overline{D^{0}}#pi^{#plus} #rightarrow #pi^{#minus}K^{#plus}#pi^{#plus}) (GeV/#it{c}^{2});entries", {HistType::kTH1F, {{500, 3., 8.}}}); + registry.add("hCovPVXX", "2-prong candidates;XX element of cov. matrix of prim. vtx. position (cm^{2});entries", {HistType::kTH1F, {{100, 0., 1.e-4}}}); + registry.add("hCovSVXX", "2-prong candidates;XX element of cov. matrix of sec. vtx. position (cm^{2});entries", {HistType::kTH1F, {{100, 0., 0.2}}}); + registry.add("hEvents", "Events;;entries", HistType::kTH1F, {{1, 0.5, 1.5}}); + + /// candidate monitoring + hCandidatesB = registry.add("hFitCandidatesJpsi", "candidates counter", {HistType::kTH1D, {axisCands}}); + hCandidatesPhi = registry.add("hFitCandidatesPhi", "candidates counter", {HistType::kTH1D, {axisCands}}); + setLabelHistoCands(hCandidatesB); + setLabelHistoCands(hCandidatesPhi); + } + + /// Main function to perform B+ candidate creation + /// \param collision the collision + /// \param candsJpsiThisColl J/Psi candidates in this collision + /// \param tracksLfThisCollisionArr LF tracks in this collision + /// \param invMass2JpsiHadMin minimum B invariant-mass + /// \param invMass2JpsiHadMax maximum B invariant-mass + template + void runCandidateCreation(Coll const& collision, + Cands const& candsJpsiThisColl, + TTracks0 const& tracksLfDau0ThisCollision, + TTracks1 const& tracksLfDau1ThisCollision, + const float invMass2JpsiHadMin, + const float invMass2JpsiHadMax) + { + auto primaryVertex = getPrimaryVertex(collision); + auto covMatrixPV = primaryVertex.getCov(); + + // Set the magnetic field from ccdb + bz = collision.bz(); + df2.setBz(bz); + df3.setBz(bz); + df4.setBz(bz); + + for (const auto& candJpsi : candsJpsiThisColl) { + o2::track::TrackParametrizationWithError trackPosParCov( + candJpsi.xDauPos(), candJpsi.alphaDauPos(), {candJpsi.yDauPos(), candJpsi.zDauPos(), candJpsi.snpDauPos(), candJpsi.tglDauPos(), candJpsi.signed1PtDauPos()}, 1 /*Charge*/, 1 /*Muon*/); + o2::track::TrackParametrizationWithError trackNegParCov( + candJpsi.xDauNeg(), candJpsi.alphaDauNeg(), {candJpsi.yDauNeg(), candJpsi.zDauNeg(), candJpsi.snpDauNeg(), candJpsi.tglDauNeg(), candJpsi.signed1PtDauNeg()}, -1 /*Charge*/, 1 /*Muon*/); + + // --------------------------------- + // reconstruct J/Psi candidate + o2::track::TrackParCov trackParCovJpsi{}; + std::array pVecJpsi{}; + registry.fill(HIST("hFitCandidatesJpsi"), SVFitting::BeforeFit); + try { + if (df2.process(trackPosParCov, trackNegParCov) == 0) { + LOG(info) << "DCAFitterN failed to reconstruct J/Psi candidate, skipping the candidate."; + continue; + } + } catch (const std::runtime_error& error) { + LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN cannot work, skipping the candidate."; + registry.fill(HIST("hFitCandidatesJpsi"), SVFitting::Fail); + continue; + } + registry.fill(HIST("hFitCandidatesJpsi"), SVFitting::FitOk); + + std::array pVecDauPos{candJpsi.pxDauPos(), candJpsi.pyDauPos(), candJpsi.pzDauPos()}; + std::array pVecDauNeg{candJpsi.pxDauNeg(), candJpsi.pyDauNeg(), candJpsi.pzDauNeg()}; + + df2.getTrack(0).getPxPyPzGlo(pVecDauPos); + df2.getTrack(1).getPxPyPzGlo(pVecDauNeg); + pVecJpsi = RecoDecay::pVec(pVecDauPos, pVecDauNeg); + trackParCovJpsi = df2.createParentTrackParCov(); + trackParCovJpsi.setAbsCharge(0); // to be sure + + float invMassJpsi{0.f}; + if (runJpsiToee) { + invMassJpsi = RecoDecay::m2(std::array{pVecDauPos, pVecDauNeg}, std::array{o2::constants::physics::MassElectron, o2::constants::physics::MassElectron}); + } else { + invMassJpsi = RecoDecay::m2(std::array{pVecDauPos, pVecDauNeg}, std::array{o2::constants::physics::MassMuon, o2::constants::physics::MassMuon}); + } + invMassJpsi = std::sqrt(invMassJpsi); + registry.fill(HIST("hMassJpsi"), invMassJpsi); + + for (const auto& trackLf0 : tracksLfDau0ThisCollision) { + // this track is among daughters + if (trackLf0.trackId() == candJpsi.prongPosId() || trackLf0.trackId() == candJpsi.prongNegId()) { + continue; + } + auto trackParCovLf0 = getTrackParCov(trackLf0); + std::array pVecTrackLf0{}; + if constexpr (decChannel == DecayChannel::BplusToJpsiK) { + // --------------------------------- + // reconstruct the 3-prong B+ vertex + hCandidatesB->Fill(SVFitting::BeforeFit); + try { + if (df3.process(trackPosParCov, trackNegParCov, trackParCovLf0) == 0) { + continue; + } + } catch (const std::runtime_error& error) { + LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN cannot work, skipping the candidate."; + hCandidatesB->Fill(SVFitting::Fail); + continue; + } + hCandidatesB->Fill(SVFitting::FitOk); + // JpsiK passed B+ reconstruction + + // calculate relevant properties + const auto& secondaryVertexBplus = df3.getPCACandidate(); + auto chi2PCA = df3.getChi2AtPCACandidate(); + auto covMatrixPCA = df3.calcPCACovMatrixFlat(); + registry.fill(HIST("hCovSVXX"), covMatrixPCA[0]); + registry.fill(HIST("hCovPVXX"), covMatrixPV[0]); + + // propagate Jpsi daugthers and K to the B+ vertex + df3.propagateTracksToVertex(); + // track.getPxPyPzGlo(pVec) modifies pVec of track + df3.getTrack(0).getPxPyPzGlo(pVecDauPos); // momentum of positive Jpsi daughter at the B+ vertex + df3.getTrack(1).getPxPyPzGlo(pVecDauNeg); // momentum of negative Jpsi daughter at the B+ vertex + df3.getTrack(2).getPxPyPzGlo(pVecTrackLf0); // momentum of K at the B+ vertex + + // compute invariant mass square and apply selection + auto invMass2JpsiK = RecoDecay::m2(std::array{pVecDauPos, pVecDauNeg, pVecTrackLf0}, std::array{o2::constants::physics::MassMuon, o2::constants::physics::MassMuon, o2::constants::physics::MassKPlus}); + if ((invMass2JpsiK < invMass2JpsiHadMin) || (invMass2JpsiK > invMass2JpsiHadMax)) { + continue; + } + registry.fill(HIST("hMassBplusToJpsiK"), std::sqrt(invMass2JpsiK)); + + // compute impact parameters of Jpsi and K + o2::dataformats::DCA dcaDauPos, dcaDauNeg, dcaKaon; + trackPosParCov.propagateToDCA(primaryVertex, bz, &dcaDauPos); + trackNegParCov.propagateToDCA(primaryVertex, bz, &dcaDauNeg); + trackParCovLf0.propagateToDCA(primaryVertex, bz, &dcaKaon); + + // get uncertainty of the decay length + double phi, theta; + // getPointDirection modifies phi and theta + getPointDirection(std::array{collision.posX(), collision.posY(), collision.posZ()}, secondaryVertexBplus, phi, theta); + auto errorDecayLength = std::sqrt(getRotatedCovMatrixXX(covMatrixPV, phi, theta) + getRotatedCovMatrixXX(covMatrixPCA, phi, theta)); + auto errorDecayLengthXY = std::sqrt(getRotatedCovMatrixXX(covMatrixPV, phi, 0.) + getRotatedCovMatrixXX(covMatrixPCA, phi, 0.)); + + // fill the candidate table for the B+ here: + rowCandidateBpBase(collision.globalIndex(), + collision.posX(), collision.posY(), collision.posZ(), + secondaryVertexBplus[0], secondaryVertexBplus[1], secondaryVertexBplus[2], + errorDecayLength, errorDecayLengthXY, + chi2PCA, + pVecDauPos[0], pVecDauPos[1], pVecDauPos[2], + pVecDauNeg[0], pVecDauNeg[1], pVecDauNeg[2], + pVecTrackLf0[0], pVecTrackLf0[1], pVecTrackLf0[2], + dcaDauPos.getY(), dcaDauNeg.getY(), dcaKaon.getY(), + std::sqrt(dcaDauPos.getSigmaY2()), std::sqrt(dcaDauNeg.getSigmaY2()), std::sqrt(dcaKaon.getSigmaY2())); + + rowCandidateBpProngs(candJpsi.globalIndex(), trackLf0.globalIndex()); + } else if constexpr (decChannel == DecayChannel::BsToJpsiPhi) { + for (const auto& trackLf1 : tracksLfDau1ThisCollision) { + // this track is among daughters + if (trackLf1.trackId() == candJpsi.prongPosId() || trackLf1.trackId() == candJpsi.prongNegId()) { + continue; + } + auto trackParCovLf1 = getTrackParCov(trackLf1); + std::array pVecTrackLf1 = trackLf1.pVector(); + + // --------------------------------- + // reconstruct the 4-prong Bs vertex + hCandidatesB->Fill(SVFitting::BeforeFit); + try { + if (df4.process(trackPosParCov, trackNegParCov, trackParCovLf0, trackParCovLf1) == 0) { + continue; + } + } catch (const std::runtime_error& error) { + LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN cannot work, skipping the candidate."; + hCandidatesB->Fill(SVFitting::Fail); + continue; + } + hCandidatesB->Fill(SVFitting::FitOk); + // passed Bs reconstruction + + // calculate relevant properties + const auto& secondaryVertexBs = df4.getPCACandidate(); + auto chi2PCA = df4.getChi2AtPCACandidate(); + auto covMatrixPCA = df4.calcPCACovMatrixFlat(); + registry.fill(HIST("hCovSVXX"), covMatrixPCA[0]); + registry.fill(HIST("hCovPVXX"), covMatrixPV[0]); + + // propagate Jpsi and phi to the Bs vertex + df4.propagateTracksToVertex(); + // track.getPxPyPzGlo(pVec) modifies pVec of track + df4.getTrack(0).getPxPyPzGlo(pVecDauPos); // momentum of Jpsi at the B+ vertex + df4.getTrack(1).getPxPyPzGlo(pVecDauNeg); // momentum of Jpsi at the B+ vertex + df4.getTrack(2).getPxPyPzGlo(pVecTrackLf0); // momentum of K at the B+ vertex + df4.getTrack(3).getPxPyPzGlo(pVecTrackLf1); // momentum of K at the B+ vertex + + // compute invariant mass square and apply selection + auto invMass2JpsiPhi = RecoDecay::m2(std::array{pVecDauPos, pVecDauNeg, pVecTrackLf0, pVecTrackLf1}, std::array{o2::constants::physics::MassMuon, o2::constants::physics::MassMuon, o2::constants::physics::MassKPlus, o2::constants::physics::MassKPlus}); + if ((invMass2JpsiPhi < invMass2JpsiHadMin) || (invMass2JpsiPhi > invMass2JpsiHadMax)) { + continue; + } + registry.fill(HIST("hMassBplusToJpsiK"), std::sqrt(invMass2JpsiPhi)); + + // compute impact parameters of Jpsi and K + o2::dataformats::DCA dcaDauPos, dcaDauNeg, dcaTrackLf0, dcaTrackLf1; + trackPosParCov.propagateToDCA(primaryVertex, bz, &dcaDauPos); + trackNegParCov.propagateToDCA(primaryVertex, bz, &dcaDauNeg); + trackParCovLf0.propagateToDCA(primaryVertex, bz, &dcaTrackLf0); + trackParCovLf1.propagateToDCA(primaryVertex, bz, &dcaTrackLf1); + + // get uncertainty of the decay length + double phi, theta; + // getPointDirection modifies phi and theta + getPointDirection(std::array{collision.posX(), collision.posY(), collision.posZ()}, secondaryVertexBs, phi, theta); + auto errorDecayLength = std::sqrt(getRotatedCovMatrixXX(covMatrixPV, phi, theta) + getRotatedCovMatrixXX(covMatrixPCA, phi, theta)); + auto errorDecayLengthXY = std::sqrt(getRotatedCovMatrixXX(covMatrixPV, phi, 0.) + getRotatedCovMatrixXX(covMatrixPCA, phi, 0.)); + + // fill the candidate table for the Bs here: + rowCandidateBsBase(collision.globalIndex(), + collision.posX(), collision.posY(), collision.posZ(), + secondaryVertexBs[0], secondaryVertexBs[1], secondaryVertexBs[2], + errorDecayLength, errorDecayLengthXY, + chi2PCA, + pVecDauPos[0], pVecDauPos[1], pVecDauPos[2], + pVecDauNeg[0], pVecDauNeg[1], pVecDauPos[2], + pVecTrackLf0[0], pVecTrackLf0[1], pVecTrackLf0[2], + pVecTrackLf1[0], pVecTrackLf1[1], pVecTrackLf0[2], + dcaDauPos.getY(), dcaDauNeg.getY(), dcaTrackLf0.getY(), dcaTrackLf1.getY(), + std::sqrt(dcaDauPos.getSigmaY2()), std::sqrt(dcaDauNeg.getSigmaY2()), std::sqrt(dcaTrackLf0.getSigmaY2()), std::sqrt(dcaTrackLf1.getSigmaY2())); + rowCandidateBsProngs(candJpsi.globalIndex(), trackLf0.globalIndex(), trackLf1.globalIndex()); + } + } + } // TrackLf0 loop + } // J/Psi loop + } // end runCandidateCreation + + void processDataBplus(HfRedCollisionsWithExtras const& collisions, + soa::Join const& candsJpsi, + soa::Join const& tracksKaon, + aod::HfOrigColCounts const& collisionsCounter, + aod::HfCfgBpToJpsi const& configs) + { + // Jpsi K invariant-mass window cut + for (const auto& config : configs) { + myInvMassWindowJpsiK = config.myInvMassWindowJpsiK(); + } + // invMassWindowJpsiHadTolerance is used to apply a slightly tighter cut than in JpsiK pair preselection + // to avoid accepting JpsiK pairs that were not formed in JpsiK pair creator + double invMass2JpsiKMin = (massBplus - myInvMassWindowJpsiK + invMassWindowJpsiHadTolerance) * (massBplus - myInvMassWindowJpsiK + invMassWindowJpsiHadTolerance); + double invMass2JpsiKMax = (massBplus + myInvMassWindowJpsiK - invMassWindowJpsiHadTolerance) * (massBplus + myInvMassWindowJpsiK - invMassWindowJpsiHadTolerance); + + for (const auto& collisionCounter : collisionsCounter) { + registry.fill(HIST("hEvents"), 1, collisionCounter.originalCollisionCount()); + } + + for (const auto& collision : collisions) { + auto thisCollId = collision.globalIndex(); + auto candsJpsiThisColl = candsJpsi.sliceBy(candsJpsiPerCollision, thisCollId); + auto tracksKaonThisCollision = tracksKaon.sliceBy(tracksLf0PerCollision, thisCollId); + runCandidateCreation(collision, candsJpsiThisColl, tracksKaonThisCollision, tracksKaonThisCollision, invMass2JpsiKMin, invMass2JpsiKMax); + } + } // processDataBplus + PROCESS_SWITCH(HfCandidateCreatorBToJpsiReduced, processDataBplus, "Process data for B+", true); + + void processDataBs(HfRedCollisionsWithExtras const& collisions, + soa::Join const& candsJpsi, + soa::Join const& tracksLfDau0, + soa::Join const& tracksLfDau1, + aod::HfOrigColCounts const& collisionsCounter, + aod::HfCfgBsToJpsis const& configs) + { + // Jpsi K invariant-mass window cut + for (const auto& config : configs) { + myInvMassWindowJpsiPhi = config.myInvMassWindowJpsiPhi(); + } + // invMassWindowJpsiHadTolerance is used to apply a slightly tighter cut than in JpsiK pair preselection + // to avoid accepting JpsiK pairs that were not formed in JpsiK pair creator + double invMass2JpsiKMin = (massBs - myInvMassWindowJpsiPhi + invMassWindowJpsiHadTolerance) * (massBs - myInvMassWindowJpsiPhi + invMassWindowJpsiHadTolerance); + double invMass2JpsiKMax = (massBs + myInvMassWindowJpsiPhi - invMassWindowJpsiHadTolerance) * (massBs + myInvMassWindowJpsiPhi - invMassWindowJpsiHadTolerance); + + for (const auto& collisionCounter : collisionsCounter) { + registry.fill(HIST("hEvents"), 1, collisionCounter.originalCollisionCount()); + } + + for (const auto& collision : collisions) { + auto thisCollId = collision.globalIndex(); + auto candsJpsiThisColl = candsJpsi.sliceBy(candsJpsiPerCollision, thisCollId); + auto tracksLf0ThisCollision = tracksLfDau0.sliceBy(tracksLf0PerCollision, thisCollId); + auto tracksLf1ThisCollision = tracksLfDau1.sliceBy(tracksLf1PerCollision, thisCollId); + runCandidateCreation(collision, candsJpsiThisColl, tracksLf0ThisCollision, tracksLf1ThisCollision, invMass2JpsiKMin, invMass2JpsiKMax); + } + } // processDataBs + PROCESS_SWITCH(HfCandidateCreatorBToJpsiReduced, processDataBs, "Process data for Bs", false); +}; // struct + +/// Extends the table base with expression columns and performs MC matching. +struct HfCandidateCreatorBToJpsiReducedExpressions { + Spawns rowCandidateBPlus; + Spawns rowCandidateBs; + Spawns rowTracksExt0; + Spawns rowTracksExt1; + Produces rowBplusMcRec; + Produces rowBsMcRec; + + /// Fill candidate information at MC reconstruction level + /// \param rowsJpsiHadMcRec MC reco information on Jpsi hadron pairs + /// \param candsBIds prong global indices of B candidates + template + void fillMcRec(McRec const& rowsJpsiHadMcRec, CCands const& candsBIds) + { + for (const auto& candB : candsBIds) { + bool filledMcInfo{false}; + if constexpr (decChannel == DecayChannel::BplusToJpsiK) { + for (const auto& rowJpsiHadMcRec : rowsJpsiHadMcRec) { + if ((rowJpsiHadMcRec.jpsiId() != candB.jpsiId()) || (rowJpsiHadMcRec.prong1Id() != candB.bachKaId())) { + continue; + } + rowBplusMcRec(rowJpsiHadMcRec.flagMcMatchRec(), rowJpsiHadMcRec.channelMcMatchRec(), rowJpsiHadMcRec.flagWrongCollision(), rowJpsiHadMcRec.debugMcRec(), rowJpsiHadMcRec.ptMother()); + filledMcInfo = true; + break; + } + if (!filledMcInfo) { // protection to get same size tables in case something went wrong: we created a candidate that was not preselected in the Jpsi-K creator + rowBplusMcRec(0, -1, -1, -1, -1.f); + } + } else if constexpr (decChannel == DecayChannel::BsToJpsiPhi) { + for (const auto& rowJpsiHadMcRec : rowsJpsiHadMcRec) { + if ((rowJpsiHadMcRec.jpsiId() != candB.jpsiId()) || (rowJpsiHadMcRec.prong0PhiId() != candB.prong0PhiId()) || (rowJpsiHadMcRec.prong1PhiId() != candB.prong1PhiId())) { + continue; + } + rowBsMcRec(rowJpsiHadMcRec.flagMcMatchRec(), rowJpsiHadMcRec.channelMcMatchRec(), rowJpsiHadMcRec.flagWrongCollision(), rowJpsiHadMcRec.debugMcRec(), rowJpsiHadMcRec.ptMother()); + filledMcInfo = true; + break; + } + if (!filledMcInfo) { // protection to get same size tables in case something went wrong: we created a candidate that was not preselected in the Jpsi-K creator + rowBsMcRec(0, -1, -1, -1, -1.f); + } + } + } + } + + void processMcBPlus(HfMcRecRedJPKs const& rowsJpsiKMcRec, HfRedBplus2JpsiDaus const& candsBplus) + { + fillMcRec(rowsJpsiKMcRec, candsBplus); + } + PROCESS_SWITCH(HfCandidateCreatorBToJpsiReducedExpressions, processMcBPlus, "Process MC", false); + + void processMcBs(HfMcRecRedJPPhis const& rowsJpsiPhiMcRec, HfRedBs2JpsiDaus const& Bs) + { + fillMcRec(rowsJpsiPhiMcRec, Bs); + } + PROCESS_SWITCH(HfCandidateCreatorBToJpsiReducedExpressions, processMcBs, "Process MC", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc)}; +} diff --git a/PWGHF/D2H/TableProducer/candidateCreatorBplusReduced.cxx b/PWGHF/D2H/TableProducer/candidateCreatorBplusReduced.cxx index 3cd3e0f571b..bbd8f9df356 100644 --- a/PWGHF/D2H/TableProducer/candidateCreatorBplusReduced.cxx +++ b/PWGHF/D2H/TableProducer/candidateCreatorBplusReduced.cxx @@ -14,7 +14,13 @@ /// /// \author Antonio Palasciano , Università degli Studi di Bari -#include +#include "PWGHF/D2H/DataModel/ReducedDataModel.h" +#include "PWGHF/DataModel/CandidateReconstructionTables.h" +#include "PWGHF/DataModel/CandidateSelectionTables.h" +#include "PWGHF/Utils/utilsTrkCandHf.h" + +#include "Common/Core/trackUtilities.h" +#include "Common/DataModel/CollisionAssociationTables.h" #include "CommonConstants/PhysicsConstants.h" #include "DCAFitter/DCAFitterN.h" @@ -23,13 +29,7 @@ #include "ReconstructionDataFormats/DCA.h" #include "ReconstructionDataFormats/V0.h" -#include "Common/Core/trackUtilities.h" -#include "Common/DataModel/CollisionAssociationTables.h" - -#include "PWGHF/DataModel/CandidateReconstructionTables.h" -#include "PWGHF/DataModel/CandidateSelectionTables.h" -#include "PWGHF/D2H/DataModel/ReducedDataModel.h" -#include "PWGHF/Utils/utilsTrkCandHf.h" +#include using namespace o2; using namespace o2::aod; @@ -293,7 +293,7 @@ struct HfCandidateCreatorBplusReducedExpressions { if ((rowD0PiMcRec.prong0Id() != candBplus.prong0Id()) || (rowD0PiMcRec.prong1Id() != candBplus.prong1Id())) { continue; } - rowBplusMcRec(rowD0PiMcRec.flagMcMatchRec(), rowD0PiMcRec.flagWrongCollision(), rowD0PiMcRec.debugMcRec(), rowD0PiMcRec.ptMother()); + rowBplusMcRec(rowD0PiMcRec.flagMcMatchRec(), -1 /*channel*/, rowD0PiMcRec.flagWrongCollision(), rowD0PiMcRec.debugMcRec(), rowD0PiMcRec.ptMother()); filledMcInfo = true; if constexpr (checkDecayTypeMc) { rowBplusMcCheck(rowD0PiMcRec.pdgCodeBeautyMother(), @@ -305,7 +305,7 @@ struct HfCandidateCreatorBplusReducedExpressions { break; } if (!filledMcInfo) { // protection to get same size tables in case something went wrong: we created a candidate that was not preselected in the D0-Pi creator - rowBplusMcRec(0, -1, -1, -1.f); + rowBplusMcRec(0, -1, -1, -1, -1.f); if constexpr (checkDecayTypeMc) { rowBplusMcCheck(-1, -1, -1, -1, -1); } diff --git a/PWGHF/D2H/TableProducer/candidateCreatorBsReduced.cxx b/PWGHF/D2H/TableProducer/candidateCreatorBsReduced.cxx index 7198796bc9b..a20adc78f7e 100644 --- a/PWGHF/D2H/TableProducer/candidateCreatorBsReduced.cxx +++ b/PWGHF/D2H/TableProducer/candidateCreatorBsReduced.cxx @@ -14,7 +14,13 @@ /// /// \author Fabio Catalano , CERN -#include +#include "PWGHF/D2H/DataModel/ReducedDataModel.h" +#include "PWGHF/DataModel/CandidateReconstructionTables.h" +#include "PWGHF/DataModel/CandidateSelectionTables.h" +#include "PWGHF/Utils/utilsTrkCandHf.h" + +#include "Common/Core/trackUtilities.h" +#include "Common/DataModel/CollisionAssociationTables.h" #include "CommonConstants/PhysicsConstants.h" #include "DCAFitter/DCAFitterN.h" @@ -22,13 +28,7 @@ #include "Framework/runDataProcessing.h" #include "ReconstructionDataFormats/DCA.h" -#include "Common/Core/trackUtilities.h" -#include "Common/DataModel/CollisionAssociationTables.h" - -#include "PWGHF/DataModel/CandidateReconstructionTables.h" -#include "PWGHF/DataModel/CandidateSelectionTables.h" -#include "PWGHF/D2H/DataModel/ReducedDataModel.h" -#include "PWGHF/Utils/utilsTrkCandHf.h" +#include using namespace o2; using namespace o2::aod; @@ -292,7 +292,7 @@ struct HfCandidateCreatorBsReducedExpressions { if ((rowDPiMcRec.prong0Id() != candB.prong0Id()) || (rowDPiMcRec.prong1Id() != candB.prong1Id())) { continue; } - rowBsMcRec(rowDPiMcRec.flagMcMatchRec(), rowDPiMcRec.flagWrongCollision(), rowDPiMcRec.debugMcRec(), rowDPiMcRec.ptMother()); + rowBsMcRec(rowDPiMcRec.flagMcMatchRec(), -1 /*channel*/, rowDPiMcRec.flagWrongCollision(), rowDPiMcRec.debugMcRec(), rowDPiMcRec.ptMother()); filledMcInfo = true; if constexpr (checkDecayTypeMc) { rowBsMcCheck(rowDPiMcRec.pdgCodeBeautyMother(), @@ -305,7 +305,7 @@ struct HfCandidateCreatorBsReducedExpressions { break; } if (!filledMcInfo) { // protection to get same size tables in case something went wrong: we created a candidate that was not preselected in the DsPi creator - rowBsMcRec(0, -1, -1, -1.f); + rowBsMcRec(0, -1, -1, -1, -1.f); if constexpr (checkDecayTypeMc) { rowBsMcCheck(-1, -1, -1, -1, -1, -1); } diff --git a/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx b/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx index d03f8d9eda0..fde8c3b553e 100644 --- a/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx +++ b/PWGHF/D2H/TableProducer/dataCreatorCharmHadPiReduced.cxx @@ -18,24 +18,6 @@ /// \author Fabio Catalano , CERN /// \author Biao Zhang , Heidelberg University -#include -#include -#include -#include -#include - -#include "CommonConstants/PhysicsConstants.h" -#include "DCAFitter/DCAFitterN.h" -#include "Framework/AnalysisTask.h" -#include "Framework/O2DatabasePDGPlugin.h" -#include "Framework/runDataProcessing.h" -#include "ReconstructionDataFormats/DCA.h" - -#include "Common/Core/trackUtilities.h" -#include "Common/DataModel/CollisionAssociationTables.h" -#include "Common/DataModel/Centrality.h" -#include "Common/DataModel/Qvectors.h" - #include "PWGHF/Core/HfHelper.h" #include "PWGHF/Core/SelectorCuts.h" #include "PWGHF/D2H/DataModel/ReducedDataModel.h" @@ -46,6 +28,24 @@ #include "PWGHF/Utils/utilsEvSelHf.h" #include "PWGHF/Utils/utilsTrkCandHf.h" +#include "Common/Core/trackUtilities.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/CollisionAssociationTables.h" +#include "Common/DataModel/Qvectors.h" + +#include "CommonConstants/PhysicsConstants.h" +#include "DCAFitter/DCAFitterN.h" +#include "Framework/AnalysisTask.h" +#include "Framework/O2DatabasePDGPlugin.h" +#include "Framework/runDataProcessing.h" +#include "ReconstructionDataFormats/DCA.h" + +#include +#include +#include +#include +#include + using namespace o2; using namespace o2::analysis; using namespace o2::aod; @@ -341,7 +341,7 @@ struct HfDataCreatorCharmHadPiReduced { return false; } // minimum pT and eta selection - if (trackParCovPion.getPt() < trackPionConfigurations.ptPionMin || std::abs(trackParCovPion.getEta()) > trackPionConfigurations.etaPionMax || !isSelectedTrackDCA(trackParCovPion, dcaPion)) { + if (trackParCovPion.getPt() < trackPionConfigurations.ptPionMin || std::abs(trackParCovPion.getEta()) > trackPionConfigurations.etaPionMax || !isSelectedTrackDCA(trackParCovPion, dcaPion, trackPionConfigurations.binsPtPion, trackPionConfigurations.cutsTrackPionDCA)) { return false; } // reject pions that are charm-hadron daughters @@ -354,27 +354,6 @@ struct HfDataCreatorCharmHadPiReduced { return true; } - /// Single-track cuts for pions on dcaXY - /// \param trackPar is the track parametrisation - /// \param dca is the 2-D array with track DCAs - /// \return true if track passes all cuts - template - bool isSelectedTrackDCA(const T1& trackPar, const T2& dca) - { - auto pTBinTrack = findBin(trackPionConfigurations.binsPtPion, trackPar.getPt()); - if (pTBinTrack == -1) { - return false; - } - - if (std::abs(dca[0]) < trackPionConfigurations.cutsTrackPionDCA->get(pTBinTrack, "min_dcaxytoprimary")) { - return false; // minimum DCAxy - } - if (std::abs(dca[0]) > trackPionConfigurations.cutsTrackPionDCA->get(pTBinTrack, "max_dcaxytoprimary")) { - return false; // maximum DCAxy - } - return true; - } - /// Calculates the index of the collision with the maximum number of contributions. ///\param collisions are the collisions to search through. ///\return The index of the collision with the maximum number of contributions. @@ -1332,7 +1311,7 @@ struct HfDataCreatorCharmHadPiReduced { yProngs[counter] = RecoDecay::y(daught.pVector(), pdg->Mass(daught.pdgCode())); counter++; } - rowHfB0McGenReduced(flag, ptParticle, yParticle, etaParticle, + rowHfB0McGenReduced(flag, -1 /*channel*/, ptParticle, yParticle, etaParticle, ptProngs[0], yProngs[0], etaProngs[0], ptProngs[1], yProngs[1], etaProngs[1]); } else if constexpr (decayChannel == DecayChannel::BsToDsminusPi) { @@ -1407,7 +1386,7 @@ struct HfDataCreatorCharmHadPiReduced { yProngs[counter] = RecoDecay::y(daught.pVector(), pdg->Mass(daught.pdgCode())); counter++; } - rowHfBsMcGenReduced(flag, ptParticle, yParticle, etaParticle, + rowHfBsMcGenReduced(flag, -1 /*channel*/, ptParticle, yParticle, etaParticle, ptProngs[0], yProngs[0], etaProngs[0], ptProngs[1], yProngs[1], etaProngs[1]); } else if constexpr (decayChannel == DecayChannel::BplusToD0barPi) { @@ -1440,7 +1419,7 @@ struct HfDataCreatorCharmHadPiReduced { yProngs[counter] = RecoDecay::y(daught.pVector(), pdg->Mass(daught.pdgCode())); counter++; } - rowHfBpMcGenReduced(flag, ptParticle, yParticle, etaParticle, + rowHfBpMcGenReduced(flag, -1 /*channel*/, ptParticle, yParticle, etaParticle, ptProngs[0], yProngs[0], etaProngs[0], ptProngs[1], yProngs[1], etaProngs[1]); } else if constexpr (decayChannel == DecayChannel::LbToLcplusPi) { diff --git a/PWGHF/D2H/TableProducer/dataCreatorJpsiHadReduced.cxx b/PWGHF/D2H/TableProducer/dataCreatorJpsiHadReduced.cxx new file mode 100644 index 00000000000..3a382d62dcf --- /dev/null +++ b/PWGHF/D2H/TableProducer/dataCreatorJpsiHadReduced.cxx @@ -0,0 +1,1120 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file dataCreatorJpsiHadReduced.cxx +/// \brief Creation of J/Psi-LF hadron pairs for Beauty hadron analyses +/// +/// \author Fabrizio Chinu , Università degli Studi and INFN Torino +/// \author Fabrizio Grosa , CERN + +#include "PWGHF/Core/CentralityEstimation.h" +#include "PWGHF/Core/DecayChannels.h" +#include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/SelectorCuts.h" +#include "PWGHF/D2H/DataModel/ReducedDataModel.h" +#include "PWGHF/D2H/Utils/utilsRedDataFormat.h" +#include "PWGHF/DataModel/CandidateReconstructionTables.h" +#include "PWGHF/DataModel/CandidateSelectionTables.h" +#include "PWGHF/Utils/utilsEvSelHf.h" +#include "PWGHF/Utils/utilsTrkCandHf.h" + +#include "Common/Core/RecoDecay.h" +#include "Common/Core/trackUtilities.h" +#include "Common/DataModel/CollisionAssociationTables.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/PIDResponseTOF.h" +#include "Common/DataModel/PIDResponseTPC.h" +#include "Common/DataModel/TrackSelectionTables.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace o2; +using namespace o2::analysis; +using namespace o2::aod; +using namespace o2::constants::physics; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::hf_trkcandsel; + +enum Event : uint8_t { // TODO: check if needed + Processed = 0, + NoCharmHadPiSelected, + CharmHadPiSelected, + NEvent +}; + +enum DecayChannel : uint8_t { + B0ToJpsiK0Star = 0, + BplusToJpsiK, + BsToJpsiPhi +}; + +enum WrongCollisionType : uint8_t { + None = 0, + WrongAssociation, + SplitCollision, +}; + +/// Creation of Jpsi-Had pairs for Beauty hadrons +struct HfDataCreatorJpsiHadReduced { + // Produces AOD tables to store track information + // collision related tables + Produces hfReducedCollision; + Produces hfReducedCollCentrality; + Produces hfReducedQvector; + Produces hfReducedCollExtra; + Produces hfCollisionCounter; + // J/Psi related tables + Produces hfJpsi; + Produces hfRedJpsiCov; + // Ka bachelor related tables + Produces hfTrackLfDau0; + Produces hfTrackCovLfDau0; + Produces hfTrackLfDau1; + Produces hfTrackCovLfDau1; + // MC related tables + Produces rowHfJpsiKMcRecReduced; + Produces rowHfJpsiPhiMcRecReduced; + Produces rowHfBpMcGenReduced; + Produces rowHfBsMcGenReduced; + + Produces rowCandidateConfigBplus; + Produces rowCandidateConfigBs; + + Configurable propagateToPCA{"propagateToPCA", true, "create tracks version propagated to PCA"}; + Configurable useAbsDCA{"useAbsDCA", false, "Minimise abs. distance rather than chi2"}; + Configurable useWeightedFinalPCA{"useWeightedFinalPCA", false, "Recalculate vertex position using track covariances, effective only if useAbsDCA is true"}; + Configurable maxR{"maxR", 200., "reject PCA's above this radius"}; + Configurable maxDZIni{"maxDZIni", 4., "reject (if>0) PCA candidate if tracks DZ exceeds threshold"}; + Configurable minParamChange{"minParamChange", 1.e-3, "stop iterations if largest change of any B0 is smaller than this"}; + Configurable minRelChi2Change{"minRelChi2Change", 0.9, "stop iterations is chi2/chi2old > this"}; + + Configurable runJpsiToee{"runJpsiToee", false, "Run analysis for J/Psi to ee (debug)"}; + Configurable ptJpsiMin{"ptJpsiMin", 0., "Lower bound of J/Psi pT"}; + Configurable ptJpsiMax{"ptJpsiMax", 50., "Upper bound of J/Psi pT"}; + Configurable useTrackIsGlobalTrackWoDCA{"useTrackIsGlobalTrackWoDCA", true, "check isGlobalTrackWoDCA status for the bachelor tracks"}; + Configurable ptTrackMin{"ptTrackMin", 0.5, "minimum bachelor track pT threshold (GeV/c)"}; + Configurable absEtaTrackMax{"absEtaTrackMax", 0.8, "maximum bachelor track absolute eta threshold"}; + Configurable> binsPtTrack{"binsPtTrack", std::vector{hf_cuts_single_track::vecBinsPtTrack}, "track pT bin limits for bachelor track DCA XY pT-dependent cut"}; + Configurable> cutsTrackDCA{"cutsTrackDCA", {hf_cuts_single_track::CutsTrack[0], hf_cuts_single_track::NBinsPtTrack, hf_cuts_single_track::NCutVarsTrack, hf_cuts_single_track::labelsPtTrack, hf_cuts_single_track::labelsCutVarTrack}, "Single-track selections per pT bin for bachelor track"}; + // topological/kinematic cuts + Configurable> binsPt{"binsPt", std::vector{hf_cuts_jpsi_to_mu_mu::vecBinsPt}, "J/Psi pT bin limits"}; + Configurable> cuts{"cuts", {hf_cuts_jpsi_to_mu_mu::Cuts[0], hf_cuts_jpsi_to_mu_mu::NBinsPt, hf_cuts_jpsi_to_mu_mu::NCutVars, hf_cuts_jpsi_to_mu_mu::labelsPt, hf_cuts_jpsi_to_mu_mu::labelsCutVar}, "J/Psi candidate selection per pT bin"}; + Configurable invMassWindowJpsiHad{"invMassWindowJpsiHad", 0.3, "invariant-mass window for Jpsi-Had pair preselections (GeV/c2)"}; + Configurable deltaMPhiMax{"deltaMPhiMax", 0.02, "invariant-mass window for phi preselections (GeV/c2) (only for Bs->J/PsiPhi)"}; + Configurable cpaMin{"cpaMin", 0., "Minimum cosine of pointing angle for B candidates"}; + Configurable decLenMin{"decLenMin", 0., "Minimum decay length for B candidates"}; + + // magnetic field setting from CCDB + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable ccdbPathGrpMag{"ccdbPathGrpMag", "GLO/Config/GRPMagField", "CCDB path of the GRPMagField object (Run 3)"}; + + HfHelper hfHelper; + + // CCDB service + Service ccdb; + // O2DatabasePDG service + Service pdg; + + using TracksPid = soa::Join; + using TracksPidWithSel = soa::Join; + using TracksSel = soa::Join; + using TracksPidWithSelAndMc = soa::Join; + using CollisionsWCMcLabels = soa::Join; + + Preslice candsJpsiPerCollision = aod::track_association::collisionId; + Preslice trackIndicesPerCollision = aod::track_association::collisionId; + PresliceUnsorted colPerMcCollision = aod::mccollisionlabel::mcCollisionId; + + o2::base::Propagator::MatCorrType noMatCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE; + int runNumber; + double bz{0.}; + double invMass2JpsiHadMin, invMass2JpsiHadMax; + bool isHfCandBhadConfigFilled = false; + + o2::hf_evsel::HfEventSelection hfEvSel; + o2::vertexing::DCAFitterN<2> df2; + o2::vertexing::DCAFitterN<3> df3; + o2::vertexing::DCAFitterN<4> df4; + + HistogramRegistry registry{"registry"}; + + void init(InitContext const&) + { + std::array doProcess = {doprocessJpsiKData, doprocessJpsiKMc, doprocessJpsiPhiData, doprocessJpsiPhiMc}; + if (std::accumulate(doProcess.begin(), doProcess.end(), 0) != 1) { + LOGP(fatal, "One and only one process function can be enabled at a time, please fix your configuration!"); + } + + // Set up the histogram registry + constexpr int kNBinsSelections = 2 + aod::SelectionStep::RecoTopol; + std::string labels[kNBinsSelections]; + labels[0] = "No selection"; + labels[1 + aod::SelectionStep::RecoSkims] = "Skims selection"; + labels[1 + aod::SelectionStep::RecoTopol] = "Skims & Topological selections"; + static const AxisSpec axisSelections = {kNBinsSelections, 0.5, kNBinsSelections + 0.5, ""}; + registry.add("hSelectionsJpsi", "J/Psi selection;;#it{p}_{T} (GeV/#it{c})", {HistType::kTH2F, {axisSelections, {(std::vector)binsPt, "#it{p}_{T} (GeV/#it{c})"}}}); + for (int iBin = 0; iBin < kNBinsSelections; ++iBin) { + registry.get(HIST("hSelectionsJpsi"))->GetXaxis()->SetBinLabel(iBin + 1, labels[iBin].data()); + } + + constexpr int kNBinsEvents = NEvent; + std::string labelsEvents[kNBinsEvents]; + labelsEvents[Event::Processed] = "processed"; + labelsEvents[Event::NoCharmHadPiSelected] = "without CharmHad-Pi pairs"; + labelsEvents[Event::CharmHadPiSelected] = "with CharmHad-Pi pairs"; + static const AxisSpec axisEvents = {kNBinsEvents, 0.5, kNBinsEvents + 0.5, ""}; + registry.add("hEvents", "Events;;entries", HistType::kTH1F, {axisEvents}); + for (int iBin = 0; iBin < kNBinsEvents; iBin++) { + registry.get(HIST("hEvents"))->GetXaxis()->SetBinLabel(iBin + 1, labelsEvents[iBin].data()); + } + + registry.add("hMassJpsi", "J/Psi mass;#it{M}_{#mu#mu} (GeV/#it{c}^{2});Counts", {HistType::kTH1F, {{600, 2.8, 3.4, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("hPtJpsi", "J/Psi #it{p}_{T};#it{p}_{T} (GeV/#it{c});Counts", {HistType::kTH1F, {{(std::vector)binsPt, "#it{p}_{T} (GeV/#it{c})"}}}); + registry.add("hCpaJpsi", "J/Psi cos#theta_{p};J/Psi cos#theta_{p};Counts", {HistType::kTH1F, {{200, -1., 1, "J/Psi cos#theta_{p}"}}}); + std::shared_ptr hFitCandidatesJpsi = registry.add("hFitCandidatesJpsi", "Jpsi candidate counter", {HistType::kTH1D, {axisCands}}); + std::shared_ptr hFitCandidatesBPlus = registry.add("hFitCandidatesBPlus", "hFitCandidatesBPlus candidate counter", {HistType::kTH1D, {axisCands}}); + std::shared_ptr hFitCandidatesBS = registry.add("hFitCandidatesBS", "hFitCandidatesBS candidate counter", {HistType::kTH1D, {axisCands}}); + setLabelHistoCands(hFitCandidatesJpsi); + setLabelHistoCands(hFitCandidatesBPlus); + setLabelHistoCands(hFitCandidatesBS); + if (doprocessJpsiKData || doprocessJpsiKMc) { + registry.add("hPtKaon", "Kaon #it{p}_{T};#it{p}_{T} (GeV/#it{c});Counts", {HistType::kTH1F, {{100, 0., 10.}}}); + registry.add("hMassJpsiKaon", "J/Psi Kaon mass;#it{M}_{J/#PsiK} (GeV/#it{c}^{2});Counts", {HistType::kTH1F, {{800, 4.9, 5.7}}}); + } else if (doprocessJpsiPhiData || doprocessJpsiPhiMc) { + registry.add("hPtPhi", "Phi #it{p}_{T};#it{p}_{T} (GeV/#it{c});Counts", {HistType::kTH1F, {{100, 0., 10.}}}); + registry.add("hMassPhi", "Phi mass;#it{M}_{KK} (GeV/#it{c}^{2});Counts", {HistType::kTH1F, {{200, 0.9, 1.2}}}); + registry.add("hMassJpsiPhi", "J/Psi Phi mass;#it{M}_{J/#Psi#phi} (GeV/#it{c}^{2});Counts", {HistType::kTH1F, {{800, 4.9, 5.7}}}); + std::shared_ptr hFitCandidatesPhi = registry.add("hFitCandidatesPhi", "Phi candidate counter", {HistType::kTH1D, {axisCands}}); + setLabelHistoCands(hFitCandidatesPhi); + } + + df2.setPropagateToPCA(propagateToPCA); + df2.setMaxR(maxR); + df2.setMaxDZIni(maxDZIni); + df2.setMinParamChange(minParamChange); + df2.setMinRelChi2Change(minRelChi2Change); + df2.setUseAbsDCA(useAbsDCA); + df2.setWeightedFinalPCA(useWeightedFinalPCA); + df2.setMatCorrType(noMatCorr); + + df3.setPropagateToPCA(propagateToPCA); + df3.setMaxR(maxR); + df3.setMaxDZIni(maxDZIni); + df3.setMinParamChange(minParamChange); + df3.setMinRelChi2Change(minRelChi2Change); + df3.setUseAbsDCA(useAbsDCA); + df3.setWeightedFinalPCA(useWeightedFinalPCA); + df3.setMatCorrType(noMatCorr); + + df4.setPropagateToPCA(propagateToPCA); + df4.setMaxR(maxR); + df4.setMaxDZIni(maxDZIni); + df4.setMinParamChange(minParamChange); + df4.setMinRelChi2Change(minRelChi2Change); + df4.setUseAbsDCA(useAbsDCA); + df4.setWeightedFinalPCA(useWeightedFinalPCA); + df4.setMatCorrType(noMatCorr); + + // Configure CCDB access + ccdb->setURL(ccdbUrl); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + runNumber = 0; + + if (doprocessJpsiKData || doprocessJpsiKMc) { + invMass2JpsiHadMin = (MassBPlus - invMassWindowJpsiHad) * (MassBPlus - invMassWindowJpsiHad); + invMass2JpsiHadMax = (MassBPlus + invMassWindowJpsiHad) * (MassBPlus + invMassWindowJpsiHad); + } else if (doprocessJpsiPhiData || doprocessJpsiPhiMc) { + invMass2JpsiHadMin = (MassBS - invMassWindowJpsiHad) * (MassBS - invMassWindowJpsiHad); + invMass2JpsiHadMax = (MassBS + invMassWindowJpsiHad) * (MassBS + invMassWindowJpsiHad); + } + } + + /// Topological cuts + /// \param candidate is candidate + /// \param trackPos is the positive track + /// \param trackNeg is the negative track + /// \return true if candidate passes all cuts + template + bool selectionTopol(const T1& candidate, const T2& trackPos, const T2& trackNeg) + { + auto candpT = candidate.pt(); + auto candInvMass = runJpsiToee ? hfHelper.invMassJpsiToEE(candidate) : hfHelper.invMassJpsiToMuMu(candidate); + auto pseudoPropDecLen = candidate.decayLengthXY() * candInvMass / candpT; + auto pTBin = findBin(binsPt, candpT); + if (pTBin == -1) { + return false; + } + + // check that the candidate pT is within the analysis range + if (candpT < ptJpsiMin || candpT >= ptJpsiMax) { + return false; + } + + // cut on μ+ μ− (e+e−) invariant mass + if (std::abs(candInvMass - o2::constants::physics::MassJPsi) > cuts->get(pTBin, "m")) { + return false; + } + + // cut on daughter pT (same cut used for both channels) + if (trackNeg.pt() < cuts->get(pTBin, "pT mu") || trackPos.pt() < cuts->get(pTBin, "pT mu")) { + return false; + } + + // decay length + if (candidate.decayLength() < cuts->get(pTBin, "decay length")) { + return false; + } + + // decay length in XY plane + if (candidate.decayLengthXY() < cuts->get(pTBin, "decay length xy")) { + return false; + } + + // cosine of pointing angle + if (candidate.cpa() < cuts->get(pTBin, "cpa")) { + return false; + } + + // cosine of pointing angle XY + if (candidate.cpaXY() < cuts->get(pTBin, "cpa xy")) { + return false; + } + + // product of daughter impact parameters + if (candidate.impactParameterProduct() > cuts->get(pTBin, "d0xd0")) { + return false; + } + + // pseudoproper decay length + if (pseudoPropDecLen < cuts->get(pTBin, "pseudoprop. decay length")) { + return false; + } + + return true; + } + + /// Kaon selection (J/Psi K+ <-- B+) + /// \param track is the considered track + /// \param trackParCov is the track parametrisation + /// \param dca is the 2-D array with track DCAs + /// \param jPsiDautracks J/Psi daughter tracks + /// \return true if track passes all cuts + template + bool isTrackSelected(const T1& track, const T2& trackParCov, const T3& dca, const std::vector& jPsiDautracks) + { + // check isGlobalTrackWoDCA status for kaons if wanted + if (useTrackIsGlobalTrackWoDCA && !track.isGlobalTrackWoDCA()) { + return false; + } + // minimum pT, eta, and DCA selection + if (trackParCov.getPt() < ptTrackMin || std::abs(trackParCov.getEta()) > absEtaTrackMax || !isSelectedTrackDCA(trackParCov, dca, binsPtTrack, cutsTrackDCA)) { + return false; + } + // reject kaons that are J/Psi daughters + for (const auto& trackJpsi : jPsiDautracks) { + if (track.globalIndex() == trackJpsi.globalIndex()) { + return false; + } + } + + return true; + } + + /// B meson preselections + /// \param momentum is the B meson momentum + /// \param secondaryVertex is the reconstructed secondary vertex + /// \param collision is the reconstructed collision + template + bool isBSelected(const T1& momentum, const T2& secondaryVertex, const T3& collision) + { + // B candidate CPA + if (RecoDecay::cpa(std::array{collision.posX(), collision.posY(), collision.posZ()}, secondaryVertex, momentum) < cpaMin) { + return false; + } + + // B candidate decay length + if (RecoDecay::distance(std::array{collision.posX(), collision.posY(), collision.posZ()}, secondaryVertex) < decLenMin) { + return false; + } + + return true; + } + + /// Checks if the B meson is associated with a different collision than the one it was generated in + /// \param particleMother is the mother particle + /// \param collision is the reconstructed collision + /// \param indexCollisionMaxNumContrib is the index of the collision associated with a given MC collision with the largest number of contributors. + /// \param flagWrongCollision is the flag indicating if whether the associated collision is incorrect. + template + void checkWrongCollision(const PParticle& particleMother, + const CColl& collision, + const int64_t& indexCollisionMaxNumContrib, + int8_t& flagWrongCollision) + { + + if (particleMother.mcCollision().globalIndex() != collision.mcCollisionId()) { + flagWrongCollision = WrongCollisionType::WrongAssociation; + } else { + if (collision.globalIndex() != indexCollisionMaxNumContrib) { + flagWrongCollision = WrongCollisionType::SplitCollision; + } + } + } + + /// Function for filling MC reco information in the tables + /// \param particlesMc is the table with MC particles + /// \param vecDaughtersB is the vector with all daughter tracks (Jpsi daughters in first position) + /// \param indexHfCandJpsi is the index of the Jpsi candidate + /// \param selectedTracksBach is the map with the indices of selected bachelor pion tracks + template + void fillMcRecoInfo(const CColl& collision, + const PParticles& particlesMc, + const std::vector& vecDaughtersB, + int& indexHfCandJpsi, + std::array, 2> selectedTracksBach, + const int64_t indexCollisionMaxNumContrib) + { + + // we check the MC matching to be stored + int8_t sign{0}, flag{0}, channel{0}; + int8_t flagWrongCollision{WrongCollisionType::None}; + int8_t debug{0}; + float motherPt{-1.f}; + + if constexpr (decChannel == DecayChannel::BplusToJpsiK) { + // B+ → J/Psi K+ → (µ+µ-) K+ + int indexRec = -1; + if (!runJpsiToee) { + indexRec = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersB[0], vecDaughtersB[1], vecDaughtersB[2]}, Pdg::kBPlus, std::array{-kMuonMinus, +kMuonMinus, +kKPlus}, true, &sign, 3); + } else { + indexRec = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersB[0], vecDaughtersB[1], vecDaughtersB[2]}, Pdg::kBPlus, std::array{-kElectron, +kElectron, +kKPlus}, true, &sign, 3); + } + if (indexRec > -1) { + // J/Psi → µ+µ- + if (!runJpsiToee) { + indexRec = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersB[0], vecDaughtersB[1]}, Pdg::kJPsi, std::array{-kMuonMinus, +kMuonMinus}, true); + } else { + indexRec = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersB[0], vecDaughtersB[1]}, Pdg::kJPsi, std::array{-kElectron, +kElectron}, true); + } + if (indexRec > -1) { + flag = sign * o2::hf_decay::hf_cand_beauty::BplusToJpsiK; + } else { + debug = 1; + LOGF(debug, "B+ decays in the expected final state but the condition on the intermediate state is not fulfilled"); + } + + auto indexMother = RecoDecay::getMother(particlesMc, vecDaughtersB.back().template mcParticle_as(), Pdg::kBPlus, true); + if (indexMother >= 0) { + auto particleMother = particlesMc.rawIteratorAt(indexMother); + motherPt = particleMother.pt(); + checkWrongCollision(particleMother, collision, indexCollisionMaxNumContrib, flagWrongCollision); + } + } + rowHfJpsiKMcRecReduced(indexHfCandJpsi, selectedTracksBach[0][vecDaughtersB.back().globalIndex()], flag, channel, flagWrongCollision, debug, motherPt); + } else if constexpr (decChannel == DecayChannel::BsToJpsiPhi) { + // Bs → J/Psi phi → (µ+µ-) (K+K-) + int indexRec = -1; + if (!runJpsiToee) { + indexRec = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersB[0], vecDaughtersB[1], vecDaughtersB[2], vecDaughtersB[3]}, Pdg::kBS, std::array{-kMuonMinus, +kMuonMinus, +kKPlus, -kKPlus}, true, &sign, 4); + } else { + indexRec = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersB[0], vecDaughtersB[1], vecDaughtersB[2], vecDaughtersB[3]}, Pdg::kBS, std::array{-kElectron, +kElectron, +kKPlus, -kKPlus}, true, &sign, 4); + } + if (indexRec > -1) { + // J/Psi → µ+µ- + if (!runJpsiToee) { + indexRec = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersB[0], vecDaughtersB[1]}, Pdg::kJPsi, std::array{-kMuonMinus, +kMuonMinus}, true, &sign, 1); + } else { + indexRec = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersB[0], vecDaughtersB[1]}, Pdg::kJPsi, std::array{-kElectron, +kElectron}, true, &sign, 1); + } + if (indexRec > -1) { + flag = sign * o2::hf_decay::hf_cand_beauty::BsToJpsiKK; + indexRec = RecoDecay::getMatchedMCRec(particlesMc, std::array{vecDaughtersB[2], vecDaughtersB[3]}, Pdg::kPhi, std::array{-kKPlus, +kKPlus}, true, &sign, 1); + if (indexRec > -1) { + channel = o2::hf_decay::hf_cand_beauty::BsToJpsiPhi; + } else { + debug = 1; + LOGF(debug, "Bs decays in the expected final state but the condition on the phi intermediate state is not fulfilled"); + } + } else { + debug = 1; + LOGF(debug, "Bs decays in the expected final state but the condition on the J/Psi intermediate state is not fulfilled"); + } + + auto indexMother = RecoDecay::getMother(particlesMc, vecDaughtersB.back().template mcParticle_as(), Pdg::kBS, true); + if (indexMother >= 0) { + auto particleMother = particlesMc.rawIteratorAt(indexMother); + motherPt = particleMother.pt(); + checkWrongCollision(particleMother, collision, indexCollisionMaxNumContrib, flagWrongCollision); + } + } + rowHfJpsiPhiMcRecReduced(indexHfCandJpsi, selectedTracksBach[0][vecDaughtersB.back().globalIndex()], selectedTracksBach[1][vecDaughtersB.back().globalIndex()], flag, channel, flagWrongCollision, debug, motherPt); + } + } + + /// Calculates the index of the collision with the maximum number of contributions. + ///\param collisions are the collisions to search through. + ///\return The index of the collision with the maximum number of contributions. + template + int64_t getIndexCollisionMaxNumContrib(const CColl& collisions) + { + unsigned maxNumContrib = 0; + int64_t indexCollisionMaxNumContrib = -1; + for (const auto& collision : collisions) { + if (collision.numContrib() > maxNumContrib) { + maxNumContrib = collision.numContrib(); + indexCollisionMaxNumContrib = collision.globalIndex(); + } + } + return indexCollisionMaxNumContrib; + } + + template + void runMcGen(aod::McParticles const& particlesMc) + { + // Match generated particles. + for (const auto& particle : particlesMc) { + int8_t sign{0}, flag{0}, channel{0}; + if constexpr (decChannel == DecayChannel::BplusToJpsiK) { + // B+ → J/Psi K+ → (µ+µ-) K+ + if (RecoDecay::isMatchedMCGen(particlesMc, particle, Pdg::kBPlus, std::array{static_cast(Pdg::kJPsi), +kKPlus}, true, &sign)) { + // Match J/Psi -> µ+µ- + auto candJpsiMC = particlesMc.rawIteratorAt(particle.daughtersIds().front()); + // Printf("Checking J/Psi -> µ+µ-"); + if (!runJpsiToee) { + if (RecoDecay::isMatchedMCGen(particlesMc, candJpsiMC, static_cast(Pdg::kJPsi), std::array{-kMuonMinus, +kMuonMinus}, true)) { + flag = sign * o2::hf_decay::hf_cand_beauty::BplusToJpsiK; + } + } else { // debug + // Printf("Checking J/Psi -> e+e-"); + if (RecoDecay::isMatchedMCGen(particlesMc, candJpsiMC, static_cast(Pdg::kJPsi), std::array{-kElectron, +kElectron}, true)) { + flag = sign * o2::hf_decay::hf_cand_beauty::BplusToJpsiK; + } + } + } + + // save information for B+ task + if (std::abs(flag) != o2::hf_decay::hf_cand_beauty::BplusToJpsiK) { + continue; + } + + auto ptParticle = particle.pt(); + auto yParticle = RecoDecay::y(particle.pVector(), MassBPlus); + auto etaParticle = particle.eta(); + + std::array ptProngs; + std::array yProngs; + std::array etaProngs; + int counter = 0; + for (const auto& daught : particle.daughters_as()) { + ptProngs[counter] = daught.pt(); + etaProngs[counter] = daught.eta(); + yProngs[counter] = RecoDecay::y(daught.pVector(), pdg->Mass(daught.pdgCode())); + counter++; + } + rowHfBpMcGenReduced(flag, channel, ptParticle, yParticle, etaParticle, + ptProngs[0], yProngs[0], etaProngs[0], + ptProngs[1], yProngs[1], etaProngs[1]); + } else if constexpr (decChannel == DecayChannel::BsToJpsiPhi) { + // Bs → J/Psi phi → (µ+µ-) (K+K-) + if (RecoDecay::isMatchedMCGen(particlesMc, particle, Pdg::kBS, std::array{static_cast(Pdg::kJPsi), +kKPlus, -kKPlus}, true, &sign, 2)) { + // Match J/Psi -> µ+µ- and phi -> K+K- + auto candJpsiMC = particlesMc.rawIteratorAt(particle.daughtersIds().front()); + auto candPhiMC = particlesMc.rawIteratorAt(particle.daughtersIds().back()); + // Printf("Checking J/Psi -> µ+µ- and phi -> K+K-"); + if (runJpsiToee && RecoDecay::isMatchedMCGen(particlesMc, candJpsiMC, static_cast(Pdg::kJPsi), std::array{-kElectron, +kElectron}, true)) { + flag = sign * o2::hf_decay::hf_cand_beauty::BsToJpsiKK; + } else if (!runJpsiToee && RecoDecay::isMatchedMCGen(particlesMc, candJpsiMC, static_cast(Pdg::kJPsi), std::array{-kMuonMinus, +kMuonMinus}, true)) { + flag = sign * o2::hf_decay::hf_cand_beauty::BsToJpsiKK; + } + // Check phi -> K+K- + if (RecoDecay::isMatchedMCGen(particlesMc, candPhiMC, static_cast(Pdg::kPhi), std::array{-kKPlus, +kKPlus}, true)) { + channel = o2::hf_decay::hf_cand_beauty::BsToJpsiPhi; + } + } + + // save information for Bs task + if (std::abs(flag) != o2::hf_decay::hf_cand_beauty::BsToJpsiKK) { + continue; + } + + auto ptParticle = particle.pt(); + auto yParticle = RecoDecay::y(particle.pVector(), MassBPlus); + auto etaParticle = particle.eta(); + + std::array ptProngs; + std::array yProngs; + std::array etaProngs; + int counter = 0; + for (const auto& daught : particle.daughters_as()) { + ptProngs[counter] = daught.pt(); + etaProngs[counter] = daught.eta(); + yProngs[counter] = RecoDecay::y(daught.pVector(), pdg->Mass(daught.pdgCode())); + counter++; + } + rowHfBsMcGenReduced(flag, channel, ptParticle, yParticle, etaParticle, + ptProngs[0], yProngs[0], etaProngs[0], + ptProngs[1], yProngs[1], etaProngs[1]); + } + } // gen + } + + // Jpsi candidate selection + template + void runDataCreation(Coll const& collision, + JpsiCands const& candsJpsi, + aod::TrackAssoc const& trackIndices, + TTracks const&, + PParticles const& particlesMc, + uint64_t const& indexCollisionMaxNumContrib, + aod::BCsWithTimestamps const&) + { + + // helpers for ReducedTables filling + int indexHfReducedCollision = hfReducedCollision.lastIndex() + 1; + // std::map where the key is the track.globalIndex() and + // the value is the track index in the table of the selected tracks + std::map selectedTracksBach; + std::map selectedTracksBach2; // for the second daughter (for B0 and Bs) + + bool fillHfReducedCollision = false; + + auto primaryVertex = getPrimaryVertex(collision); + + // Set the magnetic field from ccdb. + // The static instance of the propagator was already modified in the HFTrackIndexSkimCreator, + // but this is not true when running on Run2 data/MC already converted into AO2Ds. + auto bc = collision.template bc_as(); + if (runNumber != bc.runNumber()) { + LOG(info) << ">>>>>>>>>>>> Current run number: " << runNumber; + o2::parameters::GRPMagField* grpo = ccdb->getForTimeStamp(ccdbPathGrpMag, bc.timestamp()); + if (grpo == nullptr) { + LOGF(fatal, "Run 3 GRP object (type o2::parameters::GRPMagField) is not available in CCDB for run=%d at timestamp=%llu", bc.runNumber(), bc.timestamp()); + } + o2::base::Propagator::initFieldFromGRP(grpo); + bz = o2::base::Propagator::Instance()->getNominalBz(); + LOG(info) << ">>>>>>>>>>>> Magnetic field: " << bz; + runNumber = bc.runNumber(); + } + df2.setBz(bz); + df3.setBz(bz); + df4.setBz(bz); + + auto thisCollId = collision.globalIndex(); + // looping over 2-prong candidates + for (const auto& candidate : candsJpsi) { + + // Apply the selections on the J/Psi candidates + registry.fill(HIST("hSelectionsJpsi"), 1, candidate.pt()); + + if (!(candidate.hfflag() & 1 << aod::hf_cand_2prong::DecayType::JpsiToMuMu)) { + continue; + } + registry.fill(HIST("hSelectionsJpsi"), 2 + aod::SelectionStep::RecoSkims, candidate.pt()); + + auto trackPos = candidate.template prong0_as(); // positive daughter + auto trackNeg = candidate.template prong1_as(); // negative daughter + + auto trackPosParCov = getTrackParCov(trackPos); + auto trackNegParCov = getTrackParCov(trackNeg); + + std::vector jPsiDauTracks{trackPos, trackNeg}; + + auto dca0 = o2::dataformats::DCA(jPsiDauTracks[0].dcaXY(), jPsiDauTracks[0].dcaZ(), jPsiDauTracks[0].cYY(), jPsiDauTracks[0].cZY(), jPsiDauTracks[0].cZZ()); + auto dca1 = o2::dataformats::DCA(jPsiDauTracks[1].dcaXY(), jPsiDauTracks[1].dcaZ(), jPsiDauTracks[1].cYY(), jPsiDauTracks[1].cZY(), jPsiDauTracks[1].cZZ()); + + // repropagate tracks to this collision if needed + if (jPsiDauTracks[0].collisionId() != thisCollId) { + trackPosParCov.propagateToDCA(primaryVertex, bz, &dca0); + } + + if (jPsiDauTracks[1].collisionId() != thisCollId) { + trackNegParCov.propagateToDCA(primaryVertex, bz, &dca1); + } + + // --------------------------------- + // reconstruct J/Psi candidate secondary vertex + o2::track::TrackParCov trackParCovJpsi{}; + std::array pVecJpsi{}; + registry.fill(HIST("hFitCandidatesJpsi"), SVFitting::BeforeFit); + try { + if (df2.process(trackPosParCov, trackNegParCov) == 0) { + continue; + } + } catch (const std::runtime_error& error) { + LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN cannot work, skipping the candidate."; + registry.fill(HIST("hFitCandidatesJpsi"), SVFitting::Fail); + continue; + } + registry.fill(HIST("hFitCandidatesJpsi"), SVFitting::FitOk); + + // topological selection + if (!selectionTopol(candidate, trackPos, trackNeg)) { + continue; + } + registry.fill(HIST("hSelectionsJpsi"), 2 + aod::SelectionStep::RecoTopol, candidate.pt()); + + int indexHfCandJpsi = hfJpsi.lastIndex() + 1; + float invMassJpsi{0.f}; + if (runJpsiToee) { + invMassJpsi = hfHelper.invMassJpsiToEE(candidate); + } else { + invMassJpsi = hfHelper.invMassJpsiToMuMu(candidate); + } + registry.fill(HIST("hMassJpsi"), invMassJpsi); + registry.fill(HIST("hPtJpsi"), candidate.pt()); + registry.fill(HIST("hCpaJpsi"), candidate.cpa()); + + bool fillHfCandJpsi = false; + + // TODO: add single track information (min eta, min ITS/TPC clusters, etc.) + double invMass2JpsiHad{0.}; + for (const auto& trackId : trackIndices) { + auto trackBach = trackId.template track_as(); + + // apply selections on bachelor tracks + auto trackParCovBach = getTrackParCov(trackBach); + std::array dcaBach{trackBach.dcaXY(), trackBach.dcaZ()}; + std::array pVecBach = trackBach.pVector(); + if (trackBach.collisionId() != thisCollId) { + o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackParCovBach, 2.f, noMatCorr, &dcaBach); + getPxPyPz(trackParCovBach, pVecBach); + } + + // apply selections on bachelor tracks + if (!isTrackSelected(trackBach, trackParCovBach, dcaBach, jPsiDauTracks)) { + continue; + } + + if constexpr (decChannel == DecayChannel::BplusToJpsiK) { + registry.fill(HIST("hPtKaon"), trackParCovBach.getPt()); + // compute invariant mass square and apply selection + invMass2JpsiHad = RecoDecay::m2(std::array{pVecJpsi, pVecBach}, std::array{MassJPsi, MassKPlus}); + if ((invMass2JpsiHad < invMass2JpsiHadMin) || (invMass2JpsiHad > invMass2JpsiHadMax)) { + continue; + } + registry.fill(HIST("hMassJpsiKaon"), std::sqrt(invMass2JpsiHad)); + + registry.fill(HIST("hFitCandidatesBPlus"), SVFitting::BeforeFit); + try { + if (df3.process(trackPosParCov, trackNegParCov, trackParCovBach) == 0) { + continue; + } + } catch (const std::runtime_error& error) { + LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN cannot work, skipping the candidate."; + registry.fill(HIST("hFitCandidatesBPlus"), SVFitting::Fail); + continue; + } + registry.fill(HIST("hFitCandidatesBPlus"), SVFitting::FitOk); + + o2::track::TrackParCov trackParCovBPlus{}; + std::array pVecBPlus{}, pVec0{}, pVec1{}, pVec2{}; + + auto secondaryVertexBPlus = df3.getPCACandidate(); + df3.propagateTracksToVertex(); + df3.getTrack(0).getPxPyPzGlo(pVec0); + df3.getTrack(1).getPxPyPzGlo(pVec1); + df3.getTrack(2).getPxPyPzGlo(pVec2); + pVecBPlus = RecoDecay::pVec(pVec0, pVec1, pVec2); + trackParCovBPlus = df3.createParentTrackParCov(); + trackParCovBPlus.setAbsCharge(0); // to be sure + + if (!isBSelected(pVecBPlus, secondaryVertexBPlus, collision)) { + continue; + } + + // fill Kaon tracks table + // if information on track already stored, go to next track + if (!selectedTracksBach.count(trackBach.globalIndex())) { + hfTrackLfDau0(trackBach.globalIndex(), indexHfReducedCollision, + trackParCovBach.getX(), trackParCovBach.getAlpha(), + trackParCovBach.getY(), trackParCovBach.getZ(), trackParCovBach.getSnp(), + trackParCovBach.getTgl(), trackParCovBach.getQ2Pt(), + trackBach.itsNCls(), trackBach.tpcNClsCrossedRows(), trackBach.tpcChi2NCl(), + trackBach.hasTPC(), trackBach.hasTOF(), + trackBach.tpcNSigmaPi(), trackBach.tofNSigmaPi(), + trackBach.tpcNSigmaKa(), trackBach.tofNSigmaKa(), + trackBach.tpcNSigmaPr(), trackBach.tofNSigmaPr()); + hfTrackCovLfDau0(trackParCovBach.getSigmaY2(), trackParCovBach.getSigmaZY(), trackParCovBach.getSigmaZ2(), + trackParCovBach.getSigmaSnpY(), trackParCovBach.getSigmaSnpZ(), + trackParCovBach.getSigmaSnp2(), trackParCovBach.getSigmaTglY(), trackParCovBach.getSigmaTglZ(), + trackParCovBach.getSigmaTglSnp(), trackParCovBach.getSigmaTgl2(), + trackParCovBach.getSigma1PtY(), trackParCovBach.getSigma1PtZ(), trackParCovBach.getSigma1PtSnp(), + trackParCovBach.getSigma1PtTgl(), trackParCovBach.getSigma1Pt2()); + // add trackBach.globalIndex() to a list + // to keep memory of the pions filled in the table and avoid refilling them if they are paired to another Jpsi candidate + // and keep track of their index in hfTrackLfDau0 for McRec purposes + selectedTracksBach[trackBach.globalIndex()] = hfTrackLfDau0.lastIndex(); + } + + if constexpr (doMc) { + std::vector beautyHadDauTracks{}; + for (const auto& track : jPsiDauTracks) { + beautyHadDauTracks.push_back(track); + } + beautyHadDauTracks.push_back(trackBach); + fillMcRecoInfo(collision, particlesMc, beautyHadDauTracks, indexHfCandJpsi, std::array, 2>{selectedTracksBach}, indexCollisionMaxNumContrib); + } + fillHfCandJpsi = true; + } else if constexpr (decChannel == DecayChannel::BsToJpsiPhi) { + for (auto trackBachId2 = trackId + 1; trackBachId2 != trackIndices.end(); ++trackBachId2) { + auto trackBach2 = trackBachId2.template track_as(); + auto trackBach2ParCov = getTrackParCov(trackBach2); + + std::array dcaBach2{trackBach2.dcaXY(), trackBach2.dcaZ()}; + std::array pVecBach2 = trackBach2.pVector(); + if (trackBach2.collisionId() != thisCollId) { + o2::base::Propagator::Instance()->propagateToDCABxByBz({collision.posX(), collision.posY(), collision.posZ()}, trackBach2ParCov, 2.f, noMatCorr, &dcaBach2); + getPxPyPz(trackBach2ParCov, pVecBach2); + } + + // apply selections on bachelor tracks + if (!isTrackSelected(trackBach2, trackBach2ParCov, dcaBach2, jPsiDauTracks)) { + continue; + } + std::array pVec2{trackBach.pVector()}, pVec3{trackBach2.pVector()}; + auto invMassPhi = RecoDecay::m(std::array{pVec2, pVec3}, std::array{MassKPlus, MassKPlus}); + + if (std::abs(invMassPhi - MassPhi) > deltaMPhiMax) { + continue; + } + + // --------------------------------- + // reconstruct Bs candidate secondary vertex + + registry.fill(HIST("hFitCandidatesBS"), SVFitting::BeforeFit); + try { + if (df4.process(trackPosParCov, trackNegParCov, trackParCovBach, trackBach2ParCov) == 0) { + continue; + } + } catch (const std::runtime_error& error) { + LOG(info) << "Run time error found: " << error.what() << ". DCAFitterN cannot work, skipping the candidate."; + registry.fill(HIST("hFitCandidatesBS"), SVFitting::Fail); + continue; + } + registry.fill(HIST("hFitCandidatesBS"), SVFitting::FitOk); + + o2::track::TrackParCov trackParCovBS{}; + std::array pVecBS{}, pVec0{}, pVec1{}, pVecPhi{}; + + auto secondaryVertexBS = df4.getPCACandidate(); + df4.propagateTracksToVertex(); + df4.getTrack(0).getPxPyPzGlo(pVec0); + df4.getTrack(1).getPxPyPzGlo(pVec1); + df4.getTrack(2).getPxPyPzGlo(pVec2); + df4.getTrack(3).getPxPyPzGlo(pVec3); + pVecBS = RecoDecay::pVec(pVec0, pVec1, pVec2, pVec3); + pVecPhi = RecoDecay::pVec(pVec2, pVec3); + trackParCovBS = df4.createParentTrackParCov(); + trackParCovBS.setAbsCharge(0); // to be sure + + if (!isBSelected(pVecBS, secondaryVertexBS, collision)) { + continue; + } + + registry.fill(HIST("hPtPhi"), RecoDecay::pt(pVecBach, pVecBach2)); + registry.fill(HIST("hMassPhi"), RecoDecay::m(std::array{pVecBach, pVecBach2}, std::array{MassKPlus, MassKPlus})); + invMass2JpsiHad = RecoDecay::m2(std::array{pVecJpsi, pVecPhi}, std::array{MassJPsi, MassPhi}); + if ((invMass2JpsiHad < invMass2JpsiHadMin) || (invMass2JpsiHad > invMass2JpsiHadMax)) { + continue; + } + registry.fill(HIST("hMassJpsiPhi"), std::sqrt(invMass2JpsiHad)); + + // fill daughter tracks table + // if information on track already stored, go to next track + if (!selectedTracksBach.count(trackBach.globalIndex())) { + hfTrackLfDau0(trackBach.globalIndex(), indexHfReducedCollision, + trackParCovBach.getX(), trackParCovBach.getAlpha(), + trackParCovBach.getY(), trackParCovBach.getZ(), trackParCovBach.getSnp(), + trackParCovBach.getTgl(), trackParCovBach.getQ2Pt(), + trackBach.itsNCls(), trackBach.tpcNClsCrossedRows(), trackBach.tpcChi2NCl(), + trackBach.hasTPC(), trackBach.hasTOF(), + trackBach.tpcNSigmaPi(), trackBach.tofNSigmaPi(), + trackBach.tpcNSigmaKa(), trackBach.tofNSigmaKa(), + trackBach.tpcNSigmaPr(), trackBach.tofNSigmaPr()); + hfTrackCovLfDau0(trackParCovBach.getSigmaY2(), trackParCovBach.getSigmaZY(), trackParCovBach.getSigmaZ2(), + trackParCovBach.getSigmaSnpY(), trackParCovBach.getSigmaSnpZ(), + trackParCovBach.getSigmaSnp2(), trackParCovBach.getSigmaTglY(), trackParCovBach.getSigmaTglZ(), + trackParCovBach.getSigmaTglSnp(), trackParCovBach.getSigmaTgl2(), + trackParCovBach.getSigma1PtY(), trackParCovBach.getSigma1PtZ(), trackParCovBach.getSigma1PtSnp(), + trackParCovBach.getSigma1PtTgl(), trackParCovBach.getSigma1Pt2()); + // add trackBach.globalIndex() to a list + // to keep memory of the pions filled in the table and avoid refilling them if they are paired to another Jpsi candidate + // and keep track of their index in hfTrackLfDau0 for McRec purposes + selectedTracksBach[trackBach.globalIndex()] = hfTrackLfDau0.lastIndex(); + } + + // fill daughter tracks table + // if information on track already stored, go to next track + if (!selectedTracksBach2.count(trackBach2.globalIndex())) { + hfTrackLfDau1(trackBach2.globalIndex(), indexHfReducedCollision, + trackBach2ParCov.getX(), trackBach2ParCov.getAlpha(), + trackBach2ParCov.getY(), trackBach2ParCov.getZ(), trackBach2ParCov.getSnp(), + trackBach2ParCov.getTgl(), trackBach2ParCov.getQ2Pt(), + trackBach2.itsNCls(), trackBach2.tpcNClsCrossedRows(), trackBach2.tpcChi2NCl(), + trackBach2.hasTPC(), trackBach2.hasTOF(), + trackBach2.tpcNSigmaPi(), trackBach2.tofNSigmaPi(), + trackBach2.tpcNSigmaKa(), trackBach2.tofNSigmaKa(), + trackBach2.tpcNSigmaPr(), trackBach2.tofNSigmaPr()); + hfTrackCovLfDau1(trackBach2ParCov.getSigmaY2(), trackBach2ParCov.getSigmaZY(), trackBach2ParCov.getSigmaZ2(), + trackBach2ParCov.getSigmaSnpY(), trackBach2ParCov.getSigmaSnpZ(), + trackBach2ParCov.getSigmaSnp2(), trackBach2ParCov.getSigmaTglY(), trackBach2ParCov.getSigmaTglZ(), + trackBach2ParCov.getSigmaTglSnp(), trackBach2ParCov.getSigmaTgl2(), + trackBach2ParCov.getSigma1PtY(), trackBach2ParCov.getSigma1PtZ(), trackBach2ParCov.getSigma1PtSnp(), + trackBach2ParCov.getSigma1PtTgl(), trackBach2ParCov.getSigma1Pt2()); + // add trackBach2.globalIndex() to a list + // to keep memory of the pions filled in the table and avoid refilling them if they are paired to another Jpsi candidate + // and keep track of their index in hfTrackLfDau1 for McRec purposes + selectedTracksBach2[trackBach2.globalIndex()] = hfTrackLfDau1.lastIndex(); + } + + if constexpr (doMc) { + std::vector beautyHadDauTracks{}; + for (const auto& track : jPsiDauTracks) { + beautyHadDauTracks.push_back(track); + } + beautyHadDauTracks.push_back(trackBach); + fillMcRecoInfo(collision, particlesMc, beautyHadDauTracks, indexHfCandJpsi, std::array, 2>{selectedTracksBach, selectedTracksBach2}, indexCollisionMaxNumContrib); + } + fillHfCandJpsi = true; + } + } + } // kaon loop + if (fillHfCandJpsi) { // fill Jpsi table only once per Jpsi candidate + double invMassJpsi{0.}; + if (runJpsiToee) { + invMassJpsi = hfHelper.invMassJpsiToEE(candidate); + } else { + invMassJpsi = hfHelper.invMassJpsiToMuMu(candidate); + } + hfJpsi(trackPos.globalIndex(), trackNeg.globalIndex(), + indexHfReducedCollision, + candidate.xSecondaryVertex(), candidate.ySecondaryVertex(), candidate.zSecondaryVertex(), + invMassJpsi, + trackPosParCov.getX(), trackNegParCov.getX(), + trackPosParCov.getY(), trackNegParCov.getY(), + trackPosParCov.getZ(), trackNegParCov.getZ(), + trackPosParCov.getAlpha(), trackNegParCov.getAlpha(), + trackPosParCov.getSnp(), trackNegParCov.getSnp(), + trackPosParCov.getTgl(), trackNegParCov.getTgl(), + trackPosParCov.getQ2Pt(), trackNegParCov.getQ2Pt()); // Q/pT + hfRedJpsiCov(trackPosParCov.getSigmaY2(), trackNegParCov.getSigmaY2(), + trackPosParCov.getSigmaZY(), trackNegParCov.getSigmaZY(), + trackPosParCov.getSigmaZ2(), trackNegParCov.getSigmaZ2(), + trackPosParCov.getSigmaSnpY(), trackNegParCov.getSigmaSnpY(), + trackPosParCov.getSigmaSnpZ(), trackNegParCov.getSigmaSnpZ(), + trackPosParCov.getSigmaSnp2(), trackNegParCov.getSigmaSnp2(), + trackPosParCov.getSigmaTglY(), trackNegParCov.getSigmaTglY(), + trackPosParCov.getSigmaTglZ(), trackNegParCov.getSigmaTglZ(), + trackPosParCov.getSigmaTglSnp(), trackNegParCov.getSigmaTglSnp(), + trackPosParCov.getSigmaTgl2(), trackNegParCov.getSigmaTgl2(), + trackPosParCov.getSigma1PtY(), trackNegParCov.getSigma1PtY(), + trackPosParCov.getSigma1PtZ(), trackNegParCov.getSigma1PtZ(), + trackPosParCov.getSigma1PtSnp(), trackNegParCov.getSigma1PtSnp(), + trackPosParCov.getSigma1PtTgl(), trackNegParCov.getSigma1PtTgl(), + trackPosParCov.getSigma1Pt2(), trackNegParCov.getSigma1Pt2()); + fillHfReducedCollision = true; + } + } // candsJpsi loop + + registry.fill(HIST("hEvents"), 1 + Event::Processed); + if (!fillHfReducedCollision) { + registry.fill(HIST("hEvents"), 1 + Event::NoCharmHadPiSelected); + return; + } + registry.fill(HIST("hEvents"), 1 + Event::CharmHadPiSelected); + float centrality = -1.f; + uint16_t hfRejMap = hfEvSel.getHfCollisionRejectionMask(collision, centrality, ccdb, registry); + // fill collision table if it contains a J/Psi K pair at minimum + hfReducedCollision(collision.posX(), collision.posY(), collision.posZ(), collision.numContrib(), hfRejMap, bz); + hfReducedCollExtra(collision.covXX(), collision.covXY(), collision.covYY(), + collision.covXZ(), collision.covYZ(), collision.covZZ()); + // hfReducedCollCentrality(collision.centFT0C(), collision.centFT0M(), collision.trackOccupancyInTimeRange(), collision.ft0cOccupancyInTimeRange()); // TODO: add + // if constexpr (withQvec) { + // hfReducedQvector(collision.qvecFT0CRe(), collision.qvecFT0CIm(), collision.sumAmplFT0C(), + // collision.qvecFT0ARe(), collision.qvecFT0AIm(), collision.sumAmplFT0A(), + // collision.qvecFT0MRe(), collision.qvecFT0MIm(), collision.sumAmplFT0M(), + // collision.qvecTPCposRe(), collision.qvecTPCposIm(), collision.nTrkTPCpos(), + // collision.qvecTPCnegRe(), collision.qvecTPCnegIm(), collision.nTrkTPCneg(), + // collision.qvecTPCallRe(), collision.qvecTPCallIm(), collision.nTrkTPCall()); + // } + } + + void processJpsiKData(soa::Join const& collisions, + aod::HfCand2ProngWPid const& candsJpsi, + aod::TrackAssoc const& trackIndices, + TracksPidWithSel const& tracks, + aod::BCsWithTimestamps const& bcs) + { + // store configurables needed for B0 workflow + if (!isHfCandBhadConfigFilled) { + rowCandidateConfigBplus(invMassWindowJpsiHad.value); + isHfCandBhadConfigFilled = true; + } + + int zvtxColl{0}; + int sel8Coll{0}; + int zvtxAndSel8Coll{0}; + int zvtxAndSel8CollAndSoftTrig{0}; + int allSelColl{0}; + for (const auto& collision : collisions) { + o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + + auto thisCollId = collision.globalIndex(); + auto candsJpsiThisColl = candsJpsi.sliceBy(candsJpsiPerCollision, thisCollId); + auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); + runDataCreation(collision, candsJpsiThisColl, trackIdsThisCollision, tracks, tracks, -1, bcs); + } + // handle normalization by the right number of collisions + hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); + } + PROCESS_SWITCH(HfDataCreatorJpsiHadReduced, processJpsiKData, "Process J/Psi K without MC info", true); + + void processJpsiPhiData(soa::Join const& collisions, + aod::HfCand2ProngWPid const& candsJpsi, + aod::TrackAssoc const& trackIndices, + TracksPidWithSel const& tracks, + aod::BCsWithTimestamps const& bcs) + { + // store configurables needed for B0 workflow + if (!isHfCandBhadConfigFilled) { + rowCandidateConfigBs(invMassWindowJpsiHad.value); + isHfCandBhadConfigFilled = true; + } + + int zvtxColl{0}; + int sel8Coll{0}; + int zvtxAndSel8Coll{0}; + int zvtxAndSel8CollAndSoftTrig{0}; + int allSelColl{0}; + for (const auto& collision : collisions) { + o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + + auto thisCollId = collision.globalIndex(); + auto candsJpsiThisColl = candsJpsi.sliceBy(candsJpsiPerCollision, thisCollId); + auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); + runDataCreation(collision, candsJpsiThisColl, trackIdsThisCollision, tracks, tracks, -1, bcs); + } + // handle normalization by the right number of collisions + hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); + } + PROCESS_SWITCH(HfDataCreatorJpsiHadReduced, processJpsiPhiData, "Process J/Psi phi without MC info", false); + + void processJpsiKMc(CollisionsWCMcLabels const& collisions, + aod::HfCand2ProngWPid const& candsJpsi, + aod::TrackAssoc const& trackIndices, + TracksPidWithSelAndMc const& tracks, + aod::McParticles const& particlesMc, + aod::BCsWithTimestamps const& bcs, + McCollisions const&) + { + // store configurables needed for B+ workflow + if (!isHfCandBhadConfigFilled) { + rowCandidateConfigBplus(invMassWindowJpsiHad.value); + isHfCandBhadConfigFilled = true; + } + + int zvtxColl{0}; + int sel8Coll{0}; + int zvtxAndSel8Coll{0}; + int zvtxAndSel8CollAndSoftTrig{0}; + int allSelColl{0}; + for (const auto& collision : collisions) { + o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + + auto thisCollId = collision.globalIndex(); + auto candsJpsiThisColl = candsJpsi.sliceBy(candsJpsiPerCollision, thisCollId); + auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); + auto collsSameMcCollision = collisions.sliceBy(colPerMcCollision, collision.mcCollisionId()); + int64_t indexCollisionMaxNumContrib = getIndexCollisionMaxNumContrib(collsSameMcCollision); + runDataCreation(collision, candsJpsiThisColl, trackIdsThisCollision, tracks, particlesMc, indexCollisionMaxNumContrib, bcs); + } + // handle normalization by the right number of collisions + hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); + runMcGen(particlesMc); + } + PROCESS_SWITCH(HfDataCreatorJpsiHadReduced, processJpsiKMc, "Process J/Psi K with MC info", false); + + void processJpsiPhiMc(CollisionsWCMcLabels const& collisions, + aod::HfCand2ProngWPid const& candsJpsi, + aod::TrackAssoc const& trackIndices, + TracksPidWithSelAndMc const& tracks, + aod::McParticles const& particlesMc, + aod::BCsWithTimestamps const& bcs, + McCollisions const&) + { + // store configurables needed for B+ workflow + if (!isHfCandBhadConfigFilled) { + rowCandidateConfigBs(invMassWindowJpsiHad.value); + isHfCandBhadConfigFilled = true; + } + + int zvtxColl{0}; + int sel8Coll{0}; + int zvtxAndSel8Coll{0}; + int zvtxAndSel8CollAndSoftTrig{0}; + int allSelColl{0}; + for (const auto& collision : collisions) { + o2::hf_evsel::checkEvSel(collision, hfEvSel, zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl, ccdb, registry); + + auto thisCollId = collision.globalIndex(); + auto candsJpsiThisColl = candsJpsi.sliceBy(candsJpsiPerCollision, thisCollId); + auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, thisCollId); + auto collsSameMcCollision = collisions.sliceBy(colPerMcCollision, collision.mcCollisionId()); + int64_t indexCollisionMaxNumContrib = getIndexCollisionMaxNumContrib(collsSameMcCollision); + runDataCreation(collision, candsJpsiThisColl, trackIdsThisCollision, tracks, particlesMc, indexCollisionMaxNumContrib, bcs); + } + // handle normalization by the right number of collisions + hfCollisionCounter(collisions.tableSize(), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl); + runMcGen(particlesMc); + } + PROCESS_SWITCH(HfDataCreatorJpsiHadReduced, processJpsiPhiMc, "Process J/Psi phi with MC info", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} diff --git a/PWGHF/D2H/Tasks/CMakeLists.txt b/PWGHF/D2H/Tasks/CMakeLists.txt index 52019c9227e..53b22dfe969 100644 --- a/PWGHF/D2H/Tasks/CMakeLists.txt +++ b/PWGHF/D2H/Tasks/CMakeLists.txt @@ -29,11 +29,21 @@ o2physics_add_dpl_workflow(task-bplus-reduced PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(task-bplus-to-jpsi-k-reduced + SOURCES taskBplusToJpsiKReduced.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::MLCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(task-bs-reduced SOURCES taskBsReduced.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(task-bs-to-jpsi-phi-reduced + SOURCES taskBsToJpsiPhiReduced.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::MLCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(task-bs SOURCES taskBs.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore diff --git a/PWGHF/D2H/Tasks/taskBplusToJpsiKReduced.cxx b/PWGHF/D2H/Tasks/taskBplusToJpsiKReduced.cxx new file mode 100644 index 00000000000..680d7933c48 --- /dev/null +++ b/PWGHF/D2H/Tasks/taskBplusToJpsiKReduced.cxx @@ -0,0 +1,535 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file taskBplusToJpsiKReduced.cxx +/// \brief B+ → Jpsi K+ → (µ+ µ-) K+ analysis task +/// +/// \author Fabrizio Chinu , Università degli Studi and INFN Torino +/// \author Fabrizio Grosa , CERN + +#include "PWGHF/Core/DecayChannels.h" +#include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/HfMlResponseBplusToJpsiKReduced.h" +#include "PWGHF/Core/SelectorCuts.h" +#include "PWGHF/D2H/DataModel/ReducedDataModel.h" +#include "PWGHF/DataModel/CandidateReconstructionTables.h" +#include "PWGHF/DataModel/CandidateSelectionTables.h" +#include "PWGHF/Utils/utilsPid.h" + +#include "Common/Core/TrackSelectorPID.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include + +#include +#include +#include +#include +#include + +using namespace o2; +using namespace o2::aod; +using namespace o2::analysis; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::aod::pid_tpc_tof_utils; + +namespace o2::aod +{ +namespace hf_cand_bplustojpsik_lite +{ +DECLARE_SOA_COLUMN(PtJpsi, ptJpsi, float); //! Transverse momentum of Jpsi daughter candidate (GeV/c) +DECLARE_SOA_COLUMN(PtBach, ptBach, float); //! Transverse momentum of bachelor kaon (GeV/c) +// DECLARE_SOA_COLUMN(AbsEtaBach, absEtaBach, float); //! Absolute pseudorapidity of bachelor kaon +// DECLARE_SOA_COLUMN(ItsNClsBach, itsNClsBach, int); //! Number of ITS clusters of bachelor kaon +// DECLARE_SOA_COLUMN(TpcNClsCrossedRowsBach, tpcNClsCrossedRowsBach, int); //! Number of TPC crossed rows of prongs of bachelor kaon +// DECLARE_SOA_COLUMN(TpcChi2NClBach, tpcChi2NClBach, float); //! Maximum TPC chi2 of prongs of Jpsi-meson daughter candidate +// DECLARE_SOA_COLUMN(PtJpsiProngMin, ptJpsiProngMin, float); //! Minimum pT of prongs of Jpsi daughter candidate (GeV/c) +// DECLARE_SOA_COLUMN(AbsEtaJpsiProngMin, absEtaJpsiProngMin, float); //! Minimum absolute pseudorapidity of prongs of Jpsi daughter candidate +// DECLARE_SOA_COLUMN(ItsNClsJpsiProngMin, itsNClsJpsiProngMin, int); //! Minimum number of ITS clusters of prongs of Jpsi daughter candidate +// DECLARE_SOA_COLUMN(TpcNClsCrossedRowsJpsiProngMin, tpcNClsCrossedRowsJpsiProngMin, int); //! Minimum number of TPC crossed rows of prongs of Jpsi daughter candidate +// DECLARE_SOA_COLUMN(TpcChi2NClJpsiProngMax, tpcChi2NClJpsiProngMax, float); //! Maximum TPC chi2 of prongs of Jpsi daughter candidate +DECLARE_SOA_COLUMN(MJpsi, mJpsi, float); //! Invariant mass of Jpsi daughter candidates (GeV/c) +DECLARE_SOA_COLUMN(M, m, float); //! Invariant mass of candidate (GeV/c2) +DECLARE_SOA_COLUMN(Pt, pt, float); //! Transverse momentum of candidate (GeV/c) +DECLARE_SOA_COLUMN(PtGen, ptGen, float); //! Transverse momentum of candidate (GeV/c) +DECLARE_SOA_COLUMN(P, p, float); //! Momentum of candidate (GeV/c) +DECLARE_SOA_COLUMN(Y, y, float); //! Rapidity of candidate +DECLARE_SOA_COLUMN(Eta, eta, float); //! Pseudorapidity of candidate +DECLARE_SOA_COLUMN(Phi, phi, float); //! Azimuth angle of candidate +DECLARE_SOA_COLUMN(E, e, float); //! Energy of candidate (GeV) +DECLARE_SOA_COLUMN(NSigTpcKaBachelor, nSigTpcKaBachelor, float); //! TPC Nsigma separation for bachelor with kaon mass hypothesis +DECLARE_SOA_COLUMN(NSigTofKaBachelor, nSigTofKaBachelor, float); //! TOF Nsigma separation for bachelor with kaon mass hypothesis +DECLARE_SOA_COLUMN(NSigTpcTofKaBachelor, nSigTpcTofKaBachelor, float); //! Combined TPC and TOF Nsigma separation for bachelor with kaon mass hypothesis +DECLARE_SOA_COLUMN(NSigTpcMuJpsiDauPos, nSigTpcMuJpsiDauPos, float); //! TPC Nsigma separation for Jpsi DauPos with muon mass hypothesis +DECLARE_SOA_COLUMN(NSigTofMuJpsiDauPos, nSigTofMuJpsiDauPos, float); //! TOF Nsigma separation for Jpsi DauPos with muon mass hypothesis +DECLARE_SOA_COLUMN(NSigTpcTofMuJpsiDauPos, nSigTpcTofMuJpsiDauPos, float); //! Combined TPC and TOF Nsigma separation for Jpsi prong0 with muon mass hypothesis +DECLARE_SOA_COLUMN(NSigTpcMuJpsiDauNeg, nSigTpcMuJpsiDauNeg, float); //! TPC Nsigma separation for Jpsi DauNeg with muon mass hypothesis +DECLARE_SOA_COLUMN(NSigTofMuJpsiDauNeg, nSigTofMuJpsiDauNeg, float); //! TOF Nsigma separation for Jpsi DauNeg with muon mass hypothesis +DECLARE_SOA_COLUMN(NSigTpcTofMuJpsiDauNeg, nSigTpcTofMuJpsiDauNeg, float); //! Combined TPC and TOF Nsigma separation for Jpsi prong1 with muon mass hypothesis +DECLARE_SOA_COLUMN(DecayLength, decayLength, float); //! Decay length of candidate (cm) +DECLARE_SOA_COLUMN(DecayLengthXY, decayLengthXY, float); //! Transverse decay length of candidate (cm) +DECLARE_SOA_COLUMN(DecayLengthNormalised, decayLengthNormalised, float); //! Normalised decay length of candidate +DECLARE_SOA_COLUMN(DecayLengthXYNormalised, decayLengthXYNormalised, float); //! Normalised transverse decay length of candidate +DECLARE_SOA_COLUMN(CtXY, ctXY, float); //! Pseudo-proper decay length of candidate +DECLARE_SOA_COLUMN(ImpactParameterProduct, impactParameterProduct, float); //! Impact parameter product of B daughters +DECLARE_SOA_COLUMN(ImpactParameterProductJpsi, impactParameterProductJpsi, float); //! Impact parameter product of Jpsi daughters +DECLARE_SOA_COLUMN(ImpactParameterJpsiDauPos, impactParameterJpsiDauPos, float); //! Impact parameter of Jpsi daughter candidate +DECLARE_SOA_COLUMN(ImpactParameterJpsiDauNeg, impactParameterJpsiDauNeg, float); //! Impact parameter of Jpsi daughter candidate +DECLARE_SOA_COLUMN(ImpactParameterLfTrack0, impactParameterLfTrack0, float); //! Impact parameter of Phi daughter candidate +DECLARE_SOA_COLUMN(Cpa, cpa, float); //! Cosine pointing angle of candidate +DECLARE_SOA_COLUMN(CpaXY, cpaXY, float); //! Cosine pointing angle of candidate in transverse plane +DECLARE_SOA_COLUMN(CpaJpsi, cpaJpsi, float); //! Cosine pointing angle of Jpsi daughter candidate +DECLARE_SOA_COLUMN(CpaXYJpsi, cpaXYJpsi, float); //! Cosine pointing angle in transverse plane of Jpsi daughter candidate +DECLARE_SOA_COLUMN(MaxNormalisedDeltaIP, maxNormalisedDeltaIP, float); //! Maximum normalized difference between measured and expected impact parameter of candidate prongs +DECLARE_SOA_COLUMN(MlScoreSig, mlScoreSig, float); //! ML score for signal class +DECLARE_SOA_COLUMN(FlagWrongCollision, flagWrongCollision, int8_t); //! Flag for association with wrong collision +} // namespace hf_cand_bplustojpsik_lite + +DECLARE_SOA_TABLE(HfRedCandBpLites, "AOD", "HFREDCANDBPLITE", //! Table with some B+ properties + hf_cand_bplustojpsik_lite::M, + hf_cand_bplustojpsik_lite::Pt, + hf_cand_bplustojpsik_lite::Eta, + hf_cand_bplustojpsik_lite::Phi, + hf_cand_bplustojpsik_lite::Y, + hf_cand_bplustojpsik_lite::Cpa, + hf_cand_bplustojpsik_lite::CpaXY, + hf_cand::Chi2PCA, + hf_cand_bplustojpsik_lite::DecayLength, + hf_cand_bplustojpsik_lite::DecayLengthXY, + hf_cand_bplustojpsik_lite::DecayLengthNormalised, + hf_cand_bplustojpsik_lite::DecayLengthXYNormalised, + hf_cand_bplustojpsik_lite::CtXY, + hf_cand_bplustojpsik_lite::ImpactParameterProduct, + hf_cand_bplustojpsik_lite::ImpactParameterProductJpsi, + hf_cand_bplustojpsik_lite::MaxNormalisedDeltaIP, + hf_cand_bplustojpsik_lite::MlScoreSig, + // hf_sel_candidate_bplus::IsSelBplusToJpsiPi, + // Jpsi meson features + hf_cand_bplustojpsik_lite::MJpsi, + hf_cand_bplustojpsik_lite::PtJpsi, + hf_cand_bplustojpsik_lite::ImpactParameterJpsiDauPos, + hf_cand_bplustojpsik_lite::ImpactParameterJpsiDauNeg, + hf_cand_bplustojpsik_lite::ImpactParameterLfTrack0, + // hf_cand_bplustojpsik_lite::PtJpsiProngMin, + // hf_cand_bplustojpsik_lite::AbsEtaJpsiProngMin, + // hf_cand_bplustojpsik_lite::ItsNClsJpsiProngMin, + // hf_cand_bplustojpsik_lite::TpcNClsCrossedRowsJpsiProngMin, + // hf_cand_bplustojpsik_lite::TpcChi2NClJpsiProngMax, + // kaon features + hf_cand_bplustojpsik_lite::PtBach, + // hf_cand_bplustojpsik_lite::AbsEtaBach, + // hf_cand_bplustojpsik_lite::ItsNClsBach, + // hf_cand_bplustojpsik_lite::TpcNClsCrossedRowsBach, + // hf_cand_bplustojpsik_lite::TpcChi2NClBach, + hf_cand_bplustojpsik_lite::NSigTpcKaBachelor, + hf_cand_bplustojpsik_lite::NSigTofKaBachelor, + hf_cand_bplustojpsik_lite::NSigTpcTofKaBachelor, + // MC truth + hf_cand_bplus::FlagMcMatchRec, + hf_cand_bplus::ChannelMcMatchRec, + hf_cand_bplus::OriginMcRec, + hf_cand_bplustojpsik_lite::FlagWrongCollision, + hf_cand_bplustojpsik_lite::PtGen); + +// DECLARE_SOA_TABLE(HfRedBpMcCheck, "AOD", "HFREDBPMCCHECK", //! Table with MC decay type check +// hf_cand_2prong::FlagMcMatchRec, +// hf_cand_bplustojpsik_lite::FlagWrongCollision, +// hf_cand_bplustojpsik_lite::MJpsi, +// hf_cand_bplustojpsik_lite::PtJpsi, +// hf_cand_bplustojpsik_lite::M, +// hf_cand_bplustojpsik_lite::Pt, +// // hf_cand_bplustojpsik_lite::MlScoreSig, +// hf_bplus_mc::PdgCodeBeautyMother, +// hf_bplus_mc::PdgCodeCharmMother, +// hf_bplus_mc::PdgCodeDauPos, +// hf_bplus_mc::PdgCodeDauNeg, +// hf_bplus_mc::PdgCodeProng2); +} // namespace o2::aod + +// string definitions, used for histogram axis labels +const TString stringPt = "#it{p}_{T} (GeV/#it{c})"; +const TString stringPtJpsi = "#it{p}_{T}(Jpsi) (GeV/#it{c});"; +const TString bPlusCandTitle = "B+ candidates;"; +const TString entries = "entries"; +const TString bPlusCandMatch = "B+ candidates (matched);"; +const TString bPlusCandUnmatch = "B+ candidates (unmatched);"; +const TString mcParticleMatched = "MC particles (matched);"; + +/// B+ analysis task +struct HfTaskBplusToJpsiKReduced { + Produces hfRedCandBpLite; + // Produces hfRedBpMcCheck; + + Configurable selectionFlagBplus{"selectionFlagBplus", 1, "Selection Flag for Bplus"}; + Configurable yCandGenMax{"yCandGenMax", 0.5, "max. gen particle rapidity"}; + Configurable yCandRecoMax{"yCandRecoMax", 0.8, "max. cand. rapidity"}; + Configurable etaTrackMax{"etaTrackMax", 0.8, "max. track pseudo-rapidity"}; + Configurable ptTrackMin{"ptTrackMin", 0.1, "min. track transverse momentum"}; + Configurable fillBackground{"fillBackground", false, "Flag to enable filling of background histograms/sparses/tree (only MC)"}; + Configurable downSampleBkgFactor{"downSampleBkgFactor", 1., "Fraction of background candidates to keep for ML trainings"}; + Configurable ptMaxForDownSample{"ptMaxForDownSample", 10., "Maximum pt for the application of the downsampling factor"}; + // topological cuts + Configurable> binsPt{"binsPt", std::vector{hf_cuts_bplus_to_jpsi_k::vecBinsPt}, "pT bin limits"}; + Configurable> cuts{"cuts", {hf_cuts_bplus_to_jpsi_k::Cuts[0], hf_cuts_bplus_to_jpsi_k::NBinsPt, hf_cuts_bplus_to_jpsi_k::NCutVars, hf_cuts_bplus_to_jpsi_k::labelsPt, hf_cuts_bplus_to_jpsi_k::labelsCutVar}, "B+ candidate selection per pT bin"}; + // Enable PID + Configurable kaonPidMethod{"kaonPidMethod", PidMethod::TpcOrTof, "PID selection method for the bachelor kaon (PidMethod::NoPid: none, PidMethod::TpcOrTof: TPC or TOF, PidMethod::TpcAndTof: TPC and TOF)"}; + Configurable acceptPIDNotApplicable{"acceptPIDNotApplicable", true, "Switch to accept Status::NotApplicable [(NotApplicable for one detector) and (NotApplicable or Conditional for the other)] in PID selection"}; + // TPC PID + Configurable ptPidTpcMin{"ptPidTpcMin", 0.15, "Lower bound of track pT for TPC PID"}; + Configurable ptPidTpcMax{"ptPidTpcMax", 20., "Upper bound of track pT for TPC PID"}; + Configurable nSigmaTpcMax{"nSigmaTpcMax", 5., "Nsigma cut on TPC only"}; + Configurable nSigmaTpcCombinedMax{"nSigmaTpcCombinedMax", 5., "Nsigma cut on TPC combined with TOF"}; + // TOF PID + Configurable ptPidTofMin{"ptPidTofMin", 0.15, "Lower bound of track pT for TOF PID"}; + Configurable ptPidTofMax{"ptPidTofMax", 20., "Upper bound of track pT for TOF PID"}; + Configurable nSigmaTofMax{"nSigmaTofMax", 5., "Nsigma cut on TOF only"}; + Configurable nSigmaTofCombinedMax{"nSigmaTofCombinedMax", 5., "Nsigma cut on TOF combined with TPC"}; + // B+ ML inference + Configurable> binsPtBpMl{"binsPtBpMl", std::vector{hf_cuts_ml::vecBinsPt}, "pT bin limits for ML application"}; + Configurable> cutDirBpMl{"cutDirBpMl", std::vector{hf_cuts_ml::vecCutDir}, "Whether to reject score values greater or smaller than the threshold"}; + Configurable> cutsBpMl{"cutsBpMl", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; + Configurable nClassesBpMl{"nClassesBpMl", static_cast(hf_cuts_ml::NCutScores), "Number of classes in ML model"}; + Configurable> namesInputFeatures{"namesInputFeatures", std::vector{"feature1", "feature2"}, "Names of ML model input features"}; + // CCDB configuration + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable> modelPathsCCDB{"modelPathsCCDB", std::vector{"path_ccdb/BDT_BPLUS/"}, "Paths of models on CCDB"}; + Configurable> onnxFileNames{"onnxFileNames", std::vector{"ModelHandler_onnx_BPLUSToJPSIK.onnx"}, "ONNX file names for each pT bin (if not from CCDB full path)"}; + Configurable timestampCCDB{"timestampCCDB", -1, "timestamp of the ONNX file for ML model used to query in CCDB"}; + Configurable loadModelsFromCCDB{"loadModelsFromCCDB", false, "Flag to enable or disable the loading of models from CCDB"}; + + HfHelper hfHelper; + TrackSelectorKa selectorKaon; + o2::analysis::HfMlResponseBplusToJpsiKReduced hfMlResponse; + o2::ccdb::CcdbApi ccdbApi; + + using TracksKaon = soa::Join; + std::vector outputMl = {}; + + // Filter filterSelectCandidates = (aod::hf_sel_candidate_bplus::isSelBplusToJpsiPi >= selectionFlagBplus); + + HistogramRegistry registry{"registry"}; + + void init(InitContext&) + { + std::array processFuncData{doprocessData, doprocessDataWithBplusMl}; + if ((std::accumulate(processFuncData.begin(), processFuncData.end(), 0)) > 1) { + LOGP(fatal, "Only one process function for data can be enabled at a time."); + } + std::array processFuncMc{doprocessMc, doprocessMcWithBplusMl}; + if ((std::accumulate(processFuncMc.begin(), processFuncMc.end(), 0)) > 1) { + LOGP(fatal, "Only one process function for MC can be enabled at a time."); + } + + if (kaonPidMethod < 0 || kaonPidMethod >= PidMethod::NPidMethods) { + LOGP(fatal, "Invalid PID option in configurable, please set 0 (no PID), 1 (TPC or TOF), or 2 (TPC and TOF)"); + } + + if (kaonPidMethod != PidMethod::NoPid) { + selectorKaon.setRangePtTpc(ptPidTpcMin, ptPidTpcMax); + selectorKaon.setRangeNSigmaTpc(-nSigmaTpcMax, nSigmaTpcMax); + selectorKaon.setRangeNSigmaTpcCondTof(-nSigmaTpcCombinedMax, nSigmaTpcCombinedMax); + selectorKaon.setRangePtTof(ptPidTofMin, ptPidTofMax); + selectorKaon.setRangeNSigmaTof(-nSigmaTofMax, nSigmaTofMax); + selectorKaon.setRangeNSigmaTofCondTpc(-nSigmaTofCombinedMax, nSigmaTofCombinedMax); + } + + const AxisSpec axisMassBplus{150, 4.5, 6.0}; + const AxisSpec axisMassJpsi{600, 2.8f, 3.4f}; + const AxisSpec axisPtProng{100, 0., 10.}; + const AxisSpec axisImpactPar{200, -0.05, 0.05}; + const AxisSpec axisPtJpsi{100, 0., 50.}; + const AxisSpec axisRapidity{100, -2., 2.}; + const AxisSpec axisPtB{(std::vector)binsPt, "#it{p}_{T}^{B^{+}} (GeV/#it{c})"}; + const AxisSpec axisPtKa{100, 0.f, 10.f}; + + registry.add("hMass", bPlusCandTitle + "inv. mass J/#Psi K^{+} (GeV/#it{c}^{2});" + stringPt, {HistType::kTH2F, {axisMassBplus, axisPtB}}); + registry.add("hMassJpsi", bPlusCandTitle + "inv. mass #mu^{+}#mu^{#minus} (GeV/#it{c}^{2});" + stringPt, {HistType::kTH2F, {axisMassJpsi, axisPtJpsi}}); + registry.add("hd0K", bPlusCandTitle + "Kaon DCAxy to prim. vertex (cm);" + stringPt, {HistType::kTH2F, {axisImpactPar, axisPtKa}}); + + // histograms processMC + if (doprocessMc || doprocessMcWithBplusMl) { + registry.add("hPtJpsiGen", mcParticleMatched + "J/#Psi #it{p}_{T}^{gen} (GeV/#it{c}); B^{+} " + stringPt, {HistType::kTH2F, {axisPtProng, axisPtB}}); + registry.add("hPtKGen", mcParticleMatched + "Kaon #it{p}_{T}^{gen} (GeV/#it{c}); B^{+} " + stringPt, {HistType::kTH2F, {axisPtProng, axisPtB}}); + registry.add("hYGenWithProngsInAcceptance", mcParticleMatched + "Kaon #it{p}_{T}^{gen} (GeV/#it{c}); B^{+} " + stringPt, {HistType::kTH2F, {axisPtProng, axisRapidity}}); + registry.add("hMassRecSig", bPlusCandMatch + "inv. mass J/#Psi K^{+} (GeV/#it{c}^{2}); B^{+} " + stringPt, {HistType::kTH2F, {axisMassBplus, axisPtB}}); + registry.add("hMassJpsiRecSig", bPlusCandMatch + "inv. mass #mu^{+}#mu^{#minus} (GeV/#it{c}^{2}); J/#Psi " + stringPt, {HistType::kTH2F, {axisMassJpsi, axisPtJpsi}}); + registry.add("hd0KRecSig", bPlusCandMatch + "Kaon DCAxy to prim. vertex (cm); K^{+} " + stringPt, {HistType::kTH2F, {axisImpactPar, axisPtKa}}); + registry.add("hMassRecBg", bPlusCandUnmatch + "inv. mass J/#Psi K^{+} (GeV/#it{c}^{2}); B^{+} " + stringPt, {HistType::kTH2F, {axisMassBplus, axisPtB}}); + registry.add("hMassJpsiRecBg", bPlusCandUnmatch + "inv. mass #mu^{+}#mu^{#minus} (GeV/#it{c}^{2}); J/#Psi " + stringPt, {HistType::kTH2F, {axisMassJpsi, axisPtJpsi}}); + registry.add("hd0KRecBg", bPlusCandMatch + "Kaon DCAxy to prim. vertex (cm); K^{+} " + stringPt, {HistType::kTH2F, {axisImpactPar, axisPtKa}}); + } + + if (doprocessDataWithBplusMl || doprocessMcWithBplusMl) { + hfMlResponse.configure(binsPtBpMl, cutsBpMl, cutDirBpMl, nClassesBpMl); + if (loadModelsFromCCDB) { + ccdbApi.init(ccdbUrl); + hfMlResponse.setModelPathsCCDB(onnxFileNames, ccdbApi, modelPathsCCDB, timestampCCDB); + } else { + hfMlResponse.setModelPathsLocal(onnxFileNames); + } + hfMlResponse.cacheInputFeaturesIndices(namesInputFeatures); + hfMlResponse.init(); + } + } + + /// Selection of B+ daughter in geometrical acceptance + /// \param etaProng is the pseudorapidity of B+ prong + /// \param ptProng is the pT of B+ prong + /// \return true if prong is in geometrical acceptance + template + bool isProngInAcceptance(const T& etaProng, const T& ptProng) + { + return std::abs(etaProng) <= etaTrackMax && ptProng >= ptTrackMin; + } + + /// Fill candidate information at reconstruction level + /// \param doMc is the flag to enable the filling with MC information + /// \param withBplusMl is the flag to enable the filling with ML scores for the B+ candidate + /// \param candidate is the B+ candidate + /// \param candidatesJpsi is the table with Jpsi candidates + template + void fillCand(Cand const& candidate, + aod::HfRedJpsis const& /*candidatesJpsi*/, + aod::HfRedBach0Tracks const&) + { + auto ptCandBplus = candidate.pt(); + auto invMassBplus = hfHelper.invMassBplusToJpsiK(candidate); + auto candJpsi = candidate.template jpsi_as(); + auto candKa = candidate.template bachKa_as(); + auto ptJpsi = candidate.ptProng0(); + auto invMassJpsi = candJpsi.m(); + uint8_t statusBplus = 0; + + int8_t flagMcMatchRec{0}, channelMcMatchRec{0}, flagWrongCollision{0}; + bool isSignal = false; + if constexpr (doMc) { + flagMcMatchRec = candidate.flagMcMatchRec(); + channelMcMatchRec = candidate.channelMcMatchRec(); + flagWrongCollision = candidate.flagWrongCollision(); + isSignal = std::abs(flagMcMatchRec) == o2::hf_decay::hf_cand_beauty::BplusToJpsiK; + } + + SETBIT(statusBplus, SelectionStep::RecoSkims); + if (hfHelper.selectionBplusToJpsiKTopol(candidate, cuts, binsPt)) { + SETBIT(statusBplus, SelectionStep::RecoTopol); + } else if (selectionFlagBplus >= BIT(SelectionStep::RecoTopol) * 2 - 1) { + return; + } + // track-level PID selection + // auto trackKa = candidate.template prong1_as(); + if (kaonPidMethod == PidMethod::TpcOrTof || kaonPidMethod == PidMethod::TpcAndTof) { + int pidTrackKa{TrackSelectorPID::Status::NotApplicable}; + if (kaonPidMethod == PidMethod::TpcOrTof) { + pidTrackKa = selectorKaon.statusTpcOrTof(candKa); + } else if (kaonPidMethod == PidMethod::TpcAndTof) { + pidTrackKa = selectorKaon.statusTpcAndTof(candKa); + } + if (hfHelper.selectionBplusToJpsiKPid(pidTrackKa, acceptPIDNotApplicable.value)) { + // LOGF(info, "B+ candidate selection failed at PID selection"); + SETBIT(statusBplus, SelectionStep::RecoPID); + } else if (selectionFlagBplus >= BIT(SelectionStep::RecoPID) * 2 - 1) { + return; + } + } + + float candidateMlScoreSig = -1; + if constexpr (withBplusMl) { + // B+ ML selections + std::vector inputFeatures = hfMlResponse.getInputFeatures(candidate, candKa); + if (hfMlResponse.isSelectedMl(inputFeatures, ptCandBplus, outputMl)) { + SETBIT(statusBplus, SelectionStep::RecoMl); + } else if (selectionFlagBplus >= BIT(SelectionStep::RecoMl) * 2 - 1) { + return; + } + candidateMlScoreSig = outputMl[1]; + } + + registry.fill(HIST("hMass"), invMassBplus, ptCandBplus); + registry.fill(HIST("hMassJpsi"), invMassJpsi, candidate.ptProng0()); + registry.fill(HIST("hd0K"), candidate.impactParameter1(), candidate.ptProng1()); + if constexpr (doMc) { + if (isSignal) { + registry.fill(HIST("hMassRecSig"), invMassBplus, ptCandBplus); + registry.fill(HIST("hMassJpsiRecSig"), invMassJpsi, candidate.ptProng0()); + registry.fill(HIST("hd0KRecSig"), candidate.impactParameter1(), candidate.ptProng1()); + } else if (fillBackground) { + registry.fill(HIST("hMassRecBg"), invMassBplus, ptCandBplus); + registry.fill(HIST("hMassJpsiRecBg"), invMassJpsi, candidate.ptProng0()); + registry.fill(HIST("hd0KRecBg"), candidate.impactParameter1(), candidate.ptProng1()); + } + } + + float pseudoRndm = ptJpsi * 1000. - static_cast(ptJpsi * 1000); + if (ptCandBplus >= ptMaxForDownSample || pseudoRndm < downSampleBkgFactor) { + float ptMother = -1.; + if constexpr (doMc) { + ptMother = candidate.ptMother(); + } + + hfRedCandBpLite( + // B+ - meson features + invMassBplus, + ptCandBplus, + candidate.eta(), + candidate.phi(), + hfHelper.yBplus(candidate), + candidate.cpa(), + candidate.cpaXY(), + candidate.chi2PCA(), + candidate.decayLength(), + candidate.decayLengthXY(), + candidate.decayLengthNormalised(), + candidate.decayLengthXYNormalised(), + candidate.ctXY(std::array{o2::constants::physics::MassMuon, o2::constants::physics::MassMuon, o2::constants::physics::MassKPlus}), + candidate.impactParameterProduct(), + candidate.impactParameterProductJpsi(), + candidate.maxNormalisedDeltaIP(), + candidateMlScoreSig, + // J/Psi features + invMassJpsi, + ptJpsi, + candidate.impactParameter0(), + candidate.impactParameter1(), + candidate.impactParameter2(), + // candJpsi.ptProngMin(), + // candJpsi.absEtaProngMin(), + // candJpsi.itsNClsProngMin(), + // candJpsi.tpcNClsCrossedRowsProngMin(), + // candJpsi.tpcChi2NClProngMax(), + // kaon features + candidate.ptProng1(), + // std::abs(RecoDecay::eta(candKa.pVector())), + // candKa.itsNCls(), + // candKa.tpcNClsCrossedRows(), + // candKa.tpcChi2NCl(), + candKa.tpcNSigmaKa(), + candKa.tofNSigmaKa(), + candKa.tpcTofNSigmaKa(), + // MC truth + flagMcMatchRec, + channelMcMatchRec, + isSignal, + flagWrongCollision, + ptMother); + } + } + + /// Fill particle histograms (gen MC truth) + void fillCandMcGen(aod::HfMcGenRedBps::iterator const& particle) + { + auto ptParticle = particle.ptTrack(); + auto yParticle = particle.yTrack(); + if (yCandGenMax >= 0. && std::abs(yParticle) > yCandGenMax) { + return; + } + std::array ptProngs = {particle.ptProng0(), particle.ptProng1()}; + std::array etaProngs = {particle.etaProng0(), particle.etaProng1()}; + bool prongsInAcc = isProngInAcceptance(etaProngs[0], ptProngs[0]) && isProngInAcceptance(etaProngs[1], ptProngs[1]); + + registry.fill(HIST("hPtJpsiGen"), ptProngs[0], ptParticle); + registry.fill(HIST("hPtKGen"), ptProngs[1], ptParticle); + + // generated B+ with daughters in geometrical acceptance + if (prongsInAcc) { + registry.fill(HIST("hYGenWithProngsInAcceptance"), ptParticle, yParticle); + } + } + + // Process functions + void processData(aod::HfRedCandBplusToJpsiK const& candidates, + aod::HfRedJpsis const& candidatesJpsi, + aod::HfRedBach0Tracks const& kaonTracks) + { + for (const auto& candidate : candidates) { + if (yCandRecoMax >= 0. && std::abs(hfHelper.yBplus(candidate)) > yCandRecoMax) { + continue; + } + fillCand(candidate, candidatesJpsi, kaonTracks); + } // candidate loop + } // processData + PROCESS_SWITCH(HfTaskBplusToJpsiKReduced, processData, "Process data without ML for B+", true); + + void processDataWithBplusMl(aod::HfRedCandBplusToJpsiK const& candidates, + aod::HfRedJpsis const& candidatesJpsi, + aod::HfRedBach0Tracks const& kaonTracks) + { + for (const auto& candidate : candidates) { + if (yCandRecoMax >= 0. && std::abs(hfHelper.yBplus(candidate)) > yCandRecoMax) { + continue; + } + fillCand(candidate, candidatesJpsi, kaonTracks); + } // candidate loop + } // processDataWithBplusMl + PROCESS_SWITCH(HfTaskBplusToJpsiKReduced, processDataWithBplusMl, "Process data with ML for B+", false); + + void processMc(soa::Join const& candidates, + aod::HfMcGenRedBps const& mcParticles, + aod::HfRedJpsis const& candidatesJpsi, + aod::HfRedBach0Tracks const& kaonTracks) + { + // MC rec + for (const auto& candidate : candidates) { + if (yCandRecoMax >= 0. && std::abs(hfHelper.yBplus(candidate)) > yCandRecoMax) { + continue; + } + fillCand(candidate, candidatesJpsi, kaonTracks); + } // rec + + // MC gen. level + for (const auto& particle : mcParticles) { + fillCandMcGen(particle); + } // gen + } // processMc + PROCESS_SWITCH(HfTaskBplusToJpsiKReduced, processMc, "Process MC without ML for B+", false); + + void processMcWithBplusMl(soa::Join const& candidates, + aod::HfMcGenRedBps const& mcParticles, + aod::HfRedJpsis const& candidatesJpsi, + aod::HfRedBach0Tracks const& kaonTracks) + { + // MC rec + for (const auto& candidate : candidates) { + if (yCandRecoMax >= 0. && std::abs(hfHelper.yBplus(candidate)) > yCandRecoMax) { + continue; + } + fillCand(candidate, candidatesJpsi, kaonTracks); + } // rec + + // MC gen. level + for (const auto& particle : mcParticles) { + fillCandMcGen(particle); + } // gen + } // processMcWithBplusMl + PROCESS_SWITCH(HfTaskBplusToJpsiKReduced, processMcWithBplusMl, "Process MC with ML for B+", false); + +}; // struct + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} diff --git a/PWGHF/D2H/Tasks/taskBsToJpsiPhiReduced.cxx b/PWGHF/D2H/Tasks/taskBsToJpsiPhiReduced.cxx new file mode 100644 index 00000000000..90ce04a9cb7 --- /dev/null +++ b/PWGHF/D2H/Tasks/taskBsToJpsiPhiReduced.cxx @@ -0,0 +1,582 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file taskBsToJpsiPhiReduced.cxx +/// \brief Bs → Jpsi phi → (µ+ µ-) (K+K-) analysis task +/// +/// \author Fabrizio Chinu , Università degli Studi and INFN Torino +/// \author Fabrizio Grosa , CERN + +#include "PWGHF/Core/DecayChannels.h" +#include "PWGHF/Core/HfHelper.h" +#include "PWGHF/Core/HfMlResponseBsToJpsiPhiReduced.h" +#include "PWGHF/Core/SelectorCuts.h" +#include "PWGHF/D2H/DataModel/ReducedDataModel.h" +#include "PWGHF/DataModel/CandidateReconstructionTables.h" +#include "PWGHF/DataModel/CandidateSelectionTables.h" +#include "PWGHF/Utils/utilsPid.h" + +#include "Common/Core/RecoDecay.h" +#include "Common/Core/TrackSelectorPID.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include + +#include +#include +#include +#include +#include + +using namespace o2; +using namespace o2::aod; +using namespace o2::analysis; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::aod::pid_tpc_tof_utils; + +namespace o2::aod +{ +namespace hf_cand_bstojpsiphi_lite +{ +DECLARE_SOA_COLUMN(PtJpsi, ptJpsi, float); //! Transverse momentum of Jpsi daughter candidate (GeV/c) +DECLARE_SOA_COLUMN(PtBach0, ptBach0, float); //! Transverse momentum of bachelor kaon(<- phi) (GeV/c) +DECLARE_SOA_COLUMN(PtBach1, ptBach1, float); //! Transverse momentum of bachelor kaon(<- phi) (GeV/c) +// DECLARE_SOA_COLUMN(AbsEtaBach, absEtaBach, float); //! Absolute pseudorapidity of bachelor kaon +// DECLARE_SOA_COLUMN(ItsNClsBach, itsNClsBach, int); //! Number of ITS clusters of bachelor kaon +// DECLARE_SOA_COLUMN(TpcNClsCrossedRowsBach, tpcNClsCrossedRowsBach, int); //! Number of TPC crossed rows of prongs of bachelor kaon +// DECLARE_SOA_COLUMN(TpcChi2NClBach, tpcChi2NClBach, float); //! Maximum TPC chi2 of prongs of Jpsi-meson daughter candidate +// DECLARE_SOA_COLUMN(PtJpsiProngMin, ptJpsiProngMin, float); //! Minimum pT of prongs of Jpsi daughter candidate (GeV/c) +// DECLARE_SOA_COLUMN(AbsEtaJpsiProngMin, absEtaJpsiProngMin, float); //! Minimum absolute pseudorapidity of prongs of Jpsi daughter candidate +// DECLARE_SOA_COLUMN(ItsNClsJpsiProngMin, itsNClsJpsiProngMin, int); //! Minimum number of ITS clusters of prongs of Jpsi daughter candidate +// DECLARE_SOA_COLUMN(TpcNClsCrossedRowsJpsiProngMin, tpcNClsCrossedRowsJpsiProngMin, int); //! Minimum number of TPC crossed rows of prongs of Jpsi daughter candidate +// DECLARE_SOA_COLUMN(TpcChi2NClJpsiProngMax, tpcChi2NClJpsiProngMax, float); //! Maximum TPC chi2 of prongs of Jpsi daughter candidate +DECLARE_SOA_COLUMN(MJpsi, mJpsi, float); //! Invariant mass of Jpsi daughter candidates (GeV/c) +DECLARE_SOA_COLUMN(MPhi, mPhi, float); //! Invariant mass of phi daughter candidates (GeV/c) +DECLARE_SOA_COLUMN(M, m, float); //! Invariant mass of candidate (GeV/c2) +DECLARE_SOA_COLUMN(Pt, pt, float); //! Transverse momentum of candidate (GeV/c) +DECLARE_SOA_COLUMN(PtGen, ptGen, float); //! Transverse momentum of candidate (GeV/c) +DECLARE_SOA_COLUMN(P, p, float); //! Momentum of candidate (GeV/c) +DECLARE_SOA_COLUMN(Y, y, float); //! Rapidity of candidate +DECLARE_SOA_COLUMN(Eta, eta, float); //! Pseudorapidity of candidate +DECLARE_SOA_COLUMN(Phi, phi, float); //! Azimuth angle of candidate +DECLARE_SOA_COLUMN(E, e, float); //! Energy of candidate (GeV) +DECLARE_SOA_COLUMN(NSigTpcKaBachelor0, nSigTpcKaBachelor0, float); //! TPC Nsigma separation for bachelor 0 with kaon mass hypothesis +DECLARE_SOA_COLUMN(NSigTofKaBachelor0, nSigTofKaBachelor0, float); //! TOF Nsigma separation for bachelor 0 with kaon mass hypothesis +DECLARE_SOA_COLUMN(NSigTpcTofKaBachelor0, nSigTpcTofKaBachelor0, float); //! Combined TPC and TOF Nsigma separation for bachelor 0 with kaon mass hypothesis +DECLARE_SOA_COLUMN(NSigTpcKaBachelor1, nSigTpcKaBachelor1, float); //! TPC Nsigma separation for bachelor 1 with kaon mass hypothesis +DECLARE_SOA_COLUMN(NSigTofKaBachelor1, nSigTofKaBachelor1, float); //! TOF Nsigma separation for bachelor 1 with kaon mass hypothesis +DECLARE_SOA_COLUMN(NSigTpcTofKaBachelor1, nSigTpcTofKaBachelor1, float); //! Combined TPC and TOF Nsigma separation for bachelor 1 with kaon mass hypothesis +DECLARE_SOA_COLUMN(NSigTpcMuJpsiDauPos, nSigTpcMuJpsiDauPos, float); //! TPC Nsigma separation for Jpsi DauPos with muon mass hypothesis +DECLARE_SOA_COLUMN(NSigTofMuJpsiDauPos, nSigTofMuJpsiDauPos, float); //! TOF Nsigma separation for Jpsi DauPos with muon mass hypothesis +DECLARE_SOA_COLUMN(NSigTpcTofMuJpsiDauPos, nSigTpcTofMuJpsiDauPos, float); //! Combined TPC and TOF Nsigma separation for Jpsi prong0 with muon mass hypothesis +DECLARE_SOA_COLUMN(NSigTpcMuJpsiDauNeg, nSigTpcMuJpsiDauNeg, float); //! TPC Nsigma separation for Jpsi DauNeg with muon mass hypothesis +DECLARE_SOA_COLUMN(NSigTofMuJpsiDauNeg, nSigTofMuJpsiDauNeg, float); //! TOF Nsigma separation for Jpsi DauNeg with muon mass hypothesis +DECLARE_SOA_COLUMN(NSigTpcTofMuJpsiDauNeg, nSigTpcTofMuJpsiDauNeg, float); //! Combined TPC and TOF Nsigma separation for Jpsi prong1 with muon mass hypothesis +DECLARE_SOA_COLUMN(DecayLength, decayLength, float); //! Decay length of candidate (cm) +DECLARE_SOA_COLUMN(DecayLengthXY, decayLengthXY, float); //! Transverse decay length of candidate (cm) +DECLARE_SOA_COLUMN(DecayLengthNormalised, decayLengthNormalised, float); //! Normalised decay length of candidate +DECLARE_SOA_COLUMN(DecayLengthXYNormalised, decayLengthXYNormalised, float); //! Normalised transverse decay length of candidate +DECLARE_SOA_COLUMN(CtXY, ctXY, float); //! Pseudo-proper decay length of candidate +DECLARE_SOA_COLUMN(ImpactParameterProduct, impactParameterProduct, float); //! Impact parameter product of B daughters +DECLARE_SOA_COLUMN(ImpactParameterProductJpsi, impactParameterProductJpsi, float); //! Impact parameter product of Jpsi daughters +DECLARE_SOA_COLUMN(ImpactParameterProductPhi, impactParameterProductPhi, float); //! Impact parameter product of Phi daughters +DECLARE_SOA_COLUMN(ImpactParameterJpsiDauPos, impactParameterJpsiDauPos, float); //! Impact parameter of Jpsi daughter candidate +DECLARE_SOA_COLUMN(ImpactParameterJpsiDauNeg, impactParameterJpsiDauNeg, float); //! Impact parameter of Jpsi daughter candidate +DECLARE_SOA_COLUMN(ImpactParameterLfTrack0, impactParameterLfTrack0, float); //! Impact parameter of Phi daughter candidate +DECLARE_SOA_COLUMN(ImpactParameterLfTrack1, impactParameterLfTrack1, float); //! Impact parameter of Phi daughter candidate +DECLARE_SOA_COLUMN(Cpa, cpa, float); //! Cosine pointing angle of candidate +DECLARE_SOA_COLUMN(CpaXY, cpaXY, float); //! Cosine pointing angle of candidate in transverse plane +DECLARE_SOA_COLUMN(CpaJpsi, cpaJpsi, float); //! Cosine pointing angle of Jpsi daughter candidate +DECLARE_SOA_COLUMN(CpaXYJpsi, cpaXYJpsi, float); //! Cosine pointing angle in transverse plane of Jpsi daughter candidate +DECLARE_SOA_COLUMN(MaxNormalisedDeltaIP, maxNormalisedDeltaIP, float); //! Maximum normalized difference between measured and expected impact parameter of candidate prongs +DECLARE_SOA_COLUMN(MlScoreSig, mlScoreSig, float); //! ML score for signal class +DECLARE_SOA_COLUMN(FlagWrongCollision, flagWrongCollision, int8_t); //! Flag for association with wrong collision +} // namespace hf_cand_bstojpsiphi_lite + +DECLARE_SOA_TABLE(HfRedCandBsLites, "AOD", "HFREDCANDBSLITE", //! Table with some Bs properties + hf_cand_bstojpsiphi_lite::M, + hf_cand_bstojpsiphi_lite::Pt, + hf_cand_bstojpsiphi_lite::Eta, + hf_cand_bstojpsiphi_lite::Phi, + hf_cand_bstojpsiphi_lite::Y, + hf_cand_bstojpsiphi_lite::Cpa, + hf_cand_bstojpsiphi_lite::CpaXY, + hf_cand::Chi2PCA, + hf_cand_bstojpsiphi_lite::DecayLength, + hf_cand_bstojpsiphi_lite::DecayLengthXY, + hf_cand_bstojpsiphi_lite::DecayLengthNormalised, + hf_cand_bstojpsiphi_lite::DecayLengthXYNormalised, + hf_cand_bstojpsiphi_lite::CtXY, + hf_cand_bstojpsiphi_lite::ImpactParameterProduct, + hf_cand_bstojpsiphi_lite::ImpactParameterProductJpsi, + hf_cand_bstojpsiphi_lite::ImpactParameterProductPhi, + hf_cand_bstojpsiphi_lite::MaxNormalisedDeltaIP, + hf_cand_bstojpsiphi_lite::MlScoreSig, + // hf_sel_candidate_bplus::IsSelBsToJpsiPi, + // Jpsi meson features + hf_cand_bstojpsiphi_lite::MJpsi, + hf_cand_bstojpsiphi_lite::PtJpsi, + hf_cand_bstojpsiphi_lite::MPhi, + hf_cand_bstojpsiphi_lite::ImpactParameterJpsiDauPos, + hf_cand_bstojpsiphi_lite::ImpactParameterJpsiDauNeg, + hf_cand_bstojpsiphi_lite::ImpactParameterLfTrack0, + hf_cand_bstojpsiphi_lite::ImpactParameterLfTrack1, + // hf_cand_bstojpsiphi_lite::PtJpsiProngMin, + // hf_cand_bstojpsiphi_lite::AbsEtaJpsiProngMin, + // hf_cand_bstojpsiphi_lite::ItsNClsJpsiProngMin, + // hf_cand_bstojpsiphi_lite::TpcNClsCrossedRowsJpsiProngMin, + // hf_cand_bstojpsiphi_lite::TpcChi2NClJpsiProngMax, + // kaon features + hf_cand_bstojpsiphi_lite::PtBach0, + // hf_cand_bstojpsiphi_lite::AbsEtaBach0, + // hf_cand_bstojpsiphi_lite::ItsNClsBach0, + // hf_cand_bstojpsiphi_lite::TpcNClsCrossedRowsBach0, + // hf_cand_bstojpsiphi_lite::TpcChi2NClBach0, + hf_cand_bstojpsiphi_lite::NSigTpcKaBachelor0, + hf_cand_bstojpsiphi_lite::NSigTofKaBachelor0, + hf_cand_bstojpsiphi_lite::NSigTpcTofKaBachelor0, + hf_cand_bstojpsiphi_lite::PtBach1, + // hf_cand_bstojpsiphi_lite::AbsEtaBach1, + // hf_cand_bstojpsiphi_lite::ItsNClsBach1, + // hf_cand_bstojpsiphi_lite::TpcNClsCrossedRowsBach1, + // hf_cand_bstojpsiphi_lite::TpcChi2NClBach1, + hf_cand_bstojpsiphi_lite::NSigTpcKaBachelor1, + hf_cand_bstojpsiphi_lite::NSigTofKaBachelor1, + hf_cand_bstojpsiphi_lite::NSigTpcTofKaBachelor1, + // MC truth + hf_cand_bs::FlagMcMatchRec, + hf_cand_bs::ChannelMcMatchRec, + hf_cand_bs::OriginMcRec, + hf_cand_bstojpsiphi_lite::FlagWrongCollision, + hf_cand_bstojpsiphi_lite::PtGen); + +// DECLARE_SOA_TABLE(HfRedBsMcCheck, "AOD", "HFREDBPMCCHECK", //! Table with MC decay type check +// hf_cand_2prong::FlagMcMatchRec, +// hf_cand_bstojpsiphi_lite::FlagWrongCollision, +// hf_cand_bstojpsiphi_lite::MJpsi, +// hf_cand_bstojpsiphi_lite::PtJpsi, +// hf_cand_bstojpsiphi_lite::M, +// hf_cand_bstojpsiphi_lite::Pt, +// // hf_cand_bstojpsiphi_lite::MlScoreSig, +// hf_bplus_mc::PdgCodeBeautyMother, +// hf_bplus_mc::PdgCodeCharmMother, +// hf_bplus_mc::PdgCodeDauPos, +// hf_bplus_mc::PdgCodeDauNeg, +// hf_bplus_mc::PdgCodeProng2); +} // namespace o2::aod + +// string definitions, used for histogram axis labels +const TString stringPt = "#it{p}_{T} (GeV/#it{c})"; +const TString stringPtJpsi = "#it{p}_{T}(Jpsi) (GeV/#it{c});"; +const TString bSCandTitle = "B_{s}^{0} candidates;"; +const TString entries = "entries"; +const TString bSCandMatch = "B_{s}^{0} candidates (matched);"; +const TString bSCandUnmatch = "B_{s}^{0} candidates (unmatched);"; +const TString mcParticleMatched = "MC particles (matched);"; + +/// Bs analysis task +struct HfTaskBsToJpsiPhiReduced { + Produces hfRedCandBsLite; + // Produces hfRedBsMcCheck; + + Configurable selectionFlagBs{"selectionFlagBs", 1, "Selection Flag for Bs"}; + Configurable yCandGenMax{"yCandGenMax", 0.5, "max. gen particle rapidity"}; + Configurable yCandRecoMax{"yCandRecoMax", 0.8, "max. cand. rapidity"}; + Configurable etaTrackMax{"etaTrackMax", 0.8, "max. track pseudo-rapidity"}; + Configurable ptTrackMin{"ptTrackMin", 0.1, "min. track transverse momentum"}; + Configurable fillBackground{"fillBackground", false, "Flag to enable filling of background histograms/sparses/tree (only MC)"}; + Configurable downSampleBkgFactor{"downSampleBkgFactor", 1., "Fraction of background candidates to keep for ML trainings"}; + Configurable ptMaxForDownSample{"ptMaxForDownSample", 10., "Maximum pt for the application of the downsampling factor"}; + // topological cuts + Configurable> binsPt{"binsPt", std::vector{hf_cuts_bs_to_jpsi_phi::vecBinsPt}, "pT bin limits"}; + Configurable> cuts{"cuts", {hf_cuts_bs_to_jpsi_phi::Cuts[0], hf_cuts_bs_to_jpsi_phi::NBinsPt, hf_cuts_bs_to_jpsi_phi::NCutVars, hf_cuts_bs_to_jpsi_phi::labelsPt, hf_cuts_bs_to_jpsi_phi::labelsCutVar}, "Bs candidate selection per pT bin"}; + // Enable PID + Configurable kaonPidMethod{"kaonPidMethod", PidMethod::TpcOrTof, "PID selection method for the bachelor kaon (PidMethod::NoPid: none, PidMethod::TpcOrTof: TPC or TOF, PidMethod::TpcAndTof: TPC and TOF)"}; + Configurable acceptPIDNotApplicable{"acceptPIDNotApplicable", true, "Switch to accept Status::NotApplicable [(NotApplicable for one detector) and (NotApplicable or Conditional for the other)] in PID selection"}; + // TPC PID + Configurable ptPidTpcMin{"ptPidTpcMin", 0.15, "Lower bound of track pT for TPC PID"}; + Configurable ptPidTpcMax{"ptPidTpcMax", 20., "Upper bound of track pT for TPC PID"}; + Configurable nSigmaTpcMax{"nSigmaTpcMax", 5., "Nsigma cut on TPC only"}; + Configurable nSigmaTpcCombinedMax{"nSigmaTpcCombinedMax", 5., "Nsigma cut on TPC combined with TOF"}; + // TOF PID + Configurable ptPidTofMin{"ptPidTofMin", 0.15, "Lower bound of track pT for TOF PID"}; + Configurable ptPidTofMax{"ptPidTofMax", 20., "Upper bound of track pT for TOF PID"}; + Configurable nSigmaTofMax{"nSigmaTofMax", 5., "Nsigma cut on TOF only"}; + Configurable nSigmaTofCombinedMax{"nSigmaTofCombinedMax", 5., "Nsigma cut on TOF combined with TPC"}; + // Bs ML inference + Configurable> binsPtBsMl{"binsPtBsMl", std::vector{hf_cuts_ml::vecBinsPt}, "pT bin limits for ML application"}; + Configurable> cutDirBsMl{"cutDirBsMl", std::vector{hf_cuts_ml::vecCutDir}, "Whether to reject score values greater or smaller than the threshold"}; + Configurable> cutsBsMl{"cutsBsMl", {hf_cuts_ml::Cuts[0], hf_cuts_ml::NBinsPt, hf_cuts_ml::NCutScores, hf_cuts_ml::labelsPt, hf_cuts_ml::labelsCutScore}, "ML selections per pT bin"}; + Configurable nClassesBsMl{"nClassesBsMl", static_cast(hf_cuts_ml::NCutScores), "Number of classes in ML model"}; + Configurable> namesInputFeatures{"namesInputFeatures", std::vector{"feature1", "feature2"}, "Names of ML model input features"}; + // CCDB configuration + Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable> modelPathsCCDB{"modelPathsCCDB", std::vector{"path_ccdb/BDT_BS/"}, "Paths of models on CCDB"}; + Configurable> onnxFileNames{"onnxFileNames", std::vector{"ModelHandler_onnx_BSToJpsiPhi.onnx"}, "ONNX file names for each pT bin (if not from CCDB full path)"}; + Configurable timestampCCDB{"timestampCCDB", -1, "timestamp of the ONNX file for ML model used to query in CCDB"}; + Configurable loadModelsFromCCDB{"loadModelsFromCCDB", false, "Flag to enable or disable the loading of models from CCDB"}; + + HfHelper hfHelper; + TrackSelectorKa selectorKaon; + o2::analysis::HfMlResponseBsToJpsiPhiReduced hfMlResponse; + o2::ccdb::CcdbApi ccdbApi; + + using TracksKaon = soa::Join; + std::vector outputMl = {}; + + // Filter filterSelectCandidates = (aod::hf_sel_candidate_bplus::isSelBsToJpsiPi >= selectionFlagBs); + + HistogramRegistry registry{"registry"}; + + void init(InitContext&) + { + std::array processFuncData{doprocessData, doprocessDataWithBsMl}; + if ((std::accumulate(processFuncData.begin(), processFuncData.end(), 0)) > 1) { + LOGP(fatal, "Only one process function for data can be enabled at a time."); + } + std::array processFuncMc{doprocessMc, doprocessMcWithBsMl}; + if ((std::accumulate(processFuncMc.begin(), processFuncMc.end(), 0)) > 1) { + LOGP(fatal, "Only one process function for MC can be enabled at a time."); + } + + if (kaonPidMethod < 0 || kaonPidMethod >= PidMethod::NPidMethods) { + LOGP(fatal, "Invalid PID option in configurable, please set 0 (no PID), 1 (TPC or TOF), or 2 (TPC and TOF)"); + } + + if (kaonPidMethod != PidMethod::NoPid) { + selectorKaon.setRangePtTpc(ptPidTpcMin, ptPidTpcMax); + selectorKaon.setRangeNSigmaTpc(-nSigmaTpcMax, nSigmaTpcMax); + selectorKaon.setRangeNSigmaTpcCondTof(-nSigmaTpcCombinedMax, nSigmaTpcCombinedMax); + selectorKaon.setRangePtTof(ptPidTofMin, ptPidTofMax); + selectorKaon.setRangeNSigmaTof(-nSigmaTofMax, nSigmaTofMax); + selectorKaon.setRangeNSigmaTofCondTpc(-nSigmaTofCombinedMax, nSigmaTofCombinedMax); + } + + const AxisSpec axisMassBs{150, 4.5, 6.0}; + const AxisSpec axisMassJpsi{600, 2.8f, 3.4f}; + const AxisSpec axisMassPhi{200, 0.9f, 1.1f}; + const AxisSpec axisPtProng{100, 0., 10.}; + const AxisSpec axisImpactPar{200, -0.05, 0.05}; + const AxisSpec axisPtJpsi{100, 0., 50.}; + const AxisSpec axisRapidity{100, -2., 2.}; + const AxisSpec axisPtB{(std::vector)binsPt, "#it{p}_{T}^{B_{s}^{0}} (GeV/#it{c})"}; + const AxisSpec axisPtKa{100, 0.f, 10.f}; + const AxisSpec axisPtPhi{100, 0.f, 10.f}; + + registry.add("hMass", bSCandTitle + "inv. mass J/#Psi K^{+} (GeV/#it{c}^{2});" + stringPt, {HistType::kTH2F, {axisMassBs, axisPtB}}); + registry.add("hMassJpsi", bSCandTitle + "inv. mass #mu^{+}#mu^{#minus} (GeV/#it{c}^{2});" + stringPt, {HistType::kTH2F, {axisMassJpsi, axisPtJpsi}}); + registry.add("hMassPhi", bSCandTitle + "inv. mass K^{+}K^{#minus} (GeV/#it{c}^{2});" + stringPt, {HistType::kTH2F, {axisMassPhi, axisPtPhi}}); + registry.add("hd0K", bSCandTitle + "Kaon DCAxy to prim. vertex (cm);" + stringPt, {HistType::kTH2F, {axisImpactPar, axisPtKa}}); + + // histograms processMC + if (doprocessMc || doprocessMcWithBsMl) { + registry.add("hPtJpsiGen", mcParticleMatched + "J/#Psi #it{p}_{T}^{gen} (GeV/#it{c}); B_{s}^{0} " + stringPt, {HistType::kTH2F, {axisPtProng, axisPtB}}); + registry.add("hPtPhiGen", mcParticleMatched + "#phi #it{p}_{T}^{gen} (GeV/#it{c}); B_{s}^{0} " + stringPt, {HistType::kTH2F, {axisPtProng, axisPtB}}); + registry.add("hPtKGen", mcParticleMatched + "Kaon #it{p}_{T}^{gen} (GeV/#it{c}); B_{s}^{0} " + stringPt, {HistType::kTH2F, {axisPtProng, axisPtB}}); + registry.add("hYGenWithProngsInAcceptance", mcParticleMatched + "Kaon #it{p}_{T}^{gen} (GeV/#it{c}); B_{s}^{0} " + stringPt, {HistType::kTH2F, {axisPtProng, axisRapidity}}); + registry.add("hMassRecSig", bSCandMatch + "inv. mass J/#Psi K^{+} (GeV/#it{c}^{2}); B_{s}^{0} " + stringPt, {HistType::kTH2F, {axisMassBs, axisPtB}}); + registry.add("hMassJpsiRecSig", bSCandMatch + "inv. mass #mu^{+}#mu^{#minus} (GeV/#it{c}^{2}); J/#Psi " + stringPt, {HistType::kTH2F, {axisMassJpsi, axisPtJpsi}}); + registry.add("hMassPhiRecSig", bSCandMatch + "inv. mass K^{+}K^{#minus} (GeV/#it{c}^{2}); #phi " + stringPt, {HistType::kTH2F, {axisMassPhi, axisPtPhi}}); + registry.add("hd0KRecSig", bSCandMatch + "Kaon DCAxy to prim. vertex (cm); K^{+} " + stringPt, {HistType::kTH2F, {axisImpactPar, axisPtKa}}); + registry.add("hMassRecBg", bSCandUnmatch + "inv. mass J/#Psi K^{+} (GeV/#it{c}^{2}); B_{s}^{0} " + stringPt, {HistType::kTH2F, {axisMassBs, axisPtB}}); + registry.add("hMassJpsiRecBg", bSCandUnmatch + "inv. mass #mu^{+}#mu^{#minus} (GeV/#it{c}^{2}); J/#Psi " + stringPt, {HistType::kTH2F, {axisMassJpsi, axisPtJpsi}}); + registry.add("hMassPhiRecBg", bSCandMatch + "inv. mass K^{+}K^{#minus} (GeV/#it{c}^{2}); #phi " + stringPt, {HistType::kTH2F, {axisMassPhi, axisPtPhi}}); + registry.add("hd0KRecBg", bSCandMatch + "Kaon DCAxy to prim. vertex (cm); K^{+} " + stringPt, {HistType::kTH2F, {axisImpactPar, axisPtKa}}); + } + + if (doprocessDataWithBsMl || doprocessMcWithBsMl) { + hfMlResponse.configure(binsPtBsMl, cutsBsMl, cutDirBsMl, nClassesBsMl); + if (loadModelsFromCCDB) { + ccdbApi.init(ccdbUrl); + hfMlResponse.setModelPathsCCDB(onnxFileNames, ccdbApi, modelPathsCCDB, timestampCCDB); + } else { + hfMlResponse.setModelPathsLocal(onnxFileNames); + } + hfMlResponse.cacheInputFeaturesIndices(namesInputFeatures); + hfMlResponse.init(); + } + } + + /// Selection of Bs daughter in geometrical acceptance + /// \param etaProng is the pseudorapidity of Bs prong + /// \param ptProng is the pT of Bs prong + /// \return true if prong is in geometrical acceptance + template + bool isProngInAcceptance(const T& etaProng, const T& ptProng) + { + return std::abs(etaProng) <= etaTrackMax && ptProng >= ptTrackMin; + } + + /// Fill candidate information at reconstruction level + /// \param doMc is the flag to enable the filling with MC information + /// \param withBsMl is the flag to enable the filling with ML scores for the Bs candidate + /// \param candidate is the Bs candidate + /// \param candidatesJpsi is the table with Jpsi candidates + template + void fillCand(Cand const& candidate, + aod::HfRedJpsis const& /*candidatesJpsi*/, + aod::HfRedBach0Tracks const&, + aod::HfRedBach1Tracks const&) + { + auto ptCandBs = candidate.pt(); + auto invMassBs = hfHelper.invMassBsToJpsiPhi(candidate); + auto candJpsi = candidate.template jpsi_as(); + auto candKa0 = candidate.template prong0Phi_as(); + auto candKa1 = candidate.template prong1Phi_as(); + std::array pVecKa0 = {candKa0.px(), candKa0.py(), candKa0.pz()}; + std::array pVecKa1 = {candKa1.px(), candKa1.py(), candKa1.pz()}; + auto ptJpsi = candidate.ptProng0(); + auto invMassJpsi = candJpsi.m(); + auto invMassPhi = RecoDecay::m(std::array{pVecKa0, pVecKa1}, std::array{o2::constants::physics::MassKPlus, o2::constants::physics::MassKPlus}); + uint8_t statusBs = 0; + + int8_t flagMcMatchRec{0}, channelMcMatchRec{0}, flagWrongCollision{0}; + bool isSignal = false; + if constexpr (doMc) { + flagMcMatchRec = candidate.flagMcMatchRec(); + channelMcMatchRec = candidate.channelMcMatchRec(); + flagWrongCollision = candidate.flagWrongCollision(); + isSignal = flagMcMatchRec == o2::hf_decay::hf_cand_beauty::BsToJpsiKK && + channelMcMatchRec == o2::hf_decay::hf_cand_beauty::BsToJpsiPhi; + } + + SETBIT(statusBs, SelectionStep::RecoSkims); + if (hfHelper.selectionBsToJpsiPhiTopol(candidate, candKa0, candKa1, cuts, binsPt)) { + SETBIT(statusBs, SelectionStep::RecoTopol); + } else if (selectionFlagBs >= BIT(SelectionStep::RecoTopol) * 2 - 1) { + return; + } + // track-level PID selection + // auto trackKa = candidate.template prong1_as(); + if (kaonPidMethod == PidMethod::TpcOrTof || kaonPidMethod == PidMethod::TpcAndTof) { + int pidTrackKa0{TrackSelectorPID::Status::NotApplicable}; + int pidTrackKa1{TrackSelectorPID::Status::NotApplicable}; + if (kaonPidMethod == PidMethod::TpcOrTof) { + pidTrackKa0 = selectorKaon.statusTpcOrTof(candKa0); + pidTrackKa1 = selectorKaon.statusTpcOrTof(candKa1); + } else if (kaonPidMethod == PidMethod::TpcAndTof) { + pidTrackKa0 = selectorKaon.statusTpcAndTof(candKa0); + pidTrackKa1 = selectorKaon.statusTpcAndTof(candKa1); + } + if (hfHelper.selectionBsToJpsiPhiPid(pidTrackKa0, acceptPIDNotApplicable.value) && + hfHelper.selectionBsToJpsiPhiPid(pidTrackKa1, acceptPIDNotApplicable.value)) { + // LOGF(info, "Bs candidate selection failed at PID selection"); + SETBIT(statusBs, SelectionStep::RecoPID); + } else if (selectionFlagBs >= BIT(SelectionStep::RecoPID) * 2 - 1) { + return; + } + } + + float candidateMlScoreSig = -1; + if constexpr (withBsMl) { + // Bs ML selections + std::vector inputFeatures = hfMlResponse.getInputFeatures(candidate, candKa0, candKa1); + if (hfMlResponse.isSelectedMl(inputFeatures, ptCandBs, outputMl)) { + SETBIT(statusBs, SelectionStep::RecoMl); + } else if (selectionFlagBs >= BIT(SelectionStep::RecoMl) * 2 - 1) { + return; + } + candidateMlScoreSig = outputMl[1]; + } + + registry.fill(HIST("hMass"), invMassBs, ptCandBs); + registry.fill(HIST("hMassJpsi"), invMassJpsi, candidate.ptProng0()); + registry.fill(HIST("hMassPhi"), invMassPhi, candidate.ptProng0()); + registry.fill(HIST("hd0K"), candidate.impactParameter1(), candidate.ptProng1()); + if constexpr (doMc) { + if (isSignal) { + registry.fill(HIST("hMassRecSig"), invMassBs, ptCandBs); + registry.fill(HIST("hMassJpsiRecSig"), invMassJpsi, candidate.ptProng0()); + registry.fill(HIST("hd0KRecSig"), candidate.impactParameter1(), candidate.ptProng1()); + } else if (fillBackground) { + registry.fill(HIST("hMassRecBg"), invMassBs, ptCandBs); + registry.fill(HIST("hMassJpsiRecBg"), invMassJpsi, candidate.ptProng0()); + registry.fill(HIST("hd0KRecBg"), candidate.impactParameter1(), candidate.ptProng1()); + } + } + + float pseudoRndm = ptJpsi * 1000. - static_cast(ptJpsi * 1000); + if (ptCandBs >= ptMaxForDownSample || pseudoRndm < downSampleBkgFactor) { + float ptMother = -1.; + if constexpr (doMc) { + ptMother = candidate.ptMother(); + } + + hfRedCandBsLite( + // Bs - meson features + invMassBs, + ptCandBs, + candidate.eta(), + candidate.phi(), + hfHelper.yBs(candidate), + candidate.cpa(), + candidate.cpaXY(), + candidate.chi2PCA(), + candidate.decayLength(), + candidate.decayLengthXY(), + candidate.decayLengthNormalised(), + candidate.decayLengthXYNormalised(), + candidate.ctXY(std::array{o2::constants::physics::MassMuon, o2::constants::physics::MassMuon, o2::constants::physics::MassKPlus, o2::constants::physics::MassKPlus}), + candidate.impactParameterProduct(), + candidate.impactParameterProductJpsi(), + candidate.impactParameterProductPhi(), + candidate.maxNormalisedDeltaIP(), + candidateMlScoreSig, + // J/Psi features + invMassJpsi, + ptJpsi, + invMassPhi, + candidate.impactParameter0(), + candidate.impactParameter1(), + candidate.impactParameter2(), + candidate.impactParameter3(), + // candJpsi.ptProngMin(), + // candJpsi.absEtaProngMin(), + // candJpsi.itsNClsProngMin(), + // candJpsi.tpcNClsCrossedRowsProngMin(), + // candJpsi.tpcChi2NClProngMax(), + // kaon features + candKa0.pt(), + // std::abs(RecoDecay::eta(candKa0.pVector())), + // candKa0.itsNCls(), + // candKa0.tpcNClsCrossedRows(), + // candKa0.tpcChi2NCl(), + candKa0.tpcNSigmaKa(), + candKa0.tofNSigmaKa(), + candKa0.tpcTofNSigmaKa(), + candKa1.pt(), + candKa1.tpcNSigmaKa(), + candKa1.tofNSigmaKa(), + candKa1.tpcTofNSigmaKa(), + // MC truth + flagMcMatchRec, + channelMcMatchRec, + isSignal, + flagWrongCollision, + ptMother); + } + } + + /// Fill particle histograms (gen MC truth) + void fillCandMcGen(aod::HfMcGenRedBss::iterator const& particle) + { + auto ptParticle = particle.ptTrack(); + auto yParticle = particle.yTrack(); + if (yCandGenMax >= 0. && std::abs(yParticle) > yCandGenMax) { + return; + } + std::array ptProngs = {particle.ptProng0(), particle.ptProng1()}; + std::array etaProngs = {particle.etaProng0(), particle.etaProng1()}; + bool prongsInAcc = isProngInAcceptance(etaProngs[0], ptProngs[0]) && isProngInAcceptance(etaProngs[1], ptProngs[1]); + + registry.fill(HIST("hPtJpsiGen"), ptProngs[0], ptParticle); + registry.fill(HIST("hPtKGen"), ptProngs[1], ptParticle); + + // generated Bs with daughters in geometrical acceptance + if (prongsInAcc) { + registry.fill(HIST("hYGenWithProngsInAcceptance"), ptParticle, yParticle); + } + } + + // Process functions + void processData(aod::HfRedCandBsToJpsiPhi const& candidates, + aod::HfRedJpsis const& candidatesJpsi, + aod::HfRedBach0Tracks const& kaon0Tracks, + aod::HfRedBach1Tracks const& kaon1Tracks) + { + for (const auto& candidate : candidates) { + if (yCandRecoMax >= 0. && std::abs(hfHelper.yBs(candidate)) > yCandRecoMax) { + continue; + } + fillCand(candidate, candidatesJpsi, kaon0Tracks, kaon1Tracks); + } // candidate loop + } // processData + PROCESS_SWITCH(HfTaskBsToJpsiPhiReduced, processData, "Process data without ML for Bs", true); + + void processDataWithBsMl(aod::HfRedCandBsToJpsiPhi const& candidates, + aod::HfRedJpsis const& candidatesJpsi, + aod::HfRedBach0Tracks const& kaon0Tracks, + aod::HfRedBach1Tracks const& kaon1Tracks) + { + for (const auto& candidate : candidates) { + if (yCandRecoMax >= 0. && std::abs(hfHelper.yBs(candidate)) > yCandRecoMax) { + continue; + } + fillCand(candidate, candidatesJpsi, kaon0Tracks, kaon1Tracks); + } // candidate loop + } // processDataWithBsMl + PROCESS_SWITCH(HfTaskBsToJpsiPhiReduced, processDataWithBsMl, "Process data with ML for Bs", false); + + void processMc(soa::Join const& candidates, + aod::HfMcGenRedBss const& mcParticles, + aod::HfRedJpsis const& candidatesJpsi, + aod::HfRedBach0Tracks const& kaon0Tracks, + aod::HfRedBach1Tracks const& kaon1Tracks) + { + // MC rec + for (const auto& candidate : candidates) { + if (yCandRecoMax >= 0. && std::abs(hfHelper.yBs(candidate)) > yCandRecoMax) { + continue; + } + fillCand(candidate, candidatesJpsi, kaon0Tracks, kaon1Tracks); + } // rec + + // MC gen. level + for (const auto& particle : mcParticles) { + fillCandMcGen(particle); + } // gen + } // processMc + PROCESS_SWITCH(HfTaskBsToJpsiPhiReduced, processMc, "Process MC without ML for Bs", false); + + void processMcWithBsMl(soa::Join const& candidates, + aod::HfMcGenRedBss const& mcParticles, + aod::HfRedJpsis const& candidatesJpsi, + aod::HfRedBach0Tracks const& kaon0Tracks, + aod::HfRedBach1Tracks const& kaon1Tracks) + { + // MC rec + for (const auto& candidate : candidates) { + if (yCandRecoMax >= 0. && std::abs(hfHelper.yBs(candidate)) > yCandRecoMax) { + continue; + } + fillCand(candidate, candidatesJpsi, kaon0Tracks, kaon1Tracks); + } // rec + + // MC gen. level + for (const auto& particle : mcParticles) { + fillCandMcGen(particle); + } // gen + } // processMcWithBsMl + PROCESS_SWITCH(HfTaskBsToJpsiPhiReduced, processMcWithBsMl, "Process MC with ML for Bs", false); + +}; // struct + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} diff --git a/PWGHF/D2H/Utils/utilsRedDataFormat.h b/PWGHF/D2H/Utils/utilsRedDataFormat.h index a083e9713b2..513f2a998fc 100644 --- a/PWGHF/D2H/Utils/utilsRedDataFormat.h +++ b/PWGHF/D2H/Utils/utilsRedDataFormat.h @@ -16,16 +16,16 @@ #ifndef PWGHF_D2H_UTILS_UTILSREDDATAFORMAT_H_ #define PWGHF_D2H_UTILS_UTILSREDDATAFORMAT_H_ -#include - -#include +#include "PWGHF/Core/CentralityEstimation.h" +#include "PWGHF/Utils/utilsEvSelHf.h" #include "CCDB/BasicCCDBManager.h" #include "Framework/AnalysisHelpers.h" #include "Framework/HistogramRegistry.h" -#include "PWGHF/Core/CentralityEstimation.h" -#include "PWGHF/Utils/utilsEvSelHf.h" +#include + +#include namespace o2::hf_evsel { @@ -81,6 +81,31 @@ float getTpcTofNSigmaPi1(const T1& prong1) } return defaultNSigma; } + +/// Helper function to retrive PID information of bachelor kaon from b-hadron decay +/// \param prong1 kaon track from reduced data format, aod::HfRedBachProng0Tracks +/// \return the combined TPC and TOF n-sigma for kaon +template +float getTpcTofNSigmaKa1(const T1& prong1) +{ + float defaultNSigma = -999.f; // -999.f is the default value set in TPCPIDResponse.h and PIDTOF.h + + bool hasTpc = prong1.hasTPC(); + bool hasTof = prong1.hasTOF(); + + if (hasTpc && hasTof) { + float tpcNSigma = prong1.tpcNSigmaKa(); + float tofNSigma = prong1.tofNSigmaKa(); + return std::sqrt(.5f * tpcNSigma * tpcNSigma + .5f * tofNSigma * tofNSigma); + } + if (hasTpc) { + return std::abs(prong1.tpcNSigmaKa()); + } + if (hasTof) { + return std::abs(prong1.tofNSigmaKa()); + } + return defaultNSigma; +} } // namespace o2::pid_tpc_tof_utils #endif // PWGHF_D2H_UTILS_UTILSREDDATAFORMAT_H_ diff --git a/PWGHF/DataModel/CandidateReconstructionTables.h b/PWGHF/DataModel/CandidateReconstructionTables.h index 014bfa3e32e..a32a88e1d12 100644 --- a/PWGHF/DataModel/CandidateReconstructionTables.h +++ b/PWGHF/DataModel/CandidateReconstructionTables.h @@ -18,13 +18,9 @@ #ifndef PWGHF_DATAMODEL_CANDIDATERECONSTRUCTIONTABLES_H_ #define PWGHF_DATAMODEL_CANDIDATERECONSTRUCTIONTABLES_H_ -#include -#include -#include - -#include -#include -#include +#include "PWGHF/Core/DecayChannels.h" // FIXME: temporary until propagated where needed +#include "PWGHF/Utils/utilsPid.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" #include "ALICE3/DataModel/ECAL.h" #include "Common/Core/RecoDecay.h" @@ -32,10 +28,13 @@ #include "Common/DataModel/PIDResponseTPC.h" #include "Common/DataModel/TrackSelectionTables.h" -#include "PWGLF/DataModel/LFStrangenessTables.h" +#include +#include +#include -#include "PWGHF/Utils/utilsPid.h" -#include "PWGHF/Core/DecayChannels.h" // FIXME: temporary until propagated where needed +#include +#include +#include namespace o2::aod { @@ -485,6 +484,23 @@ DECLARE_SOA_COLUMN(ImpactParameterZ2, impactParameterZ2, float); DECLARE_SOA_COLUMN(ErrorImpactParameterZ2, errorImpactParameterZ2, float); //! DECLARE_SOA_DYNAMIC_COLUMN(ImpactParameterZNormalised2, impactParameterZNormalised2, //! [](float dca, float err) -> float { return dca / err; }); +DECLARE_SOA_COLUMN(PxProng3, pxProng3, float); //! +DECLARE_SOA_COLUMN(PyProng3, pyProng3, float); //! +DECLARE_SOA_COLUMN(PzProng3, pzProng3, float); //! +DECLARE_SOA_DYNAMIC_COLUMN(PtProng3, ptProng3, //! + [](float px, float py) -> float { return RecoDecay::pt(px, py); }); +DECLARE_SOA_DYNAMIC_COLUMN(Pt2Prong3, pt2Prong3, //! + [](float px, float py) -> float { return RecoDecay::pt2(px, py); }); +DECLARE_SOA_DYNAMIC_COLUMN(PVectorProng3, pVectorProng3, //! + [](float px, float py, float pz) -> std::array { return std::array{px, py, pz}; }); +DECLARE_SOA_COLUMN(ImpactParameter3, impactParameter3, float); //! +DECLARE_SOA_COLUMN(ErrorImpactParameter3, errorImpactParameter3, float); //! +DECLARE_SOA_DYNAMIC_COLUMN(ImpactParameterNormalised3, impactParameterNormalised3, //! + [](float dca, float err) -> float { return dca / err; }); +DECLARE_SOA_COLUMN(ImpactParameterZ3, impactParameterZ3, float); //! +DECLARE_SOA_COLUMN(ErrorImpactParameterZ3, errorImpactParameterZ3, float); //! +DECLARE_SOA_DYNAMIC_COLUMN(ImpactParameterZNormalised3, impactParameterZNormalised3, //! + [](float dca, float err) -> float { return dca / err; }); DECLARE_SOA_COLUMN(NProngsContributorsPV, nProngsContributorsPV, uint8_t); //! number of prongs contributing to the primary-vertex reconstruction DECLARE_SOA_COLUMN(BitmapProngsContributorsPV, bitmapProngsContributorsPV, uint8_t); //! bitmap with booleans indicating prongs contributing to the primary-vertex reconstruction /// prong PID nsigma @@ -618,6 +634,8 @@ DECLARE_SOA_DYNAMIC_COLUMN(ImpactParameterProngSqSum, impactParameterProngSqSum, [](float impParProng0, float impParProng1) -> float { return RecoDecay::sumOfSquares(impParProng0, impParProng1); }); DECLARE_SOA_DYNAMIC_COLUMN(MaxNormalisedDeltaIP, maxNormalisedDeltaIP, //! [](float xVtxP, float yVtxP, float xVtxS, float yVtxS, float errDlxy, float pxM, float pyM, float ip0, float errIp0, float ip1, float errIp1, float px0, float py0, float px1, float py1) -> float { return RecoDecay::maxNormalisedDeltaIP(std::array{xVtxP, yVtxP}, std::array{xVtxS, yVtxS}, errDlxy, std::array{pxM, pyM}, std::array{ip0, ip1}, std::array{errIp0, errIp1}, std::array{std::array{px0, py0}, std::array{px1, py1}}); }); +DECLARE_SOA_DYNAMIC_COLUMN(CtXY, ctXY, //! + [](float px0, float py0, float pz0, float px1, float py1, float pz1, float xVtxP, float yVtxP, float xVtxS, float yVtxS, const std::array& m) -> float { return RecoDecay::ctXY(std::array{xVtxP, yVtxP}, std::array{xVtxS, yVtxS}, std::array{std::array{px0, py0, pz0}, std::array{px1, py1, pz1}}, m); }); // MC matching result: DECLARE_SOA_COLUMN(FlagMcMatchRec, flagMcMatchRec, int8_t); //! reconstruction level DECLARE_SOA_COLUMN(FlagMcMatchGen, flagMcMatchGen, int8_t); //! generator level @@ -851,12 +869,17 @@ namespace hf_cand_bplus { DECLARE_SOA_INDEX_COLUMN_FULL(Prong0, prong0, int, HfCand2Prong, "_0"); // D0 index // MC matching result: -DECLARE_SOA_COLUMN(FlagMcMatchRec, flagMcMatchRec, int8_t); // reconstruction level -DECLARE_SOA_COLUMN(FlagWrongCollision, flagWrongCollision, int8_t); // reconstruction level -DECLARE_SOA_COLUMN(FlagMcMatchGen, flagMcMatchGen, int8_t); // generator level -DECLARE_SOA_COLUMN(OriginMcRec, originMcRec, int8_t); // particle origin, reconstruction level -DECLARE_SOA_COLUMN(OriginMcGen, originMcGen, int8_t); // particle origin, generator level -DECLARE_SOA_COLUMN(DebugMcRec, debugMcRec, int8_t); // debug flag for mis-association reconstruction level +DECLARE_SOA_COLUMN(FlagMcMatchRec, flagMcMatchRec, int8_t); // reconstruction level +DECLARE_SOA_COLUMN(ChannelMcMatchRec, channelMcMatchRec, int8_t); // reconstruction level +DECLARE_SOA_COLUMN(FlagWrongCollision, flagWrongCollision, int8_t); // reconstruction level +DECLARE_SOA_COLUMN(FlagMcMatchGen, flagMcMatchGen, int8_t); // generator level +DECLARE_SOA_COLUMN(OriginMcRec, originMcRec, int8_t); // particle origin, reconstruction level +DECLARE_SOA_COLUMN(OriginMcGen, originMcGen, int8_t); // particle origin, generator level +DECLARE_SOA_COLUMN(DebugMcRec, debugMcRec, int8_t); // debug flag for mis-association reconstruction level +DECLARE_SOA_DYNAMIC_COLUMN(ImpactParameterProduct, impactParameterProduct, // Impact parameter product for B+ -> J/Psi K + [](float px0, float py0, float pz0, float px1, float py1, float pz1, float xVtxP, float yVtxP, float zVtxP, float xVtxS, float yVtxS, float zVtxS, float impParK) -> float { return impParK * RecoDecay::impParXY(std::array{xVtxP, yVtxP, zVtxP}, std::array{xVtxS, yVtxS, zVtxS}, RecoDecay::pVec(std::array{px0, py0, pz0}, std::array{px1, py1, pz1})); }); +DECLARE_SOA_DYNAMIC_COLUMN(ImpactParameterProductJpsi, impactParameterProductJpsi, // J/Psi impact parameter for B+ -> J/Psi K + [](float dcaDauPos, float dcaDauNeg) -> float { return dcaDauPos * dcaDauNeg; }); enum DecayType { BplusToD0Pi = 0 }; @@ -865,6 +888,11 @@ enum DecayTypeMc : uint8_t { BplusToD0PiToKPiPi = 0, PartlyRecoDecay, OtherDecay, NDecayTypeMc }; + +enum class DecayTypeBToJpsiMc : uint8_t { BplusToJpsiKToMuMuK = 0, + PartlyRecoDecay, + OtherDecay, + NDecayTypeMc }; } // namespace hf_cand_bplus // declare dedicated BPlus decay candidate table @@ -898,7 +926,8 @@ DECLARE_SOA_TABLE(HfCandBplusBase, "AOD", "HFCANDBPLUSBASE", hf_cand::Phi, hf_cand::Y, hf_cand::E, - hf_cand::E2); + hf_cand::E2, + hf_cand_2prong::CtXY); // extended table with expression columns that can be used as arguments of dynamic columns DECLARE_SOA_EXTENDED_TABLE_USER(HfCandBplusExt, HfCandBplusBase, "HFCANDBPLUSEXT", @@ -936,6 +965,10 @@ DECLARE_SOA_DYNAMIC_COLUMN(ImpactParameterProngSqSum, impactParameterProngSqSum, [](float impParProng0, float impParProng1, float impParProng2) -> float { return RecoDecay::sumOfSquares(impParProng0, impParProng1, impParProng2); }); DECLARE_SOA_DYNAMIC_COLUMN(MaxNormalisedDeltaIP, maxNormalisedDeltaIP, //! [](float xVtxP, float yVtxP, float xVtxS, float yVtxS, float errDlxy, float pxM, float pyM, float ip0, float errIp0, float ip1, float errIp1, float ip2, float errIp2, float px0, float py0, float px1, float py1, float px2, float py2) -> float { return RecoDecay::maxNormalisedDeltaIP(std::array{xVtxP, yVtxP}, std::array{xVtxS, yVtxS}, errDlxy, std::array{pxM, pyM}, std::array{ip0, ip1, ip2}, std::array{errIp0, errIp1, errIp2}, std::array{std::array{px0, py0}, std::array{px1, py1}, std::array{px2, py2}}); }); +DECLARE_SOA_DYNAMIC_COLUMN(CtXY, ctXY, //! + [](float px0, float py0, float pz0, float px1, float py1, float pz1, float px2, float py2, float pz2, float xVtxP, float yVtxP, float xVtxS, float yVtxS, const std::array& m) -> float { + return RecoDecay::ctXY(std::array{xVtxP, yVtxP}, std::array{xVtxS, yVtxS}, std::array{std::array{px0, py0, pz0}, std::array{px1, py1, pz1}, std::array{px2, py2, pz2}}, m); + }); // MC matching result: DECLARE_SOA_COLUMN(FlagMcMatchRec, flagMcMatchRec, int8_t); //! reconstruction level DECLARE_SOA_COLUMN(FlagMcMatchGen, flagMcMatchGen, int8_t); //! generator level @@ -1077,6 +1110,55 @@ DECLARE_SOA_TABLE(HfCand3ProngMcGen, "AOD", "HFCAND3PMCGEN", //! hf_cand_3prong::FlagMcDecayChanGen, hf_cand::IdxBhadMotherPart); +// declare dedicated BPlus -> J/Psi K decay candidate table +// convention: prongs 0 and 1 should be J/Psi decay products +DECLARE_SOA_TABLE(HfCandBpJPBase, "AOD", "HFCANDBPJPBASE", + // general columns + HFCAND_COLUMNS, + /* prong 2 */ hf_cand::ImpactParameterNormalised2, + hf_cand::PtProng2, + hf_cand::Pt2Prong2, + hf_cand::PVectorProng2, + // 3-prong specific columns + o2::soa::Index<>, + hf_cand::PxProng0, hf_cand::PyProng0, hf_cand::PzProng0, + hf_cand::PxProng1, hf_cand::PyProng1, hf_cand::PzProng1, + hf_cand::PxProng2, hf_cand::PyProng2, hf_cand::PzProng2, + hf_cand::ImpactParameter0, hf_cand::ImpactParameter1, hf_cand::ImpactParameter2, + hf_cand::ErrorImpactParameter0, hf_cand::ErrorImpactParameter1, hf_cand::ErrorImpactParameter2, + /* dynamic columns */ + hf_cand_3prong::M, + hf_cand_3prong::M2, + hf_cand_3prong::ImpactParameterProngSqSum, + hf_cand_bplus::ImpactParameterProduct, + hf_cand_bplus::ImpactParameterProductJpsi, + /* dynamic columns that use candidate momentum components */ + hf_cand::Pt, + hf_cand::Pt2, + hf_cand::P, + hf_cand::P2, + hf_cand::PVector, + hf_cand::Cpa, + hf_cand::CpaXY, + hf_cand::Ct, + hf_cand::ImpactParameterXY, + hf_cand_3prong::MaxNormalisedDeltaIP, + hf_cand::Eta, + hf_cand::Phi, + hf_cand::Y, + hf_cand::E, + hf_cand::E2, + hf_cand_3prong::CtXY); + +// extended table with expression columns that can be used as arguments of dynamic columns +DECLARE_SOA_EXTENDED_TABLE_USER(HfCandBpJPExt, HfCandBpJPBase, "HFCANDBPJPEXT", + hf_cand_3prong::Px, hf_cand_3prong::Py, hf_cand_3prong::Pz); + +DECLARE_SOA_TABLE(HfCandBpJPDaus, "AOD", "HFCANDBPJPDAUS", + hf_track_index::Prong0Id, hf_track_index::Prong1Id, hf_track_index::Prong2Id); + +using HfCandBplusToJpsi = soa::Join; + namespace hf_cand_casc_lf { // mapping of decay types @@ -1979,6 +2061,7 @@ namespace hf_cand_b0 DECLARE_SOA_INDEX_COLUMN_FULL(Prong0, prong0, int, HfCand3Prong, "_0"); // D index // MC matching result: DECLARE_SOA_COLUMN(FlagMcMatchRec, flagMcMatchRec, int8_t); // reconstruction level +DECLARE_SOA_COLUMN(ChannelMcMatchRec, channelMcMatchRec, int8_t); // reconstruction level DECLARE_SOA_COLUMN(FlagWrongCollision, flagWrongCollision, int8_t); // reconstruction level DECLARE_SOA_COLUMN(FlagMcMatchGen, flagMcMatchGen, int8_t); // generator level DECLARE_SOA_COLUMN(OriginMcRec, originMcRec, int8_t); // particle origin, reconstruction level @@ -1986,7 +2069,7 @@ DECLARE_SOA_COLUMN(OriginMcGen, originMcGen, int8_t); // particle DECLARE_SOA_COLUMN(DebugMcRec, debugMcRec, int8_t); // debug flag for mis-association reconstruction level // mapping of decay types -enum DecayType { B0ToDPi }; +enum DecayType { B0ToDPi = 0 }; enum DecayTypeMc : uint8_t { B0ToDplusPiToPiKPiPi = 0, B0ToDsPiToKKPiPi, @@ -2054,15 +2137,26 @@ namespace hf_cand_bs { DECLARE_SOA_INDEX_COLUMN_FULL(Prong0, prong0, int, HfCand3Prong, "_0"); // Ds index // MC matching result: -DECLARE_SOA_COLUMN(FlagMcMatchRec, flagMcMatchRec, int8_t); // reconstruction level -DECLARE_SOA_COLUMN(FlagWrongCollision, flagWrongCollision, int8_t); // reconstruction level -DECLARE_SOA_COLUMN(FlagMcMatchGen, flagMcMatchGen, int8_t); // generator level -DECLARE_SOA_COLUMN(OriginMcRec, originMcRec, int8_t); // particle origin, reconstruction level -DECLARE_SOA_COLUMN(OriginMcGen, originMcGen, int8_t); // particle origin, generator level -DECLARE_SOA_COLUMN(DebugMcRec, debugMcRec, int8_t); // debug flag for mis-association reconstruction level +DECLARE_SOA_COLUMN(FlagMcMatchRec, flagMcMatchRec, int8_t); // reconstruction level +DECLARE_SOA_COLUMN(ChannelMcMatchRec, channelMcMatchRec, int8_t); // reconstruction level +DECLARE_SOA_COLUMN(FlagWrongCollision, flagWrongCollision, int8_t); // reconstruction level +DECLARE_SOA_COLUMN(FlagMcMatchGen, flagMcMatchGen, int8_t); // generator level +DECLARE_SOA_COLUMN(OriginMcRec, originMcRec, int8_t); // particle origin, reconstruction level +DECLARE_SOA_COLUMN(OriginMcGen, originMcGen, int8_t); // particle origin, generator level +DECLARE_SOA_COLUMN(DebugMcRec, debugMcRec, int8_t); // debug flag for mis-association reconstruction level +DECLARE_SOA_DYNAMIC_COLUMN(ImpactParameterProduct, impactParameterProduct, // Impact parameter product for Bs -> J/Psi phi + [](float pxJpsiDauPos, float pyJpsiDauPos, float pzJpsiDauPos, float pxJpsiDauNeg, float pyJpsiDauNeg, float pzJpsiDauNeg, float pxLfTrack0, float pyLfTrack0, float pzLfTrack0, float pxLfTrack1, float pyLfTrack1, float pzLfTrack1, float xVtxP, float yVtxP, float zVtxP, float xVtxS, float yVtxS, float zVtxS) -> float { + float impParJpsi = RecoDecay::impParXY(std::array{xVtxP, yVtxP, zVtxP}, std::array{xVtxS, yVtxS, zVtxS}, RecoDecay::pVec(std::array{pxJpsiDauPos, pyJpsiDauPos, pzJpsiDauPos}, std::array{pxJpsiDauNeg, pyJpsiDauNeg, pzJpsiDauNeg})); + float impParPhi = RecoDecay::impParXY(std::array{xVtxP, yVtxP, zVtxP}, std::array{xVtxS, yVtxS, zVtxS}, RecoDecay::pVec(std::array{pxLfTrack0, pyLfTrack0, pzLfTrack0}, std::array{pxLfTrack1, pyLfTrack1, pzLfTrack1})); + return impParJpsi * impParPhi; + }); +DECLARE_SOA_DYNAMIC_COLUMN(ImpactParameterProductJpsi, impactParameterProductJpsi, // J/Psi impact parameter for Bs -> J/Psi phi + [](float dcaDauPos, float dcaDauNeg) -> float { return dcaDauPos * dcaDauNeg; }); +DECLARE_SOA_DYNAMIC_COLUMN(ImpactParameterProductPhi, impactParameterProductPhi, // J/Psi impact parameter for Bs -> J/Psi phi + [](float dcaLfTrack0, float dcaLfTrack1) -> float { return dcaLfTrack0 * dcaLfTrack1; }); // mapping of decay types -enum DecayType { BsToDsPi }; +enum DecayType { BsToDsPi = 0 }; enum DecayTypeMc : uint8_t { BsToDsPiToPhiPiPiToKKPiPi = 0, // Bs(bar) → Ds∓ π± → (Phi π∓) π± → (K- K+ π∓) π± BsToDsPiToK0starKPiToKKPiPi, // Bs(bar) → Ds∓ π± → (K0* K∓) π± → (K- K+ π∓) π± @@ -2074,6 +2168,11 @@ enum DecayTypeMc : uint8_t { BsToDsPiToPhiPiPiToKKPiPi = 0, // Bs(bar) → Ds∓ OtherDecay, NDecayTypeMc }; // counter of differentiated MC decay types +enum class DecayTypeBToJpsiMc : uint8_t { BsToJpsiPhiToMuMuKK = 0, // Bs(bar) → J/Psi Phi → (µ+ µ-) (K- K+) + PartlyRecoDecay, // 4 final state particles have another common b-hadron ancestor + OtherDecay, + NDecayTypeMc }; // counter of differentiated MC decay types + } // namespace hf_cand_bs // declare dedicated Bs decay candidate table @@ -2107,6 +2206,7 @@ DECLARE_SOA_TABLE(HfCandBsBase, "AOD", "HFCANDBSBASE", hf_cand::Y, hf_cand::E, hf_cand::E2, + hf_cand_2prong::CtXY, o2::soa::Marker<1>); // extended table with expression columns that can be used as arguments of dynamic columns @@ -2126,6 +2226,82 @@ DECLARE_SOA_TABLE(HfCandBsMcRec, "AOD", "HFCANDBSMCREC", DECLARE_SOA_TABLE(HfCandBsMcGen, "AOD", "HFCANDBSMCGEN", hf_cand_bs::FlagMcMatchGen); +namespace hf_cand_4prong +{ +DECLARE_SOA_EXPRESSION_COLUMN(Px, px, //! + float, 1.f * aod::hf_cand::pxProng0 + 1.f * aod::hf_cand::pxProng1 + 1.f * aod::hf_cand::pxProng2 + 1.f * aod::hf_cand::pxProng3); +DECLARE_SOA_EXPRESSION_COLUMN(Py, py, //! + float, 1.f * aod::hf_cand::pyProng0 + 1.f * aod::hf_cand::pyProng1 + 1.f * aod::hf_cand::pyProng2 + 1.f * aod::hf_cand::pyProng3); +DECLARE_SOA_EXPRESSION_COLUMN(Pz, pz, //! + float, 1.f * aod::hf_cand::pzProng0 + 1.f * aod::hf_cand::pzProng1 + 1.f * aod::hf_cand::pzProng2 + 1.f * aod::hf_cand::pzProng3); +DECLARE_SOA_DYNAMIC_COLUMN(M, m, //! + [](float px0, float py0, float pz0, float px1, float py1, float pz1, float px2, float py2, float pz2, float px3, float py3, float pz3, const std::array& m) -> float { return RecoDecay::m(std::array{std::array{px0, py0, pz0}, std::array{px1, py1, pz1}, std::array{px2, py2, pz2}, std::array{px3, py3, pz3}}, m); }); +DECLARE_SOA_DYNAMIC_COLUMN(M2, m2, //! + [](float px0, float py0, float pz0, float px1, float py1, float pz1, float px2, float py2, float pz2, float px3, float py3, float pz3, const std::array& m) -> float { return RecoDecay::m2(std::array{std::array{px0, py0, pz0}, std::array{px1, py1, pz1}, std::array{px2, py2, pz2}, std::array{px3, py3, pz3}}, m); }); +DECLARE_SOA_DYNAMIC_COLUMN(ImpactParameterProngSqSum, impactParameterProngSqSum, //! + [](float impParProng0, float impParProng1, float impParProng2, float impParProng3) -> float { return RecoDecay::sumOfSquares(impParProng0, impParProng1, impParProng2, impParProng3); }); +DECLARE_SOA_DYNAMIC_COLUMN(MaxNormalisedDeltaIP, maxNormalisedDeltaIP, //! + [](float xVtxP, float yVtxP, float xVtxS, float yVtxS, float errDlxy, float pxM, float pyM, float ip0, float errIp0, float ip1, float errIp1, float ip2, float errIp2, float ip3, float errIp3, float px0, float py0, float px1, float py1, float px2, float py2, float px3, float py3) -> float { return RecoDecay::maxNormalisedDeltaIP(std::array{xVtxP, yVtxP}, std::array{xVtxS, yVtxS}, errDlxy, std::array{pxM, pyM}, std::array{ip0, ip1, ip2, ip3}, std::array{errIp0, errIp1, errIp2, errIp3}, std::array{std::array{px0, py0}, std::array{px1, py1}, std::array{px2, py2}, std::array{px3, py3}}); }); +DECLARE_SOA_DYNAMIC_COLUMN(CtXY, ctXY, //! + [](float px0, float py0, float pz0, float px1, float py1, float pz1, float px2, float py2, float pz2, float px3, float py3, float pz3, float xVtxP, float yVtxP, float xVtxS, float yVtxS, const std::array& m) -> float { return RecoDecay::ctXY(std::array{xVtxP, yVtxP}, std::array{xVtxS, yVtxS}, std::array{std::array{px0, py0, pz0}, std::array{px1, py1, pz1}, std::array{px2, py2, pz2}, std::array{px3, py3, pz3}}, m); }); +} // namespace hf_cand_4prong + +// declare dedicated Bs -> J/Psi phi decay candidate table +// convention: prongs 0 and 1 should be J/Psi decay products, 2 and 3 should be phi decay products +DECLARE_SOA_TABLE(HfCandBsJPBase, "AOD", "HFCANDBSJPBASE", + // general columns + HFCAND_COLUMNS, + /* prong 2 */ hf_cand::ImpactParameterNormalised2, + hf_cand::PtProng2, + hf_cand::Pt2Prong2, + hf_cand::PVectorProng2, + /* prong 3 */ hf_cand::ImpactParameterNormalised3, + hf_cand::PtProng3, + hf_cand::Pt2Prong3, + hf_cand::PVectorProng3, + // 4-prong specific columns + o2::soa::Index<>, + hf_cand::PxProng0, hf_cand::PyProng0, hf_cand::PzProng0, + hf_cand::PxProng1, hf_cand::PyProng1, hf_cand::PzProng1, + hf_cand::PxProng2, hf_cand::PyProng2, hf_cand::PzProng2, + hf_cand::PxProng3, hf_cand::PyProng3, hf_cand::PzProng3, + hf_cand::ImpactParameter0, hf_cand::ImpactParameter1, hf_cand::ImpactParameter2, hf_cand::ImpactParameter3, + hf_cand::ErrorImpactParameter0, hf_cand::ErrorImpactParameter1, hf_cand::ErrorImpactParameter2, hf_cand::ErrorImpactParameter3, + /* dynamic columns */ + hf_cand_4prong::M, + hf_cand_4prong::M2, + hf_cand_4prong::ImpactParameterProngSqSum, + hf_cand_bs::ImpactParameterProduct, + hf_cand_bs::ImpactParameterProductJpsi, + hf_cand_bs::ImpactParameterProductPhi, + /* dynamic columns that use candidate momentum components */ + hf_cand::Pt, + hf_cand::Pt2, + hf_cand::P, + hf_cand::P2, + hf_cand::PVector, + hf_cand::Cpa, + hf_cand::CpaXY, + hf_cand::Ct, + hf_cand::ImpactParameterXY, + hf_cand_4prong::MaxNormalisedDeltaIP, + hf_cand::Eta, + hf_cand::Phi, + hf_cand::Y, + hf_cand::E, + hf_cand::E2, + hf_cand_4prong::CtXY, + o2::soa::Marker<1>); + +// extended table with expression columns that can be used as arguments of dynamic columns +DECLARE_SOA_EXTENDED_TABLE_USER(HfCandBsJPExt, HfCandBsJPBase, "HFCANDBSJPEXT", + hf_cand_4prong::Px, hf_cand_4prong::Py, hf_cand_4prong::Pz); + +DECLARE_SOA_TABLE(HfCandBsJPDaus, "AOD", "HFCANDBSJPDAUS", + hf_cand_bs::Prong0Id, hf_track_index::Prong1Id, hf_track_index::Prong2Id, hf_track_index::Prong3Id); + +using HfCandBsToJpsi = soa::Join; + // specific Σc0,++ candidate properties namespace hf_cand_sigmac { diff --git a/PWGHF/DataModel/CandidateSelectionTables.h b/PWGHF/DataModel/CandidateSelectionTables.h index f693605f635..0ac6ffa1a98 100644 --- a/PWGHF/DataModel/CandidateSelectionTables.h +++ b/PWGHF/DataModel/CandidateSelectionTables.h @@ -250,19 +250,23 @@ DECLARE_SOA_TABLE(HfMlB0ToDPi, "AOD", "HFMLB0", //! namespace hf_sel_candidate_bs { -DECLARE_SOA_COLUMN(IsSelBsToDsPi, isSelBsToDsPi, int); //! -DECLARE_SOA_COLUMN(MlProbBsToDsPi, mlProbBsToDsPi, std::vector); //! +DECLARE_SOA_COLUMN(IsSelBsToDsPi, isSelBsToDsPi, int); //! +DECLARE_SOA_COLUMN(MlProbBsToDsPi, mlProbBsToDsPi, std::vector); //! +DECLARE_SOA_COLUMN(MlProbBsToJpsiPhi, mlProbBsToJpsiPhi, std::vector); //! } // namespace hf_sel_candidate_bs DECLARE_SOA_TABLE(HfSelBsToDsPi, "AOD", "HFSELBS", //! hf_sel_candidate_bs::IsSelBsToDsPi); DECLARE_SOA_TABLE(HfMlBsToDsPi, "AOD", "HFMLBS", //! hf_sel_candidate_bs::MlProbBsToDsPi); +DECLARE_SOA_TABLE(HfMlBsToJpsiPhi, "AOD", "HFMLBSTOJPSIPHI", //! + hf_sel_candidate_bs::MlProbBsToDsPi); namespace hf_sel_candidate_bplus { -DECLARE_SOA_COLUMN(IsSelBplusToD0Pi, isSelBplusToD0Pi, int); //! selection flag on B+ candidate -DECLARE_SOA_COLUMN(MlProbBplusToD0Pi, mlProbBplusToD0Pi, float); //! ML score of B+ candidate for signal class +DECLARE_SOA_COLUMN(IsSelBplusToD0Pi, isSelBplusToD0Pi, int); //! selection flag on B+ candidate +DECLARE_SOA_COLUMN(MlProbBplusToD0Pi, mlProbBplusToD0Pi, float); //! ML score of B+ candidate for signal class +DECLARE_SOA_COLUMN(MlProbBplusToJpsiK, mlProbBplusToJpsiK, float); //! ML score of B+ candidate for signal class } // namespace hf_sel_candidate_bplus DECLARE_SOA_TABLE(HfSelBplusToD0Pi, "AOD", "HFSELBPLUS", //! @@ -271,6 +275,8 @@ DECLARE_SOA_TABLE(HfSelBplusToD0Pi, "AOD", "HFSELBPLUS", //! DECLARE_SOA_TABLE(HfMlBplusToD0Pi, "AOD", "HFMLBPLUS", //! hf_sel_candidate_bplus::MlProbBplusToD0Pi); +DECLARE_SOA_TABLE(HfMlBplusToJpsiK, "AOD", "HFMLBPLUSTOJPSIK", //! + hf_sel_candidate_bplus::MlProbBplusToJpsiK); namespace hf_sel_candidate_lb { DECLARE_SOA_COLUMN(IsSelLbToLcPi, isSelLbToLcPi, int); //! selection flag on Lb candidate diff --git a/PWGHF/Utils/utilsTrkCandHf.h b/PWGHF/Utils/utilsTrkCandHf.h index 94fa2084370..43db7a21e08 100644 --- a/PWGHF/Utils/utilsTrkCandHf.h +++ b/PWGHF/Utils/utilsTrkCandHf.h @@ -16,10 +16,12 @@ #ifndef PWGHF_UTILS_UTILSTRKCANDHF_H_ #define PWGHF_UTILS_UTILSTRKCANDHF_H_ -#include +#include "PWGHF/Utils/utilsAnalysis.h" #include +#include + #include namespace o2::hf_trkcandsel @@ -58,6 +60,29 @@ int countOnesInBinary(uint8_t num) return count; } +/// Single-track cuts on dcaXY +/// \param trackPar is the track parametrisation +/// \param dca is the 2-D array with track DCAs +/// \param binsPtTrack is the array of pt bins for track selection +/// \param cutsTrackDCA are the cuts for track DCA selection +/// \return true if track passes all cuts +template +bool isSelectedTrackDCA(const T1& trackPar, const T2& dca, const C1& binsPtTrack, const C2& cutsTrackDCA) +{ + auto binPtTrack = o2::analysis::findBin(binsPtTrack, trackPar.getPt()); + if (binPtTrack == -1) { + return false; + } + + if (std::abs(dca[0]) < cutsTrackDCA->get(binPtTrack, "min_dcaxytoprimary")) { + return false; // minimum DCAxy + } + if (std::abs(dca[0]) > cutsTrackDCA->get(binPtTrack, "max_dcaxytoprimary")) { + return false; // maximum DCAxy + } + return true; +} + } // namespace o2::hf_trkcandsel #endif // PWGHF_UTILS_UTILSTRKCANDHF_H_ From 0dba961e4c2f797f54a2766b3c8af53f1169cb22 Mon Sep 17 00:00:00 2001 From: Rik Spijkers <78484875+rspijkers@users.noreply.github.com> Date: Fri, 13 Jun 2025 16:46:08 +0200 Subject: [PATCH 1619/1650] [PWGLF] fix eta-cut in closure test correlations (#11606) --- PWGLF/Tasks/Strangeness/cascadecorrelations.cxx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx b/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx index 632d80dd4d1..0d6fd6d67cb 100644 --- a/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx +++ b/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx @@ -1080,7 +1080,7 @@ struct CascadeCorrelations { } // process mixed events Configurable etaGenCascades{"etaGenCascades", 0.8, "min/max of eta for generated cascades"}; - Filter genCascadesFilter = (nabs(aod::mcparticle::pdgCode) == 3312 && nabs(aod::mcparticle::eta) < etaGenCascades); + Filter genCascadesFilter = nabs(aod::mcparticle::pdgCode) == 3312; void processMC(aod::McCollision const&, soa::SmallGroups> const& collisions, soa::Filtered const& genCascades, aod::McParticles const& mcParticles) { @@ -1122,10 +1122,12 @@ struct CascadeCorrelations { auto trigger = *triggerAddress; auto assoc = *assocAddress; - double dphi = RecoDecay::constrainAngle(trigger.phi() - assoc.phi(), -PIHalf); - if (!trigger.isPhysicalPrimary() || !assoc.isPhysicalPrimary()) continue; // require the cascades to be primaries + if (trigger.eta() > etaGenCascades) + continue; // only apply eta cut to trigger - trigger normalization still valid without introducing 2-particle-acceptance effects + + double dphi = RecoDecay::constrainAngle(trigger.phi() - assoc.phi(), -PIHalf); if (trigger.pdgCode() < 0) { // anti-trigg --> Plus if (assoc.pdgCode() < 0) { // anti-assoc --> Plus From f4ae4d0ca81ec65321e9994d82c6f52ad1d6ce25 Mon Sep 17 00:00:00 2001 From: Debadatta3337 Date: Fri, 13 Jun 2025 21:49:36 +0530 Subject: [PATCH 1620/1650] [PWGDQ] Updated HistogramLibrary (#11575) Co-authored-by: Debadatta3337 --- PWGDQ/Core/HistogramsLibrary.cxx | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/PWGDQ/Core/HistogramsLibrary.cxx b/PWGDQ/Core/HistogramsLibrary.cxx index 9fdb5b0cae5..7b975b1c2be 100644 --- a/PWGDQ/Core/HistogramsLibrary.cxx +++ b/PWGDQ/Core/HistogramsLibrary.cxx @@ -84,11 +84,11 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h if (subGroupStr.Contains("mult")) { if (subGroupStr.Contains("pp")) { hm->AddHistogram(histClass, "MultTPC", "MultTPC", false, 250, 0.0, 500.0, VarManager::kMultTPC); - hm->AddHistogram(histClass, "MultFV0A", "MultFV0A", false, 250, 0.0, 500.0, VarManager::kMultFV0A); - hm->AddHistogram(histClass, "MultFT0A", "MultFT0A", false, 300, 0.0, 300.0, VarManager::kMultFT0A); - hm->AddHistogram(histClass, "MultFT0C", "MultFT0C", false, 300, 0.0, 300.0, VarManager::kMultFT0C); - hm->AddHistogram(histClass, "MultFDDA", "MultFDDA", false, 300, 0.0, 300.0, VarManager::kMultFDDA); - hm->AddHistogram(histClass, "MultFDDC", "MultFDDC", false, 50, 0.0, 50.0, VarManager::kMultFDDC); + hm->AddHistogram(histClass, "MultFV0A", "MultFV0A", false, 1000, 0.0, 25000.0, VarManager::kMultFV0A); + hm->AddHistogram(histClass, "MultFT0A", "MultFT0A", false, 1000, 0.0, 25000.0, VarManager::kMultFT0A); + hm->AddHistogram(histClass, "MultFT0C", "MultFT0C", false, 1000, 0.0, 25000.0, VarManager::kMultFT0C); + hm->AddHistogram(histClass, "MultFDDA", "MultFDDA", false, 1000, 0.0, 25000.0, VarManager::kMultFDDA); + hm->AddHistogram(histClass, "MultFDDC", "MultFDDC", false, 1000, 0.0, 25000.0, VarManager::kMultFDDC); hm->AddHistogram(histClass, "MultTracklets", "MultTracklets", false, 250, 0.0, 250.0, VarManager::kMultTracklets); hm->AddHistogram(histClass, "VtxNContribReal", "Vtx n contributors", false, 150, 0.0, 150.0, VarManager::kVtxNcontribReal); hm->AddHistogram(histClass, "VtxNContrib", "Vtx n contributors", false, 100, 0.0, 100.0, VarManager::kVtxNcontrib); @@ -115,6 +115,11 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "VtxZ_VtxNcontribReal", "VtxZ vs VtxNcontribReal", false, 100, -10.0, 10.0, VarManager::kVtxZ, 150, 0, 150.0, VarManager::kVtxNcontribReal); hm->AddHistogram(histClass, "VtxZ_MultNTracksPVeta1", "VtxZ vs MultNTracksPVeta1", false, 100, -10.0, 10.0, VarManager::kVtxZ, 150, 0, 150.0, VarManager::kMultNTracksPVeta1); hm->AddHistogram(histClass, "VtxZ_MultNTracksPVetaHalf", "VtxZ vs MultNTracksPVetaHalf", false, 100, -10.0, 10.0, VarManager::kVtxZ, 150, 0, 150.0, VarManager::kMultNTracksPVetaHalf); + hm->AddHistogram(histClass, "VtxZ_MultFV0A", "VtxZ vs MultFV0A", false, 20, -10.0, 10.0, VarManager::kVtxZ, 200, 0, 25000.0, VarManager::kMultFV0A); + hm->AddHistogram(histClass, "VtxZ_MultFT0A", "VtxZ vs MultFT0A", false, 20, -10.0, 10.0, VarManager::kVtxZ, 200, 0, 25000.0, VarManager::kMultFT0A); + hm->AddHistogram(histClass, "VtxZ_MultFT0C", "VtxZ vs MultFT0C", false, 20, -10.0, 10.0, VarManager::kVtxZ, 200, 0, 25000.0, VarManager::kMultFT0C); + hm->AddHistogram(histClass, "VtxZ_MultFDDA", "VtxZ vs MultFDDA", false, 20, -10.0, 10.0, VarManager::kVtxZ, 200, 0, 25000.0, VarManager::kMultFDDA); + hm->AddHistogram(histClass, "VtxZ_MultFDDC", "VtxZ vs MultFDDC", false, 20, -10.0, 10.0, VarManager::kVtxZ, 200, 0, 25000.0, VarManager::kMultFDDC); } else { hm->AddHistogram(histClass, "MultTPC", "MultTPC", false, 200, 0.0, 50000.0, VarManager::kMultTPC); @@ -944,6 +949,13 @@ void o2::aod::dqhistograms::DefineHistograms(HistogramManager* hm, const char* h hm->AddHistogram(histClass, "Mass_MultNTracksPVetaHalf", "Mass vs MultNTracksPVetaHalf", false, 200, 2.0, 5.0, VarManager::kMass, 150, 0, 150.0, VarManager::kMultNTracksPVetaHalf); hm->AddHistogram(histClass, "Mass_MultNTracksPVeta1", "Mass vs MultNTracksPVeta1", false, 200, 2.0, 5.0, VarManager::kMass, 150, 0, 150.0, VarManager::kMultNTracksPVeta1); } + if (subGroupStr.Contains("dimuon_fwdmult")) { + hm->AddHistogram(histClass, "Mass_MultFV0A", "Mass vs MultFV0A", false, 200, 2.0, 5.0, VarManager::kMass, 1000, 0, 25000.0, VarManager::kMultFV0A); + hm->AddHistogram(histClass, "Mass_MultFT0A", "Mass vs MultFT0A", false, 200, 2.0, 5.0, VarManager::kMass, 1000, 0, 25000.0, VarManager::kMultFT0A); + hm->AddHistogram(histClass, "Mass_MultFT0C", "Mass vs MultFT0C", false, 200, 2.0, 5.0, VarManager::kMass, 1000, 0, 25000.0, VarManager::kMultFT0C); + hm->AddHistogram(histClass, "Mass_MultFDDA", "Mass vs MultFDDA", false, 200, 2.0, 5.0, VarManager::kMass, 1000, 0, 25000.0, VarManager::kMultFDDA); + hm->AddHistogram(histClass, "Mass_MultFDDC", "Mass vs MultFDDC", false, 200, 2.0, 5.0, VarManager::kMass, 1000, 0, 25000.0, VarManager::kMultFDDC); + } if (subGroupStr.Contains("barrel")) { hm->AddHistogram(histClass, "Mass", "", false, 500, 0.0, 5.0, VarManager::kMass); hm->AddHistogram(histClass, "Mass_HighRange", "", false, 375, 0.0, 15.0, VarManager::kMass); From e0148f85383b95a5e9fff86886f6f96fc308a764 Mon Sep 17 00:00:00 2001 From: dyx-11 <1260971129@qq.com> Date: Sat, 14 Jun 2025 01:50:28 +0800 Subject: [PATCH 1621/1650] [PWGUD] nch axis to nsample axis new (#11599) --- PWGUD/Tasks/flowCorrelationsUpc.cxx | 57 ++++++++++++++++------------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/PWGUD/Tasks/flowCorrelationsUpc.cxx b/PWGUD/Tasks/flowCorrelationsUpc.cxx index 59aae4d6c86..11f7820a071 100644 --- a/PWGUD/Tasks/flowCorrelationsUpc.cxx +++ b/PWGUD/Tasks/flowCorrelationsUpc.cxx @@ -14,29 +14,31 @@ /// \author Mingrui Zhao (mingrui.zhao@cern.ch, mingrui.zhao@mail.labz0.org) /// copied from Thor Jensen (thor.kjaersgaard.jensen@cern.ch) and Debojit Sarkar (debojit.sarkar@cern.ch) -#include +#include "PWGCF/Core/CorrelationContainer.h" +#include "PWGCF/Core/PairCuts.h" +#include "PWGCF/DataModel/CorrelationsDerived.h" +#include "PWGUD/Core/SGSelector.h" +#include "PWGUD/DataModel/UDTables.h" -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoAHelpers.h" +#include "Common/Core/RecoDecay.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/TrackSelectionTables.h" + +#include "CCDB/BasicCCDBManager.h" +#include "CommonConstants/MathConstants.h" #include "Framework/ASoA.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" #include "Framework/HistogramRegistry.h" #include "Framework/RunningWorkflowInfo.h" -#include "CommonConstants/MathConstants.h" -#include "CCDB/BasicCCDBManager.h" -#include "Common/Core/RecoDecay.h" +#include "Framework/runDataProcessing.h" -#include "PWGUD/DataModel/UDTables.h" -#include "PWGUD/Core/SGSelector.h" +#include "TRandom3.h" -#include "Common/DataModel/EventSelection.h" -#include "Common/DataModel/TrackSelectionTables.h" -#include "Common/DataModel/Centrality.h" -#include "Common/DataModel/Multiplicity.h" -#include "PWGCF/DataModel/CorrelationsDerived.h" -#include "PWGCF/Core/CorrelationContainer.h" -#include "PWGCF/Core/PairCuts.h" +#include namespace o2::aod { @@ -98,6 +100,7 @@ struct FlowCorrelationsUpc { O2_DEFINE_CONFIGURABLE(cfgMinMixEventNum, int, 5, "Minimum number of events to mix") O2_DEFINE_CONFIGURABLE(cfgMinMult, int, 0, "Minimum multiplicity for collision") O2_DEFINE_CONFIGURABLE(cfgMaxMult, int, 10, "Maximum multiplicity for collision") + O2_DEFINE_CONFIGURABLE(cfgSampleSize, double, 10, "Sample size for mixed event") ConfigurableAxis axisVertex{"axisVertex", {10, -10, 10}, "vertex axis for histograms"}; ConfigurableAxis axisEta{"axisEta", {40, -1., 1.}, "eta axis for histograms"}; @@ -114,6 +117,7 @@ struct FlowCorrelationsUpc { ConfigurableAxis axisVertexEfficiency{"axisVertexEfficiency", {10, -10, 10}, "vertex axis for efficiency histograms"}; ConfigurableAxis axisEtaEfficiency{"axisEtaEfficiency", {20, -1.0, 1.0}, "eta axis for efficiency histograms"}; ConfigurableAxis axisPtEfficiency{"axisPtEfficiency", {VARIABLE_WIDTH, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0}, "pt axis for efficiency histograms"}; + ConfigurableAxis axisSample{"axisSample", {cfgSampleSize, 0, cfgSampleSize}, "sample axis for histograms"}; // Added UPC Cuts SGSelector sgSelector; @@ -149,11 +153,11 @@ struct FlowCorrelationsUpc { registry.add("Nch", "N_{ch}", {HistType::kTH1D, {axisMultiplicity}}); registry.add("zVtx", "zVtx", {HistType::kTH1D, {axisVertex}}); - registry.add("Trig_hist", "", {HistType::kTHnSparseF, {{axisMultiplicity, axisVertex, axisPtTrigger}}}); + registry.add("Trig_hist", "", {HistType::kTHnSparseF, {{axisSample, axisVertex, axisPtTrigger}}}); registry.add("eventcount", "bin", {HistType::kTH1F, {{3, 0, 3, "bin"}}}); // histogram to see how many events are in the same and mixed event - std::vector corrAxis = {{axisMultiplicity, "Nch"}, + std::vector corrAxis = {{axisSample, "Sample"}, {axisVertex, "z-vtx (cm)"}, {axisPtTrigger, "p_{T} (GeV/c)"}, {axisPtAssoc, "p_{T} (GeV/c)"}, @@ -190,13 +194,16 @@ struct FlowCorrelationsUpc { } template - void fillCorrelations(TTracks tracks1, TTracks tracks2, float posZ, int system, float Nch) // function to fill the Output functions (sparse) and the delta eta and delta phi histograms + void fillCorrelations(TTracks tracks1, TTracks tracks2, float posZ, int system) // function to fill the Output functions (sparse) and the delta eta and delta phi histograms { + + int fSampleIndex = gRandom->Uniform(0, cfgSampleSize); + // loop over all tracks for (auto const& track1 : tracks1) { if (system == SameEvent) { - registry.fill(HIST("Trig_hist"), Nch, posZ, track1.pt()); + registry.fill(HIST("Trig_hist"), fSampleIndex, posZ, track1.pt()); } for (auto const& track2 : tracks2) { @@ -213,10 +220,10 @@ struct FlowCorrelationsUpc { // fill the right sparse and histograms if (system == SameEvent) { - same->getPairHist()->Fill(step, Nch, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta); + same->getPairHist()->Fill(step, fSampleIndex, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta); registry.fill(HIST("deltaEta_deltaPhi_same"), deltaPhi, deltaEta); } else if (system == MixedEvent) { - mixed->getPairHist()->Fill(step, Nch, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta); + mixed->getPairHist()->Fill(step, fSampleIndex, posZ, track1.pt(), track2.pt(), deltaPhi, deltaEta); registry.fill(HIST("deltaEta_deltaPhi_mixed"), deltaPhi, deltaEta); } } @@ -247,7 +254,7 @@ struct FlowCorrelationsUpc { registry.fill(HIST("eventcount"), SameEvent); // because its same event i put it in the 1 bin fillYield(collision, tracks); - fillCorrelations(tracks, tracks, collision.posZ(), SameEvent, tracks.size()); // fill the SE histogram and Sparse + fillCorrelations(tracks, tracks, collision.posZ(), SameEvent); // fill the SE histogram and Sparse } PROCESS_SWITCH(FlowCorrelationsUpc, processSame, "Process same event", true); @@ -265,7 +272,7 @@ struct FlowCorrelationsUpc { for (auto const& [collision1, tracks1, collision2, tracks2] : pairs) { registry.fill(HIST("eventcount"), MixedEvent); // fill the mixed event in the 3 bin - fillCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent, tracks1.size()); + fillCorrelations(tracks1, tracks2, collision1.posZ(), MixedEvent); } } PROCESS_SWITCH(FlowCorrelationsUpc, processMixed, "Process mixed events", true); From 313ef43e2d7fef64c06784830892e7790ab33c9f Mon Sep 17 00:00:00 2001 From: omvazque Date: Fri, 13 Jun 2025 13:15:04 -0500 Subject: [PATCH 1622/1650] [PWGLF] Using global ccdb and fixed a bug (#11609) --- PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx index 478c49fae87..02874f91014 100644 --- a/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/uccZdc.cxx @@ -83,6 +83,7 @@ struct UccZdc { Configurable isZEMcut{"isZEMcut", true, "Use ZEM cut"}; Configurable useMidRapNchSel{"useMidRapNchSel", true, "Use mid-rapidit Nch selection"}; Configurable applyEff{"applyEff", true, "Apply track-by-track efficiency correction"}; + Configurable applyFD{"applyFD", false, "Apply track-by-track feed down correction"}; Configurable correctNch{"correctNch", true, "Correct also Nch"}; // Event selection @@ -165,6 +166,8 @@ struct UccZdc { HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; Service ccdb; + TH1F* fd = nullptr; + void init(InitContext const&) { // define axes you want to use @@ -299,6 +302,7 @@ struct UccZdc { LOG(info) << "\tccdbNoLaterThan=" << ccdbNoLaterThan.value; LOG(info) << "\tapplyEff=" << applyEff.value; + LOG(info) << "\tapplyFD=" << applyFD.value; LOG(info) << "\tcorrectNch=" << correctNch.value; LOG(info) << "\tpaTHEff=" << paTHEff.value; LOG(info) << "\tpaTHFD=" << paTHFD.value; @@ -318,6 +322,11 @@ struct UccZdc { // Not later than now, will be replaced by the value of the train creation // This avoids that users can replace objects **while** a train is running ccdb->setCreatedNotAfter(ccdbNoLaterThan.value); + // Feed Down is the same for all runs -> use a global object + fd = ccdb->getForTimeStamp(paTHFD.value, ccdbNoLaterThan.value); + if (!fd) { + LOGF(fatal, "Feed Down object not found!"); + } } template @@ -697,8 +706,7 @@ struct UccZdc { } auto efficiency = ccdb->getForTimeStamp(paTHEff.value, foundBC.timestamp()); - auto fd = ccdb->getForTimeStamp(paTHFD.value, foundBC.timestamp()); - if (!efficiency || !fd) { + if (!efficiency) { return; } @@ -756,6 +764,9 @@ struct UccZdc { effValue = efficiency->GetBinContent(efficiency->FindBin(pt)); fdValue = fd->GetBinContent(fd->FindBin(pt)); } + if (applyEff && !applyFD) { + fdValue = 1.0; + } if ((effValue > 0.) && (fdValue > 0.)) { pTs.emplace_back(pt); vecOneOverEff.emplace_back(1. / effValue); @@ -844,8 +855,7 @@ struct UccZdc { // To use run-by-run efficiency const auto& foundBC = collision.foundBC_as(); auto efficiency = ccdb->getForTimeStamp(paTHEff.value, foundBC.timestamp()); - auto fd = ccdb->getForTimeStamp(paTHFD.value, foundBC.timestamp()); - if (!efficiency || !fd) { + if (!efficiency) { return; } @@ -930,7 +940,7 @@ struct UccZdc { } double nchMC{0}; - nchMult = std::accumulate(vecFullEff.begin(), vecFullEff.end(), 0); + nchMC = std::accumulate(vecFullEff.begin(), vecFullEff.end(), 0); if (nchMC < minNchSel) { continue; } From db8e9be9446b0049f7ad07f903a56cef8a959e38 Mon Sep 17 00:00:00 2001 From: Banajit Barman <113376372+BanajitBarman@users.noreply.github.com> Date: Fri, 13 Jun 2025 21:21:35 +0200 Subject: [PATCH 1623/1650] [PWGLF] added configurable enablePureDCAHistogram for enabling pure DCA histogram based on nsigmaTPCKa cut (#11593) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Nicolò Jacazio Co-authored-by: ALICE Action Bot --- PWGLF/Tasks/Nuspex/spectraTOF.cxx | 224 ++++++++++++++++-------------- 1 file changed, 118 insertions(+), 106 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/spectraTOF.cxx b/PWGLF/Tasks/Nuspex/spectraTOF.cxx index e1607610ac6..bff2593257a 100644 --- a/PWGLF/Tasks/Nuspex/spectraTOF.cxx +++ b/PWGLF/Tasks/Nuspex/spectraTOF.cxx @@ -18,6 +18,7 @@ /// // O2 includes + #include #include #include "ReconstructionDataFormats/Track.h" @@ -97,6 +98,7 @@ struct tofSpectra { } trkselOptions; Configurable enableDcaGoodEvents{"enableDcaGoodEvents", true, "Enables the MC plots with the correct match between data and MC"}; + Configurable enablePureDCAHistogram{"enablePureDCAHistogram", false, "Enables the pure DCA histograms"}; Configurable enableTrackCutHistograms{"enableTrackCutHistograms", true, "Enables track cut histograms, before and after the cut"}; Configurable enableDeltaHistograms{"enableDeltaHistograms", true, "Enables the delta TPC and TOF histograms"}; Configurable enableTPCTOFHistograms{"enableTPCTOFHistograms", true, "Enables TPC TOF histograms"}; @@ -1017,7 +1019,6 @@ struct tofSpectra { } } } - if constexpr (fillFullInfo) { if (enableDeltaHistograms) { const auto& deltaTOF = o2::aod::pidutils::tofExpSignalDiff(track); @@ -1036,7 +1037,6 @@ struct tofSpectra { } } } - // Filling DCA info with the TPC+TOF PID bool isDCAPureSample = (std::sqrt(nsigmaTOF * nsigmaTOF + nsigmaTPC * nsigmaTPC) < 2.f); if (track.pt() <= 0.4) { @@ -1906,130 +1906,138 @@ struct tofSpectra { if (std::abs(mcParticle.y()) > trkselOptions.cfgCutY) { return; } + if (enablePureDCAHistogram) { + const auto& nsigmaTPCKa = o2::aod::pidutils::tpcNSigma<3>(track); + const auto& nsigmaTOFKa = o2::aod::pidutils::tofNSigma<3>(track); - const auto& nsigmaTPCKa = o2::aod::pidutils::tpcNSigma<3>(track); - const bool isKaonTPC = std::abs(nsigmaTPCKa) < trkselOptions.cfgCutNsigma; - - const auto& nsigmaTOFKa = o2::aod::pidutils::tofNSigma<3>(track); - const bool isKaonTOF = std::abs(nsigmaTOFKa) < trkselOptions.cfgCutNsigma; - - // Filling DCA info with the TPC+TOF PID - bool isDCAPureSample = (std::sqrt(nsigmaTOFKa * nsigmaTOFKa + nsigmaTPCKa * nsigmaTPCKa) < 2.f); - if (track.pt() <= 0.4) { - isDCAPureSample = (nsigmaTPCKa < 1.f); - } - - if (isDCAPureSample) { - if (enableDCAvsmotherHistograms) { - hDcaXYMC[i]->Fill(track.pt(), track.dcaXY()); - hDcaZMC[i]->Fill(track.pt(), track.dcaZ()); + // Filling DCA info with the TPC+TOF PID + bool isDCAPureSample = (std::sqrt(nsigmaTOFKa * nsigmaTOFKa + nsigmaTPCKa * nsigmaTPCKa) < 2.f); + if (track.pt() <= 0.4) { + isDCAPureSample = (nsigmaTPCKa < 1.f); } - if (!mcParticle.isPhysicalPrimary()) { // Secondaries (weak decays and material) - if (mcParticle.getProcess() == 4) { // Particles from decay - if (enableDCAxyzHistograms) { - hDcaXYZStr[i]->Fill(track.pt(), track.dcaXY(), track.dcaZ()); - } else { - histos.fill(HIST(hdcaxystr[i]), track.pt(), track.dcaXY()); - histos.fill(HIST(hdcazstr[i]), track.pt(), track.dcaZ()); - } + if (isDCAPureSample) { + if (enableDCAvsmotherHistograms) { + hDcaXYMC[i]->Fill(track.pt(), track.dcaXY()); + hDcaZMC[i]->Fill(track.pt(), track.dcaZ()); + } - if (mcParticle.has_mothers()) { - for (const auto& mother : mcParticle.template mothers_as()) { - auto daughter0 = mother.template daughters_as().begin(); - double vertexDau[3] = {daughter0.vx(), daughter0.vy(), daughter0.vz()}; - double vertexMoth[3] = {mother.vx(), mother.vy(), mother.vz()}; - auto decayLength = RecoDecay::distance(vertexMoth, vertexDau); - hDecayLengthStr[i]->Fill(track.pt(), decayLength); + if (!mcParticle.isPhysicalPrimary()) { // Secondaries (weak decays and material) + if (mcParticle.getProcess() == 4) { // Particles from decay + if (enableDCAxyzHistograms) { + hDcaXYZStr[i]->Fill(track.pt(), track.dcaXY(), track.dcaZ()); + } else { + histos.fill(HIST(hdcaxystr[i]), track.pt(), track.dcaXY()); + histos.fill(HIST(hdcazstr[i]), track.pt(), track.dcaZ()); + } + + if (mcParticle.has_mothers()) { + for (const auto& mother : mcParticle.template mothers_as()) { + auto daughter0 = mother.template daughters_as().begin(); + double vertexDau[3] = {daughter0.vx(), daughter0.vy(), daughter0.vz()}; + double vertexMoth[3] = {mother.vx(), mother.vy(), mother.vz()}; + auto decayLength = RecoDecay::distance(vertexMoth, vertexDau); + hDecayLengthStr[i]->Fill(track.pt(), decayLength); + } + } + } else { // Particles from the material + if (enableDCAxyzHistograms) { + hDcaXYZMat[i]->Fill(track.pt(), track.dcaXY(), track.dcaZ()); + } else { + histos.fill(HIST(hdcaxymat[i]), track.pt(), track.dcaXY()); + histos.fill(HIST(hdcazmat[i]), track.pt(), track.dcaZ()); } } - } else { // Particles from the material + } else { // Primaries if (enableDCAxyzHistograms) { - hDcaXYZMat[i]->Fill(track.pt(), track.dcaXY(), track.dcaZ()); + hDcaXYZPrm[i]->Fill(track.pt(), track.dcaXY(), track.dcaZ()); + if (enableDcaGoodEvents.value && collision.has_mcCollision()) { + histos.fill(HIST(hdcaxyprmgoodevs[i]), track.pt(), track.dcaXY(), track.dcaZ()); + } } else { - histos.fill(HIST(hdcaxymat[i]), track.pt(), track.dcaXY()); - histos.fill(HIST(hdcazmat[i]), track.pt(), track.dcaZ()); + // DCAxy for all primaries + histos.fill(HIST(hdcaxyprm[i]), track.pt(), track.dcaXY()); + histos.fill(HIST(hdcazprm[i]), track.pt(), track.dcaZ()); } - } - } else { // Primaries - if (enableDCAxyzHistograms) { - hDcaXYZPrm[i]->Fill(track.pt(), track.dcaXY(), track.dcaZ()); if (enableDcaGoodEvents.value && collision.has_mcCollision()) { - histos.fill(HIST(hdcaxyprmgoodevs[i]), track.pt(), track.dcaXY(), track.dcaZ()); + histos.fill(HIST(hdcaxyprmgoodevs[i]), track.pt(), track.dcaXY()); + histos.fill(HIST(hdcazprmgoodevs[i]), track.pt(), track.dcaZ()); } - } else { - // DCAxy for all primaries - histos.fill(HIST(hdcaxyprm[i]), track.pt(), track.dcaXY()); - histos.fill(HIST(hdcazprm[i]), track.pt(), track.dcaZ()); - } - if (enableDcaGoodEvents.value && collision.has_mcCollision()) { - histos.fill(HIST(hdcaxyprmgoodevs[i]), track.pt(), track.dcaXY()); - histos.fill(HIST(hdcazprmgoodevs[i]), track.pt(), track.dcaZ()); - } - if (enableDCAvsmotherHistograms) { - bool IsD0Mother = false; - bool IsCharmMother = false; - bool IsBeautyMother = false; - bool IsNotHFMother = false; - if (mcParticle.has_mothers()) { - const int charmOrigin = RecoDecay::getCharmHadronOrigin(mcParticles, mcParticle, false); - for (const auto& mother : mcParticle.template mothers_as()) { - const int motherPdgCode = std::abs(mother.pdgCode()); - if (motherPdgCode == 421) { - IsD0Mother = true; - } - if (charmOrigin == RecoDecay::OriginType::NonPrompt) { - IsBeautyMother = true; - } - if (charmOrigin == RecoDecay::OriginType::Prompt) { - IsCharmMother = true; - } - if (charmOrigin == RecoDecay::OriginType::None) { - IsNotHFMother = true; + if (enableDCAvsmotherHistograms) { + bool IsD0Mother = false; + bool IsCharmMother = false; + bool IsBeautyMother = false; + bool IsNotHFMother = false; + if (mcParticle.has_mothers()) { + const int charmOrigin = RecoDecay::getCharmHadronOrigin(mcParticles, mcParticle, false); + for (const auto& mother : mcParticle.template mothers_as()) { + const int motherPdgCode = std::abs(mother.pdgCode()); + if (motherPdgCode == 421) { + IsD0Mother = true; + } + if (charmOrigin == RecoDecay::OriginType::NonPrompt) { + IsBeautyMother = true; + } + if (charmOrigin == RecoDecay::OriginType::Prompt) { + IsCharmMother = true; + } + if (charmOrigin == RecoDecay::OriginType::None) { + IsNotHFMother = true; + } } } - } - if (IsD0Mother) { - hDcaXYMCD0[i]->Fill(track.pt(), track.dcaXY()); - hDcaZMCD0[i]->Fill(track.pt(), track.dcaZ()); - } - if (IsCharmMother) { - hDcaXYMCCharm[i]->Fill(track.pt(), track.dcaXY()); - hdcaZMCCharm[i]->Fill(track.pt(), track.dcaZ()); - } - if (IsBeautyMother) { - hDcaXYMCBeauty[i]->Fill(track.pt(), track.dcaXY()); - hDcaZMCBeauty[i]->Fill(track.pt(), track.dcaZ()); - } - if (IsNotHFMother) { - hDcaXYMCNotHF[i]->Fill(track.pt(), track.dcaXY()); - hDcaZMCNotHF[i]->Fill(track.pt(), track.dcaZ()); - } - - if (mcParticle.has_mothers()) { - for (const auto& mother : mcParticle.template mothers_as()) { - auto daughter0 = mother.template daughters_as().begin(); - double vertexDau[3] = {daughter0.vx(), daughter0.vy(), daughter0.vz()}; - double vertexMoth[3] = {mother.vx(), mother.vy(), mother.vz()}; - auto decayLength = RecoDecay::distance(vertexMoth, vertexDau); + if (IsD0Mother) { + hDcaXYMCD0[i]->Fill(track.pt(), track.dcaXY()); + hDcaZMCD0[i]->Fill(track.pt(), track.dcaZ()); + } + if (IsCharmMother) { + hDcaXYMCCharm[i]->Fill(track.pt(), track.dcaXY()); + hdcaZMCCharm[i]->Fill(track.pt(), track.dcaZ()); + } + if (IsBeautyMother) { + hDcaXYMCBeauty[i]->Fill(track.pt(), track.dcaXY()); + hDcaZMCBeauty[i]->Fill(track.pt(), track.dcaZ()); + } + if (IsNotHFMother) { + hDcaXYMCNotHF[i]->Fill(track.pt(), track.dcaXY()); + hDcaZMCNotHF[i]->Fill(track.pt(), track.dcaZ()); + } - if (IsD0Mother) { - hDecayLengthMCD0[i]->Fill(track.pt(), decayLength); - } - if (IsCharmMother) { - hDecayLengthMCCharm[i]->Fill(track.pt(), decayLength); - } - if (IsBeautyMother) { - hDecayLengthMCBeauty[i]->Fill(track.pt(), decayLength); - } - if (IsNotHFMother) { - hDecayLengthMCNotHF[i]->Fill(track.pt(), decayLength); + if (mcParticle.has_mothers()) { + for (const auto& mother : mcParticle.template mothers_as()) { + auto daughter0 = mother.template daughters_as().begin(); + double vertexDau[3] = {daughter0.vx(), daughter0.vy(), daughter0.vz()}; + double vertexMoth[3] = {mother.vx(), mother.vy(), mother.vz()}; + auto decayLength = RecoDecay::distance(vertexMoth, vertexDau); + + if (IsD0Mother) { + hDecayLengthMCD0[i]->Fill(track.pt(), decayLength); + } + if (IsCharmMother) { + hDecayLengthMCCharm[i]->Fill(track.pt(), decayLength); + } + if (IsBeautyMother) { + hDecayLengthMCBeauty[i]->Fill(track.pt(), decayLength); + } + if (IsNotHFMother) { + hDecayLengthMCNotHF[i]->Fill(track.pt(), decayLength); + } } } } } } + } else { + if (!mcParticle.isPhysicalPrimary()) { + if (mcParticle.getProcess() == 4) { + histos.fill(HIST(hdcaxystr[i]), track.pt(), track.dcaXY()); + } else { + histos.fill(HIST(hdcaxymat[i]), track.pt(), track.dcaXY()); + } + } else { + histos.fill(HIST(hdcaxyprm[i]), track.pt(), track.dcaXY()); + } } if ((collision.has_mcCollision() && (mcParticle.mcCollisionId() != collision.mcCollisionId())) || !collision.has_mcCollision()) { @@ -2049,15 +2057,19 @@ struct tofSpectra { } const int pdgCode = mcParticle.pdgCode(); const auto& nsigmaTPCPi = o2::aod::pidutils::tpcNSigma<2>(track); + const auto& nsigmaTPCKa = o2::aod::pidutils::tpcNSigma<3>(track); const auto& nsigmaTPCPr = o2::aod::pidutils::tpcNSigma<4>(track); const bool isPionTPC = std::abs(nsigmaTPCPi) < trkselOptions.cfgCutNsigma; + const bool isKaonTPC = std::abs(nsigmaTPCKa) < trkselOptions.cfgCutNsigma; const bool isProtonTPC = std::abs(nsigmaTPCPr) < trkselOptions.cfgCutNsigma; const auto& nsigmaTOFPi = o2::aod::pidutils::tofNSigma<2>(track); + const auto& nsigmaTOFKa = o2::aod::pidutils::tofNSigma<3>(track); const auto& nsigmaTOFPr = o2::aod::pidutils::tofNSigma<4>(track); const bool isPionTOF = std::abs(nsigmaTOFPi) < trkselOptions.cfgCutNsigma; + const bool isKaonTOF = std::abs(nsigmaTOFKa) < trkselOptions.cfgCutNsigma; const bool isProtonTOF = std::abs(nsigmaTOFPr) < trkselOptions.cfgCutNsigma; if (!mcParticle.isPhysicalPrimary()) { // Is not physical primary From 373ae368a8038cbf4c30d075f470e72ad1efb9a8 Mon Sep 17 00:00:00 2001 From: fuchuncui <162277233+fuchuncui@users.noreply.github.com> Date: Sat, 14 Jun 2025 03:54:47 +0800 Subject: [PATCH 1624/1650] [PWGCF] Add v3 flow and optimized track selection (#11601) --- PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx | 946 +++++++++++++++++----------- 1 file changed, 592 insertions(+), 354 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx b/PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx index c4d9d5d0ef7..de63cd2a413 100644 --- a/PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx +++ b/PWGCF/Flow/Tasks/flowGfwOmegaXi.cxx @@ -14,39 +14,45 @@ /// \since Sep/13/2024 /// \brief This task is to caculate V0s and cascades flow by GenericFramework -#include -#include -#include -#include -#include -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/ASoAHelpers.h" -#include "Framework/RunningWorkflowInfo.h" -#include "Framework/HistogramRegistry.h" -#include "Common/DataModel/EventSelection.h" -#include "Common/Core/TrackSelection.h" -#include "Common/DataModel/TrackSelectionTables.h" -#include "Common/DataModel/Centrality.h" -#include "Common/DataModel/PIDResponse.h" -#include "Common/DataModel/Multiplicity.h" -#include "GFWPowerArray.h" #include "GFW.h" #include "GFWCumulant.h" +#include "GFWPowerArray.h" #include "GFWWeights.h" -#include "Common/DataModel/Qvectors.h" -#include "Common/Core/EventPlaneHelper.h" -#include "ReconstructionDataFormats/Track.h" -#include "CommonConstants/PhysicsConstants.h" -#include "Common/Core/trackUtilities.h" + #include "PWGLF/DataModel/LFStrangenessTables.h" #include "PWGMM/Mult/DataModel/Index.h" + +#include "Common/Core/EventPlaneHelper.h" +#include "Common/Core/TrackSelection.h" +#include "Common/Core/trackUtilities.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/PIDResponseITS.h" +#include "Common/DataModel/Qvectors.h" +#include "Common/DataModel/TrackSelectionTables.h" + +#include "CommonConstants/PhysicsConstants.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/RunningWorkflowInfo.h" +#include "Framework/runDataProcessing.h" +#include "ReconstructionDataFormats/Track.h" +#include + #include "TList.h" -#include -#include #include #include #include +#include +#include + +#include +#include +#include +#include using namespace o2; using namespace o2::framework; @@ -55,14 +61,19 @@ namespace { std::shared_ptr refc22[10]; std::shared_ptr refc24[10]; +std::shared_ptr refc32[10]; std::shared_ptr k0sc22[10]; std::shared_ptr k0sc24[10]; +std::shared_ptr k0sc32[10]; std::shared_ptr lambdac22[10]; std::shared_ptr lambdac24[10]; +std::shared_ptr lambdac32[10]; std::shared_ptr xic22[10]; std::shared_ptr xic24[10]; +std::shared_ptr xic32[10]; std::shared_ptr omegac22[10]; std::shared_ptr omegac24[10]; +std::shared_ptr omegac32[10]; } // namespace #define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable NAME{#NAME, DEFAULT, HELP}; @@ -70,39 +81,64 @@ std::shared_ptr omegac24[10]; struct FlowGfwOmegaXi { O2_DEFINE_CONFIGURABLE(cfgCutVertex, float, 10.0f, "Accepted z-vertex range") - O2_DEFINE_CONFIGURABLE(cfgCutPtPOIMin, float, 0.2f, "Minimal pT for poi tracks") - O2_DEFINE_CONFIGURABLE(cfgCutPtPOIMax, float, 10.0f, "Maximal pT for poi tracks") - O2_DEFINE_CONFIGURABLE(cfgCutPtMin, float, 0.2f, "Minimal pT for ref tracks") - O2_DEFINE_CONFIGURABLE(cfgCutPtMax, float, 10.0f, "Maximal pT for ref tracks") - O2_DEFINE_CONFIGURABLE(cfgCutEta, float, 0.8f, "Eta range for tracks") O2_DEFINE_CONFIGURABLE(cfgCutChi2prTPCcls, float, 2.5, "Chi2 per TPC clusters") O2_DEFINE_CONFIGURABLE(cfgCutOccupancyHigh, int, 500, "High cut on TPC occupancy") O2_DEFINE_CONFIGURABLE(cfgMassBins, std::vector, (std::vector{80, 32, 14, 16}), "Number of K0s, Lambda, Xi, Omega mass axis bins for c22") O2_DEFINE_CONFIGURABLE(cfgDeltaPhiLocDen, int, 3, "Number of delta phi for local density, 200 bins in 2 pi") - // topological cut for V0 - O2_DEFINE_CONFIGURABLE(cfgv0_radius, float, 5.0f, "minimum decay radius") - O2_DEFINE_CONFIGURABLE(cfgv0_v0cospa, float, 0.995f, "minimum cosine of pointing angle") - O2_DEFINE_CONFIGURABLE(cfgv0_dcadautopv, float, 0.1f, "minimum daughter DCA to PV") - O2_DEFINE_CONFIGURABLE(cfgv0_dcav0dau, float, 0.5f, "maximum DCA among V0 daughters") - O2_DEFINE_CONFIGURABLE(cfgv0_mk0swindow, float, 0.1f, "Invariant mass window of K0s") - O2_DEFINE_CONFIGURABLE(cfgv0_mlambdawindow, float, 0.04f, "Invariant mass window of lambda") - O2_DEFINE_CONFIGURABLE(cfgv0_ArmPodocut, float, 0.2f, "Armenteros Podolski cut for K0") - // topological cut for cascade - O2_DEFINE_CONFIGURABLE(cfgcasc_radius, float, 0.5f, "minimum decay radius") - O2_DEFINE_CONFIGURABLE(cfgcasc_casccospa, float, 0.999f, "minimum cosine of pointing angle") - O2_DEFINE_CONFIGURABLE(cfgcasc_v0cospa, float, 0.998f, "minimum cosine of pointing angle") - O2_DEFINE_CONFIGURABLE(cfgcasc_dcav0topv, float, 0.01f, "minimum daughter DCA to PV") - O2_DEFINE_CONFIGURABLE(cfgcasc_dcabachtopv, float, 0.01f, "minimum bachelor DCA to PV") - O2_DEFINE_CONFIGURABLE(cfgcasc_dcacascdau, float, 0.3f, "maximum DCA among cascade daughters") - O2_DEFINE_CONFIGURABLE(cfgcasc_dcav0dau, float, 1.0f, "maximum DCA among V0 daughters") - O2_DEFINE_CONFIGURABLE(cfgcasc_mlambdawindow, float, 0.04f, "Invariant mass window of lambda") - // track quality and type selections - O2_DEFINE_CONFIGURABLE(cfgtpcclusters, int, 70, "minimum number of TPC clusters requirement") - O2_DEFINE_CONFIGURABLE(cfgitsclusters, int, 1, "minimum number of ITS clusters requirement") - O2_DEFINE_CONFIGURABLE(cfgtpcclufindable, int, 1, "minimum number of findable TPC clusters") - O2_DEFINE_CONFIGURABLE(cfgtpccrossoverfindable, int, 1, "minimum number of Ratio crossed rows over findable clusters") + + struct : ConfigurableGroup { + std::string prefix = "v0BuilderOpts"; + // topological cut for V0 + O2_DEFINE_CONFIGURABLE(cfgv0_radius, float, 5.0f, "minimum decay radius") + O2_DEFINE_CONFIGURABLE(cfgv0_v0cospa, float, 0.995f, "minimum cosine of pointing angle") + O2_DEFINE_CONFIGURABLE(cfgv0_dcadautopv, float, 0.1f, "minimum daughter DCA to PV") + O2_DEFINE_CONFIGURABLE(cfgv0_dcav0dau, float, 0.5f, "maximum DCA among V0 daughters") + O2_DEFINE_CONFIGURABLE(cfgv0_mk0swindow, float, 0.1f, "Invariant mass window of K0s") + O2_DEFINE_CONFIGURABLE(cfgv0_mlambdawindow, float, 0.04f, "Invariant mass window of lambda") + O2_DEFINE_CONFIGURABLE(cfgv0_ArmPodocut, float, 0.2f, "Armenteros Podolski cut for K0") + } v0BuilderOpts; + + struct : ConfigurableGroup { + std::string prefix = "cascBuilderOpts"; + // topological cut for cascade + O2_DEFINE_CONFIGURABLE(cfgcasc_radius, float, 0.5f, "minimum decay radius") + O2_DEFINE_CONFIGURABLE(cfgcasc_casccospa, float, 0.999f, "minimum cosine of pointing angle") + O2_DEFINE_CONFIGURABLE(cfgcasc_v0cospa, float, 0.998f, "minimum cosine of pointing angle") + O2_DEFINE_CONFIGURABLE(cfgcasc_dcav0topv, float, 0.01f, "minimum daughter DCA to PV") + O2_DEFINE_CONFIGURABLE(cfgcasc_dcabachtopv, float, 0.01f, "minimum bachelor DCA to PV") + O2_DEFINE_CONFIGURABLE(cfgcasc_dcacascdau, float, 0.3f, "maximum DCA among cascade daughters") + O2_DEFINE_CONFIGURABLE(cfgcasc_dcav0dau, float, 1.0f, "maximum DCA among V0 daughters") + O2_DEFINE_CONFIGURABLE(cfgcasc_mlambdawindow, float, 0.04f, "Invariant mass window of lambda") + } cascBuilderOpts; + + struct : ConfigurableGroup { + std::string prefix = "trkQualityOpts"; + // track selections + O2_DEFINE_CONFIGURABLE(cfgCutEta, float, 0.8f, "Eta range for tracks") + O2_DEFINE_CONFIGURABLE(cfgCutPtPOIMin, float, 0.2f, "Minimal pT for poi tracks") + O2_DEFINE_CONFIGURABLE(cfgCutPtPOIMax, float, 10.0f, "Maximal pT for poi tracks") + O2_DEFINE_CONFIGURABLE(cfgCutPtMin, float, 0.2f, "Minimal pT for ref tracks") + O2_DEFINE_CONFIGURABLE(cfgCutPtMax, float, 10.0f, "Maximal pT for ref tracks") + O2_DEFINE_CONFIGURABLE(cfgCutPtDauMin, float, 0.2f, "Minimal pT for daughter tracks") + O2_DEFINE_CONFIGURABLE(cfgCutPtDauMax, float, 10.0f, "Maximal pT for daughter tracks") + O2_DEFINE_CONFIGURABLE(cfgCutPtK0sMin, float, 0.2f, "Minimal pT for K0s") + O2_DEFINE_CONFIGURABLE(cfgCutPtK0sMax, float, 10.0f, "Maximal pT for K0s") + O2_DEFINE_CONFIGURABLE(cfgCutPtLambdaMin, float, 0.2f, "Minimal pT for Lambda") + O2_DEFINE_CONFIGURABLE(cfgCutPtLambdaMax, float, 10.0f, "Maximal pT for Lambda") + O2_DEFINE_CONFIGURABLE(cfgCutPtXiMin, float, 0.2f, "Minimal pT for Xi") + O2_DEFINE_CONFIGURABLE(cfgCutPtXiMax, float, 10.0f, "Maximal pT for Xi") + O2_DEFINE_CONFIGURABLE(cfgCutPtOmegaMin, float, 0.2f, "Minimal pT for Omega") + O2_DEFINE_CONFIGURABLE(cfgCutPtOmegaMax, float, 10.0f, "Maximal pT for Omega") + O2_DEFINE_CONFIGURABLE(cfgCutPtPIDDauMin, float, 0.15f, "Minimal pT for daughter PID") + // track quality selections for daughter track + O2_DEFINE_CONFIGURABLE(cfgCheckITSNCls, bool, false, "check minimum number of ITS clusters") + O2_DEFINE_CONFIGURABLE(cfgCheckITSHits, bool, false, "check minimum number of ITS hits") + O2_DEFINE_CONFIGURABLE(cfgCheckITSChi2NDF, bool, false, "check ITS Chi2NDF") + O2_DEFINE_CONFIGURABLE(cfgCheckGlobalTrack, bool, false, "check global track") + } trkQualityOpts; + O2_DEFINE_CONFIGURABLE(cfgCasc_rapidity, float, 0.5, "rapidity") - O2_DEFINE_CONFIGURABLE(cfgNSigmatpctof, std::vector, (std::vector{3, 3, 3, 3, 3, 3}), "tpc and tof NSigma for Pion Proton Kaon") + O2_DEFINE_CONFIGURABLE(cfgNSigmapid, std::vector, (std::vector{9, 9, 9, 3, 3, 3, 3, 3, 3}), "tpc, tof and its NSigma for Pion Proton Kaon") O2_DEFINE_CONFIGURABLE(cfgAcceptancePath, std::vector, (std::vector{"Users/f/fcui/NUA/NUAREFPartical", "Users/f/fcui/NUA/NUAK0s", "Users/f/fcui/NUA/NUALambda", "Users/f/fcui/NUA/NUAXi", "Users/f/fcui/NUA/NUAOmega"}), "CCDB path to acceptance object") O2_DEFINE_CONFIGURABLE(cfgEfficiencyPath, std::vector, (std::vector{"PathtoRef"}), "CCDB path to efficiency object") O2_DEFINE_CONFIGURABLE(cfgLocDenParaXi, std::vector, (std::vector{-0.000986187, -3.86861, -0.000912481, -3.29206, -0.000859271, -2.89389, -0.000817039, -2.61201, -0.000788792, -2.39079, -0.000780182, -2.19276, -0.000750457, -2.07205, -0.000720279, -1.96865, -0.00073247, -1.85642, -0.000695091, -1.82625, -0.000693332, -1.72679, -0.000681225, -1.74305, -0.000652818, -1.92608, -0.000618892, -2.31985}), "Local density efficiency function parameter for Xi, exp(Ax + B)") @@ -110,13 +146,14 @@ struct FlowGfwOmegaXi { O2_DEFINE_CONFIGURABLE(cfgLocDenParaK0s, std::vector, (std::vector{-0.00043057, -3.2435, -0.000385085, -2.97687, -0.000350298, -2.81502, -0.000326159, -2.71091, -0.000299563, -2.65448, -0.000294284, -2.60865, -0.000277938, -2.589, -0.000277091, -2.56983, -0.000272783, -2.56825, -0.000252706, -2.58996, -0.000247834, -2.63158, -0.00024379, -2.76976, -0.000286468, -2.92484, -0.000310149, -3.27746}), "Local density efficiency function parameter for K0s, exp(Ax + B)") O2_DEFINE_CONFIGURABLE(cfgLocDenParaLambda, std::vector, (std::vector{-0.000510948, -4.4846, -0.000460629, -4.14465, -0.000433729, -3.94173, -0.000412751, -3.81839, -0.000411211, -3.72502, -0.000401511, -3.68426, -0.000407461, -3.67005, -0.000379371, -3.71153, -0.000392828, -3.73214, -0.000403996, -3.80717, -0.000403376, -3.90917, -0.000354624, -4.34629, -0.000477606, -4.66307, -0.000541139, -4.61364}), "Local density efficiency function parameter for Lambda, exp(Ax + B)") // switch - O2_DEFINE_CONFIGURABLE(cfgcheckDauTPC, bool, true, "check daughter tracks TPC or not") - O2_DEFINE_CONFIGURABLE(cfgcheckDauTOF, bool, false, "check daughter tracks TOF or not") O2_DEFINE_CONFIGURABLE(cfgDoAccEffCorr, bool, false, "do acc and eff corr") O2_DEFINE_CONFIGURABLE(cfgDoLocDenCorr, bool, false, "do local density corr") O2_DEFINE_CONFIGURABLE(cfgDoJackknife, bool, false, "do jackknife") O2_DEFINE_CONFIGURABLE(cfgOutputNUAWeights, bool, false, "Fill and output NUA weights") O2_DEFINE_CONFIGURABLE(cfgOutputLocDenWeights, bool, false, "Fill and output local density weights") + O2_DEFINE_CONFIGURABLE(cfgDoV0AT0Acut, bool, false, "do V0A-T0A cut") + O2_DEFINE_CONFIGURABLE(cfgOutputQA, bool, false, "do QA") + O2_DEFINE_CONFIGURABLE(cfgMultPVCut, int, 5, "Use apassX MultPVCut function or not") ConfigurableAxis cfgaxisVertex{"cfgaxisVertex", {20, -10, 10}, "vertex axis for histograms"}; ConfigurableAxis cfgaxisPhi{"cfgaxisPhi", {60, 0.0, constants::math::TwoPI}, "phi axis for histograms"}; @@ -124,7 +161,8 @@ struct FlowGfwOmegaXi { ConfigurableAxis cfgaxisPt{"cfgaxisPt", {VARIABLE_WIDTH, 0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50, 0.55, 0.60, 0.65, 0.70, 0.75, 0.80, 0.85, 0.90, 0.95, 1.00, 1.10, 1.20, 1.30, 1.40, 1.50, 1.60, 1.70, 1.80, 1.90, 2.00, 2.20, 2.40, 2.60, 2.80, 3.00, 3.50, 4.00, 4.50, 5.00, 5.50, 6.00, 10.0}, "pt (GeV)"}; ConfigurableAxis cfgaxisPtXi{"cfgaxisPtXi", {VARIABLE_WIDTH, 0.9, 1.1, 1.3, 1.5, 1.7, 1.9, 2.1, 2.3, 2.5, 2.7, 2.9, 3.9, 4.9, 5.9, 9.9}, "pt (GeV)"}; ConfigurableAxis cfgaxisPtOmega{"cfgaxisPtOmega", {VARIABLE_WIDTH, 0.9, 1.1, 1.3, 1.5, 1.7, 1.9, 2.1, 2.3, 2.5, 2.7, 2.9, 3.9, 4.9, 5.9, 9.9}, "pt (GeV)"}; - ConfigurableAxis cfgaxisPtV0{"cfgaxisPtV0", {VARIABLE_WIDTH, 0.9, 1.1, 1.3, 1.5, 1.7, 1.9, 2.1, 2.3, 2.5, 2.7, 2.9, 3.9, 4.9, 5.9, 9.9}, "pt (GeV)"}; + ConfigurableAxis cfgaxisPtK0s{"cfgaxisPtK0s", {VARIABLE_WIDTH, 0.9, 1.1, 1.3, 1.5, 1.7, 1.9, 2.1, 2.3, 2.5, 2.7, 2.9, 3.9, 4.9, 5.9, 9.9}, "pt (GeV)"}; + ConfigurableAxis cfgaxisPtLambda{"cfgaxisPtLambda", {VARIABLE_WIDTH, 0.9, 1.1, 1.3, 1.5, 1.7, 1.9, 2.1, 2.3, 2.5, 2.7, 2.9, 3.9, 4.9, 5.9, 9.9}, "pt (GeV)"}; ConfigurableAxis cfgaxisOmegaMassforflow{"cfgaxisOmegaMassforflow", {16, 1.63f, 1.71f}, "Inv. Mass (GeV)"}; ConfigurableAxis cfgaxisXiMassforflow{"cfgaxisXiMassforflow", {14, 1.3f, 1.37f}, "Inv. Mass (GeV)"}; ConfigurableAxis cfgaxisK0sMassforflow{"cfgaxisK0sMassforflow", {40, 0.4f, 0.6f}, "Inv. Mass (GeV)"}; @@ -135,12 +173,12 @@ struct FlowGfwOmegaXi { AxisSpec axisMultiplicity{{0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90}, "Centrality (%)"}; Filter collisionFilter = nabs(aod::collision::posZ) < cfgCutVertex; - Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPtPOIMin) && (aod::track::pt < cfgCutPtPOIMax) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls); + Filter trackFilter = (nabs(aod::track::eta) < trkQualityOpts.cfgCutEta.value) && (aod::track::pt > trkQualityOpts.cfgCutPtPOIMin.value) && (aod::track::pt < trkQualityOpts.cfgCutPtPOIMax.value) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::tpcChi2NCl < cfgCutChi2prTPCcls); using TracksPID = soa::Join; - using AodTracks = soa::Filtered>; // tracks filter + using AodTracks = soa::Filtered>; // tracks filter using AodCollisions = soa::Filtered>; // collisions filter - using DaughterTracks = soa::Join; + using DaughterTracks = soa::Join; // Connect to ccdb Service ccdb; @@ -158,10 +196,10 @@ struct FlowGfwOmegaXi { // define global variables GFW* fGFW = new GFW(); // GFW class used from main src std::vector corrconfigs; - std::vector cfgAcceptance = cfgAcceptancePath; - std::vector cfgEfficiency = cfgEfficiencyPath; - std::vector cfgNSigma = cfgNSigmatpctof; - std::vector cfgmassbins = cfgMassBins; + std::vector cfgAcceptance; + std::vector cfgEfficiency; + std::vector cfgNSigma; + std::vector cfgmassbins; std::vector mAcceptance; std::vector mEfficiency; @@ -179,8 +217,14 @@ struct FlowGfwOmegaXi { int nXiPtBins = 0; TAxis* fXiPtAxis = nullptr; - int nV0PtBins = 0; - TAxis* fV0PtAxis = nullptr; + int nOmegaPtBins = 0; + TAxis* fOmegaPtAxis = nullptr; + + int nK0sPtBins = 0; + TAxis* fK0sPtAxis = nullptr; + + int nLambdaPtBins = 0; + TAxis* fLambdaPtAxis = nullptr; TAxis* fMultAxis = nullptr; @@ -198,6 +242,11 @@ struct FlowGfwOmegaXi { ccdb->setCaching(true); ccdb->setCreatedNotAfter(cfgnolaterthan.value); + cfgAcceptance = cfgAcceptancePath; + cfgEfficiency = cfgEfficiencyPath; + cfgNSigma = cfgNSigmapid; + cfgmassbins = cfgMassBins; + // Set the pt, mult and phi Axis; o2::framework::AxisSpec axisPt = cfgaxisPt; nPtBins = axisPt.binEdges.size() - 1; @@ -207,9 +256,17 @@ struct FlowGfwOmegaXi { nXiPtBins = axisXiPt.binEdges.size() - 1; fXiPtAxis = new TAxis(nXiPtBins, &(axisXiPt.binEdges)[0]); - o2::framework::AxisSpec axisV0Pt = cfgaxisPtV0; - nV0PtBins = axisV0Pt.binEdges.size() - 1; - fV0PtAxis = new TAxis(nV0PtBins, &(axisV0Pt.binEdges)[0]); + o2::framework::AxisSpec axisOmegaPt = cfgaxisPtOmega; + nOmegaPtBins = axisOmegaPt.binEdges.size() - 1; + fOmegaPtAxis = new TAxis(nOmegaPtBins, &(axisOmegaPt.binEdges)[0]); + + o2::framework::AxisSpec axisK0sPt = cfgaxisPtK0s; + nK0sPtBins = axisK0sPt.binEdges.size() - 1; + fK0sPtAxis = new TAxis(nK0sPtBins, &(axisK0sPt.binEdges)[0]); + + o2::framework::AxisSpec axisLambdaPt = cfgaxisPtLambda; + nLambdaPtBins = axisLambdaPt.binEdges.size() - 1; + fLambdaPtAxis = new TAxis(nLambdaPtBins, &(axisLambdaPt.binEdges)[0]); o2::framework::AxisSpec axisMult = axisMultiplicity; int nMultBins = axisMult.binEdges.size() - 1; @@ -249,49 +306,58 @@ struct FlowGfwOmegaXi { registry.get(HIST("hEventCount"))->GetYaxis()->SetBinLabel(4, "Omega"); // QA - // V0 QA - registry.add("QAhisto/V0/hqaV0radiusbefore", "", {HistType::kTH1D, {{200, 0, 200}}}); - registry.add("QAhisto/V0/hqaV0radiusafter", "", {HistType::kTH1D, {{200, 0, 200}}}); - registry.add("QAhisto/V0/hqaV0cosPAbefore", "", {HistType::kTH1D, {{1000, 0.95, 1}}}); - registry.add("QAhisto/V0/hqaV0cosPAafter", "", {HistType::kTH1D, {{1000, 0.95, 1}}}); - registry.add("QAhisto/V0/hqadcaV0daubefore", "", {HistType::kTH1D, {{100, 0, 1}}}); - registry.add("QAhisto/V0/hqadcaV0dauafter", "", {HistType::kTH1D, {{100, 0, 1}}}); - registry.add("QAhisto/V0/hqaarm_podobefore", "", {HistType::kTH2D, {{100, -1, 1}, {50, 0, 0.3}}}); - registry.add("QAhisto/V0/hqaarm_podoafter", "", {HistType::kTH2D, {{100, -1, 1}, {50, 0, 0.3}}}); - registry.add("QAhisto/V0/hqadcapostoPVbefore", "", {HistType::kTH1D, {{1000, -10, 10}}}); - registry.add("QAhisto/V0/hqadcapostoPVafter", "", {HistType::kTH1D, {{1000, -10, 10}}}); - registry.add("QAhisto/V0/hqadcanegtoPVbefore", "", {HistType::kTH1D, {{1000, -10, 10}}}); - registry.add("QAhisto/V0/hqadcanegtoPVafter", "", {HistType::kTH1D, {{1000, -10, 10}}}); - // Cascade QA - registry.add("QAhisto/Casc/hqaCasccosPAbefore", "", {HistType::kTH1D, {{1000, 0.95, 1}}}); - registry.add("QAhisto/Casc/hqaCasccosPAafter", "", {HistType::kTH1D, {{1000, 0.95, 1}}}); - registry.add("QAhisto/Casc/hqaCascV0cosPAbefore", "", {HistType::kTH1D, {{1000, 0.95, 1}}}); - registry.add("QAhisto/Casc/hqaCascV0cosPAafter", "", {HistType::kTH1D, {{1000, 0.95, 1}}}); - registry.add("QAhisto/Casc/hqadcaCascV0toPVbefore", "", {HistType::kTH1D, {{1000, -10, 10}}}); - registry.add("QAhisto/Casc/hqadcaCascV0toPVafter", "", {HistType::kTH1D, {{1000, -10, 10}}}); - registry.add("QAhisto/Casc/hqadcaCascBachtoPVbefore", "", {HistType::kTH1D, {{1000, -10, 10}}}); - registry.add("QAhisto/Casc/hqadcaCascBachtoPVafter", "", {HistType::kTH1D, {{1000, -10, 10}}}); - registry.add("QAhisto/Casc/hqadcaCascdaubefore", "", {HistType::kTH1D, {{100, 0, 1}}}); - registry.add("QAhisto/Casc/hqadcaCascdauafter", "", {HistType::kTH1D, {{100, 0, 1}}}); - registry.add("QAhisto/Casc/hqadcaCascV0daubefore", "", {HistType::kTH1D, {{100, 0, 1}}}); - registry.add("QAhisto/Casc/hqadcaCascV0dauafter", "", {HistType::kTH1D, {{100, 0, 1}}}); + if (cfgOutputQA) { + // V0 QA + registry.add("QAhisto/V0/hqaV0radiusbefore", "", {HistType::kTH1D, {{200, 0, 200}}}); + registry.add("QAhisto/V0/hqaV0radiusafter", "", {HistType::kTH1D, {{200, 0, 200}}}); + registry.add("QAhisto/V0/hqaV0cosPAbefore", "", {HistType::kTH1D, {{1000, 0.95, 1}}}); + registry.add("QAhisto/V0/hqaV0cosPAafter", "", {HistType::kTH1D, {{1000, 0.95, 1}}}); + registry.add("QAhisto/V0/hqadcaV0daubefore", "", {HistType::kTH1D, {{100, 0, 1}}}); + registry.add("QAhisto/V0/hqadcaV0dauafter", "", {HistType::kTH1D, {{100, 0, 1}}}); + registry.add("QAhisto/V0/hqaarm_podobefore", "", {HistType::kTH2D, {{100, -1, 1}, {50, 0, 0.3}}}); + registry.add("QAhisto/V0/hqaarm_podoafter", "", {HistType::kTH2D, {{100, -1, 1}, {50, 0, 0.3}}}); + registry.add("QAhisto/V0/hqadcapostoPVbefore", "", {HistType::kTH1D, {{1000, -10, 10}}}); + registry.add("QAhisto/V0/hqadcapostoPVafter", "", {HistType::kTH1D, {{1000, -10, 10}}}); + registry.add("QAhisto/V0/hqadcanegtoPVbefore", "", {HistType::kTH1D, {{1000, -10, 10}}}); + registry.add("QAhisto/V0/hqadcanegtoPVafter", "", {HistType::kTH1D, {{1000, -10, 10}}}); + // Cascade QA + registry.add("QAhisto/Casc/hqaCasccosPAbefore", "", {HistType::kTH1D, {{1000, 0.95, 1}}}); + registry.add("QAhisto/Casc/hqaCasccosPAafter", "", {HistType::kTH1D, {{1000, 0.95, 1}}}); + registry.add("QAhisto/Casc/hqaCascV0cosPAbefore", "", {HistType::kTH1D, {{1000, 0.95, 1}}}); + registry.add("QAhisto/Casc/hqaCascV0cosPAafter", "", {HistType::kTH1D, {{1000, 0.95, 1}}}); + registry.add("QAhisto/Casc/hqadcaCascV0toPVbefore", "", {HistType::kTH1D, {{1000, -10, 10}}}); + registry.add("QAhisto/Casc/hqadcaCascV0toPVafter", "", {HistType::kTH1D, {{1000, -10, 10}}}); + registry.add("QAhisto/Casc/hqadcaCascBachtoPVbefore", "", {HistType::kTH1D, {{1000, -10, 10}}}); + registry.add("QAhisto/Casc/hqadcaCascBachtoPVafter", "", {HistType::kTH1D, {{1000, -10, 10}}}); + registry.add("QAhisto/Casc/hqadcaCascdaubefore", "", {HistType::kTH1D, {{100, 0, 1}}}); + registry.add("QAhisto/Casc/hqadcaCascdauafter", "", {HistType::kTH1D, {{100, 0, 1}}}); + registry.add("QAhisto/Casc/hqadcaCascV0daubefore", "", {HistType::kTH1D, {{100, 0, 1}}}); + registry.add("QAhisto/Casc/hqadcaCascV0dauafter", "", {HistType::kTH1D, {{100, 0, 1}}}); + } // cumulant of flow registry.add("c22", ";Centrality (%) ; C_{2}{2} ", {HistType::kTProfile, {axisMultiplicity}}); + registry.add("c32", ";Centrality (%) ; C_{2}{2} ", {HistType::kTProfile, {axisMultiplicity}}); registry.add("c24", ";Centrality (%) ; C_{2}{2} ", {HistType::kTProfile, {axisMultiplicity}}); registry.add("K0sc22", ";Centrality (%) ; C_{2}{2} ", {HistType::kTProfile, {axisMultiplicity}}); registry.add("Lambdac22", ";Centrality (%) ; C_{2}{2} ", {HistType::kTProfile, {axisMultiplicity}}); registry.add("c22dpt", ";Centrality (%) ; C_{2}{2}", {HistType::kTProfile2D, {cfgaxisPt, axisMultiplicity}}); registry.add("c24dpt", ";Centrality (%) ; C_{2}{4}", {HistType::kTProfile2D, {cfgaxisPt, axisMultiplicity}}); // pt-diff cumulant of flow + // v2 registry.add("Xic22dpt", ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtXi, cfgaxisXiMassforflow, axisMultiplicity}}); - registry.add("Omegac22dpt", ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtXi, cfgaxisOmegaMassforflow, axisMultiplicity}}); - registry.add("K0sc22dpt", ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtV0, cfgaxisK0sMassforflow, axisMultiplicity}}); - registry.add("Lambdac22dpt", ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtV0, cfgaxisLambdaMassforflow, axisMultiplicity}}); + registry.add("Omegac22dpt", ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtOmega, cfgaxisOmegaMassforflow, axisMultiplicity}}); + registry.add("K0sc22dpt", ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtK0s, cfgaxisK0sMassforflow, axisMultiplicity}}); + registry.add("Lambdac22dpt", ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtLambda, cfgaxisLambdaMassforflow, axisMultiplicity}}); registry.add("Xic24dpt", ";pt ; C_{2}{4} ", {HistType::kTProfile3D, {cfgaxisPtXi, cfgaxisXiMassforflow, axisMultiplicity}}); - registry.add("Omegac24dpt", ";pt ; C_{2}{4} ", {HistType::kTProfile3D, {cfgaxisPtXi, cfgaxisOmegaMassforflow, axisMultiplicity}}); - registry.add("K0sc24dpt", ";pt ; C_{2}{4} ", {HistType::kTProfile3D, {cfgaxisPtV0, cfgaxisK0sMassforflow, axisMultiplicity}}); - registry.add("Lambdac24dpt", ";pt ; C_{2}{4} ", {HistType::kTProfile3D, {cfgaxisPtV0, cfgaxisLambdaMassforflow, axisMultiplicity}}); + registry.add("Omegac24dpt", ";pt ; C_{2}{4} ", {HistType::kTProfile3D, {cfgaxisPtOmega, cfgaxisOmegaMassforflow, axisMultiplicity}}); + registry.add("K0sc24dpt", ";pt ; C_{2}{4} ", {HistType::kTProfile3D, {cfgaxisPtK0s, cfgaxisK0sMassforflow, axisMultiplicity}}); + registry.add("Lambdac24dpt", ";pt ; C_{2}{4} ", {HistType::kTProfile3D, {cfgaxisPtK0s, cfgaxisLambdaMassforflow, axisMultiplicity}}); + // v3 + registry.add("Xic32dpt", ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtXi, cfgaxisXiMassforflow, axisMultiplicity}}); + registry.add("Omegac32dpt", ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtOmega, cfgaxisOmegaMassforflow, axisMultiplicity}}); + registry.add("K0sc32dpt", ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtK0s, cfgaxisK0sMassforflow, axisMultiplicity}}); + registry.add("Lambdac32dpt", ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtLambda, cfgaxisLambdaMassforflow, axisMultiplicity}}); // for Jackknife if (cfgDoJackknife) { int nsubevent = 10; @@ -299,43 +365,48 @@ struct FlowGfwOmegaXi { refc22[i - 1] = registry.add(Form("Jackknife/REF/c22_%d", i), ";Centrality (%) ; C_{2}{2} ", {HistType::kTProfile, {axisMultiplicity}}); refc24[i - 1] = registry.add(Form("Jackknife/REF/c24_%d", i), ";Centrality (%) ; C_{2}{2} ", {HistType::kTProfile, {axisMultiplicity}}); xic22[i - 1] = registry.add(Form("Jackknife/Xi/Xic22dpt_%d", i), ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtXi, cfgaxisXiMassforflow, axisMultiplicity}}); - omegac22[i - 1] = registry.add(Form("Jackknife/Omega/Omegac22dpt_%d", i), ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtXi, cfgaxisOmegaMassforflow, axisMultiplicity}}); - k0sc22[i - 1] = registry.add(Form("Jackknife/K0s/K0sc22dpt_%d", i), ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtV0, cfgaxisK0sMassforflow, axisMultiplicity}}); - lambdac22[i - 1] = registry.add(Form("Jackknife/Lambda/Lambdac22dpt_%d", i), ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtV0, cfgaxisLambdaMassforflow, axisMultiplicity}}); + omegac22[i - 1] = registry.add(Form("Jackknife/Omega/Omegac22dpt_%d", i), ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtOmega, cfgaxisOmegaMassforflow, axisMultiplicity}}); + k0sc22[i - 1] = registry.add(Form("Jackknife/K0s/K0sc22dpt_%d", i), ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtK0s, cfgaxisK0sMassforflow, axisMultiplicity}}); + lambdac22[i - 1] = registry.add(Form("Jackknife/Lambda/Lambdac22dpt_%d", i), ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtLambda, cfgaxisLambdaMassforflow, axisMultiplicity}}); xic24[i - 1] = registry.add(Form("Jackknife/Xi/Xic24dpt_%d", i), ";pt ; C_{2}{4} ", {HistType::kTProfile3D, {cfgaxisPtXi, cfgaxisXiMassforflow, axisMultiplicity}}); - omegac24[i - 1] = registry.add(Form("Jackknife/Omega/Omegac24dpt_%d", i), ";pt ; C_{2}{4} ", {HistType::kTProfile3D, {cfgaxisPtXi, cfgaxisOmegaMassforflow, axisMultiplicity}}); - k0sc24[i - 1] = registry.add(Form("Jackknife/K0s/K0sc24dpt_%d", i), ";pt ; C_{2}{4} ", {HistType::kTProfile3D, {cfgaxisPtV0, cfgaxisK0sMassforflow, axisMultiplicity}}); - lambdac24[i - 1] = registry.add(Form("Jackknife/Lambda/Lambdac24dpt_%d", i), ";pt ; C_{2}{4} ", {HistType::kTProfile3D, {cfgaxisPtV0, cfgaxisLambdaMassforflow, axisMultiplicity}}); + omegac24[i - 1] = registry.add(Form("Jackknife/Omega/Omegac24dpt_%d", i), ";pt ; C_{2}{4} ", {HistType::kTProfile3D, {cfgaxisPtOmega, cfgaxisOmegaMassforflow, axisMultiplicity}}); + k0sc24[i - 1] = registry.add(Form("Jackknife/K0s/K0sc24dpt_%d", i), ";pt ; C_{2}{4} ", {HistType::kTProfile3D, {cfgaxisPtK0s, cfgaxisK0sMassforflow, axisMultiplicity}}); + lambdac24[i - 1] = registry.add(Form("Jackknife/Lambda/Lambdac24dpt_%d", i), ";pt ; C_{2}{4} ", {HistType::kTProfile3D, {cfgaxisPtLambda, cfgaxisLambdaMassforflow, axisMultiplicity}}); + refc32[i - 1] = registry.add(Form("Jackknife/REF/c32_%d", i), ";Centrality (%) ; C_{2}{2} ", {HistType::kTProfile, {axisMultiplicity}}); + xic32[i - 1] = registry.add(Form("Jackknife/Xi/Xic32dpt_%d", i), ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtXi, cfgaxisXiMassforflow, axisMultiplicity}}); + omegac32[i - 1] = registry.add(Form("Jackknife/Omega/Omegac32dpt_%d", i), ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtOmega, cfgaxisOmegaMassforflow, axisMultiplicity}}); + k0sc32[i - 1] = registry.add(Form("Jackknife/K0s/K0sc32dpt_%d", i), ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtK0s, cfgaxisK0sMassforflow, axisMultiplicity}}); + lambdac32[i - 1] = registry.add(Form("Jackknife/Lambda/Lambdac32dpt_%d", i), ";pt ; C_{2}{2} ", {HistType::kTProfile3D, {cfgaxisPtLambda, cfgaxisLambdaMassforflow, axisMultiplicity}}); } } // MC True flow registry.add("MC/c22MC", ";Centrality (%) ; C_{2}{2} ", {HistType::kTProfile, {axisMultiplicity}}); registry.add("MC/Xic22dptMC", ";pt ; C_{2}{2} ", {HistType::kTProfile2D, {cfgaxisPtXi, axisMultiplicity}}); - registry.add("MC/Omegac22dptMC", ";pt ; C_{2}{2} ", {HistType::kTProfile2D, {cfgaxisPtXi, axisMultiplicity}}); - registry.add("MC/K0sc22dptMC", ";pt ; C_{2}{2} ", {HistType::kTProfile2D, {cfgaxisPtV0, axisMultiplicity}}); - registry.add("MC/Lambdac22dptMC", ";pt ; C_{2}{2} ", {HistType::kTProfile2D, {cfgaxisPtV0, axisMultiplicity}}); + registry.add("MC/Omegac22dptMC", ";pt ; C_{2}{2} ", {HistType::kTProfile2D, {cfgaxisPtOmega, axisMultiplicity}}); + registry.add("MC/K0sc22dptMC", ";pt ; C_{2}{2} ", {HistType::kTProfile2D, {cfgaxisPtK0s, axisMultiplicity}}); + registry.add("MC/Lambdac22dptMC", ";pt ; C_{2}{2} ", {HistType::kTProfile2D, {cfgaxisPtLambda, axisMultiplicity}}); // InvMass(GeV) of casc and v0 AxisSpec axisOmegaMass = {80, 1.63f, 1.71f, "Inv. Mass (GeV)"}; AxisSpec axisXiMass = {70, 1.3f, 1.37f, "Inv. Mass (GeV)"}; AxisSpec axisK0sMass = {400, 0.4f, 0.6f, "Inv. Mass (GeV)"}; AxisSpec axisLambdaMass = {160, 1.08f, 1.16f, "Inv. Mass (GeV)"}; registry.add("InvMassXi_all", "", {HistType::kTHnSparseF, {cfgaxisPtXi, axisXiMass, cfgaxisEta, axisMultiplicity}}); - registry.add("InvMassOmega_all", "", {HistType::kTHnSparseF, {cfgaxisPtXi, axisOmegaMass, cfgaxisEta, axisMultiplicity}}); - registry.add("InvMassOmega", "", {HistType::kTHnSparseF, {cfgaxisPtXi, axisOmegaMass, cfgaxisEta, axisMultiplicity}}); + registry.add("InvMassOmega_all", "", {HistType::kTHnSparseF, {cfgaxisPtOmega, axisOmegaMass, cfgaxisEta, axisMultiplicity}}); registry.add("InvMassXi", "", {HistType::kTHnSparseF, {cfgaxisPtXi, axisXiMass, cfgaxisEta, axisMultiplicity}}); - registry.add("InvMassK0s_all", "", {HistType::kTHnSparseF, {cfgaxisPtV0, axisK0sMass, cfgaxisEta, axisMultiplicity}}); - registry.add("InvMassLambda_all", "", {HistType::kTHnSparseF, {cfgaxisPtV0, axisLambdaMass, cfgaxisEta, axisMultiplicity}}); - registry.add("InvMassK0s", "", {HistType::kTHnSparseF, {cfgaxisPtV0, axisK0sMass, cfgaxisEta, axisMultiplicity}}); - registry.add("InvMassLambda", "", {HistType::kTHnSparseF, {cfgaxisPtV0, axisLambdaMass, cfgaxisEta, axisMultiplicity}}); + registry.add("InvMassOmega", "", {HistType::kTHnSparseF, {cfgaxisPtOmega, axisOmegaMass, cfgaxisEta, axisMultiplicity}}); + registry.add("InvMassK0s_all", "", {HistType::kTHnSparseF, {cfgaxisPtK0s, axisK0sMass, cfgaxisEta, axisMultiplicity}}); + registry.add("InvMassLambda_all", "", {HistType::kTHnSparseF, {cfgaxisPtLambda, axisLambdaMass, cfgaxisEta, axisMultiplicity}}); + registry.add("InvMassK0s", "", {HistType::kTHnSparseF, {cfgaxisPtK0s, axisK0sMass, cfgaxisEta, axisMultiplicity}}); + registry.add("InvMassLambda", "", {HistType::kTHnSparseF, {cfgaxisPtLambda, axisLambdaMass, cfgaxisEta, axisMultiplicity}}); // for local density correlation - registry.add("MC/densityMCGenK0s", "", {HistType::kTH3D, {cfgaxisPtV0, cfgaxisNch, cfgaxisLocalDensity}}); - registry.add("MC/densityMCGenLambda", "", {HistType::kTH3D, {cfgaxisPtV0, cfgaxisNch, cfgaxisLocalDensity}}); + registry.add("MC/densityMCGenK0s", "", {HistType::kTH3D, {cfgaxisPtK0s, cfgaxisNch, cfgaxisLocalDensity}}); + registry.add("MC/densityMCGenLambda", "", {HistType::kTH3D, {cfgaxisPtLambda, cfgaxisNch, cfgaxisLocalDensity}}); registry.add("MC/densityMCGenXi", "", {HistType::kTH3D, {cfgaxisPtXi, cfgaxisNch, cfgaxisLocalDensity}}); - registry.add("MC/densityMCGenOmega", "", {HistType::kTH3D, {cfgaxisPtXi, cfgaxisNch, cfgaxisLocalDensity}}); - registry.add("MC/densityMCRecK0s", "", {HistType::kTHnSparseF, {cfgaxisPtV0, cfgaxisNch, cfgaxisLocalDensity, axisK0sMass}}); - registry.add("MC/densityMCRecLambda", "", {HistType::kTHnSparseF, {cfgaxisPtV0, cfgaxisNch, cfgaxisLocalDensity, axisLambdaMass}}); + registry.add("MC/densityMCGenOmega", "", {HistType::kTH3D, {cfgaxisPtOmega, cfgaxisNch, cfgaxisLocalDensity}}); + registry.add("MC/densityMCRecK0s", "", {HistType::kTHnSparseF, {cfgaxisPtK0s, cfgaxisNch, cfgaxisLocalDensity, axisK0sMass}}); + registry.add("MC/densityMCRecLambda", "", {HistType::kTHnSparseF, {cfgaxisPtLambda, cfgaxisNch, cfgaxisLocalDensity, axisLambdaMass}}); registry.add("MC/densityMCRecXi", "", {HistType::kTHnSparseF, {cfgaxisPtXi, cfgaxisNch, cfgaxisLocalDensity, axisXiMass}}); - registry.add("MC/densityMCRecOmega", "", {HistType::kTHnSparseF, {cfgaxisPtXi, cfgaxisNch, cfgaxisLocalDensity, axisOmegaMass}}); + registry.add("MC/densityMCRecOmega", "", {HistType::kTHnSparseF, {cfgaxisPtOmega, cfgaxisNch, cfgaxisLocalDensity, axisOmegaMass}}); // Data fGFW->AddRegion("reffull", -0.8, 0.8, 1, 1); // ("name", etamin, etamax, ptbinnum, bitmask)eta region -0.8 to 0.8 @@ -359,13 +430,13 @@ struct FlowGfwOmegaXi { fGFW->AddRegion("poiOmegafulldpt", -0.8, 0.8, nOmegaptMassBins, 4); fGFW->AddRegion("poiOmegaP", 0.4, 0.8, 1, 4); fGFW->AddRegion("poiOmegaN", -0.8, -0.4, 1, 4); - int nK0sptMassBins = nV0PtBins * cfgmassbins[0]; + int nK0sptMassBins = nK0sPtBins * cfgmassbins[0]; fGFW->AddRegion("poiK0sPdpt", 0.4, 0.8, nK0sptMassBins, 8); fGFW->AddRegion("poiK0sNdpt", -0.8, -0.4, nK0sptMassBins, 8); fGFW->AddRegion("poiK0sfulldpt", -0.8, 0.8, nK0sptMassBins, 8); fGFW->AddRegion("poiK0sP", 0.4, 0.8, 1, 8); fGFW->AddRegion("poiK0sN", -0.8, 0.4, 1, 8); - int nLambdaptMassBins = nV0PtBins * cfgmassbins[1]; + int nLambdaptMassBins = nLambdaPtBins * cfgmassbins[1]; fGFW->AddRegion("poiLambdaPdpt", 0.4, 0.8, nLambdaptMassBins, 16); fGFW->AddRegion("poiLambdaNdpt", -0.8, -0.4, nLambdaptMassBins, 16); fGFW->AddRegion("poiLambdafulldpt", -0.8, 0.8, nLambdaptMassBins, 16); @@ -384,6 +455,7 @@ struct FlowGfwOmegaXi { fGFW->AddRegion("poiLambdaNdptMC", -0.8, -0.4, nLambdaptMassBins, 1024); // pushback // Data + // v2 corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiP10dpt {2} refN10 {-2}", "Poi10Gap22dpta", kTRUE)); // 0 corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiN10dpt {2} refP10 {-2}", "Poi10Gap22dptb", kTRUE)); corrconfigs.push_back(fGFW->GetCorrelatorConfig("poifulldpt reffull | poioldpt {2 2 -2 -2}", "Poi10Gap24dpt", kTRUE)); @@ -401,23 +473,44 @@ struct FlowGfwOmegaXi { corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiLambdafulldpt reffull {2 2 -2 -2}", "Xi10Gap24a", kTRUE)); corrconfigs.push_back(fGFW->GetCorrelatorConfig("refP10 {2} refN10 {-2}", "Ref10Gap22a", kFALSE)); // 15 corrconfigs.push_back(fGFW->GetCorrelatorConfig("reffull reffull {2 2 -2 -2}", "Ref10Gap24", kFALSE)); + // v3 + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiXiPdpt {3} refN10 {-3}", "Xi10Gap32a", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiXiNdpt {3} refP10 {-3}", "Xi10Gap32b", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiOmegaPdpt {3} refN10 {-3}", "Omega10Gap32a", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiOmegaNdpt {3} refP10 {-3}", "Omega10Gap32b", kTRUE)); // 20 + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiK0sPdpt {3} refN10 {-3}", "K0short10Gap32a", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiK0sNdpt {3} refP10 {-3}", "K0short10Gap32b", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiLambdaPdpt {3} refN10 {-3}", "Lambda10Gap32a", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiLambdaNdpt {3} refP10 {-3}", "Lambda10Gap32b", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refP10 {3} refN10 {-3}", "Ref10Gap32a", kFALSE)); // 25 // MC - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiXiPdptMC {2} refN10MC {-2}", "MCXi10Gap22a", kTRUE)); // 17 + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiXiPdptMC {2} refN10MC {-2}", "MCXi10Gap22a", kTRUE)); corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiXiNdptMC {2} refP10MC {-2}", "MCXi10Gap22b", kTRUE)); corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiOmegaPdptMC {2} refN10MC {-2}", "MCOmega10Gap22a", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiOmegaNdptMC {2} refP10MC {-2}", "MCOmega10Gap22b", kTRUE)); // 20 - corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiK0sPdptMC {2} refN10MC {-2}", "MCK0s10Gap22a", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiOmegaNdptMC {2} refP10MC {-2}", "MCOmega10Gap22b", kTRUE)); + corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiK0sPdptMC {2} refN10MC {-2}", "MCK0s10Gap22a", kTRUE)); // 30 corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiK0sNdptMC {2} refP10MC {-2}", "MCK0s10Gap22b", kTRUE)); corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiLambdaPdptMC {2} refN10MC {-2}", "MCLambda10Gap22a", kTRUE)); corrconfigs.push_back(fGFW->GetCorrelatorConfig("poiLambdaNdptMC {2} refP10MC {-2}", "MCLambda10Gap22b", kTRUE)); - corrconfigs.push_back(fGFW->GetCorrelatorConfig("refP10MC {2} refN10MC {-2}", "MCRef10Gap22a", kFALSE)); // 25 + corrconfigs.push_back(fGFW->GetCorrelatorConfig("refP10MC {2} refN10MC {-2}", "MCRef10Gap22a", kFALSE)); // 33 fGFW->CreateRegions(); // finalize the initialization // used for event selection - fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x - 3.5*([5]+[6must ]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); - fMultPVCutLow->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); - fMultPVCutHigh = new TF1("fMultPVCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x + 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); - fMultPVCutHigh->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); + int caseapass4 = 4; + int caseapass5 = 5; + if (cfgMultPVCut == caseapass4) { + fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x - 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); + fMultPVCutLow->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); + fMultPVCutHigh = new TF1("fMultPVCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x + 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); + fMultPVCutHigh->SetParameters(3257.29, -121.848, 1.98492, -0.0172128, 6.47528e-05, 154.756, -1.86072, -0.0274713, 0.000633499, -3.37757e-06); + } + if (cfgMultPVCut == caseapass5) { + fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x - 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); + fMultPVCutLow->SetParameters(3074.43, -106.192, 1.46176, -0.00968364, 2.61923e-05, 182.128, -7.43492, 0.193901, -0.00256715, 1.22594e-05); + fMultPVCutHigh = new TF1("fMultPVCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x + 3.5*([5]+[6]*x+[7]*x*x+[8]*x*x*x+[9]*x*x*x*x)", 0, 100); + fMultPVCutHigh->SetParameters(3074.43, -106.192, 1.46176, -0.00968364, 2.61923e-05, 182.128, -7.43492, 0.193901, -0.00256715, 1.22594e-05); + } + fT0AV0AMean = new TF1("fT0AV0AMean", "[0]+[1]*x", 0, 200000); fT0AV0AMean->SetParameters(-1601.0581, 9.417652e-01); fT0AV0ASigma = new TF1("fT0AV0ASigma", "[0]+[1]*x+[2]*x*x+[3]*x*x*x+[4]*x*x*x*x", 0, 200000); @@ -493,11 +586,11 @@ struct FlowGfwOmegaXi { if (PDGCode == kXiMinus) { fpt = fXiPtAxis; } else if (PDGCode == kOmegaMinus) { - fpt = fXiPtAxis; + fpt = fOmegaPtAxis; } else if (PDGCode == kK0Short) { - fpt = fV0PtAxis; + fpt = fK0sPtAxis; } else if (PDGCode == kLambda0) { - fpt = fV0PtAxis; + fpt = fLambdaPtAxis; } else { LOGF(error, "Error, please put in correct PDGCode of K0s, Lambda, Xi or Omega"); return; @@ -529,18 +622,18 @@ struct FlowGfwOmegaXi { fMass = fXiMass; } else if (PDGCode == kOmegaMinus) { nMassBins = cfgmassbins[3]; - nptbins = nXiPtBins; - fpt = fXiPtAxis; + nptbins = nOmegaPtBins; + fpt = fOmegaPtAxis; fMass = fOmegaMass; } else if (PDGCode == kK0Short) { nMassBins = cfgmassbins[0]; - nptbins = nV0PtBins; - fpt = fV0PtAxis; + nptbins = nK0sPtBins; + fpt = fK0sPtAxis; fMass = fK0sMass; } else if (PDGCode == kLambda0) { nMassBins = cfgmassbins[1]; - nptbins = nV0PtBins; - fpt = fV0PtAxis; + nptbins = nLambdaPtBins; + fpt = fLambdaPtAxis; fMass = fLambdaMass; } else { LOGF(error, "Error, please put in correct PDGCode of K0s, Lambda, Xi or Omega"); @@ -574,18 +667,18 @@ struct FlowGfwOmegaXi { fMass = fXiMass; } else if (PDGCode == kOmegaMinus) { nMassBins = cfgmassbins[3]; - nptbins = nXiPtBins; - fpt = fXiPtAxis; + nptbins = nOmegaPtBins; + fpt = fOmegaPtAxis; fMass = fOmegaMass; } else if (PDGCode == kK0Short) { nMassBins = cfgmassbins[0]; - nptbins = nV0PtBins; - fpt = fV0PtAxis; + nptbins = nK0sPtBins; + fpt = fK0sPtAxis; fMass = fK0sMass; } else if (PDGCode == kLambda0) { nMassBins = cfgmassbins[1]; - nptbins = nV0PtBins; - fpt = fV0PtAxis; + nptbins = nLambdaPtBins; + fpt = fLambdaPtAxis; fMass = fLambdaMass; } else { LOGF(error, "Error, please put in correct PDGCode of K0s, Lambda, Xi or Omega"); @@ -716,23 +809,30 @@ struct FlowGfwOmegaXi { if (std::fabs(vtxz) > cfgCutVertex) return false; - if (multNTracksPV < fMultPVCutLow->Eval(centrality)) - return false; - if (multNTracksPV > fMultPVCutHigh->Eval(centrality)) - return false; + int caseapass4 = 4; + int caseapass5 = 5; + if (cfgMultPVCut == caseapass4 || cfgMultPVCut == caseapass5) { + if (multNTracksPV < fMultPVCutLow->Eval(centrality)) + return false; + if (multNTracksPV > fMultPVCutHigh->Eval(centrality)) + return false; + } if (occupancy > cfgCutOccupancyHigh) return 0; // V0A T0A 5 sigma cut - int nsigma = 5; - if (std::fabs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > nsigma * fT0AV0ASigma->Eval(collision.multFT0A())) - return 0; + if (cfgDoV0AT0Acut) { + int nsigma = 5; + if (std::fabs(collision.multFV0A() - fT0AV0AMean->Eval(collision.multFT0A())) > nsigma * fT0AV0ASigma->Eval(collision.multFT0A())) + return 0; + } return true; } void processData(AodCollisions::iterator const& collision, aod::BCsWithTimestamps const&, AodTracks const& tracks, aod::CascDataExt const& Cascades, aod::V0Datas const& V0s, DaughterTracks const&) { + o2::aod::ITSResponse itsResponse; int nTot = tracks.size(); int candNumAll[4] = {0, 0, 0, 0}; int candNum[4] = {0, 0, 0, 0}; @@ -775,10 +875,10 @@ struct FlowGfwOmegaXi { registry.fill(HIST("hEtaPhiVtxzREF"), track.phi(), track.eta(), vtxz, wacc); registry.fill(HIST("hPt"), track.pt()); int ptbin = fPtAxis->FindBin(track.pt()) - 1; - if ((track.pt() > cfgCutPtMin) && (track.pt() < cfgCutPtMax)) { + if ((track.pt() > trkQualityOpts.cfgCutPtMin.value) && (track.pt() < trkQualityOpts.cfgCutPtMax.value)) { fGFW->Fill(track.eta(), ptbin, track.phi(), wacc * weff, 1); //(eta, ptbin, phi, wacc*weff, bitmask) } - if ((track.pt() > cfgCutPtPOIMin) && (track.pt() < cfgCutPtPOIMax)) { + if ((track.pt() > trkQualityOpts.cfgCutPtPOIMin.value) && (track.pt() < trkQualityOpts.cfgCutPtPOIMax.value)) { fGFW->Fill(track.eta(), ptbin, track.phi(), wacc * weff, 32); if (cfgDoLocDenCorr) { hLocalDensity->Fill(track.phi(), wacc * weff); @@ -793,79 +893,107 @@ struct FlowGfwOmegaXi { registry.fill(HIST("hCentvsNch"), cent, nch); } // fill GFW of V0 flow - double lowpt = 0.4; + double lowpt = trkQualityOpts.cfgCutPtPIDDauMin.value; + for (const auto& v0 : V0s) { auto v0posdau = v0.posTrack_as(); auto v0negdau = v0.negTrack_as(); // check tpc bool isK0s = false; bool isLambda = false; + + if (v0posdau.pt() < trkQualityOpts.cfgCutPtDauMin.value || v0posdau.pt() > trkQualityOpts.cfgCutPtDauMax.value) + continue; + if (v0negdau.pt() < trkQualityOpts.cfgCutPtDauMin.value || v0negdau.pt() > trkQualityOpts.cfgCutPtDauMax.value) + continue; + // fill QA - registry.fill(HIST("QAhisto/V0/hqaarm_podobefore"), v0.alpha(), v0.qtarm()); + if (cfgOutputQA) { + registry.fill(HIST("QAhisto/V0/hqaarm_podobefore"), v0.alpha(), v0.qtarm()); + } // check daughter TPC and TOF // K0short - if (v0.qtarm() / std::fabs(v0.alpha()) > cfgv0_ArmPodocut && std::fabs(v0.mK0Short() - o2::constants::physics::MassK0Short) < cfgv0_mk0swindow && - (!cfgcheckDauTPC || (std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0])) && - (!cfgcheckDauTOF || ((std::fabs(v0posdau.tofNSigmaPi()) < cfgNSigma[3] || v0posdau.pt() < lowpt) && (std::fabs(v0negdau.tofNSigmaPi()) < cfgNSigma[3] || v0negdau.pt() < lowpt)))) { - registry.fill(HIST("InvMassK0s_all"), v0.pt(), v0.mK0Short(), v0.eta(), cent); - isK0s = true; - candNumAll[0] = candNumAll[0] + 1; - registry.fill(HIST("QAhisto/V0/hqaarm_podoafter"), v0.alpha(), v0.qtarm()); + if (v0.pt() > trkQualityOpts.cfgCutPtK0sMin.value && v0.pt() < trkQualityOpts.cfgCutPtK0sMax.value) { + if (v0.qtarm() / std::fabs(v0.alpha()) > v0BuilderOpts.cfgv0_ArmPodocut.value && + std::fabs(v0.mK0Short() - o2::constants::physics::MassK0Short) < v0BuilderOpts.cfgv0_mk0swindow.value && + (std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0]) && + ((std::fabs(v0posdau.tofNSigmaPi()) < cfgNSigma[3] || v0posdau.pt() < lowpt) && (std::fabs(v0negdau.tofNSigmaPi()) < cfgNSigma[3] || v0negdau.pt() < lowpt)) && + ((std::fabs(itsResponse.nSigmaITS(v0posdau)) < cfgNSigma[6]) || v0posdau.pt() < lowpt) && ((std::fabs(itsResponse.nSigmaITS(v0negdau)) < cfgNSigma[6]) || v0negdau.pt() < lowpt)) { + registry.fill(HIST("InvMassK0s_all"), v0.pt(), v0.mK0Short(), v0.eta(), cent); + isK0s = true; + candNumAll[0] = candNumAll[0] + 1; + if (cfgOutputQA) { + registry.fill(HIST("QAhisto/V0/hqaarm_podoafter"), v0.alpha(), v0.qtarm()); + } + } } // Lambda and antiLambda - if (std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < cfgv0_mlambdawindow && - (!cfgcheckDauTPC || (std::fabs(v0posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0])) && - (!cfgcheckDauTOF || ((std::fabs(v0posdau.tofNSigmaPr()) < cfgNSigma[4] || v0posdau.pt() < lowpt) && (std::fabs(v0negdau.tofNSigmaPi()) < cfgNSigma[3] || v0negdau.pt() < lowpt)))) { - registry.fill(HIST("InvMassLambda_all"), v0.pt(), v0.mLambda(), v0.eta(), cent); - isLambda = true; - candNumAll[1] = candNumAll[1] + 1; - } else if (std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < cfgv0_mlambdawindow && - (!cfgcheckDauTPC || (std::fabs(v0negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0])) && - (!cfgcheckDauTOF || ((std::fabs(v0negdau.tofNSigmaPr()) < cfgNSigma[4] || v0negdau.pt() < lowpt) && (std::fabs(v0posdau.tofNSigmaPi()) < cfgNSigma[3] || v0posdau.pt() < lowpt)))) { - registry.fill(HIST("InvMassLambda_all"), v0.pt(), v0.mLambda(), v0.eta(), cent); - isLambda = true; - candNumAll[1] = candNumAll[1] + 1; + if (v0.pt() > trkQualityOpts.cfgCutPtLambdaMin.value && v0.pt() < trkQualityOpts.cfgCutPtLambdaMax.value) { + if (std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < v0BuilderOpts.cfgv0_mlambdawindow.value && + (std::fabs(v0posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0]) && + ((std::fabs(v0posdau.tofNSigmaPr()) < cfgNSigma[4] || v0posdau.pt() < lowpt) && (std::fabs(v0negdau.tofNSigmaPi()) < cfgNSigma[3] || v0negdau.pt() < lowpt)) && + ((std::fabs(itsResponse.nSigmaITS(v0posdau)) < cfgNSigma[7]) || v0posdau.pt() < lowpt) && ((std::fabs(itsResponse.nSigmaITS(v0negdau)) < cfgNSigma[6]) || v0negdau.pt() < lowpt)) { + registry.fill(HIST("InvMassLambda_all"), v0.pt(), v0.mLambda(), v0.eta(), cent); + isLambda = true; + candNumAll[1] = candNumAll[1] + 1; + } else if (std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < v0BuilderOpts.cfgv0_mlambdawindow.value && + (std::fabs(v0negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0]) && + ((std::fabs(v0negdau.tofNSigmaPr()) < cfgNSigma[4] || v0negdau.pt() < lowpt) && (std::fabs(v0posdau.tofNSigmaPi()) < cfgNSigma[3] || v0posdau.pt() < lowpt)) && + ((std::fabs(itsResponse.nSigmaITS(v0posdau)) < cfgNSigma[7]) || v0posdau.pt() < lowpt) && ((std::fabs(itsResponse.nSigmaITS(v0negdau)) < cfgNSigma[6]) || v0negdau.pt() < lowpt)) { + registry.fill(HIST("InvMassLambda_all"), v0.pt(), v0.mLambda(), v0.eta(), cent); + isLambda = true; + candNumAll[1] = candNumAll[1] + 1; + } } // fill QA before cut - registry.fill(HIST("QAhisto/V0/hqaV0radiusbefore"), v0.v0radius()); - registry.fill(HIST("QAhisto/V0/hqaV0cosPAbefore"), v0.v0cosPA()); - registry.fill(HIST("QAhisto/V0/hqadcaV0daubefore"), v0.dcaV0daughters()); - registry.fill(HIST("QAhisto/V0/hqadcapostoPVbefore"), v0.dcapostopv()); - registry.fill(HIST("QAhisto/V0/hqadcanegtoPVbefore"), v0.dcanegtopv()); + if (cfgOutputQA) { + registry.fill(HIST("QAhisto/V0/hqaV0radiusbefore"), v0.v0radius()); + registry.fill(HIST("QAhisto/V0/hqaV0cosPAbefore"), v0.v0cosPA()); + registry.fill(HIST("QAhisto/V0/hqadcaV0daubefore"), v0.dcaV0daughters()); + registry.fill(HIST("QAhisto/V0/hqadcapostoPVbefore"), v0.dcapostopv()); + registry.fill(HIST("QAhisto/V0/hqadcanegtoPVbefore"), v0.dcanegtopv()); + } if (!isK0s && !isLambda) continue; // track quality check - if (v0posdau.tpcNClsFound() < cfgtpcclusters) - continue; - if (v0negdau.tpcNClsFound() < cfgtpcclusters) + if (!v0posdau.passedITSNCls() && trkQualityOpts.cfgCheckITSNCls.value) continue; - if (v0posdau.tpcNClsFindable() < cfgtpcclufindable) + if (!v0negdau.passedITSNCls() && trkQualityOpts.cfgCheckITSNCls.value) continue; - if (v0negdau.tpcNClsFindable() < cfgtpcclufindable) + if (!v0posdau.passedITSHits() && trkQualityOpts.cfgCheckITSHits.value) continue; - if (v0posdau.tpcCrossedRowsOverFindableCls() < cfgtpccrossoverfindable) + if (!v0negdau.passedITSHits() && trkQualityOpts.cfgCheckITSHits.value) continue; - if (v0posdau.itsNCls() < cfgitsclusters) + if (!v0posdau.passedITSChi2NDF() && trkQualityOpts.cfgCheckITSChi2NDF.value) continue; - if (v0negdau.itsNCls() < cfgitsclusters) + if (!v0negdau.passedITSChi2NDF() && trkQualityOpts.cfgCheckITSChi2NDF.value) continue; - // topological cut - if (v0.v0radius() < cfgv0_radius) + if (trkQualityOpts.cfgCheckGlobalTrack.value) { + if (!v0posdau.hasTPC() || !v0posdau.hasITS()) + continue; + if (!v0negdau.hasTPC() || !v0negdau.hasITS()) + continue; + } + // // topological cut + if (v0.v0radius() < v0BuilderOpts.cfgv0_radius.value) continue; - if (v0.v0cosPA() < cfgv0_v0cospa) + if (v0.v0cosPA() < v0BuilderOpts.cfgv0_v0cospa.value) continue; - if (v0.dcaV0daughters() > cfgv0_dcav0dau) + if (v0.dcaV0daughters() > v0BuilderOpts.cfgv0_dcav0dau.value) continue; - if (std::fabs(v0.dcapostopv()) < cfgv0_dcadautopv) + if (std::fabs(v0.dcapostopv()) < v0BuilderOpts.cfgv0_dcadautopv.value) continue; - if (std::fabs(v0.dcanegtopv()) < cfgv0_dcadautopv) + if (std::fabs(v0.dcanegtopv()) < v0BuilderOpts.cfgv0_dcadautopv.value) continue; + // fill QA after cut - registry.fill(HIST("QAhisto/V0/hqaV0radiusafter"), v0.v0radius()); - registry.fill(HIST("QAhisto/V0/hqaV0cosPAafter"), v0.v0cosPA()); - registry.fill(HIST("QAhisto/V0/hqadcaV0dauafter"), v0.dcaV0daughters()); - registry.fill(HIST("QAhisto/V0/hqadcapostoPVafter"), v0.dcapostopv()); - registry.fill(HIST("QAhisto/V0/hqadcanegtoPVafter"), v0.dcanegtopv()); + if (cfgOutputQA) { + registry.fill(HIST("QAhisto/V0/hqaV0radiusafter"), v0.v0radius()); + registry.fill(HIST("QAhisto/V0/hqaV0cosPAafter"), v0.v0cosPA()); + registry.fill(HIST("QAhisto/V0/hqadcaV0dauafter"), v0.dcaV0daughters()); + registry.fill(HIST("QAhisto/V0/hqadcapostoPVafter"), v0.dcapostopv()); + registry.fill(HIST("QAhisto/V0/hqadcanegtoPVafter"), v0.dcanegtopv()); + } if (isK0s) { if (cfgDoAccEffCorr) setCurrentParticleWeights(weff, wacc, v0, vtxz, 1); @@ -880,7 +1008,7 @@ struct FlowGfwOmegaXi { candNum[0] = candNum[0] + 1; registry.fill(HIST("InvMassK0s"), v0.pt(), v0.mK0Short(), v0.eta(), cent); registry.fill(HIST("hEtaPhiVtxzPOIK0s"), v0.phi(), v0.eta(), vtxz, wacc); - fGFW->Fill(v0.eta(), fV0PtAxis->FindBin(v0.pt()) - 1 + ((fK0sMass->FindBin(v0.mK0Short()) - 1) * nV0PtBins), v0.phi(), wacc * weff * wloc, 8); + fGFW->Fill(v0.eta(), fK0sPtAxis->FindBin(v0.pt()) - 1 + ((fK0sMass->FindBin(v0.mK0Short()) - 1) * nK0sPtBins), v0.phi(), wacc * weff * wloc, 8); if (cfgOutputNUAWeights) fWeightsK0s->fill(v0.phi(), v0.eta(), vtxz, v0.pt(), cent, 0); } @@ -898,97 +1026,129 @@ struct FlowGfwOmegaXi { candNum[1] = candNum[1] + 1; registry.fill(HIST("InvMassLambda"), v0.pt(), v0.mLambda(), v0.eta(), cent); registry.fill(HIST("hEtaPhiVtxzPOILambda"), v0.phi(), v0.eta(), vtxz, wacc); - fGFW->Fill(v0.eta(), fV0PtAxis->FindBin(v0.pt()) - 1 + ((fLambdaMass->FindBin(v0.mLambda()) - 1) * nV0PtBins), v0.phi(), wacc * weff * wloc, 16); + fGFW->Fill(v0.eta(), fK0sPtAxis->FindBin(v0.pt()) - 1 + ((fLambdaMass->FindBin(v0.mLambda()) - 1) * nK0sPtBins), v0.phi(), wacc * weff * wloc, 16); if (cfgOutputNUAWeights) fWeightsLambda->fill(v0.phi(), v0.eta(), vtxz, v0.pt(), cent, 0); } } + // fill GFW of casc flow for (const auto& casc : Cascades) { auto bachelor = casc.bachelor_as(); auto posdau = casc.posTrack_as(); auto negdau = casc.negTrack_as(); // check TPC - if (cfgcheckDauTPC && (!posdau.hasTPC() || !negdau.hasTPC() || !bachelor.hasTPC())) { - continue; - } bool isOmega = false; bool isXi = false; + + if (bachelor.pt() < trkQualityOpts.cfgCutPtDauMin.value || bachelor.pt() > trkQualityOpts.cfgCutPtDauMax.value) + continue; + if (posdau.pt() < trkQualityOpts.cfgCutPtDauMin.value || posdau.pt() > trkQualityOpts.cfgCutPtDauMax.value) + continue; + if (negdau.pt() < trkQualityOpts.cfgCutPtDauMin.value || negdau.pt() > trkQualityOpts.cfgCutPtDauMax.value) + continue; + // Omega and antiOmega - if (casc.sign() < 0 && std::fabs(casc.yOmega()) < cfgCasc_rapidity && - (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0])) && - (!cfgcheckDauTOF || ((std::fabs(bachelor.tofNSigmaKa()) < cfgNSigma[5] || bachelor.pt() < lowpt) && (std::fabs(posdau.tofNSigmaPr()) < cfgNSigma[4] || posdau.pt() < lowpt) && (std::fabs(negdau.tofNSigmaPi()) < cfgNSigma[3] || negdau.pt() < lowpt)))) { - registry.fill(HIST("InvMassOmega_all"), casc.pt(), casc.mOmega(), casc.eta(), cent); - isOmega = true; - candNumAll[3] = candNumAll[3] + 1; - } else if (casc.sign() > 0 && std::fabs(casc.yOmega()) < cfgCasc_rapidity && - (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0])) && - (!cfgcheckDauTOF || ((std::fabs(bachelor.tofNSigmaKa()) < cfgNSigma[5] || bachelor.pt() < lowpt) && (std::fabs(negdau.tofNSigmaPr()) < cfgNSigma[4] || negdau.pt() < lowpt) && (std::fabs(posdau.tofNSigmaPi()) < cfgNSigma[3] || posdau.pt() < lowpt)))) { - registry.fill(HIST("InvMassOmega_all"), casc.pt(), casc.mOmega(), casc.eta(), cent); - isOmega = true; - candNumAll[3] = candNumAll[3] + 1; + if (casc.pt() > trkQualityOpts.cfgCutPtOmegaMin.value && casc.pt() < trkQualityOpts.cfgCutPtOmegaMax.value) { + if (casc.sign() < 0 && std::fabs(casc.yOmega()) < cfgCasc_rapidity && + (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0]) && + ((std::fabs(bachelor.tofNSigmaKa()) < cfgNSigma[5] || bachelor.pt() < lowpt) && (std::fabs(posdau.tofNSigmaPr()) < cfgNSigma[4] || posdau.pt() < lowpt) && (std::fabs(negdau.tofNSigmaPi()) < cfgNSigma[3] || negdau.pt() < lowpt)) && + ((std::fabs(itsResponse.nSigmaITS(bachelor)) < cfgNSigma[8]) || bachelor.pt() < lowpt) && ((std::fabs(itsResponse.nSigmaITS(posdau)) < cfgNSigma[7]) || posdau.pt() < lowpt) && ((std::fabs(itsResponse.nSigmaITS(negdau)) < cfgNSigma[6]) || negdau.pt() < lowpt)) { + registry.fill(HIST("InvMassOmega_all"), casc.pt(), casc.mOmega(), casc.eta(), cent); + isOmega = true; + candNumAll[3] = candNumAll[3] + 1; + } else if (casc.sign() > 0 && std::fabs(casc.yOmega()) < cfgCasc_rapidity && + (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0]) && + ((std::fabs(bachelor.tofNSigmaKa()) < cfgNSigma[5] || bachelor.pt() < lowpt) && (std::fabs(negdau.tofNSigmaPr()) < cfgNSigma[4] || negdau.pt() < lowpt) && (std::fabs(posdau.tofNSigmaPi()) < cfgNSigma[3] || posdau.pt() < lowpt)) && + ((std::fabs(itsResponse.nSigmaITS(bachelor)) < cfgNSigma[8]) || bachelor.pt() < lowpt) && ((std::fabs(itsResponse.nSigmaITS(posdau)) < cfgNSigma[7]) || posdau.pt() < lowpt) && ((std::fabs(itsResponse.nSigmaITS(negdau)) < cfgNSigma[6]) || negdau.pt() < lowpt)) { + registry.fill(HIST("InvMassOmega_all"), casc.pt(), casc.mOmega(), casc.eta(), cent); + isOmega = true; + candNumAll[3] = candNumAll[3] + 1; + } } // Xi and antiXi - if (casc.sign() < 0 && std::fabs(casc.yXi()) < cfgCasc_rapidity && - (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0])) && - (!cfgcheckDauTOF || ((std::fabs(bachelor.tofNSigmaPi()) < cfgNSigma[3] || bachelor.pt() < lowpt) && (std::fabs(posdau.tofNSigmaPr()) < cfgNSigma[4] || posdau.pt() < lowpt) && (std::fabs(negdau.tofNSigmaPi()) < cfgNSigma[3] || negdau.pt() < lowpt)))) { - registry.fill(HIST("InvMassXi_all"), casc.pt(), casc.mXi(), casc.eta(), cent); - isXi = true; - candNumAll[2] = candNumAll[2] + 1; - } else if (casc.sign() > 0 && std::fabs(casc.yXi()) < cfgCasc_rapidity && - (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0])) && - (!cfgcheckDauTOF || ((std::fabs(bachelor.tofNSigmaPi()) < cfgNSigma[3] || bachelor.pt() < lowpt) && (std::fabs(negdau.tofNSigmaPr()) < cfgNSigma[4] || negdau.pt() < lowpt) && (std::fabs(posdau.tofNSigmaPi()) < cfgNSigma[3] || posdau.pt() < lowpt)))) { - registry.fill(HIST("InvMassXi_all"), casc.pt(), casc.mXi(), casc.eta(), cent); - isXi = true; - candNumAll[2] = candNumAll[2] + 1; + if (casc.pt() > trkQualityOpts.cfgCutPtXiMin.value && casc.pt() < trkQualityOpts.cfgCutPtXiMax.value) { + if (casc.sign() < 0 && std::fabs(casc.yXi()) < cfgCasc_rapidity && + (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0]) && + ((std::fabs(bachelor.tofNSigmaPi()) < cfgNSigma[3] || bachelor.pt() < lowpt) && (std::fabs(posdau.tofNSigmaPr()) < cfgNSigma[4] || posdau.pt() < lowpt) && (std::fabs(negdau.tofNSigmaPi()) < cfgNSigma[3] || negdau.pt() < lowpt)) && + ((std::fabs(itsResponse.nSigmaITS(bachelor)) < cfgNSigma[6]) || bachelor.pt() < lowpt) && ((std::fabs(itsResponse.nSigmaITS(posdau)) < cfgNSigma[7]) || posdau.pt() < lowpt) && ((std::fabs(itsResponse.nSigmaITS(negdau)) < cfgNSigma[6]) || negdau.pt() < lowpt)) { + registry.fill(HIST("InvMassXi_all"), casc.pt(), casc.mXi(), casc.eta(), cent); + isXi = true; + candNumAll[2] = candNumAll[2] + 1; + } else if (casc.sign() > 0 && std::fabs(casc.yXi()) < cfgCasc_rapidity && + (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0]) && + ((std::fabs(bachelor.tofNSigmaPi()) < cfgNSigma[3] || bachelor.pt() < lowpt) && (std::fabs(negdau.tofNSigmaPr()) < cfgNSigma[4] || negdau.pt() < lowpt) && (std::fabs(posdau.tofNSigmaPi()) < cfgNSigma[3] || posdau.pt() < lowpt)) && + ((std::fabs(itsResponse.nSigmaITS(bachelor)) < cfgNSigma[6]) || bachelor.pt() < lowpt) && ((std::fabs(itsResponse.nSigmaITS(posdau)) < cfgNSigma[7]) || posdau.pt() < lowpt) && ((std::fabs(itsResponse.nSigmaITS(negdau)) < cfgNSigma[6]) || negdau.pt() < lowpt)) { + registry.fill(HIST("InvMassXi_all"), casc.pt(), casc.mXi(), casc.eta(), cent); + isXi = true; + candNumAll[2] = candNumAll[2] + 1; + } } // fill QA - registry.fill(HIST("QAhisto/Casc/hqaCasccosPAbefore"), casc.casccosPA(collision.posX(), collision.posY(), collision.posZ())); - registry.fill(HIST("QAhisto/Casc/hqaCascV0cosPAbefore"), casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ())); - registry.fill(HIST("QAhisto/Casc/hqadcaCascV0toPVbefore"), casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ())); - registry.fill(HIST("QAhisto/Casc/hqadcaCascBachtoPVbefore"), casc.dcabachtopv()); - registry.fill(HIST("QAhisto/Casc/hqadcaCascdaubefore"), casc.dcacascdaughters()); - registry.fill(HIST("QAhisto/Casc/hqadcaCascV0daubefore"), casc.dcaV0daughters()); + if (cfgOutputQA) { + registry.fill(HIST("QAhisto/Casc/hqaCasccosPAbefore"), casc.casccosPA(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqaCascV0cosPAbefore"), casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqadcaCascV0toPVbefore"), casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqadcaCascBachtoPVbefore"), casc.dcabachtopv()); + registry.fill(HIST("QAhisto/Casc/hqadcaCascdaubefore"), casc.dcacascdaughters()); + registry.fill(HIST("QAhisto/Casc/hqadcaCascV0daubefore"), casc.dcaV0daughters()); + } if (!isXi && !isOmega) continue; - // topological cut - if (casc.cascradius() < cfgcasc_radius) + // // topological cut + if (casc.cascradius() < cascBuilderOpts.cfgcasc_radius.value) continue; - if (casc.casccosPA(collision.posX(), collision.posY(), collision.posZ()) < cfgcasc_casccospa) + if (casc.casccosPA(collision.posX(), collision.posY(), collision.posZ()) < cascBuilderOpts.cfgcasc_casccospa.value) continue; - if (casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ()) < cfgcasc_v0cospa) + if (casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ()) < cascBuilderOpts.cfgcasc_v0cospa.value) continue; - if (std::fabs(casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ())) < cfgcasc_dcav0topv) + if (std::fabs(casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ())) < cascBuilderOpts.cfgcasc_dcav0topv.value) continue; - if (std::fabs(casc.dcabachtopv()) < cfgcasc_dcabachtopv) + if (std::fabs(casc.dcabachtopv()) < cascBuilderOpts.cfgcasc_dcabachtopv.value) continue; - if (casc.dcacascdaughters() > cfgcasc_dcacascdau) + if (casc.dcacascdaughters() > cascBuilderOpts.cfgcasc_dcacascdau.value) continue; - if (casc.dcaV0daughters() > cfgcasc_dcav0dau) + if (casc.dcaV0daughters() > cascBuilderOpts.cfgcasc_dcav0dau.value) continue; - if (std::fabs(casc.mLambda() - o2::constants::physics::MassLambda0) > cfgcasc_mlambdawindow) + if (std::fabs(casc.mLambda() - o2::constants::physics::MassLambda0) > cascBuilderOpts.cfgcasc_mlambdawindow.value) continue; - // track quality check - if (bachelor.tpcNClsFound() < cfgtpcclusters) + // // track quality check + if (!bachelor.passedITSNCls() && trkQualityOpts.cfgCheckITSNCls.value) continue; - if (posdau.tpcNClsFound() < cfgtpcclusters) + if (!posdau.passedITSNCls() && trkQualityOpts.cfgCheckITSNCls.value) continue; - if (negdau.tpcNClsFound() < cfgtpcclusters) + if (!negdau.passedITSNCls() && trkQualityOpts.cfgCheckITSNCls.value) continue; - if (bachelor.itsNCls() < cfgitsclusters) + if (!bachelor.passedITSHits() && trkQualityOpts.cfgCheckITSHits.value) continue; - if (posdau.itsNCls() < cfgitsclusters) + if (!posdau.passedITSHits() && trkQualityOpts.cfgCheckITSHits.value) continue; - if (negdau.itsNCls() < cfgitsclusters) + if (!negdau.passedITSHits() && trkQualityOpts.cfgCheckITSHits.value) continue; + if (!bachelor.passedITSChi2NDF() && trkQualityOpts.cfgCheckITSChi2NDF.value) + continue; + if (!posdau.passedITSChi2NDF() && trkQualityOpts.cfgCheckITSChi2NDF.value) + continue; + if (!negdau.passedITSChi2NDF() && trkQualityOpts.cfgCheckITSChi2NDF.value) + continue; + if (trkQualityOpts.cfgCheckGlobalTrack.value) { + if (!bachelor.hasTPC() || !bachelor.hasITS()) + continue; + if (!posdau.hasTPC() || !posdau.hasITS()) + continue; + if (!negdau.hasTPC() || !negdau.hasITS()) + continue; + } // fill QA - registry.fill(HIST("QAhisto/Casc/hqaCasccosPAafter"), casc.casccosPA(collision.posX(), collision.posY(), collision.posZ())); - registry.fill(HIST("QAhisto/Casc/hqaCascV0cosPAafter"), casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ())); - registry.fill(HIST("QAhisto/Casc/hqadcaCascV0toPVafter"), casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ())); - registry.fill(HIST("QAhisto/Casc/hqadcaCascBachtoPVafter"), casc.dcabachtopv()); - registry.fill(HIST("QAhisto/Casc/hqadcaCascdauafter"), casc.dcacascdaughters()); - registry.fill(HIST("QAhisto/Casc/hqadcaCascV0dauafter"), casc.dcaV0daughters()); + if (cfgOutputQA) { + registry.fill(HIST("QAhisto/Casc/hqaCasccosPAafter"), casc.casccosPA(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqaCascV0cosPAafter"), casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqadcaCascV0toPVafter"), casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqadcaCascBachtoPVafter"), casc.dcabachtopv()); + registry.fill(HIST("QAhisto/Casc/hqadcaCascdauafter"), casc.dcacascdaughters()); + registry.fill(HIST("QAhisto/Casc/hqadcaCascV0dauafter"), casc.dcaV0daughters()); + } if (isOmega) { if (cfgDoAccEffCorr) @@ -1004,7 +1164,7 @@ struct FlowGfwOmegaXi { candNum[3] = candNum[3] + 1; registry.fill(HIST("hEtaPhiVtxzPOIOmega"), casc.phi(), casc.eta(), vtxz, wacc); registry.fill(HIST("InvMassOmega"), casc.pt(), casc.mOmega(), casc.eta(), cent); - fGFW->Fill(casc.eta(), fXiPtAxis->FindBin(casc.pt()) - 1 + ((fOmegaMass->FindBin(casc.mOmega()) - 1) * nXiPtBins), casc.phi(), wacc * weff * wloc, 4); + fGFW->Fill(casc.eta(), fOmegaPtAxis->FindBin(casc.pt()) - 1 + ((fOmegaMass->FindBin(casc.mOmega()) - 1) * nOmegaPtBins), casc.phi(), wacc * weff * wloc, 4); if (cfgOutputNUAWeights) fWeightsOmega->fill(casc.phi(), casc.eta(), vtxz, casc.pt(), cent, 0); } @@ -1039,26 +1199,39 @@ struct FlowGfwOmegaXi { // Filling cumulant with ROOT TProfile and loop for all ptBins fillProfile(corrconfigs.at(15), HIST("c22"), cent); fillProfile(corrconfigs.at(16), HIST("c24"), cent); + fillProfile(corrconfigs.at(25), HIST("c32"), cent); for (int i = 1; i <= nPtBins; i++) { fillProfilepT(corrconfigs.at(0), HIST("c22dpt"), i, cent); fillProfilepT(corrconfigs.at(1), HIST("c22dpt"), i, cent); fillProfilepT(corrconfigs.at(2), HIST("c24dpt"), i, cent); } - for (int i = 1; i <= nV0PtBins; i++) { + for (int i = 1; i <= nK0sPtBins; i++) { fillProfilepTMass(corrconfigs.at(9), HIST("K0sc22dpt"), i, kK0Short, cent); fillProfilepTMass(corrconfigs.at(10), HIST("K0sc22dpt"), i, kK0Short, cent); fillProfilepTMass(corrconfigs.at(11), HIST("K0sc24dpt"), i, kK0Short, cent); + fillProfilepTMass(corrconfigs.at(21), HIST("K0sc32dpt"), i, kK0Short, cent); + fillProfilepTMass(corrconfigs.at(22), HIST("K0sc32dpt"), i, kK0Short, cent); + } + for (int i = 1; i <= nLambdaPtBins; i++) { fillProfilepTMass(corrconfigs.at(12), HIST("Lambdac22dpt"), i, kLambda0, cent); fillProfilepTMass(corrconfigs.at(13), HIST("Lambdac22dpt"), i, kLambda0, cent); fillProfilepTMass(corrconfigs.at(14), HIST("Lambdac24dpt"), i, kLambda0, cent); + fillProfilepTMass(corrconfigs.at(23), HIST("Lambdac32dpt"), i, kLambda0, cent); + fillProfilepTMass(corrconfigs.at(24), HIST("Lambdac32dpt"), i, kLambda0, cent); } for (int i = 1; i <= nXiPtBins; i++) { fillProfilepTMass(corrconfigs.at(3), HIST("Xic22dpt"), i, kXiMinus, cent); fillProfilepTMass(corrconfigs.at(4), HIST("Xic22dpt"), i, kXiMinus, cent); fillProfilepTMass(corrconfigs.at(5), HIST("Xic24dpt"), i, kXiMinus, cent); + fillProfilepTMass(corrconfigs.at(17), HIST("Xic32dpt"), i, kXiMinus, cent); + fillProfilepTMass(corrconfigs.at(18), HIST("Xic32dpt"), i, kXiMinus, cent); + } + for (int i = 1; i <= nOmegaPtBins; i++) { fillProfilepTMass(corrconfigs.at(6), HIST("Omegac22dpt"), i, kOmegaMinus, cent); fillProfilepTMass(corrconfigs.at(7), HIST("Omegac22dpt"), i, kOmegaMinus, cent); fillProfilepTMass(corrconfigs.at(8), HIST("Omegac24dpt"), i, kOmegaMinus, cent); + fillProfilepTMass(corrconfigs.at(19), HIST("Omegac32dpt"), i, kOmegaMinus, cent); + fillProfilepTMass(corrconfigs.at(20), HIST("Omegac32dpt"), i, kOmegaMinus, cent); } // Fill subevents flow if (cfgDoJackknife) { @@ -1070,21 +1243,34 @@ struct FlowGfwOmegaXi { continue; fillProfile(corrconfigs.at(15), refc22[j - 1], cent); fillProfile(corrconfigs.at(16), refc24[j - 1], cent); - for (int i = 1; i <= nV0PtBins; i++) { + fillProfile(corrconfigs.at(25), refc32[j - 1], cent); + for (int i = 1; i <= nK0sPtBins; i++) { fillProfilepTMass(corrconfigs.at(9), k0sc22[j - 1], i, kK0Short, cent); fillProfilepTMass(corrconfigs.at(10), k0sc22[j - 1], i, kK0Short, cent); fillProfilepTMass(corrconfigs.at(11), k0sc24[j - 1], i, kK0Short, cent); + fillProfilepTMass(corrconfigs.at(21), k0sc32[j - 1], i, kK0Short, cent); + fillProfilepTMass(corrconfigs.at(22), k0sc32[j - 1], i, kK0Short, cent); + } + for (int i = 1; i <= nLambdaPtBins; i++) { fillProfilepTMass(corrconfigs.at(12), lambdac22[j - 1], i, kLambda0, cent); fillProfilepTMass(corrconfigs.at(13), lambdac22[j - 1], i, kLambda0, cent); fillProfilepTMass(corrconfigs.at(14), lambdac24[j - 1], i, kLambda0, cent); + fillProfilepTMass(corrconfigs.at(23), lambdac32[j - 1], i, kLambda0, cent); + fillProfilepTMass(corrconfigs.at(24), lambdac32[j - 1], i, kLambda0, cent); } for (int i = 1; i <= nXiPtBins; i++) { fillProfilepTMass(corrconfigs.at(3), xic22[j - 1], i, kXiMinus, cent); fillProfilepTMass(corrconfigs.at(4), xic22[j - 1], i, kXiMinus, cent); fillProfilepTMass(corrconfigs.at(5), xic24[j - 1], i, kXiMinus, cent); + fillProfilepTMass(corrconfigs.at(17), xic32[j - 1], i, kXiMinus, cent); + fillProfilepTMass(corrconfigs.at(18), xic32[j - 1], i, kXiMinus, cent); + } + for (int i = 1; i <= nOmegaPtBins; i++) { fillProfilepTMass(corrconfigs.at(6), omegac22[j - 1], i, kOmegaMinus, cent); fillProfilepTMass(corrconfigs.at(7), omegac22[j - 1], i, kOmegaMinus, cent); fillProfilepTMass(corrconfigs.at(8), omegac24[j - 1], i, kOmegaMinus, cent); + fillProfilepTMass(corrconfigs.at(19), omegac32[j - 1], i, kOmegaMinus, cent); + fillProfilepTMass(corrconfigs.at(20), omegac32[j - 1], i, kOmegaMinus, cent); } } } @@ -1114,10 +1300,7 @@ struct FlowGfwOmegaXi { if (mcParticle.has_tracks()) { auto const& tracks = mcParticle.tracks_as(); for (const auto& track : tracks) { - if (track.pt() < cfgCutPtPOIMin || track.pt() > cfgCutPtPOIMax) { - continue; - } - if (std::fabs(track.eta()) > cfgCutEta) { + if (std::fabs(track.eta()) > trkQualityOpts.cfgCutEta.value) { continue; } if (!(track.isGlobalTrack())) { @@ -1127,10 +1310,10 @@ struct FlowGfwOmegaXi { continue; } int ptbin = fPtAxis->FindBin(mcParticle.pt()) - 1; - if ((mcParticle.pt() > cfgCutPtMin) && (mcParticle.pt() < cfgCutPtMax)) { + if ((mcParticle.pt() > trkQualityOpts.cfgCutPtMin.value) && (mcParticle.pt() < trkQualityOpts.cfgCutPtMax.value)) { fGFW->Fill(mcParticle.eta(), ptbin, mcParticle.phi(), 1, 64); //(eta, ptbin, phi, wacc*weff, bitmask) } - if ((mcParticle.pt() > cfgCutPtPOIMin) && (mcParticle.pt() < cfgCutPtPOIMax)) { + if ((mcParticle.pt() > trkQualityOpts.cfgCutPtPOIMin.value) && (mcParticle.pt() < trkQualityOpts.cfgCutPtPOIMax.value)) { hLocalDensity->Fill(mcParticle.phi(), 1); hLocalDensity->Fill(RecoDecay::constrainAngle(mcParticle.phi(), -constants::math::TwoPI), 1); nch++; @@ -1146,7 +1329,7 @@ struct FlowGfwOmegaXi { int pdgCode = std::abs(straGen.pdgCode()); if (pdgCode != PDG_t::kXiMinus && pdgCode != PDG_t::kOmegaMinus && pdgCode != PDG_t::kK0Short && pdgCode != PDG_t::kLambda0) continue; - if (std::fabs(straGen.eta()) > cfgCutEta) + if (std::fabs(straGen.eta()) > trkQualityOpts.cfgCutEta.value) continue; if (pdgCode == PDG_t::kXiMinus) { @@ -1161,7 +1344,7 @@ struct FlowGfwOmegaXi { double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); if (cfgOutputLocDenWeights) registry.fill(HIST("MC/densityMCGenOmega"), straGen.pt(), nch, density); - fGFW->Fill(straGen.eta(), fXiPtAxis->FindBin(straGen.pt()) - 1, straGen.phi(), 1, 256); + fGFW->Fill(straGen.eta(), fOmegaPtAxis->FindBin(straGen.pt()) - 1, straGen.phi(), 1, 256); } if (pdgCode == PDG_t::kK0Short) { @@ -1169,28 +1352,32 @@ struct FlowGfwOmegaXi { double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); if (cfgOutputLocDenWeights) registry.fill(HIST("MC/densityMCGenK0s"), straGen.pt(), nch, density); - fGFW->Fill(straGen.eta(), fXiPtAxis->FindBin(straGen.pt()) - 1, straGen.phi(), 1, 512); + fGFW->Fill(straGen.eta(), fK0sPtAxis->FindBin(straGen.pt()) - 1, straGen.phi(), 1, 512); } if (pdgCode == PDG_t::kLambda0) { int phibin = hLocalDensity->FindBin(RecoDecay::constrainAngle(straGen.phi(), -constants::math::PI)); double density = hLocalDensity->Integral(phibin - cfgDeltaPhiLocDen, phibin + cfgDeltaPhiLocDen); if (cfgOutputLocDenWeights) registry.fill(HIST("MC/densityMCGenLambda"), straGen.pt(), nch, density); - fGFW->Fill(straGen.eta(), fXiPtAxis->FindBin(straGen.pt()) - 1, straGen.phi(), 1, 1024); + fGFW->Fill(straGen.eta(), fLambdaPtAxis->FindBin(straGen.pt()) - 1, straGen.phi(), 1, 1024); } } fillProfile(corrconfigs.at(25), HIST("MC/c22MC"), cent); - for (int i = 1; i <= nV0PtBins; i++) { - fillProfilepTMC(corrconfigs.at(21), HIST("MC/K0sc22dptMC"), i, kK0Short, cent); - fillProfilepTMC(corrconfigs.at(22), HIST("MC/K0sc22dptMC"), i, kK0Short, cent); - fillProfilepTMC(corrconfigs.at(23), HIST("MC/Lambdac22dptMC"), i, kLambda0, cent); - fillProfilepTMC(corrconfigs.at(24), HIST("MC/Lambdac22dptMC"), i, kLambda0, cent); + for (int i = 1; i <= nK0sPtBins; i++) { + fillProfilepTMC(corrconfigs.at(30), HIST("MC/K0sc22dptMC"), i, kK0Short, cent); + fillProfilepTMC(corrconfigs.at(31), HIST("MC/K0sc22dptMC"), i, kK0Short, cent); + } + for (int i = 1; i <= nLambdaPtBins; i++) { + fillProfilepTMC(corrconfigs.at(32), HIST("MC/Lambdac22dptMC"), i, kLambda0, cent); + fillProfilepTMC(corrconfigs.at(33), HIST("MC/Lambdac22dptMC"), i, kLambda0, cent); } for (int i = 1; i <= nXiPtBins; i++) { - fillProfilepTMC(corrconfigs.at(17), HIST("MC/Xic22dptMC"), i, kXiMinus, cent); - fillProfilepTMC(corrconfigs.at(18), HIST("MC/Xic22dptMC"), i, kXiMinus, cent); - fillProfilepTMC(corrconfigs.at(19), HIST("MC/Omegac22dptMC"), i, kOmegaMinus, cent); - fillProfilepTMC(corrconfigs.at(20), HIST("MC/Omegac22dptMC"), i, kOmegaMinus, cent); + fillProfilepTMC(corrconfigs.at(26), HIST("MC/Xic22dptMC"), i, kXiMinus, cent); + fillProfilepTMC(corrconfigs.at(27), HIST("MC/Xic22dptMC"), i, kXiMinus, cent); + } + for (int i = 1; i <= nOmegaPtBins; i++) { + fillProfilepTMC(corrconfigs.at(28), HIST("MC/Omegac22dptMC"), i, kOmegaMinus, cent); + fillProfilepTMC(corrconfigs.at(29), HIST("MC/Omegac22dptMC"), i, kOmegaMinus, cent); } delete hLocalDensity; @@ -1218,36 +1405,36 @@ struct FlowGfwOmegaXi { double nch = 0; for (const auto& track : tracks) { - if (!track.has_mcParticle()) + if (track.pt() < trkQualityOpts.cfgCutPtPOIMin.value || track.pt() > trkQualityOpts.cfgCutPtPOIMax.value) continue; - if (track.pt() < cfgCutPtPOIMin || track.pt() > cfgCutPtPOIMax) - continue; - if (std::fabs(track.eta()) > cfgCutEta) + if (std::fabs(track.eta()) > trkQualityOpts.cfgCutEta.value) continue; if (!(track.isGlobalTrack())) continue; if (track.tpcChi2NCl() > cfgCutChi2prTPCcls) continue; - auto mcParticle = track.mcParticle_as(); if (cfgDoAccEffCorr) { if (!setCurrentParticleWeights(weff, wacc, track, vtxz, 0)) continue; } + nch += wacc * weff; + if (!track.has_mcParticle()) + continue; + auto mcParticle = track.mcParticle_as(); registry.fill(HIST("hPhi"), track.phi()); registry.fill(HIST("hPhicorr"), track.phi(), wacc); registry.fill(HIST("hEta"), track.eta()); registry.fill(HIST("hEtaPhiVtxzREF"), track.phi(), track.eta(), vtxz, wacc); registry.fill(HIST("hPt"), track.pt()); int ptbin = fPtAxis->FindBin(track.pt()) - 1; - if ((track.pt() > cfgCutPtMin) && (track.pt() < cfgCutPtMax)) { + if ((track.pt() > trkQualityOpts.cfgCutPtMin.value) && (track.pt() < trkQualityOpts.cfgCutPtMax.value)) { fGFW->Fill(track.eta(), ptbin, track.phi(), wacc * weff, 1); //(eta, ptbin, phi, wacc*weff, bitmask) } - if ((track.pt() > cfgCutPtPOIMin) && (track.pt() < cfgCutPtPOIMax)) { + if ((track.pt() > trkQualityOpts.cfgCutPtPOIMin.value) && (track.pt() < trkQualityOpts.cfgCutPtPOIMax.value)) { fGFW->Fill(track.eta(), ptbin, track.phi(), wacc * weff, 32); if (cfgDoLocDenCorr) { hLocalDensity->Fill(mcParticle.phi(), wacc * weff); hLocalDensity->Fill(RecoDecay::constrainAngle(mcParticle.phi(), -constants::math::TwoPI), wacc * weff); - nch += wacc * weff; } } } @@ -1263,50 +1450,74 @@ struct FlowGfwOmegaXi { auto negdau = casc.negTrack_as(); auto posdau = casc.posTrack_as(); auto bachelor = casc.bachelor_as(); + if (bachelor.pt() < trkQualityOpts.cfgCutPtDauMin.value || bachelor.pt() > trkQualityOpts.cfgCutPtDauMax.value) + continue; + if (posdau.pt() < trkQualityOpts.cfgCutPtDauMin.value || posdau.pt() > trkQualityOpts.cfgCutPtDauMax.value) + continue; + if (negdau.pt() < trkQualityOpts.cfgCutPtDauMin.value || negdau.pt() > trkQualityOpts.cfgCutPtDauMax.value) + continue; // fill QA - registry.fill(HIST("QAhisto/Casc/hqaCasccosPAbefore"), casc.casccosPA(collision.posX(), collision.posY(), collision.posZ())); - registry.fill(HIST("QAhisto/Casc/hqaCascV0cosPAbefore"), casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ())); - registry.fill(HIST("QAhisto/Casc/hqadcaCascV0toPVbefore"), casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ())); - registry.fill(HIST("QAhisto/Casc/hqadcaCascBachtoPVbefore"), casc.dcabachtopv()); - registry.fill(HIST("QAhisto/Casc/hqadcaCascdaubefore"), casc.dcacascdaughters()); - registry.fill(HIST("QAhisto/Casc/hqadcaCascV0daubefore"), casc.dcaV0daughters()); + if (cfgOutputQA) { + registry.fill(HIST("QAhisto/Casc/hqaCasccosPAbefore"), casc.casccosPA(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqaCascV0cosPAbefore"), casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqadcaCascV0toPVbefore"), casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqadcaCascBachtoPVbefore"), casc.dcabachtopv()); + registry.fill(HIST("QAhisto/Casc/hqadcaCascdaubefore"), casc.dcacascdaughters()); + registry.fill(HIST("QAhisto/Casc/hqadcaCascV0daubefore"), casc.dcaV0daughters()); + } // track quality check - if (bachelor.tpcNClsFound() < cfgtpcclusters) + if (!bachelor.passedITSNCls() && trkQualityOpts.cfgCheckITSNCls.value) continue; - if (posdau.tpcNClsFound() < cfgtpcclusters) + if (!posdau.passedITSNCls() && trkQualityOpts.cfgCheckITSNCls.value) continue; - if (negdau.tpcNClsFound() < cfgtpcclusters) + if (!negdau.passedITSNCls() && trkQualityOpts.cfgCheckITSNCls.value) continue; - if (bachelor.itsNCls() < cfgitsclusters) + if (!bachelor.passedITSHits() && trkQualityOpts.cfgCheckITSHits.value) continue; - if (posdau.itsNCls() < cfgitsclusters) + if (!posdau.passedITSHits() && trkQualityOpts.cfgCheckITSHits.value) continue; - if (negdau.itsNCls() < cfgitsclusters) + if (!negdau.passedITSHits() && trkQualityOpts.cfgCheckITSHits.value) continue; - // topological cut - if (casc.cascradius() < cfgcasc_radius) + if (!bachelor.passedITSChi2NDF() && trkQualityOpts.cfgCheckITSChi2NDF.value) continue; - if (casc.casccosPA(collision.posX(), collision.posY(), collision.posZ()) < cfgcasc_casccospa) + if (!posdau.passedITSChi2NDF() && trkQualityOpts.cfgCheckITSChi2NDF.value) continue; - if (casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ()) < cfgcasc_v0cospa) + if (!negdau.passedITSChi2NDF() && trkQualityOpts.cfgCheckITSChi2NDF.value) continue; - if (std::fabs(casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ())) < cfgcasc_dcav0topv) + if (trkQualityOpts.cfgCheckGlobalTrack.value) { + if (!bachelor.hasTPC() || !bachelor.hasITS()) + continue; + if (!posdau.hasTPC() || !posdau.hasITS()) + continue; + if (!negdau.hasTPC() || !negdau.hasITS()) + continue; + } + // // topological cut + if (casc.cascradius() < cascBuilderOpts.cfgcasc_radius.value) + continue; + if (casc.casccosPA(collision.posX(), collision.posY(), collision.posZ()) < cascBuilderOpts.cfgcasc_casccospa.value) + continue; + if (casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ()) < cascBuilderOpts.cfgcasc_v0cospa.value) continue; - if (std::fabs(casc.dcabachtopv()) < cfgcasc_dcabachtopv) + if (std::fabs(casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ())) < cascBuilderOpts.cfgcasc_dcav0topv.value) continue; - if (casc.dcacascdaughters() > cfgcasc_dcacascdau) + if (std::fabs(casc.dcabachtopv()) < cascBuilderOpts.cfgcasc_dcabachtopv.value) continue; - if (casc.dcaV0daughters() > cfgcasc_dcav0dau) + if (casc.dcacascdaughters() > cascBuilderOpts.cfgcasc_dcacascdau.value) continue; - if (std::fabs(casc.mLambda() - o2::constants::physics::MassLambda0) > cfgcasc_mlambdawindow) + if (casc.dcaV0daughters() > cascBuilderOpts.cfgcasc_dcav0dau.value) + continue; + if (std::fabs(casc.mLambda() - o2::constants::physics::MassLambda0) > cascBuilderOpts.cfgcasc_mlambdawindow.value) continue; // fill QA - registry.fill(HIST("QAhisto/Casc/hqaCasccosPAafter"), casc.casccosPA(collision.posX(), collision.posY(), collision.posZ())); - registry.fill(HIST("QAhisto/Casc/hqaCascV0cosPAafter"), casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ())); - registry.fill(HIST("QAhisto/Casc/hqadcaCascV0toPVafter"), casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ())); - registry.fill(HIST("QAhisto/Casc/hqadcaCascBachtoPVafter"), casc.dcabachtopv()); - registry.fill(HIST("QAhisto/Casc/hqadcaCascdauafter"), casc.dcacascdaughters()); - registry.fill(HIST("QAhisto/Casc/hqadcaCascV0dauafter"), casc.dcaV0daughters()); + if (cfgOutputQA) { + registry.fill(HIST("QAhisto/Casc/hqaCasccosPAafter"), casc.casccosPA(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqaCascV0cosPAafter"), casc.v0cosPA(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqadcaCascV0toPVafter"), casc.dcav0topv(collision.posX(), collision.posY(), collision.posZ())); + registry.fill(HIST("QAhisto/Casc/hqadcaCascBachtoPVafter"), casc.dcabachtopv()); + registry.fill(HIST("QAhisto/Casc/hqadcaCascdauafter"), casc.dcacascdaughters()); + registry.fill(HIST("QAhisto/Casc/hqadcaCascV0dauafter"), casc.dcaV0daughters()); + } // Omega and antiOmega int pdgCode{cascMC.pdgCode()}; double cascPt{cascMC.pt()}; @@ -1314,7 +1525,7 @@ struct FlowGfwOmegaXi { double cascEta{cascMC.eta()}; if (std::abs(pdgCode) == kOmegaMinus) { if (casc.sign() < 0 && std::fabs(casc.yOmega()) < cfgCasc_rapidity && - (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { + (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0])) { if (cfgDoAccEffCorr) setCurrentParticleWeights(weff, wacc, casc, vtxz, 4); if (cfgDoLocDenCorr) { @@ -1325,9 +1536,9 @@ struct FlowGfwOmegaXi { if (cfgOutputLocDenWeights) registry.fill(HIST("MC/densityMCRecOmega"), cascPt, nch, density, casc.mOmega()); } - fGFW->Fill(cascEta, fXiPtAxis->FindBin(cascPt) - 1, cascPhi, wacc * weff * wloc, 4); + fGFW->Fill(cascEta, fOmegaPtAxis->FindBin(cascPt) - 1, cascPhi, wacc * weff * wloc, 4); } else if (casc.sign() > 0 && std::fabs(casc.yOmega()) < cfgCasc_rapidity && - (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0]))) { + (std::fabs(bachelor.tpcNSigmaKa()) < cfgNSigma[2] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0])) { if (cfgDoAccEffCorr) setCurrentParticleWeights(weff, wacc, casc, vtxz, 4); if (cfgDoLocDenCorr) { @@ -1338,13 +1549,13 @@ struct FlowGfwOmegaXi { if (cfgOutputLocDenWeights) registry.fill(HIST("MC/densityMCRecOmega"), cascPt, nch, density, casc.mOmega()); } - fGFW->Fill(cascEta, fXiPtAxis->FindBin(cascPt) - 1, cascPhi, wacc * weff * wloc, 4); + fGFW->Fill(cascEta, fOmegaPtAxis->FindBin(cascPt) - 1, cascPhi, wacc * weff * wloc, 4); } } // Xi and antiXi if (std::abs(pdgCode) == kXiMinus) { if (casc.sign() < 0 && std::fabs(casc.yXi()) < cfgCasc_rapidity && - (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { + (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(negdau.tpcNSigmaPi()) < cfgNSigma[0])) { if (cfgDoAccEffCorr) setCurrentParticleWeights(weff, wacc, casc, vtxz, 3); if (cfgDoLocDenCorr) { @@ -1357,7 +1568,7 @@ struct FlowGfwOmegaXi { } fGFW->Fill(cascEta, fXiPtAxis->FindBin(cascPt) - 1, cascPhi, wacc * weff * wloc, 2); } else if (casc.sign() > 0 && std::fabs(casc.yXi()) < cfgCasc_rapidity && - (!cfgcheckDauTPC || (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0]))) { + (std::fabs(bachelor.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(posdau.tpcNSigmaPi()) < cfgNSigma[0])) { if (cfgDoAccEffCorr) setCurrentParticleWeights(weff, wacc, casc, vtxz, 3); if (cfgDoLocDenCorr) { @@ -1380,45 +1591,58 @@ struct FlowGfwOmegaXi { auto v0negdau = v0.negTrack_as(); auto v0posdau = v0.posTrack_as(); - // fill QA before cut - registry.fill(HIST("QAhisto/V0/hqaV0radiusbefore"), v0.v0radius()); - registry.fill(HIST("QAhisto/V0/hqaV0cosPAbefore"), v0.v0cosPA()); - registry.fill(HIST("QAhisto/V0/hqadcaV0daubefore"), v0.dcaV0daughters()); - registry.fill(HIST("QAhisto/V0/hqadcapostoPVbefore"), v0.dcapostopv()); - registry.fill(HIST("QAhisto/V0/hqadcanegtoPVbefore"), v0.dcanegtopv()); - registry.fill(HIST("QAhisto/V0/hqaarm_podobefore"), v0.alpha(), v0.qtarm()); - // track quality check - if (v0posdau.tpcNClsFound() < cfgtpcclusters) + if (v0posdau.pt() < trkQualityOpts.cfgCutPtDauMin.value || v0posdau.pt() > trkQualityOpts.cfgCutPtDauMax.value) continue; - if (v0negdau.tpcNClsFound() < cfgtpcclusters) + if (v0negdau.pt() < trkQualityOpts.cfgCutPtDauMin.value || v0negdau.pt() > trkQualityOpts.cfgCutPtDauMax.value) continue; - if (v0posdau.tpcNClsFindable() < cfgtpcclufindable) + + // fill QA before cut + if (cfgOutputQA) { + registry.fill(HIST("QAhisto/V0/hqaV0radiusbefore"), v0.v0radius()); + registry.fill(HIST("QAhisto/V0/hqaV0cosPAbefore"), v0.v0cosPA()); + registry.fill(HIST("QAhisto/V0/hqadcaV0daubefore"), v0.dcaV0daughters()); + registry.fill(HIST("QAhisto/V0/hqadcapostoPVbefore"), v0.dcapostopv()); + registry.fill(HIST("QAhisto/V0/hqadcanegtoPVbefore"), v0.dcanegtopv()); + registry.fill(HIST("QAhisto/V0/hqaarm_podobefore"), v0.alpha(), v0.qtarm()); + } + // // track quality check + if (!v0posdau.passedITSNCls() && trkQualityOpts.cfgCheckITSNCls.value) + continue; + if (!v0negdau.passedITSNCls() && trkQualityOpts.cfgCheckITSNCls.value) continue; - if (v0negdau.tpcNClsFindable() < cfgtpcclufindable) + if (!v0posdau.passedITSHits() && trkQualityOpts.cfgCheckITSHits.value) continue; - if (v0posdau.tpcCrossedRowsOverFindableCls() < cfgtpccrossoverfindable) + if (!v0negdau.passedITSHits() && trkQualityOpts.cfgCheckITSHits.value) continue; - if (v0posdau.itsNCls() < cfgitsclusters) + if (!v0posdau.passedITSChi2NDF() && trkQualityOpts.cfgCheckITSChi2NDF.value) continue; - if (v0negdau.itsNCls() < cfgitsclusters) + if (!v0negdau.passedITSChi2NDF() && trkQualityOpts.cfgCheckITSChi2NDF.value) continue; + if (trkQualityOpts.cfgCheckGlobalTrack.value) { + if (!v0posdau.hasTPC() || !v0posdau.hasITS()) + continue; + if (!v0negdau.hasTPC() || !v0negdau.hasITS()) + continue; + } // topological cut - if (v0.v0radius() < cfgv0_radius) + if (v0.v0radius() < v0BuilderOpts.cfgv0_radius.value) continue; - if (v0.v0cosPA() < cfgv0_v0cospa) + if (v0.v0cosPA() < v0BuilderOpts.cfgv0_v0cospa.value) continue; - if (v0.dcaV0daughters() > cfgv0_dcav0dau) + if (v0.dcaV0daughters() > v0BuilderOpts.cfgv0_dcav0dau.value) continue; - if (std::fabs(v0.dcapostopv()) < cfgv0_dcadautopv) + if (std::fabs(v0.dcapostopv()) < v0BuilderOpts.cfgv0_dcadautopv.value) continue; - if (std::fabs(v0.dcanegtopv()) < cfgv0_dcadautopv) + if (std::fabs(v0.dcanegtopv()) < v0BuilderOpts.cfgv0_dcadautopv.value) continue; // fill QA after cut - registry.fill(HIST("QAhisto/V0/hqaV0radiusafter"), v0.v0radius()); - registry.fill(HIST("QAhisto/V0/hqaV0cosPAafter"), v0.v0cosPA()); - registry.fill(HIST("QAhisto/V0/hqadcaV0dauafter"), v0.dcaV0daughters()); - registry.fill(HIST("QAhisto/V0/hqadcapostoPVafter"), v0.dcapostopv()); - registry.fill(HIST("QAhisto/V0/hqadcanegtoPVafter"), v0.dcanegtopv()); + if (cfgOutputQA) { + registry.fill(HIST("QAhisto/V0/hqaV0radiusafter"), v0.v0radius()); + registry.fill(HIST("QAhisto/V0/hqaV0cosPAafter"), v0.v0cosPA()); + registry.fill(HIST("QAhisto/V0/hqadcaV0dauafter"), v0.dcaV0daughters()); + registry.fill(HIST("QAhisto/V0/hqadcapostoPVafter"), v0.dcapostopv()); + registry.fill(HIST("QAhisto/V0/hqadcanegtoPVafter"), v0.dcanegtopv()); + } int pdgCode{v0MC.pdgCode()}; double v0Pt{v0MC.pt()}; @@ -1426,8 +1650,9 @@ struct FlowGfwOmegaXi { double v0Eta{v0MC.eta()}; // K0short if (std::abs(pdgCode) == kK0Short) { - if (v0.qtarm() / std::fabs(v0.alpha()) > cfgv0_ArmPodocut && std::fabs(v0.mK0Short() - o2::constants::physics::MassK0Short) < cfgv0_mk0swindow && - (!cfgcheckDauTPC || (std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { + if (v0.qtarm() / std::fabs(v0.alpha()) > v0BuilderOpts.cfgv0_ArmPodocut.value && + std::fabs(v0.mK0Short() - o2::constants::physics::MassK0Short) < v0BuilderOpts.cfgv0_mk0swindow.value && + (std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0])) { if (cfgDoAccEffCorr) setCurrentParticleWeights(weff, wacc, v0, vtxz, 1); if (cfgDoLocDenCorr) { @@ -1438,12 +1663,12 @@ struct FlowGfwOmegaXi { if (cfgOutputLocDenWeights) registry.fill(HIST("MC/densityMCRecK0s"), v0Pt, nch, density, v0.mK0Short()); } - fGFW->Fill(v0Eta, fV0PtAxis->FindBin(v0Pt) - 1, v0Phi, wacc * weff * wloc, 8); + fGFW->Fill(v0Eta, fK0sPtAxis->FindBin(v0Pt) - 1, v0Phi, wacc * weff * wloc, 8); } } // Lambda and antiLambda - if (std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < cfgv0_mlambdawindow && - (!cfgcheckDauTPC || (std::fabs(v0posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0]))) { + if (std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < v0BuilderOpts.cfgv0_mlambdawindow.value && + (std::fabs(v0posdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(v0negdau.tpcNSigmaPi()) < cfgNSigma[0])) { if (std::abs(pdgCode) == kLambda0) { if (cfgDoAccEffCorr) setCurrentParticleWeights(weff, wacc, v0, vtxz, 2); @@ -1455,10 +1680,10 @@ struct FlowGfwOmegaXi { if (cfgOutputLocDenWeights) registry.fill(HIST("MC/densityMCRecLambda"), v0Pt, nch, density, v0.mLambda()); } - fGFW->Fill(v0Eta, fV0PtAxis->FindBin(v0Pt) - 1, v0Phi, wacc * weff * wloc, 16); + fGFW->Fill(v0Eta, fLambdaPtAxis->FindBin(v0Pt) - 1, v0Phi, wacc * weff * wloc, 16); } - } else if (std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < cfgv0_mlambdawindow && - (!cfgcheckDauTPC || (std::fabs(v0negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0]))) { + } else if (std::fabs(v0.mLambda() - o2::constants::physics::MassLambda) < v0BuilderOpts.cfgv0_mlambdawindow.value && + (std::fabs(v0negdau.tpcNSigmaPr()) < cfgNSigma[1] && std::fabs(v0posdau.tpcNSigmaPi()) < cfgNSigma[0])) { if (std::abs(pdgCode) == kLambda0) { if (cfgDoAccEffCorr) setCurrentParticleWeights(weff, wacc, v0, vtxz, 2); @@ -1470,23 +1695,36 @@ struct FlowGfwOmegaXi { if (cfgOutputLocDenWeights) registry.fill(HIST("MC/densityMCRecLambda"), v0Pt, nch, density, v0.mLambda()); } - fGFW->Fill(v0Eta, fV0PtAxis->FindBin(v0Pt) - 1, v0Phi, wacc * weff * wloc, 16); + fGFW->Fill(v0Eta, fLambdaPtAxis->FindBin(v0Pt) - 1, v0Phi, wacc * weff * wloc, 16); } } } delete hLocalDensity; fillProfile(corrconfigs.at(15), HIST("c22"), cent); - for (int i = 1; i <= nV0PtBins; i++) { + fillProfile(corrconfigs.at(25), HIST("c32"), cent); + for (int i = 1; i <= nK0sPtBins; i++) { fillProfilepTMass(corrconfigs.at(9), HIST("K0sc22dpt"), i, kK0Short, cent); fillProfilepTMass(corrconfigs.at(10), HIST("K0sc22dpt"), i, kK0Short, cent); + fillProfilepTMass(corrconfigs.at(21), HIST("K0sc32dpt"), i, kK0Short, cent); + fillProfilepTMass(corrconfigs.at(22), HIST("K0sc32dpt"), i, kK0Short, cent); + } + for (int i = 1; i <= nLambdaPtBins; i++) { fillProfilepTMass(corrconfigs.at(12), HIST("Lambdac22dpt"), i, kLambda0, cent); fillProfilepTMass(corrconfigs.at(13), HIST("Lambdac22dpt"), i, kLambda0, cent); + fillProfilepTMass(corrconfigs.at(23), HIST("Lambdac32dpt"), i, kLambda0, cent); + fillProfilepTMass(corrconfigs.at(24), HIST("Lambdac32dpt"), i, kLambda0, cent); } for (int i = 1; i <= nXiPtBins; i++) { fillProfilepTMass(corrconfigs.at(3), HIST("Xic22dpt"), i, kXiMinus, cent); fillProfilepTMass(corrconfigs.at(4), HIST("Xic22dpt"), i, kXiMinus, cent); + fillProfilepTMass(corrconfigs.at(17), HIST("Xic32dpt"), i, kXiMinus, cent); + fillProfilepTMass(corrconfigs.at(18), HIST("Xic32dpt"), i, kXiMinus, cent); + } + for (int i = 1; i <= nOmegaPtBins; i++) { fillProfilepTMass(corrconfigs.at(6), HIST("Omegac22dpt"), i, kOmegaMinus, cent); fillProfilepTMass(corrconfigs.at(7), HIST("Omegac22dpt"), i, kOmegaMinus, cent); + fillProfilepTMass(corrconfigs.at(19), HIST("Omegac32dpt"), i, kOmegaMinus, cent); + fillProfilepTMass(corrconfigs.at(20), HIST("Omegac32dpt"), i, kOmegaMinus, cent); } } PROCESS_SWITCH(FlowGfwOmegaXi, processMCRec, "", true); From 02c294428003fe64390bcfaf984173cf7d8d3628 Mon Sep 17 00:00:00 2001 From: sawan <124118453+sawankumawat@users.noreply.github.com> Date: Sat, 14 Jun 2025 13:14:37 +0530 Subject: [PATCH 1625/1650] [PWGLF] Added azimuthal angle phi distribution (#11566) Co-authored-by: Sawan Sawan --- .../Tasks/Resonances/higherMassResonances.cxx | 191 +++++++++++------- 1 file changed, 119 insertions(+), 72 deletions(-) diff --git a/PWGLF/Tasks/Resonances/higherMassResonances.cxx b/PWGLF/Tasks/Resonances/higherMassResonances.cxx index 252fdd6d658..fad39aaf963 100644 --- a/PWGLF/Tasks/Resonances/higherMassResonances.cxx +++ b/PWGLF/Tasks/Resonances/higherMassResonances.cxx @@ -14,6 +14,29 @@ /// \author Sawan // #include +#include "PWGLF/DataModel/LFStrangenessTables.h" // + +#include "Common/Core/TrackSelection.h" +#include "Common/Core/trackUtilities.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/EventSelection.h" // +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/PIDResponse.h" // +#include "Common/DataModel/TrackSelectionTables.h" + +#include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" // +#include "Framework/O2DatabasePDGPlugin.h" +#include "Framework/StepTHn.h" +#include "Framework/runDataProcessing.h" // +#include "ReconstructionDataFormats/Track.h" + +#include "Math/GenVector/Boost.h" +#include "Math/Vector3D.h" +#include "Math/Vector4D.h" +#include "TF1.h" +#include "TRandom3.h" #include #include #include @@ -23,33 +46,12 @@ #include #include #include + +#include #include #include #include #include -#include -#include "TF1.h" -#include "TRandom3.h" -#include "Math/Vector3D.h" -#include "Math/Vector4D.h" -#include "Math/GenVector/Boost.h" - -#include "Common/Core/TrackSelection.h" -#include "Common/Core/trackUtilities.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/StepTHn.h" -#include "ReconstructionDataFormats/Track.h" -#include "Framework/O2DatabasePDGPlugin.h" - -#include "Common/DataModel/Centrality.h" -#include "Common/DataModel/EventSelection.h" // -#include "Common/DataModel/Multiplicity.h" -#include "Common/DataModel/PIDResponse.h" // -#include "Common/DataModel/TrackSelectionTables.h" -#include "Framework/ASoAHelpers.h" -#include "Framework/AnalysisTask.h" // -#include "Framework/runDataProcessing.h" // -#include "PWGLF/DataModel/LFStrangenessTables.h" // using namespace o2; using namespace o2::framework; @@ -74,7 +76,7 @@ struct HigherMassResonances { // Configurable invMass1D{"invMass1D", false, "1D invariant mass histograms"}; Configurable correlation2Dhist{"correlation2Dhist", true, "Lamda K0 mass correlation"}; Configurable cDCAv0topv{"cDCAv0topv", false, "DCA V0 to PV"}; - Configurable armcut{"armcut", false, "arm cut"}; + // Configurable armcut{"armcut", false, "arm cut"}; Configurable globalTracks{"globalTracks", false, "Global tracks"}; Configurable hasTPC{"hasTPC", false, "TPC"}; Configurable selectTWOKsOnly{"selectTWOKsOnly", true, "Select only events with two K0s"}; @@ -82,11 +84,11 @@ struct HigherMassResonances { // Configurables for event selection Configurable cutzvertex{"cutzvertex", 10.0f, "Accepted z-vertex range (cm)"}; Configurable cfgETAcut{"cfgETAcut", 0.8f, "Track ETA cut"}; - Configurable timFrameEvsel{"timFrameEvsel", false, "TPC Time frame boundary cut"}; - Configurable piluprejection{"piluprejection", false, "Pileup rejection"}; - Configurable goodzvertex{"goodzvertex", false, "removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference."}; - Configurable itstpctracks{"itstpctracks", false, "selects collisions with at least one ITS-TPC track,"}; - Configurable additionalEvsel{"additionalEvsel", false, "Additional event selcection"}; + Configurable timFrameEvsel{"timFrameEvsel", true, "TPC Time frame boundary cut"}; + // Configurable piluprejection{"piluprejection", false, "Pileup rejection"}; + // Configurable goodzvertex{"goodzvertex", false, "removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference."}; + // Configurable itstpctracks{"itstpctracks", false, "selects collisions with at least one ITS-TPC track,"}; + // Configurable additionalEvsel{"additionalEvsel", false, "Additional event selcection"}; // Configurable applyOccupancyCut{"applyOccupancyCut", false, "Apply occupancy cut"}; // Configurable occupancyCut{"occupancyCut", 1000, "Mimimum Occupancy cut"}; @@ -107,7 +109,7 @@ struct HigherMassResonances { Configurable confDaughEta{"confDaughEta", 0.8f, "V0 Daugh sel: max eta"}; Configurable confDaughTPCnclsMin{"confDaughTPCnclsMin", 70.f, "V0 Daugh sel: Min. nCls TPC"}; Configurable confDaughPIDCuts{"confDaughPIDCuts", 5, "PID selections for KS0 daughters"}; - Configurable confarmcut{"confarmcut", 0.2f, "Armenteros cut"}; + // Configurable confarmcut{"confarmcut", 0.2f, "Armenteros cut"}; Configurable confKsrapidity{"confKsrapidity", 0.5f, "Rapidity cut on K0s"}; // Configurable lowmasscutks0{"lowmasscutks0", 0.497 - 4 * 0.005, "Low mass cut on K0s"}; // Configurable highmasscutks0{"highmasscutks0", 0.497 + 4 * 0.005, "High mass cut on K0s"}; @@ -125,6 +127,7 @@ struct HigherMassResonances { Configurable cTVXEvsel{"cTVXEvsel", true, "Triggger selection"}; Configurable avoidsplitrackMC{"avoidsplitrackMC", false, "avoid split track in MC"}; Configurable selectMCparticles{"selectMCparticles", 1, "0: f0(1710), 1: f2(1525), 2: a2(1320), 3: f0(1370), 4: f0(1500)"}; + Configurable apply_rapidityMC{"apply_rapidityMC", true, "Apply rapidity cut on generated and reconstructed particles"}; std::vector pdgCodes = {10331, 335, 115, 10221, 9030221}; // output THnSparses @@ -138,7 +141,7 @@ struct HigherMassResonances { // Configurable rapidityks{"rapidityks", true, "rapidity cut on K0s"}; Configurable applyCompetingcut{"applyCompetingcut", false, "Competing cascade rejection cut"}; Configurable competingcascrejlambda{"competingcascrejlambda", 0.005, "rejecting competing cascade lambda"}; - Configurable competingcascrejlambdaanti{"competingcascrejlambdaanti", 0.005, "rejecting competing cascade anti-lambda"}; // If one of the pions is misidentified as a proton, then instead of Ks we reconstruct lambda, therefore the competing cascade rejection cut is applied in which if the reconstrcted mass of a pion and proton (which we are assuming to be misidentified as proton) is close to lambda or anti-lambda, then the track is rejected + // Configurable competingcascrejlambdaanti{"competingcascrejlambdaanti", 0.005, "rejecting competing cascade anti-lambda"}; // If one of the pions is misidentified as a proton, then instead of Ks we reconstruct lambda, therefore the competing cascade rejection cut is applied in which if the reconstrcted mass of a pion and proton (which we are assuming to be misidentified as proton) is close to lambda or anti-lambda, then the track is rejected Configurable tpcCrossedrows{"tpcCrossedrows", 70, "TPC crossed rows"}; Configurable tpcCrossedrowsOverfcls{"tpcCrossedrowsOverfcls", 0.8, "TPC crossed rows over findable clusters"}; @@ -154,6 +157,7 @@ struct HigherMassResonances { Configurable ksMassBins{"ksMassBins", 200, "Number of mass bins for K0s"}; Configurable rotationalCut{"rotationalCut", 10, "Cut value (Rotation angle pi - pi/cut and pi + pi/cut)"}; ConfigurableAxis configThnAxisPOL{"configThnAxisPOL", {20, -1.0, 1.0}, "Costheta axis"}; + ConfigurableAxis configThnAxisPhi{"configThnAxisPhi", {70, 0.0f, 7.0f}, "Phi axis"}; // 0 to 2pi // ConfigurableAxis axisdEdx{"axisdEdx", {20000, 0.0f, 200.0f}, "dE/dx (a.u.)"}; // ConfigurableAxis axisPtfordEbydx{"axisPtfordEbydx", {2000, 0, 20}, "pT (GeV/c)"}; // ConfigurableAxis axisMultdist{"axisMultdist", {3500, 0, 70000}, "Multiplicity distribution"}; @@ -169,6 +173,8 @@ struct HigherMassResonances { float theta2; ROOT::Math::PxPyPzMVector daughter1, daughter2, fourVecDau1, fourVecMother, fourVecDauCM; ROOT::Math::XYZVector threeVecDauCM, helicityVec, randomVec, beamVec, normalVec; + ROOT::Math::XYZVector z_beam; // ẑ: beam direction in lab frame + // const double massK0s = o2::constants::physics::MassK0Short; bool isMix = false; @@ -182,6 +188,7 @@ struct HigherMassResonances { // AxisSpec multiplicityAxis = {110, 0.0f, 150.0f, "Multiplicity Axis"}; AxisSpec multiplicityAxis = {config.binsCent, "Multiplicity Axis"}; AxisSpec thnAxisPOL{config.configThnAxisPOL, "Configurabel theta axis"}; + AxisSpec thnAxisPhi = {config.configThnAxisPhi, "Configurabel phi axis"}; // 0 to 2pi // AxisSpec occupancyAxis = {occupancyBins, "Occupancy [-40,100]"}; // THnSparses @@ -216,9 +223,9 @@ struct HigherMassResonances { // rEventSelection.add("hNcontributor", "Number of primary vertex contributor", kTH1F, {{2000, 0.0f, 10000.0f}}); } - hglue.add("h3glueInvMassDS", "h3glueInvMassDS", kTHnSparseF, {multiplicityAxis, ptAxis, glueballMassAxis, thnAxisPOL}, true); - hglue.add("h3glueInvMassME", "h3glueInvMassME", kTHnSparseF, {multiplicityAxis, ptAxis, glueballMassAxis, thnAxisPOL}, true); - hglue.add("h3glueInvMassRot", "h3glueInvMassRot", kTHnSparseF, {multiplicityAxis, ptAxis, glueballMassAxis, thnAxisPOL}, true); + hglue.add("h3glueInvMassDS", "h3glueInvMassDS", kTHnSparseF, {multiplicityAxis, ptAxis, glueballMassAxis, thnAxisPOL, thnAxisPhi}, true); + hglue.add("h3glueInvMassME", "h3glueInvMassME", kTHnSparseF, {multiplicityAxis, ptAxis, glueballMassAxis, thnAxisPOL, thnAxisPhi}, true); + hglue.add("h3glueInvMassRot", "h3glueInvMassRot", kTHnSparseF, {multiplicityAxis, ptAxis, glueballMassAxis, thnAxisPOL, thnAxisPhi}, true); hglue.add("heventscheck", "heventscheck", kTH1I, {{10, 0, 10}}); hglue.add("htrackscheck_v0", "htrackscheck_v0", kTH1I, {{15, 0, 15}}); hglue.add("htrackscheck_v0_daughters", "htrackscheck_v0_daughters", kTH1I, {{15, 0, 15}}); @@ -324,20 +331,20 @@ struct HigherMassResonances { } hglue.fill(HIST("heventscheck"), 3.5); - if (config.piluprejection && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { - return false; - } - hglue.fill(HIST("heventscheck"), 4.5); + // if (config.piluprejection && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { + // return false; + // } + // hglue.fill(HIST("heventscheck"), 4.5); - if (config.goodzvertex && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { - return false; - } - hglue.fill(HIST("heventscheck"), 5.5); + // if (config.goodzvertex && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { + // return false; + // } + // hglue.fill(HIST("heventscheck"), 5.5); - if (config.itstpctracks && !collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) { - return false; - } - hglue.fill(HIST("heventscheck"), 6.5); + // if (config.itstpctracks && !collision.selection_bit(o2::aod::evsel::kIsVertexITSTPC)) { + // return false; + // } + // hglue.fill(HIST("heventscheck"), 6.5); return true; } @@ -345,9 +352,9 @@ struct HigherMassResonances { template bool selectionV0(Collision const& collision, V0 const& candidate, float /*multiplicity*/) { - const float qtarm = candidate.qtarm(); - const float alph = candidate.alpha(); - float arm = qtarm / alph; + // const float qtarm = candidate.qtarm(); + // const float alph = candidate.alpha(); + // float arm = qtarm / alph; const float pT = candidate.pt(); const float tranRad = candidate.v0radius(); const float dcaDaughv0 = candidate.dcaV0daughters(); @@ -441,15 +448,15 @@ struct HigherMassResonances { // if (config.correlation2Dhist) // rKzeroShort.fill(HIST("mass_lambda_kshort_after8"), candidate.mK0Short(), candidate.mLambda()); - if (config.armcut && arm < config.confarmcut) { - return false; - } + // if (config.armcut && arm < config.confarmcut) { + // return false; + // } hglue.fill(HIST("htrackscheck_v0"), 9.5); // if (config.correlation2Dhist) // rKzeroShort.fill(HIST("mass_lambda_kshort_after9"), candidate.mK0Short(), candidate.mLambda()); // if (config.applyCompetingcut && (std::abs(candidate.mLambda() - PDGdatabase->Mass(3122)) <= config.competingcascrejlambda || std::abs(candidate.mAntiLambda() - PDGdatabase->Mass(-3122)) <= config.competingcascrejlambdaanti)) - if (config.applyCompetingcut && (std::abs(candidate.mLambda() - o2::constants::physics::MassLambda0) <= config.competingcascrejlambda || std::abs(candidate.mAntiLambda() - o2::constants::physics::MassLambda0) <= config.competingcascrejlambdaanti)) { + if (config.applyCompetingcut && (std::abs(candidate.mLambda() - o2::constants::physics::MassLambda0) <= config.competingcascrejlambda || std::abs(candidate.mAntiLambda() - o2::constants::physics::MassLambda0) <= config.competingcascrejlambda)) { return false; } hglue.fill(HIST("htrackscheck_v0"), 10.5); @@ -565,59 +572,99 @@ struct HigherMassResonances { using EventCandidatesMC = soa::Join; using TrackCandidatesMC = soa::Filtered>; using V0TrackCandidatesMC = soa::Join; + // z_beam direction in lab frame template void fillInvMass(const T2& lv3, const T3& lv5, float multiplicity, const T4& daughter1, bool isMix) { - // polarization calculations + // //polarization calculations + // z_beam = ROOT::Math::XYZVector(0.f, 0.f, 1.f); // ẑ: beam direction in lab frame - fourVecDau1 = ROOT::Math::PxPyPzMVector(daughter1.Px(), daughter1.Py(), daughter1.Pz(), o2::constants::physics::MassK0Short); // Kaon or Pion + fourVecDau1 = ROOT::Math::PxPyPzMVector(daughter1.Px(), daughter1.Py(), daughter1.Pz(), o2::constants::physics::MassK0Short); - fourVecMother = ROOT::Math::PxPyPzMVector(lv3.Px(), lv3.Py(), lv3.Pz(), lv3.M()); // mass of KshortKshort pair - ROOT::Math::Boost boost{fourVecMother.BoostToCM()}; // boost mother to center of mass frame - fourVecDauCM = boost(fourVecDau1); // boost the frame of daughter same as mother + fourVecMother = ROOT::Math::PxPyPzMVector(lv3.Px(), lv3.Py(), lv3.Pz(), lv3.M()); // 4 vector of mother particle + ROOT::Math::Boost boost{fourVecMother.BoostToCM()}; // define the boost to the center of mass frame + fourVecDauCM = boost(fourVecDau1); // boost the frame of daughter to the center of mass frame threeVecDauCM = fourVecDauCM.Vect(); // get the 3 vector of daughter in the frame of mother + // define y = z_beam x z: Normal to the production plane + // ẑ: mother direction in lab, boosted into mother's rest frame + + // auto motherLabDirection = ROOT::Math::XYZVector(0, 0, fourVecMother.Vect().Z()); // ẑ axis in lab frame + + // // ŷ = z_beam × ẑ + // auto y_axis = z_beam.Cross(motherLabDirection).Unit(); + + // // x̂ = ŷ × ẑ + // auto x_axis = y_axis.Cross(motherLabDirection).Unit(); + + // // Project daughter momentum onto x–y plane + // auto p_proj_x = threeVecDauCM.Dot(x_axis); + // auto p_proj_y = threeVecDauCM.Dot(y_axis); + + // // Calculate φ in [-π, π] + // auto angle_phi = std::atan2(p_proj_y, p_proj_x); // φ in radians + + double BeamMomentum = TMath::Sqrt(13600 * 13600 / 4 - 0.938 * 0.938); // GeV + ROOT::Math::PxPyPzEVector Beam1(0., 0., -BeamMomentum, 13600 / 2); + ROOT::Math::PxPyPzEVector Beam2(0., 0., BeamMomentum, 13600 / 2); + ROOT::Math::XYZVectorF v1_CM{(boost(fourVecDau1).Vect()).Unit()}; + // ROOT::Math::XYZVectorF v2_CM{(boost(fourVecDau1).Vect()).Unit()}; + ROOT::Math::XYZVectorF Beam1_CM{(boost(Beam1).Vect()).Unit()}; + ROOT::Math::XYZVectorF Beam2_CM{(boost(Beam2).Vect()).Unit()}; + // using positive sign convention for the first track + // ROOT::Math::XYZVectorF v_CM = (t1.sign() > 0 ? v1_CM : v2_CM); // here selected decay daughter momentum is intested. here you can choose one decay daughter no need to check both case as it is neutral particle for our case + // Helicity frame + ROOT::Math::XYZVectorF zaxis_HE{(fourVecMother.Vect()).Unit()}; + ROOT::Math::XYZVectorF yaxis_HE{(Beam1_CM.Cross(Beam2_CM)).Unit()}; + ROOT::Math::XYZVectorF xaxis_HE{(yaxis_HE.Cross(zaxis_HE)).Unit()}; + + // CosThetaHE = zaxis_HE.Dot(v_CM); + + auto angle_phi = TMath::ATan2(yaxis_HE.Dot(v1_CM), xaxis_HE.Dot(v1_CM)); + if (angle_phi < 0) { + angle_phi += 2 * TMath::Pi(); // ensure phi is in [0, 2pi] + } if (std::abs(lv3.Rapidity()) < 0.5) { if (config.activateTHnSparseCosThStarHelicity) { helicityVec = fourVecMother.Vect(); // 3 vector of mother in COM frame auto cosThetaStarHelicity = helicityVec.Dot(threeVecDauCM) / (std::sqrt(threeVecDauCM.Mag2()) * std::sqrt(helicityVec.Mag2())); if (!isMix) { - hglue.fill(HIST("h3glueInvMassDS"), multiplicity, lv3.Pt(), lv3.M(), cosThetaStarHelicity); + hglue.fill(HIST("h3glueInvMassDS"), multiplicity, lv3.Pt(), lv3.M(), cosThetaStarHelicity, angle_phi); for (int i = 0; i < config.cRotations; i++) { theta2 = rn->Uniform(o2::constants::math::PI - o2::constants::math::PI / config.rotationalCut, o2::constants::math::PI + o2::constants::math::PI / config.rotationalCut); - hglue.fill(HIST("h3glueInvMassRot"), multiplicity, lv5.Pt(), lv5.M(), cosThetaStarHelicity); + hglue.fill(HIST("h3glueInvMassRot"), multiplicity, lv5.Pt(), lv5.M(), cosThetaStarHelicity, angle_phi); } } else { - hglue.fill(HIST("h3glueInvMassME"), multiplicity, lv3.Pt(), lv3.M(), cosThetaStarHelicity); + hglue.fill(HIST("h3glueInvMassME"), multiplicity, lv3.Pt(), lv3.M(), cosThetaStarHelicity, angle_phi); } } else if (config.activateTHnSparseCosThStarProduction) { normalVec = ROOT::Math::XYZVector(lv3.Py(), -lv3.Px(), 0.f); auto cosThetaStarProduction = normalVec.Dot(threeVecDauCM) / (std::sqrt(threeVecDauCM.Mag2()) * std::sqrt(normalVec.Mag2())); if (!isMix) { - hglue.fill(HIST("h3glueInvMassDS"), multiplicity, lv3.Pt(), lv3.M(), cosThetaStarProduction); + hglue.fill(HIST("h3glueInvMassDS"), multiplicity, lv3.Pt(), lv3.M(), cosThetaStarProduction, angle_phi); for (int i = 0; i < config.cRotations; i++) { theta2 = rn->Uniform(0, o2::constants::math::PI); - hglue.fill(HIST("h3glueInvMassRot"), multiplicity, lv5.Pt(), lv5.M(), cosThetaStarProduction); + hglue.fill(HIST("h3glueInvMassRot"), multiplicity, lv5.Pt(), lv5.M(), cosThetaStarProduction, angle_phi); } } else { - hglue.fill(HIST("h3glueInvMassME"), multiplicity, lv3.Pt(), lv3.M(), cosThetaStarProduction); + hglue.fill(HIST("h3glueInvMassME"), multiplicity, lv3.Pt(), lv3.M(), cosThetaStarProduction, angle_phi); } } else if (config.activateTHnSparseCosThStarBeam) { beamVec = ROOT::Math::XYZVector(0.f, 0.f, 1.f); auto cosThetaStarBeam = beamVec.Dot(threeVecDauCM) / std::sqrt(threeVecDauCM.Mag2()); if (!isMix) { - hglue.fill(HIST("h3glueInvMassDS"), multiplicity, lv3.Pt(), lv3.M(), cosThetaStarBeam); + hglue.fill(HIST("h3glueInvMassDS"), multiplicity, lv3.Pt(), lv3.M(), cosThetaStarBeam, angle_phi); for (int i = 0; i < config.cRotations; i++) { theta2 = rn->Uniform(0, o2::constants::math::PI); - hglue.fill(HIST("h3glueInvMassRot"), multiplicity, lv5.Pt(), lv5.M(), cosThetaStarBeam); + hglue.fill(HIST("h3glueInvMassRot"), multiplicity, lv5.Pt(), lv5.M(), cosThetaStarBeam, angle_phi); } } else { - hglue.fill(HIST("h3glueInvMassME"), multiplicity, lv3.Pt(), lv3.M(), cosThetaStarBeam); + hglue.fill(HIST("h3glueInvMassME"), multiplicity, lv3.Pt(), lv3.M(), cosThetaStarBeam, angle_phi); } } else if (config.activateTHnSparseCosThStarRandom) { @@ -627,13 +674,13 @@ struct HigherMassResonances { randomVec = ROOT::Math::XYZVector(std::sin(thetaRandom) * std::cos(phiRandom), std::sin(thetaRandom) * std::sin(phiRandom), std::cos(thetaRandom)); auto cosThetaStarRandom = randomVec.Dot(threeVecDauCM) / std::sqrt(threeVecDauCM.Mag2()); if (!isMix) { - hglue.fill(HIST("h3glueInvMassDS"), multiplicity, lv3.Pt(), lv3.M(), cosThetaStarRandom); + hglue.fill(HIST("h3glueInvMassDS"), multiplicity, lv3.Pt(), lv3.M(), cosThetaStarRandom, angle_phi); for (int i = 0; i < config.cRotations; i++) { theta2 = rn->Uniform(0, o2::constants::math::PI); - hglue.fill(HIST("h3glueInvMassRot"), multiplicity, lv5.Pt(), lv5.M(), cosThetaStarRandom); + hglue.fill(HIST("h3glueInvMassRot"), multiplicity, lv5.Pt(), lv5.M(), cosThetaStarRandom, angle_phi); } } else { - hglue.fill(HIST("h3glueInvMassME"), multiplicity, lv3.Pt(), lv3.M(), cosThetaStarRandom); + hglue.fill(HIST("h3glueInvMassME"), multiplicity, lv3.Pt(), lv3.M(), cosThetaStarRandom, angle_phi); } } } @@ -979,7 +1026,7 @@ struct HigherMassResonances { // hMChists.fill(HIST("GenPy"), mcParticle.py()); // hMChists.fill(HIST("GenPz"), mcParticle.pz()); - if (std::abs(mcParticle.y()) >= 0.5) { + if (config.apply_rapidityMC && std::abs(mcParticle.y()) >= 0.5) { continue; } hMChists.fill(HIST("events_check"), 6.5); @@ -1159,7 +1206,7 @@ struct HigherMassResonances { } hMChists.fill(HIST("events_checkrec"), 17.5); - if (std::abs(mothertrack1.y()) >= 0.5) { + if (config.apply_rapidityMC && std::abs(mothertrack1.y()) >= 0.5) { continue; } hMChists.fill(HIST("events_checkrec"), 18.5); From f9d6afa585b1139cfb5ae6183f1cd1da3529b421 Mon Sep 17 00:00:00 2001 From: Pritam Chakraborty <47203359+prchakra@users.noreply.github.com> Date: Sat, 14 Jun 2025 12:24:22 +0200 Subject: [PATCH 1626/1650] [PWGCF] FemtoUniverse: Filling 3D histo of qLCMS vs dEta vs dPhi (#11603) --- ...irTaskTrackTrackSpherHarMultKtExtended.cxx | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackSpherHarMultKtExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackSpherHarMultKtExtended.cxx index 977342a3939..d0205e6bb8f 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackSpherHarMultKtExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackSpherHarMultKtExtended.cxx @@ -182,6 +182,7 @@ struct femtoUniversePairTaskTrackTrackSpherHarMultKtExtended { Configurable cfgProcessMultBins{"cfgProcessMultBins", true, "Process kstar histograms in multiplicity bins (in multiplicity bins)"}; Configurable cfgProcessKtBins{"cfgProcessKtBins", true, "Process kstar histograms in kT bins (if cfgProcessMultBins is set false, this will not be processed regardless this Configurable state)"}; Configurable cfgProcessKtMt3DCF{"cfgProcessKtMt3DCF", false, "Process 3D histograms in kT and Mult bins"}; + Configurable ConfIsFillAngqLCMS{"ConfIsFillAngqLCMS", true, "Fill qLCMS vs dEta vs dPhi"}; FemtoUniverseSHContainer sameEventCont; FemtoUniverseSHContainer mixedEventCont; @@ -519,12 +520,21 @@ struct femtoUniversePairTaskTrackTrackSpherHarMultKtExtended { double rand; rand = randgen->Rndm(); + std::vector f3d; + double kv; + switch (ContType) { case 2: { if (rand > 0.5) { sameEventMultContPP.fillMultNumDen(p1, p2, femto_universe_sh_container::EventType::same, 2, multCol, kT, ConfIsIden); + f3d = FemtoUniverseMath::newpairfunc(p1, mass1, p2, mass2, ConfIsIden); } else if (rand <= 0.5) { sameEventMultContPP.fillMultNumDen(p2, p1, femto_universe_sh_container::EventType::same, 2, multCol, kT, ConfIsIden); + f3d = FemtoUniverseMath::newpairfunc(p2, mass2, p1, mass1, ConfIsIden); + } + if (ConfIsFillAngqLCMS) { + kv = std::sqrt(f3d[1] * f3d[1] + f3d[2] * f3d[2] + f3d[3] * f3d[3]); + pairCloseRejection.ClosePairqLCMS(p1, p2, magFieldTesla, femto_universe_container::EventType::same, kv); } break; } @@ -532,8 +542,14 @@ struct femtoUniversePairTaskTrackTrackSpherHarMultKtExtended { case 3: { if (rand > 0.5) { sameEventMultContMM.fillMultNumDen(p1, p2, femto_universe_sh_container::EventType::same, 2, multCol, kT, ConfIsIden); + f3d = FemtoUniverseMath::newpairfunc(p1, mass1, p2, mass2, ConfIsIden); } else if (rand <= 0.5) { sameEventMultContMM.fillMultNumDen(p2, p1, femto_universe_sh_container::EventType::same, 2, multCol, kT, ConfIsIden); + f3d = FemtoUniverseMath::newpairfunc(p2, mass2, p1, mass1, ConfIsIden); + } + if (ConfIsFillAngqLCMS) { + kv = std::sqrt(f3d[1] * f3d[1] + f3d[2] * f3d[2] + f3d[3] * f3d[3]); + pairCloseRejection.ClosePairqLCMS(p1, p2, magFieldTesla, femto_universe_container::EventType::same, kv); } break; } @@ -657,6 +673,9 @@ struct femtoUniversePairTaskTrackTrackSpherHarMultKtExtended { double rand; rand = randgen->Rndm(); + std::vector f3d; + double kv; + switch (ContType) { case 1: { if (rand > 0.5) { @@ -670,8 +689,14 @@ struct femtoUniversePairTaskTrackTrackSpherHarMultKtExtended { case 2: { if (rand > 0.5) { mixedEventMultContPP.fillMultNumDen(p1, p2, femto_universe_sh_container::EventType::mixed, 2, multCol, kT, ConfIsIden); + f3d = FemtoUniverseMath::newpairfunc(p1, mass1, p2, mass2, ConfIsIden); } else { mixedEventMultContPP.fillMultNumDen(p2, p1, femto_universe_sh_container::EventType::mixed, 2, multCol, kT, ConfIsIden); + f3d = FemtoUniverseMath::newpairfunc(p2, mass2, p1, mass1, ConfIsIden); + } + if (ConfIsFillAngqLCMS) { + kv = std::sqrt(f3d[1] * f3d[1] + f3d[2] * f3d[2] + f3d[3] * f3d[3]); + pairCloseRejection.ClosePairqLCMS(p1, p2, magFieldTesla, femto_universe_container::EventType::mixed, kv); } break; } @@ -679,8 +704,14 @@ struct femtoUniversePairTaskTrackTrackSpherHarMultKtExtended { case 3: { if (rand > 0.5) { mixedEventMultContMM.fillMultNumDen(p1, p2, femto_universe_sh_container::EventType::mixed, 2, multCol, kT, ConfIsIden); + f3d = FemtoUniverseMath::newpairfunc(p1, mass1, p2, mass2, ConfIsIden); } else { mixedEventMultContMM.fillMultNumDen(p2, p1, femto_universe_sh_container::EventType::mixed, 2, multCol, kT, ConfIsIden); + f3d = FemtoUniverseMath::newpairfunc(p2, mass2, p1, mass1, ConfIsIden); + } + if (ConfIsFillAngqLCMS) { + kv = std::sqrt(f3d[1] * f3d[1] + f3d[2] * f3d[2] + f3d[3] * f3d[3]); + pairCloseRejection.ClosePairqLCMS(p1, p2, magFieldTesla, femto_universe_container::EventType::mixed, kv); } break; } From b70c0e21ce437b64927a774c083d41e36774bbf8 Mon Sep 17 00:00:00 2001 From: Zhiyong <71517277+Luzhiyongg@users.noreply.github.com> Date: Sat, 14 Jun 2025 18:52:19 +0800 Subject: [PATCH 1627/1650] [PWGCF] add pT-diff correlations (#11617) --- PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx b/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx index e79c61b3096..13c8b352d9f 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/diHadronCor.cxx @@ -94,6 +94,7 @@ struct DiHadronCor { O2_DEFINE_CONFIGURABLE(cfgLocalEfficiency, bool, false, "Use local efficiency object") O2_DEFINE_CONFIGURABLE(cfgVerbosity, bool, false, "Verbose output") O2_DEFINE_CONFIGURABLE(cfgUseEventWeights, bool, false, "Use event weights for mixed event") + O2_DEFINE_CONFIGURABLE(cfgUsePtDiff, bool, false, "To enable pt differential vn, one needs to set this to true and set the pt bins accordingly") SliceCache cache; @@ -472,8 +473,10 @@ struct DiHadronCor { associatedWeight = efficiencyAssociatedCache[track2.filteredIndex()]; } - if (track1.pt() <= track2.pt()) - continue; // skip if the trigger pt is less than the associate pt + if (cfgUsePtDiff && track1.globalIndex() == track2.globalIndex()) + continue; // For pt-differential correlations, skip if the trigger and associate are the same track + if (!cfgUsePtDiff && track1.pt() <= track2.pt()) + continue; // Without pt-differential correlations, skip if the trigger pt is less than the associate pt float deltaPhi = RecoDecay::constrainAngle(track1.phi() - track2.phi(), -PIHalf); float deltaEta = track1.eta() - track2.eta(); @@ -537,8 +540,10 @@ struct DiHadronCor { if (doprocessOntheflyMixed && !genTrackSelected(track2)) continue; - if (track1.pt() <= track2.pt()) - continue; // skip if the trigger pt is less than the associate pt + if (cfgUsePtDiff && track1.globalIndex() == track2.globalIndex()) + continue; // For pt-differential correlations, skip if the trigger and associate are the same track + if (!cfgUsePtDiff && track1.pt() <= track2.pt()) + continue; // Without pt-differential correlations, skip if the trigger pt is less than the associate pt float deltaPhi = RecoDecay::constrainAngle(track1.phi() - track2.phi(), -PIHalf); float deltaEta = track1.eta() - track2.eta(); From c238a7d6fe21f84fd75b3a0a42d10f8507e64765 Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Sat, 14 Jun 2025 15:21:23 +0200 Subject: [PATCH 1628/1650] [Common] Add hepmc info for O-O cent studies (#11621) Co-authored-by: David Dobrigkeit Chinellato Co-authored-by: ALICE Builder --- Common/DataModel/Multiplicity.h | 5 +++++ Common/TableProducer/multiplicityTable.cxx | 14 ++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/Common/DataModel/Multiplicity.h b/Common/DataModel/Multiplicity.h index ce6aa4ba046..864e2a9cd1c 100644 --- a/Common/DataModel/Multiplicity.h +++ b/Common/DataModel/Multiplicity.h @@ -184,9 +184,14 @@ DECLARE_SOA_TABLE_VERSIONED(MultMCExtras_001, "AOD", "MULTMCEXTRA", 1, //! Table mult::IsInelGt1, o2::soa::Marker<1>); +DECLARE_SOA_TABLE(MultHepMCHIs, "AOD", "MULTHEPMCHI", //! complementary table for heavy-ion mc info (subset of HepMCHeavyIons) + o2::soa::Index<>, hepmcheavyion::McCollisionId, hepmcheavyion::NcollHard, hepmcheavyion::NpartProj, hepmcheavyion::NpartTarg, + hepmcheavyion::Ncoll, hepmcheavyion::ImpactParameter); + using MultMCExtras = MultMCExtras_001; using MultMCExtra = MultMCExtras::iterator; using MultsExtraMC = MultMCExtras; // for backwards compatibility with previous naming scheme +using MultHepMCHI = MultHepMCHIs::iterator; // crosslinks namespace mult diff --git a/Common/TableProducer/multiplicityTable.cxx b/Common/TableProducer/multiplicityTable.cxx index 6deb146daab..eb9648ecf2b 100644 --- a/Common/TableProducer/multiplicityTable.cxx +++ b/Common/TableProducer/multiplicityTable.cxx @@ -100,6 +100,7 @@ struct MultiplicityTable { Produces tablePVZeqs; // 12 Produces tableExtraMc; // 13 Produces tableExtraMult2MCExtras; + Produces multHepMCHIs; // Not accounted for, produced using custom process function to avoid dependencies Produces mftMults; // Not accounted for, produced using custom process function to avoid dependencies Produces multsGlobal; // Not accounted for, produced based on process function processGlobalTrackingCounters @@ -734,6 +735,18 @@ struct MultiplicityTable { using Run3Tracks = soa::Join; Partition pvContribGlobalTracksEta1 = (minPtGlobalTrack < aod::track::pt && aod::track::pt < maxPtGlobalTrack) && (nabs(aod::track::eta) < 1.0f) && ((aod::track::flags & static_cast(o2::aod::track::PVContributor)) == static_cast(o2::aod::track::PVContributor)) && requireQualityTracksInFilter(); + void processHepMCHeavyIons(aod::HepMCHeavyIons const& hepmchis) + { + for (auto const& hepmchi : hepmchis) { + multHepMCHIs(hepmchi.mcCollisionId(), + hepmchi.ncollHard(), + hepmchi.npartProj(), + hepmchi.npartTarg(), + hepmchi.ncoll(), + hepmchi.impactParameter()); + } + } + void processGlobalTrackingCounters(aod::Collision const& collision, soa::Join const& tracksIU, Run3Tracks const&) { // counter from Igor @@ -808,6 +821,7 @@ struct MultiplicityTable { PROCESS_SWITCH(MultiplicityTable, processGlobalTrackingCounters, "Produce Run 3 global counters", false); PROCESS_SWITCH(MultiplicityTable, processMC, "Produce MC multiplicity tables", false); PROCESS_SWITCH(MultiplicityTable, processMC2Mults, "Produce MC -> Mult map", false); + PROCESS_SWITCH(MultiplicityTable, processHepMCHeavyIons, "Produce MultHepMCHIs tables", false); PROCESS_SWITCH(MultiplicityTable, processRun3MFT, "Produce MFT mult tables", false); }; From c5d21b6d1e5353571f6cba4aff82ef751b9b96b4 Mon Sep 17 00:00:00 2001 From: Preet-Bhanjan Date: Sat, 14 Jun 2025 15:25:13 +0200 Subject: [PATCH 1629/1650] [PWGCF] Added ITS PID (#11608) Co-authored-by: Preet Pati Co-authored-by: ALICE Action Bot --- PWGCF/Flow/Tasks/flowPbpbPikp.cxx | 119 ++++++++++++++++++------------ 1 file changed, 71 insertions(+), 48 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowPbpbPikp.cxx b/PWGCF/Flow/Tasks/flowPbpbPikp.cxx index 1d979488da3..97fbc3a3661 100644 --- a/PWGCF/Flow/Tasks/flowPbpbPikp.cxx +++ b/PWGCF/Flow/Tasks/flowPbpbPikp.cxx @@ -13,48 +13,46 @@ /// \brief PID flow using the generic framework /// \author Preet Bhanjan Pati -#include -#include -#include -#include -#include -#include -#include - -#include "Math/Vector4D.h" - -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/ASoAHelpers.h" -#include "Framework/RunningWorkflowInfo.h" -#include "Framework/HistogramRegistry.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/StepTHn.h" +#include "PWGCF/GenericFramework/Core/FlowContainer.h" +#include "PWGCF/GenericFramework/Core/GFW.h" +#include "PWGCF/GenericFramework/Core/GFWConfig.h" +#include "PWGCF/GenericFramework/Core/GFWCumulant.h" +#include "PWGCF/GenericFramework/Core/GFWPowerArray.h" +#include "PWGCF/GenericFramework/Core/GFWWeights.h" +#include "PWGCF/GenericFramework/Core/GFWWeightsList.h" -#include "Common/DataModel/EventSelection.h" #include "Common/Core/TrackSelection.h" -#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/Core/trackUtilities.h" #include "Common/DataModel/Centrality.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/PIDResponse.h" #include "Common/DataModel/PIDResponseITS.h" -#include "Common/Core/trackUtilities.h" -#include "Common/DataModel/Multiplicity.h" -#include "CommonConstants/PhysicsConstants.h" - -#include "PWGCF/GenericFramework/Core/GFWPowerArray.h" -#include "PWGCF/GenericFramework/Core/GFW.h" -#include "PWGCF/GenericFramework/Core/GFWCumulant.h" -#include "PWGCF/GenericFramework/Core/FlowContainer.h" -#include "PWGCF/GenericFramework/Core/GFWWeights.h" -#include "PWGCF/GenericFramework/Core/GFWWeightsList.h" -#include "PWGCF/GenericFramework/Core/GFWConfig.h" +#include "Common/DataModel/TrackSelectionTables.h" -#include "ReconstructionDataFormats/Track.h" +#include "CommonConstants/PhysicsConstants.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/RunningWorkflowInfo.h" +#include "Framework/StepTHn.h" +#include "Framework/runDataProcessing.h" #include "ReconstructionDataFormats/PID.h" +#include "ReconstructionDataFormats/Track.h" +#include +#include "Math/Vector4D.h" +#include #include #include -#include + +#include +#include +#include +#include +#include +#include using namespace o2; using namespace o2::framework; @@ -72,6 +70,7 @@ GFWCorrConfigs configs; using namespace o2::analysis::genericframework; struct FlowPbpbPikp { + o2::aod::ITSResponse itsResponse; Service ccdb; Configurable noLaterThan{"noLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; Configurable ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; @@ -107,11 +106,12 @@ struct FlowPbpbPikp { O2_DEFINE_CONFIGURABLE(cfgUseStrictPID, bool, true, "Use strict PID cuts for TPC") O2_DEFINE_CONFIGURABLE(cfgV0AT0Acut, int, 5, "V0AT0A cut") O2_DEFINE_CONFIGURABLE(cfgUseAsymmetricPID, bool, false, "Use asymmetric PID cuts"); + O2_DEFINE_CONFIGURABLE(cfgUseItsPID, bool, true, "Use ITS PID for particle identification"); Configurable> cfgTrackDensityP0{"cfgTrackDensityP0", std::vector{0.7217476707, 0.7384792571, 0.7542625668, 0.7640680200, 0.7701951667, 0.7755299053, 0.7805901710, 0.7849446786, 0.7957356586, 0.8113039262, 0.8211968966, 0.8280558878, 0.8329342135}, "parameter 0 for track density efficiency correction"}; Configurable> cfgTrackDensityP1{"cfgTrackDensityP1", std::vector{-2.169488e-05, -2.191913e-05, -2.295484e-05, -2.556538e-05, -2.754463e-05, -2.816832e-05, -2.846502e-05, -2.843857e-05, -2.705974e-05, -2.477018e-05, -2.321730e-05, -2.203315e-05, -2.109474e-05}, "parameter 1 for track density efficiency correction"}; Configurable> cfgTofNsigmaCut{"cfgTofNsigmaCut", std::vector{1.5, 1.5, 1.5, -1.5, -1.5, -1.5}, "TOF n-sigma cut for pions_posNsigma, kaons_posNsigma, protons_posNsigma, pions_negNsigma, kaons_negNsigma, protons_negNsigma"}; - Configurable> cfgItsNsigmaCut{"cfgItsNsigmaCut", std::vector{3, 2.5, 2, 3, 2.5, 2}, "ITS n-sigma cut for pions_posNsigma, kaons_posNsigma, protons_posNsigma, pions_negNsigma, kaons_negNsigma, protons_negNsigma"}; + Configurable> cfgItsNsigmaCut{"cfgItsNsigmaCut", std::vector{3, 3, 3, -3, -3, -3}, "ITS n-sigma cut for pions_posNsigma, kaons_posNsigma, protons_posNsigma, pions_negNsigma, kaons_negNsigma, protons_negNsigma"}; Configurable> cfgTpcNsigmaCut{"cfgTpcNsigmaCut", std::vector{1.5, 1.5, 1.5, -1.5, -1.5, -1.5}, "TOF n-sigma cut for pions_posNsigma, kaons_posNsigma, protons_posNsigma, pions_negNsigma, kaons_negNsigma, protons_negNsigma"}; Configurable> cfgUseEventCuts{"cfgUseEventCuts", std::vector{1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0}, "Switch for various event cuts [kNoTimeFrameBorder, kNoITSROFrameBorder, kNoSameBunchPileup, kIsGoodZvtxFT0vsPV, kNoCollInTimeRangeStandard, kIsGoodITSLayersAll, kNoCollInRofStandard, kNoHighMultCollInPrevRof, Occupancy, Multiplicity correlation, T0AV0A 3 sigma cut, kIsVertexITSTPC, kTVXinTRD]"}; @@ -125,6 +125,7 @@ struct FlowPbpbPikp { ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90}, "centrality axis for histograms"}; ConfigurableAxis axisNsigmaTPC{"axisNsigmaTPC", {80, -5, 5}, "nsigmaTPC axis"}; ConfigurableAxis axisNsigmaTOF{"axisNsigmaTOF", {80, -5, 5}, "nsigmaTOF axis"}; + ConfigurableAxis axisNsigmaITS{"axisNsigmaITS", {80, -5, 5}, "nsigmaITS axis"}; ConfigurableAxis axisParticles{"axisParticles", {3, 0, 3}, "axis for different hadrons"}; ConfigurableAxis axisTPCsignal{"axisTPCsignal", {10000, 0, 1000}, "axis for TPC signal"}; ConfigurableAxis axisTOFbeta{"axisTOFbeta", {200, 0, 2}, "axis for TOF beta"}; @@ -249,9 +250,14 @@ struct FlowPbpbPikp { histos.add("TofBeta", "", {HistType::kTH2D, {axisPt, axisTOFbeta}}); histos.add("TofTpcNsigma_before", "", {HistType::kTHnSparseD, {{axisParticles, axisNsigmaTPC, axisNsigmaTOF, axisPt}}}); - histos.add("TofTpcNsigma_after", "", {HistType::kTHnSparseD, {{axisParticles, axisNsigmaTPC, axisNsigmaTOF, axisPt}}}); + if (!cfgUseItsPID) + histos.add("TofTpcNsigma_after", "", {HistType::kTHnSparseD, {{axisParticles, axisNsigmaTPC, axisNsigmaTOF, axisPt}}}); histos.add("partCount", "", {HistType::kTHnSparseD, {{axisParticles, axisMultiplicity, axisPt}}}); + histos.add("TofItsNsigma_before", "", {HistType::kTHnSparseD, {{axisParticles, axisNsigmaITS, axisNsigmaTOF, axisPt}}}); + if (cfgUseItsPID) + histos.add("TofItsNsigma_after", "", {HistType::kTHnSparseD, {{axisParticles, axisNsigmaITS, axisNsigmaTOF, axisPt}}}); + histos.add("hEventCount", "Number of Events;; Count", {HistType::kTH1D, {{15, 0, 15}}}); histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(1, "Filtered event"); histos.get(HIST("hEventCount"))->GetXaxis()->SetBinLabel(2, "After sel8"); @@ -448,7 +454,10 @@ struct FlowPbpbPikp { histos.fill(HIST("partCount"), pidIndex - 1, collision.centFT0C(), track.pt()); switch (pidIndex) { case 1: - histos.fill(HIST("TofTpcNsigma_after"), pidIndex - 1, track.tpcNSigmaPi(), track.tofNSigmaPi(), track.pt()); + if (!cfgUseItsPID) + histos.fill(HIST("TofTpcNsigma_after"), pidIndex - 1, track.tpcNSigmaPi(), track.tofNSigmaPi(), track.pt()); + if (cfgUseItsPID) + histos.fill(HIST("TofItsNsigma_after"), pidIndex - 1, itsResponse.nSigmaITS(track), track.tofNSigmaPi(), track.pt()); histos.fill(HIST("hTrackCount"), 7.5); // Pion count if (!cfgAcceptance.value.empty() && cfgUseWeightPhiEtaVtxz) histos.fill(HIST("PhiCorrected/hPhiEtaVtxz_pi_corrd"), track.phi(), track.eta(), collision.posZ(), wacc); // pion weights @@ -458,7 +467,10 @@ struct FlowPbpbPikp { histos.fill(HIST("PhiCorrected/hPhiEtaPt_pi_corrd"), track.phi(), track.eta(), track.pt(), wacc); break; case 2: - histos.fill(HIST("TofTpcNsigma_after"), pidIndex - 1, track.tpcNSigmaKa(), track.tofNSigmaKa(), track.pt()); + if (!cfgUseItsPID) + histos.fill(HIST("TofTpcNsigma_after"), pidIndex - 1, track.tpcNSigmaKa(), track.tofNSigmaKa(), track.pt()); + if (cfgUseItsPID) + histos.fill(HIST("TofItsNsigma_after"), pidIndex - 1, itsResponse.nSigmaITS(track), track.tofNSigmaKa(), track.pt()); histos.fill(HIST("hTrackCount"), 8.5); // Kaon count if (!cfgAcceptance.value.empty() && cfgUseWeightPhiEtaVtxz) histos.fill(HIST("PhiCorrected/hPhiEtaVtxz_ka_corrd"), track.phi(), track.eta(), collision.posZ(), wacc); // kaon weights @@ -468,7 +480,10 @@ struct FlowPbpbPikp { histos.fill(HIST("PhiCorrected/hPhiEtaPt_ka_corrd"), track.phi(), track.eta(), track.pt(), wacc); break; case 3: - histos.fill(HIST("TofTpcNsigma_after"), pidIndex - 1, track.tpcNSigmaPr(), track.tofNSigmaPr(), track.pt()); + if (!cfgUseItsPID) + histos.fill(HIST("TofTpcNsigma_after"), pidIndex - 1, track.tpcNSigmaPr(), track.tofNSigmaPr(), track.pt()); + if (cfgUseItsPID) + histos.fill(HIST("TofItsNsigma_after"), pidIndex - 1, itsResponse.nSigmaITS(track), track.tofNSigmaPr(), track.pt()); histos.fill(HIST("hTrackCount"), 9.5); // Proton count if (!cfgAcceptance.value.empty() && cfgUseWeightPhiEtaVtxz) histos.fill(HIST("PhiCorrected/hPhiEtaVtxz_pr_corrd"), track.phi(), track.eta(), collision.posZ(), wacc); // proton weights @@ -512,17 +527,21 @@ struct FlowPbpbPikp { } template - int getNsigmaPIDTpcTofAssymmetric(TTrack track) + int getNsigmaPIDAssymmetric(TTrack track) { // Computing Nsigma arrays for pion, kaon, and protons std::array nSigmaTPC = {track.tpcNSigmaPi(), track.tpcNSigmaKa(), track.tpcNSigmaPr()}; std::array nSigmaTOF = {track.tofNSigmaPi(), track.tofNSigmaKa(), track.tofNSigmaPr()}; + std::array nSigmaITS = {itsResponse.nSigmaITS(track), itsResponse.nSigmaITS(track), itsResponse.nSigmaITS(track)}; int pid = -1; + std::array nSigmaToUse = cfgUseItsPID ? nSigmaITS : nSigmaTPC; // Choose which nSigma to use: TPC or ITS + std::vector detectorNsigmaCut = cfgUseItsPID ? itsNsigmaCut : tpcNsigmaCut; // Choose which nSigma to use: TPC or ITS + bool isPion, isKaon, isProton; - bool isTpcPion = nSigmaTPC[0] < tpcNsigmaCut[0] && nSigmaTPC[0] > tpcNsigmaCut[0 + 3]; - bool isTpcKaon = nSigmaTPC[1] < tpcNsigmaCut[1] && nSigmaTPC[1] > tpcNsigmaCut[1 + 3]; - bool isTpcProton = nSigmaTPC[2] < tpcNsigmaCut[2] && nSigmaTPC[2] > tpcNsigmaCut[2 + 3]; + bool isDetectedPion = nSigmaToUse[0] < detectorNsigmaCut[0] && nSigmaToUse[0] > detectorNsigmaCut[0 + 3]; + bool isDetectedKaon = nSigmaToUse[1] < detectorNsigmaCut[1] && nSigmaToUse[1] > detectorNsigmaCut[1 + 3]; + bool isDetectedProton = nSigmaToUse[2] < detectorNsigmaCut[2] && nSigmaToUse[2] > detectorNsigmaCut[2 + 3]; bool isTofPion = nSigmaTOF[0] < tofNsigmaCut[0] && nSigmaTOF[0] > tofNsigmaCut[0 + 3]; bool isTofKaon = nSigmaTOF[1] < tofNsigmaCut[1] && nSigmaTOF[1] > tofNsigmaCut[1 + 3]; @@ -531,13 +550,13 @@ struct FlowPbpbPikp { if (track.pt() > cfgTofPtCut && !track.hasTOF()) { return 0; } else if (track.pt() > cfgTofPtCut && track.hasTOF()) { - isPion = isTofPion && isTpcPion; - isKaon = isTofKaon && isTpcKaon; - isProton = isTofProton && isTpcProton; + isPion = isTofPion && isDetectedPion; + isKaon = isTofKaon && isDetectedKaon; + isProton = isTofProton && isDetectedProton; } else { - isPion = isTpcPion; - isKaon = isTpcKaon; - isProton = isTpcProton; + isPion = isDetectedPion; + isKaon = isDetectedKaon; + isProton = isDetectedProton; } if ((isPion && isKaon) || (isPion && isProton) || (isKaon && isProton)) { @@ -917,10 +936,14 @@ struct FlowPbpbPikp { histos.fill(HIST("TofTpcNsigma_before"), KAONS, track.tpcNSigmaKa(), track.tofNSigmaKa(), pt); histos.fill(HIST("TofTpcNsigma_before"), PROTONS, track.tpcNSigmaPr(), track.tofNSigmaPr(), pt); + histos.fill(HIST("TofItsNsigma_before"), PIONS, itsResponse.nSigmaITS(track), track.tofNSigmaPi(), pt); + histos.fill(HIST("TofItsNsigma_before"), KAONS, itsResponse.nSigmaITS(track), track.tofNSigmaKa(), pt); + histos.fill(HIST("TofItsNsigma_before"), PROTONS, itsResponse.nSigmaITS(track), track.tofNSigmaPr(), pt); + bool withinPtPOI = (cfgCutPtPOIMin < pt) && (pt < cfgCutPtPOIMax); // within POI pT range bool withinPtRef = (cfgCutPtMin < pt) && (pt < cfgCutPtMax); // within RF pT range - pidIndex = cfgUseAsymmetricPID ? getNsigmaPIDTpcTofAssymmetric(track) : getNsigmaPIDTpcTof(track); + pidIndex = cfgUseAsymmetricPID ? getNsigmaPIDAssymmetric(track) : getNsigmaPIDTpcTof(track); weff = 1; // Initializing weff for each track // NUA weights From ce8a1a07e6668accee93f422a4cbd5e8997c8a29 Mon Sep 17 00:00:00 2001 From: hernasab Date: Sat, 14 Jun 2025 09:55:43 -0500 Subject: [PATCH 1630/1650] [PWGCF] remove obsolete variables (#11614) Co-authored-by: Sabrina Hernandez --- PWGCF/Flow/Tasks/flowZdcTask.cxx | 250 +++++++++++++------------------ 1 file changed, 100 insertions(+), 150 deletions(-) diff --git a/PWGCF/Flow/Tasks/flowZdcTask.cxx b/PWGCF/Flow/Tasks/flowZdcTask.cxx index 18b92bbfff8..3daec8cf2c7 100644 --- a/PWGCF/Flow/Tasks/flowZdcTask.cxx +++ b/PWGCF/Flow/Tasks/flowZdcTask.cxx @@ -189,10 +189,6 @@ struct FlowZdcTask { { // define axes const AxisSpec axisCounter{1, 0, +1, ""}; - const AxisSpec axisQ{100, -1, 1, "Q"}; - const AxisSpec axisQZNA{100, -1, 1, "Q"}; - const AxisSpec axisREQ{100, -1, 1, "real Q"}; - const AxisSpec axisIMQ{100, -1, 1, "imag Q"}; const AxisSpec axisEvent{18, 0.5, 18.5, ""}; const AxisSpec axisZpos{48, -12., 12., "Vtx_{z} (cm)"}; @@ -203,33 +199,15 @@ struct FlowZdcTask { // create histograms histos.add("hEventCounter", "Event counter", kTH1F, {axisEvent}); histos.add("zPos", ";;Entries;", kTH1F, {axisZpos}); - histos.add("etaHistogram", "etaHistogram", kTH1F, {axisEta}); - histos.add("ptHistogram", "ptHistogram", kTH1F, {axisPt}); histos.add("eventCounter", "eventCounter", kTH1F, {axisCounter}); histos.add("centHistogram", "centHistogram", kTH1F, {axisCent}); histos.add("multHistogram", "multHistogram", kTH1F, {axisMultiplicity}); - histos.add("multvsCent", "centrality vs multiplicity", kTH2F, {axisCent, axisMultiplicity}); histos.add("phiHistogram", "phiHistogram", kTH1F, {axisPhi}); - histos.add("TPCmultiplicity", "TPCmultiplicity", kTH1F, {axisMultTpc}); - - histos.add("REqHistogram", "REqHistogram", kTH1F, {axisQ}); - histos.add("IMqHistogram", "IMqHistogram", kTH1F, {axisQ}); - - histos.add("REqHistogramZNA", "REqHistogramZNA", kTH1F, {axisQZNA}); - histos.add("IMqHistogramZNA", "IMqHistogramZNA", kTH1F, {axisQZNA}); - - histos.add("REqHistogramZNC", "REqHistogramZNC", kTH1F, {axisQZNA}); - histos.add("IMqHistogramZNC", "IMqHistogramZNC", kTH1F, {axisQZNA}); - - histos.add("EnergyZNA", "ZNA Sector Energy", kTH1F, {axisEnergy}); - histos.add("EnergyZNC", "ZNC Sector Energy", kTH1F, {axisEnergy}); - histos.add("hCentFT0C", "FT0C Centrality Distribution", kTH1F, {{100, 0, 105}}); histos.add("hZNvsFT0Ccent", "ZN Energy vs FT0C Centrality", kTH2F, {axisCent, axisZN}); - histos.add("hZPvsFT0Ccent", "ZP Energy vs FT0C Centrality;Centrality [%];ZP Energy", kTH2F, @@ -237,7 +215,6 @@ struct FlowZdcTask { histos.add("hNchvsNPV", ";NPVTracks (|#eta|<1);N_{ch} (|#eta|<0.8);", kTH2F, {{{nBinsNch, -0.5, maxNch}, {nBinsNch, -0.5, maxNch}}}); - histos.add("revsimag", "revsimag", kTH2F, {axisREQ, axisIMQ}); // for q vector recentering histos.add("hYield", "Nch vs pT", kTH2F, {axisMultiplicity, axisPt}); histos.add("hGlobalTracks", "hGlobalTracks", kTH1F, {axisMultiplicity}); // event selection steps @@ -268,17 +245,13 @@ struct FlowZdcTask { if (doprocessZdcCollAssoc) { // Check if the process function for ZDCCollAssoc is enabled histos.add("ZNAcoll", "ZNAcoll; ZNA amplitude; Entries", {HistType::kTH1F, {{nBinsAmp, -0.5, maxZn}}}); histos.add("ZNCcoll", "ZNCcoll; ZNC amplitude; Entries", {HistType::kTH1F, {{nBinsAmp, -0.5, maxZn}}}); + histos.add("ZPCcoll", "ZPCcoll; ZPC amplitude; Entries", {HistType::kTH1F, {{nBinsAmp, -0.5, maxZn}}}); + histos.add("ZPAcoll", "ZPAcoll; ZPA amplitude; Entries", {HistType::kTH1F, {{nBinsAmp, -0.5, maxZn}}}); histos.add("ZEM1coll", "ZEM1coll; ZEM1 amplitude; Entries", {HistType::kTH1F, {{nBinsAmp, -0.5, maxZem}}}); histos.add("ZEM2coll", "ZEM2coll; ZEM2 amplitude; Entries", {HistType::kTH1F, {{nBinsAmp, -0.5, maxZem}}}); histos.add("ZNvsZEMcoll", "ZNvsZEMcoll; ZEM; ZNA+ZNC", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZem}, {nBinsAmp, -0.5, 2. * maxZn}}}}); histos.add("ZNAvsZNCcoll", "ZNAvsZNCcoll; ZNC; ZNA", {HistType::kTH2F, {{{nBinsAmp, -0.5, maxZn}, {nBinsAmp, -0.5, maxZn}}}}); - histos.add("RealQHistogramZNA", "RealQHistogramZNA", kTH1F, {axisQZNA}); - histos.add("ImagQHistogramZNA", "ImagQHistogramZNA", kTH1F, {axisQZNA}); - histos.add("RealQHistogramZNC", "RealQHistogramZNC", kTH1F, {axisQZNA}); - histos.add("ImagQHistogramZNC", "ImagQHistogramZNC", kTH1F, {axisQZNA}); - - histos.add("Acorrelations", "Acorrelations", kTH2F, {{axisQZNA}, {axisQZNA}}); histos.add("SPAngleZNA", "Spectator Plane Angle ZNA;Angle (radians);Entries", {HistType::kTH1F, {{100, -o2::constants::math::PI, o2::constants::math::PI}}}); histos.add("SPAngleZNC", "Spectator Plane Angle ZNC;Angle (radians);Entries", {HistType::kTH1F, {{100, -o2::constants::math::PI, o2::constants::math::PI}}}); @@ -351,15 +324,6 @@ struct FlowZdcTask { histos.add("ZNVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA+ZNC;", kTH2F, {{{nBinsNch, minNch, maxNch}, {nBinsZDC, minNch, maxZn}}}); histos.add("ZNDifVsNch", ";#it{N}_{ch} (|#eta|<0.8);ZNA-ZNC;", kTH2F, {{{nBinsNch, minNch, maxNch}, {100, -50., 50.}}}); } - LOG(info) << "\tccdbNoLaterThan=" << ccdbNoLaterThan.value; - LOG(info) << "\tapplyEff=" << applyEff.value; - LOG(info) << "\tpaTH=" << paTH.value; - LOG(info) << "\tuseMidRapNchSel=" << useMidRapNchSel.value; - LOG(info) << "\tpaTHmeanNch=" << paTHmeanNch.value; - LOG(info) << "\tpaTHsigmaNch=" << paTHsigmaNch.value; - LOG(info) << "\tminPt=" << minPt.value; - LOG(info) << "\tmaxPt=" << maxPt.value; - LOG(info) << "\tmaxPtSpectra=" << maxPtSpectra.value; ccdb->setURL("http://alice-ccdb.cern.ch"); // Enabling object caching, otherwise each call goes to the CCDB server @@ -491,6 +455,17 @@ struct FlowZdcTask { float tZPC{zdc.timeZPC()}; float tZDCdif{tZNC + tZPC - tZNA - tZPA}; float tZDCsum{tZNC + tZPC + tZNA + tZPA}; + const double normT0M{(aT0A + aT0C) / 100.}; + float znA = zdc.amplitudeZNA() / cfgCollisionEnergy; + float znC = zdc.amplitudeZNC() / cfgCollisionEnergy; + float zpA = zdc.amplitudeZPA() / cfgCollisionEnergy; + float zpC = zdc.amplitudeZPC() / cfgCollisionEnergy; + float aZEM1{zdc.amplitudeZEM1()}; + float aZEM2{zdc.amplitudeZEM2()}; + float sumZEMs{aZEM1 + aZEM2}; + float tZEM1{zdc.timeZEM1()}; + float tZEM2{zdc.timeZEM2()}; + float sumZNs{znA + znC}; // TDC cut if (isTDCcut) { @@ -500,10 +475,6 @@ struct FlowZdcTask { histos.fill(HIST("hEventCounter"), EvCutLabel::Tdc); } - float aZEM1{zdc.amplitudeZEM1()}; - float aZEM2{zdc.amplitudeZEM2()}; - float sumZEMs{aZEM1 + aZEM2}; - // ZEM cut if (isZEMcut) { if (sumZEMs < zemCut) { @@ -512,29 +483,22 @@ struct FlowZdcTask { histos.fill(HIST("hEventCounter"), EvCutLabel::Zem); } - const double normT0M{(aT0A + aT0C) / 100.}; - float znA = zdc.amplitudeZNA() / cfgCollisionEnergy; - float znC = zdc.amplitudeZNC() / cfgCollisionEnergy; - float zpA = zdc.amplitudeZPA() / cfgCollisionEnergy; - float zpC = zdc.amplitudeZPC() / cfgCollisionEnergy; - - float tZEM1{zdc.timeZEM1()}; - float tZEM2{zdc.timeZEM2()}; - float sumZNs{znA + znC}; - float sumZNC = (zdc.energySectorZNC())[0] + (zdc.energySectorZNC())[1] + (zdc.energySectorZNC())[2] + (zdc.energySectorZNC())[3]; float sumZNA = (zdc.energySectorZNA())[0] + (zdc.energySectorZNA())[1] + (zdc.energySectorZNA())[2] + (zdc.energySectorZNA())[3]; float sumZPC = (zdc.energySectorZPC())[0] + (zdc.energySectorZPC())[1] + (zdc.energySectorZPC())[2] + (zdc.energySectorZPC())[3]; float sumZPA = (zdc.energySectorZPA())[0] + (zdc.energySectorZPA())[1] + (zdc.energySectorZPA())[2] + (zdc.energySectorZPA())[3]; - int itsTracks = 0, glbTracks = 0; float et = 0., meanpt = 0.; + int itsTracks = 0, glbTracks = 0; for (const auto& track : tracks) { - if (track.hasITS() && track.itsNCls() >= minITSnCls) { + if (track.hasITS()) { itsTracks++; } // Track Selection - if (track.isGlobalTrack()) { + if (!track.isGlobalTrack()) { + continue; + } + if ((track.pt() < minPt) || (track.pt() > maxPt)) { continue; } glbTracks++; @@ -637,42 +601,6 @@ struct FlowZdcTask { } } - void processQVector(AodCollisions::iterator const& collision, aod::BCsWithTimestamps const&, AodTracks const& tracks, BCsRun3 const& /*bcs*/, aod::Zdcs const& /*zdcsData*/, aod::ZDCMults const& /*zdcMults*/) - { - if (!isEventSelected(collision)) { - return; - } - histos.fill(HIST("eventCounter"), 0.5); - histos.fill(HIST("centHistogram"), collision.centFT0C()); - const auto& tracksGrouped = tracksIUWithTPC->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - const int multTPC = tracksGrouped.size(); - const auto cent = collision.centFT0C(); - int globalTracks = tracks.size(); - if (globalTracks < 1) - return; - int nTot{0}; // Tracks are already filtered with GlobalTrack || GlobalTrackSDD - for (const auto& track : tracks) { - nTot++; - histos.fill(HIST("etaHistogram"), track.eta()); - histos.fill(HIST("phiHistogram"), track.phi()); - histos.fill(HIST("ptHistogram"), track.pt()); - } // end track loop 1 - double pT{0}; - for (const auto& track : tracks) { - if (track.tpcNClsCrossedRows() < minTpcNcrossedRows) - continue; - if (std::fabs(track.dcaXY()) > cfgCutDCAxy) - continue; - pT = track.pt(); - pT++; - } // end track loop 2 - histos.fill(HIST("multvsCent"), cent, nTot); - histos.fill(HIST("hYield"), nTot, pT); - histos.fill(HIST("multHistogram"), nTot); - - histos.fill(HIST("TPCmultiplicity"), multTPC); - histos.fill(HIST("hGlobalTracks"), globalTracks); - } void processZdcCollAssoc( AodCollisions::iterator const& collision, AodTracks const& tracks, @@ -683,10 +611,10 @@ struct FlowZdcTask { if (!isEventSelected(collision)) { return; } + const auto& foundBC = collision.foundBC_as(); int nTot = tracks.size(); double ft0aAmp = 0; double ft0cAmp = 0; - const auto& foundBC = collision.foundBC_as(); if (collision.has_foundFT0()) { auto ft0 = collision.foundFT0(); for (const auto& amplitude : ft0.amplitudeA()) { @@ -696,66 +624,89 @@ struct FlowZdcTask { ft0cAmp += amplitude; } } + const double normT0M{(ft0aAmp + ft0aAmp) / 100.}; histos.fill(HIST("hFT0AAmp"), ft0aAmp); - histos.fill(HIST("hFT0CAmp"), ft0cAmp); - double ft0mAmp = ft0aAmp + ft0cAmp; - histos.fill(HIST("hFT0MAmp"), ft0mAmp); - if (foundBC.has_zdc()) { - const auto& zdcread = foundBC.zdc(); - const auto cent = collision.centFT0C(); - - // ZDC data and histogram filling - histos.get(HIST("ZNAcoll"))->Fill(zdcread.amplitudeZNA()); - histos.get(HIST("ZNCcoll"))->Fill(zdcread.amplitudeZNC()); - histos.get(HIST("ZNvsZEMcoll"))->Fill(zdcread.amplitudeZEM1() + zdcread.amplitudeZEM2(), zdcread.amplitudeZNA() + zdcread.amplitudeZNC()); - histos.get(HIST("ZNAvsZNCcoll"))->Fill(zdcread.amplitudeZNC(), zdcread.amplitudeZNA()); - - histos.get(HIST("ZEM1coll"))->Fill(zdcread.amplitudeZEM1()); - histos.get(HIST("ZEM2coll"))->Fill(zdcread.amplitudeZEM2()); - - float sumZNC = (zdcread.energySectorZNC())[0] + (zdcread.energySectorZNC())[1] + (zdcread.energySectorZNC())[2] + (zdcread.energySectorZNC())[3]; - float sumZNA = (zdcread.energySectorZNA())[0] + (zdcread.energySectorZNA())[1] + (zdcread.energySectorZNA())[2] + (zdcread.energySectorZNA())[3]; - float sumZPC = (zdcread.energySectorZPC())[0] + (zdcread.energySectorZPC())[1] + (zdcread.energySectorZPC())[2] + (zdcread.energySectorZPC())[3]; - float sumZPA = (zdcread.energySectorZPA())[0] + (zdcread.energySectorZPA())[1] + (zdcread.energySectorZPA())[2] + (zdcread.energySectorZPA())[3]; - float sumZDC = sumZPA + sumZPC + sumZNA + sumZNC; - float sumZEM = zdcread.amplitudeZEM1() + zdcread.amplitudeZEM2(); - // ZEM cut - if (isZEMcut) { - if (sumZEM < zemCut) { - return; - } + histos.fill(HIST("hFT0CAmp"), ft0aAmp); + histos.fill(HIST("hFT0MAmp"), normT0M); + + if (!foundBC.has_zdc()) { + return; + } + const auto& zdcread = foundBC.zdc(); + const auto cent = collision.centFT0C(); + + // ZDC data and histogram filling + float znA = zdcread.amplitudeZNA(); + float znC = zdcread.amplitudeZNC(); + float zpA = zdcread.amplitudeZPA(); + float zpC = zdcread.amplitudeZPC(); + float tZNA{zdcread.timeZNA()}; + float tZNC{zdcread.timeZNC()}; + float tZPA{zdcread.timeZPA()}; + float tZPC{zdcread.timeZPC()}; + float tZDCdif{tZNC + tZPC - tZNA - tZPA}; + float tZDCsum{tZNC + tZPC + tZNA + tZPA}; + float sumZNC = (zdcread.energySectorZNC())[0] + (zdcread.energySectorZNC())[1] + (zdcread.energySectorZNC())[2] + (zdcread.energySectorZNC())[3]; + float sumZNA = (zdcread.energySectorZNA())[0] + (zdcread.energySectorZNA())[1] + (zdcread.energySectorZNA())[2] + (zdcread.energySectorZNA())[3]; + float sumZPC = (zdcread.energySectorZPC())[0] + (zdcread.energySectorZPC())[1] + (zdcread.energySectorZPC())[2] + (zdcread.energySectorZPC())[3]; + float sumZPA = (zdcread.energySectorZPA())[0] + (zdcread.energySectorZPA())[1] + (zdcread.energySectorZPA())[2] + (zdcread.energySectorZPA())[3]; + float sumZDC = sumZPA + sumZPC + sumZNA + sumZNC; + float sumZEM = zdcread.amplitudeZEM1() + zdcread.amplitudeZEM2(); + znA /= cfgCollisionEnergy; + znC /= cfgCollisionEnergy; + zpA /= cfgCollisionEnergy; + zpC /= cfgCollisionEnergy; + // TDC cut + if (isTDCcut) { + if (std::sqrt(std::pow(tZDCdif, 2.) + std::pow(tZDCsum, 2.)) > tdcCut) { + return; + } + histos.fill(HIST("hEventCounter"), EvCutLabel::Tdc); + } + // ZEM cut + if (isZEMcut) { + if (sumZEM < zemCut) { + return; } - // common energies - float commonSumZnc = (zdcread.energyCommonZNC()); - float commonSumZna = (zdcread.energyCommonZNA()); - float commonSumZpc = (zdcread.energyCommonZPC()); - float commonSumZpa = (zdcread.energyCommonZPA()); - float sumZN = (sumZNC) + (sumZNA); - float sumZP = (sumZPC) + (sumZPA); - - histos.fill(HIST("ZNenergy"), sumZN); - histos.fill(HIST("ZPenergy"), sumZP); - histos.fill(HIST("ZNCenergy"), commonSumZnc); - histos.fill(HIST("ZNAenergy"), commonSumZna); - histos.fill(HIST("ZPAenergy"), commonSumZpa); - histos.fill(HIST("ZPCenergy"), commonSumZpc); - histos.fill(HIST("hZNvsFT0Ccent"), cent, sumZN); - histos.fill(HIST("hZPvsFT0Ccent"), cent, sumZP); - histos.fill(HIST("hZNvsFT0CAmp"), ft0cAmp, sumZN); - histos.fill(HIST("hZPvsFT0CAmp"), ft0cAmp, sumZP); - histos.fill(HIST("hZNvsMult"), nTot, sumZN); - histos.fill(HIST("hZPvsMult"), nTot, sumZP); - histos.fill(HIST("hNchvsNPV"), collision.multNTracksPVeta1(), nTot); - - float ratioZN = sumZNC / sumZNA; - float ratioZP = sumZPC / sumZPA; - pZNratiovscent->Fill(cent, ratioZN); - pZPratiovscent->Fill(cent, ratioZP); - pZNvsFT0Ccent->Fill(cent, sumZN); - pZPvsFT0Ccent->Fill(cent, sumZP); - - histos.get(HIST("ZDC_energy_vs_ZEM"))->Fill(sumZEM, sumZDC); } + // common energies + float commonSumZnc = (zdcread.energyCommonZNC()); + float commonSumZna = (zdcread.energyCommonZNA()); + float commonSumZpc = (zdcread.energyCommonZPC()); + float commonSumZpa = (zdcread.energyCommonZPA()); + float sumZN = (sumZNC) + (sumZNA); + float sumZP = (sumZPC) + (sumZPA); + histos.fill(HIST("zPos"), collision.posZ()); + histos.fill(HIST("T0Ccent"), collision.centFT0C()); + histos.fill(HIST("ZNAcoll"), znA); + histos.fill(HIST("ZNCcoll"), znC); + histos.fill(HIST("ZPAcoll"), zpA); + histos.fill(HIST("ZPCcoll"), zpC); + histos.get(HIST("ZNvsZEMcoll"))->Fill(zdcread.amplitudeZEM1() + zdcread.amplitudeZEM2(), zdcread.amplitudeZNA() + zdcread.amplitudeZNC()); + histos.get(HIST("ZNAvsZNCcoll"))->Fill(zdcread.amplitudeZNC(), zdcread.amplitudeZNA()); + histos.get(HIST("ZEM1coll"))->Fill(zdcread.amplitudeZEM1()); + histos.get(HIST("ZEM2coll"))->Fill(zdcread.amplitudeZEM2()); + histos.fill(HIST("ZNenergy"), sumZN); + histos.fill(HIST("ZPenergy"), sumZP); + histos.fill(HIST("ZNCenergy"), commonSumZnc); + histos.fill(HIST("ZNAenergy"), commonSumZna); + histos.fill(HIST("ZPAenergy"), commonSumZpa); + histos.fill(HIST("ZPCenergy"), commonSumZpc); + histos.fill(HIST("hZNvsFT0Ccent"), cent, sumZN); + histos.fill(HIST("hZPvsFT0Ccent"), cent, sumZP); + histos.fill(HIST("hZNvsFT0CAmp"), ft0cAmp, sumZN); + histos.fill(HIST("hZPvsFT0CAmp"), ft0cAmp, sumZP); + histos.fill(HIST("hZNvsMult"), nTot, sumZN); + histos.fill(HIST("hZPvsMult"), nTot, sumZP); + histos.fill(HIST("hNchvsNPV"), collision.multNTracksPVeta1(), nTot); + + float ratioZN = sumZNC / sumZNA; + float ratioZP = sumZPC / sumZPA; + pZNratiovscent->Fill(cent, ratioZN); + pZPratiovscent->Fill(cent, ratioZP); + pZNvsFT0Ccent->Fill(cent, sumZN); + pZPvsFT0Ccent->Fill(cent, sumZP); + histos.get(HIST("ZDC_energy_vs_ZEM"))->Fill(sumZEM, sumZDC); } void processCorrelation(CollisionDataTable::iterator const& collision, FilTrackDataTable const& tracks) @@ -779,7 +730,6 @@ struct FlowZdcTask { PROCESS_SWITCH(FlowZdcTask, processZdcCollAssoc, "Processing ZDC w. collision association", true); PROCESS_SWITCH(FlowZdcTask, processQA, "Process QA", true); - PROCESS_SWITCH(FlowZdcTask, processQVector, "Process before recentering", true); PROCESS_SWITCH(FlowZdcTask, processCorrelation, "Process correlations", true); }; // end of struct function From 888154fbaa0a687677fbf10a3d44cd16cf216859 Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Sun, 15 Jun 2025 10:43:27 +0200 Subject: [PATCH 1631/1650] [Common] Change index column identifier (#11622) --- Common/DataModel/Multiplicity.h | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/Common/DataModel/Multiplicity.h b/Common/DataModel/Multiplicity.h index 864e2a9cd1c..0ac2a0074c6 100644 --- a/Common/DataModel/Multiplicity.h +++ b/Common/DataModel/Multiplicity.h @@ -8,6 +8,11 @@ // In applying this license CERN does not waive the privileges and immunities // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. + +/// \file Multiplicity.h +/// \brief multiplicity tables +/// \author ALICE + #ifndef COMMON_DATAMODEL_MULTIPLICITY_H_ #define COMMON_DATAMODEL_MULTIPLICITY_H_ @@ -184,14 +189,9 @@ DECLARE_SOA_TABLE_VERSIONED(MultMCExtras_001, "AOD", "MULTMCEXTRA", 1, //! Table mult::IsInelGt1, o2::soa::Marker<1>); -DECLARE_SOA_TABLE(MultHepMCHIs, "AOD", "MULTHEPMCHI", //! complementary table for heavy-ion mc info (subset of HepMCHeavyIons) - o2::soa::Index<>, hepmcheavyion::McCollisionId, hepmcheavyion::NcollHard, hepmcheavyion::NpartProj, hepmcheavyion::NpartTarg, - hepmcheavyion::Ncoll, hepmcheavyion::ImpactParameter); - using MultMCExtras = MultMCExtras_001; using MultMCExtra = MultMCExtras::iterator; using MultsExtraMC = MultMCExtras; // for backwards compatibility with previous naming scheme -using MultHepMCHI = MultHepMCHIs::iterator; // crosslinks namespace mult @@ -202,6 +202,12 @@ DECLARE_SOA_INDEX_COLUMN(MultMCExtra, multMCExtra); DECLARE_SOA_TABLE(Mult2MCExtras, "AOD", "Mult2MCEXTRA", //! Relate reco mult entry to MC extras entry o2::soa::Index<>, mult::MultMCExtraId); +DECLARE_SOA_TABLE(MultHepMCHIs, "AOD", "MULTHEPMCHI", //! complementary table for heavy-ion mc info (subset of HepMCHeavyIons) + o2::soa::Index<>, mult::MultMCExtraId, hepmcheavyion::NcollHard, hepmcheavyion::NpartProj, hepmcheavyion::NpartTarg, + hepmcheavyion::Ncoll, hepmcheavyion::ImpactParameter); + +using MultHepMCHI = MultHepMCHIs::iterator; + namespace multZeq { DECLARE_SOA_COLUMN(MultZeqFV0A, multZeqFV0A, float); //! Multiplicity equalized for the vertex position with the FV0A detector From 637ad5cb4f87cdbaf088b91c5f8838221d558427 Mon Sep 17 00:00:00 2001 From: Roman Lietava Date: Sun, 15 Jun 2025 10:45:20 +0200 Subject: [PATCH 1632/1650] [PWGLF,Trigger] Omegamult: added toi mask (#11619) --- EventFiltering/Zorro.h | 8 ++++- PWGLF/DataModel/LFNonPromptCascadeTables.h | 13 ++++--- PWGLF/Tasks/Strangeness/nonPromptCascade.cxx | 38 ++++++++++++++------ 3 files changed, 44 insertions(+), 15 deletions(-) diff --git a/EventFiltering/Zorro.h b/EventFiltering/Zorro.h index c818e45ce48..16da5d578ca 100644 --- a/EventFiltering/Zorro.h +++ b/EventFiltering/Zorro.h @@ -9,7 +9,12 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. // -// Zero Obstacles Results Retriever for Offline trigger selections + +/// +/// \file Zorro.h +/// \brief Zero Obstacles Results Retriever for Offline trigger selections +/// \author M Puccio +/// #ifndef EVENTFILTERING_ZORRO_H_ #define EVENTFILTERING_ZORRO_H_ @@ -54,6 +59,7 @@ class Zorro std::vector getTOIcounters() const { return mTOIcounts; } std::vector getTriggerOfInterestResults(uint64_t bcGlobalId, uint64_t tolerance = 100); std::vector getTriggerOfInterestResults() const; + int getNTOIs() const { return mTOIs.size(); } void setCCDBpath(std::string path) { mBaseCCDBPath = path; } void setBaseCCDBPath(std::string path) { mBaseCCDBPath = path; } diff --git a/PWGLF/DataModel/LFNonPromptCascadeTables.h b/PWGLF/DataModel/LFNonPromptCascadeTables.h index 177167d5997..a4e15df33ef 100644 --- a/PWGLF/DataModel/LFNonPromptCascadeTables.h +++ b/PWGLF/DataModel/LFNonPromptCascadeTables.h @@ -119,6 +119,7 @@ DECLARE_SOA_COLUMN(MultFT0M, multFT0M, float); DECLARE_SOA_COLUMN(CentFT0C, centFT0C, float); DECLARE_SOA_COLUMN(CentFT0A, centFT0A, float); DECLARE_SOA_COLUMN(CentFT0M, centFT0M, float); +DECLARE_SOA_COLUMN(ToiMask, toiMask, uint32_t); } // namespace NPCascadeTable DECLARE_SOA_TABLE(NPCascTable, "AOD", "NPCASCTABLE", @@ -183,7 +184,8 @@ DECLARE_SOA_TABLE(NPCascTable, "AOD", "NPCASCTABLE", NPCascadeTable::MultFT0M, NPCascadeTable::CentFT0C, NPCascadeTable::CentFT0A, - NPCascadeTable::CentFT0M) + NPCascadeTable::CentFT0M, + NPCascadeTable::ToiMask) DECLARE_SOA_TABLE(NPCascTableNT, "AOD", "NPCASCTABLENT", NPCascadeTable::MatchingChi2, @@ -247,7 +249,8 @@ DECLARE_SOA_TABLE(NPCascTableNT, "AOD", "NPCASCTABLENT", NPCascadeTable::MultFT0M, NPCascadeTable::CentFT0C, NPCascadeTable::CentFT0A, - NPCascadeTable::CentFT0M) + NPCascadeTable::CentFT0M, + NPCascadeTable::ToiMask) DECLARE_SOA_TABLE(NPCascTableMC, "AOD", "NPCASCTABLEMC", NPCascadeTable::MatchingChi2, @@ -330,7 +333,8 @@ DECLARE_SOA_TABLE(NPCascTableMC, "AOD", "NPCASCTABLEMC", NPCascadeTable::DCAzMC, NPCascadeTable::MCcollisionMatch, NPCascadeTable::HasFakeReassociation, - NPCascadeTable::MotherDecayDaughters) + NPCascadeTable::MotherDecayDaughters, + NPCascadeTable::ToiMask) DECLARE_SOA_TABLE(NPCascTableMCNT, "AOD", "NPCASCTABLEMCNT", NPCascadeTable::MatchingChi2, @@ -413,7 +417,8 @@ DECLARE_SOA_TABLE(NPCascTableMCNT, "AOD", "NPCASCTABLEMCNT", NPCascadeTable::DCAzMC, NPCascadeTable::MCcollisionMatch, NPCascadeTable::HasFakeReassociation, - NPCascadeTable::MotherDecayDaughters) + NPCascadeTable::MotherDecayDaughters, + NPCascadeTable::ToiMask) DECLARE_SOA_TABLE(NPCascTableGen, "AOD", "NPCASCTABLEGen", NPCascadeTable::gPt, diff --git a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx index c5388c034a2..bb2960e745b 100644 --- a/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx +++ b/PWGLF/Tasks/Strangeness/nonPromptCascade.cxx @@ -125,6 +125,7 @@ struct NPCascCandidate { float centFT0C; float centFT0A; float centFT0M; + uint32_t toiMask; }; std::array isFromHF(auto& particle) { @@ -287,7 +288,7 @@ struct NonPromptCascadeTask { return true; } - void zorroAccounting(const auto& collisions) + void zorroAccounting(const auto& collisions, auto& toiMap) { if (cfgSkimmedProcessing) { int runNumber{-1}; @@ -295,15 +296,26 @@ struct NonPromptCascadeTask { auto bc = coll.template bc_as(); if (runNumber != bc.runNumber()) { mZorro.initCCDB(mCCDB.service, bc.runNumber(), bc.timestamp(), cfgTriggersOfInterest.value); + if (mZorro.getNTOIs() > 32) { + LOG(fatal) << "N TOIs:" << mZorro.getNTOIs() << " Max 32 TOIs possible."; + } mZorro.populateHistRegistry(mRegistry, bc.runNumber()); runNumber = bc.runNumber(); } - mZorro.isSelected(bc.globalBC()); /// Just let Zorro do the accounting + bool sel = mZorro.isSelected(bc.globalBC()); /// Just let Zorro do the accounting + if (sel) { + std::vector toivect = mZorro.getTriggerOfInterestResults(); + uint32_t toiMask = 0; + for (size_t i{0}; i < toivect.size(); i++) { + toiMask += toivect[i] << i; + } + toiMap[bc.globalBC()] = toiMask; + } } } } template - void fillCandidatesVector(CollisionType const&, TrackType const& tracks, auto const& cascades, auto& candidates) + void fillCandidatesVector(CollisionType const&, TrackType const& tracks, auto const& cascades, auto& candidates, std::map toiMap = {}) { const auto& getCascade = [](auto const& candidate) { @@ -507,6 +519,10 @@ struct NonPromptCascadeTask { } else { o2::base::Propagator::Instance()->propagateToDCA(primaryVertex, ntCascadeTrack, mBz, 2.f, matCorr, &motherDCA); } + uint32_t toiMask = 0x0; + if (toiMap.count(bc.globalBC())) { + toiMask = toiMap[bc.globalBC()]; + } candidates.emplace_back(NPCascCandidate{mcParticleID, trackedCascGlobalIndex, itsTrackGlobalIndex, candidate.collisionId(), matchingChi2, deltaPtITSCascade, deltaPtCascade, cascITSclsSize, hasReassociatedClusters, hasFakeReassociation, isGoodMatch, isGoodCascade, pdgCodeMom, itsTrackPDG, fromHF[0], fromHF[1], collision.numContrib(), cascPVContribs, collision.collisionTimeRes(), primaryVertex.getX(), primaryVertex.getY(), primaryVertex.getZ(), cascadeLvector.pt(), cascadeLvector.eta(), cascadeLvector.phi(), @@ -517,7 +533,7 @@ struct NonPromptCascadeTask { cascITSclusters, protonTrack.itsNCls(), pionTrack.itsNCls(), bachelor.itsNCls(), protonTrack.tpcNClsFound(), pionTrack.tpcNClsFound(), bachelor.tpcNClsFound(), protonTrack.tpcNSigmaPr(), pionTrack.tpcNSigmaPi(), bachelor.tpcNSigmaKa(), bachelor.tpcNSigmaPi(), protonTrack.hasTOF(), pionTrack.hasTOF(), bachelor.hasTOF(), - protonTrack.tofNSigmaPr(), pionTrack.tofNSigmaPi(), bachelor.tofNSigmaKa(), bachelor.tofNSigmaPi(), collision.sel8(), collision.multFT0C(), collision.multFT0A(), collision.multFT0M(), collision.centFT0C(), collision.centFT0A(), collision.centFT0M()}); + protonTrack.tofNSigmaPr(), pionTrack.tofNSigmaPi(), bachelor.tofNSigmaKa(), bachelor.tofNSigmaPi(), collision.sel8(), collision.multFT0C(), collision.multFT0A(), collision.multFT0M(), collision.centFT0C(), collision.centFT0A(), collision.centFT0M(), toiMask}); } } @@ -537,7 +553,7 @@ struct NonPromptCascadeTask { c.protonTPCNSigma, c.pionTPCNSigma, c.bachKaonTPCNSigma, c.bachPionTPCNSigma, c.protonHasTOF, c.pionHasTOF, c.bachHasTOF, c.protonTOFNSigma, c.pionTOFNSigma, c.bachKaonTOFNSigma, c.bachPionTOFNSigma, - c.sel8, c.multFT0C, c.multFT0A, c.multFT0M, c.centFT0C, c.centFT0A, c.centFT0M); + c.sel8, c.multFT0C, c.multFT0A, c.multFT0M, c.centFT0C, c.centFT0A, c.centFT0M, c.toiMask); } } @@ -576,7 +592,7 @@ struct NonPromptCascadeTask { c.sel8, c.multFT0C, c.multFT0A, c.multFT0M, c.centFT0C, c.centFT0A, c.centFT0M, particle.pt(), particle.eta(), particle.phi(), mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), particle.pdgCode(), mcCollision.posX() - particle.vx(), mcCollision.posY() - particle.vy(), - mcCollision.posZ() - particle.vz(), mcCollision.globalIndex() == recCollision.mcCollisionId(), c.hasFakeReassociation, motherDecayDaughters); + mcCollision.posZ() - particle.vz(), mcCollision.globalIndex() == recCollision.mcCollisionId(), c.hasFakeReassociation, motherDecayDaughters, c.toiMask); } } @@ -653,8 +669,9 @@ struct NonPromptCascadeTask { aod::V0s const& /*v0s*/, TracksExtData const& tracks, aod::BCsWithTimestamps const&) { - zorroAccounting(collisions); - fillCandidatesVector(collisions, tracks, trackedCascades, gCandidates); + std::map toiMap; + zorroAccounting(collisions, toiMap); + fillCandidatesVector(collisions, tracks, trackedCascades, gCandidates, toiMap); fillDataTable(gCandidates); } PROCESS_SWITCH(NonPromptCascadeTask, processTrackedCascadesData, "process cascades from strangeness tracking: Data analysis", false); @@ -663,8 +680,9 @@ struct NonPromptCascadeTask { aod::V0s const& /*v0s*/, TracksExtData const& tracks, aod::BCsWithTimestamps const&) { - zorroAccounting(collisions); - fillCandidatesVector(collisions, tracks, cascades, gCandidatesNT); + std::map toiMap; + zorroAccounting(collisions, toiMap); + fillCandidatesVector(collisions, tracks, cascades, gCandidatesNT, toiMap); fillDataTable(gCandidatesNT); } PROCESS_SWITCH(NonPromptCascadeTask, processCascadesData, "process cascades: Data analysis", false); From 1f455560902413ccd10bd94c0b5a5317da49c999 Mon Sep 17 00:00:00 2001 From: mherzer <96999709+mherzer28@users.noreply.github.com> Date: Sun, 15 Jun 2025 14:22:04 +0200 Subject: [PATCH 1633/1650] [PWGLF] add tof flag, detector map and cfg for its cluster size cut (#11623) Co-authored-by: ALICE Action Bot --- PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx | 65 ++++++++++++++------- 1 file changed, 43 insertions(+), 22 deletions(-) diff --git a/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx b/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx index f00fc314870..40378ba6df4 100644 --- a/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx +++ b/PWGLF/TableProducer/Nuspex/trHeAnalysis.cxx @@ -61,6 +61,8 @@ DECLARE_SOA_COLUMN(TTpcChi2NCl, tTpcChi2NCl, float); DECLARE_SOA_COLUMN(TItsChi2NCl, tItsChi2NCl, float); DECLARE_SOA_COLUMN(TRigidity, tRigidity, float); DECLARE_SOA_COLUMN(TItsClusterSize, tItsClusterSize, float); +DECLARE_SOA_COLUMN(THasTof, tHasTof, bool); +DECLARE_SOA_COLUMN(TDetectorMap, tDetectorMap, int8_t); } // namespace h3_data DECLARE_SOA_TABLE(H3Data, "AOD", "h3_data", h3_data::TPt, h3_data::TEta, h3_data::TPhi, h3_data::TCharge, h3_data::TH3DeDx, @@ -69,7 +71,7 @@ DECLARE_SOA_TABLE(H3Data, "AOD", "h3_data", h3_data::TPt, h3_data::TEta, h3_data::TSigmaZ, h3_data::TnTpcCluster, h3_data::TnItsCluster, h3_data::TTpcChi2NCl, h3_data::TItsChi2NCl, h3_data::TRigidity, - h3_data::TItsClusterSize); + h3_data::TItsClusterSize, h3_data::THasTof, h3_data::TDetectorMap); namespace he_data { DECLARE_SOA_COLUMN(TPt, tPt, float); @@ -91,6 +93,8 @@ DECLARE_SOA_COLUMN(TTpcChi2NCl, tTpcChi2NCl, float); DECLARE_SOA_COLUMN(TItsChi2NCl, tItsChi2NCl, float); DECLARE_SOA_COLUMN(TRigidity, tRigidity, float); DECLARE_SOA_COLUMN(TItsClusterSize, tItsClusterSize, float); +DECLARE_SOA_COLUMN(THasTof, tHasTof, bool); +DECLARE_SOA_COLUMN(TDetectorMap, tDetectorMap, int8_t); } // namespace he_data DECLARE_SOA_TABLE(HeData, "AOD", "he_data", he_data::TPt, he_data::TEta, he_data::TPhi, he_data::TCharge, he_data::THeDeDx, @@ -99,7 +103,7 @@ DECLARE_SOA_TABLE(HeData, "AOD", "he_data", he_data::TPt, he_data::TEta, he_data::TSigmaZ, he_data::TnTpcCluster, he_data::TnItsCluster, he_data::TTpcChi2NCl, he_data::TItsChi2NCl, he_data::TRigidity, - he_data::TItsClusterSize); + he_data::TItsClusterSize, he_data::THasTof, he_data::TDetectorMap); } // namespace o2::aod namespace { @@ -189,6 +193,7 @@ struct TrHeAnalysis { Configurable cfgTPCPidMethod{"cfgTPCPidMethod", false, "Using own or built in bethe parametrization"}; // false for built in Configurable cfgMassMethod{"cfgMassMethod", 0, "0: Using built in 1: mass calculated with beta 2: mass calculated with the event time"}; + Configurable cfgEnableItsClusterSizeCut{"cfgEnableItsClusterSizeCut", false, "Enable ITS cluster size cut"}; // Set the multiplity event limits Configurable cfgLowMultCut{"cfgLowMultCut", 0.0f, "Accepted multiplicity percentage lower limit"}; Configurable cfgHighMultCut{"cfgHighMultCut", 100.0f, "Accepted multiplicity percentage higher limit"}; @@ -387,10 +392,12 @@ struct TrHeAnalysis { histos.fill(HIST("histogram/cuts"), 7); continue; } - if (getMeanItsClsSize(track) / std::cosh(track.eta()) <= cfgCutMinItsClusterSizeH3 || - getMeanItsClsSize(track) / std::cosh(track.eta()) >= cfgCutMaxItsClusterSizeH3) { - histos.fill(HIST("histogram/cuts"), 12); - continue; + if (cfgEnableItsClusterSizeCut) { + if (getMeanItsClsSize(track) / std::cosh(track.eta()) <= cfgCutMinItsClusterSizeHe || + getMeanItsClsSize(track) / std::cosh(track.eta()) >= cfgCutMaxItsClusterSizeHe) { + histos.fill(HIST("histogram/cuts"), 12); + continue; + } } if (getMass(track) < cfgCutMinTofMassH3 || getMass(track) > cfgCutMaxTofMassH3) { histos.fill(HIST("histogram/cuts"), 13); @@ -421,10 +428,12 @@ struct TrHeAnalysis { float tRigidity = getRigidity(track); float tItsClusterSize = getMeanItsClsSize(track) / std::cosh(track.eta()); + bool tHasTof = track.hasTOF(); + int8_t tDetectorMap = track.detectorMap(); h3Data(tPt, tEta, tPhi, tCharge, tH3DeDx, tnSigmaTpc, tTofSignalH3, tDcaXY, tDcaZ, tSigmaYX, tSigmaXYZ, tSigmaZ, tnTpcCluster, tnItsCluster, tTpcChi2NCl, tItsChi2NCl, tRigidity, - tItsClusterSize); + tItsClusterSize, tHasTof, tDetectorMap); } } if (enableHe && heRapCut) { @@ -438,10 +447,12 @@ struct TrHeAnalysis { histos.fill(HIST("histogram/cuts"), 7); continue; } - if (getMeanItsClsSize(track) / std::cosh(track.eta()) <= cfgCutMinItsClusterSizeHe || - getMeanItsClsSize(track) / std::cosh(track.eta()) >= cfgCutMaxItsClusterSizeHe) { - histos.fill(HIST("histogram/cuts"), 12); - continue; + if (cfgEnableItsClusterSizeCut) { + if (getMeanItsClsSize(track) / std::cosh(track.eta()) <= cfgCutMinItsClusterSizeHe || + getMeanItsClsSize(track) / std::cosh(track.eta()) >= cfgCutMaxItsClusterSizeHe) { + histos.fill(HIST("histogram/cuts"), 12); + continue; + } } histos.fill(HIST("histogram/He/He-TPCsignVsTPCmomentum"), getRigidity(track) * track.sign(), @@ -468,10 +479,12 @@ struct TrHeAnalysis { float tRigidity = getRigidity(track); float tItsClusterSize = getMeanItsClsSize(track) / std::cosh(track.eta()); + bool tHasTof = track.hasTOF(); + int8_t tDetectorMap = track.detectorMap(); heData(tPt, tEta, tPhi, tCharge, tHeDeDx, tnSigmaTpc, tTofSignalHe, tDcaXY, tDcaZ, tSigmaYX, tSigmaXYZ, tSigmaZ, tnTpcCluster, tnItsCluster, tTpcChi2NCl, tItsChi2NCl, tRigidity, - tItsClusterSize); + tItsClusterSize, tHasTof, tDetectorMap); } } } @@ -542,10 +555,12 @@ struct TrHeAnalysis { histos.fill(HIST("histogram/cuts"), 7); continue; } - if (getMeanItsClsSize(track) / std::cosh(track.eta()) <= cfgCutMinItsClusterSizeH3 || - getMeanItsClsSize(track) / std::cosh(track.eta()) >= cfgCutMaxItsClusterSizeH3) { - histos.fill(HIST("histogram/cuts"), 12); - continue; + if (cfgEnableItsClusterSizeCut) { + if (getMeanItsClsSize(track) / std::cosh(track.eta()) <= cfgCutMinItsClusterSizeH3 || + getMeanItsClsSize(track) / std::cosh(track.eta()) >= cfgCutMaxItsClusterSizeH3) { + histos.fill(HIST("histogram/cuts"), 12); + continue; + } } if (getMass(track) < cfgCutMinTofMassH3 || getMass(track) > cfgCutMaxTofMassH3) { histos.fill(HIST("histogram/cuts"), 13); @@ -576,10 +591,12 @@ struct TrHeAnalysis { float tRigidity = getRigidity(track); float tItsClusterSize = getMeanItsClsSize(track) / std::cosh(track.eta()); + bool tHasTof = track.hasTOF(); + int8_t tDetectorMap = track.detectorMap(); h3Data(tPt, tEta, tPhi, tCharge, tH3DeDx, tnSigmaTpc, tTofSignalH3, tDcaXY, tDcaZ, tSigmaYX, tSigmaXYZ, tSigmaZ, tnTpcCluster, tnItsCluster, tTpcChi2NCl, tItsChi2NCl, tRigidity, - tItsClusterSize); + tItsClusterSize, tHasTof, tDetectorMap); } } if (enableHe && heRapCut) { @@ -592,10 +609,12 @@ struct TrHeAnalysis { histos.fill(HIST("histogram/cuts"), 7); continue; } - if (getMeanItsClsSize(track) / std::cosh(track.eta()) <= cfgCutMinItsClusterSizeHe || - getMeanItsClsSize(track) / std::cosh(track.eta()) >= cfgCutMaxItsClusterSizeHe) { - histos.fill(HIST("histogram/cuts"), 12); - continue; + if (cfgEnableItsClusterSizeCut) { + if (getMeanItsClsSize(track) / std::cosh(track.eta()) <= cfgCutMinItsClusterSizeHe || + getMeanItsClsSize(track) / std::cosh(track.eta()) >= cfgCutMaxItsClusterSizeHe) { + histos.fill(HIST("histogram/cuts"), 12); + continue; + } } histos.fill(HIST("histogram/He/He-TPCsignVsTPCmomentum"), getRigidity(track) * track.sign(), @@ -622,10 +641,12 @@ struct TrHeAnalysis { float tRigidity = getRigidity(track); float tItsClusterSize = getMeanItsClsSize(track) / std::cosh(track.eta()); + bool tHasTof = track.hasTOF(); + int8_t tDetectorMap = track.detectorMap(); heData(tPt, tEta, tPhi, tCharge, tHeDeDx, tnSigmaTpc, tTofSignalHe, tDcaXY, tDcaZ, tSigmaYX, tSigmaXYZ, tSigmaZ, tnTpcCluster, tnItsCluster, tTpcChi2NCl, tItsChi2NCl, tRigidity, - tItsClusterSize); + tItsClusterSize, tHasTof, tDetectorMap); } } } From c395ce1eab8dde998e469203710a07d1c22f7919 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ku=C4=8Dera?= Date: Sun, 15 Jun 2025 20:22:55 +0200 Subject: [PATCH 1634/1650] [Infrastructure] Configure naming conventions in clang-tidy (#11616) --- .clang-tidy | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index da768906bcc..490b82a880b 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -1,3 +1,23 @@ CheckOptions: - - key: CheckPathRegex - value: '.*/O2/.*' + - { key: CheckPathRegex, value: ".*/O2/.*" } + # Naming conventions + - { key: readability-identifier-naming.ClassCase, value: CamelCase } + - { key: readability-identifier-naming.ClassMemberPrefix, value: m } + - { key: readability-identifier-naming.ConceptCase, value: CamelCase } + - { key: readability-identifier-naming.ConstexprVariableCase, value: CamelCase } + - { key: readability-identifier-naming.ConstexprVariableIgnoredRegexp, value: "^k[A-Z].*$" } # Allow "k" prefix. + - { key: readability-identifier-naming.EnumCase, value: CamelCase } + - { key: readability-identifier-naming.EnumConstantCase, value: CamelCase } + - { key: readability-identifier-naming.EnumConstantIgnoredRegexp, value: "^k[A-Z].*$" } # Allow "k" prefix. + - { key: readability-identifier-naming.FunctionCase, value: camelBack } + - { key: readability-identifier-naming.MacroDefinitionCase, value: UPPER_CASE } + - { key: readability-identifier-naming.MacroDefinitionIgnoredRegexp, value: "^[A-Z]+(_[A-Z]+)*_$" } # Allow the trailing underscore in header guards. + - { key: readability-identifier-naming.MemberCase, value: camelBack } + - { key: readability-identifier-naming.NamespaceCase, value: lower_case } + - { key: readability-identifier-naming.ParameterCase, value: camelBack } + - { key: readability-identifier-naming.StructCase, value: CamelCase } + - { key: readability-identifier-naming.TemplateParameterCase, value: CamelCase } + - { key: readability-identifier-naming.TypeAliasCase, value: CamelCase } + - { key: readability-identifier-naming.TypedefCase, value: CamelCase } + - { key: readability-identifier-naming.TypeTemplateParameterCase, value: CamelCase } + - { key: readability-identifier-naming.VariableCase, value: camelBack } From 51a9ebdae1fa3aaa2cf6cc2cb0bdab94c6a7dbd6 Mon Sep 17 00:00:00 2001 From: Anisa Khatun Date: Sun, 15 Jun 2025 20:52:38 +0200 Subject: [PATCH 1635/1650] [PWGUD] Fixing partition issue in udQC tasks (#11626) Co-authored-by: akhatun --- PWGUD/AQC/udQC.cxx | 4 +++- PWGUD/AQC/udQCmidRap.cxx | 12 +++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/PWGUD/AQC/udQC.cxx b/PWGUD/AQC/udQC.cxx index ddaf01338df..3da67d1f683 100644 --- a/PWGUD/AQC/udQC.cxx +++ b/PWGUD/AQC/udQC.cxx @@ -69,6 +69,8 @@ struct UDQC { using ATs = aod::AmbiguousTracks; using AFTs = aod::AmbiguousFwdTracks; + Partition goodTracks = requireGlobalTrackInFilter(); + void init(InitContext& context) { // initialize global variables @@ -220,7 +222,7 @@ struct UDQC { // vertex tracks normally gives PV contributors from collisions registry.get(HIST("collisions/vtxTracks"))->Fill(collision.numContrib()); // global tracks - Partition goodTracks = requireGlobalTrackInFilter(); + // Partition goodTracks = requireGlobalTrackInFilter(); goodTracks.bindTable(tracks); registry.get(HIST("collisions/globalTracks"))->Fill(goodTracks.size()); diff --git a/PWGUD/AQC/udQCmidRap.cxx b/PWGUD/AQC/udQCmidRap.cxx index e7178cfa042..acb35f21f57 100644 --- a/PWGUD/AQC/udQCmidRap.cxx +++ b/PWGUD/AQC/udQCmidRap.cxx @@ -64,6 +64,8 @@ struct UDQCmid { using ATs = aod::AmbiguousTracks; using AFTs = aod::AmbiguousFwdTracks; + Partition goodTracks = requireGlobalTrackInFilter(); + void init(InitContext& context) { // initialize global variables @@ -132,7 +134,7 @@ struct UDQCmid { } } - // ............................................................................................................................................... + //............................................................................................................................................... void processMain(CC const& collision, BCs const& bct0s, TCs const& tracks, FWs const& fwdtracks, ATs const& /*ambtracks*/, AFTs const& /*ambfwdtracks*/, aod::FT0s const& /*ft0s*/, aod::FV0As const& /*fv0as*/, aod::FDDs const& /*fdds*/, @@ -150,7 +152,7 @@ struct UDQCmid { // vertex tracks normally gives PV contributors from collisions registry.get(HIST("collisions/vtxTracks"))->Fill(collision.numContrib()); // global tracks - Partition goodTracks = requireGlobalTrackInFilter(); + goodTracks.bindTable(tracks); registry.get(HIST("collisions/globalTracks"))->Fill(goodTracks.size()); @@ -223,7 +225,7 @@ struct UDQCmid { registry.get(HIST("DG/hMassAll"))->Fill(ivm.M()); } } // coll - } // dgcand + } // dgcand // loop over all tracks float rgtrwTOF = 0.; @@ -322,7 +324,7 @@ struct UDQCmid { if (track.hasTOF()) { registry.get(HIST("DG/dEdxTOF"))->Fill(track.p() / track.sign(), track.beta()); } // fill TOF - } // pv contributor + } // pv contributor } } // Inavariant mass after FIT @@ -489,7 +491,7 @@ struct UDQCmid { // update #PV contributors in collisions with empty FT0 && FV0&& FDCC registry.get(HIST("fpPVC2"))->Fill(collision.numContrib(), 1.); } // fdd - } // fvo + } // fvo } // ft0 } From 6791c6ba45abadeb2bdcdb6a4960b694d7cfbcaf Mon Sep 17 00:00:00 2001 From: Francesco Mazzaschi <43742195+fmazzasc@users.noreply.github.com> Date: Sun, 15 Jun 2025 22:06:58 +0200 Subject: [PATCH 1636/1650] [Infrastructure] Update LF Codeowners (#11624) Co-authored-by: Francesco Mazzaschi --- CODEOWNERS | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index 3891598e0e8..6116f8c8a5b 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -41,13 +41,14 @@ /PWGHF @alibuild @vkucera @fcolamar @fgrosa @fcatalan92 @mfaggin @mmazzilli @deepathoms @NicoleBastid @hahassan7 @jpxrk @apalasciano @zhangbiao-phy @gluparel # PWG-LF /PWGLF @alibuild @sustripathy @skundu692 -/PWGLF/Tasks/GlobalEventProperties @alibuild @sustripathy @skundu692 @gbencedi @abmodak @omvazque +/PWGLF/DataModel @alibuild @sustripathy @skundu692 @gbencedi @abmodak @fmazzasc @maciacco @dmallick2 @smaff92 @ercolessi @romainschotter +/PWGLF/Tasks/GlobalEventProperties @alibuild @sustripathy @skundu692 @gbencedi @abmodak @omvazque /PWGLF/TableProducer/GlobalEventProperties @alibuild @sustripathy @skundu692 @gbencedi @abmodak @omvazque -/PWGLF/Tasks/Nuspex @alibuild @sustripathy @skundu692 @fmazzasc @chiarapinto @maciacco -/PWGLF/TableProducer/Nuspex @alibuild @sustripathy @skundu692 @fmazzasc @chiarapinto @maciacco -/PWGLF/Tasks/Resonances @alibuild @sustripathy @skundu692 @dmallick2 @smaff92 +/PWGLF/Tasks/Nuspex @alibuild @sustripathy @skundu692 @fmazzasc @maciacco +/PWGLF/TableProducer/Nuspex @alibuild @sustripathy @skundu692 @fmazzasc @maciacco +/PWGLF/Tasks/Resonances @alibuild @sustripathy @skundu692 @dmallick2 @smaff92 /PWGLF/TableProducer/Resonances @alibuild @sustripathy @skundu692 @dmallick2 @smaff92 -/PWGLF/Tasks/Strangeness @alibuild @sustripathy @skundu692 @ercolessi @romainschotter +/PWGLF/Tasks/Strangeness @alibuild @sustripathy @skundu692 @ercolessi @romainschotter /PWGLF/TableProducer/Strangeness @alibuild @sustripathy @skundu692 @ercolessi @romainschotter # PWG-MM From 034e8e390b8a947d76de06ced636b25235e5f874 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Tue, 21 Jan 2025 12:44:43 -0600 Subject: [PATCH 1637/1650] My first changes --- PWGUD/Tasks/CMakeLists.txt | 5 + PWGUD/Tasks/upcRhoFAnalysis.cxx | 294 ++++++++++++++++++++++++++++++++ 2 files changed, 299 insertions(+) create mode 100644 PWGUD/Tasks/upcRhoFAnalysis.cxx diff --git a/PWGUD/Tasks/CMakeLists.txt b/PWGUD/Tasks/CMakeLists.txt index d828261167c..5cfbb9a4b62 100644 --- a/PWGUD/Tasks/CMakeLists.txt +++ b/PWGUD/Tasks/CMakeLists.txt @@ -208,6 +208,11 @@ o2physics_add_dpl_workflow(upc-rho-analysis SOURCES upcRhoAnalysis.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGPIDSelector COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(upc-rho-f-analysis + SOURCES upcRhoFAnalysis.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGPIDSelector + COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(upc-rho-prime-analysis SOURCES upcRhoPrimeAnalysis.cxx diff --git a/PWGUD/Tasks/upcRhoFAnalysis.cxx b/PWGUD/Tasks/upcRhoFAnalysis.cxx new file mode 100644 index 00000000000..10ccee1de87 --- /dev/null +++ b/PWGUD/Tasks/upcRhoFAnalysis.cxx @@ -0,0 +1,294 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. +/// +/// \brief task for analysis of rho in UPCs using UD tables (from SG producer) +/// includes event tagging based on ZN information, track selection, reconstruction, +/// and also some basic stuff for decay phi anisotropy studies +/// \author Cesar, cesar.ramirez@cern.ch + +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/runDataProcessing.h" + +#include "Math/Vector4D.h" // similiar to TLorentzVector (which is now legacy apparently) +#include "random" + +#include "Common/DataModel/PIDResponse.h" + +#include "PWGUD/DataModel/UDTables.h" +#include "PWGUD/Core/UPCTauCentralBarrelHelperRL.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +using FullUDSgCollision = soa::Join::iterator; +using FullUDTracks = soa::Join; + + + +namespace o2::aod +{ +namespace fourpi +{ + + + +//for event +DECLARE_SOA_COLUMN(RunNumber, runNumber, int32_t); + +//for Rhos +DECLARE_SOA_COLUMN(M, m, double); +DECLARE_SOA_COLUMN(Pt, pt, double); +DECLARE_SOA_COLUMN(Eta, eta, double); +DECLARE_SOA_COLUMN(Phi, phi, double); + +//for vertex +DECLARE_SOA_COLUMN(PosX, posX, double); +DECLARE_SOA_COLUMN(PosY, posY, double); +DECLARE_SOA_COLUMN(PosZ, posZ, double); + +//for other +//DECLARE_SOA_COLUMN(TotalCharge, totalCharge, int); + +//for pion tracks +//DECLARE_SOA_COLUMN(TrackSign, trackSign, std::vector); +//DECLARE_SOA_COLUMN(TrackM, trackM, std::vector); +//DECLARE_SOA_COLUMN(TrackPt, trackPt, std::vector); +//DECLARE_SOA_COLUMN(TrackEta, trackEta, std::vector); +//DECLARE_SOA_COLUMN(TrackPhi, trackPhi, std::vector); + + + +} // namespace fourpi +DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", fourpi::RunNumber, fourpi::M, fourpi::Pt, fourpi::Eta, fourpi::Phi) + fourpi::PosX, fourpi::PosY, fourpi::PosZ); //, fourpi::TotalCharge); //fourpi::TrackSign, + //fourpi::TrackM, fourpi::TrackPt, fourpi::TrackEta, fourpi::TrackPhi); +} // namespace o2::aod + +struct upcRhoFAnalysis { + ProducessystemTree; + + double PcEtaCut = 0.9; // physics coordination recommendation + + Configurable specifyGapSide{"specifyGapSide", true, "specify gap side for SG/DG produced data"}; + Configurable gapSide{"gapSide", 2, "gap side for SG produced data"}; + Configurable requireTof{"requireTof", false, "require TOF signal"}; + + Configurable collisionsPosZMaxCut{"collisionsPosZMaxCut", 10.0, "max Z position cut on collisions"}; + Configurable ZNcommonEnergyCut{"ZNcommonEnergyCut", 0.0, "ZN common energy cut"}; + Configurable ZNtimeCut{"ZNtimeCut", 2.0, "ZN time cut"}; + + Configurable tracksTpcNSigmaPiCut{"tracksTpcNSigmaPiCut", 3.0, "TPC nSigma pion cut"}; + Configurable tracksDcaMaxCut{"tracksDcaMaxCut", 1.0, "max DCA cut on tracks"}; + + Configurable systemMassMinCut{"systemMassMinCut", 0.5, "min M cut for reco system"}; + Configurable systemMassMaxCut{"systemMassMaxCut", 1.2, "max M cut for reco system"}; + Configurable systemPtCut{"systemPtMaxCut", 0.1, "max pT cut for reco system"}; + Configurable systemYCut{"systemYCut", 0.9, "rapiditiy cut for reco system"}; + + ConfigurableAxis mAxis{"mAxis", {1000, 0.0, 10.0}, "m (GeV/#it{c}^{2})"}; + ConfigurableAxis mCutAxis{"mCutAxis", {70, 0.5, 1.2}, "m (GeV/#it{c}^{2})"}; + ConfigurableAxis ptAxis{"ptAxis", {1000, 0.0, 10.0}, "p_{T} (GeV/#it{c})"}; + ConfigurableAxis ptCutAxis{"ptCutAxis", {300, 0.0, 0.3}, "p_{T} (GeV/#it{c})"}; + ConfigurableAxis pt2Axis{"pt2Axis", {300, 0.0, 0.09}, "p_{T}^{2} (GeV^{2}/#it{c}^{2})"}; + ConfigurableAxis etaAxis{"etaAxis", {180, -0.9, 0.9}, "#eta"}; + ConfigurableAxis yAxis{"yAxis", {180, -0.9, 0.9}, "y"}; + ConfigurableAxis phiAxis{"phiAxis", {180, 0.0, o2::constants::math::TwoPI}, "#phi"}; + ConfigurableAxis phiAsymmAxis{"phiAsymmAxis", {182, -o2::constants::math::PI, o2::constants::math::PI}, "#phi"}; + ConfigurableAxis momentumFromPhiAxis{"momentumFromPhiAxis", {400, -0.1, 0.1}, "p (GeV/#it{c})"}; + ConfigurableAxis ptQuantileAxis{"ptQuantileAxis", {0, 0.0181689, 0.0263408, 0.0330488, 0.0390369, 0.045058, 0.0512604, 0.0582598, 0.066986, 0.0788085, 0.1}, "p_{T} (GeV/#it{c})"}; + + HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject}; + + void init(o2::framework::InitContext&) + { + // selection counter + std::vector selectionCounterLabels = {"all tracks", "PV contributor", "ITS + TPC hit", "TOF requirement", "DCA cut", "#eta cut", "2D TPC n#sigma_{#pi} cut"}; + + // 4PI SYSTEM + registry.add("4pi/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); + registry.add("4pi/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); + //registry.add("4pi/hEta", ";Eta (1);counts", kTH1D, {etaAxis}); + //registry.add("4pi/hPhi", ";Phi ();counts", kTH1D, {phiAxis}); + } + + template + bool collisionPassesCuts(const C& collision) // collision cuts + { + if (std::abs(collision.posZ()) > collisionsPosZMaxCut) + return false; + if (specifyGapSide && collision.gapSide() != gapSide) + return false; + return true; + } + + template + bool trackPassesCuts(const T& track) // track cuts (PID done separately) + { + if (!track.isPVContributor()) + return false; + //registry.fill(HIST("QC/tracks/hSelectionCounter"), 1); + if (!track.hasITS() || !track.hasTPC()) + return false; + //registry.fill(HIST("QC/tracks/hSelectionCounter"), 2); + if (requireTof && !track.hasTOF()) + return false; + //registry.fill(HIST("QC/tracks/hSelectionCounter"), 3); + if (std::abs(track.dcaZ()) > tracksDcaMaxCut || std::abs(track.dcaXY()) > (0.0182 + 0.0350 / std::pow(track.pt(), 1.01))) // Run 2 dynamic DCA cut + return false; + //registry.fill(HIST("QC/tracks/hSelectionCounter"), 4); + if (std::abs(eta(track.px(), track.py(), track.pz())) > PcEtaCut) + return false; + //registry.fill(HIST("QC/tracks/hSelectionCounter"), 5); + return true; + } + + template + bool tracksPassPiPID(const T& cutTracks) // n-dimensional PID cut + { + double radius = 0.0; + for (const auto& track : cutTracks) + radius += std::pow(track.tpcNSigmaPi(), 2); + return radius < std::pow(tracksTpcNSigmaPiCut, 2); + } + + template + double tracksTotalCharge(const T& cutTracks) // total charge of selected tracks + { + double charge = 0.0; + for (const auto& track : cutTracks) + charge += track.sign(); + return charge; + } + + bool systemPassCuts(const ROOT::Math::PxPyPzMVector& system) // system cuts + { + if (system.M() < systemMassMinCut || system.M() > systemMassMaxCut) + return false; + if (system.Pt() > systemPtCut) + return false; + if (std::abs(system.Rapidity()) > systemYCut) + return false; + return true; + } + + ROOT::Math::PxPyPzMVector reconstructSystem(const std::vector& cutTracks4Vecs) // reconstruct system from 4-vectors + { + ROOT::Math::PxPyPzMVector system; + for (const auto& track4Vec : cutTracks4Vecs) + system += track4Vec; + return system; + } + + double deltaPhi(const ROOT::Math::PxPyPzMVector& p1, const ROOT::Math::PxPyPzMVector& p2) + { + double dPhi = p1.Phi() - p2.Phi(); + if (dPhi > o2::constants::math::PI) + dPhi -= o2::constants::math::TwoPI; + else if (dPhi < -o2::constants::math::PI) + dPhi += o2::constants::math::TwoPI; + return dPhi; // calculate delta phi in (-pi, pi) + } + + double getPhiRandom(const std::vector& cutTracks4Vecs) // decay phi anisotropy + { // two possible definitions of phi: randomize the tracks + std::vector indices = {0, 1}; + unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); // get time-based seed + std::shuffle(indices.begin(), indices.end(), std::default_random_engine(seed)); // shuffle indices + // calculate phi + ROOT::Math::PxPyPzMVector pOne = cutTracks4Vecs[indices[0]]; + ROOT::Math::PxPyPzMVector pTwo = cutTracks4Vecs[indices[1]]; + ROOT::Math::PxPyPzMVector pPlus = pOne + pTwo; + ROOT::Math::PxPyPzMVector pMinus = pOne - pTwo; + return deltaPhi(pPlus, pMinus); + } + + template + double getPhiCharge(const T& cutTracks, const std::vector& cutTracks4Vecs) + { // two possible definitions of phi: charge-based assignment + ROOT::Math::PxPyPzMVector pOne, pTwo; + if (cutTracks[0].sign() > 0) { + pOne = cutTracks4Vecs[0]; + pTwo = cutTracks4Vecs[1]; + } else { + pOne = cutTracks4Vecs[1]; + pTwo = cutTracks4Vecs[0]; + } + ROOT::Math::PxPyPzMVector pPlus = pOne + pTwo; + ROOT::Math::PxPyPzMVector pMinus = pOne - pTwo; + return deltaPhi(pPlus, pMinus); + } + + void processReco(FullUDSgCollision const& collision, FullUDTracks const& tracks) + { + + + if (!collisionPassesCuts(collision)) + return; + + // event tagging + bool XnXn = false, OnOn = false, XnOn = false, OnXn = false; // note: On == 0n... + if (collision.energyCommonZNA() < ZNcommonEnergyCut && collision.energyCommonZNC() < ZNcommonEnergyCut) + OnOn = true; + if (collision.energyCommonZNA() > ZNcommonEnergyCut && std::abs(collision.timeZNA()) < ZNtimeCut && + collision.energyCommonZNC() > ZNcommonEnergyCut && std::abs(collision.timeZNC()) < ZNtimeCut) + XnXn = true; + if (collision.energyCommonZNA() > ZNcommonEnergyCut && std::abs(collision.timeZNA()) < ZNtimeCut && collision.energyCommonZNC() < ZNcommonEnergyCut) + XnOn = true; + if (collision.energyCommonZNA() < ZNcommonEnergyCut && collision.energyCommonZNC() > ZNcommonEnergyCut && std::abs(collision.timeZNC()) < ZNtimeCut) + OnXn = true; + // vectors for storing selected tracks and their 4-vectors + std::vector cutTracks; + std::vector cutTracks4Vecs; + + int trackCounter = 0; + for (const auto& track : tracks) { + + + if (!trackPassesCuts(track)) + continue; + trackCounter++; + cutTracks.push_back(track); + cutTracks4Vecs.push_back(ROOT::Math::PxPyPzMVector(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged)); // apriori assume pion mass + + } + + + if (!tracksPassPiPID(cutTracks)) + return; + // reonstruct system and calculate total charge, save commonly used values into variables + ROOT::Math::PxPyPzMVector system = reconstructSystem(cutTracks4Vecs); + int totalCharge = tracksTotalCharge(cutTracks); + int nTracks = cutTracks.size(); + double mass = system.M(); + double pT = system.Pt(); + double pTsquare = pT * pT; + double rapidity = system.Rapidity(); + double systemPhi = system.Phi() + o2::constants::math::PI; + + if (nTracks == 4 && tracksTotalCharge(cutTracks) == 0) { // 4pi system + systemTree(collision.runNumber(), mass, pT, rapidity, systemPhi, collision.posX(), collision.posY(), collision.posZ()); + registry.fill(HIST("4pi/hM"), mass); + registry.fill(HIST("4pi/hPt"), pT); + //registry.fill(HIST("4pi/hEta"), rapiditiy); + //registry.fill(HIST("4pi/hPhi"), system); + } + //std::cout<<"Hola Mundo"<(cfgc)}; +} \ No newline at end of file From ed4fd6905b7aa067065bd5abef75f96a0cff689a Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Tue, 18 Mar 2025 07:23:57 -0600 Subject: [PATCH 1638/1650] new variables --- PWGUD/Tasks/upcRhoPrimeAnalysis.cxx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx index d4048806854..97e9b5fac54 100644 --- a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx @@ -20,7 +20,7 @@ #include "Framework/runDataProcessing.h" #include "Math/Vector4D.h" // similiar to TLorentzVector (which is now legacy apparently) -#include +#include "random" #include "Common/DataModel/PIDResponse.h" @@ -31,7 +31,7 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; -using FullUDSgCollision = soa::Join::iterator; +using FullUDSgCollision = soa::Join::iterator; using FullUDTracks = soa::Join; namespace o2::aod @@ -87,6 +87,9 @@ DECLARE_SOA_COLUMN(TimeZNC, timeZNC, float); DECLARE_SOA_COLUMN(EnergyCommonZNA, energyCommonZNA, float); DECLARE_SOA_COLUMN(EnergyCommonZNC, energyCommonZNC, float); +DECLARE_SOA_COLUMN(OccupancyInTime, occupancyInTime, int); +DECLARE_SOA_COLUMN(HadronicRate, hadronicRate, double); + } // namespace fourpi DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", fourpi::RunNumber, fourpi::M, fourpi::Pt, fourpi::Eta, fourpi::Phi, @@ -94,7 +97,7 @@ DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", fourpi::RunNumber, fourpi::M, fourpi::TotalFDDAmplitudeA, fourpi::TotalFDDAmplitudeC, fourpi::TimeFT0A, fourpi::TimeFT0C, fourpi::TimeFV0A, fourpi::TimeFDDA, fourpi::TimeFDDC, fourpi::NumContrib, fourpi::Sign, fourpi::TrackPt, fourpi::TrackEta, fourpi::TrackPhi, fourpi::TPCNSigmaEl, fourpi::TPCNSigmaPi, fourpi::TPCNSigmaKa, fourpi::TPCNSigmaPr, fourpi::TrackID, fourpi::IsReconstructedWithUPC, - fourpi::TimeZNA, fourpi::TimeZNC, fourpi::EnergyCommonZNA, fourpi::EnergyCommonZNC); + fourpi::TimeZNA, fourpi::TimeZNC, fourpi::EnergyCommonZNA, fourpi::EnergyCommonZNC, fourpi::OccupancyInTime, fourpi::HadronicRate); } // namespace o2::aod struct upcRhoPrimeAnalysis { @@ -314,7 +317,8 @@ struct upcRhoPrimeAnalysis { collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.timeFV0A(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC(), collision.numContrib(), vSign, vTrackPt, vTrackEta, vTrackPhi, vTpcNSigmaEl, vTpcNSigmaPi, vTpcNSigmaKa, vTpcNSigmaPr, vTrackID, isReconstructedWithUPC, - collision.timeZNA(), collision.timeZNC(), collision.energyCommonZNA(), collision.energyCommonZNC()); + collision.timeZNA(), collision.timeZNC(), collision.energyCommonZNA(), collision.energyCommonZNC(), + collision.occupancyInTime(), collision.hadronicRate()); // registry.fill(HIST("4pi/hM"), mass); // registry.fill(HIST("4pi/hPt"), pT); From 3d277c3242d77f1593c688be4328c2d9546bcc94 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Fri, 7 Feb 2025 09:02:11 -0600 Subject: [PATCH 1639/1650] Rename the task and remove unused variables --- PWGUD/Tasks/.~lock.Media_781290_smxx.xlsx# | 1 + 1 file changed, 1 insertion(+) create mode 100644 PWGUD/Tasks/.~lock.Media_781290_smxx.xlsx# diff --git a/PWGUD/Tasks/.~lock.Media_781290_smxx.xlsx# b/PWGUD/Tasks/.~lock.Media_781290_smxx.xlsx# new file mode 100644 index 00000000000..3822d5a05e5 --- /dev/null +++ b/PWGUD/Tasks/.~lock.Media_781290_smxx.xlsx# @@ -0,0 +1 @@ +,cesaromar97,ceramire-1.dyndns.cern.ch,02.07.2025 16:53,file:///home/cesaromar97/.config/libreoffice/4; \ No newline at end of file From 4756bd77cd6bef3fe291bb30b84105373b9ffc8c Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Wed, 2 Jul 2025 19:46:09 +0200 Subject: [PATCH 1640/1650] Nuevos Cambios --- PWGUD/Tasks/upcRhoPrimeAnalysis.cxx | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx index 97e9b5fac54..48395c90ffe 100644 --- a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx @@ -86,9 +86,12 @@ DECLARE_SOA_COLUMN(TimeZNA, timeZNA, float); DECLARE_SOA_COLUMN(TimeZNC, timeZNC, float); DECLARE_SOA_COLUMN(EnergyCommonZNA, energyCommonZNA, float); DECLARE_SOA_COLUMN(EnergyCommonZNC, energyCommonZNC, float); +<<<<<<< HEAD DECLARE_SOA_COLUMN(OccupancyInTime, occupancyInTime, int); DECLARE_SOA_COLUMN(HadronicRate, hadronicRate, double); +======= +>>>>>>> 42f502b5c (new variables) } // namespace fourpi @@ -97,7 +100,11 @@ DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", fourpi::RunNumber, fourpi::M, fourpi::TotalFDDAmplitudeA, fourpi::TotalFDDAmplitudeC, fourpi::TimeFT0A, fourpi::TimeFT0C, fourpi::TimeFV0A, fourpi::TimeFDDA, fourpi::TimeFDDC, fourpi::NumContrib, fourpi::Sign, fourpi::TrackPt, fourpi::TrackEta, fourpi::TrackPhi, fourpi::TPCNSigmaEl, fourpi::TPCNSigmaPi, fourpi::TPCNSigmaKa, fourpi::TPCNSigmaPr, fourpi::TrackID, fourpi::IsReconstructedWithUPC, +<<<<<<< HEAD fourpi::TimeZNA, fourpi::TimeZNC, fourpi::EnergyCommonZNA, fourpi::EnergyCommonZNC, fourpi::OccupancyInTime, fourpi::HadronicRate); +======= + fourpi::TimeZNA, fourpi::TimeZNC, fourpi::EnergyCommonZNA, fourpi::EnergyCommonZNC); +>>>>>>> 42f502b5c (new variables) } // namespace o2::aod struct upcRhoPrimeAnalysis { @@ -283,6 +290,10 @@ struct upcRhoPrimeAnalysis { if (nTracks == 4 && tracksTotalCharge(cutTracks) == 0) { // 4pi system +<<<<<<< HEAD +======= + // Informacion de cada traza +>>>>>>> 42f502b5c (new variables) std::vector vTrackPt, vTrackEta, vTrackPhi; std::vector vSign, vTrackID; std::vector vTpcNSigmaEl, vTpcNSigmaPi, vTpcNSigmaKa, vTpcNSigmaPr; @@ -302,6 +313,10 @@ struct upcRhoPrimeAnalysis { vTpcNSigmaKa.push_back(cutTracks[i].tpcNSigmaKa()); vTpcNSigmaPr.push_back(cutTracks[i].tpcNSigmaPr()); +<<<<<<< HEAD +======= + // ID de la traza +>>>>>>> 42f502b5c (new variables) vTrackID.push_back(i); } @@ -317,8 +332,12 @@ struct upcRhoPrimeAnalysis { collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.timeFV0A(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC(), collision.numContrib(), vSign, vTrackPt, vTrackEta, vTrackPhi, vTpcNSigmaEl, vTpcNSigmaPi, vTpcNSigmaKa, vTpcNSigmaPr, vTrackID, isReconstructedWithUPC, +<<<<<<< HEAD collision.timeZNA(), collision.timeZNC(), collision.energyCommonZNA(), collision.energyCommonZNC(), collision.occupancyInTime(), collision.hadronicRate()); +======= + collision.timeZNA(), collision.timeZNC(), collision.energyCommonZNA(), collision.energyCommonZNC()); +>>>>>>> 42f502b5c (new variables) // registry.fill(HIST("4pi/hM"), mass); // registry.fill(HIST("4pi/hPt"), pT); @@ -334,4 +353,4 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ o2::framework::adaptAnalysisTask(cfgc)}; -} +} \ No newline at end of file From c34d32dffb5f5b86c13da4a9f11bb5c2f4796d39 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Tue, 18 Mar 2025 07:38:08 -0600 Subject: [PATCH 1641/1650] new variables --- PWGUD/Tasks/upcRhoPrimeAnalysis.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx index 48395c90ffe..1d5a2fe398b 100644 --- a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx @@ -353,4 +353,4 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ o2::framework::adaptAnalysisTask(cfgc)}; -} \ No newline at end of file +} From 8270cd63d7f0ef926de3a55104f6c16b2e0b03ee Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Wed, 2 Jul 2025 19:50:22 +0200 Subject: [PATCH 1642/1650] Nuevos Cambios --- PWGUD/Tasks/upcRhoPrimeAnalysis.cxx | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx index 1d5a2fe398b..2197440936a 100644 --- a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx @@ -86,12 +86,9 @@ DECLARE_SOA_COLUMN(TimeZNA, timeZNA, float); DECLARE_SOA_COLUMN(TimeZNC, timeZNC, float); DECLARE_SOA_COLUMN(EnergyCommonZNA, energyCommonZNA, float); DECLARE_SOA_COLUMN(EnergyCommonZNC, energyCommonZNC, float); -<<<<<<< HEAD DECLARE_SOA_COLUMN(OccupancyInTime, occupancyInTime, int); DECLARE_SOA_COLUMN(HadronicRate, hadronicRate, double); -======= ->>>>>>> 42f502b5c (new variables) } // namespace fourpi @@ -100,11 +97,7 @@ DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", fourpi::RunNumber, fourpi::M, fourpi::TotalFDDAmplitudeA, fourpi::TotalFDDAmplitudeC, fourpi::TimeFT0A, fourpi::TimeFT0C, fourpi::TimeFV0A, fourpi::TimeFDDA, fourpi::TimeFDDC, fourpi::NumContrib, fourpi::Sign, fourpi::TrackPt, fourpi::TrackEta, fourpi::TrackPhi, fourpi::TPCNSigmaEl, fourpi::TPCNSigmaPi, fourpi::TPCNSigmaKa, fourpi::TPCNSigmaPr, fourpi::TrackID, fourpi::IsReconstructedWithUPC, -<<<<<<< HEAD fourpi::TimeZNA, fourpi::TimeZNC, fourpi::EnergyCommonZNA, fourpi::EnergyCommonZNC, fourpi::OccupancyInTime, fourpi::HadronicRate); -======= - fourpi::TimeZNA, fourpi::TimeZNC, fourpi::EnergyCommonZNA, fourpi::EnergyCommonZNC); ->>>>>>> 42f502b5c (new variables) } // namespace o2::aod struct upcRhoPrimeAnalysis { @@ -290,10 +283,8 @@ struct upcRhoPrimeAnalysis { if (nTracks == 4 && tracksTotalCharge(cutTracks) == 0) { // 4pi system -<<<<<<< HEAD -======= + // Informacion de cada traza ->>>>>>> 42f502b5c (new variables) std::vector vTrackPt, vTrackEta, vTrackPhi; std::vector vSign, vTrackID; std::vector vTpcNSigmaEl, vTpcNSigmaPi, vTpcNSigmaKa, vTpcNSigmaPr; @@ -313,10 +304,7 @@ struct upcRhoPrimeAnalysis { vTpcNSigmaKa.push_back(cutTracks[i].tpcNSigmaKa()); vTpcNSigmaPr.push_back(cutTracks[i].tpcNSigmaPr()); -<<<<<<< HEAD -======= // ID de la traza ->>>>>>> 42f502b5c (new variables) vTrackID.push_back(i); } @@ -332,12 +320,8 @@ struct upcRhoPrimeAnalysis { collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.timeFV0A(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC(), collision.numContrib(), vSign, vTrackPt, vTrackEta, vTrackPhi, vTpcNSigmaEl, vTpcNSigmaPi, vTpcNSigmaKa, vTpcNSigmaPr, vTrackID, isReconstructedWithUPC, -<<<<<<< HEAD collision.timeZNA(), collision.timeZNC(), collision.energyCommonZNA(), collision.energyCommonZNC(), collision.occupancyInTime(), collision.hadronicRate()); -======= - collision.timeZNA(), collision.timeZNC(), collision.energyCommonZNA(), collision.energyCommonZNC()); ->>>>>>> 42f502b5c (new variables) // registry.fill(HIST("4pi/hM"), mass); // registry.fill(HIST("4pi/hPt"), pT); From 8aeff92be6bc40cce166d915af4e8cb9f003d6d3 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Wed, 2 Jul 2025 20:04:53 +0200 Subject: [PATCH 1643/1650] Nuevos Cambios --- PWGUD/Tasks/CMakeLists.txt | 15 -- PWGUD/Tasks/upcRhoFAnalysis.cxx | 294 ---------------------------- PWGUD/Tasks/upcRhoPrimeAnalysis.cxx | 3 - 3 files changed, 312 deletions(-) delete mode 100644 PWGUD/Tasks/upcRhoFAnalysis.cxx diff --git a/PWGUD/Tasks/CMakeLists.txt b/PWGUD/Tasks/CMakeLists.txt index 3395e19536e..d828261167c 100644 --- a/PWGUD/Tasks/CMakeLists.txt +++ b/PWGUD/Tasks/CMakeLists.txt @@ -208,21 +208,6 @@ o2physics_add_dpl_workflow(upc-rho-analysis SOURCES upcRhoAnalysis.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGPIDSelector COMPONENT_NAME Analysis) - -o2physics_add_dpl_workflow(upc-rho-f-analysis - SOURCES upcRhoFAnalysis.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGPIDSelector - COMPONENT_NAME Analysis) - -o2physics_add_dpl_workflow(upc-rho-prime-analysis - SOURCES upcRhoPrimeAnalysis.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGPIDSelector - COMPONENT_NAME Analysis) - -o2physics_add_dpl_workflow(upc-rho-prime-analysis - SOURCES upcRhoPrimeAnalysis.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGPIDSelector - COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(upc-rho-prime-analysis SOURCES upcRhoPrimeAnalysis.cxx diff --git a/PWGUD/Tasks/upcRhoFAnalysis.cxx b/PWGUD/Tasks/upcRhoFAnalysis.cxx deleted file mode 100644 index 10ccee1de87..00000000000 --- a/PWGUD/Tasks/upcRhoFAnalysis.cxx +++ /dev/null @@ -1,294 +0,0 @@ -// Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. -// All rights not expressly granted are reserved. -// -// This software is distributed under the terms of the GNU General Public -// License v3 (GPL Version 3), copied verbatim in the file "COPYING". -// -// In applying this license CERN does not waive the privileges and immunities -// granted to it by virtue of its status as an Intergovernmental Organization -// or submit itself to any jurisdiction. -/// -/// \brief task for analysis of rho in UPCs using UD tables (from SG producer) -/// includes event tagging based on ZN information, track selection, reconstruction, -/// and also some basic stuff for decay phi anisotropy studies -/// \author Cesar, cesar.ramirez@cern.ch - -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/runDataProcessing.h" - -#include "Math/Vector4D.h" // similiar to TLorentzVector (which is now legacy apparently) -#include "random" - -#include "Common/DataModel/PIDResponse.h" - -#include "PWGUD/DataModel/UDTables.h" -#include "PWGUD/Core/UPCTauCentralBarrelHelperRL.h" - -using namespace o2; -using namespace o2::framework; -using namespace o2::framework::expressions; - -using FullUDSgCollision = soa::Join::iterator; -using FullUDTracks = soa::Join; - - - -namespace o2::aod -{ -namespace fourpi -{ - - - -//for event -DECLARE_SOA_COLUMN(RunNumber, runNumber, int32_t); - -//for Rhos -DECLARE_SOA_COLUMN(M, m, double); -DECLARE_SOA_COLUMN(Pt, pt, double); -DECLARE_SOA_COLUMN(Eta, eta, double); -DECLARE_SOA_COLUMN(Phi, phi, double); - -//for vertex -DECLARE_SOA_COLUMN(PosX, posX, double); -DECLARE_SOA_COLUMN(PosY, posY, double); -DECLARE_SOA_COLUMN(PosZ, posZ, double); - -//for other -//DECLARE_SOA_COLUMN(TotalCharge, totalCharge, int); - -//for pion tracks -//DECLARE_SOA_COLUMN(TrackSign, trackSign, std::vector); -//DECLARE_SOA_COLUMN(TrackM, trackM, std::vector); -//DECLARE_SOA_COLUMN(TrackPt, trackPt, std::vector); -//DECLARE_SOA_COLUMN(TrackEta, trackEta, std::vector); -//DECLARE_SOA_COLUMN(TrackPhi, trackPhi, std::vector); - - - -} // namespace fourpi -DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", fourpi::RunNumber, fourpi::M, fourpi::Pt, fourpi::Eta, fourpi::Phi) - fourpi::PosX, fourpi::PosY, fourpi::PosZ); //, fourpi::TotalCharge); //fourpi::TrackSign, - //fourpi::TrackM, fourpi::TrackPt, fourpi::TrackEta, fourpi::TrackPhi); -} // namespace o2::aod - -struct upcRhoFAnalysis { - ProducessystemTree; - - double PcEtaCut = 0.9; // physics coordination recommendation - - Configurable specifyGapSide{"specifyGapSide", true, "specify gap side for SG/DG produced data"}; - Configurable gapSide{"gapSide", 2, "gap side for SG produced data"}; - Configurable requireTof{"requireTof", false, "require TOF signal"}; - - Configurable collisionsPosZMaxCut{"collisionsPosZMaxCut", 10.0, "max Z position cut on collisions"}; - Configurable ZNcommonEnergyCut{"ZNcommonEnergyCut", 0.0, "ZN common energy cut"}; - Configurable ZNtimeCut{"ZNtimeCut", 2.0, "ZN time cut"}; - - Configurable tracksTpcNSigmaPiCut{"tracksTpcNSigmaPiCut", 3.0, "TPC nSigma pion cut"}; - Configurable tracksDcaMaxCut{"tracksDcaMaxCut", 1.0, "max DCA cut on tracks"}; - - Configurable systemMassMinCut{"systemMassMinCut", 0.5, "min M cut for reco system"}; - Configurable systemMassMaxCut{"systemMassMaxCut", 1.2, "max M cut for reco system"}; - Configurable systemPtCut{"systemPtMaxCut", 0.1, "max pT cut for reco system"}; - Configurable systemYCut{"systemYCut", 0.9, "rapiditiy cut for reco system"}; - - ConfigurableAxis mAxis{"mAxis", {1000, 0.0, 10.0}, "m (GeV/#it{c}^{2})"}; - ConfigurableAxis mCutAxis{"mCutAxis", {70, 0.5, 1.2}, "m (GeV/#it{c}^{2})"}; - ConfigurableAxis ptAxis{"ptAxis", {1000, 0.0, 10.0}, "p_{T} (GeV/#it{c})"}; - ConfigurableAxis ptCutAxis{"ptCutAxis", {300, 0.0, 0.3}, "p_{T} (GeV/#it{c})"}; - ConfigurableAxis pt2Axis{"pt2Axis", {300, 0.0, 0.09}, "p_{T}^{2} (GeV^{2}/#it{c}^{2})"}; - ConfigurableAxis etaAxis{"etaAxis", {180, -0.9, 0.9}, "#eta"}; - ConfigurableAxis yAxis{"yAxis", {180, -0.9, 0.9}, "y"}; - ConfigurableAxis phiAxis{"phiAxis", {180, 0.0, o2::constants::math::TwoPI}, "#phi"}; - ConfigurableAxis phiAsymmAxis{"phiAsymmAxis", {182, -o2::constants::math::PI, o2::constants::math::PI}, "#phi"}; - ConfigurableAxis momentumFromPhiAxis{"momentumFromPhiAxis", {400, -0.1, 0.1}, "p (GeV/#it{c})"}; - ConfigurableAxis ptQuantileAxis{"ptQuantileAxis", {0, 0.0181689, 0.0263408, 0.0330488, 0.0390369, 0.045058, 0.0512604, 0.0582598, 0.066986, 0.0788085, 0.1}, "p_{T} (GeV/#it{c})"}; - - HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject}; - - void init(o2::framework::InitContext&) - { - // selection counter - std::vector selectionCounterLabels = {"all tracks", "PV contributor", "ITS + TPC hit", "TOF requirement", "DCA cut", "#eta cut", "2D TPC n#sigma_{#pi} cut"}; - - // 4PI SYSTEM - registry.add("4pi/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); - registry.add("4pi/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - //registry.add("4pi/hEta", ";Eta (1);counts", kTH1D, {etaAxis}); - //registry.add("4pi/hPhi", ";Phi ();counts", kTH1D, {phiAxis}); - } - - template - bool collisionPassesCuts(const C& collision) // collision cuts - { - if (std::abs(collision.posZ()) > collisionsPosZMaxCut) - return false; - if (specifyGapSide && collision.gapSide() != gapSide) - return false; - return true; - } - - template - bool trackPassesCuts(const T& track) // track cuts (PID done separately) - { - if (!track.isPVContributor()) - return false; - //registry.fill(HIST("QC/tracks/hSelectionCounter"), 1); - if (!track.hasITS() || !track.hasTPC()) - return false; - //registry.fill(HIST("QC/tracks/hSelectionCounter"), 2); - if (requireTof && !track.hasTOF()) - return false; - //registry.fill(HIST("QC/tracks/hSelectionCounter"), 3); - if (std::abs(track.dcaZ()) > tracksDcaMaxCut || std::abs(track.dcaXY()) > (0.0182 + 0.0350 / std::pow(track.pt(), 1.01))) // Run 2 dynamic DCA cut - return false; - //registry.fill(HIST("QC/tracks/hSelectionCounter"), 4); - if (std::abs(eta(track.px(), track.py(), track.pz())) > PcEtaCut) - return false; - //registry.fill(HIST("QC/tracks/hSelectionCounter"), 5); - return true; - } - - template - bool tracksPassPiPID(const T& cutTracks) // n-dimensional PID cut - { - double radius = 0.0; - for (const auto& track : cutTracks) - radius += std::pow(track.tpcNSigmaPi(), 2); - return radius < std::pow(tracksTpcNSigmaPiCut, 2); - } - - template - double tracksTotalCharge(const T& cutTracks) // total charge of selected tracks - { - double charge = 0.0; - for (const auto& track : cutTracks) - charge += track.sign(); - return charge; - } - - bool systemPassCuts(const ROOT::Math::PxPyPzMVector& system) // system cuts - { - if (system.M() < systemMassMinCut || system.M() > systemMassMaxCut) - return false; - if (system.Pt() > systemPtCut) - return false; - if (std::abs(system.Rapidity()) > systemYCut) - return false; - return true; - } - - ROOT::Math::PxPyPzMVector reconstructSystem(const std::vector& cutTracks4Vecs) // reconstruct system from 4-vectors - { - ROOT::Math::PxPyPzMVector system; - for (const auto& track4Vec : cutTracks4Vecs) - system += track4Vec; - return system; - } - - double deltaPhi(const ROOT::Math::PxPyPzMVector& p1, const ROOT::Math::PxPyPzMVector& p2) - { - double dPhi = p1.Phi() - p2.Phi(); - if (dPhi > o2::constants::math::PI) - dPhi -= o2::constants::math::TwoPI; - else if (dPhi < -o2::constants::math::PI) - dPhi += o2::constants::math::TwoPI; - return dPhi; // calculate delta phi in (-pi, pi) - } - - double getPhiRandom(const std::vector& cutTracks4Vecs) // decay phi anisotropy - { // two possible definitions of phi: randomize the tracks - std::vector indices = {0, 1}; - unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); // get time-based seed - std::shuffle(indices.begin(), indices.end(), std::default_random_engine(seed)); // shuffle indices - // calculate phi - ROOT::Math::PxPyPzMVector pOne = cutTracks4Vecs[indices[0]]; - ROOT::Math::PxPyPzMVector pTwo = cutTracks4Vecs[indices[1]]; - ROOT::Math::PxPyPzMVector pPlus = pOne + pTwo; - ROOT::Math::PxPyPzMVector pMinus = pOne - pTwo; - return deltaPhi(pPlus, pMinus); - } - - template - double getPhiCharge(const T& cutTracks, const std::vector& cutTracks4Vecs) - { // two possible definitions of phi: charge-based assignment - ROOT::Math::PxPyPzMVector pOne, pTwo; - if (cutTracks[0].sign() > 0) { - pOne = cutTracks4Vecs[0]; - pTwo = cutTracks4Vecs[1]; - } else { - pOne = cutTracks4Vecs[1]; - pTwo = cutTracks4Vecs[0]; - } - ROOT::Math::PxPyPzMVector pPlus = pOne + pTwo; - ROOT::Math::PxPyPzMVector pMinus = pOne - pTwo; - return deltaPhi(pPlus, pMinus); - } - - void processReco(FullUDSgCollision const& collision, FullUDTracks const& tracks) - { - - - if (!collisionPassesCuts(collision)) - return; - - // event tagging - bool XnXn = false, OnOn = false, XnOn = false, OnXn = false; // note: On == 0n... - if (collision.energyCommonZNA() < ZNcommonEnergyCut && collision.energyCommonZNC() < ZNcommonEnergyCut) - OnOn = true; - if (collision.energyCommonZNA() > ZNcommonEnergyCut && std::abs(collision.timeZNA()) < ZNtimeCut && - collision.energyCommonZNC() > ZNcommonEnergyCut && std::abs(collision.timeZNC()) < ZNtimeCut) - XnXn = true; - if (collision.energyCommonZNA() > ZNcommonEnergyCut && std::abs(collision.timeZNA()) < ZNtimeCut && collision.energyCommonZNC() < ZNcommonEnergyCut) - XnOn = true; - if (collision.energyCommonZNA() < ZNcommonEnergyCut && collision.energyCommonZNC() > ZNcommonEnergyCut && std::abs(collision.timeZNC()) < ZNtimeCut) - OnXn = true; - // vectors for storing selected tracks and their 4-vectors - std::vector cutTracks; - std::vector cutTracks4Vecs; - - int trackCounter = 0; - for (const auto& track : tracks) { - - - if (!trackPassesCuts(track)) - continue; - trackCounter++; - cutTracks.push_back(track); - cutTracks4Vecs.push_back(ROOT::Math::PxPyPzMVector(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged)); // apriori assume pion mass - - } - - - if (!tracksPassPiPID(cutTracks)) - return; - // reonstruct system and calculate total charge, save commonly used values into variables - ROOT::Math::PxPyPzMVector system = reconstructSystem(cutTracks4Vecs); - int totalCharge = tracksTotalCharge(cutTracks); - int nTracks = cutTracks.size(); - double mass = system.M(); - double pT = system.Pt(); - double pTsquare = pT * pT; - double rapidity = system.Rapidity(); - double systemPhi = system.Phi() + o2::constants::math::PI; - - if (nTracks == 4 && tracksTotalCharge(cutTracks) == 0) { // 4pi system - systemTree(collision.runNumber(), mass, pT, rapidity, systemPhi, collision.posX(), collision.posY(), collision.posZ()); - registry.fill(HIST("4pi/hM"), mass); - registry.fill(HIST("4pi/hPt"), pT); - //registry.fill(HIST("4pi/hEta"), rapiditiy); - //registry.fill(HIST("4pi/hPhi"), system); - } - //std::cout<<"Hola Mundo"<(cfgc)}; -} \ No newline at end of file diff --git a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx index 2197440936a..97e9b5fac54 100644 --- a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx @@ -283,8 +283,6 @@ struct upcRhoPrimeAnalysis { if (nTracks == 4 && tracksTotalCharge(cutTracks) == 0) { // 4pi system - - // Informacion de cada traza std::vector vTrackPt, vTrackEta, vTrackPhi; std::vector vSign, vTrackID; std::vector vTpcNSigmaEl, vTpcNSigmaPi, vTpcNSigmaKa, vTpcNSigmaPr; @@ -304,7 +302,6 @@ struct upcRhoPrimeAnalysis { vTpcNSigmaKa.push_back(cutTracks[i].tpcNSigmaKa()); vTpcNSigmaPr.push_back(cutTracks[i].tpcNSigmaPr()); - // ID de la traza vTrackID.push_back(i); } From dc83153c2bcf6a2248afb10fbdb7047545613cf6 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Tue, 29 Jul 2025 10:50:10 +0200 Subject: [PATCH 1644/1650] Total charge distinction --- PWGUD/Tasks/upcRhoPrimeAnalysis.cxx | 51 +++++++++++++++-------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx index 97e9b5fac54..49b6e478674 100644 --- a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx @@ -12,26 +12,26 @@ /// \brief Task for analysis of rho' in UPCs using UD tables (from SG producer). /// \author Cesar Ramirez, cesar.ramirez@cern.ch -#include // Para std::string -#include // Para std::vector +#include "PWGUD/Core/UPCTauCentralBarrelHelperRL.h" +#include "PWGUD/DataModel/UDTables.h" + +#include "Common/DataModel/PIDResponse.h" -#include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" #include "Math/Vector4D.h" // similiar to TLorentzVector (which is now legacy apparently) -#include "random" -#include "Common/DataModel/PIDResponse.h" - -#include "PWGUD/DataModel/UDTables.h" -#include "PWGUD/Core/UPCTauCentralBarrelHelperRL.h" +#include "random" +#include // Para std::string +#include // Para std::vector using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; -using FullUDSgCollision = soa::Join::iterator; +using FullUDSgCollision = soa::Join::iterator; using FullUDTracks = soa::Join; namespace o2::aod @@ -86,6 +86,7 @@ DECLARE_SOA_COLUMN(TimeZNA, timeZNA, float); DECLARE_SOA_COLUMN(TimeZNC, timeZNC, float); DECLARE_SOA_COLUMN(EnergyCommonZNA, energyCommonZNA, float); DECLARE_SOA_COLUMN(EnergyCommonZNC, energyCommonZNC, float); +DECLARE_SOA_COLUMN(IsChargeZero, isChargeZero, bool); DECLARE_SOA_COLUMN(OccupancyInTime, occupancyInTime, int); DECLARE_SOA_COLUMN(HadronicRate, hadronicRate, double); @@ -97,7 +98,7 @@ DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", fourpi::RunNumber, fourpi::M, fourpi::TotalFDDAmplitudeA, fourpi::TotalFDDAmplitudeC, fourpi::TimeFT0A, fourpi::TimeFT0C, fourpi::TimeFV0A, fourpi::TimeFDDA, fourpi::TimeFDDC, fourpi::NumContrib, fourpi::Sign, fourpi::TrackPt, fourpi::TrackEta, fourpi::TrackPhi, fourpi::TPCNSigmaEl, fourpi::TPCNSigmaPi, fourpi::TPCNSigmaKa, fourpi::TPCNSigmaPr, fourpi::TrackID, fourpi::IsReconstructedWithUPC, - fourpi::TimeZNA, fourpi::TimeZNC, fourpi::EnergyCommonZNA, fourpi::EnergyCommonZNC, fourpi::OccupancyInTime, fourpi::HadronicRate); + fourpi::TimeZNA, fourpi::TimeZNC, fourpi::EnergyCommonZNA, fourpi::EnergyCommonZNC, fourpi::IsChargeZero, fourpi::OccupancyInTime, fourpi::HadronicRate); } // namespace o2::aod struct upcRhoPrimeAnalysis { @@ -116,8 +117,8 @@ struct upcRhoPrimeAnalysis { Configurable tracksTpcNSigmaPiCut{"tracksTpcNSigmaPiCut", 3.0, "TPC nSigma pion cut"}; Configurable tracksDcaMaxCut{"tracksDcaMaxCut", 1.0, "max DCA cut on tracks"}; - Configurable systemMassMinCut{"systemMassMinCut", 0.5, "min M cut for reco system"}; - Configurable systemMassMaxCut{"systemMassMaxCut", 1.2, "max M cut for reco system"}; + Configurable systemMassMinCut{"systemMassMinCut", 0.8, "min M cut for reco system"}; + Configurable systemMassMaxCut{"systemMassMaxCut", 2.2, "max M cut for reco system"}; Configurable systemPtCut{"systemPtMaxCut", 0.1, "max pT cut for reco system"}; Configurable systemYCut{"systemYCut", 0.9, "rapiditiy cut for reco system"}; @@ -281,14 +282,14 @@ struct upcRhoPrimeAnalysis { double rapidity = system.Rapidity(); double systemPhi = system.Phi() + o2::constants::math::PI; - if (nTracks == 4 && tracksTotalCharge(cutTracks) == 0) { // 4pi system + if (nTracks == 4) { + bool isChargeZero = (tracksTotalCharge(cutTracks) == 0); std::vector vTrackPt, vTrackEta, vTrackPhi; std::vector vSign, vTrackID; std::vector vTpcNSigmaEl, vTpcNSigmaPi, vTpcNSigmaKa, vTpcNSigmaPr; for (size_t i = 0; i < cutTracks.size(); i++) { - double tPt = cutTracks[i].pt(); double tEta = eta(cutTracks[i].px(), cutTracks[i].py(), cutTracks[i].pz()); double tPhi = phi(cutTracks[i].px(), cutTracks[i].py()); @@ -313,17 +314,17 @@ struct upcRhoPrimeAnalysis { isReconstructedWithUPC = false; } - systemTree(collision.runNumber(), mass, pT, rapidity, systemPhi, collision.posX(), collision.posY(), collision.posZ(), totalCharge, - collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.timeFV0A(), collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), - collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), collision.timeFDDA(), collision.timeFDDC(), - collision.numContrib(), vSign, vTrackPt, vTrackEta, vTrackPhi, vTpcNSigmaEl, vTpcNSigmaPi, vTpcNSigmaKa, vTpcNSigmaPr, vTrackID, isReconstructedWithUPC, - collision.timeZNA(), collision.timeZNC(), collision.energyCommonZNA(), collision.energyCommonZNC(), - collision.occupancyInTime(), collision.hadronicRate()); - - // registry.fill(HIST("4pi/hM"), mass); - // registry.fill(HIST("4pi/hPt"), pT); - // registry.fill(HIST("4pi/hEta"), rapiditiy); - // registry.fill(HIST("4pi/hPhi"), system); + systemTree(collision.runNumber(), mass, pT, rapidity, systemPhi, + collision.posX(), collision.posY(), collision.posZ(), totalCharge, + collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.timeFV0A(), + collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), + collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), + collision.timeFDDA(), collision.timeFDDC(), collision.numContrib(), + vSign, vTrackPt, vTrackEta, vTrackPhi, + vTpcNSigmaEl, vTpcNSigmaPi, vTpcNSigmaKa, vTpcNSigmaPr, + vTrackID, isReconstructedWithUPC, collision.timeZNA(), collision.timeZNC(), + collision.energyCommonZNA(), collision.energyCommonZNC(), + isChargeZero, collision.occupancyInTime(), collision.hadronicRate()); } // std::cout<<"Hello World"< Date: Tue, 29 Jul 2025 11:35:10 +0200 Subject: [PATCH 1645/1650] Total charge distinction --- PWGUD/Tasks/.~lock.Media_781290_smxx.xlsx# | 1 - 1 file changed, 1 deletion(-) delete mode 100644 PWGUD/Tasks/.~lock.Media_781290_smxx.xlsx# diff --git a/PWGUD/Tasks/.~lock.Media_781290_smxx.xlsx# b/PWGUD/Tasks/.~lock.Media_781290_smxx.xlsx# deleted file mode 100644 index 3822d5a05e5..00000000000 --- a/PWGUD/Tasks/.~lock.Media_781290_smxx.xlsx# +++ /dev/null @@ -1 +0,0 @@ -,cesaromar97,ceramire-1.dyndns.cern.ch,02.07.2025 16:53,file:///home/cesaromar97/.config/libreoffice/4; \ No newline at end of file From eeb1c7980e088120e6f45b9d7612f4bde35ee5f5 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Mon, 11 Aug 2025 10:34:44 +0200 Subject: [PATCH 1646/1650] Apply new cuts --- PWGUD/Tasks/upcRhoPrimeAnalysis.cxx | 672 ++++++++++++++++------------ 1 file changed, 376 insertions(+), 296 deletions(-) diff --git a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx index 49b6e478674..eb150f4869d 100644 --- a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx @@ -14,325 +14,405 @@ #include "PWGUD/Core/UPCTauCentralBarrelHelperRL.h" #include "PWGUD/DataModel/UDTables.h" - #include "Common/DataModel/PIDResponse.h" - #include "Framework/AnalysisDataModel.h" #include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" - -#include "Math/Vector4D.h" // similiar to TLorentzVector (which is now legacy apparently) - +#include "Math/Vector4D.h" #include "random" -#include // Para std::string -#include // Para std::vector +#include "TH1F.h" +#include "TH2F.h" +#include +#include +#include using namespace o2; using namespace o2::framework; -using namespace o2::framework::expressions; -using FullUDSgCollision = soa::Join::iterator; -using FullUDTracks = soa::Join; +// Define UD tables +using UDtracks = soa::Join; +using UDCollisions = soa::Join; namespace o2::aod { namespace fourpi { - -// for event -DECLARE_SOA_COLUMN(RunNumber, runNumber, int32_t); - -// for rho prime -DECLARE_SOA_COLUMN(M, m, double); -DECLARE_SOA_COLUMN(Pt, pt, double); -DECLARE_SOA_COLUMN(Eta, eta, double); -DECLARE_SOA_COLUMN(Phi, phi, double); - -// for vertex -DECLARE_SOA_COLUMN(PosX, posX, double); -DECLARE_SOA_COLUMN(PosY, posY, double); -DECLARE_SOA_COLUMN(PosZ, posZ, double); - -// for other -DECLARE_SOA_COLUMN(TotalCharge, totalCharge, int); - -// info detec -DECLARE_SOA_COLUMN(TotalFT0AmplitudeA, totalFT0AmplitudeA, float); -DECLARE_SOA_COLUMN(TotalFT0AmplitudeC, totalFT0AmplitudeC, float); -DECLARE_SOA_COLUMN(TotalFV0AmplitudeA, totalFV0AmplitudeA, float); -DECLARE_SOA_COLUMN(TotalFDDAmplitudeA, totalFDDAmplitudeA, float); -DECLARE_SOA_COLUMN(TotalFDDAmplitudeC, totalFDDAmplitudeC, float); -DECLARE_SOA_COLUMN(TimeFT0A, timeFT0A, float); -DECLARE_SOA_COLUMN(TimeFT0C, timeFT0C, float); -DECLARE_SOA_COLUMN(TimeFV0A, timeFV0A, float); -DECLARE_SOA_COLUMN(TimeFDDA, timeFDDA, float); -DECLARE_SOA_COLUMN(TimeFDDC, timeFDDC, float); - -// for pion tracks -DECLARE_SOA_COLUMN(NumContrib, numContrib, int32_t); -DECLARE_SOA_COLUMN(Sign, sign, std::vector); -DECLARE_SOA_COLUMN(TrackPt, trackPt, std::vector); -DECLARE_SOA_COLUMN(TrackEta, trackEta, std::vector); -DECLARE_SOA_COLUMN(TrackPhi, trackPhi, std::vector); -DECLARE_SOA_COLUMN(TPCNSigmaEl, tpcNSigmaEl, std::vector); -DECLARE_SOA_COLUMN(TPCNSigmaPi, tpcNSigmaPi, std::vector); -DECLARE_SOA_COLUMN(TPCNSigmaKa, tpcNSigmaKa, std::vector); -DECLARE_SOA_COLUMN(TPCNSigmaPr, tpcNSigmaPr, std::vector); -DECLARE_SOA_COLUMN(TrackID, trackID, std::vector); - -// for others -DECLARE_SOA_COLUMN(IsReconstructedWithUPC, isReconstructedWithUPC, bool); -DECLARE_SOA_COLUMN(TimeZNA, timeZNA, float); -DECLARE_SOA_COLUMN(TimeZNC, timeZNC, float); -DECLARE_SOA_COLUMN(EnergyCommonZNA, energyCommonZNA, float); -DECLARE_SOA_COLUMN(EnergyCommonZNC, energyCommonZNC, float); -DECLARE_SOA_COLUMN(IsChargeZero, isChargeZero, bool); - -DECLARE_SOA_COLUMN(OccupancyInTime, occupancyInTime, int); -DECLARE_SOA_COLUMN(HadronicRate, hadronicRate, double); - +// Declare columns +DECLARE_SOA_COLUMN(RunNumber, runNumber, int32_t); // Run number for event identification +DECLARE_SOA_COLUMN(M, m, double); // Invariant mass of the system +DECLARE_SOA_COLUMN(Pt, pt, double); // Transverse momentum of the system +DECLARE_SOA_COLUMN(Eta, eta, double); // Pseudorapidity of the system +DECLARE_SOA_COLUMN(Phi, phi, double); // Azimuthal angle of the system +DECLARE_SOA_COLUMN(PosX, posX, double); // Vertex X position +DECLARE_SOA_COLUMN(PosY, posY, double); // Vertex Y position +DECLARE_SOA_COLUMN(PosZ, posZ, double); // Vertex Z position +DECLARE_SOA_COLUMN(TotalCharge, totalCharge, int); // Total charge of selected tracks +DECLARE_SOA_COLUMN(TotalFT0AmplitudeA, totalFT0AmplitudeA, float); // FT0A amplitude +DECLARE_SOA_COLUMN(TotalFT0AmplitudeC, totalFT0AmplitudeC, float); // FT0C amplitude +DECLARE_SOA_COLUMN(TotalFV0AmplitudeA, totalFV0AmplitudeA, float); // FV0A amplitude +DECLARE_SOA_COLUMN(NumContrib, numContrib, int32_t); // Number of primary vertex contributors +DECLARE_SOA_COLUMN(Sign, sign, std::vector); // Track charges +DECLARE_SOA_COLUMN(TrackPt, trackPt, std::vector); // Track pT values +DECLARE_SOA_COLUMN(TrackEta, trackEta, std::vector); // Track eta values +DECLARE_SOA_COLUMN(TrackPhi, trackPhi, std::vector); // Track phi values +DECLARE_SOA_COLUMN(TPCNSigmaEl, tpcNSigmaEl, std::vector); // TPC nσ for electrons +DECLARE_SOA_COLUMN(TPCNSigmaPi, tpcNSigmaPi, std::vector); // TPC nσ for pions +DECLARE_SOA_COLUMN(TPCNSigmaKa, tpcNSigmaKa, std::vector); // TPC nσ for kaons +DECLARE_SOA_COLUMN(TPCNSigmaPr, tpcNSigmaPr, std::vector); // TPC nσ for protons +DECLARE_SOA_COLUMN(TrackID, trackID, std::vector); // Track identifiers +DECLARE_SOA_COLUMN(IsReconstructedWithUPC, isReconstructedWithUPC, bool); // UPC mode reconstruction flag +DECLARE_SOA_COLUMN(TimeZNA, timeZNA, float); // ZNA timing +DECLARE_SOA_COLUMN(TimeZNC, timeZNC, float); // ZNC timing +DECLARE_SOA_COLUMN(EnergyCommonZNA, energyCommonZNA, float); // ZNA energy +DECLARE_SOA_COLUMN(EnergyCommonZNC, energyCommonZNC, float); // ZNC energy +DECLARE_SOA_COLUMN(IsChargeZero, isChargeZero, bool); // Neutral system flag +DECLARE_SOA_COLUMN(OccupancyInTime, occupancyInTime, int); // Occupancy in time +DECLARE_SOA_COLUMN(HadronicRate, hadronicRate, double); // Hadronic interaction rate } // namespace fourpi -DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", fourpi::RunNumber, fourpi::M, fourpi::Pt, fourpi::Eta, fourpi::Phi, - fourpi::PosX, fourpi::PosY, fourpi::PosZ, fourpi::TotalCharge, fourpi::TotalFT0AmplitudeA, fourpi::TotalFT0AmplitudeC, fourpi::TotalFV0AmplitudeA, - fourpi::TotalFDDAmplitudeA, fourpi::TotalFDDAmplitudeC, fourpi::TimeFT0A, fourpi::TimeFT0C, fourpi::TimeFV0A, fourpi::TimeFDDA, fourpi::TimeFDDC, - fourpi::NumContrib, fourpi::Sign, fourpi::TrackPt, fourpi::TrackEta, fourpi::TrackPhi, - fourpi::TPCNSigmaEl, fourpi::TPCNSigmaPi, fourpi::TPCNSigmaKa, fourpi::TPCNSigmaPr, fourpi::TrackID, fourpi::IsReconstructedWithUPC, - fourpi::TimeZNA, fourpi::TimeZNC, fourpi::EnergyCommonZNA, fourpi::EnergyCommonZNC, fourpi::IsChargeZero, fourpi::OccupancyInTime, fourpi::HadronicRate); +// Define the output +DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", + fourpi::RunNumber, fourpi::M, fourpi::Pt, fourpi::Eta, fourpi::Phi, + fourpi::PosX, fourpi::PosY, fourpi::PosZ, fourpi::TotalCharge, + fourpi::TotalFT0AmplitudeA, fourpi::TotalFT0AmplitudeC, fourpi::TotalFV0AmplitudeA, + fourpi::NumContrib, + fourpi::Sign, fourpi::TrackPt, fourpi::TrackEta, fourpi::TrackPhi, + fourpi::TPCNSigmaEl, fourpi::TPCNSigmaPi, fourpi::TPCNSigmaKa, fourpi::TPCNSigmaPr, + fourpi::TrackID, fourpi::IsReconstructedWithUPC, + fourpi::TimeZNA, fourpi::TimeZNC, fourpi::EnergyCommonZNA, fourpi::EnergyCommonZNC, + fourpi::IsChargeZero, fourpi::OccupancyInTime, fourpi::HadronicRate); } // namespace o2::aod struct upcRhoPrimeAnalysis { - Produces systemTree; - - double PcEtaCut = 0.9; // physics coordination recommendation - - Configurable specifyGapSide{"specifyGapSide", true, "specify gap side for SG/DG produced data"}; - Configurable gapSide{"gapSide", 2, "gap side for SG produced data"}; - Configurable requireTof{"requireTof", false, "require TOF signal"}; - - Configurable collisionsPosZMaxCut{"collisionsPosZMaxCut", 10.0, "max Z position cut on collisions"}; - Configurable ZNcommonEnergyCut{"ZNcommonEnergyCut", 0.0, "ZN common energy cut"}; - Configurable ZNtimeCut{"ZNtimeCut", 2.0, "ZN time cut"}; - - Configurable tracksTpcNSigmaPiCut{"tracksTpcNSigmaPiCut", 3.0, "TPC nSigma pion cut"}; - Configurable tracksDcaMaxCut{"tracksDcaMaxCut", 1.0, "max DCA cut on tracks"}; - - Configurable systemMassMinCut{"systemMassMinCut", 0.8, "min M cut for reco system"}; - Configurable systemMassMaxCut{"systemMassMaxCut", 2.2, "max M cut for reco system"}; - Configurable systemPtCut{"systemPtMaxCut", 0.1, "max pT cut for reco system"}; - Configurable systemYCut{"systemYCut", 0.9, "rapiditiy cut for reco system"}; - - ConfigurableAxis mAxis{"mAxis", {1000, 0.0, 10.0}, "m (GeV/#it{c}^{2})"}; - ConfigurableAxis mCutAxis{"mCutAxis", {70, 0.5, 1.2}, "m (GeV/#it{c}^{2})"}; - ConfigurableAxis ptAxis{"ptAxis", {1000, 0.0, 10.0}, "p_{T} (GeV/#it{c})"}; - ConfigurableAxis ptCutAxis{"ptCutAxis", {300, 0.0, 0.3}, "p_{T} (GeV/#it{c})"}; - ConfigurableAxis pt2Axis{"pt2Axis", {300, 0.0, 0.09}, "p_{T}^{2} (GeV^{2}/#it{c}^{2})"}; - ConfigurableAxis etaAxis{"etaAxis", {180, -0.9, 0.9}, "#eta"}; - ConfigurableAxis yAxis{"yAxis", {180, -0.9, 0.9}, "y"}; - ConfigurableAxis phiAxis{"phiAxis", {180, 0.0, o2::constants::math::TwoPI}, "#phi"}; - ConfigurableAxis phiAsymmAxis{"phiAsymmAxis", {182, -o2::constants::math::PI, o2::constants::math::PI}, "#phi"}; - ConfigurableAxis momentumFromPhiAxis{"momentumFromPhiAxis", {400, -0.1, 0.1}, "p (GeV/#it{c})"}; - ConfigurableAxis ptQuantileAxis{"ptQuantileAxis", {0, 0.0181689, 0.0263408, 0.0330488, 0.0390369, 0.045058, 0.0512604, 0.0582598, 0.066986, 0.0788085, 0.1}, "p_{T} (GeV/#it{c})"}; - - HistogramRegistry registry{"registry", {}, OutputObjHandlingPolicy::AnalysisObject}; - - void init(o2::framework::InitContext&) - { - // selection counter - std::vector selectionCounterLabels = {"all tracks", "PV contributor", "ITS + TPC hit", "TOF requirement", "DCA cut", "#eta cut", "2D TPC n#sigma_{#pi} cut"}; - - // 4PI SYSTEM - // registry.add("4pi/hM", ";m (GeV/#it{c}^{2});counts", kTH1D, {mAxis}); - // registry.add("4pi/hPt", ";p_{T} (GeV/#it{c});counts", kTH1D, {ptAxis}); - // registry.add("4pi/hEta", ";Eta (1);counts", kTH1D, {etaAxis}); - // registry.add("4pi/hPhi", ";Phi ();counts", kTH1D, {phiAxis}); - } - - template - bool collisionPassesCuts(const C& collision) // collision cuts - { - if (std::abs(collision.posZ()) > collisionsPosZMaxCut) - return false; - if (specifyGapSide && collision.gapSide() != gapSide) - return false; - return true; - } - - template - bool trackPassesCuts(const T& track) // track cuts (PID done separately) - { - if (!track.isPVContributor()) - return false; - if (!track.hasITS() || !track.hasTPC()) - return false; - if (requireTof && !track.hasTOF()) - return false; - if (std::abs(track.dcaZ()) > tracksDcaMaxCut || std::abs(track.dcaXY()) > (0.0182 + 0.0350 / std::pow(track.pt(), 1.01))) // Run 2 dynamic DCA cut - return false; - if (std::abs(eta(track.px(), track.py(), track.pz())) > PcEtaCut) - return false; - return true; - } - - template - bool tracksPassPiPID(const T& cutTracks) // n-dimensional PID cut - { - double radius = 0.0; - for (const auto& track : cutTracks) - radius += std::pow(track.tpcNSigmaPi(), 2); - return radius < std::pow(tracksTpcNSigmaPiCut, 2); - } - - template - double tracksTotalCharge(const T& cutTracks) // total charge of selected tracks - { - double charge = 0.0; - for (const auto& track : cutTracks) - charge += track.sign(); - return charge; - } - - bool systemPassCuts(const ROOT::Math::PxPyPzMVector& system) // system cuts - { - if (system.M() < systemMassMinCut || system.M() > systemMassMaxCut) - return false; - if (system.Pt() > systemPtCut) - return false; - if (std::abs(system.Rapidity()) > systemYCut) - return false; - return true; - } - - ROOT::Math::PxPyPzMVector reconstructSystem(const std::vector& cutTracks4Vecs) // reconstruct system from 4-vectors - { - ROOT::Math::PxPyPzMVector system; - for (const auto& track4Vec : cutTracks4Vecs) - system += track4Vec; - return system; - } - - double deltaPhi(const ROOT::Math::PxPyPzMVector& p1, const ROOT::Math::PxPyPzMVector& p2) - { - double dPhi = p1.Phi() - p2.Phi(); - if (dPhi > o2::constants::math::PI) - dPhi -= o2::constants::math::TwoPI; - else if (dPhi < -o2::constants::math::PI) - dPhi += o2::constants::math::TwoPI; - return dPhi; // calculate delta phi in (-pi, pi) - } - - double getPhiRandom(const std::vector& cutTracks4Vecs) // decay phi anisotropy - { // two possible definitions of phi: randomize the tracks - std::vector indices = {0, 1}; - unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); // get time-based seed - std::shuffle(indices.begin(), indices.end(), std::default_random_engine(seed)); // shuffle indices - // calculate phi - ROOT::Math::PxPyPzMVector pOne = cutTracks4Vecs[indices[0]]; - ROOT::Math::PxPyPzMVector pTwo = cutTracks4Vecs[indices[1]]; - ROOT::Math::PxPyPzMVector pPlus = pOne + pTwo; - ROOT::Math::PxPyPzMVector pMinus = pOne - pTwo; - return deltaPhi(pPlus, pMinus); - } - - template - double getPhiCharge(const T& cutTracks, const std::vector& cutTracks4Vecs) - { // two possible definitions of phi: charge-based assignment - ROOT::Math::PxPyPzMVector pOne, pTwo; - if (cutTracks[0].sign() > 0) { - pOne = cutTracks4Vecs[0]; - pTwo = cutTracks4Vecs[1]; - } else { - pOne = cutTracks4Vecs[1]; - pTwo = cutTracks4Vecs[0]; - } - ROOT::Math::PxPyPzMVector pPlus = pOne + pTwo; - ROOT::Math::PxPyPzMVector pMinus = pOne - pTwo; - return deltaPhi(pPlus, pMinus); - } - - void processReco(FullUDSgCollision const& collision, FullUDTracks const& tracks) - { - - if (!collisionPassesCuts(collision)) - return; - - // vectors for storing selected tracks and their 4-vectors - std::vector cutTracks; - std::vector cutTracks4Vecs; - - // int trackCounter = 0; - for (const auto& track : tracks) { - - if (!trackPassesCuts(track)) - continue; - // trackCounter++; - cutTracks.push_back(track); - cutTracks4Vecs.push_back(ROOT::Math::PxPyPzMVector(track.px(), track.py(), track.pz(), o2::constants::physics::MassPionCharged)); // apriori assume pion mass + Produces systemTree; + + // System selection configuration + Configurable systemYCut{"systemYCut", 0.5, "Max Rapidity of rho prime"}; + Configurable systemPtCut{"systemPtCut", 0.1, "Min Pt of rho prime"}; + Configurable systemMassMinCut{"systemMassMinCut", 0.8, "Min Mass of rho prime"}; + Configurable systemMassMaxCut{"systemMassMaxCut", 2.2, "Max Mass of rho prime"}; + Configurable etaCut{"etaCut", 0.9, "Track Pseudorapidity"}; + + // Event selection configuration + Configurable vZCut{"vZCut", 10.0, "Cut on vertex Z position"}; + Configurable numPVContrib{"numPVContrib", 4, "Number of PV contributors"}; + Configurable fv0Cut{"fv0Cut", 50.0, "FV0 amplitude cut"}; + Configurable ft0aCut{"ft0aCut", 50.0, "FT0A amplitude cut"}; + Configurable ft0cCut{"ft0cCut", 50.0, "FT0C amplitude cut"}; + Configurable zdcCut{"zdcCut", 0.0, "ZDC energy cut"}; + Configurable sbpCut{"sbpCut", true, "SBP cut"}; + Configurable itsROFbCut{"itsROFbCut", true, "ITS ROFb cut"}; + Configurable vtxITSTPCcut{"vtxITSTPCcut", true, "Vertex ITS-TPC cut"}; + Configurable tfbCut{"tfbCut", true, "TFB cut"}; + Configurable specifyGapSide{"specifyGapSide", true, "specify gap side for SG/DG produced data"}; + Configurable gapSide{"gapSide", 2, "gap side for SG produced data"}; + + // Track selection configuration + Configurable useOnlyPVtracks{"useOnlyPVtracks", true, "Use only PV tracks"}; + Configurable tpcChi2NClsCut{"tpcChi2NClsCut", 5.0, "TPC chi2/N clusters cut"}; + Configurable itsChi2NClsCut{"itsChi2NClsCut", 36.0, "ITS chi2/N clusters cut"}; + Configurable nSigmaTPCcut{"nSigmaTPCcut", 5.0, "TPC nSigma cut"}; + Configurable dcaXYcut{"dcaXYcut", 0, "dcaXY cut"}; + Configurable dcaZcut{"dcaZcut", 2, "dcaZ cut"}; + Configurable minTPCFindableClusters{"minTPCFindableClusters", 70, "Minimum number of findable TPC clusters"}; + + // Define histogram registry + HistogramRegistry registry{ + "registry", + { + // Event flow histograms + {"Events/Flow", "Event flow;Cut;Counts", {HistType::kTH1F, {{9, 0, 9}}}}, + {"Events/VertexZ", "Vertex Z;z (cm);Counts", {HistType::kTH1F, {{200, -20, 20}}}}, + {"Events/NumContrib", "Number of contributors;N_{contrib};Counts", {HistType::kTH1F, {{100, 0, 100}}}}, + {"Events/FV0Amplitude", "FV0 amplitude;Amplitude;Counts", {HistType::kTH1F, {{200, 0, 200}}}}, + {"Events/FT0AmplitudeA", "FT0A amplitude;Amplitude;Counts", {HistType::kTH1F, {{200, 0, 200}}}}, + {"Events/FT0AmplitudeC", "FT0C amplitude;Amplitude;Counts", {HistType::kTH1F, {{200, 0, 200}}}}, + {"Events/ZDCEnergy", "ZDC energy;Energy (TeV);Counts", {HistType::kTH1F, {{200, 0, 2}}}}, + + // Track quality histograms + {"Tracks/Pt", "Track p_{T};p_{T} (GeV/c);Counts", {HistType::kTH1F, {{200, 0, 2}}}}, + {"Tracks/Eta", "Track #eta;#eta;Counts", {HistType::kTH1F, {{200, -2, 2}}}}, + {"Tracks/TPCNSigmaPi", "TPC n#sigma for #pi;n#sigma;Counts", {HistType::kTH1F, {{200, -10, 10}}}}, + {"Tracks/TPCChi2NCl", "TPC #chi^{2}/N_{cls};#chi^{2}/N_{cls};Counts", {HistType::kTH1F, {{200, 0, 20}}}}, + {"Tracks/ITSChi2NCl", "ITS #chi^{2}/N_{cls};#chi^{2}/N_{cls};Counts", {HistType::kTH1F, {{200, 0, 50}}}}, + {"Tracks/RejectionReasons", "Track rejection reasons;Reason;Counts", {HistType::kTH1F, {{12, 0, 12}}}}, + {"Tracks/DCASpectrum", "Track DCA spectrum;DCA (cm);Counts", {HistType::kTH1F, {{100, 0, 5}}}}, + {"Tracks/ChargeDistribution", "Track charge distribution;Charge;Counts", {HistType::kTH1F, {{3, -1.5, 1.5}}}}, + {"Tracks/TPCClusters", "TPC clusters findable;N_{clusters};Counts", {HistType::kTH1F, {{100, 0, 200}}}}, + + // System kinematics histograms + {"System/hM", ";m (GeV/#it{c}^{2});counts", {HistType::kTH1F, {{1000, 0.0, 10.0}}}}, + {"System/hPt", ";p_{T} (GeV/#it{c});counts", {HistType::kTH1F, {{1000, 0.0, 10.0}}}}, + {"System/hEta", ";#eta;counts", {HistType::kTH1F, {{180, -0.9, 0.9}}}}, + {"System/hPhi", ";#phi;counts", {HistType::kTH1F, {{180, 0.0, 6.28}}}}, + {"System/hY", ";y;counts", {HistType::kTH1F, {{180, -0.9, 0.9}}}}, + + // Comparison histograms + {"Cuts/MBefore", "Mass before cuts;m (GeV/c^{2});Counts", {HistType::kTH1F, {{1000, 0, 10}}}}, + {"Cuts/MAfter", "Mass after cuts;m (GeV/c^{2});Counts", {HistType::kTH1F, {{1000, 0, 10}}}}, + {"Cuts/PtBefore", "p_{T} before cuts;p_{T} (GeV/c);Counts", {HistType::kTH1F, {{1000, 0, 1}}}}, + {"Cuts/PtAfter", "p_{T} after cuts;p_{T} (GeV/c);Counts", {HistType::kTH1F, {{1000, 0, 10}}}} + } + }; + + void init(InitContext&) + { + // Configure event flow histogram labels + auto hFlow = registry.get(HIST("Events/Flow")); + hFlow->GetXaxis()->SetBinLabel(1, "All events"); + hFlow->GetXaxis()->SetBinLabel(2, "ITS-TPC cut"); + hFlow->GetXaxis()->SetBinLabel(3, "SBP cut"); + hFlow->GetXaxis()->SetBinLabel(4, "ITS ROFb cut"); + hFlow->GetXaxis()->SetBinLabel(5, "TFB cut"); + hFlow->GetXaxis()->SetBinLabel(6, "Gap Side cut"); + hFlow->GetXaxis()->SetBinLabel(7, "PV contrib cut"); + hFlow->GetXaxis()->SetBinLabel(8, "Z vtx cut"); + hFlow->GetXaxis()->SetBinLabel(9, "4 tracks cut"); + + // Configure track rejection reasons histogram labels + auto hReject = registry.get(HIST("Tracks/RejectionReasons")); + hReject->GetXaxis()->SetBinLabel(1, "All Tracks"); + hReject->GetXaxis()->SetBinLabel(2, "PV Contributor"); + hReject->GetXaxis()->SetBinLabel(3, "Has ITS+TPC"); + hReject->GetXaxis()->SetBinLabel(4, "pT > 0.1 GeV/c"); + hReject->GetXaxis()->SetBinLabel(5, "TPC chi2/cluster"); + hReject->GetXaxis()->SetBinLabel(6, "ITS chi2/cluster"); + hReject->GetXaxis()->SetBinLabel(7, "TPC clusters findable"); + hReject->GetXaxis()->SetBinLabel(8, "TPC nSigmaPi"); + hReject->GetXaxis()->SetBinLabel(9, "Eta acceptance"); + hReject->GetXaxis()->SetBinLabel(10, "DCAz cut"); + hReject->GetXaxis()->SetBinLabel(11, "DCAxy cut"); + hReject->GetXaxis()->SetBinLabel(12, "Accepted Tracks"); } - if (!tracksPassPiPID(cutTracks)) - return; - // reonstruct system and calculate total charge, save commonly used values into variables - ROOT::Math::PxPyPzMVector system = reconstructSystem(cutTracks4Vecs); - int totalCharge = tracksTotalCharge(cutTracks); - int nTracks = cutTracks.size(); - double mass = system.M(); - double pT = system.Pt(); - // double pTsquare = pT * pT; - double rapidity = system.Rapidity(); - double systemPhi = system.Phi() + o2::constants::math::PI; - - if (nTracks == 4) { - bool isChargeZero = (tracksTotalCharge(cutTracks) == 0); - - std::vector vTrackPt, vTrackEta, vTrackPhi; - std::vector vSign, vTrackID; - std::vector vTpcNSigmaEl, vTpcNSigmaPi, vTpcNSigmaKa, vTpcNSigmaPr; - - for (size_t i = 0; i < cutTracks.size(); i++) { - double tPt = cutTracks[i].pt(); - double tEta = eta(cutTracks[i].px(), cutTracks[i].py(), cutTracks[i].pz()); - double tPhi = phi(cutTracks[i].px(), cutTracks[i].py()); - - vTrackPt.push_back(tPt); - vTrackEta.push_back(tEta); - vTrackPhi.push_back(tPhi); - vSign.push_back(cutTracks[i].sign()); - vTpcNSigmaEl.push_back(cutTracks[i].tpcNSigmaEl()); - vTpcNSigmaPi.push_back(cutTracks[i].tpcNSigmaPi()); - vTpcNSigmaKa.push_back(cutTracks[i].tpcNSigmaKa()); - vTpcNSigmaPr.push_back(cutTracks[i].tpcNSigmaPr()); - - vTrackID.push_back(i); - } - - bool isReconstructedWithUPC = false; - - if (collision.flags() == 1) { - isReconstructedWithUPC = true; - } else { - isReconstructedWithUPC = false; - } - - systemTree(collision.runNumber(), mass, pT, rapidity, systemPhi, - collision.posX(), collision.posY(), collision.posZ(), totalCharge, - collision.totalFT0AmplitudeA(), collision.totalFT0AmplitudeC(), collision.timeFV0A(), - collision.totalFDDAmplitudeA(), collision.totalFDDAmplitudeC(), - collision.timeFT0A(), collision.timeFT0C(), collision.timeFV0A(), - collision.timeFDDA(), collision.timeFDDC(), collision.numContrib(), - vSign, vTrackPt, vTrackEta, vTrackPhi, - vTpcNSigmaEl, vTpcNSigmaPi, vTpcNSigmaKa, vTpcNSigmaPr, - vTrackID, isReconstructedWithUPC, collision.timeZNA(), collision.timeZNC(), - collision.energyCommonZNA(), collision.energyCommonZNC(), - isChargeZero, collision.occupancyInTime(), collision.hadronicRate()); + void process(UDCollisions::iterator const& collision, UDtracks const& tracks) + { + // Count all processed events + registry.fill(HIST("Events/Flow"), 0); + + // Fill basic event diagnostics + registry.fill(HIST("Events/VertexZ"), collision.posZ()); + registry.fill(HIST("Events/NumContrib"), collision.numContrib()); + registry.fill(HIST("Events/FV0Amplitude"), collision.totalFV0AmplitudeA()); + registry.fill(HIST("Events/FT0AmplitudeA"), collision.totalFT0AmplitudeA()); + registry.fill(HIST("Events/FT0AmplitudeC"), collision.totalFT0AmplitudeC()); + registry.fill(HIST("Events/ZDCEnergy"), collision.energyCommonZNA()); + registry.fill(HIST("Events/ZDCEnergy"), collision.energyCommonZNC()); + + // Apply event selection cuts in sequence + if (collision.vtxITSTPC() != vtxITSTPCcut) return; + registry.fill(HIST("Events/Flow"), 1); + + if (collision.sbp() != sbpCut) return; + registry.fill(HIST("Events/Flow"), 2); + + if (collision.itsROFb() != itsROFbCut) return; + registry.fill(HIST("Events/Flow"), 3); + + if (collision.tfb() != tfbCut) return; + registry.fill(HIST("Events/Flow"), 4); + + if (specifyGapSide && collision.gapSide() != gapSide) return; + if (collision.totalFV0AmplitudeA() > fv0Cut) return; + if (collision.totalFT0AmplitudeA() > ft0aCut) return; + if (collision.totalFT0AmplitudeC() > ft0cCut) return; + if (collision.energyCommonZNA() > zdcCut || collision.energyCommonZNC() > zdcCut) return; + registry.fill(HIST("Events/Flow"), 5); + + if (collision.numContrib() != numPVContrib) return; + registry.fill(HIST("Events/Flow"), 6); + + if (std::abs(collision.posZ()) > vZCut) return; + registry.fill(HIST("Events/Flow"), 7); + + std::vector posPions; + std::vector negPions; + posPions.reserve(2); + negPions.reserve(2); + + int nTotalTracks = 0; + int nGoodTracks = 0; + + // Loop over all tracks in the event + for (const auto& track : tracks) { + registry.fill(HIST("Tracks/RejectionReasons"), 0); // Count all tracks + nTotalTracks++; + + // Track selection criteria applied in sequence: + if (useOnlyPVtracks && !track.isPVContributor()) { + registry.fill(HIST("Tracks/RejectionReasons"), 1); + continue; + } + + if (!track.hasITS() || !track.hasTPC()) { + registry.fill(HIST("Tracks/RejectionReasons"), 2); + continue; + } + + // Fill track spectra + registry.fill(HIST("Tracks/Pt"), track.pt()); + registry.fill(HIST("Tracks/Eta"), eta(track.px(), track.py(), track.pz())); + registry.fill(HIST("Tracks/TPCNSigmaPi"), track.tpcNSigmaPi()); + registry.fill(HIST("Tracks/TPCChi2NCl"), track.tpcChi2NCl()); + registry.fill(HIST("Tracks/ITSChi2NCl"), track.itsChi2NCl()); + registry.fill(HIST("Tracks/DCASpectrum"), std::hypot(track.dcaXY(), track.dcaZ())); + registry.fill(HIST("Tracks/ChargeDistribution"), track.sign()); + registry.fill(HIST("Tracks/TPCClusters"), track.tpcNClsFindable()); + + if (track.pt() <= 0.1f) { + registry.fill(HIST("Tracks/RejectionReasons"), 3); + continue; + } + + if (track.tpcChi2NCl() > tpcChi2NClsCut) { + registry.fill(HIST("Tracks/RejectionReasons"), 4); + continue; + } + if (track.itsChi2NCl() > itsChi2NClsCut) { + registry.fill(HIST("Tracks/RejectionReasons"), 5); + continue; + } + + if (track.tpcNClsFindable() < minTPCFindableClusters) { + registry.fill(HIST("Tracks/RejectionReasons"), 6); + continue; + } + + if (std::abs(track.tpcNSigmaPi()) > nSigmaTPCcut) { + registry.fill(HIST("Tracks/RejectionReasons"), 7); + continue; + } + + float trackEta = eta(track.px(), track.py(), track.pz()); + if (std::abs(trackEta) > etaCut) { + registry.fill(HIST("Tracks/RejectionReasons"), 8); + continue; + } + + if (std::abs(track.dcaZ()) > dcaZcut) { + registry.fill(HIST("Tracks/RejectionReasons"), 9); + continue; + } + + float maxDCAxy = 0.0105 + 0.035 / std::pow(track.pt(), 1.1); + if (dcaXYcut == 0 && (std::fabs(track.dcaXY()) > maxDCAxy)) { + registry.fill(HIST("Tracks/RejectionReasons"), 10); + continue; + } else if (dcaXYcut != 0 && (std::fabs(track.dcaXY()) > dcaXYcut)) { + registry.fill(HIST("Tracks/RejectionReasons"), 10); + continue; + } + + // Track passed all selection criteria + registry.fill(HIST("Tracks/RejectionReasons"), 11); + nGoodTracks++; + + if (track.sign() > 0 && posPions.size() < 2) { + posPions.push_back(track); + } + else if (track.sign() < 0 && negPions.size() < 2) { + negPions.push_back(track); + } + + if (posPions.size() == 2 && negPions.size() == 2) break; + } + + if (posPions.size() != 2 || negPions.size() != 2) { + return; + } + registry.fill(HIST("Events/Flow"), 8); + + std::vector selectedTracks; + selectedTracks.insert(selectedTracks.end(), posPions.begin(), posPions.end()); + selectedTracks.insert(selectedTracks.end(), negPions.begin(), negPions.end()); + + // Reconstruct the 4-pion system + ROOT::Math::PxPyPzMVector fourPionSystem; + std::vector pionFourVectors; + + for (const auto& track : selectedTracks) { + ROOT::Math::PxPyPzMVector pionVec( + track.px(), track.py(), track.pz(), + o2::constants::physics::MassPionCharged); + fourPionSystem += pionVec; + pionFourVectors.push_back(pionVec); + } + + // Fill pre-cut system histograms + registry.fill(HIST("Cuts/MBefore"), fourPionSystem.M()); + registry.fill(HIST("Cuts/PtBefore"), fourPionSystem.Pt()); + + // Apply system-level kinematic cuts + if (fourPionSystem.M() < systemMassMinCut || fourPionSystem.M() > systemMassMaxCut) return; + if (fourPionSystem.Pt() > systemPtCut) return; + if (std::abs(fourPionSystem.Rapidity()) > systemYCut) return; + + // Fill post-cut system histograms + registry.fill(HIST("Cuts/MAfter"), fourPionSystem.M()); + registry.fill(HIST("Cuts/PtAfter"), fourPionSystem.Pt()); + registry.fill(HIST("System/hM"), fourPionSystem.M()); + registry.fill(HIST("System/hPt"), fourPionSystem.Pt()); + registry.fill(HIST("System/hEta"), fourPionSystem.Eta()); + registry.fill(HIST("System/hPhi"), fourPionSystem.Phi()+ o2::constants::math::PI); + registry.fill(HIST("System/hY"), fourPionSystem.Rapidity()); + + std::vector trackPts, trackEtas, trackPhis; + std::vector trackSigns, trackIDs; + std::vector tpcNSigmasEl, tpcNSigmasPi, tpcNSigmasKa, tpcNSigmasPr; + + for (size_t i = 0; i < selectedTracks.size(); i++) { + const auto& track = selectedTracks[i]; + trackPts.push_back(track.pt()); + trackEtas.push_back(eta(track.px(), track.py(), track.pz())); + trackPhis.push_back(phi(track.px(), track.py())); + trackSigns.push_back(track.sign()); + tpcNSigmasEl.push_back(track.tpcNSigmaEl()); + tpcNSigmasPi.push_back(track.tpcNSigmaPi()); + tpcNSigmasKa.push_back(track.tpcNSigmaKa()); + tpcNSigmasPr.push_back(track.tpcNSigmaPr()); + trackIDs.push_back(i); + } + + bool isReconstructedWithUPC = (collision.flags() == 1); + + // 13. Fill the output + systemTree( + collision.runNumber(), + fourPionSystem.M(), + fourPionSystem.Pt(), + fourPionSystem.Rapidity(), + fourPionSystem.Phi(), + collision.posX(), + collision.posY(), + collision.posZ(), + 0, // Total charge = 0 + collision.totalFT0AmplitudeA(), + collision.totalFT0AmplitudeC(), + collision.totalFV0AmplitudeA(), + collision.numContrib(), + trackSigns, + trackPts, + trackEtas, + trackPhis, + tpcNSigmasEl, + tpcNSigmasPi, + tpcNSigmasKa, + tpcNSigmasPr, + trackIDs, + isReconstructedWithUPC, + collision.timeZNA(), + collision.timeZNC(), + collision.energyCommonZNA(), + collision.energyCommonZNC(), + true, // Always charge zero for our selection + collision.occupancyInTime(), + collision.hadronicRate() + ); } - // std::cout<<"Hello World"<(cfgc)}; -} + return WorkflowSpec{ + adaptAnalysisTask(cfgc)}; +} \ No newline at end of file From c334e9b122c8dc196405ff56975fcd9f7f9eea38 Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Mon, 11 Aug 2025 10:47:21 +0200 Subject: [PATCH 1647/1650] Apply new cuts --- PWGUD/Tasks/upcRhoPrimeAnalysis.cxx | 744 ++++++++++++++-------------- 1 file changed, 379 insertions(+), 365 deletions(-) diff --git a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx index eb150f4869d..69ee19764d5 100644 --- a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx @@ -14,17 +14,21 @@ #include "PWGUD/Core/UPCTauCentralBarrelHelperRL.h" #include "PWGUD/DataModel/UDTables.h" + #include "Common/DataModel/PIDResponse.h" + #include "Framework/AnalysisDataModel.h" #include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" + #include "Math/Vector4D.h" -#include "random" #include "TH1F.h" #include "TH2F.h" + +#include "random" +#include #include #include -#include using namespace o2; using namespace o2::framework; @@ -38,381 +42,391 @@ namespace o2::aod namespace fourpi { // Declare columns -DECLARE_SOA_COLUMN(RunNumber, runNumber, int32_t); // Run number for event identification -DECLARE_SOA_COLUMN(M, m, double); // Invariant mass of the system -DECLARE_SOA_COLUMN(Pt, pt, double); // Transverse momentum of the system -DECLARE_SOA_COLUMN(Eta, eta, double); // Pseudorapidity of the system -DECLARE_SOA_COLUMN(Phi, phi, double); // Azimuthal angle of the system -DECLARE_SOA_COLUMN(PosX, posX, double); // Vertex X position -DECLARE_SOA_COLUMN(PosY, posY, double); // Vertex Y position -DECLARE_SOA_COLUMN(PosZ, posZ, double); // Vertex Z position -DECLARE_SOA_COLUMN(TotalCharge, totalCharge, int); // Total charge of selected tracks -DECLARE_SOA_COLUMN(TotalFT0AmplitudeA, totalFT0AmplitudeA, float); // FT0A amplitude -DECLARE_SOA_COLUMN(TotalFT0AmplitudeC, totalFT0AmplitudeC, float); // FT0C amplitude -DECLARE_SOA_COLUMN(TotalFV0AmplitudeA, totalFV0AmplitudeA, float); // FV0A amplitude -DECLARE_SOA_COLUMN(NumContrib, numContrib, int32_t); // Number of primary vertex contributors -DECLARE_SOA_COLUMN(Sign, sign, std::vector); // Track charges -DECLARE_SOA_COLUMN(TrackPt, trackPt, std::vector); // Track pT values -DECLARE_SOA_COLUMN(TrackEta, trackEta, std::vector); // Track eta values -DECLARE_SOA_COLUMN(TrackPhi, trackPhi, std::vector); // Track phi values -DECLARE_SOA_COLUMN(TPCNSigmaEl, tpcNSigmaEl, std::vector); // TPC nσ for electrons -DECLARE_SOA_COLUMN(TPCNSigmaPi, tpcNSigmaPi, std::vector); // TPC nσ for pions -DECLARE_SOA_COLUMN(TPCNSigmaKa, tpcNSigmaKa, std::vector); // TPC nσ for kaons -DECLARE_SOA_COLUMN(TPCNSigmaPr, tpcNSigmaPr, std::vector); // TPC nσ for protons -DECLARE_SOA_COLUMN(TrackID, trackID, std::vector); // Track identifiers +DECLARE_SOA_COLUMN(RunNumber, runNumber, int32_t); // Run number for event identification +DECLARE_SOA_COLUMN(M, m, double); // Invariant mass of the system +DECLARE_SOA_COLUMN(Pt, pt, double); // Transverse momentum of the system +DECLARE_SOA_COLUMN(Eta, eta, double); // Pseudorapidity of the system +DECLARE_SOA_COLUMN(Phi, phi, double); // Azimuthal angle of the system +DECLARE_SOA_COLUMN(PosX, posX, double); // Vertex X position +DECLARE_SOA_COLUMN(PosY, posY, double); // Vertex Y position +DECLARE_SOA_COLUMN(PosZ, posZ, double); // Vertex Z position +DECLARE_SOA_COLUMN(TotalCharge, totalCharge, int); // Total charge of selected tracks +DECLARE_SOA_COLUMN(TotalFT0AmplitudeA, totalFT0AmplitudeA, float); // FT0A amplitude +DECLARE_SOA_COLUMN(TotalFT0AmplitudeC, totalFT0AmplitudeC, float); // FT0C amplitude +DECLARE_SOA_COLUMN(TotalFV0AmplitudeA, totalFV0AmplitudeA, float); // FV0A amplitude +DECLARE_SOA_COLUMN(NumContrib, numContrib, int32_t); // Number of primary vertex contributors +DECLARE_SOA_COLUMN(Sign, sign, std::vector); // Track charges +DECLARE_SOA_COLUMN(TrackPt, trackPt, std::vector); // Track pT values +DECLARE_SOA_COLUMN(TrackEta, trackEta, std::vector); // Track eta values +DECLARE_SOA_COLUMN(TrackPhi, trackPhi, std::vector); // Track phi values +DECLARE_SOA_COLUMN(TPCNSigmaEl, tpcNSigmaEl, std::vector); // TPC nσ for electrons +DECLARE_SOA_COLUMN(TPCNSigmaPi, tpcNSigmaPi, std::vector); // TPC nσ for pions +DECLARE_SOA_COLUMN(TPCNSigmaKa, tpcNSigmaKa, std::vector); // TPC nσ for kaons +DECLARE_SOA_COLUMN(TPCNSigmaPr, tpcNSigmaPr, std::vector); // TPC nσ for protons +DECLARE_SOA_COLUMN(TrackID, trackID, std::vector); // Track identifiers DECLARE_SOA_COLUMN(IsReconstructedWithUPC, isReconstructedWithUPC, bool); // UPC mode reconstruction flag -DECLARE_SOA_COLUMN(TimeZNA, timeZNA, float); // ZNA timing -DECLARE_SOA_COLUMN(TimeZNC, timeZNC, float); // ZNC timing -DECLARE_SOA_COLUMN(EnergyCommonZNA, energyCommonZNA, float); // ZNA energy -DECLARE_SOA_COLUMN(EnergyCommonZNC, energyCommonZNC, float); // ZNC energy -DECLARE_SOA_COLUMN(IsChargeZero, isChargeZero, bool); // Neutral system flag -DECLARE_SOA_COLUMN(OccupancyInTime, occupancyInTime, int); // Occupancy in time -DECLARE_SOA_COLUMN(HadronicRate, hadronicRate, double); // Hadronic interaction rate +DECLARE_SOA_COLUMN(TimeZNA, timeZNA, float); // ZNA timing +DECLARE_SOA_COLUMN(TimeZNC, timeZNC, float); // ZNC timing +DECLARE_SOA_COLUMN(EnergyCommonZNA, energyCommonZNA, float); // ZNA energy +DECLARE_SOA_COLUMN(EnergyCommonZNC, energyCommonZNC, float); // ZNC energy +DECLARE_SOA_COLUMN(IsChargeZero, isChargeZero, bool); // Neutral system flag +DECLARE_SOA_COLUMN(OccupancyInTime, occupancyInTime, int); // Occupancy in time +DECLARE_SOA_COLUMN(HadronicRate, hadronicRate, double); // Hadronic interaction rate } // namespace fourpi // Define the output DECLARE_SOA_TABLE(SYSTEMTREE, "AOD", "SystemTree", - fourpi::RunNumber, fourpi::M, fourpi::Pt, fourpi::Eta, fourpi::Phi, - fourpi::PosX, fourpi::PosY, fourpi::PosZ, fourpi::TotalCharge, - fourpi::TotalFT0AmplitudeA, fourpi::TotalFT0AmplitudeC, fourpi::TotalFV0AmplitudeA, - fourpi::NumContrib, - fourpi::Sign, fourpi::TrackPt, fourpi::TrackEta, fourpi::TrackPhi, - fourpi::TPCNSigmaEl, fourpi::TPCNSigmaPi, fourpi::TPCNSigmaKa, fourpi::TPCNSigmaPr, - fourpi::TrackID, fourpi::IsReconstructedWithUPC, - fourpi::TimeZNA, fourpi::TimeZNC, fourpi::EnergyCommonZNA, fourpi::EnergyCommonZNC, - fourpi::IsChargeZero, fourpi::OccupancyInTime, fourpi::HadronicRate); + fourpi::RunNumber, fourpi::M, fourpi::Pt, fourpi::Eta, fourpi::Phi, + fourpi::PosX, fourpi::PosY, fourpi::PosZ, fourpi::TotalCharge, + fourpi::TotalFT0AmplitudeA, fourpi::TotalFT0AmplitudeC, fourpi::TotalFV0AmplitudeA, + fourpi::NumContrib, + fourpi::Sign, fourpi::TrackPt, fourpi::TrackEta, fourpi::TrackPhi, + fourpi::TPCNSigmaEl, fourpi::TPCNSigmaPi, fourpi::TPCNSigmaKa, fourpi::TPCNSigmaPr, + fourpi::TrackID, fourpi::IsReconstructedWithUPC, + fourpi::TimeZNA, fourpi::TimeZNC, fourpi::EnergyCommonZNA, fourpi::EnergyCommonZNC, + fourpi::IsChargeZero, fourpi::OccupancyInTime, fourpi::HadronicRate); } // namespace o2::aod struct upcRhoPrimeAnalysis { - Produces systemTree; - - // System selection configuration - Configurable systemYCut{"systemYCut", 0.5, "Max Rapidity of rho prime"}; - Configurable systemPtCut{"systemPtCut", 0.1, "Min Pt of rho prime"}; - Configurable systemMassMinCut{"systemMassMinCut", 0.8, "Min Mass of rho prime"}; - Configurable systemMassMaxCut{"systemMassMaxCut", 2.2, "Max Mass of rho prime"}; - Configurable etaCut{"etaCut", 0.9, "Track Pseudorapidity"}; - - // Event selection configuration - Configurable vZCut{"vZCut", 10.0, "Cut on vertex Z position"}; - Configurable numPVContrib{"numPVContrib", 4, "Number of PV contributors"}; - Configurable fv0Cut{"fv0Cut", 50.0, "FV0 amplitude cut"}; - Configurable ft0aCut{"ft0aCut", 50.0, "FT0A amplitude cut"}; - Configurable ft0cCut{"ft0cCut", 50.0, "FT0C amplitude cut"}; - Configurable zdcCut{"zdcCut", 0.0, "ZDC energy cut"}; - Configurable sbpCut{"sbpCut", true, "SBP cut"}; - Configurable itsROFbCut{"itsROFbCut", true, "ITS ROFb cut"}; - Configurable vtxITSTPCcut{"vtxITSTPCcut", true, "Vertex ITS-TPC cut"}; - Configurable tfbCut{"tfbCut", true, "TFB cut"}; - Configurable specifyGapSide{"specifyGapSide", true, "specify gap side for SG/DG produced data"}; - Configurable gapSide{"gapSide", 2, "gap side for SG produced data"}; - - // Track selection configuration - Configurable useOnlyPVtracks{"useOnlyPVtracks", true, "Use only PV tracks"}; - Configurable tpcChi2NClsCut{"tpcChi2NClsCut", 5.0, "TPC chi2/N clusters cut"}; - Configurable itsChi2NClsCut{"itsChi2NClsCut", 36.0, "ITS chi2/N clusters cut"}; - Configurable nSigmaTPCcut{"nSigmaTPCcut", 5.0, "TPC nSigma cut"}; - Configurable dcaXYcut{"dcaXYcut", 0, "dcaXY cut"}; - Configurable dcaZcut{"dcaZcut", 2, "dcaZ cut"}; - Configurable minTPCFindableClusters{"minTPCFindableClusters", 70, "Minimum number of findable TPC clusters"}; - - // Define histogram registry - HistogramRegistry registry{ - "registry", - { - // Event flow histograms - {"Events/Flow", "Event flow;Cut;Counts", {HistType::kTH1F, {{9, 0, 9}}}}, - {"Events/VertexZ", "Vertex Z;z (cm);Counts", {HistType::kTH1F, {{200, -20, 20}}}}, - {"Events/NumContrib", "Number of contributors;N_{contrib};Counts", {HistType::kTH1F, {{100, 0, 100}}}}, - {"Events/FV0Amplitude", "FV0 amplitude;Amplitude;Counts", {HistType::kTH1F, {{200, 0, 200}}}}, - {"Events/FT0AmplitudeA", "FT0A amplitude;Amplitude;Counts", {HistType::kTH1F, {{200, 0, 200}}}}, - {"Events/FT0AmplitudeC", "FT0C amplitude;Amplitude;Counts", {HistType::kTH1F, {{200, 0, 200}}}}, - {"Events/ZDCEnergy", "ZDC energy;Energy (TeV);Counts", {HistType::kTH1F, {{200, 0, 2}}}}, - - // Track quality histograms - {"Tracks/Pt", "Track p_{T};p_{T} (GeV/c);Counts", {HistType::kTH1F, {{200, 0, 2}}}}, - {"Tracks/Eta", "Track #eta;#eta;Counts", {HistType::kTH1F, {{200, -2, 2}}}}, - {"Tracks/TPCNSigmaPi", "TPC n#sigma for #pi;n#sigma;Counts", {HistType::kTH1F, {{200, -10, 10}}}}, - {"Tracks/TPCChi2NCl", "TPC #chi^{2}/N_{cls};#chi^{2}/N_{cls};Counts", {HistType::kTH1F, {{200, 0, 20}}}}, - {"Tracks/ITSChi2NCl", "ITS #chi^{2}/N_{cls};#chi^{2}/N_{cls};Counts", {HistType::kTH1F, {{200, 0, 50}}}}, - {"Tracks/RejectionReasons", "Track rejection reasons;Reason;Counts", {HistType::kTH1F, {{12, 0, 12}}}}, - {"Tracks/DCASpectrum", "Track DCA spectrum;DCA (cm);Counts", {HistType::kTH1F, {{100, 0, 5}}}}, - {"Tracks/ChargeDistribution", "Track charge distribution;Charge;Counts", {HistType::kTH1F, {{3, -1.5, 1.5}}}}, - {"Tracks/TPCClusters", "TPC clusters findable;N_{clusters};Counts", {HistType::kTH1F, {{100, 0, 200}}}}, - - // System kinematics histograms - {"System/hM", ";m (GeV/#it{c}^{2});counts", {HistType::kTH1F, {{1000, 0.0, 10.0}}}}, - {"System/hPt", ";p_{T} (GeV/#it{c});counts", {HistType::kTH1F, {{1000, 0.0, 10.0}}}}, - {"System/hEta", ";#eta;counts", {HistType::kTH1F, {{180, -0.9, 0.9}}}}, - {"System/hPhi", ";#phi;counts", {HistType::kTH1F, {{180, 0.0, 6.28}}}}, - {"System/hY", ";y;counts", {HistType::kTH1F, {{180, -0.9, 0.9}}}}, - - // Comparison histograms - {"Cuts/MBefore", "Mass before cuts;m (GeV/c^{2});Counts", {HistType::kTH1F, {{1000, 0, 10}}}}, - {"Cuts/MAfter", "Mass after cuts;m (GeV/c^{2});Counts", {HistType::kTH1F, {{1000, 0, 10}}}}, - {"Cuts/PtBefore", "p_{T} before cuts;p_{T} (GeV/c);Counts", {HistType::kTH1F, {{1000, 0, 1}}}}, - {"Cuts/PtAfter", "p_{T} after cuts;p_{T} (GeV/c);Counts", {HistType::kTH1F, {{1000, 0, 10}}}} - } - }; - - void init(InitContext&) - { - // Configure event flow histogram labels - auto hFlow = registry.get(HIST("Events/Flow")); - hFlow->GetXaxis()->SetBinLabel(1, "All events"); - hFlow->GetXaxis()->SetBinLabel(2, "ITS-TPC cut"); - hFlow->GetXaxis()->SetBinLabel(3, "SBP cut"); - hFlow->GetXaxis()->SetBinLabel(4, "ITS ROFb cut"); - hFlow->GetXaxis()->SetBinLabel(5, "TFB cut"); - hFlow->GetXaxis()->SetBinLabel(6, "Gap Side cut"); - hFlow->GetXaxis()->SetBinLabel(7, "PV contrib cut"); - hFlow->GetXaxis()->SetBinLabel(8, "Z vtx cut"); - hFlow->GetXaxis()->SetBinLabel(9, "4 tracks cut"); - - // Configure track rejection reasons histogram labels - auto hReject = registry.get(HIST("Tracks/RejectionReasons")); - hReject->GetXaxis()->SetBinLabel(1, "All Tracks"); - hReject->GetXaxis()->SetBinLabel(2, "PV Contributor"); - hReject->GetXaxis()->SetBinLabel(3, "Has ITS+TPC"); - hReject->GetXaxis()->SetBinLabel(4, "pT > 0.1 GeV/c"); - hReject->GetXaxis()->SetBinLabel(5, "TPC chi2/cluster"); - hReject->GetXaxis()->SetBinLabel(6, "ITS chi2/cluster"); - hReject->GetXaxis()->SetBinLabel(7, "TPC clusters findable"); - hReject->GetXaxis()->SetBinLabel(8, "TPC nSigmaPi"); - hReject->GetXaxis()->SetBinLabel(9, "Eta acceptance"); - hReject->GetXaxis()->SetBinLabel(10, "DCAz cut"); - hReject->GetXaxis()->SetBinLabel(11, "DCAxy cut"); - hReject->GetXaxis()->SetBinLabel(12, "Accepted Tracks"); + Produces systemTree; + + // System selection configuration + Configurable systemYCut{"systemYCut", 0.5, "Max Rapidity of rho prime"}; + Configurable systemPtCut{"systemPtCut", 0.1, "Min Pt of rho prime"}; + Configurable systemMassMinCut{"systemMassMinCut", 0.8, "Min Mass of rho prime"}; + Configurable systemMassMaxCut{"systemMassMaxCut", 2.2, "Max Mass of rho prime"}; + Configurable etaCut{"etaCut", 0.9, "Track Pseudorapidity"}; + + // Event selection configuration + Configurable vZCut{"vZCut", 10.0, "Cut on vertex Z position"}; + Configurable numPVContrib{"numPVContrib", 4, "Number of PV contributors"}; + Configurable fv0Cut{"fv0Cut", 50.0, "FV0 amplitude cut"}; + Configurable ft0aCut{"ft0aCut", 50.0, "FT0A amplitude cut"}; + Configurable ft0cCut{"ft0cCut", 50.0, "FT0C amplitude cut"}; + Configurable zdcCut{"zdcCut", 0.0, "ZDC energy cut"}; + Configurable sbpCut{"sbpCut", true, "SBP cut"}; + Configurable itsROFbCut{"itsROFbCut", true, "ITS ROFb cut"}; + Configurable vtxITSTPCcut{"vtxITSTPCcut", true, "Vertex ITS-TPC cut"}; + Configurable tfbCut{"tfbCut", true, "TFB cut"}; + Configurable specifyGapSide{"specifyGapSide", true, "specify gap side for SG/DG produced data"}; + Configurable gapSide{"gapSide", 2, "gap side for SG produced data"}; + + // Track selection configuration + Configurable useOnlyPVtracks{"useOnlyPVtracks", true, "Use only PV tracks"}; + Configurable tpcChi2NClsCut{"tpcChi2NClsCut", 5.0, "TPC chi2/N clusters cut"}; + Configurable itsChi2NClsCut{"itsChi2NClsCut", 36.0, "ITS chi2/N clusters cut"}; + Configurable nSigmaTPCcut{"nSigmaTPCcut", 5.0, "TPC nSigma cut"}; + Configurable dcaXYcut{"dcaXYcut", 0, "dcaXY cut"}; + Configurable dcaZcut{"dcaZcut", 2, "dcaZ cut"}; + Configurable minTPCFindableClusters{"minTPCFindableClusters", 70, "Minimum number of findable TPC clusters"}; + + // Define histogram registry + HistogramRegistry registry{ + "registry", + {// Event flow histograms + {"Events/Flow", "Event flow;Cut;Counts", {HistType::kTH1F, {{9, 0, 9}}}}, + {"Events/VertexZ", "Vertex Z;z (cm);Counts", {HistType::kTH1F, {{200, -20, 20}}}}, + {"Events/NumContrib", "Number of contributors;N_{contrib};Counts", {HistType::kTH1F, {{100, 0, 100}}}}, + {"Events/FV0Amplitude", "FV0 amplitude;Amplitude;Counts", {HistType::kTH1F, {{200, 0, 200}}}}, + {"Events/FT0AmplitudeA", "FT0A amplitude;Amplitude;Counts", {HistType::kTH1F, {{200, 0, 200}}}}, + {"Events/FT0AmplitudeC", "FT0C amplitude;Amplitude;Counts", {HistType::kTH1F, {{200, 0, 200}}}}, + {"Events/ZDCEnergy", "ZDC energy;Energy (TeV);Counts", {HistType::kTH1F, {{200, 0, 2}}}}, + + // Track quality histograms + {"Tracks/Pt", "Track p_{T};p_{T} (GeV/c);Counts", {HistType::kTH1F, {{200, 0, 2}}}}, + {"Tracks/Eta", "Track #eta;#eta;Counts", {HistType::kTH1F, {{200, -2, 2}}}}, + {"Tracks/TPCNSigmaPi", "TPC n#sigma for #pi;n#sigma;Counts", {HistType::kTH1F, {{200, -10, 10}}}}, + {"Tracks/TPCChi2NCl", "TPC #chi^{2}/N_{cls};#chi^{2}/N_{cls};Counts", {HistType::kTH1F, {{200, 0, 20}}}}, + {"Tracks/ITSChi2NCl", "ITS #chi^{2}/N_{cls};#chi^{2}/N_{cls};Counts", {HistType::kTH1F, {{200, 0, 50}}}}, + {"Tracks/RejectionReasons", "Track rejection reasons;Reason;Counts", {HistType::kTH1F, {{12, 0, 12}}}}, + {"Tracks/DCASpectrum", "Track DCA spectrum;DCA (cm);Counts", {HistType::kTH1F, {{100, 0, 5}}}}, + {"Tracks/ChargeDistribution", "Track charge distribution;Charge;Counts", {HistType::kTH1F, {{3, -1.5, 1.5}}}}, + {"Tracks/TPCClusters", "TPC clusters findable;N_{clusters};Counts", {HistType::kTH1F, {{100, 0, 200}}}}, + + // System kinematics histograms + {"System/hM", ";m (GeV/#it{c}^{2});counts", {HistType::kTH1F, {{1000, 0.0, 10.0}}}}, + {"System/hPt", ";p_{T} (GeV/#it{c});counts", {HistType::kTH1F, {{1000, 0.0, 10.0}}}}, + {"System/hEta", ";#eta;counts", {HistType::kTH1F, {{180, -0.9, 0.9}}}}, + {"System/hPhi", ";#phi;counts", {HistType::kTH1F, {{180, 0.0, 6.28}}}}, + {"System/hY", ";y;counts", {HistType::kTH1F, {{180, -0.9, 0.9}}}}, + + // Comparison histograms + {"Cuts/MBefore", "Mass before cuts;m (GeV/c^{2});Counts", {HistType::kTH1F, {{1000, 0, 10}}}}, + {"Cuts/MAfter", "Mass after cuts;m (GeV/c^{2});Counts", {HistType::kTH1F, {{1000, 0, 10}}}}, + {"Cuts/PtBefore", "p_{T} before cuts;p_{T} (GeV/c);Counts", {HistType::kTH1F, {{1000, 0, 1}}}}, + {"Cuts/PtAfter", "p_{T} after cuts;p_{T} (GeV/c);Counts", {HistType::kTH1F, {{1000, 0, 10}}}}}}; + + void init(InitContext&) + { + // Configure event flow histogram labels + auto hFlow = registry.get(HIST("Events/Flow")); + hFlow->GetXaxis()->SetBinLabel(1, "All events"); + hFlow->GetXaxis()->SetBinLabel(2, "ITS-TPC cut"); + hFlow->GetXaxis()->SetBinLabel(3, "SBP cut"); + hFlow->GetXaxis()->SetBinLabel(4, "ITS ROFb cut"); + hFlow->GetXaxis()->SetBinLabel(5, "TFB cut"); + hFlow->GetXaxis()->SetBinLabel(6, "Gap Side cut"); + hFlow->GetXaxis()->SetBinLabel(7, "PV contrib cut"); + hFlow->GetXaxis()->SetBinLabel(8, "Z vtx cut"); + hFlow->GetXaxis()->SetBinLabel(9, "4 tracks cut"); + + // Configure track rejection reasons histogram labels + auto hReject = registry.get(HIST("Tracks/RejectionReasons")); + hReject->GetXaxis()->SetBinLabel(1, "All Tracks"); + hReject->GetXaxis()->SetBinLabel(2, "PV Contributor"); + hReject->GetXaxis()->SetBinLabel(3, "Has ITS+TPC"); + hReject->GetXaxis()->SetBinLabel(4, "pT > 0.1 GeV/c"); + hReject->GetXaxis()->SetBinLabel(5, "TPC chi2/cluster"); + hReject->GetXaxis()->SetBinLabel(6, "ITS chi2/cluster"); + hReject->GetXaxis()->SetBinLabel(7, "TPC clusters findable"); + hReject->GetXaxis()->SetBinLabel(8, "TPC nSigmaPi"); + hReject->GetXaxis()->SetBinLabel(9, "Eta acceptance"); + hReject->GetXaxis()->SetBinLabel(10, "DCAz cut"); + hReject->GetXaxis()->SetBinLabel(11, "DCAxy cut"); + hReject->GetXaxis()->SetBinLabel(12, "Accepted Tracks"); + } + + void process(UDCollisions::iterator const& collision, UDtracks const& tracks) + { + // Count all processed events + registry.fill(HIST("Events/Flow"), 0); + + // Fill basic event diagnostics + registry.fill(HIST("Events/VertexZ"), collision.posZ()); + registry.fill(HIST("Events/NumContrib"), collision.numContrib()); + registry.fill(HIST("Events/FV0Amplitude"), collision.totalFV0AmplitudeA()); + registry.fill(HIST("Events/FT0AmplitudeA"), collision.totalFT0AmplitudeA()); + registry.fill(HIST("Events/FT0AmplitudeC"), collision.totalFT0AmplitudeC()); + registry.fill(HIST("Events/ZDCEnergy"), collision.energyCommonZNA()); + registry.fill(HIST("Events/ZDCEnergy"), collision.energyCommonZNC()); + + // Apply event selection cuts in sequence + if (collision.vtxITSTPC() != vtxITSTPCcut) + return; + registry.fill(HIST("Events/Flow"), 1); + + if (collision.sbp() != sbpCut) + return; + registry.fill(HIST("Events/Flow"), 2); + + if (collision.itsROFb() != itsROFbCut) + return; + registry.fill(HIST("Events/Flow"), 3); + + if (collision.tfb() != tfbCut) + return; + registry.fill(HIST("Events/Flow"), 4); + + if (specifyGapSide && collision.gapSide() != gapSide) + return; + if (collision.totalFV0AmplitudeA() > fv0Cut) + return; + if (collision.totalFT0AmplitudeA() > ft0aCut) + return; + if (collision.totalFT0AmplitudeC() > ft0cCut) + return; + if (collision.energyCommonZNA() > zdcCut || collision.energyCommonZNC() > zdcCut) + return; + registry.fill(HIST("Events/Flow"), 5); + + if (collision.numContrib() != numPVContrib) + return; + registry.fill(HIST("Events/Flow"), 6); + + if (std::abs(collision.posZ()) > vZCut) + return; + registry.fill(HIST("Events/Flow"), 7); + + std::vector posPions; + std::vector negPions; + posPions.reserve(2); + negPions.reserve(2); + + int nTotalTracks = 0; + int nGoodTracks = 0; + + // Loop over all tracks in the event + for (const auto& track : tracks) { + registry.fill(HIST("Tracks/RejectionReasons"), 0); // Count all tracks + nTotalTracks++; + + // Track selection criteria applied in sequence: + if (useOnlyPVtracks && !track.isPVContributor()) { + registry.fill(HIST("Tracks/RejectionReasons"), 1); + continue; + } + + if (!track.hasITS() || !track.hasTPC()) { + registry.fill(HIST("Tracks/RejectionReasons"), 2); + continue; + } + + // Fill track spectra + registry.fill(HIST("Tracks/Pt"), track.pt()); + registry.fill(HIST("Tracks/Eta"), eta(track.px(), track.py(), track.pz())); + registry.fill(HIST("Tracks/TPCNSigmaPi"), track.tpcNSigmaPi()); + registry.fill(HIST("Tracks/TPCChi2NCl"), track.tpcChi2NCl()); + registry.fill(HIST("Tracks/ITSChi2NCl"), track.itsChi2NCl()); + registry.fill(HIST("Tracks/DCASpectrum"), std::hypot(track.dcaXY(), track.dcaZ())); + registry.fill(HIST("Tracks/ChargeDistribution"), track.sign()); + registry.fill(HIST("Tracks/TPCClusters"), track.tpcNClsFindable()); + + if (track.pt() <= 0.1f) { + registry.fill(HIST("Tracks/RejectionReasons"), 3); + continue; + } + + if (track.tpcChi2NCl() > tpcChi2NClsCut) { + registry.fill(HIST("Tracks/RejectionReasons"), 4); + continue; + } + if (track.itsChi2NCl() > itsChi2NClsCut) { + registry.fill(HIST("Tracks/RejectionReasons"), 5); + continue; + } + + if (track.tpcNClsFindable() < minTPCFindableClusters) { + registry.fill(HIST("Tracks/RejectionReasons"), 6); + continue; + } + + if (std::abs(track.tpcNSigmaPi()) > nSigmaTPCcut) { + registry.fill(HIST("Tracks/RejectionReasons"), 7); + continue; + } + + float trackEta = eta(track.px(), track.py(), track.pz()); + if (std::abs(trackEta) > etaCut) { + registry.fill(HIST("Tracks/RejectionReasons"), 8); + continue; + } + + if (std::abs(track.dcaZ()) > dcaZcut) { + registry.fill(HIST("Tracks/RejectionReasons"), 9); + continue; + } + + float maxDCAxy = 0.0105 + 0.035 / std::pow(track.pt(), 1.1); + if (dcaXYcut == 0 && (std::fabs(track.dcaXY()) > maxDCAxy)) { + registry.fill(HIST("Tracks/RejectionReasons"), 10); + continue; + } else if (dcaXYcut != 0 && (std::fabs(track.dcaXY()) > dcaXYcut)) { + registry.fill(HIST("Tracks/RejectionReasons"), 10); + continue; + } + + // Track passed all selection criteria + registry.fill(HIST("Tracks/RejectionReasons"), 11); + nGoodTracks++; + + if (track.sign() > 0 && posPions.size() < 2) { + posPions.push_back(track); + } else if (track.sign() < 0 && negPions.size() < 2) { + negPions.push_back(track); + } + + if (posPions.size() == 2 && negPions.size() == 2) + break; + } + + if (posPions.size() != 2 || negPions.size() != 2) { + return; + } + registry.fill(HIST("Events/Flow"), 8); + + std::vector selectedTracks; + selectedTracks.insert(selectedTracks.end(), posPions.begin(), posPions.end()); + selectedTracks.insert(selectedTracks.end(), negPions.begin(), negPions.end()); + + // Reconstruct the 4-pion system + ROOT::Math::PxPyPzMVector fourPionSystem; + std::vector pionFourVectors; + + for (const auto& track : selectedTracks) { + ROOT::Math::PxPyPzMVector pionVec( + track.px(), track.py(), track.pz(), + o2::constants::physics::MassPionCharged); + fourPionSystem += pionVec; + pionFourVectors.push_back(pionVec); } - void process(UDCollisions::iterator const& collision, UDtracks const& tracks) - { - // Count all processed events - registry.fill(HIST("Events/Flow"), 0); - - // Fill basic event diagnostics - registry.fill(HIST("Events/VertexZ"), collision.posZ()); - registry.fill(HIST("Events/NumContrib"), collision.numContrib()); - registry.fill(HIST("Events/FV0Amplitude"), collision.totalFV0AmplitudeA()); - registry.fill(HIST("Events/FT0AmplitudeA"), collision.totalFT0AmplitudeA()); - registry.fill(HIST("Events/FT0AmplitudeC"), collision.totalFT0AmplitudeC()); - registry.fill(HIST("Events/ZDCEnergy"), collision.energyCommonZNA()); - registry.fill(HIST("Events/ZDCEnergy"), collision.energyCommonZNC()); - - // Apply event selection cuts in sequence - if (collision.vtxITSTPC() != vtxITSTPCcut) return; - registry.fill(HIST("Events/Flow"), 1); - - if (collision.sbp() != sbpCut) return; - registry.fill(HIST("Events/Flow"), 2); - - if (collision.itsROFb() != itsROFbCut) return; - registry.fill(HIST("Events/Flow"), 3); - - if (collision.tfb() != tfbCut) return; - registry.fill(HIST("Events/Flow"), 4); - - if (specifyGapSide && collision.gapSide() != gapSide) return; - if (collision.totalFV0AmplitudeA() > fv0Cut) return; - if (collision.totalFT0AmplitudeA() > ft0aCut) return; - if (collision.totalFT0AmplitudeC() > ft0cCut) return; - if (collision.energyCommonZNA() > zdcCut || collision.energyCommonZNC() > zdcCut) return; - registry.fill(HIST("Events/Flow"), 5); - - if (collision.numContrib() != numPVContrib) return; - registry.fill(HIST("Events/Flow"), 6); - - if (std::abs(collision.posZ()) > vZCut) return; - registry.fill(HIST("Events/Flow"), 7); - - std::vector posPions; - std::vector negPions; - posPions.reserve(2); - negPions.reserve(2); - - int nTotalTracks = 0; - int nGoodTracks = 0; - - // Loop over all tracks in the event - for (const auto& track : tracks) { - registry.fill(HIST("Tracks/RejectionReasons"), 0); // Count all tracks - nTotalTracks++; - - // Track selection criteria applied in sequence: - if (useOnlyPVtracks && !track.isPVContributor()) { - registry.fill(HIST("Tracks/RejectionReasons"), 1); - continue; - } - - if (!track.hasITS() || !track.hasTPC()) { - registry.fill(HIST("Tracks/RejectionReasons"), 2); - continue; - } - - // Fill track spectra - registry.fill(HIST("Tracks/Pt"), track.pt()); - registry.fill(HIST("Tracks/Eta"), eta(track.px(), track.py(), track.pz())); - registry.fill(HIST("Tracks/TPCNSigmaPi"), track.tpcNSigmaPi()); - registry.fill(HIST("Tracks/TPCChi2NCl"), track.tpcChi2NCl()); - registry.fill(HIST("Tracks/ITSChi2NCl"), track.itsChi2NCl()); - registry.fill(HIST("Tracks/DCASpectrum"), std::hypot(track.dcaXY(), track.dcaZ())); - registry.fill(HIST("Tracks/ChargeDistribution"), track.sign()); - registry.fill(HIST("Tracks/TPCClusters"), track.tpcNClsFindable()); - - if (track.pt() <= 0.1f) { - registry.fill(HIST("Tracks/RejectionReasons"), 3); - continue; - } - - if (track.tpcChi2NCl() > tpcChi2NClsCut) { - registry.fill(HIST("Tracks/RejectionReasons"), 4); - continue; - } - if (track.itsChi2NCl() > itsChi2NClsCut) { - registry.fill(HIST("Tracks/RejectionReasons"), 5); - continue; - } - - if (track.tpcNClsFindable() < minTPCFindableClusters) { - registry.fill(HIST("Tracks/RejectionReasons"), 6); - continue; - } - - if (std::abs(track.tpcNSigmaPi()) > nSigmaTPCcut) { - registry.fill(HIST("Tracks/RejectionReasons"), 7); - continue; - } - - float trackEta = eta(track.px(), track.py(), track.pz()); - if (std::abs(trackEta) > etaCut) { - registry.fill(HIST("Tracks/RejectionReasons"), 8); - continue; - } - - if (std::abs(track.dcaZ()) > dcaZcut) { - registry.fill(HIST("Tracks/RejectionReasons"), 9); - continue; - } - - float maxDCAxy = 0.0105 + 0.035 / std::pow(track.pt(), 1.1); - if (dcaXYcut == 0 && (std::fabs(track.dcaXY()) > maxDCAxy)) { - registry.fill(HIST("Tracks/RejectionReasons"), 10); - continue; - } else if (dcaXYcut != 0 && (std::fabs(track.dcaXY()) > dcaXYcut)) { - registry.fill(HIST("Tracks/RejectionReasons"), 10); - continue; - } - - // Track passed all selection criteria - registry.fill(HIST("Tracks/RejectionReasons"), 11); - nGoodTracks++; - - if (track.sign() > 0 && posPions.size() < 2) { - posPions.push_back(track); - } - else if (track.sign() < 0 && negPions.size() < 2) { - negPions.push_back(track); - } - - if (posPions.size() == 2 && negPions.size() == 2) break; - } - - if (posPions.size() != 2 || negPions.size() != 2) { - return; - } - registry.fill(HIST("Events/Flow"), 8); - - std::vector selectedTracks; - selectedTracks.insert(selectedTracks.end(), posPions.begin(), posPions.end()); - selectedTracks.insert(selectedTracks.end(), negPions.begin(), negPions.end()); - - // Reconstruct the 4-pion system - ROOT::Math::PxPyPzMVector fourPionSystem; - std::vector pionFourVectors; - - for (const auto& track : selectedTracks) { - ROOT::Math::PxPyPzMVector pionVec( - track.px(), track.py(), track.pz(), - o2::constants::physics::MassPionCharged); - fourPionSystem += pionVec; - pionFourVectors.push_back(pionVec); - } - - // Fill pre-cut system histograms - registry.fill(HIST("Cuts/MBefore"), fourPionSystem.M()); - registry.fill(HIST("Cuts/PtBefore"), fourPionSystem.Pt()); - - // Apply system-level kinematic cuts - if (fourPionSystem.M() < systemMassMinCut || fourPionSystem.M() > systemMassMaxCut) return; - if (fourPionSystem.Pt() > systemPtCut) return; - if (std::abs(fourPionSystem.Rapidity()) > systemYCut) return; - - // Fill post-cut system histograms - registry.fill(HIST("Cuts/MAfter"), fourPionSystem.M()); - registry.fill(HIST("Cuts/PtAfter"), fourPionSystem.Pt()); - registry.fill(HIST("System/hM"), fourPionSystem.M()); - registry.fill(HIST("System/hPt"), fourPionSystem.Pt()); - registry.fill(HIST("System/hEta"), fourPionSystem.Eta()); - registry.fill(HIST("System/hPhi"), fourPionSystem.Phi()+ o2::constants::math::PI); - registry.fill(HIST("System/hY"), fourPionSystem.Rapidity()); - - std::vector trackPts, trackEtas, trackPhis; - std::vector trackSigns, trackIDs; - std::vector tpcNSigmasEl, tpcNSigmasPi, tpcNSigmasKa, tpcNSigmasPr; - - for (size_t i = 0; i < selectedTracks.size(); i++) { - const auto& track = selectedTracks[i]; - trackPts.push_back(track.pt()); - trackEtas.push_back(eta(track.px(), track.py(), track.pz())); - trackPhis.push_back(phi(track.px(), track.py())); - trackSigns.push_back(track.sign()); - tpcNSigmasEl.push_back(track.tpcNSigmaEl()); - tpcNSigmasPi.push_back(track.tpcNSigmaPi()); - tpcNSigmasKa.push_back(track.tpcNSigmaKa()); - tpcNSigmasPr.push_back(track.tpcNSigmaPr()); - trackIDs.push_back(i); - } - - bool isReconstructedWithUPC = (collision.flags() == 1); - - // 13. Fill the output - systemTree( - collision.runNumber(), - fourPionSystem.M(), - fourPionSystem.Pt(), - fourPionSystem.Rapidity(), - fourPionSystem.Phi(), - collision.posX(), - collision.posY(), - collision.posZ(), - 0, // Total charge = 0 - collision.totalFT0AmplitudeA(), - collision.totalFT0AmplitudeC(), - collision.totalFV0AmplitudeA(), - collision.numContrib(), - trackSigns, - trackPts, - trackEtas, - trackPhis, - tpcNSigmasEl, - tpcNSigmasPi, - tpcNSigmasKa, - tpcNSigmasPr, - trackIDs, - isReconstructedWithUPC, - collision.timeZNA(), - collision.timeZNC(), - collision.energyCommonZNA(), - collision.energyCommonZNC(), - true, // Always charge zero for our selection - collision.occupancyInTime(), - collision.hadronicRate() - ); + // Fill pre-cut system histograms + registry.fill(HIST("Cuts/MBefore"), fourPionSystem.M()); + registry.fill(HIST("Cuts/PtBefore"), fourPionSystem.Pt()); + + // Apply system-level kinematic cuts + if (fourPionSystem.M() < systemMassMinCut || fourPionSystem.M() > systemMassMaxCut) + return; + if (fourPionSystem.Pt() > systemPtCut) + return; + if (std::abs(fourPionSystem.Rapidity()) > systemYCut) + return; + + // Fill post-cut system histograms + registry.fill(HIST("Cuts/MAfter"), fourPionSystem.M()); + registry.fill(HIST("Cuts/PtAfter"), fourPionSystem.Pt()); + registry.fill(HIST("System/hM"), fourPionSystem.M()); + registry.fill(HIST("System/hPt"), fourPionSystem.Pt()); + registry.fill(HIST("System/hEta"), fourPionSystem.Eta()); + registry.fill(HIST("System/hPhi"), fourPionSystem.Phi() + o2::constants::math::PI); + registry.fill(HIST("System/hY"), fourPionSystem.Rapidity()); + + std::vector trackPts, trackEtas, trackPhis; + std::vector trackSigns, trackIDs; + std::vector tpcNSigmasEl, tpcNSigmasPi, tpcNSigmasKa, tpcNSigmasPr; + + for (size_t i = 0; i < selectedTracks.size(); i++) { + const auto& track = selectedTracks[i]; + trackPts.push_back(track.pt()); + trackEtas.push_back(eta(track.px(), track.py(), track.pz())); + trackPhis.push_back(phi(track.px(), track.py())); + trackSigns.push_back(track.sign()); + tpcNSigmasEl.push_back(track.tpcNSigmaEl()); + tpcNSigmasPi.push_back(track.tpcNSigmaPi()); + tpcNSigmasKa.push_back(track.tpcNSigmaKa()); + tpcNSigmasPr.push_back(track.tpcNSigmaPr()); + trackIDs.push_back(i); } + + bool isReconstructedWithUPC = (collision.flags() == 1); + + // Fill the output + systemTree( + collision.runNumber(), + fourPionSystem.M(), + fourPionSystem.Pt(), + fourPionSystem.Rapidity(), + fourPionSystem.Phi(), + collision.posX(), + collision.posY(), + collision.posZ(), + 0, // Total charge = 0 + collision.totalFT0AmplitudeA(), + collision.totalFT0AmplitudeC(), + collision.totalFV0AmplitudeA(), + collision.numContrib(), + trackSigns, + trackPts, + trackEtas, + trackPhis, + tpcNSigmasEl, + tpcNSigmasPi, + tpcNSigmasKa, + tpcNSigmasPr, + trackIDs, + isReconstructedWithUPC, + collision.timeZNA(), + collision.timeZNC(), + collision.energyCommonZNA(), + collision.energyCommonZNC(), + true, // Always charge zero for our selection + collision.occupancyInTime(), + collision.hadronicRate()); + } }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{ - adaptAnalysisTask(cfgc)}; -} \ No newline at end of file + return WorkflowSpec{ + adaptAnalysisTask(cfgc)}; +} From ca80a0bdcc9b0ba8d24154ce8c048e480832cf1d Mon Sep 17 00:00:00 2001 From: CesarOmarRA Date: Mon, 11 Aug 2025 11:34:59 +0200 Subject: [PATCH 1648/1650] Apply new cuts --- PWGUD/Tasks/upcRhoPrimeAnalysis.cxx | 3 --- 1 file changed, 3 deletions(-) diff --git a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx index 69ee19764d5..db0ee7d2670 100644 --- a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx @@ -242,9 +242,6 @@ struct upcRhoPrimeAnalysis { posPions.reserve(2); negPions.reserve(2); - int nTotalTracks = 0; - int nGoodTracks = 0; - // Loop over all tracks in the event for (const auto& track : tracks) { registry.fill(HIST("Tracks/RejectionReasons"), 0); // Count all tracks From 93f6ee47a34ba141a88addebc8a39a2a151f4455 Mon Sep 17 00:00:00 2001 From: CesarOmarRA <35703156+CesarOmarRA@users.noreply.github.com> Date: Mon, 11 Aug 2025 12:41:20 +0200 Subject: [PATCH 1649/1650] Update Task Rho prime to 4pi Apply new cuts From 484fbff62100e49caa653118828f0f8222c752e4 Mon Sep 17 00:00:00 2001 From: CesarOmarRA <35703156+CesarOmarRA@users.noreply.github.com> Date: Mon, 11 Aug 2025 12:52:11 +0200 Subject: [PATCH 1650/1650] Update Task rho prime to 4pi Delete variables --- PWGUD/Tasks/upcRhoPrimeAnalysis.cxx | 2 -- 1 file changed, 2 deletions(-) diff --git a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx index db0ee7d2670..c1ebc114efa 100644 --- a/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx +++ b/PWGUD/Tasks/upcRhoPrimeAnalysis.cxx @@ -245,7 +245,6 @@ struct upcRhoPrimeAnalysis { // Loop over all tracks in the event for (const auto& track : tracks) { registry.fill(HIST("Tracks/RejectionReasons"), 0); // Count all tracks - nTotalTracks++; // Track selection criteria applied in sequence: if (useOnlyPVtracks && !track.isPVContributor()) { @@ -314,7 +313,6 @@ struct upcRhoPrimeAnalysis { // Track passed all selection criteria registry.fill(HIST("Tracks/RejectionReasons"), 11); - nGoodTracks++; if (track.sign() > 0 && posPions.size() < 2) { posPions.push_back(track);